diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..63eef4d68ff2e0e1b002d8415c21316d7698c67d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,24 @@ +# Default behavior. Converts all text files to use LF in repository. +* text=auto + +# List all known generic text files +*.c text +*.csv text +*.h text +*.json text +*.m text +*.md text +*.prm text +*.py text +*.txt text + +# Set Windows specific text files to always use CRLF in working tree. +*.bat text eol=crlf +*.cmd text eol=crlf +*.sln text eol=crlf +*.vcxproj text eol=crlf +*.vcxproj.filters text eol=crlf + +# Set Unix specific text files to always use LF (also covers Windows subsystem for Linux) in working tree +*.sh text eol=lf + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..9dcfcdcf874e3ed54257c36bb797b214413a90da --- /dev/null +++ b/.gitignore @@ -0,0 +1,86 @@ +# .gitignore for IVAS public collaboration Git repository + +# Compiler output Unix +IVAS_cod +IVAS_dec +IVAS_rend +ISAR_post_rend +ambi_converter +obj/ +*.a +*.o +*.P + +# default CMake +build*/**/* + +# Compiler output VS2017 +IVAS_cod.exe +IVAS_dec.exe +IVAS_rend.exe +ISAR_post_rend.exe +ambi_converter.exe +*.user +.vs/ +Debug_*/ +Release_*/ +*.obj +*.pdb + +# Standalone TD object renderer +scripts/td_object_renderer/object_renderer_standalone/renderer_standalone +scripts/td_object_renderer/object_renderer_standalone/renderer_standalone.exe + +# General/scripts +.DS_Store +.vscode +.cache +.idea +*.log +*.bak +.\#* +scripts/c-code_instrument/ +scripts/ifdef_instrument.list +scripts/ref/ +scripts/test/ +scripts/out/ +scripts/self_test_summary.txt +scripts/cppp/ +binary/ +tests/**/[c|d]ut +tests/**/ref +tests/*/testv +tests/hrtf_binary_loading/bitstream/* +tests/hrtf_binary_loading/dec_out_*/* +scripts/testv/*_cut*.pcm +scripts/testv/*_cut*.wav +scripts/testv/stvOMASA_*.met +scripts/testv/stvOMASA_*.csv +scripts/testv/stvOMASA_2ISM_1MASA1TC48c.wav +scripts/testv/stvOMASA_3ISM_1MASA1TC48c.wav +scripts/testv/stvO* +# default reference binary name +IVAS_cod_ref* +IVAS_dec_ref* +IVAS_rend_ref* +ISAR_post_rend_ref* + +# Python files that pop up when running scripts +__pycache__/ +*.py[cod] +*$py.class + +# history +.history/ + +#externals +Externals/ + +# coan output files that are created when cleaning out switches +coan_out_* + +# Additional ignored locations for the BASOP repo +/ci +/scripts +/tests +/pytest.ini diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 91fbd05697e59afe64db1135eeb65faf5881996c..3f84bc99fb90bf5910a3e37bd0986770bbac48c3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,2103 +1,17 @@ variables: - TESTV_DIR: "/usr/local/testv" - LTV_DIR: "/usr/local/ltv" - EVS_BE_TEST_DIR_BASOP: "/usr/local/be_2_evs_basop" - FLOAT_REF_BRANCH: "ivas-float-update" - BUILD_OUTPUT: "build_output.txt" - SCRIPTS_DIR: "/usr/local/scripts" - EXIT_CODE_NON_BE: 123 - EXIT_CODE_FAIL: 1 - LONG_TEST_SUITE: "tests/codec_be_on_mr_nonselection tests/renderer --param_file scripts/config/self_test_ltv.prm --use_ltv" - LONG_TEST_SUITE_NO_RENDERER: "tests/codec_be_on_mr_nonselection --param_file scripts/config/self_test_ltv.prm --use_ltv" - SHORT_TEST_SUITE: "tests/codec_be_on_mr_nonselection" - SHORT_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_basop_encoder.prm" - LONG_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_ltv_basop_encoder.prm" - TEST_SUITE: "" - # These path variables are used by the pytest calls. - # They can be overwritten in the job templates to e.g. only test encoder or decoder in the chain - DUT_ENCODER_PATH: "./IVAS_cod" - DUT_DECODER_PATH: "./IVAS_dec" - REF_ENCODER_PATH: "./IVAS_cod_ref" - REF_DECODER_PATH: "./IVAS_dec_ref" - MERGE_TARGET_ENCODER_PATH: "./IVAS_cod_merge_target" - MERGE_TARGET_DECODER_PATH: "./IVAS_dec_merge_target" - # These path variables are used for building the binaries - # They should never be overwritten! - REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_ref" - REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_ref" - MERGE_TARGET_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_merge_target" - MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" - LEVEL_SCALING: "1.0" - IVAS_PIPELINE_NAME: '' - BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" - PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" - TESTCASE_TIMEOUT_STV: 900 - TESTCASE_TIMEOUT_LTV: 2400 - TESTCASE_TIMEOUT_LTV_SANITIZERS: 10800 - CI_REGRESSION_THRESH_MLD: "0.1" - CI_REGRESSION_THRESH_MAX_ABS_DIFF: "50" - CI_REGRESSION_THRESH_SSNR: "-1" - CI_REGRESSION_THRESH_ODG: "-0.05" - GIT_CLEAN_FLAGS: -ffdxq - INSTR_DIR: "scripts/c-code_instrument" - BUILD_WITH_DEBUG_MODE_INFO: "" - ENCODER_TEST: "" - DELTA_ODG: "" - COMPARE_DMX: "" - SKIP_REGRESSION_CHECK: "" - FAILED_TESTCASES_LIST: "failed-testcases.txt" - ERRORS_TESTCASES_LIST: "errors-testcases.txt" - PYTEST_CACHE_ARTIFACT: "pytest_cache.zip" - FLOAT_REF_COMMIT_FILE: "float-ref-git-sha" - CUT_COMMIT_FILE: "CuT-git-sha" - MERGE_TARGET_COMMIT_FILE: "merge-target-git-sha" - MANUAL_PIPELINE_TYPE: - description: "Type for the manual pipeline run. Use 'pytest-compare' to run comparison test against reference float codec." - value: 'default' - options: - - 'default' - - 'pytest-compare' - - 'pytest-compare-enc-dmx' - - 'pytest-compare-long' - - 'pytest-compare-to-input' - - 'pytest-saturation-smoke-test' - - 'evs-26444' - - 'sanitizer' - - 'pytest-renderer' - - 'complexity' - - 'coverage' - - 'voip-be-test' - - 'peaq-enc-passthrough' - - -default: - interruptible: true # Make all jobs by default interruptible - -workflow: - name: '$IVAS_PIPELINE_NAME' - rules: - # see https://docs.gitlab.com/ee/ci/yaml/workflow.html#switch-between-branch-pipelines-and-merge-request-pipelines - - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push" - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - variables: - IVAS_PIPELINE_NAME: 'MR pipeline: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME' - ### disabled for now because pipeline cd is redundant with MR pipeline with current workflow - # - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Pushes to main - # variables: - # IVAS_PIPELINE_NAME: 'Push pipeline: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'default' # for testing - variables: - IVAS_PIPELINE_NAME: 'Web run pipeline: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare' - variables: - IVAS_PIPELINE_NAME: 'Run comparison tools against float ref: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-enc-dmx' - variables: - IVAS_PIPELINE_NAME: 'Run encoder dmx comparison against float ref: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-long' - variables: - IVAS_PIPELINE_NAME: 'Run comparison tools against float ref (long test vectors): $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-to-input' - variables: - IVAS_PIPELINE_NAME: 'Run comparison tools against input (pass-through only): $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-saturation-smoke-test' - variables: - IVAS_PIPELINE_NAME: 'Run saturation smoke-test: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'evs-26444' - variables: - IVAS_PIPELINE_NAME: 'EVS 26.444 test: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'sanitizer' - variables: - IVAS_PIPELINE_NAME: 'Short testvectors sanitizers' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-renderer' - variables: - IVAS_PIPELINE_NAME: 'Renderer test: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'complexity' - variables: - IVAS_PIPELINE_NAME: 'Complexity Measurement on $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'voip-be-test' - variables: - IVAS_PIPELINE_NAME: 'Voip BE test on $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'peaq-enc-passthrough' - variables: - IVAS_PIPELINE_NAME: 'PEAQ encoder pass-through test: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'schedule' # Scheduled in any branch - variables: - IVAS_PIPELINE_NAME: 'Scheduled pipeline: $CI_COMMIT_BRANCH' - - -stages: - - .pre - - prevalidate - - build - - check-be - - test - - postvalidate - - deploy - -# --------------------------------------------------------------- -# Generic script anchors -# --------------------------------------------------------------- - -# These can be used later on to do common tasks - -# Prints useful information for every job and should be used at the beginning of each job -.print-common-info: &print-common-info - - | - echo "Printing common information for build job." - echo "Current job is run on commit $CI_COMMIT_SHA" - echo "Commit time was $CI_COMMIT_TIMESTAMP" - date | xargs echo "System time is" - -.print-common-info-windows: &print-common-info-windows - - | - echo "Printing common information for build job." - echo "Current job is run on commit $CI_COMMIT_SHA" - echo "Commit time was $CI_COMMIT_TIMESTAMP" - ("echo 'System time is'", "Get-Date -Format 'dddd dd/MM/yyyy HH:mm K'") | Invoke-Expression - -.activate-debug-mode-info-if-set: &activate-debug-mode-info-if-set - - if [ "$BUILD_WITH_DEBUG_MODE_INFO" = "true" ]; then - - sed -i.bak -e "s/\/\*\ *\(#define\ *DEBUGGING\ *\)\*\//\1/g" lib_com/options.h - - sed -i.bak -e "s/\/\*\ *\(#define\ *DEBUG_MODE_INFO\ *\)\*\//\1/g" lib_com/options.h - - fi - -.build-float-ref-binaries: &build-float-ref-binaries - - git rev-parse HEAD > $CUT_COMMIT_FILE - - current_commit_sha=$(git rev-parse HEAD) - ### build reference binaries - - git checkout $FLOAT_REF_BRANCH - - git pull - - *activate-debug-mode-info-if-set - - make clean - - make -j - - mv ./IVAS_cod ./$REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_dec ./$REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_rend ./IVAS_rend_ref - ### Return to current branch - - git restore . - - git rev-parse HEAD > $FLOAT_REF_COMMIT_FILE - - git checkout $current_commit_sha - -.build-merge-target-binaries: &build-merge-target-binaries - - current_commit_sha=$(git rev-parse HEAD) - ### build merge target binaries - - git checkout $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - git pull - - *activate-debug-mode-info-if-set - - make clean - - make -j - - mv ./IVAS_cod ./$MERGE_TARGET_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_dec ./$MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_rend ./IVAS_rend_merge_target - ### Return to current branch - - git restore . - - git rev-parse HEAD > $MERGE_TARGET_COMMIT_FILE - - git checkout $current_commit_sha - -.build-float-ref-and-dut-binaries: &build-float-ref-and-dut-binaries -### build reference binaries - - *build-float-ref-binaries -### build dut binaries - - *activate-debug-mode-info-if-set - - make clean - - make -j - -.build-and-create-float-ref-outputs: &build-and-create-float-ref-outputs - - *build-float-ref-and-dut-binaries - - ### prepare pytest - # create short test vectors - - python3 tests/create_short_testvectors.py - # create references - - exit_code=0 - - - enc_stats_arg="" - - if [ "$ENCODER_TEST" = "true" ]; then - - enc_stats_arg="--enc_stats" - - fi - - - enc_dmx_arg="" - - if [ "$COMPARE_DMX" = "true" ]; then - - enc_dmx_arg="--compare_enc_dmx" - - fi - - - python3 -m pytest $TEST_SUITE -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? - -.update-scripts-repo: &update-scripts-repo - - cd $SCRIPTS_DIR - - sed -i '/fetch/d' .git/config # Remove all fetch lines to clean out dead links - - git remote set-branches --add origin $BASOP_CI_BRANCH_PC_REPO # Add currently used branch - - git fetch - - git restore . # Just as a precaution - - git checkout $BASOP_CI_BRANCH_PC_REPO - - git pull - - cd - - - cp -r $SCRIPTS_DIR/ci . - - cp -r $SCRIPTS_DIR/scripts . - - cp -r $SCRIPTS_DIR/tests . - - cp $SCRIPTS_DIR/pytest.ini . - -.apply-testv-scaling: &apply-testv-scaling - - echo "Applying level scaling in scripts/testv using scale=$LEVEL_SCALING" - - tests/scale_pcm.py ./scripts/testv/ $LEVEL_SCALING - -.update-ltv-repo: &update-ltv-repo - - cd $LTV_DIR - - git pull - - cd - - -.get-commits-behind-count: &get-commits-behind-count - - echo $CI_COMMIT_SHA - - echo $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - commits_behind_count=$(git rev-list --count $CI_COMMIT_SHA..origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME) - -.copy-ltv-files-to-testv-dir: ©-ltv-files-to-testv-dir - - cp "$LTV_DIR"/*.wav scripts/testv/ - - cp "$LTV_DIR"/*.met scripts/testv/ - - cp "$LTV_DIR"/*.csv scripts/testv/ - -.activate-Werror-linux: &activate-Werror-linux - - sed -i.bak "s/^# \(CFLAGS += -Werror\)/\1/" Makefile - -.activate-WX-windows: &activate-WX-windows - - (Get-Content -Path "CMakeLists.txt") -replace '# \(add_compile_options\("\/WX"\)\)', '$1' | Set-Content -Path "CMakeLists.txt" - - Get-ChildItem -Path "Workspace_msvc" -Filter "*.vcxproj" | ForEach-Object { (Get-Content -Path $_.FullName) -replace 'false', 'true' | Set-Content -Path $_.FullName } - -.rules-merge-request: - rules: - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - when: never - -.rules-pytest-to-ref-short: - rules: - - if: $PYTEST_MLD_SHORT # Set by scheduled pipeline - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare" - - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - -.rules-pytest-to-input-short: - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare-to-input" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'schedule' - when: never - -.rules-pytest-to-ref-enc-sort-dmx: - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare-enc-dmx" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'schedule' - when: never - -.rules-pytest-to-main-short: - rules: - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - -.rules-pytest-long: - rules: - - if: $PYTEST_MLD_LONG # Set by scheduled pipeline - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare-long" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - when: never - -.rules-coverage: - rules: - - if: $COVERAGE_TEST # Set by scheduled pipeline - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "coverage" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - when: never - -.rules-pytest-saturation-smoke-test: - rules: - - if: $PYTEST_SMOKE_TEST # Set by scheduled pipeline - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-saturation-smoke-test" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - when: never - -# --------------------------------------------------------------- -# Job templates -# --------------------------------------------------------------- - -# templates to define stages and platforms -.test-job-linux: - tags: - - ivas-basop-linux - -.build-job-linux: - stage: build - timeout: "2 minutes" - tags: - - ivas-basop-linux - -.build-job-windows: - stage: build - timeout: "4 minutes" - tags: - - ivas-windows - -.print-results-banner: &print-results-banner - - set +x - - echo "" - - echo -e "==================================================================================================================\n================================================== TEST RESULTS ==================================================\n==================================================================================================================\n" - -# template for test jobs on linux that need the TESTV_DIR -.test-job-linux-needs-testv-dir: - extends: .test-job-linux - before_script: - - *update-scripts-repo - - if [ ! -d "$TESTV_DIR" ]; then mkdir -p $TESTV_DIR; fi - - cp -r scripts/testv/* $TESTV_DIR/ - -.ivas-pytest-anchor: &ivas-pytest-anchor - stage: test - needs: ["build-codec-linux-make"] - timeout: "360 minutes" - variables: - # keep "mld" in artifact name for backwards compatibility reasons - CSV_ARTIFACT_NAME: "mld--$CI_JOB_NAME-$CI_JOB_ID--sha-$CI_COMMIT_SHORT_SHA.csv" - MERGED_CSV_ARTIFACT_NAME: "$CI_JOB_NAME--merged_csv--$CI_JOB_ID.csv" - PAGES_HTML_ARTIFACT_NAME: "$CI_JOB_NAME-index.html" - SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" - IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" - script: - - set -euxo pipefail - - *print-common-info - - *update-scripts-repo - - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir - - testcase_timeout=$TESTCASE_TIMEOUT_LTV - - else - - testcase_timeout=$TESTCASE_TIMEOUT_STV - - fi - - - python3 ci/remove_unsupported_testcases.py $PRM_FILES - - if [ $LEVEL_SCALING != "1.0" ]; then - - *apply-testv-scaling - - fi - - - if [ "$COMPARE_DMX" = "true" ] || [ "$ENCODER_TEST" = "true" ]; then - - BUILD_WITH_DEBUG_MODE_INFO="true" - - fi - - *build-and-create-float-ref-outputs - - - comp_args="--mld --ssnr --odg" - - - summary_args="MLD DIFF SSNR ODG" - - REPORT_ARG="" - - if [ "$ENCODER_TEST" = "true" ]; then comp_args="${comp_args} --enc_stats"; fi - - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; summary_args="${summary_args} DELTA_ODG"; REPORT_ARG="--delta_odg"; fi - - # DMX comparison only in manual job with no other metrics - - if [ "$COMPARE_DMX" = "true" ]; then - - comp_args="--compare_enc_dmx" - - fi - - - echo "$comp_args" - - ### run pytest - - exit_code=0 - - python3 -m pytest --tb=no $TEST_SUITE -v --create_cut --html=report.html --self-contained-html --junit-xml=report-junit.xml $comp_args -n auto --testcase_timeout $testcase_timeout --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? - - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - - - python3 scripts/parse_xml_report.py report-junit.xml $CSV_ARTIFACT_NAME $REPORT_ARG - - mkdir $IMAGES_ARTIFACT_NAME - - for MEASURE in $summary_args;do python3 scripts/create_histogram_summary.py $CSV_ARTIFACT_NAME $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".csv $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".png --measure $MEASURE; done - - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME --measures $summary_args - - - if [ $USE_LTV -eq 1 ] && [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then - - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) - - echo "Job ID from variables - $CI_JOB_ID, Job ID from script - $id_previous" - - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - - unzip artifacts.zip -d previous_artifacts - # This wildcard thingy relies on only one csv file being present per job - - file_previous="previous_artifacts/mld--$CI_JOB_NAME-$id_previous--sha-*.csv" - - python3 ci/basop-pages/create_report_pages.py $PAGES_HTML_ARTIFACT_NAME $MERGED_CSV_ARTIFACT_NAME $CSV_ARTIFACT_NAME $file_previous $CI_JOB_ID $id_previous $CI_JOB_NAME - - else - # create empty file for artifacts to avoid errors - - touch $PAGES_HTML_ARTIFACT_NAME - - touch $MERGED_CSV_ARTIFACT_NAME - - fi - - - if [ $zero_errors != 1 ]; then - - echo "Run errors encountered!" - # TODO: temporary only to not fail MR pipelines on crashes - - if [ $CI_PIPELINE_SOURCE == 'merge_request_event' ]; then - - exit $EXIT_CODE_NON_BE - - else - - exit $EXIT_CODE_FAIL - - fi - - fi - - if [ $exit_code -eq 1 ]; then echo "Differences encountered"; exit $EXIT_CODE_NON_BE; fi - - exit 0 - - allow_failure: - exit_codes: - - 123 - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - - report.html - - $PAGES_HTML_ARTIFACT_NAME - - $CSV_ARTIFACT_NAME - - $MERGED_CSV_ARTIFACT_NAME - - $SUMMARY_HTML_ARTIFACT_NAME - - $IMAGES_ARTIFACT_NAME - expose_as: "pytest compare results" - reports: - junit: - - report-junit.xml - -.check-up-to-date-in-comparison-jobs: &check-up-to-date-in-comparison-jobs - - *get-commits-behind-count - - | - if [ $commits_behind_count -ne 0 ]; then - set +x - echo -e "Your branch is $commits_behind_count commits behind the target branch, possibly main changed during your pipeline run. Checking bitexactness or testing for regressions now can result in meaningless results. Run\n\t git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." - exit 1 - fi - -.check-be-to-target-anchor: &check-be-to-target-anchor - stage: check-be - needs: ["build-codec-linux-make"] - timeout: "300 minutes" - variables: - XML_REPORT: "report--$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.xml" - HTML_REPORT: "report--$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.html" - PYTEST_LOG_TARGET_BRANCH: "pytest-log-$CI_MERGE_REQUEST_TARGET_BRANCH_NAME.txt" - script: - - *print-common-info - - - set -euxo pipefail - - - *update-scripts-repo - - python3 tests/create_short_testvectors.py - - - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir - - testcase_timeout=$TESTCASE_TIMEOUT_LTV - - else - - testcase_timeout=$TESTCASE_TIMEOUT_STV - - fi - - - python3 ci/remove_unsupported_testcases.py $PRM_FILES - - python3 scripts/prepare_combined_format_inputs.py - - - if [ $LEVEL_SCALING != "1.0" ];then - - *apply-testv-scaling - - fi - - - *build-float-ref-binaries - - *build-merge-target-binaries - - make clean - - make -j - - *check-up-to-date-in-comparison-jobs - - - exit_code_target=0 - - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? - - - exit_code=0 - - rm -rf .pytest_cache || true - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --mld --ssnr --odg --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout > pytest_log.txt || exit_code=$? - - - if [ $exit_code -ne 0 ]; then - - exit_code=$EXIT_CODE_NON_BE - - zip -r $PYTEST_CACHE_ARTIFACT .pytest_cache - - - grep "^FAILED" pytest_log.txt | sed "s/^FAILED /'/" | sed "s/] - .*/]'/" | tr "\n" " " > $FAILED_TESTCASES_LIST || true - - grep "^FAILED" pytest_log.txt | sed "s/^FAILED //" | sed "s/] - .*/]/" > failed_testcases_for_printing.txt || true - - num_failures=$(wc -l < failed_testcases_for_printing.txt) - - - grep "^ERROR" pytest_log.txt | sed "s/^ERROR /'/" | sed "s/] - .*/]'/" | tr "\n" " " > $ERRORS_TESTCASES_LIST || true - - grep "^ERROR" pytest_log.txt | sed "s/^ERROR //" | sed "s/] - .*/]/" > errors_testcases_for_printing.txt || true - - num_errors=$(wc -l < errors_testcases_for_printing.txt) - - - *print-results-banner - - echo "Found these $num_failures non-bitexact testcases:" - - cat failed_testcases_for_printing.txt - - - echo "Reproduce locally with:" - - echo -e "1. Create references with target branch $CI_MERGE_REQUEST_TARGET_BRANCH_NAME:\n\t- git checkout $(cat $FLOAT_REF_COMMIT_FILE)\n\t- make clean\n\t- make -j\n\t- mv IVAS_cod IVAS_cod_ref\n\t- mv IVAS_dec IVAS_dec_ref\n\t- python3 -m pytest $(cat $FAILED_TESTCASES_LIST) --update_ref 1 --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH" - - echo -e "2. Run test with source branch $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME:\n\t- git checkout $(cat $CUT_COMMIT_FILE)\n\t- make clean\n\t- make -j\n\t- python3 -m pytest $(cat $FAILED_TESTCASES_LIST) --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH" - - echo "The individual command lines can be found in the html report in the job artifacts." - - if [ $num_errors -ne 0 ]; then - - exit_code=1 - - echo "There were errors present in the following testcases:" - - cat errors_testcases_for_printing.txt - - fi - - - exit $exit_code - - else - # create empty files to not have errors at artifact stage - - touch $FAILED_TESTCASES_LIST - - touch $ERRORS_TESTCASES_LIST - - touch $PYTEST_CACHE_ARTIFACT - - *print-results-banner - - echo "All testcases are bitexact." - - fi - - exit $exit_code - - allow_failure: - exit_codes: - - 123 - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 1 week - when: always - paths: - - $XML_REPORT - - $HTML_REPORT - - $FAILED_TESTCASES_LIST - - $ERRORS_TESTCASES_LIST - - pytest_log.txt - - $PYTEST_CACHE_ARTIFACT - - $FLOAT_REF_COMMIT_FILE - - $CUT_COMMIT_FILE - - $MERGE_TARGET_COMMIT_FILE - - $PYTEST_LOG_TARGET_BRANCH - expose_as: "pytest compare results" - reports: - junit: - - $XML_REPORT - - $XML_REPORT - -.overwrite-pytest-cache-with-artifact: &overwrite-pytest-cache-with-artifact - - if [ -f $PYTEST_CACHE_ARTIFACT ]; then - - rm -rf .pytest_cache || true - - unzip $PYTEST_CACHE_ARTIFACT - - fi - -.check-regressions-pytest-anchor: &check-regressions-pytest-anchor - stage: test - timeout: "300 minutes" - variables: - XML_REPORT_BRANCH: "report-junit-branch-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.xml" - XML_REPORT_MAIN: "report-junit-main-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.xml" - HTML_REPORT_BRANCH: "report-junit-branch-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.html" - HTML_REPORT_MAIN: "report-junit-main-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.html" - CSV_BRANCH: "scores-branch-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.csv" - CSV_MAIN: "scores-main-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.csv" - IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" - SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" - script: - - *print-common-info - - # create empty files for all artifacts to suppress warnings in case of no regressions found or all is BE - - touch $XML_REPORT_BRANCH $XML_REPORT_MAIN $HTML_REPORT_BRANCH $HTML_REPORT_MAIN $CSV_BRANCH $CSV_MAIN $SUMMARY_HTML_ARTIFACT_NAME $FLOAT_REF_COMMIT_FILE $CUT_COMMIT_FILE $MERGE_TARGET_COMMIT_FILE regressions_crashes.csv regressions_MLD.csv regressions_MAXIMUM_ABS_DIFF.csv regressions_MIN_SSNR.csv regressions_MIN_ODG.csv improvements_crashes.csv improvements_MLD.csv improvements_MAXIMUM_ABS_DIFF.csv improvements_MIN_SSNR.csv improvements_MIN_ODG.csv - - mkdir $IMAGES_ARTIFACT_NAME - - - set -euxo pipefail - - - if [ -s $FAILED_TESTCASES_LIST ]; then - - *overwrite-pytest-cache-with-artifact - - export PYTEST_ADDOPTS=--last-failed - - else - # turn off echoing back of commands for result printout - - *print-results-banner - - echo -e "All tested cases were bit-exact between $CI_MERGE_REQUEST_TARGET_BRANCH_NAME and $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME.\nNo need to check for regressions. All is fine." - - exit 0 - - fi - - - *update-scripts-repo - - - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir - - testcase_timeout=$TESTCASE_TIMEOUT_LTV - - else - - testcase_timeout=$TESTCASE_TIMEOUT_STV - - fi - - - python3 ci/remove_unsupported_testcases.py $PRM_FILES - - if [ $LEVEL_SCALING != "1.0" ];then - - *apply-testv-scaling - - fi - - # check MR title for flag that allows regressions to be mergable - - echo $CI_MERGE_REQUEST_TITLE > tmp.txt - - allow_regressions_flag=$(grep -c --ignore-case "\[allow[ -]*regression\]" tmp.txt) || true - - ### run branch first - # this per default builds the branch and the reference and creates the reference outputs - - *build-and-create-float-ref-outputs - - *check-up-to-date-in-comparison-jobs - # need to restore cache again - - *overwrite-pytest-cache-with-artifact - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_BRANCH --self-contained-html --junit-xml=$XML_REPORT_BRANCH --mld --ssnr --odg --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true - - zero_errors_branch=$(cat $XML_REPORT_BRANCH | grep -c 'errors="0"') || true - - python3 scripts/parse_xml_report.py $XML_REPORT_BRANCH $CSV_BRANCH - - # Store branch outputs for comparison - - mv tests/dut tests/dut_branch - - # create the summary based on the branch - - for MEASURE in MLD DIFF SSNR ODG;do python3 scripts/create_histogram_summary.py $CSV_BRANCH $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".csv $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".png --measure $MEASURE; done - - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME - - ### run main now - - git checkout $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - git pull - - make clean - - make -j - # need to restore cache again - - *overwrite-pytest-cache-with-artifact - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_MAIN --self-contained-html --junit-xml=$XML_REPORT_MAIN --mld --ssnr --odg --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true - - python3 scripts/parse_xml_report.py $XML_REPORT_MAIN $CSV_MAIN - - ### compare the two csv files for regressions - - regressions_found=0 - - python3 scripts/basop_check_for_changes_in_testcases.py --show_improvements --xml_report $XML_REPORT_BRANCH $CSV_BRANCH $CSV_MAIN > regression_log.txt || regressions_found=$? - - - exit_code=0 - - *print-results-banner - - if [ $zero_errors_branch != 1 ]; then - - echo "Run errors encountered!" - - exit_code=$EXIT_CODE_FAIL - - echo "Reproduce locally with:" - - echo -e "1. Create references with target branch $CI_MERGE_REQUEST_TARGET_BRANCH_NAME:\n\t- git checkout $(cat $FLOAT_REF_COMMIT_FILE)\n\t- make clean\n\t- make -j\n\t- mv IVAS_cod IVAS_cod_ref\n\t- mv IVAS_dec IVAS_dec_ref\n\t- python3 -m pytest $(cat $ERRORS_TESTCASES_LIST) --update_ref 1 --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH" - - echo -e "2. Run test with source branch $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME:\n\t- git checkout $(cat $CUT_COMMIT_FILE)\n\t- make clean\n\t- make -j\n\t- python3 -m pytest $(cat $ERRORS_TESTCASES_LIST) --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH" - - echo "The individual command lines can be found in the regressions_crashes.csv files in the job artifacts." - - elif [ $regressions_found != 0 ] && [ "$SKIP_REGRESSION_CHECK" != "true" ]; then - - cat regression_log.txt - - if [ $allow_regressions_flag == 0 ]; then - - echo "Detected regression wrt to $CI_MERGE_REQUEST_TARGET_BRANCH_NAME, [allow regression] not set!" - - exit_code=$EXIT_CODE_FAIL; - - else - - echo "Detected regression wrt to $CI_MERGE_REQUEST_TARGET_BRANCH_NAME, [allow regression] set." - - exit_code=$EXIT_CODE_NON_BE; - - fi - - echo "Reproduce locally with:" - - echo -e "1. Create references with target branch $CI_MERGE_REQUEST_TARGET_BRANCH_NAME:\n\t- git checkout $(cat $FLOAT_REF_COMMIT_FILE)\n\t- make clean\n\t- make -j\n\t- mv IVAS_cod IVAS_cod_ref\n\t- mv IVAS_dec IVAS_dec_ref\n\t- python3 -m pytest $(cat $FAILED_TESTCASES_LIST) --update_ref 1 --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH" - - echo -e "2. Run test with source branch $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME:\n\t- git checkout $(cat $CUT_COMMIT_FILE)\n\t- make clean\n\t- make -j\n\t- python3 -m pytest $(cat $FAILED_TESTCASES_LIST) --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH" - - echo "The individual command lines can be found in the regressions_*.csv files in the job artifacts." - - fi - - - exit $exit_code - after_script: - - rm -rf tests/dut tests/ref - allow_failure: - exit_codes: - - 123 - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 1 week - when: always - paths: - - $XML_REPORT_BRANCH - - $XML_REPORT_MAIN - - $HTML_REPORT_BRANCH - - $HTML_REPORT_MAIN - - $CSV_BRANCH - - $CSV_MAIN - - $SUMMARY_HTML_ARTIFACT_NAME - - $IMAGES_ARTIFACT_NAME - - $FLOAT_REF_COMMIT_FILE - - $CUT_COMMIT_FILE - - $MERGE_TARGET_COMMIT_FILE - - regressions_crashes.csv - - regressions_MLD.csv - - regressions_MAXIMUM_ABS_DIFF.csv - - regressions_MIN_SSNR.csv - - regressions_MIN_ODG.csv - - improvements_crashes.csv - - improvements_MLD.csv - - improvements_MAXIMUM_ABS_DIFF.csv - - improvements_MIN_SSNR.csv - - improvements_MIN_ODG.csv - expose_as: "pytest compare results" - reports: - junit: - - $XML_REPORT_BRANCH - - $XML_REPORT_MAIN - - -.ivas-pytest-sanitizers-anchor: &ivas-pytest-sanitizers-anchor - stage: test - needs: ["build-codec-linux-make"] - timeout: "600 minutes" - rules: - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - when: never - - if: $CI_PIPELINE_SOURCE == 'schedule' && $IVAS_PYTEST_MSAN - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "sanitizer" - script: - - *print-common-info - - *update-scripts-repo - - *copy-ltv-files-to-testv-dir - - python3 ci/remove_unsupported_testcases.py $PRM_FILES - - - *build-float-ref-binaries - - set -euxo pipefail - - make_args="CLANG=$CLANG_NUM" - - if [[ $CLANG_NUM == 3 ]]; then - - export UBSAN_OPTIONS="suppressions=scripts/ubsan_basop.supp,report_error_type=1,print_stacktrace=1" - - python3 scripts/basop_create_ignorelist_for_ubsan.py - - make_args="$make_args IGNORELIST=1" - - fi - - make clean - - make -j $make_args - - testcase_timeout_arg="--testcase_timeout $TESTCASE_TIMEOUT_LTV_SANITIZERS" - # disable per-testcase timeout for msan to evaluate what is going on that it takes so long - - if [[ $CLANG_NUM = 1 ]]; then - - testcase_timeout_arg="" - - fi - - python3 -m pytest $TEST_SUITE -v --tb=no --update_ref 1 --html=report.html --self-contained-html --junit-xml=report-junit.xml $testcase_timeout_arg --ref_encoder_path $DUT_ENCODER_PATH --ref_decoder_path $DUT_DECODER_PATH - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - when: always - expire_in: "2 weeks" - paths: - - report-junit.xml - - report.html - reports: - junit: - - report-junit.xml - -.ivas-pytest-compare-to-input-anchor: &ivas-pytest-compare-to-input-anchor - stage: test - needs: ["build-codec-linux-make"] - timeout: "360 minutes" - variables: - SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" - IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" - script: - - *print-common-info - - *update-scripts-repo - - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir - - testcase_timeout=$TESTCASE_TIMEOUT_LTV - - else - - testcase_timeout=$TESTCASE_TIMEOUT_STV - - fi - - - python3 ci/remove_unsupported_testcases.py $PRM_FILES - - if [ $LEVEL_SCALING != "1.0" ];then - - *apply-testv-scaling - - fi - - *build-float-ref-and-dut-binaries - - ### run pytest - - exit_code=0 - - python3 -m pytest --tb=no $TEST_SUITE -v --create_cut --html=report-ref.html --self-contained-html --junit-xml=report-junit-ref.xml --mld --ssnr --odg -n auto --testcase_timeout $testcase_timeout --dut_encoder_path $REF_ENCODER_PATH --dut_decoder_path $REF_DECODER_PATH --compare_to_input || exit_code=$? - - python3 -m pytest --tb=no $TEST_SUITE -v --create_cut --html=report-dut.html --self-contained-html --junit-xml=report-junit-dut.xml --mld --ssnr --odg -n auto --testcase_timeout $testcase_timeout --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH --compare_to_input || exit_code=$? - - zero_errors_ref=$(cat report-junit-ref.xml | grep -c 'errors="0"') || true - - zero_errors_dut=$(cat report-junit-dut.xml | grep -c 'errors="0"') || true - - python3 scripts/parse_xml_report.py report-junit-ref.xml report-ref.csv - - python3 scripts/parse_xml_report.py report-junit-dut.xml report-dut.csv - - python3 scripts/diff_report.py report-ref.csv report-dut.csv report-diff.csv - - # create summary - - mkdir $IMAGES_ARTIFACT_NAME - - for MEASURE in MLD DIFF SSNR ODG;do python3 scripts/create_histogram_summary.py report-diff.csv $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".csv $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".png --measure $MEASURE --diff; done - - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME - - - exit 0 - - allow_failure: - exit_codes: - - 123 - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 1 week - when: always - paths: - - report-junit-ref.xml - - report-ref.html - - report-ref.csv - - report-junit-dut.xml - - report-dut.html - - report-dut.csv - - report-diff.csv - - $IMAGES_ARTIFACT_NAME - - $SUMMARY_HTML_ARTIFACT_NAME - expose_as: "pytest compare to input results" - reports: - junit: - - report-junit-ref.xml - - report-junit-dut.xml - -# --------------------------------------------------------------- -# .pre jobs for setting up things -# --------------------------------------------------------------- - -# See: https://gitlab.com/gitlab-org/gitlab/-/issues/194023 -# Solution to make main branch pipelines uninterruptible while all other -# pipelines can be interrupted by default. This works because all jobs -# after uninterruptible jobs will be uninterruptible. Resource group -# setting avoids rare case where two fast merges could still interrupt -# pipeline. This should be revisited if there are updates to Gitlab. -uninterruptible: - stage: .pre - interruptible: false - resource_group: uninterruptible - script: - - echo "$CI_COMMIT_BRANCH is uninterruptible" - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - when: always - tags: - - ivas-basop-linux - -# --------------------------------------------------------------- -# verification jobs -# --------------------------------------------------------------- - -branch-is-up-to-date-with-target-pre: - extends: - - .rules-merge-request - stage: prevalidate - needs: [] - tags: - - ivas-basop-linux - script: - - *get-commits-behind-count - - | - if [ $commits_behind_count -ne 0 ]; then - echo -e "Your branch is $commits_behind_count commits behind the target branch, run\n\tgit pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." - exit 1 - fi - -branch-is-up-to-date-with-target-post: - extends: - - .rules-merge-request - stage: postvalidate - tags: - - ivas-basop-linux - script: - - *get-commits-behind-count - - | - if [ $commits_behind_count -ne 0 ]; then - echo -e "Your branch is $commits_behind_count commits behind the target branch, possibly main changed during your pipeline run, run\n\tgit pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." - exit 1 - fi - -clang-format-check: - extends: - - .test-job-linux - rules: - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'schedule' - when: never - variables: - ARTIFACT_BASE_NAME: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--formatting-fix" - stage: prevalidate - needs: [] - timeout: "5 minutes" - script: - - *update-scripts-repo - # Set up variables. This can't be done in the "variables" section because variables are not expanded properly there - - PATCH_FILE_NAME="$ARTIFACT_BASE_NAME".patch - - > - INSTRUCTIONS_GITLAB="To fix formatting issues:\n - - download the diff patch available as artifact of this job\n - - unzip the artifact and place the patch file in the root directory of your local IVAS repo\n - - run: git apply $PATCH_FILE_NAME\n - - commit new changes" - - > - INSTRUCTIONS_README="To fix formatting issues:\n - - place the patch file in the root directory of your local IVAS repo\n - - run: git apply $PATCH_FILE_NAME\n - - commit new changes" - - - format_problems=0 - - scripts/check-format.sh -afD -p 8 || format_problems=$? - - if [ $format_problems == 0 ] ; then exit 0; fi - - - mkdir tmp-formatting-fix - - git diff > "tmp-formatting-fix/$PATCH_FILE_NAME" - - # Print instructions to job output - - echo -e "$INSTRUCTIONS_GITLAB" - - # Include readme in the artifact, in case someone misses the job printout (e.g. getting the artifact via MR interface) - - echo -e "$INSTRUCTIONS_README" > "tmp-formatting-fix/readme.txt" - - - exit $format_problems - artifacts: - expire_in: 1 day - paths: - - tmp-formatting-fix/ - when: on_failure - name: "$ARTIFACT_BASE_NAME" - expose_as: "formatting patch" - -# --------------------------------------------------------------- -# Build jobs -# --------------------------------------------------------------- - -# ensure that codec builds on linux -build-codec-linux-make: - rules: - - if: $CI_PIPELINE_SOURCE == 'web' - - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # trigger build job for all MRs - - if: $CI_PIPELINE_SOURCE == 'schedule' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - extends: - - .build-job-linux - script: - - *print-common-info - - *activate-Werror-linux - - make -j - -# ensure that codec builds on linux with instrumentation active -build-codec-linux-instrumented-make: - rules: - - if: $CI_PIPELINE_SOURCE == 'web' - - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - - if: $CI_PIPELINE_SOURCE == 'schedule' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - extends: - - .build-job-linux - timeout: "7 minutes" - script: - - *print-common-info - - *update-scripts-repo - - bash scripts/prepare_instrumentation.sh -m MEM_ONLY - - make -j -C $INSTR_DIR - -build-codec-linux-debugging-make: - rules: - - if: $CI_PIPELINE_SOURCE == 'web' - - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - - if: $CI_PIPELINE_SOURCE == 'schedule' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - extends: - - .build-job-linux - timeout: "7 minutes" - variables: - BUILD_WITH_DEBUG_MODE_INFO: "true" - script: - - *print-common-info - - *activate-debug-mode-info-if-set - - make -j - -build-codec-windows-msbuild: - rules: - - if: $CI_PIPELINE_SOURCE == 'web' - - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # trigger build job for all MRs - - if: $CI_PIPELINE_SOURCE == 'schedule' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - extends: - - .build-job-windows - timeout: "7 minutes" - tags: - - ivas-windows - script: - - *print-common-info-windows - - *activate-WX-windows - - MSBuild.exe -maxcpucount .\Workspace_msvc\Workspace_msvc.sln /property:Configuration=Debug - -# --------------------------------------------------------------- -# Short test jobs that run in merge request pipelines -# --------------------------------------------------------------- - -### jobs that check for bitexactness of fx encoder and decoder -check-be-to-target-short-enc-0db: - extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor - -check-be-to-target-short-enc-+10db: - extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=3.162 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor - -check-be-to-target-short-enc--10db: - extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=0.3162 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor - -check-be-to-target-short-dec-0db: - extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=1.0 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor - -check-be-to-target-short-dec-+10db: - extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=3.162 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor - -check-be-to-target-short-dec--10db: - extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=0.3162 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor - -### jobs that check for regressions on non-BE testcases -check-regressions-short-enc-0db: - stage: test - needs: - - job: "check-be-to-target-short-enc-0db" - artifacts: true - extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor - -check-regressions-short-enc-+10db: - stage: test - needs: - - job: "check-be-to-target-short-enc-+10db" - artifacts: true - extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=3.162 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor - -check-regressions-short-enc--10db: - stage: test - needs: - - job: "check-be-to-target-short-enc--10db" - artifacts: true - extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=0.3162 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor - -check-regressions-short-dec-0db: - stage: test - needs: - - job: "check-be-to-target-short-dec-0db" - artifacts: true - extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=1.0 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor - -check-regressions-short-dec-+10db: - stage: test - needs: - - job: "check-be-to-target-short-dec-+10db" - artifacts: true - extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=3.162 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor - -check-regressions-short-dec--10db: - stage: test - needs: - - job: "check-be-to-target-short-dec--10db" - artifacts: true - extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=0.3162 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor - -# --------------------------------------------------------------- -# Short test jobs for running from web interface or schedule -# --------------------------------------------------------------- - -### jobs that test fx encoder -> flt decoder -ivas-pytest-compare_to_ref-short-enc: - extends: - - .rules-pytest-to-ref-short - - .test-job-linux - before_script: - - USE_LTV=0 - - ENCODER_TEST="true" - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_to_ref-short-enc-lev-10: - extends: - - .rules-pytest-to-ref-short - - .test-job-linux - before_script: - - USE_LTV=0 - - ENCODER_TEST="true" - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=0.3162 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_to_ref-short-enc-lev+10: - extends: - - .rules-pytest-to-ref-short - - .test-job-linux - before_script: - - USE_LTV=0 - - ENCODER_TEST="true" - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=3.162 - <<: *ivas-pytest-anchor - -# encoder dmx comparison jobs -ivas-pytest-compare_to_ref-dmx-short-enc: - extends: - - .rules-pytest-to-ref-enc-sort-dmx - - .test-job-linux - before_script: - - USE_LTV=0 - - ENCODER_TEST="true" - - COMPARE_DMX="true" - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_to_ref-dmx-short-enc-lev-10: - extends: - - .rules-pytest-to-ref-enc-sort-dmx - - .test-job-linux - before_script: - - USE_LTV=0 - - ENCODER_TEST="true" - - COMPARE_DMX="true" - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=0.3162 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_to_ref-dmx-short-enc-lev+10: - extends: - - .rules-pytest-to-ref-enc-sort-dmx - - .test-job-linux - before_script: - - USE_LTV=0 - - ENCODER_TEST="true" - - COMPARE_DMX="true" - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=3.162 - <<: *ivas-pytest-anchor - -ivas-pytest-enc-msan: - extends: - - .test-job-linux - tags: - - ivas-basop-linux-fast - before_script: - - CLANG_NUM=1 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE=$LONG_TEST_SUITE_ENCODER - <<: *ivas-pytest-sanitizers-anchor - -ivas-pytest-enc-asan: - extends: - - .test-job-linux - tags: - - ivas-basop-linux-fast - before_script: - - CLANG_NUM=2 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE=$LONG_TEST_SUITE_ENCODER - <<: *ivas-pytest-sanitizers-anchor - -ivas-pytest-enc-usan: - extends: - - .test-job-linux - tags: - - ivas-basop-linux-fast - before_script: - - CLANG_NUM=3 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE=$LONG_TEST_SUITE_ENCODER - <<: *ivas-pytest-sanitizers-anchor - -### jobs that test flt encoder -> fx decoder -ivas-pytest-compare_to_ref-short-dec: - extends: - - .rules-pytest-to-ref-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_to_ref-short-dec-lev-10: - extends: - - .rules-pytest-to-ref-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=0.3162 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_to_ref-short-dec-lev+10: - extends: - - .rules-pytest-to-ref-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=3.162 - <<: *ivas-pytest-anchor - -### jobs that compare the output synthesis to the input files directly -ivas-pytest-compare-to-input-short-dec: - extends: - - .rules-pytest-to-input-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-compare-to-input-anchor - -ivas-pytest-compare-to-input-short-enc: - extends: - - .rules-pytest-to-input-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-compare-to-input-anchor - -ivas-pytest-dec-msan: - extends: - - .test-job-linux - tags: - - ivas-basop-linux-fast - before_script: - - CLANG_NUM=1 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE=$LONG_TEST_SUITE_NO_RENDERER - <<: *ivas-pytest-sanitizers-anchor - -ivas-pytest-dec-asan: - extends: - - .test-job-linux - tags: - - ivas-basop-linux-fast - before_script: - - CLANG_NUM=2 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE=$LONG_TEST_SUITE_NO_RENDERER - <<: *ivas-pytest-sanitizers-anchor - -ivas-pytest-dec-usan: - extends: - - .test-job-linux - tags: - - ivas-basop-linux-fast - before_script: - - CLANG_NUM=3 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE=$LONG_TEST_SUITE_NO_RENDERER - <<: *ivas-pytest-sanitizers-anchor - -# --------------------------------------------------------------- -# Long test jobs -# --------------------------------------------------------------- - -ivas-pytest-compare_ref-long-enc: - extends: - - .rules-pytest-long - - .test-job-linux - before_script: - - USE_LTV=1 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_ref-long-dec: - extends: - - .rules-pytest-long - - .test-job-linux - before_script: - - USE_LTV=1 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_ref-long-enc-lev-10: - extends: - - .rules-pytest-long - - .test-job-linux - before_script: - - USE_LTV=1 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE_ENCODER" - - LEVEL_SCALING=0.3162 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_ref-long-dec-lev-10: - extends: - - .rules-pytest-long - - .test-job-linux - before_script: - - USE_LTV=1 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE" - - LEVEL_SCALING=0.3162 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_ref-long-enc-lev+10: - extends: - - .rules-pytest-long - - .test-job-linux - before_script: - - USE_LTV=1 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE_ENCODER" - - LEVEL_SCALING=3.162 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_ref-long-dec-lev+10: - extends: - - .rules-pytest-long - - .test-job-linux - before_script: - - USE_LTV=1 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE" - - LEVEL_SCALING=3.162 - <<: *ivas-pytest-anchor - -ivas-smoke-test-saturation: - extends: - - .rules-pytest-saturation-smoke-test - - .test-job-linux-needs-testv-dir - script: - - USE_LTV=1 - - LEVEL_SCALING=32768 - - - *print-common-info - - *update-scripts-repo - - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir - - fi - - if [ $LEVEL_SCALING != "1.0" ];then - - *apply-testv-scaling - - fi - - cp -r scripts/testv/* $TESTV_DIR/ - - # skip prepare_mem_dryrun.py script in smoke_test.sh - - sed -i 's/python3 .\/scripts\/prepare_mem_dryrun.py/#python3 .\/scripts\/prepare_mem_dryrun.py/g' ci/smoke_test.sh - - - bash ci/smoke_test.sh - ### analyze for failures - - if ! [ -s smoke_test_output.txt ] || ! [ -s smoke_test_output_plc.txt ] || ! [ -s smoke_test_output_jbm_noEXT.txt ] || ! [ -s smoke_test_output_hrtf.txt ]; then echo "Error in smoke test"; exit 1; fi - - ret_val=0 - - if cat smoke_test_output.txt | grep -c "failed" ; then echo "Smoke test without PLC failed"; ret_val=1; fi - - if cat smoke_test_output_plc.txt | grep -c "failed"; then echo "Smoke test with PLC failed"; ret_val=1; fi - - if cat smoke_test_output_jbm_noEXT.txt | grep -c "failed"; then echo "Smoke test JBM part failed"; ret_val=1; fi - - if cat smoke_test_output_hrtf.txt | grep -c "failed"; then echo "Smoke test with external hrtf files failed"; ret_val=1; fi - - exit $ret_val - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 1 week - when: always - paths: - - smoke_test_output.txt - - smoke_test_output_plc.txt - - smoke_test_output_jbm_noEXT.txt - - smoke_test_output_hrtf.txt - expose_as: "saturation smoke test results" - - -# GCOV/LCOV coverage analysis of self_test suite -coverage-test-on-main-scheduled: - extends: - - .test-job-linux - - .rules-coverage - stage: test - timeout: 3 hours - script: - - *print-common-info - - *update-scripts-repo - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir - - *build-float-ref-binaries - # Build DuT binaries with GCOV - - make clean - - make GCOV=1 -j - - cp IVAS_rend IVAS_rend_ref # Copy to ensure instrumented renderer is run in the first pytest call - - - testcase_timeout=$TESTCASE_TIMEOUT_LTV - - exit_code_dec=0 - - exit_code_enc=0 - - python3 -m pytest --tb=no tests/codec_be_on_mr_nonselection tests/renderer --update_ref 1 -v --create_ref --html=report-dec.html --self-contained-html --junit-xml=report-junit-dec.xml -n auto --testcase_timeout $testcase_timeout --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $DUT_DECODER_PATH || exit_code_dec=$? - - lcov -c -d obj -o coverage_dec_rend.info # extract coverage of decoder/renderer - - - python3 -m pytest --tb=no tests/codec_be_on_mr_nonselection --encoder_only -v --html=report-enc.html --self-contained-html --junit-xml=report-junit-enc.xml -n auto --testcase_timeout $testcase_timeout --dut_encoder_path $DUT_ENCODER_PATH || exit_code_enc=$? - - lcov -c -d obj -o coverage_enc_dec_rend.info # extract coverage of encoder/decoder/renderer - - # remove apps and lib_util files from coverage - - lcov -r coverage_dec_rend.info "*apps*" -o coverage_dec_rend.info - - lcov -r coverage_dec_rend.info "*lib_util*" -o coverage_dec_rend.info - - lcov -r coverage_enc_dec_rend.info "*apps*" -o coverage_enc_dec_rend.info - - lcov -r coverage_enc_dec_rend.info "*lib_util*" -o coverage_enc_dec_rend.info - - - commit_sha=$(git rev-parse HEAD) - - genhtml coverage_enc_dec_rend.info -o coverage_enc_dec_rend -t "Coverage on main enc/dec/rend @ $commit_sha" - - genhtml coverage_dec_rend.info -o coverage_dec_rend -t "Coverage on main -- dec/rend @ $commit_sha" - artifacts: - name: "main-coverage-sha-$CI_COMMIT_SHORT_SHA" - when: always - expire_in: 1 week - paths: - - coverage_enc_dec_rend.info - - coverage_dec_rend.info - - coverage_enc_dec_rend - - coverage_dec_rend - - report-dec.html - - report-enc.html - expose_as: "Coverage result" - reports: - junit: - - report-junit-dec.xml - - report-junit-enc.xml - -# --------------------------------------------------------------- -# EVS 26.444 test job -# --------------------------------------------------------------- - -# check bitexactness to EVS -be-2-evs-26444: - extends: - - .test-job-linux - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "evs-26444" - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" - tags: - - be-2-evs-basop - stage: test - timeout: "120 minutes" # To be revisited - script: - - *print-common-info - - *update-scripts-repo - - sed -i".bak" "s/\(#define EVS_FLOAT\)/\/\/\1/" lib_com/options.h - - make -j - - # copy over to never change the testvector dir - - cp -r $EVS_BE_TEST_DIR_BASOP ./evs_be_test - - mkdir -p ./evs_be_test/output/decoded ./evs_be_test/output/bitstreams - - - exit_code=0 - - python3 -m pytest tests/test_26444.py -v --html=report.html --self-contained-html --junit-xml=report-junit.xml -n auto || exit_code=$? - - if [ $exit_code -eq 1 ]; then echo "Differences encountered"; exit $EXIT_CODE_FAIL; fi - - exit 0 - - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - - report.html - expose_as: "EVS 26444 result" - reports: - junit: - - report-junit.xml - -ivas-pytest-renderer: - extends: - - .test-job-linux - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-renderer" - before_script: - - USE_LTV=0 - - TEST_SUITE="tests/renderer" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-anchor - -peaq-enc-passthrough: - extends: - - .test-job-linux - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "peaq-enc-passthrough" - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="tests/test_enc_passthrough.py" - - DELTA_ODG="true" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-anchor - -# --------------------------------------------------------------- -# Various other tests -# --------------------------------------------------------------- - -# TODO: actually run on MR once main problems are fixed -voip-be-on-merge-request: - extends: - - .test-job-linux-needs-testv-dir - rules: - # - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "voip-be-test" - stage: test - needs: ["build-codec-linux-make"] - timeout: "10 minutes" - script: - - *print-common-info - - make clean - - make -j - - python3 -m pytest tests/test_be_for_jbm_neutral_dly_profile.py - - -# --------------------------------------------------------------- -# Complexity measurement jobs -# --------------------------------------------------------------- - -.complexity-measurements-setup: - &complexity-measurements-setup # create necessary environment - ### 1. part: mainly same as in float repo - this is boilerplate code to make the gitlab pages presentation work - - mkdir -p wmops/logs - - - job_id=$(python3 ci/get_id_of_last_job_occurence.py $CI_COMMIT_REF_NAME $CI_JOB_NAME $CI_PROJECT_ID) - - echo $job_id - # this is a testing/maintenance mechanism to force getting the log history from a specific job id - # see below in the concrete complexity jobs - - if [ "$JOB_ID_INJECT" != "" ]; then job_id=$JOB_ID_INJECT; fi - - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts.zip - - unzip artifacts.zip || true # this may fail on first run, when there are no artifacts there and the zip file is actually just "404"-html - - ls - - public_dir="$CI_JOB_NAME-public" - - # if is needed to catch case when no artifact is there (first run), similarly as above - # 1. check for public_dir being there as this might not be the case when artifact download failed - # 2. check for public dir not being empty - handle job failures in prev job that happen after the dir is created. In that case, the empty dir is in the artifacts - - if [ -d $public_dir ] && [ ! -z "$( ls -A $public_dir )" ]; then - - mv $public_dir/* wmops/ - # check here if we have the split-by-levels files present - if not, fake them up with the existing global one - # this is needed for the first run with split graphs on a branch where the global version did run previously - # NOTE: checking only for level_1 file here as this should already be sufficient - # NOTE2: also not chechking for RAM for same reason - - wmops_all_global="wmops/log_wmops_all.txt" - - ram_all_global="wmops/log_ram_all.txt" - - if [ -f "${wmops_all_global}" ] && [ ! -f "wmops/log_wmops_all_level_1.txt" ]; then - - declare -a suffixes=("level_1" "level_2" "level_3" "rate_sw") - - for suffix in "${suffixes[@]}"; do - - cp ${wmops_all_global} wmops/log_wmops_all_${suffix}.txt - - cp ${ram_all_global} wmops/log_ram_all_${suffix}.txt - - done - - fi - - fi - - - ls wmops - - rm artifacts.zip - - rm -rf $public_dir - - ### 1.5.part: get the corresponding measurement from ivas-float-update - - job_id=$(python3 ci/get_id_of_last_job_occurence.py ivas-float-update $CI_JOB_NAME $CI_PROJECT_ID) - - echo $job_id - - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts_ref.zip - - unzip -j artifacts_ref.zip "*latest_WMOPS.csv" || true - # add file to arguments only if the artifact could be retrieved to prevent error later. - - if [ -f latest_WMOPS.csv ]; then GET_WMOPS_ARGS="$GET_WMOPS_ARGS latest_WMOPS.csv"; fi - -.complexity-measurements-prepare-artifacts: - &complexity-measurements-prepare-artifacts # prepare artifacts -> move to public directory - - public_dir="$CI_JOB_NAME-public" - - mkdir $public_dir - - mv -f wmops/log_*_all*.txt ./*.js ${public_dir}/ - # move logfiles for links - - mkdir $public_dir/logs - # first move logs - - log_files=$(cat $public_dir/graphs*.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") - - echo $log_files - - ls wmops/logs - - for f in $log_files; do [ -f wmops/logs/$f ] && mv wmops/logs/$f $public_dir/logs/$f; done - # copy index page blueprint - - cp ci/complexity_measurements/index_complexity.html ${public_dir}/index.html - # patch the format in the title - - sed -i "s/IVAS FORMAT/IVAS $in_format to $out_format/g" ${public_dir}/index.html - # do separately here to avoid overwrite complaints by mv - - mv -f ci/complexity_measurements/style.css ${public_dir}/ - - ls $public_dir - -.complexity-template: - extends: - - .test-job-linux - stage: test - variables: - ret_val: 0 - GET_WMOPS_ARGS: "mem_only" - timeout: 3 hours 30 minutes - before_script: - - *print-common-info - - *update-scripts-repo - - *update-ltv-repo - - *build-float-ref-and-dut-binaries - - *complexity-measurements-setup - - which coan - artifacts: - name: "$CI_JOB_NAME--$CI_COMMIT_REF_NAME--sha-$CI_COMMIT_SHA" - when: always - expire_in: 2 week - paths: - - $CI_JOB_NAME-public - -complexity-stereo-in-stereo-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - variables: - JOB_ID_INJECT: "" - script: - - in_format=stereo - - out_format=stereo - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-ism-in-binaural-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 1 hour - variables: - JOB_ID_INJECT: "" - script: - - in_format=ISM - - out_format=BINAURAL - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "ISM+1 ISM+2 ISM+3 ISM+4" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-ism-in-binaural_room_ir-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 2 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=ISM - - out_format=BINAURAL_ROOM_IR - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "ISM+1 ISM+2 ISM+3 ISM+4" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-ism-in-ext-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 3 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=ISM - - out_format=EXT - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "ISM+1 ISM+2 ISM+3 ISM+4" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-sba-hoa3-in-hoa3-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 4 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=HOA3 - - out_format=HOA3 - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-sba-hoa3-in-binaural-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 5 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=HOA3 - - out_format=BINAURAL - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-sba-hoa3-in-binaural_room_ir-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 6 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=HOA3 - - out_format=BINAURAL_ROOM_IR - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-mc-in-7_1_4-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 7 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=MC - - out_format=7_1_4 - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-mc-in-binaural-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 10 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=MC - - out_format=BINAURAL - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-mc-in-binaural_room_ir-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 12 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=MC - - out_format=BINAURAL_ROOM_IR - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-masa-in-ext-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 15 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=MASA - - out_format=EXT - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-masa-in-binaural-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 16 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=MASA - - out_format=BINAURAL - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-masa-in-hoa3-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 17 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=MASA - - out_format=HOA3 - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -# complexity-omasa-in-ext-out: -# extends: -# - .complexity-template -# rules: -# - if: $MEASURE_COMPLEXITY_LINUX -# when: delayed -# start_in: 13 hours - # variables: - # JOB_ID_INJECT: "" -# script: -# - in_format=OMASA -# - out_format=EXT -# - ret_val=0 -# - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? -# - *complexity-measurements-prepare-artifacts -# - exit $ret_val - -complexity-omasa-in-binaural-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 18 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=OMASA - - out_format=BINAURAL - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-omasa-in-hoa3-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 20 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=OMASA - - out_format=HOA3 - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-StereoDmxEVS-stereo-in-mono-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 22 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=StereoDmxEVS - - out_format=mono - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -# complexity-osba-in-ext-out: -# extends: -# - .complexity-template -# rules: -# - if: $MEASURE_COMPLEXITY_LINUX -# when: delayed -# start_in: 17 hours -# script: -# - in_format=OSBA -# - out_format=EXT -# - ret_val=0 -# - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? -# - *complexity-measurements-prepare-artifacts -# - exit $ret_val - -complexity-osba-in-binaural-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 22 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=OSBA - - out_format=BINAURAL - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -complexity-osba-in-binaural_room_ir-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 25 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=OSBA - - out_format=BINAURAL_ROOM_IR - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - exit $ret_val - -# job that sets up gitlab pages website -pages: - stage: deploy - tags: - - ivas-basop-linux - rules: - - if: $UPDATE_PAGES - script: - - *print-common-info - - *update-scripts-repo - - python3 ci/setup_pages.py - - ls - - ls -lh public - artifacts: - paths: - - public - expire_in: 1 day + # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this + # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF main + # If you need to set some config variable only in a local branch, then add an overwrite here + # One example is DISABLE_HRTF - this will be set on a branch which is about to be merged and will be removed in a subsequent second MR + # this is more easily done directly here in the child repo + + # these lines are suposed to stay commented out to serve as an example + # # set this to true to skip the external HRTF testcases in pytest calls + # DISABLE_HRTF: "true" + +# all CI code and config is included from https://forge.3gpp.org/rep/ivas-codec-pc/ivas-codec-ci +include: + - project: ivas-codec-pc/ivas-codec-ci + ref: *IVAS_CODEC_CI_REF + file: main-basop.yml diff --git a/.gitlab/merge_request_templates/default.md b/.gitlab/merge_request_templates/default.md new file mode 100644 index 0000000000000000000000000000000000000000..23540da70df8aba62bda4073a7c580bddaa61b61 --- /dev/null +++ b/.gitlab/merge_request_templates/default.md @@ -0,0 +1,25 @@ + +- Related issues: +- Requested reviewers: + +### Reason why this change is needed + +* This may be a direct copy from the issue. + +### Description of the change + +* Describe what is done. + +### Affected operating points + +* Describe here as well as possible what operating points are affected and how +* In minimum, there should be a status for bitstream compatibility and output bit exactness +* For bitstream compatibility, the following levels are helpful for describing encoder + 1. Produced bitstream is BE compared to previous state. + 2. Produced bitstream is non-BE but it is fully backwards compatible for decoding. Decoded output may differ. + 3. Produced bitstream is non-BC. Old decoder cannot decode the produced bitstream correctly. +* For output difference, use BE or non-BE. Additionally, amount of difference can be presented. + + + + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..21bb3e73845cba78065134b4ba197bc7fc1ecd00 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,244 @@ +# CMake file for IVAS +# +# Usage with Unix Makefiles (Linux, OS/X): +# # create build directory +# mkdir build ; cd build +# # call CMake to generate build system, e.g. one of the following: +# cmake -D CMAKE_BUILD_TYPE=Debug ../ +# cmake -D CMAKE_BUILD_TYPE=Release ../ +# cmake -D CMAKE_BUILD_TYPE=Debug -D TARGET_PLATFORM=x86_64 ../ +# # build project +# make -j8 +# +# Usage with Visual Studio +# 1) download CMake from https://cmake.org/download/, don't use the Cygwin version! +# 2.1) build project using IDE +# In CMake GUI select the source dir (root of stereo-evs) and a new binary directory +# and press "Configure" and "Generate". Then open the Visual Studio solution file generated +# in the build directory. +# 2.2) build project using command line +# # create build directory +# mkdir build ; cd build +# # call CMake to generate build system, e.g. one of the following: +# cmake ../ +# cmake -G "Visual Studio 12 2013" ../ +# cmake -G "Visual Studio 12 2013 Win64" ../ +# # open the Visual Studio solution file generated in the build directory +# # or build on command line, e.g.: +# cmake --build . --config Debug +# cmake --build . --config Release + + +cmake_minimum_required(VERSION 3.10) + +set(CMAKE_C_STANDARD 99) + +# configuration options for UNIX +if(UNIX) + set(TARGET_PLATFORM "" CACHE STRING "i686 / x86_64") + set(CLANG "" CACHE STRING "1=msan / 2=asan / 3=usan") + set(GCOV OFF CACHE BOOL "enable GCOV") + set(STRIP OFF CACHE BOOL "enable STRIP") + + if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "") + endif() + # TARGET_PLATFORM + if("${TARGET_PLATFORM}" MATCHES "i386" OR + "${TARGET_PLATFORM}" MATCHES "i586" OR + "${TARGET_PLATFORM}" MATCHES "i686" + ) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32") + elseif("${TARGET_PLATFORM}" MATCHES "x86_64") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m64") + endif() + # C compiler flags + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffp-contract=off") # disable floating point operation contraction + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic -Wcast-qual -Wall -W -Wextra -Wno-long-long") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter -Wno-implicit-fallthrough") + # to be uncommented in CI + # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") + + # CLANG + if(CLANG) + find_program(clangBin NAMES /home/amm-archiv/soft/Linux/clang/current/bin/clang clang REQUIRED) + set(CMAKE_C_COMPILER "${clangBin}" CACHE STRING "") + if("${CLANG}" MATCHES "1" OR "${CLANG}" MATCHES "msan") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=memory") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=memory") + elseif("${CLANG}" MATCHES "2" OR "${CLANG}" MATCHES "asan") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") + elseif("${CLANG}" MATCHES "3" OR "${CLANG}" MATCHES "usan") + # NOTE: keep in sync with list in Makefile + set(USAN_CHECKS_ENABLE + undefined # Default checks + # Extra checks + float-divide-by-zero + implicit-conversion + local-bounds + ) + list(JOIN USAN_CHECKS_ENABLE "," USAN_CHECKS_ENABLE) + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${USAN_CHECKS_ENABLE} -fsanitize-recover=${USAN_CHECKS_ENABLE}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${USAN_CHECKS_ENABLE} -fsanitize-recover=${USAN_CHECKS_ENABLE}") + else() + message(FATAL_ERROR "Unknown CLANG setting: ${CLANG}") + endif() + endif() + # GCOV + if(GCOV) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage -fprofile-update=atomic") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -fprofile-update=atomic") + endif() + # STRIP + if(STRIP) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections -ffunction-sections") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-gc-sections -static") + endif() + + message("CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}") + message("CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}") + # write settings in CMake cache + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}" CACHE STRING "") + set(CMAKE_C_FLAGS_DEBUG "-O0 -g3" CACHE STRING "") + set(CMAKE_C_FLAGS_RELEASE "-O2 -DRELEASE" CACHE STRING "") # TODO should contain -DNDEBUG to disable assert() +elseif(WIN32) + # MSVC compiler flags + add_definitions( + -D_CRT_SECURE_NO_WARNINGS + /MP + ) +endif() + +# configuration options for all platforms +set(WMOPS OFF CACHE BOOL "enable WMOPS") +if(WMOPS) + add_definitions("-DWMOPS=1") +endif() + +project(stereo-evs LANGUAGES C) +set_property(GLOBAL PROPERTY USE_FOLDERS ON) # make Visual Studio projects look nicer +include(CTest) + +file(GLOB libBasopSrcs "lib_basop/*.c") +file(GLOB libBasopHeaders "lib_basop/*.h") +add_library(lib_basop ${libBasopSrcs} ${libBasopHeaders}) +if(UNIX) + target_link_libraries(lib_basop PRIVATE m) +endif() +target_include_directories(lib_basop PUBLIC lib_basop PRIVATE lib_com lib_enc lib_dec lib_rend lib_debug lib_isar) +target_include_directories(lib_basop PRIVATE lib_lc3plus) + +file(GLOB libComSrcs "lib_com/*.c") +file(GLOB libComHeaders "lib_com/*.h") +add_library(lib_com ${libComSrcs} ${libComHeaders}) +if(UNIX) + target_link_libraries(lib_com PRIVATE m) +endif() +target_include_directories(lib_com PUBLIC lib_com PRIVATE lib_basop lib_enc lib_dec lib_rend lib_debug lib_isar) +target_include_directories(lib_com PRIVATE lib_lc3plus) + +file(GLOB libDebugSrcs "lib_debug/*.c") +file(GLOB libDebugHeaders "lib_debug/*.h") +add_library(lib_debug ${libDebugSrcs} ${libDebugHeaders}) +target_link_libraries(lib_debug lib_basop lib_com) +target_include_directories(lib_debug PUBLIC lib_debug PRIVATE lib_basop lib_enc lib_dec lib_rend lib_isar) + +file(GLOB libEncSrcs "lib_enc/*.c") +file(GLOB libEncHeaders "lib_enc/*.h") +add_library(lib_enc ${libEncSrcs} ${libEncHeaders}) +target_link_libraries(lib_enc lib_basop lib_com lib_debug) +target_include_directories(lib_enc PUBLIC lib_enc PRIVATE lib_basop lib_dec lib_rend lib_isar) +target_include_directories(lib_enc PRIVATE lib_lc3plus) + +file(GLOB libLC3plusSrcs "lib_lc3plus/*.c") +file(GLOB libLC3plusHeaders "lib_lc3plus/*.h") +add_library(lib_lc3plus ${libLC3plusSrcs} ${libLC3plusHeaders}) +target_include_directories(lib_lc3plus PUBLIC lib_lc3plus PRIVATE lib_basop lib_com lib_debug) + +file(GLOB libRendSrcs "lib_rend/*.c") +file(GLOB libRendHeaders "lib_rend/*.h") + +add_library(lib_rend ${libRendSrcs} ${libRendHeaders}) +target_link_libraries(lib_rend lib_dec lib_basop lib_com lib_debug) # Todo refactor: This dependency on lib_dec should be removed. +target_link_libraries(lib_rend lib_lc3plus lib_isar) +target_include_directories(lib_rend PUBLIC lib_rend PRIVATE lib_basop lib_enc lib_isar) + + +file(GLOB libDecSrcs "lib_dec/*.c") +file(GLOB libDecHeaders "lib_dec/*.h") +add_library(lib_dec ${libDecSrcs} ${libDecHeaders}) +target_link_libraries(lib_dec lib_com lib_basop lib_rend lib_debug lib_isar) +target_include_directories(lib_dec PUBLIC lib_dec lib_rend PRIVATE lib_basop lib_enc lib_isar lib_util) + +file(GLOB libUtilSrcs "lib_util/*.c") +file(GLOB libUtilHeaders "lib_util/*.h") +add_library(lib_util ${libUtilSrcs} ${libUtilHeaders}) +target_include_directories(lib_util PUBLIC lib_util PRIVATE lib_basop lib_com lib_enc lib_dec lib_rend lib_debug) +target_include_directories(lib_util PRIVATE lib_lc3plus lib_isar) + +if(NOT WMOPS) + add_executable(ivas_lc3plus_unit_test ${CMAKE_SOURCE_DIR}/scripts/split_rendering/lc3plus_basop/ivas_lc3plus_unit_test.c) + target_link_libraries(ivas_lc3plus_unit_test lib_rend lib_dec lib_util lib_com lib_basop lib_debug lib_isar) +endif() + +file(GLOB libISARSrcs "lib_isar/*.c") +file(GLOB libISARHeaders "lib_isar/*.h") + +add_library(lib_isar ${libISARSrcs} ${libISARHeaders}) +target_link_libraries(lib_isar lib_basop lib_com lib_debug lib_lc3plus) # Todo refactor: This dependency on lib_dec should be removed. +target_include_directories(lib_isar PUBLIC lib_isar PRIVATE lib_basop lib_enc lib_dec lib_rend) + + +add_executable(IVAS_cod apps/encoder.c) +target_link_libraries(IVAS_cod lib_enc lib_util) +if(WIN32) + target_link_libraries(IVAS_cod Ws2_32) +endif() + +add_executable(IVAS_cod_fmtsw apps/encoder_fmtsw.c) +target_link_libraries(IVAS_cod_fmtsw lib_enc lib_util) +if(WIN32) + target_link_libraries(IVAS_cod_fmtsw Ws2_32) +endif() + +add_executable(IVAS_dec apps/decoder.c) +target_link_libraries(IVAS_dec lib_dec lib_util) +if(WIN32) + target_link_libraries(IVAS_dec Ws2_32) +endif() + +add_executable(IVAS_rend apps/renderer.c) +target_link_libraries(IVAS_rend lib_rend lib_util lib_isar lib_com) +target_include_directories(IVAS_rend PRIVATE lib_enc) + +add_executable(ISAR_post_rend apps/isar_post_rend.c) +target_link_libraries(ISAR_post_rend lib_basop lib_isar lib_util lib_com) +target_include_directories(ISAR_post_rend PRIVATE lib_basop lib_isar) + +add_executable(ambi_converter apps/ambi_converter.c) +target_link_libraries(ambi_converter lib_util lib_com lib_basop lib_debug) +if(UNIX) + target_link_libraries(ambi_converter m) +endif() +target_include_directories(ambi_converter PRIVATE lib_basop lib_util lib_com lib_debug) + +if(COPY_EXECUTABLES_FROM_BUILD_DIR) + # Optionally copy executables to the same place where Make puts them (useful for tests that expect executables in specific places) + add_custom_command(TARGET IVAS_cod POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") + add_custom_command(TARGET IVAS_cod_fmtsw POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") + add_custom_command(TARGET IVAS_dec POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") + add_custom_command(TARGET IVAS_rend POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") + add_custom_command(TARGET ISAR_post_rend POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") + if (NOT WMOPS) + add_custom_command(TARGET ivas_lc3plus_unit_test POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/scripts/split_rendering/lc3plus_basop") + endif() +endif() + +# Allow creating packages for CMake install +install(TARGETS lib_enc lib_dec lib_rend lib_basop lib_com lib_util ARCHIVE DESTINATION lib) diff --git a/Makefile b/Makefile index 9d18cbde3d47ff872b918dc70675543fc18cfba9..c9ae4493ddacc2edbd9bdbe7c874b7d48a768b75 100644 --- a/Makefile +++ b/Makefile @@ -1,29 +1,37 @@ - # GNU Makefile # Paths +SRC_LIBBASOP = lib_basop SRC_LIBCOM = lib_com SRC_LIBDEBUG = lib_debug SRC_LIBDEC = lib_dec SRC_LIBENC = lib_enc SRC_LIBREND = lib_rend +SRC_LIBISAR = lib_isar +SRC_LC3PLUS = lib_lc3plus lib_lc3plus/fft SRC_LIBUTIL = lib_util SRC_APP = apps BUILD = build OBJDIR = obj -SRC_DIRS = $(sort -u $(SRC_LIBCOM) $(SRC_LIBDEBUG) $(SRC_LIBDEC) $(SRC_LIBENC) $(SRC_LIBREND) $(SRC_LIBUTIL) $(SRC_APP)) +SRC_DIRS = $(sort -u $(SRC_LIBBASOP) $(SRC_LIBCOM) $(SRC_LIBDEBUG) $(SRC_LIBDEC) $(SRC_LIBENC) $(SRC_LIBREND) $(SRC_LIBISAR) $(SRC_LC3PLUS) $(SRC_LIBUTIL) $(SRC_APP)) # Name of CLI binaries -CLI_APIDEC ?= IVAS_dec -CLI_APIENC ?= IVAS_cod -CLI_APIREND ?= IVAS_rend -LIB_LIBCOM ?= libivascom.a -LIB_LIBDEBUG ?= libivasdebug.a -LIB_LIBDEC ?= libivasdec.a -LIB_LIBENC ?= libivasenc.a -LIB_LIBREND ?= libivasrend.a -LIB_LIBUTIL ?= libivasutil.a +CLI_APIDEC ?= IVAS_dec +CLI_APIENC ?= IVAS_cod +CLI_APIENC_FMTSW ?= IVAS_cod_fmtsw +CLI_APIREND ?= IVAS_rend +CLI_APIPOSTREND ?= ISAR_post_rend +CLI_AMBICONVERT ?= ambi_converter +LIB_LIBBASOP ?= libivasbasop.a +LIB_LIBCOM ?= libivascom.a +LIB_LIBDEBUG ?= libivasdebug.a +LIB_LIBDEC ?= libivasdec.a +LIB_LIBENC ?= libivasenc.a +LIB_LIBREND ?= libivasrend.a +LIB_LIBISAR ?= libisar.a +LIB_LC3PLUS ?= liblc3plus.a +LIB_LIBUTIL ?= libivasutil.a # Default tool settings CC ?= gcc @@ -68,6 +76,9 @@ LDLIBS += -lm # Clang sanitizer compiler options CCCLANG = clang +ifeq "$(CLANG)" "0" +CC = $(CCCLANG) +endif ifeq "$(CLANG)" "1" CC = $(CCCLANG) CFLAGS += -fsanitize=memory @@ -129,76 +140,110 @@ CFLAGS += $(foreach DIR,$(SRC_DIRS),-I$(DIR)) # Source file search paths VPATH = $(SRC_DIRS) -# Filter out files that are not part of the build -EXCLUDED_FILES = +# Split rendering files +SRCS_SPLIT_REND = ivas_CQMFDecoder.c ivas_CQMFEncoder.c ivas_PerceptualModel.c ivas_PredDecoder.c \ + ivas_PredEncoder.c ivas_RMSEnvGrouping.c ivas_MSPred.c ivas_NoiseGen.c \ + ivas_splitRend_lcld_dec.c ivas_splitRend_lcld_enc.c \ + ivas_splitRendererPLC.c ivas_splitRendererPost.c ivas_splitRendererPre.c \ + ivas_splitRenderer_utils.c split_rend_bfi_file_reader.c split_render_file_read_write.c \ + ivas_lcld_tables.c + ############################################################################### +SRCS_LIBBASOP = $(foreach DIR,$(SRC_LIBBASOP),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) SRCS_LIBCOM = $(foreach DIR,$(SRC_LIBCOM),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) SRCS_LIBDEBUG = $(foreach DIR,$(SRC_LIBDEBUG),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) SRCS_LIBDEC = $(foreach DIR,$(SRC_LIBDEC),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) SRCS_LIBENC = $(foreach DIR,$(SRC_LIBENC),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) SRCS_LIBREND = $(foreach DIR,$(SRC_LIBREND),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) SRCS_LIBUTIL = $(foreach DIR,$(SRC_LIBUTIL),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) +SRCS_LIBISAR = $(foreach DIR,$(SRC_LIBISAR),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) +SRCS_LC3PLUS = $(foreach DIR,$(SRC_LC3PLUS),$(patsubst $(DIR)/%,%,$(wildcard $(DIR)/*.c))) -SRCS_LIBENC := $(filter-out $(EXCLUDED_FILES),$(SRCS_LIBENC)) - +OBJS_LIBBASOP = $(addprefix $(OBJDIR)/,$(SRCS_LIBBASOP:.c=.o)) OBJS_LIBCOM = $(addprefix $(OBJDIR)/,$(SRCS_LIBCOM:.c=.o)) OBJS_LIBDEBUG = $(addprefix $(OBJDIR)/,$(SRCS_LIBDEBUG:.c=.o)) OBJS_LIBDEC = $(addprefix $(OBJDIR)/,$(SRCS_LIBDEC:.c=.o)) OBJS_LIBENC = $(addprefix $(OBJDIR)/,$(SRCS_LIBENC:.c=.o)) OBJS_LIBREND = $(addprefix $(OBJDIR)/,$(SRCS_LIBREND:.c=.o)) +OBJS_LIBISAR = $(addprefix $(OBJDIR)/,$(SRCS_LIBISAR:.c=.o)) +OBJS_LC3PLUS = $(addprefix $(OBJDIR)/,$(SRCS_LC3PLUS:.c=.o)) OBJS_LIBUTIL = $(addprefix $(OBJDIR)/,$(SRCS_LIBUTIL:.c=.o)) +OBJS_AMBICONVERT = $(OBJDIR)/ambi_convert.o OBJS_CLI_APIDEC = $(OBJDIR)/decoder.o OBJS_CLI_APIENC = $(OBJDIR)/encoder.o +OBJS_CLI_APIENC_FMTSW = $(OBJDIR)/encoder_fmtsw.o OBJS_CLI_APPREND = $(OBJDIR)/renderer.o +OBJS_CLI_APPPOSTREND = $(OBJDIR)/isar_post_rend.o +OBJS_CLI_AMBICONVERT = $(OBJDIR)/ambi_converter.o -DEPS = $(addprefix $(OBJDIR)/,$(SRCS_LIBCOM:.c=.P) $(SRCS_LIBDEBUG:.c=.P) $(SRCS_LIBDEC:.c=.P) \ - $(SRCS_LIBENC:.c=.P) $(SRCS_LIBUTIL:.c=.P) $(SRCS_LIBREND:.c=.P)) +DEPS = $(addprefix $(OBJDIR)/,$(SRCS_LIBBASOP:.c=.P) $(SRCS_LIBCOM:.c=.P) $(SRCS_LIBDEBUG:.c=.P) $(SRCS_LIBDEC:.c=.P) \ + $(SRCS_LIBENC:.c=.P) $(SRCS_LIBUTIL:.c=.P) $(SRCS_LIBREND:.c=.P) $(SRCS_LIBISAR:.c=.P) \ + $(SRCS_LC3PLUS:.c=.P)) ############################################################################### .PHONY: all clean -all: $(CLI_APIENC) $(CLI_APIDEC) $(CLI_APIREND) +all: $(CLI_APIENC) $(CLI_APIENC_FMTSW) $(CLI_APIDEC) $(CLI_APIREND) $(CLI_APIPOSTREND) $(OBJDIR): $(QUIET)mkdir -p $(OBJDIR) +$(LIB_LIBBASOP): $(OBJS_LIBBASOP) + $(QUIET_AR)$(AR) rcs $@ $^ + $(LIB_LIBCOM): $(OBJS_LIBCOM) $(QUIET_AR)$(AR) rcs $@ $^ -$(LIB_LIBDEC): $(OBJS_LIBDEC) $(OBJS_LIBREND) +$(LIB_LIBDEC): $(OBJS_LIBDEC) $(OBJS_LIBREND) $(OBJS_LIBISAR) $(QUIET_AR)$(AR) rcs $@ $^ $(LIB_LIBDEBUG): $(OBJS_LIBDEBUG) $(QUIET_AR)$(AR) rcs $@ $^ +$(LIB_LIBISAR): $(OBJS_LIBISAR) + $(QUIET_AR)$(AR) rcs $@ $^ + $(LIB_LIBENC): $(OBJS_LIBENC) $(QUIET_AR)$(AR) rcs $@ $^ -$(LIB_LIBREND): $(OBJS_LIBREND) +$(LIB_LIBREND): $(OBJS_LIBREND) $(OBJS_LIBISAR) + $(QUIET_AR)$(AR) rcs $@ $^ + +$(LIB_LC3PLUS): $(OBJS_LC3PLUS) $(QUIET_AR)$(AR) rcs $@ $^ + # Dependency on OBJS_LIBCOM added temporarily for unit-test to work -$(LIB_LIBUTIL): $(OBJS_LIBUTIL) $(OBJS_LIBCOM) +$(LIB_LIBUTIL): $(OBJS_LIBUTIL) $(OBJS_LIBBASOP) $(OBJS_LIBCOM) $(QUIET_AR)$(AR) rcs $@ $^ -$(CLI_APIENC): $(OBJS_CLI_APIENC) $(LIB_LIBENC) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(LIB_LIBDEBUG) - $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_APIENC) -L. -livasenc -livascom -livasutil -livasdebug $(LDLIBS) -o $(CLI_APIENC) +$(CLI_APIENC): $(OBJS_CLI_APIENC) $(LIB_LIBBASOP) $(LIB_LIBENC) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(LIB_LIBDEBUG) $(LIB_LC3PLUS) + $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_APIENC) -L. -livasbasop -livasenc -livascom -livasutil -livasdebug $(LDLIBS) -o $(CLI_APIENC) + +$(CLI_APIENC_FMTSW): $(OBJS_CLI_APIENC_FMTSW) $(LIB_LIBBASOP) $(LIB_LIBENC) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(LIB_LIBDEBUG) $(LIB_LC3PLUS) + $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_APIENC_FMTSW) -L. -livasbasop -livasenc -livascom -livasutil -livasdebug $(LDLIBS) -o $(CLI_APIENC_FMTSW) + +$(CLI_APIDEC): $(OBJS_CLI_APIDEC) $(LIB_LIBBASOP) $(LIB_LIBDEC) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(LIB_LIBDEBUG) $(LIB_LC3PLUS) $(LIB_LIBISAR) + $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_APIDEC) -L. -livasbasop -livasdec -livascom -livasutil -livasdebug -llc3plus $(LDLIBS) -o $(CLI_APIDEC) + +$(CLI_APIREND): $(OBJS_CLI_APPREND) $(LIB_LIBBASOP) $(LIB_LIBREND) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(LIB_LIBDEBUG) $(LIB_LIBDEC) $(LIB_LC3PLUS) $(LIB_LIBISAR) + $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_APPREND) -L. -livasbasop -livasrend -lisar -livasdec -livasutil -livasdebug -livascom -llc3plus $(LDLIBS) -o $(CLI_APIREND) -$(CLI_APIDEC): $(OBJS_CLI_APIDEC) $(LIB_LIBDEC) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(LIB_LIBDEBUG) - $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_APIDEC) -L. -livasdec -livascom -livasutil -livasdebug $(LDLIBS) -o $(CLI_APIDEC) +$(CLI_APIPOSTREND): $(OBJS_CLI_APPPOSTREND) $(LIB_LIBBASOP) $(LIB_LIBISAR) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(LIB_LIBDEBUG) $(LIB_LC3PLUS) + $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_APPPOSTREND) -L. -livasbasop -lisar -livasutil -livasdebug -livascom -llc3plus $(LDLIBS) -o $(CLI_APIPOSTREND) -$(CLI_APIREND): $(OBJS_CLI_APPREND) $(LIB_LIBREND) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(LIB_LIBDEBUG) $(LIB_LIBDEC) - $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_APPREND) -L. -livasrend -livasdec -livasutil -livasdebug -livascom $(LDLIBS) -o $(CLI_APIREND) +$(CLI_AMBICONVERT): $(OBJS_CLI_AMBICONVERT) $(OBJS_AMBICONVERT) $(LIB_LIBBASOP) $(LIB_LIBCOM) + $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_AMBICONVERT) $(OBJS_AMBICONVERT) -L. -livascom -livasbasop -livasdebug $(LDLIBS) -o $(CLI_AMBICONVERT) -libs: $(LIB_LIBENC) $(LIB_LIBDEBUG) $(LIB_LIBCOM) $(LIB_LIBDEC) $(LIB_LIBREND) $(LIB_LIBUTIL) +libs: $(LIB_LIBBASOP) $(LIB_LIBENC) $(LIB_LIBDEBUG) $(LIB_LIBCOM) $(LIB_LIBDEC) $(LIB_LIBREND) $(LIB_LIBISAR) $(LIB_LC3PLUS) $(LIB_LIBUTIL) clean: $(QUIET)$(RM) $(OBJS_LIBENC) $(OBJS_LIBDEC) $(DEPS) $(QUIET)$(RM) $(DEPS:.P=.d) $(QUIET)test ! -d $(OBJDIR) || rm -rf $(OBJDIR) - $(QUIET)$(RM) $(CLI_APIENC) $(CLI_APIDEC) $(CLI_APIREND) $(LIB_LIBENC) $(LIB_LIBDEBUG) $(LIB_LIBCOM) $(LIB_LIBDEC) $(LIB_LIBUTIL) $(LIB_LIBREND) + $(QUIET)$(RM) $(CLI_APIENC) $(CLI_APIENC_FMTSW) $(CLI_APIDEC) $(CLI_APIREND) $(CLI_APIPOSTREND) $(CLI_AMBICONVERT) $(LIB_LIBENC) $(LIB_LIBDEBUG) $(OBJS_LIBBASOP) $(LIB_LIBCOM) $(LIB_LIBDEC) $(LIB_LIBUTIL) $(LIB_LIBREND) $(LIB_LIBISAR) $(LIB_LC3PLUS) $(OBJDIR)/%.o : %.c | $(OBJDIR) $(QUIET_CC)$(CC) $(CFLAGS) -c -MD -o $@ $< diff --git a/Workspace_msvc/Workspace_msvc.sln b/Workspace_msvc/Workspace_msvc.sln index a0783ddbf435ddeb6f09907e51620302fac68237..c9c1f0fde7302be2a5d9c0785a12d133320c85e5 100644 --- a/Workspace_msvc/Workspace_msvc.sln +++ b/Workspace_msvc/Workspace_msvc.sln @@ -15,16 +15,46 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_debug", "lib_debug.vcxproj", "{54509728-928B-44D9-A118-A6F92F08B34F}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "decoder", "decoder.vcxproj", "{E3DCBC31-7FC9-D127-E000-529F8460D5FD}" + ProjectSection(ProjectDependencies) = postProject + {63747FE7-94BA-410C-8D7F-EB47555DD994} = {63747FE7-94BA-410C-8D7F-EB47555DD994} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "encoder", "encoder.vcxproj", "{B3FC9DFC-7268-8660-7C0D-B60BAF02C554}" + ProjectSection(ProjectDependencies) = postProject + {63747FE7-94BA-410C-8D7F-EB47555DD994} = {63747FE7-94BA-410C-8D7F-EB47555DD994} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "encoder_fmtsw", "encoder_fmtsw.vcxproj", "{CA7EA15E-09A4-4196-A8EA-2A5F6F84862B}" + ProjectSection(ProjectDependencies) = postProject + {63747FE7-94BA-410C-8D7F-EB47555DD994} = {63747FE7-94BA-410C-8D7F-EB47555DD994} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "renderer", "renderer.vcxproj", "{12B4C8A5-1E06-4E30-B443-D1F916F52B47}" + ProjectSection(ProjectDependencies) = postProject + {63747FE7-94BA-410C-8D7F-EB47555DD994} = {63747FE7-94BA-410C-8D7F-EB47555DD994} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_lc3plus", "lib_lc3plus.vcxproj", "{95030B82-70CD-4C6B-84D4-61096035BEA2}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{51160D4C-55C9-4C16-A792-D94507225746}" ProjectSection(SolutionItems) = preProject ..\.clang-format = ..\.clang-format EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_isar", "lib_isar.vcxproj", "{869A305E-D99E-4C3A-BDB3-AA57ABCCE619}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "isar_post_rend", "isar_post_rend.vcxproj", "{12374ADC-0E5C-4FDD-B903-71D572413831}" + ProjectSection(ProjectDependencies) = postProject + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} = {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_basop", "lib_basop.vcxproj", "{63747FE7-94BA-410C-8D7F-EB47555DD994}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ambi_converter", "ambi_converter.vcxproj", "{2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}" + ProjectSection(ProjectDependencies) = postProject + {39EC200D-7795-4FF8-B214-B24EDA5526AE} = {39EC200D-7795-4FF8-B214-B24EDA5526AE} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -81,6 +111,12 @@ Global {B3FC9DFC-7268-8660-7C0D-B60BAF02C554}.Release|Win32.ActiveCfg = Release|Win32 {B3FC9DFC-7268-8660-7C0D-B60BAF02C554}.Release|Win32.Build.0 = Release|Win32 {B3FC9DFC-7268-8660-7C0D-B60BAF02C554}.Release|x64.ActiveCfg = Release|Win32 + {CA7EA15E-09A4-4196-A8EA-2A5F6F84862B}.Debug|Win32.ActiveCfg = Debug|Win32 + {CA7EA15E-09A4-4196-A8EA-2A5F6F84862B}.Debug|Win32.Build.0 = Debug|Win32 + {CA7EA15E-09A4-4196-A8EA-2A5F6F84862B}.Debug|x64.ActiveCfg = Debug|Win32 + {CA7EA15E-09A4-4196-A8EA-2A5F6F84862B}.Release|Win32.ActiveCfg = Release|Win32 + {CA7EA15E-09A4-4196-A8EA-2A5F6F84862B}.Release|Win32.Build.0 = Release|Win32 + {CA7EA15E-09A4-4196-A8EA-2A5F6F84862B}.Release|x64.ActiveCfg = Release|Win32 {12B4C8A5-1E06-4E30-B443-D1F916F52B47}.Debug|Win32.ActiveCfg = Debug|Win32 {12B4C8A5-1E06-4E30-B443-D1F916F52B47}.Debug|Win32.Build.0 = Debug|Win32 {12B4C8A5-1E06-4E30-B443-D1F916F52B47}.Debug|x64.ActiveCfg = Debug|Win32 @@ -93,6 +129,30 @@ Global {95030B82-70CD-4C6B-84D4-61096035BEA2}.Release|Win32.ActiveCfg = Release|Win32 {95030B82-70CD-4C6B-84D4-61096035BEA2}.Release|Win32.Build.0 = Release|Win32 {95030B82-70CD-4C6B-84D4-61096035BEA2}.Release|x64.ActiveCfg = Release|Win32 + {869A305E-D99E-4C3A-BDB3-AA57ABCCE619}.Debug|Win32.ActiveCfg = Debug|Win32 + {869A305E-D99E-4C3A-BDB3-AA57ABCCE619}.Debug|Win32.Build.0 = Debug|Win32 + {869A305E-D99E-4C3A-BDB3-AA57ABCCE619}.Debug|x64.ActiveCfg = Debug|Win32 + {869A305E-D99E-4C3A-BDB3-AA57ABCCE619}.Release|Win32.ActiveCfg = Release|Win32 + {869A305E-D99E-4C3A-BDB3-AA57ABCCE619}.Release|Win32.Build.0 = Release|Win32 + {869A305E-D99E-4C3A-BDB3-AA57ABCCE619}.Release|x64.ActiveCfg = Release|Win32 + {12374ADC-0E5C-4FDD-B903-71D572413831}.Debug|Win32.ActiveCfg = Debug|Win32 + {12374ADC-0E5C-4FDD-B903-71D572413831}.Debug|Win32.Build.0 = Debug|Win32 + {12374ADC-0E5C-4FDD-B903-71D572413831}.Debug|x64.ActiveCfg = Debug|Win32 + {12374ADC-0E5C-4FDD-B903-71D572413831}.Release|Win32.ActiveCfg = Release|Win32 + {12374ADC-0E5C-4FDD-B903-71D572413831}.Release|Win32.Build.0 = Release|Win32 + {12374ADC-0E5C-4FDD-B903-71D572413831}.Release|x64.ActiveCfg = Release|Win32 + {63747FE7-94BA-410C-8D7F-EB47555DD994}.Debug|Win32.ActiveCfg = Debug|Win32 + {63747FE7-94BA-410C-8D7F-EB47555DD994}.Debug|Win32.Build.0 = Debug|Win32 + {63747FE7-94BA-410C-8D7F-EB47555DD994}.Debug|x64.ActiveCfg = Debug|Win32 + {63747FE7-94BA-410C-8D7F-EB47555DD994}.Release|Win32.ActiveCfg = Release|Win32 + {63747FE7-94BA-410C-8D7F-EB47555DD994}.Release|Win32.Build.0 = Release|Win32 + {63747FE7-94BA-410C-8D7F-EB47555DD994}.Release|x64.ActiveCfg = Release|Win32 + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}.Debug|Win32.ActiveCfg = Debug|Win32 + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}.Debug|Win32.Build.0 = Debug|Win32 + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}.Debug|x64.ActiveCfg = Debug|Win32 + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}.Release|Win32.ActiveCfg = Release|Win32 + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}.Release|Win32.Build.0 = Release|Win32 + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}.Release|x64.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Workspace_msvc/ambi_converter.vcxproj b/Workspace_msvc/ambi_converter.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..0e17467f00059626766158928c48c144b4f27610 --- /dev/null +++ b/Workspace_msvc/ambi_converter.vcxproj @@ -0,0 +1,176 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + ambi_converter + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF} + renderer + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + ambi_converter + + + ..\ + .\Release_$(ProjectName)\ + false + false + ambi_converter + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_basop;..\lib_enc;..\lib_dec;..\lib_com;..\lib_debug;..\lib_util;..\lib_isar;..\lib_rend;..\lib_lc3plus;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + false + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_basop;..\lib_enc;..\lib_dec;..\lib_com;..\lib_debug;..\lib_util;..\lib_isar;..\lib_rend;..\lib_lc3plus;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + false + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {63747fe7-94ba-410c-8d7f-eb47555dd994} + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + {54509728-928B-44D9-A118-A6F92F08B34F} + false + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/decoder.vcxproj b/Workspace_msvc/decoder.vcxproj index ca0d96f44247a24937132bda883936e7f5a3dde1..a27712c39684c30c579f3517fa57d9a7927be406 100644 --- a/Workspace_msvc/decoder.vcxproj +++ b/Workspace_msvc/decoder.vcxproj @@ -68,7 +68,7 @@ Disabled - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;..\lib_isar;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) EnableFastChecks @@ -82,6 +82,7 @@ OldStyle Default %(DisableSpecificWarnings) + false _DEBUG;%(PreprocessorDefinitions) @@ -112,7 +113,7 @@ Neither false false - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;..\lib_isar;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) true @@ -129,6 +130,7 @@ Default %(DisableSpecificWarnings) + false NDEBUG;%(PreprocessorDefinitions) @@ -149,14 +151,18 @@ - - + + {63747fe7-94ba-410c-8d7f-eb47555dd994} + {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} false + + {869a305e-d99e-4c3a-bdb3-aa57abcce619} + {2fa8f384-0775-f3b7-f8c3-85209222fc70} false @@ -170,4 +176,4 @@ - \ No newline at end of file + diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj index 9578e488dcee1c036524b8520471e228f6cb409f..1dae36d47534d57b9ab13d410a7e9e08985ba322 100644 --- a/Workspace_msvc/encoder.vcxproj +++ b/Workspace_msvc/encoder.vcxproj @@ -68,7 +68,7 @@ Disabled - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) EnableFastChecks @@ -82,6 +82,7 @@ OldStyle Default %(DisableSpecificWarnings) + false _DEBUG;%(PreprocessorDefinitions) @@ -120,7 +121,7 @@ Neither false false - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) true @@ -137,6 +138,7 @@ Default %(DisableSpecificWarnings) + false NDEBUG;%(PreprocessorDefinitions) @@ -158,6 +160,9 @@ + + {63747fe7-94ba-410c-8d7f-eb47555dd994} + {824da4cf-06f0-45c9-929a-8792f0e19c3e} false diff --git a/Workspace_msvc/encoder_fmtsw.vcxproj b/Workspace_msvc/encoder_fmtsw.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..7af057ae8f535255942da571f4c6085108c5faf1 --- /dev/null +++ b/Workspace_msvc/encoder_fmtsw.vcxproj @@ -0,0 +1,183 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + encoder_fmtsw + {CA7EA15E-09A4-4196-A8EA-2A5F6F84862B} + encoder_fmtsw + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_cod_fmtsw + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_cod_fmtsw + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_basop;..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + false + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + false + true + $(IntDir)$(ProjectName).pdb + Console + + false + + MachineX86 + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_basop;..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + false + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + + + + {63747fe7-94ba-410c-8d7f-eb47555dd994} + + + {824da4cf-06f0-45c9-929a-8792f0e19c3e} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/isar_post_rend.vcxproj b/Workspace_msvc/isar_post_rend.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..0f2063d852538fcc352bb27d389837faeb87c13c --- /dev/null +++ b/Workspace_msvc/isar_post_rend.vcxproj @@ -0,0 +1,180 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + isar_post_rend + {12374ADC-0E5C-4FDD-B903-71D572413831} + isar_post_rend + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + ISAR_post_rend + + + ..\ + .\Release_$(ProjectName)\ + false + false + ISAR_post_rend + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_basop;..\lib_com;..\lib_debug;..\lib_util;..\lib_isar;..\lib_lc3plus;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + false + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_basop;..\lib_com;..\lib_debug;..\lib_util;..\lib_isar;..\lib_lc3plus;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + false + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {63747fe7-94ba-410c-8d7f-eb47555dd994} + + + {54509728-928B-44D9-A118-A6F92F08B34F} + false + + + {869a305e-d99e-4c3a-bdb3-aa57abcce619} + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_basop.vcxproj b/Workspace_msvc/lib_basop.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..8d4f252b5b42ecff0e5c3ae82a622af937ca043c --- /dev/null +++ b/Workspace_msvc/lib_basop.vcxproj @@ -0,0 +1,155 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + {63747FE7-94BA-410C-8D7F-EB47555DD994} + common + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivascom + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivascom + + + + + + + Disabled + ..\lib_isar;..\lib_lc3plus;..\lib_basop;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions); + + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + false + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_isar;..\lib_lc3plus;..\lib_basop;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + false + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 7a2aa8a7f66bcdd6ec2164f382b709a8b43cc925..702c6c1adf8b6c0a92e6a183f0c284961f2d7fd6 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -59,8 +59,8 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + ..\lib_isar;..\lib_lc3plus;..\lib_basop;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions); EnableFastChecks MultiThreadedDebug @@ -72,6 +72,7 @@ OldStyle Default %(DisableSpecificWarnings) + false _DEBUG;%(PreprocessorDefinitions) @@ -94,7 +95,7 @@ Neither false false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + ..\lib_isar;..\lib_lc3plus;..\lib_basop;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) true @@ -109,6 +110,7 @@ Default %(DisableSpecificWarnings) + false NDEBUG;%(PreprocessorDefinitions) @@ -125,57 +127,45 @@ - - - - + + - - - - - + + + + - - - - - - - - - + + + + - - - - + + - - @@ -183,20 +173,18 @@ - - - + - - - + + + @@ -207,7 +195,7 @@ - + @@ -217,11 +205,12 @@ + - + @@ -229,14 +218,15 @@ + - - + + @@ -248,9 +238,7 @@ - - @@ -258,7 +246,6 @@ - @@ -269,7 +256,6 @@ - @@ -283,11 +269,10 @@ - + - + - @@ -297,7 +282,6 @@ - @@ -307,10 +291,13 @@ + + + @@ -318,17 +305,21 @@ + + + + + + - - - + diff --git a/Workspace_msvc/lib_com.vcxproj.filters b/Workspace_msvc/lib_com.vcxproj.filters index 89b47a3fcf9b04744c7ba3e9fd1cfec159c27ca9..37a179045ca136dbbd540c08d247454837167c5b 100644 --- a/Workspace_msvc/lib_com.vcxproj.filters +++ b/Workspace_msvc/lib_com.vcxproj.filters @@ -1,579 +1,549 @@ - + - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_evs_c + + common_ivas_c - - common_all_c + + common_ivas_c - - common_evs_c + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c + + + common_ivas_c common_evs_c + + common_evs_c + + + common_evs_c + common_evs_c common_evs_c - + common_evs_c - + common_evs_c - + common_evs_c - - common_all_c + + common_evs_c - + common_all_c - + common_all_c - + common_all_c common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - + common_all_c - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c + + common_all_c - - common_ivas_c + + common_all_c - - common_ivas_c + + common_all_c - - common_ivas_c + + common_all_c - + common_ivas_c - - common_ivas_c + + common_all_c - + common_h - + common_h - + + common_h + + + common_h + + + common_h + + common_h common_h - + + common_h + + common_h common_h + + common_h + + + common_h + + + common_h + + + common_h + common_h - + common_h - + common_h - + common_h - + common_h - + common_h - + common_h @@ -585,49 +555,48 @@ common_h - + common_h - - + common_h - - + common_h - + common_h - + common_h - + common_h - + common_h - - + common_h common_h + + - - {890c2f45-9385-4fce-859b-6a65469e8dc0} - - - {201ea764-9626-4dca-9cc4-5b4106f8b8b2} - - {fbb860e2-79d0-45b1-ada1-c3a0a369ce2c} + {89daa9bf-9e90-4fec-af56-38675e291f6f} + + + {15426721-e65c-4514-bf00-f87bc1208a28} - {b95b7bed-a666-4a00-9332-2b528638503e} + {0d9238b7-8879-4767-9288-b5e65692cfa8} + + + {5bdbb305-b9db-4187-b825-04449615f37b} \ No newline at end of file diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index 929dd72a802ca74c5499929d2c93f073df9f91eb..ef9c58a89b4c4818ed2eef065e2e642903b850c4 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -56,7 +56,7 @@ Disabled - ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) false @@ -68,6 +68,7 @@ OldStyle Default %(DisableSpecificWarnings) + false $(OutDir)$(TargetName).lib @@ -82,7 +83,7 @@ AnySuitable false false - ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) true @@ -94,6 +95,7 @@ Default %(DisableSpecificWarnings) + false $(OutDir)$(TargetName).lib diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 2d06d29aa90604e44237a3feaf6dc21c57fa4850..b931d122783a5b21781322d1b75a0e851b2bd2db 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -68,7 +68,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_isar;..\lib_rend;..\lib_lc3plus;..\lib_util;.%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) EnableFastChecks @@ -82,6 +82,7 @@ OldStyle Default %(DisableSpecificWarnings) + false _DEBUG;%(PreprocessorDefinitions) @@ -108,7 +109,7 @@ Neither false false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_isar;..\lib_rend;..\lib_lc3plus;..\lib_util;.%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) true @@ -124,6 +125,7 @@ Default %(DisableSpecificWarnings) + false NDEBUG;%(PreprocessorDefinitions) @@ -139,15 +141,12 @@ false - - false - - + - + @@ -218,7 +217,6 @@ - @@ -248,7 +246,7 @@ - + @@ -257,8 +255,7 @@ - - + @@ -273,13 +270,13 @@ - - - - - - - + + + + + + + @@ -296,7 +293,7 @@ - + diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters index 8a4fc4605a1170b9da66c90a81b8bdd4134573c7..170eada9ad30e017f4f3652be5ee6f08f2080937 100644 --- a/Workspace_msvc/lib_dec.vcxproj.filters +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -74,12 +74,6 @@ decoder_ivas_c - - decoder_ivas_c - - - decoder_ivas_c - decoder_ivas_c @@ -89,9 +83,6 @@ decoder_ivas_c - - decoder_ivas_c - decoder_ivas_c @@ -101,12 +92,6 @@ decoder_ivas_c - - decoder_ivas_c - - - decoder_ivas_c - decoder_ivas_c @@ -119,18 +104,9 @@ decoder_all_c - - decoder_all_c - - - decoder_all_c - decoder_all_c - - decoder_all_c - decoder_all_c @@ -269,27 +245,6 @@ decoder_all_c - - decoder_all_c - - - decoder_all_c - - - decoder_all_c - - - decoder_all_c - - - decoder_all_c - - - decoder_all_c - - - decoder_all_c - decoder_all_c @@ -329,9 +284,6 @@ decoder_all_c - - decoder_all_c - decoder_all_c @@ -518,18 +470,48 @@ decoder_ivas_c + + decoder_all_c + + + decoder_all_c + + + decoder_ivas_c + + + decoder_all_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + - - decoder_h - - - decoder_h - - - decoder_h - decoder_h @@ -557,6 +539,15 @@ decoder_h + + decoder_h + + + decoder_h + + + decoder_h + diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 86dcef90541be79286704dffc2160960a9846d2c..93a2a85486561bebdb5cba3e8dec8989a68afb61 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -68,7 +68,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_isar;..\lib_rend;..\lib_lc3plus;.%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) EnableFastChecks @@ -82,6 +82,7 @@ OldStyle Default %(DisableSpecificWarnings) + false _DEBUG;%(PreprocessorDefinitions) @@ -111,7 +112,7 @@ Neither false false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_isar;..\lib_rend;..\lib_lc3plus;.%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) true @@ -128,6 +129,7 @@ Default %(DisableSpecificWarnings) + false NDEBUG;%(PreprocessorDefinitions) @@ -239,8 +241,7 @@ - - + @@ -274,11 +275,10 @@ - + - @@ -318,7 +318,7 @@ - + diff --git a/Workspace_msvc/lib_enc.vcxproj.filters b/Workspace_msvc/lib_enc.vcxproj.filters index 8990971637ef90b8f3a11fbd672278a29d3f89da..0165869a652b48c1578988cf4406ed6a159bce20 100644 --- a/Workspace_msvc/lib_enc.vcxproj.filters +++ b/Workspace_msvc/lib_enc.vcxproj.filters @@ -1,7 +1,6 @@  - encoder_evs_c @@ -47,9 +46,6 @@ encoder_evs_c - - encoder_evs_c - encoder_evs_c @@ -152,9 +148,6 @@ encoder_all_c - - encoder_all_c - encoder_all_c @@ -257,9 +250,6 @@ encoder_all_c - - encoder_all_c - encoder_all_c @@ -287,9 +277,6 @@ encoder_all_c - - encoder_all_c - encoder_all_c @@ -347,9 +334,6 @@ encoder_all_c - - encoder_all_c - encoder_all_c @@ -602,6 +586,16 @@ encoder_ivas_c + + encoder_all_c + + + + encoder_all_c + + + encoder_all_c + diff --git a/Workspace_msvc/lib_isar.vcxproj b/Workspace_msvc/lib_isar.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..0271901c88b4c9ad236ff5e34d925f4d7c107e4c --- /dev/null +++ b/Workspace_msvc/lib_isar.vcxproj @@ -0,0 +1,185 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_isar + {869A305E-D99E-4C3A-BDB3-AA57ABCCE619} + isar + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libisar + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libisar + + + + + + + Disabled + ..\lib_basop;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_isar;..\lib_lc3plus;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions); + + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_basop;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_isar;..\lib_lc3plus;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + false + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + {95030B82-70CD-4C6B-84D4-61096035BEA2} + false + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_lc3plus.vcxproj b/Workspace_msvc/lib_lc3plus.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..ad5139c35b86bd294e926e36b107a114381ebe56 --- /dev/null +++ b/Workspace_msvc/lib_lc3plus.vcxproj @@ -0,0 +1,195 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {95030B82-70CD-4C6B-84D4-61096035BEA2} + Win32Proj + LC3_FL + 10.0.17763.0 + + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + true + Unicode + + + + + + + + + + + + + + + liblc3plus + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + + + LC3plus + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\Obj\ + + + + + + Level3 + ..\lib_basop;..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + Disabled + MultiThreadedDebug + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + 4305;4244;4996 + OldStyle + false + false + + + Console + true + + + + + Level3 + + + ..\lib_basop;..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + MaxSpeed + MultiThreaded + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + 4244;4305;4996 + false + + + Console + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index e47858ae380f169b2bf53e720d1c3abf23c29224..b76f3211cbbeb550c4df1977e072f6db0734bc9a 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -68,7 +68,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_isar;..\lib_rend;..\lib_lc3plus;.%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) EnableFastChecks @@ -82,6 +82,7 @@ OldStyle Default %(DisableSpecificWarnings) + false _DEBUG;%(PreprocessorDefinitions) @@ -108,7 +109,7 @@ Neither false false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_isar;..\lib_rend;..\lib_lc3plus;.%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) true @@ -124,6 +125,7 @@ Default %(DisableSpecificWarnings) + false NDEBUG;%(PreprocessorDefinitions) @@ -136,19 +138,18 @@ + - - @@ -159,7 +160,7 @@ - + @@ -175,8 +176,9 @@ + - + @@ -196,6 +198,10 @@ {54509728-928b-44d9-a118-a6f92f08b34f} false + + {95030B82-70CD-4C6B-84D4-61096035BEA2} + false + @@ -205,4 +211,4 @@ - \ No newline at end of file + diff --git a/Workspace_msvc/lib_rend.vcxproj.filters b/Workspace_msvc/lib_rend.vcxproj.filters index 5c4a4901111136b5ce1c1406701ffe10e156b86b..dfa1253eb5681d99f0a489d33757f1365762af8f 100644 --- a/Workspace_msvc/lib_rend.vcxproj.filters +++ b/Workspace_msvc/lib_rend.vcxproj.filters @@ -1,13 +1,6 @@ - - - rend_c - - - rend_c - rend_c @@ -38,9 +31,6 @@ rend_c - - rend_c - rend_c @@ -119,9 +109,19 @@ rend_c + + rend_c + rend_c + + rend_c + + + + rend_c + diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 86730b859969d9aae777bb89e42da970c1ce1f02..bfbfa8d4cfcb5cde0cfbb9ee005bd22b7c228761 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -55,7 +55,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_isar;..\lib_lc3plus;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) false @@ -67,6 +67,7 @@ OldStyle Default %(DisableSpecificWarnings) + false $(OutDir)$(TargetName).lib @@ -78,7 +79,7 @@ AnySuitable false false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_isar;..\lib_lc3plus;..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -90,6 +91,7 @@ Default %(DisableSpecificWarnings) + false $(OutDir)$(TargetName).lib @@ -98,6 +100,8 @@ + + @@ -105,8 +109,13 @@ + - + + + + + @@ -117,11 +126,15 @@ + + + + @@ -129,7 +142,15 @@ + + + + + + + + @@ -138,6 +159,7 @@ + @@ -145,6 +167,8 @@ + + diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj index 70a130e3141e9e71ae9166e941d99f839a9bc7dd..d6abf6aa31f8d2214eb354d83acc07bacdef91ae 100644 --- a/Workspace_msvc/renderer.vcxproj +++ b/Workspace_msvc/renderer.vcxproj @@ -65,7 +65,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_com;..\lib_debug;..\lib_util;..\lib_isar;..\lib_rend;..\lib_lc3plus;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) EnableFastChecks @@ -79,6 +79,7 @@ OldStyle Default %(DisableSpecificWarnings) + false _DEBUG;%(PreprocessorDefinitions) @@ -109,7 +110,7 @@ Neither false false - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + ..\lib_basop;..\lib_com;..\lib_debug;..\lib_util;..\lib_isar;..\lib_rend;..\lib_lc3plus;.%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) true @@ -126,6 +127,7 @@ Default %(DisableSpecificWarnings) + false NDEBUG;%(PreprocessorDefinitions) @@ -148,6 +150,9 @@ + + {63747fe7-94ba-410c-8d7f-eb47555dd994} + {54509728-928B-44D9-A118-A6F92F08B34F} false @@ -156,6 +161,9 @@ {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} false + + {869a305e-d99e-4c3a-bdb3-aa57abcce619} + {2FA8F384-0775-F3B7-F8C3-85209222FC70} false diff --git a/apps/ambi_converter.c b/apps/ambi_converter.c new file mode 100644 index 0000000000000000000000000000000000000000..816f96619e0eee30a04a7a61f8afe62ce22faf09 --- /dev/null +++ b/apps/ambi_converter.c @@ -0,0 +1,199 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ +#include +#include +#include +#include "../lib_util/tinywavein_c.h" +#include "../lib_util/tinywaveout_c.h" +#include "ambi_convert.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------------------------* + * Ambisonics converter program + * + * gcc ambi_converter.c ../lib_util/ambi_convert.c -I../lib_util/ -lm -o ambi_converter + *--------------------------------------------------------------------------------------*/ + +int main( int argc, char *argv[] ) +{ + + WAVEFILEIN *wavFile_in; + WAVEFILEOUT *wavFile_out; + char *fileName_in, *fileName_out; + + uint32_t samplingRate; + uint32_t samplesInFile; + uint32_t numSamples = AMBI_MAX_FRAME_LENGTH; + uint32_t numSamplesRead32 = 0; + // uint32_t numSamplesClipped = 0; + uint32_t numFramesClipped = 0; + + int16_t bps; + int16_t samples[AMBI_MAX_FRAME_LENGTH * AMBI_MAX_CHANNELS]; + int16_t order = 0; + int16_t numChannels; + const char *name_conventions[6] = { "ACN-SN3D", "ACN-N3D", "FuMa-MaxN", "FuMa-FuMa", "SID-SN3D", "SID-N3D" }; + + AMBI_FMT in_format, out_format; + + Word16 samples_f_in[AMBI_MAX_FRAME_LENGTH * AMBI_MAX_CHANNELS]; + Word16 samples_f_out[AMBI_MAX_FRAME_LENGTH * AMBI_MAX_CHANNELS]; + Word16 *in[AMBI_MAX_CHANNELS], *out[AMBI_MAX_CHANNELS]; + + for ( int16_t j = 0; j < AMBI_MAX_CHANNELS; j++ ) + { + in[j] = &samples_f_in[j * AMBI_MAX_FRAME_LENGTH]; + out[j] = &samples_f_out[j * AMBI_MAX_FRAME_LENGTH]; + } + + printf( "Ambisonics converter program\n" ); + if ( argc != 5 ) + { + printf( "----------------------------------------------------------------------------------\n" ); + printf( "\n" ); + printf( "Usage: ambi_converter input_file output_file input_convention output_convention\n" ); + printf( "\n" ); + printf( "input_convention and output convention must be an integer number in [0,5]\n" ); + printf( "the following conventions are supported:\n" ); + printf( "0 : ACN-SN3D\n" ); + printf( "1 : ACN-N3D\n" ); + printf( "2 : FuMa-MaxN\n" ); + printf( "3 : FuMa-FuMa\n" ); + printf( "4 : SID-SN3D\n" ); + printf( "5 : SID-N3D\n" ); + printf( "\n" ); + printf( "Either the input or the output convention must always be ACN-SN3D!\n" ); + return -1; + } + + fileName_in = argv[1]; + fileName_out = argv[2]; + in_format = atoi( argv[3] ); + out_format = atoi( argv[4] ); + if ( in_format < 0 || out_format < 0 || in_format > 5 || out_format > 5 ) + { + printf( "input_convention and output convention must be an integer number in [0,5]\n" ); + return -1; + } + printf( "In: [%s], Out: [%s]\n", name_conventions[in_format], name_conventions[out_format] ); + + wavFile_in = OpenWav( fileName_in, &samplingRate, &numChannels, &samplesInFile, &bps ); + if ( !wavFile_in ) + { + fprintf( stderr, "Failed to open input wav file: %s\n", fileName_in ); + return -1; + } + + wavFile_out = CreateWav( fileName_out, samplingRate, numChannels, 16 ); + if ( !wavFile_out ) + { + fprintf( stderr, "Failed to open output wav file: %s\n", fileName_out ); + return -1; + } + + order = (int16_t) sqrtf( numChannels ) - 1; + assert( order > 0 && order <= 3 ); + + numSamples = ( samplingRate * 20 * numChannels ) / 1000; /* 20ms worth of samples */ + while ( ReadWavShort( wavFile_in, samples, numSamples, &numSamplesRead32 ) == __TWI_SUCCESS ) + { + int32_t err = 0; + + if ( !numSamplesRead32 ) + { + break; + } + + for ( uint16_t i = 0; i < (uint16_t) numSamplesRead32 / numChannels; i++ ) + { + for ( int16_t j = 0; j < numChannels; j++ ) + { + in[j][i] = (Word16) samples[i * numChannels + j]; + } + } + + err = convert_ambi_format( in, out, order, in_format, out_format, ( const uint16_t )( numSamples / numChannels ) ); + if ( err == AMBI_CONVERT_CLIPPING_DETECTED ) + { + numFramesClipped++; + } + else if ( err != 0 ) + { + printf( "Error converting the input signal!\n" ); + return err; + } + + + for ( uint16_t i = 0; i < (uint16_t) numSamplesRead32 / numChannels; i++ ) + { + for ( int16_t j = 0; j < numChannels; j++ ) + { + // int s1_i; + // Word16 s1 = out[j][i]; + // if ( s1 < INT16_MIN ) + //{ + // s1_i = INT16_MIN; + // numSamplesClipped++; + // } + // else if ( s1 > INT16_MAX ) + //{ + // s1_i = INT16_MAX; + // numSamplesClipped++; + // } + // else + //{ + // s1_i = (int16_t) s1; + // } + // samples[i * numChannels + j] = s1_i; + samples[i * numChannels + j] = out[j][i]; + } + } + + if ( ( err = WriteWavShort( wavFile_out, samples, numSamplesRead32 ) ) != __TWO_SUCCESS ) + { + printf( "Error writing output wave file!\n" ); + return err; + } + + numSamplesRead32 = 0; + } + + CloseWav( wavFile_out ); + CloseWavIn( wavFile_in ); + + if ( numFramesClipped ) + { + printf( "Warning: %d frames have clipped!\n", numFramesClipped ); + } + + return 0; +} diff --git a/apps/decoder.c b/apps/decoder.c index 1c59a02e743cd3716e2299e9c39fed891a0441d0..c3a0a6c4b1a9cdf2d06e82cdfe5b681b18b463c6 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -31,6 +31,7 @@ *******************************************************************************************************/ #include "lib_dec.h" +#include "options.h" #include #include "cmdl_tools.h" #include "audio_file_writer.h" @@ -43,10 +44,13 @@ #include "masa_file_writer.h" #include "render_config_reader.h" #include "rotation_file_reader.h" +#include "aeid_file_reader.h" +#include "split_render_file_read_write.h" +#include "obj_edit_file_reader.h" #include "vector3_pair_file_reader.h" #include "wmc_auto.h" -#include "options.h" #include "stl.h" +#include "ivas_rtp_file.h" #define WMC_TOOL_SKIP @@ -60,25 +64,28 @@ static #endif int32_t frame = 0; /* Counter of frames */ -#define MIN_NUM_BITS_ACTIVE_FRAME 56 -#define NUM_BITS_SID_IVAS_5K2 104 -#define MAX_OUTPUT_PCM_BUFFER_SIZE ( ( IVAS_MAX_OUTPUT_CHANNELS + IVAS_MAX_NUM_OBJECTS ) * IVAS_MAX_FRAME_SIZE ) +#define RANDOM_INITSEED_DEC ( 0xFADE ) -#define ORIENT_TRK_NONE ( 0 ) -#define ORIENT_TRK_REF ( 1 ) -#define ORIENT_TRK_AVG ( 2 ) -#define ORIENT_TRK_REF_VEC ( 3 ) -#define ORIENT_TRK_REF_VEC_LEV ( 4 ) - -#define JBM_FRONTEND_FETCH_FRAMESIZE_MS 20 -#define HEADROTATION_FETCH_FRAMESIZE_MS 5 -#define DEFAULT_FETCH_FRAMESIZE_MS 20 +#ifdef DEBUGGING +#define MIN_NUM_BITS_ACTIVE_FRAME 56 +#define NUM_BITS_SID_IVAS_5K2 104 +#endif /*------------------------------------------------------------------------------------------* * Local structure for storing cmdln arguments *------------------------------------------------------------------------------------------*/ +typedef struct +{ + uint16_t *pID; + uint16_t *pValidity; + uint16_t count; + uint16_t selected; + uint16_t frameCounter; + +} AcousticEnvironmentSequence; + typedef struct { char *inputBitstreamFilename; @@ -108,21 +115,47 @@ typedef struct IVAS_DEC_INPUT_FORMAT inputFormat; bool customLsOutputEnabled; char *customLsSetupFilename; - int16_t orientation_tracking; - int16_t Opt_non_diegetic_pan; + IVAS_HEAD_ORIENT_TRK_T orientation_tracking; + bool non_diegetic_pan_enabled; float non_diegetic_pan_gain; Word16 non_diegetic_pan_gain_fx; /* Q15 */ bool renderConfigEnabled; char *renderConfigFilename; + char *outputMdFilename; IVAS_DEC_COMPLEXITY_LEVEL complexityLevel; bool tsmEnabled; IVAS_RENDER_FRAMESIZE renderFramesize; - uint16_t acousticEnvironmentId; - int16_t Opt_dpid_on; + AcousticEnvironmentSequence aeSequence; + bool dpidEnabled; uint16_t directivityPatternId[IVAS_MAX_NUM_OBJECTS]; + bool objEditEnabled; + char *objEditFileName; + bool applyPiData; + char *piOutputFilename; + bool rtpOutSR; + bool evsMode; + IVAS_ROOM_SIZE_T roomSize; } DecArguments; +typedef struct +{ + hrtfFileReader *hrtfReader; + char *hrtfFileName; + + IVAS_DEC_HRTF_TD_HANDLE *hHrtfTD; + + IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics; + + IVAS_BIN_RENDERER_TYPE binaural_renderer; + IVAS_BIN_RENDERER_TYPE binaural_renderer_old; + IVAS_BIN_RENDERER_TYPE binaural_renderer_sec; + IVAS_BIN_RENDERER_TYPE binaural_renderer_sec_old; + + IVAS_AUDIO_CONFIG hrtf_set_audio_cfg; + +} IVAS_DEC_HRTF_BINARY_WRAPPER; + /*------------------------------------------------------------------------------------------* * Local functions prototypes @@ -130,8 +163,23 @@ typedef struct static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg ); static void usage_dec( void ); -static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); -static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec ); +static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, ISAR_SPLIT_REND_BITS_DATA *splitRendBits, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); +static ivas_error decodeVoIP( + DecArguments arg, + BS_READER_HANDLE hBsReader, + IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, + RotFileReader *headRotReader, + RotFileReader *externalOrientationFileReader, + RotFileReader *refRotReader, + Vector3PairFileReader *referenceVectorReader, + ObjectEditFileReader *objectEditFileReader, + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, + IVAS_RENDER_CONFIG_DATA *renderConfig, + IVAS_DEC_HANDLE *phIvasDec, + int16_t *pcmBuf ); +static ivas_error load_hrtf_from_file( IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, IVAS_DEC_HANDLE hIvasDec, const IVAS_AUDIO_CONFIG OutputConfig, const int32_t output_Fs ); +static void do_object_editing_fx( IVAS_EDITABLE_PARAMETERS *editableParameters, ObjectEditFileReader *objectEditFileReader ); +static ivas_error restartDecoder( IVAS_DEC_HANDLE *phIvasDec, const IVAS_DEC_MODE decMode, DecArguments *arg, IVAS_RENDER_CONFIG_DATA *renderConfig, IVAS_CUSTOM_LS_DATA *hLsCustomData ); /*------------------------------------------------------------------------------------------* @@ -147,6 +195,8 @@ int main( bool mainFailed = true; /* Assume main failed until cleanup is reached without errors */ DecArguments arg; ivas_error error = IVAS_ERR_UNKNOWN; + ISAR_SPLIT_REND_BITS_DATA splitRendBits; + uint8_t splitRendBitsBuf[ISAR_MAX_SPLIT_REND_BITS_BUFFER_SIZE_IN_BYTES]; /* Any handles that require cleanup must be declared here and initialized to NULL */ IVAS_DEC_HANDLE hIvasDec = NULL; @@ -160,12 +210,21 @@ int main( RenderConfigReader *renderConfigReader = NULL; int16_t *pcmBuf = NULL; IVAS_RENDER_FRAMESIZE asked_frame_size; - + IVAS_DEC_HRTF_BINARY_WRAPPER hHrtfBinary; + ObjectEditFileReader *objectEditFileReader = NULL; + IVAS_ROOM_ACOUSTICS_CONFIG_DATA **pAE = NULL; + uint32_t aeCount = 0; + IVAS_RENDER_CONFIG_DATA renderConfig = { 0 }; #ifdef WMOPS reset_wmops(); reset_mem( USE_BYTES ); #endif + hHrtfBinary.hHrtfTD = NULL; /* just to avoid compilation warning */ + hHrtfBinary.hHrtfStatistics = NULL; /* just to avoid compilation warning */ + + splitRendBits.bits_buf = splitRendBitsBuf; + /*------------------------------------------------------------------------------------------* * Parse command-line arguments *------------------------------------------------------------------------------------------*/ @@ -212,6 +271,16 @@ int main( } } + if ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) + { + fprintf( stdout, "Output metadata file: %s\n", arg.outputWavFilename ); + } + else if ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + { + fprintf( stdout, "Output synthesis file: %s\n", arg.outputWavFilename ); + fprintf( stdout, "Output metadata file: %s\n", arg.outputMdFilename ); + } + else { fprintf( stdout, "Output synthesis file: %s\n", arg.outputWavFilename ); } @@ -223,7 +292,7 @@ int main( if ( arg.hrtfReaderEnabled ) { /* sanity check */ - if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { arg.hrtfReaderEnabled = false; fprintf( stderr, "\nError: HRTF binary file cannot be used in this output configuration.\n\n" ); @@ -245,7 +314,7 @@ int main( if ( arg.enableHeadRotation ) { /* sanity check */ - if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { fprintf( stderr, "\nError: Head-rotation file file cannot be used in this output configuration.\n\n" ); goto cleanup; @@ -272,7 +341,7 @@ int main( } /* sanity check */ - if ( arg.orientation_tracking != ORIENT_TRK_REF ) + if ( arg.orientation_tracking != IVAS_HEAD_ORIENT_TRK_REF ) { fprintf( stderr, "\nError: Reference rotation file can be used in '-otr ref' mode only.\n\n" ); goto cleanup; @@ -299,7 +368,7 @@ int main( } /* sanity check */ - if ( arg.orientation_tracking != ORIENT_TRK_REF_VEC && arg.orientation_tracking != ORIENT_TRK_REF_VEC_LEV ) + if ( arg.orientation_tracking != IVAS_HEAD_ORIENT_TRK_REF_VEC && arg.orientation_tracking != IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV ) { fprintf( stderr, "\nError: Reference trajectory file can be used in '-otr ref_vec' or '-otr ref_vec_lev' mode only.\n\n" ); goto cleanup; @@ -339,21 +408,14 @@ int main( } /*------------------------------------------------------------------------------------------* - * Open renderer configuration reader file + * Open object editing instruction file *------------------------------------------------------------------------------------------*/ - if ( arg.renderConfigEnabled ) + if ( arg.objEditFileName != NULL ) { - /* sanity check */ - if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) - { - fprintf( stderr, "\nError: Renderer configuration file cannot be used in this output configuration.\n\n" ); - goto cleanup; - } - - if ( ( error = RenderConfigReader_open( arg.renderConfigFilename, &renderConfigReader ) ) != IVAS_ERR_OK ) + if ( ( error = ObjectEditFileReader_open( arg.objEditFileName, &objectEditFileReader ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nError: Can't open Renderer configuration file %s \n\n", arg.renderConfigFilename ); + fprintf( stderr, "\nError: Can't open Object editing instruction file %s \n\n", arg.objEditFileName ); goto cleanup; } } @@ -363,13 +425,18 @@ int main( *------------------------------------------------------------------------------------------*/ asked_frame_size = arg.renderFramesize; - if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputConfig, arg.tsmEnabled, arg.renderFramesize, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.enableExternalOrientation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain_fx, - arg.Opt_dpid_on, arg.acousticEnvironmentId, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) + uint16_t aeID = arg.aeSequence.count > 0 ? arg.aeSequence.pID[0] : IVAS_DEFAULT_AEID; + arg.enableHeadRotation = arg.enableHeadRotation || arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM; + + if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputConfig, arg.renderFramesize, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, + arg.enableHeadRotation, arg.enableExternalOrientation, arg.orientation_tracking, arg.renderConfigEnabled, arg.roomSize, arg.non_diegetic_pan_enabled, + arg.non_diegetic_pan_gain_fx, arg.dpidEnabled, aeID, arg.objEditEnabled, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } + if ( ( error = IVAS_DEC_GetRenderFramesize( hIvasDec, &arg.renderFramesize ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -385,6 +452,21 @@ int main( * Configure Split rendering *------------------------------------------------------------------------------------------*/ + asked_frame_size = arg.renderFramesize; + if ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + { + if ( ( error = IVAS_DEC_EnableSplitRendering( hIvasDec ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nSplit rendering configure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_GetRenderFramesize( hIvasDec, &arg.renderFramesize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } /*------------------------------------------------------------------------------------------* * Configure VoIP mode @@ -399,7 +481,15 @@ int main( } } - IVAS_DEC_PrintConfig( hIvasDec, 1, arg.voipMode ); + /*-----------------------------------------------------------------* + * Print config information + *-----------------------------------------------------------------*/ + + if ( ( error = IVAS_DEC_PrintConfig( hIvasDec, 1, arg.voipMode ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_PrintConfig failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } /*-------------------------------------------------------------------* * Load renderer configuration from file @@ -407,12 +497,13 @@ int main( if ( arg.renderConfigEnabled ) { - IVAS_RENDER_CONFIG_DATA renderConfig; /* sanity check */ - if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && + arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM && + arg.non_diegetic_pan_enabled == false ) { - fprintf( stderr, "\nExternal Renderer Config is supported only for binaural output configurations. Exiting. \n\n" ); + fprintf( stderr, "\nExternal Renderer Config is supported only when binaural output configurations is used as output OR when Split rendering mode is enabled. Exiting. \n" ); goto cleanup; } @@ -422,6 +513,11 @@ int main( goto cleanup; } + if ( ( error = RenderConfigReader_open( arg.renderConfigFilename, &renderConfigReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open Renderer configuration file %s \n\n", arg.renderConfigFilename ); + goto cleanup; + } if ( RenderConfigReader_read( renderConfigReader, arg.renderConfigFilename, &renderConfig ) != IVAS_ERR_OK ) { @@ -429,21 +525,84 @@ int main( goto cleanup; } - if ( ( error = RenderConfigReader_getDirectivity( renderConfigReader, arg.directivityPatternId, renderConfig.directivity ) ) != IVAS_ERR_OK ) + aeCount = RenderConfigReader_getAcousticEnvironmentCount( renderConfigReader ); + if ( aeCount > 0 ) + { + uint32_t n; + + pAE = malloc( aeCount * sizeof( IVAS_ROOM_ACOUSTICS_CONFIG_DATA * ) ); + + if ( pAE == NULL ) + { + fprintf( stderr, "\nError: cannot allocate memory for acoustic environment array\n\n" ); + goto cleanup; + } + + for ( n = 0; n < aeCount; n++ ) + { + pAE[n] = NULL; + + if ( NULL == ( pAE[n] = malloc( sizeof( IVAS_ROOM_ACOUSTICS_CONFIG_DATA ) ) ) ) + { + fprintf( stderr, "\nError: cannot allocate memory for acoustic environment\n\n" ); + goto cleanup; + } + } + + if ( ( error = RenderConfigReader_getAcousticEnvironments( renderConfigReader, pAE ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error while getting acoustic environments\n\n" ); + goto cleanup; + } + + for ( n = 0; n < aeCount; n++ ) + { + if ( ( error = IVAS_DEC_AddAcousticEnvironment( hIvasDec, *pAE[n] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Failed to add acoustic environments\n\n" ); + goto cleanup; + } + } + } + if ( ( error = RenderConfigReader_getDirectivity( renderConfigReader, arg.directivityPatternId, renderConfig.directivity_fx ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Failed to get directivity patterns for one or more of IDs: %d %d %d %d\n\n", arg.directivityPatternId[0], arg.directivityPatternId[1], arg.directivityPatternId[2], arg.directivityPatternId[3] ); goto cleanup; } - FOR( Word16 i = 0; i < 4; i++ ) + if ( ( error = RenderConfigReader_getDistanceAttenuation( renderConfigReader, renderConfig.distAtt_fx ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Failed to get Distance Attenuation \n\n" ); + goto cleanup; + } + + if ( ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - renderConfig.directivity_fx[i * 3] = (Word16) ( renderConfig.directivity[i * 3] * ( 1u << 6 ) ); - renderConfig.directivity_fx[i * 3 + 1] = (Word16) ( renderConfig.directivity[i * 3 + 1] * ( 1u << 6 ) ); - renderConfig.directivity_fx[i * 3 + 2] = (Word16) ( renderConfig.directivity[i * 3 + 2] * ( ( 1u << 15 ) - 1 ) ); + if ( asked_frame_size != IVAS_RENDER_FRAMESIZE_20MS && + ( renderConfig.split_rend_config.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE || + renderConfig.split_rend_config.dof == 0 ) ) + { + arg.renderFramesize = asked_frame_size; + } + else + { + arg.renderFramesize = IVAS_RENDER_FRAMESIZE_20MS; + } + + if ( ( error = IVAS_DEC_SetRenderFramesize( hIvasDec, arg.renderFramesize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_SetRenderFramesize failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( arg.renderFramesize != asked_frame_size ) + { + fprintf( stderr, "\nChanged render framesize, only 20ms are allowed for non-0dof split rendering!\n" ); + } } if ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { - if ( ( error = RenderConfigReader_getAcousticEnvironment( renderConfigReader, arg.acousticEnvironmentId, &renderConfig.roomAcoustics ) ) == IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_GetAcousticEnvironment( hIvasDec, aeID, &renderConfig.roomAcoustics ) ) == IVAS_ERR_OK ) { if ( RenderConfigReader_checkValues( &renderConfig ) != IVAS_ERR_OK ) { @@ -453,12 +612,15 @@ int main( } else { - fprintf( stderr, "Failed to get acoustic environment with ID: %d\n\n", arg.acousticEnvironmentId ); + fprintf( stderr, "Failed to get acoustic environment with ID: %d\n\n", aeID ); goto cleanup; } - renderConfig.roomAcoustics.override = true; } + /* ISAR frame size is set from command line, not renderer config file. + * This will be ignored if output format is not split rendering. */ + renderConfig.split_rend_config.isar_frame_size_ms = (int16_t) arg.renderFramesize /* given in number of 5ms subframes */ * 5; + if ( ( error = IVAS_DEC_FeedRenderConfig( hIvasDec, renderConfig ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_FeedRenderConfig failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -480,7 +642,7 @@ int main( fprintf( stderr, "\nError in reading Custom loudspeaker file %s: %s\n\n", arg.customLsSetupFilename, CustomLoudspeakerLayout_getError( lsCustomError ) ); goto cleanup; } - for ( int i = 0; i < IVAS_MAX_OUTPUT_CHANNELS; i++ ) + for ( int16_t i = 0; i < IVAS_MAX_LS_CHANNELS; i++ ) { hLsCustomData.azimuth_fx[i] = (Word32) ( hLsCustomData.azimuth[i] * ( 1u << 22 ) ); hLsCustomData.elevation_fx[i] = (Word32) ( hLsCustomData.elevation[i] * ( 1u << 22 ) ); @@ -493,63 +655,16 @@ int main( } /*------------------------------------------------------------------------------------------* - * Load HRTF binary file data + * Initialize HRTF binary file data *------------------------------------------------------------------------------------------*/ if ( arg.hrtfReaderEnabled ) { - IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; - - if ( ( error = IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nIVAS_DEC_GetHrtfHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } - - if ( ( error = load_HRTF_binary( hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); - goto cleanup; - } - - IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; - if ( ( error = IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nIVAS_DEC_GetHrtfCRendHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } - - if ( ( error = create_SetOfHRTF_from_binary( hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s for CRend \n\n", arg.hrtfFileName ); - goto cleanup; - } - - IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv = NULL; - if ( ( error = IVAS_DEC_GetHrtfFastConvHandle( hIvasDec, &hHrtfFastConv ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nIVAS_DEC_GetHrtfFastConvHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } - - if ( ( error = load_fastconv_HRTF_from_binary( hHrtfFastConv, hrtfReader ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s for FastConv \n\n", arg.hrtfFileName ); - goto cleanup; - } - - IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin = NULL; - if ( ( error = IVAS_DEC_GetHrtfParamBinHandle( hIvasDec, &hHrtfParambin ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nIVAS_DEC_GetHrtfParamBinHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } - - if ( ( error = load_parambin_HRTF_from_binary( hHrtfParambin, hrtfReader ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s for parametric binauralizer \n\n", arg.hrtfFileName ); - goto cleanup; - } + hHrtfBinary.hrtfReader = hrtfReader; + hHrtfBinary.hrtfFileName = arg.hrtfFileName; + hHrtfBinary.binaural_renderer = IVAS_BIN_RENDERER_TYPE_NONE; + hHrtfBinary.binaural_renderer_sec = IVAS_BIN_RENDERER_TYPE_NONE; + hHrtfBinary.hrtf_set_audio_cfg = IVAS_AUDIO_CONFIG_INVALID; } /*------------------------------------------------------------------------------------------* @@ -564,17 +679,27 @@ int main( } pcmBuf = malloc( pcmBufSize * sizeof( int16_t ) ); + if ( pcmBuf == NULL ) + { + fprintf( stdout, "Error: Unable to allocate memory for output buffer.\n" ); + goto cleanup; + } /*-----------------------------------------------------------------* * Decoding *-----------------------------------------------------------------*/ + if ( arg.voipMode ) { - error = decodeVoIP( arg, hBsReader, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, hIvasDec ); + error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, + &splitRendBits, + &renderConfig, + &hIvasDec, + pcmBuf ); } else { - error = decodeG192( arg, hBsReader, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf ); + error = decodeG192( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, &splitRendBits, hIvasDec, pcmBuf ); } if ( error == IVAS_ERR_OK || error == IVAS_ERR_END_OF_FILE ) @@ -590,7 +715,7 @@ int main( } else { - fprintf( stdout, "Decoding finished prematurely\n\n" ); + fprintf( stderr, "\nDecoding finished prematurely: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } @@ -605,16 +730,37 @@ cleanup: free( pcmBuf ); - if ( arg.hrtfReaderEnabled ) + if ( pAE != NULL ) + { + uint16_t n; + + for ( n = 0; n < aeCount; n++ ) + { + free( pAE[n] ); + } + + free( pAE ); + } + + if ( arg.aeSequence.count > 0 ) { - IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; - IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ); - dealloc_HRTF_binary( hHrtfTD ); - IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; - IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ); - destroy_SetOfHRTF( hSetOfHRTF ); + free( arg.aeSequence.pID ); + free( arg.aeSequence.pValidity ); } + if ( arg.hrtfReaderEnabled ) + { + destroy_td_hrtf( hHrtfBinary.hHrtfTD ); + destroy_hrtf_statistics( hHrtfBinary.hHrtfStatistics ); + } +#ifdef FIX_1990_SANITIZER_IN_REVERB_LOAD + // TODO: + /* This free differs from float version. + This is needed as HRTF statistics from ROM are currently converted from Word16 values to scaled Word32 values. */ + IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics = NULL; + IVAS_DEC_GetHrtfStatisticsHandle( hIvasDec, &hHrtfStatistics ); + destroy_hrtf_statistics( hHrtfStatistics ); +#endif IVAS_DEC_Close( &hIvasDec ); CustomLsReader_close( &hLsCustomReader ); hrtfFileReader_close( &hrtfReader ); @@ -623,6 +769,7 @@ cleanup: RotationFileReader_close( &refRotReader ); Vector3PairFileReader_close( &referenceVectorReader ); RenderConfigReader_close( &renderConfigReader ); + ObjectEditFileReader_close( &objectEditFileReader ); if ( BS_Reader_Close( &hBsReader ) != IVAS_ERR_OK ) { @@ -708,6 +855,14 @@ static IVAS_AUDIO_CONFIG cmdline2config( { output_config = IVAS_AUDIO_CONFIG_BINAURAL; } + else if ( strcmp( argv_to_upper, "BINAURAL_SPLIT_CODED" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED; + } + else if ( strcmp( argv_to_upper, "BINAURAL_SPLIT_PCM" ) == 0 ) + { + output_config = IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM; + } else if ( strcmp( argv_to_upper, "BINAURAL_ROOM_IR" ) == 0 ) { output_config = IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR; @@ -739,9 +894,14 @@ static bool parseCmdlIVAS_dec( int16_t i; char argv_to_upper[FILENAME_MAX]; - arg->output_Fs = 48000; + /*-----------------------------------------------------------------* + * Set default values + *-----------------------------------------------------------------*/ + + arg->output_Fs = IVAS_MAX_SAMPLING_RATE; arg->outputConfig = IVAS_AUDIO_CONFIG_MONO; arg->decMode = IVAS_DEC_MODE_IVAS; + arg->evsMode = false; arg->quietModeEnabled = false; arg->delayCompensationEnabled = true; arg->voipMode = false; @@ -749,13 +909,16 @@ static bool parseCmdlIVAS_dec( arg->enableHeadRotation = false; arg->headrotTrajFileName = NULL; - arg->orientation_tracking = ORIENT_TRK_NONE; + arg->orientation_tracking = IVAS_HEAD_ORIENT_TRK_NONE; arg->enableReferenceRotation = false; arg->headrotTrajFileName = NULL; arg->enableReferenceVectorTracking = false; arg->referenceVectorTrajFileName = NULL; arg->enableExternalOrientation = false; arg->externalOrientationTrajFileName = NULL; + arg->applyPiData = false; + arg->piOutputFilename = NULL; + arg->rtpOutSR = false; #ifdef SUPPORT_JBM_TRACEFILE arg->jbmTraceFilename = NULL; @@ -773,19 +936,28 @@ static bool parseCmdlIVAS_dec( arg->renderConfigEnabled = false; arg->renderConfigFilename = NULL; - arg->Opt_dpid_on = 0; + arg->dpidEnabled = false; + arg->outputMdFilename = NULL; arg->inputFormat = IVAS_DEC_INPUT_FORMAT_G192; - arg->Opt_non_diegetic_pan = 0; + arg->non_diegetic_pan_enabled = false; arg->non_diegetic_pan_gain = 0.f; arg->tsmEnabled = false; arg->renderFramesize = IVAS_RENDER_FRAMESIZE_20MS; - arg->acousticEnvironmentId = 65535; + arg->aeSequence.count = 0; + arg->aeSequence.pID = NULL; + arg->aeSequence.pValidity = NULL; + arg->aeSequence.selected = 0; + arg->aeSequence.frameCounter = 0; for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i ) { arg->directivityPatternId[i] = 65535; } + arg->objEditEnabled = false; + arg->objEditFileName = NULL; + + arg->roomSize = IVAS_ROOM_SIZE_AUTO; /*-----------------------------------------------------------------* * Initialization @@ -812,21 +984,43 @@ static bool parseCmdlIVAS_dec( if ( strcmp( argv_to_upper, "-VOIP" ) == 0 ) { - arg->voipMode = 1; + arg->voipMode = true; i++; } else if ( strcmp( argv_to_upper, "-VOIP_HF_ONLY=0" ) == 0 ) { - arg->voipMode = 1; + arg->voipMode = true; arg->inputFormat = IVAS_DEC_INPUT_FORMAT_RTPDUMP; i++; } else if ( strcmp( argv_to_upper, "-VOIP_HF_ONLY=1" ) == 0 ) { - arg->voipMode = 1; + arg->voipMode = true; arg->inputFormat = IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF; i++; } + else if ( strcmp( argv_to_upper, "-PIDATAFILE" ) == 0 ) + { + i++; + if ( argc - i <= 3 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: PI Data Output file name not specified!\n\n" ); + usage_dec(); + return false; + } + + arg->piOutputFilename = argv[i++]; + } + else if ( strcmp( argv_to_upper, "-APPLYPIDATA" ) == 0 ) + { + arg->applyPiData = true; + i++; + } + else if ( strcmp( argv_to_upper, "-RTPOUTSR" ) == 0 ) + { + arg->rtpOutSR = true; + i++; + } #ifdef SUPPORT_JBM_TRACEFILE else if ( strcmp( argv_to_upper, "-TRACEFILE" ) == 0 ) { @@ -904,6 +1098,9 @@ static bool parseCmdlIVAS_dec( { if ( !is_digits_only( argv[i] ) ) { + fprintf( stderr, "Error: Render frame size is invalid or not specified!\n\n" ); + usage_dec(); + return false; } @@ -938,23 +1135,23 @@ static bool parseCmdlIVAS_dec( if ( strcmp( argv_to_upper, "NONE" ) == 0 ) { - arg->orientation_tracking = ORIENT_TRK_NONE; + arg->orientation_tracking = IVAS_HEAD_ORIENT_TRK_NONE; } else if ( strcmp( argv_to_upper, "REF" ) == 0 ) { - arg->orientation_tracking = ORIENT_TRK_REF; + arg->orientation_tracking = IVAS_HEAD_ORIENT_TRK_REF; } else if ( strcmp( argv_to_upper, "AVG" ) == 0 ) { - arg->orientation_tracking = ORIENT_TRK_AVG; + arg->orientation_tracking = IVAS_HEAD_ORIENT_TRK_AVG; } else if ( strcmp( argv_to_upper, "REF_VEC" ) == 0 ) { - arg->orientation_tracking = ORIENT_TRK_REF_VEC; + arg->orientation_tracking = IVAS_HEAD_ORIENT_TRK_REF_VEC; } else if ( strcmp( argv_to_upper, "REF_VEC_LEV" ) == 0 ) { - arg->orientation_tracking = ORIENT_TRK_REF_VEC_LEV; + arg->orientation_tracking = IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV; } else { @@ -1022,10 +1219,21 @@ static bool parseCmdlIVAS_dec( } i += 2; } + else if ( strcmp( argv_to_upper, "-OM" ) == 0 ) + { + arg->outputMdFilename = argv[i + 1]; + if ( arg->outputMdFilename[0] == '\0' ) + { + fprintf( stderr, "Error: Split rendering output metadata file path not specified\n\n" ); + usage_dec(); + return false; + } + i += 2; + } else if ( strcmp( argv_to_upper, "-NON_DIEGETIC_PAN" ) == 0 ) { i++; - arg->Opt_non_diegetic_pan = 1; + arg->non_diegetic_pan_enabled = true; strncpy( argv_to_upper, argv[i], sizeof( argv_to_upper ) - 1 ); argv_to_upper[sizeof( argv_to_upper ) - 1] = '\0'; to_upper( argv_to_upper ); @@ -1092,17 +1300,42 @@ static bool parseCmdlIVAS_dec( if ( !is_digits_only( argv[i] ) ) { - fprintf( stdout, "Error: Invalid acoustic environment ID specified: %s\n\n", argv[i] ); - usage_dec(); - return false; + aeidFileReader *aeidReader = NULL; + if ( aeidFileReader_open( argv[i], &aeidReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open aeid file %s \n", argv[i] ); + usage_dec(); + return false; + } + if ( aeidFileReading( aeidReader, &arg->aeSequence.count, &arg->aeSequence.pID, &arg->aeSequence.pValidity ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError while reading aeid from %s\n", argv[i] ); + usage_dec(); + return false; + } + aeidFileReader_close( &aeidReader ); + i++; + } + else + { + /* A single acoustic environment */ + if ( NULL == ( arg->aeSequence.pID = malloc( sizeof( uint16_t ) ) ) || + NULL == ( arg->aeSequence.pValidity = malloc( sizeof( uint16_t ) ) ) ) + { + fprintf( stdout, "Error: Unable to allocate memory for acoustic environment sequence: %s\n\n", argv[i] ); + usage_dec(); + return false; + } + arg->aeSequence.count = 1; + arg->aeSequence.pID[0] = (int16_t) atoi( argv[i++] ); + arg->aeSequence.pValidity[0] = 0; } - arg->acousticEnvironmentId = (int16_t) atoi( argv[i++] ); } else if ( strcmp( argv_to_upper, "-DPID" ) == 0 ) { int16_t id, tmp; - arg->Opt_dpid_on = 1; + arg->dpidEnabled = true; ++i; tmp = 0; while ( is_number( argv[i + tmp] ) && tmp < IVAS_MAX_NUM_OBJECTS ) @@ -1139,6 +1372,70 @@ static bool parseCmdlIVAS_dec( i += tmp; } + else if ( strcmp( argv_to_upper, "-OBJ_EDIT" ) == 0 ) + { + arg->objEditEnabled = true; + i++; + if ( argc - i <= 3 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: Object editing instruction filename not specified!\n\n" ); + usage_dec(); + return false; + } + + if ( strcmp( argv[i], "NULL" ) == 0 || strcmp( argv[i], "null" ) == 0 ) + { + arg->objEditFileName = NULL; /* use the built-in editing function */ + } + else + { + arg->objEditFileName = argv[i]; /* read edit instructions from this file */ + } + i++; + } + else if ( strcmp( argv_to_upper, "-EVS" ) == 0 ) + { + arg->evsMode = true; + arg->decMode = IVAS_DEC_MODE_EVS; + i++; + } + else if ( strcmp( argv_to_upper, "-ROOM_SIZE" ) == 0 ) + { + i++; + if ( argc - i <= 3 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: Room size selector not specified!\n\n" ); + usage_dec(); + return false; + } + + if ( strlen( argv[i] ) != 1 ) + { + fprintf( stderr, "Error: Unsupported room size selector %s!\n\n", argv[i] ); + usage_dec(); + return false; + } + switch ( argv[i][0] ) + { + case 'S': + case 's': + arg->roomSize = IVAS_ROOM_SIZE_SMALL; + break; + case 'M': + case 'm': + arg->roomSize = IVAS_ROOM_SIZE_MEDIUM; + break; + case 'L': + case 'l': + arg->roomSize = IVAS_ROOM_SIZE_LARGE; + break; + default: + fprintf( stderr, "Error: Unsupported room size selector %s!\n\n", argv[i] ); + usage_dec(); + return false; + } + i++; + } /*-----------------------------------------------------------------* * Option not recognized @@ -1157,7 +1454,23 @@ static bool parseCmdlIVAS_dec( * Mandatory input arguments *-----------------------------------------------------------------*/ - if ( i < argc - 3 ) + if ( i < argc - 4 ) + { + for ( i = 1; i < argc; i++ ) + { + if ( argv[i][0] == '-' ) + { + fprintf( stderr, "Error: Wrong order of command-line arguments (optional arguments are first)\n\n" ); + usage_dec(); + return false; + } + } + + fprintf( stderr, "Error: Too many mandatory command-line arguments\n\n" ); + usage_dec(); + return false; + } + else if ( i < argc - 3 ) { arg->outputConfig = cmdline2config( argv[i] ); if ( arg->outputConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) @@ -1166,18 +1479,33 @@ static bool parseCmdlIVAS_dec( arg->customLsSetupFilename = argv[i]; } i++; - if ( ( arg->Opt_non_diegetic_pan ) && ( arg->outputConfig != IVAS_AUDIO_CONFIG_STEREO ) ) + + if ( arg->non_diegetic_pan_enabled && arg->outputConfig != IVAS_AUDIO_CONFIG_STEREO ) { fprintf( stderr, "Error: non-diegetic panning is supported in stereo only\n\n" ); usage_dec(); return false; } - } - else + else if ( arg->non_diegetic_pan_enabled && arg->outputConfig == IVAS_AUDIO_CONFIG_STEREO && arg->evsMode ) + { + fprintf( stderr, "Error: Both non-diegetic panning and stereo output specified!\n\n" ); + usage_dec(); + return false; + } + + if ( arg->outputMdFilename != NULL && arg->outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + { + fprintf( stderr, "Error: Output split rendering metadata file is supported for BINAURAL_SPLIT_PCM output config. only\n\n" ); + usage_dec(); + return false; + } + } + else { arg->outputConfig = IVAS_AUDIO_CONFIG_MONO; arg->decMode = IVAS_DEC_MODE_EVS; - if ( ( arg->Opt_non_diegetic_pan ) ) + + if ( arg->non_diegetic_pan_enabled ) { arg->outputConfig = IVAS_AUDIO_CONFIG_STEREO; } @@ -1231,6 +1559,18 @@ static bool parseCmdlIVAS_dec( return false; } +#ifdef SUPPORT_JBM_TRACEFILE + /* Validate options that depend on other options */ + if ( arg->jbmTraceFilename != NULL && arg->delayCompensationEnabled + /* This decMode check should be removed once timestamp sync issues between JBM trace and audio are fixed in EVS */ + && arg->decMode != IVAS_DEC_MODE_EVS ) + { + fprintf( stderr, "Error: Writing to a JBM trace file requires delay compensation to be disabled with -no_delay_cmp\n\n" ); + usage_dec(); + return false; + } +#endif + return true; } @@ -1244,12 +1584,13 @@ static bool parseCmdlIVAS_dec( static void usage_dec( void ) { fprintf( stdout, "Usage for EVS: IVAS_dec.exe [Options] Fs bitstream_file output_file\n" ); + fprintf( stdout, " OR usage for IVAS (below) with -evs option and OutputConf\n" ); fprintf( stdout, "Usage for IVAS: IVAS_dec.exe [Options] OutputConf Fs bitstream_file output_file\n\n" ); fprintf( stdout, "Mandatory parameters:\n" ); fprintf( stdout, "---------------------\n" ); fprintf( stdout, "OutputConf : Output configuration: MONO, STEREO, 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4, FOA,\n" ); - fprintf( stdout, " HOA2, HOA3, BINAURAL, BINAURAL_ROOM_IR, BINAURAL_ROOM_REVERB, EXT\n" ); + fprintf( stdout, " HOA2, HOA3, BINAURAL, BINAURAL_ROOM_IR, BINAURAL_ROOM_REVERB, BINAURAL_SPLIT_CODED, BINAURAL_SPLIT_PCM, EXT\n" ); fprintf( stdout, " By default, channel order and loudspeaker positions are equal to the\n" ); fprintf( stdout, " encoder. For loudspeaker outputs, OutputConf can be a custom loudspeaker\n" ); fprintf( stdout, " layout file. See readme.txt for details.\n" ); @@ -1260,14 +1601,20 @@ static void usage_dec( void ) fprintf( stdout, "Options:\n" ); fprintf( stdout, "--------\n" ); + fprintf( stdout, "-evs : Specify that the supplied bitstream is an EVS bitstream\n" ); fprintf( stdout, "-VOIP : VoIP mode: RTP in G192\n" ); fprintf( stdout, "-VOIP_hf_only=0 : VoIP mode: EVS RTP Payload Format hf_only=0 in rtpdump\n" ); - fprintf( stdout, "-VOIP_hf_only=1 : VoIP mode: EVS RTP Payload Format hf_only=1 in rtpdump\n" ); + fprintf( stdout, "-VOIP_hf_only=1 : VoIP mode: EVS or IVAS RTP Payload Format hf_only=1 in rtpdump\n" ); fprintf( stdout, " The decoder may read rtpdump files containing TS26.445 Annex A.2.2\n" ); - fprintf( stdout, " EVS RTP Payload Format. The SDP parameter hf_only is required.\n" ); + fprintf( stdout, " EVS RTP Payload Format or rtpdump files containing TS26.253 Annex A\n" ); + fprintf( stdout, " IVAS RTP Payload Format. The SDP parameter hf_only is required.\n" ); fprintf( stdout, " Reading RFC4867 AMR/AMR-WB RTP payload format is not supported.\n" ); + fprintf( stdout, "-PiDataFile PF Log the timestampped PI data.\n" ); + fprintf( stdout, "-ApplyPiData Apply the PI data found in the rtp packet.\n" ); + fprintf( stdout, "-rtpOutSR : Split Rendering bitstream RTPDump output \n" ); #ifdef SUPPORT_JBM_TRACEFILE - fprintf( stdout, "-Tracefile TF : VoIP mode: Generate trace file named TF\n" ); + fprintf( stdout, "-Tracefile TF : VoIP mode: Generate trace file named TF. Requires -no_delay_cmp to\n" ); + fprintf( stdout, " be enabled so that trace contents remain in sync with audio output.\n" ); #endif fprintf( stdout, "-fr L : render frame size in ms L=(5,10,20), default is 20)\n" ); fprintf( stdout, "-fec_cfg_file : Optimal channel aware configuration computed by the JBM \n" ); @@ -1289,7 +1636,10 @@ static void usage_dec( void ) fprintf( stdout, "-rvf File : Reference vector specified by external trajectory File\n" ); fprintf( stdout, " works only in combination with '-otr ref_vec' and 'ref_vec_lev' modes\n" ); fprintf( stdout, "-render_config File : Renderer configuration File\n" ); - fprintf( stdout, "-non_diegetic_pan P : panning mono non-diegetic sound to stereo with paning P, -90<= P <=90,\n" ); + fprintf( stdout, "-room_size (S|M|L) : Selects default reverb based on a room size (S - small | M - medium | L - large)\n" ); + fprintf( stdout, " for BINAURAL_ROOM_REVERB output configuration,\n" ); + fprintf( stdout, "-om File : Metadata output File for BINAURAL_SPLIT_PCM OutputConf (only for Fs = 48 kHz)\n" ); + fprintf( stdout, "-non_diegetic_pan P : panning mono non-diegetic sound to stereo with panning P, -90<= P <=90,\n" ); fprintf( stdout, " left or l or 90->left, right or r or -90->right, center or c or 0->middle\n" ); fprintf( stdout, "-exof File : External orientation File for external orientation trajectory\n" ); fprintf( stdout, "-dpid ID : Directivity pattern ID(s) = [ID1, ID2, ID3, ID4]. Space-separated list of up\n" ); @@ -1297,7 +1647,10 @@ static void usage_dec( void ) fprintf( stdout, " output configuration. ID1, ID2, ID3, ID4 specify the directivity pattern IDs used for\n" ); fprintf( stdout, " ISMs 1,2,3 and 4 respectively. This options needs to be accompanied by a render_config file,\n" ); fprintf( stdout, " otherwise a default directivity pattern is used.\n" ); - fprintf( stdout, "-aeid ID : Acoustic environment ID (number >= 0) for BINAURAL_ROOM_REVERB output configuration\n" ); + fprintf( stdout, "-aeid ID | File : Acoustic environment ID (number > 0)\n" ); + fprintf( stdout, " alternatively, it can be a text file where each line contains \"ID duration\"\n" ); + fprintf( stdout, " for BINAURAL_ROOM_REVERB output configuration.\n" ); + fprintf( stdout, "-obj_edit File : Object editing instructions file or NULL for built-in example\n" ); fprintf( stdout, "-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. \n" ); fprintf( stdout, " Currently, all values default to level 3 (full functionality).\n" ); fprintf( stdout, "-q : Quiet mode, no frame counter\n" ); @@ -1318,7 +1671,8 @@ static ivas_error initOnFirstGoodFrame( IVAS_DEC_HANDLE hIvasDec, /* i/o: */ const DecArguments arg, /* i : */ const int16_t numInitialBadFrames, /* i : */ - const uint16_t numOutSamples, /* i : */ + int16_t *numOutSamples, /* i/o: */ + int16_t *vec_pos_len, /* i/o: */ int16_t *pFullDelayNumSamples, /* o : */ int16_t *pRemainingDelayNumSamples, /* o : */ int32_t *delayTimeScale, /* o : */ @@ -1327,9 +1681,11 @@ static ivas_error initOnFirstGoodFrame( MasaFileWriter **ppMasaWriter, /* o : */ IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS], /* o : */ int16_t *pNumOutChannels, /* o : */ - uint16_t *pNumObj /* o : */ -) + uint16_t *pNumObj, /* o : */ + IVAS_RTP *srRtp, /* o : */ + SplitFileReadWrite **splitRendWriter ) { + int16_t isSplitRend, isSplitCoded; ivas_error error = IVAS_ERR_UNKNOWN; /* Now delay, number of output channels and frame size are known */ @@ -1339,6 +1695,22 @@ static ivas_error initOnFirstGoodFrame( return error; } + if ( ( error = IVAS_DEC_is_split_rendering_enabled( hIvasDec, &isSplitRend ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_is_split_rendering_enabled, code: %d\n", error ); + return error; + } + + if ( ( error = IVAS_DEC_is_split_rendering_coded_out( hIvasDec, &isSplitCoded ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_is_split_rendering_coded_out, code: %d\n", error ); + return error; + } + + if ( isSplitRend ) + { + pFullDelayNumSamples[0] = 0; + } if ( !arg.delayCompensationEnabled ) { @@ -1352,43 +1724,153 @@ static ivas_error initOnFirstGoodFrame( return error; } - int32_t pcmFrameSize; - - if ( ( error = IVAS_DEC_GetPcmFrameSize( hIvasDec, &pcmFrameSize ) ) != IVAS_ERR_OK ) + if ( isSplitRend ) { - fprintf( stderr, "\nError in IVAS_DEC_GetPcmFrameSize, error code: %d\n", error ); - return error; - } + /* Open split rendering metadata writer */ + int16_t delayNumSamples_temp[3]; + int32_t delayTimeScale_temp; + ISAR_SPLIT_REND_CODEC splitRendCodec; + int16_t splitRendCodecFrameSizeMs; + ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection; + int16_t splitRendIsarFrameSizeMs; + int16_t lc3plusHighRes; - /* Open audio writer and write all previously skipped bad frames now that frame size is known */ - if ( ( error = AudioFileWriter_open( ppAfWriter, arg.outputWavFilename, arg.output_Fs, *pNumOutChannels ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nUnable to open output file %s\n", arg.outputWavFilename ); - return error; - } + /* Ideally ssrc is negotiated via SDP and sequence number is radomized but we + use fixed seed for random num generator for regression based tests. Any realtime + application should implement this initialization seperately */ + uint16_t rtpDecSeed = RANDOM_INITSEED_DEC; + uint32_t ssrc = ( (uint32_t) IVAS_RTP_OwnRandom( &rtpDecSeed ) & 0x0000FFFF ) | ( (uint32_t) IVAS_RTP_OwnRandom( &rtpDecSeed ) << 16 ); + uint16_t seqNumInitVal = IVAS_RTP_OwnRandom( &rtpDecSeed ); + + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, delayNumSamples_temp, &delayTimeScale_temp ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + return error; + } + + if ( ( error = IVAS_DEC_GetSplitRendBitstreamHeader( hIvasDec, &splitRendCodec, &poseCorrection, &splitRendIsarFrameSizeMs, &splitRendCodecFrameSizeMs, &lc3plusHighRes ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get split renderer bitstream header: %s\n", ivas_error_to_string( error ) ); + return error; + } - int16_t *zeroBuf = malloc( pcmFrameSize * sizeof( int16_t ) ); - memset( zeroBuf, 0, pcmFrameSize * sizeof( int16_t ) ); + /* Split Rendering RTPDump Output file */ + if ( arg.rtpOutSR && srRtp != NULL ) + { + FILE *fParamsSR = NULL; + char srParamsFile[FILENAME_MAX], *ext = ".sr.txt"; + strncpy( srParamsFile, arg.outputWavFilename, FILENAME_MAX - sizeof( ext ) ); + strncat( srParamsFile, ext, sizeof( ext ) + 1 ); + + /* Write the Split Rendering Params passed from SDP to srParamsFile */ + fParamsSR = fopen( srParamsFile, "w" ); + if ( NULL != fParamsSR ) + { + fprintf( fParamsSR, "DOF = %d;\nLC3PLUS_HIGHRES = %d;\n", poseCorrection, lc3plusHighRes ); + fclose( fParamsSR ); + fParamsSR = NULL; + } - for ( int16_t i = 0; i < numInitialBadFrames; ++i ) - { - if ( *pRemainingDelayNumSamples < numOutSamples ) + /* Split Rendering RTPDump Output file */ + if ( ( error = IVAS_RTP_WRITER_Init( srRtp, arg.outputWavFilename, 1000 / ( IVAS_NUM_FRAMES_PER_SEC * splitRendCodecFrameSizeMs ), ssrc, seqNumInitVal ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open SR output bitstream file for RTP output %s \n\n", arg.outputWavFilename ); + return error; + } + } + else if ( isSplitCoded ) { - if ( ( error = AudioFileWriter_write( *ppAfWriter, zeroBuf, numOutSamples * *pNumOutChannels - ( *pRemainingDelayNumSamples * *pNumOutChannels ) ) ) != IVAS_ERR_OK ) + if ( ( error = split_rend_writer_open( splitRendWriter, arg.outputWavFilename, delayNumSamples_temp[0], delayTimeScale_temp, splitRendCodec, poseCorrection, splitRendCodecFrameSizeMs, splitRendIsarFrameSizeMs, arg.output_Fs, lc3plusHighRes ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nOutput audio file writer error\n" ); + fprintf( stderr, "\nUnable to open output split rendering metadata file %s\n", arg.outputWavFilename ); return error; } - *pRemainingDelayNumSamples = 0; } else { - *pRemainingDelayNumSamples -= numOutSamples; + if ( arg.outputMdFilename == NULL ) + { + fprintf( stderr, "\nOutput split rendering metadata file not specified\n" ); + return IVAS_ERR_INVALID_SPLIT_REND_CONFIG; + } + + if ( ( error = split_rend_writer_open( splitRendWriter, arg.outputMdFilename, delayNumSamples_temp[0], delayTimeScale_temp, splitRendCodec, poseCorrection, splitRendCodecFrameSizeMs, splitRendIsarFrameSizeMs, arg.output_Fs, lc3plusHighRes ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to open output split rendering metadata file %s\n", arg.outputWavFilename ); + return error; + } + } + } + + if ( !isSplitCoded ) + { + /* Open audio writer and write all previously skipped bad frames now that frame size is known */ + if ( ( error = AudioFileWriter_open( ppAfWriter, arg.outputWavFilename, arg.output_Fs, *pNumOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to open output file %s\n", arg.outputWavFilename ); + return error; } } - free( zeroBuf ); + if ( !arg.rtpOutSR ) + { + int16_t pcmFrameSize; + if ( ( error = IVAS_DEC_GetOutputBufferSize( hIvasDec, &pcmFrameSize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetOutputBufferSize, error code: %d\n", error ); + return error; + } + + /* Write zeros to the output audio buffer */ + int16_t *zeroBuf = calloc( pcmFrameSize, sizeof( int16_t ) ); + if ( zeroBuf == NULL ) + { + fprintf( stdout, "Error: Unable to allocate memory for output buffer.\n" ); + return IVAS_ERR_FAILED_ALLOC; + } + + for ( int16_t i = 0; i < numInitialBadFrames; ++i ) + { + if ( isSplitRend ) + { + ISAR_SPLIT_REND_BITS_DATA splitRendBitsZero; + splitRendBitsZero.bits_buf = NULL; + splitRendBitsZero.bits_read = 0; + splitRendBitsZero.bits_written = 0; + splitRendBitsZero.buf_len = 0; + splitRendBitsZero.codec = ISAR_SPLIT_REND_CODEC_DEFAULT; + splitRendBitsZero.pose_correction = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE; + splitRendBitsZero.codec_frame_size_ms = 0; + splitRendBitsZero.isar_frame_size_ms = 20; + + if ( split_rend_write_bitstream_to_file( *splitRendWriter, splitRendBitsZero.bits_buf, &splitRendBitsZero.bits_read, &splitRendBitsZero.bits_written ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to write to bitstream file!\n" ); + return error; + } + } + + if ( !isSplitCoded ) + { + if ( *pRemainingDelayNumSamples < *numOutSamples ) + { + if ( ( error = AudioFileWriter_write( *ppAfWriter, zeroBuf, *numOutSamples * *pNumOutChannels - ( *pRemainingDelayNumSamples * *pNumOutChannels ) ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + return error; + } + *pRemainingDelayNumSamples = 0; + } + else + { + *pRemainingDelayNumSamples -= *numOutSamples; + } + } + } + + free( zeroBuf ); + } /* Open other output files if EXT output config - now details about ISM or MASA are known */ if ( arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL ) @@ -1451,7 +1933,19 @@ static ivas_error initOnFirstGoodFrame( if ( numInitialBadFrames > 0 ) { /* Duplicate good first frame metadata to fill the beginning of stream. */ - IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta = NULL; + int16_t fullDelayNumSamplesLocal[3]; + int32_t delayTimeScaleLocal; + float delayMs; + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + hMasaExtOutMeta = NULL; + + /* fullDelayNumSamples is zeroed so need to re-fetch delay info */ + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, fullDelayNumSamplesLocal, &delayTimeScaleLocal ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + } + delayMs = (float) ( fullDelayNumSamplesLocal[0] ) / (float) ( delayTimeScaleLocal ); + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -1460,7 +1954,7 @@ static ivas_error initOnFirstGoodFrame( for ( int16_t j = 0; j < numInitialBadFrames; ++j ) { - if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( *ppMasaWriter ) ); return error; @@ -1470,6 +1964,25 @@ static ivas_error initOnFirstGoodFrame( } } + if ( arg.rtpOutSR || *splitRendWriter != NULL ) + { + if ( numOutSamples == NULL || vec_pos_len == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* real setting of the 5ms mode for split rendering is only known after the decoded first good frame, reset the variables needed in the main decoding loop accordingly here*/ + if ( ( error = IVAS_DEC_GetRenderFramesizeSamples( hIvasDec, numOutSamples ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError getting render frame size in samples\n" ); + return error; + } + if ( ( error = IVAS_DEC_GetReferencesUpdateFrequency( hIvasDec, vec_pos_len ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError getting render frame size in samples\n" ); + return error; + } + } return IVAS_ERR_OK; } @@ -1484,10 +1997,13 @@ static ivas_error initOnFirstGoodFrame( static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, + IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, + ObjectEditFileReader *objectEditFileReader, + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ) @@ -1514,7 +2030,60 @@ static ivas_error decodeG192( IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS]; IVAS_VECTOR3 Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES] = { { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 } }; int16_t vec_pos_update, vec_pos_len; + SplitFileReadWrite *splitRendWriter = NULL; + int16_t isSplitRend, isSplitCoded; + IVAS_RENDER_CONFIG_DATA renderConfig; + RenderConfigReader *renderConfigReader = NULL; + +#ifdef VARIABLE_SPEED_DECODING + if ( arg.tsmEnabled ) + { + if ( ( error = IVAS_DEC_EnableTsm( hIvasDec ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_EnableTsm, code: %d\n", error ); + return error; + } + } + +#endif + if ( ( error = IVAS_DEC_is_split_rendering_enabled( hIvasDec, &isSplitRend ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_is_split_rendering_enabled, code: %d\n", error ); + return error; + } + + if ( !isSplitRend ) + { + /* Ensure split rendering output struct is not used when not outputting to a split rendering output configuration */ + splitRendBits = NULL; + } + + if ( ( error = IVAS_DEC_is_split_rendering_coded_out( hIvasDec, &isSplitCoded ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_is_split_rendering_coded_out, code: %d\n", error ); + return error; + } + + if ( arg.renderConfigEnabled ) + { + if ( ( error = RenderConfigReader_open( arg.renderConfigFilename, &renderConfigReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open Renderer configuration file %s \n\n", arg.renderConfigFilename ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_GetRenderConfig( hIvasDec, &renderConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetRenderConfig failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + if ( RenderConfigReader_read( renderConfigReader, arg.renderConfigFilename, &renderConfig ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Failed to read renderer configuration from file %s\n\n", arg.renderConfigFilename ); + goto cleanup; + } + } for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i ) { @@ -1524,7 +2093,6 @@ static ivas_error decodeG192( /* we always start with needing a new frame */ needNewFrame = true; - if ( !arg.quietModeEnabled ) { fprintf( stdout, "\n------ Running the decoder ------\n\n" ); @@ -1556,13 +2124,13 @@ static ivas_error decodeG192( return error; } - /*------------------------------------------------------------------------------------------* * Loop for every packet (frame) of bitstream data * - Read the bitstream packet * - Run the decoder * - Write the synthesized signal into output file *------------------------------------------------------------------------------------------*/ + while ( 1 ) { /* Read next frame if not enough samples availble */ @@ -1606,24 +2174,42 @@ static ivas_error decodeG192( fprintf( stderr, "\nIVAS_DEC_GetNumOrientationSubframes failed: \n" ); goto cleanup; } - /* Head-tracking input simulation */ + /* Head-tracking input simulation */ if ( arg.enableHeadRotation ) { IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; - for ( i = 0; i < num_subframes; i++ ) + if ( headRotReader == NULL ) { - if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) + for ( i = 0; i < num_subframes; i++ ) { - fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( headRotReader ) ); - goto cleanup; + Quaternions[i].w_fx = -12582912; + Quaternions[i].x_fx = 0; + Quaternions[i].y_fx = 0; + Quaternions[i].z_fx = 0; + Quaternions[i].q_fact = 22; + Pos[i].x_fx = 0; + Pos[i].y_fx = 0; + Pos[i].z_fx = 0; + Pos[i].q_fact = 25; + } + } + else + { + for ( i = 0; i < num_subframes; i++ ) + { + if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( headRotReader ) ); + goto cleanup; + } } } for ( i = 0; i < num_subframes; i++ ) { - if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions[i], Pos[i], i ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions[i], Pos[i], i, DEFAULT_AXIS ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; @@ -1664,6 +2250,36 @@ static ivas_error decodeG192( { if ( needNewFrame ) { + if ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && renderConfigReader != NULL && + arg.aeSequence.count > 0 && arg.aeSequence.pValidity[arg.aeSequence.selected] != 0 ) + { + if ( ++arg.aeSequence.frameCounter >= arg.aeSequence.pValidity[arg.aeSequence.selected] ) + { + if ( ++arg.aeSequence.selected >= arg.aeSequence.count ) + { + arg.aeSequence.selected = 0; + } + arg.aeSequence.frameCounter = 0; + if ( ( error = RenderConfigReader_getAcousticEnvironment( renderConfigReader, arg.aeSequence.pID[arg.aeSequence.selected], &renderConfig.roomAcoustics ) ) == IVAS_ERR_OK ) + { + if ( RenderConfigReader_checkValues( &renderConfig ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Invalid acoustic environment configuratoin parameters\n\n" ); + goto cleanup; + } + } + else + { + fprintf( stderr, "Failed to get acoustic environment with ID %d\n\n", arg.aeSequence.pID[arg.aeSequence.selected] ); + goto cleanup; + } + if ( ( error = IVAS_DEC_FeedRenderConfig( hIvasDec, renderConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRenderConfig failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + } if ( ( error = BS_Reader_ReadFrame_short( hBsReader, bit_stream, &num_bits, &bfi ) ) != IVAS_ERR_OK ) { if ( error == IVAS_ERR_END_OF_FILE ) @@ -1680,15 +2296,94 @@ static ivas_error decodeG192( fprintf( stderr, "\nError: could not feed frame to decoder: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } + + /* Read main parameters from the bitstream to set-up the decoder */ + hHrtfBinary->binaural_renderer_old = hHrtfBinary->binaural_renderer; + hHrtfBinary->binaural_renderer_sec_old = hHrtfBinary->binaural_renderer_sec; + if ( ( error = IVAS_DEC_ReadFormat( hIvasDec, &hHrtfBinary->binaural_renderer, &hHrtfBinary->binaural_renderer_sec, &hHrtfBinary->hrtf_set_audio_cfg ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Placeholder for memory reallocation */ + /* ... */ + + /* Load HRTF binary file data */ + if ( arg.hrtfReaderEnabled ) + { + if ( ( error = load_hrtf_from_file( hHrtfBinary, hIvasDec, arg.outputConfig, arg.output_Fs ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nload_hrtf_from_file failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* decode transport channels, do TSM and feed to renderer */ + if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, splitRendBits ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Object metadata editing */ + if ( arg.objEditEnabled ) + { + IVAS_EDITABLE_PARAMETERS editableParameters; + + if ( ( error = IVAS_DEC_GetEditableParameters( hIvasDec, &editableParameters ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not get the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + + if ( arg.objEditFileName != NULL ) + { + if ( ( error = ObjectEditFileReader_readNextFrame( objectEditFileReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not read object editing instructions from file: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + } + + /* Do object metadata editing here ... */ + do_object_editing_fx( &editableParameters, objectEditFileReader ); + + /* set new object parameters*/ + if ( ( error = IVAS_DEC_SetEditableParameters( hIvasDec, editableParameters ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not set the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* Do the final preparations needed for rendering */ + if ( ( error = IVAS_DEC_PrepareRenderer( hIvasDec ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not prepare the renderer: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } } - if ( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, ( pcmBuf + nOutChannels * nSamplesRendered ), &nSamplesRendered_loop, &needNewFrame ) ) != IVAS_ERR_OK ) + if ( isSplitRend ) { - fprintf( stderr, "\nError in IVAS_DEC_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; + if ( ( error = IVAS_DEC_GetSplitBinauralBitstream( hIvasDec, (Word16 *) ( pcmBuf + nOutChannels * nSamplesRendered ), splitRendBits, &nSamplesRendered_loop, &needNewFrame ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetSplitBinauralBitstream: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + nSamplesRendered += nSamplesRendered_loop; + nSamplesToRender -= nSamplesRendered_loop; + } + else + { + if ( ( error = IVAS_DEC_GetSamplesRenderer( hIvasDec, nSamplesToRender, ( pcmBuf + nOutChannels * nSamplesRendered ), &nSamplesRendered_loop, &needNewFrame ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetSamplesRenderer(): %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + nSamplesRendered += nSamplesRendered_loop; + nSamplesToRender -= nSamplesRendered_loop; } - nSamplesRendered += nSamplesRendered_loop; - nSamplesToRender -= nSamplesRendered_loop; if ( needNewFrame ) { @@ -1698,7 +2393,6 @@ static ivas_error decodeG192( fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); } } - } while ( nSamplesRendered < nOutSamples && error == IVAS_ERR_OK ); @@ -1719,8 +2413,9 @@ static ivas_error decodeG192( /* Once good frame decoded, catch up */ if ( decodedGoodFrame ) { - if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, nOutSamples, delayNumSamples_orig, &delayNumSamples, &delayTimeScale, &bsFormat, &afWriter, &masaWriter, ismWriters, &nOutChannels, &numObj ) ) != IVAS_ERR_OK ) + if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, &nOutSamples, &vec_pos_len, delayNumSamples_orig, &delayNumSamples, &delayTimeScale, &bsFormat, &afWriter, &masaWriter, ismWriters, &nOutChannels, &numObj, NULL, &splitRendWriter ) ) != IVAS_ERR_OK ) { + fprintf( stderr, "Error in initOnFirstGoodFrame(): %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } } @@ -1733,18 +2428,30 @@ static ivas_error decodeG192( /* Write current frame */ if ( decodedGoodFrame ) { - if ( delayNumSamples < nOutSamples ) + if ( isSplitRend ) { - if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK ) + if ( split_rend_write_bitstream_to_file( splitRendWriter, splitRendBits->bits_buf, &splitRendBits->bits_read, &splitRendBits->bits_written ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nOutput audio file writer error\n" ); + fprintf( stderr, "\nUnable to write to bitstream file!\n" ); goto cleanup; } - delayNumSamples = 0; } - else + + if ( !isSplitCoded ) { - delayNumSamples -= nOutSamples; + if ( delayNumSamples < nOutSamples ) + { + if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + delayNumSamples = 0; + } + else + { + delayNumSamples -= nOutSamples; + } } } @@ -1780,13 +2487,22 @@ static ivas_error decodeG192( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + int16_t fullDelayNumSamples[3]; + float delayMs; + + /* delayNumSamples is zeroed, and delayNumSamples_orig is updated only on first good frame, so need to re-fetch delay info */ + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, fullDelayNumSamples, &delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + } if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } - if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; @@ -1859,7 +2575,7 @@ static ivas_error decodeG192( goto cleanup; } - if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternion, Pos[0], 0 ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternion, Pos[0], 0, DEFAULT_AXIS ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; @@ -1912,13 +2628,21 @@ static ivas_error decodeG192( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + int16_t fullDelayNumSamples[3]; + float delayMs; + + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, fullDelayNumSamples, &delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + } if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } - if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; @@ -1979,10 +2703,13 @@ static ivas_error decodeG192( *------------------------------------------------------------------------------------------*/ memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); - if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) + if ( afWriter != NULL ) { - fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); - goto cleanup; + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } } /*------------------------------------------------------------------------------------------* @@ -1993,6 +2720,8 @@ static ivas_error decodeG192( cleanup: + RenderConfigReader_close( &renderConfigReader ); + split_rend_reader_writer_close( &splitRendWriter ); AudioFileWriter_close( &afWriter ); MasaFileWriter_close( &masaWriter ); for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; i++ ) @@ -2026,18 +2755,23 @@ static ivas_error writeJbmTraceFileFrameWrapper( const void *data, void *writer static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, + IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, - IVAS_DEC_HANDLE hIvasDec ) + ObjectEditFileReader *objectEditFileReader, + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, + IVAS_RENDER_CONFIG_DATA *renderConfig, + IVAS_DEC_HANDLE *phIvasDec, + int16_t *pcmBuf ) { bool decodingFailed = true; /* Assume failure until cleanup is reached without errors */ ivas_error error = IVAS_ERR_OK; uint32_t nextPacketRcvTime_ms = 0; uint32_t systemTime_ms = 0; - uint32_t systemTimeInc_ms = (uint32_t) JBM_FRONTEND_FETCH_FRAMESIZE_MS; + uint32_t systemTimeInc_ms = (uint32_t) ( 1000 / IVAS_NUM_FRAMES_PER_SEC ); int32_t nFramesFed = 0; uint8_t au[( IVAS_MAX_BITS_PER_FRAME + 7 ) >> 3]; @@ -2051,7 +2785,6 @@ static ivas_error decodeVoIP( MasaFileWriter *masaWriter = NULL; uint16_t numObj = 0; - int16_t pcmBuf[MAX_OUTPUT_PCM_BUFFER_SIZE]; AudioFileWriter *afWriter = NULL; #ifdef SUPPORT_JBM_TRACEFILE JbmTraceFileWriter *jbmTraceWriter = NULL; @@ -2062,12 +2795,13 @@ static ivas_error decodeVoIP( int16_t delayNumSamples = -1; int32_t delayTimeScale = -1; int16_t i; - FILE *f_rtpstream = NULL; - EVS_RTPDUMP_DEPACKER rtpdumpDepacker; - EVS_RTPDUMP_DEPACKER_ERROR rtpdumpDepackerError = EVS_RTPDUMP_DEPACKER_NO_ERROR; + IVAS_DEC_HANDLE hIvasDec = *phIvasDec; + bool restartNeeded; + IVAS_RTP ivasRtp = { 0 }; + IVAS_RTP srRtp = { 0 }; + IVAS_RTP_SR_INFO srInfo = { true, false, 0, 20, IVAS_SR_TRANSPORT_LCLD }; + int32_t initialTsOffsetSystemAndRTP = 0; uint8_t *auPtr = NULL; - bool isAMRWB_IOmode; - uint16_t frameTypeIndex; bool qBit; IVAS_DEC_BS_FORMAT bsFormat = IVAS_DEC_BS_UNKOWN; @@ -2075,19 +2809,43 @@ static ivas_error decodeVoIP( IVAS_VECTOR3 Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES] = { { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 } }; int16_t vec_pos_update, vec_pos_len; int16_t nOutSamples = 0; + bool bitstreamReadDone = false; + bool parametersAvailableForEditing = false; + uint16_t nSamplesRendered; - vec_pos_update = 0; - if ( ( error = IVAS_DEC_GetRenderFramesizeMs( hIvasDec, &systemTimeInc_ms ) ) != IVAS_ERR_OK ) + SplitFileReadWrite *splitRendWriter = NULL; + int16_t isSplitRend, isSplitCoded; + + if ( ( error = IVAS_DEC_is_split_rendering_enabled( hIvasDec, &isSplitRend ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nError getting render frame size in samples\n" ); + fprintf( stderr, "\nError in IVAS_DEC_is_split_rendering_enabled, code: %d\n", error ); return error; } - if ( ( error = IVAS_DEC_GetRenderFramesizeSamples( hIvasDec, &nOutSamples ) ) != IVAS_ERR_OK ) + + if ( !isSplitRend ) { - fprintf( stderr, "\nError getting render frame size in samples\n" ); - return error; + /* Ensure split rendering output struct is not used when not outputting to a split rendering format */ + splitRendBits = NULL; } - if ( ( error = IVAS_DEC_GetReferencesUpdateFrequency( hIvasDec, &vec_pos_len ) ) != IVAS_ERR_OK ) + + if ( ( error = IVAS_DEC_is_split_rendering_coded_out( hIvasDec, &isSplitCoded ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_is_split_rendering_coded_out, code: %d\n", error ); + return error; + } + + vec_pos_update = 0; + if ( ( error = IVAS_DEC_GetRenderFramesizeMs( hIvasDec, &systemTimeInc_ms ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError getting render frame size in samples\n" ); + return error; + } + if ( ( error = IVAS_DEC_GetRenderFramesizeSamples( hIvasDec, &nOutSamples ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError getting render frame size in samples\n" ); + return error; + } + if ( ( error = IVAS_DEC_GetReferencesUpdateFrequency( hIvasDec, &vec_pos_len ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError getting render frame size in samples\n" ); return error; @@ -2100,23 +2858,13 @@ static ivas_error decodeVoIP( delayNumSamples_orig[0] = -1; - rtpdumpDepacker.rtpdump = NULL; switch ( arg.inputFormat ) { case IVAS_DEC_INPUT_FORMAT_RTPDUMP: case IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF: - f_rtpstream = fopen( arg.inputBitstreamFilename, "r" ); - - if ( f_rtpstream == NULL ) - { - fprintf( stderr, "could not open: %s\n", arg.inputBitstreamFilename ); - goto cleanup; - } - - rtpdumpDepackerError = EVS_RTPDUMP_DEPACKER_open( &rtpdumpDepacker, f_rtpstream, arg.inputFormat == IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF ); - if ( rtpdumpDepackerError != EVS_RTPDUMP_DEPACKER_NO_ERROR ) + if ( ( error = IVAS_RTP_READER_Init( &ivasRtp, arg.inputBitstreamFilename, arg.piOutputFilename, arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL, arg.outputWavFilename ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "error in EVS_RTPDUMP_DEPACKER_open(): %d\n", rtpdumpDepackerError ); + fprintf( stderr, "error in IVAS_RTP_READER_Init(): %d\n", error ); goto cleanup; } break; @@ -2160,12 +2908,13 @@ static ivas_error decodeVoIP( else { auPtr = au; /* might have been set to RTP packet in prev call */ - rtpdumpDepackerError = EVS_RTPDUMP_DEPACKER_readNextFrame( &rtpdumpDepacker, &rtpSequenceNumber, &rtpTimeStamp, &nextPacketRcvTime_ms, &isAMRWB_IOmode, &frameTypeIndex, &qBit, &auPtr, (uint16_t *) &auSize ); + error = IVAS_RTP_ReadNextFrame( &ivasRtp, auPtr, &auSize, &rtpTimeStamp, &rtpSequenceNumber, &nextPacketRcvTime_ms, NULL, &qBit ); + initialTsOffsetSystemAndRTP = rtpTimeStamp - systemTime_ms * 16; /* For time mapping */ /* EVS RTP payload format has timescale 16000, JBM uses 1000 internally */ rtpTimeStamp = rtpTimeStamp / 16; } - if ( error != IVAS_ERR_OK || rtpdumpDepackerError != EVS_RTPDUMP_DEPACKER_NO_ERROR ) + if ( error != IVAS_ERR_OK ) { fprintf( stderr, "failed to read first RTP packet\n" ); goto cleanup; @@ -2192,6 +2941,27 @@ static ivas_error decodeVoIP( while ( 1 ) { + nSamplesRendered = 0; + + /* restart decoder in case of format switching */ + if ( ivasRtp.restartNeeded ) + { + IVAS_DEC_MODE newDecModeInPacket = ( ivasRtp.codecId == IVAS_RTP_EVS ) ? IVAS_DEC_MODE_EVS : IVAS_DEC_MODE_IVAS; + if ( ( error = restartDecoder( + &hIvasDec, + newDecModeInPacket, + &arg, + renderConfig, + NULL /* ToDo : Provide LS Custom Data */ + ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nFailed to restart decoder from %d to %d\n", arg.decMode, newDecModeInPacket ); + goto cleanup; + } + + *phIvasDec = hIvasDec; /* Update for main()' s free */ + ivasRtp.restartNeeded = false; + } /* reference vector */ if ( arg.enableReferenceVectorTracking && vec_pos_update == 0 ) @@ -2226,6 +2996,7 @@ static ivas_error decodeVoIP( goto cleanup; } } + int16_t num_subframes; if ( ( error = IVAS_DEC_GetNumOrientationSubframes( hIvasDec, &num_subframes ) ) != IVAS_ERR_OK ) { @@ -2233,25 +3004,41 @@ static ivas_error decodeVoIP( goto cleanup; } - /* Head-tracking input simulation */ /* Head-tracking input simulation */ if ( arg.enableHeadRotation ) { IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; - for ( i = 0; i < num_subframes; i++ ) + if ( headRotReader == NULL ) { - if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) + for ( i = 0; i < num_subframes; i++ ) { - fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), - RotationFileReader_getFilePath( headRotReader ) ); - goto cleanup; + Quaternions[i].w_fx = -12582912; + Quaternions[i].x_fx = 0; + Quaternions[i].y_fx = 0; + Quaternions[i].z_fx = 0; + Quaternions[i].q_fact = 22; + Pos[i].x = 0.0f; + Pos[i].y = 0.0f; + Pos[i].z = 0.0f; + Pos[i].q_fact = 25; + } + } + else + { + for ( i = 0; i < num_subframes; i++ ) + { + if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( headRotReader ) ); + goto cleanup; + } } } for ( i = 0; i < num_subframes; i++ ) { - if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions[i], Pos[i], i ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions[i], Pos[i], i, DEFAULT_AXIS ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; @@ -2287,6 +3074,15 @@ static ivas_error decodeVoIP( } } + if ( arg.objEditEnabled && arg.objEditFileName != NULL && vec_pos_update == 0 ) + { + if ( ( error = ObjectEditFileReader_readNextFrame( objectEditFileReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not read object editing instructions from file: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + } + /* read all packets with a receive time smaller than the system time */ while ( nextPacketRcvTime_ms <= systemTime_ms ) { @@ -2309,19 +3105,17 @@ static ivas_error decodeVoIP( else { auPtr = au; /* might have been set to RTP packet in prev call */ - rtpdumpDepackerError = EVS_RTPDUMP_DEPACKER_readNextFrame( &rtpdumpDepacker, &rtpSequenceNumber, &rtpTimeStamp, - &nextPacketRcvTime_ms, - &isAMRWB_IOmode, &frameTypeIndex, &qBit, - &auPtr, (uint16_t *) &auSize ); - /* EVS RTP payload format has timescale 16000, JBM uses 1000 internally */ + error = IVAS_RTP_ReadNextFrame( &ivasRtp, au, &auSize, &rtpTimeStamp, &rtpSequenceNumber, &nextPacketRcvTime_ms, NULL, &qBit ); + + /* IVAS RTP payload format has timescale 16000, JBM uses 1000 internally */ rtpTimeStamp = rtpTimeStamp / 16; } - if ( error == IVAS_ERR_END_OF_FILE || rtpdumpDepackerError == EVS_RTPDUMP_DEPACKER_EOF ) + if ( error == IVAS_ERR_END_OF_FILE ) { /* finished reading */ nextPacketRcvTime_ms = (uint32_t) -1; } - else if ( error != IVAS_ERR_OK || rtpdumpDepackerError != EVS_RTPDUMP_DEPACKER_NO_ERROR ) + else if ( error != IVAS_ERR_OK ) { fprintf( stderr, "\nError in BS_Reader_ReadVoipFrame_compact, error code: %d\n", error ); goto cleanup; @@ -2331,23 +3125,144 @@ static ivas_error decodeVoIP( /* we are finished when all packets have been received and jitter buffer is empty */ /* also stop when the input file contains less than two frames, because JBM cannot calculate a delay value and won't start decoding */ /* last clause should make sure that for BE tests we end up with the same number of samples...*/ - if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( IVAS_DEC_VoIP_IsEmpty( hIvasDec, nOutSamples ) || nFramesFed < 2 ) ) + bool isEmpty; + if ( ( error = IVAS_DEC_VoIP_IsEmpty( hIvasDec, nOutSamples, &isEmpty ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( isEmpty || nFramesFed < 2 ) ) { break; } - /* decode and get samples */ + while ( nSamplesRendered < nOutSamples ) + { + if ( arg.applyPiData ) + { + /* Rudimentry Time Mapping to map system time to rtp timestamp */ + uint32_t piTs = systemTime_ms * 16 + initialTsOffsetSystemAndRTP; + uint32_t numPiData = 0; + while ( ivasRtp.nProcPiData + numPiData < ivasRtp.nReadPiData && + ivasRtp.piData[ivasRtp.nProcPiData + numPiData].timestamp <= piTs ) + { + numPiData++; + } + + if ( ( error = IVAS_DEC_FeedPiDataToDecoder( hIvasDec, &ivasRtp.piData[ivasRtp.nProcPiData], numPiData ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + ivasRtp.nProcPiData += numPiData; + } + + if ( isSplitRend ) + { #ifdef SUPPORT_JBM_TRACEFILE - if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms, writeJbmTraceFileFrameWrapper, jbmTraceWriter ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_VoIP_GetSplitBinauralBitstream( hIvasDec, (void *) pcmBuf, splitRendBits, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) #else - if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_VoIP_GetSplitBinauralBitstream( hIvasDec, (void *) pcmBuf, splitRendBits, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) #endif - { - fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSplitBinauralBitstream: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + else + { +#ifdef SUPPORT_JBM_TRACEFILE + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, (void *) pcmBuf, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, (void *) pcmBuf, &bitstreamReadDone, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) +#endif + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + if ( bitstreamReadDone == true ) + { + /* Read main parameters from the bitstream to set-up the decoder */ + hHrtf->binaural_renderer_old = hHrtf->binaural_renderer; + hHrtf->binaural_renderer_sec_old = hHrtf->binaural_renderer_sec; + if ( ( error = IVAS_DEC_ReadFormat( hIvasDec, &hHrtf->binaural_renderer, &hHrtf->binaural_renderer_sec, &hHrtf->hrtf_set_audio_cfg ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* restart decoder in case of format switching */ + if ( ( error = IVAS_DEC_isRestartNeeded( hIvasDec, &restartNeeded ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( restartNeeded ) + { + IVAS_DEC_BS_FORMAT tempBsFormat; + if ( ( error = IVAS_DEC_GetFormat( hIvasDec, &tempBsFormat ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetFormat, code: %d\n", error ); + goto cleanup; + } + + IVAS_DEC_MODE newDecModeInPacket = ( tempBsFormat == IVAS_DEC_BS_MONO ) ? IVAS_DEC_MODE_EVS : IVAS_DEC_MODE_IVAS; + if ( ( error = restartDecoder( + &hIvasDec, + newDecModeInPacket, + &arg, + NULL, /* ToDo : Provide rendererConfig */ + NULL /* ToDo : Provide LS Custom Data */ + ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nFailed to restart decoder\n" ); + goto cleanup; + } + + *phIvasDec = hIvasDec; /* Update for main()' s free */ + } + + /* Placeholder for memory reallocation */ + /* ... */ + + /* Load HRTF binary file data */ + if ( arg.hrtfReaderEnabled ) + { + if ( ( error = load_hrtf_from_file( hHrtf, hIvasDec, arg.outputConfig, arg.output_Fs ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nload_hrtf_from_file failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + } + + /* Object metadata editing */ + if ( arg.objEditEnabled && parametersAvailableForEditing == true ) + { + IVAS_EDITABLE_PARAMETERS editableParameters; + + /* get object parameters */ + if ( ( error = IVAS_DEC_GetEditableParameters( hIvasDec, &editableParameters ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not get the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + + /* Do object metadata editing here ... */ + do_object_editing_fx( &editableParameters, objectEditFileReader ); + + /* set new object parameters */ + if ( ( error = IVAS_DEC_SetEditableParameters( hIvasDec, editableParameters ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not set the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + } + } /* while ( nSamplesRendered < nOutSamples ) */ /* write JBM Offset file entry */ if ( jbmOffsetWriter != NULL ) @@ -2372,15 +3287,29 @@ static ivas_error decodeVoIP( { if ( ( error = IVAS_DEC_HasDecodedFirstGoodFrame( hIvasDec, &decodedGoodFrame ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_DEC_HasDecodedFirstGoodFrame, code: %d\n", error ); + fprintf( stderr, "Error in IVAS_DEC_HasDecodedFirstGoodFrame(): %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } /* Once good frame decoded, catch up */ if ( decodedGoodFrame ) { - if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, nOutSamples, delayNumSamples_orig, &delayNumSamples, &delayTimeScale, - &bsFormat, &afWriter, &masaWriter, ismWriters, &nOutChannels, &numObj ) ) != IVAS_ERR_OK ) + if ( ( error = initOnFirstGoodFrame( hIvasDec, + arg, + numInitialBadFrames, + &nOutSamples, + &vec_pos_len, + delayNumSamples_orig, + &delayNumSamples, + &delayTimeScale, + &bsFormat, + &afWriter, + &masaWriter, + ismWriters, + &nOutChannels, + &numObj, + &srRtp, + &splitRendWriter ) ) != IVAS_ERR_OK ) { goto cleanup; } @@ -2392,20 +3321,32 @@ static ivas_error decodeVoIP( } /* Write current frame */ - if ( decodedGoodFrame ) + if ( !srRtp.hPack && decodedGoodFrame ) { - if ( delayNumSamples < nOutSamples ) + if ( isSplitRend ) { - if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK ) + if ( split_rend_write_bitstream_to_file( splitRendWriter, splitRendBits->bits_buf, &splitRendBits->bits_read, &splitRendBits->bits_written ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nOutput audio file writer error\n" ); + fprintf( stderr, "\nUnable to write to bitstream file!\n" ); goto cleanup; } - delayNumSamples = 0; } - else + + if ( !isSplitCoded ) { - delayNumSamples -= nOutSamples; + if ( delayNumSamples < nOutSamples ) + { + if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + delayNumSamples = 0; + } + else + { + delayNumSamples -= nOutSamples; + } } /* Write ISM metadata to external file(s) */ @@ -2440,29 +3381,59 @@ static ivas_error decodeVoIP( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + int16_t fullDelayNumSamples[3]; + float delayMs; + + /* delayNumSamples_orig is fetched only for the first good frame, but here the delay can change between frames, so need to re-fetch */ + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, fullDelayNumSamples, &delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + } if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 1 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } - if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; } } + + IVAS_RTP_WriteExtPiData( ivasRtp.f_piExtOut, ivasRtp.piData, ivasRtp.nReadPiData, numObj ); } } - - // frame++; - if ( !arg.quietModeEnabled ) + else if ( decodedGoodFrame ) { - fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); + srInfo.bitrateKbps = splitRendBits->bits_written * 1000 / splitRendBits->codec_frame_size_ms; + srInfo.codec = ( splitRendBits->codec == ISAR_SPLIT_REND_CODEC_LC3PLUS ) ? IVAS_SR_TRANSPORT_LC3PLUS : IVAS_SR_TRANSPORT_LCLD; + srInfo.codecFrameSizeMs = (uint32_t) splitRendBits->codec_frame_size_ms; + if ( ( error = IVAS_RTP_WriteNextFrame( &srRtp, splitRendBits->bits_buf, &srInfo, (int16_t) splitRendBits->bits_written, false, false ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while pushing SR audio bitstream to RTP pack\n", ivas_error_to_string( error ) ); + goto cleanup; + } + splitRendBits->bits_written = 0; + splitRendBits->bits_read = 0; } + vec_pos_update = ( vec_pos_update + 1 ) % vec_pos_len; - frame++; - systemTime_ms += systemTimeInc_ms; + if ( vec_pos_update == 0 ) + { + systemTime_ms += vec_pos_len * systemTimeInc_ms; + } + + if ( vec_pos_update == 0 ) + { + frame++; + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); + } + } #ifdef WMOPS update_mem(); @@ -2470,15 +3441,95 @@ static ivas_error decodeVoIP( #endif } + int16_t nSamplesFlushed = 0; + + /* decode and get samples */ + if ( ( error = IVAS_DEC_Flush( hIvasDec, nOutSamples, pcmBuf, &nSamplesFlushed ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_Flush: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( nSamplesFlushed && !isSplitCoded ) + { + /* Write current frame */ + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, nSamplesFlushed * nOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + + /* Write ISm metadata to external file(s) */ + if ( decodedGoodFrame && arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ || bsFormat == IVAS_DEC_BS_MASA_ISM || bsFormat == IVAS_DEC_BS_SBA_ISM ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + for ( i = 0; i < numObj; ++i ) + { + IVAS_ISM_METADATA IsmMetadata; + + if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + goto cleanup; + } + } + } + + if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) + { + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + int16_t fullDelayNumSamples[3]; + float delayMs; + + /* delayNumSamples is zeroed, and delayNumSamples_orig is updated only on first good frame, so need to re-fetch delay info */ + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, fullDelayNumSamples, &delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + } + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + goto cleanup; + } + } + + IVAS_RTP_WriteExtPiData( ivasRtp.f_piExtOut, ivasRtp.piData, ivasRtp.nReadPiData, numObj ); + } + } + /*------------------------------------------------------------------------------------------* * Add zeros at the end to have equal length of synthesized signals *------------------------------------------------------------------------------------------*/ memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); - if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) + + if ( afWriter != NULL ) { - fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); - goto cleanup; + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } } /*------------------------------------------------------------------------------------------* @@ -2512,6 +3563,8 @@ static ivas_error decodeVoIP( { fprintf( stdout, "\nOutput MASA metadata file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); } + + fprintf( stdout, "\nOutput PI data file: %s\n", IVAS_RTP_GetExtPiFilePath( &ivasRtp ) ); } /*------------------------------------------------------------------------------------------* @@ -2522,8 +3575,10 @@ static ivas_error decodeVoIP( cleanup: - EVS_RTPDUMP_DEPACKER_close( &rtpdumpDepacker ); + IVAS_RTP_Term( &srRtp ); + IVAS_RTP_Term( &ivasRtp ); AudioFileWriter_close( &afWriter ); + split_rend_reader_writer_close( &splitRendWriter ); JbmOffsetFileWriter_close( &jbmOffsetWriter ); #ifdef SUPPORT_JBM_TRACEFILE JbmTraceFileWriter_close( &jbmTraceWriter ); @@ -2543,4 +3598,441 @@ cleanup: } +/*---------------------------------------------------------------------* + * do_object_editing_fx() + * + * Example function to edit objects parameters + *---------------------------------------------------------------------*/ + +static void do_object_editing_fx( + IVAS_EDITABLE_PARAMETERS *editableParameters, + ObjectEditFileReader *objectEditFileReader ) +{ + /* put the objects equally spaced at the horizontal plane */ + /* and play a little bit with the gains... */ + Word16 obj_idx, non_diegetic_obj_idx; + Word16 num_nondiegetic_objects; + + num_nondiegetic_objects = 0; + for ( obj_idx = 0; obj_idx < editableParameters->num_obj; obj_idx++ ) + { + if ( !editableParameters->ism_metadata[obj_idx].non_diegetic_flag ) + { + num_nondiegetic_objects++; + } + } + + if ( objectEditFileReader != NULL ) + { + ReadObjectEditInfo *readInfo; + readInfo = objectEditFileReader->readInfo; + + if ( readInfo->bg_gain_edited ) + { + editableParameters->gain_bed_fx = (Word32) ( readInfo->bg_gain * 536870912 ); /* Q29 */ + } + + for ( obj_idx = 0; obj_idx < editableParameters->num_obj; obj_idx++ ) + { + if ( !editableParameters->ism_metadata[obj_idx].non_diegetic_flag ) + { + /* object direction editing only for diegetic objects */ + if ( readInfo->obj_azi_edited[obj_idx] ) + { + if ( readInfo->obj_azi_relative[obj_idx] ) + { + /* azimuth: apply relative edit + wrap */ + editableParameters->ism_metadata[obj_idx].azimuth_fx = ( ( editableParameters->ism_metadata[obj_idx].azimuth_fx + (Word32) ( readInfo->obj_azi[obj_idx] * 4194304 ) + 2264924160 ) % 1509949440 ) - 754974720; /* Q22 */ + } + else + { + editableParameters->ism_metadata[obj_idx].azimuth_fx = (Word32) ( readInfo->obj_azi[obj_idx] * 4194304 ); /* Q22 */ + } + } + if ( readInfo->obj_ele_edited[obj_idx] ) + { + if ( readInfo->obj_ele_relative[obj_idx] ) + { + /* elevation: apply relative edit + saturation */ + editableParameters->ism_metadata[obj_idx].elevation_fx = L_max( L_min( editableParameters->ism_metadata[obj_idx].elevation_fx + (Word32) ( readInfo->obj_ele[obj_idx] * 4194304 ), 377487360 ), -377487360 ); /* Q22 */ + } + else + { + editableParameters->ism_metadata[obj_idx].elevation_fx = (Word32) ( readInfo->obj_ele[obj_idx] * 4194304 ); /* Q22 */ + } + } + /* object direction editing only for diegetic objects */ + if ( readInfo->obj_yaw_edited[obj_idx] ) + { + if ( readInfo->obj_yaw_relative[obj_idx] ) + { + /* yaw: apply relative edit + wrap */ + editableParameters->ism_metadata[obj_idx].yaw_fx = ( ( editableParameters->ism_metadata[obj_idx].yaw_fx + (Word32) ( readInfo->obj_yaw[obj_idx] * 4194304 ) + 2264924160 ) % 1509949440 ) - 754974720; /* Q22 */ + } + else + { + editableParameters->ism_metadata[obj_idx].yaw_fx = (Word32) ( readInfo->obj_yaw[obj_idx] * 4194304 ); /* Q22 */ + } + } + if ( readInfo->obj_pitch_edited[obj_idx] ) + { + if ( readInfo->obj_pitch_relative[obj_idx] ) + { + /* pitch: apply relative edit + saturation */ + editableParameters->ism_metadata[obj_idx].pitch_fx = L_max( L_min( editableParameters->ism_metadata[obj_idx].pitch_fx + (Word32) ( readInfo->obj_pitch[obj_idx] * 4194304 ), 377487360 ), -377487360 ); /* Q22 */ + } + else + { + editableParameters->ism_metadata[obj_idx].pitch_fx = (Word32) ( readInfo->obj_pitch[obj_idx] * 4194304 ); /* Q22 */ + } + } + /* radius editing only for diegetic objects */ + if ( readInfo->obj_radius_edited[obj_idx] ) + { + if ( readInfo->obj_radius_relative[obj_idx] ) + { +/* radius: apply relative edit + saturation */ +#define SQ 9 + +#define SHIFT_DUE_TO_SQxSQ ( SQ - ( SQ + SQ + 1 - 16 ) ) /* ^shift by 6 == mult by 2^6 = 64.0 */ + + Word32 L_tmp1 = L_mult( editableParameters->ism_metadata[obj_idx].radius_fx, (Word16) ( readInfo->obj_radius[obj_idx] * ( 1L << ( SQ ) ) ) ); /*SQ*SQ*/ + Word32 L_tmp2 = L_shl_sat( L_tmp1, SHIFT_DUE_TO_SQxSQ ); /*shift back to Q(9+16)*/ + Word16 temp_radius = round_fx( L_tmp2 ); /* Q25 -> Q9 */ + temp_radius = s_max( s_min( temp_radius, OBJ_EDIT_RADIUS_MAX_FX ), 0 ); + + /* L_tmp2 is in S31Q25 stored in a signed Word32 + temp_radius is in S15Q9 stored in a signed Word16 + */ + } + else + { + editableParameters->ism_metadata[obj_idx].radius_fx = (Word16) ( readInfo->obj_radius[obj_idx] * 512 ); /* Q9 */ + } + } + } + + /* gain editing for all objects */ + if ( readInfo->obj_gain_edited[obj_idx] ) + { + if ( readInfo->obj_gain_relative[obj_idx] ) + { + /* gain: apply relative edit + saturation */ + editableParameters->ism_metadata[obj_idx].gain_fx = L_max( L_min( L_shl_sat( Mpy_32_32( editableParameters->ism_metadata[obj_idx].gain_fx, (Word32) ( readInfo->obj_gain[obj_idx] * 536870912 ) ), 2 ), OBJ_EDIT_GAIN_MAX_FX ), OBJ_EDIT_GAIN_MIN_FX ); /* Q29*Q29 -> Q27 shift back to Q29 */ + } + else + { + editableParameters->ism_metadata[obj_idx].gain_fx = (Word32) ( readInfo->obj_gain[obj_idx] * 536870912 ); /* Q29 */ + } + } + } + } + else + { + if ( num_nondiegetic_objects ) + { + float start_angle, angle_inc; + angle_inc = 360.0f / (float) num_nondiegetic_objects; + start_angle = angle_inc / 2.0f; + for ( obj_idx = 0, non_diegetic_obj_idx = 0; obj_idx < editableParameters->num_obj; obj_idx++ ) + { + if ( !editableParameters->ism_metadata[obj_idx].non_diegetic_flag ) + { + editableParameters->ism_metadata[obj_idx].elevation_fx = 0; + editableParameters->ism_metadata[obj_idx].azimuth_fx = (Word32) ( ( start_angle + (float) non_diegetic_obj_idx * angle_inc ) * 4194304 /* Q22 */ ); + non_diegetic_obj_idx++; + } + } + } + + /* breakover object gains */ + for ( obj_idx = 0; obj_idx < editableParameters->num_obj; obj_idx++ ) + { + editableParameters->ism_metadata[obj_idx].gain_fx = (Word32) ( ( 0.5f + (float) ( ( frame + obj_idx * 50 ) % 250 ) / 250.0f ) * 536870912 /*Q29*/ ); + } + + editableParameters->gain_bed_fx = ( 1 << 28 ); // 0.5 in Q29 + } + + return; +} + + +/*---------------------------------------------------------------------* + * load_hrtf_from_file() + * + * Load HRTF coefficients from external binary file + *---------------------------------------------------------------------*/ + +static ivas_error load_hrtf_from_file( + IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, /* i/o: HRTF binary wrapper handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_AUDIO_CONFIG OutputConfig, /* i : output audio configuration */ + const int32_t output_Fs /* i : output sampling rate */ +) +{ + ivas_error error; + IVAS_BIN_RENDERER_TYPE binaural_renderer, binaural_renderer_sec; + + if ( hHrtfBinary == NULL || hIvasDec == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + binaural_renderer = hHrtfBinary->binaural_renderer; + binaural_renderer_sec = hHrtfBinary->binaural_renderer_sec; + + if ( ( binaural_renderer != hHrtfBinary->binaural_renderer_old ) || + ( binaural_renderer_sec != hHrtfBinary->binaural_renderer_sec_old ) || + ( binaural_renderer == IVAS_BIN_RENDERER_TYPE_DEFAULT ) ) + { + /*------------------------------------------------------------------------------------------* + * Release HRTF binary data + *------------------------------------------------------------------------------------------*/ + + if ( !( binaural_renderer == IVAS_BIN_RENDERER_TYPE_TDREND || binaural_renderer == IVAS_BIN_RENDERER_TYPE_DEFAULT ) && binaural_renderer_sec != IVAS_BIN_RENDERER_TYPE_TDREND && hHrtfBinary->hHrtfTD != NULL ) + { + destroy_td_hrtf( hHrtfBinary->hHrtfTD ); + } + + if ( ( error = IVAS_DEC_HRTF_binary_close( hIvasDec, hHrtfBinary->binaural_renderer_old ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*------------------------------------------------------------------------------------------* + * Load HRTF binary data + *------------------------------------------------------------------------------------------*/ + + if ( ( error = IVAS_DEC_HRTF_binary_open( hIvasDec, binaural_renderer ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = IVAS_DEC_HRTF_binary_open( hIvasDec, binaural_renderer_sec ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( binaural_renderer == IVAS_BIN_RENDERER_TYPE_TDREND || binaural_renderer_sec == IVAS_BIN_RENDERER_TYPE_TDREND || binaural_renderer == IVAS_BIN_RENDERER_TYPE_DEFAULT ) + { + if ( ( error = IVAS_DEC_GetHrtfTDrendHandle( hIvasDec, &hHrtfBinary->hHrtfTD ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetHrtfTDrendHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + + if ( ( error = load_TDrend_HRTF_binary( *hHrtfBinary->hHrtfTD, output_Fs, hHrtfBinary->hrtfReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", hHrtfBinary->hrtfFileName ); + return error; + } + else + { + destroy_td_hrtf( hHrtfBinary->hHrtfTD ); + } + } + } + + if ( binaural_renderer == IVAS_BIN_RENDERER_TYPE_CREND || binaural_renderer == IVAS_BIN_RENDERER_TYPE_DEFAULT ) + { + IVAS_DEC_HRTF_CREND_HANDLE *hHrtfCrend = NULL; + if ( ( error = IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hHrtfCrend ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetHrtfCRendHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + + if ( ( error = load_Crend_HRTF_from_binary( *hHrtfCrend, hHrtfBinary->hrtfReader, OutputConfig, hHrtfBinary->hrtf_set_audio_cfg, output_Fs ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", hHrtfBinary->hrtfFileName ); + return error; + } + else + { + destroy_crend_hrtf( hHrtfCrend ); + } + } + } + + if ( binaural_renderer == IVAS_BIN_RENDERER_TYPE_FASTCONV || binaural_renderer == IVAS_BIN_RENDERER_TYPE_DEFAULT ) + { + IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv = NULL; + if ( ( error = IVAS_DEC_GetHrtfFastConvHandle( hIvasDec, &hHrtfFastConv ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetHrtfFastConvHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + + if ( ( error = load_fastconv_HRTF_from_binary( *hHrtfFastConv, OutputConfig, hHrtfBinary->hrtf_set_audio_cfg, hHrtfBinary->hrtfReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", hHrtfBinary->hrtfFileName ); + return error; + } + else + { + destroy_fastconv_hrtf( hHrtfFastConv ); + } + } + } + + if ( binaural_renderer == IVAS_BIN_RENDERER_TYPE_PARAMBIN || binaural_renderer == IVAS_BIN_RENDERER_TYPE_DEFAULT ) + { + IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin = NULL; + if ( ( error = IVAS_DEC_GetHrtfParamBinHandle( hIvasDec, &hHrtfParambin ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetHrtfParamBinHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + + if ( ( error = load_parambin_HRTF_from_binary( *hHrtfParambin, hHrtfBinary->hrtfReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", hHrtfBinary->hrtfFileName ); + return error; + } + else + { + destroy_parambin_hrtf( hHrtfParambin ); + } + } + } + } + + if ( hHrtfBinary->hHrtfStatistics == NULL && ( binaural_renderer == IVAS_BIN_RENDERER_TYPE_FASTCONV || binaural_renderer == IVAS_BIN_RENDERER_TYPE_CREND ) && OutputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = IVAS_DEC_GetHrtfStatisticsHandle( hIvasDec, &hHrtfBinary->hHrtfStatistics ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetHrtfStatisticsHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + + if ( ( error = load_reverb_binary( *hHrtfBinary->hHrtfStatistics, output_Fs, hHrtfBinary->hrtfReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", hHrtfBinary->hrtfFileName ); + return error; + } + else + { + destroy_hrtf_statistics( hHrtfBinary->hHrtfStatistics ); + } + } + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * restartDecoder() + * + * Restart decoder in case of IVAS format switching + *---------------------------------------------------------------------*/ + +static ivas_error restartDecoder( + IVAS_DEC_HANDLE *phIvasDec, + const IVAS_DEC_MODE decMode, + DecArguments *arg, + IVAS_RENDER_CONFIG_DATA *renderConfig, + IVAS_CUSTOM_LS_DATA *hLsCustomData ) +{ + ivas_error error = IVAS_ERR_OK; + IVAS_DEC_HANDLE hIvasDec; + + if ( phIvasDec == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( NULL != *phIvasDec ) + { + IVAS_DEC_Close( phIvasDec ); + } + + if ( ( error = IVAS_DEC_Open( phIvasDec, decMode ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Open failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + arg->decMode = decMode; + + hIvasDec = *phIvasDec; + + uint16_t aeID = arg->aeSequence.count > 0 ? arg->aeSequence.pID[0] : 65535; + + IVAS_AUDIO_CONFIG outputConfig = ( decMode == IVAS_DEC_MODE_IVAS ) ? arg->outputConfig : IVAS_AUDIO_CONFIG_MONO; + if ( ( error = IVAS_DEC_Configure( hIvasDec, arg->output_Fs, outputConfig, arg->renderFramesize, arg->customLsOutputEnabled, arg->hrtfReaderEnabled, + arg->enableHeadRotation, arg->enableExternalOrientation, arg->orientation_tracking, arg->renderConfigEnabled, arg->roomSize, arg->non_diegetic_pan_enabled, + arg->non_diegetic_pan_gain_fx, arg->dpidEnabled, aeID, arg->objEditEnabled, arg->delayCompensationEnabled ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_GetRenderFramesize( hIvasDec, &arg->renderFramesize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + + if ( arg->voipMode ) + { + if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, 60, arg->inputFormat ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCould not enable VOIP: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + if ( ( error = IVAS_DEC_PrintConfig( hIvasDec, 1, arg->voipMode ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_PrintConfig failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + /* ISAR frame size is set from command line, not renderer config file. + * This will be ignored if output format is not split rendering. */ + if ( renderConfig != NULL ) + { + renderConfig->split_rend_config.isar_frame_size_ms = (int16_t) arg->renderFramesize /* given in number of 5ms subframes */ * 5; + } + + if ( arg->renderConfigEnabled && renderConfig != NULL ) + { + if ( ( error = IVAS_DEC_FeedRenderConfig( hIvasDec, *renderConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRenderConfig failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + if ( arg->customLsOutputEnabled && hLsCustomData != NULL ) + { + if ( ( error = IVAS_DEC_FeedCustomLsData( hIvasDec, *hLsCustomData ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedCustomLsData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + return IVAS_ERR_OK; + +cleanup: + IVAS_DEC_Close( phIvasDec ); + + return error; +} + + #undef WMC_TOOL_SKIP diff --git a/apps/encoder.c b/apps/encoder.c index af9554589d813007f8b04ec2df6f4f6a0369fe4c..1eecfdd5155450fa0cf398e5c1975da23d7f8787 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -44,6 +44,8 @@ #include "jbm_file_reader.h" #include "masa_file_reader.h" #include "wmc_auto.h" +#include "rotation_file_reader.h" +#include "ivas_rtp_file.h" #ifdef DEBUG_FORCE_DIR /* Windows does not define the S_ISREG and S_ISDIR macros in stat.h, so we do. @@ -70,6 +72,8 @@ static #endif int32_t frame = 0; /* Counter of frames */ +#define RANDOM_INITSEED_ENC ( 0xDEAF ) + #define DEFAULT_FIXED_SID_RATE 8 /* DTX SID rate */ /* Additional config info for each input format */ @@ -155,6 +159,10 @@ typedef struct #endif bool pca; bool ism_extended_metadata; + bool rtpdumpOutput; + uint32_t numFramesPerPacket; + char *sceneOrientationTrajFileName; + char *deviceOrientationTrajFileName; } EncArguments; @@ -163,7 +171,6 @@ typedef struct * Local functions prototypes *------------------------------------------------------------------------------------------*/ -static void initArgStruct( EncArguments *arg ); static bool parseCmdlIVAS_enc( int16_t argc, char *argv[], EncArguments *arg ); static void usage_enc( void ); static bool readBandwidth( FILE *file, IVAS_ENC_BANDWIDTH *bandwidth, int32_t *bandwidthFrameCounter ); @@ -199,6 +206,8 @@ int main( MasaFileReader *masaReader = NULL; IsmFileReader *ismReaders[IVAS_MAX_NUM_OBJECTS] = { NULL, NULL, NULL, NULL }; int16_t *pcmBuf = NULL; + RotFileReader *sceneOrientationFileReader = NULL; + RotFileReader *deviceOrientationFileReader = NULL; #ifdef DEBUGGING FILE *f_forcedModeProfile = NULL; #endif @@ -208,7 +217,15 @@ int main( reset_mem( USE_BYTES ); #endif - initArgStruct( &arg ); + uint8_t au[IVAS_MAX_BITS_PER_FRAME / 8]; + IVAS_RTP ivasRtp = { 0 }; + + /* Ideally ssrc is negotiated via SDP and sequence number is radomized but we + use fixed seed for random num generator for regression based tests. Any realtime + application should implement this initialization seperately */ + uint16_t rtpEncSeed = RANDOM_INITSEED_ENC; + uint32_t ssrc = ( (uint32_t) IVAS_RTP_OwnRandom( &rtpEncSeed ) & 0x0000FFFF ) | ( (uint32_t) IVAS_RTP_OwnRandom( &rtpEncSeed ) << 16 ); + uint16_t seqNumInitVal = IVAS_RTP_OwnRandom( &rtpEncSeed ); /*------------------------------------------------------------------------------------------* * Parse command-line arguments @@ -236,7 +253,7 @@ int main( const BS_WRITER_FORMAT bsWriterFormat = arg.mimeOutput ? BS_WRITER_FORMAT_MIME : BS_WRITER_FORMAT_G192; - if ( BS_Writer_Open_filename( &hBsWriter, arg.outputBitstreamFilename, bsWriterFormat ) != IVAS_ERR_OK ) + if ( !arg.rtpdumpOutput && BS_Writer_Open_filename( &hBsWriter, arg.outputBitstreamFilename, bsWriterFormat ) != IVAS_ERR_OK ) { fprintf( stderr, "\nCan't open %s\n\n", arg.outputBitstreamFilename ); goto cleanup; @@ -435,14 +452,14 @@ int main( if ( ( error = IVAS_ENC_ConfigureForSBAObjects( hIvasEnc, arg.inputFs, totalBitrate, bandwidth, arg.dtxConfig, arg.inputFormatConfig.sba_ism.numObjects, arg.inputFormatConfig.sba_ism.order, arg.inputFormatConfig.sba_ism.isPlanar, arg.pca ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_ENC_ConfigureForSBAObjects failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); - exit( -1 ); + goto cleanup; } break; case IVAS_ENC_INPUT_MASA_ISM: if ( ( error = IVAS_ENC_ConfigureForMASAObjects( hIvasEnc, arg.inputFs, totalBitrate, bandwidth, arg.dtxConfig, arg.inputFormatConfig.masa_ism.numObjects, arg.inputFormatConfig.masa_ism.masaVariant ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_ENC_ConfigureForMASAObjects failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); - exit( -1 ); + goto cleanup; } break; default: @@ -594,6 +611,49 @@ int main( } } + /*------------------------------------------------------------------------------------------* + * RTPDump + *------------------------------------------------------------------------------------------*/ + + if ( arg.rtpdumpOutput ) + { + if ( ( error = IVAS_RTP_WRITER_Init( &ivasRtp, arg.outputBitstreamFilename, arg.numFramesPerPacket, ssrc, seqNumInitVal ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open output bitstream file for RTP output %s \n\n", arg.outputBitstreamFilename ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Open scene orientation file + *------------------------------------------------------------------------------------------*/ + + if ( arg.sceneOrientationTrajFileName != NULL ) + { + if ( ( error = RotationFileReader_open( arg.sceneOrientationTrajFileName, &sceneOrientationFileReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open scene orientation file %s \n\n", arg.sceneOrientationTrajFileName ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Open device orientation file + *------------------------------------------------------------------------------------------*/ + + if ( arg.deviceOrientationTrajFileName != NULL ) + { + if ( ( error = RotationFileReader_open( arg.deviceOrientationTrajFileName, &deviceOrientationFileReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open device orientation file %s \n\n", arg.deviceOrientationTrajFileName ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Run the encoder + *------------------------------------------------------------------------------------------*/ + int16_t numSamplesRead = 0; uint16_t bitStream[IVAS_MAX_BITS_PER_FRAME]; uint16_t numBits = 0; @@ -681,7 +741,7 @@ int main( { if ( ( error = JbmFileReader_readCAconfig( jbmReader, &caConfig ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "JbmFileReader_readCAconfig() failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + fprintf( stderr, "\nError (%s) while reading Channel-Aware Config. from: %s\n\n", IVAS_ENC_GetErrorMessage( error ), JbmFileReader_getFilePath( jbmReader ) ); goto cleanup; } @@ -758,17 +818,73 @@ int main( } /* *** Encode one frame *** */ - if ( ( error = IVAS_ENC_EncodeFrameToSerial( hIvasEnc, pcmBuf, pcmBufSize, bitStream, &numBits ) ) != IVAS_ERR_OK ) + if ( ivasRtp.hPack ) { - fprintf( stderr, "\nencodeFrame failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); - goto cleanup; - } + bool isMono = ( arg.inputFormat == IVAS_ENC_INPUT_MONO ); + bool forcePacket = ( numSamplesRead < pcmBufSize ); /* If EoF force Packet generation */ + + ivasRtp.nWrittenPiData = 0; + + /* scene orientation */ + if ( sceneOrientationFileReader ) + { + PIDATA_TS *piDataTs = &ivasRtp.piData[ivasRtp.nWrittenPiData++]; + IVAS_PIDATA_ORIENTATION *scene = &piDataTs->data.scene; - /* write bitstream */ - if ( ( error = BS_Writer_WriteFrame_short( hBsWriter, bitStream, numBits, totalBitrate ) ) != IVAS_ERR_OK ) + memset( piDataTs, 0, sizeof( PIDATA_TS ) ); + scene->size = sizeof( IVAS_PIDATA_ORIENTATION ); + scene->piDataType = IVAS_PI_SCENE_ORIENTATION; + + if ( ( error = HeadRotationFileReading( sceneOrientationFileReader, &scene->orientation, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading scene orientation from %s\n", IVAS_ENC_GetErrorMessage( error ), RotationFileReader_getFilePath( sceneOrientationFileReader ) ); + goto cleanup; + } + } + + /* device orientation */ + if ( deviceOrientationFileReader ) + { + PIDATA_TS *piDataTs = &ivasRtp.piData[ivasRtp.nWrittenPiData++]; + IVAS_PIDATA_ORIENTATION *device = &piDataTs->data.deviceUnCompensated; + + memset( piDataTs, 0, sizeof( PIDATA_TS ) ); + device->size = sizeof( IVAS_PIDATA_ORIENTATION ); + device->piDataType = IVAS_PI_DEVICE_ORIENTATION_COMPENSATED; + + if ( ( error = HeadRotationFileReading( deviceOrientationFileReader, &device->orientation, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading device orientation from %s\n", IVAS_ENC_GetErrorMessage( error ), RotationFileReader_getFilePath( deviceOrientationFileReader ) ); + goto cleanup; + } + } + + if ( ( error = IVAS_ENC_EncodeFrameToCompact( hIvasEnc, pcmBuf, pcmBufSize, au, &numBits ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nencodeFrame failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = IVAS_RTP_WriteNextFrame( &ivasRtp, au, NULL, numBits, isMono, forcePacket ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while pushing audio frame to RTP pack\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + else { - fprintf( stderr, "\nBS_Writer_WriteFrame_short failed, error code %d\n\n", error ); - goto cleanup; + if ( ( error = IVAS_ENC_EncodeFrameToSerial( hIvasEnc, pcmBuf, pcmBufSize, bitStream, &numBits ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nencodeFrame failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + /* write bitstream */ + if ( ( error = BS_Writer_WriteFrame_short( hBsWriter, bitStream, numBits, totalBitrate ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nBS_Writer_WriteFrame_short failed, error code %d\n\n", error ); + goto cleanup; + } } frame++; @@ -838,6 +954,18 @@ cleanup: fclose( f_bitrateProfile ); } + if ( sceneOrientationFileReader ) + { + RotationFileReader_close( &sceneOrientationFileReader ); + } + + if ( deviceOrientationFileReader ) + { + RotationFileReader_close( &deviceOrientationFileReader ); + } + + IVAS_RTP_Term( &ivasRtp ); + IVAS_ENC_Close( &hIvasEnc ); #ifdef WMOPS @@ -853,11 +981,26 @@ cleanup: * Local functions *-------------------------------------------------------------------*/ -#define IVAS_DEFAULT_AGC ( 0 ) +/*---------------------------------------------------------------------* + * parseCmdlIVAS_enc() + * + * Encoder command-line parsing + *---------------------------------------------------------------------*/ -static void initArgStruct( EncArguments *arg ) +static bool parseCmdlIVAS_enc( + int16_t argc, + char *argv[], + EncArguments *arg ) { - /* Set default values here */ + int16_t i, j; + char argv_to_upper[FILENAME_MAX]; + char stmp[FILENAME_MAX]; + int32_t tmp; + + /*-----------------------------------------------------------------* + * Set default values + *-----------------------------------------------------------------*/ + arg->inputWavFilename = NULL; arg->outputBitstreamFilename = NULL; arg->inputFs = 0; @@ -878,6 +1021,9 @@ static void initArgStruct( EncArguments *arg ) arg->mimeOutput = false; arg->ism_extended_metadata = false; arg->complexityLevel = IVAS_ENC_COMPLEXITY_LEVEL_THREE; + arg->rtpdumpOutput = false; + arg->sceneOrientationTrajFileName = NULL; + arg->deviceOrientationTrajFileName = NULL; #ifdef DEBUGGING arg->forcedMode = IVAS_ENC_FORCE_UNFORCED; arg->forcedModeFile = NULL; @@ -887,25 +1033,9 @@ static void initArgStruct( EncArguments *arg ) #endif arg->pca = false; - return; -} - - -/*---------------------------------------------------------------------* - * parseCmdlIVAS_enc() - * - * Encoder command-line parsing - *---------------------------------------------------------------------*/ - -static bool parseCmdlIVAS_enc( - int16_t argc, - char *argv[], - EncArguments *arg ) -{ - int16_t i, j; - char argv_to_upper[FILENAME_MAX]; - char stmp[FILENAME_MAX]; - int32_t tmp; + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ if ( argc < 5 ) { @@ -1486,6 +1616,7 @@ static bool parseCmdlIVAS_enc( { fprintf( stderr, "Error: Too low number of ISM channels specified!\n\n" ); usage_enc(); + return false; } else { @@ -1497,6 +1628,7 @@ static bool parseCmdlIVAS_enc( { fprintf( stderr, "Error: Too high number of ISM channels!\n\n" ); usage_enc(); + return false; } } } @@ -1504,6 +1636,7 @@ static bool parseCmdlIVAS_enc( { fprintf( stderr, "Error: Number of ISM channels not specified!\n\n" ); usage_enc(); + return false; } if ( i < argc - 4 ) { @@ -1523,7 +1656,7 @@ static bool parseCmdlIVAS_enc( default: fprintf( stderr, "Error: MASA channels must be 1 or 2.\n\n" ); usage_enc(); - break; + return false; } } @@ -1548,6 +1681,7 @@ static bool parseCmdlIVAS_enc( { fprintf( stderr, "Error: not enough arguments\n\n" ); usage_enc(); + return false; } } @@ -1560,6 +1694,7 @@ static bool parseCmdlIVAS_enc( { fprintf( stderr, "Error: not enough MASA arguments\n\n" ); usage_enc(); + return false; } } else if ( strcmp( to_upper( argv[i] ), "-ISM_SBA" ) == 0 ) @@ -1578,6 +1713,7 @@ static bool parseCmdlIVAS_enc( { fprintf( stderr, "Error: Too low number of ISM channels specified!\n\n" ); usage_enc(); + return false; } else { @@ -1589,6 +1725,7 @@ static bool parseCmdlIVAS_enc( { fprintf( stderr, "Error: Too high number of ISM channels!\n\n" ); usage_enc(); + return false; } } } @@ -1596,6 +1733,7 @@ static bool parseCmdlIVAS_enc( { fprintf( stderr, "Error: Number of ISM channels not specified!\n\n" ); usage_enc(); + return false; } if ( i < argc - 4 ) @@ -1647,6 +1785,7 @@ static bool parseCmdlIVAS_enc( { fprintf( stderr, "Error: not enough arguments\n\n" ); usage_enc(); + return false; } } } @@ -1663,6 +1802,72 @@ static bool parseCmdlIVAS_enc( i++; } + /*-----------------------------------------------------------------* + * RTPDump output + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-RTPDUMP" ) == 0 ) + { + i++; + arg->rtpdumpOutput = true; + + if ( i < argc - 4 ) + { + if ( !is_digits_only( argv[i] ) ) + { + arg->numFramesPerPacket = 1; /* Default to 1 frame per packet */ + } + else + { + arg->numFramesPerPacket = atoi( argv[i++] ); + if ( arg->numFramesPerPacket > IVAS_MAX_FRAMES_PER_RTP_PACKET ) + { + fprintf( stderr, "numFramesPerPacket(%d) exceeds max frames per packet (%d) \n", arg->numFramesPerPacket, IVAS_MAX_FRAMES_PER_RTP_PACKET ); + arg->numFramesPerPacket = 1; + } + } + } + + fprintf( stdout, "Output format: RTPDump using %d frames/packet \n", arg->numFramesPerPacket ); + } + + /*-----------------------------------------------------------------* + * Scene orientation + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-SCENE_ORIENTATION" ) == 0 ) + { + i++; + if ( argc - i <= 4 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: Scene orientation file name not specified!\n\n" ); + usage_enc(); + return false; + } + + arg->sceneOrientationTrajFileName = argv[i]; + i++; + } + + /*-----------------------------------------------------------------* + * Device orientation + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-DEVICE_ORIENTATION" ) == 0 ) + { + i++; + if ( argc - i <= 4 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: Device orientation file name not specified!\n\n" ); + usage_enc(); + return false; + } + + arg->deviceOrientationTrajFileName = argv[i]; + i++; + } + + /*-----------------------------------------------------------------* * Option not recognized *-----------------------------------------------------------------*/ @@ -1875,6 +2080,12 @@ static void usage_enc( void ) #endif fprintf( stdout, "-q : Quiet mode, no frame counters\n" ); fprintf( stdout, " default is deactivated\n" ); + fprintf( stdout, "-rtpdump : RTPDump output, hf_only=1 by default. The encoder will packetize the \n" ); + fprintf( stdout, " bitstream frames into TS26.253 Annex A IVAS RTP Payload Format packets and \n" ); + fprintf( stdout, " writes those to the output file. In EVS mono operating mode, TS26.445 Annex A.2.2 \n" ); + fprintf( stdout, " EVS RTP Payload Format is used. Optional N represents number of frames per RTP packet\n" ); + fprintf( stdout, "-scene_orientation : Scene orientation trajectory file. Only used with rtpdump output.\n" ); + fprintf( stdout, "-device_orientation : Device orientation trajectory file. Only used with rtpdump output.\n" ); fprintf( stdout, "\n" ); return; diff --git a/apps/encoder_fmtsw.c b/apps/encoder_fmtsw.c new file mode 100644 index 0000000000000000000000000000000000000000..9ab7b017b80a2500baf8f3602ed389f454323a5f --- /dev/null +++ b/apps/encoder_fmtsw.c @@ -0,0 +1,2447 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "stl.h" +#include "lib_enc.h" +#include "cmdl_tools.h" +#include "audio_file_reader.h" +#include "bitstream_writer.h" +#include "ism_file_reader.h" +#include "jbm_file_reader.h" +#include "masa_file_reader.h" +#include "wmc_auto.h" +#include "rotation_file_reader.h" +#include "ivas_rtp_file.h" + +#ifdef DEBUG_FORCE_DIR +/* Windows does not define the S_ISREG and S_ISDIR macros in stat.h, so we do. + We have to define _CRT_INTERNAL_NONSTDC_NAMES 1 before #including sys/stat.h + in order for Microsoft's stat.h to define names like S_IFMT, S_IFREG, and S_IFDIR, + rather than just defining _S_IFMT, _S_IFREG, and _S_IFDIR as it normally does. */ +#include +#if !defined( S_ISREG ) && defined( S_IFMT ) && defined( S_IFREG ) +#define S_ISREG( m ) ( ( (m) &S_IFMT ) == S_IFREG ) +#endif +#if !defined( S_ISDIR ) && defined( S_IFMT ) && defined( S_IFDIR ) +#define S_ISDIR( m ) ( ( (m) &S_IFMT ) == S_IFDIR ) +#endif +#endif + +#define WMC_TOOL_SKIP + +/*------------------------------------------------------------------------------------------* + * Local constants, enums + *------------------------------------------------------------------------------------------*/ + +#define MAX_ARGV 20 /* maximum number of command line arguments that can be \ + in one line of the format switching file */ + +#if !defined( DEBUGGING ) && !defined( WMOPS ) +static +#endif + int32_t frame = 0; /* Counter of frames */ + +#define RANDOM_INITSEED_ENC ( 0xDEAF ) + +#define DEFAULT_FIXED_SID_RATE 8 /* DTX SID rate */ + +/* Additional config info for each input format */ +typedef union _EncInputFormatConfig +{ + /* MONO details */ + bool stereoToMonoDownmix; + +#ifdef DEBUGGING + /* STEREO details */ + IVAS_ENC_STEREO_MODE stereoMode; +#endif + + /* ISM details */ + struct EncIsmConfig + { + int16_t numObjects; + const char *metadataFiles[IVAS_MAX_NUM_OBJECTS]; + } ism; + + /* SBA details */ + struct EncSbaConfig + { + IVAS_ENC_SBA_ORDER order; + bool isPlanar; + } sba; + + /* MASA details */ + IVAS_ENC_MASA_VARIANT masaVariant; + + /* MC details */ + IVAS_ENC_MC_LAYOUT mcLayout; + + struct EncMasaIsmConfig + { + int16_t numObjects; + const char *metadataFiles[IVAS_MAX_NUM_OBJECTS]; + IVAS_ENC_MASA_VARIANT masaVariant; + } masa_ism; + + struct EncSbaIsmConfig + { + int16_t numObjects; + const char *metadataFiles[IVAS_MAX_NUM_OBJECTS]; + IVAS_ENC_SBA_ORDER order; + bool isPlanar; + } sba_ism; + +} EncInputFormatConfig; + + +/*------------------------------------------------------------------------------------------* + * Local structure for storing cmdln arguments + *------------------------------------------------------------------------------------------*/ + +typedef struct +{ + char *inputWavFilename; + char *outputBitstreamFilename; + int32_t inputFs; + IVAS_ENC_INPUT_FORMAT inputFormat; + bool is_binaural; + EncInputFormatConfig inputFormatConfig; + bool max_bwidth_user; + IVAS_ENC_BANDWIDTH maxBandwidth; + const char *bandwithProfileFile; + IVAS_ENC_DTX_CONFIG dtxConfig; + int32_t initBitrate; + const char *bitrateProfileFile; + bool quietModeEnabled; + bool delayCompensationEnabled; + const char *masaMetadataFile; + IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig; + const char *ca_config_file; + bool mimeOutput; + IVAS_ENC_COMPLEXITY_LEVEL complexityLevel; +#ifdef DEBUGGING + IVAS_ENC_FORCED_MODE forcedMode; + const char *forcedModeFile; +#ifdef DEBUG_FORCE_DIR + const char *forcedModeDir; +#endif +#endif + bool pca; + bool ism_extended_metadata; + bool rtpdumpOutput; + uint32_t numFramesPerPacket; + char *sceneOrientationTrajFileName; + char *deviceOrientationTrajFileName; + +} EncArguments; + + +/*------------------------------------------------------------------------------------------* + * Local functions prototypes + *------------------------------------------------------------------------------------------*/ + +static bool parseCmdlIVAS_enc( int16_t argc, char *argv[], EncArguments *arg ); +static void usage_enc( void ); +static bool readBandwidth( FILE *file, IVAS_ENC_BANDWIDTH *bandwidth, int32_t *bandwidthFrameCounter ); +static bool readBitrate( FILE *file, int32_t *bitrate ); +#ifdef DEBUGGING +static ivas_error readForcedMode( FILE *file, IVAS_ENC_FORCED_MODE *forcedMode, int32_t *forceFrameCounter ); +static IVAS_ENC_FORCED_MODE parseForcedMode( char *forcedModeChar ); +#endif +static void str2arg( char *str, int *argc_local, char *argv_local[] ); +static int encoder_main( int argc, char *argv[], IVAS_RTP *ivasRtp, int init_RtpWriter ); + +/*------------------------------------------------------------------------------------------* + * main() + * + * Main IVAS encoder function for command-line interface + * supporting IVAS format switching + *------------------------------------------------------------------------------------------*/ + +int main( + int argc, + char *argv[] ) +{ + bool mainFailed = true; /* Assume main failed until cleanup is reached without errors */ + FILE *FmtSWFile = NULL; + char line[2048]; + int argc_local = 0; + char *argv_local[MAX_ARGV] = { 0 }; + IVAS_RTP ivasRtp = { 0 }; + char prev_outputBitstreamFilename[2048] = { 0 }; + int rtp_term = 0; + + IVAS_ENC_PrintDisclaimer(); + + if ( argc != 2 ) + { + fprintf( stdout, "Usage: IVAS_cod_fmtsw.exe format_switching_file\n\n" ); + fprintf( stdout, "where format_switching_file is a text file containing a valid encoder command line in each line\n\n" ); + goto cleanup; + } + fprintf( stdout, "Input format switching file: %s\n", argv[1] ); + + if ( ( FmtSWFile = fopen( argv[1], "r" ) ) == NULL ) + { + fprintf( stdout, "error: cannot open format switching file %s\n", argv[1] ); + goto cleanup; + } + + while ( fgets( line, sizeof( line ), FmtSWFile ) ) + { + /* remove trimming newline */ + line[strcspn( line, "\r\n" )] = 0; + printf( "Processing format switching commandline: %s\n", line ); + str2arg( line, &argc_local, argv_local ); + + if ( strcmp( argv_local[argc_local - 1], (char *) prev_outputBitstreamFilename ) == 0 ) + { + /* append to last Rtp file */ + if ( encoder_main( argc_local, argv_local, &ivasRtp, 0 ) != 0 ) + { + goto cleanup; + } + } + else + { + if ( rtp_term == 1 ) + { + IVAS_RTP_Term( &ivasRtp ); + } + + /* write in separate Rtp file */ + if ( encoder_main( argc_local, argv_local, &ivasRtp, 1 ) != 0 ) + { + goto cleanup; + } + + rtp_term = 1; + } + strcpy( (char *) prev_outputBitstreamFilename, argv_local[argc_local - 1] ); + } + + /*------------------------------------------------------------------------------------------* + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ + + mainFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ + +cleanup: + + IVAS_RTP_Term( &ivasRtp ); + if ( FmtSWFile ) + { + fclose( FmtSWFile ); + } + + return mainFailed ? -1 : 0; +} + + +/*-------------------------------------------------------------------* + * Local functions + *-------------------------------------------------------------------*/ + +void str2arg( + char *str, /* input string */ + int *argc_local, /* number of argument */ + char *argv_local[] /* array of arguments */ +) +{ + int i = 0; + char *token = strtok( str, " " ); + while ( token && ( i < MAX_ARGV - 1 ) ) + { + argv_local[i++] = token; + token = strtok( 0, " " ); + } + argv_local[i] = 0; + *argc_local = i; + return; +} + +int encoder_main( + int argc, + char *argv[], + IVAS_RTP *ivasRtp, + int init_RtpWriter ) +{ + bool mainFailed = true; /* Assume main failed until cleanup is reached without errors */ + EncArguments arg; + int16_t i; + ivas_error error = IVAS_ERR_UNKNOWN; + + /* Any handles that require cleanup must be declared here and initialized to NULL */ + IVAS_ENC_HANDLE hIvasEnc = NULL; + BS_WRITER_HANDLE hBsWriter = NULL; + AudioFileReader *audioReader = NULL; + FILE *f_bitrateProfile = NULL; + FILE *f_bwProfile = NULL; + JbmFileReader *jbmReader = NULL; + MasaFileReader *masaReader = NULL; + IsmFileReader *ismReaders[IVAS_MAX_NUM_OBJECTS] = { NULL, NULL, NULL, NULL }; + int16_t *pcmBuf = NULL; + RotFileReader *sceneOrientationFileReader = NULL; + RotFileReader *deviceOrientationFileReader = NULL; +#ifdef DEBUGGING + FILE *f_forcedModeProfile = NULL; +#endif + +#ifdef WMOPS + reset_wmops(); + reset_mem( USE_BYTES ); +#endif + + uint8_t au[IVAS_MAX_BITS_PER_FRAME / 8]; + /* IVAS_RTP ivasRtp = { 0 }; */ + + /* Ideally ssrc is negotiated via SDP and sequence number is radomized but we + use fixed seed for random num generator for regression based tests. Any realtime + application should implement this initialization seperately */ + uint16_t rtpEncSeed = RANDOM_INITSEED_ENC; + uint32_t ssrc = ( (uint32_t) IVAS_RTP_OwnRandom( &rtpEncSeed ) & 0x0000FFFF ) | ( (uint32_t) IVAS_RTP_OwnRandom( &rtpEncSeed ) << 16 ); + uint16_t seqNumInitVal = IVAS_RTP_OwnRandom( &rtpEncSeed ); + + /*------------------------------------------------------------------------------------------* + * Parse command-line arguments + *------------------------------------------------------------------------------------------*/ + + if ( !parseCmdlIVAS_enc( (int16_t) argc, argv, &arg ) ) + { + /* Error printout done internally in parseCmdlIVAS_enc() */ + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Open and initialize IVAS encoder + *------------------------------------------------------------------------------------------*/ + if ( ( error = IVAS_ENC_Open_fx( &hIvasEnc ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Opening IVAS encoder failed: %s\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + /*------------------------------------------------------------------------------------------* + * Open output bitstream file + *------------------------------------------------------------------------------------------*/ + + const BS_WRITER_FORMAT bsWriterFormat = arg.mimeOutput ? BS_WRITER_FORMAT_MIME : BS_WRITER_FORMAT_G192; + + if ( !arg.rtpdumpOutput && BS_Writer_Open_filename( &hBsWriter, arg.outputBitstreamFilename, bsWriterFormat ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCan't open %s\n\n", arg.outputBitstreamFilename ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Print out file names + *------------------------------------------------------------------------------------------*/ + + if ( arg.inputFormat == IVAS_ENC_INPUT_ISM || arg.inputFormat == IVAS_ENC_INPUT_SBA_ISM ) + { + for ( i = 0; i < arg.inputFormatConfig.ism.numObjects; i++ ) + { + fprintf( stdout, "Object %d input metadata: %s\n", i + 1, arg.inputFormatConfig.ism.metadataFiles[i] ); + } + } + + if ( arg.masaMetadataFile != NULL ) + { + fprintf( stdout, "MASA inp. metadata file: %s\n", arg.masaMetadataFile ); + } + + fprintf( stdout, "Input audio file: %s\n", arg.inputWavFilename ); + fprintf( stdout, "Output bitstream file: %s\n\n", arg.outputBitstreamFilename ); + + /*------------------------------------------------------------------------------------------* + * Open auxiliary input files + *------------------------------------------------------------------------------------------*/ + + int32_t totalBitrate = arg.initBitrate; + + if ( arg.bitrateProfileFile ) + { + if ( ( f_bitrateProfile = fopen( arg.bitrateProfileFile, "rb" ) ) == NULL ) + { + fprintf( stderr, "Error: bitrate profile file %s could not be opened\n\n", arg.bitrateProfileFile ); + usage_enc(); + goto cleanup; + } + + if ( !readBitrate( f_bitrateProfile, &totalBitrate ) ) + { + fprintf( stderr, "Error: bitrate profile file %s could not be read\n\n", arg.bitrateProfileFile ); + goto cleanup; + } + rewind( f_bitrateProfile ); + + fprintf( stdout, "Bitrate switching file: %s\n", arg.bitrateProfileFile ); + } + + int32_t bandwidthFrameCounter = 0; + IVAS_ENC_BANDWIDTH bandwidth = arg.maxBandwidth; + + if ( arg.bandwithProfileFile ) + { + if ( ( f_bwProfile = fopen( arg.bandwithProfileFile, "rb" ) ) == NULL ) + { + fprintf( stderr, "Error: incorrect bandwidth specification or the bandwidth profile file could not be opened: %s\n\n", arg.bandwithProfileFile ); + usage_enc(); + goto cleanup; + } + fprintf( stdout, "Bandwidth switching file: %s\n", arg.bandwithProfileFile ); + + if ( !readBandwidth( f_bwProfile, &bandwidth, &bandwidthFrameCounter ) ) + { + fprintf( stderr, "Error: bandwidth switching file %s could not be read\n\n", arg.bandwithProfileFile ); + goto cleanup; + } + rewind( f_bwProfile ); + bandwidthFrameCounter = 0; + } + else + { + if ( bandwidth == IVAS_ENC_BANDWIDTH_NB && arg.inputFormat != IVAS_ENC_INPUT_MONO ) + { + fprintf( stdout, "\nNB coding not supported in IVAS. Switching to WB.\n\n" ); + } + else + { + switch ( bandwidth ) + { + case IVAS_ENC_BANDWIDTH_UNDEFINED: + break; + case IVAS_ENC_BANDWIDTH_NB: + fprintf( stdout, "Max. encoded bandwidth: NB\n" ); + break; + case IVAS_ENC_BANDWIDTH_WB: + fprintf( stdout, "Max. encoded bandwidth: WB\n" ); + break; + case IVAS_ENC_BANDWIDTH_SWB: + fprintf( stdout, "Max. encoded bandwidth: SWB\n" ); + break; + case IVAS_ENC_BANDWIDTH_FB: + fprintf( stdout, "Max. encoded bandwidth: FB\n" ); + break; + default: + fprintf( stderr, "Error: Invalid bandwidth value\n" ); + usage_enc(); + goto cleanup; + } + } + } + + /*------------------------------------------------------------------------------------------* + * Handle Channel-aware mode + *------------------------------------------------------------------------------------------*/ + + IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig = arg.caConfig; + + if ( arg.ca_config_file ) + { + if ( ( jbmReader = JbmFileReader_open( arg.ca_config_file ) ) == NULL ) + { + fprintf( stderr, "\nError: Channel aware configuration file could not be opened: %s\n\n", arg.ca_config_file ); + usage_enc(); + goto cleanup; + } + + fprintf( stdout, "Channel-aware mode: ON, config file: %s \n", arg.ca_config_file ); + } + else if ( caConfig.channelAwareModeEnabled ) + { + fprintf( stdout, "Channel-aware mode: ON, FEC indicator : %s FEC offset: %d \n\n", ( caConfig.fec_indicator == IVAS_ENC_FEC_LO ) ? "LO" : "HI", caConfig.fec_offset ); + } + + if ( arg.inputFormat != IVAS_ENC_INPUT_MONO && ( caConfig.channelAwareModeEnabled || arg.ca_config_file ) ) + { + fprintf( stderr, "Channel-aware mode is not supported in IVAS.\n\n" ); + usage_enc(); + goto cleanup; + } + +#ifdef SUPPORT_FORCE_TCX10_TCX20 +#ifdef DEBUGGING + if ( arg.forcedMode == IVAS_ENC_FORCE_TCX10 && totalBitrate < 48000 ) + { + fprintf( stderr, "Warning: Enforcing the TCX10 mode is only supported for bitrates higher or equal than 48 kbps!\n\n" ); + } +#endif +#endif + + /*------------------------------------------------------------------------------------------* + * Configure and initialize (allocate memory for static variables) the encoder + *------------------------------------------------------------------------------------------*/ + + switch ( arg.inputFormat ) + { + case IVAS_ENC_INPUT_MONO: + if ( ( error = IVAS_ENC_ConfigureForMono( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, caConfig, arg.inputFormatConfig.stereoToMonoDownmix, arg.is_binaural ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForMono failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + break; + case IVAS_ENC_INPUT_STEREO: +#ifdef DEBUGGING + if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.is_binaural, arg.inputFormatConfig.stereoMode ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.is_binaural ) ) != IVAS_ERR_OK ) +#endif + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForStereo failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + break; + case IVAS_ENC_INPUT_ISM: + if ( ( error = IVAS_ENC_ConfigureForObjects( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.ism.numObjects, arg.ism_extended_metadata ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForObjects failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + break; + case IVAS_ENC_INPUT_SBA: + if ( ( error = IVAS_ENC_ConfigureForAmbisonics( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.sba.order, arg.inputFormatConfig.sba.isPlanar, + arg.pca ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForAmbisonics failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + break; + case IVAS_ENC_INPUT_MASA: + if ( ( error = IVAS_ENC_ConfigureForMasa( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.masaVariant ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForMasa failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + break; + case IVAS_ENC_INPUT_MC: + if ( ( error = IVAS_ENC_ConfigureForMultichannel( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.mcLayout ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForMultichannel failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + break; + case IVAS_ENC_INPUT_SBA_ISM: + if ( ( error = IVAS_ENC_ConfigureForSBAObjects( hIvasEnc, arg.inputFs, totalBitrate, bandwidth, arg.dtxConfig, arg.inputFormatConfig.sba_ism.numObjects, arg.inputFormatConfig.sba_ism.order, arg.inputFormatConfig.sba_ism.isPlanar, arg.pca ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForSBAObjects failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + break; + case IVAS_ENC_INPUT_MASA_ISM: + if ( ( error = IVAS_ENC_ConfigureForMASAObjects( hIvasEnc, arg.inputFs, totalBitrate, bandwidth, arg.dtxConfig, arg.inputFormatConfig.masa_ism.numObjects, arg.inputFormatConfig.masa_ism.masaVariant ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_ConfigureForMASAObjects failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + break; + default: + fprintf( stderr, "\nInvalid input type\n\n" ); + goto cleanup; + } + + if ( ( error = IVAS_ENC_PrintConfig( hIvasEnc, caConfig.channelAwareModeEnabled ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\n IVAS_ENC_PrintConfig failed %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Open input audio file + *------------------------------------------------------------------------------------------*/ + + if ( AudioFileReader_open( &audioReader, arg.inputWavFilename ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCan't open %s\n\n", arg.inputWavFilename ); + goto cleanup; + } + + /* Validate input sampling rate */ + int32_t inFileSampleRate = 0; + error = AudioFileReader_getSamplingRate( audioReader, &inFileSampleRate ); + switch ( error ) + { + case IVAS_ERR_OK: + if ( inFileSampleRate != arg.inputFs ) + { + fprintf( stderr, "\nSampling rate mismatch: %d Hz requested, but %d Hz found in file %s\n\n", arg.inputFs, inFileSampleRate, arg.inputWavFilename ); + goto cleanup; + } + break; + case IVAS_ERR_SAMPLING_RATE_UNKNOWN: + /* IVAS_ERR_SAMPLING_RATE_UNKNOWN will be returned for raw PCM files. + * Nothing to check here */ + break; + default: + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + /* Validate number of channels */ + int16_t encInNumChannels = 0; + if ( ( error = IVAS_ENC_GetNumInChannels( hIvasEnc, &encInNumChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + int16_t inFileNumChannels = 0; + error = AudioFileReader_getNumChannels( audioReader, &inFileNumChannels ); + switch ( error ) + { + case IVAS_ERR_OK: + if ( inFileNumChannels != encInNumChannels ) + { + fprintf( stderr, "\nNumber of input audio channels mismatch: %d accepted by encoder, but %d found in file %s\n\n", encInNumChannels, inFileNumChannels, arg.inputWavFilename ); + goto cleanup; + } + break; + case IVAS_ERR_NUM_CHANNELS_UNKNOWN: + /* IVAS_ERR_NUM_CHANNELS_UNKNOWN will be returned for raw PCM files. + * Nothing to check here */ + break; + default: + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Open input metadata files + *------------------------------------------------------------------------------------------*/ + + if ( arg.masaMetadataFile ) + { + if ( ( masaReader = MasaFileReader_open( arg.masaMetadataFile ) ) == NULL ) + { + fprintf( stderr, "\nError: MASA input metadata file %s could not be opened\n\n", arg.masaMetadataFile ); + usage_enc(); + goto cleanup; + } + } + + const int16_t numIsmInputs = ( arg.inputFormat == IVAS_ENC_INPUT_ISM || arg.inputFormat == IVAS_ENC_INPUT_MASA_ISM || arg.inputFormat == IVAS_ENC_INPUT_SBA_ISM ) ? arg.inputFormatConfig.ism.numObjects : 0; + + for ( i = 0; i < numIsmInputs; ++i ) + { + if ( arg.inputFormatConfig.ism.metadataFiles[i] != NULL ) + { + if ( ( ismReaders[i] = IsmFileReader_open( arg.inputFormatConfig.ism.metadataFiles[i] ) ) == NULL ) + { + fprintf( stderr, "\nError: ISM input metadata file %s could not be opened\n\n", arg.inputFormatConfig.ism.metadataFiles[i] ); + usage_enc(); + goto cleanup; + } + } + } + +#ifdef DEBUGGING + IVAS_ENC_FORCED_MODE forcedMode = arg.forcedMode; + int32_t force_profile_cnt = 0; + + if ( arg.forcedModeFile ) + { + if ( ( f_forcedModeProfile = fopen( arg.forcedModeFile, "rb" ) ) == NULL ) + { + fprintf( stderr, "\nError: Incorrect mode specification or the profile file could not be opened: %s\n\n", arg.forcedModeFile ); + usage_enc(); + goto cleanup; + } + } +#endif + + /*------------------------------------------------------------------------------------------* + * Allocate input data buffer + *------------------------------------------------------------------------------------------*/ + + int16_t pcmBufSize; + if ( ( error = IVAS_ENC_GetInputBufferSize( hIvasEnc, &pcmBufSize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nGetInputBufferSize failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + pcmBuf = malloc( pcmBufSize * sizeof( int16_t ) ); + + /*------------------------------------------------------------------------------------------* + * Compensate for encoder delay (bitstream aligned with input signal) + *------------------------------------------------------------------------------------------*/ + + int16_t encDelayInSamples; + if ( ( error = IVAS_ENC_GetDelay( hIvasEnc, &encDelayInSamples ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nGetDelay failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( arg.delayCompensationEnabled && encDelayInSamples ) + { + /* read samples and throw them away */ + int16_t numSamplesRead = 0; + if ( ( error = AudioFileReader_read( audioReader, pcmBuf, encDelayInSamples, &numSamplesRead ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError reading from file %s\n%s\n", arg.inputWavFilename, IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * RTPDump + *------------------------------------------------------------------------------------------*/ + + if ( arg.rtpdumpOutput && init_RtpWriter ) + { + if ( ( error = IVAS_RTP_WRITER_Init( ivasRtp, arg.outputBitstreamFilename, arg.numFramesPerPacket, ssrc, seqNumInitVal ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open output bitstream file for RTP output %s \n\n", arg.outputBitstreamFilename ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Open scene orientation file + *------------------------------------------------------------------------------------------*/ + + if ( arg.sceneOrientationTrajFileName != NULL ) + { + if ( ( error = RotationFileReader_open( arg.sceneOrientationTrajFileName, &sceneOrientationFileReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open scene orientation file %s \n\n", arg.sceneOrientationTrajFileName ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Open device orientation file + *------------------------------------------------------------------------------------------*/ + + if ( arg.deviceOrientationTrajFileName != NULL ) + { + if ( ( error = RotationFileReader_open( arg.deviceOrientationTrajFileName, &deviceOrientationFileReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open device orientation file %s \n\n", arg.deviceOrientationTrajFileName ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Run the encoder + *------------------------------------------------------------------------------------------*/ + + int16_t numSamplesRead = 0; + uint16_t bitStream[IVAS_MAX_BITS_PER_FRAME]; + uint16_t numBits = 0; + + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "\n------ Running the encoder ------\n\n" ); + fprintf( stdout, "Frames processed: " ); + } + else + { + fprintf( stdout, "\n\n-- Start the encoder (quiet mode) --\n\n" ); + } + +#ifdef WMOPS + reset_stack(); + reset_wmops(); +#endif + + /*------------------------------------------------------------------------------------------* + * Loop for every frame of input data + * - Read the input data + * - Process switching files + * - Read input metadata + * - Run the encoder + * - Write the parameters into output bitstream file + *------------------------------------------------------------------------------------------*/ + + while ( 1 ) + { + /* Read the input data */ + if ( ( error = AudioFileReader_read( audioReader, pcmBuf, pcmBufSize, &numSamplesRead ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError reading from file %s\n%s\n", arg.inputWavFilename, IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( numSamplesRead == 0 ) + { + /* end of input data */ + break; + } + + /* Zero-pad if not enough samples were read (expected in last frame) */ + if ( numSamplesRead < pcmBufSize ) + { + for ( i = numSamplesRead; i < pcmBufSize; ++i ) + { + pcmBuf[i] = 0; + } + } + + /* Process switching files */ + if ( f_bitrateProfile ) + { + if ( !readBitrate( f_bitrateProfile, &totalBitrate ) ) + { + fprintf( stderr, "Error: bitrate profile file %s could not be read\n\n", arg.bitrateProfileFile ); + goto cleanup; + } + + if ( ( error = IVAS_ENC_SetBitrate( hIvasEnc, totalBitrate ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_SetBitrate failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + if ( f_bwProfile ) + { + if ( !readBandwidth( f_bwProfile, &bandwidth, &bandwidthFrameCounter ) ) + { + fprintf( stderr, "Error: bandwidth switching file %s could not be read\n\n", arg.bandwithProfileFile ); + goto cleanup; + } + + if ( ( error = IVAS_ENC_SetBandwidth( hIvasEnc, bandwidth ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_SetBandwidth failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + if ( jbmReader ) + { + if ( ( error = JbmFileReader_readCAconfig( jbmReader, &caConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError (%s) while reading Channel-Aware Config. from: %s\n\n", IVAS_ENC_GetErrorMessage( error ), JbmFileReader_getFilePath( jbmReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_ENC_SetChannelAwareConfig( hIvasEnc, caConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "IVAS_ENC_SetChannelAwareConfig failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + +#ifdef DEBUGGING + if ( f_forcedModeProfile ) + { + if ( ( error = readForcedMode( f_forcedModeProfile, &forcedMode, &force_profile_cnt ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError reading from file: %s\n%s\n", arg.forcedModeFile, IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* Force mode not set when configuring, set in first frame even if not reading from file */ + if ( f_forcedModeProfile || frame == 0 ) + { + if ( ( error = IVAS_ENC_SetForcedMode( hIvasEnc, forcedMode +#ifdef DEBUG_FORCE_DIR + , + arg.forcedModeDir +#endif + ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_ENC_SetForcedMode failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } +#endif + + /* Read ISM input metadata */ + for ( i = 0; i < numIsmInputs; ++i ) + { + if ( ismReaders[i] == NULL ) + { + continue; + } + + IVAS_ISM_METADATA ismMetadata; + if ( ( error = IsmFileReader_readNextFrame( ismReaders[i], &ismMetadata ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError (%s) while reading ism metadata from: %s\n\n", IVAS_ENC_GetErrorMessage( error ), IsmFileReader_getFilePath( ismReaders[i] ) ); + goto cleanup; + } + + if ( ( error = IVAS_ENC_FeedObjectMetadata( hIvasEnc, i, ismMetadata ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nfeed_ISM_metadata failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* Read MASA input metadata */ + if ( masaReader ) + { + if ( ( error = MasaFileReader_readNextFrame( masaReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError (%s) while reading masa metadata from: %s\n\n", IVAS_ENC_GetErrorMessage( error ), arg.masaMetadataFile ); + goto cleanup; + } + IVAS_MASA_METADATA_HANDLE hMetadata = MasaFileReader_getMetadataHandle( masaReader ); + + if ( ( error = IVAS_ENC_FeedMasaMetadata( hIvasEnc, hMetadata ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nfeed_MASA_frame failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* *** Encode one frame *** */ + if ( ivasRtp->hPack ) + { + bool isMono = ( arg.inputFormat == IVAS_ENC_INPUT_MONO ); + bool forcePacket = ( numSamplesRead < pcmBufSize ); /* If EoF force Packet generation */ + + ivasRtp->nWrittenPiData = 0; + + /* scene orientation */ + if ( sceneOrientationFileReader ) + { + PIDATA_TS *piDataTs = &ivasRtp->piData[ivasRtp->nWrittenPiData++]; + IVAS_PIDATA_ORIENTATION *scene = &piDataTs->data.scene; + + memset( piDataTs, 0, sizeof( PIDATA_TS ) ); + scene->size = sizeof( IVAS_PIDATA_ORIENTATION ); + scene->piDataType = IVAS_PI_SCENE_ORIENTATION; + + if ( ( error = HeadRotationFileReading( sceneOrientationFileReader, &scene->orientation, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading scene orientation from %s\n", IVAS_ENC_GetErrorMessage( error ), RotationFileReader_getFilePath( sceneOrientationFileReader ) ); + goto cleanup; + } + } + + /* device orientation */ + if ( deviceOrientationFileReader ) + { + PIDATA_TS *piDataTs = &ivasRtp->piData[ivasRtp->nWrittenPiData++]; + IVAS_PIDATA_ORIENTATION *device = &piDataTs->data.deviceUnCompensated; + + memset( piDataTs, 0, sizeof( PIDATA_TS ) ); + device->size = sizeof( IVAS_PIDATA_ORIENTATION ); + device->piDataType = IVAS_PI_DEVICE_ORIENTATION_COMPENSATED; + + if ( ( error = HeadRotationFileReading( deviceOrientationFileReader, &device->orientation, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading device orientation from %s\n", IVAS_ENC_GetErrorMessage( error ), RotationFileReader_getFilePath( deviceOrientationFileReader ) ); + goto cleanup; + } + } + + if ( ( error = IVAS_ENC_EncodeFrameToCompact( hIvasEnc, pcmBuf, pcmBufSize, au, &numBits ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nencodeFrame failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = IVAS_RTP_WriteNextFrame( ivasRtp, au, NULL, numBits, isMono, forcePacket ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while pushing audio frame to RTP pack\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + } + else + { + if ( ( error = IVAS_ENC_EncodeFrameToSerial( hIvasEnc, pcmBuf, pcmBufSize, bitStream, &numBits ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nencodeFrame failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); + goto cleanup; + } + + /* write bitstream */ + if ( ( error = BS_Writer_WriteFrame_short( hBsWriter, bitStream, numBits, totalBitrate ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nBS_Writer_WriteFrame_short failed, error code %d\n\n", error ); + goto cleanup; + } + } + + frame++; + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); + } + +#ifdef WMOPS + update_mem(); + update_wmops(); +#endif + } + + if ( arg.quietModeEnabled ) + { + fprintf( stdout, "Encoding finished\n" ); + } + else + { + fprintf( stdout, "\n\nEncoding of %d frames finished\n", frame ); + } + + /*------------------------------------------------------------------------------------------* + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ + + mainFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ + +cleanup: + + free( pcmBuf ); + + if ( ( error = BS_Writer_Close( &hBsWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Can't close bitstream writer, error code %d\n", error ); + mainFailed = true; + } + + AudioFileReader_close( &audioReader ); + + if ( jbmReader ) + { + JbmFileReader_close( &jbmReader ); + } + + for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i ) + { + if ( ismReaders[i] != NULL ) + { + IsmFileReader_close( &ismReaders[i] ); + } + } + + if ( masaReader ) + { + MasaFileReader_close( &masaReader ); + } + + if ( f_bwProfile ) + { + fclose( f_bwProfile ); + } + + if ( f_bitrateProfile ) + { + fclose( f_bitrateProfile ); + } + + if ( sceneOrientationFileReader ) + { + RotationFileReader_close( &sceneOrientationFileReader ); + } + + if ( deviceOrientationFileReader ) + { + RotationFileReader_close( &deviceOrientationFileReader ); + } + + /* IVAS_RTP_Term( &ivasRtp ); */ + + IVAS_ENC_Close( &hIvasEnc ); + +#ifdef WMOPS + print_wmops(); + print_mem( NULL ); +#endif + + return mainFailed ? -1 : 0; +} + + +/*---------------------------------------------------------------------* + * parseCmdlIVAS_enc() + * + * Encoder command-line parsing + *---------------------------------------------------------------------*/ + +static bool parseCmdlIVAS_enc( + int16_t argc, + char *argv[], + EncArguments *arg ) +{ + int16_t i, j; + char argv_to_upper[FILENAME_MAX]; + char stmp[FILENAME_MAX]; + int32_t tmp; + + /*-----------------------------------------------------------------* + * Set default values + *-----------------------------------------------------------------*/ + + arg->inputWavFilename = NULL; + arg->outputBitstreamFilename = NULL; + arg->inputFs = 0; + arg->inputFormat = IVAS_ENC_INPUT_MONO; + arg->is_binaural = false; + arg->inputFormatConfig.stereoToMonoDownmix = false; + arg->max_bwidth_user = false; + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_UNDEFINED; + arg->bandwithProfileFile = NULL; + arg->dtxConfig = IVAS_ENC_GetDefaultDtxConfig(); + arg->initBitrate = 0; + arg->bitrateProfileFile = NULL; + arg->quietModeEnabled = false; + arg->delayCompensationEnabled = true; + arg->masaMetadataFile = NULL; + arg->caConfig = IVAS_ENC_GetDefaultChannelAwareConfig(); + arg->ca_config_file = NULL; + arg->mimeOutput = false; + arg->ism_extended_metadata = false; + arg->complexityLevel = IVAS_ENC_COMPLEXITY_LEVEL_THREE; + arg->rtpdumpOutput = false; + arg->sceneOrientationTrajFileName = NULL; + arg->deviceOrientationTrajFileName = NULL; +#ifdef DEBUGGING + arg->forcedMode = IVAS_ENC_FORCE_UNFORCED; + arg->forcedModeFile = NULL; +#ifdef DEBUG_FORCE_DIR + arg->forcedModeDir = NULL; +#endif +#endif + arg->pca = false; + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + if ( argc < 5 ) + { + fprintf( stderr, "Error: Not enough input parameters. Exiting!\n\n" ); + usage_enc(); + return false; + } + + /*-----------------------------------------------------------------* + * Optional input arguments + *-----------------------------------------------------------------*/ + + i = 1; + while ( i < argc - 4 ) + { + strncpy( argv_to_upper, argv[i], sizeof( argv_to_upper ) - 1 ); + argv_to_upper[sizeof( argv_to_upper ) - 1] = '\0'; + to_upper( argv_to_upper ); + + /*-----------------------------------------------------------------* + * Bandwidth limitation + *-----------------------------------------------------------------*/ + + if ( strcmp( argv_to_upper, "-MAX_BAND" ) == 0 ) + { + arg->max_bwidth_user = true; + + strncpy( stmp, argv[i + 1], sizeof( stmp ) - 1 ); + stmp[sizeof( stmp ) - 1] = '\0'; + to_upper( stmp ); + + if ( strcmp( stmp, "-NB" ) == 0 || strcmp( stmp, "NB" ) == 0 ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_NB; + } + else if ( strcmp( stmp, "-WB" ) == 0 || strcmp( stmp, "WB" ) == 0 ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_WB; + } + else if ( strcmp( stmp, "-SWB" ) == 0 || strcmp( stmp, "SWB" ) == 0 ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_SWB; + } + else if ( strcmp( stmp, "-FB" ) == 0 || strcmp( stmp, "FB" ) == 0 ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_FB; + } + else + { + arg->bandwithProfileFile = argv[i + 1]; + } + + i += 2; + } + + /*-----------------------------------------------------------------* + * Quiet mode + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-Q" ) == 0 ) + { + i++; + arg->quietModeEnabled = true; + } + + /*-----------------------------------------------------------------* + * DTX/CNG + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-DTX" ) == 0 ) + { + i++; + if ( i < argc - 4 ) + { + if ( sscanf( argv[i], "%d", &tmp ) <= 0 ) + { + tmp = DEFAULT_FIXED_SID_RATE; + } + else + { + i++; + } + } + else + { + tmp = DEFAULT_FIXED_SID_RATE; + } + + arg->dtxConfig.enabled = true; + + if ( tmp == 0 ) + { + arg->dtxConfig.variable_SID_rate = true; + arg->dtxConfig.SID_interval = 0; + } + else if ( tmp >= 3 && tmp <= 100 ) + { + arg->dtxConfig.variable_SID_rate = false; + arg->dtxConfig.SID_interval = (int16_t) tmp; + } + else + { + fprintf( stderr, "Error: Incorrect SID update interval specified: %d (supported 3-100)\n\n", tmp ); + usage_enc(); + return false; + } + } +#ifdef DEBUGGING + /*-----------------------------------------------------------------* + * Force specific mode + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-FORCE" ) == 0 ) + { + strncpy( stmp, argv[i + 1], sizeof( stmp ) ); + + arg->forcedMode = parseForcedMode( stmp ); + +#ifdef DEBUG_FORCE_DIR + if ( arg->forcedMode < IVAS_ENC_FORCE_FILE ) + { + fprintf( stdout, "Forcing codec to: %s\n", argv[i + 1] ); + } + else if ( arg->forcedMode == IVAS_ENC_FORCE_FILE ) + { + arg->forcedModeFile = argv[i + 1]; + fprintf( stdout, "Force switching file: %s\n", argv[i + 1] ); + } + else if ( arg->forcedMode == IVAS_ENC_FORCE_DIR ) + { + arg->forcedModeDir = argv[i + 1]; + fprintf( stdout, "Forcing switching directory: %s\n", argv[i + 1] ); + } + else + { + fprintf( stderr, "\nError: The force switching profile file/dir %s does not exist or could not be opened!\n\n", argv[i + 1] ); + usage_enc(); + return false; + } +#else + if ( arg->forcedMode == IVAS_ENC_FORCE_UNDEFINED ) + { + arg->forcedModeFile = argv[i + 1]; + fprintf( stdout, "Force switching file: %s\n", argv[i + 1] ); + } + else + { +#ifdef SUPPORT_FORCE_TCX10_TCX20 + if ( arg->forcedMode == IVAS_ENC_FORCE_TCX10 ) + { + strcpy( stmp, "TCX10" ); + } + else if ( arg->forcedMode == IVAS_ENC_FORCE_TCX20 ) + { + strcpy( stmp, "TCX20" ); + } + else + { + strncpy( stmp, argv[i + 1], sizeof( stmp ) ); + } + + fprintf( stdout, "Forcing codec to: %s\n", stmp ); +#else + fprintf( stdout, "Forcing codec to: %s\n", argv[i + 1] ); +#endif + } +#endif + + i += 2; + } +#ifdef DEBUG_MODE_INFO +#ifdef DEBUG_MODE_INFO_TWEAK + /*-----------------------------------------------------------------* + * Define additional subfolder for debug info output in ./res + *-----------------------------------------------------------------*/ + else if ( strcmp( argv_to_upper, "-INFO" ) == 0 ) + { + extern char infoFolder[FILENAME_MAX]; + strncpy( infoFolder, argv[i + 1], sizeof( infoFolder ) ); + i += 2; + } +#endif /* #ifdef DEBUG_MODE_INFO_TWEAK */ +#endif /* #ifdef DEBUG_MODE_INFO */ +#endif /* #ifdef DEBUGGING */ + + /*-----------------------------------------------------------------* + * deactivate delay compensation + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-NO_DELAY_CMP" ) == 0 ) + { + arg->delayCompensationEnabled = false; + i++; + } + + /*-----------------------------------------------------------------* + * Activate channel-aware mode + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-RF" ) == 0 ) + { + arg->caConfig.channelAwareModeEnabled = 1; + i++; + + if ( i < argc - 4 ) + { + strncpy( stmp, argv[i], sizeof( stmp ) ); + stmp[sizeof( stmp ) - 1] = '\0'; + to_upper( stmp ); + if ( strcmp( stmp, "LO" ) == 0 ) + { + arg->caConfig.fec_indicator = IVAS_ENC_FEC_LO; + } + else if ( strcmp( stmp, "HI" ) == 0 ) + { + arg->caConfig.fec_indicator = IVAS_ENC_FEC_HI; + } + else + { + arg->ca_config_file = argv[i]; + } + i++; + + if ( ( sscanf( argv[i], "%d", &tmp ) == 1 ) && ( i < argc - 4 ) ) + { + if ( tmp == 0 ) + { + arg->caConfig.channelAwareModeEnabled = 0; + arg->caConfig.fec_offset = 0; + i++; + } + else + { + arg->caConfig.fec_offset = (int16_t) tmp; + i++; + } + } + } + else + { + arg->caConfig.fec_indicator = IVAS_ENC_FEC_HI; + } + } + + /*-----------------------------------------------------------------* + * MIME output file format + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-MIME" ) == 0 ) + { + arg->mimeOutput = true; + fprintf( stdout, "Output bitstream file format: MIME\n" ); + ++i; + } + + + /*-----------------------------------------------------------------* + * Complexity Level + *-----------------------------------------------------------------*/ + + /* actual parsing of level will be implemented after characterization */ + else if ( strcmp( argv_to_upper, "-LEVEL" ) == 0 ) + { + int16_t level; + + ++i; + level = (int16_t) atoi( argv[i++] ); + if ( level < IVAS_ENC_COMPLEXITY_LEVEL_ONE || level > IVAS_ENC_COMPLEXITY_LEVEL_THREE ) + { + fprintf( stdout, "Invalid complexity level specified.\n" ); + usage_enc(); + return false; + } + else if ( level == IVAS_ENC_COMPLEXITY_LEVEL_ONE || level == IVAS_ENC_COMPLEXITY_LEVEL_TWO ) + { + fprintf( stdout, "Complexity levels 1 and 2 will be defined after characterisation - default to level 3 (full functionality).\n" ); + } + } + + /*-----------------------------------------------------------------* + * IVAS Formats + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-STEREO" ) == 0 ) + { + i++; + arg->inputFormat = IVAS_ENC_INPUT_STEREO; + +#ifdef DEBUGGING + if ( ( i < argc - 4 ) && argv[i][0] != 45 ) /* note: 45 corresponds to "-" */ + { + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + if ( tmp == 1 ) + { + arg->inputFormatConfig.stereoMode = IVAS_ENC_STEREO_MODE_DFT; + i++; + } + else if ( tmp == 2 ) + { + arg->inputFormatConfig.stereoMode = IVAS_ENC_STEREO_MODE_TD; + i++; + } + else if ( tmp == 3 ) + { + arg->inputFormatConfig.stereoMode = IVAS_ENC_STEREO_MODE_MDCT_DECISION; +#ifdef DEBUG_FORCE_MDCT_STEREO_MODE + i++; + + /* force mdct stereo mode for debugging purposes */ + if ( i < argc - 4 ) + { + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + if ( tmp == 0 ) + { + /* keep "DECISION" */ + arg->inputFormatConfig.stereoMode = IVAS_ENC_STEREO_MODE_MDCT_DECISION; + i++; + } + else if ( tmp == 1 ) + { + arg->inputFormatConfig.stereoMode = IVAS_ENC_STEREO_MODE_MDCT_FORCE_LR; + i++; + } + else if ( tmp == 2 ) + { + arg->inputFormatConfig.stereoMode = IVAS_ENC_STEREO_MODE_MDCT_FORCE_MS; + i++; + } + else + { + fprintf( stderr, "Error: Incorrect mdct stereo coding method (%d) specified\n\n", tmp ); + usage_enc(); + return false; + } + } + } +#endif + } + else + { + fprintf( stderr, "Error: Incorrect stereo mode (%d) specified\n\n", tmp ); + usage_enc(); + return false; + } + } + else + { + fprintf( stderr, "Error: Stereo mode not specified.\n\n" ); /* in the debugging stage */ + usage_enc(); + return false; + } + } + else + { + arg->inputFormatConfig.stereoMode = IVAS_ENC_STEREO_MODE_UNIFIED; + } +#endif /* DEBUGGING */ + } + else if ( strcmp( argv_to_upper, "-BINAURAL" ) == 0 ) + { + arg->is_binaural = true; + i++; + } + else if ( strcmp( argv_to_upper, "-ISM" ) == 0 ) + { + arg->inputFormat = IVAS_ENC_INPUT_ISM; + i++; + + if ( i < argc - 4 ) + { + if ( argv[i][0] == '+' ) + { + argv[i]++; + arg->ism_extended_metadata = true; + } + if ( !is_digits_only( argv[i] ) ) + { + fprintf( stderr, "Error: Number of ISM channels must be an integer number!\n\n" ); + usage_enc(); + return false; + } + + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + + if ( tmp <= 0 ) + { + fprintf( stderr, "Error: Too low number of ISM channels specified!\n\n" ); + usage_enc(); + return false; + } + else if ( tmp > IVAS_MAX_NUM_OBJECTS ) + { + fprintf( stderr, "Error: Too high number of ISM channels specified!\n\n" ); + usage_enc(); + return false; + } + else + { + arg->inputFormatConfig.ism.numObjects = (int16_t) tmp; + } + } + else + { + fprintf( stderr, "Error: Number of ISM channels not specified!\n\n" ); + usage_enc(); + return false; + } + + /* read input metadata files */ + for ( j = 0; j < arg->inputFormatConfig.ism.numObjects; j++ ) + { + if ( i < argc - 4 ) + { + if ( strcmp( argv[i], "NULL" ) == 0 || strcmp( argv[i], "null" ) == 0 ) + { + /* no metadata input file -> encode only audio streams */ + arg->inputFormatConfig.ism.metadataFiles[j] = NULL; + } + else + { + arg->inputFormatConfig.ism.metadataFiles[j] = argv[i]; + } + + i++; + } + else + { + fprintf( stderr, "Error: not enough metadata arguments specified!\n\n" ); + usage_enc(); + return false; + } + } + } + else if ( strcmp( argv_to_upper, "-SBA" ) == 0 ) + { + i++; + arg->inputFormat = IVAS_ENC_INPUT_SBA; + + /* SBA configuration */ + if ( i < argc - 4 && is_number( argv[i] ) && sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + else + { + tmp = -1; /* this is to avoid a compilation warning */ + fprintf( stderr, "Error: SBA order must be specified, expecting a number!\n\n" ); + usage_enc(); + return false; + } + + arg->inputFormatConfig.sba.isPlanar = ( tmp < 0 ); + + tmp = abs( tmp ); + switch ( tmp ) + { + case 1: + arg->inputFormatConfig.sba.order = IVAS_ENC_SBA_FOA; + break; + case 2: + arg->inputFormatConfig.sba.order = IVAS_ENC_SBA_HOA2; + break; + case 3: + arg->inputFormatConfig.sba.order = IVAS_ENC_SBA_HOA3; + break; + default: + fprintf( stderr, "Error: Wrong SBA order specified!\n\n" ); + usage_enc(); + return false; + } + } + else if ( strcmp( argv_to_upper, "-MASA" ) == 0 ) + { + arg->inputFormat = IVAS_ENC_INPUT_MASA; + i++; + + if ( i < argc - 4 ) + { + if ( !is_digits_only( argv[i] ) ) + { + fprintf( stderr, "Error: Number of MASA channels must be an integer number!\n\n" ); + usage_enc(); + return false; + } + + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + + switch ( tmp ) + { + case 1: + arg->inputFormatConfig.masaVariant = IVAS_ENC_MASA_1CH; + break; + case 2: + arg->inputFormatConfig.masaVariant = IVAS_ENC_MASA_2CH; + break; + default: + fprintf( stderr, "Error: MASA channels must be 1 or 2.\n\n" ); + usage_enc(); + return false; + } + } + + if ( i < argc - 4 ) + { + arg->masaMetadataFile = argv[i]; + i++; + } + else + { + fprintf( stderr, "Error: not enough MASA arguments\n\n" ); + usage_enc(); + return false; + } + } + else if ( strcmp( argv_to_upper, "-MC" ) == 0 ) + { + i++; + arg->inputFormat = IVAS_ENC_INPUT_MC; + + if ( i < argc - 4 ) + { + if ( strcmp( argv[i], "5_1" ) == 0 ) + { + arg->inputFormatConfig.mcLayout = IVAS_ENC_MC_5_1; + } + else if ( strcmp( argv[i], "7_1" ) == 0 ) + { + arg->inputFormatConfig.mcLayout = IVAS_ENC_MC_7_1; + } + else if ( strcmp( argv[i], "5_1_2" ) == 0 ) + { + arg->inputFormatConfig.mcLayout = IVAS_ENC_MC_5_1_2; + } + else if ( strcmp( argv[i], "5_1_4" ) == 0 ) + { + arg->inputFormatConfig.mcLayout = IVAS_ENC_MC_5_1_4; + } + else if ( strcmp( argv[i], "7_1_4" ) == 0 ) + { + arg->inputFormatConfig.mcLayout = IVAS_ENC_MC_7_1_4; + } + else + { + fprintf( stderr, "Error: Incorrect input configuration specified for Multi-channel\n\n" ); + usage_enc(); + return false; + } + i++; + } + else + { + fprintf( stderr, "Error: Multi-channel configuration not specified!\n\n" ); + usage_enc(); + return false; + } + } + else if ( strcmp( to_upper( argv[i] ), "-ISM_MASA" ) == 0 ) + { + arg->inputFormat = IVAS_ENC_INPUT_MASA_ISM; + i++; + + if ( i < argc - 5 ) + { + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + + if ( tmp <= 0 ) + { + fprintf( stderr, "Error: Too low number of ISM channels specified!\n\n" ); + usage_enc(); + return false; + } + else + { + if ( tmp <= IVAS_MAX_NUM_OBJECTS ) /* number of ISM channels */ + { + arg->inputFormatConfig.masa_ism.numObjects = (int16_t) tmp; + } + else + { + fprintf( stderr, "Error: Too high number of ISM channels!\n\n" ); + usage_enc(); + return false; + } + } + } + else + { + fprintf( stderr, "Error: Number of ISM channels not specified!\n\n" ); + usage_enc(); + return false; + } + if ( i < argc - 4 ) + { + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + + switch ( tmp ) + { + case 1: + arg->inputFormatConfig.masa_ism.masaVariant = IVAS_ENC_MASA_1CH; + break; + case 2: + arg->inputFormatConfig.masa_ism.masaVariant = IVAS_ENC_MASA_2CH; + break; + default: + fprintf( stderr, "Error: MASA channels must be 1 or 2.\n\n" ); + usage_enc(); + return false; + } + } + + /* read input metadata files */ + for ( j = 0; j < arg->inputFormatConfig.masa_ism.numObjects; j++ ) + { + if ( i < argc - 4 ) + { + if ( strcmp( argv[i], "NULL" ) == 0 || strcmp( argv[i], "null" ) == 0 ) + { + /* no metadata input file -> encode only audio streams */ + arg->inputFormatConfig.masa_ism.metadataFiles[j] = NULL; + } + else + { + arg->inputFormatConfig.masa_ism.metadataFiles[j] = argv[i]; + } + + i++; + } + else + { + fprintf( stderr, "Error: not enough arguments\n\n" ); + usage_enc(); + return false; + } + } + + if ( i < argc - 4 ) + { + arg->masaMetadataFile = argv[i]; + i++; + } + else + { + fprintf( stderr, "Error: not enough MASA arguments\n\n" ); + usage_enc(); + return false; + } + } + else if ( strcmp( to_upper( argv[i] ), "-ISM_SBA" ) == 0 ) + { + arg->inputFormat = IVAS_ENC_INPUT_SBA_ISM; + i++; + + if ( i < argc - 5 ) + { + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + + if ( tmp <= 0 ) + { + fprintf( stderr, "Error: Too low number of ISM channels specified!\n\n" ); + usage_enc(); + return false; + } + else + { + if ( tmp <= IVAS_MAX_NUM_OBJECTS ) /* number of ISM channels */ + { + arg->inputFormatConfig.sba_ism.numObjects = (int16_t) tmp; + } + else + { + fprintf( stderr, "Error: Too high number of ISM channels!\n\n" ); + usage_enc(); + return false; + } + } + } + else + { + fprintf( stderr, "Error: Number of ISM channels not specified!\n\n" ); + usage_enc(); + return false; + } + + if ( i < argc - 4 ) + { + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + + arg->inputFormatConfig.sba_ism.isPlanar = ( tmp < 0 ); + + tmp = abs( tmp ); + switch ( tmp ) + { + case 1: + arg->inputFormatConfig.sba_ism.order = IVAS_ENC_SBA_FOA; + break; + case 2: + arg->inputFormatConfig.sba_ism.order = IVAS_ENC_SBA_HOA2; + break; + case 3: + arg->inputFormatConfig.sba_ism.order = IVAS_ENC_SBA_HOA3; + break; + default: + fprintf( stderr, "Error: Wrong SBA order specified!\n\n" ); + usage_enc(); + return false; + } + } + + /* read input metadata files */ + for ( j = 0; j < arg->inputFormatConfig.sba_ism.numObjects; j++ ) + { + if ( i < argc - 4 ) + { + if ( strcmp( argv[i], "NULL" ) == 0 || strcmp( argv[i], "null" ) == 0 ) + { + /* no metadata input file -> encode only audio streams */ + arg->inputFormatConfig.sba_ism.metadataFiles[j] = NULL; + } + else + { + arg->inputFormatConfig.sba_ism.metadataFiles[j] = argv[i]; + } + + i++; + } + else + { + fprintf( stderr, "Error: not enough arguments\n\n" ); + usage_enc(); + return false; + } + } + } + else if ( strcmp( argv_to_upper, "-STEREO_DMX_EVS" ) == 0 ) + { + arg->inputFormat = IVAS_ENC_INPUT_MONO; + arg->inputFormatConfig.stereoToMonoDownmix = true; + + i++; + } + else if ( strcmp( argv_to_upper, "-PCA" ) == 0 ) + { + arg->pca = 1; + i++; + } + + /*-----------------------------------------------------------------* + * RTPDump output + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-RTPDUMP" ) == 0 ) + { + i++; + arg->rtpdumpOutput = true; + if ( i < argc - 4 ) + { + if ( !is_digits_only( argv[i] ) ) + { + arg->numFramesPerPacket = 1; /* Default to 1 frame per packet */ + } + else + { + arg->numFramesPerPacket = atoi( argv[i++] ); + if ( arg->numFramesPerPacket > IVAS_MAX_FRAMES_PER_RTP_PACKET ) + { + fprintf( stderr, "numFramesPerPacket(%d) exceeds max frames per packet (%d) \n", arg->numFramesPerPacket, IVAS_MAX_FRAMES_PER_RTP_PACKET ); + arg->numFramesPerPacket = 1; + } + } + } + fprintf( stdout, "Output format: RTPDump using %d frames/packet \n", arg->numFramesPerPacket ); + } + + /*-----------------------------------------------------------------* + * Scene orientation + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-SCENE_ORIENTATION" ) == 0 ) + { + i++; + if ( argc - i <= 4 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: Scene orientation file name not specified!\n\n" ); + usage_enc(); + return false; + } + + arg->sceneOrientationTrajFileName = argv[i]; + i++; + } + + /*-----------------------------------------------------------------* + * Device orientation + *-----------------------------------------------------------------*/ + + else if ( strcmp( argv_to_upper, "-DEVICE_ORIENTATION" ) == 0 ) + { + i++; + if ( argc - i <= 4 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: Device orientation file name not specified!\n\n" ); + usage_enc(); + return false; + } + + arg->deviceOrientationTrajFileName = argv[i]; + i++; + } + + + /*-----------------------------------------------------------------* + * Option not recognized + *-----------------------------------------------------------------*/ + else + { + fprintf( stderr, "Error: option not recognized, %s\n\n", argv[i] ); + usage_enc(); + return false; + } + } /* end of while */ + + /*-----------------------------------------------------------------* + * Mandatory input arguments + *-----------------------------------------------------------------*/ + + /*-----------------------------------------------------------------* + * Bitrate + *-----------------------------------------------------------------*/ + + if ( i < argc - 2 ) + { + /* check if profile file has been entered instead of a fixed bitrate */ + if ( !is_digits_only( argv[i] ) ) + { + arg->bitrateProfileFile = argv[i]; + } + else + { + arg->initBitrate = atoi( argv[i] ); + } + + i++; + } + else + { + fprintf( stderr, "Error: no bitrate specified\n\n" ); + usage_enc(); + return false; + } + + /*-----------------------------------------------------------------* + * Input sampling frequency + *-----------------------------------------------------------------*/ + + if ( i < argc - 2 ) + { + arg->inputFs = atoi( argv[i] ) * 1000; + i++; + } + else + { + fprintf( stderr, "Error: no input sampling frequency specified\n\n" ); + usage_enc(); + return false; + } + + /* for EVS mono, restore default behavior, i.e. SWB as default maxBandwidth if not set by the user otherwise */ + if ( arg->max_bwidth_user == false ) + { + arg->maxBandwidth = IVAS_ENC_GetDefaultBandwidth( ( arg->inputFormat == IVAS_ENC_INPUT_MONO ) ? true : false ); + } + + /* Prevent maxBandwidth from being higher than inputFs/2 */ + if ( arg->inputFs == 8000 && arg->maxBandwidth > IVAS_ENC_BANDWIDTH_NB ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_NB; + } + else if ( arg->inputFs == 16000 && arg->maxBandwidth > IVAS_ENC_BANDWIDTH_WB ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_WB; + } + else if ( arg->inputFs == 32000 && arg->maxBandwidth > IVAS_ENC_BANDWIDTH_SWB ) + { + arg->maxBandwidth = IVAS_ENC_BANDWIDTH_SWB; + } + + /*-----------------------------------------------------------------* + * Input file + *-----------------------------------------------------------------*/ + + if ( i < argc - 1 ) + { + arg->inputWavFilename = argv[i]; + i++; + } + else + { + fprintf( stderr, "Error: no input file specified\n\n" ); + usage_enc(); + return false; + } + + /*-----------------------------------------------------------------* + * Output bitstream file + *-----------------------------------------------------------------*/ + + if ( i < argc ) + { + arg->outputBitstreamFilename = argv[i]; + i++; + } + else + { + fprintf( stderr, "Error: no output bitstream file specified\n\n" ); + usage_enc(); + return false; + } + + return true; +} + + +/*---------------------------------------------------------------------* + * usage_enc() + * + * Print the usage of the "ivas_cod" program + *---------------------------------------------------------------------*/ + +static void usage_enc( void ) +{ + fprintf( stdout, "Usage: IVAS_cod.exe [Options] R Fs input_file bitstream_file\n\n" ); + + fprintf( stdout, "Mandatory parameters:\n" ); + fprintf( stdout, "---------------------\n" ); + + fprintf( stdout, "R : Bitrate in bps, \n" ); + fprintf( stdout, " for EVS native modes R = (5900*, 7200, 8000, 9600, 13200, 16400,\n" ); + fprintf( stdout, " 24400, 32000, 48000, 64000, 96000, 128000) \n" ); + fprintf( stdout, " *VBR mode (average bitrate),\n" ); + fprintf( stdout, " for AMR-WB IO modes R = (6600, 8850, 12650, 14250, 15850, 18250,\n" ); + fprintf( stdout, " 19850, 23050, 23850) \n" ); + fprintf( stdout, " for IVAS stereo R = (13200, 16400, 24400, 32000, 48000, 64000, 80000, \n" ); + fprintf( stdout, " 96000, 128000, 160000, 192000, 256000) \n" ); + fprintf( stdout, " for IVAS ISM R = 13200 for 1 ISM, 16400 for 1 ISM and 2 ISM, \n" ); + fprintf( stdout, " (24400, 32000, 48000, 64000, 80000, 96000, 128000) \n" ); + fprintf( stdout, " for 2 ISM, 3 ISM and 4 ISM also 160000, 192000, 256000) \n" ); + fprintf( stdout, " for 3 ISM and 4 ISM also 384000 \n" ); + fprintf( stdout, " for 4 ISM also 512000 \n" ); + fprintf( stdout, " for IVAS SBA, MASA, MC, ISM-SBA, and ISM-MASA R=(13200, 16400, 24400, 32000, 48000, 64000,\n" ); + fprintf( stdout, " 80000, 96000, 128000, 160000, 192000, 256000, 384000, 512000) \n" ); + fprintf( stdout, " Alternatively, R can be a bitrate switching file which consists of R values\n" ); + fprintf( stdout, " indicating the bitrate for each frame in bps. These values are stored in\n" ); + fprintf( stdout, " binary format using 4 bytes per value\n" ); + fprintf( stdout, "Fs : Input sampling rate in kHz, Fs = (8, 16, 32 or 48) \n" ); + + fprintf( stdout, "input_file : Input audio filename \n" ); + fprintf( stdout, "bitstream_file : Output bitstream filename \n\n" ); + + fprintf( stdout, "Options:\n" ); + fprintf( stdout, "--------\n" ); + fprintf( stdout, "EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba, -masa, -mc, -ism_sba, -ism_masa\n" ); + fprintf( stdout, "-stereo : Stereo format \n" ); + fprintf( stdout, "-ism (+)Ch Files : ISM format \n" ); + fprintf( stdout, " where Ch specifies the number of ISMs (1-4)\n" ); + fprintf( stdout, " where positive (+) indicates extended metadata (only 64 kbps and up) \n" ); + fprintf( stdout, " and Files specify input files containing metadata, one file per object\n" ); + fprintf( stdout, " (use NULL for no input metadata)\n" ); + fprintf( stdout, "-sba +/-Order : Scene Based Audio input format (Ambisonics ACN/SN3D),\n" ); + fprintf( stdout, " where Order specifies the Ambisionics order (1-3),\n" ); + fprintf( stdout, " where positive (+) means full 3D and negative (-) only 2D/planar components to be coded\n" ); + fprintf( stdout, "-masa Ch File : MASA format \n" ); + fprintf( stdout, " where Ch specifies the number of MASA input/transport channels (1 or 2): \n" ); + fprintf( stdout, " and File specifies input file containing parametric MASA metadata \n" ); + fprintf( stdout, "-ism_sba IsmCh +/-Order IsmFiles : SBA and ISM combined format\n" ); + fprintf( stdout, " where IsmCh specifies the number of ISMs (1-4)\n" ); + fprintf( stdout, " and Order specifies the SBA order (1 to 3) \n" ); + fprintf( stdout, " and IsmFiles specify input files containing ISM metadata, one file per object \n" ); + fprintf( stdout, "-ism_masa IsmCh MasaCh IsmFiles MasaFile : MASA and ISM combined format \n" ); + fprintf( stdout, " where IsmCh specifies the number of ISMs (1-4),\n" ); + fprintf( stdout, " MasaCh specifies the number of MASA input/transport channels (1-2), \n" ); + fprintf( stdout, " IsmFiles specify input files containing ISM metadata, one file per object, \n" ); + fprintf( stdout, " and MasaFile specifies input file containing parametric MASA metadata \n" ); + fprintf( stdout, "-mc InputConf : Multi-channel format\n" ); + fprintf( stdout, " where InputConf specifies the channel configuration: 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4\n" ); + fprintf( stdout, " Loudspeaker positions are assumed to have azimuth and elevation as per \n" ); + fprintf( stdout, " ISO/IEC 23091-3:2018 Table 3. Channel order is as per ISO/IEC 23008-3:2015 Table 95.\n" ); + fprintf( stdout, " See readme.txt for details.\n" ); + fprintf( stdout, "-dtx D : Activate DTX mode, D = (0, 3-100) is the SID update rate\n" ); + fprintf( stdout, " where 0 = adaptive, 3-100 = fixed in number of frames,\n" ); + fprintf( stdout, " default is deactivated\n" ); + fprintf( stdout, "-dtx : Activate DTX mode with a SID update rate of 8 frames\n" ); + fprintf( stdout, " Note: DTX is supported in EVS, stereo, ISM, SBA up to 80kbps and MASA up to 128kbps \n" ); + fprintf( stdout, "-rf p o : Activate channel-aware mode for WB and SWB signal at 13.2kbps, \n" ); + fprintf( stdout, " where FEC indicator, p: LO or HI, and FEC offset, o: 2, 3, 5, or 7 in number of frames.\n" ); + fprintf( stdout, " Alternatively p and o can be replaced by a rf configuration file with each line \n" ); + fprintf( stdout, " contains the values of p and o separated by a space, \n" ); + fprintf( stdout, " default is deactivated \n" ); + fprintf( stdout, "-max_band B : Activate bandwidth limitation, B = (NB, WB, SWB or FB)\n" ); + fprintf( stdout, " alternatively, B can be a text file where each line contains \"nb_frames B\"\n" ); + fprintf( stdout, "-no_delay_cmp : Turn off delay compensation\n" ); + fprintf( stdout, "-stereo_dmx_evs : Activate stereo downmix function for EVS.\n" ); + fprintf( stdout, "-binaural : Optional indication that input is binaural audio (to be used with -stereo or -stereo_dmx_evs)\n" ); + fprintf( stdout, "-mime : Mime output bitstream file format\n" ); + fprintf( stdout, " The encoder produces TS26.445 Annex.2.6 Mime Storage Format, (not RFC4867 Mime Format).\n" ); + fprintf( stdout, " default output bitstream file format is G.192\n" ); + fprintf( stdout, "-pca : activate PCA in SBA format FOA at 256 kbps \n" ); + fprintf( stdout, "-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. \n" ); + fprintf( stdout, " Currently, all values default to level 3 (full functionality).\n" ); +#ifdef DEBUGGING + fprintf( stdout, "-force T : Force specific mode, T = (speech, music, ACELP, GSC, TCX, HQ),\n" ); + fprintf( stdout, " alternatively, T can be a text file where each line contains \"nb_frames T\"\n" ); +#ifdef DEBUG_FORCE_DIR + fprintf( stdout, " or T can be a directory containing external binary files for modes/parameters enforcement\n" ); +#endif +#endif +#ifdef DEBUG_MODE_INFO +#ifdef DEBUG_MODE_INFO_TWEAK + fprintf( stdout, "-info : specify subfolder name for debug output\n" ); +#endif +#endif + fprintf( stdout, "-q : Quiet mode, no frame counters\n" ); + fprintf( stdout, " default is deactivated\n" ); + fprintf( stdout, "-rtpdump : RTPDump output, hf_only=1 by default. The encoder will packetize the \n" ); + fprintf( stdout, " bitstream frames into TS26.253 Annex A IVAS RTP Payload Format packets and \n" ); + fprintf( stdout, " writes those to the output file. In EVS mono operating mode, TS26.445 Annex A.2.2 \n" ); + fprintf( stdout, " EVS RTP Payload Format is used. Optional N represents number of frames per RTP packet\n" ); + fprintf( stdout, "-scene_orientation : Scene orientation trajectory file. Only used with rtpdump output.\n" ); + fprintf( stdout, "-device_orientation : Device orientation trajectory file. Only used with rtpdump output.\n" ); + fprintf( stdout, "\n" ); + + return; +} + + +/*---------------------------------------------------------------------* + * readBandwidth() + * + * + *---------------------------------------------------------------------*/ + +static bool readBandwidth( + FILE *file, + IVAS_ENC_BANDWIDTH *bandwidth, + int32_t *bandwidthFrameCounter ) +{ + int16_t res; + char stmp[4]; + + if ( *bandwidthFrameCounter == 0 ) + { + /* read next bandwidth value and number of frames from the profile file */ + while ( ( res = (int16_t) fscanf( file, "%d %3s", bandwidthFrameCounter, stmp ) ) != 2 && feof( file ) ) + { + rewind( file ); + } + + ( *bandwidthFrameCounter )--; + + to_upper( stmp ); + + if ( strcmp( stmp, "NB" ) == 0 ) + { + *bandwidth = IVAS_ENC_BANDWIDTH_NB; + } + else if ( strcmp( stmp, "WB" ) == 0 ) + { + *bandwidth = IVAS_ENC_BANDWIDTH_WB; + } + else if ( strcmp( stmp, "SWB" ) == 0 ) + { + *bandwidth = IVAS_ENC_BANDWIDTH_SWB; + } + else if ( strcmp( stmp, "FB" ) == 0 ) + { + *bandwidth = IVAS_ENC_BANDWIDTH_FB; + } + else + { + fprintf( stderr, "Error: incorrect bandwidth specified (only NB, WB, SWB and FB are supported)\n\n" ); + usage_enc(); + return false; + } + } + else + { + /* current profile still active, only decrease the counter */ + ( *bandwidthFrameCounter )--; + } + + return true; +} + + +/*---------------------------------------------------------------------* + * readBitrate() + * + * + *---------------------------------------------------------------------*/ + +static bool readBitrate( + FILE *file, + int32_t *bitrate ) +{ + for ( int32_t i = 0; i < 2; ++i ) + { + if ( fread( bitrate, sizeof( int32_t ), 1, file ) == 1 ) + { + return true; + } + + rewind( file ); + } + + fprintf( stderr, "Error: cannot read the bitrate profile file\n\n" ); + usage_enc(); + return false; +} + + +#ifdef DEBUGGING +/*---------------------------------------------------------------------* + * parseForcedMode() + * + * + *---------------------------------------------------------------------*/ + +static IVAS_ENC_FORCED_MODE parseForcedMode( + char *forcedModeChar ) +{ +#ifdef DEBUG_FORCE_DIR + struct stat path_stat; +#endif + + to_upper( forcedModeChar ); + +#ifdef DEBUG_FORCE_DIR + if ( ( strcmp( forcedModeChar, "SPEECH" ) == 0 ) || ( strcmp( forcedModeChar, "'SPEECH'" ) == 0 ) || + ( strcmp( forcedModeChar, "0" ) == 0 ) ) + { + return IVAS_ENC_FORCE_SPEECH; + } + else if ( ( strcmp( forcedModeChar, "MUSIC" ) == 0 ) || ( strcmp( forcedModeChar, "'MUSIC'" ) == 0 ) || ( strcmp( forcedModeChar, "AUDIO" ) == 0 ) || ( strcmp( forcedModeChar, "'AUDIO'" ) == 0 ) || ( strcmp( forcedModeChar, "1" ) == 0 ) ) + { + return IVAS_ENC_FORCE_MUSIC; + } + else if ( ( strcmp( forcedModeChar, "ACELP" ) == 0 ) || ( strcmp( forcedModeChar, "'ACELP'" ) == 0 ) ) + { + return IVAS_ENC_FORCE_ACELP; + } + else if ( ( strcmp( forcedModeChar, "GSC" ) == 0 ) || ( strcmp( forcedModeChar, "'GSC'" ) == 0 ) ) + { + return IVAS_ENC_FORCE_GSC; + } + if ( ( strcmp( forcedModeChar, "TCX" ) == 0 ) || ( strcmp( forcedModeChar, "'TCX'" ) == 0 ) +#ifdef SUPPORT_FORCE_TCX10_TCX20 + || ( strcmp( forcedModeChar, "TCX20" ) == 0 ) || ( strcmp( forcedModeChar, "'TCX20'" ) == 0 ) +#endif + ) + { +#ifdef SUPPORT_FORCE_TCX10_TCX20 + return IVAS_ENC_FORCE_TCX20; +#else + return IVAS_ENC_FORCE_TCX; +#endif + } +#ifdef SUPPORT_FORCE_TCX10_TCX20 + if ( ( strcmp( forcedModeChar, "TCX10" ) == 0 ) || ( strcmp( forcedModeChar, "'TCX10'" ) == 0 ) ) + { + return IVAS_ENC_FORCE_TCX10; + } +#endif + else if ( ( strcmp( forcedModeChar, "HQ" ) == 0 ) || ( strcmp( forcedModeChar, "'HQ'" ) == 0 ) ) + { + return IVAS_ENC_FORCE_HQ; + } + else + { + if ( stat( forcedModeChar, &path_stat ) != 0 ) + { + return IVAS_ENC_FORCE_UNDEFINED; + } + + /* check if the argument represents an existing file or directory */ + if ( S_ISDIR( path_stat.st_mode ) ) + { + /* it's a directory */ + return IVAS_ENC_FORCE_DIR; + } + else + { + /* it's a file */ + return IVAS_ENC_FORCE_FILE; + } + } +#else + if ( ( strcmp( forcedModeChar, "SPEECH" ) == 0 ) || ( strcmp( forcedModeChar, "'SPEECH'" ) == 0 ) || + ( strcmp( forcedModeChar, "0" ) == 0 ) ) + { + return IVAS_ENC_FORCE_SPEECH; + } + if ( ( strcmp( forcedModeChar, "MUSIC" ) == 0 ) || ( strcmp( forcedModeChar, "'MUSIC'" ) == 0 ) || ( strcmp( forcedModeChar, "AUDIO" ) == 0 ) || ( strcmp( forcedModeChar, "'AUDIO'" ) == 0 ) || ( strcmp( forcedModeChar, "1" ) == 0 ) ) + { + return IVAS_ENC_FORCE_MUSIC; + } + if ( ( strcmp( forcedModeChar, "ACELP" ) == 0 ) || ( strcmp( forcedModeChar, "'ACELP'" ) == 0 ) ) + { + return IVAS_ENC_FORCE_ACELP; + } + if ( ( strcmp( forcedModeChar, "GSC" ) == 0 ) || ( strcmp( forcedModeChar, "'GSC'" ) == 0 ) ) + { + return IVAS_ENC_FORCE_GSC; + } + if ( ( strcmp( forcedModeChar, "TCX" ) == 0 ) || ( strcmp( forcedModeChar, "'TCX'" ) == 0 ) +#ifdef SUPPORT_FORCE_TCX10_TCX20 + || ( strcmp( forcedModeChar, "TCX20" ) == 0 ) || ( strcmp( forcedModeChar, "'TCX20'" ) == 0 ) +#endif + ) + { +#ifdef SUPPORT_FORCE_TCX10_TCX20 + return IVAS_ENC_FORCE_TCX20; +#else + return IVAS_ENC_FORCE_TCX; +#endif + } +#ifdef SUPPORT_FORCE_TCX10_TCX20 + if ( ( strcmp( forcedModeChar, "TCX10" ) == 0 ) || ( strcmp( forcedModeChar, "'TCX10'" ) == 0 ) ) + { + return IVAS_ENC_FORCE_TCX10; + } +#endif + if ( ( strcmp( forcedModeChar, "HQ" ) == 0 ) || ( strcmp( forcedModeChar, "'HQ'" ) == 0 ) ) + { + return IVAS_ENC_FORCE_HQ; + } + + return IVAS_ENC_FORCE_UNDEFINED; +#endif +} + + +/*---------------------------------------------------------------------* + * readForcedMode() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error readForcedMode( + FILE *file, + IVAS_ENC_FORCED_MODE *forcedMode, + int32_t *forceFrameCounter ) +{ + int16_t res; + char stmp[8]; + + if ( *forceFrameCounter == 0 ) + { + /* read next force and number of frames from the profile file */ + while ( ( res = (int16_t) fscanf( file, "%d %7s", forceFrameCounter, stmp ) ) != 2 && feof( file ) ) + { + rewind( file ); + } + + *forcedMode = parseForcedMode( stmp ); + + if ( *forcedMode == IVAS_ENC_FORCE_UNDEFINED ) + { + fprintf( stderr, "Error: incorect mode specification or the force profile file could not be opened: %s\n\n", stmp ); + return IVAS_ERR_WRONG_PARAMS; + } + + if ( res != 2 && !feof( file ) ) + { + fprintf( stderr, "Error: incorrect format of the force profile file (please ensure that it does not contain any empty lines)\n\n" ); + return IVAS_ERR_WRONG_PARAMS; + } + } + + /* current profile still active, only decrease the counter */ + ( *forceFrameCounter )--; + + return IVAS_ERR_OK; +} +#endif + + +#undef WMC_TOOL_SKIP diff --git a/apps/isar_post_rend.c b/apps/isar_post_rend.c new file mode 100644 index 0000000000000000000000000000000000000000..63877b4e680ddbaf7d28a5b96021391dee276432 --- /dev/null +++ b/apps/isar_post_rend.c @@ -0,0 +1,1483 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "lib_isar_post_rend.h" +#include +#include +#include +#include "audio_file_reader.h" +#include "audio_file_writer.h" +#include "cmdl_tools.h" +#include "cmdln_parser.h" +#include "render_config_reader.h" +#include "rotation_file_reader.h" +#include "split_render_file_read_write.h" +#include "split_rend_bfi_file_reader.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "stl.h" +#include "wmc_auto.h" +#include "ivas_rtp_file.h" + + +#define WMC_TOOL_SKIP + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define POST_REND_MAX_CLI_ARG_LENGTH ( FILENAME_MAX ) + +#define ISAR_MAX16B_FLT 32767.0f +#define ISAR_MIN16B_FLT ( -32768.0f ) +#define ISAR_MAX16B_FX 32767 +#define ISAR_MIN16B_FX ( -32768 ) + +#if !defined( DEBUGGING ) && !defined( WMOPS ) +static +#endif + int32_t frame = 0; + +#ifdef _WIN32 +#define SEP_FOLDER '\\' +#else +#define SEP_FOLDER '/' +#endif + +/*------------------------------------------------------------------------------------------* + * Local structures + *------------------------------------------------------------------------------------------*/ + +typedef struct +{ + bool srRtp; + IVAS_AUDIO_CONFIG audioConfig; + int32_t inputChannelIndex; + float gain_dB; +} RendererInput; + +typedef struct +{ + RendererInput binBuses[RENDERER_MAX_BIN_INPUTS]; + uint16_t numBinBuses; +} InputConfig; + +typedef struct +{ + IVAS_AUDIO_CONFIG audioConfig; +} OutputConfig; + +typedef struct +{ + char executableName[POST_REND_MAX_CLI_ARG_LENGTH]; + char inputFilePath[POST_REND_MAX_CLI_ARG_LENGTH]; + char outputFilePath[POST_REND_MAX_CLI_ARG_LENGTH]; + char srParamsFilePath[POST_REND_MAX_CLI_ARG_LENGTH]; + int32_t sampleRate; + InputConfig inConfig; + OutputConfig outConfig; + char inMetadataFilePaths[RENDERER_MAX_ISAR_MD_INPUTS][POST_REND_MAX_CLI_ARG_LENGTH]; + int16_t numInMetadataFiles; + char headRotationFilePath[POST_REND_MAX_CLI_ARG_LENGTH]; + char splitRendBFIFilePath[POST_REND_MAX_CLI_ARG_LENGTH]; + ISAR_POST_REND_COMPLEXITY_LEVEL complexityLevel; + bool delayCompensationEnabled; + bool quietModeEnabled; + bool sceneDescriptionInput; + IVAS_RENDER_FRAMESIZE render_framesize; +} CmdlnArgs; + +typedef enum +{ + CmdLnOptionId_inputFile = 1, + CmdLnOptionId_inputFormat, + CmdLnOptionId_outputFile, + CmdLnOptionId_sampleRate, + CmdLnOptionId_trajFile, + CmdLnOptionId_orientationTracking, + CmdLnOptionId_complexityLevel, + CmdLnOptionId_noDelayCmp, + CmdLnOptionId_quietModeEnabled, + CmdLnOptionId_inputMetadata, + CmdLnOptionId_listFormats, + CmdLnOptionId_SplitRendBFIFile, + CmdLnOptionId_framing, + CmdLnOptionId_srParamsFile, +} CmdLnOptionId; + +static const CmdLnParser_Option cliOptions[] = { + { + .id = CmdLnOptionId_inputFile, + .match = "input_file", + .matchShort = "i", + .description = "Path to the input file (WAV, raw PCM or scene description file)", + }, + { + .id = CmdLnOptionId_inputFormat, + .match = "input_format", + .matchShort = "if", + .description = "Audio format of input file (e.g. BINAURAL_SPLIT_PCM, use -l for a list)", + }, + { + .id = CmdLnOptionId_inputMetadata, + .match = "input_metadata", + .matchShort = "im", + .description = "Space-separated list of path to metadata files for BINAURAL_SPLIT_PCM input mode", + }, + { + .id = CmdLnOptionId_outputFile, + .match = "output_file", + .matchShort = "o", + .description = "Path to the output file", + }, + { + .id = CmdLnOptionId_sampleRate, + .match = "sample_rate", + .matchShort = "fs", + .description = "Input sampling rate in kHz (16, 32, 48) - required only with raw PCM inputs", + }, + { + .id = CmdLnOptionId_trajFile, + .match = "trajectory_file", + .matchShort = "T", + .description = "Head rotation trajectory file for simulation of head tracking", + }, + { + .id = CmdLnOptionId_SplitRendBFIFile, + .match = "post_rend_bfi_file", + .matchShort = "prbfi", + .description = "Split rendering option: bfi file", + }, + { + .id = CmdLnOptionId_noDelayCmp, + .match = "no_delay_compensation", + .matchShort = "no_delay_cmp", + .description = "[flag] Turn off delay compensation", + }, + { + .id = CmdLnOptionId_complexityLevel, + .match = "complexity_level", + .matchShort = "level", + .description = "Complexity level, level = (1, 2, 3), will be defined after characterisation.", + }, + { + .id = CmdLnOptionId_quietModeEnabled, + .match = "quiet", + .matchShort = "q", + .description = "[flag] Limit printouts to terminal", + }, + { + .id = CmdLnOptionId_listFormats, + .match = "list", + .matchShort = "l", + .description = "List supported audio formats", + }, + { + .id = CmdLnOptionId_framing, + .match = "framing", + .matchShort = "fr", + .description = "Set Render audio framing.", + }, + { + .id = CmdLnOptionId_srParamsFile, + .match = "sr_params", + .matchShort = "s", + .description = "Path to the split rendering init params file", + }, +}; + + +/*------------------------------------------------------------------------------------------* + * Local function prototypes + *------------------------------------------------------------------------------------------*/ + +static const int32_t numCliOptions = sizeof( cliOptions ) / sizeof( CmdLnParser_Option ); + +static void printSupportedAudioConfigs( void ); + +static IVAS_AUDIO_CONFIG parseAudioConfig( const char *configString, bool *srRtp ); + +static void convertOutputBuffer( const Word32 *fixedBuffer, Word16 q, const int16_t numSamplesPerChannel, const int16_t numChannels, int16_t *intBuffer ); + +/*------------------------------------------------------------------------------------------* + * Local functions + *------------------------------------------------------------------------------------------*/ + +static ISAR_POST_REND_ReadOnlyAudioBuffer getReadOnlySubBuffer( + IVAS_REND_AudioBuffer buffer, + const int16_t chBeginIdx, + const int16_t numChannels ) +{ + ISAR_POST_REND_ReadOnlyAudioBuffer subBuffer; + + subBuffer.config = buffer.config; + subBuffer.config.numChannels = numChannels; + subBuffer.data_fx = buffer.data_fx + subBuffer.config.numSamplesPerChannel * chBeginIdx; + + return subBuffer; +} + + +static int16_t getTotalNumInChannels( + ISAR_POST_REND_HANDLE hIsarPostRend, + ISAR_POST_REND_InputId splitBinIds[RENDERER_MAX_BIN_INPUTS] ) +{ + int16_t totalNumInChannels = 0; + int16_t i, numInputChannels; + ivas_error error; + + for ( i = 0; i < RENDERER_MAX_BIN_INPUTS; ++i ) + { + if ( splitBinIds[i] == 0 ) + { + /* Skip inactive inputs */ + continue; + } + + if ( ( error = ISAR_POST_REND_GetInputNumChannels( hIsarPostRend, splitBinIds[i], &numInputChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + totalNumInChannels += numInputChannels; + } + + return totalNumInChannels; +} + + +static const CmdLnParser_Option *findOptionById( + const int32_t id ) +{ + for ( int32_t i = 0; i < numCliOptions; ++i ) + { + if ( cliOptions[i].id == id ) + { + return &cliOptions[i]; + } + } + + return NULL; +} + +static bool parseInConfig( + const char *inFormatStr, + InputConfig *inConfig, + bool *sceneDescriptionInput ) +{ + char charBuf[FILENAME_MAX]; + + /* Initialize input config struct */ + inConfig->numBinBuses = 0; + + /* First check if input is being set to scene description file - this is not covered by parseAudioConfig(). */ + strncpy( charBuf, inFormatStr, sizeof( charBuf ) - 1 ); + charBuf[sizeof( charBuf ) - 1] = '\0'; + to_upper( charBuf ); + if ( strcmp( charBuf, "META" ) == 0 ) + { + *sceneDescriptionInput = true; + /* Parsing the file will be done later. At this point the actual file path + * may not be known as command line parameters are still being parsed. */ + return true; + } + + /* Check for single-format inputs. The given string should map to a member of AUDIO_CONFIG enum. */ + bool srRtp = false; + IVAS_AUDIO_CONFIG audioConfig = parseAudioConfig( inFormatStr, &srRtp ); + switch ( audioConfig ) + { + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: + inConfig->numBinBuses = 1; + inConfig->binBuses[0].srRtp = srRtp; + inConfig->binBuses[0].audioConfig = audioConfig; + inConfig->binBuses[0].inputChannelIndex = 0; + inConfig->binBuses[0].gain_dB = 0.0f; + break; + default: + { + /* Default case covers formats that are defined in the AUDIO_CONFIG enum, + * but cannot be used at input, e.g. BINAURAL */ + const CmdLnParser_Option *listOption = findOptionById( CmdLnOptionId_listFormats ); + fprintf( stderr, "Unsupported input format: %s. To list valid formats, use option --%s.\n", inFormatStr, listOption->match ); + return false; + } + } + + return true; +} + + +static bool parseRenderFramesize( + char *value, + IVAS_RENDER_FRAMESIZE *render_framesize ) +{ + int32_t tmp; + + *render_framesize = IVAS_RENDER_FRAMESIZE_UNKNOWN; + if ( !is_digits_only( value ) ) + { + return false; + } + tmp = (int32_t) strtol( value, NULL, 0 ); + switch ( (int16_t) tmp ) + { + case 5: + *render_framesize = IVAS_RENDER_FRAMESIZE_5MS; + break; + case 10: + *render_framesize = IVAS_RENDER_FRAMESIZE_10MS; + break; + case 20: + *render_framesize = IVAS_RENDER_FRAMESIZE_20MS; + break; + default: + return false; + } + + return true; +} + + +static IVAS_AUDIO_CONFIG parseAudioConfig( + const char *configString, + bool *srRtp ) +{ + char charBuf[25]; + charBuf[24] = '\0'; + + *srRtp = false; + strncpy( charBuf, configString, sizeof( charBuf ) - 1 ); + charBuf[sizeof( charBuf ) - 1] = '\0'; + to_upper( charBuf ); + + if ( strcmp( charBuf, "BINAURAL" ) == 0 ) + { + return IVAS_AUDIO_CONFIG_BINAURAL; + } + if ( strcmp( charBuf, "BINAURAL_SPLIT_PCM" ) == 0 ) + { + return IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM; + } + if ( strcmp( charBuf, "BINAURAL_SPLIT_CODED" ) == 0 ) + { + return IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED; + } + if ( strcmp( charBuf, "RTPDUMP" ) == 0 ) + { + *srRtp = true; + return IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED; + } + return IVAS_AUDIO_CONFIG_INVALID; +} + + +static bool checkRequiredArgs( + CmdlnArgs args ) +{ + const CmdLnParser_Option *tmpOption; + + /* Check required arguments */ + bool missingRequiredArg = false; + if ( isEmptyString( args.inputFilePath ) ) + { + tmpOption = findOptionById( CmdLnOptionId_inputFile ); + fprintf( stderr, "Missing required argument: %s (%s)\n", tmpOption->match, tmpOption->matchShort ); + missingRequiredArg = true; + } + + const bool singleInputSpecified = ( args.inConfig.numBinBuses != 0 ); + + if ( !args.sceneDescriptionInput && !singleInputSpecified ) + { + /* Neither scene description input nor single-type input was specified on command line */ + tmpOption = findOptionById( CmdLnOptionId_inputFormat ); + fprintf( stderr, "Missing required argument: %s (%s)\n", tmpOption->match, tmpOption->matchShort ); + missingRequiredArg = true; + } + if ( isEmptyString( args.outputFilePath ) ) + { + tmpOption = findOptionById( CmdLnOptionId_outputFile ); + fprintf( stderr, "Missing required argument: %s (%s)\n", tmpOption->match, tmpOption->matchShort ); + missingRequiredArg = true; + } + if ( args.sampleRate == 0 ) + { + tmpOption = findOptionById( CmdLnOptionId_sampleRate ); + fprintf( stderr, "Missing required argument: %s (%s)\n", tmpOption->match, tmpOption->matchShort ); + missingRequiredArg = true; + } + if ( missingRequiredArg ) + { + CmdLnParser_printUsage( args.executableName, cliOptions, numCliOptions ); + } + + return !missingRequiredArg; +} + + +static CmdlnArgs defaultArgs( + const char *executableName ) +{ + CmdlnArgs args; + + strncpy( args.executableName, executableName, POST_REND_MAX_CLI_ARG_LENGTH ); + clearString( args.inputFilePath ); + clearString( args.outputFilePath ); + clearString( args.srParamsFilePath ); + args.sampleRate = 0; + + args.outConfig.audioConfig = IVAS_AUDIO_CONFIG_INVALID; + + for ( int32_t i = 0; i < RENDERER_MAX_ISAR_MD_INPUTS; ++i ) + { + clearString( args.inMetadataFilePaths[i] ); + } + args.numInMetadataFiles = 0; + + clearString( args.headRotationFilePath ); + clearString( args.splitRendBFIFilePath ); + + args.delayCompensationEnabled = true; + args.quietModeEnabled = false; + args.sceneDescriptionInput = false; + + args.render_framesize = IVAS_RENDER_FRAMESIZE_20MS; + + return args; +} + + +static void parseOption( + const int32_t optionId, + char **optionValues, + const int16_t numOptionValues, + void *pOutputStruct ) +{ + CmdlnArgs *args = pOutputStruct; + + switch ( optionId ) + { + case CmdLnOptionId_listFormats: + assert( numOptionValues == 0 ); + printSupportedAudioConfigs(); + exit( 0 ); + case CmdLnOptionId_inputFile: + assert( numOptionValues == 1 ); + strncpy( args->inputFilePath, optionValues[0], POST_REND_MAX_CLI_ARG_LENGTH - 1 ); + break; + case CmdLnOptionId_inputFormat: + assert( numOptionValues == 1 ); + if ( !parseInConfig( optionValues[0], &args->inConfig, &args->sceneDescriptionInput ) ) + { + exit( -1 ); /* Error printout handled by failing function */ + } + break; + case CmdLnOptionId_inputMetadata: + assert( numOptionValues <= RENDERER_MAX_ISAR_MD_INPUTS ); + for ( int16_t i = 0; i < numOptionValues; ++i ) + { + strncpy( args->inMetadataFilePaths[i], optionValues[i], POST_REND_MAX_CLI_ARG_LENGTH - 1 ); + } + args->numInMetadataFiles = numOptionValues; + break; + case CmdLnOptionId_outputFile: + assert( numOptionValues == 1 ); + strncpy( args->outputFilePath, optionValues[0], POST_REND_MAX_CLI_ARG_LENGTH - 1 ); + break; + case CmdLnOptionId_sampleRate: + assert( numOptionValues == 1 ); + args->sampleRate = (int32_t) ( strtol( optionValues[0], NULL, 10 ) * 1000 ); + if ( args->sampleRate == 0 ) + { + fprintf( stderr, "Invalid sampling rate specified\n" ); + exit( -1 ); + } + break; + case CmdLnOptionId_trajFile: + assert( numOptionValues == 1 ); + strncpy( args->headRotationFilePath, optionValues[0], POST_REND_MAX_CLI_ARG_LENGTH - 1 ); + break; + case CmdLnOptionId_SplitRendBFIFile: + assert( numOptionValues == 1 ); + strncpy( args->splitRendBFIFilePath, optionValues[0], POST_REND_MAX_CLI_ARG_LENGTH - 1 ); + break; + case CmdLnOptionId_complexityLevel: + assert( numOptionValues == 1 ); + args->complexityLevel = (int32_t) ( strtol( optionValues[0], NULL, 10 ) ); + if ( args->complexityLevel < ISAR_POST_REND_COMPLEXITY_LEVEL_ONE || args->complexityLevel > ISAR_POST_REND_COMPLEXITY_LEVEL_THREE ) + { + fprintf( stdout, "Invalid complexity level specified.\n" ); + exit( -1 ); + } + else if ( args->complexityLevel == ISAR_POST_REND_COMPLEXITY_LEVEL_ONE || args->complexityLevel == ISAR_POST_REND_COMPLEXITY_LEVEL_TWO ) + { + fprintf( stdout, "Complexity levels 1 and 2 will be defined after characterisation - default to level 3 (full functionality).\n" ); + } + break; + case CmdLnOptionId_noDelayCmp: + assert( numOptionValues == 0 ); + args->delayCompensationEnabled = false; + break; + case CmdLnOptionId_quietModeEnabled: + assert( numOptionValues == 0 ); + args->quietModeEnabled = true; + break; + case CmdLnOptionId_framing: + assert( numOptionValues == 1 ); + if ( !parseRenderFramesize( optionValues[0], &args->render_framesize ) ) + { + fprintf( stderr, "Unknown or invalid option for frame size: %s\n", optionValues[0] ); + exit( -1 ); + } + + break; + case CmdLnOptionId_srParamsFile: + assert( numOptionValues == 1 ); + strncpy( args->srParamsFilePath, optionValues[0], POST_REND_MAX_CLI_ARG_LENGTH - 1 ); + break; + default: + assert( 0 && "This should be unreachable - all command line options should be explicitly handled." ); + break; + } + + return; +} + + +static CmdlnArgs parseCmdlnArgs( + const int argc, + char **argv ) +{ + CmdlnArgs args = defaultArgs( argv[0] ); + + if ( CmdLnParser_parseArgs( argc, argv, cliOptions, numCliOptions, &args, parseOption ) != 0 ) + { + exit( -1 ); /* Error printout handled by failing function */ + } + + if ( !checkRequiredArgs( args ) ) + { + exit( -1 ); /* Error printout handled by failing function */ + } + + return args; +} + + +static void printSupportedAudioConfigs( void ) +{ + uint16_t i; + const char *supportedFormats[] = { + "BINAURAL (output only)", + "BINAURAL_SPLIT_PCM", + "BINAURAL_SPLIT_CODED", + "RTPDUMP", + }; + + fprintf( stdout, "Supported audio formats:\n" ); + for ( i = 0; i < sizeof( supportedFormats ) / sizeof( *supportedFormats ); i++ ) + { + fprintf( stdout, "%s\n", supportedFormats[i] ); + } + + return; +} + +/*--------------------------------------------------------------------------* + * convertInputBuffer() + * + * Convert input buffer from WAV/PCM file (int16_t, interleaved) to a format + * accepted by the renderer (float, packed) + *--------------------------------------------------------------------------*/ + +static void convertInputBuffer( + const int16_t *intBuffer, + const int16_t numIntSamplesPerChannel, + const int16_t numFloatSamplesPerChannel, + const int16_t numChannels, + Word32 *fixedBuffer ) +{ + int16_t chnl, smpl, i; + + i = 0; + + FOR( smpl = 0; smpl < numFloatSamplesPerChannel; ++smpl ) + { + FOR( chnl = 0; chnl < numChannels; ++chnl ) + { + IF( i < numIntSamplesPerChannel ) + { + fixedBuffer[chnl * numFloatSamplesPerChannel + smpl] = (Word32) intBuffer[i]; + } + ELSE + { + fixedBuffer[chnl * numFloatSamplesPerChannel + smpl] = 0; + } + + ++i; + } + } + + return; +} + + +/*--------------------------------------------------------------------------* + * convertOutputBuffer() + * + * Convert output buffer from the renderer (float, packed) to a format ready + * for writing to a WAV/PCM file (int16_t, interleaved) + *--------------------------------------------------------------------------*/ + +static void convertOutputBuffer( + const Word32 *fixedBuffer, + Word16 q, + const int16_t numSamplesPerChannel, + const int16_t numChannels, + int16_t *intBuffer ) +{ + int16_t chnl, smpl, i; + Word32 temp; + + i = 0; + + for ( smpl = 0; smpl < numSamplesPerChannel; ++smpl ) + { + for ( chnl = 0; chnl < numChannels; ++chnl ) + { + temp = L_shr_r( fixedBuffer[chnl * numSamplesPerChannel + smpl], q ); + IF( GT_32( temp, ISAR_MAX16B_FX ) ) + { + temp = ISAR_MAX16B_FX; + } + ELSE IF( LT_32( temp, ISAR_MIN16B_FX ) ) + { + temp = ISAR_MIN16B_FX; + } + intBuffer[i] = (int16_t) temp; + + ++i; + } + } + + return; +} + +static void trim( char *str ) +{ + char c; + int r = 0, w = 0; + while ( ( c = str[r] ) != 0 && ( c == ' ' || c == '\t' || c == ';' ) ) + { + r++; + } + + while ( ( c = str[r] ) != 0 && ( c != ' ' && c != '\t' && c != ';' ) ) + { + str[w++] = c; + r++; + } + str[w] = 0; +} + +static ivas_error parseSRParamsFile( + const char *srParamsFilePath, + const char *rtpFilePath, + ISAR_SPLIT_REND_CODEC *codec, + ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, + int16_t *codec_frame_size_ms, + int16_t *isar_frame_size_ms, + int16_t *lc3plusHighRes ) +{ + FILE *fParamSR = fopen( srParamsFilePath, "r" ); + if ( NULL == fParamSR ) + { + fprintf( stderr, "error in opening srParams File %s)\n", srParamsFilePath ); + return IVAS_ERR_FAILED_FILE_OPEN; + } + + *codec = ISAR_SPLIT_REND_CODEC_NONE; + *poseCorrection = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE; + *codec_frame_size_ms = 5; + *lc3plusHighRes = 0; + + while ( !feof( fParamSR ) ) + { + char key[16], value[16]; + if ( 2 == fscanf( fParamSR, "%15s = %15s", key, value ) ) + { + trim( key ); + trim( value ); + + if ( 0 == strncmp( key, "DOF", 3 ) ) + { + int val = atoi( value ); + if ( val == 0 || val == 1 ) + { + *poseCorrection = ( val == 0 ) ? ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE : ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB; + } + } + else if ( 0 == strncmp( key, "LC3PLUS_HIGHRES", 15 ) ) + { + int val = atoi( value ); + if ( val == 0 || val == 1 ) + { + *lc3plusHighRes = (int16_t) val; + } + } + } + } + + fclose( fParamSR ); + + { + /* Peek the RTP stream to ascertain the codec and codec_frame_size */ + ivas_error error = IVAS_ERR_OK; + IVAS_RTP srRtp = { 0 }; + if ( ( error = IVAS_RTP_READER_Init( &srRtp, rtpFilePath, NULL, false, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "error in IVAS_RTP_READER_Init() for sr RTP peek: %d\n", error ); + return error; + } + + /* read a frame */ + while ( 1 ) + { + bool qBit = false; + IVAS_RTP_SR_INFO srInfo = { 0 }; + uint8_t au[( IVAS_MAX_BITS_PER_FRAME + 7 ) >> 3]; + int16_t auSize = 0; + uint16_t rtpSequenceNumber = 0; + uint32_t rtpTimeStamp = 0, nextPacketRcvTime_ms = 0; + + error = IVAS_RTP_ReadNextFrame( &srRtp, au, &auSize, &rtpTimeStamp, &rtpSequenceNumber, &nextPacketRcvTime_ms, &srInfo, &qBit ); + if ( error != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_RTP_ReadNextFrame, error code: %d\n", error ); + return error; + } + + if ( srInfo.valid ) + { + *codec = ( srInfo.codec == IVAS_SR_TRANSPORT_LCLD ) ? ISAR_SPLIT_REND_CODEC_LCLD : ISAR_SPLIT_REND_CODEC_LC3PLUS; + *codec_frame_size_ms = (int16_t) srInfo.codecFrameSizeMs; + *isar_frame_size_ms = *codec_frame_size_ms; /* for rtp force codec framesize as isar renderer frame size */ + break; + } + } + IVAS_RTP_Term( &srRtp ); + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------------------------* + * main() + * + * Main ISAR post renderer function for command-line interface + *------------------------------------------------------------------------------------------*/ + +int main( + int argc, + char **argv ) +{ + bool mainFailed = true; /* Assume main failed until cleanup is reached without errors */ + ISAR_POST_REND_HANDLE hIsarPostRend = NULL; + RotFileReader *headRotReader = NULL; + RotFileReader *externalOrientationFileReader = NULL; + SplitRendBFIFileReader *splitRendBFIReader = NULL; + AudioFileReader *audioReader = NULL; + AudioFileWriter *audioWriter = NULL; + int32_t inBufferSize; + int32_t outBufferSize; + int32_t bitsBufferSize; + int16_t *inpInt16Buffer = NULL; + Word32 *inFloatBuffer_fx = NULL; + int16_t *outInt16Buffer = NULL; + Word32 *outFloatBuffer_fx = NULL; + uint8_t *bitsBufferData = NULL; + IVAS_REND_AudioBuffer inBuffer; + IVAS_REND_AudioBuffer outBuffer; + ISAR_POST_REND_BitstreamBuffer bitsBuffer; + SplitFileReadWrite *hSplitRendFileReadWrite; + char audioFilePath[FILENAME_MAX]; + int16_t numSamplesRead; + int16_t delayNumSamples = -1; + int16_t delayNumSamples_orig = 0; + int16_t zeroPad = 0; + int16_t zeroPadToWrite = 0; + int32_t delayTimeScale = 0; + int16_t i, numChannels; + ivas_error error = IVAS_ERR_OK; + bool splitBinNeedsNewFrame = true; + IVAS_RTP srRTP = { 0 }; + +#ifdef WMOPS + reset_wmops(); + reset_mem( USE_BYTES ); +#endif + + inBuffer.pq_fact = NULL; + outBuffer.pq_fact = NULL; + + hSplitRendFileReadWrite = NULL; + bitsBuffer.bits = NULL; + bitsBuffer.config.bitsRead = 0; + bitsBuffer.config.bitsWritten = 0; + bitsBuffer.config.bufLenInBytes = 0; + bitsBuffer.config.codec = ISAR_SPLIT_REND_CODEC_DEFAULT; + bitsBuffer.config.poseCorrection = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE; + bitsBuffer.config.codec_frame_size_ms = 5; + bitsBuffer.config.isar_frame_size_ms = 20; + bitsBuffer.config.lc3plusHighRes = 0; + + /*------------------------------------------------------------------------------------------* + * Parse command-line arguments + *------------------------------------------------------------------------------------------*/ + + CmdlnArgs args = parseCmdlnArgs( argc, argv ); + + convert_backslash( args.inputFilePath ); + convert_backslash( args.outputFilePath ); + convert_backslash( args.headRotationFilePath ); + convert_backslash( args.srParamsFilePath ); + + /*------------------------------------------------------------------------------------------* + * Open head-rotation file + *------------------------------------------------------------------------------------------*/ + + if ( !isEmptyString( args.headRotationFilePath ) ) + { + if ( RotationFileReader_open( args.headRotationFilePath, &headRotReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError opening file: %s\n", args.headRotationFilePath ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Open BFI file + *------------------------------------------------------------------------------------------*/ + + if ( !isEmptyString( args.splitRendBFIFilePath ) ) + { + convert_backslash( args.splitRendBFIFilePath ); + SplitRendBFIFileReader_open( args.splitRendBFIFilePath, &splitRendBFIReader ); + } + + int32_t inFileSampleRate = 0; + strncpy( audioFilePath, args.inputFilePath, FILENAME_MAX - 1 ); + hSplitRendFileReadWrite = NULL; + if ( ( args.inConfig.numBinBuses > 0 ) && ( args.inConfig.binBuses[0].audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + error = split_rend_reader_open( &hSplitRendFileReadWrite, + args.inMetadataFilePaths[0], + &bitsBuffer.config.codec, + &bitsBuffer.config.poseCorrection, + &bitsBuffer.config.codec_frame_size_ms, + &bitsBuffer.config.isar_frame_size_ms, + &inFileSampleRate, + &bitsBuffer.config.lc3plusHighRes ); + if ( error != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCould not open split rend metadata file %s\n", args.inMetadataFilePaths[0] ); + goto cleanup; + } + + if ( AudioFileReader_open( &audioReader, audioFilePath ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError opening file: %s\n", audioFilePath ); + goto cleanup; + } + } + + if ( ( args.inConfig.numBinBuses > 0 ) && ( args.inConfig.binBuses[0].srRtp ) ) + { + error = parseSRParamsFile( args.srParamsFilePath, + args.inputFilePath, + &bitsBuffer.config.codec, + &bitsBuffer.config.poseCorrection, + &bitsBuffer.config.codec_frame_size_ms, + &bitsBuffer.config.isar_frame_size_ms, + &bitsBuffer.config.lc3plusHighRes ); + if ( error != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCould not open split rend params file %s\n", args.srParamsFilePath ); + goto cleanup; + } + + if ( ( error = IVAS_RTP_READER_Init( &srRTP, args.inputFilePath, NULL, false, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "error in IVAS_RTP_READER_Init(): %d\n", error ); + goto cleanup; + } + audioReader = NULL; + + /* Force owerwrite of command line provided rendersize to align with codec frame size */ + args.render_framesize = bitsBuffer.config.isar_frame_size_ms / 5; + } + /*if split renderer is running in post renderer mode*/ + else if ( ( args.inConfig.numBinBuses > 0 ) && ( args.inConfig.binBuses[0].audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) + { + error = split_rend_reader_open( &hSplitRendFileReadWrite, + args.inputFilePath, + &bitsBuffer.config.codec, + &bitsBuffer.config.poseCorrection, + &bitsBuffer.config.codec_frame_size_ms, + &bitsBuffer.config.isar_frame_size_ms, + &inFileSampleRate, + &bitsBuffer.config.lc3plusHighRes ); + if ( error != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCould not open split rend metadata file %s\n", args.inputFilePath ); + goto cleanup; + } + audioReader = NULL; + } + + if ( audioReader != NULL ) + { + error = AudioFileReader_getSamplingRate( audioReader, &inFileSampleRate ); + } + else if ( hSplitRendFileReadWrite == NULL ) + { + inFileSampleRate = args.sampleRate; + } + + switch ( error ) + { + case IVAS_ERR_OK: + /* If sampling rate not given on command line, use the one from SR file */ + if ( args.sampleRate == 0 ) + { + args.sampleRate = inFileSampleRate; + } + /* else if sampling rate given on command line, compare with wav file */ + else if ( inFileSampleRate != args.sampleRate ) + { + fprintf( stderr, "\nSampling rate mismatch: %d Hz requested, but %d Hz found in file %s\n", args.sampleRate, inFileSampleRate, args.inputFilePath ); + goto cleanup; + } + break; + case IVAS_ERR_SAMPLING_RATE_UNKNOWN: /* Returned when input is raw PCM */ + if ( args.sampleRate == 0 ) + { + fprintf( stderr, "\nSampling rate must be specified on command line when using raw PCM input\n" ); + goto cleanup; + } + break; + default: + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + int16_t inFileNumChannels = 0; + if ( audioReader != NULL ) + { + error = AudioFileReader_getNumChannels( audioReader, &inFileNumChannels ); + if ( error != IVAS_ERR_OK && error != IVAS_ERR_NUM_CHANNELS_UNKNOWN ) + { + fprintf( stderr, "\nAudioFileReader_getNumChannels failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + } + + /*------------------------------------------------------------------------------------------* + * Open ISAR handle + *------------------------------------------------------------------------------------------*/ + + const int16_t frameSize_smpls = (int16_t) ( ( args.render_framesize ) * args.sampleRate * 5 / ( 1000 ) ); + args.outConfig.audioConfig = IVAS_AUDIO_CONFIG_BINAURAL; + if ( ( error = ISAR_POST_REND_open( &hIsarPostRend, args.sampleRate, args.outConfig.audioConfig, true, 0, 0, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError opening renderer handle: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Configuration + *------------------------------------------------------------------------------------------*/ + + if ( ( error = ISAR_POST_REND_InitConfig( hIsarPostRend, args.outConfig.audioConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in Renderer Config Init: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + if ( args.inConfig.numBinBuses > 0 ) + { + if ( ( error = ISAR_REND_SetSplitRendBitstreamHeader( hIsarPostRend, + bitsBuffer.config.codec, + bitsBuffer.config.poseCorrection, + bitsBuffer.config.codec_frame_size_ms, + bitsBuffer.config.isar_frame_size_ms, + bitsBuffer.config.lc3plusHighRes ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in getting split renderer bitstream header: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + } + + + ISAR_POST_REND_InputId splitBinIds[RENDERER_MAX_BIN_INPUTS]; + + for ( i = 0; i < RENDERER_MAX_BIN_INPUTS; i++ ) + { + splitBinIds[i] = 0u; + } + + for ( i = 0; i < args.inConfig.numBinBuses; ++i ) + { + if ( ( error = ISAR_POST_REND_AddInput( hIsarPostRend, args.inConfig.binBuses[i].audioConfig, &splitBinIds[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nISAR_POST_REND_AddInput failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + } + + const int16_t totalNumInChannels = getTotalNumInChannels( hIsarPostRend, splitBinIds ); + + if ( inFileNumChannels != 0 /* inFileNumChannels is 0 with raw PCM input */ && totalNumInChannels != inFileNumChannels ) + { + fprintf( stderr, "\nNumber of channels in input file does not match selected configuration\n" ); + goto cleanup; + } + + int16_t numOutChannels = 2; + + if ( AudioFileWriter_open( &audioWriter, args.outputFilePath, args.sampleRate, numOutChannels ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nFailed to open file: %s\n", args.outputFilePath ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Allocate processing buffers + *------------------------------------------------------------------------------------------*/ + + inBufferSize = frameSize_smpls * totalNumInChannels; + outBufferSize = frameSize_smpls * numOutChannels; + inpInt16Buffer = malloc( inBufferSize * sizeof( int16_t ) ); + memset( inpInt16Buffer, 0, inBufferSize * sizeof( int16_t ) ); + + inFloatBuffer_fx = malloc( inBufferSize * sizeof( Word32 ) ); + inBuffer.config.numSamplesPerChannel = (int16_t) frameSize_smpls; + outFloatBuffer_fx = malloc( outBufferSize * sizeof( Word32 ) ); + outBuffer.config.numSamplesPerChannel = (int16_t) frameSize_smpls; + + outInt16Buffer = malloc( outBufferSize * sizeof( int16_t ) ); + + inBuffer.config.is_cldfb = 0; + inBuffer.config.numChannels = (int16_t) totalNumInChannels; + inBuffer.data_fx = inFloatBuffer_fx; + inBuffer.pq_fact = malloc( sizeof( Word16 ) ); + + outBuffer.config.is_cldfb = 0; + outBuffer.config.numChannels = (int16_t) numOutChannels; + outBuffer.data_fx = outFloatBuffer_fx; + outBuffer.pq_fact = malloc( sizeof( Word16 ) ); + + memset( outBuffer.data_fx, 0, outBuffer.config.numSamplesPerChannel * outBuffer.config.numChannels * sizeof( Word32 ) ); + + bitsBufferSize = ISAR_SPLIT_REND_BITS_BUFF_SIZE; + + if ( bitsBufferSize > 0 ) + { + bitsBufferData = malloc( bitsBufferSize * sizeof( uint8_t ) ); + } + else + { + bitsBufferData = NULL; + } + + bitsBuffer.bits = bitsBufferData; + bitsBuffer.config.bitsRead = 0; + bitsBuffer.config.bitsWritten = 0; + bitsBuffer.config.bufLenInBytes = bitsBufferSize; + +#ifdef WMOPS + reset_stack(); + reset_wmops(); +#endif + + if ( !args.quietModeEnabled ) + { + fprintf( stdout, "\n------ Running the ISAR post renderer ------\n\n" ); + fprintf( stdout, "Frames processed: " ); + } + else + { + fprintf( stdout, "\n\n-- Start the ISAR post renderer (quiet mode) --\n\n" ); + } + + /*------------------------------------------------------------------------------------------* + * Loop for every frame of data + * - Read the input data + * - Run the post-rendering + * - Write the data into output file + *------------------------------------------------------------------------------------------*/ + + while ( 1 ) + { + int16_t bfi = 0; + int16_t num_in_channels; + num_in_channels = inBuffer.config.numChannels; + + numSamplesRead = 0; + if ( srRTP.hRtpFile && splitBinNeedsNewFrame ) + { + IVAS_RTP_SR_INFO srInfo = { 0 }; + uint32_t rtpTimeStamp = 0, nextPacketRcvTime_ms = 0; + uint16_t rtpSequenceNumber = 0; + int16_t auSizeBits = 0; + bool qBit = false; + uint8_t *bitBuffer = bitsBuffer.bits; + int16_t frameMS = 0; + + numSamplesRead = (int16_t) inBufferSize; + bitsBuffer.config.bitsRead = 0; + bitsBuffer.config.bitsWritten = 0; + + while ( frameMS < bitsBuffer.config.isar_frame_size_ms ) + { + error = IVAS_RTP_ReadNextFrame( &srRTP, bitBuffer, &auSizeBits, &rtpTimeStamp, &rtpSequenceNumber, &nextPacketRcvTime_ms, &srInfo, &qBit ); + if ( error != IVAS_ERR_OK ) + { + if ( error == IVAS_ERR_END_OF_FILE ) + { + numSamplesRead = 0; + break; + } + else + { + fprintf( stderr, "\nUnable to read from bitstream file!\n" ); + goto cleanup; + } + } + /* Ensure a SR RTP stream was received */ + if ( !srInfo.valid ) + { + fprintf( stderr, "\nNon-SR RTP stream detected !\n" ); + goto cleanup; + } + + bitBuffer += ( auSizeBits + 7 ) / 8; + bitsBuffer.config.bitsWritten += auSizeBits; + bitsBuffer.config.codec = srInfo.codec == IVAS_SR_TRANSPORT_LC3PLUS ? ISAR_SPLIT_REND_CODEC_LC3PLUS : ISAR_SPLIT_REND_CODEC_LCLD; + frameMS += bitsBuffer.config.codec_frame_size_ms; + } + } + else if ( ( hSplitRendFileReadWrite != NULL ) && splitBinNeedsNewFrame ) + { + ivas_error error_tmp; + numSamplesRead = (int16_t) inBufferSize; + error_tmp = split_rend_read_bits_from_file( hSplitRendFileReadWrite, bitsBuffer.bits, &bitsBuffer.config.bitsRead, &bitsBuffer.config.bitsWritten, &bfi ); + if ( error_tmp != IVAS_ERR_OK ) + { + if ( error_tmp == IVAS_ERR_END_OF_FILE ) + { + numSamplesRead = 0; + } + else + { + fprintf( stderr, "\nUnable to read from bitstream file!\n" ); + goto cleanup; + } + } + } + + if ( audioReader != NULL ) + { + /* Read the input data */ + if ( ( error = AudioFileReader_read( audioReader, inpInt16Buffer, (int16_t) inBufferSize, &numSamplesRead ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError reading from file %s\n", audioFilePath ); + goto cleanup; + } + } + + if ( numSamplesRead == 0 && splitBinNeedsNewFrame ) + { + /* end of input data */ + break; + } + + /* Convert from int to float and from interleaved to packed */ + convertInputBuffer( inpInt16Buffer, numSamplesRead, inBuffer.config.numSamplesPerChannel, num_in_channels, inFloatBuffer_fx ); + *inBuffer.pq_fact = 0; + int16_t num_subframes, sf_idx; + num_subframes = (int16_t) args.render_framesize; + + /* Read from head rotation trajectory file if specified */ + if ( headRotReader != NULL ) + { + for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + IVAS_QUATERNION headRot; + IVAS_VECTOR3 Pos; + + IF( ( error = HeadRotationFileReading( headRotReader, &headRot, &Pos ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + if ( ( error = ISAR_POST_REND_SetHeadRotation( hIsarPostRend, headRot, Pos, DEFAULT_AXIS, sf_idx ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError setting Head Rotation: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + } + } + else + { + fprintf( stderr, "\nHead Rotation should be enabled in post renderer\n" ); + goto cleanup; + } + + /* Read from split renderer bfi file if specified */ + if ( splitRendBFIReader != NULL && splitBinNeedsNewFrame ) + { + if ( ( error = SplitRendBFIFileReading( splitRendBFIReader, &bfi ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in SplitRendBFIFileReading(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + } + + if ( splitBinNeedsNewFrame ) + { + if ( ( error = ISAR_POST_REND_SetSplitRendBFI( hIsarPostRend, bfi ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in ISAR_POST_REND_SetSplitRendBFI(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + } + + for ( i = 0; i < args.inConfig.numBinBuses; ++i ) + { + if ( numSamplesRead > 0 ) + { + if ( ( error = ISAR_POST_REND_GetInputNumChannels( hIsarPostRend, splitBinIds[i], &numChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + ISAR_POST_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.binBuses[i].inputChannelIndex, numChannels ); + + if ( ( error = ISAR_POST_REND_FeedInputAudio( hIsarPostRend, splitBinIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nISAR_POST_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + } + if ( splitBinNeedsNewFrame ) + { + if ( ( error = ISAR_POST_REND_FeedSplitBinauralBitstream( hIsarPostRend, splitBinIds[i], &bitsBuffer ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nISAR_POST_REND_FeedSplitBinauralBitstream failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + /* Set BFI if frame is empty */ + int16_t frameEmpty = (int16_t) ( bitsBuffer.config.bitsWritten == 0 ); + if ( frameEmpty ) + { + if ( ( error = ISAR_POST_REND_SetSplitRendBFI( hIsarPostRend, 1 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in ISAR_POST_REND_SetSplitRendBFI(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + } + } + } + + if ( ( error = ISAR_POST_REND_GetSplitBinauralSamples( hIsarPostRend, outBuffer, &splitBinNeedsNewFrame ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nISAR_POST_REND_GetSplitBinauralSamples failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + int16_t num_out_channels; + num_out_channels = outBuffer.config.numChannels; + + /* Convert from float to int and from packed to interleaved. + * Values in outFloatBuffer are guaranteed to be within range INT16_MIN:INT16_MAX */ + convertOutputBuffer( outFloatBuffer_fx, *outBuffer.pq_fact, outBuffer.config.numSamplesPerChannel, num_out_channels, outInt16Buffer ); + + if ( delayNumSamples == -1 ) + { + if ( args.delayCompensationEnabled ) + { + if ( ISAR_POST_REND_GetDelay( hIsarPostRend, &delayNumSamples, &delayTimeScale ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of renderer!\n" ); + goto cleanup; + } + + if ( hSplitRendFileReadWrite != NULL ) + { + uint32_t pre_rend_delay_ns; + split_rend_read_pre_rend_delay_ns( hSplitRendFileReadWrite, &pre_rend_delay_ns ); + delayNumSamples += (Word16) ( ( ( (Word64) pre_rend_delay_ns * delayTimeScale ) + 500000000 ) / 1000000000 ); + } + + delayNumSamples_orig = delayNumSamples; + } + else + { + delayNumSamples = 0; + } + zeroPad = delayNumSamples; + } + + if ( audioWriter != NULL ) + { + if ( delayNumSamples * num_out_channels < outBufferSize ) + { + if ( AudioFileWriter_write( audioWriter, &outInt16Buffer[delayNumSamples * num_out_channels], outBufferSize - ( delayNumSamples * num_out_channels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing audio file %s\n", args.outputFilePath ); + goto cleanup; + } + delayNumSamples = 0; + } + else + { + delayNumSamples -= (int16_t) ( outBufferSize / num_out_channels ); + } + } + + bitsBuffer.config.bitsRead = 0; + bitsBuffer.config.bitsWritten = 0; + + frame++; + if ( !args.quietModeEnabled ) + { + fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); + } + +#ifdef WMOPS + update_mem(); + update_wmops(); +#endif + } + + /* add zeros at the end to have equal length of synthesized signals */ + if ( audioWriter != NULL ) + { + for ( zeroPadToWrite = zeroPad; zeroPadToWrite > frameSize_smpls; zeroPadToWrite -= frameSize_smpls ) + { + memset( outInt16Buffer, 0, outBufferSize * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, outBufferSize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + } + + memset( outInt16Buffer, 0, zeroPadToWrite * outBuffer.config.numChannels * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, zeroPadToWrite * outBuffer.config.numChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + zeroPadToWrite = 0; + } + + if ( !args.quietModeEnabled && args.delayCompensationEnabled ) + { + fprintf( stdout, "\nRenderer delay: %-5u [samples] - Timescale: %5u\n", delayNumSamples_orig, delayTimeScale ); + } + + fprintf( stdout, "\n\nRendering of %d frames finished\n\n", frame ); + +#ifdef DEBUGGING + int32_t cnt_frames_limited, noClipping; + if ( ( cnt_frames_limited = ISAR_POST_REND_GetCntFramesLimited( hIsarPostRend ) ) > 0 ) + { + fprintf( stdout, "Limiter applied in %d frames.\n\n", cnt_frames_limited ); + } + if ( ( noClipping = ISAR_POST_REND_GetNoCLipping( hIsarPostRend ) ) > 0 ) + { + fprintf( stdout, "Clipping (saturation) detected: %d samples clipped!!!\n\n", noClipping ); + } +#endif + + /*------------------------------------------------------------------------------------------* + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ + + mainFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ + +cleanup: + + free( inpInt16Buffer ); + free( inFloatBuffer_fx ); + free( inBuffer.pq_fact ); + free( outInt16Buffer ); + free( outFloatBuffer_fx ); + free( outBuffer.pq_fact ); + + if ( bitsBufferData != NULL ) + { + free( bitsBufferData ); + } + + split_rend_reader_writer_close( &hSplitRendFileReadWrite ); + SplitRendBFIFileReader_close( &splitRendBFIReader ); + + AudioFileReader_close( &audioReader ); + AudioFileWriter_close( &audioWriter ); + RotationFileReader_close( &headRotReader ); + RotationFileReader_close( &externalOrientationFileReader ); + + ISAR_POST_REND_Close( &hIsarPostRend ); + +#ifdef DEBUGGING + dbgclose(); +#endif +#ifdef WMOPS + print_wmops(); + print_mem( NULL ); +#endif + + return mainFailed ? -1 : 0; +} + + +#undef WMC_TOOL_SKIP diff --git a/apps/renderer.c b/apps/renderer.c index ceb1a448e38d866ec5162e2cc637cf18273c5fd4..7137efd83570f6cf8da805c8c1745c1ee6805720 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -31,6 +31,7 @@ *******************************************************************************************************/ #include "lib_rend.h" +#include "typedef.h" #include #include #include @@ -45,8 +46,12 @@ #include "masa_file_writer.h" #include "render_config_reader.h" #include "rotation_file_reader.h" +#include "aeid_file_reader.h" +#include "split_render_file_read_write.h" +#include "split_rend_bfi_file_reader.h" #include "vector3_pair_file_reader.h" #include "wmc_auto.h" +#include "basop32.h" #define WMC_TOOL_SKIP @@ -68,6 +73,9 @@ #define IVAS_MIN16B_FLT ( -32768.0f ) #define IVAS_MAX16B_FX 32767 #define IVAS_MIN16B_FX ( -32768 ) + +#define OMASA_TDREND_MATCHING_GAIN_DB ( -2.0f ) + #if !defined( DEBUGGING ) && !defined( WMOPS ) static #endif @@ -141,6 +149,15 @@ typedef struct IVAS_CUSTOM_LS_DATA outSetupCustom; } OutputConfig; +typedef struct +{ + uint16_t *pID; + uint16_t *pValidity; + uint16_t count; + uint16_t selected; + uint16_t frameCounter; +} AcousticEnvironmentSequence; + typedef struct { char executableName[RENDERER_MAX_CLI_ARG_LENGTH]; @@ -149,15 +166,19 @@ typedef struct int32_t sampleRate; InputConfig inConfig; OutputConfig outConfig; - char inMetadataFilePaths[RENDERER_MAX_ISM_INPUTS][RENDERER_MAX_CLI_ARG_LENGTH]; + char inMetadataFilePaths[RENDERER_MAX_ISM_INPUTS + RENDERER_MAX_MASA_INPUTS][RENDERER_MAX_CLI_ARG_LENGTH]; int16_t numInMetadataFiles; + char outMetadataFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char headRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; + char splitRendBFIFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char referenceVectorFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char referenceRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char externalOrientationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char customHrtfFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char renderConfigFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; - int8_t orientation_tracking; + IVAS_HEAD_ORIENT_TRK_T orientation_tracking; + int16_t Opt_Headrotation; + int16_t Opt_ExternalOrientation; int16_t nonDiegeticPan; float nonDiegeticPanGain; IVAS_REND_COMPLEXITY_LEVEL complexityLevel; @@ -171,10 +192,11 @@ typedef struct float lfeConfigElevation; bool lfeCustomRoutingEnabled; char inLfePanningMatrixFile[RENDERER_MAX_CLI_ARG_LENGTH]; - float syncMdDelay; + int16_t syncMdDelay; IVAS_RENDER_FRAMESIZE render_framesize; uint16_t directivityPatternId[RENDERER_MAX_ISM_INPUTS]; - uint16_t acousticEnvironmentId; + AcousticEnvironmentSequence aeSequence; + IVAS_ROOM_SIZE_T reverbRoomSize; } CmdlnArgs; typedef enum @@ -198,12 +220,15 @@ typedef enum CmdLnOptionId_inputMetadata, CmdLnOptionId_listFormats, CmdLnOptionId_inputGain, + CmdLnOptionId_outputMetadata, + CmdLnOptionId_SplitRendBFIFile, CmdLnOptionId_referenceVectorFile, CmdLnOptionId_exteriorOrientationFile, CmdLnOptionId_framing, CmdLnOptionId_syncMdDelay, CmdLnOptionId_directivityPatternId, - CmdLnOptionId_acousticEnvironmentId + CmdLnOptionId_acousticEnvironmentId, + CmdLnOptionId_roomSize, } CmdLnOptionId; static const CmdLnParser_Option cliOptions[] = { @@ -217,13 +242,13 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_inputFormat, .match = "input_format", .matchShort = "if", - .description = "Audio format of input file (e.g. 5_1 or HOA3 or META, use -l for a list)", + .description = "Audio format of input file (e.g. 5_1 or HOA3 or META,\nuse -l for a list)", }, { .id = CmdLnOptionId_inputMetadata, .match = "input_metadata", .matchShort = "im", - .description = "Space-separated list of path to metadata files for ISM or MASA inputs", + .description = "Space-separated list of path to metadata files for ISM/MASA/OMASA/\nOSBA/BINAURAL_SPLIT_PCM inputs. \nFor OMASA, ISM files must be specified first.", }, { .id = CmdLnOptionId_outputFile, @@ -241,57 +266,71 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_sampleRate, .match = "sample_rate", .matchShort = "fs", - .description = "Input sampling rate in kHz (16, 32, 48) - required only with raw PCM inputs", + .description = "Input sampling rate in kHz (16, 32, 48) - required only with raw\nPCM inputs", }, { .id = CmdLnOptionId_trajFile, .match = "trajectory_file", .matchShort = "T", - .description = "Head rotation trajectory file for simulation of head tracking (only for binaural outputs)", + .description = "Head rotation trajectory file for simulation of head tracking\n(only for binaural outputs)", + }, + { + .id = CmdLnOptionId_outputMetadata, + .match = "output_metadata", + .matchShort = "om", + .description = "coded metadata file for BINAURAL_SPLIT_PCM output mode", + }, + { + .id = CmdLnOptionId_SplitRendBFIFile, + .match = "post_rend_bfi_file", + .matchShort = "prbfi", + .description = "Split rendering option: bfi file", }, { .id = CmdLnOptionId_refRotFile, .match = "reference_rotation_file", .matchShort = "rf", - .description = "Reference rotation trajectory file for simulation of head tracking (only for binaural outputs)", + .description = "Reference rotation trajectory file for simulation of head tracking\n(only for binaural outputs)", }, { .id = CmdLnOptionId_customHrtfFile, .match = "custom_hrtf", .matchShort = "hrtf", - .description = "Custom HRTF file for binaural rendering (only for binaural outputs)", + .description = "Custom HRTF file for binaural rendering\n(only for binaural outputs)", }, { .id = CmdLnOptionId_renderConfigFile, .match = "render_config_parameters", .matchShort = "render_config", - .description = "Binaural renderer configuration parameters in file (only for binaural outputs)", + .description = "Binaural renderer configuration parameters in file\n(only for binaural outputs)", }, { .id = CmdLnOptionId_nonDiegeticPan, .match = "non_diegetic_panning", .matchShort = "non_diegetic_pan", - .description = "Panning mono non diegetic sound to stereo -90<= pan <= 90\nleft or l or 90->left, right or r or -90->right, center or c or 0 ->middle\n", + .description = "Panning mono non diegetic sound to stereo -90<= pan <= 90\nleft or l or 90->left, right or r or -90->right,\ncenter or c or 0 ->middle", }, { .id = CmdLnOptionId_orientationTracking, .match = "tracking_type", .matchShort = "otr", - .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec` or `ref_vec_lev` (only for binaural outputs)", + .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec`\nor `ref_vec_lev` (only for binaural outputs)", }, { .id = CmdlnOptionId_lfePosition, .match = "lfe_position", .matchShort = "lp", - .description = "Output LFE position. Comma-delimited triplet of [gain, azimuth, elevation] where gain is linear (like --gain, -g) and azimuth, elevation are in degrees.\nIf specified, overrides the default behavior which attempts to map input to output LFE channel(s)", + .description = "Output LFE position. Comma-delimited triplet of [gain, azimuth,\nelevation] where gain is linear (like --gain, -g) and azimuth,\nelevation are in degrees. If specified, overrides the default\nbehavior which attempts to map input to output LFE channel(s)", + }, + { + .id = CmdlnOptionId_lfeMatrix, + .match = "lfe_matrix", + .matchShort = "lm", + .description = "LFE panning matrix. File (CSV table) containing a matrix of\ndimensions [ num_input_lfe x num_output_channels ] with elements\nspecifying linear routing gain (like --gain, -g). If specified,\noverrides the output LFE position option and the default\nbehavior which attempts to map input to output LFE channel(s)", }, - { .id = CmdlnOptionId_lfeMatrix, - .match = "lfe_matrix", - .matchShort = "lm", - .description = "LFE panning matrix. File (CSV table) containing a matrix of dimensions [ num_input_lfe x num_output_channels ] with elements specifying linear routing gain (like --gain, -g). \nIf specified, overrides the output LFE position option and the default behavior which attempts to map input to output LFE channel(s)" }, { .id = CmdLnOptionId_noDelayCmp, - .match = "no_delay_comparison", + .match = "no_delay_compensation", .matchShort = "no_delay_cmp", .description = "[flag] Turn off delay compensation", }, @@ -299,7 +338,7 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_complexityLevel, .match = "complexity_level", .matchShort = "level", - .description = "Complexity level, level = (1, 2, 3), will be defined after characterisation.", + .description = "Complexity level, level = (1, 2, 3), will be defined after\ncharacterisation.", }, { .id = CmdLnOptionId_quietModeEnabled, @@ -323,13 +362,13 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_referenceVectorFile, .match = "reference_vector_file", .matchShort = "rvf", - .description = "Reference vector trajectory file for simulation of head tracking (only for binaural outputs)", + .description = "Reference vector trajectory file for simulation of head tracking\n(only for binaural outputs)", }, { .id = CmdLnOptionId_exteriorOrientationFile, .match = "exterior_orientation_file", .matchShort = "exof", - .description = "External orientation trajectory file for simulation of external orientations", + .description = "External orientation trajectory file for simulation of external\norientations", }, { .id = CmdLnOptionId_framing, @@ -341,20 +380,26 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_syncMdDelay, .match = "sync_md_delay", .matchShort = "smd", - .description = "Metadata Synchronization Delay in ms, Default is 0. Quantized by 5ms subframes for TDRenderer (13ms -> 10ms -> 2subframes)", + .description = "Metadata Synchronization Delay in ms, Default is 0. Quantized by\n5ms subframes for TDRenderer (13ms -> 10ms -> 2subframes)", }, { .id = CmdLnOptionId_directivityPatternId, .match = "ism_directivity_pattern_id", .matchShort = "dpid", - .description = "Directivity pattern ID(s) = [ID1, ID2, ID3, ID4]. Space-separated list of up to 4 numbers (unsigned integers) can be specified for BINAURAL and BINAURAL_ROOM_REVERB output configuration.\nID1, ID2, ID3, ID4 specify the directivity pattern IDs used for ISMs 1,2,3 and 4 respectively.\nThis options needs to be accompanied by a render_config file, otherwise a default directivity pattern is used.", + .description = "Directivity pattern ID(s) = [ID1, ID2, ID3, ID4]. Space-separated\nlist of up to 4 numbers (unsigned integers) can be specified for\nBINAURAL and BINAURAL_ROOM_REVERB output.\nID1, ID2, ID3, ID4 specify the directivity pattern IDs used for\nISMs 1,2,3 and 4 respectively. \nThis option needs to be accompanied by a render_config file,\notherwise a default directivity pattern is used.", }, { .id = CmdLnOptionId_acousticEnvironmentId, .match = "acoustic_environment_id", .matchShort = "aeid", - .description = "Acoustic environment ID (number >= 0) for BINAURAL_ROOM_REVERB output configuration", + .description = "Acoustic environment ID (number > 0) alternatively, it can be a text file where each line contains \"ID duration\" for BINAURAL_ROOM_REVERB output configuration.", }, + { + .id = CmdLnOptionId_roomSize, + .match = "room_size", + .matchShort = "rsz", + .description = "Selects default reverb based on a room size (S - small | M - medium | L - large)", + } }; @@ -368,6 +413,8 @@ static IVAS_AUDIO_CONFIG ambisonicsOrderToEnum( const int16_t order ); static void parseSceneDescriptionFile( char *path, char *audioFilePath, InputConfig *inConfig, IsmPositionProvider *positionProvider, MasaFileReader **masaReaders, LfeRoutingConfig **lfeRoutingConfigs ); +static void parseCombinedFormatInput( InputConfig *inConfig, char **configString ); + static ivas_error parseCustomLayoutFile( const char *filePath, IVAS_CUSTOM_LS_DATA *pLsSetupCustom ); static CmdlnArgs parseCmdlnArgs( const int argc, char **argv ); @@ -406,11 +453,24 @@ static void printSupportedAudioConfigs( void ); static IVAS_AUDIO_CONFIG parseAudioConfig( const char *configString ); -static void convertInputBuffer( const int16_t *intBuffer, const int16_t numIntSamplesPerChannel, const int16_t numFloatSamplesPerChannel, const int16_t numChannels, float *floatBuffer ); - -static void convertOutputBuffer( const float *floatBuffer, const int16_t numSamplesPerChannel, const int16_t numChannels, int16_t *intBuffer ); -static void convertOutputBuffer_fx( const Word32 *Word32Buffer, const Word16 numSamplesPerChannel, const Word16 numChannels, Word16 *intBuffer, Word16 q_factor ); -static void convertInputBuffer_fx( const Word16 *intBuffer, const Word16 numIntSamplesPerChannel, const Word16 numFloatSamplesPerChannel, const Word16 numChannels, Word32 *Int32Buffer, Word16 in_q_factor ); +static void convertOutputBuffer_fx( + const Word32 *Word32Buffer, + const Word16 numSamplesPerChannel, + const Word16 numChannels, + Word16 *intBuffer, + const Word16 cldfb_in_flag, + IVAS_CLDFB_FILTER_BANK_HANDLE *cldfbSyn, + Word16 out_q ); +static void convertInputBuffer_fx( + const Word16 *intBuffer, + const Word16 numIntSamplesPerChannel, + const Word16 numFloatSamplesPerChannel, + const Word16 numChannels, + Word32 *Word32Buffer, + Word16 in_q_factor, + const int16_t cldfb_in_flag, + IVAS_CLDFB_FILTER_BANK_HANDLE *cldfbAna, + Word16 *out_q_factor ); /*------------------------------------------------------------------------------------------* @@ -584,35 +644,24 @@ static void setupWithSingleFormatInput( strncpy( audioFilePath, args.inputFilePath, FILENAME_MAX - 1 ); /* Depending on input format, prepare metadata reading for ISM or MASA */ - if ( args.inConfig.numMasaBuses != 0 ) + if ( args.inConfig.numAudioObjects != 0 ) { - if ( args.inConfig.numMasaBuses != args.numInMetadataFiles ) - { - fprintf( stderr, "Error: all MASA inputs must have a corresponding metadata file" ); - exit( -1 ); - } - - for ( int16_t i = 0; i < args.numInMetadataFiles; ++i ) + positionProvider->numObjects = args.inConfig.numAudioObjects; + for ( int16_t i = 0; i < positionProvider->numObjects; ++i ) { - masaReaders[i] = MasaFileReader_open( args.inMetadataFilePaths[i] ); - if ( masaReaders[i] == NULL ) + /* Check if path to metadata file was given */ + if ( isEmptyString( args.inMetadataFilePaths[i] ) ) { - fprintf( stderr, "Could not open MASA metadata file %s\n", args.inMetadataFilePaths[i] ); + fprintf( stderr, "No metadata file was given for ISM input %d\n", i ); exit( -1 ); } - } - } - else if ( args.inConfig.numAudioObjects != 0 ) - { - positionProvider->numObjects = args.inConfig.numAudioObjects; - for ( int16_t i = 0; i < positionProvider->numObjects; ++i ) - { - /* It is allowed on CLI to have no metadata for an ISM input - skip opening if string is empty or contains "NULL" */ + + /* It is allowed on CLI to have no metadata for an ISM input - skip opening if string contains "NULL" */ char charBuf[FILENAME_MAX]; strncpy( charBuf, args.inMetadataFilePaths[i], min( FILENAME_MAX, RENDERER_MAX_CLI_ARG_LENGTH ) - 1 ); charBuf[min( FILENAME_MAX, RENDERER_MAX_CLI_ARG_LENGTH ) - 1] = '\0'; to_upper( charBuf ); - if ( isEmptyString( args.inMetadataFilePaths[i] ) || strncmp( charBuf, "NULL", 4 ) == 0 ) + if ( strncmp( charBuf, "NULL", 4 ) == 0 ) { continue; } @@ -625,6 +674,26 @@ static void setupWithSingleFormatInput( } } } + if ( args.inConfig.numMasaBuses != 0 ) + { + if ( args.inConfig.numMasaBuses != ( args.numInMetadataFiles - args.inConfig.numAudioObjects ) ) + { + fprintf( stderr, "Error: all MASA inputs must have a corresponding metadata file" ); + exit( -1 ); + } + + int16_t reader_idx = 0; + for ( int16_t i = args.inConfig.numAudioObjects; i < args.numInMetadataFiles; ++i ) + { + reader_idx = i - args.inConfig.numAudioObjects; + masaReaders[reader_idx] = MasaFileReader_open( args.inMetadataFilePaths[i] ); + if ( masaReaders[reader_idx] == NULL ) + { + fprintf( stderr, "Could not open MASA metadata file %s\n", args.inMetadataFilePaths[i] ); + exit( -1 ); + } + } + } return; } @@ -637,6 +706,43 @@ static float dBToLin( } +static int16_t get_cldfb_in_flag( + const IVAS_AUDIO_CONFIG audioConfig, + const IVAS_RENDER_CONFIG_DATA *renderConfig ) +{ + int16_t cldfb_in_flag; + + cldfb_in_flag = 0; + if ( renderConfig->split_rend_config.rendererSelection == IVAS_BIN_RENDERER_TYPE_FASTCONV ) + { +#ifdef DEBUGGING + cldfb_in_flag = 1; +#endif + if ( audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) + { + cldfb_in_flag = 1; + } + } + + return cldfb_in_flag; +} + + +static int16_t is_split_pre_rend_mode( + CmdlnArgs *args ) +{ + int16_t flag; + + flag = 0; + if ( args->outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || args->outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + { + flag = 1; + } + + return flag; +} + + /*------------------------------------------------------------------------------------------* * main() * @@ -647,13 +753,23 @@ int main( int argc, char **argv ) { - IVAS_REND_HANDLE hIvasRend; + bool mainFailed = true; /* Assume main failed until cleanup is reached without errors */ + IVAS_REND_HANDLE hIvasRend = NULL; RotFileReader *headRotReader = NULL; RotFileReader *externalOrientationFileReader = NULL; RotFileReader *referenceRotReader = NULL; + IVAS_CLDFB_FILTER_BANK_HANDLE cldfbAna[RENDERER_MAX_INPUT_CHANNELS]; + IVAS_CLDFB_FILTER_BANK_HANDLE cldfbSyn[RENDERER_MAX_INPUT_CHANNELS]; + int16_t cldfb_in_flag, CLDFBframeSize_smpls; + SplitRendBFIFileReader *splitRendBFIReader = NULL; Vector3PairFileReader *referenceVectorReader = NULL; hrtfFileReader *hrtfFileReader = NULL; - IsmPositionProvider *positionProvider; + IVAS_DEC_HRTF_CREND_HANDLE *hHrtfCrend = NULL; + IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv = NULL; + IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin = NULL; + IVAS_DEC_HRTF_TD_HANDLE *hHrtfTD = NULL; + IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics = NULL; + IsmPositionProvider *positionProvider = NULL; LfeRoutingConfig *lfeRoutingConfigs[RENDERER_MAX_MC_INPUTS]; RenderConfigReader *renderConfigReader = NULL; MasaFileReader *masaReaders[RENDERER_MAX_MASA_INPUTS]; @@ -661,18 +777,25 @@ int main( IVAS_MASA_METADATA_HANDLE hMasaMetadata[RENDERER_MAX_MASA_INPUTS]; char audioFilePath[FILENAME_MAX]; AudioFileReader *audioReader = NULL; - AudioFileWriter *audioWriter; + AudioFileWriter *audioWriter = NULL; int32_t inBufferSize; int32_t outBufferSize; - int16_t *inpInt16Buffer; - float *inFloatBuffer; - int16_t *outInt16Buffer; - Word32 *outInt32Buffer; - Word32 *inInt32Buffer; + int32_t bitsBufferSize; + int16_t *inpInt16Buffer = NULL; + float *inFloatBuffer = NULL; + int16_t *outInt16Buffer = NULL; + Word32 *outInt32Buffer = NULL; + Word32 *inInt32Buffer = NULL; Word32 gain_fx; - float *outFloatBuffer; + float *outFloatBuffer = NULL; + uint8_t *bitsBufferData = NULL; IVAS_REND_AudioBuffer inBuffer; IVAS_REND_AudioBuffer outBuffer; + IVAS_REND_BitstreamBuffer bitsBuffer; + SplitFileReadWrite *hSplitRendFileReadWrite; + int16_t delayNumSamples_temp; + int32_t delayTimeScale_temp; + bool flushRendererLastFrame = false; int16_t numSamplesRead; int16_t delayNumSamples = -1; int16_t delayNumSamples_orig = 0; @@ -680,8 +803,9 @@ int main( int16_t zeroPadToWrite = 0; int32_t delayTimeScale = 0; int16_t i, numChannels; + uint16_t aeID; + IVAS_RENDER_CONFIG_DATA renderConfig; ivas_error error = IVAS_ERR_OK; - bool splitBinNeedsNewFrame = true; #ifdef WMOPS reset_wmops(); @@ -694,28 +818,41 @@ int main( hMasaMetadata[i] = NULL; } + hSplitRendFileReadWrite = NULL; + CLDFBframeSize_smpls = 0; + cldfb_in_flag = 0; + bitsBuffer.bits = NULL; + bitsBuffer.config.bitsRead = 0; + bitsBuffer.config.bitsWritten = 0; + bitsBuffer.config.bufLenInBytes = 0; + bitsBuffer.config.codec = ISAR_SPLIT_REND_CODEC_DEFAULT; + bitsBuffer.config.poseCorrection = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE; + bitsBuffer.config.codec_frame_size_ms = 5; + bitsBuffer.config.isar_frame_size_ms = 20; + bitsBuffer.config.lc3plus_highres = 0; for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) { lfeRoutingConfigs[i] = NULL; } -#ifdef FIX_DISCLAIMER IVAS_REND_PrintDisclaimer(); -#endif CmdlnArgs args = parseCmdlnArgs( argc, argv ); - if ( args.nonDiegeticPan && !( ( args.inConfig.numAudioObjects == 0 && args.inConfig.multiChannelBuses[0].audioConfig == IVAS_AUDIO_CONFIG_MONO ) || - ( args.inConfig.numAudioObjects > 0 && args.inConfig.audioObjects[0].audioConfig == IVAS_AUDIO_CONFIG_OBA && args.inConfig.numAudioObjects == 1 ) ) ) + if ( args.nonDiegeticPan && + !( ( args.inConfig.numAudioObjects == 0 && + args.inConfig.multiChannelBuses[0].audioConfig == IVAS_AUDIO_CONFIG_MONO ) || + ( args.inConfig.numAudioObjects > 0 && + args.inConfig.audioObjects[0].audioConfig == IVAS_AUDIO_CONFIG_OBA && args.inConfig.numAudioObjects == 1 ) ) ) { fprintf( stderr, "\ninvalid configuration - non-diegetic panning requires mono or ISM1 input\n" ); - exit( -1 ); + goto cleanup; } if ( args.nonDiegeticPan && args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_STEREO ) { fprintf( stderr, "\ninvalid configuration - non-diegetic panning requires stereo output\n" ); - exit( -1 ); + goto cleanup; } positionProvider = IsmPositionProvider_open(); @@ -732,8 +869,8 @@ int main( { if ( RotationFileReader_open( args.headRotationFilePath, &headRotReader ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", args.headRotationFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", args.headRotationFilePath ); + goto cleanup; } } @@ -741,43 +878,40 @@ int main( { if ( RotationFileReader_open( args.referenceRotationFilePath, &referenceRotReader ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", args.referenceRotationFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", args.referenceRotationFilePath ); + goto cleanup; } } if ( !isEmptyString( args.referenceVectorFilePath ) ) { if ( Vector3PairFileReader_open( args.referenceVectorFilePath, &referenceVectorReader ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", args.referenceVectorFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", args.referenceVectorFilePath ); + goto cleanup; } } + if ( !isEmptyString( args.splitRendBFIFilePath ) ) + { + convert_backslash( args.splitRendBFIFilePath ); + SplitRendBFIFileReader_open( args.splitRendBFIFilePath, &splitRendBFIReader ); + } if ( !isEmptyString( args.externalOrientationFilePath ) ) { if ( RotationFileReader_open( args.externalOrientationFilePath, &externalOrientationFileReader ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", args.externalOrientationFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", args.externalOrientationFilePath ); + goto cleanup; } } - if ( !isEmptyString( args.customHrtfFilePath ) ) - { - if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) - { - fprintf( stderr, "Error opening file: %s\n", args.customHrtfFilePath ); - exit( -1 ); - } - } if ( !isEmptyString( args.renderConfigFilePath ) ) { if ( RenderConfigReader_open( args.renderConfigFilePath, &renderConfigReader ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", args.renderConfigFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", args.renderConfigFilePath ); + goto cleanup; } } @@ -800,21 +934,21 @@ int main( { fprintf( stderr, "\nInvalid configuration - Merging to MASA output requires MASA input and at least one another input to be present\n" ); fprintf( stderr, "\nMASA input is missing\n" ); - exit( -1 ); + goto cleanup; } if ( args.inConfig.numAudioObjects == 0 && args.inConfig.numMultiChannelBuses == 0 && args.inConfig.numAmbisonicsBuses == 0 ) { fprintf( stderr, "\nInvalid configuration - Merging to MASA output requires MASA input and at least one another input to be present\n" ); fprintf( stderr, "\nNo object, multi-channel, or Ambisonic input present.\n" ); - exit( -1 ); + goto cleanup; } } if ( AudioFileReader_open( &audioReader, audioFilePath ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", audioFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", audioFilePath ); + goto cleanup; } int32_t inFileSampleRate = 0; @@ -831,40 +965,157 @@ int main( /* else if sampling rate given on command line, compare with wav file */ else if ( inFileSampleRate != args.sampleRate ) { - fprintf( stderr, "Sampling rate mismatch: %d Hz requested, but %d Hz found in file %s\n", args.sampleRate, inFileSampleRate, args.inputFilePath ); - exit( -1 ); + fprintf( stderr, "\nSampling rate mismatch: %d Hz requested, but %d Hz found in file %s\n", args.sampleRate, inFileSampleRate, args.inputFilePath ); + goto cleanup; } break; case IVAS_ERR_SAMPLING_RATE_UNKNOWN: /* Returned when input is raw PCM */ if ( args.sampleRate == 0 ) { - fprintf( stderr, "Sampling rate must be specified on command line when using raw PCM input\n" ); - exit( -1 ); + fprintf( stderr, "\nSampling rate must be specified on command line when using raw PCM input\n" ); + goto cleanup; } break; default: - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + ; } int16_t inFileNumChannels = 0; error = AudioFileReader_getNumChannels( audioReader, &inFileNumChannels ); if ( error != IVAS_ERR_OK && error != IVAS_ERR_NUM_CHANNELS_UNKNOWN ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nAudioFileReader_getNumChannels failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } + const int16_t frameSize_smpls = (int16_t) ( ( args.render_framesize ) * args.sampleRate * 5 / ( 1000 ) ); Word32 nonDiegeticPanGain_fx = ( args.nonDiegeticPanGain == 1.0f ) ? ONE_IN_Q31 : ( args.nonDiegeticPanGain == -1.0f ) ? L_negate( ONE_IN_Q31 ) : (Word32) ( args.nonDiegeticPanGain * ( 1LL << Q31 ) ); - IF( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, nonDiegeticPanGain_fx, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) + + IF( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, !isEmptyString( args.customHrtfFilePath ), args.nonDiegeticPan, nonDiegeticPanGain_fx, args.Opt_Headrotation, args.Opt_ExternalOrientation, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening renderer handle: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError opening renderer handle: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + if ( !isEmptyString( args.customHrtfFilePath ) ) + { + if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError opening file: %s\n", args.customHrtfFilePath ); + goto cleanup; + } + + if ( hrtfFileReader != NULL ) + { + if ( ( error = IVAS_REND_GetHrtfTdHandle( hIvasRend, &hHrtfTD ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_REND_GetHrtfHandle failed: %s\n\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + if ( ( error = load_TDrend_HRTF_binary( *hHrtfTD, args.sampleRate, hrtfFileReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s: %s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); + goto cleanup; + } + else + { + destroy_td_hrtf( hHrtfTD ); + } + } + + if ( ( error = IVAS_REND_GetHrtfCRendHandle( hIvasRend, &hHrtfCrend ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_Rend_GetHrtfCRendHandle failed: %s\n\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + IVAS_AUDIO_CONFIG hrtf_set_audio_cfg = IVAS_AUDIO_CONFIG_7_1_4; + if ( args.inConfig.ambisonicsBuses->audioConfig != IVAS_AUDIO_CONFIG_INVALID && args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + hrtf_set_audio_cfg = args.inConfig.ambisonicsBuses->audioConfig; + } + + if ( ( error = load_Crend_HRTF_from_binary( *hHrtfCrend, hrtfFileReader, args.outConfig.audioConfig, hrtf_set_audio_cfg, args.sampleRate ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s:%s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); + goto cleanup; + } + else + { + destroy_crend_hrtf( hHrtfCrend ); + } + } + + if ( ( error = IVAS_REND_GetHrtfFastConvHandle( hIvasRend, &hHrtfFastConv ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_REND_GetHrtfFastConvHandle failed: %s\n\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + if ( ( error = load_fastconv_HRTF_from_binary( *hHrtfFastConv, args.outConfig.audioConfig, args.inConfig.ambisonicsBuses->audioConfig, hrtfFileReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s:%s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); + goto cleanup; + } + else + { + destroy_fastconv_hrtf( hHrtfFastConv ); + } + } + + if ( ( error = IVAS_REND_GetHrtfParamBinHandle( hIvasRend, &hHrtfParambin ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetHrtfParamBinHandle failed: %s\n\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + if ( ( error = load_parambin_HRTF_from_binary( *hHrtfParambin, hrtfFileReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s: %s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); + goto cleanup; + } + else + { + destroy_parambin_hrtf( hHrtfParambin ); + } + } + } + + + if ( ( error = IVAS_REND_GetHrtfStatisticsHandle( hIvasRend, &hHrtfStatistics ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_REND_GetHrtfStatisticsHandle failed\n\n" ); + goto cleanup; + } + if ( ( error = load_reverb_binary( *hHrtfStatistics, args.sampleRate, hrtfFileReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", args.customHrtfFilePath ); + goto cleanup; + } + else + { + destroy_hrtf_statistics( hHrtfStatistics ); + } + } + + hrtfFileReader_close( &hrtfFileReader ); } -#ifdef FIX_DISCLAIMER fprintf( stdout, "Input audio file: %s\n", args.inputFilePath ); fprintf( stdout, "Output audio file: %s\n\n", args.outputFilePath ); @@ -903,83 +1154,111 @@ int main( if ( ( error = IVAS_REND_PrintConfig( hIvasRend ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\n IVAS_REND_PrintConfig failed: %s\n\n", ivas_error_to_string( error ) ); - // goto cleanup; - exit( -1 ); + goto cleanup; } -#endif /* === Configure === */ if ( ( error = IVAS_REND_InitConfig( hIvasRend, args.outConfig.audioConfig ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in Renderer Config Init\n" ); - exit( -1 ); + fprintf( stderr, "\nError in Renderer Config Init: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( args.renderConfigFilePath[0] != '\0' ) { - IVAS_RENDER_CONFIG_DATA renderConfig; + /* sanity check */ - if ( ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL ) && ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + if ( ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL ) && + ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && + ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && + !is_split_pre_rend_mode( &args ) ) { - fprintf( stderr, "\nExternal Renderer Config is only supported for binaural output configurations. Exiting. \n" ); - exit( -1 ); + fprintf( stderr, "\nExternal Renderer Config is supported only when binaural output configurations is used as output OR when Split pre-rendering mode is enabled. Exiting. \n" ); + goto cleanup; } if ( ( error = IVAS_REND_GetRenderConfig( hIvasRend, &renderConfig ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nIVAS_DEC_GetRenderConfig failed\n" ); - exit( -1 ); + fprintf( stderr, "\nIVAS_DEC_GetRenderConfig failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( RenderConfigReader_read( renderConfigReader, args.renderConfigFilePath, &renderConfig ) != IVAS_ERR_OK ) { - fprintf( stderr, "Failed to read renderer configuration from file %s\n", args.renderConfigFilePath ); - exit( -1 ); + fprintf( stderr, "\nFailed to read renderer configuration from file %s\n", args.renderConfigFilePath ); + goto cleanup; + } + if ( ( error = RenderConfigReader_getDirectivity( renderConfigReader, args.directivityPatternId, renderConfig.directivity_fx ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Failed to get directivity patterns for one or more of IDs: %d %d %d %d\n\n", args.directivityPatternId[0], args.directivityPatternId[1], args.directivityPatternId[2], args.directivityPatternId[3] ); + goto cleanup; + } + if ( ( error = RenderConfigReader_getDistanceAttenuation( renderConfigReader, renderConfig.distAtt_fx ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Failed to get Distance Attenuation \n\n" ); + goto cleanup; } - if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { - if ( ( error = RenderConfigReader_getAcousticEnvironment( renderConfigReader, args.acousticEnvironmentId, &renderConfig.roomAcoustics ) ) == IVAS_ERR_OK ) + aeID = args.aeSequence.count > 0 ? args.aeSequence.pID[0] : 65535; + if ( ( error = RenderConfigReader_getAcousticEnvironment( renderConfigReader, aeID, &renderConfig.roomAcoustics ) ) == IVAS_ERR_OK ) { if ( RenderConfigReader_checkValues( &renderConfig ) != IVAS_ERR_OK ) { - fprintf( stderr, "Invalid room acoustics configuration parameters\n\n" ); - exit( -1 ); + fprintf( stderr, "\nInvalid room acoustics configuration parameters\n\n" ); + goto cleanup; } } else { - fprintf( stderr, "Failed to get acoustic environment with ID: %d\n\n", args.acousticEnvironmentId ); - exit( -1 ); + fprintf( stderr, "Failed to get acoustic environment with ID: %d\n\n", aeID ); + goto cleanup; } - renderConfig.roomAcoustics.override = 1; } + /* ISAR frame size is set from command line, not renderer config file. + * This will be ignored if output format is not split rendering. */ + renderConfig.split_rend_config.isar_frame_size_ms = (int16_t) args.render_framesize /* given in number of 5ms subframes */ * 5; + if ( ( error = IVAS_REND_FeedRenderConfig( hIvasRend, renderConfig ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nIVAS_DEC_FeedRenderConfig failed\n" ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedRenderConfig failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } + + CLDFBframeSize_smpls = frameSize_smpls * 2; + cldfb_in_flag = get_cldfb_in_flag( args.outConfig.audioConfig, &renderConfig ); } if ( ( error = IVAS_REND_SetOrientationTrackingMode( hIvasRend, args.orientation_tracking ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_SetOrientationTrackingMode(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_SetOrientationTrackingMode(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + + /* Set reverb room size if specified */ + if ( args.reverbRoomSize != IVAS_ROOM_SIZE_AUTO ) + { + if ( ( IVAS_REND_SetReverbRoomSize( hIvasRend, args.reverbRoomSize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError setting reverb room size\n" ); + goto cleanup; + } } /* Set up output custom layout configuration */ if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) { - floatToFixed_arrL_app( args.outConfig.outSetupCustom.azimuth, args.outConfig.outSetupCustom.azimuth_fx, Q22, IVAS_MAX_OUTPUT_CHANNELS ); - floatToFixed_arrL_app( args.outConfig.outSetupCustom.elevation, args.outConfig.outSetupCustom.elevation_fx, Q22, IVAS_MAX_OUTPUT_CHANNELS ); + floatToFixed_arrL_app( args.outConfig.outSetupCustom.azimuth, args.outConfig.outSetupCustom.azimuth_fx, Q22, RENDERER_MAX_OUTPUT_CHANNELS ); + floatToFixed_arrL_app( args.outConfig.outSetupCustom.elevation, args.outConfig.outSetupCustom.elevation_fx, Q22, RENDERER_MAX_OUTPUT_CHANNELS ); if ( ( error = IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( hIvasRend, args.outConfig.outSetupCustom ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_ConfigureCustomOutputLoudspeakerLayout(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_ConfigureCustomOutputLoudspeakerLayout(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -989,24 +1268,35 @@ int main( MasaFileWriter_open( args.outputFilePath, true, &masaWriter ); /* No delay for audio in renderer, so calling metadata writer in delayCompensated mode, i.e., no delay applied to meta */ if ( masaWriter == NULL ) { - fprintf( stderr, "Could not open MASA metadata file %s\n", args.outputFilePath ); - exit( -1 ); + fprintf( stderr, "\nCould not open MASA metadata file %s\n", args.outputFilePath ); + goto cleanup; } } - /* Set the total number of objects */ if ( args.inConfig.numAudioObjects > 0 ) { + /* Set the total number of objects */ if ( ( error = IVAS_REND_SetTotalNumberOfObjects( hIvasRend, args.inConfig.numAudioObjects ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_SetTotalNumberOfObjects(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_SetTotalNumberOfObjects(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } - Word32 var1 = (Word32) ( args.syncMdDelay ); - IF( ( error = IVAS_REND_SetIsmMetadataDelay( hIvasRend, var1 ) ) != IVAS_ERR_OK ) + + /* Set the metadata delay for objects */ + IF( ( error = IVAS_REND_SetIsmMetadataDelay( hIvasRend, args.syncMdDelay ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_SetIsmMetadataDelay(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_SetIsmMetadataDelay(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + + /* For OMASA input and BINAURAL output, apply a gain to objects to match the loudness with MASA part */ + if ( args.inConfig.numMasaBuses > 0 && args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL ) + { + for ( i = 0; i < args.inConfig.numAudioObjects; ++i ) + { + args.inConfig.audioObjects[i].gain_dB += OMASA_TDREND_MATCHING_GAIN_DB; + } } } @@ -1017,8 +1307,8 @@ int main( { if ( ( error = parseLfePanMtxFile( args.inLfePanningMatrixFile, &lfePanMatrix ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1044,30 +1334,36 @@ int main( masaIds[i] = 0u; } + if ( ( error = IVAS_REND_SetObjectIDs( hIvasRend ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_REND_SetObjectIDs: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) { IF( ( error = IVAS_REND_AddInput_fx( hIvasRend, args.inConfig.multiChannelBuses[i].audioConfig, &mcIds[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_AddInput failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } gain_fx = (Word32) ( ( args.inputGainGlobal * dBToLin( args.inConfig.multiChannelBuses[i].gain_dB ) ) * ( 1u << 30 ) ); IF( ( error = IVAS_REND_SetInputGain_fx( hIvasRend, mcIds[i], gain_fx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputGain failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( args.inConfig.multiChannelBuses[i].audioConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) { - floatToFixed_arrL_app( args.inConfig.inSetupCustom.azimuth, args.inConfig.inSetupCustom.azimuth_fx, Q22, IVAS_MAX_OUTPUT_CHANNELS ); - floatToFixed_arrL_app( args.inConfig.inSetupCustom.elevation, args.inConfig.inSetupCustom.elevation_fx, Q22, IVAS_MAX_OUTPUT_CHANNELS ); + floatToFixed_arrL_app( args.inConfig.inSetupCustom.azimuth, args.inConfig.inSetupCustom.azimuth_fx, Q22, RENDERER_MAX_OUTPUT_CHANNELS ); + floatToFixed_arrL_app( args.inConfig.inSetupCustom.elevation, args.inConfig.inSetupCustom.elevation_fx, Q22, RENDERER_MAX_OUTPUT_CHANNELS ); if ( ( error = IVAS_REND_ConfigureCustomInputLoudspeakerLayout( hIvasRend, mcIds[i], args.inConfig.inSetupCustom ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_ConfigureCustomInputLoudspeakerLayout(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_ConfigureCustomInputLoudspeakerLayout(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1076,19 +1372,19 @@ int main( { if ( args.lfePanningEnabled ) { - fprintf( stderr, "Warning: LFE position specified as well as panning matrix! Ignoring position and using gains from panning matrix\n" ); + fprintf( stderr, "\nWarning: LFE position specified as well as panning matrix! Ignoring position and using gains from panning matrix\n" ); args.lfePanningEnabled = false; } - FOR( Word16 k = 0; k < IVAS_MAX_OUTPUT_CHANNELS; k++ ) + FOR( Word16 k = 0; k < RENDERER_MAX_OUTPUT_CHANNELS; k++ ) { ( *lfePanMatrix_fx )[k] = (Word32) ( ( *lfePanMatrix )[k] * ( 1u << 31 ) ); } IF( ( error = IVAS_REND_SetInputLfeMtx_fx( hIvasRend, mcIds[i], (const IVAS_REND_LfePanMtx_fx *) &lfePanMatrix_fx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputLfeMtx failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } /* set panning gains for input LFE */ @@ -1097,8 +1393,8 @@ int main( Word32 inputGain = (Word32) ( args.lfeConfigGain * ( 1u << 31 ) ); IF( ( error = IVAS_REND_SetInputLfePos_fx( hIvasRend, mcIds[i], inputGain, (Word16) args.lfeConfigAzimuth, (Word16) args.lfeConfigElevation ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputLfePos failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } else @@ -1111,19 +1407,19 @@ int main( { if ( ( error = parseLfePanMtxFile( lfeRoutingConfigs[i]->lfe_routing_mtx, &lfePanMatrix ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nparseLfePanMtxFile failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } - FOR( Word16 k = 0; k < IVAS_MAX_OUTPUT_CHANNELS; k++ ) + FOR( Word16 k = 0; k < RENDERER_MAX_OUTPUT_CHANNELS; k++ ) { ( *lfePanMatrix_fx )[k] = (Word32) ( ( *lfePanMatrix )[k] * ( 1u << 31 ) ); } if ( ( error = IVAS_REND_SetInputLfeMtx_fx( hIvasRend, mcIds[i], (const IVAS_REND_LfePanMtx_fx *) &lfePanMatrix_fx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputLfeMtx failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } /* set position based gains */ @@ -1132,8 +1428,8 @@ int main( Word32 inputGain = (Word32) ( lfeRoutingConfigs[i]->lfe_gain_dB * ( 1u << 31 ) ); IF( ( error = IVAS_REND_SetInputLfePos_fx( hIvasRend, mcIds[i], inputGain, (Word16) lfeRoutingConfigs[i]->lfe_azi, (Word16) lfeRoutingConfigs[i]->lfe_ele ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputLfePos failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } @@ -1144,15 +1440,15 @@ int main( { IF( ( error = IVAS_REND_AddInput_fx( hIvasRend, IVAS_AUDIO_CONFIG_OBA, &ismIds[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_AddInput: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } gain_fx = (Word32) ( args.inputGainGlobal * dBToLin( args.inConfig.audioObjects[i].gain_dB ) * ( 1u << 30 ) ); IF( ( error = IVAS_REND_SetInputGain_fx( hIvasRend, ismIds[i], gain_fx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputGain failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } /* With MASA output, all objects are handled at once, so add only one input having all objects in it */ @@ -1166,15 +1462,15 @@ int main( { IF( ( error = IVAS_REND_AddInput_fx( hIvasRend, args.inConfig.ambisonicsBuses[i].audioConfig, &sbaIds[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_AddInput failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } gain_fx = (Word32) ( args.inputGainGlobal * dBToLin( args.inConfig.ambisonicsBuses[i].gain_dB ) * ( 1u << 30 ) ); IF( ( error = IVAS_REND_SetInputGain_fx( hIvasRend, sbaIds[i], gain_fx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputGain failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1182,15 +1478,15 @@ int main( { IF( ( error = IVAS_REND_AddInput_fx( hIvasRend, args.inConfig.masaBuses[i].audioConfig, &masaIds[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_AddInput failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } gain_fx = (Word32) ( ( args.inputGainGlobal * dBToLin( args.inConfig.masaBuses[i].gain_dB ) ) * ( 1u << 30 ) ); IF( ( error = IVAS_REND_SetInputGain_fx( hIvasRend, masaIds[i], gain_fx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputGain failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1198,8 +1494,8 @@ int main( if ( inFileNumChannels != 0 /* inFileNumChannels is 0 with raw PCM input */ && totalNumInChannels != inFileNumChannels ) { - fprintf( stderr, "Number of channels in input file does not match selected configuration\n" ); - exit( -1 ); + fprintf( stderr, "\nNumber of channels in input file does not match selected configuration\n" ); + goto cleanup; } for ( i = 0; i < args.inConfig.numMasaBuses; ++i ) @@ -1210,37 +1506,131 @@ int main( } } - int16_t numOutChannels; - if ( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) + Word16 numOutChannels; + if ( ( error = IVAS_REND_GetNumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_NumOutChannels(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_NumOutChannels(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } + if ( cldfb_in_flag ) + { + if ( ( error = IVAS_REND_openCldfb( cldfbAna, cldfbSyn, totalNumInChannels, numOutChannels, args.sampleRate ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_REND_openCldfb(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + } - if ( AudioFileWriter_open( &audioWriter, args.outputFilePath, args.sampleRate, numOutChannels ) != IVAS_ERR_OK ) + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { - fprintf( stderr, "Failed to open file: %s\n", args.outputFilePath ); - exit( -1 ); + char *outFile = args.outMetadataFilePath; + + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) + { + outFile = args.outputFilePath; + audioWriter = NULL; + } + + if ( ( error = IVAS_REND_GetSplitRendBitstreamHeader( hIvasRend, + &bitsBuffer.config.codec, + &bitsBuffer.config.poseCorrection, + &bitsBuffer.config.codec_frame_size_ms, + &bitsBuffer.config.isar_frame_size_ms, + &bitsBuffer.config.lc3plus_highres ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_REND_GetSplitRendBitstreamHeader(): %s!\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + if ( IVAS_REND_GetDelay_fx( hIvasRend, &delayNumSamples_temp, &delayTimeScale_temp ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of renderer!\n" ); + goto cleanup; + } + + if ( ( error = split_rend_writer_open( &hSplitRendFileReadWrite, outFile, delayNumSamples_temp, delayTimeScale_temp, bitsBuffer.config.codec, bitsBuffer.config.poseCorrection, bitsBuffer.config.codec_frame_size_ms, bitsBuffer.config.isar_frame_size_ms, args.sampleRate, bitsBuffer.config.lc3plus_highres ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCould not open split rend metadata file %s\n", outFile ); + goto cleanup; + } + } + + if ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) + { + if ( AudioFileWriter_open( &audioWriter, args.outputFilePath, args.sampleRate, numOutChannels ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nFailed to open file: %s\n", args.outputFilePath ); + goto cleanup; + } } inBufferSize = frameSize_smpls * totalNumInChannels; outBufferSize = frameSize_smpls * numOutChannels; inpInt16Buffer = malloc( inBufferSize * sizeof( int16_t ) ); - inFloatBuffer = malloc( inBufferSize * sizeof( float ) ); - outInt16Buffer = malloc( outBufferSize * sizeof( int16_t ) ); - outInt32Buffer = malloc( outBufferSize * sizeof( Word32 ) ); - inInt32Buffer = malloc( inBufferSize * sizeof( Word32 ) ); - outFloatBuffer = malloc( outBufferSize * sizeof( float ) ); + if ( cldfb_in_flag == 0 ) + { + inFloatBuffer = malloc( inBufferSize * sizeof( float ) ); + outInt16Buffer = malloc( outBufferSize * sizeof( int16_t ) ); + outInt32Buffer = malloc( outBufferSize * sizeof( Word32 ) ); + inInt32Buffer = malloc( inBufferSize * sizeof( Word32 ) ); + outFloatBuffer = malloc( outBufferSize * sizeof( float ) ); - inBuffer.config.numSamplesPerChannel = (int16_t) frameSize_smpls; - inBuffer.config.numChannels = (int16_t) totalNumInChannels; + inBuffer.config.numSamplesPerChannel = (int16_t) frameSize_smpls; + inBuffer.config.numChannels = (int16_t) totalNumInChannels; + + outBuffer.config.numSamplesPerChannel = (int16_t) frameSize_smpls; + outBuffer.config.numChannels = (int16_t) numOutChannels; + outBuffer.data_fx = outInt32Buffer; + inBuffer.data_fx = inInt32Buffer; + } + else + { + inFloatBuffer = malloc( CLDFBframeSize_smpls * totalNumInChannels * sizeof( float ) ); + outInt16Buffer = malloc( outBufferSize * sizeof( int16_t ) ); + outInt32Buffer = malloc( CLDFBframeSize_smpls * totalNumInChannels * sizeof( Word32 ) ); + inInt32Buffer = malloc( CLDFBframeSize_smpls * totalNumInChannels * sizeof( Word32 ) ); + outFloatBuffer = malloc( CLDFBframeSize_smpls * totalNumInChannels * sizeof( float ) ); + + inBuffer.config.numSamplesPerChannel = (int16_t) CLDFBframeSize_smpls; + inBuffer.config.numChannels = (int16_t) totalNumInChannels; + + outBuffer.config.numSamplesPerChannel = (int16_t) CLDFBframeSize_smpls; + outBuffer.config.numChannels = (int16_t) numOutChannels; + outBuffer.data_fx = outInt32Buffer; + inBuffer.data_fx = inInt32Buffer; + } + + inBuffer.config.is_cldfb = cldfb_in_flag; + outBuffer.config.is_cldfb = cldfb_in_flag; + + + memset( outBuffer.data_fx, 0, outBuffer.config.numSamplesPerChannel * outBuffer.config.numChannels * sizeof( Word32 ) ); + + if ( is_split_pre_rend_mode( &args ) ) + { + bitsBufferSize = ISAR_SPLIT_REND_BITS_BUFF_SIZE; + } + else + { + bitsBufferSize = 0; + } + + if ( bitsBufferSize > 0 ) + { + bitsBufferData = malloc( bitsBufferSize * sizeof( uint8_t ) ); + } + else + { + bitsBufferData = NULL; + } + + bitsBuffer.bits = bitsBufferData; + bitsBuffer.config.bitsRead = 0; + bitsBuffer.config.bitsWritten = 0; + bitsBuffer.config.bufLenInBytes = bitsBufferSize; - outBuffer.config.numSamplesPerChannel = (int16_t) frameSize_smpls; - outBuffer.config.numChannels = (int16_t) numOutChannels; - outBuffer.data_fx = outInt32Buffer; - inBuffer.data_fx = inInt32Buffer; #ifdef WMOPS reset_stack(); reset_wmops(); @@ -1260,33 +1650,78 @@ int main( outBuffer.pq_fact = &outBuffer.q_factor; Word16 subframe_len = (Word16) ( args.sampleRate / ( 200 ) ); // sample rate /FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES Word16 gd_bits = find_guard_bits( subframe_len ); + Word16 prev_q_fact = Q11; while ( 1 ) { int16_t num_in_channels; num_in_channels = inBuffer.config.numChannels; const bool isCurrentFrameMultipleOf20ms = frame % ( 4 / args.render_framesize ) == 0; + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && renderConfigReader != NULL && + args.aeSequence.count > 0 && args.aeSequence.pValidity[args.aeSequence.selected] != 0 ) + { + if ( ++args.aeSequence.frameCounter >= args.aeSequence.pValidity[args.aeSequence.selected] ) + { + if ( ++args.aeSequence.selected >= args.aeSequence.count ) + { + args.aeSequence.selected = 0; + } + args.aeSequence.frameCounter = 0; + if ( ( error = RenderConfigReader_getAcousticEnvironment( renderConfigReader, args.aeSequence.pID[args.aeSequence.selected], &renderConfig.roomAcoustics ) ) == IVAS_ERR_OK ) + { + if ( RenderConfigReader_checkValues( &renderConfig ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Invalid acoustic environment configuration parameters\n\n" ); + goto cleanup; + } + } + else + { + fprintf( stderr, "Failed to get acoustic environment with ID %d\n\n", args.aeSequence.pID[args.aeSequence.selected] ); + goto cleanup; + } + if ( ( error = IVAS_REND_FeedRenderConfig( hIvasRend, renderConfig ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_REND_FeedRenderConfig failed: %s\n\n", ivas_error_to_string( error ) ); + goto cleanup; + } + } + } + + numSamplesRead = 0; + /* Read the input data */ if ( ( error = AudioFileReader_read( audioReader, inpInt16Buffer, (int16_t) inBufferSize, &numSamplesRead ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError reading from file %s\n", audioFilePath ); - exit( -1 ); + goto cleanup; } - if ( numSamplesRead == 0 && splitBinNeedsNewFrame ) + if ( numSamplesRead == 0 ) + { + /* end of input data */ + flushRendererLastFrame = true; + } + + /* Convert from int to float and from interleaved to packed */ + if ( !flushRendererLastFrame ) + { + Word16 Q_out; + *outBuffer.pq_fact = 16 - ( gd_bits ); + convertInputBuffer_fx( inpInt16Buffer, numSamplesRead, inBuffer.config.numSamplesPerChannel, num_in_channels, inInt32Buffer, *outBuffer.pq_fact, inBuffer.config.is_cldfb, cldfbAna, &Q_out ); + *outBuffer.pq_fact = Q_out; + prev_q_fact = Q_out; + } + else { - /* end of input data */ - break; + memset( inBuffer.data_fx, 0, inBuffer.config.numChannels * inBuffer.config.numSamplesPerChannel * sizeof( Word32 ) ); + *outBuffer.pq_fact = prev_q_fact; } - /* Convert from int to float and from interleaved to packed */ - convertInputBuffer( inpInt16Buffer, numSamplesRead, inBuffer.config.numSamplesPerChannel, num_in_channels, inFloatBuffer ); - *outBuffer.pq_fact = 16 - ( gd_bits ); - convertInputBuffer_fx( inpInt16Buffer, numSamplesRead, inBuffer.config.numSamplesPerChannel, num_in_channels, inInt32Buffer, *outBuffer.pq_fact ); int16_t num_subframes, sf_idx; num_subframes = (int16_t) args.render_framesize; - if ( isCurrentFrameMultipleOf20ms ) + if ( isCurrentFrameMultipleOf20ms && !flushRendererLastFrame ) { IsmPositionProvider_getNextFrame( positionProvider, &mtdBuffer ); @@ -1295,13 +1730,13 @@ int main( IVAS_VECTOR3 listenerPos, refPos; if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPos, &refPos ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nVector3PairFileReader_read failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( ( error = IVAS_REND_SetReferenceVector( hIvasRend, listenerPos, refPos ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetReferenceVector failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } /* Read from reference rotation trajectory file if specified */ @@ -1312,14 +1747,14 @@ int main( IVAS_QUATERNION quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; if ( ( error = HeadRotationFileReading( referenceRotReader, &quaternions[sf_idx], NULL ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( ( error = IVAS_REND_SetReferenceRotation( hIvasRend, quaternions[sf_idx] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error setting Reference Rotation: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError setting Reference Rotation: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } @@ -1335,14 +1770,14 @@ int main( if ( ( error = HeadRotationFileReading( headRotReader, &headRot, &Pos ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } - if ( ( error = IVAS_REND_SetHeadRotation( hIvasRend, headRot, Pos, sf_idx ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_REND_SetHeadRotation( hIvasRend, headRot, Pos, DEFAULT_AXIS, sf_idx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error setting Head Rotation: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError setting Head Rotation: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } @@ -1350,12 +1785,11 @@ int main( { if ( ( error = IVAS_REND_DisableHeadRotation( hIvasRend ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error disabling head rotation: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError disabling head rotation: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } - /* Read from external orientation file if specified */ if ( externalOrientationFileReader != NULL ) { @@ -1366,18 +1800,18 @@ int main( int16_t numFramesToTargetOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) { - if ( ( error = ExternalOrientationFileReading( externalOrientationFileReader, &quatBuffer[i], &enableHeadRotation[i], &enableExternalOrientation[i], &enableRotationInterpolation[i], &numFramesToTargetOrientation[i] ) ) != IVAS_ERR_OK ) + if ( ( error = ExternalOrientationFileReading( externalOrientationFileReader, &quatBuffer[sf_idx], &enableHeadRotation[sf_idx], &enableExternalOrientation[sf_idx], &enableRotationInterpolation[sf_idx], &numFramesToTargetOrientation[sf_idx] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in External Orientation File Reading: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in External Orientation File Reading: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) { if ( ( error = IVAS_REND_SetExternalOrientation( hIvasRend, &quatBuffer[sf_idx], enableHeadRotation[sf_idx], enableExternalOrientation[sf_idx], enableRotationInterpolation[sf_idx], numFramesToTargetOrientation[sf_idx], sf_idx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error setting External Orientation: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError setting External Orientation: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } @@ -1386,22 +1820,23 @@ int main( if ( ( error = IVAS_REND_CombineHeadAndExternalOrientation( hIvasRend ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error combining external and head orientations: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError combining external and head orientations: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) { if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, mcIds[i], &numChannels ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_GetInputNumChannels failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } + IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.multiChannelBuses[i].inputChannelIndex, numChannels ); - if ( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, mcIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, mcIds[i], tmpBuffer, flushRendererLastFrame ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1412,32 +1847,32 @@ int main( if ( i == 0 ) { IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.audioObjects[i].inputChannelIndex, args.inConfig.numAudioObjects ); - if ( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, ismIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, ismIds[i], tmpBuffer, flushRendererLastFrame ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } if ( ( error = IVAS_REND_FeedInputObjectMetadataToOMasa( hIvasRend, i, mtdBuffer.positions[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputObjectMetadataToOMasa failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } else { IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.audioObjects[i].inputChannelIndex, 1 ); - if ( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, ismIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, ismIds[i], tmpBuffer, flushRendererLastFrame ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( ( error = IVAS_REND_FeedInputObjectMetadata( hIvasRend, ismIds[i], mtdBuffer.positions[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputObjectMetadata failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } @@ -1446,14 +1881,15 @@ int main( { if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, sbaIds[i], &numChannels ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_GetInputNumChannels failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } + IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.ambisonicsBuses[i].inputChannelIndex, numChannels ); - if ( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, sbaIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, sbaIds[i], tmpBuffer, flushRendererLastFrame ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1461,55 +1897,62 @@ int main( { if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, masaIds[i], &numChannels ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_GetInputNumChannels failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } + IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.masaBuses[i].inputChannelIndex, numChannels ); - IF( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, masaIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) + IF( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, masaIds[i], tmpBuffer, flushRendererLastFrame ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } - if ( isCurrentFrameMultipleOf20ms ) + if ( isCurrentFrameMultipleOf20ms && !flushRendererLastFrame ) { if ( masaReaders[i] != NULL ) { /* This will update data in hMasaMetadata[i] */ if ( ( error = MasaFileReader_readNextFrame( masaReaders[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in MASA Metadata File Reading: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in MASA Metadata File Reading: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( ( error = IVAS_REND_FeedInputMasaMetadata( hIvasRend, masaIds[i], hMasaMetadata[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputMasaMetadata failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } } - if ( ( error = IVAS_REND_GetSamples( hIvasRend, outBuffer ) ) != IVAS_ERR_OK ) + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { - fprintf( stderr, "Error in getting samples\n" ); - exit( -1 ); + if ( ( error = IVAS_REND_GetSplitBinauralBitstream( hIvasRend, outBuffer, &bitsBuffer ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_REND_GetSplitBinauralBitstream(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + } + else + { + if ( ( error = IVAS_REND_GetSamples( hIvasRend, outBuffer ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_REND_GetSamples()%s\n", ivas_error_to_string( error ) ); + goto cleanup; + } } int16_t num_out_channels; num_out_channels = outBuffer.config.numChannels; + /* Convert from float to int and from packed to interleaved. * Values in outFloatBuffer are guaranteed to be within range INT16_MIN:INT16_MAX */ - if ( *outBuffer.pq_fact == 0 ) - { - convertOutputBuffer( outFloatBuffer, outBuffer.config.numSamplesPerChannel, num_out_channels, outInt16Buffer ); - } - else - { - convertOutputBuffer_fx( outInt32Buffer, outBuffer.config.numSamplesPerChannel, num_out_channels, outInt16Buffer, *outBuffer.pq_fact ); - } + convertOutputBuffer_fx( outInt32Buffer, outBuffer.config.numSamplesPerChannel, num_out_channels, outInt16Buffer, cldfb_in_flag, cldfbSyn, *outBuffer.pq_fact ); + if ( delayNumSamples == -1 ) { if ( args.delayCompensationEnabled ) @@ -1517,10 +1960,9 @@ int main( IF( IVAS_REND_GetDelay_fx( hIvasRend, &delayNumSamples, &delayTimeScale ) != IVAS_ERR_OK ) { fprintf( stderr, "\nUnable to get delay of renderer!\n" ); - exit( -1 ); + goto cleanup; } - delayNumSamples_orig = delayNumSamples; } else @@ -1530,27 +1972,43 @@ int main( zeroPad = delayNumSamples; } - if ( delayNumSamples * num_out_channels < outBufferSize ) + if ( is_split_pre_rend_mode( &args ) && !flushRendererLastFrame ) { - if ( AudioFileWriter_write( audioWriter, &outInt16Buffer[delayNumSamples * num_out_channels], outBufferSize - ( delayNumSamples * num_out_channels ) ) != IVAS_ERR_OK ) + if ( split_rend_write_bitstream_to_file( hSplitRendFileReadWrite, bitsBuffer.bits, &bitsBuffer.config.bitsRead, + &bitsBuffer.config.bitsWritten ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error writing audio file %s\n", args.outputFilePath ); - exit( -1 ); + fprintf( stderr, "\nUnable to write to bitstream file!\n" ); + goto cleanup; } - delayNumSamples = 0; } - else + + if ( audioWriter != NULL && !flushRendererLastFrame ) { - delayNumSamples -= (int16_t) ( outBufferSize / num_out_channels ); + if ( delayNumSamples * num_out_channels < outBufferSize ) + { + if ( AudioFileWriter_write( audioWriter, &outInt16Buffer[delayNumSamples * num_out_channels], outBufferSize - ( delayNumSamples * num_out_channels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing audio file %s\n", args.outputFilePath ); + goto cleanup; + } + delayNumSamples = 0; + } + else + { + delayNumSamples -= (Word16) ( outBufferSize / num_out_channels ); + } } + bitsBuffer.config.bitsRead = 0; + bitsBuffer.config.bitsWritten = 0; + /* Write MASA metadata for MASA outputs */ - if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) + if ( !flushRendererLastFrame && ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) ) { IVAS_REND_AudioConfigType inputType1; IVAS_REND_AudioConfigType inputType2; IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMetaOutput; - int16_t numInputFormats; + Word16 numInputFormats; inputType1 = IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN; inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN; @@ -1591,8 +2049,8 @@ int main( { if ( ( error = IVAS_REND_GetMasaMetadata( hIvasRend, &hMetaOutput, inputType1 ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_GetMasaMetadata(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_GetMasaMetadata(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } else @@ -1602,8 +2060,8 @@ int main( inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED; if ( ( error = IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1612,28 +2070,35 @@ int main( inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA; if ( ( error = IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } - if ( ( args.inConfig.numAmbisonicsBuses > 0 || args.inConfig.numMultiChannelBuses > 0 || args.inConfig.numMasaBuses > 0 ) && args.inConfig.numAudioObjects > 0 ) + if ( ( args.inConfig.numAmbisonicsBuses > 0 || args.inConfig.numMultiChannelBuses > 0 || args.inConfig.numMasaBuses > 0 ) && + args.inConfig.numAudioObjects > 0 ) { inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED; if ( ( error = IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } - - if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput ) ) != IVAS_ERR_OK ) + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput, NULL ) ) != IVAS_ERR_OK ) /* NULL -> use default metadata delay settings */ { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); } } + /* no new input was actually read, only delay buffers were flushed + * therefore this is not a real frame */ + if ( flushRendererLastFrame ) + { + break; + } + frame++; if ( !args.quietModeEnabled ) { @@ -1646,29 +2111,33 @@ int main( #endif } - /* add zeros at the end to have equal length of synthesized signals */ - for ( zeroPadToWrite = zeroPad; zeroPadToWrite > frameSize_smpls; zeroPadToWrite -= frameSize_smpls ) + /* add zeros at the end to have equal length of synthesized signals + * the output buffer will contain either leftover input samples from delay aligned inputs + * or zeros for padding */ + if ( audioWriter != NULL ) { - memset( outInt16Buffer, 0, outBufferSize * sizeof( int16_t ) ); - if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, outBufferSize ) ) != IVAS_ERR_OK ) + for ( zeroPadToWrite = zeroPad; zeroPadToWrite > frameSize_smpls; zeroPadToWrite -= frameSize_smpls ) { - fprintf( stderr, "\nOutput audio file writer error\n" ); - exit( -1 ); + if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, outBufferSize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } } - } - memset( outInt16Buffer, 0, zeroPadToWrite * outBuffer.config.numChannels * sizeof( int16_t ) ); - if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, zeroPadToWrite * outBuffer.config.numChannels ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nOutput audio file writer error\n" ); - exit( -1 ); + if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, zeroPadToWrite * outBuffer.config.numChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + zeroPadToWrite = 0; } - zeroPadToWrite = 0; - if ( args.inConfig.numAudioObjects != 0 && ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + if ( args.inConfig.numAudioObjects != 0 && + ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { - fprintf( stdout, "\n\nMetadata delayed %d subframes\n\n", (int16_t) round( args.syncMdDelay / ( 1000 / IVAS_NUM_FRAMES_PER_SEC / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ) ) ); + fprintf( stdout, "\n\nMetadata delayed %d subframes\n\n", (int16_t) round( args.syncMdDelay / ( (float) BINAURAL_RENDERING_FRAME_SIZE_MS ) ) ); } if ( !args.quietModeEnabled && args.delayCompensationEnabled ) @@ -1678,6 +2147,13 @@ int main( fprintf( stdout, "\n\nRendering of %d frames finished\n\n", frame ); + /*------------------------------------------------------------------------------------------* + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ + + mainFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ + +cleanup: /* === Close === */ free( inpInt16Buffer ); @@ -1686,11 +2162,30 @@ int main( free( outFloatBuffer ); free( outInt32Buffer ); free( inInt32Buffer ); + + if ( bitsBufferData != NULL ) + { + free( bitsBufferData ); + } + + if ( args.aeSequence.count > 0 ) + { + free( args.aeSequence.pID ); + free( args.aeSequence.pValidity ); + } + for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) { MasaFileReader_close( &masaReaders[i] ); } + if ( cldfb_in_flag ) + { + IVAS_REND_closeCldfb( cldfbAna, cldfbSyn ); + } + + split_rend_reader_writer_close( &hSplitRendFileReadWrite ); + SplitRendBFIFileReader_close( &splitRendBFIReader ); for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) { @@ -1703,7 +2198,8 @@ int main( RotationFileReader_close( &externalOrientationFileReader ); RotationFileReader_close( &referenceRotReader ); Vector3PairFileReader_close( &referenceVectorReader ); - hrtfFileReader_close( &hrtfFileReader ); + destroy_td_hrtf( hHrtfTD ); + destroy_hrtf_statistics( hHrtfStatistics ); IVAS_REND_Close( &hIvasRend ); IsmPositionProvider_close( positionProvider ); RenderConfigReader_close( &renderConfigReader ); @@ -1713,7 +2209,7 @@ int main( print_mem( NULL ); #endif - return 0; + return mainFailed ? -1 : 0; } @@ -1808,16 +2304,11 @@ static bool parseInConfig( inConfig->masaBuses[0].gain_dB = 0.0f; break; case IVAS_AUDIO_CONFIG_OBA: - /* If input format is objects, parse the characters after "ISM" to get number of objects */ + /* If input format is objects, parse the characters after "ISM" to get + * number of objects and check for combined formats. */ { char *ptr = NULL; inConfig->numAudioObjects = (uint16_t) strtol( inFormatStr + 3, &ptr, 10 ); - if ( ptr == NULL || *ptr != '\0' ) - { - /* Failed to parse string as a number */ - fprintf( stderr, "Cannot parse string \"%s\" as a valid input format", inFormatStr ); - return false; - } if ( inConfig->numAudioObjects > RENDERER_MAX_ISM_INPUTS ) { fprintf( stderr, "Too many objects at input. Max %d supported.", RENDERER_MAX_ISM_INPUTS ); @@ -1829,6 +2320,17 @@ static bool parseInConfig( inConfig->audioObjects[i].inputChannelIndex = i; inConfig->audioObjects[i].gain_dB = 0.0f; } + if ( *ptr != '\0' ) + { + /* Try to parse combined format */ + parseCombinedFormatInput( inConfig, &ptr ); + } + if ( ptr == NULL || *ptr != '\0' ) + { + /* Failed to parse string as a number */ + fprintf( stderr, "Cannot parse string \"%s\" as a valid input format", inFormatStr ); + return false; + } } break; case IVAS_AUDIO_CONFIG_INVALID: @@ -1954,7 +2456,7 @@ static bool parseRenderFramesize( static bool parseOrientationTracking( char *value, - int8_t *orientation_tracking ) + IVAS_HEAD_ORIENT_TRK_T *orientation_tracking ) { to_upper( value ); @@ -1990,8 +2492,8 @@ static bool parseOrientationTracking( static IVAS_AUDIO_CONFIG parseAudioConfig( const char *configString ) { - char charBuf[21]; - charBuf[20] = '\0'; + char charBuf[25]; + charBuf[24] = '\0'; strncpy( charBuf, configString, sizeof( charBuf ) - 1 ); charBuf[sizeof( charBuf ) - 1] = '\0'; @@ -2066,6 +2568,14 @@ static IVAS_AUDIO_CONFIG parseAudioConfig( { return IVAS_AUDIO_CONFIG_BINAURAL; } + if ( strcmp( charBuf, "BINAURAL_SPLIT_PCM" ) == 0 ) + { + return IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM; + } + if ( strcmp( charBuf, "BINAURAL_SPLIT_CODED" ) == 0 ) + { + return IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED; + } if ( strcmp( charBuf, "BINAURAL_ROOM_IR" ) == 0 ) { return IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR; @@ -2123,6 +2633,75 @@ static bool parseLfePositionConfig( return true; } +static bool parseAcousticEnvironmentIds( + const char *value, + AcousticEnvironmentSequence *aeSequence ) +{ + char config_string[RENDERER_MAX_METADATA_LINE_LENGTH]; + strncpy( config_string, value, RENDERER_MAX_METADATA_LINE_LENGTH ); + if ( !is_digits_only( config_string ) ) + { + aeidFileReader *aeidReader = NULL; + if ( aeidFileReader_open( config_string, &aeidReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open aeid file %s \n", config_string ); + return false; + } + if ( aeidFileReading( aeidReader, &aeSequence->count, &aeSequence->pID, &aeSequence->pValidity ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError while reading aeid from %s\n", config_string ); + return false; + } + aeidFileReader_close( &aeidReader ); + } + else + { + /* A single acoustic environment */ + if ( NULL == ( aeSequence->pID = malloc( sizeof( uint16_t ) ) ) || + NULL == ( aeSequence->pValidity = malloc( sizeof( uint16_t ) ) ) ) + { + fprintf( stdout, "Error: Unable to allocate memory for acoustic environment sequence: %s\n\n", config_string ); + return false; + } + aeSequence->count = 1; + aeSequence->pID[0] = (int16_t) atoi( config_string ); + aeSequence->pValidity[0] = 0; + } + + return true; +} + + +static bool parseReverbRoomSize( + char *value, + IVAS_ROOM_SIZE_T *reverbRoomSize ) +{ + if ( strlen( value ) != 1 ) + { + fprintf( stderr, "Error: Unsupported room size selector %s!\n\n", value ); + return false; + } + + to_upper( value ); + switch ( value[0] ) + { + case 'S': + *reverbRoomSize = IVAS_ROOM_SIZE_SMALL; + break; + case 'M': + *reverbRoomSize = IVAS_ROOM_SIZE_MEDIUM; + break; + case 'L': + *reverbRoomSize = IVAS_ROOM_SIZE_LARGE; + break; + default: + fprintf( stderr, "Error: Unsupported room size selector %s!\n\n", value ); + return false; + } + + return true; +} + static bool checkRequiredArgs( CmdlnArgs args ) @@ -2174,6 +2753,7 @@ static CmdlnArgs defaultArgs( const char *executableName ) { CmdlnArgs args; + int16_t i; strncpy( args.executableName, executableName, RENDERER_MAX_CLI_ARG_LENGTH ); clearString( args.inputFilePath ); @@ -2190,21 +2770,31 @@ static CmdlnArgs defaultArgs( args.outConfig.audioConfig = IVAS_AUDIO_CONFIG_INVALID; args.outConfig.outSetupCustom.num_spk = 0; args.outConfig.outSetupCustom.num_lfe = 0; + for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) + { + args.inConfig.ambisonicsBuses[i].audioConfig = IVAS_AUDIO_CONFIG_INVALID; + } - for ( int32_t i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) + for ( i = 0; i < RENDERER_MAX_ISM_INPUTS + RENDERER_MAX_MASA_INPUTS; ++i ) { clearString( args.inMetadataFilePaths[i] ); } args.numInMetadataFiles = 0; clearString( args.headRotationFilePath ); + clearString( args.outMetadataFilePath ); + clearString( args.splitRendBFIFilePath ); clearString( args.referenceVectorFilePath ); clearString( args.referenceRotationFilePath ); clearString( args.customHrtfFilePath ); clearString( args.renderConfigFilePath ); clearString( args.externalOrientationFilePath ); + args.Opt_Headrotation = 0; + args.Opt_ExternalOrientation = 0; + args.orientation_tracking = IVAS_HEAD_ORIENT_TRK_NONE; + args.nonDiegeticPan = 0; args.nonDiegeticPanGain = 0.f; @@ -2222,13 +2812,18 @@ static CmdlnArgs defaultArgs( clearString( args.inLfePanningMatrixFile ); args.render_framesize = IVAS_RENDER_FRAMESIZE_20MS; args.syncMdDelay = 0; - - for ( int32_t i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) + for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) { args.directivityPatternId[i] = 65535; } - args.acousticEnvironmentId = 65535; + args.aeSequence.count = 0; + args.aeSequence.pID = NULL; + args.aeSequence.pValidity = NULL; + args.aeSequence.selected = 0; + args.aeSequence.frameCounter = 0; + + args.reverbRoomSize = IVAS_ROOM_SIZE_AUTO; return args; } @@ -2259,7 +2854,7 @@ static void parseOption( } break; case CmdLnOptionId_inputMetadata: - assert( numOptionValues <= RENDERER_MAX_ISM_INPUTS ); + assert( numOptionValues <= RENDERER_MAX_ISM_INPUTS + RENDERER_MAX_MASA_INPUTS ); for ( int16_t i = 0; i < numOptionValues; ++i ) { strncpy( args->inMetadataFilePaths[i], optionValues[i], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); @@ -2288,8 +2883,17 @@ static void parseOption( break; case CmdLnOptionId_trajFile: assert( numOptionValues == 1 ); + args->Opt_Headrotation = 1; strncpy( args->headRotationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); break; + case CmdLnOptionId_outputMetadata: + assert( numOptionValues == 1 ); + strncpy( args->outMetadataFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + break; + case CmdLnOptionId_SplitRendBFIFile: + assert( numOptionValues == 1 ); + strncpy( args->splitRendBFIFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + break; case CmdLnOptionId_referenceVectorFile: assert( numOptionValues == 1 ); strncpy( args->referenceVectorFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); @@ -2300,6 +2904,7 @@ static void parseOption( break; case CmdLnOptionId_exteriorOrientationFile: assert( numOptionValues == 1 ); + args->Opt_ExternalOrientation = 1; strncpy( args->externalOrientationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); break; case CmdLnOptionId_customHrtfFile: @@ -2390,17 +2995,23 @@ static void parseOption( break; case CmdLnOptionId_acousticEnvironmentId: assert( numOptionValues == 1 ); - if ( !is_digits_only( optionValues[0] ) ) + if ( !parseAcousticEnvironmentIds( optionValues[0], &args->aeSequence ) ) { - fprintf( stderr, "Invalid acousting environment ID specified: %s\n", optionValues[0] ); - exit( -1 ); + fprintf( stderr, "Invalid acoustic environment ID specified: %s\n", optionValues[0] ); } - args->acousticEnvironmentId = (int16_t) strtol( optionValues[0], NULL, 10 ); break; case CmdLnOptionId_syncMdDelay: assert( numOptionValues == 1 ); /* Metadata Delay to sync with audio delay in ms */ - args->syncMdDelay = strtof( optionValues[0], NULL ); + args->syncMdDelay = (int16_t) strtol( optionValues[0], NULL, 10 ); + break; + case CmdLnOptionId_roomSize: + assert( numOptionValues == 1 ); + if ( !parseReverbRoomSize( optionValues[0], &args->reverbRoomSize ) ) + { + fprintf( stderr, "Error: Unsupported room size selector %s!\n\n", optionValues[0] ); + exit( -1 ); + } break; default: assert( 0 && "This should be unreachable - all command line options should be explicitly handled." ); @@ -2426,6 +3037,11 @@ static CmdlnArgs parseCmdlnArgs( exit( -1 ); /* Error printout handled by failing function */ } + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + { + args.Opt_Headrotation = 1; + } + return args; } @@ -2491,17 +3107,11 @@ void getMetadataFromFileReader( fprintf( stderr, "\nError (%s) while reading ISM metadata from: %s\n\n", ivas_error_to_string( error ), IsmFileReader_getFilePath( ismReader ) ); exit( -1 ); } - objectMetadataBuffer->positions[objIdx].azimuth_fx = (Word32) ( ismMetadata.azimuth * ( 1 << 22 ) ); - objectMetadataBuffer->positions[objIdx].elevation_fx = (Word32) ( ismMetadata.elevation * ( 1 << 22 ) ); - objectMetadataBuffer->positions[objIdx].radius_fx = (Word16) ( ismMetadata.radius * ( 1 << 9 ) ); - objectMetadataBuffer->positions[objIdx].yaw_fx = (Word32) ( ismMetadata.yaw * ( 1 << 22 ) ); - objectMetadataBuffer->positions[objIdx].pitch_fx = (Word32) ( ismMetadata.pitch * ( 1 << 22 ) ); - - objectMetadataBuffer->positions[objIdx].azimuth = ismMetadata.azimuth; - objectMetadataBuffer->positions[objIdx].elevation = ismMetadata.elevation; - objectMetadataBuffer->positions[objIdx].radius = ismMetadata.radius; - objectMetadataBuffer->positions[objIdx].yaw = ismMetadata.yaw; - objectMetadataBuffer->positions[objIdx].pitch = ismMetadata.pitch; + objectMetadataBuffer->positions[objIdx].azimuth_fx = ismMetadata.azimuth_fx; + objectMetadataBuffer->positions[objIdx].elevation_fx = ismMetadata.elevation_fx; + objectMetadataBuffer->positions[objIdx].radius_fx = ismMetadata.radius_fx; + objectMetadataBuffer->positions[objIdx].yaw_fx = ismMetadata.yaw_fx; + objectMetadataBuffer->positions[objIdx].pitch_fx = ismMetadata.pitch_fx; objectMetadataBuffer->positions[objIdx].non_diegetic_flag = ismMetadata.non_diegetic_flag; return; @@ -2555,47 +3165,39 @@ static void IsmPositionProvider_getNextFrame( /* Otherwise fall back to default position */ else { - objectMetadataBuffer->positions[objIdx].azimuth = 0.0f; - objectMetadataBuffer->positions[objIdx].elevation = 0.0f; - objectMetadataBuffer->positions[objIdx].radius = 1.0f; - objectMetadataBuffer->positions[objIdx].yaw = 0.0f; - objectMetadataBuffer->positions[objIdx].pitch = 0.0f; objectMetadataBuffer->positions[objIdx].azimuth_fx = 0; objectMetadataBuffer->positions[objIdx].elevation_fx = 0; - objectMetadataBuffer->positions[objIdx].radius_fx = 512; + objectMetadataBuffer->positions[objIdx].radius_fx = 512; // 1.f in Q9 objectMetadataBuffer->positions[objIdx].yaw_fx = 0; objectMetadataBuffer->positions[objIdx].pitch_fx = 0; objectMetadataBuffer->positions[objIdx].non_diegetic_flag = 0; } /* Wrap azimuth to lie within (-180, 180] range */ - while ( objectMetadataBuffer->positions[objIdx].azimuth < 0.0f ) + while ( LT_32( objectMetadataBuffer->positions[objIdx].azimuth_fx, 0 ) ) { - objectMetadataBuffer->positions[objIdx].azimuth += 360.0f; + objectMetadataBuffer->positions[objIdx].azimuth_fx = L_add( objectMetadataBuffer->positions[objIdx].azimuth_fx, DEG_360_IN_Q22 ); } - while ( objectMetadataBuffer->positions[objIdx].azimuth >= 360.0f ) + while ( GE_32( objectMetadataBuffer->positions[objIdx].azimuth_fx, DEG_360_IN_Q22 ) ) { - objectMetadataBuffer->positions[objIdx].azimuth -= 360.0f; + objectMetadataBuffer->positions[objIdx].azimuth_fx = L_sub( objectMetadataBuffer->positions[objIdx].azimuth_fx, DEG_360_IN_Q22 ); } /* Clamp elevation to lie within [-90, 90] range (can't be wrapped easily) */ - objectMetadataBuffer->positions[objIdx].elevation = min( max( objectMetadataBuffer->positions[objIdx].elevation, -90 ), 90 ); - objectMetadataBuffer->positions[objIdx].azimuth_fx = (Word32) ( objectMetadataBuffer->positions[objIdx].azimuth * ( 1 << 22 ) ); - objectMetadataBuffer->positions[objIdx].elevation_fx = (Word32) ( objectMetadataBuffer->positions[objIdx].elevation * ( 1 << 22 ) ); + objectMetadataBuffer->positions[objIdx].elevation_fx = L_min( L_max( objectMetadataBuffer->positions[objIdx].elevation_fx, -DEG_90_IN_Q22 ), DEG_90_IN_Q22 ); + /* Wrap yaw to lie within (-180, 180] range */ - while ( objectMetadataBuffer->positions[objIdx].yaw < 0.0f ) + while ( LT_32( objectMetadataBuffer->positions[objIdx].yaw_fx, 0 ) ) { - objectMetadataBuffer->positions[objIdx].yaw += 360.0f; + objectMetadataBuffer->positions[objIdx].yaw_fx = L_add( objectMetadataBuffer->positions[objIdx].yaw_fx, DEG_360_IN_Q22 ); } - while ( objectMetadataBuffer->positions[objIdx].yaw >= 360.0f ) + while ( GE_32( objectMetadataBuffer->positions[objIdx].yaw_fx, DEG_360_IN_Q22 ) ) { - objectMetadataBuffer->positions[objIdx].yaw -= 360.0f; + objectMetadataBuffer->positions[objIdx].yaw_fx = L_sub( objectMetadataBuffer->positions[objIdx].yaw_fx, DEG_360_IN_Q22 ); } /* Clamp pitch to lie within [-90, 90] range (can't be wrapped easily) */ - objectMetadataBuffer->positions[objIdx].pitch = min( max( objectMetadataBuffer->positions[objIdx].pitch, -90 ), 90 ); - objectMetadataBuffer->positions[objIdx].yaw_fx = (Word32) ( ( objectMetadataBuffer->positions[objIdx].yaw ) * ( 1 << Q22 ) ); - objectMetadataBuffer->positions[objIdx].pitch_fx = (Word32) ( ( objectMetadataBuffer->positions[objIdx].pitch ) * ( 1 << Q22 ) ); + objectMetadataBuffer->positions[objIdx].pitch_fx = L_min( L_max( objectMetadataBuffer->positions[objIdx].pitch_fx, -DEG_90_IN_Q22 ), DEG_90_IN_Q22 ); } ++positionProvider->frameCounter; @@ -2892,7 +3494,8 @@ static void parseObjectPosition( *positionDuration = (uint16_t) strtol( line, &endptr, 10 ); readNextMetadataChunk( line, "\n" ); - read_values = (int16_t) sscanf( line, "%f,%f,%f,%f,%f,%f,%f,%f", &meta_prm[0], &meta_prm[1], &meta_prm[2], &meta_prm[3], &meta_prm[4], &meta_prm[5], &meta_prm[6], &meta_prm[7] ); + read_values = (int16_t) sscanf( line, "%f,%f,%f,%f,%f,%f,%f,%f", + &meta_prm[0], &meta_prm[1], &meta_prm[2], &meta_prm[3], &meta_prm[4], &meta_prm[5], &meta_prm[6], &meta_prm[7] ); if ( read_values < 2 ) { @@ -2900,14 +3503,12 @@ static void parseObjectPosition( exit( -1 ); } - position->azimuth = meta_prm[0]; - position->elevation = meta_prm[1]; - position->azimuth_fx = (Word32) ( meta_prm[0] * ( 1 << 22 ) ); - position->elevation_fx = (Word32) ( meta_prm[1] * ( 1 << 22 ) ); - position->radius = meta_prm[2]; - position->yaw = meta_prm[5]; - position->pitch = meta_prm[6]; - position->non_diegetic_flag = (int16_t) meta_prm[7]; + position->azimuth_fx = (Word32) ( meta_prm[0] * ( 1 << Q22 ) ); /* Q22 */ + position->elevation_fx = (Word32) ( meta_prm[1] * ( 1 << Q22 ) ); /* Q22 */ + position->radius_fx = (Word16) ( meta_prm[2] * ( 1 << Q9 ) ); /* Q9 */ + position->yaw_fx = (Word32) ( meta_prm[5] * ( 1 << Q22 ) ); /* Q22 */ + position->pitch_fx = (Word32) ( meta_prm[6] * ( 1 << Q22 ) ); /* Q22 */ + position->non_diegetic_flag = (Word16) meta_prm[7]; return; } @@ -3090,6 +3691,37 @@ static void parseMasa( return; } +static void parseCombinedFormatInput( + InputConfig *inConfig, + char **configString ) +{ + IVAS_AUDIO_CONFIG audioConfig; + audioConfig = parseAudioConfig( *configString ); + + if ( audioConfig == IVAS_AUDIO_CONFIG_FOA || audioConfig == IVAS_AUDIO_CONFIG_HOA2 || audioConfig == IVAS_AUDIO_CONFIG_HOA3 ) + { + /* OSBA */ + inConfig->numAmbisonicsBuses = 1; + inConfig->ambisonicsBuses[0].audioConfig = audioConfig; + inConfig->ambisonicsBuses[0].inputChannelIndex = inConfig->numAudioObjects; + inConfig->ambisonicsBuses[0].gain_dB = 0.f; + *configString += 4; + + /* Modify input gain for objects too */ + } + else if ( audioConfig == IVAS_AUDIO_CONFIG_MASA1 || audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) + { + /* OMASA */ + inConfig->numMasaBuses = 1; + inConfig->masaBuses[0].audioConfig = audioConfig; + inConfig->masaBuses[0].inputChannelIndex = inConfig->numAudioObjects; + inConfig->masaBuses[0].gain_dB = 0.0f; + *configString += 5; + } + + return; +} + static ivas_error parseCustomLayoutFile( const char *filePath, IVAS_CUSTOM_LS_DATA *pLsSetupCustom ) @@ -3306,10 +3938,15 @@ static void printSupportedAudioConfigs( void ) "HOA2", "HOA3", "ISMx (input only)", + "ISMxSBAy (OSBA, input only)", + "ISMxMASAy (OMASA, input only)", "MASAx", "BINAURAL (output only)", + "BINAURAL_SPLIT_PCM", + "BINAURAL_SPLIT_CODED", "BINAURAL_ROOM_IR (output only)", "BINAURAL_ROOM_REVERB (output only)", + "META (Scene description, input only)", }; fprintf( stdout, "Supported audio formats:\n" ); @@ -3317,6 +3954,7 @@ static void printSupportedAudioConfigs( void ) { fprintf( stdout, "%s\n", supportedFormats[i] ); } + fprintf( stdout, "\n" ); return; } @@ -3346,7 +3984,7 @@ static ivas_error parseLfePanMtxFile( any subsequent issue in file reading will gracefully exit the function */ for ( lfe_in = 0; lfe_in < RENDERER_MAX_INPUT_LFE_CHANNELS; lfe_in++ ) { - for ( i = 0; i < IVAS_MAX_OUTPUT_CHANNELS; i++ ) + for ( i = 0; i < RENDERER_MAX_OUTPUT_CHANNELS; i++ ) { ( *lfePanMtx )[lfe_in][i] = 0.0f; } @@ -3374,7 +4012,7 @@ static ivas_error parseLfePanMtxFile( { continue; } - if ( ch_out > IVAS_MAX_OUTPUT_CHANNELS ) + if ( ch_out > RENDERER_MAX_OUTPUT_CHANNELS ) { break; } @@ -3391,44 +4029,6 @@ static ivas_error parseLfePanMtxFile( return IVAS_ERR_OK; } -/*--------------------------------------------------------------------------* - * convertInputBuffer() - * - * Convert input buffer from WAV/PCM file (int16_t, interleaved) to a format - * accepted by the renderer (float, packed) - *--------------------------------------------------------------------------*/ - -static void convertInputBuffer( - const int16_t *intBuffer, - const int16_t numIntSamplesPerChannel, - const int16_t numFloatSamplesPerChannel, - const int16_t numChannels, - float *floatBuffer ) -{ - int16_t chnl, smpl, i; - - i = 0; - - for ( smpl = 0; smpl < numFloatSamplesPerChannel; ++smpl ) - { - for ( chnl = 0; chnl < numChannels; ++chnl ) - { - if ( i < numIntSamplesPerChannel ) - { - floatBuffer[chnl * numFloatSamplesPerChannel + smpl] = (float) intBuffer[i]; - } - else - { - floatBuffer[chnl * numFloatSamplesPerChannel + smpl] = 0.f; - } - - ++i; - } - } - - return; -} - /*--------------------------------------------------------------------------* * convertInputBuffer() * @@ -3442,42 +4042,92 @@ static void convertInputBuffer_fx( const Word16 numFloatSamplesPerChannel, const Word16 numChannels, Word32 *Word32Buffer, - Word16 in_q_factor ) + Word16 in_q_factor, + const int16_t cldfb_in_flag, + IVAS_CLDFB_FILTER_BANK_HANDLE *cldfbAna, + Word16 *out_q_factor ) { Word16 chnl, smpl, i; i = 0; - FOR( smpl = 0; smpl < numFloatSamplesPerChannel; ++smpl ) + IF( cldfb_in_flag ) { - FOR( chnl = 0; chnl < numChannels; ++chnl ) + Word16 slotIdx, numCldfbBands, numFloatPcmSamples; + Word32 fIn[RENDERER_MAX_OUTPUT_CHANNELS][IVAS_MAX_FRAME_SIZE]; + + numFloatPcmSamples = numFloatSamplesPerChannel >> 1; + numCldfbBands = numFloatPcmSamples / IVAS_CLDFB_NO_COL_MAX; + + /* CLDFB Analysis*/ + assert( numIntSamplesPerChannel <= RENDERER_MAX_OUTPUT_CHANNELS * IVAS_MAX_FRAME_SIZE ); + FOR( smpl = 0; smpl < numFloatPcmSamples; ++smpl ) { - IF( i < numIntSamplesPerChannel ) + FOR( chnl = 0; chnl < numChannels; ++chnl ) { - Word32Buffer[chnl * numFloatSamplesPerChannel + smpl] = L_shl( (Word32) intBuffer[i], in_q_factor ); + IF( i < numIntSamplesPerChannel ) + { + fIn[chnl][smpl] = L_shl( (Word32) intBuffer[i], Q11 ); + } + ELSE + { + fIn[chnl][smpl] = 0; + } + + ++i; } - ELSE + } + + FOR( chnl = 0; chnl < numChannels; ++chnl ) + { + FOR( slotIdx = 0; slotIdx < IVAS_CLDFB_NO_COL_MAX; slotIdx++ ) { - Word32Buffer[chnl * numFloatSamplesPerChannel + smpl] = 0; + IVAS_REND_cldfbAnalysis_ts_wrapper( &fIn[chnl][numCldfbBands * slotIdx], + &Word32Buffer[( chnl * numFloatSamplesPerChannel ) + ( 2 * slotIdx * numCldfbBands )], + &Word32Buffer[numCldfbBands + ( chnl * numFloatSamplesPerChannel ) + ( 2 * slotIdx * numCldfbBands )], + numCldfbBands, cldfbAna[chnl], Q11, out_q_factor ); } + } + } + ELSE + { + FOR( smpl = 0; smpl < numFloatSamplesPerChannel; ++smpl ) + { + FOR( chnl = 0; chnl < numChannels; ++chnl ) + { + IF( i < numIntSamplesPerChannel ) + { + Word32Buffer[chnl * numFloatSamplesPerChannel + smpl] = L_shl( (Word32) intBuffer[i], in_q_factor ); + } + ELSE + { + Word32Buffer[chnl * numFloatSamplesPerChannel + smpl] = 0; + } - ++i; + ++i; + } } + *out_q_factor = in_q_factor; } return; } + + /*--------------------------------------------------------------------------* - * convertOutputBuffer() + * convertOutputBuffer_fx() * - * Convert output buffer from the renderer (Word32, packed) to a format ready - * for writing to a WAV/PCM file (Word16, interleaved) + * Convert output buffer from the renderer (float, packed) to a format ready + * for writing to a WAV/PCM file (int16_t, interleaved) *--------------------------------------------------------------------------*/ + static void convertOutputBuffer_fx( const Word32 *Word32Buffer, const Word16 numSamplesPerChannel, const Word16 numChannels, Word16 *intBuffer, + const Word16 cldfb_in_flag, + IVAS_CLDFB_FILTER_BANK_HANDLE *cldfbSyn, Word16 out_q ) { Word16 chnl, smpl, i; @@ -3485,62 +4135,88 @@ static void convertOutputBuffer_fx( Word32 temp_fx1; i = 0; - FOR( smpl = 0; smpl < numSamplesPerChannel; ++smpl ) + IF( cldfb_in_flag ) { + Word16 slotIdx, numCldfbBands, numPcmSamples, b, temp_out_q = 0; + Word32 fIn[RENDERER_MAX_OUTPUT_CHANNELS][IVAS_MAX_FRAME_SIZE]; + Word32 re[RENDERER_MAX_OUTPUT_CHANNELS][IVAS_CLDFB_NO_COL_MAX][IVAS_CLDFB_NO_CHANNELS_MAX]; + Word32 im[RENDERER_MAX_OUTPUT_CHANNELS][IVAS_CLDFB_NO_COL_MAX][IVAS_CLDFB_NO_CHANNELS_MAX]; + + numPcmSamples = numSamplesPerChannel >> 1; + numCldfbBands = numPcmSamples / IVAS_CLDFB_NO_COL_MAX; + + /* CLDFB Synthesis*/ FOR( chnl = 0; chnl < numChannels; ++chnl ) { - temp_fx = L_add( Word32Buffer[chnl * numSamplesPerChannel + smpl], lshl( 1, ( out_q - 1 ) ) ); - temp_fx1 = L_shr( temp_fx, out_q ); - IF( GT_32( temp_fx1, IVAS_MAX16B_FX ) ) + FOR( slotIdx = 0; slotIdx < IVAS_CLDFB_NO_COL_MAX; slotIdx++ ) { - temp_fx1 = IVAS_MAX16B_FX; + FOR( b = 0; b < numCldfbBands; b++ ) + { + re[chnl][slotIdx][b] = Word32Buffer[( chnl * numSamplesPerChannel ) + ( 2 * slotIdx * numCldfbBands ) + b]; + im[chnl][slotIdx][b] = Word32Buffer[numCldfbBands + ( chnl * numSamplesPerChannel ) + ( 2 * slotIdx * numCldfbBands ) + b]; + move32(); + move32(); + } } - ELSE IF( LT_32( temp_fx1, IVAS_MIN16B_FX ) ) + } + + /* Implement CLDFB synthesis */ + FOR( chnl = 0; chnl < numChannels; ++chnl ) + { + Word32 *RealBuffer[IVAS_CLDFB_NO_COL_MAX]; + Word32 *ImagBuffer[IVAS_CLDFB_NO_COL_MAX]; + + FOR( slotIdx = 0; slotIdx < IVAS_CLDFB_NO_COL_MAX; slotIdx++ ) { - temp_fx1 = IVAS_MIN16B_FX; + RealBuffer[slotIdx] = re[chnl][slotIdx]; + ImagBuffer[slotIdx] = im[chnl][slotIdx]; + move32(); + move32(); } - intBuffer[i] = (Word16) temp_fx1; - ++i; + IVAS_REND_cldfbSynthesis_wrapper( RealBuffer, ImagBuffer, &( fIn[chnl][0] ), numCldfbBands * IVAS_CLDFB_NO_COL_MAX, cldfbSyn[chnl], out_q, &temp_out_q ); } - } - - return; -} -/*--------------------------------------------------------------------------* - * convertOutputBuffer() - * - * Convert output buffer from the renderer (float, packed) to a format ready - * for writing to a WAV/PCM file (int16_t, interleaved) - *--------------------------------------------------------------------------*/ -static void convertOutputBuffer( - const float *floatBuffer, - const int16_t numSamplesPerChannel, - const int16_t numChannels, - int16_t *intBuffer ) -{ - int16_t chnl, smpl, i; - float temp; - - i = 0; - for ( smpl = 0; smpl < numSamplesPerChannel; ++smpl ) - { - for ( chnl = 0; chnl < numChannels; ++chnl ) + FOR( smpl = 0; smpl < numPcmSamples; ++smpl ) { - temp = floatBuffer[chnl * numSamplesPerChannel + smpl]; - temp = (float) floor( temp + 0.5f ); - if ( temp > IVAS_MAX16B_FLT ) + FOR( chnl = 0; chnl < numChannels; ++chnl ) { - temp = IVAS_MAX16B_FLT; + temp_fx = L_add( fIn[chnl][smpl], lshl( 1, ( temp_out_q - 1 ) ) ); + temp_fx1 = L_shr( temp_fx, temp_out_q ); + IF( GT_32( temp_fx1, IVAS_MAX16B_FX ) ) + { + temp_fx1 = IVAS_MAX16B_FX; + } + ELSE IF( LT_32( temp_fx1, IVAS_MIN16B_FX ) ) + { + temp_fx1 = IVAS_MIN16B_FX; + } + intBuffer[i] = (Word16) temp_fx1; + ++i; } - else if ( temp < IVAS_MIN16B_FLT ) + } + } + ELSE + { + + FOR( smpl = 0; smpl < numSamplesPerChannel; ++smpl ) + { + FOR( chnl = 0; chnl < numChannels; ++chnl ) { - temp = IVAS_MIN16B_FLT; - } - intBuffer[i] = (int16_t) temp; + temp_fx = L_add( Word32Buffer[chnl * numSamplesPerChannel + smpl], lshl( 1, ( out_q - 1 ) ) ); + temp_fx1 = L_shr( temp_fx, out_q ); + IF( GT_32( temp_fx1, IVAS_MAX16B_FX ) ) + { + temp_fx1 = IVAS_MAX16B_FX; + } + ELSE IF( LT_32( temp_fx1, IVAS_MIN16B_FX ) ) + { + temp_fx1 = IVAS_MIN16B_FX; + } + intBuffer[i] = (Word16) temp_fx1; - ++i; + ++i; + } } } diff --git a/lib_com/basop32.c b/lib_basop/basop32.c similarity index 99% rename from lib_com/basop32.c rename to lib_basop/basop32.c index 7fab246607e316ca3e688971e6b850277fe9576c..eebc1684915ccba9a062a49f561a112f2208d36d 100644 --- a/lib_com/basop32.c +++ b/lib_basop/basop32.c @@ -1268,7 +1268,7 @@ Word16 round_fx( Word32 L_var1 ) Word32 L_rounded; BASOP_SATURATE_WARNING_OFF - L_rounded = L_add( L_var1, (Word32) 0x00008000L ); + L_rounded = L_add_sat( L_var1, (Word32) 0x00008000L ); BASOP_SATURATE_WARNING_ON var_out = extract_h( L_rounded ); @@ -1575,7 +1575,7 @@ Word32 L_msuNs_co( Word32 L_var3, Word16 var1, Word16 var2, Flag *Carry, Flag *O { Word32 L_var_out; - L_var_out = L_mult( var1, var2 ); + L_var_out = L_mult_o( var1, var2, Overflow ); L_var_out = L_sub_co( L_var3, L_var_out, Carry, Overflow ); return ( L_var_out ); @@ -2038,6 +2038,7 @@ Word32 DEPR_L_sub_c( Word32 L_var1, Word32 L_var2, Flag *Carry ) return ( L_var_out ); } + Word32 L_sub_co( Word32 L_var1, Word32 L_var2, Flag *Carry, Flag *Overflow ) { Word32 L_var_out; @@ -2056,6 +2057,7 @@ Word32 L_sub_co( Word32 L_var1, Word32 L_var2, Flag *Carry, Flag *Overflow ) L_var_out = L_var1 - L_var2; if ( L_var1 > 0L ) { + set_overflow( Overflow ); unset_carry( Carry ); } } @@ -2067,18 +2069,22 @@ Word32 L_sub_co( Word32 L_var1, Word32 L_var2, Flag *Carry, Flag *Overflow ) if ( ( L_test < 0 ) && ( L_var1 > 0 ) && ( L_var2 < 0 ) ) { + set_overflow( Overflow ); carry_int = 0; } else if ( ( L_test > 0 ) && ( L_var1 < 0 ) && ( L_var2 > 0 ) ) { + set_overflow( Overflow ); carry_int = 1; } else if ( ( L_test > 0 ) && ( ( L_var1 ^ L_var2 ) > 0 ) ) { + unset_overflow( Overflow ); carry_int = 1; } if ( L_test == MIN_32 ) { + set_overflow( Overflow ); carry_int ? set_carry( Carry ) : unset_carry( Carry ); } else @@ -2563,10 +2569,8 @@ Word16 shr_ro( Word16 var1, Word16 var2, Flag *Overflow ) { var_out = shr_o( var1, var2, Overflow ); -#ifdef FIX_1049_SHR_RO_COMPLEXITY #ifdef WMOPS multiCounter[currCounter].shr--; -#endif #endif if ( var2 > 0 ) { @@ -2577,13 +2581,11 @@ Word16 shr_ro( Word16 var1, Word16 var2, Flag *Overflow ) } } -#ifdef FIX_1049_SHR_RO_COMPLEXITY #ifdef WMOPS multiCounter[currCounter].shr_r++; #endif BASOP_CHECK(); -#endif return ( var_out ); } @@ -3580,13 +3582,13 @@ Word16 i_mult_o( Word16 a, Word16 b, Flag *Overflow ) #ifdef ORIGINAL_G7231 return a * b; #else - register Word32 c = a * b; + register Word32 c = (Word32) a * b; return saturate_o( c, Overflow ); #endif } Word16 i_mult( Word16 a, Word16 b ) { - return i_mult_o( a, b, NULL ); + return i_mult_sat( a, b ); } Word16 i_mult_sat( Word16 a, Word16 b ) { diff --git a/lib_com/basop32.h b/lib_basop/basop32.h similarity index 100% rename from lib_com/basop32.h rename to lib_basop/basop32.h diff --git a/lib_com/complex_basop.c b/lib_basop/complex_basop.c similarity index 100% rename from lib_com/complex_basop.c rename to lib_basop/complex_basop.c diff --git a/lib_com/complex_basop.h b/lib_basop/complex_basop.h similarity index 100% rename from lib_com/complex_basop.h rename to lib_basop/complex_basop.h diff --git a/lib_com/enh1632.c b/lib_basop/enh1632.c similarity index 98% rename from lib_com/enh1632.c rename to lib_basop/enh1632.c index bac18231eed2314f224537ba36dbb19baf08f159..f397c3432b9dc63b6a376cfb394e3efb50a82bc0 100644 --- a/lib_com/enh1632.c +++ b/lib_basop/enh1632.c @@ -616,6 +616,27 @@ Word32 L_rotr( Word32 L_var1, Word16 var2, Word16 *var3 ) } +int16_t norm_ul( uint32_t UL_var1 ) +{ + int16_t var_out; + + if ( UL_var1 == 0 ) + { + var_out = 0; + } + else + { + for ( var_out = 0; UL_var1 < (uint32_t) 0x80000000U; var_out++ ) + { + UL_var1 <<= 1; + } + } + BASOP_CHECK(); + + return ( var_out ); +} + + /***************************************************************************** * * Function Name : L_rotl diff --git a/lib_com/enh1632.h b/lib_basop/enh1632.h similarity index 99% rename from lib_com/enh1632.h rename to lib_basop/enh1632.h index 10c10866ae65e278c1b159c4be3273bcb76fbdf3..f91494fb137d799d461cca6afa5bbfa5b160ba39 100644 --- a/lib_com/enh1632.h +++ b/lib_basop/enh1632.h @@ -55,6 +55,7 @@ Word16 rotl( Word16 var1, Word16 var2, Word16 *var3 ); Word32 L_rotr( Word32 var1, Word16 var2, Word16 *var3 ); Word32 L_rotl( Word32 var1, Word16 var2, Word16 *var3 ); +Word16 norm_ul( UWord32 UL_var1 ); /***************************************************************************** * diff --git a/lib_com/enh32.c b/lib_basop/enh32.c similarity index 97% rename from lib_com/enh32.c rename to lib_basop/enh32.c index cf40bbec972f96c6858e957dfe8509f9907b4e40..d2931dd5da697b0410a425adf4163018800cd5bf 100644 --- a/lib_com/enh32.c +++ b/lib_basop/enh32.c @@ -71,9 +71,7 @@ Word32 Mpy_32_32( Word32 L_var1, Word32 L_var2 ) { Word32 L_var_out; Word64 L64_var1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; -#endif L64_var1 = ( (Word64) L_var1 * L_var2 ); L64_var1 = W_shl_o( L64_var1, 1, &Overflow ); @@ -105,9 +103,7 @@ Word32 Mpy_32_32_r( Word32 L_var1, Word32 L_var2 ) Word32 Madd_32_16( Word32 L_var3, Word32 L_var1, Word16 var2 ) { Word32 L_var_out; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; -#endif L_var_out = Mpy_32_16_1( L_var1, var2 ); L_var_out = L_add_o( L_var3, L_var_out, &Overflow ); @@ -138,9 +134,7 @@ Word32 Madd_32_16_r( Word32 L_var3, Word32 L_var1, Word16 var2 ) Word32 Msub_32_16( Word32 L_var3, Word32 L_var1, Word16 var2 ) { Word32 L_var_out; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; -#endif L_var_out = Mpy_32_16_1( L_var1, var2 ); L_var_out = L_sub_o( L_var3, L_var_out, &Overflow ); diff --git a/lib_com/enh32.h b/lib_basop/enh32.h similarity index 100% rename from lib_com/enh32.h rename to lib_basop/enh32.h diff --git a/lib_com/enh40.c b/lib_basop/enh40.c similarity index 100% rename from lib_com/enh40.c rename to lib_basop/enh40.c diff --git a/lib_com/enh40.h b/lib_basop/enh40.h similarity index 100% rename from lib_com/enh40.h rename to lib_basop/enh40.h diff --git a/lib_com/enh64.c b/lib_basop/enh64.c similarity index 100% rename from lib_com/enh64.c rename to lib_basop/enh64.c diff --git a/lib_com/enh64.h b/lib_basop/enh64.h similarity index 100% rename from lib_com/enh64.h rename to lib_basop/enh64.h diff --git a/lib_com/enhUL32.c b/lib_basop/enhUL32.c similarity index 100% rename from lib_com/enhUL32.c rename to lib_basop/enhUL32.c diff --git a/lib_com/enhUL32.h b/lib_basop/enhUL32.h similarity index 100% rename from lib_com/enhUL32.h rename to lib_basop/enhUL32.h diff --git a/lib_com/move.h b/lib_basop/move.h similarity index 97% rename from lib_com/move.h rename to lib_basop/move.h index 7762ec79a10ad01297c253311190f95af13d647b..fc4d4e18bdd53a1ba2d006ea049dae81a4c7772a 100644 --- a/lib_com/move.h +++ b/lib_basop/move.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef _MOVE_H diff --git a/lib_com/stl.h b/lib_basop/stl.h similarity index 97% rename from lib_com/stl.h rename to lib_basop/stl.h index 0de974226623ff746492cf57aea4be1210dfbd37..d2f82d6742545fc9ea402943a6f6eac2f4958fd0 100644 --- a/lib_com/stl.h +++ b/lib_basop/stl.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /* =========================================================================== diff --git a/lib_com/typedef.h b/lib_basop/typedef.h similarity index 98% rename from lib_com/typedef.h rename to lib_basop/typedef.h index d3aba3e9895d7beca76dea1cb09c6e073f008e3e..6ff6832e61357970317e47348e32fe2cfe14d62f 100644 --- a/lib_com/typedef.h +++ b/lib_basop/typedef.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /* @@ -134,6 +134,8 @@ typedef float Float32; typedef unsigned short int UNS_Word16; /* 16 bit "register" (sw*) */ +typedef int Counter; + #ifndef TYPEDEF_INITIALIZED #error types in typedef.h not initialized #endif diff --git a/lib_com/typedefs.h b/lib_basop/typedefs.h similarity index 100% rename from lib_com/typedefs.h rename to lib_basop/typedefs.h diff --git a/lib_com/ACcontextMapping_fx.c b/lib_com/ACcontextMapping_fx.c index 3fecfd2af54c3a4a3c56334eb58c5ce59e240872..73382424367a4eff8c4a41ddc1f015166a4803d6 100644 --- a/lib_com/ACcontextMapping_fx.c +++ b/lib_com/ACcontextMapping_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -11,10 +11,10 @@ /* Returns: index of next coefficient */ Word16 get_next_coeff_mapped( - Word16 ii[2], /* i/o: coefficient indexes Q0*/ - Word16 *pp, /* o : peak(1)/hole(0) indicator Q0*/ - Word16 *idx, /* o : index in unmapped domain Q0*/ - CONTEXT_HM_CONFIG *hm_cfg /* i : HM configuration */ + Word16 ii[2], /* i/o: coefficient indexes Q0*/ + Word16 *pp, /* o : peak(1)/hole(0) indicator Q0*/ + Word16 *idx, /* o : index in unmapped domain Q0*/ + CONTEXT_HM_CONFIG *hm_cfg /* i : HM configuration */ ) { Word16 p; @@ -41,10 +41,10 @@ Word16 get_next_coeff_mapped( /* Returns: index of next coefficient */ Word16 get_next_coeff_unmapped( - Word16 ii[2], /* i/o: coefficient indexes Q0*/ - Word16 *pp, /* o : peak(1)/hole(0) indicator Q0*/ - Word16 *idx, /* o : index in unmapped domain Q0*/ - CONTEXT_HM_CONFIG *hm_cfg /* i : HM configuration */ + Word16 ii[2], /* i/o: coefficient indexes Q0*/ + Word16 *pp, /* o : peak(1)/hole(0) indicator Q0*/ + Word16 *idx, /* o : index in unmapped domain Q0*/ + CONTEXT_HM_CONFIG *hm_cfg /* i : HM configuration */ ) { (void) pp; @@ -104,10 +104,10 @@ Word32 update_mixed_context_ivas_fx( /*! r: index of next coefficient */ Word16 get_next_coeff_mapped_ivas_fx( - Word16 ii[2], /* i/o: coefficient indexes Q0*/ - Word32 *pp, /* o : peak(1)/hole(0) indicator Q0*/ - Word16 *idx, /* o : index in unmapped domain Q0*/ - CONTEXT_HM_CONFIG *hm_cfg /* i : HM configuration */ + Word16 ii[2], /* i/o: coefficient indexes Q0*/ + Word32 *pp, /* o : peak(1)/hole(0) indicator Q0*/ + Word16 *idx, /* o : index in unmapped domain Q0*/ + CONTEXT_HM_CONFIG *hm_cfg /* i : HM configuration */ ) { UWord32 p; diff --git a/lib_com/ari_fx.c b/lib_com/ari_fx.c index aef9a6635e32836e7b3a52f505db4cb9c05584a4..70fe3d3d03776de94bcb2afab7c345bf88599439 100644 --- a/lib_com/ari_fx.c +++ b/lib_com/ari_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/ari_hm_fx.c b/lib_com/ari_hm_fx.c index 46f8ecea1e78f01164d1acc083f29d3c26b145b6..87af1a8ebb95c0ef339d7724f96f7cff829d4b42 100644 --- a/lib_com/ari_hm_fx.c +++ b/lib_com/ari_hm_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ diff --git a/lib_com/arith_coder_fx.c b/lib_com/arith_coder_fx.c index 846b4dceab0befaa6257563eda540e785fb7c1d9..173e4faf3583ca941cc5cfe36f852c36f4a9947b 100644 --- a/lib_com/arith_coder_fx.c +++ b/lib_com/arith_coder_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -194,11 +194,6 @@ void tcx_arith_scale_envelope( Word16 statesi, bits; Word32 mean, a, s, L_tmp; Word16 mean_e, tmp, tmp2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - lob_bits = 0; move16(); @@ -223,8 +218,8 @@ void tcx_arith_scale_envelope( tmp = norm_l( env[k] ); tmp2 = sub( 15, tmp ); - tmp = Inv16( round_fx_o( L_shl_o( env[k], tmp, &Overflow ), &Overflow ), &tmp2 ); /* exp(tmp2) */ - ienv[k] = L_shl( L_deposit_h( tmp ), sub( tmp2, 15 ) ); /* Q16 */ + tmp = Inv16( round_fx_sat( L_shl( env[k], tmp ) ), &tmp2 ); /* exp(tmp2) */ + ienv[k] = L_shl( L_deposit_h( tmp ), sub( tmp2, 15 ) ); /* Q16 */ move32(); mean = L_add( mean, ienv[k] ); /* Q16 */ } @@ -256,7 +251,7 @@ void tcx_arith_scale_envelope( b_e = add( b_e, mean_e ); /* scale = (-b + (float)sqrt(b*b - 4.0f*a*0.035f)) / (2.0f * a); */ - tmp = round_fx_o( BASOP_Util_Add_Mant32Exp( L_mult( b, b ), shl( b_e, 1 ), Mpy_32_16_1( a, -4588 /*-4.0f*0.035f Q15*/ ), a_e, &tmp2 ), &Overflow ); + tmp = round_fx_sat( BASOP_Util_Add_Mant32Exp( L_mult( b, b ), shl( b_e, 1 ), Mpy_32_16_1( a, -4588 /*-4.0f*0.035f Q15*/ ), a_e, &tmp2 ) ); IF( tmp <= 0 ) { @@ -271,7 +266,7 @@ void tcx_arith_scale_envelope( tmp2 = BASOP_Util_Add_MantExp( negate( b ), b_e, tmp, tmp2, &scale ); /* exp(scale) */ scale = BASOP_Util_Divide1616_Scale( scale, round_fx( a ), &tmp ); - scale = shl_o( scale, sub( sub( add( tmp, tmp2 ), a_e ), 1 ), &Overflow ); /* Q15 */ + scale = shl_sat( scale, sub( sub( add( tmp, tmp2 ), a_e ), 1 ) ); /* Q15 */ /* iscale = 1.0f / scale; */ iscale_e = 0; @@ -320,7 +315,7 @@ void tcx_arith_scale_envelope( L_tmp = L_add( L_tmp, L_shl( Mpy_32_16_1( env[k], mult_r( 1147 /*0.035f Q15*/, iscale ) ), iscale_e ) ); /* Q16 */ tmp = norm_l( L_tmp ); - statesi = mult_r( statesi, round_fx_o( L_shl_o( L_tmp, tmp, &Overflow ), &Overflow ) ); + statesi = mult_r( statesi, round_fx_sat( L_shl( L_tmp, tmp ) ) ); bits = add( bits, sub( 15, tmp ) ); tmp = norm_s( statesi ); @@ -407,7 +402,7 @@ void tcx_arith_scale_envelope( *s_env_e = sub( add( 15, iscale_e ), tmp ); move16(); BASOP_SATURATE_WARNING_OFF_EVS; - a = L_shl_o( 1265000, sub( 15, *s_env_e ), &Overflow ); + a = L_shl_sat( 1265000, sub( 15, *s_env_e ) ); BASOP_SATURATE_WARNING_ON_EVS; FOR( k = 0; k < L_frame; k++ ) @@ -432,13 +427,13 @@ void tcx_arith_scale_envelope( * and decoder remain synchronized. *-------------------------------------------------------------------------*/ void tcx_arith_render_envelope( - const Word16 A_ind[], /* i: LPC coefficients of signal envelope Q12*/ - const Word16 L_frame, /* i: number of spectral lines Q0*/ + const Word16 A_ind[], /* i: LPC coefficients of signal envelope Q12*/ + const Word16 L_frame, /* i: number of spectral lines Q0*/ const Word16 L_spec, /* Q0 */ - const Word16 preemph_fac, /* i: pre-emphasis factor Q15*/ - const Word16 gamma_w, /* i: A_ind -> weighted envelope factor Q15*/ - const Word16 gamma_uw, /* i: A_ind -> non-weighted envelope factor Q14*/ - Word32 env[] /* o: shaped signal envelope Q16*/ + const Word16 preemph_fac, /* i: pre-emphasis factor Q15*/ + const Word16 gamma_w, /* i: A_ind -> weighted envelope factor Q15*/ + const Word16 gamma_uw, /* i: A_ind -> non-weighted envelope factor Q14*/ + Word32 env[] /* o: shaped signal envelope Q16*/ ) { Word16 k; diff --git a/lib_com/basop_com_lpc.c b/lib_com/basop_com_lpc.c index 5cfb3bed0e55fdee2e46202c92dab4b503f14ad9..589d957071248e229d8a920ca7a4fe8a0889e3be 100644 --- a/lib_com/basop_com_lpc.c +++ b/lib_com/basop_com_lpc.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/basop_lsf_tools.c b/lib_com/basop_lsf_tools.c index 2c49ad4cf4d22a50ff63d8cc6e85330fe54aba98..a982e0f41b3d2b48df2847babbb85a3e951900b6 100644 --- a/lib_com/basop_lsf_tools.c +++ b/lib_com/basop_lsf_tools.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/basop_proto_func.h b/lib_com/basop_proto_func.h index 29db9c9c19e27f3b121780349c4b254cbee18307..549cc7ac01af664f9618151aa9648aa9c46dee62 100644 --- a/lib_com/basop_proto_func.h +++ b/lib_com/basop_proto_func.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef BASOP_PROTO_FUNC_H @@ -43,10 +43,6 @@ #include "basop_util.h" -/* tcx_lpc_cdk.h */ -#define LSF_GAP_VAL( x ) ( Word16 )( (x) *2.0f * 1.28f ) -#define LSFM( x ) FL2WORD16_SCALE( x * 1.28, 15 - 1 ) /* 14Q1*1.28 */ - /* cnst.h */ #define GAMMA1_INV 17809 /* weighting factor (numerator) default:0.92 (1Q14format) */ #define GAMMA16k_INV 17430 /* weighting factor (numerator) default:0.94 (1Q14format) */ diff --git a/lib_com/basop_settings.h b/lib_com/basop_settings.h index 9a344afc4b4ac449e9585a0f8a935a6d829ec5f2..fa809240acb811e2ecf27b5e1439c1607c9d8e27 100644 --- a/lib_com/basop_settings.h +++ b/lib_com/basop_settings.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef __BASOP_SETTINGS_H diff --git a/lib_com/basop_tcx_utils.c b/lib_com/basop_tcx_utils.c index 8038c4f91e44fa3d4f3be746e03c2e3f1a7816ce..5478dd1fef105a2d78d96c80bf5d6acf4e71ef2c 100644 --- a/lib_com/basop_tcx_utils.c +++ b/lib_com/basop_tcx_utils.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/basop_util.c b/lib_com/basop_util.c index b7ee35ab3652df0a2c64aa61715c992dd4f96808..b116ef6c7f94344ea0ccdab496407dcf89ef3672 100644 --- a/lib_com/basop_util.c +++ b/lib_com/basop_util.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -267,10 +267,6 @@ void BASOP_Util_Divide_MantExp( Word16 a_m, /*!< Mantissa of dividend a Word16 preShift, postShift; Word16 m; Word32 m32; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - assert( b_m != 0 ); @@ -303,7 +299,7 @@ void BASOP_Util_Divide_MantExp( Word16 a_m, /*!< Mantissa of dividend a /* normalize result */ postShift = norm_l( m32 ); - m = round_fx_o( L_shl( m32, postShift ), &Overflow ); + m = round_fx_sat( L_shl( m32, postShift ) ); /* exponent */ *ptrResult_e = sub( add( add( a_e, sub( 1, b_e ) ), preShift ), postShift ); @@ -319,8 +315,6 @@ static Word16 Sqrt16_common( Word16 m, Word16 e ) { Word16 index, frac; - Flag Overflow; - assert( ( m >= 0x4000 ) || ( m == 0 ) ); @@ -334,9 +328,7 @@ static Word16 Sqrt16_common( Word16 m, /* interpolate */ if ( m != 0 ) { - BASOP_SATURATE_WARNING_OFF_EVS; - m = mac_ro( SqrtTable[index], SqrtDiffTable[index], frac, &Overflow ); - BASOP_SATURATE_WARNING_ON_EVS; + m = mac_r_sat( SqrtTable[index], SqrtDiffTable[index], frac ); } /* handle odd exponents */ @@ -352,13 +344,10 @@ static Word32 Sqrt32_common( Word32 m, Word16 e ) { Word16 m16, index, frac; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif assert( ( m >= 0x40000000 ) || ( m == 0 ) ); - m16 = round_fx_o( m, &Overflow ); + m16 = round_fx_sat( m ); /* get table index (upper 6 bits minus 32) */ /* index = (m16 >> 9) - 32; */ @@ -414,16 +403,9 @@ static Word32 ISqrt32_common( Word32 m, Word16 e ) { Word16 m16, index, frac; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif assert( m >= 0x40000000 ); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - m16 = round_fx_o( m, &Overflow ); -#else - m16 = round_fx( m ); -#endif + m16 = round_fx_sat( m ); /* get table index (upper 6 bits minus 32) */ /* index = (m16 >> 25) - 32; */ @@ -890,10 +872,6 @@ Word16 divide3232( Word32 L_num, Word32 L_denom ) { Word16 z; Word32 sign; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - sign = L_and( L_xor( L_num, L_denom ), (Word32) 0x80000000 ); @@ -906,13 +884,12 @@ Word16 divide3232( Word32 L_num, Word32 L_denom ) L_denom = L_shl( L_denom, z ); /* round_fx instead of extract_h improves spectral distortion in E_UTIL_lev_dur (schur version). */ - z = div_l( L_num, round_fx_o( L_denom, &Overflow ) ); + z = div_l( L_num, round_fx_sat( L_denom ) ); if ( 0 != sign ) { z = negate( z ); } - return z; } @@ -1010,51 +987,396 @@ Word32 div_w( Word32 L_num, Word32 L_den ) } } -Word32 BASOP_Util_Divide3232_Scale_cadence( Word32 x, Word32 y, Word16 *s ) + +Word32 div_w_newton( Word32 num, Word32 den ); +/* +Table of 256 precalculated estimates to be used by the "div_w_newton" +function using the Newton/Raphson method. +Note: The first table value (for denominator near 0x40000000) is not fully +accurate and should not be used. +*/ +Word32 div_w_newton_lookup[256] = { + /* Precalculated rounded results for 0x40000000 / b with b in [0x40000000 ... 0x7FFFFFFF] */ + 0x7FFFFFFF, // 1.000000000000000 i=0 0.5 / 0.5+0/512 (b=0x40000000) + 0x7F807F80, // 0.996108949416342 i=1 0.5 / 0.5+1/512 (b=0x40400000) + 0x7F01FC07, // 0.992248062015504 i=2 0.5 / 0.5+2/512 (b=0x40800000) + 0x7E8472A8, // 0.988416988416988 i=3 0.5 / 0.5+3/512 (b=0x40C00000) + 0x7E07E07E, // 0.984615384615385 i=4 0.5 / 0.5+4/512 (b=0x41000000) + 0x7D8C42B2, // 0.980842911877395 i=5 0.5 / 0.5+5/512 (b=0x41400000) + 0x7D119679, // 0.977099236641221 i=6 0.5 / 0.5+6/512 (b=0x41800000) + 0x7C97D910, // 0.973384030418251 i=7 0.5 / 0.5+7/512 (b=0x41C00000) + 0x7C1F07C1, // 0.969696969696970 i=8 0.5 / 0.5+8/512 (b=0x42000000) + 0x7BA71FE1, // 0.966037735849057 i=9 0.5 / 0.5+9/512 (b=0x42400000) + 0x7B301ECC, // 0.962406015037594 i=10 0.5 / 0.5+10/512 (b=0x42800000) + 0x7ABA01EA, // 0.958801498127341 i=11 0.5 / 0.5+11/512 (b=0x42C00000) + 0x7A44C6AF, // 0.955223880597015 i=12 0.5 / 0.5+12/512 (b=0x43000000) + 0x79D06A96, // 0.951672862453532 i=13 0.5 / 0.5+13/512 (b=0x43400000) + 0x795CEB24, // 0.948148148148148 i=14 0.5 / 0.5+14/512 (b=0x43800000) + 0x78EA45E7, // 0.944649446494465 i=15 0.5 / 0.5+15/512 (b=0x43C00000) + 0x78787878, // 0.941176470588235 i=16 0.5 / 0.5+16/512 (b=0x44000000) + 0x78078078, // 0.937728937728938 i=17 0.5 / 0.5+17/512 (b=0x44400000) + 0x77975B8F, // 0.934306569343066 i=18 0.5 / 0.5+18/512 (b=0x44800000) + 0x77280772, // 0.930909090909091 i=19 0.5 / 0.5+19/512 (b=0x44C00000) + 0x76B981DA, // 0.927536231884058 i=20 0.5 / 0.5+20/512 (b=0x45000000) + 0x764BC88C, // 0.924187725631769 i=21 0.5 / 0.5+21/512 (b=0x45400000) + 0x75DED952, // 0.920863309352518 i=22 0.5 / 0.5+22/512 (b=0x45800000) + 0x7572B201, // 0.917562724014337 i=23 0.5 / 0.5+23/512 (b=0x45C00000) + 0x75075075, // 0.914285714285714 i=24 0.5 / 0.5+24/512 (b=0x46000000) + 0x749CB28F, // 0.911032028469751 i=25 0.5 / 0.5+25/512 (b=0x46400000) + 0x7432D63D, // 0.907801418439716 i=26 0.5 / 0.5+26/512 (b=0x46800000) + 0x73C9B971, // 0.904593639575972 i=27 0.5 / 0.5+27/512 (b=0x46C00000) + 0x73615A24, // 0.901408450704225 i=28 0.5 / 0.5+28/512 (b=0x47000000) + 0x72F9B658, // 0.898245614035088 i=29 0.5 / 0.5+29/512 (b=0x47400000) + 0x7292CC15, // 0.895104895104895 i=30 0.5 / 0.5+30/512 (b=0x47800000) + 0x722C996B, // 0.891986062717770 i=31 0.5 / 0.5+31/512 (b=0x47C00000) + 0x71C71C71, // 0.888888888888889 i=32 0.5 / 0.5+32/512 (b=0x48000000) + 0x71625344, // 0.885813148788927 i=33 0.5 / 0.5+33/512 (b=0x48400000) + 0x70FE3C07, // 0.882758620689655 i=34 0.5 / 0.5+34/512 (b=0x48800000) + 0x709AD4E4, // 0.879725085910653 i=35 0.5 / 0.5+35/512 (b=0x48C00000) + 0x70381C0E, // 0.876712328767123 i=36 0.5 / 0.5+36/512 (b=0x49000000) + 0x6FD60FBA, // 0.873720136518771 i=37 0.5 / 0.5+37/512 (b=0x49400000) + 0x6F74AE26, // 0.870748299319728 i=38 0.5 / 0.5+38/512 (b=0x49800000) + 0x6F13F596, // 0.867796610169492 i=39 0.5 / 0.5+39/512 (b=0x49C00000) + 0x6EB3E453, // 0.864864864864865 i=40 0.5 / 0.5+40/512 (b=0x4A000000) + 0x6E5478AC, // 0.861952861952862 i=41 0.5 / 0.5+41/512 (b=0x4A400000) + 0x6DF5B0F7, // 0.859060402684564 i=42 0.5 / 0.5+42/512 (b=0x4A800000) + 0x6D978B8E, // 0.856187290969900 i=43 0.5 / 0.5+43/512 (b=0x4AC00000) + 0x6D3A06D3, // 0.853333333333333 i=44 0.5 / 0.5+44/512 (b=0x4B000000) + 0x6CDD212B, // 0.850498338870432 i=45 0.5 / 0.5+45/512 (b=0x4B400000) + 0x6C80D901, // 0.847682119205298 i=46 0.5 / 0.5+46/512 (b=0x4B800000) + 0x6C252CC7, // 0.844884488448845 i=47 0.5 / 0.5+47/512 (b=0x4BC00000) + 0x6BCA1AF2, // 0.842105263157895 i=48 0.5 / 0.5+48/512 (b=0x4C000000) + 0x6B6FA1FE, // 0.839344262295082 i=49 0.5 / 0.5+49/512 (b=0x4C400000) + 0x6B15C06B, // 0.836601307189543 i=50 0.5 / 0.5+50/512 (b=0x4C800000) + 0x6ABC74BE, // 0.833876221498371 i=51 0.5 / 0.5+51/512 (b=0x4CC00000) + 0x6A63BD81, // 0.831168831168831 i=52 0.5 / 0.5+52/512 (b=0x4D000000) + 0x6A0B9944, // 0.828478964401295 i=53 0.5 / 0.5+53/512 (b=0x4D400000) + 0x69B4069B, // 0.825806451612903 i=54 0.5 / 0.5+54/512 (b=0x4D800000) + 0x695D041D, // 0.823151125401929 i=55 0.5 / 0.5+55/512 (b=0x4DC00000) + 0x69069069, // 0.820512820512820 i=56 0.5 / 0.5+56/512 (b=0x4E000000) + 0x68B0AA1F, // 0.817891373801917 i=57 0.5 / 0.5+57/512 (b=0x4E400000) + 0x685B4FE5, // 0.815286624203822 i=58 0.5 / 0.5+58/512 (b=0x4E800000) + 0x68068068, // 0.812698412698413 i=59 0.5 / 0.5+59/512 (b=0x4EC00000) + 0x67B23A54, // 0.810126582278481 i=60 0.5 / 0.5+60/512 (b=0x4F000000) + 0x675E7C5D, // 0.807570977917981 i=61 0.5 / 0.5+61/512 (b=0x4F400000) + 0x670B453B, // 0.805031446540881 i=62 0.5 / 0.5+62/512 (b=0x4F800000) + 0x66B893A9, // 0.802507836990596 i=63 0.5 / 0.5+63/512 (b=0x4FC00000) + 0x66666666, // 0.800000000000000 i=64 0.5 / 0.5+64/512 (b=0x50000000) + 0x6614BC36, // 0.797507788161994 i=65 0.5 / 0.5+65/512 (b=0x50400000) + 0x65C393E0, // 0.795031055900621 i=66 0.5 / 0.5+66/512 (b=0x50800000) + 0x6572EC2F, // 0.792569659442725 i=67 0.5 / 0.5+67/512 (b=0x50C00000) + 0x6522C3F3, // 0.790123456790123 i=68 0.5 / 0.5+68/512 (b=0x51000000) + 0x64D319FE, // 0.787692307692308 i=69 0.5 / 0.5+69/512 (b=0x51400000) + 0x6483ED27, // 0.785276073619632 i=70 0.5 / 0.5+70/512 (b=0x51800000) + 0x64353C48, // 0.782874617737003 i=71 0.5 / 0.5+71/512 (b=0x51C00000) + 0x63E7063E, // 0.780487804878049 i=72 0.5 / 0.5+72/512 (b=0x52000000) + 0x639949EB, // 0.778115501519757 i=73 0.5 / 0.5+73/512 (b=0x52400000) + 0x634C0634, // 0.775757575757576 i=74 0.5 / 0.5+74/512 (b=0x52800000) + 0x62FF3A01, // 0.773413897280967 i=75 0.5 / 0.5+75/512 (b=0x52C00000) + 0x62B2E43D, // 0.771084337349398 i=76 0.5 / 0.5+76/512 (b=0x53000000) + 0x626703D8, // 0.768768768768769 i=77 0.5 / 0.5+77/512 (b=0x53400000) + 0x621B97C2, // 0.766467065868264 i=78 0.5 / 0.5+78/512 (b=0x53800000) + 0x61D09EF3, // 0.764179104477612 i=79 0.5 / 0.5+79/512 (b=0x53C00000) + 0x61861861, // 0.761904761904762 i=80 0.5 / 0.5+80/512 (b=0x54000000) + 0x613C0309, // 0.759643916913947 i=81 0.5 / 0.5+81/512 (b=0x54400000) + 0x60F25DEA, // 0.757396449704142 i=82 0.5 / 0.5+82/512 (b=0x54800000) + 0x60A92806, // 0.755162241887906 i=83 0.5 / 0.5+83/512 (b=0x54C00000) + 0x60606060, // 0.752941176470588 i=84 0.5 / 0.5+84/512 (b=0x55000000) + 0x60180601, // 0.750733137829912 i=85 0.5 / 0.5+85/512 (b=0x55400000) + 0x5FD017F4, // 0.748538011695906 i=86 0.5 / 0.5+86/512 (b=0x55800000) + 0x5F889545, // 0.746355685131195 i=87 0.5 / 0.5+87/512 (b=0x55C00000) + 0x5F417D05, // 0.744186046511628 i=88 0.5 / 0.5+88/512 (b=0x56000000) + 0x5EFACE48, // 0.742028985507246 i=89 0.5 / 0.5+89/512 (b=0x56400000) + 0x5EB48823, // 0.739884393063584 i=90 0.5 / 0.5+90/512 (b=0x56800000) + 0x5E6EA9AE, // 0.737752161383285 i=91 0.5 / 0.5+91/512 (b=0x56C00000) + 0x5E293205, // 0.735632183908046 i=92 0.5 / 0.5+92/512 (b=0x57000000) + 0x5DE42046, // 0.733524355300860 i=93 0.5 / 0.5+93/512 (b=0x57400000) + 0x5D9F7390, // 0.731428571428571 i=94 0.5 / 0.5+94/512 (b=0x57800000) + 0x5D5B2B08, // 0.729344729344729 i=95 0.5 / 0.5+95/512 (b=0x57C00000) + 0x5D1745D1, // 0.727272727272727 i=96 0.5 / 0.5+96/512 (b=0x58000000) + 0x5CD3C315, // 0.725212464589235 i=97 0.5 / 0.5+97/512 (b=0x58400000) + 0x5C90A1FD, // 0.723163841807910 i=98 0.5 / 0.5+98/512 (b=0x58800000) + 0x5C4DE1B6, // 0.721126760563380 i=99 0.5 / 0.5+99/512 (b=0x58C00000) + 0x5C0B8170, // 0.719101123595506 i=100 0.5 / 0.5+100/512 (b=0x59000000) + 0x5BC9805B, // 0.717086834733894 i=101 0.5 / 0.5+101/512 (b=0x59400000) + 0x5B87DDAD, // 0.715083798882682 i=102 0.5 / 0.5+102/512 (b=0x59800000) + 0x5B46989A, // 0.713091922005571 i=103 0.5 / 0.5+103/512 (b=0x59C00000) + 0x5B05B05B, // 0.711111111111111 i=104 0.5 / 0.5+104/512 (b=0x5A000000) + 0x5AC5242A, // 0.709141274238227 i=105 0.5 / 0.5+105/512 (b=0x5A400000) + 0x5A84F345, // 0.707182320441989 i=106 0.5 / 0.5+106/512 (b=0x5A800000) + 0x5A451CEA, // 0.705234159779614 i=107 0.5 / 0.5+107/512 (b=0x5AC00000) + 0x5A05A05A, // 0.703296703296703 i=108 0.5 / 0.5+108/512 (b=0x5B000000) + 0x59C67CD8, // 0.701369863013699 i=109 0.5 / 0.5+109/512 (b=0x5B400000) + 0x5987B1A9, // 0.699453551912568 i=110 0.5 / 0.5+110/512 (b=0x5B800000) + 0x59493E14, // 0.697547683923706 i=111 0.5 / 0.5+111/512 (b=0x5BC00000) + 0x590B2164, // 0.695652173913043 i=112 0.5 / 0.5+112/512 (b=0x5C000000) + 0x58CD5AE2, // 0.693766937669377 i=113 0.5 / 0.5+113/512 (b=0x5C400000) + 0x588FE9DC, // 0.691891891891892 i=114 0.5 / 0.5+114/512 (b=0x5C800000) + 0x5852CDA0, // 0.690026954177898 i=115 0.5 / 0.5+115/512 (b=0x5CC00000) + 0x58160581, // 0.688172043010753 i=116 0.5 / 0.5+116/512 (b=0x5D000000) + 0x57D990D0, // 0.686327077747989 i=117 0.5 / 0.5+117/512 (b=0x5D400000) + 0x579D6EE3, // 0.684491978609626 i=118 0.5 / 0.5+118/512 (b=0x5D800000) + 0x57619F0F, // 0.682666666666667 i=119 0.5 / 0.5+119/512 (b=0x5DC00000) + 0x572620AE, // 0.680851063829787 i=120 0.5 / 0.5+120/512 (b=0x5E000000) + 0x56EAF319, // 0.679045092838196 i=121 0.5 / 0.5+121/512 (b=0x5E400000) + 0x56B015AC, // 0.677248677248677 i=122 0.5 / 0.5+122/512 (b=0x5E800000) + 0x567587C4, // 0.675461741424802 i=123 0.5 / 0.5+123/512 (b=0x5EC00000) + 0x563B48C2, // 0.673684210526316 i=124 0.5 / 0.5+124/512 (b=0x5F000000) + 0x56015805, // 0.671916010498688 i=125 0.5 / 0.5+125/512 (b=0x5F400000) + 0x55C7B4F1, // 0.670157068062827 i=126 0.5 / 0.5+126/512 (b=0x5F800000) + 0x558E5EE9, // 0.668407310704961 i=127 0.5 / 0.5+127/512 (b=0x5FC00000) + 0x55555555, // 0.666666666666667 i=128 0.5 / 0.5+128/512 (b=0x60000000) + 0x551C979A, // 0.664935064935065 i=129 0.5 / 0.5+129/512 (b=0x60400000) + 0x54E42523, // 0.663212435233161 i=130 0.5 / 0.5+130/512 (b=0x60800000) + 0x54ABFD5A, // 0.661498708010336 i=131 0.5 / 0.5+131/512 (b=0x60C00000) + 0x54741FAB, // 0.659793814432990 i=132 0.5 / 0.5+132/512 (b=0x61000000) + 0x543C8B84, // 0.658097686375321 i=133 0.5 / 0.5+133/512 (b=0x61400000) + 0x54054054, // 0.656410256410256 i=134 0.5 / 0.5+134/512 (b=0x61800000) + 0x53CE3D8B, // 0.654731457800512 i=135 0.5 / 0.5+135/512 (b=0x61C00000) + 0x5397829C, // 0.653061224489796 i=136 0.5 / 0.5+136/512 (b=0x62000000) + 0x53610EFB, // 0.651399491094148 i=137 0.5 / 0.5+137/512 (b=0x62400000) + 0x532AE21C, // 0.649746192893401 i=138 0.5 / 0.5+138/512 (b=0x62800000) + 0x52F4FB76, // 0.648101265822785 i=139 0.5 / 0.5+139/512 (b=0x62C00000) + 0x52BF5A81, // 0.646464646464647 i=140 0.5 / 0.5+140/512 (b=0x63000000) + 0x5289FEB5, // 0.644836272040302 i=141 0.5 / 0.5+141/512 (b=0x63400000) + 0x5254E78E, // 0.643216080402010 i=142 0.5 / 0.5+142/512 (b=0x63800000) + 0x52201488, // 0.641604010025063 i=143 0.5 / 0.5+143/512 (b=0x63C00000) + 0x51EB851E, // 0.640000000000000 i=144 0.5 / 0.5+144/512 (b=0x64000000) + 0x51B738D1, // 0.638403990024938 i=145 0.5 / 0.5+145/512 (b=0x64400000) + 0x51832F1F, // 0.636815920398010 i=146 0.5 / 0.5+146/512 (b=0x64800000) + 0x514F678B, // 0.635235732009926 i=147 0.5 / 0.5+147/512 (b=0x64C00000) + 0x511BE195, // 0.633663366336634 i=148 0.5 / 0.5+148/512 (b=0x65000000) + 0x50E89CC2, // 0.632098765432099 i=149 0.5 / 0.5+149/512 (b=0x65400000) + 0x50B59897, // 0.630541871921182 i=150 0.5 / 0.5+150/512 (b=0x65800000) + 0x5082D499, // 0.628992628992629 i=151 0.5 / 0.5+151/512 (b=0x65C00000) + 0x50505050, // 0.627450980392157 i=152 0.5 / 0.5+152/512 (b=0x66000000) + 0x501E0B44, // 0.625916870415648 i=153 0.5 / 0.5+153/512 (b=0x66400000) + 0x4FEC04FE, // 0.624390243902439 i=154 0.5 / 0.5+154/512 (b=0x66800000) + 0x4FBA3D0A, // 0.622871046228710 i=155 0.5 / 0.5+155/512 (b=0x66C00000) + 0x4F88B2F3, // 0.621359223300971 i=156 0.5 / 0.5+156/512 (b=0x67000000) + 0x4F576646, // 0.619854721549637 i=157 0.5 / 0.5+157/512 (b=0x67400000) + 0x4F265691, // 0.618357487922705 i=158 0.5 / 0.5+158/512 (b=0x67800000) + 0x4EF58364, // 0.616867469879518 i=159 0.5 / 0.5+159/512 (b=0x67C00000) + 0x4EC4EC4E, // 0.615384615384615 i=160 0.5 / 0.5+160/512 (b=0x68000000) + 0x4E9490E1, // 0.613908872901679 i=161 0.5 / 0.5+161/512 (b=0x68400000) + 0x4E6470B0, // 0.612440191387560 i=162 0.5 / 0.5+162/512 (b=0x68800000) + 0x4E348B4D, // 0.610978520286396 i=163 0.5 / 0.5+163/512 (b=0x68C00000) + 0x4E04E04E, // 0.609523809523810 i=164 0.5 / 0.5+164/512 (b=0x69000000) + 0x4DD56F47, // 0.608076009501188 i=165 0.5 / 0.5+165/512 (b=0x69400000) + 0x4DA637CF, // 0.606635071090047 i=166 0.5 / 0.5+166/512 (b=0x69800000) + 0x4D77397E, // 0.605200945626478 i=167 0.5 / 0.5+167/512 (b=0x69C00000) + 0x4D4873EC, // 0.603773584905660 i=168 0.5 / 0.5+168/512 (b=0x6A000000) + 0x4D19E6B3, // 0.602352941176471 i=169 0.5 / 0.5+169/512 (b=0x6A400000) + 0x4CEB916D, // 0.600938967136150 i=170 0.5 / 0.5+170/512 (b=0x6A800000) + 0x4CBD73B5, // 0.599531615925059 i=171 0.5 / 0.5+171/512 (b=0x6AC00000) + 0x4C8F8D28, // 0.598130841121495 i=172 0.5 / 0.5+172/512 (b=0x6B000000) + 0x4C61DD63, // 0.596736596736597 i=173 0.5 / 0.5+173/512 (b=0x6B400000) + 0x4C346404, // 0.595348837209302 i=174 0.5 / 0.5+174/512 (b=0x6B800000) + 0x4C0720AB, // 0.593967517401392 i=175 0.5 / 0.5+175/512 (b=0x6BC00000) + 0x4BDA12F6, // 0.592592592592593 i=176 0.5 / 0.5+176/512 (b=0x6C000000) + 0x4BAD3A87, // 0.591224018475751 i=177 0.5 / 0.5+177/512 (b=0x6C400000) + 0x4B809701, // 0.589861751152074 i=178 0.5 / 0.5+178/512 (b=0x6C800000) + 0x4B542804, // 0.588505747126437 i=179 0.5 / 0.5+179/512 (b=0x6CC00000) + 0x4B27ED36, // 0.587155963302752 i=180 0.5 / 0.5+180/512 (b=0x6D000000) + 0x4AFBE639, // 0.585812356979405 i=181 0.5 / 0.5+181/512 (b=0x6D400000) + 0x4AD012B4, // 0.584474885844749 i=182 0.5 / 0.5+182/512 (b=0x6D800000) + 0x4AA4724B, // 0.583143507972665 i=183 0.5 / 0.5+183/512 (b=0x6DC00000) + 0x4A7904A7, // 0.581818181818182 i=184 0.5 / 0.5+184/512 (b=0x6E000000) + 0x4A4DC96E, // 0.580498866213152 i=185 0.5 / 0.5+185/512 (b=0x6E400000) + 0x4A22C04A, // 0.579185520361991 i=186 0.5 / 0.5+186/512 (b=0x6E800000) + 0x49F7E8E2, // 0.577878103837472 i=187 0.5 / 0.5+187/512 (b=0x6EC00000) + 0x49CD42E2, // 0.576576576576577 i=188 0.5 / 0.5+188/512 (b=0x6F000000) + 0x49A2CDF3, // 0.575280898876405 i=189 0.5 / 0.5+189/512 (b=0x6F400000) + 0x497889C2, // 0.573991031390135 i=190 0.5 / 0.5+190/512 (b=0x6F800000) + 0x494E75FA, // 0.572706935123042 i=191 0.5 / 0.5+191/512 (b=0x6FC00000) + 0x49249249, // 0.571428571428571 i=192 0.5 / 0.5+192/512 (b=0x70000000) + 0x48FADE5C, // 0.570155902004454 i=193 0.5 / 0.5+193/512 (b=0x70400000) + 0x48D159E2, // 0.568888888888889 i=194 0.5 / 0.5+194/512 (b=0x70800000) + 0x48A8048A, // 0.567627494456763 i=195 0.5 / 0.5+195/512 (b=0x70C00000) + 0x487EDE04, // 0.566371681415929 i=196 0.5 / 0.5+196/512 (b=0x71000000) + 0x4855E601, // 0.565121412803532 i=197 0.5 / 0.5+197/512 (b=0x71400000) + 0x482D1C31, // 0.563876651982379 i=198 0.5 / 0.5+198/512 (b=0x71800000) + 0x48048048, // 0.562637362637363 i=199 0.5 / 0.5+199/512 (b=0x71C00000) + 0x47DC11F7, // 0.561403508771930 i=200 0.5 / 0.5+200/512 (b=0x72000000) + 0x47B3D0F1, // 0.560175054704595 i=201 0.5 / 0.5+201/512 (b=0x72400000) + 0x478BBCEC, // 0.558951965065502 i=202 0.5 / 0.5+202/512 (b=0x72800000) + 0x4763D59C, // 0.557734204793028 i=203 0.5 / 0.5+203/512 (b=0x72C00000) + 0x473C1AB6, // 0.556521739130435 i=204 0.5 / 0.5+204/512 (b=0x73000000) + 0x47148BF0, // 0.555314533622560 i=205 0.5 / 0.5+205/512 (b=0x73400000) + 0x46ED2901, // 0.554112554112554 i=206 0.5 / 0.5+206/512 (b=0x73800000) + 0x46C5F19F, // 0.552915766738661 i=207 0.5 / 0.5+207/512 (b=0x73C00000) + 0x469EE584, // 0.551724137931034 i=208 0.5 / 0.5+208/512 (b=0x74000000) + 0x46780467, // 0.550537634408602 i=209 0.5 / 0.5+209/512 (b=0x74400000) + 0x46514E02, // 0.549356223175966 i=210 0.5 / 0.5+210/512 (b=0x74800000) + 0x462AC20E, // 0.548179871520343 i=211 0.5 / 0.5+211/512 (b=0x74C00000) + 0x46046046, // 0.547008547008547 i=212 0.5 / 0.5+212/512 (b=0x75000000) + 0x45DE2864, // 0.545842217484009 i=213 0.5 / 0.5+213/512 (b=0x75400000) + 0x45B81A25, // 0.544680851063830 i=214 0.5 / 0.5+214/512 (b=0x75800000) + 0x45923543, // 0.543524416135881 i=215 0.5 / 0.5+215/512 (b=0x75C00000) + 0x456C797D, // 0.542372881355932 i=216 0.5 / 0.5+216/512 (b=0x76000000) + 0x4546E68F, // 0.541226215644820 i=217 0.5 / 0.5+217/512 (b=0x76400000) + 0x45217C38, // 0.540084388185654 i=218 0.5 / 0.5+218/512 (b=0x76800000) + 0x44FC3A34, // 0.538947368421053 i=219 0.5 / 0.5+219/512 (b=0x76C00000) + 0x44D72044, // 0.537815126050420 i=220 0.5 / 0.5+220/512 (b=0x77000000) + 0x44B22E27, // 0.536687631027254 i=221 0.5 / 0.5+221/512 (b=0x77400000) + 0x448D639D, // 0.535564853556485 i=222 0.5 / 0.5+222/512 (b=0x77800000) + 0x4468C066, // 0.534446764091858 i=223 0.5 / 0.5+223/512 (b=0x77C00000) + 0x44444444, // 0.533333333333333 i=224 0.5 / 0.5+224/512 (b=0x78000000) + 0x441FEEF8, // 0.532224532224532 i=225 0.5 / 0.5+225/512 (b=0x78400000) + 0x43FBC043, // 0.531120331950207 i=226 0.5 / 0.5+226/512 (b=0x78800000) + 0x43D7B7EA, // 0.530020703933747 i=227 0.5 / 0.5+227/512 (b=0x78C00000) + 0x43B3D5AF, // 0.528925619834711 i=228 0.5 / 0.5+228/512 (b=0x79000000) + 0x43901956, // 0.527835051546392 i=229 0.5 / 0.5+229/512 (b=0x79400000) + 0x436C82A2, // 0.526748971193416 i=230 0.5 / 0.5+230/512 (b=0x79800000) + 0x43491158, // 0.525667351129363 i=231 0.5 / 0.5+231/512 (b=0x79C00000) + 0x4325C53E, // 0.524590163934426 i=232 0.5 / 0.5+232/512 (b=0x7A000000) + 0x43029E1A, // 0.523517382413088 i=233 0.5 / 0.5+233/512 (b=0x7A400000) + 0x42DF9BB0, // 0.522448979591837 i=234 0.5 / 0.5+234/512 (b=0x7A800000) + 0x42BCBDC8, // 0.521384928716904 i=235 0.5 / 0.5+235/512 (b=0x7AC00000) + 0x429A0429, // 0.520325203252033 i=236 0.5 / 0.5+236/512 (b=0x7B000000) + 0x42776E9A, // 0.519269776876268 i=237 0.5 / 0.5+237/512 (b=0x7B400000) + 0x4254FCE4, // 0.518218623481781 i=238 0.5 / 0.5+238/512 (b=0x7B800000) + 0x4232AECD, // 0.517171717171717 i=239 0.5 / 0.5+239/512 (b=0x7BC00000) + 0x42108421, // 0.516129032258065 i=240 0.5 / 0.5+240/512 (b=0x7C000000) + 0x41EE7CA6, // 0.515090543259557 i=241 0.5 / 0.5+241/512 (b=0x7C400000) + 0x41CC9829, // 0.514056224899598 i=242 0.5 / 0.5+242/512 (b=0x7C800000) + 0x41AAD671, // 0.513026052104208 i=243 0.5 / 0.5+243/512 (b=0x7CC00000) + 0x4189374B, // 0.512000000000000 i=244 0.5 / 0.5+244/512 (b=0x7D000000) + 0x4167BA81, // 0.510978043912176 i=245 0.5 / 0.5+245/512 (b=0x7D400000) + 0x41465FDF, // 0.509960159362550 i=246 0.5 / 0.5+246/512 (b=0x7D800000) + 0x41252730, // 0.508946322067594 i=247 0.5 / 0.5+247/512 (b=0x7DC00000) + 0x41041041, // 0.507936507936508 i=248 0.5 / 0.5+248/512 (b=0x7E000000) + 0x40E31ADE, // 0.506930693069307 i=249 0.5 / 0.5+249/512 (b=0x7E400000) + 0x40C246D4, // 0.505928853754941 i=250 0.5 / 0.5+250/512 (b=0x7E800000) + 0x40A193F1, // 0.504930966469428 i=251 0.5 / 0.5+251/512 (b=0x7EC00000) + 0x40810204, // 0.503937007874016 i=252 0.5 / 0.5+252/512 (b=0x7F000000) + 0x406090D9, // 0.502946954813359 i=253 0.5 / 0.5+253/512 (b=0x7F400000) + 0x40404040, // 0.501960784313725 i=254 0.5 / 0.5+254/512 (b=0x7F800000) + 0x40201008 // 0.500978473581213 i=255 0.5 / 0.5+255/512 (b=0x7FC00000) +}; + + +/* + * Fractional multiplication of signed a and b, both in Q31. The result is doubled. + * Note: in this test, saturation is not needed. + * BASOP weights: 3 + */ + +static Word32 L_dmult( Word32 L_var1, Word32 L_var2 ) +{ + Word64 L64_var1 = W_mult0_32_32( L_var1, L_var2 ); + L64_var1 = W_shr( L64_var1, 30 ); + return W_extract_l( L64_var1 ); +} + +/* + * 32 by 32 bit division, following the Newton / Raphson method. + * Usage of this low-level procedure by the caller: + * 1. Numerator can use the full range of signed 32-bit datatypes: 0x80000000...0x7FFFFFFF + * Note: Since is not normalized here, but it is multplied to the reciprocal of the + * denominator, the caller should use a normalized and handle any exponent outside. + * 2. Denominator must be normalized into range 0x40000001 to 0x7FFFFFFF (all positive) + * Note: In case of den=0x40000000, the caller is not allowed to call the division routine, + since the result is known. + * Note: num / 0x40000000 equals to num with exp += 1. + * 3. The result is in range 0x40000000 to 0x7FFFFFFF, finally multiplied by . + * BASOP weights: 24 (incl. L_dmult) + */ + +Word32 div_w_newton( Word32 num, Word32 den ) +{ + Word32 x0, x1, x2, x3, diff, result; + + x0 = div_w_newton_lookup[sub( extract_l( L_shr( den, 22 ) ), 256 )]; + move32(); + + diff = L_sub( 0x40000000, Mpy_32_32( den, x0 ) ); + + x1 = L_add( x0, L_dmult( x0, diff ) ); + diff = L_sub( 0x40000000, Mpy_32_32( den, x1 ) ); + + x2 = L_add( x1, L_dmult( x1, diff ) ); + diff = L_sub( 0x40000000, Mpy_32_32( den, x2 ) ); + + x3 = L_add( x2, L_dmult( x2, diff ) ); + + result = Mpy_32_32( num, x3 ); + + return result; +} + +/* + * 32 / 32 division + * Usage of this global procedure by the caller: + * 1. Numerator can use the full range of signed 32-bit datatypes: 0x80000000...0x7FFFFFFF + * Note: Since is not normalized here, but it is multplied to the reciprocal of the + * denominator, the caller should use a normalized and handle any exponent outside. + * 2. Denominator can use the full range of signed 32-bit datatypes: 0x80000000...0x7FFFFFFF + * except den=0x00000000. In case of 0x80000000, it becomes internally negated to 0x7FFFFFFF. + * 3. The result is 0x00000000 (*s=0)for equals 0x00000000. + * The result is rather left aligned, with up to 1 bit headroom. + * 4. The result exponent is stored in s[0] + * BASOP weights: 41 (incl. div_w_newton) + */ + +Word32 BASOP_Util_Divide3232_Scale_newton( Word32 x, Word32 y, Word16 *s ) { Word32 z; Word16 sx; Word16 sy; Word32 sign; - /* assert (x >= (Word32)0); */ assert( y != (Word32) 0 ); - sign = 0; - move16(); - - IF( x < 0 ) + /* Early exit, if numerator is zero */ + IF( x == (Word32) 0 ) { - x = L_negate( x ); - sign = L_xor( sign, 1 ); + *s = 0; + return ( (Word32) 0 ); } - - IF( y < 0 ) + IF( EQ_32( y, (Word32) 0x80000000 ) ) { - y = L_negate( y ); - sign = L_xor( sign, 1 ); + /* Division by -1.0: same as negation of numerator */ + /* Return normalized negated numerator */ + sx = norm_l( x ); + x = L_shl( x, sx ); + *s = negate( sx ); + return L_negate( x ); } - - IF( x == (Word32) 0 ) + sign = y; + move32(); + if ( y < 0 ) { - *s = 0; - return ( (Word32) 0 ); + y = L_negate( y ); } + /* Normalize numerator */ sx = norm_l( x ); x = L_shl( x, sx ); - x = L_shr( x, 1 ); - move16(); - *s = sub( 1, sx ); + /* Normalize denominator */ sy = norm_l( y ); y = L_shl( y, sy ); + + /* Store exponent: + 1 for div_w_newton computing 0.5*num/den */ + *s = sub( add( sy, 1 ), sx ); move16(); - *s = add( *s, sy ); - z = div_w( x, y ); + /* Special treatment for den=0x40000000 */ + /* Result is known: z=2*num */ + IF( EQ_32( y, 0x40000000 ) ) + { + if ( sign < 0 ) + { + x = L_negate( x ); + } + return x; + } - if ( sign != 0 ) + /* Invoke division applying Newton/Raphson-Algorithm */ + z = div_w_newton( x, y ); + + if ( sign < 0 ) { z = L_negate( z ); } @@ -1516,6 +1838,26 @@ Word16 findIndexOfMinWord32( Word32 *x, const Word16 len ) return indx; } +Word16 findIndexOfMinWord64( Word64 *x, const Word16 len ) +{ + Word16 i, indx; + + + indx = 0; + move16(); + FOR( i = 1; i < len; i++ ) + { + if ( LT_64( x[i], x[indx] ) ) + { + indx = i; + move16(); + } + } + + + return indx; +} + Word16 imult1616( Word16 x, Word16 y ) { @@ -1625,77 +1967,6 @@ Word16 idiv1616_1( Word16 x, Word16 y ) } } -Word32 norm_llQ31( /* o : normalized result Q31 */ - Word32 L_c, /* i : upper bits of accu Q-1 */ - Word32 L_sum, /* i : lower bits of accu, unsigned Q31 */ - Word16 *exp /* o : exponent of result in [-32,31] Q0 */ -) -{ - Word16 i; - Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; -#endif /* BASOP_NOGLOB */ - - /* Move MSBit of L_sum into L_c */ - Carry = 0; - L_tmp = L_add_co( L_sum, L_sum, &Carry, &Overflow ); /* L_tmp = L_sum << 1 */ - L_c = L_add_co( L_c, L_c, &Carry, &Overflow ); - L_add( 0, 0 ); - test(); - IF( ( L_c != (Word32) 0L ) && ( L_c != (Word32) 0xFFFFFFFFL ) ) - { - i = norm_l( L_c ); - L_c = L_shl( L_c, i ); - i = sub( 31, i ); /* positive exponent */ - L_sum = L_lshr( L_tmp, 1 ); /* L_sum with MSBit=0 */ - L_sum = L_lshr( L_sum, i ); - L_sum = L_add( L_c, L_sum ); - } - ELSE - { - i = -32; - move16(); /* default exponent, if total sum=0 */ - IF( L_sum ) - { - i = norm_l( L_sum ); - L_sum = L_shl( L_sum, i ); - i = negate( i ); /* negative or zero exponent */ - } - } - *exp = i; - move16(); - return L_sum; -} - -Word32 w_norm_llQ31( Word64 L_sum, Word16 *exp ); -Word32 w_norm_llQ31( /* o : normalized result Q31 */ - Word64 L_sum, /* i : upper and lower bits of accu, unsigned Q31 */ - Word16 *exp /* o : exponent of result in [-32,31] Q0 */ -) -{ - Word32 L_tmp; - Word16 exp_val; - Word64 L64_inp64 = L_sum; - move64(); - - L64_inp64 = W_shl( L64_inp64, 1 ); - exp_val = W_norm( L64_inp64 ); - L64_inp64 = W_shl( L64_inp64, exp_val ); - exp_val = sub( 31, exp_val ); - if ( EQ_64( L_sum, 0 ) ) - { - exp_val = -32; - move16(); - } - *exp = exp_val; - move16(); - - L_tmp = W_extract_h( L64_inp64 ); - return L_tmp; -} - Word32 Dot_product16HQ( /* o : normalized result Q31 */ const Word32 L_off, /* i : initial sum value Qn */ const Word16 x[], /* i : x vector Qn */ @@ -1719,6 +1990,24 @@ Word32 Dot_product16HQ( /* o : normalized result return L_sum; } +Word32 sum_array_norm( /* o : normalized result Q31 */ + const Word32 x[], /* i : x vector Qn */ + const Word16 lg, /* i : vector length, range [0..7FFF] Q0 */ + Word16 *exp /* o : exponent of result in [-32,31] Q0 */ +) +{ + Word16 i; + Word64 W_tmp = 0; + Word32 L_tmp; + FOR( i = 0; i < lg; i++ ) + { + W_tmp = W_add( W_tmp, x[i] ); /*Q31*/ + } + L_tmp = w_norm_llQ31( W_tmp, exp ); /*Q31 - *exp*/ + return L_tmp; +} + + Word32 Norm32Norm( const Word32 *x, const Word16 headroom, const Word16 length, Word16 *result_e ) { Word32 L_tmp, L_tmp2; @@ -2223,7 +2512,6 @@ Word16 BASOP_Util_Cmp_Mant32Exp /*!< o: flag: result of comparison */ headroom is introduced into acc */ - Word32 BASOP_Util_Add_Mant32Exp /* o : normalized result mantissa */ ( Word32 a_m, /* i : Mantissa of 1st operand a */ Word16 a_e, /* i : Exponent of 1st operand a */ @@ -2231,10 +2519,8 @@ Word32 BASOP_Util_Add_Mant32Exp /* o : normalized result mantissa */ Word16 b_e, /* i : Exponent of 2nd operand b */ Word16 *ptr_e ) /* o : exponent of result */ { - Word32 L_tmp; Word16 shift; - - /* Compare exponents: the difference is limited to +/- 30 + /* Compare exponents: the difference is limited to +/- 31 The Word32 mantissa of the operand with lower exponent is shifted right by the exponent difference. Then, the unshifted mantissa of the operand with the higher exponent is added. The addition result is normalized and the result represents the mantissa to return. The returned exponent takes into @@ -2242,39 +2528,54 @@ Word32 BASOP_Util_Add_Mant32Exp /* o : normalized result mantissa */ */ if ( !a_m ) - a_e = add( b_e, 0 ); + { + a_e = b_e; + move16(); + } if ( !b_m ) - b_e = add( a_e, 0 ); + { + b_e = a_e; + move16(); + } shift = sub( a_e, b_e ); - shift = s_max( -31, shift ); - shift = s_min( 31, shift ); + + if ( shift > 0 ) + shift = s_min( shift, 31 ); if ( shift < 0 ) - { - /* exponent of b is greater than exponent of a, shr a_m */ - a_m = L_shl( a_m, shift ); - } + shift = s_max( shift, -31 ); + + /* shift > 0 exponent of a is greater than exponent of b */ if ( shift > 0 ) - { - /* exponent of a is greater than exponent of b */ b_m = L_shr( b_m, shift ); - } - a_e = add( s_max( a_e, b_e ), 1 ); - L_tmp = L_add( L_shr( a_m, 1 ), L_shr( b_m, 1 ) ); - shift = norm_l( L_tmp ); + /* shift < 0 exponent of b is greater than exponent of a */ + if ( shift < 0 ) + a_m = L_shl( a_m, shift ); + + a_m = L_add( L_shr( a_m, 1 ), L_shr( b_m, 1 ) ); + + if ( shift >= 0 ) + a_e = add( a_e, 1 ); + if ( shift < 0 ) + a_e = add( b_e, 1 ); + + shift = norm_l( a_m ); if ( shift ) - L_tmp = L_shl( L_tmp, shift ); - if ( L_tmp == 0 ) - a_e = add( 0, 0 ); - if ( L_tmp != 0 ) + a_m = L_shl( a_m, shift ); + if ( !a_m ) + { + a_e = 0; + move16(); + } + if ( a_m ) a_e = sub( a_e, shift ); + *ptr_e = a_e; - return ( L_tmp ); + return ( a_m ); } - static const Word16 shift_lc[] = { 9, 10 }; Word32 Isqrt_lc1( diff --git a/lib_com/basop_util.h b/lib_com/basop_util.h index a6db7dc8d62ced0c28ff5010bf7ef9513eb04c5e..1df2c8010ef4d09756693ec42b69189f688c7c0f 100644 --- a/lib_com/basop_util.h +++ b/lib_com/basop_util.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef __BASOP_UTIL_H__ @@ -328,9 +328,10 @@ Word16 BASOP_Util_Divide3232_Scale( Word32 x, /*!< i : Numerator*/ Word32 y, /*!< i : Denominator*/ Word16 *s ); /*!< o : Additional scalefactor difference*/ -Word32 BASOP_Util_Divide3232_Scale_cadence( Word32 x, /*!< i : Numerator*/ - Word32 y, /*!< i : Denominator*/ - Word16 *s ); /*!< o : Additional scalefactor difference*/ + +Word32 BASOP_Util_Divide3232_Scale_newton( Word32 x, /*!< i : Numerator*/ + Word32 y, /*!< i : Denominator*/ + Word16 *s ); /*!< o : Additional scalefactor difference*/ /************************************************************************/ @@ -427,7 +428,7 @@ Word16 BASOP_util_norm_s_bands2shift( Word16 x ); /***********************************************************************/ /*! - \brief Calculate the headroom of the complex data in a 2 dimensional array + \brief Calculate the headroom of the complex data in a 2 dimensional array \return number of headroom bits */ @@ -531,6 +532,7 @@ Word16 findIndexOfMinWord16( Word16 *x, const Word16 len ); \return index of min Word32 */ Word16 findIndexOfMinWord32( Word32 *x, const Word16 len ); +Word16 findIndexOfMinWord64( Word64 *x, const Word16 len ); /****************************************************************************/ /*! @@ -606,6 +608,20 @@ Word32 Dot_product16HQ( /* @@ -23,10 +23,6 @@ void bitalloc_fx( Word16 diff, temp; Word16 fac; Word16 ii; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif Word16 SFM_thr = SFM_G1G2; move16(); @@ -54,7 +50,7 @@ void bitalloc_fx( move16(); FOR( m = 1; m < im; m++ ) { - v = sub_o( temp, y[m], &Overflow ); /* Q0 */ + v = sub_sat( temp, y[m] ); /* Q0 */ temp = s_max( temp, y[m] ); if ( v < 0 ) { @@ -224,13 +220,12 @@ void bitalloc_fx( *-------------------------------------------------------------------*/ Word16 BitAllocF_fx( - Word16 *y, /* i : norm of sub-vectors :Q0 */ - Word32 bit_rate, /* i : bitrate :Q0 */ - Word16 B, /* i : number of available bits :Q0 */ - Word16 N, /* i : number of sub-vectors :Q0 */ - Word16 *R, /* o : bit-allocation indicator :Q0 */ - Word16 *Rsubband_fx /* o : sub-band bit-allocation vector :Q3 */ - , + Word16 *y, /* i : norm of sub-vectors :Q0 */ + Word32 bit_rate, /* i : bitrate :Q0 */ + Word16 B, /* i : number of available bits :Q0 */ + Word16 N, /* i : number of sub-vectors :Q0 */ + Word16 *R, /* o : bit-allocation indicator :Q0 */ + Word16 *Rsubband_fx, /* o : sub-band bit-allocation vector :Q3 */ const Word16 hqswb_clas, /* i : hq swb class :Q0 */ const Word16 num_env_bands /* i : Number sub bands to be encoded for HF GNERIC :Q0 */ ) @@ -245,10 +240,6 @@ Word16 BitAllocF_fx( Word16 tmp, exp1, exp2; Word32 Rsubband_w32_fx[NB_SFM]; /* Q15 */ Word16 B_w16_fx; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif set32_fx( Rsubband_w32_fx, 0, NB_SFM ); @@ -442,7 +433,7 @@ Word16 BitAllocF_fx( exp1 = sub( norm_l( L_tmp2 ), 1 ); exp2 = norm_s( n ); tmp = div_s( extract_h( L_shl( L_tmp2, exp1 ) ), shl( n, exp2 ) ); /*15 + 15 + exp1 - 16 - exp2*/ - m_fx = shl_o( tmp, sub( exp2, exp1 ), &Overflow ); /*Q14*/ + m_fx = shl_sat( tmp, sub( exp2, exp1 ) ); /*Q14*/ if ( L_tmp1 < 0 ) { m_fx = negate( m_fx ); diff --git a/lib_com/bitallocsum_fx.c b/lib_com/bitallocsum_fx.c index fa71c92f88fc5ed4ba28841385395be2a1b3e37f..d052b81875e95c665b9a6beda28420995760f882 100644 --- a/lib_com/bitallocsum_fx.c +++ b/lib_com/bitallocsum_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ diff --git a/lib_com/bits_alloc_fx.c b/lib_com/bits_alloc_fx.c index 88b276126a66e4b3aa9064e073b9cd8295264f27..1045f7495bdbdea4cbeadd08d22fbbb6ba72b6f4 100644 --- a/lib_com/bits_alloc_fx.c +++ b/lib_com/bits_alloc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include @@ -420,7 +420,6 @@ static Word16 fcb_table( const Word16 L_subfr ) { Word16 out; - // PMT("Not floating point computation, but fixed point operator are still missing ") out = PulseConfTable[n].bits; move16(); @@ -434,12 +433,12 @@ static Word16 fcb_table( } /*-------------------------------------------------------------------* - * acelp_FCB_allocator() + * acelp_FCB_allocator_fx() * * Routine to allocate fixed innovation codebook bit-budget *--------------------------------------------------------------------*/ -static ivas_error acelp_FCB_allocator( +static ivas_error acelp_FCB_allocator_fx( Word16 *nBits, /* i/o: available bit-budget */ Word16 fixed_cdk_index[], /* o : codebook index Q0 */ Word16 nb_subfr, /* i : number of subframes */ @@ -454,168 +453,6 @@ static ivas_error acelp_FCB_allocator( Word16 *p_fixed_cdk_index; Word16 max_n; ivas_error error; - // PMT("Not floating point computation, but fixed point operator are still missing ") - - error = IVAS_ERR_OK; - move32(); - - cdbk = coder_type; /* just to avoid warning when DEBUGGING is deactivated */ - move16(); - - p_fixed_cdk_index = fixed_cdk_index; - - /* TRANSITION coding: first subframe bit-budget was already fixed, glottal pulse not in the first subframe */ - test(); - IF( GE_16( tc_subfr, L_SUBFR ) && fix_first ) - { - Word16 i; - - FOR( i = 0; i < nb_subfr; i++ ) - { - *nBits = sub( *nBits, ACELP_FIXED_CDK_BITS( fixed_cdk_index[i] ) ); - move16(); - } - return error; - } - - /* TRANSITION coding: first subframe bit-budget was already fixed, glottal pulse in the first subframe */ - sfr = 0; - move16(); - IF( fix_first ) - { - *nBits = sub( *nBits, ACELP_FIXED_CDK_BITS( fixed_cdk_index[0] ) ); - move16(); - sfr = 1; - move16(); - p_fixed_cdk_index++; - nb_subfr = 3; - move16(); - } - - /* distribute the bit-budget equally between subframes */ - IF( GT_16( L_subfr, L_SUBFR ) ) /* access fast_FCB_bits_2sfr */ - { - max_n = 6; - move16(); - } - ELSE - { - max_n = ACELP_FIXED_CDK_NB; - move16(); - } - FOR( cdbk = 0; cdbk < max_n; cdbk++ ) - { - IF( GT_32( L_mult0( fcb_table( cdbk, L_subfr ), nb_subfr ), L_deposit_l( *nBits ) ) ) - { - BREAK; - } - } - cdbk = sub( cdbk, 1 ); - -#ifdef DEBUGGING - if ( cdbk < 0 && coder_type != TRANSITION ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too low bit-budget for fixed innovation codebook (frame = %d). Exiting! \n" ); - } - if ( ( L_subfr == L_SUBFR && cdbk >= ACELP_FIXED_CDK_NB ) || ( L_subfr == 2 * L_SUBFR && fcb_table( cdbk, L_subfr ) == 128 /*stop value*/ ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too high bit-budget for fixed innovation codebook (frame = %d). Exiting! \n" ); - } -#endif - - set16_fx( p_fixed_cdk_index, cdbk, nb_subfr ); - nBits_tmp = 0; - move16(); - IF( cdbk >= 0 ) - { - nBits_tmp = fcb_table( cdbk, L_subfr ); - } - ELSE - { - nBits_tmp = 0; - move16(); - } - *nBits = sub( *nBits, i_mult( nBits_tmp, nb_subfr ) ); - move16(); - - /* try to increase the FCB bit-budget of the first subframe(s) */ - IF( LT_16( cdbk, ACELP_FIXED_CDK_NB - 1 ) ) - { - step = sub( fcb_table( add( cdbk, 1 ), L_subfr ), nBits_tmp ); - WHILE( *nBits >= step ) - { - ( *p_fixed_cdk_index )++; - *nBits = sub( *nBits, step ); - move16(); - p_fixed_cdk_index++; - } - - /* try to increase the FCB of the first subframe in cases when the next step is lower than the current step */ - step = sub( fcb_table( add( fixed_cdk_index[sfr], 1 ), L_subfr ), fcb_table( fixed_cdk_index[sfr], L_subfr ) ); - test(); - IF( GE_16( *nBits, step ) && cdbk >= 0 ) - { - fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); - move16(); - *nBits = sub( *nBits, step ); - move16(); - test(); - IF( GE_16( *nBits, step ) && EQ_16( fixed_cdk_index[sfr + 1], sub( fixed_cdk_index[sfr], 1 ) ) ) - { - sfr = add( sfr, 1 ); - fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); - move16(); - *nBits = sub( *nBits, step ); - move16(); - } - } - } - /* TRANSITION coding: allocate highest FCBQ bit-budget to the subframe with the glottal-shape codebook */ - IF( GE_16( tc_subfr, L_SUBFR ) ) - { - Word16 tempr; - - SWAP( fixed_cdk_index[0], fixed_cdk_index[tc_subfr / L_SUBFR] ); - - /* TRANSITION coding: allocate second highest FCBQ bit-budget to the last subframe */ - IF( idiv1616( tc_subfr, L_SUBFR ) < sub( nb_subfr, 1 ) ) - { - SWAP( fixed_cdk_index[( tc_subfr - L_SUBFR ) / L_SUBFR], fixed_cdk_index[nb_subfr - 1] ); - } - } - - /* when subframe length > L_SUBFR, number of bits instead of codebook index is signalled */ - IF( GT_16( L_subfr, L_SUBFR ) ) - { - Word16 i, j; - FOR( i = 0; i < nb_subfr; i++ ) - { - j = fixed_cdk_index[i]; - move16(); - fixed_cdk_index[i] = fast_FCB_bits_2sfr[j]; - move16(); - } - } - - return error; -} - -static ivas_error acelp_FCB_allocator_ivas( - Word16 *nBits, /* i/o: available bit-budget */ - Word16 fixed_cdk_index[], /* o : codebook index Q0 */ - Word16 nb_subfr, /* i : number of subframes */ - const Word16 L_subfr, /* i : subframe length */ - const Word16 coder_type, /* i : coder type */ - const Word16 tc_subfr, /* i : TC subframe index */ - const Word16 fix_first /* i : flag to indicate whether the first subframe bit-budget was fixed */ -) -{ - Word16 cdbk, sfr, step; - Word16 nBits_tmp; - Word16 *p_fixed_cdk_index; - Word16 max_n; - ivas_error error; - // PMT("Not floating point computation, but fixed point operator are still missing ") error = IVAS_ERR_OK; move32(); @@ -678,1274 +515,115 @@ static ivas_error acelp_FCB_allocator_ivas( move16(); IF( cdbk >= 0 ) { - nBits_tmp = fcb_table( cdbk, L_subfr ); - } - ELSE - { - nBits_tmp = 0; - move16(); - } - *nBits = sub( *nBits, i_mult( nBits_tmp, nb_subfr ) ); - move16(); - - /* try to increase the FCB bit-budget of the first subframe(s) */ - IF( LT_16( cdbk, ACELP_FIXED_CDK_NB - 1 ) ) - { - step = sub( fcb_table( add( cdbk, 1 ), L_subfr ), nBits_tmp ); - WHILE( *nBits >= step ) - { - ( *p_fixed_cdk_index )++; - *nBits = sub( *nBits, step ); - move16(); - p_fixed_cdk_index++; - } - - /* try to increase the FCB of the first subframe in cases when the next step is lower than the current step */ - IF( LT_16( fixed_cdk_index[sfr], ACELP_FIXED_CDK_NB - 1 ) ) - { - step = sub( fcb_table( add( fixed_cdk_index[sfr], 1 ), L_subfr ), fcb_table( fixed_cdk_index[sfr], L_subfr ) ); - test(); - IF( GE_16( *nBits, step ) && cdbk >= 0 ) - { - fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); - move16(); - *nBits = sub( *nBits, step ); - move16(); - test(); - IF( GE_16( *nBits, step ) && EQ_16( fixed_cdk_index[sfr + 1], sub( fixed_cdk_index[sfr], 1 ) ) ) - { - sfr = add( sfr, 1 ); - fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); - move16(); - *nBits = sub( *nBits, step ); - move16(); - } - } - } - } - /* TRANSITION coding: allocate highest FCBQ bit-budget to the subframe with the glottal-shape codebook */ - IF( GE_16( tc_subfr, L_SUBFR ) ) - { - Word16 tempr; - - SWAP( fixed_cdk_index[0], fixed_cdk_index[tc_subfr / L_SUBFR] ); - - /* TRANSITION coding: allocate second highest FCBQ bit-budget to the last subframe */ - IF( LT_16( idiv1616( tc_subfr, L_SUBFR ), sub( nb_subfr, 1 ) ) ) - { - SWAP( fixed_cdk_index[sub( tc_subfr, L_SUBFR ) / L_SUBFR], fixed_cdk_index[nb_subfr - 1] ); - } - } - - /* when subframe length > L_SUBFR, number of bits instead of codebook index is signalled */ - IF( GT_16( L_subfr, L_SUBFR ) ) - { - Word16 i, j; - FOR( i = 0; i < nb_subfr; i++ ) - { - j = fixed_cdk_index[i]; - move16(); - fixed_cdk_index[i] = fast_FCB_bits_2sfr[j]; - move16(); - } - } - - return error; -} - -/*-------------------------------------------------------------------* - * config_acelp1() - * - * Configure ACELP bit allocation - * - should be in range of <6700; 24350> for ACELP@12.8kHz - * - per channel bitrate minimum is 13250 kbps for ACELP@16kHz - *--------------------------------------------------------------------*/ - -ivas_error config_acelp1( - const Word16 enc_dec, /* i : encoder/decoder flag */ - const Word32 total_brate, /* i : total bitrate */ - const Word32 core_brate_inp, /* i : core bitrate */ - const Word16 core, /* i : core */ - const Word16 extl, /* i : extension layer */ - const Word32 extl_brate, /* i : extension layer bitrate */ - const Word16 L_frame, /* i : frame length at internal Fs */ - const Word16 GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ - ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ - const Word16 signalling_bits, /* i : number of signalling bits */ - const Word16 coder_type, /* i : coder type */ -#ifdef NONBE_FIX_GSC_BSTR - const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ -#endif - const Word16 tc_subfr, /* i : TC subfr ID */ - const Word16 tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ - Word16 *nBits_es_Pred, /* o : number of bits for Es_pred Q */ - Word16 *unbits, /* o : number of unused bits */ - const Word16 element_mode, /* i : element mode */ - Word16 *uc_two_stage_flag, /* o : flag undicating two-stage UC */ - const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ - const Word16 idchan, /* i : stereo channel ID */ - const Word16 active_cnt, /* i : Active frame counter */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/ - const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ -) -{ - Word16 i, bits, nb_subfr; - Word16 flag_hardcoded, coder_type_sw, fix_first; - Word32 core_brate; -#ifdef DEBUGGING -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING - (void) active_cnt; -#endif -#endif - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - // PMT("Not floating point computation, but fixed point operator are still missing ") - /*-----------------------------------------------------------------* - * Set the flag indicating two-stage Unvoiced (UC) frame - *-----------------------------------------------------------------*/ - - *uc_two_stage_flag = 0; - move16(); - IF( EQ_16( coder_type, UNVOICED ) ) - { - test(); - test(); - test(); - test(); - test(); - if ( GE_32( total_brate, MIN_UNVOICED_TWO_STAGE_BRATE ) && element_mode > EVS_MONO && ( idchan == 0 || ( ( GE_32( total_brate, 8500 ) || extl_brate == 0 ) && EQ_16( tdm_LRTD_flag, 1 ) ) ) ) - { - *uc_two_stage_flag = 1; - move16(); - } - } - - /*-----------------------------------------------------------------* - * Set the number of subframes - *-----------------------------------------------------------------*/ - - IF( EQ_16( L_frame, L_FRAME ) ) - { - nb_subfr = NB_SUBFR; - move16(); - -#ifdef DEBUGGING - if ( ( ( core_brate_inp < 5900 && coder_type > UNVOICED ) && !( core_brate_inp < MIN_TC_BRATE && coder_type == TRANSITION ) ) && !( idchan > 0 && element_mode == IVAS_CPE_TD ) && !( element_mode == IVAS_SCE && tdm_low_rate_mode ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too low bitrate (%d bps) for ACELP@12k8 in frame %d. Exiting!\n", core_brate_inp ); - } - - if ( core_brate_inp > ACELP_12k8_HIGH_LIMIT && core == ACELP_CORE ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too high bitrate (%d bps) for ACELP@12k8 in frame %d. Exiting!\n", core_brate_inp ); - } -#endif - } - ELSE /* L_frame == L_FRAME16k */ - { - nb_subfr = NB_SUBFR16k; - move16(); - -#ifdef DEBUGGING - if ( core_brate_inp < ACELP_16k_LOW_LIMIT && core == ACELP_CORE ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too low bitrate (%d bps) for ACELP@16k in frame %d. Exiting!\n", core_brate_inp ); - } -#endif - } - - coder_type_sw = coder_type; - move16(); - IF( core != ACELP_CORE ) - { - /* used in acelp_core_switch_enc() */ - nb_subfr = 1; - move16(); - if ( EQ_16( L_frame, L_FRAME ) ) - { - coder_type_sw = TRANSITION; - move16(); - } - } - - /*-----------------------------------------------------------------* - * Check if the core_brate is hard coded (to keep BE for mono core) or not - *-----------------------------------------------------------------*/ - - flag_hardcoded = 0; - move16(); - i = 0; - move16(); - - WHILE( i < SIZE_BRATE_INTERMED_TBL ) - { - IF( EQ_32( core_brate_inp, brate_intermed_tbl[i] ) ) - { - flag_hardcoded = 1; - move16(); - BREAK; - } - - IF( LT_32( core_brate_inp, brate_intermed_tbl[i] ) ) - { - flag_hardcoded = 0; - move16(); - BREAK; - } - - i = add( i, 1 ); - } - - test(); - test(); - test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( coder_type, AUDIO ) && - LE_32( core_brate_inp, STEREO_GSC_BIT_RATE_ALLOC ) && EQ_32( brate_intermed_tbl[i], ACELP_9k60 ) ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ - { - i = sub( i, 1 ); - } - - core_brate = brate_intermed_tbl[i]; - move32(); - - if ( element_mode > EVS_MONO ) - { - flag_hardcoded = 0; /* use automatic and flexible ACELP bit-budget allocation */ - move16(); - } - - test(); - if ( ( core != ACELP_CORE ) && ( element_mode == EVS_MONO ) ) /* needed for mode1 core switching in EVS mono */ - { - flag_hardcoded = 1; - move16(); - } - - /*-----------------------------------------------------------------* - * ACELP bit allocation - *-----------------------------------------------------------------*/ - test(); - test(); - IF( !( EQ_16( coder_type, TRANSITION ) && NE_16( tc_subfr, -1 ) ) || EQ_16( enc_dec, DEC ) ) - { - /* Set the bit-budget */ - bits = extract_l( Mpy_32_32( core_brate_inp, ONE_BY_FRAMES_PER_SEC_Q31 ) ); // Q0 - - test(); - test(); - IF( EQ_16( coder_type, TRANSITION ) && EQ_16( enc_dec, DEC ) && EQ_16( tc_call, 1 ) ) - { - bits = add( bits, *nBits_es_Pred ); /* equalize for 4th signaling bit estimated at the encoder in TC_0_192 */ - } - - /* Subtract signalling bits */ - test(); - test(); - IF( EQ_16( enc_dec, DEC ) && EQ_16( idchan, 1 ) && element_mode > EVS_MONO ) - { - bits = sub( bits, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); - - IF( EQ_16( tdm_LRTD_flag, 1 ) ) - { - bits = add( bits, STEREO_BITS_TCA ); - } - - /* subtract TBE/BWE flag */ - test(); - test(); - test(); - test(); - test(); - test(); - IF( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) - { - bits = sub( bits, 1 ); - } - } - ELSE - { - /* Subtract signalling bits */ - bits = sub( bits, signalling_bits ); - } - - test(); - test(); - test(); - test(); - test(); - test(); - IF( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) - { - /* extension layer signalling bit is counted in the extension layer bitbudget */ - bits = add( bits, 1 ); - } - - /*-----------------------------------------------------------------* - * LSF Q bit-budget - *-----------------------------------------------------------------*/ - test(); - test(); - test(); - IF( !tdm_lp_reuse_flag || idchan == 0 ) - { - /* LSF Q bit-budget */ - acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; - move16(); - - IF( !flag_hardcoded ) - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( element_mode, IVAS_SCE ) && tdm_low_rate_mode ) - { - acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; - move16(); - } - ELSE IF( ( LT_32( total_brate, 7200 ) || coder_type == INACTIVE || EQ_16( coder_type, AUDIO ) ) && EQ_16( idchan, 1 ) ) - { - /* TD stereo, secondary channel: do nothing */ - acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; - move16(); - } - ELSE IF( element_mode > EVS_MONO && EQ_16( coder_type, AUDIO ) && LT_32( brate_intermed_tbl[i], ACELP_9k60 ) ) - { - /* primary channel: do nothing */ - } - ELSE IF( element_mode > EVS_MONO && EQ_16( coder_type, AUDIO ) /*&& brate_intermed_tbl[i] >= ACELP_9k60*/ ) - { - acelp_cfg->lsf_bits = 42; - move16(); - } - ELSE IF( LE_32( total_brate, 9600 ) || EQ_16( coder_type, UNVOICED ) ) - { - acelp_cfg->lsf_bits = 31; - move16(); - } - ELSE IF( LE_32( total_brate, 20000 ) ) - { - acelp_cfg->lsf_bits = 36; - move16(); - } - ELSE - { - acelp_cfg->lsf_bits = 41; - move16(); - } - } - ELSE /* L_frame == L_FRAME16k */ - { - acelp_cfg->lsf_bits = 41; - move16(); - } - } - - bits = sub( bits, acelp_cfg->lsf_bits ); - - /* mid-LSF Q bit-budget */ - acelp_cfg->mid_lsf_bits = mid_LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; - move16(); - - test(); - if ( element_mode > EVS_MONO && EQ_16( coder_type, AUDIO ) /*&& brate_intermed_tbl[i] < ACELP_9k60*/ ) - { - acelp_cfg->mid_lsf_bits = 5; - move16(); - /* primary channel: do nothing */ - } - - bits = sub( bits, acelp_cfg->mid_lsf_bits ); - } - ELSE IF( EQ_16( tdm_lp_reuse_flag, 1 ) && EQ_16( idchan, 1 ) && NE_16( active_cnt, 1 ) ) - { - bits = sub( bits, TDM_IC_LSF_PRED_BITS ); - } - /* gain Q bit-budget - part 1: 'Es_pred' of memory-less gain Q */ - test(); - test(); - test(); - test(); - test(); - test(); -#ifdef NONBE_FIX_GSC_BSTR - IF( ( NE_16( coder_type, UNVOICED ) && NE_16( coder_type, AUDIO ) && coder_type != INACTIVE && !( LE_32( core_brate, ACELP_8k00 ) && NE_16( coder_type, TRANSITION ) ) ) /* mid bitrates in GC and VC, low+mid bitrates in TC */ || - ( coder_type == INACTIVE && !inactive_coder_type_flag ) /* AVQ inactive */ - ) -#else - IF( ( NE_16( coder_type, UNVOICED ) && NE_16( coder_type, AUDIO ) && coder_type != INACTIVE && !( LE_32( core_brate, ACELP_8k00 ) && NE_16( coder_type, TRANSITION ) ) ) || ( coder_type == INACTIVE && GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) -#endif - { - *nBits_es_Pred = Es_pred_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, -1, -1 )]; - move16(); - bits = sub( bits, *nBits_es_Pred ); - } - ELSE IF( *uc_two_stage_flag ) - { - *nBits_es_Pred = 4; - move16(); - bits = sub( bits, *nBits_es_Pred ); - } - } - ELSE - { - bits = *unbits; - move16(); - } - - test(); - IF( EQ_16( coder_type, TRANSITION ) && tc_call == 0 ) - { - *unbits = bits; - return error; - } - - /*-----------------------------------------------------------------* - * Low-rate mode - bits are allocated in tdm_low_rate_enc() - *-----------------------------------------------------------------*/ - test(); - IF( EQ_16( element_mode, IVAS_SCE ) && tdm_low_rate_mode ) - { - acelp_cfg->FEC_mode = 0; - acelp_cfg->ltf_mode = FULL_BAND; - *nBits_es_Pred = 0; - *unbits = 0; - acelp_cfg->ubits = 0; - move16(); - move16(); - move16(); - move16(); - move16(); - - return error; - } - - /*-----------------------------------------------------------------* - * Supplementary information for FEC - *-----------------------------------------------------------------*/ - - acelp_cfg->FEC_mode = 0; - move16(); - test(); - test(); - IF( GE_32( core_brate, ACELP_11k60 ) && ( idchan == 0 || element_mode == EVS_MONO ) ) - { - acelp_cfg->FEC_mode = 1; - move16(); - - test(); - test(); - IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) && NE_16( coder_type, VOICED ) ) - { - bits = sub( bits, FEC_BITS_CLS ); - } - - IF( NE_16( coder_type, TRANSITION ) ) - { - IF( GE_32( total_brate, ACELP_16k40 ) ) - { - acelp_cfg->FEC_mode = 2; - move16(); - test(); - IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) - { - bits = sub( bits, FEC_BITS_ENR ); - } - } - - IF( GE_32( total_brate, ACELP_32k ) ) - { - acelp_cfg->FEC_mode = 3; - move16(); - - test(); - IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) - { - bits = sub( bits, FEC_BITS_POS ); - } - } - } - } - - /*-----------------------------------------------------------------* - * LP filtering of the adaptive excitation - *-----------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - test(); - test(); - IF( idchan > 0 && element_mode > EVS_MONO ) - { - acelp_cfg->ltf_mode = FULL_BAND; - move16(); - } - ELSE IF( EQ_16( coder_type, UNVOICED ) ) - { - acelp_cfg->ltf_mode = FULL_BAND; - move16(); - } - ELSE IF( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) ) && LT_32( core_brate, ACELP_11k60 ) ) - { - acelp_cfg->ltf_mode = LOW_PASS; - move16(); - } - ELSE IF( GE_32( core_brate, ACELP_11k60 ) && ( NE_16( coder_type, AUDIO ) && !( coder_type == INACTIVE && EQ_16( L_frame, L_FRAME ) ) ) ) - { - test(); - test(); -#ifdef NONBE_FIX_GSC_BSTR - IF( coder_type == INACTIVE && EQ_16( L_frame, L_FRAME16k ) && inactive_coder_type_flag ) /* GSC Inactive @16kHz */ -#else - IF( coder_type == INACTIVE && EQ_16( L_frame, L_FRAME16k ) && LE_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) /* GSC Inactive @16kHz */ -#endif - { - acelp_cfg->ltf_mode = FULL_BAND; - move16(); - } - ELSE - { - acelp_cfg->ltf_mode = NORMAL_OPERATION; - move16(); - IF( coder_type != TRANSITION ) - { - bits = sub( bits, nb_subfr ); - } - } - } - ELSE - { - acelp_cfg->ltf_mode = FULL_BAND; - move16(); - } - - /*-----------------------------------------------------------------* - * UC bit-budget - *-----------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( ( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) || ( coder_type == INACTIVE && LE_32( core_brate, ACELP_9k60 ) ) ) && ( idchan == 0 || element_mode == EVS_MONO ) ) - { - bits = sub( bits, NBITS_NOISENESS ); /* noiseness */ - } - IF( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) - { - bits = sub( bits, 3 * NB_SUBFR ); /* tilt factor */ - } - - /*-----------------------------------------------------------------* - * TC bit-budget - *-----------------------------------------------------------------*/ - - fix_first = 0; - move16(); - IF( EQ_16( coder_type, TRANSITION ) ) - { - if ( EQ_16( tc_call, 2 ) ) - { - fix_first = 1; - move16(); - } - - /* TC signalling */ - IF( EQ_16( L_frame, L_FRAME ) ) - { - IF( EQ_16( tc_subfr, TC_0_0 ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 1 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, 3 ); /* LP filtering flag */ - } - } - ELSE IF( EQ_16( tc_subfr, TC_0_64 ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 4 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, 3 ); /* LP filtering flag */ - } - } - ELSE IF( EQ_16( tc_subfr, TC_0_128 ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 4 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, 2 ); /* LP filtering flag */ - } - } - ELSE IF( EQ_16( tc_subfr, TC_0_192 ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 3 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, 1 ); /* LP filtering flag */ - } - } - ELSE IF( EQ_16( tc_subfr, L_SUBFR ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 3 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, idiv1616( sub( L_FRAME - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ - } - } - ELSE - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 4 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, idiv1616_1( sub( L_FRAME - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ - } - } - } - ELSE /* L_frame == L_FRAME16k */ - { - IF( enc_dec == ENC ) - { - IF( LE_16( tc_subfr, 2 * L_SUBFR ) ) - { - bits = sub( bits, 2 ); /* TC signalling */ - } - ELSE - { - bits = sub( bits, 3 ); /* TC signalling */ - } - } - - // bits -= ( L_FRAME16k - tc_subfr - L_SUBFR ) / L_SUBFR; /* LP filtering flag */ - bits = sub( bits, idiv1616_1( sub( L_FRAME16k - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ - } - - /* glottal-shape codebook bits */ - bits = sub( bits, 3 + 6 + 1 + 3 ); - } - - /*-----------------------------------------------------------------* - * pitch, innovation, gains bit-budget - *-----------------------------------------------------------------*/ - - acelp_cfg->fcb_mode = 0; - move16(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( tdm_low_rate_mode, 1 ) && ( coder_type != INACTIVE ) && NE_16( coder_type, UNVOICED ) ) /* GENERIC low rate mode for secondary channel */ - { - set16_fx( acelp_cfg->pitch_bits, 0, NB_SUBFR16k ); - set16_fx( acelp_cfg->gains_mode, 0, NB_SUBFR16k ); - - FOR( i = 0; i < 2; i++ ) - { - acelp_cfg->pitch_bits[i] = 0; - move16(); - IF( tdm_Pitch_reuse_flag == 0 ) - { - acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, GENERIC, i_mult( 2 * L_SUBFR, i ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - bits = sub( bits, acelp_cfg->pitch_bits[i] ); - } - acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, GENERIC, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - bits = sub( bits, acelp_cfg->gains_mode[i] ); - } - acelp_cfg->fcb_mode = 1; - move16(); - -#ifdef DEBUGGING - if ( bits >= 55 ) - { - printf( "too much bits -> %d, LPC = %d and pitch = %d\n", bits, tdm_lp_reuse_flag, tdm_Pitch_reuse_flag ); - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); - } - else -#endif - IF( GE_16( bits, 16 ) ) - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); - } - ELSE - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); - acelp_cfg->fixed_cdk_index[1] = -1; - move16(); - } - acelp_cfg->fixed_cdk_index[2] = -1; - move16(); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } -#ifdef NONBE_FIX_GSC_BSTR - ELSE IF( ( coder_type != INACTIVE && EQ_16( nb_subfr, NB_SUBFR ) && NE_16( coder_type, AUDIO ) ) || /* @12.8kHz core except of GSC */ - ( EQ_16( nb_subfr, NB_SUBFR16k ) && ( !inactive_coder_type_flag || coder_type != INACTIVE ) ) /* @16kHz core GC, TC, AVQ inactive */ || - EQ_16( core, HQ_CORE ) /* ACELP -> HQ switching in EVS */ - ) -#else - ELSE IF( ( coder_type != INACTIVE && EQ_16( nb_subfr, NB_SUBFR ) && NE_16( coder_type, AUDIO ) ) || ( EQ_16( nb_subfr, NB_SUBFR16k ) && ( GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) || coder_type != INACTIVE ) ) || EQ_16( core, HQ_CORE ) ) -#endif - { - /* pitch Q & gain Q bit-budget - part 2*/ - FOR( i = 0; i < nb_subfr; i++ ) - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - test(); - IF( EQ_16( tdm_Pitch_reuse_flag, 1 ) && EQ_16( idchan, 1 ) ) - { - acelp_cfg->pitch_bits[i] = 0; - move16(); - } - ELSE - { - acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - } - acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type_sw, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - } - ELSE /* L_frame == L_FRAME16k */ - { - test(); - IF( EQ_16( tdm_Pitch_reuse_flag, 1 ) && EQ_16( idchan, 1 ) ) - { - acelp_cfg->pitch_bits[i] = 0; - move16(); - } - ELSE - { - acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; - move16(); - } - acelp_cfg->gains_mode[i] = gain_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type_sw, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; - move16(); - } - - bits = sub( bits, acelp_cfg->pitch_bits[i] ); - - test(); - IF( coder_type == INACTIVE && EQ_16( acelp_cfg->gains_mode[i], 6 ) /* VQ vs. SQ threshold @32 kbps */ ) - { - bits = sub( bits, 5 ); - } - ELSE - { - if ( EQ_16( *uc_two_stage_flag, 1 ) ) - { - acelp_cfg->gains_mode[i] = 7; - move16(); - } - - bits = sub( bits, acelp_cfg->gains_mode[i] ); - } - } - - /* algebraic codebook bit-budget */ - test(); - test(); - test(); - test(); - test(); - test(); -#ifdef NONBE_FIX_GSC_BSTR - IF( flag_hardcoded /* EVS */ || - ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) /* high-birate ACELP except IC */ || - ( !inactive_coder_type_flag && coder_type == INACTIVE ) /* AVQ inactive */ ) -#else - IF( flag_hardcoded || ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) || ( GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) && coder_type == INACTIVE ) ) -#endif - { - FOR( i = 0; i < nb_subfr; i++ ) - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - } - ELSE /* L_frame == L_FRAME16k */ - { - acelp_cfg->fixed_cdk_index[i] = FCB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; - move16(); - } - bits = sub( bits, acelp_cfg->fixed_cdk_index[i] ); - } - } - ELSE IF( !( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) ) - { - test(); - IF( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) - { - i = idiv1616( bits, NB_SUBFR ); - IF( s_and( i, 1 ) == 0 ) - { - i = sub( i, 1 ); /* must be odd */ - } - i = s_min( i, 13 ); -#ifdef DEBUG_MODE_TD - if ( i < 0 ) - IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR::: UC negative index should not happen at frame %d\n" ); -#endif - i = s_max( i, 0 ); /* If i == 0-> random noise generator will be used as FCB */ - set16_fx( acelp_cfg->fixed_cdk_index, i, NB_SUBFR ); - bits = sub( bits, i_mult( i, NB_SUBFR ) ); - } - ELSE - { - - acelp_cfg->fcb_mode = 1; - move16(); - test(); - test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) ) - { - IF( GE_16( bits, i_mult( ACELP_FIXED_CDK_BITS( 0 ), ( nb_subfr ) ) ) ) /* enough bits for all fcb */ - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); - } - ELSE IF( GE_16( bits, i_mult( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 1 ) ) ) ) - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr - 1, L_SUBFR, coder_type, tc_subfr, fix_first ); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - ELSE IF( GE_16( bits, i_mult( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 2 ) ) ) ) - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 2 ), L_SUBFR, coder_type, tc_subfr, fix_first ); - acelp_cfg->fixed_cdk_index[2] = acelp_cfg->fixed_cdk_index[1]; - move16(); - acelp_cfg->fixed_cdk_index[1] = -1; - move16(); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - ELSE IF( GE_16( bits, ACELP_FIXED_CDK_BITS( 0 ) ) ) - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 1, L_SUBFR, coder_type, tc_subfr, fix_first ); - acelp_cfg->fixed_cdk_index[1] = acelp_cfg->fixed_cdk_index[0]; - move16(); - acelp_cfg->fixed_cdk_index[0] = -1; - move16(); - acelp_cfg->fixed_cdk_index[2] = -1; - move16(); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - ELSE /* No FCB */ - { -#ifdef DEBUGGING - IVAS_ERROR( IVAS_ERR_INTERNAL, "WARNING!!!, No bit allocated to FCB, check frame %d\n" ); -#endif - acelp_cfg->fixed_cdk_index[0] = -1; - move16(); - acelp_cfg->fixed_cdk_index[1] = -1; - move16(); - acelp_cfg->fixed_cdk_index[2] = -1; - move16(); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - } - ELSE IF( NE_16( element_mode, IVAS_CPE_TD ) && GSC_IVAS_mode > 0 && EQ_16( L_frame, L_FRAME16k ) ) - { - bits = 100; /* 9 kbps for fcb */ - move16(); - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); - } - ELSE - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); - } - } - } - - /* AVQ codebook */ - test(); - test(); - test(); -#ifdef NONBE_FIX_GSC_BSTR - IF( ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) /* high-birate ACELP except IC */ || - ( !inactive_coder_type_flag && coder_type == INACTIVE ) /* AVQ inactive */ ) -#else - IF( ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) || ( GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) && coder_type == INACTIVE ) ) -#endif - { - FOR( i = 0; i < nb_subfr; i++ ) - { - IF( flag_hardcoded ) - { - acelp_cfg->AVQ_cdk_bits[i] = AVQ_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; - move16(); - { - bits = sub( bits, acelp_cfg->AVQ_cdk_bits[i] ); - } - } - - bits = sub( bits, G_AVQ_BITS ); - } - - test(); - test(); - IF( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && LE_32( core_brate_inp, MAX_BRATE_AVQ_EXC_TD ) && EQ_16( coder_type, GENERIC ) ) - { - /* harm. flag ACELP AVQ */ - bits = sub( bits, 1 ); - } - - IF( !flag_hardcoded ) - { - Word16 bit_tmp; - - bit_tmp = idiv1616( bits, nb_subfr ); - set16_fx( acelp_cfg->AVQ_cdk_bits, bit_tmp, nb_subfr ); - bits = sub( bits, i_mult( bit_tmp, nb_subfr ) ); - - bit_tmp = bits % nb_subfr; - move16(); - acelp_cfg->AVQ_cdk_bits[0] = add( acelp_cfg->AVQ_cdk_bits[0], bit_tmp ); - move16(); - bits = sub( bits, bit_tmp ); - } - } - } -#ifdef NONBE_FIX_GSC_BSTR - ELSE IF( ( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) /* LBR secondary channel in TD stereo */ || - ( ( coder_type == INACTIVE || EQ_16( coder_type, AUDIO ) ) && EQ_16( nb_subfr, NB_SUBFR ) ) /* GSC @12.8kHz */ || - ( coder_type == INACTIVE && inactive_coder_type_flag ) /* AVQ inactive */ ) -#else - ELSE IF( ( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) || ( ( coder_type == INACTIVE || EQ_16( coder_type, AUDIO ) ) && EQ_16( nb_subfr, NB_SUBFR ) ) || ( coder_type == INACTIVE && LE_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) -#endif - { - Word32 Local_BR, Pitch_BR; - Word16 Pitch_CT; - - /* as defined at the beginning of [enc,dec]_pit_exc() */ - test(); - test(); - IF( GSC_IVAS_mode > 0 && ( GSC_noisy_speech || GT_32( core_brate, GSC_H_RATE_STG ) ) ) - { - Local_BR = ACELP_8k00; - move32(); - Pitch_CT = GENERIC; - move16(); - Pitch_BR = ACELP_8k00; - move32(); - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - Local_BR = ACELP_14k80; - move32(); - test(); - if ( GSC_IVAS_mode > 0 && LT_32( core_brate, IVAS_24k4 ) ) - { - Local_BR = ACELP_9k60; - move32(); - } - Pitch_BR = core_brate; - move32(); - } - } - ELSE IF( GSC_noisy_speech ) - { - Local_BR = ACELP_7k20; - move32(); - Pitch_CT = GENERIC; - move16(); - Pitch_BR = ACELP_7k20; - move32(); - if ( EQ_16( L_frame, L_FRAME16k ) ) - { - Pitch_BR = core_brate; - move32(); - } - } - ELSE - { - Local_BR = ACELP_7k20; - move32(); - Pitch_CT = AUDIO; - move16(); - Pitch_BR = core_brate; - move32(); - - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - Local_BR = ACELP_13k20; - move32(); - Pitch_CT = GENERIC; - move16(); - } - } - - FOR( i = 0; i < nb_subfr; i++ ) - { - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( Pitch_BR, Pitch_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( Local_BR, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - } - ELSE - { - acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( Pitch_BR, Pitch_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( Local_BR, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - } - } + nBits_tmp = fcb_table( cdbk, L_subfr ); } - - test(); - test(); - test(); - IF( EQ_16( coder_type, TRANSITION ) && ( EQ_16( tc_call, 1 ) && tc_subfr == 0 && EQ_16( L_frame, L_FRAME ) ) ) + ELSE { - return error; + nBits_tmp = 0; + move16(); } - - /*-----------------------------------------------------------------* - * unused bits handling - *-----------------------------------------------------------------*/ - - acelp_cfg->ubits = 0; /* these bits could be reused for something else */ + *nBits = sub( *nBits, i_mult( nBits_tmp, nb_subfr ) ); move16(); - test(); - IF( flag_hardcoded && NE_32( core_brate, PPP_NELP_2k80 ) ) + /* try to increase the FCB bit-budget of the first subframe(s) */ + IF( LT_16( cdbk, ACELP_FIXED_CDK_NB - 1 ) ) { - test(); - test(); - /* unused bits */ - IF( EQ_16( coder_type, AUDIO ) || ( coder_type == INACTIVE && LE_32( core_brate, ACELP_24k40 ) ) ) - { - acelp_cfg->ubits = 0; - move16(); - } - ELSE IF( EQ_16( L_frame, L_FRAME ) ) - { - acelp_cfg->ubits = reserved_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, -1, TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - } - ELSE + step = sub( fcb_table( add( cdbk, 1 ), L_subfr ), nBits_tmp ); + WHILE( *nBits >= step ) { - acelp_cfg->ubits = 0; + ( *p_fixed_cdk_index )++; + *nBits = sub( *nBits, step ); move16(); + p_fixed_cdk_index++; } - bits = sub( bits, acelp_cfg->ubits ); - } - - /* sanity check */ - test(); - test(); - test(); - IF( ( coder_type != INACTIVE && EQ_16( nb_subfr, NB_SUBFR ) && NE_16( coder_type, AUDIO ) ) || EQ_16( nb_subfr, NB_SUBFR16k ) ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); -#ifdef NONBE_FIX_GSC_BSTR - IF( ( EQ_16( L_frame, L_FRAME16k ) && coder_type == INACTIVE && inactive_coder_type_flag ) /* GSC Inactive @16kHz */ || - ( GSC_IVAS_mode > 0 && EQ_16( L_frame, L_FRAME16k ) ) ) /* IVAS GSC @16kHz */ -#else - IF( ( EQ_16( L_frame, L_FRAME16k ) && coder_type == INACTIVE && LE_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) || ( GSC_IVAS_mode > 0 && EQ_16( L_frame, L_FRAME16k ) ) ) /* GSC Inactive @16kHz */ -#endif - { - acelp_cfg->ubits = 0; - move16(); - } - ELSE IF( flag_hardcoded && core == ACELP_CORE && bits != 0 ) - { -#ifdef DEBUGGING - IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR: bit-budget incorrect (%d bits) in frame %d.\n", (Word32) bits ); -#endif - } - ELSE IF( bits > 0 && !( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) ) + /* try to increase the FCB of the first subframe in cases when the next step is lower than the current step */ + IF( LT_16( fixed_cdk_index[sfr], ACELP_FIXED_CDK_NB - 1 ) ) { + step = sub( fcb_table( add( fixed_cdk_index[sfr], 1 ), L_subfr ), fcb_table( fixed_cdk_index[sfr], L_subfr ) ); test(); - test(); - test(); - test(); - IF( idchan > 0 && EQ_16( element_mode, IVAS_CPE_TD ) ) - { - IF( !tdm_lp_reuse_flag ) - { - acelp_cfg->lsf_bits = add( acelp_cfg->lsf_bits, bits ); /* increase LSF Q bits */ - move16(); - bits = 0; - move16(); - } - ELSE - { - Word16 nb_prm = 4; - move16(); - if ( EQ_16( tdm_low_rate_mode, 1 ) ) - { - nb_prm = 2; - move16(); - } - /* First add remaining bits on gains */ - bits = sub( bits, allocate_unused( core_brate, coder_type, bits, nb_prm, 0, GAINSPRM, acelp_cfg->gains_mode ) ); - - /* Then, Increase pitch bit budget */ - test(); - IF( tdm_Pitch_reuse_flag == 0 && bits > 0 ) - { - bits = sub( bits, allocate_unused( core_brate, coder_type, bits, nb_prm, 0, PITCHPRM, acelp_cfg->pitch_bits ) ); - } - - /* Increase mid-lsf bit budget */ - test(); - IF( tdm_lp_reuse_flag == 0 && bits > 0 ) - { - bits = sub( bits, allocate_unused( core_brate, coder_type, bits, 1, 0, MID_LSFSPRM, &acelp_cfg->mid_lsf_bits ) ); - bits = sub( bits, allocate_unused( core_brate, coder_type, bits, 1, 0, LSFPRM, &acelp_cfg->lsf_bits ) ); - } - } - -#ifdef DEBUGGING - if ( idchan > 0 && bits > 0 && ( coder_type > UNVOICED || tdm_low_rate_mode == 0 ) ) - { - IVAS_ERROR( IVAS_ERR_INTERNAL, "WARNING !! Unused bits in secondary channel at frame %d\n" ); - } -#endif - } - - ELSE IF( core == ACELP_CORE && GE_16( coder_type, UNVOICED ) && LE_16( coder_type, GENERIC ) && EQ_16( L_frame, L_FRAME ) ) + IF( GE_16( *nBits, step ) && cdbk >= 0 ) { - acelp_cfg->lsf_bits = add( acelp_cfg->lsf_bits, bits ); /* increase LSF Q bits */ + fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); + move16(); + *nBits = sub( *nBits, step ); move16(); - test(); - IF( GT_16( acelp_cfg->lsf_bits, 46 ) ) - { - acelp_cfg->ubits = sub( acelp_cfg->lsf_bits, 46 ); - move16(); - acelp_cfg->lsf_bits = 46; - move16(); - } - ELSE IF( GT_16( acelp_cfg->lsf_bits, 42 ) && EQ_16( L_frame, L_FRAME ) ) + IF( GE_16( *nBits, step ) && EQ_16( fixed_cdk_index[sfr + 1], sub( fixed_cdk_index[sfr], 1 ) ) ) { - acelp_cfg->ubits = sub( acelp_cfg->lsf_bits, 42 ); + sfr = add( sfr, 1 ); + fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); move16(); - acelp_cfg->lsf_bits = 42; + *nBits = sub( *nBits, step ); move16(); } } - ELSE - { - acelp_cfg->ubits = bits; - move16(); - } } - ELSE IF( bits < 0 && !( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) ) + } + /* TRANSITION coding: allocate highest FCBQ bit-budget to the subframe with the glottal-shape codebook */ + IF( GE_16( tc_subfr, L_SUBFR ) ) + { + Word16 tempr; + + SWAP( fixed_cdk_index[0], fixed_cdk_index[tc_subfr / L_SUBFR] ); + + /* TRANSITION coding: allocate second highest FCBQ bit-budget to the last subframe */ + IF( LT_16( idiv1616( tc_subfr, L_SUBFR ), sub( nb_subfr, 1 ) ) ) + { + SWAP( fixed_cdk_index[sub( tc_subfr, L_SUBFR ) / L_SUBFR], fixed_cdk_index[nb_subfr - 1] ); + } + } + + /* when subframe length > L_SUBFR, number of bits instead of codebook index is signalled */ + IF( GT_16( L_subfr, L_SUBFR ) ) + { + Word16 i, j; + FOR( i = 0; i < nb_subfr; i++ ) { -#ifdef DEBUGGING - IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR: bit-budget incorrect (%d bits) in frame %d.\n", (Word32) bits ); -#endif + j = fixed_cdk_index[i]; + move16(); + fixed_cdk_index[i] = fast_FCB_bits_2sfr[j]; + move16(); } } return error; } + /*-------------------------------------------------------------------* - * config_acelp1_IVAS() + * config_acelp1_fx() * * Configure ACELP bit allocation * - should be in range of <6700; 24350> for ACELP@12.8kHz * - per channel bitrate minimum is 13250 kbps for ACELP@16kHz *--------------------------------------------------------------------*/ -ivas_error config_acelp1_IVAS( - const Word16 enc_dec, /* i : encoder/decoder flag */ - const Word32 total_brate, /* i : total bitrate */ - const Word32 core_brate_inp, /* i : core bitrate */ - const Word16 core, /* i : core */ - const Word16 extl, /* i : extension layer */ - const Word32 extl_brate, /* i : extension layer bitrate */ - const Word16 L_frame, /* i : frame length at internal Fs */ - const Word16 GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ - ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ - const Word16 signaling_bits, /* i : number of signaling bits */ - const Word16 coder_type, /* i : coder type */ -#ifdef NONBE_FIX_GSC_BSTR +ivas_error config_acelp1_fx( + const Word16 enc_dec, /* i : encoder/decoder flag */ + const Word32 total_brate, /* i : total bitrate */ + const Word32 core_brate_inp, /* i : core bitrate */ + const Word16 core, /* i : core */ + const Word16 extl, /* i : extension layer */ + const Word32 extl_brate, /* i : extension layer bitrate */ + const Word16 L_frame, /* i : frame length at internal Fs */ + const Word16 GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ + ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ + const Word16 signaling_bits, /* i : number of signaling bits */ + const Word16 coder_type, /* i : coder type */ const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ -#endif - const Word16 tc_subfr, /* i : TC subfr ID */ - const Word16 tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ - Word16 *nBits_es_Pred, /* o : number of bits for Es_pred Q */ - Word16 *unbits, /* o : number of unused bits */ - const Word16 element_mode, /* i : element mode */ - Word16 *uc_two_stage_flag, /* o : flag undicating two-stage UC */ - const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ - const Word16 idchan, /* i : stereo channel ID */ - const Word16 active_cnt, /* i : Active frame counter */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/ - const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ + const Word16 tc_subfr, /* i : TC subfr ID */ + const Word16 tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ + Word16 *nBits_es_Pred, /* o : number of bits for Es_pred Q */ + Word16 *unbits, /* o : number of unused bits */ + const Word16 element_mode, /* i : element mode */ + Word16 *uc_two_stage_flag, /* o : flag undicating two-stage UC */ + const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const Word16 idchan, /* i : stereo channel ID */ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/ + const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ ) { Word16 i, bits, nb_subfr; @@ -2123,7 +801,6 @@ ivas_error config_acelp1_IVAS( * LSF Q bit-budget *-----------------------------------------------------------------*/ - test(); test(); test(); IF( !tdm_lp_reuse_flag || idchan == 0 ) @@ -2202,7 +879,7 @@ ivas_error config_acelp1_IVAS( bits = sub( bits, acelp_cfg->mid_lsf_bits ); } - ELSE IF( EQ_16( tdm_lp_reuse_flag, 1 ) && EQ_16( idchan, 1 ) && NE_16( active_cnt, 1 ) ) + ELSE IF( EQ_16( tdm_lp_reuse_flag, 1 ) && EQ_16( idchan, 1 ) ) { bits = sub( bits, TDM_IC_LSF_PRED_BITS ); } @@ -2214,12 +891,8 @@ ivas_error config_acelp1_IVAS( test(); test(); /* gain Q bit-budget - part 1: 'Es_pred' of memory-less gain Q */ -#ifdef NONBE_FIX_GSC_BSTR IF( ( NE_16( coder_type, UNVOICED ) && NE_16( coder_type, AUDIO ) && coder_type != INACTIVE && !( LE_32( core_brate, ACELP_8k00 ) && NE_16( coder_type, TRANSITION ) ) ) /* mid bitrates in GC and VC, low+mid bitrates in TC */ || ( coder_type == INACTIVE && !inactive_coder_type_flag ) /* AVQ inactive */ ) -#else - IF( ( NE_16( coder_type, UNVOICED ) && NE_16( coder_type, AUDIO ) && ( coder_type != INACTIVE ) && !( LE_32( core_brate, ACELP_8k00 ) && NE_16( coder_type, TRANSITION ) ) ) || ( ( coder_type == INACTIVE ) && GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) -#endif { *nBits_es_Pred = Es_pred_bits_tbl[BIT_ALLOC_IDX( core_brate, coder_type, -1, -1 )]; move16(); @@ -2344,11 +1017,7 @@ ivas_error config_acelp1_IVAS( { test(); test(); -#ifdef NONBE_FIX_GSC_BSTR IF( coder_type == INACTIVE && EQ_16( L_frame, L_FRAME16k ) && inactive_coder_type_flag ) /* GSC Inactive @16kHz */ -#else - IF( coder_type == INACTIVE && EQ_16( L_frame, L_FRAME16k ) && LE_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) /* GSC Inactive @16kHz */ -#endif { acelp_cfg->ltf_mode = FULL_BAND; move16(); @@ -2551,11 +1220,11 @@ ivas_error config_acelp1_IVAS( IF( GE_16( bits, 16 ) ) { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); } ELSE { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); acelp_cfg->fixed_cdk_index[1] = -1; move16(); } @@ -2564,13 +1233,9 @@ ivas_error config_acelp1_IVAS( acelp_cfg->fixed_cdk_index[3] = -1; move16(); } -#ifdef NONBE_FIX_GSC_BSTR ELSE IF( ( coder_type != INACTIVE && EQ_16( nb_subfr, NB_SUBFR ) && NE_16( coder_type, AUDIO ) ) /* @12.8kHz core except of GSC */ || ( EQ_16( nb_subfr, NB_SUBFR16k ) && ( !inactive_coder_type_flag || coder_type != INACTIVE ) ) /* @16kHz core GC, TC, AVQ inactive */ || EQ_16( core, HQ_CORE ) /* ACELP -> HQ switching in EVS */ ) -#else - ELSE IF( ( coder_type != INACTIVE && EQ_16( nb_subfr, NB_SUBFR ) && NE_16( coder_type, AUDIO ) ) || ( EQ_16( nb_subfr, NB_SUBFR16k ) && ( GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) || coder_type != INACTIVE ) ) || EQ_16( core, HQ_CORE ) ) -#endif { /* pitch Q & gain Q bit-budget - part 2*/ FOR( i = 0; i < nb_subfr; i++ ) @@ -2634,13 +1299,9 @@ ivas_error config_acelp1_IVAS( test(); test(); /* algebraic codebook bit-budget */ -#ifdef NONBE_FIX_GSC_BSTR IF( flag_hardcoded /* EVS */ || ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) /* high-birate ACELP except IC */ || ( !inactive_coder_type_flag && coder_type == INACTIVE ) /* AVQ inactive */ ) -#else - IF( flag_hardcoded || ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) || ( GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) && coder_type == INACTIVE ) ) -#endif { FOR( i = 0; i < nb_subfr; i++ ) { @@ -2682,17 +1343,17 @@ ivas_error config_acelp1_IVAS( { IF( GE_16( bits, imult1616( ACELP_FIXED_CDK_BITS( 0 ), nb_subfr ) ) ) /* enough bits for all fcb */ { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); } ELSE IF( GE_16( bits, imult1616( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 1 ) ) ) ) { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 1 ), L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 1 ), L_SUBFR, coder_type, tc_subfr, fix_first ); acelp_cfg->fixed_cdk_index[3] = -1; move16(); } ELSE IF( GE_32( bits, imult1616( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 2 ) ) ) ) { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 2 ), L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 2 ), L_SUBFR, coder_type, tc_subfr, fix_first ); acelp_cfg->fixed_cdk_index[2] = acelp_cfg->fixed_cdk_index[1]; move16(); acelp_cfg->fixed_cdk_index[1] = -1; @@ -2702,7 +1363,7 @@ ivas_error config_acelp1_IVAS( } ELSE IF( GE_32( bits, ACELP_FIXED_CDK_BITS( 0 ) ) ) { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, 1, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, 1, L_SUBFR, coder_type, tc_subfr, fix_first ); acelp_cfg->fixed_cdk_index[1] = acelp_cfg->fixed_cdk_index[0]; move16(); acelp_cfg->fixed_cdk_index[0] = -1; @@ -2728,11 +1389,11 @@ ivas_error config_acelp1_IVAS( { bits = 100; /* 9 kbps for fcb */ move16(); - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); } ELSE { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); } } } @@ -2741,12 +1402,8 @@ ivas_error config_acelp1_IVAS( test(); test(); /* AVQ codebook */ -#ifdef NONBE_FIX_GSC_BSTR IF( ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) /* high-birate ACELP except IC */ || ( !inactive_coder_type_flag && coder_type == INACTIVE ) /* AVQ inactive */ ) -#else - IF( ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) || ( GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) && coder_type == INACTIVE ) ) -#endif { FOR( i = 0; i < nb_subfr; i++ ) { @@ -2784,13 +1441,9 @@ ivas_error config_acelp1_IVAS( } } } -#ifdef NONBE_FIX_GSC_BSTR ELSE IF( ( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) /* LBR secondary channel in TD stereo */ || ( ( coder_type == INACTIVE || EQ_16( coder_type, AUDIO ) ) && EQ_16( nb_subfr, NB_SUBFR ) ) /* GSC @12.8kHz */ || ( coder_type == INACTIVE && inactive_coder_type_flag ) /* AVQ inactive */ ) -#else - ELSE IF( ( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) || ( ( coder_type == INACTIVE || EQ_16( coder_type, AUDIO ) ) && EQ_16( nb_subfr, NB_SUBFR ) ) || ( coder_type == INACTIVE && LE_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) -#endif { Word32 Local_BR, Pitch_BR; Word16 Pitch_CT; @@ -2931,12 +1584,8 @@ ivas_error config_acelp1_IVAS( test(); test(); test(); -#ifdef NONBE_FIX_GSC_BSTR IF( ( EQ_16( L_frame, L_FRAME16k ) && coder_type == INACTIVE && inactive_coder_type_flag ) /* GSC Inactive @16kHz */ || ( GSC_IVAS_mode > 0 && EQ_16( L_frame, L_FRAME16k ) ) ) /* IVAS GSC @16kHz */ -#else - IF( ( EQ_16( L_frame, L_FRAME16k ) && coder_type == INACTIVE && LE_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) || ( GSC_IVAS_mode > 0 && EQ_16( L_frame, L_FRAME16k ) ) ) /* GSC Inactive @16kHz */ -#endif { acelp_cfg->ubits = 0; move16(); @@ -3042,7 +1691,6 @@ static Word16 allocate_unused( Word16 max_bit_per_pos = 0, bit_added = 0; move16(); move16(); - // PMT("Not floating point computation, but fixed point operator are still missing ") IF( prm_type == GAINSPRM ) { @@ -3146,7 +1794,6 @@ Word16 set_ACELP_flag( const Word16 cng_type /* i : CNG type */ ) { - // PMT("Not floating point computation, but fixed point operator are still missing ") test(); test(); test(); diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c deleted file mode 100644 index d8d4563ed3a60fdf6325d71a81a73384c100f911..0000000000000000000000000000000000000000 --- a/lib_com/bitstream.c +++ /dev/null @@ -1,2067 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include -#include "options.h" -#include "cnst.h" -#include "prot_fx.h" -#include "stat_enc.h" -#include "stat_dec.h" -#include "rom_com.h" -#include "mime.h" -#include "ivas_cnst.h" -#include "ivas_rom_com.h" -#include "wmc_auto.h" -#include "ivas_prot_fx.h" -#include "prot_fx_enc.h" - - -#define STEP_MAX_NUM_INDICES 100 /* increase the maximum number of allowed indices in the list by this amount */ - - -/*-------------------------------------------------------------------* - * rate2AMRWB_IOmode() - * - * lookup AMRWB IO mode - *-------------------------------------------------------------------*/ - -static Word16 rate2AMRWB_IOmode( - Word32 brate /* i : bitrate */ -) -{ - switch ( brate ) - { - /* EVS AMR-WB IO modes */ - case SID_1k75: - return AMRWB_IO_SID; - case ACELP_6k60: - return AMRWB_IO_6600; - case ACELP_8k85: - return AMRWB_IO_8850; - case ACELP_12k65: - return AMRWB_IO_1265; - case ACELP_14k25: - return AMRWB_IO_1425; - case ACELP_15k85: - return AMRWB_IO_1585; - case ACELP_18k25: - return AMRWB_IO_1825; - case ACELP_19k85: - return AMRWB_IO_1985; - case ACELP_23k05: - return AMRWB_IO_2305; - case ACELP_23k85: - return AMRWB_IO_2385; - default: - break; - } - - return -1; -} - -/*-------------------------------------------------------------------* - * rate2EVSmode() - * - * lookup EVS mode - *-------------------------------------------------------------------*/ -Word16 rate2EVSmode_float( - const Word32 brate, /* i : bitrate */ - int16_t *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ -) -{ - if ( is_amr_wb != NULL ) - { - *is_amr_wb = 0; - } - - switch ( brate ) - { - /* EVS Primary modes */ - case FRAME_NO_DATA: - return NO_DATA_TYPE; - case SID_2k40: - return PRIMARY_SID; - case PPP_NELP_2k80: - return PRIMARY_2800; - case ACELP_7k20: - return PRIMARY_7200; - case ACELP_8k00: - return PRIMARY_8000; - case ACELP_9k60: - return PRIMARY_9600; - case ACELP_13k20: - return PRIMARY_13200; - case ACELP_16k40: - return PRIMARY_16400; - case ACELP_24k40: - return PRIMARY_24400; - case ACELP_32k: - return PRIMARY_32000; - case ACELP_48k: - return PRIMARY_48000; - case ACELP_64k: - return PRIMARY_64000; - case HQ_96k: - return PRIMARY_96000; - case HQ_128k: - return PRIMARY_128000; - default: - break; - } - - if ( is_amr_wb != NULL ) - { - *is_amr_wb = 1; - } - - return rate2AMRWB_IOmode( brate ); -} - -/*-------------------------------------------------------------------* - * ind_list_realloc() - * - * Re-allocate the list of indices - *-------------------------------------------------------------------*/ - -ivas_error ind_list_realloc( - INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ - const Word16 max_num_indices, /* i : new maximum number of allowed indices in the list */ - Encoder_Struct *st_ivas /* i : IVAS encoder structure */ -) -{ - Word16 i, n, ch, n_channels, ind_list_pos, is_metadata, ivas_max_num_indices; - INDICE_HANDLE new_ind_list; - BSTR_ENC_HANDLE hBstr; - - IF( st_ivas == NULL ) - { - return IVAS_ERR_OK; - } - - /* get the pointer to the beginning of the old buffer of indices (either metadata or core coders) */ - IF( old_ind_list == st_ivas->ind_list_metadata ) - { - is_metadata = 1; - ivas_max_num_indices = st_ivas->ivas_max_num_indices_metadata; - } - ELSE - { - is_metadata = 0; - ivas_max_num_indices = st_ivas->ivas_max_num_indices; - } - move16(); - move16(); - - /* allocate new buffer of indices */ - IF( ( new_ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - } - - /* move indices from the old list to the new list */ - FOR( i = 0; i < s_min( max_num_indices, ivas_max_num_indices ); i++ ) - { - IF( GT_16( old_ind_list[i].nb_bits, -1 ) ) - { - new_ind_list[i].id = old_ind_list[i].id; - new_ind_list[i].value = old_ind_list[i].value; - move16(); - move16(); - } - new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; - move16(); - } - - /* reset nb_bits of all other indices to -1 */ - FOR( ; i < max_num_indices; i++ ) - { - new_ind_list[i].nb_bits = -1; - move16(); - } - - /* update parameters in all SCE elements */ - FOR( n = 0; n < st_ivas->nSCE; n++ ) - { - /* get the pointer to hBstr */ - IF( is_metadata ) - { - hBstr = st_ivas->hSCE[n]->hMetaData; - } - ELSE - { - hBstr = st_ivas->hSCE[n]->hCoreCoder[0]->hBstr; - } - - IF( hBstr != NULL ) - { - /* get the current position inside the old list */ - ind_list_pos = (Word16) ( hBstr->ind_list - old_ind_list ); - - /* set pointers in the new list */ - *( hBstr->ivas_ind_list_zero ) = new_ind_list; - hBstr->ind_list = &new_ind_list[ind_list_pos]; - - /* set the new maximum number of indices */ - *( hBstr->ivas_max_num_indices ) = max_num_indices; - move16(); - } - } - - /* update parameters in all CPE elements */ - FOR( n = 0; n < st_ivas->nCPE; n++ ) - { - /* get the pointer to hBstr */ - IF( is_metadata ) - { - n_channels = 1; - } - ELSE - { - n_channels = CPE_CHANNELS; - } - move16(); - - FOR( ch = 0; ch < n_channels; ch++ ) - { - IF( is_metadata ) - { - hBstr = st_ivas->hCPE[n]->hMetaData; - } - ELSE - { - hBstr = st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr; - } - - IF( hBstr != NULL ) - { - /* get the current position inside the old list */ - ind_list_pos = (Word16) ( hBstr->ind_list - old_ind_list ); - - /* set pointers in the new list */ - *( hBstr->ivas_ind_list_zero ) = new_ind_list; - hBstr->ind_list = &new_ind_list[ind_list_pos]; - - /* set the new maximum number of indices */ - *( hBstr->ivas_max_num_indices ) = max_num_indices; - move16(); - } - } - } - - /* free the old list */ - free( old_ind_list ); - - return IVAS_ERR_OK; -} - - -/*-----------------------------------------------------------------------* - * get_ivas_max_num_indices() - * - * Get the maximum allowed number of indices in the encoder - *-----------------------------------------------------------------------*/ - -/*! r: maximum number of indices */ -Word16 get_ivas_max_num_indices_fx( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word32 ivas_total_brate /* i : IVAS total bitrate */ -) -{ - test(); - test(); - IF( EQ_16( ivas_format, STEREO_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 300; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) - { - return 400; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 450; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 650; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) - { - return 750; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) - { - return 850; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 950; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 1350; - } - ELSE - { - return 1650; - } - } - ELSE IF( EQ_16( ivas_format, ISM_FORMAT ) || EQ_16( ivas_format, MONO_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 250; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) - { - return 350; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 450; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 550; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_64k ) ) - { - return 620; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) - { - return 670; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) - { - return 780; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) - { - return 880; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 950; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 1100; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 1300; - } - ELSE - { - return 1650; - } - } - ELSE IF( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 250; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) - { - return 350; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 400; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 650; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) - { - return 750; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) - { - return 1020; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) - { - return 1160; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 1220; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 1300; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 1720; - } - ELSE - { - return 2000; - } - } - ELSE IF( EQ_16( ivas_format, MASA_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 300; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 400; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 650; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) - { - return 750; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) - { - return 850; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 950; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 1150; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 1450; - } - ELSE - { - return 1650; - } - } - ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 300; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 400; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 650; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) - { - return 750; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) - { - return 1150; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 1250; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 1400; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 1650; - } - ELSE - { - return 1850; - } - } - ELSE IF( EQ_16( ivas_format, MC_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 250; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) - { - return 350; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 400; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 650; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_64k ) ) - { - return 750; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) - { - return 850; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) - { - return 1150; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) - { - return 1420; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 2120; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 2250; - } - ELSE - { - return 2450; - } - } - - return 2450; -} -/*-----------------------------------------------------------------------* - * get_BWE_max_num_indices() - * - * Get the maximum number of indices in the BWE - *-----------------------------------------------------------------------*/ - -/*! r: maximum number of indices */ -int16_t get_BWE_max_num_indices( - const int32_t extl_brate /* i : extensiona layer bitrate */ -) -{ - /* set the maximum number of indices in the BWE */ - if ( extl_brate < SWB_BWE_16k ) - { - return 30; - } - else - { - return 150; - } -} - - -/*-----------------------------------------------------------------------* - * get_ivas_max_num_indices_metadata() - * - * Set the maximum allowed number of metadata indices in the list - *-----------------------------------------------------------------------*/ - -/*! r: maximum number of indices */ -Word16 get_ivas_max_num_indices_metadata_fx( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word32 ivas_total_brate /* i : IVAS total bitrate */ -) -{ - /* set the maximum required number of metadata indices */ - test(); - IF( EQ_16( ivas_format, MONO_FORMAT ) ) - { - return 0; - } - ELSE IF( EQ_16( ivas_format, STEREO_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 60; - } - ELSE - { - return 80; - } - } - ELSE IF( EQ_16( ivas_format, ISM_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 20; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 65; - } - ELSE - { - return 80; - } - } - ELSE IF( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 100; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) - { - return 200; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 300; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 500; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 1050; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 2000; - } - ELSE - { - return 2500; - } - } - ELSE IF( EQ_16( ivas_format, MASA_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 80; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 125; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 205; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) - { - return 240; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) - { - return 305; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) - { - return 425; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 630; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 850; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 1000; - } - ELSE - { - return 1750; - } - } - ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 80; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 125 + 100; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 205 + 100; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) - { - return 240 + 150; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) - { - return 305 + 30; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) - { - return 425 + 30; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 630 + 30; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 850 + 30; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 1000 + 30; - } - ELSE - { - return 1750 + 30; - } - } - ELSE IF( EQ_16( ivas_format, MC_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_13k2 ) ) - { - return 80; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) - { - return 100; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_64k ) ) - { - return 210; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) - { - return 220; - } - ELSE - { - return 300; - } - } - - return 50; -} -/*-------------------------------------------------------------------* - * move_indices() - * - * Move indices inside the buffer or among two buffers - *-------------------------------------------------------------------*/ - -void move_indices( - INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ - INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ - const int16_t nb_indices /* i : number of moved indices */ -) -{ - int16_t i; - - if ( new_ind_list < old_ind_list ) - { - for ( i = 0; i < nb_indices; i++ ) - { - new_ind_list[i].id = old_ind_list[i].id; - new_ind_list[i].value = old_ind_list[i].value; - new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; - - old_ind_list[i].nb_bits = -1; - } - } - else if ( new_ind_list > old_ind_list ) - { - for ( i = nb_indices - 1; i >= 0; i-- ) - { - new_ind_list[i].id = old_ind_list[i].id; - new_ind_list[i].value = old_ind_list[i].value; - new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; - - old_ind_list[i].nb_bits = -1; - } - } - - return; -} - - -/*-------------------------------------------------------------------* - * check_ind_list_limits() - * - * Check, if the maximum number of indices has been reached -> reallocate - * Check, if we will not overwrite an existing indice -> adjust the location - *-------------------------------------------------------------------*/ - -ivas_error check_ind_list_limits( - BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ -) -{ - Indice *ivas_ind_list_zero, *ivas_ind_list_last; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - ivas_ind_list_zero = *( hBstr->ivas_ind_list_zero ); - - /* check, if the maximum number of indices has been reached and re-allocate the buffer */ - /* the re-allocation can be avoided by increasing the limits in get_ivas_max_num_indices() or get_ivas_max_num_indices_metadata() */ - IF( GE_16( (Word16) ( &hBstr->ind_list[hBstr->nb_ind_tot] - ivas_ind_list_zero ), *( hBstr->ivas_max_num_indices ) ) ) - { - - /* reallocate the buffer of indices with increased limit */ - IF( NE_32( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /* check, if we will not overwrite an existing indice */ - IF( hBstr->ind_list[hBstr->nb_ind_tot].nb_bits > 0 ) - { - IF( hBstr->nb_ind_tot == 0 ) - { - /* move the pointer to the next available empty slot */ - ivas_ind_list_last = &ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )]; - WHILE( hBstr->ind_list[0].nb_bits > 0 && hBstr->ind_list < ivas_ind_list_last ) - { - hBstr->ind_list++; - } - - IF( hBstr->ind_list >= ivas_ind_list_last ) - { - - /* no available empty slot -> need to re-allocate the buffer */ - IF( NE_32( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - ELSE - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Buffer of indices corrupted in frame %d! Attempt to overwrite indice ID = %d (value: %d, bits: %d)!\n", hBstr->ind_list[hBstr->nb_ind_tot].id, hBstr->ind_list[hBstr->nb_ind_tot].value, hBstr->ind_list[hBstr->nb_ind_tot].nb_bits ); - } - } - - return error; -} - - -/*-------------------------------------------------------------------* - * push_indice() - * - * Push a new indice into the buffer - *-------------------------------------------------------------------*/ - -ivas_error push_indice( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 id, /* i : ID of the indice */ - UWord16 value, /* i : value of the quantized indice */ - Word16 nb_bits /* i : number of bits used to quantize the indice */ -) -{ - Word16 i; - Word16 j; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - /* check the limits of the list of indices */ - IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) - { - return IVAS_ERROR( error, "Error occured in push_indice() while re-allocating the list of indices (frame %d) !\n" ); - } - - /* find the location in the list of indices based on ID */ - i = hBstr->nb_ind_tot; - move16(); - test(); - WHILE( i > 0 && ( id < hBstr->ind_list[i - 1].id ) ) - { - test(); - i = sub( i, 1 ); - } - - /* shift indices, if the new ID is to be written somewhere inside the list */ - IF( i < hBstr->nb_ind_tot ) - { - FOR( j = hBstr->nb_ind_tot; j > i; j-- ) - { - hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; - hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; - hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; - move16(); - move16(); - move16(); - } - } - - - /* store the new indice in the list */ - hBstr->ind_list[i].id = id; - hBstr->ind_list[i].value = value; - hBstr->ind_list[i].nb_bits = nb_bits; - move16(); - move16(); - move16(); - - /* updates */ - hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); - hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); - move16(); - move16(); - - return error; -} - -/*-------------------------------------------------------------------* - * push_next_indice() - * - * Push a new indice into the buffer at the next position - *-------------------------------------------------------------------*/ -ivas_error push_next_indice( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - UWord16 value, /* i : value of the quantized indice */ - Word16 nb_bits /* i : number of bits used to quantize the indice */ -) -{ - Word16 prev_id; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - - /* check the limits of the list of indices */ - IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) - { - return error; - } - - /* get the id of the previous indice -> it will be re-used */ - IF( hBstr->nb_ind_tot > 0 ) - { - prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; - } - ELSE - { - prev_id = 0; - } - move16(); - - /* store the values in the list */ - hBstr->ind_list[hBstr->nb_ind_tot].id = prev_id; - hBstr->ind_list[hBstr->nb_ind_tot].value = value; - hBstr->ind_list[hBstr->nb_ind_tot].nb_bits = nb_bits; - move16(); - move16(); - move16(); - - /* updates */ - hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); - hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); - move16(); - move16(); - - return error; -} - -/*-------------------------------------------------------------------* - * push_next_bits() - * Push a bit buffer into the buffer at the next position - *-------------------------------------------------------------------*/ -ivas_error push_next_bits( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ - const Word16 nb_bits /* i : number of bits to pack */ -) -{ - UWord16 code; - Word16 i, nb_bits_m15; - Indice *ptr; - Word16 prev_id; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; - - /* get the id of the previous indice -> will be re-used */ - IF( hBstr->nb_ind_tot > 0 ) - { - prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; - move16(); - } - ELSE - { - prev_id = 0; - move16(); - } - nb_bits_m15 = sub( nb_bits, 15 ); - - FOR( i = 0; i < nb_bits_m15; i += 16 ) - { - code = (UWord16) L_or( L_shl( bits[i], 15 ), L_or( L_shl( bits[i + 1], 14 ), L_or( L_shl( bits[i + 2], 13 ), L_or( L_shl( bits[i + 3], 12 ), L_or( L_shl( bits[i + 4], 11 ), L_or( L_shl( bits[i + 5], 10 ), L_or( L_shl( bits[i + 6], 9 ), L_or( L_shl( bits[i + 7], 8 ), L_or( L_shl( bits[i + 8], 7 ), L_or( L_shl( bits[i + 9], 6 ), L_or( L_shl( bits[i + 10], 5 ), L_or( L_shl( bits[i + 11], 4 ), L_or( L_shl( bits[i + 12], 3 ), L_or( L_shl( bits[i + 13], 2 ), L_or( L_shl( bits[i + 14], 1 ), bits[i + 15] ) ) ) ) ) ) ) ) ) ) ) ) ) ) ); - - /* check the limits of the list of indices */ - IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) - { - return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n" ); - } - ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; - - ptr->value = code; - ptr->nb_bits = 16; - ptr->id = prev_id; - hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); - move16(); - move16(); - move16(); - move16(); - - ++ptr; - } - - FOR( ; i < nb_bits; ++i ) - { - /* check the limits of the list of indices */ - IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) - { - return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n" ); - } - ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; - - ptr->value = bits[i]; - ptr->nb_bits = 1; - ptr->id = prev_id; - hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); - move16(); - move16(); - move16(); - move16(); - - ++ptr; - } - - hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); - move16(); - - return error; -} - -/*-------------------------------------------------------------------* - * find_indice() - * - * Find indice based on its id - *-------------------------------------------------------------------*/ - -/*! r: result: index of the indice in the list, -1 if not found */ -int16_t find_indice( - BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - const int16_t id, /* i : ID of the indice */ - uint16_t *value, /* o : value of the quantized indice */ - int16_t *nb_bits /* o : number of bits used to quantize the indice */ -) -{ - int16_t i; - - for ( i = 0; i < hBstr->nb_ind_tot; i++ ) - { - if ( hBstr->ind_list[i].id == id && hBstr->ind_list[i].nb_bits > 0 ) - { - *value = hBstr->ind_list[i].value; - *nb_bits = hBstr->ind_list[i].nb_bits; - return i; - } - } - - return -1; -} - - -/*-------------------------------------------------------------------* - * delete_indice() - * - * Delete indice based on its id (note, that nb_ind_tot and nb_bits_tot are updated) - *-------------------------------------------------------------------*/ - -/*! r: number of deleted indices */ -uint16_t delete_indice( - BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - const int16_t id /* i : ID of the indice */ -) -{ - int16_t i, j; - - j = 0; - for ( i = 0; i < hBstr->nb_ind_tot; i++ ) - { - if ( hBstr->ind_list[i].id == id ) - { - hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits; - continue; - } - - if ( j < i ) - { - /* shift the indice left */ - hBstr->ind_list[j].id = hBstr->ind_list[i].id; - hBstr->ind_list[j].value = hBstr->ind_list[i].value; - hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; - } - - j++; - } - - hBstr->nb_ind_tot = j; - - for ( ; j < i; j++ ) - { - /* reset the shifted indices at the end of the list */ - hBstr->ind_list[j].nb_bits = -1; - } - - return i - j; -} - - -/*-------------------------------------------------------------------* - * get_next_indice() - * - * Get the next indice from the buffer - *-------------------------------------------------------------------*/ - -/*! r: value of the indice */ -uint16_t get_next_indice( - Decoder_State *st, /* i/o: decoder state structure */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ -) -{ - uint16_t value; - int16_t i; - int32_t nbits_total; - - assert( nb_bits <= 16 ); - - nbits_total = st->total_brate / FRAMES_PER_SEC; - /* detect corrupted bitstream */ - if ( st->next_bit_pos + nb_bits > nbits_total ) - { - st->BER_detect = 1; - return ( 0 ); - } - - value = 0; - for ( i = 0; i < nb_bits; i++ ) - { - value <<= 1; - value += st->bit_stream[st->next_bit_pos + i]; - } - - /* update the position in the bitstream */ - st->next_bit_pos += nb_bits; - - return value; -} - -/*-------------------------------------------------------------------* - * get_next_indice_1() - * - * Get the next 1-bit indice from the buffer - *-------------------------------------------------------------------*/ - -/*! r: value of the indice */ -uint16_t get_next_indice_1( - Decoder_State *st /* i/o: decoder state structure */ -) -{ - int32_t nbits_total; - nbits_total = st->total_brate / FRAMES_PER_SEC; - /* detect corrupted bitstream */ - if ( ( st->next_bit_pos + 1 > nbits_total && st->codec_mode == MODE1 ) || - ( ( st->next_bit_pos + 1 > nbits_total + ( 2 * 8 ) ) && st->codec_mode == MODE2 ) /* add two zero bytes for arithmetic coder flush */ - ) - { - st->BER_detect = 1; - return ( 0 ); - } - - return st->bit_stream[st->next_bit_pos++]; -} - -/*-------------------------------------------------------------------* - * get_next_indice_tmp() - * - * update the total number of bits and the position in the bitstream - *-------------------------------------------------------------------*/ - -void get_next_indice_tmp( - Decoder_State *st, /* o : decoder state structure */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ -) -{ - /* update the position in the bitstream */ - st->next_bit_pos += nb_bits; - - return; -} - -/*-------------------------------------------------------------------* - * get_indice() - * - * Get indice at specific position in the buffer - *-------------------------------------------------------------------*/ - -/*! r: value of the indice */ -uint16_t get_indice( - Decoder_State *st, /* i/o: decoder state structure */ - int16_t pos, /* i : absolute position in the bitstream (update after the read) */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ -) -{ - uint16_t value; - int16_t i; - int32_t nbits_total; - - assert( nb_bits <= 16 ); - - nbits_total = st->total_brate / FRAMES_PER_SEC; - - /* detect corrupted bitstream */ - if ( pos + nb_bits > nbits_total ) - { - st->BER_detect = 1; - return ( 0 ); - } - - value = 0; - for ( i = 0; i < nb_bits; i++ ) - { - value <<= 1; - value += st->bit_stream[pos + i]; - } - return value; -} - -/*-------------------------------------------------------------------* - * get_indice_st() - * - * Get indice at specific position in the buffer - *-------------------------------------------------------------------*/ - -/*! r: value of the indice */ -UWord16 get_indice_st( - Decoder_State *st, /* i/o: decoder state structure */ - const Word32 element_brate, /* i : element bitrate */ - const Word16 pos, /* i : absolute position in the bitstream */ - const Word16 nb_bits /* i : number of bits to quantize the indice */ -) -{ - UWord16 value; - Word16 i; - - assert( nb_bits <= 16 ); - - /* detect corrupted bitstream */ - IF( GT_32( L_deposit_l( add( pos, nb_bits ) ), Mpy_32_32( element_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ) ) - { - st->BER_detect = 1; - move16(); - return ( 0 ); - } - - value = 0; - move16(); - FOR( i = 0; i < nb_bits; i++ ) - { - value = shl( value, 1 ); - value = add( value, st->bit_stream[pos + i] ); - } - - return value; -} -#define WMC_TOOL_SKIP - -/*-------------------------------------------------------------------* - * reset_indices_dec() - * - * Reset the buffer of decoder indices - *-------------------------------------------------------------------*/ -void reset_indices_dec( - Decoder_State *st ) -{ - st->next_bit_pos = 0; - move16(); - - return; -} -/*-------------------------------------------------------------------* - * write_indices_to_stream() - * - * writing forward or backward to a serial stream - *-------------------------------------------------------------------*/ -static Word16 write_indices_to_stream_fx( - Indice *ind_list, - UWord16 **pt_stream, - const Word16 inc, - const Word16 num_indices ) -{ - Word16 i, k; - Word16 value, nb_bits; - UWord16 mask; - - FOR( i = 0; i < num_indices; i++ ) - { - value = ind_list[i].value; - nb_bits = ind_list[i].nb_bits; - move16(); - move16(); - - IF( nb_bits > 0 ) - { - /* mask from MSB to LSB */ - mask = (UWord16) L_shl( 1, sub( nb_bits, 1 ) ); - - /* write bit by bit */ - FOR( k = 0; k < nb_bits; k++ ) - { - IF( L_and( value, mask ) ) - { - **pt_stream = 1; - move16(); - *pt_stream += inc; - } - ELSE - { - **pt_stream = 0; - move16(); - *pt_stream += inc; - } - - mask = (UWord16) L_shr( mask, 1 ); - } - } - } - return 0; -} - -/*-------------------------------------------------------------------* - * write_indices_element() - * - * Bitstream writing function of one element (one SCE or one CPE) - *-------------------------------------------------------------------*/ -static ivas_error write_indices_element_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - UWord16 **pt_stream, /* i : pointer to bitstream buffer */ - const Word16 is_SCE, /* i : flag to distingusih SCE and CPE */ - const Word16 element_id /* i : id of the SCE or CPE */ -) -{ - Word16 ch; - Encoder_State **sts = NULL; - UWord16 *pt_stream_loc; - UWord16 *pt_stream_backup; - UWord16 *pt_stream_end; - Word16 nb_bits_tot_metadata; - Word16 nb_ind_tot_metadata; - - Indice *ind_list_metadata; - Word16 n, n_channels; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - ind_list_metadata = NULL; - nb_ind_tot_metadata = 0; - move16(); - - IF( EQ_32( st_ivas->hEncoderConfig->ivas_format, MONO_FORMAT ) ) - { - sts = st_ivas->hSCE[0]->hCoreCoder; - nb_bits_tot_metadata = 0; - move16(); - } - ELSE - { - nb_bits_tot_metadata = 0; - move16(); - test(); - test(); - IF( is_SCE && st_ivas->hSCE[element_id] != NULL ) - { - sts = st_ivas->hSCE[element_id]->hCoreCoder; - - IF( st_ivas->hSCE[element_id]->hMetaData != NULL ) - { - nb_bits_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_bits_tot; - ind_list_metadata = st_ivas->hSCE[element_id]->hMetaData->ind_list; - nb_ind_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; - move16(); - move16(); - } - } - ELSE IF( !is_SCE && st_ivas->hCPE[element_id] != NULL ) - { - sts = st_ivas->hCPE[element_id]->hCoreCoder; - - IF( st_ivas->hCPE[element_id]->hMetaData != NULL ) - { - nb_bits_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_bits_tot; - ind_list_metadata = st_ivas->hCPE[element_id]->hMetaData->ind_list; - nb_ind_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; - move16(); - move16(); - } - } - } - - n_channels = 1; - move16(); - if ( GT_16( sts[0]->element_mode, IVAS_CPE_DFT ) ) - { - n_channels = CPE_CHANNELS; - move16(); - } - - /*----------------------------------------------------------------* - * Bitstream packing (conversion of individual indices into a serial stream) - *----------------------------------------------------------------*/ - - pt_stream_loc = *pt_stream; - pt_stream_end = pt_stream_loc; - - FOR( n = 0; n < n_channels; n++ ) - { - /* write the metadata buffer */ - test(); - IF( n == 0 && nb_bits_tot_metadata != 0 ) - { - pt_stream_backup = pt_stream_loc; - - FOR( ch = 0; ch < n_channels; ch++ ) - { - pt_stream_loc += sts[ch]->hBstr->nb_bits_tot; - } - pt_stream_loc += nb_bits_tot_metadata - 1; - pt_stream_end = pt_stream_loc + 1; - - write_indices_to_stream_fx( ind_list_metadata, &pt_stream_loc, -1, - nb_ind_tot_metadata ); - - /* restore previous pointer position */ - pt_stream_loc = pt_stream_backup; - } - write_indices_to_stream_fx( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, - sts[n]->hBstr->nb_ind_tot ); - - if ( pt_stream_loc > pt_stream_end ) - { - pt_stream_end = pt_stream_loc; - } - } - - /*----------------------------------------------------------------* - * Clearing of indices - * Reset index pointers - *----------------------------------------------------------------*/ - - IF( is_SCE ) /* EVS and SCE */ - { - IF( st_ivas->hSCE[element_id]->hMetaData != NULL ) - { - reset_indices_enc_fx( st_ivas->hSCE[element_id]->hMetaData, st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot ); - } - - reset_indices_enc_fx( sts[0]->hBstr, sts[0]->hBstr->nb_ind_tot ); - } - ELSE - { - IF( st_ivas->hCPE[element_id]->hMetaData != NULL ) - { - reset_indices_enc_fx( st_ivas->hCPE[element_id]->hMetaData, st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot ); - } - - FOR( n = 0; n < n_channels; n++ ) - { - reset_indices_enc_fx( sts[n]->hBstr, sts[n]->hBstr->nb_ind_tot ); - } - } - - /* update pointer */ - *pt_stream = pt_stream_end; - - return error; -} - -/*-------------------------------------------------------------------* - * write_indices_ivas() - * - * Write the buffer of indices to a serial bitstream buffer, - * each bit represented as a uint16_t of value 0 or 1 - *-------------------------------------------------------------------*/ -ivas_error write_indices_ivas_fx( - Encoder_Struct *st_ivas, /* i/o: encoder state structure */ - UWord16 *bit_stream, /* i/o: output bitstream */ - UWord16 *num_bits /* i : number of indices written to output */ -) -{ - Word16 i, n; - UWord16 *pt_stream; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - pt_stream = bit_stream; - FOR( i = 0; i < MAX_BITS_PER_FRAME; ++i ) - { - bit_stream[i] = 0; - move16(); - } - - - /*-----------------------------------------------------------------* - * Encode Payload - *-----------------------------------------------------------------*/ - - FOR( n = 0; n < st_ivas->nSCE; n++ ) - { - write_indices_element_fx( st_ivas, &pt_stream, 1, n ); - } - - FOR( n = 0; n < st_ivas->nCPE; n++ ) - { - write_indices_element_fx( st_ivas, &pt_stream, 0, n ); - } - - *num_bits = (UWord16) ( pt_stream - bit_stream ); - move16(); - - return error; -} - -/*-------------------------------------------------------------------* - * decoder_selectCodec() - * - * - *-------------------------------------------------------------------*/ - -static void decoder_selectCodec( - Decoder_State *st, /* i/o: decoder state structure */ - const int32_t total_brate, /* i : total bitrate */ - const int16_t bit0 /* i : first bit */ -) -{ - /* set the AMR-WB IO flag */ - if ( rate2AMRWB_IOmode( total_brate ) != -1 ) - { - st->Opt_AMR_WB = 1; - } - else if ( total_brate != FRAME_NO_DATA ) - { - st->Opt_AMR_WB = 0; - } - - if ( st->Opt_AMR_WB ) - { - st->codec_mode = MODE1; - } - else - { - st->codec_mode = get_codec_mode( total_brate ); - - if ( st->codec_mode == -1 ) - { - switch ( total_brate ) - { - case 0: - st->codec_mode = st->last_codec_mode; - break; - case 2400: - st->codec_mode = st->last_codec_mode; - break; - case 2800: - st->codec_mode = MODE1; - break; - default: /* validate that total_brate (derived from RTP packet or a file header) is one of the defined bitrates */ - st->codec_mode = st->last_codec_mode; - st->bfi = 1; - break; - } - } - } - - if ( st->ini_frame == 0 ) - { - if ( st->codec_mode == -1 ) - { - st->codec_mode = MODE1; - } - st->last_codec_mode = st->codec_mode; - } - - /* set SID/CNG type */ - if ( total_brate == SID_2k40 ) - { - if ( bit0 == 0 ) - { - st->cng_type = LP_CNG; - - /* force MODE1 when selecting LP_CNG */ - st->codec_mode = MODE1; - } - else if ( bit0 == 1 ) - { - st->cng_type = FD_CNG; - if ( st->last_codec_mode == MODE2 && st->last_total_brate == ACELP_13k20 ) - { - st->codec_mode = MODE1; - } - } - } - - return; -} - - -/*-------------------------------------------------------------------* - * reset_elements() - * - * Simulate packet losses by reading FEC pattern from external file - *-------------------------------------------------------------------*/ - -Decoder_State **reset_elements( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - Word16 k, n; - Decoder_State **sts = NULL; /* to avoid compilation warning */ - - FOR( k = 0; k < st_ivas->nSCE; k++ ) - { - sts = st_ivas->hSCE[k]->hCoreCoder; - - sts[0]->bfi = 0; - sts[0]->BER_detect = 0; - sts[0]->mdct_sw_enable = 0; - sts[0]->mdct_sw = 0; - - move16(); - move16(); - move16(); - move16(); - - reset_indices_dec( sts[0] ); - } - - FOR( k = 0; k < st_ivas->nCPE; k++ ) - { - sts = st_ivas->hCPE[k]->hCoreCoder; - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - sts[n]->bfi = 0; - sts[n]->BER_detect = 0; - sts[n]->mdct_sw_enable = 0; - sts[n]->mdct_sw = 0; - - move16(); - move16(); - move16(); - move16(); - - reset_indices_dec( sts[n] ); - } - } - - return sts; /* return last decoder state */ -} - -/*-------------------------------------------------------------------* - * ivas_set_bitstream_pointers() - * - * Set bitstream pointers for every SCE/CPE Core-Decoder - *-------------------------------------------------------------------*/ - -void ivas_set_bitstream_pointers( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - int16_t k, num_bits; - Decoder_State **sts; - - num_bits = 0; - - /* set bitstream pointers for SCEs */ - for ( k = 0; k < st_ivas->nSCE; k++ ) - { - sts = st_ivas->hSCE[k]->hCoreCoder; - sts[0]->bit_stream = st_ivas->bit_stream + num_bits; - num_bits += (int16_t) ( st_ivas->hSCE[k]->element_brate / FRAMES_PER_SEC ); - } - - /* set bitstream pointers for CPEs */ - for ( k = 0; k < st_ivas->nCPE; k++ ) - { - sts = st_ivas->hCPE[k]->hCoreCoder; - sts[0]->bit_stream = st_ivas->bit_stream + num_bits; - num_bits += (int16_t) ( st_ivas->hCPE[k]->element_brate / FRAMES_PER_SEC ); - } - - return; -} - - -/*-------------------------------------------------------------------* - * read_indices() - * - * Read indices from an ITU-T G.192 bitstream to the buffer - * Simulate packet losses by inserting frame erasures - *-------------------------------------------------------------------*/ - -/*! r: 1 = reading OK, 0 = problem */ -ivas_error read_indices_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - UWord16 bit_stream[], /* i : bitstream buffer */ - UWord16 num_bits, /* i : number of bits in bitstream */ - Word16 *prev_ft_speech, - Word16 *CNG, - Word16 bfi /* i : bad frame indicator */ -) -{ - Word16 k; - Decoder_State **sts; - Word32 total_brate = 0; - move32(); - Word16 curr_ft_good_sp, curr_ft_bad_sp; - Word16 g192_sid_first, sid_upd_bad, sid_update; - Word16 speech_bad, speech_lost; - Word16 n; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - st_ivas->BER_detect = 0; - move16(); - st_ivas->num_bits = num_bits; - move16(); - sts = reset_elements( st_ivas ); - - st_ivas->bfi = bfi; - move16(); - - /* convert the frame length to total bitrate */ - total_brate = imult3216( num_bits, FRAMES_PER_SEC ); - move32(); - - /* verify that a valid num bits value is present in the G.192 file */ - /* only AMRWB, EVS or IVAS bitrates or 0(NO DATA) are allowed in G.192 file frame reading */ - IF( NE_32( st_ivas->ivas_format, MONO_FORMAT ) ) - { - k = 0; - move16(); - - test(); - WHILE( LT_16( k, SIZE_IVAS_BRATE_TBL ) && NE_32( total_brate, ivas_brate_tbl[k] ) ) - { - k = add( k, 1 ); - } - - test(); - test(); - test(); - test(); - IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && ( LT_16( k, SIZE_IVAS_BRATE_TBL ) || LE_32( total_brate, SID_2k40 ) ) ) - { - st_ivas->element_mode_init = IVAS_SCE; - move16(); - } - ELSE IF( ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) && LE_32( total_brate, SID_2k40 ) ) - { - st_ivas->element_mode_init = IVAS_SCE; - move16(); - } - ELSE IF( EQ_16( k, SIZE_IVAS_BRATE_TBL ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error, illegal bitrate (%d) in the G.192 frame ! Exiting ! \n", total_brate ); - } - ELSE - { - st_ivas->element_mode_init = -1; - move16(); - } - } - ELSE /* AMRWB or EVS */ - { - st_ivas->element_mode_init = EVS_MONO; - move16(); - - IF( rate2EVSmode_float( total_brate, NULL ) < 0 ) /* negative value means that a valid rate was not found */ - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error, illegal bitrate (%d) in the G.192 frame ! Exiting ! \n", total_brate ); - } - } - - /* G.192 RX DTX handler*/ - /* handle SID_FIRST, SID_BAD, SPEECH_LOST, NO_DATA as properly as possible for the ITU-T G.192 format */ - /* (total_brate, bfi , st_CNG) = rx_handler(received frame type, [previous frame type], past CNG state, past core) */ - curr_ft_good_sp = 0; - move16(); - curr_ft_bad_sp = 0; - move16(); - - IF( is_DTXrate( total_brate ) == 0 ) - { - IF( st_ivas->bfi == 0 ) - { - curr_ft_good_sp = 1; - move16(); - } - ELSE - { - curr_ft_bad_sp = 1; - move16(); - } - } - - sid_update = 0; - move16(); - sid_upd_bad = 0; - move16(); - IF( EQ_16( is_SIDrate( total_brate ), 1 ) ) - { - IF( st_ivas->bfi == 0 ) - { - sid_update = 1; - move16(); - } - ELSE - { - sid_upd_bad = 1; /* this frame type may happen in ETSI/3GPP CS cases, a corrupt SID frames */ - move16(); - } - } - - /* all zero indices/bits iSP AMRWB SID_update results in a valid LP filter with extremely high LP-filter-gain */ - /* all zero indices/bits may be a result of CS bit errors and/or erroneously injected by gateways or by a bad dejitter handlers */ - test(); - IF( EQ_32( total_brate, SID_1k75 ) && EQ_16( sid_update, 1 ) ) - { - /* valid sid_update received, check for very risky but formally valid content */ - Word16 sum = 0; - move16(); - FOR( k = 0; k < num_bits; ++k ) - { - sum = add( sum, extract_l( EQ_32( bit_stream[k], 1 ) ) ); /* check of 35 zeroes */ - } - if ( sum == 0 ) - { /* all zeros */ - sid_upd_bad = 1; /* initial signal as corrupt (BER likely) */ - move16(); - } - } - - /* AMRWB 26.173 G.192 file reader (read_serial) does not declare/use SID_BAD ft, - it declares every bad synch marked frame initially as a lost_speech frame, - and then the RXDTX handler CNG state decides the decoding mode CNG/SPEECH. - While In the AMRWB ETSI/3GPP format eid a CRC error in a detected SID_UPDATE frames triggers SID_BAD. - - Here we inhibit use of the SID-length info, even though it is available in the G.192 file format after STL/EID-XOR . - */ - IF( sid_upd_bad ) - { - sid_upd_bad = 0; - move16(); - total_brate = FRAME_NO_DATA; /* treat SID_BAD as a stolen signaling frame --> SPEECH LOST */ - move32(); - } - - g192_sid_first = 0; - move16(); - - test(); - test(); - test(); - test(); - if ( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) && EQ_16( sts[0]->core, AMR_WB_CORE ) && *prev_ft_speech && total_brate == FRAME_NO_DATA && st_ivas->bfi == 0 ) - { - g192_sid_first = 1; /* SID_FIRST detected for previous AMRWB/AMRWBIO active frames only */ - /* It is not possible to perfectly simulate rate switching conditions EVS->AMRWBIO where: - the very first SID_FIRST detection is based on a past EVS active frame - and a good length 0 "SID_FIRST"(NO_DATA) frame is sent in AMRWBIO, - due to the one frame state memory in the AMRWB legacy G.192 SID_FIRST encoding - */ - move16(); - } - - speech_bad = 0; - move16(); - - test(); - if ( st_ivas->bfi != 0 && ( is_DTXrate( total_brate ) == 0 ) ) - { - speech_bad = 1; /* initial ft assumption, CNG_state decides what to do */ - move16(); - } - - speech_lost = 0; - move16(); - - test(); - if ( total_brate == FRAME_NO_DATA && st_ivas->bfi != 0 ) /* unsent NO_DATA or stolen NO_DATA/signaling frame */ - { - speech_lost = 1; /* initial ft assumption, CNG_state decides what to do */ - move16(); - } - - /* Do not allow decoder to enter CNG-synthesis for any instantly received GOOD+LENGTH==0 frame - as this frame was never transmitted, one can not know it is good and has a a length of zero ) */ - IF( *CNG != 0 ) - { - /* We were in CNG synthesis */ - if ( curr_ft_good_sp != 0 ) - { - /* only a good speech frame makes you leave CNG synthesis */ - *CNG = 0; - move16(); - } - } - ELSE - { - /* We were in SPEECH synthesis */ - /* only a received/detected SID frame can make the decoder enter into CNG synthsis */ - test(); - test(); - if ( g192_sid_first || sid_update || sid_upd_bad ) - { - *CNG = 1; - move16(); - } - } - - /* set bfi, total_brate pair for proper decoding */ - /* handle the G.192 _simulated_ untransmitted NO_DATA frame, setting for decoder SPEECH synthesis */ - test(); - test(); - if ( *CNG == 0 && total_brate == FRAME_NO_DATA && st_ivas->bfi == 0 ) - { - st_ivas->bfi = 1; /* SPEECH PLC code will now become active as in a real system */ - /* total_brate= 0 */ - move16(); - } - - /* handle bad/lost speech frame(and CS bad SID frame) in the decoders CNG synthesis settings pair (total_brate, bfi) */ - test(); - test(); - test(); - test(); - IF( ( - NE_16( bfi, FRAMEMODE_FUTURE ) && - ( *CNG != 0 ) && ( ( speech_bad != 0 ) || ( speech_lost != 0 ) ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */ - ( sid_upd_bad != 0 ) ) /* SID_UPD_BAD --> start CNG */ - { - st_ivas->bfi = 0; /* bfi=0 needed to activate CNG code */ - move16(); - total_brate = FRAME_NO_DATA; - move32(); - } - - /* update for next frame's G.192 file format's odd SID_FIRST detection (primarily for AMRWBIO) */ - test(); - *prev_ft_speech = ( ( curr_ft_good_sp != 0 ) || ( curr_ft_bad_sp != 0 ) ); - move16(); - - /* st->total brate= total_brate; updated in a good frame below */ - - FOR( k = 0; k < st_ivas->nCPE; k++ ) - { - sts = st_ivas->hCPE[k]->hCoreCoder; - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - sts[n]->bfi = st_ivas->bfi; - move16(); - } - } - - FOR( k = 0; k < st_ivas->nSCE; k++ ) - { - sts = st_ivas->hSCE[k]->hCoreCoder; - sts[0]->bfi = st_ivas->bfi; - move16(); - } - - IF( st_ivas->bfi == 0 ) - { - /* select Mode 1 or Mode 2 */ - IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) /* EVS mono */ - { - decoder_selectCodec( sts[0], total_brate, bit_stream[0] ); - st_ivas->hDecoderConfig->Opt_AMR_WB = sts[0]->Opt_AMR_WB; - move16(); - } - ELSE /* IVAS */ - { - st_ivas->codec_mode = MODE1; - move16(); - st_ivas->hDecoderConfig->Opt_AMR_WB = 0; - move16(); - } - } - - /* GOOD frame */ - test(); - if ( st_ivas->bfi == 0 || EQ_16( st_ivas->bfi, FRAMEMODE_FUTURE ) ) - { - /* GOOD frame - convert ITU-T G.192 words to short values */ - st_ivas->hDecoderConfig->ivas_total_brate = total_brate; - move32(); - } - - st_ivas->bit_stream = bit_stream; - - IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) - { - ivas_set_bitstream_pointers( st_ivas ); - } - - return error; -} -#undef WMC_TOOL_SKIP diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index 712a6905e67e78a5d38bc6406266f5d933fe86f3..030c4746dbf96d2408be6aa6a214717cca631176 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -31,116 +31,180 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ -#include #include -#include +#include #include "options.h" -#include "ivas_cnst.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ -#include "ivas_prot_fx.h" -#include "basop_util.h" +#include "cnst.h" +#include "prot_fx.h" +#include "stat_enc.h" +#include "stat_dec.h" #include "rom_com.h" #include "mime.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" +#include "ivas_prot_fx.h" +#include "prot_fx_enc.h" +#ifdef DEBUGGING +#include "debug.h" +#ifdef DBG_BITSTREAM_ANALYSIS +#include +#endif +#endif #ifdef DEBUGGING + +#define FEC_SEED 12558 + /*-------------------------------------------------------------------* * Global variables *--------------------------------------------------------------------*/ -int16_t FEC_seed = 12558; /* Seed for random FEC generator */ FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ -#ifndef IVAS_CODE -float FEC_random = 0; /* FEC rate in percent (for simulation of FEC) */ +#endif + +#define STEP_MAX_NUM_INDICES 100 /* increase the maximum number of allowed indices in the list by this amount */ + /*-------------------------------------------------------------------* - * file_read_FECpattern() + * BRATE2IDX_fx() * - * Simulate packet losses by reading FEC pattern from external file + * Convert Bitrate to Index Value *-------------------------------------------------------------------*/ -static int16_t file_read_FECpattern( void ) +Word16 BRATE2IDX_fx( + const Word32 brate ) { - int16_t bfi = 0; - /* FEC pattern file provided */ - if ( FEC_pattern != NULL ) - { - int16_t tmp = 0; - if ( fread( &tmp, sizeof( int16_t ), 1, FEC_pattern ) != 1 ) - { - if ( feof( FEC_pattern ) != 0 ) - { - tmp = 0; - fseek( FEC_pattern, 0L, SEEK_SET ); - } - else - { - fprintf( stderr, "\nError reading the FEC pattern file !" ); - exit( -1 ); - } - } - - if ( tmp == 2609 || tmp == 1 || tmp == SYNC_BAD_FRAME ) - { - bfi = 1; - } - else - { - bfi = 0; - } - } + Word32 L_temp; + Word32 L_idx; +#define START 9 + extern const Word16 bit_rates_div50[]; - /* random FEC simulation requested */ - else if ( FEC_random > 0 ) - { - float ftmp = (float) /*own_random*/ Random( &FEC_seed ) + 32768.0f; - if ( ftmp <= FEC_random / 100.0f * 65535.0f ) - { - bfi = 1; - } - else - { - bfi = 0; - } - } + /* This is a Fast Bit Rate Value to Index Value Binary Search */ + L_temp = L_msu0( brate, bit_rates_div50[START], 50 ); + L_temp = L_min( 6, L_max( -6, L_temp ) ); + L_idx = L_add( L_temp, START ); + L_temp = L_msu0( brate, bit_rates_div50[L_idx], 50 ); + L_temp = L_min( 3, L_max( -3, L_temp ) ); + L_idx = L_add( L_temp, L_idx ); + L_temp = L_msu0( brate, bit_rates_div50[L_idx], 50 ); + L_temp = L_min( 1, L_max( -2, L_temp ) ); + L_idx = L_add( L_temp, L_idx ); + L_temp = L_msu0( brate, bit_rates_div50[L_idx], 50 ); + if ( L_temp != 0 ) + L_idx = L_add( L_idx, 1 ); - return bfi; + return (Word16) L_idx; } -#endif -#endif + + /*-------------------------------------------------------------------* - * pack_bit() + * BRATE2IDX16k_fx() * - * insert a bit into packed octet + * Convert Bitrate to Index Value *-------------------------------------------------------------------*/ -void pack_bit( - const Word16 bit, /* i: bit to be packed */ - UWord8 **pt, /* i/o: pointer to octet array into which bit will be placed */ - UWord8 *omask /* i/o: output mask to indicate where in the octet the bit is to be written */ -) + +Word16 BRATE2IDX16k_fx( + Word32 brate ) { - if ( EQ_16( *omask, 0x80 ) ) - { - **pt = 0; - move16(); - } - IF( bit != 0 ) + Word32 L_temp, L_idx; +#define START_16K 5 + extern const Word16 bit_rates_16k_div50[]; + + if ( EQ_32( brate, ACELP_16k40 ) ) { - **pt = (UWord8) s_or( **pt, *omask ); + brate = ACELP_14k80; move16(); } - *omask = (UWord8) shr( *omask, 1 ); + + /* This is a Fast Bit Rate Value to Index Value Binary Search */ + L_temp = L_msu0( brate, bit_rates_16k_div50[START_16K], 50 ); + L_temp = L_min( 3, L_max( -3, L_temp ) ); + L_idx = L_add( L_temp, START_16K ); + L_temp = L_msu0( brate, bit_rates_16k_div50[L_idx], 50 ); + L_temp = L_min( 2, L_max( -2, L_temp ) ); + L_idx = L_add( L_temp, L_idx ); + L_temp = L_msu0( brate, bit_rates_16k_div50[L_idx], 50 ); + L_temp = L_min( 1, L_max( -1, L_temp ) ); + L_idx = L_add( L_temp, L_idx ); + + return (Word16) L_idx; +} + + +/*-------------------------------------------------------------------* + * BIT_ALLOC_IDX_fx() + *-------------------------------------------------------------------*/ + +Word32 BIT_ALLOC_IDX_fx( + const Word32 brate, + Word16 ctype, + const Word16 sfrm, + const Word16 tc ) +{ + Word32 L_temp; + Word16 temp; + + if ( ctype == INACTIVE ) /* no sub(ctype, INACTIVE) because it is '0' */ + ctype = GENERIC; move16(); - IF( *omask == 0 ) + L_temp = L_mac0( -1l * 256, 1 * 256, ctype ); + + temp = BRATE2IDX_fx( brate ); + L_temp = L_mac0( L_temp, 4 * 256, temp ); + IF( tc >= 0 ) + L_temp = L_mac0( L_temp, ( 10 - 4 ) * 256, temp ); + /* So either 'temp' x 4 when 'tc < 0', 'temp' x 10 otherwise */ + + L_temp = L_mac0( L_temp, 1 * 256, s_max( 0, tc ) ); + + L_temp = L_mac0( L_temp, s_max( 0, sfrm ), 1 ); + if ( sfrm < 0 ) + L_temp = L_shr( L_temp, 2 ); + L_temp = L_shr( L_temp, 6 ); + + return L_temp; +} + + +/*-------------------------------------------------------------------* + * BIT_ALLOC_IDX_16KHZ_fx() + *-------------------------------------------------------------------*/ + +Word32 BIT_ALLOC_IDX_16KHZ_fx( + const Word32 brate, + const Word16 ctype, + const Word16 sfrm, + const Word16 tc ) +{ + Word32 L_temp; + Word16 temp; + /* 'ctype' = + TRANSITION => 2 + GENERIC => 1 + ALL Other => 0 + */ + L_temp = L_and( shr( 0x0240l, shl( ctype, 1 ) ), 3 ); + + temp = BRATE2IDX16k_fx( brate ); + L_temp = L_mac0( L_temp, 3, temp ); + IF( tc >= 0 ) + L_temp = L_mac0( L_temp, ( 7 - 3 ), temp ); + /* So either 'temp' x 3 when 'tc < 0', 'temp' x 7 otherwise */ + + L_temp = L_mac0( L_temp, 1, s_max( 0, tc ) ); + + IF( sfrm >= 0 ) { - *omask = 0x80; - move16(); - ( *pt )++; + /* Mult by 5 */ + L_temp = L_add( L_temp, L_shl( L_temp, 2 ) ); + L_temp = L_mac0( L_temp, shr( sfrm, 6 ), 1 ); } - return; + return L_temp; } @@ -149,13 +213,14 @@ void pack_bit( * * lookup AMRWB IO mode *-------------------------------------------------------------------*/ + static Word16 rate2AMRWB_IOmode( - Word32 brate /* i: bitrate */ + Word32 brate /* i : bitrate */ ) { SWITCH( brate ) { - /* EVS AMR-WB IO modes */ + /* EVS AMR-WB IO modes */ case SID_1k75: return AMRWB_IO_SID; case ACELP_6k60: @@ -179,16 +244,19 @@ static Word16 rate2AMRWB_IOmode( default: break; } + return -1; } + /*-------------------------------------------------------------------* * rate2EVSmode() * * lookup EVS mode *-------------------------------------------------------------------*/ + Word16 rate2EVSmode( - const Word32 brate, /* i: bitrate */ + const Word32 brate, /* i : bitrate */ Word16 *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ ) { @@ -197,9 +265,10 @@ Word16 rate2EVSmode( *is_amr_wb = 0; move16(); } + SWITCH( brate ) { - /* EVS Primary modes */ + /* EVS Primary modes */ case FRAME_NO_DATA: return NO_DATA_TYPE; case SID_2k40: @@ -229,155 +298,2995 @@ Word16 rate2EVSmode( case HQ_128k: return PRIMARY_128000; default: - BREAK; + break; } + if ( is_amr_wb != NULL ) { *is_amr_wb = 1; move16(); } + return rate2AMRWB_IOmode( brate ); } + /*-------------------------------------------------------------------* - * push_indice_fx( ) + * ind_list_realloc() * - * Push a new indice into the buffer + * Re-allocate the list of indices *-------------------------------------------------------------------*/ -void push_indice_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - Word16 id, /* i : ID of the indice */ - UWord16 value, /* i : value of the quantized indice */ - Word16 nb_bits /* i : number of bits used to quantize the indice */ +ivas_error ind_list_realloc( + INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ + const Word16 max_num_indices, /* i : new maximum number of allowed indices in the list */ + Encoder_Struct *st_ivas /* i : IVAS encoder structure */ ) { - Word16 i; + Word16 i, n, ch, n_channels, ind_list_pos, is_metadata, ivas_max_num_indices; + INDICE_HANDLE new_ind_list; + BSTR_ENC_HANDLE hBstr; + IF( st_ivas == NULL ) + { + return IVAS_ERR_OK; + } - IF( EQ_16( hBstr->last_ind_fx, id ) ) + /* get the pointer to the beginning of the old buffer of indices (either metadata or core coders) */ + IF( old_ind_list == st_ivas->ind_list_metadata ) { - /* indice with the same name as the previous one */ - i = hBstr->next_ind_fx; - move16(); + is_metadata = 1; + ivas_max_num_indices = st_ivas->ivas_max_num_indices_metadata; } ELSE { - /* new indice - find an empty slot in the list */ - i = id; - move16(); - WHILE( hBstr->ind_list[i].nb_bits != -1 ) + is_metadata = 0; + ivas_max_num_indices = st_ivas->ivas_max_num_indices; + } + move16(); + move16(); + + /* allocate new buffer of indices */ + IF( ( new_ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + /* move indices from the old list to the new list */ + FOR( i = 0; i < s_min( max_num_indices, ivas_max_num_indices ); i++ ) + { + IF( GT_16( old_ind_list[i].nb_bits, -1 ) ) { - i = add( i, 1 ); + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); +#endif + move16(); + move16(); } + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; + move16(); } - /* store the values in the list */ - hBstr->ind_list[i].value = value; - move16(); - hBstr->ind_list[i].nb_bits = nb_bits; - move16(); + /* reset nb_bits of all other indices to -1 */ + FOR( ; i < max_num_indices; i++ ) + { + new_ind_list[i].nb_bits = -1; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + sprintf( new_ind_list[i].function_name, "RESET in ind_list_realloc" ); +#endif + move16(); + } - /* updates */ - hBstr->next_ind_fx = add( i, 1 ); - move16(); - hBstr->last_ind_fx = id; - move16(); - hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); - move16(); + /* update parameters in all SCE elements */ + FOR( n = 0; n < st_ivas->nSCE; n++ ) + { + /* get the pointer to hBstr */ + IF( is_metadata ) + { + hBstr = st_ivas->hSCE[n]->hMetaData; + } + ELSE + { + hBstr = st_ivas->hSCE[n]->hCoreCoder[0]->hBstr; + } - return; -} + IF( hBstr != NULL ) + { + /* get the current position inside the old list */ + ind_list_pos = (Word16) ( hBstr->ind_list - old_ind_list ); -/*-------------------------------------------------------------------* - * push_next_indice_fx() * - * Push a new indice into the buffer at the next position - *-------------------------------------------------------------------*/ + /* set pointers in the new list */ + *( hBstr->ivas_ind_list_zero ) = new_ind_list; + hBstr->ind_list = &new_ind_list[ind_list_pos]; -void push_next_indice_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - UWord16 value, /* i : value of the quantized indice */ - Word16 nb_bits /* i : number of bits used to quantize the indice */ -) -{ + /* set the new maximum number of indices */ + *( hBstr->ivas_max_num_indices ) = max_num_indices; + move16(); + } + } - /* store the values in the list */ - hBstr->ind_list[hBstr->next_ind_fx].value = value; - move16(); - hBstr->ind_list[hBstr->next_ind_fx].nb_bits = nb_bits; - move16(); - hBstr->next_ind_fx = add( hBstr->next_ind_fx, 1 ); - move16(); + /* update parameters in all CPE elements */ + FOR( n = 0; n < st_ivas->nCPE; n++ ) + { + /* get the pointer to hBstr */ + IF( is_metadata ) + { + n_channels = 1; + } + ELSE + { + n_channels = CPE_CHANNELS; + } + move16(); - /* update the total number of bits already written */ - hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); - move16(); + FOR( ch = 0; ch < n_channels; ch++ ) + { + IF( is_metadata ) + { + hBstr = st_ivas->hCPE[n]->hMetaData; + } + ELSE + { + hBstr = st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr; + } - return; + IF( hBstr != NULL ) + { + /* get the current position inside the old list */ + ind_list_pos = (Word16) ( hBstr->ind_list - old_ind_list ); + + /* set pointers in the new list */ + *( hBstr->ivas_ind_list_zero ) = new_ind_list; + hBstr->ind_list = &new_ind_list[ind_list_pos]; + + /* set the new maximum number of indices */ + *( hBstr->ivas_max_num_indices ) = max_num_indices; + move16(); + } + } + } + + /* free the old list */ + free( old_ind_list ); + + return IVAS_ERR_OK; } -/*-------------------------------------------------------------------* - * push_next_bits_fx() - * Push a bit buffer into the buffer at the next position - *-------------------------------------------------------------------*/ +/*-----------------------------------------------------------------------* + * get_ivas_max_num_indices() + * + * Get the maximum allowed number of indices in the encoder + *-----------------------------------------------------------------------*/ -void push_next_bits_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - Word16 bits[], /* i : bit buffer to pack, sequence of single bits */ - Word16 nb_bits /* i : number of bits to pack */ +/*! r: maximum number of indices */ +Word16 get_ivas_max_num_indices_fx( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ ) { - UWord16 code; - Word16 i, nb_bits_m15; - Indice *ptr; - - ptr = &hBstr->ind_list[hBstr->next_ind_fx]; - nb_bits_m15 = sub( nb_bits, 15 ); - i = 0; - move16(); - IF( nb_bits_m15 > 0 ) + test(); + test(); + IF( EQ_16( ivas_format, STEREO_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 300; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) + { + return 400; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 450; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 650; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) + { + return 750; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) + { + return 850; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 950; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 1350; + } + ELSE + { + return 1650; + } + } + ELSE IF( EQ_16( ivas_format, ISM_FORMAT ) || EQ_16( ivas_format, MONO_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 250; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) + { + return 350; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 450; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 550; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_64k ) ) + { + return 620; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) + { + return 670; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) + { + return 780; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) + { + return 880; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 950; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 1100; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 1300; + } + ELSE + { + return 1650; + } + } + ELSE IF( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 250; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) + { + return 350; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 400; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 650; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) + { + return 750; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) + { + return 1020; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) + { + return 1160; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 1220; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 1300; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 1720; + } + ELSE + { + return 2000; + } + } + ELSE IF( EQ_16( ivas_format, MASA_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 300; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 400; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 650; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) + { + return 750; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) + { + return 850; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 950; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 1150; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 1450; + } + ELSE + { + return 1650; + } + } + ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 300; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 400; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 650; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) + { + return 750; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) + { + return 1150; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 1250; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 1400; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 1650; + } + ELSE + { + return 1850; + } + } + ELSE IF( EQ_16( ivas_format, MC_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 250; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) + { + return 350; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 400; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 650; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_64k ) ) + { + return 750; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) + { + return 850; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) + { + return 1150; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) + { + return 1420; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 2120; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 2250; + } + ELSE + { + return 2450; + } + } + + return 2450; +} +/*-----------------------------------------------------------------------* + * get_BWE_max_num_indices() + * + * Get the maximum number of indices in the BWE + *-----------------------------------------------------------------------*/ + +/*! r: maximum number of indices */ +Word16 get_BWE_max_num_indices( + const Word32 extl_brate /* i : extensiona layer bitrate */ +) +{ + /* set the maximum number of indices in the BWE */ + if ( extl_brate < SWB_BWE_16k ) + { + return 30; + } + else + { + return 150; + } +} + + +/*-----------------------------------------------------------------------* + * get_ivas_max_num_indices_metadata() + * + * Set the maximum allowed number of metadata indices in the list + *-----------------------------------------------------------------------*/ + +/*! r: maximum number of indices */ +Word16 get_ivas_max_num_indices_metadata_fx( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ +) +{ + /* set the maximum required number of metadata indices */ + test(); + IF( EQ_16( ivas_format, MONO_FORMAT ) ) + { + return 0; + } + ELSE IF( EQ_16( ivas_format, STEREO_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 60; + } + ELSE + { + return 80; + } + } + ELSE IF( EQ_16( ivas_format, ISM_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 20; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 65; + } + ELSE + { + return 80; + } + } + ELSE IF( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 100; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) + { + return 200; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 300; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 500; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 1050; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 2000; + } + ELSE + { + return 2500; + } + } + ELSE IF( EQ_16( ivas_format, MASA_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 80; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 125; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 205; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) + { + return 240; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) + { + return 305; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) + { + return 425; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 630; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 850; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 1000; + } + ELSE + { + return 1750; + } + } + ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 80; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 125 + 100; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 205 + 100; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) + { + return 240 + 150; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) + { + return 305 + 30; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) + { + return 425 + 30; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 630 + 30; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 850 + 30; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 1000 + 30; + } + ELSE + { + return 1750 + 30; + } + } + ELSE IF( EQ_16( ivas_format, MC_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_13k2 ) ) + { + return 80; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) + { + return 100; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_64k ) ) + { + return 210; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) + { + return 220; + } + ELSE + { + return 300; + } + } + + return 50; +} + + +/*-------------------------------------------------------------------* + * move_indices() + * + * Move indices inside the buffer or among two buffers + *-------------------------------------------------------------------*/ + +void move_indices( + INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ + INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ + const Word16 nb_indices /* i : number of moved indices */ +) +{ + Word16 i; + + IF( new_ind_list < old_ind_list ) + { + FOR( i = 0; i < nb_indices; i++ ) + { + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; + move16(); + move16(); + move16(); + +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); +#endif + old_ind_list[i].nb_bits = -1; + move16(); + } + } + ELSE IF( new_ind_list > old_ind_list ) + { + FOR( i = nb_indices - 1; i >= 0; i-- ) + { + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; + move16(); + move16(); + move16(); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); +#endif + + old_ind_list[i].nb_bits = -1; + move16(); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + sprintf( old_ind_list[i].function_name, "RESET in move_indices" ); +#endif + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * check_ind_list_limits() + * + * Check, if the maximum number of indices has been reached -> reallocate + * Check, if we will not overwrite an existing indice -> adjust the location + *-------------------------------------------------------------------*/ + +ivas_error check_ind_list_limits( + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +) +{ + Indice *ivas_ind_list_zero, *ivas_ind_list_last; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + ivas_ind_list_zero = *( hBstr->ivas_ind_list_zero ); + + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_ivas_max_num_indices() or get_ivas_max_num_indices_metadata() */ + IF( GE_16( (Word16) ( &hBstr->ind_list[hBstr->nb_ind_tot] - ivas_ind_list_zero ), *( hBstr->ivas_max_num_indices ) ) ) + { + + /* reallocate the buffer of indices with increased limit */ + IF( NE_32( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /* check, if we will not overwrite an existing indice */ + IF( hBstr->ind_list[hBstr->nb_ind_tot].nb_bits > 0 ) + { + IF( hBstr->nb_ind_tot == 0 ) + { + /* move the pointer to the next available empty slot */ + ivas_ind_list_last = &ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )]; + WHILE( hBstr->ind_list[0].nb_bits > 0 && hBstr->ind_list < ivas_ind_list_last ) + { + hBstr->ind_list++; + } + + IF( hBstr->ind_list >= ivas_ind_list_last ) + { + + /* no available empty slot -> need to re-allocate the buffer */ + IF( NE_32( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + ELSE + { +#ifdef DEBUGGING + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Buffer of indices corrupted in frame %d! Attempt to overwrite indice ID = %d (value: %d, bits: %d)!\n", frame, hBstr->ind_list[hBstr->nb_ind_tot].id, hBstr->ind_list[hBstr->nb_ind_tot].value, hBstr->ind_list[hBstr->nb_ind_tot].nb_bits ); +#else + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Buffer of indices corrupted! Attempt to overwrite indice ID = %d (value: %d, bits: %d)!\n", hBstr->ind_list[hBstr->nb_ind_tot].id, hBstr->ind_list[hBstr->nb_ind_tot].value, hBstr->ind_list[hBstr->nb_ind_tot].nb_bits ); +#endif + } + } + + return error; +} + +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) +const char *named_indices_table[] = { + "IND_IVAS_FORMAT", + "IND_SMODE_OMASA", + "IND_SMODE", + "IND_SID_TYPE", + "IND_BWIDTH", + "IND_CORE", + "IND_PPP_NELP_MODE", + "IND_ACELP_16KHZ", + "IND_ACELP_SIGNALLING", + "IND_SHARP_FLAG", + "IND_MDCT_CORE", + "IND_TCX_CORE", + "IND_BWE_FLAG", + "IND_HQ_SWITCHING_FLG", + "IND_LAST_L_FRAME", + "IND_VAD_FLAG", + "IND_HQ_BWIDTH", + "IND_TC_SUBFR", + "IND_TC_SUBFR", + "IND_TC_SUBFR", + "IND_TC_SUBFR", + "IND_GSC_IVAS_SP", + "IND_LSF_PREDICTOR_SELECT_BIT", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_MID_FRAME_LSF_INDEX", + "IND_ISF_0_0", + "IND_ISF_0_1", + "IND_ISF_0_2", + "IND_ISF_0_3", + "IND_ISF_0_4", + "IND_ISF_1_0", + "IND_ISF_1_1", + "IND_ISF_1_2", + "IND_ISF_1_3", + "IND_ISF_1_4", + "IND_IC_LSF_PRED", + "IND_GSC_ATTACK", + "IND_GSC_SWB_SPEECH", + "IND_NOISE_LEVEL", + "IND_HF_NOISE", + "IND_PIT_CONTR_IDX", + "IND_FEC_CLAS", + "IND_FEC_ENR", + "IND_FEC_POS", + "IND_ES_PRED", + "IND_HARM_FLAG_ACELP", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "TAG_ALG_CDBK_4T64_24KBIT_END", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "TAG_ACELP_SUBFR_LOOP_END", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_HF", + "IND_HQ_VOICING_FLAG", + "IND_HQ_SWB_CLAS", + "IND_NF_IDX", + "IND_LC_MODE", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_SWB_FENV_HQ", + "IND_SWB_FENV_HQ", + "IND_SWB_FENV_HQ", + "IND_SWB_FENV_HQ", + "IND_SWB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_DELTA_ENV_HQ", + "IND_HVQ_BWE_NL", + "IND_HVQ_BWE_NL", + "IND_NUM_PEAKS", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_FLAGN", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_NF_GAIN", + "IND_HVQ_NF_GAIN", + "IND_HQ2_SWB_CLAS", + "IND_HQ2_DENG_MODE", + "IND_HQ2_DENG_8SMODE", + "IND_HQ2_DENG_8SMODE_N0", + "IND_HQ2_DENG_8SMODE_N1", + "IND_HQ2_DENG_8SPOS", + "IND_HQ2_DENG_8SDEPTH", + "IND_HQ2_DENG_HMODE", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_LAST_BA_MAX_BAND", + "IND_HQ2_LAST_BA_MAX_BAND", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_END", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_NOISINESS", + "IND_ENERGY", + "IND_CNG_HO", + "IND_SID_BW", + "IND_CNG_ENV1", + "IND_WB_FENV", + "IND_WB_CLASS", + "IND_IG1", + "IND_IG2A", + "IND_IG2B", + "IND_NELP_FID", + "IND_DELTALAG", + "IND_POWER", + "IND_AMP0", + "IND_AMP1", + "IND_GLOBAL_ALIGNMENT", + "IND_PVQ_FINE_GAIN", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_SHB_SUBGAIN", + "IND_SHB_FRAMEGAIN", + "IND_STEREO_ICBWE_MSFLAG", + "IND_SHB_ENER_SF", + "IND_SHB_RES_GS", + "IND_SHB_RES_GS", + "IND_SHB_RES_GS", + "IND_SHB_RES_GS", + "IND_SHB_RES_GS", + "IND_SHB_VF", + "IND_SHB_LSF", + "IND_SHB_LSF", + "IND_SHB_LSF", + "IND_SHB_LSF", + "IND_SHB_LSF", + "IND_SHB_MIRROR", + "IND_SHB_GRID", + "IND_SWB_CLASS", + "IND_SWB_TENV", + "IND_SWB_TENV", + "IND_SWB_TENV", + "IND_SWB_TENV", + "IND_SWB_FENV", + "IND_SWB_FENV", + "IND_SWB_FENV", + "IND_SWB_FENV", + "IND_SHB_CNG_GAIN", + "IND_DITHERING", + "IND_FB_SLOPE", + "IND_HQ2_SPT_SHORTEN", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_DUMMY", + "IND_LAGINDICES", + "IND_NOISEG", + "IND_AUDIO_GAIN", + "IND_AUDIO_DELAY", + "IND_AUDIO_DELAY", + "IND_AUDIO_DELAY", + "IND_AUDIO_DELAY", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "TAG_HR_BWE_LOOP_END", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_AUDIO_DELAY", + "IND_CORE_SWITCHING_AUDIO_GAIN", + "IND_STEREO_ICBWE_REF", + "IND_STEREO_ICBWE_SP", + "IND_STEREO_ICBWE_GS", + "IND_STEREO_REFCHAN", + "IND_STEREO_CORRSTATS", + "IND_STEREO_GD", + "IND_STEREO_LRTD_FLAG", + "IND_STEREO_LPC_REUSE", + "IND_STEREO_TD_ALPHA", + "IND_STEREO_2ND_CODER_T", + "IND_UNUSED" +}; +#endif + + +/*-------------------------------------------------------------------* + * push_indice() + * + * Push a new indice into the buffer + *-------------------------------------------------------------------*/ + +ivas_error push_indice( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 id, /* i : ID of the indice */ + UWord16 value, /* i : value of the quantized indice */ + Word16 nb_bits /* i : number of bits used to quantize the indice */ +) +{ + Word16 i; + Word16 j; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + /* check the limits of the list of indices */ + IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) + { +#ifdef DEBUGGING + return IVAS_ERROR( error, "Error occured in push_indice() while re-allocating the list of indices (frame %d) !\n", frame ); +#else + return IVAS_ERROR( error, "Error occured in push_indice() while re-allocating the list of indices!\n" ); +#endif + } + + /* find the location in the list of indices based on ID */ + i = hBstr->nb_ind_tot; + move16(); + test(); + WHILE( i > 0 && ( id < hBstr->ind_list[i - 1].id ) ) + { + test(); + i = sub( i, 1 ); + } + + /* shift indices, if the new ID is to be written somewhere inside the list */ + IF( i < hBstr->nb_ind_tot ) + { + FOR( j = hBstr->nb_ind_tot; j > i; j-- ) + { + hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; + hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; + hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[j - 1].function_name, 100 ); +#endif + move16(); + move16(); + move16(); + } + } + + + /* store the new indice in the list */ + hBstr->ind_list[i].id = id; + hBstr->ind_list[i].value = value; + hBstr->ind_list[i].nb_bits = nb_bits; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( hBstr->ind_list[i].function_name, named_indices_table[id], 100 ); +#endif + move16(); + move16(); + move16(); + + /* updates */ + hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); + hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); + move16(); + move16(); + + return error; +} + +/*-------------------------------------------------------------------* + * push_next_indice() + * + * Push a new indice into the buffer at the next position + *-------------------------------------------------------------------*/ +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) +ivas_error push_next_indice_( + const char *caller, +#else +ivas_error push_next_indice( +#endif + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + UWord16 value, /* i : value of the quantized indice */ + Word16 nb_bits /* i : number of bits used to quantize the indice */ +) +{ + Word16 prev_id; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + + /* check the limits of the list of indices */ + IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* get the id of the previous indice -> it will be re-used */ + IF( hBstr->nb_ind_tot > 0 ) + { + prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; + } + ELSE + { + prev_id = 0; + } + move16(); + + /* store the values in the list */ + hBstr->ind_list[hBstr->nb_ind_tot].id = prev_id; + hBstr->ind_list[hBstr->nb_ind_tot].value = value; + hBstr->ind_list[hBstr->nb_ind_tot].nb_bits = nb_bits; + move16(); + move16(); + move16(); + +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( hBstr->ind_list[hBstr->nb_ind_tot].function_name, caller, 100 ); +#endif + + /* updates */ + hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); + hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); + move16(); + move16(); + + return error; +} + + +/*-------------------------------------------------------------------* + * push_next_bits() + * Push a bit buffer into the buffer at the next position + *-------------------------------------------------------------------*/ + +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) +ivas_error push_next_bits_( + const char *caller, +#else +ivas_error push_next_bits( +#endif + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ + const Word16 nb_bits /* i : number of bits to pack */ +) +{ + UWord16 code; + Word16 i, nb_bits_m15; + Indice *ptr; + Word16 prev_id; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; + + /* get the id of the previous indice -> will be re-used */ + IF( hBstr->nb_ind_tot > 0 ) + { + prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; + move16(); + } + ELSE + { + prev_id = 0; + move16(); + } + nb_bits_m15 = sub( nb_bits, 15 ); + + FOR( i = 0; i < nb_bits_m15; i += 16 ) + { + code = (UWord16) L_or( L_shl( bits[i], 15 ), L_or( L_shl( bits[i + 1], 14 ), L_or( L_shl( bits[i + 2], 13 ), L_or( L_shl( bits[i + 3], 12 ), L_or( L_shl( bits[i + 4], 11 ), L_or( L_shl( bits[i + 5], 10 ), L_or( L_shl( bits[i + 6], 9 ), L_or( L_shl( bits[i + 7], 8 ), L_or( L_shl( bits[i + 8], 7 ), L_or( L_shl( bits[i + 9], 6 ), L_or( L_shl( bits[i + 10], 5 ), L_or( L_shl( bits[i + 11], 4 ), L_or( L_shl( bits[i + 12], 3 ), L_or( L_shl( bits[i + 13], 2 ), L_or( L_shl( bits[i + 14], 1 ), bits[i + 15] ) ) ) ) ) ) ) ) ) ) ) ) ) ) ); + + /* check the limits of the list of indices */ + IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) + { +#ifdef DEBUGGING + return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n", frame ); +#else + return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices!\n" ); +#endif + } + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; + + ptr->value = code; + ptr->nb_bits = 16; + ptr->id = prev_id; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( ptr->function_name, caller, 100 ); +#endif + hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); + move16(); + move16(); + move16(); + move16(); + + ++ptr; + } + + FOR( ; i < nb_bits; ++i ) + { + /* check the limits of the list of indices */ + IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) + { +#ifdef DEBUGGING + return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n", frame ); +#else + return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices!\n" ); +#endif + } + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; + + ptr->value = bits[i]; + ptr->nb_bits = 1; + ptr->id = prev_id; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( ptr->function_name, caller, 100 ); +#endif + hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); + move16(); + move16(); + move16(); + move16(); + + ++ptr; + } + + hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); + move16(); + + return error; +} + + +/*-------------------------------------------------------------------* + * find_indice() + * + * Find indice based on its id + *-------------------------------------------------------------------*/ + +/*! r: result: index of the indice in the list, -1 if not found */ +Word16 find_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + const Word16 id, /* i : ID of the indice */ + UWord16 *value, /* o : value of the quantized indice */ + Word16 *nb_bits /* o : number of bits used to quantize the indice */ +) +{ + Word16 i; + + for ( i = 0; i < hBstr->nb_ind_tot; i++ ) + { + if ( hBstr->ind_list[i].id == id && hBstr->ind_list[i].nb_bits > 0 ) + { + *value = hBstr->ind_list[i].value; + *nb_bits = hBstr->ind_list[i].nb_bits; + return i; + } + } + + return -1; +} + + +/*-------------------------------------------------------------------* + * delete_indice() + * + * Delete indice based on its id (note, that nb_ind_tot and nb_bits_tot are updated) + *-------------------------------------------------------------------*/ + +/*! r: number of deleted indices */ +UWord16 delete_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + const Word16 id /* i : ID of the indice */ +) +{ + Word16 i, j; + + j = 0; + FOR( i = 0; i < hBstr->nb_ind_tot; i++ ) { - FOR( ; i < nb_bits_m15; i += 16 ) + IF( EQ_16( hBstr->ind_list[i].id, id ) ) { - code = s_or( lshl( bits[i], 15 ), s_or( lshl( bits[i + 1], 14 ), s_or( lshl( bits[i + 2], 13 ), s_or( lshl( bits[i + 3], 12 ), - s_or( lshl( bits[i + 4], 11 ), s_or( lshl( bits[i + 5], 10 ), s_or( lshl( bits[i + 6], 9 ), s_or( lshl( bits[i + 7], 8 ), - s_or( lshl( bits[i + 8], 7 ), s_or( lshl( bits[i + 9], 6 ), s_or( lshl( bits[i + 10], 5 ), s_or( lshl( bits[i + 11], 4 ), - s_or( lshl( bits[i + 12], 3 ), s_or( lshl( bits[i + 13], 2 ), s_or( lshl( bits[i + 14], 1 ), bits[i + 15] ) ) ) ) ) ) ) ) ) ) ) ) ) ) ); - - ptr->value = code; - move16(); - ptr->nb_bits = 16; + hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits; move16(); - ++ptr; + continue; } - } - IF( LT_16( i, nb_bits ) ) - { - FOR( ; i < nb_bits; ++i ) + + IF( LT_16( j, i ) ) { - ptr->value = bits[i]; + /* shift the indice left */ + hBstr->ind_list[j].id = hBstr->ind_list[i].id; + hBstr->ind_list[j].value = hBstr->ind_list[i].value; + hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; + move16(); move16(); - ptr->nb_bits = 1; move16(); - ++ptr; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[i].function_name, 100 ); +#endif } + + j++; } - hBstr->next_ind_fx = (Word16) ( ptr - hBstr->ind_list ); - move16(); - hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); - move16(); + + hBstr->nb_ind_tot = j; + + FOR( ; j < i; j++ ) + { + /* reset the shifted indices at the end of the list */ + hBstr->ind_list[j].nb_bits = -1; + move16(); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + sprintf( hBstr->ind_list[j].function_name, "RESET in delete_indice" ); +#endif + } + + return i - j; } + /*-------------------------------------------------------------------* - * get_next_indice_fx( ) + * get_next_indice() * * Get the next indice from the buffer *-------------------------------------------------------------------*/ -UWord16 get_next_indice_fx( /* o : value of the indice */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 nb_bits /* i : number of bits that were used to quantize the indice */ +/*! r: value of the indice */ +UWord16 get_next_indice_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ) { UWord16 value; @@ -389,6 +3298,7 @@ UWord16 get_next_indice_fx( /* o : value of the indice */ move16(); nbits_total = extract_l( Mpy_32_32( st_fx->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + /* detect corrupted bitstream */ IF( GT_16( add( st_fx->next_bit_pos, nb_bits ), nbits_total ) ) { @@ -406,21 +3316,25 @@ UWord16 get_next_indice_fx( /* o : value of the indice */ /* update the position in the bitstream */ st_fx->next_bit_pos = add( st_fx->next_bit_pos, nb_bits ); move16(); + return value; } + /*-------------------------------------------------------------------* - * get_next_indice_1_fx( ) + * get_next_indice_1() * * Get the next 1-bit indice from the buffer *-------------------------------------------------------------------*/ -UWord16 get_next_indice_1_fx( /* o : value of the indice */ - Decoder_State *st_fx /* i/o: decoder state structure */ +/*! r: value of the indice */ +UWord16 get_next_indice_1_fx( + Decoder_State *st_fx /* i/o: decoder state structure */ ) { Word16 nbits_total; nbits_total = extract_l( Mpy_32_32( st_fx->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + /* detect corrupted bitstream */ test(); test(); @@ -437,6 +3351,7 @@ UWord16 get_next_indice_1_fx( /* o : value of the indice * return st_fx->bit_stream[st_fx->next_bit_pos++]; } + /*-------------------------------------------------------------------* * get_next_indice_tmp() * @@ -451,27 +3366,34 @@ void get_next_indice_tmp_fx( /* update the position in the bitstream */ st_fx->next_bit_pos = add( st_fx->next_bit_pos, nb_bits ); move16(); + + return; } + /*-------------------------------------------------------------------* - * get_indice_fx( ) + * get_indice() * * Get indice at specific position in the buffer *-------------------------------------------------------------------*/ -UWord16 get_indice_fx( /* o : value of the indice */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 pos, /* i : absolute position in the bitstream (update after the read) */ - Word16 nb_bits /* i : number of bits that were used to quantize the indice */ +/*! r: value of the indice */ +UWord16 get_indice_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + Word16 pos, /* i : absolute position in the bitstream (update after the read) */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ) { UWord16 value; Word16 i; + Word32 nbits_total; assert( nb_bits <= 16 ); + nbits_total = extract_l( Mpy_32_32( st_fx->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + /* detect corrupted bitstream */ - IF( GT_16( add( pos, nb_bits ), st_fx->total_num_bits ) ) + IF( GT_32( L_deposit_l( add( pos, nb_bits ) ), nbits_total ) ) { st_fx->BER_detect = 1; move16(); @@ -489,19 +3411,62 @@ UWord16 get_indice_fx( /* o : value of the indice */ return value; } + +/*-------------------------------------------------------------------* + * get_indice_st() + * + * Get indice at specific position in the buffer + *-------------------------------------------------------------------*/ + +/*! r: value of the indice */ +UWord16 get_indice_st( + Decoder_State *st, /* i/o: decoder state structure */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 pos, /* i : absolute position in the bitstream */ + const Word16 nb_bits /* i : number of bits to quantize the indice */ +) +{ + UWord16 value; + Word16 i; + + assert( nb_bits <= 16 ); + + /* detect corrupted bitstream */ + IF( GT_32( L_deposit_l( add( pos, nb_bits ) ), Mpy_32_32( element_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ) ) + { + st->BER_detect = 1; + move16(); + return ( 0 ); + } + + value = 0; + move16(); + FOR( i = 0; i < nb_bits; i++ ) + { + value = shl( value, 1 ); + value = add( value, st->bit_stream[pos + i] ); + } + + return value; +} + + /*-------------------------------------------------------------------* * get_indice_1_fx( ) * * Get a 1-bit indice at specific position in the buffer *-------------------------------------------------------------------*/ -UWord16 get_indice_1_fx( /* o : value of the indice */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 pos /* i : absolute position in the bitstream (update after the read) */ +/*! r: value of the indice */ +UWord16 get_indice_1_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + Word16 pos /* i : absolute position in the bitstream (update after the read) */ ) { Word16 nbits_total; + nbits_total = extract_l( Mpy_32_32( st_fx->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + /* detect corrupted bitstream */ IF( GT_16( add( pos, 1 ), nbits_total ) ) { @@ -513,6 +3478,7 @@ UWord16 get_indice_1_fx( /* o : value of the indice */ return st_fx->bit_stream[pos]; } + /*-------------------------------------------------------------------* * reset_indices_enc_fx() * @@ -526,17 +3492,10 @@ void reset_indices_enc_fx( { Word16 i; -#ifdef MSAN_FIX hBstr->nb_ind_tot = 0; move16(); -#endif hBstr->nb_bits_tot = 0; move16(); - hBstr->next_ind_fx = 0; - move16(); - hBstr->last_ind_fx = -1; - move16(); - FOR( i = 0; i < max_num_indices; i++ ) { hBstr->ind_list[i].nb_bits = -1; @@ -546,16 +3505,17 @@ void reset_indices_enc_fx( return; } + /*-------------------------------------------------------------------* - * reset_indices_dec_fx() + * reset_indices_dec() * * Reset the buffer of decoder indices *-------------------------------------------------------------------*/ -void reset_indices_dec_fx( - Decoder_State *st_fx ) +void reset_indices_dec( + Decoder_State *st ) { - st_fx->next_bit_pos = 0; + st->next_bit_pos = 0; move16(); return; @@ -563,365 +3523,490 @@ void reset_indices_dec_fx( /*-------------------------------------------------------------------* - * write_indices_fx() + * write_indices_to_stream() * - * Write the buffer of indices to a file + * writing forward or backward to a serial stream *-------------------------------------------------------------------*/ -void write_indices_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - FILE *file /* i : output bitstream file */ - , - UWord8 *pFrame, /* i: byte array with bit packet and byte aligned coded speech data */ - Word16 pFrame_size /* i: size of the binary encoded access unit [bits] */ -) +static Word16 write_indices_to_stream_fx( + Indice *ind_list, + UWord16 **pt_stream, + const Word16 inc, + const Word16 num_indices ) { Word16 i, k; - Word16 stream[2 + MAX_BITS_PER_FRAME], *pt_stream; - Word32 mask; - UWord8 header; - Word16 isAmrWb = 0; - move16(); + Word16 value, nb_bits; + UWord16 mask; - IF( st_fx->bitstreamformat == G192 ) + FOR( i = 0; i < num_indices; i++ ) { - /*-----------------------------------------------------------------* - * Encode Sync Header and Frame Length - *-----------------------------------------------------------------*/ - pt_stream = stream; - FOR( i = 0; i < ( 2 + MAX_BITS_PER_FRAME ); ++i ) - { - stream[i] = 0; - move16(); - } - *pt_stream++ = SYNC_GOOD_FRAME; + value = ind_list[i].value; + nb_bits = ind_list[i].nb_bits; move16(); - *pt_stream++ = hBstr->nb_bits_tot; move16(); - /*----------------------------------------------------------------* - * Bitstream packing (conversion of individual indices into a serial stream) - * Writing the serial stream into file - *----------------------------------------------------------------*/ - - FOR( i = 0; i < MAX_NUM_INDICES; i++ ) + IF( nb_bits > 0 ) { - IF( NE_16( hBstr->ind_list[i].nb_bits, -1 ) ) - { - /* mask from MSB to LSB */ - mask = L_shl( 1, sub( hBstr->ind_list[i].nb_bits, 1 ) ); + /* mask from MSB to LSB */ + mask = (UWord16) L_shl( 1, sub( nb_bits, 1 ) ); - /* write bit by bit */ - FOR( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) + /* write bit by bit */ + FOR( k = 0; k < nb_bits; k++ ) + { + IF( L_and( value, mask ) ) { - IF( L_and( hBstr->ind_list[i].value, mask ) ) - { - *pt_stream++ = G192_BIN1; - move16(); - } - ELSE - { - *pt_stream++ = G192_BIN0; - move16(); - } - - mask = L_shr( mask, 1 ); + **pt_stream = 1; + move16(); + *pt_stream += inc; + } + ELSE + { + **pt_stream = 0; + move16(); + *pt_stream += inc; } + + mask = (UWord16) L_shr( mask, 1 ); } } } + + return 0; +} + + +/*-------------------------------------------------------------------* + * write_indices_element() + * + * Bitstream writing function of one element (one SCE or one CPE) + *-------------------------------------------------------------------*/ + +static ivas_error write_indices_element_fx( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + UWord16 **pt_stream, /* i : pointer to bitstream buffer */ + const Word16 is_SCE, /* i : flag to distingusih SCE and CPE */ + const Word16 element_id /* i : id of the SCE or CPE */ +) +{ + Word16 ch; + Encoder_State **sts = NULL; + UWord16 *pt_stream_loc; + UWord16 *pt_stream_backup; + UWord16 *pt_stream_end; + Word16 nb_bits_tot_metadata; + Word16 nb_ind_tot_metadata; + + Indice *ind_list_metadata; + Word16 n, n_channels; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + ind_list_metadata = NULL; + nb_ind_tot_metadata = 0; + move16(); + + IF( EQ_32( st_ivas->hEncoderConfig->ivas_format, MONO_FORMAT ) ) + { + sts = st_ivas->hSCE[0]->hCoreCoder; + nb_bits_tot_metadata = 0; + move16(); + } ELSE { - /* Create and write ToC header */ - /* qbit always set to 1 on encoder side for AMRWBIO , no qbit in use for EVS, but set to 0(bad) */ - header = (UWord8) ( s_or( s_or( shl( st_fx->Opt_AMR_WB, 5 ), shl( st_fx->Opt_AMR_WB, 4 ) ), rate2EVSmode( L_mult0( hBstr->nb_bits_tot, 50 ), &isAmrWb ) ) ); + nb_bits_tot_metadata = 0; move16(); - fwrite( &header, sizeof( UWord8 ), 1, file ); - /* Write speech bits */ - fwrite( pFrame, sizeof( UWord8 ), shr( add( pFrame_size, 7 ), 3 ), file ); + test(); + test(); + IF( is_SCE && st_ivas->hSCE[element_id] != NULL ) + { + sts = st_ivas->hSCE[element_id]->hCoreCoder; + + IF( st_ivas->hSCE[element_id]->hMetaData != NULL ) + { + nb_bits_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_bits_tot; + ind_list_metadata = st_ivas->hSCE[element_id]->hMetaData->ind_list; + nb_ind_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; + move16(); + move16(); + } + } + ELSE IF( !is_SCE && st_ivas->hCPE[element_id] != NULL ) + { + sts = st_ivas->hCPE[element_id]->hCoreCoder; + + IF( st_ivas->hCPE[element_id]->hMetaData != NULL ) + { + nb_bits_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_bits_tot; + ind_list_metadata = st_ivas->hCPE[element_id]->hMetaData->ind_list; + nb_ind_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; + move16(); + move16(); + } + } } - /* Clearing of indices */ - FOR( i = 0; i < MAX_NUM_INDICES; i++ ) + n_channels = 1; + move16(); + if ( GT_16( sts[0]->element_mode, IVAS_CPE_DFT ) ) { - hBstr->ind_list[i].nb_bits = -1; + n_channels = CPE_CHANNELS; move16(); } + /*----------------------------------------------------------------* + * Bitstream packing (conversion of individual indices into a serial stream) + *----------------------------------------------------------------*/ + + pt_stream_loc = *pt_stream; + pt_stream_end = pt_stream_loc; - IF( st_fx->bitstreamformat == G192 ) + FOR( n = 0; n < n_channels; n++ ) { - /* write the serial stream into file */ - fwrite( stream, sizeof( unsigned short ), 2 + stream[1], file ); + /* write the metadata buffer */ + test(); + IF( n == 0 && nb_bits_tot_metadata != 0 ) + { + pt_stream_backup = pt_stream_loc; + + FOR( ch = 0; ch < n_channels; ch++ ) + { + pt_stream_loc += sts[ch]->hBstr->nb_bits_tot; + } + pt_stream_loc += nb_bits_tot_metadata - 1; + pt_stream_end = pt_stream_loc + 1; + + write_indices_to_stream_fx( ind_list_metadata, &pt_stream_loc, -1, + nb_ind_tot_metadata ); + + /* restore previous pointer position */ + pt_stream_loc = pt_stream_backup; + } + write_indices_to_stream_fx( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, + sts[n]->hBstr->nb_ind_tot ); + + if ( pt_stream_loc > pt_stream_end ) + { + pt_stream_end = pt_stream_loc; + } } - /* reset index pointers */ - hBstr->nb_bits_tot = 0; - move16(); - hBstr->next_ind_fx = 0; - move16(); - hBstr->last_ind_fx = -1; - move16(); - return; -} -/*-------------------------------------------------------------------* - * write_indices_buf_fx() - * - * Write the buffer of indices to a file - *-------------------------------------------------------------------*/ +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + if ( is_SCE ) /* EVS and SCE */ + { + static FILE *f1 = 0; -void write_indices_buf_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - UWord16 *out_buf, /* i : output bitstream buf */ - UWord8 *pFrame, /* i: byte array with bit packet and byte aligned coded speech data */ - Word16 pFrame_size, /* i: size of the binary encoded access unit [bits] */ - UWord16 *num_bits ) -{ - Word16 i, k; - Word16 stream[2 + MAX_BITS_PER_FRAME], *pt_stream; - Word32 mask; - UWord8 header; - Word16 isAmrWb = 0; + if ( f1 == 0 ) + f1 = fopen( "bitstream_text", "w" ); + + for ( int16_t i = 0; i < sts[0]->hBstr->nb_ind_tot; i++ ) + { + Indice *ind_list = sts[0]->hBstr->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; + + fprintf( f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value ); + } - IF( st_fx->bitstreamformat == G192 ) + if ( st_ivas->hSCE[element_id]->hMetaData != NULL ) + { + for ( int16_t i = 0; i < st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; i++ ) + { + Indice *ind_list = st_ivas->hSCE[element_id]->hMetaData->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; + + fprintf( f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value ); + } + } + } + else { - /*-----------------------------------------------------------------* - * Encode Sync Header and Frame Length - *-----------------------------------------------------------------*/ - pt_stream = stream; - FOR( i = 0; i < ( 2 + MAX_BITS_PER_FRAME ); ++i ) + static FILE *f1 = 0; + + if ( f1 == 0 ) + f1 = fopen( "bitstream_text", "w" ); + + + for ( n = 0; n < n_channels; n++ ) { - stream[i] = 0; - move16(); + for ( int16_t i = 0; i < sts[n]->hBstr->nb_ind_tot; i++ ) + { + Indice *ind_list = sts[n]->hBstr->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; + + fprintf( f1, "%d %d %d %d %s %d %d\n", frame, element_id, n, i, function_name, nb_bits, value ); + } } - //*pt_stream++ = (Word16) SYNC_GOOD_FRAME; - //*pt_stream++ = hBstr->nb_bits_tot; - *num_bits = hBstr->nb_bits_tot; - move16(); - /*----------------------------------------------------------------* - * Bitstream packing (conversion of individual indices into a serial stream) - * Writing the serial stream into file - *----------------------------------------------------------------*/ - FOR( i = 0; i < MAX_NUM_INDICES; i++ ) + + if ( st_ivas->hCPE[element_id]->hMetaData != NULL ) { - IF( NE_16( hBstr->ind_list[i].nb_bits, -1 ) ) + for ( int16_t i = 0; i < st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; i++ ) { - /* mask from MSB to LSB */ - mask = L_shl( 1, ( sub( hBstr->ind_list[i].nb_bits, 1 ) ) ); + Indice *ind_list = st_ivas->hCPE[element_id]->hMetaData->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; - /* write bit by bit */ - FOR( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) - { - IF( L_and( hBstr->ind_list[i].value, mask ) ) - { - //*pt_stream++ = G192_BIN1; - *pt_stream++ = 1; - move16(); - } - ELSE - { - //*pt_stream++ = G192_BIN0; - *pt_stream++ = 0; - move16(); - } - - mask = L_shr( mask, 1 ); - } + fprintf( f1, "%d %d %d %d %s %d %d\n", frame, element_id, -1, i, function_name, nb_bits, value ); } } } +#endif + + /*----------------------------------------------------------------* + * Clearing of indices + * Reset index pointers + *----------------------------------------------------------------*/ + + IF( is_SCE ) /* EVS and SCE */ + { + IF( st_ivas->hSCE[element_id]->hMetaData != NULL ) + { + reset_indices_enc_fx( st_ivas->hSCE[element_id]->hMetaData, st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot ); + } + + reset_indices_enc_fx( sts[0]->hBstr, sts[0]->hBstr->nb_ind_tot ); + } ELSE { - /* Create and write ToC header */ - /* qbit always set to 1 on encoder side for AMRWBIO , no qbit in use for EVS, but set to 0(bad) */ - header = (UWord8) ( s_or( s_or( shl( st_fx->Opt_AMR_WB, 5 ), shl( st_fx->Opt_AMR_WB, 4 ) ), rate2EVSmode( i_mult( hBstr->nb_bits_tot, 50 ), &isAmrWb ) ) ); - // fwrite(&header, sizeof(UWord8), 1, file); - memcpy( out_buf, &header, sizeof( UWord8 ) ); - *num_bits += sizeof( UWord8 ); - /* Write speech bits */ - // fwrite(pFrame, sizeof(UWord8), (pFrame_size + 7) >> 3, file); - memcpy( out_buf, pFrame, sizeof( UWord8 ) * ( shr( add( pFrame_size, 7 ), 3 ) ) ); - *num_bits += sizeof( UWord8 ) * ( shr( ( add( pFrame_size, 7 ) ), 3 ) ); + IF( st_ivas->hCPE[element_id]->hMetaData != NULL ) + { + reset_indices_enc_fx( st_ivas->hCPE[element_id]->hMetaData, st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot ); + } + + FOR( n = 0; n < n_channels; n++ ) + { + reset_indices_enc_fx( sts[n]->hBstr, sts[n]->hBstr->nb_ind_tot ); + } } - /* Clearing of indices */ - FOR( i = 0; i < MAX_NUM_INDICES; i++ ) + /* update pointer */ + *pt_stream = pt_stream_end; + + return error; +} + + +/*-------------------------------------------------------------------* + * write_indices_ivas() + * + * Write the buffer of indices to a serial bitstream buffer, + * each bit represented as a uint16_t of value 0 or 1 + *-------------------------------------------------------------------*/ + +ivas_error write_indices_ivas_fx( + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ + UWord16 *bit_stream, /* i/o: output bitstream */ + UWord16 *num_bits /* i : number of indices written to output */ +) +{ + Word16 i, n; + UWord16 *pt_stream; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + pt_stream = bit_stream; + FOR( i = 0; i < MAX_BITS_PER_FRAME; ++i ) { - hBstr->ind_list[i].nb_bits = -1; + bit_stream[i] = 0; move16(); } + /*-----------------------------------------------------------------* + * Encode Payload + *-----------------------------------------------------------------*/ + + FOR( n = 0; n < st_ivas->nSCE; n++ ) + { + write_indices_element_fx( st_ivas, &pt_stream, 1, n ); + } - IF( st_fx->bitstreamformat == G192 ) + FOR( n = 0; n < st_ivas->nCPE; n++ ) { - /* write the serial stream into file */ - // fwrite(stream, sizeof(unsigned short), 2 + stream[1], file); - // FILE *ftemp = fopen( "./output/bitstreams/out.COD", "ab" ); - // fwrite( stream, sizeof( unsigned short ), 2 + stream[1], ftemp ); - // fclose( ftemp ); - memcpy( out_buf, stream, sizeof( unsigned short ) * ( *num_bits ) ); - //*num_bits += sizeof( unsigned short ) * ( 2 + stream[1] ); + write_indices_element_fx( st_ivas, &pt_stream, 0, n ); } - /* reset index pointers */ - hBstr->nb_bits_tot = 0; - hBstr->next_ind_fx = 0; - hBstr->last_ind_fx = -1; - move16(); - move16(); + + *num_bits = (UWord16) ( pt_stream - bit_stream ); move16(); + return error; +} + + +/*---------------------------------------------------------------------* + * convertSerialToBytestream( ) + * + * convert 16-bit short serial streams with 0x0000 and 0x0001 to a bytstream + *---------------------------------------------------------------------*/ + +void convertSerialToBytestream_fx( + const UWord16 *const serial, /* i : input serial bitstream with values 0 and 1 */ + const UWord16 num_bits, /* i : number of bits in the input bitstream */ + UWord8 *const bytestream /* o : output compact bitstream (bytestream) */ +) +{ + Word16 i, ia7, isr3; + UWord8 bit, bitinbyte; +#ifdef DEBUGGING + UWord8 bitinbyte2, bytestream_tmp; + assert( num_bits <= MAX_16 ); /* 512 kbps = 10240 bits, num_bits should always fits Word16 */ +#endif + + FOR( i = 0; i < num_bits; ++i ) + { + IF( EQ_32( serial[i], 0x0001 ) ) + { + bit = 1; + move16(); + } + ELSE + { + bit = 0; + move16(); + } + /*bitinbyte = bit << ( 7 - ( i & 0x7 ) );*/ + ia7 = s_and( i, 0x7 ); + isr3 = shr( i, 3 ); + bitinbyte = (UWord8) shl( (Word16) bit, sub( 7, ia7 ) ); +#ifdef DEBUGGING + bitinbyte2 = bit << ( 7 - ( i & 0x7 ) ); + assert( bitinbyte2 == bitinbyte ); +#endif + IF( !( ia7 ) ) + { + bytestream[isr3] = 0; + move16(); + } + /*bytestream[i >> 3] |= bitinbyte;*/ +#ifdef DEBUGGING + bytestream_tmp = bytestream[isr3]; + bytestream_tmp |= bitinbyte2; +#endif + bytestream[isr3] = (Word8) s_or( bytestream[isr3], bitinbyte ); +#ifdef DEBUGGING + assert( bytestream_tmp == bytestream[isr3] ); +#endif + move16(); + } + return; } + + /*-------------------------------------------------------------------* - * indices_to_serial() + * decoder_selectCodec() + * * - * pack indices into serialized payload format *-------------------------------------------------------------------*/ -void indices_to_serial( - const Encoder_State *st_fx, /* i: encoder state structure */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - UWord8 *pFrame, /* o: byte array with bit packet and byte aligned coded speech data */ - Word16 *pFrame_size /* o: size of the binary encoded access unit [bits] */ +static void decoder_selectCodec( + Decoder_State *st, /* i/o: decoder state structure */ + const Word32 total_brate, /* i : total bitrate */ + const Word16 bit0 /* i : first bit */ ) { - Word16 i, k, j; - Word16 cmi = 0, core_mode = 0; - Word32 mask; - Word16 amrwb_bits[( ACELP_23k85 / 50 )]; - UWord8 omask = 0x80; - UWord8 *pt_pFrame = pFrame; - Word16 isAmrWb = 0; - move16(); - move16(); - move16(); - move16(); - - IF( st_fx->Opt_AMR_WB ) + /* set the AMR-WB IO flag */ + IF( rate2AMRWB_IOmode( total_brate ) != -1 ) + { + st->Opt_AMR_WB = 1; + move16(); + } + ELSE IF( total_brate != FRAME_NO_DATA ) { - cmi = rate2EVSmode( st_fx->total_brate, &isAmrWb ); - core_mode = rate2EVSmode( L_mult0( hBstr->nb_bits_tot, 50 ), &isAmrWb ); + st->Opt_AMR_WB = 0; + move16(); + } - j = 0; + IF( st->Opt_AMR_WB ) + { + st->codec_mode = MODE1; move16(); - FOR( i = 0; i < MAX_NUM_INDICES; i++ ) + } + else + { + st->codec_mode = get_codec_mode( total_brate ); + + IF( st->codec_mode == -1 ) { - IF( NE_16( hBstr->ind_list[i].nb_bits, -1 ) ) + SWITCH( total_brate ) { - /* mask from MSB to LSB */ - mask = L_shl( 1, sub( hBstr->ind_list[i].nb_bits, 1 ) ); - - /* temporarily save bit */ - FOR( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) - { - amrwb_bits[j++] = L_and( hBstr->ind_list[i].value, mask ) > 0; + case 0: + st->codec_mode = st->last_codec_mode; move16(); - mask = L_shr( mask, 1 ); - } + BREAK; + case 2400: + st->codec_mode = st->last_codec_mode; + move16(); + BREAK; + case 2800: + st->codec_mode = MODE1; + move16(); + break; + default: /* validate that total_brate (derived from RTP packet or a file header) is one of the defined bitrates */ + st->codec_mode = st->last_codec_mode; + move16(); + st->bfi = 1; + move16(); + break; } } } - *pFrame_size = hBstr->nb_bits_tot; - move16(); - - /*----------------------------------------------------------------* - * Bitstream packing (conversion of individual indices into a serial stream) - *----------------------------------------------------------------*/ - j = 0; - move16(); - FOR( i = 0; i < MAX_NUM_INDICES; i++ ) + IF( st->ini_frame == 0 ) { - IF( NE_16( hBstr->ind_list[i].nb_bits, -1 ) ) + if ( st->codec_mode == -1 ) { - /* mask from MSB to LSB */ - mask = L_shl( 1, sub( hBstr->ind_list[i].nb_bits, 1 ) ); - - /* write bit by bit */ - FOR( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) - { - IF( st_fx->Opt_AMR_WB ) - { - pack_bit( amrwb_bits[sort_ptr[core_mode][j++]], &pt_pFrame, &omask ); - } - ELSE - { - pack_bit( hBstr->ind_list[i].value & mask, &pt_pFrame, &omask ); - j = add( j, 1 ); - } - mask = L_shr( mask, 1 ); - } + st->codec_mode = MODE1; + move16(); } + st->last_codec_mode = st->codec_mode; + move16(); } - test(); - IF( st_fx->Opt_AMR_WB && EQ_16( core_mode, AMRWB_IO_SID ) ) /* SID UPD frame always written now .... */ + /* set SID/CNG type */ + IF( total_brate == SID_2k40 ) { - /* insert STI bit and CMI */ - pack_bit( 1, &pt_pFrame, &omask ); - FOR( mask = 0x08; mask > 0; mask >>= 1 ) + IF( bit0 == 0 ) + { + st->cng_type = LP_CNG; + move16(); + + /* force MODE1 when selecting LP_CNG */ + st->codec_mode = MODE1; + move16(); + } + ELSE IF( bit0 == 1 ) { - pack_bit( cmi & mask, &pt_pFrame, &omask ); + st->cng_type = FD_CNG; + move16(); + + test(); + if ( st->last_codec_mode == MODE2 && st->last_total_brate == ACELP_13k20 ) + { + st->codec_mode = MODE1; + move16(); + } } } + + return; } /*-------------------------------------------------------------------* - * indices_to_serial_generic() + * dec_prm_core() + * * - * pack indices into serialized payload format *-------------------------------------------------------------------*/ -void indices_to_serial_generic( - const Indice *ind_list, /* i: indices list */ - const Word16 num_indices, /* i: number of indices to write */ - UWord8 *pFrame, /* o: byte array with bit packet and byte aligned coded speech data */ - Word16 *pFrame_size /* i/o: number of bits in the binary encoded access unit [bits] */ -) -{ - Word16 i, k, j; - Word32 mask; - UWord8 omask; - UWord8 *pt_pFrame = pFrame; - Word16 nb_bits_tot; - - nb_bits_tot = 0; - move16(); - omask = (UWord8) shr( 0x80, s_and( *pFrame_size, 0x7 ) ); - move16(); - pt_pFrame += shr( *pFrame_size, 3 ); - - /*----------------------------------------------------------------* - * Bitstream packing (conversion of individual indices into a serial stream) - *----------------------------------------------------------------*/ - j = 0; - move16(); - FOR( i = 0; i < num_indices; i++ ){ - IF( NE_16( ind_list[i].nb_bits, -1 ) ){ - /* mask from MSB to LSB */ - mask = L_shl( 1, sub( ind_list[i].nb_bits, 1 ) ); - - /* write bit by bit */ - FOR( k = 0; k < ind_list[i].nb_bits; k++ ) - { - pack_bit( ind_list[i].value & mask, &pt_pFrame, &omask ); - j = add( j, 1 ); - mask = L_shr( mask, 1 ); - } - nb_bits_tot = add( nb_bits_tot, ind_list[i].nb_bits ); -} -} - -*pFrame_size = add( *pFrame_size, nb_bits_tot ); -move16(); - -return; -} - - static void dec_prm_core( Decoder_State *st ) { Word16 n, frame_size_index, num_bits; @@ -1003,8 +4088,11 @@ static void dec_prm_core( Decoder_State *st ) move16(); } } + + return; } + /*-----------------------------------------------------------------* * decision_matrix_core_dec() * @@ -1143,6 +4231,7 @@ static void decision_matrix_core_dec( return; } + /*-------------------------------------------------------------------* * mdct_switching_dec() * @@ -1213,174 +4302,517 @@ void mdct_switching_dec_fx( } } } - ELSE IF( EQ_16( st->codec_mode, MODE2 ) && EQ_16( st->mdct_sw_enable, MODE2 ) ) + ELSE IF( EQ_16( st->codec_mode, MODE2 ) && EQ_16( st->mdct_sw_enable, MODE2 ) ) + { + /* Read ahead core mode signaling */ + Word16 next_bit_pos_save; + Word16 core_save; + Word16 bwidth_save; + + next_bit_pos_save = st->next_bit_pos; + move16(); + core_save = st->core; + move16(); + bwidth_save = st->bwidth; + move16(); + + dec_prm_core( st ); /* sets st->core */ + + IF( EQ_16( st->core, HQ_CORE ) ) + { + /* Trigger HQ_CORE */ + st->codec_mode = MODE1; + move16(); + st->mdct_sw = MODE2; + move16(); + } + ELSE + { + /* Rewind bitstream */ + st->next_bit_pos = next_bit_pos_save; + move16(); + if ( st->bfi != 0 ) + { + st->core = core_save; + move16(); + } + /* always reset bwidth, to not interfere with BER logic */ + st->bwidth = bwidth_save; + move16(); + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * reset_elements() + * + * Simulate packet losses by reading FEC pattern from external file + *-------------------------------------------------------------------*/ + +Decoder_State **reset_elements( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 k, n; + Decoder_State **sts = NULL; /* to avoid compilation warning */ + + FOR( k = 0; k < st_ivas->nSCE; k++ ) + { + sts = st_ivas->hSCE[k]->hCoreCoder; + + sts[0]->bfi = 0; + sts[0]->BER_detect = 0; + sts[0]->mdct_sw_enable = 0; + sts[0]->mdct_sw = 0; + + move16(); + move16(); + move16(); + move16(); + + reset_indices_dec( sts[0] ); + } + + FOR( k = 0; k < st_ivas->nCPE; k++ ) + { + sts = st_ivas->hCPE[k]->hCoreCoder; + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + sts[n]->bfi = 0; + sts[n]->BER_detect = 0; + sts[n]->mdct_sw_enable = 0; + sts[n]->mdct_sw = 0; + + move16(); + move16(); + move16(); + move16(); + + reset_indices_dec( sts[n] ); + } + } + + return sts; /* return last decoder state */ +} + + +/*-------------------------------------------------------------------* + * ivas_set_bitstream_pointers() + * + * Set bitstream pointers for every SCE/CPE Core-Decoder + *-------------------------------------------------------------------*/ + +void ivas_set_bitstream_pointers( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 k, num_bits; + Decoder_State **sts; + + num_bits = 0; + + /* set bitstream pointers for SCEs */ + for ( k = 0; k < st_ivas->nSCE; k++ ) + { + sts = st_ivas->hSCE[k]->hCoreCoder; + sts[0]->bit_stream = st_ivas->bit_stream + num_bits; + num_bits += (Word16) ( st_ivas->hSCE[k]->element_brate / FRAMES_PER_SEC ); + } + + /* set bitstream pointers for CPEs */ + for ( k = 0; k < st_ivas->nCPE; k++ ) + { + sts = st_ivas->hCPE[k]->hCoreCoder; + sts[0]->bit_stream = st_ivas->bit_stream + num_bits; + num_bits += (Word16) ( st_ivas->hCPE[k]->element_brate / FRAMES_PER_SEC ); + } + + return; +} + +#ifdef DEBUGGING + +/*-------------------------------------------------------------------* + * file_read_FECpattern() + * + * Simulate packet losses by reading FEC pattern from external file + *-------------------------------------------------------------------*/ + +static ivas_error file_read_FECpattern( + Word16 *bfi ) +{ + ivas_error error; + + error = IVAS_ERR_OK; + *bfi = 0; + + /* FEC pattern file provided */ + if ( FEC_pattern != NULL ) + { + Word16 tmp = 0; + if ( fread( &tmp, sizeof( Word16 ), 1, FEC_pattern ) != 1 ) + { + if ( feof( FEC_pattern ) != 0 ) + { +#ifdef WRAP_AS_EIDXOR + fseek( FEC_pattern, 0L, SEEK_SET ); + fread( &tmp, sizeof( Word16 ), 1, FEC_pattern ); +#else + tmp = 0; + fseek( FEC_pattern, 0L, SEEK_SET ); +#endif + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error reading the FEC pattern file !" ); + } + } + + if ( tmp == 2609 || tmp == 1 || tmp == (UWord16) 0x6B20 /* == G192_SYNC_BAD_FRAME */ ) + { + *bfi = 1; + } + else + { + *bfi = 0; + } + } + + return error; +} + +#endif + +/*-------------------------------------------------------------------* + * read_indices() + * + * Detect SID, NO_DATA, BFI, etc. and set bitstream pointers + * Set ivas_total_brate + * Note: each bit is represented in bitsream buffer as a uint16_t of value 0 or 1 + *-------------------------------------------------------------------*/ + +/*! r: 1 = reading OK, 0 = problem */ +ivas_error read_indices_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + UWord16 bit_stream[], /* i : bitstream buffer */ + UWord16 num_bits, /* i : number of bits in bitstream */ + Word16 *prev_ft_speech, + Word16 *CNG, + Word16 bfi /* i : bad frame indicator */ +) +{ + Word16 k; + Decoder_State **sts; + Word32 total_brate = 0; + move32(); + Word16 curr_ft_good_sp, curr_ft_bad_sp; + Word16 g192_sid_first, sid_upd_bad, sid_update; + Word16 speech_bad, speech_lost; + Word16 n; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + st_ivas->BER_detect = 0; + move16(); + sts = reset_elements( st_ivas ); + +#ifdef DEBUGGING + file_read_FECpattern( &st_ivas->bfi ); + st_ivas->bfi |= bfi; + + if ( bfi == FRAMEMODE_MISSING ) + { + for ( k = 0; k < num_bits; k++ ) + { + bit_stream[k] = 0; + } + } +#else + st_ivas->bfi = bfi; + move16(); +#endif + + /* convert the frame length to total bitrate */ + total_brate = imult3216( num_bits, FRAMES_PER_SEC ); + move32(); + + /* verify that a valid num bits value is present */ + /* only AMRWB, EVS or IVAS bitrates or 0 (NO DATA) are allowed */ + IF( NE_32( st_ivas->ivas_format, MONO_FORMAT ) ) + { + k = 0; + move16(); + + test(); + WHILE( LT_16( k, SIZE_IVAS_BRATE_TBL ) && NE_32( total_brate, ivas_brate_tbl[k] ) ) + { + k = add( k, 1 ); + } + + test(); + test(); + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && ( LT_16( k, SIZE_IVAS_BRATE_TBL ) || LE_32( total_brate, SID_2k40 ) ) ) + { + st_ivas->element_mode_init = IVAS_SCE; + move16(); + } + ELSE IF( ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) && LE_32( total_brate, SID_2k40 ) ) + { + st_ivas->element_mode_init = IVAS_SCE; + move16(); + } + ELSE IF( EQ_16( k, SIZE_IVAS_BRATE_TBL ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error, illegal bitrate (%d) detected! Exiting ! \n", total_brate ); + } + ELSE + { + st_ivas->element_mode_init = -1; + move16(); + } + } + ELSE /* AMRWB or EVS */ + { + st_ivas->element_mode_init = EVS_MONO; + move16(); + + IF( rate2EVSmode( total_brate, NULL ) < 0 ) /* negative value means that a valid rate was not found */ + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error, illegal bitrate (%d) detected! Exiting ! \n", total_brate ); + } + } + + /* G.RX DTX handler*/ + /* handle SID_FIRST, SID_BAD, SPEECH_LOST, NO_DATA */ + /* (total_brate, bfi , st_CNG) = rx_handler(received frame type, [previous frame type], past CNG state, past core) */ + curr_ft_good_sp = 0; + move16(); + curr_ft_bad_sp = 0; + move16(); + + IF( is_DTXrate( total_brate ) == 0 ) + { + IF( st_ivas->bfi == 0 ) + { + curr_ft_good_sp = 1; + move16(); + } + ELSE { - /* Read ahead core mode signaling */ - Word16 next_bit_pos_save; - Word16 core_save; - Word16 bwidth_save; - - next_bit_pos_save = st->next_bit_pos; + curr_ft_bad_sp = 1; move16(); - core_save = st->core; + } + } + + sid_update = 0; + move16(); + sid_upd_bad = 0; + move16(); + IF( EQ_16( is_SIDrate( total_brate ), 1 ) ) + { + IF( st_ivas->bfi == 0 ) + { + sid_update = 1; move16(); - bwidth_save = st->bwidth; + } + ELSE + { + sid_upd_bad = 1; /* this frame type may happen in ETSI/3GPP CS cases, a corrupt SID frames */ move16(); - - dec_prm_core( st ); /* sets st->core */ - - IF( EQ_16( st->core, HQ_CORE ) ) - { - /* Trigger HQ_CORE */ - st->codec_mode = MODE1; - move16(); - st->mdct_sw = MODE2; - move16(); - } - ELSE - { - /* Rewind bitstream */ - st->next_bit_pos = next_bit_pos_save; - move16(); - if ( st->bfi != 0 ) - { - st->core = core_save; - move16(); - } - /* always reset bwidth, to not interfere with BER logic */ - st->bwidth = bwidth_save; - move16(); - } } } - return; -} - - -/*-------------------------------------------------------------------* - * BRATE2IDX_fx() - * - * Convert Bitrate to Index Value - *-------------------------------------------------------------------*/ + /* all zero indices/bits iSP AMRWB SID_update results in a valid LP filter with extremely high LP-filter-gain */ + /* all zero indices/bits may be a result of CS bit errors and/or erroneously injected by gateways or by a bad dejitter handlers */ + test(); + IF( EQ_32( total_brate, SID_1k75 ) && EQ_16( sid_update, 1 ) ) + { + /* valid sid_update received, check for very risky but formally valid content */ + Word16 sum = 0; + move16(); + FOR( k = 0; k < num_bits; ++k ) + { + sum = add( sum, extract_l( EQ_32( bit_stream[k], 1 ) ) ); /* check of 35 zeroes */ + } + if ( sum == 0 ) + { /* all zeros */ + sid_upd_bad = 1; /* initial signal as corrupt (BER likely) */ + move16(); + } + } -Word16 BRATE2IDX_fx( Word32 brate ) -{ + /* AMRWB 26.173 G.192 file reader (read_serial) does not declare/use SID_BAD ft, + it declares every bad synch marked frame initially as a lost_speech frame, + and then the RXDTX handler CNG state decides the decoding mode CNG/SPEECH. + While In the AMRWB ETSI/3GPP format eid a CRC error in a detected SID_UPDATE frames triggers SID_BAD. + Here we inhibit use of the SID-length info, even though it is available in the G.192 file format after STL/EID-XOR . + */ + IF( sid_upd_bad ) + { + sid_upd_bad = 0; + move16(); + total_brate = FRAME_NO_DATA; /* treat SID_BAD as a stolen signaling frame --> SPEECH LOST */ + move32(); + } - Word32 L_temp; - Word32 L_idx; -#define START 9 - extern const Word16 bit_rates_div50[]; + g192_sid_first = 0; + move16(); - /* This is a Fast Bit Rate Value to Index Value Binary Search */ - L_temp = L_msu0( brate, bit_rates_div50[START], 50 ); - L_temp = L_min( 6, L_max( -6, L_temp ) ); - L_idx = L_add( L_temp, START ); - L_temp = L_msu0( brate, bit_rates_div50[L_idx], 50 ); - L_temp = L_min( 3, L_max( -3, L_temp ) ); - L_idx = L_add( L_temp, L_idx ); - L_temp = L_msu0( brate, bit_rates_div50[L_idx], 50 ); - L_temp = L_min( 1, L_max( -2, L_temp ) ); - L_idx = L_add( L_temp, L_idx ); - L_temp = L_msu0( brate, bit_rates_div50[L_idx], 50 ); - if ( L_temp != 0 ) - L_idx = L_add( L_idx, 1 ); - return (Word16) L_idx; -} + test(); + test(); + test(); + test(); + if ( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) && EQ_16( sts[0]->core, AMR_WB_CORE ) && *prev_ft_speech && total_brate == FRAME_NO_DATA && st_ivas->bfi == 0 ) + { + g192_sid_first = 1; /* SID_FIRST detected for previous AMRWB/AMRWBIO active frames only */ + /* It is not possible to perfectly simulate rate switching conditions EVS->AMRWBIO where: + the very first SID_FIRST detection is based on a past EVS active frame + and a good length 0 "SID_FIRST"(NO_DATA) frame is sent in AMRWBIO, + due to the one frame state memory in the AMRWB legacy G.192 SID_FIRST encoding + */ + move16(); + } + speech_bad = 0; + move16(); -/*-------------------------------------------------------------------* - * BRATE2IDX16k_fx() - * - * Convert Bitrate to Index Value - *-------------------------------------------------------------------*/ + test(); + if ( st_ivas->bfi != 0 && ( is_DTXrate( total_brate ) == 0 ) ) + { + speech_bad = 1; /* initial ft assumption, CNG_state decides what to do */ + move16(); + } -Word16 BRATE2IDX16k_fx( Word32 brate ) -{ - Word32 L_temp, L_idx; -#define START_16K 5 - extern const Word16 bit_rates_16k_div50[]; + speech_lost = 0; + move16(); - if ( EQ_32( brate, ACELP_16k40 ) ) + test(); + if ( total_brate == FRAME_NO_DATA && st_ivas->bfi != 0 ) /* unsent NO_DATA or stolen NO_DATA/signaling frame */ { - brate = ACELP_14k80; + speech_lost = 1; /* initial ft assumption, CNG_state decides what to do */ move16(); } - /* This is a Fast Bit Rate Value to Index Value Binary Search */ - L_temp = L_msu0( brate, bit_rates_16k_div50[START_16K], 50 ); - L_temp = L_min( 3, L_max( -3, L_temp ) ); - L_idx = L_add( L_temp, START_16K ); - L_temp = L_msu0( brate, bit_rates_16k_div50[L_idx], 50 ); - L_temp = L_min( 2, L_max( -2, L_temp ) ); - L_idx = L_add( L_temp, L_idx ); - L_temp = L_msu0( brate, bit_rates_16k_div50[L_idx], 50 ); - L_temp = L_min( 1, L_max( -1, L_temp ) ); - L_idx = L_add( L_temp, L_idx ); + /* Do not allow decoder to enter CNG-synthesis for any instantly received GOOD+LENGTH==0 frame + as this frame was never transmitted, one can not know it is good and has a a length of zero ) */ + IF( *CNG != 0 ) + { + /* We were in CNG synthesis */ + if ( curr_ft_good_sp != 0 ) + { + /* only a good speech frame makes you leave CNG synthesis */ + *CNG = 0; + move16(); + } + } + ELSE + { + /* We were in SPEECH synthesis */ + /* only a received/detected SID frame can make the decoder enter into CNG synthsis */ + test(); + test(); + if ( g192_sid_first || sid_update || sid_upd_bad ) + { + *CNG = 1; + move16(); + } + } - return (Word16) L_idx; -} + /* set bfi, total_brate pair for proper decoding */ + /* handle the G.192 _simulated_ untransmitted NO_DATA frame, setting for decoder SPEECH synthesis */ + test(); + test(); + if ( *CNG == 0 && total_brate == FRAME_NO_DATA && st_ivas->bfi == 0 ) + { + st_ivas->bfi = 1; /* SPEECH PLC code will now become active as in a real system */ + /* total_brate= 0 */ + move16(); + } -/*-------------------------------------------------------------------* - * BIT_ALLOC_IDX_fx() - *-------------------------------------------------------------------*/ + /* handle bad/lost speech frame(and CS bad SID frame) in the decoders CNG synthesis settings pair (total_brate, bfi) */ + test(); + test(); + test(); + test(); + IF( ( + NE_16( bfi, FRAMEMODE_FUTURE ) && + ( *CNG != 0 ) && ( ( speech_bad != 0 ) || ( speech_lost != 0 ) ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */ + ( sid_upd_bad != 0 ) ) /* SID_UPD_BAD --> start CNG */ + { + st_ivas->bfi = 0; /* bfi=0 needed to activate CNG code */ + move16(); + total_brate = FRAME_NO_DATA; + move32(); + } -Word32 BIT_ALLOC_IDX_fx( Word32 brate, Word16 ctype, Word16 sfrm, Word16 tc ) -{ - Word32 L_temp; - Word16 temp; - if ( ctype == INACTIVE ) /* no sub(ctype, INACTIVE) because it is '0' */ - ctype = GENERIC; + /* update for next frame's G.192 file format's odd SID_FIRST detection (primarily for AMRWBIO) */ + test(); + *prev_ft_speech = ( ( curr_ft_good_sp != 0 ) || ( curr_ft_bad_sp != 0 ) ); move16(); - L_temp = L_mac0( -1l * 256, 1 * 256, ctype ); - - temp = BRATE2IDX_fx( brate ); - L_temp = L_mac0( L_temp, 4 * 256, temp ); - IF( tc >= 0 ) - L_temp = L_mac0( L_temp, ( 10 - 4 ) * 256, temp ); - /* So either 'temp' x 4 when 'tc < 0', 'temp' x 10 otherwise */ - - L_temp = L_mac0( L_temp, 1 * 256, s_max( 0, tc ) ); - L_temp = L_mac0( L_temp, s_max( 0, sfrm ), 1 ); - if ( sfrm < 0 ) - L_temp = L_shr( L_temp, 2 ); - L_temp = L_shr( L_temp, 6 ); + /* st->total brate= total_brate; updated in a good frame below */ - return L_temp; -} + FOR( k = 0; k < st_ivas->nCPE; k++ ) + { + sts = st_ivas->hCPE[k]->hCoreCoder; + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + sts[n]->bfi = st_ivas->bfi; + move16(); + } + } -/*-------------------------------------------------------------------* - * BIT_ALLOC_IDX_16KHZ_fx() - *-------------------------------------------------------------------*/ + FOR( k = 0; k < st_ivas->nSCE; k++ ) + { + sts = st_ivas->hSCE[k]->hCoreCoder; + sts[0]->bfi = st_ivas->bfi; + move16(); + } -Word32 BIT_ALLOC_IDX_16KHZ_fx( Word32 brate, Word16 ctype, Word16 sfrm, Word16 tc ) -{ - Word32 L_temp; - Word16 temp; - /* 'ctype' = - TRANSITION => 2 - GENERIC => 1 - ALL Other => 0 - */ - L_temp = L_and( shr( 0x0240l, shl( ctype, 1 ) ), 3 ); + IF( st_ivas->bfi == 0 ) + { + /* select Mode 1 or Mode 2 */ + IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) /* EVS mono */ + { + decoder_selectCodec( sts[0], total_brate, bit_stream[0] ); + st_ivas->hDecoderConfig->Opt_AMR_WB = sts[0]->Opt_AMR_WB; + move16(); + } + ELSE /* IVAS */ + { + st_ivas->codec_mode = MODE1; + move16(); + st_ivas->hDecoderConfig->Opt_AMR_WB = 0; + move16(); + } + } - temp = BRATE2IDX16k_fx( brate ); - L_temp = L_mac0( L_temp, 3, temp ); - IF( tc >= 0 ) - L_temp = L_mac0( L_temp, ( 7 - 3 ), temp ); - /* So either 'temp' x 3 when 'tc < 0', 'temp' x 7 otherwise */ + /* GOOD frame */ + test(); + if ( st_ivas->bfi == 0 || EQ_16( st_ivas->bfi, FRAMEMODE_FUTURE ) ) + { + /* GOOD frame - convert ITU-T G.192 words to short values */ + st_ivas->hDecoderConfig->ivas_total_brate = total_brate; + move32(); + } - L_temp = L_mac0( L_temp, 1, s_max( 0, tc ) ); + st_ivas->bit_stream = bit_stream; - IF( sfrm >= 0 ) + IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) { - /* Mult by 5 */ - L_temp = L_add( L_temp, L_shl( L_temp, 2 ) ); - L_temp = L_mac0( L_temp, shr( sfrm, 6 ), 1 ); + ivas_set_bitstream_pointers( st_ivas ); } - return L_temp; + return error; } @@ -1419,6 +4851,7 @@ static void berCheck( return; } + /*-------------------------------------------------------------------* * getPartialCopyInfo() * @@ -1484,8 +4917,11 @@ void getPartialCopyInfo( get_next_indice_tmp_fx( st, nBits ); } + + return; } + /*-------------------------------------------------------------------* * get_rfFlag() * @@ -1494,7 +4930,7 @@ void getPartialCopyInfo( void get_rfFlag( Decoder_State *st, /* i: decoder state structure */ - Word16 *rf_flag, /* o : check for the RF flag */ + Word16 *rf_flag, /* o : check for the RF flag */ Word16 *nBits, Word16 *ind ) { @@ -1527,7 +4963,7 @@ void get_rfFlag( move16(); /* retrieve the signalling indice */ - ind_tmp = (Word16) acelp_sig_tbl[add( start_idx, get_indice( st, 0, nBits_tmp ) )]; + ind_tmp = (Word16) acelp_sig_tbl[add( start_idx, get_indice_fx( st, 0, nBits_tmp ) )]; move16(); /* convert signalling indice into RF flag. */ @@ -1546,8 +4982,11 @@ void get_rfFlag( move16(); } } + + return; } + /*-------------------------------------------------------------------* * get_rfFrameType() * @@ -1579,7 +5018,7 @@ void get_rfFrameType( } /* the last three bits in a packet is the RF frame type */ - *rf_frame_type = get_indice( st, sub( num_bits, 3 ), 3 ); + *rf_frame_type = get_indice_fx( st, sub( num_bits, 3 ), 3 ); move16(); } ELSE @@ -1587,8 +5026,11 @@ void get_rfFrameType( *rf_frame_type = 0; move16(); } + + return; } + /*-------------------------------------------------------------------* * get_rf_fec_offset() * @@ -1619,7 +5061,7 @@ void get_rf_fec_offset( } /* the two bits before the rf frame type contain the fec offset */ - tmp = get_indice( st, sub( num_bits, 5 ), 2 ); + tmp = get_indice_fx( st, sub( num_bits, 5 ), 2 ); IF( tmp == 0 ) { @@ -1637,8 +5079,11 @@ void get_rf_fec_offset( *rf_fec_offset = 0; move16(); } + + return; } + /*-------------------------------------------------------------------* * get_rfTargetBits() * @@ -1650,9 +5095,7 @@ void get_rfTargetBits( Word16 *rf_target_bits /* o : Number of RF target bits */ ) { - /* Number of RF bits for different RF coder types */ - SWITCH( rf_frame_type ) { case RF_NO_DATA: @@ -1692,6 +5135,8 @@ void get_rfTargetBits( move16(); BREAK; } + + return; } @@ -1712,7 +5157,6 @@ void get_NextCoderType_fx( Word8 bit_stream[ACELP_13k20 / 50]; UWord16 tmp; - FOR( k = 0; k < ACELP_13k20 / 50; k++ ) { bit_stream[k] = (UWord8) s_and( shr( bitsteam[k / 8], sub( 7, s_and( k, 7 ) ) ), 0x1 ); @@ -1738,16 +5182,21 @@ void get_NextCoderType_fx( tmp = lshl( tmp, 1 ); tmp = add( tmp, bit_stream[k] ); } + /* retrieve the signalling indice */ *next_coder_type = s_and( extract_l( acelp_sig_tbl[start_idx + tmp] ), 0x7 ); move16(); + + return; } + /*-------------------------------------------------------------------* * get_indice_preview() * * Indices preview to parse for the presence of partial copy *-------------------------------------------------------------------*/ + static UWord16 get_indice_preview( UWord8 *bitstream, Word16 bitstreamSize, @@ -1775,14 +5224,17 @@ static UWord16 get_indice_preview( value = shl( value, 1 ); value = add( value, bitstreamShort[pos + i] ); } + return value; } + /*-------------------------------------------------------------------* * evs_dec_previewFrame() * * Signalling index preview *-------------------------------------------------------------------*/ + void evs_dec_previewFrame( UWord8 *bitstream, Word16 bitstreamSize, @@ -1839,22 +5291,6 @@ void evs_dec_previewFrame( move16(); } } -} - -void dtx_read_padding_bits_fx( - DEC_CORE_HANDLE st, - const Word16 num_bits ) -{ - /* TODO: temporary hack, need to decide what to do with core-coder bitrate */ - Word32 tmp; - - tmp = st->total_brate; - move32(); - st->total_brate = L_add( st->total_brate, L_mult0( num_bits, FRAMES_PER_SEC ) ); - move32(); - get_next_indice_fx( st, num_bits ); - st->total_brate = tmp; - move32(); return; } diff --git a/lib_com/cb_shape_fx.c b/lib_com/cb_shape_fx.c index 56d645ce087d5b54b9eef1509cc3a0009abc43d5..c300589941303e3df0c5b0b1dd7610363245b92e 100644 --- a/lib_com/cb_shape_fx.c +++ b/lib_com/cb_shape_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ diff --git a/lib_com/cldfb_evs.c b/lib_com/cldfb_evs_fx.c similarity index 91% rename from lib_com/cldfb_evs.c rename to lib_com/cldfb_evs_fx.c index c28a534d63b01c63d73249732fba395ba4311f79..a471d8f91fb91d4bb2430d2ecd37dbda09ea86c6 100644 --- a/lib_com/cldfb_evs.c +++ b/lib_com/cldfb_evs_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /*! \file @@ -48,8 +48,9 @@ #define N40 ( 20 ) #define N60 ( 30 ) -static void -cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ); +static Word16 CLDFB_getNumChannels( const Word32 sampleRate ); + +static void cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ); #define cplxMpyS( yr, yi, xr, xi, cr, ci, syr, syi, sxr, sxi, CL_x, CL_z, C_c ) \ CL_x = CL_form( *xr, *xi ); \ @@ -722,7 +723,7 @@ void cldfbSynthesis_fx( scaleLB = limitScale32( sub( scale, scaleFactor->lb_scale ) ); scaleHB = limitScale32( sub( scale, scaleFactor->hb_scale ) ); - outScale = cldfbBank->synFilterHeadroom; + outScale = SYN_FILTER_HEADROOM_2_5MS; move16(); scaleMod = sub( add( scale, cldfbBank->outScalefactor ), outScale ); @@ -811,7 +812,6 @@ void cldfbSynthesis_fx( &iBuffer[0], &iBuffer[1], &iAnalysisS[0], &iAnalysisS[m - 1], 2, 2, 2, -2, rRotVctr, iRotVctr, m ); - /* FFT of DST IV */ scale = 0; move16(); @@ -909,25 +909,29 @@ void cldfbSynthesis_fx( /* move filter states */ Copy( &cldfbBank->FilterStates[nTimeSlots * L2], cldfbBank->FilterStates, statesSizeM2 ); set16_fx( &cldfbBank->FilterStates[statesSizeM2], 0, L2 ); + + return; } /*-------------------------------------------------------------------* - * configureClfdb() + * configureCldfb() * * configures a CLDFB handle *--------------------------------------------------------------------*/ -void configureCldfb( HANDLE_CLDFB_FILTER_BANK h_cldfb, /*!< Returns handle */ - const Word16 no_channels, /*!< Number of channels (bands) */ - const Word16 frameSize /*!< FrameSize */ +void configureCldfb( + HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: Returns handle */ + const Word32 sampling_rate /* i : sampling rate */ ) { + Word16 no_channels; + no_channels = CLDFB_getNumChannels( sampling_rate ); - h_cldfb->no_channels = no_channels; + h_cldfb->no_channels = extract_l( Mpy_32_32_r( sampling_rate, INV_CLDFB_BANDWIDTH_Q31 ) ); move16(); assert( h_cldfb->no_channels >= 10 ); - h_cldfb->no_col = div_l( frameSize, shr( h_cldfb->no_channels, 1 ) ); + h_cldfb->no_col = CLDFB_NO_COL_MAX; move16(); /* was cldfbInitFilterBank()*/ @@ -937,8 +941,6 @@ void configureCldfb( HANDLE_CLDFB_FILTER_BANK h_cldfb, /*!< Returns handle */ move16(); h_cldfb->bandsToZero = 0; move16(); - h_cldfb->filtermode = 0; - move16(); h_cldfb->memory = 0; move16(); h_cldfb->memory_length = 0; @@ -954,14 +956,13 @@ void configureCldfb( HANDLE_CLDFB_FILTER_BANK h_cldfb, /*!< Returns handle */ h_cldfb->zeros = 0; move16(); - h_cldfb->synFilterHeadroom = SYN_FILTER_HEADROOM_2_5MS; - move16(); cldfb_init_proto_and_twiddles( h_cldfb ); + /* the following is related to the EVS implentation only */ h_cldfb->lsb = no_channels; move16(); - h_cldfb->usb = s_min( no_channels, h_cldfb->no_channels ); /* Does this make any sense? in the previous implemenatation lsb, usb and no_channels are all maxCldfbBands */ + h_cldfb->usb = s_min( no_channels, h_cldfb->no_channels ); move16(); h_cldfb->FilterStates = (void *) h_cldfb->FilterStates; @@ -971,23 +972,23 @@ void configureCldfb( HANDLE_CLDFB_FILTER_BANK h_cldfb, /*!< Returns handle */ return; } + /*-------------------------------------------------------------------* * openClfdb() * * open and configures a CLDFB handle *--------------------------------------------------------------------*/ + ivas_error openCldfb( - HANDLE_CLDFB_FILTER_BANK *h_cldfb, /*!< Returns handle */ - const Word16 type, /*!< analysis or synthesis */ - const Word16 maxCldfbBands, /*!< number of cldfb bands */ - const Word16 frameSize /*!< FrameSize */ -#ifdef ADD_IVAS_CLDFB - , - CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ -#endif + HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: Returns handle */ + const Word16 type, /* i : analysis or synthesis */ + const Word32 sampling_rate /* i : sampling rate */ ) { HANDLE_CLDFB_FILTER_BANK hs; + Word16 buf_len, maxCldfbBands; + + maxCldfbBands = CLDFB_getNumChannels( sampling_rate ); hs = (HANDLE_CLDFB_FILTER_BANK) malloc( sizeof( CLDFB_FILTER_BANK ) ); IF( hs == NULL ) @@ -996,28 +997,33 @@ ivas_error openCldfb( } hs->type = type; -#ifdef ADD_IVAS_CLDFB - hs->prototype = prototype; -#endif move16(); + configureCldfb( hs, sampling_rate ); + IF( type == CLDFB_ANALYSIS ) { - hs->FilterStates = (Word16 *) malloc( STATE_BUFFER_SIZE * maxCldfbBands * sizeof( Word16 ) ); + // buf_len = sub( hs->p_filter_length, hs->no_channels ); + buf_len = STATE_BUFFER_SIZE * maxCldfbBands; } ELSE { - hs->FilterStates = (Word16 *) malloc( 2 * STATE_BUFFER_SIZE * maxCldfbBands * sizeof( Word16 ) ); + // buf_len = hs->p_filter_length; + buf_len = 2 * STATE_BUFFER_SIZE * maxCldfbBands; + move16(); } - if ( hs->FilterStates == NULL ) + + IF( ( hs->FilterStates = (Word16 *) malloc( buf_len * sizeof( Word16 ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); } + hs->flags = s_and( hs->flags, ~CLDFB_FLAG_KEEP_STATES ); move16(); - configureCldfb( hs, maxCldfbBands, frameSize ); hs->memory = NULL; + hs->memory32 = NULL; + hs->cldfb_state_fx = NULL; hs->memory_length = 0; move16(); @@ -1026,7 +1032,7 @@ ivas_error openCldfb( test(); IF( ( s_and( hs->flags, CLDFB_FLAG_KEEP_STATES ) == 0 ) && ( hs->FilterStates != 0 ) ) { - set16_fx( hs->FilterStates, 0, i_mult( STATE_BUFFER_SIZE, hs->no_channels ) ); + set16_fx( hs->FilterStates, 0, buf_len ); set16_fx( hs->FilterStates_e, 0, sizeof( hs->FilterStates_e ) / sizeof( hs->FilterStates_e[0] ) ); hs->FilterStates_eg = 0; @@ -1039,7 +1045,7 @@ ivas_error openCldfb( { IF( s_and( hs->flags, CLDFB_FLAG_KEEP_STATES ) == 0 ) { - set16_fx( hs->FilterStates, 0, i_mult( shl( STATE_BUFFER_SIZE, 1 ), hs->no_channels ) ); + set16_fx( hs->FilterStates, 0, buf_len ); } } hs->FilterStates_eg = 0; @@ -1060,10 +1066,12 @@ ivas_error openCldfb( * * Change sample rate of filter bank *--------------------------------------------------------------------*/ -void resampleCldfb( HANDLE_CLDFB_FILTER_BANK hs, - const Word16 newCldfbBands, - const Word16 frameSize, - const Word8 firstFrame ) + +void resampleCldfb( + HANDLE_CLDFB_FILTER_BANK hs, + const Word32 sampling_rate, /* i : sampling rate */ + const Word16 frameSize, + const Word8 firstFrame ) { Word16 timeOffset; @@ -1079,7 +1087,7 @@ void resampleCldfb( HANDLE_CLDFB_FILTER_BANK hs, move16(); /* new settings */ - configureCldfb( hs, newCldfbBands, frameSize ); + configureCldfb( hs, sampling_rate ); /* resample cldfb state buffer */ timeOffset = sub( sub( hs->p_filter_length, hs->no_channels ), hs->zeros ); @@ -1111,20 +1119,20 @@ void resampleCldfb( HANDLE_CLDFB_FILTER_BANK hs, Returns: headroom */ -Word16 -AnalysisPostSpectrumScaling_Fx( HANDLE_CLDFB_FILTER_BANK cldfbBank, /*!< Handle of cldfbBank */ - Word32 **rSubband32, /*!< Real bands Q(cldfbSacle)*/ - Word32 **iSubband32, /*!< Imaginary bands Q(cldfbSacle)*/ - Word16 **rSubband16, /*!< Real bands Q(cldfbSacle)*/ - Word16 **iSubband16, /*!< Imaginary bands Q(cldfbScale)*/ - Word16 *cldfbScale /*!< CLDFB lowband scalefactor */ + +Word16 AnalysisPostSpectrumScaling_Fx( + HANDLE_CLDFB_FILTER_BANK cldfbBank, /*!< Handle of cldfbBank */ + Word32 **rSubband32, /*!< Real bands Q(cldfbSacle)*/ + Word32 **iSubband32, /*!< Imaginary bands Q(cldfbSacle)*/ + Word16 **rSubband16, /*!< Real bands Q(cldfbSacle)*/ + Word16 **iSubband16, /*!< Imaginary bands Q(cldfbScale)*/ + Word16 *cldfbScale /*!< CLDFB lowband scalefactor */ ) { Word16 i; Word16 j; Word16 headRoom; - headRoom = BASOP_util_norm_l_dim2_cplx( (const Word32 *const *) rSubband32, (const Word32 *const *) iSubband32, @@ -1222,19 +1230,21 @@ void analysisCldfbEncoder_fx( return; } -void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) | pointer to the result in the core look-ahead slot */ - Word16 *sf_energyLookahead, /*!< o: pointer to the scalefactor of the result in the core look-ahead slot */ - const Word16 numLookahead, /*!< i: Q0 the number of look-ahead time-slots */ - Word16 **realValues, /*!< i: Q(sf_Values) | the real part of the CLDFB subsamples */ - Word16 **imagValues, /*!< i: Q(sf_Values) | the imaginary part of the CLDFB subsamples */ - Word16 sf_Values, /*!< i: scalefactor of the CLDFB subcamples - apply as a negated Exponent */ - Word16 numberBands, /*!< i: Q0 | number of CLDFB bands */ - Word16 numberCols, /*!< i: Q0 | number of CLDFB subsamples */ - Word32 *energyHF, /*!< o: Q31 | pointer to HF energy */ - Word16 *energyHF_Exp, /*!< o: pointer to exponent of HF energy */ - Word32 *energyValuesSum, /*!< o: Q(2*sf_Values-4) | pointer to sum array of energy values, not initialized*/ - Word16 *energyValuesSum_Exp, /*!< o: pointer to exponents of energyValuesSum, not initialized */ - TEC_ENC_HANDLE hTecEnc ) + +void GetEnergyCldfb( + Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) | pointer to the result in the core look-ahead slot */ + Word16 *sf_energyLookahead, /*!< o: pointer to the scalefactor of the result in the core look-ahead slot */ + const Word16 numLookahead, /*!< i: Q0 the number of look-ahead time-slots */ + Word16 **realValues, /*!< i: Q(sf_Values) | the real part of the CLDFB subsamples */ + Word16 **imagValues, /*!< i: Q(sf_Values) | the imaginary part of the CLDFB subsamples */ + Word16 sf_Values, /*!< i: scalefactor of the CLDFB subcamples - apply as a negated Exponent */ + Word16 numberBands, /*!< i: Q0 | number of CLDFB bands */ + Word16 numberCols, /*!< i: Q0 | number of CLDFB subsamples */ + Word32 *energyHF, /*!< o: Q31 | pointer to HF energy */ + Word16 *energyHF_Exp, /*!< o: pointer to exponent of HF energy */ + Word32 *energyValuesSum, /*!< o: Q(2*sf_Values-4) | pointer to sum array of energy values, not initialized*/ + Word16 *energyValuesSum_Exp, /*!< o: pointer to exponents of energyValuesSum, not initialized */ + TEC_ENC_HANDLE hTecEnc ) { Word16 j; Word16 k; @@ -1247,10 +1257,6 @@ void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) Word32 energyValues[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; Word16 energyValuesSumE[CLDFB_NO_CHANNELS_MAX]; // Word16 freqTable[2] = {20, 40}; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif FOR( k = 0; k < numberCols; k++ ) { @@ -1336,7 +1342,7 @@ void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) { FOR( j = 20; j < numberBandsM; j++ ) { - nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow ); + nrg = L_add_sat( nrg, L_shr_sat( energyValues[k][j], s ) ); } } @@ -1359,7 +1365,7 @@ void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) { FOR( j = 20; j < numberBandsM; j++ ) { - nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow ); + nrg = L_add_sat( nrg, L_shr_sat( energyValues[k][j], s ) ); } } @@ -1385,14 +1391,12 @@ void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) } -Word16 -CLDFB_getNumChannels( Word32 sampleRate ) +static Word16 CLDFB_getNumChannels( + const Word32 sampleRate ) { - Word16 nChannels = 0; move16(); - SWITCH( sampleRate ) { case 48000: @@ -1424,13 +1428,15 @@ CLDFB_getNumChannels( Word32 sampleRate ) return ( nChannels ); } + /*-------------------------------------------------------------------* * cldfb_get_memory_length() * * Return length of filter state for recovery *--------------------------------------------------------------------*/ -static Word16 -cldfb_get_memory_length( HANDLE_CLDFB_FILTER_BANK hs ) + +static Word16 cldfb_get_memory_length( + HANDLE_CLDFB_FILTER_BANK hs ) { IF( EQ_16( hs->type, CLDFB_ANALYSIS ) ) { @@ -1442,39 +1448,21 @@ cldfb_get_memory_length( HANDLE_CLDFB_FILTER_BANK hs ) } } -/*-------------------------------------------------------------------* - * GetEnergyCldfb() - * - * Remove handle - *--------------------------------------------------------------------*/ -void deleteCldfb( HANDLE_CLDFB_FILTER_BANK *h_cldfb ) /* i: cldfb handle */ -{ - IF( *h_cldfb != NULL ) - { - IF( ( *h_cldfb )->FilterStates != NULL ) - { - free( ( *h_cldfb )->FilterStates ); - } - free( *h_cldfb ); - } - *h_cldfb = NULL; -} - /*-------------------------------------------------------------------* * cldfb_init_proto_and_twiddles() * * Initializes rom pointer *--------------------------------------------------------------------*/ -static void -cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle */ -{ +static void cldfb_init_proto_and_twiddles( + HANDLE_CLDFB_FILTER_BANK hs /* i: cldfb handle */ +) +{ /*find appropriate set of rotVecs*/ SWITCH( hs->no_channels ) { case 10: - hs->rRotVctr = rRotVectr_10; hs->iRotVctr = iRotVectr_10; hs->synGain = cldfb_synGain[0]; @@ -1582,6 +1570,8 @@ cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle } BREAK; } + + return; } @@ -1592,8 +1582,10 @@ cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle * * Save the memory of filter; to be restored with cldfb_restore_memory() *--------------------------------------------------------------------*/ -ivas_error -cldfb_save_memory( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle */ + +ivas_error cldfb_save_memory( + HANDLE_CLDFB_FILTER_BANK hs /* i: cldfb handle */ +) { test(); IF( hs->memory != NULL || hs->memory_length != 0 ) @@ -1614,6 +1606,7 @@ cldfb_save_memory( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle */ { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB\n" ); } + return IVAS_ERR_OK; } @@ -1623,12 +1616,14 @@ cldfb_save_memory( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle */ * * Restores the memory of filter; memory to be save by cldfb_save_memory() *--------------------------------------------------------------------*/ -void cldfb_restore_memory( HANDLE_CLDFB_FILTER_BANK hs ) /* i/o: cldfb handle */ + +void cldfb_restore_memory( + HANDLE_CLDFB_FILTER_BANK hs /* i/o: cldfb handle */ +) { Word16 size; - size = cldfb_get_memory_length( hs ); /* read the memory */ @@ -1637,7 +1632,6 @@ void cldfb_restore_memory( HANDLE_CLDFB_FILTER_BANK hs ) /* i/o: cldfb handle */ hs->FilterStates_eg = hs->memory[hs->memory_length + CLDFB_MEM_EXPONENTS]; move16(); - /* adjust sample rate if it was changed in the meanwhile */ IF( NE_16( hs->memory_length, size ) ) { @@ -1651,12 +1645,16 @@ void cldfb_restore_memory( HANDLE_CLDFB_FILTER_BANK hs ) /* i/o: cldfb handle */ return; } + /*-------------------------------------------------------------------* * cldfb_reset_memory() * * Resets the memory of filter. *--------------------------------------------------------------------*/ -void cldfb_reset_memory( HANDLE_CLDFB_FILTER_BANK hs ) /* i/o: cldfb handle */ + +void cldfb_reset_memory( + HANDLE_CLDFB_FILTER_BANK hs /* i/o: cldfb handle */ +) { Word16 length; @@ -1666,5 +1664,6 @@ void cldfb_reset_memory( HANDLE_CLDFB_FILTER_BANK hs ) /* i/o: cldfb handle */ set16_fx( hs->FilterStates_e, 0, sizeof( hs->FilterStates_e ) / sizeof( hs->FilterStates_e[0] ) ); hs->FilterStates_eg = 0; move16(); + return; } diff --git a/lib_com/cldfb.c b/lib_com/cldfb_fx.c similarity index 67% rename from lib_com/cldfb.c rename to lib_com/cldfb_fx.c index 48fe4d9bccb58d9b607f8be587de94e97a367187..449e197ac1eff91d571d50377ba41e2a5ba469c2 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -41,7 +41,6 @@ #include "stat_dec.h" #include "prot_fx.h" #include "rom_com.h" -#include "rom_com_fx.h" #include "wmc_auto.h" #if __STDC_VERSION__ >= 199901L #if defined __ICL @@ -51,27 +50,33 @@ #define restrict #endif - /*-------------------------------------------------------------------* * Local prototypes *--------------------------------------------------------------------*/ static void cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ); -static void cldfb_init_proto_and_twiddles_enc_fx( HANDLE_CLDFB_FILTER_BANK hs ); - +static void GetEnergyCldfb_ivas_fx( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) | pointer to the result in the core look-ahead slot */ + Word16 *sf_energyLookahead, /*!< o: pointer to the scalefactor of the result in the core look-ahead slot */ + const Word16 numLookahead, /*!< i: Q0 the number of look-ahead time-slots */ + Word16 **realValues, /*!< i: Q(sf_Values) | the real part of the CLDFB subsamples */ + Word16 **imagValues, /*!< i: Q(sf_Values) | the imaginary part of the CLDFB subsamples */ + Word16 sf_Values, /*!< i: scalefactor of the CLDFB subcamples - apply as a negated Exponent */ + Word16 numberBands, /*!< i: Q0 | number of CLDFB bands */ + Word16 numberCols, /*!< i: Q0 | number of CLDFB subsamples */ + Word32 *energyHF, /*!< o: Q31 | pointer to HF energy */ + Word16 *energyHF_Exp, /*!< o: pointer to exponent of HF energy */ + Word32 *energyValuesSum, /*!< o: Q(2*sf_Values-4) | pointer to sum array of energy values, not initialized*/ + Word16 *energyValuesSum_Exp, /*!< o: pointer to exponents of energyValuesSum, not initialized */ + TEC_ENC_HANDLE hTecEnc ); -/*-------------------------------------------------------------------* - * cplxMult() - * - * Conduct complex multiplication - *--------------------------------------------------------------------*/ /*-------------------------------------------------------------------* * cldfbAnalysis_ivas() * * Conduct multiple overlap complex low delay MDCT *--------------------------------------------------------------------*/ + void cldfbAnalysis_ivas_fx( const Word32 *timeIn_fx, /* i : time buffer Qx */ Word32 **realBuffer_fx, /* o : real value buffer Qx - 5*/ @@ -91,8 +96,7 @@ void cldfbAnalysis_ivas_fx( Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX]; const Word32 *rot_vctr_re_fx; const Word32 *rot_vctr_im_fx; - const Word16 *ptr_pf_fx; - Word16 ptr_pf_sf; + const Word32 *ptr_pf_fx; Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; Word16 offset, frameSize; @@ -134,8 +138,7 @@ void cldfbAnalysis_ivas_fx( rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx; rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx; - ptr_pf_fx = h_cldfb->p_filter; - ptr_pf_sf = h_cldfb->p_filter_sf; // Q14 + ptr_pf_fx = h_cldfb->p_filter_32; move16(); FOR( i = 0; i < no_col; i++ ) @@ -143,34 +146,30 @@ void cldfbAnalysis_ivas_fx( FOR( k = 0; k < M4; k++ ) { /* prototype filter */ - r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx - - r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // Qx - - i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx - - i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx - - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // Qx - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // Qx - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // Qx - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // Qx - 1 + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // Qx + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx + /* folding + pre modulation of DST IV */ rr12_fx = L_sub( r1_fx, r2_fx ); // Qx - 1 @@ -194,34 +193,29 @@ void cldfbAnalysis_ivas_fx( FOR( k = M4; k < M2; k++ ) { /* prototype filter */ - r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx - - r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx - - i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx - - i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx - - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // Qx - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // Qx - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // Qx - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // Qx - 1 + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx /* folding + pre modulation of DST IV */ rr12_fx = L_add( r1_fx, r2_fx ); // Qx - 1 @@ -310,8 +304,7 @@ void cldfbAnalysis_ts_fx( const Word32 *rot_vctr_im_fx; const Word32 *rot_vctr_delay_re_fx; const Word32 *rot_vctr_delay_im_fx; - const Word16 *ptr_pf_fx; - Word16 ptr_pf_sf; + const Word32 *ptr_pf_fx; Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; Word16 offset, frameSize; @@ -358,8 +351,7 @@ void cldfbAnalysis_ts_fx( rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31 rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31 - ptr_pf_fx = h_cldfb->p_filter; - ptr_pf_sf = h_cldfb->p_filter_sf; // Q14 + ptr_pf_fx = h_cldfb->p_filter_32; move16(); FOR( i = 0; i < no_col; i++ ) @@ -367,50 +359,45 @@ void cldfbAnalysis_ts_fx( FOR( k = 0; k < M4; k++ ) { /* prototype filter */ - r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q - - i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - - i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q /* folding + pre modulation of DST IV */ - rr12_fx = L_sub( r1_fx, r2_fx ); // q -1 - ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1 - /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + rr12_fx = L_sub( r1_fx, r2_fx ); // q -1 + ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1 + /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ + rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 + rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 move32(); move32(); ///* folding + pre modulation of DCT IV */ - ir12_fx = L_add( r1_fx, r2_fx ); // q - 1 - ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1 - /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + ir12_fx = L_add( r1_fx, r2_fx ); // q - 1 + ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1 + /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ + iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 + iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 move32(); move32(); } @@ -418,50 +405,45 @@ void cldfbAnalysis_ts_fx( FOR( k = M4; k < M2; k++ ) { /* prototype filter */ - r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - - i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q /* folding + pre modulation of DST IV */ - rr12_fx = L_add( r1_fx, r2_fx ); // q - 1 - ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1 - /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + rr12_fx = L_add( r1_fx, r2_fx ); // q - 1 + ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1 + /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ + rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 + rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 move32(); move32(); /* folding + pre modulation of DCT IV */ - ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1 - ii12_fx = L_add( i1_fx, i2_fx ); // q - 1 - /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1 + ii12_fx = L_add( i1_fx, i2_fx ); // q - 1 + /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ + iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 + iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 move32(); move32(); } @@ -486,15 +468,6 @@ void cldfbAnalysis_ts_fx( } fft_cldfb_fx( rBuffer_fx, M2 ); - /* post modulation of DST IV */ - FOR( k = 0; k < M2; k++ ) - { - /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ - realBuffer_fx[( ( M1 - 1 ) - ( k * 2 ) )] = L_sub( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 - realBuffer_fx[2 * k] = L_add( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 - move32(); - move32(); - } *q_cldfb = sub( *q_cldfb, 2 ); move16(); @@ -515,13 +488,23 @@ void cldfbAnalysis_ts_fx( move32(); } + /* post modulation of DST IV */ + FOR( k = 0; k < M2; k++ ) + { + /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ + realBuffer_fx[( ( M1 - 1 ) - ( k * 2 ) )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 + realBuffer_fx[2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 + move32(); + move32(); + } + /* post modulation of DCT IV */ FOR( k = 0; k < M2; k++ ) { /* do it inplace */ /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ - imagBuffer_fx[2 * k] = L_sub( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 - imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = L_add( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 + imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 + imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 move32(); move32(); } @@ -542,8 +525,8 @@ void cldfbAnalysis_ts_fx( /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/ /*realBuffer[k] = rBuffer[k]; imagBuffer[k] = iBuffer[k];*/ - cplx_aux_fx = L_sub( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ) ); // q - 5 - imagBuffer_fx[k] = L_add( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ) ); // q - 5 + cplx_aux_fx = Msub_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ); // q - 5 + imagBuffer_fx[k] = Madd_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ); // q - 5 realBuffer_fx[k] = cplx_aux_fx; move32(); move32(); @@ -569,14 +552,11 @@ void cldfbAnalysis_ts_fx( } void cldfbAnalysis_ts_fx_var_q( - const Word32 *timeIn_fx, - /* i : time buffer */ // q - Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX], - /* o : real value buffer */ // q_cldfb - 5 - Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX], - /* o : imag value buffer */ // q_cldfb - 5 - const Word16 samplesToProcess, /* i : samples to process */ - HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ + const Word32 *timeIn_fx, /* i : time buffer q */ + Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : real value buffer q_cldfb - 5 */ + Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : imag value buffer q_cldfb - 5 */ + const Word16 samplesToProcess, /* i : samples to process */ + HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ Word16 *q_cldfb ) { @@ -592,8 +572,7 @@ void cldfbAnalysis_ts_fx_var_q( const Word32 *rot_vctr_im_fx; const Word32 *rot_vctr_delay_re_fx; const Word32 *rot_vctr_delay_im_fx; - const Word16 *ptr_pf_fx; - Word16 ptr_pf_sf; + const Word32 *ptr_pf_fx; Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; Word16 offset, frameSize; @@ -657,8 +636,7 @@ void cldfbAnalysis_ts_fx_var_q( rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31 rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31 - ptr_pf_fx = h_cldfb->p_filter; - ptr_pf_sf = h_cldfb->p_filter_sf; // Q14 + ptr_pf_fx = h_cldfb->p_filter_32; move16(); FOR( i = 0; i < no_col; i++ ) @@ -666,34 +644,29 @@ void cldfbAnalysis_ts_fx_var_q( FOR( k = 0; k < M4; k++ ) { /* prototype filter */ - r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q - - i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - - i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q /* folding + pre modulation of DST IV */ rr12_fx = L_sub( r1_fx, r2_fx ); // q -1 @@ -717,34 +690,30 @@ void cldfbAnalysis_ts_fx_var_q( FOR( k = M4; k < M2; k++ ) { /* prototype filter */ - r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - - i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + /* folding + pre modulation of DST IV */ rr12_fx = L_add( r1_fx, r2_fx ); // q - 1 @@ -841,14 +810,11 @@ void cldfbAnalysis_ts_fx_var_q( void cldfbAnalysis_ts_fx_fixed_q( - const Word32 *timeIn_fx, - /* i : time buffer */ // q - Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX], - /* o : real value buffer */ // q - 5 - Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX], - /* o : imag value buffer */ // q - 5 - const Word16 samplesToProcess, /* i : samples to process */ - HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ + const Word32 *timeIn_fx, /* i : time buffer q */ + Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : real value buffer q - 5 */ + Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : imag value buffer q - 5 */ + const Word16 samplesToProcess, /* i : samples to process */ + HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ Word16 *q_cldfb ) { Word16 i, k; @@ -863,10 +829,9 @@ void cldfbAnalysis_ts_fx_fixed_q( const Word32 *rot_vctr_im_fx; const Word32 *rot_vctr_delay_re_fx; const Word32 *rot_vctr_delay_im_fx; - const Word16 *ptr_pf_fx; - Word16 ptr_pf_sf; + const Word32 *ptr_pf_fx; Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; - Word16 offset, frameSize; + Word16 offset, frameSize, gb, hr, shift; offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels ); frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col ); @@ -910,8 +875,7 @@ void cldfbAnalysis_ts_fx_fixed_q( rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31 rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31 - ptr_pf_fx = h_cldfb->p_filter; - ptr_pf_sf = h_cldfb->p_filter_sf; // Q14 + ptr_pf_fx = h_cldfb->p_filter_32; move16(); FOR( i = 0; i < no_col; i++ ) @@ -919,34 +883,29 @@ void cldfbAnalysis_ts_fx_fixed_q( FOR( k = 0; k < M4; k++ ) { /* prototype filter */ - r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q - - i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - - i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q /* folding + pre modulation of DST IV */ rr12_fx = L_sub( r1_fx, r2_fx ); // q -1 @@ -970,34 +929,29 @@ void cldfbAnalysis_ts_fx_fixed_q( FOR( k = M4; k < M2; k++ ) { /* prototype filter */ - r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - - i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q /* folding + pre modulation of DST IV */ rr12_fx = L_add( r1_fx, r2_fx ); // q - 1 @@ -1036,18 +990,42 @@ void cldfbAnalysis_ts_fx_fixed_q( *q_cldfb = sub( *q_cldfb, 2 ); move16(); + gb = find_guarded_bits_fx( M1 ); + hr = L_norm_arr( iBuffer_fx, M1 ); + + IF( LT_16( hr, gb ) ) + { + scale_sig32( iBuffer_fx, M1, sub( hr, gb ) ); + } + /* FFT of DCT IV */ fft_cldfb_fx( iBuffer_fx, M2 ); /* post modulation of DCT IV */ - FOR( k = 0; k < M2; k++ ) + IF( LT_16( hr, gb ) ) { - /* do it inplace */ - /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ - imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 - imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 - move32(); - move32(); + shift = sub( gb, hr ); + FOR( k = 0; k < M2; k++ ) + { + /* do it inplace */ + /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ + imagBuffer_fx[2 * k] = L_shl( Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ), shift ); // q - 5 + imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = L_shl( Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ), shift ); // q - 5 + move32(); + move32(); + } + } + ELSE + { + FOR( k = 0; k < M2; k++ ) + { + /* do it inplace */ + /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ + imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 + imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 + move32(); + move32(); + } } IF( EQ_32( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -1091,20 +1069,20 @@ void cldfbAnalysis_ts_fx_fixed_q( return; } + /*-------------------------------------------------------------------* * cldfbSynthesis_ivas() * * Conduct inverse multple overlap cmplex low delay MDCT *--------------------------------------------------------------------*/ void cldfbSynthesis_ivas_fx( - Word32 **realBuffer_fx, /* i : real values Qx*/ - Word32 **imagBuffer_fx, /* i : imag values Qx*/ - Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/ - const Word16 samplesToProcess, /* i : number of processed samples */ -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - const Word16 shift, /* i : scale for state buffer */ -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ - HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filter bank state */ + Word32 **realBuffer_fx, /* i : real values Qx*/ + Word32 **imagBuffer_fx, /* i : imag values Qx*/ + Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/ + const Word16 samplesToProcess, /* i : number of processed samples */ + const Word16 shift, /* i : scale for state buffer */ + const Word16 out_shift, /* i : scale for output buffer */ + HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filter bank state */ ) { Word16 i; @@ -1129,8 +1107,7 @@ void cldfbSynthesis_ivas_fx( Word32 new_samples_fx[2 * CLDFB_NO_CHANNELS_MAX]; Word32 *ptr_time_out_fx; - const Word16 *p_filter; - Word16 p_filter_sf; + const Word32 *p_filter_32; Word32 accu0, accu1, accu2, accu3, accu4; Word16 no_col = h_cldfb->no_col; @@ -1160,9 +1137,7 @@ void cldfbSynthesis_ivas_fx( synthesisBuffer_fx = buffer_fx; Copy32( h_cldfb->cldfb_state_fx, synthesisBuffer_fx + i_mult( M1, no_col ), h_cldfb->p_filter_length ); - p_filter = h_cldfb->p_filter; - p_filter_sf = h_cldfb->p_filter_sf; // Q14 - move16(); + p_filter_32 = h_cldfb->p_filter_32; ptr_time_out_fx = timeOut_fx; /*synthesisBuffer += M1 * h_cldfb->no_col;*/ @@ -1269,17 +1244,15 @@ void cldfbSynthesis_ivas_fx( } /* synthesis prototype filter */ -#ifdef OPT_SBA_AVOID_SPAR_RESCALE IF( 0 == shift ) { -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ FOR( i = 0; i < L2; i++ ) { - accu0 = Madd_32_16( synthesisBuffer_fx[i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[i] ), p_filter_sf ); // Qx - 1 - accu1 = Madd_32_16( synthesisBuffer_fx[1 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 1 * L2 + i )] ), p_filter_sf ); // Qx - 1 - accu2 = Madd_32_16( synthesisBuffer_fx[2 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 2 * L2 + i )] ), p_filter_sf ); // Qx - 1 - accu3 = Madd_32_16( synthesisBuffer_fx[3 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 3 * L2 + i )] ), p_filter_sf ); // Qx - 1 - accu4 = Madd_32_16( synthesisBuffer_fx[4 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 4 * L2 + i )] ), p_filter_sf ); // Qx - 1 + accu0 = Madd_32_32( synthesisBuffer_fx[i], new_samples_fx[L2 - 1 - i], p_filter_32[i] ); // Qx - 1 + accu1 = Madd_32_32( synthesisBuffer_fx[1 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 1 * L2 + i )] ); // Qx - 1 + accu2 = Madd_32_32( synthesisBuffer_fx[2 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 2 * L2 + i )] ); // Qx - 1 + accu3 = Madd_32_32( synthesisBuffer_fx[3 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 3 * L2 + i )] ); // Qx - 1 + accu4 = Madd_32_32( synthesisBuffer_fx[4 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 4 * L2 + i )] ); // Qx - 1 synthesisBuffer_fx[i] = accu0; move32(); @@ -1292,19 +1265,18 @@ void cldfbSynthesis_ivas_fx( synthesisBuffer_fx[4 * L2 + i] = accu4; move32(); } -#ifdef OPT_SBA_AVOID_SPAR_RESCALE } ELSE { FOR( i = 0; i < L2; i++ ) { - Word32 prod = L_shl_sat( Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter_sf ), shift ); - accu0 = Madd_32_16( synthesisBuffer_fx[i], prod, p_filter[i] ); // Qx - 1 - accu1 = Madd_32_16( synthesisBuffer_fx[1 * L2 + i], prod, p_filter[( 1 * L2 + i )] ); // Qx - 1 - accu2 = Madd_32_16( synthesisBuffer_fx[2 * L2 + i], prod, p_filter[( 2 * L2 + i )] ); // Qx - 1 - accu3 = Madd_32_16( synthesisBuffer_fx[3 * L2 + i], prod, p_filter[( 3 * L2 + i )] ); // Qx - 1 - accu4 = Madd_32_16( synthesisBuffer_fx[4 * L2 + i], prod, p_filter[( 4 * L2 + i )] ); // Qx - 1 + Word32 prod = L_shl_sat( ( new_samples_fx[L2 - 1 - i] ), shift ); + accu0 = Madd_32_32( synthesisBuffer_fx[i], prod, p_filter_32[i] ); // Qx -1 + shift + accu1 = Madd_32_32( synthesisBuffer_fx[1 * L2 + i], prod, p_filter_32[( 1 * L2 + i )] ); // Qx -1 + shift + accu2 = Madd_32_32( synthesisBuffer_fx[2 * L2 + i], prod, p_filter_32[( 2 * L2 + i )] ); // Qx -1 + shift + accu3 = Madd_32_32( synthesisBuffer_fx[3 * L2 + i], prod, p_filter_32[( 3 * L2 + i )] ); // Qx -1 + shift + accu4 = Madd_32_32( synthesisBuffer_fx[4 * L2 + i], prod, p_filter_32[( 4 * L2 + i )] ); // Qx -1 + shift synthesisBuffer_fx[i] = accu0; move32(); @@ -1318,12 +1290,22 @@ void cldfbSynthesis_ivas_fx( move32(); } } -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ - FOR( i = 0; i < M1; i++ ) + IF( 0 == out_shift ) { - ptr_time_out_fx[( M1 - 1 ) - i] = synthesisBuffer_fx[4 * L2 + M1 + i]; - move32(); + FOR( i = 0; i < M1; i++ ) + { + ptr_time_out_fx[( M1 - 1 ) - i] = synthesisBuffer_fx[4 * L2 + M1 + i]; + move32(); + } + } + ELSE + { + FOR( i = 0; i < M1; i++ ) + { + ptr_time_out_fx[( M1 - 1 ) - i] = L_shl_sat( synthesisBuffer_fx[4 * L2 + M1 + i], out_shift ); + move32(); + } } ptr_time_out_fx += M1; @@ -1340,38 +1322,21 @@ void cldfbSynthesis_ivas_fx( } -void configureCldfb_ivas_enc_fx( - HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle */ - const Word32 sampling_rate /* i : sampling rate */ -) -{ - - h_cldfb->no_col = CLDFB_NO_COL_MAX; - h_cldfb->bandsToZero = 0; - h_cldfb->nab = 0; - - h_cldfb->no_channels = extract_l( Mpy_32_32_r( sampling_rate, INV_CLDFB_BANDWIDTH_Q31 ) ); - h_cldfb->p_filter_length = i_mult( 10, h_cldfb->no_channels ); - h_cldfb->zeros = 0; - h_cldfb->anaScalefactor = 0; - h_cldfb->synScalefactor = 0; - h_cldfb->filterScale = 1; - cldfb_init_proto_and_twiddles_enc_fx( h_cldfb ); +/*-------------------------------------------------------------------* + * configureCldfb() + * + * configures a CLDFB handle + *--------------------------------------------------------------------*/ - return; -} void configureCldfb_ivas_fx( HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle */ const Word32 sampling_rate /* i : sampling rate */ ) { - h_cldfb->no_col = CLDFB_NO_COL_MAX; move16(); h_cldfb->bandsToZero = 0; move16(); - h_cldfb->nab = 0; - move16(); // h_cldfb->no_channels = (int16_t) ( sampling_rate * INV_CLDFB_BANDWIDTH + 0.5f ); h_cldfb->no_channels = extract_l( Mpy_32_32_r( sampling_rate, INV_CLDFB_BANDWIDTH_Q31 ) ); @@ -1382,6 +1347,8 @@ void configureCldfb_ivas_fx( move16(); h_cldfb->synScalefactor = 0; move16(); + h_cldfb->filterScale = 1; + move16(); h_cldfb->p_filter_length = i_mult( 10, h_cldfb->no_channels ); move16(); @@ -1389,17 +1356,20 @@ void configureCldfb_ivas_fx( return; } + + /*-------------------------------------------------------------------* * openClfdb() * * open and configures a CLDFB handle *--------------------------------------------------------------------*/ + ivas_error openCldfb_ivas_fx( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ const Word32 sampling_rate, /* i : sampling rate */ CLDFB_PROTOTYPE prototype, /* i : CLDFB version (1.25ms/5ms delay) */ - const Word16 enc_dec ) /* i : encoder/decoder flag */ + const Word16 enc_dec ) /* i : encoder/decoder flag */ { HANDLE_CLDFB_FILTER_BANK hs; Word16 buf_len; @@ -1413,17 +1383,19 @@ ivas_error openCldfb_ivas_fx( move32(); hs->prototype = prototype; move32(); + + configureCldfb_ivas_fx( hs, sampling_rate ); + IF( enc_dec == ENC ) { - configureCldfb_ivas_enc_fx( hs, sampling_rate ); hs->Q_cldfb_state = 0; } ELSE { - configureCldfb_ivas_fx( hs, sampling_rate ); hs->Q_cldfb_state = Q11; } move16(); + hs->memory32 = NULL; hs->FilterStates = NULL; hs->memory_length = 0; @@ -1456,11 +1428,13 @@ ivas_error openCldfb_ivas_fx( return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * resampleCldfb_ivas() * * Change sample rate of filter bank *--------------------------------------------------------------------*/ + void resampleCldfb_ivas_fx( HANDLE_CLDFB_FILTER_BANK hs, /* i/o: filter bank handle */ const Word32 newSamplerate ) @@ -1482,6 +1456,166 @@ void resampleCldfb_ivas_fx( } +static void GetEnergyCldfb_ivas_fx( + Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) | pointer to the result in the core look-ahead slot */ + Word16 *sf_energyLookahead, /*!< o: pointer to the scalefactor of the result in the core look-ahead slot */ + const Word16 numLookahead, /*!< i: Q0 the number of look-ahead time-slots */ + Word16 **realValues, /*!< i: Q(sf_Values) | the real part of the CLDFB subsamples */ + Word16 **imagValues, /*!< i: Q(sf_Values) | the imaginary part of the CLDFB subsamples */ + Word16 sf_Values, /*!< i: scalefactor of the CLDFB subcamples - apply as a negated Exponent */ + Word16 numberBands, /*!< i: Q0 | number of CLDFB bands */ + Word16 numberCols, /*!< i: Q0 | number of CLDFB subsamples */ + Word32 *energyHF, /*!< o: Q31 | pointer to HF energy */ + Word16 *energyHF_Exp, /*!< o: pointer to exponent of HF energy */ + Word32 *energyValuesSum, /*!< o: Q(2*sf_Values-4) | pointer to sum array of energy values, not initialized*/ + Word16 *energyValuesSum_Exp, /*!< o: pointer to exponents of energyValuesSum, not initialized */ + TEC_ENC_HANDLE hTecEnc ) +{ + Word16 j; + Word16 k; + Word16 s; + Word16 sm; + Word32 nrg; + Word16 numberColsL; + Word16 numberBandsM; + Word16 numberBandsM20; + Word32 energyValues[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 energyValuesSumE[CLDFB_NO_CHANNELS_MAX]; + // Word16 freqTable[2] = {20, 40}; + + FOR( k = 0; k < numberCols; k++ ) + { + FOR( j = 0; j < numberBands; j++ ) + { + nrg = L_mult0( realValues[k][j], realValues[k][j] ); // Q(2*sf_Values) + nrg = L_mac0( nrg, imagValues[k][j], imagValues[k][j] ); // Q(2*sf_Values) + + energyValues[k][j] = nrg; + move32(); + } + } + + IF( GE_16( numberBands, freqTable[1] ) && hTecEnc != NULL ) + { + Word32 *tempEnergyValuesArry[CLDFB_NO_COL_MAX]; + Word16 ScaleX2; + assert( numberCols == CLDFB_NO_COL_MAX ); + FOR( j = 0; j < numberCols; j++ ) + { + tempEnergyValuesArry[j] = &energyValues[j][0]; + } + + ScaleX2 = shl( sf_Values, 1 ); + calcHiEnvLoBuff_Fix( + numberCols, + freqTable, + 1, + tempEnergyValuesArry, + hTecEnc->loBuffer, + hTecEnc->hiTempEnv, + ScaleX2 ); + } + + FOR( j = 0; j < numberBands; j++ ) + { + energyValuesSum[j] = 0; + move32(); + energyValuesSumE[j] = 31; + move16(); + FOR( k = 0; k < CLDFB_NO_COL_MAX; k++ ) + { + nrg = L_shr_r( energyValues[k][j], sub( energyValuesSumE[j], 31 ) ); // Q(2*sf_Values - (energyValuesSumE[j]-31)) + IF( LT_32( L_sub( maxWord32, nrg ), energyValuesSum[j] ) ) + { + energyValuesSumE[j] = add( energyValuesSumE[j], 1 ); + move16(); + energyValuesSum[j] = L_shr_r( energyValuesSum[j], 1 ); + move32(); + nrg = L_shr_r( nrg, 1 ); + } + energyValuesSum[j] = L_add( energyValuesSum[j], nrg ); + move32(); + } + test(); + if ( j == 0 || GT_16( energyValuesSumE[j], *energyValuesSum_Exp ) ) + { + *energyValuesSum_Exp = energyValuesSumE[j]; + move16(); + } + } + FOR( j = 0; j < numberBands; j++ ) + { + energyValuesSum[j] = L_shr_r( energyValuesSum[j], sub( *energyValuesSum_Exp, energyValuesSumE[j] ) ); // Q(energyValuesSum_Exp - (2*sf_Values)) + move32(); + } + *energyValuesSum_Exp = sub( *energyValuesSum_Exp, shl( sf_Values, 1 ) ); + move16(); + + IF( GT_16( numberBands, 20 ) ) + { + numberBandsM = s_min( numberBands, 40 ); + numberBandsM20 = sub( numberBandsM, 20 ); + + numberColsL = sub( numberCols, numLookahead ); + + /* sum up CLDFB energy above 8 kHz */ + s = BASOP_util_norm_s_bands2shift( i_mult( numberColsL, numberBandsM20 ) ); + s = sub( s, 4 ); + nrg = 0; + move32(); + FOR( k = 0; k < numberColsL; k++ ) + { + FOR( j = 20; j < numberBandsM; j++ ) + { + nrg = L_add_sat( nrg, L_shr_sat( energyValues[k][j], s ) ); + } + } + + s = sub( sub( shl( sf_Values, 1 ), 1 ), s ); + sm = sub( s_min( s, *sf_energyLookahead ), 1 ); + + *energyHF = L_add( L_shr( nrg, limitScale32( sub( s, sm ) ) ), + L_shr( *energyLookahead, sub( *sf_energyLookahead, sm ) ) ); // Q(31-(-nm)) + move32(); + + *energyHF_Exp = negate( sm ); + move16(); + + /* process look-ahead region */ + s = BASOP_util_norm_s_bands2shift( i_mult( numLookahead, numberBandsM20 ) ); + s = sub( s, 2 ); + nrg = 0; + move32(); + FOR( k = numberColsL; k < numberCols; k++ ) + { + FOR( j = 20; j < numberBandsM; j++ ) + { + nrg = L_add_sat( nrg, L_shr_sat( energyValues[k][j], s ) ); + } + } + + s = sub( shl( sf_Values, 1 ), s ); + sm = sub( s_min( s, 44 ), 1 ); + BASOP_SATURATE_WARNING_OFF_EVS + /* nrg + 6.1e-5f => value 0x40000000, scale 44 */ + *energyLookahead = L_add_sat( L_shr_sat( nrg, sub( s, sm ) ), + L_shr_sat( 0x40000000, s_max( -31, s_min( 31, sub( 44, sm ) ) ) ) ); + move32(); + BASOP_SATURATE_WARNING_ON_EVS + *sf_energyLookahead = sm; + move16(); + + return; + } + + + *energyHF = 0x40000000; + move32(); + *energyHF_Exp = 17; + move16(); +} + + void analysisCldfbEncoder_ivas_fx( Encoder_State *st, /* i/o: encoder state structure */ Word32 *timeIn, /*q11*/ @@ -1542,12 +1676,19 @@ void analysisCldfbEncoder_ivas_fx( AnalysisPostSpectrumScaling_Fx( st->cldfbAnaEnc, ppBuf_Real, ppBuf_Imag, ppBuf_Real16, ppBuf_Imag16, &enerScale.lb_scale16 ); - GetEnergyCldfb( &st->energyCoreLookahead_Fx, &st->sf_energyCoreLookahead_Fx, 1, ppBuf_Real16, ppBuf_Imag16, enerScale.lb_scale16, st->cldfbAnaEnc->no_channels, st->cldfbAnaEnc->no_col, &st->currEnergyHF_fx, &st->currEnergyHF_e_fx, ppBuf_Ener, enerBuffSum_exp, st->hTECEnc ); + GetEnergyCldfb_ivas_fx( &st->energyCoreLookahead_Fx, &st->sf_energyCoreLookahead_Fx, 1, ppBuf_Real16, ppBuf_Imag16, enerScale.lb_scale16, st->cldfbAnaEnc->no_channels, st->cldfbAnaEnc->no_col, &st->currEnergyHF_fx, &st->currEnergyHF_e_fx, ppBuf_Ener, enerBuffSum_exp, st->hTECEnc ); return; } -void deleteCldfb_ivas_fx( + +/*-------------------------------------------------------------------* + * deleteCldfb() + * + * Remove and deallcoate handle + *--------------------------------------------------------------------*/ + +void deleteCldfb_fx( HANDLE_CLDFB_FILTER_BANK *h_cldfb /* i/o: filter bank handle */ ) { @@ -1602,8 +1743,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; - hs->p_filter_sf = (Word16) 17036; // Q14 - hs->p_filter = CLDFB80_10_fx; + hs->p_filter_32 = CLDFB80_10_fx; hs->scale = CLDFB80_10_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -1614,8 +1754,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15388; // Q14 - hs->p_filter = LDQMF_10_fx; + hs->p_filter_32 = LDQMF_10_fx; hs->scale = LDQMF_10_SCALE_FX_Q8; } BREAK; @@ -1633,8 +1772,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; - hs->p_filter_sf = (Word16) 17051; // Q14 - hs->p_filter = CLDFB80_16_fx; + hs->p_filter_32 = CLDFB80_16_fx; hs->scale = CLDFB80_16_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -1645,8 +1783,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15388; // Q14 - hs->p_filter = LDQMF_16_fx; + hs->p_filter_32 = LDQMF_16_fx; hs->scale = LDQMF_16_SCALE_FX_Q8; } BREAK; @@ -1664,8 +1801,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; - hs->p_filter_sf = (Word16) 17050; // Q14 - hs->p_filter = CLDFB80_20_fx; + hs->p_filter_32 = CLDFB80_20_fx; hs->scale = CLDFB80_20_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -1676,8 +1812,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15390; // Q14 - hs->p_filter = LDQMF_20_fx; + hs->p_filter_32 = LDQMF_20_fx; hs->scale = LDQMF_20_SCALE_FX_Q8; } BREAK; @@ -1695,8 +1830,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; - hs->p_filter_sf = (Word16) 17051; // Q14 - hs->p_filter = CLDFB80_30_fx; + hs->p_filter_32 = CLDFB80_30_fx; hs->scale = CLDFB80_30_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -1707,8 +1841,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15388; // Q14 - hs->p_filter = LDQMF_30_fx; + hs->p_filter_32 = LDQMF_30_fx; hs->scale = LDQMF_30_SCALE_FX_Q8; } BREAK; @@ -1726,8 +1859,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; - hs->p_filter_sf = (Word16) 17050; // Q14 - hs->p_filter = CLDFB80_32_fx; + hs->p_filter_32 = CLDFB80_32_fx; hs->scale = CLDFB80_32_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -1738,8 +1870,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15392; // Q14 - hs->p_filter = LDQMF_32_fx; + hs->p_filter_32 = LDQMF_32_fx; hs->scale = LDQMF_32_SCALE_FX_Q8; } BREAK; @@ -1757,8 +1888,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; - hs->p_filter_sf = (Word16) 17051; // Q14 - hs->p_filter = CLDFB80_40_fx; + hs->p_filter_32 = CLDFB80_40_fx; hs->scale = CLDFB80_40_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -1769,8 +1899,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15391; // Q14 - hs->p_filter = LDQMF_40_fx; + hs->p_filter_32 = LDQMF_40_fx; hs->scale = LDQMF_40_SCALE_FX_Q8; } BREAK; @@ -1788,8 +1917,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; - hs->p_filter_sf = (Word16) 17051; // Q14 - hs->p_filter = CLDFB80_60_fx; + hs->p_filter_32 = CLDFB80_60_fx; hs->scale = CLDFB80_60_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -1800,8 +1928,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15391; // Q14 - hs->p_filter = LDQMF_60_fx; + hs->p_filter_32 = LDQMF_60_fx; hs->scale = LDQMF_60_SCALE_FX_Q8; } BREAK; @@ -1814,365 +1941,13 @@ static void cldfb_init_proto_and_twiddles( return; } -static void cldfb_init_proto_and_twiddles_enc_fx( - HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ -) -{ - /*find appropriate set of rotVecs*/ - SWITCH( hs->no_channels ) - { - case 10: - hs->rot_vec_ana_re_fx = rot_vec_ana_re_L10_fx; - hs->rot_vec_ana_im_fx = rot_vec_ana_im_L10_fx; - hs->rot_vec_syn_re_fx = rot_vec_syn_re_L10_fx; - hs->rot_vec_syn_im_fx = rot_vec_syn_im_L10_fx; - hs->rRotVctr = rRotVectr_10; - hs->iRotVctr = iRotVectr_10; - IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) ) - { - hs->synScalefactor = add( cldfb_synScale[0], hs->filterScale ); - move16(); - } - ELSE - { - hs->anaScalefactor = add( cldfb_anaScale[0], hs->filterScale ); - move16(); - } - IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) ) - { - hs->ds = 10; - hs->da = 10; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = NULL; - hs->rot_vec_ana_delay_im_fx = NULL; - hs->rot_vec_syn_delay_re_fx = NULL; - hs->rot_vec_syn_delay_im_fx = NULL; - hs->p_filter_sf = (Word16) 17036; // Q14 - hs->scale = cldfb_scale_2_5ms[0]; - move16(); - move16(); - hs->p_filter = CLDFB80_10_fx; - } - ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) - { - hs->ds = 40; - hs->da = -20; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15388; // Q14 - hs->p_filter = LDQMF_10_fx; - hs->scale = cldfb_scale_5_0ms[0]; - move16(); - move16(); - } - BREAK; - - case 16: - hs->rot_vec_ana_re_fx = rot_vec_ana_re_L16_fx; - hs->rot_vec_ana_im_fx = rot_vec_ana_im_L16_fx; - hs->rot_vec_syn_re_fx = rot_vec_syn_re_L16_fx; - hs->rot_vec_syn_im_fx = rot_vec_syn_im_L16_fx; - hs->rRotVctr = rRotVectr_16; - hs->iRotVctr = iRotVectr_16; - { - hs->anaScalefactor = add( cldfb_anaScale[1], hs->filterScale ); - move16(); - } - IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) ) - { - hs->ds = 20; - hs->da = 20; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = NULL; - hs->rot_vec_ana_delay_im_fx = NULL; - hs->rot_vec_syn_delay_re_fx = NULL; - hs->rot_vec_syn_delay_im_fx = NULL; - hs->p_filter_sf = (Word16) 17051; // Q14 - hs->p_filter = CLDFB80_16_fx; - hs->scale = cldfb_scale_2_5ms[1]; - move16(); - move16(); - } - ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) - { - hs->ds = 80; - hs->da = -40; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15388; // Q14 - hs->p_filter = LDQMF_16_fx; - hs->scale = cldfb_scale_5_0ms[1]; - move16(); - move16(); - } - BREAK; - - case 20: - - hs->rRotVctr = rRotVectr_20; - hs->iRotVctr = iRotVectr_20; - hs->rot_vec_ana_re_fx = rot_vec_ana_re_L20_fx; - hs->rot_vec_ana_im_fx = rot_vec_ana_im_L20_fx; - hs->rot_vec_syn_re_fx = rot_vec_syn_re_L20_fx; - hs->rot_vec_syn_im_fx = rot_vec_syn_im_L20_fx; - IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) ) - { - hs->synScalefactor = add( cldfb_synScale[2], hs->filterScale ); - move16(); - } - ELSE - { - hs->anaScalefactor = add( cldfb_anaScale[2], hs->filterScale ); - move16(); - } - IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) ) - { - hs->ds = 20; - hs->da = 20; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = NULL; - hs->rot_vec_ana_delay_im_fx = NULL; - hs->rot_vec_syn_delay_re_fx = NULL; - hs->rot_vec_syn_delay_im_fx = NULL; - hs->p_filter_sf = (Word16) 17050; // Q14 - hs->p_filter = CLDFB80_20_fx; - hs->scale = cldfb_scale_2_5ms[2]; - move16(); - move16(); - } - ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) - { - hs->ds = 80; - hs->da = -40; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15390; // Q14 - hs->p_filter = LDQMF_20_fx; - hs->scale = cldfb_scale_5_0ms[2]; - move16(); - move16(); - } - BREAK; - - case 30: - hs->rot_vec_ana_re_fx = rot_vec_ana_re_L30_fx; - hs->rot_vec_ana_im_fx = rot_vec_ana_im_L30_fx; - hs->rot_vec_syn_re_fx = rot_vec_syn_re_L30_fx; - hs->rot_vec_syn_im_fx = rot_vec_syn_im_L30_fx; - hs->rRotVctr = rRotVectr_30; - hs->iRotVctr = iRotVectr_30; - IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) ) - { - hs->synScalefactor = add( cldfb_synScale[6], hs->filterScale ); - move16(); - } - ELSE - { - hs->anaScalefactor = add( cldfb_anaScale[6], hs->filterScale ); - move16(); - } - IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) ) - { - hs->ds = 30; - hs->da = 30; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = NULL; - hs->rot_vec_ana_delay_im_fx = NULL; - hs->rot_vec_syn_delay_re_fx = NULL; - hs->rot_vec_syn_delay_im_fx = NULL; - hs->p_filter_sf = (Word16) 17051; // Q14 - hs->scale = cldfb_scale_2_5ms[6]; - hs->p_filter = CLDFB80_30_fx; - } - ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) - { - hs->ds = 120; - hs->da = -60; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15388; // Q14 - hs->scale = cldfb_scale_5_0ms[6]; - hs->p_filter = LDQMF_30_fx; - move16(); - move16(); - } - BREAK; - - case 32: - hs->rot_vec_ana_re_fx = rot_vec_ana_re_L32_fx; - hs->rot_vec_ana_im_fx = rot_vec_ana_im_L32_fx; - hs->rot_vec_syn_re_fx = rot_vec_syn_re_L32_fx; - hs->rot_vec_syn_im_fx = rot_vec_syn_im_L32_fx; - hs->rRotVctr = rRotVectr_32; - hs->iRotVctr = iRotVectr_32; - { - hs->anaScalefactor = add( cldfb_anaScale[3], hs->filterScale ); - move16(); - } - IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) ) - { - hs->ds = 32; - hs->da = 32; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = NULL; - hs->rot_vec_ana_delay_im_fx = NULL; - hs->rot_vec_syn_delay_re_fx = NULL; - hs->rot_vec_syn_delay_im_fx = NULL; - hs->p_filter_sf = (Word16) 17050; // Q14 - hs->p_filter = CLDFB80_32_fx; - hs->scale = cldfb_scale_2_5ms[3]; - move16(); - move16(); - } - ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) - { - hs->ds = 160; - hs->da = -80; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15392; // Q14 - hs->scale = cldfb_scale_5_0ms[3]; - hs->p_filter = LDQMF_32_fx; - move16(); - move16(); - } - BREAK; - case 40: - hs->rot_vec_ana_re_fx = rot_vec_ana_re_L40_fx; - hs->rot_vec_ana_im_fx = rot_vec_ana_im_L40_fx; - hs->rot_vec_syn_re_fx = rot_vec_syn_re_L40_fx; - hs->rot_vec_syn_im_fx = rot_vec_syn_im_L40_fx; - hs->rRotVctr = rRotVectr_40; - hs->iRotVctr = iRotVectr_40; - IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) ) - { - hs->synScalefactor = add( cldfb_synScale[4], hs->filterScale ); - move16(); - } - ELSE - { - hs->anaScalefactor = add( cldfb_anaScale[4], hs->filterScale ); - move16(); - } - IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) ) - { - hs->ds = 40; - hs->da = 40; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = NULL; - hs->rot_vec_ana_delay_im_fx = NULL; - hs->rot_vec_syn_delay_re_fx = NULL; - hs->rot_vec_syn_delay_im_fx = NULL; - hs->p_filter_sf = (Word16) 17051; // Q14 - hs->scale = cldfb_scale_2_5ms[4]; - hs->p_filter = CLDFB80_40_fx; - move16(); - move16(); - } - ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) - { - hs->ds = 160; - hs->da = -80; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15391; // Q14 - hs->p_filter = LDQMF_40_fx; - hs->scale = cldfb_scale_5_0ms[4]; - move16(); - move16(); - } - BREAK; - - case 60: - hs->rot_vec_ana_re_fx = rot_vec_ana_re_L60_fx; - hs->rot_vec_ana_im_fx = rot_vec_ana_im_L60_fx; - hs->rot_vec_syn_re_fx = rot_vec_syn_re_L60_fx; - hs->rot_vec_syn_im_fx = rot_vec_syn_im_L60_fx; - hs->rRotVctr = rRotVectr_60; - hs->iRotVctr = iRotVectr_60; - IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) ) - { - hs->synScalefactor = add( cldfb_synScale[5], hs->filterScale ); - move16(); - } - ELSE - { - hs->anaScalefactor = add( cldfb_anaScale[5], hs->filterScale ); - move16(); - } - IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) ) - { - hs->ds = 60; - hs->da = 60; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = NULL; - hs->rot_vec_ana_delay_im_fx = NULL; - hs->rot_vec_syn_delay_re_fx = NULL; - hs->rot_vec_syn_delay_im_fx = NULL; - hs->p_filter_sf = (Word16) 17051; // Q14 - hs->p_filter = CLDFB80_60_fx; - hs->scale = cldfb_scale_2_5ms[5]; - move16(); - move16(); - } - ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) - { - hs->ds = 240; - hs->da = -120; - move16(); - move16(); - hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; - hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15391; // Q14 - hs->p_filter = LDQMF_60_fx; - hs->scale = cldfb_scale_5_0ms[5]; - move16(); - move16(); - } - break; - } - - return; -} /*-------------------------------------------------------------------* * cldfb_save_memory_ivas() * * Save the memory of filter; to be restored with cldfb_restore_memory_ivas() *--------------------------------------------------------------------*/ + ivas_error cldfb_save_memory_ivas_fx( HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ ) diff --git a/lib_com/cng_exc_fx.c b/lib_com/cng_exc_fx.c index b314357adee7954c8797853f405db0296b5df6ee..f96fba710c9b17b78e3beb7cd3abd2dc2783605a 100644 --- a/lib_com/cng_exc_fx.c +++ b/lib_com/cng_exc_fx.c @@ -1,20 +1,26 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" -#include "ivas_rom_com_fx.h" +#include "ivas_rom_com.h" + /*---------------------------------------------------------------------* * Local constants *---------------------------------------------------------------------*/ + #define A2 6554 #define OmA2 ( 32768 - A2 ) #define GAIN_VAR 11811 /* in Q31 divided by 2 (Q30) */ + const Word16 att_pow_tbl[SIZE_SCALE_TABLE_STEREO + 1] = { 9234, 10361, 13044, 16422, 22669, 31292, 32767, 26634, 28212, 20674, 16422, 27254, 30934, 32767 }; + + /*-------------------------------------------------------* * CNG_exc() * @@ -22,22 +28,22 @@ const Word16 att_pow_tbl[SIZE_SCALE_TABLE_STEREO + 1] = { 9234, 10361, 13044, 16 *-------------------------------------------------------*/ void CNG_exc_fx( - const Word32 core_brate, /* i : core bitrate */ + const Word32 core_brate, /* i : core bitrate */ const Word16 L_frame, /* i : length of the frame */ Word32 *Enew, /* i/o: decoded SID energy Q6 */ Word16 *seed, /* i/o: random generator seed */ Word16 exc[], /* o : current non-enhanced excitation Q_new */ Word16 exc2[], /* o : current enhanced excitation Q_new */ - Word32 *lp_ener, /* i/o: LP filtered E Q6 */ + Word32 *lp_ener, /* i/o: LP filtered E Q6 */ const Word32 last_core_brate, /* i : previous frame core bitrate */ Word16 *first_CNG, /* i/o: first CNG frame flag for energy init. */ Word16 *cng_ener_seed, /* i/o: random generator seed for CNG energy */ - Word16 bwe_exc[], /* o : excitation for SWB TBE Q_syn */ + Word16 bwe_exc[], /* o : excitation for SWB TBE Q_syn */ const Word16 allow_cn_step, /* i : allow CN step */ - Word16 *last_allow_cn_step, /* i/o: last allow step */ - const Word16 OldQ_exc, /* i : Old excitation scaling */ - const Word16 Q_exc, /* i : excitation scaling */ - const Word16 num_ho, /* i : number of selected hangover frames */ + Word16 *last_allow_cn_step, /* i/o: last allow step */ + const Word16 OldQ_exc, /* i : Old excitation scaling */ + const Word16 Q_exc, /* i : excitation scaling */ + const Word16 num_ho, /* i : number of selected hangover frames */ Word32 q_env[], /*Q6*/ Word32 *lp_env, /*Q6*/ Word32 *old_env, /*Q6*/ @@ -598,11 +604,6 @@ void cng_params_postupd_fx( const Word16 *const cng_Qexc_buf, /* i : Q_exc buffer Q0 */ const Word32 *const cng_brate_buf, /* i : bit rate buffer Q0 */ Word32 ho_env_circ[] /* i/o: Envelope buffer Q6 */ -#ifdef IVAS_CODE_CNG_COM - , - const Word16 element_mode, /* i : Element mode */ - const Word16 bwidth /* i : Audio bandwidth */ -#endif ) { Word16 i, j; @@ -620,10 +621,6 @@ void cng_params_postupd_fx( Word16 CNG_mode; Word16 ptr; Word32 last_active_brate; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif ptr = add( sub( ho_circ_ptr, *cng_buf_cnt ), 1 ); IF( ptr < 0 ) @@ -649,10 +646,10 @@ void cng_params_postupd_fx( FOR( i = 0; i < NUM_ENV_CNG; i++ ) { /* sp[i] = 2.0f*(*ptR * *ptR + *ptI * *ptI)/L_FFT; */ - L_tmp = L_mult_o( *ptR, *ptR, &Overflow ); /* 2*Q_exc+1 */ - L_tmp = L_add_o( L_tmp, L_mult_o( *ptI, *ptI, &Overflow ), &Overflow ); /* 2*Q_exc+1 */ - L_tmp = L_add_o( L_tmp, L_tmp, &Overflow ); /* 2*Q_exc+1 */ - L_tmp = Mult_32_16( L_tmp, 128 ); /* 2*Q_exc+1 */ + L_tmp = L_mult_sat( *ptR, *ptR ); /* 2*Q_exc+1 */ + L_tmp = L_add_sat( L_tmp, L_mult_sat( *ptI, *ptI ) ); /* 2*Q_exc+1 */ + L_tmp = L_add_sat( L_tmp, L_tmp ); /* 2*Q_exc+1 */ + L_tmp = Mult_32_16( L_tmp, 128 ); /* 2*Q_exc+1 */ tmp = add( add( Q_exc, Q_exc ), 1 ); sp[i] = L_shr( L_tmp, sub( tmp, 6 ) ); move32(); /* Q6 */ @@ -662,15 +659,6 @@ void cng_params_postupd_fx( } Copy32( sp, env, NUM_ENV_CNG ); -#ifdef IVAS_CODE_CNG_COM - if ( element_mode == IVAS_SCE || element_mode == IVAS_CPE_DFT ) - { - att = 0.0f; - apply_scale( &att, bwidth, last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); - att = powf( 10, att / 10.0f ); - } - else -#endif { CNG_mode = get_cng_mode( last_active_brate ); @@ -739,10 +727,6 @@ void cng_params_postupd_ivas_fx( Word16 CNG_mode; Word16 ptr; Word32 last_active_brate; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif ptr = add( sub( ho_circ_ptr, *cng_buf_cnt ), 1 ); IF( ptr < 0 ) @@ -768,10 +752,10 @@ void cng_params_postupd_ivas_fx( FOR( i = 0; i < NUM_ENV_CNG; i++ ) { /* sp[i] = 2.0f*(*ptR * *ptR + *ptI * *ptI)/L_FFT; */ - L_tmp = L_mult_o( *ptR, *ptR, &Overflow ); /* 2*Q_exc+1 */ - L_tmp = L_add_o( L_tmp, L_mult_o( *ptI, *ptI, &Overflow ), &Overflow ); /* 2*Q_exc+1 */ - L_tmp = L_add_o( L_tmp, L_tmp, &Overflow ); /* 2*Q_exc+1 */ - L_tmp = Mult_32_16( L_tmp, 128 ); /* 2*Q_exc+1 */ + L_tmp = L_mult_sat( *ptR, *ptR ); /* 2*Q_exc+1 */ + L_tmp = L_add_sat( L_tmp, L_mult_sat( *ptI, *ptI ) ); /* 2*Q_exc+1 */ + L_tmp = L_add_sat( L_tmp, L_tmp ); /* 2*Q_exc+1 */ + L_tmp = Mult_32_16( L_tmp, 128 ); /* 2*Q_exc+1 */ tmp = add( add( Q_exc, Q_exc ), 1 ); // To do : Saturation to be re-validated. sp[i] = L_shr_sat( L_tmp, sub( tmp, 6 ) ); @@ -860,11 +844,6 @@ void cng_params_upd_fx( Word16 cng_Qexc_buf[], /* i/o: Q_exc buffer Q0 */ Word32 cng_brate_buf[], /* i/o: last_active_brate buffer Q0 */ const Word32 last_active_brate /* i : Last active bit rate Q0 */ -#ifdef IVAS_CODE_CNG_COM - , - const Word16 element_mode, /* i : Element mode */ - const Word16 bwidth /* i : Audio bandwidth */ -#endif ) { Word32 L_ener, L_tmp; @@ -880,11 +859,6 @@ void cng_params_upd_fx( Word16 tmp; Word16 temp_lo_fx, temp_hi_fx; Word16 exp_pow; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - /* update the pointer to circular buffer of old LSP vectors */ *ho_circ_ptr = add( *ho_circ_ptr, 1 ); @@ -921,9 +895,9 @@ void cng_params_upd_fx( L_tmp = L_mult0( tmpv, tmpv ); /* 2*(Q_exc+scale) */ pt_exc2++; tmpv = shl( *pt_exc2, scale ); - L_tmp = L_mac0_o( L_tmp, tmpv, tmpv, &Overflow ); + L_tmp = L_mac0_sat( L_tmp, tmpv, tmpv ); pt_exc2++; - L_ener = L_add_o( L_ener, L_shr_o( L_tmp, 7, &Overflow ), &Overflow ); /* Q(2*(Q_exc+scale)+1) ,division by L_frame done here */ + L_ener = L_add_sat( L_ener, L_shr_sat( L_tmp, 7 ) ); /* Q(2*(Q_exc+scale)+1) ,division by L_frame done here */ } } ELSE /* L_FRAME16k */ @@ -934,12 +908,12 @@ void cng_params_upd_fx( L_tmp = L_mult0( tmpv, tmpv ); /* 2*(Q_exc+scale) */ pt_exc2++; tmpv = shl( *pt_exc2, scale ); - L_tmp = L_mac0_o( L_tmp, tmpv, tmpv, &Overflow ); + L_tmp = L_mac0_sat( L_tmp, tmpv, tmpv ); pt_exc2++; - L_ener = L_add_o( L_ener, L_shr_o( Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), 7, &Overflow ), &Overflow ); /* Q(2*(Q_exc+scale)+15+1-16+1) ,division by L_frame done here */ + L_ener = L_add_sat( L_ener, L_shr_sat( Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), 7 ) ); /* Q(2*(Q_exc+scale)+15+1-16+1) ,division by L_frame done here */ } } - L_ener = L_shr_o( L_ener, sub( shl( add( Q_exc, scale ), 1 ), 5 ), &Overflow ); /* Q6 (2*(Q_exc+scale)+1-2*(Q_exc+scale)+5) */ + L_ener = L_shr_sat( L_ener, sub( shl( add( Q_exc, scale ), 1 ), 5 ) ); /* Q6 (2*(Q_exc+scale)+1-2*(Q_exc+scale)+5) */ /* update the circular buffer of old energies */ ho_ener_circ[*ho_circ_ptr] = L_ener; @@ -973,10 +947,10 @@ void cng_params_upd_fx( FOR( i = 0; i < NUM_ENV_CNG; i++ ) { /* sp[i] = 2.0f*(*ptR * *ptR + *ptI * *ptI)/L_FFT; */ - L_tmp = L_mult_o( *ptR, *ptR, &Overflow ); /* 2*Q_exc+1 */ - L_tmp = L_add_o( L_tmp, L_mult_o( *ptI, *ptI, &Overflow ), &Overflow ); /* 2*Q_exc+1 */ - L_tmp = L_add_o( L_tmp, L_tmp, &Overflow ); /* 2*Q_exc+1 */ - L_tmp = Mult_32_16( L_tmp, 128 ); /* 2*Q_exc+1 */ + L_tmp = L_mult_sat( *ptR, *ptR ); /* 2*Q_exc+1 */ + L_tmp = L_add_sat( L_tmp, L_mult_sat( *ptI, *ptI ) ); /* 2*Q_exc+1 */ + L_tmp = L_add_sat( L_tmp, L_tmp ); /* 2*Q_exc+1 */ + L_tmp = Mult_32_16( L_tmp, 128 ); /* 2*Q_exc+1 */ tmp = add( add( Q_exc, Q_exc ), 1 ); sp[i] = L_shr( L_tmp, sub( tmp, 6 ) ); move32(); /* Q6 */ @@ -986,15 +960,6 @@ void cng_params_upd_fx( } Copy32( sp, env, NUM_ENV_CNG ); -#ifdef IVAS_CODE_CNG_COM - if ( element_mode == IVAS_SCE || element_mode == IVAS_CPE_DFT ) - { - att = 0.0f; - apply_scale( &att, bwidth, last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); - att = powf( 10, att / 10.0f ); - } - else -#endif { CNG_mode = get_cng_mode( last_active_brate ); /* att = 1/pow(2,ENR_ATT_fx[CNG_mode]); */ @@ -1034,24 +999,23 @@ void cng_params_upd_fx( } void cng_params_upd_ivas_fx( - const Word16 lsp_new[], /* i : LSP aprameters Q15 */ - const Word16 exc2[], /* i : current enhanced excitation Q_exc */ - const Word16 L_frame, /* i : frame length Q0 */ - Word16 *ho_circ_ptr, /* i/o: pointer for CNG averaging buffers Q0 */ - Word32 ho_ener_circ[], /* o : energy buffer for CNG averaging Q6 */ - Word16 *ho_circ_size, /* i/o: size of DTX hangover history buffer for averaging Q0 */ - Word16 ho_lsp_circ[], /* o : old LSP buffer for CNG averaging Q15 */ - const Word16 Q_exc, /* i : Q value of excitation */ - const Word16 enc_dec_flag, /* i : Flag indicating encoder or decoder (ENC,DEC) */ - Word32 ho_env_circ[], /* i/o: Envelope buffer Q(6+shift) */ - Word16 *cng_buf_cnt, /* i/o: Counter of postponed FFT-processing instances */ - Word16 cng_exc2_buf[], /* i/o: Excitation buffer Q_exc */ - Word16 cng_Qexc_buf[], /* i/o: Q_exc buffer Q0 */ - Word32 cng_brate_buf[], /* i/o: last_active_brate buffer Q0 */ - const Word32 last_active_brate /* i : Last active bit rate Q0 */ - , - const Word16 element_mode, /* i : Element mode */ - const Word16 bwidth /* i : Audio bandwidth */ + const Word16 lsp_new[], /* i : LSP aprameters Q15 */ + const Word16 exc2[], /* i : current enhanced excitation Q_exc */ + const Word16 L_frame, /* i : frame length Q0 */ + Word16 *ho_circ_ptr, /* i/o: pointer for CNG averaging buffers Q0 */ + Word32 ho_ener_circ[], /* o : energy buffer for CNG averaging Q6 */ + Word16 *ho_circ_size, /* i/o: size of DTX hangover history buffer for averaging Q0 */ + Word16 ho_lsp_circ[], /* o : old LSP buffer for CNG averaging Q15 */ + const Word16 Q_exc, /* i : Q value of excitation */ + const Word16 enc_dec_flag, /* i : Flag indicating encoder or decoder (ENC,DEC) */ + Word32 ho_env_circ[], /* i/o: Envelope buffer Q(6+shift) */ + Word16 *cng_buf_cnt, /* i/o: Counter of postponed FFT-processing instances */ + Word16 cng_exc2_buf[], /* i/o: Excitation buffer Q_exc */ + Word16 cng_Qexc_buf[], /* i/o: Q_exc buffer Q0 */ + Word32 cng_brate_buf[], /* i/o: last_active_brate buffer Q0 */ + const Word32 last_active_brate, /* i : Last active bit rate Q0 */ + const Word16 element_mode, /* i : Element mode */ + const Word16 bwidth /* i : Audio bandwidth */ ) { Word32 L_ener, L_tmp; @@ -1068,10 +1032,6 @@ void cng_params_upd_ivas_fx( move16(); Word16 temp_lo_fx, temp_hi_fx; Word16 exp_pow; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* update the pointer to circular buffer of old LSP vectors */ *ho_circ_ptr = add( *ho_circ_ptr, 1 ); @@ -1108,9 +1068,9 @@ void cng_params_upd_ivas_fx( L_tmp = L_mult0( tmpv, tmpv ); /* 2*(Q_exc+scale) */ pt_exc2++; tmpv = shl( *pt_exc2, scale ); - L_tmp = L_mac0_o( L_tmp, tmpv, tmpv, &Overflow ); + L_tmp = L_mac0_sat( L_tmp, tmpv, tmpv ); pt_exc2++; - L_ener = L_add_o( L_ener, L_shr_o( L_tmp, 7, &Overflow ), &Overflow ); /* Q(2*(Q_exc+scale)+1) ,division by L_frame done here */ + L_ener = L_add_sat( L_ener, L_shr_sat( L_tmp, 7 ) ); /* Q(2*(Q_exc+scale)+1) ,division by L_frame done here */ } } ELSE /* L_FRAME16k */ @@ -1121,12 +1081,12 @@ void cng_params_upd_ivas_fx( L_tmp = L_mult0( tmpv, tmpv ); /* 2*(Q_exc+scale) */ pt_exc2++; tmpv = shl( *pt_exc2, scale ); - L_tmp = L_mac0_o( L_tmp, tmpv, tmpv, &Overflow ); + L_tmp = L_mac0_sat( L_tmp, tmpv, tmpv ); pt_exc2++; - L_ener = L_add_o( L_ener, L_shr_o( Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), 7, &Overflow ), &Overflow ); /* Q(2*(Q_exc+scale)+15+1-16+1) ,division by L_frame done here */ + L_ener = L_add_sat( L_ener, L_shr_sat( Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), 7 ) ); /* Q(2*(Q_exc+scale)+15+1-16+1) ,division by L_frame done here */ } } - L_ener = L_shr_o( L_ener, sub( shl( add( Q_exc, scale ), 1 ), 5 ), &Overflow ); /* Q6 (2*(Q_exc+scale)+1-2*(Q_exc+scale)+5) */ + L_ener = L_shr_sat( L_ener, sub( shl( add( Q_exc, scale ), 1 ), 5 ) ); /* Q6 (2*(Q_exc+scale)+1-2*(Q_exc+scale)+5) */ /* update the circular buffer of old energies */ ho_ener_circ[*ho_circ_ptr] = L_ener; @@ -1160,12 +1120,12 @@ void cng_params_upd_ivas_fx( FOR( i = 0; i < NUM_ENV_CNG; i++ ) { /* sp[i] = 2.0f*(*ptR * *ptR + *ptI * *ptI)/L_FFT; */ - L_tmp = L_mult_o( *ptR, *ptR, &Overflow ); /* 2*Q_exc+1 */ - L_tmp = L_add_o( L_tmp, L_mult_o( *ptI, *ptI, &Overflow ), &Overflow ); /* 2*Q_exc+1 */ - L_tmp = L_add_o( L_tmp, L_tmp, &Overflow ); /* 2*Q_exc+1 */ - L_tmp = Mult_32_16( L_tmp, 128 ); /* 2*Q_exc+1 */ + L_tmp = L_mult_sat( *ptR, *ptR ); /* 2*Q_exc+1 */ + L_tmp = L_add_sat( L_tmp, L_mult_sat( *ptI, *ptI ) ); /* 2*Q_exc+1 */ + L_tmp = L_add_sat( L_tmp, L_tmp ); /* 2*Q_exc+1 */ + L_tmp = Mult_32_16( L_tmp, 128 ); /* 2*Q_exc+1 */ tmp = add( add( Q_exc, Q_exc ), 1 ); - sp[i] = L_shr_o( L_tmp, sub( tmp, 6 ), &Overflow ); + sp[i] = L_shr_sat( L_tmp, sub( tmp, 6 ) ); move32(); /* Q6 */ ptR++; ptI--; diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 7c93498af59c55eaa2630f9477aa1ac98084876c..320cac0810ca27cf11c07f3ba07a1195f3cb0600 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef CNST_H @@ -45,57 +45,59 @@ #define MATRIX_CONSTANT (759250113) #define NUM_SAMPLES_960 (960) #define NUM_SAMPLES_720 (720) +#define NUM_SAMPLES_640 (640) #define NUM_SAMPLES_320 (320) #define NUM_SAMPLES_160 (160) #define L_SUBFRAME_48k (240) -#define L_SUBFRAME_32k (180) +#define L_SUBFRAME_32k (160) #define L_SUBFRAME_16k (80) #define L_SUBFRAME_8k (40) -#define Q31_BY_NUM_SAMPLES_960 ( 2239294 ) -#define Q31_BY_NUM_SAMPLES_720 ( 2986764 ) -#define Q31_BY_NUM_SAMPLES_320 ( 6731924 ) -#define Q31_BY_NUM_SAMPLES_160 ( 13506186 ) -#define Q31_BY_SUB_FRAME_240 ( 8985287 ) -#define Q31_BY_SUB_FRAME_180 ( 11997115 ) -#define Q31_BY_SUB_FRAME_80 ( 27183337 ) -#define Q31_BY_SUB_FRAME_40 ( 55063683 ) +#define Q31_BY_NUM_SAMPLES_960 ( 2239294 ) /* 1/959 in Q31 */ +#define Q31_BY_NUM_SAMPLES_720 ( 2986764 ) /* 1/719 in Q31 */ +#define Q31_BY_NUM_SAMPLES_640 ( 3360694 ) /* 1/639 in Q31 */ +#define Q31_BY_NUM_SAMPLES_320 ( 6731924 ) /* 1/319 in Q31 */ +#define Q31_BY_NUM_SAMPLES_160 ( 13506186 ) /* 1/159 in Q31 */ +#define Q31_BY_SUB_FRAME_240 ( 8985287 ) /* 1/239 in Q31 */ +#define Q31_BY_SUB_FRAME_180 ( 11997115 ) /* 1/179 in Q31 */ +#define Q31_BY_SUB_FRAME_80 ( 27183337 ) /* 1/79 in Q31 */ +#define Q31_BY_SUB_FRAME_40 ( 55063683 ) /* 1/39 in Q31 */ /*----------------------------------------------------------------------------------* *Q values *----------------------------------------------------------------------------------*/ -#define Q1 1 -#define Q2 2 -#define Q3 3 -#define Q4 4 -#define Q5 5 -#define Q6 6 -#define Q7 7 -#define Q8 8 -#define Q9 9 -#define Q10 10 -#define Q11 11 -#define Q12 12 -#define Q13 13 -#define Q14 14 -#define Q15 15 -#define Q16 16 -#define Q17 17 -#define Q18 18 -#define Q19 19 -#define Q20 20 -#define Q21 21 -#define Q22 22 -#define Q23 23 -#define Q24 24 -#define Q25 25 -#define Q26 26 -#define Q27 27 -#define Q28 28 -#define Q29 29 -#define Q30 30 -#define Q31 31 +#define Q1 1 +#define Q2 2 +#define Q3 3 +#define Q4 4 +#define Q5 5 +#define Q6 6 +#define Q7 7 +#define Q8 8 +#define Q9 9 +#define Q10 10 +#define Q11 11 +#define Q12 12 +#define Q13 13 +#define Q14 14 +#define Q15 15 +#define Q16 16 +#define Q17 17 +#define Q18 18 +#define Q19 19 +#define Q20 20 +#define Q21 21 +#define Q22 22 +#define Q23 23 +#define Q24 24 +#define Q25 25 +#define Q26 26 +#define Q27 27 +#define Q28 28 +#define Q29 29 +#define Q30 30 +#define Q31 31 /*----------------------------------------------------------------------------------* * one in Q @@ -132,7 +134,7 @@ #define ONE_IN_Q29 536870912 #define ONE_IN_Q30 1073741824 #define ONE_IN_Q31 0x7fffffff -#define MINUS_ONE_IN_Q31 -2147483648 +#define MINUS_ONE_IN_Q31 (-2147483647 - 1) #define TWO_IN_Q29 1073741824 #define FOUR_IN_Q28 1073741824 @@ -174,6 +176,7 @@ #define MIN16B_FLT_FX_IN_Q15 -1073741824//Q15 #define PCM16_TO_FLT_FAC 32768.0f #define PCM16_TO_FLT_FAC_FX 32768 //Q0 +#define PCM16_TO_FLT_FAC_FX_Q15 1073741824L //16Q15 #define MDFT_NORM_SCALING ( 1.0f / PCM16_TO_FLT_FAC ) #define MDFT_NORM_SCALING_FX 65536 //Q31 #define LOG2_MDFT_NORM_SCALING_FX -503316448 //Q25 @@ -224,6 +227,7 @@ enum{ #define ONE_BY_L_FRAME32k_Q31 3355443 #define ONE_BY_L_FRAME25_6k_Q31 4194304 #define ONE_BY_L_FRAME16k_Q31 6710886 +#define ONE_BY_L_FRAME16k_Q15 102 #define ONE_BY_L_FRAME_Q31 8388608 #define ONE_BY_240_Q31 8947849 #define ONE_BY_L_FRAME8k_Q31 13421772 @@ -532,12 +536,7 @@ enum IND_STEREO_ICBWE_MSFLAG, IND_SHB_ENER_SF, IND_SHB_RES_GS, - IND_SHB_RES_GS1, - IND_SHB_RES_GS2, - IND_SHB_RES_GS3, - IND_SHB_RES_GS4, - IND_SHB_RES_GS5, - IND_SHB_VF, + IND_SHB_VF = IND_SHB_RES_GS + 5, IND_SHB_LSF, IND_SHB_MIRROR = IND_SHB_LSF + 5, IND_SHB_GRID, @@ -595,6 +594,7 @@ enum #define FRAMES_PER_SEC 50 #define MAX_PARAM_SPATIAL_SUB_FRAMES_PER_SEC 200 //(FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES) +#define ONE_BY_SUBFRAME_LEN_MS_Q31 (429496730) #define ONE_BY_FRAMES_PER_SEC_Q31 ( 42949673 ) #define FRAMES_PER_SEC_BY_2 (FRAMES_PER_SEC >> 1) #define INV_FRAME_PER_SEC_Q15 656 @@ -668,6 +668,7 @@ enum #define ACELP_TCX_TRANS_NS 1250000 /* Duration of the ACELP->TCX overlap - 1.25 ms */ #define L_FRAME_MAX L_FRAME48k /* Max 20ms frame size @48kHz */ #define L_FRAME_PLUS 1200 /* Max frame size (long TCX frame) */ +#define L_FRAME_PLUS_INTERNAL 800 /* Max frame size (long TCX frame) at maximum internal sampling rate */ #define L_MDCT_OVLP_MAX NS2SA( 48000, ACELP_LOOK_NS ) /* = Max mdct overlap */ #define N_TCX10_MAX 480 /* Max size of TCX10 MDCT spectrum */ #define BITS_TEC 1 /* number of bits for TEC */ @@ -683,6 +684,7 @@ enum #define NUM_DCT_LENGTH 24 #define NB_DIV 2 /* number of division (subframes) per 20ms frame */ +#define NB_DIV_LOG2 1 /* To be used for shift operation instead of division */ #define L_MDCT_HALF_OVLP_MAX L_MDCT_OVLP_MAX - 48000 / 200 /* Size of HALF overlap window slope @ 48 kHz */ #define L_MDCT_MIN_OVLP_MAX 60 /* Size of the MDCT minimal overlap @ 48 kHz - 1.25ms */ #define L_MDCT_TRANS_OVLP_MAX NS2SA( 48000, ACELP_TCX_TRANS_NS ) /* Size of the ACELP->MDCT transition overlap - 1.25ms */ @@ -711,6 +713,7 @@ enum #define L_FRAME 256 /* frame size at 12.8kHz */ #define NB_SUBFR 4 /* number of subframes per frame */ #define L_SUBFR ( L_FRAME / NB_SUBFR ) /* subframe size */ +#define L_SUBFR_LOG2 6 /* To be used for shift operation instead of division */ #define L_SUBFR_Q6 ((L_FRAME/NB_SUBFR)*64) /* subframe size */ #define L_SUBFR_Q16 ((L_FRAME/NB_SUBFR)*65536) /* subframe size */ @@ -756,6 +759,7 @@ enum #define PIT_FIR_SIZE6_2 ( PIT_UP_SAMP6 * PIT_L_INTERPOL6_2 + 1 ) #define E_MIN 0.0035f /* minimum allowable energy */ #define E_MIN_Q11_FX 7 /* minimum allowable energy in Q11*/ +#define E_MIN_Q27_FX 469762 /* minimum allowable energy in Q27*/ #define STEP_DELTA 0.0625f /* quantization step for tilt compensation of gaussian cb. excitation */ #define GAMMA_EV 0.92f /* weighting factor for core synthesis error weighting */ #define FORMANT_SHARPENING_NOISE_THRESHOLD 21.0f /* lp_noise level above which formant sharpening is deactivated */ @@ -785,14 +789,17 @@ enum #define L_HP20_MEM 4 /* HP20 filter memory length */ #define CLDFB_NO_CHANNELS_MAX 60 /* CLDFB resampling - max number of CLDFB channels, == IVAS_CLDFB_NO_CHANNELS_MAX */ +#define CLDFB_NO_CHANNELS_HALF 30 /* CLDFB resampling - max number of CLDFB channels, == IVAS_CLDFB_NO_CHANNELS_MAX */ #define CLDFB_NO_CHANNELS_MAX_FX 30720 /*Q9*/ #define CLDFB_NO_COL_MAX 16 /* CLDFB resampling - max number of CLDFB col., == IVAS_CLDFB_NO_COL_MAX */ +#define CLDFB_NO_COL_MAX_LOG2 4 /* To be used for shift operation instead of division */ +#define ONE_BY_CLDFB_NO_COL_MAX_Q31 134217728 #define CLDFB_NO_COL_MAX_SWITCH 6 /* CLDFB resampling - max number of CLDFB col. for switching */ #define CLDFB_NO_COL_MAX_SWITCH_BFI 10 /* CLDFB resampling - max number of CLDFB col. for switching, BFI */ #define CLDFB_OVRLP_MIN_SLOTS 3 /* CLDFB resampling - minimize processing to minimum required for transition frame ACELP->TCX/HQ */ -#define INV_CLDFB_BANDWIDTH ( 1.f / 800.f ) -#define INV_CLDFB_BANDWIDTH_Q31 ( 2684355l ) -#define INV_CLDFB_BANDWIDTH_MDFT_FAC_Q31 ( 10737418 ) + +#define INV_CLDFB_BANDWIDTH_Q31 ( 2684355l ) /* ( 1.f / 800.f ) Q31 */ +#define INV_CLDFB_BANDWIDTH_MDFT_FAC_Q31 ( 10737418 ) #define CLDFB_BANDWIDTH 800 #define L_FILT_2OVER3 12 @@ -932,9 +939,7 @@ typedef enum #define GAIN_PRED_ORDER 4 /* Gain quantization - prediction order for gain quantizer (only for AMR-WB IO mode) */ #define MEAN_ENER 30 /* Gain quantization - average innovation energy */ -#ifdef NONBE_FIX_1277_EVS_DTX_HIGH_RATE_THRESHOLD #define DTX_THR 5 /* DTX - lp_noise threshold for DTX at higher bitrates */ -#endif #define DTX_HIST_SIZE 8 /* CNG & DTX - number of last signal frames used for CNG averaging */ #define CNG_ISF_FACT 0.9f /* CNG & DTX - CNG spectral envelope smoothing factor */ @@ -1534,6 +1539,7 @@ enum #define INTERP_3_2_MEM_LEN 15 #define L_SHB_LAHEAD 20 /* Size of lookahead for SHB */ #define NUM_SHB_SUBFR 16 +#define NUM_SHB_SUBFR_LOG2 4 /* To be used for shift operation instead of division */ #define LPC_SHB_ORDER 10 #define LPC_WHTN_ORDER 4 /* Order of whitening filter for SHB excitation */ #define SHB_OVERLAP_LEN ( L_FRAME16k - L_SHB_LAHEAD ) / ( NUM_SHB_SUBFR - 1 ) @@ -2067,11 +2073,11 @@ typedef enum _DCTTYPE #define INV_PREECHO_SMOOTH_LENP1 ( 1 / ( PREECHO_SMOOTH_LEN + 1.0 ) ); #define EPSILON 0.000000000000001f -#define EPSILON_FX_SMALL 1 -#define EPSILON_FIX (1) -#define EPSILON_FX (Word32)1 -#define EPSILON_FX_M 1208925819 -#define EPSILON_FX_E -49 +#define EPSILON_FX_SMALL 1 +#define EPSILON_FIX (1) +#define EPSILON_FX (Word32)1 +#define EPSILON_FX_M 1208925819 +#define EPSILON_FX_E -49 #define MAX_SEGMENT_LENGTH 480 @@ -2779,12 +2785,13 @@ enum #define Fs_2_16k 20480 /* lsf max value (Use in reorder_fx.c) */ #define LG10 24660 /* 10*log10(2) in Q13 */ -#define TEN_MULT_LOG10_2_IN_Q29 1616142464 /* (10 * log10(2)) = 3.0103 (in Q29) */ +#define TEN_MULT_LOG10_2_IN_Q29 1616142464 /* (10 * log10(2)) = 3.0103 (in Q29) */ #define LG10_s3_0 16440 /* 10*log10(2)/1.55 = 1.00343331 in Q14 */ -#define LOG2_10 27213 /* log base 2 of 10 in Q12 */ -#define LOG2_10_Q29 1783446566 /* log base 2 of 10 in Q12 */ -#define LOG10_2_Q31 646456993 /* inverse log base 10 of 2 in Q31 */ -#define MU_MA_FX 10923 /* original prediction factor for the AMR WB tables (Q15) */ +#define LOG2_10 27213 /* log base 2 of 10 in Q12 */ +#define LOG2_10_Q29 1783446566 /* log base 2 of 10 in Q12 */ +#define LOG10_2_Q31 646456993 /* inverse log base 10 of 2 in Q31 */ +#define INV_LOG2_10 9864 /* 1/log2(10), Q15*/ +#define MU_MA_FX 10923 /* original prediction factor for the AMR WB tables (Q15) */ #define E_MIN_FXQ15 115 /* Q15*/ #define E_MIN_FXQ31 7516193 /* 0.0035d in Q31*/ @@ -3055,6 +3062,8 @@ enum #define EVS_2PI_FX_Q27 843314856 /* 2 * pi in Q28 */ #define EVS_PI_BY_2_FX (Word16)(0x3244) // Q13 //#define EVS_PI_FX (Word16)(0x6488) +#define EVS_PI_FX16 (Word16)(0x6488) +#define PI2_FX 1686629713 //Q28 #define LG10 24660 /* 10*log10(2) in Q13 */ @@ -3068,8 +3077,8 @@ enum #define SYNC_BAD_FRAME (UWord16) 0x6B20 /* synchronization word of a "bad" frame */ #define G192_BIN0 (UWord16) 0x007F /* binary "0" according to ITU-T G.192 */ #define G192_BIN1 (UWord16) 0x0081 /* binary "1" according to ITU-T G.192 */ -#define DEGREE_180 (Word32)(180.0 *ONE_IN_Q23) -#define DEGREE_360 (Word32)(360.0 *ONE_IN_Q23) +#define DEGREE_180 (Word32)(180.0 *ONE_IN_Q22) +#define DEGREE_360 (Word32)(360.0 *ONE_IN_Q22) extern const Word16 Idx2Freq_Tbl[]; #define chk_fs(fs) @@ -3093,7 +3102,8 @@ extern const Word16 Idx2Freq_Tbl[]; #define FS_32K_IN_NS_Q31 68719 #define FS_16K_IN_NS_Q31 34360 -#define ONE_BY_THREE_Q15 10923 /* 1/3.f in Q15 */ +#define ONE_BY_THREE_Q15 10923 /* 1/3.f in Q15 */ +#define ONE_BY_TEN_Q15 3277 /* 1/10.f in Q15 */ #define THREE_Q21 6291456 #define SIX_Q21 12582912 diff --git a/lib_com/codec_tcx_common.c b/lib_com/codec_tcx_common_fx.c similarity index 78% rename from lib_com/codec_tcx_common.c rename to lib_com/codec_tcx_common_fx.c index 1ebc2829c15493506950bd608ca397162826847c..d7f30d90530f1c56374aa10938d729f3af82652f 100644 --- a/lib_com/codec_tcx_common.c +++ b/lib_com/codec_tcx_common_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -61,10 +61,6 @@ void tcxFormantEnhancement( Word16 i, j, k, l, n; Word16 fac, fac0, fac1, fac_e, d, tmp; Word16 xn_buf_e, xn_one, m, e; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif k = shr( L_frame, 6 ); /* FDNS_NPTS = 64 */ l = 0; @@ -139,7 +135,7 @@ void tcxFormantEnhancement( { fac = add( fac0, mult( d, extract_l( L_mult0( j, inv_int[n] ) ) ) ); BASOP_SATURATE_WARNING_OFF_EVS; - xn_buf[l + j] = s_min( xn_one, shl_o( mult( xn_buf[l + j], fac ), fac_e, &Overflow ) ); + xn_buf[l + j] = s_min( xn_one, shl_sat( mult( xn_buf[l + j], fac ), fac_e ) ); move16(); BASOP_SATURATE_WARNING_ON_EVS; } @@ -227,10 +223,6 @@ void tcxFormantEnhancement_with_shift( Word16 i, j, k, l, n; Word16 fac, fac0, fac1, fac_e, d, tmp; Word16 xn_buf_e, xn_one, m, e; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif k = shr( L_frame, 6 ); /* FDNS_NPTS = 64 */ l = 0; @@ -309,7 +301,7 @@ void tcxFormantEnhancement_with_shift( { fac = add( fac0, mult( d, extract_l( L_mult0( j, inv_int[n] ) ) ) ); BASOP_SATURATE_WARNING_OFF_EVS; - xn_buf[l + j] = s_min( xn_one, shl_o( mult( xn_buf[l + j], fac ), fac_e, &Overflow ) ); + xn_buf[l + j] = s_min( xn_one, shl_sat( mult( xn_buf[l + j], fac ), fac_e ) ); move16(); BASOP_SATURATE_WARNING_ON_EVS; } @@ -354,7 +346,7 @@ void tcxFormantEnhancement_with_shift( { fac = add( fac0, mult( d, extract_l( L_mult0( j, inv_int[n] ) ) ) ); BASOP_SATURATE_WARNING_OFF_EVS; - xn_buf[l + j] = s_min( xn_one, shl_o( mult( xn_buf[l + j], fac ), fac_e, &Overflow ) ); + xn_buf[l + j] = s_min( xn_one, shl_sat( mult( xn_buf[l + j], fac ), fac_e ) ); move16(); BASOP_SATURATE_WARNING_ON_EVS; } @@ -469,140 +461,6 @@ void tcxInvertWindowGrouping( } } -#ifdef IVAS_CODE_TCX_COM - -/*-------------------------------------------------------------------* - * tcx5SpectrumInterleaving() - * - * - *-------------------------------------------------------------------*/ - -void tcx5SpectrumInterleaving( - const int16_t tcx5Size, - float *spectrum ) -{ - int16_t i; - float interleaveBuf[N_TCX10_MAX]; - - set_f( interleaveBuf, 0.0f, N_TCX10_MAX ); - - /* group sub-windows: interleave bins according to their frequencies */ - for ( i = 0; i < tcx5Size; i++ ) - { - interleaveBuf[2 * i] = spectrum[i]; - interleaveBuf[2 * i + 1] = spectrum[tcx5Size + i]; - } - - mvr2r( interleaveBuf, spectrum, 2 * tcx5Size ); - - return; -} - - -/*-------------------------------------------------------------------* - * tcx5SpectrumDeinterleaving() - * - * - *-------------------------------------------------------------------*/ - -void tcx5SpectrumDeinterleaving( - const int16_t tcx5Size, - float *spectrum ) -{ - int16_t i; - float interleaveBuf[N_TCX10_MAX]; - - set_f( interleaveBuf, 0.0f, N_TCX10_MAX ); - - /* ungroup sub-windows: interleave bins according to their frequencies */ - for ( i = 0; i < tcx5Size; i++ ) - { - interleaveBuf[i] = spectrum[2 * i]; - interleaveBuf[tcx5Size + i] = spectrum[2 * i + 1]; - } - - mvr2r( interleaveBuf, spectrum, 2 * tcx5Size ); - - return; -} - - -/*-------------------------------------------------------------------* - * tcx5TnsGrouping() - * - * - *-------------------------------------------------------------------*/ - -void tcx5TnsGrouping( - const int16_t L_frame, /* i : frame length (TCX5) */ - const int16_t L_spec, /* i : coded spec length (TCX5, derived from filter borders*/ - float *spectrum ) -{ - /* rearrange LF sub-window lines prior to TNS synthesis filtering */ - if ( L_spec < L_frame ) - { - mvr2r( spectrum + 8, spectrum + 16, L_spec - 8 ); - mvr2r( spectrum + L_frame, spectrum + 8, 8 ); - mvr2r( spectrum + L_frame + 8, spectrum + L_spec + 8, L_spec - 8 ); - } - else - { - float buff[8]; /* Buffer for the rearrangement of LF TCX5 */ - mvr2r( spectrum + L_spec, buff, 8 ); - mvr2r( spectrum + 8, spectrum + 16, L_spec - 8 ); - mvr2r( buff, spectrum + 8, 8 ); - } - - return; -} - - -/*-------------------------------------------------------------------* - * tcx5TnsUngrouping() - * - * - *-------------------------------------------------------------------*/ - -void tcx5TnsUngrouping( - const int16_t L_frame, /* i : frame length (TCX5) */ - const int16_t L_spec, /* i : coded spec length (TCX5, derived from filter borders*/ - float *spectrum, - const int16_t enc_dec /* i : 0: encoder, else decoder */ -) -{ - /* undo rearrangement of LF sub-window lines prior to TNS analysis */ - if ( L_spec < L_frame ) - { - mvr2r( spectrum + L_spec + 8, spectrum + L_frame + 8, L_spec - 8 ); - mvr2r( spectrum + 8, spectrum + L_frame, 8 ); - mvr2r( spectrum + 16, spectrum + 8, L_spec - 8 ); - set_zero( spectrum + L_spec, L_frame - L_spec ); - set_zero( spectrum + L_frame + L_spec, L_frame - L_spec ); - } - else - { - float buff[8]; /* Buffer for the rearrangement of LF TCX5 */ - - mvr2r( spectrum + 8, buff, 8 ); - - if ( enc_dec == ENC ) - { - mvr2r( spectrum + 16, spectrum + 8, L_frame - 8 ); - mvr2r( buff, spectrum + L_frame, 8 ); - } - else - { - mvr2r( spectrum + 16, spectrum + 8, L_spec - 8 ); - mvr2r( buff, spectrum + L_spec, 8 ); - } - } - - return; -} - -#endif - - /*-------------------------------------------------------------------* * tcx5SpectrumInterleaving() * diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index bc6fd4f1af6f28146c62d4a3d163a421a83fb1e4..d6190dffd1d56c33c87a4e3cb4afdc1049de3732 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -46,18 +46,28 @@ * Common API constants *----------------------------------------------------------------------------------*/ -#define IVAS_NUM_FRAMES_PER_SEC 50 -#define IVAS_MAX_FRAME_SIZE ( 48000 / IVAS_NUM_FRAMES_PER_SEC ) -#define IVAS_MAX_BITS_PER_FRAME ( 512000 / IVAS_NUM_FRAMES_PER_SEC ) +#define IVAS_NUM_FRAMES_PER_SEC 50 /* number of frames per second */ +#define IVAS_MAX_SAMPLING_RATE 48000 /* maximum supported sampling rate in Hz */ +#define IVAS_MAX_FRAME_SIZE ( IVAS_MAX_SAMPLING_RATE / IVAS_NUM_FRAMES_PER_SEC ) /* maximum frame buffer length (per channel) in samples */ +#define IVAS_MAX_BITS_PER_FRAME ( 512000 / IVAS_NUM_FRAMES_PER_SEC ) /* maximum bits per frame; corresponds to maximum bitrate of 512 kbps */ #define IVAS_MAX_NUM_OBJECTS 4 -#define IVAS_MAX_INPUT_CHANNELS 16 -#define IVAS_MAX_OUTPUT_CHANNELS 16 +#define IVAS_MAX_LS_CHANNELS 16 #define IVAS_CLDFB_NO_COL_MAX 16 #define IVAS_CLDFB_NO_CHANNELS_MAX 60 +/* Renderer constants */ #define IVAS_MAX_PARAM_SPATIAL_SUBFRAMES 4 #define IVAS_ROOM_ABS_COEFF 6 +#define IVAS_REVERB_PREDELAY_MAX 20 /* Max input delay for reverb module */ +#define IVAS_ER_LIST_HEIGHT 1.6f +#define IVAS_ER_LIST_HEIGHT_FX 6710886 /* 1.6f in Q.22 */ +#define IVAS_DEFAULT_AEID 65535 + +/* JBM constants for adaptive-playout */ +#define IVAS_TIME_SCALE_MIN 50 /* min. time-scaling [%] */ +#define IVAS_TIME_SCALE_MAX 150 /* max. time-scaling [%] */ + /*----------------------------------------------------------------------------------* * Common API enum for output audio configurations @@ -120,23 +130,24 @@ typedef struct _IVAS_ISM_METADATA Word32 elevation_fx; /* Q22 */ Word16 radius_fx; /* Q9 */ Word32 spread_fx; /* Q22 */ - Word32 gainFactor_fx; /* Q31 */ + Word32 gainFactor_fx; /* Q29 */ Word32 yaw_fx; /* Q22 */ Word32 pitch_fx; /* Q22 */ - float azimuth; - float elevation; - float radius; - float spread; - float gainFactor; - float yaw; - float pitch; Word16 non_diegetic_flag; + Word32 gain_fx; /* Q29 */ } IVAS_ISM_METADATA; +typedef struct _IVAS_EDITABLE_PARAMETERS +{ + Word16 num_obj; + IVAS_ISM_METADATA ism_metadata[IVAS_MAX_NUM_OBJECTS]; + Word32 gain_bed_fx; /* Q29 */ + +} IVAS_EDITABLE_PARAMETERS; + typedef struct { - float w, x, y, z; Word32 w_fx, x_fx, y_fx, z_fx; Word16 q_fact; @@ -148,6 +159,7 @@ typedef struct float x, y, z; Word32 x_fx, y_fx, z_fx; Word16 q_fact; + } IVAS_VECTOR3; typedef enum @@ -169,14 +181,23 @@ typedef enum } IVAS_RENDER_FRAMESIZE; +typedef enum +{ + IVAS_ROOM_SIZE_AUTO = -1, + IVAS_ROOM_SIZE_SMALL, + IVAS_ROOM_SIZE_MEDIUM, + IVAS_ROOM_SIZE_LARGE +} IVAS_ROOM_SIZE_T; + typedef struct ivas_masa_metadata_frame_struct *IVAS_MASA_METADATA_HANDLE; typedef struct ivas_masa_decoder_ext_out_meta_struct *IVAS_MASA_DECODER_EXT_OUT_META_HANDLE; -typedef struct TDREND_HRFILT_FiltSet_struct *IVAS_DEC_HRTF_HANDLE; -typedef struct ivas_hrtfs_crend_structure *IVAS_DEC_HRTF_CREND_HANDLE; -typedef struct ivas_hrtfs_fastconv_struct *IVAS_DEC_HRTF_FASTCONV_HANDLE; -typedef struct ivas_hrtfs_parambin_struct *IVAS_DEC_HRTF_PARAMBIN_HANDLE; -typedef struct cldfb_filter_bank_struct *IVAS_CLDFB_FILTER_BANK_HANDLE; +typedef struct ivas_hrtf_TDREND_HRFILT_FiltSet_struct *IVAS_DEC_HRTF_TD_HANDLE; +typedef struct ivas_hrtf_crend_structure *IVAS_DEC_HRTF_CREND_HANDLE; +typedef struct ivas_hrtf_fastconv_struct *IVAS_DEC_HRTF_FASTCONV_HANDLE; +typedef struct ivas_hrtf_parambin_struct *IVAS_DEC_HRTF_PARAMBIN_HANDLE; +typedef struct ivas_hrtf_statistics_struct *IVAS_DEC_HRTF_STATISTICS_HANDLE; +typedef struct ivas_cldfb_filter_bank_struct *IVAS_CLDFB_FILTER_BANK_HANDLE; typedef struct ivas_LS_setup_custom *IVAS_LSSETUP_CUSTOM_HANDLE; typedef struct ivas_LS_setup_custom IVAS_LSSETUP_CUSTOM_STRUCT; @@ -184,12 +205,12 @@ typedef struct ivas_LS_setup_custom IVAS_LSSETUP_CUSTOM_STRUCT; typedef struct _IVAS_LS_CUSTOM_LAYOUT { Word16 num_spk; - float azimuth[IVAS_MAX_OUTPUT_CHANNELS]; - float elevation[IVAS_MAX_OUTPUT_CHANNELS]; - Word32 azimuth_fx[IVAS_MAX_OUTPUT_CHANNELS]; // Q22 - Word32 elevation_fx[IVAS_MAX_OUTPUT_CHANNELS]; // Q22 + float azimuth[IVAS_MAX_LS_CHANNELS]; + float elevation[IVAS_MAX_LS_CHANNELS]; + Word32 azimuth_fx[IVAS_MAX_LS_CHANNELS]; // Q22 + Word32 elevation_fx[IVAS_MAX_LS_CHANNELS]; // Q22 Word16 num_lfe; - Word16 lfe_idx[IVAS_MAX_OUTPUT_CHANNELS]; + Word16 lfe_idx[IVAS_MAX_LS_CHANNELS]; } IVAS_CUSTOM_LS_DATA; @@ -209,21 +230,108 @@ typedef struct _IVAS_JBM_TRACE_DATA } IVAS_JBM_TRACE_DATA; +typedef enum _ivas_binaural_renderer_type +{ + IVAS_BIN_RENDERER_TYPE_NONE, + IVAS_BIN_RENDERER_TYPE_CREND, + IVAS_BIN_RENDERER_TYPE_FASTCONV, + IVAS_BIN_RENDERER_TYPE_PARAMBIN, + IVAS_BIN_RENDERER_TYPE_TDREND, + IVAS_BIN_RENDERER_TYPE_DEFAULT, + +} IVAS_BIN_RENDERER_TYPE; + +/*----------------------------------------------------------------------------------* + * Split rendering API constants, structures, and enums + *----------------------------------------------------------------------------------*/ + +#define ISAR_MAX_SPLIT_REND_BITRATE 768000 +#define ISAR_MAX_SPLIT_REND_BITS_BUFFER_SIZE_IN_BYTES ( ( ( (Word32) ISAR_MAX_SPLIT_REND_BITRATE / IVAS_NUM_FRAMES_PER_SEC ) + 7 ) >> 3 ) +#define ISAR_SPLIT_REND_ADDITIONAL_BYTES_TO_READ 1 +#define ISAR_SPLIT_REND_BITS_BUFF_SIZE ( ISAR_MAX_SPLIT_REND_BITS_BUFFER_SIZE_IN_BYTES + ISAR_SPLIT_REND_ADDITIONAL_BYTES_TO_READ ) + +typedef enum +{ + DEFAULT_AXIS, + YAW, + PITCH, + ROLL, + YAW_PITCH, + YAW_ROLL, + PITCH_ROLL + +} ISAR_SPLIT_REND_ROT_AXIS; + +typedef enum +{ + ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE, + ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB, + +} ISAR_SPLIT_REND_POSE_CORRECTION_MODE; + +typedef enum +{ + ISAR_SPLIT_REND_CODEC_LCLD, + ISAR_SPLIT_REND_CODEC_LC3PLUS, + ISAR_SPLIT_REND_CODEC_DEFAULT, /* Will use LCLD for CLDFB rendering paths and LC3plus for TD rendering paths */ + ISAR_SPLIT_REND_CODEC_NONE + +} ISAR_SPLIT_REND_CODEC; + +typedef struct _ISAR_SPLIT_REND_BITS_DATA +{ + UWord8 *bits_buf; + Word32 buf_len; /*size of bits_buf in bytes. This field should be set by allocator of bits_buf*/ + Word32 bits_written; + Word32 bits_read; + Word16 codec_frame_size_ms; + ISAR_SPLIT_REND_CODEC codec; + ISAR_SPLIT_REND_POSE_CORRECTION_MODE pose_correction; + Word16 isar_frame_size_ms; + Word16 lc3plus_highres; + +} ISAR_SPLIT_REND_BITS_DATA, *ISAR_SPLIT_REND_BITS_HANDLE; + +typedef struct _ISAR_SPLIT_REND_CONFIG +{ + Word32 splitRendBitRate; /*Bit rate for split rendering mode, if "pcm_out" is set then "splitRendBitRate" is used as a limit for MD bitrate */ + Word16 hq_mode; /*High quality 3DOF mode with additional side information. Requires more pre-renditions. */ + Word16 dof; /*flag to specify if pose correction is needed for 1, 2 or 3 degree of freedoms*/ + /*The axis can be set dynamically per frame based on a file input */ + /*possible values: + 1 - (1dof correction. By default YAW correction) + 2 - (2dof correction. By default YAW and PITCH correction) + 3 - (3dof correction. By default YAW, PITCH and ROLL correction) + */ + Word16 codec_delay_ms; /* look ahead delay of the codec that is used to code BIN signal output of pre-renderer*/ + Word16 isar_frame_size_ms; /* ISAR bit stream frame size in milliseconds */ + Word16 codec_frame_size_ms; /* Codec frame size in milliseconds, only relevant with LC3plus */ + ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode; + ISAR_SPLIT_REND_CODEC codec; + IVAS_BIN_RENDERER_TYPE rendererSelection; + Word16 lc3plus_highres; + +} ISAR_SPLIT_REND_CONFIG_DATA, *ISAR_SPLIT_REND_CONFIG_HANDLE; + /*----------------------------------------------------------------------------------* * Renderer API structures and enums *----------------------------------------------------------------------------------*/ +#ifdef DEBUGGING +typedef enum +{ + IVAS_RENDER_TYPE_OVERRIDE_NONE, + IVAS_RENDER_TYPE_OVERRIDE_CREND, + IVAS_RENDER_TYPE_OVERRIDE_FASTCONV + +} IVAS_RENDER_TYPE_OVERRIDE; +#endif typedef struct _IVAS_ROOM_ACOUSTICS_CONFIG { - Word16 override; + UWord16 aeID; /* Acoustic environment ID */ Word16 nBands; /* Number of frequency bands for which reverb properties are provided, integer, range [2..256] */ - float pFc_input[IVAS_CLDFB_NO_CHANNELS_MAX]; /* Center frequencies for which following values are provided: */ - float pAcoustic_rt60[IVAS_CLDFB_NO_CHANNELS_MAX]; /* - The room's T60 per center frequency */ - float pAcoustic_dsr[IVAS_CLDFB_NO_CHANNELS_MAX]; /* - The room's Diffuse to Source Ratio per center frequency */ - float acousticPreDelay; /* Time elapsed between input signal and late reverberation start, float, range [0.001..10] */ - float inputPreDelay; /* Offset in seconds from where DSR is computed in the RIR (0 = at source), float, range [0.001..10] */ Word32 pFc_input_fx[IVAS_CLDFB_NO_CHANNELS_MAX]; /*Q16 Center frequencies for which following values are provided: */ Word32 pAcoustic_rt60_fx[IVAS_CLDFB_NO_CHANNELS_MAX]; /*Q26 - The room's T60 per center frequency */ Word32 pAcoustic_dsr_fx[IVAS_CLDFB_NO_CHANNELS_MAX]; /*Q30 - The room's Diffuse to Source Ratio per center frequency */ @@ -235,17 +343,37 @@ typedef struct _IVAS_ROOM_ACOUSTICS_CONFIG Word32 lowComplexity; /* Low complexity ER flag */ IVAS_VECTOR3 dimensions; /* Room dimensions [m] */ float AbsCoeff[IVAS_ROOM_ABS_COEFF]; /* Absorption coeffs */ - IVAS_VECTOR3 ListenerOrigin; /* Listener origin */ Word32 AbsCoeff_fx[IVAS_ROOM_ABS_COEFF]; /* Absorption coeffs */ + IVAS_VECTOR3 ListenerOrigin; /* Listener origin */ } IVAS_ROOM_ACOUSTICS_CONFIG_DATA; typedef struct _IVAS_RENDER_CONFIG { IVAS_ROOM_ACOUSTICS_CONFIG_DATA roomAcoustics; + ISAR_SPLIT_REND_CONFIG_DATA split_rend_config; float directivity[IVAS_MAX_NUM_OBJECTS * 3]; Word16 directivity_fx[IVAS_MAX_NUM_OBJECTS * 3]; // has the following q-factor pattern: {6, 6, 15, 6, 6, 15, 6, 6, 15, 6, 6, 15} + float distAtt[3]; + Word32 distAtt_fx[3]; /* {Q27, Q30, Q30} */ + } IVAS_RENDER_CONFIG_DATA, *IVAS_RENDER_CONFIG_HANDLE; +typedef struct +{ + Word16 numSamplesPerChannel; + Word16 numChannels; + Word16 is_cldfb; + +} IVAS_REND_AudioBufferConfig; + +typedef struct +{ + IVAS_REND_AudioBufferConfig config; + Word16 q_factor; + Word16 *pq_fact; + Word32 *data_fx; + +} IVAS_REND_AudioBuffer; #endif /* COMMON_API_TYPES_H */ diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config_fx.c similarity index 95% rename from lib_com/core_com_config.c rename to lib_com/core_com_config_fx.c index f0ee8efd8d12c038c78487a8f39ba71dc21a3b9c..90fc306b700bd445d4b24666223dab9c1c9015ec 100644 --- a/lib_com/core_com_config.c +++ b/lib_com/core_com_config_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -246,67 +246,18 @@ Word16 getTcxonly_ivas_fx( } Word16 getTcxonly( -#ifdef IVAS_CODE_SWITCHING - const Word16 element_mode, /* i : IVAS element mode */ -#endif const Word32 total_brate /* i : total bitrate */ -#ifdef IVAS_CODE_SWITCHING - , - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ - const int16_t is_ism_format /* i : flag indicating ISM format */ -#endif ) { Word16 tcxonly; tcxonly = 0; move16(); -#ifdef IVAS_CODE_SWITCHING - SWITCH( element_mode ) + if ( GT_32( total_brate, 32000 ) ) { - case EVS_MONO: -#endif - if ( GT_32( total_brate, 32000 ) ) - { - tcxonly = 1; - move16(); - } -#ifdef IVAS_CODE_SWITCHING - break; - case IVAS_SCE: - if ( is_ism_format ) - { - if ( total_brate > MAX_ACELP_BRATE_ISM ) - { - tcxonly = 1; - } - } - else - { - if ( total_brate > MAX_ACELP_BRATE ) - { - tcxonly = 1; - } - } - break; - - case IVAS_CPE_DFT: - case IVAS_CPE_TD: - if ( total_brate > MAX_ACELP_BRATE ) - { - tcxonly = 1; - } - break; - case IVAS_CPE_MDCT: - if ( total_brate >= ( MCT_flag ? IVAS_32k : IVAS_48k ) ) - { - tcxonly = 1; - } - break; -#endif -#ifdef IVAS_CODE_SWITCHING + tcxonly = 1; + move16(); } -#endif return tcxonly; /*Q0*/ } @@ -541,12 +492,12 @@ Word16 sr2fscale_fx( return extract_l( Mpy_32_16_1( sr_core, FSCALE_DENOM_BY_12800_Q15 ) ); /*Q0*/ } -int16_t sr2fscale( - const int32_t sr_core /* i : internal sampling rate */ +Word16 sr2fscale( + const Word32 sr_core /* i : internal sampling rate */ ) { - return (int16_t) ( ( FSCALE_DENOM * sr_core ) / 12800 ); + return (Word16) ( ( FSCALE_DENOM * sr_core ) / 12800 ); } Word32 getCoreSamplerateMode2( diff --git a/lib_com/deemph.c b/lib_com/deemph_fx.c similarity index 68% rename from lib_com/deemph.c rename to lib_com/deemph_fx.c index c03a050bca095711ea2e0c6a07e721aeb29e1dbf..8442897c574169fd2c7b38b565f53d394d54f4c6 100644 --- a/lib_com/deemph.c +++ b/lib_com/deemph_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -39,28 +39,24 @@ #include "prot_fx.h" #include "wmc_auto.h" - void deemph_fx_32( - Word16 shift, /*scaled output*/ Word32 *signal, /* i/o: signal Qx*/ const Word16 mu, /* i : deemphasis factor Q15*/ const Word16 L, /* i : vector size */ - Word32 *mem /* i/o: memory (y[-1]) Qx+shift*/ + Word32 *mem /* i/o: memory (y[-1]) Qx*/ ) { Word16 i; - signal[0] = L_add( signal[0], Mpy_32_16_1( ( *mem ), mu ) ); /*Qx*/ + signal[0] = Madd_32_16( signal[0], *mem, mu ); // Qx move32(); FOR( i = 1; i < L; i++ ) { - signal[i] = L_add( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); /*Qx*/ - signal[i] = L_shl( signal[i], shift ); /*Qx+shift*/ - move32(); + signal[i] = Madd_32_16( signal[i], signal[i - 1], mu ); // Qx move32(); } - *mem = signal[L - 1]; /*Qx+shift*/ + *mem = signal[L - 1]; // Qx move32(); return; @@ -68,27 +64,27 @@ void deemph_fx_32( /*========================================================================*/ -/* FUNCTION : deemph_fx() */ +/* FUNCTION : deemph_fx() */ /*------------------------------------------------------------------------*/ -/* PURPOSE : Deemphasis: filtering through 1/(1-mu z^-1) */ +/* PURPOSE : Deemphasis: filtering through 1/(1-mu z^-1) */ /*------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) mu : deemphasis factor Q15 */ -/* _ (Word16) L : vector size */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) mu : deemphasis factor Q15 */ +/* _ (Word16) L : vector size */ /*------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16*) signal : signal Q_syn2-1 */ -/* _ (Word16*) mem : memory (y[-1]) Q_syn2-1 */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word16*) signal : signal Q_syn2-1 */ +/* _ (Word16*) mem : memory (y[-1]) Q_syn2-1 */ /*------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*========================================================================*/ void deemph_fx( - Word16 *signal, /* i/o: signal Qx */ + Word16 *signal, /* i/o: signal Qx */ const Word16 mu, /* i : deemphasis factor Q15 */ const Word16 L, /* i : vector size Q0 */ Word16 *mem /* i/o: memory (y[-1]) Qx */ @@ -96,22 +92,16 @@ void deemph_fx( { Word16 i; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow; - Overflow = 0; - move32(); -#endif - - L_tmp = L_deposit_h( signal[0] ); /*Qx+16*/ - L_tmp = L_mac_o( L_tmp, *mem, mu, &Overflow ); /*Qx+16*/ - signal[0] = round_fx_o( L_tmp, &Overflow ); /*Qx*/ + L_tmp = L_deposit_h( signal[0] ); /*Qx+16*/ + L_tmp = L_mac_sat( L_tmp, *mem, mu ); /*Qx+16*/ + signal[0] = round_fx_sat( L_tmp ); /*Qx*/ move16(); FOR( i = 1; i < L; i++ ) { - L_tmp = L_deposit_h( signal[i] ); /*Qx+16*/ - L_tmp = L_mac_o( L_tmp, signal[i - 1], mu, &Overflow ); /*Qx+16*/ - signal[i] = round_fx_o( L_tmp, &Overflow ); /*Qx*/ + L_tmp = L_deposit_h( signal[i] ); /*Qx+16*/ + L_tmp = L_mac_sat( L_tmp, signal[i - 1], mu ); /*Qx+16*/ + signal[i] = round_fx_sat( L_tmp ); /*Qx*/ move16(); } @@ -134,11 +124,7 @@ void Deemph2( { Word16 i; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow; - Overflow = 0; - move32(); -#endif + /* saturation can occur in L_mac() */ L_tmp = L_mult( x[0], 16384 /*0.5f in Q15*/ ); /*Qx+16*/ @@ -147,13 +133,15 @@ void Deemph2( FOR( i = 1; i < L; i++ ) { - L_tmp = L_mult( x[i], 16384 /*0.5f in Q15*/ ); /*Qx+16*/ - x[i] = mac_ro( L_tmp, x[i - 1], mu, &Overflow ); /*Qx-1*/ + L_tmp = L_mult( x[i], 16384 /*0.5f in Q15*/ ); /*Qx+16*/ + x[i] = mac_r_sat( L_tmp, x[i - 1], mu ); /*Qx-1*/ move16(); } *mem = x[L - 1]; /*Qx-1*/ move16(); + + return; } @@ -162,8 +150,8 @@ void Deemph2( * * Parameters: * shift I: scale output - * x I/O: signal Qx/Qx-shift - * mu I: deemphasis factor Qx + * x I/O: signal Qx/Qx-shift + * mu I: deemphasis factor Qx * L I: vector size * mem I/O: memory (signal[-1]) Qx * @@ -174,15 +162,15 @@ void Deemph2( * Returns: * void */ -void E_UTIL_deemph2( Word16 shift, Word16 *x, const Word16 mu, const Word16 L, Word16 *mem ) +void E_UTIL_deemph2( + Word16 shift, + Word16 *x, + const Word16 mu, + const Word16 L, + Word16 *mem ) { Word16 i; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow; - Overflow = 0; - move32(); -#endif /* signal[0] = signal[0] + mu * (*mem); */ L_tmp = L_deposit_h( *mem ); /*Qx+16*/ @@ -191,8 +179,8 @@ void E_UTIL_deemph2( Word16 shift, Word16 *x, const Word16 mu, const Word16 L, W shift = shr( -32768, shift ); /*Q15 - shift*/ FOR( i = 0; i < L; i++ ) { - L_tmp = L_msu_o( Mpy_32_16_1( L_tmp, mu ), x[i], shift, &Overflow ); /*Qx-shift+16*/ - x[i] = round_fx_o( L_tmp, &Overflow ); /*Qx-shift*/ + L_tmp = L_msu_sat( Mpy_32_16_1( L_tmp, mu ), x[i], shift ); /*Qx-shift+16*/ + x[i] = round_fx_sat( L_tmp ); /*Qx-shift*/ move16(); } } @@ -200,8 +188,8 @@ void E_UTIL_deemph2( Word16 shift, Word16 *x, const Word16 mu, const Word16 L, W { FOR( i = 0; i < L; i++ ) { - L_tmp = L_msu_o( Mpy_32_16_1( L_tmp, mu ), shr_o( x[i], shift, &Overflow ), -32768 /*1.0f in Q15*/, &Overflow ); /*Qx-shift+16*/ - x[i] = round_fx_o( L_tmp, &Overflow ); /*Qx-shift*/ + L_tmp = L_msu_sat( Mpy_32_16_1( L_tmp, mu ), shr_sat( x[i], shift ), -32768 /*1.0f in Q15*/ ); /*Qx-shift+16*/ + x[i] = round_fx_sat( L_tmp ); /*Qx-shift*/ move16(); } } diff --git a/lib_com/delay_comp.c b/lib_com/delay_comp_fx.c similarity index 83% rename from lib_com/delay_comp.c rename to lib_com/delay_comp_fx.c index edccca07400e2758d17230e2030c91929269027f..fd5330aed8f08c9a7103bb5b0e967f11135e4ced 100644 --- a/lib_com/delay_comp.c +++ b/lib_com/delay_comp_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -47,15 +47,12 @@ *--------------------------------------------------------------------------*/ /*! r: delay value in ns */ -Word32 get_delay_fx( /* o : delay value in ms */ - const Word16 what_delay, /* i : what delay? (ENC or DEC) Q0*/ - const Word32 io_fs, /* i : input/output sampling frequency Q0*/ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - HANDLE_CLDFB_FILTER_BANK hCldfb /* i : Handle of Cldfb analysis */ -#ifdef SPLIT_REND_WITH_HEAD_ROT - , - const AUDIO_CONFIG output_config /* i : decoder output config */ -#endif +Word32 get_delay_fx( + const Word16 what_delay, /* i : what delay? (ENC or DEC) Q0*/ + const Word32 io_fs, /* i : input/output sampling frequency Q0*/ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + HANDLE_CLDFB_FILTER_BANK hCldfb, /* i : Handle of Cldfb analysis */ + const Word16 flag_binaural_split_coded /* i : split rendering on/off flag */ ) { Word32 delay; /*Q0*/ @@ -80,6 +77,7 @@ Word32 get_delay_fx( /* o : delay value in ms move32(); } } + test(); if ( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) { @@ -107,19 +105,15 @@ Word32 get_delay_fx( /* o : delay value in ms delay = IVAS_DEC_DELAY_NS; /*Q0*/ move32(); -#ifdef SPLIT_REND_WITH_HEAD_ROT - - IF( NE_16( output_config, AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) + IF( !flag_binaural_split_coded ) { -#endif if ( hCldfb != NULL ) { /* compensate for filterbank delay */ delay = L_add( delay, IVAS_FB_DEC_DELAY_NS ); /*Q0*/ } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif + test(); if ( EQ_16( ivas_format, MASA_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { diff --git a/lib_com/disclaimer.c b/lib_com/disclaimer.c index 1a01c2c320d249726ccf142ca9a0390f2846ac24..ce456fb496f45c0cebb1127e13bad31a0295099e 100644 --- a/lib_com/disclaimer.c +++ b/lib_com/disclaimer.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -40,18 +40,16 @@ #define WMC_TOOL_SKIP -int16_t print_disclaimer( FILE *fPtr ) +Word16 print_disclaimer( FILE *fPtr ) { fprintf( fPtr, "\n==================================================================================================\n" ); -#ifdef FIX_DISCLAIMER - fprintf( fPtr, " IVAS Codec BASOP Baseline\n" ); -#else - fprintf( fPtr, " IVAS Codec Baseline\n" ); -#endif - fprintf( fPtr, " \n" ); - fprintf( fPtr, " Based on EVS Codec (Floating Point) 3GPP TS26.443 Nov 04, 2021,\n" ); - fprintf( fPtr, " Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0\n" ); + fprintf( fPtr, "\n" ); + fprintf( fPtr, " 3GPP TS26.251 IVAS Codec Version IVAS-FX-3.0 (fixed-point C-Code)\n" ); + fprintf( fPtr, "\n" ); + fprintf( fPtr, " Based on EVS Codec (Alternative Fixed Point) 3GPP TS26.452 Nov 04, 2021,\n" ); + fprintf( fPtr, " Version 16.4.0\n" ); + fprintf( fPtr, "\n" ); fprintf( fPtr, "==================================================================================================\n\n" ); return 0; diff --git a/lib_com/dlpc_bfi_fx.c b/lib_com/dlpc_bfi_fx.c index 2d6b1126862da9bd153687b0194c73b13ef165bb..dffdb982ad888d9964dcf59fe129b8e921e068c6 100644 --- a/lib_com/dlpc_bfi_fx.c +++ b/lib_com/dlpc_bfi_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ diff --git a/lib_com/edct_fx.c b/lib_com/edct_fx.c index b1e2a7dd9b76719cec5ef06815655c249d617237..55bc483e0fcc2558eeea1fb5a958b54318aefda6 100644 --- a/lib_com/edct_fx.c +++ b/lib_com/edct_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -9,11 +9,8 @@ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "stl.h" - - #include "math_32.h" - static Word16 get_edxt_factor( Word16 length ) /* Returns value of sqrtf(2.f/length) in Q15 */ { Word16 factor; /*Q15*/ @@ -395,14 +392,7 @@ void edct_16fx( Word16 Len2, i2; const Word16 *px, *pt; Word16 *py; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) element_mode; -#endif -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow; - Overflow = 0; - move32(); -#endif /*COMPLETE: some eDCT sub function are missing */ IF( EQ_16( length, L_FRAME32k ) ) @@ -457,13 +447,13 @@ void edct_16fx( { i2 = shl( i, 1 ); - L_tmp = L_mult( x[i2], edct_table[i] ); /*Q(Qx+16) */ - Lacc = L_mac_o( L_tmp, *px, *pt, &Overflow ); /*Q(Qx+16) */ - re2[i] = round_fx_o( L_shl_o( Lacc, Q_edct, &Overflow ), &Overflow ); /* Q(Qx+Q_edct) */ + L_tmp = L_mult( x[i2], edct_table[i] ); /*Q(Qx+16) */ + Lacc = L_mac_sat( L_tmp, *px, *pt ); /*Q(Qx+16) */ + re2[i] = round_fx_sat( L_shl_sat( Lacc, Q_edct ) ); /* Q(Qx+Q_edct) */ move16(); - L_tmp = L_mult( *px, edct_table[i] ); /*Q(Qx+16) */ - Lacc = L_msu_o( L_tmp, x[i2], *pt, &Overflow ); /*Q(Qx+16) */ - im2[i] = round_fx_o( L_shl_o( Lacc, Q_edct, &Overflow ), &Overflow ); /* Q(Qx+Q_edct) */ + L_tmp = L_mult( *px, edct_table[i] ); /*Q(Qx+16) */ + Lacc = L_msu_sat( L_tmp, x[i2], *pt ); /*Q(Qx+16) */ + im2[i] = round_fx_sat( L_shl_sat( Lacc, Q_edct ) ); /* Q(Qx+Q_edct) */ move16(); px -= 2; pt--; @@ -488,12 +478,12 @@ void edct_16fx( fact = round_fx( L_shl( L_tmp, 2 ) ); /*Q15 */ FOR( i = 0; i < shr( length, 1 ); i++ ) { - tmp = mult_r( im2[i], fact ); /*Q(Qx+Q_edct) */ - re[i] = sub_o( re2[i], tmp, &Overflow ); /*Q(Qx+Q_edct) */ + tmp = mult_r( im2[i], fact ); /*Q(Qx+Q_edct) */ + re[i] = sub_sat( re2[i], tmp ); /*Q(Qx+Q_edct) */ move16(); - tmp = mult_r( re2[i], fact ); /*Q(Qx+Q_edct) */ - im[i] = add_o( im2[i], tmp, &Overflow ); /*Q(Qx+Q_edct) */ + tmp = mult_r( re2[i], fact ); /*Q(Qx+Q_edct) */ + im[i] = add_sat( im2[i], tmp ); /*Q(Qx+Q_edct) */ move16(); } @@ -504,14 +494,14 @@ void edct_16fx( { i2 = shl( i, 1 ); - L_tmp = L_mult( re[i], edct_table[i] ); /*Q(Qx+Q_edct+16) */ - Lacc = L_mac_o( L_tmp, im[i], *pt, &Overflow ); /*Q(Qx+Q_edct+16) */ - y[i2] = round_fx_o( L_shr_o( Lacc, Q_edct, &Overflow ), &Overflow ); /* Q(Qx) */ + L_tmp = L_mult( re[i], edct_table[i] ); /*Q(Qx+Q_edct+16) */ + Lacc = L_mac_sat( L_tmp, im[i], *pt ); /*Q(Qx+Q_edct+16) */ + y[i2] = round_fx_sat( L_shr_sat( Lacc, Q_edct ) ); /* Q(Qx) */ move16(); L_tmp = L_mult( re[i], edct_table[sub( shr( length, 1 ), add( 1, i ) )] ); /*Q(Qx+Q_edct+16) */ Lacc = L_msu( L_tmp, im[i], edct_table[i] ); /*Q(Qx+Q_edct+16) */ - *py = round_fx_o( L_shr_o( Lacc, Q_edct, &Overflow ), &Overflow ); /* Q(Qx) */ + *py = round_fx_sat( L_shr_sat( Lacc, Q_edct ) ); /* Q(Qx) */ move16(); py -= 2; @@ -577,7 +567,7 @@ void iedct_short_fx( return; } -#define FAST_EDXT /* optimized FFT-based DCT/DST algorithm */ + /*-------------------------------------------------------------------------* * edxt_fx() * @@ -713,7 +703,6 @@ void edxt_fx( move16(); } -#ifdef FAST_EDXT test(); IF( EQ_16( kernelType, MDST_II ) || EQ_16( kernelType, MDCT_II ) ) { @@ -887,47 +876,11 @@ void edxt_fx( } } } -#endif -#ifdef IVAS_FLOAT_FIXED_TO_BE_DONE - ELSE - /* TODO: below IF and ELSE blocks are unreachable, verified on code coverage report */ - IF( s_and( kernelType, 1 ) ) /* DST */ + else { - const float offK = ( kernelType == MDST_II && synthesis ? 0.5f : 1.0f - 0.5f * ( kernelType >> 1 ) ); - const float offM = ( kernelType == MDST_II && synthesis ? 1.0f : 0.5f ); - - FOR( k = 0; k < length; k++ ) - { - y[k] = 0.f; - FOR( m = 0; m < length; m++ ) - { - y[k] += x[m] * sinf( pi_len * ( m + offM ) * ( k + offK ) ); - } - } - IF( offK == 1.f ) - { - y[length - 1] *= 0.5f; /* scale Nyquist sample */ - } + assert( !"Unsupported Kernel type in edxt_fx()" ); } - ELSE /* kernelType 0, 2: DCT */ - { - const float offK = ( EQ_16( kernelType, MDCT_II ) && synthesis ? 0.5f : 0.5f - shr( shr( kernelType, 1 ), 1 ) ); - const float offM = ( EQ_16( kernelType, MDCT_II ) && synthesis ? 0.0f : 0.5f ); - FOR( k = 0; k < length; k++ ) - { - y[k] = 0.f; - FOR( m = 0; m < length; m++ ) - { - y[k] += x[m] * cosf( pi_len * ( m + offM ) * ( k + offK ) ); - } - } - IF( offK == 0.f ) - { - y[0] *= 0.5f; /* scale lowest (i.e. DC) sample */ - } - } -#endif // IVAS_FLOAT_FIXED_TO_BE_DONE /*v_multc(y, (kernelType == MDCT_II ? -1.f : 1.f) * sqrtf(2.f / length), y, length);*/ fac = get_edxt_factor( length ); /* Q15 */ if ( EQ_16( kernelType, MDCT_II ) ) diff --git a/lib_com/enhancer_fx.c b/lib_com/enhancer_fx.c index 7df474a5d6ab88a9f6ca0ae8f706f590ae0affe7..6203dcd67c6fccc08523e3840ab752afddc74932 100644 --- a/lib_com/enhancer_fx.c +++ b/lib_com/enhancer_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -299,10 +299,11 @@ void enhancer_fx( /* RETURN ARGUMENTS : */ /* _ None */ /*======================================================================================*/ + void enhancer_ivas_fx( - const Word16 codec_mode, /* i : flag indicating Codec Mode */ - const Word32 core_brate, /* i : decoder bitrate */ - const Word16 cbk_index, /* i : */ + const Word16 codec_mode, /* i : flag indicating Codec Mode */ + const Word32 core_brate, /* i : decoder bitrate */ + const Word16 cbk_index, const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ const Word16 coder_type, /* i : coder type */ const Word16 i_subfr, /* i : subframe number */ @@ -322,9 +323,11 @@ void enhancer_ivas_fx( Word16 tmp, fac, *pt_exc2; Word16 i; Word32 L_tmp; + Word32 L_tmp1, L_tmp2; Word16 gain_code_hi; Word16 pit_sharp, tmp16; Word16 excp[L_SUBFR], sc; + Word64 w_temp; pit_sharp = gain_pit; @@ -400,215 +403,6 @@ void enhancer_ivas_fx( phase_dispersion_fx( norm_gain_code, gain_pit, code, i, dm_fx ); - /*------------------------------------------------------------ - * noise enhancer - * - * - Enhance excitation on noise. (modify gain of code) - * If signal is noisy and LPC filter is stable, move gain - * of code 1.5 dB toward gain of code threshold. - * This decreases by 3 dB noise energy variation. - *-----------------------------------------------------------*/ - - /* tmp = 0.5f * (1.0f - voice_fac) */ - tmp = msu_r_sat( 0x40000000 /*0.5.Q31*/, voice_fac, 16384 /*0.5.Q14*/ ); /*Q15 */ /* 1=unvoiced, 0=voiced */ - /* fac = stab_fac * tmp */ - fac = mult( stab_fac, tmp ); /*Q15*/ - - IF( LT_32( norm_gain_code, *gc_threshold ) ) - { - L_tmp = Madd_32_16( norm_gain_code, norm_gain_code, 6226 /*0.19.Q15*/ ); /*Q16 */ - L_tmp = L_min( L_tmp, *gc_threshold ); /*Q16 */ - } - ELSE - { - L_tmp = Mult_32_16( norm_gain_code, 27536 /*0.84.Q15*/ ); /*Q16 */ - L_tmp = L_max( L_tmp, *gc_threshold ); /*Q16 */ - } - *gc_threshold = L_tmp; - move32(); /*Q16 */ - - /* gain_code = (fac * tmp) + (1.0 - fac) * gain_code ==> fac * (tmp - gain_code) + gain_code */ - L_tmp = L_sub( L_tmp, norm_gain_code ); /*Q16 */ - norm_gain_code = Madd_32_16( norm_gain_code, L_tmp, fac ); /*Q16 */ - - /* gain_code *= gain_inov - Inverse the normalization */ - L_tmp = Mult_32_16( norm_gain_code, gain_inov ); /*Q13*/ /* gain_inov in Q12 */ - - sc = 6; - move16(); - - gain_code_hi = round_fx( L_shl( L_tmp, add( Q_exc, 3 ) ) ); /* in Q_exc */ - - /*------------------------------------------------------------* - * pitch enhancer - * - * - Enhance excitation on voiced. (HP filtering of code) - * On voiced signal, filtering of code by a smooth fir HP - * filter to decrease energy of code at low frequency. - *------------------------------------------------------------*/ - test(); - IF( !Opt_AMR_WB && EQ_16( coder_type, UNVOICED ) ) - { - /* Copy(code, exc2, L_SUBFR) */ - FOR( i = 0; i < L_SUBFR; i++ ) - { - pt_exc2[i] = round_fx( L_shl( L_mult( gain_code_hi, code[i] ), sc ) ); /*Q0 */ /* code in Q12 (Q9 for encoder) */ - move16(); - } - } - ELSE - { - test(); - test(); - IF( Opt_AMR_WB && ( EQ_32( core_brate, ACELP_8k85 ) || EQ_32( core_brate, ACELP_6k60 ) ) ) - { - pit_sharp = shl_sat( gain_pit, 1 ); /* saturation can occur here Q14 -> Q15 */ - /* saturation takes care of "if (pit_sharp > 1.0) { pit_sharp=1.0; }" */ - IF( GT_16( pit_sharp, 16384 /*0.5.Q15*/ ) ) - { - tmp16 = mult( pit_sharp, 8192 /*0.25.Q15*/ ); - FOR( i = 0; i < L_SUBFR; i++ ) - { - /* excp[i] = pt_exc2[i] * pit_sharp * 0.25 */ - excp[i] = mult_r( pt_exc2[i], tmp16 ); - move16(); - } - } - } - - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - /* tmp = 0.150 * (1.0 + voice_fac) */ - /* 0.30=voiced, 0=unvoiced */ - tmp = mac_r( 0x13333333L /*0.150.Q31*/, voice_fac, 4915 /*0.150.Q15*/ ); /*Q15 */ - } - ELSE - { - /* tmp = 0.125 * (1.0 + voice_fac) */ - /* 0.25=voiced, 0=unvoiced */ - tmp = mac_r( 0x10000000L /*0.125.Q31*/, voice_fac, 4096 ); /*Q15 */ - } - - /*----------------------------------------------------------------- - * Do a simple noncasual "sharpening": effectively an FIR - * filter with coefs [-tmp 1.0 -tmp] where tmp=0...0.25. - * This is applied to code and add_fxed to exc2 - *-----------------------------------------------------------------*/ - /* pt_exc2[0] += code[0] - tmp * code[1] */ - L_tmp = L_deposit_h( code[0] ); /* if Enc :Q9 * Q15 -> Q25 */ - L_tmp = L_msu( L_tmp, code[1], tmp ); /* Q12 * Q15 -> Q28 */ - L_tmp = L_shl( L_mult( gain_code_hi, extract_h( L_tmp ) ), sc ); - pt_exc2[0] = msu_r( L_tmp, -32768, pt_exc2[0] ); - move16(); /* in Q_exc */ - - FOR( i = 1; i < L_SUBFR - 1; i++ ) - { - /* pt_exc2[i] += code[i] - tmp * code[i-1] - tmp * code[i+1] */ - L_tmp = L_msu( -32768, code[i], -32768 ); - L_tmp = L_msu( L_tmp, code[i + 1], tmp ); - tmp16 = msu_r( L_tmp, code[i - 1], tmp ); - L_tmp = L_shl( L_mult( gain_code_hi, tmp16 ), sc ); - pt_exc2[i] = msu_r_sat( L_tmp, -32768, pt_exc2[i] ); - move16(); /* in Q_exc */ - } - - /* pt_exc2[L_SUBFR-1] += code[L_SUBFR-1] - tmp * code[L_SUBFR-2] */ - L_tmp = L_deposit_h( code[L_SUBFR - 1] ); /*Q28 */ - L_tmp = L_msu( L_tmp, code[L_SUBFR - 2], tmp ); /*Q28 */ - L_tmp = L_shl( L_mult( gain_code_hi, extract_h( L_tmp ) ), sc ); - pt_exc2[L_SUBFR - 1] = msu_r( L_tmp, -32768, pt_exc2[L_SUBFR - 1] ); - move16(); /* in Q_exc */ - test(); - test(); - IF( Opt_AMR_WB && ( EQ_32( core_brate, ACELP_8k85 ) || EQ_32( core_brate, ACELP_6k60 ) ) ) - { - IF( GT_16( pit_sharp, 16384 /*0.5.Q14*/ ) ) - { - FOR( i = 0; i < L_SUBFR; i++ ) - { - /* excp[i] += pt_exc2[i] */ - excp[i] = add( excp[i], pt_exc2[i] ); - move16(); - } - agc2_fx( pt_exc2, excp, L_SUBFR ); - Copy( excp, pt_exc2, L_SUBFR ); - } - } - } -} - -void enhancer_ivas_fx2( - const Word32 core_brate, /* i : decoder bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 coder_type, /* i : coder type */ - const Word16 i_subfr, /* i : subframe number */ - const Word16 L_frame, /* i : frame size */ - const Word16 voice_fac, /* i : subframe voicing estimation Q15 */ - const Word16 stab_fac, /* i : LP filter stablility measure Q15 */ - Word32 norm_gain_code, /* i : normalised innovative cb. gain Q16 */ - const Word16 gain_inov, /* i : gain of the unscaled innovation Q12 */ - Word32 *gc_threshold, /* i/o: gain code threshold Q16 */ - Word16 *code, /* i/o: innovation Q12 */ - Word16 *exc2, /* i/o: adapt. excitation/total exc. Q_exc*/ - const Word16 gain_pit, /* i : quantized pitch gain Q14 */ - struct dispMem_fx *dm_fx, /* i/o: phase dispersion algorithm memory */ - const Word16 Q_exc /* i : Q of the excitation */ -) -{ - Word16 tmp, fac, *pt_exc2; - Word16 i; - Word32 L_tmp; - Word32 L_tmp1, L_tmp2; - Word16 gain_code_hi; - Word16 pit_sharp, tmp16; - Word16 excp[L_SUBFR], sc; - Word64 w_temp; - - - pit_sharp = gain_pit; - move16(); /* to remove gcc warning */ - pt_exc2 = exc2 + i_subfr; - - /*------------------------------------------------------------* - * Phase dispersion to enhance noise at low bit rate - *------------------------------------------------------------*/ - - i = 2; - move16(); /* no dispersion */ - IF( Opt_AMR_WB ) - { - IF( LE_32( core_brate, ACELP_6k60 ) ) - { - i = 0; - move16(); /* high dispersion */ - } - ELSE IF( LE_32( core_brate, ACELP_8k85 ) ) - { - i = 1; - move16(); /* low dispersion */ - } - } - ELSE IF( NE_16( coder_type, UNVOICED ) ) - - { - test(); - test(); - test(); - test(); - IF( LE_32( core_brate, ACELP_7k20 ) ) - { - i = 0; - move16(); /* high dispersion */ - } - ELSE IF( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) || EQ_16( coder_type, AUDIO ) || coder_type == INACTIVE ) && LE_32( core_brate, ACELP_9k60 ) ) - { - i = 1; - move16(); /* low dispersion */ - } - } - - phase_dispersion_fx( norm_gain_code, gain_pit, code, i, dm_fx ); - /*------------------------------------------------------------ * noise enhancer * @@ -656,7 +450,8 @@ void enhancer_ivas_fx2( * filter to decrease energy of code at low frequency. *------------------------------------------------------------*/ test(); - IF( !Opt_AMR_WB && EQ_16( coder_type, UNVOICED ) ) + test(); + IF( !Opt_AMR_WB && EQ_16( codec_mode, MODE1 ) && EQ_16( coder_type, UNVOICED ) ) { /* Copy(code, exc2, L_SUBFR) */ FOR( i = 0; i < L_SUBFR; i++ ) diff --git a/lib_com/enr_1_az.c b/lib_com/enr_1_az_fx.c similarity index 97% rename from lib_com/enr_1_az.c rename to lib_com/enr_1_az_fx.c index 5c99cdfa5e27692d9373f9e5bec6e1b046f8b380..bb2f9ea1904d264d3b2d2800300fc16f3cf760c8 100644 --- a/lib_com/enr_1_az.c +++ b/lib_com/enr_1_az_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -51,10 +51,8 @@ Word16 Enr_1_Az_fx_o( /* o : impulse response energy Q3 Word16 *y; Word16 i, j, a0, q; Word32 L_tmp, L_tmp2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif /* Find the impulse response */ q = sub( 3, norm_s( Aq[0] ) ); diff --git a/lib_com/env_adj.c b/lib_com/env_adj_fx.c similarity index 98% rename from lib_com/env_adj.c rename to lib_com/env_adj_fx.c index 5a83dbe5fa8af935aa151a8fdb7d87738100c789..0926ee07171bc950bcb4e0795d240ec7f57c0969 100644 --- a/lib_com/env_adj.c +++ b/lib_com/env_adj_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/env_stab.c b/lib_com/env_stab_fx.c similarity index 96% rename from lib_com/env_stab.c rename to lib_com/env_stab_fx.c index a3140b4e498beb79ffa011af6baa60bbeb0a2bad..29908b1261bc42d298c05f01cc1f629d9a468c43 100644 --- a/lib_com/env_stab.c +++ b/lib_com/env_stab_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -43,6 +43,7 @@ #include "rom_com.h" #include "wmc_auto.h" #include "stl.h" + /*--------------------------------------------------------------------------* * Local constants *--------------------------------------------------------------------------*/ @@ -73,10 +74,8 @@ Word16 env_stability_fx( /* in Q15 */ Word16 exp, exp2; Word32 L_tmp, L_env_delta; Word16 inv_nb_sfm; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif IF( core_switching_flag ) { @@ -187,10 +186,7 @@ Word16 env_stab_smo_fx( /* Q0 */ Word16 maxval, pp[NUM_ENV_STAB_PLC_STATES], pa[NUM_ENV_STAB_PLC_STATES]; Word16 i; Word16 tmp, sum, exp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + /* get previous state */ prev_state = maximum_fx( env_stab_state_p, NUM_ENV_STAB_PLC_STATES, &maxval ); @@ -226,7 +222,7 @@ Word16 env_stab_smo_fx( /* Q0 */ /*tmp = shl(tmp, add(exp, 1));*/ /* Q15 */ FOR( i = 0; i < NUM_ENV_STAB_PLC_STATES; i++ ) { - env_stab_state_p[i] = round_fx_o( L_shl_o( L_mult_o( env_stab_state_p[i], tmp, &Overflow ), add( exp, 1 ), &Overflow ), &Overflow ); /* Q15 */ + env_stab_state_p[i] = round_fx_sat( L_shl_sat( L_mult_sat( env_stab_state_p[i], tmp ), add( exp, 1 ) ) ); /* Q15 */ move16(); } diff --git a/lib_com/env_stab_trans.c b/lib_com/env_stab_trans_fx.c similarity index 94% rename from lib_com/env_stab_trans.c rename to lib_com/env_stab_trans_fx.c index 829bef5f40f99a7245b65102c1f3aad4f685aa7d..5cdc93ff74d5349d83030601ddf8ef77c2ec4d19 100644 --- a/lib_com/env_stab_trans.c +++ b/lib_com/env_stab_trans_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -48,15 +48,15 @@ *--------------------------------------------------------------------------*/ void env_stab_transient_detect_fx( - const Word16 is_transient, /* i: Transient flag */ - const Word16 length, /* i : Length of spectrum (32 or 48 kHz) */ - const Word16 norm[], /* i : quantization indices for norms */ - Word16 *no_att_hangover, /* i/o: Frame counter for attenuation hangover (Q0) */ + const Word16 is_transient, /* i: Transient flag */ + const Word16 length, /* i : Length of spectrum (32 or 48 kHz) */ + const Word16 norm[], /* i : quantization indices for norms */ + Word16 *no_att_hangover, /* i/o: Frame counter for attenuation hangover (Q0) */ Word32 *L_energy_lt, /* i/o: Long-term energy measure for transient detection (Q13) */ - const Word16 HQ_mode, /* i : HQ coding mode */ - const Word16 bin_th, /* i : HVQ cross-over frequency bin */ - const Word32 *L_coeff, /* i : Coded spectral coefficients */ - const Word16 Qcoeff /* i : Q of coded spectral coefficients */ + const Word16 HQ_mode, /* i : HQ coding mode */ + const Word16 bin_th, /* i : HVQ cross-over frequency bin */ + const Word32 *L_coeff, /* i : Coded spectral coefficients */ + const Word16 Qcoeff /* i : Q of coded spectral coefficients */ ) { Word16 i, blk, norm_ind, sqrt_exp, bin_th_1, temp, sh; diff --git a/lib_com/est_tilt_fx.c b/lib_com/est_tilt_fx.c index 4ff9c6c1129555fe39b5ea34e4200f9afe451741..4ad2a85a190be22cc7d6ecf511fe6334f9bd7341 100644 --- a/lib_com/est_tilt_fx.c +++ b/lib_com/est_tilt_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include "options.h" /* Compilation switches */ @@ -10,13 +10,13 @@ /*======================================================================*/ -/* FUNCTION : est_tilt_fx() */ +/* FUNCTION : est_tilt_fx() */ /*-----------------------------------------------------------------------*/ /* PURPOSE : Estimate spectral tilt based on the relative E of adaptive */ /* and innovative excitations */ /* */ /*-----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _ (Word16 *) exc : adaptive excitation vector Q0 */ /* _ (Word16) gain_pit : adaptive gain Q14 */ /* _ (Word16 *) code : algebraic exctitation vector Q12 */ @@ -88,13 +88,13 @@ Word16 est_tilt_fx( /* o : tilt of the code } /*======================================================================*/ -/* FUNCTION : est_tilt_ivas_fx() */ +/* FUNCTION : est_tilt_ivas_fx() */ /*-----------------------------------------------------------------------*/ /* PURPOSE : Estimate spectral tilt based on the relative E of adaptive */ /* and innovative excitations */ /* */ /*-----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _ (Word16 *) exc : adaptive excitation vector Q0 */ /* _ (Word16) gain_pit : adaptive gain Q14 */ /* _ (Word16 *) code : algebraic exctitation vector Q12 */ diff --git a/lib_com/fd_cng_com_fx.c b/lib_com/fd_cng_com_fx.c index 78809ed2c6a0dd5a4ca9ba595896388b03106c75..dfd05b70d98396864c463ac8498b42a1881dbe22 100644 --- a/lib_com/fd_cng_com_fx.c +++ b/lib_com/fd_cng_com_fx.c @@ -1,7 +1,8 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ +#include "ivas_cnst.h" #include #include #include "options.h" @@ -21,11 +22,12 @@ #define CNG_HS 4 /* 4 bit headroom for dot product */ #define CNG_S 6 /* 1 sign bit, 6 bit integer part, 9 bit frational part for input and output data */ + /*------------------------------------------------------------------- * Local function prototypes *-------------------------------------------------------------------*/ static void getmidbands( const Word16 *part, const Word16 npart, Word16 *midband, Word16 *psize, Word16 *psize_norm, Word16 *psize_norm_exp, Word16 *psize_inv ); - +static void mhvals( const Word16 d, Word16 *m ); /*------------------------------------------------------------------- * createFdCngCom() @@ -120,6 +122,8 @@ void ivas_initFdCngCom_fx( HANDLE_FD_CNG_COM hFdCngCom, Word16 scale ) move16(); hFdCngCom->CngBitrate = -1; move16(); + hFdCngCom->olapBufferSynth_exp = 0; + move16(); /* Initialize noise estimation algorithm */ set32_fx( hFdCngCom->periodog, 0, PERIODOGLEN ); @@ -158,8 +162,7 @@ void ivas_initFdCngCom_fx( HANDLE_FD_CNG_COM hFdCngCom, Word16 scale ) hFdCngCom->exp_cldfb_periodog = 0; move16(); - hFdCngCom->coherence_fx = 16384; /* 0.5 in Q15 */ - move16(); + set16_fx( hFdCngCom->coherence_fx, 16384 /* 0.5 in Q15 */, MDCT_ST_DTX_NUM_COHERENCE_BANDS ); set32_fx( hFdCngCom->olapBufferSynth_fx, 0, FFTLEN ); set32_fx( hFdCngCom->olapBufferSynth2_fx, 0, FFTLEN ); @@ -481,6 +484,54 @@ void expand_range( move16(); } +void expand_range_fx( + Word32 *in, // Q25 + Word32 *out, // exp:out_exp + Word16 *out_exp, + const Word16 len ) +{ + Word16 i, tmp_e; + Word32 maxVal, tmp32; + Word16 maxOutExp; + + const Word32 low_lim = 726940; /* 0.0003385080526823181f in Q31 */ + move32(); + + /* Find max possible output exponent. */ + maxVal = 0; + move32(); + FOR( i = 0; i < len; i++ ) + { + maxVal = L_max( maxVal, in[i] ); + } + tmp32 = BASOP_util_Pow2( maxVal, Q31 - Q25, &tmp_e ); + maxOutExp = tmp_e; + move16(); + + /* out = (2^(in) - 1) */ + FOR( i = 0; i < len; i++ ) + { + tmp32 = BASOP_util_Pow2( in[i], Q31 - Q25, &tmp_e ); // 2^x + tmp32 = L_sub( tmp32, L_shl( 1, sub( 31, tmp_e ) ) ); // 2^x - 1 + tmp32 = L_shr( tmp32, sub( maxOutExp, tmp_e ) ); // make exp same as maxExpOut + + out[i] = tmp32; + move32(); + + Word32 tmp_low_lim = L_shr( low_lim, maxOutExp ); + if ( LT_32( out[i], tmp_low_lim ) ) + { + out[i] = tmp_low_lim; + move32(); + } + } + + *out_exp = maxOutExp; + move16(); + + return; +} + /*------------------------------------------------------------------- * expand_range_var_e() * @@ -597,11 +648,6 @@ void minimum_statistics( Word16 msAlphaCorAlpha2; Word16 msPeriodogSum16; Word16 msNoiseFloor16; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - len2 = i_mult( MSNUMSUBFR, len ); @@ -700,7 +746,7 @@ void minimum_statistics( /* use absolute value to avoid -1.0 x -1.0 multiplications */ s2 = norm_l( scalar2 ); } - scalar216 = round_fx_o( L_shl_o( scalar2, s2, &Overflow ), &Overflow ); + scalar216 = round_fx_sat( L_shl( scalar2, s2 ) ); scalar2 = L_mult( scalar216, scalar216 ); /* find common exponent */ @@ -850,7 +896,7 @@ void minimum_statistics( s2 = s_min( s2, WORD32_BITS - 1 ); /* beta: scaled by s2 */ - tmp16 = round_fx_o( L_shl_o( tmp, s1, &Overflow ), &Overflow ); + tmp16 = round_fx_sat( L_shl( tmp, s1 ) ); beta = mult_r( tmp16, tmp16 ); /* scalar3: scaled by s3 */ @@ -938,7 +984,7 @@ void minimum_statistics( move32(); /* exponent msCurrentMinSubWindow[j]: CNG_S */ BASOP_SATURATE_WARNING_OFF_EVS; - msCurrentMinSubWindow[j] = L_shl_o( Mpy_32_32( scalar, msBminSubWin[j] ), 5, &Overflow ); + msCurrentMinSubWindow[j] = L_shl_sat( Mpy_32_32( scalar, msBminSubWin[j] ), 5 ); move32(); BASOP_SATURATE_WARNING_ON_EVS; } @@ -1109,12 +1155,6 @@ void minimum_statistics( move16(); } } -#ifdef IVAS_CODE_CNG_COM - if ( enc_dec == DEC && element_mode == IVAS_CPE_TD ) - { - v_multc( msNoiseEst, 1.4125f, msNoiseEst, NPART_SHAPING ); - } -#endif /* Collect buffers */ Copy( msPeriodog, msPeriodogBuf + len * ( *msPeriodogBufPtr ), len ); @@ -1149,10 +1189,10 @@ void minimum_statistics( void minimum_statistics_fx( Word16 len, /* i : Total number of partitions (CLDFB or FFT) */ Word16 lenFFT, /* i : Number of FFT partitions */ - Word16 *psize, /* i : Partition sizes, fractional */ + Word16 *psize, /* i : Partition sizes, fractional Q9*/ Word16 *msPeriodog, /* i : Periodogram (energies) */ - Word16 *msNoiseFloor, /* i/o: Noise floors (energies) */ - Word16 *msNoiseEst, /* i/o: Noise estimates (energies) */ + Word32 *msNoiseFloor, /* i/o: Noise floors (energies) Q25*/ + Word32 *msNoiseEst, /* i/o: Noise estimates (energies) Q25*/ Word32 *msAlpha, /* i/o: Forgetting factors */ Word16 *msPsd, /* i/o: Power Spectral Density (smoothed periodogram => energies) */ Word16 *msPsdFirstMoment, /* i/o: PSD statistics of 1st order (energy means) */ @@ -1202,11 +1242,6 @@ void minimum_statistics_fx( Word16 msAlphaCorAlpha2; Word16 msPeriodogSum16; Word16 msNoiseFloor16; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - len2 = i_mult( MSNUMSUBFR, len ); @@ -1226,10 +1261,10 @@ void minimum_statistics_fx( /* No minimum statistics at initialization */ IF( LT_16( hFdCngCom->msFrCnt_init_counter, hFdCngCom->msFrCnt_init_thresh ) ) { - Copy( msPeriodog, msPsd, len ); /* 6Q9 */ - Copy( msPeriodog, msNoiseFloor, len ); /* 6Q9 */ - Copy( msPeriodog, msNoiseEst, len ); /* 6Q9 */ - Copy( msPeriodog, msPsdFirstMoment, len ); /* 6Q9 */ + Copy( msPeriodog, msPsd, len ); /* 6Q9 */ + Copy_Scale_sig_16_32_no_sat( msPeriodog, msNoiseFloor, len, Q16 ); /* Q25 */ + Copy_Scale_sig_16_32_no_sat( msPeriodog, msNoiseEst, len, Q16 ); /* Q25 */ + Copy( msPeriodog, msPsdFirstMoment, len ); /* 6Q9 */ set32_fx( msPsdSecondMoment, 0l /*0.0 Q31*/, len ); msPeriodogSum[0] = dotp_s_fx( msPeriodog, psize, lenFFT, CNG_HS ); @@ -1305,7 +1340,7 @@ void minimum_statistics_fx( /* use absolute value to avoid -1.0 x -1.0 multiplications */ s2 = norm_l( scalar2 ); } - scalar216 = round_fx_o( L_shl_o( scalar2, s2, &Overflow ), &Overflow ); + scalar216 = round_fx_sat( L_shl( scalar2, s2 ) ); scalar2 = L_mult( scalar216, scalar216 ); /* find common exponent */ @@ -1339,7 +1374,16 @@ void minimum_statistics_fx( /* Compute SNR */ /* msPeriodogSum[cnt] with format 16Q15 */ - snr = dotp_s_fx( msNoiseFloor + start, psize + start, current_len, CNG_HS ); + Word16 msNoiseFloor16tmp[NPART_SHAPING]; + IF( enc_dec == ENC ) + { + Copy_Scale_sig32_16( msNoiseFloor, msNoiseFloor16tmp, NPART, 0 ); + } + ELSE + { + Copy_Scale_sig32_16( msNoiseFloor, msNoiseFloor16tmp, NPART_SHAPING, 0 ); + } + snr = dotp_s_fx( &msNoiseFloor16tmp[start], psize + start, current_len, CNG_HS ); IF( GT_32( L_shr( Mpy_32_16_1( msPsdSum[cnt], 18431 /*0.56246299817 Q15*/ ), 13 ), snr ) ) { @@ -1370,16 +1414,16 @@ void minimum_statistics_fx( /* calculate scalar2 with normalized msNoiseFloor[j], exponent -2*s1 */ s1 = WORD16_BITS - 1; move16(); - if ( msNoiseFloor[j] != 0 ) + if ( msNoiseFloor16tmp[j] != 0 ) { - s1 = norm_s( msNoiseFloor[j] ); + s1 = norm_s( msNoiseFloor16tmp[j] ); } - msNoiseFloor16 = shl( msNoiseFloor[j], s1 ); + msNoiseFloor16 = shl( msNoiseFloor16tmp[j], s1 ); scalar2 = L_mult( msNoiseFloor16, msNoiseFloor16 ); /* calculate difference, both elements in 6Q9 format, use absolute value to avoid -1.0 x -1.0 multiplications later */ - scalar316 = abs_s( sub( msPsd[j], msNoiseFloor[j] ) ); + scalar316 = abs_s( sub( msPsd[j], msNoiseFloor16tmp[j] ) ); s2 = WORD16_BITS - 1; move16(); @@ -1453,7 +1497,7 @@ void minimum_statistics_fx( s2 = s_min( s2, WORD32_BITS - 1 ); /* beta: scaled by s2 */ - tmp16 = round_fx_o( L_shl_o( tmp, s1, &Overflow ), &Overflow ); + tmp16 = round_fx_sat( L_shl( tmp, s1 ) ); beta = mult_r( tmp16, tmp16 ); /* scalar3: scaled by s3 */ @@ -1479,7 +1523,7 @@ void minimum_statistics_fx( IF( msNoiseFloor[j] != 0 /*0.0 Q15*/ ) { - tmp = L_mult( msNoiseFloor[j], msNoiseFloor[j] ); + tmp = Mpy_32_32( msNoiseFloor[j], msNoiseFloor[j] ); tmp16 = BASOP_Util_Divide3232_uu_1616_Scale( msPsdSecondMoment[j], tmp, &s ); /* consider factor of 2 */ s = s_min( s_max( sub( s, 1 ), -( WORD16_BITS - 1 ) ), ( WORD16_BITS - 1 ) ); @@ -1541,7 +1585,7 @@ void minimum_statistics_fx( move32(); /* exponent msCurrentMinSubWindow[j]: CNG_S */ BASOP_SATURATE_WARNING_OFF_EVS; - msCurrentMinSubWindow[j] = L_shl_o( Mpy_32_32( scalar, msBminSubWin[j] ), 5, &Overflow ); + msCurrentMinSubWindow[j] = L_shl_sat( Mpy_32_32( scalar, msBminSubWin[j] ), 5 ); move32(); BASOP_SATURATE_WARNING_ON_EVS; } @@ -1590,7 +1634,7 @@ void minimum_statistics_fx( } } /* Get the current noise floor */ - Copy_Scale_sig_32_16( msCurrentMinOut, msNoiseFloor, len, -16 ); + Copy32( msCurrentMinOut, msNoiseFloor, len ); } ELSE /* sub window complete */ { @@ -1648,7 +1692,7 @@ void minimum_statistics_fx( set32_fx( msCurrentMin, 2147483647l /*1.0 Q31*/, len ); /* Get the current noise floor */ - Copy_Scale_sig_32_16( msCurrentMinOut, msNoiseFloor, len, -16 ); + Copy32( msCurrentMinOut, msNoiseFloor, len ); } } @@ -1705,18 +1749,19 @@ void minimum_statistics_fx( hFdCngCom->msFrCnt = add( hFdCngCom->msFrCnt, 1 ); move16(); } - + Word64 tmp64; /* Smooth noise estimate during CNG phases */ FOR( j = 0; j < len; j++ ) { - msNoiseEst[j] = round_fx( L_mac( L_mult( 31130 /*0.95 Q15*/, msNoiseEst[j] ), 1638 /*0.05 Q15*/, msNoiseFloor[j] ) ); - move16(); + tmp64 = W_add( W_mult_32_16( msNoiseEst[j], 31130 /*0.95 Q15*/ ), W_mult_32_16( msNoiseFloor[j], 1638 /*0.05 Q15*/ ) ); + msNoiseEst[j] = W_extract_h( W_shl( tmp64, 16 ) ); // Q25 + move32(); } } IF( EQ_16( enc_dec, DEC ) && EQ_16( element_mode, IVAS_CPE_TD ) ) { // v_multc(msNoiseEst, 1.4125f, msNoiseEst, NPART_SHAPING); - v_multc_att( msNoiseEst, 23142, msNoiseEst, NPART_SHAPING ); + v_multc_att32( msNoiseEst, 23142, msNoiseEst, NPART_SHAPING ); } /* Collect buffers */ Copy( msPeriodog, msPeriodogBuf + len * ( *msPeriodogBufPtr ), len ); @@ -1738,17 +1783,15 @@ void minimum_statistics_fx( { scalar = L_mac( scalar, msPeriodogBuf[i], 6554 /*1.0/MSBUFLEN Q15*/ ); } - scalar16 = round_fx( scalar ); - if ( GT_16( msNoiseEst[j], scalar16 ) /*0.0 Q15*/ ) + if ( GT_32( msNoiseEst[j], scalar ) /*0.0 Q15*/ ) { - msNoiseEst[j] = scalar16; - move16(); + msNoiseEst[j] = scalar; + move32(); } assert( msNoiseEst[j] >= 0 /*0.0 Q15*/ ); } } - /*------------------------------------------------------------------- * apply_scale() * @@ -1763,7 +1806,6 @@ void apply_scale( ) { Word16 i; - // PMT("Verifiy if the basop ued are ok for stereo too") FOR( i = 0; i < scaleTableSize; i++ ) { cast16(); @@ -1796,7 +1838,6 @@ Word16 apply_scale_ind( ) { Word16 i; - // PMT("Verifiy if the basop ued are ok for stereo too") FOR( i = 0; i < scaleTableSize; i++ ) { cast16(); @@ -1824,7 +1865,6 @@ void apply_scale_ivas_fx( Word16 *index ) { Word16 i; - // PMT("Verifiy if the basop ued are ok for stereo too") FOR( i = 0; i < scaleTableSize; i++ ) { cast16(); @@ -2227,11 +2267,6 @@ static void getmidbands( ) { Word16 j, max_psize, shift; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - max_psize = psize[0]; move16(); @@ -2264,7 +2299,7 @@ static void getmidbands( move16(); FOR( j = 0; j < npart; j++ ) { - psize_norm[j] = shl_o( psize[j], shift, &Overflow ); // Q(15 - psize_norm_exp) + psize_norm[j] = shl_sat( psize[j], shift ); // Q(15 - psize_norm_exp) move16(); } /* minimum_statistics needs fixed exponent of 6 */ @@ -2624,18 +2659,6 @@ void SynthesisSTFT( move16(); } /* Generate excitation */ -#ifdef IVAS_CODE_CNG_COM - PME() - if ( ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) && nchan_out == 2 ) - { - for ( i = 0; i < hFdCngCom->frameSize / 2; i++ ) - { - buf[i + ( M + 1 )] += olapBuffer[i + hFdCngCom->frameSize / 4]; - } - v_multc( buf, (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize ); - } - else -#endif { FOR( i = 0; i < M + 1 + hFdCngCom->frameSize; i++ ) { @@ -2671,9 +2694,10 @@ void SynthesisSTFT_ivas_fx( const Word16 nchan_out /* i : number of output channels */ ) { - Word16 i, len, scale, tmp; + Word16 i, len, scale, tmp, sft, exp, tmp1; Word16 len2, len3, len4; Word16 buf[M + 1 + L_FRAME16k]; + Word32 L_olapBuffer[FFTLEN]; /* Perform IFFT */ @@ -2684,6 +2708,12 @@ void SynthesisSTFT_ivas_fx( hFdCngCom->fftBuffer_exp = fftBufferExp; move16(); + sft = getScaleFactor32( fftBuffer, hFdCngCom->fftlen ); + scale_sig32( fftBuffer, hFdCngCom->fftlen, sft ); + fftBufferExp = sub( fftBufferExp, sft ); + hFdCngCom->fftBuffer_exp = fftBufferExp; + move16(); + fftBufferExp = add( fftBufferExp, hFdCngCom->fftlenShift ); /* Perform overlap-add */ @@ -2697,48 +2727,58 @@ void SynthesisSTFT_ivas_fx( } ELSE { - Copy( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize ); + Copy_Scale_sig_16_32_no_sat( olapBuffer + hFdCngCom->frameSize, L_olapBuffer, hFdCngCom->frameSize, add( sub( hFdCngCom->olapBufferSynth_exp, sub( 15, hFdCngCom->fftlenShift ) ), 16 ) ); /* exp: hFdCngCom->olapBufferSynth_exp -> (15 - fftlenShift) */ set16_fx( olapBuffer + hFdCngCom->frameSize, 0, hFdCngCom->frameSize ); } len2 = shr( hFdCngCom->fftlen, 2 ); len4 = shr( hFdCngCom->fftlen, 3 ); len3 = add( len2, len4 ); len = add( hFdCngCom->frameSize, len4 ); + tmp1 = sub( fftBufferExp, 15 ); IF( tcx_transition ) { FOR( i = 0; i < len; i++ ) { - olapBuffer[i] = round_fx_sat( L_shl_sat( fftBuffer[i], fftBufferExp - 15 ) ); // Q(15 - fftBufferExp) - move16(); + L_olapBuffer[i] = L_shl_sat( fftBuffer[i], tmp1 ); /* Q(31 - (15 - fftlenShift) ) */ + move32(); } } ELSE { FOR( i = 0; i < len4; i++ ) { - olapBuffer[i + 1 * len4] = add_sat( olapBuffer[i + 1 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 1 * len4], fftBufferExp - 15 ) ), olapWin[i].v.im ) ); - move16(); - olapBuffer[i + 2 * len4] = add_sat( olapBuffer[i + 2 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 2 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.re ) ); - move16(); + L_olapBuffer[i + 1 * len4] = Madd_32_16( L_olapBuffer[i + 1 * len4], L_shl_sat( fftBuffer[i + 1 * len4], tmp1 ), olapWin[i].v.im ); /* Q(31 - (15 - fftlenShift) ) */ + move32(); + L_olapBuffer[i + 2 * len4] = Madd_32_16( L_olapBuffer[i + 2 * len4], L_shl_sat( fftBuffer[i + 2 * len4], tmp1 ), olapWin[len4 - 1 - i].v.re ); /* Q(31 - (15 - fftlenShift) ) */ + move32(); } FOR( i = len3; i < len; i++ ) { - olapBuffer[i] = round_fx_sat( L_shl_sat( fftBuffer[i], fftBufferExp - 15 ) ); + L_olapBuffer[i] = L_shl_sat( fftBuffer[i], tmp1 ); /* Q(31 - (15 - fftlenShift) ) */ + move32(); } } FOR( i = 0; i < len4; i++ ) { - olapBuffer[i + 5 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 5 * len4], fftBufferExp - 15 ) ), olapWin[i].v.re ); - move16(); - olapBuffer[i + 6 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 6 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.im ); - move16(); + L_olapBuffer[i + 5 * len4] = Mpy_32_16_1( L_shl_sat( fftBuffer[i + 5 * len4], tmp1 ), olapWin[i].v.re ); /* Q(31 - (15 - fftlenShift) ) */ + move32(); + L_olapBuffer[i + 6 * len4] = Mpy_32_16_1( L_shl_sat( fftBuffer[i + 6 * len4], tmp1 ), olapWin[len4 - 1 - i].v.im ); /* Q(31 - (15 - fftlenShift) ) */ + move32(); } len = add( len, len2 ); FOR( i = len; i < hFdCngCom->fftlen; i++ ) { - olapBuffer[i] = 0; + L_olapBuffer[i] = 0; + move32(); + } + + sft = L_norm_arr( L_olapBuffer, hFdCngCom->fftlen ); + IF( NE_16( sft, 31 ) ) + { + Copy_Scale_sig32_16( L_olapBuffer, olapBuffer, hFdCngCom->fftlen, sft ); + hFdCngCom->olapBufferSynth_exp = sub( sub( 15, hFdCngCom->fftlenShift ), sft ); move16(); } @@ -2749,117 +2789,37 @@ void SynthesisSTFT_ivas_fx( move16(); } /* Generate excitation */ -#ifdef IVAS_CODE_CNG_COM - PME() - if ( ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) && nchan_out == 2 ) - { - for ( i = 0; i < hFdCngCom->frameSize / 2; i++ ) - { - buf[i + ( M + 1 )] += olapBuffer[i + hFdCngCom->frameSize / 4]; - } - v_multc( buf, (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize ); - } - else -#endif { FOR( i = 0; i < M + 1 + hFdCngCom->frameSize; i++ ) { buf[i] = mult_r( olapBuffer[i + len4 - M - 1], hFdCngCom->fftlenFac ); move16(); } + exp = add( hFdCngCom->olapBufferSynth_exp, hFdCngCom->fftlenShift ); tmp = buf[0]; } IF( EQ_16( gen_exc, 1 ) ) { - Word16 s = getScaleFactor16( buf + 1, M + hFdCngCom->frameSize ); - if ( GT_16( *Q_new, s ) ) - { - *Q_new = s; - move16(); - } - - E_UTIL_f_preemph2( *Q_new - 1, buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp ); - Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 ); + E_UTIL_f_preemph2( 0, buf + 1, PREEMPH_FAC, add( M, hFdCngCom->frameSize ), &tmp ); + Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 0 ); + *Q_new = sub( 15, exp ); + move16(); } IF( EQ_16( gen_exc, 2 ) ) { - *Q_new = E_UTIL_f_preemph3( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp, 1 ); - Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 ); - } -} - -#ifdef IVAS_CODE_CNG_COM -/*------------------------------------------------------------------- - * SynthesisSTFT_dirac() - * - * STFT synthesis filterbank - *-------------------------------------------------------------------*/ - -void SynthesisSTFT_dirac( - float *fftBuffer, /* i : FFT bins */ - float *timeDomainOutput, - float *olapBuffer, - const float *olapWin, - const int16_t samples_out, - HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ -) -{ - int16_t i; - float buf[M + 1 + 320], tmp; - - /* Perform IFFT */ - RFFTN( fftBuffer, hFdCngCom->fftSineTab, hFdCngCom->fftlen, 1 ); - - /* Handle overlap in P/S domain for stereo */ - mvr2r( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize ); - set_f( olapBuffer + hFdCngCom->frameSize, 0.0f, hFdCngCom->frameSize ); /*olapBuffer, fftBuffer, olapWin*/ - - for ( i = hFdCngCom->frameSize / 4; i < 3 * hFdCngCom->frameSize / 4; i++ ) - { - olapBuffer[i] += fftBuffer[i] * olapWin[i - hFdCngCom->frameSize / 4]; - } - for ( ; i < 5 * hFdCngCom->frameSize / 4; i++ ) - { - olapBuffer[i] = fftBuffer[i]; - } - - for ( ; i < 7 * hFdCngCom->frameSize / 4; i++ ) - { - olapBuffer[i] = fftBuffer[i]; - } - - for ( ; i < hFdCngCom->fftlen; i++ ) - { - olapBuffer[i] = 0; - } - - /* Get time-domain signal */ - v_multc( olapBuffer + hFdCngCom->frameSize / 4, (float) ( hFdCngCom->fftlen / 2 ), timeDomainOutput, samples_out ); - - /* Get excitation */ - v_multc( olapBuffer + hFdCngCom->frameSize / 4 - ( M + 1 ), (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize ); - tmp = buf[0]; - preemph( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp ); - residu( hFdCngCom->A_cng, M, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize ); - - /* update and window olapBuf if we have a output frame that is shorter than the default frame size...*/ - if ( samples_out < hFdCngCom->frameSize ) - { - mvr2r( olapBuffer + samples_out, olapBuffer + hFdCngCom->frameSize, 3 * hFdCngCom->frameSize / 4 ); - } - for ( i = 5 * hFdCngCom->frameSize / 4; i < 7 * hFdCngCom->frameSize / 4; i++ ) - { - olapBuffer[i] *= olapWin[i - 3 * hFdCngCom->frameSize / 4]; + *Q_new = E_UTIL_f_preemph3( buf + 1, PREEMPH_FAC, add( M, hFdCngCom->frameSize ), &tmp, 0 ); + move16(); + Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, negate( *Q_new ) ); + *Q_new = sub( 15, exp ); + move16(); } - - return; } -#endif /************************************************************************************** * Compute some values used in the bias correction of the minimum statistics algorithm * **************************************************************************************/ -void mhvals( + +static void mhvals( const Word16 d, Word16 *m /*, Word16 * h*/ ) @@ -3170,7 +3130,6 @@ void msvq_decoder( { Word16 s, i, offset; - // PMT("msvq_decoder Not verified") offset = i_mult( Idx[0], maxN ); FOR( i = 0; i < N; i++ ) @@ -3344,8 +3303,8 @@ void SynthesisSTFT_fx( } /* Get time-domain signal */ // v_multc(olapBuffer + hFdCngCom->frameSize / 4, (float)(hFdCngCom->fftlen / 2), timeDomainOutput, hFdCngCom->frameSize); - v_multc_fixed( olapBuffer + hFdCngCom->frameSize / 4, fftScale, timeDomainOutput, hFdCngCom->frameSize ); // Q_in - 9 - /* Get excitation */ + v_multc_fx( olapBuffer + hFdCngCom->frameSize / 4, fftScale, timeDomainOutput, hFdCngCom->frameSize ); // Q_in - 9 + /* Get excitation */ test(); test(); IF( ( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) ) && EQ_16( nchan_out, 2 ) ) @@ -3356,12 +3315,12 @@ void SynthesisSTFT_fx( move32(); } // v_multc(buf, (float)(hFdCngCom->fftlen / 2), buf, M + 1 + hFdCngCom->frameSize); - v_multc_fixed( buf_fx, fftScale, buf_fx, add( M + 1, hFdCngCom->frameSize ) ); + v_multc_fx( buf_fx, fftScale, buf_fx, add( M + 1, hFdCngCom->frameSize ) ); } ELSE { // v_multc(olapBuffer + hFdCngCom->frameSize / 4 - (M + 1), (float)(hFdCngCom->fftlen / 2), buf, M + 1 + hFdCngCom->frameSize); - v_multc_fixed( olapBuffer + sub( shr( hFdCngCom->frameSize, 2 ), ( M + 1 ) ), fftScale, buf_fx, add( M + 1, hFdCngCom->frameSize ) ); + v_multc_fx( olapBuffer + sub( shr( hFdCngCom->frameSize, 2 ), ( M + 1 ) ), fftScale, buf_fx, add( M + 1, hFdCngCom->frameSize ) ); } tmp_fx = buf_fx[0]; @@ -3436,10 +3395,10 @@ void SynthesisSTFT_dirac_fx( } /* Get time-domain signal */ - v_multc_fixed( olapBuffer + shr( hFdCngCom->frameSize, 2 ), fftScale, timeDomainOutput, samples_out ); // Q_in - 9 + v_multc_fx( olapBuffer + shr( hFdCngCom->frameSize, 2 ), fftScale, timeDomainOutput, samples_out ); // Q_in - 9 /* Get excitation */ - v_multc_fixed( olapBuffer + sub( shr( hFdCngCom->frameSize, 2 ), ( M + 1 ) ), fftScale, buf, add( M + 1, hFdCngCom->frameSize ) ); + v_multc_fx( olapBuffer + sub( shr( hFdCngCom->frameSize, 2 ), ( M + 1 ) ), fftScale, buf, add( M + 1, hFdCngCom->frameSize ) ); tmp = buf[0]; move32(); preemph_ivas_fx( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp ); diff --git a/lib_com/fft.c b/lib_com/fft.c deleted file mode 100644 index e262f3909f179ea67b91c160866b1f62cd2b411a..0000000000000000000000000000000000000000 --- a/lib_com/fft.c +++ /dev/null @@ -1,366 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include -#include "options.h" -#include -#include "cnst.h" -#include "prot_fx.h" -#include "rom_com.h" -#include "wmc_auto.h" - -#ifdef _MSC_VER -#pragma warning( disable : 4310 ) -#endif - -/*-----------------------------------------------------------------* - * Low-complexity implementation of FFT - *-----------------------------------------------------------------*/ - -#define WMC_TOOL_SKIP - -#define SHC( x ) ( (Word16) x ) -#define FFTC( x ) WORD322WORD16( (Word32) x ) - -#define C81_FX ( FFTC( 0x5a82799a ) ) /* FL2WORD32( 7.071067811865475e-1) */ -#define C82_FX ( FFTC( 0xa57d8666 ) ) /* FL2WORD32(-7.071067811865475e-1) */ - -#define cplxMpy4_8_0( re, im, a, b, c, d ) \ - re = L_shr( L_sub( Mpy_32_16_1( a, c ), Mpy_32_16_1( b, d ) ), 1 ); \ - im = L_shr( L_add( Mpy_32_16_1( a, d ), Mpy_32_16_1( b, c ) ), 1 ); - -#define cplxMpy4_8_1( re, im, a, b ) \ - re = L_shr( a, 1 ); \ - im = L_shr( b, 1 ); - - -/** - * \brief Twiddle factors are unscaled - */ -/*-----------------------------------------------------------------* - * BASOP_fft8() - * - * Function performs a complex 8-point FFT - * The FFT is performed inplace. The result of the FFT - * is scaled by SCALEFACTOR8 bits. - * - * WOPS with 32x16 bit multiplications: 108 cycles - *-----------------------------------------------------------------*/ - -static void BASOP_fft8( - Word32 *re, - Word32 *im, - Word16 s ) -{ - Word32 x00, x01, x02, x03, x04, x05, x06, x07; - Word32 x08, x09, x10, x11, x12, x13, x14, x15; - Word32 t00, t01, t02, t03, t04, t05, t06, t07; - Word32 t08, t09, t10, t11, t12, t13, t14, t15; - Word32 s00, s01, s02, s03, s04, s05, s06, s07; - Word32 s08, s09, s10, s11, s12, s13, s14, s15; - - - /* Pre-additions */ - - x00 = L_shr( re[s * 0], SCALEFACTOR8 ); - x01 = L_shr( im[s * 0], SCALEFACTOR8 ); - x02 = L_shr( re[s * 1], SCALEFACTOR8 ); - x03 = L_shr( im[s * 1], SCALEFACTOR8 ); - x04 = L_shr( re[s * 2], SCALEFACTOR8 ); - x05 = L_shr( im[s * 2], SCALEFACTOR8 ); - x06 = L_shr( re[s * 3], SCALEFACTOR8 ); - x07 = L_shr( im[s * 3], SCALEFACTOR8 ); - x08 = L_shr( re[s * 4], SCALEFACTOR8 ); - x09 = L_shr( im[s * 4], SCALEFACTOR8 ); - x10 = L_shr( re[s * 5], SCALEFACTOR8 ); - x11 = L_shr( im[s * 5], SCALEFACTOR8 ); - x12 = L_shr( re[s * 6], SCALEFACTOR8 ); - x13 = L_shr( im[s * 6], SCALEFACTOR8 ); - x14 = L_shr( re[s * 7], SCALEFACTOR8 ); - x15 = L_shr( im[s * 7], SCALEFACTOR8 ); - - t00 = L_add( x00, x08 ); - t02 = L_sub( x00, x08 ); - t01 = L_add( x01, x09 ); - t03 = L_sub( x01, x09 ); - t04 = L_add( x02, x10 ); - t06 = L_sub( x02, x10 ); - t05 = L_add( x03, x11 ); - t07 = L_sub( x03, x11 ); - t08 = L_add( x04, x12 ); - t10 = L_sub( x04, x12 ); - t09 = L_add( x05, x13 ); - t11 = L_sub( x05, x13 ); - t12 = L_add( x06, x14 ); - t14 = L_sub( x06, x14 ); - t13 = L_add( x07, x15 ); - t15 = L_sub( x07, x15 ); - - /* Pre-additions and core multiplications */ - - s00 = L_add( t00, t08 ); - s04 = L_sub( t00, t08 ); - s01 = L_add( t01, t09 ); - s05 = L_sub( t01, t09 ); - s08 = L_sub( t02, t11 ); - s10 = L_add( t02, t11 ); - s09 = L_add( t03, t10 ); - s11 = L_sub( t03, t10 ); - s02 = L_add( t04, t12 ); - s07 = L_sub( t04, t12 ); - s03 = L_add( t05, t13 ); - s06 = L_sub( t13, t05 ); - - t01 = L_add( t06, t14 ); - t02 = L_sub( t06, t14 ); - t00 = L_add( t07, t15 ); - t03 = L_sub( t07, t15 ); - - s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX ); - s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX ); - s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX ); - s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX ); - - /* Post-additions */ - - re[s * 0] = L_add( s00, s02 ); - move32(); - re[s * 4] = L_sub( s00, s02 ); - move32(); - im[s * 0] = L_add( s01, s03 ); - move32(); - im[s * 4] = L_sub( s01, s03 ); - move32(); - re[s * 2] = L_sub( s04, s06 ); - move32(); - re[s * 6] = L_add( s04, s06 ); - move32(); - im[s * 2] = L_sub( s05, s07 ); - move32(); - im[s * 6] = L_add( s05, s07 ); - move32(); - re[i_mult( s, 3 )] = L_add( s08, s14 ); - move32(); - re[i_mult( s, 7 )] = L_sub( s08, s14 ); - move32(); - im[i_mult( s, 3 )] = L_add( s09, s15 ); - move32(); - im[i_mult( s, 7 )] = L_sub( s09, s15 ); - move32(); - re[s * 1] = L_add( s10, s12 ); - move32(); - re[i_mult( s, 5 )] = L_sub( s10, s12 ); - move32(); - im[s * 1] = L_add( s11, s13 ); - move32(); - im[i_mult( s, 5 )] = L_sub( s11, s13 ); - move32(); - - return; -} - - -/*-----------------------------------------------------------------* - * fftN2() - * - * Combined FFT - *-----------------------------------------------------------------*/ - -static void BASOP_fftN2( - Word32 *re, /* i/o: real part */ - Word32 *im, /* i/o: imag part */ - const Word16 *W, /* i : rotation factor */ - Word16 dim1, /* i : length of fft1 */ - Word16 dim2, /* i : length of fft2 */ - Word16 sx, /* i : stride real and imag part */ - Word16 sc, /* i : stride phase rotation coefficients */ - Word32 *x, /* tmp: 32-bit workbuffer */ - Word16 Woff /* i : offset for addressing the rotation vector table */ -) -{ - Word16 i, j; - Word32 x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15; - Word32 t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15; - Word32 s00, s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15; - - FOR( i = 0; i < dim2; i++ ) - { - FOR( j = 0; j < dim1; j++ ) - { - x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2]; - move32(); - x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2]; - move32(); - } - } - - /* dim1 == 8 */ - FOR( i = 0; i < dim2; i++ ) - { - BASOP_fft8( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 ); - } - - /* dim2 == 8 */ - FOR( i = 0; i < dim1; i++ ) - { - cplxMpy4_8_1( x00, x01, x[2 * i + 2 * 0 * dim1], x[2 * i + 2 * 0 * dim1 + 1] ); - - IF( i == 0 ) - { - cplxMpy4_8_1( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )] ); - cplxMpy4_8_1( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )] ); - cplxMpy4_8_1( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )] ); - cplxMpy4_8_1( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )] ); - cplxMpy4_8_1( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )] ); - cplxMpy4_8_1( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )] ); - cplxMpy4_8_1( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )] ); - } - ELSE - { - cplxMpy4_8_0( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), 1 ), Woff )] ); - cplxMpy4_8_0( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), 1 ), Woff )] ); - cplxMpy4_8_0( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), 1 ), Woff )] ); - cplxMpy4_8_0( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), 1 ), Woff )] ); - cplxMpy4_8_0( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), 1 ), Woff )] ); - cplxMpy4_8_0( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), 1 ), Woff )] ); - cplxMpy4_8_0( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), 1 ), Woff )] ); - } - t00 = L_shr( L_add( x00, x08 ), SCALEFACTORN2 - 1 ); - t02 = L_shr( L_sub( x00, x08 ), SCALEFACTORN2 - 1 ); - t01 = L_shr( L_add( x01, x09 ), SCALEFACTORN2 - 1 ); - t03 = L_shr( L_sub( x01, x09 ), SCALEFACTORN2 - 1 ); - t04 = L_shr( L_add( x02, x10 ), SCALEFACTORN2 - 1 ); - t06 = L_sub( x02, x10 ); - t05 = L_shr( L_add( x03, x11 ), SCALEFACTORN2 - 1 ); - t07 = L_sub( x03, x11 ); - t08 = L_shr( L_add( x04, x12 ), SCALEFACTORN2 - 1 ); - t10 = L_shr( L_sub( x04, x12 ), SCALEFACTORN2 - 1 ); - t09 = L_shr( L_add( x05, x13 ), SCALEFACTORN2 - 1 ); - t11 = L_shr( L_sub( x05, x13 ), SCALEFACTORN2 - 1 ); - t12 = L_shr( L_add( x06, x14 ), SCALEFACTORN2 - 1 ); - t14 = L_sub( x06, x14 ); - t13 = L_shr( L_add( x07, x15 ), SCALEFACTORN2 - 1 ); - t15 = L_sub( x07, x15 ); - - s00 = L_add( t00, t08 ); - s04 = L_sub( t00, t08 ); - s01 = L_add( t01, t09 ); - s05 = L_sub( t01, t09 ); - s08 = L_sub( t02, t11 ); - s10 = L_add( t02, t11 ); - s09 = L_add( t03, t10 ); - s11 = L_sub( t03, t10 ); - s02 = L_add( t04, t12 ); - s07 = L_sub( t04, t12 ); - s03 = L_add( t05, t13 ); - s06 = L_sub( t13, t05 ); - - t01 = L_shr( L_add( t06, t14 ), SCALEFACTORN2 - 1 ); - t02 = L_shr( L_sub( t06, t14 ), SCALEFACTORN2 - 1 ); - t00 = L_shr( L_add( t07, t15 ), SCALEFACTORN2 - 1 ); - t03 = L_shr( L_sub( t07, t15 ), SCALEFACTORN2 - 1 ); - - s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX ); - s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX ); - s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX ); - s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX ); - - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s00, s02 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s01, s03 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s10, s12 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s11, s13 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s04, s06 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s05, s07 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s08, s14 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s09, s15 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s00, s02 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s01, s03 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s10, s12 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s11, s13 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s04, s06 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s05, s07 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s08, s14 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s09, s15 ); - move32(); - } - - return; -} - - -/*-----------------------------------------------------------------* - * BASOP_cfft_ivas() - * - * Complex valued FFT - *-----------------------------------------------------------------*/ - -void BASOP_cfft_ivas( - Word32 *re, /* i/o: real part */ - Word32 *im, /* i/o: imag part */ - Word16 s, /* i : stride real and imag part */ - Word16 *scale /* i : scalefactor */ -) -{ - Word32 x[2 * 64]; - - /* FFT for len = FDNS_NPTS */ - BASOP_fftN2( re, im, RotVector_256, 8, 8, s, 8, x, 64 ); - s = add( *scale, SCALEFACTOR64 ); - - *scale = s; - move16(); - - return; -} - - -#undef WMC_TOOL_SKIP diff --git a/lib_com/fft_cldfb_fx.c b/lib_com/fft_cldfb_fx.c index b26b1bc9f43782686e744fef2c90db2d70157cc9..230dd7ac59f6cff002e6b472a4aab281f04083f8 100644 --- a/lib_com/fft_cldfb_fx.c +++ b/lib_com/fft_cldfb_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/fft_evs.c b/lib_com/fft_evs.c index 94c2dea8ff0a7df4fc62fb898eb379e5d2d31a79..5748be95dde18d7656aafc140702a63073b74582 100644 --- a/lib_com/fft_evs.c +++ b/lib_com/fft_evs.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/fft_fx.c b/lib_com/fft_fx.c index 7b63e9c679ce1219a018d92196ed50bc04861795..461e1c7b62b2d1d9a5dde466bab12a301a6b86ab 100644 --- a/lib_com/fft_fx.c +++ b/lib_com/fft_fx.c @@ -30,13 +30,8 @@ *******************************************************************************************************/ - -/*==================================================================================== - 3GPP TS26.258 Aug 24, 2023. IVAS Codec Version IVAS-FL-1.0 - ====================================================================================*/ - /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -44,11 +39,8 @@ #include "options.h" #include #include "cnst.h" -// #include "prot_fx.h" #include "prot_fx.h" -//#include "cnst_fx.h" #include "rom_com.h" -#include "rom_com_fx.h" #include "wmc_auto.h" #include "complex_basop.h" @@ -4727,7 +4719,6 @@ static void fft_len16( cmplx t[4]; cmplx y[16]; -#ifdef OPT_STEREO_32KBPS_V1 s[0] = x[0]; // Qx move64(); s[1] = x[4]; // Qx @@ -4736,16 +4727,6 @@ static void fft_len16( move64(); s[3] = x[12]; // Qx move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - s[0] = CL_shr( x[0], SCALEFACTOR16 ); // Qx - move64(); - s[1] = CL_shr( x[4], SCALEFACTOR16 ); // Qx - move64(); - s[2] = CL_shr( x[8], SCALEFACTOR16 ); // Qx - move64(); - s[3] = CL_shr( x[12], SCALEFACTOR16 ); // Qx - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ t[0] = CL_add( s[0], s[2] ); move64(); @@ -4765,7 +4746,6 @@ static void fft_len16( y[3] = CL_add( t[1], t[3] ); move64(); -#ifdef OPT_STEREO_32KBPS_V1 s[0] = x[1]; // Qx move64(); s[1] = x[5]; // Qx @@ -4774,16 +4754,6 @@ static void fft_len16( move64(); s[3] = x[13]; // Qx move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - s[0] = CL_shr( x[1], SCALEFACTOR16 ); // Qx - move64(); - s[1] = CL_shr( x[5], SCALEFACTOR16 ); // Qx - move64(); - s[2] = CL_shr( x[9], SCALEFACTOR16 ); // Qx - move64(); - s[3] = CL_shr( x[13], SCALEFACTOR16 ); // Qx - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ t[0] = CL_add( s[0], s[2] ); move64(); @@ -4803,7 +4773,6 @@ static void fft_len16( y[7] = CL_add( t[1], t[3] ); move64(); -#ifdef OPT_STEREO_32KBPS_V1 s[0] = x[2]; // Qx move64(); s[1] = x[6]; // Qx @@ -4812,16 +4781,6 @@ static void fft_len16( move64(); s[3] = x[14]; // Qx move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - s[0] = CL_shr( x[2], SCALEFACTOR16 ); // Qx - move64(); - s[1] = CL_shr( x[6], SCALEFACTOR16 ); // Qx - move64(); - s[2] = CL_shr( x[10], SCALEFACTOR16 ); // Qx - move64(); - s[3] = CL_shr( x[14], SCALEFACTOR16 ); // Qx - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ t[0] = CL_add( s[0], s[2] ); move64(); @@ -4843,7 +4802,6 @@ static void fft_len16( y[11] = CL_add( t[1], t[3] ); move64(); -#ifdef OPT_STEREO_32KBPS_V1 s[0] = x[3]; // Qx move64(); s[1] = x[7]; // Qx @@ -4852,16 +4810,6 @@ static void fft_len16( move64(); s[3] = x[15]; // Qx move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - s[0] = CL_shr( x[3], SCALEFACTOR16 ); // Qx - move64(); - s[1] = CL_shr( x[7], SCALEFACTOR16 ); // Qx - move64(); - s[2] = CL_shr( x[11], SCALEFACTOR16 ); // Qx - move64(); - s[3] = CL_shr( x[15], SCALEFACTOR16 ); // Qx - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ t[0] = CL_add( s[0], s[2] ); move64(); @@ -5022,7 +4970,6 @@ static void fft_len20_fx( cmplx tt[4]; cmplx y[20]; -#ifdef OPT_STEREO_32KBPS_V1 xx[0] = x[0]; // Qx move64(); xx[1] = x[16]; // Qx @@ -5033,18 +4980,6 @@ static void fft_len20_fx( move64(); xx[4] = x[4]; // Qx move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - xx[0] = CL_shr( x[0], SCALEFACTOR20 ); // Qx - move64(); - xx[1] = CL_shr( x[16], SCALEFACTOR20 ); // Qx - move64(); - xx[2] = CL_shr( x[12], SCALEFACTOR20 ); // Qx - move64(); - xx[3] = CL_shr( x[8], SCALEFACTOR20 ); // Qx - move64(); - xx[4] = CL_shr( x[4], SCALEFACTOR20 ); // Qx - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ s[0] = CL_add( xx[1], xx[4] ); move64(); @@ -5080,7 +5015,6 @@ static void fft_len20_fx( y[12] = CL_msu_j( s[2], s[3] ); move64(); -#ifdef OPT_STEREO_32KBPS_V1 xx[0] = x[5]; move64(); xx[1] = x[1]; @@ -5091,18 +5025,6 @@ static void fft_len20_fx( move64(); xx[4] = x[9]; move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - xx[0] = CL_shr( x[5], SCALEFACTOR20 ); - move64(); - xx[1] = CL_shr( x[1], SCALEFACTOR20 ); - move64(); - xx[2] = CL_shr( x[17], SCALEFACTOR20 ); - move64(); - xx[3] = CL_shr( x[13], SCALEFACTOR20 ); - move64(); - xx[4] = CL_shr( x[9], SCALEFACTOR20 ); - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ s[0] = CL_add( xx[1], xx[4] ); move64(); @@ -5138,7 +5060,6 @@ static void fft_len20_fx( y[13] = CL_msu_j( s[2], s[3] ); move64(); -#ifdef OPT_STEREO_32KBPS_V1 xx[0] = x[10]; move64(); xx[1] = x[6]; @@ -5149,18 +5070,6 @@ static void fft_len20_fx( move64(); xx[4] = x[14]; move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - xx[0] = CL_shr( x[10], SCALEFACTOR20 ); - move64(); - xx[1] = CL_shr( x[6], SCALEFACTOR20 ); - move64(); - xx[2] = CL_shr( x[2], SCALEFACTOR20 ); - move64(); - xx[3] = CL_shr( x[18], SCALEFACTOR20 ); - move64(); - xx[4] = CL_shr( x[14], SCALEFACTOR20 ); - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ s[0] = CL_add( xx[1], xx[4] ); move64(); @@ -5196,7 +5105,6 @@ static void fft_len20_fx( y[14] = CL_msu_j( s[2], s[3] ); move64(); -#ifdef OPT_STEREO_32KBPS_V1 xx[0] = x[15]; move64(); xx[1] = x[11]; @@ -5207,18 +5115,6 @@ static void fft_len20_fx( move64(); xx[4] = x[19]; move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - xx[0] = CL_shr( x[15], SCALEFACTOR20 ); - move64(); - xx[1] = CL_shr( x[11], SCALEFACTOR20 ); - move64(); - xx[2] = CL_shr( x[7], SCALEFACTOR20 ); - move64(); - xx[3] = CL_shr( x[3], SCALEFACTOR20 ); - move64(); - xx[4] = CL_shr( x[19], SCALEFACTOR20 ); - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ s[0] = CL_add( xx[1], xx[4] ); move64(); @@ -6597,7 +6493,6 @@ static void fft_lenN( cmplx s[8]; cmplx y[8]; -#ifdef OPT_STEREO_32KBPS_V1 y[1] = xx[1 * dim1]; move64(); y[2] = xx[2 * dim1]; @@ -6829,288 +6724,6 @@ static void fft_lenN( move64(); } } -#else /* OPT_STEREO_32KBPS_V1 */ - test(); - test(); - test(); - test(); - IF( EQ_16( dim1, 30 ) || EQ_16( dim1, 20 ) || EQ_16( dim1, 15 ) || EQ_16( dim1, 10 ) || EQ_16( dim1, 5 ) ) - { - FOR( i = 0; i < dim1; i++ ) - { - { - y[0] = xx[i]; // y[0] = xx[i + 0 * dim1] - move64(); - }; - IF( i == 0 ) - { - { - y[1] = xx[( i + ( 1 * dim1 ) )]; - move64(); - }; - { - y[2] = xx[( i + ( 2 * dim1 ) )]; - move64(); - }; - { - y[3] = xx[( i + ( 3 * dim1 ) )]; - move64(); - }; - { - y[4] = xx[( i + ( 4 * dim1 ) )]; - move64(); - }; - { - y[5] = xx[( i + ( 5 * dim1 ) )]; - move64(); - }; - { - y[6] = xx[( i + ( 6 * dim1 ) )]; - move64(); - }; - { - y[7] = xx[( i + ( 7 * dim1 ) )]; - move64(); - }; - } - ELSE - { - { - y[1] = CL_mac_j( CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 1 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 1 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[2] = CL_mac_j( CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 2 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 2 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[3] = CL_mac_j( CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 3 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 3 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[4] = CL_mac_j( CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 4 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 4 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[5] = CL_mac_j( CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 5 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 5 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[6] = CL_mac_j( CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 6 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 6 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[7] = CL_mac_j( CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 7 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 7 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - } - - t[0] = CL_add( y[0], y[4] ); - move64(); - t[1] = CL_sub( y[0], y[4] ); - move64(); - t[2] = CL_add( y[1], y[5] ); - move64(); - t[3] = CL_sub( y[1], y[5] ); - move64(); - t[4] = CL_add( y[2], y[6] ); - move64(); - t[5] = CL_sub( y[2], y[6] ); - move64(); - t[6] = CL_add( y[3], y[7] ); - move64(); - t[7] = CL_sub( y[3], y[7] ); - move64(); - - s[0] = CL_add( t[0], t[4] ); - move64(); - s[2] = CL_sub( t[0], t[4] ); - move64(); - s[4] = CL_mac_j( t[1], t[5] ); - move64(); - s[5] = CL_msu_j( t[1], t[5] ); - move64(); - s[1] = CL_add( t[2], t[6] ); - move64(); - s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) ); - move64(); - - t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) ); - move64(); - t[1] = CL_sub( t[3], t[7] ); - move64(); - - s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx - move64(); - s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx - move64(); - s[7] = CL_conjugate( s[7] ); - move64(); - - x[i] = CL_add( s[0], s[1] ); /*x[add(i + i_mult(0 , dim1)] = CL_add( s[0], s[1] )*/ - move64(); - x[( i + ( 1 * dim1 ) )] = CL_add( s[5], s[6] ); - move64(); - x[( i + ( 2 * dim1 ) )] = CL_sub( s[2], s[3] ); - move64(); - x[( i + ( 3 * dim1 ) )] = CL_add( s[4], s[7] ); - move64(); - x[( i + ( 4 * dim1 ) )] = CL_sub( s[0], s[1] ); - move64(); - x[( i + ( 5 * dim1 ) )] = CL_sub( s[5], s[6] ); - move64(); - x[( i + ( 6 * dim1 ) )] = CL_add( s[2], s[3] ); - move64(); - x[( i + ( 7 * dim1 ) )] = CL_sub( s[4], s[7] ); - move64(); - } - } - ELSE - { - FOR( i = 0; i < dim1; i++ ) - { - { - y[0] = xx[i]; /* y[0] = xx[i + 0 * dim1] */ - move64(); - }; - IF( i == 0 ) - { - { - y[1] = xx[( i + ( 1 * dim1 ) )]; - move64(); - }; - { - y[2] = xx[( i + ( 2 * dim1 ) )]; - move64(); - }; - { - y[3] = xx[( i + ( 3 * dim1 ) )]; - move64(); - }; - { - y[4] = xx[( i + ( 4 * dim1 ) )]; - move64(); - }; - { - y[5] = xx[( i + ( 5 * dim1 ) )]; - move64(); - }; - { - y[6] = xx[( i + ( 6 * dim1 ) )]; - move64(); - }; - { - y[7] = xx[( i + ( 7 * dim1 ) )]; - move64(); - }; - } - ELSE - { - { - y[1] = CL_mac_j( CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 1 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 1 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[2] = CL_mac_j( CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 2 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 2 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[3] = CL_mac_j( CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 3 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 3 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[4] = CL_mac_j( CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 4 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 4 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[5] = CL_mac_j( CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 5 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 5 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[6] = CL_mac_j( CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 6 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 6 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[7] = CL_mac_j( CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 7 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 7 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - } - - t[0] = CL_add( y[0], y[4] ); - move64(); - t[1] = CL_sub( y[0], y[4] ); - move64(); - t[2] = CL_add( y[1], y[5] ); - move64(); - t[3] = CL_sub( y[1], y[5] ); - move64(); - t[4] = CL_add( y[2], y[6] ); - move64(); - t[5] = CL_sub( y[2], y[6] ); - move64(); - t[6] = CL_add( y[3], y[7] ); - move64(); - t[7] = CL_sub( y[3], y[7] ); - move64(); - - s[0] = CL_add( t[0], t[4] ); - move64(); - s[2] = CL_sub( t[0], t[4] ); - move64(); - s[4] = CL_mac_j( t[1], t[5] ); - move64(); - s[5] = CL_msu_j( t[1], t[5] ); - move64(); - s[1] = CL_add( t[2], t[6] ); - move64(); - s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) ); - move64(); - - t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) ); - move64(); - t[1] = CL_sub( t[3], t[7] ); - move64(); - - s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx - move64(); - s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx - move64(); - s[7] = CL_conjugate( s[7] ); - move64(); - - x[i] = CL_add( s[0], s[1] ); /*x[i + 0 * dim1] = CL_add( s[0], s[1] )*/ - move64(); - x[( i + ( 1 * dim1 ) )] = CL_add( s[5], s[6] ); - move64(); - x[( i + ( 2 * dim1 ) )] = CL_sub( s[2], s[3] ); - move64(); - x[( i + ( 3 * dim1 ) )] = CL_add( s[4], s[7] ); - move64(); - x[( i + ( 4 * dim1 ) )] = CL_sub( s[0], s[1] ); - move64(); - x[( i + ( 5 * dim1 ) )] = CL_sub( s[5], s[6] ); - move64(); - x[( i + ( 6 * dim1 ) )] = CL_add( s[2], s[3] ); - move64(); - x[( i + ( 7 * dim1 ) )] = CL_sub( s[4], s[7] ); - move64(); - } - } -#endif /* OPT_STEREO_32KBPS_V1 */ BREAK; } @@ -7503,11 +7116,7 @@ void rfft_fx( move32(); x[( length - ( i << 1 ) )] = Mpy_32_16_1( L_add( t1, t3 ), 16384 /*0.5.Q15*/ ); move32(); -#ifdef OPT_STEREO_32KBPS_V1 x[( ( length - ( i << 1 ) ) + 1 )] = Mpy_32_16_1( L_add( t2, t4 ), -16384 /*0.5.Q15*/ ); -#else /* OPT_STEREO_32KBPS_V1 */ - x[( ( length - ( i << 1 ) ) + 1 )] = Mpy_32_16_1( L_negate( L_add( t2, t4 ) ), 16384 /*0.5.Q15*/ ); -#endif /* OPT_STEREO_32KBPS_V1 */ move32(); } @@ -7556,171 +7165,315 @@ void rfft_fx( return; } -Word16 find_guarded_bits_fx( Word32 n ) + +#define WMC_TOOL_SKIP + +#define FFTC( x ) WORD322WORD16( (Word32) x ) + +#define C81_FX ( FFTC( 0x5a82799a ) ) /* FL2WORD32( 7.071067811865475e-1) */ +#define C82_FX ( FFTC( 0xa57d8666 ) ) /* FL2WORD32(-7.071067811865475e-1) */ + +#define cplxMpy4_8_0( re, im, a, b, c, d ) \ + re = L_shr( L_sub( Mpy_32_16_1( a, c ), Mpy_32_16_1( b, d ) ), 1 ); \ + im = L_shr( L_add( Mpy_32_16_1( a, d ), Mpy_32_16_1( b, c ) ), 1 ); + +#define cplxMpy4_8_1( re, im, a, b ) \ + re = L_shr( a, 1 ); \ + im = L_shr( b, 1 ); + + +/** + * \brief Twiddle factors are unscaled + */ +/*-----------------------------------------------------------------* + * BASOP_fft8() + * + * Function performs a complex 8-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR8 bits. + * + * WOPS with 32x16 bit multiplications: 108 cycles + *-----------------------------------------------------------------*/ + +static void BASOP_fft8( + Word32 *re, + Word32 *im, + Word16 s ) { - // return n <= 1 ? 0 : n <= 2 ? 1 - // : n <= 4 ? 2 - // : n <= 8 ? 3 - // : n <= 16 ? 4 - // : n <= 32 ? 5 - // : n <= 64 ? 6 - // : n <= 128 ? 7 - // : n <= 256 ? 8 - // : n <= 512 ? 9 - // : n <= 1024 ? 10 - // : n <= 2048 ? 11 - // : n <= 4096 ? 12 - // : n <= 8192 ? 13 - // : n <= 16384 ? 14 - // : 15; - /*Word16 val = 0; + Word32 x00, x01, x02, x03, x04, x05, x06, x07; + Word32 x08, x09, x10, x11, x12, x13, x14, x15; + Word32 t00, t01, t02, t03, t04, t05, t06, t07; + Word32 t08, t09, t10, t11, t12, t13, t14, t15; + Word32 s00, s01, s02, s03, s04, s05, s06, s07; + Word32 s08, s09, s10, s11, s12, s13, s14, s15; + + + /* Pre-additions */ + + x00 = L_shr( re[s * 0], SCALEFACTOR8 ); + x01 = L_shr( im[s * 0], SCALEFACTOR8 ); + x02 = L_shr( re[s * 1], SCALEFACTOR8 ); + x03 = L_shr( im[s * 1], SCALEFACTOR8 ); + x04 = L_shr( re[s * 2], SCALEFACTOR8 ); + x05 = L_shr( im[s * 2], SCALEFACTOR8 ); + x06 = L_shr( re[s * 3], SCALEFACTOR8 ); + x07 = L_shr( im[s * 3], SCALEFACTOR8 ); + x08 = L_shr( re[s * 4], SCALEFACTOR8 ); + x09 = L_shr( im[s * 4], SCALEFACTOR8 ); + x10 = L_shr( re[s * 5], SCALEFACTOR8 ); + x11 = L_shr( im[s * 5], SCALEFACTOR8 ); + x12 = L_shr( re[s * 6], SCALEFACTOR8 ); + x13 = L_shr( im[s * 6], SCALEFACTOR8 ); + x14 = L_shr( re[s * 7], SCALEFACTOR8 ); + x15 = L_shr( im[s * 7], SCALEFACTOR8 ); + + t00 = L_add( x00, x08 ); + t02 = L_sub( x00, x08 ); + t01 = L_add( x01, x09 ); + t03 = L_sub( x01, x09 ); + t04 = L_add( x02, x10 ); + t06 = L_sub( x02, x10 ); + t05 = L_add( x03, x11 ); + t07 = L_sub( x03, x11 ); + t08 = L_add( x04, x12 ); + t10 = L_sub( x04, x12 ); + t09 = L_add( x05, x13 ); + t11 = L_sub( x05, x13 ); + t12 = L_add( x06, x14 ); + t14 = L_sub( x06, x14 ); + t13 = L_add( x07, x15 ); + t15 = L_sub( x07, x15 ); + + /* Pre-additions and core multiplications */ + + s00 = L_add( t00, t08 ); + s04 = L_sub( t00, t08 ); + s01 = L_add( t01, t09 ); + s05 = L_sub( t01, t09 ); + s08 = L_sub( t02, t11 ); + s10 = L_add( t02, t11 ); + s09 = L_add( t03, t10 ); + s11 = L_sub( t03, t10 ); + s02 = L_add( t04, t12 ); + s07 = L_sub( t04, t12 ); + s03 = L_add( t05, t13 ); + s06 = L_sub( t13, t05 ); + + t01 = L_add( t06, t14 ); + t02 = L_sub( t06, t14 ); + t00 = L_add( t07, t15 ); + t03 = L_sub( t07, t15 ); + + s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX ); + s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX ); + s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX ); + s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX ); + + /* Post-additions */ + + re[s * 0] = L_add( s00, s02 ); + move32(); + re[s * 4] = L_sub( s00, s02 ); + move32(); + im[s * 0] = L_add( s01, s03 ); + move32(); + im[s * 4] = L_sub( s01, s03 ); + move32(); + re[s * 2] = L_sub( s04, s06 ); + move32(); + re[s * 6] = L_add( s04, s06 ); + move32(); + im[s * 2] = L_sub( s05, s07 ); + move32(); + im[s * 6] = L_add( s05, s07 ); + move32(); + re[i_mult( s, 3 )] = L_add( s08, s14 ); + move32(); + re[i_mult( s, 7 )] = L_sub( s08, s14 ); + move32(); + im[i_mult( s, 3 )] = L_add( s09, s15 ); + move32(); + im[i_mult( s, 7 )] = L_sub( s09, s15 ); + move32(); + re[s * 1] = L_add( s10, s12 ); + move32(); + re[i_mult( s, 5 )] = L_sub( s10, s12 ); + move32(); + im[s * 1] = L_add( s11, s13 ); + move32(); + im[i_mult( s, 5 )] = L_sub( s11, s13 ); move32(); - test(); - WHILE( GT_32( n, L_shl( 1, val ) ) && LT_32( val, 16 ) ) - { - val = add( val, 1 ); - }*/ - IF( LE_32( n, 1 ) ) - { - return 0; - } - ELSE - { - return sub( 31, norm_l( L_sub( n, 1 ) ) ); - } + return; } -Word16 L_norm_arr( const Word32 *arr, Word16 size ) + +/*-----------------------------------------------------------------* + * fftN2() + * + * Combined FFT + *-----------------------------------------------------------------*/ + +static void BASOP_fftN2( + Word32 *re, /* i/o: real part */ + Word32 *im, /* i/o: imag part */ + const Word16 *W, /* i : rotation factor */ + Word16 dim1, /* i : length of fft1 */ + Word16 dim2, /* i : length of fft2 */ + Word16 sx, /* i : stride real and imag part */ + Word16 sc, /* i : stride phase rotation coefficients */ + Word32 *x, /* tmp: 32-bit workbuffer */ + Word16 Woff /* i : offset for addressing the rotation vector table */ +) { - Word16 q = 31; - move16(); - FOR( Word16 i = 0; i < size; i++ ) -#ifndef FIX_1103_OPT_L_NORM_ARR - IF( arr[i] != 0 ) - { - q = s_min( q, norm_l( arr[i] ) ); - } -#else - { - Word16 q_tst; + Word16 i, j; + Word32 x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15; + Word32 t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15; + Word32 s00, s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15; - q_tst = norm_l( arr[i] ); - if ( arr[i] != 0 ) + FOR( i = 0; i < dim2; i++ ) + { + FOR( j = 0; j < dim1; j++ ) { - q = s_min( q, q_tst ); + x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2]; + move32(); + x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2]; + move32(); } } -#endif - return q; -} - -Word16 norm_arr( Word16 *arr, Word16 size ) -{ - Word16 q = 15; - Word16 exp = 0; - move16(); - move16(); - FOR( Word16 i = 0; i < size; i++ ) + /* dim1 == 8 */ + FOR( i = 0; i < dim2; i++ ) { - if ( arr[i] != 0 ) - { - exp = norm_s( arr[i] ); - } - if ( arr[i] != 0 ) - { - q = s_min( q, exp ); - } + BASOP_fft8( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 ); } - return q; -} -Word16 W_norm_arr( Word64 *arr, Word16 size ) -{ - Word16 q = 63; - Word16 exp = 0; - move16(); - move16(); - FOR( Word16 i = 0; i < size; i++ ) + /* dim2 == 8 */ + FOR( i = 0; i < dim1; i++ ) { - if ( arr[i] != 0 ) + cplxMpy4_8_1( x00, x01, x[2 * i + 2 * 0 * dim1], x[2 * i + 2 * 0 * dim1 + 1] ); + + IF( i == 0 ) { - exp = W_norm( arr[i] ); + cplxMpy4_8_1( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )] ); } - if ( arr[i] != 0 ) + ELSE { - q = s_min( q, exp ); + cplxMpy4_8_0( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), 1 ), Woff )] ); } - } - return q; -} + t00 = L_shr( L_add( x00, x08 ), SCALEFACTORN2 - 1 ); + t02 = L_shr( L_sub( x00, x08 ), SCALEFACTORN2 - 1 ); + t01 = L_shr( L_add( x01, x09 ), SCALEFACTORN2 - 1 ); + t03 = L_shr( L_sub( x01, x09 ), SCALEFACTORN2 - 1 ); + t04 = L_shr( L_add( x02, x10 ), SCALEFACTORN2 - 1 ); + t06 = L_sub( x02, x10 ); + t05 = L_shr( L_add( x03, x11 ), SCALEFACTORN2 - 1 ); + t07 = L_sub( x03, x11 ); + t08 = L_shr( L_add( x04, x12 ), SCALEFACTORN2 - 1 ); + t10 = L_shr( L_sub( x04, x12 ), SCALEFACTORN2 - 1 ); + t09 = L_shr( L_add( x05, x13 ), SCALEFACTORN2 - 1 ); + t11 = L_shr( L_sub( x05, x13 ), SCALEFACTORN2 - 1 ); + t12 = L_shr( L_add( x06, x14 ), SCALEFACTORN2 - 1 ); + t14 = L_sub( x06, x14 ); + t13 = L_shr( L_add( x07, x15 ), SCALEFACTORN2 - 1 ); + t15 = L_sub( x07, x15 ); -Word16 get_min_scalefactor( Word32 x, Word32 y ) -{ -#ifndef FIX_1104_OPT_GETMINSCALEFAC - Word16 scf = Q31; - move16(); - test(); - IF( x == 0 && y == 0 ) - { - return 0; - } - IF( x != 0 ) - { - scf = s_min( scf, norm_l( x ) ); - } - IF( y != 0 ) - { - scf = s_min( scf, norm_l( y ) ); - } - return scf; -#else - Word16 scf_y; - Word16 scf = Q31; - move16(); + s00 = L_add( t00, t08 ); + s04 = L_sub( t00, t08 ); + s01 = L_add( t01, t09 ); + s05 = L_sub( t01, t09 ); + s08 = L_sub( t02, t11 ); + s10 = L_add( t02, t11 ); + s09 = L_add( t03, t10 ); + s11 = L_sub( t03, t10 ); + s02 = L_add( t04, t12 ); + s07 = L_sub( t04, t12 ); + s03 = L_add( t05, t13 ); + s06 = L_sub( t13, t05 ); - test(); - if ( x == 0 && y == 0 ) - { - scf = 0; - move16(); - } + t01 = L_shr( L_add( t06, t14 ), SCALEFACTORN2 - 1 ); + t02 = L_shr( L_sub( t06, t14 ), SCALEFACTORN2 - 1 ); + t00 = L_shr( L_add( t07, t15 ), SCALEFACTORN2 - 1 ); + t03 = L_shr( L_sub( t07, t15 ), SCALEFACTORN2 - 1 ); - if ( x != 0 ) - { - scf = norm_l( x ); - } + s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX ); + s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX ); + s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX ); + s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX ); - scf_y = norm_l( y ); - if ( y != 0 ) - { - scf = s_min( scf_y, scf ); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s00, s02 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s01, s03 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s10, s12 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s11, s13 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s04, s06 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s05, s07 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s08, s14 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s09, s15 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s00, s02 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s01, s03 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s10, s12 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s11, s13 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s04, s06 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s05, s07 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s08, s14 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s09, s15 ); + move32(); } - return scf; -#endif + return; } -Flag is_zero_arr( Word32 *arr, Word16 size ) +/*-----------------------------------------------------------------* + * BASOP_cfft_ivas() + * + * Complex valued FFT + *-----------------------------------------------------------------*/ + +void BASOP_cfft_ivas( + Word32 *re, /* i/o: real part */ + Word32 *im, /* i/o: imag part */ + Word16 s, /* i : stride real and imag part */ + Word16 *scale /* i : scalefactor */ +) { - FOR( Word16 i = 0; i < size; i++ ) - IF( arr[i] != 0 ) - { - return 0; - } + Word32 x[2 * 64]; - return 1; -} + /* FFT for len = FDNS_NPTS */ + BASOP_fftN2( re, im, RotVector_256, 8, 8, s, 8, x, 64 ); + s = add( *scale, SCALEFACTOR64 ); -Flag is_zero_arr16( Word16 *arr, Word16 size ) -{ - FOR( Word16 i = 0; i < size; i++ ) - IF( arr[i] != 0 ) - { - return 0; - } + *scale = s; + move16(); - return 1; + return; } + +#undef WMC_TOOL_SKIP diff --git a/lib_com/fft_fx_evs.c b/lib_com/fft_fx_evs.c index b6f2bb2acee04e556e60e2a0cd36c85d7c81763d..a7b2461cb18fe44c1b763ca4e52997a1ef2e49c3 100644 --- a/lib_com/fft_fx_evs.c +++ b/lib_com/fft_fx_evs.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include "options.h" /* Compilation switches */ @@ -113,10 +113,10 @@ void DoRTFTn_fx( * Main fuction of Complex Discrete Fourier Transform *-----------------------------------------------------------------*/ static void cdftForw_fx( - Word16 n, /* i : data length of real and imag */ + Word16 n, /* i : data length of real and imag */ Word32 *a, /* i/o : input/output data Q(q)*/ - const Word16 *ip, /* i : work area for bit reversal */ - const Word16 *w /* i : cos/sin table Q14*/ + const Word16 *ip, /* i : work area for bit reversal */ + const Word16 *w /* i : cos/sin table Q14*/ ) { /* bit reversal */ @@ -131,8 +131,8 @@ static void cdftForw_fx( * Bit reversal *-----------------------------------------------------------------*/ static void bitrv2_SR_fx( - Word16 n, /* i : data length of real and imag */ - const Word16 *ip, /* i/o : work area for bit reversal */ + Word16 n, /* i : data length of real and imag */ + const Word16 *ip, /* i/o : work area for bit reversal */ Word32 *a /* i/o : input/output data Q(q)*/ ) { @@ -308,7 +308,7 @@ static void bitrv2_SR_fx( * Complex Discrete Fourier Transform *-----------------------------------------------------------------*/ static void cftfsub_fx( - Word16 n, /* i : data length of real and imag */ + Word16 n, /* i : data length of real and imag */ Word32 *a, /* i/o : input/output data Q(q)*/ const Word16 *w /* i : cos/sin table Q14*/ ) @@ -550,10 +550,10 @@ static void cft1st_fx( * Subfunction of Complex Discrete Fourier Transform *-----------------------------------------------------------------*/ static void cftmdl_fx( - Word16 n, /* i : data length of real and imag */ - Word16 l, /* i : initial shift for processing */ + Word16 n, /* i : data length of real and imag */ + Word16 l, /* i : initial shift for processing */ Word32 *a, /* i/o : input/output data Q(Qx+Q_edct)*/ - const Word16 *w /* i : cos/sin table Q30*/ + const Word16 *w /* i : cos/sin table Q30*/ ) { Word16 j, j1, j2, j3, k, k1, k2, m, m2; @@ -1186,10 +1186,6 @@ static void fft5_32_16fx( Word16 T1, To, T8, Tt, T9, Ts, Te, Tp, Th, Tn, T2, T3, T4, T5, T6, T7; Word16 i0, i1, i2, i3, i4; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif i0 = Idx[0]; move16(); i1 = Idx[32]; @@ -1216,9 +1212,9 @@ static void fft5_32_16fx( move16(); T6 = zRe[i3]; move16(); - T7 = add_o( T5, T6, &Overflow ); - T8 = add_o( T4, T7, &Overflow ); - Tt = sub_o( T5, T6, &Overflow ); + T7 = add_sat( T5, T6 ); + T8 = add_sat( T4, T7 ); + Tt = sub_sat( T5, T6 ); /* T9 = KP559016994 * (T4 - T7); */ L_tmp = Mult_32_16( KP559016994_16FX, sub_sat( T4, T7 ) ); // Q(16 +x) T9 = round_fx_sat( L_tmp ); // Qx @@ -1240,10 +1236,9 @@ static void fft5_32_16fx( L_tmp = Mult_32_16( KP559016994_16FX, sub_sat( T4, T7 ) ); // Q(16 +x) Tn = round_fx_sat( L_tmp ); // Qx - - zRe[i0] = add_o( T1, T8, &Overflow ); + zRe[i0] = add_sat( T1, T8 ); move16(); - zIm[i0] = add_o( To, Tp, &Overflow ); + zIm[i0] = add_sat( To, Tp ); move32(); /*T2 = KP951056516*Te + KP587785252*Th; */ @@ -1261,13 +1256,13 @@ static void fft5_32_16fx( T4 = add_sat( T9, T6 ); T5 = sub_sat( T6, T9 ); - zRe[i3] = sub_o( T4, T2, &Overflow ); + zRe[i3] = sub_sat( T4, T2 ); move32(); - zRe[i1] = add_o( T5, T3, &Overflow ); + zRe[i1] = add_sat( T5, T3 ); move32(); - zRe[i2] = add_o( T4, T2, &Overflow ); + zRe[i2] = add_sat( T4, T2 ); move32(); - zRe[i4] = sub_o( T5, T3, &Overflow ); + zRe[i4] = sub_sat( T5, T3 ); move32(); /* T2 = KP951056516 * Ts + KP587785252 * Tt; */ @@ -1473,10 +1468,10 @@ void DoRTFT128_16fx( * Main fuction of Complex Discrete Fourier Transform *-----------------------------------------------------------------*/ static void cdftForw_16fx( - Word16 n, /* i : data length of real and imag */ + Word16 n, /* i : data length of real and imag */ Word16 *a, /* i/o : input/output data Q(Qx+Q_edct)*/ - const Word16 *ip, /* i : work area for bit reversal */ - const Word32 *w /* i : cos/sin table Q30*/ + const Word16 *ip, /* i : work area for bit reversal */ + const Word32 *w /* i : cos/sin table Q30*/ ) { /* bit reversal */ @@ -1491,8 +1486,8 @@ static void cdftForw_16fx( * Bit reversal *-----------------------------------------------------------------*/ static void bitrv2_SR_16fx( - Word16 n, /* i : data length of real and imag */ - const Word16 *ip, /* i/o : work area for bit reversal */ + Word16 n, /* i : data length of real and imag */ + const Word16 *ip, /* i/o : work area for bit reversal */ Word16 *a /* i/o : input/output data Q(Qx+Q_edct)*/ ) { @@ -1668,17 +1663,13 @@ static void bitrv2_SR_16fx( * Complex Discrete Fourier Transform *-----------------------------------------------------------------*/ static void cftfsub_16fx( - Word16 n, /* i : data length of real and imag */ + Word16 n, /* i : data length of real and imag */ Word16 *a, /* i/o : input/output data Q(Qx+Q_edct)*/ const Word32 *w /* i : cos/sin table Q30*/ ) { Word16 j, j1, j2, j3, l; Word16 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif l = 2; move16(); @@ -1731,12 +1722,12 @@ static void cftfsub_16fx( { FOR( j = 0; j < l; j += 2 ) { - j1 = add_o( j, l, &Overflow ); - x0r = sub_o( a[j], a[j1], &Overflow ); - x0i = sub_o( a[j + 1], a[j1 + 1], &Overflow ); - a[j] = add_o( a[j], a[j1], &Overflow ); + j1 = add_sat( j, l ); + x0r = sub_sat( a[j], a[j1] ); + x0i = sub_sat( a[j + 1], a[j1 + 1] ); + a[j] = add_sat( a[j], a[j1] ); move16(); - a[j + 1] = add_o( a[j + 1], a[j1 + 1], &Overflow ); + a[j + 1] = add_sat( a[j + 1], a[j1 + 1] ); move16(); a[j1] = x0r; move16(); @@ -1762,77 +1753,73 @@ static void cft1st_16fx( Word16 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; Word16 tmp; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - x0r = add_o( a[0], a[2], &Overflow ); - x0i = add_o( a[1], a[3], &Overflow ); - x1r = sub_o( a[0], a[2], &Overflow ); - x1i = sub_o( a[1], a[3], &Overflow ); - x2r = add_o( a[4], a[6], &Overflow ); - x2i = add_o( a[5], a[7], &Overflow ); - x3r = sub_o( a[4], a[6], &Overflow ); - x3i = sub_o( a[5], a[7], &Overflow ); - a[0] = add_o( x0r, x2r, &Overflow ); + x0r = add_sat( a[0], a[2] ); + x0i = add_sat( a[1], a[3] ); + x1r = sub_sat( a[0], a[2] ); + x1i = sub_sat( a[1], a[3] ); + x2r = add_sat( a[4], a[6] ); + x2i = add_sat( a[5], a[7] ); + x3r = sub_sat( a[4], a[6] ); + x3i = sub_sat( a[5], a[7] ); + a[0] = add_sat( x0r, x2r ); move16(); - a[1] = add_o( x0i, x2i, &Overflow ); + a[1] = add_sat( x0i, x2i ); move16(); - a[4] = sub_o( x0r, x2r, &Overflow ); + a[4] = sub_sat( x0r, x2r ); move16(); - a[5] = sub_o( x0i, x2i, &Overflow ); + a[5] = sub_sat( x0i, x2i ); move16(); - a[2] = sub_o( x1r, x3i, &Overflow ); + a[2] = sub_sat( x1r, x3i ); move16(); - a[3] = add_o( x1i, x3r, &Overflow ); + a[3] = add_sat( x1i, x3r ); move16(); - a[6] = add_o( x1r, x3i, &Overflow ); + a[6] = add_sat( x1r, x3i ); move16(); - a[7] = sub_o( x1i, x3r, &Overflow ); + a[7] = sub_sat( x1i, x3r ); wk1r = w[2]; move32(); - x0r = add_o( a[8], a[10], &Overflow ); - x0i = add_o( a[9], a[11], &Overflow ); - x1r = sub_o( a[8], a[10], &Overflow ); - x1i = sub_o( a[9], a[11], &Overflow ); - x2r = add_o( a[12], a[14], &Overflow ); - x2i = add_o( a[13], a[15], &Overflow ); - x3r = sub_o( a[12], a[14], &Overflow ); - x3i = sub_o( a[13], a[15], &Overflow ); - a[8] = add_o( x0r, x2r, &Overflow ); + x0r = add_sat( a[8], a[10] ); + x0i = add_sat( a[9], a[11] ); + x1r = sub_sat( a[8], a[10] ); + x1i = sub_sat( a[9], a[11] ); + x2r = add_sat( a[12], a[14] ); + x2i = add_sat( a[13], a[15] ); + x3r = sub_sat( a[12], a[14] ); + x3i = sub_sat( a[13], a[15] ); + a[8] = add_sat( x0r, x2r ); move16(); - a[9] = add_o( x0i, x2i, &Overflow ); + a[9] = add_sat( x0i, x2i ); move16(); - a[12] = sub_o( x2i, x0i, &Overflow ); + a[12] = sub_sat( x2i, x0i ); move16(); - a[13] = sub_o( x0r, x2r, &Overflow ); + a[13] = sub_sat( x0r, x2r ); move16(); - x0r = sub_o( x1r, x3i, &Overflow ); - x0i = add_o( x1i, x3r, &Overflow ); - tmp = sub_o( x0r, x0i, &Overflow ); + x0r = sub_sat( x1r, x3i ); + x0i = add_sat( x1i, x3r ); + tmp = sub_sat( x0r, x0i ); L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ - a[10] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + a[10] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - tmp = add_o( x0r, x0i, &Overflow ); - L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ - a[11] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /* Q(Qx+Q_edct) */ + tmp = add_sat( x0r, x0i ); + L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ + a[11] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /* Q(Qx+Q_edct)*/ move16(); - x0r = add_o( x3i, x1r, &Overflow ); - x0i = sub_o( x3r, x1i, &Overflow ); - tmp = sub_o( x0i, x0r, &Overflow ); - L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ - a[14] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + x0r = add_sat( x3i, x1r ); + x0i = sub_sat( x3r, x1i ); + tmp = sub_sat( x0i, x0r ); + L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ + a[14] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - tmp = add_o( x0i, x0r, &Overflow ); - L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ - a[15] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + tmp = add_sat( x0i, x0r ); + L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ + a[15] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); k1 = 0; move16(); @@ -1856,53 +1843,54 @@ static void cft1st_16fx( L_tmp = L_shl( Mult_32_32( wk2i, wk1r ), 1 ); /*Q29 */ wk3i = L_sub( L_shl( L_tmp, 1 ), wk1i ); /*Q30 */ - x0r = add_o( a[j], a[j + 2], &Overflow ); - x0i = add_o( a[j + 1], a[j + 3], &Overflow ); - x1r = sub_o( a[j], a[j + 2], &Overflow ); - x1i = sub_o( a[j + 1], a[j + 3], &Overflow ); - x2r = add_o( a[j + 4], a[j + 6], &Overflow ); - x2i = add_o( a[j + 5], a[j + 7], &Overflow ); - x3r = sub_o( a[j + 4], a[j + 6], &Overflow ); - x3i = sub_o( a[j + 5], a[j + 7], &Overflow ); - a[j] = add_o( x0r, x2r, &Overflow ); + + x0r = add_sat( a[j], a[j + 2] ); + x0i = add_sat( a[j + 1], a[j + 3] ); + x1r = sub_sat( a[j], a[j + 2] ); + x1i = sub_sat( a[j + 1], a[j + 3] ); + x2r = add_sat( a[j + 4], a[j + 6] ); + x2i = add_sat( a[j + 5], a[j + 7] ); + x3r = sub_sat( a[j + 4], a[j + 6] ); + x3i = sub_sat( a[j + 5], a[j + 7] ); + a[j] = add_sat( x0r, x2r ); move16(); - a[j + 1] = add_o( x0i, x2i, &Overflow ); + a[j + 1] = add_sat( x0i, x2i ); move16(); - x0r = sub_o( x0r, x2r, &Overflow ); - x0i = sub_o( x0i, x2i, &Overflow ); - L_tmp = Mult_32_16( wk2r, x0r ); /*Q(15+Qx+Q_edct) */ - L_tmp = Msub_32_16( L_tmp, wk2i, x0i ); /*Q(15+Qx+Q_edct) */ - a[j + 4] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + x0r = sub_sat( x0r, x2r ); + x0i = sub_sat( x0i, x2i ); + L_tmp = Mult_32_16( wk2r, x0r ); /*Q(15+Qx+Q_edct) */ + L_tmp = Msub_32_16( L_tmp, wk2i, x0i ); /*Q(15+Qx+Q_edct) */ + a[j + 4] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - L_tmp = Mult_32_16( wk2r, x0i ); /*Q(15+Qx+Q_edct) */ - L_tmp = Madd_32_16( L_tmp, wk2i, x0r ); /*Q(15+Qx+Q_edct) */ - a[j + 5] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk2r, x0i ); /*Q(15+Qx+Q_edct) */ + L_tmp = Madd_32_16( L_tmp, wk2i, x0r ); /*Q(15+Qx+Q_edct) */ + a[j + 5] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - x0r = sub_o( x1r, x3i, &Overflow ); - x0i = add_o( x1i, x3r, &Overflow ); - L_tmp = Mult_32_16( wk1r, x0r ); /*Q(15+Qx+Q_edct) */ - L_tmp = Msub_32_16( L_tmp, wk1i, x0i ); /*Q(15+Qx+Q_edct) */ - a[j + 2] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + x0r = sub_sat( x1r, x3i ); + x0i = add_sat( x1i, x3r ); + L_tmp = Mult_32_16( wk1r, x0r ); /*Q(15+Qx+Q_edct) */ + L_tmp = Msub_32_16( L_tmp, wk1i, x0i ); /*Q(15+Qx+Q_edct) */ + a[j + 2] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - L_tmp = Mult_32_16( wk1r, x0i ); /*Q(15+Qx+Q_edct) */ - L_tmp = Madd_32_16( L_tmp, wk1i, x0r ); /*Q(15+Qx+Q_edct) */ - a[j + 3] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk1r, x0i ); /*Q(15+Qx+Q_edct) */ + L_tmp = Madd_32_16( L_tmp, wk1i, x0r ); /*Q(15+Qx+Q_edct) */ + a[j + 3] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - x0r = add_o( x1r, x3i, &Overflow ); - x0i = sub_o( x1i, x3r, &Overflow ); - L_tmp = Mult_32_16( wk3r, x0r ); /*Q(15+Qx+Q_edct) */ - L_tmp = Msub_32_16( L_tmp, wk3i, x0i ); /*Q(15+Qx+Q_edct) */ - a[j + 6] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + x0r = add_sat( x1r, x3i ); + x0i = sub_sat( x1i, x3r ); + L_tmp = Mult_32_16( wk3r, x0r ); /*Q(15+Qx+Q_edct) */ + L_tmp = Msub_32_16( L_tmp, wk3i, x0i ); /*Q(15+Qx+Q_edct) */ + a[j + 6] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - L_tmp = Mult_32_16( wk3r, x0i ); /*Q(15+Qx+Q_edct) */ - L_tmp = Madd_32_16( L_tmp, wk3i, x0r ); /*Q(15+Qx+Q_edct) */ - a[j + 7] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk3r, x0i ); /*Q(15+Qx+Q_edct) */ + L_tmp = Madd_32_16( L_tmp, wk3i, x0r ); /*Q(15+Qx+Q_edct) */ + a[j + 7] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); wk1r = w[k2 + 2]; @@ -1915,56 +1903,56 @@ static void cft1st_16fx( L_tmp = L_shl( Mult_32_32( wk2r, wk1r ), 1 ); /*Q29 */ wk3i = L_sub( L_shl( L_tmp, 1 ), wk1i ); /*Q30 */ - x0r = add_o( a[j + 8], a[j + 10], &Overflow ); - x0i = add_o( a[j + 9], a[j + 11], &Overflow ); - x1r = sub_o( a[j + 8], a[j + 10], &Overflow ); - x1i = sub_o( a[j + 9], a[j + 11], &Overflow ); - x2r = add_o( a[j + 12], a[j + 14], &Overflow ); - x2i = add_o( a[j + 13], a[j + 15], &Overflow ); - x3r = sub_o( a[j + 12], a[j + 14], &Overflow ); - x3i = sub_o( a[j + 13], a[j + 15], &Overflow ); - a[j + 8] = add_o( x0r, x2r, &Overflow ); + x0r = add_sat( a[j + 8], a[j + 10] ); + x0i = add_sat( a[j + 9], a[j + 11] ); + x1r = sub_sat( a[j + 8], a[j + 10] ); + x1i = sub_sat( a[j + 9], a[j + 11] ); + x2r = add_sat( a[j + 12], a[j + 14] ); + x2i = add_sat( a[j + 13], a[j + 15] ); + x3r = sub_sat( a[j + 12], a[j + 14] ); + x3i = sub_sat( a[j + 13], a[j + 15] ); + a[j + 8] = add_sat( x0r, x2r ); move16(); - a[j + 9] = add_o( x0i, x2i, &Overflow ); + a[j + 9] = add_sat( x0i, x2i ); move16(); - x0r = sub_o( x0r, x2r, &Overflow ); - x0i = sub_o( x0i, x2i, &Overflow ); + x0r = sub_sat( x0r, x2r ); + x0i = sub_sat( x0i, x2i ); tmp = negate( x0r ); - L_tmp = Mult_32_16( wk2i, tmp ); /*Q(15+Qx+Q_edct) */ - L_tmp = Msub_32_16( L_tmp, wk2r, x0i ); /*Q(15+Qx+Q_edct) */ - a[j + 12] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk2i, tmp ); /*Q(15+Qx+Q_edct) */ + L_tmp = Msub_32_16( L_tmp, wk2r, x0i ); /*Q(15+Qx+Q_edct) */ + a[j + 12] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); tmp = negate( x0i ); - L_tmp = Mult_32_16( wk2i, tmp ); /*Q(15+Qx+Q_edct) */ - L_tmp = Madd_32_16( L_tmp, wk2r, x0r ); /*Q(15+Qx+Q_edct) */ - a[j + 13] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk2i, tmp ); /*Q(15+Qx+Q_edct) */ + L_tmp = Madd_32_16( L_tmp, wk2r, x0r ); /*Q(15+Qx+Q_edct) */ + a[j + 13] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - x0r = sub_o( x1r, x3i, &Overflow ); - x0i = add_o( x1i, x3r, &Overflow ); - L_tmp = Mult_32_16( wk1r, x0r ); /*Q(15+Qx+Q_edct) */ - L_tmp = Msub_32_16( L_tmp, wk1i, x0i ); /*Q(15+Qx+Q_edct) */ - a[j + 10] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + x0r = sub_sat( x1r, x3i ); + x0i = add_sat( x1i, x3r ); + L_tmp = Mult_32_16( wk1r, x0r ); /*Q(15+Qx+Q_edct) */ + L_tmp = Msub_32_16( L_tmp, wk1i, x0i ); /*Q(15+Qx+Q_edct) */ + a[j + 10] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - L_tmp = Mult_32_16( wk1r, x0i ); /*Q(15+Qx+Q_edct) */ - L_tmp = Madd_32_16( L_tmp, wk1i, x0r ); /*Q(15+Qx+Q_edct) */ - a[j + 11] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk1r, x0i ); /*Q(15+Qx+Q_edct) */ + L_tmp = Madd_32_16( L_tmp, wk1i, x0r ); /*Q(15+Qx+Q_edct) */ + a[j + 11] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - x0r = add_o( x1r, x3i, &Overflow ); - x0i = sub_o( x1i, x3r, &Overflow ); + x0r = add_sat( x1r, x3i ); + x0i = sub_sat( x1i, x3r ); - L_tmp = Mult_32_16( wk3r, x0r ); /*Q(15+Qx+Q_edct) */ - L_tmp = Msub_32_16( L_tmp, wk3i, x0i ); /*Q(15+Qx+Q_edct) */ - a[j + 14] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk3r, x0r ); /*Q(15+Qx+Q_edct) */ + L_tmp = Msub_32_16( L_tmp, wk3i, x0i ); /*Q(15+Qx+Q_edct) */ + a[j + 14] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - L_tmp = Mult_32_16( wk3r, x0i ); /*Q(15+Qx+Q_edct) */ - L_tmp = Madd_32_16( L_tmp, wk3i, x0r ); /*Q(15+Qx+Q_edct) */ - a[j + 15] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk3r, x0i ); /*Q(15+Qx+Q_edct) */ + L_tmp = Madd_32_16( L_tmp, wk3i, x0r ); /*Q(15+Qx+Q_edct) */ + a[j + 15] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); } @@ -1976,10 +1964,10 @@ static void cft1st_16fx( * Subfunction of Complex Discrete Fourier Transform *-----------------------------------------------------------------*/ static void cftmdl_16fx( - Word16 n, /* i : data length of real and imag */ - Word16 l, /* i : initial shift for processing */ + Word16 n, /* i : data length of real and imag */ + Word16 l, /* i : initial shift for processing */ Word16 *a, /* i/o : input/output data Q(Qx+Q_edct)*/ - const Word32 *w /* i : cos/sin table Q30*/ + const Word32 *w /* i : cos/sin table Q30*/ ) { Word16 j, j1, j2, j3, k, k1, k2, m, m2; @@ -1988,39 +1976,36 @@ static void cftmdl_16fx( Word16 tmp, tmp2; Word32 L_tmp; Word32 L_x0r, L_x0i; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + m = shl( l, 2 ); FOR( j = 0; j < l; j += 2 ) { - j1 = add_o( j, l, &Overflow ); - j2 = add_o( j1, l, &Overflow ); - j3 = add_o( j2, l, &Overflow ); - x0r = add_o( a[j], a[j1], &Overflow ); - x0i = add_o( a[j + 1], a[j1 + 1], &Overflow ); - x1r = sub_o( a[j], a[j1], &Overflow ); - x1i = sub_o( a[j + 1], a[j1 + 1], &Overflow ); - x2r = add_o( a[j2], a[j3], &Overflow ); - x2i = add_o( a[j2 + 1], a[j3 + 1], &Overflow ); - x3r = sub_o( a[j2], a[j3], &Overflow ); - x3i = sub_o( a[j2 + 1], a[j3 + 1], &Overflow ); - a[j] = add_o( x0r, x2r, &Overflow ); + j1 = add_sat( j, l ); + j2 = add_sat( j1, l ); + j3 = add_sat( j2, l ); + x0r = add_sat( a[j], a[j1] ); + x0i = add_sat( a[j + 1], a[j1 + 1] ); + x1r = sub_sat( a[j], a[j1] ); + x1i = sub_sat( a[j + 1], a[j1 + 1] ); + x2r = add_sat( a[j2], a[j3] ); + x2i = add_sat( a[j2 + 1], a[j3 + 1] ); + x3r = sub_sat( a[j2], a[j3] ); + x3i = sub_sat( a[j2 + 1], a[j3 + 1] ); + a[j] = add_sat( x0r, x2r ); move16(); - a[j + 1] = add_o( x0i, x2i, &Overflow ); + a[j + 1] = add_sat( x0i, x2i ); move16(); - a[j2] = sub_o( x0r, x2r, &Overflow ); + a[j2] = sub_sat( x0r, x2r ); move16(); - a[j2 + 1] = sub_o( x0i, x2i, &Overflow ); + a[j2 + 1] = sub_sat( x0i, x2i ); move16(); - a[j1] = sub_o( x1r, x3i, &Overflow ); + a[j1] = sub_sat( x1r, x3i ); move16(); - a[j1 + 1] = add_o( x1i, x3r, &Overflow ); + a[j1 + 1] = add_sat( x1i, x3r ); move16(); - a[j3] = add_o( x1r, x3i, &Overflow ); + a[j3] = add_sat( x1r, x3i ); move16(); - a[j3 + 1] = sub_o( x1i, x3r, &Overflow ); + a[j3 + 1] = sub_sat( x1i, x3r ); move16(); } @@ -2029,48 +2014,48 @@ static void cftmdl_16fx( tmp2 = add( l, m ); FOR( j = m; j < tmp2; j += 2 ) { - j1 = add_o( j, l, &Overflow ); - j2 = add_o( j1, l, &Overflow ); - j3 = add_o( j2, l, &Overflow ); - x0r = add_o( a[j], a[j1], &Overflow ); - x0i = add_o( a[j + 1], a[j1 + 1], &Overflow ); - x1r = sub_o( a[j], a[j1], &Overflow ); - x1i = sub_o( a[j + 1], a[j1 + 1], &Overflow ); - x2r = add_o( a[j2], a[j3], &Overflow ); - x2i = add_o( a[j2 + 1], a[j3 + 1], &Overflow ); - x3r = sub_o( a[j2], a[j3], &Overflow ); - x3i = sub_o( a[j2 + 1], a[j3 + 1], &Overflow ); - a[j] = add_o( x0r, x2r, &Overflow ); + j1 = add_sat( j, l ); + j2 = add_sat( j1, l ); + j3 = add_sat( j2, l ); + x0r = add_sat( a[j], a[j1] ); + x0i = add_sat( a[j + 1], a[j1 + 1] ); + x1r = sub_sat( a[j], a[j1] ); + x1i = sub_sat( a[j + 1], a[j1 + 1] ); + x2r = add_sat( a[j2], a[j3] ); + x2i = add_sat( a[j2 + 1], a[j3 + 1] ); + x3r = sub_sat( a[j2], a[j3] ); + x3i = sub_sat( a[j2 + 1], a[j3 + 1] ); + a[j] = add_sat( x0r, x2r ); move16(); - a[j + 1] = add_o( x0i, x2i, &Overflow ); + a[j + 1] = add_sat( x0i, x2i ); move16(); - a[j2] = sub_o( x2i, x0i, &Overflow ); + a[j2] = sub_sat( x2i, x0i ); move16(); - a[j2 + 1] = sub_o( x0r, x2r, &Overflow ); + a[j2 + 1] = sub_sat( x0r, x2r ); move16(); - x0r = sub_o( x1r, x3i, &Overflow ); - x0i = add_o( x1i, x3r, &Overflow ); - tmp = sub_o( x0r, x0i, &Overflow ); - L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ - a[j1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + x0r = sub_sat( x1r, x3i ); + x0i = add_sat( x1i, x3r ); + tmp = sub_sat( x0r, x0i ); + L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ + a[j1] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - tmp = add_o( x0r, x0i, &Overflow ); - L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ - a[j1 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + tmp = add_sat( x0r, x0i ); + L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ + a[j1 + 1] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - x0r = add_o( x3i, x1r, &Overflow ); - x0i = sub_o( x3r, x1i, &Overflow ); - tmp = sub_o( x0i, x0r, &Overflow ); - L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ - a[j3] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + x0r = add_sat( x3i, x1r ); + x0i = sub_sat( x3r, x1i ); + tmp = sub_sat( x0i, x0r ); + L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ + a[j3] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - tmp = add_o( x0i, x0r, &Overflow ); - L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ - a[j3 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + tmp = add_sat( x0i, x0r ); + L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ + a[j3 + 1] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); } @@ -2098,60 +2083,60 @@ static void cftmdl_16fx( tmp2 = add( l, k ); FOR( j = k; j < tmp2; j += 2 ) { - j1 = add_o( j, l, &Overflow ); - j2 = add_o( j1, l, &Overflow ); - j3 = add_o( j2, l, &Overflow ); - x0r = add_o( a[j], a[j1], &Overflow ); - x0i = add_o( a[j + 1], a[j1 + 1], &Overflow ); - x1r = sub_o( a[j], a[j1], &Overflow ); - x1i = sub_o( a[j + 1], a[j1 + 1], &Overflow ); - x2r = add_o( a[j2], a[j3], &Overflow ); - x2i = add_o( a[j2 + 1], a[j3 + 1], &Overflow ); - x3r = sub_o( a[j2], a[j3], &Overflow ); - x3i = sub_o( a[j2 + 1], a[j3 + 1], &Overflow ); - a[j] = add_o( x0r, x2r, &Overflow ); + j1 = add_sat( j, l ); + j2 = add_sat( j1, l ); + j3 = add_sat( j2, l ); + x0r = add_sat( a[j], a[j1] ); + x0i = add_sat( a[j + 1], a[j1 + 1] ); + x1r = sub_sat( a[j], a[j1] ); + x1i = sub_sat( a[j + 1], a[j1 + 1] ); + x2r = add_sat( a[j2], a[j3] ); + x2i = add_sat( a[j2 + 1], a[j3 + 1] ); + x3r = sub_sat( a[j2], a[j3] ); + x3i = sub_sat( a[j2 + 1], a[j3 + 1] ); + a[j] = add_sat( x0r, x2r ); move16(); - a[j + 1] = add_o( x0i, x2i, &Overflow ); + a[j + 1] = add_sat( x0i, x2i ); move16(); - x0r = sub_o( x0r, x2r, &Overflow ); - x0i = sub_o( x0i, x2i, &Overflow ); + x0r = sub_sat( x0r, x2r ); + x0i = sub_sat( x0i, x2i ); - L_tmp = Mult_32_16( wk2r, x0r ); /*Q(15+Qx+Q_edct) */ - L_tmp = Msub_32_16( L_tmp, wk2i, x0i ); /*Q(15+Qx+Q_edct) */ - a[j2] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk2r, x0r ); /*Q(15+Qx+Q_edct) */ + L_tmp = Msub_32_16( L_tmp, wk2i, x0i ); /*Q(15+Qx+Q_edct) */ + a[j2] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - L_tmp = Mult_32_16( wk2r, x0i ); /*Q(15+Qx+Q_edct) */ - L_tmp = Madd_32_16( L_tmp, wk2i, x0r ); /*Q(15+Qx+Q_edct) */ - a[j2 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk2r, x0i ); /*Q(15+Qx+Q_edct) */ + L_tmp = Madd_32_16( L_tmp, wk2i, x0r ); /*Q(15+Qx+Q_edct) */ + a[j2 + 1] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - x0r = sub_o( x1r, x3i, &Overflow ); - x0i = add_o( x1i, x3r, &Overflow ); + x0r = sub_sat( x1r, x3i ); + x0i = add_sat( x1i, x3r ); - L_tmp = Mult_32_16( wk1r, x0r ); /*Q(15+Qx+Q_edct) */ - L_tmp = Msub_32_16( L_tmp, wk1i, x0i ); /*Q(15+Qx+Q_edct) */ - a[j1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk1r, x0r ); /*Q(15+Qx+Q_edct) */ + L_tmp = Msub_32_16( L_tmp, wk1i, x0i ); /*Q(15+Qx+Q_edct) */ + a[j1] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - L_tmp = Mult_32_16( wk1r, x0i ); /*Q(15+Qx+Q_edct) */ - L_tmp = Madd_32_16( L_tmp, wk1i, x0r ); /*Q(15+Qx+Q_edct) */ - a[j1 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk1r, x0i ); /*Q(15+Qx+Q_edct) */ + L_tmp = Madd_32_16( L_tmp, wk1i, x0r ); /*Q(15+Qx+Q_edct) */ + a[j1 + 1] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); L_x0r = L_add( (Word32) x1r, (Word32) x3i ); L_x0i = L_sub( (Word32) x1i, (Word32) x3r ); x0r = extract_l( L_x0r ); x0i = extract_l( L_x0i ); - L_tmp = Mult_32_16( wk3r, x0r ); /*Q(15+Qx+Q_edct) */ - L_tmp = Msub_32_16( L_tmp, wk3i, x0i ); /*Q(15+Qx+Q_edct) */ - a[j3] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk3r, x0r ); /*Q(15+Qx+Q_edct) */ + L_tmp = Msub_32_16( L_tmp, wk3i, x0i ); /*Q(15+Qx+Q_edct) */ + a[j3] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - L_tmp = Mult_32_16( wk3r, x0i ); /*Q(15+Qx+Q_edct) */ - L_tmp = Madd_32_16( L_tmp, wk3i, x0r ); /*Q(15+Qx+Q_edct) */ - a[j3 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk3r, x0i ); /*Q(15+Qx+Q_edct) */ + L_tmp = Madd_32_16( L_tmp, wk3i, x0r ); /*Q(15+Qx+Q_edct) */ + a[j3 + 1] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); } @@ -2159,69 +2144,70 @@ static void cftmdl_16fx( move32(); wk1i = w[k2 + 3]; move32(); - L_tmp = L_shl_o( Mult_32_32( wk2r, wk1i ), 1, &Overflow ); /*Q29 */ - wk3r = L_sub_o( wk1r, L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q30 */ + L_tmp = L_shl_sat( Mult_32_32( wk2r, wk1i ), 1 ); /*Q29 */ + wk3r = L_sub_sat( wk1r, L_shl_sat( L_tmp, 1 ) ); /*Q30 */ - L_tmp = L_shl_o( Mult_32_32( wk2r, wk1r ), 1, &Overflow ); /*Q29 */ - wk3i = L_sub_o( L_shl_o( L_tmp, 1, &Overflow ), wk1i, &Overflow ); /*Q30 */ + L_tmp = L_shl_sat( Mult_32_32( wk2r, wk1r ), 1 ); /*Q29 */ + wk3i = L_sub_sat( L_shl_sat( L_tmp, 1 ), wk1i ); /*Q30 */ tmp2 = add( l, add( k, m ) ); + FOR( j = add( k, m ); j < tmp2; j += 2 ) { - j1 = add_o( j, l, &Overflow ); - j2 = add_o( j1, l, &Overflow ); - j3 = add_o( j2, l, &Overflow ); - x0r = add_o( a[j], a[j1], &Overflow ); - x0i = add_o( a[j + 1], a[j1 + 1], &Overflow ); - x1r = sub_o( a[j], a[j1], &Overflow ); - x1i = sub_o( a[j + 1], a[j1 + 1], &Overflow ); - x2r = add_o( a[j2], a[j3], &Overflow ); - x2i = add_o( a[j2 + 1], a[j3 + 1], &Overflow ); - x3r = sub_o( a[j2], a[j3], &Overflow ); - x3i = sub_o( a[j2 + 1], a[j3 + 1], &Overflow ); - a[j] = add_o( x0r, x2r, &Overflow ); + j1 = add_sat( j, l ); + j2 = add_sat( j1, l ); + j3 = add_sat( j2, l ); + x0r = add_sat( a[j], a[j1] ); + x0i = add_sat( a[j + 1], a[j1 + 1] ); + x1r = sub_sat( a[j], a[j1] ); + x1i = sub_sat( a[j + 1], a[j1 + 1] ); + x2r = add_sat( a[j2], a[j3] ); + x2i = add_sat( a[j2 + 1], a[j3 + 1] ); + x3r = sub_sat( a[j2], a[j3] ); + x3i = sub_sat( a[j2 + 1], a[j3 + 1] ); + a[j] = add_sat( x0r, x2r ); move16(); - a[j + 1] = add_o( x0i, x2i, &Overflow ); + a[j + 1] = add_sat( x0i, x2i ); move16(); - x0r = sub_o( x0r, x2r, &Overflow ); - x0i = sub_o( x0i, x2i, &Overflow ); + x0r = sub_sat( x0r, x2r ); + x0i = sub_sat( x0i, x2i ); tmp = negate( x0r ); - L_tmp = Mult_32_16( wk2i, tmp ); /*Q(15+Qx+Q_edct) */ - L_tmp = Msub_32_16( L_tmp, wk2r, x0i ); /*Q(15+Qx+Q_edct) */ - a[j2] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk2i, tmp ); /*Q(15+Qx+Q_edct) */ + L_tmp = Msub_32_16( L_tmp, wk2r, x0i ); /*Q(15+Qx+Q_edct) */ + a[j2] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); tmp = negate( x0i ); - L_tmp = Mult_32_16( wk2i, tmp ); /*Q(15+Qx+Q_edct) */ - L_tmp = Madd_32_16( L_tmp, wk2r, x0r ); /*Q(15+Qx+Q_edct) */ - a[j2 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk2i, tmp ); /*Q(15+Qx+Q_edct) */ + L_tmp = Madd_32_16( L_tmp, wk2r, x0r ); /*Q(15+Qx+Q_edct) */ + a[j2 + 1] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - x0r = sub_o( x1r, x3i, &Overflow ); - x0i = add_o( x1i, x3r, &Overflow ); + x0r = sub_sat( x1r, x3i ); + x0i = add_sat( x1i, x3r ); - L_tmp = Mult_32_16( wk1r, x0r ); /*Q(15+Qx+Q_edct) */ - L_tmp = Msub_32_16( L_tmp, wk1i, x0i ); /*Q(15+Qx+Q_edct) */ - a[j1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk1r, x0r ); /*Q(15+Qx+Q_edct) */ + L_tmp = Msub_32_16( L_tmp, wk1i, x0i ); /*Q(15+Qx+Q_edct) */ + a[j1] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - L_tmp = Mult_32_16( wk1r, x0i ); /*Q(15+Qx+Q_edct) */ - L_tmp = Madd_32_16( L_tmp, wk1i, x0r ); /*Q(15+Qx+Q_edct) */ - a[j1 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk1r, x0i ); /*Q(15+Qx+Q_edct) */ + L_tmp = Madd_32_16( L_tmp, wk1i, x0r ); /*Q(15+Qx+Q_edct) */ + a[j1 + 1] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - x0r = add_o( x1r, x3i, &Overflow ); - x0i = sub_o( x1i, x3r, &Overflow ); + x0r = add_sat( x1r, x3i ); + x0i = sub_sat( x1i, x3r ); - L_tmp = Mult_32_16( wk3r, x0r ); /*Q(15+Qx+Q_edct) */ - L_tmp = Msub_32_16( L_tmp, wk3i, x0i ); /*Q(15+Qx+Q_edct) */ - a[j3] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk3r, x0r ); /*Q(15+Qx+Q_edct) */ + L_tmp = Msub_32_16( L_tmp, wk3i, x0i ); /*Q(15+Qx+Q_edct) */ + a[j3] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); - L_tmp = Mult_32_16( wk3r, x0i ); /*Q(15+Qx+Q_edct) */ - L_tmp = Madd_32_16( L_tmp, wk3i, x0r ); /*Q(15+Qx+Q_edct) */ - a[j3 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + L_tmp = Mult_32_16( wk3r, x0i ); /*Q(15+Qx+Q_edct) */ + L_tmp = Madd_32_16( L_tmp, wk3i, x0r ); /*Q(15+Qx+Q_edct) */ + a[j3 + 1] = round_fx_sat( L_shl_sat( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ move16(); } } @@ -2336,20 +2322,20 @@ void fft3_fx( const Word16 X[] /*Qx*/, Word16 Y[] /*Qx*/, const Word16 n ) l = sub( shr( n, 3 ), 1 ); /* (3*m/8) - 1 = (n/8) - 1 */ FOR( i = 0; i < l; i++ ) { - acc = L_shl( *RZ0++, 15 ); /* Align with the following non-fractional mode so as to gain 1 more bit headroom. Q15 + Qx*/ - acc = L_mac0( acc, *RZ1, t_sin[c1_ind] ); /* Non-fractional mode gains 1 more bit headroom. Q15 + Qx*/ - acc = L_mac0( acc, *IZ1, t_sin[s1_ind] ); // Q15 + Qx - acc = L_mac0( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx - acc = L_mac0( acc, *IZ2, t_sin[s2_ind] ); // Q15 + Qx - *RY++ = round_fx( acc ); /* bit growth = 1 (compensated by non-fractional mode MAC). Qx - 1*/ + acc = L_shl_sat( *RZ0++, 15 ); /* Align with the following non-fractional mode so as to gain 1 more bit headroom. Q15 + Qx*/ + acc = L_mac0_sat( acc, *RZ1, t_sin[c1_ind] ); /* Non-fractional mode gains 1 more bit headroom. Q15 + Qx*/ + acc = L_mac0_sat( acc, *IZ1, t_sin[s1_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *IZ2, t_sin[s2_ind] ); // Q15 + Qx + *RY++ = round_fx( acc ); /* bit growth = 1 (compensated by non-fractional mode MAC). Qx - 1*/ move16(); - acc = L_shl( *IZ0--, 15 ); // Q15 + Qx - acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); // Q15 + Qx - acc = L_mac0( acc, *IZ1--, t_sin[c1_ind] ); // Q15 + Qx - acc = L_msu0( acc, *RZ2++, t_sin[s2_ind] ); // Q15 + Qx - acc = L_mac0( acc, *IZ2--, t_sin[c2_ind] ); // Q15 + Qx - *IY-- = round_fx( acc ); // Qx - 1 + acc = L_shl_sat( *IZ0--, 15 ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ1++, t_sin[s1_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *IZ1--, t_sin[c1_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ2++, t_sin[s2_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *IZ2--, t_sin[c2_ind] ); // Q15 + Qx + *IY-- = round_fx( acc ); // Qx - 1 move16(); c1_ind = add( c1_ind, c1_step ); @@ -2362,20 +2348,20 @@ void fft3_fx( const Word16 X[] /*Qx*/, Word16 Y[] /*Qx*/, const Word16 n ) l = shr( m, 3 ); /* (4*m/8) - (3*m/8) = m/8 */ FOR( i = 0; i < l; i++ ) { - acc = L_shl( *RZ0++, 15 ); // Q15 + Qx - acc = L_mac0( acc, *RZ1, t_sin[c1_ind] ); /* Non-fractional mode gains 1 more bit headroom. Q15 + Qx*/ - acc = L_mac0( acc, *IZ1, t_sin[s1_ind] ); // Q15 + Qx - acc = L_msu0( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx - acc = L_mac0( acc, *IZ2, t_sin[s2_ind] ); // Q15 + Qx - *RY++ = round_fx( acc ); // Qx - 1 + acc = L_shl_sat( *RZ0++, 15 ); // Q15 + Qx + acc = L_mac0_sat( acc, *RZ1, t_sin[c1_ind] ); /* Non-fractional mode gains 1 more bit headroom. Q15 + Qx*/ + acc = L_mac0_sat( acc, *IZ1, t_sin[s1_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *IZ2, t_sin[s2_ind] ); // Q15 + Qx + *RY++ = round_fx( acc ); // Qx - 1 move16(); - acc = L_shl( *IZ0--, 15 ); // Q15 + Qx - acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); // Q15 + Qx - acc = L_mac0( acc, *IZ1--, t_sin[c1_ind] ); // Q15 + Qx - acc = L_msu0( acc, *RZ2++, t_sin[s2_ind] ); // Q15 + Qx - acc = L_msu0( acc, *IZ2--, t_sin[c2_ind] ); // Q15 + Qx - *IY-- = round_fx( acc ); // Qx - 1 + acc = L_shl_sat( *IZ0--, 15 ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ1++, t_sin[s1_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *IZ1--, t_sin[c1_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ2++, t_sin[s2_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *IZ2--, t_sin[c2_ind] ); // Q15 + Qx + *IY-- = round_fx( acc ); // Qx - 1 move16(); c1_ind = add( c1_ind, c1_step ); @@ -2385,10 +2371,10 @@ void fft3_fx( const Word16 X[] /*Qx*/, Word16 Y[] /*Qx*/, const Word16 n ) } /* special case: i = m/2 i.e. 1/3 */ - acc = L_shl( *RZ0--, 15 ); // Q15 + Qx - acc = L_mac0( acc, *RZ1, t_sin[c1_ind] ); // Q15 + Qx - acc = L_msu0( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx - *RY++ = round_fx( acc ); // Qx - 1 + acc = L_shl_sat( *RZ0--, 15 ); // Q15 + Qx + acc = L_mac0_sat( acc, *RZ1, t_sin[c1_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx + *RY++ = round_fx( acc ); // Qx - 1 move16(); acc = 0; @@ -2410,20 +2396,20 @@ void fft3_fx( const Word16 X[] /*Qx*/, Word16 Y[] /*Qx*/, const Word16 n ) l = sub( shr( m, 2 ), 1 ); /* (6*m/8) - ((m/2)+1) = m/4 - 1 */ FOR( i = 0; i < l; i++ ) { - acc = L_shl( *RZ0--, 15 ); // Q15 + Qx - acc = L_mac0( acc, *RZ1, t_sin[c1_ind] ); /* Non-fractional mode gains 1 more bit headroom. Q15 + Qx*/ - acc = L_msu0( acc, *IZ1, t_sin[s1_ind] ); // Q15 + Qx - acc = L_msu0( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx - acc = L_msu0( acc, *IZ2, t_sin[s2_ind] ); // Q15 + Qx - *RY++ = round_fx( acc ); // Qx - 1 + acc = L_shl_sat( *RZ0--, 15 ); // Q15 + Qx + acc = L_mac0_sat( acc, *RZ1, t_sin[c1_ind] ); /* Non-fractional mode gains 1 more bit headroom. Q15 + Qx*/ + acc = L_msu0_sat( acc, *IZ1, t_sin[s1_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *IZ2, t_sin[s2_ind] ); // Q15 + Qx + *RY++ = round_fx( acc ); // Qx - 1 move16(); - acc = L_mult0( *IZ0++, -32768 ); // Q15 + Qx - acc = L_msu0( acc, *RZ1--, t_sin[s1_ind] ); // Q15 + Qx - acc = L_msu0( acc, *IZ1++, t_sin[c1_ind] ); // Q15 + Qx - acc = L_msu0( acc, *RZ2--, t_sin[s2_ind] ); // Q15 + Qx - acc = L_mac0( acc, *IZ2++, t_sin[c2_ind] ); // Q15 + Qx - *IY-- = round_fx( acc ); // Qx - 1 + acc = L_mult0( *IZ0++, -32768 ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ1--, t_sin[s1_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *IZ1++, t_sin[c1_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ2--, t_sin[s2_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *IZ2++, t_sin[c2_ind] ); // Q15 + Qx + *IY-- = round_fx( acc ); // Qx - 1 move16(); c1_ind = add( c1_ind, c1_step ); @@ -2437,20 +2423,20 @@ void fft3_fx( const Word16 X[] /*Qx*/, Word16 Y[] /*Qx*/, const Word16 n ) l = shr( m, 2 ); FOR( i = 0; i < l; i++ ) { - acc = L_shl( *RZ0--, 15 ); // Q15 + Qx - acc = L_msu0( acc, *RZ1, t_sin[c1_ind] ); /* Non-fractional mode gains 1 more bit headroom. Q15 + Qx*/ - acc = L_msu0( acc, *IZ1, t_sin[s1_ind] ); // Q15 + Qx - acc = L_msu0( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx - acc = L_mac0( acc, *IZ2, t_sin[s2_ind] ); // Q15 + Qx - *RY++ = round_fx( acc ); // Qx - 1 + acc = L_shl_sat( *RZ0--, 15 ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ1, t_sin[c1_ind] ); /* Non-fractional mode gains 1 more bit headroom. Q15 + Qx*/ + acc = L_msu0_sat( acc, *IZ1, t_sin[s1_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *IZ2, t_sin[s2_ind] ); // Q15 + Qx + *RY++ = round_fx( acc ); // Qx - 1 move16(); - acc = L_mult0( *IZ0++, -32768 ); // Q15 + Qx - acc = L_msu0( acc, *RZ1--, t_sin[s1_ind] ); // Q15 + Qx - acc = L_mac0( acc, *IZ1++, t_sin[c1_ind] ); // Q15 + Qx - acc = L_mac0( acc, *RZ2--, t_sin[s2_ind] ); // Q15 + Qx - acc = L_mac0( acc, *IZ2++, t_sin[c2_ind] ); // Q15 + Qx - *IY-- = round_fx( acc ); // Qx - 1 + acc = L_mult0( *IZ0++, -32768 ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ1--, t_sin[s1_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *IZ1++, t_sin[c1_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *RZ2--, t_sin[s2_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *IZ2++, t_sin[c2_ind] ); // Q15 + Qx + *IY-- = round_fx( acc ); // Qx - 1 move16(); c1_ind = sub( c1_ind, c1_step ); @@ -2460,16 +2446,16 @@ void fft3_fx( const Word16 X[] /*Qx*/, Word16 Y[] /*Qx*/, const Word16 n ) } /* special case: i = m, i.e 2/3 */ - acc = L_shl( *RZ0++, 15 ); // Q15 + Qx - acc = L_msu0( acc, *RZ1, t_sin[c1_ind] ); // Q15 + Qx - acc = L_msu0( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx - *RY++ = round_fx( acc ); // Qx - 1 + acc = L_shl_sat( *RZ0++, 15 ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ1, t_sin[c1_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx + *RY++ = round_fx( acc ); // Qx - 1 move16(); acc = L_deposit_l( 0 ); - acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); // Q15 + Qx - acc = L_mac0( acc, *RZ2++, t_sin[s2_ind] ); // Q15 + Qx - *IY-- = round_fx( acc ); // Qx - 1 + acc = L_msu0_sat( acc, *RZ1++, t_sin[s1_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *RZ2++, t_sin[s2_ind] ); // Q15 + Qx + *IY-- = round_fx( acc ); // Qx - 1 move16(); IZ0--; /* Just decrement the address counter */ IZ1--; @@ -2484,20 +2470,20 @@ void fft3_fx( const Word16 X[] /*Qx*/, Word16 Y[] /*Qx*/, const Word16 n ) l = sub( shr( m, 3 ), 1 ); /* (9*m/8) - (m +1) = m/8 - 1 */ FOR( i = 0; i < l; i++ ) { - acc = L_shl( *RZ0++, 15 ); // Q15 + Qx - acc = L_msu0( acc, *RZ1, t_sin[c1_ind] ); /* Non-fractional mode gains 1 more bit headroom. Q15 + Qx*/ - acc = L_mac0( acc, *IZ1, t_sin[s1_ind] ); // Q15 + Qx - acc = L_msu0( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx - acc = L_msu0( acc, *IZ2, t_sin[s2_ind] ); // Q15 + Qx - *RY++ = round_fx( acc ); // Qx - 1 + acc = L_shl_sat( *RZ0++, 15 ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ1, t_sin[c1_ind] ); /* Non-fractional mode gains 1 more bit headroom. Q15 + Qx*/ + acc = L_mac0_sat( acc, *IZ1, t_sin[s1_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *IZ2, t_sin[s2_ind] ); // Q15 + Qx + *RY++ = round_fx( acc ); // Qx - 1 move16(); - acc = L_shl( *IZ0--, 15 ); // Q15 + Qx - acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); // Q15 + Qx - acc = L_msu0( acc, *IZ1--, t_sin[c1_ind] ); // Q15 + Qx - acc = L_mac0( acc, *RZ2++, t_sin[s2_ind] ); // Q15 + Qx - acc = L_msu0( acc, *IZ2--, t_sin[c2_ind] ); // Q15 + Qx - *IY-- = round_fx( acc ); // Qx - 1 + acc = L_shl_sat( *IZ0--, 15 ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ1++, t_sin[s1_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *IZ1--, t_sin[c1_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *RZ2++, t_sin[s2_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *IZ2--, t_sin[c2_ind] ); // Q15 + Qx + *IY-- = round_fx( acc ); // Qx - 1 move16(); c1_ind = sub( c1_ind, c1_step ); @@ -2510,20 +2496,20 @@ void fft3_fx( const Word16 X[] /*Qx*/, Word16 Y[] /*Qx*/, const Word16 n ) l = shr( n, 3 ); /* (12*m/8) - (9*m/8) = 3*m/8 = n/8 */ FOR( i = 0; i < l; i++ ) { - acc = L_shl( *RZ0++, 15 ); // Q15 + Qx - acc = L_msu0( acc, *RZ1, t_sin[c1_ind] ); /* Non-fractional mode gains 1 more bit headroom. Q15 + Qx*/ - acc = L_mac0( acc, *IZ1, t_sin[s1_ind] ); // Q15 + Qx - acc = L_mac0( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx - acc = L_msu0( acc, *IZ2, t_sin[s2_ind] ); // Q15 + Qx - *RY++ = round_fx( acc ); // Qx - 1 + acc = L_shl_sat( *RZ0++, 15 ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ1, t_sin[c1_ind] ); /* Non-fractional mode gains 1 more bit headroom. Q15 + Qx*/ + acc = L_mac0_sat( acc, *IZ1, t_sin[s1_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *IZ2, t_sin[s2_ind] ); // Q15 + Qx + *RY++ = round_fx( acc ); // Qx - 1 move16(); - acc = L_shl( *IZ0--, 15 ); // Q15 + Qx - acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); // Q15 + Qx - acc = L_msu0( acc, *IZ1--, t_sin[c1_ind] ); // Q15 + Qx - acc = L_mac0( acc, *RZ2++, t_sin[s2_ind] ); // Q15 + Qx - acc = L_mac0( acc, *IZ2--, t_sin[c2_ind] ); // Q15 + Qx - *IY-- = round_fx( acc ); // Qx - 1 + acc = L_shl_sat( *IZ0--, 15 ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ1++, t_sin[s1_ind] ); // Q15 + Qx + acc = L_msu0_sat( acc, *IZ1--, t_sin[c1_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *RZ2++, t_sin[s2_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *IZ2--, t_sin[c2_ind] ); // Q15 + Qx + *IY-- = round_fx( acc ); // Qx - 1 move16(); c1_ind = sub( c1_ind, c1_step ); @@ -2533,10 +2519,10 @@ void fft3_fx( const Word16 X[] /*Qx*/, Word16 Y[] /*Qx*/, const Word16 n ) } /* special case: i = 3*m/2 */ - acc = L_shl( *RZ0, 15 ); // Q15 + Qx - acc = L_msu0( acc, *RZ1, t_sin[c1_ind] ); // Q15 + Qx - acc = L_mac0( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx - *RY = round_fx( acc ); // Qx - 1 + acc = L_shl_sat( *RZ0, 15 ); // Q15 + Qx + acc = L_msu0_sat( acc, *RZ1, t_sin[c1_ind] ); // Q15 + Qx + acc = L_mac0_sat( acc, *RZ2, t_sin[c2_ind] ); // Q15 + Qx + *RY = round_fx( acc ); // Qx - 1 move16(); return; diff --git a/lib_com/fft_rel.c b/lib_com/fft_rel.c deleted file mode 100644 index 1d020cabdd7d013f554eeb3d0a697e73682881d9..0000000000000000000000000000000000000000 --- a/lib_com/fft_rel.c +++ /dev/null @@ -1,878 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include "prot_fx.h" -#include "rom_com.h" -#include "wmc_auto.h" - -/*---------------------------------------------------------------------* - * Local constants - *---------------------------------------------------------------------*/ - -#define N_MAX_FFT 1024 -#define N_MAX_DIV2 ( N_MAX_FFT >> 1 ) -#define N_MAX_DIV4 ( N_MAX_DIV2 >> 1 ) -#define INV_SQR2_FX 23170 -#define N_MAX_SAS 256 -/*---------------------------------------------------------------------* - * fft_rel() - * - * Computes the split-radix FFT in place for the real-valued - * signal x of length n. The algorithm has been ported from - * the Fortran code of [1]. - * - * The function needs sine and cosine tables t_sin and t_cos, - * and the constant N_MAX_FFT. The table entries are defined as - * sin(2*pi*i) and cos(2*pi*i) for i = 0, 1, ..., N_MAX_FFT-1. The - * implementation assumes that any entry will not be needed - * outside the tables. Therefore, N_MAX_FFT and n must be properly - * set. The function has been tested with the values n = 16, - * 32, 64, 128, 256, and N_MAX_FFT = 1280. - * - * References - * [1] H.V. Sorensen, D.L. Jones, M.T. Heideman, C.S. Burrus, - * "Real-valued fast Fourier transform algorithm," IEEE - * Trans. on Signal Processing, Vol.35, No.6, pp 849-863, - * 1987. - * - * OUTPUT - * x[0:n-1] Transform coeffients in the order re[0], re[1], - * ..., re[n/2], im[n/2-1], ..., im[1]. - *---------------------------------------------------------------------*/ - -void fft_rel( - float x[], /* i/o: input/output vector */ - const int16_t n, /* i : vector length */ - const int16_t m /* i : log2 of vector length */ -) -{ - int16_t i, j, k, n1, n2, n4; - int16_t step; - float xt, t1, t2; - float *x0, *x1, *x2; - float *xi2, *xi3, *xi4, *xi1; - const float *s, *c; - const int16_t *idx; - - /* !!!! NMAX = 256 is hardcoded here (similar optimizations should be done for NMAX > 256) !!! */ - - float *x2even, *x2odd; - float temp[512]; - - if ( n == 128 || n == 256 || n == 512 ) - { - idx = fft256_read_indexes; - - /* Combined Digit reverse counter & Length two butterflies */ - if ( n == 128 ) - { - x2 = temp; - for ( i = 0; i < 64; i++ ) - { - j = *idx++; - k = *idx++; - - *x2++ = x[j >> 1] + x[k >> 1]; - *x2++ = x[j >> 1] - x[k >> 1]; - } - } - else if ( n == 256 ) - { - x2 = temp; - for ( i = 0; i < 128; i++ ) - { - j = *idx++; - k = *idx++; - - *x2++ = x[j] + x[k]; - *x2++ = x[j] - x[k]; - } - } - else if ( n == 512 ) - { - x2even = temp; - x2odd = temp + 256; - - for ( i = 0; i < 128; i++ ) - { - j = 2 * *idx++; - k = 2 * *idx++; - - *x2even++ = x[j] + x[k]; - *x2even++ = x[j] - x[k]; - *x2odd++ = x[++j] + x[++k]; - *x2odd++ = x[j] - x[k]; - } - } - - /*-----------------------------------------------------------------* - * 1st Stage Loop has been Unrolled because n4 is '1' and that - * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop - * and the associated pointers initialization. - * Also, it allows to Put the Data from 'temp' back into 'x' due - * to the previous Combined Digit Reverse and Length two butterflies - *-----------------------------------------------------------------*/ - - /*for_ (k = 2; k < 3; k++)*/ - { - x0 = temp; - x1 = x0 + 2; - x2 = x; - - for ( i = 0; i < n; i += 4 ) - { - *x2++ = *x0++ + *x1; /* x[i] = xt + x[i+n2]; */ - *x2++ = *x0; - *x2++ = *--x0 - *x1++; /* x[i+n2] = xt - x[i+n2]; */ - *x2++ = -*x1; /* x[i+n2+n4] = -x[i+n2+n4]; */ - - x0 += 4; - x1 += 3; /* x1 has already advanced */ - } - } - } - else - { - /*-----------------------------------------------------------------* - * Digit reverse counter - *-----------------------------------------------------------------*/ - - j = 0; - x0 = &x[0]; - for ( i = 0; i < n - 1; i++ ) - { - if ( i < j ) - { - xt = x[j]; - x[j] = *x0; - *x0 = xt; - } - x0++; - k = n / 2; - while ( k <= j ) - { - j -= k; - k = k >> 1; - } - j += k; - } - - /*-----------------------------------------------------------------* - * Length two butterflies - *-----------------------------------------------------------------*/ - - x0 = &x[0]; - x1 = &x[1]; - for ( i = 0; i < n / 2; i++ ) - { - *x1 = *x0 - *x1; - *x0 = *x0 * 2 - *x1; - - x0++; - x0++; - x1++; - x1++; - } - - /*-----------------------------------------------------------------* - * 1st Stage Loop has been Unrolled because n4 is '1' and that - * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop - * and the associated pointers initialization. - *-----------------------------------------------------------------*/ - - /* for_ (k = 2; k < 3; k++) */ - { - x0 = x; - x1 = x0 + 2; - - for ( i = 0; i < n; i += 4 ) - { - *x1 = *x0 - *x1; /* x[i+n2] = xt - x[i+n2]; */ - *x0 = *x0 * 2 - *x1++; /* x[i] = xt + x[i+n2]; */ - *x1 = -*x1; /* x[i+n2+n4] = -x[i+n2+n4]; */ - - x0 += 4; - x1 += 3; /* x1 has already advanced */ - } - } - } - - /*-----------------------------------------------------------------* - * Other butterflies - * - * The implementation described in [1] has been changed by using - * table lookup for evaluating sine and cosine functions. The - * variable ind and its increment step are needed to access table - * entries. Note that this implementation assumes n4 to be so - * small that ind will never exceed the table. Thus the input - * argument n and the constant N_MAX_FFT must be set properly. - *-----------------------------------------------------------------*/ - - n4 = 1; - n2 = 2; - n1 = 4; - - step = N_MAX_DIV4; - - for ( k = 3; k <= m; k++ ) - { - step >>= 1; - n4 <<= 1; - n2 <<= 1; - n1 <<= 1; - - x0 = x; - x1 = x0 + n2; - x2 = x1 + n4; - - for ( i = 0; i < n; i += n1 ) - { - *x1 = *x0 - *x1; /* x[i+n2] = xt - x[i+n2]; */ - *x0 = *x0 * 2 - *x1; /* x[i] = xt + x[i+n2]; */ - *x2 = -*x2; /* x[i+n2+n4] = -x[i+n2+n4]; */ - - s = sincos_t_ext; - c = s + N_MAX_FFT / 4; /* 1024/4 = 256, 256/4=64 */ - xi1 = x0; - xi3 = xi1 + n2; - xi2 = xi3; - x0 += n1; - xi4 = x0; - - for ( j = 1; j < n4; j++ ) - { - xi3++; - xi1++; - xi4--; - xi2--; - c += step; - s += step; /* autoincrement by ar0 */ - - t1 = *xi3 * *c + *xi4 * *s; /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); */ - t2 = *xi3 * *s - *xi4 * *c; /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); */ - - *xi4 = *xi2 - t2; - *xi2 = *xi1 - t1; - *xi1 = *xi1 * 2 - *xi2; - *xi3 = -2 * t2 - *xi4; - } - - x1 += n1; - x2 += n1; - } - } - - return; -} - -void fft_rel_16_32fx( - Word16 x[], /* i/o: input/output vector Qx */ - Word16 *q_x, /* extra scaling added on speech buffer*/ - Word16 i_subfr, - const Word16 n, /* i : vector length */ - const Word16 m /* i : log2 of vector length */ -) -{ - Word16 i, j, k, n1, n2, n4; - Word16 step; - Word32 xt, t1, t2; - Word32 *x0, *x1, *x2; - const Word16 *s, *c; - Word32 *xi2, *xi3, *xi4, *xi1; - - Word32 fft_bff32[L_FFT]; - Copy_Scale_sig_16_32_no_sat( x, fft_bff32, L_FFT, 0 ); // copying x to fft_bff32 without scaling - - /*-----------------------------------------------------------------* - * Digit reverse counter - *-----------------------------------------------------------------*/ - - j = 0; - move16(); - x0 = &fft_bff32[0]; // Qx - FOR( i = 0; i < n - 1; i++ ) - { - IF( LT_16( i, j ) ) - { - xt = fft_bff32[j]; // Qx - move32(); - fft_bff32[j] = *x0; // Qx - move32(); - *x0 = xt; // Qx - move32(); - } - x0++; - k = shr( n, 1 ); - WHILE( ( k <= j ) ) - { - j = sub( j, k ); - k = shr( k, 1 ); - } - j = add( j, k ); - } - - /*-----------------------------------------------------------------* - * Length two butterflies - *-----------------------------------------------------------------*/ - - x0 = &fft_bff32[0]; - x1 = &fft_bff32[1]; - FOR( i = 0; i < ( n >> 1 ); i++ ) - { - xt = *x0; - move32(); - *x0 = L_add( xt, *x1 ); - move32(); - *x1 = L_sub( xt, *x1 ); - move32(); - x0++; - x0++; - x1++; - x1++; - } - - /*-----------------------------------------------------------------* - * Other butterflies - * - * The implementation described in [1] has been changed by using - * table lookup for evaluating sine and cosine functions. The - * variable ind and its increment step are needed to access table - * entries. Note that this implementation assumes n4 to be so - * small that ind will never exceed the table. Thus the input - * argument n and the constant N_MAX_SAS must be set properly. - *-----------------------------------------------------------------*/ - - n2 = 1; - move16(); - /* step = N_MAX_SAS/4; */ - FOR( k = 2; k <= m; k++ ) - { - n4 = n2; - move16(); - n2 = shl( n4, 1 ); - n1 = shl( n2, 1 ); - - step = idiv1616( N_MAX_SAS, n1 ); - - x0 = fft_bff32; - x1 = fft_bff32 + n2; - x2 = fft_bff32 + add( n2, n4 ); - FOR( i = 0; i < n; i += n1 ) - { - xt = *x0; - move32(); /* xt = x[i]; */ - *x0 = L_add( xt, *x1 ); - move32(); /* x[i] = xt + x[i+n2]; */ - *x1 = L_sub( xt, *x1 ); - move32(); /* x[i+n2] = xt - x[i+n2]; */ - *x2 = L_negate( *x2 ); - move32(); /* x[i+n2+n4] = -x[i+n2+n4]; */ - - - s = sincos_t_fx + step; // Q15 - c = s + 64; // Q15 - xi1 = fft_bff32 + add( i, 1 ); - xi3 = xi1 + n2; - xi2 = xi3 - 2; - xi4 = xi1 + sub( n1, 2 ); - - FOR( j = 1; j < n4; j++ ) - { - t1 = L_add( Mpy_32_16_1( *xi3, *c ), Mpy_32_16_1( *xi4, *s ) ); /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); Qx */ - t2 = L_sub( Mpy_32_16_1( *xi3, *s ), Mpy_32_16_1( *xi4, *c ) ); /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); Qx */ - *xi4 = L_sub( *xi2, t2 ); - move32(); - *xi3 = L_negate( L_add( *xi2, t2 ) ); - move32(); - *xi2 = L_sub( *xi1, t1 ); - move32(); - *xi1 = L_add( *xi1, t1 ); - move32(); - - xi4--; - xi2--; - xi3++; - xi1++; - c += step; - s += step; /* autoincrement by ar0 */ - } - - x0 += n1; - x1 += n1; - x2 += n1; - } - /* step = shr(step, 1); */ - } - Word16 norm = L_norm_arr( fft_bff32, L_FFT ); - IF( i_subfr == 0 ) - { - Copy_Scale_sig32_16( fft_bff32, x, L_FFT, norm ); - *q_x = sub( norm, 16 ); - move16(); - } - ELSE - { - IF( LT_16( sub( norm, 16 ), *q_x ) ) - { - scale_sig( x - L_FFT, L_FFT, sub( sub( norm, 16 ), *q_x ) ); - Copy_Scale_sig32_16( fft_bff32, x, L_FFT, norm ); - *q_x = sub( norm, 16 ); - move16(); - } - ELSE - { - Copy_Scale_sig32_16( fft_bff32, x, L_FFT, add( 16, *q_x ) ); - } - } - - return; -} - -void fft_rel_fx( - Word16 x[], /* i/o: input/output vector Qx */ - const Word16 n, /* i : vector length */ - const Word16 m /* i : log2 of vector length */ -) -{ - Word16 i, j, k, n1, n2, n4; - Word16 step; - Word16 xt, t1, t2; - Word16 *x0, *x1, *x2; - const Word16 *s, *c; - Word16 *xi2, *xi3, *xi4, *xi1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - - /*-----------------------------------------------------------------* - * Digit reverse counter - *-----------------------------------------------------------------*/ - - j = 0; - move16(); - x0 = &x[0]; // Qx - move16(); - FOR( i = 0; i < n - 1; i++ ) - { - IF( LT_16( i, j ) ) - { - xt = x[j]; // Qx - move16(); - x[j] = *x0; // Qx - move16(); - *x0 = xt; // Qx - move16(); - } - x0++; - k = shr( n, 1 ); - WHILE( ( k <= j ) ) - { - j = sub( j, k ); - k = shr( k, 1 ); - } - j = add( j, k ); - } - - /*-----------------------------------------------------------------* - * Length two butterflies - *-----------------------------------------------------------------*/ - - x0 = &x[0]; - move16(); - x1 = &x[1]; - move16(); - FOR( i = 0; i < ( n >> 1 ); i++ ) - { - xt = *x0; - move16(); - *x0 = add_o( xt, *x1, &Overflow ); - move16(); - *x1 = sub_o( xt, *x1, &Overflow ); - move16(); - x0++; - x0++; - x1++; - x1++; - } - - /*-----------------------------------------------------------------* - * Other butterflies - * - * The implementation described in [1] has been changed by using - * table lookup for evaluating sine and cosine functions. The - * variable ind and its increment step are needed to access table - * entries. Note that this implementation assumes n4 to be so - * small that ind will never exceed the table. Thus the input - * argument n and the constant N_MAX_SAS must be set properly. - *-----------------------------------------------------------------*/ - - n2 = 1; - move16(); - /* step = N_MAX_SAS/4; */ - FOR( k = 2; k <= m; k++ ) - { - n4 = n2; - move16(); - n2 = shl( n4, 1 ); - n1 = shl( n2, 1 ); - - step = idiv1616( N_MAX_SAS, n1 ); - - x0 = x; - x1 = x + n2; - x2 = x + add( n2, n4 ); - FOR( i = 0; i < n; i += n1 ) - { - xt = *x0; - move16(); /* xt = x[i]; */ - *x0 = add_o( xt, *x1, &Overflow ); - move16(); /* x[i] = xt + x[i+n2]; */ - *x1 = sub_o( xt, *x1, &Overflow ); - move16(); /* x[i+n2] = xt - x[i+n2]; */ - *x2 = negate( *x2 ); - move16(); /* x[i+n2+n4] = -x[i+n2+n4]; */ - - - s = sincos_t_fx + step; // Q15 - c = s + 64; // Q15 - xi1 = x + add( i, 1 ); - xi3 = xi1 + n2; - xi2 = xi3 - 2; - xi4 = xi1 + sub( n1, 2 ); - - FOR( j = 1; j < n4; j++ ) - { - t1 = add_o( mult_r( *xi3, *c ), mult_r( *xi4, *s ), &Overflow ); /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); Qx */ - t2 = sub_o( mult_r( *xi3, *s ), mult_r( *xi4, *c ), &Overflow ); /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); Qx */ - *xi4 = sub_o( *xi2, t2, &Overflow ); - move16(); - *xi3 = negate( add_o( *xi2, t2, &Overflow ) ); - move16(); - *xi2 = sub_o( *xi1, t1, &Overflow ); - move16(); - *xi1 = add_o( *xi1, t1, &Overflow ); - move16(); - - xi4--; - xi2--; - xi3++; - xi1++; - c += step; - s += step; /* autoincrement by ar0 */ - } - - x0 += n1; - x1 += n1; - x2 += n1; - } - /* step = shr(step, 1); */ - } - - return; -} - -void fft_rel_fx32( - Word32 x[], /* i/o: input/output vector Qx */ - const Word16 n, /* i : vector length */ - const Word16 m /* i : log2 of vector length */ -) -{ - Word16 i, j, k, n1, n2, n4; - Word16 step; - Word32 xt, t1, t2; - Word32 *x0, *x1, *x2; - Word32 *xi2, *xi3, *xi4, *xi1; - const Word16 *s, *c; - const Word16 *idx; - - /* !!!! NMAX = 256 is hardcoded here (similar optimizations should be done for NMAX > 256) !!! */ - - Word32 *x2even, *x2odd; - Word32 temp[512]; - - test(); - test(); - IF( EQ_16( n, 128 ) || EQ_16( n, 256 ) || EQ_16( n, 512 ) ) - { - idx = fft256_read_indexes; - - /* Combined Digit reverse counter & Length two butterflies */ - IF( EQ_16( n, 128 ) ) - { - x2 = temp; - FOR( i = 0; i < 64; i++ ) - { - j = *idx++; - move16(); - k = *idx++; - move16(); - - *x2++ = L_add( x[( j >> 1 )], x[( k >> 1 )] ); // Qx - move16(); - *x2++ = L_sub( x[( j >> 1 )], x[( k >> 1 )] ); // Qx - move16(); - } - } - ELSE IF( EQ_16( n, 256 ) ) - { - x2 = temp; - FOR( i = 0; i < 128; i++ ) - { - j = *idx++; - move16(); - k = *idx++; - move16(); - - *x2++ = L_add( x[j], x[k] ); // Qx - move16(); - *x2++ = L_sub( x[j], x[k] ); // Qx - move16(); - } - } - ELSE IF( EQ_16( n, 512 ) ) - { - x2even = temp; - x2odd = temp + 256; - - FOR( i = 0; i < 128; i++ ) - { - j = shl( *idx, 1 ); - idx++; - k = shl( *idx, 1 ); - idx++; - - *x2even++ = L_add( x[j], x[k] ); // Qx - move16(); - *x2even++ = L_sub( x[j], x[k] ); // Qx - move16(); - j = add( j, 1 ); - k = add( k, 1 ); - *x2odd++ = L_add( x[j], x[k] ); // Qx - move16(); - *x2odd++ = L_sub( x[j], x[k] ); // Qx - move16(); - } - } - - /*-----------------------------------------------------------------* - * 1st Stage Loop has been Unrolled because n4 is '1' and that - * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop - * and the associated pointers initialization. - * Also, it allows to Put the Data from 'temp' back into 'x' due - * to the previous Combined Digit Reverse and Length two butterflies - *-----------------------------------------------------------------*/ - - /*for_ (k = 2; k < 3; k++)*/ - { - x0 = temp; - x1 = x0 + 2; - x2 = x; // Qx - - FOR( i = 0; i < n; i += 4 ) - { - *x2++ = L_add( *x0++, *x1 ); /* x[i] = xt + x[i+n2]; */ - move16(); - *x2++ = *x0; - move16(); - x0--; - *x2++ = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; */ - move16(); - x1++; - *x2++ = L_negate( *x1 ); /* x[i+n2+n4] = -x[i+n2+n4]; */ - move16(); - - x0 += 4; - x1 += 3; /* x1 has already advanced */ - } - } - } - ELSE - { - /*-----------------------------------------------------------------* - * Digit reverse counter - *-----------------------------------------------------------------*/ - - j = 0; - move16(); - x0 = &x[0]; // Qx - FOR( i = 0; i < ( n - 1 ); i++ ) - { - IF( LT_16( i, j ) ) - { - xt = x[j]; // Qx - move32(); - x[j] = *x0; - move32(); - *x0 = xt; - move32(); - } - x0++; - k = shr( n, 1 ); - WHILE( ( k <= j ) ) - { - j = sub( j, k ); - k = shr( k, 1 ); - } - j = add( j, k ); - } - - /*-----------------------------------------------------------------* - * Length two butterflies - *-----------------------------------------------------------------*/ - - x0 = &x[0]; // Qx - x1 = &x[1]; // Qx - FOR( i = 0; i < ( n >> 1 ); i++ ) - { - *x1 = L_sub( *x0, *x1 ); // Qx - move32(); - *x0 = L_sub( L_shl( *x0, 1 ), *x1 ); //*x0 * 2 - *x1 (Qx) - move32(); - - x0++; - x0++; - x1++; - x1++; - } - - /*-----------------------------------------------------------------* - * 1st Stage Loop has been Unrolled because n4 is '1' and that - * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop - * and the associated pointers initialization. - *-----------------------------------------------------------------*/ - - /* for_ (k = 2; k < 3; k++) */ - { - x0 = x; // Qx - x1 = x0 + 2; - - FOR( i = 0; i < n; i += 4 ) - { - *x1 = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; Qx*/ - move32(); - *x0 = L_sub( L_shl( *x0, 1 ), *x1++ ); /* x[i] = xt + x[i+n2]; */ /**x0 * 2 - *x1 (Qx)*/ - move32(); - *x1 = L_negate( *x1 ); /* x[i+n2+n4] = -x[i+n2+n4]; Qx*/ - move32(); - - x0 += 4; - x1 += 3; /* x1 has already advanced */ - } - } - } - - /*-----------------------------------------------------------------* - * Other butterflies - * - * The implementation described in [1] has been changed by using - * table lookup for evaluating sine and cosine functions. The - * variable ind and its increment step are needed to access table - * entries. Note that this implementation assumes n4 to be so - * small that ind will never exceed the table. Thus the input - * argument n and the constant N_MAX_FFT must be set properly. - *-----------------------------------------------------------------*/ - - n4 = 1; - move16(); - n2 = 2; - move16(); - n1 = 4; - move16(); - - step = N_MAX_DIV4; - move16(); - - FOR( k = 3; k <= m; k++ ) - { - step = shr( step, 1 ); - n4 = shl( n4, 1 ); - n2 = shl( n2, 1 ); - n1 = shl( n1, 1 ); - - x0 = x; - x1 = x0 + n2; - x2 = x1 + n4; - - FOR( i = 0; i < n; i += n1 ) - { - *x1 = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; */ - move32(); - *x0 = L_sub( L_shl( *x0, 1 ), *x1 ); /* x[i] = xt + x[i+n2]; */ /**x0 * 2 - *x1 (Qx)*/ - move32(); - *x2 = L_negate( *x2 ); /* x[i+n2+n4] = -x[i+n2+n4]; Qx */ - move32(); - - s = sincos_t_ext_fx; // Q15 - c = s + N_MAX_FFT / 4; /* 1024/4 = 256, 256/4=64 Q15*/ - xi1 = x0; - xi3 = xi1 + n2; - xi2 = xi3; - x0 += n1; - xi4 = x0; - - FOR( j = 1; j < n4; j++ ) - { - xi3++; - xi1++; - xi4--; - xi2--; - c += step; - s += step; /* autoincrement by ar0 */ - - t1 = L_add( Mpy_32_16_1( *xi3, *c ), Mpy_32_16_1( *xi4, *s ) ); /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); Qx*/ - t2 = L_sub( Mpy_32_16_1( *xi3, *s ), Mpy_32_16_1( *xi4, *c ) ); /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); Qx*/ - - *xi4 = L_sub( *xi2, t2 ); - move32(); - *xi2 = L_sub( *xi1, t1 ); - move32(); - *xi1 = L_sub( L_shl( *xi1, 1 ), *xi2 ); // Qx - move32(); - *xi3 = L_negate( L_add( L_shl( t2, 1 ), *xi4 ) ); // Qx - move32(); - } - - x1 += n1; - x2 += n1; - } - } - - return; -} diff --git a/lib_com/fft_rel_fx.c b/lib_com/fft_rel_fx.c index 5461ce55baae37f1bfdd25c36fac6607fd69e0c1..320bf4aa28db440d966d1943a6af3a2d0e8304c2 100644 --- a/lib_com/fft_rel_fx.c +++ b/lib_com/fft_rel_fx.c @@ -1,12 +1,25 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ +#include #include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "stl.h" #include "stdint.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define N_MAX_FFT 1024 +#define N_MAX_DIV2 ( N_MAX_FFT >> 1 ) +#define N_MAX_DIV4 ( N_MAX_DIV2 >> 1 ) +#define INV_SQR2_FX 23170 +#define N_MAX_SAS 256 + /*------------------------------------------------------------------ * * This is an implementation of decimation-in-time FFT algorithm for @@ -427,3 +440,605 @@ void r_fft_fx_lc( c_fft_fx( phs_tbl, SIZE, NUM_STAGE, temp, out_ptr, isign ); } } + + +/*---------------------------------------------------------------------* + * fft_rel() + * + * Computes the split-radix FFT in place for the real-valued + * signal x of length n. The algorithm has been ported from + * the Fortran code of [1]. + * + * The function needs sine and cosine tables t_sin and t_cos, + * and the constant N_MAX_FFT. The table entries are defined as + * sin(2*pi*i) and cos(2*pi*i) for i = 0, 1, ..., N_MAX_FFT-1. The + * implementation assumes that any entry will not be needed + * outside the tables. Therefore, N_MAX_FFT and n must be properly + * set. The function has been tested with the values n = 16, + * 32, 64, 128, 256, and N_MAX_FFT = 1280. + * + * References + * [1] H.V. Sorensen, D.L. Jones, M.T. Heideman, C.S. Burrus, + * "Real-valued fast Fourier transform algorithm," IEEE + * Trans. on Signal Processing, Vol.35, No.6, pp 849-863, + * 1987. + * + * OUTPUT + * x[0:n-1] Transform coeffients in the order re[0], re[1], + * ..., re[n/2], im[n/2-1], ..., im[1]. + *---------------------------------------------------------------------*/ + +void fft_rel_16_32fx( + Word16 x[], /* i/o: input/output vector Qx */ + Word16 *q_x, /* extra scaling added on speech buffer*/ + Word16 i_subfr, + const Word16 n, /* i : vector length */ + const Word16 m /* i : log2 of vector length */ +) +{ + Word16 i, j, k, n1, n2, n4; + Word16 step; + Word32 xt, t1, t2; + Word32 *x0, *x1, *x2; + const Word16 *s, *c; + Word32 *xi2, *xi3, *xi4, *xi1; + + Word32 fft_bff32[L_FFT]; + Copy_Scale_sig_16_32_no_sat( x, fft_bff32, L_FFT, 0 ); // copying x to fft_bff32 without scaling + + /*-----------------------------------------------------------------* + * Digit reverse counter + *-----------------------------------------------------------------*/ + + j = 0; + move16(); + x0 = &fft_bff32[0]; // Qx + FOR( i = 0; i < n - 1; i++ ) + { + IF( LT_16( i, j ) ) + { + xt = fft_bff32[j]; // Qx + move32(); + fft_bff32[j] = *x0; // Qx + move32(); + *x0 = xt; // Qx + move32(); + } + x0++; + k = shr( n, 1 ); + WHILE( ( k <= j ) ) + { + j = sub( j, k ); + k = shr( k, 1 ); + } + j = add( j, k ); + } + + /*-----------------------------------------------------------------* + * Length two butterflies + *-----------------------------------------------------------------*/ + + x0 = &fft_bff32[0]; + x1 = &fft_bff32[1]; + FOR( i = 0; i < ( n >> 1 ); i++ ) + { + xt = *x0; + move32(); + *x0 = L_add( xt, *x1 ); + move32(); + *x1 = L_sub( xt, *x1 ); + move32(); + x0++; + x0++; + x1++; + x1++; + } + + /*-----------------------------------------------------------------* + * Other butterflies + * + * The implementation described in [1] has been changed by using + * table lookup for evaluating sine and cosine functions. The + * variable ind and its increment step are needed to access table + * entries. Note that this implementation assumes n4 to be so + * small that ind will never exceed the table. Thus the input + * argument n and the constant N_MAX_SAS must be set properly. + *-----------------------------------------------------------------*/ + + n2 = 1; + move16(); + /* step = N_MAX_SAS/4; */ + FOR( k = 2; k <= m; k++ ) + { + n4 = n2; + move16(); + n2 = shl( n4, 1 ); + n1 = shl( n2, 1 ); + + step = idiv1616( N_MAX_SAS, n1 ); + + x0 = fft_bff32; + x1 = fft_bff32 + n2; + x2 = fft_bff32 + add( n2, n4 ); + FOR( i = 0; i < n; i += n1 ) + { + xt = *x0; + move32(); /* xt = x[i]; */ + *x0 = L_add( xt, *x1 ); + move32(); /* x[i] = xt + x[i+n2]; */ + *x1 = L_sub( xt, *x1 ); + move32(); /* x[i+n2] = xt - x[i+n2]; */ + *x2 = L_negate( *x2 ); + move32(); /* x[i+n2+n4] = -x[i+n2+n4]; */ + + + s = sincos_t_fx + step; // Q15 + c = s + 64; // Q15 + xi1 = fft_bff32 + add( i, 1 ); + xi3 = xi1 + n2; + xi2 = xi3 - 2; + xi4 = xi1 + sub( n1, 2 ); + + FOR( j = 1; j < n4; j++ ) + { + t1 = L_add( Mpy_32_16_1( *xi3, *c ), Mpy_32_16_1( *xi4, *s ) ); /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); Qx */ + t2 = L_sub( Mpy_32_16_1( *xi3, *s ), Mpy_32_16_1( *xi4, *c ) ); /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); Qx */ + *xi4 = L_sub( *xi2, t2 ); + move32(); + *xi3 = L_negate( L_add( *xi2, t2 ) ); + move32(); + *xi2 = L_sub( *xi1, t1 ); + move32(); + *xi1 = L_add( *xi1, t1 ); + move32(); + + xi4--; + xi2--; + xi3++; + xi1++; + c += step; + s += step; /* autoincrement by ar0 */ + } + + x0 += n1; + x1 += n1; + x2 += n1; + } + /* step = shr(step, 1); */ + } + Word16 norm = L_norm_arr( fft_bff32, L_FFT ); + IF( i_subfr == 0 ) + { + Copy_Scale_sig32_16( fft_bff32, x, L_FFT, norm ); + *q_x = sub( norm, 16 ); + move16(); + } + ELSE + { + IF( LT_16( sub( norm, 16 ), *q_x ) ) + { + scale_sig( x - L_FFT, L_FFT, sub( sub( norm, 16 ), *q_x ) ); + Copy_Scale_sig32_16( fft_bff32, x, L_FFT, norm ); + *q_x = sub( norm, 16 ); + move16(); + } + ELSE + { + Copy_Scale_sig32_16( fft_bff32, x, L_FFT, add( 16, *q_x ) ); + } + } + + return; +} + +void fft_rel_fx( + Word16 x[], /* i/o: input/output vector Qx */ + const Word16 n, /* i : vector length */ + const Word16 m /* i : log2 of vector length */ +) +{ + Word16 i, j, k, n1, n2, n4; + Word16 step; + Word16 xt, t1, t2; + Word16 *x0, *x1, *x2; + const Word16 *s, *c; + Word16 *xi2, *xi3, *xi4, *xi1; + Flag Overflow = 0; + move32(); + + + /*-----------------------------------------------------------------* + * Digit reverse counter + *-----------------------------------------------------------------*/ + + j = 0; + move16(); + x0 = &x[0]; // Qx + move16(); + FOR( i = 0; i < n - 1; i++ ) + { + IF( LT_16( i, j ) ) + { + xt = x[j]; // Qx + move16(); + x[j] = *x0; // Qx + move16(); + *x0 = xt; // Qx + move16(); + } + x0++; + k = shr( n, 1 ); + WHILE( ( k <= j ) ) + { + j = sub( j, k ); + k = shr( k, 1 ); + } + j = add( j, k ); + } + + /*-----------------------------------------------------------------* + * Length two butterflies + *-----------------------------------------------------------------*/ + + x0 = &x[0]; + move16(); + x1 = &x[1]; + move16(); + FOR( i = 0; i < ( n >> 1 ); i++ ) + { + xt = *x0; + move16(); + *x0 = add_o( xt, *x1, &Overflow ); + move16(); + *x1 = sub_o( xt, *x1, &Overflow ); + move16(); + x0++; + x0++; + x1++; + x1++; + } + + /*-----------------------------------------------------------------* + * Other butterflies + * + * The implementation described in [1] has been changed by using + * table lookup for evaluating sine and cosine functions. The + * variable ind and its increment step are needed to access table + * entries. Note that this implementation assumes n4 to be so + * small that ind will never exceed the table. Thus the input + * argument n and the constant N_MAX_SAS must be set properly. + *-----------------------------------------------------------------*/ + + n2 = 1; + move16(); + /* step = N_MAX_SAS/4; */ + FOR( k = 2; k <= m; k++ ) + { + n4 = n2; + move16(); + n2 = shl( n4, 1 ); + n1 = shl( n2, 1 ); + + step = idiv1616( N_MAX_SAS, n1 ); + + x0 = x; + x1 = x + n2; + x2 = x + add( n2, n4 ); + FOR( i = 0; i < n; i += n1 ) + { + xt = *x0; + move16(); /* xt = x[i]; */ + *x0 = add_o( xt, *x1, &Overflow ); + move16(); /* x[i] = xt + x[i+n2]; */ + *x1 = sub_o( xt, *x1, &Overflow ); + move16(); /* x[i+n2] = xt - x[i+n2]; */ + *x2 = negate( *x2 ); + move16(); /* x[i+n2+n4] = -x[i+n2+n4]; */ + + + s = sincos_t_fx + step; // Q15 + c = s + 64; // Q15 + xi1 = x + add( i, 1 ); + xi3 = xi1 + n2; + xi2 = xi3 - 2; + xi4 = xi1 + sub( n1, 2 ); + + FOR( j = 1; j < n4; j++ ) + { + t1 = add_o( mult_r( *xi3, *c ), mult_r( *xi4, *s ), &Overflow ); /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); Qx */ + t2 = sub_o( mult_r( *xi3, *s ), mult_r( *xi4, *c ), &Overflow ); /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); Qx */ + *xi4 = sub_o( *xi2, t2, &Overflow ); + move16(); + *xi3 = negate( add_o( *xi2, t2, &Overflow ) ); + move16(); + *xi2 = sub_o( *xi1, t1, &Overflow ); + move16(); + *xi1 = add_o( *xi1, t1, &Overflow ); + move16(); + + xi4--; + xi2--; + xi3++; + xi1++; + c += step; + s += step; /* autoincrement by ar0 */ + } + + x0 += n1; + x1 += n1; + x2 += n1; + } + /* step = shr(step, 1); */ + } + + return; +} + +void fft_rel_fx32( + Word32 x[], /* i/o: input/output vector Qx */ + const Word16 n, /* i : vector length */ + const Word16 m /* i : log2 of vector length */ +) +{ + Word16 i, j, k, n1, n2, n4; + Word16 step; + Word32 xt, t1, t2; + Word32 *x0, *x1, *x2; + Word32 *xi2, *xi3, *xi4, *xi1; + const Word16 *s, *c; + const Word16 *idx; + + /* !!!! NMAX = 256 is hardcoded here (similar optimizations should be done for NMAX > 256) !!! */ + + Word32 *x2even, *x2odd; + Word32 temp[512]; + + test(); + test(); + IF( EQ_16( n, 128 ) || EQ_16( n, 256 ) || EQ_16( n, 512 ) ) + { + idx = fft256_read_indexes; + + /* Combined Digit reverse counter & Length two butterflies */ + IF( EQ_16( n, 128 ) ) + { + x2 = temp; + FOR( i = 0; i < 64; i++ ) + { + j = *idx++; + move16(); + k = *idx++; + move16(); + + *x2++ = L_add( x[( j >> 1 )], x[( k >> 1 )] ); // Qx + move16(); + *x2++ = L_sub( x[( j >> 1 )], x[( k >> 1 )] ); // Qx + move16(); + } + } + ELSE IF( EQ_16( n, 256 ) ) + { + x2 = temp; + FOR( i = 0; i < 128; i++ ) + { + j = *idx++; + move16(); + k = *idx++; + move16(); + + *x2++ = L_add( x[j], x[k] ); // Qx + move16(); + *x2++ = L_sub( x[j], x[k] ); // Qx + move16(); + } + } + ELSE IF( EQ_16( n, 512 ) ) + { + x2even = temp; + x2odd = temp + 256; + + FOR( i = 0; i < 128; i++ ) + { + j = shl( *idx, 1 ); + idx++; + k = shl( *idx, 1 ); + idx++; + + *x2even++ = L_add( x[j], x[k] ); // Qx + move16(); + *x2even++ = L_sub( x[j], x[k] ); // Qx + move16(); + j = add( j, 1 ); + k = add( k, 1 ); + *x2odd++ = L_add( x[j], x[k] ); // Qx + move16(); + *x2odd++ = L_sub( x[j], x[k] ); // Qx + move16(); + } + } + + /*-----------------------------------------------------------------* + * 1st Stage Loop has been Unrolled because n4 is '1' and that + * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop + * and the associated pointers initialization. + * Also, it allows to Put the Data from 'temp' back into 'x' due + * to the previous Combined Digit Reverse and Length two butterflies + *-----------------------------------------------------------------*/ + + /*for_ (k = 2; k < 3; k++)*/ + { + x0 = temp; + x1 = x0 + 2; + x2 = x; // Qx + + FOR( i = 0; i < n; i += 4 ) + { + *x2++ = L_add( *x0++, *x1 ); /* x[i] = xt + x[i+n2]; */ + move16(); + *x2++ = *x0; + move16(); + x0--; + *x2++ = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; */ + move16(); + x1++; + *x2++ = L_negate( *x1 ); /* x[i+n2+n4] = -x[i+n2+n4]; */ + move16(); + + x0 += 4; + x1 += 3; /* x1 has already advanced */ + } + } + } + ELSE + { + /*-----------------------------------------------------------------* + * Digit reverse counter + *-----------------------------------------------------------------*/ + + j = 0; + move16(); + x0 = &x[0]; // Qx + FOR( i = 0; i < ( n - 1 ); i++ ) + { + IF( LT_16( i, j ) ) + { + xt = x[j]; // Qx + move32(); + x[j] = *x0; + move32(); + *x0 = xt; + move32(); + } + x0++; + k = shr( n, 1 ); + WHILE( ( k <= j ) ) + { + j = sub( j, k ); + k = shr( k, 1 ); + } + j = add( j, k ); + } + + /*-----------------------------------------------------------------* + * Length two butterflies + *-----------------------------------------------------------------*/ + + x0 = &x[0]; // Qx + x1 = &x[1]; // Qx + FOR( i = 0; i < ( n >> 1 ); i++ ) + { + *x1 = L_sub( *x0, *x1 ); // Qx + move32(); + *x0 = L_sub( L_shl( *x0, 1 ), *x1 ); //*x0 * 2 - *x1 (Qx) + move32(); + + x0++; + x0++; + x1++; + x1++; + } + + /*-----------------------------------------------------------------* + * 1st Stage Loop has been Unrolled because n4 is '1' and that + * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop + * and the associated pointers initialization. + *-----------------------------------------------------------------*/ + + /* for_ (k = 2; k < 3; k++) */ + { + x0 = x; // Qx + x1 = x0 + 2; + + FOR( i = 0; i < n; i += 4 ) + { + *x1 = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; Qx*/ + move32(); + *x0 = L_sub( L_shl( *x0, 1 ), *x1++ ); /* x[i] = xt + x[i+n2]; */ /**x0 * 2 - *x1 (Qx)*/ + move32(); + *x1 = L_negate( *x1 ); /* x[i+n2+n4] = -x[i+n2+n4]; Qx*/ + move32(); + + x0 += 4; + x1 += 3; /* x1 has already advanced */ + } + } + } + + /*-----------------------------------------------------------------* + * Other butterflies + * + * The implementation described in [1] has been changed by using + * table lookup for evaluating sine and cosine functions. The + * variable ind and its increment step are needed to access table + * entries. Note that this implementation assumes n4 to be so + * small that ind will never exceed the table. Thus the input + * argument n and the constant N_MAX_FFT must be set properly. + *-----------------------------------------------------------------*/ + + n4 = 1; + move16(); + n2 = 2; + move16(); + n1 = 4; + move16(); + + step = N_MAX_DIV4; + move16(); + + FOR( k = 3; k <= m; k++ ) + { + step = shr( step, 1 ); + n4 = shl( n4, 1 ); + n2 = shl( n2, 1 ); + n1 = shl( n1, 1 ); + + x0 = x; + x1 = x0 + n2; + x2 = x1 + n4; + + FOR( i = 0; i < n; i += n1 ) + { + *x1 = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; */ + move32(); + *x0 = L_sub( L_shl( *x0, 1 ), *x1 ); /* x[i] = xt + x[i+n2]; */ /**x0 * 2 - *x1 (Qx)*/ + move32(); + *x2 = L_negate( *x2 ); /* x[i+n2+n4] = -x[i+n2+n4]; Qx */ + move32(); + + s = sincos_t_ext_fx; // Q15 + c = s + N_MAX_FFT / 4; /* 1024/4 = 256, 256/4=64 Q15*/ + xi1 = x0; + xi3 = xi1 + n2; + xi2 = xi3; + x0 += n1; + xi4 = x0; + + FOR( j = 1; j < n4; j++ ) + { + xi3++; + xi1++; + xi4--; + xi2--; + c += step; + s += step; /* autoincrement by ar0 */ + + t1 = L_add( Mpy_32_16_1( *xi3, *c ), Mpy_32_16_1( *xi4, *s ) ); /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); Qx*/ + t2 = L_sub( Mpy_32_16_1( *xi3, *s ), Mpy_32_16_1( *xi4, *c ) ); /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); Qx*/ + + *xi4 = L_sub( *xi2, t2 ); + move32(); + *xi2 = L_sub( *xi1, t1 ); + move32(); + *xi1 = L_sub( L_shl( *xi1, 1 ), *xi2 ); // Qx + move32(); + *xi3 = L_negate( L_add( L_shl( t2, 1 ), *xi4 ) ); // Qx + move32(); + } + + x1 += n1; + x2 += n1; + } + } + + return; +} diff --git a/lib_com/fill_spectrum.c b/lib_com/fill_spectrum_fx.c similarity index 99% rename from lib_com/fill_spectrum.c rename to lib_com/fill_spectrum_fx.c index bd9080a7bd41747ba25f9a5cecce507c5ac55e63..6bf0af3035ae5e95d4fbe7dc67be8d6b5d30236e 100644 --- a/lib_com/fill_spectrum.c +++ b/lib_com/fill_spectrum_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/findpulse.c b/lib_com/findpulse_fx.c similarity index 98% rename from lib_com/findpulse.c rename to lib_com/findpulse_fx.c index 68853e06142c91523103ce2ae595215b69bbe61c..f30990c1eca577968540dfd1edb3cd7d7fcbae6e 100644 --- a/lib_com/findpulse.c +++ b/lib_com/findpulse_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/fine_gain_bits_fx.c b/lib_com/fine_gain_bits_fx.c index dd306f872344a86753e2db927bbd45c662389805..b6846372c6ee1434a1222e798335f46eb24439ca 100644 --- a/lib_com/fine_gain_bits_fx.c +++ b/lib_com/fine_gain_bits_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/float_to_fix_ops.c b/lib_com/float_to_fix_ops.c deleted file mode 100644 index 8b69e05e8811edbc273a3cd78e735d1bc0f99375..0000000000000000000000000000000000000000 --- a/lib_com/float_to_fix_ops.c +++ /dev/null @@ -1,297 +0,0 @@ -#include -#include -#include -#include -#include "options.h" -#include "prot_fx.h" -#define WMC_TOOL_SKIP - -Word32 floatToFixed( float f, Word16 Q ) -{ - Word64 result_32; - if ( f == 1.0f && Q == Q15 ) - return MAX16B; - if ( f == 1.0f && Q == Q31 ) - return MAXVAL_WORD32; - if ( Q < 0 ) - result_32 = (Word64) ( (float) ( f ) / (double) ( (unsigned Word64) 1 << ( -Q ) ) + ( f >= 0 ? 0.5 : -0.5 ) ); - else - result_32 = (Word64) ( f * (double) ( (unsigned Word64) 1 << Q ) + ( f >= 0 ? 0.5 : -0.5 ) ); - if ( result_32 > MAX_32 ) - return MAX_32; - if ( result_32 < MIN_32 ) - return MIN_32; - return (Word32) result_32; -} - - -float fixedToFloat( Word32 i, Word16 Q ) -{ - if ( Q < 0 ) - return ( i * (float) ( ( 1LL ) << ( -Q ) ) ); - else - return (float) ( i ) / (float) ( 1LL << Q ); -} -void floatToFixed_arrL( float *f, Word32 *i, Word16 Q, Word16 l ) -{ - for ( int j = 0; j < l; j++ ) - { - Word64 i64_val = floatToFixed( f[j], Q ); - IF( i64_val > MAX_32 ) - { - i64_val = MAX_32; - } - ELSE IF( i64_val < MIN_32 ) - { - i64_val = MIN_32; - } - i[j] = (Word32) i64_val; - } -} -void floatToFixed_arr16( float *f, Word16 *i, Word16 Q, Word16 l ) -{ - if ( Q <= 0 ) - { - floatToFixed_arr( f, i, Q, l ); - return; - } - for ( int j = 0; j < l; j++ ) - { - i[j] = float_to_fix16( f[j], Q ); - } -} -void floatToFixed_arr32( float *f, Word32 *i, Word16 Q, Word16 l ) -{ - if ( Q <= 0 ) - { - floatToFixed_arrL( f, i, Q, l ); - return; - } - for ( int j = 0; j < l; j++ ) - { - i[j] = float_to_fix( f[j], Q ); - } -} - -float fixedToFloat_16( Word16 i, Word16 Q ) -{ - if ( Q < 0 ) - return ( i * (float) ( ( (unsigned) 1 ) << ( -Q ) ) ); - else - return (float) ( i ) / (float) ( (unsigned int) 1 << Q ); -} -float fixedToFloat_32( Word32 number, Word16 Q ) -{ - float val = 0.0f; - assert( abs_s( Q ) <= 63 ); - if ( abs_s( Q ) > 31 ) - { - if ( Q > 0 ) - { - val = ( ( (float) number / ( 1 << ( Q - 31 ) ) ) / ( (unsigned int) MAX_32 + 1 ) ); - } - else - { - val = ( (float) number * ( 1 << ( -Q - 31 ) ) * (unsigned int) MIN_32 ); - } - } - else - { - val = fixedToFloat( number, Q ); - } - return val; -} - -Word32 floatToFixed_32( float number, Word16 Q ) -{ - float val = 0.0f; - assert( abs_s( Q ) <= 63 ); - if ( abs_s( Q ) > 31 ) - { - if ( Q > 0 ) - { - val = ( number * ( (unsigned int) MAX_32 + 1 ) ) * ( 1 << ( Q - 31 ) ); - } - else - { - val = ( number / ( 1 << ( -Q - 31 ) ) ) / (unsigned int) MIN_32; - } - if ( val >= 0.0f ) - { - assert( (Word32) val <= MAX_32 ); - } - else - { - assert( (Word32) val >= MIN_32 ); - } - } - else - { - return floatToFixed( number, Q ); - } - - return (Word32) val; -} - -void floatToFixed_arrL32( float *f, Word32 *i, Word16 Q, Word16 l ) -{ - for ( int j = 0; j < l; j++ ) - { - i[j] = floatToFixed_32( f[j], Q ); - } -} - -void fixedToFloat_arrL32( Word32 *i, float *f, Word16 Q, Word16 l ) -{ - for ( int j = 0; j < l; j++ ) - { - f[j] = fixedToFloat_32( i[j], Q ); - } -} - -void floatToFixed_arr( float *f, Word16 *i, Word16 Q, Word16 l ) -{ - for ( int j = 0; j < l; j++ ) - { - Word32 i32_val = floatToFixed( f[j], Q ); - IF( i32_val > MAX_16 ) - { - i32_val = MAX_16; - } - ELSE IF( i32_val < MIN_16 ) - { - i32_val = MIN_16; - } - i[j] = (Word16) i32_val; - } -} -void fixedToFloat_arrL( Word32 *i, float *f, Word16 Q, Word16 l ) -{ - for ( int j = 0; j < l; j++ ) - { - f[j] = fixedToFloat( i[j], Q ); - } -} -void fixedToFloat_arr( Word16 *i, float *f, Word16 Q, Word16 l ) -{ - for ( int j = 0; j < l; j++ ) - { - f[j] = fixedToFloat( i[j], Q ); - } -} -Word16 Q_factor( float x ) -{ - Word16 Q = 15; - if ( x >= 1 || x <= -1 ) - Q = norm_s( (Word16) L_abs( (Word32) x ) ); - return Q; -} -Word16 Q_factor_L( float x ) -{ - Word16 Q = 31; - if ( x >= 1 || x <= -1 ) - Q = norm_l( L_abs( (Word32) x ) ); - return Q; -} -Word16 Q_factor_L_32( Word32 x ) -{ - Word16 Q = 31; - if ( x >= 1 || x <= -1 ) - Q = norm_l( L_abs( (Word32) x ) ); - return Q; -} -Word16 Q_factor_arr( float *x, Word16 l ) -{ - Word16 Q = 15; - for ( int i = 0; i < l; i++ ) - { - if ( x[i] >= 1 || x[i] <= -1 ) - Q = s_min( Q, norm_s( (Word16) L_abs( (Word32) x[i] ) ) ); - } - return Q; -} -Word16 Q_factor_arrL( float *x, Word16 l ) -{ - Word16 Q = 31; - for ( int i = 0; i < l; i++ ) - { - if ( x[i] >= 1 || x[i] <= -1 ) - Q = s_min( Q, norm_l( (Word32) L_abs( (Word32) x[i] ) ) ); - } - return Q; -} - -Word16 L_get_q( float f ) -{ - if ( fabsf( f ) > (float) INT_MAX ) - { - return sub( sub( W_norm( (Word64) f ), 32 ), 0 ); - } - else - { - return sub( norm_l( (Word32) f ), 0 ); - } -} - -Word16 L_get_q_buf( float *ptr_flt, Word16 length ) -{ - Word16 k; - float ftemp = 0.0; - - for ( k = 0; k < length; k++ ) - { - if ( fabsf( ptr_flt[k] ) > ftemp ) - ftemp = fabsf( ptr_flt[k] ); - } - - if ( ftemp > (float) INT_MAX ) - { - return sub( sub( W_norm( (Word64) ftemp ), 32 ), 0 ); - } - else - { - return sub( norm_l( (Word32) ftemp ), 0 ); - } -} - -Word16 L_get_q1( float f ) -{ - if ( fabsf( f ) >= 0.f && fabsf( f ) < 1.f ) - { - return Q31; - } - else if ( fabsf( f ) > (float) INT_MAX ) - { - return sub( sub( W_norm( (Word64) f ), 32 ), 0 ); - } - else - { - return sub( norm_l( (Word32) f ), 0 ); - } -} - -Word16 L_get_q_buf1( float *ptr_flt, Word16 length ) -{ - Word16 k; - float ftemp = 0.0; - - for ( k = 0; k < length; k++ ) - { - if ( fabsf( ptr_flt[k] ) > ftemp ) - ftemp = fabsf( ptr_flt[k] ); - } - - if ( ftemp >= 0.f && ftemp < 1.f ) - { - return Q31; - } - else if ( ftemp > (float) INT_MAX ) - { - return sub( sub( W_norm( (Word64) ftemp ), 32 ), 0 ); - } - else - { - return sub( norm_l( (Word32) ftemp ), 0 ); - } -} -#undef WMC_TOOL_SKIP diff --git a/lib_com/frame_ener_fx.c b/lib_com/frame_ener_fx.c index 68fdf33c3a2db5ba8703f436ddc1e1043d17eef4..d63d7e79f9c285aefd267278798ce2d0d1c6cf5f 100644 --- a/lib_com/frame_ener_fx.c +++ b/lib_com/frame_ener_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -40,6 +40,7 @@ #include "cnst.h" #include "prot_fx.h" #include "wmc_auto.h" + /*----------------------------------------------------------------------------------* * fer_energy() * @@ -239,14 +240,9 @@ Word16 frame_energy_fx( /* o : Frame energy in Q8 const Word16 *pt1; Word16 tmp16, exp1, exp2, tmp1, tmp2; Word16 len, enern; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - /* len = (0.5f * (pitch[2]/64.0 + pitch[3]/64.0) + 0.5f) */ - len = mult_r( add_o( pitch[2], pitch[3], &Overflow ), 256 ); + len = mult_r( add_sat( pitch[2], pitch[3] ), 256 ); if ( LT_16( len, L_SUBFR ) ) { @@ -276,16 +272,16 @@ Word16 frame_energy_fx( /* o : Frame energy in Q8 exp1 = sub( 15 + exp1, tmp2 ); /*add ld(2^exp1)=exp1 but check format, first*/ - tmp16 = sub( sub( 15, norm_s( exp1 ) ), 5 ); /*factor to shift Ltmp and exp1 with (shr) to avoid overflows when adding*/ - Ltmp = L_shr_o( Ltmp, tmp16, &Overflow ); /*Q25, tmp16*/ - exp2 = shr( exp1, tmp16 ); /*Q0 , tmp16*/ - Ltmp = L_add_o( Ltmp, L_shl( L_deposit_l( exp2 ), 25 ), &Overflow ); /*Q25, tmp16, normalized*/ + tmp16 = sub( sub( 15, norm_s( exp1 ) ), 5 ); /*factor to shift Ltmp and exp1 with (shr) to avoid overflows when adding*/ + Ltmp = L_shr_sat( Ltmp, tmp16 ); /*Q25, tmp16*/ + exp2 = shr( exp1, tmp16 ); /*Q0 , tmp16*/ + Ltmp = L_add_sat( Ltmp, L_shl( L_deposit_l( exp2 ), 25 ) ); /*Q25, tmp16, normalized*/ /*make 10*log10 out of log2*/ - Ltmp = Mpy_32_16_1( Ltmp, LG10 ); /*Q25,tmp16 * Q13 = Q23, tmp16*/ - *frame_ener = extract_h( L_shl_o( Ltmp, add( tmp16, 1 ), &Overflow ) ); /*Q8*/ + Ltmp = Mpy_32_16_1( Ltmp, LG10 ); /*Q25,tmp16 * Q13 = Q23, tmp16*/ + *frame_ener = extract_h( L_shl_sat( Ltmp, add( tmp16, 1 ) ) ); /*Q8*/ move16(); - enern = sub_o( *frame_ener, lp_speech, &Overflow ); /*Q8*/ + enern = sub_sat( *frame_ener, lp_speech ); /*Q8*/ return enern; } diff --git a/lib_com/gain_inov_fx.c b/lib_com/gain_inov_fx.c index cd0d34290986934dfef02fd158202ad6c2dfe685..b97f399c072437b8f2b9a629226ec2669b7c1e75 100644 --- a/lib_com/gain_inov_fx.c +++ b/lib_com/gain_inov_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/get_gain_fx.c b/lib_com/get_gain_fx.c index 8ec4f5a40314afa27263cb7a4a77d8a31dd8d53c..7db540b1902e9f52e37b0ab86aab7da18db861ea 100644 --- a/lib_com/get_gain_fx.c +++ b/lib_com/get_gain_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -53,16 +53,10 @@ Word32 get_gain( /* output: codebook gain (adaptive or fixed) { Word32 tcorr, tener, Lgain; Word16 exp_c, exp_e, exp, tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - tcorr = L_deposit_l( 0 ); tener = L_deposit_l( 0 ); - /*----------------------------------------------------------------* * Find gain based on inter-correlation product *----------------------------------------------------------------*/ @@ -70,8 +64,8 @@ Word32 get_gain( /* output: codebook gain (adaptive or fixed) tcorr = Dot_product16HQ( 0, x, y, n, &exp_c ); tener = Dot_productSq16HQ( 0, y, n, &exp_e ); - BASOP_Util_Divide_MantExp( round_fx_o( tcorr, &Overflow ), exp_c, s_max( round_fx_o( tener, &Overflow ), 1 ), exp_e, &tmp, &exp ); - Lgain = L_shl_o( L_deposit_l( tmp ) /*Q15*/, add( 1, exp ), &Overflow ) /*Q16*/; + BASOP_Util_Divide_MantExp( round_fx_sat( tcorr ), exp_c, s_max( round_fx_sat( tener ), 1 ), exp_e, &tmp, &exp ); + Lgain = L_shl_sat( L_deposit_l( tmp ) /*Q15*/, add( 1, exp ) ) /*Q16*/; //?sat return Lgain; } @@ -84,10 +78,6 @@ Word32 get_gain2( /* output: codebook gain (adaptive or fixed) { Word32 tcorr, tener, Lgain; Word16 m_corr, m_ener, negative, Q_corr, Q_ener; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif negative = 0; move16(); @@ -130,13 +120,12 @@ Word32 get_gain2( /* output: codebook gain (adaptive or fixed) Q_corr = sub( Q_corr, Q_ener ); - Lgain = L_shl_o( L_deposit_l( m_corr ), add( Q_corr, 1 ), &Overflow ); /* Lgain in Q16 */ + Lgain = L_shl_sat( L_deposit_l( m_corr ), add( Q_corr, 1 ) ); /* Lgain in Q16 */ if ( negative != 0 ) { Lgain = L_negate( Lgain ); /* Lgain in Q16 */ } - return Lgain; } diff --git a/lib_com/gs_bitallocation_fx.c b/lib_com/gs_bitallocation_fx.c index 87ba794d46728dabaed82ef6287774aad7c09f14..77f974cac810e8b78fdc549a0b60092de77ec1a0 100644 --- a/lib_com/gs_bitallocation_fx.c +++ b/lib_com/gs_bitallocation_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -10,34 +10,34 @@ #include "stl.h" /*==================================================================================*/ -/* FUNCTION : void bands_and_bit_alloc_fx(); */ +/* FUNCTION : void bands_and_bit_alloc_fx(); */ /*----------------------------------------------------------------------------------*/ /* PURPOSE : AC mode (GSC) bands and bits allocation */ /*----------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) cor_strong_limit : HF correlation */ -/* _ (Word16) noise_lev : dwn scaling factor Q0 */ -/* _ (Word32) core_brate : core codec used Q0 */ -/* _ (Word16) Diff_len : Lenght of the difference signal Q0 */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) cor_strong_limit : HF correlation */ +/* _ (Word16) noise_lev : dwn scaling factor Q0 */ +/* _ (Word32) core_brate : core codec used Q0 */ +/* _ (Word16) Diff_len : Lenght of the difference signal Q0 */ /* _ (Word16) bits_used : Number of bit used before frequency Q0 */ -/* _ (Word16) idx : Energy band 14 Q0 */ -/* _ (Word16*) exc_diff : Difference signal to quantize (Encoder only) */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) bwidth : input signal bandwidth Q0 */ +/* _ (Word16) idx : Energy band 14 Q0 */ +/* _ (Word16*) exc_diff : Difference signal to quantize (Encoder only) */ +/* _ (Word16) coder_type : coding type Q0 */ +/* _ (Word16) bwidth : input signal bandwidth Q0 */ /*----------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) max_ener_band : Sorted order */ -/* _ (Word16*) nb_subbands : Number of subband allowed Q0 */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) max_ener_band : Sorted order */ +/* _ (Word16*) nb_subbands : Number of subband allowed Q0 */ /* _ (Word16*) concat_in : Concatened PVQ's input vector (Encoder Only) */ -/* _ (Word16*) pvq_len : Number of bin covered with the PVQ Q0 */ +/* _ (Word16*) pvq_len : Number of bin covered with the PVQ Q0 */ /*----------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16*) bit :Number of bit allowed for frequency quantization */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word16*) bit :Number of bit allowed for frequency quantization */ /* _ (Word16*) Ener_per_bd_iQ : Quantized energy vector Q13 */ /* _ (Word32*) bits_per_bands : Number of bit allowed per allowed subband Q18 */ /*----------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*==================================================================================*/ void bands_and_bit_alloc_fx( const Word16 cor_strong_limit, /* i : HF correlation */ @@ -75,13 +75,9 @@ void bands_and_bit_alloc_fx( Word16 SWB_bit_budget; Word32 bits_per_bands[MBANDS_GN_BITALLOC16k]; Word16 w_sum_bit; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) GSC_IVAS_mode; (void) element_mode; -#endif -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif + nb_tot_bands = MBANDS_GN; move16(); if ( EQ_16( L_frame, L_FRAME16k ) ) @@ -95,8 +91,8 @@ void bands_and_bit_alloc_fx( set16_fx( out_bits_per_bands, 0, MBANDS_GN_BITALLOC16k ); /* To adapt current energy band to PVQ freq band for sorting*/ - ener_vec[0] = add_o( Ener_per_bd_iQ[0], Ener_per_bd_iQ[1], &Overflow ); /*Q12 */ - Copy( Ener_per_bd_iQ_tmp + 1, ener_vec, MBANDS_GN - 1 ); /*Q12 */ + ener_vec[0] = add_sat( Ener_per_bd_iQ[0], Ener_per_bd_iQ[1] ); /*Q12 */ + Copy( Ener_per_bd_iQ_tmp + 1, ener_vec, MBANDS_GN - 1 ); /*Q12 */ ener_vec[MBANDS_GN - 1] = ener_vec[MBANDS_GN - 2]; move16(); IF( EQ_16( L_frame, L_FRAME16k ) ) diff --git a/lib_com/gs_bitallocation_ivas_fx.c b/lib_com/gs_bitallocation_ivas_fx.c index 9243f640e890348f577688a0dc77aff03e10a148..5d9516d2cf459f38294d726ea437ead5558cfe85 100644 --- a/lib_com/gs_bitallocation_ivas_fx.c +++ b/lib_com/gs_bitallocation_ivas_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -33,6 +33,7 @@ static void reajust_bits_fx( Word32 *bits_per_bands, const Word16 st_band, const #define Q31_0_02 42949673 /* 0.02 */ #define Q31_0_17 365072220 /* 0.17 */ #define Q31_0_23 493921239 /* 0.23 */ + /*-----------------------------------------------------------------* * Local functions *-----------------------------------------------------------------*/ @@ -40,34 +41,34 @@ static Word16 Find_norm_inv_fx( const Word32 ToDivide, Word16 *e_div ); static Word16 Find_bit_alloc_IVAS_fx( const Word32 core_brate, const Word16 GSC_IVAS_mode, const Word16 Diff_len, const Word16 nb_tot_bands, Word16 *bit, Word16 *max_ener_band, Word16 *ener_vec, Word32 *bits_per_bands ); static Word32 Find_bit_frac_fx( const Word16 nb_band, const Word16 remaining_bits ); /*==================================================================================*/ -/* FUNCTION : void bands_and_bit_alloc_ivas_fx(); */ +/* FUNCTION : void bands_and_bit_alloc_ivas_fx(); */ /*----------------------------------------------------------------------------------*/ /* PURPOSE : AC mode (GSC) bands and bits allocation */ /*----------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) cor_strong_limit : HF correlation */ -/* _ (Word16) noise_lev : dwn scaling factor Q0 */ -/* _ (Word32) core_brate : core codec used Q0 */ -/* _ (Word16) Diff_len : Lenght of the difference signal Q0 */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) cor_strong_limit : HF correlation */ +/* _ (Word16) noise_lev : dwn scaling factor Q0 */ +/* _ (Word32) core_brate : core codec used Q0 */ +/* _ (Word16) Diff_len : Lenght of the difference signal Q0 */ /* _ (Word16) bits_used : Number of bit used before frequency Q0 */ -/* _ (Word16) idx : Energy band 14 Q0 */ -/* _ (Word16*) exc_diff : Difference signal to quantize (Encoder only) */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) bwidth : input signal bandwidth Q0 */ +/* _ (Word16) idx : Energy band 14 Q0 */ +/* _ (Word16*) exc_diff : Difference signal to quantize (Encoder only) */ +/* _ (Word16) coder_type : coding type Q0 */ +/* _ (Word16) bwidth : input signal bandwidth Q0 */ /*----------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) max_ener_band : Sorted order */ -/* _ (Word16*) nb_subbands : Number of subband allowed Q0 */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) max_ener_band : Sorted order */ +/* _ (Word16*) nb_subbands : Number of subband allowed Q0 */ /* _ (Word16*) concat_in : Concatened PVQ's input vector (Encoder Only) */ -/* _ (Word16*) pvq_len : Number of bin covered with the PVQ Q0 */ +/* _ (Word16*) pvq_len : Number of bin covered with the PVQ Q0 */ /*----------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16*) bit :Number of bit allowed for frequency quantization */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word16*) bit :Number of bit allowed for frequency quantization */ /* _ (Word16*) Ener_per_bd_iQ : Quantized energy vector Q12 */ /* _ (Word32*) bits_per_bands : Number of bit allowed per allowed subband Q18 */ /*----------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*==================================================================================*/ void bands_and_bit_alloc_ivas_fx( const Word16 cor_strong_limit, /* i : HF correlation */ @@ -91,7 +92,6 @@ void bands_and_bit_alloc_ivas_fx( const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ ) { - Word16 bandoffset, i, j, nb_bands_max, bit_new_bands, bit_tmp, st_band, nb_bands; Word16 ener_vec[MBANDS_GN_BITALLOC16k]; /*Q12 */ Word16 nb_tot_bands = 16; @@ -105,9 +105,7 @@ void bands_and_bit_alloc_ivas_fx( Word32 bits_per_bands[MBANDS_GN_BITALLOC16k]; /* Q18 */ Word16 w_sum_bit; Word16 fzero_val; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif + nb_tot_bands = MBANDS_GN; move16(); if ( EQ_16( L_frame, L_FRAME16k ) ) @@ -120,7 +118,7 @@ void bands_and_bit_alloc_ivas_fx( set16_fx( out_bits_per_bands, 0, MBANDS_GN_BITALLOC16k ); /* To adapt current energy band to PVQ freq band for sorting*/ - ener_vec[0] = add_o( Ener_per_bd_iQ[0], Ener_per_bd_iQ[1], &Overflow ); /*Q12 */ + ener_vec[0] = add_sat( Ener_per_bd_iQ[0], Ener_per_bd_iQ[1] ); /*Q12 */ move16(); Copy( Ener_per_bd_iQ + 1, ener_vec, MBANDS_GN - 1 ); /*Q12 */ ener_vec[MBANDS_GN - 1] = ener_vec[MBANDS_GN - 2]; diff --git a/lib_com/gs_gains.c b/lib_com/gs_gains.c deleted file mode 100644 index 8fa7694755c7c5ac9f912f26abdff9211895ff07..0000000000000000000000000000000000000000 --- a/lib_com/gs_gains.c +++ /dev/null @@ -1,425 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include -#include "cnst.h" -#include "rom_com.h" -#include "prot_fx.h" -#include "wmc_auto.h" - -static void GSC_gain_DQ_fx( - const Word16 element_mode, /* i : element mode */ - const Word16 enc_dec, /* i : encoder/decoder flag */ - const Word16 coder_type, /* i : Coder type */ - const Word16 Mbands_gn, /* i : Number of band */ - const Word32 core_brate, /* i : Core bitrate */ - const Word16 mean_g, /* i : Average gain Q12 */ - const Word16 *Gain_in, /* i : Unquantized gain vector Q12 */ - Word16 *Gain_out /* o : Level adjusted unquantized gain vector Q12 */ -) -{ - Word16 Gain_off; - Word16 i; - - /* Gain adjustment to fit ACELP generic inactive coding gain at low rate */ - Gain_off = 0; - move16(); - - test(); - IF( coder_type == INACTIVE || EQ_16( coder_type, UNVOICED ) ) - { - test(); - IF( LE_32( core_brate, ACELP_5k00 ) && EQ_16( coder_type, UNVOICED ) ) - { - Gain_off = 1843; // 9/20 in Q12 - move16(); - } - ELSE IF( LE_32( core_brate, ACELP_7k20 ) ) - { - Gain_off = 1638; // 8/20 in Q12; /* 0 dB */ - move16(); - } - ELSE IF( LE_32( core_brate, ACELP_8k00 ) ) - { - Gain_off = 1351; // 6.6f/20 in Q12 /* ~-3.3 dB */ - move16(); - } - ELSE IF( LE_32( core_brate, ACELP_9k60 ) ) - { - Gain_off = 983; // 4.8f/20 in Q12 /* ~-2.4 dB */ - move16(); - } - ELSE IF( LE_32( core_brate, ACELP_11k60 ) ) - { - Gain_off = 717; // 3.5f/20 in Q12 /* ~-2.4 dB */ - move16(); - } - ELSE IF( LE_32( core_brate, ACELP_13k20 ) ) - { - Gain_off = 614; // 3.0f/20 in Q12 /* ~-2.4 dB */ - move16(); - } - } - - test(); - IF( coder_type != INACTIVE && NE_16( coder_type, UNVOICED ) ) - { - FOR( i = 0; i < Mbands_gn; i++ ) - { - Gain_out[i] = add( Gain_in[i], mean_g ); // Q12 - move16(); - } - } - ELSE - { - /*mimic ACELP decay of energy for low rates*/ - test(); - IF( element_mode == EVS_MONO && EQ_16( enc_dec, DEC ) ) - { - /* This is to keep EVS mono bit-exact with the standard (there might be a small desynchronization between encoder and decoder but there is no real quality or interop. issue) */ - FOR( i = 0; i < Mbands_gn; i++ ) - { - Gain_out[i] = add( Gain_out[i], sub( mean_g, mult( Gain_off, div_s( i, Mbands_gn ) ) ) ); // Q12 - move16(); - // Gain_out[i] += mean_g - i * ( Gain_off / 20.f ) / ( (float) Mbands_gn ); - } - } - ELSE - { - FOR( i = 0; i < Mbands_gn; i++ ) - { - Gain_out[i] = add( Gain_in[i], sub( mean_g, mult( Gain_off, div_s( i, Mbands_gn ) ) ) ); // Q12 - move16(); - // Gain_out[i] = Gain_in[i] + mean_g - ( i * ( Gain_off / 20.f ) / ( (float) Mbands_gn ) ); - } - } - } - - return; -} - -Word16 gsc_gainQ_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 y_gain4[], - /* i : Energy per band */ // Q12 - Word16 y_gainQ[], - /* o : quantized energy per band */ // Q12 - const Word32 core_brate, /* i : Core rate */ - const Word16 coder_type, /* i : coding type */ - const Word16 bwidth, /* i : input signal bandwidth */ - const Word16 L_frame, /* i : frame length */ - const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const Word32 core_brate_inp /* i : true core bitrate */ -) -{ - Word16 y_gain_tmp[MBANDS_GN16k]; - Word16 y_gain_tmp2[MBANDS_GN16k]; - Word16 i, idx_g = 0; - move16(); - Word16 mean_4g_fx[1], ftmp1_fx; - Word16 Mbands_gn = MBANDS_GN; - move16(); - Word16 y_gain_tmp3[MBANDS_GN]; - Word32 L_tmp; - - if ( EQ_16( L_frame, L_FRAME16k ) ) - { - Mbands_gn = MBANDS_GN16k; - move16(); - } - - mean_4g_fx[0] = 0; - move32(); - - test(); - test(); - IF( ( EQ_16( coder_type, AUDIO ) || coder_type == INACTIVE ) && bwidth == NB ) - { - L_tmp = 0; - move32(); - FOR( i = 0; i < 10; i++ ) - { - L_tmp = L_add( L_tmp, y_gain4[i] ); - } - L_tmp = L_sub( Mpy_32_16_1( L_tmp, 3277 /* (1/10.0f) in Q15 */ ), 2457 /* 0.6f in Q12 */ ); // Q12 - ftmp1_fx = extract_l( L_tmp ); - FOR( i = 0; i < Mbands_gn; i++ ) - { - IF( LT_16( y_gain4[i], ftmp1_fx ) ) - { - y_gain_tmp2[i] = ftmp1_fx; /*Q12*/ - } - ELSE - { - y_gain_tmp2[i] = y_gain4[i]; /*Q12*/ - } - move16(); - } - - /* Quantized mean gain without clipping */ - L_tmp = 0; - move32(); - FOR( i = 0; i < 10; i++ ) - { - L_tmp = L_add( L_tmp, y_gain4[i] ); - } - L_tmp = Mpy_32_16_1( L_tmp, 3277 /* (1/10.0f) in Q15 */ ); // Q12 - mean_4g_fx[0] = extract_l( L_tmp ); // Q12 - move16(); - idx_g = vquant_fx( mean_4g_fx, Gain_meanNB_fx, mean_4g_fx, Gain_mean_dicNB_fx, 1, 64 ); - push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); - - FOR( i = 0; i < Mbands_gn; i++ ) - { - y_gain_tmp[i] = sub( y_gain_tmp2[i], mean_4g_fx[0] ); // Q12 - move16(); - } - - if ( LT_16( y_gain_tmp[9], -1229 /* -0.3f in Q12 */ ) ) - { - y_gain_tmp[9] = -1229; /* -0.3f in Q12 */ - move16(); - } - - set16_fx( y_gain_tmp + 10, 0, MBANDS_GN - 10 ); - idx_g = vquant_fx( y_gain_tmp, Mean_dic_NB_fx, y_gain_tmp, Gain_dic1_NB_fx, 3, 64 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); - - IF( LT_32( core_brate, ACELP_9k60 ) ) - { - idx_g = vquant_fx( y_gain_tmp + 3, Mean_dic_NB_fx + 3, y_gain_tmp + 3, Gain_dic2_NB_fx, 3, 32 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); - - idx_g = vquant_fx( y_gain_tmp + 6, Mean_dic_NB_fx + 6, y_gain_tmp + 6, Gain_dic3_NB_fx, 4, 16 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); - } - ELSE - { - idx_g = vquant_fx( y_gain_tmp + 3, Mean_dic_NB_fx + 3, y_gain_tmp + 3, Gain_dic2_NBHR_fx, 3, 64 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); - - idx_g = vquant_fx( y_gain_tmp + 6, Mean_dic_NB_fx + 6, y_gain_tmp + 6, Gain_dic3_NBHR_fx, 4, 128 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); - } - - test(); - IF( LE_32( core_brate, ACELP_9k60 ) && coder_type == INACTIVE ) - { - /* Some energy is needed in high band for stat_noise_uv_enc() to be functional in inactive speech */ - y_gain_tmp[10] = mean_fx( y_gain_tmp + 6, 3 ); /*Q12*/ - move16(); - y_gain_tmp[11] = mean_fx( y_gain_tmp + 7, 3 ); /*Q12*/ - move16(); - y_gain_tmp[12] = mean_fx( y_gain_tmp + 8, 3 ); /*Q12*/ - move16(); - y_gain_tmp[13] = mean_fx( y_gain_tmp + 9, 3 ); /*Q12*/ - move16(); - y_gain_tmp[14] = mean_fx( y_gain_tmp + 10, 3 ); /*Q12*/ - move16(); - y_gain_tmp[15] = mean_fx( y_gain_tmp + 11, 3 ); /*Q12*/ - move16(); - } - ELSE - { - set16_fx( y_gain_tmp + 10, 0, MBANDS_GN - 10 ); - } - } - ELSE - { - L_tmp = 0; - move32(); - FOR( i = 0; i < 16; i++ ) - { - L_tmp = L_add( L_tmp, y_gain4[i] ); - } - L_tmp = Mpy_32_16_1( L_tmp, 2048 /* (1/16.f) in Q15 */ ); // Q12 - ftmp1_fx = extract_l( L_tmp ); - FOR( i = 0; i < Mbands_gn; i++ ) - { - IF( LT_16( y_gain4[i], sub( ftmp1_fx, 2457 /* 0.6 in Q12*/ ) ) ) - { - y_gain_tmp2[i] = sub( ftmp1_fx, 2457 /* 0.6 in Q12*/ ); - } - ELSE IF( GT_16( y_gain4[i], add( ftmp1_fx, 2457 /* 0.6 in Q12*/ ) ) ) - { - y_gain_tmp2[i] = add( ftmp1_fx, 2457 /* 0.6 in Q12*/ ); - } - ELSE - { - y_gain_tmp2[i] = y_gain4[i]; - } - move16(); - } - - L_tmp = 0; - move32(); - FOR( i = 0; i < 16; i++ ) - { - L_tmp = L_add( L_tmp, y_gain_tmp2[i] ); - } - L_tmp = Mpy_32_16_1( L_tmp, 2048 /* (1/16.f) in Q15 */ ); // Q12 - mean_4g_fx[0] = extract_l( L_tmp ); // Q12 - move16(); - idx_g = vquant_fx( mean_4g_fx, mean_m_fx, mean_4g_fx, mean_gain_dic_fx, 1, 64 ); - push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); - - /* Subtraction of the average gain */ - FOR( i = 0; i < Mbands_gn; i++ ) - { - y_gain_tmp[i] = sub( y_gain_tmp2[i], mean_4g_fx[0] ); // Q12 - move16(); - } - - IF( LT_32( core_brate, ACELP_9k60 ) ) - { - /* prediction and quantization of the average gain */ - - /*--------------------------------------------------------------------------------------* - * Quantization of the first 8 bands - * Keep only 4 bands out of the last 8 bands - *--------------------------------------------------------------------------------------*/ - - Copy( y_gain_tmp, y_gain_tmp2, 8 ); - - y_gain_tmp2[8] = y_gain_tmp[8]; - move16(); - y_gain_tmp2[9] = y_gain_tmp[10]; - move16(); - y_gain_tmp2[10] = y_gain_tmp[12]; - move16(); - y_gain_tmp2[11] = y_gain_tmp[14]; - move16(); - - idx_g = 0; - move16(); - idx_g = vquant_fx( y_gain_tmp2, YGain_mean_LR_fx, y_gain_tmp2, YGain_dic1_LR_fx, 3, 32 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); - - test(); - test(); - test(); - IF( !( coder_type == INACTIVE && tdm_LRTD_flag == 0 && EQ_16( idchan, 1 ) ) || GT_32( core_brate_inp, GSC_LRES_GAINQ_LIMIT ) ) - { - idx_g = vquant_fx( y_gain_tmp2 + 3, YGain_mean_LR_fx + 3, y_gain_tmp2 + 3, YGain_dic2_LR_fx, 4, 32 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); - - /*----------------------------------------------------------------------* - * Vector quantization of the first 8 bands + quantization of the 4 bands out of the last 8 - * Interpolation of the last 4 bands Q to create bands 8-16 - *----------------------------------------------------------------------*/ - - idx_g = vquant_fx( y_gain_tmp2 + 7, YGain_mean_LR_fx + 7, y_gain_tmp2 + 7, YGain_dic3_LR_fx, 5, 32 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); - - set16_fx( y_gain_tmp2 + 12, 0, MBANDS_GN - 12 ); - - /* Update to quantized vector */ - Copy( y_gain_tmp2, y_gain_tmp, 8 ); - - Copy( y_gain_tmp2 + 8, y_gain_tmp3, 4 ); - set16_fx( y_gain_tmp + 8, 0, 8 ); - fft_rel_fx( y_gain_tmp2 + 8, 4, 2 ); - - Copy( y_gain_tmp2 + 8, y_gain_tmp + 8, 3 ); - y_gain_tmp[15] = y_gain_tmp2[11]; - move16(); - ifft_rel_fx( y_gain_tmp + 8, 8, 3 ); - - FOR( i = 8; i < 16; i++ ) - { - y_gain_tmp[i] = shl( mult( y_gain_tmp[i], 23101 /* 1.41 in Q14 */ ), 1 ); /*Q12*/ - move16(); - } - - y_gain_tmp[8] = y_gain_tmp3[0]; - move16(); - y_gain_tmp[10] = y_gain_tmp3[1]; - move16(); - y_gain_tmp[12] = y_gain_tmp3[2]; - move16(); - y_gain_tmp[14] = y_gain_tmp3[3]; - move16(); - } - ELSE - { - Copy( y_gain_tmp2, y_gain_tmp, 3 ); - set16_fx( y_gain_tmp + 3, 0, MBANDS_GN16k - 3 ); - } - } - ELSE - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - idx_g = vquant_fx( y_gain_tmp, YG_mean16_fx, y_gain_tmp, YG_dicMR_1_fx, 4, 64 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); - - idx_g = vquant_fx( y_gain_tmp + 4, YG_mean16_fx + 4, y_gain_tmp + 4, YG_dicMR_2_fx, 4, 32 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); - - idx_g = vquant_fx( y_gain_tmp + 8, YG_mean16_fx + 8, y_gain_tmp + 8, YG_dicMR_3_fx, 4, 32 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); - - idx_g = vquant_fx( y_gain_tmp + 12, YG_mean16_fx + 12, y_gain_tmp + 12, YG_dicMR_4_fx, 4, 16 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); - } - ELSE - { - idx_g = vquant_fx( y_gain_tmp, YG_mean16HR_fx, y_gain_tmp, YG_dicHR_1_fx, 4, 128 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); - - idx_g = vquant_fx( y_gain_tmp + 4, YG_mean16HR_fx + 4, y_gain_tmp + 4, YG_dicHR_2_fx, 4, 64 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); - - idx_g = vquant_fx( y_gain_tmp + 8, YG_mean16HR_fx + 8, y_gain_tmp + 8, YG_dicHR_3_fx, 4, 64 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); - - idx_g = vquant_fx( y_gain_tmp + 12, YG_mean16HR_16kHz_fx, y_gain_tmp + 12, YG_dicHR_4_16kHz_fx, 4, 64 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); - - idx_g = vquant_fx( y_gain_tmp + 16, YG_meanL2G_16kHz_fx, y_gain_tmp + 16, YG_dicL2G_16kHz_fx, 2, 8 ); - push_indice( hBstr, IND_Y_GAIN_HF, idx_g, 3 ); - } - } - } - - GSC_gain_DQ_fx( element_mode, ENC, coder_type, Mbands_gn, core_brate, mean_4g_fx[0], y_gain_tmp, y_gainQ ); - - return mean_4g_fx[0]; -} diff --git a/lib_com/gs_gains_fx.c b/lib_com/gs_gains_fx.c index 35236b6032acbd590fb57c68e3063ca671292c21..8e29f34bdcf70cef927ad0cc76e2aad4fd2f8452 100644 --- a/lib_com/gs_gains_fx.c +++ b/lib_com/gs_gains_fx.c @@ -31,14 +31,17 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ +#include +#include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" #include "stl.h" +#include "wmc_auto.h" /*-------------------------------------------------------------------* * Local constants @@ -47,25 +50,26 @@ static Word16 VDQ_vec_fx( Word16 *Qvec_out_fx, const Word16 *mean_dic_fx, const Word16 *dic_fx, const Word16 index_fx, const Word16 vec_en_fx ); /*========================================================================*/ -/* FUNCTION : void Comp_and_apply_gain_enc_fx */ +/* FUNCTION : void Comp_and_apply_gain_enc_fx */ /*------------------------------------------------------------------------*/ /* PURPOSE : Compute and apply the quantized per band gain */ /*------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _ (Word16[]) Ener_per_bd_iQ : Target ener per band Q12 */ /*------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16[]) exc_diffQ : Quantized excitation Qexc */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word16[]) exc_diffQ : Quantized excitation Qexc */ /* _ (Word16[]) Ener_per_bd_yQ : Ener per band for norm vectori->Q12/o->Q2*/ /*------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ None */ +/* OUTPUT ARGUMENTS : */ +/* _ None */ /*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*========================================================================*/ + void Comp_and_apply_gain_fx( Word16 exc_diffQ[], /* i/o: Quantized excitation */ Word16 Ener_per_bd_iQ[], /* i : Target ener per band Q13 */ @@ -80,10 +84,6 @@ void Comp_and_apply_gain_fx( Word16 y_gain; Word16 L16, frac, exp1, tmp_exp; Word32 L32; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* Recreate excitation for local synthesis and decoder */ StartBin = 0; @@ -104,8 +104,8 @@ void Comp_and_apply_gain_fx( FOR( i = StartBin; i < NB_Qbins + StartBin; i++ ) { - L32 = L_shl_o( L_mult( exc_diffQ[i], y_gain ), tmp_exp, &Overflow ); /*Q_exc+16 */ - exc_diffQ[i] = round_fx_o( L32, &Overflow ); /*Q_exc */ + L32 = L_shl_sat( L_mult( exc_diffQ[i], y_gain ), tmp_exp ); /*Q_exc+16 */ + exc_diffQ[i] = round_fx_sat( L32 ); /*Q_exc */ move16(); } } @@ -122,14 +122,14 @@ void Comp_and_apply_gain_fx( y_gain = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ /* output of Pow2() will be: */ /* 16384 < Pow2() <= 32767 */ - Ener_per_bd_yQ[i_band] = shl_o( y_gain, sub( exp1, 13 ), &Overflow ); + Ener_per_bd_yQ[i_band] = shl_sat( y_gain, sub( exp1, 13 ) ); move16(); /*Q1 */ tmp_exp = add( add( exp1, 1 ), sub( Q_exc, Qexc_diff ) ); FOR( i = StartBin; i < NB_Qbins + StartBin; i++ ) { - L32 = L_mult( exc_diffQ[i], y_gain ); /*Qexc_diff+15 */ - exc_diffQ[i] = round_fx_o( L_shl_o( L32, tmp_exp, &Overflow ), &Overflow ); /*Q_exc */ + L32 = L_mult( exc_diffQ[i], y_gain ); /*Qexc_diff+15 */ + exc_diffQ[i] = round_fx_sat( L_shl_sat( L32, tmp_exp ) ); /*Q_exc */ move16(); } } @@ -153,10 +153,6 @@ void Comp_and_apply_gain_ivas_fx( Word16 L16, frac, exp1, tmp_exp; Word32 L32; Word16 Q_exc_diffQ[L_FRAME16k]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* Recreate excitation for local synthesis and decoder */ StartBin = 0; @@ -177,8 +173,8 @@ void Comp_and_apply_gain_ivas_fx( FOR( i = StartBin; i < NB_Qbins + StartBin; i++ ) { - L32 = L_mult( exc_diffQ[i], y_gain ); /*Q_exc+16-tmp_exp */ - exc_diffQ[i] = round_fx_o( L32, &Overflow ); /*Q_exc-tmp_exp */ + L32 = L_mult( exc_diffQ[i], y_gain ); /*Q_exc+16-tmp_exp */ + exc_diffQ[i] = round_fx_sat( L32 ); /*Q_exc-tmp_exp */ move16(); IF( exc_diffQ[i] ) { @@ -197,21 +193,21 @@ void Comp_and_apply_gain_ivas_fx( * y_gain = pow(10.0, (Ener_per_bd_iQ[i_band]-Ener_per_bd_yQ[i_band])) * = pow(2, 3.321928*(Ener_per_bd_iQ[i_band]-Ener_per_bd_yQ[i_band])) *-----------------------------------------------------------------*/ - L16 = sub_sat( Ener_per_bd_iQ[i_band], Ener_per_bd_yQ[i_band] ); /*Q12 */ - L32 = L_mult( L16, 27213 ); /* 3.321928 in Q13 -> Q26 */ - L32 = L_shr( L32, 10 ); /* From Q26 to Q16 */ - frac = L_Extract_lc( L32, &exp1 ); /* Extract exponent of gcode0 */ - y_gain = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - Ener_per_bd_yQ[i_band] = shl_o( y_gain, sub( exp1, 13 ), &Overflow ); /*Q13*/ - move16(); /*Q1 */ + L16 = sub_sat( Ener_per_bd_iQ[i_band], Ener_per_bd_yQ[i_band] ); /*Q12 */ + L32 = L_mult( L16, 27213 ); /* 3.321928 in Q13 -> Q26 */ + L32 = L_shr( L32, 10 ); /* From Q26 to Q16 */ + frac = L_Extract_lc( L32, &exp1 ); /* Extract exponent of gcode0 */ + y_gain = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ + /* output of Pow2() will be: */ + /* 16384 < Pow2() <= 32767 */ + Ener_per_bd_yQ[i_band] = shl_sat( y_gain, sub( exp1, 13 ) ); /*Q13*/ + move16(); /*Q1 */ tmp_exp = add( add( exp1, 1 ), sub( *Q_exc, Qexc_diff ) ); FOR( i = StartBin; i < NB_Qbins + StartBin; i++ ) { - L32 = L_mult( exc_diffQ[i], y_gain ); /*Qexc_diff+15 */ - exc_diffQ[i] = round_fx_o( L32, &Overflow ); /*Q_exc-tmp_exp */ + L32 = L_mult( exc_diffQ[i], y_gain ); /*Qexc_diff+15 */ + exc_diffQ[i] = round_fx_sat( L32 ); /*Q_exc-tmp_exp */ move16(); IF( exc_diffQ[i] ) { @@ -242,28 +238,29 @@ void Comp_and_apply_gain_ivas_fx( /*========================================================================*/ -/* FUNCTION : Ener_per_band_comp_fx() */ +/* FUNCTION : Ener_per_band_comp_fx() */ /*------------------------------------------------------------------------*/ /* PURPOSE : Compute the energy per band in log domain for quantization */ -/* purposes. */ -/* Loops are decomposed to accomodate the PVQ quantization */ +/* purposes. */ +/* Loops are decomposed to accomodate the PVQ quantization */ /*------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _ (Word16*) edct_table_128_fx : edct table Q15 */ /* _ (Word16*) Q_exc_diff : input format of exc_diff */ /*------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /*------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) y_gain4 : Energy per band to quantize Q12 */ -/* _ (Word32*) etmp14 : Energy band 14 Q_exc_diff*2+1 */ -/* _ (Word32*) etmp15 : Energy band 15 Q_exc_diff*2+1 */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) y_gain4 : Energy per band to quantize Q12 */ +/* _ (Word32*) etmp14 : Energy band 14 Q_exc_diff*2+1 */ +/* _ (Word32*) etmp15 : Energy band 15 Q_exc_diff*2+1 */ /*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*========================================================================*/ + static Word16 Comp_band_log_ener( /* o : Band gain Q12 */ const Word16 *pt_fx, /* i : Dct input Q_sc */ const Word16 Len, /* i : Lenght en energy accumulation */ @@ -284,7 +281,7 @@ static Word16 Comp_band_log_ener( /* o : Band gain Q12 */ void Ener_per_band_comp_fx( const Word16 exc_diff_fx[], /* i : target signal Q_exc_diff */ - Word16 y_gain4_fx[], /* o : Energy per band to quantize Q12 */ + Word16 y_gain4_fx[], /* o : Energy per band to quantize Q12 */ const Word16 Q_exc, /* i : frame length */ const Word16 Mband, /* i : Max band */ const Word16 Eflag /* i : flag of highest band */ @@ -320,7 +317,7 @@ void Ener_per_band_comp_fx( void Ener_per_band_comp_ivas_fx( const Word16 exc_diff_fx[], /* i : target signal Q_exc_diff */ - Word16 y_gain4_fx[], /* o : Energy per band to quantize Q12 */ + Word16 y_gain4_fx[], /* o : Energy per band to quantize Q12 */ const Word16 Q_exc, /* i : frame length */ const Word16 Mband, /* i : Max band */ const Word16 Eflag, /* i : flag of highest band */ @@ -363,127 +360,14 @@ void Ener_per_band_comp_ivas_fx( return; } -void Ener_per_band_comp_ivas_fx_2( - const Word16 exc_diff[], /* i : target signal Q_exc */ - Word16 y_gain4[], /* o : Energy per band to quantize Q12 */ - const Word16 Q_exc, - const Word16 Mband, /* i : Max band */ - const Word16 Eflag, /* i : flag of highest band */ - const Word16 L_frame /* i : frame length */ -) -{ - Word32 etmp, L_tmp; - Word16 etmp_e; - const Word16 *pt; - Word16 i, j, tmp; - tmp = add( shl( sub( Q15, Q_exc ), 1 ), 1 ); - - pt = exc_diff; - FOR( j = 0; j < 2; j++ ) - { - y_gain4[j] = 0; - move16(); - etmp = 42949673; /* 0.02 in Q31 */ - move32(); - etmp_e = 0; - move16(); - - pt = exc_diff + shl( j, 3 ); - FOR( i = 0; i < 8; i++ ) - { - etmp = BASOP_Util_Add_Mant32Exp( etmp, etmp_e, L_mult0( *pt, *pt ), tmp, &etmp_e ); - pt++; - } - - /* normalized to 16 bins to easy the quantization */ - etmp_e = add( etmp_e, 1 ); - etmp = Sqrt32( etmp, &etmp_e ); - etmp = BASOP_Util_Log10( etmp, etmp_e ); // Q25 - y_gain4[j] = extract_h( L_shl( etmp, 3 ) ); // Q12 - move16(); - } - - FOR( j = 1; j < Mband - 2; j++ ) - { - etmp = 21474836; /* 0.01 in Q31 */ - move32(); - etmp_e = 0; - move16(); - - pt = exc_diff + shl( j, 4 ); - FOR( i = 0; i < 16; i++ ) - { - etmp = BASOP_Util_Add_Mant32Exp( etmp, etmp_e, L_mult0( *pt, *pt ), tmp, &etmp_e ); - pt++; - } - - etmp = Sqrt32( etmp, &etmp_e ); - etmp = BASOP_Util_Log10( etmp, etmp_e ); // Q25 - y_gain4[j + 1] = extract_h( L_shl( etmp, 3 ) ); // Q12 - move16(); - } - - IF( EQ_16( Eflag, 1 ) ) - { - etmp = 21474836; /* 0.01 in Q31 */ - move32(); - etmp_e = 0; - move16(); - - pt = exc_diff + shl( j, 4 ); - FOR( i = 0; i < 32; i++ ) - { - etmp = BASOP_Util_Add_Mant32Exp( etmp, etmp_e, L_mult0( *pt, *pt ), tmp, &etmp_e ); - pt++; - } - - etmp_e = sub( etmp_e, 1 ); - etmp = Sqrt32( etmp, &etmp_e ); - etmp = BASOP_Util_Log10( etmp, etmp_e ); // Q25 - y_gain4[j + 1] = extract_h( L_shl( etmp, 3 ) ); // Q12 - move16(); - } - - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - etmp = 21474836; /* 0.01 in Q31 */ - move32(); - etmp_e = 0; - move16(); - - FOR( i = 0; i < 32; i++ ) - { - etmp = BASOP_Util_Add_Mant32Exp( etmp, etmp_e, L_mult0( *pt, *pt ), tmp, &etmp_e ); - pt++; - } - - Word16 tmp2 = sub( etmp_e, 1 ); - L_tmp = Sqrt32( etmp, &tmp2 ); - L_tmp = BASOP_Util_Log10( L_tmp, tmp2 ); // Q25 - y_gain4[j + 2] = extract_h( L_shl( L_tmp, 3 ) ); // Q12 - move16(); - - FOR( i = 0; i < 32; i++ ) - { - etmp = BASOP_Util_Add_Mant32Exp( etmp, etmp_e, L_mult0( *pt, *pt ), tmp, &etmp_e ); - pt++; - } - - etmp_e = sub( etmp_e, 1 ); - etmp = Sqrt32( etmp, &etmp_e ); - etmp = BASOP_Util_Log10( etmp, etmp_e ); // Q25 - y_gain4[j + 3] = extract_h( L_shl( etmp, 3 ) ); // Q12 - move16(); - } - return; -} /*-------------------------------------------------------------------* * gsc_gainQ() * * Quantization of the energy per band *-------------------------------------------------------------------*/ + static void GSC_gain_adj( const Word16 coder_type, /* i : Coder type */ const Word32 core_brate, /* i : Bit rate */ @@ -550,11 +434,13 @@ static void GSC_gain_adj( return; } + /*-------------------------------------------------------------------* * GSC_gain_adj_ivas_fx() * * Quantization of the energy per band *-------------------------------------------------------------------*/ + static void GSC_gain_adj_ivas_fx( const Word16 coder_type, /* i : Coder type */ const Word16 Mbands_gn, /* i : Number of band */ @@ -629,26 +515,425 @@ static void GSC_gain_adj_ivas_fx( return; } + +/*-------------------------------------------------------------------* + * GSC_gain_DQ() + * + * Form the final vector after gain quantization/Dequantization + * Common to both encoder and decoder + *-------------------------------------------------------------------*/ + +static void GSC_gain_DQ_fx( + const Word16 element_mode, /* i : element mode */ + const Word16 enc_dec, /* i : encoder/decoder flag */ + const Word16 coder_type, /* i : Coder type */ + const Word16 Mbands_gn, /* i : Number of band */ + const Word32 core_brate, /* i : Core bitrate */ + const Word16 mean_g, /* i : Average gain Q12 */ + const Word16 *Gain_in, /* i : Unquantized gain vector Q12 */ + Word16 *Gain_out /* o : Level adjusted unquantized gain vector Q12 */ +) +{ + Word16 Gain_off; + Word16 i; + + /* Gain adjustment to fit ACELP generic inactive coding gain at low rate */ + Gain_off = 0; + move16(); + + test(); + IF( coder_type == INACTIVE || EQ_16( coder_type, UNVOICED ) ) + { + test(); + IF( LE_32( core_brate, ACELP_5k00 ) && EQ_16( coder_type, UNVOICED ) ) + { + Gain_off = 1843; // 9/20 in Q12 + move16(); + } + ELSE IF( LE_32( core_brate, ACELP_7k20 ) ) + { + Gain_off = 1638; // 8/20 in Q12; /* 0 dB */ + move16(); + } + ELSE IF( LE_32( core_brate, ACELP_8k00 ) ) + { + Gain_off = 1351; // 6.6f/20 in Q12 /* ~-3.3 dB */ + move16(); + } + ELSE IF( LE_32( core_brate, ACELP_9k60 ) ) + { + Gain_off = 983; // 4.8f/20 in Q12 /* ~-2.4 dB */ + move16(); + } + ELSE IF( LE_32( core_brate, ACELP_11k60 ) ) + { + Gain_off = 717; // 3.5f/20 in Q12 /* ~-2.4 dB */ + move16(); + } + ELSE IF( LE_32( core_brate, ACELP_13k20 ) ) + { + Gain_off = 614; // 3.0f/20 in Q12 /* ~-2.4 dB */ + move16(); + } + } + + test(); + IF( coder_type != INACTIVE && NE_16( coder_type, UNVOICED ) ) + { + FOR( i = 0; i < Mbands_gn; i++ ) + { + Gain_out[i] = add( Gain_in[i], mean_g ); // Q12 + move16(); + } + } + ELSE + { + /*mimic ACELP decay of energy for low rates*/ + test(); + IF( element_mode == EVS_MONO && EQ_16( enc_dec, DEC ) ) + { + /* This is to keep EVS mono bit-exact with the standard (there might be a small desynchronization between encoder and decoder but there is no real quality or interop. issue) */ + FOR( i = 0; i < Mbands_gn; i++ ) + { + Gain_out[i] = add( Gain_out[i], sub( mean_g, mult( Gain_off, div_s( i, Mbands_gn ) ) ) ); // Q12 + move16(); + // Gain_out[i] += mean_g - i * ( Gain_off / 20.f ) / ( (float) Mbands_gn ); + } + } + ELSE + { + FOR( i = 0; i < Mbands_gn; i++ ) + { + Gain_out[i] = add( Gain_in[i], sub( mean_g, mult( Gain_off, div_s( i, Mbands_gn ) ) ) ); // Q12 + move16(); + // Gain_out[i] = Gain_in[i] + mean_g - ( i * ( Gain_off / 20.f ) / ( (float) Mbands_gn ) ); + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * gsc_gainQ() + * + * Quantization of the energy per band + *-------------------------------------------------------------------*/ + +Word16 gsc_gainQ_ivas_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 y_gain4[], + /* i : Energy per band */ // Q12 + Word16 y_gainQ[], + /* o : quantized energy per band */ // Q12 + const Word32 core_brate, /* i : Core rate */ + const Word16 coder_type, /* i : coding type */ + const Word16 bwidth, /* i : input signal bandwidth */ + const Word16 L_frame, /* i : frame length */ + const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const Word32 core_brate_inp /* i : true core bitrate */ +) +{ + Word16 y_gain_tmp[MBANDS_GN16k]; + Word16 y_gain_tmp2[MBANDS_GN16k]; + Word16 i, idx_g = 0; + move16(); + Word16 mean_4g_fx[1], ftmp1_fx; + Word16 Mbands_gn = MBANDS_GN; + move16(); + Word16 y_gain_tmp3[MBANDS_GN]; + Word32 L_tmp; + + if ( EQ_16( L_frame, L_FRAME16k ) ) + { + Mbands_gn = MBANDS_GN16k; + move16(); + } + + mean_4g_fx[0] = 0; + move32(); + + test(); + test(); + IF( ( EQ_16( coder_type, AUDIO ) || coder_type == INACTIVE ) && bwidth == NB ) + { + L_tmp = 0; + move32(); + FOR( i = 0; i < 10; i++ ) + { + L_tmp = L_add( L_tmp, y_gain4[i] ); + } + L_tmp = L_sub( Mpy_32_16_1( L_tmp, 3277 /* (1/10.0f) in Q15 */ ), 2457 /* 0.6f in Q12 */ ); // Q12 + ftmp1_fx = extract_l( L_tmp ); + FOR( i = 0; i < Mbands_gn; i++ ) + { + IF( LT_16( y_gain4[i], ftmp1_fx ) ) + { + y_gain_tmp2[i] = ftmp1_fx; /*Q12*/ + } + ELSE + { + y_gain_tmp2[i] = y_gain4[i]; /*Q12*/ + } + move16(); + } + + /* Quantized mean gain without clipping */ + L_tmp = 0; + move32(); + FOR( i = 0; i < 10; i++ ) + { + L_tmp = L_add( L_tmp, y_gain4[i] ); + } + L_tmp = Mpy_32_16_1( L_tmp, 3277 /* (1/10.0f) in Q15 */ ); // Q12 + mean_4g_fx[0] = extract_l( L_tmp ); // Q12 + move16(); + idx_g = vquant_fx( mean_4g_fx, Gain_meanNB_fx, mean_4g_fx, Gain_mean_dicNB_fx, 1, 64 ); + push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); + + FOR( i = 0; i < Mbands_gn; i++ ) + { + y_gain_tmp[i] = sub( y_gain_tmp2[i], mean_4g_fx[0] ); // Q12 + move16(); + } + + if ( LT_16( y_gain_tmp[9], -1229 /* -0.3f in Q12 */ ) ) + { + y_gain_tmp[9] = -1229; /* -0.3f in Q12 */ + move16(); + } + + set16_fx( y_gain_tmp + 10, 0, MBANDS_GN - 10 ); + idx_g = vquant_fx( y_gain_tmp, Mean_dic_NB_fx, y_gain_tmp, Gain_dic1_NB_fx, 3, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + IF( LT_32( core_brate, ACELP_9k60 ) ) + { + idx_g = vquant_fx( y_gain_tmp + 3, Mean_dic_NB_fx + 3, y_gain_tmp + 3, Gain_dic2_NB_fx, 3, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + idx_g = vquant_fx( y_gain_tmp + 6, Mean_dic_NB_fx + 6, y_gain_tmp + 6, Gain_dic3_NB_fx, 4, 16 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); + } + ELSE + { + idx_g = vquant_fx( y_gain_tmp + 3, Mean_dic_NB_fx + 3, y_gain_tmp + 3, Gain_dic2_NBHR_fx, 3, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant_fx( y_gain_tmp + 6, Mean_dic_NB_fx + 6, y_gain_tmp + 6, Gain_dic3_NBHR_fx, 4, 128 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); + } + + test(); + IF( LE_32( core_brate, ACELP_9k60 ) && coder_type == INACTIVE ) + { + /* Some energy is needed in high band for stat_noise_uv_enc() to be functional in inactive speech */ + y_gain_tmp[10] = mean_fx( y_gain_tmp + 6, 3 ); /*Q12*/ + move16(); + y_gain_tmp[11] = mean_fx( y_gain_tmp + 7, 3 ); /*Q12*/ + move16(); + y_gain_tmp[12] = mean_fx( y_gain_tmp + 8, 3 ); /*Q12*/ + move16(); + y_gain_tmp[13] = mean_fx( y_gain_tmp + 9, 3 ); /*Q12*/ + move16(); + y_gain_tmp[14] = mean_fx( y_gain_tmp + 10, 3 ); /*Q12*/ + move16(); + y_gain_tmp[15] = mean_fx( y_gain_tmp + 11, 3 ); /*Q12*/ + move16(); + } + ELSE + { + set16_fx( y_gain_tmp + 10, 0, MBANDS_GN - 10 ); + } + } + ELSE + { + L_tmp = 0; + move32(); + FOR( i = 0; i < 16; i++ ) + { + L_tmp = L_add( L_tmp, y_gain4[i] ); + } + L_tmp = Mpy_32_16_1( L_tmp, 2048 /* (1/16.f) in Q15 */ ); // Q12 + ftmp1_fx = extract_l( L_tmp ); + FOR( i = 0; i < Mbands_gn; i++ ) + { + IF( LT_16( y_gain4[i], sub( ftmp1_fx, 2457 /* 0.6 in Q12*/ ) ) ) + { + y_gain_tmp2[i] = sub( ftmp1_fx, 2457 /* 0.6 in Q12*/ ); + } + ELSE IF( GT_16( y_gain4[i], add( ftmp1_fx, 2457 /* 0.6 in Q12*/ ) ) ) + { + y_gain_tmp2[i] = add( ftmp1_fx, 2457 /* 0.6 in Q12*/ ); + } + ELSE + { + y_gain_tmp2[i] = y_gain4[i]; + } + move16(); + } + + L_tmp = 0; + move32(); + FOR( i = 0; i < 16; i++ ) + { + L_tmp = L_add( L_tmp, y_gain_tmp2[i] ); + } + L_tmp = Mpy_32_16_1( L_tmp, 2048 /* (1/16.f) in Q15 */ ); // Q12 + mean_4g_fx[0] = extract_l( L_tmp ); // Q12 + move16(); + idx_g = vquant_fx( mean_4g_fx, mean_m_fx, mean_4g_fx, mean_gain_dic_fx, 1, 64 ); + push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); + + /* Subtraction of the average gain */ + FOR( i = 0; i < Mbands_gn; i++ ) + { + y_gain_tmp[i] = sub( y_gain_tmp2[i], mean_4g_fx[0] ); // Q12 + move16(); + } + + IF( LT_32( core_brate, ACELP_9k60 ) ) + { + /* prediction and quantization of the average gain */ + + /*--------------------------------------------------------------------------------------* + * Quantization of the first 8 bands + * Keep only 4 bands out of the last 8 bands + *--------------------------------------------------------------------------------------*/ + + Copy( y_gain_tmp, y_gain_tmp2, 8 ); + + y_gain_tmp2[8] = y_gain_tmp[8]; + move16(); + y_gain_tmp2[9] = y_gain_tmp[10]; + move16(); + y_gain_tmp2[10] = y_gain_tmp[12]; + move16(); + y_gain_tmp2[11] = y_gain_tmp[14]; + move16(); + + idx_g = 0; + move16(); + idx_g = vquant_fx( y_gain_tmp2, YGain_mean_LR_fx, y_gain_tmp2, YGain_dic1_LR_fx, 3, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + test(); + test(); + test(); + IF( !( coder_type == INACTIVE && tdm_LRTD_flag == 0 && EQ_16( idchan, 1 ) ) || GT_32( core_brate_inp, GSC_LRES_GAINQ_LIMIT ) ) + { + idx_g = vquant_fx( y_gain_tmp2 + 3, YGain_mean_LR_fx + 3, y_gain_tmp2 + 3, YGain_dic2_LR_fx, 4, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + /*----------------------------------------------------------------------* + * Vector quantization of the first 8 bands + quantization of the 4 bands out of the last 8 + * Interpolation of the last 4 bands Q to create bands 8-16 + *----------------------------------------------------------------------*/ + + idx_g = vquant_fx( y_gain_tmp2 + 7, YGain_mean_LR_fx + 7, y_gain_tmp2 + 7, YGain_dic3_LR_fx, 5, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + set16_fx( y_gain_tmp2 + 12, 0, MBANDS_GN - 12 ); + + /* Update to quantized vector */ + Copy( y_gain_tmp2, y_gain_tmp, 8 ); + + Copy( y_gain_tmp2 + 8, y_gain_tmp3, 4 ); + set16_fx( y_gain_tmp + 8, 0, 8 ); + fft_rel_fx( y_gain_tmp2 + 8, 4, 2 ); + + Copy( y_gain_tmp2 + 8, y_gain_tmp + 8, 3 ); + y_gain_tmp[15] = y_gain_tmp2[11]; + move16(); + ifft_rel_fx( y_gain_tmp + 8, 8, 3 ); + + FOR( i = 8; i < 16; i++ ) + { + y_gain_tmp[i] = shl( mult( y_gain_tmp[i], 23101 /* 1.41 in Q14 */ ), 1 ); /*Q12*/ + move16(); + } + + y_gain_tmp[8] = y_gain_tmp3[0]; + move16(); + y_gain_tmp[10] = y_gain_tmp3[1]; + move16(); + y_gain_tmp[12] = y_gain_tmp3[2]; + move16(); + y_gain_tmp[14] = y_gain_tmp3[3]; + move16(); + } + ELSE + { + Copy( y_gain_tmp2, y_gain_tmp, 3 ); + set16_fx( y_gain_tmp + 3, 0, MBANDS_GN16k - 3 ); + } + } + ELSE + { + IF( EQ_16( L_frame, L_FRAME ) ) + { + idx_g = vquant_fx( y_gain_tmp, YG_mean16_fx, y_gain_tmp, YG_dicMR_1_fx, 4, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant_fx( y_gain_tmp + 4, YG_mean16_fx + 4, y_gain_tmp + 4, YG_dicMR_2_fx, 4, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + idx_g = vquant_fx( y_gain_tmp + 8, YG_mean16_fx + 8, y_gain_tmp + 8, YG_dicMR_3_fx, 4, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + idx_g = vquant_fx( y_gain_tmp + 12, YG_mean16_fx + 12, y_gain_tmp + 12, YG_dicMR_4_fx, 4, 16 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); + } + ELSE + { + idx_g = vquant_fx( y_gain_tmp, YG_mean16HR_fx, y_gain_tmp, YG_dicHR_1_fx, 4, 128 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); + + idx_g = vquant_fx( y_gain_tmp + 4, YG_mean16HR_fx + 4, y_gain_tmp + 4, YG_dicHR_2_fx, 4, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant_fx( y_gain_tmp + 8, YG_mean16HR_fx + 8, y_gain_tmp + 8, YG_dicHR_3_fx, 4, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant_fx( y_gain_tmp + 12, YG_mean16HR_16kHz_fx, y_gain_tmp + 12, YG_dicHR_4_16kHz_fx, 4, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant_fx( y_gain_tmp + 16, YG_meanL2G_16kHz_fx, y_gain_tmp + 16, YG_dicL2G_16kHz_fx, 2, 8 ); + push_indice( hBstr, IND_Y_GAIN_HF, idx_g, 3 ); + } + } + } + + GSC_gain_DQ_fx( element_mode, ENC, coder_type, Mbands_gn, core_brate, mean_4g_fx[0], y_gain_tmp, y_gainQ ); + + return mean_4g_fx[0]; +} + + /*==========================================================================*/ -/* FUNCTION : Word16 gsc_gaindec_fx () */ +/* FUNCTION : Word16 gsc_gaindec_fx() */ /*--------------------------------------------------------------------------*/ /* PURPOSE : Generic signal frequency band decoding and application */ /*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) pvq_bits_fx : core used Q0 */ -/* _ (Word16) coder_type : coding type Q0 */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) pvq_bits_fx : core used Q0 */ +/* _ (Word16) coder_type : coding type Q0 */ /* _ (Word16) core_fx : core used Q0 */ /* _ (Word16) bwidth_fx : input signal bandwidth Q0 */ /*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) y_gainQ_fx : quantized gain per band */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) y_gainQ_fx : quantized gain per band */ /*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16[]) old_y_gain_fx : AR gain quantizer for low rate */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word16[]) old_y_gain_fx : AR gain quantizer for low rate */ /*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ (Word16) : average frequency gain */ +/* RETURN ARGUMENTS : */ +/* _ (Word16) : average frequency gain */ /*==========================================================================*/ + Word16 gsc_gaindec_fx( /* o : average frequency gain */ Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 y_gainQ_fx[], /* o : quantized gain per band */ @@ -786,26 +1071,28 @@ Word16 gsc_gaindec_fx( /* o : average frequency gai return mean_4g_fx; } + /*==========================================================================*/ -/* FUNCTION : Word16 gsc_gaindec_ivas_fx () */ +/* FUNCTION : Word16 gsc_gaindec_ivas_fx() */ /*--------------------------------------------------------------------------*/ /* PURPOSE : Generic signal frequency band decoding and application */ /*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) pvq_bits_fx : core used Q0 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) core_fx : core used Q0 */ -/* _ (Word16) bwidth_fx : input signal bandwidth Q0 */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) pvq_bits_fx : core used Q0 */ +/* _ (Word16) coder_type : coding type Q0 */ +/* _ (Word16) core_fx : core used Q0 */ +/* _ (Word16) bwidth_fx : input signal bandwidth Q0 */ /*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) y_gainQ_fx : quantized gain per band */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) y_gainQ_fx : quantized gain per band */ /*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16[]) old_y_gain_fx : AR gain quantizer for low rate */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word16[]) old_y_gain_fx : AR gain quantizer for low rate */ /*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ (Word16) : average frequency gain */ +/* RETURN ARGUMENTS : */ +/* _ (Word16) : average frequency gain */ /*==========================================================================*/ + Word16 gsc_gaindec_ivas_fx( /* o : average frequency gain */ Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 y_gainQ_fx[], /* o : quantized gain per band Q12 */ @@ -970,11 +1257,13 @@ Word16 gsc_gaindec_ivas_fx( /* o : average frequenc return mean_4g_fx; } + /*-------------------------------------------------------------------* * gsc_gainQ() * * Quantization of the energy per band *-------------------------------------------------------------------*/ + Word16 gsc_gainQ_fx( /*Q12*/ BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ const Word16 y_gain4[], /* i : Energy per band Q12 */ @@ -1028,7 +1317,7 @@ Word16 gsc_gainQ_fx( /*Q12*/ mean_4g[0] = round_fx( L_tmp ); move16(); idx_g = vquant_fx( mean_4g, Gain_meanNB_fx, mean_4g, Gain_mean_dicNB_fx, 1, 64 ); - push_indice_fx( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); + push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); FOR( i = 0; i < Mbands_gn; i++ ) { @@ -1040,21 +1329,21 @@ Word16 gsc_gainQ_fx( /*Q12*/ move16(); set16_fx( y_gain_tmp + 10, 0, MBANDS_GN - 10 ); idx_g = vquant_fx( y_gain_tmp, Mean_dic_NB_fx, y_gain_tmp, Gain_dic1_NB_fx, 3, 64 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); IF( LT_32( core_brate, ACELP_9k60 ) ) { idx_g = vquant_fx( y_gain_tmp + 3, Mean_dic_NB_fx + 3, y_gain_tmp + 3, Gain_dic2_NB_fx, 3, 32 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); idx_g = vquant_fx( y_gain_tmp + 6, Mean_dic_NB_fx + 6, y_gain_tmp + 6, Gain_dic3_NB_fx, 4, 16 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); } ELSE { idx_g = vquant_fx( y_gain_tmp + 3, Mean_dic_NB_fx + 3, y_gain_tmp + 3, Gain_dic2_NBHR_fx, 3, 64 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); idx_g = vquant_fx( y_gain_tmp + 6, Mean_dic_NB_fx + 6, y_gain_tmp + 6, Gain_dic3_NBHR_fx, 4, 128 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); } /*add end */ test(); @@ -1122,7 +1411,7 @@ Word16 gsc_gainQ_fx( /*Q12*/ move16(); idx_g = vquant_fx( mean_4g, mean_m_fx, mean_4g, mean_gain_dic_fx, 1, 64 ); - push_indice_fx( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); + push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); FOR( i = 0; i < Mbands_gn; i++ ) { @@ -1148,11 +1437,11 @@ Word16 gsc_gainQ_fx( /*Q12*/ move16(); idx_g = vquant_fx( y_gain_tmp2, YGain_mean_LR_fx, y_gain_tmp2, YGain_dic1_LR_fx, 3, 32 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); idx_g = vquant_fx( y_gain_tmp2 + 3, YGain_mean_LR_fx + 3, y_gain_tmp2 + 3, YGain_dic2_LR_fx, 4, 32 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); idx_g = vquant_fx( y_gain_tmp2 + 7, YGain_mean_LR_fx + 7, y_gain_tmp2 + 7, YGain_dic3_LR_fx, 5, 32 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); set16_fx( y_gain_tmp2 + 12, 0, MBANDS_GN - 12 ); /* Update to quantized vector */ @@ -1185,13 +1474,13 @@ Word16 gsc_gainQ_fx( /*Q12*/ ELSE { idx_g = vquant_fx( y_gain_tmp, YG_mean16_fx, y_gain_tmp, YG_dicMR_1_fx, 4, 64 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); idx_g = vquant_fx( y_gain_tmp + 4, YG_mean16_fx + 4, y_gain_tmp + 4, YG_dicMR_2_fx, 4, 32 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); idx_g = vquant_fx( y_gain_tmp + 8, YG_mean16_fx + 8, y_gain_tmp + 8, YG_dicMR_3_fx, 4, 32 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); idx_g = vquant_fx( y_gain_tmp + 12, YG_mean16_fx + 12, y_gain_tmp + 12, YG_dicMR_4_fx, 4, 16 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); } } @@ -1200,11 +1489,14 @@ Word16 gsc_gainQ_fx( /*Q12*/ return mean_4g[0]; /*Q12*/ } + + /*-------------------------------------------------------------------* * VDQ_vec() * * Return the dequantized vector of index *-------------------------------------------------------------------*/ + static Word16 VDQ_vec_fx( Word16 *Qvec_out_fx, /* o: Quanitzed vector */ const Word16 *mean_dic_fx, /* i: average codebook */ diff --git a/lib_com/gs_inact_switching_fx.c b/lib_com/gs_inact_switching_fx.c index c0feb91f53993f4027fe1d1f6818023af94b5e13..0829a934dcef39340f470260e9066e54aecbed4f 100644 --- a/lib_com/gs_inact_switching_fx.c +++ b/lib_com/gs_inact_switching_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include "options.h" /* Compilation switches */ @@ -16,165 +16,41 @@ #define BETA0_FX ( 32768 - ALPHA0_FX ) /*Q15*/ /*========================================================================*/ -/* FUNCTION : Inac_swtch_ematch_fx() */ +/* FUNCTION : Inac_swtch_ematch_fx() */ /*------------------------------------------------------------------------*/ /* PURPOSE : Apply energy matching when swithcing to INACTIVE frame coded */ -/* by the GSC technology */ +/* by the GSC technology */ /*------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) coder_type : Coding mode */ -/* _ (Word16) L_frame : Frame lenght */ -/* _ (Word32) core_brate : core bitrate */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) coder_type : Coding mode */ +/* _ (Word16) L_frame : Frame lenght */ +/* _ (Word32) core_brate : core bitrate */ /*------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16[]) exc2 : CELP/GSC excitation buffer Q_exc */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word16[]) exc2 : CELP/GSC excitation buffer Q_exc */ /* _ (Word16[]) lt_ener_per_band : Long term energy per band Q12 */ /* _ (Word16*) Q_exc : input and output format of exc2 */ /*------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /*------------------------------------------------------------------------*/ - /*------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*========================================================================*/ -void Inac_swtch_ematch_fx( - Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ - Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ - Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ - const Word16 coder_type, /* i : Coding mode */ - const Word16 L_frame, /* i : Frame lenght */ - const Word32 core_brate, /* i : Core bit rate */ - const Word16 Q_exc /* i : input and output format of exc2 */ - , - const Word16 bfi /* i : frame lost indicator */ - , - const Word16 last_core, /* i : Last core used */ - const Word16 last_codec_mode /* i : Last codec mode */ -) -{ - Word16 Ener_per_bd[MBANDS_GN]; - Word16 ftmp; - Word16 *pt_exc; - Word16 j, i; - - Word16 exp, frac; - Word32 L_tmp; - - /*-------------------------------------------------------------------------- - * average energy per band - *--------------------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( coder_type, AUDIO ) && bfi == 0 ) - { - Ener_per_band_comp_fx( dct_exc_tmp, Ener_per_bd, Q_exc, MBANDS_GN, 1 ); - - /* reset long-term energy per band */ - FOR( i = 0; i < MBANDS_GN; i++ ) - { - lt_ener_per_band[i] = Ener_per_bd[i]; - move16(); - } - } - ELSE IF( EQ_16( coder_type, VOICED ) || EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) || ( last_core != ACELP_CORE ) || NE_16( last_codec_mode, MODE1 ) ) - { - /* Find spectrum and energy per band for GC and VC frames */ - edct_16fx( exc2, dct_exc_tmp, L_frame, 5, EVS_MONO ); - - Ener_per_band_comp_fx( dct_exc_tmp, Ener_per_bd, Q_exc, MBANDS_GN, 1 ); - - /* reset long-term energy per band */ - FOR( i = 0; i < MBANDS_GN; i++ ) - { - lt_ener_per_band[i] = Ener_per_bd[i]; - move16(); - } - } - ELSE IF( ( coder_type == INACTIVE ) && LE_32( core_brate, ACELP_24k40 ) ) - { - /* Find spectrum and energy per band for inactive frames */ - edct_16fx( exc2, dct_exc_tmp, L_frame, 5, EVS_MONO ); - Ener_per_band_comp_fx( dct_exc_tmp, Ener_per_bd, Q_exc, MBANDS_GN, 1 ); - - /* More agressive smoothing in the first 50 frames */ - pt_exc = dct_exc_tmp; - move16(); - FOR( i = 0; i < MBANDS_GN; i++ ) - { - /* Compute smoothing gain to apply with gain limitation */ - L_tmp = L_mult( ALPHA0_FX, lt_ener_per_band[i] ); /*Q(15+12+1)=Q(28) */ - L_tmp = L_mac( L_tmp, BETA0_FX, Ener_per_bd[i] ); /*Q28 */ - lt_ener_per_band[i] = round_fx( L_tmp ); /*Q12 */ - move16(); - - ftmp = sub( lt_ener_per_band[i], Ener_per_bd[i] ); /*Q12 */ - - /* ftmp = (float)pow(10, ftmp);= pow(2,3.321928*ftmp);*/ - - L_tmp = L_mult( 27213, ftmp ); /*Q(13+12+1)=Q26 ; 27213=3.321928 in Q13 */ - L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of ftmp */ - ftmp = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - - exp = sub( exp, 14 ); - IF( LT_16( i, 2 ) ) - { - FOR( j = 0; j < 8; j++ ) - { - L_tmp = L_mult( *pt_exc, ftmp ); /* Q_exc*Q0 -> Q(Q_exc+1) */ - L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc+1) -> Q(16+Q_exc)*/ - *pt_exc = round_fx_sat( L_tmp ); - move16(); - pt_exc++; - } - } - ELSE - { - FOR( j = 0; j < 16; j++ ) - { - L_tmp = L_mult( *pt_exc, ftmp ); /* Q_exc*Q0 -> Q(Q_exc+1) */ - L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc+1) -> Q(16+Q_exc)*/ - *pt_exc = round_fx_sat( L_tmp ); /*Q_exc*/ - move16(); - pt_exc++; - } - } - } - - /* Going back to time */ - edct_16fx( dct_exc_tmp, exc2, L_frame, 5, EVS_MONO ); - } - - return; -} - -void Inac_switch_ematch_ivas_fx( - Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ - Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ - Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ - const Word16 coder_type, /* i : Coding mode */ -#ifdef NONBE_FIX_GSC_BSTR - const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ -#endif - const Word16 L_frame, /* i : Frame lenght */ -#ifndef NONBE_FIX_GSC_BSTR - const Word32 total_brate, /* i : total bit rate */ -#endif - const Word16 Q_exc, /* i : input and output format of exc2 */ - const Word16 bfi, /* i : frame lost indicator */ - const Word16 last_core, /* i : Last core used */ - const Word16 last_codec_mode, /* i : Last codec mode */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag*/ - const Word16 element_mode /* i : element mode */ +void Inac_switch_ematch_fx( + Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ + Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ + Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ + const Word16 coder_type, /* i : Coding mode */ + const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ + const Word16 L_frame, /* i : Frame lenght */ + const Word16 Q_exc, /* i : input and output format of exc2 */ + const Word16 bfi, /* i : frame lost indicator */ + const Word16 last_core, /* i : Last core used */ + const Word16 last_codec_mode, /* i : Last codec mode */ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const Word16 element_mode /* i : element mode */ ) { Word16 Ener_per_bd[MBANDS_GN16k]; @@ -224,11 +100,7 @@ void Inac_switch_ematch_ivas_fx( move16(); } } -#ifdef NONBE_FIX_GSC_BSTR ELSE IF( ( coder_type == INACTIVE ) && inactive_coder_type_flag ) -#else - ELSE IF( ( coder_type == INACTIVE ) && LE_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) -#endif { /* Find spectrum and energy per band for inactive frames */ edct_16fx( exc2, dct_exc_tmp, L_frame, 5, element_mode ); @@ -259,31 +131,62 @@ void Inac_switch_ematch_ivas_fx( exp = sub( exp, 14 ); IF( LT_16( i, 2 ) ) { - FOR( j = 0; j < 8; j++ ) + IF( EQ_16( element_mode, EVS_MONO ) ) { - L_tmp = L_mult0( *pt_exc, ftmp ); - L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ - *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ - move16(); - pt_exc++; + FOR( j = 0; j < 8; j++ ) + { + L_tmp = L_mult( *pt_exc, ftmp ); + L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ + *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ + move16(); + pt_exc++; + } + } + ELSE + { + FOR( j = 0; j < 8; j++ ) + { + L_tmp = L_mult0( *pt_exc, ftmp ); + L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ + *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ + move16(); + pt_exc++; + } } } ELSE { - FOR( j = 0; j < 16; j++ ) + IF( EQ_16( element_mode, EVS_MONO ) ) + { + FOR( j = 0; j < 16; j++ ) + { + L_tmp = L_mult( *pt_exc, ftmp ); + L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ + *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ + move16(); + pt_exc++; + } + } + ELSE { - L_tmp = L_mult0( *pt_exc, ftmp ); - L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ - *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ - move16(); - pt_exc++; + FOR( j = 0; j < 16; j++ ) + { + L_tmp = L_mult0( *pt_exc, ftmp ); + L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ + *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ + move16(); + pt_exc++; + } } } } /* Going back to time */ - Scale_sig( dct_exc_tmp, 240, 1 ); // Q_exc - Scale_sig( exc2, 240, 1 ); // Q_exc + IF( GT_16( element_mode, EVS_MONO ) ) + { + Scale_sig( dct_exc_tmp, 240, 1 ); // Q_exc + Scale_sig( exc2, 240, 1 ); // Q_exc + } edct_16fx( dct_exc_tmp, exc2, L_frame, 5, element_mode ); } diff --git a/lib_com/gs_noisefill_fx.c b/lib_com/gs_noisefill_fx.c index 2e00e4641e177d2e17d2bbecbe6c93f93c522e1a..8489cd66de0015dd76d4f18bb75c3861a077fb21 100644 --- a/lib_com/gs_noisefill_fx.c +++ b/lib_com/gs_noisefill_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" @@ -128,27 +128,27 @@ static void EstimateNoiseLevel_inner_fx( return; } /*==========================================================================*/ -/* FUNCTION : void EstimateNoiseLevel_fx() */ +/* FUNCTION : void EstimateNoiseLevel_fx() */ /*--------------------------------------------------------------------------*/ -/* PURPOSE : */ +/* PURPOSE : */ /*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word32) bitrate : Bitrate of the codec Q0 */ -/* _ (Word16) Diff_len : number of bin before cut-off frequency */ -/* _ (Word16) Mbands_gn : number of bands Q0 */ +/* INPUT ARGUMENTS : */ +/* _ (Word32) bitrate : Bitrate of the codec Q0 */ +/* _ (Word16) Diff_len : number of bin before cut-off frequency */ +/* _ (Word16) Mbands_gn : number of bands Q0 */ /* _ (Word16) coder_type : coder type Q0 */ -/* _ (Word16) noise_lev : pulses dynamic Q0 */ +/* _ (Word16) noise_lev : pulses dynamic Q0 */ /* _ (Word16) pit_band_idx : bin position of the cut-off frequency */ -/* _ (Word16*) freq_nsbin_per_band : bin per bands tables Q0 */ +/* _ (Word16*) freq_nsbin_per_band : bin per bands tables Q0 */ /*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) noisepb : Noise per band Q15 */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) noisepb : Noise per band Q15 */ /*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /* None */ /*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*==========================================================================*/ static void EstimateNoiseLevel_fx( Word16 *noisepb, /* o : Noise per band */ @@ -241,27 +241,27 @@ static void EstimateNoiseLevel_fx( } /*============================================================================*/ -/* FUNCTION : void Appy_NoiseFill_fx() */ +/* FUNCTION : void Appy_NoiseFill_fx() */ /*----------------------------------------------------------------------------*/ -/* PURPOSE : */ +/* PURPOSE : */ /*----------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _ (Word16*) seed_tcx : Seed for noise Q0 */ -/* _ (Word16*) noisepb : Noise per band Q15 */ +/* _ (Word16*) noisepb : Noise per band Q15 */ /* _ (Word16) Diff_len : number of bin before cut-off frequency Q0 */ /* _ (Word16) Mbands_gn : number of bands Q0 */ -/* _ (Word16) coder_type : pulses dynamic Q0 */ +/* _ (Word16) coder_type : pulses dynamic Q0 */ /* _ (Word16*) freq_nsbin_per_band: bin per bands tables Q0 */ -/* _ (Word16) qexc_diffQ : Q format of exc_diffQ */ +/* _ (Word16) qexc_diffQ : Q format of exc_diffQ */ /*----------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) exc_diffQ : Noise per band qexc_diffQ */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) exc_diffQ : Noise per band qexc_diffQ */ /*----------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /* None */ /*----------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*============================================================================*/ static void Apply_NoiseFill_fx( Word16 *exc_diffQ, /* i/o: Noise per band qexc_diffQ */ @@ -294,25 +294,25 @@ static void Apply_NoiseFill_fx( return; } /*==========================================================================*/ -/* FUNCTION :void freq_dnw_scaling_fx () */ +/* FUNCTION :void freq_dnw_scaling_fx () */ /*--------------------------------------------------------------------------*/ /* PURPOSE : */ /*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) cor_strong_limit : HF correlation Q0 */ -/* _ (Word16) coder_type : coder type Q0 */ -/* _ (Word16) noise_lev : Noise level Q0 */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) cor_strong_limit : HF correlation Q0 */ +/* _ (Word16) coder_type : coder type Q0 */ +/* _ (Word16) noise_lev : Noise level Q0 */ /* _ (Word32) core_brate : Core bitrate Q0 */ -/* _ (Word16) Qx : Q format of fy_norm */ +/* _ (Word16) Qx : Q format of fy_norm */ /*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /* _ None */ /*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16[]) fy_norm : Frequency quantized parameter Qx */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word16[]) fy_norm : Frequency quantized parameter Qx */ /*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _None */ +/* RETURN ARGUMENTS : */ +/* _None */ /*==========================================================================*/ void freq_dnw_scaling_fx( const Word16 cor_strong_limit, /* i : HF correlation */ @@ -411,10 +411,6 @@ static void Decreas_freqPeak_fx( Word16 lsf_new_diff[M]; Word16 tmp, tmp1, exp; Word16 tmp2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif move16(); /*ptr init*/ lsf_new_diff[0] = 0; /* prevent unitialized value */ move16(); @@ -470,11 +466,11 @@ static void Decreas_freqPeak_fx( { tmp = abs_s( *src ); exp = norm_s( max_val ); - tmp1 = div_s( shl( 1, sub( 14, exp ) ), max_val ); /*Q(29 - exp - Q_exc) */ - L_tmp = L_mult( tmp, tmp1 ); /*Q(30 - exp) */ - tmp = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q14 */ - tmp = sub( 32767, tmp ); /*Q14 */ - L_tmp = L_mult( avrg, tmp ); /*Q_exc +15 */ + tmp1 = div_s( shl( 1, sub( 14, exp ) ), max_val ); /*Q(29 - exp - Q_exc) */ + L_tmp = L_mult( tmp, tmp1 ); /*Q(30 - exp) */ + tmp = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q14 */ + tmp = sub( 32767, tmp ); /*Q14 */ + L_tmp = L_mult( avrg, tmp ); /*Q_exc +15 */ tmp = round_fx( L_shl( L_tmp, 1 ) ); tmp1 = negate( tmp ); @@ -528,10 +524,6 @@ static void envelop_modify_fx( Word16 weight_fx; Word32 L_exc_diffQ_fx[L_FRAME16k], exc_diffQ_max; Word16 Q_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif start_band = i_mult( last_bin, 16 ); end_band = L_FRAME; @@ -565,7 +557,7 @@ static void envelop_modify_fx( /* output of Pow2() will be: */ /* 16384 < Pow2() <= 32767 */ exp = sub( exp, 14 ); - Ener1_fx = mult_ro( 13107, shl_o( tmp, exp, &Overflow ), &Overflow ); /*Q0 */ + Ener1_fx = mult_r( 13107, shl_sat( tmp, exp ) ); /*Q0 */ FOR( j = 0; j < 16; j++ ) { @@ -591,7 +583,7 @@ static void envelop_modify_fx( /* output of Pow2() will be: */ /* 16384 < Pow2() <= 32767 */ exp = sub( exp, 14 ); - Ener1_fx = mult_r( 13107, shl_o( tmp, exp, &Overflow ) ); /*Q0 */ + Ener1_fx = mult_r( 13107, shl_sat( tmp, exp ) ); /*Q0 */ src_fx = &exc_diffQ_fx[224]; FOR( j = 0; j < 32; j++ ) @@ -690,10 +682,6 @@ void highband_exc_dct_in_fx( Word16 frac, exp, tmp1; Word16 tmp2; Word16 *end, Q_hb_exc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif FOR( j = 10; j < MBANDS_GN; j++ ) { @@ -708,9 +696,9 @@ void highband_exc_dct_in_fx( /* output of Pow2() will be: */ /* 16384 < Pow2() <= 32767 */ exp = sub( exp, 14 ); - tmp1 = shl_o( tmp, exp, &Overflow ); + tmp1 = shl_sat( tmp, exp ); move16(); - ener = add_o( tmp1, ener, &Overflow ); /*Q0 */ + ener = add_sat( tmp1, ener ); /*Q0 */ } test(); @@ -939,10 +927,10 @@ void highband_exc_dct_in_fx( FOR( i = sub( L_FRAME, 16 ); i < L_FRAME; i++ ) { /*exc_dct_in[i] *= (0.067f*i-15.f); */ - tmp = mult_r( 17564, shl( i, 6 ) ); /*0.067 in Q18 and i in Q6= Q9 */ - tmp = sub( tmp, 7680 ); /*15 in Q9 = Q9 */ - L_tmp = L_mult( exc_dct_in[i], tmp ); /*Q(Q_exc+10) */ - exc_dct_in[i] = round_fx_o( L_shl_o( L_tmp, 6, &Overflow ), &Overflow ); /*Q_exc */ + tmp = mult_r( 17564, shl( i, 6 ) ); /*0.067 in Q18 and i in Q6= Q9 */ + tmp = sub( tmp, 7680 ); /*15 in Q9 = Q9 */ + L_tmp = L_mult( exc_dct_in[i], tmp ); /*Q(Q_exc+10) */ + exc_dct_in[i] = round_fx_sat( L_shl_sat( L_tmp, 6 ) ); /*Q_exc */ } } @@ -977,9 +965,9 @@ void highband_exc_dct_in_fx( IF( GT_16( tmp, abs_s( *dst ) ) ) { tmp2 = *src; - *src = mult_r( 16384, sub_o( *src, abs_s( *dst ), &Overflow ) ); /*Q_exc */ + *src = mult_r( 16384, sub_sat( *src, abs_s( *dst ) ) ); /*Q_exc */ move16(); - tmp = mult_r( 16384, add_o( tmp2, abs_s( *dst ), &Overflow ) ); /*Q_exc */ + tmp = mult_r( 16384, add_sat( tmp2, abs_s( *dst ) ) ); /*Q_exc */ if ( tmp2 > 0 ) { *src = tmp; @@ -1068,10 +1056,6 @@ void highband_exc_dct_in_ivas_fx( Word16 frac, exp, tmp1; Word16 tmp2; Word16 *end, Q_hb_exc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif FOR( j = 10; j < MBANDS_GN; j++ ) { @@ -1086,9 +1070,9 @@ void highband_exc_dct_in_ivas_fx( /* output of Pow2() will be: */ /* 16384 < Pow2() <= 32767 */ exp = sub( exp, 14 ); - tmp1 = shl_o( tmp, exp, &Overflow ); + tmp1 = shl_sat( tmp, exp ); move16(); - ener = add_o( tmp1, ener, &Overflow ); /*Q0 */ + ener = add_sat( tmp1, ener ); /*Q0 */ } test(); @@ -1332,32 +1316,46 @@ void highband_exc_dct_in_ivas_fx( } } - Word16 Q_tmp = *Q_exc; - move16(); - Word16 Q_old = *Q_exc; - move16(); - Comp_and_apply_gain_ivas_fx( exc_diffQ, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 0, Qexc_diffQ, Q_exc ); - - IF( exc_wo_nf != NULL ) + IF( EQ_16( element_mode, EVS_MONO ) ) { - Comp_and_apply_gain_ivas_fx( exc_wo_nf, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 1, Qexc_diffQ, &Q_tmp ); - IF( GT_16( Q_tmp, *Q_exc ) ) - { - Scale_sig( exc_wo_nf, L_frame, sub( *Q_exc, Q_tmp ) ); - } - ELSE IF( LT_16( Q_tmp, *Q_exc ) ) + Comp_and_apply_gain_fx( exc_diffQ, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 0, Qexc_diffQ, *Q_exc ); + + IF( exc_wo_nf != NULL ) { - Scale_sig( exc_diffQ, L_frame, sub( Q_tmp, *Q_exc ) ); - *Q_exc = Q_tmp; - move16(); + Comp_and_apply_gain_fx( exc_wo_nf, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 1, Qexc_diffQ, *Q_exc ); + Vr_add( exc_dct_in, exc_wo_nf, exc_wo_nf, L_frame ); } - Scale_sig( exc_dct_in, L_frame, sub( *Q_exc, Q_old ) ); - Vr_add( exc_dct_in, exc_wo_nf, exc_wo_nf, L_frame ); } ELSE { - Scale_sig( exc_dct_in, L_frame, sub( *Q_exc, Q_old ) ); + Word16 Q_tmp = *Q_exc; + move16(); + Word16 Q_old = *Q_exc; + move16(); + Comp_and_apply_gain_ivas_fx( exc_diffQ, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 0, Qexc_diffQ, Q_exc ); + + IF( exc_wo_nf != NULL ) + { + Comp_and_apply_gain_ivas_fx( exc_wo_nf, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 1, Qexc_diffQ, &Q_tmp ); + IF( GT_16( Q_tmp, *Q_exc ) ) + { + Scale_sig( exc_wo_nf, L_frame, sub( *Q_exc, Q_tmp ) ); + } + ELSE IF( LT_16( Q_tmp, *Q_exc ) ) + { + Scale_sig( exc_diffQ, L_frame, sub( Q_tmp, *Q_exc ) ); + *Q_exc = Q_tmp; + move16(); + } + Scale_sig( exc_dct_in, L_frame, sub( *Q_exc, Q_old ) ); + Vr_add( exc_dct_in, exc_wo_nf, exc_wo_nf, L_frame ); + } + ELSE + { + Scale_sig( exc_dct_in, L_frame, sub( *Q_exc, Q_old ) ); + } } + /*--------------------------------------------------------------------------------------* * add the correction layer to the LF bins, * and add the quantized pulses or the noise for the higher part of the spectrum @@ -1397,7 +1395,10 @@ void highband_exc_dct_in_ivas_fx( Q_hb_exc = 0; move16(); envelop_modify_fx( exc_diffQ, seed_tcx, last_bin, Ener_per_bd_iQ, *Q_exc, &Q_hb_exc ); - IF( GT_16( *Q_exc, Q_hb_exc ) ) + + test(); + test(); + IF( GT_16( *Q_exc, Q_hb_exc ) && GT_16( element_mode, EVS_MONO ) && exc_wo_nf != NULL ) { Scale_sig( exc_wo_nf, L_frame, sub( Q_hb_exc, *Q_exc ) ); *Q_exc = Q_hb_exc; @@ -1415,10 +1416,10 @@ void highband_exc_dct_in_ivas_fx( FOR( i = sub( L_FRAME, 16 ); i < L_FRAME; i++ ) { /*exc_dct_in[i] *= (0.067f*i-15.f); */ - tmp = mult_r( 17564, shl( i, 6 ) ); /*0.067 in Q18 and i in Q6= Q9 */ - tmp = sub( tmp, 7680 ); /*15 in Q9 = Q9 */ - L_tmp = L_mult( exc_dct_in[i], tmp ); /*Q(Q_exc+10) */ - exc_dct_in[i] = round_fx_o( L_shl_o( L_tmp, 6, &Overflow ), &Overflow ); /*Q_exc */ + tmp = mult_r( 17564, shl( i, 6 ) ); /*0.067 in Q18 and i in Q6= Q9 */ + tmp = sub( tmp, 7680 ); /*15 in Q9 = Q9 */ + L_tmp = L_mult( exc_dct_in[i], tmp ); /*Q(Q_exc+10) */ + exc_dct_in[i] = round_fx_sat( L_shl_sat( L_tmp, 6 ) ); /*Q_exc */ } } @@ -1453,9 +1454,9 @@ void highband_exc_dct_in_ivas_fx( IF( GT_16( tmp, abs_s( *dst ) ) ) { tmp2 = *src; - *src = mult_r( 16384, sub_o( *src, abs_s( *dst ), &Overflow ) ); /*Q_exc */ + *src = mult_r( 16384, sub_sat( *src, abs_s( *dst ) ) ); /*Q_exc */ move16(); - tmp = mult_r( 16384, add_o( tmp2, abs_s( *dst ), &Overflow ) ); /*Q_exc */ + tmp = mult_r( 16384, add_sat( tmp2, abs_s( *dst ) ) ); /*Q_exc */ IF( tmp2 > 0 ) { *src = tmp; diff --git a/lib_com/gs_preech_fx.c b/lib_com/gs_preech_fx.c index 3b3eaa7776b9ff3c7403e4cb7f30decf8bf77a2b..bee644b0ea037de41c76d610beedf781a460c730 100644 --- a/lib_com/gs_preech_fx.c +++ b/lib_com/gs_preech_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -54,10 +54,10 @@ void pre_echo_att_fx( Word32 *Last_frame_ener_fx, /* i/o: Energy of the last frame 2*Q_new+1*/ Word16 *exc_fx, /* i/o: Excitation of the current frame Q_new*/ - const Word16 gsc_attack_flag_fx, /* i : flag signalling attack encoded by AC mode (GSC) Q0*/ + const Word16 gsc_attack_flag_fx, /* i : flag signalling attack encoded by AC mode (GSC) Q0*/ const Word16 Q_new, - const Word16 last_coder_type, /* i : Last coding mode Q0*/ - const Word16 L_frame /* i : Frame length Q0*/ + const Word16 last_coder_type, /* i : Last coding mode Q0*/ + const Word16 L_frame /* i : Frame length Q0*/ ) { Word32 etmp_fx; @@ -117,7 +117,7 @@ void pre_echo_att_fx( etmp_fx = L_shr( etmp_fx, add( 1 - 4, shl( Q_new, 1 ) ) ); /* makes etmp i nQ4 as *Last_frame_ener_fx */ /* Find the correction factor and apply it before the attack */ /* ratio = (float)sqrt(*Last_frame_ener/etmp);*/ - /* = isqrt(etmp/(*Last_frame_ener)) */ + /* = isqrt(etmp/(*Last_frame_ener)) */ etmp_fx = L_max( etmp_fx, 1 ); *Last_frame_ener_fx = L_max( *Last_frame_ener_fx, 1 ); move32(); @@ -166,10 +166,10 @@ void pre_echo_att_fx( void pre_echo_att_ivas_fx( Word32 *Last_frame_ener_fx, /* i/o: Energy of the last frame 2*Q_new+1*/ Word16 *exc_fx, /* i/o: Excitation of the current frame Q_new*/ - const Word16 gsc_attack_flag_fx, /* i : flag signalling attack encoded by AC mode (GSC) Q0*/ + const Word16 gsc_attack_flag_fx, /* i : flag signalling attack encoded by AC mode (GSC) Q0*/ const Word16 Q_new, - const Word16 last_coder_type, /* i : Last coding mode Q0*/ - const Word16 L_frame /* i : Frame length Q0*/ + const Word16 last_coder_type, /* i : Last coding mode Q0*/ + const Word16 L_frame /* i : Frame length Q0*/ ) { Word32 etmp_fx; @@ -177,9 +177,10 @@ void pre_echo_att_ivas_fx( move16(); Word16 ratio_fx; Word16 attack_pos_fx, i; - Word32 L_tmp, L_tmp1; - Word16 tmp, n1, n2, exp, frac1, frac2; + Word32 L_tmp; + Word16 tmp, tmp_e; Word32 etmp1_fx; + Word16 etmp_e; Word16 att_len; test(); @@ -220,32 +221,19 @@ void pre_echo_att_ivas_fx( IF( GT_32( etmp_fx, *Last_frame_ener_fx ) && attack_pos_fx > 0 ) { /* Find the average energy before the attack */ - L_tmp = sum32_fx( finc_fx, attack_pos_fx ); /*Q1 */ - L_tmp1 = L_shr( L_mult( attack_pos_fx, attack_pos_fx ), 1 ); /*Q0 */ - tmp = round_fx( Isqrt( L_tmp1 ) ); /*Q15 */ - L_tmp = L_shr( L_tmp, 2 ); /*Q1 ; ATT_SEG_LEN=4 */ - etmp_fx = Mult_32_16( L_tmp, tmp ); /*Q1 */ - - etmp_fx = L_shr( etmp_fx, add( 1 - 4, shl( Q_new, 1 ) ) ); /* makes etmp i nQ4 as *Last_frame_ener_fx */ - /* Find the correction factor and apply it before the attack */ - /* ratio = (float)sqrt(*Last_frame_ener/etmp);*/ - /* = isqrt(etmp/(*Last_frame_ener)) */ - etmp_fx = L_max( etmp_fx, 1 ); - *Last_frame_ener_fx = L_max( *Last_frame_ener_fx, 1 ); - move32(); - n1 = norm_l( etmp_fx ); - n2 = norm_l( *Last_frame_ener_fx ); - - n1 = sub( n1, 1 ); - exp = sub( n1, n2 ); - - frac1 = round_fx( L_shl( etmp_fx, n1 ) ); - frac2 = round_fx_sat( L_shl_sat( *Last_frame_ener_fx, n2 ) ); - L_tmp = L_mult0( 128, div_s( frac1, frac2 ) ); /* s = gain_out / gain_in */ - L_tmp = L_shr( L_tmp, exp ); /* add exponent */ + etmp_fx = sum32_fx( finc_fx, attack_pos_fx ); + etmp_e = sub( 31, add( shl( Q_new, 1 ), 1 ) ); + etmp_fx = L_add( etmp_fx, L_shr( 21474836 /*0.01 in Q31*/, etmp_e ) ); /* etmp = etmp + 0.01; (exp = etmp_e) */ + etmp_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( etmp_fx, L_mult0( attack_pos_fx, ATT_SEG_LEN ), &tmp_e ) ); + tmp_e = add( tmp_e, sub( etmp_e, 31 ) ); + etmp_e = tmp_e; + move16(); - L_tmp = Isqrt( L_tmp ); - ratio_fx = round_fx( L_shl( L_tmp, 9 ) ); + /* Find the correction factor and apply it before the attack */ + tmp = BASOP_Util_Divide3232_Scale( *Last_frame_ener_fx, etmp_fx, &tmp_e ); /* numerator Q = 2 * Q_new + 1; denominator Q = 31 - tmp_e */ + tmp_e = add( tmp_e, sub( sub( 31, etmp_e ), add( shl( Q_new, 1 ), 1 ) ) ); /* tmp_e = tmp_e + (31 - tmp_e) - (2 * Q_new + 1) */ + tmp = Sqrt16( tmp, &tmp_e ); + ratio_fx = shr_sat( tmp, sub( 2, tmp_e ) ); /* Q13 */ /* Pre-echo atttenuation should never increase the energy */ ratio_fx = s_min( ratio_fx, 8192 /* 1 in Q13 */ ); /* Q13 */ diff --git a/lib_com/guided_plc_util_fx.c b/lib_com/guided_plc_util_fx.c index 91075df44766988237168fac24bd5e9795835cff..81723b42661dfb8458e9138428fe564119d5d552 100644 --- a/lib_com/guided_plc_util_fx.c +++ b/lib_com/guided_plc_util_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -251,10 +251,10 @@ void modify_lsf( static void reorder_lsfs( - Word16 *lsf, /* i/o: vector of lsfs in the frequency domain (0..0.5) 1.28 Q1*/ - const Word16 min_dist0, /* i : minimum required distance 1.28 Q1*/ - const Word16 n, /* i : LPC order Q0*/ - const Word32 sr_core /* i : input sampling frequency Q0*/ + Word16 *lsf, /* i/o: vector of lsfs in the frequency domain (0..0.5) 1.28 Q1*/ + const Word16 min_dist0, /* i : minimum required distance 1.28 Q1*/ + const Word16 n, /* i : LPC order Q0*/ + const Word32 sr_core /* i : input sampling frequency Q0*/ ) { Word16 i; diff --git a/lib_com/hp50_fx.c b/lib_com/hp50_fx.c index f5e7105cfcf9dfeebad0e4bff0d5a262cc8a7dd8..bef9956e43ffa27bd6121a905772340db5e598c8 100644 --- a/lib_com/hp50_fx.c +++ b/lib_com/hp50_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -40,8 +40,8 @@ #include "prot_fx.h" #include "wmc_auto.h" - -#define HP20_COEFF_SCALE ( 2 ) +#define HP20_COEFF_SCALE ( 2 ) +#define HP20_FX_COEFF_SCALE ( 1 ) /* * hp20 * @@ -86,10 +86,6 @@ static void filter_2nd_order( Word16 i; Word16 x2, x1; Word32 L_sum, L_y1, L_y2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - /* * Saturation: The states of the filter, namely L_y1 and L_y2 shall @@ -107,10 +103,11 @@ static void filter_2nd_order( L_sum = L_add( L_sum, HP50_Mpy_32_32_fix( mem[0], a2 ) ); /* y2*a2 */ L_sum = L_add( L_sum, HP50_Mpy_32_32_fix( mem[1], a1 ) ); /* y1*a1 */ - L_y2 = L_shl_o( L_sum, HP20_COEFF_SCALE, &Overflow ); + L_y2 = L_shl_sat( L_sum, HP20_COEFF_SCALE ); BASOP_SATURATE_ERROR_OFF_EVS BASOP_SATURATE_WARNING_OFF_EVS - signal[0] = round_fx_o( L_shl_o( L_y2, prescale, &Overflow ), &Overflow ); + signal[0] = round_fx_sat( L_shl_sat( L_y2, prescale ) ); + BASOP_SATURATE_WARNING_ON_EVS BASOP_SATURATE_ERROR_ON_EVS @@ -121,10 +118,10 @@ static void filter_2nd_order( L_sum = L_add( L_sum, HP50_Mpy_32_32_fix( mem[1], a2 ) ); /* y2*a2 */ L_sum = L_add( L_sum, HP50_Mpy_32_32_fix( L_y2, a1 ) ); /* y1*a1 */ - L_y1 = L_shl_o( L_sum, HP20_COEFF_SCALE, &Overflow ); + L_y1 = L_shl_sat( L_sum, HP20_COEFF_SCALE ); BASOP_SATURATE_ERROR_OFF_EVS BASOP_SATURATE_WARNING_OFF_EVS - signal[stride] = round_fx_o( L_shl_o( L_y1, prescale, &Overflow ), &Overflow ); + signal[stride] = round_fx_sat( L_shl_sat( L_y1, prescale ) ); BASOP_SATURATE_WARNING_ON_EVS move16(); @@ -140,10 +137,10 @@ static void filter_2nd_order( L_sum = L_add( L_sum, HP50_Mpy_32_32_fix( L_y2, a2 ) ); L_sum = L_add( L_sum, HP50_Mpy_32_32_fix( L_y1, a1 ) ); - L_y2 = L_shl_o( L_sum, HP20_COEFF_SCALE, &Overflow ); + L_y2 = L_shl_sat( L_sum, HP20_COEFF_SCALE ); BASOP_SATURATE_ERROR_OFF_EVS BASOP_SATURATE_WARNING_OFF_EVS - signal[i_mult( i, stride )] = round_fx_o( L_shl_o( L_y2, prescale, &Overflow ), &Overflow ); + signal[i_mult( i, stride )] = round_fx_sat( L_shl_sat( L_y2, prescale ) ); BASOP_SATURATE_WARNING_ON_EVS /* y[i+1] = b2*x[i-1] + b1*x[i-0] + b2*x[i+1] + a2*y[i-1] + a1*y[i+0]; */ BASOP_SATURATE_ERROR_ON_EVS @@ -154,10 +151,10 @@ static void filter_2nd_order( L_sum = L_add( L_sum, HP50_Mpy_32_32_fix( L_y1, a2 ) ); L_sum = L_add( L_sum, HP50_Mpy_32_32_fix( L_y2, a1 ) ); - L_y1 = L_shl_o( L_sum, HP20_COEFF_SCALE, &Overflow ); + L_y1 = L_shl_sat( L_sum, HP20_COEFF_SCALE ); BASOP_SATURATE_ERROR_OFF_EVS BASOP_SATURATE_WARNING_OFF_EVS - signal[i_mult( add( i, 1 ), stride )] = round_fx_o( L_shl_o( L_y1, prescale, &Overflow ), &Overflow ); + signal[i_mult( add( i, 1 ), stride )] = round_fx_sat( L_shl_sat( L_y1, prescale ) ); BASOP_SATURATE_WARNING_ON_EVS move16(); } @@ -190,10 +187,6 @@ void hp20( Word16 signal[], /* i/o: signal to filter any * { Word32 a1, b1, a2, b2; Word16 prescale, prescaleOld, diff; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - prescale = getScaleFactor16( signal, lg ); prescaleOld = extract_l( mem[4] ); @@ -202,7 +195,7 @@ void hp20( Word16 signal[], /* i/o: signal to filter any * { prescale = s_min( prescale, diff ); } - diff = norm_l( L_shl_o( mem[3], prescaleOld, &Overflow ) ); + diff = norm_l( L_shl_sat( mem[3], prescaleOld ) ); if ( mem[3] != 0 ) { prescale = s_min( prescale, diff ); @@ -212,13 +205,13 @@ void hp20( Word16 signal[], /* i/o: signal to filter any * IF( prescale != prescaleOld ) { diff = sub( prescale, prescaleOld ); - mem[0] = L_shr_o( mem[0], diff, &Overflow ); + mem[0] = L_shr_sat( mem[0], diff ); move32(); - mem[1] = L_shr_o( mem[1], diff, &Overflow ); + mem[1] = L_shr_sat( mem[1], diff ); move32(); - mem[2] = L_shr_o( mem[2], diff, &Overflow ); + mem[2] = L_shr_sat( mem[2], diff ); move32(); - mem[3] = L_shr_o( mem[3], diff, &Overflow ); + mem[3] = L_shr_sat( mem[3], diff ); //?sat move32(); mem[4] = L_deposit_l( prescale ); } @@ -293,8 +286,7 @@ void hp20( Word16 signal[], /* i/o: signal to filter any * } -#ifdef HP20_FIX32_RECODING -void hp20_fx_32( +void hp20_fx_32_opt( Word32 signal_fx[], const Word16 lg, Word32 mem_fx[], @@ -302,36 +294,42 @@ void hp20_fx_32( { Word32 i; Word32 a1_fx, a2_fx, b1_fx, b2_fx; - Word32 diff_pos, diff_neg; - Flag Overflow = 0; Word16 prescale, prescaleOld, prescale_current_frame, diff; + Word32 tmp_mem[4]; - prescale = getScaleFactor32( signal_fx, lg ); - prescale_current_frame = s_min( 3, sub( 1 + HP20_COEFF_SCALE, prescale ) ); - + prescale = L_norm_arr( signal_fx, lg ); + prescale_current_frame = sub( 1 + HP20_FX_COEFF_SCALE, prescale ); prescaleOld = extract_l( mem_fx[4] ); - diff_pos = norm_l( L_shl_o( L_max( mem_fx[2], mem_fx[3] ), prescaleOld, &Overflow ) ); - diff_neg = norm_l( L_shl_o( L_min( mem_fx[2], mem_fx[3] ), prescaleOld, &Overflow ) ); + tmp_mem[0] = L_shl_sat( mem_fx[0], prescaleOld ); + tmp_mem[1] = L_shl_sat( mem_fx[1], prescaleOld ); + tmp_mem[2] = L_shl_sat( mem_fx[2], prescaleOld ); + tmp_mem[3] = L_shl_sat( mem_fx[3], prescaleOld ); + move32(); + move32(); + move32(); + move32(); + + diff = L_norm_arr( tmp_mem, 4 ); - diff = L_max( diff_pos, diff_neg ); + prescale = s_min( prescale, diff ); - IF( NE_16( diff, 0 ) ) + prescale = sub( 1 + HP20_FX_COEFF_SCALE, prescale ); + if ( EQ_16( prescale_current_frame, 1 + HP20_FX_COEFF_SCALE - 31 ) || // signal_fx buffer contains only zeros, so use the mem_fx scale_factor instead + LT_16( prescale_current_frame, prescale ) ) // To avoid overflow in the subsequent shr() scaling for W_y1, W_y2, x2, and x1 calculations before the for loop. { - prescale = s_min( prescale, diff ); + prescale_current_frame = prescale; } - prescale = s_min( 3, sub( 1 + HP20_COEFF_SCALE, prescale ) ); - diff = sub( prescale, prescaleOld ); - mem_fx[0] = L_shr_o( mem_fx[0], diff, &Overflow ); + mem_fx[0] = L_shr_sat( mem_fx[0], diff ); + mem_fx[1] = L_shr_sat( mem_fx[1], diff ); + mem_fx[2] = L_shr_sat( mem_fx[2], diff ); + mem_fx[3] = L_shr_sat( mem_fx[3], diff ); move32(); - mem_fx[1] = L_shr_o( mem_fx[1], diff, &Overflow ); move32(); - mem_fx[2] = L_shr_o( mem_fx[2], diff, &Overflow ); move32(); - mem_fx[3] = L_shr_o( mem_fx[3], diff, &Overflow ); move32(); mem_fx[4] = L_deposit_l( prescale_current_frame ); move32(); @@ -342,10 +340,10 @@ void hp20_fx_32( [b,a] = butter(2, 20.0/4000.0, 'high'); b = [0.988954248067140 -1.977908496134280 0.988954248067140] a =[1.000000000000000 -1.977786483776764 0.978030508491796]*/ - a1_fx = 1061816033l /* 1.977786483776764 Q29*/; - a2_fx = -525076131l /*-0.978030508491796 Q29*/; - b1_fx = -1061881538l /*-1.977908496134280 Q29*/; - b2_fx = 530940769l /* 0.988954248067140 Q29*/; + a1_fx = 2123632067 /* 1.977786483776764 Q30*/; + a2_fx = -1050152262 /*-0.978030508491796 Q30*/; + b1_fx = -2123763076 /*-1.977908496134280 Q30*/; + b2_fx = 1061881538 /* 0.988954248067140 Q30*/; } ELSE IF( EQ_32( Fs, 16000 ) ) { @@ -353,10 +351,10 @@ void hp20_fx_32( [b,a] = butter(2, 20.0/8000.0, 'high'); b =[ 0.994461788958195 -1.988923577916390 0.994461788958195] a =[1.000000000000000 -1.988892905899653 0.988954249933127] */ - a1_fx = 1067778748l /* 1.988892905899653 Q29*/; - a2_fx = -530940770l /*-0.988954249933127 Q29*/; - b1_fx = -1067795215l /*-1.988923577916390 Q29*/; - b2_fx = 533897608l /* 0.994461788958195 Q29*/; + a1_fx = 2135557497 /* 1.988892905899653 Q30*/; + a2_fx = -1061881540 /*-0.988954249933127 Q30*/; + b1_fx = -2135590430 /*-1.988923577916390 Q30*/; + b2_fx = 1067795215 /* 0.994461788958195 Q30*/; } ELSE IF( EQ_32( Fs, 32000 ) ) { @@ -364,10 +362,10 @@ void hp20_fx_32( [b,a] = butter(2, 20.0/16000.0, 'high'); b =[0.997227049904470 -1.994454099808940 0.997227049904470] a =[1.000000000000000 -1.994446410541927 0.994461789075954]*/ - a1_fx = 1070760263l /* 1.994446410541927 Q29*/; - a2_fx = -533897608l /*-0.994461789075954 Q29*/; - b1_fx = -1070764392l /*-1.994454099808940 Q29*/; - b2_fx = 535382196l /* 0.997227049904470 Q29*/; + a1_fx = 2141520527 /* 1.994446410541927 Q30*/; + a2_fx = -1067795215 /*-0.994461789075954 Q30*/; + b1_fx = -2141528783 /*-1.994454099808940 Q30*/; + b2_fx = 1070764392 /* 0.997227049904470 Q30*/; } ELSE { @@ -375,10 +373,10 @@ void hp20_fx_32( [b,a] = butter(2, 20.0/24000.0, 'high'); b =[ 0.998150511190452 -1.996301022380904 0.998150511190452] a =[1.000000000000000 -1.996297601769122 0.996304442992686]*/ - a1_fx = 1071754114l /* 1.996297601769122 Q29*/; - a2_fx = -534886875l /*-0.996304442992686 Q29*/; - b1_fx = -1071755951l /*-1.996301022380904 Q29*/; - b2_fx = 535877975l /* 0.998150511190452 Q29*/; + a1_fx = 2143508228 /* 1.996297601769122 Q30*/; + a2_fx = -1069773750 /*-0.996304442992686 Q30*/; + b1_fx = -2143511901 /*-1.996301022380904 Q30*/; + b2_fx = 1071755951 /* 0.998150511190452 Q30*/; } move32(); move32(); @@ -387,24 +385,24 @@ void hp20_fx_32( Word64 W_sum, W_y0, W_y1, W_y2; Word32 x0, x1, x2; - W_sum = W_mult_32_32( b2_fx, mem_fx[2] ); /* b2*x2 */ - W_sum = W_mac_32_32( W_sum, b1_fx, mem_fx[3] ); /* b1*x1 */ + W_sum = W_mult0_32_32( b2_fx, mem_fx[2] ); /* b2*x2 */ + W_sum = W_add( W_sum, W_mult0_32_32( b1_fx, mem_fx[3] ) ); /* b1*x1 */ x2 = L_shr( signal_fx[0], prescale ); - W_sum = W_mac_32_32( W_sum, b2_fx, x2 ); /* b2*x0 */ - W_sum = W_mac_32_32( W_sum, mem_fx[0], a2_fx ); /* y2*a2 */ - W_sum = W_mac_32_32( W_sum, mem_fx[1], a1_fx ); /* y1*a1 */ - W_y2 = W_shl( W_sum, HP20_COEFF_SCALE ); - signal_fx[0] = W_extract_h( W_shl( W_y2, prescale ) ); + W_sum = W_add( W_sum, W_mult0_32_32( b2_fx, x2 ) ); /* b2*x0 */ + W_sum = W_add( W_sum, W_mult0_32_32( mem_fx[0], a2_fx ) ); /* y2*a2 */ + W_sum = W_add( W_sum, W_mult0_32_32( mem_fx[1], a1_fx ) ); /* y1*a1 */ + W_y2 = W_shl( W_sum, 1 + HP20_FX_COEFF_SCALE ); + signal_fx[0] = W_round64_L( W_shl( W_y2, prescale ) ); move32(); - W_sum = W_mult_32_32( b2_fx, mem_fx[3] ); /* b2*x2 */ - W_sum = W_mac_32_32( W_sum, b1_fx, x2 ); /* b1*x1 */ + W_sum = W_mult0_32_32( b2_fx, mem_fx[3] ); /* b2*x2 */ + W_sum = W_add( W_sum, W_mult0_32_32( b1_fx, x2 ) ); /* b1*x1 */ x1 = L_shr( signal_fx[1], prescale ); - W_sum = W_mac_32_32( W_sum, b2_fx, x1 ); /* b2*x0 */ - W_sum = W_mac_32_32( W_sum, mem_fx[1], a2_fx ); /* y2*a2 */ - W_sum = W_mac_32_32( W_sum, W_extract_h( W_y2 ), a1_fx ); /* y1*a1 */ - W_y1 = W_shl( W_sum, HP20_COEFF_SCALE ); - signal_fx[1] = W_extract_h( W_shl( W_y1, prescale ) ); + W_sum = W_add( W_sum, W_mult0_32_32( b2_fx, x1 ) ); /* b2*x0 */ + W_sum = W_add( W_sum, W_mult0_32_32( mem_fx[1], a2_fx ) ); /* y2*a2 */ + W_sum = W_add( W_sum, W_mult0_32_32( W_round64_L( W_y2 ), a1_fx ) ); /* y1*a1 */ + W_y1 = W_shl( W_sum, 1 + HP20_FX_COEFF_SCALE ); + signal_fx[1] = W_round64_L( W_shl( W_y1, prescale ) ); move32(); diff = sub( prescale_current_frame, prescale ); @@ -415,15 +413,15 @@ void hp20_fx_32( FOR( i = 2; i < lg; i++ ) { - W_sum = W_mult_32_32( b2_fx, x2 ); /* b2*x2 */ - W_sum = W_mac_32_32( W_sum, b1_fx, x1 ); /* b1*x1 */ + W_sum = W_mult0_32_32( b2_fx, x2 ); /* b2*x2 */ + W_sum = W_add( W_sum, W_mult0_32_32( b1_fx, x1 ) ); /* b1*x1 */ x0 = L_shr( signal_fx[i], prescale_current_frame ); - W_sum = W_mac_32_32( W_sum, b2_fx, x0 ); /* b2*x0 */ - W_sum = W_mac_32_32( W_sum, W_extract_h( W_y2 ), a2_fx ); /* y2*a2 */ - W_sum = W_mac_32_32( W_sum, W_extract_h( W_y1 ), a1_fx ); /* y1*a1 */ - W_y0 = W_shl( W_sum, HP20_COEFF_SCALE ); + W_sum = W_add( W_sum, W_mult0_32_32( b2_fx, x0 ) ); /* b2*x0 */ + W_sum = W_add( W_sum, W_mult0_32_32( W_round64_L( W_y2 ), a2_fx ) ); /* y2*a2 */ + W_sum = W_add( W_sum, W_mult0_32_32( W_round64_L( W_y1 ), a1_fx ) ); /* y1*a1 */ + W_y0 = W_shl( W_sum, 1 + HP20_FX_COEFF_SCALE ); - signal_fx[i] = W_extract_h( W_shl( W_y0, prescale_current_frame ) ); + signal_fx[i] = W_round64_L( W_shl( W_y0, prescale_current_frame ) ); move32(); x2 = x1; @@ -437,8 +435,8 @@ void hp20_fx_32( move64(); } - mem_fx[0] = W_extract_h( W_y2 ); - mem_fx[1] = W_extract_h( W_y1 ); + mem_fx[0] = W_round64_L( W_y2 ); + mem_fx[1] = W_round64_L( W_y1 ); mem_fx[2] = x2; mem_fx[3] = x1; @@ -449,7 +447,8 @@ void hp20_fx_32( return; } -#else + + void hp20_fx_32( Word32 signal_fx[], const Word16 lg, @@ -458,14 +457,8 @@ void hp20_fx_32( { Word16 i; Word32 a1_fx, a2_fx, b1_fx, b2_fx; -#ifdef OPT_STEREO_32KBPS_V1 - Word16 Qy1, Qy2, Qmin; - Word64 y0_fx64, y1_fx64, y2_fx64; - Word32 x0, x1, x2; -#else /* OPT_STEREO_32KBPS_V1 */ Word16 Qx0, Qx1, Qx2, Qy1, Qprev_y1, Qy2, Qprev_y2, Qmin; Word64 x0_fx64, x1_fx64, x2_fx64, y0_fx64, y1_fx64, y2_fx64, R1, R2, R3, R4, R5; -#endif /* OPT_STEREO_32KBPS_V1 */ IF( EQ_32( Fs, 8000 ) ) { @@ -516,64 +509,15 @@ void hp20_fx_32( move32(); move32(); -#ifdef OPT_STEREO_32KBPS_V1 - y1_fx64 = W_add( W_deposit32_l( mem_fx[0] ), W_deposit32_h( mem_fx[1] ) ); - y2_fx64 = W_add( W_deposit32_l( mem_fx[2] ), W_deposit32_h( mem_fx[3] ) ); - - x0 = mem_fx[4]; - move32(); - x1 = mem_fx[5]; - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ Qprev_y1 = extract_l( mem_fx[4] ); Qprev_y2 = extract_l( mem_fx[5] ); y1_fx64 = W_deposit32_l( mem_fx[0] ); y2_fx64 = W_deposit32_l( mem_fx[1] ); x0_fx64 = W_deposit32_l( mem_fx[2] ); x1_fx64 = W_deposit32_l( mem_fx[3] ); -#endif /* OPT_STEREO_32KBPS_V1 */ FOR( i = 0; i < lg; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 - x2 = x1; - move32(); - x1 = x0; - move32(); - x0 = signal_fx[i]; - move32(); - - Qy1 = W_norm( y1_fx64 ); - if ( y1_fx64 == 0 ) - { - Qy1 = 62; - move16(); - } - - Qy2 = W_norm( y2_fx64 ); - if ( y2_fx64 == 0 ) - { - Qy2 = 62; - move16(); - } - - Qmin = s_min( Qy1, Qy2 ); - - Qmin = sub( Qmin, 34 ); - - y0_fx64 = W_mac_32_32( W_mult_32_32( W_shl_sat_l( y1_fx64, Qmin ), a1_fx ), W_shl_sat_l( y2_fx64, Qmin ), a2_fx ); // Qmin + Q29 + Q30 + 1 - - Word64 temp = W_mac_32_32( W_mac_32_32( W_mult_32_32( x2, b2_fx ), x1, b1_fx ), x0, b2_fx ); // Q30 - Word64 y0_fx = W_shr( y0_fx64, add( Qmin, Q30 ) ); // Q30 - y0_fx64 = W_add( temp, y0_fx ); // Q30 - signal_fx[i] = W_shl_sat_l( y0_fx64, -Q30 ); - move32(); - - y2_fx64 = y1_fx64; - move64(); - y1_fx64 = y0_fx64; - move64(); -#else /* OPT_STEREO_32KBPS_V1 */ x2_fx64 = x1_fx64; move64(); x1_fx64 = x0_fx64; @@ -587,7 +531,7 @@ void hp20_fx_32( move16(); } Qy1 = sub( Qy1, 34 ); - R1 = W_mult0_32_32( W_extract_l( W_shl( y1_fx64, Qy1 ) ), a1_fx ); + R1 = W_mult0_32_32( W_shl_sat_l( y1_fx64, Qy1 ), a1_fx ); Qy1 = add( Qy1, Qprev_y1 ); Qy2 = W_norm( y2_fx64 ); @@ -597,7 +541,7 @@ void hp20_fx_32( move16(); } Qy2 = sub( Qy2, 34 ); - R2 = W_mult0_32_32( W_extract_l( W_shl( y2_fx64, Qy2 ) ), a2_fx ); + R2 = W_mult0_32_32( W_shl_sat_l( y2_fx64, Qy2 ), a2_fx ); Qy2 = add( Qy2, Qprev_y2 ); Qx0 = W_norm( x0_fx64 ); @@ -607,7 +551,7 @@ void hp20_fx_32( move16(); } Qx0 = sub( Qx0, 34 ); - R3 = W_mult0_32_32( W_extract_l( W_shl( x0_fx64, Qx0 ) ), b2_fx ); + R3 = W_mult0_32_32( W_shl_sat_l( x0_fx64, Qx0 ), b2_fx ); Qx1 = W_norm( x1_fx64 ); if ( x1_fx64 == 0 ) @@ -616,7 +560,7 @@ void hp20_fx_32( move16(); } Qx1 = sub( Qx1, 34 ); - R4 = W_mult0_32_32( W_extract_l( W_shl( x1_fx64, Qx1 ) ), b1_fx ); + R4 = W_mult0_32_32( W_shl_sat_l( x1_fx64, Qx1 ), b1_fx ); Qx2 = W_norm( x2_fx64 ); if ( x2_fx64 == 0 ) @@ -625,7 +569,7 @@ void hp20_fx_32( move16(); } Qx2 = sub( Qx2, 34 ); - R5 = W_mult0_32_32( W_extract_l( W_shl( x2_fx64, Qx2 ) ), b2_fx ); + R5 = W_mult0_32_32( W_shl_sat_l( x2_fx64, Qx2 ), b2_fx ); Qmin = s_min( Qy1, Qy2 ); @@ -655,17 +599,8 @@ void hp20_fx_32( move64(); move16(); move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ } -#ifdef OPT_STEREO_32KBPS_V1 - mem_fx[0] = W_extract_l( y1_fx64 ); - mem_fx[1] = W_extract_h( y1_fx64 ); - mem_fx[2] = W_extract_l( y2_fx64 ); - mem_fx[3] = W_extract_h( y2_fx64 ); - mem_fx[4] = x0; - mem_fx[5] = x1; -#else /* OPT_STEREO_32KBPS_V1 */ Qy1 = W_norm( y1_fx64 ); test(); IF( y1_fx64 != 0 && LT_16( Qy1, 32 ) ) @@ -688,7 +623,6 @@ void hp20_fx_32( mem_fx[3] = W_extract_l( x1_fx64 ); mem_fx[4] = Qprev_y1; mem_fx[5] = Qprev_y2; -#endif /* OPT_STEREO_32KBPS_V1 */ move32(); move32(); @@ -699,4 +633,3 @@ void hp20_fx_32( return; } -#endif diff --git a/lib_com/hq2_bit_alloc_fx.c b/lib_com/hq2_bit_alloc_fx.c index 61d00ce987958b6092975f5464c0108192b6ea7b..e4c671a74c7b65877dd9facc121b2c9dcd644d4a 100644 --- a/lib_com/hq2_bit_alloc_fx.c +++ b/lib_com/hq2_bit_alloc_fx.c @@ -187,7 +187,7 @@ void Bits2indvsb_fx( exp_normn = sub( exp_normn, 1 ); exp_normd = norm_s( Rcnt_fx ); Ravg_fx = div_s( shl( be_sum_fx, exp_normn ), shl( Rcnt_fx, exp_normd ) ); - Ravg_fx = shr( Ravg_fx, 2 ); /* safe shift exp_normn - exp_normd + 13*/ + Ravg_fx = shr( Ravg_fx, 2 ); /* safe shift exp_normn - exp_normd + 13*/ QRavg = add( sub( exp_normn, exp_normd ), 15 - 2 ); if ( be_sum_fx <= 0 ) @@ -207,7 +207,7 @@ void Bits2indvsb_fx( exp_normn = sub( exp_normn, 1 ); exp_normd = norm_s( be_sum_fx ); Bits_avg_fx = div_s( shl( Bits, exp_normn ), shl( be_sum_fx, exp_normd ) ); - Bits_avg_fx = shr( Bits_avg_fx, 2 ); /* safe_shift exp_normn - exp_normd + 13*/ + Bits_avg_fx = shr( Bits_avg_fx, 2 ); /* safe_shift exp_normn - exp_normd + 13*/ QBavg = add( sub( exp_normn, exp_normd ), 15 - 2 ); } FOR( k = 0; k <= i; k++ ) @@ -262,7 +262,7 @@ void hq2_bit_alloc_har_fx( Word16 B_fx, /* i : Q0 number of available bits */ const Word16 N_fx, /* i : Q0 number of sub-vectors */ Word32 *L_Rsubband, /* o : QRk sub-band bit-allocation vector */ - Word16 p2a_bands_fx, /* i : Q0 highfreq bands */ + Word16 p2a_bands_fx, /* i : Q0 highfreq bands */ const Word32 L_core_brate, /* i : Q0 core bit rate */ Word16 p2a_flags_fx[], /* i/o: Q0 p2a_flags */ const Word16 band_width_fx[] /* i : Q0 table of band_width */ @@ -312,10 +312,6 @@ void hq2_bit_alloc_har_fx( Word16 exp_shift; - Flag Overflow; - Overflow = 0; - move32(); - L_THR1 = L_shl( L_deposit_l( THR1 ), SWB_BWE_LR_QRk ); L_THR2 = L_shl( L_deposit_l( THR2 ), SWB_BWE_LR_QRk ); L_THR3 = L_shl( L_deposit_l( THR3 ), SWB_BWE_LR_QRk ); @@ -570,9 +566,7 @@ void hq2_bit_alloc_har_fx( L_temp = Mult_32_16( L_Ravg_sub[GRP_SB - 1], sub( GRP_SB, 1 ) ); /* Qbe+0+1 */ L_temp = Mult_32_16( L_temp, Inv_norm_sum_fx ); /* Qbe+1+QIpb+1 */ - lf_hf_ge_r_fx = round_fx_o( L_shl_o( L_temp, sub( 15 + 16, sub( add( SWB_BWE_LR_Qbe, QIns ), 30 ) ), &Overflow ), &Overflow ); - Overflow = 0; /* reset BASOP Overflow */ - move32(); + lf_hf_ge_r_fx = round_fx_sat( L_shl_sat( L_temp, sub( 15 + 16, sub( add( SWB_BWE_LR_Qbe, QIns ), 30 ) ) ) ); exp_normn = norm_s( norm_sum_fx ); exp_normn = sub( exp_normn, 1 ); diff --git a/lib_com/hq2_core_com.c b/lib_com/hq2_core_com.c deleted file mode 100644 index 121dae06a1ef18c4cd878c09921758a9d0ced65e..0000000000000000000000000000000000000000 --- a/lib_com/hq2_core_com.c +++ /dev/null @@ -1,177 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include -#include "cnst.h" -#include "rom_com.h" -#include "prot_fx.h" -#include "basop_util.h" -#include "basop_proto_func.h" -#include "wmc_auto.h" - - -#define WMC_TOOL_SKIP -void bit_allocation_second_fx2( - Word32 *Rk, /* Q16 */ - Word32 *Rk_sort, /* Q16 */ - Word16 BANDS, /* Q0 */ - const Word16 *band_width, /* Q0 */ - Word16 *k_sort, /* Q0 */ - Word16 *k_num, /* Q0 */ - const Word16 *p2a_flags, /* Q0 */ - const Word16 p2a_bands, /* Q0 */ - const Word16 *last_bitalloc, /* Q0 */ - const Word16 input_frame /* Q0 */ -) -{ - Word16 k, k2 = 0; - Word16 ever_bits[BANDS_MAX], ever_sort[BANDS_MAX]; /*Q12 */ - Word16 class_flag = 0; - Word16 rk_temp = 32767, ever_temp = 32767; /*Q12 */ - Word16 exp; - Word16 tmp; - Word32 L_tmp; - move16(); - move16(); - move16(); - move16(); - - - FOR( k = 0; k < BANDS; k++ ) - { - test(); - test(); - IF( ( ( sub( k_sort[k], sub( BANDS, p2a_bands ) ) >= 0 ) && ( sub( p2a_flags[k_sort[k]], 1 ) == 0 ) ) || - ( ( sub( k_sort[k], ( BANDS - 2 ) ) >= 0 ) && ( sub( last_bitalloc[k_sort[k] - ( BANDS - 2 )], 1 ) == 0 ) ) ) - { - exp = norm_s( band_width[k_sort[k]] ); - tmp = shl( band_width[k_sort[k]], exp ); /*Q(exp) */ - tmp = div_s( 16384, tmp ); /*Q(15+14-exp = 29-exp) */ - L_tmp = Mult_32_16( Rk_sort[k], tmp ); /* Q(16+29-exp-15 = 30-exp) */ - tmp = sub( 18, exp ); - ever_bits[k] = extract_l( L_shr( L_tmp, tmp ) ); /*Q12 */ - if ( sub( ever_bits[k], rk_temp ) < 0 ) - { - rk_temp = ever_bits[k]; /* Q12 */ - k2 = k; - move16(); - move16(); - } - class_flag = 1; - move16(); - } - } - IF( class_flag == 0 || sub( input_frame, L_FRAME8k ) == 0 ) - { - FOR( k = 0; k < BANDS; k++ ) - { - test(); - IF( sub( k_sort[k], sub( BANDS, p2a_bands ) ) < 0 && Rk_sort[k] > 0 ) - { - exp = norm_s( band_width[k_sort[k]] ); - tmp = shl( band_width[k_sort[k]], exp ); /*Q(exp) */ - tmp = div_s( 16384, tmp ); /*Q(15+14-exp = 29-exp) */ - L_tmp = Mult_32_16( Rk_sort[k], tmp ); /* Q(16+29-exp-15 = 30-exp) */ - tmp = sub( 18, exp ); - ever_sort[k] = extract_l( L_shr( L_tmp, tmp ) ); /*Q12 */ - move16(); - IF( sub( ever_sort[k], ever_temp ) < 0 ) - { - ever_temp = ever_sort[k]; /* Q12 */ - move16(); - k2 = k; - move16(); - } - } - } - } - - k_num[0] = k2; - move16(); - IF( sub( k_sort[k2], sub( BANDS, 1 ) ) == 0 ) - { - FOR( k = 0; k < BANDS; k++ ) - { - IF( sub( k_sort[k], sub( k_sort[k2], 1 ) ) == 0 ) - { - k_num[1] = k; /* Q0 */ - move16(); - } - } - } - ELSE IF( k_sort[k2] == 0 ) - { - FOR( k = 0; k < BANDS; k++ ) - { - IF( sub( k_sort[k], add( k_sort[k2], 1 ) ) == 0 ) - { - k_num[1] = k; /* Q0 */ - move16(); - } - } - } - ELSE - { - IF( L_sub( Rk[sub( k_sort[k2], 1 )], Rk[add( k_sort[k2], 1 )] ) < 0 ) - { - FOR( k = 0; k < BANDS; k++ ) - { - IF( sub( k_sort[k], sub( k_sort[k2], 1 ) ) == 0 ) - { - k_num[1] = k; /* Q0 */ - move16(); - } - } - } - ELSE - { - FOR( k = 0; k < BANDS; k++ ) - { - IF( sub( k_sort[k], add( k_sort[k2], 1 ) ) == 0 ) - { - k_num[1] = k; /* Q0 */ - move16(); - } - } - } - } - - return; -} - -#undef WMC_TOOL_SKIP diff --git a/lib_com/hq2_core_com_fx.c b/lib_com/hq2_core_com_fx.c index bf0af5e87d969e7f2f4a226b008982dc83a97ac9..78f60d4659b3eb2e3d64e98c2904dd75eccfc1ee 100644 --- a/lib_com/hq2_core_com_fx.c +++ b/lib_com/hq2_core_com_fx.c @@ -88,11 +88,6 @@ void mdct_spectrum_denorm_fx( Word16 cond_fx; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); /* allow overflow happen. */ -#endif - exp_safe = 4; /* safe bit for overflow */ move16(); @@ -163,9 +158,8 @@ void mdct_spectrum_denorm_fx( pd_fx = div_s( shl( npulses[k], exp_normn ), shl( band_width[k], exp_normd ) ); /* 15 + (exp_norm - exp_normd) */ Qpd = add( sub( exp_normn, exp_normd ), 15 ); - cond_fx = sub( shl_o( pd_fx, sub( 15, Qpd ), &Overflow ), pd_thresh_fx /*Q15*/ ); /* Q15 */ - Overflow = 0; - move16(); /* allow overflow happen. */ + cond_fx = sub( shl_sat( pd_fx, sub( 15, Qpd ) ), pd_thresh_fx /*Q15*/ ); /* Q15 */ + move16(); /* allow overflow happen. */ IF( cond_fx < 0 ) { /*gain_tweak = (float) pow (2.0f, (ld_slope * log2_f (pd / pd_thresh))); */ @@ -196,7 +190,7 @@ void mdct_spectrum_denorm_fx( /*gamma *= gain_tweak; */ L_tmp = L_mult( gamma_fx, gain_tweak_fx ); /* Qgamma+Qtweak+1 */ exp_norm = norm_l( L_tmp ); - gamma_fx = round_fx_o( L_shl_o( L_tmp, exp_norm, &Overflow ), &Overflow ); + gamma_fx = round_fx_sat( L_shl( L_tmp, exp_norm ) ); Qgamma = sub( add( add( Qgamma, Qtweak ), exp_norm ), 15 ); /*Qgamma+Qtweak+1+exp_norm-16; */ } @@ -260,11 +254,6 @@ void mdct_spectrum_denorm_ivas_fx( Word16 cond_fx; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); /* allow overflow happen. */ -#endif - exp_safe = 4; /* safe bit for overflow */ move16(); @@ -335,9 +324,8 @@ void mdct_spectrum_denorm_ivas_fx( pd_fx = div_s( shl( npulses[k], exp_normn ), shl( band_width[k], exp_normd ) ); /* 15 + (exp_normn + exp_normd) */ Qpd = add( sub( exp_normn, exp_normd ), 15 ); - cond_fx = sub( shl_o( pd_fx, sub( 15, Qpd ), &Overflow ), pd_thresh_fx /*Q15*/ ); /* Q15 */ - Overflow = 0; - move16(); /* allow overflow happen. */ + cond_fx = sub( shl_sat( pd_fx, sub( 15, Qpd ) ), pd_thresh_fx /*Q15*/ ); /* Q15 */ + move16(); /* allow overflow happen. */ IF( cond_fx < 0 ) { /*gain_tweak = (float) pow (2.0f, (ld_slope * log2_f (pd / pd_thresh))); */ @@ -368,7 +356,7 @@ void mdct_spectrum_denorm_ivas_fx( /*gamma *= gain_tweak; */ L_tmp = L_mult( gamma_fx, gain_tweak_fx ); /* Qgamma+Qtweak+1 */ exp_norm = norm_l( L_tmp ); - gamma_fx = round_fx_o( L_shl_o( L_tmp, exp_norm, &Overflow ), &Overflow ); + gamma_fx = round_fx_sat( L_shl( L_tmp, exp_norm ) ); Qgamma = sub( add( add( Qgamma, Qtweak ), exp_norm ), 15 ); /*Qgamma+Qtweak+1+exp_norm-16; */ } @@ -641,7 +629,7 @@ void reverse_transient_frame_energies_fx( p_be2--; } - k1 = sub( bands, bands_4 ); /* 3*bands/4 Q0 */ + k1 = sub( bands, bands_4 ); /* 3*bands/4 Q0 */ k2 = sub( bands, 1 ); /* Q0 */ p_be1 = &L_band_energy[k1]; /* Q14 */ p_be2 = &L_band_energy[k2]; /* Q14 */ @@ -751,13 +739,13 @@ void spt_shorten_domain_pre_fx( *--------------------------------------------------------------------------*/ void spt_shorten_domain_band_save_fx( - const Word16 bands, /* i: total subband Q0*/ - const Word16 band_start[], /* i: starting position of subband Q0*/ - const Word16 band_end[], /* i: end position of subband Q0*/ - const Word16 band_width[], /* i: band width of subband Q0*/ - Word16 org_band_start[], /* o: starting position of subband Q0*/ - Word16 org_band_end[], /* o: end position of subband Q0*/ - Word16 org_band_width[] /* o: band width of subband Q0*/ + const Word16 bands, /* i: total subband Q0*/ + const Word16 band_start[], /* i: starting position of subband Q0*/ + const Word16 band_end[], /* i: end position of subband Q0*/ + const Word16 band_width[], /* i: band width of subband Q0*/ + Word16 org_band_start[], /* o: starting position of subband Q0*/ + Word16 org_band_end[], /* o: end position of subband Q0*/ + Word16 org_band_width[] /* o: band width of subband Q0*/ ) { Word16 k; @@ -786,13 +774,13 @@ void spt_shorten_domain_band_save_fx( *--------------------------------------------------------------------------*/ void spt_shorten_domain_band_restore_fx( - const Word16 bands, /* i: total subband Q0*/ - Word16 band_start[], /* i/o: starting position of subband Q0*/ - Word16 band_end[], /* i/o: end position of subband Q0*/ - Word16 band_width[], /* i/o: band width of subband Q0*/ - const Word16 org_band_start[], /* o: starting position of subband Q0*/ - const Word16 org_band_end[], /* o: end position of subband Q0*/ - const Word16 org_band_width[] /* o: band width of subband Q0*/ + const Word16 bands, /* i: total subband Q0*/ + Word16 band_start[], /* i/o: starting position of subband Q0*/ + Word16 band_end[], /* i/o: end position of subband Q0*/ + Word16 band_width[], /* i/o: band width of subband Q0*/ + const Word16 org_band_start[], /* o: starting position of subband Q0*/ + const Word16 org_band_end[], /* o: end position of subband Q0*/ + const Word16 org_band_width[] /* o: band width of subband Q0*/ ) { Word16 k; @@ -821,11 +809,11 @@ void spt_shorten_domain_band_restore_fx( *--------------------------------------------------------------------------*/ void spt_swb_peakpos_tmp_save_fx( - const Word32 L_y2[], /* i: coded spectral information Qx*/ - const Word16 bands, /* i: total number of bands Q0*/ - const Word16 band_start[], /* i: starting position of subband Q0*/ - const Word16 band_end[], /* i: end position of subband Q0*/ - Word16 prev_SWB_peak_pos_tmp[] /* o: spectral peaks Q0*/ + const Word32 L_y2[], /* i: coded spectral information Qx*/ + const Word16 bands, /* i: total number of bands Q0*/ + const Word16 band_start[], /* i: starting position of subband Q0*/ + const Word16 band_end[], /* i: end position of subband Q0*/ + Word16 prev_SWB_peak_pos_tmp[] /* o: spectral peaks Q0*/ ) { diff --git a/lib_com/hq2_noise_inject_fx.c b/lib_com/hq2_noise_inject_fx.c index bc96fe0f8fd62525c23e6b49845f01cdcd68d515..76efad10e991b289bd73e343153f8440468cc7b5 100644 --- a/lib_com/hq2_noise_inject_fx.c +++ b/lib_com/hq2_noise_inject_fx.c @@ -80,17 +80,13 @@ void hq2_noise_inject_fx( Word16 i, j, k, ni_end_band, satur, count[BANDS_MAX], max_pos_pulse, pos; Word16 sb = bands; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif satur = 0; move16(); FOR( i = 0; i < bands; i++ ) { - Ep_fx[i] = L_shl_o( Ep_fx[i], 6, &Overflow ); /* Q-6 -> Q0 */ + Ep_fx[i] = L_shl_sat( Ep_fx[i], 6 ); /* Q-6 -> Q0 */ move32(); } @@ -155,7 +151,7 @@ void hq2_noise_inject_fx( Q_env_fx[k] = sub( 31, exp2 ); move16(); tmp = sub( 17, Q_env_fx[k] ); - env_fx2[k] = extract_h( L_shl_o( env_fx[k], tmp, &Overflow ) ); /*Q1 */ + env_fx2[k] = extract_h( L_shl_sat( env_fx[k], tmp ) ); /*Q1 */ peak_fx[k] = 0; move16(); count[k] = 0; @@ -166,7 +162,7 @@ void hq2_noise_inject_fx( FOR( i = band_start[k]; i <= band_end[k]; i++ ) { L_tmp = L_mult0( y2hat_fx[i], y2hat_fx[i] ); /* Q0 */ - Ep_fx[k] = L_sub_o( Ep_fx[k], L_tmp, &Overflow ); + Ep_fx[k] = L_sub_sat( Ep_fx[k], L_tmp ); move32(); /* Q0 */ IF( GT_16( abs_s( y2hat_fx[i] ), peak_fx[k] ) ) { @@ -386,8 +382,8 @@ void hq2_noise_inject_fx( } ELSE IF( count[k - 1] == 0 && tmp4 > 0 ) { - L_tmp = L_mult( env_fx2[k - 1], tmp ); /* Q(1+Q_speech+1 = Q_speech+2) */ - fac_fx = extract_h( L_shl_o( L_tmp, sub( 26, Q_speech ), &Overflow ) ); /*Q12 */ + L_tmp = L_mult( env_fx2[k - 1], tmp ); /* Q(1+Q_speech+1 = Q_speech+2) */ + fac_fx = extract_h( L_shl_sat( L_tmp, sub( 26, Q_speech ) ) ); /*Q12 */ } } @@ -467,7 +463,7 @@ void hq2_noise_inject_fx( } L_tmp = Mult_32_16( Ep_fx[k], fac_fx ); /*Q(Q_Ep_fx[k]+12-15 = Q_Ep_fx[k]-3) */ - ni_gain_fx[k] = L_shr_o( L_tmp, sub( Q_Ep_fx[k], 20 ), &Overflow ); + ni_gain_fx[k] = L_shr_sat( L_tmp, sub( Q_Ep_fx[k], 20 ) ); move32(); /*Q17 */ } ELSE @@ -589,14 +585,14 @@ void hq2_noise_inject_fx( L_tmp = Mult_32_16( Ep_fx[k], tmp ); /*Q(Q_Ep_fx[k]+28-Q_speech-15 = Q_Ep_fx[k]+13-Q_speech) */ tmp = sub( Q_Ep_fx[k], Q_speech ); tmp = sub( 15, tmp ); - tmp = extract_h( L_shl_o( L_tmp, tmp, &Overflow ) ); /*Q12 */ + tmp = extract_h( L_shl_sat( L_tmp, tmp ) ); /*Q12 */ } ELSE { tmp = 0x7fff; /*Q0 */ L_tmp = Mult_32_16( Ep_fx[k], tmp ); /*Q(Q_Ep_fx[k]+0-15 = Q_Ep_fx[k]-15) */ tmp = sub( 43, Q_Ep_fx[k] ); - tmp = extract_h( L_shl_o( L_tmp, tmp, &Overflow ) ); /*Q12 */ + tmp = extract_h( L_shl_sat( L_tmp, tmp ) ); /*Q12 */ } fac_fx = s_max( tmp, 4096 /* 1 in Q12 */ ); /*Q12 */ @@ -608,8 +604,8 @@ void hq2_noise_inject_fx( IF( band_width[k] != 0 ) { Q_speech = norm_s( band_width[k] ); - tmp = shl_o( band_width[k], Q_speech, &Overflow ); /*Q(Q_speech) */ - tmp = div_s( 16384 /* 0.5 in Q15 */, tmp ); /*Q(15+14-Q_speech) */ + tmp = shl_sat( band_width[k], Q_speech ); /*Q(Q_speech) */ + tmp = div_s( 16384 /* 0.5 in Q15 */, tmp ); /*Q(15+14-Q_speech) */ } ELSE { @@ -618,12 +614,12 @@ void hq2_noise_inject_fx( move16(); move16(); } - tmp1 = sub( fac_fx, 4096 /* 1 in Q12 */ ); /*Q12 */ - L_tmp = L_mult( tmp1, j ); /*Q13 */ - L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(13+29-Q_speech-15 = 27-Q_speech) */ - tmp = extract_h( L_shl_o( L_tmp, add( 1, Q_speech ), &Overflow ) ); /*Q12 */ - tmp = sub( fac_fx, tmp ); /*Q12 */ - L_tmp = Mult_32_16( ni_gain_fx[k], tmp ); /*Q(17+12-15=14) */ + tmp1 = sub( fac_fx, 4096 /* 1 in Q12 */ ); /*Q12 */ + L_tmp = L_mult( tmp1, j ); /*Q13 */ + L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(13+29-Q_speech-15 = 27-Q_speech) */ + tmp = extract_h( L_shl_sat( L_tmp, add( 1, Q_speech ) ) ); /*Q12 */ + tmp = sub( fac_fx, tmp ); /*Q12 */ + L_tmp = Mult_32_16( ni_gain_fx[k], tmp ); /*Q(17+12-15=14) */ L_y2[i] = L_add( L_y2[i], L_shr( Mult_32_16( L_tmp, rand_fx ), 2 ) ); move32(); /*Q12 */ } diff --git a/lib_com/hq_bit_allocation_fx.c b/lib_com/hq_bit_allocation_fx.c index c3fc6a3a59ca8ff21dd5fedbf9c52095ffb6463f..c1efb9def8e6cd00471c788298241b93679727aa 100644 --- a/lib_com/hq_bit_allocation_fx.c +++ b/lib_com/hq_bit_allocation_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include "options.h" /* Compilation switches */ diff --git a/lib_com/hq_conf.c b/lib_com/hq_conf.c deleted file mode 100644 index 90a256ceab3e43b00c51885fe3e3ac35efea1113..0000000000000000000000000000000000000000 --- a/lib_com/hq_conf.c +++ /dev/null @@ -1,303 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include "cnst.h" -#include "rom_com.h" -#include "prot_fx.h" -#include "wmc_auto.h" - - -void hq_configure_fx( - const Word16 length, /* i : Frame length Q0 */ - const Word16 hqswb_clas, /* i : HQ SWB class Q0 */ - const Word32 core_brate, /* i : Codec bitrate Q0 */ - Word16 *num_sfm, /* o : Total number of subbands Q0 */ - Word16 *nb_sfm, /* o : Total number of coded bands Q0 */ - Word16 *start_norm, /* o : First norm to be SDE encoded Q0 */ - Word16 *num_env_bands, /* o : Number coded envelope bands Q0 */ - Word16 *numnrmibits, /* o : Number of bits in fall-back norm encoding Q0 */ - Word16 *hq_generic_offset, /* o : Freq offset for HQ GENERIC Q0 */ - Word16 *sfmsize, /* o : Subband bandwidths Q0 */ - Word16 *sfm_start, /* o : Subband start coefficients Q0 */ - Word16 *sfm_end /* o : Subband end coefficients Q0 */ -) -{ - const Word16 *p_sfmsize; - const Word16 *p_sfm_start; - const Word16 *p_sfm_end; - Word16 i, bw_ext; - - bw_ext = 0; - move16(); - - *start_norm = 0; - move16(); - - IF( EQ_16( length, L_SPEC48k ) ) - { - IF( EQ_16( hqswb_clas, HQ_GEN_FB ) ) - { - *num_sfm = NB_SFM; - move16(); - p_sfmsize = band_len_HQ; /* Q0 */ - p_sfm_start = band_start_HQ; /* Q0 */ - p_sfm_end = band_end_HQ; /* Q0 */ - - IF( GE_32( core_brate, HQ_32k ) ) - { - *hq_generic_offset = HQ_GENERIC_FOFFSET_32K; - move16(); - *num_env_bands = SFM_N_STA_10k; - move16(); - } - ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/ - { - *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4; - *num_env_bands = SFM_N_STA_8k; - move16(); - move16(); - } - *nb_sfm = *num_sfm; - move16(); - } - ELSE - { - IF( EQ_16( hqswb_clas, HQ_HARMONIC ) ) - { - *num_sfm = SFM_N_HARM_FB; - move16(); - *nb_sfm = SFM_N_HARM_FB; - move16(); - *num_env_bands = SFM_N_HARM_FB; - move16(); - - p_sfmsize = band_len_harm; /* Q0 */ - p_sfm_start = band_start_harm; /* Q0 */ - p_sfm_end = band_end_harm; /* Q0 */ - } - ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) ) - { - IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) ) - { - *num_sfm = SFM_N_HARM_FB; - move16(); - *nb_sfm = HVQ_THRES_SFM_24k; - move16(); - *num_env_bands = sub( *num_sfm, *nb_sfm ); - move16(); - *start_norm = HVQ_THRES_SFM_24k; - move16(); - } - ELSE - { - *num_sfm = SFM_N_HARM_FB; - move16(); - *nb_sfm = HVQ_THRES_SFM_32k; - move16(); - *num_env_bands = sub( *num_sfm, *nb_sfm ); - move16(); - *start_norm = HVQ_THRES_SFM_32k; - move16(); - } - p_sfmsize = band_len_harm; /* Q0 */ - p_sfm_start = band_start_harm; /* Q0 */ - p_sfm_end = band_end_harm; /* Q0 */ - } - ELSE - { - *num_sfm = NB_SFM; - move16(); - *nb_sfm = *num_sfm; /* Q0 */ - move16(); - *num_env_bands = NB_SFM; - move16(); - - p_sfmsize = band_len_HQ; /* Q0 */ - p_sfm_start = band_start_HQ; /* Q0 */ - p_sfm_end = band_end_HQ; /* Q0 */ - } - } - } - ELSE IF( EQ_16( length, L_SPEC32k ) ) - { - IF( EQ_16( hqswb_clas, HQ_HARMONIC ) ) - { - *num_sfm = SFM_N_HARM; - move16(); - *nb_sfm = SFM_N_HARM; - move16(); - *num_env_bands = SFM_N_HARM; - move16(); - - p_sfmsize = band_len_harm; /* Q0 */ - p_sfm_start = band_start_harm; /* Q0 */ - p_sfm_end = band_end_harm; /* Q0 */ - } - ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) ) - { - IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) ) - { - *num_sfm = SFM_N_HARM; - move16(); - *nb_sfm = HVQ_THRES_SFM_24k; - move16(); - *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */ - move16(); - - *start_norm = HVQ_THRES_SFM_24k; - move16(); - } - ELSE - { - *num_sfm = SFM_N_HARM; - move16(); - *nb_sfm = HVQ_THRES_SFM_32k; - move16(); - *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */ - move16(); - - *start_norm = HVQ_THRES_SFM_32k; - move16(); - } - p_sfmsize = band_len_harm; - p_sfm_start = band_start_harm; - p_sfm_end = band_end_harm; - } - ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) ) - { - *num_sfm = SFM_N_SWB; - move16(); - p_sfmsize = band_len_HQ; /* Q0 */ - p_sfm_start = band_start_HQ; /* Q0 */ - p_sfm_end = band_end_HQ; /* Q0 */ - - IF( GE_32( core_brate, HQ_32k ) ) - { - *hq_generic_offset = HQ_GENERIC_FOFFSET_32K; - move16(); - *num_env_bands = SFM_N_STA_10k; - move16(); - } - ELSE /*if( EQ_32(core_brate, HQ_24k40))*/ - { - *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4; - move16(); - *num_env_bands = SFM_N_STA_8k; - move16(); - } - - *nb_sfm = *num_sfm; - move16(); - } - ELSE - { - /* HQ_NORMAL and HQ_TRANSIENT */ - *num_sfm = SFM_N_SWB; - move16(); - *nb_sfm = *num_sfm; - move16(); - *num_env_bands = SFM_N_SWB; - move16(); - - p_sfmsize = band_len_HQ; /* Q0 */ - p_sfm_start = band_start_HQ; /* Q0 */ - p_sfm_end = band_end_HQ; /* Q0 */ - } - } - ELSE IF( EQ_16( length, L_SPEC48k_EXT ) ) - { - bw_ext = 1; - p_sfmsize = band_len_HQ; /* Q0 */ - p_sfm_start = band_start_HQ; /* Q0 */ - p_sfm_end = band_end_HQ; /* Q0 */ - *num_sfm = NB_SFM; - } - ELSE IF( EQ_16( length, L_SPEC16k_EXT ) ) - { - bw_ext = 1; - move16(); - p_sfmsize = band_len_wb; /* Q0 */ - p_sfm_start = band_start_wb; /* Q0 */ - p_sfm_end = band_end_wb; /* Q0 */ - *num_sfm = SFM_N_WB; - move16(); - } - ELSE - { - *num_sfm = SFM_N_WB; - move16(); - *nb_sfm = *num_sfm; /* Q0 */ - move16(); - *num_env_bands = SFM_N_WB; - move16(); - - p_sfmsize = band_len_wb; /* Q0 */ - p_sfm_start = band_start_wb; /* Q0 */ - p_sfm_end = band_end_wb; /* Q0 */ - } - IF( bw_ext ) - { - FOR( i = 0; i < *num_sfm; i++ ) - { - /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/ - sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */ - move16(); - /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/ - sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */ - move16(); - /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/ - sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */ - move16(); - } - *nb_sfm = *num_sfm; /* Q0 */ - *num_env_bands = *num_sfm; /* Q0 */ - move16(); - move16(); - } - ELSE - { - Copy( p_sfmsize, sfmsize, *num_sfm ); - Copy( p_sfm_start, sfm_start, *num_sfm ); - Copy( p_sfm_end, sfm_end, *num_sfm ); - } - - *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) ); - move16(); - - return; -} diff --git a/lib_com/hq_conf_fx.c b/lib_com/hq_conf_fx.c index 503975363a6fa1a3480f1d55b15ad4d06e919962..b114745b591caa955966d47245c24eaccfac0a75 100644 --- a/lib_com/hq_conf_fx.c +++ b/lib_com/hq_conf_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -8,6 +8,7 @@ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "ivas_prot_fx.h" +#include "wmc_auto.h" /*--------------------------------------------------------------------------* * hq_configure() @@ -303,11 +304,7 @@ void hq_configure_evs_fx( *start_norm = 0; move16(); -#ifndef SOLVED_COMP_ENC_DEC IF( EQ_16( length, L_FRAME48k ) ) /*tbv SOLVED_COMP_ENC_DEC*/ -#else - IF( EQ_16( length, L_SPEC48k ) ) -#endif { IF( EQ_16( hqswb_clas, HQ_GEN_FB ) ) { @@ -542,3 +539,263 @@ void hq_configure_evs_fx( return; } + +void hq_configure_fx( + const Word16 length, /* i : Frame length Q0 */ + const Word16 hqswb_clas, /* i : HQ SWB class Q0 */ + const Word32 core_brate, /* i : Codec bitrate Q0 */ + Word16 *num_sfm, /* o : Total number of subbands Q0 */ + Word16 *nb_sfm, /* o : Total number of coded bands Q0 */ + Word16 *start_norm, /* o : First norm to be SDE encoded Q0 */ + Word16 *num_env_bands, /* o : Number coded envelope bands Q0 */ + Word16 *numnrmibits, /* o : Number of bits in fall-back norm encoding Q0 */ + Word16 *hq_generic_offset, /* o : Freq offset for HQ GENERIC Q0 */ + Word16 *sfmsize, /* o : Subband bandwidths Q0 */ + Word16 *sfm_start, /* o : Subband start coefficients Q0 */ + Word16 *sfm_end /* o : Subband end coefficients Q0 */ +) +{ + const Word16 *p_sfmsize; + const Word16 *p_sfm_start; + const Word16 *p_sfm_end; + Word16 i, bw_ext; + + bw_ext = 0; + move16(); + + *start_norm = 0; + move16(); + + IF( EQ_16( length, L_SPEC48k ) ) + { + IF( EQ_16( hqswb_clas, HQ_GEN_FB ) ) + { + *num_sfm = NB_SFM; + move16(); + p_sfmsize = band_len_HQ; /* Q0 */ + p_sfm_start = band_start_HQ; /* Q0 */ + p_sfm_end = band_end_HQ; /* Q0 */ + + IF( GE_32( core_brate, HQ_32k ) ) + { + *hq_generic_offset = HQ_GENERIC_FOFFSET_32K; + move16(); + *num_env_bands = SFM_N_STA_10k; + move16(); + } + ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/ + { + *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4; + *num_env_bands = SFM_N_STA_8k; + move16(); + move16(); + } + *nb_sfm = *num_sfm; + move16(); + } + ELSE + { + IF( EQ_16( hqswb_clas, HQ_HARMONIC ) ) + { + *num_sfm = SFM_N_HARM_FB; + move16(); + *nb_sfm = SFM_N_HARM_FB; + move16(); + *num_env_bands = SFM_N_HARM_FB; + move16(); + + p_sfmsize = band_len_harm; /* Q0 */ + p_sfm_start = band_start_harm; /* Q0 */ + p_sfm_end = band_end_harm; /* Q0 */ + } + ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) ) + { + IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) ) + { + *num_sfm = SFM_N_HARM_FB; + move16(); + *nb_sfm = HVQ_THRES_SFM_24k; + move16(); + *num_env_bands = sub( *num_sfm, *nb_sfm ); + move16(); + *start_norm = HVQ_THRES_SFM_24k; + move16(); + } + ELSE + { + *num_sfm = SFM_N_HARM_FB; + move16(); + *nb_sfm = HVQ_THRES_SFM_32k; + move16(); + *num_env_bands = sub( *num_sfm, *nb_sfm ); + move16(); + *start_norm = HVQ_THRES_SFM_32k; + move16(); + } + p_sfmsize = band_len_harm; /* Q0 */ + p_sfm_start = band_start_harm; /* Q0 */ + p_sfm_end = band_end_harm; /* Q0 */ + } + ELSE + { + *num_sfm = NB_SFM; + move16(); + *nb_sfm = *num_sfm; /* Q0 */ + move16(); + *num_env_bands = NB_SFM; + move16(); + + p_sfmsize = band_len_HQ; /* Q0 */ + p_sfm_start = band_start_HQ; /* Q0 */ + p_sfm_end = band_end_HQ; /* Q0 */ + } + } + } + ELSE IF( EQ_16( length, L_SPEC32k ) ) + { + IF( EQ_16( hqswb_clas, HQ_HARMONIC ) ) + { + *num_sfm = SFM_N_HARM; + move16(); + *nb_sfm = SFM_N_HARM; + move16(); + *num_env_bands = SFM_N_HARM; + move16(); + + p_sfmsize = band_len_harm; /* Q0 */ + p_sfm_start = band_start_harm; /* Q0 */ + p_sfm_end = band_end_harm; /* Q0 */ + } + ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) ) + { + IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) ) + { + *num_sfm = SFM_N_HARM; + move16(); + *nb_sfm = HVQ_THRES_SFM_24k; + move16(); + *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */ + move16(); + + *start_norm = HVQ_THRES_SFM_24k; + move16(); + } + ELSE + { + *num_sfm = SFM_N_HARM; + move16(); + *nb_sfm = HVQ_THRES_SFM_32k; + move16(); + *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */ + move16(); + + *start_norm = HVQ_THRES_SFM_32k; + move16(); + } + p_sfmsize = band_len_harm; + p_sfm_start = band_start_harm; + p_sfm_end = band_end_harm; + } + ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) ) + { + *num_sfm = SFM_N_SWB; + move16(); + p_sfmsize = band_len_HQ; /* Q0 */ + p_sfm_start = band_start_HQ; /* Q0 */ + p_sfm_end = band_end_HQ; /* Q0 */ + + IF( GE_32( core_brate, HQ_32k ) ) + { + *hq_generic_offset = HQ_GENERIC_FOFFSET_32K; + move16(); + *num_env_bands = SFM_N_STA_10k; + move16(); + } + ELSE /*if( EQ_32(core_brate, HQ_24k40))*/ + { + *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4; + move16(); + *num_env_bands = SFM_N_STA_8k; + move16(); + } + + *nb_sfm = *num_sfm; + move16(); + } + ELSE + { + /* HQ_NORMAL and HQ_TRANSIENT */ + *num_sfm = SFM_N_SWB; + move16(); + *nb_sfm = *num_sfm; + move16(); + *num_env_bands = SFM_N_SWB; + move16(); + + p_sfmsize = band_len_HQ; /* Q0 */ + p_sfm_start = band_start_HQ; /* Q0 */ + p_sfm_end = band_end_HQ; /* Q0 */ + } + } + ELSE IF( EQ_16( length, L_SPEC48k_EXT ) ) + { + bw_ext = 1; + p_sfmsize = band_len_HQ; /* Q0 */ + p_sfm_start = band_start_HQ; /* Q0 */ + p_sfm_end = band_end_HQ; /* Q0 */ + *num_sfm = NB_SFM; + } + ELSE IF( EQ_16( length, L_SPEC16k_EXT ) ) + { + bw_ext = 1; + move16(); + p_sfmsize = band_len_wb; /* Q0 */ + p_sfm_start = band_start_wb; /* Q0 */ + p_sfm_end = band_end_wb; /* Q0 */ + *num_sfm = SFM_N_WB; + move16(); + } + ELSE + { + *num_sfm = SFM_N_WB; + move16(); + *nb_sfm = *num_sfm; /* Q0 */ + move16(); + *num_env_bands = SFM_N_WB; + move16(); + + p_sfmsize = band_len_wb; /* Q0 */ + p_sfm_start = band_start_wb; /* Q0 */ + p_sfm_end = band_end_wb; /* Q0 */ + } + IF( bw_ext ) + { + FOR( i = 0; i < *num_sfm; i++ ) + { + /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/ + sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */ + move16(); + /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/ + sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */ + move16(); + /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/ + sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */ + move16(); + } + *nb_sfm = *num_sfm; /* Q0 */ + *num_env_bands = *num_sfm; /* Q0 */ + move16(); + move16(); + } + ELSE + { + Copy( p_sfmsize, sfmsize, *num_sfm ); + Copy( p_sfm_start, sfm_start, *num_sfm ); + Copy( p_sfm_end, sfm_end, *num_sfm ); + } + + *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) ); + move16(); + + return; +} diff --git a/lib_com/hq_tools_fx.c b/lib_com/hq_tools_fx.c index cf3ce202e0f0951c92b3610319cb5e7db95146b8..efdbea428063fe26224390f7fd1128fdd72ce812 100644 --- a/lib_com/hq_tools_fx.c +++ b/lib_com/hq_tools_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include @@ -926,12 +926,6 @@ void ivas_harm_bwe_fx( { exp1 = add( 1, exp1 ); } -#ifdef DEBUGGING - else - { - // PMT("VERIFY if this really matches IVAS float") - } -#endif tmp1 = s_max( tmp1, 16384 ); tmp1 = div_s( 16384, tmp1 ); L_tmp2 = L_deposit_h( tmp1 ); @@ -1095,12 +1089,6 @@ void harm_bwe_fx( { exp1 = add( 1, exp1 ); } -#ifdef DEBUGGING - else - { - // PMT("VERIFY if this really matches IVAS float") - } -#endif tmp1 = s_max( tmp1, 16384 ); tmp1 = div_s( 16384, tmp1 ); /*Q15*/ L_tmp2 = L_deposit_h( tmp1 ); /*Q31*/ @@ -2036,7 +2024,7 @@ Word16 calc_nor_delta_hf_fx( /* updating norm & storing delta norm */ add_bits_denv = 2; move16(); - push_indice_fx( hBstr, IND_DELTA_ENV_HQ, sub( bitsforDelta, 2 ), 2 ); + push_indice( hBstr, IND_DELTA_ENV_HQ, sub( bitsforDelta, 2 ), 2 ); FOR( i = num_env_bands; i < nb_sfm; ++i ) { IF( Rsubband[i] != 0 ) @@ -2052,7 +2040,7 @@ Word16 calc_nor_delta_hf_fx( delta = min_delta; /*Q0*/ move16(); } - push_indice_fx( hBstr, IND_DELTA_ENV_HQ, delta - min_delta, bitsforDelta ); + push_indice( hBstr, IND_DELTA_ENV_HQ, delta - min_delta, bitsforDelta ); ynrm[i] = add( ynrm[i], delta ); /*Q0*/ move16(); add_bits_denv = add( add_bits_denv, bitsforDelta ); diff --git a/lib_com/hvq_pvq_bitalloc_fx.c b/lib_com/hvq_pvq_bitalloc_fx.c index bc15fe2660fdeea5d42264efee3fcb4e5eb14c1f..ea51afe8889a7ada88e3d207702a3f4d529b9ba0 100644 --- a/lib_com/hvq_pvq_bitalloc_fx.c +++ b/lib_com/hvq_pvq_bitalloc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ diff --git a/lib_com/ifft_rel.c b/lib_com/ifft_rel_fx.c similarity index 86% rename from lib_com/ifft_rel.c rename to lib_com/ifft_rel_fx.c index 9e64a4e254f17bd36d456d3d45bf35d36612720d..450e9195ec0f2bb96c63443a1e1c61d35ef32c2e 100644 --- a/lib_com/ifft_rel.c +++ b/lib_com/ifft_rel_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -39,6 +39,7 @@ #include "prot_fx.h" #include "rom_com.h" #include "wmc_auto.h" + /*-----------------------------------------------------------------* * Local constants *-----------------------------------------------------------------*/ @@ -77,11 +78,6 @@ void ifft_rel_fx( Word16 cc1, cc3, ss1, ss3; Word16 tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif - /*-----------------------------------------------------------------* * ifft @@ -108,28 +104,28 @@ void ifft_rel_fx( FOR( i = is; i < n; i += id ) { - t1 = sub_o( *xi1, *xi3, &Overflow ); /*Qx*/ - *xi1 = add_o( *xi1, *xi3, &Overflow ); /*Qx*/ + t1 = sub_sat( *xi1, *xi3 ); /*Qx*/ + *xi1 = add_sat( *xi1, *xi3 ); /*Qx*/ move16(); - *xi2 = shl_o( *xi2, 1, &Overflow ); /*Qx*/ + *xi2 = shl_sat( *xi2, 1 ); /*Qx*/ move16(); - *xi3 = sub_o( t1, shl_o( *xi4, 1, &Overflow ), &Overflow ); /*Qx*/ + *xi3 = sub_sat( t1, shl_sat( *xi4, 1 ) ); /*Qx*/ move16(); - *xi4 = add_o( t1, shl_o( *xi4, 1, &Overflow ), &Overflow ); /*Qx*/ + *xi4 = add_sat( t1, shl_sat( *xi4, 1 ) ); /*Qx*/ move16(); IF( NE_16( n4, 1 ) ) { - t1 = mult_r( sub_o( *( xi2 + n8 ), *( xi1 + n8 ), &Overflow ), INV_SQR2_FX /*Q15*/ ); /*Qx*/ - t2 = mult_r( add_o( *( xi4 + n8 ), *( xi3 + n8 ), &Overflow ), INV_SQR2_FX /*Q15*/ ); /*Qx*/ + t1 = mult_r( sub_sat( *( xi2 + n8 ), *( xi1 + n8 ) ), INV_SQR2_FX /*Q15*/ ); /*Qx*/ + t2 = mult_r( add_sat( *( xi4 + n8 ), *( xi3 + n8 ) ), INV_SQR2_FX /*Q15*/ ); /*Qx*/ - *( xi1 + n8 ) = add_o( *( xi1 + n8 ), *( xi2 + n8 ), &Overflow ); /*Qx*/ + *( xi1 + n8 ) = add_sat( *( xi1 + n8 ), *( xi2 + n8 ) ); /*Qx*/ move16(); - *( xi2 + n8 ) = sub_o( *( xi4 + n8 ), *( xi3 + n8 ), &Overflow ); /*Qx*/ + *( xi2 + n8 ) = sub_sat( *( xi4 + n8 ), *( xi3 + n8 ) ); /*Qx*/ move16(); - *( xi3 + n8 ) = negate( shl_o( add_o( t2, t1, &Overflow ), 1, &Overflow ) ); /*Qx*/ + *( xi3 + n8 ) = negate( shl_sat( add_sat( t2, t1 ), 1 ) ); /*Qx*/ move16(); - *( xi4 + n8 ) = shl_o( sub_o( t1, t2, &Overflow ), 1, &Overflow ); /*Qx*/ + *( xi4 + n8 ) = shl_sat( sub_sat( t1, t2 ), 1 ); /*Qx*/ move16(); } xi1 += id; @@ -178,42 +174,42 @@ void ifft_rel_fx( FOR( i = is; i < n; i += id ) { - t1 = sub_o( *xup1, *xdn6, &Overflow ); /*Qx*/ - *xup1 = add_o( *xup1, *xdn6, &Overflow ); /*Qx*/ + t1 = sub_sat( *xup1, *xdn6 ); /*Qx*/ + *xup1 = add_sat( *xup1, *xdn6 ); /*Qx*/ move16(); xup1 += n4; xdn6 -= n4; - t2 = sub_o( *xdn6, *xup1, &Overflow ); /*Qx*/ - *xdn6 = add_o( *xup1, *xdn6, &Overflow ); /*Qx*/ + t2 = sub_sat( *xdn6, *xup1 ); /*Qx*/ + *xdn6 = add_sat( *xup1, *xdn6 ); /*Qx*/ move16(); xdn6 += n4; - t3 = add_o( *xdn8, *xup3, &Overflow ); /*Qx*/ - *xdn6 = sub_o( *xdn8, *xup3, &Overflow ); /*Qx*/ + t3 = add_sat( *xdn8, *xup3 ); /*Qx*/ + *xdn6 = sub_sat( *xdn8, *xup3 ); /*Qx*/ move16(); xup3 += n4; xdn8 -= n4; - t4 = add_o( *xup3, *xdn8, &Overflow ); /*Qx*/ - *xup1 = sub_o( *xup3, *xdn8, &Overflow ); /*Qx*/ + t4 = add_sat( *xup3, *xdn8 ); /*Qx*/ + *xup1 = sub_sat( *xup3, *xdn8 ); /*Qx*/ move16(); - t5 = sub_o( t1, t4, &Overflow ); /*Qx*/ - t1 = add_o( t1, t4, &Overflow ); /*Qx*/ - t4 = sub_o( t2, t3, &Overflow ); /*Qx*/ - t2 = add_o( t2, t3, &Overflow ); /*Qx*/ - *xup3 = sub_o( mult_r( t1, cc3 ), mult_r( t2, ss3 ), &Overflow ); /*Qx*/ + t5 = sub_sat( t1, t4 ); /*Qx*/ + t1 = add_sat( t1, t4 ); /*Qx*/ + t4 = sub_sat( t2, t3 ); /*Qx*/ + t2 = add_sat( t2, t3 ); /*Qx*/ + *xup3 = sub_sat( mult_r( t1, cc3 ), mult_r( t2, ss3 ) ); /*Qx*/ move16(); xup3 -= n4; - *xup3 = add_o( mult_r( t5, cc1 ), mult_r( t4, ss1 ), &Overflow ); /*Qx*/ + *xup3 = add_sat( mult_r( t5, cc1 ), mult_r( t4, ss1 ) ); /*Qx*/ move16(); - *xdn8 = sub_o( mult_r( t5, ss1 ), mult_r( t4, cc1 ), &Overflow ); /*Qx*/ + *xdn8 = sub_sat( mult_r( t5, ss1 ), mult_r( t4, cc1 ) ); /*Qx*/ move16(); xdn8 += n4; - *xdn8 = add_o( mult_r( t2, cc3 ), mult_r( t1, ss3 ), &Overflow ); /*Qx*/ + *xdn8 = add_sat( mult_r( t2, cc3 ), mult_r( t1, ss3 ) ); /*Qx*/ move16(); xup1 -= n4; @@ -245,9 +241,9 @@ void ifft_rel_fx( { r1 = *xi0; move16(); - *xi0 = add_o( r1, *xi1, &Overflow ); /*Qx*/ + *xi0 = add_sat( r1, *xi1 ); /*Qx*/ move16(); - *xi1 = sub_o( r1, *xi1, &Overflow ); /*Qx*/ + *xi1 = sub_sat( r1, *xi1 ); /*Qx*/ move16(); xi0 += id; xi1 += id; diff --git a/lib_com/igf_base_fx.c b/lib_com/igf_base_fx.c index fbccdb5191fe889c5aab51fa4dd2bc4c9a07c6ed..79e1ee704021a8bd28d57413eb0315a6d16fcde8 100644 --- a/lib_com/igf_base_fx.c +++ b/lib_com/igf_base_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -1115,41 +1115,25 @@ void IGFCommonFuncsCalcSfbEnergyPowerSpec( const Word16 startSfb, /**< in ) { Word16 /*Q0*/ sfb; - Word16 /*Q0*/ line; - Word32 L_c; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; - move16(); - move16(); -#endif - - FOR( sfb = startSfb; sfb < stopSfb; sfb++ ) - { - sfbEnergy[sfb] = L_deposit_l( 0 ); - move32(); - } IF( NULL == pPowerSpectrum ) { + FOR( sfb = startSfb; sfb < stopSfb; sfb++ ) + { + sfbEnergy[sfb] = L_deposit_l( 0 ); + move32(); + } + return; } FOR( sfb = startSfb; sfb < stopSfb; sfb++ ) { - L_c = L_deposit_l( 0 ); - FOR( line = swb_offset[sfb]; line < swb_offset[sfb + 1]; line++ ) - { - Carry = 0; - move16(); - sfbEnergy[sfb] = L_add_co( sfbEnergy[sfb], pPowerSpectrum[line], &Carry, &Overflow ); - move32(); - Overflow = 0; - move16(); - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); - } - sfbEnergy[sfb] = norm_llQ31( L_c, sfbEnergy[sfb], &( sfbEnergy_exp[sfb] ) ); + sfbEnergy[sfb] = sum_array_norm( pPowerSpectrum + swb_offset[sfb], + swb_offset[sfb + 1] - swb_offset[sfb], + &( sfbEnergy_exp[sfb] ) ); move32(); + sfbEnergy_exp[sfb] = add( sfbEnergy_exp[sfb], *pPowerSpectrum_exp ); move16(); } @@ -1230,26 +1214,6 @@ void IGFCommonFuncsMDCTSquareSpec_ivas( const Word16 sqrtBgn, /**< in } -/**********************************************************************/ /* -write bits to stream -**************************************************************************/ -void IGFCommonFuncsWriteSerialBit( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 *pBitOffset, /**< out: Q0 | bit offset */ - Word16 bit /**< in: Q0 | value of bit */ -) -{ - - IF( hBstr ) - { - push_next_indice_fx( hBstr, bit, 1 ); - } - *pBitOffset = add( *pBitOffset, 1 ); - move16(); - - return; -} - /**********************************************************************/ /* changes the IGF configuration **************************************************************************/ diff --git a/lib_com/index_pvq_opt_fx.c b/lib_com/index_pvq_opt_fx.c index e2d2690cea7f5236548ad13365125b6f6ebb7db8..e17e9c23eccb7ee8f2ff46888134c841be9f54ee 100644 --- a/lib_com/index_pvq_opt_fx.c +++ b/lib_com/index_pvq_opt_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/int_lsp.c b/lib_com/int_lsp_fx.c similarity index 97% rename from lib_com/int_lsp.c rename to lib_com/int_lsp_fx.c index 570e9ebd987527155d240e94341b7224aa876224..08ab6ba85458ce3160f9acf2d05af088bff5434e 100644 --- a/lib_com/int_lsp.c +++ b/lib_com/int_lsp_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -106,7 +106,7 @@ void int_lsp_fx( void int_lsp4_fx( const Word16 L_frame, /* i : length of the frame */ const Word16 lsp_old[], /* i : LSPs from past frame Q15*/ - const Word16 lsp_mid[], /* i : LSPs from mid-frame Q15*/ + const Word16 lsp_mid[], /* i : LSPs from mid-frame Q15*/ const Word16 lsp_new[], /* i : LSPs from present frame Q15*/ Word16 *Aq, /* o : LP coefficients in both subframes Q12*/ const Word16 m, /* i : order of LP filter */ @@ -181,7 +181,7 @@ void int_lsp4_fx( void int_lsp4_ivas_fx( const Word16 L_frame, /* i : length of the frame */ const Word16 lsp_old[], /* i : LSPs from past frame Q15*/ - const Word16 lsp_mid[], /* i : LSPs from mid-frame Q15*/ + const Word16 lsp_mid[], /* i : LSPs from mid-frame Q15*/ const Word16 lsp_new[], /* i : LSPs from present frame Q15*/ Word16 *Aq, /* o : LP coefficients in both subframes Q12*/ const Word16 m, /* i : order of LP filter */ diff --git a/lib_com/interleave_spectrum.c b/lib_com/interleave_spectrum_fx.c similarity index 97% rename from lib_com/interleave_spectrum.c rename to lib_com/interleave_spectrum_fx.c index 5c4c98e291e33db70a7fa6a8763926f963fe485c..c12623f0d09809ae6b0f70993e1f099f84bdae3a 100644 --- a/lib_com/interleave_spectrum.c +++ b/lib_com/interleave_spectrum_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -63,11 +63,7 @@ void interleave_spectrum_fx( /* Common inits */ p1 = coefs; /*Q12*/ p_out = coefs_out; -#ifdef SOLVED_COMP_ENC_DEC - IF( EQ_16( length, L_SPEC48k ) ) -#else IF( EQ_16( length, L_FRAME48k ) ) -#endif { bw = intl_bw_48; /*Q0*/ cnt = intl_cnt_48; /*Q0*/ @@ -337,20 +333,12 @@ void de_interleave_spectrum_fx( p1 = coefs_out; l_frame = length; move16(); -#ifdef SOLVED_COMP_ENC_DEC - IF( EQ_16( length, L_SPEC48k ) ) -#else IF( EQ_16( length, L_FRAME48k ) ) -#endif { bw = intl_bw_48; /*Q0*/ cnt = intl_cnt_48; /*Q0*/ grps = N_INTL_GRP_48; move16(); -#ifdef SOLVED_COMP_ENC_DEC - l_frame = L_FRAME48k; - move16(); -#endif p2 = coefs_out + sublen[2]; /* 240, length/4 */ p3 = coefs_out + sublen[4]; /* 480, 2*length/4 */ p4 = coefs_out + sublen[5]; /* 720, 3*length/4 */ diff --git a/lib_com/interpol.c b/lib_com/interpol_fx.c similarity index 93% rename from lib_com/interpol.c rename to lib_com/interpol_fx.c index a490a755269c9fa7d3f9bdeb440b60bf7f483253..5a78eb9bb15cd5a89d48836171606a702c904dd5 100644 --- a/lib_com/interpol.c +++ b/lib_com/interpol_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -41,7 +41,6 @@ #include "rom_com.h" #include "prot_fx_enc.h" - Word32 Interpol_lc_fx( /* o : interpolated value Q15 */ const Word16 *x, /* i : input vector Q0 */ const Word16 *win, /* i : interpolation window Q14 */ @@ -70,9 +69,9 @@ Word32 Interpol_lc_fx( /* o : interpolated value c2 += up_samp; /* move16() not needed, since the coefficient can be rearrange in bit exact way */ c1 += up_samp; } - L_sum = W_sat_l( L_sum64 ); /*Q14*/ + L_sum = W_shl_sat_l( L_sum64, 1 ); /*Q15*/ } - L_sum = L_shl_sat( L_sum, 1 ); /*Q15*/ + return L_sum; } @@ -84,9 +83,6 @@ Word16 Interpol_4( /* Qx o : interpolated value */ { Word16 i; Word32 L_sum; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif x = x - L_INTERPOL1 + 1; @@ -103,7 +99,8 @@ Word16 Interpol_4( /* Qx o : interpolated value */ } BASOP_SATURATE_WARNING_OFF_EVS /* Here, saturation might occur by intention */ - L_sum = L_shl_o( L_sum, 1, &Overflow ); /*Qx+14+2*/ + L_sum = L_shl_sat( L_sum, 1 ); /*Qx+14+2*/ BASOP_SATURATE_WARNING_ON_EVS - return round_fx_o( L_sum, &Overflow ); /*Qx*/ + + return round_fx_sat( L_sum ); /*Qx*/ } diff --git a/lib_com/ivas_arith_fx.c b/lib_com/ivas_arith_fx.c index 311bccff8e206cbdb862bba20cd4f6e89d62ecc2..c708976dac8552562abb21fd47637ec18a9eb61f 100644 --- a/lib_com/ivas_arith_fx.c +++ b/lib_com/ivas_arith_fx.c @@ -191,7 +191,7 @@ void ivas_ari_done_decoding_14bits_ext_1_lfe( Decoder_State *st, const Word16 extra_bits_read ) { - get_next_indice_tmp( st, negate( sub( cbitsnew - 2, extra_bits_read ) ) ); + get_next_indice_tmp_fx( st, negate( sub( cbitsnew - 2, extra_bits_read ) ) ); return; } diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 9243b3f508b02be0f20e6006f8c768413d4b37ce..b4411fe50febb1c360e569c988fc2b04e206c903 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -44,46 +44,33 @@ * mathematical constants *----------------------------------------------------------------------------------*/ -#define PI_OVER_2 ( EVS_PI / 2.0f ) -#define PI_OVER_180 ( EVS_PI / 180.0f ) #define ONE_BY_PI_OVER_180_Q25 ( 1922527360 ) // Q25 -#define PI_OVER_180_Q22 ( 73204 ) // Q22 -#define _180_OVER_PI ( 180.0f / EVS_PI ) -#define _180_OVER_PI_Q25 ( 1922527338 ) // Q25 -#define PI_OVER_180_Q25 ( 585635 ) // Q25 +#define PI_OVER_180_Q22 ( 73204 ) // ( EVS_PI / 180.0f ) in Q22 +#define _180_OVER_PI_Q25 ( 1922527338 ) // ( 180.0f / EVS_PI ) in Q25 +#define PI_OVER_180_Q25 ( 585635 ) // ( EVS_PI / 180.0f ) in Q25 #define _180_IN_Q22 ( 754974720 ) // Q22 #define _360_IN_Q22 ( 1509949440 ) // Q22 -#define _180_OVER_PI_FX ( 58670 ) // Q10 -#define PI_OVER_180_Q15 ( 572 ) // Q15 -#define _180_OVER_PI_Q9 ( 29335 ) // Q9 +#define _180_OVER_PI_FX ( 58670 ) // ( 180.0f / EVS_PI ) in Q10 +#define PI_OVER_180_Q15 ( 572 ) // ( EVS_PI / 180.0f ) in Q15 +#define _180_OVER_PI_Q9 ( 29335 ) // ( 180.0f / EVS_PI ) in Q9 #define PI_OVER_4_Q29 ( 421657440 ) // Q29 -#define _180_OVER_PI_Q9 ( 29335 ) // Q9 #define PI_OVER_Q29 ( 1686629760 ) // Q29 #define Q31_0_99 ( 2126008811 ) // Q31 #define Q31_0_01 ( 21474836 ) // Q31 #define PI_OVER_180_FX ( 37480660 ) // Q31 #define PI_OVER_4_Q29 ( 421657440 ) // Q29 -#define PI_OVER_Q29 ( 1686629760 ) // Q29 #define PI2_C_ADP_RATE_Q31 ( 449767936 ) // Q31 (2.0f * EVS_PI * pOTR->centerAdaptationRate) #define PI2_C_Q28 ( 1686629760 ) // Q28 #define OFF_C_ADP_RATE_Q31 ( 268435456 ) // Q31 #define C_ADP_RATE_Q31 ( 71582792 ) // Q31 +#define SQRT2_FX 1518500250 /* 1.414213562373095f in Q30 */ +#define SQRT2_OVER_2_FX 1518500250 /* (SQRT2 / 2.0f) in Q31 */ +#define INV_SQRT2_FX 1518500224 /* 1/sqrt(2) in Q31 */ +#define INV_SQRT2_FX_Q15 23170 /* 1/sqrt(2) Q15 */ +#define INV_SQRT3_FX 18918 /* 1/sqrt(3) Q15 */ -#define SQRT2 1.414213562373095f -#define SQRT2_FIXED 1518500250 // Q30 -#define SQRT2_OVER_2 (SQRT2 / 2.0f) -#define SQRT2_OVER_2_FIXED 1518500250 // Q31 - -#define INV_SQRT2 7.071067811865475e-1f /* 1/sqrt(2) */ -#define INV_SQRT3 0.577350269189626f /* 1/sqrt(3) */ -#define INV_SQRT2_FX ( 1518500224 ) /* 1/sqrt(2) in Q31 */ - -#define INV_SQRT2_FX_Q15 ( 23170 ) /* 1/sqrt(2) Q15 */ -#define INV_SQRT3_FX ( 18918 ) /* 1/sqrt(3) Q15 */ - -#define LOG_10 2.30258509299f - +#define INV_1000_Q31 2147484 /*1/1000 IN Q31*/ /*----------------------------------------------------------------------------------* * IVAS formats @@ -147,7 +134,10 @@ typedef enum RENDERER_NON_DIEGETIC_DOWNMIX, RENDERER_OSBA_STEREO, RENDERER_OSBA_AMBI, - RENDERER_OSBA_LS + RENDERER_OSBA_LS, + RENDERER_OMASA_OBJECT_EXT, + RENDERER_OMASA_MIX_EXT + } RENDERER_TYPE; #define MAX_FREQUENCY_BANDS 64 @@ -156,16 +146,17 @@ typedef enum * IVAS general constants *----------------------------------------------------------------------------------*/ -#define MAX_INPUT_CHANNELS 16 /* Maximum number of input channels (HOA 3rd order), == IVAS_MAX_INPUT_CHANNELS */ +#define MAX_INPUT_CHANNELS 16 /* Maximum number of input channels (HOA 3rd order or IVAS_MAX_LS_CHANNELS) without separate objects in combined formats */ #define MAX_TRANSPORT_CHANNELS 12 /* Maximum number of transport channels */ #define MAX_INTERN_CHANNELS 16 /* Maximum number of intern channels (HOA 3rd order) */ #define HEAD_ROTATION_HOA_ORDER 3 /* HOA 3rd order */ -#define MAX_CICP_CHANNELS 16 /* max channels for loudspeaker layouts (16 for custom layouts)*/ -#define MAX_OUTPUT_CHANNELS 16 /* Maximum number of output channels (HOA 3rd order), == IVAS_MAX_OUTPUT_CHANNELS */ +#define MAX_LS_CHANNELS 16 /* max channels for loudspeaker layouts (16 for custom layouts), == IVAS_MAX_LS_CHANNELS */ +#define MAX_OUTPUT_CHANNELS 16 /* Maximum number of output channels (HOA 3rd order or IVAS_MAX_LS_CHANNELS) without separate objects in combined formats */ #define MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN 2 /* Maximum number of output channels with non diegetic panning */ #define BINAURAL_CHANNELS 2 /* number of channels for binaural output configuration */ #define CPE_CHANNELS 2 /* number of CPE (stereo) channels */ +#define CPE_CHANNELS_LOG2 1 /* To be used for the shift operation instead of division */ #define FOA_CHANNELS 4 /* number of FOA channels */ #define HOA2_CHANNELS 9 #define HOA3_CHANNELS 16 @@ -198,16 +189,23 @@ typedef enum #define MAX_JBM_SUBFRAMES_5MS 8 #define DEFAULT_JBM_SUBFRAMES_5MS 4 #define JBM_CLDFB_SLOTS_IN_SUBFRAME 4 +#define JBM_CLDFB_SLOTS_IN_SUBFRAME_LOG2 2 /* To be used for shift operation instead of division */ #define MAX_JBM_CLDFB_TIMESLOTS 32 #define DEFAULT_JBM_CLDFB_TIMESLOTS 16 -#define MAX_JBM_L_FRAME48k 1920 -#define MAX_JBM_L_FRAME_NS 40000000L +#define MAX_JBM_L_FRAME48k ( IVAS_MAX_FRAME_SIZE * 2 ) /* 1920: max. time-scaled frame buffer length (per channel) in samples */ +#define MAX_JBM_L_FRAME_NS 40000000L /* 40 ms: time-scaled frame size in ns, proportional to MAX_JBM_L_FRAME48k */ #define MAX_SPAR_INTERNAL_CHANNELS IVAS_SPAR_MAX_CH -#define MAX_CLDFB_DIGEST_CHANNELS (FOA_CHANNELS + MAX_NUM_OBJECTS) +#define MAX_CLDFB_DIGEST_CHANNELS 3 /* == maximum of ParamISM TCs and ParamMC TCs */ + +#define EDIT_GAIN_MIN_Q29 33874260 /* Minimum allowed object gain edit with parametric modes in Q29: 0.0630957f, -24 dB */ +#define EDIT_GAIN_MAX_Q29 2137321728 /* Maximum allowed object gain edit in Q29: 3.9810719f, +12 dB */ +#define EDIT_GAIN_MIN_Q12 258 /* Minimum allowed object gain edit with parametric modes in Q12: 0.0630957f, -24 dB */ +#define EDIT_GAIN_MAX_Q12 16306 /* Maximum allowed object gain edit in Q12: 3.9810719f, +12 dB */ + + typedef enum { - TC_BUFFER_MODE_NONE = 0, TC_BUFFER_MODE_RENDERER, TC_BUFFER_MODE_BUFFER } TC_BUFFER_MODE; @@ -258,11 +256,12 @@ typedef enum /* format signaling in SID frames */ #define SID_FORMAT_NBITS 3 /* Bit 0 | Bit 1 | Bit 2 */ /*-------|-------|------ */ +#define SID_FORMAT_NONE (-0x1) /* n/a| n/a| n/a*/ #define SID_DFT_STEREO 0x0 /* 0| 0| 0 */ #define SID_MDCT_STEREO 0x1 /* 1| 0| 0 */ #define SID_ISM 0x2 /* 0| 1| 0 */ #define SID_MASA_1TC 0x3 /* 1| 1| 0 */ -#define SID_MULTICHANNEL 0x4 /* 0| 0| 1 */ +/*reserved*/ /*0x4*/ /* 0| 0| 1 */ #define SID_SBA_1TC 0x5 /* 1| 0| 1 */ #define SID_SBA_2TC 0x6 /* 0| 1| 1 */ #define SID_MASA_2TC 0x7 /* 1| 1| 1 */ @@ -337,34 +336,24 @@ typedef enum #define ADJUST_ISM_BRATE_POS 8000 #define ISM_AZIMUTH_NBITS 7 -#define ISM_AZIMUTH_MIN -180.0f -#define ISM_AZIMUTH_MAX 180.0f -#define ISM_AZIMUTH_MIN_FX ( -754974720 ) // Q22 -#define ISM_AZIMUTH_MAX_FX ( 754974720 ) // Q22 -#define ISM_AZIMUTH_LOW_BORDER -140.0f -#define ISM_AZIMUTH_HIGH_BORDER 135.0f -#define ISM_AZIMUTH_LOW_BORDER_FX ( -587202560 ) // Q22 -#define ISM_AZIMUTH_HIGH_BORDER_FX ( 566231040 ) // Q22 +#define ISM_AZIMUTH_MIN_FX -754974720 /* -180.0f in Q22 */ +#define ISM_AZIMUTH_MAX_FX 754974720 /* 180.0f in Q22 */ +#define ISM_AZIMUTH_LOW_BORDER_FX -587202560 /* -140.0f in Q22 */ +#define ISM_AZIMUTH_HIGH_BORDER_FX 566231040 /* 135.0f in Q22 */ #define ISM_ELEVATION_NBITS 6 -#define ISM_ELEVATION_MIN -90.0f -#define ISM_ELEVATION_MAX 90.0f -#define ISM_ELEVATION_MIN_FX ( -377487360 ) // Q22 -#define ISM_ELEVATION_MAX_FX ( 377487360 ) // Q22 -#define ISM_ELEVATION_LOW_BORDER -70.0f -#define ISM_ELEVATION_HIGH_BORDER 65.0f -#define ISM_ELEVATION_LOW_BORDER_FX ( -293601280 ) // Q22 -#define ISM_ELEVATION_HIGH_BORDER_FX ( 272629760 ) // Q22 -#define ISM_Q_STEP 2.5f -#define ISM_Q_STEP_FX ( 10485760 ) // Q22 -#define ISM_Q_STEP_BORDER 5.0f -#define ISM_Q_STEP_BORDER_FX ( 20971520 ) // Q22 +#define ISM_ELEVATION_MIN_FX -377487360 /* -90.0f in Q22 */ +#define ISM_ELEVATION_MAX_FX 377487360 /* 90.0f in Q22 */ +#define ISM_ELEVATION_LOW_BORDER_FX -293601280 /* -70.0f in Q22 */ +#define ISM_ELEVATION_HIGH_BORDER_FX 272629760 /* 65.0f in Q22 */ +#define ISM_Q_STEP_FX 10485760 /* 2.5f in Q22 */ +#define ISM_Q_STEP_BORDER_FX 20971520 /* 5.0f in Q22 */ + +#define ISM_FEC_MAX 10 #define ISM_RADIUS_NBITS 6 -#define ISM_RADIUS_MIN 0.0f -#define ISM_RADIUS_MIN_Q9 0 -#define ISM_RADIUS_DELTA 0.25f /* Max radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */ -#define ISM_RADIUS_DELTA_Q8 64 // Q8 +#define ISM_RADIUS_MIN_Q9 0 /* 0.0f in Q9 */ +#define ISM_RADIUS_DELTA_Q8 64 /* 0.25f in Q8 */ #define ISM_EXTENDED_METADATA_BRATE IVAS_64k #define ISM_METADATA_IS_NDP_BITS 1 #define ISM_EXTENDED_METADATA_BITS 1 @@ -383,24 +372,24 @@ typedef enum #define PARAM_ISM_MAX_CHAN 16 #define PARAM_ISM_HYS_BUF_SIZE 10 -#define STEP_PARAM_ISM_POW_RATIO_NBITS_Q15 (4681) /* 1.0f / (float)((1 << PARAM_ISM_POW_RATIO_NBITS) - 1) */ +#define STEP_PARAM_ISM_POW_RATIO_NBITS_Q31 306783378 /* 1.0f / (float)((1 << PARAM_ISM_POW_RATIO_NBITS) - 1) */ /* ISM DTX */ -#define ISM_Q_STEP_FX ( 10485760 ) // Q22 -#define ISM_Q_STEP_BORDER_FX ( 20971520 ) // Q22 +#define ISM_Q_STEP_FX 10485760 /* Q22 */ +#define ISM_Q_STEP_BORDER_FX 20971520 /* Q22 */ #define ISM_DTX_COH_SCA_BITS 4 #define ISM_DTX_AZI_BITS_HIGH 8 #define ISM_DTX_ELE_BITS_HIGH 7 #define ISM_Q_STEP_HIGH (ISM_Q_STEP / 2) #define ISM_Q_STEP_BORDER_HIGH (ISM_Q_STEP_BORDER / 2) -#define ISM_Q_STEP_HIGH_FX ( 5 * ( 1 << ( 22 - 2 ) ) ) // Q22 -#define ISM_Q_STEP_BORDER_HIGH_FX ( 5 * ( 1 << ( 22 - 1 ) ) ) // Q22 +#define ISM_Q_STEP_HIGH_FX ( 5 * ( 1 << ( 22 - 2 ) ) ) /* Q22 */ +#define ISM_Q_STEP_BORDER_HIGH_FX ( 5 * ( 1 << ( 22 - 1 ) ) ) /* Q22 */ #define ISM_DTX_AZI_BITS_LOW 6 #define ISM_DTX_ELE_BITS_LOW 5 #define ISM_Q_STEP_LOW (ISM_Q_STEP * 2) #define ISM_Q_STEP_BORDER_LOW (ISM_Q_STEP_BORDER * 2) -#define ISM_Q_STEP_LOW_FX ( 5 * (1 << 22) ) // Q22 -#define ISM_Q_STEP_BORDER_LOW_FX ( 10 * (1 << 22) ) // Q22 +#define ISM_Q_STEP_LOW_FX ( 5 * (1 << 22) ) /* Q22 */ +#define ISM_Q_STEP_BORDER_LOW_FX ( 10 * (1 << 22) ) /* Q22 */ /* ISM modes */ typedef enum @@ -509,8 +498,8 @@ enum #define STEREO_DFT32MS_N_NS FRAME_SIZE_NS /* 20 ms */ #define STEREO_DFT32MS_OVL_NS 3125000L /* 3.125ms - Overlap for the outer edges of windows on decoder */ #define STEREO_DFT32MS_OVL2_NS 9375000L /* 9.375ms - Overlap for the inner edges of windows on decoder */ -#define STEREO_DFT32MS_WIN_CENTER_NS ( int32_t )( ( FRAME_SIZE_NS + STEREO_DFT32MS_OVL_NS ) * 0.5f ) /* 11.5625ms - mid point of the two windows wrt the left edge of overlap */ -#define STEREO_DFT32MS_ZP_NS ( int32_t )( 0.5f * ( STEREO_DFT32MS_N_NS - STEREO_DFT32MS_WIN_CENTER_NS - ( STEREO_DFT32MS_OVL2_NS * 0.5f ) ) ) /* 2 sided zp calculated such that window size is satisfied */ +#define STEREO_DFT32MS_WIN_CENTER_NS ( Word32 )( ( FRAME_SIZE_NS + STEREO_DFT32MS_OVL_NS ) * 0.5f ) /* 11.5625ms - mid point of the two windows wrt the left edge of overlap */ +#define STEREO_DFT32MS_ZP_NS ( Word32 )( 0.5f * ( STEREO_DFT32MS_N_NS - STEREO_DFT32MS_WIN_CENTER_NS - ( STEREO_DFT32MS_OVL2_NS * 0.5f ) ) ) /* 2 sided zp calculated such that window size is satisfied */ #define STEREO_DFT32MS_OVL_MAX NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) #define STEREO_DFT32MS_OVL2_MAX NS2SA( 48000, STEREO_DFT32MS_OVL2_NS ) @@ -549,9 +538,6 @@ enum #define STEREO_DFT_ENC_DFT_NB ( STEREO_DFT_OFFSET + 1 ) /*frame + lookahead*/ #define STEREO_DFT_DEC_DFT_NB ( STEREO_DFT_NBDIV + STEREO_DFT_OFFSET ) /*frame + lookahead*/ -#define STEREO_CNA_LR_CORR_LT_FILT 0.95f /* long-term averaging factor for L/R correlation estimation */ -#define STEREO_CNA_ILD_LT_FILT 0.9f /* long-term averaging factor for ILD estimation */ - typedef enum { DFT_STEREO_DEC_ANA_NOCORE = -1, /*-1: signal read from file (DEBUG mode)*/ @@ -564,17 +550,15 @@ typedef enum } DFT_STEREO_DEC_ANA_TYPE; /*Stereo parameters*/ - #define STEREO_DFT_ERB4_BANDS 14 #define STEREO_DFT_ERB8_BANDS 8 #define STEREO_DFT_BAND_MAX ( STEREO_DFT_ERB4_BANDS - 1 ) /*Maximum number of parameter bands*/ #define STEREO_DFT_BUF_MAX STEREO_DFT32MS_N_MAX * STEREO_DFT_NBDIV - #define STEREO_DFT_NRG_PAST_LEN 3 /*ITD*/ #define STEREO_DFT_ITD_FS 32000 -#define STEREO_DFT_ITD_MAX 160 /*samples @ 32000*/ +#define STEREO_DFT_ITD_MAX 160 /*samples @ 32000*/ #define STEREO_DFT_ITD_MAX_ANA 200 #define STEREO_DFT_ITD_MIN max( STEREO_DFT_ITD_MAX - 256 + 1, 1 ) /*STEREO_DFT_ITD_MAX-pow(2,STEREO_DFT_ITD_NBITS-1)+1*/ #define STEREO_DFT_ITD_NBITS 9 /* 1 bit for sign, the rest for the absolute value*/ @@ -586,11 +570,10 @@ typedef enum #define STEREO_DFT_FLAG_BITS 1 #define STEREO_DFT_SIDEGAIN_NBITS 5 #define STEREO_DFT_FEC_THRESHOLD 10 -#define STEREO_DFT_FEC_THRESHOLD_PLUS_1_INV_Q31 ( 195225786 ) // Q31 -#define STEREO_DFT_BITDIFF_LP_FAC_Q31 ( 128849019 ) // Q31 /* Low-pass filter coefficient for filtering bit difference between absolute and differential coding */ -#define STEREO_DFT_BITDIFF_ABS_SELECT_Q31 ( 1717986918 ) // Q31 /* Constant to set tendency for selecting absolute coding mode */ -#define STEREO_DFT_BITDIFF_INIT (12.0f) /* Init value for low-pass bit difference */ -#define STEREO_DFT_BITDIFF_INIT_FX (12288) // Q10 /* Init value for low-pass bit difference in Q10*/ +#define STEREO_DFT_FEC_THRESHOLD_PLUS_1_INV_Q31 ( 195225786 ) /* Q31 */ +#define STEREO_DFT_BITDIFF_LP_FAC_Q31 ( 128849019 ) /* Low-pass filter coefficient for filtering bit difference between absolute and differential coding, Q31 */ +#define STEREO_DFT_BITDIFF_ABS_SELECT_Q31 ( 1717986918 ) /* Constant to set tendency for selecting absolute coding mode, Q31 */ +#define STEREO_DFT_BITDIFF_INIT_FX ( 12288 ) /* Init value for low-pass bit difference, 12.0f in Q10*/ #define STEREO_DFT_SIDE_GAIN_NBITS 5 #define STEREO_DFT_IPD_NBITS 3 @@ -611,9 +594,8 @@ typedef enum #define STEREO_DFT_SG_ACT_CNT_MAX 1500 #define STEREO_DFT_COH_MAXBAND 6 #define STEREO_DFT_SID_GIPD_NBITS 2 -#define STEREO_DFT_FD_FILT 0.9f -#define STEREO_DFT_FD_FILT_Q31 1932735283 // Q31 -#define STEREO_DFT_FD_FILT_COMP_Q31 214748364 // Q31 /* 1.0 - STEREO_DFT_FD_FILT */ +#define STEREO_DFT_FD_FILT_Q31 1932735283 /* 0.9f in Q31 */ +#define STEREO_DFT_FD_FILT_COMP_Q31 214748364 /* 1.0 - STEREO_DFT_FD_FILT in Q31 */ #define STEREO_DFT_CNG_ITD_CNT 8 @@ -639,17 +621,15 @@ typedef enum #define STEREO_DFT_RES_GAINS_BITS 3 #define STEREO_DFT_RES_COD_SNR_MIN 10 -#define STEREO_DFT_RES_COD_SNR_MIN_Q25 335544320 // Q25 +#define STEREO_DFT_RES_COD_SNR_MIN_Q25 335544320 /* Q25 */ #define STEREO_DFT_RES_COD_SNR_MAX 40 -#define STEREO_DFT_RES_COD_SNR_MAX_Q25 1342177280 // Q25 +#define STEREO_DFT_RES_COD_SNR_MAX_Q25 1342177280 /* Q25 */ #define STEREO_DFT_L_SUBFR_8k 32 #define STEREO_DFT_NBPSF_PIT_MAX_8k NBPSF_PIT_MAX / 2 /* Residual coding BPF */ -#define STEREO_DFT_BPF_ADAPT_ALPHA (0.61f) -#define STEREO_DFT_BPF_ADAPT_BETA (0.68f) -#define STEREO_DFT_BPF_ADAPT_ALPHA_FX (19988) /* STEREO_DFT_BPF_ADAPT_ALPHA in Q15 */ -#define STEREO_DFT_BPF_ADAPT_BETA_FX (22281) /* STEREO_DFT_BPF_ADAPT_BETA in Q15 */ +#define STEREO_DFT_BPF_ADAPT_ALPHA_FX 19988 /* 0.61f in Q15 */ +#define STEREO_DFT_BPF_ADAPT_BETA_FX 22281 /* 0.68f in Q15 */ /* Golomb-Rice encoding */ #define NO_SYMB_GR_SIDE_G 31 @@ -723,10 +703,8 @@ enum #define ECSQ_VECTOR_SIZE_MAX 256 #define ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO 127 /* indicates that all values in the vector are zero */ -#define ECLVQ_GLOBAL_GAIN_FACTOR ( 20.0f * 127.0f / 90.0f ) -#define ECLVQ_GLOBAL_GAIN_FACTOR_Q26 1893961218 // Q26 -#define ECLVQ_INV_GLOBAL_GAIN_FACTOR ( 1.0f / ( 20.0f * 127.0f / 90.0f ) ) -#define ECLVQ_INV_GLOBAL_GAIN_FACTOR_Q24 594468 // Q24 +#define ECLVQ_GLOBAL_GAIN_FACTOR_Q26 1893961218 /* ( 20.0f * 127.0f / 90.0f ) in Q26 */ +#define ECLVQ_INV_GLOBAL_GAIN_FACTOR_Q24 594468 /* ( 1.0f / ( 20.0f * 127.0f / 90.0f ) ) in Q24 */ /* the currently defined configuration indexes are: 0: un-optimized using uniform 4 bit parameters (reserved) @@ -799,7 +777,7 @@ enum fea_names #define L_DEC_MEM_LEN_ICA L_NCSHIFTMAX + ( N_MAX_SHIFT_CHANGE + 1 ) + SINC_ORDER1 / INTERP_FACTOR1 #define L_FRAME_DS NS2SA( CORR_INTER_FS, FRAME_SIZE_NS ) #define L_XCORRMEM_DS NS2SA( CORR_INTER_FS, 2 * ( ACELP_LOOK_NS ) ) -#define L_NCSHIFT_DS ( int16_t )( ( ( int32_t )(CORR_INTER_FS) *L_NCSHIFTMAX ) / 48000L ) +#define L_NCSHIFT_DS ( Word16 )( ( ( Word32 )(CORR_INTER_FS) *L_NCSHIFTMAX ) / 48000L ) #define L_SAMPLES_LA_NS 625000L #define L_MEM_RECALC_TBE_16K NS2SA( 16000, L_MEM_RECALC_TBE_NS ) @@ -819,12 +797,10 @@ enum fea_names #define STEREO_BITS_TCA_CHAN 1 /* ref/target channel index */ #define STEREO_BITS_TCA_CORRSTATS 5 /* target corrStats */ #define STEREO_BITS_TCA_GD 5 /* target gain */ -#define STEREO_TCA_GDMIN -1.0f -#define STEREO_TCA_GDMIN_FX -32768 // Q15 -#define STEREO_TCA_GDSTEP 0.05f -#define STEREO_TCA_GDSTEP_FX 819 // Q14 -#define STEREO_TCA_GDMIN_FX_Q14 (-16384) // Q14 -#define STEREO_TCA_GDSTEP_FX_Q13 (410) // Q13 +#define STEREO_TCA_GDMIN_FX -32768 /* -1.0f in Q15 */ +#define STEREO_TCA_GDSTEP_FX 819 /* 0.05f in Q14 */ +#define STEREO_TCA_GDMIN_FX_Q14 -16384 /* -1.0fin Q14 */ +#define STEREO_TCA_GDSTEP_FX_Q13 410 /* 0.05f in Q13 */ #define STEREO_BITS_TCA ( STEREO_BITS_TCA_CHAN + STEREO_BITS_TCA_CORRSTATS + STEREO_BITS_TCA_GD ) #define STEREO_ICBWE_MSFLAG_BITS 1 /* BWE Multi Source flag */ @@ -840,14 +816,14 @@ enum fea_names #define MAX_DELAYREGLEN 12 /* max regression length */ #define INV_MAX_DELAYREGLEN 0.083333333333333f /* (1/MAX_DELAYREGLEN) */ -#define INV_MAX_DELAYREGLEN_FX_Q15 2731 // Q15 /* (1/MAX_DELAYREGLEN) */ +#define INV_MAX_DELAYREGLEN_FX_Q15 2731 /* (1/MAX_DELAYREGLEN) in Q15 */ #define MAX_INTERPOLATE 11 #define ADDED_MEM_DS 40 #define STEREO_L_TCA_OVLP_NS 5000000L /* overlap length of the ICA gain scaling */ +#define STEREO_DMX_GAIN_Q13 29066 /* Q13, calculated this -->"powf( 10, ( ( 1 << STEREO_BITS_TCA_GD ) - 1 ) * STEREO_TCA_GDSTEP + STEREO_TCA_GDMIN )"*/ -#define STEREO_DMX_GAIN_Q13 29066 // Q13 /* calculated this -->"powf( 10, ( ( 1 << STEREO_BITS_TCA_GD ) - 1 ) * STEREO_TCA_GDSTEP + STEREO_TCA_GDMIN )"*/ /*----------------------------------------------------------------------------------* * TD Stereo Constants *----------------------------------------------------------------------------------*/ @@ -908,12 +884,14 @@ enum fea_names #define SNS_CDBKS_BITS_4_FRAC 12 #define SNS_MEANS_BITS_4_FRAC 14 -#define MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG 0.001f -#define MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG_Q31 2147483 // Q31 +#define MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG_Q31 2147483 /* 0.001f in Q31 */ #define MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME 2 * FRAMES_PER_SEC #define MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN 20 #define MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE 3 +#define MDCT_ST_DTX_NUM_COHERENCE_BANDS 5 +#define MDCT_ST_DTX_FIRST_BAND_OFFSET 2 + typedef enum { NOISE_GEN_MODE_UNDEF = -1, EQUAL_CORES = 0, @@ -934,12 +912,14 @@ typedef enum { #define MDFT_FB_BANDS_240 240 #define CLDFB_TO_MDFT_FAC 4 #define MDFT_NO_COL_MAX 4 +#define MDFT_NO_COL_MAX_LOG2 2 /* To be used for shift operation instead of division */ /*----------------------------------------------------------------------------------* * General Parametric Coding Constants *----------------------------------------------------------------------------------*/ #define MAX_PARAM_SPATIAL_SUBFRAMES 4 /* Maximum number of subframes for parameteric spatial coding */ +#define MAX_PARAM_SPATIAL_SUBFRAMES_LOG2 2 /* To be used for shift operation instead of division */ #define L_SPATIAL_SUBFR_48k (L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES) #define CLDFB_SLOTS_PER_SUBFRAME ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ) /* Number of CLDFB slots per subframe */ @@ -970,6 +950,7 @@ typedef enum { #define DIRAC_MAX_NBANDS 12 /* Maximum number of frequency bands for the DirAC Side Parameter decoding */ #define DIRAC_LOW_BANDRES_STEP 2 /* always combine two bands for low band resolution in the DirAC parameter coding */ #define DIRAC_NO_COL_AVG_DIFF 32 /* Number of slots for averaging intensity vector for diffuseness computation */ +#define DIRAC_NO_COL_AVG_DIFF_LOG2 5 /* To be used for shift operation instead of division */ #define DIRAC_DIFFUSE_LEVELS 8 /* Size of the diffuseness alphabet (constant value) */ #define INV_DIRAC_DIFFUSE_LEVELS_Q13 1170 /* 1/(DIRAC_DIFFUSE_LEVELS - 1) in Q13 */ #define DIRAC_DITH_SEED 29680 @@ -1004,47 +985,36 @@ typedef enum #define DIRAC_DIFF_NUM_AMBI_COMP 4 #define DIRAC_HOA_RENDERING_NUM_VIRT_DECORR_LS 8 -#define DIRAC_GAIN_LIMIT 31.622776601683793f /* 30db gain limitiation */ -#define DIRAC_GAIN_LIMIT_Q26 ( 2122168614 ) // Q26 /* 30db gain limitiation */ +#define DIRAC_GAIN_LIMIT_Q26 2122168614 /* 30db gain limitiation, 31.622776601683793f in Q26 */ #define DIRAC_MAX_NUM_DECORR_FILTERS 22 #define DIRAC_MAX_DECORR_FILTER_LEN 20 #define DIRAC_DECORR_NUM_SPLIT_BANDS 3 #define DIRAC_DECORR_FILTER_LEN_1 15 #define DIRAC_DECORR_FILTER_LEN_2 6 #define DIRAC_DECORR_FILTER_LEN_3 3 -#define DIRAC_ONSET_ALPHA 0.95f -#define DIRAC_ONSET_BETA 0.995f -#define DIRAC_ONSET_GAIN 4.0f -#define DIRAC_ONSET_ALPHA_FX 31129 // Q15 -#define DIRAC_ONSET_BETA_FX 32604 // Q15 -#define ONE_DIRAC_ONSET_BETA_FX 163 // Q15 -#define DIRAC_ONSET_GAIN_FX 16384 // Q12 +#define DIRAC_ONSET_ALPHA_FX 31129 /* 0.95f in Q15 */ +#define DIRAC_ONSET_BETA_FX 32604 /* 0.995f in Q15 */ +#define ONE_DIRAC_ONSET_BETA_FX 163 /* Q15 */ +#define DIRAC_ONSET_GAIN_FX 16384 /* 0.995f in Q12 */ #define DELAY_DIRAC_ENC_CMP_NS 9500000L /* Delay to be compensated on DirAC encoder */ -#define DELAY_DIRAC_SPAR_ENC_CMP_NS 500000L /* here we may set the 24 samples (at 48 kHz) additional delay to something else, leave as is for now*/ +#define DELAY_DIRAC_SPAR_ENC_CMP_NS 500000L /* here we may set the 24 samples (at 48 kHz) additional delay to something else, leave as is for now*/ #define DELAY_DIRAC_PARAM_DEC_SFR 2 /* Delay to be compensation for DirAC parameters in the decoder (subframes) */ #define DELAY_MASA_PARAM_DEC_SFR 2 /* Delay to be compensation for MASA parameters in the decoder (subframes) */ -#define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */ +#define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */ #define DIRAC_SLOT_NS 1250000L /* time duration of a time slot, 1.25ms (==DELAY_RENERER_NS/MAX_PARAM_SPATIAL_SUBFRAMES) */ #define DIRAC_SLOT_ENC_NS 5000000L -#define DIRAC_MONO_THRESH_SILENCE 3e4f -#define DIRAC_MONO_NORM_FACTOR 1e13f -#define DIRAC_MONO_ONE_ON_NORM_FACTOR (1.f / 1e13f) -#define DIRAC_MONO_MAX_THRESH 1e6f -#define DIRAC_MONO_MIN_THRESH 1e2f -#define DIRAC_MONO_FRAME_THRESH 15 /* 30ms */ - - -#define DIRAC_MONO_THRESH_SILENCE_FX (Word32)3e4 -#define DIRAC_MONO_NORM_FACTOR_FX (Word64)1e13 -#define DIRAC_MONO_ONE_ON_NORM_FACTOR_FX (Word64)1/1e13 -#define DIRAC_MONO_MAX_THRESH_FX (Word32)1e6 -#define DIRAC_MONO_MIN_THRESH_FX (Word32)1e2 -#define DIRAC_MONO_NORM_FACTOR_M 1220703104 -#define DIRAC_MONO_NORM_FACTOR_E 44 +#define DIRAC_MONO_FRAME_THRESH 15 /* 30ms */ +#define DIRAC_MONO_THRESH_SILENCE_FX (Word32)3e4 +#define DIRAC_MONO_NORM_FACTOR_FX (Word64)1e13 +#define DIRAC_MONO_ONE_ON_NORM_FACTOR_FX (Word64)1/1e13 +#define DIRAC_MONO_MAX_THRESH_FX (Word32)1e6 +#define DIRAC_MONO_MIN_THRESH_FX (Word32)1e2 +#define DIRAC_MONO_NORM_FACTOR_M 1220703104 +#define DIRAC_MONO_NORM_FACTOR_E 44 typedef enum { @@ -1079,18 +1049,13 @@ typedef enum #define IVAS_SPAR_ARITH_OVERSHOOT_BITS 16 /* Common SPAR metadata constants */ -#define IVAS_ACTIVEW_DM_F_SCALE 0.5f -#define IVAS_ACTIVEW_DM_F_SCALE_FX (1073741824) /* 0.5f in Q31 */ -#define IVAS_ACTIVEW_DM_F_SCALE_DTX 0.25f -#define IVAS_ACTIVEW_DM_F_SCALE_DTX_FX (536870912) /* 0.25f in Q31 */ -#define IVAS_ACTIVEW_DM_F_SCALE_VLBR 0.25f -#define IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX (536870912) /* 0.25f in Q31 */ +#define IVAS_ACTIVEW_DM_F_SCALE_FX 1073741824 /* 0.5f in Q31 */ +#define IVAS_ACTIVEW_DM_F_SCALE_DTX_FX 536870912 /* 0.25f in Q31 */ +#define IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX 536870912 /* 0.25f in Q31 */ #define IVAS_SPAR_FOA_DFLT_FREQ_PER_CHAN 24000 -#define IVAS_SPAR_DYN_ACTIVEW_THRESH (0.0039f) -#define IVAS_SPAR_DYN_ACTIVEW_THRESH_FX (8375186) /* 0.0039f in Q31 */ -#define IVAS_SPAR_SIDE_CH_DYN_ACTIVEW_THRESH (32.0f) -#define IVAS_SPAR_SIDE_CH_DYN_ACTIVEW_THRESH_Q0 (32) +#define IVAS_SPAR_DYN_ACTIVEW_THRESH_FX 8375186 /* 0.0039f in Q31 */ +#define IVAS_SPAR_SIDE_CH_DYN_ACTIVEW_THRESH_Q0 32 #define MAX_QUANT_STRATS 3 #define MAX_CODING_STRATS 3 @@ -1145,13 +1110,10 @@ enum #define IVAS_APD_8_SECT 8 #define IVAS_APD_16_SECT 16 -#define IVAS_DECORR_PARM_LOOKAHEAD_TAU 2e-3f -#define IVAS_DECORR_PARM_APD_TAU 42949673 // Q31 +#define IVAS_DECORR_PARM_APD_TAU 42949673 /* Q31 */ /* IVAS SBA PCA */ -#define IVAS_PCA_NB_SUBR 20 /* 80 -> 0.25 ms, 40 -> 0.5 ms... */ -#define IVAS_PCA_COV_THRES 3e-5f -#define IVAS_PCA_QUAT_EPS 1e-7f +#define IVAS_PCA_NB_SUBR 20 /* 80 -> 0.25 ms, 40 -> 0.5 ms... */ #define IVAS_PCA_QBITS 19 #define IVAS_PCA_N1 91 #define IVAS_PCA_N1_EQ ( (IVAS_PCA_N1-1)/2 ) @@ -1161,15 +1123,10 @@ enum #define IVAS_PCA_LEN_INTERP_Q ( IVAS_PCA_INTERP * IVAS_PCA_N_SLOTS ) #define IVAS_PCA_DELAY_CMP 24 #define IVAS_PCA_LEN_INTERP_EIG_DEC ( (IVAS_PCA_N_SLOTS+IVAS_PCA_DELAY_CMP)*16) -#define IVAS_PCA_THRES_MIN_DOT 0.8f -#define IVAS_PCA_THRES_MIN_DOT2 0.0f -#define IVAS_PCA_THRES_DIST_ALT 6.0f - -#define IVAS_PCA_QUAT_EPS_FX 215 // Q31 -#define IVAS_PCA_THRES_MIN_DOT_FX 1717986918 // 0.8 in Q31 +#define IVAS_PCA_QUAT_EPS_FX 215 /* 1e-7f in Q31 */ +#define IVAS_PCA_THRES_MIN_DOT_FX 1717986918 /* 0.8 in Q31 */ #define IVAS_PCA_THRES_MIN_DOT2_FX 0 -#define IVAS_PCA_THRES_DIST_ALT_FX 1610612736 // 6 in Q28 - +#define IVAS_PCA_THRES_DIST_ALT_FX 1610612736 /* 6 in Q28 */ typedef enum { @@ -1211,6 +1168,7 @@ enum TOTAL_DECD_QUANT_STRATS }; + /*----------------------------------------------------------------------------------* * MASA constants *----------------------------------------------------------------------------------*/ @@ -1231,13 +1189,12 @@ enum #define MASA_TRANSP_BITS 1 #define NO_BITS_MASA_ISM_NO_OBJ 2 -#define MASA2TOTAL_THR_Q30 1052266987 // 0.98f in Q30 +#define MASA2TOTAL_THR_Q30 1052266987 /* 0.98f in Q30 */ //Maximum error in float to fixed conversion : 0.005% //Assuming the accuracy of 99.995% //New value = 99.995 / 100 * 0.98 = 0.979951 #define BITS_MASA2TOTTAL_DCT0 6 -#define STEP_M2T 0.1f -#define STEP_M2T_FX 214748365 // Q31 +#define STEP_M2T_FX 214748365 /* 0.1f in Q31 */ #define MASA_HEADER_BITS 2 #define MASA_SUBFRAME_BITS 1 #define MASA_LOWBITRATE_MODE_BITS 1 @@ -1277,16 +1234,11 @@ enum #define LIMIT_ER_SIMPLE_ENC 6 #define LIMIT_USE_COMMON 3 -#define MASA_COHERENCE_TOLERANCE 0.1f -#define MASA_COHERENCE_THRESHOLD 0.1f -#define MASA_COHERENCE_TOLERANCE_FX 3277/*0.1 Q15*/ -#define MASA_COHERENCE_THRESHOLD_FX 214748365 // 0.1 in Q31 -#define MASA_RATIO_TOLERANCE 0.1f -#define MASA_RATIO_THRESHOLD 0.1f -#define MASA_ANGLE_TOLERANCE 0.5f -#define MASA_RATIO_THRESHOLD_FX 214748365 // 0.1 in Q31 -#define MASA_RATIO_TOLERANCE_FX 107374182 // 0.1 in Q30 -#define MASA_ANGLE_TOLERANCE_FX ONE_IN_Q21 // 0.5 in Q22 +#define MASA_COHERENCE_TOLERANCE_FX 3277 /* 0.1 Q15 */ +#define MASA_COHERENCE_THRESHOLD_FX 214748365 /* 0.1 in Q31 */ +#define MASA_RATIO_THRESHOLD_FX 32212255 /* 0.015 in Q31 */ +#define MASA_RATIO_TOLERANCE_FX 107374182 /* 0.1 in Q30 */ +#define MASA_ANGLE_TOLERANCE_FX ONE_IN_Q21 /* 0.5 in Q22 */ #define MASA_LIMIT_NO_BANDS_SUR_COH 8 #define MINIMUM_BIT_BUDGET_NORMAL_META 100 #define DIFF_DFRATIO_2BIT_LIMIT_IDX_HODIRAC 4 @@ -1300,29 +1252,28 @@ enum #define MASA_NO_POINTS_EQUATOR 430 #define MASA_NO_CIRCLES 121 -#define MASA_NO_CIRCLES_Q23 ( 1015021568 ) // Q23 -#define MASA_ASIN_OFFSET 0.0064471690266724975f -#define MASA_ASIN_OFFSET_Q15 ( 211 ) // Q15 -#define MASA_NTOT2_FAC 32768.00566947353f -#define MASA_NTOT2_FAC_Q15 ( 1073741952 ) // Q15 -#define MASA_ANGLE_AT_EQUATOR 0.012894427382667f -#define MASA_ANGLE_AT_EQUATOR_Q31 ( 27690572 ) // Q31 -#define MASA_ANGLE_AT_EQUATOR_DEG 0.738796268264740f -#define MASA_ANGLE_AT_EQUATOR_DEG_Q31 ( 1586552905l ) // Q31 -#define MASA_INV_ANGLE_AT_EQUATOR_DEG 1.353553128183453f +#define MASA_NO_CIRCLES_Q23 1015021568 /* Q23 */ +#define MASA_ASIN_OFFSET_Q15 211 /* 0.0064471690266724975f in Q15 */ +#define MASA_NTOT2_FAC_Q15 1073741952 /* 32768.00566947353f in Q15 */ +#define MASA_ANGLE_AT_EQUATOR_Q31 27690572 /* 0.012894427382667f in Q31 */ +#define MASA_ANGLE_AT_EQUATOR_DEG_Q31 1586552905l /* 0.738796268264740f in Q31 */ #define MASA_STEREO_MIN_BITRATE IVAS_24k4 #define MAXIMUM_OMASA_FREQ_BANDS 8 /* Corresponds to maximum number of coding bands at 32 kbps */ #define OMASA_STEREO_SW_CNT_MAX 100 #define MASA_BIT_REDUCT_PARAM 10 #define MASA_MAXIMUM_TWO_DIR_BANDS 24 #define NBITS_HR_COH 4 +#define OMASA_TDREND_MATCHING_GAIN_FX 26026 -#define MASA_INV_ANGLE_AT_EQUATOR_DEG_Q30 (1453366656l) +#define OMASA_GAIN_EDIT_THR_Q12 246 /* OMASA gain change threshold, 0.06f in Q12 */ +#define OMASA_AZI_EDIT_THR_Q22 ONE_IN_Q22 /* OMASA-DISC azimuth change threshold, 1.0f in Q22 */ +#define OMASA_ELE_EDIT_THR_Q22 ONE_IN_Q23 /* OMASA-DISC elevation change threshold, 2.0f in Q22 */ +#define MASA_INV_ANGLE_AT_EQUATOR_DEG_Q30 1453366656l /* 1.353553128183453f in Q30 */ #define MASA_JBM_RINGBUFFER_FRAMES 3 -#define TOLERANCE_360_Q22 1510033326 /* 360 in Q22 + 0.02 in Q22*/ -#define MINUS_TOLERANCE_360_Q22 -1510033326 /* - (360 in Q22 + 0.02 in Q22) */ +#define TOLERANCE_360_Q22 1510033326 /* 360 in Q22 + 0.02 in Q22*/ +#define MINUS_TOLERANCE_360_Q22 -1510033326 /* - (360 in Q22 + 0.02 in Q22) */ typedef enum { MASA_STEREO_NOT_DEFINED, @@ -1342,7 +1293,7 @@ typedef enum *----------------------------------------------------------------------------------*/ #define MC_LS_SETUP_BITS 3 /* number of bits for writing the MC LS configuration */ -#define LS_SETUP_CONVERSION_NUM_MAPPINGS 35 /* number of mappings for LS setup conversion */ +#define LS_SETUP_CONVERSION_NUM_MAPPINGS 41 /* number of mappings for LS setup conversion */ typedef enum { @@ -1371,67 +1322,51 @@ typedef enum #define MCMASA_SEPARATE_BRATE IVAS_64k /* minimum bitrate from which separated channel coding is supported */ #define MCMASA_MAX_ANA_CHANS 11 /* Maximum number of channels currently used in analysis of multichannel formats */ -#define MCMASA_MONOBITRATIO_64k_Q31 ( 536870912 ) // Q31 -#define MCMASA_MONOBITRATIO_Q31 ( 644245095 ) // Q31 +#define MCMASA_MONOBITRATIO_64k_Q31 536870912 /* Q31 */ +#define MCMASA_MONOBITRATIO_Q31 644245095 /* Q31 */ #define MC_MASA_THR_ELEVATION 40 -#define MCMASA_LFE_QLOW -6.5f -#define MCMASA_LFE_DELTA 1.0f -#define MCMASA_LFE_1BIT_THRES 0.03f -#define MCMASA_LFE_ALPHA 0.67f -#define MCMASA_LFE_BETA 0.09f -#define MCMASA_LFE_1BIT_THRES_Q30 32212255 /* 0.03f in Q30 */ -#define MCMASA_LFE_ALPHA_Q30 719407022 /* 0.67f in Q30 */ -#define MCMASA_LFE_BETA_Q30 96636764 /* 0.09f in Q30 */ -#define MCMASA_LFE_THETA 1.3f -#define MCMASA_LFE_SYNTH_ALPHA 0.95f /* Smoothing coefficient for LFE synthesis */ -#define MCMASA_LFE_SYNTH_ALPHA_Q15 (31129) // Q15 -#define MCMASA_LFE_ALPHA_Q15 (21954) // Q15 -#define MCMASA_LFE_BETA_Q15 (2949) // Q15 -#define MCMASA_LFE_BETA_Q14 (1474) // Q14 -#define MCMASA_LFE_THETA_Q14 (21299) // Q14 -#define MCMASA_LFE_QLOW_Q12 (-26624) // Q12 -#define MCMASA_LFE_DELTA_Q11 (2048) // Q11 -#define MCMASA_LFE_QLOW_Q11 (-13312) // Q11 -#define MCMASA_LFE_DELTA_Q10 (1024) // Q10 +#define MCMASA_LFE_1BIT_THRES_Q30 32212255 /* 0.03f in Q30 */ +#define MCMASA_LFE_ALPHA_Q30 719407022 /* 0.67f in Q30 */ +#define MCMASA_LFE_BETA_Q30 96636764 /* 0.09f in Q30 */ +#define MCMASA_LFE_SYNTH_ALPHA_Q15 31129 /* 0.95f in Q15 */ +#define MCMASA_LFE_ALPHA_Q15 21954 /* 0.67f in Q15 */ +#define MCMASA_LFE_BETA_Q15 2949 /* 0.09f in Q15 */ +#define MCMASA_LFE_BETA_Q14 1474 /* 0.09f in Q14 */ +#define MCMASA_LFE_THETA_Q14 21299 /* 1.3f in Q14 */ +#define MCMASA_LFE_QLOW_Q12 -26624 /* -6.5f in Q12 */ +#define MCMASA_LFE_DELTA_Q11 2048 /* 1.0f in Q11 */ +#define MCMASA_LFE_QLOW_Q11 -13312 /* -6.5f in Q11 */ +#define MCMASA_LFE_DELTA_Q10 1024 /* 1.0f in Q10 */ #define NUM_ELEVATED_SPEAKERS 4 #define MCMASA_MIN_SPEAKERS_SEPARATE_CENTER 4 + /*----------------------------------------------------------------------------------* * MCT constants *----------------------------------------------------------------------------------*/ #define LFE_CHANNEL 3 -#define MIN_LFE_NRG 0.5f -#define MCT_MAX_CHANNELS MAX_TRANSPORT_CHANNELS -#define MCT_MAX_BLOCKS ( MCT_MAX_CHANNELS / CPE_CHANNELS ) /* max. number of channel pairs (MCT_MAX_CHANNELS/2) within MCT*/ - -#define MAX_NUM_DATA max( MCT_MAX_CHANNELS, 4 ) - +#define MCT_MAX_CHANNELS 11 /* == 7.1.4 LS channels without the LFE channel */ +#define MCT_MAX_BLOCKS ( ( MCT_MAX_CHANNELS + 1 ) / CPE_CHANNELS ) /* max. number of channel pairs (MCT_MAX_CHANNELS/2) within MCT*/ #define NBBITS_MCT_RATIO 4 #define BITRATE_MCT_RATIO_RANGE ( 1 << NBBITS_MCT_RATIO ) /* Range of the coded bitrate distribution ratio */ #define MCT_NUM_BLOCK_DATA_BITS 4 -/*typedef enum -{ - MCT_CHAN_MODE_REGULAR, - MCT_CHAN_MODE_IGNORE -} MCT_CHAN_MODE;*/ - /*----------------------------------------------------------------------------------* * MC Param-Upmix Mode Constants *----------------------------------------------------------------------------------*/ -#define MC_PARAMUPMIX_MAX_TRANSPORT_CHANS 8 -#define MC_PARAMUPMIX_MAX_INPUT_CHANS 12 -#define MC_PARAMUPMIX_MAX_BITS 1024 /* Maximum number of bits for the MC Param-Upmix metadata */ -#define MC_PARAMUPMIX_COMBINATIONS 4 /* number of sets of 2 channels combined */ -#define MC_PARAMUPMIX_NCH 2 /* number of channels to combine into 1 */ -#define MC_PARAMUPMIX_MIN_CLDFB 8 +#define MC_PARAMUPMIX_MAX_TRANSPORT_CHANS 8 +#define MC_PARAMUPMIX_MAX_INPUT_CHANS 12 +#define MC_PARAMUPMIX_MAX_BITS 1024 /* Maximum number of bits for the MC Param-Upmix metadata */ +#define MC_PARAMUPMIX_COMBINATIONS 4 /* number of sets of 2 channels combined */ +#define MC_PARAMUPMIX_NCH 2 /* number of channels to combine into 1 */ +#define MC_PARAMUPMIX_MIN_CLDFB 8 typedef enum _COV_SMOOTHING_TYPE { @@ -1446,7 +1381,7 @@ typedef struct { typedef struct { Word32 value[81]; - unsigned short length[81]; + UWord16 length[81]; } HUFF_ELEMENTS; typedef struct { @@ -1483,11 +1418,8 @@ typedef enum PARAM_MC_SYNTH_MONO_STEREO /* synthesis to mono or stereo */ } PARAM_MC_SYNTHESIS_CONF; -#define PARAM_MC_REG_SX_FX (429496729) // Q31 /* Regularization factor for mixing matrix calculation */ -#define PARAM_MC_REG_GHAT_FX (2147483) // Q31 /* Regularization factor for mixing matrix calculation */ - -#define PARAM_MC_REG_SX (0.2f) /* Regularization factor for mixing matrix calculation */ -#define PARAM_MC_REG_GHAT (0.001f) /* Regularization factor for mixing matrix calculation */ +#define PARAM_MC_REG_SX_FX 429496729 /* Regularization factor for mixing matrix calculation, (0.2f) in Q31 */ +#define PARAM_MC_REG_GHAT_FX 2147483 /* Regularization factor for mixing matrix calculation, (0.001f) in Q31 */ #define PARAM_MC_MAX_PARAMETER_BANDS 20 /* Maximum number of parameter bands */ #define PARAM_MC_MAX_PARAMETER_BANDS_RES 14 /* Maximum number of parameter bands with decorrelation */ #define PARAM_MC_MAX_NSLOTS MAX_JBM_CLDFB_TIMESLOTS /* Maximum number of CLDFB slots in a frame */ @@ -1495,7 +1427,6 @@ typedef enum #define PARAM_MC_NSUBFRAMES_DEC 4 /* Number of subframes for the synthesis in the decoder */ #define PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND 30 /* Maximum number of CLDFB frequency bands within a parameter band */ #define PARAM_MC_PARAMETER_FRAMES 2 /* Number of frames a parameter set for a parameter band is used*/ -#define PARAM_MC_ICC_ERROR_BIAS_FAC (1.15f) /* factor for favouring past ICC maps in the adaptive ICC map decision */ #define PARAM_MC_TRANSIENT_BAND_STEP 2 /* Number of parameter bands combined in case of a transient frame*/ #define PARAM_MC_MAX_DECORR_CLDFB_BANDS 20 /* Maximum number of CLDFB bands with decorrelation */ #define PARAM_MC_MAX_TRANSPORT_CHANS 3 /* Number of down mix channels */ @@ -1510,27 +1441,23 @@ typedef enum #define PARAM_MC_NUM_BITS_ICC_SCALAR_QUANT 3 /* Number of bits for ICC uniform coding */ #define PARAM_MC_SZ_ILD_QUANTIZER_4BITS 16 /* Length of the ILD quantizer for Parametric MC */ #define PARAM_MC_NUM_BITS_ILD_SCALAR_QUANT 4 /* Number of bits for ILD uniform coding */ -#define PARAM_MC_DEFAULT_MIN_ILD (-92.0f) /* Default relative channel level for untransmitted channel energies */ -#define PARAM_MC_DEFAULT_MIN_ILD_FX (-23552) // Q8 /* Default relative channel level for untransmitted channel energies */ +#define PARAM_MC_DEFAULT_MIN_ILD_FX (-23552) /* Default relative channel level for untransmitted channel energies, (-92.0f) in Q8 */ #define PARAM_MC_MAX_BITS 1024 /* Maximum number of bits for the Parametric MC metadata */ #define PARAM_MC_MAX_BAND_ABS_COV_ENC 10 #define PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC 10 #define PARAM_MC_MAX_BAND_ABS_COV_DEC 10 -#define PARAM_MC_ENER_LIMIT_INTRAFRAME (1.5f) -#define PARAM_MC_ENER_LIMIT_INTRAFRAME_FX_Q21 3145728 -#define PARAM_MC_ENER_LIMIT_INTERFRAME (2.0f) -#define PARAM_MC_ENER_LIMIT_INTERFRAME_FX_Q21 4194304 -#define PARAM_MC_ENER_LIMIT_MAX_DELTA_FAC (15.0f) -#define PARAM_MC_ENER_LIMIT_MAX_DELTA_FAC_FX_Q21 31457280 -#define PARAM_MC_NUM_ATTACK_ILD_THRESH (3) -#define PARAM_MC_LFE_ON_THRESH (8000.0f) -#define PARAM_MC_LFE_ON_THRESH_FX 8000 // Q0 +#define PARAM_MC_ENER_LIMIT_INTRAFRAME_FX_Q21 3145728 /* (1.5f) in Q21 */ +#define PARAM_MC_ENER_LIMIT_INTERFRAME_FX_Q21 4194304 /* (2.0f) in Q21 */ +#define PARAM_MC_ENER_LIMIT_MAX_DELTA_FAC_FX_Q21 31457280 /* (15.0f) in Q21 */ +#define PARAM_MC_NUM_ATTACK_ILD_THRESH 3 +#define PARAM_MC_LFE_ON_THRESH_FX 8000 /* Q0 */ #define PARAM_MC_BAND_TO_MDCT_BAND_RATIO 16 /* Ratio of resolution of CLDFB Bands to MDCT Bands */ #define PARAM_MC_SLOT_ENC_NS 2500000L #define PARAM_MC_MDFT_NO_SLOTS 8 -#define INV_PARAM_MC_MDFT_NO_SLOTS_FX 4096 // Q15 +#define INV_PARAM_MC_MDFT_NO_SLOTS_FX 4096 /* Q15 */ #define PARAM_MC_CLDFB_TO_MDFT_FAC 2 + /*----------------------------------------------------------------------------------* * LFE Coding Constants *----------------------------------------------------------------------------------*/ @@ -1548,7 +1475,6 @@ typedef enum typedef enum { IVAS_FILTER_ORDER_1 = 1, - IVAS_FILTER_ORDER_2 = 2, IVAS_FILTER_ORDER_4 = 4, } ivas_filter_order; @@ -1561,20 +1487,14 @@ typedef enum #define IVAS_LFE_NUM_COEFFS_IN_SUBGRP 2 #define IVAS_LFE_MAX_NUM_DCT_PASS_BINS 8 #define IVAS_LFE_MAX_NUM_DCT_COEFFS (IVAS_LFE_MAX_NUM_DCT_PASS_BINS * IVAS_LFE_NUM_COEFFS_IN_SUBGRP) -#define IVAS_LFE_FADE_NS 8000000L /* 8.0 ms */ -#define IVAS_LFE_FADE_S_Q15 263 /* 8.0 ms in Q15 */ +#define IVAS_LFE_FADE_NS 8000000L /* 8.0 ms */ +#define IVAS_LFE_FADE_S_Q15 263 /* 8.0 ms in Q15 */ #define IVAS_MAX_NUM_QUANT_STRATS 2 #define IVAS_MAX_NUM_DCT_COEF_GROUPS 4 #define IVAS_LFE_SHIFT_BITS 5 #define IVAS_LFE_BITRATE_5000 5000 -#define IVAS_LFE_ABS_SUM_FLT_THR (0.000001f) - -#define IVAS_LFE_ABS_SUM_FLT_THR_Q42 4398047 - - -#define IVAS_ZERO_PAD_LEN_MULT_FAC (0.5f) - -#define IVAS_ZERO_PAD_LEN_MULT_FAC_fx 16384 // 0.5 in Q15 +#define IVAS_LFE_ABS_SUM_FLT_THR_Q42 4398047 /* 0.000001f in Q42 */ +#define IVAS_ZERO_PAD_LEN_MULT_FAC_fx 16384 /* 0.5 in Q15 */ /* LFE PLC */ #define LFE_PLC_BUFLEN 240 @@ -1583,23 +1503,23 @@ typedef enum #define LFE_PLC_LENANA LFE_PLC_BUFLEN #define LFE_PLC_FDEL 300 + /*----------------------------------------------------------------------------------* * HO Dirac Constants *----------------------------------------------------------------------------------*/ -#define HODIRAC_BETA (214748368) /* 0.2f in Q30 */ -#define HODIRAC_FAC1 (951579008) /* 1.772454f in Q29 */ -#define HODIRAC_FAC2 (549393984) /* 1.023326f in Q29 */ -#define HODIRAC_FAC3 (317192992) /* 0.590818f in Q29 */ + +#define HODIRAC_BETA 214748368 /* 0.2f in Q30 */ +#define HODIRAC_FAC1 951579008 /* 1.772454f in Q29 */ +#define HODIRAC_FAC2 549393984 /* 1.023326f in Q29 */ +#define HODIRAC_FAC3 317192992 /* 0.590818f in Q29 */ + /*----------------------------------------------------------------------------------* * Amplitude Panning (EFAP, VBAP) constants *----------------------------------------------------------------------------------*/ -#define PANNING_AZI_RESOLUTION 2 -#define PANNING_ELE_RESOLUTION 5 - #define EFAP_MAX_CHAN_NUM 5 /* Maximum number of channels that constitute a polygon, 4 or 5 */ -#define EFAP_MAX_POLY_SET 50 /* Upper bound on number of polygons; with a Speaker setup of 16.0, we obtain 44 polygons/triangles in the matlab implementation. */ +#define EFAP_MAX_POLY_SET 54 /* Upper bound on number of polygons; found to be 54 in the worst case for a speaker setup of 16.0 */ #define EFAP_MODE_EFAP 0 /* EFAP Panning */ #define EFAP_MODE_EFIP 1 /* EFIP Panning */ @@ -1611,7 +1531,6 @@ typedef enum EFAP_DMX_INTENSITY } EFAP_VTX_DMX_TYPE; - #define VBAP_NUM_SEARCH_SECTORS 4 @@ -1623,8 +1542,8 @@ typedef enum #define BINAURAL_MAXBANDS_Q25 2013265920 /* Max number of bands in Q25 */ #define ONE_BY_48000_Q31 44740 #define BINAURAL_CONVBANDS 50 /* Bands upto which convolution is performed */ -#define BINAURAL_NTAPS 3 -#define BINAURAL_NTAPS_SBA BINAURAL_NTAPS +#define BINAURAL_NTAPS 3 +#define BINAURAL_NTAPS_SBA BINAURAL_NTAPS #define BINAURAL_NTAPS_MAX 96 @@ -1632,38 +1551,23 @@ typedef enum #define HRTF_SH_CHANNELS HOA3_CHANNELS #define HRTF_LS_CHANNELS 15 #define HRTF_NUM_BINS 60 -#define REVERB_PREDELAY_MAX 20 /* Max input delay for reverb module */ -#define GAIN_LFE 1.88364911f /* Gain applied to LFE during renderering */ -#define GAIN_LFE_WORD32 2022552831 // Q30 /* Gain applied to LFE during renderering */ -#define GAIN_LFE_FX 30862 // Q14 /* Gain applied to LFE during renderering */ +#define GAIN_LFE_WORD32 2022552831 /* Gain applied to LFE during renderering, 1.88364911f in Q30 */ +#define GAIN_LFE_FX 30862 /* Gain applied to LFE during renderering, 1.88364911f in Q14 */ #define LOW_BIT_RATE_BINAURAL_EQ_BINS 17 /* Number of bins in an EQ applied at low bit rates in binauralization */ #define LOW_BIT_RATE_BINAURAL_EQ_OFFSET 14 /* Offset of bins where the low-bit-rate EQ starts*/ #define BINAURAL_COHERENCE_DIFFERENCE_BINS 9 /* Number of bins for direction-dependent diffuse-field binaural coherence */ -typedef enum -{ - BINAURAL_INPUT_AUDIO_CONFIG_INVALID, - BINAURAL_INPUT_AUDIO_CONFIG_COMBINED, /* 5_1, 5_1_2, 5_1_4, 7_1, 7_1_4 */ - BINAURAL_INPUT_AUDIO_CONFIG_HOA3, /* HOA3 */ - BINAURAL_INPUT_AUDIO_CONFIG_HOA2, /* HOA2 */ - BINAURAL_INPUT_AUDIO_CONFIG_FOA, /* FOA */ - BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED /* Not used */ - -} BINAURAL_INPUT_AUDIO_CONFIG; - #define HEADROT_ORDER 3 #define HEADROT_SHMAT_DIM ( ( HEADROT_ORDER + 1 ) * ( HEADROT_ORDER + 1 ) ) #define HEADROT_SHMAT_DIM2 ( HEADROT_SHMAT_DIM * HEADROT_SHMAT_DIM ) - - /*----------------------------------------------------------------------------------* * TD Binaural Object renderer *----------------------------------------------------------------------------------*/ -#define MAX_NUM_TDREND_CHANNELS MAX_CICP_CHANNELS /* max. number of channels in TD renderer (objects or loudspeaker channels) */ +#define MAX_NUM_TDREND_CHANNELS MAX_LS_CHANNELS /* max. number of channels in TD renderer (objects or loudspeaker channels) */ #define SFX_SPAT_BIN_MAX_NO_OF_OUTPUT_SAMPLES 288 /* 288 = 6 msec @ 48 kHz. */ #define HRTF_MODEL_N_SECTIONS 3 /* No. sections used in approximate evaluation of model */ @@ -1677,17 +1581,18 @@ typedef enum #define SFX_SPAT_BIN_NUM_SUBSAMPLES 64 #define ITD_MEM_LEN (MAX_ITD + SFX_SPAT_BIN_SINC_M) #define L_SUBFRAME5MS_48k (L_FRAME48k/4) -#define MAX_ANGULAR_STEP (0.01f) -#define MAX_ANGULAR_STEP_INV ( 1.0f / MAX_ANGULAR_STEP ) #define MAX_INTERPOLATION_STEPS 12 -#define LR_IAC_LENGTH_NR_FC ( RV_LENGTH_NR_FC ) +#define DEG_360_IN_Q22 ( 360 << Q22 ) /* Q22 */ +#define DEG_180_IN_Q22 ( 180 << Q22 ) /* Q22 */ +#define DEG_90_IN_Q22 ( 90 << Q22 ) /* Q22 */ +#define ONE_BY_360_Q31 ( 5965232 ) /* Q31 */ +#define ONE_BY_360_Q15 ( 91 ) /* Q15 */ +#define ONE_BY_180_Q31 ( 11930465 ) /* Q31 */ + +#define RESAMPLE_FACTOR_16_48_FX ( 5461 ) // Q14 +#define RESAMPLE_FACTOR_32_48_FX ( 10922 ) // Q14 -#define DEG_360_IN_Q22 ( 360 << Q22 ) // Q22 -#define DEG_180_IN_Q22 ( 180 << Q22 ) // Q22 -#define DEG_90_IN_Q22 ( 90 << Q22 ) // Q22 -#define ONE_BY_360_Q31 ( 5965232 ) // Q31 -#define ONE_BY_180_Q31 ( 11930465 ) // Q31 /* ----- Enums - TD Renderer ----- */ @@ -1729,7 +1634,6 @@ typedef enum } SFX_OpMode_t; - /*----------------------------------------------------------------------------------* * Reverberator constants *----------------------------------------------------------------------------------*/ @@ -1741,7 +1645,21 @@ typedef enum #define RV_FILTER_MAX_HISTORY ( 512 - 160 ) /* for longest history */ #define RV_LENGTH_NR_FC ( RV_FILTER_MAX_FFT_SIZE / 2 ) + 1 -#define IVAS_REVERB_DEFAULT_N_BANDS 31 +#define RV_LENGTH_NR_FC_16KHZ ( RV_FILTER_MAX_FFT_SIZE / 4 ) + 1 +#define IVAS_REVERB_DEFAULT_L_N_BANDS 31 +#define IVAS_REVERB_DEFAULT_M_N_BANDS 31 +#define IVAS_REVERB_DEFAULT_S_N_BANDS 60 + +#define LR_IAC_LENGTH_NR_FC ( RV_LENGTH_NR_FC ) +#define LR_IAC_LENGTH_NR_FC_16KHZ ( RV_LENGTH_NR_FC_16KHZ ) + +typedef enum +{ + DEFAULT_REVERB_UNSET = -1, + DEFAULT_REVERB_SMALL, + DEFAULT_REVERB_MEDIUM, + DEFAULT_REVERB_LARGE +} IVAS_DefaultReverbSize; /*----------------------------------------------------------------------------------* @@ -1768,7 +1686,7 @@ typedef enum #define IVAS_MAX_FB_MIXER_OUT_CH IVAS_SPAR_MAX_CH #define IVAS_MAX_SPAR_FB_MIXER_IN_CH IVAS_SPAR_MAX_CH -#define IVAS_MAX_FB_MIXER_IN_CH MAX_CICP_CHANNELS +#define IVAS_MAX_FB_MIXER_IN_CH MAX_LS_CHANNELS #define MAX_NUM_BANDS_DIFF_NON48K 3 @@ -1858,8 +1776,9 @@ typedef enum #define IVAS_16K_12BANDS_ACTIVE_BANDS 10 #define SPAR_DIRAC_SPLIT_START_BAND 8 -#define DIRAC_TO_SPAR_HBR_PRED_CHS (FOA_CHANNELS - 1) +#define DIRAC_TO_SPAR_HBR_PRED_CHS (FOA_CHANNELS - 1) #define SPAR_DTX_BANDS 2 +#define SPAR_DTX_BANDS_LOG2 1 /* To be used for shift operation instead of division */ #define DIRAC_DTX_BANDS 2 #define SPAR_DIRAC_DTX_BANDS ( SPAR_DTX_BANDS + DIRAC_DTX_BANDS ) #define CLDFB_PAR_WEIGHT_START_BAND 7 @@ -1873,22 +1792,14 @@ typedef enum *----------------------------------------------------------------------------------*/ #define IVAS_LIMITER_THRESHOLD 32729 /* -0.01 dBFS */ -#define IVAS_LIMITER_ATTACK_SECONDS 0.005f /*----------------------------------------------------------------------------------* * Early Reflection constants *----------------------------------------------------------------------------------*/ -#define ER_RADIUS (1.0f) -#define ER_LIST_ORIGIN_X (0.0f) -#define ER_LIST_ORIGIN_Y (0.0f) -#define ER_LIST_HEIGHT (1.6f) -#define ER_RADIUS_FX (1* ONE_IN_Q30) //Q2.30 -#define ER_LIST_ORIGIN_X_FX (0) -#define ER_LIST_ORIGIN_Y_FX (0) -#define ER_LIST_HEIGHT_FX (6710886) /* 1.6 in Q.22 */ - +#define ER_RADIUS_FX (1* ONE_IN_Q30) /*Q2.30 */ +#define ER_LIST_HEIGHT_FX IVAS_ER_LIST_HEIGHT_FX /*----------------------------------------------------------------------------------* @@ -1905,8 +1816,8 @@ typedef enum #define STEREO_DMX_EVS_SUBBAND_SIZE 2 #define STEREO_DMX_EVS_NB_SUBBAND_MAX (L_FRAME48k / (2 * STEREO_DMX_EVS_SUBBAND_SIZE)) -#define STEREO_DMX_EVS_PHA_LEN_MAX 96 /* Max of PHA_LEN */ -#define STEREO_DMX_EVS_FAD_LEN_MAX 480 /* Max of FAD_LEN */ +#define STEREO_DMX_EVS_PHA_LEN_MAX 96 /* Max of PHA_LEN */ +#define STEREO_DMX_EVS_FAD_LEN_MAX 480 /* Max of FAD_LEN */ #define STEREO_DMX_EVS_DATA_LEN_MAX (STEREO_DMX_EVS_PHA_LEN_MAX + L_FRAME48k) diff --git a/lib_com/ivas_cov_smooth_fx.c b/lib_com/ivas_cov_smooth_fx.c index 3a93ed1f577c0a8f2536607f5d25256674bd4f5c..9a8de3c1f055c1e3a119181c3c404a3a903242a7 100644 --- a/lib_com/ivas_cov_smooth_fx.c +++ b/lib_com/ivas_cov_smooth_fx.c @@ -42,6 +42,8 @@ *-----------------------------------------------------------------------------------------*/ #define BAND_SMOOTH_REST_START_IDX ( 2 ) +#define ONEeN20_Q97 0x5E728433 // 1e-20 in Q97 1.584.563.251 + /*-----------------------------------------------------------------------------------------* * Function ivas_calculate_update_factor_fx() @@ -87,9 +89,10 @@ static void ivas_calculate_smoothning_factor_fx( move16(); tmp = BASOP_Util_Divide3232_Scale( update_factor, L_shl( L_deposit_l( min_pool_size ), Q22 ), &exp_diff ); // Q(31 - exp_diff) - *Smoothing_factor = L_shl_sat( L_deposit_l( tmp ), add( Q16, exp_diff ) ); // Q31 + *Smoothing_factor = L_shl_sat( L_deposit_h( tmp ), exp_diff ); // Q31 move32(); + IF( NE_32( smooth_mode, COV_SMOOTH_MC ) ) { IF( LT_32( ivas_total_brate, IVAS_24k4 ) ) @@ -264,19 +267,17 @@ void ivas_spar_covar_smooth_enc_close_fx( return; } - /*-----------------------------------------------------------------------------------------* * Function ivas_compute_smooth_cov_fx() * * Compute smooth covariance real/imag. *-----------------------------------------------------------------------------------------*/ - static void ivas_compute_smooth_cov_fx( ivas_cov_smooth_state_t *hCovState, ivas_filterbank_t *pFb, Word32 *pCov_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], // i/o: Q(q_cov[i][j]) Word32 *pPrior_cov_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], // i: hCovState->q_cov_real_per_band[i][j][k] - const Word32 fac, + const Word32 fac, // i: ONEeN20_Q97 (1e-20 in Q97) const Word16 start_band, const Word16 end_band, const Word16 num_ch, @@ -285,10 +286,15 @@ static void ivas_compute_smooth_cov_fx( { Word16 i, j, k; Word16 prev_idx = hCovState->prior_bank_idx; - Word32 factor = 0, L_tmp, L_tmp1; + Word32 factor = 0, L_tmp0, L_tmp1; + + const Word16 q_fac = 97; + const Word16 fac_e = sub( Q31, q_fac ); + + Word16 cov_buf_e; + Word16 sm_b; Word16 non_sm_b_idx; - Word16 q_tmp[IVAS_MAX_NUM_BANDS]; sm_b = BAND_SMOOTH_REST_START_IDX; move16(); @@ -296,7 +302,6 @@ static void ivas_compute_smooth_cov_fx( move32(); assert( end_band <= pFb->filterbank_num_bands ); - test(); IF( EQ_16( prev_idx, -1 ) || EQ_16( transient_det[1], 1 ) ) { @@ -311,9 +316,11 @@ static void ivas_compute_smooth_cov_fx( { FOR( k = start_band; k < end_band; k++ ) { - L_tmp = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], fac ); // (Q31, Q31) -> Q31 - pCov_buf[i][i][k] = L_add( pCov_buf[i][i][k], L_shl( L_tmp, sub( hCovState->q_cov_real_per_band[i][i][k], Q31 ) ) ); // hCovState->q_cov_real_per_band[i][j][k] + /* ref: pCov_buf[i][i][k] += ( hCovState->pSmoothing_factor[k] * fac ); */ + pCov_buf[i][i][k] = BASOP_Util_Add_Mant32Exp( pCov_buf[i][i][k], sub( Q31, q_cov[i][i] ), Mpy_32_32( hCovState->pSmoothing_factor_fx[k], fac ), fac_e, &cov_buf_e ); move32(); + hCovState->q_cov_real_per_band[i][i][k] = sub( Q31, cov_buf_e ); + move16(); } } } @@ -326,38 +333,45 @@ static void ivas_compute_smooth_cov_fx( { IF( EQ_16( i, j ) ) { - factor = fac; // Q31 + factor = fac; // Q97 move32(); } ELSE { - factor = 0; + factor = 0; // Q97 move32(); } - set16_fx( q_tmp, q_cov[i][j], sub( end_band, start_band ) ); FOR( k = start_band; k < non_sm_b_idx; k++ ) { - L_tmp = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], pCov_buf[i][j][k] ); // (Q31, q_cov[i][j]) -> q_cov[i][j] - L_tmp1 = Mpy_32_32( L_sub( ONE_IN_Q31, hCovState->pSmoothing_factor_fx[k] ), pPrior_cov_buf[i][j][k] ); // (Q31, hCovState->q_cov_real_per_band[i][j][k]) -> hCovState->q_cov_real_per_band[i][j][k] - pCov_buf[i][j][k] = BASOP_Util_Add_Mant32Exp( L_tmp, sub( Q31, q_cov[i][j] ), L_tmp1, sub( Q31, hCovState->q_prior_cov_real_per_band[i][j][k] ), &q_tmp[k] ); // Q(31 - q_tmp[k]) + /* ref: pCov_buf[i][j][k] = pPrior_cov_buf[i][j][k] + ( hCovState->pSmoothing_factor[k] * ( pCov_buf[i][j][k] - pPrior_cov_buf[i][j][k] + factor ) ); */ + /* mod: pCov_buf[i][j][k] = pCov_buf[i][j][k] * hCovState->pSmoothing_factor[k] + + pPrior_cov_buf[i][j][k] * (1.0 - hCovState->pSmoothing_factor[k]) + + factor * hCovState->pSmoothing_factor[k] ); */ + L_tmp0 = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], pCov_buf[i][j][k] ); // q_tmp0: q_cov[i][j] // (Q31, q_cov[i][j]) -> q_cov[i][j] + L_tmp1 = Mpy_32_32( L_sub( ONE_IN_Q31, hCovState->pSmoothing_factor_fx[k] ), pPrior_cov_buf[i][j][k] ); // q_tmp1: hCovState->q_prior_cov_real_per_band[i][j][k] + L_tmp0 = BASOP_Util_Add_Mant32Exp( L_tmp0, sub( Q31, q_cov[i][j] ), L_tmp1, sub( Q31, hCovState->q_prior_cov_real_per_band[i][j][k] ), &cov_buf_e ); + pCov_buf[i][j][k] = BASOP_Util_Add_Mant32Exp( L_tmp0, cov_buf_e, Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), fac_e, &cov_buf_e ); move32(); - q_tmp[k] = sub( Q31, q_tmp[k] ); // Q of pConv_buf[i][j][k] is now q_tmp[k] + hCovState->q_cov_real_per_band[i][j][k] = sub( Q31, cov_buf_e ); // Q of pCov_buf[i][j][k] + move16(); + } + FOR( ; k < end_band; k++ ) + { + hCovState->q_cov_real_per_band[i][j][k] = q_cov[i][j]; move16(); - L_tmp = L_shl( Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), sub( q_tmp[k], Q31 ) ); // ((Q31, Q31) -> Q31) -> q_tmp[k] - pCov_buf[i][j][k] = L_add( pCov_buf[i][j][k], L_tmp ); // q_tmp[k] - move32(); } - Copy( q_tmp, hCovState->q_cov_real_per_band[i][j], sub( end_band, start_band ) ); // Q of pCov_buf[i][j][k] is hCovState->q_cov_real_per_band[i][j][j] } } FOR( i = 0; i < num_ch; i++ ) { FOR( k = non_sm_b_idx; k < end_band; k++ ) { - L_tmp = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], fac ); // (Q31, Q31) -> Q31 - pCov_buf[i][i][k] = L_add( pCov_buf[i][i][k], L_shl( L_tmp, sub( hCovState->q_cov_real_per_band[i][i][k], Q31 ) ) ); // hCovState->q_cov_real_per_band[i][j][j] + /* ref: pCov_buf[i][i][k] += ( hCovState->pSmoothing_factor[k] * fac ); */ + pCov_buf[i][i][k] = BASOP_Util_Add_Mant32Exp( pCov_buf[i][i][k], sub( Q31, q_cov[i][i] ), Mpy_32_32( hCovState->pSmoothing_factor_fx[k], fac ), fac_e, &cov_buf_e ); move32(); + hCovState->q_cov_real_per_band[i][i][k] = sub( Q31, cov_buf_e ); // Q of pCov_buf[i][i][k] + move16(); } } } @@ -369,28 +383,29 @@ static void ivas_compute_smooth_cov_fx( { IF( EQ_16( i, j ) ) { - factor = fac; // Q31 + factor = fac; // Q97 move32(); } ELSE { - factor = 0; + factor = 0; // Q97 move32(); } FOR( k = start_band; k < end_band; k++ ) { - L_tmp = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], pCov_buf[i][j][k] ); // (Q31, q_cov[i][j]) -> q_cov[i][j] - L_tmp1 = Mpy_32_32( L_sub( ONE_IN_Q31, hCovState->pSmoothing_factor_fx[k] ), pPrior_cov_buf[i][j][k] ); // (Q31, hCovState->q_cov_real_per_band[i][j][k]) -> hCovState->q_cov_real_per_band[i][j][k] - pCov_buf[i][j][k] = BASOP_Util_Add_Mant32Exp( L_tmp, sub( Q31, q_cov[i][j] ), L_tmp1, sub( Q31, hCovState->q_prior_cov_real_per_band[i][j][k] ), &q_tmp[k] ); // Q(31 - q_tmp[k]) + /* ref: pCov_buf[i][j][k] = pPrior_cov_buf[i][j][k] + ( hCovState->pSmoothing_factor[k] * ( pCov_buf[i][j][k] - pPrior_cov_buf[i][j][k] + factor ) ); */ + /* mod: pCov_buf[i][j][k] = pCov_buf[i][j][k] * hCovState->pSmoothing_factor[k] + + pPrior_cov_buf[i][j][k] * (1.0 - hCovState->pSmoothing_factor[k]) + + factor * hCovState->pSmoothing_factor[k] ); */ + L_tmp0 = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], pCov_buf[i][j][k] ); // q_tmp0: q_cov[i][j] // (Q31, q_cov[i][j]) -> q_cov[i][j] + L_tmp1 = Mpy_32_32( L_sub( ONE_IN_Q31, hCovState->pSmoothing_factor_fx[k] ), pPrior_cov_buf[i][j][k] ); // q_tmp1: hCovState->q_prior_cov_real_per_band[i][j][k] + L_tmp0 = BASOP_Util_Add_Mant32Exp( L_tmp0, sub( Q31, q_cov[i][j] ), L_tmp1, sub( Q31, hCovState->q_prior_cov_real_per_band[i][j][k] ), &cov_buf_e ); + pCov_buf[i][j][k] = BASOP_Util_Add_Mant32Exp( L_tmp0, cov_buf_e, Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), fac_e, &cov_buf_e ); move32(); - q_tmp[k] = sub( Q31, q_tmp[k] ); // Q of pConv_buf[i][j][k] is now q_tmp[k] + hCovState->q_cov_real_per_band[i][j][k] = sub( Q31, cov_buf_e ); // Q of pCov_buf[i][j][k] move16(); - L_tmp = L_shl( Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), sub( q_tmp[k], Q31 ) ); // ((Q31, Q31) -> Q31) -> q_tmp[k] - pCov_buf[i][j][k] = L_add( pCov_buf[i][j][k], L_tmp ); // q_tmp[k] - move32(); } - Copy( q_tmp, hCovState->q_cov_real_per_band[i][j], sub( end_band, start_band ) ); // Q of pCov_buf[i][j][k] is hCovState->q_cov_real_per_band[i][j][j] } } } @@ -418,7 +433,7 @@ void ivas_cov_smooth_process_fx( Word16 i, j, k; Word16 num_bands = sub( end_band, start_band ); - ivas_compute_smooth_cov_fx( hCovState, pFb, cov_real, hCovState->pPrior_cov_real_fx, 0, start_band, end_band, num_ch, transient_det, q_cov ); + ivas_compute_smooth_cov_fx( hCovState, pFb, cov_real, hCovState->pPrior_cov_real_fx, ONEeN20_Q97, start_band, end_band, num_ch, transient_det, q_cov ); FOR( i = 0; i < num_ch; i++ ) { diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index 14658779137939c6407057e31a2236065e7a1150..cba992070911995e986aa23a6637d2802d189c5f 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -40,15 +40,15 @@ #include "cnst.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" + /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ - static UWord16 deindex_sph_idx_general_fx( const Word16 idx_sph, const Word16 no_bits, Word32 *theta_dec_fx, Word32 *phi_dec_fx, UWord16 *p_id_phi, const MC_LS_SETUP mc_format ); + /*------------------------------------------------------------------------- * ivas_get_hodirac_flag() * @@ -179,9 +179,7 @@ ivas_error ivas_dirac_config_fx( test(); IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) /* skip for MASA decoder */ { - IF( NE_32( ( error = ivas_dirac_sba_config_fx( hQMetaData, element_mode, ivas_total_brate, sba_order, sub( hConfig->nbands, spar_dirac_split_band ), - ivas_format ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_sba_config_fx( hQMetaData, element_mode, ivas_total_brate, sba_order, sub( hConfig->nbands, spar_dirac_split_band ), ivas_format ) ), IVAS_ERR_OK ) ) { return error; } @@ -223,11 +221,11 @@ ivas_error ivas_dirac_config_fx( IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { // 100861_dirac_dec - ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft, 1 ); } ELSE { - ivas_dirac_config_bands_fx( band_grouping, hConfig->nbands, (Word16) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft ); + ivas_dirac_config_bands_fx( band_grouping, hConfig->nbands, extract_l( Mpy_32_32_r( Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), NULL, 0, 0, hFbMdft, 1 ); } return error; @@ -235,19 +233,20 @@ ivas_error ivas_dirac_config_fx( /*------------------------------------------------------------------------- - * ivas_dirac_sba_config_bands() + * ivas_dirac_config_bands_fx() * * DirAC Configuration freq. band function; used also in MASA decoder *------------------------------------------------------------------------*/ void ivas_dirac_config_bands_fx( - Word16 *band_grouping, /* o : band grouping */ - const Word16 nbands, /* i : number of bands */ - const Word16 max_band, /* i : maximal band index +1 */ - Word16 *dirac_to_spar_md_bands, - const Word8 useLowerBandRes, - const Word16 enc_param_start_band, - IVAS_FB_MIXER_HANDLE hFbMdft ) + Word16 *band_grouping, /* o : band grouping */ + const Word16 nbands, /* i : number of bands */ + const Word16 max_band, /* i : maximal band index +1 */ + Word16 *dirac_to_spar_md_bands, /* o : mapping of DirAC parameter band index to SPAR FB band index */ + const Word8 useLowerBandRes, /* i : flag indicating lower band resolution for DirAC */ + const Word16 enc_param_start_band, /* i : band index of first DirAC parameter band */ + IVAS_FB_MIXER_HANDLE hFbMdft, + const Word8 BandGroupLowRes ) { Word16 i; { @@ -307,15 +306,19 @@ void ivas_dirac_config_bands_fx( Word16 step = DIRAC_LOW_BANDRES_STEP; move16(); Word16 reduced_band; - FOR( ( band = enc_param_start_band + 2, reduced_band = enc_param_start_band + 1 ); band <= DIRAC_MAX_NBANDS; ( band += step, reduced_band++ ) ) - { - band_grouping[reduced_band] = band_grouping[band]; - move16(); - } - FOR( ; reduced_band <= DIRAC_MAX_NBANDS; reduced_band++ ) + + IF( BandGroupLowRes ) { - band_grouping[reduced_band] = max_band; - move16(); + FOR( ( band = enc_param_start_band + 2, reduced_band = enc_param_start_band + 1 ); band <= DIRAC_MAX_NBANDS; ( band += step, reduced_band++ ) ) + { + band_grouping[reduced_band] = band_grouping[band]; + move16(); + } + FOR( ; reduced_band <= DIRAC_MAX_NBANDS; reduced_band++ ) + { + band_grouping[reduced_band] = max_band; + move16(); + } } FOR( ( band = enc_param_start_band + ( DIRAC_MAX_NBANDS - enc_param_start_band ) / 2 - 1, reduced_band = DIRAC_MAX_NBANDS - 1 ); band >= enc_param_start_band; ( band--, reduced_band -= step ) ) { @@ -352,6 +355,8 @@ void ivas_dirac_config_bands_fx( return; } + + /*-------------------------------------------------------------------* * ivas_get_dirac_sba_max_md_bits() * @@ -392,7 +397,7 @@ void ivas_get_dirac_sba_max_md_bits_fx( /* OSBA needs an additional 2-bits safety margin to avoid acelp crashes */ IF( EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { - ( *metadata_max_bits ) = sub( ( *metadata_max_bits ), 3 ); + ( *metadata_max_bits ) = sub( ( *metadata_max_bits ), 7 ); move16(); } } @@ -493,18 +498,19 @@ void ivas_get_dirac_sba_max_md_bits_fx( return; } + /*------------------------------------------------------------------------- * ivas_dirac_sba_config() * * DirAC Configuration function for SBA *------------------------------------------------------------------------*/ + ivas_error ivas_dirac_sba_config_fx( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ Word16 *element_mode, /* i/o: element mode of the core coder */ Word32 sba_total_brate, /* i : SBA total bitrate */ const Word16 sba_order, /* i : Ambisonic (SBA) order */ - const Word16 nbands /* i : number of frequency bands */ - , + const Word16 nbands, /* i : number of frequency bands */ IVAS_FORMAT ivas_format ) { Word16 nbands_coded; @@ -571,10 +577,7 @@ ivas_error ivas_dirac_sba_config_fx( { hQMetaData->useLowerBandRes = 0; move16(); - IF( hodirac_flag == 0 ) - { - nbands_coded = sub( nbands, 1 ); /* always combine the last two bands */ - } + nbands_coded = sub( nbands, 1 ); /* always combine the last two bands */ } { @@ -592,14 +595,19 @@ ivas_error ivas_dirac_sba_config_fx( } } - ivas_get_dirac_sba_max_md_bits_fx( sba_total_brate, &hQMetaData->bits_frame_nominal, &hQMetaData->metadata_max_bits, &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands, - ivas_format ); + ivas_get_dirac_sba_max_md_bits_fx( sba_total_brate, &hQMetaData->bits_frame_nominal, &hQMetaData->metadata_max_bits, &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands, ivas_format ); return error; } -void computeDirectionVectors_fixed( +/*------------------------------------------------------------------------- + * computeDirectionVectors() + * + * + *------------------------------------------------------------------------*/ + +void computeDirectionVectors_fx2( Word32 *intensity_real_x, /* i: exp = i_e */ Word32 *intensity_real_y, /* i: exp = i_e */ Word32 *intensity_real_z, /* i: exp = i_e */ @@ -608,12 +616,8 @@ void computeDirectionVectors_fixed( Word32 *direction_vector_x, /* o: Q30*/ Word32 *direction_vector_y, /* o: Q30*/ Word32 *direction_vector_z, /* o: Q30*/ - Word16 i_e /*Exponent of all the intensity buffers*/ -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC - , - Word16 *i_e_band -#endif -) + Word16 i_e, /*Exponent of all the intensity buffers*/ + Word16 *i_e_band ) { Word16 i; Word32 intensityNorm; @@ -623,6 +627,7 @@ void computeDirectionVectors_fixed( Word16 norm_x, norm_y, norm_z; Word32 scaled_x, scaled_y, scaled_z; Word16 e_x, e_y, e_z; + FOR( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; ++i ) { norm_x = norm_l( *intensity_real_x ); @@ -631,7 +636,6 @@ void computeDirectionVectors_fixed( scaled_x = L_shl( *intensity_real_x, norm_x ); scaled_y = L_shl( *intensity_real_y, norm_y ); scaled_z = L_shl( *intensity_real_z, norm_z ); -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC IF( i_e_band != NULL ) { e_x = sub( Q31, add( i_e_band[i - enc_param_start_band], norm_x ) ); @@ -644,12 +648,6 @@ void computeDirectionVectors_fixed( e_y = sub( i_e, norm_y ); e_z = sub( i_e, norm_z ); } -#else - - e_x = sub( i_e, norm_x ); - e_y = sub( i_e, norm_y ); - e_z = sub( i_e, norm_z ); -#endif temp1 = BASOP_Util_Add_Mant32Exp( Mult_32_32( scaled_x, scaled_x ), shl( e_x, 1 ), Mult_32_32( scaled_y, scaled_y ), shl( e_y, 1 ), &exp1 ); intensityNorm = BASOP_Util_Add_Mant32Exp( temp1, exp1, Mult_32_32( scaled_z, scaled_z ), shl( e_z, 1 ), &intensityNorm_e ); @@ -685,11 +683,7 @@ void computeDirectionVectors_fixed( return; } -/*------------------------------------------------------------------------- - * computeDirectionVectors() - * - * - *------------------------------------------------------------------------*/ + void computeDirectionVectors_fx( Word32 *intensity_real_x, // i: Q( i_q ) @@ -719,6 +713,7 @@ void computeDirectionVectors_fx( Word32 *init_x = intensity_real_x; Word32 *init_y = intensity_real_y; Word32 *init_z = intensity_real_z; + // First loop to determine the Q for the direction vector FOR( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; ++i ) { @@ -746,6 +741,7 @@ void computeDirectionVectors_fx( intensity_real_x = init_x; intensity_real_y = init_y; intensity_real_z = init_z; + // Actual processing loop for the direction vector FOR( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; ++i ) { @@ -785,120 +781,7 @@ void computeDirectionVectors_fx( } *i_q = min_factor; move16(); - return; -} - -/*------------------------------------------------------------------------- - * computeDiffuseness() - * - * - *------------------------------------------------------------------------*/ - -void computeDiffuseness_fx( - Word32 *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], // i: Q(q_factor_intensity) - const Word32 *buffer_energy, // i: Q(q_factor_energy) - const Word16 num_freq_bands, - Word32 *diffuseness, // o: exp(out_exp) - Word16 q_factor_intensity, - Word16 q_factor_energy, - Word16 *out_exp /*Ouput Q*/ -) -{ - Word32 intensity_slow[DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX]; - Word32 intensity_slow_abs[CLDFB_NO_CHANNELS_MAX]; - Word32 energy_slow[CLDFB_NO_CHANNELS_MAX]; - Word16 i, j, k; - Word32 tmp = 0, tmp_1; - move32(); - Word32 *p_tmp; - const Word32 *p_tmp_c; - /* Compute Intensity slow and energy slow */ - - set32_fx( intensity_slow, 0, DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX ); - set32_fx( intensity_slow_abs, 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( energy_slow, 0, CLDFB_NO_CHANNELS_MAX ); - - FOR( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i ) - { - /* Energy slow */ - p_tmp_c = buffer_energy + i * num_freq_bands; - FOR( k = 0; k < num_freq_bands; k++ ) - { - energy_slow[k] = L_add( *( p_tmp_c++ ), energy_slow[k] ); // Q(q_factor_energy) - move32(); - } - - /* Intensity slow */ - FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) - { - p_tmp = buffer_intensity[j][i]; - - FOR( k = 0; k < num_freq_bands; k++ ) - { - intensity_slow[j * num_freq_bands + k] = L_add( *( p_tmp++ ), intensity_slow[j * num_freq_bands + k] ); - move32(); - } - } - } - - /* intensity_slow.^2 + intensity_slow_abs*/ - FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) - { - p_tmp = intensity_slow + j * num_freq_bands; - - FOR( k = 0; k < num_freq_bands; k++ ) - { - *( p_tmp ) = Mpy_32_32( *p_tmp, *( p_tmp ) ); // Q( 2*(q_factor_intensity + scale_fact - 1) -31 ) - intensity_slow_abs[k] = L_add( *( p_tmp++ ), intensity_slow_abs[k] ); - move32(); - move32(); - } - } - Word16 init_exp = sub( 62, shl( q_factor_intensity, 1 ) ); // 31 - ( 2 * q_factor_intensity - 31 ) - Word16 exp; - - Word16 exp1 = 0, exp2; - move16(); - /* Compute Diffuseness */ - p_tmp = intensity_slow_abs; - FOR( i = 0; i < num_freq_bands; ++i ) - { - exp = init_exp; - move16(); - Word32 temp = *( p_tmp++ ); - move32(); - tmp_1 = Sqrt32( temp, &exp ); - tmp = L_deposit_h( BASOP_Util_Divide3232_Scale( tmp_1, L_add( energy_slow[i], 1 ), &exp1 ) ); - exp2 = add( sub( 31, exp1 ), sub( sub( 31, exp ), q_factor_energy ) ); - IF( GT_32( exp2, 30 ) ) - { - tmp = L_shr( tmp, sub( exp2, 30 ) ); - exp2 = sub( exp2, sub( exp2, 30 ) ); - } - tmp = L_sub( L_shl( 1, exp2 ), tmp ); - // diffuseness[i] = ( ( tmp < L_shl( 1, exp2 ) ) ? ( ( tmp < 0 ) ? 0 : tmp ) : L_shl( 1, exp2 ) ); - - IF( LT_32( tmp, L_shl( 1, exp2 ) ) ) - { - IF( tmp < 0 ) - { - diffuseness[i] = 0; - } - ELSE - { - diffuseness[i] = tmp; - } - } - ELSE - { - diffuseness[i] = L_shl( 1, exp2 ); - } - out_exp[i] = exp2; - - move32(); - move16(); - } return; } @@ -909,7 +792,7 @@ void computeDiffuseness_fx( * *------------------------------------------------------------------------*/ -void computeDiffuseness_fixed( +void computeDiffuseness_fx( Word32 *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], // i: Q(q_factor_intensity) const Word32 *buffer_energy, // i: Q(q_factor_energy) const Word16 num_freq_bands, @@ -921,6 +804,8 @@ void computeDiffuseness_fixed( { Word32 intensity_slow[DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX]; Word32 intensity_slow_abs[CLDFB_NO_CHANNELS_MAX]; + Word64 intensity_slow_abs_64[CLDFB_NO_CHANNELS_MAX]; + Word16 intensity_slow_abs_q[CLDFB_NO_CHANNELS_MAX]; Word32 energy_slow[CLDFB_NO_CHANNELS_MAX]; Word16 i, j, k; Word32 tmp = 0; @@ -928,10 +813,9 @@ void computeDiffuseness_fixed( Word32 *p_tmp; const Word32 *p_tmp_c; Word16 min_q_shift1, min_q_shift2, exp1, exp2, q_tmp; - Word16 q_ene, q_intensity, q_intensity_slow; + Word16 q_ene, q_intensity; /* Compute Intensity slow and energy slow buffer_intensity and buffer_energy */ - set_zero_fx( intensity_slow, i_mult( DIRAC_NUM_DIMS, CLDFB_NO_CHANNELS_MAX ) ); set_zero_fx( intensity_slow_abs, CLDFB_NO_CHANNELS_MAX ); set_zero_fx( energy_slow, CLDFB_NO_CHANNELS_MAX ); @@ -966,17 +850,12 @@ void computeDiffuseness_fixed( q_tmp = add( q_factor_energy[i], min_q_shift1 ); -#ifdef FIX_1072_SPEEDUP_COMPUTEDIFUSENESS Word16 shift_q = sub( q_tmp, q_ene ); Word32 shiftEquiv = L_add( 0, 0 ); Word16 shift_qtotal; if ( shift_q < 0 ) { -#ifdef FIX_USAN_ISSUES shiftEquiv = L_lshl( (Word32) 0x80000000, shift_q ); -#else - shiftEquiv = L_lshl( 0x80000000, shift_q ); -#endif } if ( shift_q >= 0 ) { @@ -990,27 +869,6 @@ void computeDiffuseness_fixed( energy_slow[k] = Madd_32_32_r( tmp, energy_slow[k], shiftEquiv ); move32(); } -#else - Word16 shift_q = sub( q_tmp, q_ene ); - IF( shift_q < 0 ) - { - FOR( k = 0; k < num_freq_bands; k++ ) - { - tmp = L_shl( p_tmp_c[k], min_q_shift1 ); - energy_slow[k] = L_add( L_shl( energy_slow[k], shift_q ), tmp ); - move32(); - } - } - ELSE - { - FOR( k = 0; k < num_freq_bands; k++ ) - { - tmp = L_shl( p_tmp_c[k], min_q_shift1 ); - energy_slow[k] = L_add( energy_slow[k], L_shr( tmp, shift_q ) ); - move32(); - } - } -#endif q_ene = s_min( q_ene, q_tmp ); @@ -1019,14 +877,9 @@ void computeDiffuseness_fixed( q_tmp = add( q_factor_intensity[i], min_q_shift2 ); shift_q = sub( q_tmp, q_intensity ); -#ifdef FIX_1072_SPEEDUP_COMPUTEDIFUSENESS if ( shift_q < 0 ) { -#ifdef FIX_USAN_ISSUES shiftEquiv = L_lshl( (Word32) 0x80000000, shift_q ); -#else - shiftEquiv = L_lshl( 0x80000000, shift_q ); -#endif } if ( shift_q >= 0 ) { @@ -1044,34 +897,6 @@ void computeDiffuseness_fixed( move32(); } } -#else - IF( shift_q > 0 ) - { - FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) - { - p_tmp = buffer_intensity[j][i]; - FOR( k = 0; k < num_freq_bands; k++ ) - { - tmp = L_shl( p_tmp[k], min_q_shift2 ); - intensity_slow[j * num_freq_bands + k] = L_add( intensity_slow[j * num_freq_bands + k], L_shr( tmp, shift_q ) ); - move32(); - } - } - } - ELSE - { - FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) - { - p_tmp = buffer_intensity[j][i]; - FOR( k = 0; k < num_freq_bands; k++ ) - { - tmp = L_shl( p_tmp[k], min_q_shift2 ); - intensity_slow[j * num_freq_bands + k] = L_add( L_shl( intensity_slow[j * num_freq_bands + k], shift_q ), tmp ); - move32(); - } - } - } -#endif q_intensity = s_min( q_intensity, q_tmp ); } @@ -1080,19 +905,29 @@ void computeDiffuseness_fixed( min_q_shift1 = sub( min_q_shift1, idiv1616( add( find_guarded_bits_fx( DIRAC_NUM_DIMS ), 1 ), 2 ) ); scale_sig32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ), min_q_shift1 ); q_intensity = add( q_intensity, min_q_shift1 ); + FOR( k = 0; k < num_freq_bands; k++ ) + { + intensity_slow_abs_64[k] = 0; + move64(); + } /* intensity_slow.^2 + intensity_slow_abs*/ FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) { p_tmp = intensity_slow + j * num_freq_bands; - FOR( k = 0; k < num_freq_bands; k++ ) { - intensity_slow_abs[k] = Madd_32_32( intensity_slow_abs[k], p_tmp[k], p_tmp[k] ); - move32(); + intensity_slow_abs_64[k] = W_add( intensity_slow_abs_64[k], W_mult_32_32( p_tmp[k], p_tmp[k] ) ); // 2*q_intensity+1 } } - q_intensity_slow = sub( add( q_intensity, q_intensity ), 31 ); + FOR( k = 0; k < num_freq_bands; k++ ) + { + Word16 shift = W_norm( intensity_slow_abs_64[k] ); + intensity_slow_abs[k] = W_extract_h( W_shl( intensity_slow_abs_64[k], shift ) ); + move32(); + intensity_slow_abs_q[k] = sub( add( add( q_intensity, q_intensity ), shift ), 31 ); + move16(); + } /* Compute Diffuseness */ p_tmp = intensity_slow_abs; @@ -1100,10 +935,10 @@ void computeDiffuseness_fixed( move16(); FOR( i = 0; i < num_freq_bands; ++i ) { - exp1 = sub( 31, q_intensity_slow ); + exp1 = sub( 31, intensity_slow_abs_q[i] ); tmp = Sqrt32( p_tmp[i], &exp1 ); - tmp = BASOP_Util_Divide3232_Scale_cadence( tmp, L_add( energy_slow[i], EPSILLON_FX ), &exp2 ); + tmp = BASOP_Util_Divide3232_Scale_newton( tmp, L_add( energy_slow[i], EPSILLON_FX ), &exp2 ); q_tmp = add( sub( 31, exp2 ), sub( sub( 31, exp1 ), q_ene ) ); IF( LT_16( q_tmp, Q30 ) ) @@ -1140,17 +975,19 @@ void computeDiffuseness_fixed( } -Word32 deindex_azimuth_fx( /* o : output Q22 */ - Word16 id_phi, /* i : index */ - const Word16 no_bits, /* i : number of bits for the spherical grid */ - const Word16 id_th, /* i : elevation index */ - const Word16 remap, /* i : remapping flag */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ +/* o : output Q22 */ +Word32 deindex_azimuth_fx( + Word16 id_phi, /* i : index */ + const Word16 no_bits, /* i : number of bits for the spherical grid */ + const Word16 id_th, /* i : elevation index */ + const Word16 remap, /* i : remapping flag */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ) { Word16 flag_delta; Word32 dd_fx, delta_phi_fx; Word32 phi_hat_fx; + test(); IF( NE_32( mc_format, MC_LS_SETUP_INVALID ) && EQ_16( no_bits, 2 ) ) { @@ -1200,6 +1037,7 @@ Word32 deindex_azimuth_fx( /* o : output Q22 } phi_hat_fx = companding_azimuth_fx( phi_hat_fx, mc_format, flag, -1 ); } + return phi_hat_fx; } @@ -1261,6 +1099,7 @@ void deindex_spherical_component_fx( return; } + /*---------------------------------------------------------------- * calculate_hodirac_sector_parameters() * @@ -1287,6 +1126,15 @@ void calculate_hodirac_sector_parameters_fx( Word16 i_sec, i_bin, i_band; Word32 p_real_fx, p_imag_fx, normI_fx, energy_fx, tmp_diff_fx; Word16 energy_exp, normI_exp, tmp_diff_exp; + Word16 tmp_exp_1 = sub( 33, shl( Qfac, 1 ) ); // 31 - (2 *Qfac - 2 ) + Word16 tmp_exp_2 = sub( 35, shl( Qfac, 1 ) ); // 31 - (2 *Qfac - 4 ) + Word32 tmp32_1, tmp32_2; + Word64 temp_x64 = 0, temp_y64 = 0, temp_z64 = 0; + Word16 tmp_scale = 0; + move64(); + move64(); + move64(); + move16(); Word32 sec_I_vec_x_fx[NUM_ANA_SECTORS]; Word32 sec_I_vec_y_fx[NUM_ANA_SECTORS]; @@ -1360,7 +1208,14 @@ void calculate_hodirac_sector_parameters_fx( move32(); energy_exp = 0; move16(); - + Word64 sec_I_vec_x_64_fx = 0; + Word64 sec_I_vec_y_64_fx = 0; + Word64 sec_I_vec_z_64_fx = 0; + Word64 energy_64_fx = 0; + move64(); + move64(); + move64(); + move64(); IF( i_sec == 0 ) { FOR( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) @@ -1369,68 +1224,79 @@ void calculate_hodirac_sector_parameters_fx( move32(); Word32 sec_w_imag_fx, sec_x_imag_fx, sec_y_imag_fx, sec_z_imag_fx; Word32 sec_w_real_fx, sec_x_real_fx, sec_y_real_fx, sec_z_real_fx; + sec_w_imag_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_0_fx ) ), HODIRAC_FAC1, *( p_ImagBuffer_1_fx ) ); // Qfac - 2 + sec_x_imag_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_3_fx++ ) ), HODIRAC_FAC2, *( p_ImagBuffer_4_fx++ ) ); // Qfac - 2 + sec_y_imag_fx = Msub_32_32( ( Msub_32_32( ( Madd_32_32( Mpy_32_32( HODIRAC_FAC3, *( p_ImagBuffer_0_fx++ ) ), HODIRAC_FAC1, *( p_ImagBuffer_1_fx++ ) ) ), HODIRAC_FAC3, *( p_ImagBuffer_6_fx++ ) ) ), HODIRAC_FAC2, *( p_ImagBuffer_8_fx++ ) ); // Qfac - 2 + sec_z_imag_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_2_fx++ ) ), HODIRAC_FAC2, *( p_ImagBuffer_5_fx++ ) ); // Qfac - 2 - sec_w_imag_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_0_fx ) ), Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_1_fx ) ) ); // Qfac - 2 - sec_x_imag_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_3_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_4_fx++ ) ) ); // Qfac - 2 - sec_y_imag_fx = L_sub( L_sub( L_add( Mpy_32_32( HODIRAC_FAC3, *( p_ImagBuffer_0_fx++ ) ), Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_1_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC3, *( p_ImagBuffer_6_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_8_fx++ ) ) ); // Qfac - 2 - sec_z_imag_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_2_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_5_fx++ ) ) ); // Qfac - 2 - - sec_w_real_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_0_fx ) ), Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_1_fx ) ) ); // Qfac - 2 - sec_x_real_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_3_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_4_fx++ ) ) ); // Qfac - 2 - sec_y_real_fx = L_sub( L_sub( L_add( Mpy_32_32( HODIRAC_FAC3, *( p_RealBuffer_0_fx++ ) ), Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_1_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC3, *( p_RealBuffer_6_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_8_fx++ ) ) ); // Qfac - 2 - sec_z_real_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_2_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_5_fx++ ) ) ); // Qfac - 2 + sec_w_real_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_0_fx ) ), HODIRAC_FAC1, *( p_RealBuffer_1_fx ) ); // Qfac - 2 + sec_x_real_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_3_fx++ ) ), HODIRAC_FAC2, *( p_RealBuffer_4_fx++ ) ); // Qfac - 2 + sec_y_real_fx = Msub_32_32( ( Msub_32_32( Madd_32_32( Mpy_32_32( HODIRAC_FAC3, *( p_RealBuffer_0_fx++ ) ), HODIRAC_FAC1, *( p_RealBuffer_1_fx++ ) ), HODIRAC_FAC3, *( p_RealBuffer_6_fx++ ) ) ), HODIRAC_FAC2, *( p_RealBuffer_8_fx++ ) ); // Qfac - 2 + sec_z_real_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_2_fx++ ) ), HODIRAC_FAC2, *( p_RealBuffer_5_fx++ ) ); // Qfac - 2 - Word16 p_q; - Word32 tmp_x, tmp_y, tmp_z; - Word16 n, n1, n2; p_real_fx = Mpy_32_32( sec_w_real_fx, w_fx ); // ( Qfac - 2 ) + 30 - 31 = Qfac - 3 p_imag_fx = Mpy_32_32( sec_w_imag_fx, w_fx ); // ( Qfac - 2 ) + 30 - 31 = Qfac - 3 - n1 = norm_l( p_real_fx ); - n2 = norm_l( p_imag_fx ); - - n = s_min( n1, n2 ); - p_real_fx = L_shl( p_real_fx, n ); - p_imag_fx = L_shl( p_imag_fx, n ); + temp_x64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_x_real_fx ), p_imag_fx, sec_x_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4 + temp_y64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_y_real_fx ), p_imag_fx, sec_y_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4 + temp_z64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_z_real_fx ), p_imag_fx, sec_z_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4 + sec_I_vec_x_64_fx = W_add( sec_I_vec_x_64_fx, temp_x64 ); + sec_I_vec_y_64_fx = W_add( sec_I_vec_y_64_fx, temp_y64 ); + sec_I_vec_z_64_fx = W_add( sec_I_vec_z_64_fx, temp_z64 ); - p_q = add( sub( Qfac, 3 ), n ); - - Word16 tmp_exp, sec_sum_exp; - tmp_exp = sub( 66, add( p_q, Qfac ) ); // 31 - ( p_q + Qfac - 35 ) + Word64 tmp1; + Word64 tmp2, tmp3, tmp4, sec_sum64; + tmp1 = W_mac_32_32( W_mult_32_32( p_real_fx, p_real_fx ), p_imag_fx, p_imag_fx ); // 2 * (Qfac - 3) + 1 + tmp1 = W_shl( tmp1, 2 ); // 2 * (Qfac - 2) + 1 + tmp2 = W_mac_32_32( W_mult_32_32( sec_x_real_fx, sec_x_real_fx ), sec_x_imag_fx, sec_x_imag_fx ); // 2 * (Qfac - 2) + 1 + tmp3 = W_mac_32_32( W_mult_32_32( sec_y_real_fx, sec_y_real_fx ), sec_y_imag_fx, sec_y_imag_fx ); // 2 * (Qfac - 2) + 1 + tmp4 = W_mac_32_32( W_mult_32_32( sec_z_real_fx, sec_z_real_fx ), sec_z_imag_fx, sec_z_imag_fx ); // 2 * (Qfac - 2) + 1 + sec_sum64 = W_add( tmp1, W_add( W_add( tmp2, tmp3 ), tmp4 ) ); // 2 * (Qfac - 2) + 1 + + // instead dividing changed Q// + energy_64_fx = W_add( energy_64_fx, sec_sum64 ); // 2 * (Qfac - 2) + 1 + 1 + } + tmp_scale = sub( W_norm( energy_64_fx ), 32 ); + energy_fx = W_shl_sat_l( energy_64_fx, tmp_scale ); + energy_exp = sub( tmp_exp_1, tmp_scale ); + if ( energy_fx == 0 ) + { + energy_exp = 0; + move16(); + } - tmp_x = L_add( L_shr( Mpy_32_32( p_real_fx, sec_x_real_fx ), 2 ), L_shr( Mpy_32_32( p_imag_fx, sec_x_imag_fx ), 2 ) ); // p_q + ( Qfac - 2 ) - 31 - 2 = p_q + Qfac - 35 - tmp_y = L_add( L_shr( Mpy_32_32( p_real_fx, sec_y_real_fx ), 2 ), L_shr( Mpy_32_32( p_imag_fx, sec_y_imag_fx ), 2 ) ); // p_q + ( Qfac - 2 ) - 31 - 2 = p_q + Qfac - 35 - tmp_z = L_add( L_shr( Mpy_32_32( p_real_fx, sec_z_real_fx ), 2 ), L_shr( Mpy_32_32( p_imag_fx, sec_z_imag_fx ), 2 ) ); // p_q + ( Qfac - 2 ) - 31 - 2 = p_q + Qfac - 35 + tmp_scale = sub( W_norm( sec_I_vec_x_64_fx ), 32 ); + *p_sec_I_vec_x_fx = W_shl_sat_l( sec_I_vec_x_64_fx, tmp_scale ); + move32(); + *p_sec_I_vec_x_exp = sub( tmp_exp_2, tmp_scale ); + move16(); + if ( *p_sec_I_vec_x_fx == 0 ) + { + *p_sec_I_vec_x_exp = 0; + move16(); + } - *p_sec_I_vec_x_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_x_fx, *p_sec_I_vec_x_exp, tmp_x, tmp_exp, p_sec_I_vec_x_exp ); - move32(); - *p_sec_I_vec_y_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_y_fx, *p_sec_I_vec_y_exp, tmp_y, tmp_exp, p_sec_I_vec_y_exp ); - move32(); - *p_sec_I_vec_z_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_z_fx, *p_sec_I_vec_z_exp, tmp_z, tmp_exp, p_sec_I_vec_z_exp ); - move32(); + tmp_scale = sub( W_norm( sec_I_vec_y_64_fx ), 32 ); + *p_sec_I_vec_y_fx = W_shl_sat_l( sec_I_vec_y_64_fx, tmp_scale ); + move32(); + *p_sec_I_vec_y_exp = sub( tmp_exp_2, tmp_scale ); + move16(); + if ( *p_sec_I_vec_y_fx == 0 ) + { + *p_sec_I_vec_y_exp = 0; + move16(); + } - Word32 tmp1; - Word64 tmp2, tmp3, tmp4, sec_sum64; - Word32 tmp5, sec_sum; - tmp_exp = sub( 62, add( p_q, p_q ) ); - - tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( p_real_fx, p_real_fx ), tmp_exp, Mpy_32_32( p_imag_fx, p_imag_fx ), tmp_exp, &tmp_exp ); - tmp2 = W_add( W_mult0_32_32( sec_x_real_fx, sec_x_real_fx ), W_mult0_32_32( sec_x_imag_fx, sec_x_imag_fx ) ); // 2 * (Qfac - 2) - tmp3 = W_add( W_mult0_32_32( sec_y_real_fx, sec_y_real_fx ), W_mult0_32_32( sec_y_imag_fx, sec_y_imag_fx ) ); // 2 * (Qfac - 2) - tmp4 = W_add( W_mult0_32_32( sec_z_real_fx, sec_z_real_fx ), W_mult0_32_32( sec_z_imag_fx, sec_z_imag_fx ) ); // 2 * (Qfac - 2) - sec_sum64 = W_add( W_add( tmp2, tmp3 ), tmp4 ); // 2 * (Qfac - 2) - n = W_norm( sec_sum64 ); - sec_sum64 = W_shl( sec_sum64, n ); // 2 * (Qfac - 2) + n - sec_sum = W_extract_h( sec_sum64 ); // 2 * (Qfac - 2) + n - 32 = 2 * Qfac + n - 36 - sec_sum_exp = sub( 67, add( shl( Qfac, 1 ), n ) ); - - // divide by 2: - tmp1 = L_shr( tmp1, 1 ); - sec_sum = L_shr( sec_sum, 1 ); - - tmp5 = BASOP_Util_Add_Mant32Exp( tmp1, tmp_exp, sec_sum, sec_sum_exp, &tmp_exp ); - energy_fx = BASOP_Util_Add_Mant32Exp( energy_fx, energy_exp, tmp5, tmp_exp, &energy_exp ); + tmp_scale = sub( W_norm( sec_I_vec_z_64_fx ), 32 ); + *p_sec_I_vec_z_fx = W_shl_sat_l( sec_I_vec_z_64_fx, tmp_scale ); + move32(); + *p_sec_I_vec_z_exp = sub( tmp_exp_2, tmp_scale ); + move16(); + if ( *p_sec_I_vec_z_fx == 0 ) + { + *p_sec_I_vec_z_exp = 0; + move16(); } } ELSE @@ -1442,68 +1308,79 @@ void calculate_hodirac_sector_parameters_fx( Word32 sec_w_imag_fx, sec_x_imag_fx, sec_y_imag_fx, sec_z_imag_fx; Word32 sec_w_real_fx, sec_x_real_fx, sec_y_real_fx, sec_z_real_fx; - sec_w_imag_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_0_fx ) ), Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_1_fx ) ) ); // Qfac - 2 - sec_x_imag_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_3_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_4_fx++ ) ) ); // Qfac - 2 - sec_y_imag_fx = L_add( L_add( L_add( Mpy_32_32( -HODIRAC_FAC3, *( p_ImagBuffer_0_fx++ ) ), Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_1_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC3, *( p_ImagBuffer_6_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_8_fx++ ) ) ); // Qfac - 2 - sec_z_imag_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_2_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_5_fx++ ) ) ); // Qfac - 2 + sec_w_imag_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_0_fx ) ), HODIRAC_FAC1, *( p_ImagBuffer_1_fx ) ); // Qfac - 2 + sec_x_imag_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_3_fx++ ) ), HODIRAC_FAC2, *( p_ImagBuffer_4_fx++ ) ); // Qfac - 2 + sec_y_imag_fx = Madd_32_32( ( Madd_32_32( ( Madd_32_32( Mpy_32_32( -HODIRAC_FAC3, *( p_ImagBuffer_0_fx++ ) ), HODIRAC_FAC1, *( p_ImagBuffer_1_fx++ ) ) ), HODIRAC_FAC3, *( p_ImagBuffer_6_fx++ ) ) ), HODIRAC_FAC2, *( p_ImagBuffer_8_fx++ ) ); // Qfac - 2 + sec_z_imag_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_2_fx++ ) ), HODIRAC_FAC2, *( p_ImagBuffer_5_fx++ ) ); // Qfac - 2 - sec_w_real_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_0_fx ) ), Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_1_fx ) ) ); // Qfac - 2 - sec_x_real_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_3_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_4_fx++ ) ) ); // Qfac - 2 - sec_y_real_fx = L_add( L_add( L_add( Mpy_32_32( -HODIRAC_FAC3, *( p_RealBuffer_0_fx++ ) ), Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_1_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC3, *( p_RealBuffer_6_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_8_fx++ ) ) ); // Qfac - 2 - sec_z_real_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_2_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_5_fx++ ) ) ); // Qfac - 2 + sec_w_real_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_0_fx ) ), HODIRAC_FAC1, *( p_RealBuffer_1_fx ) ); // Qfac - 2 + sec_x_real_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_3_fx++ ) ), HODIRAC_FAC2, *( p_RealBuffer_4_fx++ ) ); // Qfac - 2 + sec_y_real_fx = Madd_32_32( ( Madd_32_32( ( Madd_32_32( Mpy_32_32( -HODIRAC_FAC3, *( p_RealBuffer_0_fx++ ) ), HODIRAC_FAC1, *( p_RealBuffer_1_fx++ ) ) ), HODIRAC_FAC3, *( p_RealBuffer_6_fx++ ) ) ), HODIRAC_FAC2, *( p_RealBuffer_8_fx++ ) ); // Qfac - 2 + sec_z_real_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_2_fx++ ) ), HODIRAC_FAC2, *( p_RealBuffer_5_fx++ ) ); // Qfac - 2 - Word16 p_q; p_real_fx = Mpy_32_32( sec_w_real_fx, w_fx ); // ( Qfac - 2 ) + 30 - 31 = Qfac - 3 p_imag_fx = Mpy_32_32( sec_w_imag_fx, w_fx ); // ( Qfac - 2 ) + 30 - 31 = Qfac - 3 - Word32 tmp_x, tmp_y, tmp_z; - Word16 n, n1, n2; - - n1 = norm_l( p_real_fx ); - n2 = norm_l( p_imag_fx ); - - n = s_min( n1, n2 ); - - p_real_fx = L_shl( p_real_fx, n ); - p_imag_fx = L_shl( p_imag_fx, n ); + temp_x64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_x_real_fx ), p_imag_fx, sec_x_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4 + temp_y64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_y_real_fx ), p_imag_fx, sec_y_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4 + temp_z64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_z_real_fx ), p_imag_fx, sec_z_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4 + sec_I_vec_x_64_fx = W_add( sec_I_vec_x_64_fx, temp_x64 ); + sec_I_vec_y_64_fx = W_add( sec_I_vec_y_64_fx, temp_y64 ); + sec_I_vec_z_64_fx = W_add( sec_I_vec_z_64_fx, temp_z64 ); - p_q = add( sub( Qfac, 3 ), n ); + Word64 tmp1; + Word64 tmp2, tmp3, tmp4, sec_sum64; + tmp1 = W_mac_32_32( W_mult_32_32( p_real_fx, p_real_fx ), p_imag_fx, p_imag_fx ); // 2 * (Qfac - 3) + 1 + tmp1 = W_shl( tmp1, 2 ); // 2 * (Qfac - 2) + 1 + tmp2 = W_mac_32_32( W_mult_32_32( sec_x_real_fx, sec_x_real_fx ), sec_x_imag_fx, sec_x_imag_fx ); // 2 * (Qfac - 2) + 1 + tmp3 = W_mac_32_32( W_mult_32_32( sec_y_real_fx, sec_y_real_fx ), sec_y_imag_fx, sec_y_imag_fx ); // 2 * (Qfac - 2) + 1 + tmp4 = W_mac_32_32( W_mult_32_32( sec_z_real_fx, sec_z_real_fx ), sec_z_imag_fx, sec_z_imag_fx ); // 2 * (Qfac - 2) + 1 + sec_sum64 = W_add( tmp1, W_add( W_add( tmp2, tmp3 ), tmp4 ) ); // 2 * (Qfac - 2) + 1 + + // instead dividing changed Q// + energy_64_fx = W_add( energy_64_fx, sec_sum64 ); // 2 * (Qfac - 2) + 1 + 1 + } + tmp_scale = sub( W_norm( energy_64_fx ), 32 ); + energy_fx = W_shl_sat_l( energy_64_fx, tmp_scale ); + energy_exp = sub( tmp_exp_1, tmp_scale ); + if ( energy_fx == 0 ) + { + energy_exp = 0; + move16(); + } - Word16 tmp_exp, sec_sum_exp; - tmp_exp = sub( 66, add( p_q, Qfac ) ); // 31 - ( p_q + Qfac - 35 ) + tmp_scale = sub( W_norm( sec_I_vec_x_64_fx ), 32 ); + *p_sec_I_vec_x_fx = W_shl_sat_l( sec_I_vec_x_64_fx, tmp_scale ); + move32(); + *p_sec_I_vec_x_exp = sub( tmp_exp_2, tmp_scale ); + move16(); + if ( *p_sec_I_vec_x_fx == 0 ) + { + *p_sec_I_vec_x_exp = 0; + move16(); + } - tmp_x = L_add( L_shr( Mpy_32_32( p_real_fx, sec_x_real_fx ), 2 ), L_shr( Mpy_32_32( p_imag_fx, sec_x_imag_fx ), 2 ) ); // p_q + ( Qfac - 2 ) - 31 - 2 = p_q + Qfac - 35 - tmp_y = L_add( L_shr( Mpy_32_32( p_real_fx, sec_y_real_fx ), 2 ), L_shr( Mpy_32_32( p_imag_fx, sec_y_imag_fx ), 2 ) ); // p_q + ( Qfac - 2 ) - 31 - 2 = p_q + Qfac - 35 - tmp_z = L_add( L_shr( Mpy_32_32( p_real_fx, sec_z_real_fx ), 2 ), L_shr( Mpy_32_32( p_imag_fx, sec_z_imag_fx ), 2 ) ); // p_q + ( Qfac - 2 ) - 31 - 2 = p_q + Qfac - 35 - *p_sec_I_vec_x_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_x_fx, *p_sec_I_vec_x_exp, tmp_x, tmp_exp, p_sec_I_vec_x_exp ); - move32(); - *p_sec_I_vec_y_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_y_fx, *p_sec_I_vec_y_exp, tmp_y, tmp_exp, p_sec_I_vec_y_exp ); - move32(); - *p_sec_I_vec_z_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_z_fx, *p_sec_I_vec_z_exp, tmp_z, tmp_exp, p_sec_I_vec_z_exp ); - move32(); + tmp_scale = sub( W_norm( sec_I_vec_y_64_fx ), 32 ); + *p_sec_I_vec_y_fx = W_shl_sat_l( sec_I_vec_y_64_fx, tmp_scale ); + move32(); + *p_sec_I_vec_y_exp = sub( tmp_exp_2, tmp_scale ); + move16(); + if ( *p_sec_I_vec_y_fx == 0 ) + { + *p_sec_I_vec_y_exp = 0; + move16(); + } - Word32 tmp1; - Word64 tmp2, tmp3, tmp4, sec_sum64; - Word32 tmp5, sec_sum; - tmp_exp = sub( 62, add( p_q, p_q ) ); - - tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( p_real_fx, p_real_fx ), tmp_exp, Mpy_32_32( p_imag_fx, p_imag_fx ), tmp_exp, &tmp_exp ); - tmp2 = W_add( W_mult0_32_32( sec_x_real_fx, sec_x_real_fx ), W_mult0_32_32( sec_x_imag_fx, sec_x_imag_fx ) ); // 2 * (Qfac - 2) - tmp3 = W_add( W_mult0_32_32( sec_y_real_fx, sec_y_real_fx ), W_mult0_32_32( sec_y_imag_fx, sec_y_imag_fx ) ); // 2 * (Qfac - 2) - tmp4 = W_add( W_mult0_32_32( sec_z_real_fx, sec_z_real_fx ), W_mult0_32_32( sec_z_imag_fx, sec_z_imag_fx ) ); // 2 * (Qfac - 2) - sec_sum64 = W_add( W_add( tmp2, tmp3 ), tmp4 ); // 2 * (Qfac - 2) - n = W_norm( sec_sum64 ); - sec_sum64 = W_shl( sec_sum64, n ); // 2 * (Qfac - 2) + n - sec_sum = W_extract_h( sec_sum64 ); // 2 * (Qfac - 2) + n - 32 = 2 * Qfac + n - 36 - sec_sum_exp = sub( 67, add( shl( Qfac, 1 ), n ) ); - - // divide by 2: - tmp1 = L_shr( tmp1, 1 ); - sec_sum = L_shr( sec_sum, 1 ); - - tmp5 = BASOP_Util_Add_Mant32Exp( tmp1, tmp_exp, sec_sum, sec_sum_exp, &tmp_exp ); - energy_fx = BASOP_Util_Add_Mant32Exp( energy_fx, energy_exp, tmp5, tmp_exp, &energy_exp ); + tmp_scale = sub( W_norm( sec_I_vec_z_64_fx ), 32 ); + *p_sec_I_vec_z_fx = W_shl_sat_l( sec_I_vec_z_64_fx, tmp_scale ); + move32(); + *p_sec_I_vec_z_exp = sub( tmp_exp_2, tmp_scale ); + move16(); + if ( *p_sec_I_vec_z_fx == 0 ) + { + *p_sec_I_vec_z_exp = 0; + move16(); } } @@ -1529,14 +1406,61 @@ void calculate_hodirac_sector_parameters_fx( ELSE { Word32 w_fx = L_sub( ONE_IN_Q30, beta_fx ); // Q30 + Word32 tmp_1, tmp_2, tmp_3, tmp_sec_1, tmp_sec_2, tmp_sec_3; + Word16 e_x, e_y, e_z; + move16(); + + e_x = s_max( *p_sec_I_vec_x_exp, *p_sec_I_vec_smth_x_exp ); + e_y = s_max( *p_sec_I_vec_y_exp, *p_sec_I_vec_smth_y_exp ); + e_z = s_max( *p_sec_I_vec_z_exp, *p_sec_I_vec_smth_z_exp ); + + tmp_1 = L_shr( *p_sec_I_vec_x_fx, sub( e_x, *p_sec_I_vec_x_exp ) ); // e_x + tmp_2 = L_shr( *p_sec_I_vec_y_fx, sub( e_y, *p_sec_I_vec_y_exp ) ); // e_y + tmp_3 = L_shr( *p_sec_I_vec_z_fx, sub( e_z, *p_sec_I_vec_z_exp ) ); // e_z + tmp_sec_1 = L_shr( *p_sec_I_vec_smth_x_fx, sub( e_x, *p_sec_I_vec_smth_x_exp ) ); // e_x + tmp_sec_2 = L_shr( *p_sec_I_vec_smth_y_fx, sub( e_y, *p_sec_I_vec_smth_y_exp ) ); // e_y + tmp_sec_3 = L_shr( *p_sec_I_vec_smth_z_fx, sub( e_z, *p_sec_I_vec_smth_z_exp ) ); // e_z - *p_sec_I_vec_smth_x_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, *p_sec_I_vec_x_fx ), add( *p_sec_I_vec_x_exp, 1 ), Mpy_32_32( beta_fx, *p_sec_I_vec_smth_x_fx ), add( *p_sec_I_vec_smth_x_exp, 1 ), p_sec_I_vec_smth_x_exp ); + + temp_x64 = W_mac_32_32( W_mult_32_32( w_fx, tmp_1 ), beta_fx, tmp_sec_1 ); // 31-e_x+30+1=62-e_x + temp_y64 = W_mac_32_32( W_mult_32_32( w_fx, tmp_2 ), beta_fx, tmp_sec_2 ); // 31-e_y+30+1=62-e_y + temp_z64 = W_mac_32_32( W_mult_32_32( w_fx, tmp_3 ), beta_fx, tmp_sec_3 ); // 31-e_z+30+1=62-e_z + + tmp_scale = sub( W_norm( temp_x64 ), 32 ); + *p_sec_I_vec_smth_x_fx = W_shl_sat_l( temp_x64, tmp_scale ); move32(); - *p_sec_I_vec_smth_y_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, *p_sec_I_vec_y_fx ), add( *p_sec_I_vec_y_exp, 1 ), Mpy_32_32( beta_fx, *p_sec_I_vec_smth_y_fx ), add( *p_sec_I_vec_smth_y_exp, 1 ), p_sec_I_vec_smth_y_exp ); + *p_sec_I_vec_smth_x_exp = sub( sub( e_x, 31 ), tmp_scale ); // 31-(62-e_x+tmp_scale)=e_x-tmp_scale-31 + move16(); + if ( *p_sec_I_vec_smth_x_fx == 0 ) + { + *p_sec_I_vec_smth_x_exp = 0; + move16(); + } + + tmp_scale = sub( W_norm( temp_y64 ), 32 ); + *p_sec_I_vec_smth_y_fx = W_shl_sat_l( temp_y64, tmp_scale ); move32(); - *p_sec_I_vec_smth_z_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, *p_sec_I_vec_z_fx ), add( *p_sec_I_vec_z_exp, 1 ), Mpy_32_32( beta_fx, *p_sec_I_vec_smth_z_fx ), add( *p_sec_I_vec_smth_z_exp, 1 ), p_sec_I_vec_smth_z_exp ); + *p_sec_I_vec_smth_y_exp = sub( sub( e_y, 31 ), tmp_scale ); // 31-(62-e_z+tmp_scale)=e_x-tmp_scale-31 + move16(); + if ( *p_sec_I_vec_smth_y_fx == 0 ) + { + *p_sec_I_vec_smth_y_exp = 0; + move16(); + } + + tmp_scale = sub( W_norm( temp_z64 ), 32 ); + *p_sec_I_vec_smth_z_fx = W_shl_sat_l( temp_z64, tmp_scale ); move32(); + *p_sec_I_vec_smth_z_exp = sub( sub( e_z, 31 ), tmp_scale ); // 31-(62-e_z+tmp_scale)=e_x-tmp_scale-31 + move16(); + if ( *p_sec_I_vec_smth_z_fx == 0 ) + { + *p_sec_I_vec_smth_z_exp = 0; + move16(); + } + *p_energy_smth_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, energy_fx ), add( energy_exp, 1 ), Mpy_32_32( beta_fx, *p_energy_smth_fx ), add( *p_energy_smth_exp, 1 ), p_energy_smth_exp ); + move32(); } IF( LT_32( energy_fx, EPSILON_FX_SMALL ) ) @@ -1579,7 +1503,7 @@ void calculate_hodirac_sector_parameters_fx( *p_ene_exp = *p_energy_smth_exp; move16(); - tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( normI_fx, L_add( *p_energy_smth_fx, EPSILON_FX_SMALL ), &tmp_e ) ); + tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( normI_fx, L_add_sat( *p_energy_smth_fx, EPSILON_FX_SMALL ), &tmp_e ) ); tmp_e = add( tmp_e, sub( normI_exp, *p_energy_smth_exp ) ); tmp32 = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, L_negate( tmp32 ), tmp_e, &tmp_e ); *p_diff_fx = tmp32; @@ -1613,13 +1537,15 @@ void calculate_hodirac_sector_parameters_fx( } ELSE { - *p_azi_fx = L_shl( L_add( Mpy_32_32( L_sub( ONE_IN_Q29, tmp_diff_fx ), *p_azi_fx ), Mpy_32_32( L_sub( tmp_diff_fx, ONE_IN_Q29 / 2 ), *p_azi_prev_fx ) ), 1 ); // Q29 + Q23 - 31 = Q21 - move32(); - *p_ele_fx = L_shl( L_add( Mpy_32_32( L_sub( ONE_IN_Q29, tmp_diff_fx ), *p_ele_fx ), Mpy_32_32( L_sub( tmp_diff_fx, ONE_IN_Q29 / 2 ), *p_ele_prev_fx ) ), 1 ); // Q29 + Q23 - 31 = Q21 - move32(); - *p_azi_fx = L_shl( *p_azi_fx, 2 ); // Q21 -> Q23; + tmp32_1 = L_sub( ONE_IN_Q29, tmp_diff_fx ); + tmp32_2 = L_sub( tmp_diff_fx, ONE_IN_Q29 / 2 ); + + // *p_azi = 2.f * (1.f - tmp_diff) * *p_azi + (2.f * tmp_diff - 1.f) * *p_azi_prev + *p_azi_fx = L_shl( Madd_32_32( Mpy_32_32( tmp32_1, *p_azi_fx ), tmp32_2, *p_azi_prev_fx ), 3 ); // Q29 + Q23 - 31 + 2 = Q23 move32(); - *p_ele_fx = L_shl( *p_ele_fx, 2 ); // Q21 -> Q23; + + // *p_ele = 2.f * (1.f - tmp_diff) * *p_ele + (2.f * tmp_diff - 1.f) * *p_ele_prev + *p_ele_fx = L_shl( Madd_32_32( Mpy_32_32( tmp32_1, *p_ele_fx ), tmp32_2, *p_ele_prev_fx ), 3 ); // Q29 + Q23 - 31 + 2 = Q23 move32(); } } diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index bbf951ab3dc12e2f14e05471e689bad8a91bce2a..1b69f35efad13bedbc81bbb43ea04dbfca30a4fa 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /* options.h needed for debugging/development features @@ -77,7 +77,11 @@ typedef enum IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED, IVAS_ERR_DIRECTIVITY_NOT_SUPPORTED, IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED, + IVAS_ERR_OBJECTS_EDITING_NOT_SUPPORTED, + IVAS_ERR_OBJECTS_EDITING_AND_PANNING_NOT_SUPPORTED, IVAS_ERR_INVALID_HRTF, + IVAS_ERR_INVALID_HRTF_SAMPLING_RATE, + IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA, IVAS_ERR_INVALID_INPUT_FORMAT, IVAS_ERR_INVALID_INDEX, IVAS_ERR_NOT_SUPPORTED_OPTION, @@ -97,6 +101,8 @@ typedef enum * input data errors * *----------------------------------------*/ IVAS_ERR_INVALID_BITSTREAM = 0x2000, + IVAS_ERR_UNEXPECTED_LC3PLUS_BITSTREAM, + IVAS_ERR_UNEXPECTED_LC3PLUS_BITSTREAM_CONFIG, /*----------------------------------------* * hardware errors * @@ -122,6 +128,7 @@ typedef enum IVAS_ERR_BITSTREAM_READER_INVALID_FORMAT, IVAS_ERR_NO_FILE_OPEN, IVAS_ERR_SAMPLING_RATE_UNKNOWN, + IVAS_ERR_EXTERNAL_ORIENTATION_INVALID_FORMAT, /*----------------------------------------* * renderer (lib_rend only) * @@ -135,6 +142,16 @@ typedef enum IVAS_ERR_ACOUSTIC_ENVIRONMENT_MISSING, IVAS_ERR_INVALID_ER_PARAM, IVAS_ERR_DIRECTIVITY_PATTERN_ID_MISSING, + IVAS_ERR_LC3PLUS_INVALID_BITRATE, + IVAS_ERR_INVALID_SPLIT_REND_CONFIG, + + /*----------------------------------------* + * rtp errors * + *----------------------------------------*/ + IVAS_ERR_RTP_UNDERFLOW = 0x7000, + IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, + IVAS_ERR_RTP_UNPACK_PI_DATA, + IVAS_ERR_RTP_UNSUPPORTED_FRAME, /*----------------------------------------* * unknown error * @@ -233,18 +250,32 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) return "Wrong mode"; case IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED: return "Head rotation not supported"; + case IVAS_ERR_LC3PLUS_INVALID_BITRATE: + return "Specified split rendering bit rate is not supported"; + case IVAS_ERR_INVALID_SPLIT_REND_CONFIG: + return "Specified split rendering configuration is invalid"; case IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED: return "External orientation not supported"; case IVAS_ERR_DIRECTIVITY_NOT_SUPPORTED: return "Directivity not supported"; case IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED: return "Acoustic environment not supported"; + case IVAS_ERR_OBJECTS_EDITING_NOT_SUPPORTED: + return "Objects editing not supported"; + case IVAS_ERR_OBJECTS_EDITING_AND_PANNING_NOT_SUPPORTED: + return "Wrong use of both Object editing and Non-diegetic panning"; case IVAS_ERR_INVALID_HRTF: return "Unsupported HRTF filter set"; + case IVAS_ERR_INVALID_HRTF_SAMPLING_RATE: + return "Wrong sampling rate in HRTF binary file"; + case IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA: + return "Renderer data missing in HRTF binary file"; case IVAS_ERR_INVALID_INPUT_FORMAT: return "Invalid input format"; case IVAS_ERR_INVALID_INDEX: return "Invalid index"; + case IVAS_ERR_EXTERNAL_ORIENTATION_INVALID_FORMAT: + return "Euler angles were detected in the input but only Quaternions are supported"; default: break; } @@ -259,6 +290,22 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) { return "data error"; } + if ( ( error_code & 0x7000 ) == 0x7000 ) + { + switch ( error_code ) + { + case IVAS_ERR_RTP_UNDERFLOW: + return "RTP Undeflow in reading frame/packet"; + case IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE: + return "Output buffer size is insufficient"; + case IVAS_ERR_RTP_UNPACK_PI_DATA: + return "Unpacking PI data failure"; + case IVAS_ERR_RTP_UNSUPPORTED_FRAME: + return "Unsupported RTP frame"; + default: + return "rtp error"; + } + } return "Unknown error"; } diff --git a/lib_com/ivas_fb_mixer_fx.c b/lib_com/ivas_fb_mixer_fx.c index d5cd8d4f17875b44cbcecb447e9bf0463a25f056..c860b354e27a271e5a6384bde2e3e15f9512408e 100644 --- a/lib_com/ivas_fb_mixer_fx.c +++ b/lib_com/ivas_fb_mixer_fx.c @@ -39,7 +39,6 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*------------------------------------------------------------------------------------------* @@ -199,14 +198,13 @@ ivas_error ivas_FB_mixer_open_fx( { IVAS_FB_MIXER_HANDLE hFbMixer; Word16 i, j, frame_len, num_bands; - Word16 num_chs_alloc, exp; + Word16 num_chs_alloc; ivas_error error; error = IVAS_ERR_OK; move32(); - frame_len = BASOP_Util_Divide3232_Scale( sampling_rate, FRAMES_PER_SEC, &exp ); - frame_len = shr( frame_len, sub( 15, exp ) ); + frame_len = extract_l( Mpy_32_32_r( sampling_rate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); hFbMixer = *hFbMixer_out; @@ -614,13 +612,15 @@ void ivas_fb_mixer_get_windowed_fr_fx( Word16 n_new_samples; Word32 fr_in_block_fx[L_FRAME48k * 2]; const Word16 *win_ptr_fx; + Word16 two_mdft_len = shl( mdft_len, 1 ); + Word16 tmp = sub( shl( mdft_len, 1 ), length ); + Word16 gb_neg = negate( gb ); - n_old_samples = s_min( ( sub( hFbMixer->fb_cfg->prior_input_length, hFbMixer->fb_cfg->windowed_fr_offset ) ), ( shl( mdft_len, 1 ) ) ); - n_new_samples = s_max( 0, sub( shl( length, 1 ), n_old_samples ) ); - offset = sub( sub( shl( mdft_len, 1 ), length ), hFbMixer->ana_window_offset ); - rev_offset = sub( shl( mdft_len, 1 ), hFbMixer->ana_window_offset ); + n_old_samples = s_min( ( sub( hFbMixer->fb_cfg->prior_input_length, hFbMixer->fb_cfg->windowed_fr_offset ) ), two_mdft_len ); + offset = sub( tmp, hFbMixer->ana_window_offset ); + rev_offset = sub( two_mdft_len, hFbMixer->ana_window_offset ); set32_fx( fr_in_block_fx, 0, offset ); - + n_new_samples = s_max( 0, sub( shl( length, 1 ), n_old_samples ) ); FOR( ch_idx = 0; ch_idx < nchan_fb_in; ch_idx++ ) { Copy32( &hFbMixer->ppFilterbank_prior_input_fx[ch_idx][offset + hFbMixer->fb_cfg->windowed_fr_offset], &fr_in_block_fx[offset], sub( n_old_samples, offset ) ); // Qx @@ -628,25 +628,21 @@ void ivas_fb_mixer_get_windowed_fr_fx( win_ptr_fx = hFbMixer->pAna_window_fx; /*Q15*/ - FOR( j = offset; j < sub( shl( mdft_len, 1 ), length ); j++ ) + FOR( j = offset; j < tmp; j++ ) { fr_in_block_fx[j] = Mpy_32_16_1( fr_in_block_fx[j], ( *( win_ptr_fx++ ) ) ); // Qx + 15 - 15 = Qx move32(); } - FOR( j = rev_offset; j < shl( mdft_len, 1 ); j++ ) + FOR( j = rev_offset; j < two_mdft_len; j++ ) { fr_in_block_fx[j] = Mpy_32_16_1( fr_in_block_fx[j], ( *( --win_ptr_fx ) ) ); // Qx + 15 - 15 = Qx move32(); } - FOR( Word16 i = 0; i < shl( mdft_len, 1 ); i++ ) - { - fr_in_block_fx[i] = L_shr( fr_in_block_fx[i], gb ); // Qx - gb - move32(); - } + scale_sig32( fr_in_block_fx, two_mdft_len, gb_neg ); - ivas_mdft_fx( fr_in_block_fx, frame_f_real_fx[ch_idx], frame_f_imag_fx[ch_idx], shl( mdft_len, 1 ), mdft_len ); + ivas_mdft_fx( fr_in_block_fx, frame_f_real_fx[ch_idx], frame_f_imag_fx[ch_idx], two_mdft_len, mdft_len ); } return; @@ -759,6 +755,11 @@ void ivas_fb_mixer_process_fx( pMdft_out_fx[0] = Mdft_out_0_fx; pMdft_out_fx[1] = Mdft_out_1_fx; + Word16 total_guard = find_guarded_bits_fx( num_bands ); + Word16 total_guard_2 = find_guarded_bits_fx( shl( frame_len, 1 ) ); + Word16 tmp_q = sub( sub( *q_mixer_mat_fx, total_guard ), 32 ); // Q30 + hFbMixer->q_prior_mixer_fx - 31 - total_guard - 31 + Word16 len = shl( frame_len, 1 ); + Word16 res_q, q_check; FOR( ch = ( hFbMixer->fb_cfg->active_w_mixing == 0 ); ch < hFbMixer->fb_cfg->num_out_chans; ch++ ) { /* Run a loop of 2 to calculate current frame's filterbank output and prev frame's output */ @@ -773,6 +774,10 @@ void ivas_fb_mixer_process_fx( IF( in_out_mixer_map[ch][j] != 0 ) { + res_q = add( tmp_q, hFbMixer->q_ppFilterbank_inFR[j] ); + q_check = s_min( q_pOut_fr_fx, res_q ); + scale_sig32( pOut_fr_re_fx, frame_len, sub( q_check, q_pOut_fr_fx ) ); + scale_sig32( pOut_fr_im_fx, frame_len, sub( q_check, q_pOut_fr_fx ) ); Word32 filterbank_mixer_bins_re_fx[L_FRAME48k]; Word32 filterbank_mixer_bins_im_fx[L_FRAME48k]; Word32 *pFb_inFR_re_fx = hFbMixer->ppFilterbank_inFR_re_fx[j]; // Q(hFbMixer->q_ppFilterbank_inFR_re_fx) @@ -781,8 +786,6 @@ void ivas_fb_mixer_process_fx( set_zero_fx( filterbank_mixer_bins_re_fx, frame_len ); set_zero_fx( filterbank_mixer_bins_im_fx, frame_len ); - Word16 total_guard = find_guarded_bits_fx( num_bands ); - move16(); FOR( i = 0; i < num_bands; i++ ) { Word16 start_offset = pFb->fb_consts.pFilterbank_bins_start_offset[i]; @@ -808,48 +811,35 @@ void ivas_fb_mixer_process_fx( hFbMixer->prior_mixer_fx[ch][j][i] = mixer_mat_fx[ch][j][i]; // Q(q_mixer_mat_fx) move32(); } - Word16 res_q = 0; - move16(); FOR( k = 0; k < frame_len; k++ ) { Word32 temp_out_re_fx, temp_out_im_fx; ivas_cmult_fix( filterbank_mixer_bins_re_fx[k], filterbank_mixer_bins_im_fx[k], pFb_inFR_re_fx[k], pFb_inFR_im_fx[k], &temp_out_re_fx, &temp_out_im_fx ); - res_q = sub( add( sub( sub( add( 30, *q_mixer_mat_fx ), 31 ), total_guard ), hFbMixer->q_ppFilterbank_inFR[j] ), 31 ); - Word16 q_check = s_min( q_pOut_fr_fx, res_q ); - IF( NE_16( q_check, q_pOut_fr_fx ) ) - { - pOut_fr_re_fx[k] = L_shr( pOut_fr_re_fx[k], sub( q_pOut_fr_fx, q_check ) ); // q_pOut_fr_fx -> q_check - move32(); - pOut_fr_im_fx[k] = L_shr( pOut_fr_im_fx[k], sub( q_pOut_fr_fx, q_check ) ); // q_pOut_fr_fx -> q_check - move32(); - } IF( NE_16( q_check, res_q ) ) { temp_out_re_fx = L_shr( temp_out_re_fx, sub( res_q, q_check ) ); // res_q -> q_check temp_out_im_fx = L_shr( temp_out_im_fx, sub( res_q, q_check ) ); // res_q -> q_check } - res_q = q_check; - move16(); + pOut_fr_re_fx[k] = L_add_sat( pOut_fr_re_fx[k], temp_out_re_fx ); // res_q move32(); pOut_fr_im_fx[k] = L_add_sat( pOut_fr_im_fx[k], temp_out_im_fx ); // res_q move32(); } - q_pOut_fr_fx = res_q; - move16(); + q_pOut_fr_fx = q_check; } } - Word16 scale = sub( s_min( L_norm_arr( pOut_fr_re_fx, frame_len ), L_norm_arr( pOut_fr_im_fx, frame_len ) ), find_guarded_bits_fx( shl( frame_len, 1 ) ) ); + Word16 scale = sub( s_min( L_norm_arr( pOut_fr_re_fx, frame_len ), L_norm_arr( pOut_fr_im_fx, frame_len ) ), total_guard_2 ); scale_sig32( pOut_fr_re_fx, frame_len, scale ); scale_sig32( pOut_fr_im_fx, frame_len, scale ); ivas_imdft_fx( pOut_fr_re_fx, pOut_fr_im_fx, pMdft_out_fx[hist], frame_len ); q_pMdft_out_fx[hist] = add( q_pOut_fr_fx, scale ); move16(); } - scale_sig32( pMdft_out_fx[0], shl( frame_len, 1 ), sub( s_min( q_pMdft_out_fx[0], q_pMdft_out_fx[1] ), q_pMdft_out_fx[0] ) ); - scale_sig32( pMdft_out_fx[1], shl( frame_len, 1 ), sub( s_min( q_pMdft_out_fx[0], q_pMdft_out_fx[1] ), q_pMdft_out_fx[1] ) ); + scale_sig32( pMdft_out_fx[0], len, sub( s_min( q_pMdft_out_fx[0], q_pMdft_out_fx[1] ), q_pMdft_out_fx[0] ) ); + scale_sig32( pMdft_out_fx[1], len, sub( s_min( q_pMdft_out_fx[0], q_pMdft_out_fx[1] ), q_pMdft_out_fx[1] ) ); ivas_fb_mixer_cross_fading_fx( hFbMixer, ppOut_pcm_fx, pMdft_out_fx[0], pMdft_out_fx[1], ch, frame_len, frame_len ); q_ppOut_pcm_fx[ch] = s_min( q_pMdft_out_fx[0], q_pMdft_out_fx[1] ); move16(); @@ -944,8 +934,9 @@ static Word16 ivas_calculate_abs_fr_fx( move64(); Word16 short_stride = pFb->fb_bin_to_band.short_stride; move16(); + Word32 res_dec1, res_frac, res_dec2; - iDiv_and_mod_32( sampling_rate, FRAMES_PER_SEC, &res_dec1, &res_frac, 0 ); + res_dec1 = Mpy_32_32_r( sampling_rate, ONE_BY_FRAMES_PER_SEC_Q31 ); iDiv_and_mod_32( res_dec1, short_stride, &res_dec2, &res_frac, 0 ); const Word16 num_bins_per_short_stride_bin = extract_l( res_dec2 ); iDiv_and_mod_32( res_dec1, pFb->fb_bin_to_band.num_cldfb_bands, &res_dec2, &res_frac, 0 ); @@ -1267,7 +1258,7 @@ static ivas_error ivas_filterbank_setup_fx( const Word32 sampling_rate, Word16 *index ) { - Word16 i, j, exp, tmp; + Word16 i, j, tmp; const Word32 *pAll_fb_fr_fx[2]; const Word16 *pAll_bins_start_offset = NULL; const Word16 *pAll_bins_per_band = NULL; @@ -1350,9 +1341,8 @@ static ivas_error ivas_filterbank_setup_fx( /*pFb->fb_bin_to_band.cldfb_stride = ( int16_t )( ( sampling_rate / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX );*/ /* equals num_cldfb_bands*/ // pFb->fb_bin_to_band.short_stride = extract_l( ( sampling_rate / FRAMES_PER_SEC ) / 4 ); - tmp = BASOP_Util_Divide3232_Scale( sampling_rate, FRAMES_PER_SEC, &exp ); - pFb->fb_bin_to_band.short_stride = shr( tmp, add( sub( 15, exp ), 2 ) ); - + tmp = extract_l( Mpy_32_32_r( sampling_rate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + pFb->fb_bin_to_band.short_stride = shr( tmp, 2 ); move16(); set32_fx( pFb->fb_bin_to_band.p_short_stride_bin_to_band_fx, 0, 2 * MDFT_FB_BANDS_240 ); diff --git a/lib_com/ivas_filters_fx.c b/lib_com/ivas_filters_fx.c index 1e9aaf0c20771fffa77bbebf43f7109a95cc50b5..02e7b272a4beb7759335c88421067918f710763f 100644 --- a/lib_com/ivas_filters_fx.c +++ b/lib_com/ivas_filters_fx.c @@ -41,30 +41,29 @@ /*------------------------------------------------------------------------------------------* * Local functions declaration *------------------------------------------------------------------------------------------*/ -static void ivas_iir_2_filter_fx( - ivas_filters_process_state_t *filter_state, - Word32 *pIn_Out_fx, // Q(31-*pIn_Out_e) - const Word16 length, - const Word16 stage, - Word16 *pIn_Out_e ); + +static void ivas_iir_2_filter_fx( ivas_filters_process_state_t *filter_state, Word32 *pIn_Out_fx, const Word16 length, const Word16 stage, Word16 *pIn_Out_e ); + + /*-----------------------------------------------------------------------------------------* * Function ivas_filters_init() * * Initialisation call for filtering a signal *-----------------------------------------------------------------------------------------*/ + void ivas_filters_init_fx( - ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ - const Word32 *filt_coeff_fx, /* i : filter coefficients Q31- *filt_coeff_e */ - const Word16 *filt_coeff_e, /* i : exponents of filter coefficients */ - const Word16 order ) /* i : filter order */ + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + const Word32 *filt_coeff_fx, /* i : filter coefficients Q31- *filt_coeff_e */ + const Word16 *filt_coeff_e, /* i : exponents of filter coefficients */ + const Word16 order ) /* i : filter order */ { Word16 i; + filter_state->order = order; move16(); - test(); - IF( EQ_16( order, IVAS_FILTER_ORDER_2 ) || EQ_16( order, IVAS_FILTER_ORDER_1 ) ) + IF( EQ_16( order, IVAS_FILTER_ORDER_1 ) ) { filter_state->filt_len = add( order, 1 ); move16(); @@ -155,6 +154,7 @@ void ivas_filters_init_fx( * * Process call for selecting the type filter *-----------------------------------------------------------------------------------------*/ + void ivas_filter_process_fx( ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ Word32 *pIn_Out_fx, /* i/o: signal subject to filtering Q(q_factor) */ @@ -163,10 +163,10 @@ void ivas_filter_process_fx( { Word16 pIn_Out_e[L_FRAME_MAX]; Word16 i; + SWITCH( filter_state->order ) { case IVAS_FILTER_ORDER_1: - case IVAS_FILTER_ORDER_2: set_val_Word16( pIn_Out_e, sub( Q31, q_factor ), length ); ivas_iir_2_filter_fx( filter_state, pIn_Out_fx, length, IVAS_FILTER_STAGE_0, pIn_Out_e ); /* Scale pIn_Out_fx back to input Q */ @@ -196,6 +196,7 @@ void ivas_filter_process_fx( return; } + void ivas_filter_process_exp_fx( ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ Word32 *pIn_Out_fx, /* i/o: signal subject to filtering (exp[i] : pIn_out_e[i]) */ @@ -205,7 +206,6 @@ void ivas_filter_process_exp_fx( SWITCH( filter_state->order ) { case IVAS_FILTER_ORDER_1: - case IVAS_FILTER_ORDER_2: ivas_iir_2_filter_fx( filter_state, pIn_Out_fx, length, IVAS_FILTER_STAGE_0, pIn_Out_e ); /* Scale pIn_Out_fx back to input Q */ BREAK; @@ -229,6 +229,7 @@ void ivas_filter_process_exp_fx( * * Process call for filtering a signal *-----------------------------------------------------------------------------------------*/ + static void ivas_iir_2_filter_fx( ivas_filters_process_state_t *filter_state, Word32 *pIn_Out_fx, // Q(31-*pIn_Out_e) @@ -281,4 +282,6 @@ static void ivas_iir_2_filter_fx( } } } + + return; } diff --git a/lib_com/ivas_ism_com_fx.c b/lib_com/ivas_ism_com_fx.c index 5f1a13afb7ca1a431d823a6d5461813e136c34a0..ea276c944920f227648b8d0fccf79076571f0806 100644 --- a/lib_com/ivas_ism_com_fx.c +++ b/lib_com/ivas_ism_com_fx.c @@ -144,9 +144,9 @@ ivas_error ivas_ism_config_fx( { /* combined format: decision about bitrates per channel - variable during the session (at one ivas_total_brate) */ // bits_ism = (Word16) ( ism_total_brate / FRAMES_PER_SEC ); - bits_ism = extract_l( Mpy_32_32( 42949673, ism_total_brate ) ); // 42949673 is 1/FRAMES_PER_SEC in Q31 - tmp1 = BASOP_Util_Divide1616_Scale( bits_ism, n_ISms, &exp ); // Q15 - exp - set16_fx( bits_element, shr( tmp1, sub( 15, exp ) ), n_ISms ); + bits_ism = extract_l( Mpy_32_32_r( ONE_BY_FRAMES_PER_SEC_Q31, ism_total_brate ) ); // Q0 + tmp1 = extract_h( Mpy_32_16_r( one_by_q_level[n_ISms], bits_ism ) ); + set16_fx( bits_element, tmp1, n_ISms ); bits_element[n_ISms - 1] = add( bits_element[n_ISms - 1], bits_ism % n_ISms ); // Q0 move16(); @@ -156,11 +156,9 @@ ivas_error ivas_ism_config_fx( { /* ISM format: decision about bitrates per channel - constant during the session (at one ivas_total_brate) */ // bits_ism = (Word16) ( ism_total_brate / FRAMES_PER_SEC ); - // 1 / 50 * 2 ^ 31 -- > 42949673, --> Q31, - //(Q31 +Q0) - Q31 --> Q0 - bits_ism = extract_l( Mpy_32_32( 42949673, ism_total_brate ) ); // 42949673 is 1/FRAMES_PER_SEC in Q31 - tmp1 = BASOP_Util_Divide1616_Scale( bits_ism, n_ISms, &exp ); // Q15 - exp - set16_fx( bits_element, shr( tmp1, sub( 15, exp ) ), n_ISms ); + bits_ism = extract_l( Mpy_32_32_r( ONE_BY_FRAMES_PER_SEC_Q31, ism_total_brate ) ); // Q0 + tmp1 = extract_h( Mpy_32_16_r( one_by_q_level[n_ISms], bits_ism ) ); + set16_fx( bits_element, tmp1, n_ISms ); bits_element[n_ISms - 1] = add( bits_element[n_ISms - 1], bits_ism % n_ISms ); // Q0 move16(); bitbudget_to_brate( bits_element, element_brate, n_ISms ); @@ -472,6 +470,23 @@ void ivas_ism_reset_metadata( hIsmMeta->non_diegetic_flag = 0; move16(); + hIsmMeta->edited_gain_fx = ONE_IN_Q29; + move32(); + hIsmMeta->edited_azimuth_fx = 0; + move32(); + hIsmMeta->edited_elevation_fx = 0; + move32(); + hIsmMeta->edited_pitch_fx = 0; + move32(); + hIsmMeta->edited_yaw_fx = 0; + move32(); + hIsmMeta->edited_radius_fx = ONE_IN_Q9; + move32(); + hIsmMeta->gain_fx = ONE_IN_Q29; + move32(); + hIsmMeta->non_diegetic_flag = 0; + move16(); + return; } diff --git a/lib_com/ivas_lfe_com_fx.c b/lib_com/ivas_lfe_com_fx.c index 3d1e7aee66e4b495f8aadbff57788cacdcc5389c..d515cc5fbc77ce306b43d6d8607a430a74c3f5b7 100644 --- a/lib_com/ivas_lfe_com_fx.c +++ b/lib_com/ivas_lfe_com_fx.c @@ -41,7 +41,6 @@ #include #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*-----------------------------------------------------------------------------------------* @@ -49,31 +48,17 @@ * * Selects LFE filter coeff based on config. *-----------------------------------------------------------------------------------------*/ + void ivas_lfe_lpf_select_filt_coeff_fx( - const Word32 sampling_rate, /* i : sampling rate */ - const Word16 order, /* i : filter order */ - const Word32 **ppFilt_coeff_fx, /* o : filter coefficients */ - const Word16 **ppFilt_coeff_e /* o : exponents of filter coefficients */ + const Word32 sampling_rate, /* i : sampling rate */ + const Word16 order, /* i : filter order */ + const Word32 **ppFilt_coeff_fx, /* o : filter coefficients */ + const Word16 **ppFilt_coeff_e /* o : exponents of filter coefficients */ ) { SWITCH( order ) { - case IVAS_FILTER_ORDER_2: - SWITCH( sampling_rate ) - { - case 16000: - *ppFilt_coeff_fx = ivas_lpf_2_butter_16k_fx; // Q30 - BREAK; - case 32000: - *ppFilt_coeff_fx = ivas_lpf_2_butter_32k_fx; // Q30 - BREAK; - case 48000: - *ppFilt_coeff_fx = ivas_lpf_2_butter_48k_fx; // Q30 - BREAK; - default: - BREAK; - } - BREAK; + case IVAS_FILTER_ORDER_4: SWITCH( sampling_rate ) { diff --git a/lib_rend/ivas_limiter_fx.c b/lib_com/ivas_limiter_fx.c similarity index 90% rename from lib_rend/ivas_limiter_fx.c rename to lib_com/ivas_limiter_fx.c index b212e5445c0c16f89af6f59bb5d7cfa64ec1b648..a293b629c189f7cedfff46ed6caf5e6b4213873d 100644 --- a/lib_rend/ivas_limiter_fx.c +++ b/lib_com/ivas_limiter_fx.c @@ -36,16 +36,21 @@ #include "prot_fx.h" #include "ivas_prot_rend_fx.h" #include "ivas_rom_rend.h" +#include "ivas_rom_com.h" #include "wmc_auto.h" #include #include "ivas_prot_fx.h" - -#define ATTACK_CNST_48k ( 2106670080 ) // Q31 -#define ATTACK_CNST_32k ( 2086555136 ) // Q31 -#define ATTACK_CNST_16k ( 2027355264 ) // Q31 -#define ATTACK_CNST_8k ( 1913946752 ) // Q31 - +#define RELEASE_CNST_20MS ( 85899345 ) // Q30 +#define RELEASE_CNST_2_20MS ( 21474836 ) // Q30 +#define RELEASE_CNST_10MS ( 42949672 ) // Q30 +#define RELEASE_CNST_2_10MS ( 10737418 ) // Q30 +#define RELEASE_CNST_5MS ( 21474836 ) // Q30 +#define RELEASE_CNST_2_5MS ( 5368709 ) // Q30 +#define ATTACK_CNST_48k ( 2106670080 ) // Q31 +#define ATTACK_CNST_32k ( 2086555136 ) // Q31 +#define ATTACK_CNST_16k ( 2027355264 ) // Q31 +#define ATTACK_CNST_8k ( 1913946752 ) // Q31 /*-------------------------------------------------------------------* * detect_strong_saturations() @@ -348,24 +353,45 @@ void limiter_process_fx( * keep the gain curve smoother if the threshold is exceeded in many frames * in a short span of time. */ - SWITCH( output_frame ) + IF( EQ_32( L_mult0( output_frame, 50 ), hLimiter->sampling_rate ) ) { - case 960: - case 640: - case 320: - case 160: - releaseHeuristic_cnst = 85899345; /*Q30*/ - move32(); - releaseHeuristic_cnst_2 = 21474836; /*Q30*/ - move32(); - BREAK; - default: - releaseHeuristic_cnst = 21474836; /*Q30*/ - move32(); - releaseHeuristic_cnst_2 = 5368709; /*Q30*/ - move32(); - BREAK; + releaseHeuristic_cnst = RELEASE_CNST_20MS; + move32(); + releaseHeuristic_cnst_2 = RELEASE_CNST_2_20MS; + move32(); } + ELSE IF( EQ_32( L_mult0( output_frame, 100 ), hLimiter->sampling_rate ) ) + { + releaseHeuristic_cnst = RELEASE_CNST_10MS; + move32(); + releaseHeuristic_cnst_2 = RELEASE_CNST_2_10MS; + move32(); + } + ELSE IF( EQ_32( L_mult0( output_frame, 200 ), hLimiter->sampling_rate ) ) + { + releaseHeuristic_cnst = RELEASE_CNST_5MS; + move32(); + releaseHeuristic_cnst_2 = RELEASE_CNST_2_5MS; + move32(); + } + ELSE + { + // computing output_frame/hLimiter->sampling_rate in Q30 + i = norm_s( output_frame ); + c = norm_l( hLimiter->sampling_rate ); + scale = extract_h( L_shl( hLimiter->sampling_rate, c ) ); + idx = shl( output_frame, i ); + IF( GT_16( idx, scale ) ) + { + idx = shr( idx, 1 ); + i = sub( i, 1 ); + } + scale = div_s( idx, scale ); + i = sub( sub( c, i ), 1 ); // Q30 + releaseHeuristic_cnst_2 = L_shl( scale, i ); + releaseHeuristic_cnst = L_shl( releaseHeuristic_cnst_2, 2 ); + } + releaseHeuristic = hLimiter->release_heuristic_fx; /* Q30 */ move32(); diff --git a/lib_com/ivas_masa_com_fx.c b/lib_com/ivas_masa_com_fx.c index cfed06357fe908e6c3fda28720aa7272ca67adb0..9c706bc74a1dc6bfdeefea66b3835ef25fe0f2bd 100644 --- a/lib_com/ivas_masa_com_fx.c +++ b/lib_com/ivas_masa_com_fx.c @@ -39,7 +39,6 @@ #include "ivas_rom_com.h" #include "ivas_stat_dec.h" #include "wmc_auto.h" -#include "ivas_rom_com_fx.h" #include "ivas_prot_fx.h" @@ -978,7 +977,7 @@ static Word16 quantize_phi_masa_fx( Word32 tmp32; Word16 tmp_e, delta_phi_e; - delta_phi_fx = L_deposit_h( BASOP_Util_Divide1616_Scale( 360, n, &delta_phi_e ) ); + delta_phi_fx = BASOP_Util_Divide3232_Scale_newton( 360, n, &delta_phi_e ); delta_phi_fx = L_shr( delta_phi_fx, sub( sub( 31, delta_phi_e ), 22 ) ); // Q22 IF( EQ_16( n, 1 ) ) @@ -1000,8 +999,8 @@ static Word16 quantize_phi_masa_fx( } tmp32 = L_add( L_sub( phi_fx, dd_fx ), L_shr( delta_phi_fx, 1 ) ); - id_phi = BASOP_Util_Divide3232_Scale( tmp32, delta_phi_fx, &tmp_e ); - id_phi = shr( id_phi, sub( 15, tmp_e ) ); // Q0 + tmp32 = BASOP_Util_Divide3232_Scale_newton( tmp32, delta_phi_fx, &tmp_e ); + id_phi = extract_l( L_shr( tmp32, sub( 31, tmp_e ) ) ); // Q0 if ( EQ_16( id_phi, n ) ) { @@ -1014,7 +1013,10 @@ static Word16 quantize_phi_masa_fx( id_phi = sub( n, 1 ); } - *phi_hat_fx = L_add( L_shl( Mpy_32_16_1( delta_phi_fx, id_phi ), 15 ), dd_fx ); // q22 + q0 - 15 = q7 -> q7 + 15 = q22 + delta_phi_fx = BASOP_Util_Divide3232_Scale_newton( L_mult0( 360, id_phi ), n, &delta_phi_e ); + delta_phi_fx = L_shr( delta_phi_fx, sub( sub( 31, delta_phi_e ), 22 ) ); // Q22 + + *phi_hat_fx = L_add( delta_phi_fx, dd_fx ); // Q22 move32(); return id_phi; // Q0 @@ -1308,7 +1310,7 @@ Word16 valid_ratio_index_fx( void reconstruct_ism_ratios_fx( Word16 *ratio_ism_idx, /* i : index vector Q0 */ const Word16 nchan_ism, /* i : number of components/objects Q0 */ - const Word16 step, /* i : quantization step Q15 */ + const Word32 step, /* i : quantization step Q31 */ Word32 *q_energy_ratio_ism /* o : reconstructed ISM values Q30 */ ) { @@ -1320,7 +1322,7 @@ void reconstruct_ism_ratios_fx( FOR( i = 0; i < nchan_ism - 1; i++ ) { - q_energy_ratio_ism[i] = L_shl( L_mult( ratio_ism_idx[i], step ), 14 ); // q0 + q15 + 1 + 14 = q30; + q_energy_ratio_ism[i] = W_extract_l( W_shr( W_mult_32_16( step, ratio_ism_idx[i] ), 2 ) ); // q0 + q31 + 1 - 2 = q30; move32(); sum = L_add( sum, q_energy_ratio_ism[i] ); // Q30 diff --git a/lib_com/ivas_mc_param_com_fx.c b/lib_com/ivas_mc_param_com_fx.c index 4469e7f93d82856a3e2db90e362e3e02265108be..e3827c5685d146777de8975f73bd52b7b5791873 100644 --- a/lib_com/ivas_mc_param_com_fx.c +++ b/lib_com/ivas_mc_param_com_fx.c @@ -39,7 +39,6 @@ #include "ivas_stat_com.h" #include "ivas_rom_com.h" #include "wmc_auto.h" -#include "ivas_rom_com_fx.h" #include "ivas_prot_fx.h" @@ -47,9 +46,9 @@ * Local function prototypes *------------------------------------------------------------------------*/ - static void ivas_param_mc_set_coding_scheme_fx( const MC_LS_SETUP mc_ls_setup, const Word32 ivas_total_brate, HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC ); + /*------------------------------------------------------------------------- * ivas_param_mc_get_configuration_index() * diff --git a/lib_com/ivas_mcmasa_com-fx.c b/lib_com/ivas_mcmasa_com_fx.c similarity index 100% rename from lib_com/ivas_mcmasa_com-fx.c rename to lib_com/ivas_mcmasa_com_fx.c diff --git a/lib_com/ivas_mdct_imdct_fx.c b/lib_com/ivas_mdct_imdct_fx.c index 542f5ca745df2f4a678581ab9c1968ba2966137e..960b823ae605a2c890c6b77a3e305039fe0af208 100644 --- a/lib_com/ivas_mdct_imdct_fx.c +++ b/lib_com/ivas_mdct_imdct_fx.c @@ -34,7 +34,7 @@ #include "options.h" #include "prot_fx.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" +#include "ivas_rom_com.h" #ifdef DEBUGGING #include "debug.h" #endif diff --git a/lib_com/ivas_mdft_imdft_fx.c b/lib_com/ivas_mdft_imdft_fx.c index 5d7bee1a6929347ac19968f7d8996878878f8897..1d07ab13356e8b5b418e841bd302a6dd002df1dd 100644 --- a/lib_com/ivas_mdft_imdft_fx.c +++ b/lib_com/ivas_mdft_imdft_fx.c @@ -40,7 +40,6 @@ #include #include #include "debug.h" -#include "ivas_rom_com_fx.h" #include "ivas_prot_fx.h" /*-----------------------------------------------------------------------------------------* diff --git a/lib_com/preemph.c b/lib_com/ivas_osba_com_fx.c similarity index 68% rename from lib_com/preemph.c rename to lib_com/ivas_osba_com_fx.c index 9ebc0f72a81c39542312ff9e6bbd3d76b5a49197..79ce8443ace24e625bd32134f6817c56bd34b78c 100644 --- a/lib_com/preemph.c +++ b/lib_com/ivas_osba_com_fx.c @@ -30,43 +30,44 @@ *******************************************************************************************************/ -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include #include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot_fx.h" #include "prot_fx.h" -#include "wmc_auto.h" - -/*-------------------------------------------------------------* - * preemph_ivas_fx() - * - * Preemphasis: filtering through 1 - mu z^-1 - *-------------------------------------------------------------*/ +#include "ivas_rom_com.h" +#ifdef DEBUGGING +#include "debug.h" +#endif -void preemph_ivas_fx( - Word32 *signal, /* i/o: signal Qx*/ - const Word16 mu, /* i : preemphasis factor Q15*/ - const Word16 L, /* i : vector size Q0*/ - Word32 *mem /* i/o: memory (x[-1]) Qx*/ +/*! r : ISM format mode */ +ISM_MODE ivas_osba_ism_mode_select( + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 nchan_ism /* i : number of input ISM's */ ) { - Word16 i; - Word32 temp; + ISM_MODE ism_mode = ISM_MODE_NONE; - temp = signal[L - 1]; /* Qx */ - move32(); - FOR( i = L - 1; i > 0; i-- ) + SWITCH( nchan_ism ) { - signal[i] = L_sub( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); /* Qx */ - move32(); - } + case 1: + if ( GE_32( ivas_total_brate, IVAS_96k ) ) + { + ism_mode = ISM_SBA_MODE_DISC; + move32(); + } + BREAK; - signal[0] = L_sub( signal[0], Mpy_32_16_1( *mem, mu ) ); /* Qx */ - move32(); - *mem = temp; /* Qx */ - move32(); - return; + case 2: + case 3: + case 4: + if ( GE_32( ivas_total_brate, IVAS_128k ) ) + { + ism_mode = ISM_SBA_MODE_DISC; + move32(); + } + BREAK; + } + + return ism_mode; } diff --git a/lib_com/ivas_pca_tools_fx.c b/lib_com/ivas_pca_tools_fx.c index ea4cfce7e08f54cb0db6302e1e82297c29289b10..58b0ca8df561eebaacbf6e1ebf5b0c02f80447cf 100644 --- a/lib_com/ivas_pca_tools_fx.c +++ b/lib_com/ivas_pca_tools_fx.c @@ -195,7 +195,7 @@ static void house_refl_fx( IF( ( *normu_fx ) == 0 ) { - pu_fx[0] = SQRT2_FIXED; // same q as other elements -> Q30 + pu_fx[0] = SQRT2_FX; // same q as other elements -> Q30 pu_e[0] = 1; move32(); move16(); @@ -387,8 +387,7 @@ static void house_qr_fx( move32(); } - - pv_fx[s - k] = dotp_fixed( &pu_fx[k], &pa_fx[k], sub( n_rows, k ) ); // exp: tmp_pu_e[k] + pv_fx[s - k] = dotp_fx32( &pu_fx[k], &pa_fx[k], sub( n_rows, k ) ); // exp: tmp_pu_e[k] pv_exp[s - k] = tmp_pu_e[k]; move32(); move16(); @@ -444,7 +443,7 @@ void eig_qr_fx( move16(); /* check zero matrix */ - d_fx = dotp_fixed( A_fx, A_fx, n * n ); // A_q + A_q - Q31 -> d_q + d_fx = dotp_fx32( A_fx, A_fx, n * n ); // A_q + A_q - Q31 -> d_q d_q = sub( add( A_q, A_q ), 31 ); if ( d_fx != 0 ) @@ -480,7 +479,7 @@ void eig_qr_fx( } /* stop condition */ - d_fx = dotp_fixed_guarded( D_fx, D_fx, n * n ); // ( A_q + A_q - 31 ) - find_guarded_bits_fx( n * n ) + d_fx = dotp_fx_guarded( D_fx, D_fx, n * n ); // ( A_q + A_q - 31 ) - find_guarded_bits_fx( n * n ) d_q = sub( sub( add( A_q, A_q ), 31 ), find_guarded_bits_fx( n * n ) ); exp = sub( 31, d_q ); d_fx = Sqrt32( d_fx, &exp ); diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index ab043fc0f995e8a568b1197c2a2ca31c9b78a632..5e5d3c5bdca0188ca82a747cfa18ef8b0931f97d 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -42,156 +42,166 @@ #include "stat_com.h" #include "ivas_stat_enc.h" #include "ivas_stat_dec.h" +#include "ivas_stat_rend.h" #include "ivas_stat_com.h" #include "ivas_error_utils.h" +/* clang-format off */ + +/*----------------------------------------------------------------------------------* + * General IVAS prototypes + *----------------------------------------------------------------------------------*/ + ivas_error ivas_masa_dec_open_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ ); void ivas_masa_dec_close_fx( - MASA_DECODER_HANDLE *hMasa /* i/o: MASA metadata structure */ -); - -ivas_error create_evs_sce_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const Word16 sce_id, /* i : SCE # identifier */ - const Word32 element_brate /* i : element bitrate */ + MASA_DECODER_HANDLE *hMasa /* i/o: MASA metadata structure */ ); void destroy_sce_enc_fx( - SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ - Flag is_evs /* i : Flag to indicate EVS encoder */ + SCE_ENC_HANDLE hSCE /* i/o: SCE encoder structure */ ); void generate_gridEq_fx( - SPHERICAL_GRID_DATA *data /* o : data structure for grid */ + SPHERICAL_GRID_DATA *data /* o : data structure for grid */ ); void masa_sample_rate_band_correction_fx( - MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ - Word16 *band_mapping, /* i/o: Band mapping used and modified */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ - const UWord8 maxBand, /* i : max band */ - UWord8 is_encoder, /* i : signals if called at encoder */ - MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ + MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ + Word16 *band_mapping, /* i/o: Band mapping used and modified */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ + const UWord8 maxBand, /* i : max band */ + UWord8 is_encoder, /* i : signals if called at encoder */ + MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ ); void ivas_masa_set_elements_fx( - const Word32 ivas_total_brate, /* i : codec total bitrate */ - const Word16 mc_mode, /* i : MC format mode */ - const Word16 nchan_transport, /* i : number of MASA input/transport channels */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - Word16 *element_mode, /* o : element mode */ - Word16 *nSCE, /* o : number of SCEs */ - Word16 *nCPE, /* o : number of CPEs */ - const Word16 ivas_format, /* i : IVAS format */ - const ISM_MODE ism_mode, /* i : ISM mode */ - const Word32 ism_total_brate /* i : initial ISM total bitrate */ + const Word32 ivas_total_brate, /* i : codec total bitrate */ + const Word16 mc_mode, /* i : MC format mode */ + const Word16 nchan_transport, /* i : number of MASA input/transport channels */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + Word16 *element_mode, /* o : element mode */ + Word16 *nSCE, /* o : number of SCEs */ + Word16 *nCPE, /* o : number of CPEs */ + const Word16 ivas_format, /* i : IVAS format */ + const ISM_MODE ism_mode, /* i : ISM mode */ + const Word32 ism_total_brate /* i : initial ISM total bitrate */ ); void ivas_masa_set_coding_config_fx( - MASA_CODEC_CONFIG *config, /* i/o: MASA coding config structure */ - Word16 *band_mapping, /* o : Band mapping used */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 nchan_transport, /* i : number of transport channels (mono/stereo) */ - const UWord8 isMcMasa /* i : toggle for selecting mcMASA specific config */ + MASA_CODEC_CONFIG *config, /* i/o: MASA coding config structure */ + Word16 *band_mapping, /* o : Band mapping used */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 nchan_transport, /* i : number of transport channels (mono/stereo) */ + const UWord8 isMcMasa /* i : toggle for selecting mcMASA specific config */ ); void ivas_masa_prerender_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - Word32 *output_fx[], /* i/o: synthesized core-coder transport channels */ - Word16 *q_shift, /* o : specifies how much the Q-factor of output has changed by. */ - const Word16 output_frame, /* i : output frame length per channel */ - const Word16 nchan_remapped /* i : number of transports used in core */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Word32 *output_fx[], /* i/o: synthesized core-coder transport channels */ + Word16 *q_shift, /* o : specifies how much the Q-factor of output has changed by. */ + const Word16 output_frame, /* i : output frame length per channel */ + const Word16 nchan_remapped /* i : number of transports used in core */ ); ivas_error ivas_masa_dec_reconfigure_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - UWord16 *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ - Word16 *data /* o : output synthesis signal */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void reconstruct_ism_ratios_fx( - Word16 *ratio_ism_idx, /* i : index vector Q0 */ - const Word16 nchan_ism, /* i : number of components/objects Q0 */ - const Word16 step, /* i : quantization step Q15 */ - Word32 *q_energy_ratio_ism /* o : reconstructed ISM values Q30 */ + Word16 *ratio_ism_idx, /* i : index vector Q0 */ + const Word16 nchan_ism, /* i : number of components/objects Q0 */ + const Word32 step, /* i : quantization step Q31 */ + Word32 *q_energy_ratio_ism /* o : reconstructed ISM values Q30 */ ); void distribute_evenly_ism_fx( - Word16 *idx, /* o : index values */ - const Word16 K, /* i : sum of indexes */ - const Word16 nchan_ism /* i : number of objects */ + Word16 *idx, /* o : index values */ + const Word16 K, /* i : sum of indexes */ + const Word16 nchan_ism /* i : number of objects */ ); Word16 valid_ratio_index_fx( - Word16 index, /* i : index to be checked */ - const Word16 K, /* i : L1 norm to check against */ - const Word16 len /* i : vector length */ + Word16 index, /* i : index to be checked */ + const Word16 K, /* i : L1 norm to check against */ + const Word16 len /* i : vector length */ ); UWord16 index_theta_phi_16_fx( - Word32 *p_theta, /* i/o: input elevation to be indexed Q22 */ - Word32 *p_phi, /* i/o: input azimuth to be indexed Q22 */ - const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ + Word32 *p_theta, /* i/o: input elevation to be indexed Q22 */ + Word32 *p_phi, /* i/o: input azimuth to be indexed Q22 */ + const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ ); ivas_error ivas_masa_decode_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - Decoder_State *st, /* i/o: decoder state structure */ - Word16 *nb_bits_read /* o : number of bits read */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + Decoder_State *st, /* i/o: decoder state structure */ + Word16 *nb_bits_read /* o : number of bits read */ ); void ivas_omasa_rearrange_channels_fx( - Word32 *output[], /* o : output synthesis signal */ - const Word16 nchan_transport_ism, /* o : number of ISM TCs */ - const Word16 output_frame /* i : output frame length per channel */ + Word32 *output[], /* o : output synthesis signal */ + const Word16 nchan_transport_ism, /* o : number of ISM TCs */ + const Word16 output_frame /* i : output frame length per channel */ +); + +ivas_error ivas_omasa_combine_separate_ism_with_masa_open_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_omasa_combine_separate_ism_with_masa_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Word32 *output[], /* o : output synthesis signal */ + Word16 *output_q, /* i/o: output Q value */ + const Word16 nchan_ism, /* i : number of ISMs */ + const Word16 output_frame /* i : output frame length per channel */ +); + +ivas_error ivas_omasa_objects_delay_open_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_omasa_render_objects_from_mix_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Word32 *output[], /* o : output synthesis signal */ + const Word16 nchan_ism, /* i : number of ISMs */ + const Word16 output_frame, /* i : output frame length per channel */ + Word16 *output_q /* i/o: output Q value */ +); + +void ivas_omasa_gain_masa_tc_fx( + Word32 *output_fx[], /* i/o: output synthesis signal */ + const Word16 gainMasa_fx, /* i : gain for MASA transport channels */ + const Word16 nchan_transport_ism, /* i : number of ISM TCs */ + const Word16 output_frame /* i : output frame length per channel */ ); ivas_error ivas_omasa_ism_metadata_dec_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word32 ism_total_brate, /* i : ISM total bitrate */ - Word16 *nchan_ism, /* o : number of ISM separated channels */ - Word16 *nchan_transport_ism, /* o : number of ISM TCs */ - const Word16 dirac_bs_md_write_idx, /* i : DirAC bitstream write index */ - Word16 nb_bits_metadata[] /* o : number of ISM metadata bits */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word32 ism_total_brate, /* i : ISM total bitrate */ + Word16 *nchan_ism, /* o : number of ISM separated channels */ + Word16 *nchan_transport_ism, /* o : number of ISM TCs */ + const Word16 dirac_bs_md_write_idx, /* i : DirAC bitstream write index */ + Word16 nb_bits_metadata[] /* o : number of ISM metadata bits */ ); + ivas_error ivas_omasa_dec_config_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - UWord16 *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ Word16 *num_src, - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS], - Word16 *data /* o : output synthesis signal */ -); -ivas_error ivas_td_binaural_renderer_sf_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_fx[], /* i/o: SCE channels / Binaural synthesis */ - const Word16 n_samples_granularity /* i : granularity of the renderer/buffer */ + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS] ); void ivas_omasa_modify_masa_energy_ratios_fx( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ Word32 masa_to_total_energy_ratio_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_MAXIMUM_CODING_SUBBANDS] // Q30 ); Word32 calculate_cpe_brate_MASA_ISM_fx( - const ISM_MODE ism_mode, /* i : ism mode */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 nchan_ism /* i : number of objects */ -); - -Word16 ivas_jbm_dec_get_num_tc_channels_fx( - Decoder_Struct *st_ivas /* i : IVAS decoder handle */ -); - -ivas_error ivas_jbm_dec_tc_buffer_open_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ - const Word16 nchan_transport_jbm, /* i : number of real transport channels */ - const Word16 nchan_transport_internal, /* i : number of totally buffered channels */ - const Word16 nchan_full, /* i : number of channels to fully store */ - const Word16 n_samples_granularity /* i : granularity of the renderer/buffer */ + const ISM_MODE ism_mode, /* i : ism mode */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 nchan_ism /* i : number of objects */ ); void ivas_dct_windowing_fx( @@ -203,152 +213,160 @@ void ivas_dct_windowing_fx( const Word16 frame_len, /*Q0*/ Word32 *pOut_buf, // Q10 Word32 *pBuffer_prev, // Q10 - Word32 *pTemp_lfe ); + Word32 *pTemp_lfe +); void ivas_get_twid_factors_fx1( const Word16 length, // Q0 const Word16 **pTwid_re, // Q15 - const Word16 **pTwid_im ); + const Word16 **pTwid_im +); Word32 ivas_get_mdct_scaling_gain_fx( - const Word16 dct_len_by_2 ); + const Word16 dct_len_by_2 +); void ivas_imdct_fx( const Word32 *pIn, // Q24 Word32 *pOut, // q_out Q9 const Word16 length /*Q0*/, - Word16 *q_out ); + Word16 *q_out +); void ivas_mdct_fx( const Word32 *pIn, // q_out Word32 *pOut, // q_out const Word16 length, // Q0 - Word16 *q_out ); + Word16 *q_out +); void ivas_itda_fx( - const Word32 *re, /* i : time alised signal after IDCT Q24 */ - Word32 *pOut, /* o : time domain buffer of size 2*length */ - const Word16 length /* i : length of time alised signal buffer Q0 */ + const Word32 *re, /* i : time alised signal after IDCT Q24 */ + Word32 *pOut, /* o : time domain buffer of size 2*length */ + const Word16 length /* i : length of time alised signal buffer Q0 */ ); void ivas_tda_fx( - const Word32 *pIn, /* i : time domain buffer of size 2*length Q10*/ - Word32 *pOut, /* o : time domain buffer of size length Q10 */ - const Word16 length /* i : length of time alised signal buffer Q0*/ + const Word32 *pIn, /* i : time domain buffer of size 2*length Q10*/ + Word32 *pOut, /* o : time domain buffer of size length Q10 */ + const Word16 length /* i : length of time alised signal buffer Q0*/ ); -// ivas_agc_dec_fx.c ivas_error ivas_spar_agc_dec_open_fx( - ivas_agc_dec_state_t **hAgcDec, /* i/o: SPAR AGC decoder handle */ - const Word32 output_Fs /* i : output sampling rate */ + ivas_agc_dec_state_t **hAgcDec, /* i/o: SPAR AGC decoder handle */ + const Word32 output_Fs /* i : output sampling rate */ ); void ivas_spar_agc_dec_close_fx( - ivas_agc_dec_state_t **hAgcDec /* i/o: SPAR AGC decoder handle */ + ivas_agc_dec_state_t **hAgcDec /* i/o: SPAR AGC decoder handle */ ); void ivas_agc_dec_process_fx( - ivas_agc_dec_state_t *hAgcDec, /* i/o: AGC decoder handle */ - Word32 *pcm_in[], /* i : input audio channels */ - Word32 *pcm_out[], /* o : output audio channels */ - const Word16 n_channels, /* i : number of channels */ - const Word16 output_frame /* i : output frame length */ + ivas_agc_dec_state_t *hAgcDec, /* i/o: AGC decoder handle */ + Word32 *pcm_in[], /* i : input audio channels */ + Word32 *pcm_out[], /* o : output audio channels */ + const Word16 n_channels, /* i : number of channels */ + const Word16 output_frame /* i : output frame length */ ); void ivas_agc_read_bits_fx( - ivas_agc_dec_state_t *hAgcDec, /* i/o: AGC decoder handle */ - Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling */ - const Word16 n_channels, /* i : number of channels */ - const Word16 AGC_flag /* i : AGC on/off flag */ + ivas_agc_dec_state_t *hAgcDec, /* i/o: AGC decoder handle */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling */ + const Word16 n_channels, /* i : number of channels */ + const Word16 AGC_flag /* i : AGC on/off flag */ ); -// ivas_agc_com_fx.c void ivas_agc_initWindowFunc_fx( Word16 *pWinFunc, // o: Q15 - const Word16 length ); + const Word16 length +); void ivas_agc_calcGainParams_fx( UWord16 *absEmin, // o: Q0 UWord16 *betaE, // o: Q0 UWord16 *maxAttExp, // o: Q0 - const Word16 numCoeffs ); + const Word16 numCoeffs +); void ivas_transient_det_process_fx( - ivas_trans_det_state_t *hTranDet, /* i/o: SPAR TD handle */ - Word32 *pIn_pcm, /* i : input audio channels */ - const Word16 frame_len, /* i : frame length in samples */ - Word16 transient_det[2] /* o : transient det outputs */ + ivas_trans_det_state_t *hTranDet, /* i/o: SPAR TD handle */ + Word32 *pIn_pcm, /* i : input audio channels */ + const Word16 frame_len, /* i : frame length in samples */ + Word16 transient_det[2] /* o : transient det outputs */ ); void ivas_td_decorr_get_ducking_gains_fx( - ivas_trans_det_state_t *hTranDet, /* i/o: Transient detector handle */ + ivas_trans_det_state_t *hTranDet, /* i/o: Transient detector handle */ Word32 *pIn_pcm, Word32 *pIn_duck_gains, Word32 *pOut_duck_gains, const Word16 frame_len, - const Word16 tdet_flag ); + const Word16 tdet_flag +); -// ivas_stereo_eclvq_dec.c -void ECSQ_decode( +void ECSQ_decode_fx( ECSQ_instance *ecsq_inst, const Word16 N, - Word16 *output ); + Word16 *output +); -// bass_psfilter.c Word16 res_bpf_adapt_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo decoder handle */ - const Word32 *bpf_error_signal_8k, /* i : BPF modification signal */ - Word32 res_buf[STEREO_DFT_N_8k] /* i : residual buffer */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo decoder handle */ + const Word32 *bpf_error_signal_8k, /* i : BPF modification signal */ + Word32 res_buf[STEREO_DFT_N_8k] /* i : residual buffer */ ); -// ivas_sns_com_fx.c void sns_compute_scf_fx( Word32 spectrum[], /* i : Spectrum (Q_in) */ const PsychoacousticParameters *pPsychParams, const Word16 L_frame, Word32 *scf, /* o : Scalefactors (Q16)*/ - Word16 q ); + Word16 q +); void sns_interpolate_scalefactors_fx( - Word32 *scf_int, /* o : interpolated scalefactors for spectrum shaping q16*/ - const Word32 *scf, /* i : sns scalefactors as derived from the signal or read from the bitstream Q16*/ - Word16 encoder_side /* i : flag, if scalefactors have to be inverted */ + Word32 *scf_int, /* o : interpolated scalefactors for spectrum shaping q16*/ + const Word32 *scf, /* i : sns scalefactors as derived from the signal or read from the bitstream Q16*/ + Word16 encoder_side /* i : flag, if scalefactors have to be inverted */ ); void sns_shape_spectrum_fx( - Word32 spectrum[], /* i/o: spectrum to be shaped Input Q is q_spectrum and ouput Q is (q_spectrum-1)*/ - Word16 *q_spectrum, /* i/o: Q of spectrum */ - const PsychoacousticParameters *pPsychParams, /* i : psychoacoustic parameters used to get the frequency bands */ - const Word32 *scf_int, /* i : already interpolated SNS scalefactors */ - const Word16 q_scf_int, /* i : Q of interpolated SNS scalefactors q_scf_int*/ - const Word16 L_frame, /* i : frame length */ - Word16 *length ); - -// ivas_stereo_eclvq_com_fx.c + Word32 spectrum[], /* i/o: spectrum to be shaped Input Q is q_spectrum and ouput Q is (q_spectrum-1)*/ + Word16 *q_spectrum, /* i/o: Q of spectrum */ + const PsychoacousticParameters *pPsychParams, /* i : psychoacoustic parameters used to get the frequency bands */ + const Word32 *scf_int, /* i : already interpolated SNS scalefactors */ + const Word16 q_scf_int, /* i : Q of interpolated SNS scalefactors q_scf_int*/ + const Word16 L_frame, /* i : frame length */ + Word16 *length +); + Word32 ECSQ_dequantize_gain_fx( - const Word16 index ); + const Word16 index +); void stereo_tca_enc_fx( - CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - const Word16 input_frame /* i : length of a frame per channel */ + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const Word16 input_frame /* i : length of a frame per channel */ ); void ECSQ_dequantize_vector_fx( const Word16 *input, /*qx*/ const Word32 global_gain, /*q15*/ const Word16 N, - Word32 *output /*qx*/ ); + Word32 *output /*qx*/ +); void ECSQ_init_instance_fx( ECSQ_instance *ecsq_inst, const Word16 config_index, - void *ac_handle ); + void *ac_handle +); void decoder_tcx_invQ_fx( - Decoder_State *st, /* i/o: coder memory state */ - Word16 prm[], /* i : parameters */ - Word16 A[], /* i : coefficients NxAz[M+1] */ - Word16 Aind[], /* i : frame-independent coefficients Az[M+1] */ + Decoder_State *st, /* i/o: coder memory state */ + Word16 prm[], /* i : parameters */ + Word16 A[], /* i : coefficients NxAz[M+1] */ + Word16 Aind[], /* i : frame-independent coefficients Az[M+1] */ const Word16 L_spec, const Word16 L_frame, const Word16 L_frameTCX, @@ -356,22 +374,22 @@ void decoder_tcx_invQ_fx( Word16 *x_e, Word16 gainlpc2[], Word16 gainlpc2_e[], - Word16 xn_buf[], /* Q14 */ - Word16 *fUseTns, /* o : flag that is set if TNS data is present */ + Word16 xn_buf[], /* Q14 */ + Word16 *fUseTns, /* o : flag that is set if TNS data is present */ STnsData *tnsData, Word16 *gain_tcx, Word16 *gain_tcx_e, const Word16 **prm_sqQ1, Word16 *nf_seed, - const Word16 bfi, /* i : Bad frame indicator */ - const Word16 frame_cnt /* i : frame counter in the super frame */ + const Word16 bfi, /* i : Bad frame indicator */ + const Word16 frame_cnt /* i : frame counter in the super frame */ ); void decoder_tcx_noisefilling_fx( - Decoder_State *st, /* i/o: coder memory state */ + Decoder_State *st, /* i/o: coder memory state */ const Word32 concealment_noise[L_FRAME48k], const Word16 concealment_noise_exp, - const Word16 A[], /* i : coefficients NxAz[M+1] */ + const Word16 A[], /* i : coefficients NxAz[M+1] */ const Word16 L_frameTCX_glob, const Word16 L_spec, const Word16 L_frame, @@ -385,13 +403,13 @@ void decoder_tcx_noisefilling_fx( const Word16 gain_tcx_e, const Word16 *prm_sqQ, Word16 nf_seed, - const Word16 bfi, /* i : Bad frame indicator */ + const Word16 bfi, /* i : Bad frame indicator */ const Word16 MCT_flag, - const Word16 frame_cnt /* i : frame counter in the super frame*/ + const Word16 frame_cnt /* i : frame counter in the super frame */ ); void decoder_tcx_noiseshaping_igf_fx( - Decoder_State *st, /* i/o: coder memory state */ + Decoder_State *st, /* i/o: coder memory state */ const Word16 L_spec, const Word16 L_frame, const Word16 L_frameTCX, @@ -402,289 +420,278 @@ void decoder_tcx_noiseshaping_igf_fx( const Word16 gainlpc2_fx[], const Word16 gainlpc2_e[], Word16 *temp_concealment_method, - const Word16 bfi /* i : Bad frame indicator */ + const Word16 bfi /* i : Bad frame indicator */ ); void init_tcx_info_fx( - Decoder_State *st, /* i/o: coder memory state */ - const Word16 L_frame_glob, /* i : global frame length */ - const Word16 L_frameTCX_glob, /* i : FB global frame length */ - const Word16 frame_cnt, /* i : frame counter in the super_frame */ - const Word16 bfi, /* i : bad frame indicator */ - Word16 *tcx_offset, /* o : folding point offset relative to the end of the previous frame */ - Word16 *tcx_offsetFB, /* o : FB folding point offset relative to the end of the previous frame*/ - Word16 *L_frame, /* o : frame length */ - Word16 *L_frameTCX, /* o : TCX frame length */ - Word16 *left_rect, /* o : left part is rectangular */ - Word16 *L_spec /* o : spectrum length */ + Decoder_State *st, /* i/o: coder memory state */ + const Word16 L_frame_glob, /* i : global frame length */ + const Word16 L_frameTCX_glob, /* i : FB global frame length */ + const Word16 frame_cnt, /* i : frame counter in the super_frame */ + const Word16 bfi, /* i : bad frame indicator */ + Word16 *tcx_offset, /* o : folding point offset relative to the end of the previous frame */ + Word16 *tcx_offsetFB, /* o : FB folding point offset relative to the end of the previous frame*/ + Word16 *L_frame, /* o : frame length */ + Word16 *L_frameTCX, /* o : TCX frame length */ + Word16 *left_rect, /* o : left part is rectangular */ + Word16 *L_spec /* o : spectrum length */ ); void decoder_tcx_IGF_mono_fx( - Decoder_State *st, /* i/o: coder memory state */ - Word32 x_fx[], /* o : de-quatized coefficients */ - Word16 *x_e, /* o : de-quatized coefficients exponent */ - Word16 *x_len, /* o : de-quatized coefficients length */ - const Word16 L_frame, /* i : frame length */ - const Word16 left_rect, /* i : left part is rectangular */ - const Word16 bfi, /* i : bad frame indicator */ - const Word16 frame_cnt /* i : frame counter in the super_frame */ + Decoder_State *st, /* i/o: coder memory state */ + Word32 x_fx[], /* o : de-quatized coefficients */ + Word16 *x_e, /* o : de-quatized coefficients exponent */ + Word16 *x_len, /* o : de-quatized coefficients length */ + const Word16 L_frame, /* i : frame length */ + const Word16 left_rect, /* i : left part is rectangular */ + const Word16 bfi, /* i : bad frame indicator */ + const Word16 frame_cnt /* i : frame counter in the super_frame */ ); void decoder_tcx_IGF_stereo_fx( - Decoder_State **sts, /* i/o: coder memory states */ - STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo structure */ - Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ - Word32 *x_fx[CPE_CHANNELS][NB_DIV], /* i/o: de-quatized coefficients */ - Word16 x_e[CPE_CHANNELS][NB_DIV], /* i/o: de-quatized coefficients exponents */ - Word16 x_len[CPE_CHANNELS][NB_DIV], /* o : length of de-quantized coefficients */ - const Word16 L_frame, /* i : frame length */ - const Word16 left_rect, /* i : left part is rectangular */ - const Word16 k, /* i : Subframe index */ - const Word16 bfi, /* i : bad frame indicator */ - const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */ + Decoder_State **sts, /* i/o: coder memory states */ + STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo structure */ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + Word32 *x_fx[CPE_CHANNELS][NB_DIV], /* i/o: de-quatized coefficients */ + Word16 x_e[CPE_CHANNELS][NB_DIV], /* i/o: de-quatized coefficients exponents */ + Word16 x_len[CPE_CHANNELS][NB_DIV], /* o : length of de-quantized coefficients */ + const Word16 L_frame, /* i : frame length */ + const Word16 left_rect, /* i : left part is rectangular */ + const Word16 k, /* i : Subframe index */ + const Word16 bfi, /* i : bad frame indicator */ + const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */ ); void IGFDecReplicateTCX10State_fx( - IGF_DEC_INSTANCE_HANDLE hIGFDec /* i/o: instance handle of IGF Decoder */ + IGF_DEC_INSTANCE_HANDLE hIGFDec /* i/o: instance handle of IGF Decoder */ ); -Word16 get_igf_startline( - Decoder_State *st, /* i : decoder state */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 L_frameTCX /* i : full band frame length */ +Word16 get_igf_startline_fx( + Decoder_State *st, /* i : decoder state */ + const Word16 L_frame, /* i : length of the frame */ + const Word16 L_frameTCX /* i : full band frame length */ ); void stereo_dft_dec_reset_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: decoder DFT stereo handle */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: decoder DFT stereo handle */ ); void stereo_dft_dec_update_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word16 output_frame, /* i : output frame length */ - const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const Word16 output_frame, /* i : output frame length */ + const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ ); + void stereo_dft_res_ecu_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ - Word32 *pDFT_RES, /* i/o: residual signal */ - Word32 *const DFT_PRED_RES, /* i/o: residual prediction signal */ - const Word16 k, /* i : Subframe index */ - const Word16 output_frame, /* i : Output frame length */ - const Word16 prev_bfi, /* i : Previous BFI */ - const Word32 dmx_nrg, /* i : Down-mix energy */ - Word16 *num_plocs, /* i/o: Number of peak locations */ - Word16 *plocs, /* i/o: Peak locations (bin) */ - Word32 *plocsi, /* i/o: Peak locations (fractional) */ - Word32 *input_mem /* o : Residual DFT buffer input mem */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ + Word32 *pDFT_RES, /* i/o: residual signal */ + Word32 *const DFT_PRED_RES, /* i/o: residual prediction signal */ + const Word16 k, /* i : Subframe index */ + const Word16 output_frame, /* i : Output frame length */ + const Word16 prev_bfi, /* i : Previous BFI */ + const Word32 dmx_nrg, /* i : Down-mix energy */ + Word16 *num_plocs, /* i/o: Number of peak locations */ + Word16 *plocs, /* i/o: Peak locations (bin) */ + Word32 *plocsi, /* i/o: Peak locations (fractional) */ + Word32 *input_mem /* o : Residual DFT buffer input mem */ ); + void stereo_dft_res_subst_spec_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ - Word32 *pDFT_RES, /* i/o: residual signal */ - const Word32 *const DFT_PRED_RES, /* i : residual prediction signal */ - const Word16 time_offs, /* i : Time offset for phase adjustment*/ - const Word16 L_res, /* i : bandwidth of residual signal */ - const Word16 L_ana, /* i : Length of FFT analysis */ - const Word16 k, /* i : Subframe index */ - Word16 *num_plocs, /* i/o: Number of peak locations */ - Word16 *plocs, /* i/o: Peak locations (bin) */ - Word32 *plocsi, /* i/o: Peak locations (fractional) */ - const Word16 analysis_flag /* i : Flag for running peak analysis */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ + Word32 *pDFT_RES, /* i/o: residual signal */ + const Word32 *const DFT_PRED_RES, /* i : residual prediction signal */ + const Word16 time_offs, /* i : Time offset for phase adjustment */ + const Word16 L_res, /* i : bandwidth of residual signal */ + const Word16 L_ana, /* i : Length of FFT analysis */ + const Word16 k, /* i : Subframe index */ + Word16 *num_plocs, /* i/o: Number of peak locations */ + Word16 *plocs, /* i/o: Peak locations (bin) */ + Word32 *plocsi, /* i/o: Peak locations (fractional) */ + const Word16 analysis_flag /* i : Flag for running peak analysis */ ); + void stereo_dft_res_ecu_burst_att_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ - Word32 *pDFT_RES, /* i/o: residual signal /att. residual */ - const Word32 dmx_nrg, /* i : dmx energy of current frame */ - const Word16 L_res, /* i : Bandwidth of residual */ - const Word16 L_ana /* i : Length of FFT analysis */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ + Word32 *pDFT_RES, /* i/o: residual signal /att. residual */ + const Word32 dmx_nrg, /* i : dmx energy of current frame */ + const Word16 L_res, /* i : Bandwidth of residual */ + const Word16 L_ana /* i : Length of FFT analysis */ ); void stereo_dft_generate_res_pred_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word16 samp_ratio, /* i : sampling ratio */ - Word32 *pDFT_DMX, /* i : downmix signal */ - Word32 *DFT_PRED_RES, /* o : residual prediction signal */ - Word32 *pPredGain, /* i : residual prediction gains */ - const Word16 k, /* i : subframe index */ - Word32 *ap_filt_DMX, /* i : enhanced stereo filling signal */ - Word16 *stop, /* o : last FD stereo filling bin */ - const Word16 bfi /* i : BFI flag */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const Word16 samp_ratio, /* i : sampling ratio */ + Word32 *pDFT_DMX, /* i : downmix signal */ + Word32 *DFT_PRED_RES, /* o : residual prediction signal */ + Word32 *pPredGain, /* i : residual prediction gains */ + const Word16 k, /* i : subframe index */ + Word32 *ap_filt_DMX, /* i : enhanced stereo filling signal */ + Word16 *stop, /* o : last FD stereo filling bin */ + const Word16 bfi /* i : BFI flag */ ); void stereo_dft_dec_analyze_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const Word32 *input_fx, /* i : input signal */ - Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ - const Word16 chan, /* i : channel number */ - const Word16 input_frame, /* i : input frame size */ - const Word16 output_frame, /* i : output frame size */ - const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : signal type to analyze */ - const Word16 k_offset, /* i : offset of DFT */ - const Word16 delay, /* i : delay in samples for input signal */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const Word32 *input_fx, /* i : input signal */ + Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ + const Word16 chan, /* i : channel number */ + const Word16 input_frame, /* i : input frame size */ + const Word16 output_frame, /* i : output frame size */ + const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : signal type to analyze */ + const Word16 k_offset, /* i : offset of DFT */ + const Word16 delay, /* i : delay in samples for input signal */ Word16 *q, - Word16 *q_out_DFT ); + Word16 *q_out_DFT +); void init_basic_allpass_fx( basic_allpass_t *ap, const Word32 *gains_fx, - const Word16 *delays ); + const Word16 *delays +); void filter_with_allpass_fx( - const Word32 *sig, /* i : allpass input signal */ - Word32 *out, /* o : filtered output */ - const Word16 len, /* i : length of input */ - basic_allpass_t *ap, /* i/o: basic allpass structure */ - Word16 q_shift ); + const Word32 *sig, /* i : allpass input signal */ + Word32 *out, /* o : filtered output */ + const Word16 len, /* i : length of input */ + basic_allpass_t *ap, /* i/o: basic allpass structure */ + Word16 q_shift +); Word32 stereo_dft_dmx_swb_nrg_fx( - const Word32 *dmx_k0, /* i : first subframe spectrum */ - const Word32 *dmx_k1, /* i : second subframe spectrum */ - const Word16 frame_length, /* i : frame lanegth */ + const Word32 *dmx_k0, /* i : first subframe spectrum */ + const Word32 *dmx_k1, /* i : second subframe spectrum */ + const Word16 frame_length, /* i : frame lanegth */ const Word16 q0, - const Word16 q1 ); + const Word16 q1 +); void stereo_dft_dec_core_switching_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 output_fx[], /* i/o: synthesis @internal Fs */ - Word32 synth_fx[], /* i/o: synthesis @output Fs */ - Word32 hb_synth_fx[], /* i/o: hb synthesis */ - Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ - const Word16 output_frame, /* i : output frame length */ - const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB FOR DFT Stereo */ - const Word16 sba_dirac_stereo_dtx_flag, /* i : DTX indicator FOR SBA DirAC stereo */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 output_fx[], /* i/o: synthesis @internal Fs */ + Word32 synth_fx[], /* i/o: synthesis @output Fs */ + Word32 hb_synth_fx[], /* i/o: hb synthesis */ + Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ + const Word16 output_frame, /* i : output frame length */ + const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB FOR DFT Stereo */ + const Word16 sba_dirac_stereo_dtx_flag, /* i : DTX indicator FOR SBA DirAC stereo */ Word16 *q, - Word16 *q_DFT ); + Word16 *q_DFT +); Word16 ivas_get_hodirac_flag_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 sba_order /* i : Ambisonic (SBA) order */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 sba_order /* i : Ambisonic (SBA) order */ ); void ivas_sba_config_fx( - const Word32 sba_total_brate, /* i : SBA total bitrate */ - Word16 sba_order, /* i : Ambisonic (SBA) order */ - Word16 nb_channels, /* i : Number of ambisonic channels */ - Word16 *nchan_transport, /* o : number of transport channels */ - const Word16 sba_planar, /* i : SBA Planar flag */ - Word16 *nSCE, /* o : number of SCEs */ - Word16 *nCPE, /* o : number of CPEs */ - Word16 *element_mode /* o : element mode of the core coder */ + const Word32 sba_total_brate, /* i : SBA total bitrate */ + Word16 sba_order, /* i : Ambisonic (SBA) order */ + Word16 nb_channels, /* i : Number of ambisonic channels */ + Word16 *nchan_transport, /* o : number of transport channels */ + const Word16 sba_planar, /* i : SBA Planar flag */ + Word16 *nSCE, /* o : number of SCEs */ + Word16 *nCPE, /* o : number of CPEs */ + Word16 *element_mode /* o : element mode of the core coder */ ); Word16 ivas_get_bits_to_encode( - Word32 val ); + Word32 val +); Word16 ivas_get_spar_table_idx_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 sba_order, /* i : Ambisonic (SBA) order */ - const Word16 bwidth, /* i : audio bandwidth */ - Word16 *bitlen, /* o : number of bits */ - Word16 *ind /* o : indice */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word16 bwidth, /* i : audio bandwidth */ + Word16 *bitlen, /* o : number of bits */ + Word16 *ind /* o : indice */ ); Word16 ivas_get_sba_num_TCs_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 sba_order /* i : Ambisonic (SBA) order */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 sba_order /* i : Ambisonic (SBA) order */ ); Word16 ivas_sba_get_nchan_fx( - const Word16 sba_order, /* i : Ambisonic (SBA) order */ - const Word16 sba_planar /* i : SBA planar flag */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word16 sba_planar /* i : SBA planar flag */ ); void ivas_dirac_dec_set_md_map_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 nCldfbTs /* i : number of CLDFB time slots */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 nCldfbTs /* i : number of CLDFB time slots */ ); void ivas_jbm_dec_get_adapted_subframes_fx( - const Word16 nCldfbTs, /* i : number of time slots in the current frame */ - Word16 *subframe_nbslots, /* i/o: subframe grid */ - Word16 *nb_subframes /* i/o: number of subframes in the frame */ -); - -void ivas_jbm_dec_copy_tc_no_tsm_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle Q0 */ - Word32 *tc_fx[], /* i : transport channels Q11 */ - const Word16 output_frame /* i : output frame size Q0 */ -); - -void ivas_ism_param_dec_tc_gain_ajust_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nSamples, /* i : number of samples to be compensate */ - const UWord16 nFadeLength, /* i : length of the crossfade in samples */ - Word32 *transport_channels_f[], /* i : synthesized core-coder transport channels/DirAC output Q_tc*/ - Word16 *Q_tc /* i/o : Q of input tc buffer */ + const Word16 nCldfbTs, /* i : number of time slots in the current frame */ + Word16 *subframe_nbslots, /* i/o: subframe grid */ + Word16 *nb_subframes /* i/o: number of subframes in the frame */ ); /*! r: number of bits read */ Word16 read_GR0( - const UWord16 *bit_stream, /* i : bitstream to be read */ - Word16 *ind, /* o : parameters read */ - const Word16 len /* i : number of params to be read */ + const UWord16 *bit_stream, /* i : bitstream to be read */ + Word16 *ind, /* o : parameters read */ + const Word16 len /* i : number of params to be read */ ); /*! r: read value */ Word16 get_value( - const UWord16 *bit_stream, /* i : bitstream */ - const Word16 nbits /* i : number of bits to be read */ + const UWord16 *bit_stream, /* i : bitstream */ + const Word16 nbits /* i : number of bits to be read */ ); /*! r: number of bits read */ Word16 read_BS_GR( - const UWord16 *bit_stream, /* i : bitstream to be read */ - const Word16 nb, /* i : starting point in bitstream */ - Word16 *ind1, /* o : data array read */ - const Word16 len, /* i : number of params to be read */ - Word16 *GR_ord /* o : GR order to be used */ + const UWord16 *bit_stream, /* i : bitstream to be read */ + const Word16 nb, /* i : starting point in bitstream */ + Word16 *ind1, /* o : data array read */ + const Word16 len, /* i : number of params to be read */ + Word16 *GR_ord /* o : GR order to be used */ ); /*! r: number of bits read */ Word16 read_BS_adapt_GR_sg( - const UWord16 *bit_stream, /* i : bitstream to be read */ - const Word16 nb, /* i : starting position in bitstream */ - Word16 *ind1, /* o : decoded side gain values */ - const Word16 len, /* i : number of params to be read */ - Word16 *GR_ord, /* o : GR order used (read from bitstream)*/ - const Word16 *map0 /* i : initial map */ + const UWord16 *bit_stream, /* i : bitstream to be read */ + const Word16 nb, /* i : starting position in bitstream */ + Word16 *ind1, /* o : decoded side gain values */ + const Word16 len, /* i : number of params to be read */ + Word16 *GR_ord, /* o : GR order used (read from bitstream) */ + const Word16 *map0 /* i : initial map */ ); /*! r: number of bits read */ Word16 read_itd( - Decoder_State *st, /* i : Decoder state */ - Word16 *pI /* o : ITD value */ + Decoder_State *st, /* i : Decoder state */ + Word16 *pI /* o : ITD value */ ); /*! r: number of bits read */ Word16 read_BS_adapt_GR_rpg( - const UWord16 *bit_stream, /* i : bitstream to be read */ - const Word16 nb, /* i : starting point in bitstream */ - Word16 *ind1_pred, /* o : decoded res pred gains */ - const Word16 start, /* i : starting subband */ - const Word16 total_no, /* i : number of params to be read */ - Word16 *GR_ord /* o : GR order - read */ + const UWord16 *bit_stream, /* i : bitstream to be read */ + const Word16 nb, /* i : starting point in bitstream */ + Word16 *ind1_pred, /* o : decoded res pred gains */ + const Word16 start, /* i : starting subband */ + const Word16 total_no, /* i : number of params to be read */ + Word16 *GR_ord /* o : GR order - read */ ); /*! r: number of bits read */ Word16 read_flag_EC_DFT( - const UWord16 *bit_stream, /* i : bitstream */ - Word16 *flag /* o : flag value */ + const UWord16 *bit_stream, /* i : bitstream */ + Word16 *flag /* o : flag value */ ); -void ivas_init_dec_get_num_cldfb_instances( - Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ - Word16 *numCldfbAnalyses, /* o : number of CLDFB analysis instances */ - Word16 *numCldfbSyntheses /* o : number of CLDFB synthesis instances */ -); -/*file:ivas_init_dec_fx.c*/ -void ivas_init_dec_get_num_cldfb_instances_ivas_fx( - Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ - Word16 *numCldfbAnalyses, /* o : number of needed CLDFB analysis instances */ - Word16 *numCldfbSyntheses /* o : number of needed CLDFB synthesis instances */ +void ivas_init_dec_get_num_cldfb_instances_fx( + Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + Word16 *numCldfbAnalyses, /* o : number of CLDFB analysis instances */ + Word16 *numCldfbSyntheses /* o : number of CLDFB synthesis instances */ ); Word16 masa_sq_fx( - const Word32 in, /* i : input value */ - const Word32 *threshold, /* i : partition */ - const Word16 cb_sz /* i : codebook size */ + const Word32 in, /* i : input value */ + const Word32 *threshold, /* i : partition */ + const Word16 cb_sz /* i : codebook size */ ); void ivas_compute_spar_params_enc_fx( @@ -707,7 +714,8 @@ void ivas_compute_spar_params_enc_fx( Word32 *pWscale, /*q_Wscale*/ Word16 *q_Wscale, const Word16 from_dirac, - const Word16 dyn_active_w_flag ); + const Word16 dyn_active_w_flag +); void ivas_compute_spar_params_fx( Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/ @@ -729,291 +737,263 @@ void ivas_compute_spar_params_fx( Word32 *pWscale_fx, /*q_pWscale*/ Word16 *q_pWscale, const Word16 from_dirac, - const Word16 dyn_active_w_flag ); + const Word16 dyn_active_w_flag +); ivas_error ivas_ism_metadata_dec_fx( - const Word32 ism_total_brate, /* i : ISM total bitrate */ - const Word16 nchan_ism, /* i : number of ISM channels */ - Word16 *nchan_transport, /* o : number of transport channels */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */ - const Word16 bfi, /* i : bfi flag */ - Word16 nb_bits_metadata[], /* o : number of metadata bits */ - ISM_MODE ism_mode, /* i : ISM mode */ - ISM_DTX_DATA_DEC hISMDTX, /* i/o: ISM DTX structure */ - const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */ - Word16 *ism_extmeta_active, /* i/o: Extended metadata active in renderer */ - Word16 *ism_extmeta_cnt, /* i/o: Number of change frames observed */ - DEC_CORE_HANDLE st0 /* i : core-coder handle */ + const Word32 ism_total_brate, /* i : ISM total bitrate */ + const Word16 nchan_ism, /* i : number of ISM channels */ + Word16 *nchan_transport, /* o : number of transport channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */ + const Word16 bfi, /* i : bfi flag */ + Word16 nb_bits_metadata[], /* o : number of metadata bits */ + ISM_MODE ism_mode, /* i : ISM mode */ + ISM_DTX_DATA_DEC hISMDTX, /* i/o: ISM DTX structure */ + const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */ + Word16 *ism_extmeta_active, /* i/o: Extended metadata active in renderer */ + Word16 *ism_extmeta_cnt, /* i/o: Number of change frames observed */ + DEC_CORE_HANDLE st0 /* i : core-coder handle */ ); void ivas_get_ism_sid_quan_bitbudget_fx( - const Word16 nchan_ism, /* i : number of objects */ - Word16 *nBits_azimuth, /* o : number of Q bits for azimuth */ - Word16 *nBits_elevation, /* o : number of Q bits for elevation */ - Word32 *q_step_fx, /* o : quantization step Q22*/ - Word32 *q_step_border_fx, /* o : quantization step at the border Q22*/ - Word16 *nBits_coh, /* o : number of Q bits for coherence */ - Word16 *nBits_sce_id /* o : number of Q bits for sce_id_dtx */ + const Word16 nchan_ism, /* i : number of objects */ + Word16 *nBits_azimuth, /* o : number of Q bits for azimuth */ + Word16 *nBits_elevation, /* o : number of Q bits for elevation */ + Word32 *q_step_fx, /* o : quantization step Q22*/ + Word32 *q_step_border_fx, /* o : quantization step at the border Q22*/ + Word16 *nBits_coh, /* o : number of Q bits for coherence */ + Word16 *nBits_sce_id /* o : number of Q bits for sce_id_dtx */ ); void ivas_ism_metadata_sid_dec_fx( - SCE_DEC_HANDLE hSCE[MAX_SCE], /* i/o: SCE decoder structure */ - const Word32 ism_total_brate, /* i : ISM total bitrate */ - const Word16 bfi, /* i : bfi flag */ - const Word16 nchan_ism, /* i : number of objects */ - const Word16 nchan_transport, /* i : number of transport channels*/ - const ISM_MODE ism_mode, /* i : ISM mode */ - Word16 *flag_noisy_speech, /* o : noisy speech flag */ - Word16 *sce_id_dtx, /* o : SCE DTX ID */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - Word16 nb_bits_metadata[] /* o : number of metadata bits */ -); - -// ivas_sce_dec_fx.c + SCE_DEC_HANDLE hSCE[MAX_SCE], /* i/o: SCE decoder structure */ + const Word32 ism_total_brate, /* i : ISM total bitrate */ + const Word16 bfi, /* i : bfi flag */ + const Word16 nchan_ism, /* i : number of objects */ + const Word16 nchan_transport, /* i : number of transport channels */ + const ISM_MODE ism_mode, /* i : ISM mode */ + Word16 *flag_noisy_speech, /* o : noisy speech flag */ + Word16 *sce_id_dtx, /* o : SCE DTX ID */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + Word16 nb_bits_metadata[] /* o : number of metadata bits */ +); + ivas_error create_sce_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 cpe_id, /* i : SCE # identifier */ - const Word32 element_brate /* i : element bitrate */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 cpe_id, /* i : SCE # identifier */ + const Word32 element_brate /* i : element bitrate */ ); void destroy_sce_dec( - SCE_DEC_HANDLE hSCE /* i/o: SCE decoder structure */ + SCE_DEC_HANDLE hSCE /* i/o: SCE decoder structure */ ); void destroy_core_enc_fx( - ENC_CORE_HANDLE hCoreCoder /* i/o: core encoder structure */ -); - -void destroy_evs_core_enc_fx( - ENC_CORE_HANDLE hCoreCoder /* i/o: core encoder structure */ + ENC_CORE_HANDLE hCoreCoder /* i/o: core encoder structure */ ); ivas_error ivas_sce_dec_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 sce_id, /* i : SCE # identifier */ - Word32 *output[1], /* o : output synthesis signal */ - const Word16 output_frame, /* i : output frame length per channel */ - const Word16 nb_bits_metadata /* i : number of metadata bits */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 sce_id, /* i : SCE # identifier */ + Word32 *output[1], /* o : output synthesis signal */ + const Word16 output_frame, /* i : output frame length per channel */ + const Word16 nb_bits_metadata /* i : number of metadata bits */ ); -// ivas_cpe_dec_fx.c ivas_error create_cpe_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 cpe_id, /* i : CPE # identifier */ - const Word32 element_brate /* i : element bitrate */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 cpe_id, /* i : CPE # identifier */ + const Word32 element_brate /* i : element bitrate */ ); void destroy_cpe_dec( - CPE_DEC_HANDLE hCPE /* i/o: CPE decoder structure */ + CPE_DEC_HANDLE hCPE /* i/o: CPE decoder structure */ ); ivas_error ivas_cpe_dec_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 cpe_id, /* i : CPE # identifier */ - Word32 *output[CPE_CHANNELS], /* o : output synthesis signal */ - const Word16 output_frame, /* i : output frame length per channel */ - const Word16 nb_bits_metadata /* i : number of metadata bits */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 cpe_id, /* i : CPE # identifier */ + Word32 *output[CPE_CHANNELS], /* o : output synthesis signal */ + const Word16 output_frame, /* i : output frame length per channel */ + const Word16 nb_bits_metadata /* i : number of metadata bits */ ); void ivas_post_proc_fx( - SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const Word16 n, /* i : channel number */ - Word32 synth[], /* i/o: output synthesis signal */ - Word32 *output[CPE_CHANNELS], /* i/o: output synthesis signal */ - const Word16 output_frame, /* i : output frame length */ - const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ - Word16 output_q ); - -// ivas_lfe_dec_fx.c - -void ivas_lfe_dec_close_fx( - LFE_DEC_HANDLE *hLFE /* i/o: LFE encoder handle */ + SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const Word16 n, /* i : channel number */ + Word32 synth[], /* i/o: output synthesis signal */ + Word32 *output[CPE_CHANNELS], /* i/o: output synthesis signal */ + const Word16 output_frame, /* i : output frame length */ + const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + Word16 output_q ); ivas_error ivas_create_lfe_dec_fx( - LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ - const Word32 output_Fs, /* i : output sampling rate */ - const Word32 binauralization_delay_ns /* i : additional LFE delay to sync with binaural renderer */ + LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word32 delay_ns /* i : additional LFE delay to sync other channel outputs */ ); void ivas_lfe_dec_fx( - LFE_DEC_HANDLE hLFE, /* i/o: LFE decoder handle */ - Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ - const Word16 output_frame, /* i : output frame length per channel */ - const Word16 bfi, /* i : BFI flag */ - Word32 output_lfe_ch[] /* o : output LFE synthesis */ + LFE_DEC_HANDLE hLFE, /* i/o: LFE decoder handle */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + const Word16 output_frame, /* i : output frame length per channel */ + const Word16 bfi, /* i : BFI flag */ + Word32 output_lfe_ch[] /* o : output LFE synthesis */ ); void ivas_lfe_tdplc_fx( - LFE_DEC_HANDLE hLFE, /* i/o: LFE decoder handle */ - const Word32 *prevsynth, /* i : previous frame synthesis */ - Word32 *ytda, /* o : output time-domain buffer */ - const Word16 output_frame /* i : output frame length */ + LFE_DEC_HANDLE hLFE, /* i/o: LFE decoder handle */ + const Word32 *prevsynth, /* i : previous frame synthesis */ + Word32 *ytda, /* o : output time-domain buffer */ + const Word16 output_frame /* i : output frame length */ ); void ivas_lfe_dec_close_fx( LFE_DEC_HANDLE *hLFE /* i/o: LFE decoder handle */ ); - void td_stereo_param_updt_fx( - const Word16 lsp_old_PCh_fx[], /* i : primary channel old LSPs Q15 */ - const Word16 lsf_old_PCh_fx[], /* i : primary channel old LSFs Qlog2(2.56) */ - const Word16 pitch_buf_PCh_fx[], /* i : primary channel pitch buffer Q6 */ - Word16 tdm_lspQ_PCh_fx[], /* o : Q LSPs for primary channel Q15 */ - Word16 tdm_lsfQ_PCh_fx[], /* o : Q LSFs for primary channel Qlog2(2.56) */ - Word16 tdm_Pri_pitch_buf_fx[], /* o : pitch values for primary channel Q6 */ - const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ - const Word16 tdm_use_IAWB_Ave_lpc /* i : flag to indicate the usage of mean inactive LP coefficients */ + const Word16 lsp_old_PCh_fx[], /* i : primary channel old LSPs Q15 */ + const Word16 lsf_old_PCh_fx[], /* i : primary channel old LSFs Qlog2(2.56) */ + const Word16 pitch_buf_PCh_fx[], /* i : primary channel pitch buffer Q6 */ + Word16 tdm_lsfQ_PCh_fx[], /* o : Q LSFs for primary channel Qlog2(2.56) */ + Word16 tdm_Pri_pitch_buf_fx[], /* o : pitch values for primary channel Q6 */ + const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ + const Word16 tdm_use_IAWB_Ave_lpc /* i : flag to indicate the usage of mean inactive LP coefficients */ ); void updt_enc_common_ivas_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 Q_new /* i : CUrrent frame scaling */ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 Q_new /* i : CUrrent frame scaling */ ); - void updateBuffersForDmxMdctStereo_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ - const Word16 output_frame, /* i : output frame length */ - Word32 output0_fx[], /* i/o: decoder output */ - Word32 output1_fx[], /* i/o: decoder output */ - Word16 synth_fx[CPE_CHANNELS][L_FRAME48k] /* i/o: decoder synthesis */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ + const Word16 output_frame, /* i : output frame length */ + Word32 output0_fx[], /* i/o: decoder output */ + Word32 output1_fx[], /* i/o: decoder output */ + Word16 synth_fx[CPE_CHANNELS][L_FRAME48k] /* i/o: decoder synthesis */ ); void stereo_cng_compute_PScorr_fx( - Word32 output_fx0[], /* i : Output signal */ - Word32 output_fx1[], /* i : Output signal */ + Word32 output_fx0[], /* i : Output signal */ + Word32 output_fx1[], /* i : Output signal */ Word16 *output_Q, - Word32 *c_PS_LT_fx, /* i/o: Correlation */ + Word32 *c_PS_LT_fx, /* i/o: Correlation */ Word16 Q_c_PS_LT_fx, - const Word16 L_frame_0, /* i : L_frame channel 0 */ - const Word16 L_frame_1 /* i : L_frame channel 1 */ + const Word16 L_frame_0, /* i : L_frame channel 0 */ + const Word16 L_frame_1 /* i : L_frame channel 1 */ ); void ivas_mcmasa_setNumTransportChannels_fx( - Word16 *nchan_transport, /* o : Pointer to number of transport channels to be set */ - Word16 *element_mode, /* o : Pointer to element mode to be set */ - const Word32 ivas_total_brate /* i : Total bitrate of IVAS */ + Word16 *nchan_transport, /* o : Pointer to number of transport channels to be set */ + Word16 *element_mode, /* o : Pointer to element mode to be set */ + const Word32 ivas_total_brate /* i : Total bitrate of IVAS */ ); void ivas_mcmasa_set_separate_channel_mode_fx( - UWord8 *separateChannelEnabled, /* o : Pointer to separate channel toggle */ - Word16 *separateChannelIndex, /* o : Pointer to separate channel index */ - const Word32 ivas_total_brate /* i : Total bitrate of IVAS */ + UWord8 *separateChannelEnabled, /* o : Pointer to separate channel toggle */ + Word16 *separateChannelIndex, /* o : Pointer to separate channel index */ + const Word32 ivas_total_brate /* i : Total bitrate of IVAS */ ); void ivas_mcmasa_split_brate_fx( - const UWord8 separateChannelEnabled, /* i : Transport running in "separate channel" mode */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate available to be split */ - const Word16 nSCE, /* i : Number of SCEs in use (0 or 1) */ - const Word16 nCPE, /* i : Number of CPEs in use (0 or 1) */ - Word32 *brate_sce, /* o : Pointer to SCE element bitrate */ - Word32 *brate_cpe /* o : Pointer to CPE element bitrate */ + const UWord8 separateChannelEnabled, /* i : Transport running in "separate channel" mode */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate available to be split */ + const Word16 nSCE, /* i : Number of SCEs in use (0 or 1) */ + const Word16 nCPE, /* i : Number of CPEs in use (0 or 1) */ + Word32 *brate_sce, /* o : Pointer to SCE element bitrate */ + Word32 *brate_cpe /* o : Pointer to CPE element bitrate */ ); void update_last_metadata_fx( - const Word16 nchan_ism, /* i : number of objects */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - const Word16 updt_flag[] /* i : last metadata update flag */ -); - -ivas_error ivas_jbm_dec_tc_buffer_reconfigure_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */ - const Word16 nchan_transport_jbm, /* i : new number of real transport channels */ - const Word16 nchan_transport_internal, /* i : new number of totally buffered channels */ - const Word16 nchan_full, /* i : new number of channels to fully store */ - const Word16 n_samples_granularity /* i : new granularity of the renderer/buffer */ + const Word16 nchan_ism, /* i : number of objects */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const Word16 updt_flag[] /* i : last metadata update flag */ ); ivas_error ivas_dirac_allocate_parameters_fx( - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common data for spatial parametric rendering */ - const Word16 params_flag /* i : set of parameters flag */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common data for spatial parametric rendering*/ + const Word16 params_flag /* i : set of parameters flag */ ); Word16 configure_reqularization_factor_fx( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word32 ivas_total_brate /* i : IVAS total bitrate */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); ivas_error ivas_ism_config_fx( - const Word32 ism_total_brate, /* i : ISM total bitrate */ - const Word16 nchan_transport, /* i : number of transport channels */ - const Word16 nchan_ism, /* i : number of objects */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - const Word16 ism_extended_metadata_flag, /* i : extended metadata flag */ - const Word16 null_metadata_flag[MAX_NUM_OBJECTS], /* i : NULL MD flag */ - const Word16 ism_imp[], /* i : ISM importance flags */ - Word32 element_brate[], /* o : element bitrate per object */ - Word32 total_brate[], /* o : total bitrate per object */ - Word16 nb_bits_metadata[], /* i/o: number of metadata bits */ - const Word16 combined_format_flag /* i : flag indicating combined format */ + const Word32 ism_total_brate, /* i : ISM total bitrate */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 nchan_ism, /* i : number of objects */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const Word16 ism_extended_metadata_flag, /* i : extended metadata flag */ + const Word16 null_metadata_flag[MAX_NUM_OBJECTS], /* i : NULL MD flag */ + const Word16 ism_imp[], /* i : ISM importance flags */ + Word32 element_brate[], /* o : element bitrate per object */ + Word32 total_brate[], /* o : total bitrate per object */ + Word16 nb_bits_metadata[], /* i/o: number of metadata bits */ + const Word16 combined_format_flag /* i : flag indicating combined format */ ); void stereo_dft_enc_analyze_fx( - Encoder_State **sts, /* i/o: encoder state structure */ - const Word16 n_channels, /* i : number of input channels */ - const Word16 input_frame, /* i : input frame length */ - STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: encoder MDCT stereo handle */ - Word32 DFT[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC], /* o : DFT buffers */ - Word16 DFT_e[CPE_CHANNELS], /* o : DFT buffers */ - Word16 *input_mem[CPE_CHANNELS], /* i/o: input buffer memory */ - Word16 *q_input_mem ); - -Word16 IGF_MapBitRateToIndex( - const Word32 brate, /* i : bitrate */ - const Word16 bwidth, /* i : audio bandwidth */ - const Word16 element_mode, /* i : element mode */ - const Word16 rf_mode /* i : flag to signal the RF mode */ + Encoder_State **sts, /* i/o: encoder state structure */ + const Word16 n_channels, /* i : number of input channels */ + const Word16 input_frame, /* i : input frame length */ + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: encoder MDCT stereo handle */ + Word32 DFT[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC], /* o : DFT buffers */ + Word16 DFT_e[CPE_CHANNELS], /* o : DFT buffers */ + Word16 *input_mem[CPE_CHANNELS], /* i/o: input buffer memory */ + Word16 *q_input_mem ); -Word16 ivas_jbm_dec_get_render_granularity( - const RENDERER_TYPE rendererType, /* i : renderer type */ - const IVAS_FORMAT ivas_format, /* i : ivas format */ - const MC_MODE mc_mode, /* i : MC mode */ - const Word32 output_Fs /* i : sampling rate */ +Word16 IGF_MapBitRateToIndex( + const Word32 brate, /* i : bitrate */ + const Word16 bwidth, /* i : audio bandwidth */ + const Word16 element_mode, /* i : element mode */ + const Word16 rf_mode /* i : flag to signal the RF mode */ ); -// ivas_stereo_dft_com.c void stereo_dft_config_fx( - STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ - const Word32 brate, /* i : IVAS/CPE/nominal total bitrate */ - Word16 *bits_frame_nominal, /* o : primary channel nominal bits per frame */ - Word16 *bits_frame_nominal_2 /* o : secondary channel nominal bits per frame*/ + STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ + const Word32 brate, /* i : IVAS/CPE/nominal total bitrate */ + Word16 *bits_frame_nominal, /* o : primary channel nominal bits per frame */ + Word16 *bits_frame_nominal_2 /* o : secondary channel nominal bits per frame */ ); void stereo_td_itd_mdct_stereo_fx( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder handle */ - const Word16 vad_flag_dtx[], /* i : VAD dtx flags */ - const Word16 vad_hover_flag[], /* i : VAD hangover flags */ - const Word16 input_frame /* i : frame length */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder handle */ + const Word16 vad_flag_dtx[], /* i : VAD dtx flags */ + const Word16 vad_hover_flag[], /* i : VAD hangover flags */ + const Word16 input_frame /* i : frame length */ ); void stereo_td_itd_fx( - ITD_DATA *hITD, /* i/o: ITD data structure */ - Word16 input_mem_itd_fx[CPE_CHANNELS][STEREO_DFT_OVL_MAX], /* o : ITD memory (only used in DFT Stereo) */ + ITD_DATA *hITD, /* i/o: ITD data structure */ + Word16 input_mem_itd_fx[CPE_CHANNELS][STEREO_DFT_OVL_MAX], /* o : ITD memory (only used in DFT Stereo) */ Word16 *q_input_mem_itd, - const Word16 hybrid_itd_flag, /* i : flag for hybrid TD/FD ITD processing */ - const Word16 dft_ovl, /* i : size of DFT overlap */ - Encoder_State **sts, /* i/o: Encoder state structure */ - const Word16 input_frame, /* i : input frame length */ - Word16 *input_mem[CPE_CHANNELS], /* i/o: input buffer memory */ - Word16 *q_input_mem ); + const Word16 hybrid_itd_flag, /* i : flag for hybrid TD/FD ITD processing */ + const Word16 dft_ovl, /* i : size of DFT overlap */ + Encoder_State **sts, /* i/o: Encoder state structure */ + const Word16 input_frame, /* i : input frame length */ + Word16 *input_mem[CPE_CHANNELS], /* i/o: input buffer memory */ + Word16 *q_input_mem +); void stereo_dft_unify_dmx_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ - Decoder_State *st0, /* i/o: decoder state structure */ - Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ - Word32 *input_mem, /* i/o: mem of buffer DFT analysis */ - const Word16 prev_sid_nodata /* i : Previous SID/No data indicator */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ + Decoder_State *st0, /* i/o: decoder state structure */ + Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ + Word32 *input_mem, /* i/o: mem of buffer DFT analysis */ + const Word16 prev_sid_nodata /* i : Previous SID/No data indicator */ ); void stereo_dft_enc_compute_itd_fx( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ Word32 *DFT_L, Word16 *DFT_L_e, Word32 *DFT_R, @@ -1025,468 +1005,467 @@ void stereo_dft_enc_compute_itd_fx( Word32 *bin_nrgL, Word16 *bin_nrgL_e, Word32 *bin_nrgR, - Word16 *bin_nrgR_e ); + Word16 *bin_nrgR_e +); Word16 stereo_dft_band_config_fx( - Word16 *band_limits, /* o : DFT band limits */ - const Word16 band_res, /* i : DFT band resolution */ - const Word16 NFFT, /* i : analysis/synthesis window length */ - const Word16 enc_dec /* i : flag to indicate enc vs dec */ + Word16 *band_limits, /* o : DFT band limits */ + const Word16 band_res, /* i : DFT band resolution */ + const Word16 NFFT, /* i : analysis/synthesis window length */ + const Word16 enc_dec /* i : flag to indicate enc vs dec */ ); -// ivas_ls_custom_dec.c void ivas_ls_custom_setup_fx( - IVAS_OUTPUT_SETUP_HANDLE hOutSetup, /* o : IVAS output setup handle */ - const LSSETUP_CUSTOM_STRUCT *hLsSetupCustom /* i : Custom loudspeaker setup handle */ + IVAS_OUTPUT_SETUP_HANDLE hOutSetup, /* o : IVAS output setup handle */ + const LSSETUP_CUSTOM_STRUCT *hLsSetupCustom /* i : Custom loudspeaker setup handle */ ); ivas_error ivas_ls_custom_output_init_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ ); ivas_error ivas_ls_custom_open_fx( - LSSETUP_CUSTOM_HANDLE *hLsSetupCustom /* o : Custom loudspeaker setup handle */ + LSSETUP_CUSTOM_HANDLE *hLsSetupCustom /* o : Custom loudspeaker setup handle */ ); ivas_error ivas_ism_renderer_open_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void ivas_ism_render_sf_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_fx[], /* i/o: core-coder transport channels/object output */ - const Word16 n_samples_to_render /* i : output frame length per channel */ -); - -void ivas_jbm_dec_get_adapted_linear_interpolator_fx( - const Word16 default_interp_length, /* i : default length of the (full-frame) interpolator */ - const Word16 interp_length, /* i : length of the interpolator to be created */ - Word16 *interpolator_fx /* o : the interpolator */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const RENDERER_TYPE renderer_type, /* i : active renderer type */ + Word32 *output_fx[], /* i/o: core-coder transport channels/object output */ + const Word16 n_samples_to_render /* i : output frame length per channel */ ); void ivas_omasa_separate_object_render_jbm_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const UWord16 nSamplesRendered, /* i : number of samples rendered */ - Word32 input_fx_in[][L_FRAME48k], /* i : separated object signal */ - Word32 *output_fx[], /* o : rendered time signal */ - const Word16 subframes_rendered, /* i : number of subframes rendered */ - const Word16 slots_rendered /* i : number of CLDFB slots rendered */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const UWord16 nSamplesRendered, /* i : number of samples rendered */ + Word32 input_fx_in[][L_FRAME48k], /* i : separated object signal */ + Word32 *output_fx[], /* o : rendered time signal */ + const Word16 subframes_rendered /* i : number of subframes rendered */ ); void get_panning_gain_fx( const Word16 sinAngleMapped, - Word16 *panningGains ); + Word16 *panningGains +); void ivas_ism_get_stereo_gains_fx( - const Word16 aziDeg, /* i : object azimuth */ - const Word16 eleDeg, /* i : object elevation */ - Word16 *left_gain_fx, /* o : left channel gain */ - Word16 *right_gain_fx /* o : right channel gain */ + const Word16 aziDeg, /* i : object azimuth */ + const Word16 eleDeg, /* i : object elevation */ + Word16 *left_gain_fx, /* o : left channel gain */ + Word16 *right_gain_fx /* o : right channel gain */ ); -// ivas_mct_dec_mct_fx.c void ivas_mct_dec_mct_fx( - MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ - Decoder_State **sts, /* i/o: decoder state structure */ - const Word16 nchan /* i : number of channels */ + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + const Word16 nchan /* i : number of channels */ ); void apply_MCT_dec_fx( - MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ - Decoder_State **sts, /* i/o: decoder state structure */ - Word32 *x[MCT_MAX_CHANNELS][NB_DIV], /* i/o: decoded and dequan. spect. input to MCT */ - Word16 q_x[MCT_MAX_CHANNELS] ); + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + Word32 *x[MCT_MAX_CHANNELS][NB_DIV] /* i/o: decoded and dequan. spect. input to MCT */ +); void mctStereoIGF_dec_fx( - MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ - Decoder_State **stm, /* i/o: decoder state structure */ - Word32 *x[MCT_MAX_CHANNELS][NB_DIV], /* i/o: decoded and dequantized spectrum*/ - const Word16 bfi /* i : bad frame flag */ + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + Decoder_State **stm, /* i/o: decoder state structure */ + Word32 *x[MCT_MAX_CHANNELS][NB_DIV], /* i/o: decoded and dequantized spectrum */ + const Word16 bfi /* i : bad frame flag */ ); -// ivas_stereo_mdct_stereo_dec.c void parse_stereo_from_bitstream( - STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo decoder structure */ - Decoder_State **sts, /* i/o: decoder state structure */ - const Word16 mct_on, /* i : flag mct block (1) or stereo (0)*/ - const Word16 isSBAStereoMode, /* i : flag core coding for SBA */ - Decoder_State *st0, /* i/o: decoder state structure for Bstr*/ - Word16 ms_mask[NB_DIV][MAX_SFB] /* o : bandwise MS mask */ + STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ + const Word16 isSBAStereoMode, /* i : flag core coding for SBA */ + Decoder_State *st0, /* i/o: decoder state structure for Bstr */ + Word16 ms_mask[NB_DIV][MAX_SFB] /* o : bandwise MS mask */ ); void stereo_decoder_tcx_fx( - STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: MDCT stereo decoder structure */ - Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ - Word32 *spec_r_0[NB_DIV], /* i/o: spectrum right channel */ - Word32 *spec_l[], /* i/o: spectrum left channel [NB_DIV][N] */ - Word32 *spec_r[], /* i/o: spectrum right channel [NB_DIV][N] */ - const Word16 mdct_stereo_mode[], /* i : stereo mode (FB/band wise MS, dual mono */ - const Word16 core_l, /* i : core for left channel (TCX20/TCX10) */ - const Word16 core_r, /* i : core for right channel (TCX20/TCX10) */ - const Word16 igf, /* i : flag for IGF activity */ - const Word16 L_frameTCX_l, /* i : TCX frame length of left channel */ - const Word16 L_frameTCX_r, /* i : TCX frame length of right channel */ - const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ - const Word16 last_core_l, /* i : last core for left channel */ - const Word16 last_core_r, /* i : last core for right channel */ - const Word16 tmp_plc_upmix, /* i : indicates temp upmix for PLC decision */ - Word16 *q_x_ch2, - Word16 *q_x_ch1 ); + STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: MDCT stereo decoder structure */ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + Word32 *spec_r_0[NB_DIV], /* i/o: spectrum right channel */ + Word32 *spec_l[], /* i/o: spectrum left channel [NB_DIV][N] */ + Word32 *spec_r[], /* i/o: spectrum right channel [NB_DIV][N] */ + const Word16 mdct_stereo_mode[], /* i : stereo mode (FB/band wise MS, dual mono */ + const Word16 core_l, /* i : core for left channel (TCX20/TCX10) */ + const Word16 core_r, /* i : core for right channel (TCX20/TCX10) */ + const Word16 igf, /* i : flag for IGF activity */ + const Word16 L_frameTCX_l, /* i : TCX frame length of left channel */ + const Word16 L_frameTCX_r, /* i : TCX frame length of right channel */ + const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ + const Word16 last_core_l, /* i : last core for left channel */ + const Word16 last_core_r, /* i : last core for right channel */ + const Word16 tmp_plc_upmix /* i : indicates temp upmix for PLC decision */ +); void v_multc_acc_32_16( - const Word32 x[], /* i : Input vector */ - const Word16 c, /* i : Constant */ - Word32 y[], /* o : Output vector that contains y + c*x */ - const Word16 N /* i : Vector length */ + const Word32 x[], /* i : Input vector */ + const Word16 c, /* i : Constant */ + Word32 y[], /* o : Output vector that contains y + c*x */ + const Word16 N /* i : Vector length */ ); + void v_multc_acc_32_32( - const Word32 x[], /* i : Input vector */ - const Word32 c, /* i : Constant */ - Word32 y[], /* o : Output vector that contains y + c*x */ - const Word16 N /* i : Vector length */ + const Word32 x[], /* i : Input vector */ + const Word32 c, /* i : Constant */ + Word32 y[], /* o : Output vector that contains y + c*x */ + const Word16 N /* i : Vector length */ ); void ivas_mono_stereo_downmix_mcmasa_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_f_fx[], /* i/o: synthesized core-coder transport channels/mono or stereo output */ - Word16 output_frame /* i : output frame length per channel */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word32 *output_fx[], /* i/o: synthesized core-coder transport channels/mono or stereo output */ + Word16 output_frame /* i : output frame length per channel */ ); void ivas_apply_non_diegetic_panning_fx( - Word32 *output_f_fx[], /* i/o: core-coder transport mono channel/stereo output */ - const Word16 non_diegetic_pan_gain_fx, /* i : non-diegetic panning gain */ - const Word16 output_frame /* i : output frame length per channel */ + Word32 *input_f_fx, /* i : non-diegetic object */ + Word32 *output_fx[], /* i/o: core-coder transport mono channel/stereo output */ + const Word16 non_diegetic_pan_gain_fx, /* i : non-diegetic panning gain */ + const Word16 output_frame /* i : output frame length per channel */ ); -void ivas_mono_downmix_render_passive_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_f_fx[], /* i/o: synthesized core-coder transport channels/mono output */ - const Word16 output_frame /* i : output frame length */ +void ivas_ism_mono_dmx_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word32 *output_fx[], /* i/o: synthesized core-coder transport channels/mono output */ + const Word16 output_frame /* i : output frame length */ ); + void ivas_sba_dirac_stereo_smooth_parameters_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */ - const Word16 cross_fade_start_offset, /* i : SPAR mixer delay compensation */ - const Word32 output_Fs, /* i : Fs for delay calculation */ - const Word16 num_md_sub_frames /* i : number of subframes in mixing matrix */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */ + const Word16 cross_fade_start_offset, /* i : SPAR mixer delay compensation */ + const Word32 output_Fs, /* i : Fs for delay calculation */ + const Word16 num_md_sub_frames /* i : number of subframes in mixing matrix */ ); void stereo_dft_dec_synthesize_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i : DFT buffers */ - const Word16 chan, /* i : channel number */ - Word32 output[L_FRAME48k], /* o : output synthesis signal */ - const Word16 output_frame /* i : output frame length */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i : DFT buffers */ + const Word16 chan, /* i : channel number */ + Word32 output[L_FRAME48k], /* o : output synthesis signal */ + const Word16 output_frame /* i : output frame length */ ); void stereo_dft_dec_smooth_parameters_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word16 prev_sid_nodata, /* i : Previous SID/No data indicator */ - const Word16 active_frame_counter, /* i : Active frame counter */ - const Word32 element_brate /* i : Element bitrate */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const Word16 prev_sid_nodata, /* i : Previous SID/No data indicator */ + const Word16 active_frame_counter, /* i : Active frame counter */ + const Word32 element_brate /* i : Element bitrate */ ); void stereo_dft_dec_res_fx( - CPE_DEC_HANDLE hCPE, /* i/o: decoder CPE handle */ - Word32 res_buf[STEREO_DFT_N_8k], /* i : residual buffer */ - Word16 q_res, /* i : q fact of residural buffer */ - Word32 *output /* o : output */ + CPE_DEC_HANDLE hCPE, /* i/o: decoder CPE handle */ + Word32 res_buf[STEREO_DFT_N_8k], /* i : residual buffer */ + Word16 q_res, /* i : q fact of residural buffer */ + Word32 *output /* o : output */ ); void stereo_dft_dec_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - Decoder_State *st0, /* i/o: decoder state structure */ - Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ - Word32 *input_mem, /* i/o: mem of buffer DFT analysis */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ - const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ - const Word16 sba_mono_flag, /* i : signal mono output for SBA DirAC */ - ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */ - const Word16 cross_fade_start_offset, /* i : SPAR mixer delay compensation */ - const Word32 output_Fs, /* i : Fs for delay calculation */ - const Word16 nchan_transport, /* i : number of transpor channels */ - const Word16 num_md_sub_frames /* i : number of MD subframes */ -); - -// ivas_stereo_dft_enc.c + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + Decoder_State *st0, /* i/o: decoder state structure */ + Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ + Word32 *input_mem, /* i/o: mem of buffer DFT analysis */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ + const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + const Word16 sba_mono_flag, /* i : signal mono output for SBA DirAC */ + ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */ + const Word16 cross_fade_start_offset, /* i : SPAR mixer delay compensation */ + const Word32 output_Fs, /* i : Fs for delay calculation */ + const Word16 nchan_transport, /* i : number of transpor channels */ + const Word16 num_md_sub_frames /* i : number of MD subframes */ +); + Word32 stereo_dft_enc_synthesize_fx( - STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ - Word32 *output_fx, /* o : output synthesis Q16 */ + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ + Word32 *output_fx, /* o : output synthesis Q16 */ Word16 *output_start_index, Word16 *output_end_index, - const Word16 chan, /* i : channel number */ - const Word32 input_Fs, /* i : input sampling rate */ - const Word32 output_sampling_rate, /* i : output sampling rate */ - const Word16 L_frame, /* i : frame length at internal Fs */ - Word16 *nrg_out_fx_e ); + const Word16 chan, /* i : channel number */ + const Word32 input_Fs, /* i : input sampling rate */ + const Word32 output_sampling_rate, /* i : output sampling rate */ + const Word16 L_frame, /* i : frame length at internal Fs */ + Word16 *nrg_out_fx_e +); void ivas_ls_setup_conversion_fx( - Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ - const Word16 input_chans, /* i : number of input channels to the renderer */ - const Word16 output_frame, /* i : frame length */ - Word32 *input[], /* i : LS input/output synthesis signal */ - Word32 *output[] /* i/o: LS input/output synthesis signal */ + Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + const Word16 input_chans, /* i : number of input channels to the renderer */ + const Word16 output_frame, /* i : frame length */ + Word32 *input[], /* i : LS input/output synthesis signal */ + Word32 *output[] /* i/o: LS input/output synthesis signal */ ); ivas_error ivas_ls_setup_conversion_open_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void ivas_ls_setup_conversion_close_fx( - LSSETUP_CONVERSION_HANDLE *hLsSetUpConversion /* i/o: LS converter handle */ + LSSETUP_CONVERSION_HANDLE *hLsSetUpConversion /* i/o: LS converter handle */ ); void ivas_ls_setup_conversion_process_mdct_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output[] /* i/o: output synthesis signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word32 *output[] /* i/o: output synthesis signal */ ); void ivas_lssetupconversion_process_param_mc_fx( - Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ + Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ const Word16 num_timeslots, - Word32 Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ - Word32 Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ - Word16 channel_active[MAX_CICP_CHANNELS] /* i : bitmap indicating which output channels are active */ + Word32 Cldfb_RealBuffer_InOut[MAX_LS_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ + Word32 Cldfb_ImagBuffer_InOut[MAX_LS_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ + Word16 channel_active[MAX_LS_CHANNELS] /* i : bitmap indicating which output channels are active */ ); void convert_coeffs_to_higher_res_fx( - const Word32 *in1, /* i : first subframe input */ - const Word32 *in2, /* i : second subframe input */ - Word32 *out, /* o : converted output */ - const Word16 len /* i : length of subframes */ + const Word32 *in1, /* i : first subframe input */ + const Word32 *in2, /* i : second subframe input */ + Word32 *out, /* o : converted output */ + const Word16 len /* i : length of subframes */ ); void create_IDCT_N_Matrix_fx( - Word32 *inv_matrixFloatQ, /* i/o: RAM buffer */ - const Word16 N, /* i : DCT length, number of time samples */ - const Word16 n_cols, /* i : number of dct coeffs (as DCT may be truncated) */ - const Word16 alloc_size /* i : RAM buffer size in elements */ + Word32 *inv_matrixFloatQ, /* i/o: RAM buffer */ + const Word16 N, /* i : DCT length, number of time samples */ + const Word16 n_cols, /* i : number of dct coeffs (as DCT may be truncated) */ + const Word16 alloc_size /* i : RAM buffer size in elements */ ); void extend_dctN_input_fx( - const Word32 *input, /* i : input in fdcng domain */ - const Word32 *dct_input, /* i : input in dctN(fdcng) domain */ - const Word16 in_dim, /* i : in_dim == N */ - Word32 *ext_sig, /* o : extended output in fdcng domain */ - const Word16 out_dim, /* i : output total dim */ - Word32 *matrix, /* i : idct synthesis matrix N rows, n_cols columns */ - const Word16 n_cols, /* i : number of columns == DCT truncation length */ - const DCTTYPE dcttype /* i : matrix operation type */ + const Word32 *input, /* i : input in fdcng domain */ + const Word32 *dct_input, /* i : input in dctN(fdcng) domain */ + const Word16 in_dim, /* i : in_dim == N */ + Word32 *ext_sig, /* o : extended output in fdcng domain */ + const Word16 out_dim, /* i : output total dim */ + Word32 *matrix, /* i : idct synthesis matrix N rows, n_cols columns */ + const Word16 n_cols, /* i : number of columns == DCT truncation length */ + const DCTTYPE dcttype /* i : matrix operation type */ ); void ivas_dirac_dec_get_frequency_axis_fx( Word16 *frequency_axis, /* Q0 */ const Word32 output_Fs, - const Word16 num_freq_bands ); + const Word16 num_freq_bands +); void ivas_decision_matrix_dec_fx( - Decoder_State *st, /* i/o: decoder state structure */ - Word16 *sharpFlag, /* o : formant sharpening flag */ - Word16 *core_switching_flag, /* o : ACELP->HQ switching frame flag */ - const Word32 element_brate, /* i : element bitrate */ - const Word16 nchan_out /* i : Number of output channels */ + Decoder_State *st, /* i/o: decoder state structure */ + Word16 *sharpFlag, /* o : formant sharpening flag */ + Word16 *core_switching_flag, /* o : ACELP->HQ switching frame flag */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 nchan_out /* i : Number of output channels */ ); void cmplx_matrix_square_fx( - const Word32 *realX, /* i : real part of the matrix */ - const Word32 *imagX, /* i : imaginary part of the matrix */ - const Word16 mRows, /* i : number of rows of the matrix */ - const Word16 nCols, /* i : number of columns of the matrix */ - Word32 *realZ, /* o : real part of the resulting matrix */ - Word32 *imagZ, /* o : imaginary part of the resulting matrix */ + const Word32 *realX, /* i : real part of the matrix */ + const Word32 *imagX, /* i : imaginary part of the matrix */ + const Word16 mRows, /* i : number of rows of the matrix */ + const Word16 nCols, /* i : number of columns of the matrix */ + Word32 *realZ, /* o : real part of the resulting matrix */ + Word32 *imagZ, /* o : imaginary part of the resulting matrix */ Word16 input_exp, - Word16 *output_exp ); + Word16 *output_exp +); Word16 matrix_diag_product_fx( - const Word32 *X, /* i : left hand matrix */ + const Word32 *X, /* i : left hand matrix */ Word16 X_e, - const Word16 rowsX, /* i : number of rows of the left hand matrix */ - const Word16 colsX, /* i : number of columns of the left hand matrix */ - const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ - const Word32 *Y, /* i : right hand diagonal matrix as vector containing the diagonal elements */ + const Word16 rowsX, /* i : number of rows of the left hand matrix */ + const Word16 colsX, /* i : number of columns of the left hand matrix */ + const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ + const Word32 *Y, /* i : right hand diagonal matrix as vector containing the diagonal elements */ Word16 Y_e, - const Word16 entriesY, /* i : number of entries in the diagonal */ - Word32 *Z, /* o : resulting matrix after the matrix multiplication */ - Word16 *Z_e ); + const Word16 entriesY, /* i : number of entries in the diagonal */ + Word32 *Z, /* o : resulting matrix after the matrix multiplication */ + Word16 *Z_e +); -#ifdef OPT_BASOP_ADD_v1 Word16 matrix_diag_product_fx_2( - const Word32 *X, /* i : left hand matrix Q31 - X_e*/ + const Word32 *X, /* i : left hand matrix Q31 - X_e*/ const Word16 X_e, - const Word16 rowsX, /* i : number of rows of the left hand matrix Q0*/ - const Word16 colsX, /* i : number of columns of the left hand matrix Q0*/ - const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication Q0*/ - const Word32 *Y, /* i : right hand diagonal matrix as vector containing the diagonal elements Q31 - Y_e*/ + const Word16 rowsX, /* i : number of rows of the left hand matrix Q0*/ + const Word16 colsX, /* i : number of columns of the left hand matrix Q0*/ + const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication Q0*/ + const Word32 *Y, /* i : right hand diagonal matrix as vector containing the diagonal elements Q31 - Y_e*/ const Word16 *Y_e, - const Word16 entriesY, /* i : number of entries in the diagonal Q0*/ - Word32 *Z, /* o : resulting matrix after the matrix multiplication Q31 - Z_e*/ - Word16 *Z_e ); -#endif /* OPT_BASOP_ADD_v1 */ + const Word16 entriesY, /* i : number of entries in the diagonal Q0*/ + Word32 *Z, /* o : resulting matrix after the matrix multiplication Q31 - Z_e*/ + Word16 *Z_e +); Word16 matrix_diag_product_fx_1( - const Word32 *X, /* i : left hand matrix */ + const Word32 *X, /* i : left hand matrix */ const Word16 *X_e, - const Word16 rowsX, /* i : number of rows of the left hand matrix */ - const Word16 colsX, /* i : number of columns of the left hand matrix */ - const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ - const Word32 *Y, /* i : right hand diagonal matrix as vector containing the diagonal elements */ + const Word16 rowsX, /* i : number of rows of the left hand matrix */ + const Word16 colsX, /* i : number of columns of the left hand matrix */ + const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ + const Word32 *Y, /* i : right hand diagonal matrix as vector containing the diagonal elements */ const Word16 *Y_e, - const Word16 entriesY, /* i : number of entries in the diagonal */ - Word32 *Z, /* o : resulting matrix after the matrix multiplication */ - Word16 *Z_e ); + const Word16 entriesY, /* i : number of entries in the diagonal */ + Word32 *Z, /* o : resulting matrix after the matrix multiplication */ + Word16 *Z_e +); Word16 diag_matrix_product_fx( - const Word32 *Y, /* i : left hand diagonal matrix as vector containing the diagonal elements */ + const Word32 *Y, /* i : left hand diagonal matrix as vector containing the diagonal elements */ Word16 Y_e, - const Word16 entriesY, /* i : length of the diagonal of the left hand matrix */ - const Word32 *X, /* i : right hand matrix */ + const Word16 entriesY, /* i : length of the diagonal of the left hand matrix */ + const Word32 *X, /* i : right hand matrix */ Word16 X_e, - const Word16 rowsX, /* i : number of rows of the right hand matrix */ - const Word16 colsX, /* i : number of columns of the right hand matrix */ - const Word16 transpX, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ - Word32 *Z, /* o : resulting matrix after the matrix multiplication */ - Word16 *Z_e ); + const Word16 rowsX, /* i : number of rows of the right hand matrix */ + const Word16 colsX, /* i : number of columns of the right hand matrix */ + const Word16 transpX, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ + Word32 *Z, /* o : resulting matrix after the matrix multiplication */ + Word16 *Z_e +); Word16 matrix_product_diag_fx( - const Word32 *X, /* i : left hand matrix */ + const Word32 *X, /* i : left hand matrix */ Word16 X_e, - const Word16 rowsX, /* i : number of rows of the left hand matrix */ - const Word16 colsX, /* i : number of columns of the left hand matrix */ - const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ - const Word32 *Y, /* i : right hand matrix */ + const Word16 rowsX, /* i : number of rows of the left hand matrix */ + const Word16 colsX, /* i : number of columns of the left hand matrix */ + const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ + const Word32 *Y, /* i : right hand matrix */ Word16 Y_e, - const Word16 rowsY, /* i : number of rows of the right hand matrix */ - const Word16 colsY, /* i : number of columns of the right hand matrix */ - const Word16 transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ - Word32 *Z, /* o : resulting matrix after the matrix multiplication */ - Word16 *Z_e ); + const Word16 rowsY, /* i : number of rows of the right hand matrix */ + const Word16 colsY, /* i : number of columns of the right hand matrix */ + const Word16 transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ + Word32 *Z, /* o : resulting matrix after the matrix multiplication */ + Word16 *Z_e +); -// ivas_stereo_mdct_core_dec_fx.c void stereo_mdct_core_dec_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *signal_out[CPE_CHANNELS], /* o : synthesis @internal_FS */ - Word16 signal_outFB[CPE_CHANNELS][L_FRAME48k], /* o : synthesis @output_FS */ - Word16 e_sigFB[CPE_CHANNELS] /* o : exponent of synthesis @output_FS */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *signal_out[CPE_CHANNELS], /* o : synthesis @internal_FS */ + Word16 signal_outFB[CPE_CHANNELS][L_FRAME48k], /* o : synthesis @output_FS */ + Word16 e_sigFB[CPE_CHANNELS] /* o : exponent of synthesis @output_FS */ ); -// ivas_stereo_mdct_stereo_com.c void splitAvailableBits_fx( - const Word16 total_bits, /* i : total available bits for TCX coding */ - const Word16 split_ratio, /* i : split ratio */ - const Word16 isSBAStereoMode, /* i : signal core coding for SBA */ - Word16 *bits_ch0, /* o : bits for channel 0 */ - Word16 *bits_ch1 /* o : bits for channel 1 */ + const Word16 total_bits, /* i : total available bits for TCX coding */ + const Word16 split_ratio, /* i : split ratio */ + const Word16 isSBAStereoMode, /* i : signal core coding for SBA */ + Word16 *bits_ch0, /* o : bits for channel 0 */ + Word16 *bits_ch1 /* o : bits for channel 1 */ ); void stereo_tcx_init_dec_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ - const Word16 last_element_mode /* i : element mode of previous frame */ + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ + const Word16 last_element_mode /* i : element mode of previous frame */ ); void stereo_icBWE_enc_ivas_fx( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - const Word32 shb_speech_ref_fx[], /* i : SHB speech ref channel */ - const Word16 shb_speech_ref_e, /* i : SHB speech ref channel */ - Word32 shb_speech_nonref_fx[], /* i/o: SHB speech non-ref channel */ - Word16 shb_speech_nonref_e, /* i/o: SHB speech non-ref channel */ - const Word32 *voice_factors_fx /* i : voicing factors Q31 */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const Word32 shb_speech_ref_fx[], /* i : SHB speech ref channel */ + const Word16 shb_speech_ref_e, /* i : SHB speech ref channel */ + Word32 shb_speech_nonref_fx[], /* i/o: SHB speech non-ref channel */ + Word16 shb_speech_nonref_e, /* i/o: SHB speech non-ref channel */ + const Word32 *voice_factors_fx /* i : voicing factors Q31 */ ); void initMdctStereoDecData_fx( - STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ - const Word16 igf, /* i : flag indicating IGF activity */ - const H_IGF_GRID igfGrid, /* i : IGF grid configuration */ - const Word32 element_brate, /* i : element bitrate */ - const Word16 bwidth /* i : audio bandwidth */ + STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ + const Word16 igf, /* i : flag indicating IGF activity */ + const H_IGF_GRID igfGrid, /* i : IGF grid configuration */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 bwidth /* i : audio bandwidth */ ); void stereo_tdm_downmix_ivas_fx( - STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i : TD stereo IVAS encoder structure */ - Word16 *Left_in_fx, /* Qx */ - Word16 *Right_in_fx, /* Qx */ - const Word16 input_frame, /* i : Number of samples */ - const Word16 tdm_ratio_idx, /* i : TDM ratio index */ - const Word16 tdm_SM_flag, /* i : channel combination scheme flag */ - const Word16 tdm_ratio_idx_SM /* i : TDM ratio index for SM mode */ + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i : TD stereo IVAS encoder structure */ + Word16 *Left_in_fx, /* Qx */ + Word16 *Right_in_fx, /* Qx */ + const Word16 input_frame, /* i : Number of samples */ + const Word16 tdm_ratio_idx, /* i : TDM ratio index */ + const Word16 tdm_SM_flag, /* i : channel combination scheme flag */ + const Word16 tdm_ratio_idx_SM /* i : TDM ratio index for SM mode */ ); ivas_error initMdctItdHandling_fx( - STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ - const Word32 input_Fs /* i : input sampling rate */ + STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ + const Word32 input_Fs /* i : input sampling rate */ ); void stereo_mdct_enc_destroy_fx( - STEREO_MDCT_ENC_DATA_HANDLE *hStereoMdct /* i/o: encoder MDCT stereo handle */ + STEREO_MDCT_ENC_DATA_HANDLE *hStereoMdct /* i/o: encoder MDCT stereo handle */ ); void stereo_mdct_init_bands_fx( - const Word16 L_frame, /* i : frame length */ - const Word16 tmp_tcx_mode, /* i : tcx mode (TCX10, TCX 20), -1 if transition frame */ - const Word32 element_brate, /* i : element bitrate */ - const Word16 igf, /* i : flag indicating if IGF is used */ - const H_IGF_GRID hIgfGrid, /* i : IGF grid setup */ - Word16 *sfbOffset, /* o : sfb offset table */ - Word16 *sfbCnt /* o : number of sfbs */ + const Word16 L_frame, /* i : frame length */ + const Word16 tmp_tcx_mode, /* i : tcx mode (TCX10, TCX 20), -1 if transition frame */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 igf, /* i : flag indicating if IGF is used */ + const H_IGF_GRID hIgfGrid, /* i : IGF grid setup */ + Word16 *sfbOffset, /* o : sfb offset table */ + Word16 *sfbCnt /* o : number of sfbs */ ); void stereo_mdct_init_igf_start_band_fx( - STEREO_MDCT_BAND_PARAMETERS *stbParams, /* i/o: stereo frequency band parameters */ - const Word16 transFac, /* i : transform factor */ - const Word16 bwidth, /* i : audio bandwidth */ - const Word32 element_brate /* i : element bitrate */ + STEREO_MDCT_BAND_PARAMETERS *stbParams, /* i/o: stereo frequency band parameters */ + const Word16 transFac, /* i : transform factor */ + const Word16 bwidth, /* i : audio bandwidth */ + const Word32 element_brate /* i : element bitrate */ ); void ivas_mdct_dec_side_bits_frame_channel_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word16 param_lpc[CPE_CHANNELS][NPRM_LPC_NEW], /* o : lpc_parameters */ - Word16 p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to param buffer */ - Decoder_State *st0, /* i : pointer to bitstream handle */ - Word16 nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* o : number of bits for TNS */ - Word16 param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i/o: parameters buffer */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ - const Word16 odd_channel_cpe /* i : flag cpe with odd nb of tc channels */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word16 param_lpc[CPE_CHANNELS][NPRM_LPC_NEW], /* o : lpc_parameters */ + Word16 p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to param buffer */ + Decoder_State *st0, /* i : pointer to bitstream handle */ + Word16 nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* o : number of bits for TNS */ + Word16 param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i/o: parameters buffer */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const Word16 odd_channel_cpe /* i : flag cpe with odd nb of tc channels */ ); void mdct_read_IGF_bits_fx( - Decoder_State *st, /* i/o: Decoder state handle */ - Decoder_State *st0 /* i : pointer to handle where bitstream is read */ + Decoder_State *st, /* i/o: Decoder state handle */ + Decoder_State *st0 /* i : pointer to handle where bitstream is read */ ); -void IGFDecReadData_ivas_fx( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Deccoder */ - Decoder_State *st, /**< in: | decoder state */ - const Word16 igfGridIdx, /**< in: Q0 | in case of CELP->TCX switching, use 1.25 framelength */ - const Word16 isIndepFrame /**< in: Q0 | if 1: arith dec force reset, if 0: no reset */ +void IGFDecReadData_ivas_fx( + const IGF_DEC_INSTANCE_HANDLE hInstance, /* i : instance handle of IGF Deccoder */ + Decoder_State *st, /* i : decoder state */ + const Word16 igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ + const Word16 isIndepFrame /* i : if 1: arith dec force reset, if 0: no reset */ ); void stereo_tca_init_dec_fx( - STEREO_TCA_DEC_HANDLE hStereoTCA /* i/o: Stereo TCA handle for Fixed */ + STEREO_TCA_DEC_HANDLE hStereoTCA /* i/o: Stereo TCA handle for Fixed */ ); void stereo_icBWE_init_dec_fx( - STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ + STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ ); void stereo_icBWE_decproc_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *output[CPE_CHANNELS], /* i/o: output synthesis */ - Word32 outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis */ - const Word16 last_core, /* i : last core, primary channel */ - const Word16 last_bwidth, /* i : last bandwidth */ - const Word16 output_frame /* i : frame length */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *output[CPE_CHANNELS], /* i/o: output synthesis */ + Word32 outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis */ + const Word16 last_core, /* i : last core, primary channel */ + const Word16 last_bwidth, /* i : last bandwidth */ + const Word16 output_frame /* i : frame length */ ); void add_HB_to_mono_dmx_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 output[L_FRAME48k], /* i/o: output synthesis */ - Word32 outputHB[L_FRAME48k], /* i : HB synthesis */ - const Word16 last_core, /* i : last core, primary channel */ - const Word16 output_frame /* i : frame length */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 output[L_FRAME48k], /* i/o: output synthesis */ + Word32 outputHB[L_FRAME48k], /* i : HB synthesis */ + const Word16 last_core, /* i : last core, primary channel */ + const Word16 output_frame /* i : frame length */ ); void stereo_dft_dmx_out_reset_fx( - STEREO_DFT_DMX_DATA_HANDLE hStereoDftDmx /* i/o: DFT stereo DMX decoder */ + STEREO_DFT_DMX_DATA_HANDLE hStereoDftDmx /* i/o: DFT stereo DMX decoder */ ); void ivas_get_dirac_sba_max_md_bits_fx( @@ -1495,85 +1474,84 @@ void ivas_get_dirac_sba_max_md_bits_fx( Word16 *metadata_max_bits, Word16 *qmetadata_max_bit_req, const Word16 nbands, - IVAS_FORMAT ivas_format ); + IVAS_FORMAT ivas_format +); ivas_error ivas_dirac_sba_config_fx( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - Word16 *element_mode, /* i/o: element mode of the core coder */ - Word32 sba_total_brate, /* i : SBA total bitrate */ - const Word16 sba_order, /* i : Ambisonic (SBA) order */ - const Word16 nbands /* i : number of frequency bands */ - , - IVAS_FORMAT ivas_format ); + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + Word16 *element_mode, /* i/o: element mode of the core coder */ + Word32 sba_total_brate, /* i : SBA total bitrate */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word16 nbands, /* i : number of frequency bands */ + IVAS_FORMAT ivas_format +); ivas_error ivas_dirac_config_fx( - void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ - const Word16 enc_dec /* i : encoder or decoder flag */ + void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ + const Word16 enc_dec /* i : encoder or decoder flag */ ); -void dtx_read_padding_bits_fx( - DEC_CORE_HANDLE st, - const Word16 num_bits ); - void FdCngEncodeMDCTStereoSID_fx( - CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */ + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */ ); void FdCngDecodeMDCTStereoSID_fx( - CPE_DEC_HANDLE hCPE /* i/o: CPE decoder state structure */ + CPE_DEC_HANDLE hCPE /* i/o: CPE decoder state structure */ ); void FdCngEncodeDiracMDCTStereoSID_fx( - CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */ + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */ ); void FdCngDecodeDiracMDCTStereoSID_fx( - CPE_DEC_HANDLE hCPE /* i/o: CPE decoder state structure */ + CPE_DEC_HANDLE hCPE /* i/o: CPE decoder state structure */ ); -// tonalMDCTconcealment.c void TonalMdctConceal_whiten_noise_shape_ivas_fx( Decoder_State *st, const Word16 L_frame, - const TONALMDCTCONC_NOISE_SHAPE_WHITENING_MODE whitening_mode ); + const TONALMDCTCONC_NOISE_SHAPE_WHITENING_MODE whitening_mode +); void stereo_icBWE_dec_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *synthRef_fx, /* i/o: Reference channel HB synthesis at output Fs */ - Word32 *synth_fx, /* o : Non reference channel HB synthesis at output Fs */ - const Word16 *fb_synth_ref_fx, /* i : ref. high-band synthesis 16-20 kHz */ - const Word16 *voice_factors_fx, /* i : voicing factors */ - const Word16 output_frame, /* i : frame length */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *synthRef_fx, /* i/o: Reference channel HB synthesis at output Fs */ + Word32 *synth_fx, /* o : Non reference channel HB synthesis at output Fs */ + const Word16 *fb_synth_ref_fx, /* i : ref. high-band synthesis 16-20 kHz */ + const Word16 *voice_factors_fx, /* i : voicing factors */ + const Word16 output_frame, /* i : frame length */ Word16 *Q_syn, - const Word16 Q_white_exc /* i : Q of fb_synth_ref_fx */ + const Word16 Q_white_exc /* i : Q of fb_synth_ref_fx */ ); void decoder_tcx_tns_fx( - Decoder_State *st, /* i/o: coder memory state */ - const Word16 L_frame_glob, /* i : frame length */ + Decoder_State *st, /* i/o: coder memory state */ + const Word16 L_frame_glob, /* i : frame length */ const Word16 L_spec, const Word16 L_frame, const Word16 L_frameTCX, Word32 x_fx[N_MAX], - const Word16 fUseTns, /* i : flag that is set if TNS data is present */ + const Word16 fUseTns, /* i : flag that is set if TNS data is present */ STnsData *tnsData, - const Word16 bfi, /* i : Bad frame indicator */ - const Word16 frame_cnt, /* i : frame counter in the super frame */ + const Word16 bfi, /* i : Bad frame indicator */ + const Word16 frame_cnt, /* i : frame counter in the super frame */ const Word16 whitenedDomain, - Word16 *length ); + Word16 *length +); void ivas_mdct_core_tns_ns_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : two entries for each channel in TCX10 */ - STnsData tnsData[CPE_CHANNELS][NB_DIV], /* o : TNS parameter */ - Word32 *x_fx[CPE_CHANNELS][NB_DIV], /* o : synthesis @internal_FS */ - Word32 Aq_fx[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* o : LP coefficients */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ - Word16 x_e[CPE_CHANNELS][NB_DIV] ); + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : two entries for each channel in TCX10 */ + STnsData tnsData[CPE_CHANNELS][NB_DIV], /* o : TNS parameter */ + Word32 *x_fx[CPE_CHANNELS][NB_DIV], /* o : synthesis @internal_FS */ + Word32 Aq_fx[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )],/* o : LP coefficients */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + Word16 x_e +); void decoder_tcx_imdct_fx( - Decoder_State *st, /* i/o: coder memory state */ - const Word16 L_frame_glob, /* i : frame length */ + Decoder_State *st, /* i/o: coder memory state */ + const Word16 L_frame_glob, /* i : frame length */ const Word16 L_frameTCX_glob, const Word16 L_spec, const Word16 tcx_offset, @@ -1584,45 +1562,47 @@ void decoder_tcx_imdct_fx( Word32 x_fx[N_MAX], Word16 q_x, Word16 xn_buf_fx[], - Word16 q_win, - const UWord16 kernelType, /* i : TCX transform kernel type */ - const Word16 fUseTns, /* i : flag that is set if TNS data is present */ - Word16 synth_fx[], /* i/o: synth[-M..L_frame] */ + Word16 *q_win, + Word16 *q_winFB, + const UWord16 kernelType, /* i : TCX transform kernel type */ + const Word16 fUseTns, /* i : flag that is set if TNS data is present */ + Word16 synth_fx[], /* i/o: synth[-M..L_frame] */ Word16 synthFB_fx[], - const Word16 bfi, /* i : Bad frame indicator */ - const Word16 frame_cnt, /* i : frame counter in the super frame */ - const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ + const Word16 bfi, /* i : Bad frame indicator */ + const Word16 frame_cnt, /* i : frame counter in the super frame */ + const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ ); void ivas_sba_dirac_stereo_dec_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output[CPE_CHANNELS], /* i/o: output synthesis signal */ - const Word16 output_frame, /* i : output frame length per channel */ - const Word16 mcmasa /* i : McMASA flag */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word32 *output[CPE_CHANNELS], /* i/o: output synthesis signal */ + const Word16 output_frame, /* i : output frame length per channel */ + const Word16 mcmasa /* i : McMASA flag */ ); ivas_error ivas_osba_render_sf_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ - UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ - UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ - Word32 *p_output[] /* o : rendered time signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + Word32 *p_output[] /* o : rendered time signal */ ); void ivas_hq_core_dec_fx( - Decoder_State *st_fx, /* i/o: decoder state structure fx */ - Word16 synth[], /* o : output synthesis */ - Word16 *Q_synth, /* o : Q value of synth */ - const Word16 output_frame, /* i : output frame length */ - const Word16 hq_core_type, /* i : HQ core type */ - const Word16 core_switching_flag, /* i : ACELP->HQ switching frame flag */ + Decoder_State *st_fx, /* i/o: decoder state structure fx */ + Word16 synth[], /* o : output synthesis */ + Word16 *Q_synth, /* o : Q value of synth */ + const Word16 output_frame, /* i : output frame length */ + const Word16 hq_core_type, /* i : HQ core type */ + const Word16 core_switching_flag, /* i : ACELP->HQ switching frame flag */ Word16 output[], - Word16 *Q_output ); + Word16 *Q_output +); void ivas_HQ_FEC_Mem_update_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word32 *t_audio_q_fx, /*Q12*/ - Word32 *normq_fx, /*Q14*/ + Decoder_State *st_fx, /* i/o: decoder state structure */ + Word32 *t_audio_q_fx, /*Q12*/ + Word32 *normq_fx, /*Q14*/ Word16 *ynrm, Word16 *Num_bands_p, Word16 is_transient, @@ -1630,83 +1610,86 @@ void ivas_HQ_FEC_Mem_update_fx( Word16 c_switching_flag, Word16 nb_sfm, Word16 num_Sb, - Word16 *mean_en_high_fx, /*Q5*/ - Word16 hq_core_type, /* i : normal or low-rate MDCT(HQ) core */ - Word16 output_frame ); + Word16 *mean_en_high_fx, /*Q5*/ + Word16 hq_core_type, /* i : normal or low-rate MDCT(HQ) core */ + Word16 output_frame +); -Word16 ivas_hq_classifier_dec_fx( /* o : Consumed bits Q0 */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word32 core_brate, /* i : Core bit rate Q0 */ - const Word16 length, /* i : Frame length Q0 */ - Word16 *is_transient, /* o : Transient flag Q0 */ - Word16 *hqswb_clas /* o : HQ class Q0 */ +/* o : Consumed bits Q0 */ +Word16 ivas_hq_classifier_dec_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word32 core_brate, /* i : Core bit rate Q0 */ + const Word16 length, /* i : Frame length Q0 */ + Word16 *is_transient, /* o : Transient flag Q0 */ + Word16 *hqswb_clas /* o : HQ class Q0 */ ); void ivas_hq_hr_dec_fx( - Decoder_State *st_fx, /* i/o: decoder state structure fx */ - Word32 *t_audio_q, /* o : transform-domain coefficients Q12 */ - const Word16 length, /* i : frame length Q0 */ - Word16 num_bits, /* i : number of available bits Q0 */ - Word16 *ynrm, /* o : norm quantization index vector Q0 */ - Word16 *is_transient, /* o : transient flag Q0 */ - Word16 *hqswb_clas, /* o : HQ SWB class Q0 */ - Word16 *SWB_fenv, /* o : SWB frequency envelopes Q1 */ - const Word16 core_switching_flag /* i : Core switching flag */ + Decoder_State *st_fx, /* i/o: decoder state structure fx */ + Word32 *t_audio_q, /* o : transform-domain coefficients Q12 */ + const Word16 length, /* i : frame length Q0 */ + Word16 num_bits, /* i : number of available bits Q0 */ + Word16 *ynrm, /* o : norm quantization index vector Q0 */ + Word16 *is_transient, /* o : transient flag Q0 */ + Word16 *hqswb_clas, /* o : HQ SWB class Q0 */ + Word16 *SWB_fenv, /* o : SWB frequency envelopes Q1 */ + const Word16 core_switching_flag /* i : Core switching flag */ ); void ivas_hq_configure_fx( - const Word16 length, /* i : Frame length Q0 */ - const Word16 hqswb_clas, /* i : HQ SWB class Q0 */ - const Word32 core_brate, /* i : Codec bitrate Q0 */ - Word16 *num_sfm, /* o : Total number of subbands Q0 */ - Word16 *nb_sfm, /* o : Total number of coded bands Q0 */ - Word16 *start_norm, /* o : First norm to be SDE encoded Q0 */ - Word16 *num_env_bands, /* o : Number coded envelope bands Q0 */ - Word16 *numnrmibits, /* o : Number of bits in fall-back norm encoding Q0 */ - Word16 *hq_generic_offset, /* o : Freq offset for HQ GENERIC Q0 */ - Word16 *sfmsize, /* o : Subband bandwidths Q0 */ - Word16 *sfm_start, /* o : Subband start coefficients Q0 */ - Word16 *sfm_end /* o : Subband end coefficients Q0 */ + const Word16 length, /* i : Frame length Q0 */ + const Word16 hqswb_clas, /* i : HQ SWB class Q0 */ + const Word32 core_brate, /* i : Codec bitrate Q0 */ + Word16 *num_sfm, /* o : Total number of subbands Q0 */ + Word16 *nb_sfm, /* o : Total number of coded bands Q0 */ + Word16 *start_norm, /* o : First norm to be SDE encoded Q0 */ + Word16 *num_env_bands, /* o : Number coded envelope bands Q0 */ + Word16 *numnrmibits, /* o : Number of bits in fall-back norm encoding Q0 */ + Word16 *hq_generic_offset, /* o : Freq offset for HQ GENERIC Q0 */ + Word16 *sfmsize, /* o : Subband bandwidths Q0 */ + Word16 *sfm_start, /* o : Subband start coefficients Q0 */ + Word16 *sfm_end /* o : Subband end coefficients Q0 */ ); void ivas_hq_bit_allocation_fx( - const Word32 core_brate, /* i : Core bit-rate Q0 */ - const Word16 length, /* i : Frame length Q0 */ - const Word16 hqswb_clas, /* i : HQ class Q0 */ - Word16 *num_bits, /* i/o: Remaining bit budget Q0 */ - const Word16 *normqlg2, /* i : Quantized norms Q0 */ - const Word16 nb_sfm, /* i : Number sub bands to be encoded Q0 */ - const Word16 *sfmsize, /* i : Sub band bandwidths Q0 */ - Word16 *noise_level, /* o : HVQ noise level Q15 */ - Word16 *R, /* o : Bit allocation per sub band Q0 */ - Word16 *Rsubband, /* o : Fractional bit allocation Q3 */ - Word16 *sum, /* o : Sum of allocated shape bits Q0 */ - Word16 *core_sfm, /* o : Last coded band in core Q0 */ - const Word16 num_env_bands /* i : Number sub bands to be encoded for HQ_GEN Q0 */ -); - -Word16 ivas_assign_gain_bits_fx( /* o : Number of assigned gain bits */ - const Word16 core, /* i : HQ core */ - const Word16 BANDS, /* i : Number of bands */ - const Word16 *band_width, /* i : Sub band bandwidth */ - Word16 *Rk, /* i/o: Bit allocation/Adjusted bit alloc. Q3 */ - Word16 *gain_bits_array, /* o : Assigned gain bits */ - Word16 *Rcalc /* o : Bit budget for shape quantizer Q3 */ + const Word32 core_brate, /* i : Core bit-rate Q0 */ + const Word16 length, /* i : Frame length Q0 */ + const Word16 hqswb_clas, /* i : HQ class Q0 */ + Word16 *num_bits, /* i/o: Remaining bit budget Q0 */ + const Word16 *normqlg2, /* i : Quantized norms Q0 */ + const Word16 nb_sfm, /* i : Number sub bands to be encoded Q0 */ + const Word16 *sfmsize, /* i : Sub band bandwidths Q0 */ + Word16 *noise_level, /* o : HVQ noise level Q15 */ + Word16 *R, /* o : Bit allocation per sub band Q0 */ + Word16 *Rsubband, /* o : Fractional bit allocation Q3 */ + Word16 *sum, /* o : Sum of allocated shape bits Q0 */ + Word16 *core_sfm, /* o : Last coded band in core Q0 */ + const Word16 num_env_bands /* i : Number sub bands to be encoded for HQ_GEN Q0 */ +); + +/* o : Number of assigned gain bits */ +Word16 ivas_assign_gain_bits_fx( + const Word16 core, /* i : HQ core */ + const Word16 BANDS, /* i : Number of bands */ + const Word16 *band_width, /* i : Sub band bandwidth */ + Word16 *Rk, /* i/o: Bit allocation/Adjusted bit alloc. Q3 */ + Word16 *gain_bits_array, /* o : Assigned gain bits */ + Word16 *Rcalc /* o : Bit budget for shape quantizer Q3 */ ); void ivas_fine_gain_pred_fx( - const Word16 *sfm_start, /* i : Sub band start indices */ - const Word16 *sfm_end, /* i : Sub band end indices */ - const Word16 *sfm_size, /* i : Sub band bandwidths */ - const Word16 *i_sort, /* i : Energy sorting indices */ - const Word16 *K, /* i : Number of pulses per band */ - const Word16 *maxpulse, /* i : Maximum pulse per band */ - const Word16 *R, /* i : Bits per sub band Q3 */ - const Word16 num_sfm, /* i : Number of sub bands */ - Word16 *xq, /* i/o: Quantized vector /quantized vector with finegain adj Q15*/ - Word16 *y, /* i/o: Quantized vector (int) Q0*/ - Word16 *fg_pred, /* o : Predicted fine gains Q12 */ - const Word16 core /* i : Core */ + const Word16 *sfm_start, /* i : Sub band start indices */ + const Word16 *sfm_end, /* i : Sub band end indices */ + const Word16 *sfm_size, /* i : Sub band bandwidths */ + const Word16 *i_sort, /* i : Energy sorting indices */ + const Word16 *K, /* i : Number of pulses per band */ + const Word16 *maxpulse, /* i : Maximum pulse per band */ + const Word16 *R, /* i : Bits per sub band Q3 */ + const Word16 num_sfm, /* i : Number of sub bands */ + Word16 *xq, /* i/o: Quantized vector /quantized vector with finegain adj Q15*/ + Word16 *y, /* i/o: Quantized vector (int) Q0*/ + Word16 *fg_pred, /* o : Predicted fine gains Q12 */ + const Word16 core /* i : Core */ ); Word16 ivas_pvq_core_dec_fx( @@ -1714,117 +1697,119 @@ Word16 ivas_pvq_core_dec_fx( const Word16 *sfm_start, const Word16 *sfm_end, const Word16 *sfmsize, - Word16 coefs_quant[], /* o : output MDCT */ + Word16 coefs_quant[], /* o : output MDCT */ Word16 *Q_coefs, Word16 bits_tot, Word16 nb_sfm, - Word16 *R, /* Q3 */ + Word16 *R, /* Q3 */ Word16 *Rs, Word16 *npulses, Word16 *maxpulse, - const Word16 core ); + const Word16 core +); void ivas_hq_ecu_fx( - const Word16 *prevsynth, /* i : buffer of previously synthesized signal */ - Word32 *ecu_rec, /* o : reconstructed frame in tda domain */ - Word16 *time_offs, /* i/o: Sample offset for consecutive frame losses */ - Word16 *X_sav, /* i/o: Stored spectrum of prototype frame */ - Word16 *Q_spec, /* i/o: Q value of stored spectrum */ - Word16 *num_p, /* i/o: Number of identified peaks */ - Word16 *plocs, /* i/o: Peak locations */ - Word32 *plocsi, /* i/o: Interpolated peak locations Q16 */ - const Word16 env_stab, /* i : Envelope stability parameter */ - Word16 *last_fec, /* i/o: Flag for usage of pitch dependent ECU */ - const Word16 ph_ecu_HqVoicing, /* i : HQ Voicing flag */ - Word16 *ph_ecu_active, /* i : Phase ECU active flag */ - Word16 *gapsynth, /* o : Gap synthesis */ - const Word16 prev_bfi, /* i : indicating burst frame error */ - const Word16 old_is_transient[2], /* i : flags indicating previous transient frames */ - Word16 *mag_chg_1st, /* i/o: per band magnitude modifier for transients */ - Word16 *Xavg, /* i/o: Frequency group average gain to fade to */ - Word16 *beta_mute, /* o : Factor for long-term mute */ - const Word16 output_frame, /* i : frame length */ - Decoder_State *st_fx /* i/o: decoder state structure */ + const Word16 *prevsynth, /* i : buffer of previously synthesized signal */ + Word32 *ecu_rec, /* o : reconstructed frame in tda domain */ + Word16 *time_offs, /* i/o: Sample offset for consecutive frame losses */ + Word16 *X_sav, /* i/o: Stored spectrum of prototype frame */ + Word16 *Q_spec, /* i/o: Q value of stored spectrum */ + Word16 *num_p, /* i/o: Number of identified peaks */ + Word16 *plocs, /* i/o: Peak locations */ + Word32 *plocsi, /* i/o: Interpolated peak locations Q16 */ + const Word16 env_stab, /* i : Envelope stability parameter */ + Word16 *last_fec, /* i/o: Flag for usage of pitch dependent ECU */ + const Word16 ph_ecu_HqVoicing, /* i : HQ Voicing flag */ + Word16 *ph_ecu_active, /* i : Phase ECU active flag */ + Word16 *gapsynth, /* o : Gap synthesis */ + const Word16 prev_bfi, /* i : indicating burst frame error */ + const Word16 old_is_transient[2], /* i : flags indicating previous transient frames */ + Word16 *mag_chg_1st, /* i/o: per band magnitude modifier for transients */ + Word16 *Xavg, /* i/o: Frequency group average gain to fade to */ + Word16 *beta_mute, /* o : Factor for long-term mute */ + const Word16 output_frame, /* i : frame length */ + Decoder_State *st_fx /* i/o: decoder state structure */ ); void ivas_fill_spectrum_fx( - Word16 *coeff, /* i/o: normalized MLT spectrum / nf spectrum Q12 */ - Word32 *L_coeff_out, /* i/o: Noisefilled MLT spectrum Q12 */ - const Word16 *R, /* i : number of pulses per band Q0 */ - const Word16 is_transient, /* i : transient flag Q0 */ - Word16 norm[], /* i : quantization indices for norms Q0 */ - const Word16 *hq_generic_fenv, /* i : HQ GENERIC envelope Q1 */ - const Word16 hq_generic_offset, /* i : HQ GENERIC offset Q0 */ - const Word16 nf_idx, /* i : noise fill index Q0 */ - const Word16 length, /* i : Length of spectrum (32 or 48 kHz) Q0 */ - const Word16 env_stab, /* i : Envelope stability measure [0..1] Q15 */ - Word16 *no_att_hangover, /* i/o: Frame counter for attenuation hangover Q0 */ - Word32 *L_energy_lt, /* i/o: Long-term energy measure for transient detection Q13 */ - Word16 *bwe_seed, /* i/o: random seed for generating BWE i Q0 */ - const Word16 hq_generic_exc_clas, /* i : BWE excitation class Q0 */ - const Word16 core_sfm, /* i : index of the end band for core Q0 */ - const Word16 HQ_mode, /* i : HQ mode Q0 */ - Word16 noise_level[], /* i : noise levels for harmonic modes Q15 */ - const Word32 L_core_brate, /* i : target bit-rate Q0 */ - Word16 prev_noise_level[], /* i/o: noise factor in previous frame Q15 */ - Word16 *prev_R, /* i/o: bit allocation info. in previous frame Q0 */ - Word32 *prev_coeff_out, /* i/o: decoded spectrum in previous frame Q12 */ - const Word16 *peak_idx, /* i : peak indices for hvq Q0 */ - const Word16 Npeaks, /* i : number of peaks in hvq Q0 */ - const Word16 *npulses, /* i : number of pulses per band Q0 */ - const Word16 prev_is_transient, /* i : previous transient flag Q0 */ - Word32 *prev_normq, /* i/o: previous norms Q14 */ - Word32 *prev_env, /* i/o: previous noise envelopes Q(prev_env_Q) */ - const Word16 prev_bfi, /* i : previous bad frame indicator Q0 */ - const Word16 *sfmsize, /* i : Length of bands Q0 */ - const Word16 *sfm_start, /* i : Start of bands Q0 */ - const Word16 *sfm_end, /* i : End of bands Q0 */ - Word16 *prev_L_swb_norm, /* i/o: HVQ/Harmonic mode normalization length Q0 */ - const Word16 prev_hq_mode, /* i : Previous HQ mode Q0 */ - const Word16 num_sfm, /* i : Total number of bands Q0 */ + Word16 *coeff, /* i/o: normalized MLT spectrum / nf spectrum Q12 */ + Word32 *L_coeff_out, /* i/o: Noisefilled MLT spectrum Q12 */ + const Word16 *R, /* i : number of pulses per band Q0 */ + const Word16 is_transient, /* i : transient flag Q0 */ + Word16 norm[], /* i : quantization indices for norms Q0 */ + const Word16 *hq_generic_fenv, /* i : HQ GENERIC envelope Q1 */ + const Word16 hq_generic_offset, /* i : HQ GENERIC offset Q0 */ + const Word16 nf_idx, /* i : noise fill index Q0 */ + const Word16 length, /* i : Length of spectrum (32 or 48 kHz) Q0 */ + const Word16 env_stab, /* i : Envelope stability measure [0..1] Q15 */ + Word16 *no_att_hangover, /* i/o: Frame counter for attenuation hangover Q0 */ + Word32 *L_energy_lt, /* i/o: Long-term energy measure for transient detection Q13 */ + Word16 *bwe_seed, /* i/o: random seed for generating BWE i Q0 */ + const Word16 hq_generic_exc_clas, /* i : BWE excitation class Q0 */ + const Word16 core_sfm, /* i : index of the end band for core Q0 */ + const Word16 HQ_mode, /* i : HQ mode Q0 */ + Word16 noise_level[], /* i : noise levels for harmonic modes Q15 */ + const Word32 L_core_brate, /* i : target bit-rate Q0 */ + Word16 prev_noise_level[], /* i/o: noise factor in previous frame Q15 */ + Word16 *prev_R, /* i/o: bit allocation info. in previous frame Q0 */ + Word32 *prev_coeff_out, /* i/o: decoded spectrum in previous frame Q12 */ + const Word16 *peak_idx, /* i : peak indices for hvq Q0 */ + const Word16 Npeaks, /* i : number of peaks in hvq Q0 */ + const Word16 *npulses, /* i : number of pulses per band Q0 */ + const Word16 prev_is_transient, /* i : previous transient flag Q0 */ + Word32 *prev_normq, /* i/o: previous norms Q14 */ + Word32 *prev_env, /* i/o: previous noise envelopes Q(prev_env_Q) */ + const Word16 prev_bfi, /* i : previous bad frame indicator Q0 */ + const Word16 *sfmsize, /* i : Length of bands Q0 */ + const Word16 *sfm_start, /* i : Start of bands Q0 */ + const Word16 *sfm_end, /* i : End of bands Q0 */ + Word16 *prev_L_swb_norm, /* i/o: HVQ/Harmonic mode normalization length Q0 */ + const Word16 prev_hq_mode, /* i : Previous HQ mode Q0 */ + const Word16 num_sfm, /* i : Total number of bands Q0 */ Word16 *prev_env_Q, const Word16 num_env_bands, - const Word16 element_mode ); + const Word16 element_mode +); void ivas_de_interleave_spectrum_fx( - Word32 *coefs, /* i/o: input and output coefficients Q12 */ - const Word16 length /* i : length of spectrum Q0 */ + Word32 *coefs, /* i/o: input and output coefficients Q12 */ + const Word16 length /* i : length of spectrum Q0 */ ); void ivas_harm_bwe_fx( - const Word16 *coeff_fine, /* i : fine structure for BWE */ - const Word16 *coeff, /* i : coded/noisefilled normalized spectrum */ - const Word16 num_sfm, /* i : Number of subbands */ - const Word16 *sfm_start, /* i : Subband start coefficient */ - const Word16 *sfm_end, /* i : Subband end coefficient */ - const Word16 last_sfm, /* i : last coded subband */ - const Word16 *R, /* i : bit allocation */ - const Word16 prev_hq_mode, /* i : previous hq mode */ - Word16 *norm, /* i/o: quantization indices for norms */ - Word16 *noise_level, /* i/o: noise levels for harmonic modes */ - Word16 *prev_noise_level, /* i/o: noise factor in previous frame */ - Word16 *bwe_seed, /* i/o: random seed for generating BWE input */ - Word32 *coeff_out, /* o : coded/noisefilled spectrum */ - const Word16 element_mode /* i : IVAS element mode */ + const Word16 *coeff_fine, /* i : fine structure for BWE */ + const Word16 *coeff, /* i : coded/noisefilled normalized spectrum */ + const Word16 num_sfm, /* i : Number of subbands */ + const Word16 *sfm_start, /* i : Subband start coefficient */ + const Word16 *sfm_end, /* i : Subband end coefficient */ + const Word16 last_sfm, /* i : last coded subband */ + const Word16 *R, /* i : bit allocation */ + const Word16 prev_hq_mode, /* i : previous hq mode */ + Word16 *norm, /* i/o: quantization indices for norms */ + Word16 *noise_level, /* i/o: noise levels for harmonic modes */ + Word16 *prev_noise_level, /* i/o: noise factor in previous frame */ + Word16 *bwe_seed, /* i/o: random seed for generating BWE input */ + Word32 *coeff_out, /* o : coded/noisefilled spectrum */ + const Word16 element_mode /* i : IVAS element mode */ ); void ivas_hq_pred_hb_bws_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 *ynrm, /* i : norm quantization index vector */ - const Word16 length, /* i : frame length */ - const Word16 hqswb_clas, /* i : HQ SWB class */ - const Word16 *SWB_fenv /* i : SWB frequency envelopes Q1 */ + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word16 *ynrm, /* i : norm quantization index vector */ + const Word16 length, /* i : frame length */ + const Word16 hqswb_clas, /* i : HQ SWB class */ + const Word16 *SWB_fenv /* i : SWB frequency envelopes Q1 */ ); void synchro_synthesis_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *output_fx[CPE_CHANNELS], /* i/o: output synthesis signal */ - const Word16 output_frame, /* i : Number of samples */ - const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ - Word16 output_fx_q ); - -// ivas_dirac_output_synthesis_cov + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *output_fx[CPE_CHANNELS], /* i/o: output synthesis signal */ + const Word16 output_frame, /* i : Number of samples */ + const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + Word16 output_fx_q +); + void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot_fx( Word32 *RealBuffer_fx, /* i : input channel filter bank samples (real part) */ Word16 RealBuffer_e, /* i : exponent input channel filter bank samples (real part)*/ @@ -1840,109 +1825,113 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot_fx( ); void configureFdCngDec_ivas_fx( - HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: Contains the variables related to the FD-based CNG process */ + HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: Contains the variables related to the FD-based CNG process */ const Word16 bwidth, const Word32 total_brate, const Word16 L_frame, const Word16 last_L_frame, - const Word16 element_mode ); + const Word16 element_mode +); void synchonize_channels_mdct_sid_fx( - Decoder_State *sts[CPE_CHANNELS], /* i/o: decoder state structure */ - const Word16 n /* i : channel number */ + Decoder_State *sts[CPE_CHANNELS], /* i/o: decoder state structure */ + const Word16 n /* i : channel number */ ); void ivas_interpolate_3_over_1_allpass_fx( - const Word16 *input_fx, - /* i : input signal */ /* Q_input */ - const Word16 len, /* i : number of input samples */ - Word16 *out_fx, - /* o : output signal */ /* Q_input */ - Word16 *mem_fx /* i/o: memory */ /* Q_input */ + const Word16 *input_fx, /* i : input signal Q_input */ + const Word16 len, /* i : number of input samples */ + Word16 *out_fx, /* o : output signal Q_input */ + Word16 *mem_fx /* i/o: memory Q_input */ ); void tdm_configure_enc_fx( - const Word16 ivas_format, /* i : IVAS format */ - const Word16 ism_mode, /* i : ISM mode in combined format */ - CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - const Word16 Etot_last_fx[CPE_CHANNELS], /* i/o: Energy of last frame Q8*/ - const Word16 tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag in TD stereo OR LRTD primary channel */ - const Word16 tdm_ratio_idx, /* i : ratio index */ - const Word16 tdm_ratio_idx_SM, /* i : ratio index in SM mode */ - const Word16 attack_flag, /* i : Primary channel attack flag */ - const Word16 nb_bits_metadata /* i : number of metadata bits */ + const Word16 ivas_format, /* i : IVAS format */ + const Word16 ism_mode, /* i : ISM mode in combined format */ + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const Word16 Etot_last_fx[CPE_CHANNELS], /* i/o: Energy of last frame Q8*/ + const Word16 tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag in TD stereo OR LRTD primary channel */ + const Word16 tdm_ratio_idx, /* i : ratio index */ + const Word16 tdm_ratio_idx_SM, /* i : ratio index in SM mode */ + const Word16 attack_flag, /* i : Primary channel attack flag */ + const Word16 nb_bits_metadata /* i : number of metadata bits */ ); void stereoFdCngCoherence_fx( - Encoder_State **sts, /* i/o: core encoder structures */ - const Word16 last_element_mode, /* i : last element mode */ - Word16 fft_buff[CPE_CHANNELS][2 * L_FFT], /* i : fft buffers for L and R channels fft_exp*/ - Word16 fft_exp ); + Encoder_State **sts, /* i/o: core encoder structures */ + const Word16 last_element_mode, /* i : last element mode */ + Word16 fft_buff[CPE_CHANNELS][2 * L_FFT], /* i : fft buffers for L and R channels fft_exp*/ + Word16 fft_exp +); void ivas_wb_tbe_dec_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 coder_type, /* i : coding type */ - Word32 *bwe_exc_extended, /* i : bandwidth extended exciatation 2*Q_exc*/ + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word16 coder_type, /* i : coding type */ + Word32 *bwe_exc_extended, /* i : bandwidth extended exciatation 2*Q_exc*/ const Word16 Q_exc, - const Word16 voice_factors[], /* i : voicing factors */ - Word16 *synth, /* o : WB synthesis/final synthesis */ - Word16 *Q_synth ); + const Word16 voice_factors[], /* i : voicing factors */ + Word16 *synth, /* o : WB synthesis/final synthesis */ + Word16 *Q_synth +); void GenShapedWBExcitation_ivas_fx( - Word16 *excSHB, /* o : synthesized shaped shb exctiation Q_bwe_exc*/ - const Word16 *lpc_shb, /* i : lpc coefficients Q12*/ - Word16 *exc4kWhtnd, /* o : whitened synthesized shb excitation Q_bwe_exc*/ - Word32 *mem_csfilt, /* i/o : memory Q_bwe_exc+16*/ - Word16 *mem_genSHBexc_filt_down1, /* i/o : memory Q_bwe_exc*/ - Word16 *mem_genSHBexc_filt_down2, /* i/o : memory Q_bwe_exc*/ - Word16 *mem_genSHBexc_filt_down3, /* i/o : memory Q_bwe_exc*/ - Word16 *state_lpc_syn, /* i/o : memory Q_bwe_exc*/ - const Word16 coder_type, /* i : coding type */ - const Word16 *bwe_exc_extended, /* i : bwidth extended exciatation Q_bwe_exc*/ + Word16 *excSHB, /* o : synthesized shaped shb exctiation Q_bwe_exc*/ + const Word16 *lpc_shb, /* i : lpc coefficients Q12 */ + Word16 *exc4kWhtnd, /* o : whitened synthesized shb excitation Q_bwe_exc*/ + Word32 *mem_csfilt, /* i/o : memory Q_bwe_exc+16*/ + Word16 *mem_genSHBexc_filt_down1, /* i/o : memory Q_bwe_exc*/ + Word16 *mem_genSHBexc_filt_down2, /* i/o : memory Q_bwe_exc*/ + Word16 *mem_genSHBexc_filt_down3, /* i/o : memory Q_bwe_exc*/ + Word16 *state_lpc_syn, /* i/o : memory Q_bwe_exc*/ + const Word16 coder_type, /* i : coding type */ + const Word16 *bwe_exc_extended, /* i : bwidth extended exciatation Q_bwe_exc*/ const Word16 Q_bwe_exc, - Word16 bwe_seed[], /* i/o : random number generator seed */ - const Word16 voice_factors[], /* i : voicing factor Q15*/ - const Word16 uv_flag, /* i : unvoiced flag */ - const Word16 igf_flag ); - -Word16 ivas_wb_bwe_dec_fx( /* o : Q_syn_hb*/ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 output[], /* i : suntehsis @ internal Fs Q_input */ - Word16 *synth_fx, /* i/o: ACELP core synthesis/final synthesis Q0/Qpost */ - Word16 *hb_synth_fx, /* o : SHB synthesis/final synthesis Q_syn_hb */ - const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ - const Word16 output_frame, /* i : frame length */ - Word16 *voice_factors_fx, /* i : voicing factors Q15 */ - const Word16 pitch_buf_fx[], /* i : pitch buffer Q6 */ - Word16 *Qpost ); + Word16 bwe_seed[], /* i/o : random number generator seed */ + const Word16 voice_factors[], /* i : voicing factor Q15*/ + const Word16 uv_flag, /* i : unvoiced flag */ + const Word16 igf_flag +); + +/* o : Q_syn_hb*/ +Word16 ivas_wb_bwe_dec_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word16 output[], /* i : suntehsis @ internal Fs Q_input */ + Word16 *synth_fx, /* i/o: ACELP core synthesis/final synthesis Q0/Qpost */ + Word16 *hb_synth_fx, /* o : SHB synthesis/final synthesis Q_syn_hb */ + const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + const Word16 output_frame, /* i : frame length */ + Word16 *voice_factors_fx, /* i : voicing factors Q15 */ + const Word16 pitch_buf_fx[], /* i : pitch buffer Q6 */ + Word16 *Qpost +); void ivas_param_ism_config_fx( - PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i/o: IVAS Param ISM Config Structure */ - const Word16 nchan_obj /* i : number of ISM channels */ + PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i/o: IVAS Param ISM Config Structure */ + const Word16 nchan_obj /* i : number of ISM channels */ ); void ivas_mdct_core_invQ_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ - Word16 nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* i : number of TNS bits */ - Word16 p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to param buffer */ - Word16 param_lpc[CPE_CHANNELS][NPRM_LPC_NEW], /* i : lpc parameters */ - Word16 param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i : param buffer */ - Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flag TNS enabled */ - STnsData tnsData[CPE_CHANNELS][NB_DIV], /* i : TNS parameter */ - Word32 *x_0[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ - Word16 x_0_e[CPE_CHANNELS][NB_DIV], - Word32 *x[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ - Word16 x_e[CPE_CHANNELS][NB_DIV], + CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ + Word16 nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* i : number of TNS bits */ + Word16 p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to param buffer */ + Word16 param_lpc[CPE_CHANNELS][NPRM_LPC_NEW], /* i : lpc parameters */ + Word16 param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i : param buffer */ + Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flag TNS enabled */ + STnsData tnsData[CPE_CHANNELS][NB_DIV], /* i : TNS parameter */ + Word32 *x_0[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ + Word16 x_0_e, + Word32 *x[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ + Word16 x_e, Word16 x_len[CPE_CHANNELS][NB_DIV], - Word16 Aq[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* i : LP coefficients */ - Word16 ms_mask[NB_DIV][MAX_SFB], /* i : M/S mask */ - const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */ + Word16 Aq[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* i : LP coefficients */ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : M/S mask */ + const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */ ); void ivas_mdct_tcx10_bit_distribution_fx( - Word16 target_bitsTCX10[NB_DIV], /* o : target bit distribution */ - const Word16 nbits_tcx, /* i : TCX bits */ - const Word16 nTnsBitsTCX10[NB_DIV] /* i : TNS bits */ + Word16 target_bitsTCX10[NB_DIV], /* o : target bit distribution */ + const Word16 nbits_tcx, /* i : TCX bits */ + const Word16 nTnsBitsTCX10[NB_DIV] /* i : TNS bits */ ); void TonalMDCTConceal_Detect_ivas_fx( @@ -1950,10 +1939,11 @@ void TonalMDCTConceal_Detect_ivas_fx( const Word32 pitchLag, Word16 *numIndices, const PsychoacousticParameters *psychParamsCurrent, - Word16 element_mode ); + Word16 element_mode +); Word16 GetPLCModeDecision_ivas_fx( - Decoder_State *st /* i/o: decoder memory state pointer */ + Decoder_State *st /* i/o: decoder memory state pointer */ ); void ivas_DetectTonalComponents_fx( @@ -1972,47 +1962,51 @@ void ivas_DetectTonalComponents_fx( const Word16 secondLastPowerSpectrum_e, const Word16 nSamples, const Word16 nSamplesCore, - Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins */ + Word16 floorPowerSpectrum, /* i : lower limit for power spectrum bins */ const PsychoacousticParameters *psychParamsCurrent, - Word16 element_mode ); + Word16 element_mode +); ivas_error stereo_dft_dec_create_fx( - STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word32 element_brate, /* i : element bitrate */ - const Word32 output_Fs, /* i : output sampling rate */ - const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ - const Word16 nchan_transport /* i : number of transport channels */ + STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */ + const Word32 element_brate, /* i : element bitrate */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + const Word16 nchan_transport /* i : number of transport channels */ ); void stereo_cng_init_dec_fx( - STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: stereo CNG decoder structure */ - const Word16 *frameSize /* i : pointer to frameSize of channel 0 to be used for channel 1 */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: stereo CNG decoder structure */ + const Word16 *frameSize /* i : pointer to frameSize of channel 0 to be used for channel 1 */ ); ivas_error stereo_memory_dec_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - CPE_DEC_HANDLE hCPE, /* i : CPE decoder structure */ - const Word16 nb_bits_metadata, /* i : number of metadata bits */ - const Word32 output_Fs, /* i : output sampling rate */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const MC_MODE mc_mode, /* i : MC mode */ - const Word16 nchan_transport /* i : number of transport channels*/ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + CPE_DEC_HANDLE hCPE, /* i : CPE decoder structure */ + const Word16 nb_bits_metadata, /* i : number of metadata bits */ + const Word32 output_Fs, /* i : output sampling rate */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const MC_MODE mc_mode, /* i : MC mode */ + const Word16 nchan_transport /* i : number of transport channels */ ); void initFdCngDec_ivas_fx( - DEC_CORE_HANDLE st, /* i/o: decoder state structure */ - Word16 scale ); + DEC_CORE_HANDLE st, /* i/o: decoder state structure */ + Word16 scale +); -void ivas_initFdCngCom_fx( HANDLE_FD_CNG_COM hFdCngCom, Word16 scale ); +void ivas_initFdCngCom_fx( + HANDLE_FD_CNG_COM hFdCngCom, Word16 scale +); Word16 set_ACELP_flag_IVAS( - const Word16 element_mode, /* i : element mode */ - const Word32 element_brate, /* i : element bitrate */ - const Word32 total_brate, /* i : total bitrate per channel */ - const Word16 idchan, /* i : Channel id */ - const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const Word16 bwidth, /* i : audio bandwidth */ - const Word16 cng_type /* i : CNG type */ + const Word16 element_mode, /* i : element mode */ + const Word32 element_brate, /* i : element bitrate */ + const Word32 total_brate, /* i : total bitrate per channel */ + const Word16 idchan, /* i : Channel id */ + const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const Word16 bwidth, /* i : audio bandwidth */ + const Word16 cng_type /* i : CNG type */ ); void ivas_calc_c_p_coeffs_enc_fx( @@ -2027,7 +2021,8 @@ void ivas_calc_c_p_coeffs_enc_fx( const Word16 band_idx, const Word16 dtx_vad, const Word16 compute_p_flag, - const Word16 dyn_active_w_flag ); + const Word16 dyn_active_w_flag +); void ivas_calc_c_p_coeffs_fx( ivas_spar_md_t *pSparMd, @@ -2041,282 +2036,294 @@ void ivas_calc_c_p_coeffs_fx( const Word16 band_idx, const Word16 dtx_vad, const Word16 compute_p_flag, - const Word16 dyn_active_w_flag ); + const Word16 dyn_active_w_flag +); Word16 is_SIDrate( - const Word32 ivas_total_brate /* i : IVAS total bitrate */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); Word16 is_DTXrate( - const Word32 ivas_total_brate /* i : IVAS total bitrate */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); Word16 ivas_qmetadata_dereorder_generic_fx( - const UWord16 uns_value /* i : unsigned value result of ReorderGeneric */ + const UWord16 uns_value /* i : unsigned value result of ReorderGeneric */ ); void update_bits_next_block_fx( - IVAS_QDIRECTION *q_direction, /* i/o: qdirection */ - Word16 *p_diff, /* i/o: bits to be transferred */ - const Word16 j, /* i : subband to update bit alloc to*/ - const Word16 max_i, /* i : number of subbands */ - const Word16 max_k /* i : n umber of subframes */ + IVAS_QDIRECTION *q_direction, /* i/o: qdirection */ + Word16 *p_diff, /* i/o: bits to be transferred */ + const Word16 j, /* i : subband to update bit alloc to */ + const Word16 max_i, /* i : number of subbands */ + const Word16 max_k /* i : number of subframes */ ); UWord32 ivas_syn_output_fx( - Word32 *synth[], /* i/o: Word32 synthesis signal */ + Word32 *synth[], /* i/o: Word32 synthesis signal */ const Word16 q_synth, - const Word16 output_frame, /* i : output frame length (one channel) */ - const Word16 n_channels, /* i : number of output channels */ - Word16 *synth_out /* o : integer 16 bits synthesis signal */ + const Word16 output_frame, /* i : output frame length (one channel) */ + const Word16 n_channels, /* i : number of output channels */ + Word16 *synth_out /* o : integer 16 bits synthesis signal */ +); + +void ivas_buffer_interleaved_to_deinterleaved_fx( + Word32 *audio, /* i/o: audio buffer */ + const Word16 n_channels, /* i : number of channels */ + const Word16 frame_length, /* i : frame length (one channel) */ + const Word16 n_samp_full /* i : full frame length (one channel) */ +); + +void ivas_buffer_deinterleaved_to_interleaved_fx( + Word32 *audio[], /* i : deinterleaved audio buffer */ + const Word16 n_channels, /* i : number of channels */ + const Word16 frame_length, /* i : frame length (one channel) */ + Word32 *audio_out /* o : interleaved audio buffer */ ); void stereo_tcx_core_dec_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const FRAME_MODE frameMode, /* i : Decoder frame mode */ - Word16 *signal_out, /* o : synthesis @internal_Fs, Q0 */ - Word16 *signal_outFB, /* o : synthesis @output_Fs, Q0 */ - Word16 pitch_buf[], /* o : floating pitch for each subframe, Q6 */ - const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const Word16 last_element_mode, /* i : last element mode */ - const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ - const Word16 nchan_out, /* i : number of output channels */ - const IVAS_FORMAT ivas_format /* i : IVAS format */ + Decoder_State *st, /* i/o: decoder state structure */ + const FRAME_MODE frameMode, /* i : Decoder frame mode */ + Word16 *signal_out, /* o : synthesis @internal_Fs, Q0 */ + Word16 *signal_outFB, /* o : synthesis @output_Fs, Q0 */ + Word16 pitch_buf[], /* o : floating pitch for each subframe, Q6 */ + const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ + const Word16 last_element_mode, /* i : last element mode */ + const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ + const Word16 nchan_out, /* i : number of output channels */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ ); void masa_compensate_two_dir_energy_ratio_index_fx( - const Word16 ratio_index_1, /* i : Input ratio for direction 1 */ - const Word16 ratio_index_2, /* i : Input ratio for direction 2 */ - Word16 *ratio_index_mod1, /* o : Output modified ratio for direction 1 */ - Word16 *ratio_index_mod2, /* o : Output modified ratio for direction 2 */ - const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const Word16 ratio_index_1, /* i : Input ratio for direction 1 */ + const Word16 ratio_index_2, /* i : Input ratio for direction 2 */ + Word16 *ratio_index_mod1, /* o : Output modified ratio for direction 1 */ + Word16 *ratio_index_mod2, /* o : Output modified ratio for direction 2 */ + const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); Word16 stereo_tdm_ener_analysis_fx( - const Word16 ivas_format, /* i : IVAS format */ - CPE_ENC_HANDLE hCPE, /* i : CPE structure */ - const Word16 input_frame, /* i : Number of samples */ - Word16 *tdm_SM_or_LRTD_Pri, /* o : channel combination scheme flag in TD stereo OR LRTD primary channel */ - Word16 *tdm_ratio_idx_SM /* o : TDM ratio index for SM mode */ + const Word16 ivas_format, /* i : IVAS format */ + CPE_ENC_HANDLE hCPE, /* i : CPE structure */ + const Word16 input_frame, /* i : Number of samples */ + Word16 *tdm_SM_or_LRTD_Pri, /* o : channel combination scheme flag in TD stereo OR LRTD primary channel */ + Word16 *tdm_ratio_idx_SM /* o : TDM ratio index for SM mode */ ); /*! r: projected azimuth index */ Word16 ivas_dirac_project_azimuth_index_fx( - const Word16 az_idx, /* i : azimuth index */ - const Word16 az_alph, /* i : number of azimuth symbols */ - const Word16 az_alph_proj /* i : size of projected alphabet */ + const Word16 az_idx, /* i : azimuth index */ + const Word16 az_alph, /* i : number of azimuth symbols */ + const Word16 az_alph_proj /* i : size of projected alphabet */ ); /*! r: projected elevation index */ Word16 ivas_dirac_project_elevation_index_fx( - const Word16 el_idx, /* i : elevation index */ - const Word16 el_alph, /* i : number of elevation symbols */ - const Word16 el_alph_proj /* i : size of projected alphabet */ + const Word16 el_idx, /* i : elevation index */ + const Word16 el_alph, /* i : number of elevation symbols */ + const Word16 el_alph_proj /* i : size of projected alphabet */ ); /*! r: projected index in channel mode */ Word16 ivas_chan_project_elevation_index_fx( - const Word16 el_idx, /* i : elevation index */ - const Word16 el_alph, /* i : number of elevation symbols */ - const Word16 el_alph_proj /* i : size of projected alphabet */ + const Word16 el_idx, /* i : elevation index */ + const Word16 el_alph, /* i : number of elevation symbols */ + const Word16 el_alph_proj /* i : size of projected alphabet */ ); void small_reduction_direction_fx( - IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ UWord16 bits_dir[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], const Word16 raw_flag[MASA_MAXIMUM_CODING_SUBBANDS], - Word16 *diff ); - - -void sort_desc_ind_16_fx( - Word16 *s, /* i/o: vector to be sorted Qx*/ - const Word16 len, /* i : vector length */ - Word16 *ind /* o : array of indices */ + Word16 *diff ); void sort_desc_ind_32_fx( - Word32 *s, /* i/o: vector to be sorted Qx*/ - const Word16 len, /* i : vector length */ - Word16 *ind /* o : array of indices */ + Word32 *s, /* i/o: vector to be sorted Qx*/ + const Word16 len, /* i : vector length */ + Word16 *ind /* o : array of indices */ ); ivas_error only_reduce_bits_direction_fx( Word16 *reduce_bits_out, - IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ Word16 reduce_bits, const Word16 coding_subbands, const Word16 no_subframes, - Word16 *ind_order ); + Word16 *ind_order +); void ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( - const Word32 az, /* i : azimuth Q22 */ - const Word32 el, /* i : elevation Q22 */ - Word32 *dv /* o : direction vector Q30 */ + const Word32 az, /* i : azimuth Q22 */ + const Word32 el, /* i : elevation Q22 */ + Word32 *dv /* o : direction vector Q30 */ ); void ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( - const Word32 *dv, /* i : direction vector */ + const Word32 *dv, /* i : direction vector */ const Word16 div_q, - Word32 *az, /* o : azimuth */ - Word32 *el /* o : elevation */ + Word32 *az, /* o : azimuth */ + Word32 *el /* o : elevation */ ); ivas_error ivas_qmetadata_open_fx( - IVAS_QMETADATA_HANDLE *hQMetaData /* i/o: q_metadata handle */ + IVAS_QMETADATA_HANDLE *hQMetaData /* i/o: q_metadata handle */ ); ivas_error ivas_qmetadata_allocate_memory_fx( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - const Word16 nbands, /* i : new number of frequency bands */ - const Word16 ndirs, /* i : new number of directions */ - const Word16 coherence_flag /* i : new coherence coding status */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + const Word16 nbands, /* i : new number of frequency bands */ + const Word16 ndirs, /* i : new number of directions */ + const Word16 coherence_flag /* i : new coherence coding status */ ); void ivas_qmetadata_close_fx( - IVAS_QMETADATA_HANDLE *hQMetaData /* i/o: q_metadata handle */ + IVAS_QMETADATA_HANDLE *hQMetaData /* i/o: q_metadata handle */ ); ivas_error ivas_spar_dec_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - Word16 *nb_bits_read /* o : number of MD bits read */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + Word16 *nb_bits_read /* o : number of MD bits read */ ); void ivas_spar_md_dec_process_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling */ - const Word16 num_bands_out, /* i : number of output bands */ - const Word16 sba_order /* i : Ambisonic (SBA) order */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling */ + const Word16 num_bands_out, /* i : number of output bands */ + const Word16 sba_order /* i : Ambisonic (SBA) order */ ); ivas_error TDREND_Update_object_positions_fx( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ - const Word16 num_src, /* i : number of sources to render */ - const IVAS_FORMAT in_format, /* i : Format of input sources */ - const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ + const Word16 num_src, /* i : number of sources to render */ + const IVAS_FORMAT in_format, /* i : Format of input sources */ + const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ ); ivas_error TDREND_MIX_LIST_SetOrient_fx( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - const Word32 *FrontVec_p_fx, /* i : Listener's orientation front vector */ - const Word32 *UpVec_p_fx, /* i : Listener's orientation up vector */ - const Word16 orient_q ); + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const Word32 *FrontVec_p_fx, /* i : Listener's orientation front vector */ + const Word32 *UpVec_p_fx, /* i : Listener's orientation up vector */ + const Word16 orient_q +); void TDREND_MIX_LIST_SetPos_fx( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - const Word32 *Pos_p /* i : Listener's position */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const Word32 *Pos_p /* i : Listener's position */ ); ivas_error TDREND_Update_listener_orientation_fx( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ - const Word16 headRotEnabled, /* i : Headrotation flag */ - const IVAS_QUATERNION *headPosition_fx, /* i : Listener orientation */ - const IVAS_VECTOR3 *Pos_fx /* i : Listener Position */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ + const Word16 headRotEnabled, /* i : Headrotation flag */ + const IVAS_QUATERNION *headPosition_fx, /* i : Listener orientation */ + const IVAS_VECTOR3 *Pos_fx /* i : Listener Position */ ); void QuatToRotMat_fx( - const IVAS_QUATERNION quat, /* i : quaternion describing the rotation Qx */ - Word32 Rmat[3][3] /* o : real-space rotation matrix for this rotation 2*Qx-32 */ + const IVAS_QUATERNION quat, /* i : quaternion describing the rotation Qx */ + Word32 Rmat[3][3] /* o : real-space rotation matrix for this rotation 2*Qx-32 */ ); Word32 TDREND_SPATIAL_VecNorm_fx( - const Word32 *Vec_p, /* i : Vector for norm calculation */ - const Word16 in_exp, /* i : Input exp */ - Word16 *out_exp /* o : Output exp */ + const Word32 *Vec_p, /* i : Vector for norm calculation */ + const Word16 in_exp, /* i : Input exp */ + Word16 *out_exp /* o : Output exp */ ); void TDREND_SPATIAL_VecMapToNewCoordSystem_fx( - const Word32 *Vec_p, /* i : Input vector */ - const Word32 *TranslVec_p, /* i : Translation vector */ - const Word32 *DirVec_p, /* i : Direction vector */ - const Word32 *UpVec_p, /* i : Up vector */ - const Word32 *RightVec_p, /* i : Right vector */ - Word32 *MappedVec_p, /* o : Transformed vector */ - Word32 *LisRelPosAbs /* o : Transformed vector ignoring orientation */ + const Word32 *Vec_p, /* i : Input vector */ + const Word32 *TranslVec_p, /* i : Translation vector */ + const Word32 *DirVec_p, /* i : Direction vector */ + const Word32 *UpVec_p, /* i : Up vector */ + const Word32 *RightVec_p, /* i : Right vector */ + Word32 *MappedVec_p, /* o : Transformed vector */ + Word32 *LisRelPosAbs /* o : Transformed vector ignoring orientation */ ); void ivas_mct_side_bits_fx( - MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ - CPE_DEC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE decoder structure */ - const Word16 nCPE, /* i : number of CPEs */ - Decoder_State *st0, /* i : decoder handle for Bstr */ - const Word16 bfi, /* i : BFI flag */ - UWord16 *bitstream, /* o : bitstream indices */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 nb_bits_metadata /* i : number of metadata bits */ + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + CPE_DEC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE decoder structure */ + const Word16 nCPE, /* i : number of CPEs */ + Decoder_State *st0, /* i : decoder handle for Bstr */ + const Word16 bfi, /* i : BFI flag */ + UWord16 *bitstream, /* o : bitstream indices */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 nb_bits_metadata /* i : number of metadata bits */ ); Flag conv_fx_32( - const Word16 x[], /* i : i vector Q_new*/ - const Word16 h[], /* i : impulse response (or second i vector) Q(15)*/ - Word32 y[], /* o : output vetor (result of convolution) 12 bits*/ - const Word16 L /* i : vector size */ + const Word16 x[], /* i : i vector Q_new*/ + const Word16 h[], /* i : impulse response (or second i vector) Q(15)*/ + Word32 y[], /* o : output vetor (result of convolution) 12 bits*/ + const Word16 L /* i : vector size */ ); void stereo_dtf_cng_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ - const Word16 output_frame, /* i : output frame size */ - Word16 q_dft /* i : Q factor of the DFT data */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ + const Word16 output_frame, /* i : output frame size */ + Word16 q_dft /* i : Q factor of the DFT data */ ); - void ivas_spar_update_md_hist_fx( - ivas_spar_md_dec_state_t *hMdDec /* i/o: SPAR MD decoder handle */ + ivas_spar_md_dec_state_t *hMdDec /* i/o: SPAR MD decoder handle */ ); void ivas_spar_smooth_md_dtx_fx( - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const Word16 num_bands_out, /* i : number of output bands */ - const Word16 num_md_sub_frames /* i : number of metadata subframes */ + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const Word16 num_bands_out, /* i : number of output bands */ + const Word16 num_md_sub_frames /* i : number of metadata subframes */ ); void ivas_spar_setup_md_smoothing_fx( - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const Word16 num_bands_out, /* i : number of output bands */ - const Word16 num_md_sub_frames /* i : number of metadata subframes */ + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const Word16 num_bands_out, /* i : number of output bands */ + const Word16 num_md_sub_frames /* i : number of metadata subframes */ ); ivas_error ivas_mct_dec_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_fx[], /* o : output synthesis signal */ - const Word16 output_frame, /* i : output frame length per channel */ - const Word16 nb_bits_metadata /* i : number of metadata bits */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word32 *output_fx[], /* o : output synthesis signal */ + const Word16 output_frame, /* i : output frame length per channel */ + const Word16 nb_bits_metadata /* i : number of metadata bits */ ); void ivas_dirac_dec_render_sf_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_fx[], /* i/o: synthesized core-coder transport channels/DirAC output */ - const Word16 nchan_transport, /* i : number of transport channels */ - Word32 *pppQMfFrame_ts_re_fx[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], - Word32 *pppQMfFrame_ts_im_fx[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] ); + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word32 *output_fx[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const Word16 nchan_transport, /* i : number of transport channels */ + Word32 *pppQMfFrame_ts_re_fx[HOA3_CHANNELS][CLDFB_NO_COL_MAX], + Word32 *pppQMfFrame_ts_im_fx[HOA3_CHANNELS][CLDFB_NO_COL_MAX] +); void ivas_dirac_dec_render_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const Word16 nchan_transport, /* i : number of transport channels */ - const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ - UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ - UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ - Word32 *output_f[] /* o : rendered time signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const Word16 nchan_transport, /* i : number of transport channels */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + Word32 *output_fx[] /* o : rendered time signal */ ); void ivas_dirac_dec_read_BS_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - Decoder_State *st, /* i/o: decoder Core state structure */ - DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial rendering data handle */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q metadata */ - Word16 *nb_bits, /* o : number of bits read */ - const Word16 last_bit_pos, /* i : last read bitstream position */ - const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - Word16 *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + Decoder_State *st, /* i/o: decoder Core state structure */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial rendering data handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q metadata */ + Word16 *nb_bits, /* o : number of bits read */ + const Word16 last_bit_pos, /* i : last read bitstream position */ + const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + const Word16 nchan_transport, /* i : number of transport channels */ + Word16 *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); ivas_error ivas_dirac_dec_config_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const DIRAC_CONFIG_FLAG flag_configopen /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const DIRAC_CONFIG_FLAG flag_configopen /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ ); void ivas_dirac_dec_output_synthesis_cov_close_fx( @@ -2325,115 +2332,117 @@ void ivas_dirac_dec_output_synthesis_cov_close_fx( ); ivas_error ivas_init_decoder_front_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); ivas_error ivas_init_decoder_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void destroy_core_dec_fx( - DEC_CORE_HANDLE hCoreCoder /* i/o: core decoder structure */ + DEC_CORE_HANDLE hCoreCoder /* i/o: core decoder structure */ ); void ivas_destroy_dec_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); ivas_error ivas_ism_dec_config_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const ISM_MODE last_ism_mode, /* i/o: last ISM mode */ - UWord16 *nSamplesRendered, /* o : number of samples flushed when the renderer granularity changes */ - Word16 *data /* o : output synthesis signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const ISM_MODE last_ism_mode /* i/o: last ISM mode */ ); ivas_error ivas_ism_metadata_dec_create_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 n_ISms, /* i : number of objects */ - Word32 element_brate_tmp[] /* o : element bitrate per object */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 n_ISms, /* i : number of separately coded objects */ + Word32 element_brate_tmp[] /* o : element bitrate per object */ ); + +void ivas_ism_reset_metadata_handle_dec_fx( + ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ +); + ivas_error ivas_sba_dec_reconfigure_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - UWord16 *nSamplesFlushed, /* o : number of samples flushed */ - Word16 *data /* o : output synthesis signal */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); ivas_error ivas_spar_md_dec_matrix_open_fx( - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const Word16 num_channels, /* i : number of internal channels */ - const Word16 num_md_sub_frames /* i : number of MD subframes */ + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const Word16 num_channels, /* i : number of internal channels */ + const Word16 num_md_sub_frames /* i : number of MD subframes */ ); + void ivas_spar_md_dec_matrix_close_fx( - ivas_spar_md_dec_state_t *hMdDecoder, /* i/o: SPAR MD decoder handle */ - const Word16 num_channels /* i : number of internal channels */ + ivas_spar_md_dec_state_t *hMdDecoder, /* i/o: SPAR MD decoder handle */ + const Word16 num_channels /* i : number of internal channels */ ); + ivas_error ivas_spar_dec_open_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ ); void ivas_param_mc_dec_read_BS_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - Decoder_State *st, /* i/o: decoder state structure */ - PARAM_MC_DEC_HANDLE hParamMC, /* i/o: decoder ParamMC handle */ - Word16 *nb_bits /* o : number of bits written */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + PARAM_MC_DEC_HANDLE hParamMC, /* i/o: decoder ParamMC handle */ + Word16 *nb_bits /* o : number of bits written */ ); ivas_error ivas_omasa_data_open_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ ); void ivas_omasa_data_close_fx( - MASA_ISM_DATA_HANDLE *hMasaIsmData /* i/o: MASA_ISM rendering handle */ + MASA_ISM_DATA_HANDLE *hMasaIsmData /* i/o: MASA_ISM rendering handle */ ); ivas_error ivas_mc_dec_config_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 idx, /* i : LS config. index */ - UWord16 *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ - Word16 *data /* o : output synthesis signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 idx /* i : LS config. index */ ); void ivas_lfe_window_init_fx( - LFE_WINDOW_HANDLE hLFEWindow, /* i/o: LFE window handle */ - const Word32 sampling_rate, /* i : sampling rate */ - const Word16 frame_len /* i : frame length in samples */ + LFE_WINDOW_HANDLE hLFEWindow, /* i/o: LFE window handle */ + const Word32 sampling_rate, /* i : sampling rate */ + const Word16 frame_len /* i : frame length in samples */ ); Word16 param_mc_get_num_cldfb_syntheses_fx( - Decoder_Struct *st_ivas /* i : Parametric MC handle */ + Decoder_Struct *st_ivas /* i : Parametric MC handle */ ); void InitPsychLPC_fx( - const Word32 sr_core, /* i : sampling rate of core-coder */ - const Word16 L_frame, /* i : frame length */ - const TCX_CONFIG_HANDLE hTcxCfg /* i : TCX configuration handle */ + const Word32 sr_core, /* i : sampling rate of core-coder */ + const Word16 L_frame, /* i : frame length */ + const TCX_CONFIG_HANDLE hTcxCfg /* i : TCX configuration handle */ ); ivas_error PsychoacousticParameters_Init_fx( - const Word32 sr_core, /* i : sampling rate of core-coder */ - const Word16 nBins, /* i : Number of bins (spectral lines) */ - const Word8 nBands, /* i : Number of spectrum subbands */ - const Word16 isTCX20, /* i : Flag indicating if the subband division is for TCX20 or TCX10 */ - const Word16 isWarped, /* i : Flag indicating if the scale is linear or warped */ - PsychoacousticParameters *pPsychParams ); + const Word32 sr_core, /* i : sampling rate of core-coder */ + const Word16 nBins, /* i : Number of bins (spectral lines) */ + const Word8 nBands, /* i : Number of spectrum subbands */ + const Word16 isTCX20, /* i : Flag indicating if the subband division is for TCX20 or TCX10 */ + const Word16 isWarped, /* i : Flag indicating if the scale is linear or warped */ + PsychoacousticParameters *pPsychParams +); ivas_error ivas_FB_mixer_open_fx( - IVAS_FB_MIXER_HANDLE *hFbMixer_out, /* i/o: FB mixer handle */ - const Word32 sampling_rate, /* i : sampling rate */ - IVAS_FB_CFG *fb_cfg, /* i : FB config. handle */ - const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ + IVAS_FB_MIXER_HANDLE *hFbMixer_out, /* i/o: FB mixer handle */ + const Word32 sampling_rate, /* i : sampling rate */ + IVAS_FB_CFG *fb_cfg, /* i : FB config. handle */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ ); void ivas_FB_mixer_close_fx( - IVAS_FB_MIXER_HANDLE *hFbMixer_in, /* i/o: FB mixer handle */ - const Word32 sampling_rate, /* i : sampling rate in Hz */ - const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ + IVAS_FB_MIXER_HANDLE *hFbMixer_in, /* i/o: FB mixer handle */ + const Word32 sampling_rate, /* i : sampling rate in Hz */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ ); void ivas_fb_mixer_get_in_out_mapping_fx( - const IVAS_FB_CFG *fb_cfg, /* i : FB config. handle */ - Word16 in_out_mixer_map[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i/o: mixing mapping */ + const IVAS_FB_CFG *fb_cfg, /* i : FB config. handle */ + Word16 in_out_mixer_map[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i/o: mixing mapping */ ); void ivas_fb_mixer_cross_fading_fx( @@ -2443,471 +2452,484 @@ void ivas_fb_mixer_cross_fading_fx( Word32 *pMdft_out_new_fx, const Word16 ch, const Word16 frame_len, - const Word16 cf_offset ); + const Word16 cf_offset +); -// ivas_omasa_dec.c ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nSamplesAsked, /* i : number of samples requested */ - UWord16 *nSamplesRendered, /* o : number of samples rendered */ - UWord16 *nSamplesAvailable, /* o : number of samples still to render */ - const Word16 nchan_transport, /* i : number of transport channels */ - Word32 *output_fx[] /* o : rendered time signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nSamplesAsked, /* i : number of samples requested */ + UWord16 *nSamplesRendered, /* o : number of samples rendered */ + UWord16 *nSamplesAvailable, /* o : number of samples still to render */ + const Word16 nchan_transport, /* i : number of transport channels */ + Word32 *output_fx[] /* o : rendered time signal */ ); Word16 ivas_sba_get_analysis_order_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 sba_order /* i : Ambisonic (SBA) order */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 sba_order /* i : Ambisonic (SBA) order */ ); Word16 ivas_sba_get_nchan_metadata_fx( - const Word16 sba_order, /* i : Ambisonic (SBA) order */ - const Word32 ivas_total_brate /* i : IVAS total bitrate */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ +); + +/*! r: number of bits in SBQ SID frame */ +Word16 ivas_sba_spar_sid_bitlen_fx( + const Word16 nchan_transport /* i : number of transport channels */ ); void ivas_sba_get_spar_hoa_ch_ind_fx( - const Word16 num_md_chs, /* i : number of MD channels */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - Word16 HOA_md_ind[IVAS_SPAR_MAX_CH] ); + const Word16 num_md_chs, /* i : number of MD channels */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + Word16 HOA_md_ind[IVAS_SPAR_MAX_CH] +); void ivas_sba_get_spar_hoa_md_flag_fx( - const Word16 sba_order, /* i : Ambisonic (SBA) order */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ Word16 *spar_hoa_md_flag, - Word16 *spar_hoa_dirac2spar_md_flag ); - -void ivas_omasa_dirac_rend_jbm_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nSamplesAsked, /* i : number of samples requested */ - UWord16 *nSamplesRendered, /* o : number of samples rendered */ - UWord16 *nSamplesAvailable, /* o : number of samples still to render */ - const Word16 nchan_transport, /* i : number of transport channels */ - Word32 *output_f[] /* o : rendered time signal */ + Word16 *spar_hoa_dirac2spar_md_flag ); -ivas_error ivas_jbm_dec_render_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const UWord16 nSamplesAsked, /* i : number of samples wanted */ - UWord16 *nSamplesRendered, /* o : number of samples rendered */ - UWord16 *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */ - Word16 *data /* o : output synthesis signal */ +void ivas_omasa_dirac_rend_jbm_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nSamplesAsked, /* i : number of samples requested */ + UWord16 *nSamplesRendered, /* o : number of samples rendered */ + UWord16 *nSamplesAvailable, /* o : number of samples still to render */ + const Word16 nchan_transport, /* i : number of transport channels */ + Word32 *output_fx[] /* o : rendered time signal */ ); void ivas_sba_zero_vert_comp_fx( - Word32 *sba_data[], /* i : SBA signals */ - const Word16 sba_order, /* i : SBA order */ - const Word16 sba_planar, /* i : SBA planar flag */ - const Word16 input_frame /* i : frame length */ + Word32 *sba_data[], /* i : SBA signals */ + const Word16 sba_order, /* i : SBA order */ + const Word16 sba_planar, /* i : SBA planar flag */ + const Word16 input_frame /* i : frame length */ ); /*! r: MC format mode (MCT, McMASA, ParamMC) */ MC_MODE ivas_mc_mode_select_fx( - const MC_LS_SETUP mc_ls_setup, /* i : MC loudspeaker setup */ - const Word32 total_brate /* i : IVAS total bitrate */ + const MC_LS_SETUP mc_ls_setup, /* i : MC loudspeaker setup */ + const Word32 total_brate /* i : IVAS total bitrate */ ); /*! r: number of loudspeaker channels */ Word16 ivas_mc_ls_setup_get_num_channels_fx( - const MC_LS_SETUP mc_ls_setup /* i : loudspeaker setup (CICP) */ + const MC_LS_SETUP mc_ls_setup /* i : loudspeaker setup (CICP) */ ); /*! r: multi channel loudspeaker setup */ MC_LS_SETUP ivas_mc_map_output_config_to_mc_ls_setup_fx( - const AUDIO_CONFIG output_config /* i : output audio configuration */ + const AUDIO_CONFIG output_config /* i : output audio configuration */ ); /*! r: output configuration */ AUDIO_CONFIG ivas_mc_map_ls_setup_to_output_config_fx( - const MC_LS_SETUP mc_ls_setup /* i : multi channel loudspeaker setup*/ + const MC_LS_SETUP mc_ls_setup /* i : multi channel loudspeaker setup */ ); void ivas_wrap_arround_fx( Word16 *pArr, const Word16 min_val, const Word16 max_val, - const Word16 length ); + const Word16 length +); void ivas_get_cum_freq_model_fx( const Word16 *pFreq_model, const Word16 length, - Word16 *pCum_freq_model ); + Word16 *pCum_freq_model +); Word16 ivas_map_num_pred_r_to_idx_fx( const Word16 num_quant_points_pred_r, - const Word16 active_w_flag ); + const Word16 active_w_flag +); Word16 ivas_map_num_drct_r_to_idx_fx( - const Word16 num_quant_points_drct_r ); + const Word16 num_quant_points_drct_r +); Word16 ivas_map_num_decd_r_to_idx_fx( - const Word16 num_quant_points_decd_r ); + const Word16 num_quant_points_decd_r +); void ivas_spar_arith_coeffs_com_init_fx( ivas_arith_coeffs_t *pArith_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const Word16 table_idx, - const Word16 enc_dec ); + const Word16 enc_dec +); void ivas_spar_huff_coeffs_com_init_fx( ivas_huff_coeffs_t *pHuff_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const Word16 table_idx, - const Word16 enc_dec ); + const Word16 enc_dec +); ISM_MODE ivas_omasa_ism_mode_select_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 nchan_ism /* i : number of input ISM's */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 nchan_ism /* i : number of input ISM's */ ); void ivas_set_omasa_TC_fx( - const ISM_MODE ism_mode, /* i : ISM mode */ - const Word16 nchan_ism, /* i : number of input ISMs */ - Word16 *nSCE, /* o : number of SCEs */ - Word16 *nCPE /* o : number of CPEs */ + const ISM_MODE ism_mode, /* i : ISM mode */ + const Word16 nchan_ism, /* i : number of input ISMs */ + Word16 *nSCE, /* o : number of SCEs */ + Word16 *nCPE /* o : number of CPEs */ ); Word32 ivas_interformat_brate_fx( - const ISM_MODE ism_mode, /* i : ISM mode */ - const Word16 nchan_ism, /* i : number of ISM channels */ - const Word32 element_brate, /* i : element bitrate */ - const Word16 ism_imp, /* i : ISM importance flag */ - const Word16 limit_flag /* i : flag to limit the bitrate increase */ + const ISM_MODE ism_mode, /* i : ISM mode */ + const Word16 nchan_ism, /* i : number of ISM channels */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 ism_imp, /* i : ISM importance flag */ + const Word16 limit_flag /* i : flag to limit the bitrate increase */ ); Word16 check_bounds_s_fx( - const Word16 value, /* i : Input value */ - const Word16 low, /* i : Low limit */ - const Word16 high /* i : High limit */ + const Word16 value, /* i : Input value */ + const Word16 low, /* i : Low limit */ + const Word16 high /* i : High limit */ ); void ivas_combined_format_brate_sanity_fx( - const Word32 element_brate, /* i : element bitrate */ - const Word16 core, /* i : core */ - const Word32 total_brate, /* i : total bitrate */ - Word32 *core_brate, /* i/o: core bitrate */ - Word16 *inactive_coder_type_flag, /* o : inactive coder_type flag */ - Word16 *diff_nBits /* o : number of differential bits */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 core, /* i : core */ + const Word32 total_brate, /* i : total bitrate */ + Word32 *core_brate, /* i/o: core bitrate */ + Word16 *inactive_coder_type_flag, /* o : inactive coder_type flag */ + Word16 *diff_nBits /* o : number of differential bits */ ); Word16 bits_index_ism_ratio_fx( - const Word16 nchan_ism /* i : number of objects */ + const Word16 nchan_ism /* i : number of objects */ ); Word16 calculate_brate_limit_flag_fx( - const Word16 ism_imp[], /* i : ISM importance flags */ - const Word16 nchan_ism /* i : number of objects */ + const Word16 ism_imp[], /* i : ISM importance flags */ + const Word16 nchan_ism /* i : number of objects */ ); + Word16 ism_quant_meta_fx( - const Word32 val, /* i : scalar value to quantize Q22 */ - Word32 *valQ, /* o : quantized value Q22 */ - const Word32 borders_fx[], /* i : level borders Q22 */ - const Word32 q_step_fx, /* i : quantization step Q22 */ - const Word32 q_step_border_fx, /* i : quantization step at the border Q22 */ - const Word16 cbsize /* i : codebook size */ + const Word32 val, /* i : scalar value to quantize Q22 */ + Word32 *valQ, /* o : quantized value Q22 */ + const Word32 borders_fx[], /* i : level borders Q22 */ + const Word32 q_step_fx, /* i : quantization step Q22 */ + const Word32 q_step_border_fx, /* i : quantization step at the border Q22 */ + const Word16 cbsize /* i : codebook size */ ); /*! r: number of channels to be analysed */ Word16 getNumChanAnalysis_fx( - Encoder_Struct *st_ivas /* i : IVAS encoder structure */ + Encoder_Struct *st_ivas /* i : IVAS encoder structure */ ); -ivas_error ivas_limiter_open_fx( - IVAS_LIMITER_HANDLE *hLimiter_out, /* o : limiter struct handle */ - const Word16 max_num_channels, /* i : maximum number of I/O channels to be processed */ - const Word32 sampling_rate /* i : sampling rate for processing */ -); -void ivas_limiter_close_fx( - IVAS_LIMITER_HANDLE *phLimiter /* i/o: pointer to limiter handle, can be NULL */ -); +/*----------------------------------------------------------------------------------* + * Limiter prototypes + *----------------------------------------------------------------------------------*/ -void copy_masa_descriptive_meta_fx( - MASA_DECRIPTIVE_META *outMeta, /* o : metadata to be written */ - MASA_DECRIPTIVE_META *inMeta /* i : input metadata */ +void ivas_limiter_dec_fx( + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + Word32 *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ + const Word16 num_channels, /* i : number of channels to be processed */ + const Word16 output_frame, /* i : number of samples per channel in the buffer */ + const Word16 BER_detect, /* i : BER detect flag */ + Word16 q_factor /* i : Q factor of the output samples */ ); -void efap_free_data_fx( - EFAP_HANDLE *hEFAPdata /* i/o: EFAP handle to be freed */ +void limiter_process_fx( + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + const Word16 output_frame, /* i : number of samples to be processed per channel in the I/O buffer */ + const Word32 threshold, /* i : signal amplitude above which limiting starts to be applied */ + const Word16 BER_detect, /* i : BER detect flag */ + Word16 *strong_saturation_cnt, /* i/o: counter of strong saturations (can be NULL) */ + Word16 q_factor /* i : Q factor of output samples */ ); -void tdm_SCh_LSF_intra_pred_fx( - const Word32 element_brate, /* i : element bitrate */ - const Word16 *tdm_lsfQ_PCh_fx, /* i : primary channel LSFs */ - Word16 *pred_lsf_SCh_fx /* o : predicted secondary channel LSFs */ +ivas_error ivas_limiter_open_fx( + IVAS_LIMITER_HANDLE *hLimiter_out, /* o : limiter struct handle */ + const Word16 max_num_channels, /* i : maximum number of I/O channels to be processed */ + const Word32 sampling_rate /* i : sampling rate for processing */ ); -ivas_error ivas_create_lfe_lpf_enc_fx( - ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ - const Word32 input_Fs /* i : input sampling rate */ +void ivas_limiter_close_fx( + IVAS_LIMITER_HANDLE *phLimiter /* i/o: pointer to limiter handle, can be NULL */ ); -void ivas_lfe_lpf_enc_apply_fx( - ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ - Word32 data_lfe_ch[], /* i/o: LFE signal */ - const Word16 input_frame /* i : input frame length per channel */ +void copy_masa_descriptive_meta_fx( + MASA_DECRIPTIVE_META *outMeta, /* o : metadata to be written */ + MASA_DECRIPTIVE_META *inMeta /* i : input metadata */ ); -// ivas_arith.c void ivas_ari_done_encoding_14bits_fx( BSTR_ENC_HANDLE hBstr, - Tastat *s ); + Tastat *s +); void ivas_ari_encode_14bits_ext_fx( BSTR_ENC_HANDLE hBstr, Tastat *s, Word32 symbol, - const UWord16 *cum_freq ); + const UWord16 *cum_freq +); void ms_inv_mask_processing_fx( - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT encoder structure */ - Encoder_State **sts, /* i/o: Encoder state structure */ - Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ - const Word16 iSubframe, /* i : subframe number */ - const Word32 x_0_fx[], /* i : spectrum 1 */ - const Word32 x_1_fx[], /* i : spectrum 2 */ - Word32 x_inv_0_fx[], /* o : inverse spectrum 1 */ - Word32 x_inv_1_fx[], /* o : inverse spectrum 2 */ - Word16 maxSfb /* i : number of stereo frequency bands */ + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT encoder structure */ + Encoder_State **sts, /* i/o: Encoder state structure */ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + const Word16 iSubframe, /* i : subframe number */ + const Word32 x_0_fx[], /* i : spectrum 1 */ + const Word32 x_1_fx[], /* i : spectrum 2 */ + Word32 x_inv_0_fx[], /* o : inverse spectrum 1 */ + Word32 x_inv_1_fx[], /* o : inverse spectrum 2 */ + Word16 maxSfb /* i : number of stereo frequency bands */ ); void ms_processing_fx( - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ - Encoder_State **sts, /* i/o: Encoder state structure */ - Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ - const Word16 iSubframe, /* i : subframe number */ - Word32 x_0_fx[], /* i/o: spectrum 1 */ - Word32 x_1_fx[], /* i/o: spectrum 1 */ - Word16 maxSfb /* i : number of stereo frequency bands*/ + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ + Encoder_State **sts, /* i/o: Encoder state structure */ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + const Word16 iSubframe, /* i : subframe number */ + Word32 x_0_fx[], /* i/o: spectrum 1 */ + Word32 x_1_fx[], /* i/o: spectrum 1 */ + Word16 maxSfb /* i : number of stereo frequency bands */ ); void convertToMS_fx( - const Word16 L_frame, /* i : frame length */ - Word32 x0[], /* i/o: mid/left channel coefficients */ - Word32 x1[], /* i/o: side/right channel coefficients */ - const Word32 norm_fac /* i : normalization factor */ + const Word16 L_frame, /* i : frame length */ + Word32 x0[], /* i/o: mid/left channel coefficients */ + Word32 x1[], /* i/o: side/right channel coefficients */ + const Word32 norm_fac /* i : normalization factor */ ); void FindSplitRatio_fx( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - Encoder_State **sts /* i/o: Encoder state structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + Encoder_State **sts /* i/o: Encoder state structure */ ); void IGFEncStereoEncoder_fx( - STEREO_MDCT_BAND_PARAMETERS *sfbParam, /* i/o: sfb parameters for the right channel */ - const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : IGF handle */ - const Word32 *mdctSpectrumL_fx, /* i : left spectrum */ - const Word32 *mdctSpectrumR_fx, /* i : right spectrum */ + STEREO_MDCT_BAND_PARAMETERS *sfbParam, /* i/o: sfb parameters for the right channel */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : IGF handle */ + const Word32 *mdctSpectrumL_fx, /* i : left spectrum */ + const Word32 *mdctSpectrumR_fx, /* i : right spectrum */ Word16 q_mdctSpectrum, - Word16 *msMask, /* i/o: MS mask */ - Word16 *igfStereoMode, /* o : IGF stereo mode */ - const Word16 mdct_stereo_mode, /* i : MDCT stereo mode */ - const Word16 isTCX20, /* i : flag for indicating TCX20 */ - const Word16 isTransition /* i : flag for transtition */ + Word16 *msMask, /* i/o: MS mask */ + Word16 *igfStereoMode, /* o : IGF stereo mode */ + const Word16 mdct_stereo_mode, /* i : MDCT stereo mode */ + const Word16 isTCX20, /* i : flag for indicating TCX20 */ + const Word16 isTransition /* i : flag for transtition */ ); void stereo_coder_tcx_fx( - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ - Encoder_State **sts, /* i/o: encoder state structure */ - Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ - Word32 *mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ - Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ - Word32 *inv_mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ - const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ - Word16 q_spec ); - -// bw_detect_fx.c -Word16 set_bw_mct_fx( - CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ - const Word16 nCPE /* i : number of CPEs */ + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + Word32 *mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ + Word32 *inv_mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ + const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ + Word16 exp_spec, + Word16 exp_mdst_spec ); +Word16 set_bw_mct_fx( + CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ + const Word16 nCPE /* i : number of CPEs */ +); -// ivas_mct_enc_mct.c void write_mct_bitstream_fx( - Encoder_State **sts, /* i/o: encoder state structure */ - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ - const Word16 nchan /* i : number of channels */ + Encoder_State **sts, /* i/o: encoder state structure */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + const Word16 nchan /* i : number of channels */ ); void getChannelEnergies_fx( - Encoder_State **sts, /* i/o: Encoder state structure */ - Word32 nrg[MCT_MAX_CHANNELS], /* o : buffer with energies for each channel */ - Word16 nrg_e[MCT_MAX_CHANNELS], /* o : exponents of energies for each channel */ - const Word16 nchan /* i : number of channels */ + Encoder_State **sts, /* i/o: Encoder state structure */ + Word32 nrg[MCT_MAX_CHANNELS], /* o : buffer with energies for each channel */ + Word16 nrg_e[MCT_MAX_CHANNELS], /* o : exponents of energies for each channel */ + const Word16 nchan /* i : number of channels */ ); void apply_MCT_enc_fx( - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ - Encoder_State **sts, /* i/o: encoder state structure */ - Word32 *mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ - Word32 *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ - Word32 *inv_mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ - const Word16 nchan /* i : number of channels */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + Word32 *mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ + Word32 *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ + Word32 *inv_mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ + const Word16 nchan /* i : number of channels */ ); void ivas_spar_config_fx( - Word32 ivas_total_brate, /* i : codec total bitrate */ - const Word16 sba_order, /* i : Ambisonic (SBA) order */ - Word16 *nchan_transport, /* o : number of transport channels */ - Word16 *nSCE, /* o : number of SCEs */ - Word16 *nCPE, /* o : number of CPEs */ - Word32 *core_nominal_brate, /* o : core-coding nominal bitrate */ - const Word16 sid_format /* i : IVAS format indicator from SID frame */ + Word32 ivas_total_brate, /* i : codec total bitrate */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + Word16 *nchan_transport, /* o : number of transport channels */ + Word16 *nSCE, /* o : number of SCEs */ + Word16 *nCPE, /* o : number of CPEs */ + Word32 *core_nominal_brate, /* o : core-coding nominal bitrate */ + const Word16 sid_format /* i : IVAS format indicator from SID frame */ ); Word16 ivas_get_bw_idx_from_sample_rate_fx( - const Word32 sampling_rate /* i : sampling rate */ + const Word32 sampling_rate /* i : sampling rate */ ); void ivas_spar_bitrate_dist_fx( - Word32 core_brates_act[], /* o : bitrates per core-coder */ - const Word16 nAvailBits, /* i : number of available bits */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 sba_order, /* i : Ambisonic (SBA) order */ - const Word16 bwidth /* i : audio bandwidth */ + Word32 core_brates_act[], /* o : bitrates per core-coder */ + const Word16 nAvailBits, /* i : number of available bits */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word16 bwidth /* i : audio bandwidth */ ); + ivas_error ivas_corecoder_enc_reconfig_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const Word16 nSCE_old, /* i : number of SCEs in previous frame */ - const Word16 nCPE_old, /* i : number of CPEs in previous frame */ - const Word16 nchan_transport_old, /* i : number of TCs in previous frame */ - const Word32 brate_SCE, /* i : bitrate to be set for the SCEs */ - const Word32 brate_CPE, /* i : bitrate to be set for the CPEs */ - const MC_MODE last_mc_mode /* i : switching between MC modes: last mode */ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const Word16 nSCE_old, /* i : number of SCEs in previous frame */ + const Word16 nCPE_old, /* i : number of CPEs in previous frame */ + const Word16 nchan_transport_old, /* i : number of TCs in previous frame */ + const Word32 brate_SCE, /* i : bitrate to be set for the SCEs */ + const Word32 brate_CPE, /* i : bitrate to be set for the CPEs */ + const MC_MODE last_mc_mode /* i : switching between MC modes: last mode */ ); void ivas_sba_zero_vert_comp_fx( - Word32 *sba_data[], /* i : SBA signals */ - const Word16 sba_order, /* i : SBA order */ - const Word16 sba_planar, /* i : SBA planar flag */ - const Word16 input_frame /* i : frame length */ + Word32 *sba_data[], /* i : SBA signals */ + const Word16 sba_order, /* i : SBA order */ + const Word16 sba_planar, /* i : SBA planar flag */ + const Word16 input_frame /* i : frame length */ ); + void tdm_configure_dec_fx( - const Word16 ivas_format, /* i : IVAS format */ - const Word16 ism_mode, /* i : ISM mode in combined format */ - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word16 *tdm_ratio_idx, /* o : ratio index */ - const Word16 nb_bits_metadata /* i : number of metadata bits */ + const Word16 ivas_format, /* i : IVAS format */ + const Word16 ism_mode, /* i : ISM mode in combined format */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word16 *tdm_ratio_idx, /* o : ratio index */ + const Word16 nb_bits_metadata /* i : number of metadata bits */ ); void ivas_param_mc_metadata_open_fx( - const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* o : handle for the Parametric MC parameter coding state */ + const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* o : handle for the Parametric MC parameter coding state */ ); Word16 mdct_classifier_ivas_fx( - Encoder_State *st, /* i/o: Encoder state variable */ - const Word16 *fft_buff, /* i : FFT spectrum from fft_rel */ - const Word32 enerBuffer[], /* i : energy buffer */ - Word16 enerBuffer_exp, /* i: enenrgy buffer exponent */ - const Word32 brate /* i : current brate, IVAS: nominal bitrate, EVS: st->total_brate */ + Encoder_State *st, /* i/o: Encoder state variable */ + const Word16 *fft_buff, /* i : FFT spectrum from fft_rel */ + const Word32 enerBuffer[], /* i : energy buffer */ + Word16 enerBuffer_exp, /* i: enenrgy buffer exponent */ + const Word32 brate /* i : current brate, IVAS: nominal bitrate, EVS: st->total_brate */ ); + /*----------------------------------------------------------------------------------* * Range Coder prototypes *----------------------------------------------------------------------------------*/ void rc_uni_enc_init_fx( - RangeUniEncState *rc_st_enc /* i/o: RC state handle */ + RangeUniEncState *rc_st_enc /* i/o: RC state handle */ ); void rc_uni_enc_encode_fast_fx( - RangeUniEncState *rc_st_enc, /* i/o: RC state handle */ - const UWord16 cum_freq, /* i : Cumulative frequency up to symbol */ - const UWord16 sym_freq, /* i : Symbol frequency */ - const UWord16 tot_shift /* i : Total frequency as a power of 2 */ + RangeUniEncState *rc_st_enc, /* i/o: RC state handle */ + const UWord16 cum_freq, /* i : Cumulative frequency up to symbol */ + const UWord16 sym_freq, /* i : Symbol frequency */ + const UWord16 tot_shift /* i : Total frequency as a power of 2 */ ); void rc_uni_enc_encode_symbol_fastS_fx( - RangeUniEncState *rc_st_enc, /* i/o: Encoder state */ - const UWord16 symbol, /* i : Symbol to encode */ - const UWord16 cum_freq[], /* i : Cumulative frequency up to symbol */ - const UWord16 sym_freq[], /* i : Symbol frequency */ - const UWord16 tot_shift /* i : Total frequency as a power of 2 */ + RangeUniEncState *rc_st_enc, /* i/o: Encoder state */ + const UWord16 symbol, /* i : Symbol to encode */ + const UWord16 cum_freq[], /* i : Cumulative frequency up to symbol */ + const UWord16 sym_freq[], /* i : Symbol frequency */ + const UWord16 tot_shift /* i : Total frequency as a power of 2 */ ); /*! r: Total number of bits produced */ Word16 rc_uni_enc_finish_fx( - RangeUniEncState *rc_st_enc /* i/o: RC state handle */ + RangeUniEncState *rc_st_enc /* i/o: RC state handle */ ); /*! r: Total number of bits produced */ Word16 rc_uni_enc_virtual_finish_fx( - RangeUniEncState *rc_st_enc /* i : RC state handle */ + RangeUniEncState *rc_st_enc /* i : RC state handle */ ); void rc_uni_enc_encode_bits_fx( - RangeUniEncState *rc_st_enc, /* i/o: RC state handle */ - const UWord16 value, /* i : Value to encode */ - const Word16 bits /* i : Number of bits */ + RangeUniEncState *rc_st_enc, /* i/o: RC state handle */ + const UWord16 value, /* i : Value to encode */ + const Word16 bits /* i : Number of bits */ ); void stereo_dft_enc_process_fx( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - const Word16 vad_flag_dtx[], /* i : VAD dtx flags */ - const Word16 vad_hover_flag[], /* i : VAD hangover flags */ - const Word16 input_frame /* i : input frame length */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const Word16 vad_flag_dtx[], /* i : VAD dtx flags */ + const Word16 vad_hover_flag[], /* i : VAD hangover flags */ + const Word16 input_frame /* i : input frame length */ ); void stereo_dft_cng_side_gain_fx( - STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo handle */ - STEREO_CNG_ENC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ - const Word32 core_brate, /* i : core bitrate */ - const Word32 last_core_brate, /* i : last core bitrate */ - const Word16 bwidth /* i : audio band-width */ + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo handle */ + STEREO_CNG_ENC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ + const Word32 core_brate, /* i : core bitrate */ + const Word32 last_core_brate, /* i : last core bitrate */ + const Word16 bwidth /* i : audio band-width */ ); Word16 quantize_sns_fx( - Word32 sns_in_fx[CPE_CHANNELS][NB_DIV][M], /* sns_e */ - Word32 snsQ_out_fx[CPE_CHANNELS][NB_DIV][M], /* sns_e */ + Word32 sns_in_fx[CPE_CHANNELS][NB_DIV][M], /* sns_e */ + Word32 snsQ_out_fx[CPE_CHANNELS][NB_DIV][M], /* sns_e */ Word16 sns_e, Encoder_State **sts, - Word16 *indices, /* Q0 */ - Word16 *zero_side_flag, /* Q0 */ - Word16 *sns_stereo_mode ); /* Q0 */ + Word16 *indices, /* Q0 */ + Word16 *zero_side_flag, /* Q0 */ + Word16 *sns_stereo_mode /* Q0 */ +); void stereo_enc_cng_init_fx( - STEREO_CNG_ENC_HANDLE hStereoCng /* i/o: stereo CNG encoder structure */ + STEREO_CNG_ENC_HANDLE hStereoCng /* i/o: stereo CNG encoder structure */ ); void stereo_cng_upd_counters_fx( - STEREO_CNG_ENC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ - const Word32 element_mode, /* i : element mode */ - const Word16 nbands, /* i : Number of bands in active */ - const Word32 sidSideGain[], /* i : SID side gains */ - const Word16 burst_ho_count, /* i : Hang-over count */ - Word16 *coh_fade_counter /* i : Coherence fade counter */ + STEREO_CNG_ENC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ + const Word32 element_mode, /* i : element mode */ + const Word16 nbands, /* i : Number of bands in active */ + const Word32 sidSideGain[], /* i : SID side gains */ + const Word16 burst_ho_count, /* i : Hang-over count */ + Word16 *coh_fade_counter /* i : Coherence fade counter */ ); - void stereo_dft_enc_sid_calc_coh_fx( - STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo handle */ - Word32 prev_cohBand[2 * ( STEREO_DFT_BAND_MAX / 2 )], /* i/o: Previous coherence Q31 */ - Word16 *td_active, /* i/o: TD stereo mode indicator */ - Word16 *first_SID, /* i/o: First SID indicator */ - Word32 *cohBand /* i/o: Coherence per band Q31 */ + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo handle */ + Word32 prev_cohBand[2 * ( STEREO_DFT_BAND_MAX / 2 )], /* i/o: Previous coherence Q31 */ + Word16 *td_active, /* i/o: TD stereo mode indicator */ + Word16 *first_SID, /* i/o: First SID indicator */ + Word32 *cohBand /* i/o: Coherence per band Q31 */ ); void stereo_dft_enc_sid_coh_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - Word32 *mem_cohBand, /* i/o: Coherence memory */ - const Word16 nbands, /* i : number of DFT stereo bands */ - Word16 *nb_bits, /* i/o: number of bits written */ - Word32 *cohBand /* i/o: Coherence per band */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + Word32 *mem_cohBand, /* i/o: Coherence memory */ + const Word16 nbands, /* i : number of DFT stereo bands */ + Word16 *nb_bits, /* i/o: number of bits written */ + Word32 *cohBand /* i/o: Coherence per band */ ); void stereo_dft_enc_write_BS_fx( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - Word16 *nb_bits /* o : number of bits written */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + Word16 *nb_bits /* o : number of bits written */ ); void stereo_dft_enc_res_fx( - STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ - const Word32 *input_8k, /* i : input buffer sampled at 8kHz Q15 */ - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - Word16 *nb_bits, /* o : number of bits written */ - const Word16 max_bits ); + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ + const Word32 *input_8k, /* i : input buffer sampled at 8kHz Q15 */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + Word16 *nb_bits, /* o : number of bits written */ + const Word16 max_bits +); Word32 ECSQ_encode_target_SNR_fx( ECSQ_instance *ecsq_inst, @@ -2917,306 +2939,314 @@ Word32 ECSQ_encode_target_SNR_fx( const Word32 target_SNR, // Q25 const Word16 max_bits, Word32 *output, - Word16 *global_gain_index_output ); + Word16 *global_gain_index_output +); void ECSQ_quantize_vector_fx( const Word32 *input, const Word16 input_e, const Word32 global_gain, // Q15 const Word16 N, - Word16 *output ); + Word16 *output +); Word32 ECSQ_compute_optimal_gain_fx( // Q15 const Word32 *input, const Word16 input_e, const Word16 N, - const Word16 *output ); + const Word16 *output +); void spectral_balancer_fx16( - Word16 *signal, /* i/o : signal Qx */ - Word16 *mem, /* i/o : mem Qx */ - const Word16 lg, /* i : input signal length */ - const Word16 coeff_set /* i : coefficient set */ + Word16 *signal, /* i/o : signal Qx */ + Word16 *mem, /* i/o : mem Qx */ + const Word16 lg, /* i : input signal length */ + const Word16 coeff_set /* i : coefficient set */ ); void spectral_balancer_fx( - Word32 *signal, /* i/o : signal Qx */ - Word32 *mem, /* i/o : mem Qx */ - const Word16 lg, /* i : input signal length */ - const Word16 coeff_set /* i : coefficient set */ + Word32 *signal, /* i/o : signal Qx */ + Word32 *mem, /* i/o : mem Qx */ + const Word16 lg, /* i : input signal length */ + const Word16 coeff_set /* i : coefficient set */ ); void stereo_icBWE_preproc_fx( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - const Word16 input_frame, /* i : input frame length */ - Word16 shb_speech_nonref[], /* o : SHB speech non-ref channel */ - Word16 q_shb_speech_nonref /* i : Q SHB speech non-ref channel */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const Word16 input_frame, /* i : input frame length */ + Word16 shb_speech_nonref[], /* o : SHB speech non-ref channel */ + Word16 q_shb_speech_nonref /* i : Q SHB speech non-ref channel */ ); void core_switching_pre_enc_ivas_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 *old_inp_12k8, /* i : old input signal @12.8kHz */ - const Word16 q_old_inp_12k8, /* i : Q old input signal @12.8kHz */ - const Word16 *old_inp_16k, /* i : old input signal @16kHz */ - const Word16 q_old_inp_16k, /* i : Q old input signal @16kHz */ - const Word16 active_cnt, /* i : active frame counter */ - const Word16 last_element_mode /* i : last_element_mode */ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 *old_inp_12k8, /* i : old input signal @12.8kHz */ + const Word16 q_old_inp_12k8, /* i : Q old input signal @12.8kHz */ + const Word16 *old_inp_16k, /* i : old input signal @16kHz */ + const Word16 q_old_inp_16k, /* i : Q old input signal @16kHz */ + const Word16 active_cnt, /* i : active frame counter */ + const Word16 last_element_mode /* i : last_element_mode */ ); Word16 ivas_acelp_tcx20_switching_fx( - Encoder_State *st, /* i/o: encoder state structure */ - Word16 *inp_fx, /* i : new input signal */ - Word16 q_inp, /* i : i/p Q */ - Word16 *wsp, /* i : input weighted signal */ - Word16 non_staX, /* i : unbound non-stationarity for sp/mu clas */ - Word16 *pitch_fr, /* i : fraction pitch values */ - Word16 *voicing_fr, /* i : fractional voicing values */ - Word32 currFlatness, /* i : flatness */ - Word16 lsp_mid[M], /* i : LSPs at the middle of the frame */ - Word16 stab_fac, /* i : LP filter stability */ + Encoder_State *st, /* i/o: encoder state structure */ + Word16 *inp_fx, /* i : new input signal */ + Word16 q_inp, /* i : i/p Q */ + Word16 *wsp, /* i : input weighted signal */ + Word32 non_staX, /* i : unbound non-stationarity for sp/mu clas */ + Word16 *pitch_fr, /* i : fraction pitch values */ + Word16 *voicing_fr, /* i : fractional voicing values */ + Word32 currFlatness, /* i : flatness */ + Word16 lsp_mid[M], /* i : LSPs at the middle of the frame */ + Word16 stab_fac, /* i : LP filter stability */ Word32 *res_cod_SNR_M, Word16 *res_cod_SNR_M_e, - const Word16 flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz */ + const Word16 flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz */ ); void encod_gen_2sbfr( - Encoder_State *st, /* i/o: state structure */ - const Word16 speech[], /* i : input speech */ - const Word16 Aw[], /* i : weighted A(z) unquantized for subframes */ - const Word16 Aq[], /* i : LP coefficients */ - const Word16 *res, /* i : residual signal */ - Word16 *syn, /* i/o: core synthesis */ - Word16 *exc, /* i/o: current non-enhanced excitation */ - Word16 *exc2, /* i/o: current enhanced excitation */ - Word16 *pitch_buf, /* i/o: floating pitch values for each subframe */ - Word16 *voice_factors, /* o : voicing factors */ - Word16 *bwe_exc, /* o : excitation for SWB TBE */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 tdm_Pri_pitch_buf[], /* i : pitch values for primary channel */ + Encoder_State *st, /* i/o: state structure */ + const Word16 speech[], /* i : input speech */ + const Word16 Aw[], /* i : weighted A(z) unquantized for subframes */ + const Word16 Aq[], /* i : LP coefficients */ + const Word16 *res, /* i : residual signal */ + Word16 *syn, /* i/o: core synthesis */ + Word16 *exc, /* i/o: current non-enhanced excitation */ + Word16 *exc2, /* i/o: current enhanced excitation */ + Word16 *pitch_buf, /* i/o: floating pitch values for each subframe */ + Word16 *voice_factors, /* o : voicing factors */ + Word16 *bwe_exc, /* o : excitation for SWB TBE */ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const Word16 tdm_Pri_pitch_buf[], /* i : pitch values for primary channel */ Word16 Q_new, - Word16 shift ); + Word16 shift +); void acelp_fast_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 cdk_index, /* i : codebook index */ - const Word16 dn_orig[L_SUBFR], - /* i : corr. between target and h[]. */ // Q_new + 1 + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 cdk_index, /* i : codebook index */ + const Word16 dn_orig[L_SUBFR], /* i : corr. between target and h[]. Q_dn */ Word16 Q_dn, - const Word16 cn[L_SUBFR], - /* i : residual after long term prediction */ // Q_new + 1 - const Word16 H[L_SUBFR], - /* i : impulse response of weighted synthesis filter */ // e(norm_s(H[0])+1) - Word16 code[L_SUBFR], /* o : algebraic (fixed) codebook excitation */ - Word16 y[], /* o : filtered fixed codebook excitation */ - const Word16 L_subfr /* i : subframe length */ + const Word16 cn[L_SUBFR], /* i : residual after long term prediction q_cn*/ + const Word16 q_cn, + const Word16 H[L_SUBFR], /* i : impulse response of weighted synthesis filter e(norm_s(H[0])+1) */ + Word16 code[L_SUBFR], /* o : algebraic (fixed) codebook excitation */ + Word16 y[], /* o : filtered fixed codebook excitation */ + const Word16 L_subfr /* i : subframe length */ ); void ivas_mdct_quant_coder_fx( - CPE_ENC_HANDLE hCPE, /* i/o: Encoder CPE handle */ - Word16 tnsBits[CPE_CHANNELS][NB_DIV], /* i : bits needed for TNS parameters */ - Word16 tnsSize[CPE_CHANNELS][NB_DIV], /* i : size of TNS */ - Word16 p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to parameter array */ - const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */ + CPE_ENC_HANDLE hCPE, /* i/o: Encoder CPE handle */ + Word16 tnsBits[CPE_CHANNELS][NB_DIV], /* i : bits needed for TNS parameters */ + Word16 tnsSize[CPE_CHANNELS][NB_DIV], /* i : size of TNS */ + Word16 p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to parameter array */ + const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */ ); void ivas_mdct_tcx10_bit_distribution_fx( - Word16 target_bitsTCX10[NB_DIV], /* o : target bit distribution */ - const Word16 nbits_tcx, /* i : TCX bits */ - const Word16 nTnsBitsTCX10[NB_DIV] /* i : TNS bits */ + Word16 target_bitsTCX10[NB_DIV], /* o : target bit distribution */ + const Word16 nbits_tcx, /* i : TCX bits */ + const Word16 nTnsBitsTCX10[NB_DIV] /* i : TNS bits */ ); void QuantizeSpectrum_ivas_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 A_fx[], /* i : quantized coefficients NxAz_q[M+1] */ - const Word16 Aqind[], /* i : frame-independent quantized coefficients (M+1) */ - Word16 gainlpc_fx[], /* i : MDCT gains of the previous frame */ - Word16 gainlpc_e[], /* i : exponents of MDCT gains of the previous frame */ - Word16 synth[], /* o : synthesis buffer, Q0 */ - const Word16 nb_bits, /* i : bit budget */ - const Word16 tnsSize, /* i : number of tns parameters put into prm */ - Word16 prm[], /* o : tcx parameters */ - const Word16 frame_cnt, /* i : frame counter in the super_frame */ - CONTEXT_HM_CONFIG *hm_cfg, /* i : HM configuration */ - const Word16 vad_hover_flag /* i : VAD hangover flag */ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 A_fx[], /* i : quantized coefficients NxAz_q[M+1] */ + const Word16 Aqind[], /* i : frame-independent quantized coefficients (M+1) */ + Word16 gainlpc_fx[], /* i : MDCT gains of the previous frame */ + Word16 gainlpc_e[], /* i : exponents of MDCT gains of the previous frame */ + Word16 synth[], /* o : synthesis buffer, Q0 */ + const Word16 nb_bits, /* i : bit budget */ + const Word16 tnsSize, /* i : number of tns parameters put into prm */ + Word16 prm[], /* o : tcx parameters */ + const Word16 frame_cnt, /* i : frame counter in the super_frame */ + CONTEXT_HM_CONFIG *hm_cfg, /* i : HM configuration */ + const Word16 vad_hover_flag /* i : VAD hangover flag */ ); void InternalTCXDecoder_fx( - Encoder_State *st, /* i/o: state handle */ - const Word16 frame_cnt, /* i : frame counter in the super_frame */ - const Word16 L_frameTCX, /* i : full frame length */ - const Word16 L_frame, /* i : frame length */ - const Word16 L_spec, /* i : length of the coded spectrum */ - const Word16 tcx_offset, /* i : folding point offset relative to the end of the previous frame */ - const Word16 noiseFillingBorder, /* i : noise filling border */ - const Word32 *x_quant_fx, /* i : quantized spectrum */ - const Word32 ener_fx, /* i : energy of the quantized spectrum */ - const Word16 ener_e, /* i : energy of the quantized spectrum exponent */ - Word16 lf_deemph_fact_fx[], /* i/o: low frequency deemphasis factors */ - const Word16 fac_ns_fx, /* i : noise filling level, Q15 */ - const Word16 nf_seed, /* i : noise filling random seed, Q0 */ - const Word16 *A_fx, /* i : LPC representation of the FDNS gains */ - Word16 gainlpc_fx[], /* i/o: FDNS gains */ - Word16 gainlpc_e[], /* i/o: FDNS gains exponent */ - const Word16 hm_active, /* i : flag indicating if the harmonic model is active */ - Word16 gain_tcx_fx, /* i/o: global gain / quantized global gain */ - Word16 *gain_tcx_e, /* i/o: global gain / quantized global gain exponent */ - Word32 spectrum_fx[], /* o : dequantized spectrum */ - Word16 *spectrum_e, /* o : dequantized spectrum */ - Word16 synth[], /* o : time domain signal */ - Word16 *gain_tcx_q /* o : quantized global gain (at low bitrates) */ + Encoder_State *st, /* i/o: state handle */ + const Word16 frame_cnt, /* i : frame counter in the super_frame */ + const Word16 L_frameTCX, /* i : full frame length */ + const Word16 L_frame, /* i : frame length */ + const Word16 L_spec, /* i : length of the coded spectrum */ + const Word16 tcx_offset, /* i : folding point offset relative to the end of the previous frame */ + const Word16 noiseFillingBorder, /* i : noise filling border */ + const Word32 *x_quant_fx, /* i : quantized spectrum */ + const Word32 ener_fx, /* i : energy of the quantized spectrum */ + const Word16 ener_e, /* i : energy of the quantized spectrum exponent */ + Word16 lf_deemph_fact_fx[], /* i/o: low frequency deemphasis factors */ + const Word16 fac_ns_fx, /* i : noise filling level, Q15 */ + const Word16 nf_seed, /* i : noise filling random seed, Q0 */ + const Word16 *A_fx, /* i : LPC representation of the FDNS gains */ + Word16 gainlpc_fx[], /* i/o: FDNS gains */ + Word16 gainlpc_e[], /* i/o: FDNS gains exponent */ + const Word16 hm_active, /* i : flag indicating if the harmonic model is active */ + Word16 gain_tcx_fx, /* i/o: global gain / quantized global gain */ + Word16 *gain_tcx_e, /* i/o: global gain / quantized global gain exponent */ + Word32 spectrum_fx[], /* o : dequantized spectrum */ + Word16 *spectrum_e, /* o : dequantized spectrum */ + Word16 synth[], /* o : time domain signal */ + Word16 *gain_tcx_q /* o : quantized global gain (at low bitrates) */ ); void stereo_tcx_core_enc( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 new_samples_12k8[], /* i : buffer of input signal @12.8 kHz */ - const Word16 new_samples_16k[], /* i : buffer of input signal @16 kHz */ - const Word16 Aw_fx[], /* i : weighted A(z) unquant. for subframes, Q12 */ - Word16 lsp_new_fx[], /* i : LSPs at the end of the frame, Q15 */ - Word16 lsp_mid_fx[], /* i : LSPs in the middle of the frame, Q15 */ - Word16 pitch_buf_fx[NB_SUBFR16k], /* o : pitch for each subframe, Q6 */ - const Word16 last_element_mode, /* i : last element mode, Q0 */ - const Word16 vad_hover_flag, /* i : VAD hangover flag, Q0 */ - Word16 Q_new ); - + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 new_samples_12k8[], /* i : buffer of input signal @12.8 kHz */ + const Word16 new_samples_16k[], /* i : buffer of input signal @16 kHz */ + const Word16 Aw_fx[], /* i : weighted A(z) unquant. for subframes,Q12*/ + Word16 lsp_new_fx[], /* i : LSPs at the end of the frame, Q15 */ + Word16 lsp_mid_fx[], /* i : LSPs in the middle of the frame, Q15 */ + Word16 pitch_buf_fx[NB_SUBFR16k], /* o : pitch for each subframe, Q6 */ + const Word16 last_element_mode, /* i : last element mode, Q0 */ + const Word16 vad_hover_flag, /* i : VAD hangover flag, Q0 */ + Word16 Q_new +); Word16 transient_analysis_ivas_fx( - TRAN_DET_HANDLE hTranDet, /* i : handle transient detection */ - const Word16 cor_map_LT[], /* i : LT correlation map Q_cor_map = Qx */ - Word16 Q_cor_map, - const Word16 multi_harm_limit, /* i : multi harmonic threshold Q_multi_harm_limit = Qx */ - Word16 Q_multi_harm_limit ); + TRAN_DET_HANDLE hTranDet, /* i : handle transient detection */ + const Word16 cor_map_LT[], /* i : LT correlation map Q_cor_map = Qx */ + const Word16 Q_cor_map, + const Word16 multi_harm_limit, /* i : multi harmonic threshold Q_multi_harm_limit = Qx */ + const Word16 Q_multi_harm_limit +); void set_transient_stereo_fx( - CPE_ENC_HANDLE hCPE, /* i : CPE structure */ - Word32 currFlatness[] /* i/o: current flatness Q21*/ + CPE_ENC_HANDLE hCPE, /* i : CPE structure */ + Word32 currFlatness[] /* i/o: current flatness Q21*/ ); void ivas_smc_mode_selection_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word32 element_brate, /* i : element bitrate */ - Word16 smc_dec, /* i : raw decision of the 1st stage classifier*/ - const Word16 relE, /* i : relative frame energy, Q8 */ - const Word16 Etot, /* i : total frame energy, Q8 */ - Word16 *attack_flag, /* i/o: attack flag (GSC or TC) */ - const Word16 *inp, /* i : input signal */ - const Word16 Q_new, /* i : Q of input signal */ - const Word16 S_map[], /* i : short-term correlation map, Q7 */ - const Word16 flag_spitch /* i : flag to indicate very short stable pitch*/ + Encoder_State *st, /* i/o: encoder state structure */ + const Word32 element_brate, /* i : element bitrate */ + Word16 smc_dec, /* i : raw decision of the 1st stage classifier*/ + const Word16 relE, /* i : relative frame energy, Q8 */ + const Word16 Etot, /* i : total frame energy, Q8 */ + Word16 *attack_flag, /* i/o: attack flag (GSC or TC) */ + const Word16 *inp, /* i : input signal */ + const Word16 Q_new, /* i : Q of input signal */ + const Word16 S_map[], /* i : short-term correlation map, Q7 */ + const Word16 flag_spitch /* i : flag to indicate very short stable pitch*/ ); /*! r: element mode */ Word16 select_stereo_mode_fx( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - const IVAS_FORMAT ivas_format /* i : IVAS format */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ ); void stereo_classifier_features_ivas_fx( - STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ - const Word16 idchan, /* i : channel ID */ - const Word16 element_mode, /* i : element mode */ - const Word16 vad_flag, /* i : VAD flag */ - Word16 lsf_new_fx[], /* i : LSFs at the end of the frame Q1*1.28 */ - Word32 epsP_fx[], /* i : LP analysis residual energies for each iteration*/ - Word16 pitch[], /* i : open-loop pitch values for quantiz. Q0 */ - Word16 voicing_fx[], /* i : OL maximum normalized correlation Q15 */ - Word32 cor_map_sum_fx, /* i : speech/music clasif. parameter */ - Word32 non_staX_fx, /* i : unbound non-stationarity for sp/mu clas. */ - Word16 sp_div_fx, /* i : spectral diversity feature */ - const Word16 clas, /* i : signal class */ - Word16 epsP_e, /*exponent for epsP_fx */ - Word16 cor_map_sum_e, /*exponent for cor_map_sum_fx */ - Word16 non_staX_e, /*exponent for non_staX_fx */ - Word16 sp_div_e /*exponent for sp_div_fx */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + const Word16 idchan, /* i : channel ID */ + const Word16 element_mode, /* i : element mode */ + const Word16 vad_flag, /* i : VAD flag */ + Word16 lsf_new_fx[], /* i : LSFs at the end of the frame Q1*1.28 */ + Word32 epsP_fx[], /* i : LP analysis residual energies for each iteration*/ + Word16 pitch[], /* i : open-loop pitch values for quantiz. Q0 */ + Word16 voicing_fx[], /* i : OL maximum normalized correlation Q15 */ + Word32 cor_map_sum_fx, /* i : speech/music clasif. parameter */ + Word32 non_staX_fx, /* i : unbound non-stationarity for sp/mu clas. */ + Word16 sp_div_fx, /* i : spectral diversity feature */ + const Word16 clas, /* i : signal class */ + Word16 epsP_e, /*exponent for epsP_fx */ + Word16 cor_map_sum_e, /*exponent for cor_map_sum_fx */ + Word16 non_staX_e, /*exponent for non_staX_fx */ + Word16 sp_div_e /*exponent for sp_div_fx */ ); void tdm_ol_pitch_comparison_fx( - CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - Word16 pitch_fr[CPE_CHANNELS][NB_SUBFR], /* i/o: fractional pitch values, Q6 */ - Word16 voicing_fr[CPE_CHANNELS][NB_SUBFR] /* i/o: fractional pitch gains, Q15 */ + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + Word16 pitch_fr[CPE_CHANNELS][NB_SUBFR], /* i/o: fractional pitch values, Q6 */ + Word16 voicing_fr[CPE_CHANNELS][NB_SUBFR] /* i/o: fractional pitch gains, Q15 */ ); void xtalk_classifier_td_fx( - CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ ); void unclr_classifier_td_fx( - CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ ); void quantize_direction_frame2D_fx( - IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ Word32 azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22 Word32 elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES] // Q22 ); Word16 quantize_direction2D_fx( - Word32 phi, /* i : input azimuth value Q22 */ - const Word16 no_cw, /* i : number of bits */ - Word32 *phi_q, /* o : quantized azimuth value Q22 */ - UWord16 *index_phi, /* o : quantized azimuth index */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ + Word32 phi, /* i : input azimuth value Q22 */ + const Word16 no_cw, /* i : number of bits */ + Word32 *phi_q, /* o : quantized azimuth value Q22 */ + UWord16 *index_phi, /* o : quantized azimuth index */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ); void restore_metadata_buffer_fx( BSTR_ENC_HANDLE hMetaData, const Word16 next_ind_start, - const Word16 bit_pos_start ); - + const Word16 bit_pos_start +); void small_requantize_direction_frame_fx( - IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ Word32 azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22 Word32 elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22 const Word16 raw_flag[MASA_MAXIMUM_CODING_SUBBANDS], Word16 bits_dir_bands[MASA_MAXIMUM_CODING_SUBBANDS], - Word16 *diff ); + Word16 *diff +); void ivas_param_ism_stereo_dmx_fx( - Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ - Word32 *data[MAX_NUM_OBJECTS], /* i/o: input signal/stereo dmx Qx */ - const Word16 input_frame /* i : Length of input frame */ + Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ + Word32 *data[MAX_NUM_OBJECTS], /* i/o: input signal/stereo dmx Qx */ + const Word16 input_frame /* i : Length of input frame */ ); void ivas_param_ism_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - Word32 *data[MAX_NUM_OBJECTS], /* i : input signal q_pcm_in */ - const Word16 input_frame /* i : input frame length per channel */ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + Word32 *data[MAX_NUM_OBJECTS], /* i : input signal q_pcm_in */ + const Word16 input_frame /* i : input frame length per channel */ ); ISM_MODE ivas_ism_mode_select( - const Word16 nchan_inp, /* i : number of input objects */ - const Word32 ivas_total_brate /* i : IVAS total bitrate */ + const Word16 nchan_inp, /* i : number of input objects */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); void ivas_fb_mixer_update_prior_input_fx( - IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ - Word32 *pcm_in_fx[], /* i : input audio channels */ - const Word16 length, /* i : length of time slot */ - const Word16 nchan_fb_in /* i : number of analysis channels */ + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + Word32 *pcm_in_fx[], /* i : input audio channels */ + const Word16 length, /* i : length of time slot */ + const Word16 nchan_fb_in /* i : number of analysis channels */ ); void ivas_fb_mixer_get_windowed_fr_fx( - IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ Word32 *pcm_in_fx[], Word32 *frame_f_real_fx[], Word32 *frame_f_imag_fx[], - const Word16 length, /* i : number of new samples in time slot */ - const Word16 mdft_len, /* i : MDFT frame length */ - const Word16 nchan_fb_in, /* i : number of analysis channels */ - Word16 gb ); + const Word16 length, /* i : number of new samples in time slot */ + const Word16 mdft_len, /* i : MDFT frame length */ + const Word16 nchan_fb_in, /* i : number of analysis channels */ + Word16 gb +); + void ivas_omasa_set_config_fx( - OMASA_ENC_HANDLE hOMasa, /* i/o: OMASA encoder handle */ - MASA_ENCODER_HANDLE hMasa, /* i : MASA encoder handle */ - const Word32 input_Fs, /* i : Input sample rate */ - const ISM_MODE ism_mode /* i : ISM mode */ + OMASA_ENC_HANDLE hOMasa, /* i/o: OMASA encoder handle */ + MASA_ENCODER_HANDLE hMasa, /* i : MASA encoder handle */ + const Word32 input_Fs, /* i : Input sample rate */ + const ISM_MODE ism_mode /* i : ISM mode */ ); + Word16 ivas_omasa_ener_brate_fx( - const Word16 nchan_ism, /* i : number of ISMs */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - Word32 *data_f[], /* i : Input / transport audio signals */ - const Word16 input_frame, /* i : Input frame size */ - Word16 data_e /*i:exponent for data_f */ + const Word16 nchan_ism, /* i : number of ISMs */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + Word32 *data_f[], /* i : Input / transport audio signals */ + const Word16 input_frame, /* i : Input frame size */ + const Word16 data_e /* i : exponent for data_f */ ); + void computeDiffuseness_mdft_fx( Word32 **buffer_intensity[DIRAC_NUM_DIMS], const Word32 *buffer_energy, @@ -3228,7 +3258,7 @@ void computeDiffuseness_mdft_fx( Word16 *q_diffuseness /*Ouput Q*/ ); -void computeDirectionVectors_fixed( +void computeDirectionVectors_fx2( Word32 *intensity_real_x, Word32 *intensity_real_y, Word32 *intensity_real_z, @@ -3237,14 +3267,10 @@ void computeDirectionVectors_fixed( Word32 *direction_vector_x, /*Q30*/ Word32 *direction_vector_y, /*Q30*/ Word32 *direction_vector_z, /*Q30*/ - Word16 i_e /*Exponent of all the intensity buffers*/ -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC - , - Word16 *i_e_band -#endif + Word16 i_e, /*Exponent of all the intensity buffers*/ + Word16 *i_e_band ); - UWord8 ivas_masa_surrcoh_signicant_fx( Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Surround coherence Q31 */ Word32 diffuse_to_total_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Diffuse to total ratio Q31 */ @@ -3252,32 +3278,35 @@ UWord8 ivas_masa_surrcoh_signicant_fx( const Word16 nBands /* i : Number of frequency bands */ ); + /*----------------------------------------------------------------------------------* * McMASA prototypes *----------------------------------------------------------------------------------*/ ivas_error ivas_mcmasa_enc_open_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); + void ivas_mcmasa_enc_close_fx( - MCMASA_ENC_HANDLE *hMcMasa, /* i/o: encoder McMASA handle */ - const Word32 input_Fs /* i : input sampling rate */ + MCMASA_ENC_HANDLE *hMcMasa, /* i/o: encoder McMASA handle */ + const Word32 input_Fs /* i : input sampling rate */ ); ivas_error ivas_mcmasa_enc_reconfig_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); void ivas_mcmasa_enc_fx( - MCMASA_ENC_HANDLE hMcMasa, /* i/o: Encoder McMASA handle */ - IVAS_QMETADATA_HANDLE hQMeta, /* o : Qmetadata handle */ - MASA_ENCODER_HANDLE hMasa, /* i/o: Encoder MASA handle */ - Word32 *data_f[], /* i : Input frame of audio */ - const Word16 input_frame, /* i : Input frame size */ - const Word16 nchan_transport, /* i : Number of transport channels */ - const Word16 nchan_inp, /* i : Number of input channels */ - const Word16 q_inp /* i : Input data q-format */ + MCMASA_ENC_HANDLE hMcMasa, /* i/o: Encoder McMASA handle */ + IVAS_QMETADATA_HANDLE hQMeta, /* o : Qmetadata handle */ + MASA_ENCODER_HANDLE hMasa, /* i/o: Encoder MASA handle */ + Word32 *data_f[], /* i : Input frame of audio */ + const Word16 input_frame, /* i : Input frame size */ + const Word16 nchan_transport, /* i : Number of transport channels */ + const Word16 nchan_inp, /* i : Number of input channels */ + const Word16 q_inp /* i : Input data q-format */ ); + void ivas_mcmasa_param_est_enc_fx( MCMASA_ENC_HANDLE hMcMasa, /* i : McMASA encoder structure */ MASA_ENCODER_HANDLE hMasa, /* i : MASA encoder structure */ @@ -3293,111 +3322,111 @@ void ivas_mcmasa_param_est_enc_fx( ); void computeReferencePower_enc_fx( - const Word16 *band_grouping, /* i : Band grouping for estimation */ - Word32 Cldfb_RealBuffer[][DIRAC_NO_FB_BANDS_MAX], /* i : Real part of input signal */ - Word32 Cldfb_ImagBuffer[][DIRAC_NO_FB_BANDS_MAX], /* i : Imag part of input signal */ - Word32 *reference_power, /* o : Estimated power */ - const Word16 enc_param_start_band, /* i : first band to process */ - const Word16 num_freq_bands, /* i : Number of frequency bands */ - const IVAS_FORMAT ivas_format, /* i : ivas_format */ - Word16 ref_power_w, /* i : use 0 if hodirac is enabled */ - const Word16 nchan_ana, /* i : number of analysis channels */ - Word16 inp_q, /* i : q of cld buffers */ - Word16 *ref_q /* i : output q */ + const Word16 *band_grouping, /* i : Band grouping for estimation */ + Word32 Cldfb_RealBuffer[][DIRAC_NO_FB_BANDS_MAX], /* i : Real part of input signal */ + Word32 Cldfb_ImagBuffer[][DIRAC_NO_FB_BANDS_MAX], /* i : Imag part of input signal */ + Word32 *reference_power, /* o : Estimated power */ + const Word16 enc_param_start_band, /* i : first band to process */ + const Word16 num_freq_bands, /* i : Number of frequency bands */ + const IVAS_FORMAT ivas_format, /* i : ivas_format */ + Word16 ref_power_w, /* i : use 0 if hodirac is enabled */ + const Word16 nchan_ana, /* i : number of analysis channels */ + Word16 inp_q, /* i : q of cld buffers */ + Word16 q_reference_power[DIRAC_NO_FB_BANDS_MAX] ); void computeReferencePower_enc_fx_dirac( - const Word16 *band_grouping, /* i : Band grouping for estimation */ - Word32 Cldfb_RealBuffer[][DIRAC_NO_FB_BANDS_MAX], /* i : Real part of input signal */ - Word32 Cldfb_ImagBuffer[][DIRAC_NO_FB_BANDS_MAX], /* i : Imag part of input signal */ - Word16 e_Cldfb, /* i : exponent of Cldfb buffer */ - Word32 *reference_power, /* o : Estimated power */ - Word16 *e_reference, /* o : exponent of reference_power */ - const Word16 enc_param_start_band, /* i : first band to process */ - const Word16 num_freq_bands, /* i : Number of frequency bands */ - const IVAS_FORMAT ivas_format, /* i : ivas_format */ - Word16 ref_power_w, /* i : use 0 if hodirac is enabled */ - const Word16 nchan_ana, /* i : number of analysis channels */ - Word16 *mono_frame_count, /* i/o: Mono Frame Count */ - Word16 *dirac_mono_flag /* i/o: Mono Flag */ + const Word16 *band_grouping, /* i : Band grouping for estimation */ + Word32 Cldfb_RealBuffer[][DIRAC_NO_FB_BANDS_MAX], /* i : Real part of input signal */ + Word32 Cldfb_ImagBuffer[][DIRAC_NO_FB_BANDS_MAX], /* i : Imag part of input signal */ + Word16 e_Cldfb, /* i : exponent of Cldfb buffer */ + Word32 *reference_power, /* o : Estimated power */ + Word16 *e_reference, /* o : exponent of reference_power */ + const Word16 enc_param_start_band, /* i : first band to process */ + const Word16 num_freq_bands, /* i : Number of frequency bands */ + const IVAS_FORMAT ivas_format, /* i : ivas_format */ + Word16 ref_power_w, /* i : use 0 if hodirac is enabled */ + const Word16 nchan_ana, /* i : number of analysis channels */ + Word16 *mono_frame_count, /* i/o: Mono Frame Count */ + Word16 *dirac_mono_flag /* i/o: Mono Flag */ ); void ivas_omasa_enc_fx( - OMASA_ENC_HANDLE hOMasa, /* i/o: OMASA encoder handle */ - MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder handle */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handle */ - Word32 *data_in[], /* i/o: Input / transport audio signals */ - Word16 q_data, /* i:Q0 Stores the q for data_in_f */ - const Word16 input_frame, /* i : Input frame size */ - const Word16 nchan_transport, /* i : Number of transport channels */ - const Word16 nchan_ism, /* i : Number of objects for parameter analysis */ - const ISM_MODE ism_mode, /* i : ISM mode */ - Word32 *data_separated_object_fx, /* o : Separated object audio signal */ - Word16 *idx_separated_object /* o : Index of the separated object */ + OMASA_ENC_HANDLE hOMasa, /* i/o: OMASA encoder handle */ + MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder handle */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handle */ + Word32 *data_in[], /* i/o: Input / transport audio signals */ + Word16 q_data, /* i :Q0 Stores the q for data_in_f */ + const Word16 input_frame, /* i : Input frame size */ + const Word16 nchan_transport, /* i : Number of transport channels */ + const Word16 nchan_ism, /* i : Number of objects for parameter analysis*/ + const ISM_MODE ism_mode, /* i : ISM mode */ + Word32 *data_separated_object_fx, /* o : Separated object audio signal */ + Word16 *idx_separated_object /* o : Index of the separated object */ ); void mctStereoIGF_enc_fx( - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ - Encoder_State **sts, /* i/o: encoder state structure */ - Word32 *orig_spectrum_fx[MCT_MAX_CHANNELS][2], /* i : MDCT spectrum for ITF */ - Word16 q_origSpec, /* i : Q for MDCT spectrum */ - Word32 powerSpec_fx[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate */ - Word16 q_powerSpec[MCT_MAX_CHANNELS], /* i : Q for powSpec_fx */ - Word32 *powerSpecMsInv_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : same as powerSpec_fx but for inverse spect.*/ - Word16 q_powerSpecMsInv[MCT_MAX_CHANNELS], /* i : Q for powSpecMsInv_fx */ - Word32 *inv_spectrum_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ - const Word16 sp_aud_decision0[MCT_MAX_CHANNELS] /* i : speech audio decision */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + Word32 *orig_spectrum_fx[MCT_MAX_CHANNELS][2], /* i : MDCT spectrum for ITF */ + Word16 q_origSpec, /* i : Q for MDCT spectrum */ + Word32 *powerSpec[MCT_MAX_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate */ + Word16 q_powerSpec[MCT_MAX_CHANNELS], /* i : Q for powSpec_fx */ + Word32 *powerSpecMsInv_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : same as powerSpec_fx but for inverse spect.*/ + Word16 *q_powerSpecMsInv[MCT_MAX_CHANNELS][NB_DIV], /* i : Q for powSpecMsInv_fx */ + Word32 *inv_spectrum_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ + const Word16 sp_aud_decision0[MCT_MAX_CHANNELS] /* i : speech audio decision */ ); void ivas_mct_core_enc_fx( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ - CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ - const Word16 nChannels, /* i : number of channels to be coded */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 switch_bw, /* i : flag bandwidth switch occurance */ - const Word16 lfe_bits, /* i : bits spent for LFE */ - const Word16 sba_order /* i : Ambisonic (SBA) order */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ + const Word16 nChannels, /* i : number of channels to be coded */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 switch_bw, /* i : flag bandwidth switch occurance */ + const Word16 lfe_bits, /* i : bits spent for LFE */ + const Word16 sba_order /* i : Ambisonic (SBA) order */ ); - ivas_error mct_enc_reconfigure_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const UWord16 b_nchan_change /* i : flag indicating different channel count */ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const UWord16 b_nchan_change /* i : flag indicating different channel count */ ); Word16 quantize_phi_chan_compand_fx( - Word32 phi, /* i : azimuth value Q22 */ - Word32 *phi_hat, /* o : quantized azimuth Q22 */ - const Word16 n, /* i : azimuth codebook size */ - const Word16 theta_flag, /* i : flag signaling high elevation */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ + Word32 phi, /* i : azimuth value Q22 */ + Word32 *phi_hat, /* o : quantized azimuth Q22 */ + const Word16 n, /* i : azimuth codebook size */ + const Word16 theta_flag, /* i : flag signaling high elevation */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ); Word16 quantize_phi_chan_lbr_fx( - const Word32 phi, /* i : azimuth value, Q22 */ - Word32 *phi_hat, /* o : quantized azimuth, Q22 */ - const Word16 n /* i : azimuth codebook size */ + const Word32 phi, /* i : azimuth value, Q22 */ + Word32 *phi_hat, /* o : quantized azimuth, Q22 */ + const Word16 n /* i : azimuth codebook size */ ); UWord16 quantize_direction_fx( - const Word32 theta, /* i : input elevation value, Q22 */ - Word32 phi, /* i : input azimuth value, Q22 */ - const Word16 no_bits, /* i : number of bits */ - Word32 *theta_q, /* o : quantized elevation, Q22 */ - Word32 *phi_q, /* o : quantized azimuth, Q22 */ - UWord16 *index_theta, /* o : quantized elevation index */ - UWord16 *index_phi, /* o : quantized azimuth index */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ + const Word32 theta, /* i : input elevation value, Q22 */ + Word32 phi, /* i : input azimuth value, Q22 */ + const Word16 no_bits, /* i : number of bits */ + Word32 *theta_q, /* o : quantized elevation, Q22 */ + Word32 *phi_q, /* o : quantized azimuth, Q22 */ + UWord16 *index_theta, /* o : quantized elevation index */ + UWord16 *index_phi, /* o : quantized azimuth index */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ); Word16 quantize_direction2D_fx( - Word32 phi, /* i : input azimuth value Q22 */ - const Word16 no_cw, /* i : number of bits */ - Word32 *phi_q, /* o : quantized azimuth value Q22 */ - UWord16 *index_phi, /* o : quantized azimuth index */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ + Word32 phi, /* i : input azimuth value Q22 */ + const Word16 no_cw, /* i : number of bits */ + Word32 *phi_q, /* o : quantized azimuth value Q22 */ + UWord16 *index_phi, /* o : quantized azimuth index */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ); + void quantize_direction_frame_fx( IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ Word32 azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], /* o : Q22 */ @@ -3406,52 +3435,58 @@ void quantize_direction_frame_fx( ); ivas_error ivas_qmetadata_enc_encode_fx( - BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ - IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ - const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ + const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); ivas_error ivas_qmetadata_enc_encode_hr_384_512_fx( - BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ - IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ const Word16 bits_sph_idx, - const Word16 bits_sp_coh ); + const Word16 bits_sp_coh +); + void ivas_merge_masa_metadata_fx( - MASA_ENCODER_HANDLE hMasa, /* i/o: MASA enc handle. source for MASA metadata and combined metadata will be here */ - OMASA_SPATIAL_META_HANDLE hOMasaMeta /* i : ISM-object metadata to be merged with the MASA metadata */ + MASA_ENCODER_HANDLE hMasa, /* i/o: MASA enc handle. source for MASA metadata and combined metadata will be here */ + OMASA_SPATIAL_META_HANDLE hOMasaMeta /* i : ISM-object metadata to be merged with the MASA metadata */ ); /*! r: number of bits written */ void ivas_qmetadata_enc_sid_encode_fx( - BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ - IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */ - const Word16 masa_sid_descriptor, /* i : description of MASA SID coding structure*/ - const Word16 ivas_format /* i : ivas format */ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */ + const Word16 masa_sid_descriptor, /* i : description of MASA SID coding structure*/ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 ivas_format /* i : ivas format */ ); + void ivas_param_mc_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ - Word32 *data_f_fx[], /* i/o: input/transport MC data Q11 */ - const Word16 input_frame /* i : input frame length */ + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ + Word32 *data_f_fx[], /* i/o: input/transport MC data Q11 */ + const Word16 input_frame /* i : input frame length */ ); + void ivas_merge_masa_transports_fx( Word32 data_in_f1_fx[][L_FRAME48k], // Qx Word32 *data_in_f2_fx[], // Qx Word32 *data_out_f_fx[], // Qx const Word16 input_frame, - const Word16 num_transport_channels ); + const Word16 num_transport_channels +); void ivas_param_mc_enc_close_fx( - PARAM_MC_ENC_HANDLE *hParamMC, /* i/o: Parametric MC encoder handle */ - const Word32 input_Fs /* i : input sampling rate */ + PARAM_MC_ENC_HANDLE *hParamMC, /* i/o: Parametric MC encoder handle */ + const Word32 input_Fs /* i : input sampling rate */ ); ivas_error ivas_param_mc_enc_open_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); ivas_error ivas_param_mc_enc_reconfig_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); Word16 ivas_arith_encode_cmplx_cell_array_fx( @@ -3468,20 +3503,20 @@ Word16 ivas_arith_encode_cmplx_cell_array_fx( ); ivas_error stereo_dmx_evs_init_encoder_fx( - STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS_out, /* o : Stereo downmix for EVS encoder handle */ - const Word32 input_Fs /* i : input sampling rate */ + STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS_out, /* o : Stereo downmix for EVS encoder handle */ + const Word32 input_Fs /* i : input sampling rate */ ); void stereo_dmx_evs_enc_fx( - STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS, /* i/o: Stereo downmix for EVS encoder handle */ - const Word32 input_Fs, /* i : input sampling rate */ - Word16 data[CPE_CHANNELS * L_FRAME48k], /* i/o: input signal Q0 */ - const Word16 n_samples, /* i : number of input samples */ - const bool is_binaural /* i : indication that input is binaural audio */ + STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS, /* i/o: Stereo downmix for EVS encoder handle */ + const Word32 input_Fs, /* i : input sampling rate */ + Word16 data[CPE_CHANNELS * L_FRAME48k], /* i/o: input signal Q0 */ + const Word16 n_samples, /* i : number of input samples */ + const bool is_binaural /* i : indication that input is binaural audio */ ); void stereo_dmx_evs_close_encoder_fx( - STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS /* i/o: Stereo downmix for EVS encoder handle */ + STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS /* i/o: Stereo downmix for EVS encoder handle */ ); void ivas_omasa_encode_masa_to_total_fx( @@ -3489,71 +3524,78 @@ void ivas_omasa_encode_masa_to_total_fx( BSTR_ENC_HANDLE hMetaData, const Word16 low_bitrate_mode, const Word16 nbands, - const Word16 nblocks ); -ivas_error ivas_masa_enc_config_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ + const Word16 nblocks ); + +ivas_error ivas_masa_enc_config_fx( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); + ivas_error ivas_omasa_enc_config_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); void ivas_omasa_enc_close_fx( - OMASA_ENC_HANDLE *hOMasa /* i/o: encoder OMASA handle */ + OMASA_ENC_HANDLE *hOMasa /* i/o: encoder OMASA handle */ ); + ivas_error ivas_omasa_enc_open_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); void ivas_masa_estimate_energy_fx( - MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder structure */ - Word32 *data_fx[], /* i : Input audio channels Q(q_data) */ - const Word16 input_frame, /* i : frame length */ - const Word16 nchan_transport, /* i : number of MASA input/transport channels */ - Word16 q_data /* i : q for data_fx */ + MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder structure */ + Word32 *data_fx[], /* i : Input audio channels Q(q_data) */ + const Word16 input_frame, /* i : frame length */ + const Word16 nchan_transport, /* i : number of MASA input/transport channels */ + Word16 q_data /* i : q for data_fx */ ); void ivas_masa_enc_reconfigure_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); ivas_error ivas_masa_encode_fx( - MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder structure */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ - Word16 *nb_bits_metadata, /* o : number of metadata bits written */ - const Word16 nchan_transport, /* i : number of MASA input/transport channels */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 Opt_DTX_ON, /* i : DTX on flag */ - const Word16 element_mode, /* i : element mode */ - const ISM_MODE ism_mode, /* i : ISM format mode */ - const Word16 nchan_ism, /* i : number of ISM channels */ - ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS], /* i : ISM metadata handle */ - const Word16 idx_separated_object, /* i : index of the separated object */ - OMASA_ENC_HANDLE hOMasa, /* i : OMASA encoder handle */ - const Word16 ism_imp, /* i : importance of separated object */ - const Word16 flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ + MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder structure */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + Word16 *nb_bits_metadata, /* o : number of metadata bits written */ + const Word16 nchan_transport, /* i : number of MASA input/transport channels */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 Opt_DTX_ON, /* i : DTX on flag */ + const Word16 element_mode, /* i : element mode */ + const ISM_MODE ism_mode, /* i : ISM format mode */ + const Word16 nchan_ism, /* i : number of ISM channels */ + ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS], /* i : ISM metadata handle */ + const Word16 idx_separated_object, /* i : index of the separated object */ + OMASA_ENC_HANDLE hOMasa, /* i : OMASA encoder handle */ + const Word16 ism_imp, /* i : importance of separated object */ + const Word16 flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ ); void ivas_write_format_sid_fx( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word16 element_mode, /* i : element bitrate */ - BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const Word16 element_mode, /* i : element bitrate */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word16 sba_planar /* i : SBA planar flag */ ); -void ivas_write_format_fx( /* i/o: IVAS encoder structure */ - Encoder_Struct *st_ivas ); +void ivas_write_format_fx( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); ivas_error create_sce_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const Word16 sce_id, /* i : SCE # identifier */ - const Word32 element_brate /* i : element bitrate */ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const Word16 sce_id, /* i : SCE # identifier */ + const Word32 element_brate /* i : element bitrate */ ); ivas_error create_cpe_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const Word16 cpe_id, /* i : CPE # identifier */ - const Word32 element_brate /* i : element bitrate */ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const Word16 cpe_id, /* i : CPE # identifier */ + const Word32 element_brate /* i : element bitrate */ ); void ivas_quantise_real_values_fx( @@ -3563,7 +3605,8 @@ void ivas_quantise_real_values_fx( const Word32 max_value_fx, Word16 *index, Word32 *quant_fx, - const Word16 dim ); + const Word16 dim +); void ivas_quantise_real_values_enc_fx( const Word32 *values_fx, // Q28 @@ -3572,7 +3615,8 @@ void ivas_quantise_real_values_enc_fx( const Word32 max_value_fx, // Q28 Word16 *index, Word32 *quant_fx, // Q28 - const Word16 dim ); + const Word16 dim +); void ivas_quantise_real_values_enc_fx_varq( const Word32 *values_fx, @@ -3582,105 +3626,111 @@ void ivas_quantise_real_values_enc_fx_varq( Word16 *index, Word32 *quant_fx, const Word16 dim, - Word16 inp_q ); + Word16 inp_q +); void ivas_spar_quant_dtx_init_fx( ivas_spar_md_t *spar_md, - Word32 *min_max ); + Word32 *min_max +); void ivas_spar_quant_dtx_init_fx( ivas_spar_md_t *spar_md, - Word32 *min_max ); + Word32 *min_max +); void ivas_copy_band_coeffs_idx_to_arr( ivas_band_coeffs_ind_t *pBands_idx, const Word16 nB, Word16 *pSymbol_re, ivas_cell_dim_t *pCell_dims, - const ivas_coeffs_type_t coeff_type ); + const ivas_coeffs_type_t coeff_type +); void ivas_clear_band_coeffs_fx( ivas_band_coeffs_t *pband_coeffs, - const UWord16 num_bands ); + const UWord16 num_bands +); Word16 ivas_qmetadata_DecodeExtendedGR( UWord16 *bitstream, Word16 *index, const Word16 alph_size, - const Word16 gr_param ); + const Word16 gr_param +); void ivas_masa_combine_directions_fx( - MASA_ENCODER_HANDLE hMasa /* i/o: MASA encoder handle */ + MASA_ENCODER_HANDLE hMasa /* i/o: MASA encoder handle */ ); /*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */ Word16 ivas_get_df_ratio_bits_hodirac_fx( - const Word16 index_diff /* i : index of quantized diffuse-to-total ratio */ + const Word16 index_diff /* i : index of quantized diffuse-to-total ratio */ ); /*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */ Word16 ivas_get_df_ratio_bits_fx( - const Word16 index_diff /* i : index of quantized diffuse-to-total ratio */ + const Word16 index_diff /* i : index of quantized diffuse-to-total ratio */ ); void invdct4_transform_fx( - Word32 *v_fx, /* i : input vector */ - UWord8 *invdct_v, /* o : transformed vector */ - Word16 q ); + Word32 *v_fx, /* i : input vector */ + UWord8 *invdct_v, /* o : transformed vector */ + Word16 q +); void ivas_spar_param_to_masa_param_mapping_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ Word32 inIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ Word16 q_cldfb[6][CLDFB_SLOTS_PER_SUBFRAME], - const Word16 subframe /* i : Subframe to map */ + const Word16 subframe /* i : Subframe to map */ ); ivas_error ivas_binRenderer_open_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void ivas_binRenderer_close_fx( - BINAURAL_RENDERER_HANDLE *hBinRenderer /* i/o: decoder binaural renderer handle */ + BINAURAL_RENDERER_HANDLE *hBinRenderer /* i/o: decoder binaural renderer handle */ ); void ivas_init_binaural_hrtf_fx( - HRTFS_FASTCONV *HrtfFastConv /* i/o: FASTCONV HRTF structure */ + HRTFS_FASTCONV *HrtfFastConv /* i/o: FASTCONV HRTF structure */ ); ivas_error ivas_allocate_binaural_hrtf_fx( - HRTFS_FASTCONV *HrtfFastConv, /* i/o: FASTCONV HRTF structure */ - const AUDIO_CONFIG input_config, /* i : input audio configuration */ - const BINAURAL_INPUT_AUDIO_CONFIG bin_input_config, /* i : binaural input audio config */ - const RENDERER_TYPE renderer_type, /* i : renderer type */ - const Word16 allocate_init_flag /* i : Memory allocation flag */ + HRTFS_FASTCONV *HrtfFastConv, /* i/o: FASTCONV HRTF structure */ + const Word16 n_channels, /* i : number of input channels */ + const Word16 allocate_init_flag /* i : Memory allocation flag */ ); void ivas_binRenderer_fx( - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle*/ - const Word16 numTimeSlots, /* i : number of time slots to render */ - Word32 Cldfb_RealBuffer_Binaural_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ - Word32 Cldfb_ImagBuffer_Binaural_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ - Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ - Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ - Word16 *Q_in /* i : LS signals exp */ + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle*/ + const Word16 numTimeSlots, /* i : number of time slots to render */ + Word32 Cldfb_RealBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ + Word32 Cldfb_ImagBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ + Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + Word16 *Q_in /* i : LS signals exp */ ); void ivas_binaural_add_LFE_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word16 output_frame, /* i : length of input frame */ - Word32 *input_fx[], /* i : transport channels */ - Word32 *output_fx[] /* o : synthesized core-coder transport channels/DirAC output */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word16 output_frame, /* i : length of input frame */ + Word32 *input_fx[], /* i : transport channels */ + Word32 *output_fx[] /* o : synthesized core-coder transport channels/DirAC output */ ); void ivas_mc2sba_fx( - IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ - Word32 *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ - Word32 *buffer_td[], /* i/o: MC signals (on input) and the HOA3 (on output) */ - const Word16 output_frame, /* i : output frame length per channel */ - const Word16 sba_order, /* i : Ambisonic (SBA) order */ - const Word16 gain_lfe /* i : gain for LFE, 0 = ignore LFE */ + IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ + Word32 *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ + Word32 *buffer_td[], /* i/o: MC signals (on input) and the HOA3 (on output) */ + const Word16 output_frame, /* i : output frame length per channel */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word16 gain_lfe /* i : gain for LFE, 0 = ignore LFE */ ); void ivas_param_mc_mc2sba_cldfb_fx( @@ -3694,140 +3744,155 @@ void ivas_param_mc_mc2sba_cldfb_fx( ); void ivas_ism2sba_sf_fx( - Word32 *buffer_in_fx[], /* i : TC buffer */ - Word32 *buffer_out_fx[], /* o : TD signal buffers */ - ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ - const Word16 num_objects, /* i : number of objects */ - const Word16 n_samples_to_render, /* i : output frame length per channel */ - const Word16 offset, /* i : offset for the interpolatr */ - const Word16 sba_order /* i : Ambisonic (SBA) order */ + Word32 *buffer_in_fx[], /* i : TC buffer */ + Word32 *buffer_out_fx[], /* o : TD signal buffers */ + ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ + const Word16 num_objects, /* i : number of objects */ + const Word16 n_samples_to_render, /* i : output frame length per channel */ + const Word16 offset, /* i : offset for the interpolatr */ + const Word16 sba_order /* i : Ambisonic (SBA) order */ ); void panning_wrap_angles_fx( - const Word32 azi_deg, /* i : azimuth in degrees for panning direction (positive left) Q22 */ - const Word32 ele_deg, /* i : elevation in degrees for panning direction (positive up) Q22 */ - Word32 *azi_wrapped, /* o : wrapped azimuth component Q22 */ - Word32 *ele_wrapped /* o : wrapped elevation component Q22 */ + const Word32 azi_deg, /* i : azimuth in degrees for panning direction (positive left) Q22 */ + const Word32 ele_deg, /* i : elevation in degrees for panning direction (positive up) Q22 */ + Word32 *azi_wrapped, /* o : wrapped azimuth component Q22 */ + Word32 *ele_wrapped /* o : wrapped elevation component Q22 */ ); -void v_sort_ind_fixed( - Word32 *x, /* i/o: Vector to be sorted */ - Word16 *idx, /* o : Original index positions */ - const Word16 len /* i : vector length */ +void v_sort_ind_fx( + Word32 *x, /* i/o: Vector to be sorted */ + Word16 *idx, /* o : Original index positions */ + const Word16 len /* i : vector length */ ); void ivas_ls_setup_conversion_process_mdct_param_mc_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *x_fx[][NB_DIV], /* i/o: Fixed output synthesis signal */ - Word16 x_e[CPE_CHANNELS][NB_DIV] /* i/o: Exponent for output synthesis signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word32 *x_fx[][NB_DIV], /* i/o: Fixed output synthesis signal */ + Word16 x_e[CPE_CHANNELS][NB_DIV] /* i/o: Exponent for output synthesis signal */ ); void lls_interp_n_fx( - Word16 x_fx[], /* i/o: input/output vector */ - const Word16 N, /* i : length of the input vector */ - Word16 *a_fx, /* o : calculated slope */ - Word16 *b_fx, /* o : calculated offset */ - const Word16 upd /* i : use 1 to update x[] with the interpolated output */ + Word16 x_fx[], /* i/o: input/output vector */ + const Word16 N, /* i : length of the input vector */ + Word16 *a_fx, /* o : calculated slope */ + Word16 *b_fx, /* o : calculated offset */ + const Word16 upd /* i : use 1 to update x[] with the interpolated output*/ ); void ivas_lfe_synth_with_filters_fx( - MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, /* i/o: LFE synthesis structure for McMASA */ - Word32 *data_f[], /* o : output signals */ - const Word16 output_frame, /* i : output frame length per channel */ - const Word16 separateChannelIndex, /* i : separate channel index */ - const Word16 lfeChannelIndex /* i : LFE channel index */ + MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, /* i/o: LFE synthesis structure for McMASA */ + Word32 *data_f[], /* o : output signals */ + const Word16 output_frame, /* i : output frame length per channel */ + const Word16 separateChannelIndex, /* i : separate channel index */ + const Word16 lfeChannelIndex /* i : LFE channel index */ ); void ivas_lfe_enc_fx( - LFE_ENC_HANDLE hLFE, /* i/o: LFE encoder handle */ - Word32 data_lfe_ch[], /* i : input LFE signal */ - Word16 q_data_lfe_ch, /* i : Q of input LFE signal */ - const Word16 input_frame, /* i : input frame length per channel */ - BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ + LFE_ENC_HANDLE hLFE, /* i/o: LFE encoder handle */ + Word32 data_lfe_ch[], /* i : input LFE signal */ + Word16 q_data_lfe_ch, /* i : Q of input LFE signal */ + const Word16 input_frame, /* i : input frame length per channel */ + BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ ); void ivas_filter_process_fx( - ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ - Word32 *pIn_Out_fx, /* i : signal subject to filtering */ - const Word16 length, /* i : filter order */ - Word16 q_factor ); + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + Word32 *pIn_Out_fx, /* i : signal subject to filtering */ + const Word16 length, /* i : filter order */ + Word16 q_factor +); void ivas_filter_process_exp_fx( - ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ - Word32 *pIn_Out_fx, /* i/o: signal subject to filtering (exp[i] : pIn_out_e[i]) */ - const Word16 length, /* i : filter order */ - Word16 *pIn_Out_e ); + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + Word32 *pIn_Out_fx, /* i/o: signal subject to filtering (exp[i] : pIn_out_e[i]) */ + const Word16 length, /* i : filter order */ + Word16 *pIn_Out_e +); ivas_error ivas_osba_enc_open_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); void ivas_osba_enc_close_fx( - OSBA_ENC_HANDLE *hOSba /* i/o: encoder OSBA handle */ + OSBA_ENC_HANDLE *hOSba /* i/o: encoder OSBA handle */ ); void ivas_osba_enc_fx( - OSBA_ENC_HANDLE hOSba, /* i/o: OSBA encoder handle */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handle */ - Word32 *data_in_fx[], /* i/o: Input / transport audio signals */ - const Word16 input_frame, /* i : Input frame size */ - const Word16 nchan_ism, /* i : Number of objects for parameter analysis */ - const ISM_MODE ism_mode, /* i : ISM mode */ - const Word16 sba_analysis_order, /* i : SBA order evaluated in DirAC/SPAR encoder */ - const Word32 input_Fs, /* i : input sampling rate */ - const Word16 sba_planar, /* i : planar SBA flag */ - Word16 *q_data ); + OSBA_ENC_HANDLE hOSba, /* i/o: OSBA encoder handle */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handle */ + Word32 *data_in_fx[], /* i/o: Input / transport audio signals */ + const Word16 input_frame, /* i : Input frame size */ + const Word16 nchan_ism, /* i : Number of objects for parameter analysis */ + const ISM_MODE ism_mode, /* i : ISM mode */ + const Word16 sba_analysis_order, /* i : SBA order evaluated in DirAC/SPAR encoder */ + const Word32 input_Fs, /* i : input sampling rate */ + const Word16 sba_planar, /* i : planar SBA flag */ + Word16 *q_data +); ivas_error ivas_osba_data_open_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ ); + ivas_error ivas_osba_dirac_td_binaural_jbm_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ - UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ - UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - Word32 *output_fx[] /* o : rendered time signal */ -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - , - Word16 out_len /*Store the length of values in each channel*/ -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + Word32 *output_fx[] /* o : rendered time signal */ ); ivas_error ivas_osba_ism_metadata_dec_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word32 ism_total_brate, /* i : ISM total bitrate */ - Word16 *nchan_ism, /* o : number of ISM separated channels */ - Word16 nb_bits_metadata[] /* o : number of ISM metadata bits */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word32 ism_total_brate, /* i : ISM total bitrate */ + Word16 *nchan_ism, /* o : number of ISM separated channels */ + Word16 nb_bits_metadata[] /* o : number of ISM metadata bits */ ); ivas_error ivas_osba_render_sf_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ - UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ - UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ - Word32 *p_output[] /* o : rendered time signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + Word32 *p_output[] /* o : rendered time signal */ +); + +void ivas_osba_stereo_add_channels_fx( + Word32 *tc_fx[], /* i : transport channels */ + Word32 *output_fx[], /* i/o: output channels */ + const Word32 gain_bed_fx, /* i : gain bed value Q11 */ + const Word16 nchan_out, /* i : number of output channels */ + const Word16 nchan_ism, /* i : number of ISM channels */ + const Word16 ism_mode, /* i : ISM mode */ + const UWord16 n_samples_to_render /* i : output frame length per channel */ ); void ivas_osba_data_close_fx( - SBA_ISM_DATA_HANDLE *hSbaIsmData /* i/o: OSBA rendering handle */ + SBA_ISM_DATA_HANDLE *hSbaIsmData /* i/o: OSBA rendering handle */ ); -void ivas_set_ism_importance_interformat_fx( - const Word32 ism_total_brate, /* i/o: ISms total bitrate */ - const Word16 nchan_transport, /* i : number of transported channels */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ - const Word16 lp_noise_CPE_fx, /* i : LP filtered total noise estimation */ - Word16 ism_imp[] /* o : ISM importance flags */ +ISM_MODE ivas_osba_ism_mode_select( + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 nchan_ism /* i : number of input ISM's */ ); -void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( +void ivas_set_ism_importance_interformat_fx( + const Word32 ism_total_brate, /* i/o: ISms total bitrate */ + const Word16 nchan_transport, /* i : number of transported channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + const Word16 lp_noise_CPE_fx, /* i : LP filtered total noise estimation */ + Word16 ism_imp[] /* o : ISM importance flags */ +); +void ivas_omasa_preProcessStereoTransportsForEditedObjects_fx( Decoder_Struct *st_ivas, Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /*cldfb_buf_q*/ Word32 inIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /*cldfb_buf_q*/ Word16 *cldfb_buf_q, const Word16 nBins, - const Word16 subframe ); + const Word16 subframe +); void ivas_omasa_decode_masa_to_total_fx( @@ -3835,209 +3900,218 @@ void ivas_omasa_decode_masa_to_total_fx( Word16 *index, Word32 masa_to_total_energy_ratio_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const Word16 nbands, - const Word16 nblocks ); + const Word16 nblocks +); +/*----------------------------------------------------------------------------------* + * TD Binaural Object renderer + *----------------------------------------------------------------------------------*/ + ivas_error ivas_td_binaural_open_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word16 *SrcInd, /*Temporarily used to store the updated value of SrcInd*/ - Word16 *num_src ); + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word16 *SrcInd, /*Temporarily used to store the updated value of SrcInd*/ + Word16 *num_src +); -ivas_error ivas_td_binaural_renderer_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output[], /* i/o: SCE channels / Binaural synthesis */ - const Word16 output_frame /* i : output frame length */ +ivas_error ivas_td_binaural_renderer_sf_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word32 *output_fx[], /* i/o: SCE channels / Binaural synthesis */ + const Word16 n_samples_granularity /* i : granularity of the renderer/buffer */ ); + +/*----------------------------------------------------------------------------------* + * Filter-bank (FB) Mixer + *----------------------------------------------------------------------------------*/ + void ivas_FB_mixer_close_fx( - IVAS_FB_MIXER_HANDLE *hFbMixer, /* i/o: FB mixer handle */ - const Word32 sampling_rate, /* i : sampling rate in Hz */ - const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ + IVAS_FB_MIXER_HANDLE *hFbMixer, /* i/o: FB mixer handle */ + const Word32 sampling_rate, /* i : sampling rate in Hz */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ ); void ivas_fb_mixer_pcm_ingest_fx( - IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ - Word32 *pcm_in[], /* i : input audio channels Qq_data_fix[] */ - Word32 **ppOut_pcm, /* o : output audio channels Qq_ppOut_pcm[] */ - const Word16 frame_len, /* i : frame length */ + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + Word32 *pcm_in[], /* i : input audio channels Qq_data_fix[] */ + Word32 **ppOut_pcm, /* o : output audio channels Qq_ppOut_pcm[] */ + const Word16 frame_len, /* i : frame length */ const Word16 HOA_md_ind[IVAS_SPAR_MAX_CH], Word16 q_data_fix, - Word16 *q_ppOut_pcm ); + Word16 *q_ppOut_pcm +); void ivas_fb_mixer_process_fx( - IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ - Word32 ***mixer_mat_fx, /* i : mixer matrix */ - Word16 *q_mixer_mat_fx, /* i : mixer matrix Q-factor */ - Word32 **ppOut_pcm_fx, /* o : output audio channels */ - Word16 *q_ppOut_pcm_fx, /* o : output audio channels Q-factor */ - const Word16 frame_len, /* i : frame length in samples */ + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + Word32 ***mixer_mat_fx, /* i : mixer matrix */ + Word16 *q_mixer_mat_fx, /* i : mixer matrix Q-factor */ + Word32 **ppOut_pcm_fx, /* o : output audio channels */ + Word16 *q_ppOut_pcm_fx, /* o : output audio channels Q-factor */ + const Word16 frame_len, /* i : frame length in samples */ Word16 in_out_mixer_map[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i/o: mixing mapping */ ); Word16 ivas_get_num_bands_from_bw_idx( - const Word16 bwidth /* i : audio bandwidth */ + const Word16 bwidth /* i : audio bandwidth */ ); void sns_avq_dec_fx( - Word16 *index, /* i : Quantization indices */ - Word32 SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ + Word16 *index, /* i : Quantization indices */ + Word32 SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ Word16 *q_snsq, - const Word16 L_frame, /* i : frame length */ - const Word16 numlpc /* i : Number of sets of lpc */ + const Word16 L_frame, /* i : frame length */ + const Word16 numlpc /* i : Number of sets of lpc */ ); void sns_avq_dec_stereo_fx( - Word16 *indexl, /* i : Quantization indices (left channel) */ - Word16 *indexr, /* i : Quantization indices (right channe) */ - const Word16 L_frame, /* i : frame length */ - Word32 *SNS_Ql, /* o : Quantized SNS vectors (left channel) */ + Word16 *indexl, /* i : Quantization indices (left channel) */ + Word16 *indexr, /* i : Quantization indices (right channe) */ + const Word16 L_frame, /* i : frame length */ + Word32 *SNS_Ql, /* o : Quantized SNS vectors (left channel) */ Word16 *q_l, - Word32 *SNS_Qr, /* o : Quantized SNS vectors (right channe) */ - Word16 *q_r ); + Word32 *SNS_Qr, /* o : Quantized SNS vectors (right channe) */ + Word16 *q_r +); void dequantize_sns_fx( Word16 indices[CPE_CHANNELS][NPRM_LPC_NEW], Word32 snsQ_out[CPE_CHANNELS][NB_DIV][M], - Decoder_State **sts ); - -void inverseMS_fx( - const Word16 L_frame, /* i : frame length Q0*/ - Word32 x0[], /* i/o: mid/left channel coefficients Qx*/ - Word32 x1[], /* i/o: side/right channel coefficients Qx*/ - const Word32 norm_fac /* i : normalization factor Q31*/ + Decoder_State **sts ); -void ivas_syn_output_f_fx( - Word32 *synth[], /* i/o: Word32 synthesis signal */ - const Word16 output_frame, /* i : output frame length (one channel) */ - const Word16 n_channels, /* i : number of output channels */ - Word32 *synth_out /* o : integer 16 bits synthesis signal */ +void inverseMS_fx( + const Word16 L_frame, /* i : frame length Q0*/ + Word32 x0[], /* i/o: mid/left channel coefficients Qx*/ + Word32 x1[], /* i/o: side/right channel coefficients Qx*/ + const Word32 norm_fac /* i : normalization factor Q31*/ ); - ivas_error ivas_init_encoder_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); ivas_error ivas_output_buff_dec_fx( - Word32 *p_output_f[], /* i/o: output audio buffers */ - const Word16 nchan_out_buff_old, /* i : previous frame number of output channels */ - const Word16 nchan_out_buff /* i : number of output channels */ + Word32 *p_output_fx[], /* i/o: output audio buffers */ + const Word16 nchan_out_buff, /* i : number of output channels */ + const Word16 Opt_tsm, /* i : TSM option flag */ + DECODER_TC_BUFFER_HANDLE hTcBuffer /* i : TSM buffer handle */ +); + +ivas_error ivas_dec_get_format_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); ivas_error ivas_dec_setup( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - UWord16 *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ - Word16 *data /* o : output synthesis signal */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); ivas_error create_mct_dec_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); ivas_error mct_dec_reconfigure_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const UWord16 b_nchan_change /* i : flag indicating different channel count */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const UWord16 b_nchan_change /* i : flag indicating different channel count */ ); ivas_error ivas_corecoder_dec_reconfig_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 nSCE_old, /* i : number of SCEs in previous frame */ - Word16 nCPE_old, /* i : number of CPEs in previous frame */ - const Word16 nchan_transport_old, /* i : number of TCs in previous frame */ - const Word16 sba_dirac_stereo_flag_old, /* i : signal stereo rendering using DFT upmix in previous frame */ - const Word32 brate_SCE, /* i : bitrate to be set for the SCEs */ - const Word32 brate_CPE /* i : bitrate to be set for the CPEs */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 nSCE_old, /* i : number of SCEs in previous frame */ + Word16 nCPE_old, /* i : number of CPEs in previous frame */ + const Word16 nchan_transport_old, /* i : number of TCs in previous frame */ + const Word16 sba_dirac_stereo_flag_old, /* i : signal stereo rendering using DFT upmix in previous frame */ + const Word32 brate_SCE, /* i : bitrate to be set for the SCEs */ + const Word32 brate_CPE /* i : bitrate to be set for the CPEs */ ); ivas_error ivas_hp20_dec_reconfig_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 nchan_hp20_old /* i : number of HP20 filters in previous frame*/ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 nchan_hp20_old /* i : number of HP20 filters in previous frame */ ); Word16 getNumChanSynthesis( - Decoder_Struct *st_ivas /* i : IVAS decoder structure */ + Decoder_Struct *st_ivas /* i : IVAS decoder structure */ ); void ivas_destroy_dec_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); ivas_error ivas_core_dec_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ - const Word16 n_channels, /* i : number of channels to be decoded */ - Word32 *output_fx[], /* o : output synthesis signal */ - Word32 outputHB[][L_FRAME48k], /* o : output HB synthesis signal */ - Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ - const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ -); - -void decod_gen_2sbfr_ivas_fx( - Decoder_State *st, /* i/o: decoder static memory */ - const Word16 sharpFlag, /* i : formant sharpening flag `Q0*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ - const Word16 tdm_Pri_pitch_buf[] /* i : pitch values for primary channel Q6*/ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + const Word16 n_channels, /* i : number of channels to be decoded */ + Word32 *output_fx[], /* o : output synthesis signal */ + Word32 outputHB[][L_FRAME48k], /* o : output HB synthesis signal */ + Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ + const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +); + +void decod_gen_2sbfr_fx( + Decoder_State *st, /* i/o: decoder static memory */ + const Word16 sharpFlag, /* i : formant sharpening flag Q0*/ + const Word16 *Aq, /* i : LP filter coefficient Q12*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ + const Word16 tdm_Pri_pitch_buf[] /* i : pitch values for primary channe Q6*/ ); Word16 ivas_smc_gmm_fx( - Encoder_State *st, /* i/o: state structure */ - STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ - const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ - const Word16 Etot_fx, /* i : total frame energy */ - const Word16 lsp_new_fx[M], /* i : LSPs in current frame Q15 */ - const Word16 cor_map_sum_fx, /* i : correlation map sum (from multi-harmonic anal.) Q8 */ - const Word32 epsP_fx[M + 1], /* i : LP prediciton error */ - const Word32 PS_fx[], /* i : energy spectrum */ - const Word16 non_sta_fx, /* i : unbound non-stationarity Q8 */ - const Word16 relE_fx, /* i : relative frame energy Q8 */ - Word16 *high_lpn_flag, /* i/o: sp/mus LPN flag */ - const Word16 flag_spitch, /* i : flag to indicate very short stable pitch */ + Encoder_State *st, /* i/o: state structure */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + const Word16 Etot_fx, /* i : total frame energy */ + const Word16 lsp_new_fx[M], /* i : LSPs in current frame Q15 */ + const Word16 cor_map_sum_fx, /* i : correlation map sum (from multi-harmonic anal.) Q8 */ + const Word32 epsP_fx[M + 1], /* i : LP prediciton error */ + const Word32 PS_fx[], /* i : energy spectrum */ + const Word32 non_sta_fx, /* i : unbound non-stationarity Q20 */ + const Word16 relE_fx, /* i : relative frame energy Q8 */ + Word16 *high_lpn_flag, /* i/o: sp/mus LPN flag */ + const Word16 flag_spitch, /* i : flag to indicate very short stable pitch */ Word16 Qfact_PS, Word16 Q_esp, - Word16 Qfact_PS_past ); + Word16 Qfact_PS_past +); void ivas_signaling_enc_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ - const Word32 element_brate, /* i : element bitrate */ - const Word16 tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag in TD stereo OR LRTD primary channel */ - const Word16 tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag in TD stereo */ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag in TD stereo OR LRTD primary channel */ + const Word16 tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag in TD stereo */ ); void smooth_dft2td_transition_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *output_fx[CPE_CHANNELS], /* i/o: synthesis @external Fs Q11*/ - const Word16 output_frame /* i : output frame lenght Q0*/ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *output_fx[CPE_CHANNELS], /* i/o: synthesis @external Fs Q11*/ + const Word16 output_frame /* i : output frame lenght Q0*/ ); - Word16 is_IVAS_bitrate_fx( - const Word32 ivas_total_brate /* i : IVAS total bitrate */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); void ivas_mdft_fx( - const Word32 *pIn, /* i : input time-domain signal Qin */ - Word32 *pOut_re, /* o : Real part of MDFT signal Qin */ - Word32 *pOut_im, /* o : Imag. part of MDFT signal Qin */ - const Word16 length, /* i : signal length */ - const Word16 mdft_length /* i : MDFT length */ + const Word32 *pIn, /* i : input time-domain signal Qin */ + Word32 *pOut_re, /* o : Real part of MDFT signal Qin */ + Word32 *pOut_im, /* o : Imag. part of MDFT signal Qin */ + const Word16 length, /* i : signal length */ + const Word16 mdft_length /* i : MDFT length */ ); void ivas_imdft_fx( - const Word32 *pRe, /* i : Real part of MDFT signal Qin */ - const Word32 *pIm, /* i : Imag. part of MDFT signal Qin */ - Word32 *pOut, /* o : output time-domain signal Qin */ - const Word16 length /* i : signal length */ + const Word32 *pRe, /* i : Real part of MDFT signal Qin */ + const Word32 *pIm, /* i : Imag. part of MDFT signal Qin */ + Word32 *pOut, /* o : output time-domain signal Qin */ + const Word16 length /* i : signal length */ ); void TonalMdctConceal_create_concealment_noise_ivas_fx( @@ -4050,211 +4124,169 @@ void TonalMdctConceal_create_concealment_noise_ivas_fx( const Word16 subframe_idx, const Word16 core, const Word16 crossfade_gain, - const TONALMDCTCONC_NOISE_GEN_MODE noise_gen_mode ); - + const TONALMDCTCONC_NOISE_GEN_MODE noise_gen_mode +); Word16 rand_triangular_signed_fx( Word16 *seed, - Word16 *exp_fac ); - -Word64 var_32_fx( - const Word32 *x, /* i : input vector */ - const Word16 len, /* i : length of inputvector */ - Word16 q /* q : q-factor for the array */ -); - -ivas_error ivas_jbm_dec_tc_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *data_fx ); - -ivas_error ivas_jbm_dec_flush_renderer_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 tc_granularity_new, /* i : new renderer granularity */ - const RENDERER_TYPE renderer_type_old, /* i : old renderer type */ - const AUDIO_CONFIG intern_config_old, /* i : old internal config */ - const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */ - const MC_MODE mc_mode_old, /* i : old MC mode */ - const ISM_MODE ism_mode_old, /* i : old ISM mode */ - UWord16 *nSamplesRendered, /* o : number of samples flushed */ - Word16 *data /* o : output synthesis signal */ -); - -void ivas_jbm_dec_feed_tc_to_renderer_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 nSamplesForRendering, /* i : number of TC samples available for rendering */ - Word16 *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ - Word32 *data /* i/o: transport channels/output synthesis signal */ -); - -void ivas_jbm_dec_feed_tc_to_renderer_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 nSamplesForRendering, /* i : number of TC samples available for rendering */ - Word16 *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ - Word32 *data /* i/o: transport channels/output synthesis signal */ -); - -void ivas_jbm_dec_get_adapted_subframes( - const Word16 nCldfbTs, /* i : number of time slots in the current frame */ - Word16 *subframe_nbslots, /* i/o: subframe grid */ - Word16 *nb_subframes /* i/o: number of subframes in the frame */ + Word16 *exp_fac ); -void ivas_jbm_dec_get_md_map( - const Word16 default_len, /* i : default frame length in metadata slots */ - const Word16 len, /* i : length of the modfied frames in metadata slots */ - const Word16 subframe_len, /* i : default length of a subframe */ - const Word16 offset, /* i : current read offset into the md buffer */ - const Word16 buf_len, /* i : length of the metadata buffer */ - Word16 *map /* o : metadata index map */ -); - -void ivas_jbm_dec_get_md_map_even_spacing( - const Word16 len, /* i : length of the modfied frames in metadata slots */ - const Word16 subframe_len, /* i : default length of a subframe */ - const Word16 offset, /* i : current read offset into the md buffer */ - const Word16 buf_len, /* i : length of the metadata buffer */ - Word16 *map /* o : metadata index map */ +Word64 var_32_fx( + const Word32 *x, /* i : input vector */ + const Word16 len, /* i : length of inputvector */ + Word16 q /* q : q-factor for the array */ ); void bitbudget_to_brate( - const Word16 x[], /* i : bitbudgets */ - Word32 y[], /* o : bitrates */ - const Word16 N /* i : number of entries to be converted */ + const Word16 x[], /* i : bitbudgets */ + Word32 y[], /* o : bitrates */ + const Word16 N /* i : number of entries to be converted */ ); Word16 ism_quant_meta_fx( - const Word32 val, /* i : scalar value to quantize */ - Word32 *valQ, /* o : quantized value */ - const Word32 borders_fx[], /* i : level borders */ - const Word32 q_step_fx, /* i : quantization step */ - const Word32 q_step_border_fx, /* i : quantization step at the border */ - const Word16 cbsize /* i : codebook size */ + const Word32 val, /* i : scalar value to quantize */ + Word32 *valQ, /* o : quantized value */ + const Word32 borders_fx[], /* i : level borders */ + const Word32 q_step_fx, /* i : quantization step */ + const Word32 q_step_border_fx, /* i : quantization step at the border */ + const Word16 cbsize /* i : codebook size */ ); ivas_error ivas_set_ism_metadata_fx( - ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ - const Word32 azimuth, /* i : azimuth value */ - const Word32 elevation, /* i : elevation value */ - const Word16 radius_meta, /* i : radius */ - const Word32 yaw, /* i : yaw */ - const Word32 pitch, /* i : pitch */ - const Word16 non_diegetic_flag /* i : non-diegetic object flag */ + ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ + const Word32 azimuth, /* i : azimuth value */ + const Word32 elevation, /* i : elevation value */ + const Word16 radius_meta, /* i : radius */ + const Word32 yaw, /* i : yaw */ + const Word32 pitch, /* i : pitch */ + const Word16 non_diegetic_flag /* i : non-diegetic object flag */ ); ivas_error ivas_ism_metadata_enc_fx( - Word32 *ism_total_brate, /* i/o: ISM total bitrate */ - const Word16 nchan_ism, /* i : number of ISM channels */ - const Word16 nchan_transport, /* i : number of transport channels */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - Word16 nb_bits_metadata[], /* o : number of metadata bits */ - const Word16 localVAD[], /* i : VAD flag */ - const Word16 ism_mode, /* i : ISM mode */ - const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */ - const Word16 ism_extended_metadata_flag, /* i : Extended metadata flag */ - const Word16 lp_noise_CPE, /* i : LP filtered total noise estimation */ - const Word16 flag_omasa_ener_brate, /* i : less bitrate for objects in OMASA flag */ + Word32 *ism_total_brate, /* i/o: ISM total bitrate */ + const Word16 nchan_ism, /* i : number of ISM channels */ + const Word16 nchan_transport, /* i : number of transport channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + Word16 nb_bits_metadata[], /* o : number of metadata bits */ + const Word16 localVAD[], /* i : VAD flag */ + const Word16 ism_mode, /* i : ISM mode */ + const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */ + const Word16 ism_extended_metadata_flag, /* i : Extended metadata flag */ + const Word16 lp_noise_CPE, /* i : LP filtered total noise estimation */ + const Word16 flag_omasa_ener_brate, /* i : less bitrate for objects in OMASA flag */ Word16 *omasa_stereo_sw_cnt, - const Word16 ini_frame ); + const Word16 ini_frame +); ivas_error ivas_ism_dec_config( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const ISM_MODE last_ism_mode, /* i/o: last ISM mode */ - UWord16 *nSamplesRendered, /* o : number of samples flushed when the renderer granularity changes */ - Word16 *data /* o : output synthesis signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const ISM_MODE last_ism_mode /* i/o: last ISM mode */ ); ivas_error ivas_param_ism_dec_open_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void ivas_param_ism_dec_close_fx( - PARAM_ISM_DEC_HANDLE *hParamIsmDec, /* i/o: decoder ParamISM handle */ - SPAT_PARAM_REND_COMMON_DATA_HANDLE *hSpatParamRendCom_out, /* i/o: common spatial renderer data */ - const AUDIO_CONFIG output_config /* i : output audio configuration */ + PARAM_ISM_DEC_HANDLE *hParamIsmDec, /* i/o: decoder ParamISM handle */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE *hSpatParamRendCom_out, /* i/o: common spatial renderer data */ + const AUDIO_CONFIG output_config /* i : output audio configuration */ ); void ivas_ism_dec_digest_tc_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void ivas_param_ism_dec_digest_tc_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ - Word32 *transport_channels[], /* i : synthesized core-coder transport channels/DirAC output */ - Word16 q_tc_in ); + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nCldfbSlots, /* i : number of CLDFB slots in transport channels */ + Word32 *p_data_fx[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const Word16 q_data_in /* i : Q-factor of input signal for single channel */ +); + +void ivas_param_ism_dec_dequant_md_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +); + +void ivas_param_ism_dec_prepare_renderer_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const Word16 nCldfbSlots /* i : number of CLDFB slots in transport channels */ +); void ivas_param_ism_dec_render_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ - UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ - UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - Word32 *output_f_fx[] ); + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + Word32 *output_fx[] /* i/o: synthesized core-coder TCs / rendered signal*/ +); void ivas_param_ism_params_to_masa_param_mapping_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); Word16 ivas_ism_dtx_enc_fx( - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 nchan_ism, /* i : number of objects */ - const Word16 nchan_transport, /* i : number of transport channels */ - Word16 vad_flag[MAX_NUM_OBJECTS], /* i : VAD flag */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - Word16 md_diff_flag[], /* o : metadata differential flag */ - Word16 *sid_flag /* o : indication of SID frame */ + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 nchan_ism, /* i : number of objects */ + const Word16 nchan_transport, /* i : number of transport channels */ + Word16 vad_flag[MAX_NUM_OBJECTS], /* i : VAD flag */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + Word16 md_diff_flag[], /* o : metadata differential flag */ + Word16 *sid_flag /* o : indication of SID frame */ ); void ivas_ism_dtx_dec_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word16 *nb_bits_metadata /* o : number of metadata bits */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word16 *nb_bits_metadata /* o : number of metadata bits */ ); void ivas_ism_get_sce_id_dtx_fx( - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ - const Word16 nchan_transport, /* i : number of transport channels */ - const Word16 input_frame /* i : input frame length per channel */ + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 input_frame /* i : input frame length per channel */ ); void ivas_ism_coh_estim_dtx_enc_fx( - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ - const Word16 nchan_transport, /* i : number of transport channels */ - const Word16 input_frame /* i : input frame length */ + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 input_frame /* i : input frame length */ ); void ivas_ism_dtx_limit_noise_energy_for_near_silence_fx( - SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder structures */ - const Word16 sce_id_dtx, /* i : SCE DTX ID */ - const Word16 nchan_transport, /* i : number of transport channels */ - Word16 *Q_cngNoiseLevel ); - + SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder structures */ + const Word16 sce_id_dtx, /* i : SCE DTX ID */ + const Word16 nchan_transport, /* i : number of transport channels */ + Word16 *Q_cngNoiseLevel +); ivas_error stereo_dft_enc_create_fx( - STEREO_DFT_ENC_DATA_HANDLE *hStereoDft, /* o : encoder DFT stereo handle */ - const Word32 input_Fs, /* i : input sampling rate */ - const Word16 max_bwidth /* i : maximum encoded bandwidth */ + STEREO_DFT_ENC_DATA_HANDLE *hStereoDft, /* o : encoder DFT stereo handle */ + const Word32 input_Fs, /* i : input sampling rate */ + const Word16 max_bwidth /* i : maximum encoded bandwidth */ ); void stereo_dft_enc_reset_fx( - STEREO_DFT_ENC_DATA_HANDLE hStereoDft /* i/o: encoder stereo handle */ + STEREO_DFT_ENC_DATA_HANDLE hStereoDft /* i/o: encoder stereo handle */ ); void stereo_enc_itd_init_fx( - ITD_DATA_HANDLE hItd /* i/o: encoder ITD handle */ + ITD_DATA_HANDLE hItd /* i/o: encoder ITD handle */ ); void stereo_dft_enc_update_fx( - STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ - const Word16 max_bwidth /* i : maximum encoded bandwidth */ + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ + const Word16 max_bwidth /* i : maximum encoded bandwidth */ ); void stereo_dft_enc_destroy_fx( - STEREO_DFT_ENC_DATA_HANDLE *hStereoDft /* i/o: encoder DFT stereo handle */ + STEREO_DFT_ENC_DATA_HANDLE *hStereoDft /* i/o: encoder DFT stereo handle */ ); void stereo_dft_quantize_res_gains_fx( @@ -4263,7 +4295,8 @@ void stereo_dft_quantize_res_gains_fx( Word32 *gq, // Q31 Word32 *rq, // Q31 Word16 *ig, - Word16 *ir ); + Word16 *ir +); void stereo_dft_dequantize_itd_fx( Word16 *ind, /* Q0 */ @@ -4272,283 +4305,287 @@ void stereo_dft_dequantize_itd_fx( ); Word16 stereo_dft_sg_recovery_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: Decoder DFT stereo handle */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: Decoder DFT stereo handle */ ); Word16 res_bpf_adapt_ivas_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo decoder handle */ - const Word32 *bpf_error_signal_8k, /* i : BPF modification signal */ - Word32 res_buf[STEREO_DFT_N_8k], /* i : residual buffer Q_res */ - Word16 q_res ); + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo decoder handle */ + const Word32 *bpf_error_signal_8k, /* i : BPF modification signal */ + Word32 res_buf[STEREO_DFT_N_8k], /* i : residual buffer Q_res */ + Word16 q_res +); void stereo_dft_dec_read_BS_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ - const Word32 element_brate, /* i : element bitrate Q0*/ - Word32 *total_brate, /* o : total bitrate Q0*/ - Decoder_State *st, /* i/o: decoder state structure */ - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ - const Word16 bwidth, /* i : bandwidth Q0*/ - const Word16 output_frame, /* i : output frame length Q0*/ - Word32 res_buf_fx[STEREO_DFT_N_8k], /* o : residual buffer Q0*/ - Word16 *nb_bits, /* o : number of bits read Q0*/ - Word16 *coh_fx, /* i/o: Coherence Q15*/ - const Word16 ivas_format /* i : ivas format Q0*/ + const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ + const Word32 element_brate, /* i : element bitrate Q0*/ + Word32 *total_brate, /* o : total bitrate Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ + const Word16 bwidth, /* i : bandwidth Q0*/ + const Word16 output_frame, /* i : output frame length Q0*/ + Word32 res_buf_fx[STEREO_DFT_N_8k], /* o : residual buffer Q0*/ + Word16 *nb_bits, /* o : number of bits read Q0*/ + Word16 *coh_fx, /* i/o: Coherence Q15*/ + const Word16 ivas_format /* i : ivas format Q0*/ ); Word16 write_bitstream_adapt_GR_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ - const Word16 ind, /* i : bitstream index */ - const Word16 *in, /* i : values to be written in bitstream */ - const Word16 len, /* i : values vector length */ - const Word16 GR_ord, /* i : GR order to be used */ - const Word16 no_GR_ord /* i : speech/music 0/1 */ + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const Word16 ind, /* i : bitstream index */ + const Word16 *in, /* i : values to be written in bitstream */ + const Word16 len, /* i : values vector length */ + const Word16 GR_ord, /* i : GR order to be used */ + const Word16 no_GR_ord /* i : speech/music 0/1 */ ); Word16 adapt_GR_ief_fx( - const Word16 *in, /* i : vector to encode */ - Word16 *in_diff, /* o : encoded symbols in case of differential encoding */ - const Word16 *prev, /* i : previous frame data */ - const Word16 len, /* i : input vector length */ - const Word16 no_symb, /* i : number of symbols */ - Word16 *nbits, /* o : number of used bits */ - Word16 *in_enc, /* o : symbold actually encoded after adapt_GR */ - const Word16 *map0, /* i : mapping array */ - const Word16 no_GR_ord, /* i : number of GR order to try 2: 0,1; 3:0,1,2 */ - Word16 *nbits_diff, /* o : number bits in diff encoding */ - const Word16 side_gain_counter, /* i : number of frames since last abs coding */ - Word16 *side_gain_bitdiff_lp, /* i/o: LP-filtered bit difference between abs/diff */ - Word16 *q_side_gain_bitdiff_lp, /* i/o: Q of LP-filtered bit difference between abs/diff */ - const Word16 try_diff /* i : diff coding allowed 1/0 */ + const Word16 *in, /* i : vector to encode */ + Word16 *in_diff, /* o : encoded symbols in case of differential encoding */ + const Word16 *prev, /* i : previous frame data */ + const Word16 len, /* i : input vector length */ + const Word16 no_symb, /* i : number of symbols */ + Word16 *nbits, /* o : number of used bits */ + Word16 *in_enc, /* o : symbold actually encoded after adapt_GR */ + const Word16 *map0, /* i : mapping array */ + const Word16 no_GR_ord, /* i : number of GR order to try 2: 0,1; 3:0,1,2 */ + Word16 *nbits_diff, /* o : number bits in diff encoding */ + const Word16 side_gain_counter, /* i : number of frames since last abs coding */ + Word16 *side_gain_bitdiff_lp, /* i/o: LP-filtered bit difference between abs/diff */ + Word16 *q_side_gain_bitdiff_lp, /* i/o: Q of LP-filtered bit difference between abs/diff */ + const Word16 try_diff /* i : diff coding allowed 1/0 */ ); Word16 adapt_GR_rpg1_ief_fx( - const Word16 *in, /* i : res pred gains input vector */ - Word16 *in_diff, /* o : encoded symbols in case of differential encoding */ - const Word16 *prev, /* i : previous frame data */ - const Word16 len, /* i : input vector length */ - const Word16 no_symb, /* i : number of symbols */ - Word16 *nbits, /* o : number of used bits */ - Word16 *in_enc, /* o : symbold actually encoded after adapt_GR */ - const Word16 *maps, /* i : mapping array */ - Word16 *nbits_diff, /* o : estimated no of bits for differential encoding */ - const Word16 no_GR_ord, /* i : number of GR order to try 2: 0,1; 3:0,1,2 */ - const Word16 try_diff /* i : diff coding allowed 1/0 */ + const Word16 *in, /* i : res pred gains input vector */ + Word16 *in_diff, /* o : encoded symbols in case of differential encoding */ + const Word16 *prev, /* i : previous frame data */ + const Word16 len, /* i : input vector length */ + const Word16 no_symb, /* i : number of symbols */ + Word16 *nbits, /* o : number of used bits */ + Word16 *in_enc, /* o : symbold actually encoded after adapt_GR */ + const Word16 *maps, /* i : mapping array */ + Word16 *nbits_diff, /* o : estimated no of bits for differential encoding */ + const Word16 no_GR_ord, /* i : number of GR order to try 2: 0,1; 3:0,1,2 */ + const Word16 try_diff /* i : diff coding allowed 1/0 */ ); Word16 write_GR1_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ - const Word16 ind, /* i : bitstream index */ - const Word16 *in, /* i : data to be encoded */ - const Word16 len /* i : input data length */ + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const Word16 ind, /* i : bitstream index */ + const Word16 *in, /* i : data to be encoded */ + const Word16 len /* i : input data length */ ); Word16 write_bitstream_GR_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ - const Word16 ind, /* i : bitstream index */ - const Word16 *in, /* i : input vector */ - const Word16 len, /* i : input vector length */ - const Word16 GR_ord /* i : GR order */ + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const Word16 ind, /* i : bitstream index */ + const Word16 *in, /* i : input vector */ + const Word16 len, /* i : input vector length */ + const Word16 GR_ord /* i : GR order */ ); void stereo_dft_hybrid_ITD_flag_fx( - STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ - const Word32 input_Fs, /* i : CPE element sampling rate */ - const Word16 hybrid_itd_max /* i : flag for hybrid ITD for very large ITDs */ + STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ + const Word32 input_Fs, /* i : CPE element sampling rate */ + const Word16 hybrid_itd_max /* i : flag for hybrid ITD for very large ITDs */ ); void rc_uni_dec_init_fx( - RangeUniDecState *rc_st_dec, /* i/o: RC state handle */ - UWord16 *bit_buffer, /* i : Bit buffer */ - const Word16 max_available_bits /* i : Total maximum bits available */ + RangeUniDecState *rc_st_dec, /* i/o: RC state handle */ + UWord16 *bit_buffer, /* i : Bit buffer */ + const Word16 max_available_bits /* i : Total maximum bits available */ ); UWord16 rc_uni_dec_read_symbol_fastS_fx( - RangeUniDecState *rc_st_dec, /* i/o: Decoder State */ - const UWord16 cum_freq_table[], /* i : Cumulative frequency up to symbol */ - const UWord16 sym_freq_table[], /* i : Symbol frequency */ - const UWord16 alphabet_size, /* i : Number of symbols in the alphabet */ - const UWord16 tot_shift /* i : Total frequency as a power of 2 */ + RangeUniDecState *rc_st_dec, /* i/o: Decoder State */ + const UWord16 cum_freq_table[], /* i : Cumulative frequency up to symbol */ + const UWord16 sym_freq_table[], /* i : Symbol frequency */ + const UWord16 alphabet_size, /* i : Number of symbols in the alphabet */ + const UWord16 tot_shift /* i : Total frequency as a power of 2 */ ); Word16 rc_uni_dec_virtual_finish_fx( - RangeUniDecState *rc_st_dec /* i/o: RC state handle */ + RangeUniDecState *rc_st_dec /* i/o: RC state handle */ ); void unclr_classifier_dft_fx( - CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ ); void xtalk_classifier_dft_fx( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - const Word16 itd, /* i : ITD from DFT stereo - used as a feature */ - const Word32 gcc_phat[] /* i : GPHAT cross-channel correlation function Q31*/ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const Word16 itd, /* i : ITD from DFT stereo - used as a feature */ + const Word32 gcc_phat[] /* i : GPHAT cross-channel correlation function Q31*/ ); void stereo_td_init_enc_fx( - STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - const Word16 last_element_mode /* i : last element mode */ + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ + const Word16 last_element_mode /* i : last element mode */ ); ivas_error stereo_set_tdm_fx( - CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - const Word16 input_frame, /* i : input frame length per channel */ - Word16 input_q ); + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const Word16 input_frame, /* i : input frame length per channel */ + Word16 input_q +); void stereo_tdm_prep_dwnmx_fx( - CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - const Word32 *input1, /* i : right channel input */ - const Word16 input_frame, /* i : frame lenght */ - const Word16 input_q /* i : frame lenght */ + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const Word32 *input1, /* i : right channel input */ + const Word16 input_frame, /* i : frame lenght */ + const Word16 input_q /* i : frame lenght */ ); void tdm_upmix_plain_fx( - Word32 Left_fx[], /* o : left channel Qx*/ - Word32 Right_fx[], /* o : right channel Qx*/ - const Word32 PCh_2_L_fx[], /* i : primary channel Qx*/ - const Word32 SCh_2_R_fx[], /* i : secondary channel Qx*/ - const Word32 LR_ratio_fx, /* i : mixing ratio Q31*/ - const Word32 inv_den_LR_ratio_fx, /* i : inverse mixing ration Q31*/ - const Word16 start_index, /* i : start index Q0*/ - const Word16 end_index, /* i : end index Q0*/ - const Word16 plus_minus_flag /* i : plus/minus flag Q0*/ + Word32 Left_fx[], /* o : left channel Qx*/ + Word32 Right_fx[], /* o : right channel Qx*/ + const Word32 PCh_2_L_fx[], /* i : primary channel Qx*/ + const Word32 SCh_2_R_fx[], /* i : secondary channel Qx*/ + const Word32 LR_ratio_fx, /* i : mixing ratio Q31*/ + const Word32 inv_den_LR_ratio_fx, /* i : inverse mixing ration Q31*/ + const Word16 start_index, /* i : start index Q0*/ + const Word16 end_index, /* i : end index Q0*/ + const Word16 plus_minus_flag /* i : plus/minus flag Q0*/ ); void stereo_tdm_combine_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *PCh_2_L_fx, /* i/o: Primary channel -> output as left channel Qx*/ - Word32 *SCh_2_R_fx, /* i/o: Secondary channel -> output as right channel Qx*/ - const Word16 output_frame, /* i : Number of samples Q0*/ - const Word16 flag_HB, /* i : flag to distinguish between core (0) and HB (1) synthesis Q0*/ - const Word16 tdm_ratio_idx /* i : TDM ratio index Q0*/ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *PCh_2_L_fx, /* i/o: Primary channel -> output as left channel Qx*/ + Word32 *SCh_2_R_fx, /* i/o: Secondary channel -> output as right channel Qx*/ + const Word16 output_frame, /* i : Number of samples Q0*/ + const Word16 flag_HB, /* i : flag to distinguish between core (0) and HB (1) synthesis Q0*/ + const Word16 tdm_ratio_idx /* i : TDM ratio index Q0*/ ); Word16 tdm_lp_comparison_fx( - STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ - Encoder_State *st, /* i/o: Encoder structure */ - Word32 *speech_buff, /* i : Current speech frame Q_speech */ - const Word16 *A_PCh_fx, /* i : primary channel LP coefficients Q12*/ - const Word16 *A_SCh_fx, /* i : secondary channel LP coeff. Q12*/ - const Word16 m, /* i : filter length */ - const Word16 *isp_PCh_fx, /* i : primary channel LSPs Q15 */ - const Word16 *isp_SCh_fx, /* i : secondary channel LSPs Q15 */ - const Word16 L_frame, /* i : frame length */ - const Word32 element_brate_wo_meta, /* i : element bitrate without metadata*/ - Word16 Q_speech ); + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + Encoder_State *st, /* i/o: Encoder structure */ + Word32 *speech_buff, /* i : Current speech frame Q_speech */ + const Word16 *A_PCh_fx, /* i : primary channel LP coefficients Q12*/ + const Word16 *A_SCh_fx, /* i : secondary channel LP coeff. Q12*/ + const Word16 m, /* i : filter length */ + const Word16 *isp_PCh_fx, /* i : primary channel LSPs Q15 */ + const Word16 *isp_SCh_fx, /* i : secondary channel LSPs Q15 */ + const Word16 L_frame, /* i : frame length */ + const Word32 element_brate_wo_meta, /* i : element bitrate without metadata */ + Word16 Q_speech +); ivas_error signaling_enc_secondary_fx( - Encoder_State *st, /* i/o: Encoder structure */ - const Word16 tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag OR LRTD primary channel */ - const Word16 tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag*/ + Encoder_State *st, /* i/o: Encoder structure */ + const Word16 tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag OR LRTD primary channel */ + const Word16 tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag */ ); void tdm_low_rate_enc( - Encoder_State *st, /* i/o: State structure */ - const Word16 Aq[], /* i : 12k8 Lp coefficient */ - const Word16 *res, - /* i : residual signal */ // Q_new - Word16 *synth, - /* i/o: core synthesis */ // Q_new - Word16 *exc_fx, - /* i/o: current non-enhanced excitation */ // Q_new - Word16 *pitch_buf, - /* i/o: floating pitch values for each subframe */ // Q6 - Word16 *voice_factors, - /* o : voicing factors */ // Q15 - Word16 *bwe_exc_fx, - /* o : excitation for SWB TBE */ // Q_new - const Word16 attack_flag, /* i : attck flag */ - const Word16 *lsf_new, - /* i : current frame ISF vector */ // x2.56 - Word16 *tmp_noise, - /* o : long-term noise energy */ // Q8 - Word16 Q_new ); + Encoder_State *st, /* i/o: State structure */ + const Word16 Aq[], /* i : 12k8 Lp coefficient */ + const Word16 *res, /* i : residual signal Q_new*/ + Word16 *synth, /* i/o: core synthesis Q_new*/ + Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/ + Word16 *pitch_buf, /* i/o: floating pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_new*/ + const Word16 attack_flag, /* i : attack flag */ + const Word16 *lsf_new, /* i : current frame ISF vector x2.56 */ + Word16 *tmp_noise, /* o : long-term noise energy Q8 */ + Word16 Q_new +); void tdm_low_rate_dec_fx( - Decoder_State *st, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Q_exc*/ - Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - const Word16 *lsf_new /* i : ISFs at the end of the frame Q8/100 (2.56x)*/ + Decoder_State *st, /* i/o: decoder static memory */ + Word16 dct_epit[], /* o : GSC excitation in DCT domain Q_exc*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + const Word16 *lsf_new /* i : ISFs at the end of the frame Q8/100 (2.56x)*/ +); + +void tdm_SCh_LSF_intra_pred_fx( + const Word32 element_brate, /* i : element bitrate */ + const Word16 *tdm_lsfQ_PCh_fx, /* i : primary channel LSFs */ + Word16 *pred_lsf_SCh_fx /* o : predicted secondary channel LSFs */ ); void tdm_SCh_LSF_intra_pred_fx( - const Word32 element_brate, /* i : element bitrate */ - const Word16 *tdm_lsfQ_PCh_fx, /* i : primary channel LSFs */ - Word16 *pred_lsf_SCh_fx /* o : predicted secondary channel LSFs */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 *tdm_lsfQ_PCh_fx, /* i : primary channel LSFs */ + Word16 *pred_lsf_SCh_fx /* o : predicted secondary channel LSFs */ ); void tdm_SCh_lsf_reuse_fx( - const Word16 enc_dec, /* i : encoder/decoder flag */ - const Word32 element_brate, /* i : element bitrate */ - Word16 lsf_new_fx[M], /* i/o: LSFs at the end of the frame */ - Word16 lsp_new_fx[M], /* i/o: LSPs at the end of the frame */ - const Word16 tdm_lsfQ_PCh_fx[M], /* i : primary channel LSFs */ - const Word16 lsf_wgts_fx[M], /* i : LSF weights */ - Word16 *beta_index /* i/o: quantization index */ + const Word16 enc_dec, /* i : encoder/decoder flag */ + const Word32 element_brate, /* i : element bitrate */ + Word16 lsf_new_fx[M], /* i/o: LSFs at the end of the frame */ + Word16 lsp_new_fx[M], /* i/o: LSPs at the end of the frame */ + const Word16 tdm_lsfQ_PCh_fx[M], /* i : primary channel LSFs */ + const Word16 lsf_wgts_fx[M], /* i : LSF weights */ + Word16 *beta_index /* i/o: quantization index */ ); void EstimateStereoTCXNoiseLevel_fx( - Encoder_State **sts, /* i : state handle */ - Word32 *q_spectrum[CPE_CHANNELS][NB_DIV], /* i : quantized MDCT spectrum */ - Word16 gain_tcx[][NB_DIV], /* i : global gain */ - Word16 gain_tcx_e[][NB_DIV], /* i : global gain exponent */ - Word16 L_frame[][NB_DIV], /* i : frame length */ - Word16 noiseFillingBorder[][NB_DIV], /* i : noise filling border */ - Word16 hm_active[][NB_DIV], /* i : flag indicating if the harmonic model is active */ - const Word16 ignore_chan[], /* i : flag indicating whether the channel should be ignored */ - Word16 fac_ns[][NB_DIV], /* o : noise filling level */ - Word16 param_core[][NB_DIV * NPRM_DIV], /* o : quantized noise filling level */ - const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */ + Encoder_State **sts, /* i : state handle */ + Word32 *q_spectrum[CPE_CHANNELS][NB_DIV], /* i : quantized MDCT spectrum */ + Word16 gain_tcx[][NB_DIV], /* i : global gain */ + Word16 gain_tcx_e[][NB_DIV], /* i : global gain exponent */ + Word16 L_frame[][NB_DIV], /* i : frame length */ + Word16 noiseFillingBorder[][NB_DIV], /* i : noise filling border */ + Word16 hm_active[][NB_DIV], /* i : flag indicating if the harmonic model is active */ + const Word16 ignore_chan[], /* i : flag indicating whether the channel should be ignored */ + Word16 fac_ns[][NB_DIV], /* o : noise filling level */ + Word16 param_core[][NB_DIV * NPRM_DIV], /* o : quantized noise filling level */ + const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */ ); void TNSAnalysisStereo_fx( - Encoder_State **sts, /* i : encoder state handle */ - Word32 *mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* o : MDST spectrum Qx*/ - const Word16 bWhitenedDomain, /* i : whitened domain flag Q0*/ - Word16 tnsSize[CPE_CHANNELS][NB_DIV], /* i : number of tns parameters put into prm Q0*/ - Word16 tnsBits[CPE_CHANNELS][NB_DIV], /* i : number of tns bits in the frame Q0*/ - Word16 param_core[][NB_DIV * NPRM_DIV], /* o : TNS parameters Q0*/ - const Word16 mct_on /* i : flag mct block (1) or stereo (0) Q0*/ + Encoder_State **sts, /* i : encoder state handle */ + Word32 *mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* o : MDST spectrum Qx*/ + const Word16 bWhitenedDomain, /* i : whitened domain flag Q0*/ + Word16 tnsSize[CPE_CHANNELS][NB_DIV], /* i : number of tns parameters put into prm Q0*/ + Word16 tnsBits[CPE_CHANNELS][NB_DIV], /* i : number of tns bits in the frame Q0*/ + Word16 param_core[][NB_DIV * NPRM_DIV], /* o : TNS parameters Q0*/ + const Word16 mct_on /* i : flag mct block (1) or stereo (0) Q0*/ ); void init_tcx_enc_info_fx( - Encoder_State *st, /* i/o: coder memory state */ + Encoder_State *st, /* i/o: coder memory state */ Word16 *L_frame, Word16 *L_frameTCX, - Word16 *L_spec ); + Word16 *L_spec +); void SetCurrentPsychParams( const Word16 core, const Word16 last_frame_was_concealed_cng, - TCX_CONFIG_HANDLE hTcxCfg ); + TCX_CONFIG_HANDLE hTcxCfg +); void sns_avq_cod_fx( - const Word32 *sns_fx, /* i : Input sns vectors */ + const Word32 *sns_fx, /* i : Input sns vectors */ Word16 exp_sns, - const Word32 *snsmid_fx, /* i : Input mid-sns vectors */ + const Word32 *snsmid_fx, /* i : Input mid-sns vectors */ Word16 exp_snsmid, - Word32 *sns_q_fx, /* o : Quantized LFS vectors Q16 */ - Word32 *snsmid_q_fx, /* o : Quantized mid-LFS vectors Q16 */ - Word16 *index, /* o : Quantization indices */ - const Word16 core, /* i : core */ + Word32 *sns_q_fx, /* o : Quantized LFS vectors Q16 */ + Word32 *snsmid_q_fx, /* o : Quantized mid-LFS vectors Q16 */ + Word16 *index, /* o : Quantization indices */ + const Word16 core, /* i : core */ const Word16 L_frame, - const Word16 low_brate_mode /* i : flag low bit operating mode */ + const Word16 low_brate_mode /* i : flag low bit operating mode */ ); void sns_avq_cod_stereo_fx( - const Word32 *snsl_fx, /* i : Input sns vector (left channel) */ + const Word32 *snsl_fx, /* i : Input sns vector (left channel) */ Word16 exp_snl, - const Word32 *snsr_fx, /* i : Input sns vector (right channel) */ + const Word32 *snsr_fx, /* i : Input sns vector (right channel) */ Word16 exp_snr, const Word16 L_frame, - Word32 *snsl_q_fx, /* o : Quantized sns vector (left channel) Q16 */ - Word32 *snsr_q_fx, /* o : Quantized sns vector (right channel) Q16 */ - Word16 *indexl, /* o : Quantization indices (left channel) */ - Word16 *indexr /* o : Quantization indices (right channel) */ + Word32 *snsl_q_fx, /* o : Quantized sns vector (left channel) Q16 */ + Word32 *snsr_q_fx, /* o : Quantized sns vector (right channel) Q16 */ + Word16 *indexl, /* o : Quantization indices (left channel) */ + Word16 *indexr /* o : Quantization indices (right channel) */ ); ivas_error initMdctStereoDtxData_fx( @@ -4556,307 +4593,259 @@ ivas_error initMdctStereoDtxData_fx( ); void applyDmxMdctStereo_fx( - const CPE_DEC_HANDLE hCPE, /* i : CPE handle */ - Word32 *output_fx[CPE_CHANNELS], /* o : output from core decoder q_out*/ - const Word16 output_frame /* i : output frame length Q0*/ + const CPE_DEC_HANDLE hCPE, /* i : CPE handle */ + Word32 *output_fx[CPE_CHANNELS], /* o : output from core decoder q_out*/ + const Word16 output_frame /* i : output frame length Q0*/ ); ivas_error front_vad_create_fx( - FRONT_VAD_ENC_HANDLE *hFrontVad, /* i/o: front-VAD handle */ - const ENCODER_CONFIG_HANDLE hEncoderConfig /* i : configuration structure */ + FRONT_VAD_ENC_HANDLE *hFrontVad, /* i/o: front-VAD handle */ + const ENCODER_CONFIG_HANDLE hEncoderConfig /* i : configuration structure */ ); void front_vad_destroy_fx( - FRONT_VAD_ENC_HANDLE *hFrontVad /* i/o: front-VAD handle */ + FRONT_VAD_ENC_HANDLE *hFrontVad /* i/o: front-VAD handle */ ); ivas_error front_vad_fx( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure, nullable */ - Encoder_State *st, /* i/o: encoder state structure */ - const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ - FRONT_VAD_ENC_HANDLE *hFrontVads, /* i/o: FrontVad handles */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ - const Word16 input_frame, /* i : frame length */ - Word16 vad_flag_dtx[], /* o : HE-SAD flag with additional DTX HO */ - Word32 fr_bands_fx[][2 * NB_BANDS], /* o : energy in frequency bands q_fr_bands_fx */ - Word16 q_fr_bands[], /* o : Q of fr_bands_fx Q0 */ - Word16 Etot_LR_fx[], /* o : total energy Left & Right channel Q8 */ - Word32 lf_E_fx[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels q_lf_E */ - Word16 q_lf_E[], /* o : Q of lf_E_fx */ - Word16 localVAD_HE_SAD[], /* o : HE-SAD flag without hangover, LR channels */ - Word16 vad_hover_flag[], /* o : VAD hangover flag */ - Word32 band_energies_LR_fx[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN q_band_energies_LR */ - Word16 *q_band_energies_LR, /* o : Q of band_energies_LR_fx */ - Word32 *PS_out_fx, /* o : energy spectrum q_PS_out */ - Word16 *q_PS_out, /* o : Q of PS_out_fx Q0 */ - Word16 *Bin_E_out_fx, /* o : log-energy spectrum of the current frame Q7 */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure, nullable */ + Encoder_State *st, /* i/o: encoder state structure */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + FRONT_VAD_ENC_HANDLE *hFrontVads, /* i/o: FrontVad handles */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const Word16 input_frame, /* i : frame length */ + Word16 vad_flag_dtx[], /* o : HE-SAD flag with additional DTX HO */ + Word32 fr_bands_fx[][2 * NB_BANDS], /* o : energy in frequency bands q_fr_bands_fx */ + Word16 q_fr_bands[], /* o : Q of fr_bands_fx Q0 */ + Word16 Etot_LR_fx[], /* o : total energy Left & Right channel Q8 */ + Word32 lf_E_fx[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels q_lf_E */ + Word16 q_lf_E[], /* o : Q of lf_E_fx */ + Word16 localVAD_HE_SAD[], /* o : HE-SAD flag without hangover, LR channels */ + Word16 vad_hover_flag[], /* o : VAD hangover flag */ + Word32 band_energies_LR_fx[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN q_band_energies_LR */ + Word16 *q_band_energies_LR, /* o : Q of band_energies_LR_fx */ + Word32 *PS_out_fx, /* o : energy spectrum q_PS_out */ + Word16 *q_PS_out, /* o : Q of PS_out_fx Q0 */ + Word16 *Bin_E_out_fx, /* o : log-energy spectrum of the current frame Q7 */ Word16 Q_inp, Word16 *Q_buffer, Word16 Q_add, - Word16 *front_create_flag ); - -void stereo_cna_update_params_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *output_fx[CPE_CHANNELS], /* i : Output signal OUTPUT_Q*/ - const Word16 output_frame, /* i : Output frame length Q0*/ - const Word16 tdm_ratio_idx /* i : TDM ratio index Q0*/ -); - -void mvr2r_inc_fixed_one( - const Word32 x_fx[], /* i : input vector */ - const Word16 x_inc, /* i : increment for vector x[] */ - Word32 y_fx[], /* o : output vector */ - const Word16 y_inc, /* i : increment for vector y[] */ - const Word16 n /* i : vector size */ + Word16 *front_create_flag ); -void mvr2r_inc_fixed( - const Word32 x_fx[], /* i : input vector */ - const Word16 x_inc, /* i : increment for vector x[] */ - Word32 y_fx[], /* o : output vector */ - const Word16 y_inc, /* i : increment for vector y[] */ - const Word16 n /* i : vector size */ +void stereo_cna_update_params_fx( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *output_fx[CPE_CHANNELS], /* i : Output signal OUTPUT_Q*/ + const Word16 output_frame, /* i : Output frame length Q0*/ + const Word16 tdm_ratio_idx /* i : TDM ratio index Q0*/ ); -void v_mult_inc_fx( - const Word32 x1_fx[], /* i : Input vector 1 */ - Word16 *x1_q_fx, - const Word16 x1_inc, /* i : Increment for input vector 1 */ - const Word32 x2_fx[], /* i : Input vector 2 */ - Word16 *x2_q_fx, - const Word16 x2_inc, /* i : Increment for input vector 1 */ - Word32 y_fx[], /* o : Output vector that contains vector 1 .* vector 2 */ - Word16 *y_q_fx, - const Word16 y_inc, /* i : increment for vector y[i] */ - const Word16 N /* i : Vector length */ +void mvr2r_inc_fx( + const Word32 x_fx[], /* i : input vector */ + const Word16 x_inc, /* i : increment for vector x[] */ + Word32 y_fx[], /* o : output vector */ + const Word16 y_inc, /* i : increment for vector y[] */ + const Word16 n /* i : vector size */ ); void v_add_inc_fx( - const Word32 x1[], /* i : Input vector 1 */ - const Word16 x_inc, /* i : Increment for input vector 1 */ - const Word32 x2[], /* i : Input vector 2 */ - const Word16 x2_inc, /* i : Increment for input vector 2 */ - Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ - const Word16 y_inc, /* i : increment for vector y[] */ - const Word16 N /* i : Vector length */ + const Word32 x1[], /* i : Input vector 1 */ + const Word16 x_inc, /* i : Increment for input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + const Word16 x2_inc, /* i : Increment for input vector 2 */ + Word32 y[], /* o : Output vector containing vector 1 + vector 2*/ + const Word16 y_inc, /* i : increment for vector y[] */ + const Word16 N /* i : Vector length */ ); + Word32 logsumexp_fx( - const Word32 x[], /* i : input array x */ + const Word32 x[], /* i : input array x */ const Word16 x_e, - const Word16 N /* i : number of elements in array x */ + const Word16 N /* i : number of elements in array x */ ); + Word32 lin_interp32_fx( - const Word32 x, /* i : the value to be mapped */ - const Word32 x1, /* i : source range interval: low end */ - const Word32 y1, /* i : source range interval: high end */ - const Word32 x2, /* i : target range interval: low */ - const Word32 y2, /* i : target range interval: high */ - const Word16 flag_sat /* i : flag to indicate whether to apply saturation */ + const Word32 x, /* i : the value to be mapped */ + const Word32 x1, /* i : source range interval: low end */ + const Word32 y1, /* i : source range interval: high end */ + const Word32 x2, /* i : target range interval: low */ + const Word32 y2, /* i : target range interval: high */ + const Word16 flag_sat /* i : flag to indicate whether to apply saturation */ ); void v_addc_fx( - const Word32 x_fx[], /* i : Input vector */ - const Word32 c_fx, /* i : Constant */ - Word32 y_fx[], /* o : Output vector that contains c*x */ - const Word16 N /* i : Vector length */ -); - -void v_addc_fixed( - const Word32 x[], /* i : Input vector */ - const Word32 c, /* i : Constant */ - Word32 y[], /* o : Output vector that contains c*x */ - const Word16 N /* i : Vector length */ + const Word32 x_fx[], /* i : Input vector */ + const Word32 c_fx, /* i : Constant */ + Word32 y_fx[], /* o : Output vector that contains c*x */ + const Word16 N /* i : Vector length */ ); void v_min_fx( - const Word32 x1_fx[], /* i : Input vector 1 */ + const Word32 x1_fx[], /* i : Input vector 1 */ Word16 *x1_q_fx, - const Word32 x2_fx[], /* i : Input vector 2 */ + const Word32 x2_fx[], /* i : Input vector 2 */ Word16 *x2_q_fx, - Word32 y_fx[], /* o : Output vector that contains vector 1 .* vector 2 */ + Word32 y_fx[], /* o : Output vector that contains vector 1 .* vector 2 */ Word16 *y_q_fx, - const Word16 N /* i : Vector length */ + const Word16 N /* i : Vector length */ ); -void v_mult_inc_fixed( - const Word32 x1_fx[], /* i : Input vector 1 */ - const Word16 x1_inc, /* i : Increment for input vector 1 */ - const Word32 x2_fx[], /* i : Input vector 2 */ - const Word16 x2_inc, /* i : Increment for input vector 1 */ - Word32 y_fx[], /* o : Output vector that contains vector 1 .* vector 2 */ - const Word16 y_inc, /* i : increment for vector y[i] */ - const Word16 N /* i : Vector length */ +void v_mult_inc_fx( + const Word32 x1_fx[], /* i : Input vector 1 */ + const Word16 x1_inc, /* i : Increment for input vector 1 */ + const Word32 x2_fx[], /* i : Input vector 2 */ + const Word16 x2_inc, /* i : Increment for input vector 1 */ + Word32 y_fx[], /* o : Output vector that contains vector 1 .* vector 2 */ + const Word16 y_inc, /* i : increment for vector y[i] */ + const Word16 N /* i : Vector length */ ); void v_sqrt_fx( - const Word32 x[], /* i : Input vector */ + const Word32 x[], /* i : Input vector */ Word16 exp[], - Word32 y[], /* o : Output vector that contains sqrt(x) */ - const Word16 N /* i : Vector length */ + Word32 y[], /* o : Output vector that contains sqrt(x) */ + const Word16 N /* i : Vector length */ ); Word32 sumAbs_fx( - const Word32 *vec, /* i : input vector */ - const Word16 lvec /* i : length of input vector */ -); - -Word32 dot_product_cholesky_fx( - const Word32 *x, /* i : vector x */ - const Word32 *A, /* i : Cholesky matrix A */ - const Word16 N /* i : vector & matrix size */ -); - -#ifndef DOT_PROD_CHOLESKY_64BIT -Word32 dot_product_cholesky_fixed( - const Word32 *x, /* i : vector x */ - const Word32 *A, /* i : Cholesky matrix A */ - const Word16 N, /* i : vector & matrix size */ - const Word16 exp_x, - const Word16 exp_A, - Word16 *exp_sum ); -#else -Word64 dot_product_cholesky_fixed( - const Word32 *x, /* i : vector x */ - const Word32 *A, /* i : Cholesky matrix A */ - const Word16 N /* i : vector & matrix size */ + const Word32 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ +); + +Word64 dot_product_cholesky_fx( + const Word32 *x, /* i : vector x */ + const Word32 *A, /* i : Cholesky matrix A */ + const Word16 N /* i : vector & matrix size */ ); -#endif void v_mult_mat_fx( - Word32 *y_fx, /* o : the product x*A */ - Word16 *y_q_fx, - const Word32 *x_fx, /* i : vector x */ - Word16 *x_q_fx, - const Word32 *A_fx, /* i : matrix A */ - Word16 *A_q_fx, - const Word16 N, /* i : number of rows */ - const Word16 C /* i : number of columns */ -); -void v_mult_mat_fixed( - Word32 *y, /* o : the product x*A */ - const Word32 *x, /* i : vector x */ - const Word32 *A, /* i : matrix A */ - const Word16 Nr, /* i : number of rows */ - const Word16 Nc, /* i : number of columns */ - Word16 guardbits ); + Word32 *y, /* o : the product x*A */ + const Word32 *x, /* i : vector x */ + const Word32 *A, /* i : matrix A */ + const Word16 Nr, /* i : number of rows */ + const Word16 Nc, /* i : number of columns */ + Word16 guardbits +); Word32 check_bounds_l( - const Word32 value, /* i : Input value */ - const Word32 low, /* i : Low limit */ - const Word32 high /* i : High limit */ + const Word32 value, /* i : Input value */ + const Word32 low, /* i : Low limit */ + const Word32 high /* i : High limit */ ); Word16 check_bounds_s_fx( - const Word16 value, /* i : Input value */ - const Word16 low, /* i : Low limit */ - const Word16 high /* i : High limit */ + const Word16 value, /* i : Input value */ + const Word16 low, /* i : Low limit */ + const Word16 high /* i : High limit */ ); ivas_error stereo_memory_enc_fx( - CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - const Word32 input_Fs, /* i : input sampling rate */ - const Word16 max_bwidth, /* i : maximum audio bandwidth */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word16 nchan_transport /* i : number transport chans */ + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + const Word32 input_Fs, /* i : input sampling rate */ + const Word16 max_bwidth, /* i : maximum audio bandwidth */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const Word16 nchan_transport /* i : number transport chans */ ); void stereo_switching_enc_fx( - CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - Word16 old_input_signal_pri[], /* i : old input signal of primary channel */ - const Word16 input_frame, /* i : input frame length */ - const Word16 q_inp ); - + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + Word32 old_input_signal_pri[], /* i : old input signal of primary channel */ + const Word16 input_frame, /* i : input frame length */ + const Word16 q_inp +); void stereo_td2dft_update_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const Word16 n, /* i : channel number Q0*/ - Word32 output_fx[], /* i/o: synthesis @internal Fs Q11*/ - Word32 synth_fx[], /* i/o: synthesis @output Fs Q11*/ - Word32 hb_synth_fx[], /* i/o: hb synthesis Q11*/ - const Word16 output_frame /* i : frame length Q0*/ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const Word16 n, /* i : channel number Q0*/ + Word32 output_fx[], /* i/o: synthesis @internal Fs Q11*/ + Word32 synth_fx[], /* i/o: synthesis @output Fs Q11*/ + Word32 hb_synth_fx[], /* i/o: hb synthesis Q11*/ + const Word16 output_frame /* i : frame length Q0*/ ); void stereo_mdct2dft_update_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 output0_fx[], /* i/o: synthesis @internal Fs, ch0 Q11*/ - Word32 synth0_fx[] /* i/o: synthesis @output Fs, ch0 Q11*/ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 output0_fx[], /* i/o: synthesis @internal Fs, ch0 Q11*/ + Word32 synth0_fx[] /* i/o: synthesis @output Fs, ch0 Q11*/ ); Word16 write_GR0_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ - const Word16 ind, /* i : bitstream index */ - const Word16 *in, /* i : data to be encoded */ - const Word16 len /* i : input data length */ + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const Word16 ind, /* i : bitstream index */ + const Word16 *in, /* i : data to be encoded */ + const Word16 len /* i : input data length */ ); void ivas_mct_core_dec( - MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ - CPE_DEC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE decoder structure */ - const Word16 nCPE, /* i : number of CPEs */ + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + CPE_DEC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE decoder structure */ + const Word16 nCPE, /* i : number of CPEs */ Word32 *signal_out_fx[], - Word16 q_x[MCT_MAX_CHANNELS] ); + Word16 q_x[MCT_MAX_CHANNELS] +); void ivas_qmetadata_to_dirac_fx( - const IVAS_QMETADATA_HANDLE hQMetaData, /* i : frame of MASA q_metadata */ - DIRAC_DEC_HANDLE hDirAC, /* i : DirAC decoder structure */ - MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - Word16 *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + const IVAS_QMETADATA_HANDLE hQMetaData, /* i : frame of MASA q_metadata */ + DIRAC_DEC_HANDLE hDirAC, /* i : DirAC decoder structure */ + MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + Word16 *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); Word16 masa_sq_fx( - const Word32 in, /* i : input value */ - const Word32 *threshold, /* i : partition */ - const Word16 cb_sz /* i : codebook size */ + const Word32 in, /* i : input value */ + const Word32 *threshold, /* i : partition */ + const Word16 cb_sz /* i : codebook size */ ); Word16 quantize_direction2D_fx( - Word32 phi, /* i : input azimuth value Q22 */ - const Word16 no_cw, /* i : number of bits */ - Word32 *phi_q, /* o : quantized azimuth value Q22 */ - UWord16 *index_phi, /* o : quantized azimuth index */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ + Word32 phi, /* i : input azimuth value Q22 */ + const Word16 no_cw, /* i : number of bits */ + Word32 *phi_q, /* o : quantized azimuth value Q22 */ + UWord16 *index_phi, /* o : quantized azimuth index */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ); Word32 companding_azimuth_fx( - const Word32 azi_fx, /* i : input azimuth value */ - const MC_LS_SETUP mc_format, /* i : input channel format */ - const Word16 theta_flag, /* i : zero/non zero elevation flag */ - const Word16 direction /* i : direction of companding (direct or inverse)*/ + const Word32 azi_fx, /* i : input azimuth value */ + const MC_LS_SETUP mc_format, /* i : input channel format */ + const Word16 theta_flag, /* i : zero/non zero elevation flag */ + const Word16 direction /* i : direction of companding (direct or inverse) */ ); Word16 quantize_phi_fx( - Word32 phi, /* i : azimuth value */ - const Word16 flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ - Word32 *phi_hat, /* o : quantized azimuth */ - const Word16 n /* i : azimuth codebook size */ + Word32 phi, /* i : azimuth value */ + const Word16 flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ + Word32 *phi_hat, /* o : quantized azimuth */ + const Word16 n /* i : azimuth codebook size */ ); Word32 deindex_elevation_fx( - UWord16 *id_th, /* i : input index */ - const Word16 no_bits, /* i : number of bits for the spherical grid */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ + UWord16 *id_th, /* i : input index */ + const Word16 no_bits, /* i : number of bits for the spherical grid */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ); Word32 deindex_azimuth_fx( - Word16 id_phi, /* i : index */ - const Word16 no_bits, /* i : number of bits for the spherical grid */ - const Word16 id_th, /* i : elevation index */ - const Word16 remap, /* i : remapping flag */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ + Word16 id_phi, /* i : index */ + const Word16 no_bits, /* i : number of bits for the spherical grid */ + const Word16 id_th, /* i : elevation index */ + const Word16 remap, /* i : remapping flag */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ); + void deindex_spherical_component_fx( - const UWord16 sph_idx, /* i : spherical index */ - Word32 *az_fx, /* o : decoded azimuth value */ - Word32 *el_fx, /* o : decoded elevation value */ - UWord16 *az_idx, /* o : azimuth index */ - UWord16 *el_idx, /* o : elevation index */ - const UWord16 no_bits, /* i : number of bits for the spherical grid */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ + const UWord16 sph_idx, /* i : spherical index */ + Word32 *az_fx, /* o : decoded azimuth value */ + Word32 *el_fx, /* o : decoded elevation value */ + UWord16 *az_idx, /* o : azimuth index */ + UWord16 *el_idx, /* o : elevation index */ + const UWord16 no_bits, /* i : number of bits for the spherical grid */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ); void ivas_dirac_param_est_enc_fx( @@ -4873,95 +4862,61 @@ void ivas_dirac_param_est_enc_fx( const Word16 nchan_fb_in, Word16 *mono_frame_count, Word16 *dirac_mono_flag, - const Word16 shift ); + const Word16 shift +); ivas_error ivas_cldfb_dec_reconfig_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 nchan_transport_old, /* i : number of TCs in previous frame */ - Word16 numCldfbAnalyses_old, /* i : number of CLDFB analysis instances in previous frame */ - const Word16 numCldfbSyntheses_old /* i : number of CLDFB synthesis instances in previous frame */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 nchan_transport_old, /* i : number of TCs in previous frame */ + Word16 numCldfbAnalyses_old, /* i : number of CLDFB analysis instances in previous frame */ + const Word16 numCldfbSyntheses_old /* i : number of CLDFB synthesis instances in previous frame */ ); ivas_error ivas_sba_enc_reconfigure_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -); - -Word16 ivas_sba_get_order_fx( - const Word16 nb_channels, /* i : Number of ambisonic channels */ - const Word16 sba_planar /* i : SBA planar flag */ -); - -/*! r: Ambisonic (SBA) order used for analysis and coding */ -Word16 ivas_sba_get_analysis_order( - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 sba_order /* i : Ambisonic (SBA) order */ -); - -Word16 ivas_sba_get_nchan_metadata( - const Word16 sba_order, /* i : Ambisonic (SBA) order */ - const Word32 ivas_total_brate /* i : IVAS total bitrate */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); -void ivas_sba_get_spar_hoa_ch_ind( - const Word16 num_md_chs, /* i : number of MD channels */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - Word16 HOA_md_ind[IVAS_SPAR_MAX_CH] ); - -/*! r: flag indicating to code SPAR HOA MD for all bands */ -void ivas_sba_get_spar_hoa_md_flag( - const Word16 sba_order, /* i : Ambisonic (SBA) order */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - Word16 *spar_hoa_md_flag, - Word16 *spar_hoa_dirac2spar_md_flag ); - Word16 ivas_sba_remapTCs_fx( - Word32 *sba_data[], /* i/o: SBA signals */ - Decoder_Struct *st_ivas, /* i/o: decoder struct */ - const Word16 output_frame /* i : frame length */ + Word32 *sba_data[], /* i/o: SBA signals */ + Decoder_Struct *st_ivas, /* i/o: decoder struct */ + const Word16 output_frame /* i : frame length */ ); -void ivas_sba2mc_cldfb_fixed( - IVAS_OUTPUT_SETUP hInSetup, /* i : Format of input layout */ - Word32 RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb real part (Q_real) */ - Word32 ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part (Q_imag) */ - const Word16 nb_channels_out, /* i : nb of output channels */ - const Word16 nb_bands, /* i : nb of CLDFB bands to process */ - const Word16 nb_timeslots, /* i : number of time slots to process */ - const Word32 *hoa_dec_mtx /* i : HOA decoding mtx */ +void ivas_sba2mc_cldfb_fx( + IVAS_OUTPUT_SETUP hInSetup, /* i : Format of input layout */ + Word32 RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb real part (Q_real) */ + Word32 ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part (Q_imag) */ + const Word16 nb_channels_out, /* i : nb of output channels */ + const Word16 nb_bands, /* i : nb of CLDFB bands to process */ + const Word16 nb_timeslots, /* i : number of time slots to process */ + const Word32 *hoa_dec_mtx /* i : HOA decoding mtx */ ); void ivas_dirac_config_bands_fx( - Word16 *band_grouping, /* o : band grouping */ - const Word16 nbands, /* i : number of bands */ - const Word16 max_band, /* i : maximal band index +1 */ - Word16 *dirac_to_spar_md_bands, /* o : mapping of DirAC parameter band index to SPAR FB band index */ - const Word8 useLowerBandRes, /* i : flag indicating lower band resolution for DirAC */ - const Word16 enc_param_start_band, /* i : band index of first DirAC parameter band */ - IVAS_FB_MIXER_HANDLE hFbMdft ); + Word16 *band_grouping, /* o : band grouping */ + const Word16 nbands, /* i : number of bands */ + const Word16 max_band, /* i : maximal band index +1 */ + Word16 *dirac_to_spar_md_bands, /* o : mapping of DirAC parameter band index to SPAR FB band index */ + const Word8 useLowerBandRes, /* i : flag indicating lower band resolution for DirAC */ + const Word16 enc_param_start_band, /* i : band index of first DirAC parameter band */ + IVAS_FB_MIXER_HANDLE hFbMdft, + const Word8 BandGroupLowRes +); void ivas_dirac_dec_close_fx( - DIRAC_DEC_HANDLE *hDirAC_out ); - -void generate_masking_noise_lb_dirac_fx( - HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ - Word32 *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ - const Word16 nCldfbTs, /* i : number of CLDFB slots that will be rendered */ - const Word16 cna_flag /* i : CNA flag for LB and HB */ + DIRAC_DEC_HANDLE *hDirAC_out ); void generate_masking_noise_lb_dirac_fx( - HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ - Word32 *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ - const Word16 nCldfbTs, /* i : number of CLDFB slots that will be rendered */ - const Word16 cna_flag /* i : CNA flag for LB and HB */ + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + Word32 *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ + const Word16 nCldfbTs, /* i : number of CLDFB slots that will be rendered */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i : common spatial rendering parameters handle */ + const Word16 cna_flag /* i : CNA flag for LB and HB */ ); void ivas_dirac_dec_close_fx( - DIRAC_DEC_HANDLE *hDirAC_out ); - -void ivas_dirac_dec_set_md_map( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 nCldfbTs /* i : number of CLDFB time slots */ + DIRAC_DEC_HANDLE *hDirAC_out ); void computeDirectionVectors_fx( @@ -4973,251 +4928,259 @@ void computeDirectionVectors_fx( Word32 *direction_vector_x, Word32 *direction_vector_y, Word32 *direction_vector_z, - Word16 *q_factor ); - - -void computeDiffuseness_fx( - Word32 *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], - const Word32 *buffer_energy, - const Word16 num_freq_bands, - Word32 *diffuseness, - Word16 q_factor_intensity, - Word16 q_factor_energy, - Word16 *out_exp - + Word16 *q_factor ); -void computeDiffuseness_fixed( +void computeDiffuseness_fx( Word32 *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], const Word32 *buffer_energy, const Word16 num_freq_bands, Word32 *diffuseness, Word16 *q_factor_intensity, Word16 *q_factor_energy, - Word16 *q_diffuseness ); + Word16 *q_diffuseness +); void ivas_dirac_dec_get_response_fx( const Word16 azimuth, const Word16 elevation, Word32 *response_fx, /*Q_out*/ const Word16 ambisonics_order, - Word16 Q_out ); + Word16 Q_out +); + +/*This is a derivate to ivas_dirac_dec_get_response_fx with fixed Q_out=29*/ +void ivas_dirac_dec_get_response_fx_29( + const Word16 azimuth, + const Word16 elevation, + Word32 *response_fx, /*Q_out=29*/ + const Word16 ambisonics_order +); void calculate_hodirac_sector_parameters_fx( - DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */ - Word32 RealBuffer_fx[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */ - Word32 ImagBuffer_fx[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */ - Word16 Qfac, /* i : Q-factor of signal vector */ - const Word32 beta_fx, /* i : forgetting factor for average filtering, Q30 */ - const Word16 *band_grouping, /* i : indices of band groups */ - const Word16 N_bands, /* i : number of bands (groups) */ - const Word16 enc_param_start_band, /* i : first band to process */ - Word32 *azi_fx, /* o : array of sector azimuth angles, flat Q23 */ - Word32 *ele_fx, /* o : array of sector elevation angles, flat Q23 */ - Word32 *diff_fx, /* o : array of sector diffuseness values, flat */ - Word16 *diff_exp, /* o : array of sector diffuseness exponents, flat */ - Word32 *ene_fx, /* o : array of sector energy values, flat */ - Word16 *ene_exp /* o : array of sector energy exponents, flat */ + DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */ + Word32 RealBuffer_fx[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins,real part*/ + Word32 ImagBuffer_fx[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */ + Word16 Qfac, /* i : Q-factor of signal vector */ + const Word32 beta_fx, /* i : forgetting factor for average filtering, Q30 */ + const Word16 *band_grouping, /* i : indices of band groups */ + const Word16 N_bands, /* i : number of bands (groups) */ + const Word16 enc_param_start_band, /* i : first band to process */ + Word32 *azi_fx, /* o : array of sector azimuth angles, flat Q23 */ + Word32 *ele_fx, /* o : array of sector elevation angles, flat Q23 */ + Word32 *diff_fx, /* o : array of sector diffuseness values, flat */ + Word16 *diff_exp, /* o : array of sector diffuseness exponents, flat */ + Word32 *ene_fx, /* o : array of sector energy values, flat */ + Word16 *ene_exp /* o : array of sector energy exponents, flat */ ); void ivas_mc_paramupmix_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ Word32 *data_fx[], - const Word16 input_frame /* i : input frame length */ + const Word16 input_frame /* i : input frame length */ ); -void ivas_mc_paramupmix_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ - UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ - UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - Word32 *input_fx[], /* i : core-coder transport channels */ - Word32 *output_fx[] /* i/o: synthesized core-coder transport channels */ +void ivas_mc_paramupmix_dec_render_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + Word32 *input_fx[], /* i : core-coder transport channels */ + Word32 *output_fx[] /* i/o: synthesized core-coder transport channels */ ); Word16 ivas_param_mc_getNumTransportChannels_fx( - const Word32 ivas_total_bitrate, /* i : IVAS total bitrate */ - const MC_LS_SETUP mc_ls_setup /* i : MC ls setup */ + const Word32 ivas_total_bitrate, /* i : IVAS total bitrate */ + const MC_LS_SETUP mc_ls_setup /* i : MC ls setup */ ); ivas_error ivas_param_mc_dec_open_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); ivas_error ivas_param_mc_dec_reconfig_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void ivas_param_mc_dec_close_fx( - PARAM_MC_DEC_HANDLE *hParamMC_out /* i/o: Parametric MC decoder handle */ + PARAM_MC_DEC_HANDLE *hParamMC_out /* i/o: Parametric MC decoder handle */ ); void ivas_param_mc_dec_digest_tc_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord8 nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ - Word32 *transport_channels_f_fx[], - Word16 transport_f_e ); + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord8 nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + Word32 *p_data_fx[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const Word16 q_data /* i : Q-factor of input signal for single channel */ +); + +void ivas_param_mc_dec_prepare_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord8 nCldfbSlots /* i : number of CLFBS slots in the transport channels */ +); void ivas_param_mc_dec_render_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ - UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ - UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - Word32 *output_f_fx[], /* o : rendered time signal */ - Word16 channel_active_fx[MAX_OUTPUT_CHANNELS] ); + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + Word32 *output_fx[], /* o : rendered time signal */ + Word16 channel_active_fx[MAX_OUTPUT_CHANNELS] +); Word16 matrix_product_mant_exp_fx( - const Word32 *X_fx, /* i : left hand matrix */ - const Word16 X_fx_e, /* i : left hand matrix */ - const Word16 rowsX, /* i : number of rows of the left hand matrix */ - const Word16 colsX, /* i : number of columns of the left hand matrix */ - const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ - const Word32 *Y_fx, /* i : right hand matrix */ - const Word16 Y_fx_e, /* i : right hand matrix */ - const Word16 rowsY, /* i : number of rows of the right hand matrix */ - const Word16 colsY, /* i : number of columns of the right hand matrix */ - const Word16 transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ - Word32 *Z_fx, /* o : resulting matrix after the matrix multiplication */ - Word16 *Z_fx_e /* o : resulting matrix after the matrix multiplication */ + const Word32 *X_fx, /* i : left hand matrix */ + const Word16 X_fx_e, /* i : left hand matrix */ + const Word16 rowsX, /* i : number of rows of the left hand matrix */ + const Word16 colsX, /* i : number of columns of the left hand matrix */ + const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ + const Word32 *Y_fx, /* i : right hand matrix */ + const Word16 Y_fx_e, /* i : right hand matrix */ + const Word16 rowsY, /* i : number of rows of the right hand matrix */ + const Word16 colsY, /* i : number of columns of the right hand matrix */ + const Word16 transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ + Word32 *Z_fx, /* o : resulting matrix after the matrix multiplication */ + Word16 *Z_fx_e /* o : resulting matrix after the matrix multiplication */ ); Word16 matrix_product_fx( - const Word32 *X_fx, /* i : left hand matrix */ - const Word16 rowsX, /* i : number of rows of the left hand matrix */ - const Word16 colsX, /* i : number of columns of the left hand matrix */ - const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ - const Word32 *Y_fx, /* i : right hand matrix */ - const Word16 rowsY, /* i : number of rows of the right hand matrix */ - const Word16 colsY, /* i : number of columns of the right hand matrix */ - const Word16 transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ - Word32 *Z_fx /* o : resulting matrix after the matrix multiplication */ + const Word32 *X_fx, /* i : left hand matrix */ + const Word16 rowsX, /* i : number of rows of the left hand matrix */ + const Word16 colsX, /* i : number of columns of the left hand matrix */ + const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ + const Word32 *Y_fx, /* i : right hand matrix */ + const Word16 rowsY, /* i : number of rows of the right hand matrix */ + const Word16 colsY, /* i : number of columns of the right hand matrix */ + const Word16 transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ + Word32 *Z_fx /* o : resulting matrix after the matrix multiplication */ ); Word16 matrix_product_q30_fx( - const Word32 *X_fx, /* i : left hand matrix */ - const Word16 rowsX, /* i : number of rows of the left hand matrix */ - const Word16 colsX, /* i : number of columns of the left hand matrix */ - const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ - const Word32 *Y_fx, /* i : right hand matrix */ - const Word16 rowsY, /* i : number of rows of the right hand matrix */ - const Word16 colsY, /* i : number of columns of the right hand matrix */ - const Word16 transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ - Word32 *Z_fx /* o : resulting matrix after the matrix multiplication */ + const Word32 *X_fx, /* i : left hand matrix */ + const Word16 rowsX, /* i : number of rows of the left hand matrix */ + const Word16 colsX, /* i : number of columns of the left hand matrix */ + const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ + const Word32 *Y_fx, /* i : right hand matrix */ + const Word16 rowsY, /* i : number of rows of the right hand matrix */ + const Word16 colsY, /* i : number of columns of the right hand matrix */ + const Word16 transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ + Word32 *Z_fx /* o : resulting matrix after the matrix multiplication */ ); Word16 matrix_product_mant_exp( - const Word32 *X_fx, /* i : left hand matrix */ - const Word16 *X_e, /* i : left hand matrix */ - const Word16 rowsX, /* i : number of rows of the left hand matrix */ - const Word16 colsX, /* i : number of columns of the left hand matrix */ - const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ - const Word32 *Y_fx, /* i : right hand matrix */ - const Word16 *Y_e, /* i : right hand matrix */ - const Word16 rowsY, /* i : number of rows of the right hand matrix */ - const Word16 colsY, /* i : number of columns of the right hand matrix */ - const Word16 transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ - Word32 *Z_fx, /* o : resulting matrix after the matrix multiplication */ - Word16 *Z_e /* o : resulting matrix after the matrix multiplication */ + const Word32 *X_fx, /* i : left hand matrix */ + const Word16 *X_e, /* i : left hand matrix */ + const Word16 rowsX, /* i : number of rows of the left hand matrix */ + const Word16 colsX, /* i : number of columns of the left hand matrix */ + const Word16 transpX, /* i : flag indicating the transposition of the left hand matrix prior to the multiplication */ + const Word32 *Y_fx, /* i : right hand matrix */ + const Word16 *Y_e, /* i : right hand matrix */ + const Word16 rowsY, /* i : number of rows of the right hand matrix */ + const Word16 colsY, /* i : number of columns of the right hand matrix */ + const Word16 transpY, /* i : flag indicating the transposition of the right hand matrix prior to the multiplication */ + Word32 *Z_fx, /* o : resulting matrix after the matrix multiplication */ + Word16 *Z_e /* o : resulting matrix after the matrix multiplication */ ); void mat2svdMat_fx( - const Word32 *mat, /* i : matrix as column ordered vector Qx*/ - Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* o : matrix as two-dimensional arry Qx*/ - const Word16 nRows, /* i : number of rows of the matrix Q0*/ - const Word16 mCols, /* i : number of columns of the matrix Q0*/ - const Word16 transpose /* i : flag indication transposition Q0*/ + const Word32 *mat, /* i : matrix as column ordered vector Qx*/ + Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* o : matrix as two-dimensional arry Qx*/ + const Word16 nRows, /* i : number of rows of the matrix Q0*/ + const Word16 mCols, /* i : number of columns of the matrix Q0*/ + const Word16 transpose /* i : flag indication transposition Q0*/ ); void svdMat2mat_fx( - Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* i : matrix as two-dimensional arry Qx*/ - Word32 *mat, /* o : matrix as column ordered vector Qx*/ - const Word16 nRows, /* i : number of rows of the matrix Q0*/ - const Word16 mCols /* i : number of columns of the matrix Q0*/ + Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* i : matrix as two-dimensional arry Qx*/ + Word32 *mat, /* o : matrix as column ordered vector Qx*/ + const Word16 nRows, /* i : number of rows of the matrix Q0*/ + const Word16 mCols /* i : number of columns of the matrix Q0*/ ); Word16 computeMixingMatrices_fx( - const Word16 num_inputs, /* i : number of input channels */ - const Word16 num_outputs, /* i : number of output channels */ - const Word32 *Cx, /* i : input channel covariance matrix */ + const Word16 num_inputs, /* i : number of input channels */ + const Word16 num_outputs, /* i : number of output channels */ + const Word32 *Cx, /* i : input channel covariance matrix */ Word16 Cx_e, - const Word32 *Cy, /* i : target covariance matrix */ + const Word32 *Cy, /* i : target covariance matrix */ Word16 Cy_e, - const Word32 *Q, /* i : prototype matrix (usually a upmix matrix) */ + const Word32 *Q, /* i : prototype matrix (usually a upmix matrix) */ Word16 Q_fx_e, - const Word16 energy_compensation_flag, /* i : flag indicating that the energy compensation should be performed (i.e. no residual mixing matrix will follow) */ - const Word32 reg_Sx_fx, /* i : regularization factor for the input channel singular values */ + const Word16 energy_compensation_flag, /* i : flag indicating that the energy compensation should be performed (i.e. no residual mixing matrix will follow) */ + const Word32 reg_Sx_fx, /* i : regularization factor for the input channel singular values */ Word16 reg_Sx_e, - const Word32 reg_ghat_fx, /* i : regularization factor for the normalization matrix */ + const Word32 reg_ghat_fx, /* i : regularization factor for the normalization matrix */ Word16 reg_ghat_e, - Word32 *mixing_matrix_fx, /* o : resulting mixing matrix */ + Word32 *mixing_matrix_fx, /* o : resulting mixing matrix */ Word16 *mixing_matrix_out_e, - Word32 *Cr_fx, /* o : residual covariance matrix */ - Word16 *Cr_e ); + Word32 *Cr_fx, /* o : residual covariance matrix */ + Word16 *Cr_e +); Word16 computeMixingMatricesResidual_fx( - const Word32 num_outputs, /* i : number of output channels */ - const Word32 *Cx_fx, /* i : vector containing the diagonal diffuse prototype covariance */ + const Word32 num_outputs, /* i : number of output channels */ + const Word32 *Cx_fx, /* i : vector containing the diagonal diffuse prototype covariance */ const Word16 Cx_e, - const Word32 *Cy_fx, /* i : matrix containing the missing cov (Cr from computeMixingMatrices()) */ + const Word32 *Cy_fx, /* i : matrix containing the missing cov (Cr from computeMixingMatrices()) */ const Word16 Cy_fx_e, - const Word32 reg_Sx_fx, /* i : regularization factor for the input channel singular values */ + const Word32 reg_Sx_fx, /* i : regularization factor for the input channel singular values */ const Word16 reg_Sx_e, - const Word32 reg_ghat_fx, /* i : regularization factor for the normalization matrix */ + const Word32 reg_ghat_fx, /* i : regularization factor for the normalization matrix */ const Word16 reg_ghat_e, - Word32 *mixing_matrix_fx, /* o : resulting residual mixing matrix */ - Word16 *mixing_matrix_ret_e ); + Word32 *mixing_matrix_fx, /* o : resulting residual mixing matrix */ + Word16 *mixing_matrix_ret_e +); Word16 svd_fx( - Word32 InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) InputMatrix_e*/ + Word32 InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) InputMatrix_e*/ Word16 InputMatrix_e, - Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) Q31*/ - Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) singularValues_fx_e*/ - Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) Q31*/ + Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) Q31*/ + Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) singularValues_fx_e*/ + Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) Q31*/ Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], - const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ - const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed Q0*/ + const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ + const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed Q0*/ ); ivas_error ivas_dirac_dec_output_synthesis_cov_open_fx( DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ - DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: hanlde for the covariance synthesis state */ - const Word16 max_band_decorr, /* i : uppermost frequency band where decorrelation is applied */ - const Word16 interp_length, /* i : length for interpolating the mixing matrices in time slots */ - const Word16 num_param_bands, /* i : number of parameter bands */ - const Word16 num_param_bands_residual, /* i : number of parameter bands with a residual mixing matrix (i.e. decorrelation */ - const Word16 nchan_in, /* i : number of input (transport) channels */ - const Word16 nchan_out, /* i : number of output channels */ - const Word32 *proto_matrix /* i : the prototype (upmix) matrix (only used if mode == 1) */ + DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: hanlde for the covariance synthesis state */ + const Word16 max_band_decorr, /* i : uppermost frequency band where decorrelation is applied */ + const Word16 interp_length, /* i : length for interpolating the mixing matrices in time slots */ + const Word16 num_param_bands, /* i : number of parameter bands */ + const Word16 num_param_bands_residual, /* i : number of parameter bands with a residual mixing matrix (i.e. decorrelation */ + const Word16 nchan_in, /* i : number of input (transport) channels */ + const Word16 nchan_out, /* i : number of output channels */ + const Word32 *proto_matrix /* i : the prototype (upmix) matrix (only used if mode == 1) */ ); void ivas_dirac_dec_output_synthesis_get_interpolator_fx( DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ - const UWord16 interp_length /* i : interpolator length */ + const UWord16 interp_length /* i : interpolator length */ ); void ivas_dirac_dec_output_synthesis_cov_init_fx( - DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: pointer to the state of the covariance synthesis */ - const Word16 nchan_in, /* i : number of input (tranport) channels */ - const Word16 nchan_out, /* i : number of output channels */ - const Word16 n_param_bands, /* i : number of total parameter bands */ - const Word16 n_param_bands_res /* i : number of parameter bands with a residual mixing matrix (i.e. decorrelation */ + DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: pointer to the state of the covariance synthesis */ + const Word16 nchan_in, /* i : number of input (tranport) channels */ + const Word16 nchan_out, /* i : number of output channels */ + const Word16 n_param_bands, /* i : number of total parameter bands */ + const Word16 n_param_bands_res /* i : number of parameter bands with a residual mixing matrix (i.e. decorrelation */ ); void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( Word32 *Cldfb_RealBuffer_in_fx, Word32 *Cldfb_ImagBuffer_in_fx, - Word32 Cldfb_RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ - Word32 Cldfb_ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ - Word32 *mixing_matrix_fx[], /* i : parameter band wise mixing matrices (direct part) */ - Word16 *mixing_matrix_e, /* i : parameter band wise mixing matrices (direct part) */ - Word32 *mixing_matrix_res_fx[], /* i : parameter band wise mixing matrices (residual part) */ - Word16 *mixing_matrix_res_e, /* i : parameter band wise mixing matrices (residual part) */ - const UWord16 slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ - const UWord16 slot_idx_tot, /* i : time slot index for the current slot within the frame */ - const Word16 nX, /* i : number of input channels */ - const Word16 nY, /* i : number of output channels */ - PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ + Word32 Cldfb_RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ + Word32 Cldfb_ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ + Word32 *mixing_matrix_fx[], /* i : parameter band wise mixing matrices (direct part) */ + Word16 *mixing_matrix_e, /* i : parameter band wise mixing matrices (direct part) */ + Word32 *mixing_matrix_res_fx[], /* i : parameter band wise mixing matrices (residual part) */ + Word16 *mixing_matrix_res_e, /* i : parameter band wise mixing matrices (residual part) */ + const UWord16 slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ + const UWord16 slot_idx_tot, /* i : time slot index for the current slot within the frame */ + const Word16 nX, /* i : number of input channels */ + const Word16 nY, /* i : number of output channels */ + PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ ); Word16 computeMixingMatricesISM_fx( @@ -5237,140 +5200,136 @@ Word16 computeMixingMatricesISM_fx( const Word32 reg_Sx_fx, const Word32 reg_ghat_fx, Word32 *mixing_matrix_fx, - Word16 *mixing_matrix_e ); + Word16 *mixing_matrix_e +); ivas_error ivas_spar_enc_open_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder handle */ - const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder handle */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ ); void ivas_spar_enc_close_fx( - SPAR_ENC_HANDLE *hSpar, /* i/o: SPAR encoder handle */ - const Word32 input_Fs, /* i : input sampling rate */ - const Word16 nchan_inp, /* i : number of input channels */ - const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ + SPAR_ENC_HANDLE *hSpar, /* i/o: SPAR encoder handle */ + const Word32 input_Fs, /* i : input sampling rate */ + const Word16 nchan_inp, /* i : number of input channels */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ ); void ivas_spar_dec_close_fx( - SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ - const Word32 output_Fs, /* i : output sampling rate */ - const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ + SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ ); ivas_error ivas_sba_linear_renderer_fx( - Word32 *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ - const Word16 output_frame, /* i : output frame length per channel */ - const Word16 nchan_in, /* i : number of input ambisonics channels */ - const Word16 nchan_ism, /* i : number of objects */ - const AUDIO_CONFIG output_config, /* i : output audio configuration */ - const IVAS_OUTPUT_SETUP output_setup /* i : output format setup */ + Word32 *output_fx[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const Word16 output_frame, /* i : output frame length per channel */ + const Word16 nchan_in, /* i : number of input ambisonics channels */ + const Word16 nchan_ism, /* i : number of objects */ + const AUDIO_CONFIG output_config, /* i : output audio configuration */ + const IVAS_OUTPUT_SETUP output_setup /* i : output format setup */ ); void ivas_sba_mix_matrix_determiner_fx( - SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ - Word32 *output_fx[], /* i/o: transport/output audio channels */ - const Word16 bfi, /* i : BFI flag */ - const Word16 nchan_remapped, /* i : num channels after remapping of TCs */ - const Word16 output_frame, /* i : output frame length */ - const Word16 num_md_sub_frames, /* i : number of subframes in mixing matrix*/ - const Word16 Q_output /* i : Q of transport/output audio channels */ + SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ + Word32 *output_fx[], /* i/o: transport/output audio channels */ + const Word16 bfi, /* i : BFI flag */ + const Word16 nchan_remapped, /* i : num channels after remapping of TCs */ + const Word16 output_frame, /* i : output frame length */ + const Word16 num_md_sub_frames, /* i : number of subframes in mixing matrix */ + const Word16 Q_output /* i : Q of transport/output audio channels */ ); Word16 ivas_agc_enc_get_flag( - const Word16 nchan_transport /* i : number of transport channels */ + const Word16 nchan_transport /* i : number of transport channels */ ); ivas_error ivas_spar_agc_enc_open_fx( - ivas_agc_enc_state_t **hAgcEnc, /* i/o: SPAR AGC encoder handle */ - const Word32 input_Fs, /* i : input sampling rate */ - const Word16 nchan_inp /* i : number of input channels */ + ivas_agc_enc_state_t **hAgcEnc, /* i/o: SPAR AGC encoder handle */ + const Word32 input_Fs, /* i : input sampling rate */ + const Word16 nchan_inp /* i : number of input channels */ ); void ivas_spar_agc_enc_close_fx( - ivas_agc_enc_state_t **hAgcEnc /* i/o: SPAR AGC encoder handle */ + ivas_agc_enc_state_t **hAgcEnc /* i/o: SPAR AGC encoder handle */ ); void ivas_agc_enc_process_fx( - ivas_agc_enc_state_t *hAgcEnc, /* i/o: AGC encoder handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ - Word32 **ppPcm_in, /* i : input audio channels */ - Word32 **ppPcm_out, /* o : output audio channels */ - const Word16 n_channels, /* i : number of channels */ - const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ - Word16 *q_ppPcm ); + ivas_agc_enc_state_t *hAgcEnc, /* i/o: AGC encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ + Word32 **ppPcm_in, /* i : input audio channels */ + Word32 **ppPcm_out, /* o : output audio channels */ + const Word16 n_channels, /* i : number of channels */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + Word16 *q_ppPcm +); void ivas_spar_set_bitrate_config_fx( - ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ - const Word16 table_idx, /* i : config. table index */ - const Word16 num_bands, /* i : number of bands */ + ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ + const Word16 table_idx, /* i : config. table index */ + const Word16 num_bands, /* i : number of bands */ const Word16 dirac2spar_md_flag, const Word16 enc_flag, const Word16 pca_flag, - const Word16 agc_flag ); + const Word16 agc_flag +); Word16 ivas_is_res_channel( - const Word16 ch, /* i : ch index in WYZX ordering */ - const Word16 nchan_transport /* i : number of transport channels (1-4) */ + const Word16 ch, /* i : ch index in WYZX ordering */ + const Word16 nchan_transport /* i : number of transport channels (1-4) */ ); void ivas_spar_dec_agc_pca_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - Word32 *output[], /* i/o: input/output audio channels */ - const Word16 output_frame /* i : output frame length */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Word32 *output[], /* i/o: input/output audio channels */ + const Word16 output_frame /* i : output frame length */ ); void ivas_spar_dec_set_render_map_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 nCldfbTs /* i : number of CLDFB time slots */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 nCldfbTs /* i : number of CLDFB time slots */ ); void ivas_spar_dec_set_render_params_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const Word16 n_cldfb_slots /* i : number of cldfb slots in this frame */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const Word16 n_cldfb_slots /* i : number of cldfb slots in this frame */ ); void ivas_spar_dec_digest_tc_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const Word16 nchan_transport, /* i : number of transport channels */ - const Word16 nCldfbSlots, /* i : number of CLDFB slots */ - const Word16 nSamplesForRendering /* i : number of samples provided */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 nCldfbSlots, /* i : number of CLDFB slots */ + const Word16 nSamplesForRendering /* i : number of samples provided */ ); void ivas_sba_dec_digest_tc_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const Word16 nCldfbSlots, /* i : number of CLDFB slots */ - const Word16 nSamplesForRendering /* i : number of samples provided */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const Word16 nCldfbSlots, /* i : number of CLDFB slots */ + const Word16 nSamplesForRendering /* i : number of samples provided */ ); + ivas_error ivas_sba_dec_render_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ - UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ - UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ - Word32 *output_fx[] /* o : rendered time signal Q11*/ -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - , - Word16 out_len /*Store the length of values in each channel*/ -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + Word32 *output_fx[] /* o : rendered time signal Q11*/ ); void ivas_spar_dec_upmixer_sf_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - Word32 *output_fx[], /* o : output audio channels */ - const Word16 nchan_internal /* i : number of internal channels */ -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - , - Word16 out_len -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Word32 *output_fx[], /* o : output audio channels */ + const Word16 nchan_internal /* i : number of internal channels */ ); ivas_error ivas_spar_md_enc_open_fx( - ivas_spar_md_enc_state_t **hMdEnc_in, /* i/o: SPAR MD encoder handle */ - const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ - const Word16 sba_order /* i : Ambisonic (SBA) order */ + ivas_spar_md_enc_state_t **hMdEnc_in, /* i/o: SPAR MD encoder handle */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + const Word16 sba_order /* i : Ambisonic (SBA) order */ ); void ivas_spar_md_enc_close_fx( - ivas_spar_md_enc_state_t **hMdEnc /* i/o: SPAR MD encoder handle */ + ivas_spar_md_enc_state_t **hMdEnc /* i/o: SPAR MD encoder handle */ ); void ivas_create_fullr_dmx_mat_fx( @@ -5384,7 +5343,8 @@ void ivas_create_fullr_dmx_mat_fx( const Word16 start_band, const Word16 end_band, const Word16 active_w, - ivas_spar_md_com_cfg *hMdCfg ); + ivas_spar_md_com_cfg *hMdCfg +); void ivas_get_spar_md_from_dirac_enc_fx( Word32 azi_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22 @@ -5402,7 +5362,8 @@ void ivas_get_spar_md_from_dirac_enc_fx( Word32 Wscale_d[IVAS_MAX_NUM_BANDS], // Q29 const UWord8 useLowerRes, const Word16 active_w_vlbr, - const Word16 dyn_active_w_flag ); + const Word16 dyn_active_w_flag +); void ivas_get_spar_md_from_dirac_fx( Word32 azi_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22 @@ -5420,73 +5381,76 @@ void ivas_get_spar_md_from_dirac_fx( Word32 Wscale_d[IVAS_MAX_NUM_BANDS], // Q29 const UWord8 useLowerRes, const Word16 active_w_vlbr, - const Word16 dyn_active_w_flag ); + const Word16 dyn_active_w_flag +); ivas_error ivas_spar_md_enc_process_fx( - ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle */ - const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ Word32 *cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word16 *cov_real_q[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word32 *cov_dtx_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word16 *cov_dtx_real_q[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ const Word16 dtx_vad, const Word16 nchan_inp, - const Word16 sba_order, /* i : Ambisonic (SBA) order */ - Word32 *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH], /* i : prior mixer_matrix */ - Word16 *q_prior_mixer, /* i/o : q for prior mixer_matrix */ - const Word16 dyn_active_w_flag, /* i : flag to indicate dynamic active W */ - const Word16 dirac_mono_flag, /* i : flag to indicate mono only mode in SBA */ - const Word16 nchan_out ); + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + Word32 *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH], /* i : prior mixer_matrix */ + Word16 *q_prior_mixer, /* i/o : q for prior mixer_matrix */ + const Word16 dyn_active_w_flag, /* i : flag to indicate dynamic active W */ + const Word16 dirac_mono_flag, /* i : flag to indicate mono only mode in SBA */ + const Word16 nchan_out +); Word16 ivas_get_spar_dec_md_num_subframes( - const Word16 sba_order, /* i : Ambisonic (SBA) order */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word32 ivas_last_active_brate /* i : IVAS last active bitrate */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word32 ivas_last_active_brate /* i : IVAS last active bitrate */ ); void ivas_spar_get_parameters_fx( - SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ - const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ - const Word16 ts, /* i : time slot index */ - const Word16 num_ch_out, /* i : number of channels out */ - const Word16 num_ch_in, /* i : number of channels in */ - const Word16 num_spar_bands, /* i : number of SPAR bands */ - Word32 par_mat_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS] /* o : mixing matrix */ + SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ + const Word16 ts, /* i : time slot index */ + const Word16 num_ch_out, /* i : number of channels out */ + const Word16 num_ch_in, /* i : number of channels in */ + const Word16 num_spar_bands, /* i : number of SPAR bands */ + Word32 par_mat_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS] /* o : mixing matrix */ ); void ivas_spar_to_dirac_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const Word16 dtx_vad, /* i : DTX frame flag */ - const Word16 num_bands_out, /* i : number of output bands */ - const Word16 bw, /* i : band joining factor */ - const Word16 dyn_active_w_flag /* i : dynamic active W flag */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const Word16 dtx_vad, /* i : DTX frame flag */ + const Word16 num_bands_out, /* i : number of output bands */ + const Word16 bw, /* i : band joining factor */ + const Word16 dyn_active_w_flag /* i : dynamic active W flag */ ); void ivas_spar_dec_gen_umx_mat_fx( - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const Word16 nchan_transport, /* i : number of transport channels */ - const Word16 num_bands_out, /* i : number of output bands */ - const Word16 bfi, /* i : bad frame indicator */ - const Word16 num_md_sub_frames ); + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 num_bands_out, /* i : number of output bands */ + const Word16 bfi, /* i : bad frame indicator */ + const Word16 num_md_sub_frames +); ivas_error ivas_spar_covar_enc_open_fx( - ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ - ivas_filterbank_t *pFb, /* i/o: FB handle */ - const Word32 input_Fs, /* i : input sampling rate */ - const Word16 nchan_inp, /* i : number of input channels */ - const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/ - const Word32 ivas_total_brate /* i : IVAS total bitrate */ + ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const Word32 input_Fs, /* i : input sampling rate */ + const Word16 nchan_inp, /* i : number of input channels */ + const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); void ivas_spar_covar_enc_close_fx( - ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ - const Word16 nchan_inp /* i : number of input channels */ + ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ + const Word16 nchan_inp /* i : number of input channels */ ); void ivas_enc_cov_handler_process_fx( - ivas_enc_cov_handler_state_t *hCovEnc, /* i/o: SPAR Covar. encoder handle */ + ivas_enc_cov_handler_state_t *hCovEnc, /* i/o: SPAR Covar. encoder handle */ Word32 **ppIn_FR_real, Word32 **ppIn_FR_imag, Word16 q_ppIn_FR, @@ -5494,7 +5458,7 @@ void ivas_enc_cov_handler_process_fx( Word16 *q_cov_real[IVAS_SPAR_MAX_CH], Word32 *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word16 *q_cov_dtx_real[IVAS_SPAR_MAX_CH], - ivas_filterbank_t *pFb, /* i/o: FB handle */ + ivas_filterbank_t *pFb, /* i/o: FB handle */ const Word16 start_band, const Word16 end_band, const Word16 num_ch, @@ -5505,79 +5469,84 @@ void ivas_enc_cov_handler_process_fx( const Word16 *remix_order, Word16 *dyn_active_w_flag, const Word16 nchan_transport, - const Word16 is_sba ); + const Word16 is_sba +); ivas_error ivas_spar_covar_smooth_enc_open_fx( - ivas_cov_smooth_state_t **hCovState, /* i/o: SPAR Covar. smoothing handle */ - const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ - ivas_filterbank_t *pFb, /* i/o: FB handle */ - const Word16 nchan_inp, /* i : number of input channels */ - const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ - const Word32 ivas_total_brate /* i : IVAS total bitrate */ + ivas_cov_smooth_state_t **hCovState, /* i/o: SPAR Covar. smoothing handle */ + const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const Word16 nchan_inp, /* i : number of input channels */ + const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); void ivas_spar_covar_smooth_enc_close_fx( - ivas_cov_smooth_state_t **hCovState, /* i/o: SPAR Covar. encoder handle */ - const Word16 nchan_inp /* i : number of input channels */ + ivas_cov_smooth_state_t **hCovState, /* i/o: SPAR Covar. encoder handle */ + const Word16 nchan_inp /* i : number of input channels */ ); void ivas_cov_smooth_process_fx( - ivas_cov_smooth_state_t *hCovState, /* i/o: Covariance state handle */ + ivas_cov_smooth_state_t *hCovState, /* i/o: Covariance state handle */ Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - ivas_filterbank_t *pFb, /* i/o: FB handle */ + ivas_filterbank_t *pFb, /* i/o: FB handle */ const Word16 start_band, const Word16 end_band, const Word16 num_ch, const Word16 transient_det[2], - Word16 *q_cov[IVAS_SPAR_MAX_CH] ); + Word16 *q_cov[IVAS_SPAR_MAX_CH] +); void ivas_pca_enc_init_fx( - PCA_ENC_STATE *hPCA /* i/o: PCA encoder structure */ + PCA_ENC_STATE *hPCA /* i/o: PCA encoder structure */ ); void ivas_pca_enc_fx( - const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ - PCA_ENC_STATE *hPCA, /* i : PCA encoder structure */ - BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ - Word32 *data_f[8], /* i : input/transformed audio channels Q11 */ - const Word16 input_frame, /* i : input frame length */ - const Word16 n_channels /* i : number of channels */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + PCA_ENC_STATE *hPCA, /* i : PCA encoder structure */ + BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ + Word32 *data_f[8], /* i : input/transformed audio channels Q11 */ + const Word16 input_frame, /* i : input frame length */ + const Word16 n_channels /* i : number of channels */ ); void cov_subfr_fx( Word32 **ptr_sig_fx, // Q11 Word64 *r_fx_64, // Q11 const Word16 n_channels, - const Word16 len ); + const Word16 len +); void ivas_pca_read_bits_fx( - Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ - PCA_DEC_STATE *hPCA /* i/o: PCA encoder structure */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + PCA_DEC_STATE *hPCA /* i/o: PCA encoder structure */ ); void ivas_pca_dec_init_fx( - PCA_DEC_STATE *hPCA /* i/o: PCA decoder structure */ + PCA_DEC_STATE *hPCA /* i/o: PCA decoder structure */ ); void ivas_pca_dec_fx( - PCA_DEC_STATE *hPCA, /* i/o: PCA decoder structure */ - const Word16 output_frame, /* i : output frame length */ - const Word16 n_channels, /* i : number of channels */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word32 last_ivas_total_brate, /* i : last IVAS total bitrate */ - const Word16 bfi, /* i : bad frame indicator */ - Word32 *pcm_out[] /* o : output audio channels */ + PCA_DEC_STATE *hPCA, /* i/o: PCA decoder structure */ + const Word16 output_frame, /* i : output frame length */ + const Word16 n_channels, /* i : number of channels */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word32 last_ivas_total_brate, /* i : last IVAS total bitrate */ + const Word16 bfi, /* i : bad frame indicator */ + Word32 *pcm_out[] /* o : output audio channels */ ); void eye_matrix_fx( Word16 *mat, const Word16 n, - const Word16 d ); + const Word16 d +); void eye_matrix_fx32( Word32 *mat, // Q const Word16 n, - const Word32 d ); // Q + const Word32 d // Q +); void eig_qr_fx( const Word32 *A_fx, // A_q @@ -5585,12 +5554,14 @@ void eig_qr_fx( const Word16 num_iter, Word32 *EV_fx, // Q31 Word32 *Vals_fx, // A_q - const Word16 n ); + const Word16 n +); void exhst_4x4_fx( Word16 *cost_mtx, // Q Word16 *path, - const Word16 maximize ); + const Word16 maximize +); Word16 mat_det4_fx( const Word16 *m // Q15 @@ -5605,13 +5576,15 @@ void mat2dquat_fx( void dquat2mat_fx( const Word16 *ql, const Word16 *qr, - Word16 *m ); + Word16 *m +); void quat_shortestpath_fx( const Word16 *q00, Word16 *q01, const Word16 *q10, - Word16 *q11 ); + Word16 *q11 +); void pca_interp_preproc_fx( const Word16 *prev_ql, @@ -5620,110 +5593,119 @@ void pca_interp_preproc_fx( const Word16 *qr, const Word16 len, Word16 *ql_interp, - Word16 *qr_interp ); + Word16 *qr_interp +); void pca_dec_s3_fx( const Word32 index, - Word16 *q ); + Word16 *q +); void ivas_spar_huff_coeffs_com_init( ivas_huff_coeffs_t *pHuff_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const Word16 table_idx, - const Word16 enc_dec ); + const Word16 enc_dec +); void ivas_spar_arith_coeffs_com_init( ivas_arith_coeffs_t *pArith_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const Word16 table_idx, - const Word16 enc_dec ); + const Word16 enc_dec +); void ivas_ari_start_decoding_14bits_ext_1_lfe( Decoder_State *st, Tastat *s, - Word16 *extra_bits_read ); + Word16 *extra_bits_read +); UWord16 ivas_ari_decode_14bits_bit_ext_1_lfe( Decoder_State *st, Tastat *s, const UWord16 *cum_freq, - Word16 *extra_bits_read ); + Word16 *extra_bits_read +); void ivas_ari_done_decoding_14bits_ext_1_lfe( Decoder_State *st, - const Word16 extra_bits_read ); + const Word16 extra_bits_read +); Word16 quantize_phi_fx( - Word32 phi, /* i : azimuth value */ - const Word16 flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ - Word32 *phi_hat, /* o : quantized azimuth */ - const Word16 n /* i : azimuth codebook size */ + Word32 phi, /* i : azimuth value */ + const Word16 flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ + Word32 *phi_hat, /* o : quantized azimuth */ + const Word16 n /* i : azimuth codebook size */ ); Word16 quantize_phi_enc_fx( - Word32 phi, /* i : azimuth value */ - const Word16 flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ - Word32 *phi_hat, /* o : quantized azimuth */ - const Word16 n /* i : azimuth codebook size */ + Word32 phi, /* i : azimuth value */ + const Word16 flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ + Word32 *phi_hat, /* o : quantized azimuth */ + const Word16 n /* i : azimuth codebook size */ ); Word16 ivas_spar_chk_zero_coefs_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ ); void pca_enc_s3_fx( Word16 *q, // Q15 - Word32 *index ); + Word32 *index +); void ivas_spar_get_uniform_quant_strat_fx( ivas_spar_md_com_cfg *pSpar_md_com_cfg, - const Word16 table_idx ); + const Word16 table_idx +); void ivas_lfe_lpf_select_filt_coeff_fx( - const Word32 sampling_rate, /* i : sampling rate */ - const Word16 order, /* i : filter order */ - const Word32 **ppFilt_coeff_fx, /* o : filter coefficients */ - const Word16 **ppFilt_coeff_e /* o : exponents of filter coefficients */ + const Word32 sampling_rate, /* i : sampling rate */ + const Word16 order, /* i : filter order */ + const Word32 **ppFilt_coeff_fx, /* o : filter coefficients */ + const Word16 **ppFilt_coeff_e /* o : exponents of filter coefficients */ ); void ivas_filters_init_fx( - ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ - const Word32 *filt_coeff, /* i : filter coefficients */ - const Word16 *filt_coeff_e, /* i : exponents of filter coefficients */ - const Word16 order /* i : filter order */ + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + const Word32 *filt_coeff, /* i : filter coefficients */ + const Word16 *filt_coeff_e, /* i : exponents of filter coefficients */ + const Word16 order /* i : filter order */ ); void ivas_decision_matrix_enc_fx( - Encoder_State *st, /* i : encoder state structure */ - const Word32 element_brate, /* i : element bitrate */ - const Word16 fft_buff[], /* i : FFT buffer */ - const Word32 enerBuffer[], /* i : energy buffer */ + Encoder_State *st, /* i : encoder state structure */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 fft_buff[], /* i : FFT buffer */ + const Word32 enerBuffer[], /* i : energy buffer */ Word16 enerBuffer_exp, - const Word16 last_element_mode /* i : last element mode */ + const Word16 last_element_mode /* i : last element mode */ ); void stereo_dft_dec_sid_coh_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word16 nbands, /* i : number of DFT stereo bands Q0*/ - Word16 *coh, /* i/o: coherence Q15*/ - Word16 *nb_bits /* i/o: number of bits read Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 nbands, /* i : number of DFT stereo bands Q0*/ + Word16 *coh, /* i/o: coherence Q15*/ + Word16 *nb_bits /* i/o: number of bits read Q0*/ ); void stereo_tca_init_enc_fx( - STEREO_TCA_ENC_HANDLE hStereoTCA, /* i/o: Stereo ICA handle */ - const Word32 input_Fs /* i : input sampling frequency */ + STEREO_TCA_ENC_HANDLE hStereoTCA, /* i/o: Stereo ICA handle */ + const Word32 input_Fs /* i : input sampling frequency */ ); void stereo_tca_dec_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *synth[CPE_CHANNELS], /* i/o: output synth qsynth*/ - const Word16 output_frame /* i : length of a frame per channel Q0*/ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *synth[CPE_CHANNELS], /* i/o: output synth qsynth*/ + const Word16 output_frame /* i : length of a frame per channel Q0*/ ); void stereo_tca_scale_R_channel_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *output_fx, /* i/o: output synthesis, R channel q_out*/ - const Word16 output_frame /* i : frame length Q0*/ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *output_fx, /* i/o: output synthesis, R channel q_out*/ + const Word16 output_frame /* i : frame length Q0*/ ); void adjustTargetSignal_fx( @@ -5731,177 +5713,215 @@ void adjustTargetSignal_fx( const Word16 prevShift, const Word16 currShift, const Word16 L_shift_adapt, - const Word16 method ); + const Word16 method +); void stereo_icBWE_init_enc_fx( - STEREO_ICBWE_ENC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ + STEREO_ICBWE_ENC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ ); void stereo_classifier_init_fx( - STEREO_CLASSIF_HANDLE hStereoClassif /* i/o: stereo classifier structure */ + STEREO_CLASSIF_HANDLE hStereoClassif /* i/o: stereo classifier structure */ ); void stereo_td_init_dec_fx( - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const Word16 last_element_mode /* i : last element mode Q0*/ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ + const Word16 last_element_mode /* i : last element mode Q0*/ ); void initMdctStereoEncData_fx( - STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word16 element_mode, /* i : element mode */ - const Word32 element_brate, /* i : element bitrate */ - const Word16 bwidth, /* i : bandwidth */ - const Word16 igf, /* i : flag indicating IGF activity */ - const H_IGF_GRID hIgfGrid, /* i : IGF grid setup */ - const Word16 mem_init /* i : initialize memory after malloc */ + STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const Word16 element_mode, /* i : element mode */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 bwidth, /* i : bandwidth */ + const Word16 igf, /* i : flag indicating IGF activity */ + const H_IGF_GRID hIgfGrid, /* i : IGF grid setup */ + const Word16 mem_init /* i : initialize memory after malloc */ ); void deindex_sph_idx_fx( - const UWord16 sphIndex, /* i : Spherical index */ - const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ - Word32 *theta_fx, /* o : Elevation */ - Word32 *phi_fx /* o : Azimuth */ + const UWord16 sphIndex, /* i : Spherical index */ + const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ + Word32 *theta_fx, /* o : Elevation */ + Word32 *phi_fx /* o : Azimuth */ ); ivas_error ivas_dirac_enc_open_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); void ivas_dirac_enc_close_fx( - DIRAC_ENC_HANDLE *hDirAC, /* i/o: encoder DirAC handle */ - const Word32 input_Fs /* i : input sampling_rate */ + DIRAC_ENC_HANDLE *hDirAC, /* i/o: encoder DirAC handle */ + const Word32 input_Fs /* i : input sampling_rate */ ); ivas_error ivas_dirac_enc_fx( - DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ - Word32 *data_f[], /* i/o: SBA channels */ - Word32 **ppIn_FR_real, /* o : real freq domain values */ - Word32 **ppIn_FR_imag, /* o : imag freq domain values */ + DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + Word32 *data_f[], /* i/o: SBA channels */ + Word32 **ppIn_FR_real, /* o : real freq domain values */ + Word32 **ppIn_FR_imag, /* o : imag freq domain values */ Word16 pp_fr_q, - const Word16 input_frame, /* i : input frame length */ - const Word16 dtx_vad, /* i : DTX vad flag */ - const IVAS_FORMAT ivas_format, /* i : ivas format */ - const Word16 hodirac_flag, /* i : hodirac flag */ - const Word16 shift ); + const Word16 input_frame, /* i : input frame length */ + const Word16 dtx_vad, /* i : DTX vad flag */ + const IVAS_FORMAT ivas_format, /* i : ivas format */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 hodirac_flag, /* i : hodirac flag */ + const Word16 shift +); ivas_error ivas_spar_md_enc_init_fx( - ivas_spar_md_enc_state_t *hMdEnc, /* o : MD encoder handle */ - const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ - const Word16 sba_order /* i : Ambisonic (SBA) order */ + ivas_spar_md_enc_state_t *hMdEnc, /* o : MD encoder handle */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + const Word16 sba_order /* i : Ambisonic (SBA) order */ ); void ivas_spar_get_cldfb_gains_fx( SPAR_DEC_HANDLE hSpar, HANDLE_CLDFB_FILTER_BANK cldfbAnaDec0, HANDLE_CLDFB_FILTER_BANK cldfbSynDec0, - const DECODER_CONFIG_HANDLE hDecoderConfig ); + const DECODER_CONFIG_HANDLE hDecoderConfig +); void ivas_sba_getTCs_fx( - Word32 *sba_data[], /* i : SBA signals Q11 */ - Encoder_Struct *st_ivas, /* i/o: Encoder struct */ - const Word16 input_frame /* i : frame length */ + Word32 *sba_data[], /* i : SBA signals Q11 */ + Encoder_Struct *st_ivas, /* i/o: Encoder struct */ + const Word16 input_frame /* i : frame length */ ); ivas_error front_vad_spar_fx( - SPAR_ENC_HANDLE hSpar, /* i/o: SPAR encoder structure */ - const Word32 *omni_in, /* i : omnidirectional input signal Q11 */ - ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ - const Word16 input_frame /* i : input frame length */ + SPAR_ENC_HANDLE hSpar, /* i/o: SPAR encoder structure */ + const Word32 *omni_in, /* i : omnidirectional input signal Q11 */ + ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ + const Word16 input_frame /* i : input frame length */ ); ivas_error ivas_spar_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - Word32 *data_fx[], /* i/o: input/transport audio channel Q11 */ - const Word16 input_frame, /* i : input frame length */ - Word16 *nb_bits_metadata, /* i : number of MD bits written */ - BSTR_ENC_HANDLE hMetaData /* o : MetaData handle */ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + Word32 *data_fx[], /* i/o: input/transport audio channel Q11 */ + const Word16 input_frame, /* i : input frame length */ + Word16 *nb_bits_metadata, /* i : number of MD bits written */ + BSTR_ENC_HANDLE hMetaData /* o : MetaData handle */ ); ivas_error ivas_ism_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - Word32 *data[], /* i : input signal [channels][samples] Q(q_data) */ - Word16 q_data, /* i : Q-factor of input signal */ - const Word16 input_frame, /* i : input frame length per channel */ - Word16 *nb_bits_metadata, /* i : number of metadata bits */ - const Word16 flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + Word32 *data[], /* i : input signal [channels][samples] Q(q_data) */ + Word16 q_data, /* i : Q-factor of input signal */ + const Word16 input_frame, /* i : input frame length per channel */ + Word16 *nb_bits_metadata, /* i : number of metadata bits */ + const Word16 flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ ); ivas_error ivas_sce_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const Word16 sce_id, /* i : SCE # identifier */ - const Word32 data_fx[], /* i : input signal for single channel Q(q_data_fx) */ - const Word16 q_data_fx, /* i : Q-factor of input signal for single channel */ - const Word16 input_frame, /* i : input frame length per channel */ - const Word16 nb_bits_metadata /* i : number of metadata bits */ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const Word16 sce_id, /* i : SCE # identifier */ + const Word32 data_fx[], /* i : input signal for single channel Q(q_data_fx) */ + const Word16 q_data_fx, /* i : Q-factor of input signal for single channel */ + const Word16 input_frame, /* i : input frame length per channel */ + const Word16 nb_bits_metadata /* i : number of metadata bits */ ); ivas_error ivas_cpe_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const Word16 cpe_id, /* i : CPE # identifier */ - Word32 data_fx_ch0[], /* i : input signal for channel 0 Q(q_data_fx) */ - Word32 data_fx_ch1[], /* i : input signal for channel 1 Q(q_data_fx) */ - Word16 q_data_fx, /* i : Q-factor of input signal for both channels */ - const Word16 input_frame, /* i : input frame length per channel */ - const Word16 nb_bits_metadata, /* i : number of metadata bits */ - Word16 Q_new_out[] ); + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const Word16 cpe_id, /* i : CPE # identifier */ + Word32 data_fx_ch0[], /* i : input signal for channel 0 Q(q_data_fx) */ + Word32 data_fx_ch1[], /* i : input signal for channel 1 Q(q_data_fx) */ + Word16 q_data_fx, /* i : Q-factor of input signal for both channels */ + const Word16 input_frame, /* i : input frame length per channel */ + const Word16 nb_bits_metadata, /* i : number of metadata bits */ + Word16 Q_new_out[] +); ivas_error ivas_mct_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - Word32 *data_fx[MCT_MAX_CHANNELS], /* i : input signal buffers Q(q_data_fx) */ - Word16 q_data_fx, /* i : Q-factor of input signal */ - const Word16 input_frame, /* i : input frame length per channel */ - const Word16 nb_bits_metadata /* i : number of metadata bits */ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + Word32 *data_fx[MCT_MAX_CHANNELS], /* i : input signal buffers Q(q_data_fx) */ + Word16 q_data_fx, /* i : Q-factor of input signal */ + const Word16 input_frame, /* i : input frame length per channel */ + const Word16 nb_bits_metadata /* i : number of metadata bits */ ); ivas_error ivas_compute_core_buffers_fx( - Encoder_State *st, /* i/o: encoder state structure */ - Word16 **inp16k_out_fx, /* o : ptr. to inp. signal in the current frame */ - Word16 *old_inp_16k_fx, /* i/o: buffer of old input signal @ 16kHz */ - Word16 new_inp_resamp16k_out_fx[], /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ - const Word16 input_frame, /* i : frame length */ - const Word16 last_element_mode, /* i : last element mode */ - const Word32 sr_core, /* i : core-coder sampling rate */ - Word32 *ener_fx, /* o : residual energy from Levinson-Durbin Q_r */ - Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes */ - Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes */ - Word32 epsP[M + 1], /* i/o: LP prediction errors */ - Word16 lsp_new_fx[M], /* i/o: LSPs at the end of the frame */ - Word16 lsp_mid_fx[M], /* i/o: LSPs in the middle of the frame */ + Encoder_State *st, /* i/o: encoder state structure */ + Word16 **inp16k_out_fx, /* o : ptr. to inp. signal in the current frame */ + Word16 *old_inp_16k_fx, /* i/o: buffer of old input signal @ 16kHz */ + Word16 new_inp_resamp16k_out_fx[], /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ + const Word16 input_frame, /* i : frame length */ + const Word16 last_element_mode, /* i : last element mode */ + const Word32 sr_core, /* i : core-coder sampling rate */ + Word32 *ener_fx, /* o : residual energy from Levinson-Durbin Q_r */ + Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes */ + Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes */ + Word32 epsP[M + 1], /* i/o: LP prediction errors */ + Word16 lsp_new_fx[M], /* i/o: LSPs at the end of the frame */ + Word16 lsp_mid_fx[M], /* i/o: LSPs in the middle of the frame */ Word16 Q_old_inp_16k, Word16 Q_r[2], - Word16 *Q_new ); + Word16 *Q_new +); ivas_error ivas_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const Word16 *data, /* i : input signal Q0 */ - const Word16 n_samples /* i : number of input samples */ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const Word16 *data, /* i : input signal Q0 */ + const Word16 n_samples /* i : number of input samples */ ); void reset_metadata_spatial_fx( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ - const Word32 element_brate, /* i : element bitrate */ - Word32 *total_brate, /* o : total bitrate */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 nb_bits_metadata /* i : number of meatdata bits */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + const Word32 element_brate, /* i : element bitrate */ + Word32 *total_brate, /* o : total bitrate */ + const Word32 core_brate, /* i : core bitrate */ + const Word16 nb_bits_metadata /* i : number of meatdata bits */ ); -/*=============================================================================================*/ -/* clang-format off */ +void Euler2Quat_fx( + const Word32 yaw, /* i : yaw (x) Q22 */ + const Word32 pitch, /* i : pitch (y) Q22 */ + const Word32 roll, /* i : roll (z) Q22 */ + IVAS_QUATERNION *quat /* o : quaternion describing the rotation */ +); + +Word32 deg2rad_fx( + Word32 degrees +); + +void Quat2EulerDegree_fx( + const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ + Word32 *yaw_fx, /* o : yaw */ + Word32 *pitch_fx, /* o : pitch */ + Word32 *roll_fx /* o : roll */ +); + +void Copy_Quat_fx( + const IVAS_QUATERNION *in_quat, /* i : quaternion describing the rotation */ + IVAS_QUATERNION *out_quat /* o : quaternion describing the rotation */ +); + +void modify_Quat_q_fx( + const IVAS_QUATERNION *in_quat, /* i : quaternion describing the rotation */ + IVAS_QUATERNION *out_quat, /* i : quaternion describing the rotation */ + Word16 q_new /* o : quaternion describing the rotation */ +); + +void modify_Rmat_q_fx( + Word32 Rmat_in[3][3], /* i : real-space rotation matrix for this rotation */ + Word32 Rmat_out[3][3], /* o : real-space rotation matrix for this rotation */ + Word16 q_cur, /* i : current q factor for rotation matrix */ + Word16 q_new /* i : target q factor for rotation matrix */ +); + /*----------------------------------------------------------------------------------* * General IVAS prototypes *----------------------------------------------------------------------------------*/ -/*! r: number of channels to be analysed */ - void copy_encoder_config_ivas_fx( Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ Encoder_State *st, /* o : encoder state structure */ - const Word16 flag_all /* i : flag 1==update all, 0=partial update Q0*/ + const Word16 flag_all /* i : flag 1==update all, 0=partial update Q0*/ ); ivas_error create_mct_enc_fx( @@ -5917,98 +5937,97 @@ void ivas_mct_enc_close_fx( ); ivas_error pre_proc_front_ivas_fx( - SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - const Word32 element_brate, /* i : SCE/CPE element bitrate Q0*/ - const Word16 nb_bits_metadata, /* i : number of metadata bits Q0*/ - const Word16 input_frame, /* i : frame length Q0*/ - const Word16 n, /* i : channel number Q0*/ - Word16 old_inp_12k8_fx[], /* o : buffer of old input signal Q_new-1*/ - Word16 old_inp_16k_fx[], /* o : buffer of old input signal @16kHz Q_new-1*/ - Word32 *ener_fx, /* o : residual energy from Levinson-Durbin epsP_fx_q*/ - Word16 *relE_fx, /* o : frame relative energy Q8*/ - Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* o : A(z) unquantized for the 4 subframes Q12*/ - Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* o : weighted A(z) unquantized for subframes Q12*/ - Word32 epsP_fx[M + 1], /* o : LP prediction errors epsP_fx_q*/ + SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const Word32 element_brate, /* i : SCE/CPE element bitrate Q0*/ + const Word16 nb_bits_metadata, /* i : number of metadata bits Q0*/ + const Word16 input_frame, /* i : frame length Q0*/ + const Word16 n, /* i : channel number Q0*/ + Word16 old_inp_12k8_fx[], /* o : buffer of old input signal Q_new-1*/ + Word16 old_inp_16k_fx[], /* o : buffer of old input signal @16kHz Q_new-1*/ + Word32 *ener_fx, /* o : residual energy from Levinson-Durbin epsP_fx_q*/ + Word16 *relE_fx, /* o : frame relative energy Q8*/ + Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* o : A(z) unquantized for the 4 subframes Q12*/ + Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* o : weighted A(z) unquantized for subframes Q12*/ + Word32 epsP_fx[M + 1], /* o : LP prediction errors epsP_fx_q*/ Word16 *epsP_fx_q, - Word16 lsp_new_fx[M], /* o : LSPs at the end of the frame Q15*/ - Word16 lsp_mid_fx[M], /* o : LSPs in the middle of the frame Q15*/ - Word16 *vad_hover_flag, /* o : VAD hangover flag Q0*/ - Word16 *attack_flag, /* o : flag signaling attack Q0*/ - Word32 realBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer Q(q_re_im_buf)*/ - Word32 imagBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer Q(q_re_im_buf)*/ - Word16 *q_re_im_buf, /* i/o: Q-factor of real and imag buffer */ - Word16 old_wsp_fx[], /* o : weighted input signal buffer q_old_wsp*/ + Word16 lsp_new_fx[M], /* o : LSPs at the end of the frame Q15*/ + Word16 lsp_mid_fx[M], /* o : LSPs in the middle of the frame Q15*/ + Word16 *vad_hover_flag, /* o : VAD hangover flag Q0*/ + Word16 *attack_flag, /* o : flag signaling attack Q0*/ + Word32 realBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer Q(q_re_im_buf)*/ + Word32 imagBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer Q(q_re_im_buf)*/ + Word16 *q_re_im_buf, /* i/o: Q-factor of real and imag buffer */ + Word16 old_wsp_fx[], /* o : weighted input signal buffer q_old_wsp*/ Word16 *q_old_wsp, - Word16 pitch_fr_fx[NB_SUBFR], /* o : fractional pitch values Q6*/ - Word16 voicing_fr_fx[NB_SUBFR], /* o : fractional pitch gains Q15*/ - Word16 *loc_harm, /* o : harmonicity flag Q0*/ - Word16 *cor_map_sum_fx, /* o : speech/music clasif. parameter Q8*/ - Word16 *vad_flag_dtx, /* o : HE-SAD flag with additional DTX HO Q0*/ - Word32 enerBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : energy buffer enerBuffer_fx_exp*/ - Word16 *enerBuffer_fx_exp, /* o : energy buffer */ - Word16 fft_buff_fx[2 * L_FFT], /* o : FFT buffer fft_buff_fx_q*/ - Word16 *fft_buff_fx_q, /* o : FFT buffer */ - const Word16 tdm_A_PCh_fx[M + 1], /* i : unq. LP coeff. of primary channel Q12*/ - const Word16 tdm_lsp_new_PCh_fx[M], /* i : unq. LSPs of primary channel Q15*/ - const Word32 currFlatness_fx, /* i : flatness parameter Q21*/ - const Word16 tdm_ratio_idx, /* i : Current Ratio_L index Q0*/ - Word32 fr_bands_LR_fx[][2 * NB_BANDS], /* i : energy in frequency bands (fr_bands_LR_fx_q) fr_bands_LR_fx_q*/ + Word16 pitch_fr_fx[NB_SUBFR], /* o : fractional pitch values Q6*/ + Word16 voicing_fr_fx[NB_SUBFR], /* o : fractional pitch gains Q15*/ + Word16 *loc_harm, /* o : harmonicity flag Q0*/ + Word16 *cor_map_sum_fx, /* o : speech/music clasif. parameter Q8*/ + Word16 *vad_flag_dtx, /* o : HE-SAD flag with additional DTX HO Q0*/ + Word32 enerBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : energy buffer enerBuffer_fx_exp*/ + Word16 *enerBuffer_fx_exp, /* o : energy buffer */ + Word16 fft_buff_fx[2 * L_FFT], /* o : FFT buffer fft_buff_fx_q*/ + Word16 *fft_buff_fx_q, /* o : FFT buffer */ + const Word16 tdm_A_PCh_fx[M + 1], /* i : unq. LP coeff. of primary channel Q12*/ + const Word16 tdm_lsp_new_PCh_fx[M], /* i : unq. LSPs of primary channel Q15*/ + const Word32 currFlatness_fx, /* i : flatness parameter Q21*/ + const Word16 tdm_ratio_idx, /* i : Current Ratio_L index Q0*/ + Word32 fr_bands_LR_fx[][2 * NB_BANDS], /* i : energy in frequency bands (fr_bands_LR_fx_q) fr_bands_LR_fx_q*/ Word16 fr_bands_LR_fx_q[CPE_CHANNELS], - const Word16 Etot_LR_fx[], /* i : total energy Left & Right channel Q8*/ - Word32 lf_E_LR_fx[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels (lf_E_LR_fx_q)*/ + const Word16 Etot_LR_fx[], /* i : total energy Left & Right channel Q8*/ + Word32 lf_E_LR_fx[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels (lf_E_LR_fx_q)*/ Word16 lf_E_LR_fx_q, - const Word16 localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover, LR channels Q0*/ - Word32 band_energies_LR_fx[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN (band_energies_LR_fx_q)*/ + const Word16 localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover, LR channels Q0*/ + Word32 band_energies_LR_fx[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN (band_energies_LR_fx_q)*/ Word16 band_energies_LR_fx_q, - const Word16 flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ - const Word16 front_vad_flag, /* i : front-VAD flag to overwrite VAD decision Q0*/ - const Word16 force_front_vad, /* i : flag to force VAD decision Q0*/ - const Word16 front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision Q0*/ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ -#ifdef NONBE_1211_DTX_BR_SWITCHING - const Word32 last_ivas_total_brate, /* i : last IVAS total bitrate Q0*/ -#endif - const Word32 ivas_total_brate, /* i : IVAS total bitrate - for setting the DTX Q0*/ + const Word16 flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ + const Word16 front_vad_flag, /* i : front-VAD flag to overwrite VAD decision Q0*/ + const Word16 force_front_vad, /* i : flag to force VAD decision Q0*/ + const Word16 front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision Q0*/ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ + const Word32 last_ivas_total_brate, /* i : last IVAS total bitrate Q0*/ + const Word32 ivas_total_brate, /* i : IVAS total bitrate - for setting the DTX Q0*/ Word16 *Q_new #ifdef DEBUG_MODE_INFO , const Word16 ch_idx #endif ); + ivas_error pre_proc_ivas_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 last_element_mode, /* i : last element mode Q0*/ - const Word32 element_brate, /* i : element bitrate Q0*/ - const Word32 last_element_brate, /* i : last element bitrate Q0*/ - const Word16 input_frame, /* i : frame length Q0*/ - Word16 old_inp_12k8_fx[], /* i/o: buffer of old input signal Q_new-1 */ - Word16 old_inp_16k_fx[], /* i/o: buffer of old input signal @ 16kHz Q_new-1 */ - Word16 **inp_fx, /* o : ptr. to inp. signal in the current frame Q_new*/ - Word32 *ener_fx, /* o : residual energy from Levinson-Durbin epsP_fx_q*/ - Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes Q12*/ - Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes Q14*/ - Word32 epsP_fx[M + 1], /* i : LP prediction errors epsP_fx_q*/ - Word16 *epsP_fx_q, /* i : LP prediction errors */ - Word16 lsp_new_fx[M], /* i/o: LSPs at the end of the frame Q15*/ - Word16 lsp_mid_fx[M], /* i/o: LSPs in the middle of the frame Q15*/ - Word16 *new_inp_resamp16k_fx, /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE Q_new-1*/ - Word16 *Voicing_flag, /* o : voicing flag for HQ FEC Q0*/ - Word16 old_wsp_fx[], /* i : weighted input signal buffer e_old_wsp*/ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 last_element_mode, /* i : last element mode Q0*/ + const Word32 element_brate, /* i : element bitrate Q0*/ + const Word32 last_element_brate, /* i : last element bitrate Q0*/ + const Word16 input_frame, /* i : frame length Q0*/ + Word16 old_inp_12k8_fx[], /* i/o: buffer of old input signal Q_new-1 */ + Word16 old_inp_16k_fx[], /* i/o: buffer of old input signal @ 16kHz Q_new-1 */ + Word16 **inp_fx, /* o : ptr. to inp. signal in the current frame Q_new*/ + Word32 *ener_fx, /* o : residual energy from Levinson-Durbin epsP_fx_q*/ + Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes Q12*/ + Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes Q14*/ + Word32 epsP_fx[M + 1], /* i : LP prediction errors epsP_fx_q*/ + Word16 *epsP_fx_q, /* i : LP prediction errors */ + Word16 lsp_new_fx[M], /* i/o: LSPs at the end of the frame Q15*/ + Word16 lsp_mid_fx[M], /* i/o: LSPs in the middle of the frame Q15*/ + Word16 *new_inp_resamp16k_fx, /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE Q_new-1*/ + Word16 *Voicing_flag, /* o : voicing flag for HQ FEC Q0*/ + Word16 old_wsp_fx[], /* i : weighted input signal buffer e_old_wsp*/ Word16 e_old_wsp, - const Word16 loc_harm, /* i : harmonicity flag Q0*/ - const Word16 vad_flag_dtx, /* i : HE-SAD flag with additional DTX HO Q0*/ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ - const Word16 vad_hover_flag, /* i : VAD hangover flag Q0*/ - const Word16 flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ - Word32 enerBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* e_enerBuffer */ + const Word16 loc_harm, /* i : harmonicity flag Q0*/ + const Word16 vad_flag_dtx, /* i : HE-SAD flag with additional DTX HO Q0*/ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ + const Word16 vad_hover_flag, /* i : VAD hangover flag Q0*/ + const Word16 flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ + Word32 enerBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* e_enerBuffer */ Word16 e_enerBuffer, - Word16 fft_buff_fx[2 * L_FFT], /* Qx */ - Word16 cor_map_sum_fx, /* Q8 */ + Word16 fft_buff_fx[2 * L_FFT], /* Qx */ + Word16 cor_map_sum_fx, /* Q8 */ Word16 *Q_new ); -/*! r: number of clipped samples */ + void ivas_initialize_handles_enc_fx( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); @@ -6034,13 +6053,10 @@ ivas_error ivas_init_decoder_front( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); - void ivas_mct_dec_close( MCT_DEC_HANDLE *hMCT /* i/o: MCT decoder structure */ ); -/*! r: number of channels to be synthesised */ - void copy_decoder_config( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ Decoder_State *st /* o : decoder state structure */ @@ -6051,53 +6067,58 @@ void ivas_initialize_handles_dec( ); ivas_error ivas_core_enc_fx( - SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ - const Word16 n_CoreChannels, /* i : number of core channels to be coded Q0*/ - Word16 old_inp_12k8_fx[][L_INP_12k8], /* i : buffer of old input signal Q_new-1*/ - Word16 old_inp_16k_fx[][L_INP], /* i : buffer of old input signal Q_new-1*/ - Word16 Q_new[], - Word32 ener_fx[], /* i : residual energy from Levinson-Durbin epsP_fx_q*/ - Word16 A_fx[][NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ - Word16 Aw_fx[][NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquantized for subframes Q12*/ - Word32 epsP_fx[][M + 1], /* i : LP prediction errors epsP_fx_q*/ - Word16 epsP_fx_q[], /* i : LP prediction errors */ - Word16 lsp_new_fx[][M], /* i : LSPs at the end of the frame Q15*/ - Word16 lsp_mid_fx[][M], /* i : LSPs in the middle of the frame Q15*/ - const Word16 vad_hover_flag[], /* i : VAD hanglover flag Q0*/ - Word16 attack_flag[], /* i : attack flag (GSC or TC) Q0*/ - Word32 realBuffer_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer q_re_im_buf*/ - Word32 imagBuffer_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer q_re_im_buf*/ - Word16 *q_re_im_buf, - Word16 old_wsp_fx[][L_WSP], /* i : weighted input signal buffer e_old_wsp*/ - Word16 e_old_wsp[], - const Word16 loc_harm[], /* i : harmonicity flag Q0*/ - const Word16 cor_map_sum_fx[], /* i : speech/music clasif. parameter Q8*/ - const Word16 vad_flag_dtx[], /* i : HE-SAD flag with additional DTX HO Q0*/ - Word32 enerBuffer_fx[][CLDFB_NO_CHANNELS_MAX], /* o : energy buffer enerBuffer_fx_exp*/ - Word16 enerBuffer_fx_exp[], /* o : energy buffer */ - Word16 fft_buff_fx[][2 * L_FFT], /* i : FFT buffer Qx*/ - const Word16 tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag Q0*/ - const Word16 ivas_format, /* i : IVAS format Q0*/ - const Word16 flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ + SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + const Word16 n_CoreChannels, /* i : number of core channels to be coded Q0*/ + Word16 old_inp_12k8_fx[][L_INP_12k8], /* i : buffer of old input signal Q_new-1*/ + Word16 old_inp_16k_fx[][L_INP], /* i : buffer of old input signal Q_new-1*/ + Word16 Q_new[], /* i : Q factor of speech buffers */ + Word32 ener_fx[], /* i : residual energy from Levinson-Durbin epsP_fx_q*/ + Word16 A_fx[][NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ + Word16 Aw_fx[][NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquantized for subframes Q12*/ + Word32 epsP_fx[][M + 1], /* i : LP prediction errors epsP_fx_q*/ + Word16 epsP_fx_q[], /* i : LP prediction errors */ + Word16 lsp_new_fx[][M], /* i : LSPs at the end of the frame Q15*/ + Word16 lsp_mid_fx[][M], /* i : LSPs in the middle of the frame Q15*/ + const Word16 vad_hover_flag[], /* i : VAD hanglover flag Q0*/ + Word16 attack_flag[], /* i : attack flag (GSC or TC) Q0*/ + Word32 realBuffer_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer q_re_im_buf*/ + Word32 imagBuffer_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer q_re_im_buf*/ + Word16 *q_re_im_buf, /* i : Q factor of re/in CLDFB buffers */ + Word16 old_wsp_fx[][L_WSP], /* i : weighted input signal buffer e_old_wsp*/ + Word16 e_old_wsp[], /* i : Q factor of old_wsp buffer */ + const Word16 loc_harm[], /* i : harmonicity flag Q0*/ + const Word16 cor_map_sum_fx[], /* i : speech/music clasif. parameter Q8*/ + const Word16 vad_flag_dtx[], /* i : HE-SAD flag with additional DTX HO Q0*/ + Word32 enerBuffer_fx[][CLDFB_NO_CHANNELS_MAX], /* o : energy buffer enerBuffer_fx_exp*/ + Word16 enerBuffer_fx_exp[], /* o : energy buffer */ + Word16 fft_buff_fx[][2 * L_FFT], /* i : FFT buffer Qx*/ + const Word16 tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag Q0*/ + const Word16 ivas_format, /* i : IVAS format Q0*/ + const Word16 flag_16k_smc /* i : flag to indicate if the OL SMC is run @16 kHz Q0*/ ); void ivas_renderer_select( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); +/*! r: secondary binaural renderer type */ +RENDERER_TYPE ivas_renderer_secondary_select_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + ivas_error ivas_mc_enc_config_fx( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); /*! r: flag indicating a valid bitrate */ Word16 is_IVAS_bitrate_fx( - const Word32 ivas_total_brate /* i : IVAS total bitrate */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); -int16_t is_DTXrate( - const int32_t ivas_total_brate /* i : IVAS total bitrate */ +Word16 is_DTXrate( + const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); @@ -6105,15 +6126,106 @@ int16_t is_DTXrate( * JBM prototypes *----------------------------------------------------------------------------------*/ -ivas_error ivas_jbm_dec_set_discard_samples( +ivas_error ivas_jbm_dec_tc_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +ivas_error ivas_jbm_dec_render_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const UWord16 nSamplesAsked, /* i : number of samples wanted */ + UWord16 *nSamplesRendered, /* o : number of samples rendered */ + UWord16 *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */ + Word16 *data /* o : output synthesis signal */ +); + +ivas_error ivas_jbm_dec_flush_renderer_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 tc_granularity_new, /* i : new renderer granularity */ + const RENDERER_TYPE renderer_type_old, /* i : old renderer type */ + const AUDIO_CONFIG intern_config_old, /* i : old internal config */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */ + const MC_MODE mc_mode_old, /* i : old MC mode */ + const ISM_MODE ism_mode_old, /* i : old ISM mode */ + UWord16 *nSamplesRendered, /* o : number of samples flushed */ + Word16 *data /* o : output synthesis signal */ +); + +void ivas_jbm_dec_feed_tc_to_renderer_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 nSamplesForRendering, /* i : number of TC samples available for rendering */ + Word16 *nSamplesResidual /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ +); + +void ivas_dec_prepare_renderer_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +ivas_error ivas_jbm_dec_set_discard_samples_fx( Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */ ); -TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( +void ivas_jbm_dec_get_adapted_linear_interpolator_fx( + const Word16 default_interp_length, /* i : default length of the (full-frame) interpolator */ + const Word16 interp_length, /* i : length of the interpolator to be created */ + Word16 *interpolator_fx /* o : the interpolator */ +); + +void ivas_jbm_dec_get_adapted_subframes( + const Word16 nCldfbTs, /* i : number of time slots in the current frame */ + Word16 *subframe_nbslots, /* i/o: subframe grid */ + Word16 *nb_subframes /* i/o: number of subframes in the frame */ +); + +void ivas_jbm_dec_get_md_map( + const Word16 default_len, /* i : default frame length in metadata slots */ + const Word16 len, /* i : length of the modfied frames in metadata slots */ + const Word16 subframe_len, /* i : default length of a subframe */ + const Word16 offset, /* i : current read offset into the md buffer */ + const Word16 buf_len, /* i : length of the metadata buffer */ + Word16 *map /* o : metadata index map */ +); + +Word16 ivas_jbm_dec_get_num_tc_channels_fx( + Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +); + +void ivas_jbm_dec_get_md_map_even_spacing( + const Word16 len, /* i : length of the modfied frames in metadata slots */ + const Word16 subframe_len, /* i : default length of a subframe */ + const Word16 offset, /* i : current read offset into the md buffer */ + const Word16 buf_len, /* i : length of the metadata buffer */ + Word16 *map /* o : metadata index map */ +); + +TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode_fx( Decoder_Struct *st_ivas /* i : IVAS decoder handle */ ); -void ivas_jbm_dec_tc_buffer_close( +Word16 ivas_jbm_dec_get_render_granularity_fx( + const RENDERER_TYPE renderer_type, /* i : renderer type */ + const RENDERER_TYPE renderer_type_sec, /* i : secondary renderer type */ + const Word32 output_Fs /* i : sampling rate */ +); + +ivas_error ivas_jbm_dec_tc_buffer_open_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ + const Word16 nchan_transport_jbm, /* i : number of real transport channels */ + const Word16 nchan_transport_internal, /* i : number of totally buffered channels */ + const Word16 nchan_full, /* i : number of channels to fully store */ + const Word16 n_samples_granularity /* i : granularity of the renderer/buffer */ +); + +ivas_error ivas_jbm_dec_tc_buffer_reconfigure_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */ + const Word16 nchan_transport_jbm, /* i : new number of real transport channels */ + const Word16 nchan_transport_internal, /* i : new number of totally buffered channels */ + const Word16 nchan_full, /* i : new number of channels to fully store */ + const Word16 n_samples_granularity /* i : new granularity of the renderer/buffer */ +); + +void ivas_jbm_dec_tc_buffer_close_fx( DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ ); @@ -6135,9 +6247,9 @@ void ivas_jbm_masa_sf_to_sf_map( *----------------------------------------------------------------------------------*/ void bitbudget_to_brate( - const Word16 x[], /* i : bitbudgets Q0 */ - Word32 y[], /* o : bitrates Q0 */ - const Word16 N /* i : number of entries to be converted */ + const Word16 x[], /* i : bitbudgets Q0 */ + Word32 y[], /* o : bitrates Q0 */ + const Word16 N /* i : number of entries to be converted */ ); void ivas_ism_reset_metadata( @@ -6145,53 +6257,53 @@ void ivas_ism_reset_metadata( ); void ivas_ism_reset_metadata_enc( - ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ + ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ ); + void ivas_ism_reset_metadata_API( ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handles */ ); /*! r: index of the winning codeword */ Word16 ism_quant_meta_fx( - const Word32 val, /* i : scalar value to quantize Q22 */ - Word32 *valQ, /* o : quantized value Q22 */ - const Word32 borders_fx[], /* i : level borders Q22 */ - const Word32 q_step_fx, /* i : quantization step Q22 */ - const Word32 q_step_border_fx, /* i : quantization step at the border Q22 */ - const Word16 cbsize /* i : codebook size */ + const Word32 val, /* i : scalar value to quantize Q22 */ + Word32 *valQ, /* o : quantized value Q22 */ + const Word32 borders_fx[], /* i : level borders Q22 */ + const Word32 q_step_fx, /* i : quantization step Q22 */ + const Word32 q_step_border_fx, /* i : quantization step at the border Q22 */ + const Word16 cbsize /* i : codebook size */ ); ivas_error ivas_ism_metadata_enc_create_fx( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const Word16 n_ISms, /* i : number of objects */ - Word32 element_brate_tmp[] /* o : element bitrate per object */ + const Word16 n_ISms, /* i : number of objects */ + Word32 element_brate_tmp[] /* o : element bitrate per object */ ); + /*----------------------------------------------------------------------------------* * Parametric ISM prototypes *----------------------------------------------------------------------------------*/ -/*! r: ISM format mode */ - ivas_error ivas_param_ism_enc_open_fx( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); void ivas_param_ism_enc_close_fx( PARAM_ISM_CONFIG_HANDLE *hParamIsm, /* i/o: ParamISM handle */ - const Word32 input_Fs /* i : input sampling_rate */ + const Word32 input_Fs /* i : input sampling_rate */ ); void ivas_ism_metadata_close( - ISM_METADATA_HANDLE hIsmMetaData[], /* i/o : object metadata handles */ - const Word16 first_idx /* i : index of first handle to deallocate */ + ISM_METADATA_HANDLE hIsmMetaData[], /* i/o: object metadata handles */ + const Word16 first_idx /* i : index of first handle to deallocate */ ); - ivas_error ivas_ism_enc_config( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); + /*----------------------------------------------------------------------------------* * ISM DTX prototypes *----------------------------------------------------------------------------------*/ @@ -6202,28 +6314,27 @@ ivas_error ivas_ism_dtx_open( void ivas_ism_metadata_sid_enc_fx( ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - const Word16 flag_noisy_speech, /* i : noisy speech flag */ - const Word16 nchan_ism, /* i : number of objects */ - const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 flag_noisy_speech, /* i : noisy speech flag */ + const Word16 nchan_ism, /* i : number of objects */ + const Word16 nchan_transport, /* i : number of transport channels */ const ISM_MODE ism_mode, /* i : ISM mode */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - const Word16 sid_flag, /* i : indication of SID frame */ - const Word16 md_diff_flag[], /* i : metadata differental flag */ + const Word16 sid_flag, /* i : indication of SID frame */ + const Word16 md_diff_flag[], /* i : metadata differental flag */ BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - Word16 nb_bits_metadata[] /* o : number of metadata bits */ + Word16 nb_bits_metadata[] /* o : number of metadata bits */ ); - - void ivas_param_ism_compute_noisy_speech_flag_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); + /*----------------------------------------------------------------------------------* * DFT Stereo prototypes *----------------------------------------------------------------------------------*/ -void stereo_dft_dec_destroy( +void stereo_dft_dec_destroy_fx( STEREO_DFT_DEC_DATA_HANDLE *hStereoDft /* i/o: decoder DFT stereo handle */ ); @@ -6239,14 +6350,14 @@ UWord16 rc_uni_dec_read_bit( /*! r: Read bit */ UWord16 rc_uni_dec_read_bit_prob_fast( RangeUniDecState *rc_st_dec, /* i/o: RC state handle */ - const Word16 freq0, /* i : Frequency for symbol 0 */ - const UWord16 tot_shift /* i : Total frequency as a power of 2 */ + const Word16 freq0, /* i : Frequency for symbol 0 */ + const UWord16 tot_shift /* i : Total frequency as a power of 2 */ ); /*! r: Read bits */ UWord16 rc_uni_dec_read_bits( RangeUniDecState *rc_st_dec, /* i/o: RC state handle */ - const Word16 bits /* i : Number of bits */ + const Word16 bits /* i : Number of bits */ ); @@ -6273,41 +6384,43 @@ void tdm_bit_alloc( const Word16 tdm_inst_ratio_idx /* i : instantaneous correlation ratio index */ ); - /*! r: value of the indice */ -uint16_t get_indice_st( +UWord16 get_indice_st( Decoder_State *st, /* i/o: decoder state structure */ - const Word32 element_brate, /* i : element bitrate */ - const Word16 pos, /* i : absolute position in the bitstream */ - const Word16 nb_bits /* i : number of bits to quantize the indice */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 pos, /* i : absolute position in the bitstream */ + const Word16 nb_bits /* i : number of bits to quantize the indice */ ); + /*----------------------------------------------------------------------------------* * MDCT Stereo prototypes *----------------------------------------------------------------------------------*/ void stereo_mdct_core_enc_fx( CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - Word16 new_samples[CPE_CHANNELS][L_INP], /* i : new samples Q0*/ - Word16 old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP Qx*/ - Word16 pitch_buf_fx[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe Q6*/ + Word16 new_samples[CPE_CHANNELS][L_INP], /* i : new samples Q0*/ + Word16 old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP Qx*/ + Word16 pitch_buf_fx[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe Q6*/ ); Word16 write_stereo_to_bitstream_fx ( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ Encoder_State **sts, /* i/o: Encoder state structure */ - Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask Q0*/ - const Word16 mct_on, /* i : flag mct block (1) or stereo (0) Q0*/ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask Q0*/ + const Word16 mct_on, /* i : flag mct block (1) or stereo (0) Q0*/ BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ ); + /*----------------------------------------------------------------------------------* * Stereo CNG prototypes *----------------------------------------------------------------------------------*/ + void stereo_cng_dec_update( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const Word32 ivas_total_brate /* i : IVAS total bitrate Q0*/ + const Word32 ivas_total_brate /* i : IVAS total bitrate Q0*/ ); @@ -6316,9 +6429,9 @@ void stereo_cng_dec_update( *----------------------------------------------------------------------------------*/ void mvc2c( - const uint8_t x[], /* i : input vector */ - uint8_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ + const UWord8 x[], /* i : input vector */ + UWord8 y[], /* o : output vector */ + const Word16 n /* i : vector size */ ); void stereo_switching_dec( @@ -6327,28 +6440,25 @@ void stereo_switching_dec( ); -/*! r: number of bits written */ - - - /*----------------------------------------------------------------------------------* * MCT prototypes *----------------------------------------------------------------------------------*/ + void ivas_mdct_core_whitening_enc_fx( CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - Word16 new_samples_fx[CPE_CHANNELS][L_INP], /* i : new samples */ - Word16 old_wsp_fx[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ - Word16 pitch_buf[CPE_CHANNELS][NB_SUBFR16k], /* o : floating pitch for each subframe */ - Word32 *mdst_spectrum_long[CPE_CHANNELS], /* o : buffer for MDST spectrum */ - Word16 tnsBits[CPE_CHANNELS][NB_DIV], /* o : buffer TNS bits */ - Word32 *orig_spectrum_long[CPE_CHANNELS], /* o : origingal spectrum w/o whitening */ - Word16 tnsSize[CPE_CHANNELS][NB_DIV], /* o : size of TNS */ - Word16 p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to parameter array */ + Word16 new_samples_fx[CPE_CHANNELS][L_INP], /* i : new samples */ + Word16 old_wsp_fx[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ + Word16 pitch_buf[CPE_CHANNELS][NB_SUBFR16k], /* o : floating pitch for each subframe */ + Word32 *mdst_spectrum_long[CPE_CHANNELS], /* o : buffer for MDST spectrum */ + Word16 tnsBits[CPE_CHANNELS][NB_DIV], /* o : buffer TNS bits */ + Word32 *orig_spectrum_long[CPE_CHANNELS], /* o : origingal spectrum w/o whitening */ + Word16 tnsSize[CPE_CHANNELS][NB_DIV], /* o : size of TNS */ + Word16 p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to parameter array */ BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ + const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ const Word16 nChannels, /* i : total number of coded channels */ -Word16 mdst_spectrum_e[CPE_CHANNELS][NB_DIV], -Word16 orig_spectrum_e[CPE_CHANNELS][NB_DIV] + Word16 mdst_spectrum_e[CPE_CHANNELS][NB_DIV], + Word16 orig_spectrum_e[CPE_CHANNELS][NB_DIV] ); void splitAvailableBitsMCT_fx( @@ -6364,24 +6474,24 @@ void enc_prm_igf_mdct( BSTR_ENC_HANDLE hBstr /* i/o: Bitstream handle */ ); + /*----------------------------------------------------------------------------------* * Q Metadata prototypes for DirAC and MASA *----------------------------------------------------------------------------------*/ -/*! r: number of bits written */ /*! r: number of bits read */ Word16 ivas_qmetadata_dec_decode( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - UWord16 *bitstream, /* i : bitstream */ - Word16 *index, /* i/o: bitstream position */ - const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ + UWord16 *bitstream, /* i : bitstream */ + Word16 *index, /* i/o: bitstream position */ + const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); /*! r: number of bits read */ Word16 ivas_qmetadata_dec_decode_hr_384_512( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ - UWord16 *bitstream, /* i : bitstream */ - Word16 *index, /* i/o: bitstream position */ + UWord16 *bitstream, /* i : bitstream */ + Word16 *index, /* i/o: bitstream position */ const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ const Word16 bits_sph_idx, const Word16 bits_sp_coh, @@ -6391,16 +6501,15 @@ Word16 ivas_qmetadata_dec_decode_hr_384_512( /*! r: number of bits read */ Word16 ivas_qmetadata_dec_sid_decode( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - UWord16 *bitstream, /* i : bitstream */ - Word16 *index, /* i/o: bitstream position */ - const Word16 nchan_transport, /* i : number of transport channels */ - Word16 *element_mode, /* o : element mode */ - const Word16 ivas_format /* i : IVAS format */ + UWord16 *bitstream, /* i : bitstream */ + Word16 *index, /* i/o: bitstream position */ + const Word16 nchan_transport, /* i : number of transport channels */ + Word16 *element_mode, /* o : element mode */ + const Word16 ivas_format /* i : IVAS format */ ); - UWord16 ivas_qmetadata_reorder_generic_fx( - const Word16 signed_value + const Word16 signed_value ); void ivas_sba_set_cna_cng_flag( @@ -6423,39 +6532,38 @@ Word16 ivas_get_sba_dirac_stereo_flag( * DirAC prototypes *----------------------------------------------------------------------------------*/ - ivas_error ivas_dirac_enc_reconfigure( Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); ivas_error ivas_mc_paramupmix_enc_open_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); void ivas_mc_paramupmix_enc_close_fx( - MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ - const int32_t input_Fs /* i : input sampling rate */ + MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ + const Word32 input_Fs /* i : input sampling rate */ ); ivas_error ivas_mc_paramupmix_dec_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void ivas_mc_paramupmix_dec_close( - MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix_out /* i/o: Parametric MC decoder handle */ + MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix_out /* i/o: Parametric MC decoder handle */ ); void ivas_mc_paramupmix_dec_read_BS( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Decoder_State *st, /* i/o: decoder state structure */ - MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ - Word16 *nb_bits /* o : number of bits written */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_State *st, /* i/o: decoder state structure */ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ + Word16 *nb_bits /* o : number of bits written */ ); -void ivas_mc_paramupmix_dec_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord8 nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ - const Word16 nSamplesForRendering /* i : number of samples provided */ +void ivas_mc_paramupmix_dec_digest_tc_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord8 nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + const Word16 nSamplesForRendering /* i : number of samples provided */ ); void ivas_param_mc_set_coded_bands_fx( @@ -6463,10 +6571,11 @@ void ivas_param_mc_set_coded_bands_fx( ); UWord16 ivas_param_mc_get_configuration_index_fx( - const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ - const Word32 ivas_total_brate /* i : IVAS total bitrate */ + const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); + /*----------------------------------------------------------------------------------* * SPAR prototypes *----------------------------------------------------------------------------------*/ @@ -6477,10 +6586,10 @@ UWord16 ivas_param_mc_get_configuration_index_fx( ivas_error ivas_spar_md_dec_open( ivas_spar_md_dec_state_t **hMdDec_out, /* i/o: SPAR MD decoder handle */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ - const Word16 num_channels, /* i : number of internal channels */ - const Word16 sba_order, /* i : SBA order */ - const Word16 sid_format, /* i : SID format */ - const Word32 last_active_ivas_total_brate /* i : IVAS last active bitrate */ + const Word16 num_channels, /* i : number of internal channels */ + const Word16 sba_order, /* i : SBA order */ + const Word16 sid_format, /* i : SID format */ + const Word32 last_active_ivas_total_brate /* i : IVAS last active bitrate */ ); void ivas_spar_md_dec_close( @@ -6490,14 +6599,14 @@ void ivas_spar_md_dec_close( ivas_error ivas_spar_md_dec_init( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ - const Word16 num_channels, /* i : number of internal channels */ - const Word16 sba_order /* i : SBA order */ + const Word16 num_channels, /* i : number of internal channels */ + const Word16 sba_order /* i : SBA order */ ); /* Transient detector module */ ivas_error ivas_transient_det_open_fx( ivas_trans_det_state_t **hTranDet, /* i/o: Transient detector handle */ - const Word32 sampling_rate /* i : sampling rate */ + const Word32 sampling_rate /* i : sampling rate */ ); void ivas_transient_det_close_fx( @@ -6534,38 +6643,40 @@ void ivas_map_prior_coeffs_quant( const Word16 nB ); -void ivas_clear_band_coeff_idx( - ivas_band_coeffs_ind_t *pband_coeff_idx, - const UWord16 num_bands +void ivas_clear_band_coeff_idx( + ivas_band_coeffs_ind_t *pband_coeff_idx, + const UWord16 num_bands ); /*----------------------------------------------------------------------------------* * MASA prototypes *----------------------------------------------------------------------------------*/ + ivas_error ivas_masa_enc_open_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); void ivas_masa_enc_close_fx( - MASA_ENCODER_HANDLE *hMasa /* i/o: MASA metadata structure */ + MASA_ENCODER_HANDLE *hMasa /* i/o: MASA metadata structure */ ); -int16_t ivas_qmetadata_encode_extended_gr_length_fx( +Word16 ivas_qmetadata_encode_extended_gr_length_fx( const UWord16 value, const UWord16 alphabet_size, - const Word16 gr_param); + const Word16 gr_param +); void ivas_qmetadata_encode_extended_gr_fx( - BSTR_ENC_HANDLE hMetaData, /* i/o: q_metadata handle */ - const UWord16 value, /* i : value to be encoded */ - const UWord16 alphabet_size, /* i : alphabet size */ - const Word16 gr_param); /* i : GR order */ - + BSTR_ENC_HANDLE hMetaData, /* i/o: q_metadata handle */ + const UWord16 value, /* i : value to be encoded */ + const UWord16 alphabet_size, /* i : alphabet size */ + const Word16 gr_param /* i : GR order */ +); void ivas_set_qmetadata_maxbit_req_fx( IVAS_QMETADATA_HANDLE hQMetaData, /* o : qmetadata structure where the requirement value is set */ - const IVAS_FORMAT ivas_format /* i : IVAS format */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ ); @@ -6573,29 +6684,52 @@ void ivas_set_qmetadata_maxbit_req_fx( * Binaural FastConv Renderer Prototypes *-----------------------------------------------------------------------------------*/ +void ivas_binaural_hrtf_close_fx( + HRTFS_FASTCONV_HANDLE *hHrtfFastConv /* i/o: decoder binaural hrtf handle */ +); -void ivas_binaural_hrtf_close( - HRTFS_FASTCONV_HANDLE *hHrtfFastConv /* i/o: decoder binaural hrtf handle */ + +/*---------------------------------------------------------------------------------* + * Multi-pose ring buffer Prototypes +*-----------------------------------------------------------------------------------*/ + +ivas_error ivas_CLDFB_RINGBUF_Open( + ISAR_CLDFB_RINGBUF_HANDLE *ph, + const Word16 capacity_columns ); -/*----------------------------------------------------------------------------------* - * renderer prototypes - *----------------------------------------------------------------------------------*/ +void ivas_CLDFB_RINGBUF_Close( + ISAR_CLDFB_RINGBUF_HANDLE *ph +); -void ivas_ism_renderer_close( - ISM_RENDERER_HANDLE *hIsmRendererData /* i/o: ISM renderer handle */ +void ivas_CLDFB_RINGBUF_Push( + ISAR_CLDFB_RINGBUF_HANDLE h, + const Word32 *real, + const Word32 *imag, + const Word16 num_bands +); + +void ivas_CLDFB_RINGBUF_Pop( + ISAR_CLDFB_RINGBUF_HANDLE h, + Word32 *real, + Word32 *imag, + const Word16 num_bands +); + +void ivas_CLDFB_RINGBUF_GetByIdx( + ISAR_CLDFB_RINGBUF_HANDLE h, + Word32 **p_real, + Word32 **p_imag, + const Word16 idx ); /*----------------------------------------------------------------------------------* - * Amplitude Panning VBAP prototypes + * renderer prototypes *----------------------------------------------------------------------------------*/ -void panning_wrap_angles( - const float azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ - const float ele_deg, /* i : elevation in degrees for panning direction (positive up) */ - float *azi_wrapped, /* o : wrapped azimuth component */ - float *ele_wrapped /* o : wrapped elevation component */ +void ivas_ism_renderer_close( + ISM_RENDERER_HANDLE *hIsmRendererData /* i/o: ISM renderer handle */ ); @@ -6603,26 +6737,24 @@ void panning_wrap_angles( * McMASA prototypes *----------------------------------------------------------------------------------*/ - ivas_error ivas_mcmasa_dec_reconfig( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ ); void ivas_mcmasa_dmx_modify_fx( - const Word16 n_samples, /* i : input frame length in samples */ - Word32 dmx_fx[][L_FRAME48k + NS2SA(48000, IVAS_FB_ENC_DELAY_NS)], /* i/o: downmix signal to be transformed into another format Qx*/ - Word16 dmx_Q[], /* i/o : Q of the intput signal which is being transformed*/ - const Word16 n_chnls_dmx_old, /* i : number of downmix channels in the old format Q0 */ - const Word16 n_chnls_dmx_new /* i : number of downmix channels in the target format Q0*/ + const Word16 n_samples, /* i : input frame length in samples */ + Word32 dmx_fx[][L_FRAME48k + NS2SA(48000, IVAS_FB_ENC_DELAY_NS)], /* i/o: downmix signal to be transformed into another format Qx*/ + Word16 dmx_Q[], /* i/o : Q of the intput signal which is being transformed */ + const Word16 n_chnls_dmx_old, /* i : number of downmix channels in the old format Q0 */ + const Word16 n_chnls_dmx_new /* i : number of downmix channels in the target format Q0 */ ); ivas_error ivas_mono_dmx_renderer_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); - void ivas_mono_dmx_renderer_close( - MONO_DOWNMIX_RENDERER_HANDLE *hMonoDmxRenderer /* i/ i/o: Mono downmix structure */ + MONO_DOWNMIX_RENDERER_HANDLE *hMonoDmxRenderer /* i/ i/o: Mono downmix structure */ ); @@ -6634,6 +6766,17 @@ void ivas_lfe_lpf_enc_close_fx( ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ ); +ivas_error ivas_create_lfe_lpf_enc_fx( + ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ + const Word32 input_Fs /* i : input sampling rate */ +); + +void ivas_lfe_lpf_enc_apply_fx( + ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ + Word32 data_lfe_ch[], /* i/o: LFE signal */ + const Word16 input_frame /* i : input frame length per channel */ +); + /*----------------------------------------------------------------------------------* * LFE Coding prototypes @@ -6641,68 +6784,70 @@ void ivas_lfe_lpf_enc_close_fx( ivas_error ivas_create_lfe_enc_fx( LFE_ENC_HANDLE *hLFE, /* o : IVAS LFE encoder structure */ - const Word32 input_Fs /* i : input sampling rate */ + const Word32 input_Fs /* i : input sampling rate */ ); -void ivas_lfe_enc_close_fx( +void ivas_lfe_enc_close_fx( LFE_ENC_HANDLE *hLFE /* i/o: LFE encoder handle */ ); void ivas_filters_init_fx( - ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ - const Word32 *filt_coeff_fx, /* i : filter coefficients Q31- *filt_coeff_e */ - const Word16 *filt_coeff_e, /* i : exponents of filter coefficients */ - const Word16 order ) ; + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + const Word32 *filt_coeff_fx, /* i : filter coefficients Q31- *filt_coeff_e */ + const Word16 *filt_coeff_e, /* i : exponents of filter coefficients */ + const Word16 order +); void ivas_filter_process_fx( - ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ - Word32 *pIn_Out_fx, /* i/o: signal subject to filtering Q(q_factor) */ - const Word16 length, /* i : filter order */ - Word16 q_factor ); + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + Word32 *pIn_Out_fx, /* i/o: signal subject to filtering Q(q_factor) */ + const Word16 length, /* i : filter order */ + Word16 q_factor +); /*----------------------------------------------------------------------------------* * OSBA prototypes *----------------------------------------------------------------------------------*/ + ivas_error ivas_osba_enc_reconfig( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); void ivas_set_surplus_brate_enc( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ #ifdef DEBUG_MODE_INFO , - const int16_t *nb_bits_metadata /* i : number of metadata bits */ + const int16_t *nb_bits_metadata /* i : number of metadata bits */ #endif ); void ivas_set_surplus_brate_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - int32_t *ism_total_brate /* i : ISM total bitrate */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word32 *ism_total_brate /* i : ISM total bitrate */ ); ivas_error ivas_omasa_separate_object_renderer_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void ivas_omasa_separate_object_renderer_close( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); + /*----------------------------------------------------------------------------------* * Filter-bank (FB) Mixer *----------------------------------------------------------------------------------*/ ivas_error ivas_fb_set_cfg( IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ - const Word16 ivas_format, /* i : IVAS format */ - const Word16 num_in_chans, /* i : number of FB input channels */ - const Word16 num_out_chans, /* i : number of FB output channels */ - const Word16 active_w_mixing, /* i : active_w_mixing flag */ - const Word32 sampling_Fs, /* i : sampling rate */ - const Word16 nachan_dirac_ana /* i : number of DirAR analysis channels */ + const Word16 ivas_format, /* i : IVAS format */ + const Word16 num_in_chans, /* i : number of FB input channels */ + const Word16 num_out_chans, /* i : number of FB output channels */ + const Word16 active_w_mixing, /* i : active_w_mixing flag */ + const Word32 sampling_Fs, /* i : sampling rate */ + const Word16 nachan_dirac_ana /* i : number of DirAR analysis channels */ ); - -/*=============================================================================================*/ - +/* clang-format on */ #endif diff --git a/lib_com/ivas_qmetadata_com_fx.c b/lib_com/ivas_qmetadata_com_fx.c index c9ad840979d7af9f492d83747fb9abbfc4c8d99b..906277f54294d732a576187b64c798e8e375c836 100644 --- a/lib_com/ivas_qmetadata_com_fx.c +++ b/lib_com/ivas_qmetadata_com_fx.c @@ -40,9 +40,7 @@ #include "cnst.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" -// #include "debug.h" /*-----------------------------------------------------------------------* * Local constants @@ -152,10 +150,8 @@ ivas_error ivas_qmetadata_allocate_memory_fx( { set32_fx( hQMetaData->q_direction[dir].band_data[j].elevation_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); set32_fx( hQMetaData->q_direction[dir].band_data[j].azimuth_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); -#ifdef MSAN_FIX set32_fx( hQMetaData->q_direction[dir].band_data[j].q_elevation_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); set32_fx( hQMetaData->q_direction[dir].band_data[j].q_azimuth_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); -#endif set32_fx( hQMetaData->q_direction[dir].band_data[j].energy_ratio_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); } } @@ -315,14 +311,8 @@ ivas_error only_reduce_bits_direction_fx( Word16 *bits_dir0; Word16 bits_sph_idx_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; -#ifdef FIX_QMETADATA_PENALTY Word32 penalty[MASA_MAXIMUM_CODING_SUBBANDS]; Word16 tmp; -#else - Word16 penalty[MASA_MAXIMUM_CODING_SUBBANDS]; - Word16 shift, tmp, tmp_e, flag; - Word32 tmp_32; -#endif FOR( j = 0; j < coding_subbands; j++ ) { FOR( k = 0; k < no_subframes; k++ ) @@ -407,7 +397,6 @@ ivas_error only_reduce_bits_direction_fx( } ELSE { -#ifdef FIX_QMETADATA_PENALTY Word16 m, sorted, index1, index2; @@ -455,67 +444,6 @@ ivas_error only_reduce_bits_direction_fx( } } } - - -#else - FOR( j = 0; j < coding_subbands; j++ ) - { - penalty[j] = 0; - move16(); - tmp_32 = 0; - move32(); - shift = find_guarded_bits_fx( no_subframes ); - - flag = 1; - move16(); - // This change was done due to loss of precision from BASOP_Util_Divide3232_Scale which was leading to penalty getting calculated wrongly - // and hence ind_order being sorted incorrectly which might cause infinite loop. - FOR( k = 0; k < no_subframes - 1; k++ ) - { - IF( NE_16( bits_sph_idx_orig[j][k], bits_sph_idx_orig[j][k + 1] ) ) - { - flag = 0; - move16(); - } - } - - IF( flag ) - { - tmp = 0; - move16(); - FOR( k = 0; k < no_subframes; k++ ) - { - IF( bits_sph_idx_orig[j][k] > 0 ) - { - tmp = add( tmp, sub( bits_sph_idx_orig[j][k], q_direction->band_data[j].bits_sph_idx[k] ) ); - } - } - - tmp = BASOP_Util_Divide1616_Scale( tmp, bits_sph_idx_orig[j][0], &tmp_e ); - - tmp_32 = L_shl( tmp, tmp_e ); /* Q15 */ - - penalty[j] = extract_l( L_shr( tmp_32, shift ) ); /* Q15 - shift */ - move16(); - // Division by no_subframes for penalty[j] not required - } - ELSE - { - FOR( k = 0; k < no_subframes; k++ ) - { - IF( bits_sph_idx_orig[j][k] > 0 ) - { - tmp = BASOP_Util_Divide3232_Scale( extract_l( L_sub( bits_sph_idx_orig[j][k], q_direction->band_data[j].bits_sph_idx[k] ) ), bits_sph_idx_orig[j][k], &tmp_e ); - tmp_32 = L_add( tmp_32, L_shl( tmp, tmp_e ) ); - } - } - penalty[j] = extract_l( L_shr( tmp_32, shift ) ); /* Q15 - shift */ - move16(); - // Division by no_subframes for penalty[j] not required - } - } - sort_desc_ind_16_fx( penalty, coding_subbands, ind_order ); -#endif } *reduce_bits_out = negate( reduce_bits ); diff --git a/lib_com/ivas_qspherical_com_fx.c b/lib_com/ivas_qspherical_com_fx.c index 6661026a8cde298b8d2f618156313e3cdef73a1f..7d7c159b365ed4e89520a51b472381c25d7b7c8a 100644 --- a/lib_com/ivas_qspherical_com_fx.c +++ b/lib_com/ivas_qspherical_com_fx.c @@ -40,7 +40,6 @@ #include "cnst.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*------------------------------------------------------------------------- @@ -314,9 +313,9 @@ Word16 quantize_phi_enc_fx( Word32 temp_res; Word16 temp_e; - delta_phi_fx = BASOP_Util_Divide3232_Scale_cadence( 360, n, &temp_e ); + delta_phi_fx = BASOP_Util_Divide3232_Scale_newton( 360, n, &temp_e ); delta_phi_fx = L_shl( delta_phi_fx, sub( temp_e, 9 ) ); - inv_delta_phi_fx = BASOP_Util_Divide3232_Scale_cadence( n, 360, &temp_e ); + inv_delta_phi_fx = BASOP_Util_Divide3232_Scale_newton( n, 360, &temp_e ); IF( EQ_16( n, 1 ) ) { @@ -661,7 +660,7 @@ Word16 quantize_phi_chan_compand_fx( /* quantize companded value */ // delta_phi = 360.0f / (float) n; - delta_phi = BASOP_Util_Divide3232_Scale_cadence( 360, n, &tmp_e ); + delta_phi = BASOP_Util_Divide3232_Scale_newton( 360, n, &tmp_e ); delta_phi = L_shr( delta_phi, sub( 9, tmp_e ) ); // Q22 // id_phi = (int16_t) round_f( ( phi / (float) delta_phi ) ); id_phi = BASOP_Util_Divide3232_Scale( phi, delta_phi, &tmp_e ); // Q15 diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c deleted file mode 100644 index 560d1ee8e90fbaae2b3a51d6d758f140bef10ed7..0000000000000000000000000000000000000000 --- a/lib_com/ivas_rom_com.c +++ /dev/null @@ -1,2903 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#include -#include "options.h" -#include -#include "cnst.h" -#include "ivas_cnst.h" -#include "ivas_rom_com.h" -#include "wmc_auto.h" - -/* clang-format off */ - -/*----------------------------------------------------------------------------------* - * Table of IVAS bitrates - *----------------------------------------------------------------------------------*/ - -const Word32 ivas_brate_tbl[SIZE_IVAS_BRATE_TBL] = -{ - FRAME_NO_DATA, IVAS_SID_5k2, - IVAS_13k2, IVAS_16k4, IVAS_24k4, IVAS_32k, IVAS_48k, - IVAS_64k, IVAS_80k, IVAS_96k, IVAS_128k, IVAS_160k, - IVAS_192k, IVAS_256k, IVAS_384k, IVAS_512k -}; - - -/*------------------------------------------------------------------------- - * DFT Stereo ROM tables - *------------------------------------------------------------------------*/ - -/*4xERB scale: max of 14 bands*/ -const Word16 dft_band_limits_erb4[STEREO_DFT_ERB4_BANDS] = -{ - 1, 3, 5, 10, 18, 26, 41, 56, 84, 132, 214, 342, 470, 601 -}; - -/*8xERB scale: max of 8 bands*/ -const Word16 dft_band_limits_erb8[STEREO_DFT_ERB8_BANDS] = -{ - 1, 5, 18, 41, 84, 214, 470, 601 -}; - - -const Word16 dft_band_ipd[3][4] = -{ - {0,8,10,13}, - {0,5,6,8}, - {0,2,3,4} -}; - -const Word16 dft_band_res_cod[3][4] = -{ - {0,8,10,11}, - {0,5,6,7}, - {0,5,6,7} -}; - -// Q31 -const Word32 dft_res_gains_q_Q31[][2] = -{ - /* quantization points for joint quantization of prediction gain and residual energy */ - - /* column 1 (|ILD| = 0): */ - {0, 0 }, - {0, 251216928 }, - {0, 487459456 }, - {0, 731632640 }, - {0, 997611392 }, - {0, 1299397248 }, - {0, 1666984192 }, - {0, 2147483647 }, - - /* column 2 (|ILD| = 2): */ - {246151024, 0 }, - {249475328, 247871152 }, - {258660112, 480729248 }, - {274304544, 720918848 }, - {298427200, 981720000 }, - {334663840, 1276185088 }, - {391374592, 1632160640 }, - {485919712, 2091786496 }, - - /* column 3 (|ILD| = 4): */ - {485919712, 0 }, - {492224736, 238188144 }, - {509610752, 461283776 }, - {539117184, 690072384 }, - {584326016, 936189056 }, - {651608832, 1210182144 }, - {755411712, 1534299776 }, - {924504576, 1938292992 }, - - /* column 4 (|ILD| = 6): */ - {713563712, 0 }, - {722237376, 223142880 }, - {746085184, 431184640 }, - {786311872, 642617280 }, - {847364864, 866812416 }, - {936938496, 1111020032 }, - {1072199936, 1390431232 }, - {1285225984, 1720430720 }, - - /* column 5 (|ILD| = 8): */ - {924504576, 0 }, - {934784576, 204139792 }, - {962942400, 393358880 }, - {1010083968, 583482048 }, - {1080789888, 781462848 }, - {1182728704, 991308544 }, - {1332741248, 1221608960 }, - {1559902080, 1475937536 }, - - /* column 6 (|ILD| = 10): */ - {1115604864, 0 }, - {1126709504, 182744416 }, - {1156997632, 351025536 }, - {1207276672, 517958016 }, - {1281710592, 688294272 }, - {1387005952, 863412992 }, - {1537761536, 1046870336 }, - {1757032448, 1234717184 }, - - /* column 7 (|ILD| = 13): */ - {1361843968, 0 }, - {1372924928, 149366080 }, - {1402942464, 285507936 }, - {1452130560, 417893888 }, - {1523515136, 548787328 }, - {1621670144, 677135936 }, - {1756740352, 802203264 }, - {1942499840, 915633344 }, - - /* column 8 (|ILD| = 16): */ - {1559902080, 0 }, - {1569913600, 117815248 }, - {1596862336, 224162928 }, - {1640492800, 325650848 }, - {1702660352, 423060736 }, - {1785997696, 514412544 }, - {1896788608, 597466432 }, - {2042241920, 664027712 }, - - /* column 9 (|ILD| = 19): */ - {1714196608, 0 }, - {1722634112, 90359672 }, - {1745223424, 171238192 }, - {1781415040, 247171072 }, - {1832190080, 318199104 }, - {1898830848, 382271424 }, - {1984989952, 437025792 }, - {2094086528, 475912448 }, - - /* column 10 (|ILD| = 22): */ - {1831427712, 0 }, - {1838194432, 67828272 }, - {1856228992, 128123168 }, - {1884882944, 183977072 }, - {1924581248, 235132272 }, - {1975822336, 279821408 }, - {2040659200, 316058048 }, - {2120554240, 339023232 }, - - /* column 11 (|ILD| = 25): */ - {1918819584, 0 }, - {1924055168, 50102940 }, - {1937964416, 94399088 }, - {1959916032, 135003712 }, - {1990038784, 171579648 }, - {2028424960, 202728896 }, - {2076217216, 226931040 }, - {2133943808, 240762976 }, - - /* column 12 (|ILD| = 30): */ - {2015827840, 0 }, - {2019068416, 29502130 }, - {2027636864, 55420112 }, - {2041056512, 78889960 }, - {2059271424, 99626064 }, - {2082150784, 116769424 }, - {2110128128, 129415952 }, - {2143192960, 135682304 }, - - /* column 13 (|ILD| = 35): */ - {2072441984, 0 }, - {2074364032, 17033840 }, - {2079438464, 31939524 }, - {2087347712, 45337676 }, - {2098012032, 57039312 }, - {2111296384, 66537632 }, - {2127368192, 73321536 }, - {2146126464, 76351632 }, - - /* column 14 (|ILD| = 40): */ - {2104959232, 0 }, - {2106073728, 9723806 }, - {2109011456, 18212808 }, - {2113579136, 25810606 }, - {2119712384, 32401234 }, - {2127314432, 37692632 }, - {2136458496, 41399188 }, - {2147054208, 42945376 }, - - /* column 15 (|ILD| = 45): */ - {2123466240, 0 }, - {2124103936, 5514738 }, - {2125783296, 10322954 }, - {2128390400, 14615774 }, - {2131882240, 18322330 }, - {2136200832, 21283710 }, - {2141376256, 23332410 }, - {2147348352, 24150602 }, - - /* column 16 (|ILD| = 50): */ - {2133943808, 0 }, - {2134306688, 3115998 }, - {2135260160, 5830418 }, - {2136737664, 8250632 }, - {2138715520, 10335839 }, - {2141157120, 11995844 }, - {2144077696, 13136157 }, - {2147440640, 13580687 } -}; - - -/* tables for adaptive Golomb-Rice coding of DFT stereo parameters */ -const Word16 dft_code_itd[] = -{ - 0, 3, 4, 13, 8, 9, 12, 5, 10, 44, 23, 60, 45, 31, 235, 59, 28, 61, 234, 116 -}; - -const Word16 dft_len_itd[] = -{ - 2, 3, 4, 4, 4, 4, 4, 4, 4, 6, 5, 6, 6, 5, 8, 6, 5, 6, 8, 7 -}; - -const Word16 dft_maps_rpg[] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, - 2, 0, 1, 3, 4, 5, 6, 7, - 6, 2, 0, 1, 3, 4, 5, 7, - 7, 5, 2, 0, 1, 3, 4, 6, - 7, 6, 4, 3, 1, 0, 2, 5, - 7, 6, 5, 3, 2, 1, 0, 4, - 7, 6, 5, 4, 3, 2, 0, 1, - 7, 6, 5, 4, 3, 2, 0, 1, - 6, 5, 4, 3, 1, 0, 2, 7, -}; - -const Word16 dft_maps_sg[NO_SYMB_GR_SIDE_G * NO_SYMB_GR_SIDE_G] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 15, 4, 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 12, 9, 4, 1, 0, 2, 3, 5, 6, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 16, 14, 8, 4, 2, 0, 1, 3, 5, 6, 7, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 18, 16, 14, 10, 5, 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 15, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 21, 19, 17, 15, 8, 4, 2, 0, 1, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 21, 19, 17, 15, 12, 8, 4, 0, 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 16, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 21, 19, 17, 15, 13, 11, 9, 3, 0, 1, 2, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 24, 22, 20, 18, 16, 14, 12, 9, 6, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 15, 17, 19, 21, 23, 25, 26, 27, 28, 29, 30, - 25, 23, 21, 19, 17, 15, 13, 11, 9, 6, 0, 1, 2, 3, 4, 5, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 27, 28, 29, 30, - 27, 25, 23, 21, 19, 17, 15, 13, 11, 8, 5, 0, 1, 2, 3, 4, 6, 7, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 29, 30, - 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 1, 0, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 28, 29, 30, - 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 30, - 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 0, 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, - 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, - 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 1, 0, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, - 30, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, - 30, 29, 28, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 0, 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, - 30, 29, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 9, 7, 6, 4, 3, 2, 1, 0, 5, 8, 11, 13, 15, 17, 19, 21, 23, 25, 27, - 30, 29, 28, 27, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 3, 2, 1, 0, 6, 9, 11, 13, 15, 17, 19, 21, 23, 25, - 30, 29, 28, 27, 26, 25, 23, 21, 19, 17, 15, 13, 11, 10, 8, 7, 5, 4, 3, 2, 1, 0, 6, 9, 12, 14, 16, 18, 20, 22, 24, - 30, 29, 28, 27, 26, 25, 24, 23, 22, 20, 18, 16, 14, 12, 10, 8, 7, 6, 5, 4, 2, 1, 0, 3, 9, 11, 13, 15, 17, 19, 21, - 30, 29, 28, 27, 26, 25, 24, 23, 22, 20, 18, 16, 14, 13, 11, 10, 9, 7, 6, 5, 3, 2, 1, 0, 4, 8, 12, 15, 17, 19, 21, - 30, 29, 28, 27, 26, 25, 24, 23, 22, 20, 18, 16, 14, 13, 12, 11, 10, 9, 7, 6, 5, 3, 1, 0, 2, 4, 8, 15, 17, 19, 21, - 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 17, 15, 13, 12, 11, 9, 8, 7, 6, 4, 3, 2, 1, 0, 5, 10, 14, 16, 18, - 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 15, 13, 12, 11, 10, 9, 7, 6, 5, 3, 1, 0, 2, 4, 8, 14, 16, - 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 11, 10, 8, 7, 6, 5, 3, 2, 0, 1, 4, 9, 12, - 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 3, 2, 1, 0, 4, 15, - 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 0, 1, - 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 -}; - - -/*------------------------------------------------------------------------- - * Range Coder ROM tables - *------------------------------------------------------------------------*/ - -/* Create separate tables for cumulative frequency and symbol frequency */ -const UWord16 cum_freq_ari_pk_s17_LC_ext[RANGE_N_CONTEXT][1 + RANGE_N_SYMBOLS] = -{ - { 0,16,47,153,241,269,325,468,591,674,798,912,1017,1082,1183,1277,1364,16384 }, - { 0,7401,7844,7886,7899,12065,12718,12790,12805,14099,14476,14533,14549,15058,15264,15299,15310,16384 }, - { 0,4362,6345,6864,7038,9037,11049,11736,12002,12569,13301,13656,13822,14021,14334,14515,14607,16384 }, - { 0,2955,5183,5822,6013,8153,10671,11614,11943,12586,13540,14025,14232,14437,14770,14978,15080,16384 }, - { 0,3155,4981,5615,5855,7969,9953,10739,11073,11936,12837,13208,13383,13767,14203,14400,14498,16384 }, - { 0,1216,2630,3264,3558,4831,6679,7661,8157,8709,9622,10204,10542,10799,11243,11568,11777,16384 }, - { 0,1759,3641,4350,4612,6325,8678,9732,10161,10790,11790,12361,12642,12883,13295,13566,13720,16384 }, - { 0,1109,2705,3433,3732,5226,7532,8732,9263,9978,11142,11842,12188,12490,12986,13321,13520,16384 }, - { 0,11524,13046,13170,13191,14956,15708,15813,15837,16028,16162,16195,16204,16245,16282,16295,16300,16384 }, - { 0,8027,10586,10909,10974,13291,14861,15157,15232,15535,15824,15914,15943,16014,16090,16123,16136,16384 }, - { 0,834,2034,2674,2997,4087,5843,6891,7455,8030,9013,9688,10085,10376,10893,11277,11528,16384 }, - { 0,6038,9086,9451,9519,12332,14521,14913,15003,15329,15711,15848,15893,15955,16045,16091,16111,16384 }, - { 0,4732,7685,8354,8545,10717,12924,13618,13852,14291,14842,15083,15181,15314,15491,15582,15625,16384 }, - { 0,745,1783,2347,2655,3537,4963,5864,6406,6863,7664,8248,8634,8891,9351,9708,9958,16384 }, - { 0,3957,6794,7669,7998,9743,11676,12498,12869,13313,13894,14186,14332,14498,14714,14835,14906,16384 }, - { 0,2779,5388,6021,6201,8582,11352,12260,12544,13117,13981,14408,14580,14751,15039,15213,15298,16384 }, - { 0,448,1160,1625,1920,2576,3706,4518,5053,5474,6234,6835,7262,7531,8032,8446,8758,16384 }, - { 0,1,2,1555,2246,2247,2248,3489,4112,5449,6596,7302,7710,8311,8876,9266,9517,16384 }, - { 0,2496,4910,5544,5722,8049,10799,11689,11973,12583,13467,13878,14047,14234,14537,14712,14803,16384 }, - { 0,921,2222,2880,3188,4407,6321,7406,7955,8573,9616,10296,10679,10978,11502,11880,12118,16384 }, - { 0,2620,4443,5017,5233,7072,9213,10083,10441,11049,11954,12442,12676,12918,13310,13565,13705,16384 }, - { 0,11205,13084,13178,13187,15164,16010,16081,16091,16213,16303,16321,16325,16340,16355,16360,16362,16384 }, - { 0,358,916,1288,1542,2055,2937,3594,4062,4399,5017,5524,5907,6136,6573,6941,7236,16384 }, - { 0,3575,5093,5536,5735,7408,9185,9878,10188,10727,11497,11933,12165,12410,12794,13019,13166,16384 }, - { 0,1,2,640,1036,1037,1038,1670,2096,2696,3287,3732,4056,4417,4800,5106,5339,16384 }, - { 0,969,1397,1518,1578,2633,3338,3566,3675,4197,4664,4857,4957,5288,5625,5783,5874,16384 }, - { 0,10458,12104,12294,12331,14246,15264,15437,15481,15752,15971,16031,16050,16120,16186,16210,16218,16384 }, - { 0,7178,9744,10039,10093,12701,14612,14961,15042,15360,15732,15869,15917,15978,16070,16117,16139,16384 }, - { 0,1298,2418,2879,3113,4146,5509,6227,6621,7053,7755,8229,8539,8776,9186,9492,9714,16384 }, - { 0,4957,7785,8252,8357,10978,13372,13955,14114,14561,15140,15378,15464,15570,15730,15820,15860,16384 }, - { 0,4823,8164,8570,8647,11604,14169,14653,14763,15105,15554,15727,15785,15852,15960,16018,16045,16384 }, - { 0,4735,7010,7517,7660,9986,12230,12914,13131,13666,14374,14689,14814,14972,15212,15342,15404,16384 }, - { 0,3363,5881,6658,6941,8864,11113,12015,12368,12889,13643,14019,14203,14394,14665,14823,14906,16384 }, - { 0,2569,4996,5779,6068,7917,10251,11209,11602,12129,12918,13321,13520,13696,13976,14155,14259,16384 }, - { 0,209,577,848,1046,1378,1982,2465,2835,3072,3513,3893,4202,4374,4703,4994,5241,16384 }, - { 0,2074,4337,5048,5274,7319,10003,11066,11446,12105,13112,13652,13885,14100,14464,14691,14810,16384 }, - { 0,1619,3560,4288,4550,6381,8955,10102,10543,11239,12362,12982,13261,13516,13958,14234,14381,16384 }, - { 0,89,257,441,582,734,1024,1325,1568,1716,1983,2222,2430,2545,2750,2941,3109,16384 }, - { 0,2202,3563,4044,4264,5686,7344,8100,8476,9006,9835,10331,10612,10864,11304,11599,11787,16384 }, - { 0,1220,2801,3492,3784,5223,7387,8496,8998,9640,10711,11369,11711,11993,12486,12829,13035,16384 }, - { 0,12626,13813,13903,13917,15396,15906,15972,15987,16139,16230,16251,16257,16289,16315,16323,16326,16384 }, - { 0,1579,3191,3831,4099,5678,7788,8761,9206,9842,10821,11388,11681,11958,12417,12722,12902,16384 }, - { 0,597,1514,2064,2379,3237,4679,5637,6213,6733,7649,8316,8755,9052,9599,10023,10323,16384 }, - { 0,9273,11762,12080,12151,14038,15210,15446,15514,15725,15929,15995,16019,16068,16124,16148,16158,16384 }, - { 0,9238,11681,11852,11872,14306,15644,15801,15828,16013,16183,16231,16243,16266,16297,16312,16318,16384 }, - { 0,6791,9200,9531,9594,12240,14178,14552,14639,15064,15506,15643,15687,15785,15908,15960,15983,16384 }, - { 0,7175,10415,10905,11033,13038,14621,15002,15123,15367,15651,15762,15806,15864,15938,15974,15992,16384 }, - { 0,5060,7703,8132,8225,10934,13270,13778,13911,14397,14972,15173,15242,15367,15537,15619,15654,16384 }, - { 0,3721,6311,6857,6992,9557,12180,12895,13098,13671,14418,14718,14830,14984,15212,15333,15390,16384 }, - { 0,5971,9288,10044,10269,11991,13680,14228,14437,14750,15130,15293,15374,15459,15579,15642,15677,16384 }, - { 0,3047,5311,5907,6078,8339,10850,11679,11946,12580,13442,13854,14024,14220,14534,14716,14810,16384 }, - { 0,2061,4280,4993,5228,7201,9735,10735,11097,11708,12606,13082,13295,13498,13836,14043,14161,16384 }, - { 0,4738,7949,8880,9234,10781,12502,13214,13531,13897,14355,14593,14718,14835,14998,15096,15153,16384 }, - { 0,3237,5045,5632,5860,7609,9702,10608,10986,11571,12476,12978,13230,13451,13830,14074,14208,16384 }, - { 0,1833,3889,4677,5028,6422,8379,9378,9884,10350,11086,11545,11809,12003,12327,12559,12711,16384 }, - { 0,3989,6858,7352,7459,10254,12936,13571,13735,14240,14895,15153,15242,15364,15548,15646,15690,16384 }, - { 0,1463,3197,3909,4220,5626,7609,8632,9127,9657,10520,11078,11380,11607,11991,12265,12442,16384 }, - { 0,14233,15083,15108,15110,16069,16300,16314,16316,16352,16370,16373,16374,16377,16380,16381,16382,16384 }, - { 0,1,2,2610,3293,3294,3295,5097,5671,8467,10332,11119,11437,12223,12850,13185,13345,16384 }, - { 0,2010,4053,4696,4910,6879,9391,10386,10750,11393,12376,12886,13119,13348,13726,13967,14099,16384 }, - { 0,7586,10517,10758,10791,13543,15346,15577,15619,15846,16082,16150,16169,16202,16245,16265,16273,16384 }, - { 0,3059,5772,6369,6524,9041,11801,12582,12813,13361,14115,14439,14567,14714,14944,15075,15141,16384 }, - { 0,8643,10594,10813,10856,13274,14686,14920,14975,15350,15680,15771,15799,15897,16003,16042,16057,16384 }, - { 0,6720,8878,9325,9467,11564,13248,13744,13929,14384,14880,15087,15167,15311,15488,15569,15607,16384 }, -}; - -const UWord16 sym_freq_ari_pk_s17_LC_ext[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = -{ - { 16,31,106,88,28,56,143,123,83,124,114,105,65,101,94,87,15020 }, - { 7401,443,42,13,4166,653,72,15,1294,377,57,16,509,206,35,11,1074 }, - { 4362,1983,519,174,1999,2012,687,266,567,732,355,166,199,313,181,92,1777 }, - { 2955,2228,639,191,2140,2518,943,329,643,954,485,207,205,333,208,102,1304 }, - { 3155,1826,634,240,2114,1984,786,334,863,901,371,175,384,436,197,98,1886 }, - { 1216,1414,634,294,1273,1848,982,496,552,913,582,338,257,444,325,209,4607 }, - { 1759,1882,709,262,1713,2353,1054,429,629,1000,571,281,241,412,271,154,2664 }, - { 1109,1596,728,299,1494,2306,1200,531,715,1164,700,346,302,496,335,199,2864 }, - { 11524,1522,124,21,1765,752,105,24,191,134,33,9,41,37,13,5,84 }, - { 8027,2559,323,65,2317,1570,296,75,303,289,90,29,71,76,33,13,248 }, - { 834,1200,640,323,1090,1756,1048,564,575,983,675,397,291,517,384,251,4856 }, - { 6038,3048,365,68,2813,2189,392,90,326,382,137,45,62,90,46,20,273 }, - { 4732,2953,669,191,2172,2207,694,234,439,551,241,98,133,177,91,43,759 }, - { 745,1038,564,308,882,1426,901,542,457,801,584,386,257,460,357,250,6426 }, - { 3957,2837,875,329,1745,1933,822,371,444,581,292,146,166,216,121,71,1478 }, - { 2779,2609,633,180,2381,2770,908,284,573,864,427,172,171,288,174,85,1086 }, - { 448,712,465,295,656,1130,812,535,421,760,601,427,269,501,414,312,7626 }, - { 1,1,1553,691,1,1,1241,623,1337,1147,706,408,601,565,390,251,6867 }, - { 2496,2414,634,178,2327,2750,890,284,610,884,411,169,187,303,175,91,1581 }, - { 921,1301,658,308,1219,1914,1085,549,618,1043,680,383,299,524,378,238,4266 }, - { 2620,1823,574,216,1839,2141,870,358,608,905,488,234,242,392,255,140,2679 }, - { 11205,1879,94,9,1977,846,71,10,122,90,18,4,15,15,5,2,22 }, - { 358,558,372,254,513,882,657,468,337,618,507,383,229,437,368,295,9148 }, - { 3575,1518,443,199,1673,1777,693,310,539,770,436,232,245,384,225,147,3218 }, - { 1,1,638,396,1,1,632,426,600,591,445,324,361,383,306,233,11045 }, - { 969,428,121,60,1055,705,228,109,522,467,193,100,331,337,158,91,10510 }, - { 10458,1646,190,37,1915,1018,173,44,271,219,60,19,70,66,24,8,166 }, - { 7178,2566,295,54,2608,1911,349,81,318,372,137,48,61,92,47,22,245 }, - { 1298,1120,461,234,1033,1363,718,394,432,702,474,310,237,410,306,222,6670 }, - { 4957,2828,467,105,2621,2394,583,159,447,579,238,86,106,160,90,40,524 }, - { 4823,3341,406,77,2957,2565,484,110,342,449,173,58,67,108,58,27,339 }, - { 4735,2275,507,143,2326,2244,684,217,535,708,315,125,158,240,130,62,980 }, - { 3363,2518,777,283,1923,2249,902,353,521,754,376,184,191,271,158,83,1478 }, - { 2569,2427,783,289,1849,2334,958,393,527,789,403,199,176,280,179,104,2125 }, - { 209,368,271,198,332,604,483,370,237,441,380,309,172,329,291,247,11143 }, - { 2074,2263,711,226,2045,2684,1063,380,659,1007,540,233,215,364,227,119,1574 }, - { 1619,1941,728,262,1831,2574,1147,441,696,1123,620,279,255,442,276,147,2003 }, - { 89,168,184,141,152,290,301,243,148,267,239,208,115,205,191,168,13275 }, - { 2202,1361,481,220,1422,1658,756,376,530,829,496,281,252,440,295,188,4597 }, - { 1220,1581,691,292,1439,2164,1109,502,642,1071,658,342,282,493,343,206,3349 }, - { 12626,1187,90,14,1479,510,66,15,152,91,21,6,32,26,8,3,58 }, - { 1579,1612,640,268,1579,2110,973,445,636,979,567,293,277,459,305,180,3482 }, - { 597,917,550,315,858,1442,958,576,520,916,667,439,297,547,424,300,6061 }, - { 9273,2489,318,71,1887,1172,236,68,211,204,66,24,49,56,24,10,226 }, - { 9238,2443,171,20,2434,1338,157,27,185,170,48,12,23,31,15,6,66 }, - { 6791,2409,331,63,2646,1938,374,87,425,442,137,44,98,123,52,23,401 }, - { 7175,3240,490,128,2005,1583,381,121,244,284,111,44,58,74,36,18,392 }, - { 5060,2643,429,93,2709,2336,508,133,486,575,201,69,125,170,82,35,730 }, - { 3721,2590,546,135,2565,2623,715,203,573,747,300,112,154,228,121,57,994 }, - { 5971,3317,756,225,1722,1689,548,209,313,380,163,81,85,120,63,35,707 }, - { 3047,2264,596,171,2261,2511,829,267,634,862,412,170,196,314,182,94,1574 }, - { 2061,2219,713,235,1973,2534,1000,362,611,898,476,213,203,338,207,118,2223 }, - { 4738,3211,931,354,1547,1721,712,317,366,458,238,125,117,163,98,57,1231 }, - { 3237,1808,587,228,1749,2093,906,378,585,905,502,252,221,379,244,134,2176 }, - { 1833,2056,788,351,1394,1957,999,506,466,736,459,264,194,324,232,152,3673 }, - { 3989,2869,494,107,2795,2682,635,164,505,655,258,89,122,184,98,44,694 }, - { 1463,1734,712,311,1406,1983,1023,495,530,863,558,302,227,384,274,177,3942 }, - { 14233,850,25,2,959,231,14,2,36,18,3,1,3,3,1,1,2 }, - { 1,1,2608,683,1,1,1802,574,2796,1865,787,318,786,627,335,160,3039 }, - { 2010,2043,643,214,1969,2512,995,364,643,983,510,233,229,378,241,132,2285 }, - { 7586,2931,241,33,2752,1803,231,42,227,236,68,19,33,43,20,8,111 }, - { 3059,2713,597,155,2517,2760,781,231,548,754,324,128,147,230,131,66,1243 }, - { 8643,1951,219,43,2418,1412,234,55,375,330,91,28,98,106,39,15,327 }, - { 6720,2158,447,142,2097,1684,496,185,455,496,207,80,144,177,81,38,777 }, -}; - - -/*------------------------------------------------------------------------- - * ECLVQ Stereo ROM tables - *------------------------------------------------------------------------*/ - -/* table with round(ECSQ_PROB_TOTAL / index) for entropy coding, with i in {1, .., ECSQ_SEGMENT_SIZE} */ -const UWord16 ECSQ_tab_inverse[1 + ECSQ_SEGMENT_SIZE] = -{ - 0, 16384, 8192, 5461, 4096, 3277, 2731, 2341, 2048 -}; - - -const Word16 tdm_bit_allc_tbl[5][6] = -{ - /* IC -- UC -- GC -- TM --AC */ - { 1650, 3500, 0, 4400, 0, 5000 }, /* IVAS_13k2 */ - { 1650, 3500, 0, 5000, 0, 5000 }, /* IVAS_16k4 */ - { 1650, 3500, 0, 6000, 0, 5000 }, /* IVAS_24k4 */ - { 1650, 6050, 0, 10000, 0, 10000 }, /* IVAS_32k */ - { 1650, 6050, 0, 13000, 0, 14000 } /* IVAS_48k */ -}; - - -const Word16 fast_FCB_bits_2sfr[] = {8, 14, 18, 20, 24, 128/*stop value*/}; - -const Word16 fast_FCB_rates_2sfr[] = {/*16*50,*/ (8+14)*50, 28*50, 32*50, 34*50, 36*50, 38*50, 40*50, 42*50, 44*50, 48*50}; - - -/*----------------------------------------------------------------------------------* - * MDCT Stereo ROM tables - *----------------------------------------------------------------------------------*/ - - /* PsychLPC */ - -const SpectrumWarping sw32000Hz[] = -{{ - { - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, - 6, 8, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 14, 14, - 14, 16, 18, 18, 18, 20, 22, 22, 22, 24, 26, 26, 26, 28, 30, 32 - }, - { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, - 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10 - }, -}}; - -const SpectrumWarping sw25600Hz[] = -{{ - { - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, - 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 10, 12, 12, 12, 12, - 12, 12, 14, 14, 14, 14, 14, 16, 16, 18, 18, 18, 18, 18, 20, 20 - }, - { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7 - }, -}}; - -const SpectrumWarping sw16000Hz[] = -{{ - { - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 - }, - { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 - }, -}}; - -const MDCTStereoBands_config mdctStereoBands_32000_640[] = -{{ - /*TCX 20*/ - { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, - 12, 20, 20, 20, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 42, - 64, 64, 96, 160}, - {44, 41,38, 29},/*number of bands for frame lengths 960, 640, 512, 320 respectively*/ - - /*TCX 10*/ - { - 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 20, 32, 32, - 32, 48, 80 - }, - {33, 29, 26, 18}/*number of bands for frame lengths 480, 320, 256, 160 respectively*/ -}}; - - -const Word16 dft_cng_coh_u2i[9] = { 4, 5, 3, 6, 2, 7, 1, 8, 0 }; /* Coherence unary codeword -> residual codeword conversion table */ - -const Word16 dft_cng_coh_i2u[9] = { 8, 6, 4, 2, 0, 1, 3, 5, 7 }; /* Coherence residual codeword -> unary codeword conversion table */ - -const Word16 dft_cng_coh_alpha_start[STEREO_DFT_N_COH_ALPHA_STEPS - 1] = { 15, 16, 17, 18 }; - - -const Word16 DirAC_band_grouping_12[12 + 1] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 11, 17, 25, 40, 60 -}; - - -const Word16 DirAC_band_grouping_6[6 + 1] = -{ - 0, 1, 4, 8, 20, 30, 60 -}; - -const Word16 DirAC_band_grouping_5[5 + 1] = -{ - 0, 1, 3, 7, 15, 60 -}; - -const Word16 DirAC_block_grouping[MAX_PARAM_SPATIAL_SUBFRAMES + 1] = -{ - 0, 4, 8, 12, 16 -}; - -const Word16 DirAC_block_grouping_5ms_MDFT[MAX_PARAM_SPATIAL_SUBFRAMES + 1] = -{ - 0, 1, 2, 3, 4 -}; - -const Word32 c_weights_fx[DIRAC_NO_FB_BANDS_MAX] /* Q30 */ = { 106970960, 1033798336, 1065867776, 1071704704, 1073381888, 1073741824, 1073494016, 1072883072, 1072012032, 1070930560, 1069665600, 1068232640, 1066641792, 1064899968, 1063012224, 1060982464, 1058814144, 1056510016, 1054072832, 1051505280, 1048809664, 1045988480, 1043044160, 1039979072, 1036795776, 1033496576, 1030084096, 1026560960, 1022929600, 1019192512, 1015352576, 1011412416, 1007374720, 1003242112, 999017472, 994703488, 990302976, 985818688, 981253568, 976610304, 971891712, 967100672, 962240064, 957312576, 952321088, 947268224, 942156992, 936990080, 931770048, 926499840, 921182016, 915819200, 910414208, 904969344, 899487488, 893970944, 888422272, 882843840, 877238144, 871607552, 865954432, 860280896, 854589184, 848881728, 843160384, 837427328, 831684672, 825934208, 820178240, 814418240, 808656320, 802894208, 797133568, 791376192, 785623744, 779877568, 774139520, 768410880, 762693184, 756987904, 751296064, 745619328, 739958784, 734315584, 728691008, 723086208, 717502016, 711939712, 706400064, 700884096, 695392768, 689926912, 684487232, 679074688, 673689856, 668333504, 663006464, 657709056, 652442176, 647206144, 642001600, 636828992, 631688896, 626581696, 621507776, 616467520, 611461184, 606489344, 601552064, 596649792, 591782528, 586950784, 582154560, 577394112, 572669696, 567981312, 563329088, 558713152, 554133568, 549590464, 545083840, 540613760, 536180160, 531783104, 527422528, 523098464, 518810784, 514559520, 510344672, 506165856, 502023360, 497916832, 493846304, 489811488, 485812448, 481848832, 477920672, 474027808, 470169952, 466347008, 462558848, 458805152, 455085920, 451400736, 447749600, 444132160, 440548320, 436997792, 433480416, 429995904, 426544032, 423124608, 419737376, 416382144, 413058720, 409766720, 406505984, 403276288, 400077280, 396908768, 393770656, 390662496, 387584064, 384535200, 381515616, 378525024, 375563200, 372629952, 369724864, 366847872, 363998592, 361176672, 358382176, 355614592, 352873760, 350159456, 347471328, 344809216, 342172864, 339562048, 336976384, 334415808, 331879840, 329368576, 326881472, 324418432, 321979104, 319563392, 317170976, 314801664, 312455232, 310131328, 307829856, 305550528, 303293088, 301057440, 298843168, 296650176, 294478304, 292327168, 290196672, 288086432, 285996512, 283926432, 281876224, 279845472, 277834016, 275841792, 273868480, 271913856, 269977792, 268059968, 266160304, 264278672, 262414768, 260568368, 258739360, 256927520, 255132768, 253354752, 251593392, 249848448, 248119936, 246407424, 244710816, 243030080, 241364928, 239715120, 238080672, 236461248, 234856752, 233267088, 231692016, 230131440, 228585136, 227053024, 225534848, 224030544, 222539872, 221062832 }; - -/*----------------------------------------------------------------------* -* SPAR ROM tables -*-----------------------------------------------------------------------*/ - -const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = -{ -/* When AGC is ON additional (AGC_BITS_PER_CH+1) bits may be taken from each core-coder channel - so minimum core-coder bitrate per channel can be min core-coder bitrates as per the table - AGC_BITS_PER_CH */ - { 13200, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 10000, 8150, 13150 } }, - { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, - - { 16400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 13200, 11350, 16350 } }, - { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, - - { 24400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 16400, 14850, 24350 } }, - { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, - - { 32000, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 24000, 20450, 31950 } }, - { { 21, 1, 5, 1 },{ 15, 1, 5, 1 },{ 15, 1, 3, 1 } }, 0, 0, 0 }, - - { 48000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 24000, 21000, 31950 },{ 16000, 15000, 20400 } }, - { { 15, 7, 5, 1 },{ 15, 7, 3, 1 },{ 7, 7, 3, 1 } }, 1, 0, 0 }, - - { 64000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 38000, 34050, 56000 },{ 16000, 15600, 20400 } },{ { 21, 7, 5, 1 },{ 15, 7, 5, 1 },{ 15, 7, 3, 1 } }, 1, 1, 0 }, - - { 80000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 46000, 43000, 56000 },{ 24000, 23000, 31950 } }, - { { 21, 7, 5, 1 },{ 15, 7, 5, 1 },{ 15, 7, 3, 1 } }, 1, 0, 0 }, - - { 96000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 47000, 42600, 56000 },{ 23000, 22600, 31950 },{ 16000, 15600, 20400 } }, - { { 21, 9, 9, 1 },{ 21, 7, 5, 1 },{ 21, 7, 5, 1 } }, 1, 0, 0 }, - - { 128000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 55000, 50000, 56000 },{ 36000, 36000, 56000 },{ 27000, 27000, 31950 } }, - { { 21, 11, 9, 1 },{ 21, 9, 7, 1 },{ 21, 7, 7, 1 } }, 1, 0, 0 }, - - { 160000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 74000, 70900, 112000 },{ 41000, 40050, 56000 },{ 35000, 34050, 56000 } }, - { { 21, 11, 11, 1 },{ 21, 9, 9, 1 },{ 21, 7, 7, 1 } }, 1, 0, 0 }, - - { 192000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 90000, 87900, 112000 },{ 50000, 48050, 56000 },{ 42000, 41050, 56000 } }, - { { 21, 11, 11, 1 },{ 21, 9, 9, 1 },{ 21, 7, 7, 1 } }, 1, 0, 0 }, - - { 256000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 90000, 85000, 112000 },{ 70000, 69000, 112000 },{ 50000, 48950, 56000 },{ 36400, 35600, 56000 } }, - { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, - - { 256000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 84650, 83000, 112000 },{ 65850, 64550, 56000 },{ 47000, 46100, 48000 },{ 28200, 27650, 40000 } }, - { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, - - { 256000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 76300, 73550, 112000 },{ 59350, 57200, 56000 },{ 42400, 40850, 48000 },{ 25450, 24500, 40000 } }, - { { 31, 11, 11, 1 },{ 1, 1, 1, 1 }, { 1, 1, 1, 1 } }, 1, 2, 0 }, - - { 384000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 100000, 100000, 128000 },{ 79850, 79850, 104000 },{ 66600, 66600, 104000 } }, - { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, - - { 384000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 105350, 103300, 112000 },{ 75200, 73750, 96000 },{ 45100, 44250, 48000 } }, - { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, - - { 384000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 124300, 121550, 128000 },{ 96700, 94550, 112000 },{ 69050, 67500, 96000 },{ 41450, 40500, 48000 } }, - { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, - - { 512000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 }, {118450, 118450, 128000 } }, - { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, - - { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 124000, 124000, 128000 },{ 124000, 124000, 128000 },{ 125200, 118450, 128000 },{ 76300, 73000, 128000 } }, - { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, - - { 512000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 118000, 118000, 128000 },{ 118000, 118000, 128000 },{ 117200, 109250, 128000 },{ 72300, 69000, 128000 } }, - { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, -}; - -const ivas_spar_br_table_t ivas_spar_br_table_consts_fx[IVAS_SPAR_BR_TABLE_LEN] = /*ceilf(log2f)*/ -{ - /* When AGC is ON additional (AGC_BITS_PER_CH+1) bits may be taken from each core-coder channel - so minimum core-coder bitrate per channel can be min core-coder bitrates as per the table - AGC_BITS_PER_CH */ - { 13200, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 10000, 8150, 13150 } }, - { { 4, 0, 3, 0 },{ 4, 0, 2, 0 },{ 3, 0, 2, 0 } }, 0, 0, 0 }, - - { 16400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 13200, 11350, 16350 } }, - { { 4, 0, 3, 0 },{ 4, 0, 2, 0 },{ 3, 0, 2, 0 } }, 0, 0, 0 }, - - { 24400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 16400, 14850, 24350 } }, - { { 4, 0, 3, 0 },{ 4, 0, 2, 0 },{ 3, 0, 2, 0 } }, 0, 0, 0 }, - - { 32000, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 24000, 20450, 31950 } }, - { { 5, 0, 3, 0 },{ 4, 0, 3, 0 },{ 4, 0, 2, 0 } }, 0, 0, 0 }, - - { 48000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 24000, 21000, 31950 },{ 16000, 15000, 20400 } }, - { { 4, 3, 3, 0 },{ 4, 3, 2, 0 },{ 3, 3, 2, 0 } }, 1, 0, 0 }, - - { 64000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 38000, 34050, 56000 },{ 16000, 15600, 20400 } },{ { 5, 3, 3, 0 },{ 4, 3, 3, 0 },{ 4, 3, 2, 0 } }, 1, 1, 0 }, - - { 80000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 46000, 43000, 56000 },{ 24000, 23000, 31950 } }, - { { 5, 3, 3, 0 },{ 4, 3, 3, 0 },{ 4, 3, 2, 0 } }, 1, 0, 0 }, - - { 96000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 47000, 42600, 56000 },{ 23000, 22600, 31950 },{ 16000, 15600, 20400 } }, - { { 5, 4, 4, 0 },{ 5, 3, 3, 0 },{ 5, 3, 3, 0 } }, 1, 0, 0 }, - - { 128000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 55000, 50000, 56000 },{ 36000, 36000, 56000 },{ 27000, 27000, 31950 } }, - { { 5, 4, 4, 0 },{ 5, 4, 3, 0 },{ 5, 3, 3, 0 } }, 1, 0, 0 }, - - { 160000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 74000, 70900, 112000 },{ 41000, 40050, 56000 },{ 35000, 34050, 56000 } }, - { { 5, 4, 4, 0 },{ 5, 4, 4, 0 },{ 5, 3, 3, 0 } }, 1, 0, 0 }, - - { 192000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 90000, 87900, 112000 },{ 50000, 48050, 56000 },{ 42000, 41050, 56000 } }, - { { 5, 4, 4, 0 },{ 5, 4, 4, 0 },{ 5, 3, 3, 0 } }, 1, 0, 0 }, - - { 256000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 90000, 85000, 112000 },{ 70000, 69000, 112000 },{ 50000, 48950, 56000 },{ 36400, 35600, 56000 } }, - { { 5, 0, 0, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, - - { 256000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 84650, 83000, 112000 },{ 65850, 64550, 56000 },{ 47000, 46100, 48000 },{ 28200, 27650, 40000 } }, - { { 5, 4, 4, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, - - { 256000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 76300, 73550, 112000 },{ 59350, 57200, 56000 },{ 42400, 40850, 48000 },{ 25450, 24500, 40000 } }, - { { 5, 4, 4, 0 },{ 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, 1, 2, 0 }, - - { 384000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 100000, 100000, 128000 },{ 79850, 79850, 104000 },{ 66600, 66600, 104000 } }, - { { 5, 0, 0, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, - - { 384000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 105350, 103300, 112000 },{ 75200, 73750, 96000 },{ 45100, 44250, 48000 } }, - { { 5, 4, 4, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, - - { 384000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 124300, 121550, 128000 },{ 96700, 94550, 112000 },{ 69050, 67500, 96000 },{ 41450, 40500, 48000 } }, - { { 5, 4, 4, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, - - { 512000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 }, {118450, 118450, 128000 } }, - { { 5, 0, 0, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, - - { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 124000, 124000, 128000 },{ 124000, 124000, 128000 },{ 125200, 118450, 128000 },{ 76300, 73000, 128000 } }, - { { 5, 4, 4, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, - - { 512000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 118000, 118000, 128000 },{ 118000, 118000, 128000 },{ 117200, 109250, 128000 },{ 72300, 69000, 128000 } }, - { { 5, 4, 4, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, -}; -const ivas_freq_models_t ivas_arith_pred_r_consts[TOTAL_PRED_QUANT_STRATS_ARITH] = -{ - /* entry for 1 quantization points */ - { - /* pred_R real */ - { - { 0,16384, }, - { 0,16384, }, - { 0,16384, }, - { 0,16384, }, - }, - /* pred_R real differential */ - { - { 0,16384, }, - { 0,16384, }, - { 0,16384, }, - { 0,16384, }, - }, - /* pred_R real : values for general and differential */ - { 0 },{ 0 }, - /* pred_R real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 7 quantization points for br_table_idx >= 2 */ - { - /* pred_R real */ - { - { 0,546,1092,2184,8740,2184,1092,546, }, - { 0,1779,2116,2516,3562,2516,2116,1779, }, - { 0,1848,2614,5229,2614,1848,1307,924, }, - { 0,924,1307,1848,2614,5229,2614,1848, }, - }, - /* pred_R real differential */ - { - { 0,125,399,1269,12798,1269,399,125, }, - { 0,744,1327,2365,7512,2365,1327,744, }, - { 0,1354,2413,7664,2413,1354,760,426, }, - { 0,426,760,1354,2413,7664,2413,1354, }, - }, - /* pred_R real : values for general and differential */ - { -3,-2,-1,0,1,2,3 },{ -3,-2,-1,0,1,2,3 }, - /* pred_R real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 15 quantization points for br_table_idx >= 2 */ - { - /* pred_R real */ - { - { 0,32,64,128,257,514,1028,2056,8226,2056,1028,514,257,128,64,32, }, - { 0,565,672,799,950,1130,1344,1598,2268,1598,1344,1130,950,799,672,565, }, - { 0,353,500,707,1000,1414,2000,4010,2000,1414,1000,707,500,353,250,176, }, - { 0,176,250,353,500,707,1000,1414,2000,4010,2000,1414,1000,707,500,353, }, - }, - /* pred_R real differential */ - { - { 0,1,3,12,39,125,397,1260,12710,1260,397,125,39,12,3,1, }, - { 0,66,119,212,378,674,1201,2140,6804,2140,1201,674,378,212,119,66, }, - { 0,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119,67,37, }, - { 0,37,67,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119, }, - }, - /* pred_R real : values for general and differential */ - { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, - { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, - /* pred_R real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 21 quantization points for br_table_idx >= 2 */ - { - /* pred_R real */ - { - { 0,4,8,16,32,64,128,256,512,1024,2049,8198,2049,1024,512,256,128,64,32,16,8,4, }, - { 0,292,348,414,492,585,696,828,984,1171,1392,1980,1392,1171,984,828,696,585,492,414,348,292, }, - { 0,119,168,238,336,476,673,952,1346,1904,3817,1904,1346,952,673,476,336,238,168,119,84,59, }, - { 0,59,84,119,168,238,336,476,673,952,1346,1904,3817,1904,1346,952,673,476,336,238,168,119, }, - }, - /* pred_R real differential */ - { - { 0,1,1,1,1,3,12,39,125,397,1260,12704,1260,397,125,39,12,3,1,1,1,1, }, - { 0,11,20,37,66,118,210,375,668,1191,2122,6748,2122,1191,668,375,210,118,66,37,20,11, }, - { 0,20,37,66,118,210,375,668,1191,2123,6751,2123,1191,668,375,210,118,66,37,20,11,6, }, - { 0,6,11,20,37,66,118,210,375,668,1191,2123,6751,2123,1191,668,375,210,118,66,37,20, }, - }, - /* pred_R real : values for general and differential */ - { -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 }, - { -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 }, - /* pred_R real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 31 quantization points */ - { - /* pred real */ - { - { 0,1,1,1,1,2,4,8,16,32,64,128,256,512,1024,2048,8188,2048,1024,512,256,128,64,32,16,8,4,2,1,1,1,1, }, - { 0,110,131,156,186,221,263,313,373,443,527,627,746,887,1055,1255,1798,1255,1055,887,746,627,527,443,373,313,263,221,186,156,131,110, }, - { 0,20,29,41,58,82,116,164,233,329,466,659,932,1318,1864,3738,1864,1318,932,659,466,329,233,164,116,82,58,41,29,20,14,10, }, - { 0,10,14,20,29,41,58,82,116,164,233,329,466,659,932,1318,1864,3738,1864,1318,932,659,466,329,233,164,116,82,58,41,29,20, } - }, - /* pred real differential */ - { - { 0,1,1,1,1,1,1,1,1,1,3,12,39,125,397,1260,12694,1260,397,125,39,12,3,1,1,1,1,1,1,1,1,1, }, - { 0,1,1,2,3,6,11,20,37,66,117,210,374,667,1189,2118,6740,2118,1189,667,374,210,117,66,37,20,11,6,3,2,1,1, }, - { 0,1,2,3,6,11,20,37,66,117,210,374,667,1189,2118,6740,2118,1189,667,374,210,117,66,37,20,11,6,3,2,1,1,1, }, - { 0,1,1,1,2,3,6,11,20,37,66,117,210,374,667,1189,2118,6740,2118,1189,667,374,210,117,66,37,20,11,6,3,2,1, } - }, - /* pred real : values for general and differential */ - { -15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, - { -15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, - /* pred real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 7 quantization points for br_table_idx < 2 */ - { - /* pred_R real */ - { - { 0,327,778,1851,10472,1851,778,327, }, - { 0,1057,1630,2514,5982,2514,1630,1057, }, - { 0,1668,2572,6122,2572,1668,1081,701, }, - { 0,701,1081,1668,2572,6122,2572,1668, }, - }, - /* pred_R real differential */ - { - { 0,125,399,1269,12798,1269,399,125, }, - { 0,744,1327,2365,7512,2365,1327,744, }, - { 0,1354,2413,7664,2413,1354,760,426, }, - { 0,426,760,1354,2413,7664,2413,1354, }, - }, - /* pred_R real : values for general and differential */ - { -3,-2,-1,0,1,2,3 },{ -3,-2,-1,0,1,2,3 }, - /* pred_R real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 15 quantization points for br_table_idx < 2 */ - { - /* pred real */ - { - { 0,9,23,56,133,318,757,1800,10192,1800,757,318,133,56,23,9, }, - { 0,156,240,371,573,883,1363,2102,5008,2102,1363,883,573,371,240,156, }, - { 0,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241,156,101, }, - { 0,101,156,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241, } - }, - /* pred real differential */ - { - { 0,1,3,12,39,125,397,1260,12710,1260,397,125,39,12,3,1, }, - { 0,66,119,212,378,674,1201,2140,6804,2140,1201,674,378,212,119,66, }, - { 0,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119,67,37, }, - { 0,37,67,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119, } - }, - /* pred real : values for general and differential */ - {-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7}, - { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, - /* pred real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 21 quantization points for br_table_idx < 2 */ - { - /* pred_R real */ - { - { 0,1,1,4,9,23,56,133,318,756,1799,10184,1799,756,318,133,56,23,9,4,1,1, }, - { 0,41,64,98,152,234,362,558,861,1329,2049,4888,2049,1329,861,558,362,234,152,98,64,41, }, - { 0,64,98,152,235,362,559,862,1330,2051,4891,2051,1330,862,559,362,235,152,98,64,41,26, }, - { 0,26,41,64,98,152,235,362,559,862,1330,2051,4891,2051,1330,862,559,362,235,152,98,64, }, - }, - /* pred_R real differential */ - { - { 0,1,1,1,1,3,12,39,125,397,1260,12704,1260,397,125,39,12,3,1,1,1,1, }, - { 0,11,20,37,66,118,210,375,668,1191,2122,6748,2122,1191,668,375,210,118,66,37,20,11, }, - { 0,20,37,66,118,210,375,668,1191,2123,6751,2123,1191,668,375,210,118,66,37,20,11,6, }, - { 0,6,11,20,37,66,118,210,375,668,1191,2123,6751,2123,1191,668,375,210,118,66,37,20, }, - }, - /* pred_R real : values for general and differential */ - { -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 }, - { -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 }, - /* pred_R real : num dyn models for general and differential */ - 4, 4 - } -}; - -const ivas_freq_models_t ivas_arith_drct_r_consts[TOTAL_DRCT_QUANT_STRATS] = -{ - /* entry for 1 quantization points */ - { - /* drct real */ - { - { 0,16384, }, - { 0,16384, }, - { 0,16384, }, - { 0,16384, }, - }, - /* drct real differential */ - { - { 0,16384, }, - { 0,16384, }, - { 0,16384, }, - { 0,16384, }, - }, - /* drct real : values for general and differential */ - {0},{ 0 }, - /* drct real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 7 quantization points */ - { /* drct real */ - { - { 0,125,399,1269,12798,1269,399,125, }, - { 0,744,1327,2365,7512,2365,1327,744, }, - { 0,988,1244,1568,1976,2489,3136,4983, }, - { 0,2111,2262,2425,2788,2425,2262,2111, }, - }, - /* drct real differential */ - { - { 0,125,399,1269,12798,1269,399,125, }, - { 0,744,1327,2365,7512,2365,1327,744, }, - { 0,1354,2413,7664,2413,1354,760,426, }, - { 0,426,760,1354,2413,7664,2413,1354, }, - }, - /* drct real : values for general and differential */ - { -3,-2,-1,0,1,2,3 },{ -3,-2,-1,0,1,2,3 }, - /* drct real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 9 quantization points */ - { - /* drct real */ - { - { 0,39,125,397,1263,12736,1263,397,125,39, }, - { 0,397,708,1262,2250,7150,2250,1262,708,397, }, - { 0,573,722,909,1146,1444,1819,2292,2888,4591, }, - { 0,1587,1701,1824,1955,2250,1955,1824,1701,1587, }, - }, - /* drct real differential */ - { - { 0,39,125,397,1263,12736,1263,397,125,39, }, - { 0,397,708,1262,2250,7150,2250,1262,708,397, }, - { 0,716,1276,2274,7225,2274,1276,716,402,225, }, - { 0,225,402,716,1276,2274,7225,2274,1276,716, } - }, - /* drct real : values for general and differential */ - { -4,-3,-2,-1,0,1,2,3,4 },{ -4,-3,-2,-1,0,1,2,3,4 }, - /* drct real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 11 quantization points */ - { - /* drct real */ - { - { 0,12,39,125,397,1261,12716,1261,397,125,39,12, }, - { 0,217,387,689,1229,2190,6960,2190,1229,689,387,217, }, - { 0,343,433,546,687,866,1092,1375,1733,2184,2751,4374, }, - { 0,1254,1344,1441,1544,1655,1908,1655,1544,1441,1344,1254, }, - }, - /* drct real differential */ - { - { 0,12,39,125,397,1261,12716,1261,397,125,39,12, }, - { 0,217,387,689,1229,2190,6960,2190,1229,689,387,217, }, - { 0,389,694,1236,2203,7000,2203,1236,694,389,218,122, }, - { 0,122,218,389,694,1236,2203,7000,2203,1236,694,389, }, - }, - /* drct real : values for general and differential */ - { -5,-4,-3,-2,-1,0,1,2,3,4,5 },{ -5,-4,-3,-2,-1,0,1,2,3,4,5 }, - /* drct real : num dyn models for general and differential */ - 4, 4 - } -}; - -const ivas_freq_models_t ivas_arith_decd_r_consts[TOTAL_DECD_QUANT_STRATS] = -{ - /* entry for 1 quantization points */ - { - /* decd real */ - { - { 0,16384, }, - { 0,16384, }, - { 0,16384, }, - { 0,16384, }, - }, - /* decd real differential */ - { - { 0,16384, }, - { 0,16384, }, - { 0,16384, }, - { 0,16384, }, - }, - /* decd real : values for general and differential */ - { 0 },{ 0 }, - /* decd real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 3 quantization points */ - { - /* decd real */ - { - { 0,11917,2978,1489, }, - { 0,8840,4419,3125, }, - { 0,4567,7250,4567, }, - { 0,5203,5978,5203, }, - }, - /* decd real differential */ - { - { 0,1356,13672,1356, }, - { 0,3166,10052,3166, }, - { 0,10984,3459,1941, }, - { 0,1941,3459,10984, }, - }, - /* decd real : values for general and differential */ - { 0,1,2 },{-1,0,1}, - /* decd real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 5 quantization points */ - { - /* decd real */ - { - { 0,11157,2788,1394,697,348, }, - { 0,7186,3592,2540,1796,1270, }, - { 0,2512,3166,5028,3166,2512, }, - { 0,3048,3267,3754,3267,3048, }, - }, - /* decd real differential */ - { - { 0,406,1289,12994,1289,406, }, - { 0,1460,2601,8262,2601,1460, }, - { 0,2707,8599,2707,1519,852, }, - { 0,852,1519,2707,8599,2707, }, - }, - /* decd real : values for general and differential */ - { 0,1,2,3,4 },{ -2,-1,0,1,2 }, - /* decd real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 7 quantization points */ - { - /* decd real */ - { - { 0,10983,2744,1372,686,343,171,85, }, - { 0,6573,3285,2322,1642,1161,821,580, }, - { 0,1603,2020,2546,4046,2546,2020,1603, }, - { 0,2111,2262,2425,2788,2425,2262,2111, }, - }, - /* decd real differential */ - { - { 0,125,399,1269,12798,1269,399,125, }, - { 0,744,1327,2365,7512,2365,1327,744, }, - { 0,1354,2413,7664,2413,1354,760,426, }, - { 0,426,760,1354,2413,7664,2413,1354, } - }, - /* decd real : values for general and differential */ - { 0,1,2,3,4,5,6 },{ -3,-2,-1,0,1,2,3 }, - /* decd real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 9 quantization points */ - { /* decd real */ - { - { 0,10941,2734,1367,683,341,170,85,42,21, }, - { 0,6305,3150,2227,1575,1113,787,556,393,278, }, - { 0,1101,1388,1749,2203,3502,2203,1749,1388,1101, }, - { 0,1587,1701,1824,1955,2250,1955,1824,1701,1587, }, - }, - /* decd real differential */ - { - { 0,39,125,397,1263,12736,1263,397,125,39, }, - { 0,397,708,1262,2250,7150,2250,1262,708,397, }, - { 0,716,1276,2274,7225,2274,1276,716,402,225, }, - { 0,225,402,716,1276,2274,7225,2274,1276,716, } - }, - /* decd real : values for general and differential */ - { 0,1,2,3,4,5,6,7,8 },{ -4,-3,-2,-1,0,1,2,3,4 }, - /* decd real : num dyn models for general and differential */ - 4, 4 - }, - /* entry for 11 quantization points */ - { - /* decd real */ - { - { 0,10932,2731,1365,682,341,170,85,42,21,10,5, }, - { 0,6181,3086,2182,1543,1091,771,545,385,272,192,136, }, - { 0,790,995,1254,1580,1991,3164,1991,1580,1254,995,790, }, - { 0,1254,1344,1441,1544,1655,1908,1655,1544,1441,1344,1254, }, - }, - /* decd real differential */ - { - { 0,12,39,125,397,1261,12716,1261,397,125,39,12, }, - { 0,217,387,689,1229,2190,6960,2190,1229,689,387,217, }, - { 0,389,694,1236,2203,7000,2203,1236,694,389,218,122, }, - { 0,122,218,389,694,1236,2203,7000,2203,1236,694,389, }, - }, - /* decd real : values for general and differential */ - { 0,1,2,3,4,5,6,7,8,9,10 },{ -5,-4,-3,-2,-1,0,1,2,3,4,5 }, - /* decd real : num dyn models for general and differential */ - 4, 4 - } -}; - -const ivas_huff_models_t ivas_huff_pred_r_consts[TOTAL_PRED_QUANT_STRATS_HUFF] = -{ - /* entry for 1 quantization points for br_table_idx */ - {{{ 0 }}, {{ 0 }}}, - /* entry for 7 quantization points for br_table_idx */ - { - /* pred_R codebook */ - { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 }, }, - /* pred_R differential codebook */ - { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 }, }, - }, - /* entry for 15 quantization points for br_table_idx */ - { - /* pred_r codebook */ - { { -7,4,2 },{ -6,4,3 },{ -5, 4, 4 },{ -4, 4, 5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 }, - { 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 } }, - /* pred_r differential codebook */ - { { -7,4,2 },{ -6,4,3 },{ -5, 4, 4 },{ -4, 4, 5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 }, - { 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 } }, - }, - /* entry for 21 quantization points for br_table_idx=0 */ - { - /* pred_r codebook */ - { {-10,5,22},{-9,5,23},{-8,5,24},{-7,5,25},{-6,5,26}, { -5, 4, 0 },{ -4, 4, 1 },{ -3,4,2 },{ -2,4,3 },{ -1,4,4 }, - { 0,4,5 },{ 1,4,6 },{ 2,4,7 },{ 3,4,8 },{ 4,4,9 },{ 5,4,10 },{6,5,27},{7,5,28},{8,5,29},{9,5,30},{10,5,31} }, - /* pred_r differential codebook */ - { { -10,5,22 },{ -9,5,23 },{ -8,5,24 },{ -7,5,25 },{ -6,5,26 },{ -5, 4, 0 },{ -4, 4, 1 },{ -3,4,2 },{ -2,4,3 },{ -1,4,4 }, - { 0,4,5 },{ 1,4,6 },{ 2,4,7 },{ 3,4,8 },{ 4,4,9 },{ 5,4,10 },{ 6,5,27 },{ 7,5,28 },{ 8,5,29 },{ 9,5,30 },{ 10,5,31 } }, - }, - - /* entry for 31 quantization points for br_table_idx>0 */ - { - /* pred_r codebook */ - { {-15,5,2},{-14,5,3},{-13,5,4},{-12,5,5},{-11,5,6}, { -10,5,7 },{ -9,5,8 },{ -8,5,9 }, - { -7,5,10 },{ -6,5,11 },{ -5, 5, 12 },{ -4, 5, 13 },{ -3,5,14 },{ -2,5,15 },{ -1,5,16 }, - { 0,4,0 },{ 1,5,17 },{ 2,5,18 },{ 3,5,19 },{ 4,5,20 },{ 5,5,21 },{ 6,5,22 },{ 7,5,23 }, - { 8,5,24 },{ 9,5,25 },{ 10,5,26 },{11,5,27},{12,5,28},{13,5,29},{14,5,30},{15,5,31} }, - /* pred_r differential codebook */ - { { -15,5,2 },{ -14,5,3 },{ -13,5,4 },{ -12,5,5 },{ -11,5,6 },{ -10,5,7 },{ -9,5,8 },{ -8,5,9 }, - { -7,5,10 },{ -6,5,11 },{ -5, 5, 12 },{ -4, 5, 13 },{ -3,5,14 },{ -2,5,15 },{ -1,5,16 }, - { 0,4,0 },{ 1,5,17 },{ 2,5,18 },{ 3,5,19 },{ 4,5,20 },{ 5,5,21 },{ 6,5,22 },{ 7,5,23 }, - { 8,5,24 },{ 9,5,25 },{ 10,5,26 },{ 11,5,27 },{ 12,5,28 },{ 13,5,29 },{ 14,5,30 },{ 15,5,31 } }, - }, - }; - - const ivas_huff_models_t ivas_huff_drct_r_consts[TOTAL_DRCT_QUANT_STRATS] = -{ - /* entry for 1 quantization points */ - {{{ 0 }}, {{ 0 }}}, - /* entry for 7 quantization points */ - { - /* drct_r codebook */ - { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 } }, - /* drct_r differential codebook */ - { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 } }, - }, - /* entry for 9 quantization points */ - { - /* drct_r codebook */ - { { -4, 4, 14 },{ -3,3,0 },{ -2,3,1 },{ -1,3,2 },{ 0,3,3 },{ 1,3,4 },{ 2,3,5 },{ 3,3,6 },{ 4,4,15 } }, - /* drct_r differential codebook */ - { { -4, 4, 14 },{ -3,3,0 },{ -2,3,1 },{ -1,3,2 },{ 0,3,3 },{ 1,3,4 },{ 2,3,5 },{ 3,3,6 },{ 4,4,15 } }, - }, - /* entry for 11 quantization points */ - { - /* drct_r codebook */ - { { -5, 4, 10 },{ -4, 4, 11 },{ -3,4,12 },{ -2,3,0 },{ -1,3,1 },{ 0,3,2 },{ 1,3,3 },{ 2,3,4 },{ 3,4,13 },{ 4,4,14 },{ 5,4,15 } }, - /* drct_r differential codebook */ - { { -5, 4, 10 },{ -4, 4, 11 },{ -3,4,12 },{ -2,3,0 },{ -1,3,1 },{ 0,3,2 },{ 1,3,3 },{ 2,3,4 },{ 3,4,13 },{ 4,4,14 },{ 5,4,15 } }, - }, -}; - -const ivas_huff_models_t ivas_huff_decd_r_consts[TOTAL_DECD_QUANT_STRATS] = -{ - /* entry for 1 quantization points */ - {{{ 0 }}, {{ 0 }}}, - /* entry for 3 quantization points */ - { - /* decd_r codebook */ - { { 0, 2, 2 },{ 1, 1, 0 },{ 2,2,3 } }, - /* decd_r differential codebook */ - { { -1, 2, 2 },{ 0, 1, 0 },{ 1,2,3 } }, - }, - /* entry for 5 quantization points */ - { - /* decd_r codebook */ - { { 0,3,6 },{ 1,2,0 },{ 2,2,1 },{ 3,2,2 },{ 4,3,7 } }, - /* decd_r differential codebook */ - { { -2,3,6 },{ -1,2,0 },{ 0,2,1 },{ 1,2,2 },{ 2,3,7 } }, - }, - /* entry for 7 quantization points */ - { - /* decd_r */ - { { 0, 3, 2 },{ 1, 3, 3 },{ 2,3,4 },{ 3,3,0 },{ 4,3,5 },{ 5,3,6 },{ 6,3,7 } }, - /* decd_r codebook differential codebook */ - { { -3, 3, 2 },{ -2, 3, 3 },{ -1,3,4 },{ 0,3,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 } }, - }, - /* entry for 9 quantization points */ - { - /* decd_r codebook */ - { { 0, 4, 14 },{ 1,3,0 },{ 2,3,1 },{ 3,3,2 },{ 4,3,3 },{ 5,3,4 },{ 6,3,5 },{ 7,3,6 },{ 8,4,15 } }, - /* decd_r differential codebook */ - { { -4, 4, 14 },{ -3,3,0 },{ -2,3,1 },{ -1,3,2 },{ 0,3,3 },{ 1,3,4 },{ 2,3,5 },{ 3,3,6 },{ 4,4,15 } }, - }, - /* entry for 11 quantization points */ - { - /* decd_r codebook */ - { { 0, 4, 10 },{ 1, 4, 11 },{ 2,4,12 },{ 3,3,0 },{ 4,3,1 },{ 5,3,2 },{ 6,3,3 },{ 7,3,4 },{ 8,4,13 },{ 9,4,14 },{ 10,4,15 } }, - /* decd_r differential codebook */ - { { -5, 4, 10 },{ -4, 4, 11 },{ -3,4,12 },{ -2,3,0 },{ -1,3,1 },{ 0,3,2 },{ 1,3,3 },{ 2,3,4 },{ 3,4,13 },{ 4,4,14 },{ 5,4,15 } }, - }, -}; - -/* DTX quantization and bitstream constants */ - -const Word16 dtx_pd_real_q_levels[3][3] = { { 7,7,7 },{ 7,7,0 },{ 3,0,0 } }; -const Word16 dtx_pr_real_q_levels[3][3] = { { 9,9,9 },{ 9,7,9 },{ 9,5,7 } }; -const Word16 pr_pr_idx_pairs[3][3][2] = { { { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 1, 3 },{ 0, 0 } } }; -const Word16 pr_pd_idx_pairs[3][3][2] = { { { 1, 1 },{ 2, 2 },{ 3, 3 } },{ { 1, 1 },{ 3, 2 },{ 2, 0 } },{ { 2, 1 },{ 0, 0 },{ 0, 0 } } }; - -const Word16 remix_order_set[1][DIRAC_MAX_ANA_CHANS] = { /* WYZX --> WYXZ... */ - { 0, 1, 3, 2, 4, 5, 6, 7, 8, 9, 10 } -}; - -const Word16 HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15}; -const Word16 HOA_keep_ind_spar[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 10, 10, 10, 10}; -const Word16 HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - - -/*----------------------------------------------------------------------* -* PCA ROM tables -*-----------------------------------------------------------------------*/ - -const Word32 ivas_pca_offset_index1[IVAS_PCA_N1 + 1] = -{ - 0, 1, 9, 61, 163, 359, 685, 1125, 1747, - 2519, 3521, 4713, 6183, 7883, 9809, 12093, 14633, 17575, - 20807, 24343, 28181, 32487, 37121, 42097, 47405, 53057, 59061, - 65421, 72137, 79205, 86625, 94415, 102345, 110629, 119263, 128017, - 137097, 146515, 156043, 165637, 175551, 185515, 195535, 205837, 216183, - 226545, 236911, 247273, 257619, 267921, 277941, 287905, 297819, 307413, - 316941, 326359, 335439, 344193, 352827, 361111, 369041, 376831, 384251, - 391319, 398035, 404395, 410399, 416051, 421359, 426335, 430969, 435275, - 439113, 442649, 445881, 448823, 451363, 453647, 455573, 457273, 458743, - 459935, 460937, 461709, 462331, 462771, 463097, 463293, 463395, 463447, - 463455, 463456 -}; - -const Word16 ivas_pca_offset_index2[2692] = -{ - 0, 1, 0, 1, 7, 8, 0, 1, 7, 19, - 33, 45, 51, 52, 0, 1, 9, 23, 41, 61, - 79, 93, 101, 102, 0, 1, 7, 21, 39, 61, - 85, 111, 135, 157, 175, 189, 195, 196, 0, 1, - 7, 19, 37, 59, 85, 115, 147, 179, 211, 241, - 267, 289, 307, 319, 325, 326, 0, 1, 7, 21, - 41, 65, 95, 127, 163, 201, 239, 277, 313, 345, - 375, 399, 419, 433, 439, 440, 0, 1, 7, 19, - 37, 61, 91, 125, 163, 203, 245, 289, 333, 377, - 419, 459, 497, 531, 561, 585, 603, 615, 621, 622, - 0, 1, 7, 21, 41, 67, 97, 133, 173, 217, - 263, 311, 361, 411, 461, 509, 555, 599, 639, 675, - 705, 731, 751, 765, 771, 772, 0, 1, 7, 19, - 37, 61, 91, 127, 167, 211, 259, 309, 363, 417, - 473, 529, 585, 639, 693, 743, 791, 835, 875, 911, - 941, 965, 983, 995, 1001, 1002, 0, 1, 7, 21, - 41, 67, 99, 135, 177, 223, 273, 327, 383, 443, - 503, 565, 627, 689, 749, 809, 865, 919, 969, 1015, - 1057, 1093, 1125, 1151, 1171, 1185, 1191, 1192, 0, 1, - 7, 19, 37, 61, 91, 127, 169, 215, 265, 319, - 377, 437, 501, 567, 633, 701, 769, 837, 903, 969, - 1033, 1093, 1151, 1205, 1255, 1301, 1343, 1379, 1409, 1433, - 1451, 1463, 1469, 1470, 0, 1, 7, 21, 41, 67, - 99, 137, 179, 227, 279, 335, 395, 459, 525, 595, - 667, 739, 813, 887, 961, 1033, 1105, 1175, 1241, 1305, - 1365, 1421, 1473, 1521, 1563, 1601, 1633, 1659, 1679, 1693, - 1699, 1700, 0, 1, 9, 23, 43, 69, 101, 139, - 183, 231, 285, 343, 405, 471, 541, 613, 689, 765, - 843, 923, 1003, 1083, 1161, 1237, 1313, 1385, 1455, 1521, - 1583, 1641, 1695, 1743, 1787, 1825, 1857, 1883, 1903, 1917, - 1925, 1926, 0, 1, 7, 21, 41, 67, 99, 137, - 179, 227, 281, 339, 401, 467, 537, 611, 687, 767, - 849, 931, 1015, 1099, 1185, 1269, 1353, 1435, 1517, 1597, - 1673, 1747, 1817, 1883, 1945, 2003, 2057, 2105, 2147, 2185, - 2217, 2243, 2263, 2277, 2283, 2284, 0, 1, 7, 21, - 41, 67, 99, 137, 181, 231, 285, 345, 409, 477, - 549, 625, 705, 787, 871, 957, 1045, 1135, 1225, 1315, - 1405, 1495, 1583, 1669, 1753, 1835, 1915, 1991, 2063, 2131, - 2195, 2255, 2309, 2359, 2403, 2441, 2473, 2499, 2519, 2533, - 2539, 2540, 0, 1, 7, 19, 39, 65, 97, 135, - 177, 225, 279, 337, 401, 469, 541, 617, 697, 781, - 867, 955, 1045, 1137, 1231, 1327, 1423, 1519, 1615, 1711, - 1805, 1897, 1987, 2075, 2161, 2245, 2325, 2401, 2473, 2541, - 2605, 2663, 2717, 2765, 2807, 2845, 2877, 2903, 2923, 2935, - 2941, 2942, 0, 1, 7, 21, 41, 67, 99, 137, - 181, 229, 283, 343, 407, 477, 551, 629, 711, 797, - 885, 977, 1071, 1167, 1265, 1365, 1465, 1565, 1667, 1767, - 1867, 1967, 2065, 2161, 2255, 2347, 2435, 2521, 2603, 2681, - 2755, 2825, 2889, 2949, 3003, 3051, 3095, 3133, 3165, 3191, - 3211, 3225, 3231, 3232, 0, 1, 7, 21, 41, 67, - 99, 137, 181, 231, 287, 347, 413, 483, 559, 639, - 723, 811, 903, 997, 1093, 1193, 1295, 1399, 1503, 1609, - 1715, 1821, 1927, 2033, 2137, 2241, 2343, 2443, 2539, 2633, - 2725, 2813, 2897, 2977, 3053, 3123, 3189, 3249, 3305, 3355, - 3399, 3437, 3469, 3495, 3515, 3529, 3535, 3536, 0, 1, - 7, 21, 41, 67, 99, 137, 181, 231, 287, 349, - 415, 487, 563, 645, 731, 821, 915, 1011, 1111, 1213, - 1317, 1423, 1531, 1641, 1751, 1863, 1975, 2087, 2197, 2307, - 2415, 2521, 2625, 2727, 2827, 2923, 3017, 3107, 3193, 3275, - 3351, 3423, 3489, 3551, 3607, 3657, 3701, 3739, 3771, 3797, - 3817, 3831, 3837, 3838, 0, 1, 7, 21, 41, 67, - 99, 137, 181, 231, 285, 345, 411, 481, 557, 637, - 721, 809, 901, 997, 1097, 1199, 1305, 1413, 1523, 1635, - 1749, 1863, 1979, 2095, 2211, 2327, 2443, 2557, 2671, 2783, - 2893, 3001, 3107, 3209, 3309, 3405, 3497, 3585, 3669, 3749, - 3825, 3895, 3961, 4021, 4075, 4125, 4169, 4207, 4239, 4265, - 4285, 4299, 4305, 4306, 0, 1, 7, 21, 41, 67, - 99, 137, 181, 231, 287, 347, 413, 485, 561, 643, - 729, 819, 913, 1011, 1113, 1217, 1325, 1435, 1547, 1663, - 1779, 1897, 2017, 2137, 2257, 2377, 2497, 2617, 2737, 2855, - 2971, 3087, 3199, 3309, 3417, 3521, 3623, 3721, 3815, 3905, - 3991, 4073, 4149, 4221, 4287, 4347, 4403, 4453, 4497, 4535, - 4567, 4593, 4613, 4627, 4633, 4634, 0, 1, 7, 21, - 41, 67, 99, 137, 181, 231, 287, 349, 415, 487, - 565, 647, 733, 825, 921, 1021, 1125, 1231, 1341, 1453, - 1569, 1687, 1807, 1929, 2051, 2175, 2299, 2425, 2551, 2677, - 2801, 2925, 3047, 3169, 3289, 3407, 3523, 3635, 3745, 3851, - 3955, 4055, 4151, 4243, 4329, 4411, 4489, 4561, 4627, 4689, - 4745, 4795, 4839, 4877, 4909, 4935, 4955, 4969, 4975, 4976, - 0, 1, 7, 21, 41, 67, 99, 137, 181, 231, - 287, 349, 417, 489, 567, 649, 737, 829, 925, 1025, - 1129, 1237, 1349, 1463, 1581, 1701, 1823, 1947, 2073, 2201, - 2329, 2459, 2589, 2719, 2849, 2979, 3107, 3235, 3361, 3485, - 3607, 3727, 3845, 3959, 4071, 4179, 4283, 4383, 4479, 4571, - 4659, 4741, 4819, 4891, 4959, 5021, 5077, 5127, 5171, 5209, - 5241, 5267, 5287, 5301, 5307, 5308, 0, 1, 7, 21, - 41, 67, 99, 137, 181, 231, 287, 349, 417, 489, - 567, 651, 739, 831, 929, 1031, 1137, 1247, 1361, 1477, - 1597, 1719, 1843, 1969, 2097, 2227, 2359, 2491, 2625, 2759, - 2893, 3027, 3161, 3293, 3425, 3555, 3683, 3809, 3933, 4055, - 4175, 4291, 4405, 4515, 4621, 4723, 4821, 4913, 5001, 5085, - 5163, 5235, 5303, 5365, 5421, 5471, 5515, 5553, 5585, 5611, - 5631, 5645, 5651, 5652, 0, 1, 7, 21, 41, 67, - 99, 137, 181, 231, 287, 349, 417, 491, 569, 653, - 741, 835, 933, 1035, 1141, 1251, 1365, 1483, 1603, 1727, - 1853, 1983, 2115, 2249, 2383, 2519, 2657, 2795, 2933, 3071, - 3209, 3347, 3485, 3621, 3755, 3889, 4021, 4151, 4277, 4401, - 4521, 4639, 4753, 4863, 4969, 5071, 5169, 5263, 5351, 5435, - 5513, 5587, 5655, 5717, 5773, 5823, 5867, 5905, 5937, 5963, - 5983, 5997, 6003, 6004, 0, 1, 7, 21, 41, 67, - 99, 137, 181, 231, 287, 349, 417, 491, 569, 653, - 741, 835, 933, 1037, 1145, 1257, 1373, 1491, 1613, 1739, - 1867, 1997, 2131, 2267, 2405, 2543, 2683, 2825, 2967, 3109, - 3251, 3393, 3535, 3677, 3817, 3955, 4093, 4229, 4363, 4493, - 4621, 4747, 4869, 4987, 5103, 5215, 5323, 5427, 5525, 5619, - 5707, 5791, 5869, 5943, 6011, 6073, 6129, 6179, 6223, 6261, - 6293, 6319, 6339, 6353, 6359, 6360, 0, 1, 7, 21, - 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, - 569, 653, 743, 837, 935, 1039, 1147, 1259, 1375, 1495, - 1619, 1745, 1875, 2007, 2143, 2281, 2421, 2563, 2705, 2849, - 2993, 3139, 3285, 3431, 3577, 3723, 3867, 4011, 4153, 4295, - 4435, 4573, 4709, 4841, 4971, 5097, 5221, 5341, 5457, 5569, - 5677, 5781, 5879, 5973, 6063, 6147, 6225, 6299, 6367, 6429, - 6485, 6535, 6579, 6617, 6649, 6675, 6695, 6709, 6715, 6716, - 0, 1, 7, 21, 41, 67, 99, 137, 181, 231, - 287, 349, 417, 491, 569, 653, 743, 837, 937, 1041, - 1149, 1261, 1377, 1497, 1621, 1749, 1879, 2013, 2149, 2287, - 2429, 2573, 2717, 2863, 3011, 3159, 3309, 3459, 3609, 3759, - 3909, 4057, 4205, 4351, 4495, 4639, 4781, 4919, 5055, 5189, - 5319, 5447, 5571, 5691, 5807, 5919, 6027, 6131, 6231, 6325, - 6415, 6499, 6577, 6651, 6719, 6781, 6837, 6887, 6931, 6969, - 7001, 7027, 7047, 7061, 7067, 7068, 0, 1, 7, 21, - 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, - 569, 653, 743, 837, 937, 1041, 1149, 1261, 1377, 1497, - 1621, 1749, 1881, 2015, 2153, 2293, 2435, 2579, 2725, 2873, - 3023, 3175, 3327, 3479, 3633, 3787, 3941, 4093, 4245, 4397, - 4547, 4695, 4841, 4985, 5127, 5267, 5405, 5539, 5671, 5799, - 5923, 6043, 6159, 6271, 6379, 6483, 6583, 6677, 6767, 6851, - 6929, 7003, 7071, 7133, 7189, 7239, 7283, 7321, 7353, 7379, - 7399, 7413, 7419, 7420, 0, 1, 7, 21, 41, 67, - 99, 137, 181, 231, 287, 349, 417, 489, 567, 651, - 741, 835, 935, 1039, 1147, 1259, 1377, 1499, 1625, 1753, - 1885, 2021, 2159, 2301, 2445, 2591, 2739, 2889, 3041, 3195, - 3349, 3505, 3661, 3817, 3973, 4129, 4285, 4441, 4595, 4749, - 4901, 5051, 5199, 5345, 5489, 5631, 5769, 5905, 6037, 6165, - 6291, 6413, 6531, 6643, 6751, 6855, 6955, 7049, 7139, 7223, - 7301, 7373, 7441, 7503, 7559, 7609, 7653, 7691, 7723, 7749, - 7769, 7783, 7789, 7790, 0, 1, 7, 21, 41, 67, - 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, - 747, 843, 945, 1051, 1161, 1277, 1397, 1521, 1649, 1781, - 1915, 2053, 2195, 2339, 2485, 2635, 2787, 2941, 3095, 3251, - 3409, 3567, 3725, 3885, 4045, 4205, 4363, 4521, 4679, 4835, - 4989, 5143, 5295, 5445, 5591, 5735, 5877, 6015, 6149, 6281, - 6409, 6533, 6653, 6769, 6879, 6985, 7087, 7183, 7273, 7359, - 7439, 7513, 7581, 7643, 7699, 7749, 7793, 7831, 7863, 7889, - 7909, 7923, 7929, 7930, 0, 1, 7, 21, 41, 67, - 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, - 747, 843, 943, 1049, 1159, 1273, 1393, 1517, 1645, 1777, - 1913, 2051, 2193, 2337, 2485, 2635, 2787, 2941, 3097, 3255, - 3415, 3575, 3737, 3899, 4061, 4223, 4385, 4547, 4709, 4869, - 5029, 5187, 5343, 5497, 5649, 5799, 5947, 6091, 6233, 6371, - 6507, 6639, 6767, 6891, 7011, 7125, 7235, 7341, 7441, 7537, - 7627, 7713, 7793, 7867, 7935, 7997, 8053, 8103, 8147, 8185, - 8217, 8243, 8263, 8277, 8283, 8284, 0, 1, 7, 21, - 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, - 571, 655, 745, 841, 941, 1047, 1157, 1271, 1389, 1513, - 1641, 1773, 1907, 2045, 2187, 2331, 2479, 2629, 2783, 2939, - 3097, 3257, 3417, 3579, 3743, 3907, 4071, 4235, 4399, 4563, - 4727, 4891, 5055, 5217, 5377, 5537, 5695, 5851, 6005, 6155, - 6303, 6447, 6589, 6727, 6861, 6993, 7121, 7245, 7363, 7477, - 7587, 7693, 7793, 7889, 7979, 8063, 8143, 8217, 8285, 8347, - 8403, 8453, 8497, 8535, 8567, 8593, 8613, 8627, 8633, 8634, - 0, 1, 7, 21, 41, 67, 99, 137, 181, 231, - 287, 349, 417, 491, 571, 657, 749, 845, 947, 1053, - 1165, 1281, 1401, 1527, 1657, 1791, 1929, 2069, 2213, 2361, - 2511, 2663, 2819, 2977, 3137, 3299, 3463, 3627, 3793, 3959, - 4125, 4293, 4461, 4629, 4795, 4961, 5127, 5291, 5455, 5617, - 5777, 5935, 6091, 6243, 6393, 6541, 6685, 6825, 6963, 7097, - 7227, 7353, 7473, 7589, 7701, 7807, 7909, 8005, 8097, 8183, - 8263, 8337, 8405, 8467, 8523, 8573, 8617, 8655, 8687, 8713, - 8733, 8747, 8753, 8754, 0, 1, 7, 21, 41, 67, - 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, - 747, 843, 943, 1049, 1159, 1275, 1395, 1519, 1647, 1779, - 1915, 2055, 2199, 2345, 2495, 2647, 2803, 2961, 3121, 3283, - 3447, 3613, 3779, 3947, 4115, 4285, 4455, 4625, 4795, 4965, - 5133, 5301, 5467, 5633, 5797, 5959, 6119, 6277, 6433, 6585, - 6735, 6881, 7025, 7165, 7301, 7433, 7561, 7685, 7805, 7921, - 8031, 8137, 8237, 8333, 8423, 8509, 8589, 8663, 8731, 8793, - 8849, 8899, 8943, 8981, 9013, 9039, 9059, 9073, 9079, 9080, - 0, 1, 7, 19, 39, 65, 97, 135, 179, 229, - 285, 347, 415, 489, 567, 651, 741, 835, 935, 1041, - 1151, 1265, 1385, 1509, 1637, 1769, 1905, 2045, 2189, 2335, - 2485, 2637, 2793, 2951, 3111, 3273, 3437, 3603, 3771, 3939, - 4109, 4279, 4451, 4623, 4795, 4967, 5139, 5309, 5479, 5647, - 5815, 5981, 6145, 6307, 6467, 6625, 6781, 6933, 7083, 7229, - 7373, 7513, 7649, 7781, 7909, 8033, 8153, 8267, 8377, 8483, - 8583, 8677, 8767, 8851, 8929, 9003, 9071, 9133, 9189, 9239, - 9283, 9321, 9353, 9379, 9399, 9411, 9417, 9418, 0, 1, - 7, 21, 41, 67, 99, 137, 181, 231, 287, 349, - 417, 491, 571, 657, 747, 843, 945, 1051, 1163, 1279, - 1399, 1525, 1655, 1789, 1927, 2069, 2213, 2361, 2513, 2667, - 2825, 2985, 3147, 3311, 3477, 3645, 3815, 3985, 4157, 4329, - 4503, 4677, 4851, 5025, 5199, 5371, 5543, 5713, 5883, 6051, - 6217, 6381, 6543, 6703, 6861, 7015, 7167, 7315, 7459, 7601, - 7739, 7873, 8003, 8129, 8249, 8365, 8477, 8583, 8685, 8781, - 8871, 8957, 9037, 9111, 9179, 9241, 9297, 9347, 9391, 9429, - 9461, 9487, 9507, 9521, 9527, 9528, 0, 1, 7, 21, - 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, - 571, 657, 749, 845, 947, 1055, 1167, 1285, 1407, 1533, - 1663, 1797, 1935, 2077, 2223, 2373, 2525, 2681, 2839, 3001, - 3165, 3331, 3499, 3669, 3839, 4011, 4185, 4359, 4533, 4709, - 4885, 5061, 5235, 5409, 5583, 5755, 5925, 6095, 6263, 6429, - 6593, 6755, 6913, 7069, 7221, 7371, 7517, 7659, 7797, 7931, - 8061, 8187, 8309, 8427, 8539, 8647, 8749, 8845, 8937, 9023, - 9103, 9177, 9245, 9307, 9363, 9413, 9457, 9495, 9527, 9553, - 9573, 9587, 9593, 9594, 0, 1, 7, 21, 41, 67, - 99, 137, 181, 231, 287, 349, 417, 491, 571, 655, - 745, 841, 941, 1047, 1157, 1273, 1393, 1517, 1647, 1781, - 1919, 2061, 2207, 2355, 2507, 2663, 2821, 2981, 3145, 3311, - 3479, 3649, 3821, 3993, 4167, 4341, 4517, 4693, 4869, 5045, - 5221, 5397, 5573, 5747, 5921, 6093, 6265, 6435, 6603, 6769, - 6933, 7093, 7251, 7407, 7559, 7707, 7853, 7995, 8133, 8267, - 8397, 8521, 8641, 8757, 8867, 8973, 9073, 9169, 9259, 9343, - 9423, 9497, 9565, 9627, 9683, 9733, 9777, 9815, 9847, 9873, - 9893, 9907, 9913, 9914, 0, 1, 7, 21, 41, 67, - 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, - 747, 843, 945, 1051, 1163, 1279, 1401, 1527, 1657, 1791, - 1929, 2071, 2217, 2367, 2519, 2675, 2835, 2997, 3161, 3327, - 3495, 3665, 3837, 4011, 4185, 4361, 4537, 4715, 4893, 5071, - 5249, 5427, 5603, 5779, 5953, 6127, 6299, 6469, 6637, 6803, - 6967, 7129, 7289, 7445, 7597, 7747, 7893, 8035, 8173, 8307, - 8437, 8563, 8685, 8801, 8913, 9019, 9121, 9217, 9307, 9393, - 9473, 9547, 9615, 9677, 9733, 9783, 9827, 9865, 9897, 9923, - 9943, 9957, 9963, 9964, 0, 1, 7, 21, 41, 67, - 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, - 749, 845, 947, 1055, 1167, 1285, 1407, 1533, 1663, 1799, - 1939, 2083, 2229, 2379, 2533, 2689, 2849, 3011, 3177, 3345, - 3515, 3687, 3861, 4035, 4211, 4387, 4565, 4743, 4921, 5099, - 5277, 5455, 5633, 5809, 5985, 6159, 6333, 6505, 6675, 6843, - 7009, 7171, 7331, 7487, 7641, 7791, 7937, 8081, 8221, 8357, - 8487, 8613, 8735, 8853, 8965, 9073, 9175, 9271, 9363, 9449, - 9529, 9603, 9671, 9733, 9789, 9839, 9883, 9921, 9953, 9979, - 9999, 10013, 10019, 10020, 0, 1, 7, 19, 39, 65, - 97, 135, 179, 229, 285, 347, 415, 489, 567, 651, - 741, 837, 937, 1043, 1153, 1269, 1389, 1513, 1643, 1777, - 1915, 2057, 2203, 2351, 2503, 2659, 2817, 2979, 3143, 3309, - 3477, 3647, 3819, 3993, 4169, 4345, 4523, 4701, 4881, 5061, - 5241, 5421, 5601, 5779, 5957, 6133, 6309, 6483, 6655, 6825, - 6993, 7159, 7323, 7485, 7643, 7799, 7951, 8099, 8245, 8387, - 8525, 8659, 8789, 8913, 9033, 9149, 9259, 9365, 9465, 9561, - 9651, 9735, 9813, 9887, 9955, 10017, 10073, 10123, 10167, 10205, - 10237, 10263, 10283, 10295, 10301, 10302, 0, 1, 7, 21, - 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, - 571, 655, 745, 841, 941, 1047, 1159, 1275, 1395, 1521, - 1651, 1785, 1923, 2065, 2211, 2361, 2513, 2669, 2829, 2991, - 3155, 3321, 3491, 3663, 3837, 4011, 4187, 4365, 4543, 4723, - 4903, 5083, 5263, 5443, 5623, 5803, 5981, 6159, 6335, 6509, - 6683, 6855, 7025, 7191, 7355, 7517, 7677, 7833, 7985, 8135, - 8281, 8423, 8561, 8695, 8825, 8951, 9071, 9187, 9299, 9405, - 9505, 9601, 9691, 9775, 9855, 9929, 9997, 10059, 10115, 10165, - 10209, 10247, 10279, 10305, 10325, 10339, 10345, 10346, 0, 1, - 7, 21, 41, 67, 99, 137, 181, 231, 287, 349, - 417, 491, 571, 655, 745, 841, 943, 1049, 1161, 1277, - 1397, 1523, 1653, 1787, 1925, 2067, 2213, 2363, 2517, 2673, - 2833, 2995, 3159, 3327, 3497, 3669, 3843, 4019, 4195, 4373, - 4551, 4731, 4911, 5091, 5271, 5451, 5631, 5811, 5989, 6167, - 6343, 6519, 6693, 6865, 7035, 7203, 7367, 7529, 7689, 7845, - 7999, 8149, 8295, 8437, 8575, 8709, 8839, 8965, 9085, 9201, - 9313, 9419, 9521, 9617, 9707, 9791, 9871, 9945, 10013, 10075, - 10131, 10181, 10225, 10263, 10295, 10321, 10341, 10355, 10361, 10362, - 0, 1, 7, 21, 41, 67, 99, 137, 181, 231, - 287, 349, 417, 491, 571, 657, 747, 843, 945, 1051, - 1163, 1279, 1399, 1525, 1655, 1789, 1927, 2069, 2215, 2365, - 2519, 2675, 2835, 2997, 3161, 3329, 3499, 3671, 3845, 4021, - 4197, 4375, 4553, 4733, 4913, 5093, 5273, 5453, 5633, 5813, - 5991, 6169, 6345, 6521, 6695, 6867, 7037, 7205, 7369, 7531, - 7691, 7847, 8001, 8151, 8297, 8439, 8577, 8711, 8841, 8967, - 9087, 9203, 9315, 9421, 9523, 9619, 9709, 9795, 9875, 9949, - 10017, 10079, 10135, 10185, 10229, 10267, 10299, 10325, 10345, 10359, - 10365, 10366 -}; - -const Word16 ivas_pca_offset_n2[IVAS_PCA_N1] = -{ - 0, 2, 6, 14, 24, 38, 56, 76, 100, 126, 156, 188, - 224, 262, 302, 346, 392, 442, 494, 548, 604, 664, 726, 790, - 856, 924, 994, 1066, 1140, 1216, 1294, 1374, 1454, 1536, 1620, 1704, - 1790, 1878, 1966, 2054, 2144, 2234, 2324, 2416, 2508, 2600, 2692, 2784, - 2876, 2968, 3058, 3148, 3238, 3326, 3414, 3502, 3588, 3672, 3756, 3838, - 3918, 3998, 4076, 4152, 4226, 4298, 4368, 4436, 4502, 4566, 4628, 4688, - 4744, 4798, 4850, 4900, 4946, 4990, 5030, 5068, 5104, 5136, 5166, 5192, - 5216, 5236, 5254, 5268, 5278, 5286, 5290 -}; - -const Word16 ph1_q_n2_tbl[IVAS_PCA_N1][2] = { /* ph1_q : Q13, n2 : Q0 */ - { 0, 1 }, - { 286, 3 }, - { 572, 7 }, - { 858, 9 }, - { 1144, 13 }, - { 1430, 17 }, - { 1716, 19 }, - { 2002, 23 }, - { 2288, 25 }, - { 2574, 29 }, - { 2860, 31 }, - { 3146, 35 }, - { 3431, 37 }, - { 3717, 39 }, - { 4003, 43 }, - { 4289, 45 }, - { 4575, 49 }, - { 4861, 51 }, - { 5147, 53 }, - { 5433, 55 }, - { 5719, 59 }, - { 6005, 61 }, - { 6291, 63 }, - { 6577, 65 }, - { 6863, 67 }, - { 7149, 69 }, - { 7435, 71 }, - { 7721, 73 }, - { 8007, 75 }, - { 8293, 77 }, - { 8579, 79 }, - { 8865, 79 }, - { 9151, 81 }, - { 9437, 83 }, - { 9722, 83 }, - { 10008, 85 }, - { 10294, 87 }, - { 10580, 87 }, - { 10866, 87 }, - { 11152, 89 }, - { 11438, 89 }, - { 11724, 89 }, - { 12010, 91 }, - { 12296, 91 }, - { 12582, 91 }, - { 12868, 91 }, - { 13154, 91 }, - { 13440, 91 }, - { 13726, 91 }, - { 14012, 89 }, - { 14298, 89 }, - { 14584, 89 }, - { 14870, 87 }, - { 15156, 87 }, - { 15442, 87 }, - { 15728, 85 }, - { 16013, 83 }, - { 16299, 83 }, - { 16585, 81 }, - { 16871, 79 }, - { 17157, 79 }, - { 17443, 77 }, - { 17729, 75 }, - { 18015, 73 }, - { 18301, 71 }, - { 18587, 69 }, - { 18873, 67 }, - { 19159, 65 }, - { 19445, 63 }, - { 19731, 61 }, - { 20017, 59 }, - { 20303, 55 }, - { 20589, 53 }, - { 20875, 51 }, - { 21161, 49 }, - { 21447, 45 }, - { 21733, 43 }, - { 22019, 39 }, - { 22304, 37 }, - { 22590, 35 }, - { 22876, 31 }, - { 23162, 29 }, - { 23448, 25 }, - { 23734, 23 }, - { 24020, 19 }, - { 24306, 17 }, - { 24592, 13 }, - { 24878, 9 }, - { 25164, 7 }, - { 25450, 3 }, - { 25736, 1 } -}; - - -/*----------------------------------------------------------------------------------* - * Parametric MC ROM tables - *----------------------------------------------------------------------------------*/ - -const Word16 param_mc_band_grouping_20[20 + 1] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 20, 23, 27, 33, 40, 52, 60 -}; - -const Word16 param_mc_coding_band_mapping_20[20] = -{ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -const Word16 param_mc_bands_coded_20[4] = -{ - 10, 14, 18, 20 -}; - -const Word16 param_mc_band_grouping_14[14 + 1] = -{ - 0, 1, 2, 3, 4, 5, 6, 8, 10, 13, 16, 20, 28, 40, 60 -}; - -const Word16 param_mc_coding_band_mapping_14[14] = -{ - 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 -}; - -const Word16 param_mc_bands_coded_14[4] = -{ - 8, 11, 13, 14 -}; - -const Word16 param_mc_band_grouping_10[10 + 1] = -{ - 0, 1, 2, 3, 5, 7, 10, 14, 20, 40, 60 -}; - - -const Word16 param_mc_bands_coded_10[4] = -{ - 6, 8, 9, 10 -}; - -const Word16 param_mc_coding_band_mapping_10[10] = -{ - 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 -}; - -const Word16 Param_MC_index[MAX_CICP_CHANNELS] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 -}; - - -const Word32 ivas_param_mc_dmx_fac_CICP6_2tc_fx[12] = -{ - 2147483647,0,1518500224,1518500224,2147483647,0, /*Lt*/ - 0,2147483647,1518500224,1518500224,0,2147483647 /*Rt*/ -}; - -const Word32 ivas_param_mc_dmx_fac_CICP12_2tc_fx[16] = -{ - 2147483647,0,1518500224,1518500224,2147483647,0,2147483647,0, /*Lt*/ - 0,2147483647,1518500224,1518500224,0,2147483647,0,2147483647 /*Rt*/ -}; - -const Word32 ivas_param_mc_dmx_fac_CICP12_3tc_fx[24] = -{ - 2147483647,0,0,0,2147483647,0,2147483647,0, /*Lt*/ - 0,2147483647,0,0,0,2147483647,0,2147483647, /*Rt*/ - 0,0,2147483647,2147483647,0,0,0,0 /*Ct*/ -}; - -const Word32 ivas_param_mc_dmx_fac_CICP14_2tc_fx[16] = -{ - 2147483647,0,1518500224,1518500224,2147483647,0,2147483647,0, /*Lt*/ - 0,2147483647,1518500224,1518500224,0,2147483647,0,2147483647 /*Rt*/ -}; -const Word32 ivas_param_mc_dmx_fac_CICP14_3tc_fx[24] = -{ - 2147483647,0,0,0,2147483647,0,2147483647,0, /*Lt*/ - 0,2147483647,0,0,0,2147483647,0,2147483647, /*Rt*/ - 0,0,2147483647,2147483647,0,0,0,0 /*Ct*/ -}; - -const Word32 ivas_param_mc_dmx_fac_CICP16_3tc_fx[30] = -{ - 2147483647,0,0,0,2147483647,0,2147483647,0,2147483647,0, /*Lt*/ - 0,2147483647,0,0,0,2147483647,0,2147483647,0,2147483647, /*Rt*/ - 0,0,2147483647,2147483647,0,0,0,0,0,0 /*Ct*/ -}; - -const Word32 ivas_param_mc_dmx_fac_CICP19_3tc_fx[36] = -{ - 2147483647,0,0,0,2147483647,0,2147483647,0,2147483647,0,2147483647,0, /*Lt*/ - 0,2147483647,0,0,0,2147483647,0,2147483647,0,2147483647,0,2147483647, /*Rt*/ - 0,0,2147483647,2147483647,0,0,0,0,0,0,0,0 /*Ct*/ -}; - -const Word32 ivas_param_mc_dmx_fac_CICP19_4tc_fx[48] = -{ - 2147483647,0,1518500224,1518500224,2147483647,0,2147483647,0,0,0,0,0, /*Lht*/ - 0,2147483647,1518500224,1518500224,0,2147483647,0,2147483647,0,0,0,0, /*Rht*/ - 0,0,0,0,0,0,0,0,2147483647,0,2147483647,0, /*Lut*/ - 0,0,0,0,0,0,0,0,0,2147483647,0,2147483647 /*Rut*/ -}; - - -//Q15 -const Word16 ivas_param_mc_ild_fac_CICP6_2tc_fx[6] = -{ - 12832, - 12832, - 6820, - 10607, - 10607, - 6820 -}; - -//Q15 -const Word16 ivas_param_mc_ild_fac_CICP12_2tc_fx[8] = -{ - 11965, - 11965, - 6816, - 6877, - 6877, - 5619, - 5619, - 6816 -}; - -//Q15 -const Word16 ivas_param_mc_ild_fac_CICP12_3tc_fx[8] = -{ - 16384, - 16384, - 9502, - 9502, - 6553, - 6553, - 32767, - 8192 -}; -//Q15 -const Word16 ivas_param_mc_ild_fac_CICP14_2tc_fx[8] = -{ - 11936, - 11936, - 5993, - 6945, - 6945, - 8049, - 8049, - 6816 -}; - -//Q15 -const Word16 ivas_param_mc_ild_fac_CICP14_3tc_fx[8] = -{ - 16291, - 16291, - 8257, - 8257, - 9666, - 9666, - 32767, - 8192 -}; - -//Q15 -const Word16 ivas_param_mc_ild_fac_CICP16_3tc_fx[10] = -{ - 11141, - 11141, - 7209, - 7209, - 6553, - 6553, - 5898, - 5898, - 32767, - 8192 -}; - -//Q15 -const Word16 ivas_param_mc_ild_fac_CICP19_3tc_fx[12] = -{ - 9830, - 9830, - 5570, - 5570, - 3932, - 3932, - 6226, - 6226, - 6226, - 6226, - 32767, - 16384 -}; - -const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP6_2tc = -{ - 5, - 6, - {0,1,2,4,5,3}, - {1,1,2,1,1,2}, - {{0},{1},{0,1},{0},{1},{0,1}} -}; - -const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP12_2tc = -{ - 7, - 8, - {0,1,2,4,5,6,7,3}, - {1,1,2,1,1,1,1,2}, - {{0},{1},{0,1},{0},{1},{0},{1},{0,1}} -}; - -const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP12_3tc = -{ - 6, - 8, - {0,1,4,5,6,7,2,3}, - {1,1,1,1,1,1,1,1}, - {{0},{1},{0},{1},{0},{1},{2},{2}} -}; - -const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP14_2tc = -{ - 7, - 8, - {0,1,2,4,5,6,7,3}, - {1,1,2,1,1,1,1,2}, - {{0},{1},{0,1},{0},{1},{0},{1},{0,1}} -}; - -const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP14_3tc = -{ - 6, - 8, - {0,1,4,5,6,7,2,3}, - {1,1,1,1,1,1,1,1}, - {{0},{1},{0},{1},{0},{1},{2},{2}} -}; - -const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP16_3tc = -{ - 8, - 10, - {0,1,4,5,6,7,8,9,2,3}, - {1,1,1,1,1,1,1,1,1,1}, - {{0},{1},{0},{1},{0},{1},{0},{1},{2},{2}} -}; - -const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP19_3tc = -{ - 10, - 12, - {0,1,4,5,6,7,8,9,10,11,2,3}, - {1,1,1,1,1,1,1,1,1,1,1,1}, - {{0},{1},{0},{1},{0},{1},{0},{1},{0},{1},{2},{2}} -}; - -const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP6_2tc = -{ - 4, - 5, - { { 0, 4 }, /* L/LS */ - { 1, 5 }, /* R/RS */ - { 0, 2 }, /* L/C */ - { 1, 2 }, /* R/C */ - { 2, 3 }} /* C/LFE */ -}; - -const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP12_2tc = -{ - 6, - 7, - { { 0, 4 }, /* L/LS */ - { 1, 5 }, /* R/RS */ - { 0, 2 }, /* L/C */ - { 1, 2 }, /* R/C */ - { 2, 6 }, /* C/BLS */ - { 2, 7 }, /* C/BRS */ - { 2, 3 } /* C/LFE */ - } -}; - -const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP12_3tc = -{ - 6, - 7, - { { 0, 4 }, /* L/LS */ - { 1, 5 }, /* R/RS */ - { 0, 2 }, /* L/C */ - { 1, 2 }, /* R/C */ - { 0, 6 }, /* L/BLS */ - { 1, 7 }, /* R/BRS */ - { 2, 3 } /* C/LFE */ - } -}; - -const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP14_2tc = -{ - 6, - 7, - { { 0, 4 }, /* L/LS */ - { 1, 5 }, /* R/RS */ - { 0, 2 }, /* L/C */ - { 1, 2 }, /* R/C */ - { 2, 6 }, /* C/UFL */ - { 2, 7 }, /* C/UFR */ - { 2, 3 } /* C/LFE */ - } -}; -const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP14_3tc = -{ - 6, - 7, - { { 0, 4 }, /* L/LS */ - { 1, 5 }, /* R/RS */ - { 0, 2 }, /* L/C */ - { 1, 2 }, /* R/C */ - { 0, 6 }, /* L/UFL */ - { 1, 7 }, /* R/UFR */ - { 2, 3 } /* C/LFE */ - } -}; - -const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP16_3tc = -{ - 8, - 9, - { { 0, 4 }, /* L/LS */ - { 1, 5 }, /* R/RS */ - { 0, 2 }, /* L/C */ - { 1, 2 }, /* R/C */ - { 0, 6 }, /* L/UFL */ - { 1, 7 }, /* R/UFR */ - { 4, 8 }, /* LS/UBL */ - { 5, 9 }, /* RS/UBR */ - { 2, 3 } /* C/LFE */ - } -}; - -const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP19_3tc = -{ - 10, - 11, - { { 0, 4 }, /* L/LS */ - { 1, 5 }, /* R/RS */ - { 0, 2 }, /* L/C */ - { 1, 2 }, /* R/C */ - { 0, 6 }, /* L/LBS */ - { 1, 7 }, /* R/RBS */ - { 0, 8 }, /* L/UFL */ - { 1, 9 }, /* R/UFR */ - { 6, 10 }, /* LBS/UBL */ - { 7, 11 }, /* RBS/UBR */ - { 2, 3 } /* C/LFE */ - } -}; - -const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = -{ - /* CICP6 48000 */ - { - MC_LS_SETUP_5_1, - 6, - 2, - IVAS_48k, - &ivas_param_mc_ild_mapping_CICP6_2tc, - &ivas_param_mc_icc_mapping_CICP6_2tc, - &ivas_param_mc_ild_fac_CICP6_2tc_fx[0], - &ivas_param_mc_dmx_fac_CICP6_2tc_fx[0] - }, - /* CICP6 64000 */ - { - MC_LS_SETUP_5_1, - 6, - 2, - IVAS_64k, - &ivas_param_mc_ild_mapping_CICP6_2tc, - &ivas_param_mc_icc_mapping_CICP6_2tc, - &ivas_param_mc_ild_fac_CICP6_2tc_fx[0], - & ivas_param_mc_dmx_fac_CICP6_2tc_fx[0] - }, - /* CICP6 80000 */ - { - MC_LS_SETUP_5_1, - 6, - 2, - IVAS_80k, - &ivas_param_mc_ild_mapping_CICP6_2tc, - &ivas_param_mc_icc_mapping_CICP6_2tc, - &ivas_param_mc_ild_fac_CICP6_2tc_fx[0], - & ivas_param_mc_dmx_fac_CICP6_2tc_fx[0] - }, - /* CICP12 48000 */ - { - MC_LS_SETUP_7_1, - 8, - 2, - IVAS_48k, - &ivas_param_mc_ild_mapping_CICP12_2tc, - &ivas_param_mc_icc_mapping_CICP12_2tc, - &ivas_param_mc_ild_fac_CICP12_2tc_fx[0], - &ivas_param_mc_dmx_fac_CICP12_2tc_fx[0] - }, - /* CICP12 64000 */ - { - MC_LS_SETUP_7_1, - 8, - 2, - IVAS_64k, - &ivas_param_mc_ild_mapping_CICP12_2tc, - &ivas_param_mc_icc_mapping_CICP12_2tc, - &ivas_param_mc_ild_fac_CICP12_2tc_fx[0], - &ivas_param_mc_dmx_fac_CICP12_2tc_fx[0] - }, - /* CICP12 80000 */ - { - MC_LS_SETUP_7_1, - 8, - 2, - IVAS_80k, - &ivas_param_mc_ild_mapping_CICP12_2tc, - &ivas_param_mc_icc_mapping_CICP12_2tc, - &ivas_param_mc_ild_fac_CICP12_2tc_fx[0], - &ivas_param_mc_dmx_fac_CICP12_2tc_fx[0], - }, - /* CICP12 96000 */ - { - MC_LS_SETUP_7_1, - 8, - 3, - IVAS_96k, - &ivas_param_mc_ild_mapping_CICP12_3tc, - &ivas_param_mc_icc_mapping_CICP12_3tc, - &ivas_param_mc_ild_fac_CICP12_3tc_fx[0], - &ivas_param_mc_dmx_fac_CICP12_3tc_fx[0] - }, - /* CICP14 48000 */ - { - MC_LS_SETUP_5_1_2, - 8, - 2, - IVAS_48k, - &ivas_param_mc_ild_mapping_CICP14_2tc, - &ivas_param_mc_icc_mapping_CICP14_2tc, - &ivas_param_mc_ild_fac_CICP14_2tc_fx[0], - &ivas_param_mc_dmx_fac_CICP14_2tc_fx[0] - }, - /* CICP14 64000 */ - { - MC_LS_SETUP_5_1_2, - 8, - 2, - IVAS_64k, - &ivas_param_mc_ild_mapping_CICP14_2tc, - &ivas_param_mc_icc_mapping_CICP14_2tc, - &ivas_param_mc_ild_fac_CICP14_2tc_fx[0], - &ivas_param_mc_dmx_fac_CICP14_2tc_fx[0] - }, - /* CICP14 80000 */ - { - MC_LS_SETUP_5_1_2, - 8, - 2, - IVAS_80k, - &ivas_param_mc_ild_mapping_CICP14_2tc, - &ivas_param_mc_icc_mapping_CICP14_2tc, - &ivas_param_mc_ild_fac_CICP14_2tc_fx[0], - &ivas_param_mc_dmx_fac_CICP14_2tc_fx[0] - }, - /* CICP14 96000 */ - { - MC_LS_SETUP_5_1_2, - 8, - 3, - IVAS_96k, - &ivas_param_mc_ild_mapping_CICP14_3tc, - &ivas_param_mc_icc_mapping_CICP14_3tc, - &ivas_param_mc_ild_fac_CICP14_3tc_fx[0], - &ivas_param_mc_dmx_fac_CICP14_3tc_fx[0] - }, - /* CICP16 96000 */ - { - MC_LS_SETUP_5_1_4, - 10, - 3, - IVAS_96k, - &ivas_param_mc_ild_mapping_CICP16_3tc, - &ivas_param_mc_icc_mapping_CICP16_3tc, - &ivas_param_mc_ild_fac_CICP16_3tc_fx[0], - &ivas_param_mc_dmx_fac_CICP16_3tc_fx[0] - }, - /* CICP16 128000 */ - { - MC_LS_SETUP_5_1_4, - 10, - 3, - IVAS_128k, - &ivas_param_mc_ild_mapping_CICP16_3tc, - &ivas_param_mc_icc_mapping_CICP16_3tc, - &ivas_param_mc_ild_fac_CICP16_3tc_fx[0], - &ivas_param_mc_dmx_fac_CICP16_3tc_fx[0] - }, - /* CICP19 128000 */ - { - MC_LS_SETUP_7_1_4, - 12, - 3, - IVAS_128k, - &ivas_param_mc_ild_mapping_CICP19_3tc, - &ivas_param_mc_icc_mapping_CICP19_3tc, - &ivas_param_mc_ild_fac_CICP19_3tc_fx[0], - &ivas_param_mc_dmx_fac_CICP19_3tc_fx[0] - } -}; - - -/* Alphabet for delta coding for the ICCs in Parametric MC processing */ -const UWord16 ivas_param_mc_cum_freq_icc_cicp6_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1] = -{ - 0, 24, 224, 20873, 42384, 51699, 57122, 60572, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_icc_cicp6_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER] = -{ - 24, 200, 20649, 21511, 9315, 5423, 3450, 4963 -}; - -const UWord16 ivas_param_mc_cum_freq_icc_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER] = -{ - 0, 4, 9, 124, 447, 1311, 4453, 18116, 48636, 60573, 63692, 64746, 65327, 65531, 65534, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_icc_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1] = -{ - 4, 5, 115, 323, 864, 3142, 13663, 30520, 11937, 3119, 1054, 581, 204, 3, 1 -}; - -const UWord16 ivas_param_mc_cum_freq_icc_cicp12_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1] = -{ - 0, 30, 848, 26611, 47846, 57358, 61679, 63237, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_icc_cicp12_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER] = -{ - 30, 818, 25763, 21235, 9512, 4321, 1558, 2298 -}; - -const UWord16 ivas_param_mc_cum_freq_icc_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER] = -{ - 0, 2, 7, 53, 243, 979, 3994, 16732, 49642, 61343, 64331, 65158, 65438, 65532, 65534, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_icc_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1] = -{ - 2, 5, 46, 190, 736, 3015, 12738, 32910, 11701, 2988, 827, 280, 94, 2, 1 -}; - -const UWord16 ivas_param_mc_cum_freq_icc_cicp14_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1] = -{ - 0, 46, 826, 27798, 49552, 58447, 62046, 63284, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_icc_cicp14_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER ]={ - 46, 780, 26972, 21754, 8895, 3599, 1238, 2251 -}; - -const UWord16 ivas_param_mc_cum_freq_icc_delta_cicp14_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER] = -{ - 0, 3, 8, 36, 172, 763, 3436, 15845, 50168, 62005, 64676, 65298, 65481, 65533, 65534, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_icc_delta_cicp14_48_16bits[2* PARAM_MC_SZ_ICC_QUANTIZER - 1] = -{ - 3, 5, 28, 136, 591, 2673, 12409, 34323, 11837, 2671, 622, 183, 52, 1, 1 -}; - -const UWord16 ivas_param_mc_cum_freq_icc_combined_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1] = -{ - 0, 34, 552, 24717, 45819, 54772, 59054, 61166, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_icc_combined_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER] = -{ - 34, 518, 24165, 21102, 8953, 4282, 2112, 4369 -}; - -const UWord16 ivas_param_mc_cum_freq_icc_delta_combined_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER] = -{ - 0, 3, 7, 74, 304, 1009, 3870, 16502, 49834, 61384, 64217, 65020, 65369, 65531, 65534, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_icc_delta_combined_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1] = -{ - 3, 4, 67, 230, 705, 2861, 12632, 33332, 11550, 2833, 803, 349, 162, 3, 1 -}; - -const UWord16 ivas_param_mc_cum_freq_ild_cicp6_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1] = -{ - 0, 1092, 5574, 8315, 10652, 13875, 19656, 27664, 36284, 47058, 56251, 62579, 65118, 65462, 65513, 65532, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_ild_cicp6_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = -{ - 1092, 4482, 2741, 2337, 3223, 5781, 8008, 8620, 10774, 9193, 6328, 2539, 344, 51, 19, 3 -}; - -const UWord16 ivas_param_mc_cum_freq_ild_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = -{ - 0, 1, 2, 3, 5, 38, 146, 352, 638, 997, 1559, 2323, 3570, 5859, 10556, 21075, 44682, 55617, 60408, 62739, 63833, 64443, 64809, 65074, 65279, 65400, 65484, 65531, 65532, 65533, 65534, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_ild_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1] = -{ - 1, 1, 1, 2, 33, 108, 206, 286, 359, 562, 764, 1247, 2289, 4697, 10519, 23607, 10935, 4791, 2331, 1094, 610, 366, 265, 205, 121, 84, 47, 1, 1, 1, 1 -}; - -const UWord16 ivas_param_mc_cum_freq_ild_cicp12_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1] = -{ - 0, 967, 6335, 9941, 12837, 16652, 22416, 29814, 38807, 48497, 57184, 62661, 64916, 65466, 65514, 65530, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_ild_cicp12_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = -{ - 967, 5368, 3606, 2896, 3815, 5764, 7398, 8993, 9690, 8687, 5477, 2255, 550, 48, 16, 5 -}; - -const UWord16 ivas_param_mc_cum_freq_ild_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = -{ - 0, 1, 2, 3, 5, 18, 61, 149, 320, 592, 1083, 1793, 2974, 5257, 10133, 21274, 44342, 55891, 60895, 63174, 64244, 64793, 65100, 65287, 65406, 65477, 65517, 65531, 65532, 65533, 65534, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_ild_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1] = -{ - 1, 1, 1, 2, 13, 43, 88, 171, 272, 491, 710, 1181, 2283, 4876, 11141, 23068, 11549, 5004, 2279, 1070, 549, 307, 187, 119, 71, 40, 14, 1, 1, 1, 1 -}; - -const UWord16 ivas_param_mc_cum_freq_ild_cicp14_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1] = -{ - 0, 229, 7068, 10910, 13856, 17467, 22629, 29174, 36906, 46558, 55579, 61802, 65222, 65505, 65527, 65534, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_ild_cicp14_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = -{ - 229, 6839, 3842, 2946, 3611, 5162, 6545, 7732, 9652, 9021, 6223, 3420, 283, 22, 7, 1 -}; - -const UWord16 ivas_param_mc_cum_freq_ild_delta_cicp14_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = -{ - 0, 1, 2, 3, 4, 12, 56, 153, 278, 475, 856, 1430, 2489, 4723, 9580, 20685, 45423, 56274, 60948, 63097, 64128, 64679, 65002, 65208, 65348, 65445, 65517, 65531, 65532, 65533, 65534, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_ild_delta_cicp14_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1] = -{ - 1, 1, 1, 1, 8, 44, 97, 125, 197, 381, 574, 1059, 2234, 4857, 11105, 24738, 10851, 4674, 2149, 1031, 551, 323, 206, 140, 97, 72, 14, 1, 1, 1, 1 -}; - -const UWord16 ivas_param_mc_cum_freq_ild_combined_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS+1] = -{ - 0, 1453, 8326, 12221, 15164, 18764, 24177, 31297, 39520, 49154, 57135, 62460, 64821, 65468, 65514, 65530, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_ild_combined_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = -{ - 1453, 6873, 3895, 2943, 3600, 5413, 7120, 8223, 9634, 7981, 5325, 2361, 647, 46, 16, 5 -}; - -const UWord16 ivas_param_mc_cum_freq_ild_delta_combined_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = -{ - 0, 1, 2, 3, 5, 29, 98, 220, 414, 699, 1186, 1876, 3049, 5304, 10013, 20612, 45247, 56109, 60818, 63022, 64081, 64647, 64977, 65198, 65348, 65443, 65502, 65530, 65532, 65533, 65534, 65535 -}; - -const UWord16 ivas_param_mc_sym_freq_ild_delta_combined_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1] = -{ - 1, 1, 1, 2, 24, 69, 122, 194, 285, 487, 690, 1173, 2255, 4709, 10599, 24635, 10862, 4709, 2204, 1059, 566, 330, 221, 150, 95, 59, 28, 2, 1, 1, 1 -}; - - -/*----------------------------------------------------------------------------------* - * MASA ROM tables - *----------------------------------------------------------------------------------*/ - -const Word64 diffuseness_reconstructions_hr_fx[HR_MASA_ER_LEVELS] = { /* Q62 */ - 0, - 65865144550293504, - 138485688541642752, - 239816680157478912, - 355502895585558528, - 485544334825881600, - 667940119734386688, - 902690250311073792, - 1225260573621485568, - 1635651089665622016, - 2011983133527769088, - 2354256705207926784, - 2741003323208368128, - 3172222987529093120, - 3693796119373938688, - 4305722718742904832, -}; - -const Word32 diffuseness_thresholds_hr_fx[HR_MASA_ER_LEVELS + 1] = { /* Q30 */ - 0, - 10223616, - 20447232, - 44040192, - 67633152, - 97910784, - 128188416, - 182845440, - 237502464, - 333053952, - 428605440, - 508297216, - 587988992, - 688390144, - 788791296, - 931266560, - MAX_32 /* out-of-range large value to make searching easier */ -}; - -const Word16 bits_direction_masa[DIRAC_DIFFUSE_LEVELS] = -{ - 11, - 11, - 10, - 9, - 7, - 6, - 5, - 3 -}; - - -const Word16 len_cb_dct0_masa[DIRAC_DIFFUSE_LEVELS] = { 7, 6, 5, 4, 4, 4, 3, 2 }; - -const UWord8 sur_coherence_cb_masa[MASA_MAX_NO_CV_SUR_COH*MASA_NO_CB_SUR_COH] = -{ - 16, 99, 0, 0, 0, 0, 0, 0, - 12, 64, 167, 0, 0, 0, 0, 0, - 10, 45, 100, 218, 0, 0, 0, 0, - 8, 34, 70, 124, 235, 0, 0, 0, - 7, 27, 55, 90, 141, 242, 0, 0, - 7, 23, 45, 71, 105, 153, 247, 0, - 6, 20, 38, 60, 86, 119, 165, 249 -}; - -const Word16 idx_cb_sur_coh_masa[MASA_MAX_NO_CV_SUR_COH] = { 0, 1, 2, 3, 4, 5, 5, 6 }; - -const Word16 len_huf_masa[MASA_NO_CV_COH1] = { 4, 2, 1, 3, 4 }; - -const Word16 huff_code_av_masa[MASA_NO_CV_COH1] = { 15, 2, 0, 6, 14 }; - -const Word16 no_theta_masa[NO_SPHERICAL_GRIDS-2] = /* from 1 to 11 bits */ -{ /*1, 1,*/ 2 ,2 , 4, 5, 6, 7, 10, 14, 19 - /*0, 2, 8, 6, 7, 12, 14, 16*/ -}; - -const Word16 no_phi_masa[NO_SPHERICAL_GRIDS][MAX_NO_THETA] = /* from 1 to 11 bits*/ -{ - { 2 }, - { 4 }, - { 4, 2 }, - { 8, 4 }, /* 8, 4*/ - { 12, 7, 2, 1 }, /* 12, */ - { 14, 13, 9, 2, 1 }, - { 22, 21, 17, 11, 3, 1 }, - { 33, 32, 29, 23, 17, 9, 1 }, - { 48, 47, 45, 41, 35, 28, 20, 12, 2, 1 }, - { 60, 60, 58, 56, 54, 50, 46, 41, 36, 30, 23, 17, 10, 1 }, - { 89, 89, 88, 86, 84, 81, 77, 73, 68, 63, 57, 51, 44, 38, 30, 23, 15, 8, 1 } -}; - -const Word16 MASA_band_grouping_24[24 + 1] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 30, 40, 60 -}; - -const Word16 MASA_band_mapping_24_to_18[18 + 1] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 20, 21, 22, 23, 24 -}; - -const Word16 MASA_band_mapping_24_to_12[12 + 1] = -{ - 0, 1, 2, 3, 4, 5, 7, 9, 12, 15, 20, 22, 24 -}; - -const Word16 MASA_band_mapping_24_to_8[8 + 1] = -{ - 0, 1, 2, 3, 5, 8, 12, 20, 24 -}; - -const Word16 MASA_band_mapping_24_to_5[5 + 1] = -{ - 0, 1, 3, 7, 15, 24 -}; - -const Word16 MASA_grouping_8_to_5[8] = -{ - 0, 1, 1, 2, 3, 3, 4, 4 -}; - -const Word16 MASA_grouping_12_to_5[12] = -{ - 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4 -}; - -const Word16 MASA_grouping_18_to_5[18] = -{ - 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4 -}; - -const Word16 MASA_grouping_24_to_5[24] = -{ - 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4 -}; - -/* IVAS_13k2, IVAS_16k4, IVAS_24k4, IVAS_32k, IVAS_48k, IVAS_64k, IVAS_80k, IVAS_96k, IVAS_128k, IVAS_160k, IVAS_192k, IVAS_256k, IVAS_384k, IVAS_512k */ -const Word16 masa_bits[IVAS_NUM_ACTIVE_BRATES] = -{ - 50, 60, 70, 85, 140, 180, 220, 256, 350, 432, 528, 832, 1024, MASA_MAX_BITS -}; - -const Word16 masa_bits_LR_stereo[4] = -{ - 50, 50, 60, 70 -}; - -const Word16 mcmasa_bits[IVAS_NUM_ACTIVE_BRATES] = -{ - 50, 70, 80, 120, 140, 160, 220, 256, 288, 432, 528, 832, 1024, MASA_MAX_BITS -}; - -const UWord8 masa_nbands[IVAS_NUM_ACTIVE_BRATES] = -{ - 5, 5, 5, 5, 5, 5, 5, 5, 8, 12, 18, 24, 24, 24 -}; - -const UWord8 masa_joined_nbands[IVAS_NUM_ACTIVE_BRATES] = -{ - 5, 5, 5, 8, 12, 12, 12, 18, 18, 18, 18, 24, 24, 24 -}; - -const UWord8 masa_twodir_bands[IVAS_NUM_ACTIVE_BRATES] = -{ - 0, 0, 0, 0, 0, 1, 1, 1, 3, 4, 6, 6, 9, 24 -}; - -const UWord8 masa_twodir_bands_joined[IVAS_NUM_ACTIVE_BRATES] = -{ - 0, 0, 0, 0, 0, 2, 2, 3, 4, 6, 8, 9, 12, MASA_MAXIMUM_TWO_DIR_BANDS -}; - - -/*----------------------------------------------------------------------------------* - * OMASA ROM tables - *----------------------------------------------------------------------------------*/ - -const Word32 sep_object_brate[][MAX_NUM_OBJECTS] = -{ - {0, 0, 0, 0}, /* 13k2 */ - {0, 0, 0, 0}, /* 16k4 */ - {9600, 0, 0, 0}, /* 24k4 */ - {IVAS_13k2, 0, 0, 0}, /* 32k */ - {16000, 11000, 0, 0}, /* 48k */ - {16000, 11700, 0, 0}, /* 64k */ - {20000, 16000, 0, 0}, /* 80k */ - {IVAS_32k, 20000, 20000, 0}, /* 96k */ - {IVAS_32k, IVAS_24k4, 24000, 24000}, /* 128k */ - {IVAS_48k, IVAS_32k, IVAS_24k4, 24000}, /* 160k */ - {IVAS_64k, IVAS_48k, IVAS_32k, IVAS_24k4}, /* 192k */ - {IVAS_96k, IVAS_64k, IVAS_48k, IVAS_32k}, /* 256k */ - {IVAS_128k, IVAS_80k, IVAS_64k, IVAS_48k}, /* 384k */ - {IVAS_128k, IVAS_96k, IVAS_80k, IVAS_64k} /* 512k */ -}; - -/* column wise DCT matrices for 4 5, and 8 dim */ -/*----------------------------------------------------------------------------------* - * Param ISM ROM tables - *----------------------------------------------------------------------------------*/ - -const Word16 Param_ISM_band_grouping[MAX_PARAM_ISM_NBANDS + 1] = -{ - 0, 1, 2, 3, 4, 6, 8, 11, 15, 21, 31, 60 -}; - -/*----------------------------------------------------------------------------------* - * LFE coding ROM tables - *----------------------------------------------------------------------------------*/ - -const ivas_lfe_freq_models ivas_str_lfe_freq_models = -{ - { 16384, 14924, 13463, 12003, 10542, 9082, 7622, 6161, - 4701, 4336, 3970, 3605, 3240, 2875, 2510, 2145, - 1780, 1689, 1597, 1506, 1415, 1323, 1232, 1141, - 1050, 1004, 958, 913, 867, 821, 776, 730, - 685, 639, 593, 548, 502, 456, 411, 365, - 319, 297, 274, 251, 228, 205, 183, 160, - 137, 126, 114, 103, 91, 80, 68, 57, - 46, 40, 34, 29, 23, 17, 11, 6, 0 }, - - { 16384, 13463, 10542, 7622, 4701, 3970, 3240, 2510, - 1780, 1597, 1415, 1232, 1050, 958, 867, 776, - 685, 593, 502, 411, 319, 274, 228, 183, - 137, 114, 91, 68, 46, 34, 23, 11, 0 }, - - { 16384, 4701, 1780, 1050, 685, 319, 137, 46, - 0, }, - - { 16384, 3277, 0 }, - - { 16384, 13463, 10542, 7622, 4701, 3970, 3240, 2510, - 1780, 1597, 1415, 1232, 1050, 958, 867, 776, - 685, 593, 502, 411, 319, 274, 228, 183, - 137, 114, 91, 68, 46, 34, 23, 11, - 0 }, - - { 16384, 10542, 4701, 3240, 1780, 1415, 1050, 867, - 685, 502, 319, 228, 137, 91, 46, 23, - 0 }, - - { 16384, 4468, 1489, 745, 0 }, 0, -}; - -const Word16 ivas_lfe_num_ele_in_coder_models[2][4] = -{ - { 63, 31, 7, 1 },{ 31, 15, 3, 0 } -}; - -const Word16 ivas_lfe_log2_num_ele_in_coder_models_fx[2][4] = -{ - { 6, 5, 3, 1 },{ 5, 4, 2, 0 } -}; - -const Word16 ivas_lfe_num_dct_pass_bins_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP] = { 8, 6 }; - -const Word16 ivas_lfe_min_shift_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP] = { 1, 0 }; - -const Word16 ivas_lfe_lpf_delay_Q15[2] = { 57, 114 }; - -const Word16 dirac_gains_P_idx[16] = -{ - -1, 1, 0, 1, 4, 3, 2, 3, 4, 8, 7, 6, 5, 6, 7, 8 -}; - -/*----------------------------------------------------------------------------------* - * FB ROM tables - *----------------------------------------------------------------------------------*/ - -const Word32 ivas_fb_fcs_12band_1ms_fx[IVAS_FB_BANDS_12] = -{ - 17895696, 53687092, 89478488, 125269880, - 161061280, 196852672, 232644064, 304226848, - 465288128, 715827904, 1091637520, 1735882615 -};/*Q31*/ - -const Word16 ivas_fb_abs_bins_per_band_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12] = -{ - { 24, 30, 30, 30, 30, 30, 42, 76, 124, 182, 291, 367 }, - { 24, 30, 30, 30, 30, 30, 42, 76, 124, 182, 260, 47 }, - { 24, 30, 30, 30, 30, 30, 42, 75, 122, 73, 0, 0 } -}; - -const Word16 ivas_fb_abs_bins_start_offset_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12] = -{ - {0, 9, 25, 41, 57, 73, 88, 110, 158, 246, 380, 593 }, - {0, 9, 25, 41, 57, 73, 88, 110, 158, 246, 380, 593 }, - {0, 9, 25, 41, 57, 73, 88, 110, 159, 247, 0, 0 } -}; - -const Word16 ivas_fb_bins_per_band_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12] = -{ - { - IVAS_FB_12_1MS_48K_END_BINS_BAND_0 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_0, - IVAS_FB_12_1MS_48K_END_BINS_BAND_1 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_1, - IVAS_FB_12_1MS_48K_END_BINS_BAND_2 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_2, - IVAS_FB_12_1MS_48K_END_BINS_BAND_3 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_3, - IVAS_FB_12_1MS_48K_END_BINS_BAND_4 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_4, - IVAS_FB_12_1MS_48K_END_BINS_BAND_5 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_5, - IVAS_FB_12_1MS_48K_END_BINS_BAND_6 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_6, - IVAS_FB_12_1MS_48K_END_BINS_BAND_7 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_7, - IVAS_FB_12_1MS_48K_END_BINS_BAND_8 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_8, - IVAS_FB_12_1MS_48K_END_BINS_BAND_9 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_9, - IVAS_FB_12_1MS_48K_END_BINS_BAND_10 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_10, - IVAS_FB_12_1MS_48K_END_BINS_BAND_11 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_11 - }, - { - IVAS_FB_12_1MS_32K_END_BINS_BAND_0 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_0, - IVAS_FB_12_1MS_32K_END_BINS_BAND_1 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_1, - IVAS_FB_12_1MS_32K_END_BINS_BAND_2 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_2, - IVAS_FB_12_1MS_32K_END_BINS_BAND_3 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_3, - IVAS_FB_12_1MS_32K_END_BINS_BAND_4 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_4, - IVAS_FB_12_1MS_32K_END_BINS_BAND_5 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_5, - IVAS_FB_12_1MS_32K_END_BINS_BAND_6 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_6, - IVAS_FB_12_1MS_32K_END_BINS_BAND_7 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_7, - IVAS_FB_12_1MS_32K_END_BINS_BAND_8 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_8, - IVAS_FB_12_1MS_32K_END_BINS_BAND_9 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_9, - IVAS_FB_12_1MS_32K_END_BINS_BAND_10 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_10, - IVAS_FB_12_1MS_32K_END_BINS_BAND_11 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_11 - }, - { - IVAS_FB_12_1MS_16K_END_BINS_BAND_0 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_0, - IVAS_FB_12_1MS_16K_END_BINS_BAND_1 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_1, - IVAS_FB_12_1MS_16K_END_BINS_BAND_2 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_2, - IVAS_FB_12_1MS_16K_END_BINS_BAND_3 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_3, - IVAS_FB_12_1MS_16K_END_BINS_BAND_4 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_4, - IVAS_FB_12_1MS_16K_END_BINS_BAND_5 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_5, - IVAS_FB_12_1MS_16K_END_BINS_BAND_6 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_6, - IVAS_FB_12_1MS_16K_END_BINS_BAND_7 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_7, - IVAS_FB_12_1MS_16K_END_BINS_BAND_8 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_8, - IVAS_FB_12_1MS_16K_END_BINS_BAND_9 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_9, - IVAS_FB_12_1MS_16K_END_BINS_BAND_10 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_10, - IVAS_FB_12_1MS_16K_END_BINS_BAND_11 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_11 - }, -}; - -const Word16 ivas_fb_bins_start_offset_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12] = -{ - { - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_0, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_1, - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_2, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_3, - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_4, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_5, - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_6, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_7, - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_8, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_9, - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_10, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_11 - }, - { - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_0, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_1, - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_2, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_3, - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_4, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_5, - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_6, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_7, - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_8, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_9, - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_10, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_11 - }, - { - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_0, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_1, - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_2, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_3, - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_4, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_5, - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_6, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_7, - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_8, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_9, - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_10, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_11 - }, -}; - - -const Word16 ivas_num_active_bands[FB - WB + 1] = -{ - IVAS_16K_12BANDS_ACTIVE_BANDS, IVAS_FB_BANDS_12, IVAS_FB_BANDS_12 -}; - -/*------------------------------------------------------------------------------------------* - * SNS MSVQ codebooks and means - *------------------------------------------------------------------------------------------*/ - -const Word16 ivas_sns_cdbks_tcx20_levels[SNS_MSVQ_NSTAGES_TCX20] = { 128, 64, 32, 32 }; - -const Word16 ivas_sns_cdbks_tcx20_bits[SNS_MSVQ_NSTAGES_TCX20] = { 7, 6, 5, 5 }; - -/* pre-rounded codebook vectors for singed Q4.12 represantation */ - -const Word16 ivas_sns_cdbks_tcx10_levels[SNS_MSVQ_NSTAGES_TCX10] = { 128, 32, 8 }; - -const Word16 ivas_sns_cdbks_tcx10_bits[SNS_MSVQ_NSTAGES_TCX10] = { 7, 5, 3 }; - - -const Word16 ivas_sns_cdbks_side_tcx20_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 32 }; -const Word16 ivas_sns_cdbks_side_tcx20_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 5 }; -const Word16 ivas_sns_cdbks_side_tcx10_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 8 }; -const Word16 ivas_sns_cdbks_side_tcx10_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 3 }; - - -const Word16 sns_1st_cdbk[2][2][8 * 32] = -{ - { /* split 1 */ - { /* TCX 20 */ - -10900, -11064, -10637, -10471, -9051, -6381, -4688, -2438, - -2119, -5087, -6702, -8118, -7586, -6343, -4828, -3406, - 2004, -3443, -4289, -3757, -3234, -2952, -2313, -1781, - 1749, 5598, 3916, 732, -1472, -2964, -3275, -2332, - -11978, -14369, -5600, -545, 981, -929, -57, 1903, - 1745, 391, 202, 115, 256, -291, -862, -1637, - -4052, 2059, 4709, 6768, 5595, 1975, -1723, -1218, - 2093, 7263, 8679, 7576, 3701, -2438, -4389, -2686, - -7120, -6279, -5715, -5520, -4752, -3125, -1856, -438, - 8131, -2543, -6285, -6723, -5588, -4321, -3264, -2164, - -653, -1301, -660, 608, 1598, 1805, 1698, 760, - 4882, 9309, 6333, 1734, 284, 364, 560, 1015, - -7686, -5737, -3443, -1642, 245, 1531, 1827, 1769, - -1468, 3782, 144, -5130, -6883, -5165, -1497, 2072, - -12937, -8429, -2619, 2894, 5004, 4710, 4627, 3740, - 3198, 3928, 4358, 4554, 3887, 2844, 1299, 129, - -13828, -12296, -9364, -7918, -5571, -1909, 307, 2047, - -4314, -1211, -559, -1061, -1928, -2228, -2359, -1902, - -309, -3224, -3404, -1895, -743, -59, 757, 908, - 10914, 5865, 1599, -386, -1392, -2285, -2236, -2042, - -11825, -16241, -11402, -3627, 6556, 8953, 6421, 1546, - 6102, 777, -301, 536, 902, 541, 210, -429, - -3052, 3997, 5389, 1842, -344, 1556, 2667, 2428, - 11788, 10894, 7448, 5423, 2372, -677, -2385, -3839, - -45, -7602, -8923, -7179, -3273, 65, 4500, 6726, - 5895, 626, -1610, -2598, -3240, -3540, -2930, -2156, - -971, 461, 1494, 4907, 5859, 5199, 3678, 2502, - 10766, 5297, 1844, 1236, 2498, 3503, 2846, 838, - -7816, -1212, 891, 2387, 1317, 2225, 1859, 1602, - 2376, 5357, 2088, -2719, -3419, -420, 2431, 2943, - -8383, -795, 4351, 7026, 7460, 7191, 5262, 3796, - 1522, 6283, 8714, 8222, 7434, 5768, 3586, 1499, - }, - { /* TCX 10 */ - -15596, -16321, -10264, -1002, 5955, 5543, -29, -1688, - 17, -3794, -6207, -7356, -6998, -6081, -4453, -2448, - -12543, -11530, -10186, -8817, -7083, -4440, -1946, 892, - 5198, 2751, -274, -2574, -4561, -6087, -5944, -4600, - -683, -2640, -2753, -1195, -239, -217, -286, 90, - -1400, -1146, -1853, -2845, -3456, -3788, -3171, -1969, - -1835, 392, 1725, 1209, -392, -1640, -2001, -1608, - 5770, 7707, 5210, 2112, -382, -2088, -2634, -3007, - -10766, -8101, -5137, -3754, -1881, 331, 2339, 3679, - -2637, -4640, -5811, -5651, -3790, -1359, 913, 1893, - -7793, -4768, -1762, -545, -717, -837, -441, -75, - 4030, 1770, 467, 379, 10, -1330, -2398, -2290, - -9395, -6952, -2494, 2022, 4753, 5614, 4443, 2642, - -1486, 1748, 859, -2586, -3368, -638, 2761, 3269, - -2408, 306, 3633, 6567, 5950, 2474, -621, -1421, - 5478, 7986, 9498, 8165, 5477, 1244, -523, -1586, - -13564, -14673, -10597, -5504, 1575, 8248, 7662, 4025, - 4978, -682, -3586, -4305, -3703, -3001, -2227, -1278, - -8002, -6831, -5558, -4868, -4243, -3393, -2486, -1110, - 11485, 5472, 1645, -533, -1792, -2814, -3169, -2706, - 1617, 421, 232, 1382, 2162, 2017, 1318, 744, - 3677, 5212, 1990, -1514, -2894, -2441, -451, 592, - 731, 4295, 5860, 3756, 1991, 1437, 869, 127, - 12736, 11722, 7768, 4682, 1574, -744, -1989, -3131, - -3490, -4269, -3681, -1531, 1111, 3327, 4138, 3815, - 7344, 1400, -1302, -1502, -1015, 57, 1212, 1498, - -4836, -1881, 1071, 2055, 2114, 2465, 2093, 1458, - 8569, 5879, 3654, 2879, 2530, 1703, 781, -233, - -3709, -990, 2338, 6227, 7083, 7102, 5657, 3401, - 3389, 6392, 5267, 1011, 275, 3519, 5236, 4339, - 599, 3752, 6943, 9211, 8152, 5568, 3337, 1838, - 9885, 9591, 7905, 8068, 7929, 7421, 4234, 757, - } - }, - { /* split 2 */ - { /* TCX 20 */ - -178, -3476, -5982, -7081, -7548, -7440, -6859, -5798, - -3596, -3670, -1501, 770, 812, -286, -2001, -3377, - -3998, -5191, -4988, -4421, -3889, -3571, -2738, -1969, - -2981, -2687, -1501, -83, 1136, 2377, 3248, 4105, - 1842, -41, -1972, -4282, -6779, -8405, -8674, -7835, - -259, 571, 2124, 3344, 2959, 1407, -750, -2523, - -524, -1956, -2855, -3202, -3939, -4666, -4907, -4782, - -5110, -4768, -3017, -663, 4188, 9210, 16602, 21081, - 4373, 4846, -603, -6495, -7289, -5540, -4749, -5527, - -1448, -1043, -619, -105, 356, 362, 542, 857, - 1373, -752, -5334, -6244, -3001, -932, -1040, -3125, - -2403, -1397, 612, 2449, 3920, 5231, 6819, 8581, - 2183, 1211, -111, -1084, -2836, -4977, -6701, -7284, - -751, 1255, 3408, 6474, 7503, 7026, 5413, 4464, - 935, 850, 589, 353, 160, -434, -939, -931, - 268, 2284, 3884, 5423, 6680, 7996, 9244, 9472, - 1075, 113, -1289, -4457, -7512, -5930, -1799, -571, - -3689, -4254, -3755, -2995, -1581, -135, 1049, 1589, - -1166, -1752, -1790, -1897, -1927, -1831, -1359, -805, - -1494, -735, 635, 1993, 2909, 3546, 4226, 4956, - 4435, 4299, 4269, 1328, -3731, -7621, -9319, -9170, - 1358, 2227, 3873, 4469, 4692, 4057, 2601, 1608, - 813, 398, -499, -666, -1286, -2271, -3316, -4025, - -3300, -1255, 2181, 6431, 10002, 12760, 13549, 12584, - 3714, 4180, 484, -2905, -2864, -1359, -1256, -2477, - 308, 868, 1373, 1629, 1793, 1834, 1814, 1746, - 1472, 798, -282, -1935, -1818, 320, 2221, 2914, - 2281, 3240, 2988, 1400, 2383, 4072, 5667, 6675, - 2672, 2678, 2874, 2096, -226, -2301, -3861, -4534, - 4988, 7231, 7641, 7731, 7061, 6447, 5411, 3513, - 3978, 4156, 4126, 2896, 1469, 759, 368, -68, - -264, 4210, 8534, 11008, 11606, 11888, 11072, 8949, - }, - { /* TCX 10 */ - -2852, -6158, -7231, -7830, -8012, -7922, -7556, -6706, - -3911, -5340, -5053, -4741, -4805, -4484, -3727, -3037, - -966, -1461, -1694, -2427, -3081, -3037, -2547, -2230, - -3455, -3315, -2451, -836, 1383, 3196, 3720, 3379, - 3052, 281, -3351, -6866, -9051, -9586, -8983, -8236, - -748, -4465, -4314, -2251, 29, -40, -3963, -6195, - 200, 1293, 2535, 2803, 1603, -186, -1397, -1697, - -1707, -265, 2196, 5295, 5894, 4216, 3440, 3826, - -237, -2133, -2279, -3149, -4377, -5638, -6520, -6764, - -2407, -2049, -1246, -664, -521, -430, -349, -211, - 3874, 1335, -1501, -2055, -1268, -990, -1852, -2871, - -1883, -1845, -1681, -484, 384, 2035, 5839, 9597, - 275, 380, 1048, 424, -1146, -3012, -4431, -5104, - -1699, -484, 756, 1261, 1279, 1377, 1975, 2590, - 2139, 4502, 3645, 4975, 6491, 5972, 5012, 4346, - -3821, -2581, -433, 2667, 6436, 10038, 11311, 8783, - 2359, -2689, -6604, -7039, -5992, -4268, -3711, -4840, - -2776, -4251, -4539, -3672, -2494, -1055, 280, 695, - 491, 866, 822, -44, -1009, -1165, -831, -538, - -1024, 91, 786, 1295, 2433, 3910, 4975, 5403, - 3117, 2590, 2337, -667, -4580, -8147, -9400, -9523, - -103, -630, -831, 669, 3062, 3398, 549, -1690, - 2113, 3467, 4279, 5047, 5344, 3361, 127, -2313, - -1199, 1153, 2914, 3688, 4260, 5421, 7471, 8831, - 2815, 2184, 316, -3058, -5596, -5564, -4343, -3793, - 922, 126, -1414, -1731, -1007, 359, 2029, 3088, - 4889, 4619, 2537, 1114, 950, 946, 799, 419, - -4271, -3750, -3359, -484, 1448, 4106, 10487, 20479, - 3818, 4687, 4064, 2212, -172, -2287, -3535, -4041, - 884, 2456, 3394, 2925, 2182, 2323, 2583, 2507, - 4767, 8057, 8263, 6461, 5003, 4055, 2923, 1845, - 19, 3813, 6926, 8432, 10141, 10850, 9692, 8383, - } - } -}; - -const Word16 sns_1st_means_16k[2][16] = -{ - { /* TCX 20 */ - 14210, 19017, 14362, 9309, 5385, 2674, 1055, -211, -1407, -3059, -4393, -8597, -11180, -11756, -12131, -13281, - }, - { /* TCX 10*/ - 12018, 15915, 11089, 6015, 847, -705, -539, -1548, -893, -2163, -1806, -4189, -7017, -8670, -8874, -9480, - } -}; - -const Word16 sns_1st_means_25k6[2][16] = -{ - { /* TCX 20 */ - 14973, 20323, 16461, 9554, 4017, 3103, 1602, 1694, -221, -1401, -6817, -10071, -11503, -11805, -13158, -16749, - }, - { /* TCX 10 */ - 15560, 19489, 14623, 5595, 2084, 1699, 775, -1312, -2195, -6101, -9078, -9465, -7825, -6603, -7281, -9960, - } -}; - -const Word16 sns_1st_means_32k[2][16] = -{ - { /* TCX 20 */ - 15041, 20603, 16969, 10289, 4973, 4283, 3003, 3316, 1684, -259, -6614, -9535, -10363, -11834, -16625, -24930, - }, - { /* TCX 10 */ - 16510, 20660, 16025, 7224, 3921, 3868, 2623, 742, -1316, -6269, -8284, -7288, -6380, -8410, -13351, -20277, - } -}; - - -/*----------------------------------------------------------------------* - * MC ParamUpmix ROM tables - *-----------------------------------------------------------------------*/ - -const Word16 ivas_param_upmx_mx_qmap[33] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0 -}; diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index 6004760e31a69763dc430d498db97f83fa238e66..bcc0c26f1317ae58ad3b105ed34120d462456be3 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -78,6 +78,29 @@ extern const UWord16 ECSQ_tab_inverse[1 + ECSQ_SEGMENT_SIZE]; /*----------------------------------------------------------------------------------* * Stereo ICA ROM tables *----------------------------------------------------------------------------------*/ + +extern const Word32 ica_sincInterp2_fx[]; // Q31 +extern const Word32 ica_sincInterp4_fx[]; // Q31 +extern const Word32 ica_sincInterp6_fx[]; // Q31 + +/*----------------------------------------------------------------------------------* + * Stereo IC-BWE ROM tables + *----------------------------------------------------------------------------------*/ + +extern const Word16 pow_10_icbwe_gsMapping_tbl_fx[]; +extern const Word16 pow_10_icbwe_gsMappingDFT_tbl_fx[]; + +extern const Word16 icbwe_gsMapping_tbl_fx[]; +extern const Word16 icbwe_gsMappingDFT_tbl_fx[]; + +/*----------------------------------------------------------------------------------* + * TD Stereo ROM tables + *----------------------------------------------------------------------------------*/ + +extern const UWord32 tdm_ratio_tabl_fx[TDM_NQ + 1]; +extern const Word32 tdm_ratio_tabl_fx_Q30[TDM_NQ + 1]; +extern const Word32 tdm_ratio_tabl_fx_Q24[TDM_NQ + 1]; +extern const UWord32 tdm_den_ratio_tabl_fx[]; extern const Word16 tdm_bit_allc_tbl[5][6]; /* LSFs Intra-frame prediction tables */ @@ -97,7 +120,6 @@ extern const Word16 tdm_LSF_MEAN_PRED_QNT_IN_fx[M]; extern const Word16 tdm_LSF_MEAN_PRED_QNT_fx[M]; extern const Word16 tdm_PRED_QNT_fixed_beta_prd_diag_3_fx[15 + 16 + 15]; - extern const Word16 fast_FCB_bits_2sfr[]; extern const Word16 fast_FCB_rates_2sfr[]; @@ -111,9 +133,14 @@ extern const SpectrumWarping sw32000Hz[]; /* PsychLPC */ extern const MDCTStereoBands_config mdctStereoBands_32000_640[]; +extern const Word16 mdct_stereo_dtx_coherence_bandlengths[MDCT_ST_DTX_NUM_COHERENCE_BANDS]; +extern const Word16 get_next_index_4_by_15[16]; + + /*----------------------------------------------------------------------------------* * Stereo DTX ROM tables *----------------------------------------------------------------------------------*/ + extern const Word16 dft_cng_coh_pred_fx[][STEREO_DFT_COH_PRED_COEFFS]; extern const Word16 dft_cng_coh_u2i[9]; extern const Word16 dft_cng_coh_i2u[9]; @@ -123,6 +150,10 @@ extern const Word16 dft_cng_coh_alpha_start[STEREO_DFT_N_COH_ALPHA_STEPS - 1]; /*----------------------------------------------------------------------------------* * DirAC ROM tables *----------------------------------------------------------------------------------*/ + +extern const Word32 diffuseness_reconstructions_fx[DIRAC_DIFFUSE_LEVELS]; +extern const Word32 diffuseness_thresholds_fx[DIRAC_DIFFUSE_LEVELS + 1]; +extern const Masa_Diffuseness_Ratios masa_diffuse_ratios[DIRAC_DIFFUSE_LEVELS][DIRAC_DIFFUSE_LEVELS]; extern const Word16 DirAC_band_grouping_12[12 + 1]; extern const Word16 DirAC_band_grouping_6[6 + 1]; extern const Word16 DirAC_band_grouping_5[5 + 1]; @@ -131,6 +162,8 @@ extern const Word16 DirAC_block_grouping_5ms_MDFT[MAX_PARAM_SPATIAL_SUBFRAMES + extern const Word32 c_weights_fx[DIRAC_NO_FB_BANDS_MAX]; // Q30 +extern const Word16 ivas_divde_255[256]; + /*------------------------------------------------------------------------------------------* * SPAR ROM tables *------------------------------------------------------------------------------------------*/ @@ -153,6 +186,9 @@ extern const Word16 dtx_pr_real_q_levels[3][3]; extern const Word16 pr_pr_idx_pairs[3][3][2]; extern const Word16 pr_pd_idx_pairs[3][3][2]; +extern const Word32 dtx_pd_real_min_max_fx[2]; +extern const Word32 one_by_q_level[64]; + /*----------------------------------------------------------------------* * PCA ROM tables *-----------------------------------------------------------------------*/ @@ -162,7 +198,6 @@ extern const Word16 ivas_pca_offset_index2[2692]; extern const Word16 ivas_pca_offset_n2[IVAS_PCA_N1]; extern const Word16 ph1_q_n2_tbl[IVAS_PCA_N1][2]; - /*----------------------------------------------------------------------------------* * Parametric MC ROM tables *----------------------------------------------------------------------------------*/ @@ -182,7 +217,7 @@ extern const Word16 param_mc_start_bin_per_band_14[14]; extern const Word16 param_mc_active_bins_per_band_14[14]; extern const Word16 param_mc_start_bin_per_band_10[10]; extern const Word16 param_mc_active_bins_per_band_10[10]; -extern const Word16 Param_MC_index[MAX_CICP_CHANNELS]; +extern const Word16 Param_MC_index[MAX_LS_CHANNELS]; extern const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS]; extern const UWord16 ivas_param_mc_cum_freq_ild_cicp6_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1]; extern const UWord16 ivas_param_mc_sym_freq_ild_cicp6_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; @@ -220,11 +255,15 @@ extern const UWord16 ivas_param_mc_sym_freq_icc_combined_48_16bits[PARAM_MC_SZ_I extern const UWord16 ivas_param_mc_cum_freq_icc_delta_combined_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER]; extern const UWord16 ivas_param_mc_sym_freq_icc_delta_combined_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1]; +extern const Word16 ivas_param_mc_quant_ild_5d1_48_fx[PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; +extern const Word16 ivas_param_mc_quant_icc_fx[PARAM_MC_SZ_ICC_QUANTIZER]; /*----------------------------------------------------------------------------------* * MASA ROM tables *----------------------------------------------------------------------------------*/ +extern const UWord8 ivasmasaFormatDescriptor[8]; /* "IVASMASA" */ + extern const Word16 bits_direction_masa[DIRAC_DIFFUSE_LEVELS]; extern const Word16 no_theta_masa[NO_SPHERICAL_GRIDS - 2]; extern const Word16 no_phi_masa[NO_SPHERICAL_GRIDS][MAX_NO_THETA]; @@ -256,32 +295,129 @@ extern const UWord8 masa_twodir_bands_joined[]; extern const Word64 diffuseness_reconstructions_hr_fx[HR_MASA_ER_LEVELS]; extern const Word32 diffuseness_thresholds_hr_fx[HR_MASA_ER_LEVELS + 1]; +extern const Word32 no_phi_masa_inv_fx[NO_SPHERICAL_GRIDS][MAX_NO_THETA]; +extern const Word32 azimuth_cb_fx[8]; +extern const Word32 delta_theta_masa_fx[NO_SPHERICAL_GRIDS - 2]; +extern const Word32 delta_theta_masa_inv_fx[NO_SPHERICAL_GRIDS - 2]; +extern const Word16 coherence_cb0_masa_Q14[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH]; +extern const Word32 coherence_cb0_masa_fx[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH]; +extern const Word16 coherence_cb1_masa_Q15[MASA_NO_CV_COH1 * MASA_MAXIMUM_CODING_SUBBANDS]; /* 25 */ +extern const Word32 coherence_cb1_masa_fx[MASA_NO_CV_COH1 * MASA_MAXIMUM_CODING_SUBBANDS]; /* 25 */ + +/* Multi-channel input and output setups */ +extern const Word16 ls_azimuth_CICP2_idx[2]; +extern const Word16 ls_elevation_CICP2_idx[2]; +extern const Word16 ls_azimuth_CICP6_idx[5]; +extern const Word16 ls_elevation_CICP6_idx[5]; +extern const Word16 ls_azimuth_CICP12_idx[7]; +extern const Word16 ls_elevation_CICP12_idx[7]; +extern const Word16 ls_azimuth_CICP14_idx[7]; +extern const Word16 ls_elevation_CICP14_idx[7]; +extern const Word16 ls_azimuth_CICP16_idx[9]; +extern const Word16 ls_elevation_CICP16_idx[9]; +extern const Word16 ls_azimuth_CICP19_idx[11]; +extern const Word16 ls_elevation_CICP19_idx[11]; + +extern const Word32 shoebox_sin_cos_tbl_fx[11][2]; + +extern const Word32 delta_phi_val[90]; +extern const Word32 inv_delta_phi_val[90]; +extern const Word32 dd_val[90]; +extern const Word32 cb_azi_chan_fx[]; // Q22 +extern const Word16 cb_azi_chan_16fx[]; // Q0 + +/* Multi-channel input and output setups */ +extern const Word32 ls_azimuth_CICP1_fx[1]; +extern const Word32 ls_elevation_CICP1_fx[1]; +extern const Word32 ls_azimuth_CICP2_fx[2]; +extern const Word32 ls_elevation_CICP2_fx[2]; +extern const Word32 ls_azimuth_CICP6_fx[5]; +extern const Word32 ls_elevation_CICP6_fx[5]; +extern const Word32 ls_azimuth_CICP12_fx[7]; +extern const Word32 ls_elevation_CICP12_fx[7]; +extern const Word32 ls_azimuth_CICP14_fx[7]; +extern const Word32 ls_elevation_CICP14_fx[7]; +extern const Word32 ls_azimuth_CICP16_fx[9]; +extern const Word32 ls_elevation_CICP16_fx[9]; +extern const Word32 ls_azimuth_CICP19_fx[11]; +extern const Word32 ls_elevation_CICP19_fx[11]; +extern const Word16 pow_10_q11[128]; +extern const Word32 pow_10_q23[14]; +extern const Word16 ivas_sin_az_fx[361]; +extern const Word16 ivas_sine_panning_tbl_fx[601]; +extern const Word16 ivas_tan_panning_gain_dirac_tbl_fx[601]; + +extern const UWord16 cum_n_for_id_th[122]; + +extern const Word16 gridEq_Table[NO_THETA16_MAX]; +extern const Word32 McMASA_LFEGain_vectors_fx[64]; /* Q25 */ + /*----------------------------------------------------------------------------------* * MASA and ISM (OMASA) combined format ROM tables *----------------------------------------------------------------------------------*/ extern const Word32 sep_object_brate[][MAX_NUM_OBJECTS]; +extern const Word32 dct4_fx[]; +extern const Word32 dct5_fx[]; +extern const Word32 dct8_fx[]; +extern const Word32 dct12_fx[]; + /*----------------------------------------------------------------------------------* * Param ISM ROM tables *----------------------------------------------------------------------------------*/ +extern const Word32 ism_azimuth_borders_fx[4]; +extern const Word32 ism_elevation_borders_fx[4]; + extern const Word16 Param_ISM_band_grouping[MAX_PARAM_ISM_NBANDS + 1]; /*----------------------------------------------------------------------------------* * LFE coding ROM tables *----------------------------------------------------------------------------------*/ - extern const Word16 ivas_lfe_num_ele_in_coder_models[2][4]; extern const Word16 ivas_lfe_log2_num_ele_in_coder_models_fx[2][4]; extern const Word16 ivas_lfe_num_dct_pass_bins_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP]; extern const Word16 ivas_lfe_min_shift_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP]; extern const ivas_lfe_freq_models ivas_str_lfe_freq_models; extern const Word16 ivas_lfe_lpf_delay_Q15[2]; +extern const Word32 ivas_lfe_lpf_delay_ns[2]; extern const Word16 dirac_gains_P_idx[16]; +extern const Word32 ivas_lpf_4_butter_16k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word16 ivas_lpf_4_butter_16k_sos_e[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word32 ivas_lpf_4_butter_32k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word16 ivas_lpf_4_butter_32k_sos_e[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word32 ivas_lpf_4_butter_48k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word16 ivas_lpf_4_butter_48k_sos_e[IVAS_BIQUAD_FILT_LEN << 2]; +#ifndef NONBE_FIX_MC_LFE_LPF +extern const Word32 ivas_lpf_2_butter_16k_fx[IVAS_BIQUAD_FILT_LEN << 1]; +extern const Word32 ivas_lpf_2_butter_32k_fx[IVAS_BIQUAD_FILT_LEN << 1]; +extern const Word32 ivas_lpf_2_butter_48k_fx[IVAS_BIQUAD_FILT_LEN << 1]; +#endif + +extern const Word32 ivas_lfe_window_coeff_48k_fx[IVAS_LFE_FADE_LEN_48K]; // Q31 +extern const Word32 ivas_lfe_window_coeff_32k_fx[IVAS_LFE_FADE_LEN_32K]; // Q31 +extern const Word32 ivas_lfe_window_coeff_16k_fx[IVAS_LFE_FADE_LEN_16K]; // Q31 + +extern const UWord32 d_hamm_lfe_plc_fx[LFE_PLC_LENANA / 2]; + +/*------------------------------------------------------------------------------------------* + * MDFT/iMDFT ROM tables + *------------------------------------------------------------------------------------------*/ + +extern const Word32 ivas_mdft_coeff_cos_twid_240_fx[IVAS_240_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_160_fx[IVAS_160_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_120_fx[IVAS_120_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_80_fx[IVAS_80_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_40_fx[IVAS_40_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_960_fx[IVAS_960_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_640_fx[IVAS_640_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_320_fx[IVAS_320_PT_LEN + 1]; +extern const Word32 dirac_gains_trg_term_fx[181][2]; + /*------------------------------------------------------------------------------------------* * FB ROM tables *------------------------------------------------------------------------------------------*/ @@ -293,9 +429,18 @@ extern const Word16 ivas_fb_bins_start_offset_12band_1ms[IVAS_NUM_SUPPORTED_FS][ extern const Word16 ivas_fb_abs_bins_per_band_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12]; extern const Word16 ivas_fb_abs_bins_start_offset_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12]; - extern const Word16 ivas_num_active_bands[FB - WB + 1]; +extern const Word16 ivas_fb_cf_4ms_48k_fx[IVAS_FB_4MS_48K_SAMP]; +extern const Word16 ivas_fb_cf_1ms_48k_fx[IVAS_FB_1MS_48K_SAMP]; +extern const Word16 ivas_fb_cf_4ms_32k_fx[IVAS_FB_4MS_32K_SAMP]; +extern const Word16 ivas_fb_cf_1ms_32k_fx[IVAS_FB_1MS_32K_SAMP]; +extern const Word16 ivas_fb_cf_4ms_16k_fx[IVAS_FB_4MS_16K_SAMP]; +extern const Word16 ivas_fb_cf_1ms_16k_fx[IVAS_FB_1MS_16K_SAMP]; + +extern const Word32 ivas_fb_resp_cheby_ramp_32del_fx[IVAS_FB_1MS_32K_SAMP + 1]; +extern const Word32 ivas_fb_resp_cheby_ramp_16del_fx[IVAS_FB_1MS_16K_SAMP + 1]; + /*------------------------------------------------------------------------------------------* * SNS MSVQ codebooks and means *------------------------------------------------------------------------------------------*/ @@ -306,19 +451,22 @@ extern const Word16 ivas_sns_cdbks_tcx20_bits[]; extern const Word16 ivas_sns_cdbks_tcx10_levels[]; extern const Word16 ivas_sns_cdbks_tcx10_bits[]; - extern const Word16 ivas_sns_cdbks_side_tcx20_levels[]; extern const Word16 ivas_sns_cdbks_side_tcx20_bits[]; extern const Word16 ivas_sns_cdbks_side_tcx10_levels[]; extern const Word16 ivas_sns_cdbks_side_tcx10_bits[]; - /* means and codebooks for the split VQ in the 2-stage SNS VQ */ extern const Word16 sns_1st_cdbk[2][2][8 * 32]; extern const Word16 sns_1st_means_16k[2][16]; extern const Word16 sns_1st_means_25k6[2][16]; extern const Word16 sns_1st_means_32k[2][16]; +extern const Word16 *const ivas_sns_cdbks_tcx20_fx[]; +extern const Word16 *const ivas_sns_cdbks_tcx10_fx[]; + +extern const Word16 *const ivas_sns_cdbks_side_tcx20_fx[]; +extern const Word16 *const ivas_sns_cdbks_side_tcx10_fx[]; /*----------------------------------------------------------------------* * MC ParamUpmix ROM tables @@ -326,5 +474,45 @@ extern const Word16 sns_1st_means_32k[2][16]; extern const Word16 ivas_param_upmx_mx_qmap[33]; +extern const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_alpha_quant_table_fx; +extern const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_beta_quant_table_fx[9]; + +extern const Word32 ivas_han_win_48k_fx[L_FRAME32k]; +extern const Word32 ivas_han_win_32k_fx[L_FRAME32k]; +extern const Word32 ivas_han_win_16k_fx[L_FRAME32k]; + +extern const Word32 ivas_sine_delay_32_fx[32]; + +extern const Word32 ivas_sine_frame_len_640_del_32_fx[577]; +extern const Word32 ivas_sine_frame_len_640_del_16_fx[289]; + +extern const Word32 ivas_fb_fr_12band_1ms_re_fx[IVAS_FB_12_1MS_LEN]; +extern const Word32 ivas_fb_fr_12band_1ms_im_fx[IVAS_FB_12_1MS_LEN]; + +/*----------------------------------------------------------------------* + * Limiter tables + *-----------------------------------------------------------------------*/ + +extern const Word32 release_cnst_table[4][201]; // Q31 + +/*----------------------------------------------------------------------* + * MDCT/IMDCT tables + *-----------------------------------------------------------------------*/ + +extern const Word16 ivas_sin_twiddle_480_fx[IVAS_480_PT_LEN >> 1]; +extern const Word16 ivas_cos_twiddle_480_fx[IVAS_480_PT_LEN >> 1]; +extern const Word16 ivas_sin_twiddle_320_fx[IVAS_320_PT_LEN >> 1]; +extern const Word16 ivas_cos_twiddle_320_fx[IVAS_320_PT_LEN >> 1]; +extern const Word16 ivas_sin_twiddle_160_fx[IVAS_160_PT_LEN >> 1]; +extern const Word16 ivas_cos_twiddle_160_fx[IVAS_160_PT_LEN >> 1]; +extern const Word16 ivas_sin_twiddle_80_fx[IVAS_80_PT_LEN >> 1]; +extern const Word16 ivas_cos_twiddle_80_fx[IVAS_80_PT_LEN >> 1]; +extern const Word16 nf_tw_smoothing_coeffs_fx[N_LTP_GAIN_MEMS]; +extern const Word32 dft_res_gains_q_fx[][2]; +extern const Word16 dft_res_cod_alpha_fx[STEREO_DFT_BAND_MAX]; +extern const Word16 dft_trigo_12k8_fx[STEREO_DFT_N_12k8_ENC / 4 + 1]; +extern const Word16 dft_trigo_32k_fx[STEREO_DFT_N_32k_ENC / 4 + 1]; +extern const Word16 dft_trigo_48k_fx[STEREO_DFT_N_MAX_ENC / 4 + 1]; + /* IVAS_ROM_COM_H */ #endif diff --git a/lib_com/ivas_rom_com_fx.c b/lib_com/ivas_rom_com_fx.c index a7a8bdcbfd6176743ab5f8571aa3cb82905bd5fc..f0ae9f8605f0da400355b3df2ce15ee083f64e3c 100644 --- a/lib_com/ivas_rom_com_fx.c +++ b/lib_com/ivas_rom_com_fx.c @@ -35,12 +35,2877 @@ #include #include "cnst.h" #include "ivas_cnst.h" -#include "ivas_rom_com_fx.h" +#include "ivas_rom_com.h" #include "wmc_auto.h" +/* clang-format off */ + +/*----------------------------------------------------------------------------------* + * Table of IVAS bitrates + *----------------------------------------------------------------------------------*/ + +const Word32 ivas_brate_tbl[SIZE_IVAS_BRATE_TBL] = +{ + FRAME_NO_DATA, IVAS_SID_5k2, + IVAS_13k2, IVAS_16k4, IVAS_24k4, IVAS_32k, IVAS_48k, + IVAS_64k, IVAS_80k, IVAS_96k, IVAS_128k, IVAS_160k, + IVAS_192k, IVAS_256k, IVAS_384k, IVAS_512k +}; + + +/*------------------------------------------------------------------------- + * DFT Stereo ROM tables + *------------------------------------------------------------------------*/ + +/*4xERB scale: max of 14 bands*/ +const Word16 dft_band_limits_erb4[STEREO_DFT_ERB4_BANDS] = +{ + 1, 3, 5, 10, 18, 26, 41, 56, 84, 132, 214, 342, 470, 601 +}; + +/*8xERB scale: max of 8 bands*/ +const Word16 dft_band_limits_erb8[STEREO_DFT_ERB8_BANDS] = +{ + 1, 5, 18, 41, 84, 214, 470, 601 +}; + +const Word16 dft_band_ipd[3][4] = +{ + {0,8,10,13}, + {0,5,6,8}, + {0,2,3,4} +}; + +const Word16 dft_band_res_cod[3][4] = +{ + {0,8,10,11}, + {0,5,6,7}, + {0,5,6,7} +}; + +// Q31 +const Word32 dft_res_gains_q_Q31[][2] = +{ + /* quantization points for joint quantization of prediction gain and residual energy */ + + /* column 1 (|ILD| = 0): */ + {0, 0 }, + {0, 251216928 }, + {0, 487459456 }, + {0, 731632640 }, + {0, 997611392 }, + {0, 1299397248 }, + {0, 1666984192 }, + {0, 2147483647 }, + + /* column 2 (|ILD| = 2): */ + {246151024, 0 }, + {249475328, 247871152 }, + {258660112, 480729248 }, + {274304544, 720918848 }, + {298427200, 981720000 }, + {334663840, 1276185088 }, + {391374592, 1632160640 }, + {485919712, 2091786496 }, + + /* column 3 (|ILD| = 4): */ + {485919712, 0 }, + {492224736, 238188144 }, + {509610752, 461283776 }, + {539117184, 690072384 }, + {584326016, 936189056 }, + {651608832, 1210182144 }, + {755411712, 1534299776 }, + {924504576, 1938292992 }, + + /* column 4 (|ILD| = 6): */ + {713563712, 0 }, + {722237376, 223142880 }, + {746085184, 431184640 }, + {786311872, 642617280 }, + {847364864, 866812416 }, + {936938496, 1111020032 }, + {1072199936, 1390431232 }, + {1285225984, 1720430720 }, + + /* column 5 (|ILD| = 8): */ + {924504576, 0 }, + {934784576, 204139792 }, + {962942400, 393358880 }, + {1010083968, 583482048 }, + {1080789888, 781462848 }, + {1182728704, 991308544 }, + {1332741248, 1221608960 }, + {1559902080, 1475937536 }, + + /* column 6 (|ILD| = 10): */ + {1115604864, 0 }, + {1126709504, 182744416 }, + {1156997632, 351025536 }, + {1207276672, 517958016 }, + {1281710592, 688294272 }, + {1387005952, 863412992 }, + {1537761536, 1046870336 }, + {1757032448, 1234717184 }, + + /* column 7 (|ILD| = 13): */ + {1361843968, 0 }, + {1372924928, 149366080 }, + {1402942464, 285507936 }, + {1452130560, 417893888 }, + {1523515136, 548787328 }, + {1621670144, 677135936 }, + {1756740352, 802203264 }, + {1942499840, 915633344 }, + + /* column 8 (|ILD| = 16): */ + {1559902080, 0 }, + {1569913600, 117815248 }, + {1596862336, 224162928 }, + {1640492800, 325650848 }, + {1702660352, 423060736 }, + {1785997696, 514412544 }, + {1896788608, 597466432 }, + {2042241920, 664027712 }, + + /* column 9 (|ILD| = 19): */ + {1714196608, 0 }, + {1722634112, 90359672 }, + {1745223424, 171238192 }, + {1781415040, 247171072 }, + {1832190080, 318199104 }, + {1898830848, 382271424 }, + {1984989952, 437025792 }, + {2094086528, 475912448 }, + + /* column 10 (|ILD| = 22): */ + {1831427712, 0 }, + {1838194432, 67828272 }, + {1856228992, 128123168 }, + {1884882944, 183977072 }, + {1924581248, 235132272 }, + {1975822336, 279821408 }, + {2040659200, 316058048 }, + {2120554240, 339023232 }, + + /* column 11 (|ILD| = 25): */ + {1918819584, 0 }, + {1924055168, 50102940 }, + {1937964416, 94399088 }, + {1959916032, 135003712 }, + {1990038784, 171579648 }, + {2028424960, 202728896 }, + {2076217216, 226931040 }, + {2133943808, 240762976 }, + + /* column 12 (|ILD| = 30): */ + {2015827840, 0 }, + {2019068416, 29502130 }, + {2027636864, 55420112 }, + {2041056512, 78889960 }, + {2059271424, 99626064 }, + {2082150784, 116769424 }, + {2110128128, 129415952 }, + {2143192960, 135682304 }, + + /* column 13 (|ILD| = 35): */ + {2072441984, 0 }, + {2074364032, 17033840 }, + {2079438464, 31939524 }, + {2087347712, 45337676 }, + {2098012032, 57039312 }, + {2111296384, 66537632 }, + {2127368192, 73321536 }, + {2146126464, 76351632 }, + + /* column 14 (|ILD| = 40): */ + {2104959232, 0 }, + {2106073728, 9723806 }, + {2109011456, 18212808 }, + {2113579136, 25810606 }, + {2119712384, 32401234 }, + {2127314432, 37692632 }, + {2136458496, 41399188 }, + {2147054208, 42945376 }, + + /* column 15 (|ILD| = 45): */ + {2123466240, 0 }, + {2124103936, 5514738 }, + {2125783296, 10322954 }, + {2128390400, 14615774 }, + {2131882240, 18322330 }, + {2136200832, 21283710 }, + {2141376256, 23332410 }, + {2147348352, 24150602 }, + + /* column 16 (|ILD| = 50): */ + {2133943808, 0 }, + {2134306688, 3115998 }, + {2135260160, 5830418 }, + {2136737664, 8250632 }, + {2138715520, 10335839 }, + {2141157120, 11995844 }, + {2144077696, 13136157 }, + {2147440640, 13580687 } +}; + + +/* tables for adaptive Golomb-Rice coding of DFT stereo parameters */ +const Word16 dft_code_itd[] = +{ + 0, 3, 4, 13, 8, 9, 12, 5, 10, 44, 23, 60, 45, 31, 235, 59, 28, 61, 234, 116 +}; + +const Word16 dft_len_itd[] = +{ + 2, 3, 4, 4, 4, 4, 4, 4, 4, 6, 5, 6, 6, 5, 8, 6, 5, 6, 8, 7 +}; + +const Word16 dft_maps_rpg[] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, + 2, 0, 1, 3, 4, 5, 6, 7, + 6, 2, 0, 1, 3, 4, 5, 7, + 7, 5, 2, 0, 1, 3, 4, 6, + 7, 6, 4, 3, 1, 0, 2, 5, + 7, 6, 5, 3, 2, 1, 0, 4, + 7, 6, 5, 4, 3, 2, 0, 1, + 7, 6, 5, 4, 3, 2, 0, 1, + 6, 5, 4, 3, 1, 0, 2, 7, +}; + +const Word16 dft_maps_sg[NO_SYMB_GR_SIDE_G * NO_SYMB_GR_SIDE_G] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 15, 4, 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 12, 9, 4, 1, 0, 2, 3, 5, 6, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 16, 14, 8, 4, 2, 0, 1, 3, 5, 6, 7, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 18, 16, 14, 10, 5, 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 15, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 21, 19, 17, 15, 8, 4, 2, 0, 1, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 21, 19, 17, 15, 12, 8, 4, 0, 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 16, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 21, 19, 17, 15, 13, 11, 9, 3, 0, 1, 2, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 24, 22, 20, 18, 16, 14, 12, 9, 6, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 15, 17, 19, 21, 23, 25, 26, 27, 28, 29, 30, + 25, 23, 21, 19, 17, 15, 13, 11, 9, 6, 0, 1, 2, 3, 4, 5, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 27, 28, 29, 30, + 27, 25, 23, 21, 19, 17, 15, 13, 11, 8, 5, 0, 1, 2, 3, 4, 6, 7, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 29, 30, + 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 1, 0, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 28, 29, 30, + 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 30, + 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 0, 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, + 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, + 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 1, 0, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, + 30, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, + 30, 29, 28, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 0, 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, + 30, 29, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 9, 7, 6, 4, 3, 2, 1, 0, 5, 8, 11, 13, 15, 17, 19, 21, 23, 25, 27, + 30, 29, 28, 27, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 3, 2, 1, 0, 6, 9, 11, 13, 15, 17, 19, 21, 23, 25, + 30, 29, 28, 27, 26, 25, 23, 21, 19, 17, 15, 13, 11, 10, 8, 7, 5, 4, 3, 2, 1, 0, 6, 9, 12, 14, 16, 18, 20, 22, 24, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 20, 18, 16, 14, 12, 10, 8, 7, 6, 5, 4, 2, 1, 0, 3, 9, 11, 13, 15, 17, 19, 21, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 20, 18, 16, 14, 13, 11, 10, 9, 7, 6, 5, 3, 2, 1, 0, 4, 8, 12, 15, 17, 19, 21, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 20, 18, 16, 14, 13, 12, 11, 10, 9, 7, 6, 5, 3, 1, 0, 2, 4, 8, 15, 17, 19, 21, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 17, 15, 13, 12, 11, 9, 8, 7, 6, 4, 3, 2, 1, 0, 5, 10, 14, 16, 18, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 15, 13, 12, 11, 10, 9, 7, 6, 5, 3, 1, 0, 2, 4, 8, 14, 16, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 11, 10, 8, 7, 6, 5, 3, 2, 0, 1, 4, 9, 12, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 3, 2, 1, 0, 4, 15, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 0, 1, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 +}; + + +/*------------------------------------------------------------------------- + * Range Coder ROM tables + *------------------------------------------------------------------------*/ + +/* Create separate tables for cumulative frequency and symbol frequency */ +const UWord16 cum_freq_ari_pk_s17_LC_ext[RANGE_N_CONTEXT][1 + RANGE_N_SYMBOLS] = +{ + { 0,16,47,153,241,269,325,468,591,674,798,912,1017,1082,1183,1277,1364,16384 }, + { 0,7401,7844,7886,7899,12065,12718,12790,12805,14099,14476,14533,14549,15058,15264,15299,15310,16384 }, + { 0,4362,6345,6864,7038,9037,11049,11736,12002,12569,13301,13656,13822,14021,14334,14515,14607,16384 }, + { 0,2955,5183,5822,6013,8153,10671,11614,11943,12586,13540,14025,14232,14437,14770,14978,15080,16384 }, + { 0,3155,4981,5615,5855,7969,9953,10739,11073,11936,12837,13208,13383,13767,14203,14400,14498,16384 }, + { 0,1216,2630,3264,3558,4831,6679,7661,8157,8709,9622,10204,10542,10799,11243,11568,11777,16384 }, + { 0,1759,3641,4350,4612,6325,8678,9732,10161,10790,11790,12361,12642,12883,13295,13566,13720,16384 }, + { 0,1109,2705,3433,3732,5226,7532,8732,9263,9978,11142,11842,12188,12490,12986,13321,13520,16384 }, + { 0,11524,13046,13170,13191,14956,15708,15813,15837,16028,16162,16195,16204,16245,16282,16295,16300,16384 }, + { 0,8027,10586,10909,10974,13291,14861,15157,15232,15535,15824,15914,15943,16014,16090,16123,16136,16384 }, + { 0,834,2034,2674,2997,4087,5843,6891,7455,8030,9013,9688,10085,10376,10893,11277,11528,16384 }, + { 0,6038,9086,9451,9519,12332,14521,14913,15003,15329,15711,15848,15893,15955,16045,16091,16111,16384 }, + { 0,4732,7685,8354,8545,10717,12924,13618,13852,14291,14842,15083,15181,15314,15491,15582,15625,16384 }, + { 0,745,1783,2347,2655,3537,4963,5864,6406,6863,7664,8248,8634,8891,9351,9708,9958,16384 }, + { 0,3957,6794,7669,7998,9743,11676,12498,12869,13313,13894,14186,14332,14498,14714,14835,14906,16384 }, + { 0,2779,5388,6021,6201,8582,11352,12260,12544,13117,13981,14408,14580,14751,15039,15213,15298,16384 }, + { 0,448,1160,1625,1920,2576,3706,4518,5053,5474,6234,6835,7262,7531,8032,8446,8758,16384 }, + { 0,1,2,1555,2246,2247,2248,3489,4112,5449,6596,7302,7710,8311,8876,9266,9517,16384 }, + { 0,2496,4910,5544,5722,8049,10799,11689,11973,12583,13467,13878,14047,14234,14537,14712,14803,16384 }, + { 0,921,2222,2880,3188,4407,6321,7406,7955,8573,9616,10296,10679,10978,11502,11880,12118,16384 }, + { 0,2620,4443,5017,5233,7072,9213,10083,10441,11049,11954,12442,12676,12918,13310,13565,13705,16384 }, + { 0,11205,13084,13178,13187,15164,16010,16081,16091,16213,16303,16321,16325,16340,16355,16360,16362,16384 }, + { 0,358,916,1288,1542,2055,2937,3594,4062,4399,5017,5524,5907,6136,6573,6941,7236,16384 }, + { 0,3575,5093,5536,5735,7408,9185,9878,10188,10727,11497,11933,12165,12410,12794,13019,13166,16384 }, + { 0,1,2,640,1036,1037,1038,1670,2096,2696,3287,3732,4056,4417,4800,5106,5339,16384 }, + { 0,969,1397,1518,1578,2633,3338,3566,3675,4197,4664,4857,4957,5288,5625,5783,5874,16384 }, + { 0,10458,12104,12294,12331,14246,15264,15437,15481,15752,15971,16031,16050,16120,16186,16210,16218,16384 }, + { 0,7178,9744,10039,10093,12701,14612,14961,15042,15360,15732,15869,15917,15978,16070,16117,16139,16384 }, + { 0,1298,2418,2879,3113,4146,5509,6227,6621,7053,7755,8229,8539,8776,9186,9492,9714,16384 }, + { 0,4957,7785,8252,8357,10978,13372,13955,14114,14561,15140,15378,15464,15570,15730,15820,15860,16384 }, + { 0,4823,8164,8570,8647,11604,14169,14653,14763,15105,15554,15727,15785,15852,15960,16018,16045,16384 }, + { 0,4735,7010,7517,7660,9986,12230,12914,13131,13666,14374,14689,14814,14972,15212,15342,15404,16384 }, + { 0,3363,5881,6658,6941,8864,11113,12015,12368,12889,13643,14019,14203,14394,14665,14823,14906,16384 }, + { 0,2569,4996,5779,6068,7917,10251,11209,11602,12129,12918,13321,13520,13696,13976,14155,14259,16384 }, + { 0,209,577,848,1046,1378,1982,2465,2835,3072,3513,3893,4202,4374,4703,4994,5241,16384 }, + { 0,2074,4337,5048,5274,7319,10003,11066,11446,12105,13112,13652,13885,14100,14464,14691,14810,16384 }, + { 0,1619,3560,4288,4550,6381,8955,10102,10543,11239,12362,12982,13261,13516,13958,14234,14381,16384 }, + { 0,89,257,441,582,734,1024,1325,1568,1716,1983,2222,2430,2545,2750,2941,3109,16384 }, + { 0,2202,3563,4044,4264,5686,7344,8100,8476,9006,9835,10331,10612,10864,11304,11599,11787,16384 }, + { 0,1220,2801,3492,3784,5223,7387,8496,8998,9640,10711,11369,11711,11993,12486,12829,13035,16384 }, + { 0,12626,13813,13903,13917,15396,15906,15972,15987,16139,16230,16251,16257,16289,16315,16323,16326,16384 }, + { 0,1579,3191,3831,4099,5678,7788,8761,9206,9842,10821,11388,11681,11958,12417,12722,12902,16384 }, + { 0,597,1514,2064,2379,3237,4679,5637,6213,6733,7649,8316,8755,9052,9599,10023,10323,16384 }, + { 0,9273,11762,12080,12151,14038,15210,15446,15514,15725,15929,15995,16019,16068,16124,16148,16158,16384 }, + { 0,9238,11681,11852,11872,14306,15644,15801,15828,16013,16183,16231,16243,16266,16297,16312,16318,16384 }, + { 0,6791,9200,9531,9594,12240,14178,14552,14639,15064,15506,15643,15687,15785,15908,15960,15983,16384 }, + { 0,7175,10415,10905,11033,13038,14621,15002,15123,15367,15651,15762,15806,15864,15938,15974,15992,16384 }, + { 0,5060,7703,8132,8225,10934,13270,13778,13911,14397,14972,15173,15242,15367,15537,15619,15654,16384 }, + { 0,3721,6311,6857,6992,9557,12180,12895,13098,13671,14418,14718,14830,14984,15212,15333,15390,16384 }, + { 0,5971,9288,10044,10269,11991,13680,14228,14437,14750,15130,15293,15374,15459,15579,15642,15677,16384 }, + { 0,3047,5311,5907,6078,8339,10850,11679,11946,12580,13442,13854,14024,14220,14534,14716,14810,16384 }, + { 0,2061,4280,4993,5228,7201,9735,10735,11097,11708,12606,13082,13295,13498,13836,14043,14161,16384 }, + { 0,4738,7949,8880,9234,10781,12502,13214,13531,13897,14355,14593,14718,14835,14998,15096,15153,16384 }, + { 0,3237,5045,5632,5860,7609,9702,10608,10986,11571,12476,12978,13230,13451,13830,14074,14208,16384 }, + { 0,1833,3889,4677,5028,6422,8379,9378,9884,10350,11086,11545,11809,12003,12327,12559,12711,16384 }, + { 0,3989,6858,7352,7459,10254,12936,13571,13735,14240,14895,15153,15242,15364,15548,15646,15690,16384 }, + { 0,1463,3197,3909,4220,5626,7609,8632,9127,9657,10520,11078,11380,11607,11991,12265,12442,16384 }, + { 0,14233,15083,15108,15110,16069,16300,16314,16316,16352,16370,16373,16374,16377,16380,16381,16382,16384 }, + { 0,1,2,2610,3293,3294,3295,5097,5671,8467,10332,11119,11437,12223,12850,13185,13345,16384 }, + { 0,2010,4053,4696,4910,6879,9391,10386,10750,11393,12376,12886,13119,13348,13726,13967,14099,16384 }, + { 0,7586,10517,10758,10791,13543,15346,15577,15619,15846,16082,16150,16169,16202,16245,16265,16273,16384 }, + { 0,3059,5772,6369,6524,9041,11801,12582,12813,13361,14115,14439,14567,14714,14944,15075,15141,16384 }, + { 0,8643,10594,10813,10856,13274,14686,14920,14975,15350,15680,15771,15799,15897,16003,16042,16057,16384 }, + { 0,6720,8878,9325,9467,11564,13248,13744,13929,14384,14880,15087,15167,15311,15488,15569,15607,16384 }, +}; + +const UWord16 sym_freq_ari_pk_s17_LC_ext[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = +{ + { 16,31,106,88,28,56,143,123,83,124,114,105,65,101,94,87,15020 }, + { 7401,443,42,13,4166,653,72,15,1294,377,57,16,509,206,35,11,1074 }, + { 4362,1983,519,174,1999,2012,687,266,567,732,355,166,199,313,181,92,1777 }, + { 2955,2228,639,191,2140,2518,943,329,643,954,485,207,205,333,208,102,1304 }, + { 3155,1826,634,240,2114,1984,786,334,863,901,371,175,384,436,197,98,1886 }, + { 1216,1414,634,294,1273,1848,982,496,552,913,582,338,257,444,325,209,4607 }, + { 1759,1882,709,262,1713,2353,1054,429,629,1000,571,281,241,412,271,154,2664 }, + { 1109,1596,728,299,1494,2306,1200,531,715,1164,700,346,302,496,335,199,2864 }, + { 11524,1522,124,21,1765,752,105,24,191,134,33,9,41,37,13,5,84 }, + { 8027,2559,323,65,2317,1570,296,75,303,289,90,29,71,76,33,13,248 }, + { 834,1200,640,323,1090,1756,1048,564,575,983,675,397,291,517,384,251,4856 }, + { 6038,3048,365,68,2813,2189,392,90,326,382,137,45,62,90,46,20,273 }, + { 4732,2953,669,191,2172,2207,694,234,439,551,241,98,133,177,91,43,759 }, + { 745,1038,564,308,882,1426,901,542,457,801,584,386,257,460,357,250,6426 }, + { 3957,2837,875,329,1745,1933,822,371,444,581,292,146,166,216,121,71,1478 }, + { 2779,2609,633,180,2381,2770,908,284,573,864,427,172,171,288,174,85,1086 }, + { 448,712,465,295,656,1130,812,535,421,760,601,427,269,501,414,312,7626 }, + { 1,1,1553,691,1,1,1241,623,1337,1147,706,408,601,565,390,251,6867 }, + { 2496,2414,634,178,2327,2750,890,284,610,884,411,169,187,303,175,91,1581 }, + { 921,1301,658,308,1219,1914,1085,549,618,1043,680,383,299,524,378,238,4266 }, + { 2620,1823,574,216,1839,2141,870,358,608,905,488,234,242,392,255,140,2679 }, + { 11205,1879,94,9,1977,846,71,10,122,90,18,4,15,15,5,2,22 }, + { 358,558,372,254,513,882,657,468,337,618,507,383,229,437,368,295,9148 }, + { 3575,1518,443,199,1673,1777,693,310,539,770,436,232,245,384,225,147,3218 }, + { 1,1,638,396,1,1,632,426,600,591,445,324,361,383,306,233,11045 }, + { 969,428,121,60,1055,705,228,109,522,467,193,100,331,337,158,91,10510 }, + { 10458,1646,190,37,1915,1018,173,44,271,219,60,19,70,66,24,8,166 }, + { 7178,2566,295,54,2608,1911,349,81,318,372,137,48,61,92,47,22,245 }, + { 1298,1120,461,234,1033,1363,718,394,432,702,474,310,237,410,306,222,6670 }, + { 4957,2828,467,105,2621,2394,583,159,447,579,238,86,106,160,90,40,524 }, + { 4823,3341,406,77,2957,2565,484,110,342,449,173,58,67,108,58,27,339 }, + { 4735,2275,507,143,2326,2244,684,217,535,708,315,125,158,240,130,62,980 }, + { 3363,2518,777,283,1923,2249,902,353,521,754,376,184,191,271,158,83,1478 }, + { 2569,2427,783,289,1849,2334,958,393,527,789,403,199,176,280,179,104,2125 }, + { 209,368,271,198,332,604,483,370,237,441,380,309,172,329,291,247,11143 }, + { 2074,2263,711,226,2045,2684,1063,380,659,1007,540,233,215,364,227,119,1574 }, + { 1619,1941,728,262,1831,2574,1147,441,696,1123,620,279,255,442,276,147,2003 }, + { 89,168,184,141,152,290,301,243,148,267,239,208,115,205,191,168,13275 }, + { 2202,1361,481,220,1422,1658,756,376,530,829,496,281,252,440,295,188,4597 }, + { 1220,1581,691,292,1439,2164,1109,502,642,1071,658,342,282,493,343,206,3349 }, + { 12626,1187,90,14,1479,510,66,15,152,91,21,6,32,26,8,3,58 }, + { 1579,1612,640,268,1579,2110,973,445,636,979,567,293,277,459,305,180,3482 }, + { 597,917,550,315,858,1442,958,576,520,916,667,439,297,547,424,300,6061 }, + { 9273,2489,318,71,1887,1172,236,68,211,204,66,24,49,56,24,10,226 }, + { 9238,2443,171,20,2434,1338,157,27,185,170,48,12,23,31,15,6,66 }, + { 6791,2409,331,63,2646,1938,374,87,425,442,137,44,98,123,52,23,401 }, + { 7175,3240,490,128,2005,1583,381,121,244,284,111,44,58,74,36,18,392 }, + { 5060,2643,429,93,2709,2336,508,133,486,575,201,69,125,170,82,35,730 }, + { 3721,2590,546,135,2565,2623,715,203,573,747,300,112,154,228,121,57,994 }, + { 5971,3317,756,225,1722,1689,548,209,313,380,163,81,85,120,63,35,707 }, + { 3047,2264,596,171,2261,2511,829,267,634,862,412,170,196,314,182,94,1574 }, + { 2061,2219,713,235,1973,2534,1000,362,611,898,476,213,203,338,207,118,2223 }, + { 4738,3211,931,354,1547,1721,712,317,366,458,238,125,117,163,98,57,1231 }, + { 3237,1808,587,228,1749,2093,906,378,585,905,502,252,221,379,244,134,2176 }, + { 1833,2056,788,351,1394,1957,999,506,466,736,459,264,194,324,232,152,3673 }, + { 3989,2869,494,107,2795,2682,635,164,505,655,258,89,122,184,98,44,694 }, + { 1463,1734,712,311,1406,1983,1023,495,530,863,558,302,227,384,274,177,3942 }, + { 14233,850,25,2,959,231,14,2,36,18,3,1,3,3,1,1,2 }, + { 1,1,2608,683,1,1,1802,574,2796,1865,787,318,786,627,335,160,3039 }, + { 2010,2043,643,214,1969,2512,995,364,643,983,510,233,229,378,241,132,2285 }, + { 7586,2931,241,33,2752,1803,231,42,227,236,68,19,33,43,20,8,111 }, + { 3059,2713,597,155,2517,2760,781,231,548,754,324,128,147,230,131,66,1243 }, + { 8643,1951,219,43,2418,1412,234,55,375,330,91,28,98,106,39,15,327 }, + { 6720,2158,447,142,2097,1684,496,185,455,496,207,80,144,177,81,38,777 }, +}; + + +/*------------------------------------------------------------------------- + * ECLVQ Stereo ROM tables + *------------------------------------------------------------------------*/ + +/* table with round(ECSQ_PROB_TOTAL / index) for entropy coding, with i in {1, .., ECSQ_SEGMENT_SIZE} */ +const UWord16 ECSQ_tab_inverse[1 + ECSQ_SEGMENT_SIZE] = +{ + 0, 16384, 8192, 5461, 4096, 3277, 2731, 2341, 2048 +}; + +const Word16 tdm_bit_allc_tbl[5][6] = +{ + /* IC -- UC -- GC -- TM --AC */ + { 1650, 3500, 0, 4400, 0, 5000 }, /* IVAS_13k2 */ + { 1650, 3500, 0, 5000, 0, 5000 }, /* IVAS_16k4 */ + { 1650, 3500, 0, 6000, 0, 5000 }, /* IVAS_24k4 */ + { 1650, 6050, 0, 10000, 0, 10000 }, /* IVAS_32k */ + { 1650, 6050, 0, 13000, 0, 14000 } /* IVAS_48k */ +}; + + +const Word16 fast_FCB_bits_2sfr[] = {8, 14, 18, 20, 24, 128/*stop value*/}; + +const Word16 fast_FCB_rates_2sfr[] = {/*16*50,*/ (8+14)*50, 28*50, 32*50, 34*50, 36*50, 38*50, 40*50, 42*50, 44*50, 48*50}; + + +/*----------------------------------------------------------------------------------* + * MDCT Stereo ROM tables + *----------------------------------------------------------------------------------*/ + + /* PsychLPC */ + +const SpectrumWarping sw32000Hz[] = +{{ + { + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, + 6, 8, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 14, 14, + 14, 16, 18, 18, 18, 20, 22, 22, 22, 24, 26, 26, 26, 28, 30, 32 + }, + { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, + 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10 + }, +}}; + +const SpectrumWarping sw25600Hz[] = +{{ + { + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, + 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 10, 12, 12, 12, 12, + 12, 12, 14, 14, 14, 14, 14, 16, 16, 18, 18, 18, 18, 18, 20, 20 + }, + { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7 + }, +}}; + +const SpectrumWarping sw16000Hz[] = +{{ + { + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 + }, + { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 + }, +}}; + +const MDCTStereoBands_config mdctStereoBands_32000_640[] = +{{ + /*TCX 20*/ + { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, + 12, 20, 20, 20, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 42, + 64, 64, 96, 160}, + {44, 41,38, 29},/*number of bands for frame lengths 960, 640, 512, 320 respectively*/ + + /*TCX 10*/ + { + 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 20, 32, 32, + 32, 48, 80 + }, + {33, 29, 26, 18}/*number of bands for frame lengths 480, 320, 256, 160 respectively*/ +}}; + +const Word16 mdct_stereo_dtx_coherence_bandlengths[MDCT_ST_DTX_NUM_COHERENCE_BANDS] = { + 6, /* 8 - MDCT_ST_DTX_FIRST_BAND_OFFSET */ 8, 16, 16, 80 +}; +/* dequantization table for coherence */ +const Word16 get_next_index_4_by_15[16] = { + 0, 2184, 4369, 6553, 8738, 10922, 13107, 15291, 17476, 19660, 21845, 24029, 26214, 28398, 30583, 32767 +}; + +const Word16 dft_cng_coh_u2i[9] = { 4, 5, 3, 6, 2, 7, 1, 8, 0 }; /* Coherence unary codeword -> residual codeword conversion table */ + +const Word16 dft_cng_coh_i2u[9] = { 8, 6, 4, 2, 0, 1, 3, 5, 7 }; /* Coherence residual codeword -> unary codeword conversion table */ + +const Word16 dft_cng_coh_alpha_start[STEREO_DFT_N_COH_ALPHA_STEPS - 1] = { 15, 16, 17, 18 }; + +const Word16 DirAC_band_grouping_12[12 + 1] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 11, 17, 25, 40, 60 +}; + +const Word16 DirAC_band_grouping_6[6 + 1] = +{ + 0, 1, 4, 8, 20, 30, 60 +}; + +const Word16 DirAC_band_grouping_5[5 + 1] = +{ + 0, 1, 3, 7, 15, 60 +}; + +const Word16 DirAC_block_grouping[MAX_PARAM_SPATIAL_SUBFRAMES + 1] = +{ + 0, 4, 8, 12, 16 +}; + +const Word16 DirAC_block_grouping_5ms_MDFT[MAX_PARAM_SPATIAL_SUBFRAMES + 1] = +{ + 0, 1, 2, 3, 4 +}; + +const Word32 c_weights_fx[DIRAC_NO_FB_BANDS_MAX] /* Q30 */ = { 106970960, 1033798336, 1065867776, 1071704704, 1073381888, 1073741824, 1073494016, 1072883072, 1072012032, 1070930560, 1069665600, 1068232640, 1066641792, 1064899968, 1063012224, 1060982464, 1058814144, 1056510016, 1054072832, 1051505280, 1048809664, 1045988480, 1043044160, 1039979072, 1036795776, 1033496576, 1030084096, 1026560960, 1022929600, 1019192512, 1015352576, 1011412416, 1007374720, 1003242112, 999017472, 994703488, 990302976, 985818688, 981253568, 976610304, 971891712, 967100672, 962240064, 957312576, 952321088, 947268224, 942156992, 936990080, 931770048, 926499840, 921182016, 915819200, 910414208, 904969344, 899487488, 893970944, 888422272, 882843840, 877238144, 871607552, 865954432, 860280896, 854589184, 848881728, 843160384, 837427328, 831684672, 825934208, 820178240, 814418240, 808656320, 802894208, 797133568, 791376192, 785623744, 779877568, 774139520, 768410880, 762693184, 756987904, 751296064, 745619328, 739958784, 734315584, 728691008, 723086208, 717502016, 711939712, 706400064, 700884096, 695392768, 689926912, 684487232, 679074688, 673689856, 668333504, 663006464, 657709056, 652442176, 647206144, 642001600, 636828992, 631688896, 626581696, 621507776, 616467520, 611461184, 606489344, 601552064, 596649792, 591782528, 586950784, 582154560, 577394112, 572669696, 567981312, 563329088, 558713152, 554133568, 549590464, 545083840, 540613760, 536180160, 531783104, 527422528, 523098464, 518810784, 514559520, 510344672, 506165856, 502023360, 497916832, 493846304, 489811488, 485812448, 481848832, 477920672, 474027808, 470169952, 466347008, 462558848, 458805152, 455085920, 451400736, 447749600, 444132160, 440548320, 436997792, 433480416, 429995904, 426544032, 423124608, 419737376, 416382144, 413058720, 409766720, 406505984, 403276288, 400077280, 396908768, 393770656, 390662496, 387584064, 384535200, 381515616, 378525024, 375563200, 372629952, 369724864, 366847872, 363998592, 361176672, 358382176, 355614592, 352873760, 350159456, 347471328, 344809216, 342172864, 339562048, 336976384, 334415808, 331879840, 329368576, 326881472, 324418432, 321979104, 319563392, 317170976, 314801664, 312455232, 310131328, 307829856, 305550528, 303293088, 301057440, 298843168, 296650176, 294478304, 292327168, 290196672, 288086432, 285996512, 283926432, 281876224, 279845472, 277834016, 275841792, 273868480, 271913856, 269977792, 268059968, 266160304, 264278672, 262414768, 260568368, 258739360, 256927520, 255132768, 253354752, 251593392, 249848448, 248119936, 246407424, 244710816, 243030080, 241364928, 239715120, 238080672, 236461248, 234856752, 233267088, 231692016, 230131440, 228585136, 227053024, 225534848, 224030544, 222539872, 221062832 }; + + +/*----------------------------------------------------------------------* +* SPAR ROM tables +*-----------------------------------------------------------------------*/ + +const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = +{ +/* When AGC is ON additional (AGC_BITS_PER_CH+1) bits may be taken from each core-coder channel + so minimum core-coder bitrate per channel can be min core-coder bitrates as per the table - AGC_BITS_PER_CH */ + { 13200, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 10000, 8150, 13150 } }, + { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, + + { 16400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 13200, 11350, 16350 } }, + { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, + + { 24400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 16400, 14850, 24350 } }, + { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, + + { 32000, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 24000, 20450, 31950 } }, + { { 21, 1, 5, 1 },{ 15, 1, 5, 1 },{ 15, 1, 3, 1 } }, 0, 0, 0 }, + + { 48000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 24000, 21000, 31950 },{ 16000, 15000, 20400 } }, + { { 15, 7, 5, 1 },{ 15, 7, 3, 1 },{ 7, 7, 3, 1 } }, 1, 0, 0 }, + + { 64000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 38000, 34050, 56000 },{ 16000, 15600, 20400 } },{ { 21, 7, 5, 1 },{ 15, 7, 5, 1 },{ 15, 7, 3, 1 } }, 1, 1, 0 }, + + { 80000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 46000, 43000, 56000 },{ 24000, 23000, 31950 } }, + { { 21, 7, 5, 1 },{ 15, 7, 5, 1 },{ 15, 7, 3, 1 } }, 1, 0, 0 }, + + { 96000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 47000, 42600, 56000 },{ 23000, 22600, 31950 },{ 16000, 15600, 20400 } }, + { { 21, 9, 9, 1 },{ 21, 7, 5, 1 },{ 21, 7, 5, 1 } }, 1, 0, 0 }, + + { 128000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 55000, 50000, 56000 },{ 36000, 36000, 56000 },{ 27000, 27000, 31950 } }, + { { 21, 11, 9, 1 },{ 21, 9, 7, 1 },{ 21, 7, 7, 1 } }, 1, 0, 0 }, + + { 160000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 74000, 70900, 112000 },{ 41000, 40050, 56000 },{ 35000, 34050, 56000 } }, + { { 21, 11, 11, 1 },{ 21, 9, 9, 1 },{ 21, 7, 7, 1 } }, 1, 0, 0 }, + + { 192000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 90000, 87900, 112000 },{ 50000, 48050, 56000 },{ 42000, 41050, 56000 } }, + { { 21, 11, 11, 1 },{ 21, 9, 9, 1 },{ 21, 7, 7, 1 } }, 1, 0, 0 }, + + { 256000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 90000, 85000, 112000 },{ 70000, 69000, 112000 },{ 50000, 48950, 56000 },{ 36400, 35600, 56000 } }, + { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 256000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 84650, 83000, 112000 },{ 65850, 64550, 56000 },{ 47000, 46100, 48000 },{ 28200, 27650, 40000 } }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 256000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 76300, 73550, 112000 },{ 59350, 57200, 56000 },{ 42400, 40850, 48000 },{ 25450, 24500, 40000 } }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 }, { 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 384000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 100000, 100000, 128000 },{ 79850, 79850, 104000 },{ 66600, 66600, 104000 } }, + { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 384000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 105350, 103300, 112000 },{ 75200, 73750, 96000 },{ 45100, 44250, 48000 } }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 384000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 124300, 121550, 128000 },{ 96700, 94550, 112000 },{ 69050, 67500, 96000 },{ 41450, 40500, 48000 } }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 512000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 }, {118450, 118450, 128000 } }, + { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 124000, 124000, 128000 },{ 124000, 124000, 128000 },{ 125200, 118450, 128000 },{ 76300, 73000, 128000 } }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 512000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 118000, 118000, 128000 },{ 118000, 118000, 128000 },{ 117200, 109250, 128000 },{ 72300, 69000, 128000 } }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, +}; + +const ivas_spar_br_table_t ivas_spar_br_table_consts_fx[IVAS_SPAR_BR_TABLE_LEN] = /*ceilf(log2f)*/ +{ + /* When AGC is ON additional (AGC_BITS_PER_CH+1) bits may be taken from each core-coder channel + so minimum core-coder bitrate per channel can be min core-coder bitrates as per the table - AGC_BITS_PER_CH */ + { 13200, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 10000, 8150, 13150 } }, + { { 4, 0, 3, 0 },{ 4, 0, 2, 0 },{ 3, 0, 2, 0 } }, 0, 0, 0 }, + + { 16400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 13200, 11350, 16350 } }, + { { 4, 0, 3, 0 },{ 4, 0, 2, 0 },{ 3, 0, 2, 0 } }, 0, 0, 0 }, + + { 24400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 16400, 14850, 24350 } }, + { { 4, 0, 3, 0 },{ 4, 0, 2, 0 },{ 3, 0, 2, 0 } }, 0, 0, 0 }, + + { 32000, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 24000, 20450, 31950 } }, + { { 5, 0, 3, 0 },{ 4, 0, 3, 0 },{ 4, 0, 2, 0 } }, 0, 0, 0 }, + + { 48000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 24000, 21000, 31950 },{ 16000, 15000, 20400 } }, + { { 4, 3, 3, 0 },{ 4, 3, 2, 0 },{ 3, 3, 2, 0 } }, 1, 0, 0 }, + + { 64000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 38000, 34050, 56000 },{ 16000, 15600, 20400 } },{ { 5, 3, 3, 0 },{ 4, 3, 3, 0 },{ 4, 3, 2, 0 } }, 1, 1, 0 }, + + { 80000, 0, SBA_FOA_ORDER, FB, 24000, 2, WYXZ, 0, 0, { { 46000, 43000, 56000 },{ 24000, 23000, 31950 } }, + { { 5, 3, 3, 0 },{ 4, 3, 3, 0 },{ 4, 3, 2, 0 } }, 1, 0, 0 }, + + { 96000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 47000, 42600, 56000 },{ 23000, 22600, 31950 },{ 16000, 15600, 20400 } }, + { { 5, 4, 4, 0 },{ 5, 3, 3, 0 },{ 5, 3, 3, 0 } }, 1, 0, 0 }, + + { 128000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 55000, 50000, 56000 },{ 36000, 36000, 56000 },{ 27000, 27000, 31950 } }, + { { 5, 4, 4, 0 },{ 5, 4, 3, 0 },{ 5, 3, 3, 0 } }, 1, 0, 0 }, + + { 160000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 74000, 70900, 112000 },{ 41000, 40050, 56000 },{ 35000, 34050, 56000 } }, + { { 5, 4, 4, 0 },{ 5, 4, 4, 0 },{ 5, 3, 3, 0 } }, 1, 0, 0 }, + + { 192000, 0, SBA_FOA_ORDER, FB, 24000, 3, WYXZ, 0, 0, { { 90000, 87900, 112000 },{ 50000, 48050, 56000 },{ 42000, 41050, 56000 } }, + { { 5, 4, 4, 0 },{ 5, 4, 4, 0 },{ 5, 3, 3, 0 } }, 1, 0, 0 }, + + { 256000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 90000, 85000, 112000 },{ 70000, 69000, 112000 },{ 50000, 48950, 56000 },{ 36400, 35600, 56000 } }, + { { 5, 0, 0, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, + + { 256000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 84650, 83000, 112000 },{ 65850, 64550, 56000 },{ 47000, 46100, 48000 },{ 28200, 27650, 40000 } }, + { { 5, 4, 4, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, + + { 256000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 76300, 73550, 112000 },{ 59350, 57200, 56000 },{ 42400, 40850, 48000 },{ 25450, 24500, 40000 } }, + { { 5, 4, 4, 0 },{ 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, 1, 2, 0 }, + + { 384000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 100000, 100000, 128000 },{ 79850, 79850, 104000 },{ 66600, 66600, 104000 } }, + { { 5, 0, 0, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, + + { 384000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 105350, 103300, 112000 },{ 75200, 73750, 96000 },{ 45100, 44250, 48000 } }, + { { 5, 4, 4, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, + + { 384000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 124300, 121550, 128000 },{ 96700, 94550, 112000 },{ 69050, 67500, 96000 },{ 41450, 40500, 48000 } }, + { { 5, 4, 4, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, + + { 512000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 }, {118450, 118450, 128000 } }, + { { 5, 0, 0, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, + + { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 124000, 124000, 128000 },{ 124000, 124000, 128000 },{ 125200, 118450, 128000 },{ 76300, 73000, 128000 } }, + { { 5, 4, 4, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, + + { 512000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0, { { 118000, 118000, 128000 },{ 118000, 118000, 128000 },{ 117200, 109250, 128000 },{ 72300, 69000, 128000 } }, + { { 5, 4, 4, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 } }, 1, 2, 0 }, +}; + +const ivas_freq_models_t ivas_arith_pred_r_consts[TOTAL_PRED_QUANT_STRATS_ARITH] = +{ + /* entry for 1 quantization points */ + { + /* pred_R real */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* pred_R real differential */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* pred_R real : values for general and differential */ + { 0 },{ 0 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 7 quantization points for br_table_idx >= 2 */ + { + /* pred_R real */ + { + { 0,546,1092,2184,8740,2184,1092,546, }, + { 0,1779,2116,2516,3562,2516,2116,1779, }, + { 0,1848,2614,5229,2614,1848,1307,924, }, + { 0,924,1307,1848,2614,5229,2614,1848, }, + }, + /* pred_R real differential */ + { + { 0,125,399,1269,12798,1269,399,125, }, + { 0,744,1327,2365,7512,2365,1327,744, }, + { 0,1354,2413,7664,2413,1354,760,426, }, + { 0,426,760,1354,2413,7664,2413,1354, }, + }, + /* pred_R real : values for general and differential */ + { -3,-2,-1,0,1,2,3 },{ -3,-2,-1,0,1,2,3 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 15 quantization points for br_table_idx >= 2 */ + { + /* pred_R real */ + { + { 0,32,64,128,257,514,1028,2056,8226,2056,1028,514,257,128,64,32, }, + { 0,565,672,799,950,1130,1344,1598,2268,1598,1344,1130,950,799,672,565, }, + { 0,353,500,707,1000,1414,2000,4010,2000,1414,1000,707,500,353,250,176, }, + { 0,176,250,353,500,707,1000,1414,2000,4010,2000,1414,1000,707,500,353, }, + }, + /* pred_R real differential */ + { + { 0,1,3,12,39,125,397,1260,12710,1260,397,125,39,12,3,1, }, + { 0,66,119,212,378,674,1201,2140,6804,2140,1201,674,378,212,119,66, }, + { 0,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119,67,37, }, + { 0,37,67,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119, }, + }, + /* pred_R real : values for general and differential */ + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 21 quantization points for br_table_idx >= 2 */ + { + /* pred_R real */ + { + { 0,4,8,16,32,64,128,256,512,1024,2049,8198,2049,1024,512,256,128,64,32,16,8,4, }, + { 0,292,348,414,492,585,696,828,984,1171,1392,1980,1392,1171,984,828,696,585,492,414,348,292, }, + { 0,119,168,238,336,476,673,952,1346,1904,3817,1904,1346,952,673,476,336,238,168,119,84,59, }, + { 0,59,84,119,168,238,336,476,673,952,1346,1904,3817,1904,1346,952,673,476,336,238,168,119, }, + }, + /* pred_R real differential */ + { + { 0,1,1,1,1,3,12,39,125,397,1260,12704,1260,397,125,39,12,3,1,1,1,1, }, + { 0,11,20,37,66,118,210,375,668,1191,2122,6748,2122,1191,668,375,210,118,66,37,20,11, }, + { 0,20,37,66,118,210,375,668,1191,2123,6751,2123,1191,668,375,210,118,66,37,20,11,6, }, + { 0,6,11,20,37,66,118,210,375,668,1191,2123,6751,2123,1191,668,375,210,118,66,37,20, }, + }, + /* pred_R real : values for general and differential */ + { -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 }, + { -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 31 quantization points */ + { + /* pred real */ + { + { 0,1,1,1,1,2,4,8,16,32,64,128,256,512,1024,2048,8188,2048,1024,512,256,128,64,32,16,8,4,2,1,1,1,1, }, + { 0,110,131,156,186,221,263,313,373,443,527,627,746,887,1055,1255,1798,1255,1055,887,746,627,527,443,373,313,263,221,186,156,131,110, }, + { 0,20,29,41,58,82,116,164,233,329,466,659,932,1318,1864,3738,1864,1318,932,659,466,329,233,164,116,82,58,41,29,20,14,10, }, + { 0,10,14,20,29,41,58,82,116,164,233,329,466,659,932,1318,1864,3738,1864,1318,932,659,466,329,233,164,116,82,58,41,29,20, } + }, + /* pred real differential */ + { + { 0,1,1,1,1,1,1,1,1,1,3,12,39,125,397,1260,12694,1260,397,125,39,12,3,1,1,1,1,1,1,1,1,1, }, + { 0,1,1,2,3,6,11,20,37,66,117,210,374,667,1189,2118,6740,2118,1189,667,374,210,117,66,37,20,11,6,3,2,1,1, }, + { 0,1,2,3,6,11,20,37,66,117,210,374,667,1189,2118,6740,2118,1189,667,374,210,117,66,37,20,11,6,3,2,1,1,1, }, + { 0,1,1,1,2,3,6,11,20,37,66,117,210,374,667,1189,2118,6740,2118,1189,667,374,210,117,66,37,20,11,6,3,2,1, } + }, + /* pred real : values for general and differential */ + { -15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, + { -15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, + /* pred real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 7 quantization points for br_table_idx < 2 */ + { + /* pred_R real */ + { + { 0,327,778,1851,10472,1851,778,327, }, + { 0,1057,1630,2514,5982,2514,1630,1057, }, + { 0,1668,2572,6122,2572,1668,1081,701, }, + { 0,701,1081,1668,2572,6122,2572,1668, }, + }, + /* pred_R real differential */ + { + { 0,125,399,1269,12798,1269,399,125, }, + { 0,744,1327,2365,7512,2365,1327,744, }, + { 0,1354,2413,7664,2413,1354,760,426, }, + { 0,426,760,1354,2413,7664,2413,1354, }, + }, + /* pred_R real : values for general and differential */ + { -3,-2,-1,0,1,2,3 },{ -3,-2,-1,0,1,2,3 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 15 quantization points for br_table_idx < 2 */ + { + /* pred real */ + { + { 0,9,23,56,133,318,757,1800,10192,1800,757,318,133,56,23,9, }, + { 0,156,240,371,573,883,1363,2102,5008,2102,1363,883,573,371,240,156, }, + { 0,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241,156,101, }, + { 0,101,156,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241, } + }, + /* pred real differential */ + { + { 0,1,3,12,39,125,397,1260,12710,1260,397,125,39,12,3,1, }, + { 0,66,119,212,378,674,1201,2140,6804,2140,1201,674,378,212,119,66, }, + { 0,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119,67,37, }, + { 0,37,67,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119, } + }, + /* pred real : values for general and differential */ + {-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7}, + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + /* pred real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 21 quantization points for br_table_idx < 2 */ + { + /* pred_R real */ + { + { 0,1,1,4,9,23,56,133,318,756,1799,10184,1799,756,318,133,56,23,9,4,1,1, }, + { 0,41,64,98,152,234,362,558,861,1329,2049,4888,2049,1329,861,558,362,234,152,98,64,41, }, + { 0,64,98,152,235,362,559,862,1330,2051,4891,2051,1330,862,559,362,235,152,98,64,41,26, }, + { 0,26,41,64,98,152,235,362,559,862,1330,2051,4891,2051,1330,862,559,362,235,152,98,64, }, + }, + /* pred_R real differential */ + { + { 0,1,1,1,1,3,12,39,125,397,1260,12704,1260,397,125,39,12,3,1,1,1,1, }, + { 0,11,20,37,66,118,210,375,668,1191,2122,6748,2122,1191,668,375,210,118,66,37,20,11, }, + { 0,20,37,66,118,210,375,668,1191,2123,6751,2123,1191,668,375,210,118,66,37,20,11,6, }, + { 0,6,11,20,37,66,118,210,375,668,1191,2123,6751,2123,1191,668,375,210,118,66,37,20, }, + }, + /* pred_R real : values for general and differential */ + { -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 }, + { -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + } +}; + +const ivas_freq_models_t ivas_arith_drct_r_consts[TOTAL_DRCT_QUANT_STRATS] = +{ + /* entry for 1 quantization points */ + { + /* drct real */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct real differential */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct real : values for general and differential */ + {0},{ 0 }, + /* drct real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 7 quantization points */ + { /* drct real */ + { + { 0,125,399,1269,12798,1269,399,125, }, + { 0,744,1327,2365,7512,2365,1327,744, }, + { 0,988,1244,1568,1976,2489,3136,4983, }, + { 0,2111,2262,2425,2788,2425,2262,2111, }, + }, + /* drct real differential */ + { + { 0,125,399,1269,12798,1269,399,125, }, + { 0,744,1327,2365,7512,2365,1327,744, }, + { 0,1354,2413,7664,2413,1354,760,426, }, + { 0,426,760,1354,2413,7664,2413,1354, }, + }, + /* drct real : values for general and differential */ + { -3,-2,-1,0,1,2,3 },{ -3,-2,-1,0,1,2,3 }, + /* drct real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 9 quantization points */ + { + /* drct real */ + { + { 0,39,125,397,1263,12736,1263,397,125,39, }, + { 0,397,708,1262,2250,7150,2250,1262,708,397, }, + { 0,573,722,909,1146,1444,1819,2292,2888,4591, }, + { 0,1587,1701,1824,1955,2250,1955,1824,1701,1587, }, + }, + /* drct real differential */ + { + { 0,39,125,397,1263,12736,1263,397,125,39, }, + { 0,397,708,1262,2250,7150,2250,1262,708,397, }, + { 0,716,1276,2274,7225,2274,1276,716,402,225, }, + { 0,225,402,716,1276,2274,7225,2274,1276,716, } + }, + /* drct real : values for general and differential */ + { -4,-3,-2,-1,0,1,2,3,4 },{ -4,-3,-2,-1,0,1,2,3,4 }, + /* drct real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 11 quantization points */ + { + /* drct real */ + { + { 0,12,39,125,397,1261,12716,1261,397,125,39,12, }, + { 0,217,387,689,1229,2190,6960,2190,1229,689,387,217, }, + { 0,343,433,546,687,866,1092,1375,1733,2184,2751,4374, }, + { 0,1254,1344,1441,1544,1655,1908,1655,1544,1441,1344,1254, }, + }, + /* drct real differential */ + { + { 0,12,39,125,397,1261,12716,1261,397,125,39,12, }, + { 0,217,387,689,1229,2190,6960,2190,1229,689,387,217, }, + { 0,389,694,1236,2203,7000,2203,1236,694,389,218,122, }, + { 0,122,218,389,694,1236,2203,7000,2203,1236,694,389, }, + }, + /* drct real : values for general and differential */ + { -5,-4,-3,-2,-1,0,1,2,3,4,5 },{ -5,-4,-3,-2,-1,0,1,2,3,4,5 }, + /* drct real : num dyn models for general and differential */ + 4, 4 + } +}; + +const ivas_freq_models_t ivas_arith_decd_r_consts[TOTAL_DECD_QUANT_STRATS] = +{ + /* entry for 1 quantization points */ + { + /* decd real */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* decd real differential */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* decd real : values for general and differential */ + { 0 },{ 0 }, + /* decd real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 3 quantization points */ + { + /* decd real */ + { + { 0,11917,2978,1489, }, + { 0,8840,4419,3125, }, + { 0,4567,7250,4567, }, + { 0,5203,5978,5203, }, + }, + /* decd real differential */ + { + { 0,1356,13672,1356, }, + { 0,3166,10052,3166, }, + { 0,10984,3459,1941, }, + { 0,1941,3459,10984, }, + }, + /* decd real : values for general and differential */ + { 0,1,2 },{-1,0,1}, + /* decd real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 5 quantization points */ + { + /* decd real */ + { + { 0,11157,2788,1394,697,348, }, + { 0,7186,3592,2540,1796,1270, }, + { 0,2512,3166,5028,3166,2512, }, + { 0,3048,3267,3754,3267,3048, }, + }, + /* decd real differential */ + { + { 0,406,1289,12994,1289,406, }, + { 0,1460,2601,8262,2601,1460, }, + { 0,2707,8599,2707,1519,852, }, + { 0,852,1519,2707,8599,2707, }, + }, + /* decd real : values for general and differential */ + { 0,1,2,3,4 },{ -2,-1,0,1,2 }, + /* decd real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 7 quantization points */ + { + /* decd real */ + { + { 0,10983,2744,1372,686,343,171,85, }, + { 0,6573,3285,2322,1642,1161,821,580, }, + { 0,1603,2020,2546,4046,2546,2020,1603, }, + { 0,2111,2262,2425,2788,2425,2262,2111, }, + }, + /* decd real differential */ + { + { 0,125,399,1269,12798,1269,399,125, }, + { 0,744,1327,2365,7512,2365,1327,744, }, + { 0,1354,2413,7664,2413,1354,760,426, }, + { 0,426,760,1354,2413,7664,2413,1354, } + }, + /* decd real : values for general and differential */ + { 0,1,2,3,4,5,6 },{ -3,-2,-1,0,1,2,3 }, + /* decd real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 9 quantization points */ + { /* decd real */ + { + { 0,10941,2734,1367,683,341,170,85,42,21, }, + { 0,6305,3150,2227,1575,1113,787,556,393,278, }, + { 0,1101,1388,1749,2203,3502,2203,1749,1388,1101, }, + { 0,1587,1701,1824,1955,2250,1955,1824,1701,1587, }, + }, + /* decd real differential */ + { + { 0,39,125,397,1263,12736,1263,397,125,39, }, + { 0,397,708,1262,2250,7150,2250,1262,708,397, }, + { 0,716,1276,2274,7225,2274,1276,716,402,225, }, + { 0,225,402,716,1276,2274,7225,2274,1276,716, } + }, + /* decd real : values for general and differential */ + { 0,1,2,3,4,5,6,7,8 },{ -4,-3,-2,-1,0,1,2,3,4 }, + /* decd real : num dyn models for general and differential */ + 4, 4 + }, + /* entry for 11 quantization points */ + { + /* decd real */ + { + { 0,10932,2731,1365,682,341,170,85,42,21,10,5, }, + { 0,6181,3086,2182,1543,1091,771,545,385,272,192,136, }, + { 0,790,995,1254,1580,1991,3164,1991,1580,1254,995,790, }, + { 0,1254,1344,1441,1544,1655,1908,1655,1544,1441,1344,1254, }, + }, + /* decd real differential */ + { + { 0,12,39,125,397,1261,12716,1261,397,125,39,12, }, + { 0,217,387,689,1229,2190,6960,2190,1229,689,387,217, }, + { 0,389,694,1236,2203,7000,2203,1236,694,389,218,122, }, + { 0,122,218,389,694,1236,2203,7000,2203,1236,694,389, }, + }, + /* decd real : values for general and differential */ + { 0,1,2,3,4,5,6,7,8,9,10 },{ -5,-4,-3,-2,-1,0,1,2,3,4,5 }, + /* decd real : num dyn models for general and differential */ + 4, 4 + } +}; + +const ivas_huff_models_t ivas_huff_pred_r_consts[TOTAL_PRED_QUANT_STRATS_HUFF] = +{ + /* entry for 1 quantization points for br_table_idx */ + {{{ 0 }}, {{ 0 }}}, + /* entry for 7 quantization points for br_table_idx */ + { + /* pred_R codebook */ + { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 }, }, + /* pred_R differential codebook */ + { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 }, }, + }, + /* entry for 15 quantization points for br_table_idx */ + { + /* pred_r codebook */ + { { -7,4,2 },{ -6,4,3 },{ -5, 4, 4 },{ -4, 4, 5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 }, + { 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 } }, + /* pred_r differential codebook */ + { { -7,4,2 },{ -6,4,3 },{ -5, 4, 4 },{ -4, 4, 5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 }, + { 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 } }, + }, + /* entry for 21 quantization points for br_table_idx=0 */ + { + /* pred_r codebook */ + { {-10,5,22},{-9,5,23},{-8,5,24},{-7,5,25},{-6,5,26}, { -5, 4, 0 },{ -4, 4, 1 },{ -3,4,2 },{ -2,4,3 },{ -1,4,4 }, + { 0,4,5 },{ 1,4,6 },{ 2,4,7 },{ 3,4,8 },{ 4,4,9 },{ 5,4,10 },{6,5,27},{7,5,28},{8,5,29},{9,5,30},{10,5,31} }, + /* pred_r differential codebook */ + { { -10,5,22 },{ -9,5,23 },{ -8,5,24 },{ -7,5,25 },{ -6,5,26 },{ -5, 4, 0 },{ -4, 4, 1 },{ -3,4,2 },{ -2,4,3 },{ -1,4,4 }, + { 0,4,5 },{ 1,4,6 },{ 2,4,7 },{ 3,4,8 },{ 4,4,9 },{ 5,4,10 },{ 6,5,27 },{ 7,5,28 },{ 8,5,29 },{ 9,5,30 },{ 10,5,31 } }, + }, + + /* entry for 31 quantization points for br_table_idx>0 */ + { + /* pred_r codebook */ + { {-15,5,2},{-14,5,3},{-13,5,4},{-12,5,5},{-11,5,6}, { -10,5,7 },{ -9,5,8 },{ -8,5,9 }, + { -7,5,10 },{ -6,5,11 },{ -5, 5, 12 },{ -4, 5, 13 },{ -3,5,14 },{ -2,5,15 },{ -1,5,16 }, + { 0,4,0 },{ 1,5,17 },{ 2,5,18 },{ 3,5,19 },{ 4,5,20 },{ 5,5,21 },{ 6,5,22 },{ 7,5,23 }, + { 8,5,24 },{ 9,5,25 },{ 10,5,26 },{11,5,27},{12,5,28},{13,5,29},{14,5,30},{15,5,31} }, + /* pred_r differential codebook */ + { { -15,5,2 },{ -14,5,3 },{ -13,5,4 },{ -12,5,5 },{ -11,5,6 },{ -10,5,7 },{ -9,5,8 },{ -8,5,9 }, + { -7,5,10 },{ -6,5,11 },{ -5, 5, 12 },{ -4, 5, 13 },{ -3,5,14 },{ -2,5,15 },{ -1,5,16 }, + { 0,4,0 },{ 1,5,17 },{ 2,5,18 },{ 3,5,19 },{ 4,5,20 },{ 5,5,21 },{ 6,5,22 },{ 7,5,23 }, + { 8,5,24 },{ 9,5,25 },{ 10,5,26 },{ 11,5,27 },{ 12,5,28 },{ 13,5,29 },{ 14,5,30 },{ 15,5,31 } }, + }, + }; + +const ivas_huff_models_t ivas_huff_drct_r_consts[TOTAL_DRCT_QUANT_STRATS] = +{ + /* entry for 1 quantization points */ + {{{ 0 }}, {{ 0 }}}, + /* entry for 7 quantization points */ + { + /* drct_r codebook */ + { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 } }, + /* drct_r differential codebook */ + { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 } }, + }, + /* entry for 9 quantization points */ + { + /* drct_r codebook */ + { { -4, 4, 14 },{ -3,3,0 },{ -2,3,1 },{ -1,3,2 },{ 0,3,3 },{ 1,3,4 },{ 2,3,5 },{ 3,3,6 },{ 4,4,15 } }, + /* drct_r differential codebook */ + { { -4, 4, 14 },{ -3,3,0 },{ -2,3,1 },{ -1,3,2 },{ 0,3,3 },{ 1,3,4 },{ 2,3,5 },{ 3,3,6 },{ 4,4,15 } }, + }, + /* entry for 11 quantization points */ + { + /* drct_r codebook */ + { { -5, 4, 10 },{ -4, 4, 11 },{ -3,4,12 },{ -2,3,0 },{ -1,3,1 },{ 0,3,2 },{ 1,3,3 },{ 2,3,4 },{ 3,4,13 },{ 4,4,14 },{ 5,4,15 } }, + /* drct_r differential codebook */ + { { -5, 4, 10 },{ -4, 4, 11 },{ -3,4,12 },{ -2,3,0 },{ -1,3,1 },{ 0,3,2 },{ 1,3,3 },{ 2,3,4 },{ 3,4,13 },{ 4,4,14 },{ 5,4,15 } }, + }, +}; + +const ivas_huff_models_t ivas_huff_decd_r_consts[TOTAL_DECD_QUANT_STRATS] = +{ + /* entry for 1 quantization points */ + {{{ 0 }}, {{ 0 }}}, + /* entry for 3 quantization points */ + { + /* decd_r codebook */ + { { 0, 2, 2 },{ 1, 1, 0 },{ 2,2,3 } }, + /* decd_r differential codebook */ + { { -1, 2, 2 },{ 0, 1, 0 },{ 1,2,3 } }, + }, + /* entry for 5 quantization points */ + { + /* decd_r codebook */ + { { 0,3,6 },{ 1,2,0 },{ 2,2,1 },{ 3,2,2 },{ 4,3,7 } }, + /* decd_r differential codebook */ + { { -2,3,6 },{ -1,2,0 },{ 0,2,1 },{ 1,2,2 },{ 2,3,7 } }, + }, + /* entry for 7 quantization points */ + { + /* decd_r */ + { { 0, 3, 2 },{ 1, 3, 3 },{ 2,3,4 },{ 3,3,0 },{ 4,3,5 },{ 5,3,6 },{ 6,3,7 } }, + /* decd_r codebook differential codebook */ + { { -3, 3, 2 },{ -2, 3, 3 },{ -1,3,4 },{ 0,3,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 } }, + }, + /* entry for 9 quantization points */ + { + /* decd_r codebook */ + { { 0, 4, 14 },{ 1,3,0 },{ 2,3,1 },{ 3,3,2 },{ 4,3,3 },{ 5,3,4 },{ 6,3,5 },{ 7,3,6 },{ 8,4,15 } }, + /* decd_r differential codebook */ + { { -4, 4, 14 },{ -3,3,0 },{ -2,3,1 },{ -1,3,2 },{ 0,3,3 },{ 1,3,4 },{ 2,3,5 },{ 3,3,6 },{ 4,4,15 } }, + }, + /* entry for 11 quantization points */ + { + /* decd_r codebook */ + { { 0, 4, 10 },{ 1, 4, 11 },{ 2,4,12 },{ 3,3,0 },{ 4,3,1 },{ 5,3,2 },{ 6,3,3 },{ 7,3,4 },{ 8,4,13 },{ 9,4,14 },{ 10,4,15 } }, + /* decd_r differential codebook */ + { { -5, 4, 10 },{ -4, 4, 11 },{ -3,4,12 },{ -2,3,0 },{ -1,3,1 },{ 0,3,2 },{ 1,3,3 },{ 2,3,4 },{ 3,4,13 },{ 4,4,14 },{ 5,4,15 } }, + }, +}; + +/* DTX quantization and bitstream constants */ +const Word16 dtx_pd_real_q_levels[3][3] = { { 7,7,7 },{ 7,7,0 },{ 3,0,0 } }; +const Word16 dtx_pr_real_q_levels[3][3] = { { 9,9,9 },{ 9,7,9 },{ 9,5,7 } }; +const Word16 pr_pr_idx_pairs[3][3][2] = { { { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 1, 3 },{ 0, 0 } } }; +const Word16 pr_pd_idx_pairs[3][3][2] = { { { 1, 1 },{ 2, 2 },{ 3, 3 } },{ { 1, 1 },{ 3, 2 },{ 2, 0 } },{ { 2, 1 },{ 0, 0 },{ 0, 0 } } }; + +const Word16 remix_order_set[1][DIRAC_MAX_ANA_CHANS] = { /* WYZX --> WYXZ... */ + { 0, 1, 3, 2, 4, 5, 6, 7, 8, 9, 10 } +}; + +const Word16 HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15}; +const Word16 HOA_keep_ind_spar[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 10, 10, 10, 10}; +const Word16 HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + + +/*----------------------------------------------------------------------* +* PCA ROM tables +*-----------------------------------------------------------------------*/ + +const Word32 ivas_pca_offset_index1[IVAS_PCA_N1 + 1] = +{ + 0, 1, 9, 61, 163, 359, 685, 1125, 1747, + 2519, 3521, 4713, 6183, 7883, 9809, 12093, 14633, 17575, + 20807, 24343, 28181, 32487, 37121, 42097, 47405, 53057, 59061, + 65421, 72137, 79205, 86625, 94415, 102345, 110629, 119263, 128017, + 137097, 146515, 156043, 165637, 175551, 185515, 195535, 205837, 216183, + 226545, 236911, 247273, 257619, 267921, 277941, 287905, 297819, 307413, + 316941, 326359, 335439, 344193, 352827, 361111, 369041, 376831, 384251, + 391319, 398035, 404395, 410399, 416051, 421359, 426335, 430969, 435275, + 439113, 442649, 445881, 448823, 451363, 453647, 455573, 457273, 458743, + 459935, 460937, 461709, 462331, 462771, 463097, 463293, 463395, 463447, + 463455, 463456 +}; + +const Word16 ivas_pca_offset_index2[2692] = +{ + 0, 1, 0, 1, 7, 8, 0, 1, 7, 19, + 33, 45, 51, 52, 0, 1, 9, 23, 41, 61, + 79, 93, 101, 102, 0, 1, 7, 21, 39, 61, + 85, 111, 135, 157, 175, 189, 195, 196, 0, 1, + 7, 19, 37, 59, 85, 115, 147, 179, 211, 241, + 267, 289, 307, 319, 325, 326, 0, 1, 7, 21, + 41, 65, 95, 127, 163, 201, 239, 277, 313, 345, + 375, 399, 419, 433, 439, 440, 0, 1, 7, 19, + 37, 61, 91, 125, 163, 203, 245, 289, 333, 377, + 419, 459, 497, 531, 561, 585, 603, 615, 621, 622, + 0, 1, 7, 21, 41, 67, 97, 133, 173, 217, + 263, 311, 361, 411, 461, 509, 555, 599, 639, 675, + 705, 731, 751, 765, 771, 772, 0, 1, 7, 19, + 37, 61, 91, 127, 167, 211, 259, 309, 363, 417, + 473, 529, 585, 639, 693, 743, 791, 835, 875, 911, + 941, 965, 983, 995, 1001, 1002, 0, 1, 7, 21, + 41, 67, 99, 135, 177, 223, 273, 327, 383, 443, + 503, 565, 627, 689, 749, 809, 865, 919, 969, 1015, + 1057, 1093, 1125, 1151, 1171, 1185, 1191, 1192, 0, 1, + 7, 19, 37, 61, 91, 127, 169, 215, 265, 319, + 377, 437, 501, 567, 633, 701, 769, 837, 903, 969, + 1033, 1093, 1151, 1205, 1255, 1301, 1343, 1379, 1409, 1433, + 1451, 1463, 1469, 1470, 0, 1, 7, 21, 41, 67, + 99, 137, 179, 227, 279, 335, 395, 459, 525, 595, + 667, 739, 813, 887, 961, 1033, 1105, 1175, 1241, 1305, + 1365, 1421, 1473, 1521, 1563, 1601, 1633, 1659, 1679, 1693, + 1699, 1700, 0, 1, 9, 23, 43, 69, 101, 139, + 183, 231, 285, 343, 405, 471, 541, 613, 689, 765, + 843, 923, 1003, 1083, 1161, 1237, 1313, 1385, 1455, 1521, + 1583, 1641, 1695, 1743, 1787, 1825, 1857, 1883, 1903, 1917, + 1925, 1926, 0, 1, 7, 21, 41, 67, 99, 137, + 179, 227, 281, 339, 401, 467, 537, 611, 687, 767, + 849, 931, 1015, 1099, 1185, 1269, 1353, 1435, 1517, 1597, + 1673, 1747, 1817, 1883, 1945, 2003, 2057, 2105, 2147, 2185, + 2217, 2243, 2263, 2277, 2283, 2284, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 285, 345, 409, 477, + 549, 625, 705, 787, 871, 957, 1045, 1135, 1225, 1315, + 1405, 1495, 1583, 1669, 1753, 1835, 1915, 1991, 2063, 2131, + 2195, 2255, 2309, 2359, 2403, 2441, 2473, 2499, 2519, 2533, + 2539, 2540, 0, 1, 7, 19, 39, 65, 97, 135, + 177, 225, 279, 337, 401, 469, 541, 617, 697, 781, + 867, 955, 1045, 1137, 1231, 1327, 1423, 1519, 1615, 1711, + 1805, 1897, 1987, 2075, 2161, 2245, 2325, 2401, 2473, 2541, + 2605, 2663, 2717, 2765, 2807, 2845, 2877, 2903, 2923, 2935, + 2941, 2942, 0, 1, 7, 21, 41, 67, 99, 137, + 181, 229, 283, 343, 407, 477, 551, 629, 711, 797, + 885, 977, 1071, 1167, 1265, 1365, 1465, 1565, 1667, 1767, + 1867, 1967, 2065, 2161, 2255, 2347, 2435, 2521, 2603, 2681, + 2755, 2825, 2889, 2949, 3003, 3051, 3095, 3133, 3165, 3191, + 3211, 3225, 3231, 3232, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 347, 413, 483, 559, 639, + 723, 811, 903, 997, 1093, 1193, 1295, 1399, 1503, 1609, + 1715, 1821, 1927, 2033, 2137, 2241, 2343, 2443, 2539, 2633, + 2725, 2813, 2897, 2977, 3053, 3123, 3189, 3249, 3305, 3355, + 3399, 3437, 3469, 3495, 3515, 3529, 3535, 3536, 0, 1, + 7, 21, 41, 67, 99, 137, 181, 231, 287, 349, + 415, 487, 563, 645, 731, 821, 915, 1011, 1111, 1213, + 1317, 1423, 1531, 1641, 1751, 1863, 1975, 2087, 2197, 2307, + 2415, 2521, 2625, 2727, 2827, 2923, 3017, 3107, 3193, 3275, + 3351, 3423, 3489, 3551, 3607, 3657, 3701, 3739, 3771, 3797, + 3817, 3831, 3837, 3838, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 285, 345, 411, 481, 557, 637, + 721, 809, 901, 997, 1097, 1199, 1305, 1413, 1523, 1635, + 1749, 1863, 1979, 2095, 2211, 2327, 2443, 2557, 2671, 2783, + 2893, 3001, 3107, 3209, 3309, 3405, 3497, 3585, 3669, 3749, + 3825, 3895, 3961, 4021, 4075, 4125, 4169, 4207, 4239, 4265, + 4285, 4299, 4305, 4306, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 347, 413, 485, 561, 643, + 729, 819, 913, 1011, 1113, 1217, 1325, 1435, 1547, 1663, + 1779, 1897, 2017, 2137, 2257, 2377, 2497, 2617, 2737, 2855, + 2971, 3087, 3199, 3309, 3417, 3521, 3623, 3721, 3815, 3905, + 3991, 4073, 4149, 4221, 4287, 4347, 4403, 4453, 4497, 4535, + 4567, 4593, 4613, 4627, 4633, 4634, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 415, 487, + 565, 647, 733, 825, 921, 1021, 1125, 1231, 1341, 1453, + 1569, 1687, 1807, 1929, 2051, 2175, 2299, 2425, 2551, 2677, + 2801, 2925, 3047, 3169, 3289, 3407, 3523, 3635, 3745, 3851, + 3955, 4055, 4151, 4243, 4329, 4411, 4489, 4561, 4627, 4689, + 4745, 4795, 4839, 4877, 4909, 4935, 4955, 4969, 4975, 4976, + 0, 1, 7, 21, 41, 67, 99, 137, 181, 231, + 287, 349, 417, 489, 567, 649, 737, 829, 925, 1025, + 1129, 1237, 1349, 1463, 1581, 1701, 1823, 1947, 2073, 2201, + 2329, 2459, 2589, 2719, 2849, 2979, 3107, 3235, 3361, 3485, + 3607, 3727, 3845, 3959, 4071, 4179, 4283, 4383, 4479, 4571, + 4659, 4741, 4819, 4891, 4959, 5021, 5077, 5127, 5171, 5209, + 5241, 5267, 5287, 5301, 5307, 5308, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 417, 489, + 567, 651, 739, 831, 929, 1031, 1137, 1247, 1361, 1477, + 1597, 1719, 1843, 1969, 2097, 2227, 2359, 2491, 2625, 2759, + 2893, 3027, 3161, 3293, 3425, 3555, 3683, 3809, 3933, 4055, + 4175, 4291, 4405, 4515, 4621, 4723, 4821, 4913, 5001, 5085, + 5163, 5235, 5303, 5365, 5421, 5471, 5515, 5553, 5585, 5611, + 5631, 5645, 5651, 5652, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 569, 653, + 741, 835, 933, 1035, 1141, 1251, 1365, 1483, 1603, 1727, + 1853, 1983, 2115, 2249, 2383, 2519, 2657, 2795, 2933, 3071, + 3209, 3347, 3485, 3621, 3755, 3889, 4021, 4151, 4277, 4401, + 4521, 4639, 4753, 4863, 4969, 5071, 5169, 5263, 5351, 5435, + 5513, 5587, 5655, 5717, 5773, 5823, 5867, 5905, 5937, 5963, + 5983, 5997, 6003, 6004, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 569, 653, + 741, 835, 933, 1037, 1145, 1257, 1373, 1491, 1613, 1739, + 1867, 1997, 2131, 2267, 2405, 2543, 2683, 2825, 2967, 3109, + 3251, 3393, 3535, 3677, 3817, 3955, 4093, 4229, 4363, 4493, + 4621, 4747, 4869, 4987, 5103, 5215, 5323, 5427, 5525, 5619, + 5707, 5791, 5869, 5943, 6011, 6073, 6129, 6179, 6223, 6261, + 6293, 6319, 6339, 6353, 6359, 6360, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, + 569, 653, 743, 837, 935, 1039, 1147, 1259, 1375, 1495, + 1619, 1745, 1875, 2007, 2143, 2281, 2421, 2563, 2705, 2849, + 2993, 3139, 3285, 3431, 3577, 3723, 3867, 4011, 4153, 4295, + 4435, 4573, 4709, 4841, 4971, 5097, 5221, 5341, 5457, 5569, + 5677, 5781, 5879, 5973, 6063, 6147, 6225, 6299, 6367, 6429, + 6485, 6535, 6579, 6617, 6649, 6675, 6695, 6709, 6715, 6716, + 0, 1, 7, 21, 41, 67, 99, 137, 181, 231, + 287, 349, 417, 491, 569, 653, 743, 837, 937, 1041, + 1149, 1261, 1377, 1497, 1621, 1749, 1879, 2013, 2149, 2287, + 2429, 2573, 2717, 2863, 3011, 3159, 3309, 3459, 3609, 3759, + 3909, 4057, 4205, 4351, 4495, 4639, 4781, 4919, 5055, 5189, + 5319, 5447, 5571, 5691, 5807, 5919, 6027, 6131, 6231, 6325, + 6415, 6499, 6577, 6651, 6719, 6781, 6837, 6887, 6931, 6969, + 7001, 7027, 7047, 7061, 7067, 7068, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, + 569, 653, 743, 837, 937, 1041, 1149, 1261, 1377, 1497, + 1621, 1749, 1881, 2015, 2153, 2293, 2435, 2579, 2725, 2873, + 3023, 3175, 3327, 3479, 3633, 3787, 3941, 4093, 4245, 4397, + 4547, 4695, 4841, 4985, 5127, 5267, 5405, 5539, 5671, 5799, + 5923, 6043, 6159, 6271, 6379, 6483, 6583, 6677, 6767, 6851, + 6929, 7003, 7071, 7133, 7189, 7239, 7283, 7321, 7353, 7379, + 7399, 7413, 7419, 7420, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 489, 567, 651, + 741, 835, 935, 1039, 1147, 1259, 1377, 1499, 1625, 1753, + 1885, 2021, 2159, 2301, 2445, 2591, 2739, 2889, 3041, 3195, + 3349, 3505, 3661, 3817, 3973, 4129, 4285, 4441, 4595, 4749, + 4901, 5051, 5199, 5345, 5489, 5631, 5769, 5905, 6037, 6165, + 6291, 6413, 6531, 6643, 6751, 6855, 6955, 7049, 7139, 7223, + 7301, 7373, 7441, 7503, 7559, 7609, 7653, 7691, 7723, 7749, + 7769, 7783, 7789, 7790, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, + 747, 843, 945, 1051, 1161, 1277, 1397, 1521, 1649, 1781, + 1915, 2053, 2195, 2339, 2485, 2635, 2787, 2941, 3095, 3251, + 3409, 3567, 3725, 3885, 4045, 4205, 4363, 4521, 4679, 4835, + 4989, 5143, 5295, 5445, 5591, 5735, 5877, 6015, 6149, 6281, + 6409, 6533, 6653, 6769, 6879, 6985, 7087, 7183, 7273, 7359, + 7439, 7513, 7581, 7643, 7699, 7749, 7793, 7831, 7863, 7889, + 7909, 7923, 7929, 7930, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, + 747, 843, 943, 1049, 1159, 1273, 1393, 1517, 1645, 1777, + 1913, 2051, 2193, 2337, 2485, 2635, 2787, 2941, 3097, 3255, + 3415, 3575, 3737, 3899, 4061, 4223, 4385, 4547, 4709, 4869, + 5029, 5187, 5343, 5497, 5649, 5799, 5947, 6091, 6233, 6371, + 6507, 6639, 6767, 6891, 7011, 7125, 7235, 7341, 7441, 7537, + 7627, 7713, 7793, 7867, 7935, 7997, 8053, 8103, 8147, 8185, + 8217, 8243, 8263, 8277, 8283, 8284, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, + 571, 655, 745, 841, 941, 1047, 1157, 1271, 1389, 1513, + 1641, 1773, 1907, 2045, 2187, 2331, 2479, 2629, 2783, 2939, + 3097, 3257, 3417, 3579, 3743, 3907, 4071, 4235, 4399, 4563, + 4727, 4891, 5055, 5217, 5377, 5537, 5695, 5851, 6005, 6155, + 6303, 6447, 6589, 6727, 6861, 6993, 7121, 7245, 7363, 7477, + 7587, 7693, 7793, 7889, 7979, 8063, 8143, 8217, 8285, 8347, + 8403, 8453, 8497, 8535, 8567, 8593, 8613, 8627, 8633, 8634, + 0, 1, 7, 21, 41, 67, 99, 137, 181, 231, + 287, 349, 417, 491, 571, 657, 749, 845, 947, 1053, + 1165, 1281, 1401, 1527, 1657, 1791, 1929, 2069, 2213, 2361, + 2511, 2663, 2819, 2977, 3137, 3299, 3463, 3627, 3793, 3959, + 4125, 4293, 4461, 4629, 4795, 4961, 5127, 5291, 5455, 5617, + 5777, 5935, 6091, 6243, 6393, 6541, 6685, 6825, 6963, 7097, + 7227, 7353, 7473, 7589, 7701, 7807, 7909, 8005, 8097, 8183, + 8263, 8337, 8405, 8467, 8523, 8573, 8617, 8655, 8687, 8713, + 8733, 8747, 8753, 8754, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, + 747, 843, 943, 1049, 1159, 1275, 1395, 1519, 1647, 1779, + 1915, 2055, 2199, 2345, 2495, 2647, 2803, 2961, 3121, 3283, + 3447, 3613, 3779, 3947, 4115, 4285, 4455, 4625, 4795, 4965, + 5133, 5301, 5467, 5633, 5797, 5959, 6119, 6277, 6433, 6585, + 6735, 6881, 7025, 7165, 7301, 7433, 7561, 7685, 7805, 7921, + 8031, 8137, 8237, 8333, 8423, 8509, 8589, 8663, 8731, 8793, + 8849, 8899, 8943, 8981, 9013, 9039, 9059, 9073, 9079, 9080, + 0, 1, 7, 19, 39, 65, 97, 135, 179, 229, + 285, 347, 415, 489, 567, 651, 741, 835, 935, 1041, + 1151, 1265, 1385, 1509, 1637, 1769, 1905, 2045, 2189, 2335, + 2485, 2637, 2793, 2951, 3111, 3273, 3437, 3603, 3771, 3939, + 4109, 4279, 4451, 4623, 4795, 4967, 5139, 5309, 5479, 5647, + 5815, 5981, 6145, 6307, 6467, 6625, 6781, 6933, 7083, 7229, + 7373, 7513, 7649, 7781, 7909, 8033, 8153, 8267, 8377, 8483, + 8583, 8677, 8767, 8851, 8929, 9003, 9071, 9133, 9189, 9239, + 9283, 9321, 9353, 9379, 9399, 9411, 9417, 9418, 0, 1, + 7, 21, 41, 67, 99, 137, 181, 231, 287, 349, + 417, 491, 571, 657, 747, 843, 945, 1051, 1163, 1279, + 1399, 1525, 1655, 1789, 1927, 2069, 2213, 2361, 2513, 2667, + 2825, 2985, 3147, 3311, 3477, 3645, 3815, 3985, 4157, 4329, + 4503, 4677, 4851, 5025, 5199, 5371, 5543, 5713, 5883, 6051, + 6217, 6381, 6543, 6703, 6861, 7015, 7167, 7315, 7459, 7601, + 7739, 7873, 8003, 8129, 8249, 8365, 8477, 8583, 8685, 8781, + 8871, 8957, 9037, 9111, 9179, 9241, 9297, 9347, 9391, 9429, + 9461, 9487, 9507, 9521, 9527, 9528, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, + 571, 657, 749, 845, 947, 1055, 1167, 1285, 1407, 1533, + 1663, 1797, 1935, 2077, 2223, 2373, 2525, 2681, 2839, 3001, + 3165, 3331, 3499, 3669, 3839, 4011, 4185, 4359, 4533, 4709, + 4885, 5061, 5235, 5409, 5583, 5755, 5925, 6095, 6263, 6429, + 6593, 6755, 6913, 7069, 7221, 7371, 7517, 7659, 7797, 7931, + 8061, 8187, 8309, 8427, 8539, 8647, 8749, 8845, 8937, 9023, + 9103, 9177, 9245, 9307, 9363, 9413, 9457, 9495, 9527, 9553, + 9573, 9587, 9593, 9594, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 571, 655, + 745, 841, 941, 1047, 1157, 1273, 1393, 1517, 1647, 1781, + 1919, 2061, 2207, 2355, 2507, 2663, 2821, 2981, 3145, 3311, + 3479, 3649, 3821, 3993, 4167, 4341, 4517, 4693, 4869, 5045, + 5221, 5397, 5573, 5747, 5921, 6093, 6265, 6435, 6603, 6769, + 6933, 7093, 7251, 7407, 7559, 7707, 7853, 7995, 8133, 8267, + 8397, 8521, 8641, 8757, 8867, 8973, 9073, 9169, 9259, 9343, + 9423, 9497, 9565, 9627, 9683, 9733, 9777, 9815, 9847, 9873, + 9893, 9907, 9913, 9914, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, + 747, 843, 945, 1051, 1163, 1279, 1401, 1527, 1657, 1791, + 1929, 2071, 2217, 2367, 2519, 2675, 2835, 2997, 3161, 3327, + 3495, 3665, 3837, 4011, 4185, 4361, 4537, 4715, 4893, 5071, + 5249, 5427, 5603, 5779, 5953, 6127, 6299, 6469, 6637, 6803, + 6967, 7129, 7289, 7445, 7597, 7747, 7893, 8035, 8173, 8307, + 8437, 8563, 8685, 8801, 8913, 9019, 9121, 9217, 9307, 9393, + 9473, 9547, 9615, 9677, 9733, 9783, 9827, 9865, 9897, 9923, + 9943, 9957, 9963, 9964, 0, 1, 7, 21, 41, 67, + 99, 137, 181, 231, 287, 349, 417, 491, 571, 657, + 749, 845, 947, 1055, 1167, 1285, 1407, 1533, 1663, 1799, + 1939, 2083, 2229, 2379, 2533, 2689, 2849, 3011, 3177, 3345, + 3515, 3687, 3861, 4035, 4211, 4387, 4565, 4743, 4921, 5099, + 5277, 5455, 5633, 5809, 5985, 6159, 6333, 6505, 6675, 6843, + 7009, 7171, 7331, 7487, 7641, 7791, 7937, 8081, 8221, 8357, + 8487, 8613, 8735, 8853, 8965, 9073, 9175, 9271, 9363, 9449, + 9529, 9603, 9671, 9733, 9789, 9839, 9883, 9921, 9953, 9979, + 9999, 10013, 10019, 10020, 0, 1, 7, 19, 39, 65, + 97, 135, 179, 229, 285, 347, 415, 489, 567, 651, + 741, 837, 937, 1043, 1153, 1269, 1389, 1513, 1643, 1777, + 1915, 2057, 2203, 2351, 2503, 2659, 2817, 2979, 3143, 3309, + 3477, 3647, 3819, 3993, 4169, 4345, 4523, 4701, 4881, 5061, + 5241, 5421, 5601, 5779, 5957, 6133, 6309, 6483, 6655, 6825, + 6993, 7159, 7323, 7485, 7643, 7799, 7951, 8099, 8245, 8387, + 8525, 8659, 8789, 8913, 9033, 9149, 9259, 9365, 9465, 9561, + 9651, 9735, 9813, 9887, 9955, 10017, 10073, 10123, 10167, 10205, + 10237, 10263, 10283, 10295, 10301, 10302, 0, 1, 7, 21, + 41, 67, 99, 137, 181, 231, 287, 349, 417, 491, + 571, 655, 745, 841, 941, 1047, 1159, 1275, 1395, 1521, + 1651, 1785, 1923, 2065, 2211, 2361, 2513, 2669, 2829, 2991, + 3155, 3321, 3491, 3663, 3837, 4011, 4187, 4365, 4543, 4723, + 4903, 5083, 5263, 5443, 5623, 5803, 5981, 6159, 6335, 6509, + 6683, 6855, 7025, 7191, 7355, 7517, 7677, 7833, 7985, 8135, + 8281, 8423, 8561, 8695, 8825, 8951, 9071, 9187, 9299, 9405, + 9505, 9601, 9691, 9775, 9855, 9929, 9997, 10059, 10115, 10165, + 10209, 10247, 10279, 10305, 10325, 10339, 10345, 10346, 0, 1, + 7, 21, 41, 67, 99, 137, 181, 231, 287, 349, + 417, 491, 571, 655, 745, 841, 943, 1049, 1161, 1277, + 1397, 1523, 1653, 1787, 1925, 2067, 2213, 2363, 2517, 2673, + 2833, 2995, 3159, 3327, 3497, 3669, 3843, 4019, 4195, 4373, + 4551, 4731, 4911, 5091, 5271, 5451, 5631, 5811, 5989, 6167, + 6343, 6519, 6693, 6865, 7035, 7203, 7367, 7529, 7689, 7845, + 7999, 8149, 8295, 8437, 8575, 8709, 8839, 8965, 9085, 9201, + 9313, 9419, 9521, 9617, 9707, 9791, 9871, 9945, 10013, 10075, + 10131, 10181, 10225, 10263, 10295, 10321, 10341, 10355, 10361, 10362, + 0, 1, 7, 21, 41, 67, 99, 137, 181, 231, + 287, 349, 417, 491, 571, 657, 747, 843, 945, 1051, + 1163, 1279, 1399, 1525, 1655, 1789, 1927, 2069, 2215, 2365, + 2519, 2675, 2835, 2997, 3161, 3329, 3499, 3671, 3845, 4021, + 4197, 4375, 4553, 4733, 4913, 5093, 5273, 5453, 5633, 5813, + 5991, 6169, 6345, 6521, 6695, 6867, 7037, 7205, 7369, 7531, + 7691, 7847, 8001, 8151, 8297, 8439, 8577, 8711, 8841, 8967, + 9087, 9203, 9315, 9421, 9523, 9619, 9709, 9795, 9875, 9949, + 10017, 10079, 10135, 10185, 10229, 10267, 10299, 10325, 10345, 10359, + 10365, 10366 +}; + +const Word16 ivas_pca_offset_n2[IVAS_PCA_N1] = +{ + 0, 2, 6, 14, 24, 38, 56, 76, 100, 126, 156, 188, + 224, 262, 302, 346, 392, 442, 494, 548, 604, 664, 726, 790, + 856, 924, 994, 1066, 1140, 1216, 1294, 1374, 1454, 1536, 1620, 1704, + 1790, 1878, 1966, 2054, 2144, 2234, 2324, 2416, 2508, 2600, 2692, 2784, + 2876, 2968, 3058, 3148, 3238, 3326, 3414, 3502, 3588, 3672, 3756, 3838, + 3918, 3998, 4076, 4152, 4226, 4298, 4368, 4436, 4502, 4566, 4628, 4688, + 4744, 4798, 4850, 4900, 4946, 4990, 5030, 5068, 5104, 5136, 5166, 5192, + 5216, 5236, 5254, 5268, 5278, 5286, 5290 +}; + +const Word16 ph1_q_n2_tbl[IVAS_PCA_N1][2] = { /* ph1_q : Q13, n2 : Q0 */ + { 0, 1 }, + { 286, 3 }, + { 572, 7 }, + { 858, 9 }, + { 1144, 13 }, + { 1430, 17 }, + { 1716, 19 }, + { 2002, 23 }, + { 2288, 25 }, + { 2574, 29 }, + { 2860, 31 }, + { 3146, 35 }, + { 3431, 37 }, + { 3717, 39 }, + { 4003, 43 }, + { 4289, 45 }, + { 4575, 49 }, + { 4861, 51 }, + { 5147, 53 }, + { 5433, 55 }, + { 5719, 59 }, + { 6005, 61 }, + { 6291, 63 }, + { 6577, 65 }, + { 6863, 67 }, + { 7149, 69 }, + { 7435, 71 }, + { 7721, 73 }, + { 8007, 75 }, + { 8293, 77 }, + { 8579, 79 }, + { 8865, 79 }, + { 9151, 81 }, + { 9437, 83 }, + { 9722, 83 }, + { 10008, 85 }, + { 10294, 87 }, + { 10580, 87 }, + { 10866, 87 }, + { 11152, 89 }, + { 11438, 89 }, + { 11724, 89 }, + { 12010, 91 }, + { 12296, 91 }, + { 12582, 91 }, + { 12868, 91 }, + { 13154, 91 }, + { 13440, 91 }, + { 13726, 91 }, + { 14012, 89 }, + { 14298, 89 }, + { 14584, 89 }, + { 14870, 87 }, + { 15156, 87 }, + { 15442, 87 }, + { 15728, 85 }, + { 16013, 83 }, + { 16299, 83 }, + { 16585, 81 }, + { 16871, 79 }, + { 17157, 79 }, + { 17443, 77 }, + { 17729, 75 }, + { 18015, 73 }, + { 18301, 71 }, + { 18587, 69 }, + { 18873, 67 }, + { 19159, 65 }, + { 19445, 63 }, + { 19731, 61 }, + { 20017, 59 }, + { 20303, 55 }, + { 20589, 53 }, + { 20875, 51 }, + { 21161, 49 }, + { 21447, 45 }, + { 21733, 43 }, + { 22019, 39 }, + { 22304, 37 }, + { 22590, 35 }, + { 22876, 31 }, + { 23162, 29 }, + { 23448, 25 }, + { 23734, 23 }, + { 24020, 19 }, + { 24306, 17 }, + { 24592, 13 }, + { 24878, 9 }, + { 25164, 7 }, + { 25450, 3 }, + { 25736, 1 } +}; + + +/*----------------------------------------------------------------------------------* + * Parametric MC ROM tables + *----------------------------------------------------------------------------------*/ + +const Word16 param_mc_band_grouping_20[20 + 1] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 20, 23, 27, 33, 40, 52, 60 +}; + +const Word16 param_mc_coding_band_mapping_20[20] = +{ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +const Word16 param_mc_bands_coded_20[4] = +{ + 10, 14, 18, 20 +}; + +const Word16 param_mc_band_grouping_14[14 + 1] = +{ + 0, 1, 2, 3, 4, 5, 6, 8, 10, 13, 16, 20, 28, 40, 60 +}; + +const Word16 param_mc_coding_band_mapping_14[14] = +{ + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 +}; + +const Word16 param_mc_bands_coded_14[4] = +{ + 8, 11, 13, 14 +}; + +const Word16 param_mc_band_grouping_10[10 + 1] = +{ + 0, 1, 2, 3, 5, 7, 10, 14, 20, 40, 60 +}; + + +const Word16 param_mc_bands_coded_10[4] = +{ + 6, 8, 9, 10 +}; + +const Word16 param_mc_coding_band_mapping_10[10] = +{ + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 +}; + +const Word16 Param_MC_index[MAX_LS_CHANNELS] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 +}; + +const Word32 ivas_param_mc_dmx_fac_CICP6_2tc_fx[12] = +{ + 2147483647,0,1518500224,1518500224,2147483647,0, /*Lt*/ + 0,2147483647,1518500224,1518500224,0,2147483647 /*Rt*/ +}; + +const Word32 ivas_param_mc_dmx_fac_CICP12_2tc_fx[16] = +{ + 2147483647,0,1518500224,1518500224,2147483647,0,2147483647,0, /*Lt*/ + 0,2147483647,1518500224,1518500224,0,2147483647,0,2147483647 /*Rt*/ +}; + +const Word32 ivas_param_mc_dmx_fac_CICP12_3tc_fx[24] = +{ + 2147483647,0,0,0,2147483647,0,2147483647,0, /*Lt*/ + 0,2147483647,0,0,0,2147483647,0,2147483647, /*Rt*/ + 0,0,2147483647,2147483647,0,0,0,0 /*Ct*/ +}; + +const Word32 ivas_param_mc_dmx_fac_CICP14_2tc_fx[16] = +{ + 2147483647,0,1518500224,1518500224,2147483647,0,2147483647,0, /*Lt*/ + 0,2147483647,1518500224,1518500224,0,2147483647,0,2147483647 /*Rt*/ +}; +const Word32 ivas_param_mc_dmx_fac_CICP14_3tc_fx[24] = +{ + 2147483647,0,0,0,2147483647,0,2147483647,0, /*Lt*/ + 0,2147483647,0,0,0,2147483647,0,2147483647, /*Rt*/ + 0,0,2147483647,2147483647,0,0,0,0 /*Ct*/ +}; + +const Word32 ivas_param_mc_dmx_fac_CICP16_3tc_fx[30] = +{ + 2147483647,0,0,0,2147483647,0,2147483647,0,2147483647,0, /*Lt*/ + 0,2147483647,0,0,0,2147483647,0,2147483647,0,2147483647, /*Rt*/ + 0,0,2147483647,2147483647,0,0,0,0,0,0 /*Ct*/ +}; + +const Word32 ivas_param_mc_dmx_fac_CICP19_3tc_fx[36] = +{ + 2147483647,0,0,0,2147483647,0,2147483647,0,2147483647,0,2147483647,0, /*Lt*/ + 0,2147483647,0,0,0,2147483647,0,2147483647,0,2147483647,0,2147483647, /*Rt*/ + 0,0,2147483647,2147483647,0,0,0,0,0,0,0,0 /*Ct*/ +}; + +//Q15 +const Word16 ivas_param_mc_ild_fac_CICP6_2tc_fx[6] = +{ + 12832, + 12832, + 6820, + 10607, + 10607, + 6820 +}; + +//Q15 +const Word16 ivas_param_mc_ild_fac_CICP12_2tc_fx[8] = +{ + 11965, + 11965, + 6816, + 6877, + 6877, + 5619, + 5619, + 6816 +}; + +//Q15 +const Word16 ivas_param_mc_ild_fac_CICP12_3tc_fx[8] = +{ + 16384, + 16384, + 9502, + 9502, + 6553, + 6553, + 32767, + 8192 +}; + +//Q15 +const Word16 ivas_param_mc_ild_fac_CICP14_2tc_fx[8] = +{ + 11936, + 11936, + 5993, + 6945, + 6945, + 8049, + 8049, + 6816 +}; + +//Q15 +const Word16 ivas_param_mc_ild_fac_CICP14_3tc_fx[8] = +{ + 16291, + 16291, + 8257, + 8257, + 9666, + 9666, + 32767, + 8192 +}; + +//Q15 +const Word16 ivas_param_mc_ild_fac_CICP16_3tc_fx[10] = +{ + 11141, + 11141, + 7209, + 7209, + 6553, + 6553, + 5898, + 5898, + 32767, + 8192 +}; + +//Q15 +const Word16 ivas_param_mc_ild_fac_CICP19_3tc_fx[12] = +{ + 9830, + 9830, + 5570, + 5570, + 3932, + 3932, + 6226, + 6226, + 6226, + 6226, + 32767, + 16384 +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP6_2tc = +{ + 5, + 6, + {0,1,2,4,5,3}, + {1,1,2,1,1,2}, + {{0},{1},{0,1},{0},{1},{0,1}} +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP12_2tc = +{ + 7, + 8, + {0,1,2,4,5,6,7,3}, + {1,1,2,1,1,1,1,2}, + {{0},{1},{0,1},{0},{1},{0},{1},{0,1}} +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP12_3tc = +{ + 6, + 8, + {0,1,4,5,6,7,2,3}, + {1,1,1,1,1,1,1,1}, + {{0},{1},{0},{1},{0},{1},{2},{2}} +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP14_2tc = +{ + 7, + 8, + {0,1,2,4,5,6,7,3}, + {1,1,2,1,1,1,1,2}, + {{0},{1},{0,1},{0},{1},{0},{1},{0,1}} +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP14_3tc = +{ + 6, + 8, + {0,1,4,5,6,7,2,3}, + {1,1,1,1,1,1,1,1}, + {{0},{1},{0},{1},{0},{1},{2},{2}} +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP16_3tc = +{ + 8, + 10, + {0,1,4,5,6,7,8,9,2,3}, + {1,1,1,1,1,1,1,1,1,1}, + {{0},{1},{0},{1},{0},{1},{0},{1},{2},{2}} +}; + +const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP19_3tc = +{ + 10, + 12, + {0,1,4,5,6,7,8,9,10,11,2,3}, + {1,1,1,1,1,1,1,1,1,1,1,1}, + {{0},{1},{0},{1},{0},{1},{0},{1},{0},{1},{2},{2}} +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP6_2tc = +{ + 4, + 5, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 2, 3 }} /* C/LFE */ +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP12_2tc = +{ + 6, + 7, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 2, 6 }, /* C/BLS */ + { 2, 7 }, /* C/BRS */ + { 2, 3 } /* C/LFE */ + } +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP12_3tc = +{ + 6, + 7, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 0, 6 }, /* L/BLS */ + { 1, 7 }, /* R/BRS */ + { 2, 3 } /* C/LFE */ + } +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP14_2tc = +{ + 6, + 7, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 2, 6 }, /* C/UFL */ + { 2, 7 }, /* C/UFR */ + { 2, 3 } /* C/LFE */ + } +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP14_3tc = +{ + 6, + 7, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 0, 6 }, /* L/UFL */ + { 1, 7 }, /* R/UFR */ + { 2, 3 } /* C/LFE */ + } +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP16_3tc = +{ + 8, + 9, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 0, 6 }, /* L/UFL */ + { 1, 7 }, /* R/UFR */ + { 4, 8 }, /* LS/UBL */ + { 5, 9 }, /* RS/UBR */ + { 2, 3 } /* C/LFE */ + } +}; + +const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP19_3tc = +{ + 10, + 11, + { { 0, 4 }, /* L/LS */ + { 1, 5 }, /* R/RS */ + { 0, 2 }, /* L/C */ + { 1, 2 }, /* R/C */ + { 0, 6 }, /* L/LBS */ + { 1, 7 }, /* R/RBS */ + { 0, 8 }, /* L/UFL */ + { 1, 9 }, /* R/UFR */ + { 6, 10 }, /* LBS/UBL */ + { 7, 11 }, /* RBS/UBR */ + { 2, 3 } /* C/LFE */ + } +}; + +const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = +{ + /* CICP6 48000 */ + { + MC_LS_SETUP_5_1, + 6, + 2, + IVAS_48k, + &ivas_param_mc_ild_mapping_CICP6_2tc, + &ivas_param_mc_icc_mapping_CICP6_2tc, + &ivas_param_mc_ild_fac_CICP6_2tc_fx[0], + &ivas_param_mc_dmx_fac_CICP6_2tc_fx[0] + }, + /* CICP6 64000 */ + { + MC_LS_SETUP_5_1, + 6, + 2, + IVAS_64k, + &ivas_param_mc_ild_mapping_CICP6_2tc, + &ivas_param_mc_icc_mapping_CICP6_2tc, + &ivas_param_mc_ild_fac_CICP6_2tc_fx[0], + & ivas_param_mc_dmx_fac_CICP6_2tc_fx[0] + }, + /* CICP6 80000 */ + { + MC_LS_SETUP_5_1, + 6, + 2, + IVAS_80k, + &ivas_param_mc_ild_mapping_CICP6_2tc, + &ivas_param_mc_icc_mapping_CICP6_2tc, + &ivas_param_mc_ild_fac_CICP6_2tc_fx[0], + & ivas_param_mc_dmx_fac_CICP6_2tc_fx[0] + }, + /* CICP12 48000 */ + { + MC_LS_SETUP_7_1, + 8, + 2, + IVAS_48k, + &ivas_param_mc_ild_mapping_CICP12_2tc, + &ivas_param_mc_icc_mapping_CICP12_2tc, + &ivas_param_mc_ild_fac_CICP12_2tc_fx[0], + &ivas_param_mc_dmx_fac_CICP12_2tc_fx[0] + }, + /* CICP12 64000 */ + { + MC_LS_SETUP_7_1, + 8, + 2, + IVAS_64k, + &ivas_param_mc_ild_mapping_CICP12_2tc, + &ivas_param_mc_icc_mapping_CICP12_2tc, + &ivas_param_mc_ild_fac_CICP12_2tc_fx[0], + &ivas_param_mc_dmx_fac_CICP12_2tc_fx[0] + }, + /* CICP12 80000 */ + { + MC_LS_SETUP_7_1, + 8, + 2, + IVAS_80k, + &ivas_param_mc_ild_mapping_CICP12_2tc, + &ivas_param_mc_icc_mapping_CICP12_2tc, + &ivas_param_mc_ild_fac_CICP12_2tc_fx[0], + &ivas_param_mc_dmx_fac_CICP12_2tc_fx[0], + }, + /* CICP12 96000 */ + { + MC_LS_SETUP_7_1, + 8, + 3, + IVAS_96k, + &ivas_param_mc_ild_mapping_CICP12_3tc, + &ivas_param_mc_icc_mapping_CICP12_3tc, + &ivas_param_mc_ild_fac_CICP12_3tc_fx[0], + &ivas_param_mc_dmx_fac_CICP12_3tc_fx[0] + }, + /* CICP14 48000 */ + { + MC_LS_SETUP_5_1_2, + 8, + 2, + IVAS_48k, + &ivas_param_mc_ild_mapping_CICP14_2tc, + &ivas_param_mc_icc_mapping_CICP14_2tc, + &ivas_param_mc_ild_fac_CICP14_2tc_fx[0], + &ivas_param_mc_dmx_fac_CICP14_2tc_fx[0] + }, + /* CICP14 64000 */ + { + MC_LS_SETUP_5_1_2, + 8, + 2, + IVAS_64k, + &ivas_param_mc_ild_mapping_CICP14_2tc, + &ivas_param_mc_icc_mapping_CICP14_2tc, + &ivas_param_mc_ild_fac_CICP14_2tc_fx[0], + &ivas_param_mc_dmx_fac_CICP14_2tc_fx[0] + }, + /* CICP14 80000 */ + { + MC_LS_SETUP_5_1_2, + 8, + 2, + IVAS_80k, + &ivas_param_mc_ild_mapping_CICP14_2tc, + &ivas_param_mc_icc_mapping_CICP14_2tc, + &ivas_param_mc_ild_fac_CICP14_2tc_fx[0], + &ivas_param_mc_dmx_fac_CICP14_2tc_fx[0] + }, + /* CICP14 96000 */ + { + MC_LS_SETUP_5_1_2, + 8, + 3, + IVAS_96k, + &ivas_param_mc_ild_mapping_CICP14_3tc, + &ivas_param_mc_icc_mapping_CICP14_3tc, + &ivas_param_mc_ild_fac_CICP14_3tc_fx[0], + &ivas_param_mc_dmx_fac_CICP14_3tc_fx[0] + }, + /* CICP16 96000 */ + { + MC_LS_SETUP_5_1_4, + 10, + 3, + IVAS_96k, + &ivas_param_mc_ild_mapping_CICP16_3tc, + &ivas_param_mc_icc_mapping_CICP16_3tc, + &ivas_param_mc_ild_fac_CICP16_3tc_fx[0], + &ivas_param_mc_dmx_fac_CICP16_3tc_fx[0] + }, + /* CICP16 128000 */ + { + MC_LS_SETUP_5_1_4, + 10, + 3, + IVAS_128k, + &ivas_param_mc_ild_mapping_CICP16_3tc, + &ivas_param_mc_icc_mapping_CICP16_3tc, + &ivas_param_mc_ild_fac_CICP16_3tc_fx[0], + &ivas_param_mc_dmx_fac_CICP16_3tc_fx[0] + }, + /* CICP19 128000 */ + { + MC_LS_SETUP_7_1_4, + 12, + 3, + IVAS_128k, + &ivas_param_mc_ild_mapping_CICP19_3tc, + &ivas_param_mc_icc_mapping_CICP19_3tc, + &ivas_param_mc_ild_fac_CICP19_3tc_fx[0], + &ivas_param_mc_dmx_fac_CICP19_3tc_fx[0] + } +}; + + +/* Alphabet for delta coding for the ICCs in Parametric MC processing */ +const UWord16 ivas_param_mc_cum_freq_icc_cicp6_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1] = +{ + 0, 24, 224, 20873, 42384, 51699, 57122, 60572, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_icc_cicp6_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 24, 200, 20649, 21511, 9315, 5423, 3450, 4963 +}; + +const UWord16 ivas_param_mc_cum_freq_icc_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 0, 4, 9, 124, 447, 1311, 4453, 18116, 48636, 60573, 63692, 64746, 65327, 65531, 65534, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_icc_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1] = +{ + 4, 5, 115, 323, 864, 3142, 13663, 30520, 11937, 3119, 1054, 581, 204, 3, 1 +}; + +const UWord16 ivas_param_mc_cum_freq_icc_cicp12_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1] = +{ + 0, 30, 848, 26611, 47846, 57358, 61679, 63237, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_icc_cicp12_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 30, 818, 25763, 21235, 9512, 4321, 1558, 2298 +}; + +const UWord16 ivas_param_mc_cum_freq_icc_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 0, 2, 7, 53, 243, 979, 3994, 16732, 49642, 61343, 64331, 65158, 65438, 65532, 65534, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_icc_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1] = +{ + 2, 5, 46, 190, 736, 3015, 12738, 32910, 11701, 2988, 827, 280, 94, 2, 1 +}; + +const UWord16 ivas_param_mc_cum_freq_icc_cicp14_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1] = +{ + 0, 46, 826, 27798, 49552, 58447, 62046, 63284, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_icc_cicp14_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER ]={ + 46, 780, 26972, 21754, 8895, 3599, 1238, 2251 +}; + +const UWord16 ivas_param_mc_cum_freq_icc_delta_cicp14_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 0, 3, 8, 36, 172, 763, 3436, 15845, 50168, 62005, 64676, 65298, 65481, 65533, 65534, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_icc_delta_cicp14_48_16bits[2* PARAM_MC_SZ_ICC_QUANTIZER - 1] = +{ + 3, 5, 28, 136, 591, 2673, 12409, 34323, 11837, 2671, 622, 183, 52, 1, 1 +}; + +const UWord16 ivas_param_mc_cum_freq_icc_combined_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1] = +{ + 0, 34, 552, 24717, 45819, 54772, 59054, 61166, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_icc_combined_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 34, 518, 24165, 21102, 8953, 4282, 2112, 4369 +}; + +const UWord16 ivas_param_mc_cum_freq_icc_delta_combined_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER] = +{ + 0, 3, 7, 74, 304, 1009, 3870, 16502, 49834, 61384, 64217, 65020, 65369, 65531, 65534, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_icc_delta_combined_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1] = +{ + 3, 4, 67, 230, 705, 2861, 12632, 33332, 11550, 2833, 803, 349, 162, 3, 1 +}; + +const UWord16 ivas_param_mc_cum_freq_ild_cicp6_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1] = +{ + 0, 1092, 5574, 8315, 10652, 13875, 19656, 27664, 36284, 47058, 56251, 62579, 65118, 65462, 65513, 65532, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_ild_cicp6_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 1092, 4482, 2741, 2337, 3223, 5781, 8008, 8620, 10774, 9193, 6328, 2539, 344, 51, 19, 3 +}; + +const UWord16 ivas_param_mc_cum_freq_ild_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 0, 1, 2, 3, 5, 38, 146, 352, 638, 997, 1559, 2323, 3570, 5859, 10556, 21075, 44682, 55617, 60408, 62739, 63833, 64443, 64809, 65074, 65279, 65400, 65484, 65531, 65532, 65533, 65534, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_ild_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1] = +{ + 1, 1, 1, 2, 33, 108, 206, 286, 359, 562, 764, 1247, 2289, 4697, 10519, 23607, 10935, 4791, 2331, 1094, 610, 366, 265, 205, 121, 84, 47, 1, 1, 1, 1 +}; + +const UWord16 ivas_param_mc_cum_freq_ild_cicp12_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1] = +{ + 0, 967, 6335, 9941, 12837, 16652, 22416, 29814, 38807, 48497, 57184, 62661, 64916, 65466, 65514, 65530, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_ild_cicp12_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 967, 5368, 3606, 2896, 3815, 5764, 7398, 8993, 9690, 8687, 5477, 2255, 550, 48, 16, 5 +}; + +const UWord16 ivas_param_mc_cum_freq_ild_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 0, 1, 2, 3, 5, 18, 61, 149, 320, 592, 1083, 1793, 2974, 5257, 10133, 21274, 44342, 55891, 60895, 63174, 64244, 64793, 65100, 65287, 65406, 65477, 65517, 65531, 65532, 65533, 65534, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_ild_delta_cicp12_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1] = +{ + 1, 1, 1, 2, 13, 43, 88, 171, 272, 491, 710, 1181, 2283, 4876, 11141, 23068, 11549, 5004, 2279, 1070, 549, 307, 187, 119, 71, 40, 14, 1, 1, 1, 1 +}; + +const UWord16 ivas_param_mc_cum_freq_ild_cicp14_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1] = +{ + 0, 229, 7068, 10910, 13856, 17467, 22629, 29174, 36906, 46558, 55579, 61802, 65222, 65505, 65527, 65534, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_ild_cicp14_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 229, 6839, 3842, 2946, 3611, 5162, 6545, 7732, 9652, 9021, 6223, 3420, 283, 22, 7, 1 +}; + +const UWord16 ivas_param_mc_cum_freq_ild_delta_cicp14_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 0, 1, 2, 3, 4, 12, 56, 153, 278, 475, 856, 1430, 2489, 4723, 9580, 20685, 45423, 56274, 60948, 63097, 64128, 64679, 65002, 65208, 65348, 65445, 65517, 65531, 65532, 65533, 65534, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_ild_delta_cicp14_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1] = +{ + 1, 1, 1, 1, 8, 44, 97, 125, 197, 381, 574, 1059, 2234, 4857, 11105, 24738, 10851, 4674, 2149, 1031, 551, 323, 206, 140, 97, 72, 14, 1, 1, 1, 1 +}; + +const UWord16 ivas_param_mc_cum_freq_ild_combined_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS+1] = +{ + 0, 1453, 8326, 12221, 15164, 18764, 24177, 31297, 39520, 49154, 57135, 62460, 64821, 65468, 65514, 65530, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_ild_combined_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 1453, 6873, 3895, 2943, 3600, 5413, 7120, 8223, 9634, 7981, 5325, 2361, 647, 46, 16, 5 +}; + +const UWord16 ivas_param_mc_cum_freq_ild_delta_combined_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = +{ + 0, 1, 2, 3, 5, 29, 98, 220, 414, 699, 1186, 1876, 3049, 5304, 10013, 20612, 45247, 56109, 60818, 63022, 64081, 64647, 64977, 65198, 65348, 65443, 65502, 65530, 65532, 65533, 65534, 65535 +}; + +const UWord16 ivas_param_mc_sym_freq_ild_delta_combined_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS - 1] = +{ + 1, 1, 1, 2, 24, 69, 122, 194, 285, 487, 690, 1173, 2255, 4709, 10599, 24635, 10862, 4709, 2204, 1059, 566, 330, 221, 150, 95, 59, 28, 2, 1, 1, 1 +}; + + +/*----------------------------------------------------------------------------------* + * MASA ROM tables + *----------------------------------------------------------------------------------*/ + +const UWord8 ivasmasaFormatDescriptor[8] = +{ + 0x49, 0x56, 0x41, 0x53, 0x4D, 0x41, 0x53, 0x41 /* "IVASMASA" */ +}; + +const Word64 diffuseness_reconstructions_hr_fx[HR_MASA_ER_LEVELS] = { /* Q62 */ + 0, + 65865144550293504, + 138485688541642752, + 239816680157478912, + 355502895585558528, + 485544334825881600, + 667940119734386688, + 902690250311073792, + 1225260573621485568, + 1635651089665622016, + 2011983133527769088, + 2354256705207926784, + 2741003323208368128, + 3172222987529093120, + 3693796119373938688, + 4305722718742904832, +}; + +const Word32 diffuseness_thresholds_hr_fx[HR_MASA_ER_LEVELS + 1] = { /* Q30 */ + 0, + 10223616, + 20447232, + 44040192, + 67633152, + 97910784, + 128188416, + 182845440, + 237502464, + 333053952, + 428605440, + 508297216, + 587988992, + 688390144, + 788791296, + 931266560, + MAX_32 /* out-of-range large value to make searching easier */ +}; + +const Word16 bits_direction_masa[DIRAC_DIFFUSE_LEVELS] = +{ + 11, + 11, + 10, + 9, + 7, + 6, + 5, + 3 +}; + +const Word16 len_cb_dct0_masa[DIRAC_DIFFUSE_LEVELS] = { 7, 6, 5, 4, 4, 4, 3, 2 }; + +const UWord8 sur_coherence_cb_masa[MASA_MAX_NO_CV_SUR_COH*MASA_NO_CB_SUR_COH] = +{ + 16, 99, 0, 0, 0, 0, 0, 0, + 12, 64, 167, 0, 0, 0, 0, 0, + 10, 45, 100, 218, 0, 0, 0, 0, + 8, 34, 70, 124, 235, 0, 0, 0, + 7, 27, 55, 90, 141, 242, 0, 0, + 7, 23, 45, 71, 105, 153, 247, 0, + 6, 20, 38, 60, 86, 119, 165, 249 +}; + +const Word16 idx_cb_sur_coh_masa[MASA_MAX_NO_CV_SUR_COH] = { 0, 1, 2, 3, 4, 5, 5, 6 }; + +const Word16 len_huf_masa[MASA_NO_CV_COH1] = { 4, 2, 1, 3, 4 }; + +const Word16 huff_code_av_masa[MASA_NO_CV_COH1] = { 15, 2, 0, 6, 14 }; + +const Word16 no_theta_masa[NO_SPHERICAL_GRIDS-2] = /* from 1 to 11 bits */ +{ /*1, 1,*/ 2 ,2 , 4, 5, 6, 7, 10, 14, 19 + /*0, 2, 8, 6, 7, 12, 14, 16*/ +}; + +const Word16 no_phi_masa[NO_SPHERICAL_GRIDS][MAX_NO_THETA] = /* from 1 to 11 bits*/ +{ + { 2 }, + { 4 }, + { 4, 2 }, + { 8, 4 }, /* 8, 4*/ + { 12, 7, 2, 1 }, /* 12, */ + { 14, 13, 9, 2, 1 }, + { 22, 21, 17, 11, 3, 1 }, + { 33, 32, 29, 23, 17, 9, 1 }, + { 48, 47, 45, 41, 35, 28, 20, 12, 2, 1 }, + { 60, 60, 58, 56, 54, 50, 46, 41, 36, 30, 23, 17, 10, 1 }, + { 89, 89, 88, 86, 84, 81, 77, 73, 68, 63, 57, 51, 44, 38, 30, 23, 15, 8, 1 } +}; + +const Word16 MASA_band_grouping_24[24 + 1] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 30, 40, 60 +}; + +const Word16 MASA_band_mapping_24_to_18[18 + 1] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 20, 21, 22, 23, 24 +}; + +const Word16 MASA_band_mapping_24_to_12[12 + 1] = +{ + 0, 1, 2, 3, 4, 5, 7, 9, 12, 15, 20, 22, 24 +}; + +const Word16 MASA_band_mapping_24_to_8[8 + 1] = +{ + 0, 1, 2, 3, 5, 8, 12, 20, 24 +}; + +const Word16 MASA_band_mapping_24_to_5[5 + 1] = +{ + 0, 1, 3, 7, 15, 24 +}; + +const Word16 MASA_grouping_8_to_5[8] = +{ + 0, 1, 1, 2, 3, 3, 4, 4 +}; + +const Word16 MASA_grouping_12_to_5[12] = +{ + 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4 +}; + +const Word16 MASA_grouping_18_to_5[18] = +{ + 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4 +}; + +const Word16 MASA_grouping_24_to_5[24] = +{ + 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4 +}; + +/* IVAS_13k2, IVAS_16k4, IVAS_24k4, IVAS_32k, IVAS_48k, IVAS_64k, IVAS_80k, IVAS_96k, IVAS_128k, IVAS_160k, IVAS_192k, IVAS_256k, IVAS_384k, IVAS_512k */ +const Word16 masa_bits[IVAS_NUM_ACTIVE_BRATES] = +{ + 50, 60, 70, 85, 140, 180, 220, 256, 350, 432, 528, 832, 1024, MASA_MAX_BITS +}; + +const Word16 masa_bits_LR_stereo[4] = +{ + 50, 50, 60, 70 +}; + +const Word16 mcmasa_bits[IVAS_NUM_ACTIVE_BRATES] = +{ + 50, 70, 80, 120, 140, 160, 220, 256, 288, 432, 528, 832, 1024, MASA_MAX_BITS +}; + +const UWord8 masa_nbands[IVAS_NUM_ACTIVE_BRATES] = +{ + 5, 5, 5, 5, 5, 5, 5, 5, 8, 12, 18, 24, 24, 24 +}; + +const UWord8 masa_joined_nbands[IVAS_NUM_ACTIVE_BRATES] = +{ + 5, 5, 5, 8, 12, 12, 12, 18, 18, 18, 18, 24, 24, 24 +}; + +const UWord8 masa_twodir_bands[IVAS_NUM_ACTIVE_BRATES] = +{ + 0, 0, 0, 0, 0, 1, 1, 1, 3, 4, 6, 6, 9, 24 +}; + +const UWord8 masa_twodir_bands_joined[IVAS_NUM_ACTIVE_BRATES] = +{ + 0, 0, 0, 0, 0, 2, 2, 3, 4, 6, 8, 9, 12, MASA_MAXIMUM_TWO_DIR_BANDS +}; + + +/*----------------------------------------------------------------------------------* + * OMASA ROM tables + *----------------------------------------------------------------------------------*/ + +const Word32 sep_object_brate[][MAX_NUM_OBJECTS] = +{ + {0, 0, 0, 0}, /* 13k2 */ + {0, 0, 0, 0}, /* 16k4 */ + {9600, 0, 0, 0}, /* 24k4 */ + {IVAS_13k2, 0, 0, 0}, /* 32k */ + {16000, 11000, 0, 0}, /* 48k */ + {16000, 11700, 0, 0}, /* 64k */ + {20000, 16000, 0, 0}, /* 80k */ + {IVAS_32k, 20000, 20000, 0}, /* 96k */ + {IVAS_32k, IVAS_24k4, 24000, 24000}, /* 128k */ + {IVAS_48k, IVAS_32k, IVAS_24k4, 24000}, /* 160k */ + {IVAS_64k, IVAS_48k, IVAS_32k, IVAS_24k4}, /* 192k */ + {IVAS_96k, IVAS_64k, IVAS_48k, IVAS_32k}, /* 256k */ + {IVAS_128k, IVAS_80k, IVAS_64k, IVAS_48k}, /* 384k */ + {IVAS_128k, IVAS_96k, IVAS_80k, IVAS_64k} /* 512k */ +}; + + +/*----------------------------------------------------------------------------------* + * Param ISM ROM tables + *----------------------------------------------------------------------------------*/ + +const Word16 Param_ISM_band_grouping[MAX_PARAM_ISM_NBANDS + 1] = +{ + 0, 1, 2, 3, 4, 6, 8, 11, 15, 21, 31, 60 +}; + + +/*----------------------------------------------------------------------------------* + * LFE coding ROM tables + *----------------------------------------------------------------------------------*/ + +const ivas_lfe_freq_models ivas_str_lfe_freq_models = +{ + { 16384, 14924, 13463, 12003, 10542, 9082, 7622, 6161, + 4701, 4336, 3970, 3605, 3240, 2875, 2510, 2145, + 1780, 1689, 1597, 1506, 1415, 1323, 1232, 1141, + 1050, 1004, 958, 913, 867, 821, 776, 730, + 685, 639, 593, 548, 502, 456, 411, 365, + 319, 297, 274, 251, 228, 205, 183, 160, + 137, 126, 114, 103, 91, 80, 68, 57, + 46, 40, 34, 29, 23, 17, 11, 6, 0 }, + + { 16384, 13463, 10542, 7622, 4701, 3970, 3240, 2510, + 1780, 1597, 1415, 1232, 1050, 958, 867, 776, + 685, 593, 502, 411, 319, 274, 228, 183, + 137, 114, 91, 68, 46, 34, 23, 11, 0 }, + + { 16384, 4701, 1780, 1050, 685, 319, 137, 46, + 0, }, + + { 16384, 3277, 0 }, + + { 16384, 13463, 10542, 7622, 4701, 3970, 3240, 2510, + 1780, 1597, 1415, 1232, 1050, 958, 867, 776, + 685, 593, 502, 411, 319, 274, 228, 183, + 137, 114, 91, 68, 46, 34, 23, 11, + 0 }, + + { 16384, 10542, 4701, 3240, 1780, 1415, 1050, 867, + 685, 502, 319, 228, 137, 91, 46, 23, + 0 }, + + { 16384, 4468, 1489, 745, 0 }, 0, +}; + +const Word16 ivas_lfe_num_ele_in_coder_models[2][4] = +{ + { 63, 31, 7, 1 },{ 31, 15, 3, 0 } +}; + +const Word16 ivas_lfe_log2_num_ele_in_coder_models_fx[2][4] = +{ + { 6, 5, 3, 1 },{ 5, 4, 2, 0 } +}; + +const Word16 ivas_lfe_num_dct_pass_bins_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP] = { 8, 6 }; + +const Word16 ivas_lfe_min_shift_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP] = { 1, 0 }; + +const Word16 ivas_lfe_lpf_delay_Q15[2] = { 57, 114 }; + +const Word32 ivas_lfe_lpf_delay_ns[2] = { 1750000, 3500000 }; + +const Word16 dirac_gains_P_idx[16] = +{ + -1, 1, 0, 1, 4, 3, 2, 3, 4, 8, 7, 6, 5, 6, 7, 8 +}; + + +/*----------------------------------------------------------------------------------* + * FB ROM tables + *----------------------------------------------------------------------------------*/ + +const Word32 ivas_fb_fcs_12band_1ms_fx[IVAS_FB_BANDS_12] = +{ + 17895696, 53687092, 89478488, 125269880, + 161061280, 196852672, 232644064, 304226848, + 465288128, 715827904, 1091637520, 1735882615 +};/*Q31*/ + +const Word16 ivas_fb_abs_bins_per_band_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12] = +{ + { 24, 30, 30, 30, 30, 30, 42, 76, 124, 182, 291, 367 }, + { 24, 30, 30, 30, 30, 30, 42, 76, 124, 182, 260, 47 }, + { 24, 30, 30, 30, 30, 30, 42, 75, 122, 73, 0, 0 } +}; + +const Word16 ivas_fb_abs_bins_start_offset_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12] = +{ + {0, 9, 25, 41, 57, 73, 88, 110, 158, 246, 380, 593 }, + {0, 9, 25, 41, 57, 73, 88, 110, 158, 246, 380, 593 }, + {0, 9, 25, 41, 57, 73, 88, 110, 159, 247, 0, 0 } +}; + +const Word16 ivas_fb_bins_per_band_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12] = +{ + { + IVAS_FB_12_1MS_48K_END_BINS_BAND_0 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_0, + IVAS_FB_12_1MS_48K_END_BINS_BAND_1 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_1, + IVAS_FB_12_1MS_48K_END_BINS_BAND_2 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_2, + IVAS_FB_12_1MS_48K_END_BINS_BAND_3 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_3, + IVAS_FB_12_1MS_48K_END_BINS_BAND_4 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_4, + IVAS_FB_12_1MS_48K_END_BINS_BAND_5 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_5, + IVAS_FB_12_1MS_48K_END_BINS_BAND_6 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_6, + IVAS_FB_12_1MS_48K_END_BINS_BAND_7 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_7, + IVAS_FB_12_1MS_48K_END_BINS_BAND_8 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_8, + IVAS_FB_12_1MS_48K_END_BINS_BAND_9 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_9, + IVAS_FB_12_1MS_48K_END_BINS_BAND_10 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_10, + IVAS_FB_12_1MS_48K_END_BINS_BAND_11 - IVAS_FB_12_1MS_48K_START_OFFSET_BAND_11 + }, + { + IVAS_FB_12_1MS_32K_END_BINS_BAND_0 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_0, + IVAS_FB_12_1MS_32K_END_BINS_BAND_1 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_1, + IVAS_FB_12_1MS_32K_END_BINS_BAND_2 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_2, + IVAS_FB_12_1MS_32K_END_BINS_BAND_3 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_3, + IVAS_FB_12_1MS_32K_END_BINS_BAND_4 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_4, + IVAS_FB_12_1MS_32K_END_BINS_BAND_5 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_5, + IVAS_FB_12_1MS_32K_END_BINS_BAND_6 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_6, + IVAS_FB_12_1MS_32K_END_BINS_BAND_7 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_7, + IVAS_FB_12_1MS_32K_END_BINS_BAND_8 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_8, + IVAS_FB_12_1MS_32K_END_BINS_BAND_9 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_9, + IVAS_FB_12_1MS_32K_END_BINS_BAND_10 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_10, + IVAS_FB_12_1MS_32K_END_BINS_BAND_11 - IVAS_FB_12_1MS_32K_START_OFFSET_BAND_11 + }, + { + IVAS_FB_12_1MS_16K_END_BINS_BAND_0 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_0, + IVAS_FB_12_1MS_16K_END_BINS_BAND_1 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_1, + IVAS_FB_12_1MS_16K_END_BINS_BAND_2 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_2, + IVAS_FB_12_1MS_16K_END_BINS_BAND_3 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_3, + IVAS_FB_12_1MS_16K_END_BINS_BAND_4 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_4, + IVAS_FB_12_1MS_16K_END_BINS_BAND_5 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_5, + IVAS_FB_12_1MS_16K_END_BINS_BAND_6 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_6, + IVAS_FB_12_1MS_16K_END_BINS_BAND_7 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_7, + IVAS_FB_12_1MS_16K_END_BINS_BAND_8 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_8, + IVAS_FB_12_1MS_16K_END_BINS_BAND_9 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_9, + IVAS_FB_12_1MS_16K_END_BINS_BAND_10 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_10, + IVAS_FB_12_1MS_16K_END_BINS_BAND_11 - IVAS_FB_12_1MS_16K_START_OFFSET_BAND_11 + }, +}; + +const Word16 ivas_fb_bins_start_offset_12band_1ms[IVAS_NUM_SUPPORTED_FS][IVAS_FB_BANDS_12] = +{ + { + IVAS_FB_12_1MS_48K_START_OFFSET_BAND_0, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_1, + IVAS_FB_12_1MS_48K_START_OFFSET_BAND_2, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_3, + IVAS_FB_12_1MS_48K_START_OFFSET_BAND_4, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_5, + IVAS_FB_12_1MS_48K_START_OFFSET_BAND_6, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_7, + IVAS_FB_12_1MS_48K_START_OFFSET_BAND_8, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_9, + IVAS_FB_12_1MS_48K_START_OFFSET_BAND_10, IVAS_FB_12_1MS_48K_START_OFFSET_BAND_11 + }, + { + IVAS_FB_12_1MS_32K_START_OFFSET_BAND_0, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_1, + IVAS_FB_12_1MS_32K_START_OFFSET_BAND_2, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_3, + IVAS_FB_12_1MS_32K_START_OFFSET_BAND_4, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_5, + IVAS_FB_12_1MS_32K_START_OFFSET_BAND_6, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_7, + IVAS_FB_12_1MS_32K_START_OFFSET_BAND_8, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_9, + IVAS_FB_12_1MS_32K_START_OFFSET_BAND_10, IVAS_FB_12_1MS_32K_START_OFFSET_BAND_11 + }, + { + IVAS_FB_12_1MS_16K_START_OFFSET_BAND_0, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_1, + IVAS_FB_12_1MS_16K_START_OFFSET_BAND_2, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_3, + IVAS_FB_12_1MS_16K_START_OFFSET_BAND_4, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_5, + IVAS_FB_12_1MS_16K_START_OFFSET_BAND_6, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_7, + IVAS_FB_12_1MS_16K_START_OFFSET_BAND_8, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_9, + IVAS_FB_12_1MS_16K_START_OFFSET_BAND_10, IVAS_FB_12_1MS_16K_START_OFFSET_BAND_11 + }, +}; + +const Word16 ivas_num_active_bands[FB - WB + 1] = +{ + IVAS_16K_12BANDS_ACTIVE_BANDS, IVAS_FB_BANDS_12, IVAS_FB_BANDS_12 +}; + + +/*------------------------------------------------------------------------------------------* + * SNS MSVQ codebooks and means + *------------------------------------------------------------------------------------------*/ + +const Word16 ivas_sns_cdbks_tcx20_levels[SNS_MSVQ_NSTAGES_TCX20] = { 128, 64, 32, 32 }; +const Word16 ivas_sns_cdbks_tcx20_bits[SNS_MSVQ_NSTAGES_TCX20] = { 7, 6, 5, 5 }; +const Word16 ivas_sns_cdbks_tcx10_levels[SNS_MSVQ_NSTAGES_TCX10] = { 128, 32, 8 }; +const Word16 ivas_sns_cdbks_tcx10_bits[SNS_MSVQ_NSTAGES_TCX10] = { 7, 5, 3 }; + +const Word16 ivas_sns_cdbks_side_tcx20_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 32 }; +const Word16 ivas_sns_cdbks_side_tcx20_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 5 }; +const Word16 ivas_sns_cdbks_side_tcx10_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 8 }; +const Word16 ivas_sns_cdbks_side_tcx10_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 3 }; + +const Word16 sns_1st_cdbk[2][2][8 * 32] = +{ + { /* split 1 */ + { /* TCX 20 */ + -10900, -11064, -10637, -10471, -9051, -6381, -4688, -2438, + -2119, -5087, -6702, -8118, -7586, -6343, -4828, -3406, + 2004, -3443, -4289, -3757, -3234, -2952, -2313, -1781, + 1749, 5598, 3916, 732, -1472, -2964, -3275, -2332, + -11978, -14369, -5600, -545, 981, -929, -57, 1903, + 1745, 391, 202, 115, 256, -291, -862, -1637, + -4052, 2059, 4709, 6768, 5595, 1975, -1723, -1218, + 2093, 7263, 8679, 7576, 3701, -2438, -4389, -2686, + -7120, -6279, -5715, -5520, -4752, -3125, -1856, -438, + 8131, -2543, -6285, -6723, -5588, -4321, -3264, -2164, + -653, -1301, -660, 608, 1598, 1805, 1698, 760, + 4882, 9309, 6333, 1734, 284, 364, 560, 1015, + -7686, -5737, -3443, -1642, 245, 1531, 1827, 1769, + -1468, 3782, 144, -5130, -6883, -5165, -1497, 2072, + -12937, -8429, -2619, 2894, 5004, 4710, 4627, 3740, + 3198, 3928, 4358, 4554, 3887, 2844, 1299, 129, + -13828, -12296, -9364, -7918, -5571, -1909, 307, 2047, + -4314, -1211, -559, -1061, -1928, -2228, -2359, -1902, + -309, -3224, -3404, -1895, -743, -59, 757, 908, + 10914, 5865, 1599, -386, -1392, -2285, -2236, -2042, + -11825, -16241, -11402, -3627, 6556, 8953, 6421, 1546, + 6102, 777, -301, 536, 902, 541, 210, -429, + -3052, 3997, 5389, 1842, -344, 1556, 2667, 2428, + 11788, 10894, 7448, 5423, 2372, -677, -2385, -3839, + -45, -7602, -8923, -7179, -3273, 65, 4500, 6726, + 5895, 626, -1610, -2598, -3240, -3540, -2930, -2156, + -971, 461, 1494, 4907, 5859, 5199, 3678, 2502, + 10766, 5297, 1844, 1236, 2498, 3503, 2846, 838, + -7816, -1212, 891, 2387, 1317, 2225, 1859, 1602, + 2376, 5357, 2088, -2719, -3419, -420, 2431, 2943, + -8383, -795, 4351, 7026, 7460, 7191, 5262, 3796, + 1522, 6283, 8714, 8222, 7434, 5768, 3586, 1499, + }, + { /* TCX 10 */ + -15596, -16321, -10264, -1002, 5955, 5543, -29, -1688, + 17, -3794, -6207, -7356, -6998, -6081, -4453, -2448, + -12543, -11530, -10186, -8817, -7083, -4440, -1946, 892, + 5198, 2751, -274, -2574, -4561, -6087, -5944, -4600, + -683, -2640, -2753, -1195, -239, -217, -286, 90, + -1400, -1146, -1853, -2845, -3456, -3788, -3171, -1969, + -1835, 392, 1725, 1209, -392, -1640, -2001, -1608, + 5770, 7707, 5210, 2112, -382, -2088, -2634, -3007, + -10766, -8101, -5137, -3754, -1881, 331, 2339, 3679, + -2637, -4640, -5811, -5651, -3790, -1359, 913, 1893, + -7793, -4768, -1762, -545, -717, -837, -441, -75, + 4030, 1770, 467, 379, 10, -1330, -2398, -2290, + -9395, -6952, -2494, 2022, 4753, 5614, 4443, 2642, + -1486, 1748, 859, -2586, -3368, -638, 2761, 3269, + -2408, 306, 3633, 6567, 5950, 2474, -621, -1421, + 5478, 7986, 9498, 8165, 5477, 1244, -523, -1586, + -13564, -14673, -10597, -5504, 1575, 8248, 7662, 4025, + 4978, -682, -3586, -4305, -3703, -3001, -2227, -1278, + -8002, -6831, -5558, -4868, -4243, -3393, -2486, -1110, + 11485, 5472, 1645, -533, -1792, -2814, -3169, -2706, + 1617, 421, 232, 1382, 2162, 2017, 1318, 744, + 3677, 5212, 1990, -1514, -2894, -2441, -451, 592, + 731, 4295, 5860, 3756, 1991, 1437, 869, 127, + 12736, 11722, 7768, 4682, 1574, -744, -1989, -3131, + -3490, -4269, -3681, -1531, 1111, 3327, 4138, 3815, + 7344, 1400, -1302, -1502, -1015, 57, 1212, 1498, + -4836, -1881, 1071, 2055, 2114, 2465, 2093, 1458, + 8569, 5879, 3654, 2879, 2530, 1703, 781, -233, + -3709, -990, 2338, 6227, 7083, 7102, 5657, 3401, + 3389, 6392, 5267, 1011, 275, 3519, 5236, 4339, + 599, 3752, 6943, 9211, 8152, 5568, 3337, 1838, + 9885, 9591, 7905, 8068, 7929, 7421, 4234, 757, + } + }, + { /* split 2 */ + { /* TCX 20 */ + -178, -3476, -5982, -7081, -7548, -7440, -6859, -5798, + -3596, -3670, -1501, 770, 812, -286, -2001, -3377, + -3998, -5191, -4988, -4421, -3889, -3571, -2738, -1969, + -2981, -2687, -1501, -83, 1136, 2377, 3248, 4105, + 1842, -41, -1972, -4282, -6779, -8405, -8674, -7835, + -259, 571, 2124, 3344, 2959, 1407, -750, -2523, + -524, -1956, -2855, -3202, -3939, -4666, -4907, -4782, + -5110, -4768, -3017, -663, 4188, 9210, 16602, 21081, + 4373, 4846, -603, -6495, -7289, -5540, -4749, -5527, + -1448, -1043, -619, -105, 356, 362, 542, 857, + 1373, -752, -5334, -6244, -3001, -932, -1040, -3125, + -2403, -1397, 612, 2449, 3920, 5231, 6819, 8581, + 2183, 1211, -111, -1084, -2836, -4977, -6701, -7284, + -751, 1255, 3408, 6474, 7503, 7026, 5413, 4464, + 935, 850, 589, 353, 160, -434, -939, -931, + 268, 2284, 3884, 5423, 6680, 7996, 9244, 9472, + 1075, 113, -1289, -4457, -7512, -5930, -1799, -571, + -3689, -4254, -3755, -2995, -1581, -135, 1049, 1589, + -1166, -1752, -1790, -1897, -1927, -1831, -1359, -805, + -1494, -735, 635, 1993, 2909, 3546, 4226, 4956, + 4435, 4299, 4269, 1328, -3731, -7621, -9319, -9170, + 1358, 2227, 3873, 4469, 4692, 4057, 2601, 1608, + 813, 398, -499, -666, -1286, -2271, -3316, -4025, + -3300, -1255, 2181, 6431, 10002, 12760, 13549, 12584, + 3714, 4180, 484, -2905, -2864, -1359, -1256, -2477, + 308, 868, 1373, 1629, 1793, 1834, 1814, 1746, + 1472, 798, -282, -1935, -1818, 320, 2221, 2914, + 2281, 3240, 2988, 1400, 2383, 4072, 5667, 6675, + 2672, 2678, 2874, 2096, -226, -2301, -3861, -4534, + 4988, 7231, 7641, 7731, 7061, 6447, 5411, 3513, + 3978, 4156, 4126, 2896, 1469, 759, 368, -68, + -264, 4210, 8534, 11008, 11606, 11888, 11072, 8949, + }, + { /* TCX 10 */ + -2852, -6158, -7231, -7830, -8012, -7922, -7556, -6706, + -3911, -5340, -5053, -4741, -4805, -4484, -3727, -3037, + -966, -1461, -1694, -2427, -3081, -3037, -2547, -2230, + -3455, -3315, -2451, -836, 1383, 3196, 3720, 3379, + 3052, 281, -3351, -6866, -9051, -9586, -8983, -8236, + -748, -4465, -4314, -2251, 29, -40, -3963, -6195, + 200, 1293, 2535, 2803, 1603, -186, -1397, -1697, + -1707, -265, 2196, 5295, 5894, 4216, 3440, 3826, + -237, -2133, -2279, -3149, -4377, -5638, -6520, -6764, + -2407, -2049, -1246, -664, -521, -430, -349, -211, + 3874, 1335, -1501, -2055, -1268, -990, -1852, -2871, + -1883, -1845, -1681, -484, 384, 2035, 5839, 9597, + 275, 380, 1048, 424, -1146, -3012, -4431, -5104, + -1699, -484, 756, 1261, 1279, 1377, 1975, 2590, + 2139, 4502, 3645, 4975, 6491, 5972, 5012, 4346, + -3821, -2581, -433, 2667, 6436, 10038, 11311, 8783, + 2359, -2689, -6604, -7039, -5992, -4268, -3711, -4840, + -2776, -4251, -4539, -3672, -2494, -1055, 280, 695, + 491, 866, 822, -44, -1009, -1165, -831, -538, + -1024, 91, 786, 1295, 2433, 3910, 4975, 5403, + 3117, 2590, 2337, -667, -4580, -8147, -9400, -9523, + -103, -630, -831, 669, 3062, 3398, 549, -1690, + 2113, 3467, 4279, 5047, 5344, 3361, 127, -2313, + -1199, 1153, 2914, 3688, 4260, 5421, 7471, 8831, + 2815, 2184, 316, -3058, -5596, -5564, -4343, -3793, + 922, 126, -1414, -1731, -1007, 359, 2029, 3088, + 4889, 4619, 2537, 1114, 950, 946, 799, 419, + -4271, -3750, -3359, -484, 1448, 4106, 10487, 20479, + 3818, 4687, 4064, 2212, -172, -2287, -3535, -4041, + 884, 2456, 3394, 2925, 2182, 2323, 2583, 2507, + 4767, 8057, 8263, 6461, 5003, 4055, 2923, 1845, + 19, 3813, 6926, 8432, 10141, 10850, 9692, 8383, + } + } +}; + +const Word16 sns_1st_means_16k[2][16] = +{ + { /* TCX 20 */ + 14210, 19017, 14362, 9309, 5385, 2674, 1055, -211, -1407, -3059, -4393, -8597, -11180, -11756, -12131, -13281, + }, + { /* TCX 10*/ + 12018, 15915, 11089, 6015, 847, -705, -539, -1548, -893, -2163, -1806, -4189, -7017, -8670, -8874, -9480, + } +}; + +const Word16 sns_1st_means_25k6[2][16] = +{ + { /* TCX 20 */ + 14973, 20323, 16461, 9554, 4017, 3103, 1602, 1694, -221, -1401, -6817, -10071, -11503, -11805, -13158, -16749, + }, + { /* TCX 10 */ + 15560, 19489, 14623, 5595, 2084, 1699, 775, -1312, -2195, -6101, -9078, -9465, -7825, -6603, -7281, -9960, + } +}; + +const Word16 sns_1st_means_32k[2][16] = +{ + { /* TCX 20 */ + 15041, 20603, 16969, 10289, 4973, 4283, 3003, 3316, 1684, -259, -6614, -9535, -10363, -11834, -16625, -24930, + }, + { /* TCX 10 */ + 16510, 20660, 16025, 7224, 3921, 3868, 2623, 742, -1316, -6269, -8284, -7288, -6380, -8410, -13351, -20277, + } +}; + + +/*----------------------------------------------------------------------* + * MC ParamUpmix ROM tables + *-----------------------------------------------------------------------*/ + +const Word16 ivas_param_upmx_mx_qmap[33] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0 +}; + + +/*----------------------------------------------------------------------* + * MDCT/IMDCT tables + *-----------------------------------------------------------------------*/ + #define SHC( x ) ( (Word16) x ) -/* clang-format off */ const Word16 ivas_sin_twiddle_480_fx[ IVAS_480_PT_LEN >> 1 ] = { SHC( 0xffe6 ), SHC( 0xff0f ), SHC( 0xfe39 ), SHC( 0xfd62 ), SHC( 0xfc8c ), SHC( 0xfbb6 ), SHC( 0xfadf ), SHC( 0xfa09 ), SHC( 0xf933 ), SHC( 0xf85d ), SHC( 0xf787 ), SHC( 0xf6b1 ), SHC( 0xf5db ), SHC( 0xf505 ), SHC( 0xf42f ), SHC( 0xf35a ), @@ -202,30 +3067,30 @@ const Word16 nf_tw_smoothing_coeffs_fx[N_LTP_GAIN_MEMS] = const Word16 dft_trigo_12k8_fx[STEREO_DFT_N_12k8_ENC / 4 + 1] = { - 0, 402, 804, 1206, 1607, 2009, 2410, 2811, 3211, 3611, 4011, 4409, 4808, 5205, 5602, 5997, 6392, 6786, 7179, 7571, 7961, 8351, 8739, 9126, 9512, 9896, 10278, 10659, - 11039, 11416, 11793, 12167, 12539, 12910, 13278, 13645, 14010, 14372, 14732, 15090, 15446, 15800, 16151, 16499, 16846, 17189, 17530, 17869, 18204, 18537, 18868, - 19195, 19519, 19841, 20159, 20475, 20787, 21097, 21403, 21706, 22005, 22301, 22594, 22884, 23170, 23453, 23732, 24007, 24279, 24547, 24812, 25073, 25330, 25583, - 25832, 26077, 26319, 26557, 26790, 27020, 27245, 27466, 27684, 27897, 28106, 28310, 28511, 28707, 28898, 29086, 29269, 29447, 29621, 29791, 29956, 30117, 30273, - 30425, 30572, 30714, 30852, 30985, 31114, 31237, 31357, 31471, 31581, 31685, 31785, 31881, 31971, 32057, 32138, 32214, 32285, 32351, 32413, 32469, 32521, 32568, - 32610, 32647, 32679, 32706, 32728, 32745, 32758, 32765, 32767 + 0, 402, 804, 1206, 1607, 2009, 2410, 2811, 3211, 3611, 4011, 4409, 4808, 5205, 5602, 5997, 6392, 6786, 7179, 7571, 7961, 8351, 8739, 9126, 9512, 9896, 10278, 10659, + 11039, 11416, 11793, 12167, 12539, 12910, 13278, 13645, 14010, 14372, 14732, 15090, 15446, 15800, 16151, 16499, 16846, 17189, 17530, 17869, 18204, 18537, 18868, + 19195, 19519, 19841, 20159, 20475, 20787, 21097, 21403, 21706, 22005, 22301, 22594, 22884, 23170, 23453, 23732, 24007, 24279, 24547, 24812, 25073, 25330, 25583, + 25832, 26077, 26319, 26557, 26790, 27020, 27245, 27466, 27684, 27897, 28106, 28310, 28511, 28707, 28898, 29086, 29269, 29447, 29621, 29791, 29956, 30117, 30273, + 30425, 30572, 30714, 30852, 30985, 31114, 31237, 31357, 31471, 31581, 31685, 31785, 31881, 31971, 32057, 32138, 32214, 32285, 32351, 32413, 32469, 32521, 32568, + 32610, 32647, 32679, 32706, 32728, 32745, 32758, 32765, 32767 }; const Word16 dft_trigo_32k_fx[STEREO_DFT_N_32k_ENC / 4 + 1] = { - 0, 160, 321, 482, 643, 804, 964, 1125, 1286, 1447, 1607, 1768, 1929, 2089, 2250, 2410, 2570, 2731, 2891, 3051, 3211, 3371, 3531, 3691, 3851, 4011, 4170, 4330, 4489, - 4648, 4808, 4967, 5126, 5284, 5443, 5602, 5760, 5918, 6076, 6234, 6392, 6550, 6707, 6865, 7022, 7179, 7336, 7493, 7649, 7805, 7961, 8117, 8273, 8429, 8584, 8739, - 8894, 9049, 9203, 9358, 9512, 9665, 9819, 9972, 10125, 10278, 10431, 10583, 10735, 10887, 11039, 11190, 11341, 11492, 11642, 11793, 11942, 12092, 12241, 12391, - 12539, 12688, 12836, 12984, 13131, 13278, 13425, 13572, 13718, 13864, 14010, 14155, 14300, 14444, 14589, 14732, 14876, 15019, 15162, 15304, 15446, 15588, 15729, - 15870, 16011, 16151, 16291, 16430, 16569, 16707, 16846, 16983, 17121, 17258, 17394, 17530, 17666, 17801, 17936, 18070, 18204, 18338, 18471, 18604, 18736, 18868, - 18999, 19130, 19260, 19390, 19519, 19648, 19777, 19905, 20032, 20159, 20286, 20412, 20538, 20663, 20787, 20911, 21035, 21158, 21281, 21403, 21524, 21645, 21766, - 21886, 22005, 22124, 22242, 22360, 22478, 22594, 22711, 22826, 22941, 23056, 23170, 23283, 23396, 23509, 23620, 23732, 23842, 23952, 24062, 24171, 24279, 24387, - 24494, 24600, 24706, 24812, 24916, 25021, 25124, 25227, 25330, 25431, 25532, 25633, 25733, 25832, 25931, 26029, 26126, 26223, 26319, 26415, 26509, 26604, 26697, - 26790, 26882, 26974, 27065, 27155, 27245, 27334, 27423, 27510, 27597, 27684, 27769, 27854, 27939, 28023, 28106, 28188, 28270, 28351, 28431, 28511, 28589, 28668, - 28745, 28822, 28898, 28974, 29049, 29123, 29196, 29269, 29341, 29412, 29482, 29552, 29621, 29690, 29758, 29825, 29891, 29956, 30021, 30085, 30149, 30211, 30273, - 30334, 30395, 30455, 30514, 30572, 30629, 30686, 30742, 30797, 30852, 30906, 30959, 31011, 31063, 31114, 31164, 31213, 31262, 31309, 31357, 31403, 31448, 31493, - 31537, 31581, 31623, 31665, 31706, 31746, 31785, 31824, 31862, 31899, 31936, 31971, 32006, 32040, 32074, 32106, 32138, 32169, 32199, 32229, 32257, 32285, 32312, - 32339, 32364, 32389, 32413, 32436, 32458, 32480, 32501, 32521, 32540, 32559, 32577, 32594, 32610, 32625, 32640, 32653, 32666, 32679, 32690, 32701, 32711, 32720, - 32728, 32736, 32742, 32748, 32753, 32758, 32761, 32764, 32766, 32767, 32767 + 0, 160, 321, 482, 643, 804, 964, 1125, 1286, 1447, 1607, 1768, 1929, 2089, 2250, 2410, 2570, 2731, 2891, 3051, 3211, 3371, 3531, 3691, 3851, 4011, 4170, 4330, 4489, + 4648, 4808, 4967, 5126, 5284, 5443, 5602, 5760, 5918, 6076, 6234, 6392, 6550, 6707, 6865, 7022, 7179, 7336, 7493, 7649, 7805, 7961, 8117, 8273, 8429, 8584, 8739, + 8894, 9049, 9203, 9358, 9512, 9665, 9819, 9972, 10125, 10278, 10431, 10583, 10735, 10887, 11039, 11190, 11341, 11492, 11642, 11793, 11942, 12092, 12241, 12391, + 12539, 12688, 12836, 12984, 13131, 13278, 13425, 13572, 13718, 13864, 14010, 14155, 14300, 14444, 14589, 14732, 14876, 15019, 15162, 15304, 15446, 15588, 15729, + 15870, 16011, 16151, 16291, 16430, 16569, 16707, 16846, 16983, 17121, 17258, 17394, 17530, 17666, 17801, 17936, 18070, 18204, 18338, 18471, 18604, 18736, 18868, + 18999, 19130, 19260, 19390, 19519, 19648, 19777, 19905, 20032, 20159, 20286, 20412, 20538, 20663, 20787, 20911, 21035, 21158, 21281, 21403, 21524, 21645, 21766, + 21886, 22005, 22124, 22242, 22360, 22478, 22594, 22711, 22826, 22941, 23056, 23170, 23283, 23396, 23509, 23620, 23732, 23842, 23952, 24062, 24171, 24279, 24387, + 24494, 24600, 24706, 24812, 24916, 25021, 25124, 25227, 25330, 25431, 25532, 25633, 25733, 25832, 25931, 26029, 26126, 26223, 26319, 26415, 26509, 26604, 26697, + 26790, 26882, 26974, 27065, 27155, 27245, 27334, 27423, 27510, 27597, 27684, 27769, 27854, 27939, 28023, 28106, 28188, 28270, 28351, 28431, 28511, 28589, 28668, + 28745, 28822, 28898, 28974, 29049, 29123, 29196, 29269, 29341, 29412, 29482, 29552, 29621, 29690, 29758, 29825, 29891, 29956, 30021, 30085, 30149, 30211, 30273, + 30334, 30395, 30455, 30514, 30572, 30629, 30686, 30742, 30797, 30852, 30906, 30959, 31011, 31063, 31114, 31164, 31213, 31262, 31309, 31357, 31403, 31448, 31493, + 31537, 31581, 31623, 31665, 31706, 31746, 31785, 31824, 31862, 31899, 31936, 31971, 32006, 32040, 32074, 32106, 32138, 32169, 32199, 32229, 32257, 32285, 32312, + 32339, 32364, 32389, 32413, 32436, 32458, 32480, 32501, 32521, 32540, 32559, 32577, 32594, 32610, 32625, 32640, 32653, 32666, 32679, 32690, 32701, 32711, 32720, + 32728, 32736, 32742, 32748, 32753, 32758, 32761, 32764, 32766, 32767, 32767 }; const Word16 dft_trigo_48k_fx[STEREO_DFT_N_MAX_ENC / 4 + 1] = @@ -327,7 +3192,6 @@ const Word32 dft_res_gains_q_fx[][2] = { { (Word32)( 0x00000000 ), (Word32)( 0x635c2900 ) }, { (Word32)( 0x00000000 ), (Word32)( 0x7fffffff ) }, - /* column 2 (|ILD| = 2): */ { (Word32)( 0x0eabf770 ), (Word32)( 0x00000000 ) }, { (Word32)( 0x0edeb100 ), (Word32)( 0x0ec636b0 ) }, @@ -378,7 +3242,6 @@ const Word32 dft_res_gains_q_fx[][2] = { { (Word32)( 0x5ba86100 ), (Word32)( 0x3e65f940 ) }, { (Word32)( 0x68ba3000 ), (Word32)( 0x49984a00 ) }, - /* column 7 (|ILD| = 13): */ { (Word32)( 0x512c1700 ), (Word32)( 0x00000000 ) }, { (Word32)( 0x51d52c00 ), (Word32)( 0x08e72540 ) }, @@ -399,7 +3262,6 @@ const Word32 dft_res_gains_q_fx[][2] = { { (Word32)( 0x710eb280 ), (Word32)( 0x239c9d40 ) }, { (Word32)( 0x79ba2380 ), (Word32)( 0x27944240 ) }, - /* column 9 (|ILD| = 19): */ { (Word32)( 0x662c9080 ), (Word32)( 0x00000000 ) }, { (Word32)( 0x66ad4f80 ), (Word32)( 0x0562c778 ) }, @@ -420,7 +3282,6 @@ const Word32 dft_res_gains_q_fx[][2] = { { (Word32)( 0x79a1fd00 ), (Word32)( 0x12d6a9c0 ) }, { (Word32)( 0x7e651700 ), (Word32)( 0x14351580 ) }, - /* column 11 (|ILD| = 25): */ { (Word32)( 0x725edd00 ), (Word32)( 0x00000000 ) }, { (Word32)( 0x72aec080 ), (Word32)( 0x02fc829c ) }, @@ -480,23 +3341,10 @@ const Word32 dft_res_gains_q_fx[][2] = { { (Word32)( 0x7f9f7700 ), (Word32)( 0x00b70ac4 ) }, { (Word32)( 0x7fcc0780 ), (Word32)( 0x00c8711d ) }, { (Word32)( 0x7fff5800 ), (Word32)( 0x00cf398f ) }, - -}; - -// Q13 -const Word16 McMASA_LFEGain_vectors_fx_q13[64] = { - 3112, 2703, 1556, 1638, -1310, -1802, -2867, -2785, - 4096, 4096, 4096, 4096, -6553, -3276, 8355, 819, - -4096, -4096, -4096, -4096, -4587, -983, -6389, 11141, - -8355, 9666, -4669, 2703, 5898, -9256, 7946, -5079, - -7454, 7618, 8192, -9011, 14172, -1884, -6389, -6881, - 7782, -13107, -2785, 7618, 7127, 3850, -15564, 4259, - 5488, 11632, -7946, -10158, 6799, 4751, 4997, -16711, - -6553, -12943, 6717, 11632, -17530, 2129, 6881, 8355 }; // Q25 -const Word32 McMASA_LFEGain_vectors_fx_q25[64] = { +const Word32 McMASA_LFEGain_vectors_fx[64] = { 12750684, 11072963, 6375342, 6710886, /* 1st bit */ -5368709, -7381975, -11744051, -11408507, 16777216, 16777216, 16777216, 16777216, /* 2nd bit*/ @@ -515,13 +3363,6 @@ const Word32 McMASA_LFEGain_vectors_fx_q25[64] = { -71806484, 8724152, 28185723, 34225521 }; -/* - This lookup table is calculated from, and therefore - depends on the following macros: - - MASA_NTOT2_FAC - - MASA_ASIN_OFFSET - - MASA_ANGLE_AT_EQUATOR -*/ const UWord16 cum_n_for_id_th[122] = { 0, 846, 1690, 2534, 3378, 4222, 5064, 5906, 6746, 7586, 8424, 9260, 10094, 10928, 11760, 12588, 13416, 14240, 15064, 15882, 16700, 17514, 18326, 19134, @@ -585,9 +3426,10 @@ const Word16 pow_10_q11[128] = { 13540, 13786, 14036, 14291, 14550, 14815, 15084, 15357, 15636, 15920, 16209, 16503, 16803, 17108, 17418, 17734, 18056, 18384, 18718, 19058, 19404, 19756, 20114 }; - // Q12 -const Word16 icbwe_gsMapping_tbl_fx[16] = { -8192, -5527, -3935, -2907, -2289, -1824, -1404, -1035, -692, -404, -286, -204, -81, 0, 163, 327 }; +const Word16 icbwe_gsMapping_tbl_fx[16] = { + -8192, -5527, -3935, -2907, -2289, -1824, -1404, -1035, -692, -404, -286, -204, -81, 0, 163, 327 +}; // Q12 const Word16 icbwe_gsMappingDFT_tbl_fx[128] = { @@ -602,7 +3444,6 @@ const Word32 pow_10_q23[14] = { 2364231, 2652711, 3339565, 4204263, 5803499, 8011059, 8388608, 6818517, 7222539, 5292854, 4204263, 6977341, 7919357, 8388608 }; -/* clang-format on */ // Q15 const Word16 ivas_tan_panning_gain_dirac_tbl_fx[601] = { SHC( 0x8000 ), @@ -1318,6 +4159,7 @@ const Word32 ica_sincInterp6_fx[2 * SINC_ORDER1 + 1] = { 0, -7481833, -15444702, -22462678, -25151328, -18893562, 0, 31359704, 68816112, 99516536, 106796512, 75709536, 0, -111862424, -234090752, -326303712, -341870816, -240232560, 0, 371151744, 833251584, 1319259392, 1748116096, 2042624128, 2147483647, 2042624128, 1748116096, 1319259392, 833251584, 371151744, 0, -240232560, -341870816, -326303712, -234090752, -111862424, 0, 75709536, 106796512, 99516536, 68816112, 31359704, 0, -18893562, -25151328, -22462678, -15444702, -7481833, 0 }; + /*----------------------------------------------------------------------------------* * Stereo IC-BWE ROM tables *----------------------------------------------------------------------------------*/ @@ -1342,6 +4184,7 @@ const Word16 pow_10_icbwe_gsMappingDFT_tbl_fx[128] = { 19072, 19631 }; + /*----------------------------------------------------------------------------------* * TD Stereo ROM tables *----------------------------------------------------------------------------------*/ @@ -1477,6 +4320,7 @@ const Word16 dft_cng_alpha_bits_fx[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_CO { 6554 /*0.2f*/, 29491 /*0.9f*/ } }; + /*----------------------------------------------------------------------------------* * DirAC ROM tables *----------------------------------------------------------------------------------*/ @@ -1499,6 +4343,7 @@ const Word32 diffuseness_thresholds_fx[DIRAC_DIFFUSE_LEVELS + 1] = { MAX_32 /* out-of-range large value to make searching easier */ }; + /*------------------------------------------------------------------------------------------* * SPAR ROM tables *------------------------------------------------------------------------------------------*/ @@ -1525,6 +4370,7 @@ const Word32 one_by_q_level[64] = { 35204648, 34636832, 34087044 }; + /*----------------------------------------------------------------------------------* * Parametric MC ROM tables *----------------------------------------------------------------------------------*/ @@ -1539,6 +4385,7 @@ const Word16 ivas_param_mc_quant_icc_fx[PARAM_MC_SZ_ICC_QUANTIZER] = { -32440, -19300, 0, 12046, 19690, 27563, 30703, 32767 }; + /*----------------------------------------------------------------------------------* * MASA ROM tables *----------------------------------------------------------------------------------*/ @@ -1549,13 +4396,13 @@ const Word32 no_phi_masa_inv_fx[NO_SPHERICAL_GRIDS][MAX_NO_THETA] = { { 536870912 }, { 536870912, 1073741824 }, { 268435456, 536870912 }, - { 178956970, 306783378, 1073741824, 2147483647 }, - { 153391689, 165191049, 238609294, 1073741824, 2147483647 }, - { 97612893, 102261126, 126322567, 195225786, 715827882, 2147483647 }, - { 65075262, 67108864, 74051160, 93368854, 126322567, 238609294, 2147483647 }, - { 44739242, 45691141, 47721858, 52377649, 61356675, 76695844, 107374182, 178956970, 1073741824, 2147483647 }, - { 35791394, 35791394, 37025580, 38347922, 39768215, 42949672, 46684427, 52377649, 59652323, 71582788, 93368854, 126322567, 214748364, 2147483647 }, - { 24129029, 24129029, 24403223, 24970740, 25565281, 26512143, 27889398, 29417584, 31580641, 34087042, 37675151, 42107522, 48806446, 56512727, 71582788, 93368854, 143165576, 268435456, 2147483647 } + { 178956971, 306783378, 1073741824, 2147483647 }, + { 153391689, 165191050, 238609294, 1073741824, 2147483647 }, + { 97612893, 102261126, 126322568, 195225786, 715827883, 2147483647 }, + { 65075262, 67108864, 74051160, 93368854, 126322568, 238609294, 2147483647 }, + { 44739243, 45691141, 47721859, 52377650, 61356676, 76695845, 107374182, 178956971, 1073741824, 2147483647 }, + { 35791394, 35791394, 37025580, 38347922, 39768216, 42949673, 46684427, 52377650, 59652324, 71582788, 93368854, 126322568, 214748365, 2147483647 }, + { 24129030, 24129030, 24403223, 24970740, 25565282, 26512144, 27889398, 29417584, 31580642, 34087042, 37675152, 42107523, 48806447, 56512728, 71582788, 93368854, 143165577, 268435456, 2147483647 }, }; const Word32 azimuth_cb_fx[8] = { @@ -1567,6 +4414,11 @@ const Word32 delta_theta_masa_fx[NO_SPHERICAL_GRIDS - 2] = { 188743680, 188743680, 150994944, 106954752, 83886080, 62914560, 45214596, 28101836, 20971520 }; +// Q31 +const Word32 delta_theta_masa_inv_fx[NO_SPHERICAL_GRIDS - 2] = { + 47721859, 47721859, 59652324, 84215045, 107374182, 143165577, 199209986, 320519947, 429496730 +}; + // q = 14 const Word16 coherence_cb0_masa_Q14[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH] = { 783, 4173, 9036, 16163, 22238, 27587, 32234, 0, @@ -1589,15 +4441,22 @@ const Word16 coherence_cb0_masa_Q14[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH] = // q = 21 const Word32 coherence_cb0_masa_fx[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH] = { - 100243, 534144, 1156579, 2068840, 2846464, 3531184, 4125936, 0, 253965, 864655, 1467377, - 2129448, 2977326, 3768791, 0, 0, 338480, 1189924, 2035915, 2872888, 3640026, 0, 0, 0, - 492621, 1532179, 2527278, 3470157, 0, 0, 0, 0, 499331, 1506803, 2465831, 3425697, 0, - 0, 0, 0, 503316, 1473668, 2392221, 3406404, 0, 0, 0, 0, 737778, 1970903, 3450654, 0, 0, - 0, 0, 0, 2097152, 0, 0, 0, 0, 0, 0, 0, 303038, 719742, 1122186, 1577897, 2117075, 2770337, - 3648834, 0, 419849, 932603, 1440533, 2011797, 2745172, 3571240, 0, 0, 548824, 1165177, - 1812987, 2555379, 3366138, 0, 0, 0, 695835, 1428160, 2190475, 3084910, 0, 0, 0, 0, 697093, - 1381603, 2092957, 2970406, 0, 0, 0, 0, 708417, 1396283, 2099039, 2992426, 0, 0, 0, 0, 835924, - 1728892, 2836607, 0, 0, 0, 0, 0, 2097152, 0, 0, 0, 0, 0, 0, 0 + 100244, 534145, 1156579, 2068841, 2846465, 3531185, 4125937, 0, + 253965, 864656, 1467377, 2129448, 2977327, 3768792, 0, 0, + 338480, 1189924, 2035915, 2872889, 3640027, 0, 0, 0, + 492621, 1532179, 2527278, 3470158, 0, 0, 0, 0, + 499332, 1506804, 2465831, 3425698, 0, 0, 0, 0, + 503316, 1473669, 2392221, 3406404, 0, 0, 0, 0, + 737778, 1970904, 3450654, 0, 0, 0, 0, 0, + 2097152, 0, 0, 0, 0, 0, 0, 0, + 303038, 719743, 1122186, 1577897, 2117075, 2770338, 3648835, 0, + 419850, 932604, 1440534, 2011798, 2745172, 3571240, 0, 0, + 548825, 1165178, 1812988, 2555380, 3366139, 0, 0, 0, + 695835, 1428161, 2190475, 3084911, 0, 0, 0, 0, + 697093, 1381604, 2092958, 2970406, 0, 0, 0, 0, + 708418, 1396284, 2099040, 2992426, 0, 0, 0, 0, + 835925, 1728892, 2836608, 0, 0, 0, 0, 0, + 2097152, 0, 0, 0, 0, 0, 0, 0 }; // q = 15 @@ -1611,9 +4470,11 @@ const Word16 coherence_cb1_masa_Q15[MASA_NO_CV_COH1 * MASA_MAXIMUM_CODING_SUBBAN // q = 21 const Word32 coherence_cb1_masa_fx[MASA_NO_CV_COH1 * MASA_MAXIMUM_CODING_SUBBANDS] = { - -3984, 544630, -565392, 1314704, -1320157, -11534, 541484, -583847, 1357486, -1371118, - -6081, 525546, -551551, 1362729, -1371537, -838, 533934, -540855, 1436758, -1414109, - 3565, 528692, -519883, 1513514, -1500931 + -3985, 544630, -565392, 1314705, -1320157, + -11534, 541485, -583847, 1357487, -1371118, + -6082, 525546, -551551, 1362729, -1371537, + -839, 533935, -540856, 1436759, -1414110, + 3565, 528692, -519884, 1513515, -1500932 }; /* Multi-channel input and output setups */ @@ -1635,17 +4496,19 @@ const Word16 ls_elevation_CICP16_idx[9] = { 0, 0, 0, 0, 0, 3, 3, 3, 3 }; const Word16 ls_azimuth_CICP19_idx[11] = { 1, 2, 0, 9, 10, 5, 6, 1, 2, 9, 10 }; const Word16 ls_elevation_CICP19_idx[11] = { 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3 }; -const Word32 shoebox_sin_cos_tbl_fx[11][2] = { { 0, 1073741824 }, // 0 - { 536870912, 929887680 }, - { -536870912, 929887680 }, // 30, -30 - { 615873024, 879557824 }, - { -615873024, 879557824 }, // 35, -35 - { 1073741824, 0 }, - { -1073741824, 0 }, // 90, -90 - { 1008987264, -367241312 }, - { -1008987264, -367241312 }, // 110,-110 - { 759250112, -759250112 }, - { -759250112, -759250112 } }; // 135, -135 //Q.30 +const Word32 shoebox_sin_cos_tbl_fx[11][2] = { + { 0, 1073741824 }, // 0 + { 536870912, 929887680 }, + { -536870912, 929887680 }, // 30, -30 + { 615873024, 879557824 }, + { -615873024, 879557824 }, // 35, -35 + { 1073741824, 0 }, + { -1073741824, 0 }, // 90, -90 + { 1008987264, -367241312 }, + { -1008987264, -367241312 }, // 110,-110 + { 759250112, -759250112 }, + { -759250112, -759250112 } // 135, -135 //Q.30 +}; // Q22 const Word32 delta_phi_val[90] = { @@ -1716,6 +4579,7 @@ const Word32 dd_val[90] = { const Word32 cb_azi_chan_fx[] = { 0, 125829120, 461373440, 566231040 }; // Q22 const Word16 cb_azi_chan_16fx[] = { 0, 1920, 7040, 8640 }; // Q6 + /*----------------------------------------------------------------------------------* * MASA and ISM (OMASA) combined format ROM tables *----------------------------------------------------------------------------------*/ @@ -1761,6 +4625,7 @@ const Word32 dct12_fx[12 * 12] = { // Q31 -810030848, 759350208, -695569984, 619978560, -533649696, 438301408, -335436960, 226989024, -114460880 }; + /*----------------------------------------------------------------------------------* * ISM ROM tables *----------------------------------------------------------------------------------*/ @@ -1775,6 +4640,7 @@ const Word32 ism_elevation_borders_fx[4] = { ISM_ELEVATION_MIN_FX, ISM_ELEVATION_LOW_BORDER_FX, ISM_ELEVATION_HIGH_BORDER_FX, ISM_ELEVATION_MAX_FX }; + /*----------------------------------------------------------------------------------* * LFE coding ROM tables *----------------------------------------------------------------------------------*/ @@ -1795,33 +4661,22 @@ const Word32 ivas_lpf_4_butter_32k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = { 0x82fd4b80, 0x3d0d2280, 0x40000000, 0x7fffffff, 0x40000000, 0x40000000, 0x81478600, 0x3ec30c00 }; + const Word16 ivas_lpf_4_butter_32k_sos_e[IVAS_BIQUAD_FILT_LEN << 2] = { -24, -23, -24, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; const Word32 ivas_lpf_4_butter_48k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = { - // 6, 11, 6, 1073741824, /* Q30 */ + // 6, 11, 6, 1073741824, /* Q30 */ 1477520448, 1477520448, 1477520448, 1073741824, -2113939767, 1040504054, 1073741824, 2147483480, 1073741829, 1073741824, -2133281237, 1059848324 }; + const Word16 ivas_lpf_4_butter_48k_sos_e[IVAS_BIQUAD_FILT_LEN << 2] = { -27, -26, -27, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -const Word32 ivas_lpf_2_butter_16k_fx[IVAS_BIQUAD_FILT_LEN << 1] = { /* Q30 */ - 0xa4d0c, 0x149a17, 0xa4d0c, 0x40000000, 0x849e6300, 0x3b8ad140 -}; - -const Word32 ivas_lpf_2_butter_32k_fx[IVAS_BIQUAD_FILT_LEN << 1] = { /* Q30 */ - // 0x53e1a, 0x29f0d, 0x40000000, 0x824f6000, 0x3dbb1c80, 0x29f0d - 0x29F0D, 0x53E1A, 0x29F0D, 0x40000000, 0x824F5FC3, 0x3DBB1C71 -}; - -const Word32 ivas_lpf_2_butter_48k_fx[IVAS_BIQUAD_FILT_LEN << 1] = { /* Q30 */ - 0x12c07, 0x2580d, 0x12c07, 0x40000000, 0x818a4580, 0x3e7a6a80 -}; - const Word32 ivas_lfe_window_coeff_48k_fx[IVAS_LFE_FADE_LEN_48K] = { // Q31 0x0003a373, 0x000608f6, 0x000888a7, 0x000b3e1b, 0x000e34f1, 0x001174a2, 0x00150328, 0x0018e5e1, 0x001d21eb, 0x0021bc4d, 0x0026ba09, 0x002c202f, 0x0031f3dc, 0x00383a43, 0x003ef8ad, 0x0046347b, 0x004df325, 0x00563a3f, 0x005f0f74, 0x00687888, 0x00727b59, 0x007d1ddb, 0x0088661c, 0x00945a41, 0x00a10087, 0x00ae5f3d, 0x00bc7ccd, 0x00cb5fb3, 0x00db0e7d, 0x00eb8fd0, 0x00fcea61, 0x010f24f8, 0x0122466a, 0x013655a0, 0x014b598e, 0x01615936, 0x01785ba8, 0x01906800, 0x01a9855e, 0x01c3baf0, 0x01df0fee, 0x01fb8b90, 0x02193514, 0x023813c4, 0x02582ee4, 0x02798db8, 0x029c378c, 0x02c033a4, 0x02e58944, 0x030c3fa8, 0x03345e0c, 0x035deba0, 0x0388ef8c, 0x03b570f0, 0x03e376dc, 0x04130858, 0x04442c58, 0x0476e9b8, 0x04ab4760, 0x04e14c00, 0x0518fe48, 0x055264c8, 0x058d8600, 0x05ca6850, 0x06091200, 0x06498930, 0x068bd3f0, 0x06cff830, 0x0715fba8, 0x075de408, 0x07a7b6c8, 0x07f37940, 0x084130a0, 0x0890e200, 0x08e29220, 0x093645c0, 0x098c0150, 0x09e3c940, 0x0a3da180, 0x0a998e30, 0x0af792e0, 0x0b57b320, 0x0bb9f240, 0x0c1e5360, 0x0c84d940, 0x0ced8690, 0x0d585dc0, 0x0dc560f0, 0x0e349200, 0x0ea5f2b0, 0x0f198450, 0x0f8f4820, 0x10073f00, 0x10816980, 0x10fdc840, 0x117c5b00, 0x11fd21e0, 0x12801c60, 0x130549a0, 0x138ca8c0, 0x14163880, 0x14a1f740, 0x152fe320, 0x15bffa00, 0x16523980, 0x16e69ee0, 0x177d2700, 0x1815cec0, 0x18b09260, 0x194d6e00, 0x19ec5d60, 0x1a8d5c20, 0x1b306580, 0x1bd57440, 0x1c7c8300, 0x1d258c40, 0x1dd08a00, 0x1e7d7600, 0x1f2c49a0, 0x1fdcfe20, 0x208f8c40, 0x2143ed00, 0x21fa1840, 0x22b20680, 0x236baf40, 0x24270a00, 0x24e40e00, 0x25a2b280, 0x2662ee00, 0x2724b700, 0x27e80400, 0x28acca80, 0x297300c0, 0x2a3a9c00, 0x2b039180, 0x2bcdd680, 0x2c995fc0, 0x2d6621c0, 0x2e341140, 0x2f032240, 0x2fd34900, 0x30a47900, 0x3176a640, 0x3249c440, 0x331dc600, 0x33f29f40, 0x34c842c0, 0x359ea340, 0x3675b3c0, 0x374d66c0, 0x3825af00, 0x38fe7ec0, 0x39d7c880, 0x3ab17e40, 0x3b8b9240, 0x3c65f6c0, 0x3d409d80, 0x3e1b7880, 0x3ef679c0, 0x3fd19340, 0x40acb680, 0x4187d580, 0x4262e280, 0x433dce80, 0x44188c00, 0x44f30c80, 0x45cd4180, 0x46a71e00, 0x47809300, 0x48599300, 0x49320f80, 0x4a09fb80, 0x4ae14880, 0x4bb7e900, 0x4c8dcf80, 0x4d62ee80, 0x4e373880, 0x4f0aa080, 0x4fdd1900, 0x50ae9600, 0x517f0980, 0x524e6780, 0x531ca380, 0x53e9b100, 0x54b58400, 0x55801080, 0x56494b00, 0x57112800, 0x57d79c00, 0x589c9c00, 0x59601d00, 0x5a221480, 0x5ae27880, 0x5ba13e00, 0x5c5e5c00, 0x5d19c880, 0x5dd37a80, 0x5e8b6800, 0x5f418980, 0x5ff5d580, 0x60a84480, 0x6158ce00, 0x62076a80, 0x62b41280, 0x635ebf80, 0x64076a80, 0x64ae0d00, 0x6552a100, 0x65f52080, 0x66958680, 0x6733cd00, 0x67cff000, 0x6869ea80, 0x6901b880, 0x69975600, 0x6a2abf80, 0x6abbf200, 0x6b4aea80, 0x6bd7a680, 0x6c622300, 0x6cea5f80, 0x6d705900, 0x6df40f00, 0x6e758080, 0x6ef4ac80, 0x6f719300, 0x6fec3380, 0x70648f00, 0x70daa580, 0x714e7880, 0x71c00880, 0x722f5780, 0x729c6700, 0x73073980, 0x736fd100, 0x73d62f80, 0x743a5900, 0x749c5080, 0x74fc1880, 0x7559b600, 0x75b52b80, 0x760e7e80, 0x7665b280, 0x76bacc80, 0x770dd180, 0x775ec600, 0x77adb000, 0x77fa9480, 0x78457900, 0x788e6400, 0x78d55b80, 0x791a6500, 0x795d8780, 0x799ec900, 0x79de3100, 0x7a1bc580, 0x7a578d80, 0x7a919100, 0x7ac9d600, 0x7b006500, 0x7b354400, 0x7b687b80, 0x7b9a1300, 0x7bca1180, 0x7bf87f80, 0x7c256400, 0x7c50c780, 0x7c7ab180, 0x7ca32a00, 0x7cca3900, 0x7cefe600, 0x7d143900, 0x7d373a80, 0x7d58f280, 0x7d796800, 0x7d98a380, 0x7db6ad00, 0x7dd38c80, 0x7def4900, 0x7e09eb00, 0x7e237a00, 0x7e3bfd80, 0x7e537d80, 0x7e6a0180, 0x7e7f9080, 0x7e943200, 0x7ea7ed80, 0x7ebaca00, 0x7ecccf00, 0x7ede0300, 0x7eee6d00, 0x7efe1400, 0x7f0cfe80, 0x7f1b3380, 0x7f28b900, 0x7f359500, 0x7f41ce80, 0x7f4d6b80, 0x7f587180, 0x7f62e680, 0x7f6cd000, 0x7f763400, 0x7f7f1780, 0x7f878080, 0x7f8f7380, 0x7f96f580, 0x7f9e0b80, 0x7fa4bb00, 0x7fab0780, 0x7fb0f600, 0x7fb68b00, 0x7fbbca00, 0x7fc0b800, 0x7fc55880, 0x7fc9af80, 0x7fcdc080, 0x7fd18f00, 0x7fd51e80, 0x7fd87280, 0x7fdb8d80, 0x7fde7380, 0x7fe12700, 0x7fe3aa80, 0x7fe60100, 0x7fe82d00, 0x7fea3180, 0x7fec1000, 0x7fedcb00, 0x7fef6500, 0x7ff0e000, 0x7ff23e00, 0x7ff38080, 0x7ff4a980, 0x7ff5ba80, 0x7ff6b580, 0x7ff79c00, 0x7ff86e80, 0x7ff92f80, 0x7ff9e000, 0x7ffa8100, 0x7ffb1380, 0x7ffb9880, 0x7ffc1180, 0x7ffc7f80, 0x7ffce300, 0x7ffd3c80, 0x7ffd8d80, 0x7ffdd680, 0x7ffe1880, 0x7ffe5300, 0x7ffe8800, 0x7ffeb700, 0x7ffee100, 0x7fff0600, 0x7fff2700, 0x7fff4480, 0x7fff5e80, 0x7fff7500, 0x7fff8900, 0x7fff9a80, 0x7fffaa00, 0x7fffb780, 0x7fffc300, 0x7fffcd00, 0x7fffd580, 0x7fffdc80, 0x7fffe300, 0x7fffe880, 0x7fffec80, 0x7ffff080, 0x7ffff380, 0x7ffff680, 0x7ffff880, 0x7ffffa00, 0x7ffffb80, 0x7ffffc80, 0x7ffffd80, 0x7ffffe80, 0x7fffff00, 0x7fffff00, 0x7fffff80, 0x7fffff80, 0x7fffffff, 0x7fffffff }; @@ -1835,11 +4690,15 @@ const Word32 ivas_lfe_window_coeff_16k_fx[IVAS_LFE_FADE_LEN_16K] = { // Q31 }; // Q31 -const UWord32 d_hamm_lfe_plc_fx[LFE_PLC_LENANA / 2] = { 171798688, 172140032, 173163840, 174869408, 177255536, 180320592, 184062448, 188478528, 193565776, 199320672, 205739248, 212817056, 220549216, 228930368, 237954752, 247616096, 257907744, 268822560, 280353056, 292491200, 305228608, 318556544, 332465728, 346946560, 361989056, 377582784, 393717024, 410380576, - 427561952, 445249248, 463430240, 482092416, 501222848, 520808288, 540835200, 561289856, 582157952, 603425152, 625076800, 647097792, 669473088, 692187136, 715224192, 738568384, 762203584, 786113472, 810281536, 834691008, 859324992, 884166592, 909198592, 934403584, 959764288, 985263168, 1010882496, 1036604672, - 1062411840, 1088286208, 1114209920, 1140164992, 1166133632, 1192097664, 1218039296, 1243940608, 1269783552, 1295550464, 1321223424, 1346784768, 1372216704, 1397501824, 1422622464, 1447561344, 1472301312, 1496825216, 1521116032, 1545157120, 1568931712, 1592423424, 1615616128, 1638493568, 1661040256, - 1683240320, 1705078528, 1726539776, 1747609216, 1768272384, 1788514944, 1808322816, 1827682432, 1846580352, 1865003520, 1882939264, 1900375040, 1917298944, 1933699328, 1949564672, 1964884096, 1979647104, 1993843328, 2007463040, 2020496768, 2032935680, 2044770944, 2055994624, 2066598784, 2076576128, - 2085919744, 2094623360, 2102680704, 2110086272, 2116835072, 2122922368, 2128343936, 2133095936, 2137175296, 2140579072, 2143304832, 2145350912, 2146715648, 2147398272 }; +const UWord32 d_hamm_lfe_plc_fx[LFE_PLC_LENANA / 2] = { + 171798688, 172140032, 173163840, 174869408, 177255536, 180320592, 184062448, 188478528, 193565776, 199320672, 205739248, 212817056, 220549216, 228930368, 237954752, 247616096, 257907744, 268822560, 280353056, 292491200, 305228608, 318556544, 332465728, 346946560, 361989056, 377582784, 393717024, 410380576, + 427561952, 445249248, 463430240, 482092416, 501222848, 520808288, 540835200, 561289856, 582157952, 603425152, 625076800, 647097792, 669473088, 692187136, 715224192, 738568384, 762203584, 786113472, 810281536, 834691008, 859324992, 884166592, 909198592, 934403584, 959764288, 985263168, 1010882496, 1036604672, + 1062411840, 1088286208, 1114209920, 1140164992, 1166133632, 1192097664, 1218039296, 1243940608, 1269783552, 1295550464, 1321223424, 1346784768, 1372216704, 1397501824, 1422622464, 1447561344, 1472301312, 1496825216, 1521116032, 1545157120, 1568931712, 1592423424, 1615616128, 1638493568, 1661040256, + 1683240320, 1705078528, 1726539776, 1747609216, 1768272384, 1788514944, 1808322816, 1827682432, 1846580352, 1865003520, 1882939264, 1900375040, 1917298944, 1933699328, 1949564672, 1964884096, 1979647104, 1993843328, 2007463040, 2020496768, 2032935680, 2044770944, 2055994624, 2066598784, 2076576128, + 2085919744, 2094623360, 2102680704, 2110086272, 2116835072, 2122922368, 2128343936, 2133095936, 2137175296, 2140579072, 2143304832, 2145350912, 2146715648, 2147398272 +}; + + /*------------------------------------------------------------------------------------------* * MDFT/iMDFT ROM tables *------------------------------------------------------------------------------------------*/ @@ -2524,297 +5383,6 @@ const Word32 ivas_mdft_coeff_cos_twid_40_fx[IVAS_40_PT_LEN + 1] = { 252409632, 168489632, 84309816, 0 }; -// Q30 -const Word32 dirac_gains_norm_term_int[9] = { - 1073741824, 759250176, 1073741824, 438353280, 219176688, 1073741824, 309962528, 98018768, - 40015996 -}; - -// Q31 -const Word32 dirac_gains_norm_term_fx[9] = { - 2147483647, 1518500352, 2147483647, 876706560, 438353376, 2147483647, 619925056, 196037536, 80031992 -}; - -// Q27 -const Word32 dirac_gains_Pnm_int[91][9] = { - { -134217728, 0, 134217728, 0, 0, -134217728, 0, 0, 0 }, - { -134197288, 2342396, 134156400, -7026119, 122639, -134095104, 14049026, -613106, 10701 }, - { -134135976, 4684105, 133972536, -14043751, 490416, -133727536, 28061840, -2450586, 85575 }, - { -134033784, 7024438, 133666264, -21044428, 1102895, -133115936, 42002312, -5506921, 288606 }, - { -133890784, 9362478, 133238096, -28019012, 1959264, -132262040, 55833192, -9772457, 683351 }, - { -133706992, 11697809, 132688440, -34959892, 3058584, -131167848, 69520408, -15234719, 1332861 }, - { -133482480, 14029564, 132017976, -41858120, 4399464, -129836328, 83027720, -21876818, 2299344 }, - { -133217280, 16357047, 131227600, -48705360, 5980272, -128270864, 96320208, -29678480, 3644062 }, - { -132911536, 18679510, 130318176, -55493180, 7799064, -126475552, 109363520, -38615824, 5427104 }, - { -132565296, 20996256, 129290928, -62213284, 9853607, -124455056, 122123976, -48661468, 7707213 }, - { -132178656, 23306694, 128146968, -68857816, 12141505, -122214432, 134569248, -59785232, 10541761 }, - { -131751776, 25609964, 126887800, -75418320, 14659851, -119759704, 146666688, -71952528, 13986158 }, - { -131284736, 27905410, 125514928, -81886824, 17405570, -117097048, 158385376, -85126080, 18094094 }, - { -130777744, 30192412, 124030024, -88255768, 20375446, -114233392, 169695776, -99266128, 22917396 }, - { -130230888, 32470208, 122434848, -94517128, 23565774, -111176104, 180568608, -114328832, 28505376 }, - { -129644368, 34738112, 120731408, -100663320, 26972664, -107933048, 190976128, -130267952, 34905200 }, - { -129018344, 36995424, 118921736, -106686840, 30591964, -104512608, 200891728, -147034448, 42161440 }, - { -128353056, 39241452, 117008088, -112580368, 34419264, -100923608, 210290720, -164576576, 50316080 }, - { -127648640, 41475572, 114992728, -118336848, 38449984, -97175216, 219149232, -182840512, 59408524 }, - { -126905360, 43697012, 112878208, -123949000, 42679048, -93277184, 227444688, -201769248, 69474696 }, - { -126123408, 45905176, 110666976, -129410248, 47101484, -89239304, 235156848, -221304640, 80548296 }, - { -125303040, 48099312, 108361848, -134713792, 51711740, -85072152, 242266352, -241385344, 92659128 }, - { -124444528, 50278820, 105965584, -139853120, 56504308, -80786280, 248755776, -261949392, 105834368 }, - { -123548080, 52443040, 103481048, -144822272, 61473384, -76392608, 254609280, -282932704, 120097808 }, - { -122614016, 54591264, 100911328, -149614784, 66612780, -71902504, 259812912, -304269024, 135469312 }, - { -121642584, 56722880, 98259536, -154225168, 71916384, -67327280, 264354304, -325891904, 151965872 }, - { -120634104, 58837188, 95528944, -158647504, 77377552, -62678672, 268222720, -347732352, 169600480 }, - { -119588872, 60933588, 92722800, -162876704, 82989840, -57968464, 271409984, -369722464, 188383040 }, - { -118507224, 63011412, 89844624, -166907264, 88746208, -53208660, 273908992, -391791360, 208319200 }, - { -117389480, 65070028, 86897888, -170734608, 94639696, -48411356, 275714624, -413868832, 229411120 }, - { -116235952, 67108864, 83886096, -174353936, 100663296, -43588484, 276824064, -435884832, 251658240 }, - { -115047032, 69127240, 80812992, -177760784, 106809472, -38752388, 277236128, -457767936, 275054816 }, - { -113823072, 71124576, 77682296, -180951136, 113070880, -33915128, 276951296, -479447744, 299592224 }, - { -112564464, 73100224, 74497888, -183920976, 119439696, -29088994, 275972448, -500852768, 325257600 }, - { -111271560, 75053584, 71263600, -186666800, 125908272, -24285974, 274304128, -521913568, 352034976 }, - { -109944736, 76984136, 67983320, -189185120, 132468856, -19517968, 271952224, -542560640, 379905024 }, - { -108584440, 78891192, 64661120, -191472992, 139113184, -14796968, 268925472, -562724864, 408843424 }, - { -107191040, 80774240, 61300996, -193527600, 145833472, -10134552, 265233552, -582338944, 438823936 }, - { -105765016, 82632672, 57907084, -195346384, 152621264, -5542341, 260888528, -601335936, 469815200 }, - { -104306760, 84465968, 54483472, -196927072, 159468512, -1031517, 255903808, -619651456, 501783968 }, - { -102816736, 86273488, 51034412, -198267904, 166366624, 3386773, 250294992, -637221056, 534692032 }, - { -101295408, 88054736, 47564080, -199367280, 173307296, 7701825, 244078832, -653983232, 568498944 }, - { -99743224, 89809192, 44076620, -200223728, 180282192, 11903295, 237274256, -669879040, 603161856 }, - { -98160648, 91536272, 40576356, -200836160, 187282720, 15980983, 229901280, -684849728, 638632640 }, - { -96548144, 93235488, 37067500, -201203920, 194300432, 19925212, 221981760, -698840192, 674862144 }, - { -94906272, 94906272, 33554432, -201326592, 201326592, 23726568, 213539056, -711796992, 711796992 }, - { -93235488, 96548144, 30041364, -201203920, 208352752, 27376188, 204597888, -723670016, 749382016 }, - { -91536272, 98160648, 26532496, -200836160, 215370464, 30865648, 195183856, -734411520, 787559936 }, - { -89809200, 99743208, 23032272, -200223728, 222370864, 34186800, 185324752, -743976000, 826268864 }, - { -88054736, 101295408, 19544786, -199367280, 229345888, 37332284, 175048640, -752322176, 865447872 }, - { -86273488, 102816736, 16074439, -198268032, 236286560, 40294912, 164385440, -759410496, 905030144 }, - { -84465944, 104306784, 12625336, -196927072, 243184800, 43068320, 153365504, -765205632, 944950528 }, - { -82632672, 105765016, 9201773, -195346384, 250031920, 45646496, 142020480, -769675200, 985139200 }, - { -80774256, 107191032, 5807891, -193527600, 256819584, 48024044, 130382952, -772789696, 1025526400 }, - { -78891192, 108584440, 2447739, -191472992, 263540000, 50196224, 118485736, -774524480, 1066041600 }, - { -76984120, 109944720, -874438, -189185120, 270184320, 52158672, 106363224, -774856768, 1106610176 }, - { -75053584, 111271544, -4154720, -186666800, 276744864, 53907864, 94049432, -773768704, 1147159552 }, - { -73100224, 112564464, -7389016, -183920976, 283213504, 55440728, 81579720, -771245696, 1187614080 }, - { -71124568, 113823072, -10573435, -180951136, 289582400, 56754824, 68989160, -767276288, 1227898496 }, - { -69127232, 115047064, -13704140, -177760784, 295843776, 57848416, 56313356, -761853888, 1267938048 }, - { -67108880, 116235952, -16777203, -174353936, 301989888, 58720256, 43588536, -754974720, 1307654528 }, - { -65070028, 117389472, -19788994, -170734608, 308013440, 59369844, 30850226, -746639232, 1346972928 }, - { -63011400, 118507224, -22735772, -166907264, 313906944, 59797272, 18134762, -736851968, 1385816832 }, - { -60933588, 119588872, -25613950, -162876704, 319663424, 60003204, 5477891, -725620736, 1424110464 }, - { -58837172, 120634088, -28420080, -158647504, 325275584, 59989016, -7084927, -712957184, 1461778688 }, - { -56722868, 121642576, -31150674, -154225168, 330736768, 59756660, -19517928, -698877184, 1498746240 }, - { -54591276, 122613992, -33802452, -149614784, 336040384, 59308680, -31786382, -683399744, 1534940800 }, - { -52443040, 123548064, -36372160, -144822272, 341179712, 58648260, -43855684, -666547776, 1570288384 }, - { -50278848, 124444520, -38856688, -139853264, 346148864, 57779188, -55691916, -648348160, 1604717952 }, - { -48099324, 125303040, -41252988, -134713792, 350941376, 56705796, -67261816, -628830848, 1638160896 }, - { -45905160, 126123416, -43558124, -129410240, 355551744, 55433036, -78532848, -608029120, 1670546304 }, - { -43697012, 126905360, -45769332, -123949000, 359974080, 53966400, -89473440, -585980480, 1701810944 }, - { -41475560, 127648632, -47883864, -118336808, 364203168, 52311936, -100052728, -562724992, 1731889152 }, - { -39241464, 128353048, -49899212, -112580408, 368233856, 50476188, -110241232, -538305984, 1760719104 }, - { -36995424, 129018360, -51812888, -106686856, 372061216, 48466224, -120010336, -512769824, 1788240512 }, - { -34738100, 129644368, -53622532, -100663280, 375680512, 46289628, -129332608, -486166400, 1814398208 }, - { -32470208, 130230888, -55325984, -94517088, 379087360, 43954400, -138181984, -458547616, 1839134464 }, - { -30192412, 130777744, -56921148, -88255752, 382277728, 41469052, -146533552, -429968768, 1862399872 }, - { -27905450, 131284752, -58406064, -81886920, 385247552, 38842476, -154363936, -400487584, 1884144384 }, - { -25609950, 131751776, -59778952, -75418272, 387993376, 36083912, -161651424, -370163232, 1904324096 }, - { -23306666, 132178656, -61038128, -68857760, 390511712, 33203050, -168375472, -339058272, 1922894464 }, - { -20996270, 132565280, -62182040, -62213328, 392799456, 30209874, -174517136, -307236864, 1939817984 }, - { -18679498, 132911536, -63209344, -55493124, 394854208, 27114732, -180059392, -274765312, 1955057024 }, - { -16357021, 133217280, -64118736, -48705292, 396672992, 23928188, -184986656, -241711232, 1968580864 }, - { -14029578, 133482472, -64909128, -41858176, 398253664, 20661142, -189285248, -208144320, 1980359808 }, - { -11697849, 133706992, -65579560, -34960012, 399594624, 17324636, -192943088, -174134880, 1990369664 }, - { -9362556, 133890784, -66129224, -28019252, 400693888, 13929935, -195949824, -139755008, 1998589184 }, - { -7024411, 134033784, -66557432, -21044346, 401550304, 10488515, -198297168, -105077560, 2004999424 }, - { -4684126, 134135976, -66863648, -14043818, 402162752, 7011926, -199978640, -70176320, 2009588352 }, - { -2342414, 134197304, -67047540, -7026174, 402530496, 3511839, -200989440, -35125516, 2012346496 }, - { -5, 134217728, -67108864, -17, 402653184, 8, -201326592, -88, 2013265920 } -}; - -// Q30 -const Word32 dirac_gains_trg_term_int[181][2] = { - { -1073741824, 93 }, - { -1073578304, -18739436 }, - { -1073087680, -37473000 }, - { -1072270272, -56195404 }, - { -1071126272, -74900440 }, - { -1069655936, -93582656 }, - { -1067859776, -112236624 }, - { -1065738240, -130856168 }, - { -1063292288, -149436080 }, - { -1060522368, -167970160 }, - { -1057429248, -186453440 }, - { -1054014208, -204879600 }, - { -1050278016, -223243376 }, - { -1046221952, -241539408 }, - { -1041847104, -259761664 }, - { -1037154944, -277904896 }, - { -1032146880, -295963392 }, - { -1026824448, -313931616 }, - { -1021189120, -331804480 }, - { -1015242880, -349576096 }, - { -1008987264, -367241408 }, - { -1002424448, -384794592 }, - { -995556160, -402230656 }, - { -988384640, -419544416 }, - { -980912000, -436730112 }, - { -973140608, -453782944 }, - { -965072832, -470697376 }, - { -956710976, -487468704 }, - { -948057792, -504091296 }, - { -939115840, -520560224 }, - { -929887680, -536871040 }, - { -920376384, -553017856 }, - { -910584576, -568996544 }, - { -900515712, -584801664 }, - { -890172480, -600428672 }, - { -879557888, -615873088 }, - { -868675520, -631129536 }, - { -857528320, -646194048 }, - { -846120128, -661061376 }, - { -834454080, -675727744 }, - { -822533888, -690187904 }, - { -810363392, -704438016 }, - { -797945664, -718473536 }, - { -785285056, -732290112 }, - { -772385152, -745883904 }, - { -759250176, -759250176 }, - { -745883904, -772385152 }, - { -732290112, -785285056 }, - { -718473600, -797945664 }, - { -704438016, -810363392 }, - { -690187904, -822533888 }, - { -675727552, -834454144 }, - { -661061376, -846120128 }, - { -646194048, -857528320 }, - { -631129536, -868675392 }, - { -615873088, -879557760 }, - { -600428672, -890172352 }, - { -584801792, -900515712 }, - { -568996544, -910584576 }, - { -553017856, -920376384 }, - { -536871040, -929887680 }, - { -520560224, -939115776 }, - { -504091296, -948057792 }, - { -487468704, -956710976 }, - { -470697376, -965072832 }, - { -453782944, -973140608 }, - { -436730208, -980911936 }, - { -419544416, -988384640 }, - { -402230784, -995556160 }, - { -384794592, -1002424448 }, - { -367241280, -1008987264 }, - { -349576096, -1015242880 }, - { -331804480, -1021189120 }, - { -313931712, -1026824384 }, - { -295963392, -1032146880 }, - { -277904800, -1037154944 }, - { -259761664, -1041847104 }, - { -241539296, -1046221952 }, - { -223243488, -1050278016 }, - { -204879600, -1054014208 }, - { -186453328, -1057429248 }, - { -167970160, -1060522368 }, - { -149435984, -1063292288 }, - { -130856168, -1065738240 }, - { -112236624, -1067859776 }, - { -93582792, -1069655936 }, - { -74900448, -1071126272 }, - { -56195288, -1072270272 }, - { -37473008, -1073087680 }, - { -18739318, -1073578304 }, - { -46, -1073741824 }, - { 18739350, -1073578304 }, - { 37473052, -1073087680 }, - { 56195320, -1072270272 }, - { 74900480, -1071126272 }, - { 93582824, -1069655936 }, - { 112236512, -1067859776 }, - { 130856168, -1065738240 }, - { 149435984, -1063292288 }, - { 167970272, -1060522368 }, - { 186453328, -1057429248 }, - { 204879504, -1054014208 }, - { 223243488, -1050278016 }, - { 241539296, -1046221952 }, - { 259761664, -1041847104 }, - { 277904896, -1037154944 }, - { 295963392, -1032146880 }, - { 313931712, -1026824448 }, - { 331804480, -1021189120 }, - { 349576096, -1015242880 }, - { 367241408, -1008987264 }, - { 384794720, -1002424320 }, - { 402230784, -995556160 }, - { 419544320, -988384640 }, - { 436730112, -980912000 }, - { 453782848, -973140608 }, - { 470697504, -965072832 }, - { 487468576, -956710976 }, - { 504091296, -948057792 }, - { 520560352, -939115776 }, - { 536870912, -929887680 }, - { 553017920, -920376384 }, - { 568996544, -910584704 }, - { 584801664, -900515712 }, - { 600428800, -890172224 }, - { 615873088, -879557888 }, - { 631129536, -868675392 }, - { 646193920, -857528320 }, - { 661061504, -846120064 }, - { 675727616, -834454144 }, - { 690187904, -822533888 }, - { 704438016, -810363136 }, - { 718473536, -797945792 }, - { 732290176, -785285056 }, - { 745883776, -772385216 }, - { 759250176, -759250176 }, - { 772385216, -745883776 }, - { 785285056, -732290112 }, - { 797945664, -718473536 }, - { 810363264, -704438016 }, - { 822533888, -690187904 }, - { 834454144, -675727616 }, - { 846120128, -661061504 }, - { 857528320, -646193920 }, - { 868675392, -631129536 }, - { 879557888, -615873088 }, - { 890172352, -600428800 }, - { 900515712, -584801792 }, - { 910584704, -568996544 }, - { 920376384, -553017920 }, - { 929887680, -536870912 }, - { 939115776, -520560352 }, - { 948057792, -504091296 }, - { 956710976, -487468576 }, - { 965072832, -470697504 }, - { 973140608, -453782944 }, - { 980911936, -436730112 }, - { 988384640, -419544320 }, - { 995556160, -402230784 }, - { 1002424320, -384794592 }, - { 1008987264, -367241280 }, - { 1015242880, -349576096 }, - { 1021189120, -331804480 }, - { 1026824448, -313931712 }, - { 1032146880, -295963392 }, - { 1037154944, -277904800 }, - { 1041847104, -259761664 }, - { 1046221952, -241539296 }, - { 1050278016, -223243488 }, - { 1054014208, -204879600 }, - { 1057429248, -186453328 }, - { 1060522368, -167970272 }, - { 1063292288, -149435984 }, - { 1065738240, -130856168 }, - { 1067859776, -112236624 }, - { 1069655936, -93582760 }, - { 1071126272, -74900440 }, - { 1072270272, -56195308 }, - { 1073087680, -37473052 }, - { 1073578304, -18739382 }, - { 1073741824, 0 } -}; - // Q31 const Word32 dirac_gains_trg_term_fx[181][2] = { { ( -2147483647 - 1 ), 187 }, @@ -3000,6 +5568,7 @@ const Word32 dirac_gains_trg_term_fx[181][2] = { { 2147483647, 0 } }; + /*------------------------------------------------------------------------------------------* * FB ROM tables *------------------------------------------------------------------------------------------*/ @@ -3048,6 +5617,7 @@ const Word32 ivas_fb_resp_cheby_ramp_16del_fx[IVAS_FB_1MS_16K_SAMP + 1] = { 377921280, 458893152, 547769792, 643727232, 745668672, 852315136, 962208832, 1073741824 }; + /*------------------------------------------------------------------------------------------* * SNS MSVQ codebooks and means *------------------------------------------------------------------------------------------*/ @@ -3508,7 +6078,6 @@ const Word16 ivas_sns_cdbk_tcx10_stage3_fx[8 * 16] = { -746, 246, 1015, 1707, 1184, -603, -843, -344, -247, -816, -723, -368, 46, 537, 328, -373 }; - const Word16 *const ivas_sns_cdbks_tcx10_fx[SNS_MSVQ_NSTAGES_TCX10] = { ivas_sns_cdbk_tcx10_stage1_fx, ivas_sns_cdbk_tcx10_stage2_fx, ivas_sns_cdbk_tcx10_stage3_fx }; @@ -3643,9 +6212,11 @@ const Word16 *const ivas_sns_cdbks_side_tcx10_fx[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx10_stage1_fx, ivas_sns_cdbks_side_tcx10_stage2_fx }; + /*----------------------------------------------------------------------* * MC ParamUpmix ROM tables *-----------------------------------------------------------------------*/ + const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_alpha_quant_table_fx = { 33, /* nquant */ 16, /* offset */ @@ -5100,5 +7671,820 @@ const Word32 ivas_fb_fr_12band_1ms_im_fx[IVAS_FB_12_1MS_LEN] = { 410948576, 250687680, 84254088 }; +const Word32 release_cnst_table[4][201] = // Q31 + { + { + 1913946752, + 1919716352, + 1925351680, + 1930855552, + 1936230784, + 1941479808, + 1946605312, + 1951609728, + 1956495744, + 1961265792, + 1965922304, + 1970467584, + 1974904320, + 1979234560, + 1983460736, + 1987585024, + 1991609856, + 1995537280, + 1999369344, + 2003108480, + 2006756480, + 2010315520, + 2013787520, + 2017174528, + 2020478464, + 2023701248, + 2026844672, + 2029910656, + 2032900992, + 2035817344, + 2038661376, + 2041435008, + 2044139648, + 2046777088, + 2049348864, + 2051856384, + 2054301440, + 2056685312, + 2059009536, + 2061275520, + 2063484672, + 2065638272, + 2067737856, + 2069784448, + 2071779584, + 2073724416, + 2075620096, + 2077467904, + 2079268992, + 2081024512, + 2082735488, + 2084403200, + 2086028416, + 2087612544, + 2089156352, + 2090660864, + 2092127104, + 2093555968, + 2094948480, + 2096305408, + 2097627776, + 2098916352, + 2100172032, + 2101395584, + 2102587776, + 2103749504, + 2104881408, + 2105984384, + 2107059072, + 2108106112, + 2109126400, + 2110120448, + 2111088896, + 2112032512, + 2112951808, + 2113847552, + 2114720128, + 2115570304, + 2116398592, + 2117205504, + 2117991552, + 2118757504, + 2119503616, + 2120230400, + 2120938496, + 2121628288, + 2122300288, + 2122954880, + 2123592576, + 2124213760, + 2124818944, + 2125408384, + 2125982592, + 2126541952, + 2127086848, + 2127617664, + 2128134656, + 2128638336, + 2129128832, + 2129606784, + 2130072192, + 2130525568, + 2130967296, + 2131397376, + 2131816448, + 2132224640, + 2132622080, + 2133009408, + 2133386496, + 2133753856, + 2134111744, + 2134460288, + 2134799744, + 2135130368, + 2135452416, + 2135766144, + 2136071680, + 2136369152, + 2136659072, + 2136941312, + 2137216256, + 2137484160, + 2137744896, + 2137998976, + 2138246400, + 2138487424, + 2138722176, + 2138950656, + 2139173376, + 2139390208, + 2139601408, + 2139807104, + 2140007424, + 2140202624, + 2140392576, + 2140577664, + 2140758016, + 2140933504, + 2141104512, + 2141271040, + 2141433216, + 2141591168, + 2141745024, + 2141894912, + 2142040832, + 2142182912, + 2142321408, + 2142456192, + 2142587392, + 2142715264, + 2142839808, + 2142961152, + 2143079296, + 2143194240, + 2143306240, + 2143415424, + 2143521664, + 2143625216, + 2143725952, + 2143824128, + 2143919744, + 2144012800, + 2144103424, + 2144191744, + 2144277760, + 2144361472, + 2144443136, + 2144522496, + 2144599936, + 2144675200, + 2144748544, + 2144820096, + 2144889600, + 2144957440, + 2145023488, + 2145087744, + 2145150336, + 2145211264, + 2145270656, + 2145328512, + 2145384832, + 2145439616, + 2145493120, + 2145545088, + 2145595776, + 2145645056, + 2145693184, + 2145739904, + 2145785472, + 2145829888, + 2145873152, + 2145915136, + 2145956224, + 2145996032, + 2146034944, + 2146072832, + 2146109696, + 2146145664, + 2146180608, + 2146214656, + 2146247808, + }, + { + 2027355264, + 2030408704, + 2033386624, + 2036290944, + 2039123328, + 2041885440, + 2044578944, + 2047205376, + 2049766528, + 2052263680, + 2054698496, + 2057072384, + 2059387008, + 2061643520, + 2063843328, + 2065987968, + 2068078720, + 2070116864, + 2072103552, + 2074040192, + 2075927936, + 2077767936, + 2079561472, + 2081309568, + 2083013376, + 2084673920, + 2086292352, + 2087869696, + 2089406976, + 2090905216, + 2092365184, + 2093788032, + 2095174528, + 2096525824, + 2097842432, + 2099125632, + 2100375808, + 2101594240, + 2102781312, + 2103938048, + 2105065216, + 2106163456, + 2107233536, + 2108276096, + 2109292032, + 2110281728, + 2111246080, + 2112185728, + 2113101056, + 2113992960, + 2114861824, + 2115708288, + 2116532992, + 2117336448, + 2118119168, + 2118881792, + 2119624704, + 2120348416, + 2121053440, + 2121740288, + 2122409344, + 2123061120, + 2123696128, + 2124314624, + 2124917120, + 2125504128, + 2126075776, + 2126632832, + 2127175296, + 2127703808, + 2128218624, + 2128720000, + 2129208448, + 2129684352, + 2130147712, + 2130599168, + 2131038976, + 2131467264, + 2131884416, + 2132290816, + 2132686592, + 2133072256, + 2133447680, + 2133813504, + 2134169856, + 2134516864, + 2134854784, + 2135184000, + 2135504640, + 2135816960, + 2136121216, + 2136417536, + 2136706048, + 2136987136, + 2137260928, + 2137527552, + 2137787264, + 2138040192, + 2138286592, + 2138526464, + 2138760192, + 2138987776, + 2139209472, + 2139425408, + 2139635712, + 2139840512, + 2140039936, + 2140234240, + 2140423424, + 2140607744, + 2140787200, + 2140962048, + 2141132288, + 2141298048, + 2141459584, + 2141616896, + 2141769984, + 2141919232, + 2142064512, + 2142205952, + 2142343808, + 2142478080, + 2142608768, + 2142736128, + 2142860032, + 2142980864, + 2143098368, + 2143212928, + 2143324544, + 2143433088, + 2143538944, + 2143641984, + 2143742336, + 2143840000, + 2143935232, + 2144027904, + 2144118144, + 2144206080, + 2144291712, + 2144375168, + 2144456320, + 2144535424, + 2144612480, + 2144687488, + 2144760448, + 2144831616, + 2144900992, + 2144968448, + 2145034112, + 2145098112, + 2145160448, + 2145221248, + 2145280256, + 2145337856, + 2145393920, + 2145448576, + 2145501696, + 2145553536, + 2145603968, + 2145653120, + 2145700992, + 2145747456, + 2145792896, + 2145837056, + 2145880064, + 2145922048, + 2145962880, + 2146002560, + 2146041344, + 2146078976, + 2146115712, + 2146151424, + 2146186240, + 2146220160, + 2146253184, + 2146285312, + 2146316672, + 2146347136, + 2146376832, + 2146405760, + 2146433920, + 2146461440, + 2146488192, + 2146514176, + 2146539520, + 2146564224, + 2146588160, + 2146611584, + 2146634368, + 2146656640, + 2146678272, + 2146699264, + 2146719744, + 2146739712, + 2146759168, + 2146778112, + 2146796544, + 2146814464, + 2146832000, + 2146849024, + 2146865664, + }, + { + 2086555136, + 2088125824, + 2089656576, + 2091148416, + 2092602240, + 2094018944, + 2095399680, + 2096745088, + 2098056192, + 2099333888, + 2100578816, + 2101792000, + 2102974080, + 2104125824, + 2105248128, + 2106341760, + 2107407232, + 2108445440, + 2109456896, + 2110442496, + 2111402624, + 2112338176, + 2113249664, + 2114137728, + 2115002880, + 2115845760, + 2116666880, + 2117466880, + 2118246272, + 2119005568, + 2119745280, + 2120465920, + 2121167872, + 2121851776, + 2122517888, + 2123166976, + 2123799168, + 2124414976, + 2125014912, + 2125599360, + 2126168704, + 2126723200, + 2127263360, + 2127789568, + 2128302208, + 2128801408, + 2129287808, + 2129761536, + 2130222976, + 2130672512, + 2131110272, + 2131536768, + 2131952128, + 2132356736, + 2132750848, + 2133134720, + 2133508736, + 2133872896, + 2134227584, + 2134573184, + 2134909696, + 2135237504, + 2135556736, + 2135867648, + 2136170624, + 2136465536, + 2136752896, + 2137032832, + 2137305344, + 2137570816, + 2137829376, + 2138081280, + 2138326528, + 2138565504, + 2138798080, + 2139024768, + 2139245440, + 2139460480, + 2139669888, + 2139873792, + 2140072320, + 2140265856, + 2140454144, + 2140637696, + 2140816384, + 2140990464, + 2141159936, + 2141325056, + 2141485824, + 2141642368, + 2141794944, + 2141943424, + 2142088064, + 2142228992, + 2142366208, + 2142499840, + 2142630016, + 2142756736, + 2142880128, + 2143000448, + 2143117440, + 2143231488, + 2143342592, + 2143450752, + 2143556096, + 2143658624, + 2143758592, + 2143855872, + 2143950592, + 2144043008, + 2144132864, + 2144220416, + 2144305664, + 2144388608, + 2144469504, + 2144548224, + 2144624896, + 2144699648, + 2144772352, + 2144843264, + 2144912256, + 2144979328, + 2145044864, + 2145108480, + 2145170560, + 2145231104, + 2145289856, + 2145347200, + 2145403008, + 2145457408, + 2145510400, + 2145561984, + 2145612160, + 2145661056, + 2145708672, + 2145755136, + 2145800192, + 2145844224, + 2145887104, + 2145928832, + 2145969408, + 2146008960, + 2146047616, + 2146085120, + 2146121600, + 2146157184, + 2146191872, + 2146225664, + 2146258560, + 2146290560, + 2146321792, + 2146352128, + 2146381696, + 2146410496, + 2146438528, + 2146465920, + 2146492416, + 2146518400, + 2146543616, + 2146568192, + 2146592128, + 2146615424, + 2146638080, + 2146660224, + 2146681728, + 2146702720, + 2146723072, + 2146743040, + 2146762368, + 2146781184, + 2146799616, + 2146817408, + 2146834816, + 2146851840, + 2146868352, + 2146884352, + 2146900096, + 2146915328, + 2146930176, + 2146944640, + 2146958720, + 2146972416, + 2146985856, + 2146998784, + 2147011456, + 2147023872, + 2147035904, + 2147047552, + 2147058944, + 2147070080, + 2147080832, + 2147091456, + 2147101696, + 2147111680, + 2147121408, + 2147130880, + 2147140096, + 2147149056, + 2147157760, + 2147166336, + 2147174656, + }, + { + 2106670080, + 2107727232, + 2108757120, + 2109760640, + 2110738432, + 2111691008, + 2112619136, + 2113523328, + 2114404352, + 2115262592, + 2116098816, + 2116913408, + 2117707136, + 2118480256, + 2119233536, + 2119967360, + 2120682240, + 2121378688, + 2122057088, + 2122717952, + 2123361792, + 2123988992, + 2124599936, + 2125195136, + 2125774848, + 2126339584, + 2126889728, + 2127425536, + 2127947520, + 2128456064, + 2128951296, + 2129433856, + 2129903744, + 2130361600, + 2130807424, + 2131241728, + 2131664768, + 2132076928, + 2132478208, + 2132869248, + 2133250048, + 2133620992, + 2133982208, + 2134334080, + 2134676864, + 2135010688, + 2135335936, + 2135652608, + 2135961088, + 2136261504, + 2136554112, + 2136839168, + 2137116800, + 2137387136, + 2137650560, + 2137907072, + 2138156928, + 2138400256, + 2138637184, + 2138867968, + 2139092864, + 2139311744, + 2139524992, + 2139732736, + 2139934976, + 2140131968, + 2140323840, + 2140510720, + 2140692736, + 2140870016, + 2141042688, + 2141210752, + 2141374592, + 2141534080, + 2141689344, + 2141840640, + 2141987968, + 2142131456, + 2142271232, + 2142407424, + 2142539904, + 2142669056, + 2142794752, + 2142917248, + 2143036544, + 2143152640, + 2143265792, + 2143375872, + 2143483264, + 2143587712, + 2143689472, + 2143788544, + 2143885056, + 2143979136, + 2144070656, + 2144159872, + 2144246656, + 2144331264, + 2144413568, + 2144493824, + 2144571904, + 2144647936, + 2144722048, + 2144794240, + 2144864512, + 2144932864, + 2144999552, + 2145064448, + 2145127680, + 2145189248, + 2145249152, + 2145307520, + 2145364480, + 2145419776, + 2145473792, + 2145526272, + 2145577472, + 2145627264, + 2145675776, + 2145723008, + 2145768960, + 2145813760, + 2145857408, + 2145899904, + 2145941376, + 2145981696, + 2146020864, + 2146059136, + 2146096384, + 2146132608, + 2146167936, + 2146202368, + 2146235776, + 2146268416, + 2146300160, + 2146331136, + 2146361216, + 2146390528, + 2146419200, + 2146446976, + 2146474112, + 2146500480, + 2146526208, + 2146551168, + 2146575488, + 2146599296, + 2146622464, + 2146644864, + 2146666880, + 2146688128, + 2146708992, + 2146729216, + 2146748928, + 2146768128, + 2146786816, + 2146805120, + 2146822784, + 2146840064, + 2146856960, + 2146873344, + 2146889216, + 2146904832, + 2146919936, + 2146934656, + 2146948992, + 2146962944, + 2146976640, + 2146989824, + 2147002752, + 2147015296, + 2147027584, + 2147039488, + 2147051136, + 2147062400, + 2147073408, + 2147084160, + 2147094528, + 2147104768, + 2147114624, + 2147124352, + 2147133696, + 2147142912, + 2147151744, + 2147160448, + 2147168896, + 2147177088, + 2147185152, + 2147192960, + 2147200512, + 2147207936, + 2147215104, + 2147222144, + 2147229056, + 2147235712, + 2147242112, + 2147248384, + 2147254656, + 2147260544, + 2147266432, + 2147272064, + 2147277568, + }, + }; /* clang-format on */ diff --git a/lib_com/ivas_rom_com_fx.h b/lib_com/ivas_rom_com_fx.h deleted file mode 100644 index 3344a35d208b8ed225895c9bab0f66db88ac7978..0000000000000000000000000000000000000000 --- a/lib_com/ivas_rom_com_fx.h +++ /dev/null @@ -1,295 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#ifndef IVAS_ROM_COM_FX_H -#define IVAS_ROM_COM_FX_H - -#include -#include "options.h" -#include "cnst.h" -#include "ivas_cnst.h" -#include "stat_com.h" -#include "ivas_stat_com.h" - - -extern const Word16 ivas_sin_twiddle_480_fx[IVAS_480_PT_LEN >> 1]; -extern const Word16 ivas_cos_twiddle_480_fx[IVAS_480_PT_LEN >> 1]; -extern const Word16 ivas_sin_twiddle_320_fx[IVAS_320_PT_LEN >> 1]; -extern const Word16 ivas_cos_twiddle_320_fx[IVAS_320_PT_LEN >> 1]; -extern const Word16 ivas_sin_twiddle_160_fx[IVAS_160_PT_LEN >> 1]; -extern const Word16 ivas_cos_twiddle_160_fx[IVAS_160_PT_LEN >> 1]; -extern const Word16 ivas_sin_twiddle_80_fx[IVAS_80_PT_LEN >> 1]; -extern const Word16 ivas_cos_twiddle_80_fx[IVAS_80_PT_LEN >> 1]; -extern const Word16 nf_tw_smoothing_coeffs_fx[N_LTP_GAIN_MEMS]; -extern const Word32 dft_res_gains_q_fx[][2]; -extern const Word16 dft_res_cod_alpha_fx[STEREO_DFT_BAND_MAX]; -extern const Word16 dft_trigo_12k8_fx[STEREO_DFT_N_12k8_ENC / 4 + 1]; -extern const Word16 dft_trigo_32k_fx[STEREO_DFT_N_32k_ENC / 4 + 1]; -extern const Word16 dft_trigo_48k_fx[STEREO_DFT_N_MAX_ENC / 4 + 1]; -extern const Word16 gridEq_Table[NO_THETA16_MAX]; -extern const Word16 McMASA_LFEGain_vectors_fx_q13[64]; -extern const Word32 McMASA_LFEGain_vectors_fx_q25[64]; - -extern const Word16 ivas_divde_255[256]; - -extern const Word32 ism_azimuth_borders_fx[4]; -extern const Word32 ism_elevation_borders_fx[4]; - -extern const UWord16 cum_n_for_id_th[122]; - -/* Multi-channel input and output setups */ - -extern const Word32 ls_azimuth_CICP1_fx[1]; -extern const Word32 ls_elevation_CICP1_fx[1]; -extern const Word32 ls_azimuth_CICP2_fx[2]; -extern const Word32 ls_elevation_CICP2_fx[2]; -extern const Word32 ls_azimuth_CICP6_fx[5]; -extern const Word32 ls_elevation_CICP6_fx[5]; -extern const Word32 ls_azimuth_CICP12_fx[7]; -extern const Word32 ls_elevation_CICP12_fx[7]; -extern const Word32 ls_azimuth_CICP14_fx[7]; -extern const Word32 ls_elevation_CICP14_fx[7]; -extern const Word32 ls_azimuth_CICP16_fx[9]; -extern const Word32 ls_elevation_CICP16_fx[9]; -extern const Word32 ls_azimuth_CICP19_fx[11]; -extern const Word32 ls_elevation_CICP19_fx[11]; -extern const Word16 pow_10_q11[128]; -extern const Word32 pow_10_q23[14]; -extern const Word16 ivas_sin_az_fx[361]; -extern const Word16 ivas_sine_panning_tbl_fx[601]; -extern const Word16 ivas_tan_panning_gain_dirac_tbl_fx[601]; - -/*----------------------------------------------------------------------------------* - * Stereo ICA ROM tables - *----------------------------------------------------------------------------------*/ - -extern const Word32 ica_sincInterp2_fx[]; // Q31 -extern const Word32 ica_sincInterp4_fx[]; // Q31 -extern const Word32 ica_sincInterp6_fx[]; // Q31 - -/*----------------------------------------------------------------------------------* - * Stereo IC-BWE ROM tables - *----------------------------------------------------------------------------------*/ - -extern const Word16 pow_10_icbwe_gsMapping_tbl_fx[]; -extern const Word16 pow_10_icbwe_gsMappingDFT_tbl_fx[]; - -/*----------------------------------------------------------------------------------* - * TD Stereo ROM tables - *----------------------------------------------------------------------------------*/ - -extern const UWord32 tdm_ratio_tabl_fx[TDM_NQ + 1]; -extern const Word32 tdm_ratio_tabl_fx_Q30[TDM_NQ + 1]; -extern const Word32 tdm_ratio_tabl_fx_Q24[TDM_NQ + 1]; -extern const UWord32 tdm_den_ratio_tabl_fx[]; -extern const Word16 icbwe_gsMapping_tbl_fx[]; // Q12 -extern const Word16 icbwe_gsMappingDFT_tbl_fx[]; // Q12 - -/* LSFs Intra-frame prediction tables */ -extern const Word16 tdm_LSF_MEAN_RE_USE_OUT_fx[M]; -extern const Word16 tdm_LSF_MEAN_RE_USE_IN_fx[M]; -extern const Word16 tdm_LSF_MEAN_RE_USE_fx[M]; - -extern const Word16 tdm_Beta_Q1bit_re_use_13k2_fx[2]; -extern const Word16 tdm_Beta_Q1bit_re_use_16k4_fx[2]; -extern const Word16 tdm_Beta_Q1bit_re_use_24k4_32k_fx[2]; -extern const Word16 tdm_Beta_Q1bit_re_use_48k_fx[2]; - -extern const Word16 tdm_RE_USE_adaptive_beta_prd_diag_3_fx[15 + 16 + 15]; - -extern const Word16 tdm_LSF_MEAN_PRED_QNT_OUT_fx[M]; -extern const Word16 tdm_LSF_MEAN_PRED_QNT_IN_fx[M]; -extern const Word16 tdm_LSF_MEAN_PRED_QNT_fx[M]; -extern const Word16 tdm_PRED_QNT_fixed_beta_prd_diag_3_fx[15 + 16 + 15]; - -/*----------------------------------------------------------------------------------* - * Stereo DTX ROM tables - *----------------------------------------------------------------------------------*/ - -extern const Word16 dft_cng_alpha_bits_fx[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_COH_ALPHA_LEVELS]; -extern const Word16 dft_cng_coh_pred_fx[][STEREO_DFT_COH_PRED_COEFFS]; - -/*----------------------------------------------------------------------------------* - * DirAC ROM tables - *----------------------------------------------------------------------------------*/ - -extern const Word32 diffuseness_reconstructions_fx[DIRAC_DIFFUSE_LEVELS]; -extern const Word32 diffuseness_thresholds_fx[DIRAC_DIFFUSE_LEVELS + 1]; -extern const Masa_Diffuseness_Ratios masa_diffuse_ratios[DIRAC_DIFFUSE_LEVELS][DIRAC_DIFFUSE_LEVELS]; - -/*------------------------------------------------------------------------------------------* - * SPAR ROM tables - *------------------------------------------------------------------------------------------*/ - -extern const Word32 dtx_pd_real_min_max_fx[2]; -extern const Word32 one_by_q_level[64]; - -/*----------------------------------------------------------------------------------* - * Parametric MC ROM tables - *----------------------------------------------------------------------------------*/ - -extern const Word16 ivas_param_mc_quant_ild_5d1_48_fx[PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; -extern const Word16 ivas_param_mc_quant_icc_fx[PARAM_MC_SZ_ICC_QUANTIZER]; - -/*----------------------------------------------------------------------------------* - * MASA ROM tables - *----------------------------------------------------------------------------------*/ - -extern const Word32 no_phi_masa_inv_fx[NO_SPHERICAL_GRIDS][MAX_NO_THETA]; -extern const Word32 azimuth_cb_fx[8]; -extern const Word32 delta_theta_masa_fx[NO_SPHERICAL_GRIDS - 2]; -extern const Word16 coherence_cb0_masa_Q14[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH]; -extern const Word32 coherence_cb0_masa_fx[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH]; -extern const Word16 coherence_cb1_masa_Q15[MASA_NO_CV_COH1 * MASA_MAXIMUM_CODING_SUBBANDS]; /* 25 */ -extern const Word32 coherence_cb1_masa_fx[MASA_NO_CV_COH1 * MASA_MAXIMUM_CODING_SUBBANDS]; /* 25 */ - -/* Multi-channel input and output setups */ -extern const Word16 ls_azimuth_CICP2_idx[2]; -extern const Word16 ls_elevation_CICP2_idx[2]; -extern const Word16 ls_azimuth_CICP6_idx[5]; -extern const Word16 ls_elevation_CICP6_idx[5]; -extern const Word16 ls_azimuth_CICP12_idx[7]; -extern const Word16 ls_elevation_CICP12_idx[7]; -extern const Word16 ls_azimuth_CICP14_idx[7]; -extern const Word16 ls_elevation_CICP14_idx[7]; -extern const Word16 ls_azimuth_CICP16_idx[9]; -extern const Word16 ls_elevation_CICP16_idx[9]; -extern const Word16 ls_azimuth_CICP19_idx[11]; -extern const Word16 ls_elevation_CICP19_idx[11]; - -extern const Word32 shoebox_sin_cos_tbl_fx[11][2]; - -extern const Word32 delta_phi_val[90]; -extern const Word32 inv_delta_phi_val[90]; -extern const Word32 dd_val[90]; -extern const Word32 cb_azi_chan_fx[]; // Q22 -extern const Word16 cb_azi_chan_16fx[]; // Q0 - -/*----------------------------------------------------------------------------------* - * MASA and ISM (OMASA) combined format ROM tables - *----------------------------------------------------------------------------------*/ - -extern const Word32 dct4_fx[]; -extern const Word32 dct5_fx[]; -extern const Word32 dct8_fx[]; -extern const Word32 dct12_fx[]; - -/*----------------------------------------------------------------------------------* - * ISM ROM tables - *----------------------------------------------------------------------------------*/ - -extern const Word32 ism_azimuth_borders_fx[4]; -extern const Word32 ism_elevation_borders_fx[4]; - -/*----------------------------------------------------------------------------------* - * LFE coding ROM tables - *----------------------------------------------------------------------------------*/ - -extern const Word32 ivas_lpf_4_butter_16k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; -extern const Word16 ivas_lpf_4_butter_16k_sos_e[IVAS_BIQUAD_FILT_LEN << 2]; -extern const Word32 ivas_lpf_4_butter_32k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; -extern const Word16 ivas_lpf_4_butter_32k_sos_e[IVAS_BIQUAD_FILT_LEN << 2]; -extern const Word32 ivas_lpf_4_butter_48k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; -extern const Word16 ivas_lpf_4_butter_48k_sos_e[IVAS_BIQUAD_FILT_LEN << 2]; -extern const Word32 ivas_lpf_2_butter_16k_fx[IVAS_BIQUAD_FILT_LEN << 1]; -extern const Word32 ivas_lpf_2_butter_32k_fx[IVAS_BIQUAD_FILT_LEN << 1]; -extern const Word32 ivas_lpf_2_butter_48k_fx[IVAS_BIQUAD_FILT_LEN << 1]; - -extern const Word32 ivas_lfe_window_coeff_48k_fx[IVAS_LFE_FADE_LEN_48K]; // Q31 -extern const Word32 ivas_lfe_window_coeff_32k_fx[IVAS_LFE_FADE_LEN_32K]; // Q31 -extern const Word32 ivas_lfe_window_coeff_16k_fx[IVAS_LFE_FADE_LEN_16K]; // Q31 - -extern const UWord32 d_hamm_lfe_plc_fx[LFE_PLC_LENANA / 2]; - -/*------------------------------------------------------------------------------------------* - * MDFT/iMDFT ROM tables - *------------------------------------------------------------------------------------------*/ - -extern const Word32 ivas_mdft_coeff_cos_twid_240_fx[IVAS_240_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_160_fx[IVAS_160_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_120_fx[IVAS_120_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_80_fx[IVAS_80_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_40_fx[IVAS_40_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_960_fx[IVAS_960_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_640_fx[IVAS_640_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_320_fx[IVAS_320_PT_LEN + 1]; -extern const Word32 dirac_gains_norm_term_int[9]; -extern const Word32 dirac_gains_norm_term_fx[9]; -extern const Word32 dirac_gains_Pnm_int[91][9]; -extern const Word32 dirac_gains_trg_term_int[181][2]; -extern const Word32 dirac_gains_trg_term_fx[181][2]; - -/*------------------------------------------------------------------------------------------* - * FB ROM tables - *------------------------------------------------------------------------------------------*/ - -extern const Word16 ivas_fb_cf_4ms_48k_fx[IVAS_FB_4MS_48K_SAMP]; -extern const Word16 ivas_fb_cf_1ms_48k_fx[IVAS_FB_1MS_48K_SAMP]; -extern const Word16 ivas_fb_cf_4ms_32k_fx[IVAS_FB_4MS_32K_SAMP]; -extern const Word16 ivas_fb_cf_1ms_32k_fx[IVAS_FB_1MS_32K_SAMP]; -extern const Word16 ivas_fb_cf_4ms_16k_fx[IVAS_FB_4MS_16K_SAMP]; -extern const Word16 ivas_fb_cf_1ms_16k_fx[IVAS_FB_1MS_16K_SAMP]; - -extern const Word32 ivas_fb_resp_cheby_ramp_32del_fx[IVAS_FB_1MS_32K_SAMP + 1]; -extern const Word32 ivas_fb_resp_cheby_ramp_16del_fx[IVAS_FB_1MS_16K_SAMP + 1]; - -/*------------------------------------------------------------------------------------------* - * SNS MSVQ codebooks and means - *------------------------------------------------------------------------------------------*/ - -extern const Word16 *const ivas_sns_cdbks_tcx20_fx[]; -extern const Word16 *const ivas_sns_cdbks_tcx10_fx[]; - -extern const Word16 *const ivas_sns_cdbks_side_tcx20_fx[]; -extern const Word16 *const ivas_sns_cdbks_side_tcx10_fx[]; - -/*----------------------------------------------------------------------* - * MC ParamUpmix ROM tables - *-----------------------------------------------------------------------*/ - -extern const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_alpha_quant_table_fx; -extern const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_beta_quant_table_fx[9]; - -extern const Word32 ivas_han_win_48k_fx[L_FRAME32k]; -extern const Word32 ivas_han_win_32k_fx[L_FRAME32k]; -extern const Word32 ivas_han_win_16k_fx[L_FRAME32k]; - -extern const Word32 ivas_sine_delay_32_fx[32]; - -extern const Word32 ivas_sine_frame_len_640_del_32_fx[577]; -extern const Word32 ivas_sine_frame_len_640_del_16_fx[289]; - -extern const Word32 ivas_fb_fr_12band_1ms_re_fx[IVAS_FB_12_1MS_LEN]; -extern const Word32 ivas_fb_fr_12band_1ms_im_fx[IVAS_FB_12_1MS_LEN]; - - -#endif diff --git a/lib_com/ivas_rotation_com_fx.c b/lib_com/ivas_rotation_com_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..d399c6a660e352ebd6ad625d8d13753c88d432a0 --- /dev/null +++ b/lib_com/ivas_rotation_com_fx.c @@ -0,0 +1,265 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "ivas_cnst.h" +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot_fx.h" +#include "ivas_prot_fx.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" +#include "basop_util.h" +#include "enh64.h" + + +/*------------------------------------------------------------------------- + * Euler2Quat() + * + * Calculate corresponding Quaternion from Euler angles in radians + *------------------------------------------------------------------------*/ +void Euler2Quat_fx( + const Word32 yaw, /* i : yaw (x) Q22 */ + const Word32 pitch, /* i : pitch (y) Q22 */ + const Word32 roll, /* i : roll (z) Q22 */ + IVAS_QUATERNION *quat /* o : quaternion describing the rotation Q22*/ +) +{ + Word16 cr = getCosWord16( extract_l( L_shr_r( roll, 10 ) ) ); // Q14 + Word16 sr = shr( getSinWord16( extract_l( L_shr_r( roll, 10 ) ) ), 1 ); // Q14 + Word16 cp = getCosWord16( extract_l( L_shr_r( pitch, 10 ) ) ); + Word16 sp = shr( getSinWord16( extract_l( L_shr_r( pitch, 10 ) ) ), 1 ); // Q14 + Word16 cy = getCosWord16( extract_l( L_shr_r( yaw, 10 ) ) ); + Word16 sy = shr( getSinWord16( extract_l( L_shr_r( yaw, 10 ) ) ), 1 ); // Q14 + quat->w_fx = L_shr_r( L_add( Mpy_32_16_1( L_mult0( cr, cp ), cy ), Mpy_32_16_1( L_mult0( sr, sp ), sy ) ), 5 ); // Q22 + move32(); + quat->x_fx = L_shr_r( L_sub( Mpy_32_16_1( L_mult0( sr, cp ), cy ), Mpy_32_16_1( L_mult0( cr, sp ), sy ) ), 5 ); // Q22 + move32(); + quat->y_fx = L_shr_r( L_add( Mpy_32_16_1( L_mult0( sr, cp ), sy ), Mpy_32_16_1( L_mult0( cr, sp ), cy ) ), 5 ); // Q22 + move32(); + quat->z_fx = L_shr_r( L_sub( Mpy_32_16_1( L_mult0( cr, cp ), sy ), Mpy_32_16_1( L_mult0( sr, sp ), cy ) ), 5 ); // Q22 + move32(); + + quat->q_fact = Q22; + move16(); + + return; +} + + +/*------------------------------------------------------------------------- + * Copy_Quat_fx() + * + * Quaternion q factor modification + *------------------------------------------------------------------------*/ + +void Copy_Quat_fx( + const IVAS_QUATERNION *in_quat, /* i : quaternion describing the rotation */ + IVAS_QUATERNION *out_quat /* o : quaternion describing the rotation */ +) +{ + out_quat->q_fact = in_quat->q_fact; + out_quat->w_fx = in_quat->w_fx; + out_quat->x_fx = in_quat->x_fx; + out_quat->y_fx = in_quat->y_fx; + out_quat->z_fx = in_quat->z_fx; + move16(); + move32(); + move32(); + move32(); + move32(); + + return; +} + + +/*------------------------------------------------------------------------- + * Scale_Quat_fx() + * + * Quaternion q factor modification + *------------------------------------------------------------------------*/ + +void modify_Quat_q_fx( + const IVAS_QUATERNION *in_quat, /* i : quaternion describing the rotation */ + IVAS_QUATERNION *out_quat, /* o : quaternion describing the rotation */ + Word16 q_new /* i : quaternion describing the rotation */ +) +{ + out_quat->w_fx = L_shl_sat( in_quat->w_fx, sub( q_new, in_quat->q_fact ) ); // q_new + out_quat->x_fx = L_shl_sat( in_quat->x_fx, sub( q_new, in_quat->q_fact ) ); // q_new + out_quat->y_fx = L_shl_sat( in_quat->y_fx, sub( q_new, in_quat->q_fact ) ); // q_new + out_quat->z_fx = L_shl_sat( in_quat->z_fx, sub( q_new, in_quat->q_fact ) ); // q_new + out_quat->q_fact = q_new; + return; +} + + +/*------------------------------------------------------------------------- + * modify_Rmat_q_fx() + * + * Rotation matrix q factor modification + *------------------------------------------------------------------------*/ + +void modify_Rmat_q_fx( + Word32 Rmat_in[3][3], /* i : real-space rotation matrix for this rotation */ + Word32 Rmat_out[3][3], /* o : real-space rotation matrix for this rotation */ + Word16 q_cur, /* i : current q factor for rotation matrix */ + Word16 q_new /* i : target q factor for rotation matrix */ +) +{ + Word16 j, k; + + FOR( j = 0; j < 3; j++ ) + { + FOR( k = 0; k < 3; k++ ) + { + Rmat_out[j][k] = L_shl( Rmat_in[j][k], sub( q_new, q_cur ) ); + move32(); + } + } + return; +} + + +/*------------------------------------------------------------------------- + * Quat2EulerDegree() + * + * Quaternion handling: calculate corresponding Euler angles in degrees + *------------------------------------------------------------------------*/ + +void Quat2EulerDegree_fx( + const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ + Word32 *yaw_fx, /* o : yaw */ + Word32 *pitch_fx, /* o : pitch */ + Word32 *roll_fx /* o : roll */ +) +{ + IF( NE_32( quat.w_fx, L_negate( 12582912 ) /*3.0f in Q22*/ ) ) + { + Word32 tmp1 = W_extract_l( W_shr( W_mult0_32_32( quat.w_fx, quat.x_fx ), Q22 ) ); // Q22 + Word32 tmp2 = W_extract_l( W_shr( W_mult0_32_32( quat.y_fx, quat.z_fx ), Q22 ) ); // Q22 + Word32 tmp3 = L_shl( L_add( tmp1, tmp2 ), 1 ); // Q22 + + Word32 tmp4 = W_extract_l( W_shr( W_mult0_32_32( quat.x_fx, quat.x_fx ), Q22 ) ); // Q22 + Word32 tmp5 = W_extract_l( W_shr( W_mult0_32_32( quat.y_fx, quat.y_fx ), Q22 ) ); // Q22 + Word32 tmp6 = L_shl( L_add( tmp4, tmp5 ), 1 ); + Word32 tmp7 = L_sub( ONE_IN_Q22, tmp6 ); + + IF( tmp3 >= -2 && tmp3 <= 2 ) + { + tmp3 = 0; + } + IF( tmp7 >= -2 && tmp7 <= 2 ) + { + tmp7 = 0; + } + + Word16 yaw_fx_16 = BASOP_util_atan2( tmp3, tmp7, 0 ); // Q13 + *yaw_fx = Mpy_32_16_1( 961263669 /*_180_OVER_PI in Q24*/, yaw_fx_16 ); + + Word32 p_fx; + Word32 tmp8 = W_extract_l( W_shr( W_mult0_32_32( quat.w_fx, quat.y_fx ), Q22 ) ); // Q22 + Word32 tmp9 = W_extract_l( W_shr( W_mult0_32_32( quat.z_fx, quat.x_fx ), Q22 ) ); // Q22 + p_fx = L_shl( L_sub( tmp8, tmp9 ), 1 ); + p_fx = max( L_negate( ONE_IN_Q22 ), min( ONE_IN_Q22, p_fx ) ); // Q22 + + Word32 p_fx_sq = W_extract_l( W_shr( W_mult0_32_32( p_fx, p_fx ), Q22 ) ); + Word16 res_exp = 0; + Word32 one_minus_p_fx_sq = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, L_negate( p_fx_sq ), 31 - Q22, &res_exp ); + Word32 sqrt_one_minus_p_fx_sq = Sqrt32( one_minus_p_fx_sq, &res_exp ); + + Word16 pitch_fx_16 = BASOP_util_atan2( p_fx, sqrt_one_minus_p_fx_sq, ( 31 - Q22 ) - res_exp ); + + *pitch_fx = Mpy_32_16_1( 961263669 /*_180_OVER_PI in Q24*/, pitch_fx_16 ); + + Word32 tmp10 = W_extract_l( W_shr( W_mult0_32_32( quat.w_fx, quat.z_fx ), Q22 ) ); // Q22 + Word32 tmp11 = W_extract_l( W_shr( W_mult0_32_32( quat.x_fx, quat.y_fx ), Q22 ) ); // Q22 + Word32 tmp12 = L_shl( L_add( tmp10, tmp11 ), 1 ); // Q22 + + Word32 tmp13 = W_extract_l( W_shr( W_mult0_32_32( quat.y_fx, quat.y_fx ), Q22 ) ); // Q22 + Word32 tmp14 = W_extract_l( W_shr( W_mult0_32_32( quat.z_fx, quat.z_fx ), Q22 ) ); // Q22 + Word32 tmp15 = L_shl( L_add( tmp13, tmp14 ), 1 ); // Q22 + Word32 tmp16 = L_sub( ONE_IN_Q22, tmp15 ); // Q22 + + IF( tmp12 >= -2 && tmp12 <= 2 ) + { + tmp12 = 0; + } + IF( tmp16 >= -2 && tmp16 <= 2 ) + { + tmp16 = 0; + } + Word16 roll_fx_16 = BASOP_util_atan2( tmp12, tmp16, 0 ); // Q13 + *roll_fx = Mpy_32_16_1( 961263669 /*_180_OVER_PI in Q24*/, roll_fx_16 ); + } + ELSE + { + /* Euler angles in R_X(roll)*R_Y(pitch)*R_Z(yaw) convention + * + * yaw: rotate scene counter-clockwise in the horizontal plane + * pitch: rotate scene in the median plane, increase elevation with positive values + * roll: rotate scene from the right ear to the top + */ + *yaw_fx = quat.z_fx; + *pitch_fx = quat.y_fx; + *roll_fx = quat.x_fx; + } + + return; +} + + +/*------------------------------------------------------------------------- + * deg2rad() + * + * Converts degrees to normalized radians + *------------------------------------------------------------------------*/ + +Word32 deg2rad_fx( + Word32 degrees // Q22 +) +{ + WHILE( GE_32( degrees, DEGREE_180 ) ) + { + degrees = L_sub( degrees, DEGREE_360 ); + } + WHILE( LE_32( degrees, -DEGREE_180 ) ) + { + degrees = L_add( degrees, DEGREE_360 ); + } + + return Mpy_32_32( PI_OVER_180_FX, degrees ); // Q22 +} diff --git a/lib_com/ivas_sba_config_fx.c b/lib_com/ivas_sba_config_fx.c index b3a0806d4af63519605efa1c7ff5da40ba095d2e..4caa22da2a0b258d80f3dcc3068db56af2c80911 100644 --- a/lib_com/ivas_sba_config_fx.c +++ b/lib_com/ivas_sba_config_fx.c @@ -60,20 +60,7 @@ void ivas_sba_config_fx( Word16 *element_mode /* o : element mode of the core coder */ ) { - test(); - IF( sba_order < 0 && nb_channels < 0 ) - { - assert( 0 && "Either order or number of channels must be positive" ); - } - ELSE IF( sba_order < 0 ) - { - sba_order = ivas_sba_get_order_fx( nb_channels, sba_planar ); - } - ELSE IF( nb_channels < 0 ) - { - nb_channels = ivas_sba_get_nchan_fx( sba_order, sba_planar ); - } - ELSE + IF( nb_channels > 0 ) { IF( sba_planar ) { @@ -125,57 +112,6 @@ void ivas_sba_config_fx( } -/*-------------------------------------------------------------------* - * ivas_sba_get_order() - * - * Get Ambisonic order from number of ambisonic channels - *-------------------------------------------------------------------*/ - -/*! r: Ambisonic (SBA) order */ -Word16 ivas_sba_get_order_fx( - const Word16 nb_channels, /* i : Number of ambisonic channels */ - const Word16 sba_planar /* i : SBA Planar flag */ -) -{ - Word16 sba_order; - - /* sba_order = (int16_t) sqrtf( (float) nb_channels ) - 1 */ - Word16 sba_order_non_sba_planar[MAX_INPUT_CHANNELS] = { 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3 }; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - - IF( sba_planar ) - { - sba_order = shr( sub( nb_channels, 1 ), 1 ); - assert( ( EQ_16( add( shl( sba_order, 1 ), 1 ), nb_channels ) ) && "Number of channels not supported in Planar SBA!" ); - } - ELSE - { - sba_order = sba_order_non_sba_planar[nb_channels - 1]; - move16(); - assert( ( EQ_16( mult( add( sba_order, 1 ), add( sba_order, 1 ) ), nb_channels ) ) && "Number of channels not supported in SBA!" ); - } - - assert( ( sba_order <= 3 ) && "Error: SBA order must be <= 3!" ); - - return ( sba_order ); -} - - /*-------------------------------------------------------------------* * ivas_sba_get_analysis_order() * @@ -231,6 +167,29 @@ Word16 ivas_sba_get_nchan_fx( } +/*-------------------------------------------------------------------* + * ivas_sba_spar_sid_bitlen_fx() + * + * Get number of bits in SBA SID frame + *-------------------------------------------------------------------*/ + +/*! r: number of bits in SBA SID frame */ +Word16 ivas_sba_spar_sid_bitlen_fx( + const Word16 nchan_transport /* i : number of transport channels */ +) +{ + Word16 num_bits; + + num_bits = i_mult( SPAR_DTX_BANDS, SPAR_SID_BITS_TAR_PER_BAND ); + IF( GT_16( nchan_transport, 1 ) ) + { + num_bits = sub( num_bits, 2 ); + } + + return num_bits; +} + + /*-------------------------------------------------------------------* * ivas_sba_get_nchan_metadata() * diff --git a/lib_com/ivas_sns_com_fx.c b/lib_com/ivas_sns_com_fx.c index fa64b0092d6de30d78c2199930ea32e99629cb3a..48be0cfd083000e5f134b7d50633a61a12d5ab67 100644 --- a/lib_com/ivas_sns_com_fx.c +++ b/lib_com/ivas_sns_com_fx.c @@ -200,9 +200,16 @@ void sns_compute_scf_fx( /* mean = sum / FDNS_NPTS; -Q6 is for division with FDNS_NPTS and -Q1 is to reduce Q by one */ - mean = W_shl_sat_l( sum, -Q7 ); // q_out - nf = Mpy_32_32( mean, 214748 /* powf( 10.0f, -4.0f ) in Q31 */ ); // q_out - nf = L_max( nf, L_shl( 256, sub( q_out, 40 ) ) /* powf( 2.0f, -32.0f ) in Q40 */ ); // q_out + mean = W_shl_sat_l( sum, -Q7 ); // q_out + nf = Mpy_32_32( mean, 214748 /* powf( 10.0f, -4.0f ) in Q31 */ ); // q_out + + IF( LE_32( nf, L_shl_sat( 256, sub( q_out, 40 ) ) ) ) /* powf( 2.0f, -32.0f ) in Q40 */ + { + nf = 256; + move32(); + q_out = 40; + move16(); + } FOR( i = 0; i < FDNS_NPTS; i++ ) { @@ -369,12 +376,6 @@ void sns_shape_spectrum_fx( { L64_tmp[k] = W_mult_32_32( spectrum[k], scf_int[i] ); // Q = q_spectrum + q_scf_int + 1 move64(); - shift = W_norm( L64_tmp[k] ); - if ( LT_16( shift, min_shift ) ) - { - min_shift = shift; - move16(); - } } } tmp_k = k; @@ -384,18 +385,18 @@ void sns_shape_spectrum_fx( *length = k; move16(); } + min_shift = W_norm_arr( L64_tmp, k ); q_tmp = sub( add( add( *q_spectrum, q_scf_int ), min_shift ), 32 ); if ( GT_16( q_tmp, 30 ) ) { q_tmp = 30; move16(); } + shift = sub( q_tmp, add( *q_spectrum, q_scf_int ) ); FOR( k = 0; k < tmp_k; k++ ) { - L64_tmp[k] = W_shr( L64_tmp[k], sub( add( *q_spectrum, q_scf_int ), q_tmp ) ); // Q = q_tmp+1 - move64(); - spectrum[k] = W_sat_l( L64_tmp[k] ); // Q = q_tmp+1 - move64(); + spectrum[k] = W_shl_sat_l( L64_tmp[k], shift ); // q_tmp+1 + move32(); } *q_spectrum = q_tmp; move16(); @@ -411,13 +412,6 @@ void sns_shape_spectrum_fx( { L64_tmp[k] = W_mult_32_32( spectrum[k], scf_int[i] ); // Q = q_spectrum + q_scf_int + 1 move64(); - shift = W_norm( L64_tmp[k] ); - test(); - if ( LT_16( shift, min_shift ) && NE_64( L64_tmp[k], 0 ) ) - { - min_shift = shift; - move16(); - } } } tmp_k = k; @@ -427,18 +421,18 @@ void sns_shape_spectrum_fx( *length = k; move16(); } + min_shift = W_norm_arr( L64_tmp, k ); q_tmp = sub( add( add( *q_spectrum, q_scf_int ), min_shift ), 32 ); if ( GT_16( q_tmp, 30 ) ) { q_tmp = 30; move16(); } + shift = sub( q_tmp, add( *q_spectrum, q_scf_int ) ); FOR( k = 0; k < tmp_k; k++ ) { - L64_tmp[k] = W_shr( L64_tmp[k], sub( add( *q_spectrum, q_scf_int ), q_tmp ) ); // q_tmp+1 - move64(); - spectrum[k] = W_sat_l( L64_tmp[k] ); // Q = q_tmp+1 - move64(); + spectrum[k] = W_shl_sat_l( L64_tmp[k], shift ); // q_tmp+1 + move32(); } *q_spectrum = q_tmp; move16(); diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index 929eaa2c5cd8b94aa689decdc59f27ce2110b67b..afb639ef00c92528308d8e5ceabf7085007fd8c4 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -44,31 +44,22 @@ #include "basop_util.h" #include "basop32.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*------------------------------------------------------------------------------------------* * Local constants *------------------------------------------------------------------------------------------*/ -#define IVAS_FLT_EPS ( 1e-10F ) -#define IVAS_FIX_EPS ( 1 ) -#define IVAS_DBL_EPS ( (double) 1e-20 ) +#define IVAS_FIX_EPS ( 1 ) +#define IVAS_FIX_EPS_Q40 ( 110 ) -#define IVAS_REMIX_MULT_FAC ( 0.5f ) -#define IVAS_ACTIVEW_DM_F ( 1.0f ) #define IVAS_ACTIVEW_DM_F_Q30 ( ONE_IN_Q30 ) /*1 Q30*/ -#define IVAS_ACTIVEW_DM_F_DTX ( 0.25f ) -#define IVAS_ACTIVEW_DM_F_DTX_Q30 ( 268435456 ) /*0.25 Q30*/ -#define IVAS_ACTIVEW_DM_F_VLBR ( 0.25f ) -#define IVAS_ACTIVEW_DM_F_VLBR_Q30 ( 268435456 ) /*0.25 Q30*/ -#define IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH ( 3.0f ) +#define IVAS_ACTIVEW_DM_F_DTX_Q30 ( 268435456 ) /*0.25 Q30*/ +#define IVAS_ACTIVEW_DM_F_VLBR_Q30 ( 268435456 ) /*0.25 Q30*/ #define IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH_Q29 ( 1610612736 ) /*3 Q29*/ -#define IVAS_P_NORM_SCALING ( 1.0f ) #define IVAS_P_NORM_SCALING_FX ( ONE_IN_Q31 ) // 1 Q31 -#define IVAS_P_NORM_SCALING_DTX ( 0.75f ) #define IVAS_P_NORM_SCALING_DTX_FX ( 1610612736 ) // 0.75 Q31 #define IVAS_MAT_DIM_3 ( 3 ) @@ -810,7 +801,7 @@ static void ivas_get_pred_coeffs_enc_fx( tmp64 = W_mult0_32_32( w_norm_fac, dm_w ); // Q=q_tmp IF( LT_16( q_tmp, q_cov_real[0][0][b] ) ) { - tmp64 = W_shr( tmp64, sub( q_cov_real[0][0][b], q_tmp ) ); // Q=q_tmp + tmp64 = W_shr( tmp64, s_min( 63, sub( q_cov_real[0][0][b], q_tmp ) ) ); // Q=q_tmp } ELSE { @@ -993,7 +984,7 @@ static void ivas_get_pred_coeffs_enc_fx( move32(); dm_g_q[b] = Q29; move16(); - DM_F[b] = BASOP_Util_Divide3232_Scale_cadence( Mpy_32_32( dm_g[b], num_f ), den_f, &s_dm_f ); // Q=(31-(s_dm_f+2+num_f_e-den_f_e)) + DM_F[b] = BASOP_Util_Divide3232_Scale_newton( Mpy_32_32( dm_g[b], num_f ), den_f, &s_dm_f ); // Q=(31-(s_dm_f+2+num_f_e-den_f_e)) move32(); DM_F_q[b] = sub( 31, add( s_dm_f, sub( add( 2, num_f_e ), den_f_e ) ) ); move16(); @@ -1522,7 +1513,7 @@ static void ivas_get_pred_coeffs_fx( den_f = L_max( den_f, 1 ); // Q=31-den_f_e dm_g[b] = activew_quad_thresh; // Q29 move32(); - DM_F[b] = BASOP_Util_Divide3232_Scale_cadence( Mpy_32_32( dm_g[b], num_f ), den_f, &s_dm_f ); // s_dm_f+2+num_f_e-den_f_e + DM_F[b] = BASOP_Util_Divide3232_Scale_newton( Mpy_32_32( dm_g[b], num_f ), den_f, &s_dm_f ); // s_dm_f+2+num_f_e-den_f_e move32(); s_dm_f = add( s_dm_f, sub( add( 2, num_f_e ), den_f_e ) ); /*Resultant exp for DM_F s_dm_f +( 2 + num_f_e ) - den_f_e*/ div_shift = sub( s_dm_f, 1 ); @@ -1626,8 +1617,18 @@ static void ivas_get_Wscaling_factor_enc_fx( ivas_calc_post_pred_per_band_enc_fx( cov_real, q_cov_real, mixer_mat, q_mixer_mat, num_ch, b, postpred_cov_re, &q_postpred_cov_re ); } - Gw_sq = BASOP_Util_Divide3232_Scale( cov_real[0][0][b], L_max( postpred_cov_re[0][0], IVAS_FIX_EPS ), &tmp_exp ); // 15-(tmp_exp-(q_cov_real[0][0][b]- q_postpred_cov_re)) - q_Gw_sq = add( sub( 15, tmp_exp ), sub( q_cov_real[0][0][b], q_postpred_cov_re ) ); + tmp = L_shl_sat( IVAS_FIX_EPS_Q40, sub( q_postpred_cov_re, 40 ) ); + + IF( LE_32( postpred_cov_re[0][0], tmp ) ) + { + Gw_sq = Mpy_32_32( cov_real[0][0][b], 1250000000 ); /*1/1e-10 = 1250000000 Q(-4)*/ + q_Gw_sq = add( q_cov_real[0][0][b], -4 - 31 ); + } + ELSE + { + Gw_sq = BASOP_Util_Divide3232_Scale( cov_real[0][0][b], postpred_cov_re[0][0], &tmp_exp ); // 15-(tmp_exp-(q_cov_real[0][0][b]- q_postpred_cov_re)) + q_Gw_sq = add( sub( 15, tmp_exp ), sub( q_cov_real[0][0][b], q_postpred_cov_re ) ); + } shift = MAX16B; move16(); @@ -1992,157 +1993,88 @@ static void ivas_calc_post_pred_per_band_enc_fx( Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_postpred_cov_re*/ Word16 *q_postpred_cov_re ) { - Word16 i, j, k, guard_bits, tmp, q_temp_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], q_tmp_re, q_W_tmp; - Word32 dmx_mat_conj[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + Word16 i, j, k; + Word16 max_val; + Word16 temp; + Word32 temp_add; + Word16 e_postpred_cov_re_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; Word32 temp_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - Word32 max_val; - Word64 tmp_re, W_tmp; - Word16 q_postpred_cov_re_per_value[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + Word16 temp_mat_e[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + Word32 tmp_re; + Word16 tmp_q; + Word16 tmp_e; - FOR( i = 0; i < num_ch; i++ ) - { - FOR( j = 0; j < num_ch; j++ ) - { - dmx_mat_conj[i][j] = mixer_mat[j][i][band_idx]; /*q_mixer_mat*/ - move32(); - } - } - FOR( i = 0; i < num_ch; i++ ) - { - set32_fx( temp_mat[i], 0, num_ch ); - set32_fx( postpred_cov_re[i], 0, num_ch ); - } + max_val = MIN16B; + move16(); + temp = sub( 62, q_mixer_mat ); - max_val = 1; - move32(); /* num_ch x num_ch mult */ FOR( i = 0; i < num_ch; i++ ) { FOR( j = 0; j < num_ch; j++ ) { - tmp_re = 0; - move64(); - q_tmp_re = 31; + temp_add = 0; + move32(); + temp_mat_e[i][j] = 0; move16(); + FOR( k = 0; k < num_ch; k++ ) { - W_tmp = W_shr( W_mult0_32_32( cov_real[i][k][band_idx], dmx_mat_conj[k][j] ), q_mixer_mat ); /*q_cov_real[i][k][band_idx]*/ - IF( LT_16( q_cov_real[i][k][band_idx], q_tmp_re ) ) + tmp_re = Mpy_32_32( cov_real[i][k][band_idx], mixer_mat[j][k][band_idx] ); + tmp_e = sub( temp, q_cov_real[i][k][band_idx] ); + IF( tmp_re ) { - tmp_re = W_add( W_shr( tmp_re, sub( q_tmp_re, q_cov_real[i][k][band_idx] ) ), W_tmp ); /*q_cov_real[i][k][band_idx]*/ - q_tmp_re = q_cov_real[i][k][band_idx]; - move16(); + temp_add = BASOP_Util_Add_Mant32Exp( temp_add, temp_mat_e[i][j], tmp_re, tmp_e, &temp_mat_e[i][j] ); } - ELSE - { - tmp_re = W_add( tmp_re, W_shr( W_tmp, sub( q_cov_real[i][k][band_idx], q_tmp_re ) ) ); /*q_tmp_re*/ - } - } - IF( tmp_re == 0 ) - { - q_temp_mat[i][j] = 31; - move16(); - temp_mat[i][j] = 0; - move32(); - } - ELSE - { - q_temp_mat[i][j] = q_tmp_re; - move16(); - q_tmp_re = W_norm( tmp_re ); - temp_mat[i][j] = W_extract_h( W_shl( tmp_re, q_tmp_re ) ); /*q_temp_mat[i][j]+ q_tmp_re -32*/ - move32(); - q_temp_mat[i][j] = sub( add( q_temp_mat[i][j], q_tmp_re ), 32 ); - move16(); } - max_val = L_max( max_val, L_abs( temp_mat[i][j] ) ); + temp_mat[i][j] = temp_add; + move32(); } } - guard_bits = find_guarded_bits_fx( num_ch ); - - tmp = norm_l( max_val ); - IF( LT_16( tmp, guard_bits ) ) - { - guard_bits = sub( guard_bits, tmp ); - } - ELSE - { - guard_bits = 0; - move16(); - } - - *q_postpred_cov_re = 31; - move16(); + tmp_e = sub( Q31, q_mixer_mat ); /* num_ch x num_ch mult */ FOR( i = 0; i < num_ch; i++ ) { FOR( j = i; j < num_ch; j++ ) { - tmp_re = 0; - move64(); - q_tmp_re = 31; + temp_add = 0; + move32(); + e_postpred_cov_re_buf[i][j] = sub( 31, *q_postpred_cov_re ); move16(); FOR( k = 0; k < num_ch; k++ ) { - W_tmp = W_shr( W_mult0_32_32( mixer_mat[i][k][band_idx], temp_mat[k][j] ), guard_bits ); // q_temp_mat[k][j]+ q_mixer_mat-guard_bits - q_W_tmp = sub( add( q_temp_mat[k][j], q_mixer_mat ), guard_bits ); - IF( LT_16( q_W_tmp, q_tmp_re ) ) - { - tmp_re = W_add( W_shr( tmp_re, sub( q_tmp_re, q_W_tmp ) ), W_tmp ); // q_W_tmp - q_tmp_re = q_W_tmp; - move16(); - } - ELSE + tmp_re = Mpy_32_32( mixer_mat[i][k][band_idx], temp_mat[k][j] ); + tmp_q = add( tmp_e, temp_mat_e[k][j] ); + IF( tmp_re ) { - tmp_re = W_add( tmp_re, W_shr( W_tmp, sub( q_W_tmp, q_tmp_re ) ) ); // q_tmp_re + temp_add = BASOP_Util_Add_Mant32Exp( temp_add, e_postpred_cov_re_buf[i][j], tmp_re, tmp_q, &e_postpred_cov_re_buf[i][j] ); } } - - if ( LT_64( W_abs( tmp_re ), L_shl( IVAS_FIX_EPS, guard_bits ) ) ) + if ( temp_add ) { - tmp_re = 0; - move64(); + max_val = s_max( max_val, e_postpred_cov_re_buf[i][j] ); } - - q_postpred_cov_re_per_value[i][j] = q_tmp_re; - move16(); - IF( tmp_re == 0 ) - { - postpred_cov_re[i][j] = W_extract_l( tmp_re ); /* q_tmp_re*/ - move32(); - } - ELSE - { - q_tmp_re = W_norm( tmp_re ); - postpred_cov_re[i][j] = W_extract_h( W_shl( tmp_re, q_tmp_re ) ); /* q_tmp_re+ q_postpred_cov_re_per_value[i][j] -32*/ - move32(); - q_postpred_cov_re_per_value[i][j] = sub( add( q_tmp_re, q_postpred_cov_re_per_value[i][j] ), 32 ); - move16(); - } - *q_postpred_cov_re = s_min( *q_postpred_cov_re, q_postpred_cov_re_per_value[i][j] ); - move16(); + postpred_cov_re[i][j] = temp_add; + move32(); } } + /*Changing Q of postpred_cov_re to min_val*/ FOR( i = 0; i < num_ch; i++ ) { FOR( j = i; j < num_ch; j++ ) { - IF( postpred_cov_re[i][j] >= 0 ) + IF( postpred_cov_re[i][j] ) { - postpred_cov_re[i][j] = L_shr( postpred_cov_re[i][j], sub( q_postpred_cov_re_per_value[i][j], *q_postpred_cov_re ) ); //*q_postpred_cov_re - move32(); - } - ELSE - { - postpred_cov_re[i][j] = L_negate( L_shr( L_negate( postpred_cov_re[i][j] ), sub( q_postpred_cov_re_per_value[i][j], *q_postpred_cov_re ) ) ); //*q_postpred_cov_re + postpred_cov_re[i][j] = L_shr( postpred_cov_re[i][j], sub( max_val, e_postpred_cov_re_buf[i][j] ) ); move32(); } } } + FOR( i = 0; i < num_ch; i++ ) { FOR( j = 0; j < i; j++ ) @@ -2151,6 +2083,13 @@ static void ivas_calc_post_pred_per_band_enc_fx( move32(); } } + if ( EQ_16( max_val, MIN16B ) ) + { + max_val = 0; + move16(); + } + *q_postpred_cov_re = sub( Q31, max_val ); + move16(); return; } @@ -2340,18 +2279,18 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( Word32 re1, re2; W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], cov_dd_re[0][0] ); /*q_cov_dd_re+ pSparMd->band_coeffs[b_ts_idx].q_C_re_fx*/ - q_tmp1 = W_norm( W_tmp ); - re1 = W_extract_h( W_shl( W_tmp, q_tmp1 ) ); /*q_cov_dd_re+ q_C_re+q_tmp1-32*/ - q_tmp1 = sub( add( add( q_C_re, q_tmp1 ), q_cov_dd_re ), 32 ); + q_tmp1 = sub( W_norm( W_tmp ), 32 ); + re1 = W_shl_sat_l( W_tmp, q_tmp1 ); /*q_cov_dd_re+ q_C_re+q_tmp1*/ + q_tmp1 = add( add( q_C_re, q_tmp1 ), q_cov_dd_re ); if ( W_tmp == 0 ) { q_tmp1 = 31; move16(); } W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], cov_dd_re[0][0] ); /*q_cov_dd_re+ q_C_re*/ - q_tmp = W_norm( W_tmp ); - re2 = W_extract_h( W_shl( W_tmp, q_tmp ) ); /*q_cov_dd_re+ q_C_re+q_tmp-32*/ - q_tmp = sub( add( add( q_C_re, q_tmp ), q_cov_dd_re ), 32 ); + q_tmp = sub( W_norm( W_tmp ), 32 ); + re2 = W_shl_sat_l( W_tmp, q_tmp ); /*q_cov_dd_re+ q_C_re+q_tmp*/ + q_tmp = add( add( q_C_re, q_tmp ), q_cov_dd_re ); if ( W_tmp == 0 ) { q_tmp = 31; @@ -2359,11 +2298,10 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( } W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1 ); // q_tmp1+q_C_re - q_recon_uu_re[0][0] = W_norm( W_tmp ); - move16(); - recon_uu_re[0][0] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[0][0] ) ); // q_tmp1+q_C_re+q_recon_uu_re[0][0]-32 + q_factor = sub( W_norm( W_tmp ), 32 ); + recon_uu_re[0][0] = W_shl_sat_l( W_tmp, q_factor ); // q_tmp1+q_C_re+q_recon_uu_re[0][0] move32(); - q_recon_uu_re[0][0] = sub( add( add( q_C_re, q_recon_uu_re[0][0] ), q_tmp1 ), 32 ); + q_recon_uu_re[0][0] = add( add( q_C_re, q_factor ), q_tmp1 ); move16(); if ( W_tmp == 0 ) { @@ -2372,11 +2310,10 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( } W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re1 ); // q_C_re+q_tmp1 - q_recon_uu_re[0][1] = W_norm( W_tmp ); - move16(); - recon_uu_re[0][1] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[0][1] ) ); // q_C_re+q_tmp1+q_recon_uu_re[0][1]-32 + q_factor = sub( W_norm( W_tmp ), 32 ); + recon_uu_re[0][1] = W_shl_sat_l( W_tmp, q_factor ); // q_C_re+q_tmp1+q_recon_uu_re[0][1] move32(); - q_recon_uu_re[0][1] = sub( add( add( q_C_re, q_recon_uu_re[0][1] ), q_tmp1 ), 32 ); + q_recon_uu_re[0][1] = add( add( q_C_re, q_factor ), q_tmp1 ); move16(); if ( W_tmp == 0 ) { @@ -2385,11 +2322,10 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( } W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re2 ); // q_C_re+q_tmp - q_recon_uu_re[1][0] = W_norm( W_tmp ); - move16(); - recon_uu_re[1][0] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[1][0] ) ); // q_C_re+q_tmp+q_recon_uu_re[1][0]-32 + q_factor = sub( W_norm( W_tmp ), 32 ); + recon_uu_re[1][0] = W_shl_sat_l( W_tmp, q_factor ); // q_C_re+q_tmp+q_recon_uu_re[1][0] move32(); - q_recon_uu_re[1][0] = sub( add( add( q_C_re, q_recon_uu_re[1][0] ), q_tmp ), 32 ); + q_recon_uu_re[1][0] = add( add( q_C_re, q_factor ), q_tmp ); move16(); if ( W_tmp == 0 ) { @@ -2398,11 +2334,10 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( } W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re2 ); // q_C_re+q_tmp - q_recon_uu_re[1][1] = W_norm( W_tmp ); - move16(); - recon_uu_re[1][1] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[1][1] ) ); // q_C_re+q_tmp+q_recon_uu_re[1][1]-32 + q_factor = sub( W_norm( W_tmp ), 32 ); + recon_uu_re[1][1] = W_shl_sat_l( W_tmp, q_factor ); // q_C_re+q_tmp+q_recon_uu_re[1][1] move32(); - q_recon_uu_re[1][1] = sub( add( add( q_C_re, q_recon_uu_re[1][1] ), q_tmp ), 32 ); + q_recon_uu_re[1][1] = add( add( q_C_re, q_factor ), q_tmp ); move16(); if ( W_tmp == 0 ) { @@ -2420,12 +2355,12 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( } } q_tmp = sub( s_min( q_tmp, q_cov_uu_re ), 1 ); - + q_factor = sub( q_cov_uu_re, q_tmp ); FOR( i = 0; i < 2; i++ ) { FOR( j = 0; j < 2; j++ ) { - cov_uu_re[i][j] = L_sub( L_shr( cov_uu_re[i][j], sub( q_cov_uu_re, q_tmp ) ), L_shr( recon_uu_re[i][j], sub( q_recon_uu_re[i][j], q_tmp ) ) ); // q_tmp + cov_uu_re[i][j] = L_sub( L_shr( cov_uu_re[i][j], q_factor ), L_shr( recon_uu_re[i][j], sub( q_recon_uu_re[i][j], q_tmp ) ) ); // q_tmp move32(); } } @@ -2434,77 +2369,34 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( } ELSE IF( EQ_16( num_dmx, 3 ) ) { - Word32 re1[2], re2; - Word16 q_re1[2]; - set32_fx( re1, 0, 2 ); - set16_fx( q_re1, 31, 2 ); - + Word64 re64[2]; + Word32 re32[2], re32_2; + Word16 qtmp2; + set64_fx( re64, 0, 2 ); + q_tmp = 63; FOR( j = 0; j < 2; j++ ) { FOR( k = 0; k < 2; k++ ) { - Word32 re; W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][k], cov_dd_re[k][j] ); // q_C_re+q_cov_dd_re - q_tmp = sub( W_norm( W_tmp ), 1 ); - re = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_cov_dd_re+q_tmp-32 - q_tmp = sub( add( add( q_C_re, q_tmp ), q_cov_dd_re ), 32 ); - if ( W_tmp == 0 ) - { - q_tmp = 31; - move16(); - } - - IF( LT_16( q_tmp, q_re1[j] ) ) - { - re1[j] = L_shr( re1[j], sub( q_re1[j], q_tmp ) ); // q_tmp - move32(); - q_re1[j] = q_tmp; - move16(); - } - ELSE - { - re = L_shr( re, sub( q_tmp, q_re1[j] ) ); // q_re1[j] - } - re1[j] = L_add( re1[j], re ); // q_re1[j] - move32(); + re64[j] = W_add( re64[j], W_tmp ); + move64(); } + q_tmp = s_min( q_tmp, sub( W_norm( re64[j] ), 33 ) ); } - - W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1[0] ); // q_C_re+q_re1[0] - q_tmp = sub( W_norm( W_tmp ), 1 ); - re2 = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_re1[0]+q_tmp-32 - q_tmp = sub( add( add( q_C_re, q_tmp ), q_re1[0] ), 32 ); - if ( W_tmp == 0 ) - { - q_tmp = 31; - move16(); - } - recon_uu_re[0][0] = re2; // q_C_re+q_re1[0]+q_tmp-32 - move32(); - - W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][1], re1[1] ); // q_C_re+q_re1[1] - q_tmp1 = sub( W_norm( W_tmp ), 1 ); - re2 = W_extract_h( W_shl( W_tmp, q_tmp1 ) ); // q_C_re+q_re1[1]+q_tmp1-32 - q_tmp1 = sub( add( add( q_C_re, q_tmp1 ), q_re1[1] ), 32 ); - if ( W_tmp == 0 ) - { - q_tmp1 = 31; - move16(); - } - - IF( LT_16( q_tmp, q_tmp1 ) ) - { - re2 = L_shr( re2, sub( q_tmp1, q_tmp ) ); // q_tmp - } - ELSE + FOR( j = 0; j < 2; j++ ) { - recon_uu_re[0][0] = L_shr( recon_uu_re[0][0], sub( q_tmp, q_tmp1 ) ); // q_tmp1 + re32[j] = W_shl_sat_l( re64[j], q_tmp ); // q_C_re+q_cov_dd_re+q_tmp move32(); - q_tmp = q_tmp1; - move16(); } - - recon_uu_re[0][0] = L_add( recon_uu_re[0][0], re2 ); // q_tmp + qtmp2 = add( add( q_C_re, q_tmp ), q_cov_dd_re ); + W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re32[0] ); // q_C_re+qtmp2 + W_tmp = W_add( W_tmp, W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][1], re32[1] ) ); // q_C_re+qtmp2 + q_tmp = sub( W_norm( W_tmp ), 33 ); + re32_2 = W_shl_sat_l( W_tmp, q_tmp ); // q_C_re+qtmp2+q_tmp + qtmp2 = add( add( q_C_re, q_tmp ), qtmp2 ); + q_tmp = s_min( 63, qtmp2 ); + recon_uu_re[0][0] = L_max( 0, re32_2 ); move32(); IF( LT_16( q_cov_uu_re, q_tmp ) ) @@ -2564,9 +2456,9 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( FOR( k = 0; k < num_dmx - 1; k++ ) { W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[i][k], cov_dd_re[k][m] ); // q_C_re+q_cov_dd_re - q_tmp = sub( W_norm( W_tmp ), 2 ); - re = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_cov_dd_re+q_tmp-32 - q_tmp = sub( add( add( q_C_re, q_tmp ), q_cov_dd_re ), 32 ); + q_tmp = sub( W_norm( W_tmp ), 34 ); + re = W_shl_sat_l( W_tmp, q_tmp ); // q_C_re+q_cov_dd_re+q_tmp + q_tmp = add( add( q_C_re, q_tmp ), q_cov_dd_re ); if ( W_tmp == 0 ) { q_tmp = 31; @@ -2606,9 +2498,9 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( FOR( m = 0; m < num_dmx - 1; m++ ) { W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[j][m], re1[m] ); // q_C_re+q_re1[m] - q_tmp = sub( W_norm( W_tmp ), 2 ); - re = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_re1[m]+q_tmp-32 - q_tmp = sub( add( add( q_C_re, q_tmp ), q_re1[m] ), 32 ); + q_tmp = sub( W_norm( W_tmp ), 34 ); + re = W_shl_sat_l( W_tmp, q_tmp ); // q_C_re+q_re1[m]+q_tmp + q_tmp = add( add( q_C_re, q_tmp ), q_re1[m] ); if ( W_tmp == 0 ) { q_tmp = 31; @@ -2631,11 +2523,7 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( test(); IF( W_norm( re ) == 0 || W_norm( recon_uu_re[i][j] ) == 0 ) { -#ifdef FIX_ISSUE_1122 recon_uu_re[i][j] = L_shr( recon_uu_re[i][j], 1 ); // q_recon_uu_re[i][j] - 1 -#else - re1[m] = L_shr( re1[m], 1 ); // q_recon_uu_re[i][j]-1 -#endif move32(); q_recon_uu_re[i][j] = sub( q_recon_uu_re[i][j], 1 ); move16(); @@ -2691,14 +2579,15 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( trace = W_add( trace, W_deposit32_l( L_abs( cov_uu_re[i - num_dmx][i - num_dmx] ) ) ); // q_cov_uu_re } - factor = L_max( IVAS_FIX_EPS, postpred_cov_re[0][0] ); // q_postpred_cov_re + factor = postpred_cov_re[0][0]; // q_postpred_cov_re + move32(); q_factor = q_postpred_cov_re; move16(); IF( trace != 0 ) { - q_factor = W_norm( trace ); - tmp = Mpy_32_32( p_norm_scaling, W_extract_h( W_shl( trace, q_factor ) ) ); // q_cov_uu_re+q_factor-32 - q_factor = sub( add( q_cov_uu_re, q_factor ), 32 ); + q_factor = sub( W_norm( trace ), 32 ); + tmp = Mpy_32_32( p_norm_scaling, W_shl_sat_l( trace, q_factor ) ); // q_cov_uu_re+q_factor + q_factor = add( q_cov_uu_re, q_factor ); IF( GT_16( q_factor, q_postpred_cov_re ) ) { tmp = L_shr( tmp, sub( q_factor, q_postpred_cov_re ) ); // q_postpred_cov_re @@ -2712,10 +2601,22 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( factor = L_max( factor, tmp ); // q_factor } + tmp = L_shl_sat( 189 /* 1e-20 in Q74 */, sub( q_factor, 74 ) ); + Word16 factor_exp = 0; move16(); - factor = BASOP_Util_Divide3232_Scale( 1, factor, &factor_exp ); // q=15-(factor_exp+31-(31-q_factor)) - factor_exp = add( factor_exp, q_factor ); + IF( LE_32( factor, tmp ) ) + { + factor = 22204; // (1 / 1e-20) in Q(-52) + factor_exp = Q15 - ( -52 ); + move32(); + move16(); + } + ELSE + { + factor = BASOP_Util_Divide3232_Scale( 1, factor, &factor_exp ); // q=15-(factor_exp+31-(31-q_factor)) + factor_exp = add( factor_exp, q_factor ); + } /* normalise Hermitian (except for rounding) cov_uu */ FOR( i = num_dmx; i < num_ch; i++ ) @@ -2732,7 +2633,7 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( { q_tmp = W_norm( W_tmp ); } - cov_uu_re[i - num_dmx][j - num_dmx] = W_extract_h( W_shl( W_mult0_32_32( cov_uu_re[i - num_dmx][j - num_dmx], factor ), q_tmp ) ); /*q_cov_uu_re+15-factor_exp+q_tmp-32*/ + cov_uu_re[i - num_dmx][j - num_dmx] = W_extract_h( W_shl( W_tmp, q_tmp ) ); /*q_cov_uu_re+15-factor_exp+q_tmp-32*/ move32(); q_cov_uu_re_per_value[i - num_dmx][j - num_dmx] = sub( add( add( q_cov_uu_re, sub( 15, factor_exp ) ), q_tmp ), 32 ); move16(); @@ -3315,6 +3216,9 @@ void ivas_calc_c_p_coeffs_enc_fx( Word16 i, j, q_postpred_cov_re; Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + q_postpred_cov_re = 0; + move16(); + FOR( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) { set_zero_fx( postpred_cov_re[i], IVAS_SPAR_MAX_CH ); @@ -3834,11 +3738,7 @@ void ivas_compute_spar_params_fx( } ELSE { -#ifdef FIX_11_1_IVAS_SPAR_DEC_UPMIXER_SF_RND_COEFFS hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i] = L_shr_r( hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i], sub( tmp, 22 ) ); // q22 -#else - hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i] = L_shr( hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i], sub( tmp, 22 ) ); // q22 -#endif move32(); } } @@ -3865,7 +3765,6 @@ void ivas_compute_spar_params_fx( Word16 q_tmp = hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx; IF( NE_16( ndm, 1 ) ) { -#ifdef MSAN_FIX FOR( i = 0; i < ( num_ch - ndm ); i++ ) { FOR( j = 0; j < sub( ndm, 1 ); j++ ) @@ -3874,15 +3773,6 @@ void ivas_compute_spar_params_fx( move32(); } } -#else - for ( i = 0; i < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; i++ ) - { - for ( j = 0; j < IVAS_SPAR_MAX_DMX_CHS - 1; j++ ) - { - hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re_fx[i][j] = L_shr( hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re_fx[i][j], sub( q_tmp, 22 ) ); - } - } -#endif hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx = Q22; move16(); } @@ -3912,7 +3802,8 @@ void ivas_compute_spar_params_fx( Word32 diff_norm_order1_table[4] = { 0, 805306368, 402653184, 268435456 }; // q28 Word32 diff_norm_order2_table[6] = { 0, 1342177280, 671088640, 447392416, 335544320, 268435456 }; // q28 Word32 diff_norm_order3_table[8] = { 0, 1879048192, 939524096, 626349376, 469762048, 375809632, 313174688, 268435456 }; // q28 -#define EPSILON_FX_THR 70 +#define EPSILON_FX_SHIFT 6 +#define EPSILON_FX_THR ( 1 << EPSILON_FX_SHIFT ) #define ONE_BY_THREE_Q31 715827882 #define ONE_BY_FIVE_Q31 429496729 #define ONE_BY_SEVEN_Q31 306783378 @@ -4152,10 +4043,12 @@ void ivas_get_spar_md_from_dirac_enc_fx( { Word32 norm_fx; Word16 norm_q; - Word16 num_ch_order, hoa2_ch_order; + + Word16 num_ch_order, norm_t; + Word32 tmp_norm_out; num_ch_order = ivas_sba_get_nchan_fx( order, 0 ); - hoa2_ch_order = ivas_sba_get_nchan_fx( SBA_HOA2_ORDER, 0 ); + assert( order == 1 ); FOR( ch = 0; ch < num_ch_order; ch++ ) { @@ -4170,25 +4063,18 @@ void ivas_get_spar_md_from_dirac_enc_fx( } /*normalize 1st order*/ + norm_t = L_norm_arr( &response_avg_fx[1], sub( foa_ch, 1 ) ); + norm_t = sub( norm_t, 1 ); + scale_sig32( &response_avg_fx[1], sub( foa_ch, 1 ), norm_t ); norm_fx = 0; move32(); - norm_q = 0; - move16(); FOR( ch = 1; ch < foa_ch; ch++ ) { norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29 } norm_q = sub( 31, ( sub( add( 30, 30 ), 31 ) ) ); - IF( norm_fx ) - { - norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q - } - ELSE - { - norm_fx = EPSILON_FX; - move32(); - } + norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q IF( norm_q <= 0 ) { norm_fx = L_shr( norm_fx, ( negate( norm_q ) ) ); // q=31 @@ -4196,128 +4082,22 @@ void ivas_get_spar_md_from_dirac_enc_fx( move16(); } norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30 - FOR( ch = 1; ch < foa_ch; ch++ ) - { - IF( LT_32( norm_fx, EPSILON_FX_THR ) ) - { - IF( response_avg_fx[ch] != 0 ) - { - response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15 - move32(); - } - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 - move32(); - } - ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) ) - { - response_avg_fx[ch] = ONE_IN_Q30; // 1 q30 - move32(); - } - ELSE - { - response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15 - move32(); - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 - move32(); - } - } - /*normalize 2nd order*/ - norm_fx = 0; - move32(); - Word16 min_ch_order = s_min( hoa2_ch_order, num_ch_order ); - FOR( ch = foa_ch; ch < min_ch_order; ch++ ) - { - norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29 - } - norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) ); - IF( norm_fx ) + IF( LT_32( norm_fx, EPSILON_FX_THR ) ) { - norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q - } - ELSE - { - norm_fx = EPSILON_FX; - move32(); - } - IF( norm_q < 0 ) - { - norm_fx = L_shr( norm_fx, negate( norm_q ) ); // q31 - norm_q = 0; - move16(); - } - norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30 - min_ch_order = s_min( hoa2_ch_order, num_ch_order ); - FOR( ch = foa_ch; ch < min_ch_order; ch++ ) - { - IF( LT_32( norm_fx, EPSILON_FX_THR ) ) + FOR( ch = 1; ch < foa_ch; ch++ ) { - response_avg_fx[ch] = response_avg_fx[ch]; // q30 - response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15 - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 - move32(); - move32(); + /*when control comes here, response_avg_fx[ch] should be less than EPSILON*/ + response_avg_fx[ch] = L_shl( response_avg_fx[ch], Q30 - EPSILON_FX_SHIFT ); // q30 move32(); } - ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) ) - { - response_avg_fx[ch] = ONE_IN_Q30; // q30 - move32(); - } - ELSE - { - response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15 - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 - move32(); - move32(); - } - } - - /*normalize 3rd order*/ - norm_fx = 0; - move32(); - FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) - { - norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29 - } - norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) ); - IF( norm_fx ) - { - norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q } ELSE { - norm_fx = EPSILON_FX; - move32(); - } - IF( norm_q < 0 ) - { - norm_fx = L_shr( norm_fx, negate( norm_q ) ); // q31 - norm_q = 0; - move16(); - } - norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30 - FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) - { - IF( LT_32( norm_fx, EPSILON_FX_THR ) ) - { - response_avg_fx[ch] = response_avg_fx[ch]; // q30 - response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15 - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 - move32(); - move32(); - move32(); - } - ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) ) + FOR( ch = 1; ch < foa_ch; ch++ ) { - response_avg_fx[ch] = ONE_IN_Q30; // 1 q30 - move32(); - } - ELSE - { - response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15 - move32(); - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 + tmp_norm_out = divide3232( response_avg_fx[ch], L_max( norm_fx, L_abs( response_avg_fx[ch] ) ) ); // q15 + response_avg_fx[ch] = L_shl( tmp_norm_out, 15 ); // q30 move32(); } } @@ -4710,10 +4490,11 @@ void ivas_get_spar_md_from_dirac_fx( { Word32 norm_fx; Word16 norm_q; - Word16 num_ch_order, hoa2_ch_order; + Word16 num_ch_order, norm_t; + Word32 tmp_norm_out; num_ch_order = ivas_sba_get_nchan_fx( order, 0 ); - hoa2_ch_order = ivas_sba_get_nchan_fx( SBA_HOA2_ORDER, 0 ); + assert( order == 1 ); FOR( ch = 0; ch < num_ch_order; ch++ ) { @@ -4728,25 +4509,20 @@ void ivas_get_spar_md_from_dirac_fx( } /*normalize 1st order*/ + norm_t = L_norm_arr( &response_avg_fx[1], sub( foa_ch, 1 ) ); + norm_t = sub( norm_t, 1 ); + scale_sig32( &response_avg_fx[1], sub( foa_ch, 1 ), norm_t ); norm_fx = 0; move32(); - norm_q = 0; - move16(); FOR( ch = 1; ch < foa_ch; ch++ ) { norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29 } norm_q = sub( 31, ( sub( add( 30, 30 ), 31 ) ) ); - IF( norm_fx ) - { - norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q - } - ELSE - { - norm_fx = EPSILON_FX; - move32(); - } + + norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q + IF( norm_q <= 0 ) { norm_fx = L_shr( norm_fx, ( negate( norm_q ) ) ); // q=31 @@ -4754,128 +4530,22 @@ void ivas_get_spar_md_from_dirac_fx( move16(); } norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30 - FOR( ch = 1; ch < foa_ch; ch++ ) - { - IF( LT_32( norm_fx, EPSILON_FX_THR ) ) - { - IF( response_avg_fx[ch] != 0 ) - { - response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15 - move32(); - } - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 - move32(); - } - ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) ) - { - response_avg_fx[ch] = ONE_IN_Q30; // 1 q30 - move32(); - } - ELSE - { - response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15 - move32(); - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 - move32(); - } - } - /*normalize 2nd order*/ - norm_fx = 0; - move32(); - Word16 min_ch_order = s_min( hoa2_ch_order, num_ch_order ); - FOR( ch = foa_ch; ch < min_ch_order; ch++ ) - { - norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29 - } - norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) ); - IF( norm_fx ) + IF( LT_32( norm_fx, EPSILON_FX_THR ) ) { - norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q - } - ELSE - { - norm_fx = EPSILON_FX; - move32(); - } - IF( norm_q < 0 ) - { - norm_fx = L_shr( norm_fx, negate( norm_q ) ); // q31 - norm_q = 0; - move16(); - } - norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30 - min_ch_order = s_min( hoa2_ch_order, num_ch_order ); - FOR( ch = foa_ch; ch < min_ch_order; ch++ ) - { - IF( LT_32( norm_fx, EPSILON_FX_THR ) ) - { - response_avg_fx[ch] = response_avg_fx[ch]; // q30 - response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15 - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 - move32(); - move32(); - move32(); - } - ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) ) + FOR( ch = 1; ch < foa_ch; ch++ ) { - response_avg_fx[ch] = ONE_IN_Q30; // q30 - move32(); - } - ELSE - { - response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15 - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 - move32(); + /*when control comes here, response_avg_fx[ch] should be less than EPSILON*/ + response_avg_fx[ch] = L_shl( response_avg_fx[ch], Q30 - EPSILON_FX_SHIFT ); // q30 move32(); } } - - /*normalize 3rd order*/ - norm_fx = 0; - move32(); - FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) - { - norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29 - } - norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) ); - IF( norm_fx ) - { - norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q - } ELSE { - norm_fx = EPSILON_FX; - move32(); - } - IF( norm_q < 0 ) - { - norm_fx = L_shr( norm_fx, negate( norm_q ) ); // q31 - norm_q = 0; - move16(); - } - norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30 - FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) - { - IF( LT_32( norm_fx, EPSILON_FX_THR ) ) + FOR( ch = 1; ch < foa_ch; ch++ ) { - response_avg_fx[ch] = response_avg_fx[ch]; // q30 - response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15 - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 - move32(); - move32(); - move32(); - } - ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) ) - { - response_avg_fx[ch] = ONE_IN_Q30; // 1 q30 - move32(); - } - ELSE - { - response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15 - move32(); - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 + tmp_norm_out = divide3232( response_avg_fx[ch], L_max( norm_fx, L_abs( response_avg_fx[ch] ) ) ); // q15 + response_avg_fx[ch] = L_shl( tmp_norm_out, 15 ); // q30 move32(); } } @@ -7182,6 +6852,131 @@ void ivas_dirac_dec_get_response_fx( return; } +/*This is a derivate to ivas_dirac_dec_get_response_fx with fixed Q_out=29*/ +void ivas_dirac_dec_get_response_fx_29( + const Word16 azimuth, + const Word16 elevation, + Word32 *response_fx, /*Q_out*/ + const Word16 ambisonics_order ) +{ + Word16 index_azimuth, index_elevation; + Word16 el, az; + Word32 cos_1_fx, cos_2_fx, sin_1_fx, cos_az_fx[3]; + Word32 sin_az_fx[3]; + Word32 f_fx; + Word32 c_fx_better; + Word16 l, m; + Word16 b, b1, b_2, b1_2; + // Word16 Q_out = 29; + + index_azimuth = add( azimuth, 180 ) % 360; + move16(); + index_elevation = add( elevation, 90 ); + + Word32 e_fac = L_add( 0x7FFFFFFF, 0 ); + + if ( GT_16( index_elevation, 90 ) ) + { + e_fac = MIN_32; + } + + + el = index_elevation; + move16(); + + if ( GT_16( index_elevation, 90 ) ) + { + el = sub( 180, index_elevation ); + } + + az = index_azimuth; + move16(); + + if ( GT_16( index_azimuth, 180 ) ) + { + az = sub( 360, index_azimuth ); + } + + f_fx = 1; + move16(); + + if ( GT_16( index_azimuth, 180 ) ) + { + f_fx = -1; + } + + cos_1_fx = L_shr( dirac_gains_trg_term_fx[az][0], 1 ); // q30 + cos_2_fx = L_shl( Mpy_32_32( cos_1_fx, cos_1_fx ), 1 ); // q30 + sin_1_fx = L_shr( dirac_gains_trg_term_fx[az][1], 1 ); // q30 + + if ( EQ_32( f_fx, -1 ) ) + { + sin_1_fx = L_negate( sin_1_fx ); // q30 + } + cos_az_fx[0] = cos_1_fx; // q30 + move32(); + cos_az_fx[1] = L_shl( L_sub( cos_2_fx, ONE_IN_Q29 /*0.5 q30*/ ), 1 ); /*q30*/ + move32(); + cos_az_fx[2] = L_sub( L_shl( Mpy_32_32( cos_1_fx, cos_az_fx[1] ), 2 ), cos_az_fx[0] /* cos_az_fx[0] q30*/ ); /*q30*/ + move32(); + sin_az_fx[0] = sin_1_fx; /*q30*/ + move32(); + sin_az_fx[1] = L_shl( Mpy_32_32( sin_1_fx, cos_1_fx ), 2 ); /*q30*/ + move32(); + sin_az_fx[2] = L_shl( Mpy_32_32( sin_1_fx, L_sub( cos_2_fx, ONE_IN_Q28 /*1/4 q30*/ ) ), 3 ); /*q30*/ + move32(); + + response_fx[0] = 0x20000000; + move32(); + + FOR( l = 1; l <= ambisonics_order; l++ ) + { + Word16 a; + b_2 = imult1616( l, l ); + b1_2 = add( b_2, shl( l, 1 ) ); + FOR( m = 0; m < l; m += 2 ) + { + b = b_2 + m; + a = dirac_gains_P_idx[b]; + + c_fx_better = local_result_table[el][a]; // q30 + move32(); + response_fx[b] = Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ); // Q_out + move32(); + + b1 = b1_2 - m; + response_fx[b1] = Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ); // Q_out + move32(); + } + + FOR( m = 1; m < l; m += 2 ) + { + b = b_2 + m; + a = dirac_gains_P_idx[b]; + c_fx_better = local_result_table[el][a]; // q30 + move32(); + c_fx_better = Mpy_32_32( c_fx_better, e_fac ); // q30 + response_fx[b] = Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ); // Q_out + move32(); + + b1 = b1_2 - m; + response_fx[b1] = Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ); // Q_out + move32(); + } + + b = add( b_2, l ); + a = dirac_gains_P_idx[b]; + c_fx_better = local_result_table_2[el][a]; // q30 + move32(); + if ( s_and( l, 0x01 ) ) + { + c_fx_better = Mpy_32_32( c_fx_better, e_fac ); // q30 + } + response_fx[b] = L_shl( c_fx_better, -1 ); // Q_out + move32(); + } + return; +} /*-----------------------------------------------------------------------------------------* * Function ivas_get_bits_to_encode * diff --git a/lib_com/ivas_spar_com_quant_util_fx.c b/lib_com/ivas_spar_com_quant_util_fx.c index cfd03a3b3e68d51d66045229266e9f412a564231..8e84e4e374273d2b97988a01283fac18405d859d 100644 --- a/lib_com/ivas_spar_com_quant_util_fx.c +++ b/lib_com/ivas_spar_com_quant_util_fx.c @@ -37,7 +37,6 @@ #include "ivas_rom_com.h" #include #include "wmc_auto.h" -#include "ivas_rom_com_fx.h" #include "ivas_prot_fx.h" @@ -215,19 +214,17 @@ void ivas_quantise_real_values_enc_fx( move32(); } } + return; } + /*-----------------------------------------------------------------------------------------* * Function ivas_spar_get_uniform_quant_strat() * * Sets the quant strat values *-----------------------------------------------------------------------------------------*/ -/*-----------------------------------------------------------------------------------------* - * Function ivas_spar_get_uniform_quant_strat_fx() - * - * Sets the quant strat values - *-----------------------------------------------------------------------------------------*/ + void ivas_spar_get_uniform_quant_strat_fx( ivas_spar_md_com_cfg *pSpar_md_com_cfg, const Word16 table_idx ) diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index fb11d3934486f3c09af3e8e5482ec78c90f6bc7a..65a081c9c9884c49cda797f81a9889a55959c056 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -65,6 +65,16 @@ typedef struct Word32 yaw_fx; /* yaw value read from the input metadata file */ /* Q22 */ Word32 pitch_fx; /* pitch value read from the input metadata file */ /* Q22 */ + Word32 gain_fx; /* Q29 */ + + Word32 edited_azimuth_fx; /* Q22 */ + Word32 edited_elevation_fx; /* Q22 */ + Word16 edited_radius_fx; /* Q9 */ + + Word32 edited_yaw_fx; /* Q22 */ + Word32 edited_pitch_fx; /* Q22 */ + Word32 edited_gain_fx; /* Q29 */ + Word16 non_diegetic_flag; /* Non-diegetic (non-headtracked) object flag */ ISM_METADATA_ANGLE position_angle; /* Angle structs for azimuth and elevation */ @@ -176,6 +186,7 @@ typedef struct ivas_band_coeffs_t Word32 pred_quant_re_fx[IVAS_SPAR_MAX_CH - 1]; Word32 C_quant_re_fx[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; Word32 P_quant_re_fx[IVAS_SPAR_MAX_CH - 1]; + } ivas_band_coeffs_t; typedef struct ivas_band_coeffs_ind_t @@ -197,6 +208,7 @@ typedef struct ivas_spar_md_t Word32 ref_pow_slow_fx[IVAS_MAX_NUM_BANDS]; Word16 res_ind; Word16 prior_dyn_active_w_flag; + } ivas_spar_md_t; typedef struct ivas_spar_md_prev_t @@ -211,6 +223,7 @@ typedef struct ivas_quant_coeffs_t Word32 min_fx; /* Q28 */ Word32 max_fx; /* Q28 */ Word16 q_levels[2]; + } ivas_quant_coeffs_t; typedef struct ivas_quant_strat_t @@ -238,7 +251,6 @@ typedef struct ivas_spar_md_com_cfg Word16 max_bits_per_blk; Word16 prev_quant_idx; Word16 agc_bits_ch_idx; - Word16 planarCP; Word16 num_umx_chs; Word16 max_md_bits_spar; @@ -292,6 +304,7 @@ typedef struct ivas_arith_t Word16 range; Word16 num_models; Word32 saved_dist_arr[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; /* Q15 */ + } ivas_arith_t; typedef struct ivas_arith_coeffs_t @@ -548,9 +561,9 @@ typedef struct ivas_param_mc_ild_mapping_struct { Word16 ild_map_size_wo_lfe; Word16 ild_map_size_lfe; - Word16 ild_index[MAX_CICP_CHANNELS]; - Word16 num_ref_channels[MAX_CICP_CHANNELS]; - Word16 ref_channel_idx[MAX_CICP_CHANNELS][PARAM_MC_MAX_ILD_REF_CHANNELS]; + Word16 ild_index[MAX_LS_CHANNELS]; + Word16 num_ref_channels[MAX_LS_CHANNELS]; + Word16 ref_channel_idx[MAX_LS_CHANNELS][PARAM_MC_MAX_ILD_REF_CHANNELS]; } PARAM_MC_ILD_MAPPING, *HANDLE_PARAM_MC_ILD_MAPPING; diff --git a/lib_com/ivas_stereo_ica_com_fx.c b/lib_com/ivas_stereo_ica_com_fx.c index 8548797a4134d1805618080459a0f8ec38631269..11f16d0a5fde3f8b3f14e48230b90860028650ce 100644 --- a/lib_com/ivas_stereo_ica_com_fx.c +++ b/lib_com/ivas_stereo_ica_com_fx.c @@ -41,7 +41,6 @@ #include "rom_com.h" #include "ivas_rom_com.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*--------------------------------------------------------------- * interpTargetChannel_fx() @@ -51,69 +50,89 @@ * ---------------------------------------------------------------*/ #define SPREAD_FACTOR1 ( 1.0f / INTERP_FACTOR1 ) -Word32 table_596[N_MAX_SHIFT_CHANGE + 1] = { + +static Word32 table_596[N_MAX_SHIFT_CHANGE + 1] = { 0, 2441216, 1220608, 813738, 610304, 488243, 406869, 348745, 305152, 271246, 244121, 221928, 203434, 187785, 174372, 162747, 152576, 143600, 135623, 128485, 122060 }; // Q12 -Word32 inv_table_596[N_MAX_SHIFT_CHANGE + 1] = { +static Word32 inv_table_596[N_MAX_SHIFT_CHANGE + 1] = { 0, 7206320, 14412641, 21618962, 28825283, 36031605, 43237924, 50444244, 57650567, 64856889, 72063211, 79269528, 86475849, 93682173, 100888489, 108094813, 115301135, 122507459, 129713778, 136920096, 144126422 }; // Q31 -Word32 tableD1_596[N_MAX_SHIFT_CHANGE + 1] = { + +static Word32 tableD1_596[N_MAX_SHIFT_CHANGE + 1] = { 0, 216, 1731, 5842, 13849, 27049, 46741, 74223, 110794, 157752, 216396, 288023, 373932, 475422, 593791, 730337, 886359, 1063155, 1262023, 1484262, 1731170 }; // Q35 -Word32 table_298[N_MAX_SHIFT_CHANGE + 1] = { +static Word32 table_298[N_MAX_SHIFT_CHANGE + 1] = { 0, 1220608, 610304, 406869, 305152, 244121, 203434, 174372, 152576, 135623, 122060, 110964, 101717, 93892, 87186, 81373, 76288, 71800, 67811, 64242, 61030 }; // Q12 -Word32 inv_table_298[N_MAX_SHIFT_CHANGE + 1] = { + +static Word32 inv_table_298[N_MAX_SHIFT_CHANGE + 1] = { 0, 14412641, 28825283, 43237924, 57650567, 72063211, 86475849, 100888489, 115301135, 129713778, 144126422, 158539056, 172951698, 187364347, 201776979, 216189627, 230602270, 245014919, 259427557, 273840192, 288252845 }; // Q31 -Word32 tableD1_298[N_MAX_SHIFT_CHANGE + 1] = { + +static Word32 tableD1_298[N_MAX_SHIFT_CHANGE + 1] = { 0, 1731, 13849, 46741, 110794, 216396, 373932, 593791, 886359, 1262023, 1731170, 2304187, 2991462, 3803381, 4750330, 5842699, 7090873, 8505240, 10096185, 11874096, 13849363 }; // Q35 -Word32 table_290[N_MAX_SHIFT_CHANGE + 1] = { +static Word32 table_290[N_MAX_SHIFT_CHANGE + 1] = { 0, 1187840, 593920, 395946, 296960, 237568, 197973, 169691, 148480, 131982, 118784, 107985, 98986, 91372, 84845, 79189, 74240, 69872, 65991, 62517, 59392 }; // Q12 -Word32 inv_table_290[N_MAX_SHIFT_CHANGE + 1] = { + +static Word32 inv_table_290[N_MAX_SHIFT_CHANGE + 1] = { 0, 14810232, 29620464, 44430697, 59240928, 74051160, 88861394, 103671628, 118481856, 133292091, 148102320, 162912554, 177722789, 192533022, 207343256, 222153473, 236963712, 251773958, 266584183, 281394409, 296204640 }; // Q31 -Word32 tableD1_290[N_MAX_SHIFT_CHANGE + 1] = { 0, 1878, 15027, 50717, 120219, 234803, 405740, 644300, - 961755, 1369374, 1878428, 2500187, 3245924, 4126907, 5154407, 6339694, - 7694041, 9228719, 10954993, 12884138, 15027425 }; // Q35 +static Word32 tableD1_290[N_MAX_SHIFT_CHANGE + 1] = { + 0, 1878, 15027, 50717, 120219, 234803, 405740, 644300, + 961755, 1369374, 1878428, 2500187, 3245924, 4126907, 5154407, 6339694, + 7694041, 9228719, 10954993, 12884138, 15027425 +}; // Q35 -Word32 table_145[N_MAX_SHIFT_CHANGE + 1] = { + +static Word32 table_145[N_MAX_SHIFT_CHANGE + 1] = { 0, 593920, 296960, 197973, 148480, 118784, 98986, 84845, 74240, 65991, 59392, 53992, 49493, 45686, 42422, 39594, 37120, 34936, 32995, 31258, 29696 }; // Q12 -Word32 inv_table_145[N_MAX_SHIFT_CHANGE + 1] = { + +static Word32 inv_table_145[N_MAX_SHIFT_CHANGE + 1] = { 0, 29620464, 59240928, 88861394, 118481856, 148102320, 177722789, 207343256, 236963712, 266584183, 296204640, 325825109, 355445578, 385066045, 414686513, 444306946, 473927425, 503547916, 533168367, 562788819, 592409281 }; // Q31 -Word32 tableD1_145[N_MAX_SHIFT_CHANGE + 1] = { 0, 15027, 120219, 405740, 961755, 1878428, 3245924, 5154407, - 7694041, 10954993, 15027425, 20001503, 25967392, 33015256, 41235259, 50717555, - 61552334, 73829752, 87639951, 103073111, 120219402 }; // Q35 + +static Word32 tableD1_145[N_MAX_SHIFT_CHANGE + 1] = { + 0, 15027, 120219, 405740, 961755, 1878428, 3245924, 5154407, + 7694041, 10954993, 15027425, 20001503, 25967392, 33015256, 41235259, 50717555, + 61552334, 73829752, 87639951, 103073111, 120219402 +}; // Q35 + + +/*--------------------------------------------------------------- + * Function interpTargetChannel_fx() + * + * + *---------------------------------------------------------------*/ + static void interpTargetChannel_fx( Word32 *target_fx, // qsynth const Word16 prevShift, // Q0 @@ -269,7 +288,6 @@ static void interpTargetChannel_fx( x_fx[3] = L_add( x_fx[2], interp_factor2_fx ); // Q12 move32(); - res_a1 = L_sub( tempF1_fx, x_fx[0] ); // Q12 res_a2 = L_sub( tempF1_fx, x_fx[1] ); // Q12 res_a3 = L_sub( tempF1_fx, x_fx[2] ); // Q12 @@ -320,11 +338,13 @@ static void interpTargetChannel_fx( return; } + /*--------------------------------------------------------------- * Function targetCh_AlignStereoDFT() * * Align target channel in DFT stereo to correct FOR shift variations * ---------------------------------------------------------------*/ + static void targetCh_AlignStereoDFT_fx( Word32 *target_fx, // qsynth const Word16 prevShift, // Q0 @@ -385,11 +405,13 @@ static void targetCh_AlignStereoDFT_fx( return; } + /*--------------------------------------------------------------- * adjustTargetSignal() * * Target signal correction FOR shift variations. * ---------------------------------------------------------------*/ + void adjustTargetSignal_fx( Word32 *target_fx, // qsynth const Word16 prevShift, // Q0 diff --git a/lib_com/ivas_stereo_td_bit_alloc_fx.c b/lib_com/ivas_stereo_td_bit_alloc_fx.c index b54c1d3deb5ae86bf589fe0fd34d0e9359885734..fe18e7bad6caea89ed7c019b09a57943b5499eeb 100644 --- a/lib_com/ivas_stereo_td_bit_alloc_fx.c +++ b/lib_com/ivas_stereo_td_bit_alloc_fx.c @@ -40,7 +40,6 @@ #include "prot_fx.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*-------------------------------------------------------------------* @@ -525,6 +524,7 @@ void tdm_bit_alloc( *total_brate_sec = L_add( *total_brate_sec, sub( fast_FCB_rates_2sfr[idx], tmp_rate ) ); /*Q0*/ move32(); } + /* To prevent 13.2 kb/s for primary channel as some bitstream issues arrise with it */ IF( EQ_32( L_sub( element_brate_wo_meta, *total_brate_sec ), ACELP_13k20 ) ) { @@ -532,6 +532,7 @@ IF( EQ_32( L_sub( element_brate_wo_meta, *total_brate_sec ), ACELP_13k20 ) ) move32(); } } + /* prevent 2.4 kb/s and 2.8 kb/s as they are reserved bitrates for DTX and VBR */ test(); IF( EQ_32( *total_brate_sec, PPP_NELP_2k80 ) || EQ_32( *total_brate_sec, SID_2k40 ) ) @@ -545,16 +546,17 @@ move32(); return; } + /*-------------------------------------------------------------------* * td_stereo_param_updt() * * copy certain TD stereo parameters from primary channel to secondary channel *-------------------------------------------------------------------*/ + void td_stereo_param_updt_fx( const Word16 lsp_old_PCh_fx[], /* i : primary channel old LSPs Q15 */ const Word16 lsf_old_PCh_fx[], /* i : primary channel old LSFs Qlog2(2.56) */ const Word16 pitch_buf_PCh_fx[], /* i : primary channel pitch buffer Q6 */ - Word16 tdm_lspQ_PCh_fx[], /* o : Q LSPs for primary channel Q15 */ Word16 tdm_lsfQ_PCh_fx[], /* o : Q LSFs for primary channel Qlog2(2.56) */ Word16 tdm_Pri_pitch_buf_fx[], /* o : pitch values for primary channel Q6 */ const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag Q0*/ @@ -562,24 +564,25 @@ void td_stereo_param_updt_fx( ) { Word16 i; + /* Copy some primary channel information into the secondary channel structure for later usage */ IF( EQ_16( tdm_use_IAWB_Ave_lpc, 1 ) ) { /*not being assert*/ Copy( IAWB_Ave_fx, tdm_lsfQ_PCh_fx, M ); /*Qlog2(2.56)*/ - lsf2lsp_fx( tdm_lsfQ_PCh_fx, tdm_lspQ_PCh_fx, M, INT_FS_12k8 ); } ELSE IF( EQ_16( flag_ACELP16k, 1 ) ) { - Copy( lsp_old_PCh_fx, tdm_lspQ_PCh_fx, M ); /*Q15*/ - lsp_convert_poly_fx( tdm_lspQ_PCh_fx, L_FRAME, 0 ); - lsp2lsf_fx( tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, M, INT_FS_12k8 ); + Word16 lsp_temp[M]; + Copy( lsp_old_PCh_fx, lsp_temp, M ); /*Q15*/ + lsp_convert_poly_fx( lsp_temp, L_FRAME, 0 ); + lsp2lsf_fx( lsp_temp, tdm_lsfQ_PCh_fx, M, INT_FS_12k8 ); } ELSE { - Copy( lsp_old_PCh_fx, tdm_lspQ_PCh_fx, M ); /*Q15*/ Copy( lsf_old_PCh_fx, tdm_lsfQ_PCh_fx, M ); /*Qlog2(2.56)*/ } + IF( EQ_16( flag_ACELP16k, 1 ) ) { Word16 tmp16; @@ -648,11 +651,8 @@ static void tdm_SCh_LSF_intra_pred_tri_diag_mat_fx( v_sub_16( lsf_SCh_fx, lsf_mean_in_fx, lsf_tmp_fx, M ); - lsf_tmp_ptr1_fx = lsf_tmp_fx; /*x2.56*/ - - lsf_SCh_ptr_fx = lsf_SCh_fx; /*x2.56*/ - - + lsf_tmp_ptr1_fx = lsf_tmp_fx; /*x2.56*/ + lsf_SCh_ptr_fx = lsf_SCh_fx; /*x2.56*/ lsf_tmp_ptr2_fx = lsf_tmp_ptr1_fx; /*x2.56*/ *lsf_SCh_ptr_fx = mult_r( *lsf_tmp_ptr1_fx++, *prd_ptr_fx++ ); // Q2.56 + 15 -15 diff --git a/lib_com/ivas_tools_fx.c b/lib_com/ivas_tools_fx.c index 04d6f7bf50be3f68f9684774ee1d4c7da7412cdf..bc080f2f832a86c95ef4ee01a7b709ee6492da90 100644 --- a/lib_com/ivas_tools_fx.c +++ b/lib_com/ivas_tools_fx.c @@ -117,8 +117,8 @@ void mvc2c( /*! r: number of clipped samples */ UWord32 ivas_syn_output_fx( - Word32 *synth[], /* i/o: float synthesis signal q_synth*/ - const Word16 q_synth, + Word32 *synth[], /* i/o: synthesis signal q_synth*/ + const Word16 q_synth, /* i : Q factor */ const Word16 output_frame, /* i : output frame length (one channel) Q0*/ const Word16 n_channels, /* i : number of output channels Q0*/ Word16 *synth_out /* o : integer 16 bits synthesis signal Q0*/ @@ -131,7 +131,7 @@ UWord32 ivas_syn_output_fx( move32(); /*-----------------------------------------------------------------* - * float to integer conversion with saturation control + * Word32 to Word16 conversion with saturation control *-----------------------------------------------------------------*/ FOR( n = 0; n < n_channels; n++ ) @@ -151,95 +151,84 @@ UWord32 ivas_syn_output_fx( /*-------------------------------------------------------------------* - * ivas_syn_output_f() + * ivas_buffer_interleaved_to_deinterleaved() * - * Output ivas synthesis signal with compensation for saturation - * returns number of clipped samples + * Convert an interleaved buffer of audio channels to deinterleaved one *-------------------------------------------------------------------*/ -/*! r: number of clipped samples */ -void ivas_syn_output_f_fx( - Word32 *synth[], /* i/o: float synthesis signal Q11*/ - const Word16 output_frame, /* i : output frame length (one channel) Q0*/ - const Word16 n_channels, /* i : number of output channels Q0*/ - Word32 *synth_out /* o : integer 16 bits synthesis signal Q11*/ +void ivas_buffer_interleaved_to_deinterleaved_fx( + Word32 *audio, /* i/o: audio buffer */ + const Word16 n_channels, /* i : number of channels */ + const Word16 frame_length, /* i : frame length (one channel) */ + const Word16 n_samp_full /* i : full frame length (one channel) */ ) { - Word16 i, n; - - /*-----------------------------------------------------------------* - * float to integer conversion with saturation control - *-----------------------------------------------------------------*/ + Word16 offset, ch, m; + Word32 buffer[MAX_TRANSPORT_CHANNELS][MAX_JBM_L_FRAME48k]; - FOR( n = 0; n < n_channels; n++ ) + FOR( ch = 0; ch < n_channels; ch++ ) { - FOR( i = 0; i < output_frame; i++ ) + FOR( m = 0; m < frame_length; m++ ) { - synth_out[( ( i * n_channels ) + n )] = synth[n][i]; /*Q11*/ - move16(); + buffer[ch][m] = audio[m * n_channels + ch]; + move32(); } } + offset = 0; + move16(); + FOR( ch = 0; ch < n_channels; ch++ ) + { + Copy32( buffer[ch], audio + offset, frame_length ); + offset = add( offset, n_samp_full ); + } + return; } /*-------------------------------------------------------------------* - * mvr2r_inc() - * + * ivas_buffer_deinterleaved_to_interleaved() * + * Convert a deinterleaved buffer of audio channels to interleaved one *-------------------------------------------------------------------*/ -void mvr2r_inc_fixed_one( - const Word32 x_fx[], /* i : input vector Q29*/ - const Word16 x_inc, /* i : increment for vector x[] Q0*/ - Word32 y_fx[], /* o : output vector Q29*/ - const Word16 y_inc, /* i : increment for vector y[] Q0*/ - const Word16 n /* i : vector size Q0*/ + +void ivas_buffer_deinterleaved_to_interleaved_fx( + Word32 *audio[], /* i/o: deinterleaved audio buffer */ + const Word16 n_channels, /* i : number of channels */ + const Word16 frame_length, /* i : frame length (one channel) */ + Word32 *audio_out /* o : interleaved audio buffer */ ) { - Word16 i; - Word16 ix; - Word16 iy; + Word16 ch, m; + Word32 buffer[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; /* temp buffer needed when "*audio[]" and "*audio_out[]" are the same */ - IF( n <= 0 ) + FOR( ch = 0; ch < n_channels; ch++ ) { - /* cannot transfer vectors with size 0 */ - return; + Copy32( audio[ch], buffer[ch], frame_length ); } - IF( y_fx < x_fx ) - { - ix = 0; - move16(); - iy = 0; - move16(); - FOR( i = 0; i < n; i++ ) - { - y_fx[iy] = x_fx[ix]; /*Q29*/ - move32(); - ix = ix + x_inc; - iy = iy + y_inc; - } - } - ELSE + FOR( ch = 0; ch < n_channels; ch++ ) { - ix = imult1616( sub( n, 1 ), x_inc ); /*Q0*/ - iy = imult1616( sub( n, 1 ), y_inc ); /*Q0*/ - FOR( i = ( n - 1 ); i >= 0; i-- ) + FOR( m = 0; m < frame_length; m++ ) { - y_fx[iy] = x_fx[ix]; /*Q29*/ + audio_out[m * n_channels + ch] = buffer[ch][m]; move32(); - - ix = ix - x_inc; - iy = iy - y_inc; } } return; } -void mvr2r_inc_fixed( + +/*-------------------------------------------------------------------* + * mvr2r_inc() + * + * + *-------------------------------------------------------------------*/ + +void mvr2r_inc_fx( const Word32 x_fx[], /* i : input vector Q29*/ const Word16 x_inc, /* i : increment for vector x[] Q0*/ Word32 y_fx[], /* o : output vector Q29*/ @@ -306,12 +295,6 @@ void v_add_inc_fx( const Word16 N /* i : Vector length Q0*/ ) { -#ifndef FIX_1107_VADDINC - Word16 i; - Word16 ix1 = 0; - Word16 ix2 = 0; - Word16 iy = 0; -#else Word16 i, ix1, ix2, iy; /* The use of this function is currently always for the interleaved input format, */ @@ -334,7 +317,6 @@ void v_add_inc_fx( ix1 = 0; ix2 = 0; iy = 0; -#endif move16(); move16(); move16(); @@ -355,45 +337,8 @@ void v_add_inc_fx( * Multiplication of two vectors with explicit increments *-------------------------------------------------------------------*/ -void v_mult_inc_fx( - const Word32 x1_fx[], /* i : Input vector 1 x1_q_fx*/ - Word16 *x1_q_fx, - const Word16 x1_inc, /* i : Increment for input vector 1 Q0*/ - const Word32 x2_fx[], /* i : Input vector 2 x2_q_fx*/ - Word16 *x2_q_fx, - const Word16 x2_inc, /* i : Increment for input vector 1 Q0*/ - Word32 y_fx[], /* o : Output vector that contains vector 1 .* vector 2 y_q_fx*/ - Word16 *y_q_fx, - const Word16 y_inc, /* i : increment for vector y[i] Q0*/ - const Word16 N /* i : Vector length Q0*/ -) -{ - Word16 i; - Word16 ix1 = 0; - Word16 ix2 = 0; - Word16 iy = 0; - - move16(); - move16(); - move16(); - - FOR( i = 0; i < N; i++ ) - { - y_fx[iy] = Mpy_32_32( x1_fx[ix1], x2_fx[ix2] ); /* x1_q_fx + x2_q_fx - 31 */ - move32(); - y_q_fx[iy] = sub( add( x1_q_fx[ix1], x2_q_fx[ix2] ), 31 ); - move16(); - - ix1 = add( ix1, x1_inc ); /*Q0*/ - ix2 = add( ix2, x2_inc ); /*Q0*/ - iy = add( iy, y_inc ); /*Q0*/ - } - - return; -} - // when buffers have constant q/ -void v_mult_inc_fixed( +void v_mult_inc_fx( const Word32 x1_fx[], /* i : Input vector 1 Qx1*/ const Word16 x1_inc, /* i : Increment for input vector 1 Q0*/ const Word32 x2_fx[], /* i : Input vector 2 Qx2*/ @@ -448,28 +393,6 @@ void v_addc_fx( return; } -/*-------------------------------------------------------------------* - * v_addc() - * - * Addition of constant to vector - *-------------------------------------------------------------------*/ -void v_addc_fixed( - const Word32 x[], /* i : Input vector Qx*/ - const Word32 c, /* i : Constant Qx*/ - Word32 y[], /* o : Output vector that contains c*x Qx*/ - const Word16 N /* i : Vector length Q0*/ -) -{ - Word16 i; - - FOR( i = 0; i < N; i++ ) - { - y[i] = L_add( c, x[i] ); /*Qx*/ - move32(); - } - - return; -} /*-------------------------------------------------------------------* * v_min_fx() @@ -535,6 +458,7 @@ void v_min_fx( * * square root of vector *-------------------------------------------------------------------*/ + void v_sqrt_fx( const Word32 x[], /* i : Input vector Qx*/ Word16 exp[], @@ -553,6 +477,7 @@ void v_sqrt_fx( return; } + /*-------------------------------------------------------------------* * v_sub_s() * @@ -596,6 +521,7 @@ void v_sub32_fx( return; } + /*---------------------------------------------------------------------* * dot_product_cholesky() * @@ -604,46 +530,8 @@ void v_sub32_fx( * Therefore, S=A*A' where A is upper triangular matrix of size (m*m+m)/2 (zeros ommitted, column-wise) *---------------------------------------------------------------------*/ -#ifndef DOT_PROD_CHOLESKY_64BIT -/*! r: the dot product x'*A*A'*x */ -Word32 dot_product_cholesky_fixed( - const Word32 *x, /* i : vector x Q31 - exp_x*/ - const Word32 *A, /* i : Cholesky matrix A Q31 - exp_A*/ - const Word16 N, /* i : vector & matrix size Q0*/ - const Word16 exp_x, - const Word16 exp_A, - Word16 *exp_sum ) -{ - Word16 i, j; - Word32 suma, tmp_sum, mul; - const Word32 *pt_x, *pt_A; - Word16 mul_exp, tmp_sum_exp; - mul_exp = add( exp_x, exp_A ); - pt_A = A; - suma = 0; - move32(); - FOR( i = 0; i < N; i++ ) - { - tmp_sum = 0; - move32(); - tmp_sum_exp = 0; - move16(); - pt_x = x; - - FOR( j = 0; j <= i; j++ ) - { - mul = Mpy_32_32( *pt_x++, *pt_A++ ); /*Q31 - (exp_x + exp_A)*/ - tmp_sum = BASOP_Util_Add_Mant32Exp( tmp_sum, tmp_sum_exp, mul, mul_exp, &tmp_sum_exp ); // exp_x+exp_A - } - - suma = BASOP_Util_Add_Mant32Exp( suma, *exp_sum, Mpy_32_32( tmp_sum, tmp_sum ), shl( tmp_sum_exp, 1 ), exp_sum ); /*Q31 - exp_sum*/ - } - - return suma; -} -#else /*! r: the dot product x'*A*A'*x */ -Word64 dot_product_cholesky_fixed( +Word64 dot_product_cholesky_fx( const Word32 *x, /* i : vector x Q31 - exp_x*/ const Word32 *A, /* i : Cholesky matrix A Q31 - exp_A*/ const Word16 N /* i : vector & matrix size Q0*/ @@ -651,7 +539,6 @@ Word64 dot_product_cholesky_fixed( { Word16 i, j; Word64 suma, tmp_sum; - Word32 mul; Word32 tmp; const Word32 *pt_x, *pt_A; pt_A = A; @@ -666,20 +553,26 @@ Word64 dot_product_cholesky_fixed( FOR( j = 0; j <= i; j++ ) { - mul = Mpy_32_32( *pt_x++, *pt_A++ ); - tmp_sum = W_add( tmp_sum, W_deposit32_l( mul ) ); + tmp_sum = W_add( tmp_sum, Mpy_32_32( *pt_x++, *pt_A++ ) ); } - tmp_sum = W_shr( tmp_sum, 4 ); // to make sure that the tmp_sum will not overflow - tmp = W_extract_l( tmp_sum ); + tmp = W_shl_sat_l( tmp_sum, -4 ); // to make sure that the tmp_sum will not overflow suma = W_mac_32_32( suma, tmp, tmp ); } return suma; } -#endif -void v_mult_mat_fixed( + +/*---------------------------------------------------------------------* + * v_mult_mat_fx() + * + * Multiplication of row vector x by matrix A, where x has size Nr and + * A has size Nr x Nc ans it is stored column-wise in memory. + * The resulting row vector y has size Nc + *---------------------------------------------------------------------*/ + +void v_mult_mat_fx( Word32 *y, /* o : the product x*A Qx - guardbits*/ const Word32 *x, /* i : vector x Qx*/ const Word32 *A, /* i : matrix A Q31*/ @@ -711,108 +604,6 @@ void v_mult_mat_fixed( MVR2R_WORD32( tmp_y, y, Nc ); /*Qx - guardbits*/ } -Word32 dot_product_cholesky_fx( - const Word32 *x, /* i : vector x Qx1*/ - const Word32 *A, /* i : Cholesky matrix A Qx2*/ - const Word16 N /* i : vector & matrix size Q0*/ -) -{ - Word16 i, j; - Word32 suma, tmp_sum; - const Word32 *pt_x, *pt_A; - - pt_A = A; - suma = 0; - move32(); - - FOR( i = 0; i < N; i++ ) - { - tmp_sum = 0; - move32(); - pt_x = x; - FOR( j = 0; j <= i; j++ ) - { - tmp_sum = L_add( tmp_sum, Mpy_32_32( *pt_x++, *pt_A++ ) ); /*Qx1 + Qx2 - 31*/ - } - - suma = L_add( suma, Mpy_32_32( tmp_sum, tmp_sum ) ); - } - - return suma; -} - - -/*---------------------------------------------------------------------* - * v_mult_mat_fx() - * - * Multiplication of row vector x by matrix A, where x has size Nr and - * A has size Nr x Nc ans it is stored column-wise in memory. - * The resulting row vector y has size Nc - *---------------------------------------------------------------------*/ - -void v_mult_mat_fx( - Word32 *y_fx, /* o : the product x*A y_q_fx*/ - Word16 *y_q_fx, - const Word32 *x_fx, /* i : vector x x_q_fx*/ - Word16 *x_q_fx, - const Word32 *A_fx, /* i : matrix A A_q_fx*/ - Word16 *A_q_fx, - const Word16 Nr, /* i : number of rows Q0*/ - const Word16 Nc /* i : number of columns Q0*/ -) -{ - Word16 i, j; - const Word32 *pt_x_fx, *pt_A_fx; - Word32 *pt_y_fx; - Word32 tmp_y_fx[MAX_V_MULT_MAT]; - Word32 temp; - Word16 temp_q; - - pt_y_fx = tmp_y_fx; - pt_A_fx = A_fx; /*A_q_fx*/ - pt_x_fx = x_fx; /*x_q_fx*/ - - FOR( i = 0; i < Nc; i++ ) - { - pt_x_fx = x_fx; /*x_q_fx*/ - *pt_y_fx = 0; - move32(); - y_q_fx[i] = 0; - move32(); - FOR( j = 0; j < Nr; j++ ) - { - temp = Mpy_32_32( *pt_x_fx++, *pt_A_fx++ ); /*x_q_fx + A_q_fx - 31*/ - temp_q = sub( add( x_q_fx[j], A_q_fx[Nr * i + j] ), 31 ); - IF( j == 0 ) - { - *pt_y_fx = temp; - move32(); - y_q_fx[i] = temp_q; - move16(); - } - ELSE - { - IF( GT_16( y_q_fx[i], temp_q ) ) - { - *pt_y_fx = L_add( L_shr( *pt_y_fx, sub( y_q_fx[i], temp_q ) ), temp ); - move32(); - y_q_fx[i] = temp_q; - move16(); - } - ELSE - { - *pt_y_fx = L_add( *pt_y_fx, L_shr( temp, sub( temp_q, y_q_fx[i] ) ) ); - move32(); - } - } - } - pt_y_fx++; - } - - MVR2R_WORD32( tmp_y_fx, y_fx, Nc ); /*y_q_fx*/ - - return; -} /*---------------------------------------------------------------------* * logsumexp() @@ -861,14 +652,17 @@ Word32 logsumexp_fx( temp32 = L_add( BASOP_Util_Log2( sum ), L_shl( sum_e, Q25 ) ); /*Q25*/ temp32 = Mpy_32_32( temp32, 1488522239 ); /*logf(x) = log2(x)*logf(2) Q25*/ temp32 = L_add( L_shr( temp32, sub( x_e, 6 ) ), max_exp ); // q = 31-x_e - return temp32; /*31-x_e*/ + + return temp32; /*31-x_e*/ } + /*---------------------------------------------------------------------* * lin_interp() * * Linearly maps x from source range to the target range *---------------------------------------------------------------------*/ + /*! r: mapped output value */ Word32 lin_interp32_fx( const Word32 x, /* i : the value to be mapped Qx */ @@ -907,6 +701,7 @@ Word32 lin_interp32_fx( return temp32; } + /*-------------------------------------------------------------------* * check_bounds_s_fx() * @@ -978,9 +773,6 @@ Word16 matrix_product_mant_exp_fx( Word16 out_e[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; Word16 *Zp_fx_e = out_e; Word16 row, col; -#ifndef OPT_BASOP_ADD_v1 - Word16 x_idx, y_idx; -#endif /* OPT_BASOP_ADD_v1 */ Word64 temp; Word16 temp_e; Word16 prod_e = add( X_fx_e, Y_fx_e ); @@ -1007,13 +799,7 @@ Word16 matrix_product_mant_exp_fx( FOR( k = 0; k < rowsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 temp = W_mac_32_32( temp, X_fx[k + i * rowsX], Y_fx[k + j * rowsY] ); // X_fx_e + Y_fx_e -#else /* OPT_BASOP_ADD_v1 */ - x_idx = k + i * rowsX; - y_idx = k + j * rowsY; - temp = W_mac_32_32( temp, X_fx[x_idx], Y_fx[y_idx] ); // X_fx_e + Y_fx_e -#endif /* OPT_BASOP_ADD_v1 */ } /* Maximize accumulated value to 32-bit */ temp_e = W_norm( temp ); @@ -1051,13 +837,7 @@ Word16 matrix_product_mant_exp_fx( move64(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 temp = W_mac_32_32( temp, X_fx[i + k * rowsX], Y_fx[j + k * rowsY] ); // X_fx_e + Y_fx_e -#else /* OPT_BASOP_ADD_v1 */ - x_idx = i + k * rowsX; - y_idx = j + k * rowsY; - temp = W_mac_32_32( temp, X_fx[x_idx], Y_fx[y_idx] ); // X_fx_e + Y_fx_e -#endif /* OPT_BASOP_ADD_v1 */ } /* Maximize accumulated value to 32-bit */ temp_e = W_norm( temp ); @@ -1095,13 +875,7 @@ Word16 matrix_product_mant_exp_fx( move64(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 temp = W_mac_32_32( temp, X_fx[k + i * rowsX], Y_fx[j + k * rowsY] ); // X_fx_e + Y_fx_e -#else /* OPT_BASOP_ADD_v1 */ - x_idx = k + i * rowsX; - y_idx = j + k * rowsY; - temp = W_mac_32_32( temp, X_fx[x_idx], Y_fx[y_idx] ); // X_fx_e + Y_fx_e -#endif /* OPT_BASOP_ADD_v1 */ } /* Maximize accumulated value to 32-bit */ temp_e = W_norm( temp ); @@ -1140,13 +914,7 @@ Word16 matrix_product_mant_exp_fx( move64(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 temp = W_mac_32_32( temp, X_fx[i + k * rowsX], Y_fx[k + j * rowsY] ); // X_fx_e + Y_fx_e -#else /* OPT_BASOP_ADD_v1 */ - x_idx = i + k * rowsX; - y_idx = k + j * rowsY; - temp = W_mac_32_32( temp, X_fx[x_idx], Y_fx[y_idx] ); // X_fx_e + Y_fx_e -#endif /* OPT_BASOP_ADD_v1 */ } /* Maximize accumulated value to 32-bit */ temp_e = W_norm( temp ); @@ -1204,9 +972,6 @@ Word16 matrix_product_fx( ) { Word16 i, j, k; -#ifndef OPT_BASOP_ADD_v1 - Word16 x_idx, y_idx; -#endif /* OPT_BASOP_ADD_v1 */ Word32 *Zp_fx = Z_fx; /* Processing */ @@ -1227,13 +992,7 @@ Word16 matrix_product_fx( move32(); FOR( k = 0; k < rowsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 ( *Zp_fx ) = Madd_32_32( *Zp_fx, X_fx[k + i * rowsX], Y_fx[k + j * rowsY] ); /*Qx + Qy - 31*/ -#else /* OPT_BASOP_ADD_v1 */ - x_idx = add( k, imult1616( i, rowsX ) ); /*Q0*/ - y_idx = add( k, imult1616( j, rowsY ) ); /*Q0*/ - ( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); /*Qx + Qy - 31*/ -#endif /* OPT_BASOP_ADD_v1 */ move32(); } Zp_fx++; @@ -1254,13 +1013,7 @@ Word16 matrix_product_fx( move32(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 ( *Zp_fx ) = Madd_32_32( *Zp_fx, X_fx[i + k * rowsX], Y_fx[j + k * rowsY] ); /*Qx + Qy - 31*/ -#else /* OPT_BASOP_ADD_v1 */ - x_idx = add( i, imult1616( k, rowsX ) ); /*Q0*/ - y_idx = add( j, imult1616( k, rowsY ) ); /*Q0*/ - ( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); /*Qx + Qy - 31*/ -#endif /* OPT_BASOP_ADD_v1 */ move32(); } Zp_fx++; @@ -1281,13 +1034,7 @@ Word16 matrix_product_fx( move32(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 ( *Zp_fx ) = Madd_32_32( *Zp_fx, X_fx[k + i * rowsX], Y_fx[j + k * rowsY] ); /*Qx + Qy - 31*/ -#else /* OPT_BASOP_ADD_v1 */ - x_idx = add( k, imult1616( i, rowsX ) ); /*Q0*/ - y_idx = add( j, imult1616( k, rowsY ) ); /*Q0*/ - ( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); /*Qx + Qy - 31*/ -#endif /* OPT_BASOP_ADD_v1 */ move32(); } @@ -1310,13 +1057,7 @@ Word16 matrix_product_fx( move32(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 ( *Zp_fx ) = L_add_sat( *Zp_fx, Mpy_32_32( X_fx[i + k * rowsX], Y_fx[k + j * rowsY] ) ); /*Qx + Qy - 31*/ -#else /* OPT_BASOP_ADD_v1 */ - x_idx = add( i, imult1616( k, rowsX ) ); /*Q0*/ - y_idx = add( k, imult1616( j, rowsY ) ); /*Q0*/ - ( *Zp_fx ) = L_add_sat( *Zp_fx, Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); /*Qx + Qy - 31*/ -#endif /* OPT_BASOP_ADD_v1 */ // TODO: overflow of Z_fx to be checked move32(); } @@ -1341,9 +1082,6 @@ Word16 matrix_product_q30_fx( ) { Word16 i, j, k; -#ifndef OPT_BASOP_ADD_v1 - Word16 x_idx, y_idx; -#endif /* OPT_BASOP_ADD_v1 */ Word32 *Zp_fx = Z_fx; Word64 W_tmp; @@ -1366,14 +1104,7 @@ Word16 matrix_product_q30_fx( move64(); FOR( k = 0; k < rowsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[k + i * rowsX], Y_fx[k + j * rowsY] ) ); // Q56 -#else /* OPT_BASOP_ADD_v1 */ - //( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[k + i * rowsX], Y_fx[k + j * rowsY] ) ); - x_idx = add( k, imult1616( i, rowsX ) ); /*Q0*/ - y_idx = add( k, imult1616( j, rowsY ) ); /*Q0*/ - W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); // Q56 -#endif /* OPT_BASOP_ADD_v1 */ } W_tmp = W_shl( W_tmp, 6 ); /*Q62*/ ( *Zp_fx ) = W_round64_L( W_tmp ); /*Q30*/ @@ -1397,14 +1128,7 @@ Word16 matrix_product_q30_fx( move64(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[i + k * rowsX], Y_fx[j + k * rowsY] ) ); // Q56 -#else /* OPT_BASOP_ADD_v1 */ - //( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[i + k * rowsX], Y_fx[j + k * rowsY] ) ); - x_idx = add( i, imult1616( k, rowsX ) ); /*Q0*/ - y_idx = add( j, imult1616( k, rowsY ) ); /*Q0*/ - W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); // Q56 -#endif /* OPT_BASOP_ADD_v1 */ } W_tmp = W_shl( W_tmp, 6 ); /*Q62*/ ( *Zp_fx ) = W_round64_L( W_tmp ); /*Q30*/ @@ -1428,11 +1152,6 @@ Word16 matrix_product_q30_fx( move64(); FOR( k = 0; k < colsX; ++k ) { -#ifndef OPT_BASOP_ADD_v1 - //( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[k + i * rowsX], Y_fx[j + k * rowsY] ) ); - x_idx = add( k, imult1616( i, rowsX ) ); /*Q0*/ - y_idx = add( j, imult1616( k, rowsY ) ); /*Q0*/ -#endif /* OPT_BASOP_ADD_v1 */ W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[k + i * rowsX], Y_fx[j + k * rowsY] ) ); // Q56 } @@ -1459,14 +1178,7 @@ Word16 matrix_product_q30_fx( move64(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[i + k * rowsX], Y_fx[k + j * rowsY] ) ); // Q56 -#else /* OPT_BASOP_ADD_v1 */ - //( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[i + k * rowsX], Y_fx[k + j * rowsY] ) ); - x_idx = add( i, imult1616( k, rowsX ) ); /*Q0*/ - y_idx = add( k, imult1616( j, rowsY ) ); /*Q0*/ - W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); // Q56 -#endif /* OPT_BASOP_ADD_v1 */ } W_tmp = W_shl( W_tmp, 6 ); /*Q62*/ ( *Zp_fx ) = W_round64_L( W_tmp ); /*Q30*/ @@ -1499,9 +1211,6 @@ Word16 matrix_product_mant_exp( Word16 *Zp_e = Z_e; Word32 L_tmp; Word16 tmp_e; -#ifndef OPT_BASOP_ADD_v1 - Word16 x_idx, y_idx; -#endif /* OPT_BASOP_ADD_v1 */ /* Processing */ test(); @@ -1523,16 +1232,8 @@ Word16 matrix_product_mant_exp( move16(); FOR( k = 0; k < rowsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 L_tmp = Mpy_32_32( X_fx[k + i * rowsX], Y_fx[k + j * rowsY] ); /*Q31 - (X_e + Y_e)*/ tmp_e = add( X_e[k + i * rowsX], Y_e[k + j * rowsY] ); -#else /* OPT_BASOP_ADD_v1 */ - x_idx = add( k, imult1616( i, rowsX ) ); /*Q0*/ - y_idx = add( k, imult1616( j, rowsY ) ); /*Q0*/ - //( *Zp ) += X[k + i * rowsX] * Y[k + j * rowsY]; - L_tmp = Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ); /*Q31 - (X_e + Y_e)*/ - tmp_e = add( X_e[x_idx], Y_e[y_idx] ); -#endif /* OPT_BASOP_ADD_v1 */ ( *Zp ) = BASOP_Util_Add_Mant32Exp( *Zp, *Zp_e, L_tmp, tmp_e, &tmp_e ); move32(); @@ -1560,16 +1261,8 @@ Word16 matrix_product_mant_exp( move16(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 L_tmp = Mpy_32_32( X_fx[i + k * rowsX], Y_fx[j + k * rowsY] ); /*Q31 - (X_e + Y_e)*/ tmp_e = add( X_e[i + k * rowsX], Y_e[j + k * rowsY] ); -#else /* OPT_BASOP_ADD_v1 */ - x_idx = add( i, imult1616( k, rowsX ) ); /*Q0*/ - y_idx = add( j, imult1616( k, rowsY ) ); /*Q0*/ - //( *Zp ) += X_fx[i + k * rowsX] * Y_fx[j + k * rowsY]; - L_tmp = Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ); /*Q31 - (X_e + Y_e)*/ - tmp_e = add( X_e[x_idx], Y_e[y_idx] ); -#endif /* OPT_BASOP_ADD_v1 */ ( *Zp ) = BASOP_Util_Add_Mant32Exp( *Zp, *Zp_e, L_tmp, tmp_e, &tmp_e ); ( *Zp_e ) = tmp_e; @@ -1596,16 +1289,8 @@ Word16 matrix_product_mant_exp( move16(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 L_tmp = Mpy_32_32( X_fx[k + i * rowsX], Y_fx[j + k * rowsY] ); /*Q31 - (X_e + Y_e)*/ tmp_e = add( X_e[k + i * rowsX], Y_e[j + k * rowsY] ); -#else /* OPT_BASOP_ADD_v1 */ - x_idx = add( k, imult1616( i, rowsX ) ); /*Q0*/ - y_idx = add( j, imult1616( k, rowsY ) ); /*Q0*/ - //( *Zp ) += X_fx[k + i * rowsX] * Y_fx[j + k * rowsY]; - L_tmp = Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ); /*Q31 - (X_e + Y_e)*/ - tmp_e = add( X_e[x_idx], Y_e[y_idx] ); -#endif /* OPT_BASOP_ADD_v1 */ ( *Zp ) = BASOP_Util_Add_Mant32Exp( *Zp, *Zp_e, L_tmp, tmp_e, &tmp_e ); move32(); @@ -1635,16 +1320,8 @@ Word16 matrix_product_mant_exp( move16(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 L_tmp = Mpy_32_32( X_fx[i + k * rowsX], Y_fx[k + j * rowsY] ); /*Q31 - (X_e + Y_e)*/ tmp_e = add( X_e[i + k * rowsX], Y_e[k + j * rowsY] ); -#else /* OPT_BASOP_ADD_v1 */ - x_idx = add( i, imult1616( k, rowsX ) ); /*Q0*/ - y_idx = add( k, imult1616( j, rowsY ) ); /*Q0*/ - //( *Zp ) += X_fx[i + k * rowsX] * Y_fx[k + j * rowsY]; - L_tmp = Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ); /*Q31 - (X_e + Y_e)*/ - tmp_e = add( X_e[x_idx], Y_e[y_idx] ); -#endif /* OPT_BASOP_ADD_v1 */ ( *Zp ) = BASOP_Util_Add_Mant32Exp( *Zp, *Zp_e, L_tmp, tmp_e, &tmp_e ); move32(); @@ -1675,9 +1352,6 @@ Word16 matrix_diag_product_fx( { Word16 i, j; Word32 *Zp = Z; -#ifndef OPT_BASOP_ADD_v1 - Word16 tmp; -#endif /* OPT_BASOP_ADD_v1 */ /* Processing */ IF( EQ_16( transpX, 1 ) ) /* We use X transpose */ @@ -1690,12 +1364,7 @@ Word16 matrix_diag_product_fx( { FOR( i = 0; i < colsX; ++i ) { -#ifdef OPT_BASOP_ADD_v1 *( Zp ) = Mpy_32_32( X[j + i * rowsX], Y[j] ); /*Q31 - (X_e + Y_e)*/ -#else /* OPT_BASOP_ADD_v1 */ - tmp = add( j, imult1616( i, rowsX ) ); - *( Zp ) = Mpy_32_32( X[tmp], Y[j] ); /*Q31 - (X_e + Y_e)*/ -#endif /* OPT_BASOP_ADD_v1 */ move32(); Zp++; } @@ -1726,7 +1395,6 @@ Word16 matrix_diag_product_fx( return EXIT_SUCCESS; } -#ifdef OPT_BASOP_ADD_v1 Word16 matrix_diag_product_fx_2( const Word32 *X, /* i : left hand matrix Q31 - X_e*/ const Word16 X_e, @@ -1818,7 +1486,6 @@ Word16 matrix_diag_product_fx_2( return EXIT_SUCCESS; } -#endif /* OPT_BASOP_ADD_v1 */ Word16 matrix_diag_product_fx_1( const Word32 *X, /* i : left hand matrix Q31 - X_e*/ @@ -1835,9 +1502,6 @@ Word16 matrix_diag_product_fx_1( Word16 i, j; Word32 *Zp = Z; Word16 *Z_ep = Z_e; -#ifndef OPT_BASOP_ADD_v1 - Word16 tmp; -#endif /* OPT_BASOP_ADD_v1 */ /* Processing */ IF( EQ_16( transpX, 1 ) ) /* We use X transpose */ @@ -1850,19 +1514,10 @@ Word16 matrix_diag_product_fx_1( { FOR( i = 0; i < colsX; ++i ) { -#ifdef OPT_BASOP_ADD_v1 *( Zp ) = Mpy_32_32( X[j + i * rowsX], Y[j] ); /*Q31 - (X_e + Y_e)*/ -#else /* OPT_BASOP_ADD_v1 */ - tmp = add( j, imult1616( i, rowsX ) ); /*Q0*/ - *( Zp ) = Mpy_32_32( X[tmp], Y[j] ); /*Q31 - (X_e + Y_e)*/ -#endif /* OPT_BASOP_ADD_v1 */ move32(); Zp++; -#ifdef OPT_BASOP_ADD_v1 *( Z_ep ) = add( X_e[j + i * rowsX], Y_e[j] ); -#else /* OPT_BASOP_ADD_v1 */ - *( Z_ep ) = add( X_e[tmp], Y_e[j] ); -#endif /* OPT_BASOP_ADD_v1 */ move16(); Z_ep++; } @@ -1908,9 +1563,6 @@ Word16 diag_matrix_product_fx( { Word16 i, j; Word32 *Zp = Z; -#ifndef OPT_BASOP_ADD_v1 - Word16 tmp; -#endif /* OPT_BASOP_ADD_v1 */ /* Processing */ IF( EQ_16( transpX, 1 ) ) /* We use X transpose */ @@ -1923,12 +1575,7 @@ Word16 diag_matrix_product_fx( { FOR( j = 0; j < entriesY; ++j ) { -#ifdef OPT_BASOP_ADD_v1 *( Zp ) = Mpy_32_32( X[i + j * rowsX], Y[j] ); /*Q31 - (X_e + Y_e)*/ -#else /* OPT_BASOP_ADD_v1 */ - tmp = add( i, imult1616( j, rowsX ) ); /*Q0*/ - *( Zp ) = Mpy_32_32( X[tmp], Y[j] ); /*Q31 - (X_e + Y_e)*/ -#endif /* OPT_BASOP_ADD_v1 */ move32(); Zp++; } @@ -1974,9 +1621,6 @@ Word16 matrix_product_diag_fx( { Word16 j, k; Word32 *Zp = Z; -#ifndef OPT_BASOP_ADD_v1 - Word16 y_idx, x_idx; -#endif /* OPT_BASOP_ADD_v1 */ /* Processing */ test(); @@ -1995,13 +1639,7 @@ Word16 matrix_product_diag_fx( move32(); FOR( k = 0; k < rowsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 ( *Zp ) = Madd_32_32( ( *Zp ), X[k + j * rowsX], Y[k + j * rowsY] ); /*Q31 - (X_e + Y_e)*/ -#else /* OPT_BASOP_ADD_v1 */ - x_idx = add( k, imult1616( j, rowsX ) ); /*Q0*/ - y_idx = add( k, imult1616( j, rowsY ) ); /*Q0*/ - ( *Zp ) = L_add( ( *Zp ), Mpy_32_32( X[x_idx], Y[y_idx] ) ); /*Q31 - (X_e + Y_e)*/ -#endif /* OPT_BASOP_ADD_v1 */ move32(); } Zp++; @@ -2019,13 +1657,7 @@ Word16 matrix_product_diag_fx( move32(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 ( *Zp ) = Madd_32_32( ( *Zp ), X[j + k * rowsX], Y[j + k * rowsY] ); /*Q31 - (X_e + Y_e)*/ -#else /* OPT_BASOP_ADD_v1 */ - x_idx = add( j, imult1616( k, rowsX ) ); /*Q0*/ - y_idx = add( j, imult1616( k, rowsY ) ); /*Q0*/ - ( *Zp ) = L_add( ( *Zp ), Mpy_32_32( X[x_idx], Y[y_idx] ) ); /*Q31 - (X_e + Y_e)*/ -#endif /* OPT_BASOP_ADD_v1 */ move32(); } Zp++; @@ -2045,13 +1677,7 @@ Word16 matrix_product_diag_fx( move32(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 ( *Zp ) = Madd_32_32( ( *Zp ), X[k + j * rowsX], Y[j + k * rowsY] ); /*Q31 - (X_e + Y_e)*/ -#else /* OPT_BASOP_ADD_v1 */ - x_idx = add( k, imult1616( j, rowsX ) ); /*Q0*/ - y_idx = add( j, imult1616( k, rowsY ) ); /*Q0*/ - ( *Zp ) = L_add( ( *Zp ), Mpy_32_32( X[x_idx], Y[y_idx] ) ); /*Q31 - (X_e + Y_e)*/ -#endif /* OPT_BASOP_ADD_v1 */ move32(); } @@ -2071,13 +1697,7 @@ Word16 matrix_product_diag_fx( move32(); FOR( k = 0; k < colsX; ++k ) { -#ifdef OPT_BASOP_ADD_v1 ( *Zp ) = Madd_32_32( ( *Zp ), X[j + k * rowsX], Y[k + j * rowsY] ); /*Q31 - (X_e + Y_e)*/ -#else /* OPT_BASOP_ADD_v1 */ - x_idx = add( j, imult1616( k, rowsX ) ); /*Q0*/ - y_idx = add( k, imult1616( j, rowsY ) ); /*Q0*/ - ( *Zp ) = L_add( ( *Zp ), Mpy_32_32( X[x_idx], Y[y_idx] ) ); /*Q31 - (X_e + Y_e)*/ -#endif /* OPT_BASOP_ADD_v1 */ move32(); } Zp++; @@ -2176,7 +1796,7 @@ void v_multc_acc_32_16( FOR( i = 0; i < N; i++ ) { - y[i] = L_add( y[i], Mpy_32_16_1( x[i], c ) ); + y[i] = Madd_32_16( y[i], x[i], c ); move32(); } @@ -2193,7 +1813,7 @@ void v_multc_acc_32_32( FOR( i = 0; i < N; i++ ) { - y[i] = L_add( y[i], Mpy_32_32( x[i], c ) ); /*Qx*/ + y[i] = Madd_32_32( y[i], x[i], c ); /*Qx*/ move32(); } @@ -2329,25 +1949,6 @@ void lls_interp_n_fx( } -/* helper function for panning_wrap_angles */ -static float wrap_azi( - const float azi_deg ) -{ - float azi = azi_deg; - - /* Wrap azimuth value */ - while ( azi > 180 ) - { - azi -= 360.0f; - } - - while ( azi <= -180 ) - { - azi += 360; - } - - return azi; -} /* helper function for panning_wrap_angles */ static Word32 wrap_azi_fx( const Word32 azi_deg /* Q22 */ ) @@ -2368,73 +1969,8 @@ static Word32 wrap_azi_fx( return azi; /*Q22*/ } -/*-------------------------------------------------------------------* - * panning_wrap_angles() - * - * Wrap angles for amplitude panning to the range: - * azimuth = (-180, 180] - * elevation = [-90, 90] - * Considers direction changes from large elevation values - *-------------------------------------------------------------------*/ -void panning_wrap_angles( - const float azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ - const float ele_deg, /* i : elevation in degrees for panning direction (positive up) */ - float *azi_wrapped, /* o : wrapped azimuth component */ - float *ele_wrapped /* o : wrapped elevation component */ -) -{ - float azi, ele; - azi = azi_deg; - ele = ele_deg; - if ( fabsf( ele ) < 90 ) - { - *ele_wrapped = ele; - *azi_wrapped = wrap_azi( azi ); - return; - } - else - { - /* Special case when elevation is a multiple of 90; azimuth is irrelevant */ - if ( ( fmodf( ele, 90 ) == 0 ) && ( fmodf( ele, 180 ) != 0 ) ) - { - *azi_wrapped = 0; - while ( ele > 90 ) - { - ele -= 360; - } - while ( ele < -90 ) - { - ele += 360; - } - *ele_wrapped = ele; - } - else - { - /* Wrap elevation and adjust azimuth accordingly */ - while ( fabsf( ele ) > 90 ) - { - /* Flip to other hemisphere */ - azi += 180; - - /* Compensate elevation accordingly */ - if ( ele > 90 ) - { - ele = 180 - ele; - } - else if ( ele < -90 ) - { - ele = -180 - ele; - } - } - *azi_wrapped = wrap_azi( azi ); - *ele_wrapped = ele; - } - - return; - } -} /*-------------------------------------------------------------------* * panning_wrap_angles_fx() * @@ -2443,6 +1979,7 @@ void panning_wrap_angles( * elevation = [-90, 90] * Considers direction changes from large elevation values *-------------------------------------------------------------------*/ + void panning_wrap_angles_fx( const Word32 azi_deg, /* i : azimuth in degrees for panning direction (positive left) Q22 */ const Word32 ele_deg, /* i : elevation in degrees for panning direction (positive up) Q22 */ @@ -2514,11 +2051,11 @@ void panning_wrap_angles_fx( /*-------------------------------------------------------------------------* * v_sort_ind_fixed() * - * Sort a float array + * Sort a Word32 array * (modified version of v_sort() to return an index array) *-------------------------------------------------------------------------*/ -void v_sort_ind_fixed( +void v_sort_ind_fx( Word32 *x, /* i/o: Vector to be sorted Qx*/ Word16 *idx, /* o : Original index positions Q0*/ const Word16 len /* i : vector length Q0*/ @@ -2965,8 +2502,8 @@ Word16 ceil_log_2( Word64 var_32_fx( const Word32 *x, /* i : input vector q*/ - const Word16 len, /* i : length of inputvector Q0*/ - Word16 q /* q : q-factor for the array */ + const Word16 len, /* i : length of inputvector Q0*/ + Word16 q /* q : q-factor for the array */ ) { Word16 i; diff --git a/lib_com/ivas_transient_det_fx.c b/lib_com/ivas_transient_det_fx.c index 3b9a8cfd7ebf1e22ec6513d4a5f5229e53c9d53d..39dee9314d95f5acf0175589995418fc9918d52f 100644 --- a/lib_com/ivas_transient_det_fx.c +++ b/lib_com/ivas_transient_det_fx.c @@ -292,7 +292,7 @@ void ivas_transient_det_process_fx( ) { Word32 in_duck_gain[L_FRAME48k]; - Word16 num_sf, sf, sf_samp, idx; + Word16 num_sf, sf, sf_samp, idx, num_sf_log2; Word32 mem = hTranDet->in_duck_gain; /*Q30*/ move32(); @@ -309,7 +309,9 @@ void ivas_transient_det_process_fx( num_sf = 16; /*Q0*/ move16(); - sf_samp = idiv1616( frame_len, num_sf ); /*Q0*/ + num_sf_log2 = 4; /* To be used for shift operation instead of division */ + move16(); + sf_samp = shr( frame_len, num_sf_log2 ); /*Q0*/ FOR( sf = 1; sf <= num_sf; sf++ ) { idx = sub( imult1616( sf_samp, sf ), 1 ); @@ -353,7 +355,7 @@ static Word32 ivas_calc_duck_gain_fx( test(); IF( ( env_1 != 0 ) && ( env_2 != 0 ) ) { - L_tmp = BASOP_Util_Divide3232_Scale_cadence( env_1, env_2, &tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( env_1, env_2, &tmp_e ); L_tmp = L_shl( L_tmp, add( sub( env1_e, env2_e ), tmp_e ) ); duck_gain_out = Mpy_32_32( duck_mult_fac, L_tmp ); /*Q29*/ diff --git a/lib_com/lag_wind.c b/lib_com/lag_wind_fx.c similarity index 98% rename from lib_com/lag_wind.c rename to lib_com/lag_wind_fx.c index 9fb2872711d553565e75f883d9ddeafaef19cd40..3685cb834bc4ccf47e38ba6b5662c9919fc3158e 100644 --- a/lib_com/lag_wind.c +++ b/lib_com/lag_wind_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/lerp.c b/lib_com/lerp_fx.c similarity index 96% rename from lib_com/lerp.c rename to lib_com/lerp_fx.c index 4e306b93698eaff8917a518ff6f531615683af53..632593c6f10283a4c907e77b595b9f68ef8b094b 100644 --- a/lib_com/lerp.c +++ b/lib_com/lerp_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -132,13 +132,22 @@ void lerp( const Word16 *f /*Qx*/, Word16 *f_out /*Qx*/, Word16 bufferNewSize /* { lerp_proc( f, f_out, bufferNewSize, bufferOldSize ); } + + return; } + + /*-------------------------------------------------------------* * procedure lerp_proc() * * * * * *-------------------------------------------------------------*/ -static void lerp_proc( const Word16 *f /*Qx*/, Word16 *f_out /*Qx*/, Word16 bufferNewSize /*Q0*/, Word16 bufferOldSize /*Q0*/ ) + +static void lerp_proc( + const Word16 *f /*Qx*/, + Word16 *f_out /*Qx*/, + Word16 bufferNewSize /*Q0*/, + Word16 bufferOldSize /*Q0*/ ) { Word16 i, idx, n; @@ -236,7 +245,11 @@ static void lerp_proc( const Word16 *f /*Qx*/, Word16 *f_out /*Qx*/, Word16 buff } -static void lerp_proc32( Word32 *f /*Qx*/, Word32 *f_out /*Qx*/, Word16 bufferNewSize /*Q0*/, Word16 bufferOldSize /*Q0*/ ) +static void lerp_proc32( + Word32 *f /*Qx*/, + Word32 *f_out /*Qx*/, + Word16 bufferNewSize /*Q0*/, + Word16 bufferOldSize /*Q0*/ ) { Word16 i, idx, n; @@ -338,7 +351,12 @@ static void L_lerp_proc_fx( const Word32 *f_fx, Word32 *f_out_fx, const Word16 b * * *-------------------------------------------------------------*/ -void L_lerp_fx( Word32 *f /*q*/, Word32 *f_out /*q*/, Word16 bufferNewSize /*Q0*/, Word16 bufferOldSize /*Q0*/, Word16 *q ) +void L_lerp_fx( + Word32 *f /*q*/, + Word32 *f_out /*q*/, + Word16 bufferNewSize /*Q0*/, + Word16 bufferOldSize /*Q0*/, + Word16 *q ) { Word16 tmpNewSize; Word16 tmp1, tmp2, tmp_e; @@ -356,10 +374,6 @@ void L_lerp_fx( Word32 *f /*q*/, Word32 *f_out /*q*/, Word16 bufferNewSize /*Q0* f[ind] = L_shr( f[ind], guard_bits ); /*Q(guard_bits)*/ move32(); } -#ifndef MSAN_FIX - FOR( Word16 ind = 0; ind < bufferNewSize; ind++ ) - f_out[ind] = L_shr( f_out[ind], guard_bits ); -#endif } IF( GT_32( L_mult0( 128, bufferNewSize ), L_mult0( bufferOldSize, 507 ) ) ) diff --git a/lib_com/limit_t0_fx.c b/lib_com/limit_t0_fx.c index d3cff10d9733e7170b05ce287534cbfa63406be2..61eea907d538b486f3adf8c3222c0a395b1f17cf 100644 --- a/lib_com/limit_t0_fx.c +++ b/lib_com/limit_t0_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/log2.c b/lib_com/log2.c index 3df1a960ec4728e537d09f4aaa9a8eb0a13e1d32..70e6b93c00dd2b1203eee6c8e9801c05d3a0aadb 100644 --- a/lib_com/log2.c +++ b/lib_com/log2.c @@ -127,10 +127,8 @@ Word32 pow_10( Word32 x, Word16 *Q ) /*o : Q15, i: Q26*/ Word32 L_tmp; Word16 n1, i; Word16 count = 0; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif move16(); diff --git a/lib_com/longarith.c b/lib_com/longarith.c index 72a763de3dc933db4fae6d7de78b0893b436a2c9..a922c2b4a0afe55f50a81cc7c5d65ff43c74fcf5 100644 --- a/lib_com/longarith.c +++ b/lib_com/longarith.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -64,14 +64,14 @@ void longadd( assert( lena >= lenb ); for ( h = 0; h < lenb; h++ ) { - carry += ( (uint32_t) a[h] ) + ( (uint32_t) b[h] ); + carry += ( (UWord32) a[h] ) + ( (UWord32) b[h] ); a[h] = (UWord16) carry; carry = carry >> 16; } for ( ; h < lena; h++ ) { - carry = ( (uint32_t) a[h] ) + carry; + carry = ( (UWord32) a[h] ) + carry; a[h] = (UWord16) carry; carry = carry >> 16; } diff --git a/lib_com/low_rate_band_att_fx.c b/lib_com/low_rate_band_att_fx.c index 9958b9d5fdef77ec8782e1aaf261baa60b7111b0..8e7cef9d13cd272662af48fb8ae20b4ab37eb8b8 100644 --- a/lib_com/low_rate_band_att_fx.c +++ b/lib_com/low_rate_band_att_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -39,10 +39,6 @@ void ivas_fine_gain_pred_fx( Word16 tmp, exp, exp2; Word32 L_tmp; UWord16 lsb; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif FOR( band = 0; band < num_sfm; band++ ) { @@ -75,17 +71,13 @@ void ivas_fine_gain_pred_fx( L_tmp = L_shl( xx, exp ); /*2*(15-shift)+exp */ exp = sub( 31, add( exp, sub( 30, shl( shift, 1 ) ) ) ); L_tmp = Isqrt_lc( L_tmp, &exp ); /*31 - exp */ -#ifndef FIX_ISSUE_987 - Mpy_32_16_ss( L_tmp, ivas_fine_gain_pred_sqrt_bw[bw_idx], &L_tmp, &lsb ); /*31-exp+11-15=27-exp */ -#else Word16 norm = norm_s( bw ); Word16 tmp1, tmp_exp = sub( 15, norm ); tmp1 = Sqrt16( shl( bw, norm ), &tmp_exp ); tmp1 = shr( tmp1, sub( sub( 15, tmp_exp ), Q11 ) ); Mpy_32_16_ss( L_tmp, tmp1, &L_tmp, &lsb ); /*31-exp+11-15=27-exp */ -#endif - gp = round_fx_o( L_shl_o( L_tmp, add( 1, exp ), &Overflow ), &Overflow ); /*27-exp+1+exp-16=12 */ + gp = round_fx_sat( L_shl_sat( L_tmp, add( 1, exp ) ) ); /*27-exp+1+exp-16=12 */ test(); test(); IF( EQ_16( core, HQ_CORE ) && R != NULL && LE_16( R[i_sort[band]], 256 ) ) /* 256 is 32 in Q3 */ @@ -100,8 +92,8 @@ void ivas_fine_gain_pred_fx( exp = add( exp, exp2 ); /*gp *= 1.0f - 0.05f / accuracy; */ - tmp = div_s( 13107, accuracy ); /* 0.05 in Q18 */ - tmp = shr_o( tmp, sub( 34, exp ), &Overflow ); /*15+18-exp+16-15=34-exp */ + tmp = div_s( 13107, accuracy ); /* 0.05 in Q18 */ + tmp = shr_sat( tmp, sub( 34, exp ) ); /*15+18-exp+16-15=34-exp */ tmp = sub( 32767, tmp ); tmp = s_max( 27554, tmp ); /* Limit attenuation to norm quantizer error, 2^-0.25 in Q15 */ gp = mult_r( tmp, gp ); /*15+12+1-16=12 */ @@ -158,10 +150,6 @@ void fine_gain_pred_fx( Word16 tmp, exp, exp2; Word32 L_tmp; UWord16 lsb; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif FOR( band = 0; band < num_sfm; band++ ) { @@ -191,9 +179,9 @@ void fine_gain_pred_fx( exp = norm_l( xx ); L_tmp = L_shl( xx, exp ); /*2*(15-shift)+exp */ exp = sub( 31, add( exp, sub( 30, shl( shift, 1 ) ) ) ); - L_tmp = Isqrt_lc( L_tmp, &exp ); /*31 - exp */ - Mpy_32_16_ss( L_tmp, fine_gain_pred_sqrt_bw[bw_idx], &L_tmp, &lsb ); /*31-exp+11-15=27-exp */ - gp = round_fx_o( L_shl_o( L_tmp, add( 1, exp ), &Overflow ), &Overflow ); /*27-exp+1+exp-16=12 */ + L_tmp = Isqrt_lc( L_tmp, &exp ); /*31 - exp */ + Mpy_32_16_ss( L_tmp, fine_gain_pred_sqrt_bw[bw_idx], &L_tmp, &lsb ); /*31-exp+11-15=27-exp */ + gp = round_fx_sat( L_shl_sat( L_tmp, add( 1, exp ) ) ); /*27-exp+1+exp-16=12 */ test(); test(); IF( EQ_16( core, HQ_CORE ) && R != NULL && LE_16( R[i_sort[band]], 256 ) ) /* 256 is 32 in Q3 */ @@ -208,8 +196,8 @@ void fine_gain_pred_fx( exp = add( exp, exp2 ); /*gp *= 1.0f - 0.05f / accuracy; */ - tmp = div_s( 13107, accuracy ); /* 0.05 in Q18 */ - tmp = shr_o( tmp, sub( 34, exp ), &Overflow ); /*15+18-exp+16-15=34-exp */ + tmp = div_s( 13107, accuracy ); /* 0.05 in Q18 */ + tmp = shr_sat( tmp, sub( 34, exp ) ); /*15+18-exp+16-15=34-exp */ tmp = sub( 32767, tmp ); tmp = s_max( 27554, tmp ); /* Limit attenuation to norm quantizer error, 2^-0.25 in Q15 */ gp = mult_r( tmp, gp ); /*15+12+1-16=12 */ diff --git a/lib_com/lpc_tools_fx.c b/lib_com/lpc_tools_fx.c index bde05b4f4ebc1d9ab7a4ac99776af5f25b97036d..bb4cec6c21ea2cd1ef3a766595019c800d514b75 100644 --- a/lib_com/lpc_tools_fx.c +++ b/lib_com/lpc_tools_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -409,9 +409,6 @@ static Word32 Div_32_opt( Word32 L_num /*Q31*/, Word16 denom_hi /*Qx -16*/, Word { Word16 approx /*, hi, lo, n_hi , n_lo*/; Word32 L_32; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /* First approximation: 1 / L_denom = 1/denom_hi */ @@ -427,7 +424,7 @@ static Word32 Div_32_opt( Word32 L_num /*Q31*/, Word16 denom_hi /*Qx -16*/, Word L_32 = Mpy_32_32( L_num, L_32 ); - L_32 = L_shl_o( L_32, 2, &Overflow ); + L_32 = L_shl_sat( L_32, 2 ); return ( L_32 ); } @@ -463,10 +460,6 @@ Word16 E_LPC_lev_dur_stab( const Word16 Rh[] /*QR -16*/, const Word16 Rl[] /*QR Word32 t0, t1, t2; /* temporary variables */ Word16 flag; Word16 Ah[TCXLTP_LTP_ORDER + 1], Al[TCXLTP_LTP_ORDER + 1]; /* LPC coef. in double prec. */ -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - BASOP_SATURATE_WARNING_OFF_EVS if ( epsP != NULL ) @@ -526,12 +519,12 @@ Word16 E_LPC_lev_dur_stab( const Word16 Rh[] /*QR -16*/, const Word16 Rl[] /*QR t0 = Mac_32( t0, Rh[j], Rl[j], Ah[i - j], Al[i - j] ); } - t0 = L_shl_o( t0, 4, &Overflow ); /* result in Q27 -> convert to Q31 */ - /* No overflow possible */ + t0 = L_shl_sat( t0, 4 ); /* result in Q27 -> convert to Q31 */ + /* No overflow possible */ /* Compose and add R[i] in Q3 */ - t0 = L_mac_o( t0, Rl[i], 1, &Overflow ); - t0 = L_msu_o( t0, Rh[i], -32768, &Overflow ); + t0 = L_mac_sat( t0, Rl[i], 1 ); + t0 = L_msu_sat( t0, Rh[i], -32768 ); /* K = -t0 / Alpha */ t1 = L_abs( t0 ); @@ -546,7 +539,7 @@ Word16 E_LPC_lev_dur_stab( const Word16 Rh[] /*QR -16*/, const Word16 Rl[] /*QR { t2 = L_negate( t2 ); /* K =-t0/Alpha */ } - t2 = L_shl_o( t2, alp_exp, &Overflow ); /* denormalize; compare to Alpha */ + t2 = L_shl_sat( t2, alp_exp ); /* denormalize; compare to Alpha */ test(); if ( ( mem != NULL ) && ( ( GT_16( abs_s( extract_h( t2 ) ), k_max ) ) ) ) { @@ -563,7 +556,7 @@ Word16 E_LPC_lev_dur_stab( const Word16 Rh[] /*QR -16*/, const Word16 Rl[] /*QR /*------------------------------------------* * Compute new LPC coeff. -> An[i] - * An[j]= A[j] + K*A[i-j] , j=1 to i-1 + * An[j]= A[j] + K*A[i-j], j=1 to i-1 * An[i]= K *------------------------------------------*/ @@ -585,7 +578,7 @@ Word16 E_LPC_lev_dur_stab( const Word16 Rh[] /*QR -16*/, const Word16 Rl[] /*QR L_Extract( t2, &Ah[i], &Al[i] ); /* An[i] in Q27 */ /* Alpha = Alpha * (1-K**2) */ - t1 = L_mult_o( Kh, Kh, &Overflow ); /* K*K in Q31 */ + t1 = L_mult_sat( Kh, Kh ); /* K*K in Q31 */ t0 = L_mac( t1, mult( Kh, Kl ), 2 ); t0 = L_abs( t0 ); /* Some case <0 !! */ t0 = L_sub( (Word32) 0x7fffffffL, t0 ); /* 1 - K*K in Q31 */ @@ -621,7 +614,7 @@ Word16 E_LPC_lev_dur_stab( const Word16 Rh[] /*QR -16*/, const Word16 Rl[] /*QR FOR( i = 1; i <= order; i++ ) { t0 = L_Comp( Ah[i], Al[i] ); - A[i] = round_fx_o( L_shl_o( t0, k, &Overflow ), &Overflow ); + A[i] = round_fx_sat( L_shl_sat( t0, k ) ); move16(); } @@ -657,10 +650,6 @@ Word16 E_LPC_lev_dur_stab_ivas_fx( const Word16 Rh[], const Word16 Rl[], Word16 Word32 t0, t1, t2; /* temporary variables */ Word16 flag; Word16 Ah[TCXLTP_LTP_ORDER + 1], Al[TCXLTP_LTP_ORDER + 1]; /* LPC coef. in double prec. */ -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - BASOP_SATURATE_WARNING_OFF_EVS if ( epsP != NULL ) @@ -720,12 +709,12 @@ Word16 E_LPC_lev_dur_stab_ivas_fx( const Word16 Rh[], const Word16 Rl[], Word16 t0 = Mac_32( t0, Rh[j], Rl[j], Ah[i - j], Al[i - j] ); } - t0 = L_shl_o( t0, 4, &Overflow ); /* result in Q27 -> convert to Q31 */ - /* No overflow possible */ + t0 = L_shl_sat( t0, 4 ); /* result in Q27 -> convert to Q31 */ + /* No overflow possible */ /* Compose and add R[i] in Q3 */ - t0 = L_mac_o( t0, Rl[i], 1, &Overflow ); - t0 = L_msu_o( t0, Rh[i], -32768, &Overflow ); + t0 = L_mac_sat( t0, Rl[i], 1 ); + t0 = L_msu_sat( t0, Rh[i], -32768 ); /* K = -t0 / Alpha */ t1 = L_abs( t0 ); @@ -740,7 +729,7 @@ Word16 E_LPC_lev_dur_stab_ivas_fx( const Word16 Rh[], const Word16 Rl[], Word16 { t2 = L_negate( t2 ); /* K =-t0/Alpha */ } - t2 = L_shl_o( t2, alp_exp, &Overflow ); /* denormalize; compare to Alpha */ + t2 = L_shl_sat( t2, alp_exp ); /* denormalize; compare to Alpha */ test(); if ( ( mem != NULL ) && ( ( GT_16( abs_s( extract_h( t2 ) ), k_max ) ) ) ) { @@ -757,7 +746,7 @@ Word16 E_LPC_lev_dur_stab_ivas_fx( const Word16 Rh[], const Word16 Rl[], Word16 /*------------------------------------------* * Compute new LPC coeff. -> An[i] - * An[j]= A[j] + K*A[i-j] , j=1 to i-1 + * An[j]= A[j] + K*A[i-j], j=1 to i-1 * An[i]= K *------------------------------------------*/ @@ -779,7 +768,7 @@ Word16 E_LPC_lev_dur_stab_ivas_fx( const Word16 Rh[], const Word16 Rl[], Word16 L_Extract( t2, &Ah[i], &Al[i] ); /* An[i] in Q27 */ /* Alpha = Alpha * (1-K**2) */ - t1 = L_mult_o( Kh, Kh, &Overflow ); /* K*K in Q31 */ + t1 = L_mult_sat( Kh, Kh ); /* K*K in Q31 */ t0 = L_mac( t1, mult( Kh, Kl ), 2 ); t0 = L_abs( t0 ); /* Some case <0 !! */ t0 = L_sub( (Word32) 0x7fffffffL, t0 ); /* 1 - K*K in Q31 */ @@ -815,7 +804,7 @@ Word16 E_LPC_lev_dur_stab_ivas_fx( const Word16 Rh[], const Word16 Rl[], Word16 FOR( i = 1; i <= order; i++ ) { t0 = L_Comp( Ah[i], Al[i] ); - A[i] = round_fx_o( L_shl_o( t0, k, &Overflow ), &Overflow ); + A[i] = round_fx_sat( L_shl_sat( t0, k ) ); move16(); } @@ -851,11 +840,6 @@ Word16 E_LPC_lev_dur_stab_fx( const Word16 Rh[] /*QR -16*/, const Word16 Rl[] /* Word32 t0, t1, t2; /* temporary variables */ Word16 flag; Word16 Ah[TCXLTP_LTP_ORDER + 1], Al[TCXLTP_LTP_ORDER + 1]; /* LPC coef. in double prec. */ -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - BASOP_SATURATE_WARNING_OFF_EVS if ( epsP != NULL ) @@ -915,12 +899,12 @@ Word16 E_LPC_lev_dur_stab_fx( const Word16 Rh[] /*QR -16*/, const Word16 Rl[] /* t0 = Mac_32( t0, Rh[j], Rl[j], Ah[i - j], Al[i - j] ); } - t0 = L_shl_o( t0, 4, &Overflow ); /* result in Q27 -> convert to Q31 */ - /* No overflow possible */ + t0 = L_shl_sat( t0, 4 ); /* result in Q27 -> convert to Q31 */ + /* No overflow possible */ /* Compose and add R[i] in Q3 */ - t0 = L_mac_o( t0, Rl[i], 1, &Overflow ); - t0 = L_msu_o( t0, Rh[i], -32768, &Overflow ); + t0 = L_mac_sat( t0, Rl[i], 1 ); + t0 = L_msu_sat( t0, Rh[i], -32768 ); /* K = -t0 / Alpha */ t1 = L_abs( t0 ); @@ -935,7 +919,7 @@ Word16 E_LPC_lev_dur_stab_fx( const Word16 Rh[] /*QR -16*/, const Word16 Rl[] /* { t2 = L_negate( t2 ); /* K =-t0/Alpha */ } - t2 = L_shl_o( t2, alp_exp, &Overflow ); /* denormalize; compare to Alpha */ + t2 = L_shl_sat( t2, alp_exp ); /* denormalize; compare to Alpha */ test(); if ( ( mem != NULL ) && ( ( GT_16( abs_s( extract_h( t2 ) ), k_max ) ) ) ) { @@ -952,7 +936,7 @@ Word16 E_LPC_lev_dur_stab_fx( const Word16 Rh[] /*QR -16*/, const Word16 Rl[] /* /*------------------------------------------* * Compute new LPC coeff. -> An[i] - * An[j]= A[j] + K*A[i-j] , j=1 to i-1 + * An[j]= A[j] + K*A[i-j], j=1 to i-1 * An[i]= K *------------------------------------------*/ @@ -974,7 +958,7 @@ Word16 E_LPC_lev_dur_stab_fx( const Word16 Rh[] /*QR -16*/, const Word16 Rl[] /* L_Extract( t2, &Ah[i], &Al[i] ); /* An[i] in Q27 */ /* Alpha = Alpha * (1-K**2) */ - t1 = L_mult_o( Kh, Kh, &Overflow ); /* K*K in Q31 */ + t1 = L_mult_sat( Kh, Kh ); /* K*K in Q31 */ t0 = L_mac( t1, mult( Kh, Kl ), 2 ); t0 = L_abs( t0 ); /* Some case <0 !! */ t0 = L_sub( (Word32) 0x7fffffffL, t0 ); /* 1 - K*K in Q31 */ @@ -1010,7 +994,7 @@ Word16 E_LPC_lev_dur_stab_fx( const Word16 Rh[] /*QR -16*/, const Word16 Rl[] /* FOR( i = 1; i <= order; i++ ) { t0 = L_Comp( Ah[i], Al[i] ); - A[i] = L_shl_o( t0, k, &Overflow ); + A[i] = L_shl_sat( t0, k ); move16(); } @@ -1114,7 +1098,7 @@ static void lsp_reorder( { lsp[i] = s_max( lsp[i], lsp_min ); move16(); - lsp_min = add( lsp[i], min_dist ); + lsp_min = add_sat( lsp[i], min_dist ); } /* Reverify the LSF ordering and minimum GAP in the reverse order (security) */ @@ -1478,11 +1462,6 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs /*Qx*/, Word16 *lsf /*15Q16*/ Word16 lpc[19]; move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - /* half length FFT */ scale = add( norm_s( lpcCoeffs[0] ), 1 ) + 5; move16(); @@ -1656,9 +1635,9 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs /*Qx*/, Word16 *lsf /*15Q16*/ Word16 ImAr = extract_h( L_sub( ImagFFT[i], ImagFFT[N / 2 - i] ) ); Word16 ImBr = extract_h( L_add( ImagFFT[i], ImagFFT[N / 2 - i] ) ); BASOP_SATURATE_WARNING_OFF_EVS - tmpw15.v.re = mac_ro( L_mult( ptwiddle->v.re, pwn17->v.re ), ptwiddle->v.im, pwn17->v.im, &Overflow ); + tmpw15.v.re = mac_r_sat( L_mult( ptwiddle->v.re, pwn17->v.re ), ptwiddle->v.im, pwn17->v.im ); move16(); - tmpw15.v.im = msu_ro( L_mult( ptwiddle->v.re, pwn17->v.im ), ptwiddle->v.im, pwn17->v.re, &Overflow ); + tmpw15.v.im = msu_r_sat( L_mult( ptwiddle->v.re, pwn17->v.im ), ptwiddle->v.im, pwn17->v.re ); move16(); BASOP_SATURATE_WARNING_ON_EVS RealOut[i] = mac_r( L_msu( L_msu( L_mult( ReAr, pwn17->v.re ), ImAr, pwn17->v.im ), ReBr, pwn15->v.im ), ImBr, pwn15->v.re ); @@ -1666,9 +1645,9 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs /*Qx*/, Word16 *lsf /*15Q16*/ ImagOut[i] = mac_r( L_mac( L_mac( L_mult( ReAr, pwn17->v.im ), ImAr, pwn17->v.re ), ReBr, pwn15->v.re ), ImBr, pwn15->v.im ); move16(); BASOP_SATURATE_WARNING_OFF_EVS - tmpw15.v.re = msu_ro( L_mult( ptwiddle->v.im, pwn17i->v.im ), ptwiddle->v.re, pwn17i->v.re, &Overflow ); + tmpw15.v.re = msu_r_sat( L_mult( ptwiddle->v.im, pwn17i->v.im ), ptwiddle->v.re, pwn17i->v.re ); move16(); - tmpw15.v.im = mac_ro( L_mult( ptwiddle->v.re, pwn17i->v.im ), ptwiddle->v.im, pwn17i->v.re, &Overflow ); + tmpw15.v.im = mac_r_sat( L_mult( ptwiddle->v.re, pwn17i->v.im ), ptwiddle->v.im, pwn17i->v.re ); move16(); BASOP_SATURATE_WARNING_ON_EVS RealOut[N / 2 - i] = msu_r( L_mac( L_mac( L_mult( ReAr, pwn17i->v.re ), ImAr, pwn17i->v.im ), ImBr, pwn15i->v.re ), ReBr, pwn15i->v.im ); @@ -1690,9 +1669,9 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs /*Qx*/, Word16 *lsf /*15Q16*/ Word16 ImAr = extract_h( L_sub( ImagFFT[i], ImagFFT[N / 2 - i] ) ); Word16 ImBr = extract_h( L_add( ImagFFT[i], ImagFFT[N / 2 - i] ) ); BASOP_SATURATE_WARNING_OFF_EVS - tmpw15.v.re = mac_ro( L_mult( ptwiddle->v.im, pwn17->v.re ), ptwiddle->v.re, pwn17->v.im, &Overflow ); + tmpw15.v.re = mac_r_sat( L_mult( ptwiddle->v.im, pwn17->v.re ), ptwiddle->v.re, pwn17->v.im ); move16(); - tmpw15.v.im = msu_ro( L_mult( ptwiddle->v.im, pwn17->v.im ), ptwiddle->v.re, pwn17->v.re, &Overflow ); + tmpw15.v.im = msu_r_sat( L_mult( ptwiddle->v.im, pwn17->v.im ), ptwiddle->v.re, pwn17->v.re ); move16(); BASOP_SATURATE_WARNING_ON_EVS RealOut[i] = mac_r( L_msu( L_msu( L_mult( ReAr, pwn17->v.re ), ImAr, pwn17->v.im ), ReBr, pwn15->v.im ), ImBr, pwn15->v.re ); @@ -1700,9 +1679,9 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs /*Qx*/, Word16 *lsf /*15Q16*/ ImagOut[i] = mac_r( L_mac( L_mac( L_mult( ReAr, pwn17->v.im ), ImAr, pwn17->v.re ), ReBr, pwn15->v.re ), ImBr, pwn15->v.im ); move16(); BASOP_SATURATE_WARNING_OFF_EVS - tmpw15.v.re = msu_ro( L_mult( ptwiddle->v.re, pwn17i->v.im ), ptwiddle->v.im, pwn17i->v.re, &Overflow ); + tmpw15.v.re = msu_r_sat( L_mult( ptwiddle->v.re, pwn17i->v.im ), ptwiddle->v.im, pwn17i->v.re ); move16(); - tmpw15.v.im = mac_ro( L_mult( ptwiddle->v.im, pwn17i->v.im ), ptwiddle->v.re, pwn17i->v.re, &Overflow ); + tmpw15.v.im = mac_r_sat( L_mult( ptwiddle->v.im, pwn17i->v.im ), ptwiddle->v.re, pwn17i->v.re ); move16(); BASOP_SATURATE_WARNING_ON_EVS RealOut[N / 2 - i] = msu_r( L_mac( L_mac( L_mult( ReAr, pwn17i->v.re ), ImAr, pwn17i->v.im ), ImBr, pwn15i->v.re ), ReBr, pwn15i->v.im ); diff --git a/lib_com/lsf_dec_bfi_fx.c b/lib_com/lsf_dec_bfi_fx.c index 33de5d9ac09d01ac656426a142cbec602cb610c9..491802f6be544fd1891f4105ca6e80ae2bd7e2da 100644 --- a/lib_com/lsf_dec_bfi_fx.c +++ b/lib_com/lsf_dec_bfi_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ diff --git a/lib_com/lsf_msvq_ma_fx.c b/lib_com/lsf_msvq_ma_fx.c index 6f8ea44c2866d7d545400846520d544efc8415ed..d705177fc3591440db44305e2d8f179f84b9d6d4 100644 --- a/lib_com/lsf_msvq_ma_fx.c +++ b/lib_com/lsf_msvq_ma_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/lsf_tools_fx.c b/lib_com/lsf_tools_fx.c index 08e74b9b70f054c4fe9a9dd5edc642707c1a92b5..e4dbd7e2a9530e465ca94197dd625124167ee4ae 100644 --- a/lib_com/lsf_tools_fx.c +++ b/lib_com/lsf_tools_fx.c @@ -69,9 +69,6 @@ static Word16 chebyshev( Word16 x, Word32 *f, const Word16 n, const Word16 shift Word16 cheb; Word32 t0, b1, b2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif cheb = norm_s( x ); if ( cheb ) @@ -109,15 +106,15 @@ static Word16 chebyshev( Word16 x, Word32 *f, const Word16 n, const Word16 shift /* i = 5 */ t0 = Mpy_32_16_1( b2, x ); /* t0 = x*b1 */ if ( !cheb ) - t0 = L_shl_o( t0, 1, &Overflow ); /* t0 = 2*x*b1 */ - t0 = L_sub( t0, b1 ); /* t0 = 2*x*b1 - b2 */ - b1 = L_add( t0, *f++ ); /* b0 = 2*x*b1 - b2 + f[i] */ + t0 = L_shl_sat( t0, 1 ); /* t0 = 2*x*b1 */ + t0 = L_sub( t0, b1 ); /* t0 = 2*x*b1 - b2 */ + b1 = L_add( t0, *f++ ); /* b0 = 2*x*b1 - b2 + f[i] */ /* i = 6 */ t0 = Mpy_32_16_1( b1, x ); /* t0 = x*b1 */ if ( !cheb ) - t0 = L_shl_o( t0, 1, &Overflow ); /* t0 = 2*x*b1 */ - t0 = L_sub( t0, b2 ); /* t0 = 2*x*b1 - b2 */ + t0 = L_shl_sat( t0, 1 ); /* t0 = 2*x*b1 */ + t0 = L_sub( t0, b2 ); /* t0 = 2*x*b1 - b2 */ } /* IF (sub(n,8) == 0) */ IF( n == 8 ) @@ -126,9 +123,9 @@ static Word16 chebyshev( Word16 x, Word32 *f, const Word16 n, const Word16 shift /* i = 7 */ t0 = Mpy_32_16_1( b2, x ); /* t0 = x*b1 */ if ( !cheb ) - t0 = L_shl_o( t0, 1, &Overflow ); /* t0 = 2*x*b1 */ - t0 = L_sub( t0, b1 ); /* t0 = 2*x*b1 - b2 */ - /*b1 = L_add(b2,0);*/ + t0 = L_shl_sat( t0, 1 ); /* t0 = 2*x*b1 */ + t0 = L_sub( t0, b1 ); /* t0 = 2*x*b1 - b2 */ + /*b1 = L_add(b2,0);*/ } ELSE { @@ -146,9 +143,9 @@ static Word16 chebyshev( Word16 x, Word32 *f, const Word16 n, const Word16 shift BASOP_SATURATE_WARNING_OFF_EVS - t0 = L_shl_o( t0, shift, &Overflow ); /* Qx to Q30 with saturation */ - cheb = round_fx_o( t0, &Overflow ); /* Result in Q14 */ - cheb = s_max( -32767, cheb ); /* to avoid saturation */ + t0 = L_shl_sat( t0, shift ); /* Qx to Q30 with saturation */ + cheb = round_fx_sat( t0 ); /* Result in Q14 */ + cheb = s_max( -32767, cheb ); /* to avoid saturation */ BASOP_SATURATE_WARNING_ON_EVS return ( cheb ); } @@ -162,9 +159,6 @@ void E_LPC_a_isp_conversion( const Word16 a[], Word16 isp[], const Word16 old_is Word32 t0, t1; Word16 scale = 1024; move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /*-------------------------------------------------------------* * find the sum and diff polynomials F1(z) and F2(z) @@ -286,7 +280,7 @@ void E_LPC_a_isp_conversion( const Word16 a[], Word16 isp[], const Word16 old_is * xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow) *--------------------------------------------------------*/ - y = sub_o( yhigh, ylow, &Overflow ); + y = sub_sat( yhigh, ylow ); IF( y != 0 ) { x = sub( xhigh, xlow ); @@ -360,9 +354,7 @@ void E_LPC_f_isp_a_conversion( const Word16 *isp, Word16 *a, const Word16 m ) Word32 f1[NC_MAX + 1], f2[NC_MAX + 1]; /* Q23 */ Word16 nc, q; Word32 t0, tmax, t0p, t0n; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; -#endif /*-----------------------------------------------------* @@ -604,7 +596,6 @@ Word16 lpc2lsp_fx( return ( 1 ); } -#ifdef FIX_ISSUE_1165 /*===================================================================*/ /* FUNCTION : lpc2lsp_ivas_fx () */ /*-------------------------------------------------------------------*/ @@ -749,7 +740,6 @@ Word16 lpc2lsp_ivas_fx( return ( 1 ); } -#endif /*===================================================================*/ /* FUNCTION : lsp2lpc_fx () */ @@ -785,9 +775,7 @@ void lsp2lpc_fx( Word16 tmp_pci[M + 1]; Word16 giOverflow; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; -#endif FOR( i = 0; i < order; i++ ) { @@ -964,10 +952,8 @@ Word16 E_LPC_f_lsp_pol_get( const Word16 lsp[], Word32 f[], const Word16 n, cons Word16 Q_out; Word16 m2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move16(); -#endif Q_out = 31 - 23; move16(); @@ -1217,17 +1203,16 @@ void E_LPC_a_lsp_conversion( * Returns: * void */ -void E_LPC_f_lsp_a_conversion( const Word16 *lsp, Word16 *a, const Word16 m ) +void E_LPC_f_lsp_a_conversion( + const Word16 *lsp, + Word16 *a, + const Word16 m ) { Word16 i, j, k; Word32 f1[NC_MAX + 1], f2[NC_MAX + 1]; Word16 nc; Word32 t0; Word16 Ovf, Ovf2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - /*-----------------------------------------------------* * Find the polynomials F1(z) and F2(z) * @@ -1257,7 +1242,7 @@ void E_LPC_f_lsp_a_conversion( const Word16 *lsp, Word16 *a, const Word16 m ) { f1[nc - i] = L_add( f1[nc - i], f1[nc - i - 1] ); move32(); - f2[nc - i] = L_sub_o( f2[nc - i], f2[nc - i - 1], &Overflow ); + f2[nc - i] = L_sub_sat( f2[nc - i], f2[nc - i - 1] ); move32(); } @@ -1269,8 +1254,8 @@ void E_LPC_f_lsp_a_conversion( const Word16 *lsp, Word16 *a, const Word16 m ) t0 = L_deposit_l( 0 ); FOR( i = 1; i <= nc; i++ ) { - t0 = L_max( t0, L_abs( L_add_o( f1[i], f2[i], &Overflow ) ) ); - t0 = L_max( t0, L_abs( L_sub_o( f1[i], f2[i], &Overflow ) ) ); + t0 = L_max( t0, L_abs( L_add_sat( f1[i], f2[i] ) ) ); + t0 = L_max( t0, L_abs( L_sub_sat( f1[i], f2[i] ) ) ); } k = s_min( norm_l( t0 ), 6 ); a[0] = shl( 256, k ); @@ -1285,14 +1270,14 @@ void E_LPC_f_lsp_a_conversion( const Word16 *lsp, Word16 *a, const Word16 m ) FOR( i = 1; i <= nc; i++ ) { /* a[i] = 0.5*(f1[i] + f2[i]) */ - t0 = L_add_o( f1[i], f2[i], &Overflow ); + t0 = L_add_sat( f1[i], f2[i] ); t0 = L_shl( t0, k ); - a[i] = round_fx_o( t0, &Overflow ); /* from Q23 to Qx and * 0.5 */ + a[i] = round_fx_sat( t0 ); /* from Q23 to Qx and * 0.5 */ /* a[j] = 0.5*(f1[i] - f2[i]) */ - t0 = L_sub_o( f1[i], f2[i], &Overflow ); + t0 = L_sub_sat( f1[i], f2[i] ); t0 = L_shl( t0, k ); - a[j] = round_fx_o( t0, &Overflow ); /* from Q23 to Qx and * 0.5 */ + a[j] = round_fx_sat( t0 ); /* from Q23 to Qx and * 0.5 */ j--; } @@ -1736,9 +1721,7 @@ void a2rc_fx( const Word16 *a, /* i: can be any Q */ Word16 m, j, n; Word16 q, q_a, q_a2, One_Qx; Word32 One_Qx2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif + q = add( norm_s( a[-1] ), 1 ); q_a = sub( 15, q ); q_a2 = add( shl( q_a, 1 ), 1 ); @@ -1798,22 +1781,22 @@ void a2rc_fx( const Word16 *a, /* i: can be any Q */ FOR( j = 0; j < m / 2; j++ ) { n = sub( sub( m, (Word16) 1 ), j ); - L_tmp1 = L_mult( denom_mant, f_fx[j] ); /* denom*f[j]. Q15*Q12 = Q28 (floating with exp) */ - L_tmp1 = L_mac_o( L_tmp1, tmp, f_fx[n], &Overflow ); /* denom*f[j]+km*denom*f[n] in Q28 (floating with exp) */ - L_tmp2 = L_mult( denom_mant, f_fx[n] ); /* denom*f[n]. Q15*Q12 = Q28 (floating with exp) */ - L_tmp2 = L_mac_o( L_tmp2, tmp, f_fx[j], &Overflow ); /* denom*f[n]+km*denom*f[j] in Q28 (floating with exp) */ - L_tmp1 = L_shr_o( L_tmp1, exp, &Overflow ); /* bringing to true Q28 */ - L_tmp2 = L_shr_o( L_tmp2, exp, &Overflow ); /* bringing to true Q28 */ - f_fx[j] = round_fx_o( L_tmp1, &Overflow ); /* extracting in q_a */ - f_fx[n] = round_fx_o( L_tmp2, &Overflow ); /* extracting in q_a */ + L_tmp1 = L_mult( denom_mant, f_fx[j] ); /* denom*f[j]. Q15*Q12 = Q28 (floating with exp) */ + L_tmp1 = L_mac_sat( L_tmp1, tmp, f_fx[n] ); /* denom*f[j]+km*denom*f[n] in Q28 (floating with exp) */ + L_tmp2 = L_mult( denom_mant, f_fx[n] ); /* denom*f[n]. Q15*Q12 = Q28 (floating with exp) */ + L_tmp2 = L_mac_sat( L_tmp2, tmp, f_fx[j] ); /* denom*f[n]+km*denom*f[j] in Q28 (floating with exp) */ + L_tmp1 = L_shr_sat( L_tmp1, exp ); /* bringing to true Q28 */ + L_tmp2 = L_shr_sat( L_tmp2, exp ); /* bringing to true Q28 */ + f_fx[j] = round_fx_sat( L_tmp1 ); /* extracting in q_a */ + f_fx[n] = round_fx_sat( L_tmp2 ); /* extracting in q_a */ } IF( m & 1 ) { - L_tmp1 = L_mult( denom_mant, f_fx[j] ); /* denom*f[j]. Q15*Q12 = Q28 (floating with exp) */ - L_tmp1 = L_mac_o( L_tmp1, tmp, f_fx[j], &Overflow ); /* denom*f[j]+km*denom*f[j] in Q28 (floating with exp) */ - L_tmp1 = L_shr_o( L_tmp1, exp, &Overflow ); /* bringing to true Q28 */ - f_fx[j] = round_fx_o( L_tmp1, &Overflow ); /* extracting in q_a */ + L_tmp1 = L_mult( denom_mant, f_fx[j] ); /* denom*f[j]. Q15*Q12 = Q28 (floating with exp) */ + L_tmp1 = L_mac_sat( L_tmp1, tmp, f_fx[j] ); /* denom*f[j]+km*denom*f[j] in Q28 (floating with exp) */ + L_tmp1 = L_shr_sat( L_tmp1, exp ); /* bringing to true Q28 */ + f_fx[j] = round_fx_sat( L_tmp1 ); /* extracting in q_a */ move16(); } } @@ -2266,9 +2249,6 @@ Word16 lsf_stab_fx( /* o : LP filter stability Q15*/ Word16 i, m; Word32 L_tmp; Word16 tmp, e; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /*-------------------------------------------------------------------* * Check stability on lsf: distance between old lsf and current lsf @@ -2313,10 +2293,10 @@ Word16 lsf_stab_fx( /* o : LP filter stability Q15*/ } e = sub( 30 - 21 - 1, e ); - tmp = round_fx_o( L_shl_o( L_tmp, e, &Overflow ), &Overflow ); /*Q14*/ + tmp = round_fx_sat( L_shl_sat( L_tmp, e ) ); /*Q14*/ - tmp = sub( 20480, tmp ); /* 1.25 - tmp in Q14 */ - tmp = shl_o( tmp, 1, &Overflow ); /* Q14 -> Q15 with saturation */ + tmp = sub( 20480, tmp ); /* 1.25 - tmp in Q14 */ + tmp = shl_sat( tmp, 1 ); /* Q14 -> Q15 with saturation */ tmp = s_max( tmp, 0 ); @@ -2353,9 +2333,6 @@ Word16 lsf_stab_ivas_fx( /* o : LP filter stability Word16 i, m; Word32 L_tmp; Word16 tmp, e; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /*-------------------------------------------------------------------* * Check stability on lsf: distance between old lsf and current lsf @@ -2406,7 +2383,7 @@ Word16 lsf_stab_ivas_fx( /* o : LP filter stability } e = sub( 30 - 21 - 1, e ); - tmp = round_fx_o( L_shl_o( L_tmp, e, &Overflow ), &Overflow ); /*Q12*/ + tmp = round_fx_sat( L_shl_sat( L_tmp, e ) ); /*Q12*/ // tmp = sub(20480, tmp); /* 1.25 - tmp in Q14 */ tmp = sub( 5120, tmp ); /* 1.25 - tmp in Q12 */ @@ -2865,40 +2842,39 @@ Word16 qlsf_ARSN_tcvq_Dec_16k_fx( } /*======================================================================*/ -/* FUNCTION : lsf_syn_mem_backup_fx */ +/* FUNCTION : lsf_syn_mem_backup_fx */ /*----------------------------------------------------------------------*/ /* PURPOSE : back-up synthesis filter memory and LSF qunatizer memories */ /*----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16*) lsp_new : LSP vector to quantize */ -/* _ (Word16*) lsf_new : quantized LSF vector */ -/* _ (Word16*) lsp_mid : mid-frame LSP vector */ -/* _ (Encoder_State) st_fx : Encoder state Structure */ -/*-----------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _None */ -/*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16) clip_var : pitch clipping state var */ -/* _ (Word16*) mem_AR : quantizer memory for AR model */ -/* _ (Word16*) mem_MA : quantizer memory for MA model */ -/* _ (Word16*) lsp_new_bck : LSP vector to quantize- backup */ -/* _ (Word16*) lsf_new_bck : quantized LSF vector - backup */ -/* _ (Word16*) lsp_mid_bck : mid-frame LSP vector - backup */ +/* INPUT ARGUMENTS : */ +/* _ (Word16*) lsp_new : LSP vector to quantize */ +/* _ (Word16*) lsf_new : quantized LSF vector */ +/* _ (Word16*) lsp_mid : mid-frame LSP vector */ +/* _ (Encoder_State) st_fx : Encoder state Structure */ +/*----------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _None */ +/*----------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16) clip_var : pitch clipping state var */ +/* _ (Word16*) mem_AR : quantizer memory for AR model */ +/* _ (Word16*) mem_MA : quantizer memory for MA model */ +/* _ (Word16*) lsp_new_bck : LSP vector to quantize- backup */ +/* _ (Word16*) lsf_new_bck : quantized LSF vector - backup */ +/* _ (Word16*) lsp_mid_bck : mid-frame LSP vector - backup */ /* _ (Word16) mCb1 :counter for stationary frame after a transition frame */ -/* _ (Word32*) Bin_E : FFT Bin energy 128 *2 sets */ -/* _ (Word32*) Bin_E_old : FFT Bin energy 128 *2 sets */ -/* _ (Word16*) mem_syn_bck : synthesis filter memory */ -/* _ (Word16) mem_w0_bck : memory of the weighting filter */ -/* _ (Word16) streaklimit : LSF quantizer */ -/* _ (Word16) pstreaklen : LSF quantizer */ -/*-----------------------------------------------------------------------*/ - -/* _ None */ -/*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*=======================================================================*/ +/* _ (Word32*) Bin_E : FFT Bin energy 128 *2 sets */ +/* _ (Word32*) Bin_E_old : FFT Bin energy 128 *2 sets */ +/* _ (Word16*) mem_syn_bck : synthesis filter memory */ +/* _ (Word16) mem_w0_bck : memory of the weighting filter */ +/* _ (Word16) streaklimit : LSF quantizer */ +/* _ (Word16) pstreaklen : LSF quantizer */ +/*----------------------------------------------------------------------*/ +/* _ None */ +/*----------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*======================================================================*/ void lsf_syn_mem_backup_fx( Encoder_State *st_fx, /* o: state structure */ @@ -2906,23 +2882,22 @@ void lsf_syn_mem_backup_fx( Word32 *gc_threshold_fx, /* i: Q16 */ Word16 *clip_var_bck_fx, /* i: Q(2.56), Q14, Q7, Q0, Q14, Q14 */ Word16 *next_force_sf_bck_fx, /* i: */ - - Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ - Word16 *lsf_new, /* i: quantized LSF vector Q15 */ - Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ - Word16 *clip_var, /* i: pitch clipping state var Q(2.56) */ - Word16 *mem_AR, /* i: quantizer memory for AR model 2.56 */ - Word16 *mem_MA, /* i: quantizer memory for MA model 2.56 */ - Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ - Word16 *lsf_new_bck, /* o: quantized LSF vector - backup Q15 */ - Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ - Word16 *mCb1, /* o: counter for stationary frame after a transition frame */ - Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets q_bin */ - Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets q_bin */ - Word16 *mem_syn_bck, /* i: synthesis filter memory q */ - Word16 *mem_w0_bck, /* i: memory of the weighting filter q */ - Word16 *streaklimit, /* i:LSF quantizer Q15 */ - Word16 *pstreaklen /* i:LSF quantizer */ + Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ + Word16 *lsf_new, /* i: quantized LSF vector Q15 */ + Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ + Word16 *clip_var, /* i: pitch clipping state var Q(2.56) */ + Word16 *mem_AR, /* i: quantizer memory for AR model 2.56 */ + Word16 *mem_MA, /* i: quantizer memory for MA model 2.56 */ + Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ + Word16 *lsf_new_bck, /* o: quantized LSF vector - backup Q15 */ + Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ + Word16 *mCb1, /* o: counter for stationary frame after a transition frame */ + Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets q_bin */ + Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets q_bin */ + Word16 *mem_syn_bck, /* i: synthesis filter memory q */ + Word16 *mem_w0_bck, /* i: memory of the weighting filter q */ + Word16 *streaklimit, /* i:LSF quantizer Q15 */ + Word16 *pstreaklen /* i:LSF quantizer */ ) { Word16 i; @@ -2987,25 +2962,31 @@ void lsf_syn_mem_backup_fx( return; } + +/*-------------------------------------------------------------------* + * lsf_syn_mem_backup_fx() + * + * + *--------------------------------------------------------------------*/ + void lsf_syn_mem_backup_ivas_fx( Encoder_State *st_fx, /* i: state structure */ Word16 *btilt_code_fx, /* i: tilt code Q15 */ Word32 *gc_threshold_fx, /* i: Q16 */ Word16 *clip_var_bck_fx, /* o: Q(2.56), Q14, Q7, Q0, Q14, Q14 */ Word16 *next_force_sf_bck_fx, /* o: */ - - Word16 *lsp_new, /* i: LSP vector to quantize Q15 */ - Word16 *lsp_mid, /* i: mid-frame LSP vector Q15 */ - Word16 *clip_var, /* o: pitch clipping state var Q(2.56) */ - Word16 *mem_AR, /* o: quantizer memory for AR model Q(2.56) */ - Word16 *mem_MA, /* o: quantizer memory for AR model Q(2.56) */ - Word16 *lsp_new_bck, /* o: LSP vector to quantize- backup Q15 */ - Word16 *lsp_mid_bck, /* o: mid-frame LSP vector - backup Q15 */ - Word32 *Bin_E, /* o: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ - Word32 *Bin_E_old, /* o: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ - Word16 *mem_syn_bck, /* o: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 *mem_w0_bck, /* o: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 *streaklimit, /* Q15 */ + Word16 *lsp_new, /* i: LSP vector to quantize Q15 */ + Word16 *lsp_mid, /* i: mid-frame LSP vector Q15 */ + Word16 *clip_var, /* o: pitch clipping state var Q(2.56) */ + Word16 *mem_AR, /* o: quantizer memory for AR model Q(2.56) */ + Word16 *mem_MA, /* o: quantizer memory for AR model Q(2.56) */ + Word16 *lsp_new_bck, /* o: LSP vector to quantize- backup Q15 */ + Word16 *lsp_mid_bck, /* o: mid-frame LSP vector - backup Q15 */ + Word32 *Bin_E, /* o: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ + Word32 *Bin_E_old, /* o: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ + Word16 *mem_syn_bck, /* o: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 *mem_w0_bck, /* o: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 *streaklimit, /* Q15 */ Word16 *pstreaklen ) { Word16 i; @@ -3046,11 +3027,11 @@ void lsf_syn_mem_backup_ivas_fx( /* back-up memories */ FOR( i = 0; i < M; i++ ) { - mem_syn_bck[i] = hLPDmem->mem_syn[i]; // Q: ( 15 - st_fx->hLPDmem->e_mem_syn ) + mem_syn_bck[i] = hLPDmem->mem_syn[i]; // Q( st_fx->hLPDmem->q_mem_syn ) move16(); } - *mem_w0_bck = hLPDmem->mem_w0; // ( 15 - st_fx->hLPDmem->e_mem_syn ) + *mem_w0_bck = hLPDmem->mem_w0; // Q( st_fx->hLPDmem->q_mem_syn ) move16(); @@ -3081,66 +3062,68 @@ void lsf_update_memory( move16(); mem_MA[i] = sub( sub( qlsf[i], lsf_means[narrowband][i] ), mult_r( MU_MA_FX, old_mem_MA[i] ) ); } + + return; } + /*======================================================================*/ -/* FUNCTION : lsf_syn_mem_restore_fx */ +/* FUNCTION : lsf_syn_mem_restore_fx */ /*----------------------------------------------------------------------*/ /* PURPOSE : restore synthesis filter memory and LSF quantizer memories*/ /*----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) clip_var : pitch clipping state var */ -/* _ (Word16*) mem_AR : quantizer memory for AR model */ -/* _ (Word16*) mem_MA : quantizer memory for MA model */ -/* _ (Word16*) lsp_new_bck : LSP vector to quantize- backup */ -/* _ (Word16*) lsf_new_bck : quantized LSF vector - backup */ -/* _ (Word16*) lsp_mid_bck : mid-frame LSP vector - backup */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) clip_var : pitch clipping state var */ +/* _ (Word16*) mem_AR : quantizer memory for AR model */ +/* _ (Word16*) mem_MA : quantizer memory for MA model */ +/* _ (Word16*) lsp_new_bck : LSP vector to quantize- backup */ +/* _ (Word16*) lsf_new_bck : quantized LSF vector - backup */ +/* _ (Word16*) lsp_mid_bck : mid-frame LSP vector - backup */ /* _ (Word16) mCb1 :counter for stationary frame after a transition frame */ -/* _ (Word32*) Bin_E : FFT Bin energy 128 *2 sets */ -/* _ (Word32*) Bin_E_old : FFT Bin energy 128 *2 sets */ -/* _ (Word16*) mem_syn_bck : synthesis filter memory */ -/* _ (Word16) mem_w0_bck : memory of the weighting filter */ -/* _ (Word16) streaklimit : LSF quantizer */ -/* _ (Word16) pstreaklen : LSF quantizer */ -/*-----------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _None */ -/*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) lsp_new : LSP vector to quantize */ -/* _ (Word16*) lsf_new : quantized LSF vector */ -/* _ (Word16*) lsp_mid : mid-frame LSP vector */ -/* _ (Encoder_State) st_fx : Encoder state Structure */ -/*-----------------------------------------------------------------------*/ - -/* _ None */ -/*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*=======================================================================*/ +/* _ (Word32*) Bin_E : FFT Bin energy 128 *2 sets */ +/* _ (Word32*) Bin_E_old : FFT Bin energy 128 *2 sets */ +/* _ (Word16*) mem_syn_bck : synthesis filter memory */ +/* _ (Word16) mem_w0_bck : memory of the weighting filter */ +/* _ (Word16) streaklimit : LSF quantizer */ +/* _ (Word16) pstreaklen : LSF quantizer */ +/*----------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _None */ +/*----------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) lsp_new : LSP vector to quantize */ +/* _ (Word16*) lsf_new : quantized LSF vector */ +/* _ (Word16*) lsp_mid : mid-frame LSP vector */ +/* _ (Encoder_State) st_fx : Encoder state Structure */ +/*----------------------------------------------------------------------*/ +/* _ None */ +/*----------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*======================================================================*/ + void lsf_syn_mem_restore_fx( Encoder_State *st_fx, /* o: state structure */ Word16 btilt_code_fx, /* i: Q15 */ Word32 gc_threshold_fx, /* i: Q16 */ Word16 *clip_var_bck_fx, /* i: Q(2.56), Q14, Q7, Q0, Q14, Q14 */ Word16 next_force_sf_bck_fx, /* i: */ - - Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ - Word16 *lsf_new, /* o: quantized LSF vector Q15 */ - Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ - Word16 clip_var, /* i: pitch clipping state var Q(2.56) */ - Word16 *mem_AR, /* i: quantizer memory for AR model Q15 */ - Word16 *mem_MA, /* i: quantizer memory for MA model Q15 */ - Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ - Word16 *lsf_new_bck, /* i: quantized LSF vector - backup Q15 */ - Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ - Word16 mCb1, /* i: counter for stationary frame after a transition frame */ - Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ - Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ - Word16 *mem_syn_bck, /* i: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 mem_w0_bck, /* i: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 streaklimit, /* i:LSF quantizer Q15 */ - Word16 pstreaklen /* i:LSF quantizer */ + Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ + Word16 *lsf_new, /* o: quantized LSF vector Q15 */ + Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ + Word16 clip_var, /* i: pitch clipping state var Q(2.56) */ + Word16 *mem_AR, /* i: quantizer memory for AR model Q15 */ + Word16 *mem_MA, /* i: quantizer memory for MA model Q15 */ + Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ + Word16 *lsf_new_bck, /* i: quantized LSF vector - backup Q15 */ + Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ + Word16 mCb1, /* i: counter for stationary frame after a transition frame */ + Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ + Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ + Word16 *mem_syn_bck, /* i: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 mem_w0_bck, /* i: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 streaklimit, /* i:LSF quantizer Q15 */ + Word16 pstreaklen /* i:LSF quantizer */ ) { Word16 i; @@ -3265,12 +3248,12 @@ void lsf_syn_mem_restore_ivas_fx( } /* restoring memories */ - hLPDmem->mem_w0 = mem_w0_bck; // Q(15 - st_fx->hLPDmem->e_mem_syn ) + hLPDmem->mem_w0 = mem_w0_bck; // Q( st_fx->hLPDmem->q_mem_syn ) move16(); FOR( i = 0; i < M; i++ ) { - hLPDmem->mem_syn[i] = mem_syn_bck[i]; // Q(15 - st_fx->hLPDmem->e_mem_syn ) + hLPDmem->mem_syn[i] = mem_syn_bck[i]; // Q( st_fx->hLPDmem->q_mem_syn ) move16(); } @@ -3303,71 +3286,6 @@ Word16 tcxlpc_get_cdk( return cdk; } -#ifdef IVAS_MSVQ -/*--------------------------------------------------------------------------* - * dec_FDCNG_MSVQ_stage1() - * - * - *--------------------------------------------------------------------------*/ - -void dec_FDCNG_MSVQ_stage1( - int16_t j_full, /* i : index full range */ - int16_t n, /* i : dimension to generate */ - const float *invTrfMatrix, /* i : IDCT matrix for synthesis */ - const DCTTYPE idcttype, /* i : specify which IDCT */ - float *uq, /* o : synthesized stage1 vector */ - Word16 *uq_ind /* o : synthesized stage1 vector in BASOP */ -) -{ - int16_t col, segm_ind, j; - float dct_vec[FDCNG_VQ_MAX_LEN]; - float idct_vec[FDCNG_VQ_MAX_LEN]; - const Word8 *cbpW8; - const Word16 *dct_col_shift_tab; - - assert( n <= FDCNG_VQ_MAX_LEN ); - assert( n >= FDCNG_VQ_DCT_MINTRUNC ); - - segm_ind = 0; - for ( col = 1; col <= FDCNG_VQ_DCT_NSEGM; col++ ) - { - if ( j_full >= cdk1_ivas_cum_entries_per_segment[col] ) - { - segm_ind++; - } - } - - j = j_full - cdk1_ivas_cum_entries_per_segment[segm_ind]; /* j is the local segment index */ - - assert( j < cdk1_ivas_entries_per_segment[segm_ind] ); - - /* Word8 column variable Qx storage*/ - cbpW8 = cdk_37bits_ivas_stage1_W8Qx_dct_sections[segm_ind]; /* Word8 storage fixed ptr_init */ - cbpW8 += j * cdk1_ivas_cols_per_segment[segm_ind]; /* adaptive ptr init */ - dct_col_shift_tab = stage1_dct_col_syn_shift[segm_ind]; - - for ( col = 0; col < cdk1_ivas_cols_per_segment[segm_ind]; col++ ) - { - dct_vec[col] = (float) shl( (Word16) cbpW8[col], dct_col_shift_tab[col] ); - /* LOGIC( 1 ) , SHIFT( 1 ); - in BASOP: s_and(for W8->W16), shl() - */ - } - dctT2_N_apply_matrix( (const float *) dct_vec, idct_vec, cdk1_ivas_cols_per_segment[segm_ind], n, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, idcttype ); - - /*scale down to original fdcngvq domain and move to Q0 */ - v_multc( idct_vec, fdcng_dct_scaleF[1], idct_vec, n ); - /* fdcng_dct_scaleF[1] --> 0.0625-->scale down from search Q4 domain to Q0 , - not really relevant for BASOP loop */ - - /*add common mid fdcng vector, in fdcng bands domain */ - v_add( idct_vec, cdk1r_tr_midQ_truncQ, uq, n ); - assert( uq_ind == NULL ); - - return; -} - -#endif void msvq_dec( const Word16 *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) (14Q1*1.28)*/ const Word16 dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ @@ -3376,11 +3294,7 @@ void msvq_dec( const Word16 N, /* i : Vector dimension */ const Word16 maxN, /* i : Codebook dimension */ const Word16 Idx[], /* i : Indices */ -#ifdef IVAS_MSVQ - const int16_t applyIDCT_flag, /* i : applyIDCT flag */ - const float *invTrfMatrix, /* i : matrix for IDCT synthesis */ -#endif - Word16 *uq /* o : quantized vector (14Q1*1.28)*/ + Word16 *uq /* o : quantized vector (14Q1*1.28)*/ ) { Word16 i, j, offset; @@ -3416,15 +3330,6 @@ void msvq_dec( start = offs[i]; move16(); } -#ifdef IVAS_MSVQ - test(); - IF( i == 0 && applyIDCT_flag != 0 ) - { - assert( start == 0 ); - dec_FDCNG_MSVQ_stage1( Idx[0], N, invTrfMatrix, IDCT_T2_XX_24, uq, uq_ind ); /* IDCT_T2 N=24 used for all synthesis */ - } - ELSE -#endif { /*vr_add( uq+start, cb[i]+Idx[i]*maxn, uq+start, n );, where uq = a zero vector*/ offset = i_mult2( Idx[i], N34 ); @@ -3837,9 +3742,6 @@ Word16 root_search_fx( Word16 low, Word32 v_high, vh; Word32 Ltemp, L_tmp1, L_tmp, Ltmp; Word16 exp1, tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif v_high = polynomial_eval_fx( high, coef, order ); /* v_high has the value at high index */ @@ -3906,9 +3808,9 @@ Word16 root_search_fx( Word16 low, L_tmp1 = L_shl( L_tmp, exp1 ); tmp = extract_h( L_tmp1 ); exp1 = sub( 30 - 25, exp1 ); - tmp = div_s( 16384, tmp ); /* 15+exp1 */ - Ltmp = Mult_32_16( *v_low, tmp ); /* 15+exp1+25-15 */ - Ltemp = L_shl_o( Ltmp, ( 6 - exp1 ), &Overflow ); /* Q31 */ + tmp = div_s( 16384, tmp ); /* 15+exp1 */ + Ltmp = Mult_32_16( *v_low, tmp ); /* 15+exp1+25-15 */ + Ltemp = L_shl_sat( Ltmp, ( 6 - exp1 ) ); /* Q31 */ if ( LT_32( *v_low, vh ) ) { Ltemp = L_negate( Ltemp ); @@ -4127,7 +4029,7 @@ void dec_FDCNG_MSVQ_stage1_fx( { dct_vec[col] = shl( cbpW8[col], dct_col_shift_tab[col] ); // Q0 move32(); - /* LOGIC( 1 ) , SHIFT( 1 ); + /* LOGIC( 1 ), SHIFT( 1 ); in BASOP: s_and(for W8->W16), shl() */ } @@ -4360,7 +4262,7 @@ void dctT2_N_apply_matrix_fx( *pt_y = L_add( *pt_y, Mpy_32_32( ( *pt_x++ ), ( *pt_A ) ) ); move32(); pt_A += mat_step_col; /* step +maxtrunc or +1 */ /* ptr indexing*/ - MAC( 1 ); + MAC_C( 1 ); #undef WMC_TOOL_SKIP } pt_y++; @@ -4412,7 +4314,7 @@ void extend_dctN_input_fx( ext_sig[i] = L_add( ext_sig[i], Mpy_32_32( dct_input[j], ptr[i_rev][j] ) ); /* sum up scaled and extended basis vector */ // Q31 + Q - Q31 -> Q move32(); - MAC( 1 ); + MAC_C( 1 ); #undef WMC_TOOL_SKIP } } @@ -4501,217 +4403,3 @@ void create_IDCT_N_Matrix_fx( return; } -#ifdef IVAS_MSVQ - -/*-------------------------------------------------------------------* - * dctT2_N_apply_matrix() - * - * dct/idct truncated matrix appl. for DCT basis vector lengths of N - *-------------------------------------------------------------------*/ - -void dctT2_N_apply_matrix( - const float *input, /* i : input in fdcng or DCT(fdcng) domain */ - float *output, /* o : output in DCT(fdcng) or fdcng ordomain */ - const int16_t dct_dim, /* i : dct processing dim possibly truncated */ - const int16_t fdcngvq_dim, /* i : fdcng domain length */ - const float *matrix, /* i : IDCT matrix */ - const int16_t matrix_row_dim, /* i : */ - const DCTTYPE dcttype /* i : matrix operation type */ -) -{ - int16_t i, j, dim_in, dim_out; - int16_t mat_step_col, mat_step_row, mat_step_col_flag; - const float *pt_x, *pt_A; - float tmp_y[FDCNG_VQ_MAX_LEN]; - float *pt_y; - - /* non-square DCT_N and IDCT_N matrix application, - using a stored format of an IDCT_Nx(FDCNG_VQ_DCT_MAXTRUNC) matrix */ - /* efficiently parallelized in SIMD */ - - assert( dct_dim <= FDCNG_VQ_DCT_MAXTRUNC ); - assert( fdcngvq_dim <= FDCNG_VQ_MAX_LEN ); - - if ( ( dcttype & 1 ) == 0 ) /* even entries are DCTs */ - { - /* DCT_typeII 24,21 -> XX in worst case */ - dim_in = fdcngvq_dim; - dim_out = dct_dim; - mat_step_col = matrix_row_dim; /* matrix maximum storage size dependent, width of first row in matrix */ - mat_step_row = 0; - mat_step_col_flag = 1; - assert( dcttype == DCT_T2_21_XX || dcttype == DCT_T2_24_XX ); - } - else - { - assert( ( dcttype & 1 ) != 0 ); /* idct */ - dim_in = dct_dim; - dim_out = fdcngvq_dim; - mat_step_col = 1; - mat_step_row = matrix_row_dim; - mat_step_col_flag = 0; - assert( dcttype == IDCT_T2_XX_24 ); - } - - pt_y = tmp_y; - for ( i = 0; i < dim_out; i++ ) - { - pt_x = input; - *pt_y = 0; - - /* +i(DCT) or +i*maxTrunc(IDCT) */ -#define WMC_TOOL_SKIP - pt_A = &( matrix[i * ( mat_step_row + mat_step_col_flag )] ); /* ptr indexing */ - PTR_INIT( 1 ); -#undef WMC_TOOL_SKIP - for ( j = 0; j < dim_in; j++ ) - { -#define WMC_TOOL_SKIP - *pt_y += ( *pt_x++ ) * ( *pt_A ); - pt_A += mat_step_col; /* step +maxtrunc or +1 */ /* ptr indexing*/ - MAC( 1 ); -#undef WMC_TOOL_SKIP - } - pt_y++; - } - - mvr2r( tmp_y, output, dim_out ); - - return; -} - - -/*-------------------------------------------------------------------* - * extend_dctN_input() - * - * (inputN, dctN) -> idct(N_ext) idct_N matrix application loop for - * extending, extrapolating a DCT basis vector length of N to N_ext - *-------------------------------------------------------------------*/ - -void extend_dctN_input( - const float *input, /* i : input in fdcng domain */ - const float *dct_input, /* i : input in dctN(fdcng) domain */ - const int16_t in_dim, /* i : in_dim == N */ - float *ext_sig, /* o : extended output in fdcng domain */ - const int16_t out_dim, /* i : output total dim */ - float *matrix, /* i : idct synthesis matrix N rows, n_cols columns */ - const int16_t n_cols, /* i : number of columns == DCT truncation length */ - const DCTTYPE dcttype /* i : matrix operation type */ -) -{ - int16_t i, j, i_rev; - const float( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) matrix; - - /* stored format is an IDCT_Nx(FDCNG_VQ_DCT_MAXTRUNC) matrix */ - assert( in_dim < FDCNG_VQ_MAX_LEN ); - assert( out_dim <= FDCNG_VQ_MAX_LEN ); - assert( out_dim > in_dim ); - assert( n_cols == FDCNG_VQ_DCT_MAXTRUNC ); /* for *ptr[MAX_TRUNC] adressing*/ - assert( ( dcttype & 1 ) != 0 ); /* idct tables always in use for this basis vector extension */ - - mvr2r( input, ext_sig, in_dim ); /* copy initial part, i.e. only last/tail parts are extended */ - set_f( &( ext_sig[in_dim] ), 0.0, out_dim - in_dim ); - - i_rev = in_dim; /*ptr init*/ - for ( i = in_dim; i < out_dim; i++ ) - { /* for each extension sample */ - /* i = 21 22 23; - i_rev = 20 19 18; for odd dctII reflect basis vector - */ - i_rev--; - - for ( j = 0; j < n_cols; j++ ) /* for each available DCT coeff */ - { - /* DCTcoeff * reflected basis vector */ -#define WMC_TOOL_SKIP - /* pure ptr MAC operations */ - ext_sig[i] += dct_input[j] * ptr[i_rev][j]; /* sum up scaled and extended basis vector */ - MAC( 1 ); -#undef WMC_TOOL_SKIP - } - } - - return; -} - - -/*-------------------------------------------------------------------* - * create_IDCT_N_Matrix() - * - * inititate idct24 FDCNG_VQ_DCT_MAXTRUNCx N matrix in - * RAM from a quantized compressed ROM format - *-------------------------------------------------------------------*/ - -void create_IDCT_N_Matrix( - float *inv_matrixFloatQ, /* i/o: RAM buffer */ - const int16_t N, /* i : DCT length, number of time samples */ - const int16_t n_cols, /* i : number of dct coeffs (as DCT may be truncated) */ - const int16_t alloc_size /* i : RAM buffer size in elements */ -) -{ - int16_t c, c1, r, r_flip, W16_val; - int16_t len; - int16_t mat_cpy_size; - const Word16 *absval_ptr; - const Word8 *idx_ptr; - Word16 idx; - float( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) inv_matrixFloatQ; /* fixed number of columns pointers, to simplifies adressing in ANSIC */ - - absval_ptr = unique_idctT2_24coeffsQ16; - idx_ptr = idctT2_24_compressed_idx; - len = FDCNG_VQ_MAX_LEN; - - if ( N == FDCNG_VQ_MAX_LEN_WB ) - { - absval_ptr = unique_idctT2_21coeffsQ16; - idx_ptr = idctT2_21_compressed_idx; - len = N; - } - - assert( alloc_size >= ( n_cols * len ) ); /* enough space for the full expanded IDCT matrix */ - assert( N <= len ); - - mat_cpy_size = ( n_cols ) * ( len >> 1 ); /* NB integer division of "len" */ - - if ( ( len & 1 ) != 0 ) - { /* odd sized DCT with a non-reflected center row */ - mat_cpy_size += n_cols; - } - - for ( c = 0; c < mat_cpy_size; c++ ) - { - idx = (Word16) ( idx_ptr[c] ); - W16_val = absval_ptr[abs( idx )]; - - if ( idx < 0 ) - { - W16_val = -( W16_val ); - } - inv_matrixFloatQ[c] = ( +1.52587890625e-05f ) * ( (float) W16_val ); /* 1.0/2.^16 scaling to a float-"Q0" , a scaling that is not done in BASOP */ - } - - /* for even number of coeffs DCT24, - flip symmetry for odd, even is used to save 50% IDCT Table ROM */ - /* for an odd DCT center is not flipped e.g for DCT21 */ - - assert( n_cols == FDCNG_VQ_DCT_MAXTRUNC ); - assert( ( n_cols & 1 ) == 0 ); - - for ( c = 0; c < ( n_cols ); c += 2 ) - { - c1 = c + 1; - r_flip = len - 1; - for ( r = 0; r < ( len / 2 ); r++, r_flip-- ) - { -#define WMC_TOOL_SKIP - ptr[r_flip][c] = ptr[r][c]; /* flipped */ - ptr[r_flip][c1] = -( ptr[r][c1] ); /* flipped and sign swapped */ - MOVE( 2 ); - MULT( 1 ); /* for negate */ -#undef WMC_TOOL_SKIP - } - } - - return; -} -#endif diff --git a/lib_com/lsp_conv_poly_fx.c b/lib_com/lsp_conv_poly_fx.c index 4f493cacde1c222cba29c4859e08beb17776da29..473d1d652fde2cf4ca8d0b428b26294998c0d189 100644 --- a/lib_com/lsp_conv_poly_fx.c +++ b/lib_com/lsp_conv_poly_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -9,7 +9,6 @@ #include "prot_fx.h" #include "wmc_auto.h" - /*-------------------------------------------------------------------* * Local constants *-------------------------------------------------------------------*/ @@ -336,19 +335,16 @@ static Word32 b_inv_sq( Word16 m_den, exp_den; Word16 div_out; Word32 Ltmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif exp_den = norm_l( in32 ); m_den = extract_h( L_shl( in32, exp_den ) ); exp_den = add( sub( 30, exp_den ), sub( 16, exp_in ) ); m_den = mult_r( m_den, m_den ); - exp_den = shl_o( exp_den, 1, &Overflow ); + exp_den = shl( exp_den, 1 ); div_out = div_s( 8192, m_den ); - Ltmp = L_shl_o( div_out, add( sub( 30 - 13, exp_den ), 15 ), &Overflow ); /*Q15*/ + Ltmp = L_shl_sat( div_out, add( sub( 30 - 13, exp_den ), 15 ) ); /*Q15*/ return Ltmp; } @@ -364,9 +360,6 @@ static Word32 inv_pow( Word32 mh; UWord16 ml; Word32 r0, s0; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif IF( re == 0 ) { @@ -378,7 +371,7 @@ static Word32 inv_pow( { exp1 = norm_l( re ); tmp = extract_h( L_shl( re, exp1 ) ); - L_tmp = L_shr( L_mult_o( tmp, tmp, &Overflow ), 1 ); + L_tmp = L_shr( L_mult_sat( tmp, tmp ), 1 ); Mpy_32_16_ss( L_tmp, x, &mh, &ml ); r0 = L_add( L_tmp, mh ); } @@ -393,7 +386,7 @@ static Word32 inv_pow( { exp2 = norm_l( se ); tmp = extract_h( L_shl( se, exp2 ) ); - L_tmp = L_shr( L_mult_o( tmp, tmp, &Overflow ), 1 ); + L_tmp = L_shr( L_mult_sat( tmp, tmp ), 1 ); Mpy_32_16_ss( L_tmp, x, &mh, &ml ); s0 = L_sub( L_tmp, mh ); } @@ -423,7 +416,7 @@ static Word32 inv_pow( } tmp = div_s( (Word16) ( ( 1 << 14 ) - 1 ), tmp ); exp1 = add( exp1, exp2 ); - L_tmp = L_shr_o( tmp, sub( 31, exp1 ), &Overflow ); /* result in Q15 */ + L_tmp = L_shr_sat( tmp, sub( 31, exp1 ) ); /* result in Q15 */ return ( L_tmp ); } @@ -501,9 +494,6 @@ static void spectautocorr_fx( UWord16 ml; Word32 r[M + 1]; Word16 exp0; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /*---------------------------------------------------------------------* * The mid point of the cosine table x of m entries assuming an odd m. @@ -525,7 +515,7 @@ static void spectautocorr_fx( move32(); FOR( i = 2; i < N - 1; i++ ) { - r[0] = L_add_o( r[0], G[i], &Overflow ); + r[0] = L_add_sat( r[0], G[i] ); move32(); } @@ -559,12 +549,12 @@ static void spectautocorr_fx( move16(); /* 1.0 in Q15 */ FOR( i = 1; i < imid; i++ ) { - gp = L_add_o( G[i], G[N - i - 1], &Overflow ); + gp = L_add_sat( G[i], G[N - i - 1] ); gn = L_sub( G[i], G[N - i - 1] ); /*r[1] = L_mac(r[1], x[i-1], gn);*/ Mpy_32_16_ss( gn, x[i - 1], &mh, &ml ); - r[1] = L_add_o( r[1], mh, &Overflow ); + r[1] = L_add_sat( r[1], mh ); move32(); c[1] = x[i - 1]; move16(); @@ -573,31 +563,31 @@ static void spectautocorr_fx( { c[j] = mult_r( c[j - 1], x[i - 1] ); move16(); - c[j] = add_o( c[j], sub_o( c[j], c[j - 2], &Overflow ), &Overflow ); + c[j] = add_sat( c[j], sub_sat( c[j], c[j - 2] ) ); move16(); /*r[j] = L_mac(r[j], c[j], gp);*/ Mpy_32_16_ss( gp, c[j], &mh, &ml ); - r[j] = L_add_o( r[j], mh, &Overflow ); + r[j] = L_add_sat( r[j], mh ); move32(); c[j + 1] = mult_r( c[j], x[i - 1] ); move16(); - c[j + 1] = add_o( c[j + 1], sub_o( c[j + 1], c[j - 1], &Overflow ), &Overflow ); + c[j + 1] = add_sat( c[j + 1], sub_sat( c[j + 1], c[j - 1] ) ); move16(); /*r[j+1] = L_mac(r[j+1], c[j+1], gn);*/ Mpy_32_16_ss( gn, c[j + 1], &mh, &ml ); - r[j + 1] = L_add_o( r[j + 1], mh, &Overflow ); + r[j + 1] = L_add_sat( r[j + 1], mh ); move32(); } c[j] = mult_r( c[j - 1], x[i - 1] ); move16(); - c[j] = add_o( c[j], sub_o( c[j], c[j - 2], &Overflow ), &Overflow ); + c[j] = add_sat( c[j], sub_sat( c[j], c[j - 2] ) ); move16(); Mpy_32_16_ss( gp, c[j], &mh, &ml ); - r[j] = L_add_o( r[j], mh, &Overflow ); + r[j] = L_add_sat( r[j], mh ); move32(); } @@ -605,18 +595,19 @@ static void spectautocorr_fx( * Add the endpoints x = cos(0) = 1 and x = cos(pi) = -1 as * well as the lower half of the unit circle. *---------------------------------------------------------------------*/ - gp = L_shr( L_add_o( G[0], G[N - 1], &Overflow ), 1 ); + + gp = L_shr( L_add_sat( G[0], G[N - 1] ), 1 ); gn = L_shr( L_sub( G[0], G[N - 1] ), 1 ); - r[0] = L_add_o( r[0], gp, &Overflow ); + r[0] = L_add_sat( r[0], gp ); move32(); exp0 = norm_l( r[0] ); L_Extract( L_shl( r[0], exp0 ), &rh[0], &rl[0] ); FOR( j = 1; j < M; j += 2 ) { - L_Extract( L_shl( L_add_o( r[j], gn, &Overflow ), exp0 ), &rh[j], &rl[j] ); - L_Extract( L_shl( L_add_o( r[j + 1], gp, &Overflow ), exp0 ), &rh[j + 1], &rl[j + 1] ); + L_Extract( L_shl( L_add_sat( r[j], gn ), exp0 ), &rh[j], &rl[j] ); + L_Extract( L_shl( L_add_sat( r[j + 1], gp ), exp0 ), &rh[j + 1], &rl[j + 1] ); } return; diff --git a/lib_com/math_op.c b/lib_com/math_op.c index 7014988b887944d6c9417a15c0d07363e7245c79..12d14ca6a0d1fe86141d377ef7907d0150aa6f4e 100644 --- a/lib_com/math_op.c +++ b/lib_com/math_op.c @@ -228,19 +228,15 @@ Word32 Energy_scale( /* (o) : Q31: normalized result (1 < val { Word16 i, sft, tmp; Word32 L_sum; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - L_sum = 0; /* just to avoid superflous compiler warning about uninitialized use of L_sum */ IF( expi == 0 ) { - L_sum = L_mac_o( 1, x[0], x[0], &Overflow ); + L_sum = L_mac_sat( 1, x[0], x[0] ); FOR( i = 1; i < lg; i++ ) { - L_sum = L_mac_o( L_sum, x[i], x[i], &Overflow ); + L_sum = L_mac_sat( L_sum, x[i], x[i] ); } } IF( expi < 0 ) @@ -251,17 +247,17 @@ Word32 Energy_scale( /* (o) : Q31: normalized result (1 < val FOR( i = 1; i < lg; i++ ) { tmp = mult_r( x[i], sft ); - L_sum = L_mac_o( L_sum, tmp, tmp, &Overflow ); + L_sum = L_mac_sat( L_sum, tmp, tmp ); } } IF( expi > 0 ) { - tmp = shl_o( x[0], expi, &Overflow ); - L_sum = L_mac_o( 1, tmp, tmp, &Overflow ); + tmp = shl_sat( x[0], expi ); + L_sum = L_mac_sat( 1, tmp, tmp ); FOR( i = 1; i < lg; i++ ) { - tmp = shl_o( x[i], expi, &Overflow ); - L_sum = L_mac_o( L_sum, tmp, tmp, &Overflow ); + tmp = shl_sat( x[i], expi ); + L_sum = L_mac_sat( L_sum, tmp, tmp ); } } diff --git a/lib_com/math_op.h b/lib_com/math_op.h index 0e5fa825b534627dca3e462ab5a38d645ffcecca..d4eca9f2bad2b0664c9fec0e26f7896c22a887e2 100644 --- a/lib_com/math_op.h +++ b/lib_com/math_op.h @@ -1,5 +1,5 @@ /*--------------------------------------------------------------------------* - * MATH_OP.H * + * MATH_OP.H * *--------------------------------------------------------------------------* * Mathematical operations * *--------------------------------------------------------------------------*/ diff --git a/lib_com/mime.h b/lib_com/mime.h index 6e9e5fc87f48c20b650b2872fcf0401ec05bcbfa..7d21f6aac0c182941a2df91c96dc617ff4234b8e 100644 --- a/lib_com/mime.h +++ b/lib_com/mime.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef MIME_H #define MIME_H diff --git a/lib_com/modif_fs.c b/lib_com/modif_fs.c deleted file mode 100644 index 10e64a57deb9efbc548a2416db10d1ec550d66cf..0000000000000000000000000000000000000000 --- a/lib_com/modif_fs.c +++ /dev/null @@ -1,469 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include -#include "cnst.h" -#include "prot_fx.h" -#include "rom_com.h" -#include "wmc_auto.h" - - -/* IVAS 32-bit variant */ -void Interpolate_allpass_steep_fx32( - const Word32 *in_fx, /* i : input array of size N Qx */ - Word32 *mem_fx, /* i/o: memory Qx */ - const Word16 N, /* i : number of input samples */ - Word32 *out_fx /* o : output array of size 2*N Qx */ -) -{ - Word16 n, k; - Word32 temp_fx[ALLPASSSECTIONS_STEEP - 1]; - - /* upper allpass filter chain */ - FOR( k = 0; k < N; k++ ) - { - temp_fx[0] = Madd_32_16( mem_fx[0], in_fx[k], AP2_STEEP_FX[0] ); // Qx - move32(); - mem_fx[0] = Msub_32_16( in_fx[k], temp_fx[0], AP2_STEEP_FX[0] ); // Qx - move32(); - - /* for better performance, unroll this loop */ - FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) - { - temp_fx[n] = Madd_32_16( mem_fx[n], temp_fx[n - 1], AP2_STEEP_FX[n] ); // Qx - move32(); - mem_fx[n] = Msub_32_16( temp_fx[n - 1], temp_fx[n], AP2_STEEP_FX[n] ); // Qx - move32(); - } - - out_fx[2 * k + 1] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP - 1], temp_fx[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - mem_fx[ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp_fx[ALLPASSSECTIONS_STEEP - 2], out_fx[2 * k + 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - } - - /* lower allpass filter chain */ - FOR( k = 0; k < N; k++ ) - { - temp_fx[0] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP], in_fx[k], AP1_STEEP_FX[0] ); // Qx - move32(); - mem_fx[ALLPASSSECTIONS_STEEP] = Msub_32_16( in_fx[k], temp_fx[0], AP1_STEEP_FX[0] ); // Qx - move32(); - - /* for better performance, unroll this loop */ - FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) - { - temp_fx[n] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP + n], temp_fx[n - 1], AP1_STEEP_FX[n] ); // Qx - move32(); - mem_fx[ALLPASSSECTIONS_STEEP + n] = Msub_32_16( temp_fx[n - 1], temp_fx[n], AP1_STEEP_FX[n] ); // Qx - move32(); - } - - out_fx[2 * k] = Madd_32_16( mem_fx[2 * ALLPASSSECTIONS_STEEP - 1], temp_fx[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - mem_fx[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp_fx[ALLPASSSECTIONS_STEEP - 2], out_fx[2 * k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - } - - return; -} - -/* IVAS 32-bit variant */ -void Decimate_allpass_steep_fx32( - const Word32 *in, /* i : input array of size N Qx */ - Word32 *mem, /* i/o: memory Qx */ - const Word16 N, /* i : number of input samples */ - Word32 *out /* o : output array of size N/2 Qx */ -) -{ - Word16 n, k; - Word32 temp[ALLPASSSECTIONS_STEEP]; - - /* upper allpass filter chain */ - FOR( k = 0; k < N / 2; k++ ) - { -#ifdef OPT_STEREO_32KBPS_V1 - temp[0] = Madd_32_16( mem[0], in[2 * k], AP1_STEEP_FX[0] ); // Qx - move32(); - mem[0] = Msub_32_16( in[2 * k], temp[0], AP1_STEEP_FX[0] ); // Qx - move32(); - - temp[1] = Madd_32_16( mem[1], temp[0], AP1_STEEP_FX[1] ); // Qx - move32(); - mem[1] = Msub_32_16( temp[0], temp[1], AP1_STEEP_FX[1] ); // Qx - move32(); - - out[k] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], out[k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[0] = L_add( mem[0], Mpy_32_16_1( in[2 * k], AP1_STEEP_FX[0] ) ); // Qx - move32(); - mem[0] = L_sub( in[2 * k], Mpy_32_16_1( temp[0], AP1_STEEP_FX[0] ) ); // Qx - move32(); - - temp[1] = L_add( mem[1], Mpy_32_16_1( temp[0], AP1_STEEP_FX[1] ) ); // Qx - move32(); - mem[1] = L_sub( temp[0], Mpy_32_16_1( temp[1], AP1_STEEP_FX[1] ) ); // Qx - move32(); - - out[k] = L_add( mem[ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( out[k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - } - - /* lower allpass filter chain */ -#ifdef OPT_STEREO_32KBPS_V1 - temp[0] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP], mem[2 * ALLPASSSECTIONS_STEEP], AP2_STEEP_FX[0] ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP] = Msub_32_16( mem[2 * ALLPASSSECTIONS_STEEP], temp[0], AP2_STEEP_FX[0] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[0] = L_add( mem[ALLPASSSECTIONS_STEEP], Mpy_32_16_1( mem[2 * ALLPASSSECTIONS_STEEP], AP2_STEEP_FX[0] ) ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP] = L_sub( mem[2 * ALLPASSSECTIONS_STEEP], Mpy_32_16_1( temp[0], AP2_STEEP_FX[0] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - - /* for better performance, unroll this loop */ - FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) - { -#ifdef OPT_STEREO_32KBPS_V1 - temp[n] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP + n], temp[n - 1], AP2_STEEP_FX[n] ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP + 1] = Msub_32_16( temp[n - 1], temp[n], AP2_STEEP_FX[n] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[n] = L_add( mem[ALLPASSSECTIONS_STEEP + n], Mpy_32_16_1( temp[n - 1], AP2_STEEP_FX[n] ) ); // Qx - move32(); - /*if ( fabs( temp[n] ) < 1e-12 ) - { - temp[n] = sign( temp[n] ) * 1e-12f; - }*/ - mem[ALLPASSSECTIONS_STEEP + 1] = L_sub( temp[n - 1], Mpy_32_16_1( temp[n], AP2_STEEP_FX[n] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - } - -#ifdef OPT_STEREO_32KBPS_V1 - temp[ALLPASSSECTIONS_STEEP - 1] = Madd_32_16( mem[2 * ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - - mem[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[ALLPASSSECTIONS_STEEP - 1] = L_add( mem[2 * ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); - - mem[2 * ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - out[0] = W_round48_L( W_mac_32_16( W_mult_32_16( out[0], 16384 /*0.5 in Q15*/ ), temp[ALLPASSSECTIONS_STEEP - 1], 16384 /*0.5 in Q15*/ ) ); // Qx - move32(); - - FOR( k = 1; k < N / 2; k++ ) - { -#ifdef OPT_STEREO_32KBPS_V1 - temp[0] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP], in[2 * k - 1], AP2_STEEP_FX[0] ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP] = Msub_32_16( in[2 * k - 1], temp[0], AP2_STEEP_FX[0] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[0] = L_add( mem[ALLPASSSECTIONS_STEEP], Mpy_32_16_1( in[sub( shl( k, 1 ), 1 )], AP2_STEEP_FX[0] ) ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP] = L_sub( in[sub( shl( k, 1 ), 1 )], Mpy_32_16_1( temp[0], AP2_STEEP_FX[0] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - - /* for better performance, unroll this loop */ - FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) - { -#ifdef OPT_STEREO_32KBPS_V1 - temp[n] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP + n], temp[n - 1], AP2_STEEP_FX[n] ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP + n] = Msub_32_16( temp[n - 1], temp[n], AP2_STEEP_FX[n] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[n] = L_add( mem[ALLPASSSECTIONS_STEEP + n], Mpy_32_16_1( temp[n - 1], AP2_STEEP_FX[n] ) ); // Qx - move32(); - /*if ( fabs( temp[n] ) < 1e-12 ) - { - temp[n] = sign( temp[n] ) * 1e-12f; - }*/ - mem[ALLPASSSECTIONS_STEEP + n] = L_sub( temp[n - 1], Mpy_32_16_1( temp[n], AP2_STEEP_FX[n] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - } - -#ifdef OPT_STEREO_32KBPS_V1 - temp[ALLPASSSECTIONS_STEEP - 1] = Madd_32_16( mem[2 * ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - mem[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[ALLPASSSECTIONS_STEEP - 1] = L_add( mem[2 * ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); - mem[2 * ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - out[k] = W_round48_L( W_mac_32_16( W_mult_32_16( out[k], 16384 /*0.5 in Q15*/ ), temp[ALLPASSSECTIONS_STEEP - 1], 16384 /*0.5 in Q15*/ ) ); // Qx - move32(); - } - - /* z^(-1) */ - mem[2 * ALLPASSSECTIONS_STEEP] = in[N - 1]; - move32(); - - return; -} - -/* IVAS 32-bit variant */ -void interpolate_3_over_2_allpass_fx32( - const Word32 *input, /* i : input signal Qx*/ - const Word16 len, /* i : number of input samples */ - Word32 *out, /* o : output signal Qx*/ - Word32 *mem /* i/o: memory Qx*/ -) -{ - Word16 i, loop_len; - Word32 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ - Word32 out1_buff[L_FRAME32k * 3]; - Word32 *out1; - Word32 mem_temp; - const Word16 *filt_coeff = allpass_poles_3_ov_2; // Q15 - - out1 = out1_buff; - - FOR( i = 0; i < len; i++ ) - { - /* Upper branch */ -#ifdef OPT_STEREO_32KBPS_V1 - Vu[0] = Madd_32_16( mem[0], L_sub( input[i], mem[1] ), filt_coeff[0] ); // Qx + Q15 - Q15 -> Qx - move32(); - Vu[1] = Madd_32_16( mem[1], L_sub( Vu[0], mem[2] ), filt_coeff[1] ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[3] = Madd_32_16( mem[2], L_sub( Vu[1], mem[3] ), filt_coeff[2] ); // Qx + Q15 - Q15 -> Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - Vu[0] = L_add( mem[0], Mpy_32_16_1( L_sub( input[i], mem[1] ), filt_coeff[0] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - Vu[1] = L_add( mem[1], Mpy_32_16_1( L_sub( Vu[0], mem[2] ), filt_coeff[1] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[3] = L_add( mem[2], Mpy_32_16_1( L_sub( Vu[1], mem[3] ), filt_coeff[2] ) ); // Qx + Q15 - Q15 -> Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - - mem[1] = Vu[0]; // Qx - move32(); - mem[2] = Vu[1]; // Qx - move32(); - *out1++ = mem[3]; // Qx - move32(); - - /* Middle branch */ -#ifdef OPT_STEREO_32KBPS_V1 - Vm[0] = Madd_32_16( mem[0], L_sub( input[i], mem[4] ), filt_coeff[3] ); // Qx + Q15 - Q15 -> Qx - move32(); - Vm[1] = Madd_32_16( mem[4], L_sub( Vm[0], mem[5] ), filt_coeff[4] ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[6] = Madd_32_16( mem[5], L_sub( Vm[1], mem[6] ), filt_coeff[5] ); // Qx + Q15 - Q15 -> Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - Vm[0] = L_add( mem[0], Mpy_32_16_1( L_sub( input[i], mem[4] ), filt_coeff[3] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - Vm[1] = L_add( mem[4], Mpy_32_16_1( L_sub( Vm[0], mem[5] ), filt_coeff[4] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[6] = L_add( mem[5], Mpy_32_16_1( L_sub( Vm[1], mem[6] ), filt_coeff[5] ) ); // Qx + Q15 - Q15 -> Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - - mem[4] = Vm[0]; // Qx - move32(); - mem[5] = Vm[1]; // Qx - move32(); - *out1++ = mem[6]; // Qx - move32(); - - /* Lower branch */ -#ifdef OPT_STEREO_32KBPS_V1 - Vl[0] = Madd_32_16( mem[0], L_sub( input[i], mem[7] ), filt_coeff[6] ); // Qx + Q15 - Q15 -> Qx - move32(); - Vl[1] = Madd_32_16( mem[7], L_sub( Vl[0], mem[8] ), filt_coeff[7] ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[9] = Madd_32_16( mem[8], L_sub( Vl[1], mem[9] ), filt_coeff[8] ); // Qx + Q15 - Q15 -> Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - Vl[0] = L_add( mem[0], Mpy_32_16_1( L_sub( input[i], mem[7] ), filt_coeff[6] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - Vl[1] = L_add( mem[7], Mpy_32_16_1( L_sub( Vl[0], mem[8] ), filt_coeff[7] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[9] = L_add( mem[8], Mpy_32_16_1( L_sub( Vl[1], mem[9] ), filt_coeff[8] ) ); // Qx + Q15 - Q15 -> Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - - mem[0] = input[i]; // Qx - move32(); - mem[7] = Vl[0]; // Qx - move32(); - mem[8] = Vl[1]; // Qx - move32(); - *out1++ = mem[9]; // Qx - move32(); - } - - loop_len = shr( i_mult( len, 3 ), 1 ); - - /*decimate by 2 and LPF*/ - FOR( i = 0; i < loop_len; i++ ) - { - mem_temp = out1_buff[2 * i]; - move32(); -#ifdef OPT_STEREO_32KBPS_V1 - out[i] = Madd_32_16( Mpy_32_16_1( L_add( mem_temp, mem[10] ), 1550 ), L_add( mem[11], mem[14] ), -4965 ); // Qx + Q15 - Q15 -> Qx - // 0.0473147f in Q15 -> 1550, -0.151521f in Q15 -> -4965 - out[i] = Madd_32_16( out[i], L_add( mem[12], mem[13] ), 20125 ); - // 0.614152f in Q15 -> 20125 -#else /* OPT_STEREO_32KBPS_V1 */ - out[i] = L_add( Mpy_32_16_1( L_add( mem_temp, mem[10] ), 1550 ), Mpy_32_16_1( L_add( mem[11], mem[14] ), -4965 ) ); // Qx + Q15 - Q15 -> Qx - // 0.0473147f in Q15 -> 1550, -0.151521f in Q15 -> -4965 - out[i] = L_add( out[i], Mpy_32_16_1( L_add( mem[12], mem[13] ), 20125 ) ); - // 0.614152f in Q15 -> 20125 -#endif /* OPT_STEREO_32KBPS_V1 */ - mem[10] = mem[11]; // Qx - move32(); - mem[11] = mem[12]; // Qx - move32(); - mem[12] = mem[13]; // Qx - move32(); - mem[13] = mem[14]; // Qx - move32(); - mem[14] = mem_temp; // Qx - move32(); - } - - return; -} - -/* IVAS 32-bit variant */ -void interpolate_3_over_1_allpass_fx32( - const Word32 *input, /* i : input signal Qx */ - const Word16 len, /* i : number of input samples */ - Word32 *out, /* o : output signal */ - Word32 *mem /* i/o: memory */ -) -{ - Word16 i, tmp16; - Word32 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ - Word32 *out1; - Word32 mem_temp; - const Word16 *filt_coeff = allpass_poles_3_ov_2; // Qx - - out1 = &out[0]; - - FOR( i = 0; i < len; i++ ) - { - /* Upper branch */ - Vu[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[1] ), filt_coeff[0] ) ); // Qx - move32(); - Vu[1] = L_add_sat( mem[1], Mpy_32_16_1( L_sub( Vu[0], mem[2] ), filt_coeff[1] ) ); // Qx - move32(); - mem[3] = L_add_sat( mem[2], Mpy_32_16_1( L_sub( Vu[1], mem[3] ), filt_coeff[2] ) ); // Qx - move32(); - - mem[1] = Vu[0]; // Qx - move32(); - mem[2] = Vu[1]; // Qx - move32(); - *out1++ = mem[3]; // Qx - move32(); - - /* Middle branch */ - Vm[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[4] ), filt_coeff[3] ) ); // Qx - move32(); - Vm[1] = L_add_sat( mem[4], Mpy_32_16_1( L_sub( Vm[0], mem[5] ), filt_coeff[4] ) ); // Qx - move32(); - mem[6] = L_add_sat( mem[5], Mpy_32_16_1( L_sub( Vm[1], mem[6] ), filt_coeff[5] ) ); // Qx - move32(); - - mem[4] = Vm[0]; // Qx - move32(); - mem[5] = Vm[1]; // Qx - move32(); - *out1++ = mem[6]; // Qx - move32(); - - /* Lower branch */ - Vl[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[7] ), filt_coeff[6] ) ); // Qx - move32(); - Vl[1] = L_add_sat( mem[7], Mpy_32_16_1( L_sub( Vl[0], mem[8] ), filt_coeff[7] ) ); // Qx - move32(); - mem[9] = L_add_sat( mem[8], Mpy_32_16_1( L_sub( Vl[1], mem[9] ), filt_coeff[8] ) ); // Qx - move32(); - - mem[0] = input[i]; // Qx - move32(); - mem[7] = Vl[0]; // Qx - move32(); - mem[8] = Vl[1]; // Qx - move32(); - *out1++ = mem[9]; // Qx - move32(); - } - - /*LPF*/ - tmp16 = imult1616( len, 3 ); - FOR( i = 0; i < tmp16; i++ ) - { - mem_temp = out[i]; // Qx - move32(); - out[i] = L_sub_sat( Mpy_32_16_1( L_add_sat( mem[12], mem[11] ), 18768 ), Mpy_32_16_1( L_add_sat( mem_temp, mem[10] ), 2424 ) ); // Qx - // 0.572769 in Q15 -> 18768, 0.074005 in Q15 -> 2424 - move32(); - mem[10] = mem[11]; // Qx - move32(); - mem[11] = mem[12]; // Qx - move32(); - mem[12] = mem_temp; // Qx - move32(); - } - - return; -} diff --git a/lib_com/modif_fs_fx.c b/lib_com/modif_fs_fx.c index bcbff13d57bebe95c3159b1b75e34fdc517fad79..7977bc49b5c66b7871c2010652b25b8d61a0a0fe 100644 --- a/lib_com/modif_fs_fx.c +++ b/lib_com/modif_fs_fx.c @@ -1,8 +1,9 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include +#include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "prot_fx.h" @@ -11,6 +12,8 @@ #include "rom_enc.h" /* prototypes */ #include "basop_util.h" #include "ivas_prot_fx.h" +#include "wmc_auto.h" + /*-----------------------------------------------------------------* * Local functions @@ -39,6 +42,7 @@ /*------------------------------------------------------------------------------*/ /* CALLED FROM : TX/RX */ /*==============================================================================*/ + Word16 modify_Fs_ivas_fx( /* o : length of output Q0 */ const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ Word16 lg, /* i : length of input Q0 */ @@ -71,10 +75,6 @@ Word16 modify_Fs_ivas_fx( /* o : length of output Q Word16 flag_low_order = 0; move16(); Word16 filt_len_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif const Resampling_cfg *cfg_ptr_fx; /*-------------------------------------------------------------------* @@ -273,7 +273,7 @@ Word16 modify_Fs_ivas_fx( /* o : length of output Q test(); IF( GT_32( fin, 16000 ) && ( EQ_16( lg_out, L_FRAME ) || EQ_16( lg_out, L_FRAME16k ) || EQ_16( lg_out, 512 ) ) ) { - num_den = shl_o( num_den, 1, &Overflow ); + num_den = shl_sat( num_den, 1 ); *Q_new_inp = add( *Q_new_inp, 1 ); move16(); } @@ -323,6 +323,7 @@ Word16 modify_Fs_ivas_fx( /* o : length of output Q return lg_out; } + Word16 modify_Fs_fx( /* o : length of output Q0 */ const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ Word16 lg, /* i : length of input Q0 */ @@ -353,10 +354,6 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ Word16 flag_low_order = 0; move16(); Word16 filt_len_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif const Resampling_cfg *cfg_ptr_fx; /*-------------------------------------------------------------------* @@ -551,11 +548,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ test(); if ( GT_32( fin, 16000 ) && ( EQ_16( lg_out, L_FRAME ) || EQ_16( lg_out, L_FRAME16k ) || EQ_16( lg_out, 512 ) ) ) { -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - num_den = shl_o( num_den, 1, &Overflow ); -#else - num_den = shl( num_den, 1 ); -#endif + num_den = shl_sat( num_den, 1 ); } FOR( i = 0; i < lg_out; i++ ) { @@ -599,6 +592,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ return lg_out; } + /*-------------------------------------------------------------------* * modify_Fs_intcub3m_sup() * @@ -911,7 +905,6 @@ Word16 modify_Fs_intcub3m_sup_fx( /* o : length of output /* RETURN ARGUMENTS : _ None. */ /*===================================================================*/ - void Decimate_allpass_steep_fx( const Word16 *in_fx, Word16 mem[], /* array of size: 2*ALLPASSSECTIONS_STEEP+1 */ @@ -924,109 +917,95 @@ void Decimate_allpass_steep_fx( Word32 Lacc, Lacc1; Word16 temp1, temp2; Word16 sum = 0; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif move16(); /*upper allpass filter chain */ - - FOR( k = 0; k < N / 2; k++ ) { - Lacc = L_deposit_h( mem[0] ); /* Q(16+x) */ - Lacc = L_mac_o( Lacc, AP1_STEEP_FX[0], in_fx[2 * k], &Overflow ); /* Q(16+x) */ - Lacc1 = L_deposit_h( in_fx[2 * k] ); /* Q16+Qx */ - temp1 = extract_h( Lacc ); /* Qx */ - Lacc1 = L_msu_o( Lacc1, AP1_STEEP_FX[0], temp1, &Overflow ); /* Q16+Qx */ - mem[0] = extract_h( Lacc1 ); /* Qx */ + Lacc = L_deposit_h( mem[0] ); /* Q(16+x) */ + Lacc = L_mac_sat( Lacc, AP1_STEEP_FX[0], in_fx[2 * k] ); /* Q(16+x) */ + Lacc1 = L_deposit_h( in_fx[2 * k] ); /* Q16+Qx */ + temp1 = extract_h( Lacc ); /* Qx */ + Lacc1 = L_msu_sat( Lacc1, AP1_STEEP_FX[0], temp1 ); /* Q16+Qx */ + mem[0] = extract_h( Lacc1 ); /* Qx */ temp[0] = temp1; move16(); move16(); - Lacc1 = L_deposit_h( mem[1] ); /* Q16+Qx */ - Lacc1 = ( L_mac_o( Lacc1, AP1_STEEP_FX[1], temp1, &Overflow ) ); /* Q16+Qx */ + Lacc1 = L_deposit_h( mem[1] ); /* Q16+Qx */ + Lacc1 = ( L_mac_sat( Lacc1, AP1_STEEP_FX[1], temp1 ) ); /* Q16+Qx */ - temp2 = extract_h( Lacc1 ); /* Qx */ - Lacc = L_msu_o( Lacc, AP1_STEEP_FX[1], temp2, &Overflow ); /* Q16+Qx */ - mem[1] = extract_h( Lacc ); /* Qx */ + temp2 = extract_h( Lacc1 ); /* Qx */ + Lacc = L_msu_sat( Lacc, AP1_STEEP_FX[1], temp2 ); /* Q16+Qx */ + mem[1] = extract_h( Lacc ); /* Qx */ temp[1] = temp2; move16(); move16(); - - Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ - out_fx[k] = extract_h( L_mac_o( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ) ); /* Qx format */ + Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ + out_fx[k] = extract_h( L_mac_sat( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2 ) ); /* Qx format */ move16(); - mem[ALLPASSSECTIONS_STEEP - 1] = extract_h( L_msu_o( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[k], &Overflow ) ); /* Qx */ + mem[ALLPASSSECTIONS_STEEP - 1] = extract_h( L_msu_sat( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[k] ) ); /* Qx */ move16(); } /* lower allpass filter chain */ - - Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */ - Lacc = L_mac_o( Lacc, AP2_STEEP_FX[0], mem[2 * ALLPASSSECTIONS_STEEP], &Overflow ); /*Q(16+x) */ - Lacc1 = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */ - temp1 = extract_h( Lacc ); /* Qx */ - Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[0], temp1, &Overflow ); /* Q(16+x) */ + Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */ + Lacc = L_mac_sat( Lacc, AP2_STEEP_FX[0], mem[2 * ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */ + Lacc1 = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */ + temp1 = extract_h( Lacc ); /* Qx */ + Lacc1 = L_msu_sat( Lacc1, AP2_STEEP_FX[0], temp1 ); /* Q(16+x) */ mem[ALLPASSSECTIONS_STEEP] = extract_h( Lacc1 ); temp[0] = temp1; move16(); - Lacc1 = L_deposit_h( mem[ALLPASSSECTIONS_STEEP + 1] ); /* Q(16+x) */ - Lacc1 = L_mac_o( Lacc1, AP2_STEEP_FX[1], temp1, &Overflow ); /* Q(16+x) */ - temp2 = extract_h( Lacc1 ); /* Qx */ + Lacc1 = L_deposit_h( mem[ALLPASSSECTIONS_STEEP + 1] ); /* Q(16+x) */ + Lacc1 = L_mac_sat( Lacc1, AP2_STEEP_FX[1], temp1 ); /* Q(16+x) */ + temp2 = extract_h( Lacc1 ); /* Qx */ temp[1] = temp2; move16(); - Lacc = L_msu_o( Lacc, AP2_STEEP_FX[1], temp2, &Overflow ); /* Q(16+x) */ - mem[ALLPASSSECTIONS_STEEP + 1] = extract_h( Lacc ); /* Qx */ + Lacc = L_msu_sat( Lacc, AP2_STEEP_FX[1], temp2 ); /* Q(16+x) */ + mem[ALLPASSSECTIONS_STEEP + 1] = extract_h( Lacc ); /* Qx */ move16(); - Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ - Lacc = L_mac_o( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ); /* Q(16+x) temp[ALLPASSSECTIONS_STEEP-1] */ - temp[2] = extract_h( Lacc ); /* temp[2] in Qx */ + Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ + Lacc = L_mac_sat( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2 ); /* Q(16+x) temp[ALLPASSSECTIONS_STEEP-1] */ + temp[2] = extract_h( Lacc ); /* temp[2] in Qx */ move16(); - Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[2], &Overflow ); /* Q(16+x) */ - mem[2 * ALLPASSSECTIONS_STEEP - 1] = extract_h( Lacc1 ); /* Qx */ + Lacc1 = L_msu_sat( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[2] ); /* Q(16+x) */ + mem[2 * ALLPASSSECTIONS_STEEP - 1] = extract_h( Lacc1 ); /* Qx */ move16(); sum = mult_r( out_fx[0], 16384 ); /* Qx */ out_fx[0] = add_sat( sum, mult_r( temp[ALLPASSSECTIONS_STEEP - 1], 16384 ) ); /* Qx */ move16(); - FOR( k = 1; k < N / 2; k++ ) { - - - Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */ - Lacc = L_mac_o( Lacc, AP2_STEEP_FX[0], in_fx[2 * k - 1], &Overflow ); /* Q(16+x):temp[0] */ - Lacc1 = L_deposit_h( in_fx[2 * k - 1] ); /* Q(16+x) */ - temp1 = extract_h( Lacc ); /* Qx */ - Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[0], temp1, &Overflow ); /* Q(16+x) */ + Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */ + Lacc = L_mac_sat( Lacc, AP2_STEEP_FX[0], in_fx[2 * k - 1] ); /* Q(16+x):temp[0] */ + Lacc1 = L_deposit_h( in_fx[2 * k - 1] ); /* Q(16+x) */ + temp1 = extract_h( Lacc ); /* Qx */ + Lacc1 = L_msu_sat( Lacc1, AP2_STEEP_FX[0], temp1 ); /* Q(16+x) */ mem[ALLPASSSECTIONS_STEEP] = extract_h( Lacc1 ); /* Qx */ move16(); temp[0] = temp1; move16(); - - Lacc1 = L_deposit_h( mem[ALLPASSSECTIONS_STEEP + 1] ); /* Q(16+x) */ - Lacc1 = L_mac_o( Lacc1, AP2_STEEP_FX[1], temp1, &Overflow ); /* Q(16+x) */ - temp2 = extract_h( Lacc1 ); /* Qx */ + Lacc1 = L_deposit_h( mem[ALLPASSSECTIONS_STEEP + 1] ); /* Q(16+x) */ + Lacc1 = L_mac_sat( Lacc1, AP2_STEEP_FX[1], temp1 ); /* Q(16+x) */ + temp2 = extract_h( Lacc1 ); /* Qx */ temp[1] = temp2; move16(); - Lacc = L_msu_o( Lacc, AP2_STEEP_FX[1], temp2, &Overflow ); /* Q(16+x) */ - mem[ALLPASSSECTIONS_STEEP + 1] = extract_h( Lacc ); /* Qx */ - - - Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ - Lacc = L_mac_o( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[1], &Overflow ); /* Q(16+x) temp[ALLPASSSECTIONS_STEEP-1] */ - temp[2] = extract_h( Lacc ); /*temp[2] in Qx */ - Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[2], &Overflow ); /* Q(16+x) */ - mem[2 * ALLPASSSECTIONS_STEEP - 1] = extract_h( Lacc1 ); /* Qx */ + Lacc = L_msu_sat( Lacc, AP2_STEEP_FX[1], temp2 ); /* Q(16+x) */ + mem[ALLPASSSECTIONS_STEEP + 1] = extract_h( Lacc ); /* Qx */ + Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ + Lacc = L_mac_sat( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[1] ); /* Q(16+x) temp[ALLPASSSECTIONS_STEEP-1] */ + temp[2] = extract_h( Lacc ); /*temp[2] in Qx */ + Lacc1 = L_msu_sat( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[2] ); /* Q(16+x) */ + mem[2 * ALLPASSSECTIONS_STEEP - 1] = extract_h( Lacc1 ); /* Qx */ sum = mult_r( out_fx[k], 16384 ); /* Qx */ out_fx[k] = add_sat( sum, mult_r( temp[ALLPASSSECTIONS_STEEP - 1], 16384 ) ); @@ -1040,6 +1019,90 @@ void Decimate_allpass_steep_fx( move16(); /* Qx */ } +/* IVAS 32-bit variant */ +void Decimate_allpass_steep_fx32( + const Word32 *in, /* i : input array of size N Qx */ + Word32 *mem, /* i/o: memory Qx */ + const Word16 N, /* i : number of input samples */ + Word32 *out /* o : output array of size N/2 Qx */ +) +{ + Word16 n, k; + Word32 temp[ALLPASSSECTIONS_STEEP]; + + /* upper allpass filter chain */ + FOR( k = 0; k < N / 2; k++ ) + { + temp[0] = Madd_32_16( mem[0], in[2 * k], AP1_STEEP_FX[0] ); // Qx + move32(); + mem[0] = Msub_32_16( in[2 * k], temp[0], AP1_STEEP_FX[0] ); // Qx + move32(); + + temp[1] = Madd_32_16( mem[1], temp[0], AP1_STEEP_FX[1] ); // Qx + move32(); + mem[1] = Msub_32_16( temp[0], temp[1], AP1_STEEP_FX[1] ); // Qx + move32(); + + out[k] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + mem[ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], out[k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + } + + /* lower allpass filter chain */ + temp[0] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP], mem[2 * ALLPASSSECTIONS_STEEP], AP2_STEEP_FX[0] ); // Qx + move32(); + mem[ALLPASSSECTIONS_STEEP] = Msub_32_16( mem[2 * ALLPASSSECTIONS_STEEP], temp[0], AP2_STEEP_FX[0] ); // Qx + move32(); + + /* for better performance, unroll this loop */ + FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { + temp[n] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP + n], temp[n - 1], AP2_STEEP_FX[n] ); // Qx + move32(); + mem[ALLPASSSECTIONS_STEEP + 1] = Msub_32_16( temp[n - 1], temp[n], AP2_STEEP_FX[n] ); // Qx + move32(); + } + + temp[ALLPASSSECTIONS_STEEP - 1] = Madd_32_16( mem[2 * ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + + mem[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + out[0] = W_round48_L( W_mac_32_16( W_mult_32_16( out[0], 16384 /*0.5 in Q15*/ ), temp[ALLPASSSECTIONS_STEEP - 1], 16384 /*0.5 in Q15*/ ) ); // Qx + move32(); + + FOR( k = 1; k < N / 2; k++ ) + { + temp[0] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP], in[2 * k - 1], AP2_STEEP_FX[0] ); // Qx + move32(); + mem[ALLPASSSECTIONS_STEEP] = Msub_32_16( in[2 * k - 1], temp[0], AP2_STEEP_FX[0] ); // Qx + move32(); + + /* for better performance, unroll this loop */ + FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { + temp[n] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP + n], temp[n - 1], AP2_STEEP_FX[n] ); // Qx + move32(); + mem[ALLPASSSECTIONS_STEEP + n] = Msub_32_16( temp[n - 1], temp[n], AP2_STEEP_FX[n] ); // Qx + move32(); + } + + temp[ALLPASSSECTIONS_STEEP - 1] = Madd_32_16( mem[2 * ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + mem[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + out[k] = W_round48_L( W_mac_32_16( W_mult_32_16( out[k], 16384 /*0.5 in Q15*/ ), temp[ALLPASSSECTIONS_STEEP - 1], 16384 /*0.5 in Q15*/ ) ); // Qx + move32(); + } + + /* z^(-1) */ + mem[2 * ALLPASSSECTIONS_STEEP] = in[N - 1]; + move32(); + + return; +} + /*-------------------------------------------------------------------* * Interpolate_allpass_steep() @@ -1057,38 +1120,34 @@ void Interpolate_allpass_steep_fx( Word16 k; Word32 Lacc = 0, Lacc1 = 0; Word16 temp1, temp2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + /*** State in Q0,in_fx Q0, AP1_STEEP in Q15 AP2_STEEP in Q15 OP in Q0 ************/ /*upper allpass filter chain */ FOR( k = 0; k < N; k++ ) { + Lacc = L_deposit_h( mem[0] ); /* Q(16+x) */ + Lacc = L_mac_sat( Lacc, AP2_STEEP_FX[0], in_fx[k] ); /* Q(16+x):temp[0] */ + Lacc1 = L_deposit_h( in_fx[k] ); /* Q(16+x) */ + temp1 = round_fx_sat( Lacc ); /* Qx */ + Lacc1 = L_msu_sat( Lacc1, AP2_STEEP_FX[0], temp1 ); /* Q(16+x) */ - Lacc = L_deposit_h( mem[0] ); /* Q(16+x) */ - Lacc = L_mac_o( Lacc, AP2_STEEP_FX[0], in_fx[k], &Overflow ); /* Q(16+x):temp[0] */ - Lacc1 = L_deposit_h( in_fx[k] ); /* Q(16+x) */ - temp1 = round_fx_o( Lacc, &Overflow ); /* Qx */ - Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[0], temp1, &Overflow ); /* Q(16+x) */ - - mem[0] = round_fx_o( Lacc1, &Overflow ); + mem[0] = round_fx_sat( Lacc1 ); move16(); - Lacc1 = L_deposit_h( mem[1] ); /* Q(16+x) */ - Lacc1 = ( L_mac_o( Lacc1, AP2_STEEP_FX[1], temp1, &Overflow ) ); /* Q(16+x):temp[1] */ + Lacc1 = L_deposit_h( mem[1] ); /* Q(16+x) */ + Lacc1 = ( L_mac_sat( Lacc1, AP2_STEEP_FX[1], temp1 ) ); /* Q(16+x):temp[1] */ Lacc = L_deposit_h( temp1 ); - temp2 = round_fx_o( Lacc1, &Overflow ); /* Qx */ - Lacc = L_msu_o( Lacc, AP2_STEEP_FX[1], temp2, &Overflow ); /* Q(16+x) */ - mem[1] = round_fx_o( Lacc, &Overflow ); /* Qx */ + temp2 = round_fx_sat( Lacc1 ); /* Qx */ + Lacc = L_msu_sat( Lacc, AP2_STEEP_FX[1], temp2 ); /* Q(16+x) */ + mem[1] = round_fx_sat( Lacc ); /* Qx */ move16(); Lacc1 = L_deposit_h( temp2 ); - Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ - out_fx[2 * k + 1] = round_fx_o( L_mac_o( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ), &Overflow ); /* Qx format */ + Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ + out_fx[2 * k + 1] = round_fx_sat( L_mac_sat( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2 ) ); /* Qx format */ move16(); - mem[ALLPASSSECTIONS_STEEP - 1] = round_fx_o( L_msu_o( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k + 1], &Overflow ), &Overflow ); /* Qx */ + mem[ALLPASSSECTIONS_STEEP - 1] = round_fx_sat( L_msu_sat( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k + 1] ) ); /* Qx */ move16(); } @@ -1096,32 +1155,92 @@ void Interpolate_allpass_steep_fx( FOR( k = 0; k < N; k++ ) { - Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */ - Lacc = L_mac_o( Lacc, AP1_STEEP_FX[0], in_fx[k], &Overflow ); /* Q(16+x):temp[0] */ - Lacc1 = L_deposit_h( in_fx[k] ); /* Q(16+x) */ - temp1 = round_fx_o( Lacc, &Overflow ); /* Qx */ - Lacc1 = L_msu_o( Lacc1, AP1_STEEP_FX[0], temp1, &Overflow ); /* Q(16+x) */ + Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */ + Lacc = L_mac_sat( Lacc, AP1_STEEP_FX[0], in_fx[k] ); /* Q(16+x):temp[0] */ + Lacc1 = L_deposit_h( in_fx[k] ); /* Q(16+x) */ + temp1 = round_fx_sat( Lacc ); /* Qx */ + Lacc1 = L_msu_sat( Lacc1, AP1_STEEP_FX[0], temp1 ); /* Q(16+x) */ - mem[ALLPASSSECTIONS_STEEP] = round_fx_o( Lacc1, &Overflow ); - Lacc1 = L_deposit_h( mem[ALLPASSSECTIONS_STEEP + 1] ); /* Q(16+x) */ - Lacc1 = L_mac_o( Lacc1, AP1_STEEP_FX[1], temp1, &Overflow ); /* Q(16+x):temp[1] */ + mem[ALLPASSSECTIONS_STEEP] = round_fx_sat( Lacc1 ); + Lacc1 = L_deposit_h( mem[ALLPASSSECTIONS_STEEP + 1] ); /* Q(16+x) */ + Lacc1 = L_mac_sat( Lacc1, AP1_STEEP_FX[1], temp1 ); /* Q(16+x):temp[1] */ - temp2 = round_fx_o( Lacc1, &Overflow ); /* Qx */ + temp2 = round_fx_sat( Lacc1 ); /* Qx */ Lacc = L_deposit_h( temp1 ); - Lacc = L_msu_o( Lacc, AP1_STEEP_FX[1], temp2, &Overflow ); /* Q(16+x) */ - mem[ALLPASSSECTIONS_STEEP + 1] = round_fx_o( Lacc, &Overflow ); /* Qx */ + Lacc = L_msu_sat( Lacc, AP1_STEEP_FX[1], temp2 ); /* Q(16+x) */ + mem[ALLPASSSECTIONS_STEEP + 1] = round_fx_sat( Lacc ); /* Qx */ Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ Lacc1 = L_deposit_h( temp2 ); - out_fx[2 * k] = round_fx_o( L_mac_o( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ), &Overflow ); /* Qx format */ + out_fx[2 * k] = round_fx_sat( L_mac_sat( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2 ) ); /* Qx format */ move16(); - mem[2 * ALLPASSSECTIONS_STEEP - 1] = round_fx_o( L_msu_o( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k], &Overflow ), &Overflow ); /* Qx */ + mem[2 * ALLPASSSECTIONS_STEEP - 1] = round_fx_sat( L_msu_sat( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k] ) ); /* Qx */ move16(); } return; } +/* IVAS 32-bit variant */ +void Interpolate_allpass_steep_fx32( + const Word32 *in_fx, /* i : input array of size N Qx */ + Word32 *mem_fx, /* i/o: memory Qx */ + const Word16 N, /* i : number of input samples */ + Word32 *out_fx /* o : output array of size 2*N Qx */ +) +{ + Word16 n, k; + Word32 temp_fx[ALLPASSSECTIONS_STEEP - 1]; + + /* upper allpass filter chain */ + FOR( k = 0; k < N; k++ ) + { + temp_fx[0] = Madd_32_16( mem_fx[0], in_fx[k], AP2_STEEP_FX[0] ); // Qx + move32(); + mem_fx[0] = Msub_32_16( in_fx[k], temp_fx[0], AP2_STEEP_FX[0] ); // Qx + move32(); + + /* for better performance, unroll this loop */ + FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { + temp_fx[n] = Madd_32_16( mem_fx[n], temp_fx[n - 1], AP2_STEEP_FX[n] ); // Qx + move32(); + mem_fx[n] = Msub_32_16( temp_fx[n - 1], temp_fx[n], AP2_STEEP_FX[n] ); // Qx + move32(); + } + + out_fx[2 * k + 1] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP - 1], temp_fx[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + mem_fx[ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp_fx[ALLPASSSECTIONS_STEEP - 2], out_fx[2 * k + 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + } + + /* lower allpass filter chain */ + FOR( k = 0; k < N; k++ ) + { + temp_fx[0] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP], in_fx[k], AP1_STEEP_FX[0] ); // Qx + move32(); + mem_fx[ALLPASSSECTIONS_STEEP] = Msub_32_16( in_fx[k], temp_fx[0], AP1_STEEP_FX[0] ); // Qx + move32(); + + /* for better performance, unroll this loop */ + FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { + temp_fx[n] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP + n], temp_fx[n - 1], AP1_STEEP_FX[n] ); // Qx + move32(); + mem_fx[ALLPASSSECTIONS_STEEP + n] = Msub_32_16( temp_fx[n - 1], temp_fx[n], AP1_STEEP_FX[n] ); // Qx + move32(); + } + + out_fx[2 * k] = Madd_32_16( mem_fx[2 * ALLPASSSECTIONS_STEEP - 1], temp_fx[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + mem_fx[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp_fx[ALLPASSSECTIONS_STEEP - 2], out_fx[2 * k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + } + + return; +} + /*-------------------------------------------------------------------* * interpolate_3_over_2_allpass_fx() @@ -1250,6 +1369,99 @@ void interpolate_3_over_2_allpass_fx( return; } +/* IVAS 32-bit variant */ +void interpolate_3_over_2_allpass_fx32( + const Word32 *input, /* i : input signal Qx*/ + const Word16 len, /* i : number of input samples */ + Word32 *out, /* o : output signal Qx*/ + Word32 *mem /* i/o: memory Qx*/ +) +{ + Word16 i, loop_len; + Word32 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ + Word32 out1_buff[L_FRAME32k * 3]; + Word32 *out1; + Word32 mem_temp; + const Word16 *filt_coeff = allpass_poles_3_ov_2; // Q15 + + out1 = out1_buff; + + FOR( i = 0; i < len; i++ ) + { + /* Upper branch */ + Vu[0] = Madd_32_16( mem[0], L_sub( input[i], mem[1] ), filt_coeff[0] ); // Qx + Q15 - Q15 -> Qx + move32(); + Vu[1] = Madd_32_16( mem[1], L_sub( Vu[0], mem[2] ), filt_coeff[1] ); // Qx + Q15 - Q15 -> Qx + move32(); + mem[3] = Madd_32_16( mem[2], L_sub( Vu[1], mem[3] ), filt_coeff[2] ); // Qx + Q15 - Q15 -> Qx + move32(); + + mem[1] = Vu[0]; // Qx + move32(); + mem[2] = Vu[1]; // Qx + move32(); + *out1++ = mem[3]; // Qx + move32(); + + /* Middle branch */ + Vm[0] = Madd_32_16( mem[0], L_sub( input[i], mem[4] ), filt_coeff[3] ); // Qx + Q15 - Q15 -> Qx + move32(); + Vm[1] = Madd_32_16( mem[4], L_sub( Vm[0], mem[5] ), filt_coeff[4] ); // Qx + Q15 - Q15 -> Qx + move32(); + mem[6] = Madd_32_16( mem[5], L_sub( Vm[1], mem[6] ), filt_coeff[5] ); // Qx + Q15 - Q15 -> Qx + move32(); + + mem[4] = Vm[0]; // Qx + move32(); + mem[5] = Vm[1]; // Qx + move32(); + *out1++ = mem[6]; // Qx + move32(); + + /* Lower branch */ + Vl[0] = Madd_32_16( mem[0], L_sub( input[i], mem[7] ), filt_coeff[6] ); // Qx + Q15 - Q15 -> Qx + move32(); + Vl[1] = Madd_32_16( mem[7], L_sub( Vl[0], mem[8] ), filt_coeff[7] ); // Qx + Q15 - Q15 -> Qx + move32(); + mem[9] = Madd_32_16( mem[8], L_sub( Vl[1], mem[9] ), filt_coeff[8] ); // Qx + Q15 - Q15 -> Qx + move32(); + + mem[0] = input[i]; // Qx + move32(); + mem[7] = Vl[0]; // Qx + move32(); + mem[8] = Vl[1]; // Qx + move32(); + *out1++ = mem[9]; // Qx + move32(); + } + + loop_len = shr( i_mult( len, 3 ), 1 ); + + /*decimate by 2 and LPF*/ + FOR( i = 0; i < loop_len; i++ ) + { + mem_temp = out1_buff[2 * i]; + move32(); + out[i] = Madd_32_16( Mpy_32_16_1( L_add( mem_temp, mem[10] ), 1550 ), L_add( mem[11], mem[14] ), -4965 ); // Qx + Q15 - Q15 -> Qx + // 0.0473147f in Q15 -> 1550, -0.151521f in Q15 -> -4965 + out[i] = Madd_32_16( out[i], L_add( mem[12], mem[13] ), 20125 ); + // 0.614152f in Q15 -> 20125 + mem[10] = mem[11]; // Qx + move32(); + mem[11] = mem[12]; // Qx + move32(); + mem[12] = mem[13]; // Qx + move32(); + mem[13] = mem[14]; // Qx + move32(); + mem[14] = mem_temp; // Qx + move32(); + } + + return; +} + /*-------------------------------------------------------------------* * interpolate_3_over_1_allpass_fx() @@ -1445,6 +1657,92 @@ void interpolate_3_over_1_allpass_fx( return; } +/* IVAS 32-bit variant */ +void interpolate_3_over_1_allpass_fx32( + const Word32 *input, /* i : input signal Qx */ + const Word16 len, /* i : number of input samples */ + Word32 *out, /* o : output signal */ + Word32 *mem /* i/o: memory */ +) +{ + Word16 i, tmp16; + Word32 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ + Word32 *out1; + Word32 mem_temp; + const Word16 *filt_coeff = allpass_poles_3_ov_2; // Qx + + out1 = &out[0]; + + FOR( i = 0; i < len; i++ ) + { + /* Upper branch */ + Vu[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[1] ), filt_coeff[0] ) ); // Qx + move32(); + Vu[1] = L_add_sat( mem[1], Mpy_32_16_1( L_sub( Vu[0], mem[2] ), filt_coeff[1] ) ); // Qx + move32(); + mem[3] = L_add_sat( mem[2], Mpy_32_16_1( L_sub( Vu[1], mem[3] ), filt_coeff[2] ) ); // Qx + move32(); + + mem[1] = Vu[0]; // Qx + move32(); + mem[2] = Vu[1]; // Qx + move32(); + *out1++ = mem[3]; // Qx + move32(); + + /* Middle branch */ + Vm[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[4] ), filt_coeff[3] ) ); // Qx + move32(); + Vm[1] = L_add_sat( mem[4], Mpy_32_16_1( L_sub( Vm[0], mem[5] ), filt_coeff[4] ) ); // Qx + move32(); + mem[6] = L_add_sat( mem[5], Mpy_32_16_1( L_sub( Vm[1], mem[6] ), filt_coeff[5] ) ); // Qx + move32(); + + mem[4] = Vm[0]; // Qx + move32(); + mem[5] = Vm[1]; // Qx + move32(); + *out1++ = mem[6]; // Qx + move32(); + + /* Lower branch */ + Vl[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[7] ), filt_coeff[6] ) ); // Qx + move32(); + Vl[1] = L_add_sat( mem[7], Mpy_32_16_1( L_sub( Vl[0], mem[8] ), filt_coeff[7] ) ); // Qx + move32(); + mem[9] = L_add_sat( mem[8], Mpy_32_16_1( L_sub( Vl[1], mem[9] ), filt_coeff[8] ) ); // Qx + move32(); + + mem[0] = input[i]; // Qx + move32(); + mem[7] = Vl[0]; // Qx + move32(); + mem[8] = Vl[1]; // Qx + move32(); + *out1++ = mem[9]; // Qx + move32(); + } + + /*LPF*/ + tmp16 = imult1616( len, 3 ); + FOR( i = 0; i < tmp16; i++ ) + { + mem_temp = out[i]; // Qx + move32(); + out[i] = L_sub_sat( Mpy_32_16_1( L_add_sat( mem[12], mem[11] ), 18768 ), Mpy_32_16_1( L_add_sat( mem_temp, mem[10] ), 2425 ) ); // Qx + // 0.572769 in Q15 -> 18768, 0.074005 in Q15 -> 2425 + move32(); + mem[10] = mem[11]; // Qx + move32(); + mem[11] = mem[12]; // Qx + move32(); + mem[12] = mem_temp; // Qx + move32(); + } + + return; +} + /*-------------------------------------------------------------------* * decimate_3_over_2_allpass_fx() diff --git a/lib_com/mslvq_com.c b/lib_com/mslvq_com.c deleted file mode 100644 index 12234a4c055664712312c284ce500a2a019c119a..0000000000000000000000000000000000000000 --- a/lib_com/mslvq_com.c +++ /dev/null @@ -1,208 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include "cnst.h" -#include "rom_com.h" -#include "prot_fx.h" -#include "wmc_auto.h" -#include "ivas_prot_fx.h" - -/*-----------------------------------------------------------------* - * Local function prototypes - *-----------------------------------------------------------------*/ - -static void make_offset_scale( - const UWord32 tab_no_cv[], - const Word8 *no_ld, - const Word16 no_scl, - UWord32 *offset_scale ) -{ - Word16 i; - - offset_scale[0] = 1; - move32(); - FOR( i = 1; i <= no_scl; i++ ) - { - offset_scale[i] = UL_addNsD( offset_scale[i - 1], tab_no_cv[(Word16) no_ld[i - 1]] ); - move32(); - } - - return; -} - -/*-----------------------------------------------------------------* - * create_offset() - * - * - *-----------------------------------------------------------------*/ - -void create_offset( - UWord32 *offset_scale1, - UWord32 *offset_scale2, - const Word16 mode, - const Word16 prediction_flag ) -{ - Word16 tmp, tmp1; - - if ( prediction_flag == 0 ) - { - /* safety_net */ - tmp = no_lead_idx[mode][0]; - if ( ( tmp <= LIMIT_LEADER ) && ( tmp < no_lead_idx[mode][1] - 2 ) ) - { - tmp += DELTA_LEADER; - } - make_offset_scale( table_no_cv, leaders_short[tmp], MAX_NO_SCALES, offset_scale1 ); - make_offset_scale( table_no_cv, leaders_short[no_lead_idx[mode][1]], MAX_NO_SCALES, offset_scale2 ); - } - else - { - tmp = no_lead_p_idx[mode][0]; - tmp1 = no_lead_p_idx[mode][1]; - if ( ( tmp <= LIMIT_LEADER ) && ( tmp < tmp1 - 2 ) ) - { - tmp += DELTA_LEADER; - } - - if ( ( tmp == LIMIT_LEADER ) && ( tmp1 == 0 ) ) - { - tmp += DELTA_LEADER; - tmp1 = DELTA_LEADER; - } - - make_offset_scale( table_no_cv, leaders_short[tmp], MAX_NO_SCALES, offset_scale1 ); - make_offset_scale( table_no_cv, leaders_short[tmp1], MAX_NO_SCALES, offset_scale2 ); - } - - return; -} - -/*-----------------------------------------------------------------* - * sort_desc_ind() - * - * sorts in descending order and computes indices in the sorted vector - *-----------------------------------------------------------------*/ -void sort_desc_ind_16_fx( - Word16 *s, /* i/o: vector to be sorted Qx*/ - const Word16 len, /* i : vector length */ - Word16 *ind /* o : array of indices */ -) -{ - Word16 i, k, sorted, a; - Word16 t; - - FOR( i = 0; i < len; i++ ) - { - ind[i] = i; - move16(); - } - sorted = 0; - move16(); - FOR( k = len - 1; k && !sorted; k-- ) - { - sorted = 1; - move16(); - FOR( i = 0; i < k; i++ ) - { - IF( LT_16( s[i], s[i + 1] ) ) - { - sorted = 0; - move16(); - t = s[i]; - move16(); - s[i] = s[i + 1]; - move16(); - s[i + 1] = t; - move16(); - a = ind[i]; - move16(); - ind[i] = ind[i + 1]; - move16(); - ind[i + 1] = a; - move16(); - } - } - } - - return; -} - -void sort_desc_ind_32_fx( - Word32 *s, /* i/o: vector to be sorted Qx*/ - const Word16 len, /* i : vector length */ - Word16 *ind /* o : array of indices */ -) -{ - Word16 i, k, sorted, a; - Word32 t; - - FOR( i = 0; i < len; i++ ) - { - ind[i] = i; - move16(); - } - sorted = 0; - move16(); - FOR( k = len - 1; k && !sorted; k-- ) - { - sorted = 1; - move16(); - FOR( i = 0; i < k; i++ ) - { - IF( LT_32( s[i], s[i + 1] ) ) - { - sorted = 0; - move16(); - t = s[i]; - move16(); - s[i] = s[i + 1]; - move16(); - s[i + 1] = t; - move16(); - a = ind[i]; - move16(); - ind[i] = ind[i + 1]; - move16(); - ind[i + 1] = a; - move16(); - } - } - } - - return; -} diff --git a/lib_com/mslvq_com_fx.c b/lib_com/mslvq_com_fx.c index 10e5604335a7b1ad471ffb3cf631bf2b8c6856aa..bbca861591070cc59549d592ad221314cc7ebfd9 100644 --- a/lib_com/mslvq_com_fx.c +++ b/lib_com/mslvq_com_fx.c @@ -30,11 +30,16 @@ *******************************************************************************************************/ +#include #include "options.h" +#include "cnst.h" #include "prot_fx.h" #include "ivas_cnst.h" #include "stl.h" #include "rom_com.h" +#include "ivas_prot_fx.h" +#include "wmc_auto.h" + /*-----------------------------------------------------------------* * Local functions @@ -121,99 +126,74 @@ void init_lvq_fx( ) { Word16 i, j; -#ifdef OPT_STEREO_32KBPS_V1 Word16 k; -#endif /* OPT_STEREO_32KBPS_V1 */ /* safety-net mode */ FOR( i = 0; i < MAX_NO_MODES; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 - FOR( ( j = 0, k = 0 ); j < MAX_NO_SCALES; ( j++, k++ ) ) + FOR( ( j = 0, k = 0 ); j < MAX_NO_SCALES; j++ ) { - if ( ( no_lead_fx[i][j] <= 0 ) ) + if ( no_lead_fx[i][j] > 0 ) { - j = MAX_NO_SCALES; + k = add( k, 1 ); + } + if ( no_lead_fx[i][j] <= 0 ) + { + j = MAX_NO_SCALES - 1; + move16(); } } no_scales[i][0] = k; move16(); - FOR( k = 0; j < MAX_NO_SCALES << 1; ( j++, k++ ) ) + FOR( k = 0; j < MAX_NO_SCALES << 1; j++ ) { + if ( no_lead_fx[i][j] > 0 ) + { + k = add( k, 1 ); + } if ( no_lead_fx[i][j] <= 0 ) { j = MAX_NO_SCALES << 1; + move16(); } } no_scales[i][1] = k; move16(); -#else /* OPT_STEREO_32KBPS_V1 */ - j = 0; - move16(); - test(); - WHILE( ( LT_16( j, MAX_NO_SCALES ) ) && ( no_lead_fx[i][j] > 0 ) ) - { - j++; - } - no_scales[i][0] = j; - move16(); - j = MAX_NO_SCALES; - move16(); - test(); - WHILE( ( LT_16( j, shl( MAX_NO_SCALES, 1 ) ) ) && ( no_lead_fx[i][j] > 0 ) ) - { - j++; - } - no_scales[i][1] = sub( j, MAX_NO_SCALES ); - move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ } /* predictive mode */ FOR( i = 0; i < MAX_NO_MODES_p; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 - FOR( ( j = 0, k = 0 ); j < MAX_NO_SCALES; ( j++, k++ ) ) + FOR( ( j = 0, k = 0 ); j < MAX_NO_SCALES; j++ ) { - + if ( no_lead_p_fx[i][j] > 0 ) + { + k = add( k, 1 ); + } if ( ( no_lead_p_fx[i][j] <= 0 ) ) { - j = MAX_NO_SCALES; + j = MAX_NO_SCALES - 1; + move16(); } } no_scales_p[i][0] = k; move16(); - FOR( k = 0; j < MAX_NO_SCALES << 1; ( j++, k++ ) ) + FOR( k = 0; j < MAX_NO_SCALES << 1; j++ ) { + if ( no_lead_p_fx[i][j] > 0 ) + { + k = add( k, 1 ); + } if ( ( no_lead_p_fx[i][j] <= 0 ) ) { j = MAX_NO_SCALES << 1; + move16(); } } no_scales_p[i][1] = k; move16(); -#else /* OPT_STEREO_32KBPS_V1 */ - j = 0; - move16(); - WHILE( ( LT_16( j, MAX_NO_SCALES ) ) && ( no_lead_p_fx[i][j] > 0 ) ) - { - test(); - j++; - } - no_scales_p[i][0] = j; - move16(); - j = MAX_NO_SCALES; - move16(); - WHILE( ( LT_16( j, shl( MAX_NO_SCALES, 1 ) ) ) && ( no_lead_p_fx[i][j] > 0 ) ) - { - test(); - j++; - } - no_scales_p[i][1] = sub( j, MAX_NO_SCALES ); - move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ } /* index offsets for each truncation */ init_offset_fx( offset_scale1, offset_scale2, offset_scale1_p, offset_scale2_p, no_scales, no_scales_p ); @@ -241,6 +221,25 @@ static void make_offset_scale_fx( return; } +static void make_offset_scale( + const UWord32 tab_no_cv[], + const Word8 *no_ld, + const Word16 no_scl, + UWord32 *offset_scale ) +{ + Word16 i; + + offset_scale[0] = 1; + move32(); + FOR( i = 1; i <= no_scl; i++ ) + { + offset_scale[i] = UL_addNsD( offset_scale[i - 1], tab_no_cv[(Word16) no_ld[i - 1]] ); + move32(); + } + + return; +} + void init_offset_fx( Word32 offset_scale1[][MAX_NO_SCALES + 1], /* o: lattice truncation index offset for the first LSF subvector - safety net structures*/ Word32 offset_scale2[][MAX_NO_SCALES + 1], /* o: lattice truncation index offset for the second LSF subvector - safety net structures*/ @@ -461,12 +460,10 @@ static Word16 decode_indexes_ivas_fx( IF( index[i] < 0 ) { set16_fx( x_lvq, 0, 2 * LATTICE_DIM ); -#ifdef MSAN_FIX scales_mslvq[0] = 0; move16(); scales_mslvq[1] = 0; move16(); -#endif index[i] = 0; return 1; } @@ -491,10 +488,8 @@ static Word16 decode_indexes_ivas_fx( FOR( i = 0; i < LATTICE_DIM; i++ ) { x_lvq[i] = 0; -#ifdef MSAN_FIX scales_mslvq[0] = 0; move16(); -#endif } } ELSE @@ -503,12 +498,10 @@ static Word16 decode_indexes_ivas_fx( { /* safety check in case of bit errors */ set16_fx( x_lvq, 0, 2 * LATTICE_DIM ); -#ifdef MSAN_FIX scales_mslvq[0] = 0; move16(); scales_mslvq[1] = 0; move16(); -#endif return 1; } @@ -549,10 +542,8 @@ static Word16 decode_indexes_ivas_fx( x_lvq[i] = 0; move16(); } -#ifdef MSAN_FIX scales_mslvq[1] = 0; move16(); -#endif } ELSE { @@ -1299,6 +1290,104 @@ static void put_value_fx( return; } +/*-----------------------------------------------------------------* + * create_offset() + * + * + *-----------------------------------------------------------------*/ + +void create_offset( + UWord32 *offset_scale1, + UWord32 *offset_scale2, + const Word16 mode, + const Word16 prediction_flag ) +{ + Word16 tmp, tmp1; + + if ( prediction_flag == 0 ) + { + /* safety_net */ + tmp = no_lead_idx[mode][0]; + if ( ( tmp <= LIMIT_LEADER ) && ( tmp < no_lead_idx[mode][1] - 2 ) ) + { + tmp += DELTA_LEADER; + } + make_offset_scale( table_no_cv, leaders_short[tmp], MAX_NO_SCALES, offset_scale1 ); + make_offset_scale( table_no_cv, leaders_short[no_lead_idx[mode][1]], MAX_NO_SCALES, offset_scale2 ); + } + else + { + tmp = no_lead_p_idx[mode][0]; + tmp1 = no_lead_p_idx[mode][1]; + if ( ( tmp <= LIMIT_LEADER ) && ( tmp < tmp1 - 2 ) ) + { + tmp += DELTA_LEADER; + } + + if ( ( tmp == LIMIT_LEADER ) && ( tmp1 == 0 ) ) + { + tmp += DELTA_LEADER; + tmp1 = DELTA_LEADER; + } + + make_offset_scale( table_no_cv, leaders_short[tmp], MAX_NO_SCALES, offset_scale1 ); + make_offset_scale( table_no_cv, leaders_short[tmp1], MAX_NO_SCALES, offset_scale2 ); + } + + return; +} + +/*-----------------------------------------------------------------* + * sort_desc_ind() + * + * sorts in descending order and computes indices in the sorted vector + *-----------------------------------------------------------------*/ + +void sort_desc_ind_32_fx( + Word32 *s, /* i/o: vector to be sorted Qx*/ + const Word16 len, /* i : vector length */ + Word16 *ind /* o : array of indices */ +) +{ + Word16 i, k, sorted, a; + Word32 t; + + FOR( i = 0; i < len; i++ ) + { + ind[i] = i; + move16(); + } + sorted = 0; + move16(); + FOR( k = len - 1; k && !sorted; k-- ) + { + sorted = 1; + move16(); + FOR( i = 0; i < k; i++ ) + { + IF( LT_32( s[i], s[i + 1] ) ) + { + sorted = 0; + move16(); + t = s[i]; + move16(); + s[i] = s[i + 1]; + move16(); + s[i + 1] = t; + move16(); + a = ind[i]; + move16(); + ind[i] = ind[i + 1]; + move16(); + ind[i + 1] = a; + move16(); + } + } + } + + return; +} + void deindex_lvq_SHB_fx( UWord32 index, Word16 *out, diff --git a/lib_com/oper_32b.c b/lib_com/oper_32b.c index be34a12481f96713597bce743c203af7811e3719..cb8c773004d605c06b6b3b595db70639be814a36 100644 --- a/lib_com/oper_32b.c +++ b/lib_com/oper_32b.c @@ -124,13 +124,10 @@ Word32 L_Comp( Word16 hi, Word16 lo ) Word32 Mpy_32( Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2 ) { Word32 L_32; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif L_32 = L_mult( hi1, hi2 ); - L_32 = L_mac_o( L_32, mult( hi1, lo2 ), 1, &Overflow ); - L_32 = L_mac_o( L_32, mult( lo1, hi2 ), 1, &Overflow ); + L_32 = L_mac_sat( L_32, mult( hi1, lo2 ), 1 ); + L_32 = L_mac_sat( L_32, mult( lo1, hi2 ), 1 ); return ( L_32 ); } @@ -159,13 +156,10 @@ Word32 Mpy_32( Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2 ) Word32 Mac_32( Word32 L_num, Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2 ) { Word32 L_32; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - L_32 = L_mac_o( L_num, hi1, hi2, &Overflow ); - L_32 = L_mac_o( L_32, mult( hi1, lo2 ), 1, &Overflow ); - L_32 = L_mac_o( L_32, mult( lo1, hi2 ), 1, &Overflow ); + L_32 = L_mac_sat( L_num, hi1, hi2 ); + L_32 = L_mac_sat( L_32, mult( hi1, lo2 ), 1 ); + L_32 = L_mac_sat( L_32, mult( lo1, hi2 ), 1 ); return ( L_32 ); } @@ -193,12 +187,9 @@ Word32 Mac_32( Word32 L_num, Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2 ) Word32 Sqr_32( Word16 hi, Word16 lo ) { Word32 L_32; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - L_32 = L_mult_o( hi, hi, &Overflow ); - L_32 = L_mac_o( L_32, mult( hi, lo ), 2, &Overflow ); + L_32 = L_mult_sat( hi, hi ); + L_32 = L_mac_sat( L_32, mult( hi, lo ), 2 ); return ( L_32 ); } diff --git a/lib_com/options.h b/lib_com/options.h index 841eb6a2bdf37a5c163a9c905bfe78f7d3092a12..018f576652166982bddf1ad02a7a1923940f6591 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef OPTIONS_H @@ -43,139 +43,47 @@ /*#define DEBUGGING*/ /* Allows debugging message to be printed out during runtime */ #ifdef DEBUGGING +/*#define DBG_BITSTREAM_ANALYSIS*/ /* Write bitstream with annotations to a text file */ #define DEBUG_MODE_INFO /* Define to output most important parameters to the subdirectory "res/" */ #define DEBUG_MODE_INFO_TWEAK /* Enable command line switch to specify subdirectory for debug info output inside "./res/" */ #define DEBUG_FORCE_MDCT_STEREO_MODE /* Force stereo mode decision for MDCT stereo: -stereo 3 1 forces L/R coding and -stereo 3 2 forces full M/S coding */ /*#define DEBUG_FORCE_DIR*/ /* Force modes/parameters by reading from external binary files */ /*#define DBG_WAV_WRITER*/ /* Enable dbgwrite_wav() function for generating ".wav" files */ #define SUPPORT_FORCE_TCX10_TCX20 /* VA: Enable -force tcx10|tcx20 command-line option */ +/*#define DEBUG_MODE_JBM */ /* define to output JBM relevant parameters */ #endif #define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ -/*#define WMOPS*/ /* Activate complexity and memory counters */ +/*#define WMOPS*/ /* Activate complexity and memory counters */ #ifdef WMOPS -/*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ -/*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ -/*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ -/*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ +#define WMOPS_PER_FRAME /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ +#define WMOPS_DETAIL /* Output detailed complexity printout for every function. Increases runtime overhead */ +#define WMOPS_WC_FRAME_ANALYSIS /* Output detailed complexity analysis for the worst-case frame */ +/*define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ #endif +/*#define DISABLE_LIMITER*/ +/*#define DEBUG_APA_SILENCE_NON_SCALED*/ /* Switch APA into mode that replaces contents of non-scaled frames with silence. Useful for identifying scaled regions in the audio output of the decoder */ + /* #################### End DEBUGGING switches ############################ */ -#ifndef BASOP_NOGLOB_DEV_USE_GLOBALS -#define BASOP_NOGLOB_DECLARE_LOCAL -#endif -#define IVAS_FLOAT_FIXED_CONVERSIONS /* Temporary macro to keep track of intermediate flt to fixed and fixed to flt conversions */ -#define MSAN_FIX -#define FIX_TMP_714 -#define BASOP_NOGLOB_TMP_715 -#define EVS_FUNC_MODIFIED -#define REMOVE_IVAS_UNUSED_PARAMETERS_WARNING /*temporary operation on unused EVS parameters to remove warnings, these parameters will be used in IVAS */ -#define MOD_BIT_ALLOC_ROM_TABLE /* Just to highlight modification in bit allocation table and to ensure these modifications doesn't affect EVS modes*/ -#define SIMPLIFY_CODE_BE // Simplify synthesis loop -#define CR_2109_to_2112_cd0_ce0 /* This is related to the CRs include in the 26.444 package of 21-12. Concerns lead_deindexing and */ -#define FIX_QMETADATA_PENALTY /* Nokia: transform penalty calculation in qmetadata into integer operations */ -#define FIX_1013_CRASH_HQ_CORE_DEC /* Ittiam: Saturation added on the lines of EVS */ -#define NONE_BE_FIX_BASOP_1044_OSBA_PRERENDER_MIX_GAINS /* DLB: adjust prerendering and mixing gain in OSBA encoder. This is fix to float codes*/ -#define NONBE_1233_HQ_CLASSIFIER_DIV_BY_ZERO /* Eri: issue 1233: Address possible division by zero in hf_spectrum_sparseness() */ -#define FIX_ISSUE_1062_AND_1068_TON_ENE_EST_FX -#define FIX_ISSUE_987 -#define FIX_1054_IF_ELSE_CMPLX /* VA: Fix 1054 incorrect counting of complexity when ELSE-IF sequence is encoutered in two functions */ -#define FIX_1052_COPY_CMPLX_DISCREPANCY /* VA: modify IF-ELSE statements used in Copy*() functions to avoid dependency on x[] and y[] in RAM */ -#define FIX_1049_SHR_RO_COMPLEXITY /* VA: fix for issue 1049: incorrect counting of complexity in the shr_ro() function */ -#define NONBE_IMPROVE_DIRAC_INTENSITY_PREC -#define FIX_1103_OPT_L_NORM_ARR /* FhG: Optimize L_norm_arr(), avoid IF */ -#define FIX_1105_OPT_MINIMUM_SL /* FhG: Optimize minimum_s(), minimum_l(), avoid IF */ -#define FIX_1104_OPT_GETMINSCALEFAC /* FhG: Optimize get_min_scalefactor(), avoid IF */ -#define FIX_1106_SIMPLIFY_SET32FX /* FhG: simplify set32_fx() */ -#define FIX_1107_VADDINC /* FhG: Optimize v_add_inc_fx() for most frequent case */ -#define FIX_1009_OPT_PARAMMC_RENDER /* FhG: Optimize ivas_param_mc_dec_render_fx() */ -#define FIX_1109_OPTIM_MCT_STEREO_IGF_DEC /* FhG: optimize mctStereoIGF_dec_fx() */ -#define FIX_1110_OPTIM_DIRAC_DECORR_PROC /* FhG: optimize ivas_dirac_dec_decorr_process() */ -#define FIX_1127_IMPROVE_SBA_MLD /* Ittiam: Avoid saturation for DiRAC reference power */ -#define FIX_1100_REMOVE_LPC_RESCALING /* VA: Remove the rescaling of LPC coefficient to Q12 as residu and syn-filt are already taking care of it*/ -#define FIX_1133_IMPROVE_MC_MLD /* Ittiam: Correcting wrong updation of exponents in ivas_mc_paramupmix_param_est_enc_fx() */ -#define FIX_ISSUE_1122 /* Ittiam: Fix issue 1122: corrected incorrect scaling of a buffer leading to incorrect metadata bits */ -#define FIX_ISSUE_1125 /* Ittiam: Fix issue 1125: interfering talker flag not triggered on short test vector */ -#define FIX_1132_STACK_CORRUPTION /* Stack corruption issue due of extending index access*/ -#define FIX_ISSUE_1092 /* Ittiam: Fix for Issue 1092: BASOP asserts in stereo fx encoder for selection test inputs*/ -#define FIX_ISSUE_1135 /* Ittiam: Fix for Issue 1135: downmixing difference between float and fixed-point (DFT - stereo) */ -#define FIX_ISSUE_1148 -#define FIX_ISSUE_1147 /* Ittiam: Fix for issue 1147: Added saturation in DetectTnsFilt_fx.*/ -#define FIX_ISSUE_1150 /* Ittiam: Fix for Issue 1150: Assertion error observed in evs_enc_fx (with option stereo_dmx_evs) from tcx_ltp_find_gain function*/ -#define FIX_ISSUE_1151 /* Ittiam: Fix for Issue 1151: Assertion error observed in evs_enc_fx (with option stereo_dmx_evs) from sp_mus_classif_gmm_fx function*/ -#define FIX_ISSUE_1153 /* Ittiam: Fix for Issue 1153: Assertion error observed in stereo_dmx_evs_enc_fx from calc_poc_fx function*/ -#define FIX_ISSUE_1154 /* Ittiam: Fix for Issue 1154: Encoder crash for ParamMC 7.1 at 96kbps in ivas_param_mc_param_est_enc_fx() */ -#define FIX_ISSUE_1157 /* Ittiam: Fix for Issue 1157: Encoder crash for Stereo at 48/64kbps DTX on/off in kernel_switch_trafo_fx() */ -#define FIX_ISSUE_1152 /* Ittiam: Fix for issue 1152: Assertion error observed in evs_enc_fx (with option stereo_dmx_evs) from find_tilt_fx function*/ -#define FIX_ISSUE_1156 /* Ittiam: Fix for Issue 1156: Encoder crash for Stereo at 32kbps in SWB_BWE_encoding_ivas_fx() */ -#define FIX_DISCLAIMER /* VA: Add disclaimer for external renderer + Add info about IVAS reference version (FLP issue 1225) */ -#define FIX_ISSUE_1167 /* Ittiam: Fix for Issue 1167: Encoder crash for OSBA ISM3SBA1 at 13.2 and 16.4 kbps in gauss_L2_ivas_fx() */ -#define FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC /* FhG: Reduce workload of binaural rendering: replace 1./tmp & sqrt by Isqrt32 */ -#define FIX_1113_OPT_DIRAC_BIN_REND /* FhG: Various optimizations to ivas_dirac_dec_binaual_functions.c */ -#define FIX_ISSUE_1187 /* Ittiam: Fix for issue 1187: Assertion error observed in evs_enc_fx (with option stereo_dmx_evs) from bass_pf_enc_fx function*/ -#define FIX_ISSUE_1186 /* Ittiam: Fix for Issue 1186: Energy/scaling issue for ISM-1 at all bitrates */ -#define FIX_ISSUE_1165 /* Ittiam: Fix for issue 1165: Assertion in lpc2lsp_fx for OMASA LTV input */ -#define FIX_ISSUE_1185 /* Ittiam: Fix for issue 1185: Assertion in ivas_dirac_dec_binaural_internal_fx() for crash in decoder in fft30_with_cmplx_data()*/ -#define FIX_ISSUE_1209 /* Ittiam: Fix for issue 1209: Assertion exit in BASOP encoder (stereo_dmx_evs)*/ -#define FIX_ISSUE_1218 /* Ittiam: Fix for issue 1218: Assert in stereo_dft_generate_comfort_noise_fx of BASOP decoder with BASOP MASA DTX bitstream at 32 kbps*/ -#define FIX_ISSUE_1290 /* Ittiam: Fix for issue 1218: Assert in stereo_dft_generate_comfort_noise_fx of BASOP decoder with BASOP MASA DTX bitstream at 32 kbps*/ -#define IVAS_ISSUE_1188_EVS_CRASH /* Ittiam: Fix for issue 1188: Issue due to ASAN */ -#define FIX_ISSUE_1155 /* Ittiam: Fix for issue 1155: Encoder crash for Stereo at 32kbps in PostShortTerm_ivas_enc_fx()*/ -#define FIX_1010_OPT_DIV /* FhG: SVD complexity optimizations (non-be) */ -#define FIX_1010_OPT_SINGLE_RESCALE /* FhG: SVD complexity optimizations (non-be) */ -#define FIX_1010_OPT_GIVENS /* FhG: SVD complexity optimizations (non-be) */ -#define FIX_1010_OPT_GIVENS_INV /* FhG: SVD complexity optimizations (non-be) */ -#define FIX_1010_OPT_NORM_NOSAT /* FhG: SVD complexity optimizations (non-be) */ -#define FIX_1010_OPT_SEC_SINGLE_RESCALE /* FhG: SVD complexity optimizations (non-be) */ -#define FIX_1072_SPEEDUP_matrixTransp2Mul_fx /* FhG: complexity optimization (non-be) */ -#define FIX_1072_REDUCE_DIVS /* FhG: complexity optimization (non-be) */ -#define FIX_ISSUE_1230 /* Ittiam: Fix for issue 1230: Basop Enc audible differences and distortion @16kbps */ -#define NONBE_1211_DTX_BR_SWITCHING /* VA: port float issue 1211: fix crash in MASA DTX bitrate switching */ -#define FIX_1189_GSC_IVAS_OMASA /* VA: Fix for issue 1189: Bitstream desynchornization due to reading/writing of the GSC_IVAS_mode parameter */ -#define NONBE_1273_ISM_METADATA_COUNTER /* VA: BASOP issue 1265, FLP issue 1273: fix counter overflow in ISM metadata encoder */ -#define NONBE_FIX_GSC_BSTR /* VA: issue 1264 FLP (1189 BASOP): Fix bitstream synchronization between encoder and decoder in ACELP GSC in OMASA */ -#define FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF /* FhG: fix for issue 1101: complexity of spar dec upmixer */ -/* Note: each compile switch (FIX_1101_...) is independent from the other ones */ -#define FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_USE_MADD_ADD_WEIGHTS /* FhG: Defines 1.0f-weight variables, uses Madd operation instead of L_add_sat */ -#define FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_SPLIT_LOOPS /* FhG: Splits single loop with IF-statements into two low-complex loops */ -#define FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_HQ_CONSTANTS /* FhG: IMPROVE PRECISION: Uses 1/6 and 1/20 in full-precise Q31 constants instead of Q15 */ -#define FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_USE_UNIQUE_SHL /* FhG: Uses unique shift amount in each loop iteration */ -#define FIX_11_1_IVAS_SPAR_DEC_UPMIXER_SF_RND_COEFFS /* FhG ivas_spar_com.c: Zeroes very small negative coeffs via L_shr_r (was L_shr) */ -#define FIX_ISSUE_1237 /* VA: replacement of Copy_Scale_sig_16_32_DEPREC() that are doing 16 bits left shift by Copy_Scale_sig_16_32_no_sat() */ -#define FIX_ISSUE_1237_KEEP_EVS_BE /* VA: Fix to keep EVS bitexactness to 26.444 */ -#define FIX_ISSUE_1214 /* Ittiam: Fix for issue 1214: Energy leakage in IGF tiles for MDCT-stereo @64kbps SWB*/ -#define FIX_881_HILBERT_FILTER /* VA: improve the precision of the Hilbert filter to remove 2kHz unwanted tone */ -#define FIX_ISSUE_1245 /* Ittiam: Fix for issue 1245: Basop Encoder: Audible noise for silent Stereo input DTX on @24.4 kbps, @32 kbps*/ -#define FIX_ISSUE_1291 /* Ittiam: Wrong use of imult1616() in ACELP rescaling */ -#define FIX_920_IGF_INIT_ERROR /* FhG: issue 920: fix bitrate mismatch in initial IGF config to avoid error message in same cases */ -#define FIX_MINOR_SVD_WMOPS_MR1010X /* FhG: Minor WMOPS tuning, bit-exact to previous version, saves about 8.2 WMOPS for MR1010 */ -#define FIX_USAN_ISSUES /* Ittiam: Fix issues reported by USAN */ -#define SVD_WMOPS_OPT /* Ittiam : SVD related optimizations */ -#define NONBE_FIX_1087_OOB_SBA_DTX_RS /* VA: issue 1087: Extend the length of the buffer for MCT decoding to avoid out-of-bound writing in SBA SID bitrate switching decoding */ -#define FIX_ISSUE_1279 /* VA: correction of wrong scaling update */ -#define FIX_ISSUE_1247 -#define NONBE_FIX_1087_OOB_SBA_DTX_RS /* VA: issue 1087: Extend the length of the buffer for MCT decoding to avoid out-of-bound writing in SBA SID bitrate switching decoding */ -#define FIX_1285_DECODER_CRASH -#define FIX_1072_SPEEDUP_gainpanning /* FhG: Minor WMOPS tuning, nonbe */ -#define FIX_1072_SPEEDUP_COMPUTEDIFUSENESS /* FhG: Minor WMOPS tuning, nonbe */ -#define FIX_1320_LOWRATE_ACELP -#define FIX_1297_OVERFLOW /* VA: fixes issue with overflows in pre-processing */ -#define FIX_1298 /* VA: fix possible assert in gaus_enc */ -#define FIX_1300_ICA_SHIFT_QUANT_IMPROV /* VA: Fix to 1300 to improve precision of the lag quantizer */ -#define FIX_1301_CORRECT_TD_CNST /* VA: Fix 1301, correct wrong constant in TD stereo */ -#define NONBE_FIX_1277_EVS_DTX_HIGH_RATE_THRESHOLD /* VA/Eri: FLP issue 1277: Fix Mismatch in DTX high-rate threshold between EVS float and BASOP */ -#define NONBE_FIX_708_OSBA_BR_SWITCHING_CRASH /* FhG: issue 708: fix crash in OSBA BR switching with long test vectors */ -//#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ -#define DOT_PROD_CHOLESKY_64BIT /* FhG: Issue 1323, optimized 64 bit implementation of dot_product_cholesky() */ -#define OPT_BASOP_ADD_v1 /* optimizations to avoid usage of BASOP_Util_Add_MantExp */ -#define FIX_ISSUE_1327 /* Ittiam: Fix for issue 1327: Glitch when stereo is switching from TD to FD*/ -#define NONBE_FIX_1402_WAVEADJUST /* VA: BASOP iisue 1402: fix waveform adjustment decoder PLC */ -#define FIX_ISSUE_1376 /* VA: Fix for issue 1376 (issue with GSC excitation) */ -#define OPT_SBA_AVOID_SPAR_RESCALE /* Optimization made to spar decoder and IGF */ - -#define IMPROV_PRECISION /* Place where precision can be cost free improved */ -#define IMPROV_PRECISION_EVSBE /* Place where precision can be cost free improved, might affect EVS BE */ +/* ################### Start FIXES switches ########################### */ +/*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ +#define FIX_1990_SANITIZER_IN_REVERB_LOAD /* Nokia: Fix issue part of issue 1990 by introducing missing free of structure - keep until #2059 is addressed */ +#define FIX_1999_TEMPORARY_DISABLE_DIST_ATT_CHECK /* Eri: Issue 1999: Range check on float values of distance attenuation, while the float values are not propagated to this function. The test is not correct, but configurable distance attenuation is not used in Characterization.*/ + +/* ################### End FIXES switches ########################### */ + +/* #################### Start BASOP porting switches ############################ */ + +#define TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR /* FhG: Temporary workaround for incorrect implementation of decoder flush with split rendering */ +#define NONBE_1122_KEEP_EVS_MODE_UNCHANGED /* FhG: Disables fix for issue 1122 in EVS mode to keep BE tests green. This switch should be removed once the 1122 fix is added to EVS via a CR. */ + +/* #################### End BASOP porting switches ############################ */ + + +#define IMPROV_PRECISION /* Places where precision can be improved without increasing complexity */ +#define IMPROV_COMPLEX_BE /* Places where complexity is reduced, BE (no big impact on complexity) */ #endif diff --git a/lib_com/options_warnings.h b/lib_com/options_warnings.h deleted file mode 100644 index eaa66e36eea643403623998cfecda8384e5f95c7..0000000000000000000000000000000000000000 --- a/lib_com/options_warnings.h +++ /dev/null @@ -1,3 +0,0 @@ -/*Temporary file*/ - -#define UNUSED_PARAM( ... ) (void) ( __VA_ARGS__ ) diff --git a/lib_com/parameter_bitmaping_fx.c b/lib_com/parameter_bitmaping_fx.c index 0846c618be15583797a4c64ccbae74c7a21fa224..92387209012c8cd2dfd7a6bacdb30ab3903715ad 100644 --- a/lib_com/parameter_bitmaping_fx.c +++ b/lib_com/parameter_bitmaping_fx.c @@ -21,7 +21,7 @@ static Word16 PutIntoBitstream_fx( value = *( *pStream )++; codedValue = EncodeValue( value, index ); - push_next_indice_fx( hBstr, codedValue, nBits ); + push_next_indice( hBstr, codedValue, nBits ); return value; } diff --git a/lib_com/phase_dispersion_fx.c b/lib_com/phase_dispersion_fx.c index 723d173bcd2bda0a3699a95b67f46997665660f5..5269a2ca36e4defac60158d95054df3ebe361e7b 100644 --- a/lib_com/phase_dispersion_fx.c +++ b/lib_com/phase_dispersion_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -8,6 +8,7 @@ #include "basop_util.h" #include "rom_com.h" + /*-----------------------------------------------------------------------* * phase_dispersion: * @@ -30,10 +31,6 @@ void phase_dispersion( Word32 x32[2 * L_SUBFR]; Word16 *code_real, *code_imag; const Word16 *h_real, *h_imag; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - move16(); state = 2; @@ -57,7 +54,7 @@ void phase_dispersion( move16(); prev_gain_pit[0] = gain_pit; - IF( GT_32( gain_code, L_add_o( *prev_gain_code, L_shl_o( *prev_gain_code, 1, &Overflow ), &Overflow ) ) ) + IF( GT_32( gain_code, L_add_sat( *prev_gain_code, L_shl_sat( *prev_gain_code, 1 ) ) ) ) { IF( LT_16( state, 2 ) ) { @@ -114,12 +111,12 @@ void phase_dispersion( scale2 = getScaleFactor32( x32, L_subfr ); FOR( i = 0; i < L_subfr / 2 - 1; i++ ) { - code[i] = round_fx_sat( L_shl_sat( x32[2 * i + 0], scale2 ) ); + code[i] = round_fx_sat( L_shl_sat( x32[2 * i], scale2 ) ); code[L_subfr - 1 - i] = round_fx_sat( L_shl_sat( x32[2 * i + 3], scale2 ) ); } - code[L_subfr / 2 - 1] = round_fx( L_shl( x32[L_subfr - 2], scale2 ) ); - code[L_subfr / 2] = round_fx( L_shl( x32[1], scale2 ) ); + code[L_subfr / 2 - 1] = round_fx_sat( L_shl_sat( x32[L_subfr - 2], scale2 ) ); + code[L_subfr / 2] = round_fx_sat( L_shl_sat( x32[1], scale2 ) ); j = sub( j, scale2 ); @@ -165,7 +162,7 @@ void phase_dispersion( scale2 = getScaleFactor32( x32, L_subfr ); FOR( i = 0; i < L_subfr; i++ ) { - code[i] = round_fx_o( L_shl_o( x32[i], scale2, &Overflow ), &Overflow ); + code[i] = round_fx_sat( L_shl_sat( x32[i], scale2 ) ); move16(); } j = sub( j, scale2 ); diff --git a/lib_com/ppp_fx.c b/lib_com/ppp_fx.c index cc6b59bdba01a0428f477f792a6a8809e5594d80..2f44e1081feb6c81b81d336b92bfe37b088fb00d 100644 --- a/lib_com/ppp_fx.c +++ b/lib_com/ppp_fx.c @@ -41,7 +41,7 @@ /* PURPOSE : Interpolate pitch lag for a subframe */ /*-------------------------------------------------------------------*/ /* INPUT ARGUMENTS : */ -/* _ (Word16) last_fx: previous frame delay, Q0 */ +/* _ (Word16) last_fx: previous frame delay, Q0 */ /* _ (Word16) current_fx: current frame delay, Q0 */ /* _ (Word16) SubNum : subframe number */ /*-------------------------------------------------------------------*/ @@ -97,10 +97,7 @@ void deemph_lpc_fx( Word16 k, temp; Word16 b_fx[M + 2]; /* Q12 */ Word16 a_fx[2] = { -22282, 32767 }; /* Q15 {-PREEMPH_FAC,1.0} */ -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + b_fx[0] = 4096; move16(); /* 1 in Q12 */ FOR( k = 0; k < M; k++ ) @@ -115,7 +112,7 @@ void deemph_lpc_fx( { /* LPC_de_curr[k] = a[0]*b[k] + a[1]*b[k+1]; */ temp = mult( a_fx[0], b_fx[k] ); /* Q12 */ - LPC_de_curr_fx[k] = add_o( temp, b_fx[k + 1], &Overflow ); + LPC_de_curr_fx[k] = add_sat( temp, b_fx[k + 1] ); move16(); /* Q12 */ } @@ -137,7 +134,7 @@ void deemph_lpc_fx( { /* LPC_de_old[k] = a[0]*b[k] + a[1]*b[k+1]; */ temp = mult( a_fx[0], b_fx[k] ); /* Q12 */ - LPC_de_old_fx[k] = add_o( temp, b_fx[k + 1], &Overflow ); + LPC_de_old_fx[k] = add_sat( temp, b_fx[k + 1] ); move16(); /* Q12 */ } } diff --git a/lib_com/pred_lt4_fx.c b/lib_com/pred_lt4_fx.c index 4f8dd871289b8fc78c85678a24cb737da7378c84..cc7e544e896b9b7487ac1e7c6dbcd3fdf1079d3e 100644 --- a/lib_com/pred_lt4_fx.c +++ b/lib_com/pred_lt4_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -8,7 +8,6 @@ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ - /*-------------------------------------------------------------------* * Function pred_lt4: * * ~~~~~~~~~ * @@ -20,6 +19,61 @@ * (adaptive codebook excitation) * *-------------------------------------------------------------------*/ +void pred_lt4_ivas_fx( + const Word16 excI[], /* in : excitation buffer Q_exc*/ + Word16 excO[], /* out: excitation buffer Q_exc*/ + const Word16 T0, /* input : integer pitch lag Q0*/ + Word16 frac, /* input : fraction of lag Q0*/ + const Word16 L_subfr, /* input : subframe size Q0*/ + const Word32 *win, /* i : interpolation window Q31*/ + const Word16 nb_coef, /* i : nb of filter coef Q0*/ + const Word16 up_sample /* i : up_sample Q0*/ +) +{ + Word16 i, j; + Word32 s; + const Word16 *x0, *x1, *x2; + const Word32 *c1, *c2; + + x0 = &excI[-T0]; + + frac = negate( frac ); + + IF( frac < 0 ) + { + frac = add( frac, up_sample ); /* Q0 */ + x0--; + } + + FOR( j = 0; j < L_subfr; j++ ) + { + x1 = x0++; /* Q_exc */ + x2 = x1 + 1; /* Q_exc */ + c1 = ( &win[frac] ); /* Q14 */ + c2 = ( &win[up_sample - frac] ); /* Q14 */ + + { + Word64 s64 = 0; + move64(); + FOR( i = 0; i < nb_coef; i++ ) + { + /*s += (*x1--) * (*c1) + (*x2++) * (*c2);*/ + s64 = W_mac_32_32( s64, L_deposit_l( *x1-- ), ( *c1 ) ); /* Q_exc + Q32 */ + s64 = W_mac_32_32( s64, L_deposit_l( *x2++ ), ( *c2 ) ); /* Q_exc + Q32 */ + + c1 += up_sample; + c2 += up_sample; + } + s = W_sat_l( W_shr( s64, 16 ) ); /* Q_exc + Q16 */ + } + + excO[j] = round_fx_sat( s ); /* Q_exc */ + move16(); + } + + return; +} + void pred_lt4( const Word16 excI[], /* in : excitation buffer Q_exc*/ Word16 excO[], /* out: excitation buffer Q_exc*/ @@ -34,12 +88,8 @@ void pred_lt4( Word16 i, j; Word32 s; const Word16 *x0, *x1, *x2, *c1, *c2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - x0 = &excI[-T0]; + x0 = &excI[-T0]; frac = negate( frac ); @@ -71,12 +121,13 @@ void pred_lt4( s = W_sat_l( s64 ); /* Q_exc + Q14 */ } #if ( INTERP_EXP != -1 ) - s = L_shl_o( s, INTERP_EXP + 1, &Overflow ); /* Q_exc + Q15 */ + s = L_shl_sat( s, INTERP_EXP + 1 ); /* Q_exc + Q15 */ #endif - excO[j] = round_fx_o( s, &Overflow ); /* Q_exc */ + excO[j] = round_fx_sat( s ); /* Q_exc */ move16(); } + return; } @@ -101,7 +152,7 @@ void pred_lt4( /* _ (Word16 []) exc : output excitation buffer Q0 */ /*-----------------------------------------------------------------------*/ /* INPUT OUTPUT ARGUMENTS */ -/* NONE */ +/* NONE */ /*-----------------------------------------------------------------------*/ /* RETURN ARGUMENTS : */ /* NONE */ @@ -120,10 +171,7 @@ void pred_lt4_tc_fx( Word16 excO[L_SUBFR + 1]; Word32 L_sum; Word16 excI[2 * L_SUBFR]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + Copy( exc + sub( i_subfr, L_SUBFR ), excI, L_SUBFR * 2 ); /* Q0 */ test(); @@ -155,15 +203,15 @@ void pred_lt4_tc_fx( k += UP_SAMP; L_sum = L_mac( L_sum, x0[i], win[k] ); /* Q15 */ } - L_sum = L_shl_o( L_sum, 1, &Overflow ); /* Q16 */ - excO[j] = round_fx_o( L_sum, &Overflow ); /* Q0 */ + L_sum = L_shl_sat( L_sum, 1 ); /* Q16 */ + excO[j] = round_fx_sat( L_sum ); /* Q0 */ move16(); x0++; } FOR( i = T0; i < L_SUBFR; i++ ) { - exc[i + i_subfr] = add_o( exc[i + i_subfr], mult_r( PIT_SHARP_fx, excO[i] ), &Overflow ); /* Q0 */ + exc[i + i_subfr] = add_sat( exc[i + i_subfr], mult_r( PIT_SHARP_fx, excO[i] ) ); /* Q0 */ move16(); } } diff --git a/lib_com/preemph_fx.c b/lib_com/preemph_fx.c index 0790f6c3f2c8fdda954347962a335a029e7057f1..8b0657bd52cd161a5844b0c90239cada5e31473c 100644 --- a/lib_com/preemph_fx.c +++ b/lib_com/preemph_fx.c @@ -1,14 +1,18 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "prot_fx.h" +#include "wmc_auto.h" + /*-------------------------------------------------------------* * preemph_copy_fx() * * Preemphasis: filtering through 1 - mu z^-1 *-------------------------------------------------------------*/ + void preemph_copy_fx( const Word16 x[], /* i : input signal Qx */ Word16 y[], /* o : output signal Qx */ @@ -18,49 +22,79 @@ void preemph_copy_fx( ) { Word16 i, temp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + temp = x[lg - 1]; /* Qx */ move16(); + FOR( i = lg - 1; i > 0; i-- ) { - y[i] = msu_ro( L_deposit_h( x[i] ), x[i - 1], mu, &Overflow ); /* Qx */ + y[i] = msu_r_sat( L_deposit_h( x[i] ), x[i - 1], mu ); /* Qx */ move16(); } - y[0] = msu_ro( L_deposit_h( x[0] ), *mem, mu, &Overflow ); /* Qx */ + y[0] = msu_r_sat( L_deposit_h( x[0] ), *mem, mu ); /* Qx */ move16(); *mem = temp; /* Qx */ move16(); -} -void preemph_copy_32fx( + return; +} +void preemph_copy_32fx2( const Word16 x[], /* i : input signal Qx */ - Word32 y[], /* o : output signal Qx */ + Word32 y[], /* o : output signal Qx-1*/ const Word16 mu, /* i : preemphasis coefficient Q15 */ const Word16 lg, /* i : vector size Q0 */ Word16 *mem /* i/o: memory (x[-1]) Qx */ ) { Word16 i, temp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + temp = x[lg - 1]; /* Qx */ move16(); + FOR( i = lg - 1; i > 0; i-- ) { - y[i] = L_msu_o( L_deposit_h( x[i] ), x[i - 1], mu, &Overflow ); /* Qx+16 */ + y[i] = L_msu0_sat( L_mult( x[i], 16384 ), x[i - 1], mu ); /* Qx+16 */ move16(); } - y[0] = L_msu_o( L_deposit_h( x[0] ), *mem, mu, &Overflow ); /* Qx+16 */ + y[0] = L_msu0_sat( L_mult( x[0], 16384 ), *mem, mu ); /* Qx+16 */ move16(); *mem = temp; /* Qx */ move16(); + + return; +} +/*-------------------------------------------------------------* + * preemph_ivas_fx() + * + * Preemphasis: filtering through 1 - mu z^-1 + *-------------------------------------------------------------*/ + +void preemph_ivas_fx( + Word32 *signal, /* i/o: signal Qx*/ + const Word16 mu, /* i : preemphasis factor Q15*/ + const Word16 L, /* i : vector size Q0*/ + Word32 *mem /* i/o: memory (x[-1]) Qx*/ +) +{ + Word16 i; + Word32 temp; + + temp = signal[L - 1]; /* Qx */ + move32(); + FOR( i = L - 1; i > 0; i-- ) + { + signal[i] = L_sub( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); /* Qx */ + move32(); + } + + signal[0] = L_sub( signal[0], Mpy_32_16_1( *mem, mu ) ); /* Qx */ + move32(); + *mem = temp; /* Qx */ + move32(); + + return; } /* @@ -68,8 +102,8 @@ void preemph_copy_32fx( * * Parameters: * shift I: scale output - * signal I/O: signal Qx/Qx+shift - * mu I: preemphasis factor Q15 + * signal I/O: signal Qx/Qx+shift + * mu I: preemphasis factor Q15 * L I: vector size * mem I/O: memory (x[-1]) * @@ -89,26 +123,23 @@ void E_UTIL_f_preemph2( { Word16 i, temp; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + temp = signal[lg - 1]; /* Qx */ move16(); FOR( i = lg - 1; i > 0; i-- ) { - L_tmp = L_mult( signal[i], 16384 ); /* Qx + 15 */ - L_tmp = L_msu0_o( L_tmp, signal[i - 1], mu, &Overflow ); /* Qx + 15 */ - L_tmp = L_shl_o( L_tmp, add( shift, 1 ), &Overflow ); /* Qx + shift + 16 */ - signal[i] = round_fx_o( L_tmp, &Overflow ); /* Qx + shift */ + L_tmp = L_mult( signal[i], 16384 ); /* Qx + 15 */ + L_tmp = L_msu0_sat( L_tmp, signal[i - 1], mu ); /* Qx + 15 */ + L_tmp = L_shl_sat( L_tmp, add( shift, 1 ) ); /* Qx + shift + 16 */ + signal[i] = round_fx_sat( L_tmp ); /* Qx + shift */ move16(); } - L_tmp = L_mult( signal[0], 16384 ); /* Qx + 15 */ - L_tmp = L_msu0_o( L_tmp, *mem, mu, &Overflow ); /* Qx + 15 */ - L_tmp = L_shl_o( L_tmp, add( shift, 1 ), &Overflow ); /* Qx + shift + 16 */ - signal[0] = round_fx_o( L_tmp, &Overflow ); /* Qx + shift */ + L_tmp = L_mult( signal[0], 16384 ); /* Qx + 15 */ + L_tmp = L_msu0_sat( L_tmp, *mem, mu ); /* Qx + 15 */ + L_tmp = L_shl_sat( L_tmp, add( shift, 1 ) ); /* Qx + shift + 16 */ + signal[0] = round_fx_sat( L_tmp ); /* Qx + shift */ move16(); *mem = temp; /* Qx */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 70b70859c0475b75c3bbb79d1912f18786dfa6dc..40136fe0ae5b11d60ae1925a40ccc2d3f363b1b8 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -32,6 +32,7 @@ #ifndef PROT_FX2_H #define PROT_FX2_H + /*----------------------------------------------------------------------------------* * Prototypes of RAM counting tool macros *----------------------------------------------------------------------------------*/ @@ -56,6 +57,8 @@ #include "ivas_error.h" #include "ivas_error_utils.h" #include "complex_basop.h" + + #define TCX_IMDCT_SCALE 15 #define TCX_IMDCT_HEADROOM 1 @@ -72,9 +75,6 @@ #define max( x, y ) ( ( x ) > ( y ) ? ( x ) : ( y ) ) #endif -#define log_base_2( x ) ( (double) log( (double) ( x ) ) * 1.4426950408889634074f ) -#define round_f( x ) ( ( ( x ) > 0 ) ? (int32_t) ( ( x ) + 0.5f ) : ( -(int32_t) ( ( -x ) + 0.5f ) ) ) - #ifndef ABSVAL #define ABSVAL( a ) ( ( a ) >= 0 ? ( a ) : ( -( a ) ) ) #endif @@ -102,78 +102,15 @@ } #endif -/*================================================================================*/ -/* conversion functions: */ -/*================================================================================*/ - -// Float to Word32 -Word32 float_to_fix( float number, Word32 Q ); -// Word32 to Float -float fix_to_float( Word32 number, Word32 Q ); -// Float to Word16 -Word16 float_to_fix16( float number, Word16 Q ); -// Word16 to Float -float fix16_to_float( Word16 number, Word16 Q ); - -Word16 float_to_fix16_thrld( float number, Word16 Q ); - -void floatToFixed_arrL( float *f, Word32 *i, Word16 Q, Word16 l ); -void floatToFixed_arr( float *f, Word16 *i, Word16 Q, Word16 l ); -void fixedToFloat_arrL( Word32 *i, float *f, Word16 Q, Word16 l ); -void fixedToFloat_arr( Word16 *i, float *f, Word16 Q, Word16 l ); -void floatToFixed_arrL32( float *f, Word32 *i, Word16 Q, Word16 l ); -void fixedToFloat_arrL32( Word32 *i, float *f, Word16 Q, Word16 l ); -Word16 Q_factor( float x ); -Word16 Q_factor_L( float x ); -Word16 Q_factor_arr( float *x, Word16 l ); -Word16 Q_factor_arrL( float *x, Word16 l ); -Word16 Q_factor_L_32( Word32 x ); -// Handles the cases where Q is negative -Word32 floatToFixed( float f, Word16 Q ); -float fixedToFloat( Word32 i, Word16 Q ); -Word32 floatToFixed_32( float f, Word16 Q ); -float fixedToFloat_32( Word32 i, Word16 Q ); -float fixedToFloat_16( Word16 i, Word16 Q ); - -void floatToFixed_arr16( float *f, Word16 *i, Word16 Q, Word16 l ); -void floatToFixed_arr32( float *f, Word32 *i, Word16 Q, Word16 l ); -// Float to 32-bit Mantissa and Exponent using frexp -void f2me( float n, Word32 *mantissa, Word16 *expo ); -// 32-bit Mantissa and Exponent to Float using ldexp -float me2f( Word32 m, Word16 expo ); -// Float to 32-bit Mantissa Array and Exponent -void f2me_buf( const float *x, Word32 *m, Word16 *e, const Word32 n ); -// 32-bit Mantissa Array and Exponent to Float -void me2f_buf( const Word32 *m, const Word16 e, float *out, const Word32 n ); -// Float to 16-bit Mantissa and Exponent using frexp -void f2me_16( float n, Word16 *mantissa, Word16 *expo ); -// 16-bit Mantissa and Exponent to Float using ldexp -float me2f_16( Word16 m, Word16 expo ); -// Float to 16-bit Mantissa Array and Exponent -void f2me_buf_16( const float *x, Word16 *m, Word16 *e, const Word32 n ); -// 16-bit Mantissa Array and Exponent to Float -void me2f_buf_16( const Word16 *m, const Word16 e, float *out, const Word32 n ); - -void f2fix_16( float *var_flt, Word16 *var_fix, Word32 expo ); -void fix2f_16( Word16 *var_fix, float *var_flt, Word32 expo ); -void f2fix( float *var_flt, Word32 *var_fix, Word32 expo ); -void fix2f( Word32 *var_fix, float *var_flt, Word32 expo ); - -// Get max Q factor for a float value before sat in 32-bit -Word16 L_get_q( float f ); -Word16 L_get_q1( float f ); -// Get max Q factor for a float buffer before sat in 32-bit -Word16 L_get_q_buf( float *ptr_flt, Word16 length ); -Word16 L_get_q_buf1( float *ptr_flt, Word16 length ); - -/*================================================================================*/ -/* conversion functions: */ -/*================================================================================*/ + +/*----------------------------------------------------------------------------------* + * Prototypes of tools + *----------------------------------------------------------------------------------*/ + Word32 sum_l_fx( const Word32 *vec, /* i : input vector */ const Word16 lvec /* i : length of input vector */ ); -Word16 norm_ul( UWord32 UL_var1 ); Word32 Mult_32_16( Word32 a, @@ -214,12 +151,11 @@ void set32_fx( const Word16 N /* i : Lenght of the vector */ ); -// tools.c -Word16 Random( /* o : output random value */ - Word16 *seed /* i/o: random seed */ +/* o : output random value */ +Word16 Random( + Word16 *seed /* i/o: random seed */ ); -// tools.c void Copy( const Word16 x[], /* i : i vector */ Word16 y[], /* o : output vector */ @@ -244,7 +180,6 @@ void Copy_pword( const Word16 L /* i : vector length */ ); -// tools.c void Scale_sig( Word16 x[], /* i/o: signal to scale Qx */ const Word16 lg, /* i : size of x[] Q0 */ @@ -257,15 +192,16 @@ void scale_sig( const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ ); -// tools.c -Word32 sum2_fx( /* o : sum of all squared vector elements Q(2x+1)*/ - const Word16 *vec, /* i : i vector Qx*/ - const Word16 lvec /* i : length of i vector */ +/* o : sum of all squared vector elements Q(2x+1)*/ +Word32 sum2_fx( + const Word16 *vec, /* i : i vector Qx*/ + const Word16 lvec /* i : length of i vector */ ); -Word64 sum2_fx_no_sat( /* o : sum of all squared vector elements Q(2x)*/ - const Word16 *vec, /* i : i vector Qx*/ - const Word16 lvec /* i : length of i vector */ +/* o : sum of all squared vector elements Q(2x)*/ +Word64 sum2_fx_no_sat( + const Word16 *vec, /* i : i vector Qx*/ + const Word16 lvec /* i : length of i vector */ ); Word16 sign_fx( @@ -275,11 +211,11 @@ Word16 sign_fx( Word16 sign16_fx( const Word16 x /* i : input value of x */ ); + /*========================================================================================================/ mslvq_com_fx.c /========================================================================================================*/ -// mslvq_com_fx Word16 deindex_lvq_fx( Word16 *index, /* i : index to be decoded, as an array of 3 short */ Word16 *x_lvq, /* o : decoded codevector Q(x2.56)*/ @@ -296,7 +232,9 @@ void deindex_lvq_SHB_fx( const Word16 nbits, const Word16 mode ); -Word32 encode_comb_fx( Word16 *cv, Word16 idx_lead ); +Word32 encode_comb_fx( + Word16 *cv, + Word16 idx_lead ); Word32 mslvq_ivas_16( Word16 *pTmp_fx, /* i : M-dimensional input vector */ @@ -353,8 +291,8 @@ swb_bwe_com_fx.c void calc_normal_length_fx( const Word16 core, /* i : core */ - const Word16 *sp, /* i : i signal */ - const Word16 mode, /* i : i mode */ + const Word16 *sp, /* i : i signal */ + const Word16 mode, /* i : i mode */ const Word16 extl, /* i : extension layer */ Word16 *L_swb_norm, /* o : normalize length */ Word16 *prev_L_swb_norm, /*i/o : last normalize length */ @@ -362,17 +300,16 @@ void calc_normal_length_fx( void calc_normal_length_fx_32( const Word16 core, /* i : core : Q0 */ - const Word32 *sp, /* i : i signal : Q12 */ - const Word16 mode, /* i : i mode : Q0 */ + const Word32 *sp, /* i : i signal : Q12 */ + const Word16 mode, /* i : i mode : Q0 */ const Word16 extl, /* i : extension layer : Q0 */ Word16 *L_swb_norm, /* o : normalize length : Q0 */ Word16 *prev_L_swb_norm /*i/o : last normalize length : Q0 */ ); - void hq_generic_decoding_fx( const Word16 HQ_mode, /* i : HQ mode */ - Word32 *coeff_out1_fx, /* i/o: BWE i & temporary buffer */ + Word32 *coeff_out1_fx, /* i/o: BWE i & temporary buffer */ const Word16 *hq_generic_fenv_fx, /* i : SWB frequency envelopes */ Word32 *coeff_out_fx, /* o : SWB signal in MDCT domain */ const Word16 hq_generic_offset, /* i : frequency offset for representing hq generic*/ @@ -389,22 +326,23 @@ Word16 WB_BWE_gain_pred_fx( Word16 *voice_factors, /* i : voicing factors Q15 */ const Word16 pitch_buf[], /* i : pitch buffer Q6 */ Word32 last_core_brate, /* i : previous frame core bitrate */ - Word16 last_wb_bwe_ener, /* i : previous frame wb bwe signal energy */ + Word16 last_wb_bwe_ener, /* i : previous frame wb bwe signal energy */ Word16 Q_syn, Word16 last_extl_fx, Word16 tilt_wb_fx ); -Word32 calc_tilt_bwe_fx( /* o : Tilt in Q24 */ - const Word16 *sp0, /* i : i signal */ - const Word16 exp, /* i : Exp of inp signal */ - const Word16 N /* i : signal length */ +/* o : Tilt in Q24 */ +Word32 calc_tilt_bwe_fx( + const Word16 *sp0, /* i : i signal */ + const Word16 exp, /* i : Exp of inp signal */ + const Word16 N /* i : signal length */ ); void calc_norm_envelop_fx( const Word16 SWB_signal[], /* i : SWB spectrum Q_syn*/ Word32 *envelope, /* o : normalized envelope Q_syn*/ const Word16 L_swb_norm, /* i : length of envelope Q0 */ - const Word16 SWB_flength, /* i : Length of i /output */ + const Word16 SWB_flength, /* i : Length of i /output */ const Word16 st_offset /* i : offset */ ); @@ -412,7 +350,7 @@ void WB_BWE_decoding_fx( const Word16 *core_dec_freq, /* i : Frequency domain core decoded signal */ Word16 *WB_fenv, /* i : WB frequency envelopes */ Word32 *WB_signal32, /* o : WB signal in MDCT domain */ - const Word16 WB_flength, /* i : Length of i /output */ + const Word16 WB_flength, /* i : Length of i /output */ const Word16 mode, /* i : classification for WB signal */ const Word16 last_extl, /* i : extl. layer for last frame */ Word32 *prev_Energy, /* i/o: energy for last frame */ @@ -425,14 +363,14 @@ void WB_BWE_decoding_fx( Word16 *prev_flag, /* i/o: attenu flag of last frame */ Word16 prev_coder_type, /* i : coding type of last frame */ Word16 Q_syn, - Word16 *Q_syn_hb /*o : Q value of WB_signal_32 */ + Word16 *Q_syn_hb /* o : Q value of WB_signal_32 */ ); void SWB_BWE_decoding_fx( const Word16 *core_dec_freq, /* i : Frequency domain core decoded signal */ Word16 *SWB_fenv, /* i/o: SWB frequency envelopes */ Word32 *SWB_signal, /* o : SWB signal in MDCT domain */ - const Word16 SWB_flength, /* i : Length of i /output */ + const Word16 SWB_flength, /* i : Length of i /output */ const Word16 mode, /* i : classification for SWB signal */ Word16 *frica_flag, /* o : fricative signal flag */ Word16 *prev_Energy, /* i/o: energy for last frame */ @@ -465,13 +403,13 @@ void calc_norm_envelop_fx_32( const Word32 SWB_signal_fx[], /* i : SWB spectrum : Q12 */ Word32 *envelope_fx, /* o : normalized envelope : Q16 */ const Word16 L_swb_norm, /* i : length of envelope : Q0 */ - const Word16 SWB_flength, /* i : Length of i /output : Q0 */ + const Word16 SWB_flength, /* i : Length of i /output : Q0 */ const Word16 st_offset /* i : offset : Q0 */ ); void hq_generic_decoding_fx( const Word16 HQ_mode, /* i : HQ mode */ - Word32 *coeff_out1_fx, /* i/o: BWE i & temporary buffer */ + Word32 *coeff_out1_fx, /* i/o: BWE i & temporary buffer */ const Word16 *hq_generic_fenv_fx, /* i : SWB frequency envelopes */ Word32 *coeff_out_fx, /* o : SWB signal in MDCT domain */ const Word16 hq_generic_offset, /* i : frequency offset for representing hq generic*/ @@ -481,7 +419,7 @@ void hq_generic_decoding_fx( void hq_generic_decoding_ivas_fx( const Word16 HQ_mode, /* i : HQ mode */ - Word32 *coeff_out1_fx, /* i/o: BWE i & temporary buffer */ + Word32 *coeff_out1_fx, /* i/o: BWE i & temporary buffer */ const Word16 *hq_generic_fenv_fx, /* i : SWB frequency envelopes */ Word32 *coeff_out_fx, /* o : SWB signal in MDCT domain */ const Word16 hq_generic_offset, /* i : frequency offset for representing hq generic*/ @@ -504,7 +442,7 @@ lognorm_fx.c void logqnorm_fx( const Word32 *x, /* i : coefficient vector Qx */ - const Word16 qx, /* i : Q value of i */ + const Word16 qx, /* i : Q value of i */ Word16 *k, /* o : index Q0 */ const Word16 L, /* i : codebook length Q0 */ const Word16 N, /* i : sub-vector size Q0 */ @@ -523,7 +461,7 @@ void logqnorm_2_fx( void calc_norm_fx( const Word32 *L_x, /* i : Input vector. Qx */ - const Word16 qx, /* i : Q value of i */ + const Word16 qx, /* i : Q value of i */ Word16 *norm, /* o : Quantization indices for norms Q0 */ Word16 *normlg, /* o : Quantized norms in log2 Q0 */ const Word16 start_band, /* i : Indice of band to start coding Q0 */ @@ -531,15 +469,17 @@ void calc_norm_fx( const Word16 *band_len, /* i : Length of bands Q0 */ const Word16 *band_start /* i : Start of bands Q0 */ ); + void calc_norm_ivas_fx( - const Word32 *x_fx, /* i : Input vector.(Qin) */ - Word16 *norm, /* o : Quantization indices for norms Q0 */ - Word16 *normlg, /* o : Quantized norms in log2 Q0 */ + const Word32 *x_fx, /* i : Input vector.(Qin) */ + Word16 *norm, /* o : Quantization indices for norms Q0 */ + Word16 *normlg, /* o : Quantized norms in log2 Q0 */ const Word16 start_band, /* i : Indice of band to start coding */ const Word16 num_bands, /* i : Number of bands */ const Word16 *band_len, /* i : Length of bands */ const Word16 *band_start /* i : Start of bands */ ); + void logqnorm_ivas_fx( const Word32 *x_fx, /* i : coefficient vector Qq*/ const Word16 q, /* i : q of coefficient vector */ @@ -548,27 +488,29 @@ void logqnorm_ivas_fx( const Word16 N, /* i : sub-vector size */ const Word32 *thre_fxn /* i : quantization thresholds Q14*/ ); + /*========================================================================================================/ hq_tools_fx.c /========================================================================================================*/ void hq_swb_harmonic_calc_norm_envelop_fx( - const Word32 *L_SWB_signal, /* i : i signal Q=12*/ + const Word32 *L_SWB_signal, /* i : i signal Q=12*/ Word32 *L_envelope, /* o : output envelope Q=12*/ const Word16 L_swb_norm, /* i : length of normaliztion */ - const Word16 SWB_flength /* i : length of i signal */ + const Word16 SWB_flength /* i : length of i signal */ ); -Word16 build_nf_codebook_fx( /* o : Number of coefficients in nf codebook */ - const Word16 flag_32K_env_ho, /* i : Envelope attenuation hangover flag */ - const Word16 *coeff, /* i : Coded spectral coefficients */ - const Word16 *sfm_start, /* i : Subband start indices */ - const Word16 *sfmsize, /* i : Subband widths */ - const Word16 *sfm_end, /* i : Subband end indices */ - const Word16 last_sfm, /* i : Last coded band */ - const Word16 *R, /* i : Per-band bit allocation */ - Word16 *CodeBook, /* o : Noise-fill codebook */ - Word16 *CodeBook_mod /* o : Densified noise-fill codebook */ +/* o : Number of coefficients in nf codebook */ +Word16 build_nf_codebook_fx( + const Word16 flag_32K_env_ho, /* i : Envelope attenuation hangover flag */ + const Word16 *coeff, /* i : Coded spectral coefficients */ + const Word16 *sfm_start, /* i : Subband start indices */ + const Word16 *sfmsize, /* i : Subband widths */ + const Word16 *sfm_end, /* i : Subband end indices */ + const Word16 last_sfm, /* i : Last coded band */ + const Word16 *R, /* i : Per-band bit allocation */ + Word16 *CodeBook, /* o : Noise-fill codebook */ + Word16 *CodeBook_mod /* o : Densified noise-fill codebook */ ); void limit_band_noise_level_calc_fx( @@ -578,14 +520,15 @@ void limit_band_noise_level_calc_fx( Word16 *noise_level /* o : noise level Q15 */ ); -Word16 find_last_band_fx( /* o : index of last band */ - const Word16 *bitalloc, /* i : bit allocation */ - const Word16 nb_sfm /* i : number of possibly coded bands */ +/* o : index of last band */ +Word16 find_last_band_fx( + const Word16 *bitalloc, /* i : bit allocation */ + const Word16 nb_sfm /* i : number of possibly coded bands */ ); void apply_noisefill_HQ_fx( const Word16 *R, /* i : bit allocation */ - const Word16 length, /* i : i frame length */ + const Word16 length, /* i : i frame length */ const Word16 flag_32K_env_ho, /* i : envelope stability hangover flag*/ const Word32 L_core_brate, /* i : core bit rate */ const Word16 last_sfm, /* i : last coded subband */ @@ -637,16 +580,16 @@ void harm_bwe_fx( Word16 *norm, /* i/o: quantization indices for norms */ Word16 *noise_level, /* i/o: noise levels for harmonic modes */ Word16 *prev_noise_level, /* i/o: noise factor in previous frame */ - Word16 *bwe_seed, /* i/o: random seed for generating BWE i */ + Word16 *bwe_seed, /* i/o: random seed for generating BWE i */ Word32 *coeff_out, /* o : coded/noisefilled spectrum */ - const Word16 element_mode /* i : IVAS element mode */ + const Word16 element_mode /* i : IVAS element mode */ ); void hq_fold_bwe_fx( const Word16 last_sfm, /* i : last coded subband Q0 */ const Word16 *sfm_end, /* i : Subband end coefficient Q0 */ const Word16 num_sfm, /* i : Number of subbands Q0 */ - Word16 *coeff /* i/o: coded/noisefilled normalized spectrum Q12 */ + Word16 *coeff /* i/o: coded/noisefilled normalized spectrum Q12*/ ); void apply_nf_gain_fx( @@ -655,7 +598,7 @@ void apply_nf_gain_fx( const Word16 *R, /* i : bit allocation Q0 */ const Word16 *sfm_start, /* i : Subband start coefficient Q0 */ const Word16 *sfm_end, /* i : Subband end coefficient Q0 */ - Word16 *coeff /* i/o: coded/noisefilled normalized spectrum Q12 */ + Word16 *coeff /* i/o: coded/noisefilled normalized spectrum Q12*/ ); void hvq_bwe_fx( @@ -674,7 +617,7 @@ void hvq_bwe_fx( Word16 *norm, /* i/o: quantization indices for norms Q0 */ Word16 *noise_level, /* i/o: noise levels for harmonic modes Q15 */ Word16 *prev_noise_level, /* i/o: noise factor in previous frame Q15 */ - Word16 *bwe_seed, /* i/o: random seed for generating BWE i Q0 */ + Word16 *bwe_seed, /* i/o: random seed for generating BWE i Q0 */ Word32 *L_coeff_out, /* o : coded/noisefilled spectrum Qout*/ const Word16 qin, const Word16 qout ); @@ -696,7 +639,7 @@ void noise_mix_fx( const Word16 istart, /* i : start coefficient Q0 */ const Word16 iend, /* i : end coefficient Q0 */ const Word16 noise_level, /* i : noise_level Q0 */ - Word32 *L_coeff_out, /* o : noisemixed spectrum Qout */ + Word32 *L_coeff_out, /* o : noisemixed spectrum Qout*/ const Word16 qin, const Word16 qout ); @@ -705,8 +648,8 @@ void hq_generic_fine_fx( const Word16 last_sfm, /* i : Last coded band */ const Word16 *sfm_start, /* i : Subband start coefficient */ const Word16 *sfm_end, /* i : Subband end coefficient */ - Word16 *bwe_seed, /* i/o: random seed for generating BWE i */ - Word16 *coeff_out1 /* o : HQ Generic i */ + Word16 *bwe_seed, /* i/o: random seed for generating BWE i */ + Word16 *coeff_out1 /* o : HQ Generic i */ ); void map_hq_generic_fenv_norm_fx( @@ -737,6 +680,7 @@ Word16 calc_nor_delta_hf_fx( const Word16 *sfm_start, /* i : Start index of bands */ const Word16 core_sfm /* i : index of the end band for core */ ); + Word16 calc_nor_delta_hf_ivas_fx( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const Word32 *t_audio, /* i : transform-domain coefficients Qx*/ @@ -748,9 +692,10 @@ Word16 calc_nor_delta_hf_ivas_fx( const Word16 *sfm_start, /* i : Start index of bands */ const Word16 core_sfm /* i : index of the end band for core */ ); + void hq_bwe_fx( const Word16 HQ_mode, /* i : HQ mode */ - Word32 *coeff_out1, /* i/o: BWE i & temporary buffer */ + Word32 *coeff_out1, /* i/o: BWE i & temporary buffer */ const Word16 *hq_generic_fenv, /* i : SWB frequency envelopes */ Word32 *coeff_out, /* o : SWB signal in MDCT domain */ const Word16 hq_generic_offset, /* i : frequency offset for representing hq generic bwe*/ @@ -763,7 +708,7 @@ void hq_bwe_fx( void hq_bwe_ivas_fx( const Word16 HQ_mode, /* i : HQ mode */ - Word32 *coeff_out1, /* i/o: BWE i & temporary buffer */ + Word32 *coeff_out1, /* i/o: BWE i & temporary buffer */ const Word16 *hq_generic_fenv, /* i : SWB frequency envelopes */ Word32 *coeff_out, /* o : SWB signal in MDCT domain */ const Word16 hq_generic_offset, /* i : frequency offset for representing hq generic bwe*/ @@ -802,6 +747,7 @@ void enforce_zero_for_min_envelope_fx( const Word16 *sfm_start, /* i : Sub band start indices Q0 */ const Word16 *sfm_end /* i : Sub band end indices Q0 */ ); + void apply_envelope_enc_ivas_fx( const Word16 *coeff, /* i/o: Coded/noisefilled normalized spectrum Q12 */ const Word16 *norm, /* i : Envelope Q0 */ @@ -810,6 +756,7 @@ void apply_envelope_enc_ivas_fx( const Word16 *sfm_end, /* i : Sub band end indices Q0 */ Word32 *coeff_out /* o : coded/noisefilled spectrum Q12 */ ); + void apply_envelope_fx( const Word16 *coeff, /* i : Coded/noisefilled normalized spectrum Q12 */ const Word16 *norm, /* i : Envelope */ @@ -830,7 +777,10 @@ void apply_envelope_fx( lsf_tools_fx.c /========================================================================================================*/ -void compute_poly_product_fx( Word16 *coef, Word32 *p, Word16 order ); +void compute_poly_product_fx( + Word16 *coef, + Word32 *p, + Word16 order ); Word16 xsp_to_xsf( Word16 lsp ); @@ -839,8 +789,14 @@ Word16 xsf_to_xsp( Word16 lsf /* Q2.56 */ ); -void lsp_convolve_fx( Word32 x, Word32 *p1, Word32 *p2, Word16 len ); -Word32 poscos_fx( Word16 w ); +void lsp_convolve_fx( + Word32 x, + Word32 *p1, + Word32 *p2, + Word16 len ); + +Word32 poscos_fx( + Word16 w ); Word32 sub_lsp2lsf_fx( const Word16 lsp_i /* i : lsp[m] (range: -1<=val<1) Q15*/ @@ -848,29 +804,46 @@ Word32 sub_lsp2lsf_fx( void E_LPC_lsp_lsf_conversion( const Word16 lsp[], /* i : lsp[m] (range: -1<=val<1) */ - Word16 lsf[], /* output : lsf[m] normalized (range: 0<=val<=6400) */ - const Word16 m /* i : LPC order */ + Word16 lsf[], /* o : lsf[m] normalized (range: 0<=val<=6400) */ + const Word16 m /* i : LPC order */ ); + void E_LPC_lsf_lsp_conversion( const Word16 lsf[], /* i : lsf[m] normalized (range: 0<=val<=6400) */ - Word16 lsp[], /* o : lsp[m] (range: -1<=val<1) */ + Word16 lsp[], /* o : lsp[m] (range: -1<=val<1) */ const Word16 m /* i : LPC order */ ); -void E_LPC_f_lsp_a_conversion( const Word16 *lsp, Word16 *a, const Word16 m ); +void E_LPC_f_lsp_a_conversion( + const Word16 *lsp, + Word16 *a, + const Word16 m ); + void E_LPC_a_isp_conversion( const Word16 *a, /* i : LP filter coefficients */ - Word16 *isp, /* o : Line spectral pairs (in the cosine domain) */ + Word16 *isp, /* o : Line spectral pairs (in the cosine domain) */ const Word16 *old_isp, /* i : LSP vector from past frame */ const Word16 m /* i : LPC order */ ); -void E_LPC_isp_isf_conversion( const Word16 isp[], Word16 isf[], const Word16 m ); -void E_LPC_isf_isp_conversion( const Word16 isf[], Word16 isp[], const Word16 m ); -void E_LPC_f_isp_a_conversion( const Word16 *isp, Word16 *a, const Word16 m ); + +void E_LPC_isp_isf_conversion( + const Word16 isp[], + Word16 isf[], + const Word16 m ); + +void E_LPC_isf_isp_conversion( + const Word16 isf[], + Word16 isp[], + const Word16 m ); + +void E_LPC_f_isp_a_conversion( + const Word16 *isp, + Word16 *a, + const Word16 m ); void E_LPC_a_lsp_conversion( const Word16 *a, /* i : LP filter coefficients */ - Word16 *lsp, /* o : Line spectral pairs (in the cosine domain) */ + Word16 *lsp, /* o : Line spectral pairs (in the cosine domain) */ const Word16 *old_lsp, /* i : LSP vector from past frame */ const Word16 m /* i : LPC order */ ); @@ -881,13 +854,11 @@ Word16 lpc2lsp_fx( Word16 *old_freq, Word16 order ); -#ifdef FIX_ISSUE_1165 Word16 lpc2lsp_ivas_fx( Word32 *a, Word16 *freq, Word16 *old_freq, Word16 order ); -#endif void lsp2lpc_fx( Word16 *a, @@ -896,20 +867,27 @@ void lsp2lpc_fx( Word16 order ); void E_LPC_a_lsp_conversion( - const Word16 *a, /* i : LP filter coefficients */ + const Word16 *a, /* i : LP filter coefficients */ Word16 *lsp, /* o : Line spectral pairs (in the cosine domain) */ - const Word16 *old_lsp, /* i : LSP vector from past frame */ - const Word16 m /* i : LPC order */ + const Word16 *old_lsp, /* i : LSP vector from past frame */ + const Word16 m /* i : LPC order */ ); -void v_sort( Word16 *r, const Word16 lo, const Word16 up ); +void v_sort( + Word16 *r, + const Word16 lo, + const Word16 up ); -void compute_poly_product_fx( Word16 *coef, Word32 *p, Word16 order ); +void compute_poly_product_fx( + Word16 *coef, + Word32 *p, + Word16 order ); void dec_prm_hm_fx( Decoder_State *st, Word16 *prm_hm, /* Q0 */ const Word16 L_frame ); + void msvq_dec( const Word16 *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) (0Q15) */ const Word16 dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ @@ -918,11 +896,7 @@ void msvq_dec( const Word16 N, /* i : Vector dimension */ const Word16 maxN, /* i : Codebook dimension */ const Word16 Idx[], /* i : Indices */ -#ifdef IVAS_MSVQ - const int16_t applyIDCT_flag, /* i : applyIDCT flag */ - const float *invTrfMatrix, /* i : matrix for IDCT synthesis */ -#endif - Word16 *uq /* o : quantized vector (3Q12) */ + Word16 *uq /* o : quantized vector (3Q12) */ ); Word16 tcxlpc_get_cdk( @@ -935,23 +909,22 @@ void lsf_syn_mem_restore_fx( Word32 gc_threshold_fx, /* i: Q16 */ Word16 *clip_var_bck_fx, /* i: Q(2.56), Q14, Q7, Q0, Q14, Q14 */ Word16 next_force_sf_bck_fx, /* i: */ - - Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ - Word16 *lsf_new, /* o: quantized LSF vector Q15 */ - Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ - Word16 clip_var, /* i: pitch clipping state var Q(2.56) */ - Word16 *mem_AR, /* i: quantizer memory for AR model Q15 */ - Word16 *mem_MA, /* i: quantizer memory for MA model Q15 */ - Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ - Word16 *lsf_new_bck, /* i: quantized LSF vector - backup Q15 */ - Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ - Word16 mCb1, /* i: counter for stationary frame after a transition frame */ - Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ - Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ - Word16 *mem_syn_bck, /* i: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 mem_w0_bck, /* i: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 streaklimit, /* i:LSF quantizer Q15 */ - Word16 pstreaklen /* i:LSF quantizer */ + Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ + Word16 *lsf_new, /* o: quantized LSF vector Q15 */ + Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ + Word16 clip_var, /* i: pitch clipping state var Q(2.56) */ + Word16 *mem_AR, /* i: quantizer memory for AR model Q15 */ + Word16 *mem_MA, /* i: quantizer memory for MA model Q15 */ + Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ + Word16 *lsf_new_bck, /* i: quantized LSF vector - backup Q15 */ + Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ + Word16 mCb1, /* i: counter for stationary frame after a transition frame */ + Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ + Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ + Word16 *mem_syn_bck, /* i: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 mem_w0_bck, /* i: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 streaklimit, /* i:LSF quantizer Q15 */ + Word16 pstreaklen /* i:LSF quantizer */ ); void lsf_syn_mem_restore_ivas_fx( @@ -1026,9 +999,9 @@ void lsf2lsp_fx( void lsp2lsf_fx( const Word16 lsp[], /* i : lsp[m] (range: -1<=val<1) Q15*/ - Word16 lsf[], /* o : lsf[m] normalized (range: 0.0<=val<=0.5) Q(x2.56)*/ + Word16 lsf[], /* o : lsf[m] normalized (range: 0.0<=val<=0.5) Q(x2.56)*/ const Word16 m, /* i : LPC order Q0*/ - const Word32 int_fs /* i : internal sampling frequency */ + const Word32 int_fs /* i : internal sampling frequency */ ); void isf2lsf_fx( @@ -1058,25 +1031,28 @@ void lsp2isp_fx( const Word16 m /* i : order of LP analysis */ ); -Word16 lsf_stab_fx( /* o : LP filter stability Q15*/ - const Word16 *lsf, /* i : LSF vector Q(x2.56)*/ - const Word16 *lsfold, /* i : old LSF vector Q(x2.56)*/ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame /* i : frame length */ +/* o : LP filter stability Q15*/ +Word16 lsf_stab_fx( + const Word16 *lsf, /* i : LSF vector Q(x2.56)*/ + const Word16 *lsfold, /* i : old LSF vector Q(x2.56)*/ + const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const Word16 L_frame /* i : frame length */ ); -Word16 lsf_stab_ivas_fx( /* o : LP filter stability Q15*/ - const Word16 *lsf, /* i : LSF vector Q(x2.56)*/ - const Word16 *lsfold, /* i : old LSF vector Q(x2.56)*/ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame /* i : frame length */ +/* o : LP filter stability Q15*/ +Word16 lsf_stab_ivas_fx( + const Word16 *lsf, /* i : LSF vector Q(x2.56)*/ + const Word16 *lsfold, /* i : old LSF vector Q(x2.56)*/ + const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const Word16 L_frame /* i : frame length */ ); -Word16 lsf_stab_ivas_fx( /* o : LP filter stability Q15*/ - const Word16 *lsf, /* i : LSF vector Q(x2.56)*/ - const Word16 *lsfold, /* i : old LSF vector Q(x2.56)*/ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame /* i : frame length */ +/* o : LP filter stability Q15*/ +Word16 lsf_stab_ivas_fx( + const Word16 *lsf, /* i : LSF vector Q(x2.56)*/ + const Word16 *lsfold, /* i : old LSF vector Q(x2.56)*/ + const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const Word16 L_frame /* i : frame length */ ); void reorder_isf_fx( @@ -1114,8 +1090,8 @@ Word16 vq_dec_lvq_fx( Word16 indices[], /* i : Indices */ Word16 stages, /* i : Number of stages */ Word16 N, /* i : Vector dimension */ - Word16 mode, /* (i): mode_lvq, or mode_lvq_p */ - Word16 no_bits, /* (i): no. bits for lattice */ + Word16 mode, /* i : mode_lvq, or mode_lvq_p */ + Word16 no_bits, /* i : no. bits for lattice */ Word32 *p_offset_scale1, Word32 *p_offset_scale2, Word32 *p_offset_scale1_p, @@ -1129,10 +1105,14 @@ Word16 vq_dec_lvq_ivas_fx( Word16 indices[], /* i : Indices */ Word16 stages, /* i : Number of stages */ Word16 N, /* i : Vector dimension */ - Word16 mode, /* (i): mode_lvq, or mode_lvq_p */ - Word16 no_bits /* (i): no. bits for lattice */ + Word16 mode, /* i : mode_lvq, or mode_lvq_p */ + Word16 no_bits /* i : no. bits for lattice */ ); -void a2rc_fx( const Word16 *a, Word16 *refl, Word16 lpcorder ); + +void a2rc_fx( + const Word16 *a, + Word16 *refl, + Word16 lpcorder ); Word16 vq_dec_lvq_ivas_fx( Word16 sf_flag, /* i : safety net flag */ @@ -1140,11 +1120,14 @@ Word16 vq_dec_lvq_ivas_fx( Word16 indices[], /* i : Indices */ Word16 stages, /* i : Number of stages */ Word16 N, /* i : Vector dimension */ - Word16 mode, /* (i): mode_lvq, or mode_lvq_p */ - Word16 no_bits /* (i): no. bits for lattice */ + Word16 mode, /* i : mode_lvq, or mode_lvq_p */ + Word16 no_bits /* i : no. bits for lattice */ ); -void a2rc_fx( const Word16 *a, Word16 *refl, Word16 lpcorder ); +void a2rc_fx( + const Word16 *a, + Word16 *refl, + Word16 lpcorder ); void lsp_weights_fx( Word16 lsp_nq_fx[], @@ -1211,14 +1194,56 @@ void autocorr_fx_32( const Word16 sym_flag /* i : symmetric window flag */ ); -Word16 E_LPC_lev_dur( const Word16 Rh[], const Word16 Rl[], Word16 A[], Word32 epsP[], const Word16 order, Word16 *parcorr ); -Word16 E_LPC_lev_dur_stab( const Word16 Rh[], const Word16 Rl[], Word16 A[], Word32 epsP[], const Word16 order, Word16 *parcorr, Word16 k_max ); - -Word16 E_LPC_lev_dur_ivas_fx( const Word16 Rh[], const Word16 Rl[], Word16 A[], Word32 epsP[], const Word16 order, Word16 *parcorr ); -Word16 E_LPC_lev_dur_stab_ivas_fx( const Word16 Rh[], const Word16 Rl[], Word16 A[], Word32 epsP[], const Word16 order, Word16 *parcorr, Word16 k_max ); - -Word16 E_LPC_lev_dur_fx( const Word16 Rh[], const Word16 Rl[], Word32 A[], Word32 epsP[], const Word16 order, Word32 *mem ); -Word16 E_LPC_lev_dur_stab_fx( const Word16 Rh[], const Word16 Rl[], Word32 A[], Word32 epsP[], const Word16 order, Word32 *mem, Word16 k_max ); +Word16 E_LPC_lev_dur( + const Word16 Rh[], + const Word16 Rl[], + Word16 A[], + Word32 epsP[], + const Word16 order, + Word16 *parcorr ); + +Word16 E_LPC_lev_dur_stab( + const Word16 Rh[], + const Word16 Rl[], + Word16 A[], + Word32 epsP[], + const Word16 order, + Word16 *parcorr, + Word16 k_max ); + +Word16 E_LPC_lev_dur_ivas_fx( + const Word16 Rh[], + const Word16 Rl[], + Word16 A[], + Word32 epsP[], + const Word16 order, + Word16 *parcorr ); + +Word16 E_LPC_lev_dur_stab_ivas_fx( + const Word16 Rh[], + const Word16 Rl[], + Word16 A[], + Word32 epsP[], + const Word16 order, + Word16 *parcorr, + Word16 k_max ); + +Word16 E_LPC_lev_dur_fx( + const Word16 Rh[], + const Word16 Rl[], + Word32 A[], + Word32 epsP[], + const Word16 order, + Word32 *mem ); + +Word16 E_LPC_lev_dur_stab_fx( + const Word16 Rh[], + const Word16 Rl[], + Word32 A[], + Word32 epsP[], + const Word16 order, + Word32 *mem, + Word16 k_max ); Word16 lev_dur_fx( Word32 *a_fx, /* o : LP coefficients (a[0] = 1.0) Q(q_a)*/ @@ -1228,10 +1253,16 @@ Word16 lev_dur_fx( Word16 q_a, Word16 q_r ); -void E_LPC_a_add_tilt( const Word16 *a /*Qa*/, Word16 *ap /*Qa*/, Word16 gamma /*Q15*/, Word16 m ); -void E_LPC_int_lpc_tcx( const Word16 lsp_old[], /* i : LSPs from past frame (1Q14) */ - const Word16 lsp_new[], /* i : LSPs from present frame (1Q14) */ - Word16 a[] /* o : interpolated LP coefficients (4Q11) */ +void E_LPC_a_add_tilt( + const Word16 *a /*Qa*/, + Word16 *ap /*Qa*/, + Word16 gamma /*Q15*/, + Word16 m ); + +void E_LPC_int_lpc_tcx( + const Word16 lsp_old[], /* i : LSPs from past frame (1Q14) */ + const Word16 lsp_new[], /* i : LSPs from present frame (1Q14) */ + Word16 a[] /* o : interpolated LP coefficients (4Q11) */ ); Word16 E_LPC_lsp_unweight( @@ -1242,68 +1273,38 @@ Word16 E_LPC_lsp_unweight( Word16 lpcorder /* (I): prediction order Q0 */ ); -Word32 E_LPC_schur( Word32 r[] /*Qr*/, Word16 reflCoeff[] /*Q15*/, Word32 epsP[] /*Qr*/, const Word16 m ); -Word32 E_LPC_schur_ivas( Word32 r[] /*Qr*/, Word16 reflCoeff[] /*Q15*/, const Word16 m ); -void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs /*Qx*/, Word16 *lsf /*15Q16*/, const Word16 *old_lsf /*15Q16*/, Word16 lpcOrder, Word8 lpcRep /*Q0*/ ); +Word32 E_LPC_schur( + Word32 r[] /*Qr*/, + Word16 reflCoeff[] /*Q15*/, + Word32 epsP[] /*Qr*/, + const Word16 m ); + +Word32 E_LPC_schur_ivas( + Word32 r[] /*Qr*/, + Word16 reflCoeff[] /*Q15*/, + const Word16 m ); + +void E_LPC_a_lsf_isf_conversion( + Word16 *lpcCoeffs /*Qx*/, + Word16 *lsf /*15Q16*/, + const Word16 *old_lsf /*15Q16*/, + Word16 lpcOrder, + Word8 lpcRep /*Q0*/ ); /*========================================================================================================/ bitstream_fx.c /========================================================================================================*/ -UWord16 get_next_indice( /* o : value of the indice */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 nb_bits /* i : number of bits that were used to quantize the indice */ -); - -UWord16 get_next_indice_fx( /* o : value of the indice */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 nb_bits /* i : number of bits that were used to quantize the indice */ -); - -void push_indice_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 id, /* i : ID of the indice */ - UWord16 value, /* i : value of the quantized indice */ - Word16 nb_bits /* i : number of bits used to quantize the indice */ -); - -void push_next_indice_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - UWord16 value, /* i : value of the quantized indice */ - Word16 nb_bits /* i : number of bits used to quantize the indice */ -); - -Word16 rate2EVSmode( - const Word32 brate, /* i : bitrate */ - Word16 *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ -); - -void push_next_bits_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 bits[], /* i : bit buffer to pack, sequence of single bits */ - Word16 nb_bits /* i : number of bits to pack */ -); - -UWord16 get_indice_fx( /* o : value of the indice */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 pos, /* i : absolute position in the bitstream */ - Word16 nb_bits /* i : number of bits that were used to quantize the indice */ -); - -UWord16 get_next_indice_1_fx( /* o : value of the indice */ - Decoder_State *st_fx /* i/o: decoder state structure */ -); - -UWord16 get_next_indice_1( /* o : value of the indice */ - Decoder_State *st_fx /* i/o: decoder state structure */ -); -UWord16 get_next_indice_1_fx( /* o : value of the indice */ - Decoder_State *st_fx /* i/o: decoder state structure */ +/* o : value of the indice */ +UWord16 get_next_indice_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ); -UWord16 get_next_indice_1_fx( /* o : value of the indice */ - Decoder_State *st_fx /* i/o: decoder state structure */ +/* o : value of the indice */ +UWord16 get_next_indice_1_fx( + Decoder_State *st_fx /* i/o: decoder state structure */ ); void get_next_indice_tmp_fx( @@ -1311,62 +1312,34 @@ void get_next_indice_tmp_fx( Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ); -UWord16 get_indice( /* o : value of the indice */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 pos, /* i : absolute position in the bitstream */ - Word16 nb_bits /* i : number of bits that were used to quantize the indice */ -); - -UWord16 get_indice_1_fx( /* o : value of the indice */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 pos /* i : absolute position in the bitstream */ +/* o : value of the indice */ +UWord16 get_indice_1_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + Word16 pos /* i : absolute position in the bitstream */ ); void reset_indices_enc_fx( BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - const Word16 max_num_indices /* i : max number of indices */ -); - -void reset_indices_dec_fx( - Decoder_State *st_fx /* i/o: decoder state structure */ -); - -void write_indices_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - FILE *file /* i : output bitstream file */ - , - UWord8 *pFrame, /* i: byte array with bit packet and byte aligned coded speech data */ - Word16 pFrame_size /* i: size of the binary encoded access unit [bits] */ + const Word16 max_num_indices /* i : max number of indices */ ); -void write_indices_buf_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - UWord16 *out_buf, /* i : output bitstream file */ - UWord8 *pFrame, /* i: byte array with bit packet and byte aligned coded speech data */ - Word16 pFrame_size, /* i: size of the binary encoded access unit [bits] */ - UWord16 *num_bits ); +Word16 BRATE2IDX_fx( + const Word32 brate ); -void indices_to_serial( - const Encoder_State *st_fx, /* i: encoder state structure */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - UWord8 *pFrame, /* o: byte array with bit packet and byte aligned coded speech data */ - Word16 *pFrame_size /* o: size of the binary encoded access unit [bits] */ -); - -void indices_to_serial_generic( - const Indice *ind_list, /* i: indices list */ - const Word16 num_indices, /* i: number of indices to write */ - UWord8 *pFrame, /* o: byte array with bit packet and byte aligned coded speech data */ - Word16 *pFrame_size /* i/o: number of bits in the binary encoded access unit [bits] */ -); +Word16 BRATE2IDX16k_fx( + Word32 brate ); -Word16 BRATE2IDX_fx( Word32 brate ); -Word16 BRATE2IDX16k_fx( Word32 brate ); +Word32 BIT_ALLOC_IDX_fx( + const Word32 brate, + Word16 ctype, + const Word16 sfrm, + const Word16 tc ); -Word32 BIT_ALLOC_IDX_fx( Word32 brate, Word16 ctype, Word16 sfrm, Word16 tc ); -Word32 BIT_ALLOC_IDX_16KHZ_fx( Word32 brate, Word16 ctype, Word16 sfrm, Word16 tc ); +Word32 BIT_ALLOC_IDX_16KHZ_fx( + const Word32 brate, + const Word16 ctype, + const Word16 sfrm, + const Word16 tc ); void getPartialCopyInfo( Decoder_State *st, /* i : decoder state structure */ @@ -1412,7 +1385,7 @@ scale_mem_fx.c Word16 Rescale_exc( Word16 dct_post_old_exc_fx[], /* i/o: Music post processing memory Q_exc*/ - Word16 exc[], /* i/o: excitation to rescale Q_exc */ + Word16 exc[], /* i/o: excitation to rescale Q_exc*/ Word16 bwe_exc[], /* Q_exc */ Word16 *last_exc_dct_in, /* Q_exc */ Word16 lg, /* i : frame size */ @@ -1420,12 +1393,12 @@ Word16 Rescale_exc( Word32 L_gain_code, /* i : decoded codebook gain Q16 */ Word16 *sQ_exc, /* i/o: Excitation scaling factor */ Word16 *sQsubfr, /* i/o: Past excitation scaling factors */ - Word16 exc2[], /* o : local excitation vector Q_exc */ + Word16 exc2[], /* o : local excitation vector Q_exc */ Word16 i_subfr, /* i : subframe number */ const Word16 coder_type ); void Rescale_mem( - const Word16 Q_exc, /* i : current excitation scaling (>=0) */ + const Word16 Q_exc, /* i : current excitation scaling (>=0) */ Word16 *prev_Q_syn, /* i/o : scaling factor of previous frame */ Word16 *Q_syn, /* i/o : scaling factor of frame */ Word16 *mem_syn2, /* i/o : modified synthesis memory Qexp_scale */ @@ -1444,13 +1417,21 @@ void Rescale_mem( void scale_sig32( Word32 x[], /* i/o: signal to scale Qx */ const Word16 lg, /* i : size of x[] Q0 */ - const Word16 exp0 /* i : exponent: x = round(x << exp) Qx xx exp */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx xx exp */ +); + +void Scale_sig64( + Word64 x[], /* i/o: signal to scale Qx */ + Word16 len, /* i : size of x[] Q0 */ + Word16 exp /* i : exponent: x = round(x << exp) Qx exp */ ); + void scale_sig32_r( Word32 x[], /* i/o: signal to scale Qx */ const Word16 lg, /* i : size of x[] Q0 */ const Word16 exp0 /* i : exponent: x = round(x << exp) Qx exp */ ); + Word16 rescale_mem( const Word16 *Q_exc, /* i : current excitation scaling (>=0) */ Word16 *prev_Q_syn, /* i/o : scaling factor of previous frame */ @@ -1493,36 +1474,40 @@ void hq_configure_evs_fx( ); // hp50.c -void hp20( Word16 signal[], /* i/o: signal to filter any */ - const Word16 stride, /* i : stride to be applied accessing signal */ - const Word16 lg, /* i : length of signal (integer) Q0 */ - Word32 mem[5], /* i/o: static filter memory with this layout: */ - /* mem[0]: y[-2] (32-bit) */ - /* mem[1]; y[-1] (32-bit) */ - /* mem[2]: x[-2] << 16 */ - /* mem[3]: x[-1] << 16 */ - /* Note: mem[0..3] need to be scaled per frame */ - /* mem[4]: states scale */ - const Word32 sFreq ); - -// get_gain.c -Word32 get_gain( /* encoder side; enc = 0 -> decoder side */ - Word16 *sign /* i/o: sign of the maximum */ + +/* o : impulse response energy Q3 */ +Word16 findpulse_fx( + const Word16 L_frame, /* i : length of the frame */ + const Word16 res[], /* i : Residual signal <12 bits */ + const Word16 T0, /* i : Pitch estimation Q0 */ + const Word16 enc, /* i : enc = 1 -> encoder side; enc = 0 -> decoder side */ + Word16 *sign /* i/o: sign of the maximum */ ); -// env_stab_trans.c void env_stab_transient_detect_fx( const Word16 is_transient, /* i: Transient flag */ const Word16 length, /* i : Length of spectrum (32 or 48 kHz) */ @@ -1727,8 +1715,6 @@ void env_stab_transient_detect_fx( const Word16 Qcoeff /* i : Q of coded spectral coefficients */ ); - -// env_adj.c void env_adj_fx( const Word16 *pulses, /* i : number of pulses per band Q0 */ const Word16 length, /* i : length of spectrum Q0 */ @@ -1738,62 +1724,57 @@ void env_adj_fx( const Word16 *sfmsize /* i : subband sizes Q0 */ ); - -// env_stab.c - -Word16 env_stability_fx( /* in Q15 */ - const Word16 *ynrm, /*i: Norm vector for current frame */ - const Word16 nb_sfm, /*i: Number of sub-bands */ - Word16 *mem_norm, /*i/o: Norm vector memory from past frame */ - Word16 *mem_env_delta, /*i/o: Envelope stability memory for smoothing in Q11 */ - const Word16 core_switching_flag /* i : Core switching flag */ +/* in Q15 */ +Word16 env_stability_fx( + const Word16 *ynrm, /*i: Norm vector for current frame */ + const Word16 nb_sfm, /*i: Number of sub-bands */ + Word16 *mem_norm, /*i/o: Norm vector memory from past frame */ + Word16 *mem_env_delta, /*i/o: Envelope stability memory for smoothing in Q11 */ + const Word16 core_switching_flag /* i : Core switching flag */ ); -Word16 env_stab_smo_fx( /* Q0 */ - Word16 env_stab, /*i : env_stab value Q15 */ - Word16 *env_stab_state_p, /*i/o: env_stab state probabilities Q15 */ - Word16 *ho_cnt /*i/o: hangover counter for speech state */ +/* Q0 */ +Word16 env_stab_smo_fx( + Word16 env_stab, /*i : env_stab value Q15 */ + Word16 *env_stab_state_p, /*i/o: env_stab state probabilities Q15 */ + Word16 *ho_cnt /*i/o: hangover counter for speech state */ ); -// enr_1_az.c -Word16 Enr_1_Az_fx( /* o : impulse response energy Q3 */ - const Word16 Aq[], /* i : LP filter coefs Qx based on the fact that Aq[0] == 1.0 */ - const Word16 len /* i : impulse response length Q0 */ +/* o : impulse response energy Q3 */ +Word16 Enr_1_Az_fx( + const Word16 Aq[], /* i : LP filter coefs Qx based on the fact that Aq[0] == 1.0 */ + const Word16 len /* i : impulse response length Q0 */ ); -Word16 Enr_1_Az_fx_o( /* o : impulse response energy Q3 */ - const Word16 Aq[], /* i : LP filter coefs Qx based on the fact that Aq[0] == 1.0 */ - const Word16 len, /* i : impulse response length Q0 */ - Flag *Overflow_out /* o : propagating the Overflow flag to upper level */ + +/* o : impulse response energy Q3 */ +Word16 Enr_1_Az_fx_o( + const Word16 Aq[], /* i : LP filter coefs Qx based on the fact that Aq[0] == 1.0 */ + const Word16 len, /* i : impulse response length Q0 */ + Flag *Overflow_out /* o : propagating the Overflow flag to upper level */ ); -// gs_gains_fx.c void Ener_per_band_comp_fx( - const Word16 exc_diff[], /* i : target signal Q_exc_diff */ + const Word16 exc_diff[], /* i : target signal Q_exc_diff */ Word16 y_gain4[], /* o : Energy per band to quantize Q12 */ const Word16 Q_exc_diff, const Word16 Mband, /* i : Max band */ const Word16 Eflag ); + void Ener_per_band_comp_ivas_fx( - const Word16 exc_diff_fx[], /* i : target signal Q_exc_diff */ - Word16 y_gain4_fx[], /* o : Energy per band to quantize Q12 */ + const Word16 exc_diff_fx[], /* i : target signal Q_exc_diff */ + Word16 y_gain4_fx[], /* o : Energy per band to quantize Q12 */ const Word16 Q_exc, /* i : frame length */ const Word16 Mband, /* i : Max band */ const Word16 Eflag, /* i : flag of highest band */ - const int16_t L_frame /* i : frame length */ + const Word16 L_frame /* i : frame length */ ); -void Ener_per_band_comp_ivas_fx_2( - const Word16 exc_diff_fx[], /* i : target signal Q_exc_diff */ - Word16 y_gain4_fx[], /* o : Energy per band to quantize Q12 */ - const Word16 Q_exc, /* i : frame length */ - const Word16 Mband, /* i : Max band */ - const Word16 Eflag, /* i : flag of highest band */ - const Word16 L_frame ); + void Comp_and_apply_gain_fx( Word16 exc_diffQ[], /* i/o: Quantized excitation */ Word16 Ener_per_bd_iQ[], /* i : Target ener per band Q13 */ Word16 Ener_per_bd_yQ[], /* i/o : Ener per band for norm vector i->Q13/o->Q13 */ - Word16 Mbands_gn, /* i : number of bands */ - const Word16 ReUseGain, /* i : Reuse the gain in Ener_per_bd_yQ */ + Word16 Mbands_gn, /* i : number of bands */ + const Word16 ReUseGain, /* i : Reuse the gain in Ener_per_bd_yQ */ Word16 Qexc_diff, Word16 Q_exc ); @@ -1801,31 +1782,29 @@ void Comp_and_apply_gain_ivas_fx( Word16 exc_diffQ[], /* i/o: Quantized excitation */ Word16 Ener_per_bd_iQ[], /* i : Target ener per band Q13 */ Word16 Ener_per_bd_yQ[], /* i/o : Ener per band for norm vector i->Q13/o->Q13 */ - Word16 Mbands_gn, /* i : number of bands */ - const Word16 ReUseGain, /* i : Reuse the gain in Ener_per_bd_yQ */ + Word16 Mbands_gn, /* i : number of bands */ + const Word16 ReUseGain, /* i : Reuse the gain in Ener_per_bd_yQ */ Word16 Qexc_diff, Word16 *Q_exc ); -// gs_preech.c void pre_echo_att_fx( Word32 *Last_frame_ener_fx, /* i/o: Energy of the last frame 2*Q_new+1*/ Word16 *exc_fx, /* i/o: Excitation of the current frame Q_new*/ - const Word16 gsc_attack_flag_fx, /* i : flag signalling attack encoded by AC mode (GSC) Q0*/ + const Word16 gsc_attack_flag_fx, /* i : flag signalling attack encoded by AC mode (GSC) Q0*/ const Word16 Q_new, - const Word16 last_coder_type, /* i : Last coding mode Q0*/ - const Word16 L_frame /* i : Frame length Q0*/ - + const Word16 last_coder_type, /* i : Last coding mode Q0*/ + const Word16 L_frame /* i : Frame length Q0*/ ); void pre_echo_att_ivas_fx( Word32 *Last_frame_ener_fx, /* i/o: Energy of the last frame 2*Q_new+1*/ Word16 *exc_fx, /* i/o: Excitation of the current frame Q_new*/ - const Word16 gsc_attack_flag_fx, /* i : flag signalling attack encoded by AC mode (GSC) Q0*/ + const Word16 gsc_attack_flag_fx, /* i : flag signalling attack encoded by AC mode (GSC) Q0*/ const Word16 Q_new, - const Word16 last_coder_type, /* i : Last coding mode Q0*/ - const Word16 L_frame /* i : Frame length Q0*/ + const Word16 last_coder_type, /* i : Last coding mode Q0*/ + const Word16 L_frame /* i : Frame length Q0*/ ); -// wtda_fx.c + void tcx_get_windows_mode1( const Word16 left_mode, /* i: overlap mode of left window half */ const Word16 right_mode, /* i: overlap mode of right window half */ @@ -1847,17 +1826,6 @@ void wtda_fx( const Word16 L /* i : length */ ); -void wtda_ivas_fx( - Word16 *new_audio, /* i : input audio Q0 */ - Word16 *Q, /* i/o : Q of input/Output Audio */ - Word16 *wtda_audio, /* o : windowed audio Qout */ - Word16 *old_wtda, /* i/o: windowed audio from previous frame Qout */ - Word16 *Qold_wtda, - const Word16 left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */ - const Word16 right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ - const Word16 L /* i : length */ -); - void wtda_ext_fx( const Word16 *new_audio, /* i : input audio (Q_in) */ Word16 *wtda_audio, /* o : windowed audio (Q_in) */ @@ -1887,7 +1855,7 @@ void GetPredictedSignal_fx( ); void Get20Log10Spec_fx( - const Word32 *L_inBuf, /* i : i Q_inBuf */ + const Word32 *L_inBuf, /* i : i Q_inBuf */ Word16 *outBuf_fx, /* o : output Q7 */ const Word16 fLen, /* i : loop length */ const Word16 Q_inBuf /* i : Qvalue of L_inBuf */ @@ -1895,7 +1863,7 @@ void Get20Log10Spec_fx( void GetSynthesizedSpecThinOut_fx( const Word16 *predBuf_fx, /* i : Qss: prediction buffer (i.e., lowband) */ - const Word16 Qss, /* i : Q value of i vector */ + const Word16 Qss, /* i : Q value of i vector */ Word32 *L_outBuf, /* o : QsL: synthesized spectrum */ Word16 QsL, /* o : Q value of synthesized spectrum */ const Word16 nBands_fx, /* i : Q0: number of subbands calculated */ @@ -1980,15 +1948,16 @@ void noise_extr_corcod_fx( ); void sqrt_32n_16_fx( - Word32 L_in, /* i : i vector (Word32) */ + Word32 L_in, /* i : i vector (Word32) */ Word16 Qin, /* i : Q value for L_in */ - Word16 *out_fx, /* o : sqrt i vector (Word16) */ + Word16 *out_fx, /* o : sqrt i vector (Word16) */ Word16 *Qout /* o : Q value for out_fx */ ); -Word16 div_s_ss( /* o: result of division (Word16 Q0) */ - const Word16 n, /* i: numerator (Word16 Q0 */ - const Word16 d /* i: denominator (Word16 Q0) */ +/* o: result of division (Word16 Q0) */ +Word16 div_s_ss( + const Word16 n, /* i: numerator (Word16 Q0 */ + const Word16 d /* i: denominator (Word16 Q0) */ ); void noiseinj_hf_fx( @@ -2039,16 +2008,17 @@ void return_bits_normal2_fx( const Word16 bits_lagIndices_fx[] /* i : bits for lagIndices */ ); -Word16 spectrumsmooth_noiseton_fx( /* o : Qss ss_min */ - Word32 L_spectra[], /* i : Qs core coder */ - /*Word16 Qs,*/ /* i : Q0 Q value for spectra, spectra_ni */ - const Word32 L_spectra_ni[], /* i : Qs core coder with sparse filling */ - Word16 sspectra_fx[], /* o : Qss Smoothed tonal information from core coder */ - Word16 sspectra_diff_fx[], /* o : Qss non tonal infomration for gap filling */ - Word16 sspectra_ni_fx[], /* o : Qss smoothed core coder */ - Word16 *Qss, /* o : Q0 Q value for sspectra* */ - const Word16 fLenLow_fx, /* i : Q0 low frequency boundaries */ - Word16 *ni_seed_fx /* io : Q0 random seed */ +/* o : Qss ss_min */ +Word16 spectrumsmooth_noiseton_fx( + Word32 L_spectra[], /* i : Qs core coder */ + /*Word16 Qs,*/ /* i : Q0 Q value for spectra, spectra_ni */ + const Word32 L_spectra_ni[], /* i : Qs core coder with sparse filling */ + Word16 sspectra_fx[], /* o : Qss Smoothed tonal information from core coder */ + Word16 sspectra_diff_fx[], /* o : Qss non tonal infomration for gap filling */ + Word16 sspectra_ni_fx[], /* o : Qss smoothed core coder */ + Word16 *Qss, /* o : Q0 Q value for sspectra* */ + const Word16 fLenLow_fx, /* i : Q0 low frequency boundaries */ + Word16 *ni_seed_fx /* io : Q0 random seed */ ); void ton_ene_est_fx( @@ -2072,8 +2042,8 @@ void ton_ene_est_fx( ); void norm_vec_32_16_scale_fx( - Word32 *L_vec_in, /* i : i vector */ - Word16 Qin, /* i : Q value for i vector */ + Word32 *L_vec_in, /* i : i vector */ + Word16 Qin, /* i : Q value for i vector */ Word16 length_fx, /* i :vector size */ Word16 *vec_out_fx, /* o : output vectror */ Word16 *Qout, /* o : Q value for output vectro */ @@ -2085,7 +2055,7 @@ void updat_prev_frm_fx( Word32 L_t_audio[], /* o: core coder buffer */ Word32 L_bwe_br, /* i: core bitrate */ Word16 length_fx, /* i: frame length coded bw */ - const Word16 inner_frame_fx, /* i: i frame length */ + const Word16 inner_frame_fx, /* i: i frame length */ Word16 bands_fx, /* i: sub band resolution */ Word16 bwidth_fx, /* i: NB/WB/SWB indicator */ const Word16 is_transient_fx, /* i: signal class information */ @@ -2117,26 +2087,23 @@ void get_sigma_fx_har( ); void genhf_noise_fx( - const Word16 noise_flr_fx[], - /* i : Qss smoothed non tonal */ /* sspectra_diff_fx:Qss */ - const Word16 Qss, /* i : Q0 Q value */ - Word32 L_xSynth_har[], - /* o : QsL hf non tonal components */ /* xSynth_har:QsL */ - const Word16 QsL, /* i : Q0 Q value */ - const Word16 *predBuf_fx, - /* i : Qss smoothed tonal compone */ /* sspectra:Qss */ - const Word16 bands, /* i : Q0 total number of subbands in a frame */ - const Word16 harmonic_band, /* i : Q0 Number of LF harmonic frames */ - const Word16 har_freq_est2, /* i : Q0 harmonic signal parameter */ - const Word16 pos_max_hfe2, /* i : Q0 last pulse in core coder */ - Word16 *pul_res, /* o : Q0 pulse resolution */ - GainItem_fx pk_sf_fx[], /* o : representative region */ - const Word16 fLenLow, /* i : Q0 low frequency length */ - const Word16 fLenHigh, /* i : Q0 high frequency length */ - const Word16 sbWidth[], /* i : Q0 bandwidth for high bands */ - const Word16 lagIndices[], /* i : Q0 correlation indices for most representative */ - const Word16 subband_offsets[], /* i : Q0 band offsets for HF reconstruction */ - const Word16 subband_search_offset[] /* i : Q0 most representative regions offsets in LF */ + const Word16 noise_flr_fx[], /* i : Qss smoothed non tonal sspectra_diff_fx:Qss */ + const Word16 Qss, /* i : Q0 Q value */ + Word32 L_xSynth_har[], /* o : QsL hf non tonal components xSynth_har:QsL */ + const Word16 QsL, /* i : Q0 Q value */ + const Word16 *predBuf_fx, /* i : Qss smoothed tonal compone sspectra:Qss */ + const Word16 bands, /* i : Q0 total number of subbands in a frame */ + const Word16 harmonic_band, /* i : Q0 Number of LF harmonic frames */ + const Word16 har_freq_est2, /* i : Q0 harmonic signal parameter */ + const Word16 pos_max_hfe2, /* i : Q0 last pulse in core coder */ + Word16 *pul_res, /* o : Q0 pulse resolution */ + GainItem_fx pk_sf_fx[], /* o : representative region */ + const Word16 fLenLow, /* i : Q0 low frequency length */ + const Word16 fLenHigh, /* i : Q0 high frequency length */ + const Word16 sbWidth[], /* i : Q0 bandwidth for high bands */ + const Word16 lagIndices[], /* i : Q0 correlation indices for most representative */ + const Word16 subband_offsets[], /* i : Q0 band offsets for HF reconstruction */ + const Word16 subband_search_offset[] /* i : Q0 most representative regions offsets in LF */ ); Word16 har_est_fx( @@ -2152,8 +2119,8 @@ Word16 har_est_fx( ); void FindNBiggest2_simple_fx_har( - const Word32 *L_inBuf, /* i : i buffer (searched) */ - const Word16 Qabs_in, /* i : Q value of i buffer */ + const Word32 *L_inBuf, /* i : i buffer (searched) */ + const Word16 Qabs_in, /* i : Q value of i buffer */ GainItem_fx *pk_sf_fx, /* o : N biggest components found */ const Word16 nIdx_fx, /* i : search length */ Word16 *n_fx, /* i : number of components searched (N biggest) */ @@ -2162,23 +2129,19 @@ void FindNBiggest2_simple_fx_har( Word16 get_usebit_npswb_fx( Word16 hqswb_clas_fx ); -/*========================================================================================================/ -isf_dec_amr_wb_fx.c -/========================================================================================================*/ - void disf_2s_36b_fx( Word16 *indice, /* i : quantized indices (use indice[0] = -1 in the decoder) */ - Word16 *isf_q, /* (Qx2.56) o : quantized ISFs in the cosine domain */ - Word16 *mem_AR, /* (Qx2.56) i/o: quantizer memory for AR model */ - Word16 *mem_MA, /* (Qx2.56) i/o: quantizer memory for MA model */ + Word16 *isf_q, /* (Qx2.56) o : quantized ISFs in the cosine domain */ + Word16 *mem_AR, /* (Qx2.56) i/o: quantizer memory for AR model */ + Word16 *mem_MA, /* (Qx2.56) i/o: quantizer memory for MA model */ const Word16 enc_dec /* i : encoder (0), decoder (1) G722.2 FER */ ); void disf_2s_46b_fx( Word16 *indice, /* i : quantized indices (use indice[0] = -1 in the decoder) */ - Word16 *isf_q, /* (Qx2.56) o : quantized ISFs in the cosine domain */ - Word16 *mem_AR, /* (Qx2.56) o : quantizer memory for AR model */ - Word16 *mem_MA, /* (Qx2.56) i/o: quantizer memory for MA model */ + Word16 *isf_q, /* (Qx2.56) o : quantized ISFs in the cosine domain */ + Word16 *mem_AR, /* (Qx2.56) o : quantizer memory for AR model */ + Word16 *mem_MA, /* (Qx2.56) i/o: quantizer memory for MA model */ const Word16 enc_dec /* i : encoder (0), decoder (1) G722.2 FER */ ); @@ -2187,16 +2150,12 @@ void disf_ns_28b_fx( Word16 *isf_q ); void isf_dec_amr_wb_fx( - Decoder_State *st, /* i/o: State structure */ - Word16 *Aq, /* Q12 o : quantized A(z) for 4 subframes */ - Word16 *isf_new, /* Qlog2(2.56) o : de-quantized ISF vector */ - Word16 *isp_new /* Q15 o : de-quantized ISP vector */ + Decoder_State *st, /* i/o: State structure */ + Word16 *Aq, /* Q12 o : quantized A(z) for 4 subframes */ + Word16 *isf_new, /* Qlog2(2.56) o : de-quantized ISF vector */ + Word16 *isp_new /* Q15 o : de-quantized ISP vector */ ); -/*========================================================================================================/ -hq2_noise_inject.c fix part -/========================================================================================================*/ - void hq2_noise_inject_fx( Word32 L_y2[], /* Q12 */ const Word16 band_start[], /* Q0 */ @@ -2222,10 +2181,6 @@ void hq2_noise_inject_fx( const Word32 bwe_br /* Q0 */ ); -/*========================================================================================================/ -hq2_bit_alloc_fx.c -/========================================================================================================*/ - void Bits2indvsb_fx( const Word32 *L_be, /* i : Qbe Band Energy of sub-band */ const Word16 start_band, /* i : Q0 start band indices */ @@ -2241,7 +2196,7 @@ void hq2_bit_alloc_har_fx( Word16 B_fx, /* i : Q0 number of available bits */ const Word16 N_fx, /* i : Q0 number of sub-vectors */ Word32 *L_Rsubband, /* o : QRk sub-band bit-allocation vector */ - Word16 p2a_bands_fx, /* i : Q0 highfreq bands */ + Word16 p2a_bands_fx, /* i : Q0 highfreq bands */ const Word32 L_core_brate, /* i : Q0 core bit rate */ Word16 p2a_flags_fx[], /* i/o: Q0 p2a_flags */ const Word16 band_width_fx[] /* i : Q0 table of band_width */ @@ -2267,10 +2222,6 @@ void reordvct_fx( Word16 *idx /* o : reordered vector index */ ); -/*========================================================================================================/ -nelp_fx.c -/========================================================================================================*/ - Word16 dequantize_uvg_fx( const Word16 iG1, /* i: gain 1 index */ const Word16 *iG2, /* i: gain 2 index */ @@ -2285,10 +2236,6 @@ void generate_nelp_excitation_fx( const Word16 gain_fac /* i : gain factor */ ); -/*========================================================================================================/ -ppp_fx.c -/========================================================================================================*/ - void Interpol_delay_fx( Word16 *out_fx, /* Q4 */ Word16 last_fx, /* Q0 */ @@ -2305,9 +2252,6 @@ void deemph_lpc_fx( const Word16 deemph_old /* Q0 */ ); -/*========================================================================================================/ -hq2_core_com_fx.c -/========================================================================================================*/ void mdct_spectrum_denorm_fx( const Word16 inp_vector[], /* i : Q0 : */ Word32 L_y2[], /* i/o : Qs : decoded spectrum */ @@ -2373,31 +2317,31 @@ void spt_shorten_domain_pre_fx( ); void spt_shorten_domain_band_save_fx( - const Word16 bands, /* i: total subband Q0*/ - const Word16 band_start[], /* i: starting position of subband Q0*/ - const Word16 band_end[], /* i: end position of subband Q0*/ - const Word16 band_width[], /* i: band width of subband Q0*/ - Word16 org_band_start[], /* o: starting position of subband Q0*/ - Word16 org_band_end[], /* o: end position of subband Q0*/ - Word16 org_band_width[] /* o: band width of subband Q0*/ + const Word16 bands, /* i: total subband Q0*/ + const Word16 band_start[], /* i: starting position of subband Q0*/ + const Word16 band_end[], /* i: end position of subband Q0*/ + const Word16 band_width[], /* i: band width of subband Q0*/ + Word16 org_band_start[], /* o: starting position of subband Q0*/ + Word16 org_band_end[], /* o: end position of subband Q0*/ + Word16 org_band_width[] /* o: band width of subband Q0*/ ); void spt_shorten_domain_band_restore_fx( - const Word16 bands, /* i: total subband Q0*/ - Word16 band_start[], /* i/o: starting position of subband Q0*/ - Word16 band_end[], /* i/o: end position of subband Q0*/ - Word16 band_width[], /* i/o: band width of subband Q0*/ - const Word16 org_band_start[], /* o: starting position of subband Q0*/ - const Word16 org_band_end[], /* o: end position of subband Q0*/ - const Word16 org_band_width[] /* o: band width of subband Q0*/ + const Word16 bands, /* i: total subband Q0*/ + Word16 band_start[], /* i/o: starting position of subband Q0*/ + Word16 band_end[], /* i/o: end position of subband Q0*/ + Word16 band_width[], /* i/o: band width of subband Q0*/ + const Word16 org_band_start[], /* o: starting position of subband Q0*/ + const Word16 org_band_end[], /* o: end position of subband Q0*/ + const Word16 org_band_width[] /* o: band width of subband Q0*/ ); void spt_swb_peakpos_tmp_save_fx( - const Word32 L_y2[], /* i: coded spectral information Qx*/ - const Word16 bands, /* i: total number of bands Q0*/ - const Word16 band_start[], /* i: starting position of subband Q0*/ - const Word16 band_end[], /* i: end position of subband Q0*/ - Word16 prev_SWB_peak_pos_tmp[] /* o: spectral peaks Q0*/ + const Word32 L_y2[], /* i: coded spectral information Qx*/ + const Word16 bands, /* i: total number of bands Q0*/ + const Word16 band_start[], /* i: starting position of subband Q0*/ + const Word16 band_end[], /* i: end position of subband Q0*/ + Word16 prev_SWB_peak_pos_tmp[] /* o: spectral peaks Q0*/ ); void bit_allocation_second_fx( @@ -2412,7 +2356,6 @@ void bit_allocation_second_fx( const Word16 *last_bitalloc, /* Q0 */ const Word16 input_frame /* Q0 */ ); -// synth_filt_fix.c Word32 syn_kern_16( Word32 L_tmp, @@ -2422,7 +2365,7 @@ Word32 syn_kern_16( void syn_filt_s_lc_fx( const Word16 shift, /* i : scaling to apply Q0 */ const Word16 a[], /* i : LP filter coefficients Q12 */ - const Word16 x[], /* i : i signal Qx */ + const Word16 x[], /* i : i signal Qx */ Word16 y[], /* o : output signal Qx-s */ const Word16 lg /* i : size of filtering Q0 */ ); @@ -2431,7 +2374,7 @@ void Syn_filt_s( const Word16 shift, /* i : scaling to apply Q0 */ const Word16 a[], /* i : LP filter coefficients Q12 */ const Word16 m, /* i : order of LP filter Q0 */ - const Word16 x[], /* i : i signal Qx */ + const Word16 x[], /* i : i signal Qx */ Word16 y[], /* o : output signal Qx-s */ const Word16 lg, /* i : size of filtering Q0 */ Word16 mem[], /* i/o: memory associated with this filtering. Qx-s */ @@ -2463,9 +2406,25 @@ void syn_filt_fx32( const Word16 update_m /* i : update memory flag Q0 : 0 --> no memory update */ ); -void E_UTIL_synthesis( const Word16 shift, const Word16 a[], const Word16 x[], Word16 y[], const Word16 lg, Word16 mem[], const Word16 update, const Word16 m ); +void E_UTIL_synthesis( + const Word16 shift, + const Word16 a[], + const Word16 x[], + Word16 y[], + const Word16 lg, + Word16 mem[], + const Word16 update, + const Word16 m ); -void E_UTIL_synthesis_fx( const Word16 shift, const Word32 a[], const Word32 x[], Word32 y[], const Word16 lg, Word32 mem[], const Word16 update, const Word16 m ); +void E_UTIL_synthesis_fx( + const Word16 shift, + const Word32 a[], + const Word32 x[], + Word32 y[], + const Word16 lg, + Word32 mem[], + const Word16 update, + const Word16 m ); void synth_mem_updt2( const Word16 L_frame, /* i : frame length */ @@ -2476,6 +2435,7 @@ void synth_mem_updt2( Word16 mem_syn[], /* o : synthesis filter memory for find_target */ const Word16 dec /* i : flag for decoder indication */ ); + void ivas_synth_mem_updt2_fx( const Word16 L_frame, /* i : frame length */ const Word16 last_L_frame, /* i : frame length */ @@ -2485,31 +2445,45 @@ void ivas_synth_mem_updt2_fx( Word16 mem_syn[], /* o : synthesis filter memory for find_target */ const Word16 dec ); +void lerp( + const Word16 *f, + Word16 *f_out, + Word16 bufferNewSize, + Word16 bufferOldSize ); -// lerp.c -void lerp( const Word16 *f, Word16 *f_out, Word16 bufferNewSize, Word16 bufferOldSize ); +void L_lerp_fx_q11( + Word32 *f, + Word32 *f_out, + Word16 bufferNewSize, + Word16 bufferOldSize ); -void L_lerp_fx_q11( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOldSize ); +void L_lerp_fx( + Word32 *f, + Word32 *f_out, + Word16 bufferNewSize, + Word16 bufferOldSize, + Word16 *q ); -void L_lerp_fx( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOldSize, Word16 *q ); - -// index_pvq_opt.c -PvqEntry mpvq_encode_vec_fx( /* o : leading_sign_index, index, size, k_val */ - const Word16 *vec_in, /* i : signed pulse train */ - Word16 dim_in, /* i : dimension */ - Word16 k_val_local /* i : nb unit pulses */ +/* o : leading_sign_index, index, size, k_val */ +PvqEntry mpvq_encode_vec_fx( + const Word16 *vec_in, /* i : signed pulse train */ + Word16 dim_in, /* i : dimension */ + Word16 k_val_local /* i : nb unit pulses */ ); -PvqEntry get_size_mpvq_calc_offset_fx( /* o : size, dim, k_val */ - Word16 dim_in, /* i : dimension */ - Word16 k_val_in, /* i : nb unit pulses */ - UWord32 *h_mem /* o : offsets */ + +/* o : size, dim, k_val */ +PvqEntry get_size_mpvq_calc_offset_fx( + Word16 dim_in, /* i : dimension */ + Word16 k_val_in, /* i : nb unit pulses */ + UWord32 *h_mem /* o : offsets */ ); -void mpvq_decode_vec_fx( /* o : void */ - const PvqEntry *entry, /* i : sign_ind, index, dim, k_val */ - UWord32 *h_mem, /* i : A/U offsets */ - Word16 *vec_out /* o : pulse train */ + +void mpvq_decode_vec_fx( + const PvqEntry *entry, /* i : sign_ind, index, dim, k_val */ + UWord32 *h_mem, /* i : A/U offsets */ + Word16 *vec_out /* o : pulse train */ ); -// weight_a_fx.c + void weight_a_subfr_fx( const Word16 nb_subfr, /* i : number of subframes Q0 */ const Word16 *A, /* i : LP filter coefficients Q12 */ @@ -2531,6 +2505,7 @@ void weight_a_fx( const Word16 gamma, /* i: weighting factor Q15 */ const Word16 m /* i: order of LP filter Q0 */ ); + void E_LPC_a_weight_inv( const Word16 *a, /* Q12 */ Word16 *ap, /* Q12 */ @@ -2538,7 +2513,6 @@ void E_LPC_a_weight_inv( const Word16 m /* Q0 */ ); -// residu_fx.c void Residu3_lc_fx( const Word16 a[], /* i : prediction coefficients Q12 */ const Word16 m, /* i : order of LP filter Q0 */ @@ -2569,44 +2543,48 @@ void calc_residu_fx( Word16 *res, /* o : residual signal Qx+1*/ const Word16 *p_Aq /* i : quantized LP filter coefficients Q12*/ ); -// inerpol_lc.c -Word32 Interpol_lc_fx( /* o : interpolated value Q15 */ - const Word16 *x, /* i : input vector Q0 */ - const Word16 *win, /* i : interpolation window Q14 */ - const Word16 frac, /* i : fraction (0..up_samp) Q0 */ - const Word16 up_samp, /* i : upsampling factor Q0 */ - const Word16 nb_coef /* i : number of coefficients Q0 */ -); - -Word16 modify_Fs_ivas_fx( /* o : length of output Q0 */ - const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ - Word16 lg, /* i : length of input Q0 */ - const Word32 fin, /* i : frequency of input Q0 */ - Word16 sigOut_fx[], /* o : decimated signal Q0 */ - const Word32 fout, /* i : frequency of output Q0 */ - Word16 mem_fx[], /* i/o: filter memory Q0 */ - const Word16 nblp, /* i : flag indicating if NB low-pass is applied */ - Word16 *Q_new_inp, /*scaling added on sigOut_fx */ - Word16 *mem_decim_size /*i: size modified for mem_fx*/ -); -// modif_fs_fx.c -Word16 modify_Fs_fx( /* o : length of output Q0 */ - const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ - Word16 lg, /* i : length of i Q0 */ - const Word32 fin, /* i : frequency of i Q0 */ - Word16 sigOut_fx[], /* o : decimated signal Q0 */ - const Word32 fout, /* i : frequency of output Q0 */ - Word16 mem_fx[], /* i/o: filter memory Q0 */ - const Word16 nblp /* i : flag indicating if NB low-pass is applied */ -); - -Word16 modify_Fs_intcub3m_sup_fx( /* o : length of output */ - const Word16 sigIn[], /* i : signal to decimate with memory of 2 samples (indexes -2 & -1) */ - const Word16 lg, /* i : length of input (suppose that lg is such that lg_out is integer, ex multiple of 5 in case of 16kHz to 12.8 kHz) */ - const Word32 fin, /* i : frequency of input */ - Word16 sigOut[], /* o : decimated signal */ - const Word32 fout, /* i : frequency of output */ - Word16 *delayout /* o : delay of output */ + +/* o : interpolated value Q15 */ +Word32 Interpol_lc_fx( + const Word16 *x, /* i : input vector Q0 */ + const Word16 *win, /* i : interpolation window Q14 */ + const Word16 frac, /* i : fraction (0..up_samp) Q0 */ + const Word16 up_samp, /* i : upsampling factor Q0 */ + const Word16 nb_coef /* i : number of coefficients Q0 */ +); + +/* o : length of output Q0 */ +Word16 modify_Fs_ivas_fx( + const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ + Word16 lg, /* i : length of input Q0 */ + const Word32 fin, /* i : frequency of input Q0 */ + Word16 sigOut_fx[], /* o : decimated signal Q0 */ + const Word32 fout, /* i : frequency of output Q0 */ + Word16 mem_fx[], /* i/o: filter memory Q0 */ + const Word16 nblp, /* i : flag indicating if NB low-pass is applied */ + Word16 *Q_new_inp, /*scaling added on sigOut_fx */ + Word16 *mem_decim_size /*i: size modified for mem_fx*/ +); + +/* o : length of output Q0 */ +Word16 modify_Fs_fx( + const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ + Word16 lg, /* i : length of i Q0 */ + const Word32 fin, /* i : frequency of i Q0 */ + Word16 sigOut_fx[], /* o : decimated signal Q0 */ + const Word32 fout, /* i : frequency of output Q0 */ + Word16 mem_fx[], /* i/o: filter memory Q0 */ + const Word16 nblp /* i : flag indicating if NB low-pass is applied */ +); + +/* o : length of output */ +Word16 modify_Fs_intcub3m_sup_fx( + const Word16 sigIn[], /* i : signal to decimate with memory of 2 samples (indexes -2 & -1) */ + const Word16 lg, /* i : length of input (suppose that lg is such that lg_out is integer, ex multiple of 5 in case of 16kHz to 12.8 kHz) */ + const Word32 fin, /* i : frequency of input */ + Word16 sigOut[], /* o : decimated signal */ + const Word32 fout, /* i : frequency of output */ + Word16 *delayout /* o : delay of output */ ); void Decimate_allpass_steep_fx( @@ -2633,7 +2611,7 @@ void Interpolate_allpass_steep_fx( void Interpolate_allpass_steep_fx32( const Word32 *in_fx, /* i : input array of size N */ Word32 *mem_fx, /* i/o: memory */ - const int16_t N, /* i : number of input samples */ + const Word16 N, /* i : number of input samples */ Word32 *out_fx /* o : output array of size 2*N */ ); @@ -2647,7 +2625,7 @@ void interpolate_3_over_2_allpass_fx( void interpolate_3_over_2_allpass_fx32( const Word32 *input, /* i : input signal Qx */ - const int16_t len, /* i : number of input samples */ + const Word16 len, /* i : number of input samples */ Word32 *out, /* o : output signal */ Word32 *mem /* i/o: memory */ ); @@ -2684,8 +2662,6 @@ void retro_interp4_5_fx( void retro_interp5_4_fx( Word16 *pst_old_syn_fx ); -// lag_wind.c - void adapt_lag_wind( Word16 r_h[], /* in/out: autocorrelations */ Word16 r_l[], /* in/out: autocorrelations */ @@ -2712,8 +2688,7 @@ void lag_wind_32( // preemp_fx.c #define PREEMPH_FX( signal, mu, L, mem ) preemph_copy_fx( ( signal ), ( signal ), ( mu ), ( L ), ( mem ) ) -#define PREEMPH_32FX( signal, signal_out, mu, L, mem ) preemph_copy_32fx( ( signal ), ( signal_out ), ( mu ), ( L ), ( mem ) ) - +#define PREEMPH_32FX( signal, signal_out, mu, L, mem ) preemph_copy_32fx2( ( signal ), ( signal_out ), ( mu ), ( L ), ( mem ) ) void preemph_copy_fx( const Word16 x[], /* i : i signal Qx */ Word16 y[], /* o : output signal Qx */ @@ -2722,7 +2697,7 @@ void preemph_copy_fx( Word16 *mem /* i/o: memory (x[-1]) Qx */ ); -void preemph_copy_32fx( +void preemph_copy_32fx2( const Word16 x[], /* i : i signal Qx */ Word32 y[], /* o : output signal Qx */ const Word16 mu, /* i : preemphasis coefficient Q15 */ @@ -2745,6 +2720,7 @@ Word16 E_UTIL_f_preemph3( Word16 *mem, /* Qx */ Word16 bits /* Q0 */ ); + Word16 E_UTIL_f_preemph3_ivas_fx( Word16 *signal, /* Qx */ const Word16 mu, /* Q15 */ @@ -2752,7 +2728,7 @@ Word16 E_UTIL_f_preemph3_ivas_fx( Word16 *mem, /* Qx */ Word16 bits /* Q0 */ ); -// swb_bwe_com_fx.c + Word16 WB_BWE_gain_pred_fx( Word16 *WB_fenv, /* o : WB frequency envelopes */ const Word16 *core_dec_freq, /* i : Frequency domain core decoded signal */ @@ -2776,10 +2752,11 @@ void calc_normal_length_fx( Word16 *prev_L_swb_norm, /*i/o : last normalize length */ Word16 Q_syn ); -Word16 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ - const Word32 *sp, /* i : i signal */ - const Word16 exp_sp, /* i : Exp of inp signal */ - const Word16 N /* i : signal length */ +/* o : Tilt in Q24 */ +Word16 ivas_calc_tilt_bwe_fx( + const Word32 *sp, /* i : i signal */ + const Word16 exp_sp, /* i : Exp of inp signal */ + const Word16 N /* i : signal length */ ); void calc_norm_envelop_fx( @@ -2885,7 +2862,6 @@ void save_old_syn_fx( Word16 *mem_deemph /* i/o: deemphasis filter memory */ ); -// swb_tbe_com_fx.c void find_td_envelope_fx( const Word16 inp[], /* i : input signal Qx */ const Word16 len, /* i : length of the input signal */ @@ -2931,16 +2907,16 @@ void tbe_celp_exc( ); void tbe_celp_exc_ivas( - const int16_t element_mode, /* i : element mode */ - const int16_t idchan, /* i : channel ID */ - const Word16 L_frame_fx, /* i : Frame lenght */ - const int16_t L_subfr, /* i : subframe length */ - const Word16 i_subfr_fx, /* i : sub frame */ - const Word16 T0_fx, /* i : Integer pitch */ - const Word16 T0_frac_fx, /* i : Fractional part of the pitch */ - Word16 *error_fx, /* i/o: Error */ - Word16 *bwe_exc_fx, /* i/o: bandwitdh extension signal */ - const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 L_frame_fx, /* i : Frame lenght */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 i_subfr_fx, /* i : sub frame */ + const Word16 T0_fx, /* i : Integer pitch */ + const Word16 T0_frac_fx, /* i : Fractional part of the pitch */ + Word16 *error_fx, /* i/o: Error */ + Word16 *bwe_exc_fx, /* i/o: bandwitdh extension signal */ + const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ ); void flip_and_downmix_generic_fx( @@ -3057,22 +3033,7 @@ void GenShapedSHBExcitation_fx( Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */ Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ const Word32 bitrate, - const Word16 prev_bfi -#ifdef ADD_IVAS_TBE_CODE - , /* i : previous frame was concealed */ - const Word16 element_mode, /* i : element mode */ - const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ - Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */ - Word16 *mixExc16k, /* i/o: exc spreading for IC-BWE */ - const Word32 extl_brate, /* i : extension layer bitarte */ - const Word16 MSFlag, /* i : Multi Source flag */ - Word16 EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */ - Word16 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */ - Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */ - Word16 *Env_error, /* o : error in SHB residual envelope modelling*/ - Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling */ -#endif -); + const Word16 prev_bfi ); void GenShapedSHBExcitation_ivas_enc_fx( Word16 *excSHB, /* o : synthesized shaped shb excitation Q_bwe_exc*/ @@ -3147,9 +3108,7 @@ void GenShapedSHBExcitation_ivas_dec_fx( Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */ Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ const Word32 bitrate, - const Word16 prev_bfi -#if 1 // def ADD_IVAS_TBE_CODE - , /* i : previous frame was concealed */ + const Word16 prev_bfi, /* i : previous frame was concealed */ const Word16 element_mode, /* i : element mode */ const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */ @@ -3161,7 +3120,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */ Word16 *Env_error, /* o : error in SHB residual envelope modelling*/ Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling */ -#endif ); void GenSHBSynth_fx( @@ -3177,8 +3135,8 @@ void GenSHBSynth_fx32( Word32 *shb_syn_speech_32k, /* o : output highband component */ Word32 Hilbert_Mem[], /* i/o: memory */ Word32 state_lsyn_filt_shb_local[], /* i/o: memory */ - const int16_t L_frame, /* i : ACELP frame length */ - int16_t *syn_dm_phase ); + const Word16 L_frame, /* i : ACELP frame length */ + Word16 *syn_dm_phase ); void ScaleShapedSHB_fx( const Word16 length, /* i : SHB overlap length */ @@ -3213,22 +3171,18 @@ void ScaleShapedWB_fx( const Word16 *win, /* i : window */ const Word16 *subwin, /* i : subframes window */ const Word16 Q_bwe_exc, - Word16 L_frame /* i : Frame length - determines whether 12.8 or 16kHz core in-use */ - , - Word16 dynQ /* i : indicate whether output is dynamic Q, or Q0 */ - , - Word16 *Qx /* o : newly computed Q factor for synSHB */ - , - Word16 prev_Qx /* i : prev_Qx for memory scaling */ - , + Word16 L_frame, /* i : Frame length - determines whether 12.8 or 16kHz core in-use */ + Word16 dynQ, /* i : indicate whether output is dynamic Q, or Q0 */ + Word16 *Qx, /* o : newly computed Q factor for synSHB */ + Word16 prev_Qx, /* i : prev_Qx for memory scaling */ Word32 *Hilbert_Mem /* i : Hilbert memory used for computing Qx */ ); void non_linearity_fx( const Word16 i[], /* i : i signal Q_inp */ - Word32 output[], /* o : output signal 2*Q_inp */ + Word32 output[], /* o : output signal 2*Q_inp */ const Word16 length, /* i : i length */ - Word32 *prev_scale, /* i/o: memory Q30 */ + Word32 *prev_scale, /* i/o: memory Q30 */ Word16 Q_inp, Word16 coder_type, /* i : Coder Type */ Word16 *voice_factors, /* i : Voice Factors */ @@ -3237,9 +3191,9 @@ void non_linearity_fx( void non_linearity_ivas_fx( const Word16 i[], /* i : i signal Q_inp */ - Word32 output[], /* o : output signal 2*Q_inp */ + Word32 output[], /* o : output signal 2*Q_inp */ const Word16 length, /* i : i length */ - Word32 *prev_scale, /* i/o: memory Q30 */ + Word32 *prev_scale, /* i/o: memory Q30 */ Word16 Q_inp, Word16 coder_type, /* i : Coder Type */ Word16 *voice_factors, /* i : Voice Factors */ @@ -3248,20 +3202,26 @@ void non_linearity_ivas_fx( void interp_code_5over2_fx( const Word16 inp_code[], /* i : i vector */ - Word16 interp_code[], /* o : output vector */ + Word16 interp_code[], /* o : output vector */ const Word16 inp_length /* i : length of i vector */ ); void interp_code_4over2_fx( const Word16 inp_code_fx[], /* i : i vector Qx */ - Word16 interp_code_fx[], /* o : output vector Qx */ + Word16 interp_code_fx[], /* o : output vector Qx */ const Word16 inp_length /* i : length of i vector */ ); -void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); +void wb_tbe_extras_reset_synth_fx( + Word16 state_lsyn_filt_shb[], + Word16 state_lsyn_filt_dwn_shb[], + Word16 state_32and48k_WB_upsample[], + Word16 state_resamp_HB[] ); void elliptic_bpf_48k_generic_fx( - const Word16 input_fx[], /* i : i signal Q_input_fx */ + const Word16 element_mode, + Word16 IsUpsampled3, + Word16 input_fx[], /* i : input signal Q_input_fx*/ Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal */ Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ @@ -3274,73 +3234,43 @@ void synthesise_fb_high_band_fx( Word16 Q_fb_exc, Word16 output[], /* o : high band speech - 14.0 to 20 kHz */ const Word32 fb_exc_energy, /* i : full band excitation energy */ - const Word16 ratio, /* i : energy ratio */ + const Word16 ratio, /* i : energy ratio */ const Word16 L_frame, /* i : ACELP frame length */ - const Word16 bfi, /* i : fec flag */ + const Word16 bfi, /* i : fec flag */ Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout ); + Word16 Qout, + Word16 element_mode ); void prep_tbe_exc_fx( - const Word16 L_frame_fx, /* i : length of the frame */ -#ifdef ADD_IVAS_TBE_CODE - const Word16 L_subfr, -#endif - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate /* i :core bitrate */ -#ifdef ADD_IVAS_TBE_CODE - , - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif -); - -void prep_tbe_exc_ivas_fx( - const Word16 L_frame_fx, /* i : length of the frame */ -#if 1 // def ADD_IVAS_TBE_CODE - const Word16 L_subfr, -#endif - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate -#if 1 // def ADD_IVAS_TBE_CODE - , /* i : core bitrate */ - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif -); - -Word16 swb_formant_fac_fx( /* o : Formant filter strength [0,1] */ - const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ - Word16 *tilt_mem /* i/o: Tilt smoothing memory */ + const Word16 L_frame_fx, /* i : length of the frame */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 i_subfr_fx, /* i : subframe index */ + const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ + const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ + const Word16 code_fx[], /* i : algebraic excitation Q9*/ + const Word16 voice_fac_fx, /* i : voicing factor Q15*/ + Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ + Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ + const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ + const Word16 code_preQ_fx[], /* i : prequantizer excitation */ + const Word16 Q_code_preQ, /* i : Q, prequantizer excitation */ + const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ + const Word16 T0, /* i : integer pitch variables Q0 */ + const Word16 T0_frac, /* i : Fractional pitch variables Q0*/ + const Word16 coder_type, /* i : coding type */ + const Word32 core_brate, /* i : core bitrate */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ + const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ +); + +/*! r: Formant filter strength [0,1] */ +Word16 swb_formant_fac_fx( + const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ + Word16 *tilt_mem /* i/o: Tilt smoothing memory */ ); void wb_tbe_extras_reset_fx( @@ -3353,8 +3283,6 @@ Word16 get_tbe_bits_fx( const Word16 rf_mode /* i : bandwidht mode */ ); -// pvq_com_fx - UWord32 intLimCDivPos_fx( UWord32 NUM, /* Qx */ Word16 DEN /* Q0 */ @@ -3366,9 +3294,9 @@ Word16 shrtCDivSignedApprox( ); void obtainEnergyQuantizerDensity_fx( - const Word16 L, /* i : left vector energy Q0*/ - const Word16 R, /* i : right vector energy Q0*/ - Word16 *Density /* o : quantizer density Q0*/ + const Word16 L, /* i : left vector energy Q0*/ + const Word16 R, /* i : right vector energy Q0*/ + Word16 *Density /* o : quantizer density Q0*/ ); void dsDirac2Dirac_fx( @@ -3377,11 +3305,11 @@ void dsDirac2Dirac_fx( ); void dsDiracPerQuanta_fx( - const Word16 td, /* i : Length of vector segment Q0*/ - const Word16 t_quanta, /* i : Assigned number of quanta Q0*/ - const Word16 dsm, /* i : Conservative rounding flag Q0*/ - const unsigned char *const *frQuanta, /* i : Quanta lookup table */ - Word16 *DsIdx /* o : Lookup table index Q0*/ + const Word16 td, /* i : Length of vector segment Q0*/ + const Word16 t_quanta, /* i : Assigned number of quanta Q0*/ + const Word16 dsm, /* i : Conservative rounding flag Q0*/ + const unsigned char *const *frQuanta, /* i : Quanta lookup table */ + Word16 *DsIdx /* o : Lookup table index Q0*/ ); void QuantaPerDsDirac_fx( @@ -3419,20 +3347,20 @@ void bandBitsAdjustment_fx( ); void densityAngle2RmsProjDec_fx( - const Word16 D, /* i : density Q0*/ - const Word16 indexphi, /* i : decoded index from AR dec Q0*/ - Word16 *oppQ15, /* o : opposite Q15*/ - Word16 *nearQ15, /* o : near Q15*/ - Word16 *oppRatioQ3 /* o : ratio Q3*/ + const Word16 D, /* i : density Q0*/ + const Word16 indexphi, /* i : decoded index from AR dec Q0*/ + Word16 *oppQ15, /* o : opposite Q15*/ + Word16 *nearQ15, /* o : near Q15*/ + Word16 *oppRatioQ3 /* o : ratio Q3*/ ); void densityAngle2RmsProjEnc_fx( - const Word16 D, /* i : density Q0*/ - const Word16 phiQ14uq, /* i : angle Q14*/ - Word16 *indexphi, /* o : index Q0*/ - Word16 *oppQ15, /* o : opposite Q15*/ - Word16 *nearQ15, /* o : near Q15*/ - Word16 *oppRatioQ3 /* o : ratio Q3*/ + const Word16 D, /* i : density Q0*/ + const Word16 phiQ14uq, /* i : angle Q14*/ + Word16 *indexphi, /* o : index Q0*/ + Word16 *oppQ15, /* o : opposite Q15*/ + Word16 *nearQ15, /* o : near Q15*/ + Word16 *oppRatioQ3 /* o : ratio Q3*/ ); void NearOppSplitAdjustment_fx( @@ -3450,7 +3378,7 @@ void NearOppSplitAdjustment_fx( Word16 oppRQ3, /* i : ratio Q0*/ Word16 *qnear, /* o : quantized near Q0*/ Word16 *qopp, /* o : quantized opposite Q0*/ - Word16 *qglobalupd /* o : quanta remaining Q0*/ + Word16 *qglobalupd /* o : quanta remaining Q0*/ ); void apply_gain_fx( @@ -3459,7 +3387,7 @@ void apply_gain_fx( const Word16 *band_end, /* i : Sub band end indices Q0 */ const Word16 num_sfm, /* i : Number of bands Q0 */ const Word16 *gains, /* i : Band gain vector Q12 */ - Word16 *xq /* i/o: Float synthesis / Gain adjusted synth Q15/Q12 */ + Word16 *xq /* i/o: synthesis / Gain adjusted synth Q15/Q12 */ ); void fine_gain_quant_fx( @@ -3472,33 +3400,32 @@ void fine_gain_quant_fx( ); void srt_vec_ind16_fx( - const Word16 *linear, /* linear input Q3*/ - Word16 *srt, /* sorted output Q3*/ - Word16 *I, /* index for sorted output Q0*/ + const Word16 *linear, /* linear input Q3*/ + Word16 *srt, /* sorted output Q3*/ + Word16 *I, /* index for sorted output Q0*/ Word16 length /* Q0 */ ); -Word16 atan2_fx( /* o: Angle between 0 and PI/2 radian (Q14) */ - const Word32 y, /* i : near side (Argument must be positive) (Q15) */ - const Word32 x /* i : opposite side (Q15) */ +/* o: Angle between 0 and PI/2 radian (Q14) */ +Word16 atan2_fx( + const Word32 y, /* i : near side (Argument must be positive) (Q15) */ + const Word32 x /* i : opposite side (Q15) */ ); -// rang_com_fx.c -Word16 rc_get_bits2_fx( /* o: Number of bits needed Q0*/ - const Word16 N, /* i: Number of bits currently used Q0*/ - const UWord32 range /* i: Range of range coder Q0*/ +/* o: Number of bits needed Q0*/ +Word16 rc_get_bits2_fx( + const Word16 N, /* i: Number of bits currently used Q0*/ + const UWord32 range /* i: Range of range coder Q0*/ ); void rangeCoderFinalizationFBits_fx( - Word16 Brc, /* i : Current number of decoded bits Q0*/ - UWord32 INTrc, /* i : Range coder state Q0*/ - Word16 *FBits /* i : Fractional finalization bits Q0*/ + Word16 Brc, /* i : Current number of decoded bits Q0*/ + UWord32 INTrc, /* i : Range coder state Q0*/ + Word16 *FBits /* i : Fractional finalization bits Q0*/ ); -// wi_fx.c - -ivas_error DTFS_new_fx( DTFS_STRUCTURE **dtfs_out ); - +ivas_error DTFS_new_fx( + DTFS_STRUCTURE **dtfs_out ); void DTFS_copy_fx( DTFS_STRUCTURE *Xout_fx, /* o: DTFS structure */ @@ -3519,11 +3446,23 @@ Word16 DTFS_alignment_full_fx( Word16 *C_fx, Word16 FR_flag ); -void DTFS_phaseShift_fx( DTFS_STRUCTURE *X_fx, Word16 ph, Word16 Lag, Word16 *S_fx, Word16 *C_fx ); +void DTFS_phaseShift_fx( + DTFS_STRUCTURE *X_fx, + Word16 ph, + Word16 Lag, + Word16 *S_fx, + Word16 *C_fx ); -void Q2phaseShift_fx( DTFS_STRUCTURE *X_fx, Word16 ph, Word16 Lag, Word16 *S_fx, Word16 *C_fx ); +void Q2phaseShift_fx( + DTFS_STRUCTURE *X_fx, + Word16 ph, + Word16 Lag, + Word16 *S_fx, + Word16 *C_fx ); -void DTFS_zeroPadd_fx( Word16 N_fx, DTFS_STRUCTURE *X_fx ); +void DTFS_zeroPadd_fx( + Word16 N_fx, + DTFS_STRUCTURE *X_fx ); void DTFS_to_fs_fx( const Word16 *x, /* i : time domain signal */ @@ -3541,39 +3480,46 @@ void DTFS_zeroFilter_fx( Word16 *S_fx, Word16 *C_fx ); -void DTFS_poleFilter_fx_9( DTFS_STRUCTURE *X_fx, Word16 *pf_temp1, Word16 *pf_temp2, Word16 *pf_temp, Word16 *pf_n2_temp1 ); +void DTFS_poleFilter_fx_9( + DTFS_STRUCTURE *X_fx, + Word16 *pf_temp1, + Word16 *pf_temp2, + Word16 *pf_temp, + Word16 *pf_n2_temp1 ); void DTFS_adjustLag_fx( DTFS_STRUCTURE *X_DTFS_FX, /* i/o : DTFS to adjust lag for */ Word16 N_fx /* i : Target lag */ ); -Word32 DTFS_getEngy_fx( DTFS_STRUCTURE *X_fx ); +Word32 DTFS_getEngy_fx( + DTFS_STRUCTURE *X_fx ); -Word32 DTFS_getEngy_P2A_fx( DTFS_STRUCTURE *X_fx ); +Word32 DTFS_getEngy_P2A_fx( + DTFS_STRUCTURE *X_fx ); void DTFS_car2pol_fx( DTFS_STRUCTURE *X_fx /* i/o : DTFS structure a, b, lag */ ); Word32 DTFS_setEngyHarm_fx( - Word16 f1_fx, /* i : lower band freq of i to control energy */ - Word16 f2_fx, /* i : upper band freq of i to control energy */ + Word16 f1_fx, /* i : lower band freq of i to control energy */ + Word16 f2_fx, /* i : upper band freq of i to control energy */ Word16 g1_fx, /* i : lower band freq of output to control energy */ Word16 g2_fx, /* i : upper band freq of output to control energy */ Word32 en2_fx, /* i : Target Energy to set the DTFS to */ - Word16 Qen2_fx, /* i : Input Q format for en2 */ - Word16 *Qa_fx, /* i : Output Q format for x->a */ + Word16 Qen2_fx, /* i : Input Q format for en2 */ + Word16 *Qa_fx, /* i : Output Q format for x->a */ DTFS_STRUCTURE *X_fx /* i/o: DTFS to adjust the energy of */ ); void DTFS_to_erb_fx( - const DTFS_STRUCTURE X_fx, /* i : DTFS i */ - Word16 *out_fx /* o : ERB output */ + const DTFS_STRUCTURE X_fx, /* i : DTFS i */ + Word16 *out_fx /* o : ERB output */ ); void erb_slot_fx( - Word16 lag_fx, /* i : i lag */ + Word16 lag_fx, /* i : i lag */ Word16 *out_fx, /* o : ERB slots */ Word16 *mfreq_fx, /* i : ERB frequencies */ Word16 num_erb_fx /* i : number of ERBs */ @@ -3583,8 +3529,8 @@ void DTFS_erb_inv_fx( Word16 *in_fx, /* i : ERB inpt */ Word16 *slot_fx, /* i : ERB slots filled based on lag */ Word16 *mfreq_fx, /* i : erb frequence edges */ - DTFS_STRUCTURE *X_fx, /* o : DTFS after erb-inv */ - Word16 num_erb_fx /* i : Number of ERB bands */ + DTFS_STRUCTURE *X_fx, /* o : DTFS after erb-inv */ + Word16 num_erb_fx /* i : Number of ERB bands */ ); void erb_add_fx( @@ -3596,7 +3542,13 @@ void erb_add_fx( Word16 num_erb_fx /* i : number of ERBs */ ); -void quant_target_fx( DTFS_STRUCTURE *X_fx, const Word16 *curr_lpc, Word16 *w, Word16 *target, Word16 *sin_tab, Word16 *cos_tab ); +void quant_target_fx( + DTFS_STRUCTURE *X_fx, + const Word16 *curr_lpc, + Word16 *w, + Word16 *target, + Word16 *sin_tab, + Word16 *cos_tab ); ivas_error WIsyn_fx( DTFS_STRUCTURE PREVCW_FX, /* i : Prev frame DTFS */ @@ -3618,9 +3570,7 @@ Word16 ppp_extract_pitch_period_fx( Word16 *out, /* o : output residual */ Word16 l, /* i : lag */ Word16 *out_of_bound, /* o : out of bound flag */ - Word16 Qres - -); + Word16 Qres ); void DTFS_peaktoaverage_fx( DTFS_STRUCTURE X_fx, /* i : DTFS */ @@ -3630,33 +3580,59 @@ void DTFS_peaktoaverage_fx( Word16 *Qneg /* o : negative peak to ave Q format */ ); -void rshiftHarmBand_fx( DTFS_STRUCTURE *X_fx, Word16 lband_fx, Word16 hband_fx, Word16 shift_fx ); +void rshiftHarmBand_fx( + DTFS_STRUCTURE *X_fx, + Word16 lband_fx, + Word16 hband_fx, + Word16 shift_fx ); -void GetSinCosTab_fx( Word16 L, Word16 *sinTab, Word16 *cosTab ); +void GetSinCosTab_fx( + Word16 L, + Word16 *sinTab, + Word16 *cosTab ); -void r_fft_4_fx( Word16 *farray_ptr_fx, Word16 size, Word16 stage, Word16 isign ); +void r_fft_4_fx( + Word16 *farray_ptr_fx, + Word16 size, + Word16 stage, + Word16 isign ); -void copy_phase_fx( DTFS_STRUCTURE *X1_fx, DTFS_STRUCTURE X2_fx, DTFS_STRUCTURE *retX_fx ); +void copy_phase_fx( + DTFS_STRUCTURE *X1_fx, + DTFS_STRUCTURE X2_fx, + DTFS_STRUCTURE *retX_fx ); -Word32 getSpEngyFromResAmp_fx( DTFS_STRUCTURE *X_fx, Word16 lband, Word16 hband, const Word16 *curr_lpc, Word16 *sin_tab, Word16 *cos_tab ); +Word32 getSpEngyFromResAmp_fx( + DTFS_STRUCTURE *X_fx, + Word16 lband, + Word16 hband, + const Word16 *curr_lpc, + Word16 *sin_tab, + Word16 *cos_tab ); -void DTFS_poleFilter_fx( DTFS_STRUCTURE *X_fx, Word16 *LPC, Word16 N, Word16 *S_fx, Word16 *C_fx ); +void DTFS_poleFilter_fx( + DTFS_STRUCTURE *X_fx, + Word16 *LPC, + Word16 N, + Word16 *S_fx, + Word16 *C_fx ); -void poleFilter_setup_fx( const Word16 *LPC, Word16 N, DTFS_STRUCTURE X_fx, Word16 *S_fx, Word16 *C_fx, Word16 *pf_temp1, Word16 *pf_temp2, Word16 *pf_temp, Word16 *pf_n2_temp1 ); +void poleFilter_setup_fx( + const Word16 *LPC, + Word16 N, + DTFS_STRUCTURE X_fx, + Word16 *S_fx, + Word16 *C_fx, + Word16 *pf_temp1, + Word16 *pf_temp2, + Word16 *pf_temp, + Word16 *pf_n2_temp1 ); Word32 DTFS_getEngy_band_wb_fx( DTFS_STRUCTURE X_fx, Word16 lband, Word16 hband ); -// tns_base.c -/** Init TNS configuration. - * Fills STnsConfig structure with sensible content. - * @param nSampleRate Sampling rate of the i . - * @param nFrameLength Frame length. - * @param pTnsConfig TNS configuration to be initialized. - * @return 0 on success, otherwise 1. - */ void InitTnsConfiguration( const Word16 bwidth, const Word16 frameLength, @@ -3675,51 +3651,41 @@ void InitTnsConfiguration_ivas_fx( const Word16 element_mode, const Word16 is_mct ); -/** Modify spectrum using TNS filter. - * Modifies spectrum unsing TNS filter defined by pTnsData. - * If fIsAnalyses is true considers spectrum to be - * an i of encoder and returns residum. - * If fIsAnalyses is false considers spectrum to be - * a residum from decoder and returns output spectrum. - * @param pTnsConfig TNS configuration. - * @param pTnsData TNS data describing filters. - * @param spectrum Input/output spectrum. - * @param fIsAnalysis Defines if TNS filter is applied - * in encoder (TRUE) or in decoder (FALSE). - * @return 0 on success, otherwise 1. - */ void ApplyTnsFilter( STnsConfig const *pTnsConfig, STnsData const *pTnsData, Word32 spectrum[], const Word8 fIsAnalysis ); -Word16 ITF_Detect_fx( Word32 const pSpectrum[], - const Word16 startLine, - const Word16 stopLine, - const Word16 maxOrder, - Word16 *A, - Word16 *Q_A, - Word16 *predictionGain, - Word16 *curr_order, - Word16 Q ); - -Word16 ITF_Detect_ivas_fx( Word32 const pSpectrum[], - const Word16 startLine, - const Word16 stopLine, - const Word16 maxOrder, - Word16 *A, - Word16 *Q_A, - Word16 *predictionGain, - Word16 *curr_order, - Word16 Q ); - -void ITF_Apply_fx( Word32 spectrum[], - Word16 startLine, - Word16 stopLine, - const Word16 *A, - Word16 Q_A, - Word16 curr_order ); +Word16 ITF_Detect_fx( + Word32 const pSpectrum[], + const Word16 startLine, + const Word16 stopLine, + const Word16 maxOrder, + Word16 *A, + Word16 *Q_A, + Word16 *predictionGain, + Word16 *curr_order, + Word16 Q ); + +Word16 ITF_Detect_ivas_fx( + Word32 const pSpectrum[], + const Word16 startLine, + const Word16 stopLine, + const Word16 maxOrder, + Word16 *A, + Word16 *Q_A, + Word16 *predictionGain, + Word16 *curr_order, + Word16 Q ); + +void ITF_Apply_fx( + Word32 spectrum[], + Word16 startLine, + Word16 stopLine, + const Word16 *A, + Word16 Q_A, + Word16 curr_order ); void const *GetTnsFilterCoeff( void const *p, const Word16 index, Word16 *pValue ); @@ -3777,20 +3743,11 @@ void const *GetTnsEnabledSingleFilter( void const *p, const Word16 index, Word16 void *SetTnsEnabledSingleFilter( void *p, const Word16 index, const Word16 value ); -void const *GetTnsOnWhite( void const *p, const int16_t index, int16_t *pValue ); -void *SetTnsOnWhite( void *p, const int16_t index, const int16_t value ); +void const *GetTnsOnWhite( void const *p, const Word16 index, Word16 *pValue ); +void *SetTnsOnWhite( void *p, const Word16 index, const Word16 value ); -/*tns_base.h*/ -/** Reset TNS data. - * Resets TNS data to the initial state. - * @param pTnsData pointer to a TNS data to be reset. - */ void ResetTnsData( STnsData *pTnsData ); -/** Clear TNS filter data. - * Resets TNS filter order and all coefficients to 0. - * @param pTnsFilter pointer to a TNS filter to be cleared. - */ void ClearTnsFilterCoefficients( STnsFilter *pTnsFilter ); /*========================================================================================================/ @@ -3798,7 +3755,7 @@ gp_clips_fx.c /========================================================================================================*/ void init_gp_clip_fx( - Word16 mem[] /* o : memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ + Word16 mem[] /* o : memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ ); Word16 gp_clip_fx( @@ -3821,10 +3778,10 @@ void gp_clip_test_isf_fx( ); void gp_clip_test_gain_pit_fx( - const Word16 element_mode, /* i : element mode Q0*/ - const Word32 core_brate, /* i : core bitrate Q0*/ - const Word16 gain_pit, /* i : gain of quantized pitch Q14*/ - Word16 mem[] /* i/o: memory of gain of pitch clipping algorithm 1Q14*/ + const Word16 element_mode, /* i : element mode Q0*/ + const Word32 core_brate, /* i : core bitrate Q0*/ + const Word16 gain_pit, /* i : gain of quantized pitch Q14*/ + Word16 mem[] /* i/o: memory of gain of pitch clipping algorithm 1Q14*/ ); Word16 Mode2_gp_clip_fx( @@ -3844,10 +3801,10 @@ Word16 Mode2_gp_clip_fx( ); void gp_clip_test_lsf_fx( - const Word16 element_mode, /* i : element mode Q0*/ - const Word16 lsf[], /* i : lsf values (in frequency domain) 14Q1*1.28*/ - Word16 mem[], /* i/o: memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ - const Word16 m /* i : dimension of lsf Q0*/ + const Word16 element_mode, /* i : element mode Q0*/ + const Word16 lsf[], /* i : lsf values (in frequency domain) 14Q1*1.28*/ + Word16 mem[], /* i/o: memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ + const Word16 m /* i : dimension of lsf Q0*/ ); void gp_clip_test_lsf_ivas_fx( @@ -3883,10 +3840,6 @@ void nelp_encoder_ivas_fx( Word16 *qIn1, Word16 reduce_gains ); -/*========================================================================================================/ -swb_bwe_enc_lr_fx.c -/========================================================================================================*/ - void swb_bwe_enc_lr_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ const Word32 L_m_core[], /* i : lowband synthesis */ @@ -3937,10 +3890,6 @@ void swb_bwe_enc_lr_ivas_fx( Word16 *ni_seed_fx /* i/o: random seed for search buffer NI */ ); -/*========================================================================================================/ -isf_enc_amr_wb_fx.c -/========================================================================================================*/ - void isf_enc_amr_wb_fx( Encoder_State *st, /* i/o: state structure */ Word16 *isf_new, /* i/o: quantized ISF vector */ @@ -3948,20 +3897,12 @@ void isf_enc_amr_wb_fx( Word16 *Aq /* o : quantized A(z) for 4 subframes */ ); -/*========================================================================================================/ -detect_transient_fx.c -/========================================================================================================*/ - Word16 detect_transient_fx( const Word16 *in_fx, /*Q_new */ const Word16 L, /*Q0*/ Word16 Q_new, Encoder_State *st_fx ); -/*========================================================================================================/ -codec_tcx_common.c -/========================================================================================================*/ - Word16 tcxGetNoiseFillingTilt( const Word16 A[], const Word16 lpcorder, @@ -3999,7 +3940,6 @@ void tcxInvertWindowGrouping( const Word16 frame_cnt, const Word16 bfi ); -// mslvq_com void permute_fx( Word16 *pTmp1, /* i/o: vector whose components are to be permuted */ const Word16 *perm /* i : permutation info (indexes that should be interchanged), max two perms */ @@ -4047,15 +3987,12 @@ Word16 deindex_lvq_cng_ivas_fx( Word16 no_bits /* i: number of bits for lattice */ ); -// lsp_convert_poly_fx.c Word16 lsp_convert_poly_fx( Word16 w[], /* i/o: LSP or ISP parameters */ const Word16 L_frame, /* i : flag for up or down conversion */ const Word16 Opt_AMRWB /* i : flag for the AMR-WB IO mode */ ); - -// cng_exe.c void CNG_exc_fx( const Word32 core_brate, /* i : core bitrate */ const Word16 L_frame, /* i : length of the frame */ @@ -4124,45 +4061,36 @@ void cng_params_upd_fx( ); void cng_params_upd_ivas_fx( - const Word16 lsp_new[], /* i : LSP aprameters Q15 */ - const Word16 exc2[], /* i : current enhanced excitation Q_exc */ - const Word16 L_frame, /* i : frame length Q0 */ - Word16 *ho_circ_ptr, /* i/o: pointer for CNG averaging buffers Q0 */ - Word32 ho_ener_circ[], /* o : energy buffer for CNG averaging Q6 */ - Word16 *ho_circ_size, /* i/o: size of DTX hangover history buffer for averaging Q0 */ - Word16 ho_lsp_circ[], /* o : old LSP buffer for CNG averaging Q15 */ - const Word16 Q_exc, /* i : Q value of excitation */ - const Word16 enc_dec_flag, /* i : Flag indicating encoder or decoder (ENC,DEC) */ - Word32 ho_env_circ[], /* i/o: Envelope buffer */ - Word16 *cng_buf_cnt, /* i/o: Counter of postponed FFT-processing instances */ - Word16 cng_exc2_buf[], /* i/o: Excitation buffer Q_exc */ - Word16 cng_Qexc_buf[], /* i/o: Q_exc buffer Q0 */ - Word32 cng_brate_buf[], /* i/o: last_active_brate buffer Q0 */ - const Word32 last_active_brate /* i : Last active bit rate Q0 */ - , - const Word16 element_mode, /* i : Element mode */ - const Word16 bwidth /* i : Audio bandwidth */ -); -int16_t get_cng_mode( - const int32_t last_active_brate /* i : last active bitrate */ + const Word16 lsp_new[], /* i : LSP aprameters Q15 */ + const Word16 exc2[], /* i : current enhanced excitation Q_exc */ + const Word16 L_frame, /* i : frame length Q0 */ + Word16 *ho_circ_ptr, /* i/o: pointer for CNG averaging buffers Q0 */ + Word32 ho_ener_circ[], /* o : energy buffer for CNG averaging Q6 */ + Word16 *ho_circ_size, /* i/o: size of DTX hangover history buffer for averaging Q0 */ + Word16 ho_lsp_circ[], /* o : old LSP buffer for CNG averaging Q15 */ + const Word16 Q_exc, /* i : Q value of excitation */ + const Word16 enc_dec_flag, /* i : Flag indicating encoder or decoder (ENC,DEC) */ + Word32 ho_env_circ[], /* i/o: Envelope buffer */ + Word16 *cng_buf_cnt, /* i/o: Counter of postponed FFT-processing instances */ + Word16 cng_exc2_buf[], /* i/o: Excitation buffer Q_exc */ + Word16 cng_Qexc_buf[], /* i/o: Q_exc buffer Q0 */ + Word32 cng_brate_buf[], /* i/o: last_active_brate buffer Q0 */ + const Word32 last_active_brate, /* i : Last active bit rate Q0 */ + const Word16 element_mode, /* i : Element mode */ + const Word16 bwidth /* i : Audio bandwidth */ +); + +Word16 get_cng_mode( + const Word32 last_active_brate /* i : last active bitrate */ ); -// core_com_config.c /*! r: codec mode */ Word16 get_codec_mode( const Word32 total_brate /* i : total bitrate */ ); Word16 getTcxonly( -#ifdef IVAS_CODE_SWITCHING - const Word16 element_mode, /* i : IVAS element mode */ -#endif const Word32 total_brate /* i : total bitrate */ -#ifdef IVAS_CODE_SWITCHING - , - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ - const int16_t is_ism_format /* i : flag indicating ISM format */ -#endif ); Word16 getTcxonly_fx( @@ -4171,13 +4099,13 @@ Word16 getTcxonly_fx( const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ const Word16 is_ism_format /* i : flag indicating ISM format */ ); + Word16 getCtxHm( const Word16 element_mode, /* i : IVAS element mode */ const Word32 total_brate, /* i : total bitrate */ const Word16 rf_flag /* i : flag to signal the RF mode */ ); - Word16 getResq( const Word32 total_brate /* i : total bitrate */ ); @@ -4210,7 +4138,8 @@ Word32 getCoreSamplerateMode2( const IVAS_FORMAT is_ism_format /* i : flag indicating ISM format */ ); -Word16 getTcxBandwidth( const Word16 bandwidth ); +Word16 getTcxBandwidth( + const Word16 bandwidth ); Word16 getIgfPresent_fx( const Word16 element_mode, /* i : IVAS element mode */ @@ -4238,7 +4167,8 @@ Word16 initPitchLagParameters( Word16 *pit_fr2, Word16 *pit_max ); -Word16 getNumTcxCodedLines( const Word16 bwidth ); +Word16 getNumTcxCodedLines( + const Word16 bwidth ); Word16 getTcxLpcShapedAri( const Word32 total_brate, /* i : total bitrate */ @@ -4246,7 +4176,6 @@ Word16 getTcxLpcShapedAri( const Word16 element_mode /* i : IVAS element mode */ ); -// tcx_mdct_window.c void mdct_window_sine( PWord16 *window, /* Qx */ Word16 n /* Q0 */ @@ -4267,11 +4196,11 @@ void mdct_window_aldo( Word16 n /* Q0 */ ); -// tcx_utils.c -Word16 getInvFrameLen( const Word16 L_frame ); /* returns 1/L_frame in Q21 format */ +Word16 getInvFrameLen( + const Word16 L_frame ); /* returns 1/L_frame in Q21 format */ void tcx_get_windows( - TCX_CONFIG_HANDLE hTcxCfg, /* i : TCX configuration */ + TCX_CONFIG_HANDLE hTcxCfg, /* i : TCX configuration */ const Word16 left_mode, /* i: overlap mode of left window half */ const Word16 right_mode, /* i: overlap mode of right window half */ Word16 *left_overlap, /* o: left overlap length */ @@ -4288,7 +4217,7 @@ void WindowSignal( Word16 right_overlap_mode, /* i : overlap mode of right window half */ Word16 *left_overlap_length, /* o : TCX window left overlap length */ Word16 *right_overlap_length, /* o : TCX window right overlap length */ - const Word16 in[], /* i : i signal */ + const Word16 in[], /* i : i signal */ Word16 *L_frame, /* i/o: frame length */ Word16 out[], /* o : output windowed signal */ const Word16 truncate_aldo, /* i : nonzero to truncate long ALDO slope */ @@ -4339,12 +4268,12 @@ void lpc2mdct( void lpc2mdct_2( Word16 *lpcCoeffs, - const int16_t lpcOrder, + const Word16 lpcOrder, Word16 mdct_gains_fx[], Word16 mdct_gains_e[], Word16 mdct_inv_gains_fx[], Word16 mdct_inv_gains_e[], - const int16_t length ); + const Word16 length ); void mdct_shaping( Word32 x[], @@ -4374,12 +4303,20 @@ void mdct_noiseShaping_interp( Word16 gains[], Word16 gains_exp[] ); -void PsychAdaptLowFreqDeemph( Word32 x[], - const Word16 lpcGains[], - const Word16 lpcGains_e[], - Word16 lf_deemph_factors[] ); +void PsychAdaptLowFreqDeemph( + Word32 x[], + const Word16 lpcGains[], + const Word16 lpcGains_e[], + Word16 lf_deemph_factors[] ); -void AdaptLowFreqDeemph( Word32 x[], Word16 x_e, Word16 tcx_lpc_shaped_ari, Word16 lpcGains[], Word16 lpcGains_e[], const Word16 lg, Word16 lf_deemph_factors[] ); +void AdaptLowFreqDeemph( + Word32 x[], + Word16 x_e, + Word16 tcx_lpc_shaped_ari, + Word16 lpcGains[], + Word16 lpcGains_e[], + const Word16 lg, + Word16 lf_deemph_factors[] ); void tcx_noise_filling( Word32 *Q, @@ -4427,28 +4364,25 @@ void InitTnsConfigs_ivas_fx( const Word16 element_mode, const Word16 is_mct ); -#define IVAS_CODE_TCX_UTIL -#ifdef IVAS_CODE_TCX_UTIL void SetAllowTnsOnWhite( STnsConfig tnsConfig[2][2], const Word8 allowTnsOnWhite ); -#endif -#undef IVAS_CODE_TCX_UTIL void SetTnsConfig( TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ const Word16 isTCX20, const Word16 isAfterACELP ); -void tcx_get_gain( Word32 *x, /* i: spectrum 1 */ - Word16 x_e, /* i: spectrum 1 exponent */ - Word32 *y, /* i: spectrum 2 */ - Word16 y_e, /* i: spectrum 2 exponent */ - Word16 n, /* i: length */ - Word16 *gain, /* o: gain */ - Word16 *gain_e, /* o: gain exponent */ - Word32 *en_y, /* o: energy of y (optional) */ - Word16 *en_y_e /* o: energy of y exponent (optional) */ +void tcx_get_gain( + Word32 *x, /* i: spectrum 1 */ + Word16 x_e, /* i: spectrum 1 exponent */ + Word32 *y, /* i: spectrum 2 */ + Word16 y_e, /* i: spectrum 2 exponent */ + Word16 n, /* i: length */ + Word16 *gain, /* o: gain */ + Word16 *gain_e, /* o: gain exponent */ + Word32 *en_y, /* o: energy of y (optional) */ + Word16 *en_y_e /* o: energy of y exponent (optional) */ ); void init_TCX_config( @@ -4458,11 +4392,9 @@ void init_TCX_config( Word16 L_frameTCX, Word16 fscaleFB ); -// tec_com.c void resetTecDec_Fx( TEC_DEC_HANDLE hTecDec ); - void resetTecEnc_Fx( TEC_ENC_HANDLE hTECEnc, Word16 flag ); @@ -4513,9 +4445,11 @@ void tecEnc_TBE_fx( const Word16 *voicing, const Word16 coder_type ); -void set_TEC_TFA_code_fx( const Word16 corrFlag, Word16 *tec_flag, Word16 *tfa_flag ); +void set_TEC_TFA_code_fx( + const Word16 corrFlag, + Word16 *tec_flag, + Word16 *tfa_flag ); -// tcx_mdct_fx.c void TCX_MDCT( const Word16 *x, /* Qx */ Word32 *y, /* exp(y_e) */ @@ -4565,12 +4499,10 @@ void TCX_MDXT_Inverse_fx( const UWord16 kernel_type /* Q0 */ ); -// edct_fx.c -#define EDCT_FACTOR_SCALE 2 void edct_fx( const Word32 *x, /* i : i signal Qq */ - Word32 *y, /* o : output transform Qq */ - Word16 length, /* i : length */ + Word32 *y, /* o : output transform Qq */ + Word16 length, /* i : length */ Word16 *q /* i : Q value of i signal */ ); @@ -4583,23 +4515,23 @@ void edct_ivas_fx( void edst_fx( const Word32 *x, /* i : i signal Qq */ - Word32 *y, /* o : output transform Qq */ - Word16 length, /* i : length */ + Word32 *y, /* o : output transform Qq */ + Word16 length, /* i : length */ Word16 *q /* i : Q value of i signal */ ); void edct_16fx( const Word16 *x, /* i : i signal Qx */ Word16 *y, /* o : output transform Qx */ - Word16 length, /* i : length */ - Word16 bh, /* bit-headroom */ + Word16 length, /* i : length */ + Word16 bh, /* bit-headroom */ const Word16 element_mode ); void iedct_short_fx( const Word32 *in, /* i : i vector */ Word16 *Q, /* i/o: Q value of i */ - Word32 *out, /* o : output vector */ - const Word16 segment_length /* i : length */ + Word32 *out, /* o : output vector */ + const Word16 segment_length /* i : length */ ); void edxt_fx( @@ -4610,12 +4542,10 @@ void edxt_fx( const UWord16 synthesis /* i : nonzero for inverse */ ); -// fft_evs.c void fft16( Word32 *re, Word32 *im, Word16 s, Word16 bScale ); void BASOP_cfft( cmplx *pComplexBuf, Word16 sizeOfFft, Word16 *scale, Word32 workBuffer[2 * BASOP_CFFT_MAX_LENGTH] ); void BASOP_rfft( Word32 *x, Word16 sizeOfFft, Word16 *scale, Word16 isign ); -// fft_fx_evs.c void DoRTFTn_fx( Word32 *x, /* i/o : real part of i and output data */ Word32 *y, /* i/o : imaginary part of i and output data */ @@ -4694,7 +4624,7 @@ void DoRTFTn_fx_ivas( ); -Word16 find_guarded_bits_fx( Word32 n ); +Word16 find_guarded_bits_fx( const Word32 n ); Word16 L_norm_arr( const Word32 *arr, Word16 size ); Word16 norm_arr( Word16 *arr, Word16 size ); @@ -4704,6 +4634,7 @@ Word16 get_min_scalefactor( Word32 x, Word32 y ); Flag is_zero_arr( Word32 *arr, Word16 size ); Flag is_zero_arr16( Word16 *arr, Word16 size ); +Flag is_zero_arr64( Word64 *arr, Word16 size ); void edct2_fx_ivas( const Word16 n, @@ -4721,6 +4652,7 @@ void edct2_fx( Word16 *q, const Word16 *ip, const Word16 *w ); + void DoRTFT160_16fx( Word16 x[], /* i/o : real part of i and output data */ Word16 y[] /* i/o : imaginary part of i and output data */ @@ -4730,12 +4662,21 @@ void DoRTFT320_16fx( Word16 *x, /* i/o : real part of i and output data */ Word16 *y /* i/o : imaginary part of i and output data */ ); + void DoRTFT128_16fx( Word16 *x, /* i/o : real part of i and output data Q(Qx+Q_edct)*/ Word16 *y /* i/o : imaginary part of i and output data Q(Qx+Q_edct)*/ ); -void fft3_fx( const Word16[], Word16[], const Word16 ); -void ifft3_fx( const Word16[], Word16[], const Word16 ); + +void fft3_fx( + const Word16[], + Word16[], + const Word16 ); + +void ifft3_fx( + const Word16[], + Word16[], + const Word16 ); void fft3_fx_ivas( const Word32 X[], @@ -4746,7 +4687,6 @@ void ifft3_fx_ivas( Word32 Y[], const Word16 n ); -// fft_rel_fx.c void r_fft_fx_lc( const Word16 *phs_tbl, /* i : Table of phase */ const Word16 SIZE, /* i : Size of the FFT */ @@ -4757,7 +4697,6 @@ void r_fft_fx_lc( const Word16 isign /* i : 1=fft, otherwize it's ifft */ ); -// cldfb_evs void cldfbAnalysis_fx( HANDLE_CLDFB_FILTER_BANK anaCldfb, /*!< Handle of Cldfb Analysis Bank */ Word32 **cldfbReal, /*!< Pointer to real subband slots */ @@ -4780,28 +4719,30 @@ void cldfbSynthesis_fx( Word32 *pWorkBuffer /*!< pointer to temporal working buffer */ ); -void configureCldfb( HANDLE_CLDFB_FILTER_BANK h_cldfb, /*!< CLDFB Handle */ - const Word16 no_channels, /*!< Number of critically sampled bands */ - const Word16 frameSize /*!< FrameSize */ +void configureCldfb( + HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: Returns handle */ + const Word32 sampling_rate /* i : sampling rate */ ); -ivas_error openCldfb( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /*!< CLDFB Handle */ - const Word16 type, /*!< analysis or synthesis */ - const Word16 maxCldfbBands, /*!< number of cldfb bands */ - const Word16 frameSize /*!< FrameSize */ +ivas_error openCldfb( + HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: Returns handle */ + const Word16 type, /* i : analysis or synthesis */ + const Word32 sampling_rate /* i : sampling rate */ ); + void resampleCldfb( HANDLE_CLDFB_FILTER_BANK hs, /*!< CLDFB Handle */ - const Word16 newCldfbBands, /*!< number of cldfb bands */ + const Word32 sampling_rate, /* i : sampling rate */ const Word16 frameSize, /*!< FrameSize */ const Word8 firstFrame ); -Word16 -AnalysisPostSpectrumScaling_Fx( HANDLE_CLDFB_FILTER_BANK cldfbBank, - Word32 **rSubband32, - Word32 **iSubband32, - Word16 **rSubband16, - Word16 **iSubband16, - Word16 *cldfbScale ); + +Word16 AnalysisPostSpectrumScaling_Fx( + HANDLE_CLDFB_FILTER_BANK cldfbBank, + Word32 **rSubband32, + Word32 **iSubband32, + Word16 **rSubband16, + Word16 **iSubband16, + Word16 *cldfbScale ); void analysisCldfbEncoder_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ @@ -4814,30 +4755,33 @@ void analysisCldfbEncoder_fx( Word16 *enerBuffSum_exp, CLDFB_SCALE_FACTOR *scale ); -void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q31 | pointer to the result in the core look-ahead slot */ - Word16 *sf_energyLookahead, /*!< o: pointer to the scalefactor of the result in the core look-ahead slot - apply as negative exponent*/ - const Word16 numLookahead, /*!< i: Q0 the number of look-ahead time-slots */ - Word16 **realValues, /*!< i: Q15 | the real part of the CLDFB subsamples */ - Word16 **imagValues, /*!< i: Q15 | the imaginary part of the CLDFB subsamples */ - Word16 sf_Values, /*!< i: scalefactor of the CLDFB subcamples - apply as a negated Exponent */ - Word16 numberBands, /*!< i: Q0 | number of CLDFB bands */ - Word16 numberCols, /*!< i: Q0 | number of CLDFB subsamples */ - Word32 *energyHF, /*!< o: Q31 | pointer to HF energy */ - Word16 *energyHF_Exp, /*!< o: pointer to exponent of HF energy */ - Word32 *energyValuesSum, /*!< o: Q31 | pointer to sum array of energy values, not initialized*/ - Word16 *energyValuesSum_Exp, /*!< o: pointer to exponents of energyValuesSum, not initialized */ - TEC_ENC_HANDLE hTECEnc ); - -Word16 -CLDFB_getNumChannels( Word32 sampleRate ); - -void deleteCldfb( HANDLE_CLDFB_FILTER_BANK *h_cldfb ); /*!< CLDFB Handle */ - -ivas_error cldfb_save_memory( HANDLE_CLDFB_FILTER_BANK hs ); /* i/o: cldfb handle */ -void cldfb_restore_memory( HANDLE_CLDFB_FILTER_BANK hs ); /* i/o: cldfb handle */ -void cldfb_reset_memory( HANDLE_CLDFB_FILTER_BANK hs ); /* i/o: cldfb handle */ - -// bits_alloc.c from IVAS +void GetEnergyCldfb( + Word32 *energyLookahead, /*!< o: Q31 | pointer to the result in the core look-ahead slot */ + Word16 *sf_energyLookahead, /*!< o: pointer to the scalefactor of the result in the core look-ahead slot - apply as negative exponent*/ + const Word16 numLookahead, /*!< i: Q0 the number of look-ahead time-slots */ + Word16 **realValues, /*!< i: Q15 | the real part of the CLDFB subsamples */ + Word16 **imagValues, /*!< i: Q15 | the imaginary part of the CLDFB subsamples */ + Word16 sf_Values, /*!< i: scalefactor of the CLDFB subcamples - apply as a negated Exponent */ + Word16 numberBands, /*!< i: Q0 | number of CLDFB bands */ + Word16 numberCols, /*!< i: Q0 | number of CLDFB subsamples */ + Word32 *energyHF, /*!< o: Q31 | pointer to HF energy */ + Word16 *energyHF_Exp, /*!< o: pointer to exponent of HF energy */ + Word32 *energyValuesSum, /*!< o: Q31 | pointer to sum array of energy values, not initialized*/ + Word16 *energyValuesSum_Exp, /*!< o: pointer to exponents of energyValuesSum, not initialized */ + TEC_ENC_HANDLE hTECEnc ); + +void deleteCldfb( + HANDLE_CLDFB_FILTER_BANK *h_cldfb ); /*!< CLDFB Handle */ + +ivas_error cldfb_save_memory( + HANDLE_CLDFB_FILTER_BANK hs ); /* i/o: cldfb handle */ + +void cldfb_restore_memory( + HANDLE_CLDFB_FILTER_BANK hs ); /* i/o: cldfb handle */ + +void cldfb_reset_memory( + HANDLE_CLDFB_FILTER_BANK hs ); /* i/o: cldfb handle */ + void BITS_ALLOC_init_config_acelp( const Word32 bit_rate, const Word16 narrowBand, @@ -4852,36 +4796,6 @@ Word16 BITS_ALLOC_config_acelp( const Word16 narrowband, const Word16 nb_subfr ); -ivas_error config_acelp1( - const Word16 enc_dec, /* i : encoder/decoder flag */ - const Word32 total_brate, /* i : total bitrate */ - const Word32 core_brate_inp, /* i : core bitrate */ - const Word16 core, /* i : core */ - const Word16 extl, /* i : extension layer */ - const Word32 extl_brate, /* i : extension layer bitrate */ - const Word16 L_frame, /* i : frame length at internal Fs */ - const Word16 GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ - ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ - const Word16 signalling_bits, /* i : number of signalling bits */ - const Word16 coder_type, /* i : coder type */ -#ifdef NONBE_FIX_GSC_BSTR - const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ -#endif - const Word16 tc_subfr, /* i : TC subfr ID */ - const Word16 tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ - Word16 *nBits_es_Pred, /* o : number of bits for Es_pred Q */ - Word16 *unbits, /* o : number of unused bits */ - const Word16 element_mode, /* i : element mode */ - Word16 *uc_two_stage_flag, /* o : flag undicating two-stage UC */ - const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ - const Word16 idchan, /* i : stereo channel ID */ - const Word16 active_cnt, /* i : Active frame counter */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/ - const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ -); - Word16 set_ACELP_flag( const Word16 element_mode, /* i : element mode */ const Word32 element_brate, /* i : element bitrate */ @@ -4891,7 +4805,7 @@ Word16 set_ACELP_flag( const Word16 bwidth, /* i : audio bandwidth */ const Word16 cng_type /* i : CNG type */ ); -// syn_128_fx.c + void syn_12k8_fx( Word16 L_frame, const Word16 *Aq, /* i : LP filter coefficients Q12 */ @@ -4903,14 +4817,15 @@ void syn_12k8_fx( const Word16 Q_exc, /* i : Excitation scaling Q0 */ const Word16 Q_syn /* i : Synthesis scaling Q0 */ ); -// est_tilt_fx.c -Word16 est_tilt_fx( /* o : tilt of the code Q15 */ - const Word16 *exc, /* i : adaptive excitation vector Qx */ - const Word16 gain_pit, /* i : adaptive gain Q14 */ - const Word16 *code, /* i : algebraic exctitation vector Q9 */ - const Word32 gain_code, /* i : algebraic code gain Q16 */ - Word16 *voice_fac, /* o : voicing factor Q15 */ - const Word16 Q_exc /* i : Scaling factor of excitation Q0 */ + +/* o : tilt of the code Q15 */ +Word16 est_tilt_fx( + const Word16 *exc, /* i : adaptive excitation vector Qx */ + const Word16 gain_pit, /* i : adaptive gain Q14 */ + const Word16 *code, /* i : algebraic exctitation vector Q9 */ + const Word32 gain_code, /* i : algebraic code gain Q16 */ + Word16 *voice_fac, /* o : voicing factor Q15 */ + const Word16 Q_exc /* i : Scaling factor of excitation Q0 */ ); /* o : tilt of the code Q15 */ @@ -4925,29 +4840,30 @@ Word16 est_tilt_ivas_fx( const Word16 flag_tilt /* i : flag for special tilt */ ); -Word16 Est_tilt2( /* o : tilt of the code */ - const Word16 *exc, /* i : adaptive excitation vector Qx */ - const Word16 gain_pit, /* i : adaptive gain Q14 */ - const Word16 *code, /* i : algebraic exctitation vector Q9 */ - const Word32 gain_code, /* i : algebraic code gain Q16 */ - Word16 *voice_fac, /* o : voicing factor Q15 */ - const Word16 Q_exc /* i : Scaling factor of excitation Q0 */ +/* o : tilt of the code */ +Word16 Est_tilt2( + const Word16 *exc, /* i : adaptive excitation vector Qx */ + const Word16 gain_pit, /* i : adaptive gain Q14 */ + const Word16 *code, /* i : algebraic exctitation vector Q9 */ + const Word32 gain_code, /* i : algebraic code gain Q16 */ + Word16 *voice_fac, /* o : voicing factor Q15 */ + const Word16 Q_exc /* i : Scaling factor of excitation Q0 */ ); -void E_UTIL_voice_factor( Word16 *exc, /* i : pointer to the excitation frame Q_new */ - Word16 i_subfr, /* i : subframe index */ - Word16 *code, /* i : innovative codebook Q9 */ - Word16 gain_pit, /* i : adaptive codebook gain 1Q14 */ - Word32 gain_code, /* i : innovative cb. gain 15Q16 */ - Word16 *voice_fac, /* o : subframe voicing estimation Q15 */ - Word16 *tilt_code, /* o : tilt factor Q15 */ - Word16 L_subfr, /* i : subframe length */ - Word16 flag_tilt, /* i : Flag for triggering new voice factor tilt*/ - Word16 Q_new, /* i : excitation buffer format */ - Word16 shift /* i : scaling to get 12bit */ +void E_UTIL_voice_factor( + Word16 *exc, /* i : pointer to the excitation frame Q_new */ + Word16 i_subfr, /* i : subframe index */ + Word16 *code, /* i : innovative codebook Q9 */ + Word16 gain_pit, /* i : adaptive codebook gain 1Q14 */ + Word32 gain_code, /* i : innovative cb. gain 15Q16 */ + Word16 *voice_fac, /* o : subframe voicing estimation Q15 */ + Word16 *tilt_code, /* o : tilt factor Q15 */ + Word16 L_subfr, /* i : subframe length */ + Word16 flag_tilt, /* i : Flag for triggering new voice factor tilt*/ + Word16 Q_new, /* i : excitation buffer format */ + Word16 shift /* i : scaling to get 12bit */ ); -// window_ola_fx.c void sinq_fx( const Word16 tmp, /* i : sinus factor cos(tmp*i+phi) Q15*/ const Word16 phi, /* i : sinus phase cos(tmp*i+phi) Q15*/ @@ -4990,7 +4906,6 @@ void window_ola_ext_fx( const UWord16 kernel_type /* i : transform kernel type */ ); -// cb_shape_fx.c void cb_shape_fx( const Word16 preemphFlag, /* i : flag for pre-emphasis */ const Word16 pitchFlag, /* i : flag for pitch sharpening */ @@ -5007,27 +4922,26 @@ void cb_shape_fx( const Word16 L_subfr /* i : subframe lenght */ ); -// longarith.c void longadd( - uint16_t a[], /* i/o: vector of the length lena */ - const uint16_t b[], /* i/o: vector of the length lenb */ - const int16_t lena, /* i/o: length of vector a[] */ - const int16_t lenb /* i/o: length of vector b[] */ + UWord16 a[], /* i/o: vector of the length lena */ + const UWord16 b[], /* i/o: vector of the length lenb */ + const Word16 lena, /* i/o: length of vector a[] */ + const Word16 lenb /* i/o: length of vector b[] */ ); void longshiftright( - uint16_t a[], /* i : vector of the length lena */ - const int16_t b, /* i : number of bit positions to shift right */ - uint16_t d[], /* o : vector of the length lend */ - int16_t lena, /* i : length of vector a[] */ - const int16_t lend /* i : length of vector d[] */ + UWord16 a[], /* i : vector of the length lena */ + const Word16 b, /* i : number of bit positions to shift right */ + UWord16 d[], /* o : vector of the length lend */ + Word16 lena, /* i : length of vector a[] */ + const Word16 lend /* i : length of vector d[] */ ); void longshiftleft( - const uint16_t a[], /* i : vector of the length len */ - const int16_t b, /* i : number of bit positions to shift left */ - uint16_t d[], /* o : vector of the length len */ - const int16_t len /* i : length of vector a[] and d[] */ + const UWord16 a[], /* i : vector of the length len */ + const Word16 b, /* i : number of bit positions to shift left */ + UWord16 d[], /* o : vector of the length len */ + const Word16 len /* i : length of vector a[] and d[] */ ); void longshr( @@ -5035,7 +4949,6 @@ void longshr( Word16 bits, Word16 len ); -// gs_bitallocation.c void bands_and_bit_alloc_fx( const Word16 cor_strong_limit, /* i : HF correlation */ const Word16 noise_lev, /* i : dwn scaling factor */ @@ -5048,17 +4961,16 @@ void bands_and_bit_alloc_fx( Word16 *out_bits_per_bands, /* i/o: Number of bit allowed per allowed subband Q3 */ Word16 *nb_subbands, /* o : Number of subband allowed */ const Word16 *exc_diff, /* i : Difference signal to quantize (encoder side only) */ - Word16 *concat_in, /* o : Concatened PVQ's i vector (encoder side only) */ + Word16 *concat_in, /* o : Concatened PVQ's i vector (encoder side only) */ Word16 *pvq_len, /* o : Number of bin covered with the PVQ */ const Word16 coder_type, /* i : coding type */ - const Word16 bwidth, /* i : i signal bandwidth */ + const Word16 bwidth, /* i : i signal bandwidth */ const Word16 GSC_noisy_speech, /* i : GSC noisy speech flag */ const Word16 L_frame, /* i : frame length */ const Word16 element_mode, /* i : element mode */ const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ ); -// low_rate_band_att_fx.c void fine_gain_pred_fx( const Word16 *sfm_start, /* i : Sub band start indices */ const Word16 *sfm_end, /* i : Sub band end indices */ @@ -5075,21 +4987,14 @@ void fine_gain_pred_fx( ); void fine_gain_quant_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const Word16 *ord, /* i : Indices for energy order Q0 */ const Word16 num_sfm, /* i : Number of bands Q0 */ const Word16 *gain_bits, /* i : Gain adjustment bits per sub band Q0 */ Word16 *fg_pred, /* i/o: Predicted gains / Corrected gains Q12 */ const Word16 *gopt /* i : Optimal gains Q12 */ ); -void fine_gain_quant_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 *ord, /* i : Indices for energy order Q0 */ - const Word16 num_sfm, /* i : Number of bands Q0 */ - const Word16 *gain_bits, /* i : Gain adjustment bits per sub band Q0 */ - Word16 *fg_pred, /* i/o: Predicted gains / Corrected gains i:Q12 / o:Q11 */ - const Word16 *gopt /* i : Optimal gains Q12 */ -); + void get_max_pulses_fx( const Word16 *band_start, /* i : Sub band start indices */ const Word16 *band_end, /* i : Sub band end indices */ @@ -5099,6 +5004,7 @@ void get_max_pulses_fx( Word16 *inp_vector, /* i/o: Encoded shape vectors (int)Q0*/ Word16 *maxpulse /* o : Maximum pulse height per band Q0*/ ); + void fine_gain_dec_fx( Decoder_State *st, const Word16 *ord, /* i : Indices for energy order */ @@ -5107,17 +5013,16 @@ void fine_gain_dec_fx( Word16 *fg_pred /* i/o: Predicted gains / Corrected gains Q12*/ ); -// fine_gain_bits_fx.c -Word16 assign_gain_bits_fx( /* o : Number of assigned gain bits */ - const Word16 core, /* i : HQ core */ - const Word16 BANDS, /* i : Number of bands */ - const Word16 *band_width, /* i : Sub band bandwidth */ - Word16 *Rk, /* i/o: Bit allocation/Adjusted bit alloc. Q3 */ - Word16 *gain_bits_array, /* o : Assigned gain bits */ - Word16 *Rcalc /* o : Bit budget for shape quantizer Q3 */ +/* o : Number of assigned gain bits */ +Word16 assign_gain_bits_fx( + const Word16 core, /* i : HQ core */ + const Word16 BANDS, /* i : Number of bands */ + const Word16 *band_width, /* i : Sub band bandwidth */ + Word16 *Rk, /* i/o: Bit allocation/Adjusted bit alloc. Q3 */ + Word16 *gain_bits_array, /* o : Assigned gain bits */ + Word16 *Rcalc /* o : Bit budget for shape quantizer Q3 */ ); -// gs_noisefill.c void freq_dnw_scaling_fx( const Word16 cor_strong_limit, /* i : HF correlation */ const Word16 coder_type, /* i : coder type */ @@ -5192,7 +5097,6 @@ void highband_exc_dct_in_ivas_fx( const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ ); -// lsf_dec_bfi_fx.c void lsf_dec_bfi( const Word16 codec_mode, /* i: : codec mode: MODE1 | MODE2 */ Word16 *lsf, /*!< o : 14Q1*1.28 quantized ISFs */ @@ -5216,18 +5120,22 @@ void lsf_dec_bfi( const short bwidth /* i: coded bandwidth */ ); -Word16 const *PlcGetLsfBase( Word16 const lpcQuantization, - Word16 const narrowBand, - Word32 const sr_core ); +Word16 const *PlcGetLsfBase( + Word16 const lpcQuantization, + Word16 const narrowBand, + Word32 const sr_core ); -// fd_cng_com.c /* Create an instance of type FD_CNG */ -ivas_error createFdCngCom_fx( HANDLE_FD_CNG_COM *hFdCngCom ); +ivas_error createFdCngCom_fx( + HANDLE_FD_CNG_COM *hFdCngCom ); -void initFdCngCom( HANDLE_FD_CNG_COM hFdCngCom, Word16 scale ); +void initFdCngCom( + HANDLE_FD_CNG_COM hFdCngCom, + Word16 scale ); /* Delete the instance of type FD_CNG */ -void deleteFdCngCom_fx( HANDLE_FD_CNG_COM *hFdCngCom ); +void deleteFdCngCom_fx( + HANDLE_FD_CNG_COM *hFdCngCom ); /* Initialize the spectral partitioning */ void initPartitions( @@ -5257,6 +5165,12 @@ void expand_range( Word16 *out_exp, const Word16 len ); +void expand_range_fx( + Word32 *in, // Q25 + Word32 *out, // exp:out_exp + Word16 *out_exp, + const Word16 len ); + void expand_range_var_exp( Word16 *in, Word16 in_exp, @@ -5264,27 +5178,28 @@ void expand_range_var_exp( Word16 *out_exp, const Word16 len ); -void minimum_statistics( Word16 len, /* i : Total number of partitions (CLDFB or FFT) */ - Word16 lenFFT, /* i : Number of FFT partitions */ - Word16 *psize, /* i : Partition sizes, fractional */ - Word16 *msPeriodog, /* i : Periodogram (energies) */ - Word16 *msNoiseFloor, /* i/o: Noise floors (energies) */ - Word16 *msNoiseEst, /* i/o: Noise estimates (energies) */ - Word32 *msAlpha, /* i/o: Forgetting factors */ - Word16 *msPsd, /* i/o: Power Spectral Density (smoothed periodogram => energies) */ - Word16 *msPsdFirstMoment, /* i/o: PSD statistics of 1st order (energy means) */ - Word32 *msPsdSecondMoment, /* i/o: PSD statistics of 2nd order (energy variances) */ - Word32 *msMinBuf, /* i/o: Buffer of minima (energies) */ - Word32 *msBminWin, /* o : Bias correction factors */ - Word32 *msBminSubWin, /* o : Bias correction factors */ - Word32 *msCurrentMin, /* i/o: Local minima (energies) */ - Word32 *msCurrentMinOut, /* i/o: Local minima (energies) */ - Word32 *msCurrentMinSubWindow, /* i/o: Local minima (energies) */ - Word16 *msLocalMinFlag, /* i : Binary flag */ - Word16 *msNewMinFlag, /* i : Binary flag */ - Word16 *msPeriodogBuf, /* i/o: Buffer of periodograms (energies) */ - Word16 *msPeriodogBufPtr, /* i/o: Counter */ - HANDLE_FD_CNG_COM st /* i/o: FD_CNG structure containing buffers and variables */ +void minimum_statistics( + Word16 len, /* i : Total number of partitions (CLDFB or FFT) */ + Word16 lenFFT, /* i : Number of FFT partitions */ + Word16 *psize, /* i : Partition sizes, fractional */ + Word16 *msPeriodog, /* i : Periodogram (energies) */ + Word16 *msNoiseFloor, /* i/o: Noise floors (energies) */ + Word16 *msNoiseEst, /* i/o: Noise estimates (energies) */ + Word32 *msAlpha, /* i/o: Forgetting factors */ + Word16 *msPsd, /* i/o: Power Spectral Density (smoothed periodogram => energies) */ + Word16 *msPsdFirstMoment, /* i/o: PSD statistics of 1st order (energy means) */ + Word32 *msPsdSecondMoment, /* i/o: PSD statistics of 2nd order (energy variances) */ + Word32 *msMinBuf, /* i/o: Buffer of minima (energies) */ + Word32 *msBminWin, /* o : Bias correction factors */ + Word32 *msBminSubWin, /* o : Bias correction factors */ + Word32 *msCurrentMin, /* i/o: Local minima (energies) */ + Word32 *msCurrentMinOut, /* i/o: Local minima (energies) */ + Word32 *msCurrentMinSubWindow, /* i/o: Local minima (energies) */ + Word16 *msLocalMinFlag, /* i : Binary flag */ + Word16 *msNewMinFlag, /* i : Binary flag */ + Word16 *msPeriodogBuf, /* i/o: Buffer of periodograms (energies) */ + Word16 *msPeriodogBufPtr, /* i/o: Counter */ + HANDLE_FD_CNG_COM st /* i/o: FD_CNG structure containing buffers and variables */ ); void minimum_statistics_fx( @@ -5292,8 +5207,8 @@ void minimum_statistics_fx( Word16 lenFFT, /* i : Number of FFT partitions */ Word16 *psize, /* i : Partition sizes, fractional */ Word16 *msPeriodog, /* i : Periodogram (energies) */ - Word16 *msNoiseFloor, /* i/o: Noise floors (energies) */ - Word16 *msNoiseEst, /* i/o: Noise estimates (energies) */ + Word32 *msNoiseFloor, /* i/o: Noise floors (energies) Q25*/ + Word32 *msNoiseEst, /* i/o: Noise estimates (energies) Q25*/ Word32 *msAlpha, /* i/o: Forgetting factors */ Word16 *msPsd, /* i/o: Power Spectral Density (smoothed periodogram => energies) */ Word16 *msPsdFirstMoment, /* i/o: PSD statistics of 1st order (energy means) */ @@ -5358,6 +5273,7 @@ void scalebands( const Word16 nband, /* i : Number of bands */ Word32 *bandpow, /* o : Power for each band */ const Word16 flag_fft_en ); + void scalebands_fx( const Word32 *partpow, /* i : Power for each partition */ Word16 *part, /* i : Partition upper boundaries (band indices starting from 0) */ @@ -5414,11 +5330,6 @@ void SynthesisSTFT_ivas_fx( const Word16 nchan_out /* i : number of output channels */ ); -void mhvals( - const Word16 d, - Word16 *m /*, float * h*/ -); - Word32 sign_l( const Word32 x /* i : input value of x */ ); @@ -5432,9 +5343,12 @@ void ivas_updt_dec_common_fx( ); /* Random generator with Gaussian distribution with mean 0 and std 1 */ -Word32 rand_gauss( Word16 *seed ); +Word32 rand_gauss( + Word16 *seed ); -Word16 rand_gauss_fix( Word16 *x, Word16 *seed ); +Word16 rand_gauss_fix( + Word16 *x, + Word16 *seed ); void lpc_from_spectrum( HANDLE_FD_CNG_COM hFdCngCom, @@ -5467,7 +5381,6 @@ void FdCng_exc( Word16 *bwe_exc /* o: LP excitation for BWE */ ); -// trans_direct void direct_transform_fx( const Word32 in32_fx[], Word32 out32_fx[], @@ -5476,7 +5389,6 @@ void direct_transform_fx( Word16 *Q, const Word16 element_mode ); -// trans_inv_fx.c void preecho_sb_fx( const Word32 brate, /* i Q0 : core bit-rate */ Word32 *wtda_audio_fx, /* i q_sig32 : imdct signal */ @@ -5505,15 +5417,13 @@ void Inverse_Transform( const Word16 element_mode /* i : IVAS element mode */ ); -// recovernorm void recovernorm_fx( - const Word16 *idxbuf, /* i : reordered quantization indices Q0*/ - Word16 *ynrm, /* o : recovered quantization indices Q0*/ - Word16 *normqlg2, /* o : recovered quantized norms Q0*/ - const Word16 nb_sfm /* i : number of SFMs Q0*/ + const Word16 *idxbuf, /* i : reordered quantization indices Q0*/ + Word16 *ynrm, /* o : recovered quantization indices Q0*/ + Word16 *normqlg2, /* o : recovered quantized norms Q0*/ + const Word16 nb_sfm /* i : number of SFMs Q0*/ ); -// tcq_poition_qeith.c Word32 ar_div( Word32 num, Word32 denum ); void ar_encoder_start_fx( PARCODEC arInst, TCQ_PBITSTREAM bsInst, const Word32 max_bits ); @@ -5570,11 +5480,17 @@ void decode_magnitude_usq_fx( ARCODEC *pardec, Word16 size, Word16 npulses, Word void decode_mangitude_tcq_fx( ARCODEC *pardec, Word16 size, Word16 npulses, Word16 nzpos, Word16 *positions, Word16 *out, Word32 *surplus_fx ); void decode_signs_fx( ARCODEC *pardec, Word16 size, Word16 *out ); -Word16 GetScale_fx( Word16 blen, Word32 bits_fx, Word32 *surplus_fx ); +Word16 GetScale_fx( + Word16 blen, + Word32 bits_fx, + Word32 *surplus_fx ); -void srt_vec_ind_fx( const Word32 *linear, Word32 *srt, Word16 *I, Word16 length ); +void srt_vec_ind_fx( + const Word32 *linear, + Word32 *srt, + Word16 *I, + Word16 length ); -// fill_spectrum void fill_spectrum_fx( Word16 *coeff, /* i/o: normalized MLT spectrum / nf spectrum Q12 */ Word32 *L_coeff_out, /* i/o: Noisefilled MLT spectrum Q12 */ @@ -5614,7 +5530,6 @@ void fill_spectrum_fx( const Word16 num_env_bands, const Word16 element_mode ); -// hq_bit_allocation_fx.c" void hq_bit_allocation_fx( const Word32 core_brate, /* i : Core bit-rate Q0 */ const Word16 length, /* i : Frame length Q0 */ @@ -5631,14 +5546,12 @@ void hq_bit_allocation_fx( const Word16 num_env_bands /* i : Number sub bands to be encoded for HQ_SWB_BWE Q0 */ ); -// weight_fx.c void map_quant_weight_fx( const Word16 normqlg2[], /* i : quantized norms Q0*/ Word16 wnorm[], /* o : weighted norm Q0*/ const Word16 is_transient /* i : transient flag Q0*/ ); -// bitalloc_fx.c void bitalloc_fx( Word16 *y, /* i : reordered norm of sub-vectors Q0 */ Word16 *idx, /* i : reordered sub-vector indices Q0 */ @@ -5649,6 +5562,7 @@ void bitalloc_fx( const Word16 *sfmsize, /* i : band length Q0 */ const Word16 hqswb_clas /* i : signal classification flag Q0 */ ); + Word16 BitAllocF_fx( Word16 *y, /* i : norm of sub-vectors :Q0 */ Word32 bit_rate, /* i : bitrate :Q0 */ @@ -5659,14 +5573,15 @@ Word16 BitAllocF_fx( const Word16 hqswb_clas, /* i : hq swb class */ const Word16 num_env_bands /* i : Number sub bands to be encoded for HQ_SWB_BWE */ ); -Word16 BitAllocWB_fx( /* o : t Q0*/ - Word16 *y, /* i : norm of sub-vectors Q0*/ - Word16 B, /* i : number of available bits Q0*/ - Word16 N, /* i : number of sub-vectors Q0*/ - Word16 *R, /* o : bit-allocation indicator Q0*/ - Word16 *Rsubband_fx /* o : sub-band bit-allocation vector Q3*/ + +Word16 BitAllocWB_fx( + Word16 *y, /* i : norm of sub-vectors Q0*/ + Word16 B, /* i : number of available bits Q0*/ + Word16 N, /* i : number of sub-vectors Q0*/ + Word16 *R, /* o : bit-allocation indicator Q0*/ + Word16 *Rsubband_fx /* o : sub-band bit-allocation vector Q3*/ ); -// bitallocsum_fx.c + void bitallocsum_fx( Word16 *R, /* i : bit-allocation vector Q0 */ const Word16 nb_sfm, /* i : number of sub-vectors Q0 */ @@ -5677,8 +5592,6 @@ void bitallocsum_fx( const Word16 *sfmsize /* i : band length Q0 */ ); - -// stab_est_fx.c Word16 stab_est_fx( Word16 etot, /* i : Total energy of the current frame Q8*/ Word16 *lt_diff_etot, /* i/o : Long term total energy variation Q8*/ @@ -5690,7 +5603,6 @@ Word16 stab_est_fx( const Word16 vad_flag /* i : VAD flag */ ); -// enhancer_fx.c void enhancer_fx( const Word32 core_brate, /* i : decoder bitrate */ const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ @@ -5710,27 +5622,9 @@ void enhancer_fx( ); void enhancer_ivas_fx( - const Word16 codec_mode, /* i : flag indicating Codec Mode */ - const Word32 core_brate, /* i : decoder bitrate */ - const int16_t cbk_index, /* i : */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 coder_type, /* i : coder type */ - const Word16 i_subfr, /* i : subframe number */ - const Word16 L_frame, /* i : frame size */ - const Word16 voice_fac, /* i : subframe voicing estimation Q15 */ - const Word16 stab_fac, /* i : LP filter stablility measure Q15 */ - Word32 norm_gain_code, /* i : normalised innovative cb. gain Q16 */ - const Word16 gain_inov, /* i : gain of the unscaled innovation Q12 */ - Word32 *gc_threshold, /* i/o: gain code threshold Q16 */ - Word16 *code, /* i/o: innovation Q12 */ - Word16 *exc2, /* i/o: adapt. excitation/total exc. Q_exc*/ - const Word16 gain_pit, /* i : quantized pitch gain Q14 */ - struct dispMem_fx *dm_fx, /* i/o: phase dispersion algorithm memory */ - const Word16 Q_exc /* i : Q of the excitation */ -); - -void enhancer_ivas_fx2( + const Word16 codec_mode, /* i : flag indicating Codec Mode */ const Word32 core_brate, /* i : decoder bitrate */ + const Word16 cbk_index, /* i : */ const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ const Word16 coder_type, /* i : coder type */ const Word16 i_subfr, /* i : subframe number */ @@ -5765,8 +5659,6 @@ Word16 E_UTIL_enhancer( Word16 L_frame, /* i : frame size */ Word16 Q_new ); - -// phase_dispersion_fx.c void phase_dispersion( const Word32 gain_code, /* i : gain of code 15Q16 */ const Word16 gain_pit, /* i : gain of pitch Q14 */ @@ -5779,7 +5671,6 @@ void phase_dispersion( Word16 L_subfr /* i : subframe length [40,64] */ ); -// tcx_ltp_fx.c void tcx_ltp_get_lpc( Word16 *x, /* Qx */ const Word16 L, /* Q0 */ @@ -5835,44 +5726,25 @@ void tcx_ltp_post_fx32( Word32 *tcx_buf, /* sig_q */ Word16 sig_q ); -// gs_inact_switching_fx.c -void Inac_swtch_ematch_fx( - Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ - Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ - Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ - const Word16 coder_type, /* i : Coding mode */ - const Word16 L_frame, /* i : Frame lenght */ - const Word32 core_brate, /* i : Core bit rate */ - const Word16 Q_exc, /* i : i and output format of exc2 */ - const Word16 bfi, /* i : frame lost indicator */ - const short last_core, /* i : Last core used */ - const short last_codec_mode /* i : Last codec mode */ -); - -void Inac_switch_ematch_ivas_fx( - Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ - Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ - Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ - const Word16 coder_type, /* i : Coding mode */ -#ifdef NONBE_FIX_GSC_BSTR - const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ -#endif - const Word16 L_frame, /* i : Frame lenght */ -#ifndef NONBE_FIX_GSC_BSTR - const Word32 core_brate, /* i : Core bit rate */ -#endif - const Word16 Q_exc, /* i : input and output format of exc2 */ - const Word16 bfi, /* i : frame lost indicator */ - const Word16 last_core, /* i : Last core used */ - const Word16 last_codec_mode, /* i : Last codec mode */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag*/ - const Word16 element_mode /* i : element mode */ +void Inac_switch_ematch_fx( + Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ + Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ + Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ + const Word16 coder_type, /* i : Coding mode */ + const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ + const Word16 L_frame, /* i : Frame lenght */ + const Word16 Q_exc, /* i : input and output format of exc2 */ + const Word16 bfi, /* i : frame lost indicator */ + const Word16 last_core, /* i : Last core used */ + const Word16 last_codec_mode, /* i : Last codec mode */ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const Word16 element_mode /* i : element mode */ ); -// igf_base_fx.c -Word16 IGF_ApplyTransFac( /**< out: Q0 | multiplication factor */ - const Word16 val, /**< in: Q15 | input value for multiplication, Q15 */ - const Word16 transFac /**< in: Q14 | multiplicator for variable val, Q14: 1.25f=0x5000, 1.0f=0x4000, 0.5f=0x2000 */ +/**< out: Q0 | multiplication factor */ +Word16 IGF_ApplyTransFac( + const Word16 val, /**< in: Q15 | input value for multiplication, Q15 */ + const Word16 transFac /**< in: Q14 | multiplicator for variable val, Q14: 1.25f=0x5000, 1.0f=0x4000, 0.5f=0x2000 */ ); Word16 IGF_MapBitRateToIndex( @@ -5882,22 +5754,24 @@ Word16 IGF_MapBitRateToIndex( const Word16 rf_mode /* i : flag to signal the RF mode */ ); -void IGFCommonFuncsCalcSfbEnergyPowerSpec( const Word16 startSfb, /**< in: Q0 | start sfb index */ - const Word16 stopSfb, /**< in: Q0 | stop sfb index */ - const Word16 *swb_offset, /**< in: Q0 | IGF swb offset table */ - Word32 *pPowerSpectrum, /**< in: Q31 | power spectrum */ - Word16 *pPowerSpectrum_exp, /**< in: | Exponent of PowerSpectrum */ - Word32 *sfbEnergy, /**< out:Q31 | SFB energies , will be initialized inside this function */ - Word16 *sfbEnergy_exp /**< out: | Exponent of PowerSpectrum */ +void IGFCommonFuncsCalcSfbEnergyPowerSpec( + const Word16 startSfb, /**< in: Q0 | start sfb index */ + const Word16 stopSfb, /**< in: Q0 | stop sfb index */ + const Word16 *swb_offset, /**< in: Q0 | IGF swb offset table */ + Word32 *pPowerSpectrum, /**< in: Q31 | power spectrum */ + Word16 *pPowerSpectrum_exp, /**< in: | Exponent of PowerSpectrum */ + Word32 *sfbEnergy, /**< out:Q31 | SFB energies , will be initialized inside this function */ + Word16 *sfbEnergy_exp /**< out: | Exponent of PowerSpectrum */ ); -void IGFCommonFuncsMDCTSquareSpec( const Word16 sqrtBgn, /**< in: Q0 | start MDCT subband index */ - const Word16 sqrtEnd, /**< in: Q0 | stop MDCT subband index */ - const Word32 *mdctSpec, /**< in: | MDCT spectrum to square */ - const Word16 mdctSpec_e, /**< in: | exponent of mdctSpectrum */ - Word32 *mdctSquareSpec, /**< out: | MDCT square spectrum */ - Word16 *mdctSquareSpec_e, /**< out: | exponent of mdctSquareSpec */ - Word16 indexOffset /**< in: Q0 | index offset */ +void IGFCommonFuncsMDCTSquareSpec( + const Word16 sqrtBgn, /**< in: Q0 | start MDCT subband index */ + const Word16 sqrtEnd, /**< in: Q0 | stop MDCT subband index */ + const Word32 *mdctSpec, /**< in: | MDCT spectrum to square */ + const Word16 mdctSpec_e, /**< in: | exponent of mdctSpectrum */ + Word32 *mdctSquareSpec, /**< out: | MDCT square spectrum */ + Word16 *mdctSquareSpec_e, /**< out: | exponent of mdctSquareSpec */ + Word16 indexOffset /**< in: Q0 | index offset */ ); void IGFCommonFuncsMDCTSquareSpec_ivas( @@ -5910,12 +5784,6 @@ void IGFCommonFuncsMDCTSquareSpec_ivas( Word16 indexOffset /**< in: Q0 | index offset */ ); -void IGFCommonFuncsWriteSerialBit( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 *pBitOffset, /**< out: Q0 | bit offset */ - Word16 bit /**< in: Q0 | value of bit */ -); - Word16 IGFCommonFuncsIGFConfiguration( const Word32 total_brate, /* i : bitrate in bs e.g. 9600 for 9.6kbs */ const Word16 bwidth, /* i : audio bandwidth */ @@ -5947,22 +5815,31 @@ Word16 IGFCommonFuncsIGFGetCFTables_fx( const UWord16 **cf_se11, /* o : CF tables for t == 1 and f >= 1 */ const Word16 **cf_off_se11 /* o : offsets for CF tables above */ ); -// ari_fx.c -Word32 L_multi31x16_X2( Word16 xh, Word16 xl, Word16 y ); + +Word32 L_multi31x16_X2( + Word16 xh, + Word16 xl, + Word16 y ); + Word32 mul_sbc_14bits( Word32 r, /* Q0 */ Word16 c /* Q0 */ ); -// window.c -void ham_cos_window( Word16 *fh, const Word16 n1, const Word16 n2 ); +void ham_cos_window( + Word16 *fh, + const Word16 n1, + const Word16 n2 ); -void ham_cos_window_ivas( Word16 *fh, const Word16 n1, const Word16 n2 ); +void ham_cos_window_ivas( + Word16 *fh, + const Word16 n1, + const Word16 n2 ); -// arith_coder_fx.c -Word32 expfp( /* o: Q31 */ - const Word16 x, /* i: mantissa Q-e */ - const Word16 x_e ); /* i: exponent Q0 */ +/* o: Q31 */ +Word32 expfp( + const Word16 x, /* i: mantissa Q-e */ + const Word16 x_e ); /* i: exponent Q0 */ void powfp_odd2( const Word16 base, /* Q15 */ @@ -5981,37 +5858,38 @@ void tcx_arith_scale_envelope( ); void tcx_arith_render_envelope( - const Word16 A_ind[], /* i: LPC coefficients of signal envelope Q12*/ - const Word16 L_frame, /* i: number of spectral lines Q0*/ + const Word16 A_ind[], /* i: LPC coefficients of signal envelope Q12*/ + const Word16 L_frame, /* i: number of spectral lines Q0*/ const Word16 L_spec, /* Q0 */ - const Word16 preemph_fac, /* i: pre-emphasis factor Q15*/ - const Word16 gamma_w, /* i: A_ind -> weighted envelope factor Q15*/ - const Word16 gamma_uw, /* i: A_ind -> non-weighted envelope factor Q14*/ - Word32 env[] /* o: shaped signal envelope Q16*/ + const Word16 preemph_fac, /* i: pre-emphasis factor Q15*/ + const Word16 gamma_w, /* i: A_ind -> weighted envelope factor Q15*/ + const Word16 gamma_uw, /* i: A_ind -> non-weighted envelope factor Q14*/ + Word32 env[] /* o: shaped signal envelope Q16*/ ); - -// gain_inov_fx.c -Word32 calc_gain_inov( /* returns innovation gain Q16 */ - const Word16 *code, /* i : algebraic excitation Q9 */ - const Word16 lcode, /* i : Subframe size Q0 */ - Word32 *dotp, /* o : intermediate result Q31-e */ - Word16 *dotp_e /* o : intermediate result exponent Q0 */ +/* returns innovation gain Q16 */ +Word32 calc_gain_inov( + const Word16 *code, /* i : algebraic excitation Q9 */ + const Word16 lcode, /* i : Subframe size Q0 */ + Word32 *dotp, /* o : intermediate result Q31-e */ + Word16 *dotp_e /* o : intermediate result exponent Q0 */ ); + /////////////////////////////////// /* Lib_dec */ ////////////////////////////////// -// swb_tbe_dec.c + void ResetSHBbuffer_Dec_fx( TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ const Word16 extl /* i : BWE extension layer */ ); + void wb_tbe_dec_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 coder_type, /* i : coding type */ - Word32 *bwe_exc_extended, /* i : bandwidth extended exciatation */ + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word16 coder_type, /* i : coding type */ + Word32 *bwe_exc_extended, /* i : bandwidth extended exciatation */ const Word16 Q_exc, - const Word16 voice_factors[], /* i : voicing factors */ + const Word16 voice_factors[], /* i : voicing factors */ Word16 *synth, /* i/o: ACELP core synthesis/final synthesis */ Word16 *Q_synth ); @@ -6071,7 +5949,7 @@ void GenTransition_fx( ); void GenTransition_fx32( - TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ Word32 *outputHB_fx, /* o : synthesized HB transitions signal : Q11 */ const Word32 output_Fs, /* i : output sampling rate : Q0 */ const Word16 L_frame, /* i : ACELP frame length : Q0 */ @@ -6099,31 +5977,16 @@ void td_bwe_dec_init_fx( const Word32 output_Fs /* i : output sampling rate */ ); -// lsf_dec_fx.c void lsf_dec_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ - Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ - Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ - const Word16 tdm_low_rate_mode /* i : secondary channel low rate mode flag Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ -); - -void lsf_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ - Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ - Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ - const Word16 tdm_low_rate_mode /* i : secondary channel low rate mode flag Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ + Decoder_State *st_fx, /* i/o: State structure */ + const Word16 tc_subfr, /* i : TC subframe index Q0*/ + Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ + Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ + Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ + Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ + Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag Q0*/ + const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ ); /*! r: index of the maximum value in the input vector */ @@ -6140,27 +6003,28 @@ Word16 minimum_l( Word32 *min_val /* o : minimum value in the input vector */ ); -void v_multc_fixed( +void v_multc_fx( const Word32 x[], /* i : Input vector */ const Word32 c, /* i : Constant */ Word32 y[], /* o : Output vector that contains c*x */ const Word16 N /* i : Vector length */ ); -void v_multc_fixed_16( + +void v_multc_fx_16( const Word32 x[], /* i : Input vector */ const Word16 c, /* i : Constant */ Word32 y[], /* o : Output vector that contains c*x */ const Word16 N /* i : Vector length */ ); -void v_multc_fixed_16_16( +void v_multc_fx_16_16( const Word16 x[], /* i : Input vector */ const Word16 c, /* i : Constant */ Word16 y[], /* o : Output vector that contains c*x */ const Word16 N /* i : Vector length */ ); -void v_add_fixed( +void v_add_fx_hdrm( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ @@ -6168,7 +6032,14 @@ void v_add_fixed( const Word16 hdrm /* i : headroom for when subtraction result > 1 or < -1 */ ); -void v_add_fixed_me( +void v_add_fx_no_hdrm( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ + const Word16 N /* i : Vector length */ +); + +void v_add_fx_me( const Word32 x1[], /* i : Input vector 1 */ const Word16 x1_e, /* i : Exponent for input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ @@ -6187,14 +6058,7 @@ void v_add_w64( const Word16 hdrm /* i : headroom for when subtraction result > 1 or < -1 */ ); -void v_multc_32_16_fixed( - const Word32 x[], /* i : Input vector */ - const Word16 c, /* i : Constant */ - Word32 y[], /* o : Output vector that contains c*x */ - const Word16 N /* i : Vector length */ -); - -void v_sub_fixed( +void v_sub_fx( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ @@ -6202,22 +6066,29 @@ void v_sub_fixed( const Word16 hdrm /* i : headroom for when subtraction result > 1 or < -1 */ ); +void v_sub_fx_no_hdrm( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ + const Word16 N /* i : Vector length */ +); + /*! r: dot product of x[] and y[] */ -Word32 dotp_fixed( +Word32 dotp_fx32( const Word32 x[], /* i : vector x[] */ const Word32 y[], /* i : vector y[] */ const Word16 n /* i : vector length */ ); /*! r: dot product of x[] and y[] in case of overflow*/ -Word32 dotp_fixed_o( +Word32 dotp_fx32_o( const Word32 x[], /* i : vector x[] */ const Word32 y[], /* i : vector y[] */ const Word16 n, /* i : vector length */ const Word16 log_len, /* i : max factor added to result q after dot product (equal to log2(n)) */ Word16 *res_q ); -Word32 dotp_fixed_32( +Word32 dotp_fx32_fac( const Word32 x[], /* i : vector x[] */ const Word32 y[], /* i : vector y[] */ const Word16 n, /* i : vector length */ @@ -6225,7 +6096,7 @@ Word32 dotp_fixed_32( Word16 *res_q /*stores resultant Q*/ ); -Word32 dotp_fixed_ivas_fx( +Word32 dotp_fx_ivas_fx( const Word32 x[], /* i : vector x[] */ Word16 x_e, const Word32 y[], /* i : vector y[] */ @@ -6233,7 +6104,7 @@ Word32 dotp_fixed_ivas_fx( const Word16 n, /* i : vector length */ Word16 *out_e ); -Word32 dotp_fixed_guarded( +Word32 dotp_fx_guarded( const Word32 x[], /* i : vector x[] */ const Word32 y[], /* i : vector y[] */ const Word16 n /* i : vector length */ @@ -6250,38 +6121,26 @@ Word32 dotp_me_fx( void lsf_end_dec_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 mode2_flag, /* Q0 */ - const Word16 coder_type_org, /* i : coding type Q0*/ - const Word16 bwidth, /* i : input signal bandwidth Q0*/ - const Word16 nBits_in, /* i : number of bits used for ISF quantization Q0*/ - Word16 *qlsf, /* o : quantized LSFs in the cosine domain Qx2.56*/ - Word16 *lpc_param, /* i : LPC parameters Q0*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *nb_indices /* o : number of indices Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ + const Word16 coder_type_org, /* i : coding type Q0*/ + const Word16 bwidth, /* i : input signal bandwidth Q0*/ + const Word16 nBits_in, /* i : number of bits used for ISF quantization Q0*/ + Word16 *qlsf, /* o : quantized LSFs in the cosine domain Qx2.56*/ + Word16 *lpc_param, /* i : LPC parameters Q0*/ + Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ + Word16 *nb_indices, /* o : number of indices Q0*/ + const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ ); void lsf_mid_dec_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ + Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 lsp_new[], /* i : quantized LSPs from frame endS Q15*/ - Word16 coder_type, /* i : Coder type Q0*/ - Word16 lsp_mid[] /* o : quantized LSPs Q15*/ + Word16 coder_type, /* i : Coder type Q0*/ + Word16 lsp_mid[] /* o : quantized LSPs Q15*/ ); -// cng_dec_fx.c void CNG_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ - const Word16 last_element_mode, /* i : last element mode Q0 */ - Word16 Aq[], /* o : LP coefficients Q12 */ - Word16 *lsp_new, /* i/o: current frame LSPs Q15 */ - Word16 *lsf_new, /* i/o: current frame LSFs Qlog2(2.56) */ - Word16 *allow_cn_step, /* o : allow CN step Q0 */ - Word16 *sid_bw, /* i : 0-NB/WB, 1-SWB SID Q0 */ - Word32 *q_env ); - -void CNG_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 last_element_mode, /* i : last element mode Q0 */ + const Word16 last_element_mode, /* i : last element mode Q0 */ Word16 Aq[], /* o : LP coefficients Q12 */ Word16 *lsp_new, /* i/o: current frame LSPs Q15 */ Word16 *lsf_new, /* i/o: current frame LSFs Qlog2(2.56) */ @@ -6291,7 +6150,7 @@ void CNG_dec_ivas_fx( void swb_CNG_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ - const Word16 *synth_fx, /* i : ACELP core synthesis at 32kHz Qsyn*/ + const Word16 *synth_fx, /* i : ACELP core synthesis at 32kHz Qsyn*/ Word16 *shb_synth_fx, /* o : high-band CNG synthesis Qx*/ const Word16 sid_bw, /* i : 0-NB/WB, 1-SWB SID Q0*/ const Word16 Qsyn /* i : Q value of ACELP core synthesis */ @@ -6309,7 +6168,6 @@ void td_cng_dec_init_fx( DEC_CORE_HANDLE st /* i/o: decoder state structure */ ); -// wavadjust_fec_dec_fx.c void set_state( Word16 *state, Word16 num, @@ -6455,12 +6313,7 @@ void DetectTonalComponents( const Word16 nSamples, const Word16 nSamplesCore, Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins */ - Word16 element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif -); + Word16 element_mode ); void RefineTonalComponents( Word16 indexOfTonalPeak[], @@ -6480,12 +6333,7 @@ void RefineTonalComponents( const Word16 nSamples, const Word16 nSamplesCore, const Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins */ - Word16 element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif -); + Word16 element_mode ); void ivas_RefineTonalComponents_fx( Word16 indexOfTonalPeak[], @@ -6510,14 +6358,13 @@ void ivas_RefineTonalComponents_fx( const PsychoacousticParameters *psychParamsCurrent ); ivas_error PsychoacousticParameters_Init( - const int32_t sr_core, /* i : sampling rate of core-coder */ - const int16_t nBins, /* i : Number of bins (spectral lines) */ - const int8_t nBands, /* i : Number of spectrum subbands */ - const int16_t isTCX20, /* i : Flag indicating if the subband division is for TCX20 or TCX10 */ - const int16_t isWarped, /* i : Flag indicating if the scale is linear or warped */ + const Word32 sr_core, /* i : sampling rate of core-coder */ + const Word16 nBins, /* i : Number of bins (spectral lines) */ + const Word8 nBands, /* i : Number of spectrum subbands */ + const Word16 isTCX20, /* i : Flag indicating if the subband division is for TCX20 or TCX10 */ + const Word16 isWarped, /* i : Flag indicating if the scale is linear or warped */ PsychoacousticParameters *pPsychParams ); -// TonalIMDCTconcealment_fx.c ivas_error TonalMDCTConceal_Init( TonalMDCTConcealPtr self, const Word16 nSamples, @@ -6525,6 +6372,7 @@ ivas_error TonalMDCTConceal_Init( const Word16 nScaleFactors, TCX_CONFIG_HANDLE hTcxCfg /* TCX config */ ); + ivas_error TonalMDCTConceal_Init_ivas_fx( TonalMDCTConcealPtr hTonalMDCTConc, const UWord16 nSamples, @@ -6542,12 +6390,7 @@ void TonalMDCTConceal_SaveFreqSignal( Word16 nNewSamplesCore, const Word16 *scaleFactors, const Word16 *scaleFactors_exp, - const Word16 gain_tcx_exp -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - , - const Word16 infoIGFStartLine -#endif -); + const Word16 gain_tcx_exp ); void TonalMDCTConceal_SaveFreqSignal_ivas_fx( TonalMDCTConcealPtr hTonalMDCTConc, @@ -6572,25 +6415,18 @@ void TonalMDCTConceal_Detect( const Word32 pitchLag, /*IN */ Word16 *umIndices, /*OUT*/ Word16 element_mode /* IN */ -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif ); void TonalMDCTConceal_Apply( - const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ - Word32* mdctSpectrum, /*IN/OUT*/ - Word16* mdctSpectrum_exp /*IN */ -#ifdef IVAS_CODE_MDCT_GSHAPE - , const PsychoacousticParameters* psychParamsCurrent) -#endif - ); + const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + Word32 *mdctSpectrum, /*IN/OUT*/ + Word16 *mdctSpectrum_exp /*IN */ +); void TonalMDCTConceal_Apply_ivas_fx( - TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ - Word32 *mdctSpectrum, /*IN/OUT*/ - Word16 mdctSpectrum_exp[L_FRAME48k], /*IN */ + TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + Word32 *mdctSpectrum, /*IN/OUT*/ + Word16 mdctSpectrum_exp, /*IN */ const PsychoacousticParameters *psychParamsCurrent ); void TonalMDCTConceal_InsertNoise_ivas_fx( @@ -6615,9 +6451,6 @@ void TonalMDCTConceal_InsertNoise( Word16 *pSeed, /*IN/OUT*/ const Word16 tiltCompFactor, Word16 crossfadeGain, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - const Word16concealment_noise[L_FRAME48k], -#endif const Word16 crossOverFreq ); void TonalMDCTConceal_SaveTimeSignal( @@ -6631,7 +6464,6 @@ void TonalMDCTConceal_SaveTimeSignal_ivas_fx( Word16 q_timeSignal, Word16 nNewSamples ); -// decision_matrix_dec_fx.c void decision_matrix_dec_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 *sharpFlag, /* o : formant sharpening flag Q0 */ @@ -6639,21 +6471,33 @@ void decision_matrix_dec_fx( Word16 *core_switching_flag /* o : ACELP->HQ switching frame flag Q0 */ ); -// hf_synth_fx.c void hf_synth_init_fx( ZERO_BWE_DEC_HANDLE hBWE_zero /* o : zero BWE decoder handle */ ); + void hf_synth_reset_fx( ZERO_BWE_DEC_HANDLE hBWE_zero /* o : zero BWE decoder handle */ ); void hf_synth_fx( - ZERO_BWE_DEC_HANDLE hBWE_zero, /* i/o: handle to 0 bit BWE parameters */ - const Word32 core_brate, /* i : core bitrate Q0*/ + ZERO_BWE_DEC_HANDLE hBWE_zero, /* i/o: handle to 0 bit BWE parameters */ + const Word32 core_brate, /* i : core bitrate Q0*/ const Word16 output_frame, /* i : output frame length Q0*/ - const Word16 *Aq, /* i : quantized Az Q12*/ - const Word16 *exc, /* i : excitation at 12.8 kHz Q_exc*/ - Word16 *synth, /* i : 12.8kHz synthesis signal Q_syn2*/ + const Word16 *Aq, /* i : quantized Az Q12*/ + const Word16 *exc, /* i : excitation at 12.8 kHz Q_exc*/ + Word16 *synth, /* i : 12.8kHz synthesis signal Q_syn2*/ + Word16 *synth16k, /* o : 16kHz synthesis signal Q_syn2*/ + const Word16 Q_exc, /* i : excitation scaling */ + const Word16 Q_syn2 /* i : synthesis scaling */ +); + +void hf_synth_ivas_fx( + ZERO_BWE_DEC_HANDLE hBWE_zero, /* i/o: handle to 0 bit BWE parameters */ + const Word32 core_brate, /* i : core bitrate Q0*/ + const Word16 output_frame, /* i : output frame length Q0*/ + const Word16 *Aq, /* i : quantized Az Q12*/ + const Word16 *exc, /* i : excitation at 12.8 kHz Q_exc*/ + Word16 *synth, /* i : 12.8kHz synthesis signal Q_syn2*/ Word16 *synth16k, /* o : 16kHz synthesis signal Q_syn2*/ const Word16 Q_exc, /* i : excitation scaling */ const Word16 Q_syn2 /* i : synthesis scaling */ @@ -6673,30 +6517,28 @@ void hf_synth_amr_wb_fx( ZERO_BWE_DEC_HANDLE hBWE_zero, /* o : zero BWE decoder handle */ const Word32 core_brate, /* i : core bitrate Q0*/ const Word16 output_frame, /* i : output frame length Q0*/ - const Word16 *Aq, /* i : quantized Az : Q12*/ - const Word16 *exc, /* i : excitation at 12.8 kHz : Q_exc*/ - Word16 *synth, /* i/o: synthesis signal at 12.8k : Q_syn*/ + const Word16 *Aq, /* i : quantized Az : Q12*/ + const Word16 *exc, /* i : excitation at 12.8 kHz : Q_exc*/ + Word16 *synth, /* i/o: synthesis signal at 12.8k : Q_syn*/ Word16 *amr_io_class, /* i : signal class (determined by FEC algorithm) Q0*/ - Word16 *synth_out, /* i/o: output signal at output Fs : Q_out*/ - Word16 fmerit, /* i : classify parameter from FEC : Q14*/ + Word16 *synth_out, /* i/o: output signal at output Fs : Q_out*/ + Word16 fmerit, /* i : classify parameter from FEC : Q14*/ const Word16 *hf_gain, /* i : decoded HF gain Q0*/ - const Word16 *voice_factors, /* i : voicing factors : Q15*/ - const Word16 pitch_buf[], /* i : pitch buffer : Q5*/ - const Word16 ng_ener_ST, /* i : Noise gate - short-term energy : Q8*/ - const Word16 *lsf_new, /* i : ISF vector : Q2*/ + const Word16 *voice_factors, /* i : voicing factors : Q15*/ + const Word16 pitch_buf[], /* i : pitch buffer : Q5*/ + const Word16 ng_ener_ST, /* i : Noise gate - short-term energy : Q8*/ + const Word16 *lsf_new, /* i : ISF vector : Q2*/ const Word16 Q_exc, /* i : exc scaling */ const Word16 Q_out /* i : Q_syn2-1 */ ); -// dec_post_fx void Init_post_filter_fx( PFSTAT_HANDLE hPFstat /* i : core decoder parameters */ -); /* (i) : core decoder parameters */ - +); /* i : core decoder parameters */ void nb_post_filt_fx( const Word16 L_frame, /* i : frame length */ - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *psf_lp_noise, /* i : Long term noise Q8 */ const Word16 tmp_noise, /* i : noise energy Q0 */ Word16 *Synth, /* i : 12k8 synthesis Qsyn */ @@ -6708,26 +6550,16 @@ void nb_post_filt_fx( ); void formant_post_filt_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ - Word16 *Aq, /* i : LP filter coefficient */ - Word16 *synth_out, /* i/o: i signal */ - Word16 L_frame, - Word32 lp_noise, /* (i) : background noise energy (15Q16) */ - Word32 rate, /* (i) : bit-rate */ - const Word16 off_flag /* i : off flag */ + Word16 *Aq, /* i : LP filter coefficient Q12 */ + Word16 *synth_out, /* i/o: input signal */ + const Word16 L_frame, /* i : frame length */ + const Word32 lp_noise, /* (i) : background noise energy (15Q16) */ + const Word32 brate, /* (i) : bit-rate */ + const Word16 off_flag /* i : off flag */ ); -void formant_post_filt_ivas_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ - Word16 *synth_in, /* i : 12k8 synthesis */ - Word16 *Aq, /* i : LP filter coefficient */ - Word16 *synth_out, /* i/o: i signal */ - Word16 L_frame, - Word32 lp_noise, /* (i) : background noise energy (15Q16) */ - Word32 rate, /* (i) : bit-rate */ - const Word16 off_flag /* i : off flag */ -); void Filt_mu_fx( Word16 *sig_in, /* i : signal (beginning at sample -1) */ Word16 *sig_out, /* o : signal with tilt */ @@ -6741,6 +6573,7 @@ void Filt_mu_ivas_fx( Word16 parcor0, /* i : parcor0 (mu = parcor0 * gamma3) */ Word16 L_subfr, /* i : the length of subframe */ const Word16 extl ); + void scale_st_fx( const Word16 *sig_in, /* i : postfilter i signal */ Word16 *sig_out, /* i/o: postfilter o signal */ @@ -6752,6 +6585,7 @@ void blend_subfr2_fx( Word16 *sigIn2, /* i : i signal for fade-in */ Word16 *sigOut /* o : output signal */ ); + void init_tcx_window_cfg_fx( TCX_CONFIG_HANDLE hTcxCfg, /* i : TCX Config handle */ const Word32 sr_core, /* i : SR core */ @@ -6782,8 +6616,6 @@ void init_tcx_cfg_fx( const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */, const Word16 fscaleFB ); -// syn_outp_fx.c - void syn_output_fx( const Word16 codec_mode, /* i : MODE1 or MODE2 */ Word16 *synth, /* i/o: fixed point synthesis signal Q_syn2 */ @@ -6800,24 +6632,24 @@ void unscale_AGC( const Word16 n /* i: vector size */ ); -// bass_psfilter_fx.c void bass_psfilter_init_fx( BPF_DEC_HANDLE hBPF /* o : BPF data handle */ ); void bass_psfilter_fx( - BPF_DEC_HANDLE hBPF, /* i/o: BPF data handle */ - const Word16 Opt_AMR_WB, /* i : AMR-WB IO flag Q0*/ - Word16 synth_in_fx[], /* i : input synthesis (at 16kHz) Q_syn2-1*/ - const Word16 L_frame, /* i : length of the last frame Q0*/ - Word16 pitch_buf_fx[], /* i : pitch for every subfr [0,1,2,3] Q6*/ - const Word16 bpf_off, /* i : do not use BPF when set to 1 Q0*/ - Word16 v_stab_fx, /* i : stability factor Q15*/ - Word16 *v_stab_smooth_fx, /* i/o: smoothed stability factor Q15*/ - const Word16 coder_type, /* i : coder_type Q0*/ + BPF_DEC_HANDLE hBPF, /* i/o: BPF data handle */ + const Word16 Opt_AMR_WB, /* i : AMR-WB IO flag Q0*/ + Word16 synth_in_fx[], /* i : input synthesis (at 16kHz) Q_syn2-1*/ + const Word16 L_frame, /* i : length of the last frame Q0*/ + Word16 pitch_buf_fx[], /* i : pitch for every subfr [0,1,2,3] Q6*/ + const Word16 bpf_off, /* i : do not use BPF when set to 1 Q0*/ + Word16 v_stab_fx, /* i : stability factor Q15*/ + Word16 *v_stab_smooth_fx, /* i/o: smoothed stability factor Q15*/ + const Word16 coder_type, /* i : coder_type Q0*/ Word16 Q_syn, - Word16 bpf_noise_buf[] /* o : BPF error signal (at int_fs) Qx*/ + Word16 bpf_noise_buf[] /* o : BPF error signal (at int_fs) Qx*/ ); + void addBassPostFilter_fx( const Word16 *harm_timeIn_Fx, /* timeIn_e */ Word32 **rAnalysis_Fx, /* Qx - 5 */ @@ -6830,7 +6662,6 @@ void addBassPostFilter_fx( const Word16 nBandsTotal, /* Q0 */ CLDFB_SCALE_FACTOR *cldfb_scale ); -// FEC_fx.c void FEC_exc_estim_fx( Decoder_State *st_fx, /* i/o: Decoder static memory */ const Word16 L_frame, /* i : length of the frame */ @@ -6846,79 +6677,48 @@ void FEC_exc_estim_fx( Word16 *tmp_noise /* o : long-term noise energy Q0 */ ); -// pitch_extr_fx.c void pitch_pred_linear_fit( - const Word16 /*short*/ bfi_cnt, - /* i: bfi counter */ /*Q0 */ - const Word16 /*short*/ last_good, - /* i: last classification type */ /*Q0 */ - Word32 /*float*/ *old_pitch_buf, - /* i: pitch lag buffer */ /*Q16*/ - Word32 /*float*/ *old_fpitch, - /* i: */ /*Q16*/ - Word32 /*float*/ *T0_out, - /* o: estimated close loop pitch */ /*Q16*/ - Word16 /* int*/ pit_min, - /* i: Minimum pitch lag */ /*Q0 */ - Word16 /* int*/ pit_max, - /* i: Maximum pitch lag */ /*Q0 */ - Word16 /*float*/ *mem_pitch_gain, - /* i: pitch gain [0] is the most recent subfr gain */ /*Q0*/ - Word16 /* int*/ limitation, - Word16 /*short*/ plc_use_future_lag, - /* i: */ /*Q0 */ - Word16 /*short*/ *extrapolationFailed, - /* o: flag if extrap decides not to change the pitch */ /*Q0 */ - Word16 nb_subfr /* i: number of ACELP subframes */ + const Word16 bfi_cnt, /* i: bfi counter Q0 */ + const Word16 last_good, /* i: last classification type Q0 */ + Word32 *old_pitch_buf, /* i: pitch lag buffer Q16*/ + Word32 *old_fpitch, /* i: Q16*/ + Word32 *T0_out, /* o: estimated close loop pitch Q16*/ + Word16 pit_min, /* i: Minimum pitch lag Q0 */ + Word16 pit_max, /* i: Maximum pitch lag Q0 */ + Word16 *mem_pitch_gain, /* i: pitch gain [0] is the most recent subfr gain Q0*/ + Word16 limitation, + Word16 plc_use_future_lag, /* i: Q0 */ + Word16 *extrapolationFailed, /* o: flag if extrap decides not to change the pitch Q0 */ + Word16 nb_subfr /* i: number of ACELP subframes */ ); void get_subframe_pitch( - Word16 nSubframes, - /* i: number of subframes */ /* Q0 */ - Word32 pitchStart, - /* i: starting pitch lag (in subframe -1) */ /*15Q16*/ - Word32 pitchEnd, - /* i: ending pitch lag (in subframe nSubframes-1) */ /*15Q16*/ - Word32 *pitchBuf /* o: interpolated pitch lag per subframe */ /*15Q16*/ + Word16 nSubframes, /* i: number of subframes Q0 */ + Word32 pitchStart, /* i: starting pitch lag (in subframe -1) 15Q16*/ + Word32 pitchEnd, /* i: ending pitch lag (in subframe nSubframes-1) 15Q16*/ + Word32 *pitchBuf /* o: interpolated pitch lag per subframe 15Q16*/ ); -// er_sync_exc_fx.c void PulseResynchronization_fx( - Word16 /*float*/ const *const src_exc, /*i Q15*/ - Word16 /*float*/ *const dst_exc, /*o Q15*/ - Word16 /*int*/ const nFrameLength, /*i Q0 */ - Word16 /*int*/ const nSubframes, /*i Q0 */ - Word32 /*float*/ const pitchStart, /*i Q16*/ - Word32 /*float*/ const pitchEnd /*i Q16*/ + Word16 const *const src_exc, /*i Q15*/ + Word16 *const dst_exc, /*o Q15*/ + Word16 const nFrameLength, /*i Q0 */ + Word16 const nSubframes, /*i Q0 */ + Word32 const pitchStart, /*i Q16*/ + Word32 const pitchEnd /*i Q16*/ ); -// gs_dec_fx.c void decod_audio_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : floating pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *lsf_new /* i : ISFs at the end of the frame Qx*/ - , - Word16 *gain_buf /*Q14*/ -); - -void decod_audio_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *lsf_new /* i : ISFs at the end of the frame Qx*/ - , - Word16 *gain_buf, /*Q14*/ + Decoder_State *st_fx, /* i/o: decoder static memory */ + Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ + const Word16 *Aq, /* i : LP filter coefficient Q12*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag Q0*/ const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag Q0*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ @@ -6926,51 +6726,31 @@ void decod_audio_ivas_fx( ); void gsc_dec_fx( - Decoder_State *st_fx, /* i/o: State structure */ - Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ - const Word16 pit_band_idx, /* i : bin position of the cut-off frequency Q0*/ - const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ - const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ - const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ - const Word16 coder_type, /* i : coding type Q0*/ - Word16 *last_bin, /* i : last bin of bit allocation Q0*/ - const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ - Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ - Word16 Q_exc ); - -void gsc_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ - const Word16 pit_band_idx, /* i : bin position of the cut-off frequency ` Q0*/ - const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ - const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ - const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ - const Word16 coder_type, /* i : coding type Q0*/ - Word16 *last_bin, /* i : last bin of bit allocation Q0*/ - const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ - Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ + Decoder_State *st_fx, /* i/o: State structure */ + Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ + const Word16 pit_band_idx, /* i : bin position of the cut-off frequency ` Q0*/ + const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ + const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ + const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ + const Word16 coder_type, /* i : coding type Q0*/ + Word16 *last_bin, /* i : last bin of bit allocation Q0*/ + const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ + Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ Word16 *Q_exc ); -void GSC_dec_init( +void GSC_dec_init_fx( GSC_DEC_HANDLE hGSCDec /* i/o: GSC data handle */ ); -void GSC_dec_init_ivas_fx( - GSC_DEC_HANDLE hGSCDec /* i/o: GSC data handle */ -); - - -// gain_dec_fx.c - void Es_pred_dec_fx( - Word16 *Es_pred, /* o : predicited scaled innovation energy Q8*/ - const Word16 enr_idx, /* i : indice */ - const Word16 nb_bits, /* i : number of bits */ - const Word16 no_ltp /* i : no LTP flag */ + Word16 *Es_pred, /* o : predicited scaled innovation energy Q8*/ + const Word16 enr_idx, /* i : indice */ + const Word16 nb_bits, /* i : number of bits */ + const Word16 no_ltp /* i : no LTP flag */ ); void gain_dec_tc_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ + Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 *code_fx, /* i : algebraic code excitation */ const Word16 i_subfr_fx, /* i : subframe number */ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ @@ -7015,24 +6795,8 @@ void gain_dec_lbr_fx( Word16 *gain_inov_fx, /* o : gain of the innovation (used for normalization) Q12*/ Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ Word32 gc_mem[], /* i/o: gain_code from previous subframes */ - Word16 gp_mem[] /* i/o: gain_pitch from previous subframes */ - , - const Word16 L_subfr /* i : subfr lenght */ -); - -void gain_dec_lbr_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 coder_type, /* i : coding type */ - const Word16 i_subfr, /* i : subframe index */ - const Word16 *code_fx, /* i : algebraic excitation Q9 */ - Word16 *gain_pit_fx, /* o : quantized pitch gain Q14*/ - Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov_fx, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ - Word32 gc_mem[], /* i/o: gain_code from previous subframes */ - Word16 gp_mem[] /* i/o: gain_pitch from previous subframes */ - , - const Word16 L_subfr /* i : subfr lenght */ + Word16 gp_mem[], /* i/o: gain_pitch from previous subframes */ + const Word16 L_subfr /* i : subfr lenght */ ); void lp_gain_updt_fx( @@ -7053,13 +6817,14 @@ void lp_gain_updt_ivas_fx( const Word16 L_frame /* i : length of the frame */ ); -Word32 gain_dec_gaus_fx( /* o : quantized codebook gain Q16 */ - Word16 index, /* i : quantization index */ - const Word16 bits, /* i : number of bits to quantize */ - const Word16 lowBound, /* i : lower bound of quantizer (dB) */ - const Word16 topBound, /* i : upper bound of quantizer (dB) */ - const Word16 inv_gain_inov, /* o : unscaled innovation gain Q12 */ - Word32 *L_norm_gain_code /* o : gain of normalized gaussian excitation Q16 */ +/*! r: quantized codebook gain Q16 */ +Word32 gain_dec_gaus_fx( + Word16 index, /* i : quantization index */ + const Word16 bits, /* i : number of bits to quantize */ + const Word16 lowBound, /* i : lower bound of quantizer (dB) */ + const Word16 topBound, /* i : upper bound of quantizer (dB) */ + const Word16 inv_gain_inov, /* o : unscaled innovation gain Q12 */ + Word32 *L_norm_gain_code /* o : gain of normalized gaussian excitation Q16 */ ); void gain_dec_SQ_fx( @@ -7084,7 +6849,6 @@ void gain_dec_amr_wb_fx( Word32 *norm_gain_code /* o : norm. gain of the codebook excitation */ ); -// dec_higher_acelp_fx.c void transf_cdbk_dec_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 harm_flag_acelp, /* i : harmonic flag for higher rates ACELP */ @@ -7096,32 +6860,30 @@ void transf_cdbk_dec_fx( Word16 code_preQ[], /* o : prequantizer excitation (Q8) */ Word16 *unbits /* o : number of AVQ unused bits */ ); -Word16 gain_dequant_fx( /* o: decoded gain */ - Word16 index, /* i: quantization index */ - const Word16 min, /* i: value of lower limit */ - const Word16 max, /* i: value of upper limit */ - const Word16 bits, /* i: number of bits to dequantize */ - Word16 *expg ); -// avq_dec_fx.c +/* o: decoded gain */ +Word16 gain_dequant_fx( + Word16 index, /* i: quantization index */ + const Word16 min, /* i: value of lower limit */ + const Word16 max, /* i: value of upper limit */ + const Word16 bits, /* i: number of bits to dequantize */ + Word16 *expg ); void AVQ_demuxdec_fx( - Decoder_State *st, /* i/o: decoder state structure */ - Word16 xriq[], /* o : decoded subvectors [0..8*Nsv-1] Q0*/ - Word16 *nb_bits, /* i/o: number of allocated bits Q0*/ - const Word16 Nsv, /* i : number of subvectors Q0*/ - Word16 nq[], /* i/o: AVQ nq index Q0*/ - Word16 avq_bit_sFlag, /* i : flag for AVQ bit saving solution Q0*/ - Word16 trgtSvPos /* i : target SV for AVQ bit savings Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + Word16 xriq[], /* o : decoded subvectors [0..8*Nsv-1] Q0*/ + Word16 *nb_bits, /* i/o: number of allocated bits Q0*/ + const Word16 Nsv, /* i : number of subvectors Q0*/ + Word16 nq[], /* i/o: AVQ nq index Q0*/ + Word16 avq_bit_sFlag, /* i : flag for AVQ bit saving solution Q0*/ + Word16 trgtSvPos /* i : target SV for AVQ bit savings Q0*/ ); void AVQ_dec_lpc( - Word16 *indx, /* input: index[] (4 bits per words) Q0*/ - Word16 *nvecq, /* output: vector quantized Q0*/ - Word16 Nsv ); /* input: number of subvectors (lg=Nsv*8) Q0*/ - + Word16 *indx, /* input: index[] (4 bits per words) Q0*/ + Word16 *nvecq, /* output: vector quantized Q0*/ + Word16 Nsv ); /* input: number of subvectors (lg=Nsv*8) Q0*/ -// re8_dec_fx.c void re8_dec_fx( Word16 n, /* i : codebook number (*n is an integer defined in {0,2,3,4,..,n_max}) */ const UWord16 I, /* i : index of c (pointer to unsigned 16-bit word) */ @@ -7129,46 +6891,31 @@ void re8_dec_fx( Word16 y[] /* o : point in RE8 (8-dimensional integer vector) */ ); -// lead_deindexing_fx.c -void re8_decode_base_index_fx( const Word16 n, UWord16 I, Word16 *x ); +void re8_decode_base_index_fx( + const Word16 n, + UWord16 I, + Word16 *x ); -// re8_utils_fx.c void re8_k2y_fx( - const Word16 *k, /* i : Voronoi index k[0..7] Q0*/ - const Word16 m, /* i : Voronoi modulo (m = 2^r = 1<=2) Q0*/ - Word16 *y /* o : 8-dimensional point y[0..7] in RE8 Q0*/ + const Word16 *k, /* i : Voronoi index k[0..7] Q0*/ + const Word16 m, /* i : Voronoi modulo (m = 2^r = 1<=2) Q0*/ + Word16 *y /* o : 8-dimensional point y[0..7] in RE8 Q0*/ ); void re8_vor_fx( - const Word16 y[], /* i : point in RE8 (8-dimensional integer vector) Q0*/ - Word16 *n, /* o : codebook number n=0,2,3,4,... (scalar integer) Q0*/ - Word16 k[], /* o : Voronoi index (integer vector of dimension 8) used only if n>4 Q0*/ - Word16 c[], /* o : codevector in Q0, Q2, Q3, or Q4 if n<=4, y=c Q0*/ - Word16 *ka /* o : identifier of absolute leader (to index c) Q0*/ + const Word16 y[], /* i : point in RE8 (8-dimensional integer vector) Q0*/ + Word16 *n, /* o : codebook number n=0,2,3,4,... (scalar integer) Q0*/ + Word16 k[], /* o : Voronoi index (integer vector of dimension 8) used only if n>4 Q0*/ + Word16 c[], /* o : codevector in Q0, Q2, Q3, or Q4 if n<=4, y=c Q0*/ + Word16 *ka /* o : identifier of absolute leader (to index c) Q0*/ ); -// re8_PPV_fx.c void re8_PPV_fx( - const Word32 x[], /* i : point in R^8 Q15 */ - Word16 y[] /* o : point in RE8 (8-dimensional integer vector) Q0 */ + const Word32 x[], /* i : point in R^8 Q15 */ + Word16 y[] /* o : point in RE8 (8-dimensional integer vector) Q0 */ ); -// dec_pit_exc_fx.c void dec_pit_exc_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* i : LP filter coefficient */ - const Word16 coder_type, /* i : coding type */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ - Word16 *code_fx, /* o : innovation */ - Word16 *exc_fx, /* i/o: adapt. excitation exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ - const Word16 nb_subfr_fx /* i : Number of subframe considered */ - , - Word16 *gain_buf /*Q14*/ -); - -void dec_pit_exc_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* i : LP filter coefficient */ const Word16 coder_type, /* i : coding type */ @@ -7178,30 +6925,30 @@ void dec_pit_exc_ivas_fx( Word16 *exc_fx, /* i/o: adapt. excitation exc */ Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ const Word16 nb_subfr_fx, /* i : Number of subframe considered */ - Word16 *gain_buf, /*Q14*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ ); -// pit_dec_fx.c -Word32 Mode2_pit_decode( /* o: pitch value Q16 */ - const Word16 coder_type, /* i: coding model */ - Word16 i_subfr, /* i: subframe index */ - Word16 L_subfr, - Word16 **pt_indice, /* i/o: quantization indices pointer */ - Word16 *T0, /* i/o: close loop integer pitch Q0 */ - Word16 *T0_frac, /* o: close loop fractional part of the pitch Q0 */ - Word16 *T0_res, /* i/o: pitch resolution Q0 */ - Word16 *T0_min, /* i/o: lower limit for close-loop search Q0 */ - Word16 *T0_min_frac, /* i/o: lower limit for close-loop search Q0 */ - Word16 *T0_max, /* i/o: higher limit for close-loop search Q0 */ - Word16 *T0_max_frac, /* i/o: higher limit for close-loop search Q0 */ - Word16 pit_min, - Word16 pit_fr1, - Word16 pit_fr1b, - Word16 pit_fr2, - Word16 pit_max, - Word16 pit_res_max ); +/* o: pitch value Q16 */ +Word32 Mode2_pit_decode( + const Word16 coder_type, /* i: coding model */ + Word16 i_subfr, /* i: subframe index */ + Word16 L_subfr, + Word16 **pt_indice, /* i/o: quantization indices pointer */ + Word16 *T0, /* i/o: close loop integer pitch Q0 */ + Word16 *T0_frac, /* o: close loop fractional part of the pitch Q0 */ + Word16 *T0_res, /* i/o: pitch resolution Q0 */ + Word16 *T0_min, /* i/o: lower limit for close-loop search Q0 */ + Word16 *T0_min_frac, /* i/o: lower limit for close-loop search Q0 */ + Word16 *T0_max, /* i/o: higher limit for close-loop search Q0 */ + Word16 *T0_max_frac, /* i/o: higher limit for close-loop search Q0 */ + Word16 pit_min, + Word16 pit_fr1, + Word16 pit_fr1b, + Word16 pit_fr2, + Word16 pit_max, + Word16 pit_res_max ); void Mode2_abs_pit_dec( Word16 *T0, /* o: integer pitch lag Q0 */ @@ -7222,23 +6969,8 @@ void Mode2_delta_pit_dec( Word16 **pt_indice /* i/o: pointer to Vector of Q indexes */ ); -Word16 pit_decode_fx( /* o : floating pitch value */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame, /* i : length of the frame */ - Word16 i_subfr, /* i : subframe index */ - const Word16 coder_type, /* i : coding type */ - Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ - Word16 *T0, /* o : close loop integer pitch */ - Word16 *T0_frac, /* o : close loop fractional part of the pitch */ - Word16 *T0_min, /* i/o: delta search min for sf 2 & 4 */ - Word16 *T0_max, /* i/o: delta search max for sf 2 & 4 */ - const Word16 L_subfr /* i : subframe length */ -); - /* o : floating pitch value */ -Word16 pit_decode_ivas_fx( +Word16 pit_decode_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word32 core_brate, /* i : core bitrate */ const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ @@ -7265,9 +6997,8 @@ void pit_Q_dec_fx( Word16 *T0, /* o : integer pitch lag */ Word16 *T0_frac, /* o : pitch fraction */ Word16 *T0_min, /* i/o: delta search min */ - Word16 *T0_max /* i/o: delta search max */ - , - Word16 *BER_detect /* o : BER detect flag */ + Word16 *T0_max, /* i/o: delta search max */ + Word16 *BER_detect /* o : BER detect flag */ ); void pit16k_Q_dec_fx( @@ -7277,9 +7008,8 @@ void pit16k_Q_dec_fx( Word16 *T0, /* o : integer pitch lag */ Word16 *T0_frac, /* o : pitch fraction */ Word16 *T0_min, /* i/o: delta search min */ - Word16 *T0_max /* i/o: delta search max */ - , - Word16 *BER_detect /* o : BER detect flag */ + Word16 *T0_max, /* i/o: delta search max */ + Word16 *BER_detect /* o : BER detect flag */ ); void abs_pit_dec_fx( @@ -7298,7 +7028,6 @@ void delta_pit_dec_fx( const Word16 T0_min /* i : delta search min */ ); -// limit_t0_fx.c void limit_T0_fx( const Word16 L_frame, /* i : length of the frame */ const Word16 delta, /* i : Half the close-loop searched interval */ @@ -7324,7 +7053,6 @@ void limit_T0_voiced( const Word16 pit_max /* i : Maximum pitch lag */ ); -// inov_dec.c void inov_decode_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word32 core_brate, /* i : core bitrate Q0 */ @@ -7352,15 +7080,18 @@ void inov_decode_ivas_fx( Word16 *code, /* o : algebraic excitation Q12 */ const Word16 L_subfr /* i : subframe length Q0 */ ); -// dec4t64_fx.c + void dec_acelp_4t64_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 nbbits, /* i : number of bits per codebook */ Word16 code[], /* o : algebraic (fixed) codebook excitation Q9*/ const Word16 Opt_AMR_WB ); -void D_ACELP_decode_43bit_fx( UWord16 idxs[], Word16 code[], Word16 *pulsestrack ); -// dec_acelp_fx.c +void D_ACELP_decode_43bit_fx( + UWord16 idxs[], + Word16 code[], + Word16 *pulsestrack ); + void D_ACELP_indexing_fx( Word16 code[], PulseConfig config, @@ -7368,9 +7099,13 @@ void D_ACELP_indexing_fx( Word16 index[], Word16 *BER_detect ); -void fcb_pulse_track_joint_decode_fx( UWord16 *idxs, Word16 wordcnt, UWord32 *index_n, Word16 *pulse_num, Word16 track_num ); +void fcb_pulse_track_joint_decode_fx( + UWord16 *idxs, + Word16 wordcnt, + UWord32 *index_n, + Word16 *pulse_num, + Word16 track_num ); -// dec2t32_fx.c void dec_acelp_2t32_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 code[] /* o: algebraic (fixed) codebook excitation */ @@ -7378,12 +7113,10 @@ void dec_acelp_2t32_fx( void dec_acelp_1t64_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 code[] /* o: algebraic (fixed) codebook excitation Q12*/ - , - const Word16 L_subfr /* i : sub frame lenght*/ + Word16 code[], /* o: algebraic (fixed) codebook excitation Q12*/ + const Word16 L_subfr /* i : sub frame lenght*/ ); -// acelp_core_switch)dec_fx.c ivas_error acelp_core_switch_dec_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 *synth_subfr_out, /* o : synthesized ACELP subframe Q_syn*/ @@ -7405,7 +7138,6 @@ ivas_error acelp_core_switch_dec_bfi_ivas_fx( const Word16 coder_type /* i : coder type */ ); -// pred_lt4_fx.c void pred_lt4( const Word16 excI[], /* in : excitation buffer Q_exc*/ Word16 excO[], /* out: excitation buffer Q_exc*/ @@ -7417,6 +7149,16 @@ void pred_lt4( const Word16 up_sample /* i : up_sample Q0*/ ); +void pred_lt4_ivas_fx( + const Word16 excI[], /* in : excitation buffer Q_exc*/ + Word16 excO[], /* out: excitation buffer Q_exc*/ + const Word16 T0, /* input : integer pitch lag Q0*/ + Word16 frac, /* input : fraction of lag Q0*/ + const Word16 L_subfr, /* input : subframe size Q0*/ + const Word32 *win, /* i : interpolation window Q31*/ + const Word16 nb_coef, /* i : nb of filter coef Q0*/ + const Word16 up_sample /* i : up_sample Q0*/ +); void pred_lt4_tc_fx( Word16 exc[], /* i/o: excitation buffer Q0*/ @@ -7427,7 +7169,6 @@ void pred_lt4_tc_fx( const Word16 i_subfr /* i : subframe index Q0*/ ); -// pvq_cored_dec void pvq_decode_frame_fx( Decoder_State *st_fx, Word16 *coefs_quant, /* o : quantized coefficients */ @@ -7457,7 +7198,6 @@ Word16 pvq_core_dec_fx( Word16 *maxpulse, const Word16 core ); - Word16 ivas_pvq_core_dec_fx( Decoder_State *st_fx, const Word16 *sfm_start, @@ -7485,37 +7225,39 @@ void decode_energies_fx( Word16 dim, const Word16 strict_bits ); -// range_drc_fx.c void rc_dec_init_fx( Decoder_State *st_fx, /* i/o: Decoder State */ PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ Word16 tot_bits /* i : Total bit budget */ ); -UWord32 rc_decode_fx( /* o : Decoded cumulative frequency */ - Word16 *BER_detect, /* o : Bit error detection flag */ - PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ - UWord32 tot /* i : Total cumulative frequency */ +/* o : Decoded cumulative frequency */ +UWord32 rc_decode_fx( + Word16 *BER_detect, /* o : Bit error detection flag */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + UWord32 tot /* i : Total cumulative frequency */ ); + void rc_dec_update_fx( - Decoder_State *st_fx, /* i/o: Decoder State */ + Decoder_State *st_fx, /* i/o: Decoder State */ PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ UWord32 cum_freq, /* i : Cumulative frequency */ UWord32 sym_freq /* i : Symbol frequency */ ); -Word32 rc_dec_bits_fx( /* i : Decoded value */ - Decoder_State *st_fx, /* i/o: Decoder State */ - PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ - Word16 bits /* i : Number of bits */ +/* o : Decoded value */ +Word32 rc_dec_bits_fx( + Decoder_State *st_fx, /* i/o: Decoder State */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + Word16 bits /* i : Number of bits */ ); -UWord32 rc_dec_uniform_fx( /* i : Decoded value */ - Decoder_State *st_fx, /* i/o: Decoder State */ - PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ - - UWord32 tot /* i : Maximum value */ +/* o : Decoded value */ +UWord32 rc_dec_uniform_fx( + Decoder_State *st_fx, /* i/o: Decoder State */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + UWord32 tot /* i : Maximum value */ ); void rc_dec_finish_fx( @@ -7523,18 +7265,15 @@ void rc_dec_finish_fx( PVQ_DEC_HANDLE hPVQ /* i/o: PVQ decoder handle */ ); -// pvq_decode_fx.c void pvq_decode_fx( Decoder_State *st_fx, - PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ - Word16 *xq, /* o: decoded vector (Q15) */ + PVQ_DEC_HANDLE hPVQ, /* i/o: PVQ decoder handle */ + Word16 *xq, /* o: decoded vector (Q15) */ Word16 *y, /* o: decoded vector (non-scaled int) */ const Word16 k_val, /* i: number of allocated pulses */ const Word16 dim, /* i: Length of vector */ const Word16 neg_gain /* i: Gain (negated to fit 1.0 in Q15 as -1.0) */ ); - -// nelp_dec_fx.c void nelp_decoder_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ Word16 *exc_nelp, /* o : adapt. excitation/total exc Q0 */ @@ -7545,7 +7284,6 @@ void nelp_decoder_fx( Word16 *gain_buf /* Q14 */ ); -// dec_nelp_fx.c void decod_nelp_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ Word16 *tmp_noise_fx, /* o : long term temporary noise energy */ @@ -7555,12 +7293,10 @@ void decod_nelp_fx( Word16 *voice_factors, /* o : Voice factor */ Word16 *bwe_exc, Word16 *Q_exc, - Word16 bfi /* i : frame error rate */ - , + Word16 bfi, /* i : frame error rate */ Word16 *gain_buf /*Q14*/ ); -// lp_filt_exc_dec_fx void lp_filt_exc_dec_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 codec_mode, /* i : coder mode */ @@ -7570,7 +7306,6 @@ void lp_filt_exc_dec_fx( Word16 lp_flag, /* i : operation mode signalling */ Word16 *exc ); -// FEC_lsf_estim_fx.c void FEC_lsf2lsp_interp( Decoder_State *st, /* i/o: Decoder static memory */ const Word16 L_frame, /* i : length of the frame */ @@ -7579,16 +7314,16 @@ void FEC_lsf2lsp_interp( Word16 *lsp /* o : estimated LSP vector */ ); - -// fd_cng_dec_fx.c -ivas_error createFdCngDec_fx( HANDLE_FD_CNG_DEC *hFdCngDec ); +ivas_error createFdCngDec_fx( + HANDLE_FD_CNG_DEC *hFdCngDec ); void initFdCngDec_fx( DEC_CORE_HANDLE st, /* i/o: decoder state structure */ - Word16 scale ); + const Word16 scale ); /* Delete the instance of type FD_CNG */ -void deleteFdCngDec_fx( HANDLE_FD_CNG_DEC *hFdCngDec ); +void deleteFdCngDec_fx( + HANDLE_FD_CNG_DEC *hFdCngDec ); /* Configure CLDFB-CNG */ void configureFdCngDec_fx( @@ -7599,21 +7334,7 @@ void configureFdCngDec_fx( const Word16 Last_L_frame, const Word16 element_mode ); -/* Apply the CLDFB-based CNG */ Word16 ApplyFdCng_fx( - Word16 *timeDomainInput, /* i : pointer to time domain i */ - Word16 Q, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - Word16 *powerSpectrum, -#endif - Word32 **cldfbBufferReal, /* i/o: real part of the CLDFB buffer */ - Word32 **cldfbBufferImag, /* i/o: imaginary part of the CLDFB buffer */ - Word16 *cldfbBufferScale, /* o : pointer to the scalefactor for real and imaginary part of the CLDFB buffer */ - Decoder_State *st, - const Word16 concealWholeFrame, /* i : binary flag indicating frame loss */ - Word16 is_music ); - -Word16 ApplyFdCng_ivas_fx( Word16 *timeDomainInput, /* i : pointer to time domain input */ Word16 Q, Word32 *powerSpectrum, @@ -7629,9 +7350,6 @@ Word16 ApplyFdCng_ivas_fx( void perform_noise_estimation_dec_fx( const Word16 *timeDomainInput, /* i: pointer to time domain i */ const Word16 Q, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - float *power_spectrum, -#endif HANDLE_FD_CNG_DEC hFdCngDec /* i/o: FD_CNG structure containing all buffers and variables */ ); @@ -7650,13 +7368,14 @@ void perform_noise_estimation_dec_ivas_fx( ); /* Decode the CLDFB-CNG bitstream */ -void FdCng_decodeSID_fx( HANDLE_FD_CNG_COM st, /* i/o: FD_CNG structure containing all buffers and variables */ - Decoder_State *corest ); /* i/o: decoder state structure */ +void FdCng_decodeSID_fx( + HANDLE_FD_CNG_COM st, /* i/o: FD_CNG structure containing all buffers and variables */ + Decoder_State *corest ); /* i/o: decoder state structure */ void noisy_speech_detection_fx( HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: FD_CNG structure */ const Word16 vad, /* i : VAD flag */ - const Word16 *syn, /* i : i time-domain frame */ + const Word16 *syn, /* i : i time-domain frame */ const Word16 Q ); void generate_comfort_noise_dec_fx( @@ -7679,10 +7398,11 @@ void generate_comfort_noise_dec_ivas_fx( const Word16 nchan_out /* i : number of output channels */ ); -void generate_comfort_noise_dec_hf_fx( Word32 **bufferReal, /* o : matrix to real part of i bands */ - Word32 **bufferImag, /* o : matrix to imaginary part of i bands */ - Word16 *bufferScale, /* o : pointer to scalefactor for real and imaginary part of i bands */ - Decoder_State *stdec ); +void generate_comfort_noise_dec_hf_fx( + Word32 **bufferReal, /* o : matrix to real part of i bands */ + Word32 **bufferImag, /* o : matrix to imaginary part of i bands */ + Word16 *bufferScale, /* o : pointer to scalefactor for real and imaginary part of i bands */ + Decoder_State *stdec ); void generate_comfort_noise_dec_hf_ivas_fx( Word32 **bufferReal, /* o : matrix to real part of input bands */ @@ -7693,35 +7413,30 @@ void generate_comfort_noise_dec_hf_ivas_fx( ); /* Generate the comfort noise based on the target noise level */ -void generate_masking_noise_fx( Word16 *timeDomainBuffer, /* i/o: time-domain signal */ - Word16 Q, - HANDLE_FD_CNG_COM st /* i/o: FD_CNG structure containing all buffers and variables */ - , - Word16 length, - Word16 core ); +void generate_masking_noise_fx( + Word16 *timeDomainBuffer, /* i/o: time-domain signal */ + Word16 Q, + HANDLE_FD_CNG_COM st, /* i/o: FD_CNG structure containing all buffers and variables */ + Word16 length, + Word16 core ); void generate_masking_noise_update_seed_fx( HANDLE_FD_CNG_COM st /* i/o : pointer to FD_CNG_COM structure */ ); -void generate_masking_noise_mdct_fx( Word32 *mdctBuffer, /* i/o: time-domain signal */ - Word16 *mdctBuffer_e, /* i/o: exponent time-domain signal */ - HANDLE_FD_CNG_COM st /* i/o: FD_CNG structure containing all buffers and variables */ - , - Word16 L_frame ); +void generate_masking_noise_mdct_fx( + Word32 *mdctBuffer, /* i/o: time-domain signal */ + Word16 *mdctBuffer_e, /* i/o: exponent time-domain signal */ + HANDLE_FD_CNG_COM st, /* i/o: FD_CNG structure containing all buffers and variables */ + Word16 L_frame ); -void generate_masking_noise_mdct_ivas_fx( Word32 *mdctBuffer, /* i/o: time-domain signal */ - Word16 *mdctBuffer_e, /* i/o: exponent time-domain signal */ - HANDLE_FD_CNG_COM st /* i/o: FD_CNG structure containing all buffers and variables */ ); +void generate_masking_noise_mdct_ivas_fx( + Word32 *mdctBuffer, /* i/o: time-domain signal */ + Word16 *mdctBuffer_e, /* i/o: exponent time-domain signal */ + HANDLE_FD_CNG_COM st /* i/o: FD_CNG structure containing all buffers and variables */ ); -// init_dec_fx.c ivas_error init_decoder_fx( - Decoder_State *st_fx, /* o: Decoder static variables structure */ - const Word16 idchan /* i : channel ID */ -); - -ivas_error init_decoder_ivas_fx( - Decoder_State *st_fx, /* o: Decoder static variables structure */ + Decoder_State *st_fx, /* o : Decoder static variables structure */ const Word16 idchan, /* i : channel ID */ const MC_MODE mc_mode /* i : MC mode */ ); @@ -7738,7 +7453,6 @@ void destroy_cldfb_encoder_fx( Encoder_State *st /* i/o: state structure */ ); -// swb_bwe_dec_fx.c Word16 WB_BWE_gain_deq_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 *WB_fenv /*Q15*/ @@ -7753,21 +7467,23 @@ Word16 wb_bwe_dec_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 *Qpost ); -Word16 swb_bwe_gain_deq_fx( /* o : BWE class */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 core, /* i : core */ - Word16 *SWB_tenv, /* o : Q0, time-domain BWE envelope */ - Word16 *SWB_fenv, /* o : Q1, frequency-domain BWE envelope */ - const Word16 hr_flag, /* i : high rate flag */ - const Word16 hqswb_clas /* i : HQ BWE class */ -); - -Word16 swb_bwe_dec_fx( /*o :Q_syn_hb*/ - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 *synth_fx, /* i/o: ACELP core synthesis/final synthesis (might be rescaled inside wtda() ) Q0/Qpost */ - Word16 *hb_synth_fx, /* o : SHB synthesis/final synthesis Q_syn_hb */ - const Word16 output_frame, /* i : frame length */ - Word16 *Qpost ); +/* o : BWE class */ +Word16 swb_bwe_gain_deq_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word16 core, /* i : core */ + Word16 *SWB_tenv, /* o : Q0, time-domain BWE envelope */ + Word16 *SWB_fenv, /* o : Q1, frequency-domain BWE envelope */ + const Word16 hr_flag, /* i : high rate flag */ + const Word16 hqswb_clas /* i : HQ BWE class */ +); + +/*o :Q_syn_hb*/ +Word16 swb_bwe_dec_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + Word16 *synth_fx, /* i/o: ACELP core synthesis/final synthesis (might be rescaled inside wtda() ) Q0/Qpost */ + Word16 *hb_synth_fx, /* o : SHB synthesis/final synthesis Q_syn_hb */ + const Word16 output_frame, /* i : frame length */ + Word16 *Qpost ); void fd_bwe_dec_init( Decoder_State *st_fx, /* i/o: decoder state structure */ @@ -7783,7 +7499,6 @@ void hq_core_enc_ivas_fx( const Word16 vad_hover_flag /* i : VAD hangover flag Q0*/ ); -// hq_core_dec_fx.c void hq_core_dec_fx( Decoder_State *st_fx, /* i/o: decoder state structure fx */ Word16 synth[], /* o : output synthesis Q_synth*/ @@ -7792,16 +7507,16 @@ void hq_core_dec_fx( const Word16 hq_core_type, /* i : HQ core type Q0*/ const Word16 core_switching_flag /* i : ACELP->HQ switching frame flag Q0*/ ); + void HQ_core_dec_init_fx( HQ_DEC_HANDLE hHQ_core /* i/o: HQ core data handle */ ); + void HQ_nbfec_init_fx( HQ_NBFEC_HANDLE hHQ_nbfec /* i/o: HQ NB FEC data handle */ ); -void GetAttackForTCXDecision_fx( Word32 const *pSubblockNrg, Word32 const *pAccSubblockNrg, Word16 nSubblocks, Word16 nPastSubblocks, Word16 attackRatioThreshold, Word16 *pbIsAttackPresent, Word16 *pAttackIndex ); -// FEC_HQ_phase_ecu_fx.c void hq_ecu_fx( const Word16 *prevsynth, /* i : buffer of previously synthesized signal */ Word32 *ecu_rec, /* o : reconstructed frame in tda domain */ @@ -7816,17 +7531,15 @@ void hq_ecu_fx( const Word16 ph_ecu_HqVoicing, Word16 *ph_ecu_active, /* i : Phase ECU active flag */ Word16 *gapsynth, - const Word16 prev_bfi, /* i : indicating burst frame error */ - const Word16 old_is_transient[2], /* i : flags indicating previous transient frames */ - Word16 *mag_chg_1st, /* i/o: per band magnitude modifier for transients*/ - Word16 *Xavg, /* i/o: Frequency group average gain to fade to */ - Word16 *beta_mute, /* o : Factor for long-term mute */ - const Word16 output_frame, /* i : frame length */ - Decoder_State *st_fx /* i/o: decoder state structure */ + const Word16 prev_bfi, /* i : indicating burst frame error */ + const Word16 old_is_transient[2], /* i : flags indicating previous transient frames */ + Word16 *mag_chg_1st, /* i/o: per band magnitude modifier for transients */ + Word16 *Xavg, /* i/o: Frequency group average gain to fade to */ + Word16 *beta_mute, /* o : Factor for long-term mute */ + const Word16 output_frame, /* i : frame length */ + Decoder_State *st_fx /* i/o: decoder state structure */ ); - -// hq_lr_dec_fx.c void hq_lr_dec_fx( Decoder_State *st_fx, /* i/o: : decoder state structure */ Word32 L_yout[], /* o : Q12 : transform-domain output coefs. */ @@ -7835,16 +7548,15 @@ void hq_lr_dec_fx( Word16 *is_transient_fx /* o : Q0 : transient flag */ ); -// gq_env_dec_fx.c -Word16 decode_envelope_indices_fx( /* o : Number of bits Q0*/ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 start_norm, /* i : starting band index Q0*/ - const Word16 num_sfm, /* i : Number of subbands Q0*/ - const Word16 numnrmibits, /* i : Bitrate of fall-back coding mode Q0*/ - Word16 *difidx, /* o : Diff indices/encoded diff indices Q0*/ - const Word16 flag_HQ2 /* i : indicator of HQ2 core Q0*/ - , - const Word16 is_transient /* i : indicator of HQ_TRANSIENT Q0*/ +/* o : Number of bits Q0*/ +Word16 decode_envelope_indices_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word16 start_norm, /* i : starting band index Q0*/ + const Word16 num_sfm, /* i : Number of subbands Q0*/ + const Word16 numnrmibits, /* i : Bitrate of fall-back coding mode Q0*/ + Word16 *difidx, /* o : Diff indices/encoded diff indices Q0*/ + const Word16 flag_HQ2, /* i : indicator of HQ2 core Q0*/ + const Word16 is_transient /* i : indicator of HQ_TRANSIENT Q0*/ ); void dequantize_norms_fx( @@ -7856,12 +7568,10 @@ void dequantize_norms_fx( Word16 *normqlg2 /* o : Log2 of decoded norms Q0*/ ); -// hdecnrm_fx.c void hdecnrm_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 numNorms, /* (i) number of norms Q0*/ - Word16 *index ); /* (o) indices of quantized norms Q0*/ - + const Word16 numNorms, /* (i) number of norms Q0*/ + Word16 *index ); /* (o) indices of quantized norms Q0*/ Word16 decode_huff_context_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ @@ -7877,8 +7587,8 @@ void hdecnrm_context_fx( void hdecnrm_resize_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 N, /* (i) number of SFMs Q0*/ - Word16 *index /* (o) norm quantization index vector Q0*/ + const Word16 N, /* (i) number of SFMs Q0*/ + Word16 *index /* (o) norm quantization index vector Q0*/ ); void huff_dec_fx( @@ -7893,12 +7603,11 @@ void huff_dec_fx( ); void hdecnrm_tran_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 N, /* i : number of norms Q0*/ - Word16 *index /* o : indices of quantized norms Q0*/ + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word16 N, /* i : number of norms Q0*/ + Word16 *index /* o : indices of quantized norms Q0*/ ); -// tcq_core_dec_fx.c void tcq_core_LR_dec_fx( Decoder_State *st_fx, Word16 *inp_vector_fx, /*x5 */ @@ -7917,7 +7626,6 @@ void tcq_core_LR_dec_fx( const Word16 *is_transient /*Q0 */ ); -// FEC_HQ_core_fx.c void HQ_FEC_processing_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ Word32 *t_audio_q_fx, /* o : MDCT coeffs. (for synthesis) Q12 */ @@ -7949,19 +7657,18 @@ void HQ_FEC_Mem_update_fx( void time_domain_FEC_HQ_fx( Decoder_State *st_fx, /* i : Decoder State */ - Word32 *wtda_audio_fx, /* i : i */ + Word32 *wtda_audio_fx, /* i : i */ Word16 *out_fx, /* o : output audio */ Word16 mean_en_high_fx, /* i : transient flag */ const Word16 output_frame, Word16 *Q_synth ); -// hq_hr_dec_fx.c void hq_pred_hb_bws_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 *ynrm, /* i : norm quantization index vector Q0*/ const Word16 length, /* i : frame length Q0*/ const Word16 hqswb_clas, /* i : HQ SWB class Q0*/ - const Word16 *SWB_fenv /* i : SWB frequency envelopes Q1*/ + const Word16 *SWB_fenv /* i : SWB frequency envelopes Q1*/ ); void hq_hr_dec_fx( @@ -7973,19 +7680,18 @@ void hq_hr_dec_fx( Word16 *is_transient, /* o : transient flag Q0 */ Word16 *hqswb_clas, /* o : HQ SWB class Q0 */ Word16 *SWB_fenv, /* o : SWB frequency envelopes Q1 */ - const Word16 core_switching_flag /* i : Core switching flag Q1 */ + const Word16 core_switching_flag /* i : Core switching flag Q1 */ ); -// hq_classifier_dec_fx.c -Word16 hq_classifier_dec_fx( /* o : Consumed bits Q0 */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word32 core_brate, /* i : Core bit rate Q0 */ - const Word16 length, /* i : Frame length Q0 */ - Word16 *is_transient, /* o : Transient flag Q0 */ - Word16 *hqswb_clas /* o : HQ class Q0 */ +/* o : Consumed bits */ +Word16 hq_classifier_dec_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word32 core_brate, /* i : Core bit rate Q0 */ + const Word16 length, /* i : Frame length Q0 */ + Word16 *is_transient, /* o : Transient flag Q0 */ + Word16 *hqswb_clas /* o : HQ class Q0 */ ); -// peak_vq_dec_fx.c void hvq_dec_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 num_bits, /* i : Number of available bits */ @@ -7998,7 +7704,6 @@ void hvq_dec_fx( Word32 *coefsq_norm, /* o : Output vector in Q12 */ const Word16 core ); -// hvq_pvq_bitalloc_fx.c Word16 hvq_pvq_bitalloc_fx( Word16 num_bits, /* i/o: Number of available bits (including gain bits) */ const Word32 brate, /* i : bitrate */ @@ -8012,7 +7717,6 @@ Word16 hvq_pvq_bitalloc_fx( Word16 *n_sel_bands /* Q0 o : No. of selected bands for encoding */ ); -// hq_conf_fec_fx.c void hq_configure_bfi_fx( Word16 *nb_sfm, /* o : Number of sub bands Q0*/ Word16 *num_Sb, /* o : Number of FEC sub bands ? Q0*/ @@ -8022,7 +7726,6 @@ void hq_configure_bfi_fx( const Word16 **sfm_end /* o : Subband end coefficients Q0*/ ); -// core_switching_dec_fx.c void bandwidth_switching_detect_fx( Decoder_State *st_fx /* i/o: encoder state structure */ ); @@ -8032,7 +7735,7 @@ void bandwidth_switching_detect_ivas_fx( ); void bw_switching_pre_proc_fx( - const Word16 *old_syn_12k8_16k_fx, /* i : ACELP core synthesis at 12.8kHz or 16kHz Qx*/ + const Word16 *old_syn_12k8_16k_fx, /* i : ACELP core synthesis at 12.8kHz or 16kHz Qx*/ Decoder_State *st_fx /* i/o: decoder state structure */ ); @@ -8053,7 +7756,7 @@ ivas_error core_switching_post_dec_fx( ivas_error core_switching_post_dec_ivas_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 *synth, /* i/o: output synthesis Qsynth*/ - Word32 *output_fx, /* i/o: LB synth/upsampled LB synth Q4*/ + Word32 *output_fx, /* i/o: LB synth/upsampled LB synth Q4*/ Word16 output_mem_fx[], /* i : OLA memory from last TCX/HQ frame Qx*/ const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo Q0*/ const Word16 output_frame, /* i : frame length Q0*/ @@ -8070,7 +7773,6 @@ void core_switching_hq_prepare_dec_fx( const Word16 output_frame /* i : output frame length Q0*/ ); -// amr_wb_dec_fx.c ivas_error amr_wb_dec_fx( Word16 output_sp[], /* o : synthesis output */ Decoder_State *st_fx /* o : Decoder static variables structure */ @@ -8080,7 +7782,6 @@ void amr_wb_dec_init_fx( AMRWB_IO_DEC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO data handle */ ); -// updt_dec_fx.c void updt_dec_fx( Decoder_State *st_fx, /* i/o: state structure */ const Word16 *old_exc_fx, /* i : buffer of excitation */ @@ -8090,9 +7791,8 @@ void updt_dec_fx( const Word16 *lsf_new_fx, /* i : current frame LSF vector */ const Word16 *lsp_new_fx, /* i : current frame LSP vector */ const Word16 voice_factors[], /* i : voicing factors */ - const Word16 *old_bwe_exc_fx /* i : buffer of excitation */ - , - const Word16 *gain_buf /*Q14*/ + const Word16 *old_bwe_exc_fx, /* i : buffer of excitation */ + const Word16 *gain_buf /*Q14*/ ); void updt_IO_switch_dec_fx( @@ -8101,8 +7801,8 @@ void updt_IO_switch_dec_fx( ); void updt_bw_switching_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 *synth, /* i : float synthesis signal */ + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word16 *synth, /* i : synthesis signal Qpost */ const Word16 Qpost ); void updt_dec_common_fx( @@ -8120,45 +7820,31 @@ void update_decoder_LPD_cng( Word16 *A, Word16 *bpf_noise_buf ); -// FEC_clas_estim_fx void FEC_clas_estim_fx( - Decoder_State *st_fx, /* i/o: decoder state handle */ - const Word16 Opt_AMR_WB, - /* i : flag indicating AMR-WB IO mode */ /*A*/ - const Word16 L_frame, /* i : length of the frame */ - Word16 *clas, /* i/o: frame classification */ - const Word16 coder_type, /* i : coder type */ - const Word16 *pitch, /* i : pitch values for each subframe (Q6) */ - Word16 *syn, /* i : synthesis buffer */ - Word16 *lp_speech, /* i/o: long term active speech energy average Q8 */ - Word16 *decision_hyst, - /* i/o: hysteresis of the music/speech decision */ /*A*/ - Word16 *UV_cnt, - /* i/o: number of consecutives frames classified as UV */ /*A*/ - Word16 *LT_UV_cnt, - /* i/o: long term consecutives frames classified as UV */ /*A*/ - Word16 *Last_ener, - /* i/o: last_energy frame */ /*A*/ - Word16 *locattack, - /* i/o: detection of attack (mainly to localized speech burst) */ /*A*/ - Word16 *lt_diff_etot, - /* i/o: long-term total energy variation */ /*A*/ - Word16 *amr_io_class, - /* i/o: classification for AMR-WB IO mode */ /*A*/ - Word16 Q_syn, /* i : Synthesis scaling */ - Word16 *class_para, - /* o : classification para. fmerit1 */ /*A*/ - Word16 *mem_syn_clas_estim, /* i/o: memory of the synthesis signal for frame class estimation */ - Word16 *Q_mem_syn, - /*i/o : exponent for memory of synthesis signal for frame class estimation */ /*B*/ - Word16 LTP_Gain, - /* i : LTP gain is 0..0.6 or negative Q15*/ /*B*/ - Word16 mode, - /* i : signal classifier mode */ /*B*/ - Word16 bfi, - /* i : bad frame indicator */ /*B*/ - Word32 last_core_brate, /* i : bitrate of previous frame */ - const Word16 FEC_mode /* i : ACELP FEC mode */ + Decoder_State *st_fx, /* i/o: decoder state handle */ + const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode A*/ + const Word16 L_frame, /* i : length of the frame */ + Word16 *clas, /* i/o: frame classification */ + const Word16 coder_type, /* i : coder type */ + const Word16 *pitch, /* i : pitch values for each subframe (Q6) */ + Word16 *syn, /* i : synthesis buffer */ + Word16 *lp_speech, /* i/o: long term active speech energy average Q8 */ + Word16 *decision_hyst, /* i/o: hysteresis of the music/speech decision A*/ + Word16 *UV_cnt, /* i/o: number of consecutives frames classified as UV A*/ + Word16 *LT_UV_cnt, /* i/o: long term consecutives frames classified as UV A*/ + Word16 *Last_ener, /* i/o: last_energy frame A*/ + Word16 *locattack, /* i/o: detection of attack (mainly to localized speech burst) A*/ + Word16 *lt_diff_etot, /* i/o: long-term total energy variation A*/ + Word16 *amr_io_class, /* i/o: classification for AMR-WB IO mode A*/ + Word16 Q_syn, /* i : Synthesis scaling */ + Word16 *class_para, /* o : classification para. fmerit1 A*/ + Word16 *mem_syn_clas_estim, /* i/o: memory of the synthesis signal for frame class estimation */ + Word16 *Q_mem_syn, /*i/o : exponent for memory of synthesis signal for frame class estimation B*/ + Word16 LTP_Gain, /* i : LTP gain is 0..0.6 or negative Q15B*/ + Word16 mode, /* i : signal classifier mode B*/ + Word16 bfi, /* i : bad frame indicator B*/ + Word32 last_core_brate, /* i : bitrate of previous frame */ + const Word16 FEC_mode /* i : ACELP FEC mode */ ); Word16 FEC_pos_dec_fx( @@ -8168,7 +7854,6 @@ Word16 FEC_pos_dec_fx( const Word16 nBits_es_Pred /* i : number of bits for Es_pred Q */ ); -// post_dec.h void post_decoder( Decoder_State *st, Word16 synth_buf[], /* Q0 */ @@ -8194,7 +7879,6 @@ void cldfb_synth_set_bandsToZero( const Word16 nTimeSlots, const CLDFB_SCALE_FACTOR scaleFactor ); -// FEC_pitch_estim_fx.c void FEC_pitch_estim_fx( const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ const Word16 last_core, /* i : last core */ @@ -8205,13 +7889,11 @@ void FEC_pitch_estim_fx( const Word32 old_pitch_buf[], /* i : buffer of old subframe pitch values 15Q16 */ Word16 *bfi_pitch, /* i/o: update of the estimated pitch for FEC */ Word16 *bfi_pitch_frame, /* o : frame length when pitch was updated */ - Word16 *upd_cnt /* i/o: update counter */ - , - const Word16 coder_type, /* i : coder_type */ - Word16 element_mode /* i : element mode */ + Word16 *upd_cnt, /* i/o: update counter */ + const Word16 coder_type, /* i : coder_type */ + Word16 element_mode /* i : element mode */ ); -// FEC_scale_sync_fx.c void FEC_scale_syn_fx( const Word16 L_frame, /* i : length of the frame */ Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ @@ -8238,66 +7920,36 @@ void FEC_scale_syn_fx( Word16 *mem_syn, /* o: initial synthesis filter states */ Word16 Q_exc, Word16 Q_syn, + const Word16 element_mode, /* i : element mode */ const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ - const Word16 force_scaling /* i: force scaling */ + const Word16 force_scaling /* i : force scaling */ ); -void FEC_scale_syn_ivas_fx( - const Word16 L_frame, /* i : length of the frame */ - Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ - Word16 clas, /* i/o: frame classification */ - const Word16 last_good, /* i: last good frame classification */ - Word16 *synth, /* i/o: synthesized speech at Fs = 12k8 Hz */ - const Word16 *pitch, /* i: pitch values for each subframe */ - Word32 L_enr_old, /* i: energy at the end of previous frame */ - Word32 L_enr_q, /* i: transmitted energy for current frame */ - const Word16 coder_type, /* i: coder type */ - const Word16 LSF_Q_prediction, /* i : LSF prediction mode */ - Word16 *scaling_flag, /* i/o: flag to indicate energy control of syn */ - Word32 *lp_ener_FEC_av, /* i/o: averaged voiced signal energy */ - Word32 *lp_ener_FEC_max, /* i/o: averaged voiced signal energy */ - const Word16 bfi, /* i: current frame BFI */ - const Word32 total_brate, /* i: total bitrate */ - const Word16 prev_bfi, /* i: previous frame BFI */ - const Word32 last_core_brate, /* i: previous frame core bitrate */ - Word16 *exc, /* i/o: excitation signal without enhancement */ - Word16 *exc2, /* i/o: excitation signal with enhancement */ - Word16 Aq[], /* i/o: LP filter coefs (can be modified if BR) */ - Word16 *old_enr_LP, /* i/o: LP filter E of last good voiced frame */ - const Word16 *mem_tmp, /* i: temp. initial synthesis filter states */ - Word16 *mem_syn, /* o: initial synthesis filter states */ - Word16 Q_exc, - Word16 Q_syn, - const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ - const Word16 force_scaling /* i: force scaling */ -); - -// LD_music_post_filter_fx.c void LD_music_post_filter_fx( - MUSIC_POSTFILT_HANDLE hMusicPF, /* i/o: LD music postfilter handle */ - const Word16 dtc_in[], /* i : i synthesis Qdct */ - Word16 dtc_out[], /* o : output synthesis Qdct */ - const Word32 core_brate, /* i : core bitrate Q0 */ - Word16 *Old_ener_Q, /* i/o : Old energy scaling factor */ - const Word16 coder_type, /* i : Coder type : -1 in case of IO Q0 */ - const Word16 Last_coder_type, /* i : i scaling Q0 */ - const Word16 Qdct /* i : i scaling Q0 */ + MUSIC_POSTFILT_HANDLE hMusicPF, /* i/o: LD music postfilter handle */ + const Word16 dtc_in[], /* i : i synthesis Qdct */ + Word16 dtc_out[], /* o : output synthesis Qdct */ + const Word32 core_brate, /* i : core bitrate Q0 */ + Word16 *Old_ener_Q, /* i/o: Old energy scaling factor */ + const Word16 coder_type, /* i : Coder type : -1 in case of IO Q0 */ + const Word16 Last_coder_type, /* i : i scaling Q0 */ + const Word16 Qdct /* i : i scaling Q0 */ ); void Prep_music_postP_fx( - Word16 exc_buffer_in[], /* i/o: excitation buffer Q_exc*/ - Word16 dct_buffer_out[], /* o : DCT output buffer (qdct)*/ - Word16 filt_lfE[], /* i/o: long term spectrum energy Q15 */ - const Word16 last_core, /* i : last core */ - const Word16 element_mode, /* i : element mode */ - const Word16 *pitch_buf, /* i : current frame pitch information Q6*/ - Word16 *LDm_enh_lp_gbin, /* o : smoothed suppression gain, per bin FFT Q15*/ - const Word16 Q_exc, /* i : excitation scaling */ - Word16 *qdct /* o : Scaling factor of dct coefficient */ + Word16 exc_buffer_in[], /* i/o: excitation buffer Q_exc*/ + Word16 dct_buffer_out[], /* o : DCT output buffer (qdct)*/ + Word16 filt_lfE[], /* i/o: long term spectrum energy Q15 */ + const Word16 last_core, /* i : last core */ + const Word16 element_mode, /* i : element mode */ + const Word16 *pitch_buf, /* i : current frame pitch information Q6*/ + Word16 *LDm_enh_lp_gbin, /* o : smoothed suppression gain, per bin FFT Q15*/ + const Word16 Q_exc, /* i : excitation scaling */ + Word16 *qdct /* o : Scaling factor of dct coefficient */ ); void Post_music_postP_fx( - Word16 dct_buffer_in[], /* i/o: excitation buffer */ + Word16 dct_buffer_in[], /* i/o: excitation buffer */ Word16 *exc2, /* i/o: Current excitation to be overwriten */ const Word16 *mem_tmp, /* i : previous frame synthesis memory */ Word16 *st_mem_syn2, /* i/o: current frame synthesis memory */ @@ -8307,48 +7959,41 @@ void Post_music_postP_fx( Word16 *prev_Q_syn, /* i : previsous frame synthesis scaling */ Word16 *Q_syn, /* i : Current frame synthesis scaling */ Word16 *mem_syn_clas_estim_fx, /* i : old 12k8 synthesis used for frame classification*/ - const Word16 IsIO, /* i: Flag to indicate IO mode */ - Word16 *mem_deemph, /* i/o: speech deemph filter memory */ - Word16 *st_pst_old_syn_fx, /* i/o: psfiler */ - Word16 *st_pst_mem_deemp_err_fx, /* i/o: psfiler */ + const Word16 IsIO, /* i : Flag to indicate IO mode */ + Word16 *mem_deemph, /* i/o: speech deemph filter memory */ + Word16 *st_pst_old_syn_fx, /* i/o: psfiler */ + Word16 *st_pst_mem_deemp_err_fx, /* i/o: psfiler */ Word16 *mem_agc, - PFSTAT *pf_stat, /* i/o: All memories related to NB post filter */ - const Word16 *tmp_buffer /* tmp_buffer in Q-1 */ - , - Word16 *mem_tmp2 /* Temporary memory used with scale_syn */ + PFSTAT *pf_stat, /* i/o: All memories related to NB post filter */ + const Word16 *tmp_buffer, /* tmp_buffer in Q-1 */ + Word16 *mem_tmp2 /* Temporary memory used with scale_syn */ ); void music_postfilt_init( MUSIC_POSTFILT_HANDLE hMusicPF /* i/o: LD music postfilter handle */ ); -// gs_dec_amr_wb.c void improv_amr_wb_gs_fx( - const Word16 clas, /* i : signal frame class Q0*/ - const Word16 coder_type, /* i : coder type Q0*/ - const Word32 core_brate, /* i : bitrate allocated to the core Q0*/ - Word16 *seed_tcx, /* i/o: Seed used for noise generation Q0*/ - Word16 *old_Aq_fx, /* i/o: old LPC filter coefficient q_old_Aq*/ + const Word16 clas, /* i : signal frame class Q0*/ + const Word16 coder_type, /* i : coder type Q0*/ + const Word32 core_brate, /* i : bitrate allocated to the core Q0*/ + Word16 *seed_tcx, /* i/o: Seed used for noise generation Q0*/ + Word16 *old_Aq_fx, /* i/o: old LPC filter coefficient q_old_Aq*/ Word16 *mem_syn2_fx, /* i/o: synthesis memory Q_syn*/ - const Word16 lt_voice_fac_fx, /* i/o: long term voice factor Q14*/ + const Word16 lt_voice_fac_fx, /* i/o: long term voice factor Q14*/ const Word16 locattack, /* i : Flag for a detected attack Q0*/ Word16 *Aq_fx, /* i/o: Decoded LP filter coefficient q_Aq*/ Word16 *exc2_fx, /* i/o: Decoded complete excitation Q_exc2*/ - const Word16 Q_exc2, /* i : Exponent of Exc2 */ - Word16 *mem_tmp_fx, /* i/o: synthesis temporary memory Q_syn*/ + const Word16 Q_exc2, /* i : Exponent of Exc2 */ + Word16 *mem_tmp_fx, /* i/o: synthesis temporary memory Q_syn*/ Word16 *syn_fx, /* o: Decoded synthesis to be updated Q_syn*/ - const Word16 Q_syn, /* i : Synthesis scaling */ - const Word16 *pitch_buf_fx, /* i : Decoded pitch buffer Q6*/ - const Word16 Last_ener_fx, /* i : Last energy (Q8) Q0*/ - const Word16 rate_switching_reset, /* i : rate switching reset flag Q0*/ - const Word16 last_coder_type /* i : Last coder_type Q0*/ -#ifdef ADD_IVAS_GS_DEC_IMPR - , - const Word16 VeryLowRateSTflag /* i : Enable the noise enhancement for very low rate stereo generic mode */ -#endif + const Word16 Q_syn, /* i : Synthesis scaling */ + const Word16 *pitch_buf_fx, /* i : Decoded pitch buffer Q6*/ + const Word16 Last_ener_fx, /* i : Last energy (Q8) Q0*/ + const Word16 rate_switching_reset, /* i : rate switching reset flag Q0*/ + const Word16 last_coder_type /* i : Last coder_type Q0*/ ); -// dec_amr_wb_fx.c void decod_amr_wb_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* i : LP filter coefficients */ @@ -8360,14 +8005,12 @@ void decod_amr_wb_fx( Word16 *gain_buf /* o : floating pitch gain for each subframe Q14 */ ); -// rst_dec_fx.c void CNG_reset_dec_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 *pitch_buf, /* o : floating pitch for each subframe Q6*/ Word16 *voice_factors /* o : voicing factors Q15*/ ); -// voiced_dec_fx.c ivas_error ppp_voiced_decoder_fx( Decoder_State *st_fx, /* i/o: state structure */ Word16 *out_fx, /* o : residual signal */ @@ -8376,45 +8019,34 @@ ivas_error ppp_voiced_decoder_fx( Word16 *pitch, /* o : floating pitch values for each subframe */ Word16 bfi /* i : Frame error rate */ ); + void sc_vbr_dec_init( SC_VBR_DEC_HANDLE hSC_VBR /* i/o: SC-VBR decoder handle */ ); -// ppp_dec_fx.c ivas_error ppp_quarter_decoder_fx( - DTFS_STRUCTURE *CURRCW_Q_DTFS_FX, /* i/o: Current CW DTFS */ - Word16 prevCW_lag_fx, /* i : Previous lag */ - Word16 *lastLgainD_fx, /* i/o: Last gain lowband Q11 */ - Word16 *lastHgainD_fx, /* i/o: Last gain highwband Q11 */ - Word16 *lasterbD_fx, /* i/o: Last ERB vector Q13 */ - Word16 bfi, /* i : FER flag */ - Word16 *S_fx, /* i : sine table, Q15 */ - Word16 *C_fx, /* i : cosine table, Q15 */ - DTFS_STRUCTURE PREV_CW_D_FX, /* i : Previous DTFS */ + DTFS_STRUCTURE *CURRCW_Q_DTFS_FX, /* i/o: Current CW DTFS */ + Word16 prevCW_lag_fx, /* i : Previous lag */ + Word16 *lastLgainD_fx, /* i/o: Last gain lowband Q11 */ + Word16 *lastHgainD_fx, /* i/o: Last gain highwband Q11 */ + Word16 *lasterbD_fx, /* i/o: Last ERB vector Q13 */ + Word16 bfi, /* i : FER flag */ + Word16 *S_fx, /* i : sine table, Q15 */ + Word16 *C_fx, /* i : cosine table, Q15 */ + DTFS_STRUCTURE PREV_CW_D_FX, /* i : Previous DTFS */ Decoder_State *st_fx ); -// core_dec_init_fx.c void open_decoder_LPD_fx( Decoder_State *st, const Word32 total_brate, /* Q0 */ -#ifdef NEW_IVAS_OPEN_DEC - const Word32 last_total_brate, -#endif - const Word16 bwidth /* Q0 */ -#ifdef NEW_IVAS_OPEN_DEC - , - const Word16 is_mct, /* i : MCT mode flag */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - const Word16 last_element_mode, -#endif - const Word16 is_init /* i : indicate call from init_decoder() to avoid double TC initialization */ -#endif + const Word16 bwidth /* Q0 */ ); + void open_decoder_LPD_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word32 total_brate, /* i : total bitrate Q0*/ - const Word32 last_total_brate, /* i : last total bitrate Q0*/ - const Word16 bwidth, /* i : audio bandwidth Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + const Word32 total_brate, /* i : total bitrate Q0*/ + const Word32 last_total_brate, /* i : last total bitrate Q0*/ + const Word16 bwidth, /* i : audio bandwidth Q0*/ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ const Word16 last_element_mode, /* i : last element mode Q0*/ const Word16 is_init, /* i : indicate call from init_decoder() to avoid double TC initialization Q0*/ @@ -8430,11 +8062,15 @@ void open_decoder_LPD_ivas_fx( void reset_tcx_overl_buf_fx( TCX_DEC_HANDLE hTcxDec /* i/o: TCX decoder handle */ ); + void acelp_plc_mdct_transition_fx( Decoder_State *st /* i/o: Decoder state */ ); + void cldfb_reset_memory_fx( - HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ ); + HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ +); + void tcxltp_dec_init_fx( TCX_LTP_DEC_HANDLE hTcxLtpDec, /* Q0 */ const Word16 ini_frame, /* Q0 */ @@ -8442,23 +8078,22 @@ void tcxltp_dec_init_fx( const Word16 element_mode, /* Q0 */ const Word16 pit_max, /* Q0 */ const Word32 sr_core ); /* Q0 */ -// swb_bwe_dec_hr_fx.c -Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB synthesis */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 *syn_12k8_16k_fx, /* i : ACELP core synthesis @16kHz : Q(15 - exp) */ - const Word16 exp, /* i : Exponent of core synthesis */ - Word16 *hb_synth_fx, /* o : SHB synthesis : Q(15 - hb_synth_fx_exp)*/ - const Word16 output_frame, /* i : frame length */ - const Word16 unbits, /* i : number of core unused bits */ - const Word16 pitch_buf[] /* i : pitch buffer : Q6 */ +/* o : Exponent of SHB synthesis */ +Word16 swb_bwe_dec_hr_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word16 *syn_12k8_16k_fx, /* i : ACELP core synthesis @16kHz : Q(15 - exp) */ + const Word16 exp, /* i : Exponent of core synthesis */ + Word16 *hb_synth_fx, /* o : SHB synthesis : Q(15 - hb_synth_fx_exp)*/ + const Word16 output_frame, /* i : frame length */ + const Word16 unbits, /* i : number of core unused bits */ + const Word16 pitch_buf[] /* i : pitch buffer : Q6 */ ); void hr_bwe_dec_init( HR_BWE_DEC_HANDLE hBWE_FD_HR /* i/o: HR BWE data handle */ ); -// swb_bwe_com_hr_fx.c void swb_hr_noise_fill_fx( const Word16 is_transient, /* i : transient flag */ const Word16 spect_start, /* i : spectrum start point */ @@ -8471,7 +8106,6 @@ void swb_hr_noise_fill_fx( Word16 *t_audio, /* i/o: mdct spectrum Q_audio */ Word16 Q_audio ); -// stat_noise_uv_dec_fx.c void stat_noise_uv_dec_fx( Decoder_State *st_fx, /* i/o: Decoder static memory */ Word16 *lsp_new, /* i : end-frame LSP vector Q15 */ @@ -8481,62 +8115,59 @@ void stat_noise_uv_dec_fx( const Word16 uc_two_stage_flag /* i : flag indicating two-stage UC */ ); -// stat_noise_uv_mod_fx.c void stat_noise_uv_mod_fx( - const Word16 coder_type, /* i : Coder type */ + const Word16 coder_type, /* i : Coder type */ Word16 noisiness, /* i : noisiness parameter Q0 */ const Word16 *lsp_old, /* i : old LSP vector at 4th sfr Q15 */ - const Word16 *lsp_new, /* i : LSP vector at 4th sfr Q15 */ - const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q15 */ - Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q12 */ - Word16 *exc2, /* i/o: excitation buffer Q_exc */ + const Word16 *lsp_new, /* i : LSP vector at 4th sfr Q15 */ + const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q15 */ + Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q12 */ + Word16 *exc2, /* i/o: excitation buffer Q_exc */ Word16 Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ - const Word16 bfi, /* i : Bad frame indicator */ - Word32 *ge_sm, /* i/o: smoothed excitation gain Q_ge */ - Word16 *uv_count, /* i/o: unvoiced counter */ - Word16 *act_count, /* i/o: activation counter */ - Word16 lspold_s[], /* i/o: old LSP Q15 */ - Word16 *noimix_seed, /* i/o: mixture seed Q0 */ - Word16 *st_min_alpha, /* i/o: minimum alpha Q15 */ - Word16 *exc_pe, /* i/o: scale Q_stat_noise Q_stat_noise */ - const Word32 bitrate, /* i : core bitrate */ - const Word16 bwidth_fx, /* i : input bandwidth */ - Word16 *Q_stat_noise, /* i/o: noise scaling */ - Word16 *Q_stat_noise_ge /* i/o: noise scaling */ + const Word16 bfi, /* i : Bad frame indicator */ + Word32 *ge_sm, /* i/o: smoothed excitation gain Q_ge */ + Word16 *uv_count, /* i/o: unvoiced counter */ + Word16 *act_count, /* i/o: activation counter */ + Word16 lspold_s[], /* i/o: old LSP Q15 */ + Word16 *noimix_seed, /* i/o: mixture seed Q0 */ + Word16 *st_min_alpha, /* i/o: minimum alpha Q15 */ + Word16 *exc_pe, /* i/o: scale Q_stat_noise Q_stat_noise */ + const Word32 bitrate, /* i : core bitrate */ + const Word16 bwidth_fx, /* i : input bandwidth */ + Word16 *Q_stat_noise, /* i/o: noise scaling */ + Word16 *Q_stat_noise_ge /* i/o: noise scaling */ ); void stat_noise_uv_mod_ivas_fx( - const Word16 coder_type, /* i : Coder type */ - Word16 noisiness, /* i : noisiness parameter Q=0 */ - const Word16 *lsp_old, /* i : old LSP vector at 4th sfr Q=15*/ - const Word16 *lsp_new, /* i : LSP vector at 4th sfr Q=15*/ - const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q=15*/ - Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q=12*/ - Word16 *exc2, /* i/o: excitation buffer Q=Q_exc*/ - Word16 Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ - const Word16 bfi, /* i : Bad frame indicator */ + const Word16 coder_type, /* i : Coder type */ + Word16 noisiness, /* i : noisiness parameter Q=0 */ + const Word16 *lsp_old, /* i : old LSP vector at 4th sfr Q=15*/ + const Word16 *lsp_new, /* i : LSP vector at 4th sfr Q=15*/ + const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q=15*/ + Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q=12*/ + Word16 *exc2, /* i/o: excitation buffer Q=Q_exc*/ + Word16 *Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ + const Word16 bfi, /* i : Bad frame indicator */ Word32 *ge_sm, /* i/o: smoothed excitation gain Q=Q_stat_noise_ge (6)*/ - Word16 *uv_count, /* i/o: unvoiced counter */ - Word16 *act_count, /* i/o: activation counter */ - Word16 lspold_s[], /* i/o: old LSP Q=15*/ - Word16 *noimix_seed, /* i/o: mixture seed Q0 */ - Word16 *st_min_alpha, /* i/o: minimum alpha Q=15*/ + Word16 *uv_count, /* i/o: unvoiced counter */ + Word16 *act_count, /* i/o: activation counter */ + Word16 lspold_s[], /* i/o: old LSP Q=15*/ + Word16 *noimix_seed, /* i/o: mixture seed Q0 */ + Word16 *st_min_alpha, /* i/o: minimum alpha Q=15*/ Word16 *exc_pe, /* i/o: scale Q_stat_noise Q=Q_stat_noise*/ - const Word32 bitrate, /* i : core bitrate */ - const Word16 bwidth_fx, /* i : i bandwidth */ - Word16 *Q_stat_noise, /* i/o: noise scaling */ - Word16 *Q_stat_noise_ge /* i/o: noise scaling */ + const Word32 bitrate, /* i : core bitrate */ + const Word16 bwidth_fx, /* i : i bandwidth */ + Word16 *Q_stat_noise, /* i/o: noise scaling */ + Word16 *Q_stat_noise_ge /* i/o: noise scaling */ ); -// FEC_adao_codebook_fx.c Word16 FEC_SinOnset_fx( - Word16 *exc, /* i/o : exc vector to modify */ - Word16 puls_pos, /* i : last pulse position desired */ - const Word16 T0, /* i : Pitch information of the 1 subfr */ - Word32 enr_q, /* i : energy provide by the encoder */ - Word16 *Aq, /* i : A(z) filter Q12 */ - const Word16 L_frame /* i : frame length */ - , + Word16 *exc, /* i/o : exc vector to modify */ + Word16 puls_pos, /* i : last pulse position desired */ + const Word16 T0, /* i : Pitch information of the 1 subfr */ + Word32 enr_q, /* i : energy provide by the encoder */ + Word16 *Aq, /* i : A(z) filter Q12 */ + const Word16 L_frame, /* i : frame length */ const Word16 Qold ); Word16 FEC_enhACB_fx( @@ -8547,60 +8178,48 @@ Word16 FEC_enhACB_fx( const Word16 puls_pos, /* i : decoder position of the last glottal pulses decoded in the previous frame */ const Word16 bfi_pitch /* i : Q6 pitch used for concealment */ ); -Word16 FEC_synchro_exc_fx( /* o : do_WI flag */ - const Word16 L_frame, /* i : length of the frame */ - Word16 *exc, /* i/o: exc vector to modify */ - const Word16 desire_puls_pos, /* i : Pulse position send by the encoder */ - const Word16 true_puls_pos, /* i : Present pulse location */ - const Word16 Old_pitch /* i : Pitch use to create temporary adaptive codebook */ + +/*! r: do_WI flag */ +Word16 FEC_synchro_exc_fx( + const Word16 L_frame, /* i : length of the frame */ + Word16 *exc, /* i/o: exc vector to modify */ + const Word16 desire_puls_pos, /* i : Pulse position send by the encoder */ + const Word16 true_puls_pos, /* i : Present pulse location */ + const Word16 Old_pitch /* i : Pitch use to create temporary adaptive codebook */ ); -// dec_uv_fx.c void decod_unvoiced_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ - const Word16 coder_type, /* Q0 i : coding type */ - Word16 *tmp_noise_fx, /* Q5 o : long term temporary noise energy */ - Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe */ - Word16 *voice_factors_fx, /* Q15 o : voicing factors */ - Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ - Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ + Decoder_State *st_fx, /* i/o: decoder static memory */ + const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ + const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ + const Word16 uc_two_stage_flag, /* i : flag indicating two-stage UC */ + const Word16 coder_type, /* Q0 i : coding type */ + Word16 *tmp_noise_fx, /* Q0 o : long term temporary noise energy */ + Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe*/ + Word16 *voice_factors_fx, /* Q15 o : voicing factors */ + Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ + Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ + Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ Word16 *gain_buf ); -void decod_unvoiced_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - const int16_t uc_two_stage_flag, /* i : flag indicating two-stage UC */ - const Word16 coder_type, /* Q0 i : coding type */ - Word16 *tmp_noise_fx, /* Q0 o : long term temporary noise energy */ - Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe*/ - Word16 *voice_factors_fx, /* Q15 o : voicing factors */ - Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ - Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ - Word16 *gain_buf ); - -// gaus_dec_fx.c void gaus_dec_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 i_subfr, /* i : subframe index */ - Word16 *code, /* o : unvoiced excitation Q12 */ - Word32 *L_norm_gain_code, /* o : gain of normalized gaussian excitation Q16 */ - Word16 *lp_gainp, /* i/o : lp filtered pitch gain(FER) Q14 */ - Word16 *lp_gainc, /* i/o : lp filtered code gain (FER) Q3 */ - Word16 *inv_gain_inov, /* o : unscaled innovation gain Q12 */ - Word16 *tilt_code, /* o : synthesis excitation spectrum tilt Q15 */ - Word16 *voice_fac, /* o : estimated voicing factor Q15 */ - Word16 *gain_pit, /* o : pitch gain Q14 */ - Word16 *pt_pitch_1, /* o : floating pitch buffer Q6 */ - Word16 *exc, /* o : excitation signal frame */ - Word32 *L_gain_code, /* o : gain of the gaussian excitation Q16 */ - Word16 *exc2, /* o : Scaled excitation signal frame */ + const Word16 i_subfr, /* i : subframe index */ + Word16 *code, /* o : unvoiced excitation Q12 */ + Word32 *L_norm_gain_code, /* o : gain of normalized gaussian excitation Q16 */ + Word16 *lp_gainp, /* i/o : lp filtered pitch gain(FER) Q14 */ + Word16 *lp_gainc, /* i/o : lp filtered code gain (FER) Q3 */ + Word16 *inv_gain_inov, /* o : unscaled innovation gain Q12 */ + Word16 *tilt_code, /* o : synthesis excitation spectrum tilt Q15 */ + Word16 *voice_fac, /* o : estimated voicing factor Q15 */ + Word16 *gain_pit, /* o : pitch gain Q14 */ + Word16 *pt_pitch_1, /* o : floating pitch buffer Q6 */ + Word16 *exc, /* o : excitation signal frame */ + Word32 *L_gain_code, /* o : gain of the gaussian excitation Q16 */ + Word16 *exc2, /* o : Scaled excitation signal frame */ Word16 *bwe_exc_fx, - Word16 *sQ_exc, /* i/o : Excitation scaling factor (Decoder state) */ - Word16 *sQsubfr /* i/o : Past excitation scaling factors (Decoder State) */ + Word16 *sQ_exc, /* i/o : Excitation scaling factor (Decoder state) */ + Word16 *sQsubfr /* i/o : Past excitation scaling factors (Decoder State) */ ); void gaus_L2_dec( @@ -8611,42 +8230,24 @@ void gaus_L2_dec( Word16 *seed_acelp /*i/o : random seed Q0 */ ); -// dec_gen_voic_fx.c ivas_error decod_gen_voic_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 L_frame_fx, /* i : length of the frame */ - const Word16 sharpFlag_fx, /* i : formant sharpening flag */ - const Word16 *Aq_fx, /* i : LP filter coefficient */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - const Word16 do_WI_fx, /* i : do interpolation after a FER */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ - Word16 *voice_factors_fx, /* o : voicing factors */ - Word16 *exc_fx, /* i/o: adapt. excitation exc */ - Word16 *exc2_fx, /* i/o: adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ - Word16 *unbits, /* number of unused bits */ - Word16 *gain_buf /*Q14*/ -); - -ivas_error decod_gen_voic_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 sharpFlag_fx, /* i : formant sharpening flag */ - const Word16 *Aq_fx, /* i : LP filter coefficient */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - const Word16 do_WI_fx, /* i : do interpolation after a FER */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ - Word16 *voice_factors_fx, /* o : voicing factors */ - Word16 *exc_fx, /* i/o: adapt. excitation exc */ - Word16 *exc2_fx, /* i/o: adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ - Word16 *unbits, /* number of unused bits */ - Word16 *gain_buf, + Decoder_State *st_fx, /* i/o: decoder static memory */ + const Word16 L_frame, /* i : length of the frame */ + const Word16 sharpFlag_fx, /* i : formant sharpening flag */ + const Word16 *Aq_fx, /* i : LP filter coefficient */ + const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ + const Word16 do_WI_fx, /* i : do interpolation after a FER */ + Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ + Word16 *voice_factors_fx, /* o : voicing factors */ + Word16 *exc_fx, /* i/o: adapt. excitation exc */ + Word16 *exc2_fx, /* i/o: adapt. excitation/total exc */ + Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ + Word16 *unbits, /* number of unused bits */ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ ); -// dec_tran_fx.c void decod_tran_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 L_frame_fx, /* i : length of the frame */ @@ -8663,7 +8264,6 @@ void decod_tran_fx( Word16 *gain_buf /*Q14*/ ); -// transition_dec_fx.c void transition_dec_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ @@ -8684,25 +8284,21 @@ void transition_dec_fx( Word16 tc_classif_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 L_frame /* i : length of the frame */ + const Word16 L_frame /* i : length of the frame */ ); -// dec_ppp_fx.c ivas_error decod_ppp_fx( - Decoder_State *st_fx, /* i/o: state structure */ - const Word16 Aq_fx[], /* i : 12k8 Lp coefficient */ - Word16 *pitch_buf_fx, /* i/o: fixed pitch values for each subframe */ - Word16 *exc_fx, /* i/o: current non-enhanced excitation */ - Word16 *exc2_fx, /* i/o: current enhanced excitation */ - Word16 bfi /* i : bad frame indicator */ - , - Word16 *gain_buf /*Q14*/ - , + Decoder_State *st_fx, /* i/o: state structure */ + const Word16 Aq_fx[], /* i : 12k8 Lp coefficient */ + Word16 *pitch_buf_fx, /* i/o: fixed pitch values for each subframe */ + Word16 *exc_fx, /* i/o: current non-enhanced excitation */ + Word16 *exc2_fx, /* i/o: current enhanced excitation */ + Word16 bfi, /* i : bad frame indicator */ + Word16 *gain_buf, /*Q14*/ Word16 *voice_factors, /* o : voicing factors */ Word16 *bwe_exc_fx /* o : excitation for SWB TBE */ ); -// swb_bwe_dec_lr_fx.c void swb_bwe_dec_lr_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word32 L_m_core[], /* i : lowband synthesis : QsL */ @@ -8726,7 +8322,6 @@ void swb_bwe_dec_lr_fx( Word16 *ni_seed_fx /* i/o: random seed : QsL */ ); -// dec_acelp_tck_main_fx.c Word16 dec_acelp_tcx_frame_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 *concealWholeFrame, /* i/o: concealment flag */ @@ -8738,7 +8333,6 @@ Word16 dec_acelp_tcx_frame_fx( Word16 pitch_buf[] /* o : floating pitch for each subframe */ ); -// dec_LPD_fx.c void decoder_LPD_fx( Word16 signal_out[], /* o : signal with LPD delay (7 subfrs) */ Word16 signal_outFB[], /* o : synthesis @output_FS */ @@ -8753,7 +8347,6 @@ void decoder_LPD_fx( Word16 *ptr_bwe_exc /* o : excitation for SWB TBE */ ); -// core_dec_switch_fx.c void mode_switch_decoder_LPD_fx( Decoder_State *st, /* Q0 */ Word16 bandwidth_in, /* Q0 */ @@ -8762,13 +8355,13 @@ void mode_switch_decoder_LPD_fx( ); void mode_switch_decoder_LPD_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word16 bwidth, /* i : audio bandwidth Q0*/ - const Word32 total_brate, /* i : total bitrate Q0*/ - const Word32 last_total_brate, /* i : last frame total bitrate Q0*/ - const Word16 frame_size_index, /* i : index determining the frame size Q0*/ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ - const Word16 last_element_mode, /* i : last element mode Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 bwidth, /* i : audio bandwidth Q0*/ + const Word32 total_brate, /* i : total bitrate Q0*/ + const Word32 last_total_brate, /* i : last frame total bitrate Q0*/ + const Word16 frame_size_index, /* i : index determining the frame size Q0*/ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ + const Word16 last_element_mode, /* i : last element mode Q0*/ Word16 *Q_syn_Overl_TDAC, Word16 *Q_fer_samples, Word16 *Q_syn_Overl, @@ -8778,17 +8371,16 @@ void mode_switch_decoder_LPD_ivas_fx( Word16 *Q_old_outLB, Word16 *Q_old_Aq_12_8 ); -// ari_hm_dec.c - -int16_t DecodeIndex( +Word16 DecodeIndex( Decoder_State *st, - const int16_t Bandwidth, /* o : NB, 1: (S)WB */ - int16_t *PeriodicityIndex ); -Word16 -DecodeIndex_fx( + const Word16 Bandwidth, /* o : NB, 1: (S)WB */ + Word16 *PeriodicityIndex ); + +Word16 DecodeIndex_fx( Decoder_State *st, const Word16 Bandwidth, Word16 *PeriodicityIndex ); + void tcx_hm_decode( const Word16 L_frame, /* i : number of spectral lines */ Word32 env[], /* i/o: envelope shape (Q16) */ @@ -8799,7 +8391,6 @@ void tcx_hm_decode( Word16 *hm_bits /* o : bit consumption */ ); -// lsf_msvq_ma_dec_fx.c Word16 lsf_msvq_ma_decprm( Decoder_State *st, Word16 *param_lpc /* Q0 */ @@ -8808,15 +8399,15 @@ Word16 lsf_msvq_ma_decprm( Word16 lsf_bctcvq_decprm( Decoder_State *st, Word16 *param_lpc /* Q0 */ - ); + Word16 D_lsf_tcxlpc( - const Word16 indices[], /* i : VQ indices Q0*/ - Word16 lsf_q[], /* o : quantized LSF Q1*/ - Word16 lsp_q_ind[], /* o :quantized LSP (w/o MA prediction) Q1*/ - Word16 narrowband, /* i : narrowband flag Q0*/ - Word16 cdk, /* i : codebook selector Q0*/ - Word16 mem_MA[] /* i : MA memory Q1*/ + const Word16 indices[], /* i : VQ indices Q0*/ + Word16 lsf_q[], /* o : quantized LSF Q1*/ + Word16 lsp_q_ind[], /* o :quantized LSP (w/o MA prediction) Q1*/ + Word16 narrowband, /* i : narrowband flag Q0*/ + Word16 cdk, /* i : codebook selector Q0*/ + Word16 mem_MA[] /* i : MA memory Q1*/ ); Word16 dec_lsf_tcxlpc( @@ -8826,7 +8417,6 @@ Word16 dec_lsf_tcxlpc( Word16 cdk /* i : codebook selector Q0*/ ); -// lsf_msvq_ma_fx.c void midlsf_dec( const Word16 qlsf0[], /* i: quantized lsf coefficients (3Q12) */ const Word16 qlsf1[], /* i: quantized lsf coefficients (3Q12) */ @@ -8843,8 +8433,6 @@ Word16 lsf_ind_is_active( const Word16 narrowband, const Word16 cdk ); - -// IGFSCFDecoder.c void IGFSCFDecoderOpen( IGFSCFDEC_INSTANCE_HANDLE hPublicData, /* i : handle to public data */ H_IGF_INFO hIgfInfo, /* i : IGF info handle */ @@ -8860,20 +8448,23 @@ void IGFSCFDecoderReset( void IGFSCFDecoderDecode( IGFSCFDEC_INSTANCE_HANDLE hPublicData, /* i/o: handle to public data or NULL in case there was no instance created */ Decoder_State *st, /* i/o: pointer to decoder state */ - int16_t *sfe, /* o : ptr to an array which will contain the decoded quantized coefficients */ + Word16 *sfe, /* o : ptr to an array which will contain the decoded quantized coefficients */ const Word16 igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ const Word16 indepFlag /* i : if 1 on input the decoder will be forced to reset, if 0 on input the decoder will be forced to encode without a reset */ ); -// ari_dec_fx.c -Word32 ari_decode_overflow_fx( Tastat *s ); +Word32 ari_decode_overflow_fx( + Tastat *s ); void ari_start_decoding_14bits_fx( Decoder_State *st, Tastat *s ); -Word16 ari_start_decoding_14bits_prm_fx( const Word16 *ptr, Word16 bp, Tastat *s ); +Word16 ari_start_decoding_14bits_prm_fx( + const Word16 *ptr, + Word16 bp, + Tastat *s ); Word16 ari_decode_14bits_s17_ext_fx( Decoder_State *st, @@ -8889,11 +8480,21 @@ Word16 ari_decode_14bits_bit_ext_fx( Decoder_State *st, Tastat *s ); -Word16 ari_decode_14bits_pow_fx( Word16 *ptr, Word16 bp, Word16 bits, Word16 *res, Tastat *s, Word16 base ); +Word16 ari_decode_14bits_pow_fx( + Word16 *ptr, + Word16 bp, + Word16 bits, + Word16 *res, + Tastat *s, + Word16 base ); -Word16 ari_decode_14bits_sign_fx( Word16 *ptr, Word16 bp, Word16 bits, Word16 *res, Tastat *s ); +Word16 ari_decode_14bits_sign_fx( + Word16 *ptr, + Word16 bp, + Word16 bits, + Word16 *res, + Tastat *s ); -// dec_prm_fx.c void getTCXparam_fx( Decoder_State *st, /* i/o: Decoder State handle */ Decoder_State *st0, /* i : bitstream */ @@ -8904,7 +8505,9 @@ void getTCXparam_fx( const Word16 *no_param_tns, /* i : number of TNS parameters per subframe Q0 */ Word16 p_param[2], /* o : pointer to parameters for next round of bs reading Q0 */ Word16 nTnsBitsTCX10[2], /*Q0*/ - const Word16 pre_past_flag /*Q0*/ ); + const Word16 pre_past_flag /*Q0*/ +); + void dec_prm_fx( Word16 *coder_type, Word16 param[], /* (o) : decoded parameters */ @@ -8921,7 +8524,6 @@ void getLPCparam_fx( const Word16 ch, /* i : channel Q0 */ const Word16 sns_low_br_mode /* i : SNS low-bitrate mode Q0 */ ); -// ari_hm_fx.c void UnmapIndex( const Word16 PeriodicityIndex, /* Q0 */ @@ -8941,7 +8543,7 @@ void ConfigureContextHm( ); Word16 CountIndexBits( - Word16 Bandwidth, /* 0: NB, 1: (S)WB Q0*/ + Word16 Bandwidth, /* 0: NB, 1: (S)WB Q0*/ Word16 PeriodicityIndex /* Q0 */ ); @@ -8960,34 +8562,25 @@ void tcx_hm_modify_envelope( Word16 L_frame /* i: number of spectral lines Q0 */ ); -// tns_base_dec_fx.c -#ifdef IVAS_CODE -void -#else -Word16 -#endif -ReadTnsData( STnsConfig const *pTnsConfig, - Decoder_State *st, - Word16 *pnBits, - Word16 *stream, - Word16 *pnSize ); -#define IVAS_CODE -#ifdef IVAS_CODE -void -#else -Word16 -#endif -ReadTnsData_ivas_fx( STnsConfig const *pTnsConfig, - Decoder_State *st, - Word16 *pnBits, - Word16 *stream, - Word16 *pnSize ); -#undef IVAS_CODE - -Word16 DecodeTnsData( STnsConfig const *pTnsConfig, - Word16 const *stream, - Word16 *pnSize, - STnsData *pTnsData ); +Word16 ReadTnsData( + STnsConfig const *pTnsConfig, + Decoder_State *st, + Word16 *pnBits, + Word16 *stream, + Word16 *pnSize ); + +void ReadTnsData_ivas_fx( + STnsConfig const *pTnsConfig, + Decoder_State *st, + Word16 *pnBits, + Word16 *stream, + Word16 *pnSize ); + +Word16 DecodeTnsData( + STnsConfig const *pTnsConfig, + Word16 const *stream, + Word16 *pnSize, + STnsData *pTnsData ); Word16 DecodeTnsData_ivas_fx( STnsConfig const *pTnsConfig, @@ -8995,14 +8588,13 @@ Word16 DecodeTnsData_ivas_fx( Word16 *pnSize, STnsData *pTnsData ); -// parametr_bitmapping.c using ivas void GetParameters( ParamsBitMap const *paramsBitMap, - const int16_t nParams, + const Word16 nParams, void const *pParameter, - int16_t **pStream, - int16_t *pnSize, - int16_t *pnBits ); + Word16 **pStream, + Word16 *pnSize, + Word16 *pnBits ); void GetParameters_fx( ParamsBitMap const *paramsBitMap, @@ -9010,7 +8602,8 @@ void GetParameters_fx( void const *pParameter, // Q0 Word16 **pStream, // Q0 Word16 *pnSize, // Q0 - Word16 *pnBits ); // Q0 + Word16 *pnBits // Q0 +); void EncodeTnsData_ivas_fx( STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ @@ -9022,10 +8615,10 @@ void EncodeTnsData_ivas_fx( void SetParameters( ParamsBitMap const *paramsBitMap, - const int16_t nParams, + const Word16 nParams, void *pParameter, - const int16_t **pStream, - int16_t *pnSize ); + const Word16 **pStream, + Word16 *pnSize ); void SetParameters_fx( ParamsBitMap const *paramsBitMap, @@ -9036,18 +8629,18 @@ void SetParameters_fx( void WriteToBitstream( ParamsBitMap const *paramsBitMap, - const int16_t nParams, - const int16_t **pStream, - int16_t *pnSize, + const Word16 nParams, + const Word16 **pStream, + Word16 *pnSize, BSTR_ENC_HANDLE hBstr, - int16_t *pnBits ); + Word16 *pnBits ); void ReadFromBitstream( ParamsBitMap const *paramsBitMap, - const int16_t nArrayLength, + const Word16 nArrayLength, Decoder_State *st, - int16_t **pStream, - int16_t *pnSize ); + Word16 **pStream, + Word16 *pnSize ); void ReadFromBitstream_fx( ParamsBitMap const *paramsBitMap, @@ -9055,25 +8648,27 @@ void ReadFromBitstream_fx( Decoder_State *st, Word16 **pStream, Word16 *pnSize ); -// igf_dec_fx.c -void IGFDecReadData( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Deccoder */ - Decoder_State *st, /**< in: | decoder state */ - const Word16 igfGridIdx, /**< in: Q0 | in case of CELP->TCX switching, use 1.25 framelength */ - const Word16 isIndepFrame /**< in: Q0 | if 1: arith dec force reset, if 0: no reset */ -); -void IGFDecReadLevel( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Deccoder */ - Decoder_State *st, /**< in: | decoder state */ - const Word16 igfGridIdx, /**< in: Q0 | in case of CELP->TCX switching, use 1.25 framelength */ - const Word16 isIndepFrame /**< in: Q0 | if 1: arith dec force reset, if 0: no reset */ +void IGFDecReadData( + const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Deccoder */ + Decoder_State *st, /**< in: | decoder state */ + const Word16 igfGridIdx, /**< in: Q0 | in case of CELP->TCX switching, use 1.25 framelength */ + const Word16 isIndepFrame /**< in: Q0 | if 1: arith dec force reset, if 0: no reset */ ); -void IGFDecApplyMono( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ - Word32 *spectrum, /**< in/out: | MDCT spectrum */ - Word16 *spectrum_e, /**< in/out: | exponent of spectrum */ - const Word16 igfGridIdx, /**< in: | in case of CELP->TCX switching, use 1.25 framelength */ - Word16 bfi /**< in: | frame loss == 1, frame good == 0 */ +void IGFDecReadLevel( + const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Deccoder */ + Decoder_State *st, /**< in: | decoder state */ + const Word16 igfGridIdx, /**< in: Q0 | in case of CELP->TCX switching, use 1.25 framelength */ + const Word16 isIndepFrame /**< in: Q0 | if 1: arith dec force reset, if 0: no reset */ +); +void IGFDecApplyMono( + const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ + Word32 *spectrum, /**< in/out: | MDCT spectrum */ + Word16 *spectrum_e, /**< in/out: | exponent of spectrum */ + const Word16 igfGridIdx, /**< in: | in case of CELP->TCX switching, use 1.25 framelength */ + Word16 bfi /**< in: | frame loss == 1, frame good == 0 */ ); void IGFDecApplyMono_ivas( @@ -9107,6 +8702,7 @@ void IGFDecSetMode( const Word16 defaultStopLine, /* i : default stop subband index */ const Word16 rf_mode /* i : flag to signal the RF mode */ ); + void IGFDecSetMode_ivas_fx( const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i : instance handle of IGF Decoder */ const Word32 total_brate, /* i : bitrate */ @@ -9117,8 +8713,9 @@ void IGFDecSetMode_ivas_fx( const Word16 rf_mode /* i : flag to signal the RF mode */ ); -void IGFDecUpdateInfo( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ - const Word16 igfGridIdx /**< in: | IGF grid index */ +void IGFDecUpdateInfo( + const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ + const Word16 igfGridIdx /**< in: | IGF grid index */ ); void IGFDecUpdateInfo_ivas_fx( @@ -9127,10 +8724,11 @@ void IGFDecUpdateInfo_ivas_fx( const Word16 igfGridIdx /* i : IGF grid index */ ); -void IGFDecCopyLPCFlatSpectrum( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ - const Word32 *pSpectrumFlat, /**< in: Q31 | LPC flattend spectrum from TCX dec */ - const Word16 pSpectrumFlat_exp, /**< in: | exponent of pSpectrumFlat */ - const Word16 igfGridIdx /**< in: Q0 | IGF grid index */ +void IGFDecCopyLPCFlatSpectrum( + const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ + const Word32 *pSpectrumFlat, /**< in: Q31 | LPC flattend spectrum from TCX dec */ + const Word16 pSpectrumFlat_exp, /**< in: | exponent of pSpectrumFlat */ + const Word16 igfGridIdx /**< in: Q0 | IGF grid index */ ); void IGFDecCopyLPCFlatSpectrum_fx( @@ -9140,12 +8738,14 @@ void IGFDecCopyLPCFlatSpectrum_fx( const Word16 igfGridIdx /**< in: Q0 | IGF grid index */ ); -void IGFDecStoreTCX10SubFrameData( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ - const Word16 subFrameIdx /**< in: Q0 | index of subframe */ +void IGFDecStoreTCX10SubFrameData( + const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ + const Word16 subFrameIdx /**< in: Q0 | index of subframe */ ); -void IGFDecRestoreTCX10SubFrameData( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ - const Word16 subFrameIdx /**< in: Q0 | index of subframe */ +void IGFDecRestoreTCX10SubFrameData( + const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ + const Word16 subFrameIdx /**< in: Q0 | index of subframe */ ); void IGFDecRestoreTCX10SubFrameData_fx( @@ -9153,74 +8753,61 @@ void IGFDecRestoreTCX10SubFrameData_fx( const Word16 subFrameIdx /* i : index of subframe */ ); - void init_igf_dec( IGF_DEC_INSTANCE_HANDLE hIGFDec /* i/o: IGF decoder handle */ ); -// dlpc_avq_fx.c Word16 dlpc_avq_fx( Word16 *index, /* (i) Quantization indices */ Word16 *LSF_Q, /* (o) Quantized LSF vectors */ Word16 numlpc, /* (i) Number of sets of lpc */ Word32 sr_core ); + Word16 decode_lpc_avq_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word16 numlpc, /* i : Number of sets of lpc */ Word16 *param_lpc /* o : lpc parameters */ -#ifdef IVAS_CODE_AVQ_LPC - , - const Word16 ch, /* i : channel */ - const Word16 element_mode, /* i : element mode */ - const Word16 sns_low_br_mode /* i : SNS low-bitrate mode */ -#endif ); -// decode_lpc_avq_ivas_fx declaration with IVAS_CODE_AVQ_LPC enabled Word16 decode_lpc_avq_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word16 numlpc, /* i : Number of sets of lpc */ - Word16 *param_lpc /* o : lpc parameters */ - , + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 numlpc, /* i : Number of sets of lpc */ + Word16 *param_lpc, /* o : lpc parameters */ const Word16 ch, /* i : channel */ const Word16 element_mode, /* i : element mode */ const Word16 sns_low_br_mode /* i : SNS low-bitrate mode */ ); -// vlpc_1st_dec_fx.c + void vlpc_1st_dec( - Word16 index, /* i : codebook index */ + Word16 index, /* i : codebook index */ Word16 *lsfq ); /* i/o: i:prediction o:quantized lsf */ - -// vlpc_2st_dec_fx.c void vlpc_2st_dec( - Word16 *lsfq, /* i/o: i:1st stage o:1st+2nd stage */ + Word16 *lsfq, /* i/o: i:1st stage o:1st+2nd stage */ Word16 *indx, /* i : index[] (4 bits per words) */ Word16 mode, /* i : 0=abs, >0=rel */ Word32 sr_core ); -// vlpc_2st_com_fx.c -void lsf_weight_2st( const Word16 *lsfq, /* input: quantized lsf coefficients (14Q1*1.28) */ - Word16 *w, /* output: weighting function (0Q15*1.28) */ - const Word16 mode /* input: operational mode Q0 */ +void lsf_weight_2st( + const Word16 *lsfq, /* input: quantized lsf coefficients (14Q1*1.28) */ + Word16 *w, /* output: weighting function (0Q15*1.28) */ + const Word16 mode /* input: operational mode Q0 */ ); -// ACcontextMapping_fx.c - /* Returns: index of next coefficient */ Word16 get_next_coeff_mapped( - Word16 ii[2], /* i/o: coefficient indexes Q0*/ - Word16 *pp, /* o : peak(1)/hole(0) indicator Q0*/ - Word16 *idx, /* o : index in unmapped domain Q0*/ - CONTEXT_HM_CONFIG *hm_cfg /* i : HM configuration */ + Word16 ii[2], /* i/o: coefficient indexes Q0*/ + Word16 *pp, /* o : peak(1)/hole(0) indicator Q0*/ + Word16 *idx, /* o : index in unmapped domain Q0*/ + CONTEXT_HM_CONFIG *hm_cfg /* i : HM configuration */ ); /* Returns: index of next coefficient */ Word16 get_next_coeff_unmapped( - Word16 ii[2], /* i/o: coefficient indexes Q0*/ - Word16 *pp, /* o : peak(1)/hole(0) indicator Q0*/ - Word16 *idx, /* o : index in unmapped domain Q0*/ - CONTEXT_HM_CONFIG *hm_cfg /* i : HM configuration */ + Word16 ii[2], /* i/o: coefficient indexes Q0*/ + Word16 *pp, /* o : peak(1)/hole(0) indicator Q0*/ + Word16 *idx, /* o : index in unmapped domain Q0*/ + CONTEXT_HM_CONFIG *hm_cfg /* i : HM configuration */ ); Word16 update_mixed_context( @@ -9233,9 +8820,6 @@ Word32 update_mixed_context_ivas_fx( Word16 a /* Q0 */ ); - -// ACcontextMapping_dec_fx.c - typedef Word16 ( *get_next_coeff_function )( Word16 ii[2], /* i/o: coefficient indexes */ Word16 *pp, /* o : peak(1)/hole(0) indicator */ @@ -9251,6 +8835,7 @@ Word16 ACcontextMapping_decode2_no_mem_s17_LC( Word16 resQMaxBits, /* i: residual coding maximum bits*/ CONTEXT_HM_CONFIG *hm_cfg /* i: context-based harmonic model configuration */ ); + Word16 RCcontextMapping_decode2_no_mem_s17_LCS_fx( Decoder_State *st, /* i/o: decoder state */ Word16 *x, /* o : decoded spectrum */ @@ -9260,7 +8845,6 @@ Word16 RCcontextMapping_decode2_no_mem_s17_LCS_fx( CONTEXT_HM_CONFIG *hm_cfg /* i : context-based harmonic model configuration*/ ); -// core_dec_reconf_fx.c void reconfig_decoder_LPD_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 bits_frame, /* i : bit budget Q0*/ @@ -9268,42 +8852,37 @@ void reconfig_decoder_LPD_fx( Word32 total_brate, /* i : total bitrate Q0*/ Word16 L_frame_old /* i : frame length Q0*/ ); + void reconfig_decoder_LPD_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ + Decoder_State *st, /* i/o: decoder state structure */ const Word16 bits_frame, /* i : bit budget Q0*/ const Word16 bwidth, /* i : audio bandwidth Q0*/ const Word32 total_brate, /* i : total bitrate Q0*/ const Word16 L_frame_old /* i : frame length Q0*/ ); -// er_utils_fx.c -void minimumStatistics_fx( Word16 *noiseLevelMemory, /* Q15, internal state */ - Word16 *noiseLevelIndex, /* Q0, internal state */ - Word16 *currLevelIndex, /* Q0, internal state (circular buffer) */ - Word16 *noiseEstimate, /* Q15, previous estimate of background noise */ - Word16 *lastFrameLevel, /* Q15, level of the last frame */ - Word16 currentFrameLevel, /* Q15, level of the current frame */ - Word16 *noiseLevelMemory_e, /* scaling factor for noiseLevelMemory */ - Word16 const noiseEstimate_e, /* exponent of noiseEstimate */ - Word16 *new_noiseEstimate_e, /* new exponent of noise Estimate*/ - Word16 *const lastFrameLevel_e, /* exponent of lastFrameLevel */ - Word16 currentFrameLevel_e ); /* exponent of currentFrameLevel */ - - -Word16 getLevelSynDeemph_fx( /*10Q5*/ - Word16 h1Init[], - /* i: i value or vector to be processed */ /* Q15 */ - Word16 const A[], - /* i: LPC coefficients */ /* Qx */ - Word16 const lpcorder, - /* i: LPC order */ /* Q0 */ - Word16 const lenLpcExc, - /* i: length of the LPC excitation buffer */ /* Q0 */ - Word16 const preemph_fac, - /* i: preemphasis factor */ /* Q15 */ - Word16 const numLoops, - /* i: number of loops */ /* Q0 */ - Word16 *Exp /* o: exponent of return value Q15 */ +void minimumStatistics_fx( + Word16 *noiseLevelMemory, /* Q15, internal state */ + Word16 *noiseLevelIndex, /* Q0, internal state */ + Word16 *currLevelIndex, /* Q0, internal state (circular buffer) */ + Word16 *noiseEstimate, /* Q15, previous estimate of background noise */ + Word16 *lastFrameLevel, /* Q15, level of the last frame */ + Word16 currentFrameLevel, /* Q15, level of the current frame */ + Word16 *noiseLevelMemory_e, /* scaling factor for noiseLevelMemory */ + Word16 const noiseEstimate_e, /* exponent of noiseEstimate */ + Word16 *new_noiseEstimate_e, /* new exponent of noise Estimate*/ + Word16 *const lastFrameLevel_e, /* exponent of lastFrameLevel */ + Word16 currentFrameLevel_e ); /* exponent of currentFrameLevel */ + +/*10Q5*/ +Word16 getLevelSynDeemph_fx( + Word16 h1Init[], /* i: i value or vector to be processed Q15 */ + Word16 const A[], /* i: LPC coefficients Qx */ + Word16 const lpcorder, /* i: LPC order Q0 */ + Word16 const lenLpcExc, /* i: length of the LPC excitation buffer Q0 */ + Word16 const preemph_fac, /* i: preemphasis factor Q15 */ + Word16 const numLoops, /* i: number of loops Q0 */ + Word16 *Exp /* o: exponent of return value Q15 */ ); void genPlcFiltBWAdap_fx( @@ -9321,9 +8900,9 @@ void highPassFiltering_fx( const Word16 l_fir_fer ); /* i: high pass filter length */ -Word16 GetPLCModeDecision_fx( Decoder_State *st ); +Word16 GetPLCModeDecision_fx( + Decoder_State *st ); -// dlpc_stoch_fx.c void lpc_unquantize_fx( Decoder_State *st, Word16 *lsf, @@ -9336,7 +8915,6 @@ void lpc_unquantize_fx( Word16 *LSF_Q_prediction /* o : LSF prediction mode */ ); -// dlpc_bfi_fx.c void dlpc_bfi( const Word16 L_frame, Word16 *lsf_q, /* o : quantized LSFs */ @@ -9355,7 +8933,6 @@ void dlpc_bfi( const Word16 *lsfBase, /* i : base for differential LSF coding */ Word8 tcxonly ); -// guided_plc_util_fx.c void getLookAheadResSig( Word16 *speechLookAhead, /* Qx */ Word16 *A_3Q12, /* 3Q12 */ @@ -9363,10 +8940,12 @@ void getLookAheadResSig( const Word16 L_frame, /* Q0 */ const Word16 numSubFrame /* Q0 */ ); + void updateLSFForConcealment( PLC_ENC_EVS_HANDLE decState, Word16 *lsf_14Q1 /* 14Q1 */ ); + void getConcealedLP( PLC_ENC_EVS_HANDLE memDecState, Word16 *AqCon, /* 14Q1 */ @@ -9374,6 +8953,7 @@ void getConcealedLP( const Word16 last_good, /* Q0 */ const Word16 L_frame /* Q0 */ ); + void getConcealedLSF( PLC_ENC_EVS_HANDLE memDecState, const Word16 lsfBase[], /* Q1 * 1.28 */ @@ -9396,36 +8976,21 @@ void modify_lsf( const Word16 reset_q /* Q0 */ ); -// er_dec_tcx_fx.c void con_tcx_fx( - Decoder_State *st, /* i/o: coder memory state */ - Word16 synth[] /* i/o: synth[] */ /*Q0 */ -#ifdef IVAS_CODE_CON_TCX - , - const Word16 coh, /* i : coherence of stereo signal */ - Word16 *noise_seed, /* i/o: noise seed for stereo */ - const Word16 only_left /* i : TD-PLC only in left channel */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - , - const float *A_cng /* i : CNG LP filter coefficients */ -#endif -#endif - + Decoder_State *st, /* i/o: coder memory state */ + Word16 synth[] /* i/o: synth[] Q0 */ ); -// er_scale_sync.c -Word16 Damping_fact_fx( /* o : damping factor */ /*Q14*/ - const Word16 coder_type, /* i : coding type in last good received frame */ - const Word16 nbLostCmpt, /* i : counter of consecutive bfi frames */ - const Word16 last_good, /* i : last good frame class */ - const Word16 stab_fac, - /* i : ISF stability factor */ /*Q15*/ - Word32 *lp_gainp, - /*i/o: damped pitch gain */ /*Q16 Word32!*/ - const Word16 core /* i : current coding mode */ +/* o : damping factor Q14*/ +Word16 Damping_fact_fx( + const Word16 coder_type, /* i : coding type in last good received frame */ + const Word16 nbLostCmpt, /* i : counter of consecutive bfi frames */ + const Word16 last_good, /* i : last good frame class */ + const Word16 stab_fac, /* i : ISF stability factor Q15*/ + Word32 *lp_gainp, /*i/o: damped pitch gain Q16 Word32!*/ + const Word16 core /* i : current coding mode */ ); -// dec_tcx_fx.c void decoder_tcx_fx( TCX_CONFIG_HANDLE hTcxCfg, Word16 prm[], /* i : parameters */ @@ -9450,17 +9015,18 @@ void decoder_tcx_ivas_fx( Word16 Aind[], Word16 synth_fx[], Word16 synthFB_fx[], + Word16 *synth_q, const Word16 bfi, const Word16 frame_cnt, const Word16 sba_dirac_stereo_flag ); -void decoder_tcx_post_fx( Decoder_State *st_fx, - Word16 *synth, - Word16 *synthFB, - Word16 *A, - Word16 bfi ); +void decoder_tcx_post_fx( + Decoder_State *st_fx, + Word16 *synth, + Word16 *synthFB, + Word16 *A, + Word16 bfi ); -// arith_coder_dec_fx.c void tcx_arith_decode_envelope_fx( Word32 q_spectrum[], /* o: quantised MDCT coefficients Q31-e */ Word16 *q_spectrum_e, /* o: MDCT exponent Q0 */ @@ -9475,13 +9041,10 @@ void tcx_arith_decode_envelope_fx( Word16 tcxltp_pitch, /* i: TCX LTP pitch in FD, -1 if n/a*/ Word16 *arith_bits, /* o: bits used for ari. coding */ Word16 *signaling_bits, /* o: bits used for signaling */ - Word16 *nf_seed /* o: noise filling seed Q0 */ - , - Word16 low_complexity /* i: low-complexity flag Q0 */ - + Word16 *nf_seed, /* o: noise filling seed Q0 */ + Word16 low_complexity /* i: low-complexity flag Q0 */ ); -// tcx_utils_dec_fx.c void tcx_decoder_memory_update( Word16 *xn_buf, /* i/o: mdct output buffer used also as temporary buffer : Q0 */ Word16 *synthout, /* o: synth : Q0 */ @@ -9518,7 +9081,6 @@ Word16 tcx_res_invQ_spec( const Word16 lf_deemph_factors[] /*i : LF deemphasis factors Q14*/ ); -// er_dec_acelp_fx.c void con_acelp_fx( const Word16 A[], /*mem_syn >rescaling done */ - , + Word16 *Qf_mem_syn, /*mem_syn >rescaling done */ Word16 *pitch_buffer, Word16 *voice_factors, Word16 *bwe_exc ); -// dec_ace_fx.c void decoder_acelp_fx( Decoder_State *st, Word16 prm[], /* i : parameters */ @@ -9550,7 +9110,6 @@ void decoder_acelp_fx( Word16 *bwe_exc /* out: excitation for SWB TBE */ ); -// d_gain2p.c void decode_acelp_gains_fx( Word16 *code, Word16 gains_mode, @@ -9570,33 +9129,7 @@ void d_gain_pred_fx( Word16 *Es_pred, /* o : predicited scaled innovation energy */ Word16 **pt_indice /* i/o: pointer to the buffer of indices */ ); -// acelp_core_dec_fx.c -ivas_error acelp_core_dec_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 output[], /* o : synthesis @internal Fs */ - Word16 synth_out[], /* o : synthesis */ - Word16 save_hb_synth[], /* o : HB synthesis */ - Word32 bwe_exc_extended[], /* i/o: bandwidth extended excitation */ - Word16 *voice_factors, /* o : voicing factors */ - Word16 old_syn_12k8_16k[], /* o : intermediate ACELP synthesis for SWB BWE */ - Word16 sharpFlag, - Word16 pitch_buf_fx[NB_SUBFR16k], /* o : floating pitch for each subframe */ - Word16 *unbits, /* o : number of unused bits */ - Word16 *sid_bw /* o : 0-NB/WB, 1-SWB SID */ - , - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const Word16 tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ - const Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ - const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ - const Word16 last_element_mode, /* i : last element mode */ - const Word32 last_element_brate, /* i : last element bitrate */ - const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel */ - const Word16 nchan_out, /* i : number of output channels */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ - const Word16 read_sid_info /* i : read SID info flag */ -); -// evs_dec_fx.c ivas_error evs_dec_fx( Decoder_State *st_fx, /* i/o : Decoder state structure */ Word16 output_sp[], /* o : output synthesis signal */ @@ -9609,15 +9142,15 @@ void fft_cldfb_fx( ); void stereo_dft_dec_analyze_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const Word32 *input_fx, /* i : input signal q*/ - Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers q_out_DFT*/ - const Word16 chan, /* i : channel number Q0*/ - const Word16 input_frame, /* i : input frame size Q0*/ - const Word16 output_frame, /* i : output frame size Q0*/ - const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */ - const Word16 k_offset, /* i : offset of DFT Q0*/ - const Word16 delay, /* i : delay in samples FOR input signal Q0*/ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const Word32 *input_fx, /* i : input signal q*/ + Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers q_out_DFT*/ + const Word16 chan, /* i : channel number Q0*/ + const Word16 input_frame, /* i : input frame size Q0*/ + const Word16 output_frame, /* i : output frame size Q0*/ + const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */ + const Word16 k_offset, /* i : offset of DFT Q0*/ + const Word16 delay, /* i : delay in samples FOR input signal Q0*/ Word16 *q, Word16 *q_DFT ); @@ -9635,34 +9168,34 @@ void delay_signal_q_adj_fx( const Word16 q_x, const Word16 q_mem ); -Word32 anint_fixed( - Word32 x, /* i: Round to the nearest integer */ - Word16 exp /* i: Exponent for round step */ +Word32 anint_fx( + const Word32 x, /* i: Round to the nearest integer */ + const Word16 exp /* i: Exponent for round step */ ); -Word32 ceil_fixed( - Word32 x, /* i: number to ceil */ - Word16 exp /* i: Exponent for ceil step */ +Word32 ceil_fx( + const Word32 x, /* i: number to ceil */ + const Word16 exp /* i: Exponent for ceil step */ ); void v_add_fx( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ - const int16_t N /* i : Vector length */ + const Word16 N /* i : Vector length */ ); void v_shr_16( const Word16 x[], /* i : Input vector */ const Word16 shift, /* i : Constant */ - Word16 y[], /* o : Output vector that contains x >> shift */ + Word16 y[], /* o : Output vector that contains x >> shift */ const Word16 N /* i : Vector length */ ); void v_shr( const Word32 x[], /* i : Input vector */ const Word16 shift, /* i : Constant */ - Word32 y[], /* o : Output vector that contains x >> shift */ + Word32 y[], /* o : Output vector that contains x >> shift */ const Word16 N /* i : Vector length */ ); @@ -9673,42 +9206,38 @@ void cldfbAnalysis_ts_fx( const Word16 samplesToProcess, /* i : samples to process */ HANDLE_CLDFB_FILTER_BANK h_cldfb, Word16 *q_cldfb ); -Word16 floor_log_2( Word32 num ); + +Word16 floor_log_2( + Word32 num ); void cldfbAnalysis_ts_fx_var_q( - const Word32 *timeIn_fx, - /* i : time buffer */ // q - Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX], - /* o : real value buffer */ // q_cldfb - 5 - Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX], - /* o : imag value buffer */ // q_cldfb - 5 - const Word16 samplesToProcess, /* i : samples to process */ - HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ + const Word32 *timeIn_fx, /* i : time buffer q */ + Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : real value buffer q_cldfb - 5 */ + Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : imag value buffer q_cldfb - 5 */ + const Word16 samplesToProcess, /* i : samples to process */ + HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ Word16 *q_cldfb ); void cldfbAnalysis_ts_fx_fixed_q( - const Word32 *timeIn_fx, - /* i : time buffer */ // q - Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX], - /* o : real value buffer */ // q - 5 - Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX], - /* o : imag value buffer */ // q - 5 - const Word16 samplesToProcess, /* i : samples to process */ - HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ + const Word32 *timeIn_fx, /* i : time buffer q */ + Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : real value buffer q - 5 */ + Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : imag value buffer q - 5 */ + const Word16 samplesToProcess, /* i : samples to process */ + HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ Word16 *q_cldfb ); void configureCldfb_ivas_fx( HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle */ const Word32 sampling_rate /* i : sampling rate */ ); -// dec4t64.c + void dec_acelp_fast_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const int16_t cdk_index, /* i : codebook index */ - Word16 code[], /* o : algebraic (fixed) codebook excitation */ - const int16_t L_subfr /* i : subframe length */ + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 cdk_index, /* i : codebook index */ + Word16 code[], /* o : algebraic (fixed) codebook excitation */ + const Word16 L_subfr /* i : subframe length */ ); -// codec_tcx_common.c + void tcx5SpectrumInterleaving_fx( const Word16 tcx5Size, Word32 *spectrum ); @@ -9728,7 +9257,6 @@ void tcx5TnsUngrouping_fx( Word32 *spectrum, const Word16 enc_dec ); -// bass_psfilter.c void bpf_pitch_coherence_ivas_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word32 pitch_buf[] /* i : pitch for each subframe [0,1,2,3] */ @@ -9744,30 +9272,28 @@ void cldfbAnalysis_ivas_fx( const Word32 *timeIn_fx, /* i : time buffer Qx */ Word32 **realBuffer_fx, /* o : real value buffer Qx - 5*/ Word32 **imagBuffer_fx, /* o : imag value buffer QX - 5*/ - const int16_t samplesToProcess, /* i : samples to process */ + const Word16 samplesToProcess, /* i : samples to process */ HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filterbank state */ ); void cldfbSynthesis_ivas_fx( - Word32 **realBuffer_fx, /* i : real values Qx*/ - Word32 **imagBuffer_fx, /* i : imag values Qx*/ - Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/ - const Word16 samplesToProcess, /* i : number of processed samples */ -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - const Word16 shift, /* i : scale for state buffer */ -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + Word32 **realBuffer_fx, /* i : real values Qx*/ + Word32 **imagBuffer_fx, /* i : imag values Qx*/ + Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/ + const Word16 samplesToProcess, /* i : number of processed samples */ + const Word16 shift, /* i : scale for state buffer */ + const Word16 out_shift, /* i : scale for output buffer */ HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filter bank state */ ); -// bass_psfilter.c void addBassPostFilter_ivas_fx( const Word32 *harm_timeIn_fx, - const int16_t samplesToProcess, + const Word16 samplesToProcess, Word32 **rAnalysis_fx, Word32 **iAnalysis_fx, HANDLE_CLDFB_FILTER_BANK cldfb ); -/* o : Q22*/ +/* o : Q22*/ Word32 ism_dequant_meta_fx( const Word16 idx, /* i : quantizer index */ const Word32 borders_fx[], /* i : level borders Q22*/ @@ -9827,16 +9353,46 @@ void generate_masking_noise_dirac_ivas_fx( const Word16 fd_cng_flag, /* i : FD-CNG flag for HB */ Word16 q_input, Word16 *q_cldfb ); -// modif_fs/c -void IMDCT_fx( Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_TDAC, Word16 *xn_buf, const Word16 *tcx_aldo_window_1, const PWord16 *tcx_aldo_window_1_trunc, const PWord16 *tcx_aldo_window_2, const PWord16 *tcx_mdct_window_half, const PWord16 *tcx_mdct_window_minimum, const PWord16 *tcx_mdct_window_trans, Word16 tcx_mdct_window_half_length, Word16 tcx_mdct_window_min_length, Word16 index, Word16 left_rect, Word16 tcx_offset, Word16 overlap, Word16 L_frame, Word16 L_frameTCX, Word16 L_spec_TCX5, Word16 L_frame_glob, Word16 frame_cnt, Word16 bfi, Word16 *old_out, Word16 *Q_old_wtda, Decoder_State *st, Word16 fullbandScale, Word16 *acelp_zir ); +void IMDCT_fx( + Word32 *x, + Word16 x_e, + Word16 *old_syn_overl, + Word16 *syn_Overl_TDAC, + Word16 *xn_buf, + const Word16 *tcx_aldo_window_1, + const PWord16 *tcx_aldo_window_1_trunc, + const PWord16 *tcx_aldo_window_2, + const PWord16 *tcx_mdct_window_half, + const PWord16 *tcx_mdct_window_minimum, + const PWord16 *tcx_mdct_window_trans, + Word16 tcx_mdct_window_half_length, + Word16 tcx_mdct_window_min_length, + Word16 index, + Word16 left_rect, + Word16 tcx_offset, + Word16 overlap, + Word16 L_frame, + Word16 L_frameTCX, + Word16 L_spec_TCX5, + Word16 L_frame_glob, + Word16 frame_cnt, + Word16 bfi, + Word16 *old_out, + Word16 *Q_old_wtda, + Decoder_State *st, + Word16 fullbandScale, + Word16 *acelp_zir ); void IMDCT_ivas_fx( Word32 *x_fx, Word16 q_x, Word16 *old_syn_overl_fx, + Word16 *Q_old_syn_overl_fx, Word16 *syn_Overl_TDAC_fx, + Word16 *Q_syn_Overl_TDAC_fx, Word16 *xn_buf_fx, + Word16 q_xn_buf_fx, const Word16 *tcx_aldo_window_1_fx, const PWord16 *tcx_aldo_window_1_trunc_fx, const PWord16 *tcx_aldo_window_2_fx, @@ -9857,13 +9413,15 @@ void IMDCT_ivas_fx( const Word16 frame_cnt, const Word16 bfi, Word16 *old_out_fx, + Word16 *q_old_out_fx, const Word16 FB_flag, Decoder_State *st, const Word16 fullbandScale, Word16 *acelp_zir_fx, - Word16 q_win ); + Word16 *q_acelp_zir_fx, + Word16 *pq_win ); -void v_mult16_fixed( +void v_mult16_fx( const Word16 x1[], /* i : Input vector 1 */ const Word16 x2[], /* i : Input vector 2 */ Word16 y[], /* o : Output vector that contains vector 1 .* vector 2 */ @@ -9878,11 +9436,11 @@ void configureFdCngDec_fx( const Word16 last_L_frame, const Word16 element_mode ); - Word32 sum2_f_16_fx( const Word16 *vec, /* i : input vector */ const Word16 lvec /* i : length of input vector */ ); + Word32 sum2_f_16_gb_fx( const Word16 *vec, /* i : input vector */ const Word16 lvec, /* i : length of input vector */ @@ -9899,8 +9457,8 @@ Word16 vq_dec_lvq_ivas_fx( Word16 indices[], /* i : Indices */ Word16 stages, /* i : Number of stages */ Word16 N, /* i : Vector dimension */ - Word16 mode, /* (i): mode_lvq, or mode_lvq_p */ - Word16 no_bits /* (i): no. bits for lattice */ + Word16 mode, /* (i): mode_lvq, or mode_lvq_p */ + Word16 no_bits /* (i): no. bits for lattice */ ); Word16 deindex_lvq_ivas_fx( @@ -9911,8 +9469,7 @@ Word16 deindex_lvq_ivas_fx( Word16 no_bits /* i : number of bits for lattice */ ); - -void deleteCldfb_ivas_fx( +void deleteCldfb_fx( HANDLE_CLDFB_FILTER_BANK *h_cldfb /* i/o: filter bank handle */ ); @@ -9922,14 +9479,14 @@ void fd_bwe_dec_init_fx( void stereo_dft_dec_open( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const int32_t output_Fs, /* i : output sampling rate */ - const int16_t nchan_transport /* i : number of transport channels */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 nchan_transport /* i : number of transport channels */ ); void ivas_bw_switching_pre_proc_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word32 last_element_brate, /* i : last element bitrate */ - const Word16 nchan_out /* i : number of output channels */, + const Word16 nchan_out, /* i : number of output channels */ Word32 *old_syn_12k8_16k_fx, Word16 Q, Word16 Q_audio ); @@ -9941,32 +9498,30 @@ UWord32 mvl2s_r( const Word16 n /* i : vector size */ ); -void decoder_tcx_post_ivas_fx( Decoder_State *st_fx, - Word16 *synth, - Word16 *synthFB, - Word16 Q_syn, - Word16 *A, - Word16 bfi, - Word16 MCT_flag ); +void decoder_tcx_post_ivas_fx( + Decoder_State *st_fx, + Word16 *synth, + Word16 *synthFB, + Word16 Q_syn, + Word16 *A, + Word16 bfi, + Word16 MCT_flag ); void con_tcx_ivas_fx( - Decoder_State *st, /* i/o: coder memory state */ - Word16 synth[], - /* i/o: synth[] */ /*Q0 */ - const Word16 coh, /* i : coherence of stereo signal */ - Word16 *noise_seed, /* i/o: noise seed for stereo */ - const Word16 only_left, /* i : TD-PLC only in left channel */ - const Word16 *A_cng /* i : CNG LP filter coefficients */ + Decoder_State *st, /* i/o: coder memory state */ + Word16 synth[], /* i/o: synth[] Q0 */ + const Word16 coh, /* i : coherence of stereo signal */ + Word16 *noise_seed, /* i/o: noise seed for stereo */ + const Word16 only_left, /* i : TD-PLC only in left channel */ + const Word16 *A_cng /* i : CNG LP filter coefficients */ ); void ivas_mdct_core_reconstruct_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *x_fx[][NB_DIV], - /* i/o: synthesis @internal_FS */ // Q(q_x) - Word16 signal_outFB_fx[CPE_CHANNELS][L_FRAME_PLUS], - /* o : synthesis @output_FS */ // e_sig - Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *x_fx[][NB_DIV], /* i/o: synthesis @internal_FS Q(q_x) */ + Word16 signal_outFB_fx[CPE_CHANNELS][L_FRAME_PLUS], /* o : synthesis @output_FS e_sig */ + Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ Word16 q_x, Word16 e_sig[CPE_CHANNELS] ); @@ -9986,45 +9541,57 @@ void tcx_scalar_quantization_ivas_fx( Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( Word16 *x, /* Spectral coefficients Q0*/ - const Word16 nt, /* L - size of spectrum (no. of spectral coefficients) Q0*/ + const Word16 nt, /* L - size of spectrum (no. of spectral coefficients) Q0*/ Word16 *lastnz_out, /* Q0 */ Word16 *nEncoded, /* No. of spectral coefficients that can be coded without an overflow occuring Q0*/ - const Word16 target, /* Target bits Q0*/ + const Word16 target, /* Target bits Q0*/ Word16 *stop, /* Q0 */ Word16 mode, /* Q0 */ CONTEXT_HM_CONFIG *hm_cfg /* context-based harmonic model configuration */ ); -Word16 usdequant_fx( /* Qx*/ - const Word16 idx, /* i: quantizer index Q0*/ - const Word16 qlow, /* i: lowest codebook entry (index 0) Qx*/ - const Word16 delta /* i: quantization step Qy*/ +/* Qx*/ +Word16 usdequant_fx( + const Word16 idx, /* i: quantizer index Q0*/ + const Word16 qlow, /* i: lowest codebook entry (index 0) Qx*/ + const Word16 delta /* i: quantization step Qy*/ ); -Word16 usquant_fx( /* o: index of the winning codeword */ - const Word16 x, /* i: scalar value to quantize Qx*/ - Word16 *xq, /* o: quantized value Qx*/ - const Word16 qlow, /* i: lowest codebook entry (index 0) Qx*/ - const Word16 delta, /* i: quantization step Qx-1*/ - const Word16 cbsize /* i: codebook size */ +/* Qx*/ +Word32 usdequant32_fx( + const Word16 idx, /* i: quantizer index Q0*/ + const Word32 qlow, /* i: lowest codebook entry (index 0) Qx*/ + const Word32 delta /* i: quantization step Qy*/ ); -Word32 Dot_product( /* o : Sum */ - const Word16 x[], /* i : 12bits: x vector */ - const Word16 y[], /* i : 12bits: y vector */ - const Word16 lg /* i : vector length */ +/* o: index of the winning codeword */ +Word16 usquant_fx( + const Word16 x, /* i: scalar value to quantize Qx*/ + Word16 *xq, /* o: quantized value Qx*/ + const Word16 qlow, /* i: lowest codebook entry (index 0) Qx*/ + const Word16 delta, /* i: quantization step Qx-1*/ + const Word16 cbsize /* i: codebook size */ ); -Word32 dotp_fx( /* o : dot product of x[] and y[] */ - const Word16 x[], /* i : vector x[] */ - const Word16 y[], /* i : vector y[] */ - const Word16 n, /* i : vector length */ - Word16 *exp /* (o) : exponent of result (0..+30) */ +/* o : Sum */ +Word32 Dot_product( + const Word16 x[], /* i : 12bits: x vector */ + const Word16 y[], /* i : 12bits: y vector */ + const Word16 lg /* i : vector length */ ); -Word32 sum2_fx_mod( /* o : sum of all squared vector elements Q(2x+1)*/ - const Word16 *vec, /* i : i vector Qx*/ - const Word16 lvec /* i : length of i vector */ +/* o : dot product of x[] and y[] */ +Word32 dotp_fx( + const Word16 x[], /* i : vector x[] */ + const Word16 y[], /* i : vector y[] */ + const Word16 n, /* i : vector length */ + Word16 *exp /* (o) : exponent of result (0..+30) */ +); + +/* o : sum of all squared vector elements Q(2x+1)*/ +Word32 sum2_fx_mod( + const Word16 *vec, /* i : i vector Qx*/ + const Word16 lvec /* i : length of i vector */ ); void Copy_Scale_sig( @@ -10047,6 +9614,13 @@ void Copy_Scale_sig_16_32_DEPREC( const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ ); +void Copy_Scale_sig_16_32_r( + const Word16 x[], /* i : signal to scale input Qx */ + Word32 y[], /* o : scaled signal output Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +); + void Copy_Scale_sig_16_32_no_sat( const Word16 x[], /* i : signal to scale input Qx */ Word32 y[], /* o : scaled signal output Qx */ @@ -10068,19 +9642,23 @@ void Random_Fill( Word16 scaling /* i : scaling of values */ ); -Word16 mean_fx( /* o : mean of vector */ - const Word16 *vec_fx, /* i : i vector */ - const Word16 lvec_fx /* i : length of i vector */ +/* o : mean of vector */ +Word16 mean_fx( + const Word16 *vec_fx, /* i : i vector */ + const Word16 lvec_fx /* i : length of i vector */ ); -Word16 mean_no_sat_fx( /* o : mean of vector Qx */ - const Word16 *vec_fx, /* i : input vector Qx */ - const Word16 lvec_fx /* i : length of input vector */ +/* o : mean of vector Qx */ +Word16 mean_no_sat_fx( + const Word16 *vec_fx, /* i : input vector Qx */ + const Word16 lvec_fx /* i : length of input vector */ ); -Word32 mean_no_sat_Word32_fx( /* o : mean of vector Qx */ - const Word32 *vec_fx, /* i : input vector Qx */ - const Word16 lvec_fx, /* i : length of input vector */ - const Word16 gb ); + +/* o : mean of vector Qx */ +Word32 mean_no_sat_Word32_fx( + const Word32 *vec_fx, /* i : input vector Qx */ + const Word16 lvec_fx, /* i : length of input vector */ + const Word16 gb ); void sort( UWord16 *x, /* i/o: Vector to be sorted */ UWord16 len /* i/o: vector length */ @@ -10098,52 +9676,60 @@ void sort_32_fx( const Word16 up /* I : High limit of sorting range */ ); -Word16 minimum_fx( /* o : index of the minimum value in the input vector */ - const Word16 *vec_fx, /* i : input vector */ - const Word16 lvec_fx, /* i : length of input vector */ - Word16 *min_fx /* o : minimum value in the input vector */ +/* o : index of the minimum value in the input vector */ +Word16 minimum_fx( + const Word16 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word16 *min_fx /* o : minimum value in the input vector */ ); -Word16 maximum_fx( /* o : index of the maximum value in the input vector */ - const Word16 *vec_fx, /* i : input vector */ - const Word16 lvec_fx, /* i : length of input vector */ - Word16 *max_fx /* o : maximum value in the input vector */ +/* o : index of the maximum value in the input vector */ +Word16 maximum_fx( + const Word16 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word16 *max_fx /* o : maximum value in the input vector */ ); -Word16 maximum_exp_fx( /* o : index of the maximum value in the input vector */ - const Word16 *vec_fx, /* i : input vector */ - const Word16 *exp_vec, /* i : exponents of input vector */ - const Word16 lvec_fx /* i : length of input vector */ +/* o : index of the maximum value in the input vector */ +Word16 maximum_exp_fx( + const Word16 *vec_fx, /* i : input vector */ + const Word16 *exp_vec, /* i : exponents of input vector */ + const Word16 lvec_fx /* i : length of input vector */ ); -Word16 maximum_abs_16_fx( /* o : index of the maximum abs value in the input vector */ - const Word16 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word16 *max_val /* o : maximum value in the input vector */ +/* o : index of the maximum abs value in the input vector */ +Word16 maximum_abs_16_fx( + const Word16 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word16 *max_val /* o : maximum value in the input vector */ ); -Word16 minimum_abs32_fx( /* o : index of the minimum value in the input vector */ - const Word32 *vec_fx, /* i : input vector */ - const Word16 lvec_fx, /* i : length of input vector */ - Word32 *min_fx /* o : minimum value in the input vector */ +/* o : index of the minimum value in the input vector */ +Word16 minimum_abs32_fx( + const Word32 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word32 *min_fx /* o : minimum value in the input vector */ ); -Word16 minimum_32_fx( /* o : index of the minimum value in the input vector */ - const Word32 *vec_fx, /* i : input vector */ - const Word16 lvec_fx, /* i : length of input vector */ - Word32 *min_fx /* o : minimum value in the input vector */ +/* o : index of the minimum value in the input vector */ +Word16 minimum_32_fx( + const Word32 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word32 *min_fx /* o : minimum value in the input vector */ ); -Word16 maximum_32_fx( /* o : index of the maximum value in the input vector */ - const Word32 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word32 *max_val /* o : maximum value in the input vector */ +/* o : index of the maximum value in the input vector */ +Word16 maximum_32_fx( + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word32 *max_val /* o : maximum value in the input vector */ ); -Word16 maximum_abs_32_fx( /* o : index of the maximum value in the input vector */ - const Word32 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word32 *max_val /* o : maximum value in the input vector */ +/* o : index of the maximum value in the input vector */ +Word16 maximum_abs_32_fx( + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word32 *max_val /* o : maximum value in the input vector */ ); /*! r: index of the maximum value in the input vector */ @@ -10170,42 +9756,50 @@ Word16 Exp32Array( const Word32 *sx /* (i): Data array */ ); -Word32 sum16_32_fx( /* o : sum of all vector elements Qx*/ - const Word16 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ +/* o : sum of all vector elements Qx*/ +Word32 sum16_32_fx( + const Word16 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ ); -Word32 sum32_sat( /* o : sum of all vector elements Qx*/ - const Word32 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ +/* o : sum of all vector elements Qx*/ +Word32 sum32_sat( + const Word32 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ ); -Word32 var_fx_32( /* o: variance of vector Qx+16*/ - const Word16 *x, /* i: input vector Qx*/ - const Word16 Qx, - const Word16 len /* i: length of inputvector */ -); -Word32 var_fx_32in_32out( /* o: variance of vector Qx+16*/ - const Word32 *x, /* i: input vector Qx*/ - Word16 *Qx, - const Word16 len, /* i: length of inputvector */ - const Word16 gb ); -Word16 var_fx( /* o: variance of vector Qx*/ - const Word16 *x, /* i: input vector Qx*/ - const Word16 Qx, - const Word16 len /* i: length of inputvector */ +/* o: variance of vector Qx+16*/ +Word32 var_fx_32( + const Word16 *x, /* i: input vector Qx*/ + const Word16 Qx, + const Word16 len /* i: length of inputvector */ ); -Word16 std_fx( /* o: standard deviation */ - const Word16 x[], /* i: input vector */ - const Word16 len /* i: length of the input vector */ +/* o: variance of vector Qx+16*/ +Word32 var_fx_32in_32out( + const Word32 *x, /* i: input vector Qx*/ + Word16 *Qx, + const Word16 len, /* i: length of inputvector */ + const Word16 gb ); + +/* o: variance of vector Qx*/ +Word16 var_fx( + const Word16 *x, /* i: input vector Qx*/ + const Word16 Qx, + const Word16 len /* i: length of inputvector */ ); -Word32 dot_product_mat_fx( /* o : the dot product x'*A*x */ - const Word16 *x, /* i : vector x Q15 */ - const Word32 *A, /* i : matrix A Q0*/ - const Word16 m /* i : vector & matrix size */ +/* o: variance of vector Qx*/ +Word16 std_fx( + const Word16 x[], /* i: input vector */ + const Word16 len /* i: length of the input vector */ +); +/* o : the dot product x'*A*x */ +Word32 dot_product_mat_fx( + const Word16 *x, /* i : vector x Q15 */ + const Word32 *A, /* i : matrix A Q0*/ + const Word16 m /* i : vector & matrix size */ ); void Vr_subt( @@ -10215,22 +9809,24 @@ void Vr_subt( Word16 N /* i : Vector lenght */ ); -Word16 vquant_ivas_fx( /* o: index of the winning codevector */ - Word32 x[], /* i: vector to quantize Q25 */ - const Word32 x_mean[], /* i: vector mean to subtract (0 if none) Q25 */ - Word32 xq[], /* o: quantized vector Q25 */ - const Word32 cb[], /* i: codebook Q25 */ - const Word16 dim, /* i: dimension of codebook vectors */ - const Word16 cbsize /* i: codebook size */ +/* o: index of the winning codevector */ +Word16 vquant_ivas_fx( + Word32 x[], /* i: vector to quantize Q25 */ + const Word32 x_mean[], /* i: vector mean to subtract (0 if none) Q25 */ + Word32 xq[], /* o: quantized vector Q25 */ + const Word32 cb[], /* i: codebook Q25 */ + const Word16 dim, /* i: dimension of codebook vectors */ + const Word16 cbsize /* i: codebook size */ ); -Word16 vquant_fx( /* o: index of the winning codevector */ - Word16 x[], /* i: vector to quantize Q13 */ - const Word16 x_mean[], /* i: vector mean to subtract (0 if none)Q13*/ - Word16 xq[], /* o: quantized vector Q13 */ - const Word16 cb[], /* i: codebook Q13 */ - const Word16 dim, /* i: dimension of codebook vectors */ - const Word16 cbsize /* i: codebook size */ +/* o: index of the winning codevector */ +Word16 vquant_fx( + Word16 x[], /* i: vector to quantize Q13 */ + const Word16 x_mean[], /* i: vector mean to subtract (0 if none)Q13*/ + Word16 xq[], /* o: quantized vector Q13 */ + const Word16 cb[], /* i: codebook Q13 */ + const Word16 dim, /* i: dimension of codebook vectors */ + const Word16 cbsize /* i: codebook size */ ); Word16 w_vquant_fx( @@ -10243,36 +9839,42 @@ Word16 w_vquant_fx( const Word16 rev_vect /* i: reverse codebook vectors */ ); -Word16 emaximum_fx( /* o : return index with max energy value in vector Q0 */ - const Word16 Qvec, /* i : Q of input vector Q0 */ - const Word16 *vec, /* i : input vector Qx */ - const Word16 lvec, /* i : length of input vector Q0 */ - Word32 *ener_max /* o : maximum energy value Q0 */ +/* o : return index with max energy value in vector Q0 */ +Word16 emaximum_fx( + const Word16 Qvec, /* i : Q of input vector Q0 */ + const Word16 *vec, /* i : input vector Qx */ + const Word16 lvec, /* i : length of input vector Q0 */ + Word32 *ener_max /* o : maximum energy value Q0 */ ); -Word16 emaximum_32fx( /* o : return index with max energy value in vector Q0 */ - const Word16 Qvec, /* i : Q of input vector Q0 */ - const Word32 *vec, /* i : input vector Qx */ - const Word16 lvec, /* i : length of input vector Q0 */ - Word32 *ener_max /* o : maximum energy value Q0 */ +/* o : return index with max energy value in vector Q0 */ +Word16 emaximum_32fx( + const Word16 Qvec, /* i : Q of input vector Q0 */ + const Word32 *vec, /* i : input vector Qx */ + const Word16 lvec, /* i : length of input vector Q0 */ + Word32 *ener_max /* o : maximum energy value Q0 */ ); -Word32 Mean32( /* o : mean of the elements of the vector */ - const Word32 in[], /* i : input vector */ - const Word16 L /* i : length of input vector */ +/* o : mean of the elements of the vector */ +Word32 Mean32( + const Word32 in[], /* i : input vector */ + const Word16 L /* i : length of input vector */ ); -Word32 sum32_fx( /* o : sum of all vector elements Qx*/ - const Word32 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ +/* o : sum of all vector elements Qx*/ +Word32 sum32_fx( + const Word32 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ ); -Word16 sum16_fx( /* o : sum of all vector elements Qx*/ - const Word16 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ +/* o : sum of all vector elements Qx*/ +Word16 sum16_fx( + const Word16 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ ); -Word16 own_random2_fx( Word16 seed ); +Word16 own_random2_fx( + Word16 seed ); void iDiv_and_mod_32( const Word32 Numer, /* i : 32 bits numerator */ @@ -10312,16 +9914,17 @@ Word32 root_a_over_b_ivas_fx( Word16 Q_b, Word16 *exp_out ); -void fir_fx( const Word16 x[], /* i : input vector Qx*/ - const Word16 h[], /* i : impulse response of the FIR filter Q12*/ - Word16 y[], /* o : output vector (result of filtering) Qx*/ - Word16 mem[], /* i/o: memory of the input signal (L samples) Qx*/ - const Word16 L, /* i : input vector size */ - const Word16 K, /* i : order of the FIR filter (K+1 coefs.) */ - const Word16 upd /* i : 1 = update the memory, 0 = not */ - , - Word16 shift /* i : difference between Q15 and scaling of h[] */ +void fir_fx( + const Word16 x[], /* i : input vector Qx*/ + const Word16 h[], /* i : impulse response of the FIR filter Q12*/ + Word16 y[], /* o : output vector (result of filtering) Qx*/ + Word16 mem[], /* i/o: memory of the input signal (L samples) Qx*/ + const Word16 L, /* i : input vector size */ + const Word16 K, /* i : order of the FIR filter (K+1 coefs.) */ + const Word16 upd, /* i : 1 = update the memory, 0 = not */ + Word16 shift /* i : difference between Q15 and scaling of h[] */ ); + void v_add_32( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ @@ -10343,7 +9946,6 @@ void v_sub_32( const Word16 N /* i : Vector length */ ); - void v_add_16( const Word16 x1[], /* i : Input vector 1 */ const Word16 x2[], /* i : Input vector 2 */ @@ -10358,12 +9960,12 @@ void v_sub_16( const Word16 N /* i : Vector length */ ); - -Word16 squant_fx( /* o: index of the winning codeword */ - const Word16 x, /* i: scalar value to quantize */ - Word16 *xq, /* o: quantized value */ - const Word16 cb[], /* i: codebook */ - const Word16 cbsize /* i: codebook size */ +/* o: index of the winning codeword */ +Word16 squant_fx( + const Word16 x, /* i: scalar value to quantize */ + Word16 *xq, /* o: quantized value */ + const Word16 cb[], /* i: codebook */ + const Word16 cbsize /* i: codebook size */ ); Word16 squant_int_fx( @@ -10435,60 +10037,84 @@ void add_vec_fx( const Word16 N /* i : Vector lenght */ ); -Word32 Add_flt32_flt32( /* o: Result (Normalized) */ - Word32 a, /* i: 1st Value */ - Word16 exp_a, /* i: Exponent of 1st Value (Q of Value) */ - Word32 b, /* i: 2nd Value */ - Word16 exp_b, /* i: Exponent of 2nd Value (Q of Value) */ - Word16 *exp_out /* o: Exponent of Result */ +/* o: Result (Normalized) */ +Word32 Add_flt32_flt32( + Word32 a, /* i: 1st Value */ + Word16 exp_a, /* i: Exponent of 1st Value (Q of Value) */ + Word32 b, /* i: 2nd Value */ + Word16 exp_b, /* i: Exponent of 2nd Value (Q of Value) */ + Word16 *exp_out /* o: Exponent of Result */ ); -Word32 Mul_flt32_Q15( /* o: Result (Normalized) */ - Word32 value, /* i: Pseudo_float Value */ - Word16 *exp_v, /*i/o: Exponent of Value (Q of Value) */ - Word16 frac /* i: Q15 value */ +/* o: Result (Normalized) */ +Word32 Mul_flt32_Q15( + Word32 value, /* i: Pseudo_float Value */ + Word16 *exp_v, /*i/o: Exponent of Value (Q of Value) */ + Word16 frac /* i: Q15 value */ ); -Word32 Div_flt32_flt32( /* o: Result (Normalized) */ - Word32 a, /* i: 1st Value */ - Word16 exp_a, /* i: Exponent of 1st Value (Q of Value) */ - Word32 b, /* i: 2nd Value */ - Word16 exp_b, /* i: Exponent of 2nd Value (Q of Value) */ - Word16 *exp_out /* o: Exponent of Result */ +/* o: Result (Normalized) */ +Word32 Div_flt32_flt32( + Word32 a, /* i: 1st Value */ + Word16 exp_a, /* i: Exponent of 1st Value (Q of Value) */ + Word32 b, /* i: 2nd Value */ + Word16 exp_b, /* i: Exponent of 2nd Value (Q of Value) */ + Word16 *exp_out /* o: Exponent of Result */ ); -Word32 Calc_Energy_Autoscaled( /* o: Result (Energy) */ - const Word16 *signal, /* i: Signal */ - Word16 signal_exp, /* i: Exponent of Signal (Q of Signal) */ - Word16 len, /* i: Frame Length */ - Word16 *energy_exp /* o: Exponent of Energy (Q of Energy) */ +/* o: Result (Normalized) */ +Word32 Calc_Energy_Autoscaled( + const Word16 *signal, /* i: Signal */ + Word16 signal_exp, /* i: Exponent of Signal (Q of Signal) */ + Word16 len, /* i: Frame Length */ + Word16 *energy_exp /* o: Exponent of Energy (Q of Energy) */ ); -Word16 Find_Max_Norm16( const Word16 *src, Word16 len ); +Word16 Find_Max_Norm16( + const Word16 *src, + Word16 len ); -Word16 Find_Max_Norm32( const Word32 *src, Word16 len ); +Word16 Find_Max_Norm32( + const Word32 *src, + Word16 len ); -Word32 Sqrt_Ratio32( /* o: Result in Q31 */ - Word32 L_val1, /* i: Mantisa of Val1 */ - Word16 exp1, /* i: Exp of Val1 (>0: Val was Left Shifted, <0:Right Shifted) */ - Word32 L_val2, /* i: Mantisa of Val2 */ - Word16 exp2, /* i: Exp of Val2 (same as exp1) */ - Word16 *exp /* o: Exp of Result (# of 'L_shl' Req to get to Final Value) */ +/* o: Result in Q31 */ +Word32 Sqrt_Ratio32( + Word32 L_val1, /* i: Mantisa of Val1 */ + Word16 exp1, /* i: Exp of Val1 (>0: Val was Left Shifted, <0:Right Shifted) */ + Word32 L_val2, /* i: Mantisa of Val2 */ + Word16 exp2, /* i: Exp of Val2 (same as exp1) */ + Word16 *exp /* o: Exp of Result (# of 'L_shl' Req to get to Final Value) */ ); -Word16 Invert16( /* result in Q'15 + 'exp' */ - Word16 val, - Word16 *exp ); +/* result in Q'15 + 'exp' */ +Word16 Invert16( + Word16 val, + Word16 *exp ); -Word16 find_rem( Word16 n, Word16 m, Word16 *r ); +Word16 find_rem( + Word16 n, + Word16 m, + Word16 *r ); -Word32 find_remd( Word32 n, Word32 m, Word32 *r ); +Word32 find_remd( + Word32 n, + Word32 m, + Word32 *r ); Word16 rint_new_fx( Word32 x /*Q16 */ ); -Word16 erb_diff_search_fx( Word16 *prev_erb, const Word16 *curr_erb, Word16 *dif_erb, Word16 *pow_spec, const Word16 *cb_fx, Word16 cb_size, Word16 cb_dim, Word16 offset ); +Word16 erb_diff_search_fx( + Word16 *prev_erb, + const Word16 *curr_erb, + Word16 *dif_erb, + Word16 *pow_spec, + const Word16 *cb_fx, + Word16 cb_size, + Word16 cb_dim, + Word16 offset ); void Acelp_dec_total_exc( Word16 *exc_fx, /* i/o: adapt. excitation exc */ @@ -10500,11 +10126,18 @@ void Acelp_dec_total_exc( const Word16 L_subfr /* i : Subframne lenght */ ); -UWord32 UL_inverse( const UWord32 UL_val, Word16 *exp ); +UWord32 UL_inverse( + const UWord32 UL_val, + Word16 *exp ); -UWord32 UL_div( const UWord32 UL_num, const UWord32 UL_den ); +UWord32 UL_div( + const UWord32 UL_num, + const UWord32 UL_den ); -Word16 ratio( const Word32 numer, const Word32 denom, Word16 *expo ); +Word16 ratio( + const Word32 numer, + const Word32 denom, + Word16 *expo ); void hp400_12k8_fx( Word16 signal[], /* i/o: input signal / output is divided by 16 */ @@ -10512,9 +10145,25 @@ void hp400_12k8_fx( Word16 mem[] /* i/o: filter memory [6] */ ); -Word16 dot_prod_satcontr( const Word16 *x, const Word16 *y, Word16 qx, Word16 qy, Word16 *qo, Word16 len ); +void hp400_12k8_ivas_fx( + Word16 signal[], /* i/o: input signal / output is divided by 16 */ + const Word16 lg, /* i : lenght of signal */ + Word16 mem[] /* i/o: filter memory [6] */ +); + +Word16 dot_prod_satcontr( + const Word16 *x, + const Word16 *y, + Word16 qx, + Word16 qy, + Word16 *qo, + Word16 len ); -void E_UTIL_f_convolve( const Word16 x[], const Word16 h[], Word16 y[], const Word16 size ); +void E_UTIL_f_convolve( + const Word16 x[], + const Word16 h[], + Word16 y[], + const Word16 size ); void floating_point_add( Word32 *mx, /* io: mantissa of the addend Q31 */ @@ -10555,10 +10204,11 @@ Word16 lin_interp_fx( const Word16 flag_sat /* i : flag to indicate whether to apply saturation */ ); -Word16 ceil_log_2( UWord64 val ); +Word16 ceil_log_2( + UWord64 val ); Word32 imax_pos_fx( - const Word32 *y /* i : Input vector for peak interpolation Qx*/ + const Word32 *y /* i : Input vector for peak interpolation Qx*/ ); void msvq_enc_ivas_fx( @@ -10613,8 +10263,8 @@ void dctT2_N_apply_matrix_fx( ); Word32 sum2_f_32_fx( - const Word32 *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ Word16 gb ); Word32 sum2_32_fx( @@ -10622,7 +10272,7 @@ Word32 sum2_32_fx( const Word16 lvec, /* i : length of input vector */ Word16 *e ); -void v_mult_fixed( +void v_mult_fx( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ Word32 y[], /* o : Output vector that contains vector 1 .* vector 2 */ @@ -10664,7 +10314,7 @@ Word16 swb_bwe_dec_fx32( Word16 output_frame /* i : frame length */ ); -ivas_error acelp_core_dec_ivas_fx( +ivas_error acelp_core_dec_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 output_fx[], /* o : synthesis @internal Fs */ Word16 synth_fx16[], /* o : synthesis */ @@ -10677,7 +10327,6 @@ ivas_error acelp_core_dec_ivas_fx( Word16 *unbits, /* o : number of unused bits */ Word16 *sid_bw, /* o : 0-NB/WB, 1-SWB SID */ STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const Word16 tdm_lspQ_PCh_fx[M], /* i : Q LSPs for primary channel */ const Word16 tdm_lsfQ_PCh_fx[M], /* i : Q LSFs for primary channel */ const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ const Word16 last_element_mode, /* i : last element mode */ @@ -10688,10 +10337,6 @@ ivas_error acelp_core_dec_ivas_fx( const Word16 read_sid_info /* i : read SID info flag */ ); -void destroy_cldfb_decoder_ivas_fx( - Decoder_State *st /* o : Decoder static variables structure */ -); - void wtda_fx32( const Word32 *new_audio, /* i : input audio Q11 */ Word32 *wtda_audio, /* o : windowed audio Q11 */ @@ -10718,6 +10363,12 @@ void hp20_fx_32( Word32 mem_fx[], const Word32 Fs ); +void hp20_fx_32_opt( + Word32 signal_fx[], + const Word16 lg, + Word32 mem_fx[], + const Word32 Fs ); + void getTCXMode_ivas_fx( Decoder_State *st, /* i/o: decoder memory state */ Decoder_State *st0, /* i : bitstream */ @@ -10764,10 +10415,10 @@ void generate_stereo_masking_noise_fx( Word16 Q_syn, Decoder_State *st, /* i/o: decoder state structure */ STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i : TD stereo structure */ - const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ - const int16_t fadeOut, /* i : only fade out of previous state */ + const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel */ + const Word16 fadeOut, /* i : only fade out of previous state */ STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ - const int16_t nchan_out /* i : number of output channels */ + const Word16 nchan_out /* i : number of output channels */ ); void SynthesisSTFT_fx( @@ -10775,10 +10426,10 @@ void SynthesisSTFT_fx( Word32 *timeDomainOutput, Word32 *olapBuffer, const Word16 *olapWin, - const int16_t tcx_transition, + const Word16 tcx_transition, HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ - const int16_t element_mode, /* i : element mode */ - const int16_t nchan_out /* i : number of output channels */ + const Word16 element_mode, /* i : element mode */ + const Word16 nchan_out /* i : number of output channels */ ); void FdCng_decodeSID_ivas_fx( @@ -10804,9 +10455,6 @@ Word16 sr2fscale( const Word32 sr_core /* i : internal sampling rate */ ); -// pre_proc functions -/*full implementation pending*/ - void Copy_Scale_sig32( const Word32 x[], /* i : signal to scale input Qx */ Word32 y[], /* o : scaled signal output Qx */ @@ -10831,15 +10479,15 @@ void core_encode_update_ivas_fx( ); void updt_enc_common_ivas_fx( - Encoder_State *st, /* i/o: encoder state structure */ + Encoder_State *st, /* i/o: encoder state structure */ const Word16 Q_new /* i : CUrrent frame scaling */ ); -// tools.c -Word32 sum2_f_32_fx( /* o : Q(2x - 31 - gb) */ - const Word32 *vec, /* i : input vector, Qx */ - const Word16 lvec, /* i : length of input vector */ - Word16 gb /* i : guard bits */ +/* o : Q(2x - 31 - gb) */ +Word32 sum2_f_32_fx( + const Word32 *vec, /* i : input vector, Qx */ + const Word16 lvec, /* i : length of input vector */ + Word16 gb /* i : guard bits */ ); Word32 sum2_16_exp_fx( @@ -10860,6 +10508,7 @@ Word32 sum2_32_fx( const Word32 *vec, /* i : input vector */ const Word16 lvec, /* i : length of input vector */ Word16 *e ); + void ProcessStereoIGF_fx( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ @@ -10867,26 +10516,32 @@ void ProcessStereoIGF_fx( Word32 *pITFMDCTSpectrum_fx[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ Word16 q_pITFMDCTSpectrum_1, Word16 q_pITFMDCTSpectrum_2, - Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ - Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ - const Word16 frameno, /* i : flag indicating index of current subfr. */ - const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ - const Word32 element_brate, /* i : element bitrate */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ + Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + Word16 exp_inv_spectrum_fx[CPE_CHANNELS], /* i/o: exp of inv_spectrum_fx */ + const Word16 frameno, /* i : flag indicating index of current subfr. */ + const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ + const Word32 element_brate, /* i : element bitrate */ const Word16 mct_on ); -/*igf_enc.c*/ + void IGFEncApplyStereo_fx( - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ - Word16 ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ - const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ - const Word16 igfGridIdx, /* i : IGF grid index */ - Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ - Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ - Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ - const Word16 frameno, /* i : flag indicating index of current subfr. */ - const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ - const Word32 element_brate, /* i : element bitrate */ + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ + Word16 ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ + const Word16 igfGridIdx, /* i : IGF grid index */ + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ + Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + Word16 exp_inv_spectrum_fx[CPE_CHANNELS], /* i : exp of inverse spectrum */ + const Word16 frameno, /* i : flag indicating index of current subfr. */ + const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ + const Word32 element_brate, /* i : element bitrate */ const Word16 mct_on ); void IGFSaveSpectrumForITF_ivas_fx( @@ -10894,6 +10549,7 @@ void IGFSaveSpectrumForITF_ivas_fx( const Word16 igfGridIdx, /* i : IGF grid index */ const Word32 *pITFSpectrum, /* i : MDCT spectrum */ Word16 exp_pITFSpectrum ); + Word16 IGFEncWriteBitstream_ivas_fx( const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ @@ -10901,7 +10557,7 @@ Word16 IGFEncWriteBitstream_ivas_fx( const Word16 igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ const Word16 isIndepFlag /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ ); -/*igf_scf_enc.c*/ + Word16 IGFSCFEncoderEncode_ivas_fx( IGFSCFENC_INSTANCE_HANDLE hPublicData, /* i/o: handle to public data or NULL in case there was no instance created */ BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ @@ -10910,7 +10566,7 @@ Word16 IGFSCFEncoderEncode_ivas_fx( const Word16 igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ const Word16 indepFlag /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ ); -/*ari_enc.c*/ + Word16 ari_encode_14bits_ext_ivas_fx( Word16 *ptr, /* Q0 */ Word16 bp, /* Q0 */ @@ -10918,6 +10574,7 @@ Word16 ari_encode_14bits_ext_ivas_fx( Word32 symbol, /* Q0 */ UWord16 const *cum_freq /* Q0 */ ); + Word16 ari_encode_14bits_sign_ivas_fx( Word16 *ptr, /* Q0 */ Word16 bp, /* Q0 */ @@ -10925,22 +10582,18 @@ Word16 ari_encode_14bits_sign_ivas_fx( Tastat *s, Word16 sign /* Q0 */ ); + Word16 ari_done_encoding_14bits_ivas_fx( Word16 *ptr, /* Q0 */ Word16 bp, /* Q0 */ Tastat *s ); -void pack_bit( - const Word16 bit, /* i: bit to be packed */ - UWord8 **pt, /* i/o: pointer to octet array into which bit will be placed */ - UWord8 *omask /* i/o: output mask to indicate where in the octet the bit is to be written */ -); + void IGFEncConcatenateBitstream( const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ const Word16 bsBits, /* i : number of IGF bits written to list of indices */ BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ ); - void hq_generic_hf_encoding_fx( const Word32 *coefs_fx, /* i : MDCT coefficients of weighted original */ Word16 *hq_generic_fenv_fx, /* i/o: energy of SWB envelope */ @@ -10948,6 +10601,7 @@ void hq_generic_hf_encoding_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ Word16 *hq_generic_exc_clas, /* o : bwe excitation class */ Word16 length ); + Word16 ari_decode_14bits_pow_ivas( Word16 *ptr, Word16 bp, @@ -10955,6 +10609,7 @@ Word16 ari_decode_14bits_pow_ivas( Word16 *res, Tastat *s, UWord16 base ); + Word16 ari_decode_14bits_sign_ivas( Word16 *ptr, Word16 bp, @@ -10968,58 +10623,69 @@ void lsf_syn_mem_backup_ivas_fx( Word32 *gc_threshold_fx, /* i: Q16 */ Word16 *clip_var_bck_fx, /* o: Q(2.56), Q14, Q7, Q0, Q14, Q14 */ Word16 *next_force_sf_bck_fx, /* o: */ - - Word16 *lsp_new, /* i: LSP vector to quantize Q15 */ - Word16 *lsp_mid, /* i: mid-frame LSP vector Q15 */ - Word16 *clip_var, /* o: pitch clipping state var Q(2.56) */ - Word16 *mem_AR, /* o: quantizer memory for AR model Q(2.56) */ - Word16 *mem_MA, /* o: quantizer memory for AR model Q(2.56) */ - Word16 *lsp_new_bck, /* o: LSP vector to quantize- backup Q15 */ - Word16 *lsp_mid_bck, /* o: mid-frame LSP vector - backup Q15 */ - Word32 *Bin_E, /* o: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ - Word32 *Bin_E_old, /* o: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ - Word16 *mem_syn_bck, /* o: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 *mem_w0_bck, /* o: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 *streaklimit, /* Q15 */ + Word16 *lsp_new, /* i: LSP vector to quantize Q15 */ + Word16 *lsp_mid, /* i: mid-frame LSP vector Q15 */ + Word16 *clip_var, /* o: pitch clipping state var Q(2.56) */ + Word16 *mem_AR, /* o: quantizer memory for AR model Q(2.56) */ + Word16 *mem_MA, /* o: quantizer memory for AR model Q(2.56) */ + Word16 *lsp_new_bck, /* o: LSP vector to quantize- backup Q15 */ + Word16 *lsp_mid_bck, /* o: mid-frame LSP vector - backup Q15 */ + Word32 *Bin_E, /* o: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ + Word32 *Bin_E_old, /* o: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ + Word16 *mem_syn_bck, /* o: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 *mem_w0_bck, /* o: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 *streaklimit, /* Q15 */ Word16 *pstreaklen ); -ivas_error config_acelp1_IVAS( - const Word16 enc_dec, /* i : encoder/decoder flag */ - const Word32 total_brate, /* i : total bitrate */ - const Word32 core_brate_inp, /* i : core bitrate */ - const Word16 core, /* i : core */ - const Word16 extl, /* i : extension layer */ - const Word32 extl_brate, /* i : extension layer bitrate */ - const Word16 L_frame, /* i : frame length at internal Fs */ - const Word16 GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ - ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ - const Word16 signaling_bits, /* i : number of signaling bits */ - const Word16 coder_type, /* i : coder type */ -#ifdef NONBE_FIX_GSC_BSTR +ivas_error config_acelp1_fx( + const Word16 enc_dec, /* i : encoder/decoder flag */ + const Word32 total_brate, /* i : total bitrate */ + const Word32 core_brate_inp, /* i : core bitrate */ + const Word16 core, /* i : core */ + const Word16 extl, /* i : extension layer */ + const Word32 extl_brate, /* i : extension layer bitrate */ + const Word16 L_frame, /* i : frame length at internal Fs */ + const Word16 GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ + ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ + const Word16 signaling_bits, /* i : number of signaling bits */ + const Word16 coder_type, /* i : coder type */ const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ + const Word16 tc_subfr, /* i : TC subfr ID */ + const Word16 tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ + Word16 *nBits_es_Pred, /* o : number of bits for Es_pred Q */ + Word16 *unbits, /* o : number of unused bits */ + const Word16 element_mode, /* i : element mode */ + Word16 *uc_two_stage_flag, /* o : flag undicating two-stage UC */ + const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const Word16 idchan, /* i : stereo channel ID */ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/ + const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ +); + +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) +#define push_next_indice( ... ) push_next_indice_( __func__, __VA_ARGS__ ) +#define push_next_bits( ... ) push_next_bits_( __func__, __VA_ARGS__ ); #endif - const Word16 tc_subfr, /* i : TC subfr ID */ - const Word16 tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ - Word16 *nBits_es_Pred, /* o : number of bits for Es_pred Q */ - Word16 *unbits, /* o : number of unused bits */ - const Word16 element_mode, /* i : element mode */ - Word16 *uc_two_stage_flag, /* o : flag undicating two-stage UC */ - const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ - const Word16 idchan, /* i : stereo channel ID */ - const Word16 active_cnt, /* i : Active frame counter */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/ - const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ -); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) +ivas_error push_next_indice_( + const char *caller, +#else ivas_error push_next_indice( +#endif BSTR_ENC_HANDLE hBstr, UWord16 value, /* i : value of the quantized indice */ Word16 nb_bits /* i : number of bits used to quantize the indice */ ); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) +ivas_error push_next_bits_( + const char *caller, +#else ivas_error push_next_bits( +#endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ const Word16 nb_bits /* i : number of bits to pack */ @@ -11058,16 +10724,14 @@ void writeTCXparam_fx( void calculate_hangover_attenuation_gain_ivas_fx( Encoder_State *st, /* i : encoder state structure */ Word16 *att, /* o : attenuation factor */ - const Word16 vad_hover_flag /* i : VAD hangover flag */ + const Word16 vad_hover_flag /* i : VAD hangover flag */ ); void init_coder_ace_plus_ivas_fx( Encoder_State *st, /* i : Encoder state */ const Word32 last_total_brate, /* i : last total bitrate */ -#ifdef FIX_920_IGF_INIT_ERROR - const Word32 igf_brate, /* i : IGF configuration bitrate */ -#endif - const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */ + const Word32 igf_brate, /* i : IGF configuration bitrate */ + const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */ ); void core_coder_reconfig_ivas_fx( @@ -11093,7 +10757,6 @@ Word16 getTcxonly_ivas_fx( const Word16 is_ism_format /* i : flag indicating ISM format */ ); - void SetModeIndex_ivas_fx( Encoder_State *st, /* i : Encoder state */ const Word32 last_total_brate, /* i : last total bitrate Q0*/ @@ -11158,23 +10821,23 @@ Word16 msvq_stage1_dct_recalc_candidates_fdcng_wb_fx( const Word16 st1_syn_vec_e, /* i : exp for IDCT24 synthesis vectors */ const Word32 *u_fx, /* i : target signal */ const Word16 u_e, /* i : exp for target signal */ - const int16_t maxC_st1, /* i : number of candidates in stage1 */ + const Word16 maxC_st1, /* i : number of candidates in stage1 */ Word32 *dist_ptr_fx, /* i/o: updated MSE vector for stage1 */ Word16 *dist_ptr_e /* i/o: exp for updated MSE vector for stage1 */ ); void FEC_encode_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const ACELP_config acelp_cfg, /* i/o: configuration of the ACELP */ - const Word16 *synth, /* i : pointer to synthesized speech for E computation Q_Synth*/ - const Word16 coder_type, /* i : type of coder Q0*/ - Word16 clas, /* i : signal clas for current frame Q0*/ - const Word16 *fpit, /* i : close loop fractional pitch buffer Q6*/ - const Word16 *res, /* i : LP residual signal frame Qx*/ - Word16 *last_pulse_pos, /* i/o: Position of the last pulse Q0*/ - const Word16 L_frame, /* i : Frame length Q0*/ - const Word32 total_brate, /* i : total codec bitrate Q0*/ - const Word16 Q_synth /* i : input scaling */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const ACELP_config acelp_cfg, /* i/o: configuration of the ACELP */ + const Word16 *synth, /* i : pointer to synthesized speech for E computation Q_Synth*/ + const Word16 coder_type, /* i : type of coder Q0*/ + Word16 clas, /* i : signal clas for current frame Q0*/ + const Word16 *fpit, /* i : close loop fractional pitch buffer Q6*/ + const Word16 *res, /* i : LP residual signal frame Qx*/ + Word16 *last_pulse_pos, /* i/o: Position of the last pulse Q0*/ + const Word16 L_frame, /* i : Frame length Q0*/ + const Word32 total_brate, /* i : total codec bitrate Q0*/ + const Word16 Q_synth /* i : input scaling */ ); ivas_error IGF_Reconfig_fx( @@ -11187,11 +10850,6 @@ ivas_error IGF_Reconfig_fx( const Word16 rf_mode /* i : flag to signal the RF mode */ ); -void configureCldfb_ivas_enc_fx( - HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle */ - const Word32 sampling_rate /* i : sampling rate */ -); - void core_switching_post_enc_ivas_fx( Encoder_State *st, /* i/o: encoder state structure */ Word16 *old_inp_12k8_fx, /* i : old input signal @12.8kHz */ @@ -11199,7 +10857,6 @@ void core_switching_post_enc_ivas_fx( Word16 A_fx[], /* i : unquant. LP filter coefs. */ Word16 Q_new ); - void residu_ivas_fx( const Word16 *a, /* i : LP filter coefficients Q31-a_exp*/ const Word16 a_exp, @@ -11231,131 +10888,60 @@ void WriteToBitstream_ivas_fx( * MODE1 prototypes *----------------------------------------------------------------------------------*/ -/*! r: inverse square root of input value */ -float inv_sqrt( - const float x /* i : input value */ -); - /*! r: output random value */ -int16_t own_random( - int16_t *seed /* i/o: random seed */ +Word16 own_random( + Word16 *seed /* i/o: random seed */ ); -/*! r: sign of x (+1/-1) */ -float sign( - const float x /* i : input value of x */ -); - -/*! r: logarithm2 of x */ -float log2_f( - const float x /* i : input value of x */ -); - -int16_t norm_ul_float( - uint32_t UL_var1 ); - /*! r: sum of all vector elements */ -int16_t sum_s( - const int16_t *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ -); - -/*! r: sum of all vector elements */ -int32_t sum_l( - const int32_t *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ -); - -/*! r: sum of all squared vector elements */ -float sum2_f( - const float *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ +Word16 sum_s( + const Word16 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ ); void set_c( - int8_t y[], /* i/o: Vector to set */ - const int8_t a, /* i : Value to set the vector to */ - const int32_t N /* i : Length of the vector */ + Word8 y[], /* i/o: Vector to set */ + const Word8 a, /* i : Value to set the vector to */ + const Word32 N /* i : Length of the vector */ ); void set_s( - int16_t y[], /* i/o: Vector to set */ - const int16_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Lenght of the vector */ + Word16 y[], /* i/o: Vector to set */ + const Word16 a, /* i : Value to set the vector to */ + const Word16 N /* i : Lenght of the vector */ ); void set_l( - int32_t y[], /* i/o: Vector to set */ - const int32_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Length of the vector */ -); - -void set_f( - float y[], /* i/o: Vector to set */ - const float a, /* i : Value to set the vector to */ - const int16_t N /* i : Lenght of the vector */ + Word32 y[], /* i/o: Vector to set */ + const Word32 a, /* i : Value to set the vector to */ + const Word16 N /* i : Length of the vector */ ); void set_zero_fx( Word32 *vec, /* o : input vector */ const Word16 lvec /* i : length of the vector */ ); + void set_zero2_fx( Word32 *vec, /* o : input vector */ const Word32 lvec /* i : length of the vector */ ); + void set16_zero_fx( Word16 *vec, /* o : input vector */ const Word16 lvec /* i : length of the vector */ ); -void set_zero( - float *vec, /* o : input vector */ - const int16_t lvec /* i : length of the vector */ -); - -void mvr2r( - const float x[], /* i : input vector */ - float y[], /* o : output vector */ - const int16_t n /* i : vector size */ -); - void mvs2s( - const int16_t x[], /* i : input vector */ - int16_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ -); - -uint32_t mvr2s( - const float x[], /* i : input vector */ - int16_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ -); - -void mvs2r( - const int16_t x[], /* i : input vector */ - float y[], /* o : output vector */ - const int16_t n /* i : vector size */ + const Word16 x[], /* i : input vector */ + Word16 y[], /* o : output vector */ + const Word16 n /* i : vector size */ ); void mvl2l( - const int32_t x[], /* i : input vector */ - int32_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ -); - - -/*! r: index of the maximum value in the input vector */ -int16_t maximum( - const float *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ - float *max_val /* o : maximum value in the input vector */ -); -/*! r: index of the maximum value in the input vector */ -int16_t maximumAbs( - const float *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ - float *max_val /* o : maximum value in the input vector */ + const Word32 x[], /* i : input vector */ + Word32 y[], /* o : output vector */ + const Word16 n /* i : vector size */ ); Word16 maximumAbs_l( @@ -11365,63 +10951,10 @@ Word16 maximumAbs_l( ); /*! r: index of the minimum value in the input vector */ -int16_t minimum( - const float *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ - float *min_val /* o : minimum value in the input vector */ -); - -/*! r: index of the minimum value in the input vector */ -int16_t minimum_s( - const int16_t *vec, /* i : Input vector */ - const int16_t lvec, /* i : Vector length */ - int16_t *min_val /* o : minimum value in the input vector */ -); - -/*! r: return index with max energy value in vector */ -int16_t emaximum( - const float *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ - float *ener_max /* o : maximum energy value */ -); - -/*! r: vector mean */ -float mean( - const float *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ -); - -/*! r: dot product of x[] and y[] */ -float dotp( - const float x[], /* i : vector x[] */ - const float y[], /* i : vector y[] */ - const int16_t n /* i : vector length */ -); - -void v_add( - const float x1[], /* i : Input vector 1 */ - const float x2[], /* i : Input vector 2 */ - float y[], /* o : Output vector that contains vector 1 + vector 2 */ - const int16_t N /* i : Vector length */ -); - -void v_sub( - const float x1[], /* i : Input vector 1 */ - const float x2[], /* i : Input vector 2 */ - float y[], /* o : Output vector that contains vector 1 - vector 2 */ - const int16_t N /* i : Vector length */ -); - -/*! r: dequanzited gain */ -float usdequant( - const int16_t idx, /* i : quantizer index */ - const float qlow, /* i : lowest codebook entry (index 0) */ - const float delta /* i : quantization step */ -); - -void sort( - uint16_t *x, /* i/o: Vector to be sorted */ - uint16_t len /* i/o: vector length */ +Word16 minimum_s( + const Word16 *vec, /* i : Input vector */ + const Word16 lvec, /* i : Vector length */ + Word16 *min_val /* o : minimum value in the input vector */ ); void sort_l( @@ -11429,21 +10962,26 @@ void sort_l( Word16 len /* i/o: vector length */ ); - ivas_error push_indice( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - int16_t id, /* i : ID of the indice */ - uint16_t value, /* i : value of the quantized indice */ - int16_t nb_bits /* i : number of bits used to quantize the indice */ + Word16 id, /* i : ID of the indice */ + UWord16 value, /* i : value of the quantized indice */ + Word16 nb_bits /* i : number of bits used to quantize the indice */ ); -ivas_error push_next_indice( +ivas_error push_next_indice_( +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + const char *caller, +#endif BSTR_ENC_HANDLE hBstr, UWord16 value, /* i : value of the quantized indice */ Word16 nb_bits /* i : number of bits used to quantize the indice */ ); -ivas_error push_next_bits( +ivas_error push_next_bits_( +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + const char *caller, +#endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ const Word16 nb_bits /* i : number of bits to pack */ @@ -11456,8 +10994,8 @@ Word16 get_ivas_max_num_indices_fx( ); /*! r: maximum number of indices */ -int16_t get_BWE_max_num_indices( - const int32_t extl_brate /* i : extensiona layer bitrate */ +Word16 get_BWE_max_num_indices( + const Word32 extl_brate /* i : extensiona layer bitrate */ ); /*! r: maximum number of indices */ @@ -11466,9 +11004,9 @@ Word16 get_ivas_max_num_indices_metadata_fx( const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); ivas_error ind_list_realloc( - INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ - const int16_t max_num_indices, /* i : new maximum number of allowed indices in the list */ - Encoder_Struct *st_ivas /* i : IVAS encoder structure */ + INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ + const Word16 max_num_indices, /* i : new maximum number of allowed indices in the list */ + Encoder_Struct *st_ivas /* i : IVAS encoder structure */ ); ivas_error check_ind_list_limits( @@ -11478,56 +11016,39 @@ ivas_error check_ind_list_limits( void move_indices( INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ - const int16_t nb_indices /* i : number of moved indices */ + const Word16 nb_indices /* i : number of moved indices */ ); /*! r: index of the indice in the list, -1 if not found */ -int16_t find_indice( +Word16 find_indice( BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - const int16_t id, /* i : ID of the indice */ - uint16_t *value, /* o : value of the quantized indice */ - int16_t *nb_bits /* o : number of bits used to quantize the indice */ + const Word16 id, /* i : ID of the indice */ + UWord16 *value, /* o : value of the quantized indice */ + Word16 *nb_bits /* o : number of bits used to quantize the indice */ ); /*! r: number of deleted indices */ -uint16_t delete_indice( +UWord16 delete_indice( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const int16_t id /* i : ID of the indice */ -); - -/*! r: value of the indice */ -uint16_t get_next_indice( - Decoder_State *st, /* i/o: decoder state structure */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ -); - -/*! r: value of the indice */ -uint16_t get_next_indice_1( - Decoder_State *st /* i/o: decoder state structure */ -); - -void get_next_indice_tmp( - Decoder_State *st, /* o : decoder state structure */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + const Word16 id /* i : ID of the indice */ ); /*! r: value of the indice */ -uint16_t get_indice( +UWord16 get_indice_fx( Decoder_State *st, /* i/o: decoder state structure */ - int16_t pos, /* i : absolute position in the bitstream */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + Word16 pos, /* i : absolute position in the bitstream */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ); void reset_indices_dec( Decoder_State *st /* i/o: decoder state structure */ ); -Word16 rate2EVSmode_float( +Word16 rate2EVSmode( const Word32 brate, /* i : bitrate */ - int16_t *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ + Word16 *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ ); - /*! r: 1 = OK, 0 = something wrong */ ivas_error read_indices_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -11538,7 +11059,6 @@ ivas_error read_indices_fx( Word16 bfi /* i : bad frame indicator */ ); - void ivas_set_bitstream_pointers( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); @@ -11547,19 +11067,19 @@ Decoder_State **reset_elements( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); +void convertSerialToBytestream_fx( + const UWord16 *const serial, /* i : input serial bitstream with values 0 and 1 */ + const UWord16 num_bits, /* i : number of bits in the input bitstream */ + UWord8 *const bytestream /* o : output compact bitstream (bytestream) */ +); + void mdct_switching_dec_fx( Decoder_State *st /* i/o: decoder state structure */ ); -int16_t print_disclaimer( +Word16 print_disclaimer( FILE *fPtr ); -void fft_rel( - float x[], /* i/o: input/output vector */ - const int16_t n, /* i : vector length */ - const int16_t m /* i : log2 of vector length */ -); - void preemph_ivas_fx( Word32 *signal, /* i/o: signal Qx*/ const Word16 mu, /* i : preemphasis factor Q15*/ @@ -11570,8 +11090,8 @@ void preemph_ivas_fx( void create_offset( UWord32 *offset_scale1, UWord32 *offset_scale2, - const int16_t mode, - const int16_t prediction_flag ); + const Word16 mode, + const Word16 prediction_flag ); void BASOP_cfft_ivas( Word32 *re, /* i/o: real part */ @@ -11592,31 +11112,6 @@ Word32 Mult_32_32( Word32 a, Word32 b ); - -void bit_allocation_second_fx2( - Word32 *Rk, - Word32 *Rk_sort, - Word16 BANDS, - const Word16 *band_width, - Word16 *k_sort, - Word16 *k_num, - const Word16 *p2a_flags, - const Word16 p2a_bands, - const Word16 *last_bitalloc, - const Word16 input_frame ); - -void bit_allocation_second_fx2( - Word32 *Rk, - Word32 *Rk_sort, - Word16 BANDS, - const Word16 *band_width, - Word16 *k_sort, - Word16 *k_num, - const Word16 *p2a_flags, - const Word16 p2a_bands, - const Word16 *last_bitalloc, - const Word16 input_frame ); - #ifdef DEBUGGING void read_next_force( int16_t *force, /* i/o: force value (0/1, 0 = speech, 1 = music)*/ @@ -11625,35 +11120,33 @@ void read_next_force( ); #endif -ivas_error init_encoder_ivas_fx( - Encoder_State *st, /* i/o: state structure */ - Encoder_Struct *st_ivas, /* i/o: encoder state structure */ - const Word16 idchan, /* i : channel ID */ - const Word16 var_SID_rate_flag, /* i : flag for variable SID update rate */ - const Word16 interval_SID, /* i : interval for SID update */ - const Word16 vad_only_flag, /* i : flag to indicate front-VAD structure */ - const ISM_MODE ism_mode, /* i : ISM mode */ - const Word32 element_brate /* i : element bitrate */ +ivas_error init_encoder_fx( + Encoder_State *st, /* i/o: state structure */ + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ + const Word16 idchan, /* i : channel ID */ + const Word16 vad_only_flag, /* i : flag to indicate front-VAD structure */ + const ISM_MODE ism_mode, /* i : ISM mode */ + const Word32 element_brate /* i : element bitrate */ ); ivas_error acelp_core_enc_ivas_fx( Encoder_State *st, /* i/o: encoder state structure */ - const Word16 inp[], /* i : input signal of the current frame Q_new*/ - Word16 A[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ - Word16 Aw[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes Q12*/ - const Word32 epsP[M + 1], /* i : LP prediction errors Qx*/ - Word16 lsp_new[M], /* i : LSPs at the end of the frame Q15*/ - Word16 lsp_mid[M], /* i : LSPs in the middle of the frame Q15*/ - const Word16 vad_hover_flag, /* i : VAD hangover flag Q0*/ - const Word16 attack_flag, /* i : attack flag (GSC or TC) Q0*/ - Word32 bwe_exc_extended_fx[], /* i/o: bandwidth extended excitation st->prev_Q_bwe_exc*/ - Word16 *voice_factors_fx, /* o : voicing factors Q15*/ - Word16 old_syn_12k8_16k[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE q_old_syn_12k8_16*/ + const Word16 inp[], /* i : input signal of the current frame Q_new*/ + Word16 A[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ + Word16 Aw[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes Q12*/ + const Word32 epsP[M + 1], /* i : LP prediction errors Qx*/ + Word16 lsp_new[M], /* i : LSPs at the end of the frame Q15*/ + Word16 lsp_mid[M], /* i : LSPs in the middle of the frame Q15*/ + const Word16 vad_hover_flag, /* i : VAD hangover flag Q0*/ + const Word16 attack_flag, /* i : attack flag (GSC or TC) Q0*/ + Word32 bwe_exc_extended_fx[], /* i/o: bandwidth extended excitation st->prev_Q_bwe_exc*/ + Word16 *voice_factors_fx, /* o : voicing factors Q15*/ + Word16 old_syn_12k8_16k[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE q_old_syn_12k8_16*/ Word16 *q_old_syn_12k8_16, - Word16 pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ - Word16 *unbits, /* o : number of unused bits Q0*/ - STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel X2.56*/ + Word16 pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ + Word16 *unbits, /* o : number of unused bits Q0*/ + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ + Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel X2.56*/ Word16 Q_new ); void flip_and_downmix_generic_fx32( @@ -11666,10 +11159,11 @@ void flip_and_downmix_generic_fx32( Word16 *phase_state /* i/o: Phase state in case frequency isn't multiple of 50 Hz */ ); -Word16 quant_2p_2N1_fx( /* o: return (2*N)+1 bits */ - const Word16 pos1, /* i: position of the pulse 1 */ - const Word16 pos2, /* i: position of the pulse 2 */ - const Word16 N /* i: number of bits FOR position */ +/* o : Q(2x - 31 - gb) */ +Word16 quant_2p_2N1_fx( + const Word16 pos1, /* i: position of the pulse 1 */ + const Word16 pos2, /* i: position of the pulse 2 */ + const Word16 N /* i: number of bits FOR position */ ); void bands_and_bit_alloc_ivas_fx( @@ -11695,24 +11189,17 @@ void bands_and_bit_alloc_ivas_fx( ); void ivas_find_wsp_fx( - const Word16 L_frame, /* i : length of the frame Q0*/ - const Word16 L_subfr, /* i : length of subframe Q0*/ - const Word16 nb_subfr, /* i : number of subframes Q0*/ - const Word16 *A_fx, - /* i : A(z) filter coefficients */ // Q12 - Word16 *Aw_fx, - /* o : weighted A(z) filter coefficients */ // Q12 - const Word16 *speech_fx, - /* i : pointer to the denoised speech frame */ // Q_new - const Word16 tilt_fact, - /* i : tilt factor */ // Q15 - Word16 *wsp_fx, - /* o : poitnter to the weighted speech frame */ // Q_new - Word16 *mem_wsp_fx, - /* i/o: W(Z) denominator memory */ // Q_new - const Word16 gamma, - /* i : weighting factor */ // Q15 - const Word16 L_look /* i : look-ahead Q0*/ + const Word16 L_frame, /* i : length of the frame Q0*/ + const Word16 L_subfr, /* i : length of subframe Q0*/ + const Word16 nb_subfr, /* i : number of subframes Q0*/ + const Word16 *A_fx, /* i : A(z) filter coefficients Q12 */ + Word16 *Aw_fx, /* o : weighted A(z) filter coefficients Q12 */ + const Word16 *speech_fx, /* i : pointer to the denoised speech frame Q_new */ + const Word16 tilt_fact, /* i : tilt factor Q15 */ + Word16 *wsp_fx, /* o : poitnter to the weighted speech frame Q_new */ + Word16 *mem_wsp_fx, /* i/o: W(Z) denominator memory Q_new */ + const Word16 gamma, /* i : weighting factor Q15 */ + const Word16 L_look /* i : look-ahead Q0*/ ); Word16 RCcontextMapping_encode2_estimate_bandWise_start_fx( @@ -11728,14 +11215,12 @@ Word16 RCcontextMapping_encode2_estimate_bandWise_fx( HANDLE_RC_CONTEXT_MEM hContextMem /* Q0 */ ); - /*! r: Q15 */ Word16 expfp_evs_fx( const Word16 x, /* i : mantissa Q15-e */ const Word16 x_e /* i : exponent Q0 */ ); - void tcx_arith_render_envelope_ivas_fx( const Word16 A_ind[], /* i : LPC coefficients of signal envelope Q12*/ const Word16 L_frame, /* i : number of spectral lines Q0*/ @@ -11763,7 +11248,6 @@ void tcx_arith_decode_envelope_ivas_fx( const Word16 low_complexity /* i : low-complexity flag */ ); - void UnmapIndex_fx( const Word16 PeriodicityIndex, /* Q0 */ const Word16 Bandwidth, /* Q0 */ @@ -11773,17 +11257,14 @@ void UnmapIndex_fx( Word32 *Lag /* Q0 */ ); -#define GET_ADJ( T, L ) GET_ADJ2( T, L, *FractionalResolution ) #define GET_ADJ2( T, L, F ) ( ( ( L ) << ( F ) ) - ( T ) ) - Word32 tcx_hm_render_fx( const Word32 lag, /* i: pitch lag Q0 */ const Word16 fract_res, /* i: fractional resolution of the lag Q0 */ Word16 p[] /* o: harmonic model Q13 */ ); - void tcx_hm_modify_envelope_fx( const Word16 gain, /* i: HM gain Q11 */ const Word32 lag, /* i: pitch lag Q0 */ @@ -11804,43 +11285,43 @@ void tcx_hm_decode( ); void writeTCXMode_fx( - Encoder_State *st, /* i/o: encoder state structure */ - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ - Word16 *nbits_start /* o : nbits start Q0*/ + Encoder_State *st, /* i/o: encoder state structure */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ + Word16 *nbits_start /* o : nbits start Q0*/ ); void writeTCXWindowing_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - const Word16 overlap_mode /* i : overlap mode Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const Word16 overlap_mode /* i : overlap mode Q0*/ ); void writeLPCparam( - Encoder_State *st, /* i/o: encoder state structure */ - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - const int16_t param_lpc[], /* i : LPC parameters to write */ - const int16_t bits_param_lpc[], /* i : bits per LPC parameter */ - const int16_t no_param_lpc, /* i : number of LPC parameters */ - int16_t *nbits_lpc /* o : LPC bits written */ + Encoder_State *st, /* i/o: encoder state structure */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const Word16 param_lpc[], /* i : LPC parameters to write */ + const Word16 bits_param_lpc[], /* i : bits per LPC parameter */ + const Word16 no_param_lpc, /* i : number of LPC parameters */ + Word16 *nbits_lpc /* o : LPC bits written */ ); -void const *GetTnsOnWhite( void const *p, const int16_t index, int16_t *pValue ); -void *SetTnsOnWhite( void *p, const int16_t index, const int16_t value ); -void const *GetNumOfTnsFilters_flt( void const *p, const int16_t index, int16_t *pValue ); -void *SetNumOfTnsFilters_flt( void *p, const int16_t index, const int16_t value ); +void const *GetTnsOnWhite( void const *p, const Word16 index, Word16 *pValue ); +void *SetTnsOnWhite( void *p, const Word16 index, const Word16 value ); +void const *GetNumOfTnsFilters_flt( void const *p, const Word16 index, Word16 *pValue ); +void *SetNumOfTnsFilters_flt( void *p, const Word16 index, const Word16 value ); -int16_t DecodeSWBTCX10TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); -int16_t DecodeSWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); +Word16 DecodeSWBTCX10TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); +Word16 DecodeSWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); -int16_t DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); +Word16 DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); -int16_t DecodeTnsFilterOrderSWBTCX10_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); -int16_t DecodeTnsFilterOrderSWBTCX20_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); +Word16 DecodeTnsFilterOrderSWBTCX10_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); +Word16 DecodeTnsFilterOrderSWBTCX20_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); -int16_t EncodeTnsFilterOrderSWBTCX10_flt( const int16_t value, const int16_t index ); +Word16 EncodeTnsFilterOrderSWBTCX10_flt( const Word16 value, const Word16 index ); -int16_t GetTnsFilterOrderBitsSWBTCX10_flt( const int16_t value, const int16_t index ); -int16_t DecodeTnsFilterOrder_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); +Word16 GetTnsFilterOrderBitsSWBTCX10_flt( const Word16 value, const Word16 index ); +Word16 DecodeTnsFilterOrder_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); void ResetTnsData_flt( STnsData *pTnsData ); @@ -11893,7 +11374,7 @@ void analysisCldfbEncoder_ivas_fx( ivas_error openCldfb_ivas( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ - const int32_t sampling_rate, /* i : sampling rate */ + const Word32 sampling_rate, /* i : sampling rate */ CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ ); @@ -11912,10 +11393,6 @@ Word16 is_EVS_bitrate( Word16 *Opt_AMR_WB /* i : AMR-WB IO flag */ ); -void IGFEncResetTCX10BitCounter_ivas_fx( - const IGF_ENC_INSTANCE_HANDLE hIGFEnc /* i : instance handle of IGF Encoder */ -); - ivas_error IGF_Reconfig( IGF_ENC_INSTANCE_HANDLE *hIGFEnc, /* i/o: instance handle of IGF Encoder */ const Word16 igf, /* i : IGF on/off */ diff --git a/lib_com/pvq_com_fx.c b/lib_com/pvq_com_fx.c index 479bc04d9c357ca0101de7e154b903b3e4d75924..49a83bc7bba3971805ddde88e8584f9824c8c9a5 100644 --- a/lib_com/pvq_com_fx.c +++ b/lib_com/pvq_com_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -52,8 +52,8 @@ Word16 shrtCDivSignedApprox( } static void nearProjQ15_fx( - const Word16 x, /* i : input coefficient Q15*/ - Word16 *result /* o : projection Q15*/ + const Word16 x, /* i : input coefficient Q15*/ + Word16 *result /* o : projection Q15*/ ) { const Word16 a[4] = { 14967, -25518, 3415, 32351 }; /* Q15 */ @@ -81,9 +81,9 @@ static void nearProjQ15_fx( * *-------------------------------------------------------------------*/ void obtainEnergyQuantizerDensity_fx( - const Word16 L, /* i : left vector energy Q0*/ - const Word16 R, /* i : right vector energy Q0*/ - Word16 *Density /* o : quantizer density Q0*/ + const Word16 L, /* i : left vector energy Q0*/ + const Word16 R, /* i : right vector energy Q0*/ + Word16 *Density /* o : quantizer density Q0*/ ) { Word16 Rnrg, den, n; @@ -117,8 +117,8 @@ void obtainEnergyQuantizerDensity_fx( * *-------------------------------------------------------------------*/ void dsDirac2Dirac_fx( - const Word16 dsDiracIndex, /* i : input index Q0*/ - Word16 *diracs /* o : number of diracs Q0*/ + const Word16 dsDiracIndex, /* i : input index Q0*/ + Word16 *diracs /* o : number of diracs Q0*/ ) { *diracs = dsDiracsTab[dsDiracIndex]; /* Q0 */ @@ -127,11 +127,11 @@ void dsDirac2Dirac_fx( } void dsDiracPerQuanta_fx( - const Word16 td, /* i : Length of vector segment Q0*/ - const Word16 t_quanta, /* i : Assigned number of quanta Q0*/ - const Word16 dsm, /* i : Conservative rounding flag Q0*/ - const unsigned char *const *frQuanta, /* i : Quanta lookup table */ - Word16 *DsIdx /* o : Lookup table index Q0*/ + const Word16 td, /* i : Length of vector segment Q0*/ + const Word16 t_quanta, /* i : Assigned number of quanta Q0*/ + const Word16 dsm, /* i : Conservative rounding flag Q0*/ + const unsigned char *const *frQuanta, /* i : Quanta lookup table */ + Word16 *DsIdx /* o : Lookup table index Q0*/ ) { const unsigned char *sv; @@ -241,7 +241,7 @@ void conservativeL1Norm_fx( if ( Mprime < 0 ) { - *Qspare = add( Qavail, QUANTAQ3OFFSET ); /* single op Q0*/ + *Qspare = add( Qavail, QUANTAQ3OFFSET ); /* single op Q0*/ move16(); } dsDirac2Dirac_fx( add( Mprime, 1 ), Dvec ); @@ -280,7 +280,7 @@ void bandBitsAdjustment_fx( IF( LT_16( D, Nbands ) ) { L_tmp = L_deposit_l( sub( Breserv, Bff ) ); /* Q0 */ - Btemp = extract_l( intLimCDivSigned_fx( L_tmp, s_min( D, 3 ) ) ); /* result always fits in Word16 Q0*/ + Btemp = extract_l( intLimCDivSigned_fx( L_tmp, s_min( D, 3 ) ) ); /* result always fits in Word16 Q0*/ *Breservplus = add( Bband, Breserv ); /* Q0 */ move16(); } @@ -329,9 +329,9 @@ static Word16 Ratio_base2Q11_fx( /* o : Q11 */ } static void Ratio_rQ3_fx( - Word16 opp, /* i : opposite Q15*/ - Word16 near, /* i : near Q15*/ - Word16 *result /* o : ratio Q3*/ + Word16 opp, /* i : opposite Q15*/ + Word16 near, /* i : near Q15*/ + Word16 *result /* o : ratio Q3*/ ) { Word16 tmp; @@ -344,11 +344,11 @@ static void Ratio_rQ3_fx( void densityAngle2RmsProjDec_fx( - const Word16 D, /* i : density Q0*/ - const Word16 indexphi, /* i : decoded index from AR dec Q0*/ - Word16 *oppQ15, /* o : opposite Q15*/ - Word16 *nearQ15, /* o : near Q15*/ - Word16 *oppRatioQ3 /* o : ratio Q3*/ + const Word16 D, /* i : density Q0*/ + const Word16 indexphi, /* i : decoded index from AR dec Q0*/ + Word16 *oppQ15, /* o : opposite Q15*/ + Word16 *nearQ15, /* o : near Q15*/ + Word16 *oppRatioQ3 /* o : ratio Q3*/ ) { Word16 phiQ14q; @@ -385,12 +385,12 @@ void densityAngle2RmsProjDec_fx( } void densityAngle2RmsProjEnc_fx( - const Word16 D, /* i : density Q0*/ - const Word16 phiQ14uq, /* i : angle Q14*/ - Word16 *indexphi, /* o : index Q0*/ - Word16 *oppQ15, /* o : opposite Q15*/ - Word16 *nearQ15, /* o : near Q15*/ - Word16 *oppRatioQ3 /* o : ratio Q3*/ + const Word16 D, /* i : density Q0*/ + const Word16 phiQ14uq, /* i : angle Q14*/ + Word16 *indexphi, /* o : index Q0*/ + Word16 *oppQ15, /* o : opposite Q15*/ + Word16 *nearQ15, /* o : near Q15*/ + Word16 *oppRatioQ3 /* o : ratio Q3*/ ) { *indexphi = mult_r( shl( D, 1 ), phiQ14uq ); /* Q0 */ @@ -427,10 +427,6 @@ void NearOppSplitAdjustment_fx( Word16 qac, qboth, qskew, qavg, qmin, Midx; Word32 L_QIb, L_qnum; Word16 QIb, QIa; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif rangeCoderFinalizationFBits_fx( Qac, INTac, &qac ); qboth = sub( qband, sub( qac, qzero ) ); /* Q0 */ @@ -439,14 +435,14 @@ void NearOppSplitAdjustment_fx( move16(); IF( GT_16( Nhead, 1 ) ) { - qavg = extract_h( L_shl( intLimCDivSigned_fx( L_deposit_l( qboth ), Np ), 16 ) ); /* qboth may be negative Q0*/ + qavg = extract_h( L_shl( intLimCDivSigned_fx( L_deposit_l( qboth ), Np ), 16 ) ); /* qboth may be negative Q0*/ dsDiracPerQuanta_fx( Ntail, qavg, FlagCons, hBitsN, &Midx ); QuantaPerDsDirac_fx( Nhead, Midx, hBitsN, &qmin ); qskew = sub( qavg, qmin ); /* Q0 */ qskew = s_max( 0, qskew ); /* Q0 */ } /* end of skew calc code*/ - QIa = add( extract_l( intLimCDivPos_fx( (UWord32) L_deposit_l( Nopp ), Nnear ) ), 1 ); /* always positive Word16 out Q0*/ + QIa = add( extract_l( intLimCDivPos_fx( (UWord32) L_deposit_l( Nopp ), Nnear ) ), 1 ); /* always positive Word16 out Q0*/ L_qnum = L_sub( L_deposit_l( sub( sub( add( qband, qzero ), qac ), qskew ) ), L_mult0( Nopp, oppRQ3 ) ); /* Q0 */ L_QIb = L_deposit_l( 0 ); @@ -456,7 +452,7 @@ void NearOppSplitAdjustment_fx( } *qnear = qboth; /* Q3 */ move16(); - QIb = extract_h( L_shl_o( L_QIb, 16, &Overflow ) ); /* may saturate Q0*/ + QIb = extract_h( L_shl_sat( L_QIb, 16 ) ); /* may saturate Q0*/ if ( LE_16( QIb, qboth ) ) { *qnear = QIb; /* Q0 */ @@ -478,12 +474,12 @@ void NearOppSplitAdjustment_fx( *--------------------------------------------------------------------------*/ void apply_gain_fx( - const Word16 *ord, /* i : Indices for energy order Q0 */ - const Word16 *band_start, /* i : Sub band start indices Q0 */ - const Word16 *band_end, /* i : Sub band end indices Q0 */ - const Word16 num_sfm, /* i : Number of bands Q0 */ - const Word16 *gains, /* i : Band gain vector Qx */ - Word16 *xq /* i/o: Float synthesis / Gain adjusted synth Q15/Qx */ + const Word16 *ord, /* i : Indices for energy order Q0 */ + const Word16 *band_start, /* i : Sub band start indices Q0 */ + const Word16 *band_end, /* i : Sub band end indices Q0 */ + const Word16 num_sfm, /* i : Number of bands Q0 */ + const Word16 *gains, /* i : Band gain vector Qx */ + Word16 *xq /* i/o: synthesis / Gain adjusted synth Q15/Qx */ ) { Word16 band, i; @@ -509,75 +505,8 @@ void apply_gain_fx( * * Fine gain quantization *--------------------------------------------------------------------------*/ -void fine_gain_quant_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 *ord, /* i : Indices for energy order Q0 */ - const Word16 num_sfm, /* i : Number of bands Q0 */ - const Word16 *gain_bits, /* i : Gain adjustment bits per sub band Q0 */ - Word16 *fg_pred, /* i/o: Predicted gains / Corrected gains i:Q12 / o:Q11 */ - const Word16 *gopt /* i : Optimal gains Q12 */ -) -{ - Word16 band; - Word16 gbits; - Word16 idx; - Word16 gain_db, gain_dbq; - Word16 err; - - Word16 tmp1, tmp2, exp1, exp2; - Word32 L_tmp; - UWord16 lsb; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - FOR( band = 0; band < num_sfm; band++ ) - { - gbits = gain_bits[ord[band]]; /* Q0 */ - move16(); - test(); - IF( fg_pred[band] != 0 && gbits > 0 ) - { - exp1 = norm_s( gopt[band] ); - exp1 = sub( exp1, 1 ); - tmp1 = shl( gopt[band], exp1 ); - exp2 = norm_s( fg_pred[band] ); - tmp2 = shl( fg_pred[band], exp2 ); /* Q12 + exp2 */ - exp1 = add( 15, sub( exp1, exp2 ) ); - err = div_s( tmp1, tmp2 ); /* Q15 */ - tmp1 = norm_s( err ); - exp2 = Log2_norm_lc( L_deposit_h( shl( err, tmp1 ) ) ); - tmp1 = sub( 14, tmp1 ); - tmp1 = sub( tmp1, exp1 ); - L_tmp = L_Comp( tmp1, exp2 ); - Mpy_32_16_ss( L_tmp, 24660, &L_tmp, &lsb ); /* 24660 = 20*log10(2) in Q12 */ /*16+12-15=13 */ - gain_db = round_fx_sat( L_shl_o( L_tmp, 17, &Overflow ) ); /* Q14 */ - - idx = squant_fx( gain_db, &gain_dbq, finegain_fx[gbits - 1], gain_cb_size[gbits - 1] ); /* Q0 */ - push_indice( hBstr, IND_PVQ_FINE_GAIN, idx, gbits ); - - L_tmp = L_mult0( gain_dbq, 21771 ); /* 21771=0.05*log2(10) */ /* 14+17=31 */ - L_tmp = L_shr( L_tmp, 15 ); /* Q16 */ - tmp1 = L_Extract_lc( L_tmp, &exp1 ); - tmp1 = abs_s( tmp1 ); - tmp1 = extract_l( Pow2( 14, tmp1 ) ); - exp1 = sub( 14, exp1 ); - - L_tmp = L_mult0( fg_pred[band], tmp1 ); /*12+exp1 */ - fg_pred[band] = round_fx( L_shl( L_tmp, sub( 15, exp1 ) ) ); /*12+exp1+16-exp1-16=12 - 1-> Q11*/ - move16(); - } - ELSE - { - fg_pred[band] = shr( fg_pred[band], 1 ); // Q12 -> Q11 To align all the fg_pred indices in same Q. - } - } - - return; -} void fine_gain_quant_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const Word16 *ord, /* i : Indices for energy order Q0 */ const Word16 num_sfm, /* i : Number of bands Q0 */ const Word16 *gain_bits, /* i : Gain adjustment bits per sub band Q0 */ @@ -594,10 +523,6 @@ void fine_gain_quant_fx( Word16 tmp1, tmp2, exp1, exp2; Word32 L_tmp; UWord16 lsb; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif FOR( band = 0; band < num_sfm; band++ ) { @@ -619,10 +544,10 @@ void fine_gain_quant_fx( tmp1 = sub( tmp1, exp1 ); L_tmp = L_Comp( tmp1, exp2 ); Mpy_32_16_ss( L_tmp, 24660, &L_tmp, &lsb ); /* 24660 = 20*log10(2) in Q12 */ /*16+12-15=13 */ - gain_db = round_fx_sat( L_shl_o( L_tmp, 17, &Overflow ) ); + gain_db = round_fx_sat( L_shl_sat( L_tmp, 17 ) ); idx = squant_fx( gain_db, &gain_dbq, finegain_fx[gbits - 1], gain_cb_size[gbits - 1] ); - push_indice_fx( hBstr, IND_PVQ_FINE_GAIN, idx, gbits ); + push_indice( hBstr, IND_PVQ_FINE_GAIN, idx, gbits ); L_tmp = L_mult0( gain_dbq, 21771 ); /* 21771=0.05*log2(10) */ /* 14+17=31 */ L_tmp = L_shr( L_tmp, 15 ); /* Q16 */ @@ -631,8 +556,8 @@ void fine_gain_quant_fx( tmp1 = extract_l( Pow2( 14, tmp1 ) ); exp1 = sub( 14, exp1 ); - L_tmp = L_mult0( fg_pred[band], tmp1 ); /*12+exp1 */ - fg_pred[band] = round_fx( L_shl( L_tmp, sub( 16, exp1 ) ) ); /*12+exp1+16-exp1-16=12 */ + L_tmp = L_mult0( fg_pred[band], tmp1 ); /*12+exp1 */ + fg_pred[band] = round_fx_sat( L_shl_sat( L_tmp, sub( 16, exp1 ) ) ); /*12+exp1+16-exp1-16=12 */ move16(); } } @@ -647,9 +572,9 @@ void fine_gain_quant_fx( *-------------------------------------------------------------------*/ void srt_vec_ind16_fx( - const Word16 *linear, /* linear input Q3*/ - Word16 *srt, /* sorted output Q3*/ - Word16 *I, /* index for sorted output Q0*/ + const Word16 *linear, /* linear input Q3*/ + Word16 *srt, /* sorted output Q3*/ + Word16 *I, /* index for sorted output Q0*/ Word16 length /* Q0 */ ) { diff --git a/lib_com/range_com_fx.c b/lib_com/range_com_fx.c index b84ec6c26756c7fa5aa080d2300971f81f3475e4..94eb888b72567ff1f3e746a7ec3062d4ba394b3d 100644 --- a/lib_com/range_com_fx.c +++ b/lib_com/range_com_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -13,9 +13,9 @@ * Get number of bits needed to finalize range coder *-------------------------------------------------------------------*/ -Word16 rc_get_bits2_fx( /* o: Number of bits needed Q0*/ - const Word16 N, /* i: Number of bits currently used Q0*/ - const UWord32 range /* i: Range of range coder Q0*/ +Word16 rc_get_bits2_fx( /* o: Number of bits needed Q0*/ + const Word16 N, /* i: Number of bits currently used Q0*/ + const UWord32 range /* i: Range of range coder Q0*/ ) { return add( add( N, 2 ), norm_ul( range ) ); @@ -28,9 +28,9 @@ Word16 rc_get_bits2_fx( /* o: Number of bits needed Q0*/ *-------------------------------------------------------------------*/ void rangeCoderFinalizationFBits_fx( - Word16 Brc, /* i : Current number of decoded bits Q0*/ - UWord32 INTrc, /* i : Range coder state Q0*/ - Word16 *FBits /* i : Fractional finalization bits Q0*/ + Word16 Brc, /* i : Current number of decoded bits Q0*/ + UWord32 INTrc, /* i : Range coder state Q0*/ + Word16 *FBits /* i : Fractional finalization bits Q0*/ ) { Word32 L_Bq15; diff --git a/lib_com/re8_ppv_fx.c b/lib_com/re8_ppv_fx.c index c643bf1ea21c69568e61b3a6b8e0b939d1a609ff..5398214b4cf4422896c1115aba2ef213df2d3429 100644 --- a/lib_com/re8_ppv_fx.c +++ b/lib_com/re8_ppv_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include "options.h" /* Compilation switches */ @@ -24,8 +24,8 @@ static Word32 compute_error_2D8_fx( const Word32 x[], const Word16 y[] ); * --------------------------------------------------------------*/ void re8_PPV_fx( - const Word32 x[], /* i : point in R^8 Q15 */ - Word16 y[] /* o : point in RE8 (8-dimensional integer vector) Q0*/ + const Word32 x[], /* i : point in R^8 Q15 */ + Word16 y[] /* o : point in RE8 (8-dimensional integer vector) Q0*/ ) { Word16 i, y0[8]; @@ -83,8 +83,8 @@ void re8_PPV_fx( --------------------------------------------------------------*/ static void nearest_neighbor_2D8_fx( - const Word32 x[], /* i : point in R^8 Q15*/ - Word16 y[] /* o : point in 2D8 (8-dimensional integer vector) Q0*/ + const Word32 x[], /* i : point in R^8 Q15*/ + Word16 y[] /* o : point in 2D8 (8-dimensional integer vector) Q0*/ ) { Word16 i, j; @@ -164,9 +164,9 @@ static void nearest_neighbor_2D8_fx( * (quantized) point in 2D8. --------------------------------------------------------------*/ -static Word32 compute_error_2D8_fx( /* o : mean squared error Q15*/ - const Word32 x[], /* i : input vector Q15*/ - const Word16 y[] /* i : point in 2D8 (8-dimensional integer vector) Q0*/ +static Word32 compute_error_2D8_fx( /* o : mean squared error Q15*/ + const Word32 x[], /* i : input vector Q15*/ + const Word16 y[] /* i : point in 2D8 (8-dimensional integer vector) Q0*/ ) { Word16 i, hi, lo; diff --git a/lib_com/re8_util_fx.c b/lib_com/re8_util_fx.c index de70279ebf63772e0a2bd841a2c5633ea1e94dca..cf5db258d50df53908dd11a947df4b39f5d9c30a 100644 --- a/lib_com/re8_util_fx.c +++ b/lib_com/re8_util_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -23,11 +23,11 @@ static void re8_coord_fx( const Word16 *y, Word16 *k ); * MULTI-RATE RE8 INDEXING BY VORONOI EXTENSION *----------------------------------------------------------------*/ void re8_vor_fx( - const Word16 y[], /* i : point in RE8 (8-dimensional integer vector) Q0*/ - Word16 *n, /* o : codebook number n=0,2,3,4,... (scalar integer) Q0*/ - Word16 k[], /* o : Voronoi index (integer vector of dimension 8) used only if n>4 Q0*/ - Word16 c[], /* o : codevector in Q0, Q2, Q3, or Q4 if n<=4, y=c Q0*/ - Word16 *ka /* o : identifier of absolute leader (to index c) Q0*/ + const Word16 y[], /* i : point in RE8 (8-dimensional integer vector) Q0*/ + Word16 *n, /* o : codebook number n=0,2,3,4,... (scalar integer) Q0*/ + Word16 k[], /* o : Voronoi index (integer vector of dimension 8) used only if n>4 Q0*/ + Word16 c[], /* o : codevector in Q0, Q2, Q3, or Q4 if n<=4, y=c Q0*/ + Word16 *ka /* o : identifier of absolute leader (to index c) Q0*/ ) { Word16 i, r, iter, ka_tmp, n_tmp, mask; @@ -99,7 +99,7 @@ void re8_vor_fx( /*------------------------------------------------------------* * compute m and the mask needed for modulo m (for Voronoi coding) *------------------------------------------------------------*/ - mask = sub( shl( 1, r ), 1 ); /* 0x0..011...1 Q0*/ + mask = sub( shl( 1, r ), 1 ); /* 0x0..011...1 Q0*/ /*------------------------------------------------------------* * find the minimal value of r (or equivalently of m) in 2 iterations @@ -187,9 +187,9 @@ void re8_vor_fx( * VORONOI INDEXING (INDEX DECODING) k -> y -------------------------------------------------------------------------*/ void re8_k2y_fx( - const Word16 *k, /* i : Voronoi index k[0..7] Q0*/ - const Word16 m, /* i : Voronoi modulo (m = 2^r = 1<=2) Q0*/ - Word16 *y /* o : 8-dimensional point y[0..7] in RE8 Q0*/ + const Word16 *k, /* i : Voronoi index k[0..7] Q0*/ + const Word16 m, /* i : Voronoi modulo (m = 2^r = 1<=2) Q0*/ + Word16 *y /* o : 8-dimensional point y[0..7] in RE8 Q0*/ ) { Word16 i, v[8], *ptr1, *ptr2, m_tmp, mm; @@ -318,8 +318,8 @@ static Word16 re8_identify_absolute_leader_fx( /* o : integer i * only the id's related to the shell of number s are checked *---------------------------------------------------------------*/ - nb = Da_nb[s - 1]; /* get the number of absolute leaders used on the shell of number s Q0*/ - pos = Da_pos[s - 1]; /* get the position of the first absolute leader of shell s in Da_id Q0*/ + nb = Da_nb[s - 1]; /* get the number of absolute leaders used on the shell of number s Q0*/ + pos = Da_pos[s - 1]; /* get the position of the first absolute leader of shell s in Da_id Q0*/ move16(); move16(); @@ -350,8 +350,8 @@ static Word16 re8_identify_absolute_leader_fx( /* o : integer i -----------------------------------------------------------------------*/ static void re8_coord_fx( - const Word16 *y, /* i : 8-dimensional point y[0..7] in RE8 Q0*/ - Word16 *k /* o : coordinates k[0..7] Q0*/ + const Word16 *y, /* i : 8-dimensional point y[0..7] in RE8 Q0*/ + Word16 *k /* o : coordinates k[0..7] Q0*/ ) { Word16 i, tmp, sum; diff --git a/lib_com/recovernorm_fx.c b/lib_com/recovernorm_fx.c index 2f98597583c50159430e9798c37b86d42a4abde9..83167ea621c6341b39e3b88100d41ec3882180f6 100644 --- a/lib_com/recovernorm_fx.c +++ b/lib_com/recovernorm_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -14,10 +14,10 @@ *--------------------------------------------------------------------------*/ void recovernorm_fx( - const Word16 *idxbuf, /* i : reordered quantization indices Q0*/ - Word16 *ynrm, /* o : recovered quantization indices Q0*/ - Word16 *normqlg2, /* o : recovered quantized norms Q0*/ - const Word16 nb_sfm /* i : number of SFMs Q0*/ + const Word16 *idxbuf, /* i : reordered quantization indices Q0*/ + Word16 *ynrm, /* o : recovered quantization indices Q0*/ + Word16 *normqlg2, /* o : recovered quantized norms Q0*/ + const Word16 nb_sfm /* i : number of SFMs Q0*/ ) { Word16 i, j, k; diff --git a/lib_com/residu_fx.c b/lib_com/residu_fx.c index 32d18d1feb543401666d751fb554240dce4e8e6f..60c0c3356f5d827efb551da6df2ab08a57a3ff26 100644 --- a/lib_com/residu_fx.c +++ b/lib_com/residu_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -62,43 +62,41 @@ void Residu3_lc_fx( Word16 i, j; Word32 s; Word16 q; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif q = add( norm_s( a[0] ), 1 ); if ( shift > 0 ) { q = add( q, shift ); } - *y++ = shl_o( x[0], shift, &Overflow ); + *y++ = shl_sat( x[0], shift ); move16(); FOR( i = 1; i < m; i++ ) { - s = L_mult_o( x[i], a[0], &Overflow ); + s = L_mult_sat( x[i], a[0] ); /* Stop at i to Avoid Mults with Zeros */ FOR( j = 1; j <= i; j++ ) { - s = L_mac_o( s, x[i - j], a[j], &Overflow ); + s = L_mac_sat( s, x[i - j], a[j] ); } - s = L_shl_o( s, q, &Overflow ); - *y++ = round_fx_o( s, &Overflow ); + s = L_shl_sat( s, q ); + *y++ = round_fx_sat( s ); } FOR( ; i < lg; i++ ) { - s = L_mult_o( x[i], a[0], &Overflow ); + s = L_mult_sat( x[i], a[0] ); FOR( j = 1; j <= m; j++ ) { - s = L_mac_o( s, x[i - j], a[j], &Overflow ); + s = L_mac_sat( s, x[i - j], a[j] ); } - s = L_shl_o( s, q, &Overflow ); - *y++ = round_fx_o( s, &Overflow ); + s = L_shl_sat( s, q ); + *y++ = round_fx_sat( s ); } + + return; } /*--------------------------------------------------------------------* @@ -132,7 +130,10 @@ void Residu3_10_fx( s = W_shl_sat_l( s64, q ); y[i] = round_fx_sat( s ); } + + return; } + /*--------------------------------------------------------------------* * Residu3_fx: * @@ -151,12 +152,9 @@ void Residu3_fx( Word64 s64; Word32 s32; Word16 q; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif + q = add( norm_s( a[0] ), 1 ); - IF( shift != 0 ) + if ( shift != 0 ) { q = add( q, shift ); } @@ -170,30 +168,33 @@ void Residu3_fx( } s64 = W_mac_16_16( s64, x[i - 16], a[16] ); s32 = W_shl_sat_l( s64, q ); - y[i] = round_fx_o( s32, &Overflow ); + y[i] = round_fx_sat( s32 ); move16(); } + + return; } + /*==========================================================================*/ -/* FUNCTION : void calc_residu() */ +/* FUNCTION : void calc_residu() */ /*--------------------------------------------------------------------------*/ -/* PURPOSE : Compute the LP residual by filtering the input through */ -/* A(z) in all subframes */ +/* PURPOSE : Compute the LP residual by filtering the input through */ +/* A(z) in all subframes */ /*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* Word16 *speech i : weighted speech signal Qx */ -/* Word16 L_frame i : order of LP filter Q0 */ +/* Word16 L_frame i : order of LP filter Q0 */ /* Word16 *p_Aq i : quantized LP filter coefficients Q12 */ /*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /* Word16 *res o : residual signal Qx+1 */ /*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*--------------------------------------------------------------------------*/ -/* CALLED FROM : */ +/* CALLED FROM : */ /*==========================================================================*/ void calc_residu_fx( diff --git a/lib_com/rom_basop_util.h b/lib_com/rom_basop_util.h index e7811db89fa50d2dce8a529ae386ae1654dd03bc..63b55fe59b013b680023ac62f9706f119d26cbeb 100644 --- a/lib_com/rom_basop_util.h +++ b/lib_com/rom_basop_util.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef __BASOP_UTIL_ROM_H__ diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c deleted file mode 100644 index e6f392ff052447fc041550bd5066810d4361e86b..0000000000000000000000000000000000000000 --- a/lib_com/rom_com.c +++ /dev/null @@ -1,30709 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include "cnst.h" -#include "rom_com.h" -#include "prot_fx.h" -#include "basop_util.h" -#include "wmc_auto.h" - -/* clang-format off */ - -/*----------------------------------------------------------------------------------* - * Table of bitrates - *----------------------------------------------------------------------------------*/ -#define W16(x) ((Word16)x) - -const Word32 brate_tbl[SIZE_BRATE_TBL] = // Q0 -{ - ACELP_7k20, ACELP_8k00, ACELP_9k60, ACELP_13k20, ACELP_16k40, ACELP_24k40, - ACELP_32k, ACELP_48k, ACELP_64k, HQ_96k, HQ_128k -}; - -const Word32 brate_intermed_tbl[SIZE_BRATE_INTERMED_TBL] = // Q0 -{ - ACELP_5k00, ACELP_6k15, ACELP_7k20, ACELP_8k00, ACELP_9k60, ACELP_11k60, ACELP_12k15, ACELP_12k85, ACELP_13k20, - ACELP_14k80, ACELP_16k40, ACELP_22k60, ACELP_24k40, ACELP_29k00, ACELP_29k20, ACELP_30k20, - ACELP_30k40, ACELP_32k, ACELP_48k, ACELP_64k, HQ_96k, HQ_128k -}; - -const Word16 bit_rates_div50[] = /* bit rate values / 50 to Fit in a Word16 */ -{ - ACELP_5k00 / 50, ACELP_6k15 / 50, ACELP_7k20 / 50, ACELP_8k00 / 50, ACELP_9k60 / 50, ACELP_11k60 / 50, ACELP_12k15 / 50, - ACELP_12k85 / 50, ACELP_13k20 / 50, ACELP_14k80 / 50, ACELP_16k40 / 50, ACELP_22k60 / 50, - ACELP_24k40 / 50, ACELP_29k00 / 50, ACELP_29k20 / 50, ACELP_30k20 / 50, ACELP_30k40 / 50, - ACELP_32k / 50, ACELP_48k / 50, ACELP_64k / 50, HQ_96k / 50, HQ_128k / 50 -}; - -const Word16 bit_rates_16k_div50[] = /* bit rate values / 50 to Fit in a Word16 */ -{ - ACELP_8k00 / 50, ACELP_14k80 / 50, ACELP_22k60 / 50, ACELP_24k40 / 50, ACELP_29k00 / 50, - ACELP_29k20 / 50, ACELP_30k20 / 50, ACELP_30k40 / 50, ACELP_32k / 50, ACELP_48k / 50, ACELP_64k / 50 -}; - -/*----------------------------------------------------------------------------------* - * Frame size and mode configuration tables - *----------------------------------------------------------------------------------*/ - -const FrameSizeParams FrameSizeConfig[FRAME_SIZE_NB] = -{ - /* bits, net bits, trans_bits, trans_mode, band_bits, band_mode_min, band_mode_max, reserved_bits */ - { FRAME_0, FRAME_0, 0, {0,0}, 0, 0, 0, 0}, /* 0 kbps ZERO_FRAME*/ - { FRAME_2_4, FRAME_2_4-2, 1, {1,1}, 1, NB, WB, 0}, /* 2.4kbps VBR(SID)*/ - { FRAME_7_2, FRAME_7_2-1, 0, {0,1}, 1, NB, WB, 0}, /* 7.2kbps VBR/CBR*/ - { FRAME_8, FRAME_8-1, 0, {0,1}, 1, NB, WB, 0}, /* 8 kbps VBR/CBR*/ - { FRAME_9_6, FRAME_9_6-2, 0, {0,1}, 2, NB, SWB, 0}, /* 9.6kbps CBR*/ - { FRAME_13_2, FRAME_13_2-2, 0, {0,1}, 2, NB, SWB, 0}, /* 13.2kbps CBR*/ - { FRAME_16_4, FRAME_16_4-3, 0, {0,1}, 2, NB, FB, 1}, /* 16.4kbps CBR*/ - { FRAME_24_4, FRAME_24_4-3, 0, {0,1}, 2, NB, FB, 1}, /* 24.4kbps CBR*/ - { FRAME_32, FRAME_32-3, 0, {0,1}, 2, WB, FB, 1}, /* 32 kbps CBR*/ - { FRAME_48, FRAME_48-3, 0, {0,1}, 2, WB, FB, 1}, /* 48 kbps CBR*/ - { FRAME_64, FRAME_64-3, 0, {0,1}, 2, WB, FB, 1}, /* 64 kbps CBR*/ - { FRAME_96, FRAME_96-3, 0, {0,1}, 2, WB, FB, 1}, /* 96 kbps CBR*/ - { FRAME_128, FRAME_128-3, 0, {0,1}, 2, WB, FB, 1} /*128 kbps CBR*/ -}; - - -/*----------------------------------------------------------------------------------* - * Conversion of ACELP signaling parameters (ACELP internal Fs, coder type, bandwidth, sharpening flag) to index - * (to be consulted with the decision matrix) - * - * - in order to retrieve the index, each section in this table starts with the bitrate - * - the second value in each section corresponds to the number of bits - * - the other values represent indices created by combining different parameters into a single value through the macro SIG2IND() - *----------------------------------------------------------------------------------*/ - -const Word32 acelp_sig_tbl[MAX_ACELP_SIG] = // Q0 -{ - /* GENERIC UNVOICED VOICED TRANSITION AUDIO INACTIVE */ - ACELP_7k20, 4, - SIG2IND(GENERIC, NB, 1, 0), SIG2IND(UNVOICED, NB, 0, 0), SIG2IND(VOICED, NB, 1, 0), SIG2IND(TRANSITION, NB, 1, 0), SIG2IND(AUDIO, NB, 0, 0), SIG2IND(INACTIVE, NB, 0, 0), - SIG2IND(GENERIC, WB, 1, 0), SIG2IND(UNVOICED, WB, 0, 0), SIG2IND(VOICED, WB, 1, 0), SIG2IND(TRANSITION, WB, 1, 0), SIG2IND(AUDIO, WB, 0, 0), SIG2IND(INACTIVE, WB, 0, 0), - SIG2IND(GENERIC, NB, 0, 0), - SIG2IND(GENERIC, WB, 0, 0), - SIG2IND(LR_MDCT, NB, 0, 0), - - ACELP_8k00, 4, - SIG2IND(GENERIC, NB, 1, 0), SIG2IND(UNVOICED, NB, 0, 0), SIG2IND(VOICED, NB, 1, 0), SIG2IND(TRANSITION, NB, 1, 0), SIG2IND(AUDIO, NB, 0, 0), SIG2IND(INACTIVE, NB, 0, 0), - SIG2IND(GENERIC, WB, 1, 0), SIG2IND(UNVOICED, WB, 0, 0), SIG2IND(VOICED, WB, 1, 0), SIG2IND(TRANSITION, WB, 1, 0), SIG2IND(AUDIO, WB, 0, 0), SIG2IND(INACTIVE, WB, 0, 0), - SIG2IND(GENERIC, NB, 0, 0), - SIG2IND(GENERIC, WB, 0, 0), - SIG2IND(LR_MDCT, NB, 0, 0), - - ACELP_13k20, 5, - SIG2IND(GENERIC, NB, 1, 0), SIG2IND(VOICED, NB, 1, 0), SIG2IND(TRANSITION, NB, 0, 0), SIG2IND(AUDIO, NB, 0, 0), SIG2IND(INACTIVE, NB, 0, 0), - SIG2IND(GENERIC, WB, 1, 0), SIG2IND(VOICED, WB, 1, 0), SIG2IND(TRANSITION, WB, 0, 0), SIG2IND(AUDIO, WB, 0, 0), SIG2IND(INACTIVE, WB, 0, 0), - SIG2IND(GENERIC, SWB, 1, 0), SIG2IND(VOICED, SWB, 1, 0), SIG2IND(TRANSITION, SWB, 0, 0), SIG2IND(AUDIO, SWB, 0, 0), SIG2IND(INACTIVE, SWB, 0, 0), - SIG2IND(GENERIC, NB, 0, 0), SIG2IND(VOICED, NB, 0, 0), - SIG2IND(GENERIC, WB, 0, 0), SIG2IND(VOICED, WB, 0, 0), - SIG2IND(GENERIC, SWB, 0, 0), SIG2IND(VOICED, SWB, 0, 0), - SIG2IND(GENERIC, WB, 1, 1), SIG2IND(UNVOICED, WB, 0, 1), SIG2IND(VOICED, WB, 1, 1), SIG2IND(INACTIVE, WB, 0, 1), - SIG2IND(GENERIC, SWB, 1, 1), SIG2IND(UNVOICED, SWB, 0, 1), SIG2IND(VOICED, SWB, 1, 1), SIG2IND(INACTIVE, SWB, 0, 1), - SIG2IND(LR_MDCT, NB, 0, 0), - SIG2IND(LR_MDCT, WB, 0, 0), - SIG2IND(LR_MDCT, SWB, 0, 0), - - ACELP_32k, 4, - SIG2IND(GENERIC, WB, 1, 0), SIG2IND(TRANSITION, WB, 1, 0), SIG2IND(INACTIVE, WB, 0, 0), - SIG2IND(GENERIC, SWB, 1, 0), SIG2IND(TRANSITION, SWB, 1, 0), SIG2IND(INACTIVE, SWB, 0, 0), - SIG2IND(GENERIC, FB, 1, 0), SIG2IND(TRANSITION, FB, 1, 0), SIG2IND(INACTIVE, FB, 0, 0), - SIG2IND(GENERIC, WB, 0, 0), SIG2IND(TRANSITION, WB, 0, 0), - SIG2IND(GENERIC, SWB, 0, 0), SIG2IND(TRANSITION, SWB, 0, 0), - SIG2IND(GENERIC, FB, 0, 0), SIG2IND(TRANSITION, FB, 0, 0), - - ACELP_64k, 4, - SIG2IND(GENERIC, WB, 0, 0), SIG2IND(TRANSITION, WB, 0, 0), SIG2IND(INACTIVE, WB, 0, 0), - SIG2IND(GENERIC, SWB, 1, 0), SIG2IND(TRANSITION, SWB, 1, 0), SIG2IND(INACTIVE, SWB, 0, 0), - SIG2IND(GENERIC, FB, 1, 0), SIG2IND(TRANSITION, FB, 1, 0), SIG2IND(INACTIVE, FB, 0, 0), - SIG2IND(GENERIC, SWB, 0, 0), SIG2IND(TRANSITION, SWB, 0, 0), - SIG2IND(GENERIC, FB, 0, 0), SIG2IND(TRANSITION, FB, 0, 0), -}; - -/*----------------------------------------------------------------------------------* - * ACELP bit allocation tables - *----------------------------------------------------------------------------------*/ - -/* bit allocation table for end-frame LSF quantizer */ -const Word16 LSF_bits_tbl[] = // Q0 -{ - /* IC UC VC GC TC AC */ - 22, 31, 24, 29, 24, 22, /* ACELP_5k00 */ - 22, 31, 24, 29, 24, 22, /* ACELP_6k15 */ - 22, 37, 31, 29, 31, 22, /* ACELP_7k20 */ - 22, 40, 36, 33, 34, 22, /* ACELP_8k00 */ - 27, 40, 34, 35, 37, 27, /* ACELP_9k60 */ - 31, 0, 37, 37, 40, 31, /* ACELP_11k60 */ - 31, 0, 39, 39, 41, 31, /* ACELP_12k15 */ - 31, 0, 38, 38, 40, 31, /* ACELP_12k85 */ - 31, 0, 38, 38, 40, 31, /* ACELP_13k20 */ - 31, 0, 37, 42, 42, 31, /* ACELP_14k80 */ - 31, 0, 43, 40, 40, 31, /* ACELP_16k40 */ - 31, 0, 42, 40, 40, 31, /* ACELP_22k60 */ - 31, 0, 46, 41, 41, 31, /* ACELP_24k40 */ - 41, 0, 0, 41, 41, 0, /* ACELP_29k00 */ - 41, 0, 0, 41, 41, 0, /* ACELP_29k20 */ - 41, 0, 0, 41, 41, 0, /* ACELP_30k20 */ - 41, 0, 0, 41, 41, 0, /* ACELP_30k40 */ - 41, 0, 0, 41, 41, 0, /* ACELP_32k */ - 41, 0, 0, 41, 41, 0, /* ACELP_48k */ - 41, 0, 0, 41, 41, 0, /* ACELP_64k */ -}; - -/* bit allocation table for mid-frame LSF quantizer */ -const Word16 mid_LSF_bits_tbl[] = // Q0 -{ - /* IC UC VC GC TC AC */ - 2, 5, 1, 2, 2, 2, /* ACELP_5k00 */ - 2, 5, 1, 2, 2, 2, /* ACELP_6k15 */ - 2, 5, 4, 5, 5, 2, /* ACELP_7k20 */ - 2, 5, 4, 5, 5, 2, /* ACELP_8k00 */ - 2, 5, 4, 5, 5, 2, /* ACELP_9k60 */ - 2, 5, 4, 5, 5, 2, /* ACELP_11k60 */ - 2, 5, 5, 5, 5, 2, /* ACELP_12k15 */ - 2, 5, 5, 5, 5, 2, /* ACELP_12k85 */ - 2, 5, 5, 5, 5, 2, /* ACELP_13k20 */ - 4, 0, 5, 5, 5, 4, /* ACELP_14k80 */ - 4, 0, 5, 5, 5, 4, /* ACELP_16k40 */ - 5, 0, 5, 5, 5, 5, /* ACELP_22k60 */ - 5, 0, 5, 5, 5, 5, /* ACELP_24k40 */ - 5, 0, 0, 5, 5, 5, /* ACELP_29k00 */ - 5, 0, 0, 5, 5, 5, /* ACELP_29k20 */ - 5, 0, 0, 5, 5, 5, /* ACELP_30k20 */ - 5, 0, 0, 5, 5, 5, /* ACELP_30k40 */ - 5, 0, 0, 5, 5, 5, /* ACELP_32k */ - 5, 0, 0, 5, 5, 5, /* ACELP_48k */ - 5, 0, 0, 5, 5, 5, /* ACELP_64k */ -}; - - -/* bit allocation table for scaled innovation energy prediction */ -const Word16 Es_pred_bits_tbl[] = // Q0 -{ -/* UC VC GC TC */ - 0, 0, 0, 4, /* ACELP_5k00 */ - 0, 0, 0, 4, /* ACELP_6k15 */ - 0, 0, 0, 4, /* ACELP_7k20 */ - 0, 0, 0, 4, /* ACELP_8k00 */ - 0, 5, 5, 5, /* ACELP_9k60 */ - 0, 5, 4, 4, /* ACELP_11k60 */ - 0, 5, 5, 5, /* ACELP_12k15 */ - 0, 5, 4, 5, /* ACELP_12k85 */ - 0, 5, 4, 4, /* ACELP_13k20 */ - 0, 5, 5, 5, /* ACELP_14k80 */ - 0, 5, 5, 5, /* ACELP_16k40 */ - 0, 5, 5, 5, /* ACELP_22k60 */ - 0, 5, 5, 5, /* ACELP_24k40 */ - 0, 0, 5, 5, /* ACELP_29k00 */ - 0, 0, 5, 5, /* ACELP_29k20 */ - 0, 0, 5, 5, /* ACELP_30k20 */ - 0, 0, 5, 5, /* ACELP_30k40 */ - 0, 0, 5, 5, /* ACELP_32k */ - 0, 0, 5, 5, /* ACELP_48k */ - 0, 0, 5, 5, /* ACELP_64k */ -}; - -/* bit allocation table for gain quantizer (ACELP@12.8kHz) */ -/* the 4 values allocated correspond to 4 subframes */ -const Word16 gain_bits_tbl[] = // Q0 -{ -/* UC VC GC TC0_0 TC0_64 TC0_128 TC0_192 TC64 TC128 TC192 */ - 6,6,6,6, 7,6,6,6, 7,6,6,6, 5,5,5,5, 5,5,6,5, 5,3,6,6, 5,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,10, /* ACELP_5k00 */ - 6,6,6,6, 7,6,6,6, 7,6,6,6, 5,5,5,5, 5,5,6,5, 5,3,6,6, 5,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,10, /* ACELP_6k15 */ - 7,7,7,7, 7,6,6,6, 6,6,6,6, 5,5,5,5, 5,5,6,5, 5,3,6,6, 5,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,10, /* ACELP_7k20 */ - 7,7,7,7, 8,7,6,6, 8,7,6,6, 5,5,5,5, 5,6,5,5, 5,3,6,6, 5,3,3,6, 3,5,5,5, 3,3,6,6, 3,3,3,14, /* ACELP_8k00 */ - 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,10, /* ACELP_9k60 */ - 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,13, /* ACELP_11k60 */ - 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,14, /* ACELP_12k15 */ - 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,5, 3,3,3,14, /* ACELP_12k85 */ - 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,15, /* ACELP_13k20 */ - 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,15, /* ACELP_14k80 */ - 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,15, /* ACELP_16k40 */ - 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,14, /* ACELP_22k60 */ - 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,15, /* ACELP_24k40 */ -}; - - -/* bit allocation table for gain gain quantizer (ACELP@16kHz) */ -/* the 5 values allocated correspond to 5 subframes */ -const Word16 gain_bits_16kHz_tbl[] = // Q0 -{ - /* IC GC TC0 TC64 TC128 TC192 TC256 */ - 0,0,0,0,0, 6,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0, 0, /* ACELP_8k00 */ - 0,0,0,0,0, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,15, /* ACELP_14k80 */ - 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,15, /* ACELP_22k60 */ - 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,16, /* ACELP_24k40 */ - 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_29k00 */ - 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_29k20 */ - 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_30k20 */ - 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_30k40 */ - 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_32k */ - 12,12,12,12,12, 12,12,12,12,12, 12,12,12,12,12, 6,12,12,12,12, 6,6,12,12,12, 6,6,6,12,12, 6,6,6,6,12, /* ACELP_48k */ - 12,12,12,12,12, 12,12,12,12,12, 12,12,12,12,12, 6,12,12,12,12, 6,6,12,12,12, 6,6,6,12,12, 6,6,6,6,12 /* ACELP_64k */ -}; - -/* bit allocation table for adaptive codebook (pitch) (ACELP@12.8kHz) */ -/* the 4 values correspond to 4 subframes */ -const Word16 ACB_bits_tbl[] = // Q0 -{ -/* UC VC GC TC0_0 TC0_64 TC0_128 TC0_192 TC64 TC128 TC192 */ - 0,0,0,0, 9,5,5,5, 8,5, 8,5, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,8, /* ACELP_5k00 */ - 0,0,0,0, 9,5,5,5, 8,5, 8,5, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,8, /* ACELP_6k15 */ - 0,0,0,0, 9,5,5,5, 8,5, 8,5, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,8, /* ACELP_7k20 */ - 0,0,0,0, 10,5,5,5, 9,5, 8,5, 6,5,6,6, 0,7,6,6, 0,0,7,5, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_8k00 */ - 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_9k60 */ - 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_11k60 */ - 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_12k15 */ - 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_12k85 */ - 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_13k20 */ - 0,0,0,0, 10,5,5,5, 10,6,10,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_14k80 */ - 0,0,0,0, 10,5,5,5, 10,6,10,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_16k40 */ - 0,0,0,0, 10,5,5,5, 10,6,10,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_22k60 */ - 0,0,0,0, 10,5,5,5, 10,6,10,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_24k40 */ -}; - -/* bit allocation table for adaptive codebook (pitch) (ACELP@16kHz) */ -/* the 5 values correspond to 5 subframes */ -const Word16 ACB_bits_16kHz_tbl[] = // Q0 -{ - /* IC GC TC0 TC64 TC128 TC192 TC256 */ - 0,0, 0,0,0, 9,0, 0,0,0, 0,0, 0,0,0, 0,0, 0,0,0, 0,0, 0,0,0, 0,0,0, 0,0, 0,0,0,0, 0, /* ACELP_8k00 */ - 0,0, 0,0,0, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_14k80 */ - 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_22k60 */ - 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_24k40 */ - 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_29k00 */ - 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_29k20 */ - 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_30k20 */ - 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_30k40 */ - 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_32k */ - 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_48k */ - 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10 /* ACELP_64k */ -}; - -/* bit allocation table for algebraic (fixed) codebook (innovation) (ACELP@12.8kHz) */ -/* the 4 values correspond to 4 subframes */ -const Word16 FCB_bits_tbl[] = // Q0 -{ -/* UC VC GC TC0_0 TC0_64 TC0_128 TC0_192 TC64 TC128 TC192 */ - 8,8,8,8, 12,12,12,20, 7, 7, 0, 7, 12, 7,12,12, 12,12, 7,12, 12,12,12,12, 12,12,20,12, 12,12,12,12, 12,12,12,12, 12,12,12,20, /* ACELP_5k00 */ - 10,10,10,10, 12,12,12,20, 12, 7,12, 7, 12, 7,12,12, 12,12, 7,12, 12,12,12,12, 12,12,20,12, 12,12,12,12, 12,12,12,12, 12,12,12,20, /* ACELP_6k15 */ - 13,13,13,13, 12,12,12,20, 12,12,12,20, 12, 7,12,12, 12,12, 7,12, 12,12,12,12, 12,12,20,12, 12,12,12,12, 12,12,12,12, 12,12,12,20, /* ACELP_7k20 */ - 13,13,13,13, 12,20,12,20, 12,20,12,20, 20,12,12,12, 20,12,12,12, 20,12,20,12, 20,12,20,20, 20,12,12,20, 20,12,20,12, 12,20,12,20, /* ACELP_8k00 */ - 13,13,13,13, 20,28,20,28, 20,20,20,28, 20,20,20,20, 20,20,20,20, 20,20,28,20, 20,28,20,28, 20,28,20,20, 20,20,20,28, 20,28,20,28, /* ACELP_9k60 */ - 0, 0, 0, 0, 28,36,28,36, 28,28,28,36, 28,28,28,28, 28,28,28,28, 28,28,36,28, 28,36,28,36, 28,36,28,28, 28,28,28,36, 28,36,28,36, /* ACELP_11k60 */ - 0, 0, 0, 0, 28,36,36,36, 28,36,28,36, 36,28,28,28, 36,28,28,28, 36,28,36,28, 36,36,28,43, 28,36,28,36, 28,36,28,36, 28,36,36,36, /* ACELP_12k15 */ - 0, 0, 0, 0, 36,36,36,43, 36,36,36,36, 36,36,28,36, 36,28,36,36, 36,36,36,36, 36,36,43,43, 36,36,36,36, 36,36,36,43, 36,36,36,43, /* ACELP_12k85 */ - 0, 0, 0, 0, 36,43,36,43, 36,36,36,43, 36,36,36,36, 36,36,36,36, 36,36,43,36, 36,43,43,43, 36,43,36,36, 43,36,43,36, 36,43,36,43, /* ACELP_13k20 */ - 0, 0, 0, 0, 43,50,43,50, 43,43,43,43, 43,43,43,43, 43,43,43,43, 43,43,50,43, 43,50,50,50, 43,43,43,50, 50,43,50,43, 43,50,43,50, /* ACELP_14k80 */ - 0, 0, 0, 0, 50,56,50,56, 50,50,50,56, 56,50,50,50, 56,50,50,50, 56,50,56,56, 56,56,56,56, 50,56,50,56, 50,56,56,56, 50,56,56,56, /* ACELP_16k40 */ - 0, 0, 0, 0, 83,83,83,87, 78,83,83,83, 83,78,83,83, 83,78,83,87, 83,87,83,87, 83,87,87,92, 87,83,87,83, 87,83,87,87, 83,87,87,87, /* ACELP_22k60 */ - 0, 0, 0, 0, 92,92,92,92, 87,92,92,92, 92,87,92,92, 92,87,92,92, 92,92,92,92, 92,92,92,92, 92,92,92,92, 92,92,92,92, 92,92,92,92, /* ACELP_24k40 */ -}; - -/* bit allocation table for algebraic (fixed) codebook (innovation) (ACELP@16kHz) */ -/* the 5 values correspond to 5 subframes */ -const Word16 FCB_bits_16kHz_tbl[] = // Q0 -{ - /* IC GC TC0 TC64 TC128 TC192 TC256 */ - 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_8k00 */ - 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_14k80 */ - 0, 0, 0, 0, 0, 62,56,56,56,62, 62,56,56,56,56, 56,56,56,56,73, 62,56,62,62,62, 56,62,62,62,73, 62,62,62,62,68, /* ACELP_22k60 */ - 0, 0, 0, 0, 0, 68,68,68,73,73, 68,68,68,68,73, 68,73,68,73,73, 73,73,73,73,73, 73,78,73,73,78, 73,78,73,73,78, /* ACELP_24k40 */ - 12,12,12,12,12, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, /* ACELP_29k00 */ - 12,12,12,12,12, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, /* ACELP_29k20 */ - 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, /* ACELP_30k20 */ - 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, /* ACELP_30k40 */ - 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, /* ACELP_32k */ - 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, /* ACELP_48k */ - 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36 /* ACELP_64k */ -}; - -/* bit allocation table for AVQ bits in active segments (ACELP@16kHz) */ -const Word16 AVQ_bits_16kHz_tbl[] = // Q0 -{ - /* IC GC TC0 TC64 TC128 TC192 TC256 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_8k00 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_14k80 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_22k60 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_24k40 */ - 78, 78, 78, 78, 78, 48, 48, 48, 48, 49, 48, 49, 49, 48, 49, 50, 50, 51, 52, 52, 50, 54, 53, 54, 54, 55, 55, 55, 55, 54, 52, 56, 56, 56, 56, /* ACELP_29k00 */ - 79, 79, 79, 79, 78, 49, 49, 49, 49, 49, 50, 49, 49, 50, 49, 52, 52, 51, 52, 52, 54, 54, 53, 54, 54, 56, 55, 55, 56, 56, 56, 56, 56, 56, 56, /* ACELP_29k20 */ - 78, 78, 78, 78, 78, 50, 50, 50, 50, 49, 51, 50, 50, 50, 50, 53, 53, 53, 52, 52, 55, 55, 55, 54, 54, 57, 57, 56, 56, 56, 57, 57, 57, 57, 56, /* ACELP_30k20 */ - 79, 79, 79, 79, 78, 51, 51, 51, 50, 50, 51, 51, 51, 51, 51, 54, 54, 53, 53, 53, 56, 56, 56, 55, 54, 58, 57, 57, 57, 57, 58, 58, 58, 57, 57, /* ACELP_30k40 */ - 86, 85, 85, 85, 85, 57, 57, 57, 57, 57, 58, 58, 57, 57, 57, 60, 60, 60, 60, 59, 62, 62, 62, 62, 61, 64, 64, 64, 63, 63, 64, 64, 64, 64, 64, /* ACELP_32k */ - 143,142,142,142,142, 116,115,115,115,115, 116,116,115,115,115, 119,119,118,118,118, 121,121,121,121,121, 124,124,123,123,123, 126,126,126,126,126, /* ACELP_48k */ - 207,206,206,206,206, 180,179,179,179,179, 180,180,179,179,179, 183,183,182,182,182, 185,185,185,185,185, 188,188,187,187,187, 190,190,190,190,190 /* ACELP_64k */ -}; - -/* bit allocation table for reserved bits (ACELP@12.8kHz) */ -const Word16 reserved_bits_tbl[] = // Q0 -{ -/* UC VC GC TC0_0 TC0_64 TC0_128 TC0_192 TC64 TC128 TC192 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_5k00 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_6k15 */ - 1, 0, 0, 0, 0, 2, 4, 0, 3, 0, /* ACELP_7k20 */ - 14, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* ACELP_8k00 */ - 46, 0, 0, 0, 1, 2, 4, 1, 4, 0, /* ACELP_9k60 */ - 0, 0, 0, 0, 1, 3, 6, 2, 6, 0, /* ACELP_11k60 */ - 0, 0, 0, 0, 2, 4, 0, 3, 7, 0, /* ACELP_12k15 */ - 0, 0, 0, 0, 1, 3, 0, 2, 0, 0, /* ACELP_12k85 */ - 0, 0, 0, 0, 1, 4, 1, 3, 0, 0, /* ACELP_13k20 */ - 0, 0, 0, 0, 2, 5, 2, 4, 1, 1, /* ACELP_14k80 */ - 0, 0, 0, 0, 2, 0, 5, 5, 3, 3, /* ACELP_16k40 */ - 0, 0, 2, 2, 0, 1, 3, 0, 0, 1, /* ACELP_22k60 */ - 0, 0, 1, 1, 3, 8, 19, 7, 11, 11, /* ACELP_24k40 */ -}; - -/* NRG mode */ -const UWord8 ACELP_NRG_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = // Q0 -{ - {{0,0,1,1,0,0,0,0},{2,2,1,1,0,0,0,0}}, - {{1,1,1,1,0,0,0,0},{1,1,1,1,1,1,1,0}}, -}; - -/* NRG bits : (0/2/3 bits) */ -const UWord8 ACELP_NRG_BITS[3] = { 0, 3, 4 }; // Q0 - -/* LTP MODE*/ -const UWord8 ACELP_LTP_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = // Q0 -{ - {{0,0,1,2,0,0,0,0},{0,0,1,2,0,0,0,0}}, - {{4,4,3,4,0,0,0,0},{4,4,3,4,8,0,9,0}}, -}; - -/* LTP bits */ -const UWord8 ACELP_LTP_BITS_SFR[8+RF_MODE_MAX][5] = // Q0 -{ - {0,0,0,0,0}, - {8,4,4,4,4}, - {8,5,8,5,5}, - {9,6,6,6,6}, - {9,6,9,6,6}, - {8,5,5,5,5}, - {8,5,8,5,5}, - {8,0,0,0,0}, - {8,5,5,5,5}, /* All-pred mode in RF, rf_frame_type = 0 */ - {8,4,4,4,0}, /* Gen-pred mode in RF, rf_frame_type = 2 */ -}; - -/* LTF modes (0 - LOW_PASS (LP filtering), 1 - FULL_BAND (no filtering), 2 - NORMAL_OPERATION (adaptive)) */ -/* Mode 2 ACELP: INACTIVE,UNVOICED,VOICED,GENERIC */ -const UWord8 ACELP_LTF_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = // Q0 -{ - {{1,1,1,0,0,0,0,0},{1,1,1,0,0,0,0,0}}, - {{0,0,2,0,0,0,0,0},{0,0,2,0,1,1,1,0}}, -}; - -/* LTF bits */ -const UWord8 ACELP_LTF_BITS[4] = { 0, 0, 4, 0 }; // Q0 - -/* GAINS ELEMENT */ -/* 5 modes: (EVS: 5b/subframe), (AMRWB: 7b/subframe),(AMRWB: 6b/subframe),(UC: 5b/subframe) */ -const UWord8 ACELP_GAINS_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = // Q0 -{ - {{6,6,1,1,0,0,0,0},{7,7,1,1,0,0,0,0}}, - {{2,2,3,3,0,0,0,0},{2,2,3,3,3,2,1,0}}, -}; - -/* gains bits */ -const UWord8 ACELP_GAINS_BITS[10] = // Q0 -{ - 0, /* skip sub-frame wise gain coding*/ - 5, - 6, - 7, - 6, - 7, - 6, /* UC */ - 7, /* GUNVOICED UV (5b ICB/2b Gaussian) */ - 4, /* GNELP UV */ - 5 /* GNELP UV */ -}; - -/* BPF modes (0 - no filtering, 1 - filtering, 2 - adaptive) */ -const UWord8 ACELP_BPF_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = // Q0 -{ - {{1,1,1,1,0,0,0,0},{1,1,1,1,0,0,0,0}}, - {{1,1,2,2,0,0,0,0},{1,1,2,2,1,1,1,1}}, -}; - -/* BPF bits */ -const UWord8 ACELP_BPF_BITS[3] = { 0, 0, 2 }; // Q0 -const Word16 ACELP_CDK_BITS[ACELP_FIXED_CDK_NB] = -{ - 7, 10, 12, 15, 17, 20, 24, 26, 28, 30, 32, 34, 36, 40, 43, 46, - 47, 49, 50, 53, 55, 56, 58, 59, 61, 62, 65, 68, 70, 73, 75, 78, 80, 83, - 85, 87, 89, 92, 94, 96, 98 -}; - -/*----------------------------------------------------------------------------------* - * Perceptual critical bands - *----------------------------------------------------------------------------------*/ - -const Word32 crit_bands_fx[] =//Q0 -{ - 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, - 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, 6350, 7700, - 9500, 12000, 15500, 40000 -}; - - -const Word16 crit_bins_corr_fx[CRIT_NOIS_BAND] = -{//Q15 - /*.9f, .9f, .85f, .8f, .775f, .75f, .725f , .7f , .675f, .65f, .625f , .60f, .6f, .6f, .6f, .6f, .6f, .6f, .6f, .6f, .6f, .6f, .6f*/ - 29491, 29491, 27853, 26214, 25395, 24576, 23577 , 22938, 22118, 21299, 20480, - 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661 -}; -const Word16 crit_bins[CRIT_NOIS_BAND] = // Q0 -{ - 4, 4, 4, 4, 4, 5, 6, 6, 6, 8, 8, 10, 11, 13, 15, 18, 22, 16, 16, 20, 20, 20, 16 -}; - - -const Word16 crit_bands_loc_fx[CRIT_NOIS_BAND] = -{//Q0 - 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, - 2000, 2320, 2700, 3150, 3700, 4100, 4500, 5000, 5500, 6000, 6375 -}; - -const Word16 inv_tbl_fx[146] =//Q15 -{ - 0, 32767, 16384, 10923, 8192, 6554, 5462, 4681, - 4096, 3641, 3277, 2979, 2731, 2521, 2341, 2185, - 2048, 1928, 1820, 1725, 1638, 1560, 1489, 1425, - 1365, 1311, 1260, 1214, 1170, 1130, 1092, 1057, - 1024, 993, 964, 936, 910, 886, 862, 840, - 819, 799, 780, 762, 745, 728, 712, 697, - 683, 669, 655, 643, 630, 618, 607, 596, - 585, 575, 565, 555, 546, 537, 529, 520, - 512, 504, 496, 489, 482, 475, 468, 462, - 455, 449, 443, 437, 431, 426, 420, 415, - 410, 405, 400, 395, 390, 386, 381, 377, - 372, 368, 364, 360, 356, 352, 349, 345, - 341, 338, 334, 331, 328, 324, 321, 318, - 315, 312, 309, 306, 303, 301, 298, 295, - 293, 290, 287, 285, 282, 280, 278, 275, - 273, 271, 269, 266, 264, 262, 260, 258, - 256, 254, 252, 250, 248, 246, 245, 243, - 241, 239, 237, 236, 234, 232, 231, 229, - 228, 226 -}; - - -const Word16 hvq_bwe_fac_fx[16] = /* Q15 */ -{ - 16384, 17408, 18432, 19456, - 20480, 21504, 22528, 23552, - 24576, 25600, 26624, 27648, - 28672, 29696, 30720, 31744 -}; - -const Word16 sqac_headroom_fx[146] = /* Q0 */ -{ - 0 /*not used */, 0, 0, 1, 1, 1, 1, 1, 1, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4 -}; - -const Word16 inv_N_fx[32] = /* Q15 */ -{ - 0, 1056, 2113, 3170, - 4227, 5284, 6341, 7398, - 8455, 9512, 10569, 11626, - 12683, 13740, 14797, 15854, - 16912, 17969, 19026, 20083, - 21140, 22197, 23254, 24311, - 25368, 26425, 27482, 28539, - 29596, 30653, 31710, 32767 -}; - -const Word16 band_len_harm[SFM_N_HARM_FB] = -{ - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 16, 16, 16, 16, 16, 16, 32, 32, 32, 48, 48, 48, 48, 64, 64, 64, 96 -}; - -const Word32 thren_fx[39] = /* Q8 */ -{ - 28215802, 19951584, 14107901, - 9975792, 7053951, 4987896, - 3526975, 2493948, 1763488, - 1246974, 881744, 623487, - 440872, 311744, 220436, - 155872, 110218, 77936, - 55109, 38968, 27554, - 19484, 13777, 9742, - 6889, 4871, 3444, - 2435, 1722, 1218, - 861, 609, 431, - 304, 215, 152, - 108, 76, 54 -}; - -const Word16 dicnlg2[40] = // Q0 -{ - 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, - 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, - 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, - 4, 3, 2, 1, 0, -1, -2, -3, -4, -5 -}; - -/*----------------------------------------------------------------------------------* - * LD music post-filter - *----------------------------------------------------------------------------------*/ - -const Word16 mfreq_loc_LD_fx[] = { 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480,//Q0 - 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, (6400 - BIN_16kdct_fx) -}; - -const Word16 mfreq_bindiv_LD[] = {10, 10, 10, 10, 11, 12, 14, 15, 16, 19, 21, 24, 28, 32, 38, 45, 55, 70, 90, 110}; // Q0 -const Word16 sc_qnoise_fx[] = { 3277, 3277, 3277, 3277, 3277, 3277, 2979, 2979, 2979, 2979, 2979, 2979, 2979, 2979, 2979, 2185, 2185, 2185, 2185, 2185 };//Q15 -const Word16 inv_mfreq_bindiv_LD_fx[] = { 3277, 3277, 3277, 3277, 2979, 2731, 2341, 2185, 2048, 1725, 1560, 1365, 1170, 1024, 862, 728, 596, 468, 364, 298 }; /*Q15 */ - -const Word16 inv_mfreq_bindiv_LD_M1_fx[] = { 3641, 3641, 3641, 3641, 3277, 2979, 2521, 2341, 2185, 1820, 1638, 1425, 1214, 1057, 886, 745, 607, 475, 368, 301 }; /*Q15 */ - -const Word16 post_dct_wind_fx[OFFSET2] = /*Q15 */ -{ - 32767, 32766, 32759, 32748, 32733, 32713, 32689, 32660, - 32627, 32590, 32548, 32502, 32452, 32397, 32338, 32274, - 32207, 32135, 32059, 31979, 31894, 31805, 31712, 31615, - 31514, 31409, 31300, 31187, 31070, 30949, 30823, 30695, - 30562, 30425, 30285, 30141, 29993, 29841, 29686, 29527, - 29365, 29200, 29030, 28858, 28682, 28503, 28320, 28134, - 27945, 27753, 27558, 27360, 27159, 26955, 26749, 26539, - 26327, 26112, 25894, 25674, 25452, 25226, 24999, 24769, - 24537, 24303, 24067, 23828, 23588, 23345, 23101, 22855, - 22607, 22358, 22107, 21854, 21600, 21345, 21088, 20830, - 20570, 20310, 20049, 19786, 19523, 19258, 18993, 18728, - 18461, 18195, 17927, 17659, 17391, 17123, 16854, 16586, - 16317, 16048, 15779, 15511, 15243, 14975, 14707, 14440, - 14173, 13907, 13642, 13377, 13114, 12851, 12589, 12328, - 12068, 11809, 11552, 11296, 11041, 10787, 10536, 10285, - 10037, 9790, 9545, 9301, 9060, 8820, 8583, 8348, - 8115, 7884, 7655, 7429, 7205, 6983, 6765, 6548, - 6335, 6124, 5916, 5710, 5508, 5308, 5112, 4918, - 4728, 4540, 4356, 4175, 3998, 3824, 3653, 3485, - 3321, 3161, 3004, 2851, 2701, 2555, 2413, 2274, - 2139, 2009, 1882, 1758, 1639, 1524, 1413, 1306, - 1203, 1104, 1009, 918, 831, 749, 671, 597, - 527, 461, 400, 343, 291, 242, 199, 159, - 124, 93, 67, 45, 27, 14, 5, 1 -}; - -const Word16 MAX_SNR_SNR1_tab_FX[MBANDS_GN_LD] = { 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 17096, 17096, 17096, 17096 };//Q14 - -const Word16 INV_MAX_SNR_tab_FX[MBANDS_GN_LD] = { 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 1425, 1425, 1425, 1425 };//Q15 - -const Word16 wind_sss_fx[LEN_WIN_SSS] = /*window for subsampling*/ -{//Q15 - 2621, 2627, 2645, 2675, 2717, 2771, 2836, 2914, - 3003, 3103, 3216, 3340, 3475, 3621, 3779, 3948, - 4127, 4318, 4519, 4730, 4952, 5184, 5426, 5677, - 5938, 6209, 6488, 6777, 7074, 7379, 7693, 8015, - 8344, 8681, 9025, 9375, 9733, 10097, 10466, 10842, - 11223, 11609, 12000, 12395, 12795, 13198, 13605, 14016, - 14429, 14845, 15263, 15683, 16105, 16527, 16951, 17376, - 17800, 18225, 18649, 19072, 19495, 19916, 20335, 20752, - 21166, 21578, 21987, 22392, 22794, 23191, 23585, 23973, - 24357, 24735, 25108, 25474, 25835, 26189, 26537, 26877, - 27210, 27536, 27853, 28163, 28464, 28757, 29041, 29316, - 29582, 29838, 30085, 30322, 30549, 30765, 30972, 31167, - 31352, 31526, 31690, 31842, 31983, 32112, 32230, 32337, - 32432, 32515, 32586, 32646, 32694, 32730, 32754, 32766, - 32767, 32096, 30111, 26894, 22575, 17333, 11380, 4962 -}; -/*----------------------------------------------------------------------------------* - * Low-pass FIR filter for low-frequency post-filtering @ 8kHz - * fir1(240,(3900/32000),hanning(241))*5 - *----------------------------------------------------------------------------------*/ - -const Word16 filter5_39s320_120_fx[121] = /* Q15 */ -{ - 19968, 19480, 18061, 15834, 12993, 9779, 6458, 3290, - 506, -1713, -3253, -4075, -4212, -3762, -2873, -1720, - -488, 654, 1568, 2160, 2389, 2263, 1838, 1201, - 460, -275, -903, -1348, -1566, -1546, -1312, -914, - -422, 90, 547, 891, 1083, 1108, 975, 716, - 376, 9, -331, -599, -762, -805, -732, -562, - -325, -61, 192, 399, 533, 582, 546, 435, - 272, 83, -103, -259, -366, -413, -398, -328, - -218, -86, 46, 161, 243, 283, 280, 238, - 166, 77, -14, -94, -153, -185, -188, -163, - -119, -62, -3, 50, 90, 113, 117, 104, - 78, 44, 9, -23, -47, -62, -65, -58, - -45, -27, -8, 9, 21, 28, 30, 27, - 20, 13, 5, -2, -7, -9, -9, -8, - -6, -3, -1, 0, 1, 1, 1, 0, - 0 - -}; - - -/*----------------------------------------------------------------------------------* - * LP analysis windows - *----------------------------------------------------------------------------------*/ -const Word16 Assym_window_W16fx[L_LP] = /*Q15*/ -{ - 2621, 2624, 2630, 2640, 2655, 2674, 2698, 2725, - 2757, 2792, 2833, 2877, 2925, 2978, 3034, 3095, - 3160, 3229, 3302, 3379, 3460, 3545, 3634, 3727, - 3824, 3925, 4029, 4138, 4250, 4366, 4486, 4609, - 4737, 4867, 5002, 5140, 5281, 5426, 5575, 5727, - 5882, 6040, 6202, 6367, 6535, 6707, 6881, 7059, - 7239, 7422, 7609, 7798, 7990, 8184, 8382, 8581, - 8784, 8989, 9196, 9406, 9618, 9832, 10049, 10268, - 10489, 10711, 10936, 11163, 11391, 11622, 11854, 12087, - 12322, 12559, 12797, 13037, 13278, 13520, 13763, 14007, - 14253, 14499, 14746, 14994, 15243, 15493, 15743, 15994, - 16245, 16496, 16748, 17000, 17253, 17505, 17758, 18010, - 18263, 18515, 18767, 19019, 19270, 19521, 19772, 20022, - 20271, 20519, 20767, 21014, 21260, 21504, 21748, 21991, - 22232, 22473, 22711, 22949, 23185, 23419, 23652, 23883, - 24113, 24340, 24566, 24790, 25012, 25231, 25449, 25664, - 25878, 26089, 26297, 26503, 26707, 26908, 27107, 27303, - 27496, 27687, 27874, 28059, 28241, 28420, 28596, 28769, - 28939, 29105, 29269, 29429, 29586, 29739, 29889, 30036, - 30179, 30319, 30455, 30588, 30717, 30842, 30964, 31082, - 31196, 31306, 31413, 31516, 31615, 31709, 31800, 31888, - 31971, 32050, 32125, 32196, 32263, 32325, 32384, 32439, - 32489, 32535, 32577, 32615, 32649, 32679, 32704, 32725, - 32742, 32755, 32763, 32767, 32767, 32758, 32741, 32715, - 32681, 32638, 32587, 32527, 32458, 32381, 32296, 32203, - 32101, 31991, 31873, 31746, 31612, 31470, 31320, 31162, - 30996, 30823, 30642, 30454, 30259, 30056, 29847, 29630, - 29407, 29177, 28940, 28697, 28448, 28193, 27931, 27664, - 27391, 27113, 26829, 26540, 26246, 25947, 25643, 25335, - 25022, 24706, 24385, 24060, 23732, 23401, 23066, 22728, - 22387, 22043, 21697, 21349, 20999, 20646, 20292, 19937, - 19580, 19223, 18864, 18505, 18145, 17785, 17425, 17065, - 16705, 16346, 15988, 15631, 15275, 14920, 14567, 14215, - 13866, 13519, 13174, 12832, 12492, 12156, 11823, 11493, - 11166, 10844, 10525, 10210, 9900, 9594, 9292, 8996, - 8704, 8418, 8137, 7861, 7591, 7327, 7068, 6816, - 6570, 6330, 6097, 5870, 5650, 5437, 5231, 5032, - 4840, 4656, 4479, 4310, 4148, 3994, 3848, 3709, - 3579, 3457, 3343, 3237, 3139, 3050, 2969, 2896, - 2832, 2776, 2729, 2690, 2660, 2639, 2626, 2621 -}; - -const Word16 assym_window_16k_fx[L_LP_16k] = /*Q15*/ -{ - 2621, 2623, 2627, 2634, 2643, 2655, 2670, 2688, - 2708, 2731, 2757, 2785, 2816, 2849, 2886, 2925, - 2966, 3011, 3058, 3107, 3159, 3214, 3271, 3331, - 3394, 3459, 3527, 3597, 3670, 3745, 3823, 3903, - 3985, 4071, 4158, 4248, 4341, 4436, 4533, 4632, - 4734, 4839, 4945, 5054, 5165, 5279, 5394, 5512, - 5632, 5754, 5879, 6005, 6134, 6264, 6397, 6531, - 6668, 6807, 6947, 7090, 7234, 7381, 7529, 7679, - 7831, 7984, 8140, 8297, 8455, 8616, 8778, 8941, - 9107, 9273, 9442, 9611, 9782, 9955, 10129, 10304, - 10481, 10659, 10838, 11019, 11200, 11383, 11567, 11752, - 11938, 12125, 12313, 12502, 12693, 12883, 13075, 13268, - 13461, 13655, 13850, 14046, 14242, 14439, 14637, 14835, - 15033, 15232, 15432, 15631, 15832, 16032, 16233, 16434, - 16635, 16837, 17039, 17240, 17442, 17644, 17846, 18048, - 18250, 18452, 18653, 18855, 19056, 19257, 19458, 19658, - 19858, 20058, 20257, 20456, 20654, 20852, 21049, 21245, - 21441, 21637, 21831, 22025, 22218, 22410, 22602, 22792, - 22982, 23170, 23358, 23545, 23730, 23915, 24098, 24280, - 24461, 24641, 24820, 24997, 25173, 25348, 25521, 25693, - 25863, 26032, 26200, 26366, 26530, 26693, 26854, 27014, - 27171, 27328, 27482, 27635, 27786, 27935, 28082, 28227, - 28371, 28513, 28652, 28790, 28926, 29059, 29191, 29320, - 29448, 29573, 29697, 29818, 29937, 30053, 30168, 30280, - 30390, 30498, 30603, 30706, 30807, 30905, 31002, 31095, - 31186, 31275, 31362, 31446, 31527, 31606, 31683, 31757, - 31828, 31897, 31963, 32027, 32088, 32147, 32203, 32257, - 32307, 32356, 32401, 32444, 32484, 32522, 32557, 32589, - 32619, 32646, 32670, 32692, 32711, 32727, 32741, 32751, - 32760, 32765, 32767, 32767, 32762, 32751, 32734, 32712, - 32685, 32652, 32614, 32570, 32521, 32466, 32406, 32341, - 32270, 32194, 32112, 32026, 31934, 31837, 31735, 31627, - 31515, 31398, 31275, 31148, 31016, 30878, 30737, 30590, - 30438, 30282, 30122, 29957, 29787, 29613, 29434, 29252, - 29065, 28874, 28679, 28480, 28277, 28070, 27859, 27644, - 27426, 27205, 26980, 26751, 26520, 26285, 26047, 25805, - 25561, 25314, 25065, 24812, 24557, 24300, 24040, 23777, - 23513, 23246, 22978, 22707, 22435, 22161, 21885, 21608, - 21329, 21049, 20768, 20485, 20202, 19918, 19632, 19347, - 19060, 18773, 18486, 18198, 17911, 17623, 17335, 17047, - 16760, 16473, 16186, 15900, 15614, 15330, 15046, 14763, - 14481, 14200, 13921, 13643, 13367, 13092, 12818, 12547, - 12277, 12010, 11744, 11481, 11220, 10961, 10705, 10451, - 10200, 9951, 9706, 9463, 9223, 8987, 8754, 8523, - 8297, 8073, 7854, 7637, 7425, 7216, 7011, 6810, - 6613, 6420, 6231, 6046, 5865, 5689, 5517, 5350, - 5187, 5028, 4875, 4726, 4581, 4442, 4307, 4177, - 4052, 3932, 3818, 3708, 3603, 3503, 3409, 3320, - 3236, 3157, 3084, 3016, 2953, 2895, 2844, 2797, - 2756, 2720, 2690, 2665, 2646, 2632, 2624, 2621 -}; - -const Word16 lag_window_8k[2][16] = /* LAGW_STRONG Q15*/ -{ - /* h */ { 32728, 32619, 32438, 32187, 31867, 31480, 31029, 30517, 29946, 29321, 28645, 27923, 27158, 26356, 25521, 24658 }, - /* l */ { 11904, 17280, 30720, 25856, 24192, 28992, 24384, 7360, 19456, 14720, 22080, 12928, 31040, 27328, 22080, 5184 } -}; -const Word16 lag_window_12k8[NUM_LAGW_STRENGTHS][2][16] = -{//Q15 - /* LAGW_WEAK */ - { - /* h */ { 32763, 32758, 32750, 32739, 32725, 32707, 32687, 32663, 32637, 32607, 32574, 32538, 32498, 32456, 32411, 32362 }, - /* l */ { 4736, 13312, 16896, 15360, 8896, 30464, 14528, 27008, 2496, 6720, 7296, 4480, 31424, 22976, 12160, 32384 } -}, -/* LAGW_MEDIUM */ -{ - /* h */ { 32758, 32739, 32707, 32663, 32607, 32538, 32456, 32362, 32257, 32139, 32009, 31867, 31714, 31549, 31374, 31187 }, - /* l */ { 13312, 15360, 30464, 27008, 6720, 4480, 22976, 32384, 3520, 5888, 11200, 24192, 17472, 29376, 576, 3136 } -}, -/* LAGW_STRONG */ -{ - /* h */ { 32750, 32707, 32637, 32538, 32411, 32257, 32075, 31867, 31633, 31374, 31089, 30780, 30449, 30094, 29718, 29321 }, - /* l */ { 16896, 30464, 2496, 4480, 12160, 3520, 24256, 24192, 20736, 576, 18240, 31488, 128, 16704, 11520, 14720 } -} -}; -const Word16 lag_window_16k[NUM_LAGW_STRENGTHS][2][16] = -{//Q15 - /* LAGW_WEAK */ - { - /* h */ { 32763, 32760, 32755, 32748, 32739, 32728, 32715, 32700, 32682, 32663, 32642, 32619, 32594, 32567, 32538, 32507 }, - /* l */ { 23360, 22272, 20672, 18304, 15360, 11904, 8000, 3648, 31808, 27008, 22080, 17280, 12608, 8256, 4480, 1344 } -}, -/* LAGW_MEDIUM */ -{ - /* h */ { 32760, 32748, 32728, 32700, 32663, 32619, 32567, 32507, 32438, 32362, 32279, 32187, 32088, 31981, 31867, 31746 }, - /* l */ { 22272, 18304, 11904, 3648, 27008, 17280, 8256, 1344, 30720, 32384, 8256, 25856, 21824, 31360, 24192, 3072 } -}, -/* LAGW_STRONG */ -{ - /* h */ { 32755, 32728, 32682, 32619, 32538, 32438, 32322, 32187, 32036, 31867, 31682, 31480, 31263, 31029, 30780, 30517 }, - /* l */ { 20672, 11904, 31808, 17280, 4480, 30720, 2944, 25856, 8320, 24192, 16896, 28992, 5824, 24384, 31488, 7360 } -} -}; -const Word16 lag_window_25k6[NUM_LAGW_STRENGTHS][2][16] = -{//Q15 - /* LAGW_WEAK */ - { - /* h */ { 32764, 32763, 32761, 32758, 32754, 32750, 32745, 32739, 32732, 32725, 32716, 32707, 32698, 32687, 32676, 32663 }, - /* l */ { 10752, 4736, 5568, 13312, 28096, 16896, 12672, 15360, 25024, 8896, 32576, 30464, 2624, 14528, 832, 27008 } -}, -/* LAGW_MEDIUM */ -{ - /* h */ { 32763, 32758, 32750, 32739, 32725, 32707, 32687, 32663, 32637, 32607, 32574, 32538, 32498, 32456, 32411, 32362 }, - /* l */ { 4736, 13312, 16896, 15360, 8896, 30464, 14528, 27008, 2496, 6720, 7296, 4480, 31424, 22976, 12160, 32384 } -}, -/* LAGW_STRONG */ -{ - /* h */ { 32761, 32750, 32732, 32707, 32676, 32637, 32591, 32538, 32478, 32411, 32337, 32257, 32169, 32075, 31975, 31867 }, - /* l */ { 5568, 16896, 25024, 30464, 832, 2496, 3328, 4480, 7040, 12160, 21440, 3520, 25728, 24256, 1216, 24192 } -} -}; -const Word16 lag_window_32k[NUM_LAGW_STRENGTHS][2][16] = -{//Q15 - /* LAGW_WEAK */ - { - /* h */ { 32764, 32763, 32762, 32760, 32758, 32755, 32752, 32748, 32744, 32739, 32734, 32728, 32722, 32715, 32707, 32700 }, - /* l */ { 15424, 23360, 14720, 22272, 13312, 20672, 11328, 18304, 8704, 15360, 5504, 11904, 1792, 8000, 30464, 3648 } -}, -/* LAGW_MEDIUM */ -{ - /* h */ { 32763, 32760, 32755, 32748, 32739, 32728, 32715, 32700, 32682, 32663, 32642, 32619, 32594, 32567, 32538, 32507 }, - /* l */ { 23360, 22272, 20672, 18304, 15360, 11904, 8000, 3648, 31808, 27008, 22080, 17280, 12608, 8256, 4480, 1344 } -}, -/* LAGW_STRONG */ -{ - /* h */ { 32762, 32755, 32744, 32728, 32707, 32682, 32653, 32619, 32581, 32538, 32490, 32438, 32382, 32322, 32257, 32187 }, - /* l */ { 14720, 20672, 8704, 11904, 30464, 31808, 16384, 17280, 2240, 4480, 24704, 30720, 23168, 2944, 3520, 25856 } -} -}; -const Word16 lag_window_48k[2][16] = /* LAGW_STRONG */ -{//Q15 - /* h */ { 32763, 32760, 32755, 32748, 32739, 32728, 32715, 32700, 32682, 32663, 32642, 32619, 32594, 32567, 32538, 32507 }, - /* l */ { 23360, 22272, 20672, 18304, 15360, 11904, 8000, 3648, 31808, 27008, 22080, 17280, 12608, 8256, 4480, 1344 } -}; - -/* 32 bit declarations */ -const Word32 lag_window_8k_32[16] = /* LAGW_STRONG */ -{//Q31 - 2144886016, 2137753344, 2125918208, 2109458944, 2088484096, 2063131264, 2033565312, 1999976832, 1962579968, 1921610496, 1877322880, 1829987584, 1779888768, 1727321472, 1672588416, 1615997056 -}; - -const Word32 lag_window_12k8_32[NUM_LAGW_STRENGTHS][16] = -{//Q31 - /* LAGW_WEAK */ - { - 2147165440, 2146854912, 2146337792, 2145613824, 2144683392, 2143546880, 2142204288, 2140656384, 2138903424, 2136945792, 2134784256, 2132419328, 2129851776, 2127082368, 2124111616, 2120940800 -}, -/* LAGW_MEDIUM */ -{ - 2146854912, 2145613824, 2143546880, 2140656384, 2136945792, 2132419328, 2127082368, 2120940800, 2114001792, 2106273280, 2097764224, 2088484096, 2078443648, 2067654016, 2056127616, 2043877504 -}, -/* LAGW_STRONG */ -{ - 2146337792, 2143546880, 2138903424, 2132419328, 2124111616, 2114001792, 2102115712, 2088484096, 2073141760, 2056127616, 2037485184, 2017261056, 1995505920, 1972273792, 1947621888, 1921610496 -} -}; - -const Word32 lag_window_16k_32[NUM_LAGW_STRENGTHS][16] = -{//Q31 - /* LAGW_WEAK */ - { - 2147202688, 2147003904, 2146673024, 2146209536, 2145613824, 2144886016, 2144026240, 2143034496, 2141911168, 2140656384, 2139270272, 2137753344, 2136105600, 2134327424, 2132419328, 2130381440 -}, -/* LAGW_MEDIUM */ -{ - 2147003904, 2146209536, 2144886016, 2143034496, 2140656384, 2137753344, 2134327424, 2130381440, 2125918208, 2120940800, 2115453056, 2109458944, 2102962816, 2095969536, 2088484096, 2080512000 -}, -/* LAGW_STRONG */ -{ - 2146673024, 2144886016, 2141911168, 2137753344, 2132419328, 2125918208, 2118260480, 2109458944, 2099527936, 2088484096, 2076345344, 2063131264, 2048863616, 2033565312, 2017261056, 1999976832 -} -}; -const Word32 lag_window_25k6_32[NUM_LAGW_STRENGTHS][16] = -{//Q31 - /* LAGW_WEAK */ - { - 2147243008, 2147165440, 2147036032, 2146854912, 2146622336, 2146337792, 2146001664, 2145613824, 2145174400, 2144683392, 2144140928, 2143546880, 2142901376, 2142204288, 2141456000, 2140656384 -}, -/* LAGW_MEDIUM */ -{ - 2147165440, 2146854912, 2146337792, 2145613824, 2144683392, 2143546880, 2142204288, 2140656384, 2138903424, 2136945792, 2134784256, 2132419328, 2129851776, 2127082368, 2124111616, 2120940800 -}, -/* LAGW_STRONG */ -{ - 2147036032, 2146337792, 2145174400, 2143546880, 2141456000, 2138903424, 2135890432, 2132419328, 2128492288, 2124111616, 2119280512, 2114001792, 2108279040, 2102115712, 2095516032, 2088484096 -} -}; -const Word32 lag_window_32k_32[NUM_LAGW_STRENGTHS][16] = -{//Q31 - /* LAGW_WEAK */ - { - 2147252352, 2147202688, 2147119872, 2147003904, 2146854912, 2146673024, 2146457728, 2146209536, 2145928192, 2145613824, 2145266432, 2144886016, 2144472576, 2144026240, 2143546880, 2143034496 -}, -/* LAGW_MEDIUM */ -{ - 2147202688, 2147003904, 2146673024, 2146209536, 2145613824, 2144886016, 2144026240, 2143034496, 2141911168, 2140656384, 2139270272, 2137753344, 2136105600, 2134327424, 2132419328, 2130381440 -}, -/* LAGW_STRONG */ -{ - 2147119872, 2146673024, 2145928192, 2144886016, 2143546880, 2141911168, 2139979776, 2137753344, 2135232896, 2132419328, 2129314048, 2125918208, 2122233088, 2118260480, 2114001792, 2109458944 -} -}; -const Word32 lag_window_48k_32[16] = /* LAGW_STRONG */ -{//Q31 - 2147202688, 2147003904, 2146673024, 2146209536, 2145613824, 2144886016, 2144026240, 2143034496, 2141911168, 2140656384, 2139270272, 2137753344, 2136105600, 2134327424, 2132419328, 2130381440 -}; -/*----------------------------------------------------------------------------------* - * LP analysis - grid of points for evaluating Chebyshev polynomials - *----------------------------------------------------------------------------------*/ - -const Word16 grid50_fx[(GRID50_POINTS - 1) / 2 - 1] = -{//Q15 - 32703, 32510, 32188, 31739, 31164, 30467, - 29649, 28715, 27667, 26510, 25248, 23887, - 22431, 20887, 19261, 17558, 15786, 13952, - 12063, 10126, 8149, 6140, 4107, 2058 -}; - -const Word16 grid40_fx[(GRID40_POINTS - 1) / 2 - 1] = -{//Q15 - 32667, 32365, 31863, 31164, 30274, 29197, - 27939, 26510, 24917, 23170, 21281, 19261, - 17121, 14876, 12540, 10126, 7650, 5126, - 2571 -}; - -/*----------------------------------------------------------------------------------* - * Sinus & Cosinus - table for the FFT and IFFT of 256 points, - * dimension of the table = 161 - *----------------------------------------------------------------------------------*/ -const Word16 sincos_t_fx[161] = -{ - /*Q15 */ - 0, - 804, 1607, 2410, 3211, 4011, - 4808, 5602, 6392, 7179, 7961, - 8739, 9512, 10278, 11039, 11793, - 12539, 13278, 14010, 14732, 15446, - 16151, 16846, 17530, 18204, 18868, - 19519, 20159, 20787, 21403, 22005, - 22594, 23170, 23732, 24279, 24812, - 25330, 25832, 26319, 26790, 27245, - 27684, 28106, 28511, 28898, 29269, - 29621, 29956, 30273, 30572, 30852, - 31114, 31357, 31581, 31785, 31971, - 32138, 32285, 32413, 32521, 32610, - 32679, 32728, 32758, 32767, 32758, - 32728, 32679, 32610, 32521, 32413, - 32285, 32138, 31971, 31785, 31581, - 31357, 31114, 30852, 30572, 30273, - 29956, 29621, 29269, 28898, 28511, - 28106, 27684, 27245, 26790, 26319, - 25832, 25330, 24812, 24279, 23732, - 23170, 22594, 22005, 21403, 20787, - 20159, 19519, 18868, 18204, 17530, - 16846, 16151, 15446, 14732, 14010, - 13278, 12539, 11793, 11039, 10278, - 9512, 8739, 7961, 7179, 6392, - 5602, 4808, 4011, 3211, 2410, - 1607, 804, 0, -804, -1607, - -2410, -3211, -4011, -4808, -5602, - -6392, -7179, -7961, -8739, -9512, - -10278, -11039, -11793, -12539, -13278, - -14010, -14732, -15446, -16151, -16846, - -17530, -18204, -18868, -19519, -20159, - -20787, -21403, -22005, -22594, -23170, -}; - - -/*----------------------------------------------------------------------------------* - * Sinus & Cosinus - table for the FFT and IFFT of 1024 points, value range [0 ... sin(-5pi/4)] - * dimension of the table = 641=4*256*(5/8)+1 - *----------------------------------------------------------------------------------*/ - -/* every 4th value is identical to sincos_t above but as sincos_t is also used in SWB TBE a separate table has been defined here */ -const float sincos_t_ext[641] = -{ - 0.0f, - 0.006135884649154f, 0.012271538285720f, 0.018406729905805f, 0.024541228522912f, 0.030674803176637f, 0.036807222941359f, 0.042938256934941f, 0.049067674327418f, - 0.055195244349690f, 0.061320736302209f, 0.067443919563664f, 0.073564563599667f, 0.079682437971430f, 0.085797312344440f, 0.091908956497133f, 0.098017140329561f, - 0.104121633872055f, 0.110222207293883f, 0.116318630911905f, 0.122410675199216f, 0.128498110793793f, 0.134580708507126f, 0.140658239332849f, 0.146730474455362f, - 0.152797185258443f, 0.158858143333861f, 0.164913120489970f, 0.170961888760301f, 0.177004220412149f, 0.183039887955141f, 0.189068664149806f, 0.195090322016128f, - 0.201104634842092f, 0.207111376192219f, 0.213110319916091f, 0.219101240156870f, 0.225083911359793f, 0.231058108280671f, 0.237023605994367f, 0.242980179903264f, - 0.248927605745720f, 0.254865659604515f, 0.260794117915276f, 0.266712757474898f, 0.272621355449949f, 0.278519689385053f, 0.284407537211272f, 0.290284677254462f, - 0.296150888243624f, 0.302005949319228f, 0.307849640041535f, 0.313681740398892f, 0.319502030816016f, 0.325310292162263f, 0.331106305759876f, 0.336889853392220f, - 0.342660717311994f, 0.348418680249435f, 0.354163525420490f, 0.359895036534988f, 0.365612997804774f, 0.371317193951837f, 0.377007410216418f, 0.382683432365090f, - 0.388345046698826f, 0.393992040061048f, 0.399624199845647f, 0.405241314004990f, 0.410843171057904f, 0.416429560097637f, 0.422000270799800f, 0.427555093430282f, - 0.433093818853152f, 0.438616238538528f, 0.444122144570429f, 0.449611329654607f, 0.455083587126344f, 0.460538710958240f, 0.465976495767966f, 0.471396736825998f, - 0.476799230063322f, 0.482183772079123f, 0.487550160148436f, 0.492898192229784f, 0.498227666972782f, 0.503538383725718f, 0.508830142543107f, 0.514102744193222f, - 0.519355990165590f, 0.524589682678469f, 0.529803624686295f, 0.534997619887097f, 0.540171472729893f, 0.545324988422046f, 0.550457972936605f, 0.555570233019602f, - 0.560661576197336f, 0.565731810783613f, 0.570780745886967f, 0.575808191417845f, 0.580813958095765f, 0.585797857456439f, 0.590759701858874f, 0.595699304492433f, - 0.600616479383869f, 0.605511041404326f, 0.610382806276309f, 0.615231590580627f, 0.620057211763289f, 0.624859488142386f, 0.629638238914927f, 0.634393284163645f, - 0.639124444863776f, 0.643831542889791f, 0.648514401022112f, 0.653172842953777f, 0.657806693297079f, 0.662415777590172f, 0.666999922303637f, 0.671558954847018f, - 0.676092703575316f, 0.680600997795453f, 0.685083667772700f, 0.689540544737067f, 0.693971460889654f, 0.698376249408973f, 0.702754744457225f, 0.707106781186547f, - 0.711432195745216f, 0.715730825283819f, 0.720002507961382f, 0.724247082951467f, 0.728464390448225f, 0.732654271672413f, 0.736816568877370f, 0.740951125354959f, - 0.745057785441466f, 0.749136394523459f, 0.753186799043613f, 0.757208846506485f, 0.761202385484262f, 0.765167265622459f, 0.769103337645580f, 0.773010453362737f, - 0.776888465673232f, 0.780737228572094f, 0.784556597155575f, 0.788346427626606f, 0.792106577300212f, 0.795836904608884f, 0.799537269107905f, 0.803207531480645f, - 0.806847553543799f, 0.810457198252595f, 0.814036329705948f, 0.817584813151584f, 0.821102514991105f, 0.824589302785025f, 0.828045045257756f, 0.831469612302545f, - 0.834862874986380f, 0.838224705554838f, 0.841554977436898f, 0.844853565249707f, 0.848120344803297f, 0.851355193105265f, 0.854557988365401f, 0.857728610000272f, - 0.860866938637767f, 0.863972856121587f, 0.867046245515693f, 0.870086991108711f, 0.873094978418290f, 0.876070094195407f, 0.879012226428633f, 0.881921264348355f, - 0.884797098430938f, 0.887639620402854f, 0.890448723244758f, 0.893224301195515f, 0.895966249756185f, 0.898674465693954f, 0.901348847046022f, 0.903989293123443f, - 0.906595704514915f, 0.909167983090522f, 0.911706032005430f, 0.914209755703531f, 0.916679059921043f, 0.919113851690058f, 0.921514039342042f, 0.923879532511287f, - 0.926210242138311f, 0.928506080473216f, 0.930766961078984f, 0.932992798834739f, 0.935183509938948f, 0.937339011912575f, 0.939459223602190f, 0.941544065183021f, - 0.943593458161960f, 0.945607325380521f, 0.947585591017741f, 0.949528180593037f, 0.951435020969008f, 0.953306040354194f, 0.955141168305771f, 0.956940335732209f, - 0.958703474895872f, 0.960430519415566f, 0.962121404269042f, 0.963776065795440f, 0.965394441697689f, 0.966976471044852f, 0.968522094274417f, 0.970031253194544f, - 0.971503890986252f, 0.972939952205560f, 0.974339382785576f, 0.975702130038529f, 0.977028142657754f, 0.978317370719628f, 0.979569765685441f, 0.980785280403230f, - 0.981963869109555f, 0.983105487431216f, 0.984210092386929f, 0.985277642388941f, 0.986308097244599f, 0.987301418157858f, 0.988257567730749f, 0.989176509964781f, - 0.990058210262297f, 0.990902635427780f, 0.991709753669100f, 0.992479534598710f, 0.993211949234795f, 0.993906970002356f, 0.994564570734255f, 0.995184726672197f, - 0.995767414467660f, 0.996312612182778f, 0.996820299291166f, 0.997290456678690f, 0.997723066644192f, 0.998118112900149f, 0.998475580573295f, 0.998795456205172f, - 0.999077727752645f, 0.999322384588350f, 0.999529417501093f, 0.999698818696204f, 0.999830581795823f, 0.999924701839145f, 0.999981175282601f, 1.000000000000000f, - 0.999981175282601f, 0.999924701839145f, 0.999830581795823f, 0.999698818696204f, 0.999529417501093f, 0.999322384588350f, 0.999077727752645f, 0.998795456205172f, - 0.998475580573295f, 0.998118112900149f, 0.997723066644192f, 0.997290456678690f, 0.996820299291166f, 0.996312612182778f, 0.995767414467660f, 0.995184726672197f, - 0.994564570734255f, 0.993906970002356f, 0.993211949234795f, 0.992479534598710f, 0.991709753669100f, 0.990902635427780f, 0.990058210262297f, 0.989176509964781f, - 0.988257567730749f, 0.987301418157858f, 0.986308097244599f, 0.985277642388941f, 0.984210092386929f, 0.983105487431216f, 0.981963869109555f, 0.980785280403230f, - 0.979569765685441f, 0.978317370719628f, 0.977028142657754f, 0.975702130038529f, 0.974339382785576f, 0.972939952205560f, 0.971503890986252f, 0.970031253194544f, - 0.968522094274417f, 0.966976471044852f, 0.965394441697689f, 0.963776065795440f, 0.962121404269042f, 0.960430519415566f, 0.958703474895872f, 0.956940335732209f, - 0.955141168305771f, 0.953306040354194f, 0.951435020969008f, 0.949528180593037f, 0.947585591017741f, 0.945607325380521f, 0.943593458161960f, 0.941544065183021f, - 0.939459223602190f, 0.937339011912575f, 0.935183509938948f, 0.932992798834739f, 0.930766961078984f, 0.928506080473216f, 0.926210242138311f, 0.923879532511287f, - 0.921514039342042f, 0.919113851690058f, 0.916679059921043f, 0.914209755703531f, 0.911706032005430f, 0.909167983090522f, 0.906595704514915f, 0.903989293123443f, - 0.901348847046022f, 0.898674465693954f, 0.895966249756185f, 0.893224301195515f, 0.890448723244758f, 0.887639620402854f, 0.884797098430938f, 0.881921264348355f, - 0.879012226428634f, 0.876070094195407f, 0.873094978418290f, 0.870086991108711f, 0.867046245515693f, 0.863972856121587f, 0.860866938637767f, 0.857728610000272f, - 0.854557988365401f, 0.851355193105265f, 0.848120344803297f, 0.844853565249707f, 0.841554977436898f, 0.838224705554838f, 0.834862874986380f, 0.831469612302545f, - 0.828045045257756f, 0.824589302785025f, 0.821102514991105f, 0.817584813151584f, 0.814036329705949f, 0.810457198252595f, 0.806847553543799f, 0.803207531480645f, - 0.799537269107905f, 0.795836904608884f, 0.792106577300212f, 0.788346427626606f, 0.784556597155575f, 0.780737228572095f, 0.776888465673232f, 0.773010453362737f, - 0.769103337645580f, 0.765167265622459f, 0.761202385484262f, 0.757208846506485f, 0.753186799043613f, 0.749136394523459f, 0.745057785441466f, 0.740951125354959f, - 0.736816568877370f, 0.732654271672413f, 0.728464390448225f, 0.724247082951467f, 0.720002507961382f, 0.715730825283819f, 0.711432195745217f, 0.707106781186548f, - 0.702754744457225f, 0.698376249408973f, 0.693971460889654f, 0.689540544737067f, 0.685083667772700f, 0.680600997795453f, 0.676092703575316f, 0.671558954847019f, - 0.666999922303638f, 0.662415777590172f, 0.657806693297079f, 0.653172842953777f, 0.648514401022113f, 0.643831542889791f, 0.639124444863776f, 0.634393284163645f, - 0.629638238914927f, 0.624859488142386f, 0.620057211763289f, 0.615231590580627f, 0.610382806276310f, 0.605511041404326f, 0.600616479383869f, 0.595699304492433f, - 0.590759701858874f, 0.585797857456439f, 0.580813958095765f, 0.575808191417845f, 0.570780745886967f, 0.565731810783613f, 0.560661576197336f, 0.555570233019602f, - 0.550457972936605f, 0.545324988422046f, 0.540171472729893f, 0.534997619887097f, 0.529803624686295f, 0.524589682678469f, 0.519355990165590f, 0.514102744193222f, - 0.508830142543107f, 0.503538383725718f, 0.498227666972782f, 0.492898192229784f, 0.487550160148436f, 0.482183772079123f, 0.476799230063322f, 0.471396736825998f, - 0.465976495767966f, 0.460538710958240f, 0.455083587126344f, 0.449611329654607f, 0.444122144570429f, 0.438616238538528f, 0.433093818853152f, 0.427555093430282f, - 0.422000270799800f, 0.416429560097637f, 0.410843171057904f, 0.405241314004990f, 0.399624199845647f, 0.393992040061048f, 0.388345046698827f, 0.382683432365090f, - 0.377007410216418f, 0.371317193951838f, 0.365612997804774f, 0.359895036534988f, 0.354163525420490f, 0.348418680249435f, 0.342660717311994f, 0.336889853392220f, - 0.331106305759876f, 0.325310292162263f, 0.319502030816016f, 0.313681740398891f, 0.307849640041535f, 0.302005949319228f, 0.296150888243624f, 0.290284677254462f, - 0.284407537211272f, 0.278519689385053f, 0.272621355449949f, 0.266712757474898f, 0.260794117915276f, 0.254865659604515f, 0.248927605745720f, 0.242980179903264f, - 0.237023605994367f, 0.231058108280671f, 0.225083911359793f, 0.219101240156870f, 0.213110319916091f, 0.207111376192219f, 0.201104634842092f, 0.195090322016129f, - 0.189068664149806f, 0.183039887955141f, 0.177004220412149f, 0.170961888760301f, 0.164913120489970f, 0.158858143333861f, 0.152797185258444f, 0.146730474455362f, - 0.140658239332850f, 0.134580708507126f, 0.128498110793793f, 0.122410675199216f, 0.116318630911905f, 0.110222207293883f, 0.104121633872055f, 0.098017140329561f, - 0.091908956497133f, 0.085797312344440f, 0.079682437971430f, 0.073564563599668f, 0.067443919563664f, 0.061320736302208f, 0.055195244349690f, 0.049067674327418f, - 0.042938256934941f, 0.036807222941359f, 0.030674803176637f, 0.024541228522912f, 0.018406729905805f, 0.012271538285720f, 0.006135884649155f, 0.000000000000000f, - -0.006135884649155f, -0.012271538285720f, -0.018406729905805f, -0.024541228522912f, -0.030674803176637f, -0.036807222941359f, -0.042938256934941f, -0.049067674327418f, - -0.055195244349690f, -0.061320736302208f, -0.067443919563664f, -0.073564563599667f, -0.079682437971430f, -0.085797312344440f, -0.091908956497133f, -0.098017140329561f, - -0.104121633872054f, -0.110222207293883f, -0.116318630911904f, -0.122410675199216f, -0.128498110793793f, -0.134580708507126f, -0.140658239332849f, -0.146730474455362f, - -0.152797185258443f, -0.158858143333861f, -0.164913120489970f, -0.170961888760301f, -0.177004220412149f, -0.183039887955141f, -0.189068664149806f, -0.195090322016128f, - -0.201104634842092f, -0.207111376192219f, -0.213110319916091f, -0.219101240156870f, -0.225083911359793f, -0.231058108280671f, -0.237023605994367f, -0.242980179903264f, - -0.248927605745720f, -0.254865659604514f, -0.260794117915276f, -0.266712757474898f, -0.272621355449949f, -0.278519689385053f, -0.284407537211272f, -0.290284677254462f, - -0.296150888243624f, -0.302005949319228f, -0.307849640041535f, -0.313681740398891f, -0.319502030816016f, -0.325310292162263f, -0.331106305759876f, -0.336889853392220f, - -0.342660717311994f, -0.348418680249435f, -0.354163525420490f, -0.359895036534988f, -0.365612997804774f, -0.371317193951837f, -0.377007410216418f, -0.382683432365090f, - -0.388345046698826f, -0.393992040061048f, -0.399624199845647f, -0.405241314004990f, -0.410843171057904f, -0.416429560097637f, -0.422000270799800f, -0.427555093430282f, - -0.433093818853152f, -0.438616238538527f, -0.444122144570429f, -0.449611329654607f, -0.455083587126344f, -0.460538710958240f, -0.465976495767966f, -0.471396736825998f, - -0.476799230063322f, -0.482183772079123f, -0.487550160148436f, -0.492898192229784f, -0.498227666972782f, -0.503538383725717f, -0.508830142543107f, -0.514102744193222f, - -0.519355990165590f, -0.524589682678469f, -0.529803624686295f, -0.534997619887097f, -0.540171472729893f, -0.545324988422046f, -0.550457972936605f, -0.555570233019602f, - -0.560661576197336f, -0.565731810783613f, -0.570780745886967f, -0.575808191417845f, -0.580813958095764f, -0.585797857456439f, -0.590759701858874f, -0.595699304492433f, - -0.600616479383869f, -0.605511041404325f, -0.610382806276309f, -0.615231590580627f, -0.620057211763289f, -0.624859488142386f, -0.629638238914927f, -0.634393284163645f, - -0.639124444863776f, -0.643831542889791f, -0.648514401022112f, -0.653172842953777f, -0.657806693297079f, -0.662415777590172f, -0.666999922303637f, -0.671558954847018f, - -0.676092703575316f, -0.680600997795453f, -0.685083667772700f, -0.689540544737067f, -0.693971460889654f, -0.698376249408973f, -0.702754744457225f, -0.707106781186547f -}; - -const Word16 sincos_t_ext_fx[641] = -{//Q15 - 0, 201, 402, 603, 804, 1005, 1206, 1407, - 1608, 1809, 2009, 2210, 2411, 2611, 2811, 3012, - 3212, 3412, 3612, 3812, 4011, 4211, 4410, 4609, - 4808, 5007, 5205, 5404, 5602, 5800, 5998, 6195, - 6393, 6590, 6787, 6983, 7180, 7376, 7571, 7767, - 7962, 8157, 8351, 8546, 8740, 8933, 9127, 9319, - 9512, 9704, 9896, 10088, 10279, 10469, 10660, 10850, - 11039, 11228, 11417, 11605, 11793, 11980, 12167, 12354, - 12540, 12725, 12910, 13095, 13279, 13463, 13646, 13828, - 14010, 14192, 14373, 14553, 14733, 14912, 15091, 15269, - 15447, 15624, 15800, 15976, 16151, 16326, 16500, 16673, - 16846, 17018, 17190, 17361, 17531, 17700, 17869, 18037, - 18205, 18372, 18538, 18703, 18868, 19032, 19195, 19358, - 19520, 19681, 19841, 20001, 20160, 20318, 20475, 20632, - 20788, 20943, 21097, 21251, 21403, 21555, 21706, 21856, - 22006, 22154, 22302, 22449, 22595, 22740, 22884, 23028, - 23170, 23312, 23453, 23593, 23732, 23870, 24008, 24144, - 24279, 24414, 24548, 24680, 24812, 24943, 25073, 25202, - 25330, 25457, 25583, 25708, 25833, 25956, 26078, 26199, - 26320, 26439, 26557, 26674, 26791, 26906, 27020, 27133, - 27246, 27357, 27467, 27576, 27684, 27791, 27897, 28002, - 28106, 28209, 28311, 28411, 28511, 28610, 28707, 28803, - 28899, 28993, 29086, 29178, 29269, 29359, 29448, 29535, - 29622, 29707, 29792, 29875, 29957, 30038, 30118, 30196, - 30274, 30350, 30425, 30499, 30572, 30644, 30715, 30784, - 30853, 30920, 30986, 31050, 31114, 31177, 31238, 31298, - 31357, 31415, 31471, 31527, 31581, 31634, 31686, 31737, - 31786, 31834, 31881, 31927, 31972, 32015, 32058, 32099, - 32138, 32177, 32214, 32251, 32286, 32319, 32352, 32383, - 32413, 32442, 32470, 32496, 32522, 32546, 32568, 32590, - 32610, 32629, 32647, 32664, 32679, 32693, 32706, 32718, - 32729, 32738, 32746, 32753, 32758, 32762, 32766, 32767, - 32767, 32767, 32766, 32762, 32758, 32753, 32746, 32738, - 32729, 32718, 32706, 32693, 32679, 32664, 32647, 32629, - 32610, 32590, 32568, 32546, 32522, 32496, 32470, 32442, - 32413, 32383, 32352, 32319, 32286, 32251, 32214, 32177, - 32138, 32099, 32058, 32015, 31972, 31927, 31881, 31834, - 31786, 31737, 31686, 31634, 31581, 31527, 31471, 31415, - 31357, 31298, 31238, 31177, 31114, 31050, 30986, 30920, - 30853, 30784, 30715, 30644, 30572, 30499, 30425, 30350, - 30274, 30196, 30118, 30038, 29957, 29875, 29792, 29707, - 29622, 29535, 29448, 29359, 29269, 29178, 29086, 28993, - 28899, 28803, 28707, 28610, 28511, 28411, 28311, 28209, - 28106, 28002, 27897, 27791, 27684, 27576, 27467, 27357, - 27246, 27133, 27020, 26906, 26791, 26674, 26557, 26439, - 26320, 26199, 26078, 25956, 25833, 25708, 25583, 25457, - 25330, 25202, 25073, 24943, 24812, 24680, 24548, 24414, - 24279, 24144, 24008, 23870, 23732, 23593, 23453, 23312, - 23170, 23028, 22884, 22740, 22595, 22449, 22302, 22154, - 22006, 21856, 21706, 21555, 21403, 21251, 21097, 20943, - 20788, 20632, 20475, 20318, 20160, 20001, 19841, 19681, - 19520, 19358, 19195, 19032, 18868, 18703, 18538, 18372, - 18205, 18037, 17869, 17700, 17531, 17361, 17190, 17018, - 16846, 16673, 16500, 16326, 16151, 15976, 15800, 15624, - 15447, 15269, 15091, 14912, 14733, 14553, 14373, 14192, - 14010, 13828, 13646, 13463, 13279, 13095, 12910, 12725, - 12540, 12354, 12167, 11980, 11793, 11605, 11417, 11228, - 11039, 10850, 10660, 10469, 10279, 10088, 9896, 9704, - 9512, 9319, 9127, 8933, 8740, 8546, 8351, 8157, - 7962, 7767, 7571, 7376, 7180, 6983, 6787, 6590, - 6393, 6195, 5998, 5800, 5602, 5404, 5205, 5007, - 4808, 4609, 4410, 4211, 4011, 3812, 3612, 3412, - 3212, 3012, 2811, 2611, 2411, 2210, 2009, 1809, - 1608, 1407, 1206, 1005, 804, 603, 402, 201, - 0, -201, -402, -603, -804, -1005, -1206, -1407, - -1608, -1809, -2009, -2210, -2411, -2611, -2811, -3012, - -3212, -3412, -3612, -3812, -4011, -4211, -4410, -4609, - -4808, -5007, -5205, -5404, -5602, -5800, -5998, -6195, - -6393, -6590, -6787, -6983, -7180, -7376, -7571, -7767, - -7962, -8157, -8351, -8546, -8740, -8933, -9127, -9319, - -9512, -9704, -9896, -10088, -10279, -10469, -10660, -10850, - -11039, -11228, -11417, -11605, -11793, -11980, -12167, -12354, - -12540, -12725, -12910, -13095, -13279, -13463, -13646, -13828, - -14010, -14192, -14373, -14553, -14733, -14912, -15091, -15269, - -15447, -15624, -15800, -15976, -16151, -16326, -16500, -16673, - -16846, -17018, -17190, -17361, -17531, -17700, -17869, -18037, - -18205, -18372, -18538, -18703, -18868, -19032, -19195, -19358, - -19520, -19681, -19841, -20001, -20160, -20318, -20475, -20632, - -20788, -20943, -21097, -21251, -21403, -21555, -21706, -21856, - -22006, -22154, -22302, -22449, -22595, -22740, -22884, -23028, - -23028 -};/*Q15*/ - - -const Word16 Asr_LP16_fx[21] = -{ - /*Q15 */ - 0, 110, 0, -428, 0, 1153, 0, -2832, - 0, 10199, 16384, 10199, 0, -2832, 0, 1153, - 0, -428, 0, 110, 0 -}; - -const Word16 Asr_LP32_fx[41] = -{ - /*Q15 */ - 0, 24, 55, 58, 0, -113, -214, -198, - 0, 323, 576, 510, 0, -795, -1416, -1280, - 0, 2337, 5099, 7334, 8192, 7334, 5099, 2337, - 0, -1280, -1416, -795, 0, 510, 576, 323, - 0, -198, -214, -113, 0, 58, 55, 24, - 0 -}; - -const Word16 Asr_LP48_fx[61] = -{ - /*Q17 */ - 0, 38, 93, 146, 167, 123, 0, -192, - -408, -571, -592, -407, 0, 564, 1143, 1537, - 1546, 1035, 0, -1391, -2801, -3776, -3843, -2635, - 0, 3919, 8679, 13599, 17887, 20809, 21845, 20809, - 17887, 13599, 8679, 3919, 0, -2635, -3843, -3776, - -2801, -1391, 0, 1035, 1546, 1537, 1143, 564, - 0, -407, -592, -571, -408, -192, 0, 123, - 167, 146, 93, 38, 0 -}; - -const Word16 fft256_read_indexes[]= // Q0 -{ - 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, - 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, - 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, - 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, - 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, - 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, - 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, - 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, - 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, - 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, - 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, - 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, - 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, - 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, - 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, - 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255 -}; - - -/*----------------------------------------------------------------------------------* - * Sinus & Cosinus - table for the DCT-IV based 2 - *----------------------------------------------------------------------------------*/ - -const Word16 sin_table256_fx[] = -{//Q15 - 101, 302, 503, 704, 905, 1106, 1307, 1507, 1708, - 1909, 2110, 2310, 2511, 2711, 2912, 3112, 3312, 3512, - 3712, 3911, 4111, 4310, 4510, 4709, 4907, 5106, 5305, - 5503, 5701, 5899, 6097, 6294, 6491, 6688, 6885, 7081, - 7278, 7473, 7669, 7864, 8059, 8254, 8449, 8643, 8836, - 9030, 9223, 9416, 9608, 9800, 9992, 10183, 10374, 10565, - 10755, 10945, 11134, 11323, 11511, 11699, 11887, 12074, 12261, - 12447, 12633, 12818, 13003, 13187, 13371, 13554, 13737, 13919, - 14101, 14282, 14463, 14643, 14823, 15002, 15180, 15358, 15535, - 15712, 15888, 16064, 16239, 16413, 16587, 16760, 16932, 17104, - 17275, 17446, 17616, 17785, 17953, 18121, 18288, 18455, 18621, - 18786, 18950, 19114, 19277, 19439, 19601, 19761, 19921, 20081, - 20239, 20397, 20554, 20710, 20865, 21020, 21174, 21327, 21479, - 21631, 21781, 21931, 22080, 22228, 22375, 22522, 22668, 22812, - 22956, 23099, 23241, 23383, 23523, 23663, 23801, 23939, 24076, - 24212, 24347, 24481, 24614, 24746, 24878, 25008, 25138, 25266, - 25394, 25520, 25646, 25771, 25894, 26017, 26139, 26259, 26379, - 26498, 26616, 26733, 26848, 26963, 27077, 27190, 27301, 27412, - 27522, 27630, 27738, 27844, 27950, 28054, 28158, 28260, 28361, - 28461, 28560, 28658, 28755, 28851, 28946, 29040, 29132, 29224, - 29314, 29404, 29492, 29579, 29665, 29750, 29833, 29916, 29997, - 30078, 30157, 30235, 30312, 30388, 30462, 30536, 30608, 30680, - 30750, 30819, 30886, 30953, 31018, 31082, 31146, 31207, 31268, - 31328, 31386, 31443, 31499, 31554, 31608, 31660, 31711, 31761, - 31810, 31858, 31904, 31950, 31994, 32037, 32078, 32119, 32158, - 32196, 32233, 32268, 32303, 32336, 32368, 32398, 32428, 32456, - 32483, 32509, 32534, 32557, 32579, 32600, 32620, 32638, 32656, - 32672, 32686, 32700, 32712, 32723, 32733, 32742, 32749, 32756, - 32760, 32764, 32767, 32767 -}; -/*----------------------------------------------------------------------------------* - * 1/4 resolution interpolation filter (-3 dB at 0.913*fs/2) - *----------------------------------------------------------------------------------*/ - - -const Word16 inter4_2_fx_Q15[65] = -{//Q15 - 30801, - 28062, 20718, 11061, 1935, - -4294, -6533, -5195, -1846, - 1559, 3497, 3398, 1705, - -497, -2087, -2413, -1523, - -32, 1252, 1741, 1312, - 305, -710, -1237, -1087, - -426, 350, 848, 862, - 452, -119, -550, -650, - -418, -17, 330, 462, - 349, 85, -175, -306, - -265, -104, 76, 184, - 182, 93, -20, -98, - -110, -66, -3, 43, - 55, 37, 8, -13, - -20, -14, -4, 2, - 3, 1, 0, 0, -}; - -const Word16 inter4_2_fx[] = -{//evs table , some mismatch in values compared to float is observed - 0, 1, 2, 1, - -2, -7, -10, -7, - 4, 19, 28, 22, - -2, -33, -55, -49, - -10, 47, 91, 92, - 38, -52, -133, -153, - -88, 43, 175, 231, - 165, -9, -209, -325, - -275, -60, 226, 431, - 424, 175, -213, -544, - -619, -355, 153, 656, - 871, 626, -16, -762, - -1207, -1044, -249, 853, - 1699, 1749, 780, -923, - -2598, -3267, -2147, 968, - 5531, 10359, 14031, 15401, - 14031, 10359, 5531, 968, - -2147, -3267, -2598, -923, - 780, 1749, 1699, 853, - -249, -1044, -1207, -762, - -16, 626, 871, 656, - 153, -355, -619, -544, - -213, 175, 424, 431, - 226, -60, -275, -325, - -209, -9, 165, 231, - 175, 43, -88, -153, - -133, -52, 38, 92, - 91, 47, -10, -49, - -55, -33, -2, 22, - 28, 19, 4, -7, - -10, -7, -2, 1, - 2, 1, 0, 0 -}; - -/* 1/4 resolution interpolation filter (-3 dB at 0.856*fs/2) */ -const Word16 pitch_inter4_2[PIT_FIR_SIZE2] = -{ - /* cut-off frequency at 0.94*fs/2 */ - 30802/*0.940000f Q15*/, - 28062/*0.856390f Q15*/, 20718/*0.632268f Q15*/, 11061/*0.337560f Q15*/, 1936/*0.059072f Q15*/, - -4295/*-0.131059f Q15*/, -6534/*-0.199393f Q15*/, -5196/*-0.158569f Q15*/, -1847/*-0.056359f Q15*/, - 1560/*0.047606f Q15*/, 3498/*0.106749f Q15*/, 3398/*0.1037059f Q15*/, 1706/*0.052062f Q15*/, - -497/*-0.015182f Q15*/, -2087/*-0.063705f Q15*/, -2414/*-0.073660f Q15*/, -1524/*-0.046497f Q15*/, - -32/*-0.000983f Q15*/, 1253/*0.038227f Q15*/, 1741/*0.053143f Q15*/, 1313/*0.040059f Q15*/, - 305/*0.009308f Q15*/, -710/*-0.021674f Q15*/, -1238/*-0.037767f Q15*/, -1087/*-0.033186f Q15*/, - -427/*-0.013028f Q15*/, 351/*0.010702f Q15*/, 849/*0.025901f Q15*/, 862/*0.026318f Q15*/, - 453/*0.013821f Q15*/, -119/*-0.003645f Q15*/, -551/*-0.016813f Q15*/, -651/*-0.019855f Q15*/, - -418/*-0.012766f Q15*/, -17/*-0.000530f Q15*/, 330/*0.010080f Q15*/, 463/*0.014122f Q15*/, - 349/*0.010657f Q15*/, 85/*0.002594f Q15*/, -176/*-0.005363f Q15*/, -306/*-0.009344f Q15*/, - -265/*-0.008101f Q15*/, -104/*-0.003182f Q15*/, 76/*0.002330f Q15*/, 185/*0.005635f Q15*/, - 182/*0.005562f Q15*/, 93/*0.002844f Q15*/, -21/*-0.000627f Q15*/, -98/*-0.002993f Q15*/, - -110/*-0.003362f Q15*/, -67/*-0.002044f Q15*/, -4/*-0.000116f Q15*/, 43/*0.001315f Q15*/, - 55/*0.001692f Q15*/, 38/*0.001151f Q15*/, 8/*0.000259f Q15*/, -14/*-0.000417f Q15*/, - -20/*-0.000618f Q15*/, -14/*-0.000434f Q15*/, -4/*-0.000133f Q15*/, 2/*0.000063f Q15*/, - 3/*0.000098f Q15*/, 2/*0.000048f Q15*/, 0/*0.000007f Q15*/, 0/*0.000000f Q15*/ -}; -/* 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) */ -const Word16 pitch_inter4_1[UP_SAMP * L_INTERPOL1 + 1] = -{ - 29491/*0.900000F Q15*/, - 26836/*0.818959F Q15*/, 19820/* 0.604850F Q15*/, 10859/* 0.331379F Q15*/, 2751/* 0.083958F Q15*/, - -2484/*-0.075795F Q15*/, -4283/* -0.130717F Q15*/, -3463/*-0.105685F Q15*/, -1533/*-0.046774F Q15*/, - 146/*0.004467F Q15*/, 911/* 0.027789F Q15*/, 840/* 0.025642F Q15*/, 412/* 0.012571F Q15*/, - 63/*0.001927F Q15*/, -51/* -0.001571F Q15*/, -25/*-0.000753F Q15*/, 0/* 0.000000f Q15*/ -}; - -/*----------------------------------------------------------------------------------* - * 1/6 resolution interpolation filter (-3 dB at 0.95*fs/2) - *----------------------------------------------------------------------------------*/ - -/* 1/6 resolution interpolation filter (-3 dB at 0.95*fs/2) */ -const Word16 pitch_inter6_2[PIT_FIR_SIZE6_2] = -{ - 31129/*0.949986374119862f Q15*/, - 29854/*0.911081104469830f Q15*/, - 26218/*0.800115099292852f Q15*/, - 20753/*0.633320673120883f Q15*/, - 14240/*0.434558462154083f Q15*/, - 7575/*0.231177017786780f Q15*/, - 1618/*0.049378173063717f Q15*/, - -2950/*-0.090039611811170f Q15*/, - -5727/*-0.174782560924477f Q15*/, - -6635/*-0.202477516286360f Q15*/, - -5905/*-0.180218293244902f Q15*/, - -4012/*-0.122429229978978f Q15*/, - -1558/*-0.047552067127379f Q15*/, - 843/*0.025733669494145f Q15*/, - 2687/*0.081995376731897f Q15*/, - 3656/*0.111581381838187f Q15*/, - 3663/*0.111781798292302f Q15*/, - 2834/*0.086499988914996f Q15*/, - 1462/*0.044629684447068f Q15*/, - -79/*-0.002416435594242f Q15*/, - -1423/*-0.043440027386915f Q15*/, - -2289/*-0.069857782812169f Q15*/, - -2533/*-0.077293683967992f Q15*/, - -2166/*-0.066098268486336f Q15*/, - -1336/*-0.040782649068098f Q15*/, - -282/*-0.008590773415008f Q15*/, - 734/*0.022397654632128f Q15*/, - 1480/*0.045171360007974f Q15*/, - 1811/*0.055274128677739f Q15*/, - 1690/*0.051578034020076f Q15*/, - 1187/*0.036232016917169f Q15*/, - 454/*0.013869500422767f Q15*/, - -317/*-0.009680698856947f Q15*/, - -945/*-0.028843394410080f Q15*/, - -1296/*-0.039560663181280f Q15*/, - -1314/*-0.040095747151623f Q15*/, - -1023/*-0.031231107680685f Q15*/, - -520/*-0.015866154815425f Q15*/, - 60/*0.001841532922707f Q15*/, - 575/*0.017553701334759f Q15*/, - 910/*0.027778555138199f Q15*/, - 1003/*0.030612329573745f Q15*/, - 853/*0.026046143652186f Q15*/, - 518/*0.015803012695681f Q15*/, - 91/*0.002782973481834f Q15*/, - -319/*-0.009720124055079f Q15*/, - -617/*-0.018826488463900f Q15*/, - -744/*-0.022710487805852f Q15*/, - -686/*-0.020936374578238f Q15*/, - -473/*-0.014436620433404f Q15*/, - -169/*-0.005169079181373f Q15*/, - 145/*0.004437651243491f Q15*/, - 397/*0.012100372954920f Q15*/, - 531/*0.016207075406240f Q15*/, - 529/*0.016135389123271f Q15*/, - 403/*0.012306629559665f Q15*/, - 196/*0.005986734945567f Q15*/, - -36/*-0.001094950878591f Q15*/, - -236/*-0.007200842219958f Q15*/, - -360/*-0.010998212848124f Q15*/, - -388/*-0.011835179448280f Q15*/, - -322/*-0.009826566540474f Q15*/, - -188/*-0.005747665080695f Q15*/, - -26/*-0.000780600030751f Q15*/, - 125/*0.003810613287985f Q15*/, - 229/*0.006990479233404f Q15*/, - 268/*0.008174249796791f Q15*/, - 240/*0.007317375965949f Q15*/, - 159/*0.004864690818765f Q15*/, - 52/*0.001587005259212f Q15*/, - -54/*-0.001642504305841f Q15*/, - -133/*-0.004070609517416f Q15*/, - -171/*-0.005230670504649f Q15*/, - -164/*-0.005019147682711f Q15*/, - -120/*-0.003673879223241f Q15*/, - -55/*-0.001671460853812f Q15*/, - 14/*0.000420750005150f Q15*/, - 69/*0.002095384947391f Q15*/, - 99/*0.003020513665060f Q15*/, - 101/*0.003095468528243f Q15*/, - 80/*0.002441025550729f Q15*/, - 44/*0.001335514431569f Q15*/, - 4/*0.000120805384516f Q15*/, - -29/*-0.000893340757369f Q15*/, - -49/*-0.001501610712267f Q15*/, - -54/*-0.001636887611783f Q15*/, - -45/*-0.001362571776250f Q15*/, - -27/*-0.000832126175863f Q15*/, - -8/*-0.000232033375863f Q15*/, - 9/*0.000273627139471f Q15*/, - 19/*0.000582092683087f Q15*/, - 22/*0.000666445711949f Q15*/, - 19/*0.000566088888178f Q15*/, - 12/*0.000360374058147f Q15*/, - 4/*0.000136306914913f Q15*/, - -1/*-0.000038864994777f Q15*/, - -4/*-0.000132755824518f Q15*/, - -5/*-0.000148377158880f Q15*/, - -4/*-0.000112937171810f Q15*/, - -2/*-0.000061132514471f Q15*/, - -1/*-0.000019974224468f Q15*/, - 0/*-0.000000460344975f Q15*/, - 0/*0.000001976848453f Q15*/ -}; - - -/*----------------------------------------------------------------------------------* - * Low-pass FIR filter for low-frequency post-filtering @ 16kHz - * response : -6dB @ 50Hz, -3dB @ 500Hz, -6dB @ 6.4kHz) - * L_FILT=15 @ 16kHz (1+4x15=61 coef) - * L_FILT=12 @ 12.8kHz (1+5x12=61 coef) - * filter parameters: fs/2=32000, fc=6400, gain=5.0, n=61 - *----------------------------------------------------------------------------------*/ - -const Word16 filter_LP12_180H_fx[] = /* Sincfilt.m: N=180*2+1, Fmin=0, Fmax=1/12, hann( N )' */ -{//Q14 - 16384, 16196, 15641, 14741, 13533, 12067, - 10402, 8604, 6742, 4887, 3105, 1459, - 0, -1230, -2202, -2900, -3322, -3478, - -3392, -3095, -2628, -2037, -1371, -676, - 0, 618, 1143, 1550, 1822, 1954, - 1946, 1811, 1565, 1233, 842, 421, - 0, -394, -736, -1008, -1196, -1294, - -1299, -1217, -1059, -839, -576, -290, - 0, 274, 514, 707, 842, 913, - 920, 865, 755, 600, 413, 208, - 0, -197, -371, -511, -609, -662, - -667, -627, -548, -436, -300, -151, - 0, 143, 270, 371, 443, 481, - 485, 456, 398, 316, 217, 109, - 0, -104, -195, -268, -319, -346, - -348, -326, -284, -225, -155, -78, - 0, 73, 137, 189, 224, 242, - 243, 227, 198, 156, 107, 54, - 0, -50, -94, -128, -151, -163, - -163, -152, -131, -103, -70, -35, - 0, 32, 60, 82, 96, 103, - 102, 95, 81, 64, 43, 21, - 0, -19, -36, -48, -56, -59, - -58, -53, -45, -35, -23, -11, - 0, 10, 18, 24, 28, 29, - 28, 25, 21, 16, 10, 5, - 0, -4, -7, -9, -10, -10, - -9, -8, -6, -5, -3, -1, - 0, 1, 1, 2, 2, 1, - 1, 1, 0, 0, 0, 0, - 0 -}; -const Word16 filter_LP12_180H_13b_fx[] = /*Q13 Sincfilt.m: N=180*2+1, Fmin=0, Fmax=1/12, hann( N )*/ -{//Q13 - 8192, 8098, 7820, 7370, 6766, 6033, - 5201, 4302, 3371, 2443, 1553, 729, - 0, -615, -1101, -1450, -1661, -1739, - -1696, -1547, -1314, -1019, -685, -338, - 0, 309, 571, 775, 911, 977, - 973, 905, 783, 616, 421, 210, - 0, -197, -368, -504, -598, -647, - -649, -608, -529, -420, -288, -145, - 0, 137, 257, 353, 421, 457, - 460, 432, 377, 300, 206, 104, - 0, -99, -185, -255, -305, -331, - -333, -314, -274, -218, -150, -76, - 0, 72, 135, 186, 221, 240, - 242, 228, 199, 158, 109, 55, - 0, -52, -97, -134, -159, -173, - -174, -163, -142, -113, -77, -39, - 0, 37, 69, 94, 112, 121, - 121, 114, 99, 78, 53, 27, - 0, -25, -47, -64, -76, -81, - -81, -76, -66, -52, -35, -18, - 0, 16, 30, 41, 48, 52, - 51, 47, 41, 32, 21, 11, - 0, -10, -18, -24, -28, -30, - -29, -27, -23, -17, -12, -6, - 0, 5, 9, 12, 14, 14, - 14, 13, 10, 8, 5, 2, - 0, -2, -4, -5, -5, -5, - -5, -4, -3, -2, -1, -1, - 0, 0, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, - 0 -}; - -const Word16 filter_LP15_180H_fx[] = /* Sincfilt.m: N=180*2+1, Fmin=0, Fmax=1/15, hann( N )' */ -{//Q14 - 16384, 16263, 15904, 15317, 14516, 13524, - 12366, 11073, 9678, 8216, 6723, 5236, - 3790, 2416, 1144, 0, -997, -1831, - -2492, -2976, -3285, -3425, -3408, -3248, - -2966, -2583, -2123, -1610, -1070, -526, - 0, 487, 919, 1281, 1564, 1761, - 1869, 1891, 1830, 1695, 1496, 1244, - 954, 641, 318, 0, -300, -569, - -799, -982, -1113, -1188, -1209, -1176, - -1094, -969, -809, -623, -420, -209, - 0, 198, 377, 531, 653, 741, - 793, 807, 786, 732, 649, 543, - 418, 282, 140, 0, -133, -253, - -356, -438, -497, -531, -540, -526, - -489, -433, -362, -278, -187, -93, - 0, 88, 167, 234, 288, 325, - 347, 352, 342, 317, 280, 233, - 179, 120, 59, 0, -56, -105, - -147, -180, -203, -215, -217, -210, - -194, -170, -141, -107, -72, -35, - 0, 33, 61, 85, 103, 116, - 122, 122, 117, 107, 93, 76, - 58, 38, 19, 0, -17, -31, - -43, -51, -57, -59, -58, -55, - -49, -42, -34, -25, -16, -8, - 0, 7, 12, 16, 19, 20, - 21, 20, 18, 16, 13, 10, - 7, 4, 2, 0, -1, -2, - -3, -3, -3, -3, -2, -2, - -1, -1, 0, 0, 0, 0, - 0 -}; - -const Word16 filter_LP15_180H_13b_fx[6 * 31] = /*Q13 Sincfilt.m: N=180*2+1, Fmin=0, Fmax=1/12, hann( N )'*/ -{//Q13 - 8192, 8132, 7952, 7658, 7258, 6762, - 6183, 5536, 4839, 4108, 3362, 2618, - 1895, 1208, 572, 0, -498, -915, - -1246, -1488, -1643, -1713, -1704, -1624, - -1483, -1291, -1061, -805, -535, -263, - 0, 244, 459, 640, 782, 880, - 935, 945, 915, 848, 748, 622, - 477, 320, 159, 0, -150, -285, - -400, -491, -556, -594, -604, -588, - -547, -485, -405, -312, -210, -104, - 0, 99, 189, 265, 327, 371, - 396, 404, 393, 366, 325, 271, - 209, 141, 70, 0, -66, -127, - -178, -219, -248, -266, -270, -263, - -245, -217, -181, -139, -94, -46, - 0, 44, 83, 117, 144, 163, - 173, 176, 171, 158, 140, 116, - 89, 60, 30, 0, -28, -53, - -74, -90, -101, -108, -109, -105, - -97, -85, -70, -54, -36, -18, - 0, 16, 31, 43, 52, 58, - 61, 61, 58, 53, 47, 38, - 29, 19, 9, 0, -8, -16, - -21, -26, -28, -29, -29, -27, - -25, -21, -17, -13, -8, -4, - 0, 3, 6, 8, 10, 10, - 10, 10, 9, 8, 6, 5, - 3, 2, 1, 0, -1, -1, - -1, -2, -2, -1, -1, -1, - -1, 0, 0, 0, 0, 0, - 0 -}; - -const Word16 filter_LP24_90H_fx[] = -{//Q14 - - 10240, 10208, 10111, 9951, 9731, - 9452, 9119, 8734, 8304, 7834, - 7328, 6794, 6237, 5664, 5081, - 4495, 3913, 3339, 2780, 2241, - 1727, 1242, 791, 376, 0, - -335, -629, -880, -1089, -1256, - -1383, -1471, -1523, -1540, -1527, - -1487, -1422, -1337, -1235, -1119, - -994, -862, -727, -592, -460, - -333, -212, -101, 0, 90, - 167, 232, 285, 325, 354, - 371, 378, 376, 366, 349, - 326, 299, 269, 236, 203, - 171, 139, 109, 81, 56, - 34, 15, 0, -12, -21, - -27, -30, -31, -31, -29, - -26, -22, -18, -14, -10, - -7, -4, -2, -1, 0, - 0, 0, 0, 0, 0, - 0, - 0 - -}; - -const Word16 filter_LP24_90H_13b_fx[] = -{//Q13 - - 5120, 5104, 5056, 4976, 4865, - 4726, 4559, 4367, 4152, 3917, - 3664, 3397, 3119, 2832, 2541, - 2248, 1956, 1669, 1390, 1120, - 863, 621, 396, 188, 0, - -168, -315, -440, -545, -628, - -691, -735, -761, -770, -764, - -743, -711, -668, -617, -560, - -497, -431, -364, -296, -230, - -166, -106, -51, 0, 45, - 84, 116, 143, 163, 177, - 186, 189, 188, 183, 174, - 163, 149, 134, 118, 102, - 85, 69, 54, 40, 28, - 17, 8, 0, -6, -10, - -13, -15, -16, -15, -14, - -13, -11, -9, -7, -5, - -3, -2, -1, 0, 0, - 0, 0, 0, 0, 0, - 0, - 0 -}; - -const Word16 filter_LP3_90H_fx[] = /* Sincfilt.m: N=90*2+1, Fmin=0, Fmax=1/3, hann( N )' */ -{//Q14 - 16384, 13545, 6766, 0, -3371, -2689, - 0, 1907, 1661, 0, -1314, -1187, - 0, 990, 911, 0, -783, -729, - 0, 638, 598, 0, -529, -499, - 0, 445, 421, 0, -377, -357, - 0, 321, 305, 0, -274, -260, - 0, 234, 221, 0, -199, -188, - 0, 169, 159, 0, -142, -134, - 0, 119, 112, 0, -99, -93, - 0, 81, 76, 0, -66, -61, - 0, 52, 48, 0, -41, -37, - 0, 31, 28, 0, -23, -20, - 0, 16, 14, 0, -10, -9, - 0, 6, 5, 0, -3, -2, - 0, 1, 1, 0, 0, 0, - 0 -}; - -const Word16 filter_LP15_360H_13b_fx[] = /* Sincfilt.m: N=360*2+1, Fmin=0, Fmax=1/15, hann( N )' */ -{//Q13 - - 8192, 8132, 7954, 7662, 7265, 6772, 6196, 5552, - 4857, 4127, 3381, 2636, 1911, 1220, 579, 0, - -506, -931, -1269, -1519, -1681, -1757, -1752, -1674, - -1533, -1339, -1104, -840, -560, -276, 0, 258, - 488, 682, 836, 946, 1008, 1024, 996, 927, - 821, 687, 529, 357, 178, 0, -170, -325, - -458, -567, -646, -694, -710, -696, -652, -581, - -489, -379, -257, -129, 0, 124, 238, 338, - 420, 481, 518, 533, 523, 492, 440, 372, - 289, 197, 99, 0, -96, -184, -262, -326, - -374, -405, -417, -410, -386, -346, -293, -228, - -156, -78, 0, 76, 147, 209, 260, 299, - 324, 334, 329, 310, 279, 236, 184, 125, - 63, 0, -62, -119, -169, -211, -243, -263, - -271, -268, -252, -227, -192, -150, -102, -52, - 0, 50, 97, 138, 173, 198, 215, 222, - 219, 207, 186, 157, 123, 84, 42, 0, - -41, -80, -113, -142, -163, -176, -182, -180, - -170, -152, -129, -101, -69, -35, 0, 34, - 65, 93, 116, 133, 144, 149, 147, 139, - 125, 106, 82, 56, 28, 0, -28, -53, - -76, -95, -109, -118, -121, -120, -113, -101, - -86, -67, -46, -23, 0, 22, 43, 61, - 77, 88, 95, 98, 97, 91, 82, 69, - 54, 37, 19, 0, -18, -35, -49, -61, - -70, -76, -78, -77, -73, -65, -55, -43, - -29, -15, 0, 14, 27, 39, 48, 55, - 60, 62, 61, 57, 51, 43, 33, 23, - 11, 0, -11, -21, -30, -37, -43, -46, - -48, -47, -44, -39, -33, -26, -17, -9, - 0, 8, 16, 23, 28, 32, 35, 36, - 35, 33, 29, 25, 19, 13, 6, 0, - -6, -12, -17, -21, -24, -25, -26, -25, - -24, -21, -18, -14, -9, -5, 0, 4, - 8, 12, 14, 16, 18, 18, 17, 16, - 14, 12, 9, 6, 3, 0, -3, -6, - -8, -10, -11, -11, -12, -11, -10, -9, - -8, -6, -4, -2, 0, 2, 3, 5, - 6, 6, 7, 7, 7, 6, 5, 4, - 3, 2, 1, 0, -1, -2, -3, -3, - -3, -3, -3, -3, -3, -3, -2, -2, - -1, 0, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0 - -}; - -static const Word16 filter_LP30_300K_fx[LFE_PLC_FDEL + 1] = -{//Q14 -16395,16364,16273,16123,15913,15646,15323,14947,14520,14045,13524,12963,12363,11730,11067,10379,9669, -8943,8205,7460,6712,5965,5225,4495,3779,3082,2408,1759,1140,552,0,-515,-991,-1426,-1819,-2169,-2475, --2736,-2953,-3126,-3257,-3345,-3392,-3400,-3371,-3307,-3210,-3083,-2928,-2749,-2547,-2327,-2091,-1842, --1584,-1319,-1051,-782,-515,-254,0,244,476,695,897,1083,1249,1397,1523,1628,1712,1774,1815,1834,1833, -1811,1771,1712,1637,1546,1442,1325,1197,1060,916,767,614,459,304,150,0,-145,-285,-417,-541,-655,-758, --850,-930,-997,-1051,-1092,-1119,-1134,-1136,-1125,-1102,-1068,-1023,-968,-904,-832,-753,-668,-578, --484,-388,-290,-192,-95,0,92,181,266,345,418,484,543,594,638,672,699,717,727,728,721,707,685,656,621,580, -534,483,428,371,311,249,186,123,61,0,-59,-116,-170,-220,-267,-309,-347,-379,-407,-429,-445,-456,-462,-463, --458,-448,-434,-416,-393,-367,-337,-305,-270,-233,-195,-156,-117,-77,-38,0,37,72,106,137,166,192,215,234,251, -264,274,280,283,283,280,274,264,253,238,222,204,184,162,140,117,93,69,46,22,0,-21,-42,-62,-80,-97,-112,-125,-136, --146,-153,-158,-161,-163,-162,-160,-156,-150,-143,-135,-125,-114,-103,-91,-78,-65,-51,-38,-25,-12,0,11,23,33,43, -52,59,66,72,76,80,82,84,84,83,82,79,76,72,67,62,57,51,44,38,31,25,18,12,5,0,-5,-10,-15,-19,-23,-27,-29,-32,-34, --35,-36,-36,-36,-35,-34,-33,-31,-29,-27,-24,-22,-19,-17,-14,-11,-9,-6,-4,-2,0 - -}; - -const Resampling_cfg resampling_cfg_tbl[] = -{ - /* fin fout up.fact. den.fac. len.out filter coefs. filter length/2 filter mem./2 flags */ - { 8000, 12800, 8, 5, 256, /*filter5_39s320_120,*/ filter5_39s320_120_fx, 15, RS_INV_FAC }, - { 12800, 8000, 5, 8, 160, /*filter5_39s320_120,*/ filter5_39s320_120_fx, L_FILT_UP8k, RS_INV_FAC }, - { 16000, 8000, 6, 12, 160, /*filter_LP12_180H,*/ filter_LP12_180H_fx, 180 / 6, 0 }, - { 12800, 16000, 15, 12, 320, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT_UP16k, 0 }, - { 12800, 32000, 15, 6, 640, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT_UP32k, 0 }, - { 12800, 48000, 15, 4, 960, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT_UP48k, 0 }, - - { 16000, 12800, 12, 15, 256, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT16k, 0, }, - { 16000, 32000, 12, 6, 640, /*filter_LP12_180H, */ filter_LP12_180H_fx, L_FILT16k, 0, }, - { 16000, 48000, 12, 4, 960, /*filter_LP12_180H,*/ filter_LP12_180H_fx, L_FILT16k, 0, }, - - { 32000, 12800, 6, 15, 256, /*filter_LP15_180H,*/ filter_LP15_180H_13b_fx, L_FILT32k, 0, }, - { 32000, 16000, 6, 12, 320, /*filter_LP12_180H,*/ filter_LP12_180H_13b_fx, L_FILT32k, 0, }, - { 32000, 25600, 12, 15, 512, /*filter_LP15_360H,*/ filter_LP15_360H_13b_fx, L_FILT32k, 0, }, - { 32000, 48000, 3, 2, 960, /*filter_LP3_90H,*/ filter_LP3_90H_fx, L_FILT32k, 0, }, - - { 48000, 12800, 4, 15, 256, /*filter_LP15_180H,*/ filter_LP15_180H_13b_fx, L_FILT48k, 0, }, - { 48000, 16000, 4, 12, 320, /*filter_LP12_180H,*/ filter_LP12_180H_13b_fx, L_FILT48k, 0, }, - { 48000, 25600, 8, 15, 512, /*filter_LP15_360H,*/ filter_LP15_360H_13b_fx, L_FILT48k, 0, }, - { 48000, 32000, 2, 3, 640, /*filter_LP3_90H,*/ filter_LP3_90H_fx, L_FILT48k, 0, }, - - /* configs with NB 4kHz low-pass */ - { 16000, 12800, 12, 15, 256, /*filter_LP24_90H,*/ filter_LP24_90H_fx, L_FILT16k, 0, }, - { 32000, 12800, 6, 15, 256, /*filter_LP24_90H,*/ filter_LP24_90H_13b_fx, L_FILT32k, 0, }, - { 48000, 12800, 4, 15, 256, /*filter_LP24_90H,*/ filter_LP24_90H_13b_fx, L_FILT48k, 0, }, - - /* entry for LFE PLC */ - { 1600, 48000, 30, 1, 960, /*filter_LP30_300K,*/ filter_LP30_300K_fx, LFE_PLC_FDEL / 30, 0, }, - { 0, 0, 0, 0, 0, /* 0, */ 0, 0, 0, } /* trailing entry (just to calculate the length of this table) */ -}; - -//den fac value for last entry is calculated as den.fac = (num.fac*fin)/fout -//lg_out value for last entry is calculated as = fout/50 = ((fin/50)*num.fac)/den.fac -//filter_LP30_300K_fx has been calculated with Q14 - -/*----------------------------------------------------------------------------------* - * LSP interpolation coefficients - *----------------------------------------------------------------------------------*/ - - -const Word16 interpol_frac2_fx[NB_SUBFR] = {//Q15 - 16384, 16384, 32767, 32767 -}; - -const Word16 interpol_frac2_mid_fx[NB_SUBFR * 3] = {//Q15 - 8191, 24575, 0, - 8191, 24575, 0, - 0, 8191, 24575, - 0, 8191, 24575 -};/*Q15*/ - - -const Word16 interpol_frac_12k8_fx[NB_SUBFR] = {//Q15 - 8191, 16383, 24575, 32767 -}; - -const Word16 interpol_frac_fx[NB_SUBFR] = { 8192, 16384, 24576,32767 };/*Q15*/ - -const Word16 interpol_isp_amr_wb_fx[] = { 14746, 26214, 31457, 32767 };/*Q15*/ - -const Word16 interpol_frac_16k_fx[NB_SUBFR16k] = { 6554, 13107, 19661, 26214, 32767 };//Q15 - -const Word16 interpol_frac_mid_fx[NB_SUBFR * 3] = { 16384, 16384, 0,//Q15 - 0, 32767, 0, - 0, 16384, 16384, - 0, 0, 32767 -};/*Q15*/ - -const Word16 interpol_frac_mid_16k_fx[NB_SUBFR16k * 3] = { 18022, 14746, 0,//Q15 - 4915, 27853, 0, - 0, 24576, 8192, - 0, 11469, 21299, - 0, 0, 32767 -}; - -const Word16 interpol_frac_mid_relaxprev_12k8_fx[NB_SUBFR * 3] = { 0, 22938, 9830,//Q15 - 0, 0, 32767, - 0, 0, 32767, - 0, 0, 32767 -};/*Q15*/ - -const Word16 interpol_frac_mid_FEC_fx[NB_SUBFR * 3] = { 8192, 18022, 6554,//Q15 - 0, 22938, 9830, - 0, 14746, 18022, - 0, 0, 32767 -};/*Q15*/ - -const Word16 interpol_frac_mid_relaxprev_pred_12k8_fx[NB_SUBFR * 3] = { 4915, 22938, 4915,//Q15 - 1638, 21299, 9830, - 0, 16384, 16384, - 0, 0, 32767 -}; - -const Word16 interpol_frac_mid_relaxprev_16k_fx[NB_SUBFR16k * 3] = { 0, 22938, 9830,//Q15 - 0, 0, 32767, - 0, 0, 32767, - 0, 0, 32767, - 0, 0, 32767 -};/*Q15*/ - -const Word16 interpol_frac_mid_16k_FEC_fx[NB_SUBFR16k * 3] = { 13107, 13107, 6554,//Q15 - 0, 26214, 6554, - 0, 21299, 11469, - 0, 4915, 27853, - 0, 0, 32767 -};/*Q15*/ - -const Word16 interpol_frac_mid_relaxprev_pred_16k_fx[NB_SUBFR16k * 3] = { 4915, 22938, 4915,//Q15 - 1638, 21299, 9830, - 0, 16384, 16384, - 0, 4915, 27853, - 0, 0, 32767 -};/*Q15*/ - -/*----------------------------------------------------------------------------------* - * Innovative codebook - *----------------------------------------------------------------------------------*/ - -/* Innovative codebook config */ -const PulseConfig PulseConfTable[] = -{ - /* Design rules: - * ---> "fixed" + "tried-pair-pos"*2 = pulses & 0xfe - * ---> tracks with pulses % 3 == 0, have always TRACKPOS_FIXED_FIRST */ - /* bits,iter,alp,pulses,fixed,tried-pair-pos,codetrack */ - { 7, 4, 16384/*2.0f Q13*/, 1, 0, {8}, TRACKPOS_FREE_ONE }, /* 7 bits, 1 pulses, 4 tracks, 1000 free track */ - { 10, 4, 16384/*2.0f Q13*/, 2, 0, {8}, TRACKPOS_FIXED_EVEN }, /* 10 bits, 2 pulses, 4 tracks 1010 (used only even tracks designed for NB) */ - { 12, 4, 16384/*2.0f Q13*/, 2, 0, {8}, TRACKPOS_FIXED_TWO }, /* 12 bits, 2 pulses, 2 tracks 11 used all tracks ala AMR-WB 6.6 */ - { 15, 4, 16384/*2.0f Q13*/, 3, 0, {8}, TRACKPOS_FIXED_FIRST }, /* 15 bits, 3 pulses, 4 tracks 1110 fixed track to first ? */ - { 17, 6, 16384/*2.0f Q13*/, 3, 0, {8}, TRACKPOS_FREE_THREE }, /* 17 bits, 3 pulses, 4 tracks (used all tracks) - 1110, 1101, 1011, 0111 */ - { 20, 4, 16384/*2.0f Q13*/, 4, 0, {4, 8}, TRACKPOS_FIXED_FIRST }, /* 20 bits, 4 pulses, 4 tracks 1111 */ - { 24, 4, 16384/*2.0f Q13*/, 5, 0, {4, 8}, TRACKPOS_FIXED_FIRST }, /* 24 bits, 5 pulses, 4 tracks 2111 fixed track to first */ - { 26, 4, 16384/*2.0f Q13*/, 5, 0, {4, 8}, TRACKPOS_FREE_ONE }, /* 26 bits, 5 pulses, 4 tracks 2111 one free track ? */ - { 28, 4, 12288/*1.5f Q13*/, 6, 0, {4, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 28 bits, 6 pulses, 4 tracks 2211 */ - { 30, 4, 12288/*1.5f Q13*/, 6, 0, {4, 8, 8}, TRACKPOS_FIXED_TWO }, /* 30 bits, 6 pulses, 4 tracks 2211 free consecutive track positions ? */ - { 32, 4, 12288/*1.5f Q13*/, 7, 0, {4, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 32 bits, 6 pulses, 4 tracks 2221 fixed ?*/ - { 34, 4, 12288/*1.5f Q13*/, 7, 0, {4, 8, 8}, TRACKPOS_FREE_THREE }, /* 34 bits, 6 pulses, 4 tracks 2221 free track positions ? */ - { 36, 4, 8192/*1.0f Q13*/, 8, 2, {4, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 36 bits, 8 pulses, 4 tracks 2222 */ - { 40, 4, 8192/*1.0f Q13*/, 9, 2, {4, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 40 bits, 9 pulses, 4 tracks 3222 fixed ?*/ - { 43, 4, 8192/*1.0f Q13*/, 10, 2, {4, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 44 bits, 10 pulses, 4 tracks 3322 */ - { 46, 4, 8192/*1.0f Q13*/, 10, 2, {4, 6, 8, 8}, TRACKPOS_FIXED_TWO }, /* 46 bits, 10 pulses, 4 tracks 3322 free consecutive tracks ? */ - { 47, 4, 8192/*1.0f Q13*/, 11, 2, {4, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 47 bits, 10 pulses, 4 tracks 3332 fixed ? */ - { 49, 4, 8192/*1.0f Q13*/, 11, 2, {4, 6, 8, 8}, TRACKPOS_FREE_THREE }, /* 49 bits, 10 pulses, 4 tracks 3332 free three track positions ? */ - { 50, 4, 8192/*1.0f Q13*/, 12, 4, {4, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 50 bits, 12 pulses, 4 tracks 3333 */ - { 53, 4, 8192/*1.0f Q13*/, 13, 4, {4, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 53 bits, 13 pulses, 4 tracks 4333 fixed ? */ - { 55, 4, 8192/*1.0f Q13*/, 13, 4, {4, 6, 8, 8}, TRACKPOS_FREE_ONE }, /* 55 bits, 13 pulses, 4 tracks 4333 free one ? */ - { 56, 4, 8192/*1.0f Q13*/, 14, 4, {4, 6, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 56 bits, 14 pulses, 4 tracks 4433 fixed ?!?! */ - { 58, 4, 8192/*1.0f Q13*/, 14, 4, {4, 6, 6, 8, 8}, TRACKPOS_FIXED_TWO }, /* 58 bits, 14 pulses, 4 tracks 4433 free consecutive ? */ - { 59, 4, 8192/*1.0f Q13*/, 15, 4, {4, 6, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 59 bits, 15 pulses, 4 tracks 4443 fixed ? */ - { 61, 4, 8192/*1.0f Q13*/, 15, 4, {4, 6, 6, 8, 8}, TRACKPOS_FREE_THREE }, /* 61 bits, 15 pulses, 4 tracks 4443 free ? */ - { 62, 3, 6554/*0.8f Q13*/, 16, 4, {4, 4, 6, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 62 bits, 16 pulses, 4 tracks 4444 */ - { 65, 3, 6554/*0.8f Q13*/, 17, 4, {4, 4, 6, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 65 bits, 17 pulses, 4 tracks 5444 fixed ?*/ - { 68, 3, 6144/*0.75f Q13*/, 18, 4, {2, 3, 4, 5, 6, 7, 8}, TRACKPOS_FIXED_FIRST }, /* 68 bits, 18 pulses, 4 tracks 5544 */ - { 70, 3, 6144/*0.75f Q13*/, 19, 4, {2, 3, 4, 5, 6, 7, 8}, TRACKPOS_FIXED_FIRST }, /* 70 bits, 19 pulses, 4 tracks 5554 fixed ? */ - { 73, 3, 6144/*0.75f Q13*/, 20, 4, {2, 3, 4, 5, 6, 7, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 73 bits, 20 pulses, 4 tracks 5555 fixed ? */ - { 75, 3, 6144/*0.75f Q13*/, 21, 4, {2, 3, 4, 5, 6, 7, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 75 bits, 21 pulses, 4 tracks 6555 fixed ? */ - { 78, 3, 6144/*0.75f Q13*/, 22, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 78 bits, 22 pulses, 4 tracks 6655 fixed ? */ - { 80, 3, 6144/*0.75f Q13*/, 23, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 80 bits, 23 pulses, 4 tracks 6665 fixed ? */ - { 83, 2, 2458/*0.30f Q13*/, 24, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 83 bits, 24 pulses, 4 tracks 6666 */ - { 85, 2, 2458/*0.30f Q13*/, 25, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 85 bits, 25 pulses, 4 tracks 7666 */ - { 87, 2, 2048/*0.25f Q13*/, 26, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 87 bits, 26 pulses, 4 tracks 7766 */ - { 89, 2, 2048/*0.25f Q13*/, 27, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 89 bits, 27 pulses, 4 tracks 7776 */ - { 92, 2, 2048/*0.25f Q13*/, 28, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 92 bits, 28 pulses, 4 tracks 7777 */ - { 94, 2, 2048/*0.25f Q13*/, 29, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 94 bits, 29 pulses, 4 tracks 8777 */ - { 96, 1, 1638/*0.20f Q13*/, 30, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 96 bits, 30 pulses, 4 tracks 8877 */ - { 98, 1, 1638/*0.20f Q13*/, 31, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 98 bits, 31 pulses, 4 tracks 8887 */ -}; - - -/* Number of pulses & positions to the number of unique states that can be achieved with those pulses */ -const UWord32 pulsestostates[17][9] = -{ - { 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 2, 2, 2, 2, 2, 2, 2, 2, 2}, - { 4, 8, 12, 16, 20, 24, 28, 32, 36}, - { 6, 18, 38, 66, 102, 146, 198, 258, 326}, - { 8, 32, 88, 192, 360, 608, 952, 1408, 1992}, - { 10, 50, 170, 450, 1002, 1970, 3530, 5890, 9290}, - { 12, 72, 292, 912, 2364, 5336, 10836, 20256, 35436}, - { 14, 98, 462, 1666, 4942, 12642, 28814, 59906, 115598}, - { 16, 128, 688, 2816, 9424, 27008, 68464, 157184, 332688}, - { 18, 162, 978, 4482, 16722, 53154, 148626, 374274, 864146}, - { 20, 200, 1340, 6800, 28004, 97880, 299660, 822560, 2060980}, - { 22, 242, 1782, 9922, 44726, 170610, 568150, 1690370, 4573910}, - { 24, 288, 2312, 14016, 68664, 284000, 1022760, 3281280, 9545560}, - { 26, 338, 2938, 19266, 101946, 454610, 1761370, 6065410, 18892250}, - { 28, 392, 3668, 25872, 147084, 703640, 2919620, 10746400, 35704060}, - { 30, 450, 4510, 34050, 207006, 1057730, 4680990, 18347010, 64797470}, - { 32, 512, 5472, 44032, 285088, 1549824, 7288544, 30316544, 113461024}, -}; - -/*----------------------------------------------------------------------------------* - * Gain quantization table for memory-less gain quantizer - *----------------------------------------------------------------------------------*/ - -const Word16 gain_qua_mless_7b_fx[128*2] = -{//Q14 - 419, 28, - 1499, 607, - 1586, 322, - 1632, 144, - 1686, 229, - 1745, 495, - 2182, 409, - 2515, 716, - 2772, 824, - 3069, 1069, - 3211, 936, - 3218, 89, - 3477, 1244, - 3755, 272, - 3865, 549, - 3881, 348, - 4171, 181, - 4414, 627, - 4419, 472, - 4909, 1429, - 5238, 404, - 5241, 1651, - 5721, 85, - 5833, 250, - 5846, 693, - 5897, 325, - 6036, 544, - 6088, 779, - 6459, 1889, - 6650, 157, - 6678, 462, - 6798, 879, - 6922, 993, - 6929, 1130, - 7352, 620, - 7461, 386, - 7864, 232, - 7999, 314, - 8136, 536, - 8398, 712, - 8680, 459, - 8797, 1276, - 9046, 806, - 9198, 86, - 9434, 398, - 9730, 587, - 9735, 267, - 9742, 175, - 9917, 917, - 10042, 509, - 10053, 655, - 10132, 1030, - 10238, 339, - 10694, 1560, - 10817, 447, - 10964, 723, - 11405, 1149, - 11526, 549, - 11582, 386, - 11602, 791, - 11618, 286, - 11883, 862, - 11954, 607, - 12057, 214, - 12104, 496, - 12170, 1397, - 12437, 668, - 12616, 335, - 12668, 952, - 12684, 435, - 12983, 112, - 13235, 742, - 13399, 549, - 13525, 380, - 13527, 270, - 13625, 1044, - 13733, 482, - 13820, 617, - 14036, 817, - 14041, 1257, - 14295, 425, - 14346, 684, - 14367, 319, - 14416, 199, - 14644, 898, - 14944, 518, - 15090, 364, - 15154, 578, - 15309, 462, - 15360, 1933, - 15362, 756, - 15381, 262, - 15566, 1127, - 15699, 639, - 15804, 410, - 16081, 316, - 16161, 993, - 16359, 701, - 16451, 828, - 16500, 543, - 16540, 491, - 16617, 1729, - 16630, 196, - 16749, 369, - 16959, 1530, - 17028, 442, - 17139, 603, - 17369, 898, - 17393, 268, - 17972, 763, - 17985, 1361, - 18016, 333, - 18032, 667, - 18234, 406, - 18270, 105, - 18299, 554, - 18342, 488, - 18747, 1207, - 19027, 1073, - 19530, 216, - 19566, 963, - 19751, 835, - 19794, 615, - 19810, 298, - 19988, 710, - 19990, 449, - 20005, 374, - 20149, 531, -}; - -const Word16 gain_qua_mless_6b_stereo_fx[64 * 2] = -{//Q14 - 570, 695, - 932, 535, - 972, 913, - 1305, 165, - 1503, 343, - 1942, 2102, - 2763, 440, - 2957, 1204, - 3163, 621, - 3232, 760, - 4215, 255, - 4415, 533, - 4884, 873, - 5395, 429, - 5601, 664, - 5724, 1615, - 6847, 1057, - 6849, 535, - 6889, 3303, - 7086, 335, - 7135, 766, - 8267, 616, - 8601, 907, - 8690, 442, - 9501, 1264, - 9517, 728, - 10050, 73, - 10243, 514, - 10723, 861, - 10884, 641, - 11005, 339, - 11919, 1623, - 11976, 1037, - 12219, 564, - 12286, 770, - 12858, 413, - 12944, 8191, - 13347, 684, - 13751, 502, - 13802, 873, - 13812, 1207, - 14417, 615, - 14633, 392, - 15119, 732, - 15214, 521, - 15247, 976, - 15509, 290, - 15936, 1440, - 16101, 603, - 16157, 448, - 16277, 799, - 16358, 2544, - 16863, 4652, - 17010, 1093, - 17073, 350, - 17348, 659, - 17583, 509, - 17853, 854, - 19087, 1756, - 19109, 405, - 19348, 727, - 19553, 566, - 19553, 1240, - 19659, 953 -}; - -const Word16 gain_qua_mless_6b_fx[64 * 2] = -{//Q14 - 1676, 71, - 2128, 198, - 2318, 491, - 2348, 339, - 2798, 625, - 2893, 785, - 3911, 1099, - 4779, 244, - 4781, 427, - 5115, 935, - 5294, 1509, - 5767, 114, - 6018, 543, - 6152, 335, - 6205, 675, - 6234, 1822, - 6740, 1251, - 7034, 802, - 7782, 434, - 8005, 230, - 9232, 622, - 9337, 336, - 9388, 520, - 9770, 1038, - 9865, 734, - 10224, 879, - 10617, 118, - 10776, 426, - 11518, 249, - 11708, 1399, - 12044, 587, - 12270, 501, - 12277, 348, - 12498, 684, - 13020, 786, - 13097, 1196, - 13530, 422, - 13818, 917, - 14123, 290, - 14500, 1039, - 14538, 636, - 14636, 556, - 14667, 484, - 14931, 362, - 15055, 210, - 15653, 1594, - 15830, 1874, - 15868, 717, - 15897, 828, - 16153, 434, - 16540, 294, - 16874, 608, - 16936, 513, - 17182, 373, - 17644, 1337, - 17696, 126, - 18342, 1122, - 18461, 944, - 18991, 242, - 19114, 795, - 19187, 674, - 19256, 449, - 19485, 557, - 19515, 344, -}; - -const Word16 gain_qua_mless_5b_fx[32 * 2] = -{//Q14 - 2695, 109, - 3444, 271, - 3529, 433, - 4284, 801, - 4365, 607, - 4935, 1089, - 6896, 1407, - 7722, 324, - 7913, 146, - 8090, 468, - 9049, 913, - 9499, 600, - 9894, 741, - 9942, 1840, - 11906, 382, - 12008, 1103, - 12349, 243, - 12429, 501, - 13687, 630, - 13974, 896, - 14510, 748, - 15160, 322, - 15424, 428, - 15679, 541, - 15832, 1574, - 15999, 1281, - 17223, 211, - 17719, 1029, - 18185, 649, - 18432, 818, - 18638, 353, - 18889, 493, -}; - -const Word16 E_ROM_qua_gain5b_const[NB_QUA_GAIN5B * 2]= -{//Q0 - 1774,577, - 2090,1805, - 2103,3371, - 3908,1116, - 4834,2500, - 6030,4763, - 6838,1334, - 7490,2033, - 8585,3036, - 9845,1575, - 10437,2320, - 10649,3739, - 11298,945, - 12108,1920, - 12310,5108, - 12391,2758, - 12659,1237, - 13729,1557, - 13798,2201, - 13972,3275, - 14881,993, - 15175,1776, - 15409,16190, - 15551,2395, - 15879,4048, - 16341,1335, - 16988,2918, - 18317,7449, - 18368,2026, - 19114,1364, - 19991,4472, - 20644,2790, -}; - -const Word16 E_ROM_qua_gain6b_const[NB_QUA_GAIN6B * 2] = -{//Q0 - 0,2758, - 143,3562, - 397,2146, - 544,4306, - 952,1726, - 1236,724, - 1779,3158, - 1820,5448, - 1975,2473, - 2121,1343, - 3049,3912, - 3081,1885, - 3289,8261, - 3416,2843, - 3495,2204, - 3831,3386, - 4295,4590, - 4300,2476, - 4345,1545, - 4913,1122, - 5198,2080, - 5200,3079, - 5448,3714, - 5482,2689, - 5546,1817, - 5783,17318, - 5934,6236, - 6156,2320, - 6481,4225, - 6828,3351, - 6832,5045, - 6888,2895, - 7186,2559, - 7214,1663, - 7373,2052, - 7906,3819, - 8192,1372, - 8452,3063, - 8464,2354, - 9021,4468, - 9037,2715, - 9175,1874, - 9219,3463, - 9831,2155, - 10523,5383, - 10557,9061, - 10618,3093, - 10633,3949, - 10890,2465, - 11141,1654, - 12132,2790, - 12180,3477, - 12376,2079, - 12494,4560, - 14430,2468, - 14573,3914, - 14576,3111, - 15043,1827, - 15207,1329, - 16073,6155, - 17519,4719, - 18345,2148, - 18554,2784, - 18576,3563, -}; - -const Word16 E_ROM_qua_gain7b_const[NB_QUA_GAIN7B * 2] = -{//Q0 - 123,2777, - 369,2102, - 404,4368, - 693,3486, - 1107,719, - 1222,1679, - 1657,1293, - 1667,5547, - 1805,2425, - 2369,3075, - 2489,12063, - 2681,1901, - 2693,3984, - 3031,7547, - 3248,990, - 3466,2672, - 3674,2165, - 3718,1513, - 3844,3456, - 4120,4656, - 4748,2967, - 4821,19622, - 4855,2400, - 4912,1776, - 5245,3860, - 5312,6282, - 5500,1176, - 5713,2056, - 5872,3287, - 5960,2662, - 6170,9756, - 6364,5021, - 6545,1476, - 6788,2283, - 6796,4163, - 7038,2949, - 7216,1831, - 7274,3516, - 7707,2510, - 8123,5762, - 8361,4485, - 8376,2110, - 8594,3135, - 8611,3755, - 8634,1570, - 8636,2748, - 8683,8222, - 9274,335, - 9512,2404, - 9640,5020, - 9690,1893, - 9778,3361, - 9808,15435, - 9936,4029, - 10194,2767, - 10306,6510, - 10325,1252, - 10686,2186, - 10844,32767, - 10913,4453, - 10968,3078, - 11044,1666, - 11076,3609, - 11398,2509, - 11423,5160, - 11848,1994, - 11997,2823, - 12002,3880, - 12084,7573, - 12129,3325, - 12214,5867, - 12331,1496, - 12450,4245, - 12458,2283, - 12768,901, - 12896,4741, - 12898,1811, - 12902,2569, - 12983,2959, - 13173,3331, - 13413,2059, - 13416,3734, - 13429,10641, - 13448,1148, - 13615,5340, - 13674,1425, - 13779,2332, - 13847,4264, - 13909,2657, - 13958,6488, - 14047,3085, - 14130,1648, - 14547,1915, - 14554,3684, - 14749,2739, - 14868,5017, - 14875,2216, - 14898,3197, - 14988,1085, - 15026,4246, - 15375,7971, - 15421,1446, - 15548,2462, - 15722,5920, - 15882,3449, - 15960,1782, - 15994,2863, - 16365,3977, - 16419,4754, - 16472,2162, - 17378,3101, - 17410,2550, - 17743,1339, - 17856,5485, - 17979,1982, - 17996,3628, - 18041,7110, - 18242,4381, - 18602,22207, - 19373,12827, - 19533,2777, - 19640,1678, - 19728,2272, - 19795,8861, - 20065,3275, - 20133,4881, - 20198,3947, - 20290,6128, -}; - -/*----------------------------------------------------------------------------------* - * MA predicition coefficients for gain quantizer - *----------------------------------------------------------------------------------*/ - -const Word16 pred_gain_fx[GAIN_PRED_ORDER] = { 8192, 6554, 4915, 3277 };//Q14 - -/*----------------------------------------------------------------------------------* - * 6-bit gain quantization table (only for AMR-WB IO mode) - *----------------------------------------------------------------------------------*/ - -const Word16 t_qua_gain6b_fx[64 * 2] = -{//Q14 - 1566, 1332, - 1577, 3557, - 3071, 6490, - 4193, 10163, - 4496, 2534, - 5019, 4488, - 5586, 15614, - 5725, 1422, - 6453, 580, - 6724, 6831, - 7657, 3527, - 8072, 2099, - 8232, 5319, - 8827, 8775, - 9740, 2868, - 9856, 1465, - 10087, 12488, - 10241, 4453, - 10859, 6618, - 11321, 3587, - 11417, 1800, - 11643, 2428, - 11718, 988, - 12312, 5093, - 12523, 8413, - 12574, 26214, - 12601, 3396, - 13172, 1623, - 13285, 2423, - 13418, 6087, - 13459, 12810, - 13656, 3607, - 14111, 4521, - 14144, 1229, - 14425, 1871, - 14431, 7234, - 14445, 2834, - 14628, 10036, - 14860, 17496, - 15161, 3629, - 15209, 5819, - 15299, 2256, - 15518, 4722, - 15663, 1060, - 15759, 7972, - 15939, 11964, - 16020, 2996, - 16086, 1707, - 16521, 4254, - 16576, 6224, - 16894, 2380, - 16906, 681, - 17213, 8406, - 17610, 3418, - 17895, 5269, - 18168, 11748, - 18230, 1575, - 18607, 32767, - 18728, 21684, - 19137, 2543, - 19422, 6577, - 19446, 4097, - 19450, 9056, - 20371, 14885 -}; - - -/*----------------------------------------------------------------------------------* - * 7-bit gain quantization table (only for AMR-WB IO mode) - *----------------------------------------------------------------------------------*/ - -const Word16 t_qua_gain7b_fx[128 * 2] = -{//Q14 - 204, 441, - 464, 1977, - 869, 1077, - 1072, 3062, - 1281, 4759, - 1647, 1539, - 1845, 7020, - 1853, 634, - 1995, 2336, - 2351, 15400, - 2661, 1165, - 2702, 3900, - 2710, 10133, - 3195, 1752, - 3498, 2624, - 3663, 849, - 3984, 5697, - 4214, 3399, - 4415, 1304, - 4695, 2056, - 5376, 4558, - 5386, 676, - 5518, 23554, - 5567, 7794, - 5644, 3061, - 5672, 1513, - 5957, 2338, - 6533, 1060, - 6804, 5998, - 6820, 1767, - 6937, 3837, - 7277, 414, - 7305, 2665, - 7466, 11304, - 7942, 794, - 8007, 1982, - 8007, 1366, - 8326, 3105, - 8336, 4810, - 8708, 7954, - 8989, 2279, - 9031, 1055, - 9247, 3568, - 9283, 1631, - 9654, 6311, - 9811, 2605, - 10120, 683, - 10143, 4179, - 10245, 1946, - 10335, 1218, - 10468, 9960, - 10651, 3000, - 10951, 1530, - 10969, 5290, - 11203, 2305, - 11325, 3562, - 11771, 6754, - 11839, 1849, - 11941, 4495, - 11954, 1298, - 11975, 15223, - 11977, 883, - 11986, 2842, - 12438, 2141, - 12593, 3665, - 12636, 8367, - 12658, 1594, - 12886, 2628, - 12984, 4942, - 13146, 1115, - 13224, 524, - 13341, 3163, - 13399, 1923, - 13549, 5961, - 13606, 1401, - 13655, 2399, - 13782, 3909, - 13868, 10923, - 14226, 1723, - 14232, 2939, - 14278, 7528, - 14439, 4598, - 14451, 984, - 14458, 2265, - 14792, 1403, - 14818, 3445, - 14899, 5709, - 15017, 15362, - 15048, 1946, - 15069, 2655, - 15405, 9591, - 15405, 4079, - 15570, 7183, - 15687, 2286, - 15691, 1624, - 15699, 3068, - 15772, 5149, - 15868, 1205, - 15970, 696, - 16249, 3584, - 16338, 1917, - 16424, 2560, - 16483, 4438, - 16529, 6410, - 16620, 11966, - 16839, 8780, - 17030, 3050, - 17033, 18325, - 17092, 1568, - 17123, 5197, - 17351, 2113, - 17374, 980, - 17566, 26214, - 17609, 3912, - 17639, 32767, - 18151, 7871, - 18197, 2516, - 18202, 5649, - 18679, 3283, - 18930, 1370, - 19271, 13757, - 19317, 4120, - 19460, 1973, - 19654, 10018, - 19764, 6792, - 19912, 5135, - 20040, 2841, - 21234, 19833 -}; - -/*----------------------------------------------------------------------------------* - * Quantization table for scaled innovation energy prediciton - *----------------------------------------------------------------------------------*/ - -const Word16 Es_pred_qua_5b_fx[32] = -{//Q8 - -2048, - -525, - 642, - 1688, - 2547, - 3326, - 4026, - 4647, - 5211, - 5740, - 6221, - 6661, - 7067, - 7447, - 7815, - 8170, - 8518, - 8865, - 9204, - 9551, - 9912, - 10284, - 10669, - 11077, - 11509, - 11976, - 12486, - 13049, - 13695, - 14434, - 15354, - 16640, -}; - -const Word16 Es_pred_qua_4b_fx[16] = -{//Q8 - -2048, - -36, - 1828, - 3284, - 4584, - 5742, - 6821, - 7834, - /*8779, */ - 8778, - 9701, - 10610, - 11524, - 12487, - 13560, - 14862, - 16640 -}; - -const Word16 Es_pred_qua_3b_fx[8] = -{ - 1521/* 5.9422f Q8*/, - 3909/*15.2711f Q8*/, - 5987/*23.3857f Q8*/, - 7816/*30.5310f Q8*/, - 9477/*37.0190f Q8*/, - 11124/*43.4539f Q8*/, - 12863/*50.2442f Q8*/, - 15031/*58.7164f Q8*/ -}; - -const Word16 Es_pred_qua_4b_no_ltp_fx[16] = -{ - -1280/*-5.f Q8*/, - 0/* 0.f Q8*/, - 1280/* 5.f Q8*/, - 2560/*10.f Q8*/, - 3840/*15.f Q8*/, - 5120/*20.f Q8*/, - 6400/*25.f Q8*/, - 7680/*30.f Q8*/, - 8960/*35.f Q8*/, - 10240/*40.f Q8*/, - 11520/*45.f Q8*/, - 12800/*50.f Q8*/, - 14080/*55.f Q8*/, - 15360/*60.f Q8*/, - 16640/*65.f Q8*/, - 17920/*70.f Q8*/ -}; -/*----------------------------------------------------------------------------------* - * Gain estimation constants (for gain quantizer at 7.2 and 8.0 kbps) - *----------------------------------------------------------------------------------*/ - -const Word16 b_1sfr_fx[2] = /*Q12 */ -{ - 9697, -920 -}; - -const Word16 b_2sfr_fx[4] = /*Q12 */ -{ - -1, 70, 3763, 542 -}; - -const Word16 b_3sfr_fx[6] =//Q12 -{ - -478, 110, 553, 3264, 92, 730 -}; - -const Word16 b_4sfr_fx[8] =//Q12 -{ - -381, 65, -271, 836, 3246, 34, 143, 650 -}; - -/*----------------------------------------------------------------------------------* - * Gain codebooks (for gain quantizer at 7.2 and 8.0 kbps) - *----------------------------------------------------------------------------------*/ - -const Word16 gp_gamma_3sfr_7b_fx[2 * 128] = //Q14/Q9 -{ - 141, 207, - 268, 836, - 355, 385, - 470, 124, - 944, 265, - 1202, 503, - 1308, 640, - 1384, 150, - 1399, 75, - 1534, 323, - 1835, 1252, - 1872, 216, - 2297, 443, - 2495, 122, - 2697, 358, - 2849, 181, - 2920, 274, - 2937, 552, - 3353, 2982, - 3666, 394, - 3759, 1755, - 3790, 972, - 3838, 225, - 3929, 758, - 3973, 143, - 4075, 313, - 4329, 471, - 4689, 625, - 4938, 178, - 5073, 266, - 5216, 379, - 5519, 520, - 6089, 321, - 6149, 221, - 6247, 432, - 6254, 1083, - 6556, 131, - 6751, 733, - 6773, 587, - 7140, 17402, - 7257, 366, - 7295, 269, - 7314, 483, - 8121, 204, - 8214, 1515, - 8332, 538, - 8386, 842, - 8483, 314, - 8484, 660, - 8503, 395, - 9079, 455, - 9543, 249, - 9687, 1056, - 9724, 11493, - 9727, 336, - 9862, 603, - 10141, 158, - 10278, 498, - 10347, 393, - 10380, 751, - 10899, 287, - 11239, 564, - 11377, 210, - 11389, 437, - 11531, 926, - 11565, 339, - 11594, 684, - 11635, 7228, - 12176, 509, - 12240, 1235, - 12467, 381, - 12631, 254, - 12758, 809, - 12877, 458, - 12881, 620, - 13160, 313, - 13243, 1692, - 13441, 533, - 13620, 420, - 13855, 718, - 13895, 998, - 14047, 354, - 14150, 199, - 14170, 586, - 14358, 477, - 14770, 280, - 14777, 143, - 14810, 397, - 14965, 857, - 14984, 655, - 15112, 524, - 15406, 330, - 15535, 442, - 15599, 1120, - 15635, 4946, - 15823, 582, - 15891, 736, - 16161, 374, - 16216, 229, - 16265, 493, - 16607, 638, - 16610, 2511, - 16905, 803, - 16906, 433, - 16911, 310, - 16924, 1415, - 17161, 543, - 17656, 951, - 17694, 680, - 17736, 375, - 17982, 479, - 18345, 287, - 18372, 586, - 18469, 3627, - 18649, 183, - 18898, 2002, - 18925, 403, - 18959, 712, - 19244, 857, - 19306, 245, - 19447, 1203, - 19455, 334, - 19458, 526, - 19600, 455, - 19699, 623, - 19724, 1583, - 19788, 1001, - 20031, 749, -}; - -const Word16 gp_gamma_4sfr_7b_fx[2 * 128] = /*Q14/Q9 */ -{ - 101, 174, - 228, 542, - 400, 269, - 735, 418, - 799, 111, - 1146, 802, - 1250, 345, - 1291, 1138, - 1327, 224, - 1478, 1705, - 1557, 491, - 1947, 295, - 1988, 639, - 2343, 386, - 2386, 213, - 2541, 133, - 2904, 2881, - 3198, 455, - 3204, 736, - 3219, 276, - 3463, 549, - 3709, 343, - 3741, 177, - 4431, 226, - 4480, 927, - 4516, 396, - 4547, 622, - 4900, 290, - 5011, 503, - 5601, 742, - 5616, 173, - 5688, 428, - 5975, 337, - 6196, 5865, - 6293, 253, - 6294, 580, - 6305, 1053, - 6792, 480, - 6951, 391, - 7151, 212, - 7298, 671, - 7475, 317, - 7757, 534, - 7917, 856, - 8195, 1449, - 8198, 437, - 8228, 261, - 8434, 154, - 8493, 622, - 8552, 358, - 9324, 493, - 9373, 744, - 9391, 217, - 9410, 296, - 9711, 14146, - 9711, 405, - 9724, 598, - 10128, 1140, - 10248, 8800, - 10391, 344, - 10530, 883, - 10541, 542, - 10559, 257, - 10772, 441, - 11075, 664, - 11463, 304, - 11510, 196, - 11551, 2230, - 11574, 501, - 11611, 391, - 12154, 784, - 12205, 576, - 12304, 133, - 12413, 343, - 12457, 84, - 12468, 445, - 12734, 247, - 12970, 639, - 13072, 1411, - 13142, 983, - 13159, 499, - 13356, 386, - 13460, 298, - 13838, 710, - 13850, 550, - 13930, 429, - 14446, 343, - 14449, 170, - 14511, 467, - 14530, 857, - 14697, 623, - 14770, 4569, - 14833, 229, - 15086, 512, - 15112, 387, - 15527, 574, - 15552, 1126, - 15573, 764, - 15662, 291, - 15677, 442, - 16056, 648, - 16200, 508, - 16322, 369, - 16719, 586, - 16832, 936, - 16835, 450, - 16969, 702, - 17188, 315, - 17425, 538, - 17680, 395, - 17808, 209, - 17855, 791, - 18054, 1861, - 18122, 471, - 18273, 632, - 18425, 3478, - 18630, 1239, - 18947, 143, - 18948, 2576, - 19051, 264, - 19068, 349, - 19112, 502, - 19303, 1530, - 19502, 836, - 19558, 422, - 19571, 692, - 19667, 1014, - 19685, 569 -}; - -const Word16 gp_gamma_1sfr_8b_fx[2 * 256] = /*Q14/Q9 */ -{ - 305, 152, - 333, 37, - 352, 556, - 573, 82, - 652, 12, - 694, 207, - 808, 389, - 915, 776, - 986, 1089, - 987, 1583, - 1055, 60, - 1202, 2779, - 1205, 20, - 1346, 127, - 1432, 332, - 1689, 6554, - 1715, 261, - 1820, 49, - 2041, 698, - 2179, 4032, - 2199, 100, - 2272, 1303, - 2317, 461, - 2340, 175, - 2562, 26, - 2574, 14814, - 2657, 2101, - 2732, 66, - 2818, 9, - 2836, 296, - 2929, 938, - 3479, 130, - 3510, 220, - 3651, 3154, - 3667, 717, - 3720, 384, - 3783, 530, - 3811, 10744, - 3883, 5385, - 3941, 1609, - 3964, 46, - 4120, 80, - 4402, 15, - 4440, 1181, - 4485, 173, - 4740, 311, - 4848, 31, - 5125, 7642, - 5147, 110, - 5167, 908, - 5237, 252, - 5323, 623, - 5376, 2514, - 5590, 7, - 5595, 4475, - 5634, 64, - 5654, 461, - 5822, 22, - 5893, 140, - 5905, 1810, - 6177, 367, - 6268, 201, - 6352, 1092, - 6567, 752, - 6626, 50, - 6734, 95, - 6758, 295, - 6882, 3085, - 6962, 1363, - 7274, 540, - 7413, 166, - 7635, 2120, - 7642, 38, - 7671, 393, - 7730, 227, - 7860, 75, - 7980, 115, - 8011, 955, - 8092, 3687, - 8120, 17, - 8146, 5902, - 8453, 672, - 8524, 1602, - 8583, 58, - 8679, 275, - 8873, 332, - 8920, 454, - 8969, 9712, - 9129, 2566, - 9159, 196, - 9193, 1127, - 9219, 142, - 9300, 9, - 9302, 828, - 9409, 91, - 9736, 26, - 9872, 574, - 10066, 246, - 10131, 1352, - 10154, 1971, - 10196, 399, - 10238, 15785, - 10255, 4254, - 10401, 67, - 10439, 43, - 10511, 116, - 10531, 7399, - 10706, 998, - 10798, 722, - 10845, 171, - 10848, 304, - 10876, 2981, - 11069, 28204, - 11139, 507, - 11280, 12, - 11427, 388, - 11459, 214, - 11647, 1174, - 11710, 5061, - 11742, 1614, - 11793, 806, - 11816, 82, - 11890, 132, - 11996, 2301, - 12000, 603, - 12060, 55, - 12232, 256, - 12299, 33, - 12438, 338, - 12452, 458, - 12627, 3563, - 12646, 9489, - 12665, 934, - 12801, 1329, - 12802, 190, - 12877, 683, - 12941, 103, - 13038, 1890, - 13209, 6209, - 13222, 12674, - 13318, 21, - 13374, 283, - 13385, 149, - 13391, 383, - 13453, 545, - 13564, 1064, - 13596, 2561, - 13771, 810, - 13834, 1481, - 13874, 69, - 14027, 226, - 14093, 4429, - 14147, 7, - 14171, 609, - 14185, 47, - 14223, 3051, - 14273, 434, - 14321, 314, - 14415, 120, - 14443, 1252, - 14500, 173, - 14557, 933, - 14616, 1696, - 14639, 8229, - 14724, 89, - 14837, 703, - 14902, 2072, - 14917, 366, - 15000, 487, - 15009, 30, - 15095, 256, - 15138, 1119, - 15228, 3580, - 15371, 1386, - 15387, 5525, - 15398, 17932, - 15462, 149, - 15471, 791, - 15551, 569, - 15554, 2467, - 15559, 201, - 15616, 14, - 15664, 319, - 15798, 401, - 15811, 974, - 15874, 41, - 15929, 1649, - 15945, 79, - 16046, 111, - 16225, 647, - 16230, 1240, - 16297, 4110, - 16328, 10499, - 16331, 278, - 16355, 3003, - 16383, 455, - 16404, 169, - 16435, 2172, - 16438, 850, - 16745, 7090, - 16776, 354, - 16801, 1063, - 16803, 62, - 16812, 223, - 16927, 530, - 16951, 721, - 17039, 1447, - 17208, 1837, - 17233, 135, - 17371, 4642, - 17570, 406, - 17608, 267, - 17696, 906, - 17702, 2529, - 17705, 23239, - 17709, 1209, - 17745, 592, - 17800, 92, - 17858, 35, - 17860, 3360, - 17866, 9, - 17978, 184, - 18035, 321, - 18255, 754, - 18274, 480, - 18320, 18, - 18406, 55, - 18582, 13017, - 18677, 1516, - 18726, 1998, - 18904, 25, - 18914, 6103, - 19020, 8567, - 19022, 1116, - 19025, 349, - 19147, 239, - 19224, 604, - 19251, 160, - 19270, 4870, - 19358, 3789, - 19394, 126, - 19394, 103, - 19433, 72, - 19444, 46, - 19448, 2842, - 19489, 430, - 19575, 815, - 19628, 1306, - 19631, 972, - 19637, 202, - 19642, 289, - 19660, 527, - 19717, 1697, - 19731, 2263, - 19754, 676, - 19854, 382, -}; - -const Word16 gp_gamma_1sfr_7b_fx[2 * 128] = /*Q14/Q9 */ -{ - 350, 85, - 428, 24, - 438, 681, - 642, 195, - 1071, 2012, - 1080, 402, - 1148, 1236, - 1159, 62, - 1424, 12, - 1662, 134, - 1985, 299, - 2100, 34, - 2163, 3168, - 2219, 538, - 2393, 6580, - 2499, 967, - 2882, 221, - 2974, 12743, - 3251, 98, - 3294, 51, - 3586, 1560, - 3711, 411, - 3721, 700, - 3862, 21, - 3947, 169, - 4001, 2249, - 4198, 4632, - 4372, 8, - 4993, 70, - 5022, 265, - 5568, 1194, - 5664, 495, - 5698, 115, - 5885, 854, - 6115, 2990, - 6266, 153, - 6376, 39, - 6432, 16, - 6601, 345, - 7108, 1957, - 7231, 660, - 7491, 202, - 7687, 93, - 8054, 3882, - 8108, 9624, - 8186, 1424, - 8243, 59, - 8354, 935, - 8358, 6401, - 8383, 439, - 8794, 285, - 8940, 124, - 9643, 25, - 9643, 581, - 9670, 2709, - 10065, 160, - 10218, 9, - 10240, 1728, - 10249, 80, - 10418, 1113, - 10497, 373, - 10650, 236, - 11095, 44, - 11095, 756, - 11284, 4978, - 11290, 16722, - 11815, 2299, - 11882, 482, - 12059, 114, - 12332, 8550, - 12363, 1394, - 12392, 186, - 12517, 336, - 12549, 3413, - 12694, 953, - 13096, 614, - 13185, 71, - 13247, 262, - 13479, 1914, - 13791, 14, - 13805, 30, - 14064, 138, - 14182, 420, - 14212, 1175, - 14477, 765, - 14605, 2745, - 14612, 6324, - 14730, 4199, - 14833, 301, - 14842, 203, - 14910, 12790, - 15171, 100, - 15191, 1625, - 15289, 532, - 15405, 52, - 15550, 985, - 16096, 357, - 16175, 2113, - 16284, 232, - 16333, 669, - 16363, 22999, - 16396, 156, - 16443, 1270, - 16455, 3482, - 16543, 8, - 16650, 5425, - 16878, 452, - 16989, 84, - 17024, 9676, - 17194, 876, - 17730, 20, - 17780, 1442, - 17864, 38, - 17874, 254, - 17929, 526, - 18011, 2403, - 18751, 7153, - 18786, 117, - 18820, 4420, - 19002, 63, - 19099, 401, - 19111, 183, - 19197, 776, - 19202, 2953, - 19236, 1052, - 19255, 301, - 19354, 1760, - 19432, 593, -}; - -const Word16 gp_gamma_1sfr_6b_fx[2 * 64] = /*Q14/Q9 */ -{ - 436, 182, - 473, 63, - 962, 16, - 992, 647, - 1258, 1582, - 1447, 351, - 1711, 125, - 1809, 46, - 2569, 4173, - 2607, 957, - 2826, 251, - 2904, 12481, - 3248, 26, - 3594, 2254, - 3664, 78, - 3715, 483, - 4232, 8, - 4681, 188, - 5066, 6623, - 5232, 1273, - 6232, 695, - 6234, 49, - 6238, 113, - 6312, 318, - 7012, 17, - 7327, 3183, - 8008, 1739, - 8692, 446, - 8769, 163, - 8923, 1019, - 9094, 81, - 10358, 286, - 10491, 28, - 10612, 9788, - 10715, 760, - 11045, 4822, - 11319, 2403, - 11684, 56, - 12314, 108, - 12460, 556, - 12580, 9, - 12716, 213, - 12821, 1336, - 14202, 374, - 14325, 16971, - 14612, 838, - 14625, 3285, - 14668, 6231, - 14919, 39, - 15131, 137, - 15476, 1847, - 16056, 255, - 16277, 494, - 16290, 66, - 16582, 1048, - 16859, 17, - 17220, 8723, - 17443, 4295, - 18069, 2499, - 18212, 176, - 18499, 91, - 18517, 1445, - 18522, 332, - 18596, 663, -}; - -const Word16 gp_gamma_2sfr_7b_fx[2 * 128] = /*Q14/Q9 */ -{ - 99, 1224, - 156, 243, - 168, 579, - 290, 355, - 437, 441, - 475, 187, - 734, 738, - 930, 93, - 1133, 153, - 1136, 298, - 1490, 508, - 1946, 401, - 1978, 16790, - 2098, 224, - 2117, 962, - 2407, 119, - 2686, 339, - 2929, 555, - 3404, 271, - 3465, 171, - 3469, 422, - 3714, 663, - 4436, 494, - 4494, 332, - 4571, 220, - 4583, 2182, - 4997, 848, - 5346, 380, - 5419, 108, - 5570, 579, - 5758, 266, - 5875, 442, - 5927, 170, - 6204, 3338, - 6394, 6435, - 6515, 328, - 6638, 730, - 6687, 1472, - 7045, 1056, - 7101, 498, - 7123, 210, - 7163, 9668, - 7345, 386, - 7598, 280, - 7853, 627, - 8462, 442, - 8648, 331, - 8822, 236, - 8887, 551, - 8953, 906, - 9317, 136, - 9587, 386, - 9651, 691, - 9796, 286, - 9852, 489, - 10005, 1215, - 10041, 192, - 10623, 576, - 10758, 329, - 10840, 425, - 10944, 792, - 11038, 257, - 11190, 1870, - 11541, 501, - 11729, 642, - 11873, 367, - 12064, 163, - 12332, 216, - 12339, 1100, - 12339, 295, - 12478, 444, - 12561, 568, - 12665, 845, - 13257, 396, - 13317, 677, - 13411, 511, - 13709, 324, - 13710, 1547, - 13711, 246, - 14054, 991, - 14112, 447, - 14246, 580, - 14355, 748, - 14394, 175, - 14453, 99, - 14604, 363, - 14887, 491, - 15074, 282, - 15110, 637, - 15242, 1292, - 15351, 413, - 15430, 843, - 15700, 541, - 15776, 204, - 15964, 335, - 15992, 688, - 16077, 453, - 16315, 4617, - 16406, 1032, - 16549, 595, - 16666, 384, - 16850, 776, - 16851, 482, - 16916, 253, - 17234, 309, - 17307, 2128, - 17469, 546, - 17666, 643, - 17699, 421, - 17852, 882, - 17870, 146, - 18146, 1244, - 18457, 489, - 18478, 346, - 18588, 723, - 18826, 208, - 19011, 1731, - 19042, 586, - 19286, 281, - 19428, 944, - 19446, 382, - 19555, 444, - 19689, 792, - 19755, 1111, - 19762, 527, - 19769, 1405, - 19774, 657, - 19780, 2675, -}; - -const Word16 gp_gamma_2sfr_6b_fx[2 * 64] = /*Q14/Q9 */ -{ - 185, 306, - 435, 519, - 458, 145, - 1000, 211, - 1217, 394, - 1241, 751, - 1788, 93, - 2026, 1234, - 2162, 265, - 2397, 158, - 2617, 472, - 3324, 340, - 3391, 623, - 3835, 207, - 4503, 17210, - 4628, 407, - 4939, 897, - 5102, 275, - 5300, 120, - 5560, 511, - 6309, 1909, - 6571, 335, - 6770, 205, - 6990, 642, - 7085, 5087, - 7500, 428, - 8357, 827, - 8452, 261, - 9079, 537, - 9289, 354, - 9854, 1176, - 9864, 165, - 10436, 8580, - 10549, 437, - 10615, 677, - 11010, 282, - 11940, 530, - 12183, 367, - 12475, 920, - 12865, 225, - 13359, 618, - 13431, 441, - 13521, 1623, - 14177, 341, - 14299, 130, - 14452, 775, - 14799, 508, - 15250, 276, - 15715, 1130, - 15757, 660, - 15879, 422, - 16355, 3256, - 16439, 187, - 16751, 562, - 16906, 331, - 17178, 827, - 17889, 471, - 18219, 2175, - 18786, 248, - 18985, 1354, - 19067, 703, - 19220, 384, - 19349, 954, - 19422, 553, -}; -const Word16 gp_gamma_3sfr_6b_fx[2 * 64] = /*Q14/Q9 */ -{ - 195, 150, - 817, 288, - 1152, 616, - 1366, 188, - 1377, 410, - 1526, 902, - 1570, 98, - 2258, 238, - 2489, 518, - 2935, 338, - 3142, 161, - 3456, 1705, - 3990, 432, - 4159, 709, - 4187, 270, - 4374, 1236, - 5283, 526, - 5431, 131, - 5507, 356, - 5762, 211, - 6792, 620, - 6842, 446, - 6969, 304, - 7671, 807, - 8362, 245, - 8448, 530, - 8610, 380, - 9314, 1088, - 9828, 170, - 9921, 7010, - 10026, 459, - 10193, 312, - 10261, 658, - 11554, 394, - 11739, 882, - 11791, 542, - 11985, 4329, - 11996, 246, - 12762, 13441, - 12844, 1512, - 13131, 465, - 13135, 339, - 13215, 740, - 14138, 608, - 14524, 417, - 14780, 1030, - 14823, 283, - 15016, 171, - 15264, 527, - 15823, 2706, - 15943, 699, - 15959, 360, - 16350, 473, - 17211, 573, - 17366, 901, - 17517, 238, - 17799, 414, - 18069, 1415, - 18630, 1920, - 18887, 634, - 19018, 318, - 19304, 495, - 19400, 1114, - 19413, 767, -}; - - -const Word16 gp_gamma_4sfr_6b_fx[2 * 64] = /*Q14/Q9 */ -{ - 153, 141, - 282, 501, - 399, 239, - 783, 369, - 1110, 744, - 1430, 183, - 1440, 1748, - 1524, 1091, - 1602, 296, - 1828, 99, - 2000, 439, - 2678, 228, - 2815, 600, - 3084, 347, - 3861, 477, - 4154, 163, - 4214, 285, - 4428, 733, - 4976, 384, - 5482, 566, - 5552, 234, - 6158, 929, - 6536, 470, - 6560, 326, - 7288, 173, - 7429, 663, - 7447, 10616, - 7871, 407, - 8457, 266, - 8559, 550, - 8679, 1421, - 9457, 356, - 9533, 785, - 9854, 471, - 10584, 5781, - 10792, 3815, - 10813, 206, - 10829, 302, - 10986, 606, - 11380, 433, - 11468, 1073, - 12485, 356, - 12726, 520, - 12783, 721, - 13554, 259, - 13763, 139, - 13884, 430, - 14060, 2592, - 14266, 599, - 14332, 925, - 14997, 337, - 15355, 485, - 15526, 712, - 16440, 587, - 16504, 395, - 16626, 204, - 17228, 1287, - 17563, 805, - 17629, 517, - 18159, 1814, - 18320, 303, - 19228, 437, - 19263, 636, - 19417, 989, -}; - - - -/*----------------------------------------------------------------------------------* - * Transition coding - gain quantization table - *----------------------------------------------------------------------------------*/ -const Word16 tbl_gain_code_tc_fx[N_GAIN_CODE_TC] = /*q13 */ -{ - 2966, - 5930, - 7924, - 9712, - 11566, - 13754, - 16993, - 27280 -}; -const Word16 tbl_gain_code_tc_quant_mean[N_GAIN_CODE_TC - 1] = -{ - 4448, 6927, 8818, 10639, - 12660, 15374, 22136 -}; /* Q13 */ -/*-----------------------------------------------------------------* - * Transition coding - gain quantization table for g_trans - *-----------------------------------------------------------------*/ -const Word16 tbl_gain_trans_tc_fx[N_GAIN_TC] = -{ - 4588, 11109, 19212, 29862,/*<- Q7 -Q4 ->*/ 5536, 8184, 13115, 24000 -}; -/*-----------------------------------------------------------------* - * Transition coding - table of prototype glottal impulses - *-----------------------------------------------------------------*/ - -const Word16 Glottal_cdbk_fx[L_IMPULSE*NUM_IMPULSE] = /*Q13*/ -{ - /* impulse 0 */ - -715, -1690, -2903, -1742, -1295, -4266, - -4893, 1725, 8192, 5812, -628, -1956, - 581, 936, -81, 831, 1517, - - /* impulse 1 */ - -2168, -1356, -404, -2715, -4469, -2164, - -2180, -8058, -9140, 1163, 10343, 6677, - -1758, -2839, 377, 326, -490, - - /* impulse 2 */ - 360, 561, 4184, 2533, -3326, -2549, - 2059, -2112, -9542, -6134, 1307, 124, - -3421, -1465, 475, -886, -1262, - - /* impulse 3 */ - -1294, -715, -184, -1544, -1638, -219, - -3503, -9409, -7955, -1407, -285, -2494, - 305, 4658, 3289, 116, 1488, - - /* impulse 4 */ - 837, 2523, 2444, 2679, 5962, 6935, - -924, -9907, -7565, 643, 1350, -2577, - -2100, -277, -1546, -2279, -882, - - /* impulse 5 */ - -418, -886, -48, -494, -2368, -2060, - -1233, -5271,-10430, -6955, 3301, 7578, - 2599, -1665, -461, 735, -181, - - /* impulse 6 */ - -467, -1865, -1455, -127, -1881, -3776, - 822, 8335, 8192, 863, -2762, -375, - 757, -558, -285, 653, 150, - - /* impulse 7 */ - 1087, 471, -618, 706, 1546, -1605, - -3256, 2396, 8060, 5189, -99, -37, - 1105, -668, -1434, -59, -81 -}; - -/*----------------------------------------------------------------------------------* - * AMR-WB IO WB BWE - deemphasis - *----------------------------------------------------------------------------------*/ -const Word16 deem_tab_fx[56] = -{//Q15 - 20668, 20625, 20583, 20541, 20501, 20462, 20423, 20385, - 20348, 20313, 20277, 20243, 20210, 20177, 20146, 20115, - 20085, 20055, 20027, 19999, 19972, 19946, 19921, 19896, - 19873, 19850, 19827, 19806, 19785, 19766, 19746, 19728, - 19710, 19693, 19677, 19662, 19647, 19633, 19620, 19607, - 19596, 19585, 19574, 19565, 19556, 19548, 19540, 19533, - 19527, 19522, 19518, 19514, 19510, 19508, 19506, 19505 -}; - - -const Word16 filt_hp_fx[56] = -{//Q15 - 53, 153, 274, 415, 578, 765, 978, 1217, 1483, 1778, 2102, - 2457, 2843, 3261, 3710, 4192, 4706, 5252, 5829, 6438, 7077, - 7746, 8443, 9168, 9918, 10693, 11489, 12306, 13141, 13992, - 14856, 15732, 16615, 17504, 18395, 19287, 20174, 21056, 21928, - 22787, 23631, 24456, 25260, 26039, 26791, 27512, 28201, 28853, - 29468, 30043, 30574, 31061, 31502, 31894, 32237, 32529 -}; - -/* table of values exp(-j*w*i) */ - -const Word16 exp_tab_q_fx[34] = /*Q14 */ -{ - 16384, -16068, 15137, -13622, - 11585, -9101, 6270, -3195, - 0, 3196, -6269, 9102, - -11584, 13623, -15136, 16069, - -16383, 0, -3195, 6270, - -9101, 11585, -13622, 15137, - -16068, 16384, -16068, 15137, - -13622, 11585, -9101, 6270, - -3195, 0 -}; - - -const Word16 exp_tab_p_fx[34] = /*Q14 */ -{ - 16384, -11584, 0, 11585, - -16383, 11585, 0, -11584, - 16384, -11584, 0, 11585, - -16383, 11585, 0, -11584, - 16384, 0, -11584, 16384, - -11584, 0, 11585, -16383, - 11585, 0, -11584, 16384, - -11584, 0, 11585, -16383, - 11585, 0 -}; -/* gains for 23k85 mode */ - -const Word16 HP_gain_fx[16] = -{//Q15 - 3624, 4673, 5597, 6479, 7425, 8378, 9324, 10264, - 11210, 12206, 13391, 14844, 16770, 19655, 24289, 32728 -}; -/* band-pass 6-8kHz filter */ - -const Word16 fir_6k_7k_fx[31] = -{//Q15 - -32, 47, 32, -27, -369, - 1122, -1421, 0, 3798, -8880, - 12349, -10984, 3548, 7766, -18001, - 22118, -18001, 7766, 3548, -10984, - 12349, -8880, 3798, 0, -1421, - 1122, -369, -27, 32, 47, - -32 -}; -const Word16 no_lead_fx[][MAX_NO_SCALES * 2] = -{//Q0 - { 1, 0, 0, 1, 0, 0, }, /* 14 */ - { 2, 0, 0, 1, 0, 0, }, /* 15 */ - { 4, 2, 0, 1, 0, 0, }, /* 18 */ - { 4, 2, 0, 2, 0, 0, }, /* 19 */ - { 7, 5, 2, 5, 4, 2, }, /* 25 */ - { 8, 8, 3, 8, 6, 2, }, /* 28 */ /* mode UV WB*/ - { 4, 2, 0, 1, 0, 0, }, /* 18 */ - { 4, 0, 0, 2, 1, 0, }, /* 19 */ - { 9, 8, 8, 2, 2, 1, }, /* 24 */ - { 8, 5, 2, 5, 2, 1, }, /* 25 */ - { 18, 16, 8, 5, 5, 1, }, /* 29 */ - { 24, 21, 10, 8, 8, 2, }, /* 32 */ /* mode UV NB*/ - - { 2, 0, 0, 2, 0, 0, }, /* 17 */ - { 4, 2, 0, 1, 0, 0, }, /* 18 */ - { 7, 5, 2, 2, 0, 0, }, /* 21 */ - { 5, 2, 1, 4, 1, 0, }, /* 22 */ - { 8, 5, 2, 5, 2, 0, }, /* 25 */ - { 8, 7, 4, 5, 3, 2, }, - { 8, 8, 4, 6, 5, 2, }, - { 13, 8, 5, 6, 5, 2, }, - { 13, 8, 5, 8, 6, 2, }, - { 13, 8, 5, 11, 8, 2, }, /* 30 */ - { 24, 21, 8, 9, 8, 2, }, /* 32 */ - { 23, 18, 8, 13, 11, 3, }, - { 23, 21, 8, 17, 13, 4, }, /* 34 */ - { 31, 31, 17, 26, 25, 9, }, /* 37 */ /* mode V WB*/ - { 2, 0, 0, 2, 2, 0, }, /* 17 */ - { 4, 2, 0, 1, 0, 0, }, /* 18 */ - { 7, 5, 2, 2, 2, 0, }, /* 22 */ - { 8, 7, 2, 2, 2, 0, }, /* 23 */ - { 11, 8, 2, 2, 2, 0, }, /* 24 */ - { 13, 13, 9, 2, 2, 0, }, /* 25 */ - { 13, 11, 7, 5, 2, 0, }, /* 27 */ - { 18, 14, 9, 5, 5, 2, }, /* 29 */ - { 31, 31, 14, 11, 11, 5, }, /* 34 */ - { 31, 31, 27, 24, 21, 14, }, /* 37 */ /* mode V NB */ - { 5, 4, 0, 0, 0, 0, }, /* 12 (11.883) */ - { 2, 0, 0, 2, 0, 0, }, /* 16 (15.826) */ - { 4, 2, 0, 2, 0, 0, }, /* 19 (18.572) */ - { 5, 4, 0, 2, 0, 0, }, /* 20 (19.796) */ - { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ - { 8, 7, 2, 2, 0, 0, }, /* 22 (21.776) */ - { 5, 5, 2, 4, 2, 0, }, /* 23 (22.959) */ - { 8, 8, 5, 4, 2, 0, }, /* 25 (24.992) */ - { 8, 8, 7, 5, 2, 0, }, /* 26 (25.904) */ - { 13, 9, 8, 5, 2, 0, }, /* 27 (26.829) */ - { 13, 11, 8, 5, 5, 1, }, /* 28 (27.989) */ - { 13, 9, 8, 8, 5, 2, }, /* 29 (28.984) */ - { 22, 16, 10, 6, 5, 2, }, /* 30 (29.980) */ - { 21, 14, 10, 8, 7, 2, }, /* 31 (30.966) */ - { 24, 21, 10, 8, 8, 2, }, /* 32 (31.995) */ /* G WB*/ - - { 5, 4, 1, 0, 0, 0, }, /* 12 (11.925) */ - { 2, 0, 0, 2, 0, 0, }, /* 16 (15.826) */ - { 5, 4, 1, 1, 0, 0, }, /* 19 (18.745) */ - { 5, 4, 1, 2, 0, 0, }, /* 20 (19.838) */ - { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ - { 8, 5, 2, 2, 1, 0, }, /* 22 (21.985) */ - { 9, 8, 5, 2, 1, 0, }, /* 23 (22.815) */ - { 14, 13, 8, 2, 2, 0, }, /* 25 (24.996) */ - { 13, 8, 7, 4, 2, 0, }, /* 26 (25.993) */ - { 13, 9, 8, 5, 2, 2, }, /* 27 (26.954) */ - { 18, 13, 8, 5, 2, 2, }, /* 28 (27.992) */ - { 21, 13, 11, 5, 3, 2, }, /* 29 (28.996) */ - { 22, 21, 13, 5, 5, 2, }, /* 30 (29.988) */ - { 23, 21, 17, 7, 5, 2, }, /* 31 (30.962) */ - { 27, 23, 21, 8, 5, 2, }, /* 32 (31.987) */ /* G NB*/ - { 2, 0, 0, 2, 0, 0, }, /* 17 */ - { 4, 2, 0, 1, 0, 0, }, /* 18 */ - { 4, 1, 0, 4, 0, 0, }, /* 21 */ - { 5, 2, 0, 4, 1, 0, }, /* 22 */ - { 8, 5, 2, 4, 0, 0, }, /* 24 */ - { 8, 5, 2, 5, 2, 0, }, /* 25 */ - { 14, 10, 5, 5, 5, 1, }, /* 28 */ - { 14, 10, 5, 8, 8, 4, }, /* 30 */ - { 13, 10, 5, 13, 8, 8, }, - { 23, 21, 8, 8, 8, 4, }, - { 23, 18, 5, 13, 8, 8, }, /* 33 */ - /* mode T WB */ - { 2, 0, 0, 2, 2, 0, }, /* 17 */ - { 4, 2, 0, 1, 0, 0, }, /* 18 */ - { 7, 5, 2, 2, 2, 0, }, /* 22 */ - { 8, 7, 4, 2, 2, 0, }, /* 23 */ - { 11, 8, 5, 2, 2, 0, }, /* 24 */ - { 18, 8, 5, 2, 2, 0, }, /* 25 */ - { 16, 8, 5, 5, 5, 2, }, /* 28 */ - { 28, 23, 8, 5, 5, 5, }, /* 31 */ - { 31, 31, 8, 5, 5, 7, }, /* 32 */ /* mode T NB */ - - { 18, 18, 11, 9, 6, 5, }, /* 31 */ - { 24, 23, 13, 9, 6, 5, }, /* 32 */ /* mode G 16k */ - - { 24, 23, 13, 9, 6, 5, }, /* 32 (31.998) */ - { 36, 31, 18, 9, 6, 5, }, /* 33 (32.983) */ /* T 16k */ - - { 2, 0, 0, 2, 2, 0, }, /* 17 */ - { 7, 5, 2, 2, 0, 0, }, /* 21 */ - { 7, 5, 2, 2, 2, 0, }, /* 22 */ - { 9, 8, 3, 4, 2, 0, }, /* 25 */ - { 11, 9, 8, 4, 2, 0, }, /* 26 */ - { 48, 48, 34, 13, 11, 9 }, /* 36 */ /* mode AUDIO_WB 36 + 4 + 1 */ - - { 22, 10, 3, 0, 0, 0 }, /* 17 */ - { 6, 6, 2, 2, 0, 0 }, /* 21 */ - { 6, 6, 2, 2, 2, 0 }, /* 22 */ - { 23, 10, 3, 2, 2, 0 }, /* 26 */ - { 32, 16, 3, 2, 2, 0 }, /* 27 */ /* AUDIO_NB */ - { 39, 30, 12, 2, 2, 0 }, /* 28 */ /* AUDIO_NB */ - { 11, 9, 8, 4, 2, 0, }, /* 26 */ - { 48, 48, 48, 13, 9, 8 }, /* 36 */ /* mode AUDIO_WB 16k 15-36 + 4 + 1*/ - { 8, 7, 2, 2, 0, 0, }, /* 22 (21.776) */ - { 13, 13, 5, 5, 5, 0, }, /* 28 (27.994) */ - { 18, 17, 5, 5, 5, 1, }, /* 29 (28.996) */ - { 17, 13, 5, 8, 6, 2, }, /* 30 (29.991) */ - { 23, 21, 8, 9, 8, 3, }, /* 32 (31.992) */ - { 31, 29, 16, 8, 8, 3, }, /* 33 (32.993) */ - { 31, 25, 16, 12, 8, 8, }, /* 34 (33.968) */ - { 46, 48, 18, 18, 18, 12, }, /* 37 (36.995) */ /* VOICED 16k */ - { 14, 12, 9, 2, 2, 0, }, /* 25 (24.980) */ - { 15, 13, 3, 2, 2, 0, }, /* 25 (24.974) */ - { 17, 3, 0, 2, 2, 1, }, /* 25 (24.852) */ - { 13, 10, 3, 2, 2, 2, }, /* 25 (24.994) */ - { 14, 13, 8, 2, 2, 0, }, /* 25 (24.996) */ - { 7, 3, 0, 5, 3, 1, }, /* 25 (24.671) */ - { 4, 3, 2, 6, 6, 5, }, /* 25 (24.936) */ - { 4, 2, 0, 9, 9, 3, }, /* 25 (24.955) */ - { 4, 2, 0, 9, 8, 2, }, /* 25 (24.853) */ - { 4, 2, 0, 9, 7, 6, }, /* 25 (24.881) */ - { 6, 3, 0, 6, 3, 2, }, /* 25 (24.939) */ - { 3, 2, 0, 9, 8, 5, }, /* 25 (24.996) */ - { 2, 2, 0, 15, 3, 3, }, /* 25 (24.310) */ - { 4, 2, 0, 9, 9, 3, }, /* 25 (24.955) */ - { 4, 4, 2, 7, 6, 3, }, /* 25 (24.984) */ - { 3, 2, 0, 9, 7, 6, }, /* 25 (24.866) */ - -}; - -const Word16 no_lead_p_fx[][MAX_NO_SCALES * 2] = // Q0 -{ - - { 2, 1, 0, 0, 0, 0, }, /* 9 (8.464) */ - { 4, 2, 0, 2, 0, 0, }, /* 19 (18.572) */ - { 5, 5, 2, 4, 2, 0, }, /* 23 (22.959) */ - { 8, 5, 2, 4, 0, 0, }, /* 24 (23.949) */ - { 8, 8, 5, 4, 2, 0, }, /* 25 (24.992) */ - { 13, 11, 5, 5, 2, 0, }, /* 27 (26.902) */ - { 11, 10, 5, 6, 5, 2, }, /* 28 (27.996) */ - { 14, 13, 5, 7, 5, 2, }, /* 29 (28.937) */ - { 16, 13, 5, 8, 7, 2, }, /* 30 (29.954) */ - { 21, 21, 5, 8, 5, 2, }, /* 31 (30.978) */ - { 24, 21, 5, 8, 8, 4, }, /* 32 (31.978) */ - { 32, 23, 5, 13, 11, 5, }, /* 34 (33.975) */ - { 36, 31, 8, 16, 13, 5, }, /* 35 (34.975) */ - { 45, 35, 16, 18, 13, 5, }, /* 36 (35.889) */ - { 45, 35, 16, 38, 31, 8, }, /* 39 (38.488) */ /* V WB*/ /* 14 */ - - { 2, 0, 0, 0, 0, 0, }, /* 8 (7.913) */ - { 4, 2, 0, 2, 0, 0, }, /* 19 (18.572) */ - { 8, 7, 2, 2, 2, 0, }, /* 23 (22.773) */ - { 13, 11, 5, 2, 1, 0, }, /* 24 (23.999) */ - { 8, 8, 5, 4, 2, 0, }, /* 25 (24.992) */ - { 13, 11, 5, 5, 2, 1, }, /* 27 (26.962) */ - { 13, 11, 5, 5, 5, 2, }, /* 28 (27.835) */ - { 14, 13, 5, 7, 5, 2, }, /* 29 (28.937) */ - { 23, 21, 5, 5, 5, 2, }, /* 30 (29.969) */ - { 23, 18, 5, 8, 5, 2, }, /* 31 (30.952) */ - { 24, 21, 5, 8, 8, 4, }, /* 32 (31.978) */ - { 43, 41, 13, 9, 8, 5, }, /* 34 (33.992) */ - { 43, 36, 13, 13, 10, 5, }, /* 35 (35.000) */ - { 43, 40, 13, 17, 13, 9, }, /* 36 (35.980) */ - { 43, 42, 13, 31, 30, 18, }, /* 39 (38.512) */ /* V NB*/ /* 29 */ - - { 2, 0, 0, 1, 0, 0, }, /* 15 (14.733) */ - { 5, 4, 1, 1, 0, 0, }, /* 19 (18.745) */ - { 8, 7, 2, 2, 0, 0, }, /* 22 (21.776) */ - { 10, 9, 5, 2, 0, 0, }, /* 23 (22.791) */ - { 14, 13, 8, 2, 0, 0, }, /* 24 (23.999) */ - { 14, 13, 8, 2, 2, 0, }, /* 25 (24.996) */ - { 18, 17, 13, 2, 2, 0, }, /* 26 (25.934) */ - { 14, 13, 8, 5, 4, 0, }, /* 28 (27.969) */ - { 18, 17, 13, 5, 4, 2, }, /* 29 (28.996) */ - { 22, 21, 13, 5, 5, 2, }, /* 30 (29.988) */ - { 31, 23, 21, 5, 5, 2, }, /* 31 (30.931) */ - { 27, 23, 21, 8, 5, 2, }, /* 32 (31.987) */ - { 31, 23, 21, 9, 8, 5, }, /* 33 (32.982) */ - { 32, 31, 24, 11, 8, 5, }, /* 34 (33.967) */ - { 32, 32, 28, 13, 11, 8, }, /* 35 (34.994) */ /* G WB*/ /* 44 */ - - { 2, 0, 0, 1, 0, 0, }, /* 15 (14.733) */ - { 5, 4, 2, 1, 0, 0, }, /* 19 (18.792) */ - { 8, 5, 2, 2, 1, 0, }, /* 22 (21.985) */ - { 8, 7, 2, 2, 2, 0, }, /* 23 (22.773) */ - { 13, 11, 2, 2, 1, 0, }, /* 24 (23.932) */ - { 16, 13, 2, 2, 2, 0, }, /* 25 (24.955) */ - { 21, 17, 2, 2, 2, 0, }, /* 26 (25.991) */ - { 13, 12, 2, 5, 5, 2, }, /* 28 (27.979) */ - { 18, 16, 2, 5, 5, 2, }, /* 29 (28.878) */ - { 23, 21, 2, 5, 5, 2, }, /* 30 (29.954) */ - { 32, 28, 2, 5, 5, 2, }, /* 31 (30.893) */ - { 38, 31, 2, 7, 5, 2, }, /* 32 (31.963) */ - { 33, 31, 2, 8, 8, 4, }, /* 33 (32.997) */ - { 42, 31, 2, 9, 9, 8, }, /* 34 (33.986) */ - { 42, 31, 2, 13, 11, 9, }, /* 35 (34.952) */ /* G NB*/ /* 59 */ - - { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ - { 8, 8, 5, 4, 2, 0, }, /* 25 (24.992) */ - { 13, 8, 5, 4, 2, 0, }, /* 26 */ - { 13, 8, 5, 8, 6, 2, }, /* 29 */ - { 13, 8, 5, 9, 8, 5, }, /* 30 */ - { 48, 48, 48, 36, 36, 28 }, /* 40 */ /* mode 7 AUDIO_WB */ /* 65*/ - - { 7, 5, 2, 2, 0, 0 }, /* 21 */ - { 13, 13, 9, 2, 2, 0 }, /* 25 */ - { 18, 18, 9, 2, 2, 0 }, /* 26 */ - { 24, 23, 10, 5, 4, 2 }, /* 30 */ - { 31, 31, 12, 5, 5, 2 }, /* 31 */ /*AUDIO_NB */ /* 70 */ - { 43, 34, 12, 5, 5, 4 }, /* 32 */ /*AUDIO_NB */ /* 71 */ - { 13, 8, 5, 9, 8, 5, }, /* 30 */ - { 48, 48, 45, 45, 31, 25 }, /* 40 */ /* mode AUDIO_WB 16k */ /* 73*/ - - { 2, 0, 0, 2, 2, 0, }, /* 17 (16.823) */ - { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ - { 7, 5, 2, 2, 2, 0, }, /* 22 (21.907) */ - { 13, 11, 10, 2, 2, 0, }, /* 25 (24.863) */ - { 18, 18, 10, 2, 2, 0, }, /* 26 (25.921) */ - { 13, 9, 9, 5, 2, 0, }, /* 27 (26.837) */ - { 40, 28, 25, 18, 17, 2, }, /* 36 (35.998) */ /* INACTIVE NB*/ /* 80*/ - - { 18, 17, 11, 0, 0, 0, }, /* 17 (16.932) */ - { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ - { 8, 5, 2, 2, 1, 0, }, /* 22 (21.985) */ - { 13, 13, 9, 2, 2, 0, }, /* 25 (24.845) */ - { 18, 18, 12, 2, 2, 0, }, /* 26 (25.999) */ - { 23, 23, 16, 2, 2, 0, }, /* 27 (26.981) */ - { 36, 32, 24, 17, 13, 13, }, /* 36 (35.929) */ /* INACTIVE WB */ /* 87 */ - - { 2, 2, 0, 2, 0, 0, }, /* 17 (16.823) */ - { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ - { 8, 5, 2, 2, 1, 0, }, /* 22 (21.985) */ - { 13, 13, 9, 2, 2, 0, }, /* 25 (24.845) */ - { 18, 17, 13, 2, 2, 0, }, /* 26 (25.934) */ - { 23, 22, 17, 2, 2, 0, }, /* 27 (26.914) */ - { 34, 32, 24, 16, 16, 13, }, /* 36 (35.915) */ /* INACTIVE WB 16k*/ /* 94 */ - - { 4, 2, 0, 1, 0, 0, }, /* 18 (17.479) */ - { 5, 4, 0, 1, 0, 0, }, /* 19 (18.703) */ - { 8, 7, 2, 2, 0, 0, }, /* 22 (21.776) */ - { 10, 9, 5, 2, 0, 0, }, /* 23 (22.791) */ - { 15, 13, 5, 2, 0, 0, }, /* 24 (23.999) */ - { 18, 16, 8, 5, 5, 1, }, /* 29 (28.966) */ - { 42, 32, 31, 5, 5, 2, }, /* 32 (31.990) */ /* UNVOICED NB*/ /* 100 */ - - { 1, 0, 0, 1, 0, 0, }, /* 14 (13.640) */ - { 2, 0, 0, 1, 0, 0, }, /* 15 (14.733) */ - { 4, 2, 0, 1, 0, 0, }, /* 18 (17.479) */ - { 4, 2, 0, 2, 0, 0, }, /* 19 (18.572) */ - { 5, 4, 0, 2, 0, 0, }, /* 20 (19.796) */ - { 8, 8, 5, 4, 2, 0, }, /* 25 (24.992) */ - { 11, 10, 5, 6, 5, 2, }, /* 28 (27.996) */ /* UNVOICED WB */ /* 106 */ - { 9, 3, 0, 4, 0, 0, }, /* 24 (23.818) */ - { 18, 13, 10, 8, 3, 0, }, /* 30 (29.992) */ - { 24, 18, 10, 9, 3, 0, }, /* 31 (30.998) */ - { 32, 25, 10, 9, 3, 0, }, /* 32 (31.987) */ - { 42, 31, 10, 12, 3, 2, }, /* 34 (33.994) */ - { 44, 32, 27, 15, 3, 2, }, /* 35 (35.000) */ - { 44, 32, 25, 19, 3, 2, }, /* 36 (35.994) */ - { 48, 39, 32, 35, 15, 3, }, /* 39 (38.301) */ /* VOICED 16k */ - { 11, 10, 5, 4, 2, 0, }, /* 26 (25.917) */ /* 107 */ - { 23, 23, 17, 8, 7, 2, }, /* 32 (31.980) */ - { 32, 31, 18, 9, 7, 5, }, /* 33 (32.990) */ - { 31, 31, 18, 11, 9, 8, }, /* 34 (33.974) */ - { 32, 32, 20, 13, 12, 8, }, /* 35 (34.989) */ - { 32, 32, 23, 18, 17, 8, }, /* 36 (35.988) */ - { 32, 32, 23, 23, 22, 10, }, /* 37 (36.989) */ /* GENERIC 16k*/ /* 113 */ - - { 2, 0, 0, 2, 0, 0, }, /* 16 (15.826) */ /* 114 */ - { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ - { 14, 13, 8, 2, 0, 0, }, /* 24 (23.999) */ - { 8, 8, 5, 4, 2, 0, }, /* 25 (24.992) */ - { 11, 10, 5, 4, 2, 0, }, /* 26 (25.917) */ - { 16, 13, 8, 4, 2, 0, }, /* 27 (26.883) */ - { 13, 13, 8, 5, 4, 2, }, /* 28 (27.901) */ - { 23, 18, 13, 5, 5, 2, }, /* 30 (29.916) */ - { 23, 23, 13, 7, 5, 2, }, /* 31 (30.993) */ - { 23, 23, 17, 8, 7, 2, }, /* 32 (31.980) */ - { 32, 31, 24, 8, 7, 2, }, /* 33 (32.958) */ - { 42, 32, 31, 9, 9, 4, }, /* 34 (33.987) */ - { 40, 32, 29, 12, 9, 9, }, /* 35 (34.994) */ - { 40, 32, 31, 17, 11, 11, }, /* 36 (35.968) */ - { 41, 32, 31, 20, 18, 13, }, /* 37 (36.971) */ /* GENERIC 12.8k MA*/ /* 128 */ - - { 11, 10, 5, 4, 2, 0, }, /* 26 (25.917) */ /* 129 */ - { 23, 23, 17, 8, 7, 2, }, /* 32 (31.980) */ - { 31, 31, 18, 9, 8, 2, }, /* 33 (32.995) */ - { 48, 32, 24, 9, 8, 3, }, /* 34 (33.993) */ - { 48, 32, 28, 11, 10, 3, }, /* 35 (34.992) */ - { 48, 37, 32, 16, 12, 4, }, /* 36 (35.997) */ - { 48, 37, 32, 18, 17, 12, }, /* 37 (36.961) */ /* AUDIO 16k */ -}; - -/*----------------------------------------------------------------------------------* - * Enhacer - 2.0 - 6.4 kHz impulse response with phase dispersion in freq. domain - *----------------------------------------------------------------------------------*/ -const Word16 low_H[64] = /* (1Q14) */ -{ - 16388, 16380, 16386, 16381, 16382, 16382, 16381, 16383, 16385, 10265, - 10154, 9894, 14051, 16342, -531, 13216, 16372, 15509, 9406, 15948, - 4726, 14593, 10404, 9795, -16337, -1815, -10624, 12646, 14555, -12684, - 11388, 8175, 16382, -14198, 11781, 10378, 7515, 10423, -12473, 16284, - -1200, -13137, 12658, -7446, 15683, -3764, -13419, -5281, 521, -9686, - -16375, -1219, 8435, -13059, -12862, -12775, -1, 2, 0, -3, - -1, -1, -2, 1 -}; - -const Word16 low_H16k[80] = /* (1Q14) */ -{ - 16388, 16380, 16386, 16381, 16382, 16382, 16381, 16383, 16385, 10265, - 10154, 9894, 14051, 16342, -531, 13216, 16372, 15509, 9406, 15948, - 4726, 14593, 10404, 9795, -16337, -1815, -10624, 12646, 14555, -12684, - 11388, 8175, -4121, -13408, 10605, -12308, 16358, 4699, 7640, -7360, - 16382, -14639, -14494, 15695, -907, -10815, -12489, 9416, 15857, - -14198, 11781, 10378, 7515, 10423, -12473, 16284, -1200, -13137, 12658, - -7446, 15683, -3764, -13419, -5281, 521, -9686, -16375, -1219, 8435, - -13059, -12862, -12775, -1, 2, 0, -3, -1, -1, -2, 1 -}; -/*----------------------------------------------------------------------------------* - * Enhancer - 3.2 - 6.4 kHz impulse response with phase dispersion in freq. domain - *----------------------------------------------------------------------------------*/ - -const Word16 mid_H[64] = /* (1Q14) */ -{ - 16382, 16381, 16384, 16384, 16385, 16387, 16386, 16382, 16387, 16382, - 16385, 16385, 16385, 16384, 16382, 16388, 14847, 9629, 13248, 14486, - 10995, 642, 13817, 13779, 6468, 8664, 11634, 9780, -14636, -982, - 11746, -722, 16385, -16366, -11423, 16354, 7362, 13147, -11538, -13904, - -15052, -8862, 8811, -16371, -12146, 7660, -9638, -13254, -6923, 3, - -5, -2, -6, 1, 6, 5, -8, -2, 3, -5, - 0, -2, -4, 3 -}; - -const Word16 mid_H16k[80] = /* (1Q14) */ -{ - 16382, 16381, 16384, 16384, 16385, 16387, 16386, 16382, 16387, 16382, - 16385, 16385, 16385, 16384, 16382, 16388, 14847, 9629, 13248, 14486, - 10995, 642, 13817, 13779, 6468, 8664, 11634, 9780, -14636, -982, - 11746, -722, 108, -16195, -13199, -13289, 5114, 12941, 7110, 8873, - 16385, -13774, -14761, 10047, -15566, -9584, 9707, 2483, 16383, - -16366, -11423, 16354, 7362, 13147, -11538, -13904, -15052, -8862, - 8811, -16371, -12146, 7660, -9638, -13254, -6923, 3, -5, -2, -6, - 1, 6, 5, -8, -2, 3, -5, 0, -2, -4, 3 -}; - -/*-------------------------------------------------------------------* - * Low-pass FIR filter for low-freq post-filtering - * response : 0dB @ 50Hz, -6dB @ 500Hz, -45dB @ 1kHz) - * filter parameters: fs/2=8000, fc=500, gain=1.0, n=16 - *-------------------------------------------------------------------*/ - -/*-------------------------------------------------------------------* - * Bass post-filter - *-------------------------------------------------------------------*/ - -/* For bass post filter */ -const Word16 filt_lp_fx[1 + L_FILT] = -{ - 2892/*0.088250f Q15*/, 2831/*0.086410f Q15*/, 2657/*0.081074f Q15*/, 2384/*0.072768f Q15*/, - 2041/*0.062294f Q15*/, 1659/*0.050623f Q15*/, 1271/*0.038774f Q15*/, 907/*0.027692f Q15*/, - 594/*0.018130f Q15*/, 347/*0.010578f Q15*/, 171/*0.005221f Q15*/, 64/*0.001946f Q15*/, - 13/*0.000385f Q15*/ -}; - -const Word16 filt_lp_16kHz_fx[1 + L_FILT16k] = -{ - 2340/*0.071410f Q15*/, 2308/*0.070433f Q15*/, 2214/*0.067568f Q15*/, 2064/*0.062999f Q15*/, - 1868/*0.057020f Q15*/, 1639/*0.050005f Q15*/, 1389/*0.042378f Q15*/, 1133/*0.034577f Q15*/, - 885/*0.027022f Q15*/, 658/*0.020078f Q15*/, 460/*0.014031f Q15*/, 297/*0.009070f Q15*/, - 173/*0.005276f Q15*/, 86/*0.002625f Q15*/, 33/*0.000999f Q15*/, 7/*0.000205f Q15*/ -}; - -/*-------------------------------------------------------------------* - * Pulse indexing tables for ACELP innovation coding - *-------------------------------------------------------------------*/ - -const Word32 PI_select_table[23][8] = // Q0 -{ - {1, 0, 0, 0, 0, 0, 0, 0}, - {1, 1, 0, 0, 0, 0, 0, 0}, - {1, 2, 1, 0, 0, 0, 0, 0}, - {1, 3, 3, 1, 0, 0, 0, 0}, - {1, 4, 6, 4, 1, 0, 0, 0}, - {1, 5, 10, 10, 5, 1, 0, 0}, - {1, 6, 15, 20, 15, 6, 1, 0}, - {1, 7, 21, 35, 35, 21, 7, 1}, - {1, 8, 28, 56, 70, 56, 28, 8}, - {1, 9, 36, 84, 126, 126, 84, 36}, - {1, 10, 45, 120, 210, 252, 210, 120}, - {1, 11, 55, 165, 330, 462, 462, 330}, - {1, 12, 66, 220, 495, 792, 924, 792}, - {1, 13, 78, 286, 715, 1287, 1716, 1716}, - {1, 14, 91, 364, 1001, 2002, 3003, 3432}, - {1, 15, 105, 455, 1365, 3003, 5005, 6435}, - {1, 16, 120, 560, 1820, 4368, 8008, 11440}, - {1, 17, 136, 680, 2380, 6188, 12376, 19448}, - {1, 18, 153, 816, 3060, 8568, 18564, 31824}, - {1, 19, 171, 969, 3876, 11628, 27132, 50388}, - {1, 20, 190, 1140, 4845, 15504, 38760, 77520}, - {1, 21, 210, 1330, 5985, 20349, 54264, 116280}, - {1, 22, 231, 1540, 7315, 26334, 74613, 1705444} -}; - -const Word32 PI_offset[8][8] = // Q0 -{ - /* for 0p(0). */ - {0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000}, - /* for 1p(1). */ - {0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000}, - /* for 2p(2,1). */ - {0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000}, - /* for 3p(3,2,1). */ - {0x00000,0x00000,0x01180,0x01540,0x00000,0x00000,0x00000,0x00000}, - /* for 4p(4,3,2,1). */ - {0x00000,0x00000,0x071C0,0x0A640,0x0ABE0,0x00000,0x00000,0x00000}, - /* for 5p(5,4,3,2,1). */ - {0x00000,0x00000,0x22200,0x3E900,0x45200,0x45980,0x00000,0x00000}, - /* for 6p(6,5,4,3,2,1). */ - {0x00000,0x00000,0x07d200,0x127c00,0x16ed80,0x179c80,0x17a5e0,0x00000}, - /* for 7p(7,6,5,4,3,2,1). */ - {0x00000,0x00000,0x165800,0x454400,0x654200,0x6E2500,0x6F2B80,0x6F36C0} -}; - -const Word16 PI_factor[7] = {0,0,120,560,1820,4368,8008}; // Q0 - -/* ACELP pulse coding */ -const Word16 hi_to_low_tmpl[10] = { 0, 0, 0, 3, 9, 5, 3, 1, 8, 8 }; // Q0 -const UWord16 low_len[10] = { 0, 0, 8, 5, 7,11,13,15,16,16 }; // Q0 -const UWord16 low_mask[10] = { 0, 0, 255,31,127,2047,8191,32767,65535,65535 }; // Q0 -const UWord16 indx_fact[10] = { 0, 0,2,172,345,140,190,223,463,1732 }; // Q0 -const Word16 index_len[3] = { 0, 5, 9 }; // Q0 -const Word16 index_mask_ACELP[3] = { 0, 31, 511 }; // Q0 - - -/*------------------------------------------------------------------------------* - * EDCT tables - *------------------------------------------------------------------------------*/ - -//Fix -const Word16 edct_table_80_fx[80] = /*Q16 */ -{ - 21911, 21903, 21886, 21860, 21827, 21784, 21734, 21675, - 21608, 21532, 21448, 21356, 21255, 21147, 21030, 20905, - 20772, 20631, 20482, 20325, 20161, 19988, 19808, 19621, - 19425, 19222, 19012, 18795, 18570, 18338, 18099, 17853, - 17600, 17340, 17074, 16801, 16522, 16236, 15944, 15646, - 15341, 15031, 14715, 14394, 14067, 13734, 13396, 13053, - 12705, 12352, 11994, 11632, 11265, 10894, 10519, 10139, - 9756, 9369, 8978, 8584, 8186, 7786, 7382, 6975, - 6566, 6155, 5741, 5324, 4906, 4486, 4064, 3640, - 3215, 2789, 2362, 1934, 1505, 1075, 645, 215 -}; - -const Word16 edct_table_100_fx[] = -{/*Q16 */ - 20723, 20718, 20708, 20692, 20672, 20646, 20616, 20580, - 20539, 20493, 20442, 20386, 20325, 20259, 20188, 20112, - 20031, 19946, 19855, 19759, 19658, 19553, 19443, 19328, - 19208, 19083, 18954, 18820, 18681, 18538, 18390, 18238, - 18081, 17920, 17754, 17584, 17410, 17231, 17048, 16861, - 16670, 16474, 16275, 16071, 15864, 15652, 15437, 15218, - 14995, 14768, 14538, 14304, 14067, 13826, 13582, 13335, - 13084, 12830, 12573, 12312, 12049, 11783, 11513, 11241, - 10966, 10689, 10409, 10126, 9841, 9553, 9263, 8971, - 8676, 8379, 8081, 7780, 7477, 7173, 6867, 6559, - 6249, 5938, 5625, 5311, 4996, 4679, 4362, 4043, - 3723, 3403, 3081, 2759, 2436, 2112, 1788, 1464, - 1139, 814, 488, 163 -}; - -const Word16 edct_table_120_fx[120] = /*Q16 */ -{ - 19800, 19797, 19790, 19780, 19766, 19749, 19729, 19705, - 19678, 19648, 19614, 19576, 19536, 19492, 19445, 19394, - 19340, 19283, 19223, 19159, 19092, 19021, 18948, 18871, - 18791, 18708, 18621, 18531, 18438, 18342, 18243, 18141, - 18035, 17927, 17815, 17701, 17583, 17462, 17339, 17212, - 17082, 16950, 16815, 16676, 16535, 16391, 16244, 16095, - 15942, 15787, 15629, 15469, 15306, 15140, 14972, 14801, - 14628, 14452, 14273, 14092, 13909, 13723, 13535, 13345, - 13152, 12958, 12761, 12561, 12360, 12156, 11951, 11743, - 11533, 11322, 11108, 10893, 10675, 10456, 10235, 10012, - 9788, 9562, 9334, 9104, 8874, 8641, 8407, 8172, - 7935, 7697, 7457, 7217, 6975, 6732, 6487, 6242, - 5995, 5748, 5499, 5250, 4999, 4748, 4496, 4243, - 3990, 3736, 3481, 3225, 2969, 2713, 2456, 2199, - 1941, 1683, 1424, 1166, 907, 648, 389, 130 -}; - -const Word16 edct_table_320_fx[320] = /*Q16 */ -{ - 15495, 15495, 15494, 15493, 15491, 15489, 15487, 15484, - 15481, 15478, 15474, 15470, 15466, 15461, 15456, 15450, - 15444, 15438, 15431, 15424, 15417, 15409, 15401, 15392, - 15383, 15374, 15364, 15354, 15344, 15333, 15322, 15310, - 15298, 15286, 15273, 15260, 15247, 15233, 15219, 15205, - 15190, 15175, 15159, 15143, 15127, 15110, 15093, 15076, - 15058, 15040, 15021, 15002, 14983, 14964, 14944, 14924, - 14903, 14882, 14860, 14839, 14817, 14794, 14771, 14748, - 14725, 14701, 14677, 14652, 14627, 14602, 14576, 14550, - 14524, 14497, 14470, 14443, 14415, 14387, 14359, 14330, - 14301, 14271, 14242, 14212, 14181, 14150, 14119, 14088, - 14056, 14024, 13991, 13958, 13925, 13891, 13858, 13823, - 13789, 13754, 13719, 13683, 13647, 13611, 13575, 13538, - 13501, 13463, 13425, 13387, 13349, 13310, 13271, 13231, - 13192, 13152, 13111, 13071, 13030, 12988, 12947, 12905, - 12862, 12820, 12777, 12734, 12690, 12647, 12602, 12558, - 12513, 12468, 12423, 12377, 12331, 12285, 12239, 12192, - 12145, 12098, 12050, 12002, 11954, 11905, 11856, 11807, - 11758, 11708, 11658, 11608, 11557, 11507, 11455, 11404, - 11352, 11301, 11248, 11196, 11143, 11090, 11037, 10983, - 10930, 10876, 10821, 10767, 10712, 10657, 10601, 10546, - 10490, 10434, 10378, 10321, 10264, 10207, 10150, 10092, - 10034, 9976, 9918, 9859, 9800, 9741, 9682, 9623, - 9563, 9503, 9443, 9382, 9322, 9261, 9200, 9138, - 9077, 9015, 8953, 8891, 8829, 8766, 8703, 8640, - 8577, 8513, 8450, 8386, 8322, 8258, 8193, 8129, - 8064, 7999, 7933, 7868, 7802, 7737, 7671, 7604, - 7538, 7471, 7405, 7338, 7271, 7203, 7136, 7068, - 7001, 6933, 6865, 6796, 6728, 6659, 6591, 6522, - 6453, 6383, 6314, 6244, 6175, 6105, 6035, 5965, - 5895, 5824, 5754, 5683, 5612, 5541, 5470, 5399, - 5327, 5256, 5184, 5113, 5041, 4969, 4897, 4824, - 4752, 4680, 4607, 4534, 4462, 4389, 4316, 4243, - 4169, 4096, 4023, 3949, 3876, 3802, 3728, 3654, - 3580, 3506, 3432, 3358, 3284, 3209, 3135, 3060, - 2986, 2911, 2836, 2761, 2687, 2612, 2537, 2462, - 2386, 2311, 2236, 2161, 2085, 2010, 1934, 1859, - 1783, 1708, 1632, 1557, 1481, 1405, 1329, 1254, - 1178, 1102, 1026, 950, 874, 798, 722, 646, - 570, 494, 418, 342, 266, 190, 114, 38 -}; - -const Word16 edct_table_480_fx[480] = /*Q16 */ -{ - 14001, 14001, 14001, 14000, 14000, 13999, 13998, 13997, - 13996, 13995, 13993, 13991, 13990, 13988, 13986, 13983, - 13981, 13978, 13976, 13973, 13970, 13967, 13963, 13960, - 13956, 13953, 13949, 13945, 13940, 13936, 13932, 13927, - 13922, 13917, 13912, 13907, 13902, 13896, 13890, 13885, - 13879, 13872, 13866, 13860, 13853, 13846, 13840, 13833, - 13825, 13818, 13811, 13803, 13795, 13787, 13779, 13771, - 13763, 13754, 13746, 13737, 13728, 13719, 13709, 13700, - 13691, 13681, 13671, 13661, 13651, 13641, 13630, 13620, - 13609, 13598, 13587, 13576, 13565, 13553, 13542, 13530, - 13518, 13506, 13494, 13482, 13469, 13457, 13444, 13431, - 13418, 13405, 13392, 13378, 13365, 13351, 13337, 13323, - 13309, 13295, 13280, 13266, 13251, 13236, 13221, 13206, - 13191, 13175, 13160, 13144, 13128, 13112, 13096, 13080, - 13063, 13047, 13030, 13013, 12996, 12979, 12962, 12944, - 12927, 12909, 12891, 12873, 12855, 12837, 12819, 12800, - 12782, 12763, 12744, 12725, 12706, 12686, 12667, 12647, - 12628, 12608, 12588, 12568, 12547, 12527, 12506, 12486, - 12465, 12444, 12423, 12402, 12380, 12359, 12337, 12316, - 12294, 12272, 12250, 12227, 12205, 12182, 12160, 12137, - 12114, 12091, 12068, 12045, 12021, 11998, 11974, 11950, - 11926, 11902, 11878, 11854, 11829, 11804, 11780, 11755, - 11730, 11705, 11680, 11654, 11629, 11603, 11578, 11552, - 11526, 11500, 11474, 11447, 11421, 11394, 11368, 11341, - 11314, 11287, 11260, 11232, 11205, 11177, 11150, 11122, - 11094, 11066, 11038, 11010, 10981, 10953, 10924, 10895, - 10867, 10838, 10809, 10779, 10750, 10721, 10691, 10662, - 10632, 10602, 10572, 10542, 10512, 10481, 10451, 10420, - 10390, 10359, 10328, 10297, 10266, 10235, 10203, 10172, - 10140, 10109, 10077, 10045, 10013, 9981, 9949, 9917, - 9884, 9852, 9819, 9786, 9754, 9721, 9688, 9654, - 9621, 9588, 9554, 9521, 9487, 9454, 9420, 9386, - 9352, 9318, 9283, 9249, 9214, 9180, 9145, 9111, - 9076, 9041, 9006, 8971, 8935, 8900, 8865, 8829, - 8794, 8758, 8722, 8686, 8650, 8614, 8578, 8542, - 8505, 8469, 8432, 8396, 8359, 8322, 8285, 8248, - 8211, 8174, 8137, 8099, 8062, 8025, 7987, 7949, - 7912, 7874, 7836, 7798, 7760, 7721, 7683, 7645, - 7606, 7568, 7529, 7491, 7452, 7413, 7374, 7335, - 7296, 7257, 7218, 7178, 7139, 7100, 7060, 7020, - 6981, 6941, 6901, 6861, 6821, 6781, 6741, 6701, - 6661, 6620, 6580, 6539, 6499, 6458, 6418, 6377, - 6336, 6295, 6254, 6213, 6172, 6131, 6090, 6048, - 6007, 5966, 5924, 5883, 5841, 5799, 5758, 5716, - 5674, 5632, 5590, 5548, 5506, 5464, 5422, 5379, - 5337, 5295, 5252, 5210, 5167, 5124, 5082, 5039, - 4996, 4953, 4911, 4868, 4825, 4782, 4738, 4695, - 4652, 4609, 4566, 4522, 4479, 4435, 4392, 4348, - 4305, 4261, 4218, 4174, 4130, 4086, 4042, 3999, - 3955, 3911, 3867, 3823, 3778, 3734, 3690, 3646, - 3602, 3557, 3513, 3469, 3424, 3380, 3335, 3291, - 3246, 3202, 3157, 3112, 3068, 3023, 2978, 2933, - 2889, 2844, 2799, 2754, 2709, 2664, 2619, 2574, - 2529, 2484, 2439, 2394, 2349, 2303, 2258, 2213, - 2168, 2122, 2077, 2032, 1986, 1941, 1896, 1850, - 1805, 1759, 1714, 1668, 1623, 1577, 1532, 1486, - 1441, 1395, 1350, 1304, 1258, 1213, 1167, 1121, - 1076, 1030, 984, 939, 893, 847, 801, 756, - 710, 664, 618, 573, 527, 481, 435, 389, - 344, 298, 252, 206, 160, 115, 69, 23 -}; - -const Word16 edct_table_600_fx[] =/*Q16 */ -{ - 26483, 26483, 26483, 26482, 26481, 26481, 26479, 26478, - 26477, 26475, 26473, 26471, 26469, 26467, 26464, 26461, - 26459, 26455, 26452, 26449, 26445, 26441, 26437, 26433, - 26429, 26424, 26420, 26415, 26410, 26404, 26399, 26393, - 26387, 26381, 26375, 26369, 26362, 26356, 26349, 26342, - 26335, 26327, 26320, 26312, 26304, 26296, 26287, 26279, - 26270, 26261, 26252, 26243, 26234, 26224, 26214, 26204, - 26194, 26184, 26173, 26163, 26152, 26141, 26130, 26118, - 26107, 26095, 26083, 26071, 26059, 26046, 26033, 26021, - 26008, 25994, 25981, 25968, 25954, 25940, 25926, 25912, - 25897, 25883, 25868, 25853, 25838, 25823, 25807, 25791, - 25776, 25760, 25743, 25727, 25711, 25694, 25677, 25660, - 25643, 25625, 25608, 25590, 25572, 25554, 25535, 25517, - 25498, 25480, 25461, 25441, 25422, 25403, 25383, 25363, - 25343, 25323, 25302, 25282, 25261, 25240, 25219, 25198, - 25176, 25155, 25133, 25111, 25089, 25067, 25044, 25022, - 24999, 24976, 24953, 24929, 24906, 24882, 24858, 24834, - 24810, 24786, 24761, 24737, 24712, 24687, 24662, 24636, - 24611, 24585, 24559, 24533, 24507, 24481, 24454, 24427, - 24401, 24373, 24346, 24319, 24291, 24264, 24236, 24208, - 24180, 24151, 24123, 24094, 24065, 24036, 24007, 23978, - 23948, 23918, 23888, 23858, 23828, 23798, 23767, 23737, - 23706, 23675, 23644, 23612, 23581, 23549, 23518, 23486, - 23453, 23421, 23389, 23356, 23323, 23290, 23257, 23224, - 23191, 23157, 23123, 23090, 23056, 23021, 22987, 22953, - 22918, 22883, 22848, 22813, 22778, 22742, 22707, 22671, - 22635, 22599, 22563, 22526, 22490, 22453, 22416, 22379, - 22342, 22305, 22267, 22230, 22192, 22154, 22116, 22078, - 22039, 22001, 21962, 21923, 21884, 21845, 21806, 21766, - 21727, 21687, 21647, 21607, 21567, 21527, 21486, 21446, - 21405, 21364, 21323, 21282, 21241, 21199, 21157, 21116, - 21074, 21032, 20989, 20947, 20905, 20862, 20819, 20776, - 20733, 20690, 20647, 20603, 20560, 20516, 20472, 20428, - 20384, 20339, 20295, 20250, 20205, 20161, 20116, 20070, - 20025, 19980, 19934, 19888, 19842, 19796, 19750, 19704, - 19658, 19611, 19565, 19518, 19471, 19424, 19377, 19329, - 19282, 19234, 19186, 19139, 19091, 19042, 18994, 18946, - 18897, 18849, 18800, 18751, 18702, 18653, 18604, 18554, - 18505, 18455, 18405, 18355, 18305, 18255, 18205, 18154, - 18104, 18053, 18002, 17951, 17900, 17849, 17798, 17747, - 17695, 17643, 17592, 17540, 17488, 17436, 17383, 17331, - 17278, 17226, 17173, 17120, 17067, 17014, 16961, 16908, - 16854, 16801, 16747, 16693, 16640, 16586, 16531, 16477, - 16423, 16368, 16314, 16259, 16204, 16149, 16094, 16039, - 15984, 15929, 15873, 15818, 15762, 15706, 15650, 15595, - 15538, 15482, 15426, 15370, 15313, 15256, 15200, 15143, - 15086, 15029, 14972, 14914, 14857, 14800, 14742, 14684, - 14627, 14569, 14511, 14453, 14395, 14336, 14278, 14220, - 14161, 14103, 14044, 13985, 13926, 13867, 13808, 13749, - 13689, 13630, 13570, 13511, 13451, 13391, 13332, 13272, - 13212, 13151, 13091, 13031, 12971, 12910, 12849, 12789, - 12728, 12667, 12606, 12545, 12484, 12423, 12362, 12300, - 12239, 12177, 12116, 12054, 11992, 11930, 11868, 11806, - 11744, 11682, 11620, 11558, 11495, 11433, 11370, 11307, - 11245, 11182, 11119, 11056, 10993, 10930, 10867, 10803, - 10740, 10677, 10613, 10550, 10486, 10422, 10358, 10295, - 10231, 10167, 10103, 10039, 9974, 9910, 9846, 9781, - 9717, 9652, 9588, 9523, 9458, 9394, 9329, 9264, - 9199, 9134, 9069, 9003, 8938, 8873, 8808, 8742, - 8677, 8611, 8546, 8480, 8414, 8348, 8283, 8217, - 8151, 8085, 8019, 7953, 7886, 7820, 7754, 7688, - 7621, 7555, 7488, 7422, 7355, 7289, 7222, 7155, - 7088, 7022, 6955, 6888, 6821, 6754, 6687, 6620, - 6553, 6485, 6418, 6351, 6283, 6216, 6149, 6081, - 6014, 5946, 5879, 5811, 5743, 5676, 5608, 5540, - 5472, 5404, 5337, 5269, 5201, 5133, 5065, 4997, - 4928, 4860, 4792, 4724, 4656, 4587, 4519, 4451, - 4382, 4314, 4246, 4177, 4109, 4040, 3972, 3903, - 3834, 3766, 3697, 3629, 3560, 3491, 3422, 3354, - 3285, 3216, 3147, 3078, 3009, 2941, 2872, 2803, - 2734, 2665, 2596, 2527, 2458, 2389, 2320, 2251, - 2182, 2112, 2043, 1974, 1905, 1836, 1767, 1697, - 1628, 1559, 1490, 1421, 1351, 1282, 1213, 1144, - 1074, 1005, 936, 867, 797, 728, 659, 589, - 520, 451, 381, 312, 243, 173, 104, 35 -}; - -const Word16 edct_table_128_fx[128] = /*Q16 */ -{ - 19483, 19480, 19474, 19466, 19454, 19439, 19422, 19401, - 19378, 19351, 19322, 19290, 19255, 19217, 19176, 19132, - 19086, 19036, 18984, 18928, 18870, 18809, 18746, 18679, - 18610, 18537, 18462, 18385, 18304, 18221, 18135, 18046, - 17954, 17860, 17763, 17664, 17561, 17457, 17349, 17239, - 17126, 17011, 16893, 16773, 16650, 16524, 16396, 16266, - 16133, 15998, 15860, 15720, 15578, 15433, 15286, 15137, - 14985, 14831, 14675, 14516, 14356, 14193, 14028, 13861, - 13692, 13521, 13348, 13173, 12996, 12816, 12635, 12452, - 12268, 12081, 11892, 11702, 11510, 11316, 11121, 10924, - 10725, 10524, 10322, 10119, 9914, 9707, 9499, 9290, - 9079, 8867, 8653, 8438, 8222, 8005, 7786, 7566, - 7345, 7123, 6900, 6676, 6451, 6225, 5998, 5770, - 5541, 5312, 5081, 4850, 4618, 4385, 4152, 3918, - 3684, 3449, 3213, 2977, 2741, 2504, 2266, 2029, - 1791, 1552, 1314, 1075, 837, 598, 359, 120 -}; - -const Word16 edct_table_160_fx[160] = /*Q16 */ -{ - 18426, 18425, 18421, 18416, 18409, 18400, 18389, 18377, - 18362, 18346, 18329, 18309, 18288, 18265, 18240, 18214, - 18185, 18155, 18123, 18090, 18055, 18018, 17979, 17938, - 17896, 17852, 17806, 17759, 17710, 17659, 17607, 17552, - 17497, 17439, 17380, 17319, 17256, 17192, 17126, 17058, - 16989, 16918, 16846, 16772, 16696, 16619, 16540, 16459, - 16377, 16293, 16208, 16121, 16033, 15943, 15851, 15758, - 15664, 15568, 15470, 15371, 15271, 15169, 15065, 14960, - 14854, 14746, 14637, 14527, 14415, 14301, 14186, 14070, - 13953, 13834, 13714, 13592, 13469, 13345, 13220, 13093, - 12965, 12836, 12706, 12574, 12441, 12307, 12172, 12036, - 11898, 11759, 11620, 11479, 11337, 11193, 11049, 10904, - 10758, 10610, 10462, 10312, 10162, 10011, 9858, 9705, - 9551, 9395, 9239, 9082, 8925, 8766, 8606, 8446, - 8285, 8123, 7960, 7797, 7632, 7467, 7301, 7135, - 6968, 6800, 6632, 6463, 6293, 6122, 5952, 5780, - 5608, 5435, 5262, 5089, 4915, 4740, 4565, 4389, - 4214, 4037, 3861, 3684, 3506, 3328, 3150, 2972, - 2793, 2614, 2435, 2256, 2076, 1896, 1716, 1536, - 1356, 1175, 994, 814, 633, 452, 271, 90 -}; - -const Word16 edct_table_40_fx[40] = /*Q16 */ -{ - 26049, 26009, 25928, 25808, 25648, 25448, 25210, 24932, - 24616, 24262, 23870, 23442, 22977, 22477, 21943, 21375, - 20773, 20140, 19475, 18781, 18058, 17306, 16528, 15725, - 14897, 14047, 13174, 12282, 11370, 10441, 9496, 8536, - 7563, 6578, 5584, 4580, 3570, 2554, 1534, 512 -}; - -const Word16 edct_table_20_fx[20] = /*Q16 */ -{ - 30939, 30749, 30368, 29801, 29049, 28119, 27015, 25745, - 24316, 22737, 21018, 19169, 17202, 15129, 12963, 10717, - 8405, 6041, 3639, 1216 -}; - - -const Word16 edct_table_64_fx[] =/*Q16 */ -{ - 23167, 23153, 23125, 23083, 23027, 22958, 22874, 22777, - 22666, 22542, 22403, 22252, 22087, 21908, 21717, 21512, - 21295, 21064, 20821, 20565, 20297, 20017, 19725, 19420, - 19105, 18777, 18438, 18089, 17728, 17356, 16975, 16582, - 16180, 15769, 15347, 14917, 14477, 14029, 13572, 13107, - 12634, 12154, 11666, 11171, 10670, 10162, 9648, 9128, - 8603, 8072, 7537, 6997, 6453, 5905, 5353, 4798, - 4241, 3681, 3118, 2554, 1988, 1421, 853, 284 -}; - - -const Word16 edct_table_200_fx[] =/*Q16 */ -{ - 17427, 17426, 17423, 17420, 17416, 17411, 17404, 17397, - 17388, 17378, 17368, 17356, 17343, 17329, 17314, 17298, - 17281, 17262, 17243, 17223, 17201, 17179, 17155, 17131, - 17105, 17079, 17051, 17022, 16992, 16961, 16929, 16896, - 16862, 16827, 16791, 16754, 16716, 16676, 16636, 16595, - 16553, 16509, 16465, 16420, 16373, 16326, 16278, 16228, - 16178, 16126, 16074, 16021, 15966, 15911, 15855, 15797, - 15739, 15680, 15620, 15558, 15496, 15433, 15369, 15304, - 15238, 15171, 15103, 15035, 14965, 14894, 14823, 14751, - 14677, 14603, 14528, 14452, 14375, 14297, 14218, 14139, - 14058, 13977, 13895, 13812, 13728, 13643, 13558, 13471, - 13384, 13296, 13207, 13117, 13027, 12935, 12843, 12750, - 12657, 12562, 12467, 12371, 12274, 12177, 12078, 11979, - 11880, 11779, 11678, 11576, 11473, 11370, 11266, 11161, - 11055, 10949, 10843, 10735, 10627, 10518, 10409, 10299, - 10188, 10076, 9964, 9852, 9739, 9625, 9510, 9395, - 9280, 9164, 9047, 8930, 8812, 8694, 8575, 8455, - 8335, 8215, 8094, 7973, 7851, 7728, 7605, 7482, - 7358, 7234, 7109, 6984, 6858, 6732, 6606, 6479, - 6352, 6224, 6096, 5967, 5839, 5710, 5580, 5450, - 5320, 5190, 5059, 4928, 4796, 4664, 4532, 4400, - 4268, 4135, 4002, 3868, 3735, 3601, 3467, 3333, - 3198, 3064, 2929, 2794, 2659, 2523, 2388, 2252, - 2116, 1980, 1844, 1708, 1572, 1436, 1299, 1163, - 1026, 889, 753, 616, 479, 342, 205, 68 -}; - -const Word16 edct_table_240_fx[] =/*Q16 */ -{ - 16650, 16650, 16648, 16646, 16643, 16640, 16635, 16630, - 16625, 16618, 16611, 16603, 16595, 16585, 16575, 16565, - 16553, 16541, 16528, 16515, 16501, 16486, 16470, 16454, - 16437, 16419, 16401, 16381, 16362, 16341, 16320, 16298, - 16275, 16252, 16228, 16203, 16178, 16151, 16125, 16097, - 16069, 16040, 16010, 15980, 15949, 15918, 15885, 15852, - 15819, 15784, 15749, 15713, 15677, 15640, 15602, 15564, - 15525, 15485, 15445, 15404, 15362, 15320, 15277, 15233, - 15189, 15144, 15098, 15052, 15005, 14957, 14909, 14860, - 14811, 14761, 14710, 14659, 14607, 14554, 14501, 14447, - 14392, 14337, 14282, 14225, 14168, 14111, 14053, 13994, - 13934, 13874, 13814, 13753, 13691, 13629, 13566, 13502, - 13438, 13374, 13309, 13243, 13176, 13109, 13042, 12974, - 12905, 12836, 12767, 12696, 12626, 12554, 12482, 12410, - 12337, 12264, 12190, 12115, 12040, 11965, 11889, 11812, - 11735, 11657, 11579, 11501, 11422, 11342, 11262, 11182, - 11101, 11019, 10937, 10855, 10772, 10689, 10605, 10521, - 10436, 10351, 10265, 10179, 10093, 10006, 9919, 9831, - 9743, 9654, 9565, 9476, 9386, 9296, 9205, 9114, - 9023, 8931, 8839, 8746, 8653, 8560, 8466, 8372, - 8278, 8183, 8088, 7993, 7897, 7801, 7704, 7608, - 7511, 7413, 7315, 7217, 7119, 7020, 6921, 6822, - 6723, 6623, 6523, 6422, 6321, 6221, 6119, 6018, - 5916, 5814, 5712, 5609, 5507, 5404, 5300, 5197, - 5093, 4990, 4885, 4781, 4677, 4572, 4467, 4362, - 4257, 4151, 4046, 3940, 3834, 3728, 3622, 3515, - 3408, 3302, 3195, 3088, 2981, 2873, 2766, 2658, - 2551, 2443, 2335, 2227, 2119, 2011, 1903, 1795, - 1686, 1578, 1469, 1361, 1252, 1143, 1035, 926, - 817, 708, 599, 490, 381, 272, 163, 54 -}; - -const Word16 edct_table_256_fx[] =/*Q16 */ -{ - 16384, 16383, 16382, 16380, 16378, 16375, 16371, 16367, - 16362, 16356, 16350, 16343, 16336, 16328, 16319, 16310, - 16300, 16290, 16278, 16267, 16254, 16242, 16228, 16214, - 16199, 16184, 16168, 16151, 16134, 16116, 16098, 16079, - 16059, 16039, 16018, 15997, 15975, 15952, 15929, 15905, - 15881, 15856, 15830, 15804, 15777, 15750, 15722, 15693, - 15664, 15634, 15604, 15573, 15541, 15509, 15476, 15443, - 15409, 15375, 15340, 15304, 15268, 15231, 15194, 15156, - 15117, 15078, 15039, 14999, 14958, 14917, 14875, 14832, - 14789, 14746, 14702, 14657, 14612, 14566, 14520, 14473, - 14426, 14378, 14329, 14280, 14231, 14181, 14130, 14079, - 14027, 13975, 13922, 13869, 13815, 13761, 13706, 13651, - 13595, 13538, 13481, 13424, 13366, 13308, 13249, 13190, - 13130, 13069, 13008, 12947, 12885, 12823, 12760, 12697, - 12633, 12569, 12504, 12439, 12373, 12307, 12240, 12173, - 12106, 12038, 11969, 11901, 11831, 11762, 11691, 11621, - 11550, 11478, 11406, 11334, 11261, 11188, 11114, 11040, - 10965, 10891, 10815, 10740, 10663, 10587, 10510, 10433, - 10355, 10277, 10198, 10119, 10040, 9961, 9881, 9800, - 9719, 9638, 9557, 9475, 9393, 9310, 9227, 9144, - 9061, 8977, 8892, 8808, 8723, 8638, 8552, 8466, - 8380, 8293, 8206, 8119, 8032, 7944, 7856, 7768, - 7679, 7590, 7501, 7411, 7321, 7231, 7141, 7050, - 6960, 6868, 6777, 6685, 6593, 6501, 6409, 6316, - 6223, 6130, 6037, 5943, 5850, 5756, 5661, 5567, - 5472, 5377, 5282, 5187, 5092, 4996, 4900, 4804, - 4708, 4611, 4515, 4418, 4321, 4224, 4127, 4030, - 3932, 3835, 3737, 3639, 3541, 3442, 3344, 3246, - 3147, 3048, 2949, 2851, 2751, 2652, 2553, 2454, - 2354, 2255, 2155, 2055, 1956, 1856, 1756, 1656, - 1556, 1456, 1356, 1255, 1155, 1055, 954, 854, - 754, 653, 553, 452, 352, 251, 151, 50 -}; - -const Word16 edct_table_400_fx[] =/*Q16 */ -{ - 29308, 29308, 29307, 29306, 29304, 29302, 29299, 29296, - 29292, 29288, 29284, 29279, 29273, 29267, 29261, 29254, - 29247, 29239, 29231, 29223, 29214, 29204, 29194, 29184, - 29173, 29162, 29150, 29138, 29125, 29112, 29099, 29085, - 29070, 29055, 29040, 29024, 29008, 28991, 28974, 28957, - 28939, 28920, 28901, 28882, 28862, 28842, 28821, 28800, - 28779, 28757, 28734, 28711, 28688, 28664, 28640, 28615, - 28590, 28565, 28539, 28512, 28485, 28458, 28430, 28402, - 28373, 28344, 28315, 28285, 28255, 28224, 28192, 28161, - 28129, 28096, 28063, 28030, 27996, 27962, 27927, 27892, - 27856, 27820, 27784, 27747, 27710, 27672, 27634, 27595, - 27556, 27517, 27477, 27437, 27396, 27355, 27313, 27272, - 27229, 27186, 27143, 27100, 27055, 27011, 26966, 26921, - 26875, 26829, 26782, 26736, 26688, 26640, 26592, 26544, - 26495, 26445, 26395, 26345, 26294, 26243, 26192, 26140, - 26088, 26035, 25982, 25929, 25875, 25821, 25766, 25711, - 25655, 25600, 25543, 25487, 25430, 25372, 25315, 25256, - 25198, 25139, 25079, 25020, 24960, 24899, 24838, 24777, - 24715, 24653, 24591, 24528, 24465, 24401, 24337, 24273, - 24208, 24143, 24078, 24012, 23946, 23879, 23812, 23745, - 23677, 23609, 23541, 23472, 23403, 23334, 23264, 23194, - 23123, 23052, 22981, 22909, 22837, 22765, 22692, 22619, - 22546, 22472, 22398, 22324, 22249, 22174, 22098, 22023, - 21947, 21870, 21793, 21716, 21639, 21561, 21483, 21404, - 21326, 21246, 21167, 21087, 21007, 20927, 20846, 20765, - 20684, 20602, 20520, 20437, 20355, 20272, 20189, 20105, - 20021, 19937, 19852, 19768, 19682, 19597, 19511, 19425, - 19339, 19252, 19165, 19078, 18991, 18903, 18815, 18726, - 18638, 18549, 18459, 18370, 18280, 18190, 18100, 18009, - 17918, 17827, 17735, 17643, 17551, 17459, 17366, 17274, - 17181, 17087, 16994, 16900, 16805, 16711, 16616, 16521, - 16426, 16331, 16235, 16139, 16043, 15946, 15850, 15753, - 15656, 15558, 15461, 15363, 15265, 15166, 15068, 14969, - 14870, 14770, 14671, 14571, 14471, 14371, 14271, 14170, - 14069, 13968, 13867, 13765, 13663, 13562, 13459, 13357, - 13254, 13152, 13049, 12946, 12842, 12739, 12635, 12531, - 12427, 12323, 12218, 12113, 12008, 11903, 11798, 11693, - 11587, 11481, 11375, 11269, 11163, 11056, 10950, 10843, - 10736, 10628, 10521, 10414, 10306, 10198, 10090, 9982, - 9874, 9765, 9657, 9548, 9439, 9330, 9221, 9112, - 9002, 8892, 8783, 8673, 8563, 8453, 8342, 8232, - 8122, 8011, 7900, 7789, 7678, 7567, 7456, 7344, - 7233, 7121, 7010, 6898, 6786, 6674, 6562, 6450, - 6337, 6225, 6112, 6000, 5887, 5774, 5661, 5548, - 5435, 5322, 5209, 5096, 4982, 4869, 4755, 4642, - 4528, 4414, 4300, 4187, 4073, 3959, 3845, 3730, - 3616, 3502, 3388, 3273, 3159, 3044, 2930, 2815, - 2701, 2586, 2472, 2357, 2242, 2127, 2013, 1898, - 1783, 1668, 1553, 1438, 1323, 1208, 1093, 978, - 863, 748, 633, 518, 403, 288, 173, 58 -}; - -const Word16 edct_table_320_16fx[320] =/*Q16 */ -{ - 7747, 7747, 7747, 7746, 7746, 7745, 7744, 7742, - 7741, 7739, 7737, 7735, 7733, 7730, 7728, 7725, - 7722, 7719, 7716, 7712, 7708, 7704, 7700, 7696, - 7692, 7687, 7682, 7677, 7672, 7666, 7661, 7655, - 7649, 7643, 7637, 7630, 7623, 7617, 7610, 7602, - 7595, 7587, 7580, 7572, 7563, 7555, 7547, 7538, - 7529, 7520, 7511, 7501, 7492, 7482, 7472, 7462, - 7451, 7441, 7430, 7419, 7408, 7397, 7386, 7374, - 7362, 7350, 7338, 7326, 7314, 7301, 7288, 7275, - 7262, 7249, 7235, 7221, 7208, 7194, 7179, 7165, - 7150, 7136, 7121, 7106, 7091, 7075, 7060, 7044, - 7028, 7012, 6995, 6979, 6962, 6946, 6929, 6912, - 6894, 6877, 6859, 6842, 6824, 6806, 6787, 6769, - 6750, 6732, 6713, 6694, 6674, 6655, 6635, 6616, - 6596, 6576, 6556, 6535, 6515, 6494, 6473, 6452, - 6431, 6410, 6388, 6367, 6345, 6323, 6301, 6279, - 6257, 6234, 6211, 6189, 6166, 6143, 6119, 6096, - 6072, 6049, 6025, 6001, 5977, 5953, 5928, 5904, - 5879, 5854, 5829, 5804, 5779, 5753, 5728, 5702, - 5676, 5650, 5624, 5598, 5572, 5545, 5518, 5492, - 5465, 5438, 5411, 5383, 5356, 5328, 5301, 5273, - 5245, 5217, 5189, 5160, 5132, 5104, 5075, 5046, - 5017, 4988, 4959, 4930, 4900, 4871, 4841, 4811, - 4781, 4751, 4721, 4691, 4661, 4630, 4600, 4569, - 4538, 4508, 4477, 4446, 4414, 4383, 4352, 4320, - 4288, 4257, 4225, 4193, 4161, 4129, 4097, 4064, - 4032, 3999, 3967, 3934, 3901, 3868, 3835, 3802, - 3769, 3736, 3702, 3669, 3635, 3602, 3568, 3534, - 3500, 3466, 3432, 3398, 3364, 3330, 3295, 3261, - 3226, 3192, 3157, 3122, 3087, 3052, 3017, 2982, - 2947, 2912, 2877, 2841, 2806, 2771, 2735, 2699, - 2664, 2628, 2592, 2556, 2520, 2484, 2448, 2412, - 2376, 2340, 2304, 2267, 2231, 2194, 2158, 2121, - 2085, 2048, 2011, 1975, 1938, 1901, 1864, 1827, - 1790, 1753, 1716, 1679, 1642, 1605, 1567, 1530, - 1493, 1455, 1418, 1381, 1343, 1306, 1268, 1231, - 1193, 1156, 1118, 1080, 1043, 1005, 967, 930, - 892, 854, 816, 778, 740, 703, 665, 627, - 589, 551, 513, 475, 437, 399, 361, 323, - 285, 247, 209, 171, 133, 95, 57, 19 -}; -const Word16 edct_table_128_16fx[128] = /*Q15 */ -{ - 9742, 9740, 9737, 9733, 9727, 9720, 9711, 9701, - 9689, 9676, 9661, 9645, 9627, 9608, 9588, 9566, - 9543, 9518, 9492, 9464, 9435, 9405, 9373, 9339, - 9305, 9269, 9231, 9192, 9152, 9110, 9067, 9023, - 8977, 8930, 8882, 8832, 8781, 8728, 8675, 8619, - 8563, 8505, 8447, 8386, 8325, 8262, 8198, 8133, - 8067, 7999, 7930, 7860, 7789, 7717, 7643, 7568, - 7492, 7415, 7337, 7258, 7178, 7097, 7014, 6931, - 6846, 6761, 6674, 6586, 6498, 6408, 6318, 6226, - 6134, 6040, 5946, 5851, 5755, 5658, 5560, 5462, - 5362, 5262, 5161, 5059, 4957, 4854, 4750, 4645, - 4539, 4433, 4327, 4219, 4111, 4002, 3893, 3783, - 3673, 3562, 3450, 3338, 3226, 3113, 2999, 2885, - 2771, 2656, 2541, 2425, 2309, 2193, 2076, 1959, - 1842, 1724, 1607, 1489, 1370, 1252, 1133, 1014, - 895, 776, 657, 538, 418, 299, 179, 60 -}; -const Word16 edct_table_160_16fx[160] =//Q15 -{ - 9213, 9212, 9211, 9208, 9204, 9200, 9195, 9188, - 9181, 9173, 9164, 9155, 9144, 9132, 9120, 9107, - 9093, 9078, 9062, 9045, 9027, 9009, 8989, 8969, - 8948, 8926, 8903, 8880, 8855, 8830, 8803, 8776, - 8748, 8719, 8690, 8659, 8628, 8596, 8563, 8529, - 8495, 8459, 8423, 8386, 8348, 8309, 8270, 8230, - 8188, 8147, 8104, 8061, 8016, 7971, 7926, 7879, - 7832, 7784, 7735, 7686, 7635, 7584, 7533, 7480, - 7427, 7373, 7319, 7263, 7207, 7151, 7093, 7035, - 6976, 6917, 6857, 6796, 6735, 6673, 6610, 6547, - 6483, 6418, 6353, 6287, 6221, 6154, 6086, 6018, - 5949, 5880, 5810, 5739, 5668, 5597, 5525, 5452, - 5379, 5305, 5231, 5156, 5081, 5005, 4929, 4852, - 4775, 4698, 4620, 4541, 4462, 4383, 4303, 4223, - 4142, 4061, 3980, 3898, 3816, 3734, 3651, 3568, - 3484, 3400, 3316, 3231, 3146, 3061, 2976, 2890, - 2804, 2718, 2631, 2544, 2457, 2370, 2282, 2195, - 2107, 2019, 1930, 1842, 1753, 1664, 1575, 1486, - 1397, 1307, 1218, 1128, 1038, 948, 858, 768, - 678, 588, 497, 407, 317, 226, 136, 45 -}; - - -/*----------------------------------------------------------------------------------* - * Mean ISF vector for active signal (only for AMR-WB IO mode) - *----------------------------------------------------------------------------------*/ - -const Word16 mean_isf_amr_wb_fx[M] =/*Qlog2(2.56)*/ -{ - 738, 1326, 2336, 3578, 4596, 5662, 6711, 7730, - 8750, 9753,10705, 11728, 12833, 13971,15043, 4037 -};/*1.28f Q1*/ - -/*----------------------------------------------------------------------------------* - * Mean ISF vector for SID frames (only in AMR-WB IO mode) - *----------------------------------------------------------------------------------*/ - -const Word16 mean_isf_noise_amr_wb_fx[M] =/*Qlog2(2.56)*/ -{ - 478, 1100, 2213, 3267, 4219, 5222, 6198, 7240, - 8229, 9153,10098, 11108, 12144, 13184,14165, 3803 -};/*14Q1*1.28*/ - -/* ISF codebook - common 1st stage, 1st split (only in AMR-WB IO mode) */ -/*------------------------------------------------------* - * Indirection for 1st stage 1st split of 46 bit cb. : - The transmitted_index = indirect_dico1[found_index]; - *------------------------------------------------------*/ -const Word16 Indirect_dico1[SIZE_BK1] = // Q0 -{ - 2, 6, 18, 22, 34, 35, 38, 50, - 66, 67, 70, 82, 98, 99, 102, 130, - 131, 134, 146, 150, 162, 178, 194, 198, - 210, 226, 230, 242, 0, 1, 3, 4, - 5, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 19, 20, 21, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 36, 37, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 51, - 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 68, 69, - 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 100, 101, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 132, - 133, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 147, 148, 149, 151, - 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, - 177, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, - 195, 196, 197, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 227, 228, 229, - 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255 -}; - -/*----------------------------------------------------------------------------------* - * Initial LSF memory - *----------------------------------------------------------------------------------*/ - -const Word16 lsf_init_fx[16] = /*14Q1*1.28*/ -{ - 960, 1920, 2880, 3840, 4800, 5760, 6720, 7680, 8640, 9600, 10560, 11520, 12480, 13440, 14400, 15360 -}; - -/*----------------------------------------------------------------------------------* - * Gaussian codebook - *----------------------------------------------------------------------------------*/ - -/*table in Q12*/ -const Word16 gaus_dico_fx[190] = -{ - -399, -125, 523, -466, 305, -658, -809, 47, - -141, -171, -583, -259, 296, 1334, -285, -401, - -478, -418, 140, -540, 177, -1089, 130, -292, - 143, 492, -310, -862, -320, 388, 546, 84, - -1202, 107, 108, 340, 239, -130, 930, 342, - 153, -264, -763, -113, 387, -535, 83, -856, - -361, -421, 120, 396, -367, 640, 817, 222, - -1017, -82, -120, 890, 340, -384, 47, 339, - -505, -430, 161, 979, 890, -267, 104, 508, - -150, -194, 442, 193, 413, -24, 395, -43, - -217, 69, -398, 167, 116, -936, -95, 1466, - -435, 461, 862, -136, -94, 1311, -371, 68, - 134, -296, -156, -564, -48, -487, 647, 315, - 513, -101, -685, -318, -344, -644, -66, 851, - 414, -29, 509, 414, 502, 399, 557, 649, - -299, 750, 546, -756, -12, -365, 593, -707, - 394, -131, -375, -62, -914, -256, -424, 64, - 464, -1140, 280, 91, -83, -288, -550, 389, - 52, -1228, 6, -430, 74, 205, -478, -148, - -592, 282, -73, 1212, 42, 580, -334, 484, - -765, 443, 649, 271, -739, 375, 613, -460, - -208, 235, -120, -49, -311, 605, 875, 521, - 202, -506, -548, -1088, -43, -221, 673, -245, - -27, 469, 353, 53, 744, 275 -}; - -const Word16 gaus_dico_swb_fx[256] = -{ - /*Q15 */ - 709, 11759, -5333, -2701, 2397, -18, -4286, 2368, - -4576, -1584, -900, -940, 3676, 5441, -44, 2234, - -5698, 3082, -2671, 1666, -640, -3343, -1005, -1689, - 2048, 281, -3935, -3723, 5628, 385, -746, -3243, - -3332, -7228, -1748, -206, -5474, 2554, 2861, 3168, - 5039, 588, -508, -8167, 6549, -3433, 2187, -3666, - -5874, 2767, 8370, 1038, 6434, 6279, 625, 4030, - -1031, 1823, 9896, -1395, 2712, -1110, -742, 6142, - -4456, -10487, -144, -5104, 1968, -312, 6176, 2173, - 2334, -240, 2712, 7460, 2219, -3116, -56, 2770, - 5577, -1225, 770, 3557, 2246, 2322, 3077, 41, - 992, -4971, 441, -5039, 4913, 3811, 1142, -1283, - -6578, 4171, -1473, -3793, -5008, 1984, -1138, -1185, - 5646, 1014, -5118, 7141, 2656, -7241, -3538, 2337, - 7239, -504, -943, -10129, 702, -3811, -302, 2435, - 5090, 3744, 2335, -3904, -1401, -1662, -7256, 6484, - -6864, -5428, 1954, -7316, -1420, -1542, 5442, 311, - 3698, -1343, -2974, 8756, 324, -1903, 2580, 2635, - 4236, -1851, 3147, -772, -708, -3830, 2601, -1889, - -3444, -762, 3939, 3206, -7406, -837, -1167, -438, - 3707, -1015, -7472, 1849, 4277, 1459, -3047, -3760, - 740, -7134, -3753, -3092, 209, -12121, 1398, 2266, - 2505, -7974, -1121, -3481, -5644, 1329, 4532, 958, - 5311, -4258, -3195, -1769, -3055, 4399, -15, 10182, - 4503, 1912, -1574, 5054, -3163, 4881, -5364, 1925, - -1205, -6432, 2305, -8917, -1422, 514, -3001, 3928, - 2321, 360, -355, 1477, -3492, -4570, 1913, 2772, - -1380, -5161, 3812, 2614, 2204, -3135, 1244, -3066, - -4446, -6389, 4899, -5250, 1372, 1999, 1122, 5312, - 1310, -1189, -3310, 6403, 3818, 7734, 1620, -8533, - 706, 7498, -4472, 1272, -949, 3203, -4427, -2855, - 4419, 2283, 6410, 2584, -3397, -3382, -2976, -48, -}; - - -/*----------------------------------------------------------------------------------* - * CLDFB tables - *----------------------------------------------------------------------------------*/ - -const Word16 freqTable[2] = {20, 40}; // Q0 - -/* SNR: 109.44, PHASE: 3.500000000000000 */ - -/* SNR: 109.44, PHASE: 3.500000000000000 */ -const Word16 CLDFB80_10_fx[100] = // q = 15 sf = 17036 qsf = 14 -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7, -2, 0, 0, 0, -1, 0, 0, 0, -8, -31, - -4, 0, 0, -6, 5, 0, 0, -1, 33, -63, -24, 11, 49, 54, 49, 69, 89, 95, 52, -44, -50, 24, 80, 71, 8, - -103, -205, -300, -429, 587, 764, 1010, 1347, 1783, 2309, 2880, 3411, 3810, 4001, 3950, 3582, 2797, - 1568, -98, -2200, -4710, -7582, -10752, -14132, 17583, 20974, 24169, 27024, 29400, 31176, 32302, - 32767, 32696, 32027, 30287, 27571, 24530, 21358, 18039, 14649, 11219, 7832, 4369, 1312 -}; - - -/* SNR: 292.49, PHASE: 2.000000000000000 */ -const Word16 CLDFB80_16_fx[160] = // q = 15 sf = 17051 qsf = 14 -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, - -4, -1, -1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, -2, -13, -38, -16, -5, -3, -1, 0, -1, 1, -7, 1, 0, 1, 1, 1, - 10, 52, -67, -48, -23, -3, 22, 47, 56, 36, 50, 57, 70, 87, 93, 95, 80, 40, -34, -61, -46, 0, 45, 78, - 82, 65, 29, -38, -110, -175, -233, -293, -368, -457, 559, 658, 776, 923, 1104, 1322, 1579, 1873, 2203, - 2556, 2913, 3252, 3551, 3787, 3943, 4005, 3975, 3832, 3542, 3087, 2458, 1656, 683, -459, -1772, -3248, - -4875, -6643, -8536, -10537, -12624, -14766, 16922, 19062, 21161, 23180, 25080, 26833, 28403, 29754, - 30863, 31722, 32320, 32657, 32767, 32685, 32379, 31797, 30709, 29137, 27361, 25471, 23533, 21541, 19486, - 17392, 15275, 13136, 10996, 8882, 6757, 4582, 2509, 876, -}; - -/* SNR: 89.77, PHASE: 1.500000000000000 */ -const Word16 CLDFB80_20_fx[200] = // q = 15 sf = 17050 qsf = 14 -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -9, -6, -1, -2, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, -3, -15, -37, -20, -4, -5, -3, -1, 0, 0, - -4, 8, -15, 4, 0, 1, 1, 1, 2, -4, 10, 57, -62, -58, -27, -19, -1, 19, 39, 52, 57, 24, 52, 53, 60, 75, 87, 92, - 96, 88, 69, 33, -29, -56, -59, -34, 4, 41, 72, 87, 78, 64, 37, -18, -75, -131, -181, -228, -275, -328, -394, - -466, 549, 627, 713, 817, 939, 1085, 1253, 1446, 1664, 1904, 2168, 2449, 2736, 3018, 3284, 3524, 3724, 3876, - 3972, 4006, 3982, 3890, 3707, 3424, 3032, 2528, 1914, 1191, 358, -583, -1633, -2789, -4043, -5392, -6827, -8342, - -9927, -11572, -13263, -14983, 16709, 18424, 20121, 21779, 23377, 24898, 26326, 27645, 28834, 29878, 30765, - 31493, 32056, 32450, 32679, 32767, 32733, 32567, 32235, 31727, 30857, 29634, 28272, 26803, 25281, 23730, 22147, - 20522, 18862, 17182, 15489, 13781, 12065, 10360, 8671, 6973, 5237, 3512, 1961, 735, -}; - - -/* SNR: 89.29, PHASE: 0.833333333333333 */ -const Word16 CLDFB80_30_fx[300] = // q = 15 sf = 17051 qsf = 14 -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -7, -4, -2, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, - 0, -1, -1, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, -2, -8, -19, -31, -31, -20, -7, -4, -5, -3, 0, -1, 0, 0, 1, -3, -6, 18, - -23, 5, 3, -3, 0, 1, 2, 0, 1, 2, -1, 0, 11, 33, 61, -57, -63, -54, -33, -24, -16, -4, 11, 23, 36, 49, 54, 56, 54, - 8, 52, 49, 55, 60, 69, 78, 86, 89, 93, 96, 95, 87, 75, 52, 22, -19, -44, -59, -60, -50, -28, -2, 24, 47, 67, 80, - 86, 80, 71, 62, 48, 8, -27, -65, -103, -139, -173, -205, -235, -266, -300, -338, -382, -429, -478, 534, 587, 641, - 698, 763, 836, 917, 1009, 1111, 1223, 1346, 1480, 1626, 1781, 1945, 2122, 2307, 2496, 2688, 2878, 3063, 3241, 3408, - 3560, 3694, 3806, 3896, 3960, 3997, 4003, 3987, 3946, 3866, 3744, 3579, 3366, 3105, 2794, 2434, 2024, 1566, 1060, - 505, -98, -750, -1450, -2198, -2991, -3827, -4706, -5625, -6582, -7575, -8601, -9658, -10742, -11850, -12978, -14119, - -15271, 16422, 17566, 18707, 19838, 20954, 22048, 23114, 24147, 25141, 26094, 26999, 27851, 28644, 29373, 30034, 30626, - 31147, 31596, 31972, 32272, 32496, 32649, 32737, 32767, 32744, 32665, 32521, 32301, 31997, 31636, 31056, 30259, 29415, - 28506, 27545, 26550, 25535, 24507, 23467, 22412, 21338, 20246, 19139, 18023, 16900, 15771, 14635, 13494, 12350, 11209, - 10077, 8952, 7825, 6685, 5527, 4365, 3235, 2198, 1311, 541, -}; - -/* SNR: 85.69, PHASE: 0.750000000000000 */ -const Word16 CLDFB80_32_fx[320] = // q = 15 sf = 17050 qsf = 14 -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -8, -5, -2, -1, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, - -1, -1, 0, 1, 0, 0, -1, 0, 0, 0, 0, 1, -1, -3, -9, -20, -31, -32, -20, -10, -2, -5, -4, -2, 0, 0, 0, 0, 0, -3, -5, 18, -24, 4, - 3, -2, 2, 1, 2, 0, 1, 2, 2, -5, 4, 11, 37, 61, -56, -65, -57, -38, -23, -20, -9, 2, 16, 29, 40, 51, 55, 57, 52, 6, 52, 49, 54, - 59, 65, 74, 84, 88, 91, 94, 96, 93, 85, 71, 50, 21, -18, -43, -57, -61, -54, -36, -13, 12, 35, 55, 73, 84, 85, 79, 69, 62, 50, - 11, -21, -56, -93, -127, -159, -190, -219, -248, -278, -310, -348, -389, -433, -480, 532, 582, 632, 685, 744, 810, 883, 965, - 1056, 1156, 1264, 1383, 1511, 1649, 1796, 1951, 2117, 2290, 2467, 2646, 2825, 3000, 3170, 3332, 3482, 3617, 3735, 3834, 3912, - 3968, 4000, 4003, 3988, 3952, 3881, 3775, 3630, 3445, 3217, 2946, 2631, 2273, 1872, 1429, 943, 413, -157, -771, -1428, -2126, - -2864, -3641, -4455, -5305, -6189, -7106, -8052, -9027, -10028, -11053, -12097, -13156, -14228, -15309, 16387, 17461, 18531, - 19594, 20644, 21677, 22687, 23669, 24620, 25536, 26413, 27246, 28032, 28765, 29440, 30056, 30611, 31104, 31534, 31899, 32198, - 32430, 32598, 32706, 32761, 32767, 32727, 32635, 32483, 32262, 31968, 31629, 31085, 30337, 29554, 28712, 27822, 26897, 25951, - 24992, 24023, 23042, 22047, 21034, 20006, 18967, 17919, 16866, 15808, 14744, 13674, 12601, 11530, 10466, 9409, 8355, 7294, 6217, - 5127, 4042, 2998, 2049, 1236, 515, -}; - -/* SNR: 81.55, PHASE: 0.500000000000000 */ -const Word16 CLDFB80_40_fx[400] = // q = 15 sf = 17051 qsf = 14 -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -10, -9, -6, -4, - -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -2, 0, 0, 0, 1, -1, 0, 0, -1, 0, 0, 0, 0, 0, 2, -1, -2, -5, -12, -22, -29, - -37, -24, -18, -9, -2, -6, -4, -3, -2, 0, -1, 0, 0, 0, 1, -2, -6, -2, 20, -24, 0, 5, 2, -2, 2, 0, 2, 2, 0, 1, 2, 2, 2, -6, 3, 11, - 18, 47, 61, -57, -68, -60, -52, -36, -23, -22, -14, -6, 3, 16, 25, 35, 44, 51, 54, 56, 56, 44, 3, 49, 49, 51, 56, 59, 64, 72, 79, - 86, 88, 90, 93, 96, 96, 92, 86, 77, 59, 45, 17, -14, -38, -50, -60, -61, -55, -42, -25, -5, 15, 33, 49, 65, 77, 85, 85, 81, 75, 67, - 62, 54, 22, -4, -31, -60, -90, -117, -144, -169, -193, -216, -239, -262, -287, -313, -344, -377, -411, -447, -485, 527, 569, 606, - 648, 690, 737, 790, 845, 906, 973, 1046, 1125, 1209, 1299, 1395, 1498, 1607, 1722, 1842, 1966, 2099, 2237, 2378, 2520, 2664, 2807, - 2948, 3086, 3219, 3347, 3467, 3578, 3678, 3766, 3843, 3905, 3953, 3987, 4003, 4001, 3989, 3967, 3921, 3853, 3762, 3646, 3505, 3336, - 3140, 2916, 2665, 2385, 2078, 1744, 1382, 993, 577, 133, -337, -835, -1360, -1913, -2490, -3093, -3720, -4372, -5046, -5743, -6460, - -7198, -7956, -8731, -9524, -10332, -11155, -11990, -12836, -13690, -14550, -15416, 16279, 17137, 17995, 18849, 19698, 20538, 21367, - 22183, 22983, 23764, 24524, 25263, 25977, 26665, 27325, 27953, 28548, 29107, 29629, 30112, 30556, 30960, 31324, 31647, 31929, 32168, - 32365, 32519, 32634, 32711, 32755, 32767, 32750, 32702, 32620, 32498, 32333, 32121, 31865, 31595, 31160, 30560, 29950, 29304, 28623, - 27911, 27175, 26424, 25662, 24894, 24118, 23336, 22544, 21743, 20930, 20108, 19278, 18442, 17602, 16759, 15912, 15062, 14208, 13351, - 12493, 11636, 10783, 9936, 9092, 8249, 7400, 6542, 5673, 4799, 3934, 3099, 2320, 1623, 1018, 436, -}; - - -/* SNR: 85.15, PHASE: 0.166666666666667 */ -const Word16 CLDFB80_60_fx[600] = // q = 15 sf = 17051 qsf = 14 -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, -11, -9, -9, -6, -6, -4, -3, -1, -1, -1, -2, - -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -2, -3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, -1, - -2, -3, -5, -11, -15, -25, -27, -37, -35, -26, -20, -17, -11, -4, -2, -6, -5, -4, -4, -3, -2, 0, -1, -1, 0, 0, 0, 0, 0, 0, -2, -4, -6, - -3, 8, 18, -21, -15, 2, 6, 4, 2, -2, 0, 2, 0, 1, 2, 2, 1, 0, 0, 1, 2, 2, 2, 1, -4, -4, 5, 10, 10, 23, 42, 57, 61, -58, -62, -67, -60, - -58, -49, -39, -27, -23, -23, -19, -13, -7, -1, 5, 15, 19, 26, 34, 39, 46, 50, 52, 55, 56, 57, 56, 48, 24, 2, 43, 52, 49, 50, 53, 56, - 59, 60, 66, 71, 75, 80, 85, 87, 88, 90, 92, 94, 95, 96, 96, 93, 88, 85, 79, 69, 56, 47, 33, 12, -8, -29, -41, -48, -56, -61, -61, -59, - -54, -45, -34, -22, -9, 4, 18, 30, 41, 52, 62, 72, 78, 83, 87, 85, 82, 78, 73, 68, 64, 62, 58, 37, 17, 0, -18, -36, -55, -75, -94, -112, - -131, -148, -165, -181, -197, -212, -228, -243, -258, -275, -291, -309, -328, -349, -371, -394, -417, -441, -466, -492, 520, 549, 575, 599, - 627, 655, 683, 713, 746, 781, 817, 855, 896, 939, 985, 1033, 1085, 1138, 1194, 1253, 1315, 1379, 1446, 1516, 1588, 1663, 1741, 1822, 1904, - 1987, 2076, 2168, 2261, 2354, 2449, 2544, 2640, 2735, 2830, 2925, 3018, 3109, 3198, 3284, 3368, 3448, 3524, 3595, 3662, 3724, 3780, 3831, - 3876, 3914, 3947, 3972, 3991, 4002, 4005, 3999, 3991, 3981, 3960, 3930, 3890, 3839, 3779, 3707, 3624, 3530, 3424, 3306, 3175, 3032, 2877, - 2709, 2528, 2336, 2131, 1914, 1685, 1444, 1191, 926, 648, 358, 56, -257, -583, -920, -1270, -1633, -2007, -2392, -2789, -3196, -3614, -4043, - -4483, -4932, -5392, -5861, -6339, -6827, -7324, -7828, -8341, -8862, -9391, -9926, -10469, -11017, -11572, -12131, -12695, -13262, -13833, - -14406, -14982, -15561, 16136, 16708, 17280, 17853, 18423, 18991, 19557, 20120, 20678, 21230, 21778, 22318, 22851, 23376, 23892, 24400, 24897, - 25384, 25860, 26325, 26778, 27217, 27644, 28055, 28452, 28833, 29197, 29545, 29876, 30189, 30485, 30764, 31024, 31267, 31492, 31698, 31886, - 32055, 32205, 32336, 32448, 32542, 32618, 32678, 32722, 32751, 32766, 32767, 32756, 32731, 32692, 32637, 32565, 32475, 32364, 32233, 32082, - 31911, 31726, 31551, 31261, 30855, 30461, 30055, 29633, 29194, 28739, 28271, 27790, 27300, 26802, 26298, 25790, 25279, 24765, 24249, 23729, - 23205, 22678, 22145, 21608, 21067, 20521, 19971, 19417, 18861, 18303, 17743, 17181, 16618, 16054, 15488, 14920, 14351, 13780, 13208, 12636, - 12064, 11494, 10925, 10359, 9795, 9233, 8671, 8108, 7542, 6972, 6398, 5818, 5236, 4654, 4077, 3512, 2965, 2445, 1961, 1516, 1114, 735, 325, -}; - - -/* 5ms delay prototype */ -const Word16 LDQMF_10_fx[] = // q = 15 sf = 15388 qsf = 14 -{ - 4, 2, -2, -7, -11, -13, -14, -14, -16, -21, -31, -44, -56, -66, -70, -67, -57, -39, -15, 12, -43, -75, -104, -132, -156, -178, -196, -210, - -221, -229, -238, -248, -262, -281, -306, -332, -353, -359, -340, -281, 168, -11, -267, -606, -1030, -1534, -2105, -2724, -3361, -3979, -4533, - -4973, -5242, -5284, -5046, -4480, -3551, -2234, -523, 1572, -4024, -6784, -9789, -12957, -16197, -19406, -22478, -25307, -27793, -29846, -31391, - -32374, -32768, -32565, -31782, -30462, -28663, -26465, -23956, -21234, 18397, 15542, 12766, 10150, 7762, 5656, 3864, 2396, 1242, 371, -221, - -567, -753, -808, -763, -646, -489, -322, -174, -64, -}; - -const Word16 LDQMF_16_fx[] = // q = 15 sf = 15388 qsf = 14 -{ - 4, 3, 1, 0, -3, -7, -9, -12, -13, -14, -14, -14, -14, -16, -19, -23, -29, -37, -45, -53, -60, -65, -69, -70, -68, -64, -56, -45, -32, -16, 0, 18, - -38, -57, -76, -95, -113, -130, -146, -161, -174, -186, -197, -206, -214, -220, -226, -231, -236, -242, -248, -257, -267, -280, -295, -311, -327, - -342, -353, -359, -357, -342, -312, -264, 194, 98, -24, -178, -364, -583, -835, -1119, -1434, -1777, -2143, -2527, -2922, -3321, -3714, -4089, - -4437, -4743, -4995, -5179, -5282, -5289, -5188, -4966, -4613, -4120, -3480, -2688, -1742, -641, 610, 2006, -3539, -5197, -6965, -8828, -10765, - -12756, -14777, -16804, -18811, -20773, -22663, -24455, -26125, -27649, -29006, -30177, -31143, -31892, -32415, -32708, -32768, -32594, -32193, - -31574, -30747, -29729, -28536, -27189, -25709, -24120, -22444, -20707, 18934, 17143, 15365, 13619, 11927, 10307, 8775, 7345, 6028, 4832, 3762, - 2820, 2002, 1305, 720, 235, -135, -394, -583, -710, -783, -808, -793, -746, -672, -581, -479, -374, -273, -182, -107, -49, -}; - -const Word16 LDQMF_20_fx[] = // q = 15 sf = 15390 qsf = 14 -{ - 4, 4, 3, 1, -1, -3, -6, -8, -10, -12, -13, -13, -14, -14, -14, -14, -15, -17, -20, -23, -28, -34, -41, -47, -53, -59, -64, -67, -70, -70, -69, -65, - -60, -53, -44, -33, -21, -8, 5, 20, -36, -51, -67, -82, -97, -111, -125, -138, -150, -162, -173, -182, -191, -199, -207, -213, -218, -223, -227, - -231, -235, -240, -245, -251, -258, -266, -276, -287, -299, -312, -325, -338, -348, -356, -360, -357, -348, -329, -300, -258, 202, 130, 40, -67, - -195, -344, -513, -704, -916, -1149, -1401, -1671, -1957, -2256, -2566, -2882, -3201, -3518, -3828, -4125, -4403, -4655, -4876, -5057, -5193, -5275, - -5297, -5252, -5134, -4936, -4654, -4283, -3818, -3258, -2600, -1843, -987, -34, 1014, 2153, -3380, -4687, -6068, -7514, -9017, -10567, -12153, -13762, - -15383, -17003, -18609, -20188, -21726, -23209, -24625, -25961, -27205, -28346, -29373, -30279, -31052, -31686, -32178, -32523, -32720, -32768, -32666, - -32417, -32026, -31496, -30835, -30049, -29149, -28143, -27043, -25859, -24603, -23288, -21925, -20528, 19110, 17678, 16249, 14835, 13446, 12092, 10783, - 9528, 8333, 7207, 6153, 5177, 4281, 3466, 2732, 2078, 1502, 999, 565, 191, -105, -324, -497, -627, -719, -777, -805, -805, -782, -739, -680, -609, -530, - -447, -363, -283, -208, -142, -88, -44, -}; - -const Word16 LDQMF_30_fx[] = // q = 15 sf = 15388 qsf = 14 -{ - 3, 4, 4, 3, 2, 0, 0, -2, -4, -5, -7, -8, -10, -11, -12, -13, -13, -13, -14, -14, -14, -14, -14, -14, -15, -16, -17, -19, -21, -24, -27, -31, -35, -40, - -44, -48, -52, -56, -60, -63, -66, -68, -69, -70, -70, -69, -67, -65, -61, -57, -51, -45, -39, -31, -23, -15, -6, 3, 12, 22, -33, -43, -54, -64, -75, - -85, -95, -104, -114, -123, -132, -140, -148, -156, -164, -171, -178, -184, -190, -196, -201, -205, -210, -214, -217, -221, -224, -227, -229, -232, -235, - -238, -241, -244, -248, -252, -257, -262, -268, -274, -281, -289, -297, -306, -314, -323, -332, -339, -347, -353, -357, -359, -359, -356, -350, -340, -325, - -306, -281, -250, 212, 168, 116, 56, -11, -87, -172, -267, -370, -484, -606, -738, -880, -1030, -1190, -1358, -1534, -1718, -1908, -2105, -2307, -2514, - -2724, -2936, -3149, -3361, -3571, -3778, -3979, -4173, -4359, -4533, -4695, -4842, -4973, -5084, -5175, -5242, -5284, -5298, -5284, -5238, -5159, -5046, - -4896, -4708, -4480, -4212, -3903, -3551, -3156, -2717, -2234, -1707, -1137, -523, 133, 832, 1572, 2352, -3170, -4024, -4913, -5833, -6784, -7762, -8765, - -9789, -10831, -11888, -12957, -14034, -15115, -16197, -17275, -18346, -19406, -20451, -21476, -22478, -23453, -24398, -25307, -26179, -27008, -27793, - -28529, -29215, -29846, -30422, -30938, -31391, -31783, -32111, -32374, -32571, -32703, -32768, -32766, -32698, -32565, -32367, -32105, -31782, -31399, - -30958, -30462, -29912, -29311, -28663, -27971, -27237, -26465, -25658, -24821, -23956, -23067, -22159, -21234, -20296, 19352, 18397, 17442, 16489, 15542, - 14603, 13677, 12766, 11872, 10999, 10150, 9326, 8529, 7762, 7027, 6324, 5656, 5023, 4425, 3864, 3338, 2849, 2396, 1977, 1593, 1242, 922, 633, 371, 134, -63, - -221, -356, -471, -567, -645, -707, -753, -784, -802, -808, -803, -788, -763, -730, -691, -646, -597, -544, -489, -433, -377, -322, -270, -220, -174, -132, - -96, -64, -36, -}; - -const Word16 LDQMF_32_fx[] = // q = 15 sf = 15392 qsf = 14 -{ - 3, 4, 4, 3, 2, 1, 0, -1, -3, -4, -6, -7, -9, -10, -11, -12, -13, -13, -13, -14, -14, -14, -14, -14, -14, -15, -15, -16, -18, -19, -22, -24, -27, -31, -35, - -39, -43, -47, -51, -54, -58, -61, -64, -66, -68, -70, -70, -70, -69, -67, -65, -62, -58, -53, -48, -42, -35, -28, -20, -12, -4, 4, 13, 22, -33, -42, -52, - -62, -72, -81, -91, -100, -109, -117, -126, -134, -142, -150, -157, -164, -171, -177, -183, -189, -194, -199, -204, -208, -212, -215, -219, -222, -224, - -227, -230, -232, -235, -237, -240, -243, -246, -250, -254, -259, -264, -270, -277, -283, -291, -298, -306, -315, -323, -331, -338, -345, -351, -356, -359, - -360, -358, -354, -347, -336, -321, -302, -278, -248, 213, 172, 125, 70, 8, -60, -137, -221, -314, -415, -525, -642, -768, -902, -1045, -1195, -1352, -1517, - -1688, -1866, -2049, -2237, -2429, -2625, -2822, -3021, -3221, -3419, -3616, -3809, -3997, -4178, -4352, -4516, -4670, -4811, -4937, -5047, -5139, -5212, -5263, - -5292, -5296, -5273, -5223, -5143, -5032, -4889, -4713, -4502, -4256, -3973, -3653, -3296, -2900, -2465, -1992, -1481, -930, -342, 283, 945, 1644, 2377, -3143, - -3942, -4771, -5628, -6512, -7421, -8353, -9304, -10273, -11256, -12252, -13256, -14267, -15281, -16294, -17305, -18309, -19303, -20284, -21249, -22194, -23116, - -24013, -24880, -25715, -26515, -27277, -27999, -28677, -29310, -29896, -30432, -30916, -31344, -31718, -32037, -32299, -32503, -32650, -32738, -32768, -32739, - -32652, -32508, -32308, -32052, -31742, -31379, -30966, -30504, -29994, -29440, -28844, -28207, -27533, -26825, -26085, -25316, -24521, -23703, -22865, -22010, - -21141, -20262, 19377, 18482, 17587, 16693, 15804, 14921, 14049, 13188, 12342, 11512, 10702, 9913, 9147, 8405, 7690, 7003, 6344, 5716, 5118, 4552, 4017, 3514, - 3043, 2603, 2195, 1817, 1468, 1149, 856, 590, 348, 127, -58, -207, -337, -448, -542, -620, -683, -733, -769, -793, -806, -808, -800, -784, -760, -729, -692, -651, - -605, -556, -505, -452, -400, -348, -297, -249, -203, -162, -124, -91, -62, -35, -}; - -const Word16 LDQMF_40_fx[] = // q = 15 sf = 15391 qsf = 14 -{ - 3, 4, 4, 4, 3, 2, 1, 0, 0, -1, -2, -4, -5, -6, -7, -9, -10, -11, -11, -12, -13, -13, -13, -13, -14, -14, -14, -14, -14, -14, -14, -14, -15, -16, -16, -18, -19, -20, - -22, -24, -27, -30, -33, -36, -39, -42, -46, -49, -52, -55, -58, -60, -63, -65, -67, -68, -69, -70, -70, -70, -69, -68, -66, -64, -61, -58, -55, -51, -46, -41, -36, - -30, -24, -18, -11, -5, 1, 9, 16, 23, -32, -39, -47, -55, -63, -71, -78, -86, -93, -101, -108, -115, -122, -128, -135, -141, -147, -153, -159, -165, -170, -175, -180, - -185, -189, -193, -197, -201, -205, -208, -211, -214, -217, -219, -222, -224, -226, -228, -230, -232, -234, -236, -239, -241, -243, -246, -249, -252, -256, -260, -264, - -268, -273, -279, -284, -290, -296, -302, -309, -315, -322, -328, -335, -340, -346, -350, -354, -357, -359, -360, -358, -356, -351, -344, -335, -323, -308, -291, -270, - -245, 217, 185, 149, 109, 64, 15, -38, -97, -161, -230, -304, -384, -469, -559, -655, -755, -861, -973, -1089, -1210, -1336, -1467, -1602, -1741, -1884, -2030, -2180, - -2333, -2487, -2644, -2802, -2962, -3121, -3281, -3439, -3596, -3751, -3903, -4052, -4196, -4335, -4468, -4595, -4714, -4824, -4925, -5016, -5096, -5163, -5218, -5259, - -5286, -5297, -5292, -5269, -5229, -5170, -5091, -4993, -4873, -4732, -4569, -4384, -4175, -3943, -3687, -3407, -3103, -2774, -2420, -2041, -1638, -1210, -758, -281, - 218, 743, 1290, 1860, 2452, -3065, -3699, -4352, -5025, -5715, -6423, -7146, -7884, -8636, -9400, -10175, -10960, -11753, -12552, -13357, -14166, -14976, -15788, -16598, - -17406, -18209, -19006, -19795, -20575, -21344, -22101, -22842, -23568, -24276, -24965, -25633, -26279, -26901, -27498, -28069, -28612, -29126, -29610, -30062, -30483, - -30870, -31222, -31539, -31820, -32066, -32276, -32448, -32584, -32683, -32744, -32768, -32754, -32703, -32615, -32491, -32330, -32135, -31904, -31639, -31341, -31010, - -30648, -30255, -29833, -29383, -28905, -28402, -27875, -27325, -26753, -26160, -25550, -24921, -24278, -23620, -22950, -22268, -21577, -20879, -20174, 19467, 18751, - 18035, 17319, 16604, 15892, 15185, 14484, 13789, 13103, 12426, 11759, 11105, 10463, 9835, 9222, 8625, 8045, 7481, 6936, 6409, 5901, 5413, 4945, 4497, 4069, 3662, 3275, - 2908, 2561, 2234, 1927, 1639, 1370, 1118, 884, 667, 466, 279, 107, -41, -164, -274, -372, -458, -533, -598, -654, -700, -737, -766, -787, -801, -807, -807, -801, -790, - -773, -751, -726, -696, -664, -628, -590, -551, -510, -468, -426, -384, -343, -302, -263, -226, -191, -158, -127, -100, -76, -54, -32, -}; - -const Word16 LDQMF_60_fx[] = // q = 15 sf = 15391 qsf = 14 -{ - 3, 4, 4, 4, 4, 3, 3, 3, 2, 1, 1, 0, 0, -1, -1, -2, -3, -4, -5, -6, -6, -7, -8, -9, -9, -10, -11, -11, -12, -12, -12, -13, -13, -13, -13, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -15, -15, -16, -16, -17, -18, -19, -20, -21, -22, -23, -25, -26, -28, -30, -32, -34, -36, -39, -41, -43, -45, -47, -49, -51, -53, -55, -57, -59, - -61, -62, -64, -65, -66, -67, -68, -69, -70, -70, -70, -70, -70, -69, -69, -68, -67, -65, -64, -62, -60, -58, -55, -53, -50, -47, -44, -40, -37, -33, -29, -25, -21, -17, -13, - -8, -3, 0, 5, 10, 15, 20, 25, -30, -36, -41, -46, -51, -57, -62, -67, -72, -77, -82, -87, -92, -97, -102, -107, -111, -116, -121, -125, -129, -134, -138, -142, -146, -150, - -154, -158, -162, -166, -169, -173, -176, -179, -182, -186, -189, -191, -194, -197, -199, -202, -204, -207, -209, -211, -213, -215, -216, -218, -220, -221, -223, -224, -226, - -227, -229, -230, -231, -233, -234, -235, -237, -238, -240, -241, -243, -245, -247, -249, -251, -253, -255, -258, -260, -263, -266, -269, -273, -276, -280, -283, -287, -291, - -295, -299, -304, -308, -312, -317, -321, -325, -329, -334, -337, -341, -345, -348, -351, -354, -356, -358, -359, -360, -359, -359, -357, -355, -352, -348, -343, -337, -329, - -321, -311, -300, -287, -273, -258, -241, 222, 202, 180, 156, 130, 102, 72, 40, 6, -29, -67, -107, -150, -195, -242, -292, -344, -398, -454, -513, -575, -638, -704, -773, -843, - -916, -992, -1069, -1149, -1231, -1315, -1401, -1489, -1579, -1671, -1765, -1860, -1957, -2055, -2155, -2256, -2358, -2462, -2566, -2671, -2776, -2882, -2988, -3095, -3201, - -3307, -3413, -3518, -3622, -3726, -3828, -3929, -4028, -4125, -4220, -4313, -4403, -4490, -4574, -4655, -4733, -4806, -4876, -4941, -5002, -5057, -5108, -5153, -5193, -5226, - -5254, -5275, -5289, -5297, -5297, -5289, -5275, -5252, -5221, -5181, -5133, -5077, -5011, -4936, -4851, -4757, -4654, -4540, -4416, -4283, -4138, -3984, -3818, -3642, -3456, - -3258, -3050, -2830, -2600, -2359, -2106, -1843, -1569, -1283, -987, -680, -362, -34, 304, 654, 1013, 1383, 1763, 2153, 2553, -2962, -3380, -3807, -4242, -4687, -5139, -5599, - -6067, -6543, -7025, -7514, -8009, -8510, -9017, -9529, -10046, -10567, -11092, -11620, -12152, -12687, -13223, -13762, -14301, -14842, -15383, -15924, -16464, -17003, -17541, - -18076, -18609, -19139, -19665, -20187, -20705, -21218, -21725, -22226, -22721, -23208, -23688, -24160, -24624, -25079, -25524, -25960, -26386, -26800, -27204, -27596, -27977, - -28345, -28701, -29043, -29373, -29688, -29990, -30278, -30552, -30810, -31052, -31278, -31489, -31685, -31865, -32029, -32177, -32308, -32424, -32522, -32605, -32670, -32719, - -32752, -32768, -32767, -32749, -32715, -32665, -32598, -32515, -32416, -32302, -32171, -32025, -31863, -31687, -31495, -31289, -31068, -30834, -30585, -30324, -30049, -29761, - -29461, -29148, -28824, -28489, -28143, -27786, -27419, -27042, -26656, -26262, -25858, -25447, -25028, -24603, -24170, -23732, -23287, -22838, -22383, -21925, -21462, -20997, - -20528, -20057, 19586, 19110, 18633, 18155, 17677, 17200, 16724, 16248, 15775, 15303, 14834, 14368, 13905, 13445, 12990, 12538, 12092, 11650, 11214, 10783, 10358, 9939, 9527, - 9122, 8724, 8333, 7950, 7574, 7207, 6847, 6496, 6153, 5819, 5493, 5177, 4869, 4570, 4281, 4000, 3728, 3466, 3212, 2968, 2732, 2505, 2287, 2078, 1878, 1686, 1502, 1326, 1159, - 999, 847, 702, 565, 434, 310, 191, 80, -19, -105, -183, -257, -324, -387, -444, -497, -545, -588, -627, -662, -693, -719, -742, -762, -777, -790, -799, -805, -808, -808, -805, - -800, -792, -782, -770, -755, -739, -721, -701, -680, -658, -634, -609, -584, -557, -530, -503, -475, -447, -419, -391, -363, -336, -309, -283, -257, -232, -208, -185, -163, - -142, -123, -104, -88, -72, -57, -44, -28, -}; - -const Word32 rot_vec_delay_re_LDQMF_fx[60] = // q = 31 -{ - -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, - 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, - -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, - 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, - -1518500224, 1518500224, 1518500224, -1518500224 -}; - -const Word32 rot_vec_delay_im_LDQMF_fx[60] = // q = 31 -{ - -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, - 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, - -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, - 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, - -1518500224, -1518500224, 1518500224, 1518500224 -}; - -const Word32 rot_vec_ana_re_L10_fx[5] = // q = 29 -{ - 1517329536, 1424643840, 1192503936, 843633536, 412182400 -}; - -const Word32 rot_vec_ana_im_L10_fx[5] = // q = 29 -{ - -59616040, -525578848, -940094336, -1262586752, -1461488512 -}; - -const Word32 rot_vec_ana_re_L16_fx[8] = // q = 29 -{ - 1200118272, 1171310720, 1097490432, 981494080, 827779520, 642253888, 432046752, 205236304 -}; - -const Word32 rot_vec_ana_im_L16_fx[8] = // q = 29 -{ - -29461250, -263026624, -486484032, -691246144, -869444032, -1014229696, -1120039040, -1182806016 -}; - -const Word32 rot_vec_ana_re_L20_fx[10] = // q = 29 -{ - 1073534848, 1057019968, 1014477760, 946955776, 856116544, 744196864, 613952640, 468590848, 311690784, 147115888 -}; - -const Word32 rot_vec_ana_im_L20_fx[10] = // q = 29 -{ - -21081516, -188759824, -351790240, -506158400, -648063232, -774010624, -880899328, -966097344, -1027506880, -1063615744 -}; - -const Word32 rot_vec_ana_re_L30_fx[15] = // q = 29 -{ - 876631424, 870629568, 855088960, 830179840, 796175040, 753447232, 702464448, 643785344, 578052800, 505986944, 428377440, 346074528, 259979936, 171036960, 80220064 -}; - -const Word32 rot_vec_ana_im_L30_fx[15] = // q = 29 -{ - -11475734, -103045800, -193486880, -281808064, -367041728, -448253984, -524555072, -595109056, -659142848, -715955008, -764922944, -805510272, -837272192, -859860864, -873028672 -}; - -const Word32 rot_vec_ana_re_L32_fx[16] = // q = 29 -{ - 848803520, 843695296, 830461760, 809230464, 780205824, 743667392, 699967040, 649525568, 592828864, 530422880, 462908640, 390936320, 315199072, 236426304, 155376608, 72830544 -}; - -const Word32 rot_vec_ana_im_L32_fx[16] = // q = 29 -{ - -10416909, -93564040, -175810112, -256363024, -334447008, -409310112, -480231328, -546527616, -607560576, -662742400, -711541696, -753488384, -788178560, -815278208, -834526272, -845737344 -}; - -const Word32 rot_vec_ana_re_L40_fx[20] = // q = 29 -{ - 759213504, 756288320, 748700352, 736496320, 719751616, 698569408, 673080256, 643441344, 609835392, 572469632, 531574400, 487401824, 440224256, 390332576, 338034336, - 283652032, 227520896, 169987024, 111405128, 52136384 -}; - -const Word32 rot_vec_ana_im_L40_fx[20] = // q = 29 -{ - -7453801, -66998032, -126129192, -184482736, -241698864, -297424864, -351317120, -403043392, -452284768, -498737664, -542115648, -582151360, -618597888, -651230528, - -679848192, -704274304, -724358336, -739976448, -751032384, -757457984 -}; - -const Word32 rot_vec_ana_re_L60_fx[30] = // q = 29 -{ - 619911872, 618849920, 616091776, 611644992, 605521728, 597738752, 588317440, 577283520, 564667392, 550503488, 534830720, 517692032, 499134368, 479208608, 457969376, 435474880, 411786784, - 386970016, 361092576, 334225408, 306442144, 277818944, 248434272, 218368656, 187704512, 156525872, 124918216, 92968160, 60763288, 28391868 -}; - -const Word32 rot_vec_ana_im_L60_fx[30] = // q = 29 -{ - -4057371, -36495492, -68833576, -100983000, -132855632, -164364112, -195422080, -225944416, -255847456, -285049248, -313469728, -341030976, -367657536, -393276352, -417817216, -441212864, - -463399200, -484315392, -503904096, -522111616, -538888128, -554187520, -567967936, -580191616, -590825024, -599838976, -607208896, -612914432, -616940032, -619274624 -}; - - -/*! - * \brief CLDFB prototype filter - * - * cldfb bands: 10 - * delay[ms]: 1.00 - * abs. max Val: 1.04 - * scale: 0.50 - */ -const Word16 CLDFB80_10[] =//Q.5 -{ - W16(0x0000), W16(0xfffc), W16(0xffdf), W16(0x0132), W16(0x23b5), - W16(0x0000), W16(0xffff), W16(0xfff3), W16(0x018d), W16(0x2a98), - W16(0x0000), W16(0x0000), W16(0x0006), W16(0x020d), W16(0x3116), - W16(0x0000), W16(0x0000), W16(0x001a), W16(0x02bd), W16(0x36e2), - W16(0x0000), W16(0x0000), W16(0x001c), W16(0x039f), W16(0x3bb5), - W16(0x0000), W16(0xffff), W16(0x001a), W16(0x04b1), W16(0x3f51), - W16(0x0000), W16(0x0000), W16(0x0024), W16(0x05da), W16(0x419a), - W16(0x0000), W16(0x0000), W16(0x002e), W16(0x06ee), W16(0x428c), - W16(0x0000), W16(0x0000), W16(0x0032), W16(0x07bd), W16(0x4267), - W16(0x0000), W16(0xfffc), W16(0x001b), W16(0x0820), W16(0x410b), - W16(0x0000), W16(0xfff0), W16(0xffe9), W16(0x0806), W16(0x3d82), - W16(0x0000), W16(0xfffe), W16(0xffe6), W16(0x0746), W16(0x37fe), - W16(0x0000), W16(0x0000), W16(0x000d), W16(0x05ae), W16(0x31d1), - W16(0x0000), W16(0x0000), W16(0x002a), W16(0x032f), W16(0x2b60), - W16(0x0000), W16(0xfffd), W16(0x0025), W16(0xffcd), W16(0x24a3), - W16(0x0000), W16(0x0003), W16(0x0004), W16(0xfb88), W16(0x1dc0), - W16(0x0000), W16(0x0000), W16(0xffca), W16(0xf66f), W16(0x16c9), - W16(0x0000), W16(0x0000), W16(0xff95), W16(0xf09a), W16(0x0fe8), - W16(0x0000), W16(0xffff), W16(0xff64), W16(0xea2a), W16(0x08e0), - W16(0x0000), W16(0x0012), W16(0xff21), W16(0xe34c), W16(0x02aa) -}; - -/*! - * \brief CLDFB prototype filter - * - * cldfb bands: 16 - * delay[ms]: 1.00 - * abs. max Val: 1.04 - * scale: 0.50 - */ -const Word16 CLDFB80_16[] =//Q.5 -{ - W16(0x0000), W16(0xfffb), W16(0xffdd), W16(0x0123), W16(0x2266), - W16(0x0000), W16(0xfffe), W16(0xffe7), W16(0x0157), W16(0x26c0), - W16(0x0000), W16(0xffff), W16(0xfff4), W16(0x0194), W16(0x2b04), - W16(0x0000), W16(0xffff), W16(0xfffe), W16(0x01e0), W16(0x2f1f), - W16(0x0000), W16(0x0000), W16(0x000c), W16(0x023f), W16(0x32fc), - W16(0x0000), W16(0x0000), W16(0x0019), W16(0x02b0), W16(0x368c), - W16(0x0000), W16(0x0000), W16(0x001d), W16(0x0336), W16(0x39bc), - W16(0x0000), W16(0x0001), W16(0x0013), W16(0x03cf), W16(0x3c7b), - W16(0x0000), W16(0x0001), W16(0x001a), W16(0x047b), W16(0x3ebd), - W16(0x0000), W16(0x0000), W16(0x001e), W16(0x0532), W16(0x407c), - W16(0x0000), W16(0x0000), W16(0x0025), W16(0x05ec), W16(0x41b3), - W16(0x0000), W16(0xffff), W16(0x002d), W16(0x069d), W16(0x4262), - W16(0x0000), W16(0x0000), W16(0x0031), W16(0x0738), W16(0x429c), - W16(0x0000), W16(0x0000), W16(0x0032), W16(0x07b3), W16(0x4271), - W16(0x0000), W16(0xffff), W16(0x002a), W16(0x0804), W16(0x41d1), - W16(0x0000), W16(0xfff9), W16(0x0015), W16(0x0824), W16(0x40a3), - W16(0x0000), W16(0xffec), W16(0xffee), W16(0x0815), W16(0x3e6c), - W16(0x0000), W16(0xfff7), W16(0xffe0), W16(0x07ca), W16(0x3b3b), - W16(0x0000), W16(0xfffd), W16(0xffe8), W16(0x0734), W16(0x379e), - W16(0x0000), W16(0xfffe), W16(0x0000), W16(0x0647), W16(0x33c7), - W16(0x0000), W16(0xffff), W16(0x0018), W16(0x04ff), W16(0x2fd6), - W16(0x0000), W16(0x0000), W16(0x0029), W16(0x035e), W16(0x2bca), - W16(0x0000), W16(0xffff), W16(0x002b), W16(0x0164), W16(0x279c), - W16(0x0000), W16(0x0001), W16(0x0022), W16(0xff11), W16(0x235b), - W16(0x0000), W16(0xfffc), W16(0x000f), W16(0xfc66), W16(0x1f0d), - W16(0x0000), W16(0x0001), W16(0xffec), W16(0xf966), W16(0x1ab4), - W16(0x0000), W16(0x0000), W16(0xffc6), W16(0xf617), W16(0x165a), - W16(0x0000), W16(0x0001), W16(0xffa5), W16(0xf27f), W16(0x120e), - W16(0x0000), W16(0x0001), W16(0xff86), W16(0xeea6), W16(0x0dbd), - W16(0x0000), W16(0x0001), W16(0xff67), W16(0xea95), W16(0x0950), - W16(0x0000), W16(0x0005), W16(0xff40), W16(0xe657), W16(0x051a), - W16(0x0000), W16(0x001b), W16(0xff12), W16(0xe1fc), W16(0x01c8) -}; - -/*! - * \brief CLDFB prototype filter - * - * cldfb bands: 20 - * delay[ms]: 1.00 - * abs. max Val: 1.04 - * scale: 0.50 - */ -const Word16 CLDFB80_20[] =//Q.5 -{ - W16(0x0000), W16(0xfffb), W16(0xffdf), W16(0x011e), W16(0x21f7), - W16(0x0000), W16(0xfffd), W16(0xffe1), W16(0x0146), W16(0x2573), - W16(0x0000), W16(0xffff), W16(0xfff2), W16(0x0173), W16(0x28e6), - W16(0x0000), W16(0xffff), W16(0xfff6), W16(0x01a9), W16(0x2c45), - W16(0x0000), W16(0xffff), W16(0xffff), W16(0x01e9), W16(0x2f84), - W16(0x0000), W16(0x0000), W16(0x000a), W16(0x0235), W16(0x329c), - W16(0x0000), W16(0x0000), W16(0x0014), W16(0x028c), W16(0x3583), - W16(0x0000), W16(0x0000), W16(0x001b), W16(0x02f1), W16(0x3831), - W16(0x0000), W16(0x0000), W16(0x001e), W16(0x0362), W16(0x3a9c), - W16(0x0000), W16(0x0001), W16(0x000d), W16(0x03df), W16(0x3cbb), - W16(0x0000), W16(0x0000), W16(0x001b), W16(0x0469), W16(0x3e89), - W16(0x0000), W16(0x0000), W16(0x001c), W16(0x04fb), W16(0x4004), - W16(0x0000), W16(0x0000), W16(0x0020), W16(0x0590), W16(0x4129), - W16(0x0000), W16(0x0000), W16(0x0027), W16(0x0622), W16(0x41f5), - W16(0x0000), W16(0x0000), W16(0x002e), W16(0x06ad), W16(0x426d), - W16(0x0000), W16(0x0000), W16(0x0030), W16(0x072a), W16(0x429b), - W16(0x0000), W16(0x0000), W16(0x0032), W16(0x0792), W16(0x4288), - W16(0x0000), W16(0x0001), W16(0x002e), W16(0x07e1), W16(0x4232), - W16(0x0000), W16(0xfffe), W16(0x0024), W16(0x0813), W16(0x4186), - W16(0x0000), W16(0xfff8), W16(0x0011), W16(0x0825), W16(0x407d), - W16(0x0000), W16(0xffed), W16(0xfff1), W16(0x0818), W16(0x3eb8), - W16(0x0000), W16(0xfff5), W16(0xffe3), W16(0x07e8), W16(0x3c3c), - W16(0x0000), W16(0xfffe), W16(0xffe1), W16(0x0789), W16(0x3977), - W16(0x0000), W16(0xfffd), W16(0xffee), W16(0x06f6), W16(0x367b), - W16(0x0000), W16(0xfffe), W16(0x0002), W16(0x062a), W16(0x3363), - W16(0x0000), W16(0xffff), W16(0x0016), W16(0x0524), W16(0x303c), - W16(0x0000), W16(0x0000), W16(0x0026), W16(0x03e4), W16(0x2d04), - W16(0x0000), W16(0x0000), W16(0x002d), W16(0x026c), W16(0x29b7), - W16(0x0000), W16(0xfffe), W16(0x0029), W16(0x00bb), W16(0x2657), - W16(0x0000), W16(0x0005), W16(0x0021), W16(0xfed0), W16(0x22ed), - W16(0x0000), W16(0xfff8), W16(0x0014), W16(0xfcae), W16(0x1f7c), - W16(0x0000), W16(0x0002), W16(0xfff7), W16(0xfa55), W16(0x1c03), - W16(0x0000), W16(0x0000), W16(0xffd8), W16(0xf7c8), W16(0x1886), - W16(0x0000), W16(0x0001), W16(0xffbc), W16(0xf50a), W16(0x150f), - W16(0x0000), W16(0x0001), W16(0xffa2), W16(0xf21f), W16(0x11a0), - W16(0x0000), W16(0x0001), W16(0xff89), W16(0xef0b), W16(0x0e2c), - W16(0x0000), W16(0x0001), W16(0xff71), W16(0xebd2), W16(0x0aa5), - W16(0x0000), W16(0xfffe), W16(0xff55), W16(0xe87a), W16(0x0724), - W16(0x0000), W16(0x0006), W16(0xff33), W16(0xe50a), W16(0x03fd), - W16(0x0000), W16(0x001e), W16(0xff0d), W16(0xe18b), W16(0x017f) -}; - -/*! - * \brief CLDFB prototype filter - * - * cldfb bands: 32 - * delay[ms]: 1.00 - * abs. max Val: 1.04 - * scale: 0.50 - */ -const Word16 CLDFB80_32[] =//Q.5 -{ - W16(0x0000), W16(0xfffb), W16(0xffe2), W16(0x0115), W16(0x214f), - W16(0x0000), W16(0xfffc), W16(0xffde), W16(0x012f), W16(0x237e), - W16(0x0000), W16(0xfffd), W16(0xffe2), W16(0x0149), W16(0x25ab), - W16(0x0000), W16(0xfffe), W16(0xffec), W16(0x0165), W16(0x27d4), - W16(0x0000), W16(0xffff), W16(0xfff4), W16(0x0183), W16(0x29f6), - W16(0x0000), W16(0xffff), W16(0xfff6), W16(0x01a6), W16(0x2c10), - W16(0x0000), W16(0xffff), W16(0xfffb), W16(0x01cc), W16(0x2e1d), - W16(0x0000), W16(0xffff), W16(0x0001), W16(0x01f6), W16(0x301c), - W16(0x0000), W16(0x0000), W16(0x0009), W16(0x0226), W16(0x320b), - W16(0x0000), W16(0x0000), W16(0x000f), W16(0x025a), W16(0x33e7), - W16(0x0000), W16(0x0000), W16(0x0015), W16(0x0292), W16(0x35b0), - W16(0x0000), W16(0x0000), W16(0x001b), W16(0x02d0), W16(0x3761), - W16(0x0000), W16(0x0000), W16(0x001d), W16(0x0313), W16(0x38fa), - W16(0x0000), W16(0x0000), W16(0x001e), W16(0x035a), W16(0x3a77), - W16(0x0000), W16(0x0000), W16(0x001b), W16(0x03a7), W16(0x3bd7), - W16(0x0000), W16(0x0000), W16(0x0004), W16(0x03f7), W16(0x3d18), - W16(0x0000), W16(0xffff), W16(0x001b), W16(0x044e), W16(0x3e38), - W16(0x0000), W16(0xffff), W16(0x001a), W16(0x04a8), W16(0x3f39), - W16(0x0000), W16(0x0000), W16(0x001c), W16(0x0504), W16(0x4018), - W16(0x0000), W16(0x0001), W16(0x001f), W16(0x0561), W16(0x40d6), - W16(0x0000), W16(0x0000), W16(0x0022), W16(0x05be), W16(0x4172), - W16(0x0000), W16(0x0000), W16(0x0027), W16(0x0619), W16(0x41eb), - W16(0x0000), W16(0xffff), W16(0x002c), W16(0x0672), W16(0x4242), - W16(0x0000), W16(0x0000), W16(0x002e), W16(0x06c6), W16(0x427b), - W16(0x0000), W16(0x0000), W16(0x002f), W16(0x0714), W16(0x4297), - W16(0x0000), W16(0x0000), W16(0x0031), W16(0x075a), W16(0x429a), - W16(0x0000), W16(0x0000), W16(0x0032), W16(0x0798), W16(0x4285), - W16(0x0000), W16(0x0001), W16(0x0031), W16(0x07cb), W16(0x4255), - W16(0x0000), W16(0xffff), W16(0x002c), W16(0x07f4), W16(0x4206), - W16(0x0000), W16(0xfffe), W16(0x0025), W16(0x0811), W16(0x4193), - W16(0x0000), W16(0xfffb), W16(0x001a), W16(0x0821), W16(0x40fa), - W16(0x0000), W16(0xfff5), W16(0x000b), W16(0x0823), W16(0x404a), - W16(0x0000), W16(0xfff0), W16(0xfff6), W16(0x081b), W16(0x3f2f), - W16(0x0000), W16(0xffef), W16(0xffe9), W16(0x0809), W16(0x3daa), - W16(0x0000), W16(0xfff5), W16(0xffe2), W16(0x07e4), W16(0x3c12), - W16(0x0000), W16(0xfffa), W16(0xffe0), W16(0x07ac), W16(0x3a5c), - W16(0x0000), W16(0xffff), W16(0xffe4), W16(0x0761), W16(0x388d), - W16(0x0000), W16(0xfffd), W16(0xffed), W16(0x0701), W16(0x36ac), - W16(0x0000), W16(0xfffe), W16(0xfff9), W16(0x068a), W16(0x34c0), - W16(0x0000), W16(0xffff), W16(0x0006), W16(0x05fd), W16(0x32cd), - W16(0x0000), W16(0x0000), W16(0x0013), W16(0x0559), W16(0x30d4), - W16(0x0000), W16(0x0000), W16(0x001d), W16(0x049f), W16(0x2ed6), - W16(0x0000), W16(0x0000), W16(0x0026), W16(0x03cf), W16(0x2cd0), - W16(0x0000), W16(0x0000), W16(0x002c), W16(0x02e8), W16(0x2ac1), - W16(0x0000), W16(0x0000), W16(0x002c), W16(0x01eb), W16(0x28aa), - W16(0x0000), W16(0xfffe), W16(0x0029), W16(0x00d7), W16(0x268d), - W16(0x0000), W16(0xfffd), W16(0x0024), W16(0xffae), W16(0x246c), - W16(0x0000), W16(0x000a), W16(0x0021), W16(0xfe6e), W16(0x2248), - W16(0x0000), W16(0xfff3), W16(0x001a), W16(0xfd19), W16(0x2022), - W16(0x0000), W16(0x0003), W16(0x0006), W16(0xfbad), W16(0x1df8), - W16(0x0000), W16(0x0002), W16(0xfff5), W16(0xfa2d), W16(0x1bcb), - W16(0x0000), W16(0xffff), W16(0xffe2), W16(0xf899), W16(0x199d), - W16(0x0000), W16(0x0001), W16(0xffcf), W16(0xf6f2), W16(0x1770), - W16(0x0000), W16(0x0001), W16(0xffbd), W16(0xf537), W16(0x1546), - W16(0x0000), W16(0x0001), W16(0xffad), W16(0xf36b), W16(0x1320), - W16(0x0000), W16(0x0000), W16(0xff9d), W16(0xf18e), W16(0x10fc), - W16(0x0000), W16(0x0001), W16(0xff8e), W16(0xefa2), W16(0x0ed3), - W16(0x0000), W16(0x0001), W16(0xff7f), W16(0xeda7), W16(0x0ca3), - W16(0x0000), W16(0x0001), W16(0xff6f), W16(0xeb9e), W16(0x0a6c), - W16(0x0000), W16(0xfffd), W16(0xff5e), W16(0xe989), W16(0x0837), - W16(0x0000), W16(0x0003), W16(0xff4b), W16(0xe769), W16(0x0618), - W16(0x0000), W16(0x0006), W16(0xff35), W16(0xe542), W16(0x042a), - W16(0x0000), W16(0x0013), W16(0xff1e), W16(0xe314), W16(0x0284), - W16(0x0000), W16(0x0020), W16(0xff06), W16(0xe0e2), W16(0x010c) -}; - -/*! - * \brief CLDFB prototype filter - * - * cldfb bands: 40 - * delay[ms]: 1.00 - * abs. max Val: 1.04 - * scale: 0.50 - */ -const Word16 CLDFB80_40[] =//Q.5 -{ - W16(0x0000), W16(0xfffa), W16(0xffe2), W16(0x0112), W16(0x2117), - W16(0x0000), W16(0xfffb), W16(0xffdc), W16(0x0128), W16(0x22d6), - W16(0x0000), W16(0xfffc), W16(0xffe0), W16(0x013c), W16(0x2494), - W16(0x0000), W16(0xfffe), W16(0xffe5), W16(0x0151), W16(0x2651), - W16(0x0000), W16(0xffff), W16(0xffed), W16(0x0167), W16(0x280b), - W16(0x0000), W16(0xffff), W16(0xfff4), W16(0x0180), W16(0x29c0), - W16(0x0000), W16(0xffff), W16(0xfff4), W16(0x019b), W16(0x2b6f), - W16(0x0000), W16(0xffff), W16(0xfff8), W16(0x01b8), W16(0x2d18), - W16(0x0000), W16(0xffff), W16(0xfffd), W16(0x01d8), W16(0x2eb8), - W16(0x0000), W16(0xffff), W16(0x0002), W16(0x01fb), W16(0x304e), - W16(0x0000), W16(0x0000), W16(0x0008), W16(0x0221), W16(0x31da), - W16(0x0000), W16(0x0000), W16(0x000d), W16(0x0249), W16(0x335a), - W16(0x0000), W16(0x0000), W16(0x0013), W16(0x0275), W16(0x34ce), - W16(0x0000), W16(0x0000), W16(0x0017), W16(0x02a4), W16(0x3634), - W16(0x0000), W16(0x0000), W16(0x001b), W16(0x02d6), W16(0x378b), - W16(0x0000), W16(0x0000), W16(0x001d), W16(0x030c), W16(0x38d3), - W16(0x0000), W16(0x0000), W16(0x001e), W16(0x0344), W16(0x3a08), - W16(0x0000), W16(0x0000), W16(0x001e), W16(0x0380), W16(0x3b2b), - W16(0x0000), W16(0x0000), W16(0x0017), W16(0x03bf), W16(0x3c3b), - W16(0x0000), W16(0xffff), W16(0x0002), W16(0x03ff), W16(0x3d36), - W16(0x0000), W16(0xffff), W16(0x001a), W16(0x0445), W16(0x3e1d), - W16(0x0000), W16(0x0000), W16(0x001a), W16(0x048d), W16(0x3eef), - W16(0x0000), W16(0x0000), W16(0x001b), W16(0x04d6), W16(0x3fad), - W16(0x0000), W16(0x0000), W16(0x001d), W16(0x0520), W16(0x4055), - W16(0x0000), W16(0x0001), W16(0x001f), W16(0x056a), W16(0x40e8), - W16(0x0000), W16(0xffff), W16(0x0021), W16(0x05b5), W16(0x4164), - W16(0x0000), W16(0x0000), W16(0x0026), W16(0x05fe), W16(0x41ca), - W16(0x0000), W16(0x0000), W16(0x0029), W16(0x0646), W16(0x421b), - W16(0x0000), W16(0xffff), W16(0x002d), W16(0x068c), W16(0x4256), - W16(0x0000), W16(0x0000), W16(0x002e), W16(0x06ce), W16(0x427f), - W16(0x0000), W16(0x0000), W16(0x002f), W16(0x070c), W16(0x4295), - W16(0x0000), W16(0x0000), W16(0x0031), W16(0x0746), W16(0x429c), - W16(0x0000), W16(0x0000), W16(0x0032), W16(0x077a), W16(0x4293), - W16(0x0000), W16(0x0000), W16(0x0032), W16(0x07a8), W16(0x427a), - W16(0x0000), W16(0x0001), W16(0x0030), W16(0x07d0), W16(0x424f), - W16(0x0000), W16(0xffff), W16(0x002d), W16(0x07f0), W16(0x4210), - W16(0x0000), W16(0xffff), W16(0x0028), W16(0x080a), W16(0x41ba), - W16(0x0000), W16(0xfffd), W16(0x001f), W16(0x081b), W16(0x414b), - W16(0x0000), W16(0xfffa), W16(0x0018), W16(0x0824), W16(0x40c6), - W16(0x0000), W16(0xfff4), W16(0x0009), W16(0x0822), W16(0x403a), - W16(0xffff), W16(0xfff1), W16(0xfff9), W16(0x081c), W16(0x3f57), - W16(0x0000), W16(0xffed), W16(0xffec), W16(0x0810), W16(0x3e1f), - W16(0x0000), W16(0xfff3), W16(0xffe6), W16(0x07f9), W16(0x3ce2), - W16(0x0000), W16(0xfff6), W16(0xffe1), W16(0x07d5), W16(0x3b92), - W16(0x0000), W16(0xfffb), W16(0xffe0), W16(0x07a6), W16(0x3a2f), - W16(0x0000), W16(0xffff), W16(0xffe3), W16(0x076a), W16(0x38bc), - W16(0x0000), W16(0xfffd), W16(0xffea), W16(0x0720), W16(0x373e), - W16(0x0000), W16(0xfffd), W16(0xfff3), W16(0x06c8), W16(0x35b7), - W16(0x0000), W16(0xfffe), W16(0xfffd), W16(0x0662), W16(0x342a), - W16(0x0000), W16(0xffff), W16(0x0008), W16(0x05ee), W16(0x329a), - W16(0x0000), W16(0x0000), W16(0x0011), W16(0x056b), W16(0x3107), - W16(0x0000), W16(0xffff), W16(0x001a), W16(0x04d9), W16(0x2f70), - W16(0x0000), W16(0x0000), W16(0x0022), W16(0x043a), W16(0x2dd4), - W16(0x0000), W16(0x0000), W16(0x0028), W16(0x038c), W16(0x2c33), - W16(0x0000), W16(0x0000), W16(0x002c), W16(0x02cf), W16(0x2a8c), - W16(0x0000), W16(0x0001), W16(0x002d), W16(0x0205), W16(0x28e0), - W16(0x0000), W16(0xffff), W16(0x002b), W16(0x012c), W16(0x2730), - W16(0x0000), W16(0xfffd), W16(0x0027), W16(0x0045), W16(0x257d), - W16(0x0000), W16(0xffff), W16(0x0023), W16(0xff50), W16(0x23c8), - W16(0x0000), W16(0x000a), W16(0x0021), W16(0xfe4d), W16(0x2211), - W16(0x0000), W16(0xfff3), W16(0x001c), W16(0xfd3c), W16(0x2059), - W16(0x0000), W16(0x0000), W16(0x000b), W16(0xfc1c), W16(0x1e9e), - W16(0x0000), W16(0x0003), W16(0xfffd), W16(0xfaf0), W16(0x1ce2), - W16(0x0000), W16(0x0001), W16(0xffef), W16(0xf9b6), W16(0x1b24), - W16(0x0000), W16(0xfffe), W16(0xffe0), W16(0xf870), W16(0x1965), - W16(0x0000), W16(0x0001), W16(0xffd1), W16(0xf71d), W16(0x17a7), - W16(0x0000), W16(0x0000), W16(0xffc3), W16(0xf5be), W16(0x15ec), - W16(0x0000), W16(0x0001), W16(0xffb5), W16(0xf453), W16(0x1433), - W16(0x0000), W16(0x0001), W16(0xffa8), W16(0xf2de), W16(0x127c), - W16(0x0000), W16(0x0000), W16(0xff9b), W16(0xf15e), W16(0x10c5), - W16(0x0000), W16(0x0001), W16(0xff8f), W16(0xefd4), W16(0x0f0b), - W16(0x0000), W16(0x0001), W16(0xff83), W16(0xee40), W16(0x0d4c), - W16(0x0000), W16(0x0001), W16(0xff77), W16(0xeca4), W16(0x0b88), - W16(0x0000), W16(0x0001), W16(0xff6a), W16(0xeaff), W16(0x09c2), - W16(0x0000), W16(0xfffd), W16(0xff5d), W16(0xe953), W16(0x0800), - W16(0x0000), W16(0x0002), W16(0xff4d), W16(0xe7a0), W16(0x064d), - W16(0x0000), W16(0x0006), W16(0xff3c), W16(0xe5e8), W16(0x04b8), - W16(0x0000), W16(0x0009), W16(0xff2a), W16(0xe42c), W16(0x034d), - W16(0x0000), W16(0x0018), W16(0xff17), W16(0xe26c), W16(0x0212), - W16(0x0001), W16(0x0020), W16(0xff03), W16(0xe0aa), W16(0x00e3) -}; - -/*! - * \brief CLDFB prototype filter - * - * cldfb bands: 60 - * delay[ms]: 1.00 - * abs. max Val: 1.04 - * scale: 0.50 - */ -const Word16 CLDFB80_60[] =//Q.5 -{ - W16(0x0000), W16(0xfffa), W16(0xffe2), W16(0x010f), W16(0x20cd), - W16(0x0000), W16(0xfffb), W16(0xffdf), W16(0x011e), W16(0x21f7), - W16(0x0000), W16(0xfffb), W16(0xffdd), W16(0x012b), W16(0x2320), - W16(0x0000), W16(0xfffd), W16(0xffe0), W16(0x0138), W16(0x244a), - W16(0x0000), W16(0xfffd), W16(0xffe1), W16(0x0146), W16(0x2573), - W16(0x0000), W16(0xfffe), W16(0xffe6), W16(0x0155), W16(0x269b), - W16(0x0000), W16(0xfffe), W16(0xffec), W16(0x0164), W16(0x27c1), - W16(0x0000), W16(0xffff), W16(0xfff2), W16(0x0173), W16(0x28e6), - W16(0x0000), W16(0xffff), W16(0xfff4), W16(0x0184), W16(0x2a08), - W16(0x0000), W16(0xffff), W16(0xfff4), W16(0x0196), W16(0x2b28), - W16(0x0000), W16(0xffff), W16(0xfff6), W16(0x01a9), W16(0x2c45), - W16(0x0000), W16(0xffff), W16(0xfff9), W16(0x01bd), W16(0x2d5e), - W16(0x0000), W16(0xffff), W16(0xfffc), W16(0x01d2), W16(0x2e73), - W16(0x0000), W16(0xffff), W16(0xffff), W16(0x01e9), W16(0x2f84), - W16(0x0000), W16(0x0000), W16(0x0003), W16(0x0201), W16(0x3091), - W16(0x0000), W16(0x0000), W16(0x0008), W16(0x021a), W16(0x3199), - W16(0x0000), W16(0x0000), W16(0x000a), W16(0x0235), W16(0x329c), - W16(0x0000), W16(0x0000), W16(0x000e), W16(0x0251), W16(0x3399), - W16(0x0000), W16(0x0000), W16(0x0012), W16(0x026e), W16(0x3491), - W16(0x0000), W16(0x0000), W16(0x0014), W16(0x028c), W16(0x3583), - W16(0x0000), W16(0x0000), W16(0x0018), W16(0x02ac), W16(0x366f), - W16(0x0000), W16(0x0000), W16(0x001b), W16(0x02ce), W16(0x3753), - W16(0x0000), W16(0x0000), W16(0x001b), W16(0x02f1), W16(0x3831), - W16(0x0000), W16(0x0000), W16(0x001d), W16(0x0315), W16(0x3907), - W16(0x0000), W16(0x0000), W16(0x001e), W16(0x033b), W16(0x39d6), - W16(0x0000), W16(0x0000), W16(0x001e), W16(0x0362), W16(0x3a9c), - W16(0x0000), W16(0x0000), W16(0x001d), W16(0x038a), W16(0x3b5a), - W16(0x0000), W16(0x0000), W16(0x0019), W16(0x03b4), W16(0x3c0f), - W16(0x0000), W16(0x0001), W16(0x000d), W16(0x03df), W16(0x3cbb), - W16(0x0000), W16(0xffff), W16(0x0001), W16(0x040a), W16(0x3d5e), - W16(0x0000), W16(0xfffe), W16(0x0017), W16(0x0439), W16(0x3df8), - W16(0x0000), W16(0x0000), W16(0x001b), W16(0x0469), W16(0x3e89), - W16(0x0000), W16(0x0000), W16(0x001a), W16(0x0499), W16(0x3f10), - W16(0x0000), W16(0x0000), W16(0x001a), W16(0x04c9), W16(0x3f8f), - W16(0x0000), W16(0x0000), W16(0x001c), W16(0x04fb), W16(0x4004), - W16(0x0000), W16(0x0000), W16(0x001e), W16(0x052c), W16(0x406f), - W16(0x0000), W16(0x0001), W16(0x001f), W16(0x055e), W16(0x40d1), - W16(0x0000), W16(0x0000), W16(0x0020), W16(0x0590), W16(0x4129), - W16(0x0000), W16(0x0000), W16(0x0022), W16(0x05c1), W16(0x4177), - W16(0x0000), W16(0x0000), W16(0x0025), W16(0x05f2), W16(0x41bb), - W16(0x0000), W16(0x0000), W16(0x0027), W16(0x0622), W16(0x41f5), - W16(0x0000), W16(0xffff), W16(0x002a), W16(0x0652), W16(0x4226), - W16(0x0000), W16(0xffff), W16(0x002c), W16(0x0680), W16(0x424e), - W16(0x0000), W16(0x0000), W16(0x002e), W16(0x06ad), W16(0x426d), - W16(0x0000), W16(0x0000), W16(0x002e), W16(0x06d9), W16(0x4284), - W16(0x0000), W16(0x0000), W16(0x002f), W16(0x0702), W16(0x4293), - W16(0x0000), W16(0x0000), W16(0x0030), W16(0x072a), W16(0x429b), - W16(0x0000), W16(0x0000), W16(0x0031), W16(0x074f), W16(0x429b), - W16(0x0000), W16(0x0000), W16(0x0032), W16(0x0772), W16(0x4295), - W16(0x0000), W16(0x0000), W16(0x0032), W16(0x0792), W16(0x4288), - W16(0x0000), W16(0x0000), W16(0x0032), W16(0x07af), W16(0x4274), - W16(0x0000), W16(0x0001), W16(0x0031), W16(0x07ca), W16(0x4257), - W16(0x0000), W16(0x0001), W16(0x002e), W16(0x07e1), W16(0x4232), - W16(0x0000), W16(0xffff), W16(0x002c), W16(0x07f5), W16(0x4203), - W16(0x0000), W16(0xfffe), W16(0x0029), W16(0x0806), W16(0x41ca), - W16(0x0000), W16(0xfffe), W16(0x0024), W16(0x0813), W16(0x4186), - W16(0x0000), W16(0xfffd), W16(0x001e), W16(0x081d), W16(0x4137), - W16(0x0000), W16(0xfffa), W16(0x0019), W16(0x0823), W16(0x40de), - W16(0x0000), W16(0xfff8), W16(0x0011), W16(0x0825), W16(0x407d), - W16(0xffff), W16(0xfff3), W16(0x0006), W16(0x0821), W16(0x4023), - W16(0xffff), W16(0xfff2), W16(0xfffb), W16(0x081d), W16(0x3f8c), - W16(0x0000), W16(0xffed), W16(0xfff1), W16(0x0818), W16(0x3eb8), - W16(0x0000), W16(0xffee), W16(0xffeb), W16(0x080d), W16(0x3deb), - W16(0x0000), W16(0xfff2), W16(0xffe7), W16(0x07fd), W16(0x3d18), - W16(0x0000), W16(0xfff5), W16(0xffe3), W16(0x07e8), W16(0x3c3c), - W16(0x0000), W16(0xfff7), W16(0xffe0), W16(0x07ce), W16(0x3b58), - W16(0x0000), W16(0xfffa), W16(0xffe0), W16(0x07ae), W16(0x3a6b), - W16(0x0000), W16(0xfffe), W16(0xffe1), W16(0x0789), W16(0x3977), - W16(0x0000), W16(0xffff), W16(0xffe4), W16(0x075e), W16(0x387d), - W16(0x0000), W16(0xfffd), W16(0xffe8), W16(0x072d), W16(0x377e), - W16(0x0000), W16(0xfffd), W16(0xffee), W16(0x06f6), W16(0x367b), - W16(0x0000), W16(0xfffe), W16(0xfff4), W16(0x06b8), W16(0x3575), - W16(0x0000), W16(0xfffe), W16(0xfffb), W16(0x0674), W16(0x346d), - W16(0x0000), W16(0xfffe), W16(0x0002), W16(0x062a), W16(0x3363), - W16(0x0000), W16(0xffff), W16(0x000a), W16(0x05d9), W16(0x3257), - W16(0x0000), W16(0x0000), W16(0x0010), W16(0x0582), W16(0x314b), - W16(0x0000), W16(0xffff), W16(0x0016), W16(0x0524), W16(0x303c), - W16(0x0000), W16(0xffff), W16(0x001b), W16(0x04c0), W16(0x2f2c), - W16(0x0000), W16(0x0000), W16(0x0021), W16(0x0455), W16(0x2e19), - W16(0x0000), W16(0x0000), W16(0x0026), W16(0x03e4), W16(0x2d04), - W16(0x0000), W16(0x0000), W16(0x0029), W16(0x036d), W16(0x2bed), - W16(0x0000), W16(0x0000), W16(0x002c), W16(0x02f0), W16(0x2ad3), - W16(0x0000), W16(0x0000), W16(0x002d), W16(0x026c), W16(0x29b7), - W16(0x0000), W16(0x0000), W16(0x002c), W16(0x01e2), W16(0x2898), - W16(0x0000), W16(0xffff), W16(0x002b), W16(0x0151), W16(0x2778), - W16(0x0000), W16(0xfffe), W16(0x0029), W16(0x00bb), W16(0x2657), - W16(0x0000), W16(0xfffd), W16(0x0026), W16(0x001d), W16(0x2534), - W16(0x0000), W16(0xfffe), W16(0x0024), W16(0xff7a), W16(0x2411), - W16(0x0000), W16(0x0005), W16(0x0021), W16(0xfed0), W16(0x22ed), - W16(0x0000), W16(0x0009), W16(0x0021), W16(0xfe21), W16(0x21c8), - W16(0x0000), W16(0xfff5), W16(0x001f), W16(0xfd6b), W16(0x20a2), - W16(0x0000), W16(0xfff8), W16(0x0014), W16(0xfcae), W16(0x1f7c), - W16(0x0000), W16(0x0001), W16(0x0009), W16(0xfbeb), W16(0x1e54), - W16(0x0000), W16(0x0003), W16(0x0000), W16(0xfb23), W16(0x1d2c), - W16(0x0000), W16(0x0002), W16(0xfff7), W16(0xfa55), W16(0x1c03), - W16(0x0000), W16(0x0001), W16(0xffed), W16(0xf981), W16(0x1ad9), - W16(0x0000), W16(0xffff), W16(0xffe3), W16(0xf8a7), W16(0x19b0), - W16(0x0000), W16(0x0000), W16(0xffd8), W16(0xf7c8), W16(0x1886), - W16(0x0000), W16(0x0001), W16(0xffcf), W16(0xf6e3), W16(0x175d), - W16(0x0000), W16(0x0000), W16(0xffc5), W16(0xf5f9), W16(0x1636), - W16(0x0000), W16(0x0001), W16(0xffbc), W16(0xf50a), W16(0x150f), - W16(0x0000), W16(0x0001), W16(0xffb3), W16(0xf416), W16(0x13e9), - W16(0x0000), W16(0x0001), W16(0xffaa), W16(0xf31d), W16(0x12c5), - W16(0x0000), W16(0x0001), W16(0xffa2), W16(0xf21f), W16(0x11a0), - W16(0x0000), W16(0x0000), W16(0xff99), W16(0xf11d), W16(0x107b), - W16(0x0000), W16(0x0000), W16(0xff91), W16(0xf016), W16(0x0f55), - W16(0x0000), W16(0x0001), W16(0xff89), W16(0xef0b), W16(0x0e2c), - W16(0x0000), W16(0x0001), W16(0xff81), W16(0xedfc), W16(0x0d01), - W16(0x0000), W16(0x0001), W16(0xff79), W16(0xece9), W16(0x0bd4), - W16(0x0000), W16(0x0001), W16(0xff71), W16(0xebd2), W16(0x0aa5), - W16(0x0000), W16(0x0001), W16(0xff68), W16(0xeab8), W16(0x0976), - W16(0x0000), W16(0xfffd), W16(0xff5f), W16(0xe99b), W16(0x084a), - W16(0x0000), W16(0xfffe), W16(0xff55), W16(0xe87a), W16(0x0724), - W16(0x0000), W16(0x0003), W16(0xff4a), W16(0xe757), W16(0x0607), - W16(0x0000), W16(0x0006), W16(0xff3f), W16(0xe632), W16(0x04f9), - W16(0x0000), W16(0x0006), W16(0xff33), W16(0xe50a), W16(0x03fd), - W16(0x0000), W16(0x000c), W16(0xff27), W16(0xe3e1), W16(0x0315), - W16(0x0000), W16(0x0016), W16(0xff1a), W16(0xe2b7), W16(0x0244), - W16(0x0000), W16(0x001e), W16(0xff0d), W16(0xe18b), W16(0x017f), - W16(0x0002), W16(0x0020), W16(0xff00), W16(0xe05e), W16(0x00a9) -}; - -const Word16 CLDFB80_30[] =//Q.5 -{ - 0, -5, -30, 278, 8546, - 0, -4, -33, 306, 9141, - 0, -2, -29, 334, 9735, - 0, -1, -17, 363, 10324, - 0, -1, -13, 397, 10904, - 0, -1, -9, 435, 11474, - 0, -1, -2, 478, 12028, - 0, 0, 6, 525, 12566, - 0, 0, 12, 578, 13083, - 0, 0, 19, 637, 13579, - 0, 0, 26, 701, 14050, - 0, 0, 28, 771, 14493, - 0, 0, 30, 846, 14906, - 0, 0, 28, 927, 15285, - 0, 0, 4, 1012, 15630, - 0, -1, 27, 1105, 15937, - 0, -1, 26, 1201, 16209, - 0, 0, 29, 1299, 16442, - 0, 1, 31, 1399, 16638, - 0, 0, 36, 1498, 16794, - 0, 0, 41, 1594, 16911, - 0, -1, 45, 1687, 16990, - 0, 0, 46, 1774, 17036, - 0, 0, 49, 1853, 17052, - 0, 0, 50, 1922, 17040, - 0, 0, 50, 1981, 16999, - 0, 0, 45, 2027, 16924, - 0, -1, 39, 2061, 16809, - 0, -4, 27, 2080, 16651, - 0, -10, 12, 2084, 16463, - 0, -17, -10, 2075, 16161, - 0, -16, -23, 2054, 15746, - 0, -10, -31, 2012, 15307, - 0, -4, -32, 1949, 14834, - 0, -2, -26, 1862, 14334, - 0, -3, -15, 1752, 13816, - 0, -2, -1, 1616, 13288, - 0, 0, 13, 1454, 12753, - 0, -1, 25, 1267, 12212, - 0, 0, 35, 1054, 11663, - 0, 0, 42, 815, 11104, - 0, 1, 45, 552, 10536, - 0, -2, 42, 263, 9960, - 0, -3, 37, -51, 9379, - 0, 9, 33, -391, 8795, - 0, -12, 25, -755, 8207, - 0, 3, 4, -1144, 7616, - 0, 2, -14, -1557, 7022, - 0, -2, -34, -1992, 6427, - 0, 0, -54, -2449, 5833, - 0, 1, -73, -2927, 5244, - 0, 1, -90, -3425, 4659, - 0, 0, -107, -3942, 4072, - 0, 1, -123, -4476, 3479, - 0, 1, -139, -5026, 2877, - 0, -1, -156, -5590, 2272, - 0, 0, -176, -6167, 1684, - 0, 6, -199, -6754, 1144, - 0, 18, -223, -7348, 682, - 0, 32, -249, -7947, 282 -}; - -/*! - * \brief CLDFB rRotVectr - * - * cldfb bands: 10 - * global gain: 8.00 - * scale: sqrt(1.0/16.00) - */ -const Word16 rRotVectr_10[] =//Q(sqrt(1.0/16.00)) -{ - W16(0x5a71), W16(0x54ea), W16(0x4714), W16(0x3249), W16(0x1891) -}; - -/*! - * \brief CLDFB iRotVectr - * - * cldfb bands: 10 - * global gain: 8.00 - * scale: sqrt(1.0/16.00) - */ -const Word16 iRotVectr_10[] =//Q(sqrt(1.0/16.00)) -{ - W16(0xfc72), W16(0xe0ac), W16(0xc7f7), W16(0xb4be), W16(0xa8e3) -}; - -/*! - * \brief CLDFB rRotVectr - * - * cldfb bands: 16 - * global gain: 5.00 - * scale: sqrt(1.0/8.00) - */ -const Word16 rRotVectr_16[] =//Q(sqrt(1.0/8.00)) -{ - W16(0x652a), W16(0x62bc), W16(0x5c83), W16(0x52bc), W16(0x45c7), - W16(0x3623), W16(0x246b), W16(0x114d) -}; - -/*! - * \brief CLDFB iRotVectr - * - * cldfb bands: 16 - * global gain: 5.00 - * scale: sqrt(1.0/8.00) - */ -const Word16 iRotVectr_16[] =//Q(sqrt(1.0/8.00)) -{ - W16(0xfd84), W16(0xe9d4), W16(0xd6fe), W16(0xc5bb), W16(0xb6b6), - W16(0xaa82), W16(0xa196), W16(0x9c4c) -}; - -/*! - * \brief CLDFB rRotVectr - * - * cldfb bands: 20 - * global gain: 4.00 - * scale: sqrt(1.0/8.00) - */ -const Word16 rRotVectr_20[] =//Q(sqrt(1.0/8.00)) -{ - W16(0x5a7e), W16(0x591a), W16(0x5584), W16(0x4fd3), W16(0x482a), - W16(0x3ebb), W16(0x33c1), W16(0x2780), W16(0x1a46), W16(0x0c67) -}; - -/*! - * \brief CLDFB iRotVectr - * - * cldfb bands: 20 - * global gain: 4.00 - * scale: sqrt(1.0/8.00) - */ -const Word16 iRotVectr_20[] =//Q(sqrt(1.0/8.00) -{ - W16(0xfe39), W16(0xf017), W16(0xe259), W16(0xd556), W16(0xc95f), - W16(0xbec1), W16(0xb5bf), W16(0xae90), W16(0xa963), W16(0xa658) -}; - -/*! - * \brief CLDFB rRotVectr - * - * cldfb bands: 30 - * global gain: 2.50 - * scale: sqrt(1.0/4.00) - */ -const Word16 rRotVectr_30[] =//Q(sqrt(1.0/4.00)) -{ - 25902, 25725, 25265, 24529, 23525, 22262, 20756, 19022, 17080, 14950, 12657, 10226, 7682, 5054, 2370 -}; - -/*! - * \brief CLDFB iRotVectr - * - * cldfb bands: 30 - * global gain: 2.50 - * scale: sqrt(1.0/4.00) - */ -const Word16 iRotVectr_30[] =//Q(sqrt(1.0/4.00)) -{ - -339, -3045, -5717, -8327, -10845, -13245, -15499, -17584, -19476, -21154, -22601, -23801, -24739, -25406, -25796 -}; -/*! - * \brief CLDFB rRotVectr - * - * cldfb bands: 32 - * global gain: 2.50 - * scale: sqrt(1.0/4.00) - */ -const Word16 rRotVectr_32[] =//Q(sqrt(1.0/4.00)) -{ - W16(0x652f), W16(0x6494), W16(0x6300), W16(0x6078), W16(0x5d02), - W16(0x58a7), W16(0x5371), W16(0x4d6e), W16(0x46ac), W16(0x3f3b), - W16(0x372f), W16(0x2e9a), W16(0x2593), W16(0x1c2f), W16(0x1286), - W16(0x08af) -}; - -/*! - * \brief CLDFB iRotVectr - * - * cldfb bands: 32 - * global gain: 2.50 - * scale: sqrt(1.0/4.00) - */ -const Word16 iRotVectr_32[] =//Q(sqrt(1.0/4.00)) -{ - W16(0xfec2), W16(0xf4d9), W16(0xeb0b), W16(0xe170), W16(0xd821), - W16(0xcf35), W16(0xc6c1), W16(0xbed9), W16(0xb793), W16(0xb0ff), - W16(0xab2d), W16(0xa62d), W16(0xa20b), W16(0x9ed0), W16(0x9c84), - W16(0x9b2e) -}; - -/*! - * \brief CLDFB rRotVectr - * - * cldfb bands: 40 - * global gain: 2.00 - * scale: sqrt(1.0/4.00) - */ -const Word16 rRotVectr_40[] =//Q(sqrt(1.0/4.00)) -{ - W16(0x5a81), W16(0x5a28), W16(0x5941), W16(0x57cc), W16(0x55cd), - W16(0x5347), W16(0x503d), W16(0x4cb4), W16(0x48b3), W16(0x443e), - W16(0x3f5e), W16(0x3a1a), W16(0x347b), W16(0x2e88), W16(0x284c), - W16(0x21d0), W16(0x1b1f), W16(0x1444), W16(0x0d48), W16(0x0637) -}; - -/*! - * \brief CLDFB iRotVectr - * - * cldfb bands: 40 - * global gain: 2.00 - * scale: sqrt(1.0/4.00) - */ -const Word16 iRotVectr_40[] =//Q(sqrt(1.0/4.00)) -{ - W16(0xff1d), W16(0xf803), W16(0xf0f7), W16(0xea02), W16(0xe330), - W16(0xdc8b), W16(0xd61f), W16(0xcff4), W16(0xca15), W16(0xc48c), - W16(0xbf60), W16(0xba9a), W16(0xb642), W16(0xb25e), W16(0xaef5), - W16(0xac0b), W16(0xa9a6), W16(0xa7ca), W16(0xa678), W16(0xa5b4) -}; - -/*! - * \brief CLDFB rRotVectr - * - * cldfb bands: 60 - * global gain: 1.33 - * scale: sqrt(1.0/2.00) - */ -const Word16 rRotVectr_60[] =//Q(sqrt(1.0/2.00)) -{ - W16(0x6882), W16(0x6855), W16(0x67de), W16(0x671e), W16(0x6615), - W16(0x64c5), W16(0x632f), W16(0x6153), W16(0x5f32), W16(0x5ccf), - W16(0x5a2a), W16(0x5747), W16(0x5426), W16(0x50ca), W16(0x4d35), - W16(0x496a), W16(0x456c), W16(0x413d), W16(0x3ce0), W16(0x3859), - W16(0x33aa), W16(0x2ed6), W16(0x29e2), W16(0x24d0), W16(0x1fa5), - W16(0x1a63), W16(0x150f), W16(0x0fac), W16(0x0a3e), W16(0x04c9) -}; - -/*! - * \brief CLDFB iRotVectr - * - * cldfb bands: 60 - * global gain: 1.33 - * scale: sqrt(1.0/2.00) - */ -const Word16 iRotVectr_60[] =//Q(sqrt(1.0/2.00)) -{ - W16(0xff51), W16(0xf9d9), W16(0xf465), W16(0xeefa), W16(0xe99a), - W16(0xe44a), W16(0xdf0e), W16(0xd9e9), W16(0xd4de), W16(0xcff2), - W16(0xcb27), W16(0xc682), W16(0xc204), W16(0xbdb3), W16(0xb990), - W16(0xb59e), W16(0xb1e0), W16(0xae5a), W16(0xab0c), W16(0xa7fb), - W16(0xa526), W16(0xa292), W16(0xa03f), W16(0x9e30), W16(0x9c65), - W16(0x9ae0), W16(0x99a2), W16(0x98ac), W16(0x97fe), W16(0x9799) -}; - -const Word16 cldfb_anaScale[] = // Q0 -{ - SCALE_CLDFB_ANA_10, SCALE_CLDFB_ANA_16, SCALE_CLDFB_ANA_20, SCALE_CLDFB_ANA_32, SCALE_CLDFB_ANA_40, SCALE_CLDFB_ANA_60, SCALE_CLDFB_ANA_30 -}; -const Word16 cldfb_synScale[] = // Q0 -{ - SCALE_CLDFB_SYN_10, SCALE_CLDFB_SYN_16, SCALE_CLDFB_SYN_20, SCALE_CLDFB_SYN_32, SCALE_CLDFB_SYN_40, SCALE_CLDFB_SYN_60, SCALE_CLDFB_SYN_30 -}; -const Word16 cldfb_synGain[] =//Q0 -{ - 0x6666, /* 10 bands */ - 0x51EC, /* 16 bands */ - 0x6666, /* 20 bands */ - 0x51EC, /* 32 bands */ - 0x6666, /* 40 bands */ - 0x4CCD /* 60 bands */ -}; - -const Word16 *cldfb_protoFilter_2_5ms[] = -{ - CLDFB80_10, CLDFB80_16, CLDFB80_20, CLDFB80_32, CLDFB80_40, CLDFB80_60, CLDFB80_30 -}; - -const Word16 cldfb_scale_2_5ms[7] = -{ - 22603/*88.293854 Q8*/, /* 10 bands */ - 22605/*88.299622 Q8*/, /* 16 bands */ - 22605/*88.300926 Q8*/, /* 20 bands */ - 22606/*88.303848 Q8*/, /* 32 bands */ - 22606/*88.304718 Q8*/, /* 40 bands */ - 22535/*88.028412 Q8*/, /* 60 bands */ - 22588/*88.234489 Q8*/ /* 30 bands */ -}; - -const Word16 cldfb_scale_5_0ms[7] = -{ - 21649/*88.293854 Q8*/, /* 10 bands */ - 21649/*88.299622 Q8*/, /* 16 bands */ - 21649/*88.300926 Q8*/, /* 20 bands */ - 21649/*88.303848 Q8*/, /* 32 bands */ - 21649/*88.304718 Q8*/, /* 40 bands */ - 22535/*88.028412 Q8*/, /* 60 bands */ - 21581/*88.028412 Q8*/ /* 30 bands */ -}; - - -/*Q31*/ -const Word32 rot_vec_syn_re_L10_fx[5] = -{ - 239910864 ,225255952 ,188551424 ,133390176 ,65171760 , -}; - - -/*Q31*/ -const Word32 rot_vec_syn_im_L10_fx[5] = -{ - -9426123 ,-83101312 ,-148641968 ,-199632496 ,-231081632 , -}; - - -/*Q31*/ -const Word32 rot_vec_syn_re_L16_fx[8] = -{ - 240023664 ,234262144 ,219498080 ,196298816 ,165555904 ,128450776 ,86409352 ,41047260 , -}; - - -/*Q31*/ -const Word32 rot_vec_syn_im_L16_fx[8] = -{ - -5892250 ,-52605324 ,-97296808 ,-138249232 ,-173888800 ,-202845936 ,-224007808 ,-236561200 , -}; - - -/*Q31*/ -const Word32 rot_vec_syn_re_L20_fx[10] = -{ - 240049696 ,236356848 ,226844128 ,211745744 ,191433472 ,166407488 ,137283984 ,104780104 ,69696184 ,32896112 , -}; - - -/*Q31*/ -const Word32 rot_vec_syn_im_L20_fx[10] = -{ - -4713971 ,-42207980 ,-78662688 ,-113180456 ,-144911344 ,-173074048 ,-196975088 ,-216025936 ,-229757520 ,-237831712 , -}; - - -/*Q31*/ -const Word32 rot_vec_syn_re_L30_fx[15] = -{ - 240075408 ,238431728 ,234175760 ,227354112 ,218041520 ,206340016 ,192377808 ,176307872 , - 158306272 ,138570240 ,117315992 ,94776408 ,71198440 ,46840400 ,21969170 , -}; - - -/*Q31*/ -const Word32 rot_vec_syn_im_L30_fx[15] = -{ - -3142759 ,-28220256 ,-52988564 ,-77176320 ,-100518520 ,-122759408 ,-143655328 ,-162977328 , - -180513712 ,-196072352 ,-209482768 ,-220598064 ,-229296448 ,-235482592 ,-239088752 , -}; - - -/*Q31*/ -const Word32 rot_vec_syn_re_L32_fx[16] = -{ - 240077888 ,238633056 ,234890064 ,228884944 ,220675536 ,210340896 ,197980576 ,183713584 , - 167677328 ,150026240 ,130930336 ,110573488 ,89151760 ,66871456 ,43947140 ,20599588 , -}; - - -/*Q31*/ -const Word32 rot_vec_syn_im_L32_fx[16] = -{ - -2946347 ,-26463908 ,-49726608 ,-72510408 ,-94595904 ,-115770384 ,-135829936 ,-154581360 , - -171844080 ,-187451856 ,-201254368 ,-213118704 ,-222930576 ,-230595504 ,-236039664 ,-239210640 , -}; - - -/*Q31*/ -const Word32 rot_vec_syn_re_L40_fx[20] = -{ - 240084400 ,239159360 ,236759824 ,232900592 ,227605456 ,220907040 ,212846672 ,203474016 , - 192846896 ,181030800 ,168098592 ,154130000 ,139211136 ,123434000 ,106895848 ,89698648 , - 71948424 ,53754620 ,35229396 ,16486972 , -}; - - -/*Q31*/ -const Word32 rot_vec_syn_im_L40_fx[20] = -{ - -2357099 ,-21186638 ,-39885552 ,-58338564 ,-76431896 ,-94054000 ,-111096224 ,-127453512 , - -143025008 ,-157714704 ,-171432032 ,-184092416 ,-195617824 ,-205937184 ,-214986864 ,-222711088 , - -229062224 ,-234001104 ,-237497296 ,-239529232 , -}; - - -/*Q31*/ -const Word32 rot_vec_syn_re_L60_fx[30] = -{ - 240090832 ,239679552 ,238611328 ,236889088 ,234517552 ,231503216 ,227854352 ,223580960 ,218694736 , - 213209088 ,207139056 ,200501264 ,193313904 ,185596688 ,177370784 ,168658704 ,159484336 ,149872832 , - 139850544 ,129444936 ,118684528 ,107598816 ,96218184 ,84573816 ,72697640 ,60622212 ,48380616 , - 36006412 ,23533520 ,10996123 , -}; - - -/*Q31*/ -const Word32 rot_vec_syn_im_L60_fx[30] = -{ - -1571413 ,-14134643 ,-26659130 ,-39110548 ,-51454764 ,-63657948 ,-75686648 ,-87507896 ,-99089296 , - -110399096 ,-121406296 ,-132080736 ,-142393152 ,-152315264 ,-161819904 ,-170881008 ,-179473744 , - -187574544 ,-195161216 ,-202212960 ,-208710464 ,-214635904 ,-219973040 ,-224707248 ,-228825536 , - -232316640 ,-235170976 ,-237380736 ,-238939840 ,-239844032 , -}; - - -const Word16 bpf_weights_16_Fx[16] = -{ - 16385/*0.500020f Q15*/, 23022/*0.702561f Q15*/, 6843/*0.208838f Q15*/, 51/*0.001553f Q15*/, - 58/*0.001777f Q15*/, 45/*0.001370f Q15*/, 30/*0.000926f Q15*/, 18/*0.000554f Q15*/, - 9/*0.000270f Q15*/, 3/*0.000080f Q15*/, 1/*0.000030f Q15*/, 3/*0.000082f Q15*/, - 3/*0.000081f Q15*/, 2/*0.000052f Q15*/, 1/*0.000017f Q15*/, 1/*0.000016f Q15*/ -}; - -const Word16 bpf_weights_16_ivas_fx[16] = -{ - 32767/*0.999969f Q15*/, 23022/*0.702561f Q15*/, 6843/*0.208838f Q15*/, 51/*0.001553f Q15*/, - 58/*0.001777f Q15*/, 45/*0.001370f Q15*/, 30/*0.000926f Q15*/, 18/*0.000554f Q15*/, - 9/*0.000270f Q15*/, 3/*0.000080f Q15*/, 1/*0.000030f Q15*/, 3/*0.000082f Q15*/, - 3/*0.000081f Q15*/, 2/*0.000052f Q15*/, 1/*0.000017f Q15*/, 1/*0.000016f Q15*/ -}; -const Word32 bpf_weights_16_ivas_fx_32[16] = -{ - 1073784774/*1.000040f Q30*/, 754369130/*0.702561f Q30*/, 224238095/*0.208838f Q30*/, 1667521/*0.001553f Q30*/, - 1908039/*0.001777f Q30*/, 1435593/*0.001370f Q30*/, 994285/*0.000926f Q30*/, 594853/*0.000554f Q30*/, - 289910/*0.000270f Q30*/, 85899/*0.000080f Q30*/, 32212/*0.000030f Q30*/, 88047/*0.000082f Q30*/, - 86973/*0.000081f Q30*/, 55835/*0.000052f Q30*/, 18254/*0.000017f Q30*/, 17179/*0.000016f Q30*/ -}; - - -/*-------------------------------------------------------------------* - * LP CNG excitation details code book - *-------------------------------------------------------------------*/ - -const Word16 CNG_details_codebook_fx[64][NUM_ENV_CNG] = /* Q6 */ -{ - {443,547,613,547,510,471,540,479,586,535,565,611,532,500,462,551,498,463,446,484}, - {600,499,472,537,633,654,641,646,674,677,687,693,693,690,688,700,693,696,640,571}, - {529,537,501,582,537,474,505,491,521,545,561,591,566,609,570,608,636,655,649,524}, - {648,690,689,684,693,599,668,714,663,675,524,519,726,658,673,696,654,715,708,668}, - {623,630,660,656,686,688,637,666,630,555,470,468,464,445,502,583,615,545,605,592}, - {659,668,669,625,662,700,700,693,702,702,688,677,654,584,525,492,446,477,634,615}, - {634,648,656,552,520,557,662,659,572,617,691,683,684,666,673,695,682,698,680,623}, - {756,743,734,709,730,757,746,722,484,552,779,688,686,610,616,749,758,694,745,729}, - {549,568,556,625,683,619,609,667,663,684,709,649,691,668,594,511,525,617,542,684}, - {550,467,533,760,739,692,773,756,743,770,765,791,779,784,775,792,759,577,642,553}, - {658,674,656,651,670,582,593,520,467,470,522,589,600,596,587,631,652,679,645,669}, - {788,765,787,797,785,799,787,786,780,692,641,550,501,513,726,747,670,687,734,773}, - {641,654,668,673,665,682,689,684,697,665,664,593,544,494,458,537,622,650,635,635}, - {706,753,762,716,748,762,788,792,785,788,799,777,782,766,760,710,704,503,519,735}, - {748,775,784,635,717,504,539,640,764,778,681,721,791,786,787,780,780,770,774,781}, - {752,516,624,780,713,753,569,548,770,784,749,740,690,755,776,748,744,730,767,698}, - {453,471,516,517,561,653,659,616,629,608,682,698,679,681,645,587,594,522,499,469}, - {617,534,506,615,782,792,754,771,740,787,791,776,782,787,793,788,775,778,651,736}, - {661,593,490,495,491,495,554,656,658,611,628,660,680,677,698,678,673,699,687,679}, - {798,793,786,795,799,772,771,696,624,557,507,545,724,757,747,770,780,785,793,784}, - {703,695,703,714,697,701,697,631,598,498,475,451,503,611,648,664,664,683,679,688}, - {744,672,659,762,785,745,757,761,761,767,722,757,761,737,699,471,582,770,724,756}, - {775,746,535,680,541,513,697,723,743,744,769,741,741,738,769,772,779,743,714,724}, - {767,771,697,756,766,752,710,477,602,783,746,766,692,708,783,782,761,778,787,785}, - {483,588,700,665,665,640,650,717,699,707,692,698,700,692,668,650,609,610,540,484}, - {507,618,788,766,754,692,709,785,788,770,793,785,799,784,767,776,789,759,761,495}, - {709,712,706,678,661,604,503,480,653,664,664,639,621,675,695,689,704,681,711,709}, - {788,740,770,768,771,776,732,749,739,764,714,492,544,783,714,708,717,559,739,768}, - {758,771,789,779,777,799,791,785,779,779,752,675,718,510,501,600,727,750,752,758}, - {759,765,676,658,774,767,737,749,769,784,778,738,755,769,788,756,473,530,777,725}, - {669,665,721,653,499,774,780,781,767,561,690,747,722,779,757,727,764,745,770,736}, - {731,768,745,775,783,782,715,741,786,673,766,777,764,730,773,769,774,781,778,764}, - {557,505,545,604,660,672,604,596,580,612,587,556,546,597,530,494,437,480,546,555}, - {560,588,510,495,606,720,718,742,756,755,767,774,776,778,772,772,776,776,754,592}, - {680,644,620,612,516,477,471,499,502,598,664,588,656,682,689,671,668,672,682,692}, - {757,778,781,799,775,750,799,758,789,774,489,579,799,739,774,723,686,788,787,778}, - {705,685,654,680,672,680,657,579,574,619,639,518,482,545,665,587,540,599,606,651}, - {729,767,767,773,783,778,793,773,784,779,757,768,686,654,679,564,483,549,490,522}, - {725,693,715,588,522,629,721,647,697,684,614,725,708,674,715,729,717,725,689,738}, - {797,783,795,797,782,757,636,624,508,517,703,750,746,757,772,771,774,790,779,799}, - {556,591,652,692,728,712,698,688,704,718,728,717,713,693,716,558,490,540,620,678}, - {532,617,777,775,763,789,768,785,778,791,792,792,793,777,781,724,551,665,540,509}, - {710,697,706,717,673,679,620,581,546,474,562,684,680,675,660,656,702,680,701,708}, - {771,793,788,787,794,791,792,783,791,792,733,770,532,525,692,761,777,753,734,728}, - {724,695,678,652,695,735,697,712,714,721,696,710,569,581,570,522,642,704,748,726}, - {796,754,785,782,732,814,803,794,799,790,810,806,794,797,756,745,749,506,741,779}, - {793,767,785,780,724,648,488,747,784,771,793,740,759,805,794,796,795,795,801,806}, - {787,508,640,775,722,792,774,705,781,801,774,800,786,806,808,783,795,797,784,782}, - {654,649,601,597,594,667,646,662,615,623,651,671,669,674,682,653,624,484,473,665}, - {790,765,479,527,746,728,770,753,721,774,794,802,789,782,803,795,764,804,779,776}, - {738,699,642,509,515,501,466,614,702,612,683,720,687,717,704,739,714,733,721,718}, - {778,795,791,786,758,783,783,743,744,527,554,789,762,767,722,722,777,788,776,782}, - {694,696,700,696,709,710,696,689,674,662,581,538,496,637,644,681,679,671,689,704}, - {776,788,742,796,779,756,788,789,782,798,795,804,771,753,571,611,504,545,593,779}, - {799,717,747,682,487,573,766,774,775,762,711,802,799,796,790,787,802,789,773,786}, - {795,797,790,804,788,791,774,706,532,770,786,743,789,708,755,785,804,803,807,770}, - {568,722,738,680,713,703,693,749,703,705,740,720,712,631,621,727,730,722,574,612}, - {626,762,734,770,759,750,792,775,790,792,788,786,791,767,782,778,794,745,504,544}, - {774,784,779,753,654,560,530,532,555,699,742,695,716,767,770,772,778,780,779,782}, - {781,781,790,783,792,798,787,792,765,740,701,537,564,773,767,756,786,797,789,801}, - {738,717,799,794,772,784,774,790,788,748,789,769,768,763,504,587,783,751,784,732}, - {776,789,763,772,800,786,802,787,805,799,776,773,792,761,750,702,532,745,807,735}, - {765,778,764,484,607,791,757,760,700,687,789,777,779,783,768,791,778,757,784,770}, - {800,825,775,782,821,679,805,824,752,824,796,785,829,817,824,803,814,807,762,779} -}; -/*-------------------------------------------------------------------* - * FD CNG - *-------------------------------------------------------------------*/ - -const Word16 d_array[SIZE_SCALE_TABLE_CN] = { 1, 2, 5, 8, 10, 15, 20, 30, 40, 60, 80, 120, 140, 160, 180, 220, 260, 300 }; -const Word16 m_array[SIZE_SCALE_TABLE_CN] = { 0/*0.000f Q15*/, 8520/*0.260f Q15*/, 15729/*0.480f Q15*/, 19005/*0.580f Q15*/, 19988/*0.610f Q15*/, 21889/*0.668f Q15*/, 23101/*0.705f Q15*/, 24969/*0.762f Q15*/, 26214/*0.800f Q15*/, 27558/*0.841f Q15*/, 28344/*0.865f Q15*/, 29164/*0.890f Q15*/, 29491/*0.900f Q15*/, 29819/*0.910f Q15*/, 30147/*0.920f Q15*/, 30474/*0.930f Q15*/, 30638/*0.935f Q15*/, 30802/*0.940f Q15*/ }; -const Word16 msQeqInvAv_thresh[3] = { 328/*0.01f Q15*/, 983/*0.03f Q15*/, 1638/*0.05f Q15*/ }; -const Word16 msNoiseSlopeMax[4] = { 32767/*2.f Q14*/, 26214/*1.6f Q14*/, 21299/*1.3f Q14*/, 18022/*1.1f Q14*/ }; - - -const SCALE_SETUP scaleTableStereo[SIZE_SCALE_TABLE_STEREO] = -{ - { 1, 0, 8000, /* -5.5f,*/ -704/*-5.5f Q7*/, -704 }, - { 1, 8000, 9600, /* -5.0f,*/ -640/*-5.0f Q7*/, -640 }, - { 1, 9600, 13200, /* -4.0f,*/ -512/*-4.0f Q7*/, -512 }, - { 1, 13200, 16400, /* -3.0f,*/ -384/*-3.0f Q7*/, -384 }, - { 1, 16400, 24400, /* -1.6f,*/ -204/*-1.6f Q7*/, -204 }, - { 1, 24400, 32000, /* -0.2f,*/ -26/*-1.6f Q7*/, -26 }, - { 1, 32000,512001, /* 0.0f,*/ 0 /*0.0f Q7*/, 0 }, - - { 2, 0, 8000, /*-0.9f ,*/ -115/*-0.9f Q7*/, -115 }, - { 2, 8000, 9600, /*-0.65f,*/ -83/*-0.65f Q7*/, -83 }, - { 2, 9600, 13200, /*-2.0f ,*/ -256/*-2.0f Q7*/, -256 }, - { 2, 13200, 16400, /*-3.0f ,*/ -384/*-3.0f Q7*/, -384 }, - { 2, 16400, 24400, /*-0.8f ,*/ -102/*-0.8f Q7*/, -102 }, - { 2, 24400, 32000, /*-0.25f,*/ -32/*-0.25f Q7*/, -32 }, - { 2, 32000,512001, /* 0.0f ,*/ 0/* 0.0f Q7*/, 0 } -}; -const SCALE_SETUP scaleTableMono[SIZE_SCALE_TABLE_MONO] = -{ - { 0, 0, 8000, /* -5.5f,*/ -704/*-5.5f Q7*/, -704 }, - { 0, 8000, 9600, /* -5.0f,*/ -640/*-5.0f Q7*/, -640 }, - { 0, 9600, 13200, /* -4.0f,*/ -512/*-4.0f Q7*/, -512 }, - { 0, 13200, 16400, /* -3.0f,*/ -384/*-3.0f Q7*/, -384 }, - { 0, 16400, 24400, /* -1.5f,*/ -192/*-1.5f Q7*/, -192 }, - { 0, 24400,128001, /* -0.5f,*/ -64/*-0.5f Q7*/, -64 }, - - { 1, 0, 8000, /*-5.5f ,*/ -704/*-5.5f Q7*/, -704 }, - { 1, 8000, 9600, /*-5.0f ,*/ -640/*-5.0f Q7*/, -640 }, - { 1, 9600, 13200, /*-1.55f,*/ -198/*-1.55f Q7*/, -198 }, - { 1, 13200, 16400, /*-3.0f ,*/ -384/*-3.0f Q7*/,-384 }, - { 1, 16400, 24400, /*-0.6f ,*/ -77/*-0.6f Q7*/, -77 }, - { 1, 24400, 32000, /*-0.2f ,*/ -26/*-0.2f Q7*/, -26 }, - { 1, 32000,128001, /* 0.0f ,*/ 0/* 0.0f Q7*/, 0 }, - - { 2, 0, 8000, /*-0.9f ,*/ -115/*-0.9f Q7*/, -115 }, - { 2, 8000, 9600, /*-0.65f,*/ -83/*-0.65f Q7*/, -83 }, - { 2, 9600, 13200, /*-2.0f ,*/ -256/*-2.0f Q7*/, -256 }, - { 2, 13200, 16400, /*-3.0f ,*/ -384/*-3.0f Q7*/, -384 }, - { 2, 16400, 24400, /*-0.8f ,*/ -102/*-0.8f Q7*/, -102 }, - { 2, 24400, 32000, /*-0.25f,*/ -32/*-0.25f Q7*/, -32 }, - { 2, 32000,128001, /* 0.0f ,*/ 0/* 0.0f Q7*/,0 } -}; - -const SCALE_SETUP scaleTable_cn_only[SIZE_SCALE_TABLE_CN] = -{ - { 0, 0, 8000, /*-3.5f,*/ 20295/*1.2387211385 Q14*/ /*-3.5f*/, 20295 }, - { 0, 8000, 9600, /*-3.0f,*/ 16306/*0.9952622652 Q14*/ /*-3.0f*/, 16306 }, - { 0, 9600, 13200, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, - { 0, 13200, 16400, /*-2.0f,*/ 9583/*0.5848932266 Q14*/ /*-2.0f*/, 9583 }, - { 0, 16400,128001, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 }, - - { 1, 0, 8000, /*-3.0f,*/ 16306/*0.9952622652 Q14*/ /*-3.0f*/, 16306 }, - { 1, 8000, 9600, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, - { 1, 9600, 13200, /*-1.5f,*/ 6759/*0.4125375748 Q14*/ /*-1.5f*/, 6759 }, - { 1, 13200, 16400, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, - { 1, 16400, 24400, /*-0.5f,*/ 1999/*0.1220184565 Q14*/ /*-0.5f*/, 1999 }, - { 1, 24400,128001, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 }, - - { 2, 0, 8000, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, - { 2, 8000, 9600, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, - { 2, 9600, 13200, /*-2.0f,*/ 9583/*0.5848932266 Q14*/ /*-2.0f*/, 9583 }, - { 2, 13200, 16400, /*-1.0f,*/ 4242/*0.2589254379 Q14*/ /*-1.0f*/, 4242 }, - - { 2, 16400, 24400, /*-0.5f,*/ 1999/*0.1220184565 Q14*/ /*-0.5f*/, 1999 }, - { 2, 24400, 32000, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 }, - { 2, 32000,128001, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 } -}; - -const SCALE_SETUP scaleTable_cn_dirac[15] = -{ - { 0, 0, 13200, /*-3.0f,*/ 16306/*0.9952622652 Q14*/ /*-3.0f*/, 16306 }, - { 0, 13200, 16400, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, - { 0, 16400, 24400, /*-2.0f,*/ 9583/*0.5848932266 Q14*/ /*-2.0f*/, 9583 }, - { 0, 24400, 32000, /*-1.5f,*/ 6759/*0.4125375748 Q14*/ /*-1.5f*/, 6759 }, - { 0, 32000,512001, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 }, - - { 1, 0, 13200, /*-3.0f,*/ 16306/*0.9952622652 Q14*/ /*-3.0f*/, 16306 }, - { 1, 13200, 16400, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, - { 1, 16400, 24400, /*-2.0f,*/ 9583/*0.5848932266 Q14*/ /*-2.0f*/, 9583 }, - { 1, 24400, 32000, /*-1.5f,*/ 6759/*0.4125375748 Q14*/ /*-1.5f*/, 6759 }, - { 1, 32000,512001, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 }, - - { 2, 0, 13200, /*-3.0f,*/ 16306/*0.9952622652 Q14*/ /*-3.0f*/, 16306 }, - { 2, 13200, 16400, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, - { 2, 16400, 24400, /*-2.0f,*/ 9583/*0.5848932266 Q14*/ /*-2.0f*/, 9583 }, - { 2, 24400, 32000, /*-1.5f,*/ 6759/*0.4125375748 Q14*/ /*-1.5f*/, 6759 }, - { 2, 32000,512001, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 } -}; -const Word16 scaleTable_cn_only_amrwbio[3][2] = -{ - { ACELP_6k60, 24771/*1.5118864315 Q14*/ }, - { ACELP_8k85, 16306/*0.9952622652 Q14*/ }, - { ACELP_12k65, 9583/*0.5848932266 Q14*/ }, -}; -const Word32 scaleTable_cn_only_amrwbio_fx_by_10f[SIZE_SCALE_TABLE_CN_AMRWB][2] =//Q29 -{ - { ACELP_6k60, 858993459 }, - { ACELP_8k85, 644245094 }, - { ACELP_12k65, 429496729 } -}; - -const Word16 sidparts_encoder_noise_est[SIZE_SIDPARTS_ENC_NOISE_EST] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 259, 264, 269, 279 }; // Q0 - -const Word16 sidPartitions_nb[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 159 }; // Q0 -const Word16 sidPartitions_wb1[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255 }; // Q0 -const Word16 sidPartitions_wb2[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 259 }; // Q0 -const Word16 sidPartitions_wb3[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 319 }; // Q0 -const Word16 sidPartitions_swb1[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 259, 264, 269, 274 }; // Q0 -const Word16 sidPartitions_swb2[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 319, 324, 329, 339 }; // Q0 - -const Word16 shapingPartitions_nb[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 136, 159 }; // Q0 -const Word16 shapingPartitions_wb1[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 135, 148, 162, 176, 192, 212, 232, 255 }; // Q0 -const Word16 shapingPartitions_wb2[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 135, 148, 162, 176, 192, 212, 232, 255 }; // Q0 -const Word16 shapingPartitions_wb3[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 136, 148, 176, 212, 256, 308, 319 }; // Q0 -const Word16 shapingPartitions_swb1[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 135, 148, 162, 176, 192, 212, 232, 255 }; // Q0 -const Word16 shapingPartitions_swb2[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 136, 148, 176, 212, 256, 308, 319 }; // Q0 - -const FD_CNG_SETUP FdCngSetup_nb = { 512, 160, sizeof(sidPartitions_nb)/sizeof(Word16), sidPartitions_nb, sizeof(shapingPartitions_nb)/sizeof(Word16), shapingPartitions_nb }; -const FD_CNG_SETUP FdCngSetup_wb1 = { 512, 256, sizeof(sidPartitions_wb1)/sizeof(Word16), sidPartitions_wb1, sizeof(shapingPartitions_wb1)/sizeof(Word16), shapingPartitions_wb1 }; -const FD_CNG_SETUP FdCngSetup_wb2 = { 512, 256, sizeof(sidPartitions_wb2)/sizeof(Word16), sidPartitions_wb2, sizeof(shapingPartitions_wb2)/sizeof(Word16), shapingPartitions_wb2 }; -const FD_CNG_SETUP FdCngSetup_wb3 = { 640, 320, sizeof(sidPartitions_wb3)/sizeof(Word16), sidPartitions_wb3, sizeof(shapingPartitions_wb3)/sizeof(Word16), shapingPartitions_wb3 }; -const FD_CNG_SETUP FdCngSetup_swb1 = { 512, 256, sizeof(sidPartitions_swb1)/sizeof(Word16), sidPartitions_swb1, sizeof(shapingPartitions_swb1)/sizeof(Word16), shapingPartitions_swb1 }; -const FD_CNG_SETUP FdCngSetup_swb2 = { 640, 320, sizeof(sidPartitions_swb2)/sizeof(Word16), sidPartitions_swb2, sizeof(shapingPartitions_swb2)/sizeof(Word16), shapingPartitions_swb2 }; - - -const Word16 levels_37bits[FD_CNG_stages_37bits] = { 128, 64, 64, 64, 64, 64 }; // Q0 -const Word16 bits_37bits[FD_CNG_stages_37bits] = { 7, 6, 6, 6, 6, 6 }; // Q0 - -/* IDCT_MATRIX_ROM: 18*24 Word16 = 432 Word16 */ -/* or compressed IDCT_MATRIX_ROM: 18*24 Word8 + 25 = 230 Word16 + WMOPS (INDIRECT(432) and STORE(432) ) */ - -/* Stage1 Word8 tables 16x8+ 17*10+ 17*16 + 78*18 = = 1974 Word8 -> 987 Word16 */ - -/* ROM storeSizeW8 = W8reduction (3072- (987+230) )/3072 = 1207/3072 --> 39.3 % */ -/* ROM with DCTII-24 in PROM = W8reduction (3072- (987) )/3072 = /3072 --> 31.8 % */ - -/* additional minor Table ROM ( dct_mid points 18 Word16, dct_col_upshifts 52, scaleFactors 2*2 = ~= 74 Word16s */ - - -const Word16 cdk1_ivas_entries_per_segment[FDCNG_VQ_DCT_NSEGM] = { 16, 17, 17, 78 }; // Q0 -const Word16 cdk1_ivas_cum_entries_per_segment[FDCNG_VQ_DCT_NSEGM + 1] = { 0, 16 ,33, 50, 128 }; // Q0 -const Word16 /* DCT trunc_len */ cdk1_ivas_cols_per_segment[FDCNG_VQ_DCT_NSEGM] = { FDCNG_VQ_DCT_MINTRUNC, 10, 16, FDCNG_VQ_DCT_MAXTRUNC }; /* 8, 10, 16, 18 */ -const Word16 /* segment inner DCT trunc_len */ cdk1_ivas_trunc_dct_cols_per_segment[FDCNG_VQ_DCT_NSEGM] = { FDCNG_VQ_DCT_MAXTRUNC - FDCNG_VQ_DCT_MINTRUNC, FDCNG_VQ_DCT_MAXTRUNC - 10 , FDCNG_VQ_DCT_MAXTRUNC - 16 , 0 }; - -/* to get back to FDCNG VQ domain for segment S use : idct as follows */ -/* cdk1r_vec[col, row] = cdk1r_tr_midQ_truncQ(col 1:24 ) + invScaleFQ * idctMat( cdk1_ivas_dct_sS_W8[1:col]<fftlen/2+1; j++) hs->fftSineTab[j] = (float)sin(2.0*EVS_PI*j/hs->fftlen); */ - - -const Word32 olapWinAna512_fx[512] = { /* Q30 */ - 4658693, 13975905, 23292590, 32608396, 41922980, 51235980, 60547056, 69855848, - 79162008, 88465192, 97765048, 107061216, 116353360, 125641120, 134924144, 144202096, - 153474624, 162741360, 172001968, 181256112, 190503440, 199743568, 208976192, 218200960, - 227417488, 236625472, 245824528, 255014368, 264194560, 273364832, 282524800, 291674144, - 300812512, 309939520, 319054880, 328158240, 337249248, 346327520, 355392768, 364444672, - 373482816, 382506912, 391516576, 400511584, 409491456, 418455904, 427404576, 436337216, - 445253408, 454152800, 463035104, 471900032, 480747136, 489576160, 498386752, 507178592, - 515951328, 524704608, 533438144, 542151616, 550844672, 559516992, 568168256, 576798144, - 585406272, 593992320, 602556096, 611097152, 619615168, 628109888, 636580992, 645028096, - 653450880, 661849088, 670222400, 678570432, 686892992, 695189632, 703460096, 711704128, - 719921344, 728111424, 736274112, 744409088, 752515968, 760594560, 768644608, 776665664, - 784657408, 792619584, 800552064, 808454272, 816326144, 824167232, 831977280, 839756032, - 847503104, 855218368, 862901376, 870551936, 878169728, 885754432, 893305728, 900823488, - 908307264, 915756864, 923171904, 930552256, 937897664, 945207680, 952482048, 959720640, - 966923136, 974089152, 981218496, 988310912, 995366080, 1002383808, 1009363840, 1016305856, - 1023209536, 1030074688, 1036901120, 1043688512, 1050436672, 1057145152, 1063813888, 1070442688, - 1077031040, 1083578880, 1090085888, 1096551936, 1102976640, 1109359872, 1115701248, 1122000640, - 1128257792, 1134472576, 1140644480, 1146773504, 1152859392, 1158901888, 1164900608, 1170855680, - 1176766592, 1182633088, 1188455168, 1194232448, 1199964800, 1205651968, 1211293824, 1216889984, - 1222440320, 1227944704, 1233402752, 1238814464, 1244179456, 1249497600, 1254768768, 1259992704, - 1265169152, 1270297984, 1275378944, 1280411904, 1285396736, 1290333056, 1295220992, 1300060032, - 1304850048, 1309591040, 1314282624, 1318924928, 1323517440, 1328060032, 1332552832, 1336995328, - 1341387520, 1345729152, 1350020224, 1354260352, 1358449536, 1362587648, 1366674432, 1370709632, - 1374693376, 1378625408, 1382505344, 1386333312, 1390109184, 1393832576, 1397503616, 1401121920, - 1404687488, 1408200320, 1411659904, 1415066496, 1418419840, 1421719680, 1424966016, 1428158720, - 1431297664, 1434382720, 1437413760, 1440390656, 1443313408, 1446181632, 1448995584, 1451755008, - 1454459648, 1457109632, 1459704704, 1462244864, 1464729856, 1467159808, 1469534464, 1471853824, - 1474117760, 1476326272, 1478479104, 1480576256, 1482617728, 1484603264, 1486533120, 1488406912, - 1490224640, 1491986176, 1493691648, 1495340800, 1496933760, 1498470400, 1499950464, 1501374080, - 1502741248, 1504051840, 1505305856, 1506503168, 1507643648, 1508727424, 1509754368, 1510724480, - 1511637888, 1512494208, 1513293568, 1514035968, 1514721408, 1515349760, 1515921152, 1516435456, - 1516892672, 1517292672, 1517635584, 1517921408, 1518150144, 1518321664, 1518435968, 1518493184, - 1518493184, 1518435968, 1518321664, 1518150144, 1517921408, 1517635584, 1517292672, 1516892672, - 1516435456, 1515921152, 1515349760, 1514721408, 1514035968, 1513293568, 1512494208, 1511637888, - 1510724480, 1509754368, 1508727424, 1507643648, 1506503040, 1505305728, 1504051840, 1502741248, - 1501374080, 1499950464, 1498470272, 1496933760, 1495340800, 1493691648, 1491986176, 1490224640, - 1488406784, 1486533120, 1484603264, 1482617728, 1480576256, 1478479104, 1476326272, 1474117760, - 1471853824, 1469534464, 1467159808, 1464729856, 1462244864, 1459704704, 1457109504, 1454459648, - 1451754880, 1448995584, 1446181632, 1443313408, 1440390656, 1437413760, 1434382720, 1431297664, - 1428158720, 1424966016, 1421719680, 1418419712, 1415066496, 1411659904, 1408200192, 1404687488, - 1401121920, 1397503488, 1393832576, 1390109056, 1386333312, 1382505344, 1378625280, 1374693376, - 1370709632, 1366674432, 1362587648, 1358449536, 1354260352, 1350020096, 1345729024, 1341387392, - 1336995200, 1332552704, 1328060032, 1323517440, 1318924800, 1314282624, 1309590912, 1304850048, - 1300059904, 1295220864, 1290333056, 1285396736, 1280411904, 1275378944, 1270297856, 1265169024, - 1259992576, 1254768640, 1249497600, 1244179456, 1238814336, 1233402752, 1227944576, 1222440192, - 1216889984, 1211293696, 1205651840, 1199964672, 1194232320, 1188455040, 1182632960, 1176766464, - 1170855552, 1164900608, 1158901760, 1152859264, 1146773504, 1140644352, 1134472448, 1128257664, - 1122000640, 1115701120, 1109359744, 1102976512, 1096551808, 1090085760, 1083578752, 1077030912, - 1070442560, 1063813824, 1057145088, 1050436608, 1043688448, 1036901056, 1030074624, 1023209472, - 1016305728, 1009363776, 1002383744, 995365952, 988310848, 981218432, 974089024, 966922944, - 959720576, 952481920, 945207488, 937897472, 930552192, 923171840, 915756736, 908307072, - 900823296, 893305664, 885754240, 878169600, 870551808, 862901248, 855218240, 847503040, - 839755968, 831977216, 824167104, 816326016, 808454208, 800551936, 792619520, 784657280, - 776665472, 768644480, 760594496, 752515904, 744408960, 736273984, 728111296, 719921216, - 711704000, 703460032, 695189504, 686892864, 678570368, 670222272, 661848960, 653450752, - 645027968, 636580864, 628109760, 619615104, 611097024, 602555968, 593992256, 585406144, - 576798016, 568168128, 559516864, 550844544, 542151488, 533438016, 524704480, 515951200, - 507178432, 498386592, 489576032, 480747008, 471899904, 463035040, 454152672, 445253280, - 436337056, 427404480, 418455744, 409491328, 400511456, 391516512, 382506816, 373482688, - 364444544, 355392672, 346327392, 337249088, 328158112, 319054752, 309939392, 300812384, - 291674016, 282524672, 273364704, 264194448, 255014224, 245824400, 236625328, 227417360, - 218200832, 208976064, 199743440, 190503312, 181255984, 172001856, 162741232, 153474480, - 144201968, 134924016, 125640984, 116353224, 107061080, 97764912, 88465064, 79161880, - 69855712, 60546920, 51235848, 41922844, 32608264, 23292456, 13975772, 4658560 -}; - -const Word32 olapWinAna640_fx[640] = { /* Q30 */ - 3726956, 11180779, 18634332, 26087438, 33539914, 40991584, 48442264, 55891776, - 63339940, 70786584, 78231520, 85674560, 93115552, 100554288, 107990608, 115424328, - 122855256, 130283240, 137708080, 145129584, 152547616, 159961952, 167372448, 174778896, - 182181152, 189579008, 196972288, 204360832, 211744464, 219122960, 226496192, 233863984, - 241226128, 248582448, 255932784, 263276976, 270614784, 277946112, 285270720, 292588448, - 299899136, 307202592, 314498688, 321787136, 329067872, 336340672, 343605344, 350861792, - 358109728, 365349088, 372579616, 379801184, 387013568, 394216640, 401410208, 408594112, - 415768160, 422932192, 430086016, 437229536, 444362464, 451484736, 458596064, 465696416, - 472785504, 479863168, 486929344, 493983712, 501026240, 508056672, 515074880, 522080640, - 529073824, 536054304, 543021824, 549976256, 556917440, 563845248, 570759424, 577659840, - 584546368, 591418816, 598276992, 605120768, 611949952, 618764352, 625563904, 632348352, - 639117568, 645871424, 652609664, 659332224, 666038848, 672729472, 679403776, 686061824, - 692703360, 699328128, 705936064, 712526976, 719100736, 725657216, 732196160, 738717440, - 745220992, 751706496, 758173952, 764623104, 771053888, 777466048, 783859456, 790234048, - 796589568, 802925888, 809242816, 815540288, 821818048, 828076096, 834314176, 840532096, - 846729856, 852907136, 859063872, 865199872, 871315072, 877409344, 883482368, 889534144, - 895564480, 901573248, 907560320, 913525504, 919468672, 925389632, 931288320, 937164672, - 943018240, 948849280, 954657344, 960442432, 966204416, 971943104, 977658304, 983350016, - 989017984, 994662144, 1000282368, 1005878464, 1011450368, 1016997760, 1022520768, 1028019136, - 1033492736, 1038941376, 1044364992, 1049763520, 1055136768, 1060484416, 1065806656, 1071103168, - 1076373888, 1081618688, 1086837376, 1092029952, 1097196160, 1102335872, 1107449088, 1112535680, - 1117595392, 1122628224, 1127633920, 1132612480, 1137563776, 1142487680, 1147383936, 1152252672, - 1157093632, 1161906688, 1166691712, 1171448576, 1176177280, 1180877696, 1185549568, 1190193024, - 1194807680, 1199393536, 1203950464, 1208478464, 1212977408, 1217447040, 1221887232, 1226298112, - 1230679424, 1235031040, 1239352960, 1243644928, 1247907072, 1252139008, 1256340864, 1260512384, - 1264653440, 1268764288, 1272844288, 1276893824, 1280912512, 1284900352, 1288857216, 1292782976, - 1296677760, 1300541056, 1304373120, 1308173824, 1311942912, 1315680512, 1319386240, 1323060224, - 1326702336, 1330312576, 1333890688, 1337436672, 1340950400, 1344431872, 1347880960, 1351297536, - 1354681472, 1358032896, 1361351424, 1364637312, 1367890304, 1371110272, 1374297216, 1377451008, - 1380571776, 1383659136, 1386713216, 1389733760, 1392720896, 1395674496, 1398594432, 1401480704, - 1404333312, 1407151872, 1409936640, 1412687360, 1415404160, 1418086784, 1420735232, 1423349376, - 1425929344, 1428475008, 1430986112, 1433462784, 1435904896, 1438312448, 1440685312, 1443023360, - 1445326848, 1447595392, 1449828992, 1452027776, 1454191616, 1456320256, 1458413824, 1460472448, - 1462495616, 1464483712, 1466436480, 1468353920, 1470235904, 1472082688, 1473893760, 1475669376, - 1477409536, 1479113984, 1480782720, 1482416000, 1484013440, 1485575040, 1487100928, 1488591104, - 1490045184, 1491463424, 1492845824, 1494192256, 1495502592, 1496776960, 1498015232, 1499217280, - 1500383360, 1501513344, 1502606976, 1503664512, 1504685824, 1505670912, 1506619520, 1507532032, - 1508408192, 1509247872, 1510051200, 1510818304, 1511548928, 1512243072, 1512900864, 1513522176, - 1514107008, 1514655360, 1515167104, 1515642496, 1516081408, 1516483584, 1516849280, 1517178496, - 1517471232, 1517727232, 1517946752, 1518129664, 1518276096, 1518385792, 1518459008, 1518495488, - 1518495488, 1518459008, 1518385792, 1518276096, 1518129664, 1517946752, 1517727232, 1517471104, - 1517178496, 1516849280, 1516483584, 1516081280, 1515642496, 1515167104, 1514655360, 1514107008, - 1513522176, 1512900864, 1512243072, 1511548928, 1510818304, 1510051200, 1509247872, 1508408192, - 1507532032, 1506619520, 1505670912, 1504685696, 1503664512, 1502606976, 1501513344, 1500383360, - 1499217280, 1498015232, 1496776960, 1495502592, 1494192128, 1492845824, 1491463424, 1490045184, - 1488590976, 1487100928, 1485575040, 1484013312, 1482416000, 1480782720, 1479113984, 1477409536, - 1475669376, 1473893760, 1472082560, 1470235904, 1468353920, 1466436480, 1464483712, 1462495616, - 1460472320, 1458413824, 1456320256, 1454191488, 1452027776, 1449828992, 1447595392, 1445326848, - 1443023360, 1440685312, 1438312448, 1435904768, 1433462656, 1430986112, 1428474880, 1425929344, - 1423349376, 1420735104, 1418086784, 1415404160, 1412687360, 1409936640, 1407151872, 1404333184, - 1401480704, 1398594432, 1395674496, 1392720896, 1389733760, 1386713088, 1383659008, 1380571648, - 1377451008, 1374297216, 1371110272, 1367890304, 1364637312, 1361351424, 1358032768, 1354681472, - 1351297408, 1347880832, 1344431744, 1340950272, 1337436672, 1333890688, 1330312576, 1326702336, - 1323060224, 1319386240, 1315680384, 1311942912, 1308173696, 1304373120, 1300541056, 1296677632, - 1292782848, 1288857088, 1284900224, 1280912512, 1276893696, 1272844288, 1268764160, 1264653440, - 1260512256, 1256340736, 1252138880, 1247906944, 1243644800, 1239352832, 1235030912, 1230679296, - 1226297984, 1221887104, 1217446912, 1212977280, 1208478336, 1203950464, 1199393408, 1194807552, - 1190192896, 1185549440, 1180877696, 1176177280, 1171448576, 1166691584, 1161906560, 1157093504, - 1152252544, 1147383808, 1142487552, 1137563648, 1132612352, 1127633792, 1122628096, 1117595264, - 1112535552, 1107448960, 1102335872, 1097196032, 1092029824, 1086837248, 1081618560, 1076373888, - 1071103104, 1065806592, 1060484352, 1055136576, 1049763456, 1044364928, 1038941312, 1033492608, - 1028019072, 1022520704, 1016997696, 1011450240, 1005878400, 1000282304, 994662080, 989017920, - 983349888, 977658240, 971942976, 966204288, 960442368, 954657280, 948849152, 943018176, - 937164480, 931288192, 925389504, 919468544, 913525312, 907560192, 901573184, 895564416, - 889534016, 883482304, 877409152, 871314944, 865199808, 859063744, 852907008, 846729728, - 840532032, 834314112, 828075968, 821817984, 815540096, 809242752, 802925696, 796589376, - 790233856, 783859392, 777465984, 771053824, 764622976, 758173824, 751706432, 745220864, - 738717312, 732196032, 725657088, 719100608, 712526848, 705935936, 699328000, 692703232, - 686061760, 679403712, 672729280, 666038720, 659332096, 652609536, 645871296, 639117440, - 632348224, 625563776, 618764224, 611949824, 605120640, 598276864, 591418688, 584546240, - 577659712, 570759296, 563845120, 556917312, 549976128, 543021696, 536054144, 529073696, - 522080512, 515074752, 508056512, 501026112, 493983648, 486929216, 479863072, 472785376, - 465696288, 458596000, 451484608, 444362336, 437229408, 430085952, 422932064, 415768032, - 408593952, 401410080, 394216512, 387013440, 379801024, 372579456, 365348960, 358109632, - 350861664, 343605248, 336340544, 329067744, 321787008, 314498528, 307202464, 299899008, - 292588320, 285270592, 277945984, 270614656, 263276832, 255932656, 248582320, 241225984, - 233863840, 226496064, 219122832, 211744320, 204360704, 196972144, 189578864, 182181008, - 174778768, 167372304, 159961824, 152547472, 145129456, 137707936, 130283104, 122855136, - 115424192, 107990472, 100554160, 93115416, 85674432, 78231384, 70786448, 63339808, - 55891640, 48442128, 40991448, 33539780, 26087306, 18634200, 11180647, 3726823 -}; - -/* Synthesis windows for overlap-add */ -/* for (j=0; jfftlen; j++) hs->olapWinSyn[j] = (float)sin(EVS_PI*((float)j+0.5f)/(float)(hs->fftlen); */ - -const Word16 olapWinSyn256_fx[256] = -{//Q15 - 201, 603, 1005, 1407, 1808, 2210, 2611, 3011, 3411, 3811, 4210, 4609, 5006, 5403, 5800, 6195, - 6589, 6983, 7375, 7766, 8156, 8545, 8933, 9319, 9704, 10087, 10469, 10849, 11228, 11605, 11980, 12353, - 12725, 13094, 13462, 13828, 14191, 14552, 14912, 15269, 15623, 15976, 16325, 16673, 17018, 17360, 17700, 18037, - 18371, 18703, 19032, 19358, 19681, 20001, 20318, 20631, 20942, 21250, 21555, 21856, 22154, 22448, 22740, 23027, - 23312, 23593, 23870, 24144, 24414, 24680, 24943, 25201, 25457, 25708, 25955, 26199, 26438, 26674, 26905, 27133, - 27356, 27576, 27791, 28002, 28208, 28411, 28609, 28803, 28993, 29178, 29359, 29535, 29707, 29874, 30037, 30196, - 30350, 30499, 30644, 30784, 30919, 31050, 31176, 31298, 31414, 31526, 31634, 31736, 31834, 31927, 32015, 32098, - 32176, 32250, 32319, 32383, 32442, 32496, 32545, 32589, 32629, 32663, 32693, 32718, 32737, 32752, 32762, 32767, - 32767, 32762, 32752, 32737, 32718, 32693, 32663, 32629, 32589, 32545, 32496, 32442, 32383, 32319, 32250, 32176, - 32098, 32015, 31927, 31834, 31736, 31634, 31526, 31414, 31298, 31176, 31050, 30919, 30784, 30644, 30499, 30350, - 30196, 30037, 29874, 29707, 29535, 29359, 29178, 28993, 28803, 28609, 28411, 28208, 28002, 27791, 27576, 27356, - 27133, 26905, 26674, 26438, 26199, 25955, 25708, 25457, 25201, 24943, 24680, 24414, 24144, 23870, 23593, 23312, - 23027, 22740, 22448, 22154, 21856, 21555, 21250, 20942, 20631, 20318, 20001, 19681, 19358, 19032, 18703, 18371, - 18037, 17700, 17360, 17018, 16673, 16325, 15976, 15623, 15269, 14912, 14552, 14191, 13828, 13462, 13094, 12725, - 12353, 11980, 11605, 11228, 10849, 10469, 10087, 9704, 9319, 8933, 8545, 8156, 7766, 7375, 6983, 6589, - 6195, 5800, 5403, 5006, 4609, 4210, 3811, 3411, 3011, 2611, 2210, 1808, 1407, 1005, 603, 201 -}; - - -const Word16 olapWinSyn320_fx[320] = -{//Q15 - 160, 482, 804, 1125, 1447, 1768, 2089, 2410, 2731, 3051, - 3371, 3691, 4011, 4330, 4648, 4967, 5284, 5602, 5918, 6234, - 6550, 6865, 7179, 7493, 7805, 8117, 8429, 8739, 9049, 9358, - 9665, 9972, 10278, 10583, 10887, 11190, 11492, 11793, 12092, 12391, - 12688, 12984, 13278, 13572, 13864, 14155, 14444, 14732, 15019, 15304, - 15588, 15870, 16151, 16430, 16707, 16983, 17258, 17530, 17801, 18070, - 18338, 18604, 18868, 19130, 19390, 19648, 19905, 20159, 20412, 20663, - 20911, 21158, 21403, 21645, 21886, 22124, 22360, 22594, 22826, 23056, - 23283, 23509, 23732, 23952, 24171, 24387, 24600, 24812, 25021, 25227, - 25431, 25633, 25832, 26029, 26223, 26415, 26604, 26790, 26974, 27155, - 27334, 27510, 27684, 27854, 28023, 28188, 28351, 28511, 28668, 28822, - 28974, 29123, 29269, 29412, 29552, 29690, 29825, 29956, 30085, 30211, - 30334, 30455, 30572, 30686, 30797, 30906, 31011, 31114, 31213, 31309, - 31403, 31493, 31581, 31665, 31746, 31824, 31899, 31971, 32040, 32106, - 32169, 32229, 32285, 32339, 32389, 32436, 32480, 32521, 32559, 32594, - 32625, 32653, 32679, 32701, 32720, 32736, 32748, 32758, 32764, 32767, - 32767, 32764, 32758, 32748, 32736, 32720, 32701, 32679, 32653, 32625, - 32594, 32559, 32521, 32480, 32436, 32389, 32339, 32285, 32229, 32169, - 32106, 32040, 31971, 31899, 31824, 31746, 31665, 31581, 31493, 31403, - 31309, 31213, 31114, 31011, 30906, 30797, 30686, 30572, 30455, 30334, - 30211, 30085, 29956, 29825, 29690, 29552, 29412, 29269, 29123, 28974, - 28822, 28668, 28511, 28351, 28188, 28023, 27854, 27684, 27510, 27334, - 27155, 26974, 26790, 26604, 26415, 26223, 26029, 25832, 25633, 25431, - 25227, 25021, 24812, 24600, 24387, 24171, 23952, 23732, 23509, 23283, - 23056, 22826, 22594, 22360, 22124, 21886, 21645, 21403, 21158, 20911, - 20663, 20412, 20159, 19905, 19648, 19390, 19130, 18868, 18604, 18338, - 18070, 17801, 17530, 17258, 16983, 16707, 16430, 16151, 15870, 15588, - 15304, 15019, 14732, 14444, 14155, 13864, 13572, 13278, 12984, 12688, - 12391, 12092, 11793, 11492, 11190, 10887, 10583, 10278, 9972, 9665, - 9358, 9049, 8739, 8429, 8117, 7805, 7493, 7179, 6865, 6550, - 6234, 5918, 5602, 5284, 4967, 4648, 4330, 4011, 3691, 3371, - 3051, 2731, 2410, 2089, 1768, 1447, 1125, 804, 482, 160 -}; - -/*-------------------------------------------------------------------* - * AMR-WB ISF codebook - common 1st stage for 46bit and 36bit codebooks, - * 2 splits - * - * codebook vector dimension number of vectors - * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ - * 1_1 9 256 - * 1_2 7 256 - *-------------------------------------------------------------------*/ - -/*-------------------------------------------------------------------* - * 1nd stage, 1st split: ISF0 to ISF8 - *-------------------------------------------------------------------*/ - -const Word16 dico1_isf_fx[] = -{/*Qlog2(2.56)*/ - 740, 1263, 1292, 1006, 997, 1019, 1017, 976, 923, - 557, 946, 1049, 867, 846, 990, 1112, 1262, 1241, - 633, 898, 996, 756, 662, 683, 783, 909, 996, - 830, 736, 278, 820, 1254, 686, 712, 1039, 473, - 503, 885, 1508, 1307, 1282, 1172, 1119, 1209, 1061, - 416, 719, 989, 1227, 1001, 1052, 954, 741, 1044, - 585, 1132, 1233, 1091, 1247, 1433, 1512, 1448, 1314, - -31, 469, 803, 659, 619, 658, 843, 987, 1113, - 842, 1678, 1841, 1549, 1474, 1256, 1082, 905, 742, - 370, 1216, 1768, 1633, 1212, 636, 22, -330, 71, - 73, 738, 893, 968, 993, 1768, 2273, 1840, 1391, - 1513, 1714, 1238, 534, 276, 315, 461, 459, 508, - 421, 1293, 1640, 1623, 1742, 1617, 1499, 1284, 1006, - -95, 752, 1680, 1569, 1618, 1436, 1200, 980, 712, - -78, 831, 1194, 1110, 1378, 1481, 1492, 1365, 1217, - 670, 1208, 1168, 860, 742, 601, 528, 403, 309, - 397, 621, 966, 752, 579, 398, 400, 329, 252, - 510, 864, 1108, 807, 939, 902, 925, 717, 481, - 539, 835, 913, 719, 617, 544, 591, 565, 642, - 162, 889, 654, 108, -34, 244, 488, 561, 532, - -62, 1033, 1308, 1035, 1127, 1098, 1029, 961, 823, - -14, 945, 990, 801, 755, 815, 847, 913, 892, - 394, 1765, 1666, 1339, 1117, 806, 642, 479, 380, - 529, 1851, 2003, 1228, 622, -41, -416, 344, 819, - 635, 1058, 883, 492, 372, 312, 317, 274, 241, - 279, 966, 1642, 1478, 1463, 1123, 795, 525, 339, - 457, 955, 1177, 1214, 1427, 1457, 1345, 917, 539, - 148, 751, 1515, 1105, 867, 606, 474, 448, 399, - 579, 1081, 1035, 390, 3, -263, -198, -82, 38, - 18, -68, -12, 313, 761, 405, 249, 111, -76, - -91, 827, 948, 648, 613, 535, 522, 490, 421, - 41, -44, -281, -472, 652, 534, 193, 135, -90, - 41, -121, -356, -60, 663, 307, 61, -48, -344, - -118, -204, 328, 512, 870, 793, 610, 402, 186, - 156, 293, 74, -338, -475, -897, -594, -161, -497, - 226, 131, -138, 307, 169, -271, -164, -387, -624, - 62, -32, -61, -252, -541, -828, -1027, -523, -662, - 102, -61, 141, 112, -270, -251, -541, 25, -150, - 6, -132, -356, -686, -96, -322, -522, -31, -326, - -36, -209, -521, -229, 307, -132, -5, -99, -384, - 60, -51, -237, -668, -973, -407, -708, -75, -172, - 26, -138, -266, 111, -302, 43, -278, -356, -359, - 570, 822, 496, -154, -312, -92, 137, 279, 371, - -146, 368, 409, 68, 6, 77, 167, 202, 162, - -103, 294, 607, 415, 483, 462, 480, 431, 408, - -120, -338, -612, -524, 584, 331, 92, 433, 276, - -178, -293, -154, -41, 269, 100, -9, 213, 160, - -218, -304, 463, 454, 397, 273, 202, 286, 273, - -232, 7, 6, -388, -472, -427, -378, -167, -100, - -294, -183, 134, -47, 101, -88, -84, -117, -3, - 57, 17, -202, -634, -989, -1119, -533, 176, -36, - 120, -28, 23, 111, -319, 318, -22, -77, 266, - -271, -464, -434, -658, -640, -385, -385, -99, -69, - -198, -259, -266, -44, -39, -139, -137, 171, 66, - 9, -145, -377, -846, -1000, -111, -325, 342, 135, - -81, -286, -380, 192, -57, 307, 76, -24, -140, - 677, 702, 247, 56, 249, 141, -105, -236, -99, - 36, -39, -69, 348, 198, -93, 322, 91, -72, - -127, -376, -657, 139, 623, 223, 501, 306, 220, - -113, -384, -796, 504, 438, 85, 213, -83, -194, - -174, -422, 7, 1155, 1089, 1182, 1003, 945, 806, - 8, -126, -317, -103, -351, -695, -98, -268, -537, - 33, -103, -290, 167, -39, -407, 44, -208, -375, - 104, -23, -64, -291, -637, -851, -1084, -61, -112, - -75, -306, -434, 218, -148, -354, -680, -133, -216, - -121, -377, -718, -97, -130, -361, -156, -379, -599, - -56, -254, -586, 235, 157, -214, 11, -260, -149, - -124, -267, -397, -580, -593, -527, -805, -385, 346, - -193, -440, -708, -351, -141, -255, -499, -147, -185, - 448, 660, 494, 208, 509, 461, 338, 291, 149, - -223, 88, 335, 159, 212, 191, 286, 308, 205, - -171, -242, 514, 362, 295, 524, 552, 694, 585, - -64, -308, -448, -21, 284, 786, 446, 289, 92, - -218, -390, -7, 169, 206, 330, 352, 408, 358, - -36, 702, 959, 859, 861, 1115, 1269, 1357, 1305, - -133, -341, -65, 678, 417, 440, 486, 518, 780, - 33, -44, -191, -344, -461, -755, -201, 217, -31, - -353, -547, -44, 123, -61, -68, -79, 29, 60, - 73, -57, -406, -766, -1243, -1203, 240, 400, 165, - -73, -282, -601, -213, -171, -375, 332, 35, -103, - -29, -207, -553, -476, -638, -908, 172, -22, -135, - -192, -239, -164, -103, -111, -47, 153, 125, 110, - -1, -203, -570, -1030, -1424, -535, 155, 1, 147, - -333, -653, -865, -197, -158, -21, -44, 95, 108, - 389, 588, 490, 33, -237, -524, -628, -136, -260, - 40, -177, -462, 453, 862, 380, 131, -130, -405, - -76, -281, -741, -742, 898, 619, 277, 71, -222, - -32, -265, -556, -25, 994, 682, 305, 126, -165, - -69, -349, -585, 234, 1158, 903, 626, 510, 251, - -1, -99, -272, -210, -603, -351, -540, -811, -383, - -16, -230, -504, 410, 149, -205, -343, -651, -639, - 103, -9, -227, -205, -562, -781, -1079, -1208, -156, - 143, 63, -135, -67, -317, -602, -784, -1154, -640, - -144, -391, -674, -622, -200, -254, -660, -947, -395, - -40, -250, -625, 27, 543, 94, -131, -386, -673, - -123, -371, -757, -451, -564, -614, -415, -711, -35, - -116, -309, -593, -268, 239, -33, -338, -650, -135, - 94, 251, 554, 57, -312, -423, -154, -57, 235, - -268, -71, 381, 114, -44, -87, 125, 173, 133, - -131, -19, 1149, 670, 486, 356, 309, 369, 296, - -223, -501, -899, -722, -70, 6, 131, 310, 394, - -99, -303, -517, 249, 64, -53, 135, -11, 453, - -147, -399, -730, -401, 817, 738, 802, 749, 575, - -154, -435, -739, 800, 593, 366, 529, 318, 326, - -224, 45, -39, -387, -515, -518, -608, -384, -321, - -315, -377, 143, -101, -113, -377, -177, -144, -12, - 117, 40, -239, -651, -1051, -581, -737, -990, -328, - 26, -50, -157, -23, -453, -283, -531, -546, 192, - -252, -501, -743, -589, -627, -499, -328, -118, -72, - -324, -494, -244, -306, -144, -177, -262, -135, -78, - -36, -234, -519, -961, -1290, -314, -479, -371, -45, - -95, -292, -535, -8, -300, 112, -164, -277, 198, - -99, -128, 880, 836, 579, 351, 23, -95, -217, - -27, -258, 124, 1011, 597, 425, 144, 7, -73, - -69, -300, -683, -435, 1132, 899, 504, 332, 109, - -74, -323, -637, 563, 1074, 608, 371, 105, -49, - -259, -121, 1440, 1334, 1628, 1490, 1438, 1223, 933, - -82, -306, -613, -222, -378, -675, -545, -671, -845, - 53, -124, -347, 422, 52, -125, -270, -529, 9, - 79, -89, -320, -662, -999, -1199, -1243, -676, -297, - -68, -273, -611, 137, -146, -397, -627, -845, -220, - -112, -346, -797, -826, 234, -132, -188, -278, -522, - -159, -405, -734, -419, 293, 74, -167, -167, 184, - -153, -437, -833, -1080, -336, -472, -561, -340, -253, - -169, -423, -820, -904, -131, -19, -346, -604, 31, - 33, -31, 312, 62, -148, 49, -59, 564, 486, - -306, -333, 194, -44, 67, 72, 147, 205, 243, - -207, -49, 1360, 983, 969, 991, 1014, 1110, 973, - -211, -172, 883, 627, 711, 674, 705, 798, 746, - -88, -325, -763, -974, 687, 908, 514, 382, 172, - -292, -612, -805, 63, 131, 270, 259, 352, 348, - -235, -84, 955, 818, 1120, 1289, 1559, 1480, 1285, - -180, -461, -614, 657, 691, 745, 854, 783, 713, - -97, -309, -477, -614, -777, -734, -768, -526, -472, - -344, -476, -35, -169, 49, -77, -150, -240, -141, - -52, -268, -639, -919, -1278, -1113, -342, -333, -151, - -68, -242, -585, -73, -209, -478, -159, -429, 133, - -197, -499, -1005, -1268, -272, -224, -105, -67, 17, - -363, -618, -414, -116, -62, 20, 10, 116, 108, - -195, -475, -906, -1260, -891, -441, -277, -142, -28, - -226, -519, -950, -700, -275, -266, -116, -105, 82, - 404, 511, 520, 327, 17, -194, -333, -536, -586, - -114, -130, 276, 237, 204, 342, 135, -16, -111, - 191, 180, -137, -467, 272, 106, -95, 17, -192, - -80, -290, -626, 194, 598, 196, 21, -281, 77, - 137, 367, 534, 764, 670, 382, 296, 153, 84, - 303, 497, 144, -85, -125, -539, -482, -464, -764, - 233, 347, 68, -147, 169, -210, -242, -226, -482, - 307, 422, 154, -175, -386, -722, -724, -904, -1015, - 309, 308, 160, -60, -470, -420, -598, -791, -219, - 68, 121, -137, -560, -146, -446, -515, -494, -729, - 130, 53, -227, 46, 474, 32, -161, -192, -490, - 213, 164, -71, -465, -876, -161, -456, -587, -48, - 218, 117, 39, 177, -194, -88, -226, -418, 50, - 210, 547, 569, 279, 121, -44, -50, 10, -84, - 58, 140, 182, -5, 267, 117, 106, 211, 198, - 153, 559, 872, 460, 222, 108, 188, 180, 183, - 158, 119, 284, -153, -271, 229, 87, 110, -57, - -183, 82, 118, 21, 13, 40, 118, 191, 185, - 163, 56, 609, 341, 50, 329, 68, 266, 218, - 100, 206, 18, -304, -107, -436, -487, -65, -306, - -86, 154, 134, -30, -45, -73, -104, -80, -96, - 245, 330, 10, -440, -849, -1082, 79, 40, -265, - 196, 372, 272, -181, -493, -389, 275, 80, -59, - 2, -12, -246, -505, -100, -436, 21, -187, -431, - -221, -48, 36, -271, -186, -147, -109, 26, 71, - 213, 140, 72, -351, -620, -84, -363, 69, 46, - 91, 167, -3, -95, -99, -105, -48, 114, 147, - 259, 249, 172, 607, 406, 52, 59, -189, -320, - 115, -85, -54, 574, 128, 226, -59, -253, 130, - 39, 364, 757, 940, 728, 660, 659, 583, 770, - -115, -338, -760, -471, 394, 37, 441, 178, 6, - -57, -305, -525, 796, 453, 188, -4, -114, 248, - 71, 444, 797, 731, 1096, 1157, 1222, 1029, 811, - 135, 359, 551, 425, 749, 815, 874, 704, 502, - 132, 247, 0, -206, -449, -750, -258, -514, -633, - 248, 249, 91, 121, -195, -499, -90, -282, -435, - 78, 20, -277, -623, -983, -1224, -415, -458, -639, - 347, 509, 208, -179, -464, -728, -76, -237, -486, - -103, -343, -756, -713, -265, -609, -191, -398, -636, - -121, -383, -749, 567, 252, -36, -354, -417, -50, - 204, 100, -149, -650, -1081, -47, -7, -263, 111, - -46, -180, -267, -324, -562, -394, -692, 398, 292, - 482, 670, 683, 624, 442, 165, 116, 36, -149, - 108, 247, 291, 247, 355, 122, 109, 224, 296, - 292, 349, 725, 482, 388, 329, 429, 620, 667, - -34, 197, 213, -127, 84, 494, 620, 575, 375, - 126, 207, 172, 167, 362, 202, 296, 395, 455, - -6, 250, 539, 467, 636, 801, 1149, 1287, 1118, - 27, 240, 369, 280, 440, 411, 634, 892, 953, - 159, 170, -58, -395, -797, -690, 77, -211, -334, - -5, -28, -13, -74, -335, -603, 300, 88, -205, - 82, -33, -364, -698, -1203, -1153, 110, -146, -289, - 113, 1, -243, -588, -994, -496, 414, 160, 42, - -56, -247, -440, -693, -996, -479, 11, -178, -357, - -151, -353, -327, -211, -340, 141, 65, 425, 453, - 34, -169, -455, -932, -1215, 138, 499, 256, 324, - 68, 139, -15, -547, -478, 17, 306, 502, 481, - -32, -134, 445, 129, -143, -244, -503, -507, -599, - 61, -140, -345, 496, 458, -2, 20, -227, -514, - 215, 519, 920, 1053, 1090, 791, 528, 290, 155, - -54, -233, -647, -602, 639, 294, -2, -167, -442, - -78, -315, -791, -113, 820, 403, 158, -116, -356, - -105, -379, -236, 1224, 893, 749, 568, 356, 214, - -17, -199, -144, 50, -283, -247, -578, -846, -1087, - 69, -11, -381, -206, 209, -284, -387, -416, -716, - 39, -5, -145, -374, -682, -909, -1074, -1169, -1066, - 287, 226, 67, -221, -662, -171, -421, -642, -707, - -132, -348, -538, -448, -20, -4, -354, -748, -933, - 4, -75, -289, -598, 317, 52, -208, -297, -559, - -88, -264, -358, -589, -631, -248, -523, -822, -1071, - 70, -8, 54, -314, -515, 92, -146, -274, -493, - 199, 62, 391, 158, -141, 71, -219, -203, -207, - 152, 40, 329, 162, -29, 48, -149, 108, 127, - 267, 722, 1256, 882, 625, 248, 8, -81, -60, - -58, -138, -291, -600, -12, -2, -39, 147, 117, - -107, -345, -513, 459, 76, 92, -272, 388, 262, - 362, 516, 203, -409, -716, -831, -331, 185, 209, - -117, -391, -298, 671, 292, 538, 257, 166, -38, - -102, -319, -194, -283, -573, -262, -579, -219, -444, - -235, 78, 11, -168, -101, -229, -263, -321, -123, - 70, 50, -170, -599, -996, -588, -263, -516, -455, - 394, 363, 229, -136, -538, 21, -183, -348, -201, - -124, -368, -640, -879, -847, -209, -409, -494, -515, - -127, -341, -541, -425, -510, -10, -252, -473, -291, - 84, -69, -201, -676, -868, 103, -311, -132, -320, - 5, -173, -188, -297, -628, 197, -57, 7, -11, - 49, -160, 56, 558, 111, 33, -311, -440, -463, - -1, -246, -307, 862, 453, 139, -170, -355, -232, - -197, -38, 1702, 1331, 1252, 950, 692, 504, 426, - -108, -344, -861, -1172, 444, 354, 88, -46, -220, - -53, -321, -494, 1113, 744, 364, 198, -34, -75, - -69, 199, 897, 1140, 1343, 1183, 977, 742, 522, - 122, 44, -269, 27, -155, -562, -307, -590, -773, - 154, 42, -160, 252, -129, -305, -471, -733, -371, - 135, 185, -82, -416, -722, -913, -504, -743, -880, - 149, 214, -84, -329, -680, -835, -426, -661, -81, - -128, -380, -735, -998, -337, 17, -182, -467, -697, - -84, -290, -510, -592, 13, 440, 154, -38, -279, - 70, -61, -246, -727, -1047, -80, -381, -535, -704, - 178, -2, -146, -670, -938, 482, 138, 63, 65, - -11, 15, 772, 443, 142, -20, -209, -126, -161, - -32, -249, 95, 552, 124, 30, -343, 82, -86, - -163, -257, 899, 1097, 906, 751, 502, 390, 294, - -51, -258, -447, -806, -368, 763, 464, 364, 183, - -166, -374, -367, 87, 35, 399, 418, 856, 833, - -205, -310, 588, 778, 785, 1065, 1118, 1245, 1157, - -173, -312, 107, 345, 400, 790, 870, 1113, 1001, - -7, -120, -387, -410, -614, -943, -226, -384, -491, - -203, -288, -51, -331, -90, -178, -408, -573, -338, - 56, -29, -273, -627, -1041, -798, -247, -467, 148, - 66, -2, -205, -205, -575, -349, -57, -352, -58, - -45, -225, -471, -924, -497, 77, -32, 44, -135, - -277, -491, -497, -502, -424, -202, -137, 77, 96, - 26, -179, -469, -1008, -1260, 262, -35, -132, -259, - -66, -232, -447, -533, -789, -191, -100, -267, 364, - 111, 43, -287, -423, -608, -987, -922, -799, -827, - 77, 76, -101, -260, -549, -850, -88, -231, -329, - 75, 24, -66, -269, -427, -528, -773, 201, -5, - 67, 7, -61, -320, -487, 12, -200, -242, -94, - 27, -54, -149, -354, -661, -594, -450, -481, 560, - 31, -69, -246, -549, -1141, -178, -232, -275, -288, - 16, -84, -176, 7, -83, -210, -246, -424, -589, - 63, -60, -201, -90, -269, -400, -685, -1218, -258, - 169, 217, 142, -71, -243, -433, -504, -511, -537, - 6, -105, -234, -321, -188, -131, -307, -521, -1319, - -34, -151, -369, 11, 44, -95, -280, -500, 160, - 31, -37, -163, -334, 288, 89, -150, -86, -299, - -35, -161, -362, -74, -74, -263, 240, 9, -153, - -45, -208, -529, -896, 89, 24, -130, -313, -373, - 234, 276, 197, -10, -236, -162, -134, -85, -112, - 42, -73, 133, 392, 98, 72, -153, -162, -99, - -3, -145, -338, 408, 401, 133, -52, -296, -501, - 3, -109, -152, -85, -56, 42, -145, 703, 205, - -49, -149, -281, -134, -121, -41, -21, 16, 958, - 30, -107, -196, -463, -523, 490, 236, 70, -128, - -33, -161, -364, -148, 757, 516, 250, 43, -65, - -34, -193, -244, 750, 527, 349, 234, 172, 134, - -64, -223, -379, 55, 28, 248, 793, 442, 320, - 29, -85, -298, -622, -888, 127, 206, 387, 460, - -48, -170, -477, -876, 573, 635, 440, 375, 311, - 42, 3, -212, -441, -718, -821, 388, 373, 211, - -106, -155, 1092, 459, 570, 561, 506, 604, 514, - -144, -264, 0, 460, 619, 877, 916, 1273, 921 -}; - -/*-------------------------------------------------------------------* - * 1nd stage, 2nd split: ISF9 to ISF15 - *-------------------------------------------------------------------*/ - -/* ISF codebook - common 1st stage, 2nd split (only in AMR-WB IO mode) */ -const Word16 dico2_isf_fx[] = -{/*Qlog2(2.56)*/ - 1357, 1313, 1136, 784, 438, 181, 145, - 636, 648, 667, 568, 442, 217, 362, - 427, 440, 674, 524, 332, 117, -417, - 121, 295, 468, 465, 230, 44, -221, - -147, -240, 149, 80, 390, 278, 106, - -418, -556, 552, 511, 235, 144, -95, - 43, 193, 274, 150, 67, 34, -273, - -43, -126, 171, 416, 282, 63, -354, - -372, -86, -344, -108, -94, -182, -89, - -600, -840, -200, 465, 258, -11, -253, - -48, 329, 97, -290, -543, -795, -354, - -570, -117, 187, 10, -133, -416, -76, - -618, -129, -247, -371, 45, -76, 277, - -1022, -1079, 126, 474, 254, 127, 52, - -281, 76, -167, -361, -283, -551, -283, - -119, -52, -1, 134, -32, -204, -415, - 1064, 827, 637, 684, 464, 209, 12, - 482, 416, 449, 371, 335, 294, 194, - 719, 576, 365, 135, 113, 91, -199, - 298, 176, 493, 366, 194, 163, 36, - -35, -236, -259, -36, -4, 99, 152, - -98, -306, -27, 228, 90, 111, -86, - 91, 13, -211, -258, -106, 86, -64, - 73, -35, -57, -31, 162, 35, -192, - -109, -335, -629, -66, -61, -128, 322, - -495, -669, -728, 193, 31, -220, 122, - 324, 95, -89, -91, -409, -710, -154, - 0, -234, 92, 33, -343, -609, -220, - -343, -408, -476, -655, -153, 82, 222, - -490, -745, -255, 49, -48, 135, -127, - 119, -67, -328, -390, -272, -545, -56, - -57, -130, -10, -7, -164, -47, -22, - 984, 1064, 961, 568, 210, -27, 16, - 811, 691, 754, 514, 224, -35, 166, - 662, 704, 618, 386, 57, -211, -257, - 510, 359, 418, 393, 91, -144, -18, - -193, -31, -27, 223, 89, -143, 24, - -112, -98, 471, 319, 185, 3, 175, - 252, 146, -47, 272, 48, -211, -234, - 146, 69, 203, 364, 68, -52, 51, - -259, -478, -697, -349, -758, -501, 63, - -501, -769, -289, 79, -311, -497, -106, - 251, 53, -235, -469, -895, -884, 145, - -416, -551, 140, -133, -523, -775, 44, - -326, -423, -713, -497, -86, -431, 99, - -757, -772, -160, -76, -46, -32, 379, - 85, -35, -200, -401, -663, -1040, -247, - -180, -330, -92, -376, 27, -183, -110, - 1279, 1086, 781, 502, 324, 164, 157, - 682, 466, 449, 277, 146, 28, 409, - 635, 472, 390, 107, -232, -538, -139, - 196, 396, 332, 213, 209, -29, -81, - 150, -95, -312, 76, -77, -320, -50, - 46, 9, 47, 175, 139, 30, 384, - 218, 206, -24, -250, -96, -276, -183, - 26, 119, 38, 14, -4, -133, -52, - -477, -614, -987, -715, -631, -813, 200, - -744, -1009, -1065, -745, -631, -171, 18, - -137, -251, -483, -613, -980, -1203, 12, - -605, -767, -562, -686, -1088, -515, 58, - -202, -428, -782, -1072, -96, -234, -179, - -480, -709, -1070, -897, -131, -92, 321, - -145, -193, -512, -729, -572, -765, -210, - -331, -585, -525, -631, -281, -208, -303, - 1165, 1104, 939, 828, 716, 426, 155, - 6, -109, 820, 778, 415, 113, -27, - 381, 339, 314, 265, 121, -9, -474, - -373, 47, 584, 442, 99, -231, -113, - -496, -38, -285, 262, 305, 170, 4, - -587, -556, 69, 66, 471, 354, 13, - -138, 70, -18, 106, 67, 167, -302, - -445, -141, 185, 191, 151, 83, -133, - -257, -521, -720, -198, 134, -46, -182, - -819, -1168, -777, 512, 359, 95, -113, - 137, -2, -74, -138, -401, -114, -371, - -242, -466, 204, 223, -31, -212, -192, - -532, -637, -466, -686, 256, 277, -139, - -1141, -1244, -381, -75, -54, 14, 88, - -311, 115, -143, -499, -343, 124, -416, - -616, -147, -135, 43, -4, 121, -369, - 835, 783, 641, 390, 355, 350, 64, - 72, 194, 443, 467, 436, 219, 372, - 464, 369, 192, 4, -156, -72, -226, - 57, 206, 303, 205, 188, 101, 265, - -40, -205, -488, -184, 276, 64, -26, - -217, -433, -297, 137, 328, 308, -289, - 378, 81, -308, -465, 57, -37, 227, - -100, 24, -36, -151, 199, 8, 143, - -426, -697, -1059, -133, 388, 161, 321, - -644, -1023, -1271, 39, 66, -123, 70, - 372, 177, -173, -556, -553, -304, -189, - -117, -369, -425, -122, -462, -152, -73, - -649, -850, -1189, -767, 497, 360, 222, - -798, -1139, -1455, -190, 430, 234, 179, - 42, -94, -405, -692, 38, -202, -246, - -169, -366, -290, -88, -64, 32, -292, - 1010, 923, 938, 710, 465, 230, 342, - 217, 300, 1054, 675, 68, -458, -179, - 78, 453, 316, 18, -237, -496, -243, - 167, 21, 424, 215, -91, -303, -170, - -290, -81, -70, -67, 40, 54, -59, - -353, -427, -90, 53, 94, 9, 54, - -28, 318, 283, 15, -240, -58, 79, - -75, -121, 229, 35, 58, 6, -133, - -351, -514, -744, -834, -705, -137, 164, - -1124, -1388, -1055, -230, -73, 40, 36, - -163, -233, -532, -785, -1170, -697, 96, - -788, -959, -246, -430, -624, -165, -8, - -856, -540, -630, -907, -337, -70, 76, - -937, -1042, -659, -733, -208, 199, -26, - -523, 78, -98, -501, -869, -890, -81, - -624, -703, -45, -348, -25, 87, -186, - 1005, 823, 546, 249, 90, -22, 207, - 298, 397, 381, 319, 200, 62, 303, - 473, 379, 133, -247, -632, -441, 75, - 284, 208, 391, 115, -25, 44, 95, - -72, 79, -95, -63, -129, -293, 203, - -164, -349, 115, 122, 69, -1, 378, - 348, 170, 99, 58, -179, -302, 188, - -190, -2, 150, 23, -51, -11, 216, - -615, -863, -1090, -1427, -802, -48, -6, - -961, -1276, -1548, -727, -58, 56, 223, - -124, -255, -561, -988, -1277, -148, -82, - -480, -660, -891, -1191, -1339, -325, 20, - -621, -917, -1296, -1350, 264, 289, 50, - -844, -1022, -1345, -1329, -293, 46, 278, - -260, -468, -829, -1176, -533, -560, -78, - -215, -484, -822, -1233, -791, 15, -138, - 1301, 1317, 1262, 1048, 716, 357, -64, - 578, 824, 925, 802, 630, 362, 102, - 470, 925, 767, 514, 327, 190, -112, - 225, 492, 495, 437, 598, 384, -45, - 43, 82, -42, 175, 519, 342, -64, - -304, -154, 159, 576, 403, 221, 327, - 214, 244, 122, -62, 312, 92, -160, - 218, 208, 310, 268, 306, 323, -199, - -285, -269, -79, -124, -143, -153, 236, - -205, -384, -426, 344, 59, -185, -184, - -272, 247, 126, -210, -518, -468, 78, - -99, -120, 502, 160, -280, -557, 304, - -423, -17, -283, -443, 215, 212, -140, - -564, -684, -228, 510, 361, 130, 323, - -428, 335, 98, -65, 36, -215, -246, - -362, 51, 364, -16, -234, 150, -165, - 914, 883, 751, 653, 676, 464, -153, - 631, 545, 535, 720, 596, 360, -81, - 783, 712, 512, 439, 341, 251, -391, - 497, 417, 249, 372, 295, 173, -193, - 128, -110, -385, 93, 39, 173, -231, - 216, -59, -253, 462, 389, 154, 69, - 455, 270, -4, -337, -49, 233, -322, - 307, 143, 53, 218, 128, 236, -156, - -37, -186, -240, -411, -110, 9, 399, - -140, -365, -628, 258, 380, 214, 277, - 131, 454, 177, -285, -520, 108, -214, - 77, -141, 201, -123, -490, -131, 60, - -14, -194, -521, -741, 273, 362, -33, - -362, -566, -287, -228, 161, 237, 317, - -269, 195, -75, -375, -204, 11, 77, - -128, -264, -156, -223, -475, 265, 27, - 1238, 1147, 916, 689, 432, 210, -280, - 800, 664, 879, 726, 411, 160, -164, - 454, 686, 536, 275, 147, 46, 111, - 303, 486, 512, 355, 241, 181, -69, - 79, 92, 29, 147, 233, 52, 17, - -171, 289, 131, 439, 271, 3, -10, - 413, 241, 144, 174, 155, -2, 14, - 58, 217, 247, 219, 149, 175, -18, - 228, -8, -240, -206, -513, -191, 202, - -96, -272, -454, 33, -300, -575, 46, - -10, -108, -246, -347, -770, -535, 9, - -326, -430, -61, -321, -704, -299, 201, - -1, -280, -603, -419, -185, 18, -36, - -516, -522, -379, -291, -181, -97, 27, - -159, -313, -525, -224, -510, -831, -197, - -292, -459, -59, -310, -562, -143, -351, - 1066, 912, 631, 389, 207, 86, -224, - 596, 512, 596, 505, 314, 122, -48, - 787, 861, 441, -93, -303, 33, -190, - 257, 469, 337, 51, 15, 298, -93, - 295, 73, -119, 25, 36, 23, 108, - -28, -3, -32, 114, 21, 185, 107, - 482, 305, 15, -279, -319, 52, 96, - 226, 46, 115, 72, -136, 133, -125, - 18, -207, -559, -590, -503, -482, 321, - -571, -789, -951, -172, -441, -538, 113, - 181, 14, -310, -641, -1001, -202, 159, - -136, -393, -433, -513, -911, -144, -22, - 72, -265, -706, -954, -159, 53, 332, - -338, -591, -852, -383, -395, 56, 44, - 43, -158, -464, -897, -631, -157, -294, - -161, -128, -328, -573, -483, -125, 11, - 1017, 906, 1051, 1005, 679, 341, -102, - 359, 334, 1567, 1314, 723, 105, 10, - -65, 726, 529, 301, 220, 43, -273, - -510, 436, 719, 566, 358, 179, 114, - -560, 298, 133, -120, 342, 225, 14, - -899, -101, 217, 617, 400, 146, -58, - -41, 352, 82, -196, 39, 121, -167, - -212, 59, 447, 284, 423, 250, -169, - -371, -484, -596, 30, -41, 249, 22, - -372, -650, -794, 477, 445, 216, -79, - -352, 275, 17, -443, -929, 92, 19, - -699, -696, 431, 264, -49, -310, 182, - -978, -217, -430, -400, 101, 261, 72, - -929, -889, -357, -13, 463, 378, 236, - -826, 56, 30, -299, -360, -128, -51, - -878, -299, -111, 75, 65, 36, 3, - 817, 368, -25, 354, 697, 591, -173, - 309, 212, 222, 751, 484, 140, -56, - 593, 379, 70, -8, 258, 180, 110, - 165, -46, 255, 297, 219, 273, 105, - 160, -70, -358, -181, 379, 330, 319, - -238, -369, -198, 740, 580, 319, -143, - 201, 109, -202, -456, 328, 276, -141, - 203, 170, 111, 42, 207, 360, 188, - -345, -399, -513, -233, 650, 422, 81, - -635, -961, -1220, 463, 539, 204, 209, - 202, -25, -194, -498, -787, 193, -143, - -449, -538, 195, -106, -331, 68, 62, - -228, -477, -840, -576, 317, 128, 283, - -671, -937, -807, -114, 391, 335, -62, - 246, 2, -314, -679, -303, 180, -88, - -107, -272, 90, -198, -28, 290, -112, - 885, 1149, 1021, 712, 496, 281, -83, - 269, 492, 787, 643, 347, 70, 124, - 336, 636, 499, 92, -229, -179, 191, - 26, 402, 564, 340, 149, -11, 135, - -440, 561, 470, 204, -72, -186, 140, - -720, 14, 355, 229, 68, -133, 465, - 110, 310, 103, 12, 106, 29, 158, - -178, 113, 161, 142, 121, 115, 27, - -651, -414, -645, -152, -164, -13, -429, - -639, -944, -681, -104, -81, 52, -189, - -663, -164, -316, -683, -954, -205, -83, - -609, -669, -172, -517, -694, 283, -80, - -646, -152, -383, -678, -246, -40, -143, - -747, -796, -745, -390, -98, 43, 275, - -599, -199, -398, -433, -436, -538, 31, - -1107, -568, -376, -265, -126, -21, 1, - 847, 573, 308, 392, 305, 101, 55, - 273, 293, 201, 267, 346, 201, 123, - 727, 480, 226, 2, -65, -138, 164, - 273, 208, 173, 292, 12, 253, 174, - 340, 207, 180, 88, 116, 46, 475, - -460, -166, -30, 13, 110, 173, 396, - 137, 88, 43, -137, -94, 34, 284, - 96, -14, 226, 40, 63, 70, 130, - -467, -735, -1012, -1174, -307, 305, -67, - -612, -920, -1146, -567, -8, 92, -25, - -182, -271, -492, -754, -857, 287, -75, - -494, -787, -689, -683, -709, 137, -326, - -288, -550, -903, -1105, 334, 321, -62, - -354, -653, -834, -445, 1, 377, -152, - -162, -306, -608, -937, -297, 247, -192, - -234, -477, -244, -488, -266, 342, -332 -}; - -/*-------------------------------------------------------------------* - * AMR-WB ISF codebook - 46bits, 2 stages, 1st stage common with the - * 36bit codebook,5 splits in the 2nd stage - * - * codebook vector dimension number of vectors - * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ - * 2_1 3 64 - * 2_2 3 128 - * 2_3 3 128 - * 2_4 3 32 - * 2_5 4 32 - *-------------------------------------------------------------------*/ - -/*-------------------------------------------------------------------* - * 2nd stage, 1st split: ISF0 to ISF2 - *-------------------------------------------------------------------*/ - -/* ISF codebook - 46b, 2nd stage, 1st split (only in AMR-WB IO mode) */ -const Word16 dico21_isf_46b_fx[] = -{/*Qlog2(2.56)*/ - 329, 409, 249, - -33, 505, 160, - -29, -14, 582, - -262, 127, 354, - 145, 237, 175, - -152, 245, 122, - 27, 42, 340, - -84, -93, 311, - 285, 222, -156, - 47, -43, -504, - 234, 121, 385, - 104, -317, 45, - 176, 195, 8, - 104, -59, -94, - 177, 53, 192, - -34, -127, 152, - 570, 277, -34, - -67, -329, -639, - -157, -272, 462, - -177, -462, 198, - 322, 179, 115, - -386, 171, 19, - 19, -12, 195, - -120, -252, 201, - 304, 36, -336, - -128, -221, -380, - 171, -185, 296, - -242, -312, 23, - 198, 39, 16, - -3, -177, -111, - 111, -93, 76, - -92, -223, 4, - 177, 406, -44, - -168, 380, -149, - -4, 273, 331, - -420, 513, 277, - 21, 247, 47, - -58, 131, -2, - -3, 134, 180, - -145, 40, 175, - 189, 74, -145, - -27, -45, -325, - 370, -114, -21, - -83, -415, -173, - 77, 95, -51, - -40, -30, -67, - 71, 88, 86, - -35, -98, 14, - 69, 197, -334, - -196, 79, -231, - -348, -137, 218, - -352, -89, -85, - 47, 201, -130, - -165, 37, -15, - -43, 3, 86, - -161, -108, 79, - 83, 21, -237, - -81, -149, -238, - 150, -186, -251, - -186, -249, -162, - -19, 66, -139, - -26, -50, -181, - 24, 11, 0, - -130, -105, -98 -}; - -/*-------------------------------------------------------------------* - * 2nd stage, 2nd split: ISF3 to ISF5 - *-------------------------------------------------------------------*/ - -/* ISF codebook - 46b, 2nd stage, 2st split (only in AMR-WB IO mode) */ -const Word16 dico22_isf_46b_fx[] = -{/*Qlog2(2.56)*/ - -127, 310, 42, - -242, 197, 5, - -151, 84, -17, - -214, 127, -149, - -247, -131, 159, - -268, -267, -95, - -217, 1, -79, - -271, -80, -185, - -45, 436, 159, - 165, 199, 391, - -33, 81, 187, - -66, -42, 355, - -298, -57, 343, - -108, -537, 226, - -144, -23, 193, - 176, -402, 87, - 53, 296, 25, - -84, 253, -104, - -58, 105, -126, - -169, 174, -314, - -48, 44, -294, - -164, -417, -242, - -139, 3, -194, - -155, -207, -211, - 119, 322, 213, - 333, 50, 380, - 237, 247, -2, - 466, -16, 201, - 238, -255, -107, - 67, -440, -149, - 122, -88, -139, - 88, -247, -73, - -41, 231, 167, - -62, 155, 16, - -65, 16, 77, - -68, -2, -63, - -151, -300, 160, - -18, -333, 54, - -56, -94, 5, - 2, -190, 14, - 92, 148, 209, - 108, 9, 272, - 108, 35, 110, - 142, -85, 145, - 47, -157, 279, - 3, -320, 246, - 43, -72, 68, - 86, -217, 135, - 36, 140, 79, - 56, 175, -49, - 26, 45, 3, - 73, 55, -101, - 109, -183, -242, - -4, -283, -242, - 48, -68, -48, - -6, -153, -122, - 161, 196, 96, - 232, 80, 190, - 165, 97, 11, - 258, -31, 71, - 267, -77, -91, - 311, -209, 87, - 152, -14, -22, - 150, -149, 9, - -324, 557, 187, - -384, 307, 46, - -251, 27, 77, - -365, 77, -52, - -482, -84, 160, - -424, -515, -64, - -294, -120, -4, - -476, -116, -109, - -97, 318, 365, - 106, 627, 445, - -190, 120, 287, - -146, 65, 619, - -427, 242, 363, - -361, -371, 432, - -347, 102, 168, - -629, 195, -14, - -65, 476, -47, - -297, 320, -168, - -55, 356, -264, - -391, 82, -286, - -51, -31, -556, - -178, -399, -586, - -205, -49, -360, - -343, -238, -337, - 220, 457, 58, - 561, 467, 259, - 340, 270, -168, - 450, 77, -280, - 60, 167, -413, - 133, -252, -492, - 216, 157, -290, - 282, 0, -495, - -226, 293, 183, - -157, 135, 122, - -158, -59, 39, - -133, -118, -97, - -332, -309, 113, - -160, -425, -6, - -149, -211, 24, - -80, -277, -90, - -11, 125, 338, - 130, -71, 465, - 5, -45, 184, - 237, -95, 253, - -139, -197, 297, - -19, -300, 511, - -63, -152, 139, - 250, -289, 336, - 124, 339, -150, - 34, 176, -208, - 171, 166, -116, - 94, 38, -229, - 75, -65, -339, - -78, -205, -385, - 0, -30, -163, - -56, -110, -242, - 321, 244, 194, - 505, 238, -1, - 317, 116, 65, - 309, 88, -74, - 452, -51, -50, - 334, -217, -290, - 211, 41, -152, - 238, -55, -260 -}; - -/*-------------------------------------------------------------------* - * 2nd stage, 3rd split: ISF6 to ISF8 - *-------------------------------------------------------------------*/ - -/* ISF codebook - 46b, 2nd stage, 3rd split (only in AMR-WB IO mode) */ -const Word16 dico23_isf_46b_fx[] = -{/*Qlog2(2.56)*/ - -10, 151, 359, - 136, 298, 223, - 255, -104, 290, - 423, 6, 183, - -270, -269, -98, - -52, -82, 13, - -82, -274, -97, - 90, -246, -72, - -299, -70, 421, - -88, 365, 430, - 187, -318, 381, - 380, 37, 488, - -373, -316, 79, - -308, -101, 5, - -135, -451, 8, - 72, -421, -154, - 180, 170, -121, - 62, 177, -40, - 326, 80, -105, - 248, 263, -5, - -168, -181, -221, - -2, -23, -158, - -14, -149, -121, - 119, -91, -147, - 119, 332, -153, - 49, 303, 34, - 442, -55, -69, - 217, 454, 58, - -359, -187, -375, - -42, 50, -274, - -8, -267, -249, - 85, -86, -346, - -77, -40, 345, - 89, 134, 219, - 156, -80, 160, - 108, 40, 116, - -158, -206, 29, - 5, -32, 175, - -65, -158, 146, - 55, -78, 73, - -114, -222, 353, - -47, 81, 211, - 49, -151, 268, - 105, 4, 302, - -263, -132, 183, - -151, -28, 201, - -177, -307, 166, - 101, -221, 130, - 74, 58, -98, - 32, 44, 13, - 194, 30, -142, - 170, 96, 8, - -136, -119, -91, - -65, 8, -55, - 3, -188, 12, - 45, -63, -49, - 149, -21, -19, - 24, 144, 95, - 254, -22, 60, - 161, 196, 96, - -158, -61, 48, - -70, 33, 82, - -23, -321, 58, - 155, -147, 5, - -364, 328, 77, - -21, 453, 173, - -108, 82, 630, - 367, 263, 208, - -300, -62, -176, - -205, 143, -158, - -169, -410, -264, - 257, -269, -100, - -636, 289, -2, - -292, 627, 173, - -382, -363, 387, - 248, 524, 447, - -521, -111, -107, - -395, 118, -274, - -343, -680, -125, - -172, -447, -663, - 75, 148, -367, - -79, 263, -94, - 249, 148, -286, - 380, 271, -162, - -142, -4, -186, - -57, 111, -125, - -35, -108, -254, - 100, 29, -242, - -80, 303, -264, - -78, 464, -57, - 248, -22, -494, - 661, 662, 44, - -193, -40, -330, - -178, 145, -337, - -90, -199, -400, - -40, -23, -498, - -192, 114, 315, - -41, 244, 190, - 88, -97, 485, - 241, 80, 212, - -246, 40, 87, - -156, 147, 134, - -2, -334, 239, - 308, -203, 110, - -459, 251, 422, - -218, 310, 228, - -86, -346, 654, - 184, 175, 425, - -481, -63, 169, - -349, 117, 188, - -125, -560, 310, - 158, -416, 94, - 46, 171, -192, - -63, 157, 14, - 256, -35, -271, - 322, 123, 53, - -214, 4, -76, - -156, 86, -18, - 128, -197, -232, - 265, -90, -98, - -308, 332, -145, - -131, 308, 58, - 509, 59, -339, - 562, 196, -14, - -378, 100, -47, - -234, 202, 1, - 104, -270, -493, - 319, -210, -325 -}; - -/*-------------------------------------------------------------------* - * 2nd stage, 4th split: ISF9 to ISF11 - *-------------------------------------------------------------------*/ - -/* ISF codebook - 46b, 2nd stage, 4th split (only in AMR-WB IO mode) */ -const Word16 dico24_isf_46b_fx[] = -{/*Qlog2(2.56)*/ - -79, -89, -4, - -171, 77, -211, - 160, -193, 98, - 120, -103, 323, - 32, -22, -129, - 72, 78, -268, - 182, -76, -66, - 309, 99, -145, - -229, -157, -84, - -383, 98, -71, - -90, -352, 12, - -284, -178, 178, - -65, -125, -166, - -87, -175, -351, - 42, -198, -48, - 154, -140, -243, - -77, 18, 108, - -39, 355, 91, - 87, 8, 155, - -4, 158, 239, - 128, 95, -54, - 7, 246, -124, - 258, 15, 89, - 206, 216, 98, - -201, 9, 18, - -312, 233, 204, - -39, -174, 155, - -144, -9, 284, - -57, 70, -69, - -157, 187, 18, - 54, -30, 23, - 24, 135, 55 -}; - -/*-------------------------------------------------------------------* - * 2nd stage, 1st split: ISF12 to ISF15 - *-------------------------------------------------------------------*/ - -/* ISF codebook - 46b, 2nd stage, 5th split (only in AMR-WB IO mode) */ -const Word16 dico25_isf_46b_fx[] = -{/*Qlog2(2.56)*/ - 169, 142, -119, 115, - 206, -20, 94, 226, - -106, 313, -21, 16, - -62, 161, 71, 255, - -89, 101, -185, 125, - 72, -30, -201, 344, - -258, 33, -8, 81, - -104, -154, 72, 296, - 144, -68, -268, -25, - 81, -78, -87, 106, - 22, 155, -186, -119, - -46, -28, 27, 91, - -114, -37, -175, -33, - -94, -222, -189, 122, - -132, -119, -191, -270, - -172, -173, 18, -43, - 279, 135, -42, -128, - 187, -86, 229, -138, - 159, 240, 140, 46, - 69, 25, 227, 77, - 21, 115, 13, 8, - 68, -248, 126, 81, - -150, 137, 207, -9, - -154, -133, 289, 67, - 143, -37, -86, -326, - 180, -32, 19, -23, - 26, 168, 116, -233, - -32, -26, 118, -78, - 3, -8, -45, -115, - 57, -215, -54, -83, - -209, 112, -22, -167, - -91, -151, 168, -262 -}; - - -/*-------------------------------------------------------------------* - * AMR-WB ISF codebook - 36bits, 2 stages, 1st stage common with the - * 46bit codebook,3 splits in the 2nd stage - * - * codebook vector dimension number of vectors - * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ - * 2_1 5 128 - * 2_2 4 128 - * 2_3 7 64 - *-------------------------------------------------------------------*/ - -/*-------------------------------------------------------------------* - * 2nd stage, 1st split: ISF0 to ISF4 - *-------------------------------------------------------------------*/ - -/* ISF codebook - 36b, 2nd stage, 1st split (only in AMR-WB IO mode) */ -const Word16 dico21_isf_36b_fx[] = -{/*Qlog2(2.56)*/ - -52, -96, 212, 315, -73, - 82, -204, 363, 136, -197, - -126, -331, 183, 218, 143, - -49, -41, 557, 230, 72, - 2, -73, 163, 377, 221, - 133, 111, 278, 215, -110, - -102, -20, 284, 113, 273, - 84, 319, 290, 18, 85, - -25, -5, 125, 132, -204, - -38, -5, 286, -9, -356, - -140, -256, 92, 117, -189, - -144, 191, 313, 51, -98, - 167, -10, 44, 247, 36, - 381, 197, 238, 74, 6, - 38, -408, 29, -3, -85, - 92, 266, 157, -25, -200, - 161, -121, 70, 84, -140, - -16, -86, 112, -94, -189, - -269, -270, 351, 107, -24, - -68, -67, 492, -103, -155, - -53, -131, 62, 122, 10, - 135, 84, 283, -55, -120, - -12, -219, 331, -81, 167, - 220, -136, 147, -172, -42, - 140, -95, -109, -88, -194, - 0, -2, -4, -33, -381, - -66, -217, 152, -186, -402, - 244, 108, 156, -140, -395, - 113, -136, -196, 110, -24, - 214, 118, 11, -64, -131, - -110, -286, -6, -332, 16, - 94, 97, 79, -291, -205, - -5, -39, -20, 252, -96, - 76, 174, 101, 163, 61, - -69, -239, -55, 399, 6, - -115, 319, 164, 275, 196, - -15, 36, -47, 331, 121, - 226, 209, 271, 325, 184, - 13, -80, -218, 471, 353, - 288, 378, 16, -51, 251, - 174, 116, 52, 149, -279, - 235, 276, 39, 120, -48, - 0, -108, -108, 241, -339, - -93, 534, 45, 33, -87, - 194, 149, -71, 405, -44, - 409, 370, 81, -186, -154, - 25, -102, -448, 124, -173, - 22, 408, -110, -310, -214, - -26, 23, -83, 114, 14, - -110, 164, 52, 223, -82, - 37, -25, -263, 306, -15, - -466, 415, 292, 165, -18, - 29, -19, -171, 155, 182, - 179, 144, -27, 231, 258, - -103, -247, -396, 238, 113, - 375, -154, -109, -4, 156, - 98, 85, -292, -5, -124, - 116, 139, -116, -98, -294, - -14, -83, -278, -117, -378, - 106, 33, -106, -344, -484, - 119, 17, -412, 138, 166, - 384, 101, -204, 88, -156, - -121, -284, -300, -1, -166, - 280, 33, -152, -313, -81, - -37, 22, 229, 153, 37, - -60, -83, 236, -8, -41, - -169, -228, 126, -20, 363, - -235, 17, 364, -156, 156, - -25, -30, 72, 144, 156, - 153, -26, 256, 97, 144, - -21, -37, 48, -65, 250, - 63, 77, 273, -128, 124, - -129, -26, 40, 9, -115, - -6, 82, 38, -90, -182, - -336, -13, 28, 158, 91, - -30, 241, 137, -170, -17, - 146, 14, -11, 33, 61, - 192, 197, 54, -84, 85, - 23, -200, -78, -29, 140, - 122, 237, 106, -341, 136, - -57, -142, -85, -16, -74, - -59, -90, -8, -187, -20, - -211, -267, 216, -179, -110, - -50, -7, 220, -267, -70, - -57, -42, -17, -15, 71, - 32, 21, 63, -137, 33, - -137, -175, 104, -68, 97, - -67, -43, 133, -301, 221, - -116, -200, -81, -92, -272, - -64, -41, -54, -244, -220, - -287, -242, -50, -87, -89, - -245, 236, 102, -166, -295, - 66, 24, -162, -71, 95, - 66, 136, -90, -220, -36, - -98, -161, -222, -188, 29, - -18, 18, -19, -415, 9, - 49, 61, 100, 39, -56, - -111, 82, 135, -31, 52, - -90, -153, -93, 189, 182, - -214, 295, 119, -74, 284, - 2, 137, 37, 47, 182, - 92, 117, 184, -53, 373, - -21, -14, -35, 136, 391, - 146, 129, -164, -28, 333, - 92, 80, -84, 100, -134, - -8, 217, -32, 3, -47, - -151, 251, -215, 142, 92, - -224, 310, -172, -275, 98, - 159, 155, -177, 112, 53, - 205, 27, 8, -240, 192, - 169, 120, -319, -201, 106, - 11, 36, -86, -237, 455, - -109, -154, -163, 174, -55, - -38, 32, -101, -78, -59, - -205, -321, -97, 69, 79, - -310, 44, 18, -185, 34, - -115, -20, -148, -39, 203, - -29, 154, -30, -158, 166, - -45, -131, -317, -24, 363, - -165, -205, -112, -222, 265, - -32, -44, -150, 54, -193, - -6, -38, -255, -169, -115, - -266, 87, -189, -36, -169, - -60, -87, -266, -436, -170, - -68, -81, -278, 24, 38, - -23, -19, -155, -256, 141, - -61, -226, -565, -175, 71, - 9, -29, -237, -515, 263 -}; - -/*-------------------------------------------------------------------* - * 2nd stage, 2nd split: ISF5 to ISF8 - *-------------------------------------------------------------------*/ - -/* ISF codebook - 36b, 2nd stage, 2nd split (only in AMR-WB IO mode) */ - -const Word16 dico22_isf_36b_fx[] = -{/*Qlog2(2.56)*/ - -298, -6, 95, 31, - -213, -87, -122, 261, - 4, -49, 208, 14, - -129, -110, 30, 118, - -214, 258, 110, -235, - -41, -18, -126, 120, - 103, 65, 127, -37, - 126, -36, -24, 25, - -138, -67, -278, -186, - -164, -194, -201, 78, - -211, -87, -51, -221, - -174, -79, -94, -39, - 23, -6, -157, -240, - 22, -110, -153, -68, - 148, -5, -2, -149, - -1, -135, -39, -179, - 68, 360, -117, -15, - 137, 47, -278, 146, - 136, 260, 135, 65, - 61, 116, -45, 97, - 231, 379, 87, -120, - 338, 177, -272, 3, - 266, 156, 28, -69, - 260, 84, -85, 86, - -266, 154, -256, -182, - -17, -65, -304, -6, - -40, 175, -151, -180, - -27, 27, -87, -63, - 121, 114, -166, -469, - 159, -66, -323, -231, - 214, 152, -141, -212, - 137, 36, -184, -51, - -282, -237, 40, 10, - -48, -235, -37, 251, - -54, -323, 136, 29, - -88, -174, 213, 198, - -390, 99, -63, -375, - 107, -169, -164, 424, - 69, -111, 141, -167, - 74, -129, 65, 144, - -353, -207, -205, -109, - -160, -386, -355, 98, - -176, -493, -20, -143, - -252, -432, -2, 216, - -90, -174, -168, -411, - 13, -284, -229, -160, - -87, -279, 34, -251, - -75, -263, -58, -42, - 420, 53, -211, -358, - 384, -35, -374, 396, - 68, -228, 323, -2, - 167, -307, 192, 194, - 459, 329, -5, -332, - 375, 79, -7, 313, - 282, -124, 200, -92, - 271, -162, -70, 180, - -157, -298, -514, -309, - 58, -163, -546, 18, - 124, -364, 167, -238, - 83, -411, -117, 96, - 140, -112, -388, -624, - 259, -133, -317, 41, - 163, -130, -64, -334, - 226, -165, -124, -110, - -466, -61, 6, 229, - -153, 205, -145, 242, - -159, 48, 195, 148, - -58, 28, 31, 279, - -303, 185, 279, -4, - -61, 197, 59, 86, - -114, 123, 168, -52, - 35, 36, 100, 126, - -407, 102, -77, -40, - -338, -1, -342, 156, - -179, 105, -34, -97, - -185, 84, -35, 108, - -133, 107, -91, -357, - -180, 54, -229, 24, - -44, 47, 47, -182, - -66, 13, 45, 4, - -339, 251, 64, 226, - -42, 101, -350, 275, - -99, 398, 142, 121, - 111, 12, -102, 260, - 0, 505, 260, -94, - 161, 285, -96, 224, - -4, 206, 314, 33, - 167, 139, 88, 204, - -235, 316, -60, -25, - -8, -150, -312, 201, - -36, 292, 61, -104, - -40, 174, -162, 42, - -21, 402, -29, -351, - 21, 152, -360, -93, - 57, 191, 212, -196, - 76, 158, -21, -69, - -328, -185, 331, 119, - -53, 285, 56, 337, - -107, -24, 405, 29, - -18, 137, 272, 277, - -255, 22, 173, -191, - 295, 322, 325, 302, - 21, -27, 332, -178, - 119, 13, 271, 129, - -455, -180, 116, -191, - -227, 62, -148, 524, - -176, -287, 282, -157, - -243, 13, 199, 430, - -59, -49, 115, -365, - 72, -172, -137, 93, - -138, -126, 141, -84, - 5, -124, 38, -20, - -258, 311, 601, 213, - 94, 130, -61, 502, - -1, -157, 485, 313, - 146, -74, 158, 345, - 276, 135, 280, -57, - 490, 252, 99, 43, - 267, -74, 429, 105, - 278, -23, 119, 94, - -542, 488, 257, -115, - -84, -244, -438, 478, - -113, -545, 387, 101, - -95, -306, 111, 498, - 95, 166, 22, -301, - 420, -15, -58, -78, - 270, 29, 122, -282, - 160, -240, 50, -38 -}; - -/*-------------------------------------------------------------------* - * 2nd stage, 3rd split: ISF9 to ISF15 - *-------------------------------------------------------------------*/ - -/* ISF codebook - 36b, 2nd stage, 3rd split (only in AMR-WB IO mode) */ -const Word16 dico23_isf_36b_fx[] = -{/*Qlog2(2.56)*/ - 81, -18, 68, -27, -122, -280, -4, - 45, -177, 209, -30, -136, -74, 131, - -44, 101, -75, -88, -48, -137, -54, - -245, -28, 63, -18, -112, -103, 58, - -79, -6, 220, -65, 114, -35, -50, - 109, -65, 143, -114, 129, 76, 125, - 166, 90, -61, -242, 186, -74, -43, - -46, -92, 49, -227, 24, -155, 39, - 67, 85, 99, -42, 53, -184, -281, - 142, -122, 0, 21, -142, -15, -17, - 223, 92, -21, -48, -82, -14, -167, - 51, -37, -243, -30, -90, 18, -56, - 54, 105, 74, 86, 69, 13, -101, - 196, 72, -89, 43, 65, 19, 39, - 121, 34, 131, -82, 25, 213, -156, - 101, -102, -136, -21, 57, 214, 22, - 36, -124, 205, 204, 58, -156, -83, - 83, -117, 137, 137, 85, 116, 44, - -92, -148, -68, 11, -102, -197, -220, - -76, -185, -58, 132, -26, -183, 85, - -7, -31, -2, 23, 205, -151, 10, - -27, -37, -5, -18, 292, 131, 1, - 117, -168, 9, -93, 80, -59, -125, - -182, -244, 98, -24, 135, -22, 94, - 221, 97, 106, 42, 43, -160, 83, - 25, -64, -21, 6, 14, -15, 154, - 126, 15, -140, 150, -10, -207, -114, - 79, -63, -211, -70, -28, -217, 165, - 46, 38, -22, 281, 132, -62, 109, - 112, 54, -112, -93, 208, 27, 296, - 115, 10, -147, 41, 216, 42, -276, - 50, -115, -254, 167, 117, -2, 61, - 17, 144, 34, -72, -186, -150, 272, - -29, -66, -89, -95, -149, 129, 251, - 122, 0, -50, -234, -91, 36, 26, - -105, -102, -88, -121, -236, -7, -11, - -204, 109, 5, -191, 105, -15, 163, - -80, 32, -24, -209, 41, 294, 70, - -106, -94, -204, -118, 120, -50, -37, - -82, -241, 46, -131, -29, 150, -55, - 33, 155, 120, -89, -8, 7, 62, - 213, 82, 61, 18, -161, 144, 152, - 30, 131, 65, -87, -255, -17, -107, - -8, 85, -64, 51, -162, 223, -53, - -134, 261, 69, -56, 218, 72, -111, - 2, 155, -113, -87, 49, 85, -28, - -163, 42, -1, -196, 7, 39, -245, - 14, -137, -79, 11, -160, 202, -293, - -94, 33, 208, 100, 56, -44, 326, - -78, -41, 232, 13, -142, 227, 80, - -16, -87, 201, 33, -133, 15, -183, - -58, -192, -47, 184, -128, 133, 99, - -205, 11, -155, 78, 52, 72, 141, - -246, 26, 99, 151, 59, 115, -64, - -79, -47, -16, -14, 6, 47, -43, - -72, -178, -27, 162, 112, 43, -174, - -175, 238, 186, 71, -54, -188, -76, - -225, 233, 39, -39, -158, 122, 44, - -26, 43, 84, 130, -93, -51, 22, - 3, 92, -150, 136, -182, -57, 97, - -131, 179, -78, 80, 91, -165, 90, - -2, 148, 15, 130, 65, 175, 117, - -138, 114, -137, 132, 3, -10, -186, - 140, -4, -37, 254, -62, 92, -109 -}; - -/*-------------------------------------------------------------------* - * AMR-WB ISF codebook for SID - 28bits, 1 stage, 5 splits - * - * codebook vector dimension number of vectors - * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ - * 1 2 64 - * 2 3 64 - * 3 3 64 - * 4 4 32 - * 5 4 32 - *-------------------------------------------------------------------*/ - -/*-------------------------------------------------------------------* - * 1st stage, 1st split: ISF0 to ISF1 - *-------------------------------------------------------------------*/ - -/* ISF codebook for SID frames - 28b, 1st split */ -const Word16 dico1_ns_28b_fx[] = -{/*Qlog2(2.56)*/ - -269, -673, - -222, -537, - -233, -430, - -138, -451, - -212, -331, - -192, -241, - -87, -231, - -191, -128, - -70, -106, - -164, -6, - 74, -179, - 27, -33, - -102, 74, - -162, 115, - -94, 172, - -6, 130, - -143, 234, - 14, 218, - -65, 270, - 88, 182, - -124, 341, - -44, 381, - 38, 335, - 117, 274, - -112, 454, - 74, 431, - -5, 488, - 175, 384, - -83, 561, - 122, 529, - 21, 601, - 229, 481, - 231, 303, - 226, 608, - 300, 372, - 210, 187, - 306, 265, - 328, 473, - 382, 331, - 371, 132, - 139, 58, - 365, 21, - 250, -82, - 443, 218, - 483, 110, - 426, 415, - 579, 222, - 518, 333, - 573, 448, - 455, 529, - 685, 329, - 332, 580, - 595, 593, - 468, 645, - 762, 517, - 326, 709, - 485, 793, - 130, 684, - 671, 737, - 354, 876, - 88, 806, - -65, 706, - -35, 1016, - 266, 1123 -}; - -/*-------------------------------------------------------------------* - * 1st stage, 2ndt split: ISF2 to ISF4 - *-------------------------------------------------------------------*/ - -/* ISF codebook for SID frames - 28b, 2nd spilt */ -const Word16 dico2_ns_28b_fx[] = -{/*Qlog2(2.56)*/ - -824, -884, -949, - -805, -456, -418, - -442, -438, -541, - -217, -578, -793, - -168, -444, -582, - -287, -492, -274, - -552, -297, -300, - -163, -333, -358, - -370, -232, -232, - -175, -358, -159, - -381, -21, -357, - -184, -159, -162, - -53, -191, -280, - 18, -267, -215, - -138, 61, -283, - 71, -95, -294, - 13, -156, -546, - 0, -83, -79, - 44, 97, -316, - 178, -52, -213, - 222, -261, -422, - 237, -118, -44, - 141, 145, -132, - 363, 81, -287, - 213, 65, 34, - -107, 94, -5, - 91, -29, 126, - -355, 51, -41, - -219, -76, 145, - -63, 100, 244, - -719, 44, 27, - -572, -124, 155, - -423, 133, 315, - -917, 71, 224, - -268, 318, 131, - -93, -190, 420, - -97, 122, 491, - -79, 317, 355, - 130, 100, 325, - 86, -293, 210, - 133, 258, 161, - 176, -73, 465, - 195, 300, 384, - 348, 22, 221, - 376, 183, 409, - 377, 286, 202, - 242, 213, 659, - 257, 565, 248, - 344, 408, -76, - 405, 440, 509, - 612, 385, 379, - 536, 607, 216, - -56, 582, 192, - 100, 517, 567, - -365, 448, 445, - 728, 347, 10, - 505, 357, 759, - 636, 582, 658, - 335, 517, 852, - 378, 809, 572, - -195, 878, 829, - 529, 707, 987, - 918, 726, 392, - 1250, 997, 1063 -}; - -/*-------------------------------------------------------------------* - * 1st stage, 3rd split: ISF5 to ISF7 - *-------------------------------------------------------------------*/ - -/* ISF codebook for SID frames - 28b, 3rd spilt */ -const Word16 dico3_ns_28b_fx[] = -{/*Qlog2(2.56)*/ - -805, -838, -774, - -522, -627, -828, - -477, -486, -603, - -295, -481, -634, - -366, -384, -393, - -186, -414, -396, - -237, -394, -106, - -252, -202, -275, - -61, -177, -442, - -84, -198, -199, - -179, -125, -31, - -72, -47, -163, - -298, -220, 215, - -64, -168, 251, - -133, 156, -59, - -30, -2, 127, - 54, 66, -61, - -233, 21, 251, - 209, -50, 32, - 33, 194, 136, - -117, -18, 475, - 202, 46, 309, - 256, 185, 53, - 35, 200, 390, - 200, 263, 242, - -216, 302, 294, - 128, 358, 0, - 19, 431, 287, - 224, 447, 280, - 367, 165, 213, - 397, 314, 319, - 383, 379, 75, - 277, 325, 462, - 394, 505, 334, - 251, 98, -213, - 450, 153, 448, - 565, 226, 76, - 470, 383, 502, - 635, 390, 278, - 237, 135, 620, - 342, 401, 649, - 331, 551, 518, - 130, 418, 592, - 531, 306, 737, - 729, 389, 580, - 497, 557, 699, - 296, 383, 874, - 283, 624, 759, - 126, 622, 476, - 559, 595, 472, - 382, 770, 616, - 719, 613, 745, - 540, 639, 928, - 517, 826, 801, - 684, 811, 604, - 752, 786, 857, - 933, 661, 350, - 694, 450, 1061, - 562, 911, 1051, - 824, 813, 1104, - 758, 1047, 882, - 1140, 917, 889, - 1039, 1246, 1426, - 1483, 1666, 1876 -}; - -/*-------------------------------------------------------------------* - * 1st stage, 4th split: ISF8 to ISF11 - *-------------------------------------------------------------------*/ - -/* ISF codebook for SID frames - 28b, 4th spilt */ -const Word16 dico4_ns_28b_fx[] = -{/*Qlog2(2.56)*/ - -776, -854, -891, -920, - -552, -610, -663, -741, - -321, -370, -476, -565, - 274, -160, -456, 201, - 265, 67, -160, -306, - -8, -210, 79, 272, - 163, 236, 307, 308, - 578, 317, 64, 298, - -9, 197, 342, 620, - 343, 232, 314, 622, - 173, 149, 548, 527, - 356, 370, 481, 376, - 135, 444, 488, 556, - 391, 471, 487, 653, - 228, 424, 576, 835, - 422, 372, 722, 682, - 295, 673, 693, 635, - 539, 596, 590, 449, - 475, 618, 659, 818, - 735, 517, 491, 673, - 602, 346, 257, 877, - 625, 635, 849, 720, - 727, 818, 698, 595, - 653, 481, 690, 1139, - 814, 762, 704, 908, - 507, 747, 898, 936, - 848, 855, 924, 785, - 646, 1037, 882, 795, - 772, 845, 1024, 1151, - 1133, 983, 818, 921, - 940, 1068, 1252, 1302, - 1588, 1767, 1718, 1513 -}; - -/*-------------------------------------------------------------------* - * 1st stage, 5th split: ISF12 to ISF15 - *-------------------------------------------------------------------*/ - -/* ISF codebook for SID frames - 28b, 5th spilt */ -const Word16 dico5_ns_28b_fx[] = -{/*Qlog2(2.56)*/ - -810, -879, -945, -254, - 248, 184, 671, 128, - 288, 703, 918, 99, - 658, 558, 662, 219, - 552, 585, 910, 208, - 559, 804, 759, 119, - 606, 774, 921, -139, - 782, 761, 748, 208, - 756, 708, 983, 56, - 544, 864, 1010, 152, - 737, 698, 987, 299, - 771, 924, 879, 103, - 536, 785, 961, 405, - 667, 916, 801, 328, - 738, 705, 773, 439, - 823, 871, 992, 355, - 640, 1004, 1052, 369, - 724, 822, 949, 597, - 415, 655, 729, 482, - 1009, 896, 793, 363, - 908, 803, 687, -25, - 1016, 838, 1011, 189, - 947, 1112, 942, 222, - 914, 1049, 981, 527, - 956, 987, 1011, -120, - 781, 1049, 1121, 92, - 1178, 1053, 884, 47, - 1123, 1059, 1182, 118, - 933, 972, 1277, 357, - 1109, 918, 1101, 503, - 1039, 1286, 1220, 317, - 1351, 1207, 1010, 326 -}; /*1.28f Q1*/ - -const Word16 means_nb_31bits_ma_lsf[16] = { 861 /*336.3281f*1.28f Q1*/, 1360 /*531.2500f*1.28f Q1*/, 2270 /*886.7188f*1.28f Q1*/, 3243 /*1266.7969f*1.28f Q1*/, 4171 /*1629.2969f*1.28f Q1*/, 5052 /*1973.4375f*1.28f Q1*/, 6012 /*2348.4375f*1.28f Q1*/, 6776 /*2646.8750f*1.28f Q1*/, 7676 /*2998.4375f*1.28f Q1*/, 8428 /*3292.1875f*1.28f Q1*/, 9194 /*3591.4062f*1.28f Q1*/, 9744 /*3806.2500f*1.28f Q1*/, 10580 /*4132.8125f*1.28f Q1*/, 11911 /*4652.7344f*1.28f Q1*/, 13440 /*5250.0000f*1.28f Q1*/, 15061 /*5883.2031f*1.28f Q1*/ }; -const Word16 means_wb_31bits_ma_lsf[16] = { 818 /*319.5312f*1.28f Q1*/, 1403 /*548.0469f*1.28f Q1*/, 2392 /*934.3750f*1.28f Q1*/, 3465 /*1353.5156f*1.28f Q1*/, 4429 /*1730.0781f*1.28f Q1*/, 5428 /*2120.3125f*1.28f Q1*/, 6414 /*2505.4688f*1.28f Q1*/, 7323 /*2860.5469f*1.28f Q1*/, 8304 /*3243.7500f*1.28f Q1*/, 9221 /*3601.9531f*1.28f Q1*/, 10162 /*3969.5312f*1.28f Q1*/, 11091 /*4332.4219f*1.28f Q1*/, 12125 /*4736.3281f*1.28f Q1*/, 13153 /*5137.8906f*1.28f Q1*/, 14241 /*5562.8906f*1.28f Q1*/, 15266 /*5963.2812f*1.28f Q1*/ }; - - -const Word16 *lsf_means[2] = { means_wb_31bits_ma_lsf, means_nb_31bits_ma_lsf }; - -const lsp_unw_triplet p16_gamma0_92to1[16] = /* Q14 */ -{ - { 0, 19622, -9695 }, - { -14938, 29357, -13258 }, - { -8483, 23708, -13414 }, - { -7350, 22410, -12305 }, - { -7397, 21417, -12160 }, - { -7071, 19878, -11229 }, - { -7144, 19877, -11326 }, - { -6423, 17194, -9613 }, - { -7407, 18024, -9695 }, - { -6972, 16339, -8191 }, - { -8220, 17625, -8422 }, - { -8159, 17459, -8289 }, - { -8700, 19066, -9508 }, - { -7986, 17629, -8607 }, - { -8503, 17203, -8109 }, - { -7820, 14903, 0 } -}; - -const lsp_unw_triplet p16_gamma0_94to1[16] = /* Q14 */ -{ - { 0, 12931, -6314 }, - { -9364, 19577, -8870 }, - { -5512, 16236, -9305 }, - { -4892, 15366, -8398 }, - { -4869, 14631, -8275 }, - { -4631, 13358, -7540 }, - { -4575, 13271, -7599 }, - { -4151, 11403, -6385 }, - { -4859, 11947, -6371 }, - { -4504, 10805, -5407 }, - { -5346, 11618, -5515 }, - { -5418, 11578, -5424 }, - { -5806, 12711, -6226 }, - { -5205, 11592, -5606 }, - { -5745, 11498, -5188 }, - { -5473, 10245, 0 } -}; - - -const Word16 dico_lsf_abs_8b[256 * M] = /*14Q1*1.28*/ -{ - 966, 1761, 2937, 3740, 4574, 5488, 6457, 7398, 8355, 9289, 10254, 11211, 12247, 13202, 14221, 15172, - 1540, 2731, 3544, 4232, 5065, 5917, 6846, 7707, 8602, 9538, 10479, 11445, 12439, 13339, 14332, 15243, - 1414, 2201, 3469, 4160, 4832, 5563, 6504, 7493, 8507, 9423, 10261, 11087, 12014, 12887, 13935, 15041, - 1176, 2031, 3312, 4141, 4915, 5612, 6368, 7097, 7965, 8861, 9900, 10956, 12137, 13161, 14215, 15190, - 840, 1102, 1853, 3913, 4514, 5155, 5976, 6577, 7726, 8469, 9195, 9896, 12016, 13534, 14458, 15327, - 1165, 1552, 2467, 3520, 3933, 4902, 6085, 6607, 7652, 8343, 8922, 9577, 11002, 13331, 14521, 15310, - 1113, 1431, 2280, 3471, 3975, 4853, 5690, 6407, 7275, 8032, 8621, 9884, 12276, 13033, 13880, 15039, - 719, 1036, 1867, 2553, 4352, 5021, 5775, 6505, 7179, 7826, 9601, 11113, 12075, 12807, 14022, 15272, - 953, 1294, 1952, 2553, 3007, 5085, 6062, 6718, 8178, 8712, 9927, 11330, 12351, 13205, 14164, 15087, - 940, 1283, 2111, 2792, 3256, 3911, 6096, 6898, 7589, 9317, 10103, 10891, 11893, 12886, 13757, 15049, - 587, 903, 1795, 3140, 4297, 4853, 5479, 6468, 7886, 8442, 9844, 11336, 12043, 12793, 13911, 15151, - 861, 1323, 2258, 3258, 3853, 4815, 5824, 6684, 8004, 9358, 10709, 11951, 12810, 13582, 14465, 15216, - 758, 1202, 2449, 3134, 3694, 4423, 5673, 6885, 7835, 9014, 10027, 11120, 12196, 13199, 14218, 15199, - 1042, 1478, 2150, 3726, 4263, 4954, 6139, 6790, 7965, 8974, 9643, 10764, 12030, 12725, 13557, 14581, - 719, 926, 2434, 3748, 4185, 5032, 5661, 6815, 7286, 9180, 10365, 11159, 11991, 12918, 13824, 15248, - 715, 1008, 2245, 3846, 4283, 5859, 6516, 7754, 9005, 9791, 10611, 11473, 12342, 13216, 14190, 15177, - 972, 1282, 1856, 2557, 3020, 4536, 7105, 8030, 8649, 9405, 10103, 10712, 11575, 12633, 13608, 14745, - 813, 1132, 1994, 2990, 3472, 4041, 4711, 7349, 8285, 8967, 9924, 10497, 11905, 13402, 14503, 15358, - 897, 1260, 1953, 3238, 3878, 4495, 6373, 7420, 8046, 9326, 10330, 10893, 11883, 13155, 14226, 15156, - 772, 1190, 1952, 2591, 4617, 5613, 6788, 7715, 8323, 9061, 10103, 11442, 12520, 13313, 14105, 15130, - 648, 914, 1614, 2978, 3913, 5180, 6371, 7029, 7510, 8288, 10181, 11303, 12262, 13298, 14629, 15443, - 679, 934, 1510, 2061, 4006, 5506, 6056, 6653, 7326, 8996, 10254, 11800, 12686, 13410, 14130, 15080, - 536, 802, 1288, 2431, 4428, 4896, 5421, 6396, 8409, 9756, 10509, 11135, 12212, 13338, 14298, 15284, - 774, 1064, 1751, 2361, 3813, 5723, 6272, 7170, 7837, 9027, 9999, 10677, 11383, 12564, 14005, 15142, - 678, 938, 1492, 2025, 4146, 5207, 5984, 6738, 7509, 8781, 9766, 10948, 12156, 13220, 14217, 15296, - 639, 927, 1490, 2153, 4243, 5592, 6466, 7219, 7989, 9277, 10369, 11353, 12295, 13240, 14272, 15267, - 743, 1035, 1700, 2248, 3167, 5728, 6394, 7572, 8421, 9284, 10729, 11762, 12753, 13526, 14380, 15202, - 468, 692, 1255, 2740, 4287, 5357, 6462, 7499, 8537, 9503, 10499, 11458, 12457, 13393, 14352, 15260, - 734, 989, 1478, 1957, 2947, 5157, 6144, 7370, 8090, 8834, 9907, 11183, 12331, 13280, 14246, 15263, - 461, 681, 1659, 3534, 4547, 5654, 6632, 7664, 8623, 9608, 10561, 11542, 12490, 13438, 14368, 15271, - 792, 1113, 1855, 2398, 3238, 5817, 6524, 7434, 8483, 9164, 10021, 11002, 12178, 13218, 14316, 15216, - 658, 1008, 1970, 3074, 4543, 5908, 7154, 8105, 8980, 9832, 10606, 11401, 12264, 13165, 14158, 15163, - 1009, 1541, 2392, 3464, 4644, 5562, 6666, 7588, 8538, 9554, 10547, 11489, 12487, 13412, 14326, 15206, - 955, 1704, 3142, 3903, 4985, 6046, 7112, 8024, 8864, 9606, 10417, 11275, 12242, 13171, 14188, 15188, - 1152, 2084, 3441, 4308, 5341, 6367, 7465, 8361, 9258, 10034, 10799, 11569, 12435, 13295, 14269, 15192, - 1361, 2472, 3734, 4540, 5724, 6786, 7934, 8876, 9753, 10482, 11209, 11930, 12704, 13494, 14411, 15293, - 1448, 2793, 3997, 5078, 6382, 7418, 8278, 9062, 9827, 10479, 11193, 11976, 12798, 13632, 14523, 15357, - 1488, 2499, 3704, 4557, 5499, 6512, 7628, 8636, 9720, 10662, 11547, 12425, 13250, 13991, 14754, 15490, - 1099, 2055, 3146, 3872, 4700, 5675, 6721, 7670, 8652, 9638, 10640, 11603, 12561, 13473, 14404, 15285, - 575, 841, 1577, 3091, 3894, 4777, 5587, 6225, 8293, 8937, 9666, 10986, 12135, 13292, 14164, 15178, - 799, 1086, 1834, 2360, 3186, 5166, 5756, 7271, 8036, 8703, 9532, 10239, 11731, 13180, 14418, 15362, - 956, 1297, 2021, 2413, 4341, 5175, 5948, 6783, 7304, 8114, 9024, 9853, 10910, 12746, 14094, 15167, - 1288, 1856, 2407, 3125, 3686, 4421, 5672, 6339, 7288, 8274, 9315, 10205, 11191, 12856, 14483, 15463, - 1020, 1359, 2139, 2709, 3398, 4646, 5412, 6441, 7053, 7923, 9213, 10192, 11791, 13084, 14208, 15242, - 839, 1165, 2114, 2625, 3382, 3972, 5064, 7268, 7966, 8749, 9833, 12022, 13123, 13848, 14622, 15279, - 837, 1104, 1848, 2230, 3860, 4731, 5491, 6377, 6917, 8917, 10029, 10891, 12043, 12753, 13952, 15201, - 1136, 1564, 2097, 2558, 3026, 4824, 5743, 6459, 7664, 8183, 9819, 10837, 11538, 12762, 14193, 15309, - 1013, 1492, 2105, 2593, 3135, 5090, 6278, 6877, 7559, 8026, 9120, 10257, 11268, 12899, 14253, 15324, - 677, 952, 1578, 2156, 3456, 4665, 5545, 6815, 7822, 8967, 10044, 11143, 12218, 13205, 14269, 15290, - 560, 833, 1626, 2825, 4189, 5300, 5822, 6280, 7858, 9256, 10189, 11481, 12413, 13040, 14138, 15123, - 666, 1181, 2686, 3416, 4169, 5158, 6179, 7282, 8275, 9372, 10419, 11434, 12436, 13400, 14358, 15244, - 773, 1040, 1809, 3551, 4049, 5132, 5867, 6525, 7877, 8558, 9275, 10956, 12231, 13016, 14012, 15032, - 881, 1209, 1988, 3725, 4126, 5152, 6189, 6712, 8497, 9495, 10097, 11006, 12228, 13271, 14197, 15140, - 850, 1109, 2540, 3212, 3836, 4671, 5423, 6258, 6873, 7502, 9107, 10990, 12254, 13154, 14378, 15352, - 721, 954, 2751, 3694, 4320, 5071, 5825, 6738, 7291, 7984, 9289, 11579, 12483, 13254, 14338, 15260, - 1055, 1371, 1968, 3743, 4580, 4986, 5695, 6267, 7257, 8890, 9548, 10261, 11586, 12347, 13324, 15091, - 676, 972, 2112, 2850, 3753, 4728, 5494, 6367, 7285, 8675, 9943, 11368, 12460, 13350, 14172, 15122, - 1049, 1494, 2200, 3000, 3527, 5081, 6046, 6884, 8291, 9069, 10097, 11369, 12496, 13375, 14347, 15128, - 814, 1123, 2183, 2717, 3304, 3975, 5256, 6076, 7491, 8840, 10493, 11738, 12716, 13494, 14450, 15263, - 948, 1271, 2388, 3106, 3719, 4616, 5356, 6675, 7383, 7967, 9440, 11584, 12408, 13133, 13866, 14860, - 635, 881, 1924, 3907, 4384, 5217, 5950, 6984, 7695, 8650, 9877, 11108, 12074, 13120, 14245, 15282, - 762, 1028, 2283, 3533, 3943, 4563, 5144, 6692, 7423, 8653, 9739, 10969, 12023, 13103, 14147, 15192, - 579, 854, 1748, 3347, 3979, 4734, 5418, 7056, 8203, 9063, 10246, 11271, 12279, 13293, 14338, 15258, - 503, 768, 1465, 3077, 4620, 5151, 5798, 7143, 8378, 9391, 10401, 11373, 12315, 13200, 14113, 15106, - 717, 1002, 1807, 3675, 4066, 5418, 6034, 6837, 8445, 8980, 10353, 11755, 12753, 13520, 14476, 15232, - 672, 949, 1676, 3274, 4729, 5344, 6538, 7393, 8330, 9755, 10902, 11594, 12475, 13327, 14247, 15152, - 496, 912, 2757, 3804, 4833, 5819, 6853, 7814, 8753, 9709, 10654, 11604, 12540, 13471, 14395, 15300, - 775, 1049, 2302, 3012, 3920, 4950, 5709, 7219, 7761, 9746, 10544, 11297, 12044, 12831, 13700, 15084, - 1078, 1504, 2140, 3195, 3778, 4555, 5966, 6673, 7747, 8995, 9612, 10447, 11613, 12329, 13101, 14856, - 968, 1849, 3399, 4265, 5004, 5732, 6679, 7575, 8554, 9526, 10485, 11412, 12400, 13344, 14309, 15220, - 1199, 2464, 3945, 4913, 6009, 6786, 7495, 8106, 8835, 9620, 10520, 11438, 12438, 13342, 14319, 15235, - 1081, 2165, 3828, 4637, 5448, 6070, 6800, 7534, 8434, 9349, 10320, 11262, 12293, 13218, 14232, 15192, - 1083, 1694, 2537, 3083, 3771, 5128, 6256, 7141, 8587, 9530, 10324, 11062, 11832, 12707, 13900, 15104, - 925, 1244, 2121, 3433, 3834, 5306, 6241, 6848, 8344, 9060, 9700, 10464, 11277, 12214, 14081, 15400, - 773, 1006, 1754, 4566, 5209, 5778, 6451, 7124, 8069, 8706, 9253, 10001, 10837, 12064, 14326, 15356, - 620, 950, 1866, 3048, 4740, 5460, 5977, 6457, 7915, 9271, 9868, 10687, 11496, 12237, 13203, 15016, - 1104, 1439, 2275, 2648, 3695, 5401, 5983, 7243, 7860, 8327, 8987, 11178, 12399, 13141, 14208, 14977, - 1076, 1712, 2332, 3118, 4625, 5250, 6130, 7069, 7734, 8740, 10166, 11116, 12011, 12960, 13959, 14830, - 659, 949, 1548, 2807, 4382, 4952, 5938, 7089, 7729, 8587, 10547, 11148, 11668, 12528, 13953, 15131, - 618, 891, 1593, 3197, 3993, 4733, 5928, 6583, 7372, 9278, 10158, 10852, 12066, 13201, 14256, 15298, - 1226, 1611, 2351, 3438, 3930, 4616, 6358, 6975, 7675, 9306, 10025, 10545, 11077, 12750, 14164, 15269, - 680, 957, 1852, 3036, 3864, 5284, 5883, 6570, 7132, 8763, 9943, 10590, 11425, 12827, 14180, 15184, - 567, 890, 1811, 3039, 4034, 4670, 5067, 5886, 7597, 8889, 10127, 10989, 12275, 13126, 14471, 15240, - 1017, 1306, 1912, 4065, 5098, 5506, 6244, 6943, 7610, 8963, 10029, 10608, 11375, 12363, 14054, 15433, - 718, 949, 1640, 4407, 4989, 5504, 6145, 6846, 8055, 8755, 9764, 11309, 12335, 13157, 13991, 15052, - 833, 1104, 2582, 3256, 3910, 5291, 5740, 7382, 8142, 8582, 9618, 11230, 12436, 13284, 14118, 14993, - 1157, 1491, 2370, 3490, 3848, 5022, 5800, 6591, 7995, 8564, 9304, 10921, 12495, 13372, 14254, 15054, - 1052, 1417, 2072, 2620, 3044, 4572, 5432, 6284, 7546, 8244, 9800, 10798, 12368, 13625, 14662, 15445, - 795, 1132, 1902, 2810, 3433, 4747, 5790, 6745, 8443, 9315, 10050, 10836, 11673, 12528, 13832, 15149, - 967, 1250, 2420, 3159, 3625, 4266, 4948, 7030, 7674, 8235, 9112, 9840, 11161, 12837, 14235, 15341, - 730, 997, 2113, 3171, 3737, 4764, 5577, 6449, 7240, 8394, 9116, 10604, 12009, 13102, 14231, 15244, - 1192, 1617, 2341, 3430, 4000, 4721, 5596, 6358, 7429, 8167, 8895, 9916, 10855, 12188, 13896, 15254, - 872, 1150, 2032, 3553, 3983, 4963, 5636, 6604, 7462, 8064, 9470, 10203, 11089, 12799, 14118, 15282, - 1013, 1444, 1984, 3267, 4408, 4772, 5805, 7143, 7690, 8647, 10029, 10669, 11431, 12636, 13988, 15117, - 830, 1134, 1866, 3581, 4056, 4925, 6011, 6558, 8076, 8830, 9656, 10706, 12639, 13726, 14663, 15367, - 684, 957, 1801, 3005, 3559, 4879, 5574, 6920, 7739, 8471, 9724, 10719, 12040, 13148, 14262, 15275, - 699, 1022, 2042, 3021, 3652, 5369, 6030, 7152, 8031, 8854, 9968, 10869, 11910, 13073, 14255, 15228, - 831, 1105, 1945, 3827, 4272, 5403, 6214, 6843, 8117, 8827, 9516, 10328, 11201, 12905, 14507, 15398, - 785, 1036, 2037, 4291, 4698, 5531, 6223, 7000, 8372, 9181, 9784, 10501, 11195, 12592, 13855, 15023, - 1079, 1556, 2081, 3294, 4678, 5189, 5975, 6991, 7650, 8458, 9624, 10387, 11370, 12518, 13343, 14521, - 1085, 1535, 2122, 2772, 3190, 4157, 6280, 7310, 8119, 8898, 9511, 10169, 11313, 12529, 13732, 15153, - 1130, 1625, 2359, 3044, 3504, 5151, 6102, 6755, 7616, 8099, 8791, 9828, 10718, 12434, 14231, 15302, - 894, 1194, 1854, 2315, 3048, 5073, 5700, 6637, 7336, 8181, 9563, 10924, 12316, 13331, 14349, 15237, - 1274, 1843, 2368, 2935, 3396, 4031, 5905, 6950, 7597, 8704, 9554, 10193, 11657, 13031, 13891, 14934, - 1208, 1660, 2310, 3189, 3644, 4355, 5442, 6162, 7602, 8433, 9505, 10600, 12310, 13625, 14495, 15234, - 884, 1244, 2154, 2652, 3187, 3810, 5991, 6674, 7284, 8251, 9106, 10547, 11947, 13173, 14248, 15300, - 851, 1095, 2125, 2913, 3429, 4068, 4931, 6228, 6911, 8477, 9513, 10932, 12187, 13333, 14385, 15286, - 637, 976, 2370, 3892, 4718, 6063, 7126, 8378, 9405, 10359, 11188, 12001, 12807, 13610, 14465, 15303, - 674, 1156, 3206, 3848, 4574, 5332, 6275, 7180, 7979, 8944, 9945, 11135, 12211, 13166, 14189, 15185, - 648, 874, 1620, 4523, 5335, 5818, 6480, 7079, 8024, 8654, 9320, 10068, 11602, 13428, 14329, 15293, - 602, 831, 3174, 4258, 4758, 5558, 6154, 6862, 7261, 8173, 9894, 11228, 12406, 13185, 14416, 15390, - 728, 1050, 2523, 3324, 4581, 5112, 6274, 7249, 7665, 8228, 9024, 9779, 11962, 13886, 14569, 15310, - 625, 1064, 2658, 3373, 4317, 5328, 6341, 7576, 8230, 9137, 10072, 11030, 12105, 13071, 14050, 15127, - 860, 1199, 2569, 3264, 3928, 5082, 6012, 7023, 7568, 8726, 9899, 10975, 11665, 12602, 13465, 14849, - 994, 1326, 2131, 3392, 3914, 4629, 5507, 6365, 7208, 8086, 9307, 10139, 11960, 13752, 14791, 15505, - 1297, 1723, 2304, 2955, 3528, 4575, 5330, 6141, 7321, 7873, 9079, 11066, 12114, 12781, 13485, 14866, - 1247, 1673, 2480, 3557, 4100, 4892, 5843, 6678, 7764, 8607, 9292, 10007, 11055, 11895, 12912, 14829, - 1108, 1515, 2302, 3815, 4582, 5275, 6233, 7271, 7993, 8890, 9807, 10489, 11145, 11905, 12753, 14036, - 969, 1302, 2055, 2425, 3922, 5219, 6014, 6785, 7331, 9195, 10032, 10897, 11788, 12542, 13408, 14826, - 1042, 1398, 2217, 2813, 3449, 4242, 5032, 6957, 7766, 8985, 9916, 10576, 11237, 12222, 13952, 15302, - 1099, 1456, 2313, 2814, 3532, 5651, 6349, 7119, 8208, 8769, 9427, 10112, 11070, 12005, 12975, 14815, - 952, 1343, 2279, 4277, 5014, 5588, 6550, 7259, 8172, 9304, 10112, 10905, 11848, 12798, 13734, 14852, - 827, 1155, 2015, 2590, 3389, 5575, 6147, 7237, 8788, 9352, 9943, 10452, 11166, 11866, 13017, 14908, - 965, 1342, 1904, 3530, 4756, 5265, 6282, 7430, 8006, 8866, 10189, 10858, 11593, 12497, 13413, 14286, - 791, 1033, 1807, 4669, 5445, 6065, 6777, 7311, 8217, 8955, 9594, 10171, 10891, 11711, 13024, 15079, - 703, 982, 1468, 2926, 5508, 6551, 7045, 7648, 8280, 9027, 10043, 10724, 11477, 12486, 13816, 15160, - 636, 1084, 3228, 4342, 5051, 5884, 6638, 7545, 8362, 9253, 10190, 11160, 12212, 13207, 14220, 15198, - 821, 1100, 1682, 3559, 5618, 6419, 6944, 7630, 8233, 9075, 10130, 10822, 11427, 12149, 13027, 14146, - 629, 1332, 3013, 3722, 4532, 5532, 6531, 7553, 8517, 9499, 10507, 11474, 12457, 13390, 14358, 15272, - 1317, 2450, 3297, 3892, 4613, 5418, 6425, 7337, 8291, 9245, 10282, 11346, 12442, 13393, 14373, 15268, - 1375, 2387, 3533, 4376, 5325, 6263, 7320, 8268, 9276, 10272, 11197, 12094, 13000, 13818, 14648, 15432, - 1158, 2044, 2814, 3372, 4231, 5273, 6326, 7190, 8055, 8945, 9909, 11036, 12230, 13264, 14271, 15192, - 871, 1102, 2233, 4189, 4539, 5309, 5875, 6894, 8135, 8683, 9397, 10814, 12535, 13312, 14286, 15134, - 814, 1062, 2256, 4246, 4741, 5468, 6095, 6832, 7800, 8445, 9019, 9623, 10539, 12957, 14398, 15333, - 958, 1249, 1879, 3625, 4221, 4743, 5374, 6010, 7564, 8370, 9054, 10537, 11472, 12580, 13996, 15129, - 871, 1148, 2666, 3651, 4193, 5040, 5660, 6778, 7459, 8017, 8780, 9530, 10508, 12721, 14270, 15304, - 651, 1057, 2426, 3096, 4328, 5224, 6148, 6984, 7722, 9038, 10150, 11248, 12299, 13281, 14301, 15245, - 617, 889, 2138, 4101, 4573, 5464, 6134, 7293, 8294, 9277, 10316, 11265, 12281, 13301, 14327, 15273, - 792, 1161, 2081, 2883, 3644, 5502, 6438, 7760, 8867, 9704, 10404, 11003, 11913, 13286, 14647, 15445, - 1202, 1869, 2491, 2996, 4025, 5336, 6574, 7586, 8415, 9166, 9940, 11099, 12441, 13461, 14408, 15252, - 1164, 2036, 2762, 3315, 4510, 5722, 6901, 7925, 8892, 9813, 10715, 11594, 12526, 13416, 14359, 15235, - 1442, 2242, 2916, 3528, 4751, 5836, 6787, 7599, 8395, 9235, 10177, 11157, 12208, 13147, 14145, 15115, - 1182, 2189, 3501, 4359, 5481, 6402, 7306, 7997, 8719, 9457, 10314, 11195, 12207, 13152, 14186, 15159, - 1123, 1928, 3249, 4174, 5190, 6018, 6841, 7570, 8320, 9079, 9969, 10880, 11946, 12957, 14056, 15116, - 1391, 2121, 3172, 3766, 4449, 5215, 6232, 7171, 8096, 8981, 9854, 10664, 11746, 12851, 14017, 15116, - 1330, 2144, 2998, 3489, 4141, 5059, 6328, 7427, 8552, 9564, 10505, 11379, 12290, 13173, 14193, 15189, - 1109, 1492, 2303, 2946, 3382, 4987, 6548, 6997, 8296, 9305, 9871, 10389, 11172, 13047, 14487, 15395, - 1088, 1547, 2223, 3092, 3620, 4386, 6452, 7580, 8220, 9176, 10021, 10624, 11535, 12511, 13349, 14330, - 888, 1265, 1930, 3715, 4354, 4929, 6671, 7348, 8125, 9622, 10527, 11265, 12457, 13225, 13909, 14800, - 815, 1189, 2006, 3817, 4374, 5838, 6485, 7386, 8816, 9395, 10242, 10930, 11702, 12358, 13510, 14977, - 990, 1329, 1856, 2513, 2960, 3841, 6200, 7584, 8128, 9084, 9884, 10615, 11927, 13026, 14162, 15236, - 809, 1891, 3000, 3978, 4992, 5938, 6931, 7857, 8818, 9757, 10695, 11637, 12557, 13495, 14394, 15295, - 554, 1531, 2712, 3754, 4813, 5795, 6805, 7758, 8739, 9677, 10642, 11569, 12527, 13426, 14344, 15173, - 961, 1247, 2162, 4030, 4594, 5392, 6191, 6804, 7979, 8852, 9449, 10061, 10905, 11757, 12852, 14951, - 1214, 1854, 2494, 3286, 3894, 4471, 5973, 7358, 7967, 8807, 9608, 10178, 10994, 12344, 13316, 14487, - 1024, 1446, 2069, 2773, 3329, 5327, 6627, 7318, 8209, 8780, 9592, 11114, 12066, 12765, 13662, 14618, - 907, 1229, 2135, 2657, 3456, 4585, 5614, 6412, 7107, 8072, 10517, 11769, 12447, 13038, 14011, 15186, - 608, 888, 1729, 3791, 4395, 4825, 5374, 6977, 7738, 8387, 9316, 10715, 12651, 13548, 14546, 15311, - 941, 1202, 2101, 3123, 3503, 4159, 4619, 6676, 7402, 8223, 9627, 10280, 11822, 13131, 14470, 15468, - 800, 1065, 1726, 2186, 4630, 5715, 6394, 7256, 7782, 8452, 9368, 11407, 12394, 13086, 14086, 15167, - 875, 1208, 1941, 2508, 3296, 4447, 5532, 6821, 7582, 8862, 9556, 10519, 11696, 12896, 14109, 15273, - 900, 1183, 1959, 2423, 3386, 5868, 6409, 7218, 7883, 8442, 9143, 9913, 11104, 13003, 14241, 15213, - 1115, 1573, 2286, 3113, 3574, 4645, 5519, 6311, 8196, 8937, 9864, 11290, 12252, 13043, 13810, 14631, - 754, 1068, 2679, 3694, 4190, 5008, 5606, 7347, 8013, 8864, 9972, 10786, 11627, 12824, 14010, 15316, - 825, 1144, 1765, 3426, 4206, 4874, 6385, 7180, 7946, 9319, 10153, 10682, 11276, 11957, 13415, 15087, - 537, 862, 1866, 3116, 4349, 4842, 5496, 7245, 7958, 8822, 9611, 10099, 11455, 13291, 14370, 15284, - 887, 1205, 1698, 3243, 5173, 5813, 6470, 7237, 7881, 8707, 9739, 10497, 11284, 12115, 13185, 14869, - 726, 1002, 2984, 3728, 4334, 5142, 5946, 7127, 7676, 8367, 9085, 10668, 11889, 13054, 14011, 15180, - 771, 981, 1772, 4221, 4795, 5401, 6003, 6690, 7480, 8115, 8717, 9938, 12232, 13037, 13941, 15157, - 1303, 1922, 2468, 3316, 4185, 4656, 5507, 6631, 7341, 8291, 9593, 10378, 11412, 12616, 13556, 14820, - 1080, 1403, 2477, 2954, 3741, 4642, 5517, 6582, 7111, 7805, 8786, 9547, 11253, 12874, 14045, 15236, - 872, 1141, 2386, 3209, 3896, 5042, 5805, 7002, 7549, 8285, 9036, 9939, 12031, 13030, 13767, 15055, - 728, 1046, 2013, 4276, 5230, 5799, 6889, 7772, 8535, 9890, 10949, 11702, 12791, 13661, 14459, 15218, - 768, 1578, 3171, 4134, 5114, 6061, 7128, 8112, 9139, 10152, 11101, 12005, 12913, 13736, 14586, 15387, - 622, 1221, 3202, 4279, 5529, 6753, 7808, 8631, 9408, 10115, 10830, 11631, 12512, 13365, 14324, 15263, - 621, 848, 1626, 4612, 5335, 5797, 6416, 7167, 8286, 8933, 9880, 11327, 12709, 13565, 14439, 15329, - 650, 861, 3115, 4397, 4828, 5572, 6159, 7071, 7513, 8108, 8667, 9739, 12413, 13532, 14414, 15581, - 756, 1091, 1615, 2958, 4679, 5429, 6304, 7065, 7657, 8329, 10012, 10763, 11425, 12569, 14285, 15324, - 765, 1051, 2074, 3446, 3838, 5659, 6318, 7149, 8407, 8942, 9688, 11058, 12443, 13347, 14361, 15231, - 1121, 1473, 2217, 2827, 3347, 5017, 5872, 6668, 7595, 8264, 9085, 10487, 12210, 13022, 13866, 14985, - 1056, 1457, 2212, 2861, 3453, 5060, 5976, 6759, 7697, 8519, 9461, 10348, 11169, 12000, 13798, 15274, - 1042, 1388, 2220, 3677, 4297, 5120, 6037, 6788, 7788, 8549, 9262, 10069, 10878, 11755, 14085, 15413, - 961, 1331, 1957, 3111, 3796, 4344, 5010, 5553, 7612, 9441, 10155, 10903, 11982, 12664, 13391, 14959, - 1135, 1470, 2082, 3284, 3937, 4423, 5140, 5618, 7055, 8860, 9355, 10318, 11706, 12556, 13826, 15192, - 1084, 1383, 2209, 3550, 4038, 4636, 5240, 5911, 8011, 9044, 9570, 10294, 11155, 11865, 13587, 15219, - 737, 1028, 1858, 2434, 3038, 3815, 5414, 6560, 7753, 9010, 10088, 11109, 12200, 13241, 14292, 15286, - 979, 1377, 2142, 3511, 4042, 4787, 5869, 6505, 7764, 8710, 9567, 10378, 11383, 13445, 14620, 15417, - 802, 1063, 1768, 3997, 4648, 5273, 6005, 6694, 7698, 8427, 9191, 10230, 11176, 12425, 13991, 15244, - 926, 1148, 2359, 3438, 3811, 4446, 4994, 6492, 7088, 7840, 8921, 9955, 11823, 13037, 14140, 15275, - 639, 939, 1753, 3080, 4204, 5022, 5702, 6198, 6811, 8268, 9786, 10836, 12243, 13126, 14260, 15306, - 736, 1079, 1802, 3276, 4001, 5415, 6381, 7119, 8492, 9232, 10308, 11105, 12031, 12793, 13904, 15114, - 1249, 1897, 2616, 3398, 4149, 4840, 5809, 6616, 7453, 8768, 9869, 10767, 12051, 13177, 14339, 15241, - 1026, 1314, 2014, 3249, 3690, 4344, 4892, 5691, 7289, 7970, 9397, 10615, 11663, 13015, 14272, 15328, - 970, 1249, 2342, 2895, 3661, 4685, 5348, 6691, 7176, 8850, 10323, 11025, 11936, 12697, 13429, 14816, - 872, 1155, 1680, 2334, 2880, 4439, 6448, 7088, 8221, 9517, 10060, 10691, 11577, 12830, 14274, 15377, - 874, 1131, 2067, 2714, 3203, 3786, 4480, 6643, 7487, 8708, 9861, 10989, 12079, 13208, 14240, 15290, - 804, 1079, 1708, 2236, 2842, 5275, 6096, 7030, 7886, 8704, 9978, 11354, 12923, 13800, 14706, 15380, - 646, 907, 1724, 3428, 3981, 5158, 5889, 7244, 8226, 8728, 9227, 10055, 11833, 13065, 14232, 15287, - 986, 1315, 1948, 2518, 3010, 5465, 6638, 7224, 8275, 8820, 9602, 10482, 11268, 12169, 14206, 15449, - 565, 805, 1593, 3458, 4571, 5319, 6411, 7828, 8796, 9460, 10121, 10926, 11931, 12989, 14085, 15181, - 532, 795, 1654, 3253, 3949, 5323, 6246, 7279, 8378, 9364, 10397, 11379, 12395, 13375, 14390, 15290, - 835, 1169, 1895, 2461, 3233, 5608, 6358, 7353, 8521, 9756, 10632, 11371, 12291, 12967, 13777, 14575, - 528, 840, 1585, 2511, 4342, 5075, 5825, 7183, 8370, 8938, 9529, 10614, 12398, 13483, 14482, 15340, - 789, 1044, 2065, 2677, 3589, 5397, 5969, 7559, 8126, 8638, 9332, 10989, 12645, 13441, 14355, 15188, - 685, 970, 1644, 2232, 4331, 5344, 6203, 6877, 7736, 9534, 10331, 11186, 11981, 12778, 13629, 14878, - 800, 1120, 1829, 2303, 4180, 4963, 5877, 6722, 7425, 8436, 9106, 10138, 12113, 13163, 14087, 15242, - 851, 1150, 2243, 3088, 3642, 5370, 6027, 6953, 7919, 8562, 9276, 9957, 10896, 12786, 14320, 15324, - 735, 1113, 2000, 3196, 4699, 5471, 6589, 7347, 8003, 8855, 9650, 10594, 12001, 13017, 13918, 15089, - 837, 1098, 1699, 2175, 3008, 6101, 6902, 7529, 8229, 8790, 9674, 10585, 11532, 12971, 14334, 15323, - 626, 1278, 3315, 4325, 5436, 6586, 7790, 8824, 9821, 10690, 11482, 12268, 13043, 13789, 14591, 15381, - 1439, 2612, 3825, 4715, 5881, 7098, 8204, 9129, 10075, 10889, 11673, 12416, 13159, 13897, 14672, 15420, - 1489, 2697, 3785, 4568, 5440, 6284, 7191, 8043, 8936, 9852, 10756, 11696, 12662, 13539, 14458, 15314, - 663, 932, 1850, 4514, 5042, 5800, 6482, 7381, 8674, 9537, 10447, 11239, 12074, 12975, 13958, 14969, - 695, 1028, 1781, 2195, 4548, 5142, 6539, 7282, 7728, 8259, 8915, 9755, 11646, 13482, 14373, 15221, - 846, 1138, 1713, 2239, 2823, 5254, 6237, 6940, 7777, 8443, 9981, 10858, 11793, 13022, 14259, 15331, - 595, 882, 1481, 3108, 4815, 5391, 5979, 6529, 8058, 8939, 9706, 10649, 11884, 13065, 14350, 15334, - 887, 1139, 1829, 2276, 3102, 5552, 6221, 7067, 7712, 8368, 9127, 10682, 12241, 13127, 14112, 15133, - 1019, 1418, 2165, 2865, 3353, 4937, 6019, 6784, 7810, 8440, 9197, 10025, 12092, 13614, 14602, 15352, - 951, 1206, 2295, 3066, 3586, 4125, 4780, 7215, 7687, 8320, 9079, 10918, 12519, 13503, 14488, 15224, - 847, 1149, 2069, 2504, 4231, 5041, 6034, 6862, 7321, 7882, 8765, 10837, 12433, 13022, 13809, 15203, - 829, 1111, 2677, 3505, 3999, 5080, 5694, 7033, 7667, 8302, 8963, 10297, 12410, 13340, 14485, 15373, - 908, 1284, 2182, 2613, 3944, 5116, 5768, 7284, 7825, 8461, 10123, 11755, 12583, 13368, 14195, 15053, - 930, 1215, 2323, 2834, 3500, 4216, 5200, 5956, 6576, 7757, 9998, 10921, 12073, 12844, 14003, 15254, - 973, 1343, 2164, 3265, 3733, 4538, 5294, 6469, 7850, 8468, 9747, 10750, 11398, 12428, 13990, 15226, - 952, 1239, 1992, 3093, 3498, 4156, 4605, 5695, 7946, 8668, 9684, 11027, 12029, 13102, 14093, 15158, - 558, 828, 1638, 2628, 3361, 4827, 6046, 7182, 8226, 9297, 10326, 11331, 12343, 13333, 14312, 15248, - 543, 797, 1292, 2197, 4031, 4954, 6096, 7133, 8292, 9244, 10253, 11267, 12293, 13293, 14303, 15272, - 562, 818, 1546, 2854, 3792, 5212, 5897, 6697, 8329, 9105, 10103, 11572, 13033, 13866, 14716, 15223, - 897, 1320, 1937, 2717, 3205, 4412, 6880, 7773, 8381, 9585, 10492, 11242, 12589, 13425, 14212, 15053, - 798, 1174, 2038, 2482, 3869, 4999, 5820, 7157, 7807, 9160, 10013, 11078, 12122, 13113, 14028, 14997, - 686, 1000, 2269, 3020, 3755, 5347, 5960, 7664, 8406, 9199, 10485, 11521, 12512, 13361, 14217, 15144, - 715, 1058, 1660, 3282, 4591, 4997, 6361, 7315, 7878, 9084, 10356, 11033, 12186, 13333, 14390, 15279, - 784, 1087, 1584, 3299, 5404, 6007, 6611, 7254, 7870, 8870, 10201, 10911, 11780, 12799, 14077, 15156, - 664, 905, 1952, 4880, 5346, 5934, 6519, 7374, 8530, 9311, 10103, 10819, 11525, 12818, 14071, 15168, - 626, 914, 2854, 4227, 4737, 5634, 6361, 7354, 7918, 8636, 9491, 10701, 11785, 13139, 14220, 15292, - 1793, 3491, 4468, 5330, 6092, 6716, 7382, 8023, 8852, 9777, 10729, 11640, 12576, 13418, 14323, 15182, - 688, 949, 1560, 3990, 5022, 5519, 6194, 6798, 8071, 8773, 9515, 10514, 12712, 13784, 14609, 15400, - 783, 1014, 2824, 3542, 4129, 4903, 5606, 6542, 6965, 7778, 10053, 10913, 11995, 12759, 13498, 15320, - 753, 1093, 2085, 2706, 4391, 5134, 5930, 6777, 7408, 8184, 9523, 10719, 12392, 13543, 14552, 15277, - 920, 1325, 2067, 2928, 3400, 4646, 5913, 6704, 8091, 8819, 9941, 10843, 12080, 13740, 14761, 15449, - 618, 961, 2096, 3325, 4242, 5555, 6567, 7721, 8801, 9891, 10891, 11871, 12871, 13717, 14555, 15310, - 826, 1165, 2466, 3876, 4364, 5723, 6461, 7667, 8417, 9095, 9913, 10755, 11704, 12971, 14239, 15196, - 1056, 1577, 2885, 3726, 4232, 5031, 5736, 6842, 8006, 8903, 10198, 11414, 12536, 13409, 14359, 15205, - 876, 1205, 2453, 3059, 3652, 4312, 5617, 6518, 7542, 8743, 9363, 11286, 13049, 13835, 14643, 15303, - 763, 990, 2805, 3723, 4228, 4936, 5628, 6613, 7058, 7705, 8476, 10130, 11974, 13113, 14180, 15342, - 857, 1152, 1913, 3994, 4629, 5137, 6183, 6861, 7722, 9347, 10177, 10777, 11599, 13112, 14298, 15264, - 656, 1269, 3434, 4621, 5637, 6438, 7220, 7942, 8741, 9612, 10517, 11433, 12435, 13354, 14316, 15237, - 1359, 2605, 3748, 4758, 6042, 7092, 7952, 8651, 9338, 9974, 10723, 11579, 12528, 13418, 14397, 15297, - 1529, 3067, 4410, 5449, 6449, 7233, 7901, 8525, 9237, 10002, 10859, 11784, 12730, 13589, 14467, 15300, - 1790, 3311, 4192, 4897, 5538, 6210, 6922, 7697, 8597, 9590, 10560, 11494, 12426, 13283, 14229, 15138, - 1252, 2359, 3404, 4211, 5155, 6055, 7030, 7899, 8850, 9793, 10761, 11714, 12674, 13565, 14489, 15352, - 590, 998, 2402, 3314, 4528, 5604, 6649, 7644, 8508, 9487, 10408, 11383, 12335, 13276, 14293, 15243, - 727, 1025, 1614, 3818, 5876, 6391, 6980, 7606, 8211, 9304, 10696, 11324, 12381, 13241, 13988, 14791, - 621, 899, 2068, 4152, 5232, 6483, 7323, 8193, 8960, 9627, 10417, 11291, 12234, 13192, 14216, 15187, - 582, 828, 1926, 4025, 4942, 6029, 6957, 7599, 8278, 9093, 10032, 11126, 12233, 13209, 14256, 15311, - 788, 1126, 1690, 3183, 3923, 4599, 6240, 6890, 7758, 9022, 9656, 10453, 11779, 12706, 13913, 15214 -}; - - -const Word16 lsf_cdk_nb_gc_stg1[] = /* 14Q1*1.28 */ -{ - -2046, -827, -3490, -8984, -9331, -8562, -2854, 112, 2194, 13294, 11592, 7952, - -294, 2271, 1647, -1260, -2029, -3649, -4081, -3432, -3649, 333, 5042, 4720, - -1209, 984, -241, -3413, -4476, -4817, -2910, -2016, -2016, 2900, 6868, 5408, - -1900, 896, 688, -197, -33, -993, -1470, -1283, -2145, -665, 2161, 4064, - -1998, -351, -1985, -4742, -4879, -5329, -3500, -2023, -1264, 8507, 9766, 6640, - 245, 3962, 3664, 1935, 1601, 144, -1054, -1236, -2225, -2647, -3746, 1695, - -3051, -1382, -1825, 828, 2537, 1872, 957, 689, -592, 1675, 5507, 5216, - -2178, -281, 2097, 5417, 4372, 1648, -802, -1304, -2817, -754, 3345, 4224, - -3400, -2402, -4098, -3148, -2066, -1985, -558, 466, 705, 11042, 11096, 7424, - 776, 4355, 3200, -1139, -2922, -3985, -2990, -2405, -2881, -661, 2897, 4176, - -1818, 394, -385, -1504, -1545, -2913, -3062, -2451, -2609, 2093, 6387, 5248, - -1081, 2069, 1952, 1345, 1649, 64, -1394, -1526, -2577, -2051, -1025, 2863, - 276, 2780, 1567, -3228, -4881, -5970, -4363, -3523, -3089, 3447, 7300, 5456, - 1917, 6445, 5552, 2069, 684, -1233, -2371, -2377, -3409, -1635, 1616, 3648, - -2734, -1049, -2001, -1927, -1908, -2273, -1294, -652, -944, 4451, 7893, 5888, - -1193, 2108, 5153, 7875, 8214, 6145, 2891, 2001, 208, -1312, -2273, 1599, - -3697, -3538, -6739, -7238, -4524, -2464, 2424, 4591, 6098, 15691, 13066, 8912, - -352, 2108, 847, -247, 1179, -769, -2757, -2873, -3713, 203, 4994, 4688, - -1185, 1565, 703, -1788, -2372, -2721, -1951, -1554, -2129, -374, 2529, 4192, - -2094, 401, 352, 1118, 2376, 1632, 582, 351, -1009, -1389, -784, 3056, - -367, 1637, -145, -5132, -6888, -8178, -5371, -3397, -1776, 9469, 9894, 6752, - 953, 5894, 6785, 5196, 4663, 2400, 31, -598, -2065, -2581, -2786, 1743, - -2637, -1222, -560, 5363, 6867, 5329, 2192, 1264, -544, -508, 1345, 3664, - -1112, 1918, 2976, 3989, 4508, 3104, 1245, 606, -897, -2381, -4258, 1119, - -1983, -328, -2930, -6112, -1802, 144, 486, 194, -960, 4066, 7797, 5872, - 648, 3526, 3104, 562, -200, -2177, -3380, -3162, -3857, -1516, 2433, 3920, - -2908, -722, -417, -181, 290, -352, -352, -175, -1088, 1689, 5603, 5184, - -536, 2771, 2064, 10, -643, -1793, -1733, -1523, -2193, -1813, -1585, 2831, - 2239, 5541, 4400, -637, -2370, -4802, -5148, -3901, -2912, 7328, 9222, 6320, - 8159, 12344, 9921, 5311, 4611, 2480, -1461, -1819, -2032, 5438, 7396, 5968, - -3908, -2998, -3105, 1031, 2171, 1952, 2012, 1982, 1280, 8825, 10343, 7056, - -80, 5935, 10546, 12414, 12351, 9601, 4823, 3380, 1152, -840, -2161, 1967 -}; -const Word16 lsf_cdk_nb_gc_stg2[] = /* 14Q1*1.28 */ -{ - -476, -1387, -3185, 464, 1104, 0, - -1029, -675, 63, -1664, -1168, 0, - -691, -1002, -1697, -1968, -704, 0, - -957, -724, -945, 816, 928, 0, - -1131, -2087, -1296, 2704, 1376, 0, - -1167, -1003, 512, 592, 192, 0, - 492, 517, -721, -3600, -1888, 0, - 489, -147, -1153, -688, -864, 0, - 865, 179, -608, 2000, 1008, 0, - -1286, -1953, -1633, -304, -368, 0, - 2033, 1593, -369, -576, 272, 0, - -718, 685, 751, -192, 192, 0, - 1394, 1172, 1520, -480, -576, 0, - -1455, -466, 2896, 2176, 896, 0, - -1171, 324, 2512, -272, -496, 0, - 4950, 5112, 3536, 1040, 80, 0 -}; -const Word16 lsf_cdk_nb_gc_stg3[] = /* 14Q1*1.28 */ -{ - 1, 6, -801, -3701, -3408, -1712, 2661, 2257, 768, - 4, 11, -481, -1886, -2409, -2353, -652, 1216, 256, - 14, 6, -1713, -1706, -1012, -817, -1158, -369, -97, - 8, 15, 127, -780, -1241, -1617, -2819, -1474, -577, - 13, 6, 2320, 103, -1175, -1681, 297, 1536, 384, - 4, 14, -529, -319, -161, -129, -2113, -4131, -1281, - 0, 5, -2001, -1650, -185, 1040, 2146, 1713, 736, - 12, 4, 320, 1615, 1634, 1376, -1700, -4675, -1697, - 15, 13, -401, -348, -511, -320, 2570, 2865, 944, - 7, 14, 335, -1107, -768, -112, -338, -65, 15, - 13, 15, -1025, 563, -38, -865, -1105, 383, 31, - 4, 6, 1056, 1034, 443, -289, -2357, -1986, -689, - 7, 6, 1008, 1608, 1329, 816, 730, 1312, 432, - 4, 12, -1281, 789, 1794, 1328, -517, -561, -113, - 12, 4, 704, 1656, 2289, 3153, 5215, 3682, 1680, - 11, 15, 2528, 4255, 3539, 2320, -669, -1585, -641 -}; -const Word16 lsf_cdk_nb_vc_stg1[] = /* 14Q1*1.28 */ -{ - -1950, -1358, -4562, -8912, -8626, -8050, -2211, 1051, 4226, 15749, 13194, 8800, - 224, 2532, 175, -5316, -6930, -5601, 381, 515, -416, 3224, 6964, 5584, - -2481, -1570, -3746, -3444, -3066, -3665, -2328, -929, -256, 10781, 10903, 7280, - -164, 2676, 1952, 1170, 1362, 32, -809, -978, -1793, -2288, -3137, 2287, - -1649, -589, -3746, -9056, -6586, -2160, 1693, 1869, 1072, 8982, 10375, 7056, - -1442, 731, -465, -352, 881, 0, -1397, -1476, -2273, -792, 2209, 4048, - -570, 1125, -577, -4067, -5011, -6130, -4457, -3228, -2464, 7796, 9414, 6432, - 314, 2780, 1599, -2442, -4050, -5762, -4680, -3747, -3169, 3706, 7556, 5568, - -3306, -3212, -6178, -5257, -2978, -2209, 33, 2038, 3490, 15396, 13130, 8704, - -303, 2334, 927, -1025, -1877, -2753, -1964, -1602, -2145, -943, 1457, 3872, - -1437, 228, -1633, -3020, -3188, -2833, -1579, -942, -1184, 2482, 6532, 5408, - 2622, 6487, 4448, 511, -1383, -2769, -2495, -2230, -2977, -107, 4082, 4480, - -1897, -706, -2994, -2432, 566, 704, 220, 99, -608, 3533, 7300, 5744, - -2605, -1419, -1376, 1700, 1217, 112, -957, -849, -1633, 1902, 6131, 5296, - 2177, 3621, 751, -6700, -10534, -11698, -2205, 713, 3954, 15329, 12986, 8656, - 7156, 9030, 4704, 653, -2345, -6178, -4996, -1616, 1762, 14213, 12329, 8272, - -997, 238, -2066, -5868, -6868, -7474, -4302, -2171, -623, 12371, 11336, 7600, - 2585, 4011, 959, -298, 477, -353, -2457, -2786, -3233, 5865, 8693, 6064, - -2145, -680, -1553, -1961, -2011, -3249, -3184, -2317, -1968, 5674, 8613, 6080, - 675, 4202, 4128, 2060, 1483, -865, -2647, -2552, -3377, -2094, 64, 3184, - -3084, -2915, -5698, -905, 1626, 2176, 1517, 1566, 1024, 9339, 10663, 7232, - -741, 1377, 1168, 206, 185, -1601, -3079, -2936, -3553, -265, 4402, 4528, - 872, 3048, 799, -4039, -5660, -7890, -7222, -4564, -1792, 10306, 10311, 6992, - 2766, 6132, 4848, -1357, -2881, -4914, -4864, -3528, -2608, 9503, 10134, 6832, - -1649, -1598, -6691, -10943, -5664, -3632, 2663, 6788, 11044, 19895, 15933, 10416, - 530, 3138, 2560, -401, -1453, -3425, -4047, -3463, -3713, 252, 4914, 4672, - -879, 1210, 47, -2253, -2732, -3777, -3689, -2947, -2833, 2110, 6499, 5232, - 5749, 8736, 6865, 3519, 2447, 383, -1446, -1459, -2385, 970, 4146, 4560, - -2556, -1914, -3969, 3390, 7938, 6305, 1777, 560, -928, 1091, 4563, 4928, - -1808, -411, 1313, 6469, 6395, 3680, 398, -149, -1713, -1588, 832, 3360, - 3630, 5517, 2479, -2938, -6552, -10675, -4951, -545, 1441, 13744, 12041, 8080, - 10956, 13776, 9201, 4285, 3873, -801, -5835, -2466, 1233, 13746, 12105, 8192 -}; -const Word16 lsf_cdk_nb_vc_stg2[] = /* 14Q1*1.28 */ -{ - -377, -729, -1793, 400, 1312, 0, - -1197, -1432, -2033, -1936, -1520, 0, - -403, -100, 127, -3232, -3456, 0, - 555, 364, -865, -592, -1264, 0, - -1136, -1968, -2640, 4448, 3824, 0, - -1539, 94, 591, 1600, 1376, 0, - -1564, -393, 2528, -304, -688, 0, - 1075, 823, 1648, -96, -704, 0, - -770, -404, 527, -1648, 64, 0, - -1320, -1678, -1072, 48, -688, 0, - 145, 83, -1089, -3632, -448, 0, - 1994, 1756, 159, 1120, 1504, 0, - 282, -236, -800, 2080, 624, 0, - -1357, -1537, 1008, 2624, 1360, 0, - 2002, 2046, 1215, -2336, -1808, 0, - 3757, 3480, 2592, 1472, 512, 0 -}; -const Word16 lsf_cdk_nb_vc_stg3[] = /* 14Q1*1.28 */ -{ - 3, 5, -657, -4633, -3805, -736, 1304, 1024, 368, - 6, 12, -305, -1836, -2507, -2625, -1818, -241, -305, - 6, 4, -2577, -1854, -1236, -1073, -594, 207, -1, - 2, 2, -80, 643, 38, -993, -3719, -1602, -769, - 13, 10, -625, -1825, -2422, -2449, 2887, 2625, 784, - 6, 0, -336, 315, 466, 560, -2183, -4867, -1345, - 10, 7, -2625, 1255, 2305, 1296, 181, 544, 208, - 0, 7, 912, 1998, 1662, 623, -416, 256, 32, - 10, 6, -1713, -1720, -311, 1408, 2066, 1585, 672, - 7, 11, 15, -1217, -99, -33, -851, -33, -81, - 12, 0, -1680, 556, -499, -897, 454, 896, 256, - 2, 8, 2608, 425, -938, -1937, -1205, 15, -177, - 6, 2, 1504, -796, -939, 80, 2179, 1777, 672, - 3, 13, 1984, 3517, 3171, 2320, -2605, -5651, -1857, - 14, 2, -160, 1660, 2380, 2832, 2924, 2097, 992, - 10, 0, 3857, 3623, 2853, 1728, 1554, 1441, 656 -}; -const Word16 lsf_cdk_wb_gc_stg1[] = /* 14Q1*1.28 */ -{ - -854, -266, -3202, -8408, -10604, -11763, -10826, -9448, -7970, -4784, -3493, -2593, - -2727, -1241, -1489, -1469, -1977, -2529, -2344, -2279, -2273, -1750, -1365, -1505, - -728, 1001, -113, -1594, -2256, -3553, -4619, -4591, -4497, -3300, -2327, -2129, - -590, 1699, 1264, 1187, 300, -865, -1554, -1669, -1649, -1202, -837, -1169, - -1612, -578, -2546, -5013, -6155, -6834, -6779, -6002, -5506, -3988, -2968, -2625, - -1725, 1072, 1280, 74, 277, 672, 1385, 2172, 2688, 2643, 2065, 848, - -86, 3639, 3824, 1931, 2115, 1120, 338, 500, 496, 751, 718, -65, - -1024, 1647, 5377, 9202, 8763, 7665, 5376, 4447, 3824, 2803, 2000, 608, - -2585, -2600, -6211, -11489, -11790, -10322, -5788, -3684, -2289, -465, -33, -289, - -3165, -2478, -3521, -1181, 298, 1632, 2160, 2107, 2272, 2075, 1407, 319, - 1275, 3587, 2848, 570, -26, -1489, -4034, -4818, -5202, -3732, -2550, -2049, - -2614, -1530, -848, 4992, 6996, 8002, 9185, 9172, 9106, 7739, 5862, 3408, - 440, 2263, 751, -3627, -4674, -4978, -4938, -5078, -5554, -5428, -4266, -3361, - -2308, -80, 176, 2603, 3871, 3792, 3219, 2667, 2480, 2189, 1405, 95, - 2569, 6546, 6257, 3885, 2438, 1504, 1431, 1319, 1392, 1337, 942, -65, - -712, 3328, 6290, 10673, 12635, 13827, 14544, 13939, 13619, 10691, 8026, 4768, - 842, 2338, 159, -5945, -8498, -9619, -8197, -7076, -6066, -4502, -3722, -3409, - -1628, 617, -129, -1907, -2194, -1505, -95, 486, 928, 1268, 1071, 175, - 538, 3277, 2111, -1606, -3194, -3553, -2105, -1604, -1393, -974, -740, -1009, - -1279, 456, 2593, 6823, 5435, 3536, 1502, 544, -96, -521, -548, -1105, - -983, 675, -865, -4388, -5936, -5697, -3245, -2211, -1633, -519, -276, -849, - -102, 3506, 2480, 332, -670, -448, 859, 1384, 1776, 1846, 1568, 448, - 270, 5022, 5136, 4435, 4546, 4305, 4185, 4385, 4337, 3659, 2785, 1152, - 216, 5449, 10098, 11459, 11060, 9922, 8139, 7175, 6289, 4794, 3394, 1600, - -3137, -3309, -5826, -6310, -5500, -4385, -2187, -1054, -288, 502, 527, -129, - -2997, -2031, -1344, 2452, 2535, 1856, 912, 451, 272, -124, -515, -993, - 3808, 7001, 5536, 908, -807, -1665, -2041, -2232, -2449, -2206, -1782, -1905, - -1117, 2493, 3616, 4843, 5755, 6273, 6815, 6906, 6769, 5801, 4580, 2528, - 2509, 4911, 3439, -2294, -4945, -7203, -9006, -7957, -6818, -4297, -3321, -3009, - -1110, 1877, 1776, 2112, 2398, 2704, 3465, 3938, 4257, 4039, 3202, 1568, - 7131, 11568, 10626, 7755, 6467, 5073, 4839, 4543, 4128, 3206, 2160, 912, - 2457, 10049, 15204, 18687, 18433, 17364, 14947, 13353, 11682, 8277, 6182, 3232 -}; -const Word16 lsf_cdk_wb_gc_stg2[] = /* 14Q1*1.28 */ -{ - -1224, -2316, -3425, -928, 128, 0, - -1874, -2354, -1025, -624, -448, 0, - -1026, -888, -481, -2352, -1024, 0, - 838, 174, -2306, -4048, -960, 0, - -1336, -2679, -1776, 2464, 1200, 0, - 497, 2649, 3536, 1344, 320, 0, - -1099, 4, 2448, -544, -752, 0, - 993, 486, 592, 64, -480, 0, - 288, -551, -2385, 1824, 2016, 0, - -1090, -815, 128, 1008, 704, 0, - 279, -579, -1729, -560, -832, 0, - 60, 1211, 543, -288, 272, 0, - 480, 1062, 560, 3152, 1680, 0, - -1276, -672, 2961, 2704, 1200, 0, - 1357, 1787, 767, -3424, -2768, 0, - 4229, 3682, 1696, 192, -256, 0 -}; -const Word16 lsf_cdk_wb_gc_stg3[] = /* 14Q1*1.28 */ -{ - 15, 1, -1665, -4778, -4630, -3105, -554, -304, -112, - 13, 10, -753, -1579, -1817, -1953, -2415, -2148, -1697, - 8, 15, 1135, -1716, -3415, -5154, -4958, -3443, -1905, - 4, 1, -32, 570, 443, -65, -2187, -2759, -2561, - 4, 14, 399, -979, -269, 816, 385, -194, -673, - 2, 5, -2161, -1600, -401, -97, -412, -433, -321, - 0, 15, 2128, 3449, 1993, 175, -2815, -2580, -1729, - 3, 2, 400, 714, 1209, 1904, 2711, 2436, 1840, - 9, 13, 143, -1925, -2694, -2545, 358, 930, 960, - 10, 0, -960, 868, 173, -513, -97, 577, 896, - 0, 5, 1824, 11, -1080, -1761, -1565, -1058, -705, - 7, 1, -880, 2304, 2790, 2384, 573, -18, -273, - 5, 8, 1840, 1467, 978, 768, 598, 351, -17, - 6, 7, -1473, -2052, -711, 992, 3166, 2788, 2080, - 7, 12, 1856, 3557, 3483, 3184, 2417, 1923, 1408, - 3, 13, -1649, 1850, 4068, 5073, 4907, 4086, 2976 -}; -const Word16 lsf_cdk_wb_vc_stg1[] = /* 14Q1*1.28 */ -{ - -1159, -1161, -5395, -12785, -14024, -12291, -8572, -6523, -4593, -1979, -1169, -897, - -1903, -921, -2065, -1931, -2752, -3825, -4238, -4174, -4145, -3108, -2167, -2081, - 522, 1696, -513, -6103, -8611, -9571, -9024, -8617, -7826, -5631, -4489, -3761, - -1839, -544, -1280, 1080, 564, 752, 844, 1110, 1344, 1185, 1039, 63, - -2685, -2538, -5074, -6161, -6745, -6738, -5709, -4457, -3377, -1830, -1188, -1185, - -3059, -3565, -6706, -3405, -1183, -272, -112, 33, 160, -5, 13, -721, - 4464, 5425, 1535, -8151, -13242, -15171, -5882, -2159, -288, 176, 739, 1440, - 1431, 2210, -769, -2539, -889, -721, -4378, -6019, -8099, -8147, -6215, -3873, - -1779, -2663, -8548, -12911, -8955, -5265, -1796, -700, 240, 746, 528, -160, - -847, 1228, 735, -1117, -1191, -1857, -2236, -2407, -2321, -1779, -1542, -1665, - -11, 1561, 591, -2764, -3940, -4994, -5679, -5652, -5586, -4852, -3930, -3297, - -783, 2500, 2912, 1480, 864, -64, -492, -833, -769, -353, -452, -1009, - -1207, 305, -1169, -3978, -4167, -3249, -1227, -606, -48, 233, -51, -545, - -2442, -2531, -3873, 5622, 7990, 7025, 4210, 3337, 2576, 1042, 237, -673, - 7644, 9215, 4703, -2206, -6625, -10676, -11281, -8039, -4321, -386, 15, -113, - 5397, 7494, 5296, -39, -1846, -2017, -1875, -1846, -1697, -2156, -2072, -1969, - -279, 230, -3010, -8280, -10317, -11859, -10729, -9576, -7922, -4867, -3862, -2865, - -899, -234, -2897, 3569, 4566, 799, -5740, -7153, -6546, -3276, -2048, -960, - 954, 3319, 1295, -3334, -5133, -5137, -2866, -2245, -1793, -1073, -934, -1281, - -1098, 1538, 1024, 1919, 2978, 3729, 4709, 5431, 5521, 4962, 3843, 1920, - -772, 429, -1810, -5319, -6411, -7074, -6828, -6001, -5266, -3901, -3160, -2833, - -140, 1442, -1153, -2496, -631, 1264, 2033, 3167, 3840, 3225, 2577, 1232, - 2263, 4102, 1167, -4671, -6812, -9651, -10507, -2400, 272, 1823, 1124, -2641, - 3904, 5709, 4800, 1435, -1797, -3682, -7176, -9009, -11812, -10666, -5157, -2353, - 122, 738, -2898, -9698, -11180, -8161, -1527, -926, -352, 476, -116, -705, - 1615, 3938, 3296, -117, -1405, -2593, -4075, -4383, -4273, -3528, -3017, -2881, - 3319, 4999, 2191, -4352, -6684, -7394, -7503, -7494, -6914, -5038, -4138, -3841, - 1933, 5658, 4544, 2619, 2149, 1456, 812, 401, 240, 207, 12, -673, - 1747, 3791, 1295, -236, -1712, -1232, 632, 903, 1488, 1527, 1184, 368, - -1030, 922, 4017, 7665, 6754, 5073, 3236, 1989, 1056, 426, 45, -609, - 12487, 14522, 8896, 2687, 1057, -3810, -10425, -9171, -6482, -2948, -2321, -1169, - 7344, 9906, 7921, 4454, 3289, 2320, 1483, 513, 192, 491, 493, 79 -}; -const Word16 lsf_cdk_wb_vc_stg2[] = /* 14Q1*1.28 */ -{ - -182, -1035, -2593, -176, 528, 0, - -2110, -2904, -2881, -1696, -864, 0, - -160, -876, -1777, -4160, -2112, 0, - 1601, 651, -1393, 208, -896, 0, - -1109, -1806, -2112, 2592, 1360, 0, - -1723, -1575, 1104, 912, 288, 0, - -700, 1343, 687, 1408, 144, 0, - 863, 454, 864, 464, -160, 0, - -1234, -1141, -289, -832, 832, 0, - -230, -608, -480, -1520, -2352, 0, - 1268, 2126, 1919, -3440, -3072, 0, - 1298, 1365, -65, -2832, 672, 0, - 1095, 493, -849, 3184, 3056, 0, - -469, -479, 1617, 3728, 2112, 0, - -675, 1400, 3984, 240, -592, 0, - 2580, 2697, 2432, 1920, 1040, 0 -}; -const Word16 lsf_cdk_wb_vc_stg3[] = /* 14Q1*1.28 */ -{ - 7, 3, -1329, -4391, -3913, -3041, -859, -255, 176, - 13, 7, -2257, -960, -1287, -1649, -1313, -770, -433, - 3, 13, -33, -1650, -2302, -2721, -4039, -3798, -2609, - 10, 4, 0, 1123, 279, -1057, -2271, -1039, 160, - 7, 12, 15, -748, 384, 848, -1029, -1992, -2385, - 4, 1, -2417, -2753, -316, 912, 1240, 993, 704, - 0, 0, 2497, 3043, 1347, -849, -5667, -5913, -4193, - 5, 2, 848, 519, 1737, 2560, 1763, 1506, 912, - 12, 12, 271, -2734, -3306, -736, 1294, 383, -209, - 10, 14, -577, -71, -129, -449, 1561, 2068, 1920, - 14, 1, 1408, -1285, -2943, -4177, -1355, 306, 752, - 15, 8, -2529, 2194, 2953, 2368, 1761, 1377, 816, - 14, 10, 3024, 1322, 224, -304, 514, 511, -81, - 1, 12, -849, -709, 112, 2417, 5221, 4664, 3648, - 1, 9, 160, 3607, 3314, 2016, -333, -884, -1233, - 13, 12, 1888, 3621, 3935, 4000, 3607, 2932, 2128 -}; - -const Word16 *const lsf_codebook[2][2][TCXLPC_NUMSTAGES] = /* 14Q1*1.28 */ -{ - { - { lsf_cdk_wb_gc_stg1, lsf_cdk_wb_gc_stg2, lsf_cdk_wb_gc_stg3 }, - { lsf_cdk_wb_vc_stg1, lsf_cdk_wb_vc_stg2, lsf_cdk_wb_vc_stg3 } - }, - { - { lsf_cdk_nb_gc_stg1, lsf_cdk_nb_gc_stg2, lsf_cdk_nb_gc_stg3 }, - { lsf_cdk_nb_vc_stg1, lsf_cdk_nb_vc_stg2, lsf_cdk_nb_vc_stg3 } - } -}; - -const Word16 lsf_numbits[TCXLPC_NUMSTAGES] = { 5, 4, 4 }; // Q0 - -const Word16 lsf_dims_ivas[TCXLPC_NUMSTAGES] = { 16, 6, 10 }; // Q0 -const Word16 lsf_offs_ivas[TCXLPC_NUMSTAGES] = { 0, 0, 6 }; // Q0 -const Word16 lsf_dims[TCXLPC_NUMSTAGES] = { 16, 8, 12 }; // Q0 -const Word16 lsf_offs[TCXLPC_NUMSTAGES] = { 0, 0, 4 }; // Q0 - - -const Word16 lsf_ind_cdk_nb_gc_stg4[] = /* 14Q1*1.28 */ -{ - -1360, -704, 0, - 80, 256, 0, - -896, 1008, 0, - 960, 2016, 0 -}; -const Word16 lsf_ind_cdk_nb_vc_stg4[] = /* 14Q1*1.28 */ -{ - -1360, -944, 0, - 624, 1408, 0, - -368, 240, 0, - 2480, 3216, 0 -}; -const Word16 lsf_ind_cdk_wb_gc_stg4[] = /* 14Q1*1.28 */ -{ - -1280, -816, 0, - 368, 272, 0, - -704, 1136, 0, - 1296, 2448, 0 -}; -const Word16 lsf_ind_cdk_wb_vc_stg4[] = /* 14Q1*1.28 */ -{ - -1040, -848, 0, - 688, 400, 0, - -560, 1520, 0, - 2256, 2704, 0 -}; - -const Word16 *const lsf_ind_codebook[2][2][TCXLPC_IND_NUMSTAGES] = /* 14Q1*1.28 */ -{ - { { lsf_ind_cdk_wb_gc_stg4 }, { lsf_ind_cdk_wb_vc_stg4 } }, - { { lsf_ind_cdk_nb_gc_stg4 }, { lsf_ind_cdk_nb_vc_stg4 } } -}; - -const Word16 lsf_ind_numbits[TCXLPC_IND_NUMSTAGES] = { 2 }; // Q0 - -const Word16 lsf_ind_dims_ivas[TCXLPC_IND_NUMSTAGES] = { 2 }; // Q0 -const Word16 lsf_ind_dims[TCXLPC_IND_NUMSTAGES] = { 4 }; // Q0 -const Word16 lsf_ind_offs[TCXLPC_IND_NUMSTAGES] = { 0 }; // Q0 - -const Word16 min_distance_thr[2][2] = /* 14Q1*1.28 */ -{ - /* GC, VC */ - /* WB */ { 580, 580 }, - /* NB */ {1000, 580 } -}; -const Word16 lsf_q_diff_cb_8b_rf[256 * 16] = /* Q6 */ -{ - -3145, 863, -1389, 4087, 1110, 3193, 290, -3160, 824, 212, -2936, -5827, -10181, -15650, -13373, -3849, - -4602, -3228, -8398, -1649, -5788, -8971, -2025, -2971, -1476, -2748, -2458, 966, -4, -1802, -1360, 654, - -8629, -7702, 6280, 3296, -1205, 365, -5964, 3125, 2443, 1442, 1149, -3835, -9867, -4238, -1977, -1955, - -2629, -759, -2056, -2297, -1839, 1678, -2412, -7539, -13208, -9624, -1688, -2171, 943, -454, 536, 2644, - -2840, -1391, -10500, 2516, 907, 146, -2762, -6750, 2949, -2282, -4614, -5663, -7773, -5510, -5947, -3727, - -4006, -939, -2500, -771, -3414, -4521, -6417, -4064, 3698, 3969, 4300, 4177, -3195, -10419, -13072, -6695, - -4284, -1172, -4415, -1601, -6029, 66, -4338, -2300, -3402, -5614, -7181, -7288, 7154, 6538, 64, -3263, - -6470, -4503, -9698, -5885, 235, 5049, 2698, -3656, -3600, -6261, -4270, 766, 1037, -1511, -1274, 1800, - 669, 2937, -3464, -1034, -4098, -11296, -382, -4610, -9613, -2081, 3947, 2832, 2962, -332, -9039, -10702, - -11109, -5950, -7200, -6525, -4260, -5060, -8936, -91, -672, 4557, 3192, -147, -2247, 1566, -734, -3007, - -2411, 1587, -2575, 2172, -3270, 10648, 7093, 1517, 1512, -392, 49, -9117, -16895, -908, -8443, -9923, - -1934, -603, -6588, 5335, -1565, -11521, 5944, -5092, -615, -2221, -7703, -1903, -5195, 2323, 3958, 3050, - -7094, 5361, -7885, -3299, -3282, -3125, -1888, -406, 1522, -23, -1506, -6075, -8517, -7605, -3450, -3362, - -3573, -2421, 1385, -181, -11027, 4778, -4014, -4956, 7316, 3138, 2351, 3406, -1998, -968, -2375, -3262, - -141, 6652, 11944, -4131, -2073, -2592, -1562, 1521, -1804, -2585, -2685, -5798, -10850, -11629, -4300, -4287, - -1569, 2229, 2330, 3147, -1026, -7010, 265, -1320, -3648, 1942, -5375, 73, 10348, 3913, -5535, -5938, - -5642, -3433, -8423, 1178, -540, -4790, -1976, 4686, 1701, -1323, -2009, -5997, -5693, -3852, -7604, -5361, - -1784, -325, -8561, -17592, 1663, 1377, 2347, -245, -2426, 141, -137, 985, -4926, -7898, -3559, 895, - -2548, -1563, -5007, 7311, 4409, 3177, 3920, 1546, -725, -5252, -9754, -9267, -5701, -6900, -961, 1772, - -1676, 889, -4798, 8060, 3460, -1911, 415, -4044, -6146, -12074, -10588, 13056, 2765, 1396, -4737, -4905, - 943, 3342, -8515, 4676, -774, -3963, -5503, -1625, 3909, -3614, 12347, 2835, -9710, 5877, 297, -918, - -5317, -2799, -3708, -4084, -8175, -6155, 1752, 6801, 7493, 6271, 4083, 3132, -809, -4200, -5389, -5982, - -5060, -5285, -1533, -2751, 2259, -3893, -3473, -108, -4711, -2627, -2069, -2320, -172, 1547, 770, 309, - -4485, -2618, -7238, 1767, -2965, 6693, 5256, 18, -1789, -5076, 7167, 3204, -1242, 1628, 4519, 1796, - -114, 1225, -3083, 321, -4002, 4834, -3014, -741, -4189, -5946, 6871, -2068, -13016, -9772, -3235, 2044, - 559, 10477, -9704, -7733, -8989, -10787, -10342, -8585, -2844, 1474, 5638, 9798, 10986, 9105, 4619, 2186, - 1576, 9039, 4354, 2073, 1861, -1492, -715, 1840, -6736, -10798, 994, -2921, -6369, 779, 2668, -443, - -2067, -1020, 1, 14571, 2253, -2163, 5255, 973, -1722, 4173, 102, -3633, -1430, -1720, 1243, 1749, - -6589, -1601, -9469, -5581, 3018, 1186, -11, 1252, 5708, 3338, 187, -3950, -6035, -3294, -106, -1130, - -2490, 445, -2543, -3283, -3432, -6963, 9950, 4072, 2294, 4517, 2736, 8173, 4270, -8347, -9374, 4776, - -66, 3476, 537, 2659, -677, 1552, 1974, -1703, -2139, -634, -1988, 694, 1921, -12938, -16525, 5848, - -9849, 7389, 4653, -1158, 1340, -2250, -2460, -2201, -3122, -90, 3974, 5105, 9127, 8701, 6184, 3770, - -5086, -3159, -3197, -9944, -7474, 961, 1158, -3536, 1050, 5572, -1480, -11120, -9276, -1841, -2086, -24, - -1019, -346, -6765, -8343, -6302, -3019, -5606, 2728, -3994, -6909, 10146, 6321, -230, -393, -846, -1536, - -1598, 3610, 3330, -233, -1215, -1953, -1330, 19, -4839, -10681, -11699, -1104, 1146, -6143, -6849, 422, - 892, 7937, -5005, -5547, 1756, -4020, -3420, -6811, -6304, -7812, -6019, 5109, 5503, 5568, 4600, 6472, - -3296, -2230, -6010, 3497, 5502, -2291, -2342, -6544, -12576, 2192, -1004, -5205, -500, -6764, -6200, 1816, - 5114, 4922, 6498, 6613, 4909, 2318, -5626, -11915, 3072, 11570, 1766, 4361, 552, -8139, -14006, -17228, - -3321, -1514, -473, 3295, -1028, -4536, -12374, 12452, 7396, -2269, -5052, 554, 1053, -4370, -5859, 97, - -2532, 2546, -4920, -13800, 8116, 2425, 1695, -2088, -5105, -346, -2869, -2457, 9336, 13166, 6150, 5166, - -2329, 72, 11513, -3075, -7745, -5492, -8015, -5108, -16, 3261, 876, -357, -3241, -2956, -4265, -2320, - -7869, -6495, -16668, -1339, -3678, 975, -2740, -2776, 3755, 141, -190, 1026, 5972, 3232, -924, -3212, - -1077, 568, -5606, 1478, -243, 2479, 10198, 3667, 682, -2873, -9164, -9042, 2186, 4347, -750, 5303, - 556, 5098, -6825, -2564, -3946, -5752, 1977, -6171, -5627, 4580, -835, -6362, 10132, 9511, 6475, 2861, - 3320, 11074, -483, 2698, -20, -4084, -4213, -3931, -231, -17, -1826, -2737, -5920, -1539, -1897, -3347, - -1346, 2075, -1230, -5248, 10906, 9461, 5046, 3485, -267, -948, 4273, 1889, 81, -488, -4763, -5532, - -1237, 6446, 3974, 5166, -723, -10033, 8338, 4102, 683, 1474, 624, -5287, -8628, -7519, -6290, 1767, - 207, 2676, 870, 13754, 7087, 2357, -922, -1734, -4651, 352, 14028, 10050, 8916, 2725, -5722, -9415, - 364, 3660, -813, 4370, -2151, -2115, 5570, -2545, -8167, -1978, -8301, -10715, 959, -5127, -11250, -7721, - -1668, -1437, -5508, -11155, -15130, 6829, 6070, -1555, -3048, -314, -528, 1714, 1474, -42, -541, 3361, - -15356, -12047, -4659, -1598, 4105, 3069, 2375, 3647, 1217, 140, -2518, -4195, -3080, 2155, 66, -570, - 84, 1523, -742, 13326, 5544, -2653, -5484, -3816, -9239, -10794, 6967, 2095, -4231, -2102, 4368, 8737, - 2959, 3968, -2430, 4601, 317, 5804, -3547, -11099, 5849, 273, -5513, 767, -9421, -11095, 3029, 8472, - -518, 2355, 2733, 53, -1439, -2709, -394, 5355, -2408, -3122, 8729, 5660, 7771, 4999, -7588, -15134, - -2240, 2281, 6677, -5155, 5663, 266, -4355, -7052, -3825, -2235, -2745, -3212, -2018, 1828, 1971, 2086, - -1241, 699, -2126, 3835, 1147, 4456, -3810, -23, 1284, -4878, 3807, 14029, 2820, -6773, 9556, 6600, - -1716, 315, -3259, -3282, -2859, -2219, 3508, -3452, -7850, 623, -5558, -2168, 1842, -8228, -885, 15388, - -8177, -7705, -14377, -6808, -7099, -7676, -4141, -5548, 3677, 5846, 6160, 10031, 11318, 8141, 3326, 904, - -3072, 1139, 1875, 4811, 3767, 7294, 4507, 1476, -1622, -6385, 384, 3318, -3867, -10447, -6387, -4252, - -19, 1102, -6317, 3433, -1856, -5732, 7225, -2107, -6977, 9620, 7964, 3013, 7152, 4986, -2184, 2136, - -524, 1479, -923, 3729, -259, 227, 6477, 2660, 4208, 1017, -423, -6090, -13677, 5309, 702, 2721, - -822, 2175, 1717, 3580, 1133, 3835, 980, 13265, 6367, 2741, 7462, 6211, -2347, -7635, 4781, 4132, - -8168, 13481, 5777, -963, 643, -2853, -2086, -1593, -2092, 2348, 3867, 413, 461, 1644, -259, -1656, - -846, 1615, -2805, 935, 3206, 1907, 7862, 3901, -975, 4507, 3151, 1433, 15449, 4412, -1221, 1001, - -3952, 1411, -2148, -1025, -2553, -4164, -4725, -3465, -2654, -3828, -6151, -7679, -5881, -2007, -581, -2499, - -1744, 4546, -8725, -6274, -1364, -1087, -2198, -4504, -3542, -1966, -516, -802, 448, -162, -1277, -2081, - -12133, -10923, 10206, 4436, 611, -2300, -4926, -4708, -5138, -3373, 2358, 295, -370, 4406, 2947, 351, - 1477, 3584, 3776, 4714, -1508, 2029, 426, -5245, -2805, -5852, -8752, 199, -3945, 10358, 10127, 4852, - -1894, 528, -776, 2698, -1298, -7579, -12457, -12545, 2483, 2421, -140, 723, -395, -292, -4196, -1766, - -3071, 1449, -3716, 3712, -3017, 543, -391, -1984, 3301, 375, 1107, -2635, 4730, 870, -19666, -12653, - -2823, 3165, 5399, -10321, -6087, -2824, -329, -1699, -268, -1995, -2254, 2744, 319, 51, 2834, 452, - -2837, -240, -1298, 2244, 1977, 3061, 3676, -1207, -3774, -2607, -3405, 9701, 12102, -3052, -10263, 1164, - -1548, -515, -3862, 1117, 3329, 4105, -804, -4141, -9321, -3136, 1792, 3484, 2025, -6747, -11991, -10905, - -3361, -2922, -3472, 1165, -3055, -1620, -4751, -8940, -477, 1932, 1054, 4687, 5735, 5566, 2447, -778, - 1791, 3768, 602, -2421, -6876, 9505, 7350, 2428, -3175, -6252, -707, -3720, -7723, -42, 4292, -1141, - -2469, 269, -1028, 1057, -890, 383, -128, 821, -2854, -5548, -2437, -3349, 3935, 1474, 14267, 13393, - -3416, 14072, 1196, -3166, -4252, -711, 521, 2462, 5346, 1483, -4287, -7676, -5805, -321, 867, 475, - -1674, 1391, 539, -471, -5201, -25, 6911, -2142, 10454, 10963, 1353, -2831, -3219, -131, -3005, -4468, - 3476, 4986, 6318, -2959, -9204, -87, 3906, -833, -247, 5687, 451, 716, -2970, -5788, -6743, -9436, - 4831, 6767, 3852, 2164, -1362, -1404, -3260, -4807, 2809, -2699, -4693, 21984, 10803, 4063, 2353, 6177, - -2813, -890, -5363, -165, -5755, -20361, 3639, 4639, -2073, 1798, -1097, -6169, 30, -1827, -4590, -2586, - -5855, -6418, -10115, -6038, 2674, 3620, 1206, 1379, -520, 5333, 5334, 3618, 439, -1048, 439, 777, - -7871, 2657, -3649, 7671, 10875, 5285, 423, 1869, -2283, -6081, -2750, -3935, -1815, 2851, 754, -2545, - -2253, -245, 87, 3432, 4323, 803, -3981, -8416, -12174, 6263, 9281, 7472, 2558, 327, -3198, -1436, - -1398, -211, -6595, 4670, 63, 2041, -4372, 967, 2444, -9123, -11355, 1727, -4221, -3144, 6411, 4338, - -4409, -3256, -6504, 6064, 4055, -2268, 5638, 5466, 82, -516, 6974, 5206, 1235, -364, -4919, -6016, - 2, 7, -5, 5, 1, 2, -8, 4, 4, 2, 4, 5, 0, -1, -3, 1, - -1139, 1101, -1501, -3122, 2059, 9130, 5593, -2976, -5845, -8198, 10800, 771, -4815, 20594, 5385, 9434, - -497, 877, -5365, -1190, -2940, -6216, 4700, 872, -2276, 9901, 5530, 417, -4381, -9743, -1935, -1025, - -3555, -643, -5254, -6674, -6586, -4879, -3791, -2733, 1046, 2275, 3157, 3643, 8384, 10607, 11929, 9237, - 1573, 3323, 130, 12128, 9521, 6522, 4035, -1444, -7190, 565, 2160, -2808, -3716, -9398, -1115, 4631, - -1938, -2034, -5142, 6407, 5972, 302, -3078, -7362, -12229, 6591, 5640, 1240, 2727, 3243, 9738, 7334, - -8793, 935, -4176, 103, 2398, 1724, 1579, 7649, 5685, 2791, 1754, -453, -5030, -4870, -3871, -3139, - -243, 3111, -2068, 3022, -4587, -11340, 14571, 7771, 3558, 5750, 1203, 4665, -1981, -109, 4442, 1369, - -2041, 3713, 1013, 1345, 4716, 129, 3062, 1444, -3639, -6184, 7457, 7819, 958, -8391, -8799, 9312, - 235, 3895, 12172, 2716, -1347, -1094, -4869, -880, 7519, 9011, 9914, 5683, 5909, 7805, 4428, 2129, - -1538, -36, -678, 1486, -649, 1517, -5121, 8530, 5048, -1844, -4781, -9145, -11353, -8076, -4133, -307, - -2707, 80, -5905, -4315, -4389, -6758, -6105, -9003, -10744, -1701, 3765, 6091, 10523, 7504, 4350, 4312, - 786, 3663, 9280, 6578, 391, 1514, -7019, 5089, 3483, -6871, -8172, -180, -7469, 1419, -121, 838, - 2692, 6995, 1431, -1074, 1394, -268, -1170, -3367, -7586, -5698, 7587, 7378, 5733, 8353, 10152, 10834, - -8158, -6271, -9914, 9985, 5364, -2601, -1959, -6260, -4097, 3235, 2097, -196, 2968, 3371, 2095, -1207, - -2269, 648, -1910, 7766, 5356, 3667, 981, 2825, 4288, 6668, 696, -661, 4042, -5356, -12858, -3646, - -4703, -3239, 10100, -2312, -256, -2120, -2612, 4835, -1675, 1068, 5746, -140, -869, 3620, 3505, 1703, - -3250, -2423, -1423, -674, -4843, 10905, 4109, 635, -1606, -6241, -2449, 3295, 6275, 14389, 8002, 4352, - -842, 3170, 1430, 1513, -4583, -12820, 1470, -4220, -8952, 6987, 4718, 532, -2136, -3700, -1727, 4512, - -3663, -2257, -8998, 5471, 843, -2858, -4142, 5134, 7250, 525, 3002, 118, 423, 6929, 5389, -1003, - -3457, -2564, 4399, 5758, -1462, 9992, 2582, 885, 6350, -670, -4446, -5882, -1814, -1178, -3073, 1157, - 2529, 7505, 5440, 202, -5746, -976, 8235, 1049, -181, -142, -6919, -6675, 18283, 16554, 8385, 3001, - 2266, 12753, -3253, -3832, -7200, -5627, -4778, -925, 239, 539, 2225, 324, 3182, 1914, -309, -507, - 5074, 4381, 9167, 1915, -3908, 1754, -5997, 2537, 17796, 13293, 7314, 12286, 1815, -4329, -8064, -20774, - -2484, 4942, 14515, 5406, -2595, -1380, 8417, 5956, 1651, 1559, -1389, 24, -6421, -4047, 2557, -1331, - -3164, 848, 15096, 9663, 6043, 3180, 595, 2733, 830, 1861, 9051, 8435, 8904, 6571, 2208, -762, - -135, 870, -2484, -3227, -9497, -586, 14177, 5880, -3708, 505, -1483, -415, 2507, -1973, -13853, -8468, - -3854, -2420, -9258, -4766, -3435, -2360, 10467, 7572, 598, -4099, 3457, 402, -195, 4193, 2023, 1851, - -4359, -3760, -1315, -585, 11411, 2958, 5446, 1608, 228, 4691, 1446, -1971, -3898, -3822, -1651, -1697, - 5112, 1738, -12375, 11069, 8416, -139, -721, 740, -8678, -7527, 10378, 4791, 5388, 2724, 4652, 1931, - -1419, 520, -6325, 10393, 8379, 2544, -2104, -11110, 7461, 2884, -1766, 548, -217, -2709, -1287, -2598, - 1996, 4969, 3862, 5813, -629, -7138, 7107, 9009, 5157, 1564, 5244, 1326, 78, 263, -4389, -5858, - -5423, -34, 1648, 2316, -3981, -5525, -1762, -996, 2075, 878, 718, 1458, 613, 3914, 3912, 2074, - -1176, 643, -3222, -444, 779, 9634, 14238, 11755, 3727, 1970, -1421, 3653, 1795, -2315, 10947, 8623, - 19, 6095, 3277, 2648, 2148, 509, 3577, 978, 1862, 5842, 1302, -3853, -10993, -12406, 858, 7763, - -4944, -1993, -5563, 833, -1365, -2240, -25, 2546, 10150, 10369, 10670, 10551, 9322, 5582, 881, -1029, - -763, 4474, 9314, 8818, 2703, 4844, 7776, 1684, 1, -3980, -9739, 5565, 2667, 1185, 2203, 1611, - -635, 724, -4112, 8414, 3049, 1437, 2314, -2611, -5835, 5541, -3027, 1017, 14246, 10165, 9910, 14393, - 2201, 3204, -295, 2519, -855, 5303, -2184, -12725, 10839, 1337, 154, -5290, -7908, 9490, 4292, 5533, - 544, 3574, 602, -783, -3121, 21721, 8166, -1137, 4729, -2399, 2504, 3721, -2704, -10309, 4957, 8028, - 2782, 11109, 5440, 2691, -3942, 3286, 2848, -532, -186, -2661, 7318, 6015, -1200, 2174, 5498, -379, - 4440, 6050, 3576, -819, -3697, 13144, 9664, -2178, 2966, 3302, -623, 10572, 15713, 9000, 2137, -5160, - -1593, 613, 3985, -7128, -5989, 2429, 721, -5488, -11848, 981, -3054, -4499, -4102, -7743, -7416, -340, - -2759, -2449, -4426, -6796, -13804, -7472, -1409, -1103, 181, 3071, 434, -741, 1045, 1976, 1407, 1365, - -2578, -1275, 5323, 9313, 4798, -1130, -6220, -2101, -3402, -868, -1959, -4365, -4536, -1626, -3701, -5011, - -3479, -3407, -9706, 4812, -812, -4014, 2558, -5416, -10543, -5186, -3840, 1189, 3804, 5839, 4744, 1003, - -3585, -2339, -4745, 3869, -2763, 1306, -6059, -8604, -1377, -5116, -730, -1693, -3321, 888, -685, 876, - -3492, 910, -7012, -2555, -5147, -1372, -1910, -8518, 2661, 7652, 6967, 7296, 4514, -4741, -9827, 873, - -1258, 4649, 3654, 653, -5264, -5509, -4222, 1703, 3992, -5102, -4342, -6447, 6603, 2642, -923, 6242, - -992, 647, 1228, -3124, -3463, 15067, 838, -6186, -3433, 872, 97, 2876, 3686, -2643, -6780, 356, - -1727, 2555, 2552, -1938, -8798, -773, -757, -3588, -7005, -6121, 4601, 235, -4446, 2984, 1353, -776, - -15055, -12154, -6273, 84, 390, -3286, -4758, -3713, -2185, -1512, 1403, 3479, 7578, 6327, 5045, 3075, - 2469, 8960, 6679, 3813, 1059, 9183, 2971, 4300, -1040, -927, -2376, -6240, -5131, -6030, -7385, -7560, - 933, 4512, -899, -1226, -7230, -10649, 11249, 4655, -7924, -5423, -5107, 993, 588, 2896, 4305, 1369, - -1938, 11282, -2696, -7285, 1163, -6289, -344, -2329, 3632, 2191, -1017, -1404, -2305, -6223, -2822, -1369, - -3688, -918, -3118, 256, -5446, 8638, 6195, 2855, 7432, 6937, 8638, 4020, -3296, -4260, 21, -3914, - 3006, 5845, 16377, 17059, 3579, 103, 204, -563, 1735, 6204, -405, -2618, -7929, -14028, -9415, -5277, - 303, 934, -305, 3211, -2970, 2963, 10231, 2833, 1656, 1162, -4439, 6346, 9314, 7062, -5015, -15980, - -320, 499, -14803, 4610, 2112, -4049, 7242, -245, -3115, 1323, -1276, -4286, -1951, 100, -1389, -1612, - -4391, -2691, -5202, -11000, 373, -2423, 4221, 4146, 1045, 503, -4063, -2244, 2311, 1646, -1779, -3188, - -3374, 346, -3243, -3662, 5971, 5519, 3022, 516, -4538, -6550, -5227, -6165, -4919, -1105, 30, 721, - 2935, 3922, -1041, 4217, 2528, 1985, 661, -824, -10133, -13715, 8714, 2218, 3769, 3384, 1193, -6246, - -5357, -2959, -8106, 5394, 1542, -4964, -7749, -4183, 877, 1146, 8307, 2891, -4905, -5775, 1888, 1442, - -2472, -850, 1278, 1397, -4545, -3625, -11722, 9811, 7790, 7832, 12234, 6079, -2436, -890, -1820, -234, - -3905, -1081, -7818, 2577, -299, 5742, 4982, -1421, 3506, -604, -4944, 2130, 544, 1545, -2399, -3202, - -895, -203, 783, -203, -2734, 10200, 7718, 3943, -6098, 9859, 9374, 6777, 2263, -2089, 866, 3381, - -3828, 1991, -2866, -1612, 747, -3896, 6041, 2875, -5838, -6829, -2319, -1146, -8845, -10612, 3630, 2942, - -509, 5457, 1119, -3222, -3623, -6421, -9746, -8661, 5658, 8283, 8062, 6310, 1787, 454, 1766, 2750, - -1632, 7787, 5349, 243, -1526, 3143, 5218, 10290, 1446, -6324, -3035, -1055, 2974, -7871, 39, 3664, - -769, -9, -8896, 9699, 4546, -1295, 6107, -4534, 3367, 1450, -3607, 8816, 3219, -5601, 1298, 12366, - -7130, -4420, -6848, 3453, 3599, 4371, 609, -6059, 8057, 9067, 2408, -3523, -6908, -6822, -6636, -2017, - -477, 5145, -1462, -475, -2003, -3769, 7781, 4563, 4437, 2134, -2726, 15777, 2839, -1929, 2913, 2174, - 841, 2396, 754, 14163, 4130, -1807, -177, -3884, -6782, 9287, 1864, -599, 5913, -2587, -10749, 5856, - 1304, 7980, -2237, -2092, -4384, -828, 552, -6108, 2193, 10107, 6057, 9885, 13003, 8977, 4006, -926, - -1523, 1282, -1805, -2709, -6024, -7618, -10251, 832, -689, -1488, 1528, -1635, -4512, -3974, 3366, 5884, - -2891, -646, -4227, -16787, 4586, 2689, -48, 1956, -5398, -5693, 4030, 1138, 2292, 2634, 6453, 3271, - -3526, 9059, 2896, 8101, 3313, -270, -1336, -3002, 826, -1572, -3793, -2235, -1597, 272, 910, -778, - -1195, 3634, 1576, 2036, -3675, -10512, -6414, -3268, -9714, -6636, 3287, -947, 6643, 7755, 4317, 2928, - -592, -46, -6118, -3775, 11750, 5301, -2878, -7240, -4674, 1543, -626, -1300, -608, -1661, -4053, -3154, - -2514, -545, 771, 7292, 3641, 749, -1664, -1652, 2686, 8715, 10176, 4547, -6065, -7417, -6454, -4928, - -576, 940, 681, 2977, -2947, -1968, -6468, 10093, 7720, -2235, -3869, -8057, -4152, 7399, 8617, 5658, - -1043, 1637, -3699, -5968, 13092, 1526, 1185, -3128, -2234, 3343, 5773, 9935, 7870, 6240, 3284, 3932, - 377, 5872, 3528, 3824, -852, -1575, -3799, -8401, -5628, -3612, -2451, 1396, 1471, -1669, -579, -384, - -6978, -4522, -6731, -1881, 1485, -73, -38, -3990, 11379, 4104, 1154, 5492, 3709, -645, -641, -750, - -97, 2556, 1619, 3351, 1996, 10845, 8411, 2751, 3099, -165, -6582, -11822, 8128, 7722, 4495, 3322, - 950, 2744, -2039, -3959, -6098, -2113, 4512, -1699, -758, 3243, -4760, 7788, 11837, 5336, 7626, 5509, - -4876, 13906, -3059, 1351, 4037, 2283, 614, -5014, 2149, 613, 744, -4239, -5981, -4296, -1799, -3121, - -2111, 3530, -1221, 1654, 9442, 10361, 6422, 7826, 7510, 7790, 3836, -323, -761, 1652, 330, -386, - -3239, 3070, 7009, -1209, 6710, 213, 5225, 3105, 1173, 842, -1774, -5027, -3901, -1359, -2786, -3513, - 1481, 1904, 7402, 23443, 5946, -3615, -1528, -4317, -2629, 11277, 7171, 5620, 7938, 4715, 3575, -3794, - 2315, 5200, 63, 4010, -400, -2074, 6624, -516, -731, -2133, -10088, 6969, -3380, -7450, -7347, -6915, - -3407, -3447, -1422, -4020, -11809, 3562, 3865, 570, 7656, 6367, 5964, 802, -2306, 5862, 7700, 6476, - -17049, -2577, 3748, -1004, 990, 2569, 4487, 2137, -3540, -3508, 608, -2102, 90, 4634, 3115, 1273, - -1960, -1414, 1516, 9460, 6833, 2088, -3598, -3590, -2554, -1783, 2680, 2127, 939, 8562, 4170, 1914, - 3335, 6241, -2988, 1816, 3233, -951, 587, -5590, -3415, -926, -7987, 8897, 3700, -12712, 5722, 4683, - -756, 1823, 2804, 3392, -2019, 801, -2923, 43, 5720, 2302, 3604, 14791, 4960, -425, -7298, -6606, - 205, 5909, 8599, 4641, -4600, -1580, -4536, -5178, 2346, 6910, 3641, -2630, -6079, 351, 5478, 5524, - 151, 1252, -2569, 6834, 5377, 4284, 450, -1607, 7257, 4429, -2568, 9851, 9183, 2197, 20053, 9155, - -1462, 924, -3196, -3257, -8953, 6147, 6251, -3186, 3285, 3198, 2326, 1225, -8446, -11295, 5393, 10785, - -2381, -2014, -9329, 4719, -880, -2308, -4714, 4429, 3675, -1874, 3253, 9686, 12557, 9338, 4719, 3836, - -3103, 7031, 11258, 6883, 11690, 8131, 3644, -307, -2590, -274, 1004, -1314, -166, 3063, 695, -1815, - -2455, 811, -1161, 2731, 5931, 2352, 3361, -363, -7371, 2805, 4053, 3586, 7364, 242, -1692, 17531, - -4497, -535, 286, 214, 3804, 11412, 4562, -1157, 550, 4841, 1657, -4984, -6307, 1482, 5745, 3540, - -2763, -1313, -1385, 3735, -2423, 5601, 14635, 10815, 9726, 6141, 4010, 3556, -104, -3353, -7143, 7077, - -245, 8209, 15457, 5234, 1860, -2195, -4620, -4895, -4263, -759, 2016, 2664, 3153, 2966, 1601, 30, - -4764, -1351, 3227, 2660, 1556, 198, 5379, 11277, 8580, 6978, 2506, 3310, 13165, 9623, 7120, 1665, - -59, 558, 3194, 1299, -2918, -2455, 3754, -3394, -3634, -2782, -7987, -7903, -7058, -2214, -1060, 2183, - -1954, -186, -11418, -2859, -1110, -2027, -932, -2040, 1282, 174, -161, -2628, -3341, 2675, 4169, 2475, - -5934, -5196, 10580, 9382, 1417, -1362, -2572, -4391, 7418, 4314, 148, 31, -82, 461, -2595, -570, - -3639, -2081, -1014, 4355, 5943, 6217, 2491, -4106, -6520, -4050, -5030, -2053, 6821, 6135, 2456, 1015, - -3447, -1303, -5380, -6759, -3272, -129, -4989, -11231, 5106, 1264, -3433, -3327, -3139, -1282, 1031, 1558, - 4180, 1592, -3435, 2252, -4803, -6443, 8937, 1696, -5599, 9240, 5481, -328, 3197, -4392, -12452, -16482, - -4613, 5693, 11596, -9035, 1399, 1388, 5182, 4750, 958, 310, -866, 829, 5122, 1203, -115, -759, - -3551, -1843, -3272, -1753, -195, 17324, 8182, -502, -2987, -146, -2640, 6865, 6979, -3675, -6047, 12865, - 3739, 8307, 5634, -2783, 96, 1167, -274, -636, -5808, -8880, 835, 6363, 5092, -700, -8229, -7634, - -6799, -5871, 4391, 1265, -1493, 440, -7322, 2387, 1763, -1406, 4030, 8075, 8810, 5655, 1375, 2309, - 3191, 6527, 2671, -128, -5345, 14221, 13006, 1792, -548, -2974, -7549, -3471, 1835, -1490, -3556, -4240, - -3368, -1748, -3945, 8349, 2444, -5349, 5825, 4222, -1891, -3570, -10832, 8764, 2791, 5495, 9332, 5366, - 1020, 5766, -8313, 522, -568, -20, -2169, 3981, 6641, 4235, 1781, -4362, -7143, -3864, -2205, -3217, - -3300, -1346, -1200, 5950, -1315, -285, 2642, -180, 12986, 11560, 5996, 6755, -2578, -1417, 1848, 5560, - 10662, 13080, 11225, 419, -4335, -128, 6716, 1638, -4903, 154, -2404, -4228, 5262, -364, -5170, -12310, - 360, 1588, 2173, 8939, 4304, 7241, 367, -2361, 6569, 837, -4801, 8650, 7208, 5996, 3566, 1112, - -5017, 4300, 2649, 3064, -6110, -14292, 2204, 13008, 5245, 1594, -6536, -11045, 5146, -211, -4067, -11435, - -530, 1840, 187, -12175, 1984, -1576, 3659, 4293, -1971, 8025, 8287, 4420, 3935, 358, -1691, -2707, - -3429, 252, 1235, 3895, 13024, 5900, 317, 1720, 3724, 1510, -3576, -6091, -8218, -3620, -844, -406, - 2105, 7096, 3064, 3952, 2071, -2774, 8459, 1501, -10913, 1387, -405, 12863, 2328, 4475, 3498, -1584, - -3085, -920, -7032, 8494, 2146, 1346, 1867, -404, 1886, -1042, -378, -2121, -10433, -7336, 15525, 9808, - -15685, -7623, 1925, 2963, 4001, -105, 3843, 5498, 4039, 6151, 6044, 3867, 1730, 2971, 1484, -319, - 3080, 9412, -1223, -3973, 4734, 2248, 3127, 1119, -1738, -1669, -1477, -1472, 1412, 1213, 773, 1674, - -730, 2282, 495, 1849, 753, 4313, 2052, 11060, 2638, -4153, 12967, 4232, 1600, 8305, 6247, 4101, - 1078, -516, -6160, -2738, -3949, 549, 2665, 313, -11805, 5780, 13753, 4964, -3343, -3825, 7392, 657, - -3356, -672, 2091, 1930, -1942, -6931, -7983, -7306, 1452, 3417, 9758, 12537, 14305, 11570, 5653, 1593, - 2820, 8229, 5573, 6212, 5169, 4568, 4877, 1219, -5520, -3569, -4997, 3799, -1152, -6233, 13054, 8210, - -1905, -1112, -1728, 19102, 8663, -331, 3226, 1066, -1807, 8189, 5678, 1987, 4661, 3278, 7947, 11458, - -4574, -517, -5124, 4711, -740, 416, 4847, 4427, 11056, 3251, -1915, -3528, -2529, -2213, 1857, 1203, - 316, 3731, 4619, -1294, -3138, -336, 8691, 7311, 3124, 9892, 5880, 614, 1873, 1916, 3856, 3588, - 1323, 8284, 7332, 4197, 626, 4877, 9117, 4163, 1998, 4387, 5489, 4184, 2124, -5170, -10914, 3921, - -1504, 12727, 938, 3478, 1876, -1017, 389, 3233, 8278, 8027, 8392, 12663, 13264, 9858, 5767, 4287, - -4008, 49, -1854, -5454, -9369, 5309, -1597, 6002, 6031, -2543, -4793, -2340, -2559, 229, -983, -2068, - -3514, 815, -7510, -3824, -931, -1573, -1337, -1189, -2019, 245, 4084, 4416, 6165, 7239, 3899, 2461, - -4781, -2173, 17577, 2751, -894, 2264, 1789, -623, 992, -322, -3113, -1854, -1553, 2213, 731, 850, - 2054, 3456, 3747, 3842, 980, -940, -5065, -5905, 423, -2009, 74, 3933, 13511, 12742, 8908, 5783, - 894, 6872, -2742, 7127, 5497, -660, -2361, -3114, -5552, -884, -1825, -8536, 4278, 4047, 3263, 2117, - 46, 3829, 3392, 7000, 5004, 11640, 7090, 2661, 2072, 3834, 6408, 9453, 4328, -5807, -11811, -6081, - 1119, 3292, 8329, 5549, -1361, -4414, -15806, 7144, 6824, -4515, -1143, 4774, 1451, 5261, 4830, 5562, - -1393, 5662, 4446, 1807, 8826, 6248, 6415, 4547, -1665, 1181, 6405, 5864, 8293, 10387, 7545, 4688, - 1312, 7883, 6317, -3965, -8535, -2725, 1117, -5447, -7012, 3655, 3196, 4576, 6822, -341, -646, 6098, - -6332, -4527, -5839, 4942, 2805, 6652, 925, -1187, 3859, 4466, 5194, 4814, 7489, 8532, 2922, 2874, - -1137, 1068, 2253, 3741, -2505, 9887, 10247, 3472, 9158, 1176, -2976, 1937, -2064, 7351, 6057, 2696, - 532, 4702, 4601, 502, -1350, -5364, 9112, 2103, -4340, 18, -1329, -2532, 2939, 15707, 4071, -2154, - -628, 13794, -2239, -2982, -3391, -2332, -1483, 5699, 7418, 5487, 5469, 3426, 2471, 2248, -610, -2978, - 4520, 7035, 8360, 8190, 4367, 11231, 9045, 6518, 5468, 6414, -626, -2179, -2327, -6601, -11740, -18010, - 872, 6597, 9823, 6115, 5121, 3028, -3065, 9266, 9664, 2144, 2461, -758, -3373, -348, -421, -2786, - -2998, -2310, 5826, 14327, 10399, 10344, 5906, 4646, 4013, 7488, 6656, 3601, 212, 2499, 812, -4251, - -3455, -259, -2801, -3743, -3930, 4402, 11531, 8368, 3812, 2663, -1885, -3062, -3413, -12432, -6348, -1832, - -2574, 1227, -6578, -7396, -131, 1139, 3464, 2303, 6848, 4302, 422, 1994, 4840, 6023, 4369, 1222, - -5186, -3043, -5221, 9413, 9009, 6329, 6302, 7712, 4428, -1745, -1711, 1216, 1855, 1215, 1003, 58, - 3844, 4380, -2452, 17587, 5229, 106, 3809, 5238, 2909, -6280, 6367, 4649, 3777, 2815, 4377, 9833, - -3469, 6722, -2982, 1867, 2944, 3428, -115, -6063, 4740, 2369, 3681, 2580, 319, 76, 4169, 1079, - 5357, 7937, 8749, 6732, 3237, 475, 10599, 7708, 2300, 9384, 6872, 6516, 11437, 2109, -2788, -10922, - -2925, 1420, 3109, 500, 6953, 1289, -522, 1064, 2885, 6445, 3595, 2000, 2669, 2797, 2174, 873, - 1980, 6159, 1331, 1321, -1922, 6722, 11666, 3321, -1515, 1233, -1664, 9262, 9668, 2502, 13862, 9666, - 3582, 10575, 2715, -603, 596, -1567, 4182, 49, 2208, 1795, 10525, 9472, -2866, -8439, 7591, 11197, - -2356, 153, -10244, -4768, -2178, -2408, 1367, 708, 4615, 9681, 13007, 14875, 15382, 12708, 8355, 5074, - -358, 1803, 1987, 7888, 9168, 16089, 2288, -2716, -1669, 1078, 1165, 5324, 4412, -4354, 298, 6519, - 4826, 9355, 6507, 12087, 4177, -6, 2865, -2898, -5149, 6100, -1829, 80, 12459, 4967, 591, 7846, - -3452, 13887, -142, 4052, 5842, 3702, 4535, 2718, 4976, 3690, 1377, -72, -1938, -836, 961, -1944, - 4315, 5391, 6496, 1795, -2279, 20485, 16142, 9768, 8889, 6390, 1789, 3149, 4186, 487, -922, -2249, - -1225, 14246, 10277, 980, 2427, 180, 5713, 4730, -901, 590, 3351, 1871, 4389, 4760, 8650, 3433, - 1760, 3580, 5798, 6813, 4246, 17695, 7227, 4364, 2222, 13912, 11731, 10965, 14919, 7273, -6023, 6474, -}; - -/*----------------------------------------------------------------------------------* - * LSF quantization - Scaling factors - *----------------------------------------------------------------------------------*/ - -/* Stable ISP vector in Q15 */ -const Word16 stable_ISP_fx[16] = { 32139, 30274, 27247, 23170, 18206, 12540, 6393, 0, -6390, -12537, -18203, -23170, -27243, -30271, -32139, 1475 }; -/* Stable LSP vector in Q15 */ -/* This LSP corresponds to GEWB_Ave_fx Q15*/ -const Word16 stable_LSP_fx[16] = { 32437, 31676, 29486, 25681, 21564, 16413, 10838, 5385, -735, -6405, -11986, -17040, -22052, -26346, -29678, -31784 }; - -/* stable ISF vector */ -const Word16 stable_ISF_fx[M] =/*15Q16*/ -{ 1023, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13311, 14335, 15361, 3978 }; - -/*----------------------------------------------------------------------------------* - * LSF quantization - Mean LSF vectors - *----------------------------------------------------------------------------------*/ -/* These are not used anywhere */ -/* Length 16 vector in Scale = 2.56f */ -const Word16 means_wb_cleanspeech_lsf16k0[16] = { 727, 1426, 2582, 3554, 4548, 5481, 6397, 7293, 8170, 9010, 9972, 11003, 12072, 13034, 14097, 14956 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 means_swb_cleanspeech_lsf25k6[16] = { 786, 1840, 2892, 3833, 4778, 5658, 6641, 7662, 8692, 9630, 10603, 11534, 12489, 13387, 14349, 15217 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 means_swb_cleanspeech_lsf32k0[16] = { 757, 1855, 2862, 3798, 4705, 5661, 6742, 7692, 8658, 9577, 10513, 11401, 12358, 13269, 14275, 15149 }; - - -/* An 16-by-1 matrix */ -const Word16 SVWB2_Ave_fx[16] = { 998, 1488, 2682, 3823, 5084, 6305, 7485, 8686, 9861, 11004, 12339, 13664, 15088, 16330, 17663, 18754 }; // Q2.56 -/* An 16-by-1 matrix */ -const Word16 IANB_Ave_fx[16] = -{ - 726, 1433, 2493, 3408, 4340, 5215, 6103, 6947, 7772, 8536, 9252, 10012, 10909, 12427, 13997, 15193 -}; // Q2.56 -/* An 16-by-1 matrix */ -const Word16 IAWB_Ave_fx[16] = -{ - 577, 1350, 2526, 3535, 4539, 5504, 6497, 7460, 8445, 9396, 10371, 11319, 12307, 13268, 14249, 15207 -}; // Q2.56 -/* An 16-by-1 matrix */ -const Word16 IAWB2_Ave_fx[16] = -{ - 731, 1777, 3194, 4386, 5629, 6806, 8012, 9164, 10329, 11469, 12731, 14037, 15326, 16538, 17801, 18927 -}; // Q2.56 -/* Length 16 vector in Scale = 2.56f */ -const Word16 UVNB_Ave_fx[16] = { 1018, 1764, 2856, 3751, 4611, 5410, 6233, 6961, 7685, 8304, 8859, 9325, 9977, 11741, 13699, 15074 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 UVWB_Ave_fx[16] = { 898, 1900, 3172, 4190, 5181, 6161, 7134, 8066, 8995, 9888, 10784, 11636, 12527, 13396, 14301, 15183 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 SVNB_Ave_fx[16] = { 890, 1268, 1930, 2902, 3938, 4823, 5832, 6644, 7487, 8202, 8906, 9545, 10788, 12565, 13959, 15183 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 SVWB_Ave_fx[16] = { 832, 1248, 1949, 3083, 4131, 5117, 6179, 7067, 8008, 8922, 9875, 10741, 11785, 12860, 13968, 15048 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 GEWB_Ave_fx[16] = { 742, 1350, 2354, 3495, 4446, 5456, 6434, 7331, 8309, 9218, 10145, 11044, 12042, 13063, 14101, 15103 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 GEWB2_Ave_fx[16] = { 909, 1783, 3227, 4443, 5685, 6851, 7996, 9116, 10213, 11263, 12465, 13754, 15090, 16293, 17621, 18695 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 GENB_Ave_fx[16] = { 836, 1344, 2257, 3263, 4173, 5031, 5950, 6707, 7514, 8234, 8881, 9439, 10393, 12226, 13855, 15135 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 TRNB_Ave_fx[16] = { 919, 1335, 2106, 3142, 4092, 4938, 5905, 6670, 7490, 8199, 8868, 9444, 10544, 12383, 13900, 15156 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 TRWB_Ave_fx[16] = { 834, 1326, 2151, 3341, 4305, 5299, 6318, 7198, 8167, 9071, 10001, 10867, 11871, 12912, 13986, 15046 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 TRWB2_Ave_fx[16] = { 945, 1546, 2866, 4150, 5342, 6568, 7660, 8809, 9894, 10934, 12170, 13577, 14981, 16280, 17614, 18778 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 AUNB_Ave_fx[16] = { 887, 1443, 2356, 3194, 4105, 4949, 5841, 6635, 7437, 8181, 8867, 9478, 10385, 12182, 13858, 15131 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 AUWB_Ave_fx[16] = { 810, 1468, 2476, 3417, 4396, 5342, 6311, 7215, 8171, 9078, 10030, 10969, 12014, 13075, 14146, 15133 }; -/* Length 16 vector in Scale = 2.56f */ -const Word16 AUWB2_Ave_fx[16] = { 933, 1745, 3040, 4157, 5379, 6490, 7646, 8725, 9852, 10930, 12214, 13647, 15062, 16297, 17636, 18768 }; - - - - - -/* Length 16 vector in Q = 15 */ -const Word16 Predictor0_fx[16] = { 27361, 27361, 27361, 27197, 27197, 27197, 26378, 26460, 26214, 25985, 26460, 26460, 25985, 25723, 25723, 24740 }; -/* Length 16 vector in Q = 15 */ -const Word16 Predictor1_fx[16] = { 27034, 27034, 27034, 26640, 26313, 26640, 26640, 26132, 26214, 26214, 26460, 26870, 26870, 26706, 27034, 26640 }; -/* Length 16 vector in Q = 15 */ -const Word16 Predictor2_fx[16] = { 24248, 23593, 24510, 24248, 24510, 24019, 24019, 23757, 23757, 24019, 24248, 24248, 23593, 23101, 23593, 23101 }; -/* Length 16 vector in Q = 15 */ -const Word16 Predictor3_fx[16] = { 24248, 24248, 24740, 24248, 24510, 23757, 23429, 23101, 22610, 23101, 23593, 24740, 25002, 24740, 25002, 24838 }; -/* Length 16 vector in Q = 15 */ -const Word16 Predictor4_fx[16] = { 19005, 18350, 19268, 19005, 19268, 18776, 18776, 18514, 18514, 18776, 19005, 19005, 18350, 17859, 17695, 17203 }; -/* Length 16 vector in Q = 15 */ -const Word16 Predictor5_fx[16] = { 23839, 23593, 23593, 23839, 23839, 23593, 23593, 23593, 23839, 24084, 24347, 24576, 24576, 23364, 23364, 23364 }; -/* Length 16 vector in Q = 15 */ -const Word16 Predictor6_fx[16] = { 24084, 23839, 24084, 23593, 23593, 22938, 22381, 21791, 21135, 21955, 22381, 24347, 24576, 23593, 24576, 24347 }; -/* Length 16 vector in Q = 15 */ -const Word16 Predictor7_fx[16] = { 24347, 24084, 24347, 24347, 24347, 24084, 24347, 24576, 24576, 24740, 25068, 24347, 24084, 23839, 23364, 24740 }; -/* Length 16 vector in Q = 15 */ -const Word16 Predictor8_fx[16] = { 24740, 24740, 24740, 24576, 24576, 24576, 24084, 23839, 23593, 23364, 23839, 23839, 23364, 23101, 23101, 22118 }; - -/* An 16-by-16 matrix */ -const Word16 CNG_SN1_fx[256] = -{//Qlog2(2.56) - 600, 1640, 3039, 4257, 5512, 6740, 7989, 9169, 10393, 11612, 12880, 14100, 15378, 16554, 17816, 18918, - 1188, 2487, 3746, 4903, 6103, 7261, 8437, 9587, 10776, 11954, 13172, 14355, 15564, 16712, 17913, 19012, - 346, 799, 2259, 3555, 4876, 6175, 7516, 8803, 10073, 11323, 12631, 13938, 15282, 16553, 17817, 19039, - 439, 1616, 3446, 4743, 6073, 7288, 8553, 9726, 10947, 12106, 13312, 14474, 15650, 16773, 17894, 18977, - 921, 1800, 2976, 4007, 5105, 6137, 7178, 8150, 9057, 9914, 11009, 12545, 13671, 15502, 17428, 18927, - 896, 1899, 3035, 4128, 5301, 6429, 7604, 8719, 9886, 11059, 12417, 13621, 14962, 16135, 17475, 18460, - 722, 1507, 2537, 3437, 4328, 5190, 6018, 6841, 7587, 8343, 8925, 9511, 9919, 11075, 13613, 15021, - 315, 612, 1671, 2910, 3990, 5083, 6120, 7170, 8188, 9173, 10148, 11186, 12250, 13262, 14290, 15284, - 885, 1928, 3010, 3973, 4952, 5900, 6848, 7769, 8701, 9609, 10581, 11540, 12508, 13450, 14412, 15349, - 338, 1020, 2657, 3736, 4839, 5791, 6806, 7760, 8738, 9659, 10627, 11567, 12534, 13468, 14416, 15334, - 1126, 1964, 2999, 3855, 4764, 5608, 6482, 7286, 8109, 8827, 9570, 10649, 11999, 13125, 14223, 15252, - 385, 815, 2000, 2939, 3906, 4879, 5793, 6734, 7661, 8526, 9309, 10146, 11597, 12955, 14106, 15241, - 633, 1445, 2400, 3293, 4235, 5171, 6143, 7084, 8057, 8980, 9924, 10924, 11987, 12998, 14016, 15058, - 584, 1248, 2250, 3131, 4050, 4920, 5811, 6652, 7471, 8244, 8913, 9480, 10188, 12225, 13871, 15123, - 1157, 1820, 2745, 3505, 4354, 5097, 5932, 6648, 7408, 8034, 8635, 9083, 9977, 12228, 13819, 15108, - 572, 1401, 2514, 3501, 4503, 5465, 6469, 7435, 8416, 9328, 10306, 11309, 12328, 13303, 14306, 15261, -}; - -const Word16 SVWB2_SN1_fx[256] = {//Qlog2(2.56) - -257, -385, -673, 926, 1408, 874, 735, 512, 624, 587, 493, 688, 845, 521, 428, 95, - -32, -90, 1046, 666, 329, -59, -324, -282, -712, -783, -229, 28, -354, -434, -497, -351, - 182, 111, 512, 746, 365, 91, -214, -477, -401, -496, -931, -1180, -1422, -1085, -456, -9, - -286, -387, -325, 317, 172, 274, 238, 550, 555, 574, 618, 717, 751, 611, 441, 233, - 96, 178, 203, -112, -464, -591, -212, 124, 32, 192, 244, 94, -41, -293, -507, -649, - -94, -164, 1011, 926, 688, 461, 593, 587, 398, 400, 351, 486, 482, 424, 294, 219, - -260, -356, -458, -252, -162, -350, -394, -255, 30, 173, 90, 64, 93, 157, 66, 2, - 43, 100, -48, -596, -852, -787, -569, -536, -780, -607, -169, -125, -75, 96, 98, 154, - 240, 203, 404, 79, -202, -555, -718, -1023, -1158, -1390, -1537, -774, -478, -173, -63, 272, - -164, -291, -405, 1049, 779, 349, 224, 12, 265, 37, -182, -446, -396, -81, -16, -146, - 75, 45, -248, -832, 729, 416, 499, 178, -115, 16, 79, 243, 265, 77, -69, -43, - 639, 705, 482, -40, -529, -198, -109, -399, -242, -433, -713, -811, -934, -777, -332, 26, - 110, 166, -54, -792, -974, 386, 190, 192, 67, -172, -141, -298, -539, -400, -139, 80, - 147, 307, 168, 52, -285, -270, -212, -179, 138, 200, 194, 64, 476, 673, 636, 500, - 5, 38, -176, 212, 752, 433, 322, 500, 560, 276, 107, -245, -358, -768, -817, -1065, - -233, -294, -581, -1147, -869, 77, 144, 335, 269, 501, 638, 719, 614, 376, 219, 172 -}; - -/* An 16-by-16 matrix */ -const Word16 SVWB2_SN2_fx[256] = {//Qlog2(2.56) - -100, -130, -545, -834, 489, 501, 523, 297, 137, 198, 270, 172, 17, -50, -147, -63, - 333, 351, 143, 142, 47, -137, -131, -323, -216, -32, 105, 264, 541, 425, 342, 153, - -93, -168, 184, 605, 372, 237, 186, 175, 307, 321, 448, 205, -128, -481, -477, -512, - -24, -30, 26, -47, -159, -88, -344, -130, -88, -280, -742, -901, -264, 176, 38, -26, - 258, 250, 114, -75, -186, -326, -360, -237, 268, 532, 236, -341, -556, -334, -181, -30, - 123, 241, 118, 205, 441, 172, 49, -158, -273, -214, -428, -729, -758, -532, -289, -112, - -160, -224, -512, 393, 460, 216, 179, -94, -78, -320, -473, 13, 224, 196, 127, 37, - -35, -65, 360, 164, -185, -563, -683, -357, -634, -61, 400, 133, -232, -264, -174, 32, - -140, -196, -470, -355, -532, -323, -268, -76, 260, 258, 218, 161, 206, 266, 234, 168, - 99, 109, -60, -368, -564, -49, 75, -60, -160, -654, -847, 162, 278, 76, -24, 42, - 12, 88, 124, -54, -91, 197, 289, 211, 240, 184, 10, 16, 560, 677, 619, 350, - -37, -91, 771, 654, 291, 165, 104, 43, -224, -365, -411, -78, -90, -20, 85, 168, - 45, 1, 58, 80, 293, 411, 443, 655, 604, 642, 624, 529, 373, 227, 166, 128, - -176, -124, -182, -131, -260, -127, 350, 460, 425, 260, -76, -400, -605, -506, -121, -49, - -96, -92, -274, -176, -220, -323, -399, -505, -610, -530, 124, 268, 235, 272, 128, 160, - -6, 80, 145, -198, -197, 38, -15, 100, 45, 58, 542, 524, 197, -128, -324, -448 -}; - -/* SVWB2_AR1 * 2.56f */ -const Word16 SVWB2_AR1_fx[128] = {//Qlog2(2.56) - -28, -38, -122, 74, 296, 148, 146, 120, 148, 36, -11, -163, -223, -299, -290, -320, - -22, -30, -138, -319, -385, 159, 124, 51, 32, -44, -15, -78, -96, -53, 40, 64, - -96, -144, -205, -96, 80, 96, 152, 246, 206, 193, 265, 333, 320, 232, 131, 32, - 108, 106, 102, 37, -14, -17, -61, -144, -161, -160, -257, -404, -540, -316, -124, 18, - 22, 12, 34, -14, -52, -106, -144, -266, -346, -472, -401, -30, -4, -43, -88, -10, - -52, -117, -203, 415, 324, 171, 121, -31, 48, -31, -60, -65, 128, 193, 141, 67, - -47, -86, 430, 334, 193, 136, 85, 82, 1, -34, 47, 84, 2, -30, -77, -45, - -4, -14, -9, -38, -136, -242, -217, -54, -38, 179, 191, 61, 42, -3, 5, -37 -}; - -/* SVWB2_AR2 * 2.56f */ -const Word16 SVWB2_AR2_fx[128] = {//Qlog2(2.56) - 12, 16, -46, -156, -329, -293, 43, 141, 61, 15, -9, 29, -74, -41, -37, 16, - -47, -81, -136, 82, -33, -111, -268, -293, 109, 136, 53, -58, -51, 62, 64, 14, - -15, -19, -171, -347, 258, 161, 88, 13, -57, -26, -59, 24, 10, 14, -41, -8, - 33, 38, 139, 157, 31, 65, -14, 52, 63, 30, -8, -1, -182, -341, -344, -258, - 14, 16, 46, 6, -54, -64, -136, -132, -318, -303, 261, 146, -19, -57, -30, 30, - -34, -34, 21, 93, 163, 201, 290, 257, 225, 296, 209, 197, 72, 26, 57, 1, - 33, 66, 73, -8, -104, 44, 31, -13, 70, 72, -17, -48, 430, 373, 218, 92, - 1, -2, 74, 172, 67, -3, -34, -25, -156, -219, -432, -288, -181, -35, 113, 112 -}; - -/*----------------------------------------------------------------------------------* - * LSF quantization - LSF mode/codebook selection tables - *----------------------------------------------------------------------------------*/ -const Word16 CB_lsf[] = -{ - -1, /* Mode 0 : INACTIVE NB, Safety net */ - -1, /* Mode 1 : UNVOICED NB, Safety net */ - 0, /* Mode 2 : VOICED NB, Safety net */ - 2, /* Mode 3 : GENERIC NB, Safety net */ - 2, /* Mode 4 : TRANSITION NB, Safety net */ - 4, /* Mode 5 : AUDIO NB, Safety net */ - -1, /* Mode 6 : INACTIVE WB, Safety net */ - -1, /* Mode 7 : UNVOICED WB, Safety net */ - 5, /* Mode 8 : VOICED WB, Safety net */ - 7, /* Mode 9 : GENERIC WB, Safety net */ - 7, /* Mode 10 : TRANSITION WB, Safety net */ - 9, /* Mode 11 : AUDIO WB, Safety net */ - -1, /* Mode 12 : INACTIVE WB16k, Safety net */ - -1, /* Mode 13 : UNVOICED WB16k, Safety net */ - 14, /* Mode 14 : VOICED WB16k, Safety net */ - -1, /* Mode 15 : GENERIC WB 16k, Safety net */ - 10, /* Mode 16 : TRANSITION WB16k, Safety net */ - -1, /* Mode 17 : AUDIO WB16k, Safety net */ - 13 /* Mode 18 : CNG, Safety net */ -}; // Q0 - -const Word16 CB_p_lsf[] = -{ - 0, /* Mode 0 : INACTIVE NB, Predictive */ - 1, /* Mode 1 : UNVOICED NB, Predictive */ - 4, /* Mode 2 : VOICED NB, Predictive */ - 4, /* Mode 3 : GENERIC NB, Predictive */ - -1, /* Mode 4 : TRANSITION NB, Predictive */ - -1, /* Mode 5 : AUDIO NB, Predictive */ - 0, /* Mode 6 : INACTIVE WB, Predictive */ - 1, /* Mode 7 : UNVOICED WB, Predictive */ - 6, /* Mode 8 : VOICED WB, Predictive */ - 6, /* Mode 9 : GENERIC WB, Predictive */ - -1, /* Mode 10 : TRANSITION WB, Predictive */ - -1, /* Mode 11 : AUDIO WB, Predictive */ - 0, /* Mode 12 : INACTIVE WB16k, Predictive */ - -1, /* Mode 13 : UNVOICED WB16k, Predictive */ - 11, /* Mode 14 : VOICED WB16k, Predictive */ - 8, /* Mode 15 : GENERIC WB16k, Predictive */ - -1, /* Mode 16 : TRANSITION WB16k, Predictive */ - 10, /* Mode 17 : AUDIO WB16k, Predictive */ - 9, /* Mode 18 : GENERIC WB, MA Predictive */ -}; // Q0 - - -const Word16 *const ModeMeans_fx[] = { IANB_Ave_fx, UVNB_Ave_fx, SVNB_Ave_fx, GENB_Ave_fx, TRNB_Ave_fx, AUNB_Ave_fx, IAWB_Ave_fx, UVWB_Ave_fx, - SVWB_Ave_fx, GEWB_Ave_fx, TRWB_Ave_fx, AUWB_Ave_fx, IAWB2_Ave_fx, NULL, SVWB2_Ave_fx, GEWB2_Ave_fx, TRWB2_Ave_fx, AUWB2_Ave_fx -}; //Qlog2(2.56) -const Word16 * const Predictors_fx[] = { Predictor6_fx, NULL, Predictor1_fx, Predictor3_fx, NULL, Predictor6_fx,Predictor5_fx, NULL, Predictor0_fx, - Predictor2_fx, NULL, Predictor5_fx, Predictor7_fx, NULL, Predictor8_fx, Predictor4_fx, NULL, Predictor7_fx -}; // Q15 - -const Word16 CBsizes[] = -{ - 1,2,4,8,16,32,64 -}; // Q0 - - -const Word16 CBbits[] = -{ - -1, /* Mode 0 : INACTIVE NB, Safety net */ - -1, /* Mode 1 : UNVOICED NB, Safety net */ - 4, /* Mode 2 : VOICED NB, Safety net */ - 5, /* Mode 3 : GENERIC NB, Safety net */ - 5, /* Mode 4 : TRANSITION NB, Safety net */ - 4, /* Mode 5 : AUDIO NB, Safety net */ - -1, /* Mode 6 : INACTIVE WB, Safety net */ - -1, /* Mode 7 : UNVOICED WB, Safety net */ - 4, /* Mode 8 : VOICED WB, Safety net */ - 5, /* Mode 9 : GENERIC WB, Safety net */ - 5, /* Mode 10 : TRANSITION WB, Safety net */ - 4, /* Mode 11 : AUDIO WB, Safety net */ - -1, /* Mode 12 : INACTIVE WB16k, Safety net */ - -1, /* Mode 13 : UNVOICED WB16k, Safety net */ - 4, /* Mode 14 : VOICED WB16k, Safety net */ - -1, /* Mode 15 : GENERIC WB16k, Safety net */ - 4, /* Mode 16 : TRANSITION WB16k, Safety net */ - -1, /* Mode 17 : AUDIO WB16k, Safety net */ - 4, /* Mode 18: CNG, Safety net */ -}; // Q0 - - -const Word16 CBbits_p[] = -{ - 5, /* Mode 0 : INACTIVE NB, Predictive */ - 4, /* Mode 1 : UNVOICED NB, Predictive */ - 3, /* Mode 2 : VOICED NB, Predictive */ - 3, /* Mode 3 : GENERIC NB, Predictive */ - -1, /* Mode 4 : TRANSITION NB, Predictive */ - 0, /* Mode 5 : AUDIO NB, Predictive */ - 5, /* Mode 6 : INACTIVE WB, Predictive */ - 4, /* Mode 7 : UNVOICED WB, Predictive */ - 3, /* Mode 8 : VOICED WB, Predictive */ - 3, /* Mode 9 : GENERIC WB, Predictive */ - -1, /* Mode 10 : TRANSITION WB, Predictive */ - 0, /* Mode 11 : AUDIO WB, Predictive */ - 5, /* Mode 12 : INACTIVE WB16k, Predictive */ - -1, /* Mode 13 : UNVOICED WB16k, Predictive */ - 3, /* Mode 14 : VOICED WB16k, Predictive */ - 5, /* Mode 15 : GENERIC WB16k, Predictive */ - -1, /* Mode 16 : TRANSITION WB16k, Predictive */ - 5, /* Mode 17 : AUDIO WB16k, Predictive */ - 5, /* Mode 9 : GENERIC WB, Predictive */ -}; // Q0 - - - -const Word16 BitsVQ[]= -{ - -1, /* Mode 0 : INACTIVE NB, Safety net */ - -1, /* Mode 1 : UNVOICED NB, Safety net */ - 8, /* Mode 2 : VOICED NB, Safety net */ - 9, /* Mode 3 : GENERIC NB, Safety net */ - 9, /* Mode 4 : TRANSITION NB, Safety net */ - 4, /* Mode 5 : AUDIO NB, Safety net */ - -1, /* Mode 6 : INACTIVE WB, Safety net */ - -1, /* Mode 7 : UNVOICED WB, Safety net */ - 8, /* Mode 8 : VOICED WB, Safety net */ - 9, /* Mode 9 : GENERIC WB, Safety net */ - 9, /* Mode 10 : TRANSITION WB, Safety net */ - 4, /* Mode 11 : AUDIO WB, Safety net */ - -1, /* Mode 12 : INACTIVE WB16k, Safety net */ - -1, /* Mode 13 : UNVOICED WB16k, Safety net */ - 8, /* Mode 14 : VOICED WB16k, Safety net */ - -1, /* Mode 15 : GENERIC WB16k, Safety net */ - 8, /* Mode 16 : TRANSITION WB16k, Safety net */ - -1, /* Mode 17 : AUDIO WB16k, Safety net */ - 4, /* Mode 18: CNG, Safety net */ -}; // Q0 - - -const Word16 BitsVQ_p[]= -{ - 5, /* Mode 0 : INACTIVE NB, Predictive */ - 8, /* Mode 1 : UNVOICED NB, Predictive */ - 6, /* Mode 2 : VOICED NB, Predictive */ - 6, /* Mode 3 : GENERIC NB, Predictive */ - -1, /* Mode 4 : TRANSITION NB, Predictive */ - 0, /* Mode 5 : AUDIO NB, Predictive */ - 5, /* Mode 6 : INACTIVE WB, Predictive */ - 12, /* Mode 7 : UNVOICED WB, Predictive */ - 6, /* Mode 8 : VOICED WB, Predictive */ - 6, /* Mode 9 : GENERIC WB, Predictive */ - -1, /* Mode 10 : TRANSITION WB, Predictive */ - 0, /* Mode 11 : AUDIO WB, Predictive */ - 5, /* Mode 12 : INACTIVE WB16k, Predictive */ - -1, /* Mode 13 : UNVOICED WB16k, Predictive */ - 6, /* Mode 14 : VOICED WB16k, Predictive */ - 5, /* Mode 15 : GENERIC WB16k, Predictive */ - -1, /* Mode 16 : TRANSITION WB16k, Predictive */ - 5, /* Mode 17 : AUDIO WB16k, Predictive */ - 5, /* Mode 18 : GENERIC WB, MA Predictive */ -}; // Q0 - - -const Word16 predmode_tab_float[][6] = -{ - {1,1,2,2,0,2}, - {1,1,2,2,0,2}, - {1,-1,2,1,0,1}, - {1,1,2,1,0,1} /* should check how is the cb for audio mode at 13.2*/ -}; - -const Word16 predmode_tab[][6] = -{ - {1,1,2,2,0,2}, - {1,1,2,2,0,2}, - {1,-1,2,1,0,1}, - {1,1,2,1,0,2} /* should check how is the cb for audio mode at 13.2*/ -}; // Q0 - - -const Word16 SVNB_SN1_fx[256] = -{//Qlog2(2.56) - 135, 109, 135, -153, -549, 214, 416, 195, 291, 247, 100, -127, -579, -160, -66, -32, - -107, -150, -274, -149, 642, 594, 338, 183, 81, -31, -14, -150, -387, -40, -44, -18, - 73, 42, 171, 339, 213, 42, -137, -277, -379, -441, -440, -478, 270, 126, -4, 6, - -307, -479, -636, -596, -100, 83, 167, 200, 260, 376, 523, 1051, 1142, 490, 249, 108, - -148, -215, -324, -570, -917, -685, -208, 127, 285, 353, 441, 940, 1100, 458, 229, 100, - 427, 432, 548, 426, 133, 13, -9, -141, -108, -144, -195, -419, -733, -144, -109, -45, - -115, -220, -194, 661, 896, 688, 489, 351, 211, 258, 147, 30, -746, -784, -156, -95, - 16, -48, -88, -430, -798, 36, 204, 68, 174, 162, 20, 61, 627, 266, 102, 48, - -252, -370, -630, -614, 680, 1024, 869, 598, 419, 259, 193, 27, 90, 156, 53, 27, - -48, 33, 26, -227, -556, -766, -391, 231, 413, 282, 226, 89, 194, 187, 44, 30, - -204, -291, -345, -131, 125, 72, 16, -29, -106, -49, -27, 183, 714, 277, 114, 49, - -11, 205, 285, 69, -58, -207, -301, -160, -30, -2, 12, -99, -580, -178, -80, -41, - 120, 189, 281, 427, 234, 138, 124, 126, 50, 205, 121, 76, -797, -1204, -235, -133, - 63, -18, 146, 666, 480, 236, 134, -39, -97, -130, -175, -378, -746, -159, -106, -46, - 386, 399, 415, 157, -175, -282, -315, -318, -222, -225, -267, -342, 317, 152, 15, 14, - 39, 56, 71, -95, -387, -509, -595, -466, -395, -186, -24, 421, 814, 292, 127, 52 -}; - -/* An 16-by-16 matrix in Scale = 2.56f */ -const Word16 SVNB_SN2_fx[256] = -{//Qlog2(2.56) - -16, 111, 111, -89, -115, -404, -514, 162, 277, 41, -94, -89, 15, 31, 2, 2, - -82, -99, -25, -287, -464, 204, 18, -123, -38, 56, 109, 198, 160, 96, 41, 19, - -95, -62, -242, -415, 318, 118, -121, 44, 74, 40, 85, 114, 52, 36, 21, 8, - 29, 40, 43, 23, -202, -149, 288, 149, -20, -109, -186, -275, -127, 18, -25, -6, - 20, 36, -97, -228, 565, 508, 134, 42, -70, -237, -258, -259, -123, -9, -29, -10, - -72, -169, 492, 463, 193, 204, -13, -75, -82, -125, -181, -230, -181, -10, -40, -12, - -108, -221, -229, 648, 575, 288, 146, 1, -14, -4, -51, -120, -81, -14, -17, -5, - -199, -264, -309, 209, 8, -128, 24, -47, 87, 257, 240, 185, 93, 70, 34, 16, - 25, 82, -60, -155, -407, -615, 29, 100, -113, 32, 207, 258, 203, 111, 49, 21, - 37, 127, 95, 4, 112, -45, -217, -158, -277, -407, -304, -152, 72, 52, -6, 0, - -30, -81, -116, -416, -219, 677, 538, 328, 213, 60, -60, -109, -78, 0, -5, 0, - 9, -15, 26, 75, -175, -336, -673, -586, 238, 310, 198, 189, 212, 126, 48, 24, - -18, -4, -80, 102, 130, -116, -268, -471, -567, -104, 205, 221, 143, 81, 29, 12, - 4, 39, 65, 115, 88, 189, 136, 124, 49, 106, 37, 89, -375, -626, -114, -73, - 540, 525, 472, 221, 118, -31, 15, 7, -71, -139, -108, -93, -13, -4, -13, -8, - -44, -44, -143, -272, -525, -365, 479, 502, 312, 225, 161, 72, 28, 42, 26, 12 -}; - -const Word16 GETRNB_SN1_fx[512] = -{//Qlog2(2.56) - -119, -271, -427, 447, 321, 58, 37, -105, -65, 99, 106, 21, -277, 53, 9, -6, - -93, -241, -433, -826, -1028, 17, 180, 138, 320, 234, 152, 235, 973, 594, 199, 96, - -300, -474, -553, -497, -374, -231, -224, -170, -145, 51, 154, 714, 1338, 690, 271, 118, - -115, -228, -248, 9, -27, -196, -240, -269, -293, -310, -276, -254, 769, 481, 117, 59, - 172, 58, 469, 585, 512, 336, 145, -52, -167, -344, -379, -487, 285, 377, 27, 27, - 81, 34, 574, 859, 818, 702, 521, 344, 177, 23, -116, -274, -611, -78, -61, -35, - 76, 19, -104, -388, -687, 54, 279, 144, 237, 223, 110, 9, -335, 4, 3, -10, - 115, 380, 486, 446, 389, 316, 239, 249, 197, 207, 162, 141, -435, -1516, -409, -136, - -146, -348, -425, 645, 998, 790, 609, 468, 282, 287, 153, 87, -461, -592, -88, -64, - -249, -471, -835, -642, 589, 960, 887, 637, 442, 286, 242, 132, 142, 299, 99, 44, - 128, 37, -120, -314, -571, -730, -868, -558, -259, -109, 8, 413, 1145, 593, 210, 92, - 151, 331, 267, 130, -24, -89, -133, -43, -75, 57, 19, 94, -469, -796, -124, -90, - -339, -468, -292, -34, 76, 179, 231, 269, 259, 281, 275, 204, -93, 157, 53, 16, - 33, 176, 25, -201, -311, -497, -509, -242, -47, 6, 86, 48, -165, 176, 24, 8, - 27, 223, 461, 500, 479, 475, 489, 560, 635, 741, 924, 1347, 1546, 806, 277, 54, - 510, 464, 402, 114, -80, -285, -290, -321, -283, -368, -325, -424, 388, 402, 52, 38, - 521, 614, 732, 549, 428, 278, 180, 81, 14, -110, -204, -355, -649, -32, -56, -36, - 72, 26, 262, 263, 159, 113, 60, -10, -73, -121, -201, -329, -768, -61, -60, -39, - 85, 57, 116, -40, -78, -159, -154, -247, -220, -366, -331, -532, -35, 344, 0, 25, - 527, 919, 1339, 1225, 1190, 1023, 774, 577, 393, 160, -4, -184, -281, 29, -21, -12, - -230, -283, -338, -379, -313, -293, -163, -122, 15, 97, 243, 168, 361, 449, 102, 61, - 378, 369, 369, 136, 42, -72, -73, -154, -155, -260, -270, -444, -562, 173, -36, -9, - 168, 108, -36, -347, -559, -436, -254, -263, -236, -227, -247, -238, 796, 488, 123, 62, - -151, -118, 163, 452, 430, 484, 456, 418, 377, 363, 256, 183, -403, -1429, -382, -126, - -204, -366, -652, -512, 428, 353, 182, 88, -10, -94, -54, -11, 801, 527, 151, 76, - 60, 79, -169, -465, -789, -844, -55, 181, 209, 172, 210, 107, 260, 399, 91, 52, - -69, -205, -377, -164, 647, 584, 302, 151, 32, -135, -136, -223, -269, 170, 4, 5, - 38, 418, 885, 979, 990, 1027, 870, 804, 669, 537, 360, 241, -336, -1281, -338, -111, - -420, -700, -912, -622, -337, -51, 67, 173, 326, 554, 766, 1395, 1656, 894, 390, 178, - -141, -252, -507, -822, -1084, -845, -280, 20, 149, 242, 393, 951, 1428, 740, 303, 135, - -120, -37, 31, 105, 72, 99, 53, 117, 59, 171, 120, 177, -414, -993, -160, -98, - -382, -612, -631, -167, 4, 104, 130, 141, 242, 325, 348, 430, 1048, 651, 222, 109 -}; - -/* An 16-by-16 matrix in Scale = 2.56f */ -const Word16 GETRNB_SN2_fx[256] = -{//Qlog2(2.56) - -27, 71, 45, -4, 28, 69, 25, 94, 45, 90, 45, 87, -177, -567, -116, -59, - -208, -147, 531, 399, 199, 113, -21, -28, -34, -38, -48, -46, -47, 18, -1, -1, - 69, -20, -115, -355, -380, 388, 379, 193, 134, 37, -42, -60, -35, 29, 6, 5, - 107, 89, -98, -189, 379, 289, 68, 22, -71, -179, -187, -192, -137, 4, -17, -7, - -44, -81, -371, -448, 226, 75, -52, 43, 40, 36, 79, 120, 130, 76, 36, 15, - 131, 115, 192, 177, 25, -7, -23, -95, -132, -184, -206, -245, -200, -12, -29, -11, - 45, -25, -249, 50, -189, -358, 253, 145, -39, 27, 34, -20, -52, 13, 1, 2, - -254, -155, 23, -89, -30, 23, -23, -21, -45, -86, -92, -109, -48, 52, 3, 3, - -248, -233, 139, 213, 232, 361, 349, 401, 373, 301, 230, 207, 204, 101, 32, 14, - 491, 546, 409, 147, 34, -18, 52, 59, 48, 27, 14, 7, -1, -37, -16, -9, - 36, 41, 0, -21, -29, -64, -207, -346, -516, -355, -64, 73, 156, 94, 30, 11, - -28, -173, -278, 506, 427, 164, 111, 21, -33, -61, -78, -90, -32, 39, 4, 4, - -44, -60, -215, -373, -485, -270, 12, 151, 271, 265, 215, 178, 153, 71, 32, 17, - 110, 155, -29, -259, -218, -183, -175, -132, -85, -98, -87, -93, -77, 0, -9, -4, - -116, -14, 235, 1, -238, -398, -419, -55, 109, 77, 62, 74, 73, 47, 16, 8, - -20, -108, -219, 246, 20, -184, -328, -449, -67, 142, 125, 110, 91, 74, 28, 13 -}; - -/* An 16-by-16 matrix in Scale = 2.56f */ -const Word16 AUNB_SN1_fx[256] = -{//Qlog2(2.56) - -180, -79, -51, 39, 66, 99, 48, 108, 56, 127, 34, 46, -470, -845, -141, -90, - -212, 82, 284, 422, 416, 416, 313, 289, 233, 210, 108, 55, -439, -1323, -336, -123, - -9, 405, 532, 659, 710, 798, 844, 971, 1072, 1181, 1464, 1913, 2028, 1232, 549, 265, - 75, 49, 330, 493, 448, 329, 204, 67, -18, -134, -235, -400, -605, -30, -67, -36, - -9, -7, -95, -222, -322, -421, -321, -233, -110, -86, 67, -19, 3, 345, 41, 30, - 153, 34, -172, -386, -500, -548, -503, -420, -317, -207, -114, 183, 1096, 661, 198, 94, - 616, 501, 471, 220, 157, 55, 4, -161, -178, -314, -267, -389, 216, 429, 46, 38, - -559, -854, -789, -369, -153, 64, 146, 296, 388, 520, 574, 958, 1481, 898, 340, 164, - 131, 137, 116, 57, 64, -21, -38, -112, -123, -199, -214, -379, -641, 83, -53, -21, - -101, -324, -648, -801, -835, -737, -501, -296, -86, 144, 400, 1025, 1501, 861, 322, 151, - -231, -397, -512, -506, -308, -200, -127, -91, -18, 17, 94, 114, 798, 625, 161, 88, - -518, -617, -201, 103, 258, 279, 273, 267, 281, 251, 214, 114, 58, 270, 70, 31, - 17, -86, -78, -82, -22, -73, -171, -299, -334, -431, -422, -526, 517, 511, 71, 53, - 276, 182, -40, -336, -461, -93, 342, 267, 166, 18, -43, -196, -146, 236, 18, 14, - 227, 338, 224, 188, 107, 80, 57, 92, 34, 80, -5, -4, -515, -927, -174, -100, - 731, 744, 797, 675, 590, 438, 328, 215, 144, 24, -96, -239, -486, -175, -65, -41 -}; - -const Word16 SVWB_SN1_fx[256] = -{//Qlog2(2.56) - -71, -61, -170, -563, -962, -845, 186, 421, 282, 344, 260, 155, 186, 52, -18, -11, - -107, -139, -289, -270, 788, 615, 249, 174, -1, -24, 159, 106, -46, -183, -187, -107, - -144, -221, -215, 359, 192, -34, -186, -326, -256, -124, -49, 84, 214, 237, 186, 91, - 218, 332, 335, 41, -191, -394, -614, -543, -415, -379, -285, -153, -86, -101, -69, -13, - 587, 616, 732, 419, 270, 252, 102, 40, 53, -35, -57, -34, 19, -14, -15, -120, - -76, -222, -127, 1216, 1188, 815, 532, 320, 311, 228, 34, -59, -96, -86, -44, -38, - -176, -282, -507, -455, 1122, 1359, 965, 742, 610, 448, 474, 412, 185, 127, 127, -24, - -156, -225, 16, 458, 423, 438, 393, 400, 525, 658, 682, 681, 612, 438, 267, 68, - 89, 120, 172, 355, 195, -8, -22, -67, -110, -40, -93, -163, -382, -685, -926, -468, - -227, -362, -452, -577, -213, -22, 56, 82, 132, 216, 348, 420, 358, 299, 257, 143, - 38, -77, 117, 856, 486, 282, 16, -154, -130, -315, -618, -783, -892, -545, -88, 59, - 218, 324, 232, -162, -583, -552, 126, 62, -40, -27, -227, -348, -334, -324, -238, -65, - 82, 16, -20, -539, -787, 604, 340, 259, 260, -53, -251, -211, -12, 127, 171, 99, - -24, 168, 202, -142, -223, -448, -282, 122, 148, 155, 363, 380, 347, 263, 124, -68, - 165, 150, 226, 95, -172, -257, -413, -510, -533, -734, -1014, -1206, -834, -162, 6, 97, - -78, -72, -81, -322, -605, -731, -740, -564, -356, -219, -151, 11, 200, 237, 212, 170 -}; - -const Word16 SVWB_SN2_fx[256] = -{//Qlog2(2.56) - -126, -152, -342, -423, 311, 95, 3, 29, -93, 4, 227, 193, 142, 120, 93, 62, - 190, 258, 382, 310, 166, -11, -77, -67, -217, -327, -330, -378, -461, -309, -142, -47, - -16, -58, -77, -339, -534, 469, 399, 237, 290, 135, 34, 86, -14, -77, -30, 10, - 13, -4, 644, 572, 412, 438, 272, 286, 234, 177, 118, 147, 131, 138, 127, 38, - -73, -88, -112, 42, 36, 141, 424, 386, 504, 576, 523, 483, 431, 328, 233, 59, - -120, -169, -270, -445, -593, -268, -133, -138, -11, 56, 133, 210, 166, 116, 122, 137, - 282, 370, 255, 76, -89, -191, 139, 80, 12, 176, 185, 145, 244, 253, 173, -18, - 13, 14, -43, 73, -59, -270, -448, -622, -59, 374, 353, 293, 189, -54, -199, -122, - -75, -106, -281, -312, 585, 405, 185, 62, -176, -319, -330, -400, -418, -162, -4, 78, - -31, -11, -79, -83, -88, -274, -343, -431, -623, -518, -148, -11, -17, -21, 21, 90, - -101, -173, -240, 444, 303, 121, 104, -37, 185, 134, -45, -136, -164, 4, 153, 114, - -8, 40, 107, -76, -254, -551, -673, 288, 318, 25, 14, -62, -97, -2, 13, -20, - 87, 127, 80, 216, 336, 147, 188, 165, -10, 125, 193, 87, -126, -396, -736, -669, - 2, 4, 96, 185, 6, 62, -37, -136, -177, -250, -227, 201, 744, 651, 351, 74, - -16, -39, -82, -177, -380, -183, -24, -109, -194, -407, -641, -615, -157, 146, 191, 167, - -21, -12, -39, -63, -159, -128, 20, 6, 16, 39, -60, -243, -594, -733, -364, 46 -}; - -const Word16 GETRWB_SN1_fx[512] = -{//Qlog2(2.56) - -232, -191, 282, 248, 344, 390, 428, 490, 538, 592, 620, 607, 533, 372, 261, 136, - -59, -227, -418, -288, -247, -448, -501, -644, -760, -922, -1112, -1204, -523, -130, 12, 131, - 139, 838, 1402, 1327, 1465, 1391, 1371, 1342, 1220, 1147, 1041, 910, 733, 518, 335, 181, - 211, 148, -94, -275, -484, -586, -541, -634, -583, -511, -424, -322, -285, -299, -194, -87, - 410, 362, 337, 73, -36, -113, -180, -274, -373, -493, -501, -473, -393, -361, -271, -251, - -85, -366, -819, -532, 753, 688, 414, 203, 24, -43, 129, 60, -100, -123, -97, -114, - 4, 37, 484, 514, 340, 225, 89, 59, 40, 3, -5, -1, -11, -49, -43, -48, - -223, -471, -661, -567, -496, -519, -464, -542, -484, -343, -276, -185, -43, 17, 84, 133, - -106, -312, -668, -741, 385, 329, 121, -157, -423, -710, -957, -1280, -1143, -330, -20, 131, - 250, 157, 71, -310, -552, -740, -745, -778, -827, -1064, -1336, -1629, -788, -195, -44, 131, - 140, 633, 970, 864, 867, 761, 683, 648, 572, 544, 516, 469, 383, 238, 143, 55, - 116, 143, 229, 134, -25, -120, -232, -333, -535, -642, -985, -1259, -1873, -1727, -330, -10, - -64, -82, -62, -232, -308, -346, -296, -272, -153, -26, 108, 205, 232, 158, 129, 53, - 82, -92, -309, -791, -1128, -259, -243, -405, -367, -637, -903, -1084, -675, -199, 17, 146, - -247, -569, -886, -758, -334, -206, -158, -150, -64, 57, 190, 252, 261, 210, 163, 129, - -23, -319, -458, 791, 718, 400, 233, -81, -174, -400, -758, -1048, -1338, -1038, -288, -6, - 50, 462, 303, -47, -122, -134, 15, 137, 179, 222, 266, 249, 219, 123, 80, 30, - -116, -332, -650, -1104, -1367, -691, -376, -295, -178, -199, -170, -24, 125, 95, 125, 168, - -66, -314, -526, 325, 156, -56, -114, -287, -126, -185, -292, -298, -189, -81, 1, 23, - 147, -30, -291, -771, -939, 262, 182, 126, 127, -100, -163, -134, -91, -95, -52, -19, - -225, -496, -449, -61, 46, 135, 182, 247, 324, 404, 457, 464, 420, 305, 209, 106, - 418, 312, 415, 74, -156, -345, -400, -634, -769, -1057, -1362, -1841, -1848, -471, -147, 87, - 38, 19, -232, -552, -698, -941, -483, 119, 54, -34, 70, -68, -144, -192, -253, -236, - 80, -30, -214, -157, -292, -312, -283, -347, -384, -372, -487, -503, -746, -950, -1372, -644, - 44, 55, 124, 181, 125, 109, 61, 29, -73, -54, -206, -278, -638, -929, -1563, -1742, - 802, 823, 726, 353, 272, 122, 117, 94, 80, 40, 68, 47, 42, -19, -26, -69, - 50, -97, -306, -666, -918, -1109, -1124, -776, -710, -728, -675, -486, -150, -3, 93, 160, - 81, -144, -131, 319, 227, -96, -236, -517, -711, -949, -1231, -1644, -1625, -444, -117, 86, - -230, -237, 586, 799, 931, 1023, 1077, 1179, 1133, 1101, 1027, 909, 731, 515, 330, 171, - 448, 632, 1047, 782, 631, 390, 155, -82, -342, -685, -1103, -1520, -1779, -931, -214, 34, - -77, -352, -353, 787, 938, 677, 513, 352, 284, 278, 247, 181, 141, 73, 8, -39, - 54, 42, -67, -298, -465, -593, -533, -547, -626, -741, -977, -1317, -1665, -613, -119, 80 -}; - -const Word16 GETRWB_SN2_fx[256] = -{//Qlog2(2.56) - -202, -246, -356, -356, -232, -164, -79, 4, 78, 130, 152, 165, 170, 141, 90, 70, - 38, 78, -72, -185, -446, -552, 269, 295, 104, 77, -54, -184, -168, -72, -32, -2, - 69, 93, 39, 116, 100, 46, 50, -1, -2, 62, 8, -105, -404, -656, -494, -224, - -285, -305, 263, 97, 29, 33, -24, 54, 35, 25, -4, -6, -30, 13, 20, 21, - -28, -70, -160, 34, 5, -145, -264, -425, -539, -329, -19, 228, 411, 280, 141, 51, - 244, 245, 19, -319, -461, -184, -10, 47, 220, 293, 309, 330, 281, 140, 71, 12, - -128, -251, -374, 424, 279, 68, 35, -68, 13, 45, -6, -41, -73, -17, 8, 27, - -55, -7, 438, 500, 493, 442, 286, 211, 68, -39, -117, -167, -180, -131, -75, -63, - 30, 31, 69, 114, -172, -407, -596, -391, 102, 169, 158, 131, 46, 4, -6, -3, - 69, 76, 33, 238, 164, 119, 160, 165, 273, 342, 383, 419, 456, 378, 262, 96, - -55, 43, -59, -273, -200, -286, -287, -221, -247, -245, -194, -160, -129, -36, -31, 3, - -35, -46, -272, -357, 484, 246, -11, 21, -123, -197, -102, -94, -96, -22, 6, 6, - -117, -188, -252, -227, 0, 460, 506, 526, 501, 389, 250, 131, -28, -32, 24, 17, - 399, 511, 390, 146, 80, -84, -81, -57, -123, -138, -95, -82, -51, -33, -14, -45, - -9, 12, 300, 304, 182, 27, -197, -258, -344, -393, -384, -318, -140, -5, -6, 6, - 64, 25, -7, -256, -306, 381, 243, 96, -17, -190, -285, -246, -65, 48, 37, 29 -}; - -const Word16 AUWB_SN1_fx[256] = -{//Qlog2(2.56) - 328, 137, 358, 330, 184, 145, -60, -294, -555, -784, -945, -872, -601, -337, -155, -33, - 32, -212, -488, -651, -752, -877, -892, -886, -853, -795, -705, -549, -330, -224, -127, -9, - 372, 327, 197, 33, 13, -55, -87, -124, -125, -148, -144, -168, -175, -184, -127, -125, - 752, 727, 623, 519, 449, 350, 309, 289, 272, 252, 185, 124, 118, 35, 22, -20, - 14, 144, 296, 432, 416, 325, 177, 166, 151, 123, 109, 104, 47, -22, -45, -49, - 310, 112, -141, -529, -654, -53, 162, -33, -297, -551, -772, -817, -540, -287, -95, -7, - -158, 241, 443, 543, 559, 579, 566, 606, 610, 622, 602, 578, 485, 331, 197, 104, - -471, -530, 37, 272, 397, 442, 466, 523, 561, 592, 608, 576, 485, 348, 222, 133, - 162, 0, -87, -85, -151, -331, -410, -603, -767, -1030, -1348, -1812, -1735, -678, -284, -6, - -156, 36, 15, 26, 41, 118, 201, 265, 339, 382, 420, 435, 377, 264, 159, 84, - -69, -274, -411, -158, 60, -56, -190, -305, -371, -389, -411, -407, -338, -276, -173, -99, - 0, -26, -196, -379, -369, -327, -193, -148, -77, -10, 63, 98, 98, 49, 40, -5, - -149, -432, -729, -923, -927, -766, -568, -455, -333, -219, -122, -29, 11, 9, 20, 54, - 177, 64, -60, -232, -411, -552, -557, -550, -509, -464, -380, -331, -297, -288, -215, -170, - -16, 439, 971, 1104, 1209, 1323, 1339, 1374, 1317, 1223, 1107, 983, 781, 535, 315, 151, - -432, -727, -686, -340, -156, -40, 18, 102, 169, 257, 306, 335, 296, 213, 137, 97 -}; - -/* An 16-by-16 matrix in Scale = 2.56f */ -const Word16 TRWB2_SN1_fx[256] = -{//Qlog2(2.56) - -74, -384, -764, -964, -1122, -912, -819, -740, -728, -572, -379, -317, -250, -51, -67, 85, - -311, -618, -439, -108, 156, 257, 404, 543, 643, 729, 732, 572, 446, 329, 236, 164, - 523, 1549, 1557, 1476, 1374, 1192, 1068, 923, 901, 788, 717, 401, 262, 6, -100, -368, - -13, -80, -189, -386, -486, -357, -216, -63, 65, 189, 248, 194, 218, 219, 205, 169, - -104, -519, -772, 492, 224, 18, -203, -244, -126, -220, -362, -417, -271, -71, -34, -50, - -202, 124, 811, 975, 1326, 1468, 1613, 1527, 1474, 1366, 1220, 906, 700, 509, 351, 207, - -57, -196, -238, -281, -267, -239, -190, -137, -27, 4, 77, -178, -256, -553, -669, -1105, - -183, -211, 804, 789, 685, 529, 479, 403, 371, 313, 279, 49, -19, -156, -179, -335, - 758, 848, 608, 313, 271, 176, 177, 73, 106, 61, 59, -159, -203, -287, -268, -343, - 199, 70, 95, -29, -245, -411, -745, -1009, -1473, -1921, -2633, -1648, -537, -284, -87, 207, - 82, -217, -460, -646, -718, -821, -983, -1282, -1580, -2108, -1863, -609, -407, -122, -50, 243, - -132, 364, 364, 340, 489, 496, 596, 606, 704, 756, 777, 616, 521, 409, 305, 211, - 123, -189, -91, -306, -319, -407, -600, -679, -911, -855, -566, -249, -65, -1, -65, -25, - 79, -58, -103, -150, -268, -265, -426, -479, -614, -671, -1005, -1378, -2027, -1547, -568, -52, - -275, -669, -1070, -1097, -688, -433, -340, -148, -27, 194, 309, 277, 229, 188, 82, 127, - 397, 1343, 1482, 1729, 1978, 2012, 1969, 1852, 1729, 1574, 1407, 1087, 848, 636, 431, 278 -}; - -/* An 16-by-16 matrix in Scale = 2.56f */ -const Word16 TRWB2_SN2_fx[256] = -{//Qlog2(2.56) - 50, -66, -486, -850, 504, 345, 261, 10, -207, -218, -174, -18, 72, 69, 3, 24, - -171, -439, -632, 390, 143, -89, -292, -314, -227, -157, 33, 181, 185, 204, 128, 167, - 458, 459, 78, -250, -365, -381, -353, -382, -327, -284, -191, -18, 3, 37, 29, 95, - -169, -227, -423, -448, -485, -426, -364, -284, -238, -184, -228, -190, -145, 17, 65, 145, - -4, -120, -170, -333, -677, -782, -719, -391, -112, 232, 464, 392, 275, 215, 121, 139, - -94, -130, 453, 295, -45, -286, -444, -473, -519, -428, -268, -40, -12, 46, 39, 118, - -189, -245, 805, 815, 518, 293, 162, 110, -67, -158, -223, -120, -36, 15, 26, 60, - 23, 130, 107, 0, -31, -66, 33, 22, 101, -10, -32, -232, -281, -590, -672, -1089, - 51, 106, 157, 132, 40, 11, -73, -66, -165, -294, -561, -770, -742, -489, -202, 4, - 25, 230, 286, 179, 75, 18, 15, 24, 109, 187, 310, 334, 328, 291, 237, 212, - -238, -492, -550, 563, 764, 610, 542, 427, 373, 261, 166, 171, 122, 34, -21, -92, - -359, -462, -10, 22, -42, -2, 78, 167, 154, 155, 74, 73, 66, 94, 89, 126, - -5, -110, -374, -546, -386, -136, 95, 305, 437, 570, 615, 558, 463, 335, 209, 151, - 23, 376, 292, 235, 485, 519, 657, 549, 478, 338, 186, 7, -28, -155, -95, -188, - 166, 139, -277, -716, -822, 234, 319, 326, 234, 36, -155, -317, -247, -80, 49, 117, - 431, 853, 745, 512, 325, 139, 83, -31, -25, -47, -17, -12, -24, -43, -5, 13 -}; - -/* An 16-by-16 matrix in Scale = 2.56f */ -const Word16 AUWB2_SN1_fx[256] = -{//Qlog2(2.56) - -107, -446, -835, -1041, -1152, -1161, -1146, -969, -828, -533, -251, -242, -139, 172, 95, 466, - 1052, 1008, 1052, 875, 864, 748, 783, 690, 754, 715, 688, 342, 195, -32, -251, -509, - -311, -170, 366, 632, 748, 863, 983, 1042, 1118, 1188, 1133, 895, 728, 621, 460, 418, - 608, 525, 322, 30, -237, -483, -862, -1178, -1651, -2184, -2770, -1349, -430, -28, 128, 562, - 296, 171, -192, -429, -488, -470, -492, -473, -448, -352, -242, -309, -337, -210, -265, -182, - 831, 703, 456, 217, 165, 65, 17, -53, -67, -78, -38, -222, -340, -329, -349, -391, - 162, -13, -158, -335, -526, -705, -986, -1245, -1640, -2149, -2754, -1344, -372, -12, 134, 564, - -79, -389, -569, -699, -811, -940, -1058, -1299, -1534, -2077, -1953, -507, -216, 143, 191, 607, - -106, -116, -210, -225, -323, -330, -494, -491, -700, -757, -1057, -1424, -2222, -1509, -259, 348, - -366, -748, -1177, -1216, -1017, -698, -444, -154, 10, 285, 361, 284, 255, 359, 187, 365, - 77, 447, 418, 475, 453, 459, 475, 515, 562, 648, 658, 452, 367, 334, 244, 204, - 10, 197, 170, 166, 144, 60, 52, -2, -20, -40, 18, -238, -279, -434, -451, -807, - -460, -713, -547, -153, 64, 243, 386, 492, 620, 752, 759, 536, 445, 324, 151, -32, - -246, -396, -413, -371, -354, -317, -307, -228, -195, -101, -36, -174, -197, -162, -261, -349, - -329, -240, 326, 462, 428, 344, 405, 374, 439, 434, 467, 127, 85, -154, -248, -683, - -12, 15, -222, -227, -31, 124, 200, 294, 357, 541, 607, 459, 376, 352, 282, 283 -}; - -/* An 16-by-32 matrix */ -const Word16 IAA_MA1_fx[512] = -{//Qlog2(2.56) - -175, -490, -520, -631, -645, -614, -610, -548, -503, -432, -353, -301, -238, -141, -67, 26, - 301, 407, 227, 96, -12, -18, -13, 2, 39, 107, 124, 92, 83, 100, 62, 72, - -280, -737, -569, -164, -9, 100, 141, 211, 252, 281, 274, 217, 206, 219, 117, 106, - -266, -753, -841, -587, -487, -345, -263, -167, -114, -30, 8, 32, 34, 61, 55, 104, - -91, -137, -293, -349, -352, -326, -268, -247, -178, -129, -56, -96, -11, 219, 49, 56, - -18, 1, -33, -14, -19, -5, -22, -14, -43, -37, -104, -143, -375, -770, -190, -100, - 72, -22, -121, -220, -320, -378, -500, -587, -729, -795, -1056, -1305, -1691, -1090, -452, -60, - 19, -279, -453, -580, -588, -739, -858, -1044, -1281, -1614, -921, -376, -273, -84, -2, 187, - 853, 759, 591, 376, 260, 122, 39, -71, -133, -184, -209, -297, -299, -171, -124, -83, - 266, 34, -182, -367, -516, -686, -881, -1121, -1414, -1834, -2110, -997, -519, -274, -109, 137, - -2, -8, 42, 91, 172, 211, 298, 336, 433, 409, 546, 1043, 1499, 1038, 410, 189, - 86, 254, 259, 254, 246, 219, 184, 122, 79, 11, -55, -170, -363, -934, -371, -188, - 168, 167, -122, -244, -325, -340, -359, -343, -331, -291, -278, -270, -272, -162, -101, -46, - -244, -459, -367, -340, -295, -220, -173, -107, -22, 53, 103, 293, 1084, 807, 260, 117, - -319, -650, -685, -427, -290, -105, 25, 161, 303, 418, 587, 1074, 1563, 1085, 400, 170, - 146, 257, 282, 295, 303, 294, 297, 262, 237, 193, 92, 341, 1220, 884, 315, 144, - -291, -558, 147, 201, 282, 280, 310, 302, 313, 306, 292, 239, 198, 188, 106, 94, - -11, -8, -156, -204, -231, -250, -265, -289, -269, -316, -322, -450, -488, -676, -778, -973, - -117, -27, 4, 96, 174, 229, 271, 310, 344, 362, 344, 273, 209, 180, 109, 106, - -260, -290, 151, 269, 406, 442, 551, 590, 679, 681, 900, 1293, 1631, 1132, 477, 221, - -37, 374, 394, 414, 419, 395, 345, 313, 282, 255, 211, 126, 84, 51, -10, -53, - 404, 327, 174, 28, -124, -290, -490, -695, -1011, -1111, -529, -288, -183, -69, -7, 142, - 563, 752, 585, 555, 512, 478, 424, 396, 376, 343, 300, 194, 193, 162, 78, 46, - -59, -131, -35, 49, 54, -12, -92, -185, -243, -289, -288, -344, -326, 0, -38, 6, - 496, 582, 564, 514, 521, 490, 486, 436, 432, 320, 456, 1060, 1523, 1058, 419, 194, - 174, 77, 18, -89, -112, -196, -165, -247, -222, -326, -332, -494, 499, 617, 121, 60, - 315, 299, 229, 137, 78, -3, -40, -138, -198, -307, -375, -502, -515, -25, -88, -49, - -232, -29, 353, 399, 485, 487, 523, 526, 556, 559, 520, 415, 328, 283, 187, 166, - 182, 385, 403, 453, 515, 572, 635, 691, 787, 852, 1154, 1483, 1779, 1231, 524, 246, - -273, -492, -185, -97, -52, -51, -17, -27, 13, 20, 45, -20, 52, 244, 58, 56, - 20, -3, -241, -267, -194, -86, 4, 75, 140, 191, 200, 154, 137, 146, 85, 77, - 92, 628, 611, 708, 706, 716, 672, 694, 655, 619, 550, 432, 354, 284, 204, 172 -}; - -/* An 16-by-16 matrix in Scale = 2.56f */ -const Word16 UVD_MA1_fx[256] = -{//Qlog2(2.56) - -301, -503, -426, -187, -131, -64, -45, -20, 11, 56, 63, 90, 110, 175, 97, 33, - 161, 353, 474, 502, 709, 782, 794, 765, 632, 532, 406, 285, 230, 145, 97, 52, - -37, -5, 205, 323, 412, 349, 221, 91, -6, -59, -86, -112, -32, 209, 73, 23, - -273, -615, -820, -794, -834, -838, -822, -819, -751, -701, -641, -562, -391, -271, -184, -63, - 262, 168, 104, -9, -78, -163, -141, -199, -191, -249, -245, -317, -168, 535, 109, 33, - -410, -675, -681, -611, -500, -396, -273, -183, -47, 60, 194, 357, 1044, 1080, 335, 140, - 154, 185, 256, 238, 203, 238, 280, 260, 300, 267, 258, 196, 121, -618, -263, -60, - 345, 705, 859, 786, 743, 584, 425, 267, 168, 105, 74, 28, 119, 267, 105, 39, - -39, -166, -230, -196, -255, -276, -318, -349, -387, -438, -539, -613, -752, -956, -1353, -1628, - 498, 479, 414, 231, 98, 5, -18, -41, -60, -78, -91, -96, -81, 72, 30, -8, - 41, 120, 65, 141, 117, 186, 249, 299, 418, 520, 566, 618, 692, 579, 321, 166, - -236, -278, -69, 13, 113, 362, 445, 539, 503, 387, 269, 172, 120, -21, 1, 4, - -103, -46, -137, -132, -108, -97, -67, -37, -8, 41, 82, 107, 43, -605, -189, -56, - -220, -315, -482, -516, -489, -445, -415, -362, -304, -205, -136, -68, -7, 131, 70, 25, - -10, -121, -210, -237, -224, -302, -246, -310, -271, -343, -285, -364, 28, 703, 135, 54, - 118, 50, -67, -166, -349, -416, -442, -446, -439, -420, -382, -319, -245, -209, -140, -82 -}; - -/* An 16-by-16 matrix in Scale = 2.56f */ -const Word16 UVD_MA2_fx[256] = -{//Qlog2(2.56) - -75, -64, -150, -231, -272, -278, -248, -194, -156, -107, -74, -43, -92, -21, 9, 5, - 393, 275, -12, -156, -208, -215, -162, -132, -115, -109, -94, -85, -104, -10, 5, -1, - -297, -389, -99, -78, -66, -19, -12, 8, 0, -3, -15, -22, -113, -82, -16, 2, - 59, -11, 5, -33, -11, -61, -70, -139, -143, -239, -207, -223, 711, 701, 143, 68, - -195, 406, 222, 49, -6, -23, -6, 9, 0, 13, 26, 49, -44, -129, -18, -7, - 23, -30, -141, 79, -18, -76, -55, -14, 44, 98, 88, 86, -96, -351, -112, -39, - 380, 329, 235, 173, 141, 72, 25, -4, -6, -19, -21, -33, -55, -23, 3, -1, - -81, -210, -284, 158, 396, 290, 163, 59, -25, -22, -10, -6, -46, -32, 9, 5, - 9, 34, -15, 5, 23, -48, -127, -243, -347, -421, -455, -475, -495, -449, -294, -163, - -13, -171, -416, -414, -245, -25, 69, 102, 104, 84, 50, 33, -38, -4, 0, 5, - 50, 118, 68, 37, 147, 319, 371, 355, 291, 204, 130, 81, 21, 46, 36, 22, - -95, -108, 311, 214, -28, -153, -226, -192, -129, -69, -42, -11, -48, -17, 13, 2, - -185, -223, -104, 26, 53, 89, 132, 181, 258, 346, 397, 445, 392, 241, 125, 58, - 83, 33, -9, -81, 40, 99, 56, 8, -51, -85, -106, -124, -196, 5, 5, 0, - 143, 148, 19, -121, -247, -211, -67, 83, 198, 268, 290, 300, 240, 164, 86, 37, - -198, -136, 370, 372, 300, 240, 156, 113, 79, 60, 44, 29, -35, -38, 6, 7 -}; - -/* An 16-by-16 matrix in Scale = 2.56f */ -const Word16 UVWB_MA3_fx[256] = -{//Qlog2(2.56) - -26, 23, 7, -6, -1, 3, 40, 35, -43, -24, 56, 157, 265, 423, 382, 260, - 61, -300, -130, -101, -8, 106, 108, 114, 88, 43, -2, -33, -56, 67, 29, 13, - -31, 47, 45, -121, 46, 22, 111, 233, -256, -252, -123, -71, -31, 54, 56, 33, - 20, -154, 67, 198, -232, -167, -86, -12, 79, 116, 88, 78, 44, 75, 27, -7, - -14, 153, -166, 21, 107, 64, 233, -223, -147, -27, -1, 43, 61, 70, 50, 18, - 3, -115, -8, 143, 192, 193, -124, -195, -198, -162, -75, 14, 45, 83, 79, 49, - 12, -57, 25, -29, -11, 12, -7, -13, -12, 31, 74, 99, -10, -421, -209, -111, - -25, 115, 119, -19, -117, -164, -203, -237, -206, -169, -110, -41, -11, 15, 1, -7, - -13, 170, -143, -128, -224, -94, 1, 96, 144, 102, 29, 2, -37, 46, 7, -12, - -11, 10, -34, 38, 24, 86, 149, 211, 240, 279, 247, 218, 154, 161, 74, 15, - -24, 64, 110, 125, -24, 123, 161, 166, 177, 18, -112, -116, -141, -117, -113, -91, - -4, -20, -17, -11, -27, 13, -15, -40, -58, -157, -252, -283, -288, -186, -162, -112, - -20, 2, 32, 44, -31, -49, 8, 13, 55, -59, -162, -212, -61, 384, 115, 36, - -4, 42, -75, 92, 268, -203, -125, 10, 52, 121, 72, -43, -109, -47, -66, -76, - -39, 76, 268, -254, -28, 87, 2, 91, 85, 68, 89, 96, 42, 90, 39, 4, - 2, 2, -56, 7, 67, -31, -219, -192, -24, 146, 249, 269, 209, 199, 106, 31 -}; - -/* An 16-by-8 matrix in Scale = 2.56f */ -const Word16 GESVNB_AR1_fx[128] = -{//Qlog2(2.56) - -25, -64, -140, -118, 270, 240, 127, 70, 20, -40, -56, -111, -82, 64, 2, 5, - 81, 104, 71, 70, 0, -49, -54, -73, -59, -92, -102, -201, -404, -52, -40, -15, - -112, -217, -251, -202, -34, 57, 58, 62, 79, 127, 177, 306, 524, 315, 112, 53, - 17, -6, 34, 66, 14, -26, -174, -196, -142, -131, -102, -97, 180, 154, 29, 17, - 5, -27, -107, -197, -343, -333, -182, -143, -91, -17, 43, 120, 383, 267, 83, 40, - -1, -15, -35, -56, -169, -145, 86, 101, 77, 48, 29, 78, -9, 68, 15, 9, - 3, 9, 320, 450, 385, 348, 215, 155, 105, 45, -13, -75, -272, -129, -52, -23, - 4, 49, 54, 90, 92, 101, 59, 69, 20, 70, 23, 43, -280, -624, -114, -55 -}; - -/* An 16-by-8 matrix in Scale = 2.56f */ -const Word16 GESVNB_AR2_fx[128] = -{//Qlog2(2.56) - -22, -35, -31, -166, -164, 217, 212, 155, 166, 123, 67, 33, -21, -41, -3, -1, - -14, -20, -16, -70, -77, -53, 23, -7, -98, -123, -99, -49, 357, 114, 36, 19, - -57, -119, -303, -215, -33, -103, -97, -117, -105, -102, -67, -134, -176, 113, 16, 8, - -12, 14, 30, -37, -112, -226, -206, -25, 125, 134, 99, 83, 55, -4, 9, 4, - -19, 23, 171, 57, 13, -15, -26, -42, -65, -69, -77, -169, -351, -105, -49, -21, - -14, -10, 8, 35, 161, 104, -74, -102, -135, -47, 45, 264, 52, -69, -1, -5, - 213, 284, 230, 121, 50, 12, 43, 48, 27, -7, -24, -39, 75, 1, -9, -3, - -75, -137, -89, 275, 164, 65, 125, 91, 86, 91, 56, 10, 9, -10, 0, 0 -}; - -/* An 16-by-8 matrix in Scale = 2.56f */ -const Word16 GESVWB_AR1_fx[128] = -{//Qlog2(2.56) - -3, -16, -31, 2, -81, -123, -226, -260, -196, -122, -20, 78, 178, 145, 84, 46, - 55, 42, 15, 32, -48, -81, -109, -137, -187, -264, -330, -387, -363, -176, -38, 37, - -32, -70, -144, -269, -337, -183, 59, 58, 44, 49, 42, 51, 72, 50, 26, 38, - -18, -58, -79, 125, 352, 291, 180, 118, 72, 25, -23, -82, -185, -167, -33, 6, - -10, 135, 544, 517, 517, 561, 515, 528, 500, 472, 413, 383, 318, 219, 118, 57, - -54, -280, -614, -548, -521, -522, -448, -479, -457, -438, -377, -355, -318, -271, -222, -89, - -62, -96, -86, -10, 104, 155, 120, 112, 190, 264, 291, 272, 232, 166, 95, 27, - 33, 61, 155, 121, 9, -28, 6, 103, 64, 17, 4, -2, -31, -88, -209, -206 -}; - -/* An 16-by-8 matrix in Scale = 2.56f */ -const Word16 GESVWB_AR2_fx[128] = -{//Qlog2(2.56) - -147, -326, -421, -91, -22, -25, -14, -21, 32, 76, 104, 102, 65, 47, 50, 41, - -39, -16, 61, -13, -38, -56, 47, 153, 195, 213, 212, 220, 245, 245, 209, 86, - -34, -73, 82, 387, 199, 71, 56, -18, -33, -56, -88, -79, -5, 59, 55, 29, - -7, -21, -21, -158, -123, 304, 226, 168, 124, 8, -75, -91, -54, -5, 37, 30, - -26, -22, -67, -225, 107, 38, -82, -113, -213, -205, -62, 28, 89, 95, 52, 17, - 227, 404, 325, 134, 45, -16, 3, -15, -55, -65, -55, -54, -18, -8, 1, -14, - 19, 30, 12, 28, 48, 13, 2, -47, -38, 41, 29, -8, -154, -315, -411, -242, - 8, 24, 29, -61, -215, -329, -237, -106, -12, -12, -64, -118, -167, -119, 8, 52 -}; - -/* An 16-by-32 matrix in Scale = 2.56f */ -const Word16 GEWB2_MA1_fx[512] = -{//Qlog2(2.56) - 659, 1694, 1634, 1513, 1305, 1098, 933, 805, 733, 624, 525, 339, 239, 50, -35, -215, - 6, 65, 125, 55, -85, -126, -272, -316, -507, -586, -1010, -1278, -1941, -1910, -426, 78, - 281, 315, 236, -4, -102, -171, -232, -335, -362, -425, -488, -603, -669, -736, -648, -593, - 29, -251, -582, -871, -969, -897, -991, -1077, -1275, -1480, -998, -393, -247, -9, 28, 271, - -60, -361, 401, 552, 236, 35, -196, -215, -496, -683, -911, -820, -576, -299, -240, -141, - 416, 574, 662, 350, 133, -160, -431, -781, -1200, -1652, -2035, -1092, -449, -192, -11, 263, - -206, -609, -931, 28, -229, -358, -543, -462, -377, -360, -336, -251, -105, 35, 26, 80, - 369, 1256, 1380, 1571, 1726, 1727, 1644, 1521, 1350, 1156, 984, 748, 580, 395, 254, 108, - -147, -479, -330, -73, -272, -441, -685, -837, -1139, -1458, -1370, -414, -208, -12, 14, 213, - -50, 100, -82, -253, -7, 119, 294, 392, 494, 578, 589, 523, 462, 383, 300, 249, - -94, -362, -575, -770, -987, -999, -922, -697, -582, -305, -135, -31, -8, 23, -33, 62, - 29, -64, -4, -123, -344, -414, -679, -767, -1152, -1401, -2105, -1905, -582, -300, -64, 223, - 428, 990, 1019, 809, 681, 470, 366, 179, 126, -26, -141, -363, -423, -536, -437, -545, - -133, -357, 364, 241, -39, -227, -334, -305, -426, -292, -102, 87, 159, 182, 160, 190, - 560, 764, 531, 156, 22, -18, 23, -20, 19, 0, 13, -61, -35, -44, -12, -48, - 33, -235, -634, -1093, 136, -31, -68, -285, -529, -535, -462, -249, -95, -53, -116, -61, - -188, -628, -894, 702, 700, 373, 196, 51, 95, -56, -191, -181, -173, -132, -116, -218, - 37, -188, -661, -1087, -1322, -258, -186, -181, -238, -372, -418, -508, -433, -197, -73, 28, - -231, -222, 911, 875, 669, 440, 363, 301, 257, 192, 147, 68, 77, 43, 57, 17, - -4, -187, -356, -410, -569, -499, -584, -568, -660, -703, -965, -1201, -1540, -708, -252, 87, - 220, 64, -67, -357, -572, -744, -913, -1176, -1439, -1894, -2152, -762, -419, -146, -10, 281, - -253, -627, -1075, -1206, -721, -398, -337, -188, -118, 50, 125, 198, 200, 190, 96, 164, - -348, -741, -854, -357, -163, -103, -26, 143, 231, 318, 335, 325, 274, 233, 167, 190, - -143, -256, -191, -280, -250, -191, -82, 37, 126, 102, 67, -130, -202, -430, -495, -810, - 232, 107, -22, -341, -497, -523, -607, -646, -746, -690, -478, -295, -160, -77, -53, -7, - -33, -98, -258, -501, -589, -438, -316, -168, -58, 82, 175, 219, 249, 259, 237, 226, - -393, -665, -19, 185, 249, 266, 378, 468, 499, 508, 464, 388, 310, 238, 186, 145, - -240, -99, 408, 480, 693, 761, 946, 943, 951, 893, 782, 613, 482, 351, 260, 163, - -23, 523, 885, 903, 1172, 1287, 1482, 1491, 1476, 1402, 1240, 1005, 787, 604, 433, 292, - 262, 988, 904, 732, 734, 665, 715, 656, 673, 615, 541, 372, 284, 139, 68, -84, - -119, 446, 1118, 1215, 1372, 1280, 1208, 989, 881, 675, 557, 319, 227, 23, -39, -256, - -102, 178, 379, 252, 365, 319, 455, 377, 413, 278, 225, -36, -67, -351, -375, -772 -}; - -/* An 16-by-32 matrix in Scale = 2.56f */ -const Word16 GEWB_MA1_fx[512] = -{//Qlog2(2.56) - 269, 268, 416, 287, 157, 7, -132, -276, -482, -701, -1025, -1350, -1642, -982, -321, -49, - 237, 949, 1374, 1228, 1337, 1219, 1123, 1016, 852, 752, 664, 559, 448, 306, 194, 83, - -6, -176, -373, -111, -221, -387, -483, -639, -753, -786, -774, -655, -328, -114, -25, 27, - 135, 164, -4, -181, -364, -528, -464, -424, -393, -314, -242, -185, -104, -61, -32, -37, - 15, -218, -322, 668, 597, 343, 196, -5, -46, -159, -359, -524, -629, -548, -308, -95, - 242, 463, 767, 661, 558, 403, 268, 191, 71, -4, -51, -103, -141, -176, -161, -142, - -179, -147, 715, 865, 970, 932, 822, 763, 602, 514, 436, 370, 285, 189, 106, 36, - -49, -227, -589, -933, -1172, -700, -248, -175, -132, -132, -125, -103, -47, -49, -12, 60, - -7, -227, -404, 272, 83, -50, -165, -319, -343, -501, -731, -939, -1013, -607, -202, -2, - -76, -271, -661, -582, 296, 86, -60, -166, -335, -314, -213, -285, -324, -280, -164, -39, - -264, -452, -111, 171, 229, 357, 355, 461, 509, 517, 489, 441, 347, 246, 158, 75, - 67, -49, -340, -546, -758, -919, -876, -727, -658, -567, -492, -400, -234, -140, -63, 36, - -142, 94, 514, 400, 406, 389, 379, 413, 391, 377, 354, 314, 245, 156, 94, 34, - 97, -47, -316, -620, -874, -179, -206, -290, -304, -514, -690, -723, -503, -252, -73, 39, - 485, 674, 532, 195, 38, -60, 17, 52, 63, 74, 85, 62, 35, -10, -22, -51, - -105, -23, 287, 394, 469, 609, 706, 860, 933, 933, 874, 789, 638, 465, 297, 148, - -223, -499, -837, -813, -391, -231, -178, -182, -81, 2, 84, 113, 131, 142, 127, 107, - -64, 269, 879, 849, 1013, 1157, 1250, 1337, 1263, 1176, 1048, 900, 703, 502, 318, 165, - 61, 1, -198, -209, -345, -417, -280, -280, -307, -272, -341, -418, -604, -738, -887, -394, - 45, 77, 124, 152, 99, 43, 20, -4, -91, -85, -192, -280, -544, -754, -1176, -1296, - 173, 69, -49, -226, -344, -479, -489, -618, -727, -909, -1122, -1446, -1292, -492, -205, 10, - -80, -80, 338, 285, 123, 48, -76, -80, -105, -118, -108, -80, -58, -28, -9, -8, - 74, -79, -292, -618, -756, 345, 216, 180, 143, -73, -186, -223, -200, -143, -52, -21, - -253, -519, -578, -188, -96, -35, -7, 27, 133, 218, 258, 258, 231, 180, 120, 70, - 273, 740, 950, 736, 701, 635, 611, 602, 566, 533, 494, 447, 350, 230, 131, 42, - -100, -345, -702, -352, 709, 682, 485, 324, 161, 112, 148, 25, -88, -106, -86, -101, - 307, 265, 253, 65, -63, -75, -169, -282, -390, -501, -550, -532, -406, -296, -186, -132, - -26, 70, 50, -84, -89, 28, 106, 199, 305, 391, 450, 469, 419, 301, 191, 80, - 22, 39, -154, -426, -597, -497, -159, -69, 41, 95, 114, 114, 99, 33, -7, -40, - -162, -356, -511, -461, -475, -513, -477, -485, -395, -249, -136, -71, -4, 33, 54, 64, - -82, -295, -562, 241, 65, -163, -227, -384, -237, -229, -266, -223, -94, 10, 41, 31, - -104, -323, -302, 733, 646, 418, 271, 149, 155, 154, 119, 99, 89, 63, 13, -16 -}; - -/* An 16-by-32 matrix in Scale = 2.56f */ -const Word16 AUWB2_MA1_fx[512] = -{//Qlog2(2.56) - 391, 298, 179, -37, -225, -387, -627, -864, -1216, -1644, -2108, -804, -277, -5, 121, 468, - 351, 213, 141, -75, -130, -164, -332, -410, -524, -573, -575, -474, -331, -103, -22, 201, - 81, 874, 1137, 1223, 1242, 1262, 1238, 1185, 1141, 1085, 993, 733, 570, 424, 256, 145, - -6, -25, -105, -147, -327, -342, -587, -620, -954, -1143, -1878, -2059, -356, -100, 134, 477, - -197, -505, -826, -1043, -863, -485, -296, -103, -6, 178, 269, 245, 231, 320, 243, 413, - -518, -605, 282, 430, 532, 596, 676, 748, 808, 861, 834, 681, 534, 498, 293, 337, - -244, -563, -720, -599, -500, -494, -627, -739, -1028, -1219, -297, 9, 71, 272, 285, 563, - -448, -854, -916, -518, -287, -52, 56, 245, 347, 524, 557, 497, 416, 452, 321, 437, - 150, 113, 28, -26, 1, -80, -177, -226, -193, -156, -62, -227, -240, -383, -535, -809, - -240, -246, -174, -66, 80, 149, 244, 284, 413, 434, 473, 158, 56, -167, -326, -723, - 131, -11, 141, 32, 24, -122, -397, -610, -888, -812, 30, 232, 306, 371, 341, 446, - -158, -545, -529, 151, 142, -101, -426, -716, -1031, -1479, -1550, -352, -132, 145, 187, 517, - 148, -104, -445, -841, -31, 183, -86, -316, -615, -660, -231, 84, 192, 275, 201, 311, - -183, -220, -243, -182, -237, -176, -266, -233, -336, -339, -650, -1019, -1652, -846, -52, 387, - -104, -117, -254, -332, -191, 1, 64, 182, 317, 495, 626, 574, 519, 508, 456, 505, - -151, -237, 492, 479, 273, 139, 36, -60, -119, 74, 174, 188, 298, 366, 347, 478, - 158, 23, -210, -450, -673, -637, -423, -331, -133, 14, 128, 69, 62, 143, 171, 313, - 501, 394, 37, -57, 67, 70, 46, 35, 92, 120, 337, 258, 276, 283, 368, 500, - 42, -157, -398, -600, -742, -780, -781, -980, -1166, -1629, -968, -149, -99, 188, 209, 529, - -240, 190, 465, 543, 575, 565, 605, 596, 653, 599, 583, 279, 203, -51, -186, -589, - 316, 371, 417, 372, 293, 189, 230, 154, 184, 91, 94, -175, -198, -358, -454, -736, - 72, -159, -362, -499, -633, -690, -794, -739, -662, -456, -360, -338, -251, -6, 50, 346, - -202, -332, -428, -462, -508, -440, -552, -647, -885, -1217, -1733, -619, -162, 95, 202, 510, - -91, -391, -709, -884, -1012, -1001, -936, -714, -509, -198, 42, 99, 119, 261, 238, 496, - -370, 92, 476, 604, 681, 762, 826, 893, 934, 1001, 954, 783, 629, 590, 412, 467, - -193, -22, -28, 46, 214, 387, 502, 643, 728, 864, 859, 723, 581, 569, 435, 483, - 223, 291, 633, 508, 350, 141, -156, -476, -930, -1417, -1809, -764, -206, 77, 191, 515, - -475, -791, -417, 75, 201, 343, 408, 549, 612, 707, 686, 572, 463, 457, 321, 373, - 842, 716, 669, 593, 419, 423, 373, 321, 273, 280, 354, 217, 193, 232, 175, 294, - 116, -60, -144, -299, -421, -551, -732, -952, -1203, -1662, -1996, -537, -240, 55, 138, 486, - -323, -665, -686, -214, -201, -260, -373, -329, -333, -165, 66, 96, 175, 310, 291, 486, - -19, 43, 35, 40, 42, 55, 63, 101, 133, 194, 222, 152, 117, 145, 133, 213 -}; - -const Word16 *const Quantizers_fx[] = { SVNB_SN1_fx, SVNB_SN2_fx, GETRNB_SN1_fx, GETRNB_SN2_fx, AUNB_SN1_fx,SVWB_SN1_fx, SVWB_SN2_fx, GETRWB_SN1_fx, - GETRWB_SN2_fx, AUWB_SN1_fx,/* U13, */ - TRWB2_SN1_fx, TRWB2_SN2_fx, AUWB2_SN1_fx, CNG_SN1_fx, SVWB2_SN1_fx, SVWB2_SN2_fx -};//Qlog2(2.56) - -const Word16 *const Quantizers_p_fx[] = { IAA_MA1_fx, UVD_MA1_fx, UVD_MA2_fx, UVWB_MA3_fx, GESVNB_AR1_fx, GESVNB_AR2_fx, GESVWB_AR1_fx, GESVWB_AR2_fx, - GEWB2_MA1_fx,GEWB_MA1_fx, AUWB2_MA1_fx, SVWB2_AR1_fx, SVWB2_AR2_fx -};//Qlog2(2.56) - -const Word16 vals_fx[NO_LEADERS][MAX_NO_VALS] = /*Q1 */ -{ - {2, 0, 0, 0}, - {1, 0, 0, 0}, - {2, 0, 0, 0}, - {4, 0, 0, 0}, - {3, 1, 0, 0}, - {2, 0, 0, 0}, - {4, 2, 0, 0}, - {3, 1, 0, 0}, - {2, 0, 0, 0}, - {4, 2, 0, 0}, - {4, 0, 0, 0}, - {3, 1, 0, 0}, - {5, 1, 0, 0}, - {4, 2, 0, 0}, - {4, 2, 0, 0}, - {6, 2, 0, 0}, - {3, 1, 0, 0}, - {5, 3, 1, 0}, - {4, 2, 0, 0}, - {4, 0, 0, 0}, - {6, 2, 0, 0}, - {3, 1, 0, 0}, - {5, 3, 1, 0}, - {4, 2, 0, 0}, - {4, 2, 0, 0}, - {6, 2, 0, 0}, - {6, 4, 2, 0}, - {3, 1, 0, 0}, - {5, 3, 1, 0}, - {5, 1, 0, 0}, - {7, 1, 0, 0}, - {4, 2, 0, 0}, - {4, 0, 0, 0}, - {6, 2, 0, 0}, - {6, 4, 2, 0}, - {8, 0, 0, 0}, - {3, 1, 0, 0}, - {5, 3, 1, 0}, - {5, 3, 1, 0}, - {7, 3, 1, 0}, - {4, 2, 0, 0}, - {6, 4, 2, 0}, - {6, 4, 2, 0}, - {6, 0, 0, 0}, - {8, 2, 0, 0}, - {3, 0, 0, 0}, - {5, 3, 1, 0}, - {5, 3, 1, 0}, - {7, 3, 1, 0}, -}; - -const Word16 no_vals[NO_LEADERS]= {2,1,2,2,2,2,3,2,1,3,2,2,2,3,3,3,2,3,3,2,3,2,3,2,3,3,4,2,3,2,2,3,2,2,4,2,2,3,3,3,3,4,4,2,3,1,3,3,3}; // Q0 - -const Word16 no_vals_ind[NO_LEADERS][MAX_NO_VALS]= -{ - {2,6,0,0}, - {8,0,0,0}, - {4,4,0,0}, - {1,7,0,0}, - {1,7,0,0}, - {6,2,0,0}, - {1,2,5,0}, - {2,6,0,0}, - {8,0,0,0}, - {1,4,3,0}, - {2,6,0,0}, - {3,5,0,0}, - {1,7,0,0}, - {1,6,1,0}, - {2,2,4,0}, - {1,1,6,0}, - {4,4,0,0}, - {1,1,6,0}, - {2,4,2,0}, - {3,5,0,0}, - {1,3,4,0}, - {5,3,0,0}, - {1,2,5,0}, - {2,6,0,0}, - {3,2,3,0}, - {1,5,2,0}, - {1,1,1,5}, - {6,2,0,0}, - {1,3,4,0}, - {2,6,0,0}, - {1,7,0,0}, - {3,4,1,0}, - {4,4,0,0}, - {1,7,0,0}, - {1,1,3,3}, - {1,7,0,0}, - {7,1,0,0}, - {1,4,3,0}, - {2,1,5,0}, - {1,1,6,0}, - {4,2,2,0}, - {1,1,5,1}, - {1,2,1,4}, - {2,6,0,0}, - {1,2,5,0}, - {8,0,0,0}, - {1,5,2,0}, - {2,2,4,0}, - {1,2,5,0} -}; // Q0 - - -const Word16 C_VQ[LATTICE_DIM+1][LATTICE_DIM+1] = -{ - {1,0,0,0,0,0,0,0,0}, - {1,1,0,0,0,0,0,0,0}, - {1,2,1,0,0,0,0,0,0}, - {1,3,3,1,0,0,0,0,0}, - {1,4,6,4,1,0,0,0,0}, - {1,5,10,10,5,1,0,0,0}, - {1,6,15,20,15,6,1,0,0}, - {1,7,21,35,35,21,7,1,0}, - {1,8,28,56,70,56,28,8,1} -}; - -const Word16 C_VQ_fx[LATTICE_DIM + 1][LATTICE_DIM + 1] = -{ - {1,0,0,0,0,0,0,0,0}, - {1,1,0,0,0,0,0,0,0}, - {1,2,1,0,0,0,0,0,0}, - {1,3,3,1,0,0,0,0,0}, - {1,4,6,4,1,0,0,0,0}, - {1,5,10,10,5,1,0,0,0}, - {1,6,15,20,15,6,1,0,0}, - {1,7,21,35,35,21,7,1,0}, - {1,8,28,56,70,56,28,8,1} -}; // Q0 - -const UWord32 table_no_cv[] = //Q0 -{ - 0, 112, 240, 1360, 1376, 2400, 4192, 5536, 9120, 9376, 18336, 18448, 25616, 26640, 33808, 40528, 40752, - 49712, 56880, 83760, 84208, 88688, 95856, 117360, 124528, 142448, 153200, 155888, 159472, 195312, 198896, 199920, 235760, 236880, - 238928, 274768, 274784, 275808, 311648, 333152, 340320, 367200, 410208, 423648, 423760, 425104, 425232, 446736, 500496, 522000, 0 -}; -//Q0 -const Word32 table_no_cv_fx[] = { 0, 112, 240, 1360, 1376, 2400, 4192, 5536, 9120, 9376, 18336, 18448, 25616, 26640, 33808, 40528, 40752, - 49712, 56880, 83760, 84208, 88688, 95856, 117360, 124528, 142448, 153200, 155888, 159472, 195312, 198896, 199920, - 235760, 236880, 238928, 274768, 274784, 275808, 311648, 333152, 340320, 367200, 410208, 423648,423760, 425104, 425232, 446736, 500496, 522000 - ,0 -}; // Q0 - - -const Word16 pi0[] = -{ - 28,1,70,8,8,28,168,28,1,280,28,56,8,56,420,56, 70, 56,420, 56, 280, 56, 168, 28, 560, 168,336,28,280,28,8, - 280,70, 8, 1120, 8, 8, 280, 168, 56, 420, 336, 840, 28, 168, 1, 168, 420, 168 -}; // Q0 - -const Word16 pl_HQ_fx[] = /* Q1 vectors in first layers */ -{ - 2, 2, 0, 0, 0, 0, 0, 0, /* 112, 4, 28 */ - 1, 1, 1, 1, 1, 1, 1, 1, /* 128, 128, 1 */ - 2, 2, 2, 2, 0, 0, 0, 0, /* 1120, 16, 70 */ - 4, 0, 0, 0, 0, 0, 0, 0, /* 16 , 2, 8 */ - 3, 1, 1, 1, 1, 1, 1, 1, /* 5 */ /* 1024,128, 8 */ - 2, 2, 2, 2, 2, 2, 0, 0, /* 1792, 64, 28 */ - 4, 2, 2, 0, 0, 0, 0, 0, /* 1344, 8, 168 */ - 3, 3, 1, 1, 1, 1, 1, 1, /* 3584, 128, 28*/ - 2, 2, 2, 2, 2, 2, 2, 2, /*256, 256, 1*/ - 4, 2, 2, 2, 2, 0, 0, 0, /* 10 */ /* 8960, 32, 280 */ - 4, 4, 0, 0, 0, 0, 0, 0, /* 112, 4, 28 */ - 3, 3, 3, 1, 1, 1, 1, 1, /* 7168, 128, 56 */ - 5, 1, 1, 1, 1, 1, 1, 1, /* 1024, 128, 8*/ - 4, 2, 2, 2, 2, 2, 2, 0, /* 7168, 128, 56*/ - 4, 4, 2, 2, 0, 0, 0, 0, /* 15 */ /* 6720, 16, 420 */ - 6, 2, 0, 0, 0, 0, 0, 0, /* 224, 4, 56 */ - 3, 3, 3, 3, 1, 1, 1, 1, /* 8960, 128, 70 */ - 5, 3, 1, 1, 1, 1, 1, 1, /* 7168, 128, 56*/ - 4, 4, 2, 2, 2, 2, 0, 0, /* 26880, 64, 420 */ - 4, 4, 4, 0, 0, 0, 0, 0, /*20 */ /* 448, 8, 56 */ - 6, 2, 2, 2, 0, 0, 0, 0, /* 4480, 16, 280 */ - 3, 3, 3, 3, 3, 1, 1, 1, /* 7168, 128, 56 */ - 5, 3, 3, 1, 1, 1, 1, 1, /* 21504, 128, 168 */ - 4, 4, 2, 2, 2, 2, 2, 2, /* 7168, 256, 28 */ - 4, 4, 4, 2, 2, 0, 0, 0, /* 25 */ /* 17920, 32, 560 */ - 6, 2, 2, 2, 2, 2, 0, 0, /* 10752, 64, 168 */ - 6, 4, 2, 0, 0, 0, 0, 0, /* 2688, 8, 336 */ - 3, 3, 3, 3, 3, 3, 1, 1, /* 3584, 128, 28 */ - 5, 3, 3, 3, 1, 1, 1, 1, /* 35840,128,280*/ - 5, 5, 1, 1, 1, 1, 1, 1, /*30 */ /* 3584, 128, 28*/ - 7, 1, 1, 1, 1, 1, 1, 1, /* 1024,128, 8 */ - 4, 4, 4, 2, 2, 2, 2, 0, - 4, 4, 4, 4, 0, 0, 0, 0, - 6, 2, 2, 2, 2, 2, 2, 2, - 6, 4, 2, 2, 2, 0, 0, 0, - 8, 0, 0, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 3, 3, 3, 1, - 5, 3, 3, 3, 3, 1, 1, 1, - 5, 5, 3, 1, 1, 1, 1, 1, - 7, 3, 1, 1, 1, 1, 1, 1, - 4, 4, 4, 4, 2, 2, 0, 0, - 6, 4, 2, 2, 2, 2, 2, 0, - 6, 4, 4, 2, 0, 0, 0, 0, - 6, 6, 0, 0, 0, 0, 0, 0, - 8, 2, 2, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 3, 3, 3, 3, - 5, 3, 3, 3, 3, 3, 1, 1, - 5, 5, 3, 3, 1, 1, 1, 1, - 7, 3, 3, 1, 1, 1, 1, 1 -}; -/*----------------------------------------------------------------------------------* - * LSF quantization for CNG - *----------------------------------------------------------------------------------*/ - -const Word16 cng_sort[] = {/*5f */1,1,0,1,0,0, /* 4f */0,1,0,1,0,0,1,1,1,1}; // Q0 - - -const Word16 perm_MSLVQ[][4] = -{ - /* 5f*/ - {6,11,7,15}, - {6,15,-1,0}, - {5,8,7,15}, - {7,10,-1,0}, - {-1,0,0,0}, - {-1,0,0,0}, - /* 4f */ - {-1,0,0,0}, - {0,9,7,10}, - {-1,0,0,0}, - {7,15,-1,0}, - {-1,0,0,0}, - {-1,0,0,0}, - {6,10,7,11}, - {6,11,7,12}, - {6,11,7,12}, - {6,11,7,12} -}; // Q0 - -const Word16 pl_par[] = /* 1 if even number of signs */ -{ - 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, - 0, -1, 1, 0, 0, 0, 1, -1, 0, 0, - 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, - 0, 0, 0, 0, -1, 1, -1, 1, 0, 0, 0, 0, 0, 1, -1, 1, -1 -}; // Q0 - -const Word16 scales_fx[][6] =//Q11 -{ - {3129, 0, 0, 3138, 0, 0, }, /* 14 */ - {3287, 0, 0, 3138, 0, 0, }, /* 15 */ - {2611, 5034, 0, 3138, 0, 0, }, - {2611, 5034, 0, 3340, 0, 0, }, - {2165, 3674, 5931, 2363, 3809, 6281, }, - {1898, 2986, 4745, 2116, 3668, 7045, }, /* 28 */ /* mode 0 UV WB*/ - {2630, 5480, 0, 2972, 0, 0, }, - {2802, 0, 0, 2869, 5073, 0, }, - {1763, 2546, 3723, 2515, 4559, 21109, }, - {2195, 3961, 7440, 2501, 6017, 21961, }, - {1841, 2902, 1386, 2116, 3762, 22309, }, - {1700, 2710, 1288, 1866, 3246, 20660, }, /* 32 */ /* mode 1 UV NB*/ - - - {3222, 0, 0, 3391, 0, 0, }, - {2537, 4923, 0, 3187, 0, 0, }, - {2161, 3482, 9091, 3391, 0, 0, }, - {2560, 4923, 8462, 2775, 4835, 0, }, - {2163, 3656, 9263, 2699, 5296, 0, }, - {2040, 3082, 6871, 2427, 3637, 5587, }, - {1903, 2841, 6875, 2212, 3484, 5908, }, - {1888, 3058, 6900, 2212, 3484, 5908, }, - {1888, 3058, 6900, 2183, 3469, 6420, }, - {1888, 3058, 6900, 1970, 3174, 8081, }, - {1528, 2269, 5876, 1964, 3033, 8002, }, - {1577, 2445, 5782, 1858, 2871, 4334, }, - - {1532, 2259, 5870, 2421, 1661, 6824, }, /* 34 */ - - {1386, 1972, 4356, 1487, 2216, 4514, }, /* 37 */ /* mode 2 V WB*/ - {3357, 0, 0, 2494, 4426, 0, }, - {2634, 5009, 0, 2888, 0, 0, }, - {2224, 3539, 7696, 2494, 4426, 0, }, - {2120, 3226, 9861, 2494, 4426, 0, }, - {1974, 3140, 10121, 2494, 4426, 0, }, - {1722, 2454, 4059, 2494, 4426, 0, }, - {1839, 2658, 4473, 2490, 5456, 0, }, - {1722, 2533, 4581, 2038, 3394, 5808, }, - - {1427, 2009, 4184, 1915, 3082, 1350, }, - {1370, 1862, 2720, 2017, 1339, 3914, }, /* 37 */ /* mode 3 V NB */ - - {2482, 3885, 0, 0, 0, 0, }, - {3346, 0, 0, 3418, 0, 0, }, - {2638, 4962, 0, 3418, 0, 0, }, - {2482, 3885, 0, 3418, 0, 0, }, - {2218, 3617, 6502, 3418, 0, 0, }, - {2124, 3295, 8659, 3418, 0, 0, }, - {2243, 3398, 5562, 2693, 5132, 0, }, - {1927, 2839, 4549, 2693, 5132, 0, }, - {1860, 2675, 3893, 2703, 5372, 0, }, - {2202, 3619, 1618, 2703, 5372, 0, }, - {2093, 3135, 1554, 2273, 3594, 5313, }, - {2202, 3619, 1618, 2238, 3895, 6173, }, - {1829, 3015, 1382, 2259, 3625, 5820, }, - {1864, 3170, 1403, 2114, 3381, 5147, }, - {1692, 2572, 1294, 2009, 3158, 4540, }, /* 32 (31.995) */ /* G WB*/ - {2425, 3707, 5655, 0, 0, 0, }, - {3299, 0, 0, 3314, 0, 0, }, - {2425, 3707, 5655, 3174, 0, 0, }, - {2425, 3707, 5655, 3314, 0, 0, }, - {2177, 3557, 6113, 3314, 0, 0, }, - {2208, 3738, 6476, 3009, 4606, 0, }, - {2816, 1874, 4264, 3009, 4606, 0, }, - {1966, 2914, 1434, 2683, 4366, 0, }, - {2302, 1626, 3895, 2628, 4714, 0, }, - {2206, 3537, 1571, 2560, 3996, 6105, }, - {1911, 3013, 1403, 2560, 3996, 6105, }, - {1898, 3277, 1380, 2363, 3637, 5845, }, - {2144, 1479, 3656, 2163, 3363, 5532, }, - {1989, 1409, 3090, 2136, 3543, 6003, }, - {1882, 1356, 2800, 2165, 3703, 6285, }, /* 32 (31.987) */ /* G NB*/ - {3312, 0, 0, 3394, 0, 0, }, - {2611, 4706, 0, 3201, 0, 0, }, - {2679, 4821, 0, 2841, 0, 0, }, - {2644, 4952, 0, 2775, 5003, 0, }, - {2210, 3623, 6169, 2841, 0, 0, }, - {2210, 3623, 6169, 2714, 5233, 0, }, - {1837, 2744, 5333, 2191, 3459, 5175, }, - {1837, 2744, 5333, 1923, 2978, 4266, }, - {1853, 2718, 5323, 2271, 1591, 3492, }, - {1561, 2255, 4831, 1923, 2978, 4266, }, - {1626, 2511, 6513, 2271, 1591, 3492, }, /* 33 */ - /* mode 6 T WB */ - {3336, 0, 0, 2439, 4528, 0, }, - {2615, 5237, 0, 2800, 0, 0, }, - {2216, 3607, 8047, 2439, 4528, 0, }, - {2085, 3144, 5751, 2439, 4528, 0, }, - {1933, 3025, 5659, 2439, 4528, 0, }, - {1864, 3572, 6793, 2439, 4528, 0, }, - {1884, 3375, 6283, 1985, 3447, 8096, }, - {1513, 2275, 5517, 1800, 2890, 4721, }, - {1452, 2114, 5564, 1659, 2550, 3736, }, /* 32 */ /* mode 7 T NB */ - - {1552, 2286, 4022, 2497, 4139, 1634,}, - {1432, 2118, 4051, 2497, 4139, 1634, }, /* 32 */ /* mode 8 G 16k */ - - {1487, 2150, 3779, 2775, 1761, 4516, }, - {1386, 2042, 3418, 2775, 1761, 4516, }, /* 33 (32.983) */ /* T 16k */ - - {3371, 0, 0, 2568, 5036, 0, }, - {2198, 3815, 6617, 3437, 0, 0, }, - {2198, 3815, 6617, 2568, 5036, 0, }, - {1948, 3056, 5112, 2570, 6085, 0, }, - {2351, 3770, 1665, 2570, 6085, 0, }, /* 26 */ - {1233, 1780, 2904, 2589, 1565, 4542, }, /* 36 */ /* mode 10 AUDIO_WB 36 + 4 + 1 */ - - {1747, 3623, 9062, 0, 0, 0, }, - {2071, 3406, 9017, 3232, 0, 0, }, - {2071, 3406, 9017, 2462, 4964, 0, }, - {1804, 3314, 8471, 2462, 4964, 0, }, - {1735, 3668, 9146, 2462, 4964, 0, }, /* 27 */ /* AUDIO_NB */ - {1372, 2277, 4893, 2462, 4964, 0, }, /* 28 */ /* AUDIO_NB */ - {2316, 3717, 1630, 2591, 5722, 0, }, - {1167, 1647, 2451, 2380, 3992, 1491, }, /* 36 */ /* mode 12 AUDIO_WB 16k 15-36 + 4 + 1*/ - {2140, 3248, 7688, 3418, 0, 0, }, - {1802, 2621, 5784, 2251, 3553, 0, }, - {1702, 2488, 5994, 2230, 3498, 5077, }, - {1782, 2718, 5951, 2183, 3521, 5480, }, - - {1581, 2298, 4815, 2961, 1933, 4243, }, - - {1436, 2001, 3559, 1939, 2976, 4264, }, - - {1473, 2091, 3484, 2292, 1626, 3473, }, - - {1311, 1810, 3547, 1546, 2232, 3170, }, /* 37 (36.995) */ /* VOICED 16k */ - {2494, 1630, 4676, 2642, 6810, 0, }, - {3256, 1710, 9085, 2247, 6287, 0, }, - - {2036, 5360, 0, 2234, 4573, 7080, }, - {1817, 3222, 7256, 2228, 3742, 6281, }, - {1714, 2535, 3897, 2658, 5728, 0, }, - {2331, 5788, 0, 2265, 5726, 8993, }, - {1927, 3955, 9161, 1395, 2593, 4768, }, - {2769, 8872, 0, 1679, 3164, 8550, }, - {2750, 7387, 0, 1759, 2976, 5304, }, - {2474, 5612, 0, 1554, 2540, 4469, }, - {2300, 5603, 0, 1790, 3068, 5296, }, - {1882, 5061, 0, 1260, 2195, 4293, }, - {3170, 9232, 0, 1690, 4461, 8817, }, - {2492, 5935, 0, 1509, 2492, 3953, }, - - {1999, 4485, 11706, 3084, 1315, 8624, }, - {2267, 5315, 0, 2666, 1237, 1802}, /* CNG */ - -};/* An 6-by-146 matrix in Scale = 2048.00f */ - -const Word16 scales_p_fx[][6] = -{//Q11 - {2998, 4862, 0, 0, 0, 0, }, - {2591, 5251, 0, 3355, 0, 0, }, - {2177, 3488, 5745, 2650, 4819, 0, }, - {2177, 3926, 6273, 2796, 0, 0, }, - {1872, 2892, 4553, 2650, 4819, 0, }, - {1806, 2869, 4919, 2689, 4999, 0, }, - {2777, 1776, 4868, 2191, 3453, 5214, }, - {1733, 2761, 5214, 2204, 3568, 5444, }, - {1731, 2824, 5255, 2087, 3230, 5003, }, - {1548, 2435, 5732, 2220, 3695, 5648, }, - {1546, 2494, 5777, 1933, 2935, 4041, }, - {1483, 2529, 6025, 2570, 1737, 4096, }, - {1407, 2279, 4788, 1747, 2720, 3981, }, - {1327, 2107, 3760, 1749, 2777, 4016, }, - {1327, 2107, 3760, 1407, 2167, 3891, }, /* 39 (38.488) */ /* V WB*/ /* 14 */ - {3303, 0, 0, 0, 0, 0, }, - {2595, 5069, 0, 3316, 0, 0, }, - {2077, 3338, 5046, 2632, 4405, 0, }, - {1829, 2847, 4739, 3000, 4708, 0, }, - {1905, 2869, 4403, 2621, 4616, 0, }, - {1829, 2847, 4739, 2613, 4518, 6111, }, - {1829, 2847, 4739, 2122, 3371, 5061, }, - {1755, 2738, 5046, 2136, 3543, 5376, }, - {1567, 2497, 3181, 2122, 3371, 5061, }, - {1616, 2720, 3383, 2154, 3654, 5542, }, - {1565, 2507, 3185, 1884, 2955, 4168, }, - {1358, 2173, 2535, 2824, 1839, 3996, }, - {1378, 2261, 2675, 2578, 1696, 4002, }, - {1364, 2193, 2558, 1645, 2542, 3541, }, - {1348, 2128, 2486, 1946, 1333, 2927, }, /* 39 (38.512) */ /* V NB*/ /* 29 */ - {3277, 0, 0, 3181, 0, 0, }, - {2322, 4067, 6748, 3181, 0, 0, }, - {2021, 3662, 5446, 3373, 0, 0, }, - {1841, 3281, 5282, 3373, 0, 0, }, - {1632, 2650, 4383, 3373, 0, 0, }, - {1632, 2650, 4383, 2734, 4557, 0, }, - {1518, 2357, 3719, 2734, 4557, 0, }, - {1632, 2650, 4383, 2429, 3957, 0, }, - {1518, 2357, 3719, 2384, 3734, 5671, }, - {1450, 2306, 4000, 2204, 3543, 5687, }, - {1352, 2148, 3217, 2204, 3543, 5687, }, - {1356, 2101, 3183, 2200, 3918, 6189, }, - {1352, 2148, 3217, 2947, 1896, 4364, }, - {1290, 1978, 3117, 2687, 1804, 4520, }, - {1264, 1886, 2963, 2114, 3172, 1548, }, /* 35 (34.994) */ /* G WB*/ /* 44 */ - {3267, 0, 0, 3076, 0, 0, }, - {2300, 3985, 7643, 3076, 0, 0, }, - {2116, 4250, 8886, 2906, 5009, 0, }, - {2017, 3672, 12216, 2623, 4760, 0, }, - {1804, 3289, 14326, 2906, 5009, 0, }, - {1729, 3240, 14377, 2623, 4760, 0, }, - {1616, 3113, 14752, 2623, 4760, 0, }, - {1780, 3168, 14326, 2109, 3592, 6353, }, - {1673, 3056, 14582, 2109, 3592, 6353, }, - {1546, 2830, 14608, 2109, 3592, 6353, }, - {1446, 2693, 14797, 2109, 3592, 6353, }, - {1411, 2654, 14930, 2081, 3840, 6633, }, - {1430, 2611, 14764, 1872, 3170, 4983, }, - {1391, 2693, 14930, 2517, 3779, 1665, }, - {1391, 2693, 14930, 2433, 1581, 4004, }, /* 35 (34.952) */ /* G NB*/ /* 59 */ - - {2070, 3639, 5652, 3305, 0,0,}, - {1747, 2830, 4231, 2550, 5487, 0,}, - {2472, 1593, 4522, 2550, 5487, 0,}, - {2472, 1593, 4522, 2075, 3752, 6253}, - {2472, 1593, 4522, 2908, 1786, 4772,}, - {1075, 1577, 2198, 1669, 2533, 1161}, /* 40 (39.990) */ /* AUDIO_WB */ /* 65 */ - - {2191, 3668, 7993, 3275, 0, 0, }, - {1679, 2492, 4278, 2570, 4690, 0, }, - {1597, 2394, 5110, 2570, 4690, 0, }, - {2202, 1481, 4835, 2273, 4016, 7150, }, - - {1415, 2107, 4786, 2118, 3668, 8200, }, /* 31 */ /*AUDIO_NB */ /* 70 */ - {1374, 2204, 5337, 1956, 3168, 5149, }, /* 32 */ /*AUDIO_NB */ /* 71 */ - {2425, 4336, 1589,3420, 2165, 1380, }, - {1067, 1530, 2116, 1630, 2730, 1110,}, /* 40 */ /* mode AUDIO_WB 16k */ /* 73*/ - - {3439, 0, 0, 2626, 5061, 0, }, - {2228, 3787, 6543, 3455, 0, 0, }, - {2228, 3787, 6543, 2626, 5061, 0, }, - {2306, 3459, 1618, 2626, 5061, 0, }, - {1905, 2830, 1397, 2626, 5061, 0, }, - {2284, 1626, 3793, 2623, 6212, 0, }, - {1720, 2818, 1276, 1638, 2900, 8724, }, /* 36 (35.998) */ /* INACTIVE NB */ - {1640, 2351, 3690, 0, 0, 0, }, - {2230, 3711, 6496, 3434, 0, 0, }, - {2230, 3899, 6597, 3115, 5396, 0, }, - {1731, 2482, 3961, 2689, 4954, 0, }, - {1595, 2243, 3482, 2689, 4954, 0, }, - {1481, 2079, 3408, 2689, 4954, 0, }, - {1829, 1335, 2945, 2204, 1475, 3674, }, /* 36 (35.929) */ /* INACTIVE WB*/ - {2783, 4723, 0, 3418, 0, 0, }, - {2206, 3946, 7262, 3418, 0, 0, }, - {2206, 4162, 7328, 2927, 5552, 0, }, - {1706, 2566, 4311, 2628, 5235, 0, }, - {1589, 2359, 3805, 2628, 5235, 0, }, - {1473, 2183, 3547, 2628, 5235, 0, }, - {1927, 1333, 3205, 1479, 2437, 3973, }, /* 36 (35.915) */ /* INACTIVE 16k*/ - - {2646, 5077, 0, 3156, 0, 0, }, - {2462, 3897, 0, 3156, 0, 0, }, - {2105, 3361, 5028, 3375, 0, 0, }, - {2554, 1798, 4770, 3375, 0, 0, }, - {1767, 2781, 5165, 3375, 0, 0, }, - {1673, 2503, 4116, 2200, 3656, 5597, }, - {1669, 1253, 2623, 2161, 3531, 6046, }, /* 32 (31.990) */ /* UNVOICED NB*/ - - {3164, 0, 0, 3170, 0, 0, }, - {3359, 0, 0, 3170, 0, 0, }, - {2636, 5630, 0, 3170, 0, 0, }, - {2636, 5630, 0, 3387, 0, 0, }, - {2437, 4149, 0, 3387, 0, 0, }, - {1907, 2986, 5018, 2650, 5616, 0, }, - {1796, 2859, 5605, 2214, 3719, 6881, }, /* 28 (27.996) */ /* UNVOICED WB */ - {2316, 3351, 0, 2808, 0, 0, }, - {1913, 2615, 1491, 2370, 3475, 0, }, - {1706, 2380, 1348, 2357, 3455, 0, }, - {1538, 2114, 1225, 2357, 3455, 0, }, - {1452, 2058, 1167, 2171, 3629, 5569, }, - {1528, 2050, 1231, 2056, 3693, 5923, }, - {1522, 2048, 1227, 1917, 3811, 5886, }, - {1587, 1257, 2124, 1630, 2671, 3901, }, /* 39 (38.301) */ /* VOICED 16k */ - {1831, 2742, 5220, 2679, 5327, 0, }, - {1475, 2073, 3273, 3097, 1896, 4377, }, - {1395, 1993, 3377, 2828, 1794, 4360, }, - {1401, 1974, 3359, 2392, 3637, 1612, }, - {1368, 1915, 3176, 2081, 3109, 1458, }, - {1350, 1866, 2918, 2738, 1821, 1315, }, - {1350, 1866, 2918, 1718, 2636, 1243, }, /* 37 (36.989) */ /* GENERIC 16k*/ - {3344, 0, 0, 3455, 0, 0, }, - {2204, 3666, 6025, 3455, 0, 0, }, - {1708, 2517, 3871, 3455, 0, 0, }, - {1921, 2875, 4409, 2675, 5386, 0, }, - {2744, 1815, 4751, 2675, 5386, 0, }, - {1706, 2560, 3908, 2675, 5386, 0, }, - {1706, 2484, 3836, 2304, 3766, 5773, }, - {1567, 2380, 3461, 2097, 3559, 5812, }, - {1485, 2150, 3668, 3031, 1888, 6357, }, - {1458, 2073, 3172, 3060, 1849, 6889, }, - {1350, 1898, 2779, 3060, 1849, 6889, }, - {1683, 1257, 2638, 1864, 3090, 4618, }, - {1722, 1278, 2617, 2378, 1561, 3703, }, - {1716, 1274, 2593, 2212, 1456, 3502, }, - {1704, 1268, 2611, 1921, 2929, 1319, }, /* 37 (36.971) */ /* GENERIC 12.8k MA*/ - {1810, 2763, 5263, 2691, 5343, 0, }, - {1456, 2085, 3308, 3035, 1886, 7027, }, - - {1391, 1995, 3398, 1942, 3172, 7062, }, - - {1702, 1266, 3033, 1911, 3101, 4731, }, - {1671, 1249, 2871, 2920, 1796, 4639, }, - {1612, 2574, 1221, 1759, 2963, 4979, }, - {1612, 2574, 1221, 2265, 1505, 3398}, /* 37 (36.993) */ /* AUDIO 16k */ - -}; - -const Word16 sigma_MSLVQ_fx[][16] = -{//Qlog2(2.56) - {3}, - {3}, - {107, 113, 160, 185, 202, 211, 219, 222, 222, 217, 218, 270, 327, 176, 66, 43}, - {125, 130, 182, 185, 191, 199, 204, 207, 205, 191, 179, 227, 305, 261, 95, 64}, - {123, 123, 176, 197, 207, 218, 228, 235, 232, 218, 209, 272, 342, 216, 89, 68}, - {219, 212, 255, 271, 273, 274, 260, 255, 250, 248, 249, 302, 328, 394, 85, 37}, - {3}, - {3}, - {113, 134, 220, 253, 260, 275, 274, 287, 304, 323, 321, 325, 349, 350, 376, 332}, - {158, 179, 242, 248, 246, 259, 257, 267, 278, 274, 276, 289, 309, 309, 312, 306}, - {146, 146, 222, 256, 261, 278, 290, 302, 318, 313, 323, 352, 394, 407, 415, 399}, - {217, 227, 287, 303, 316, 310, 296, 304, 303, 305, 317, 327, 355, 321, 305, 279}, - {3}, - {3}, - {193, 216, 283, 320, 343, 359, 375, 408, 413, 445, 479, 489, 502, 466, 456, 479}, - {230, 238, 312, 330, 334, 329, 339, 357, 353, 358, 391, 403, 441, 459, 379, 497}, - {231, 277, 304, 322, 347, 353, 366, 372, 373, 397, 438, 451, 424, 413, 381, 447}, - {264, 287, 364, 386, 384, 373, 382, 373, 393, 403, 448, 438, 403, 430, 401, 586}, - {224, 298, 262, 264, 258, 244, 260, 283, 313, 295, 275, 279, 260, 286, 286, 399}, - {411, 314, 301, 332, 335, 343, 356, 409, 430, 413, 363, 364, 338, 332, 315, 412}, - {136, 269, 343, 367, 405, 430, 411, 421, 444, 466, 435, 423, 328, 247, 235, 240}, - {178, 433, 305, 268, 258, 252, 253, 246, 250, 250, 245, 256, 242, 273, 300, 371}, - {349, 334, 335, 341, 336, 331, 343, 425, 505, 722, 783, 655,1006, 862, 346, 248}, - {315, 306, 323, 306, 300, 278, 276, 287, 380, 394, 327, 333, 339, 382, 370, 626}, - {236, 250, 241, 231, 241, 245, 238, 221, 215, 190, 181, 178, 183, 428, 184, 55}, - {113, 189, 360, 312, 332, 326, 296, 268, 272, 282, 320, 275, 219, 203, 179, 143}, - {273, 255, 245, 237, 242, 236, 214, 217, 223, 260, 233, 193, 187, 183, 174, 163}, - {111, 321, 275, 219, 213, 207, 202, 205, 205, 225, 239, 208, 192, 187, 168, 152}, - {383, 326, 300, 287, 290, 292, 276, 251, 258, 291, 430, 521, 397, 305, 274, 269}, - {152, 221, 271, 291, 344, 310, 308, 257, 252, 256, 339, 491, 499, 199, 179, 107}, - {226, 237, 236, 239, 250, 238, 228, 223, 227, 241, 311, 312, 299, 313, 421, 360}, - {221, 238, 214, 220, 246, 244, 232, 221, 210, 208, 200, 229, 368, 431, 106, 71}, - {249, 259, 267, 283, 278, 275, 251, 237, 203, 209, 198, 279, 543, 509, 122, 90}, - {192, 249, 256, 235, 231, 230, 213, 215, 210, 247, 284, 237, 214, 210, 199, 181}, -}; - -/* An 16-by-33 matrix in Scale = 32768.00f */ -const Word16 inv_sigma_MSLVQ_fx[][16] =//Q15 -{ - {32767}, - {32767}, - {783, 746, 523, 453, 416, 397, 384, 378, 378, 386, 384, 310, 256, 477, 1273, 1935}, - {670, 647, 461, 452, 440, 421, 412, 405, 410, 440, 468, 369, 275, 321, 883, 1305}, - {679, 682, 477, 426, 405, 385, 368, 357, 362, 385, 401, 308, 245, 388, 942, 1231}, - {383, 395, 329, 309, 307, 307, 322, 329, 335, 338, 337, 278, 256, 213, 989, 2243}, - {32767}, - {32767}, - {740, 628, 382, 332, 322, 305, 306, 292, 276, 259, 261, 258, 240, 240, 223, 253}, - {530, 469, 346, 338, 341, 323, 326, 314, 302, 306, 304, 290, 271, 272, 269, 274}, - {576, 576, 378, 327, 322, 302, 289, 278, 264, 268, 259, 238, 213, 206, 202, 210}, - {386, 370, 292, 277, 266, 271, 284, 276, 276, 275, 264, 257, 236, 262, 275, 300}, - {32767}, - {32767}, - {435, 389, 296, 262, 244, 233, 223, 205, 203, 188, 175, 172, 167, 180, 184, 175}, - {365, 352, 268, 254, 251, 255, 247, 235, 237, 234, 214, 208, 190, 183, 221, 169}, - {363, 302, 276, 261, 241, 237, 229, 226, 225, 211, 191, 186, 198, 203, 220, 188}, - {318, 292, 230, 218, 218, 225, 219, 225, 213, 208, 187, 192, 208, 195, 209, 143}, - {374, 281, 320, 318, 325, 344, 322, 296, 268, 284, 305, 301, 322, 294, 293, 210}, - {204, 267, 279, 253, 250, 245, 235, 205, 195, 203, 231, 231, 248, 252, 266, 204}, - {616, 312, 245, 229, 207, 195, 204, 199, 189, 180, 193, 198, 256, 340, 356, 349}, - {471, 194, 275, 313, 325, 333, 332, 342, 335, 336, 342, 328, 347, 307, 280, 226}, - {241, 251, 250, 246, 250, 254, 245, 197, 166, 116, 107, 128, 83, 97, 242, 339}, - {266, 274, 259, 274, 279, 302, 304, 292, 221, 213, 257, 252, 247, 219, 227, 134}, - {355, 336, 348, 363, 348, 342, 353, 379, 391, 442, 462, 472, 458, 196, 456,1518}, - {744, 443, 233, 269, 253, 257, 283, 313, 308, 298, 262, 305, 383, 413, 469, 585}, - {308, 330, 343, 353, 347, 356, 392, 387, 376, 322, 359, 435, 448, 458, 482, 514}, - {756, 261, 305, 384, 394, 406, 415, 409, 409, 372, 352, 403, 438, 448, 498, 552}, - {219, 257, 280, 293, 289, 288, 304, 335, 325, 289, 195, 161, 211, 275, 306, 312}, - {550, 380, 309, 288, 244, 271, 272, 326, 332, 328, 248, 171, 168, 421, 468, 781}, - {371, 355, 356, 350, 336, 353, 368, 376, 369, 348, 269, 269, 281, 268, 199, 233}, - {380, 353, 392, 381, 342, 344, 362, 379, 399, 403, 420, 367, 228, 195, 789,1184}, - {337, 324, 314, 297, 301, 305, 335, 354, 414, 401, 425, 301, 154, 165, 690, 927}, - {438, 337, 327, 357, 363, 365, 394, 390, 400, 340, 295, 354, 392, 399, 421, 462}, -}; - -/* An 16-by-19 matrix in Scale = 32768.00f */ -const Word16 inv_sigma_p_fx[][16] =//Q15 -{ - {552, 513, 469, 494, 486, 478, 492, 496, 496, 482, 480, 388, 339, 276, 743, 760}, - {640, 492, 472, 478, 482, 471, 470, 471, 623, 504, 501, 477, 459, 425, 421, 408}, - {1001, 939, 696, 589, 545, 480, 456, 451, 444, 462, 472, 424, 342, 441, 1567, 3002}, - {609, 534, 419, 432, 444, 403, 406, 407, 391, 425, 452, 378, 269, 278, 818, 1939}, - {32767}, - {574, 507, 459, 432, 425, 415, 440, 442, 449, 450, 490, 443, 299, 270, 1377, 2451}, - {591, 499, 456, 457, 449, 441, 448, 446, 443, 436, 420, 397, 364, 342, 496, 475}, - {482, 512, 498, 426, 280, 225, 422, 1411, 404, 404, 402, 385, 364, 342, 355, 361}, - {917, 831, 572, 507, 482, 430, 406, 399, 385, 365, 364, 344, 313, 309, 311, 335}, - {533, 436, 371, 399, 398, 368, 367, 348, 343, 342, 338, 319, 306, 305, 311, 334}, - {32767}, - {641, 523, 458, 434, 415, 410, 412, 395, 397, 394, 386, 381, 366, 392, 413, 419}, - {449, 380, 364, 366, 354, 362, 362, 356, 337, 323, 293, 296, 336, 352, 353, 283}, - {32767}, - {601, 485, 348, 262, 267, 266, 276, 285, 255, 233, 227, 235, 216, 237, 233, 212}, - {338, 279, 247, 244, 233, 239, 231, 232, 228, 215, 194, 194, 207, 210, 222, 180}, - {32767}, - {594, 466, 394, 376, 362, 358, 346, 350, 336, 332, 313, 329, 343, 358, 370, 419}, - {471, 409, 323, 325, 308, 295, 305, 290, 281, 280, 271, 262, 251, 255, 266, 312}, -}; - -const Word16 sigma_p_fx[][16] = -{//Qlog2(2.56) - {152, 164, 179, 170, 172, 176, 171, 169, 169, 174, 175, 216, 247, 304, 113, 110}, - {131, 171, 178, 176, 174, 178, 178, 178, 135, 166, 167, 176, 183, 197, 199, 206}, - {84, 89, 120, 142, 154, 175, 184, 186, 189, 181, 178, 198, 245, 190, 54, 28}, - {138, 157, 200, 194, 189, 208, 207, 206, 214, 197, 186, 222, 311, 302, 103, 43}, - {3}, - {146, 165, 183, 194, 197, 202, 191, 190, 187, 186, 171, 189, 281, 311, 61, 34}, - {142, 168, 184, 183, 187, 190, 187, 188, 189, 193, 200, 212, 231, 245, 169, 177}, - {174, 164, 168, 197, 300, 372, 199, 59, 208, 208, 209, 218, 231, 246, 237, 232}, - {91, 101, 147, 165, 174, 195, 207, 210, 218, 230, 230, 244, 268, 272, 269, 250}, - {157, 192, 226, 210, 211, 228, 228, 241, 245, 246, 248, 263, 274, 275, 270, 251}, - {3}, - {131, 160, 183, 193, 202, 205, 203, 212, 212, 213, 217, 220, 229, 214, 203, 200}, - {187, 221, 231, 229, 237, 232, 232, 236, 249, 259, 286, 284, 250, 238, 238, 296}, - {3}, - {140, 173, 241, 320, 314, 315, 304, 295, 329, 359, 369, 357, 388, 354, 359, 396}, - {248, 300, 339, 344, 360, 350, 363, 361, 368, 391, 431, 433, 406, 400, 377, 467}, - {3}, - {141, 180, 213, 223, 232, 234, 242, 240, 250, 253, 268, 255, 245, 235, 227, 200}, - {178, 205, 259, 258, 273, 285, 275, 289, 299, 300, 310, 320, 335, 329, 316, 269}, -}; - -const Word16 sigma_p_ivas_fx[][16] = -{//Qlog2(2.56) - {152, 164, 179, 170, 172, 176, 171, 169, 169, 174, 175, 216, 247, 304, 113, 110}, - {131, 171, 178, 176, 174, 178, 178, 178, 135, 166, 167, 176, 183, 197, 199, 206}, - {84, 89, 120, 142, 154, 175, 184, 186, 189, 181, 178, 198, 245, 190, 54, 28}, - {138, 157, 200, 194, 189, 208, 207, 206, 214, 197, 186, 222, 311, 302, 103, 43}, - {3}, - {146, 165, 183, 194, 197, 202, 191, 190, 187, 186, 171, 189, 281, 311, 61, 34}, - {142, 168, 184, 183, 187, 190, 187, 188, 189, 193, 200, 212, 231, 245, 169, 177}, - {174, 164, 168, 197, 300, 372, 199, 59, 208, 208, 209, 218, 231, 246, 237, 232}, - {91, 101, 147, 165, 174, 195, 207, 210, 218, 230, 230, 244, 268, 272, 269, 250}, - {157, 192, 226, 210, 211, 228, 228, 241, 245, 246, 248, 263, 274, 275, 270, 251}, - {3}, - {131, 160, 183, 193, 202, 205, 203, 212, 212, 213, 217, 220, 229, 214, 203, 200}, - {187, 221, 231, 229, 237, 232, 232, 236, 249, 259, 286, 284, 250, 238, 238, 296}, - {3}, - {127, 173, 226, 217, 264, 256, 290, 295, 297, 325, 334, 326, 302, 290, 275, 254}, - {248, 300, 339, 344, 360, 350, 363, 361, 368, 391, 431, 433, 406, 400, 377, 467}, - {3}, - {141, 180, 213, 223, 232, 234, 242, 240, 250, 253, 268, 255, 245, 235, 227, 200}, - {178, 205, 259, 258, 273, 285, 275, 289, 299, 300, 310, 320, 335, 329, 316, 269}, -}; - -const Word16 inv_sigma_p_ivas_fx[][16] = -{//Qlog2(2.56) - {552, 513, 470, 494, 487, 478, 492, 496, 496, 482, 480, 389, 339, 276, 743, 760}, - {640, 492, 472, 478, 482, 471, 470, 471, 623, 504, 501, 477, 459, 425, 420, 408}, - {1002, 939, 696, 589, 545, 480, 456, 450, 444, 462, 472, 424, 342, 441, 1568, 2996}, - {609, 534, 419, 432, 444, 403, 406, 407, 392, 425, 452, 378, 269, 278, 818, 1940}, - {32767}, - {575, 507, 459, 432, 425, 415, 440, 442, 449, 450, 489, 443, 299, 270, 1378, 2449}, - {591, 499, 456, 457, 449, 441, 448, 446, 444, 435, 420, 397, 364, 342, 496, 475}, - {482, 512, 498, 426, 280, 225, 422, 1410, 404, 404, 402, 385, 364, 342, 355, 361}, - {918, 832, 572, 507, 482, 430, 406, 399, 385, 366, 364, 344, 313, 309, 311, 335}, - {533, 436, 371, 399, 398, 368, 367, 348, 343, 342, 338, 319, 306, 305, 311, 334}, - {32767}, - {641, 523, 458, 434, 415, 410, 412, 395, 397, 394, 386, 380, 366, 392, 413, 419}, - {449, 380, 364, 366, 355, 362, 362, 356, 337, 323, 293, 296, 336, 352, 353, 283}, - {32767}, - {659, 486, 371, 386, 318, 328, 289, 284, 283, 258, 251, 257, 278, 290, 305, 330}, - {338, 279, 247, 244, 233, 239, 231, 232, 228, 215, 194, 194, 207, 210, 222, 180}, - {32767}, - {594, 466, 394, 376, 362, 358, 346, 350, 336, 332, 313, 329, 343, 358, 370, 419}, - {471, 409, 323, 325, 308, 295, 304, 290, 281, 280, 271, 262, 251, 255, 266, 312} -}; - -const Word8 leaders_short[][MAX_NO_SCALES] = // Q0 -{{ 0, 0, 0}, -{ 1, 0, 0}, -{ 15, 3, 3}, -{ 2, 2, 0}, -{ 2, 0, 0}, -{ 2, 1, 0}, -{ 4, 0, 0}, -{ 9, 7, 6}, -{ 4, 1, 0}, -{ 5, 2, 0}, -{ 6, 3, 2}, -{ 5, 3, 1}, -{ 8, 3, 0}, -{ 9, 3, 0}, -{ 2, 2, 1}, -{ 9, 8, 5}, -{ 5, 5, 0}, -{ 17, 3, 0}, -{ 5, 2, 1}, -{ 7, 3, 0}, -{ 5, 4, 0}, -{ 5, 5, 1}, -{ 2, 2, 2}, -{ 4, 2, 2}, -{ 5, 2, 2}, -{ 6, 6, 5}, -{ 5, 3, 2}, -{ 6, 3, 0}, -{ 12, 3, 2}, -{ 15, 3, 2}, -{ 19, 3, 2}, -{ 7, 6, 3}, -{ 5, 4, 2}, -{ 9, 8, 2}, -{ 6, 5, 2}, -{ 5, 4, 1}, -{ 9, 9, 3}, -{ 6, 6, 2}, -{ 8, 6, 2}, -{ 8, 7, 2}, -{ 8, 8, 2}, -{ 4, 2, 0}, -{ 11, 8, 2}, -{ 13, 11, 2}, -{ 5, 5, 2}, -{ 16, 13, 2}, -{ 13, 12, 2}, -{ 18, 17, 2}, -{ 21, 17, 2}, -{ 18, 16, 2}, -{ 32, 28, 2}, -{ 8, 8, 4}, -{ 7, 5, 2}, -{ 13, 11, 9}, -{ 38, 31, 2}, -{ 4, 4, 2}, -{ 8, 8, 3}, -{ 9, 8, 3}, -{ 8, 5, 2}, -{ 10, 9, 3}, -{ 11, 10, 3}, -{ 13, 10, 3}, -{ 22, 10, 3}, -{ 23, 10, 3}, -{ 13, 11, 3}, -{ 15, 13, 3}, -{ 35, 15, 3}, -{ 32, 16, 3}, -{ 5, 5, 4}, -{ 8, 7, 4}, -{ 33, 31, 2}, -{ 9, 9, 4}, -{ 16, 12, 4}, -{ 17, 13, 4}, -{ 5, 5, 5}, -{ 7, 5, 5}, -{ 4, 3, 2}, -{ 8, 6, 5}, -{ 9, 6, 5}, -{ 9, 7, 5}, -{ 8, 8, 5}, -{ 3, 2, 0}, -{ 10, 8, 5}, -{ 11, 8, 5}, -{ 12, 8, 5}, -{ 13, 8, 5}, -{ 16, 8, 5}, -{ 18, 8, 5}, -{ 10, 9, 5}, -{ 18, 9, 5}, -{ 23, 21, 2}, -{ 13, 8, 8}, -{ 14, 10, 5}, -{ 11, 11, 5}, -{ 13, 11, 5}, -{ 13, 13, 5}, -{ 14, 13, 5}, -{ 15, 13, 5}, -{ 16, 13, 5}, -{ 17, 13, 5}, -{ 18, 13, 5}, -{ 18, 16, 5}, -{ 18, 17, 5}, -{ 19, 18, 5}, -{ 13, 10, 5}, -{ 21, 21, 5}, -{ 23, 21, 5}, -{ 24, 21, 5}, -{ 25, 23, 5}, -{ 32, 23, 5}, -{ 11, 10, 5}, -{ 8, 8, 6}, -{ 5, 5, 7}, -{ 8, 7, 7}, -{ 8, 8, 7}, -{ 10, 8, 7}, -{ 13, 8, 7}, -{ 10, 9, 7}, -{ 13, 11, 7}, -{ 9, 8, 8}, -{ 12, 8, 8}, -{ 23, 18, 5}, -{ 9, 9, 8}, -{ 11, 9, 8}, -{ 13, 9, 8}, -{ 18, 10, 8}, -{ 26, 10, 8}, -{ 27, 10, 8}, -{ 31, 10, 8}, -{ 40, 21, 11}, -{ 13, 11, 8}, -{ 13, 12, 8}, -{ 14, 12, 8}, -{ 18, 12, 8}, -{ 13, 13, 8}, -{ 14, 13, 8}, -{ 16, 13, 8}, -{ 18, 13, 8}, -{ 18, 16, 8}, -{ 18, 17, 8}, -{ 23, 18, 8}, -{ 23, 21, 8}, -{ 24, 21, 8}, -{ 28, 23, 8}, -{ 31, 31, 8}, -{ 36, 31, 8}, -{ 38, 31, 8}, -{ 11, 9, 9}, -{ 12, 9, 9}, -{ 13, 9, 9}, -{ 12, 11, 9}, -{ 42, 31, 2}, -{ 14, 12, 9}, -{ 13, 13, 9}, -{ 14, 13, 9}, -{ 16, 13, 9}, -{ 17, 13, 9}, -{ 18, 13, 9}, -{ 18, 14, 9}, -{ 18, 18, 9}, -{ 26, 25, 9}, -{ 13, 11, 10}, -{ 18, 12, 10}, -{ 18, 13, 10}, -{ 21, 14, 10}, -{ 22, 16, 10}, -{ 18, 18, 10}, -{ 23, 18, 10}, -{ 24, 18, 10}, -{ 24, 21, 10}, -{ 23, 22, 10}, -{ 24, 23, 10}, -{ 32, 25, 10}, -{ 34, 28, 10}, -{ 42, 31, 10}, -{ 17, 11, 11}, -{ 18, 13, 11}, -{ 21, 13, 11}, -{ 18, 17, 11}, -{ 18, 18, 11}, -{ 48, 35, 24}, -{ 18, 17, 12}, -{ 18, 18, 12}, -{ 20, 18, 12}, -{ 39, 30, 12}, -{ 31, 31, 12}, -{ 43, 34, 12}, -{ 16, 13, 13}, -{ 17, 13, 13}, -{ 16, 16, 13}, -{ 18, 17, 13}, -{ 20, 18, 13}, -{ 22, 18, 13}, -{ 23, 18, 13}, -{ 22, 21, 13}, -{ 23, 23, 13}, -{ 24, 23, 13}, -{ 43, 36, 13}, -{ 43, 40, 13}, -{ 43, 41, 13}, -{ 31, 30, 18}, -{ 24, 21, 14}, -{ 31, 31, 14}, -{ 23, 18, 16}, -{ 23, 23, 16}, -{ 31, 25, 16}, -{ 31, 29, 16}, -{ 45, 35, 16}, -{ 23, 21, 17}, -{ 23, 22, 17}, -{ 23, 23, 17}, -{ 31, 31, 17}, -{ 21, 18, 18}, -{ 23, 21, 18}, -{ 23, 22, 18}, -{ 27, 23, 18}, -{ 29, 23, 18}, -{ 32, 23, 18}, -{ 31, 27, 18}, -{ 30, 28, 18}, -{ 31, 28, 18}, -{ 43, 42, 13}, -{ 31, 31, 18}, -{ 32, 31, 18}, -{ 36, 31, 18}, -{ 46, 48, 18}, -{ 46, 32, 19}, -{ 43, 38, 19}, -{ 43, 42, 19}, -{ 32, 32, 20}, -{ 27, 23, 21}, -{ 31, 23, 21}, -{ 31, 24, 21}, -{ 32, 30, 21}, -{ 32, 31, 21}, -{ 43, 33, 21}, -{ 43, 34, 21}, -{ 24, 23, 23}, -{ 32, 32, 23}, -{ 48, 40, 23}, -{ 48, 46, 23}, -{ 28, 24, 24}, -{ 32, 31, 24}, -{ 34, 32, 24}, -{ 36, 32, 24}, -{ 48, 32, 24}, -{ 35, 10, 8}, -{ 40, 28, 25}, -{ 45, 31, 25}, -{ 44, 32, 25}, -{ 31, 31, 27}, -{ 39, 32, 27}, -{ 44, 32, 27}, -{ 32, 32, 28}, -{ 43, 32, 28}, -{ 48, 32, 28}, -{ 36, 36, 28}, -{ 48, 45, 28}, -{ 40, 32, 29}, -{ 44, 34, 30}, -{ 40, 32, 31}, -{ 41, 32, 31}, -{ 42, 32, 31}, -{ 44, 43, 31}, -{ 48, 37, 32}, -{ 48, 39, 32}, -{ 46, 43, 32}, -{ 48, 48, 34}, -{ 48, 36, 35}, -{ 48, 41, 35}, -{ 47, 43, 36}, -{ 48, 48, 37}, -{ 48, 48, 40}, -{ 48, 48, 45}, -{ 48, 48, 47}, -{ 48, 48, 48}}; - -const UWord8 no_lead_idx[][2] = { // Q0 -{ 1, 1}, -{ 4, 1}, -{ 41, 1}, -{ 41, 4}, -{ 52, 32}, -{ 56, 38}, -{ 41, 1}, -{ 6, 5}, -{119, 14}, -{ 58, 18}, -{138, 21}, -{169, 40}, -{ 4, 4}, -{ 41, 1}, -{ 35, 1}, -{ 35, 4}, -{ 52, 4}, -{ 18, 8}, -{ 44, 41}, -{ 58, 6}, -{ 58, 9}, -{ 69, 26}, -{ 51, 34}, -{ 85, 34}, -{ 85, 38}, -{ 85, 42}, -{139, 40}, -{142, 33}, -{140, 64}, -{141, 73}, -{236, 124}, -{235, 133}, -{211, 160}, -{ 4, 3}, -{ 41, 1}, -{ 52, 3}, -{ 39, 3}, -{ 42, 3}, -{153, 3}, -{118, 9}, -{158, 44}, -{202, 93}, -{250, 201}, -{ 20, 0}, -{ 52, 0}, -{ 1, 1}, -{ 4, 1}, -{ 4, 4}, -{ 4, 4}, -{ 41, 1}, -{ 41, 4}, -{ 20, 4}, -{ 52, 4}, -{ 39, 4}, -{ 44, 41}, -{ 58, 6}, -{ 80, 41}, -{114, 9}, -{124, 9}, -{130, 21}, -{124, 58}, -{165, 34}, -{164, 39}, -{169, 40}, -{ 35, 0}, -{ 4, 4}, -{ 35, 1}, -{ 35, 4}, -{ 52, 4}, -{ 58, 5}, -{ 15, 5}, -{135, 3}, -{116, 41}, -{124, 24}, -{137, 24}, -{177, 26}, -{194, 44}, -{208, 52}, -{230, 58}, -{ 4, 4}, -{ 41, 1}, -{ 41, 4}, -{ 20, 4}, -{ 8, 6}, -{ 9, 8}, -{ 44, 41}, -{ 58, 6}, -{ 58, 9}, -{114, 9}, -{124, 9}, -{ 92, 21}, -{124, 58}, -{ 92, 51}, -{104, 91}, -{141, 51}, -{121, 91}, -{ 4, 3}, -{ 41, 1}, -{ 52, 3}, -{ 69, 3}, -{ 83, 3}, -{ 87, 3}, -{ 86, 44}, -{143, 74}, -{144, 112}, -{179, 78}, -{196, 78}, -{196, 78}, -{224, 78}, -{ 4, 3}, -{ 41, 1}, -{ 20, 1}, -{ 20, 4}, -{ 52, 4}, -{ 52, 3}, -{111, 5}, -{132, 4}, -{ 57, 41}, -{123, 41}, -{214, 3}, -{183, 81}, -{215, 41}, -{213, 32}, -{219, 44}, -{233, 52}, -{ 7, 52}, -{ 3, 57}, -{ 14, 59}, -{ 11, 53}, -{ 62, 0}, -{ 37, 4}, -{ 37, 3}, -{ 63, 3}, -{ 67, 3}, -{184, 3}, -{123, 41}, -{ 19, 124}, -{ 39, 4}, -{ 44, 41}, -{ 58, 6}, -{ 58, 9}, -{ 58, 44}, -{115, 32}, -{ 95, 16}, -{102, 21}, -{ 99, 38}, -{126, 58}, -{141, 57}, -{206, 56}, -{205, 120}, -{226, 124}, -{226, 133}, -{225, 182}, -{152, 3}, -{ 65, 3}, -{ 17, 14}, -{ 61, 22}, -{135, 3}, -{ 19, 11}, -{ 76, 25}, -{ 41, 36}, -{ 41, 33}, -{ 41, 7}, -{ 27, 10}, -{ 81, 15}, -{ 3, 2}, -{ 41, 36}, -{ 55, 31}, -{ 81, 7}, -}; -const UWord8 no_lead_p_idx[][2] = { // Q0 - { 5, 0}, -{ 3, 0}, -{ 41, 0}, -{ 35, 0}, -{ 52, 0}, -{ 1, 1}, -{ 4, 1}, -{ 4, 4}, -{ 3, 4}, -{ 41, 1}, -{ 41, 4}, -{ 35, 4}, -{ 52, 4}, -{ 39, 4}, -{ 44, 41}, -{ 58, 6}, -{ 80, 41}, -{ 15, 9}, -{ 94, 9}, -{110, 34}, -{ 96, 52}, -{ 98, 39}, -{105, 58}, -{107, 51}, -{105, 104}, -{109, 94}, -{145, 98}, -{207, 100}, -{239, 103}, -{240, 108}, -{207, 146}, -{ 4, 0}, -{ 41, 4}, -{ 39, 3}, -{ 94, 5}, -{ 80, 41}, -{ 94, 18}, -{ 94, 44}, -{ 96, 52}, -{106, 44}, -{121, 58}, -{107, 51}, -{199, 15}, -{197, 104}, -{198, 156}, -{221, 200}, -{ 4, 1}, -{ 3, 1}, -{ 3, 4}, -{ 41, 1}, -{ 35, 1}, -{ 35, 4}, -{ 52, 4}, -{ 39, 4}, -{ 88, 4}, -{135, 4}, -{135, 3}, -{190, 3}, -{155, 41}, -{135, 20}, -{190, 32}, -{194, 44}, -{231, 44}, -{230, 58}, -{231, 15}, -{242, 83}, -{253, 130}, -{ 4, 1}, -{ 32, 1}, -{ 58, 5}, -{ 39, 3}, -{ 43, 5}, -{ 45, 3}, -{ 48, 3}, -{ 46, 44}, -{ 49, 44}, -{ 90, 44}, -{ 50, 44}, -{ 54, 52}, -{ 70, 51}, -{151, 122}, -{151, 53}, -{ 52, 4}, -{ 39, 4}, -{ 83, 4}, -{ 89, 4}, -{ 80, 41}, -{ 85, 41}, -{100, 8}, -{101, 9}, -{ 85, 38}, -{ 85, 15}, -{195, 52}, -{234, 52}, -{217, 15}, -{254, 15}, -{251, 104}, -{ 10, 153}, -{ 18, 157}, -{ 19, 192}, -{ 19, 237}, -{ 19, 0}, -{ 52, 4}, -{153, 3}, -{159, 3}, -{171, 32}, -{185, 44}, -{186, 68}, -{ 85, 15}, -{220, 44}, -{218, 75}, -{227, 75}, -{ 1, 77}, -{228, 147}, -{ 15, 150}, -{ 18, 187}, -{ 16, 212}, -{ 16, 241}, -{ 17, 248}, -{ 4, 3}, -{ 52, 4}, -{ 52, 3}, -{161, 3}, -{166, 3}, -{149, 9}, -{247, 47}, -{178, 0}, -{ 41, 1}, -{ 20, 1}, -{ 20, 4}, -{ 52, 4}, -{ 58, 5}, -{117, 4}, -{117, 3}, -{153, 3}, -{182, 3}, -{204, 3}, -{162, 9}, -{163, 44}, -{167, 44}, -{173, 44}, -{254, 44}, -{ 12, 52}, -{254, 15}, -{ 13, 82}, -{244, 188}, -{ 3, 4}, -{ 52, 4}, -{ 58, 5}, -{153, 3}, -{190, 3}, -{209, 3}, -{243, 189}, -{ 41, 1}, -{ 20, 1}, -{ 39, 4}, -{ 88, 4}, -{ 97, 4}, -{138, 21}, -{ 6, 44}, -{ 1, 1}, -{ 4, 1}, -{ 4, 4}, -{ 5, 4}, -{ 41, 1}, -{ 41, 4}, -{ 20, 4}, -{ 52, 4}, -{ 39, 4}, -{ 83, 4}, -{135, 4}, -{ 80, 41}, -{116, 41}, -{136, 41}, -{110, 34}, -{ 13, 6}, -{113, 41}, -{114, 18}, -{ 91, 24}, -{125, 24}, -{127, 24}, -{163, 12}, -{168, 13}, -{172, 13}, -{128, 84}, -{174, 28}, -{252, 29}, -{249, 30}, -{246, 129}, -{246, 180}, -{ 9, 66}, -{110, 41}, -{155, 41}, -{154, 20}, -{158, 44}, -{203, 21}, -{232, 44}, -{210, 39}, -{223, 79}, -{222, 123}, -{229, 131}, -{238, 139}, -{238, 170}, -{ 4, 4}, -{ 4, 4}, -{ 41, 1}, -{ 20, 1}, -{ 20, 4}, -{ 52, 4}, -{ 39, 4}, -{ 88, 4}, -{135, 4}, -{ 80, 41}, -{110, 41}, -{136, 41}, -{134, 32}, -{176, 44}, -{193, 44}, -{195, 52}, -{210, 39}, -{242, 39}, -{ 6, 71}, -{ 2, 148}, -{ 4, 175}, -{ 5, 191}, -{110, 41}, -{204, 3}, -{216, 22}, -{210, 23}, -{195, 32}, -{220, 44}, -{210, 39}, -{222, 33}, -{245, 57}, -{255, 60}, -{ 8, 72}, -{ 8, 181}, -}; - -const Word16 min_lat_bits_SN[] = {-1, -1, 17, 12, 17, 17, -1, -1, 17, 12, 17, 17, -1, -1, 22, -1, 32, 26 }; -//Q0 -const Word16 min_lat_bits_SN_fx[] = { -1, -1, 17, 12, 17, 17, -1, -1, 17, 12, 17, 17, -1, -1, 22, -1, 32, 26 }; - -const Word16 min_lat_bits_pred[] = {17, 18, 9, 15, -1, 21, 17, 14, 9, 15, -1, 21, 17, -1, 24, 26, -1, 26, 16}; -//Q0 -const Word16 min_lat_bits_pred_fx[] = { 17, 18, 9, 15, -1, 21, 17, 14, 9, 15, -1, 21, 17, -1, 24, 26, -1, 26, 16 }; - -const Word16 offset_lvq_modes_SN[] = {-1,-1,33,64,96, 129,-1,-1,12,43,79,109,-1,-1,137,-1,107,135, - 112 - }; /* CNG */ -//Q0 -const Word16 offset_lvq_modes_SN_fx[] = { -1,-1,26,51,77,96,-1,-1,12,36,66,90,-1,-1,105,-1,88,102,112 }; /* CNG */ - -const Word16 offset_lvq_modes_pred[] = {119, 153, 31, 67, -1, 102, 126, 160, 0, 46, -1, 82, 146, -1, 175, 191, -1, 225, 203}; -//Qlog2(1.6) -const Word16 offset_lvq_modes_pred_fx[] = { 74, 95, 15, 45, -1, 66, 81, 102, 0, 30, -1, 60, 88, -1, 109, 117, -1, 139, 124 }; - -const Word16 offset_in_lvq_mode_SN[][21] = -{ - {0}, /* I NB */ - {0,1,1,1,1,1,2,3,3,3,3,4,4,4,5}, /* UV NB*/ - {0,1,1,1,1,2,3,4,5,5,6,6,7,7,7,7,7,8,8,8,9}, /* V NB */ - {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G NB */ - {0,1,1,1,1,2,3,4,5,5,5,6,6,6,7,8}, /* T NB */ - {0,0,0,0,1,2,2,2,2,3,4,5}, /* A NB */ - {0}, /* I WB */ - {0}, /* UV WB*/ - {1}, /* V WB */ /* granularity 1 */ - {1}, /* G WB */ /* granularity 1 */ - {1}, /* T WB */ /* granularity 1 */ - {1}, /* A WB */ /* granularity 1 */ - {0}, /* I 16k */ - {0}, /* UV 16k */ - {1}, /* V 16k */ /* granularity 1 */ - {0}, /* G 16k */ - {0,1}, /* T 16k */ - {0}, /* A 16k */ -}; - -const Word16 offset_in_lvq_mode_SN_fx[][21] = -{//Q0 - {0}, /* I NB */ - {0,1,1,1,1,1,2,3,3,3,3,4,4,4,5}, /* UV NB*/ - {0,1,1,1,1,2,3,4,5,5,6,6,7,7,7,7,7,8,8,8,9}, /* V NB */ - {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G NB */ - {0,1,1,1,1,2,3,4,5,5,5,6,6,6,7,8}, /* T NB */ - {0,0,0,0,1,2,2,2,2,3,4,5}, /* A NB */ - {0}, /* I WB */ - {0,1,1,1,2,3,3,3,3,3,3,4,4,4,5}, /* UV WB*/ - {0,1,1,1,2,3,3,3,4,5,6,7,8,9,9,10,11,12,12,12,13}, /* V WB */ - {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G WB */ - {0,1,1,1,2,3,3,4,5,5,5,6,6,7,8,9,10}, /* T WB */ - {0,0,0,0,1,2,2,2,3,4,4,4,4,4,4,4,4,4,4,5}, /* A WB */ - {0}, - {0}, - {0,0,0,0,0,0,1,2,3,3,4,5,6,6,6,7}, /* V 16k */ - {0}, /* G 16k */ - {0,1}, /* T 16k */ - {0}, /*{0,0,0,0,0,0,0,0,0,0,1} */ /* A 16k */ -}; - -const Word16 offset_in_lvq_mode_pred[][32] = -{ - {0,0,0,0,1,2,2,2,3,4,5,5,5,5,5,5,5,5,5,6}, /* I NB */ - {0,1,1,1,2,3,4,4,4,4,4,5,5,5,6}, /* UV NB */ - {0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,3,4,4,5,6,7,8,9,10,10,11,12,13,13,13,14}, /* V NB */ - {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G NB */ - {0}, /* T NB */ - {0,0,0,0,1,2,2,2,2,3,4,5}, /* A NB */ - {1}, /* I WB */ - {1}, /* UV WB */ /* granularity 1 */ - {1}, /* V WB */ /* granularity 1 */ - {1}, /* G WB */ - {0}, /* T WB */ - {1}, /* A WB */ - {0,0,0,0,1,2,2,2,3,4,5,5,5,5,5,5,5,5,5,6}, /* I 16k */ - {0}, /* UV 16k */ - {1}, /* V 16k */ - {1}, /* G 16k */ - {0}, /* T 16k */ - {1}, /* A 16k */ - {1}, /* G WB MA*/ -}; - -const Word16 offset_in_lvq_mode_pred_fx[][32] = -{//Q0 - {0,0,0,0,1,2,2,2,3,4,5,5,5,5,5,5,5,5,5,6}, /* I NB */ - {0,1,1,1,2,3,4,4,4,4,4,5,5,5,6}, /* UV NB */ - {0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,3,4,4,5,6,7,8,9,10,10,11,12,13,13,13,14}, /* V NB */ - {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G NB */ - {0}, /* T NB */ - {0,0,0,0,1,2,2,2,2,3,4,5}, /* A NB */ - {0,0,0,0,1,2,2,2,3,4,5,5,5,5,5,5,5,5,5,6}, /* I WB */ - {0,1,1,1,2,3,4,4,4,4,4,5,5,5,6}, /* UV WB */ - {0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,3,4,4,5,6,7,8,9,10,10,11,12,13,13,13,14}, /* V WB */ - {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G WB */ - {0}, /* T WB */ - {0,0,0,0,1,2,2,2,3,4,4,4,4,4,4,4,4,4,4,5}, /* A WB */ - {0,0,0,0,1,2,2,2,3,4,5,5,5,5,5,5,5,5,5,6}, /* I 16k */ - {0}, /* UV 16k */ - {0,0,0,0,0,0,1,2,3,3,4,5,6,6,6,7}, /* V 16k */ - {0,0,0,0,0,0,1,2,3,4,5,6}, /* G 16k */ - {0}, /* T 16k */ - {0,0,0,0,0,0,1,2,3,4,5,6}, /* A 16k */ - {0,0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G WB MA*/ -}; - -/*-----------------------------------------------------------------* - * BC-TCVQ frame-end quantization tables (BC-TCVQ is used in Voiced mode for 16kHz isf) - *-----------------------------------------------------------------*/ -const Word16 NTRANS[4][NUM_STATE] = {{0,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14}, /* indices of previous state of first branche */ - {1,3,5,7,9,11,13,15,1,3,5,7,9,11,13,15}, /* indices of previous state of second branches */ - {4,2,1,3,0,2,1,3,2,0,3,1,7,0,3,1}, /* indices of previous subset of first branch */ - {2,0,3,6,2,0,3,1,0,2,1,3,0,2,1,5} /* indices of previous subset of second branch */ -}; // Q0 - -const Word16 NTRANS2[4][NUM_STATE] = {{0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7}, - {8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15}, - {4,2,2,0,1,3,3,6,0,2,2,0,1,3,3,1}, - {2,0,0,2,3,1,1,3,7,0,0,2,3,1,1,5} -}; // Q0 - -/* BC-TCQ Bit Allocations */ -const Word16 BC_TCVQ_BIT_ALLOC_40B[M/2+4] = {1, 4, 5,5,4,4, 2,2,2,2, 5,4 }; /*1+39bit Q0*/ - -const Word16 FixBranch_tbl[4][4][N_STAGE_VQ - 4] = -{ - {{0, 0, 0, 0}, {1, 0, 0, 0}, {0, 1, 0, 0}, {1, 1, 0, 0}}, /* incase of initial state 0 */ - {{0, 0, 1, 0}, {1, 0, 1, 0}, {0, 1, 1, 0}, {1, 1, 1, 0}}, /* incase of initial state 4 */ - {{0, 0, 0, 1}, {1, 0, 0, 1}, {0, 1, 0, 1}, {1, 1, 0, 1}}, /* incase of initial state 8 */ - {{0, 0, 1, 1}, {1, 0, 1, 1}, {0, 1, 1, 1}, {1, 1, 1, 1}} /* incase of initial state 12 */ -}; // Q0 - -/* Intra-Prediction */ - -const Word16 SN_IntraCoeff_fx[N_STAGE_VQ - 1][2][2] = /* Q15 */ -{ - {{-14822, 26501}, {-17180, 10012}}, - {{ 317, 19858}, { -432, 13799}}, - {{ 4747, 22069}, { 2653, 19016}}, - {{ 6823, 20747}, { 7077, 19154}}, - {{ 1665, 25161}, { 2519, 13654}}, - {{ 166, 18043}, { -221, 9732}}, - {{ -781, 20026}, { -5332, 18882}} -}; - -const Word16 AR_IntraCoeff_fx[N_STAGE_VQ - 1][2][2] = /* Q15 */ -{ - {{-9584, 22162}, {-13849, 7127}}, - {{ 1604, 16400}, { 2861, 9414}}, - {{ 6537, 16475}, { 3498, 13792}}, - {{ 7879, 14434}, { 7021, 12992}}, - {{ 6329, 16215}, { 5200, 10052}}, - {{ 3062, 12146}, { 2147, 4857}}, - {{ 1226, 11040}, { -794, 6137}} -}; - -const Word16 scale_ARSN_fx[M] = /* Q14 */ -{ - 29994, 30153, 29506, 28534, 28246, 28618, 26388, 27029, - 25726, 25474, 25797, 26540, 25613, 24968, 25880, 25584 -}; - -const Word16 scale_inv_ARSN_fx[M] = /* Q15 */ -{ - 17898, 17806, 18196, 18815, 19005, 18760, 20342, 19864, - 20870, 21076, 20811, 20228, 20962, 21502, 20745, 20985 -}; - -/* TCVQ Codebook */ - -const Word16 AR_TCVQ_CB_SUB1_fx[2][128][2] = /* x2.65 */ -{//Qlog2(2.56) - { - {-435 , -434}, {-233 , 124}, {-381 , 44}, {-274 , -88}, {-332 , -224}, {-563 , -600}, {-332 , 134}, { 53 , -739}, - {-567 , 0}, { 149 , 316}, {-191 , 541}, {-123 , 317}, {-493 , -634}, {-528 , 268}, {-321 , -386}, {-432 , -220}, - {-244 , -230}, { -33 , 454}, {-188 , -642}, {-131 , -215}, {-676 , 263}, {-472 , -403}, {-312 , -159}, {-340 , 297}, - {-121 , -217}, { -6 , 241}, {-203 , -211}, {-126 , -15}, {-734 , -374}, {-458 , -6}, {-297 , -27}, {-307 , -553}, - {-177 , 3}, {-175 , -273}, { 63 , 363}, { 133 , 527}, {-133 , -185}, {-449 , -1206}, {-287 , -281}, {-131 , 869}, - {-100 , -105}, { -75 , -179}, {-141 , 131}, { -32 , 108}, { -81 , 161}, {-446 , -230}, {-283 , -884}, {-128 , -165}, - {-153 , -451}, {-177 , -114}, {-113 , -127}, {-223 , -355}, {-246 , -447}, {-396 , -705}, {-280 , 329}, { -37 , -64}, - {-118 , 208}, { -82 , 64}, {-339 , -367}, { -58 , -132}, {-458 , 644}, {-381 , -543}, {-272 , 557}, { 62 , 75}, - {-307 , -829}, { 310 , 445}, { 73 , -26}, { 95 , 219}, { 223 , 611}, { 279 , 195}, { 430 , 575}, { 424 , 221}, - { -25 , 2}, { 323 , 236}, {-100 , -310}, { 11 , -35}, { 83 , -3}, { 281 , 738}, { 495 , 393}, { 89 , 1284}, - { 32 , 136}, { 29 , 34}, { 491 , 575}, { 105 , -188}, { 15 , -440}, { 285 , 10}, { 516 , -105}, { 313 , 704}, - { -6 , -274}, { -62 , -64}, { -12 , -127}, { 170 , 2387}, { 162 , 196}, { 336 , 413}, { 543 , 210}, { 231 , -70}, - { -2 , 691}, { 98 , 134}, { 25 , 141}, { 261 , 305}, { 312 , -322}, { 336 , 228}, { 561 , 781}, { 766 , 514}, - { -14 , -117}, { 166 , 905}, { -50 , 1}, { 471 , 369}, { 345 , 247}, { 347 , -383}, { 561 , 1128}, { 513 , 1030}, - { 100 , -15}, { 185 , 70}, { 167 , 131}, { 122 , 36}, { 561 , 743}, { 401 , 111}, { 595 , -579}, { 674 , 215}, - { 191 , 189}, { 38 , -78}, { 428 , 0}, { 261 , 136}, { -29 , -99}, { 405 , 308}, { 614 , 574}, {1682 , 1704} - }, - { - {-942 , -168}, {-262 , -361}, { -53 , -171}, {-245 , 472}, {-2145 , -2315}, {-1307 , 1261}, {-870 , -1940}, { -652 , -564}, - {-500 , 447}, {-578 , -198}, {-554 , 111}, { -98 , -84}, {-1315 , 0}, {-1229 , -1618}, {-868 , 230}, { -385 , 1061}, - {-768 , -998}, {-202 , -60}, {-283 , -197}, {-142 , -325}, { -558 , 755}, {-1217 , 456}, {-803 , 766}, { -982 , 743}, - {-415 , -357}, { -28 , 1054}, { 114 , -246}, { 81 , 732}, { -804 , -506}, {-1126 , -112}, {-797 , -132}, { -289 , -204}, - {-347 , -29}, { -37 , -259}, {-142 , -438}, {-249 , 87}, { -874 , 341}, {-1074 , -2635}, {-668 , -1552}, {-1140 , -764}, - {-245 , -513}, { -48 , 526}, { 14 , 395}, {-452 , -646}, { -441 , -969}, { -953 , -1284}, {-645 , -387}, { -736 , 111}, - {-163 , 305}, {-349 , 224}, {-225 , 736}, { 94 , -85}, { -302 , -549}, { -937 , -892}, {-605 , -1089}, { -64 , -101}, - {-161 , -211}, {-392 , -1299}, {-148 , 125}, { 14 , 131}, { -432 , -127}, { -920 , -510}, {-598 , -730}, { 85 , 154}, - { 25 , -155}, { -57 , 238}, { 471 , 276}, { 421 , 680}, { -173 , 316}, { 597 , 1805}, { 906 , -673}, { 538 , 450}, - {-267 , -805}, { 2 , -19}, { 222 , 219}, { 185 , 352}, { -33 , -178}, { 606 , 118}, { 959 , -70}, { 350 , -91}, - { -87 , 42}, { 727 , 905}, { 54 , 33}, { 316 , 44}, { 251 , 15}, { 610 , -122}, { 990 , 1436}, { 82 , 1480}, - { 181 , 535}, { 177 , 130}, { 700 , 565}, { 626 , 331}, { 279 , 551}, { 680 , 707}, {1012 , 727}, { 1057 , 766}, - { -13 , -396}, { 364 , 412}, { 442 , -181}, { 202 , -386}, { 565 , 1397}, { 740 , 2621}, {1080 , 361}, { 1118 , 191}, - { 81 , 266}, { 217 , -130}, { 349 , 1009}, { 678 , -476}, { 1361 , 878}, { 795 , 472}, {1267 , 1034}, { 1040 , 1255}, - { 351 , 201}, { -69 , -633}, { -36 , -1046}, { 808 , 30}, { 1300 , -198}, { 803 , 1026}, {1390 , -326}, { 2291 , 2479}, - { 166 , 13}, { 521 , 84}, { 255 , -717}, { 987 , 448}, { 777 , 220}, { 811 , 208}, {1395 , 2021}, { 1499 , 417} - } -}; -const Word16 AR_TCVQ_CB_SUB2_fx[2][64][2] = -{//Qlog2(2.56) - { - {-357 , -53}, {-525 , 167}, {-232 , 255}, {-132 , -359}, {-940 , -221}, { -260 , -1296}, {-1197 , -455}, { -833 , 49}, - {-132 , -1}, {-401 , -280}, {-212 , -217}, {-194 , 92}, {-580 , -710}, { -862 , -750}, { -669 , 430}, { -521 , 719}, - {-620 , -454}, {-239 , 509}, { -15 , -575}, { 389 , 704}, {-890 , 518}, {-1154 , 84}, { -632 , -1023}, { -620 , -1263}, - {-268 , -470}, {-326 , -738}, { 44 , 635}, { 73 , 362}, {-226 , -22}, { -625 , -106}, { -720 , -114}, {-1114 , -1070}, - { 19 , -250}, { 83 , 99}, { 35 , -16}, { 263 , -316}, { 472 , 1096}, { -52 , -328}, { -249 , 971}, { 1387 , 876}, - { 10 , 203}, { 869 , 649}, { 225 , 170}, { 301 , 83}, {1256 , 482}, { 391 , -777}, { 1064 , -320}, { 52 , 1207}, - { 309 , 375}, { 469 , 226}, { 619 , 400}, { 60 , -93}, { 335 , 244}, { 316 , -65}, { -45 , -987}, { 648 , -294}, - { 218 , -66}, {-108 , -133}, { 500 , -19}, { 824 , 163}, { 483 , -443}, { 1297 , 240}, { 1000 , 1205}, { 623 , 1347} - }, - { - {-424 , -965}, { -46 , -194}, { 20 , 298}, {-333 , -278}, {-797 , -522}, {-868 , -60}, { -20 , -140}, {-1085 , -904}, - {-615 , -243}, {-367 , 22}, {-261 , -519}, {-111 , -27}, {-745 , 142}, {-484 , -1519}, { -329 , 13}, {-1077 , 92}, - {-529 , 218}, {-519 , -597}, {-276 , -72}, { -87 , -398}, { -51 , -1257}, {-291 , 409}, { -883 , 611}, { 176 , -401}, - {-134 , -245}, { 37 , 506}, { 23 , -10}, {-225 , 293}, {-913 , -1324}, {-174 , -290}, {-1086 , -386}, { -139 , -78}, - {-123 , 125}, { -26 , -738}, { 113 , -344}, { 175 , 182}, { 754 , -446}, {1207 , 529}, { 932 , 990}, { 136 , 122}, - { 267 , 327}, { 382 , -182}, { 718 , 471}, { 738 , 108}, { 158 , 130}, { 437 , 401}, { 358 , -667}, { 1380 , 836}, - { 184 , -17}, { 435 , 231}, { 403 , 63}, { 151 , -125}, {-109 , -237}, { 692 , -241}, { 1247 , 193}, { 885 , 324}, - {-283 , 661}, { 44 , 105}, { 156 , 911}, { 387 , 588}, { 690 , 1459}, { 664 , 1057}, { -38 , 1455}, { 645 , 909} - } -}; -const Word16 AR_TCVQ_CB_SUB3_fx[4][32][2] = -{//Qlog2(2.56) - { - {-487 , 9}, {-456 , -400}, { 96 , 451}, {-239 , 422}, {-685 , -1309}, { 68 , -709}, {-302 , -1185}, { 481 , -287}, - {-287 , -697}, {-194 , 73}, {-159 , -132}, {-161 , -312}, {-809 , 417}, {-860 , -926}, { -26 , -71}, {-1052 , -432}, - { 53 , 134}, { 106 , -140}, { 336 , -18}, { 404 , 735}, {-109 , -516}, { 719 , -65}, { -34 , 1336}, { -171 , 905}, - { 52 , -347}, { 359 , 266}, { 715 , 351}, { 100 , 133}, { 87 , 130}, { 975 , 999}, {1257 , 547}, { 738 , 1372} - }, - { - {-340 , -464}, {-216 , -779}, { 104 , -403}, { -92 , -221}, {-760 , -602}, {-914 , -811}, {-661 , -895}, {-1292 , -290}, - {-317 , 131}, {-575 , -154}, {-228 , -129}, {-257 , 487}, {-286 , -1354}, { -93 , -259}, {-798 , 179}, { -815 , -1368}, - { 215 , 570}, { -2 , 73}, { 545 , 167}, { 250 , 188}, { 76 , 48}, {-943 , 587}, { 379 , 1232}, { 1070 , 112}, - { 117 , -27}, { 389 , -142}, { 18 , 214}, { 735 , 581}, {1098 , 1244}, { 451 , 408}, {1482 , 650}, { -174 , 1160} - }, - { - {-256 , -485}, { -67 , 571}, { -5 , 161}, {-171 , 153}, {-1188 , -440}, {-1081 , 110}, {-641 , -921}, {-232 , -96}, - {-511 , 146}, {-288 , -93}, { 484 , 665}, {-610 , -366}, { -357 , -899}, { -861 , -1088}, { -78 , -105}, {-265 , -845}, - { 15 , 18}, { 79 , -383}, {-205 , -258}, { 306 , 264}, { 28 , 69}, { 34 , 65}, {1170 , 669}, { 133 , 74}, - { 521 , 183}, { 132 , 84}, { 362 , -90}, { 57 , -181}, { 894 , 456}, { 1147 , 742}, { 212 , 274}, { 891 , 262} - }, - { - { 94 , 464}, { 8 , 138}, {-365 , -640}, {-399 , 172}, {-249 , -109}, { -94 , -316}, {-163 , -250}, {-598 , -704}, - {-185 , 36}, {-470 , -199}, { 65 , 241}, {-104 , -362}, {-220 , -801}, {-866 , -66}, {-931 , -400}, {-172 , -132}, - {-148 , -494}, { 465 , 251}, {-179 , -72}, { 439 , 287}, { 824 , 559}, { 33 , 134}, { 59 , 134}, { 88 , 146}, - { 186 , 43}, { 69 , -261}, { 267 , -96}, { 40 , 79}, { 84 , 130}, { 678 , 378}, { 811 , 448}, { 920 , 541} - } -}; - - -const Word16 SN_TCVQ_CB_SUB1_fx[2][128][2] = -{//Qlog2(2.56) - { - {-639 , 105}, {-488 , -449}, {-530 , -811}, {-419 , -634}, {-781 , -1061}, {-585 , 386}, {-501 , -737}, {-489 , -728}, - {-702 , -685}, {-510 , -762}, {-390 , -287}, {-379 , -379}, {-573 , -848}, {-583 , -778}, {-500 , -810}, {-671 , -420}, - {-516 , 802}, {-265 , -492}, {-523 , -568}, {-195 , 2882}, {-600 , -172}, {-568 , -869}, {-497 , 663}, {-643 , -929}, - {-346 , -378}, {-253 , -313}, {-418 , 595}, {-240 , -465}, {-424 , -546}, {-556 , -305}, {-497 , 2453}, {-451 , -235}, - {-452 , -670}, {-368 , -624}, {-379 , -662}, {-305 , -85}, {-549 , 399}, {-546 , -644}, {-484 , -426}, {-387 , -546}, - {-325 , -550}, {-229 , 118}, { -83 , 1004}, {-120 , 465}, {-289 , -222}, {-516 , 155}, {-480 , 1494}, {-415 , 138}, - {-419 , -100}, {-347 , 1091}, {-434 , 76}, {-138 , -291}, {-434 , -719}, {-514 , 945}, {-473 , -26}, {-144 , -320}, - {-376 , 1505}, {-329 , 374}, {-316 , -504}, { -58 , -6}, {-270 , -466}, {-507 , -540}, {-466 , -181}, {-256 , -518}, - {-196 , 726}, { -88 , -356}, {-186 , -394}, { 31 , -201}, { -77 , -319}, { 408 , 136}, { 630 , 680}, { 875 , 1365}, - {-200 , -190}, { 166 , 1289}, { 600 , 1085}, { 276 , 464}, { 567 , 1575}, { 425 , 278}, { 666 , 377}, {1209 , 2344}, - {-182 , -409}, { -95 , -141}, { 65 , 507}, { 127 , 212}, { 340 , 235}, { 481 , 408}, { 721 , 1203}, {1112 , 756}, - { 162 , 362}, { 138 , 753}, {-169 , -128}, { 187 , -32}, { 68 , -93}, { 528 , 2866}, { 786 , 789}, {1247 , 1468}, - {-476 , 2428}, { 20 , 133}, { 2 , -236}, { 426 , 799}, { 393 , 590}, { 532 , 1562}, { 807 , 534}, {1410 , 1051}, - { -14 , -263}, { 83 , -158}, { 158 , -38}, { 616 , 550}, { 845 , 543}, { 536 , 238}, { 912 , 1521}, {1635 , 1344}, - { 115 , -55}, { 263 , 87}, {-126 , 234}, { 376 , 191}, { 459 , 2644}, { 542 , 927}, { 941 , 948}, {1896 , 1528}, - { -19 , 1853}, { 455 , 366}, { 545 , 283}, { 831 , 835}, {1217 , 846}, { 560 , 542}, {1013 , 650}, {1905 , 2343} - }, - { - {-528 , -246}, {-631 , 56}, {-717 , -277}, { -40 , 1327}, {-1011 , -688}, {-827 , -341}, {-656 , -1599}, { -992 , -1559}, - {-450 , 933}, {-540 , 2109}, {-598 , -1267}, {-387 , -512}, {-1100 , -1979}, {-812 , -617}, {-649 , -147}, { -874 , 586}, - {-720 , -601}, {-281 , -279}, {-578 , 635}, { 169 , 80}, {-1020 , -134}, {-794 , 259}, {-638 , 821}, { -907 , 42}, - {-709 , -1525}, {-482 , 1340}, {-232 , -979}, { 104 , 2314}, { -918 , -1179}, {-790 , 1284}, {-609 , 2259}, { -854 , -978}, - {-624 , 326}, {-194 , 1705}, { -88 , 1060}, { 383 , 1190}, { -415 , 15}, {-789 , -1145}, {-604 , 407}, { -869 , 1136}, - {-503 , -1047}, {-545 , -794}, {-128 , 471}, { 84 , 638}, { -591 , -1509}, {-699 , 1746}, {-600 , -369}, { -784 , 1642}, - {-221 , -668}, {-223 , 261}, { -82 , -446}, {-378 , -1215}, { -741 , 969}, {-689 , -863}, {-569 , -595}, {-1012 , -403}, - {-331 , 518}, {-175 , 787}, {-220 , -3}, { -46 , -841}, { -960 , 297}, {-666 , 68}, {-565 , -1364}, { -265 , -21}, - { 649 , 767}, { 255 , 360}, { 338 , -342}, {1664 , 1627}, { 205 , -226}, { 967 , 31}, {1217 , 928}, { 1697 , 1233}, - { 322 , 1445}, { 320 , 1790}, { 413 , 212}, { 994 , 209}, { 766 , 264}, { 974 , 883}, {1228 , 241}, { 1679 , 801}, - { 75 , 312}, { 754 , 1425}, { 348 , 621}, { 644 , 474}, { 1008 , 763}, {1036 , 2024}, {1354 , 530}, { 1611 , 2129}, - { 162 , 931}, { 883 , 822}, { 990 , 488}, { 615 , -203}, { 1929 , 1234}, {1059 , 1375}, {1382 , 1426}, { 2048 , 1599}, - { 602 , 162}, { 380 , 820}, { 709 , 1064}, {1168 , 1374}, { 549 , 583}, {1062 , 470}, {1415 , 1092}, { 2095 , 2234}, - { 187 , -630}, { 118 , -493}, { 714 , 1787}, {1298 , 673}, { 957 , 1258}, {1082 , 1124}, {1460 , 786}, { 2124 , 1205}, - { 34 , -189}, { 54 , -35}, { 798 , 0}, { 747 , 2378}, { 1420 , 1152}, {1118 , 1673}, {1492 , 2287}, { 2416 , 1618}, - {1159 , 1795}, { 389 , -126}, {1194 , 1003}, {1578 , 1002}, { 1294 , 366}, {1148 , 694}, {1513 , 1791}, { 2746 , 2096} - } -}; - -const Word16 SN_TCVQ_CB_SUB2_fx[2][64][2] = -{//Qlog2(2.56) - { - {-709 , -609}, {-615 , -1025}, {-430 , -321}, { -44 , 1032}, {-1050 , -32}, {-1028 , -1856}, {-970 , -109}, { -572 , -1426}, - {-568 , 154}, {-142 , -189}, { -80 , 533}, { -38 , -632}, { -391 , 1275}, { -986 , -732}, {-479 , -510}, { -966 , 96}, - {-847 , -1387}, {-895 , 607}, {-368 , -930}, {-386 , 352}, { -290 , 10}, { -833 , 94}, {-528 , 1718}, { -210 , 115}, - {-529 , 857}, {-727 , -230}, {-128 , 31}, { 133 , 76}, { -275 , -777}, { -615 , -1367}, {-339 , -13}, {-1035 , 1231}, - { 448 , 851}, { 599 , 106}, {1103 , 1112}, { 635 , 1249}, { 761 , 774}, { 531 , -71}, { 722 , 473}, { 767 , 413}, - { 258 , 276}, { 346 , -380}, { 487 , 504}, {1114 , 122}, { 882 , 1553}, { 1983 , 1239}, {2126 , 1217}, { 1742 , 1262}, - { 135 , -252}, { 216 , 545}, { 500 , -125}, {1379 , 1910}, { 304 , 76}, { 1509 , 609}, {1543 , 1385}, { 542 , 1831}, - {-240 , -467}, { 771 , 652}, { 913 , 280}, {1307 , 716}, { 1834 , 1029}, { 1049 , 491}, {1624 , 733}, { 2495 , 1944} - }, - { - {-729 , -852}, {-590 , 306}, {-398 , 295}, { -31 , 13}, {-659 , -75}, {-604 , -1229}, {-519 , -675}, {-823 , 47}, - {-755 , -207}, {-818 , -424}, {-705 , -1285}, {-258 , -828}, {-807 , -707}, {-182 , -712}, {-928 , 3}, {-455 , -1149}, - {-844 , 422}, {-596 , -1008}, {-504 , -470}, {-459 , 737}, {-338 , -728}, {-836 , 1028}, {-613 , 1242}, {-609 , 1292}, - {-285 , 36}, {-280 , -424}, { 100 , 126}, {-459 , -135}, {-159 , -151}, {-287 , 190}, { 56 , -262}, {-264 , -317}, - { -8 , 603}, { 63 , 301}, { 537 , -155}, { 289 , 569}, { 193 , -412}, { 864 , 79}, { 686 , 399}, { 842 , 1657}, - { 115 , -211}, { 608 , 340}, { 12 , -650}, { 711 , 1103}, { 101 , 510}, { 358 , -416}, {1266 , 453}, { 532 , 612}, - {-256 , -680}, { 41 , 1163}, { 597 , 793}, { 484 , -61}, { 476 , 256}, {1729 , 1246}, {1209 , 1483}, {1472 , 1113}, - { 389 , 330}, { 176 , -388}, {1025 , 317}, {1049 , 732}, {1480 , 1108}, {1285 , 616}, {1730 , 999}, {2001 , 1669} - } -}; -const Word16 SN_TCVQ_CB_SUB3_fx[4][32][2] = -{//Qlog2(2.56) - { - {-377 , -872}, {-407 , 801}, {-611 , -449}, {-397 , -87}, {-476 , -1063}, {-797 , -249}, {-263 , -662}, {-473 , 1508}, - {-716 , 310}, {-616 , -982}, {-742 , -1326}, { 197 , 327}, {-894 , -1556}, {-871 , -1259}, {-708 , -1380}, {-789 , -848}, - { 64 , -313}, { -59 , -547}, { -2 , 67}, { 363 , -167}, { 633 , 1840}, { 232 , -357}, {1243 , 1492}, {1640 , 973}, - { 203 , 518}, { 511 , 946}, { 612 , 241}, {1085 , 724}, { 811 , 326}, { 863 , 241}, { 556 , 534}, {1956 , 2087} - }, - { - {-948 , 28}, {-827 , -1180}, {-348 , -331}, { -36 , 216}, {-1453 , -1162}, {-682 , -639}, {-747 , -1517}, {-704 , 1228}, - {-535 , -988}, {-550 , -109}, {-478 , 580}, {-310 , -699}, {-1308 , -225}, {-775 , -1581}, {-831 , -613}, {-120 , -222}, - { 32 , 200}, { 120 , -221}, { 470 , 466}, { 808 , 313}, { 950 , 711}, { 430 , -576}, {1984 , 1405}, {1645 , 887}, - { 131 , 1148}, { 286 , 508}, { 342 , -236}, {1003 , 1202}, { 317 , -726}, {1493 , 732}, {1336 , 694}, {2382 , 1772} - }, - { - {-874 , -374}, {-237 , 26}, { 15 , 870}, {-710 , 433}, { 40 , -769}, {-1059 , -1350}, { 65 , 208}, {-1012 , -1369}, - { -79 , -459}, {-671 , -942}, { -12 , 56}, {-162 , -431}, {-820 , -1073}, { -886 , -136}, {-327 , -501}, { -55 , -14}, - { 652 , 647}, { 365 , 411}, { 614 , 252}, { 154 , 215}, { 12 , 62}, { 226 , 177}, {1689 , 1213}, { 751 , 179}, - { 31 , 182}, { 281 , -291}, {-354 , -642}, { 939 , 924}, { 619 , 90}, { 1675 , 1130}, { 827 , 272}, { 1550 , 1446} - }, - { - {-366 , -916}, {-346 , -234}, {-518 , -140}, { 26 , 305}, {-254 , -92}, {-634 , -976}, {-493 , -1076}, {-334 , -913}, - {-566 , 68}, { 102 , 216}, {-296 , -927}, {-501 , -1030}, {-437 , -1006}, {-146 , -145}, {-211 , -202}, { 62 , 359}, - { 163 , -122}, { 759 , 553}, { 82 , 207}, {-177 , -243}, { 163 , 343}, {1152 , 929}, { 197 , 248}, { 43 , -147}, - { 169 , 371}, {-468 , -1043}, { 686 , 418}, { 563, 245}, {1052 , 843}, { 259 , 341}, {1063 , 637}, { 865 , 654} - } -}; - - -const Word16 AR_SVQ_CB1_fx[32][8] = /* x2.56 */ -{//Qlog2(2.56) - { -1, 4, 16, 4, 45, -110, 10, 167, }, - { -3, 2, 8, -12, -7, 23, 279, -46, }, - { 0, 2, 1, 8, -73, -40, 71, -97, }, - { 0, 2, 42, 74, -39, 72, 27, 8, }, - { 0, 1, 9, -6, 40, -65, -55, -128, }, - { 0, 0, 8, -10, -43, 105, -5, -126, }, - { 0, 0, 12, -3, -98, -18, -88, -73, }, - { 0, 1, -6, -12, -49, -179, -30, -15, }, - { -1, 0, 24, 78, 25, -69, -26, -14, }, - { 0, 1, -1, -29, 23, -65, -126, 34, }, - { 2, -4, -23, -7, -13, -2, -22, -4, }, - { -1, 1, -2, 44, -54, -58, 107, 60, }, - { 0, 1, -3, -15, -54, 97, -100, 41, }, - { 0, -2, -81, 93, -13, 18, -31, -75, }, - { -1, 2, 0, -5, 166, -64, -48, 8, }, - { -2, 0, -27, -108, 36, 3, 12, -80, }, - { 0, 0, 0, 4, 82, -1, 79, 54, }, - { 1, -4, 5, -9, -38, 289, 16, 16, }, - { -1, 2, 6, -68, 61, 67, -31, 100, }, - { 3, -6, 2, -2, -1, -6, -217, 273, }, - { 0, 1, -43, -62, -7, -60, 28, 78, }, - { -1, 2, 10, 0, 76, 84, -55, -45, }, - { -1, -2, 4, 5, -32, 75, 70, 176, }, - { 2, -1, 0, 6, 27, 29, -220, -97, }, - { -1, 1, 90, -56, -10, -16, 29, 8, }, - { -1, 3, -10, 0, 2, -24, 49, -336, }, - { -1, 1, -8, -9, 55, -134, 105, -44, }, - { 0, 1, -16, 69, 51, 40, -51, 98, }, - { 0, 2, -12, -32, -140, 49, 50, 26, }, - { 0, 3, 8, 29, 77, 24, 76, -103, }, - { -1, 2, -24, -18, 7, 100, 94, 5, }, - { 0, -1, 10, 26, -87, -34, -56, 103, } -}; - -const Word16 AR_SVQ_CB2_fx[16][8] = /* x2.56 */ -{//Qlog2(2.56) - { -37, -59, 208, -88, 54, 58, -16, -24, }, - { 0, -98, 9, -65, -182, -21, 19, 9, }, - { -1, 110, -8, 59, 201, 9, -38, -22, }, - { -1, 40, -22, -183, 46, -162, -38, -6, }, - { 12, 2, -193, 64, -43, -48, 11, 9, }, - { -83, 175, -8, -55, -65, 66, 26, 6, }, - { 29, 3, 2, -10, -100, 293, 75, -12, }, - { 7, -54, -76, -91, 63, 119, -84, -84, }, - { 3, 7, 6, 6, -30, 15, -176, 168, }, - { -10, 45, 26, 57, -92, -68, -117, -134, }, - { 0, -37, -34, -69, 106, 54, 121, 131, }, - { -25, -64, 7, 205, 1, 93, 27, 6, }, - { 64, 28, 51, 8, -7, 18, 27, 0, }, - { -20, 44, 57, 78, -55, -170, 88, 93, }, - { 12, -125, 12, 56, 100, -160, -87, -3, }, - { -7, -18, -7, -6, 36, -54, 175, -176, } -}; - - -const Word16 W_DTX_HO_FX[HO_HIST_SIZE] = /* Q15 */ -{ - 6554, 5243, 4194, 3355, 2684, 2147, 1718, 344 -}; - - -const Word16 ENR_ATT_fx[5] = /*Q8*/ -{ - 459, 357, 281, 255, 255 -}; - - -const Word16 HO_ATT_FX[5] = /* Q15 */ -{ - 17597, 20205, 22410, 23198, 23198 -}; - -const Word16 uniform_model[] = { MAX_AR_FREQ, MAX_AR_FREQ / 2, 0 }; // Q0 - - -/*-----------------------------------------------------------------* - * LSF quantization - mid-frame quantization tables - *-----------------------------------------------------------------*/ - - -const Word16 tbl_mid_gen_wb_2b_fx[] =//Q13 -{ - 3814, 5145, 5856, 5290, 5277, 4880, 4877, 4273, 3868, 3776, 3392, 3163, 3120, 3019, 3395, 5814, - 1482, 861, 1968, 3198, 3105, 3737, 3749, 4525, 4982, 4828, 5023, 5335, 5327, 5296, 5092, 3444, - 3955, 3851, 1520, 1666, 1554, 1385, 1537, 1276, 1443, 1526, 1597, 1636, 1867, 2041, 2483, 2059, - 7038, 8112, 7324, 6969, 6877, 7028, 6987, 7098, 7003, 6955, 6927, 6808, 6685, 6459, 5871, 6047, -}; - -const Word16 tbl_mid_gen_wb_4b_fx[] = -{//Q13 - 5532, 5133, 2125, 3516, 4905, 5624, 6338, 6918, 6854, 6354, 5345, 3996, 3603, 5588, 6962, 7511, - 4218, 4157, 4892, 6332, 5786, 2931, 2749, 2306, 3420, 4629, 5591, 6249, 6638, 7273, 7904, 8379, - 993, 369, 2927, 5138, 4840, 5892, 5331, 5158, 3956, 3130, 3324, 5022, 5292, 3974, 2488, 1119, - 1067, 2471, 6356, 4184, 3166, 3224, 3980, 5055, 4965, 4822, 3843, 2328, 1438, 916, 2514, 8248, - 3788, 949, 522, 1709, 1932, 3306, 3287, 4521, 5432, 5291, 5644, 6116, 6166, 5943, 5631, 2088, - 7865, 8237, 6466, 4043, 3793, 4589, 4885, 5405, 6002, 6746, 7203, 7361, 6982, 6157, 3994, 2143, - 2837, 7217, 7926, 7751, 7605, 7549, 6937, 6852, 6270, 5895, 5612, 5245, 4862, 3654, 3139, 6321, - 4317, 3387, 1035, 2799, 2769, 3400, 3054, 2246, 2307, 1829, 1456, 1007, 1055, 895, 782, 108, - 7164, 8021, 6869, 6458, 6311, 5505, 5577, 4491, 3934, 3760, 3244, 2798, 2498, 2166, 1950, 4759, - 5758, 5400, 1203, 687, 647, 963, 1486, 2000, 2998, 3179, 3634, 4296, 4465, 3719, 3275, 4785, - 1051, 1802, 6133, 6475, 6875, 6981, 7181, 7303, 7136, 7036, 7276, 7197, 6986, 7118, 6659, 5813, - 4095, 6275, 6049, 4850, 3198, 4942, 3257, 1456, 1327, 504, 559, 1472, 3985, 5835, 5772, 7356, - 6814, 7430, 4049, 2579, 4315, 2443, 3236, 3107, 2458, 2891, 2553, 1923, 1871, 2068, 3583, -188, - 412, 238, 247, 507, 498, 540, 811, 767, 679, 480, 416, 306, 574, 532, 731, 2227, - 8495, 9589, 8346, 7953, 7655, 7990, 8089, 8412, 8530, 8482, 8421, 8420, 8464, 8242, 7698, 7341, - 3085, 2920, 3059, 3020, 1227, -101, -417, -872, -195, 1126, 1766, 2513, 2649, 3451, 4444, 1734 -}; - - -const Word16 tbl_mid_gen_wb_5b_fx[] = -{//Q13 - 6510, 8058, 7103, 6095, 6483, 5866, 6026, 6443, 6882, 6907, 7015, 6581, 5649, 4044, 2816, 2519, - 3778, 2123, 3580, 4221, 2598, 4631, 2844, 4905, 5446, 4529, 5186, 6228, 6210, 5693, 6213, -4670, - 9050, 9934, 8441, 7921, 7546, 7840, 7977, 8335, 8679, 8706, 8703, 8607, 8560, 8375, 7759, 6405, - 4243, 5775, 2939, 5887, 4078, 3117, 5267, 5680, 4589, 2401, 731, 1011, 1657, 4733, 7051, 3992, - 2508, 3156, 3347, 1605, 4450, 4633, 3476, 6019, 4083, 3824, 5133, 6020, 3253, 1368, 1736, 13507, - 5934, 6372, 4494, 2957, 4424, 6667, 8167, 8413, 7957, 7139, 5518, 3059, 2829, 2821, 2773, 3274, - 4984, 5566, 5831, 4556, 5732, 6738, 6689, 4683, 2265, 4214, 7242, 9989, 9776, 9068, 4748, 2292, - 2601, 4933, 2764, 4923, 3763, 3678, 5596, 2079, 6108, 6824, 5507, 5612, 6793, 5553, 1140, 9993, - 7084, 6685, 5313, 5196, 3111, 5337, 3535, 2476, 2477, 1737, 2090, 4033, 5680, 6548, 7310, 11811, - 8140, 8602, 7166, 6738, 6018, 5299, 5686, 4722, 4108, 4456, 3713, 3131, 2658, 2336, 2250, 8051, - 727, 1865, 6073, 3932, 2258, 2413, 4823, 5733, 5101, 6126, 4690, 1130, 1172, 1479, 3956, 7204, - 6042, 1024, 5371, 5997, 4964, 5575, 5078, 5843, 6909, 8465, 8601, 6137, 5699, 8049, 9922, 8318, - 2728, 1625, 4750, 5004, 5799, 4938, 6353, 3274, 1781, 3095, 1479, 3136, 5470, 1391, -626, 2422, - 4407, 3228, 1266, 1488, 1222, 963, 1148, 1182, 1330, 1770, 860, 381, 813, 1268, 2352, 3956, - 1683, -120, 83, 1239, 946, 1609, 1982, 3215, 3950, 4200, 4497, 4898, 4551, 3595, 2345, 2444, - 1055, 3207, 7460, 6808, 7103, 6980, 7902, 8196, 6821, 6190, 6405, 7414, 7967, 7506, 6921, 9871, - 3164, 7995, 8446, 8770, 8443, 8302, 7372, 7049, 6090, 5698, 5090, 4792, 4996, 4874, 4285, 6685, - 3681, 319, 536, 3174, 4495, 5486, 5807, 5751, 5461, 4423, 3556, 3449, 5148, 7560, 6277, 3783, - 1987, 4209, 6954, 5880, 7459, 7762, 4326, 4958, 5154, 2150, 2988, 2469, 1175, 1099, 3999, 3950, - 1306, 2303, 7748, 8238, 6116, 2824, 1772, 1130, 2538, 3345, 5317, 4773, 3668, 5458, 5519, 5594, - 4140, 4329, 3339, 3001, 2669, -79, -582, -1729, -680, 1294, 2752, 3700, 3627, 4428, 4950, 2744, - 5309, 3611, 993, 3526, 2043, 3938, 2069, 1434, 4173, 2609, 2704, 3690, 3686, 1894, 1401, -1682, - 6091, 4810, 970, 1063, 1707, 3056, 4597, 6742, 7397, 6913, 7359, 7884, 7571, 6830, 6039, 3823, - 6599, 6006, 1248, 4330, 6935, 3784, 3535, 3902, 3221, 5384, 5691, 5997, 5975, 6731, 9125, 5385, - 204, 242, 2009, 3375, 3412, 3407, 2691, 2547, 598, -150, 67, 250, 618, 1185, 1987, 1157, - 4986, 7977, 6971, 1528, 86, 281, 1497, 3002, 4193, 4430, 4721, 5317, 6001, 6181, 6962, 5480, - 6914, 7963, 5254, 3050, 5365, 3224, 3781, 3044, 2571, 3155, 2243, 1612, 2157, 2526, 2784, -1629, - 7350, 6702, 2435, 1937, 2549, 1978, 2819, 2817, 2059, 2493, 3408, 2344, 1239, 1177, 914, 3763, - 4362, 3105, -1457, -1760, 314, 1452, 2603, 1642, 1670, 1652, 2258, 2492, 3844, 4399, 5213, 660, - 350, 357, 109, 83, -555, -886, -714, -587, -120, 25, 189, 531, 591, 146, 156, 1435, - 498, 211, 3062, 6766, 7150, 8142, 7531, 7527, 7855, 6898, 6613, 6480, 5290, 4310, 5341, 4129, - 2753, 6959, 7088, 4622, 2646, 2395, 1756, 325, 488, 259, -125, -577, -553, 615, 557, 4617, -}; - - - -const Word16 tbl_mid_voi_wb_1b_fx[] = /* Q13*/ -{ - 4551, 4599, 4754, 5035, 4982, 5228, 5318, 5603, 5699, 5652, 5642, 5766, 5825, 5874, 5819, 6056, - 3816, 3355, 2321, 2712, 2900, 2715, 2790, 2508, 2506, 2610, 2617, 2419, 2538, 2622, 3004, 2725, -}; -const Word16 tbl_mid_voi_wb_4b_fx[] =//Q13 -{ - 4337, 4235, 3526, 4083, 3514, 5457, 3168, 2509, 4418, 5021, 1313, 2952, 5347, 3893, 8325, 11758, - 4180, 4037, 3965, 3481, 4028, 3284, 2644, 4585, 4749, 3076, 3211, 1101, 4175, 7440, 5745, -4105, - 4239, 3957, 4450, 4974, 5400, 5734, 6246, 6586, 7774, 2699, 2783, 3474, 1345, -316, 5069, 4904, - 3964, 3810, 2673, 3031, 2249, 3168, 3155, 4204, 7316, 7176, 8680, 7147, 4918, 4136, 3142, 3011, - 4071, 3853, 3898, 3973, 3464, 2878, 5783, 5341, 1725, 801, 1194, 4239, 6866, 4950, 794, 6270, - 3933, 3750, 4931, 3667, 3585, 2550, 4308, 5757, 4503, 7081, 4893, 1076, 109, 1650, 1887, 8861, - 4803, 4827, 4969, 5511, 5768, 4327, 5277, 4934, 6909, 7672, 5355, 3940, 9990, 9622, 7457, 4202, - 4515, 4259, 2444, 4847, 3728, 4599, 4975, 6144, 4087, 4367, 7025, 5028, 2405, 7014, 13366, 6264, - 4746, 4556, 5408, 5866, 4733, 4088, 3965, 3329, 4669, 3105, 5918, 7824, 6026, 9177, 1856, 13229, - 4130, 4214, 2516, 3542, 4847, 3751, 3704, 2380, 4190, 4787, 4651, 4981, 5702, -27, -2961, 129, - 4461, 4724, 5233, 4680, 6010, 7222, 6351, 3069, 605, 5934, 5627, 3836, 3490, 6060, 3556, 2585, - 4628, 4723, 5465, 4180, 4460, 6173, 5915, 7260, 4703, 4114, 3938, 9585, 8085, 3781, 7520, 625, - 5002, 5621, 6352, 6914, 7170, 7719, 7585, 8408, 8360, 7883, 7370, 7222, 6616, 6002, 5565, 9394, - 4059, 4121, 4178, 4417, 3437, 1460, 1031, 111, 585, 1708, 4219, 5419, 2585, 3195, 6149, 3221, - 3394, 2776, 1970, 2707, 2983, 3931, 3247, 1729, 449, -109, -46, -469, 397, 1980, 2305, 1573, - 3259, 1870, 242, 392, 748, 615, 1185, 1285, 2259, 2687, 2212, 1762, 2174, 1887, 1847, 2073, -}; -const Word16 tbl_mid_voi_wb_5b_fx[] =//Q13 -{ - 4182, 3820, 4103, 5620, 4100, 4478, 3949, 5053, 2918, 3083, 4229, 3732, 1823, 6350, 17230, 4601, - 4361, 4077, 2236, 4128, 3216, 4673, 6022, 6522, 5746, 4282, 3121, 4448, 6457, 12573, 4401, 7796, - 4228, 4086, 4375, 4320, 4474, 4735, 4427, 5616, 5975, 138, 5887, 3722, 2304, -3430, 4995, 6246, - 4320, 4344, 4008, 4327, 3323, 6835, 3627, 3330, 3123, 3971, 2382, 1801, 6422, 3162, 9038, 14129, - 4193, 4202, 4413, 2703, 4175, 4330, 2615, 7600, 1717, 3506, 5671, 7170, 3545, 2350, -2738, 7287, - 4170, 3912, 4323, 3821, 4450, 6765, 7496, 8107, 7447, 5525, 3088, 1963, 2014, 3330, 976, 1002, - 4583, 4419, 3584, 4125, 4783, 5133, 3188, 5000, 4812, 4639, 10038, 7018, 5114, 5567, 3292, -6364, - 3926, 4092, 2710, 2721, 1799, 3509, 4542, 3351, 4583, 5877, 6539, 5135, 981, 4029, 7221, 592, - 4624, 4567, 4468, 4630, 5710, 5222, 5883, 2562, 8453, 2825, 109, 6491, 1210, 2921, 7292, 7118, - 4245, 4160, 5119, 4356, 5544, 3034, 1507, 4179, 5971, 1949, 3388, 613, 4995, 9019, 6755, -628, - 4905, 4962, 4529, 7025, 4905, 4470, 5063, 3440, 6348, 6102, 4319, 4395, 7515, 6549, -3697, 6513, - 4683, 4592, 5303, 4593, 4171, 5264, 6116, 7434, 4105, 5454, 2544, 8493, 6491, 894, 8983, -2406, - 3632, 3435, 3988, 4195, 3684, 2173, 6735, 4552, -339, 763, 308, 3463, 6123, 2895, 2831, 5715, - 4316, 4111, 2236, 2682, 1058, 544, 2541, 1677, 3549, 2767, 3376, 5901, 6689, 5811, 6617, 3311, - 4487, 4285, 4992, 3656, 5970, 4547, 3975, 5998, 4985, 6614, 4807, 1971, 14937, 4388, 6153, 3352, - 4601, 4710, 4957, 4454, 4873, 7207, 5881, 3461, 2282, 1829, 5617, 9926, 10043, 7722, 3232, 4629, - 3965, 3837, 2088, 4265, 5042, 3478, 4453, 2804, 4162, 4858, 4315, 4343, 5193, -1823, -5028, -1137, - 3439, 2837, 2549, 4062, 2857, 2657, 2662, 5088, 10548, 8913, 6631, 6395, 5568, 3210, 2431, 3400, - 4073, 3839, 5806, 5296, 3766, 2342, 2585, 891, 3144, 2988, 6807, 4626, 3700, 5854, 1543, 16158, - 4189, 4045, 4293, 4527, 4008, 1413, 4871, 6081, 3297, 6546, 5006, -365, -2369, 1375, 5522, 8787, - 4778, 4782, 4941, 4538, 4497, 3129, 4934, 4371, 7175, 6923, 8620, 10236, 8664, 10088, 10923, 7314, - 4945, 5016, 6439, 6353, 6624, 6463, 6938, 7547, 7004, 7283, 7655, 7149, 7650, 2747, 3416, 14892, - 4776, 5431, 5515, 6194, 5700, 5485, 2795, 5476, 4024, 8891, 2930, 7916, 3428, 8070, 5920, 13440, - 4718, 4986, 4800, 5286, 6567, 6554, 6601, 1235, -1216, 6556, 6098, 3962, 4361, 5536, 5517, 3935, - 4741, 4679, 5593, 4891, 3849, 5675, 6487, 6239, 7062, 12044, 10918, 2438, 3977, 7296, 8445, 6625, - 4859, 5781, 6592, 7399, 8027, 8858, 8139, 8951, 8760, 5506, 6294, 6540, 6516, 7527, 7688, 4084, - 4077, 3771, 3650, 3381, 3367, 4048, 3899, 4382, 3017, -2156, -1464, -2207, 828, 4838, 2071, 2363, - 3796, 3437, 3558, 3842, 2170, 4311, 2602, 696, 1939, 2576, 1239, 328, -129, -647, 1702, 2893, - 4015, 3506, 367, 1350, 3328, 3700, 3827, 2439, 1434, 3887, 2279, 1593, 3673, 5508, 3905, -2973, - 4088, 3990, 3732, 3256, 4718, 1375, 152, -99, -254, 1140, 3578, 3316, 2195, 2408, 5027, 999, - 3749, 3175, 1475, 686, 2006, 1959, 1558, 3059, 5374, 5014, 2439, 2396, 2467, 2218, 1031, 7866, - 2037, 701, 124, 278, 328, 253, 660, 528, 826, 473, 801, 800, 1053, 1330, 804, 967, -}; - - -const Word16 tbl_mid_unv_wb_4b_fx[] =//Q13 -{ - 5190, 3143, 50, 2521, 5180, 6320, 3890, 3365, 3582, 3517, 3406, 3049, 2864, 1621, 1932, -950, - 6813, 6650, 2135, 972, 452, 1453, 3221, 1697, 3165, 4443, 5924, 6297, 3907, 2862, 3586, 4625, - 3204, 2673, 6499, 4319, 1054, 559, 4404, 5815, 5072, 6625, 4493, 2479, 1773, 1606, 2099, 8330, - 1924, 2666, 4171, 5517, 5898, 7238, 7318, 7696, 7250, 6269, 6164, 6038, 5249, 4284, 4147, 2828, - 2834, 788, 77, 2016, 1824, 3224, 3441, 4472, 6286, 6717, 6783, 6743, 6715, 7051, 6562, 2531, - 6386, 5634, 5761, 5184, 3523, 4284, 1867, 1045, 579, 1176, 1743, 2599, 5276, 5564, 5368, 7914, - 1795, 1380, 5184, 9326, 8023, 3138, 1258, 1729, 3328, 3934, 5169, 5645, 5271, 5894, 5591, 5145, - 5734, 5844, 8799, 8753, 5628, 5710, 5255, 4872, 5349, 3431, 3006, 2486, 1418, 974, 1115, 2035, - 4194, 8421, 1812, 6078, 3003, 3455, 6719, 7501, 2120, 1892, 2658, 2317, 2296, 5735, 6553, 4485, - 8072, 11456, 6455, 5069, 4918, 4936, 4819, 4932, 6029, 6246, 6289, 6704, 6749, 5337, 4526, 3974, - 3709, 5584, 4884, -1502, 4864, 2333, 606, 5976, 6438, 2413, 1937, 3663, 5593, 6989, 6450, 3555, - 3843, -6887, 3697, 3880, 4448, 4264, 5961, 4198, 3583, 3942, 3606, 3768, 4457, 4374, 4096, 4524, - 2551, 6781, 7017, 2902, 9227, 8728, 7130, 1873, 2308, 4393, 3981, 3976, 4002, 4080, 4820, 5611, - 220, -174, -43, -542, 449, 1470, 1759, 1893, 1294, 995, 723, 723, 769, 994, 1369, 4413, - 1651, 2259, 3079, 2913, 1176, -491, -1262, -827, -217, 908, 1126, 1751, 1901, 1765, 2656, 247, - 5380, 7307, 7727, 8135, 8270, 8471, 8792, 8573, 8335, 8420, 8057, 7562, 7119, 7458, 6806, 7385, -}; -const Word16 tbl_mid_unv_wb_5b_fx[] = -{//Q13 - 6237, 6323, 1151, 763, 4218, 6546, 8437, 8701, 7456, 6604, 4631, 2901, 3050, 1793, 1955, 2260, - 5542, 4318, 5343, 5521, 5999, 5477, 5265, 5234, 4616, 3329, 3444, 1816, -442, 45, -2, 8922, - 6370, 8208, 6583, 5630, 5401, 5458, 5188, 5595, 6637, 6891, 6962, 6967, 7014, 6330, 5445, 3101, - 2750, 2858, 5206, 4594, 3310, 3494, 2463, 3410, 3405, 6151, 7682, 8593, 4440, 3715, 2946, -4371, - 1157, 661, 3743, 6418, 7515, 8319, 7485, 7298, 7928, 7515, 6812, 5671, 5095, 5122, 4997, 3940, - 5133, 3446, 2693, 1620, 1860, 2663, 4603, 6289, 7451, 7255, 7511, 7486, 8869, 8704, 8431, 6632, - 2497, 6706, 7036, 3437, 10854, 8893, 6033, 3021, 2936, 4766, 4145, 4097, 5177, 4883, 5920, 7612, - -152, -54, 3955, 1170, 5562, 4695, 1370, 8293, 3106, 1942, 5508, 4878, 3495, 1094, 1079, 5401, - 482, 373, 220, -355, -236, -328, -426, -147, 244, 563, 567, 915, 1012, 676, 804, 2721, - 437, 816, 3208, 3395, 2501, 3795, 4380, 2553, 399, 31, -519, -475, -162, 1755, 2852, 1040, - 2067, 2125, 1247, 2393, 2872, 2218, 3502, 3977, 4712, 4275, 2600, 2380, 2314, 2893, 3555, 13929, - 3967, -635, -1752, 2490, 303, 969, 1045, 2839, 5670, 4651, 5202, 5248, 4182, 4381, 5492, 53, - 3041, 2494, 9264, 4970, 360, -3795, 6296, 6475, 4482, 6667, 5265, 2908, 2381, 2889, 3718, 5160, - 3364, 4119, 5929, 3164, -745, 9368, 1652, -719, 6323, 5113, 1919, 1260, 2630, 3585, 2224, 3178, - 1643, 837, 8074, 8337, 4237, 2332, 2190, -1176, 1968, 1238, 2354, 4756, 5269, 5759, 4962, 5411, - 7590, 6471, 2635, 1869, 1209, 1505, 2118, 892, 1652, 3717, 5010, 3969, 2265, 2428, 3278, 5027, - 7289, 8658, 11183, 8913, 6084, 6673, 5961, 4041, 3839, 2643, 2094, 3215, 2956, 2895, 3327, 5063, - 5814, -4982, 1120, 2112, 4384, 5288, 6052, 4305, 4724, 5062, 3380, 4200, 5838, 7181, 6383, 4771, - 3891, 7361, 4160, 1422, 4971, 939, 281, 3585, 4817, 1176, -306, 260, 3815, 8273, 7095, 1529, - 8179, 19416, 3518, 3547, 4619, 4231, 3359, 3606, 5131, 4469, 5204, 5115, 4941, 4772, 4175, 5160, - 4539, 5393, 2706, 5371, 1468, 8488, 10356, 2778, 1426, 371, 8093, 7808, 5208, 5996, 6081, 5057, - 3266, 3481, -4953, -5638, 4022, 5502, 3586, 3117, 2737, 3826, 3658, 3933, 3602, 4920, 4959, 3483, - 3846, 9592, 3360, 6480, 1215, 3170, 5218, 8641, 664, 2695, 3353, 1479, 1687, 6049, 7074, 4696, - 2231, 4497, 6761, 6799, 5941, 5445, 8083, 7944, 5879, 3744, 2518, 6482, 6581, 6096, 6379, -133, - 3360, 6078, 1064, 13807, 8185, 3605, 4327, 3777, 6211, 4977, 5015, 4871, 5825, 2506, 2130, 4946, - 5412, 4507, 952, 4098, 5027, 3949, 3501, 1778, 1955, 2126, 1626, 3669, 4446, -1101, 736, -2708, - 4824, 7481, 8884, -2619, -2754, 281, 4158, 3251, 4602, 2946, 3915, 6169, 6075, 3495, 3266, 4375, - 6135, 2668, 6784, 10326, 6892, 5479, 1511, 3070, 6410, 9193, 6954, 1084, 2873, 7030, 8139, 5670, - 7255, 5764, 5122, 5787, 3129, 5475, -2720, 3770, -827, 872, 1591, 4645, 7218, 5513, 5778, 6323, - 1185, -13100, 5560, 5867, 4153, 2591, 4923, 3450, 2062, 4251, 4289, 3397, 3835, 2082, 2343, 3172, - 4460, 4411, 3940, 4420, 9410, -2789, -2525, -2877, -1868, 2850, 4490, 4093, 3162, 3889, 3800, 3492, - 6408, 8292, 8434, 8544, 8707, 9146, 9377, 9301, 9063, 8945, 8346, 8173, 7175, 7254, 6120, 7420, -}; - - -/*------------------------------------------------------------------------------* - * AVQ - RE8 tables - *------------------------------------------------------------------------------*/ - -const Word16 select_table22[5][9] = -{ - {1, 1, 1, 1, 1, 1, 1, 1, 1}, - {0, 1, 2, 3, 4, 5, 6, 7, 8}, - {0, 0, 1, 3, 6, 10, 15, 21, 28}, - {0, 0, 0, 1, 4, 10, 20, 35, 56}, - {0, 0, 0, 0, 1, 5, 15, 35, 70} -}; // Q0 - -/* value of leader element */ -const Word16 vals_a[36][4] = -{ - {1}, {0,2}, {0,2}, {1,3}, {0,4}, {2,0}, {1,3}, {0,2,4}, - {2}, {1,3}, {2,0,4}, {0,4}, {1,5}, {1,3}, {2,0,4}, {0,2,4}, - {1,3,5}, {0,2,6}, {0,4}, {0,2,6}, {0,2,4,6}, {1,7}, {0,8}, {0,6}, - {0,2,8}, {0,4,8}, {1,9}, {0,2,10}, {0,8}, {0,6,10}, {0,12}, {0,4,12}, - {0,10}, {0,2,14}, {0,8,12}, {0,16} -}; // Q0 - -/* code parameter for every leader */ -const Word16 vals_q[36][4] = -{ - {7,1}, {2,2,2}, {4,2,4}, {7,2,1}, {1,2,1}, {6,2,2}, {7,2,2}, {3,3,3,1}, - {8,1}, {7,2,3}, {5,3,4,1}, {2,2,2}, {7,2,1}, {7,2,4}, {7,3,2,1}, {4,3,4,2}, - {7,3,2,1}, {2,3,2,1}, {3,2,3}, {4,3,4,1}, {3,4,3,2}, {7,2,1}, {1,2,1}, {2,2,2}, - {3,3,3,1}, {2,3,2,1}, {7,2,1}, {2,3,2,1}, {2,2,2}, {2,3,2,1}, {1,2,1}, {2,3,2,1}, - {2,2,2}, {2,3,2,1}, {2,3,2,1}, {1,2,1} -}; // Q0 - -/* codebook start address for every leader */ -const UWord16 Is[36] = -{ - 0, 128, 256, 1376, 240, 0, 1792, 2400, 5376, 5632, 12800, 3744, - 21760, 22784, 31744, 38912, 45632, 3856, 52800, 53248, 57728, 60416, 4080, 61440, - 61552, 62896, 63120, 64144, 64368, 64480, 64704, 64720, 64944, 65056, 65280, 65504 -}; // Q0 - -/* A3 - Number of the absolute leaders in codebook Q3 */ -const Word16 AA3[NB_LDQ3] = -{ - 0, 1, 4, 2, 3, 7, 11, 17, 22 -}; // Q0 - -/* A4 - Number of the absolute leaders in codebook Q4 */ -const Word16 AA4[NB_LDQ4] = -{ - 5, 6, 8, 9, 10, 12, 13, 14, 15, - 16, 18, 19, 20, 21, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35 -}; // Q0 - -/* I3 - Cardinality offsets for absolute leaders in Q3 */ -const UWord16 II3[NB_LDQ3] = -{ - 0, 128, 240, 256, 1376, 2400, 3744, 3856, 4080 -}; // Q0 - -/* I4 - Cardinality offset for absolute leaders in Q4 */ -const UWord16 II4[NB_LDQ4] = -{ - 0, 1792, 5376, 5632, 12800, 21760, 22784, 31744, 38912, - 45632, 52800, 53248, 57728, 60416, 61440, 61552, 62896, 63120, - 64144, 64368, 64480, 64704, 64720, 64944, 65056, 65280, 65504 -}; // Q0 - - /* Position of the first absolute leader on a spherical shell (or sphere) */ -const Word16 Da_pos[NB_SPHERE] = -{ - 0, 2, 5, 8, 13, 18, 20, 22, 23, 25, 26, 27, 27, 28, 28, 28, - 29, 30, 31, 31, 32, 32, 32, 32, 32, 34, 35, 35, 35, 35, 35, 35 -}; // Q0 - -/* Number of absolute leaders on a spherical shell */ -const Word16 Da_nb[NB_SPHERE] = -{ - 2, 3, 3, 5, 5, 2, 2, 1, 2, 1, 1, 0, 1, 0, 0, 1, - 1, 1, 0, 1, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1 -}; // Q0 - -/* Identification code of an absolute leader */ -const Word16 Da_id[NB_LEADER] = -{ - 0x0001, 0x0004, 0x0008, 0x000B, 0x0020, 0x000C, 0x0015, 0x0024, - 0x0010, 0x001F, 0x0028, 0x0040, 0x004F, 0x0029, 0x002C, 0x0044, - 0x0059, 0x00A4, 0x0060, 0x00A8, 0x00C4, 0x012D, 0x0200, 0x0144, - 0x0204, 0x0220, 0x0335, 0x04E4, 0x0400, 0x0584, 0x0A20, 0x0A40, - 0x09C4, 0x12C4, 0x0C20, 0x2000 -}; // Q0 - -/* Codebook number for each absolute leader */ -const Word16 Da_nq[NB_LEADER+2] = -{ - 2, 2, 3, 3, 2, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 4, - 4, 3, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 0, 100 -}; // Q0 - - -/*------------------------------------------------------------------------------* - * SWB TBE tables - *------------------------------------------------------------------------------*/ - -const Word16 skip_bands_SWB_TBE[NUM_SHB_SUBFR+1] = {0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300, 320}; /* bands for SWB TBE quantisation Q0*/ -const Word16 skip_bands_WB_TBE[NUM_SHB_SUBFR/2+1] = {0, 10, 20, 30, 40, 50, 60, 70, 80}; /* bands for WB TBE quantisation Q0*/ - -const Word16 interpol_frac_shb[NB_SUBFR * 2] = -{ - 22938, 9830, 13107, 19660, 3277, 29490, 0, 32767 /* Q15*/ - /*0.7f, 0.3f, 0.4f, 0.6f, 0.1f, 0.9f, 0.0f, 1.0f */ -}; -/* All pass filter coeffs for interpolation and decimation by a factor of 2 */ -const Word16 AP1_STEEP_FX[ALLPASSSECTIONS_STEEP] = { 1985, 14072, 26500 }; /*Q15 Format */ -const Word16 AP2_STEEP_FX[ALLPASSSECTIONS_STEEP] = { 7230, 20838, 30852 }; /*Q15 Format */ -const Word16 cos_fb_exc_fx[32] = /* Q15 */ -{ - /*Q35*/ - 32767, 32138, 30274, 27246, 23170, 18205, 12540, 6393, - 0, -6393, -12540, -18205, -23170, -27246, -30274, -32138, - -32768, -32138, -30274, -27246, -23170, -18205, -12540, -6393, - 0, 6393, 12540, 18205, 23170, 27246, 30274, 32138, -}; - -const Word16 Hilbert_coeffs_fx[4 * NUM_HILBERTS][HILBERT_ORDER1 + 1] = /* Q14 */ -{ - { 0, 14320, 0, -30699, 0, 16384}, /* num_Real[0] */ - {11897, 0, -28240, 0, 16384, 0}, /* num_Imag[0] */ - {16384, 0, -30699, 0, 14320, 0}, /* den_Real[0] */ - {16384, 0, -28240, 0, 11897, 0}, /* den_Imag[0] */ - {7671, 0, -23855, 0, 16384, 0}, /* num_Real[1] */ - { 2505, 0, -18139, 0, 16384, 0}, /* num_Imag[1] */ - {16384, 0, -23855, 0, 7671, 0}, /* den_Imag[1] */ - {16384, 0, -18139, 0, 2505, 0}, /* den_Imag[1] */ -}; - - -/* Overlap add window for SHB excitation used in analysis and synthesis */ - -const Word16 window_shb_fx[L_SHB_LAHEAD] = /*sin, 1, sin */ -{ - /*Q15(round) */ - 1513, 4527, 7502, 10413, 13236, 15945, 18518, 20934, 23170, 25210, - 27034, 28627, 29976, 31069, 31898, 32454, 32733, 32767, 32767, 32767, -}; - -/* Upsampled overlap add window for SHB excitation used transition generation */ - -const Word16 window_shb_32k_fx[2 * L_SHB_LAHEAD] = -{ - /*Q15(round) */ - 1513, 3020, 4527, 6015, 7502, 8958, 10413, 11825, 13236, 14590, - 15945, 17232, 18518, 19726, 20934, 22052, 23170, 24190, 25210, 26122, - 27034, 27830, 28627, 29301, 29976, 30523, 31069, 31483, 31898, 32176, - 32454, 32593, 32733, 32751, 32767, 32767, 32767, 32767, 32767, 32767, -}; - -/* Short overlap add window for SHB excitation used in anal and synth */ - -const Word16 subwin_shb_fx[SHB_OVERLAP_LEN + 1] = -{ - /*Q15(round) */ - 0, 202, 802, 1786, 3129, - 4799, 6754, 8946, 11321, 13821, - 16384,18947, 21447, 23822, 26014, - 27969, 29639, 30982, 31966, 32566, - 32767 -}; - -const Word16 window_wb_fx[L_SHB_LAHEAD / 4] =/*sin, 1 */ -{ 7502, 18518, 27034, 31898, 32767 }; /*Q15*/ - -/* Short overlap add window for SHB excitation used in anal and synth */ - -const Word16 subwin_wb_fx[SHB_OVERLAP_LEN / 2 + 1] = -{ 0, 5126, 10126, 14876, 19261, 23170, 26510, 29197, 31164, 32365, 32767 }; // Q15 - -/* Window for calculating SHB LPC coeffs */ - -const Word16 win_lpc_shb_fx[(L_LOOK_12k8 + L_SUBFR + L_FRAME) * 5 / 8] = -{ - /*Q15 */ - 1, 4, 10, 18, 28, 40, 54, 71, 89, 110, 134, 159, 186, 216, 248, - 282, 318, 357, 397, 440, 485, 532, 581, 632, 686, 741, 799, 859, 921, - 984, 1050, 1119, 1189, 1261, 1335, 1411, 1490, 1570, 1652, 1736, 1823, - 1911, 2001, 2093, 2187, 2283, 2381, 2481, 2582, 2686, 2791, 2898, 3007, - 3118, 3230, 3345, 3461, 3579, 3698, 3819, 3942, 4067, 4193, 4321, 4451, - 4582, 4715, 4849, 4985, 5123, 5261, 5402, 5544, 5687, 5832, 5978, 6126, - 6275, 6426, 6577, 6730, 6885, 7041, 7197, 7356, 7515, 7676, 7837, 8000, - 8164, 8329, 8496, 8663, 8831, 9001, 9171, 9342, 9515, 9688, 9862, 10037, - 10213, 10390, 10567, 10745, 10924, 11104, 11285, 11466, 11648, 11830, 12013, - 12197, 12381, 12566, 12751, 12937, 13123, 13310, 13497, 13684, 13872, 14060, - 14249, 14438, 14627, 14816, 15006, 15195, 15385, 15575, 15765, 15955, 16146, - 16336, 16526, 16716, 16907, 17097, 17287, 17477, 17667, 17856, 18046, 18235, - 18424, 18612, 18801, 18989, 19176, 19364, 19551, 19737, 19923, 20109, 20294, - 20478, 20662, 20846, 21028, 21210, 21392, 21573, 21753, 21932, 22111, 22289, - 22466, 22642, 22818, 22992, 23166, 23339, 23510, 23681, 23851, 24020, 24188, - 24355, 24520, 24685, 24848, 25011, 25172, 25332, 25491, 25648, 25804, 25960, - 26113, 26266, 26417, 26567, 26715, 26862, 27007, 27152, 27294, 27435, 27575, - 27713, 27850, 27985, 28119, 28251, 28381, 28510, 28637, 28762, 28886, 29008, - 29129, 29248, 29364, 29480, 29593, 29705, 29815, 29923, 30029, 30133, 30236, - 30337, 30435, 30532, 30627, 30720, 30811, 30901, 30988, 31073, 31156, 31238, - 31317, 31394, 31469, 31543, 31614, 31683, 31750, 31815, 31878, 31938, 31997, - 32054, 32108, 32161, 32211, 32259, 32305, 32349, 32390, 32430, 32467, 32502, - 32535, 32566, 32595, 32621, 32645, 32667, 32687, 32705, 32720, 32734, 32745, - 32753, 32760, 32765, 32767 -}; - - -const Word16 win_lpc_hb_wb_fx[(L_LOOK_12k8 + L_SUBFR + L_FRAME) * 5 / 32] = -{//Q15 - 17, 70, 157, 279, 435, 625, 849, 1106, - 1396, 1718, 2071, 2454, 2867, 3309, 3779, 4276, - 4799, 5346, 5917, 6510, 7125, 7759, 8411, 9081, - 9766, 10465, 11177, 11900, 12633, 13373, 14120, 14872, - 15627, 16384, 17141, 17896, 18648, 19395, 20135, 20868, - 21591, 22303, 23002, 23687, 24357, 25009, 25643, 26258, - 26851, 27422, 27969, 28492, 28989, 29459, 29901, 30314, - 30697, 31050, 31372, 31662, 31919, 32143, 32333, 32489, - 32611, 32698, 32751 -}; - -const Word16 win_lpc_hb_wb_ivas_fx[(L_LOOK_12k8 + L_SUBFR + L_FRAME) * 5 / 32] = -{//Q15 - 6, 51, 140, 274, - 453, 675, 940, 1247, - 1596, 1985, 2414, 2882, - 3386, 3926, 4499, 5106, - 5743, 6410, 7104, 7823, - 8566, 9331, 10114, 10915, - 11731, 12559, 13398, 14245, - 15099, 15955, 16813, 17669, - 18523, 19370, 20209, 21037, - 21853, 22654, 23437, 24202, - 24945, 25664, 26358, 27025, - 27662, 28269, 28842, 29382, - 29886, 30354, 30783, 31172, - 31521, 31828, 32093, 32315, - 32494, 32628, 32717, 32762 -}; - - -const Word16 ola_win_shb_switch_fold_fx[L_SUBFR16k] = -{//Q15 - 322, 965, 1608, 2250, 2892, 3532, 4171, 4808, - 5444, 6077, 6708, 7336, 7962, 8585, 9204, 9819, - 10431, 11039, 11643, 12242, 12836, 13426, 14010, 14589, - 15162, 15730, 16291, 16846, 17395, 17937, 18472, 18999, - 19520, 20033, 20538, 21035, 21525, 22006, 22478, 22942, - 23397, 23843, 24279, 24707, 25125, 25533, 25931, 26320, - 26698, 27066, 27423, 27770, 28106, 28431, 28746, 29049, - 29341, 29622, 29891, 30149, 30395, 30630, 30853, 31063, - 31262, 31449, 31624, 31786, 31936, 32074, 32200, 32313, - 32413, 32501, 32577, 32640, 32691, 32729, 32754, 32766 -}; - -/* Window for calculating whitening filter for SHB excitation */ - -const Word16 win_flatten_fx[L_FRAME16k / 2] = /*Q15 */ -{ - 3, 13, 28, 50, 78, 113, 154, 200, 254, 313, - 378, 450, 528, 611, 701, 797, 899, 1006, 1120, 1239, - 1365, 1496, 1632, 1775, 1923, 2076, 2235, 2400, 2569, 2745, - 2925, 3110, 3301, 3496, 3697, 3902, 4112, 4327, 4546, 4770, - 4999, 5232, 5469, 5710, 5955, 6205, 6458, 6715, 6976, 7240, - 7508, 7779, 8054, 8331, 8612, 8896, 9183, 9472, 9764, 10059, - 10356, 10655, 10956, 11260, 11566, 11873, 12182, 12493, 12805, 13119, - 13434, 13750, 14067, 14385, 14703, 15023, 15342, 15663, 15983, 16304, - 16625, 16945, 17265, 17586, 17905, 18224, 18542, 18860, 19176, 19492, - 19806, 20119, 20431, 20741, 21049, 21355, 21660, 21963, 22263, 22561, - 22857, 23150, 23441, 23729, 24014, 24297, 24576, 24852, 25125, 25395, - 25661, 25923, 26182, 26437, 26689, 26936, 27179, 27418, 27653, 27884, - 28110, 28332, 28549, 28761, 28969, 29172, 29370, 29563, 29751, 29934, - 30112, 30284, 30451, 30613, 30769, 30920, 31065, 31205, 31338, 31467, - 31589, 31705, 31816, 31921, 32020, 32113, 32199, 32280, 32355, 32423, - 32486, 32542, 32592, 32636, 32673, 32704, 32730, 32748, 32761, 32767 -}; - -const Word16 win_flatten_4k_fx[L_FRAME16k / 8] = /*Q15 */ -{ - 13, 114, 315, 615, 1013, 1505, 2089, 2761, - 3517, 4353, 5263, 6241, 7282, 8378, 9525, 10713, - 11937, 13188, 14458, 15741, 17027, 18310, 19580, 20831, - 22055, 23243, 24390, 25486, 26527, 27505, 28415, 29251, - 30007, 30679, 31263, 31755, 32153, 32453, 32654, 32755 -}; - -const Word16 wb_bwe_lsfvq_cbook_8bit_fx[256 * 6] = -{//Q15 - 2107, 3430, 5123, 6677, 9403, 13197, - 4031, 5069, 7343, 8910, 10647, 12245, - 2037, 3542, 6708, 8763, 10505, 12655, - 5732, 6373, 7912, 9546, 12584, 14230, - 2028, 3337, 5473, 7880, 10269, 12450, - 5809, 6497, 8317, 9624, 11497, 14007, - 2428, 3962, 5675, 7724, 11361, 13385, - 6348, 8307, 8898, 9948, 11058, 13350, - 3552, 4421, 5896, 7143, 9975, 13233, - 5719, 6344, 7482, 8403, 10765, 13455, - 3509, 4379, 5896, 7437, 11765, 14307, - 4521, 8122, 8791, 9856, 11232, 14020, - 2175, 3970, 7788, 9803, 11334, 12910, - 4511, 8156, 8886, 10450, 12686, 14959, - 4223, 5285, 7053, 8423, 11317, 14566, - 7159, 8379, 9040, 10122, 11799, 14270, - 1866, 3064, 4848, 7227, 11225, 13963, - 5915, 6631, 8740, 10002, 11385, 12726, - 3342, 4547, 6475, 9404, 11994, 13418, - 6156, 6880, 8932, 10353, 12380, 13746, - 2648, 4972, 7575, 9476, 12117, 13875, - 5822, 6526, 8747, 10941, 12671, 13971, - 4032, 5110, 7592, 9267, 11374, 14390, - 6864, 8384, 9086, 10649, 12944, 15026, - 3661, 4636, 6668, 8329, 10374, 12185, - 5802, 6444, 8344, 9811, 12234, 14843, - 3593, 4436, 6663, 8693, 11539, 14272, - 5110, 8270, 9006, 10703, 12269, 13901, - 1992, 3229, 5616, 9085, 11419, 13254, - 4319, 5859, 9602, 11396, 12836, 14199, - 3836, 4822, 8285, 10190, 11728, 13302, - 8016, 8698, 10179, 11434, 12944, 14783, - 1891, 3329, 6168, 8307, 10818, 14213, - 5803, 6442, 7973, 9131, 11090, 12657, - 2803, 5499, 8093, 9694, 11223, 12849, - 6222, 6981, 8615, 9848, 12016, 13380, - 2543, 4747, 7638, 9373, 11129, 13652, - 5912, 6615, 9006, 10553, 11959, 13312, - 3604, 4520, 7650, 9833, 12161, 14748, - 7970, 8729, 9780, 10789, 12483, 13985, - 3793, 4716, 7041, 8547, 10610, 13601, - 5640, 6235, 7313, 8370, 12057, 14300, - 3765, 4699, 6784, 9512, 12663, 14216, - 4634, 8363, 9195, 10385, 11477, 13310, - 2462, 4816, 8556, 10394, 11920, 13468, - 3698, 7974, 9207, 10962, 13507, 15208, - 3738, 4667, 7545, 10775, 13024, 14559, - 7267, 8610, 9509, 11264, 12821, 14495, - 2624, 4295, 6173, 8897, 12343, 14174, - 6324, 7135, 8742, 10013, 12598, 14108, - 4448, 5839, 8842, 10335, 11737, 13071, - 6147, 6988, 9510, 10893, 12240, 13535, - 3025, 5140, 7152, 9223, 11404, 13255, - 5985, 6782, 9611, 11341, 12723, 14007, - 4679, 5958, 8100, 9842, 11835, 13492, - 7740, 8565, 9432, 10478, 12611, 14609, - 3830, 4784, 7681, 9528, 11134, 12675, - 5742, 6527, 8359, 10728, 13195, 14626, - 4491, 5635, 7284, 8749, 11594, 13785, - 6772, 8490, 9253, 10943, 12476, 13973, - 2024, 3588, 7524, 10453, 12198, 13858, - 5783, 8882, 9978, 11763, 13237, 14829, - 3979, 5009, 8342, 10323, 12231, 14313, - 8148, 8903, 10193, 11350, 13246, 14490, - 2297, 3810, 5638, 7265, 9162, 11514, - 5809, 6518, 7832, 8766, 10327, 11957, - 2535, 4591, 7415, 9080, 10623, 12257, - 5948, 6598, 8515, 10082, 12721, 14188, - 2443, 4278, 6581, 8172, 9883, 11807, - 5913, 6535, 8878, 10296, 12141, 14245, - 2428, 3925, 6409, 9835, 11962, 13628, - 7430, 8531, 9302, 10259, 11444, 12933, - 3701, 4694, 6372, 7671, 9445, 11571, - 5822, 6470, 7807, 8885, 11506, 14529, - 3742, 4580, 6232, 7860, 11252, 13127, - 5710, 8330, 8943, 10243, 11696, 14511, - 2607, 4197, 6714, 10408, 12714, 14320, - 4116, 8438, 9717, 11018, 12156, 13663, - 4224, 5318, 7486, 10110, 12779, 14331, - 5565, 8413, 9115, 10930, 12588, 14759, - 1898, 3150, 5779, 9497, 12432, 14439, - 6274, 7186, 9258, 10404, 11733, 12952, - 3700, 4591, 7575, 9533, 11461, 13777, - 6234, 7104, 9032, 10986, 13088, 14417, - 2354, 4579, 7744, 9960, 12629, 14802, - 6050, 6729, 9345, 10745, 12436, 14253, - 4345, 5529, 8117, 9718, 12433, 14109, - 8009, 8701, 9863, 10954, 13046, 14474, - 4184, 5186, 6876, 8428, 11236, 12973, - 6113, 6842, 8386, 9659, 12892, 14707, - 3989, 4936, 7152, 8879, 11743, 13632, - 5169, 8411, 9209, 11361, 13452, 15076, - 2397, 4387, 7033, 9035, 11821, 13736, - 3607, 8128, 10170, 11565, 12819, 14147, - 4449, 5805, 8963, 10676, 12596, 14558, - 7911, 8741, 10040, 11622, 13579, 15092, - 2372, 4290, 6990, 8705, 10637, 13685, - 6137, 6917, 8382, 9380, 10859, 12348, - 3235, 5973, 8187, 10174, 12420, 14382, - 6077, 6764, 8551, 9803, 12150, 14079, - 2952, 5097, 6853, 8952, 12066, 14080, - 6606, 7683, 9508, 10695, 12182, 13601, - 3707, 4638, 7468, 10484, 12295, 13754, - 7960, 8715, 10051, 11348, 12757, 14072, - 4139, 5241, 7576, 9037, 10912, 13485, - 5838, 6444, 7768, 8965, 12867, 14998, - 4245, 5338, 7248, 9190, 12328, 14047, - 6159, 8874, 9899, 11134, 12150, 13512, - 2250, 4288, 8698, 10944, 12624, 14316, - 3146, 6848, 9904, 11775, 13534, 14953, - 4044, 5161, 8365, 10294, 12945, 14907, - 7398, 8724, 9813, 11821, 13246, 14552, - 2121, 3890, 6855, 9274, 12059, 14663, - 6329, 7182, 8789, 10081, 13001, 14917, - 4484, 5761, 8634, 10295, 12111, 14022, - 6326, 7208, 9672, 11078, 12830, 14529, - 3230, 5564, 7646, 9955, 12011, 13683, - 4683, 6896, 10002, 11805, 13329, 14747, - 4771, 6044, 8081, 10305, 12526, 14037, - 8231, 9203, 10351, 11427, 12926, 14635, - 4385, 5774, 7989, 9305, 10751, 12299, - 5810, 6658, 9062, 11629, 13359, 14655, - 4288, 5388, 7804, 9378, 11781, 13652, - 4398, 8560, 9646, 11161, 12701, 14872, - 1947, 3440, 7202, 10953, 13222, 14806, - 4686, 8972, 10615, 12054, 13260, 14615, - 3801, 4849, 8922, 11200, 12882, 14423, - 8061, 8813, 10453, 11912, 13335, 14710, - 2365, 3888, 5664, 7346, 10407, 14331, - 4563, 5839, 7472, 8684, 10572, 12800, - 2593, 4197, 6719, 9323, 11229, 12919, - 6081, 6774, 8132, 9244, 12202, 13918, - 2405, 3981, 6144, 8740, 11347, 13796, - 5793, 6444, 8286, 10049, 12152, 13520, - 2795, 4727, 6528, 8506, 11323, 13474, - 6181, 8598, 9346, 10614, 11725, 13545, - 4002, 5001, 6596, 7792, 9987, 13065, - 5748, 6365, 7759, 9028, 11818, 13487, - 3906, 4863, 6462, 7763, 10705, 14359, - 4315, 8428, 9322, 10582, 11942, 14500, - 2812, 4622, 7346, 10036, 11745, 13429, - 4221, 8338, 9277, 11280, 12869, 14317, - 4345, 5427, 7121, 8736, 12787, 14837, - 7678, 8614, 9456, 10461, 12024, 13852, - 2193, 3662, 5609, 7867, 12276, 14739, - 6083, 6864, 8879, 10080, 11623, 13720, - 4114, 5125, 7224, 9729, 11808, 13297, - 6383, 7232, 9252, 10720, 12622, 14030, - 2788, 5189, 8074, 9953, 11795, 14361, - 6079, 6987, 8662, 10589, 12444, 14390, - 4480, 5690, 7708, 9115, 11800, 14576, - 7848, 8763, 9802, 10924, 12515, 14832, - 3582, 4575, 6729, 9084, 11139, 12800, - 5885, 6534, 8853, 10432, 12664, 14960, - 3891, 4850, 7195, 8932, 12097, 14665, - 5797, 8545, 9385, 11556, 12997, 14392, - 1962, 3544, 7039, 9349, 11272, 13857, - 4106, 5493, 9652, 12038, 13603, 14932, - 4328, 5413, 7949, 10282, 12164, 13618, - 8135, 8918, 10057, 11085, 13190, 15015, - 2702, 4627, 6447, 8009, 10197, 13676, - 5998, 6656, 8315, 9496, 11597, 13122, - 3146, 6293, 8530, 10158, 11798, 13558, - 6374, 7289, 8698, 9776, 11885, 14236, - 3171, 5794, 7737, 9377, 11312, 13878, - 6279, 7150, 9192, 10414, 12052, 14174, - 4117, 5195, 7805, 9512, 12450, 14849, - 7963, 8955, 10071, 11129, 12324, 13605, - 4365, 5505, 7013, 8171, 10488, 13658, - 6124, 6894, 8286, 9349, 11859, 14737, - 3753, 4673, 6421, 8146, 12726, 14980, - 5457, 8706, 9598, 11035, 12294, 14268, - 2783, 4916, 7947, 10568, 12395, 14123, - 3909, 8145, 9524, 11951, 14052, 15282, - 3952, 5139, 8180, 11380, 13699, 15085, - 7200, 9031, 10025, 11484, 12924, 14848, - 2533, 4412, 6472, 8299, 11405, 14627, - 6563, 7530, 9064, 10267, 12560, 14422, - 4849, 6618, 8678, 10166, 11983, 13841, - 6393, 7569, 9960, 11300, 12644, 13906, - 3170, 5117, 7158, 9665, 11687, 14114, - 6122, 7071, 10013, 11733, 13170, 14466, - 4308, 5441, 7607, 9900, 11904, 14292, - 8129, 9024, 10087, 11081, 12670, 14356, - 4253, 5392, 8175, 9780, 11353, 12988, - 5453, 6638, 8596, 11453, 13885, 15263, - 4664, 5903, 7618, 9420, 12198, 13853, - 7149, 8859, 9746, 11029, 12219, 14188, - 2318, 4251, 7702, 9889, 11778, 14182, - 6679, 9280, 10573, 11950, 13100, 14491, - 4010, 5176, 8989, 10821, 12250, 13654, - 8076, 8886, 10411, 11722, 12992, 14267, - 2308, 4017, 6024, 7618, 9736, 13081, - 6001, 6751, 7987, 8966, 10964, 13589, - 2908, 5350, 7266, 8739, 10442, 12981, - 6143, 6839, 9027, 10366, 12881, 14416, - 2667, 4224, 6172, 8378, 10717, 12602, - 6275, 7120, 9249, 10613, 12580, 14823, - 2692, 4586, 6968, 9858, 12120, 14209, - 7771, 8769, 9743, 10745, 11943, 13225, - 4201, 5355, 7129, 8337, 9975, 11767, - 6216, 7100, 8444, 9442, 11298, 13690, - 4111, 5040, 6562, 8071, 12034, 13923, - 6657, 8599, 9337, 10665, 12040, 14704, - 3060, 5215, 7260, 10118, 12577, 14386, - 5103, 8913, 10157, 11519, 12669, 14220, - 4633, 5920, 7804, 9514, 12741, 14690, - 6720, 8585, 9448, 11556, 13510, 15095, - 2361, 3970, 6213, 9335, 13270, 15075, - 6506, 7440, 9041, 10179, 12024, 13587, - 4221, 5405, 8311, 9818, 11579, 14044, - 6216, 7224, 9515, 11389, 13545, 15068, - 2872, 5507, 8153, 10650, 13065, 14825, - 6002, 6676, 9393, 11023, 12965, 14755, - 4438, 5642, 8268, 10097, 12295, 14724, - 7797, 8622, 9642, 10932, 13287, 15118, - 4471, 5638, 7551, 9217, 11440, 12928, - 6051, 6890, 8906, 10655, 13437, 15116, - 3953, 4934, 7779, 9619, 12204, 14012, - 5439, 8649, 9791, 12232, 13899, 15193, - 2728, 4495, 6728, 9363, 11344, 14053, - 4069, 8460, 9835, 11742, 13366, 14825, - 4874, 6937, 9226, 10944, 12845, 14547, - 8195, 9093, 10392, 11594, 13355, 15010, - 2956, 5192, 7080, 8765, 11014, 14174, - 6384, 7287, 8812, 9816, 11336, 12808, - 2912, 6122, 9132, 10874, 12583, 14265, - 6148, 6925, 8821, 10030, 12212, 14758, - 2572, 4778, 7325, 9216, 11620, 14651, - 6654, 7718, 9546, 10806, 12633, 14354, - 4328, 5514, 8231, 10852, 12821, 14261, - 8051, 9205, 10385, 11490, 12674, 13988, - 4624, 6013, 7907, 9239, 11160, 13787, - 5786, 6531, 8210, 9968, 13410, 15249, - 3859, 4898, 7132, 9692, 13395, 15118, - 6712, 8944, 10028, 11521, 12690, 14118, - 2417, 4875, 9132, 11671, 13382, 14841, - 4113, 8355, 10734, 12517, 13905, 15115, - 4455, 5753, 7923, 10298, 13343, 15030, - 6998, 8878, 10113, 12233, 13768, 15107, - 2720, 4801, 6883, 9267, 12694, 14837, - 6507, 7496, 9312, 10696, 13185, 14850, - 4631, 6341, 9164, 10796, 12325, 13734, - 6602, 7817, 9932, 11349, 13132, 14672, - 3089, 5561, 7579, 9433, 12256, 14633, - 6246, 7715, 10371, 12065, 13563, 14878, - 4757, 6352, 8543, 10216, 12748, 14620, - 8183, 9366, 10628, 11857, 13185, 14599, - 4734, 6314, 8348, 9716, 11274, 12942, - 5824, 6871, 9829, 12268, 13874, 15138, - 4719, 6142, 8224, 9683, 11915, 14350, - 6288, 8774, 9655, 11204, 12696, 14867, - 2661, 4586, 7326, 10934, 13501, 15026, - 5932, 9323, 10877, 12454, 13715, 15004, - 4467, 6039, 8842, 11164, 13356, 14901, - 7880, 9158, 10593, 12209, 13609, 14989, -}; - -const Word16 swb_tbe_lsfvq_cbook_8b[256 * LPC_SHB_ORDER] = /* Q15 */ -{ - 1705, 3230, 4202, 5086, 6148, 7221, 8127, 10728, 13656, 15364, - 1668, 2958, 4063, 5644, 7356, 9440, 11046, 12261, 13228, 14503, - 1546, 2917, 4226, 5477, 6976, 8349, 9709, 11882, 13218, 14715, - 1158, 2729, 5177, 6967, 8297, 9611, 10655, 11668, 12757, 14415, - 1616, 3005, 4368, 5810, 7107, 8129, 9376, 10457, 12738, 14835, - 1232, 2451, 4145, 6446, 7741, 8993, 10377, 11898, 14213, 15314, - 1638, 3089, 5134, 6351, 7360, 8304, 9787, 12377, 13755, 15209, - 1264, 2543, 5564, 6686, 7958, 9481, 11021, 12517, 13875, 15147, - 1304, 2537, 3713, 4863, 6564, 7910, 9400, 11794, 13268, 14834, - 1652, 3245, 4686, 6405, 7931, 9223, 10591, 12020, 13193, 14759, - 1302, 2619, 4287, 5884, 7166, 8556, 10512, 12471, 13767, 15075, - 2034, 3467, 5577, 6530, 7674, 8783, 10920, 12798, 13727, 15002, - 2621, 3956, 5275, 6542, 7509, 8517, 9456, 10781, 12456, 14099, - 1496, 2653, 4147, 5637, 7370, 9233, 11817, 12986, 13968, 15046, - 2224, 3324, 4700, 5868, 7211, 8638, 11369, 12695, 13600, 14559, - 1267, 3050, 4707, 6321, 8663, 10140, 11174, 12453, 13425, 14844, - 1662, 2980, 4155, 5414, 6639, 7797, 9253, 11360, 12838, 14440, - 1521, 2856, 4944, 6367, 7506, 8857, 10971, 12183, 13275, 15006, - 1454, 2859, 4563, 5971, 7186, 8569, 10151, 11770, 13396, 14984, - 1143, 2942, 5267, 6840, 8377, 9457, 10589, 11615, 13892, 15271, - 1674, 3053, 4605, 5768, 7104, 8452, 10094, 11782, 12793, 13758, - 1702, 3261, 4723, 6245, 7899, 9494, 11010, 12387, 13680, 15066, - 1365, 2796, 5406, 6505, 7488, 8679, 10447, 12000, 13637, 15046, - 2090, 3931, 5788, 7157, 8254, 9717, 11007, 12081, 13238, 14880, - 1952, 3157, 4132, 5164, 6334, 7389, 9004, 11798, 14096, 15505, - 1641, 3212, 4919, 6364, 7863, 9311, 10766, 12234, 13694, 15054, - 1653, 3008, 4213, 5354, 6980, 8821, 11185, 12685, 13903, 15251, - 1856, 3444, 5146, 6579, 7801, 9250, 11062, 12947, 14145, 15291, - 1365, 3567, 5552, 6474, 7332, 8254, 9952, 11364, 13505, 14951, - 1488, 2896, 4521, 6279, 7880, 9446, 11418, 12921, 14431, 15465, - 1516, 3174, 5364, 6410, 7295, 8285, 10799, 12594, 14172, 15424, - 1738, 3416, 5237, 6878, 8440, 10539, 12105, 13063, 13924, 15150, - 1431, 2659, 3909, 5328, 6641, 7950, 9347, 11037, 13510, 14992, - 1400, 2646, 4233, 6366, 7749, 9220, 10560, 11594, 13046, 14992, - 1115, 2198, 3607, 5279, 8055, 9774, 11024, 12426, 13972, 15232, - 1360, 3418, 5724, 6973, 7912, 9078, 10810, 12437, 13630, 14826, - 1422, 3051, 5132, 6141, 7206, 8275, 9355, 10859, 13814, 15202, - 1080, 2227, 4117, 6404, 8080, 9318, 10934, 12404, 13688, 14827, - 1611, 3423, 4928, 6214, 7426, 8723, 10502, 11915, 13438, 15105, - 1947, 3524, 5198, 7008, 8358, 10006, 11397, 12444, 13583, 15135, - 1394, 2672, 4004, 5681, 6953, 8301, 9815, 12000, 13709, 15079, - 1788, 3193, 4579, 6221, 7874, 9170, 11186, 12647, 13521, 14538, - 1548, 2811, 4058, 5331, 6528, 7769, 10982, 12743, 13822, 15131, - 1751, 4007, 5154, 6463, 7935, 9470, 11103, 12406, 13337, 14520, - 2004, 3172, 5079, 6116, 7109, 8155, 10351, 12192, 13413, 14773, - 1644, 3185, 4750, 6290, 7816, 9271, 11041, 12831, 14139, 15341, - 2311, 3779, 5116, 6100, 7321, 9139, 10353, 12134, 13834, 15172, - 1723, 3339, 5049, 6754, 8353, 10290, 12048, 13157, 14206, 15460, - 2218, 3501, 4639, 5764, 6789, 7834, 9804, 11907, 13182, 14689, - 1640, 3173, 4679, 6202, 7660, 9120, 10773, 12395, 13894, 15200, - 1591, 3070, 4537, 6005, 7341, 8802, 10480, 12240, 13768, 15130, - 1169, 3611, 5983, 7054, 8601, 10022, 10948, 11927, 12834, 14747, - 1708, 3191, 4642, 6156, 7396, 8805, 10028, 11733, 13206, 14857, - 1519, 3082, 4752, 6484, 7730, 9328, 10796, 12003, 14524, 15513, - 2153, 3558, 5162, 6714, 7762, 8857, 10008, 12012, 13725, 15209, - 2680, 4053, 5310, 6996, 8309, 9343, 10361, 12333, 14224, 15498, - 2356, 3805, 5032, 5970, 6915, 7880, 8924, 12060, 13838, 15185, - 1807, 3439, 4962, 6483, 8013, 9556, 10952, 12327, 13686, 15059, - 1571, 2900, 4208, 6449, 7675, 8592, 11138, 12775, 14181, 15422, - 2006, 4262, 5508, 6414, 7621, 8725, 10788, 12605, 13609, 14776, - 1785, 3741, 5267, 6702, 8097, 9460, 10487, 11481, 12889, 14885, - 1647, 3223, 4795, 6391, 8007, 9620, 11575, 12955, 14100, 15381, - 1518, 3214, 5233, 6509, 7687, 8803, 11778, 13932, 14760, 15491, - 2136, 3647, 5373, 7317, 8671, 10261, 11786, 12933, 13820, 15186, - 1633, 3265, 4672, 5640, 6776, 7783, 8907, 10184, 12066, 14492, - 1690, 3028, 4184, 6049, 7489, 8678, 11045, 12244, 13372, 15016, - 1649, 3080, 4358, 5795, 7364, 8601, 10257, 12126, 13328, 15113, - 1850, 3286, 5392, 6765, 7826, 9185, 10506, 11776, 13248, 15163, - 2111, 3522, 4870, 6087, 7162, 8385, 9645, 10861, 12341, 14302, - 1529, 2909, 4136, 6783, 8064, 9325, 10942, 12094, 13886, 15169, - 1847, 3281, 4752, 6098, 7310, 8744, 10129, 12278, 13554, 14930, - 1149, 2767, 5869, 7479, 8514, 9723, 11235, 12300, 13871, 15068, - 1689, 3066, 4325, 5613, 6772, 7936, 9051, 12135, 13730, 15025, - 2127, 3394, 5263, 6880, 7874, 9155, 10305, 12136, 13494, 14437, - 1682, 3054, 4412, 6053, 7380, 8465, 9817, 12460, 14155, 15285, - 1799, 3430, 5123, 6594, 7934, 9609, 11472, 12791, 13686, 14849, - 1899, 3656, 5369, 6355, 7516, 8800, 9888, 11646, 13024, 13965, - 1410, 3252, 5101, 6050, 7480, 9912, 11739, 12806, 14085, 15186, - 1487, 3934, 5351, 6390, 7519, 8890, 11488, 12818, 13787, 14941, - 1562, 3156, 5075, 7044, 8872, 10271, 11479, 12632, 13907, 14993, - 1548, 2926, 4338, 5796, 7011, 8143, 9336, 11323, 13461, 14904, - 1421, 2907, 4736, 6272, 7730, 8977, 10453, 12374, 13840, 15234, - 1495, 2996, 4496, 6036, 7545, 9034, 10534, 12014, 13486, 14958, - 1388, 3203, 5691, 7076, 8578, 9661, 10874, 12326, 14433, 15423, - 1248, 2983, 5304, 6423, 7544, 8611, 10290, 11682, 12904, 14549, - 1496, 2988, 4632, 6342, 7852, 9329, 11175, 12546, 13758, 15182, - 1373, 3379, 5067, 6179, 7379, 8775, 10005, 11464, 14147, 15386, - 2537, 3849, 5533, 7263, 8318, 9657, 11346, 12355, 13955, 15314, - 2113, 3405, 4419, 5268, 6436, 8005, 10292, 12442, 13655, 15176, - 1620, 3681, 5454, 6406, 7459, 9354, 10872, 12035, 14163, 15279, - 1903, 3232, 4517, 5758, 7156, 8851, 10670, 12413, 14518, 15565, - 1714, 3779, 5166, 6557, 8107, 9168, 10560, 12854, 14208, 15329, - 1926, 3645, 5521, 7072, 7999, 8974, 9806, 11088, 13527, 15298, - 1820, 2840, 4726, 7091, 8261, 9758, 11218, 12148, 14064, 15262, - 2072, 3303, 5391, 6710, 7504, 8497, 10457, 12394, 14480, 15541, - 1627, 3294, 5209, 7432, 8846, 10147, 11517, 12890, 14488, 15411, - 2172, 3405, 4580, 5623, 6732, 7648, 8485, 9913, 13396, 15213, - 1581, 3058, 4633, 6225, 7724, 9238, 10779, 12240, 13650, 15094, - 1675, 2927, 4090, 5753, 7461, 8922, 10277, 11670, 13987, 15336, - 1868, 3611, 5256, 6927, 8093, 9434, 10998, 12144, 13380, 15165, - 1498, 3635, 5273, 6823, 7825, 8916, 9811, 10903, 12514, 14884, - 1448, 2626, 3930, 6895, 8348, 9746, 11404, 12565, 14288, 15325, - 1945, 3408, 4987, 6340, 7627, 8954, 10251, 12381, 13481, 14983, - 1956, 3759, 5388, 6894, 8466, 9962, 11460, 12759, 14145, 15321, - 1670, 3271, 4588, 5970, 7185, 8366, 9640, 12011, 13488, 14833, - 1964, 3444, 4826, 6213, 7936, 9097, 10785, 12617, 13612, 15229, - 1646, 3390, 4669, 6049, 7001, 7940, 10461, 12478, 14675, 15704, - 2202, 3782, 5107, 6754, 8280, 9628, 11687, 13028, 13871, 15207, - 2354, 3830, 5174, 6360, 7555, 8997, 10681, 11977, 13066, 14781, - 2351, 3525, 4892, 6386, 7616, 9133, 11859, 13061, 13946, 15004, - 2252, 3772, 5155, 6485, 7799, 9145, 10769, 12561, 13763, 15241, - 1714, 3107, 4725, 6097, 9158, 10459, 11619, 12699, 14346, 15256, - 1830, 3506, 4969, 5973, 6900, 7836, 8994, 11088, 13366, 14860, - 1856, 3406, 4898, 6367, 7810, 9186, 10422, 12172, 13969, 15331, - 2006, 3382, 4743, 6100, 7430, 8753, 10805, 12234, 13673, 15195, - 1491, 3607, 5343, 7464, 9179, 10087, 11024, 12099, 13199, 14956, - 1749, 3371, 5121, 6500, 7646, 8770, 9968, 11673, 13339, 14931, - 1857, 3506, 5083, 6595, 8200, 9739, 11138, 12528, 13884, 15137, - 1780, 3860, 5581, 6692, 7837, 8989, 10304, 12318, 13611, 15109, - 2164, 4463, 5655, 7632, 9047, 9922, 10784, 12950, 14723, 15589, - 2305, 3300, 4366, 5608, 6857, 7795, 10006, 11950, 14376, 15700, - 1628, 3408, 5074, 6761, 8312, 9687, 11104, 12332, 13619, 15076, - 1842, 3314, 4771, 6460, 7463, 8661, 11191, 12739, 14592, 15633, - 1808, 4360, 5904, 6869, 8134, 9174, 10780, 12589, 13995, 15150, - 2966, 4354, 5686, 6983, 7938, 9092, 10062, 11747, 13307, 14611, - 1932, 3293, 4910, 6818, 7690, 9074, 11715, 13019, 14429, 15478, - 1978, 3772, 5429, 6580, 7448, 8496, 11755, 13132, 14549, 15560, - 1881, 3635, 5627, 7292, 8573, 10911, 12325, 13200, 14068, 15243, - 1436, 2716, 4002, 5347, 6553, 7646, 8955, 10690, 12967, 14784, - 1426, 2825, 4206, 5726, 8100, 9391, 10712, 12262, 13506, 14954, - 1448, 2767, 4089, 5265, 7185, 8684, 10378, 12257, 13431, 14803, - 1669, 3312, 4990, 6887, 8050, 9595, 10943, 12015, 13145, 14920, - 1534, 2814, 4191, 5933, 7393, 8687, 9865, 11185, 12958, 14743, - 1397, 2706, 4322, 6052, 7618, 9168, 10995, 12433, 13931, 15267, - 1717, 3164, 4630, 6329, 7519, 8846, 10088, 12116, 14012, 15197, - 1606, 3316, 5165, 6942, 8278, 9625, 11461, 12806, 14095, 15299, - 2014, 3357, 4281, 5076, 6191, 7372, 9501, 12414, 13419, 14901, - 1322, 3655, 5269, 6494, 7613, 9253, 10752, 11974, 13302, 14833, - 1687, 3291, 4718, 5817, 7001, 8136, 10741, 12692, 13884, 15224, - 2255, 3723, 5555, 7021, 8101, 9345, 10765, 12705, 13693, 15223, - 2376, 3715, 5249, 6505, 7410, 8345, 10176, 11618, 12708, 14488, - 1842, 3232, 4371, 5954, 7832, 9126, 11296, 12743, 13862, 15331, - 2046, 3597, 5325, 6453, 7353, 8588, 10588, 12082, 13664, 15152, - 1970, 3564, 4925, 6547, 8672, 9980, 11383, 12786, 13969, 15234, - 1497, 2938, 4909, 6099, 7102, 8072, 9514, 11294, 12761, 14578, - 1666, 3164, 5098, 6255, 7350, 8902, 10694, 12503, 13808, 14980, - 1467, 2774, 4556, 6308, 7435, 8644, 10040, 12356, 13597, 14776, - 1915, 3618, 5160, 6707, 8479, 9521, 10481, 11536, 14163, 15479, - 1857, 3466, 4760, 6205, 7312, 8801, 10376, 11978, 13161, 14235, - 1615, 3107, 4710, 6452, 8069, 9877, 11348, 12575, 13751, 15049, - 1563, 3092, 4977, 6851, 8056, 9025, 10327, 12181, 14039, 15192, - 2294, 3843, 5781, 7222, 8505, 9851, 11210, 12802, 13676, 15158, - 1931, 3436, 4681, 5837, 6908, 7825, 9440, 12600, 14162, 15305, - 1572, 3189, 4879, 6680, 7970, 9293, 10974, 12193, 13506, 15218, - 1759, 3172, 4687, 5950, 7484, 8874, 10563, 12821, 14112, 15299, - 1461, 4009, 5495, 6608, 7867, 9497, 11307, 12520, 14357, 15467, - 1922, 4314, 5736, 6599, 7481, 8598, 9852, 11345, 14012, 15280, - 1249, 2609, 4690, 7006, 8061, 9011, 11477, 13214, 14382, 15337, - 2251, 3776, 5514, 6458, 7300, 8078, 10961, 12696, 14279, 15567, - 1697, 3374, 5134, 6984, 8675, 10700, 12194, 13233, 14184, 15464, - 1985, 3326, 4440, 5685, 6870, 8207, 9545, 11223, 13672, 15143, - 1453, 2824, 4722, 6476, 7730, 8963, 10217, 11743, 13545, 15152, - 1217, 2442, 3821, 5409, 7315, 8949, 10797, 12564, 14281, 15410, - 1546, 3204, 5604, 6730, 8040, 9677, 11029, 12107, 13803, 15267, - 2042, 3424, 4830, 6328, 7473, 8525, 9386, 10755, 13398, 14998, - 1106, 2508, 4816, 7337, 8399, 9630, 11278, 12453, 14067, 15024, - 1764, 3305, 4955, 6537, 7767, 9117, 10404, 11961, 13576, 15021, - 1604, 3797, 5700, 7128, 8515, 9896, 11389, 12534, 13696, 15136, - 1623, 3004, 4355, 6217, 7351, 8437, 9819, 11537, 13974, 15340, - 2457, 3890, 4962, 5848, 7311, 9718, 11213, 12292, 13705, 15111, - 1601, 3330, 4648, 6043, 7138, 8179, 11247, 13078, 14768, 15641, - 2457, 3677, 5174, 6432, 7982, 10024, 11164, 12170, 13704, 15112, - 1552, 3777, 5267, 6325, 7532, 8642, 9894, 12404, 13569, 14620, - 1961, 3463, 4720, 6498, 8059, 9304, 11486, 12824, 14102, 15458, - 2443, 3699, 5252, 6348, 7638, 8733, 10224, 12666, 13768, 15009, - 2204, 3657, 5086, 6792, 8300, 10152, 12313, 13306, 14079, 15287, - 2360, 3731, 5002, 6094, 6952, 8009, 9152, 11586, 13038, 14158, - 1888, 3469, 4880, 6183, 7603, 9244, 10801, 12319, 13657, 15002, - 1670, 3283, 4591, 6080, 7801, 8951, 10534, 12572, 13620, 14969, - 1304, 4140, 5864, 7008, 8377, 9651, 10825, 11805, 13637, 15300, - 2077, 3547, 4890, 6216, 7303, 8608, 9810, 11796, 13525, 14984, - 1658, 3252, 4916, 6498, 8069, 9529, 11029, 12538, 13903, 15184, - 2206, 3648, 4949, 6636, 7875, 8833, 9853, 12624, 14448, 15475, - 3039, 4664, 5792, 7321, 8798, 9724, 10485, 12329, 14465, 15650, - 1885, 3201, 5227, 6590, 7343, 8049, 9372, 12313, 14594, 15645, - 1826, 3446, 5138, 6665, 8008, 9352, 10668, 12583, 13810, 15065, - 1455, 3065, 5233, 6306, 7404, 8776, 11422, 12775, 14032, 15239, - 2395, 4674, 5883, 6877, 7900, 9322, 10931, 12537, 13765, 14888, - 1840, 4359, 5629, 6875, 7968, 9185, 10266, 11861, 13202, 14464, - 1662, 3278, 4865, 6555, 8122, 10011, 11874, 13087, 14128, 15418, - 1643, 3366, 5837, 7033, 7854, 8928, 11487, 12972, 14409, 15467, - 1878, 3685, 5789, 7325, 8714, 10906, 12273, 13110, 13834, 14837, - 2259, 3652, 4995, 6055, 7005, 7900, 8843, 10024, 12609, 14736, - 1568, 2949, 4504, 6035, 7428, 9194, 10893, 12444, 13595, 14939, - 1678, 3143, 4416, 5872, 7501, 8768, 10418, 12127, 13144, 14622, - 1878, 3549, 5481, 7178, 8322, 9347, 10532, 12117, 13554, 15167, - 2055, 3346, 4814, 6193, 7418, 8757, 10144, 11365, 12698, 14779, - 1486, 2779, 3954, 6134, 8290, 9646, 10767, 12112, 14441, 15428, - 1787, 3511, 4962, 6055, 7295, 8858, 10179, 12437, 13813, 15217, - 1374, 3184, 5771, 7998, 9354, 10209, 11249, 12469, 14015, 15248, - 1627, 2947, 4046, 5182, 6798, 8225, 9770, 12661, 14250, 15408, - 2117, 3704, 5007, 6630, 8002, 9222, 10550, 12108, 13472, 15034, - 1365, 2885, 4896, 6144, 7426, 9137, 10283, 12727, 14709, 15505, - 2073, 3691, 5305, 6800, 8134, 9508, 11139, 12857, 13896, 15239, - 1564, 4084, 5497, 6495, 7391, 8539, 10468, 11705, 12804, 14704, - 1844, 3180, 4380, 5754, 8181, 9923, 11738, 12995, 14138, 15232, - 2157, 3736, 5059, 5932, 7192, 8916, 11216, 12783, 13945, 15189, - 1782, 2860, 4362, 7179, 9083, 10438, 11580, 12929, 14789, 15500, - 1651, 3273, 4587, 5886, 7069, 8346, 9787, 11277, 13152, 14811, - 1549, 3138, 5049, 6704, 7803, 9102, 10748, 12577, 13813, 15215, - 1674, 3187, 4709, 6204, 7622, 9024, 10541, 12135, 13576, 15063, - 1888, 3562, 5468, 7111, 8694, 9948, 11111, 12286, 14070, 15300, - 1905, 3158, 5368, 6372, 7554, 8719, 10568, 12430, 13449, 14427, - 1953, 3411, 4718, 6545, 8090, 9298, 11232, 12723, 13668, 15077, - 1459, 3444, 5688, 6814, 7843, 8977, 10119, 12107, 14316, 15368, - 2450, 4363, 5827, 7349, 8683, 10032, 11143, 12131, 13519, 15058, - 2482, 3664, 4763, 5944, 7191, 8390, 10105, 12234, 13702, 15188, - 1838, 3465, 5255, 6751, 8016, 9254, 10946, 12321, 13790, 15337, - 2497, 3548, 4702, 5987, 7645, 8883, 10740, 12247, 14393, 15540, - 1717, 3679, 5335, 6587, 8564, 9808, 10735, 12675, 14672, 15558, - 2454, 3997, 5364, 6810, 8026, 8913, 9715, 11315, 14258, 15605, - 1906, 3443, 4901, 6363, 8186, 9716, 11074, 13186, 14701, 15474, - 1992, 3246, 5488, 6514, 7455, 8324, 10807, 13238, 14763, 15579, - 1721, 3438, 5244, 7173, 9106, 10873, 12178, 13181, 14060, 15415, - 2191, 3555, 4802, 6108, 7015, 7850, 8947, 11115, 14483, 15593, - 1925, 3232, 4601, 6574, 7791, 8989, 11038, 12282, 13630, 15136, - 1816, 3167, 4292, 5730, 7588, 9096, 10743, 12341, 13760, 15252, - 2069, 3850, 5424, 6815, 8274, 9569, 10910, 12283, 13835, 15185, - 2419, 3773, 5288, 6591, 7672, 8909, 9832, 10975, 13163, 14998, - 1215, 2710, 4939, 6437, 8745, 9918, 11200, 12553, 14234, 15384, - 1867, 3527, 5134, 6496, 7656, 8923, 10602, 12568, 13896, 15276, - 2259, 4214, 5751, 7270, 8590, 10120, 11611, 12822, 14130, 15258, - 1911, 3261, 4446, 5685, 6897, 8494, 10128, 11970, 13707, 15106, - 1762, 3549, 4874, 6153, 8146, 9634, 10690, 11886, 13713, 15057, - 2371, 3716, 4778, 6111, 7097, 8063, 10544, 12615, 14716, 15724, - 2254, 3759, 5627, 6870, 7896, 9379, 11627, 12889, 13795, 15272, - 2516, 4000, 5378, 6444, 7496, 8634, 9767, 12110, 13503, 14640, - 2385, 3201, 4283, 6677, 8216, 9689, 11654, 12319, 14142, 15367, - 2775, 4055, 5455, 6553, 7821, 8901, 10890, 12775, 13696, 14884, - 1568, 3940, 5341, 6824, 9355, 10305, 11405, 12879, 14291, 15334, - 2436, 3807, 5183, 6189, 7099, 8116, 9655, 11275, 13641, 15137, - 1755, 3340, 4871, 6382, 7790, 9316, 10921, 12432, 13903, 15217, - 1932, 3246, 4603, 6454, 7590, 8678, 10609, 12641, 13938, 15245, - 1417, 4366, 6289, 7362, 8846, 10151, 11160, 12134, 13593, 15216, - 1820, 3378, 4782, 6421, 7788, 9056, 10070, 11271, 13614, 15297, - 1855, 3399, 4933, 6526, 8097, 9655, 11043, 12475, 14301, 15370, - 1901, 3653, 6053, 7290, 8154, 8986, 10262, 12993, 14405, 15387, - 1958, 4295, 5824, 8196, 9580, 10318, 11267, 12551, 13716, 15374, - 2082, 4060, 5500, 6423, 7298, 8128, 9713, 12497, 14442, 15562, - 1878, 3425, 4781, 7062, 8455, 9625, 10810, 12311, 13948, 15201, - 2035, 3727, 4804, 6256, 7248, 9235, 11563, 13120, 14882, 15662, - 2143, 3982, 6527, 7709, 8742, 9804, 11240, 12658, 14397, 15409, - 2593, 4431, 5861, 7222, 8381, 9351, 10400, 11837, 13286, 15326, - 1840, 3798, 5465, 6800, 7919, 9752, 12004, 13265, 14424, 15420, - 2157, 4145, 5394, 6454, 7240, 8776, 11093, 12831, 14856, 15708, - 1467, 3782, 5811, 8123, 9314, 10456, 11641, 13211, 14562, 15331, -}; - - -const Word16 wac_swb_h[LPC_SHB_ORDER] = -{//Q15 - 32758, - 32731, - 32686, - 32622, - 32541, - 32442, - 32325, - 32191, - 32039, - 31870 -}; - -const Word16 wac_swb_l[LPC_SHB_ORDER] = -{//Q15 - 29673, - 20874, - 7850, - 25873, - 12831, - 5927, - 10541, - 239, - 15037, - 30328 -}; - - -const Word16 lbr_wb_bwe_lsfvq_cbook_2bit_fx[4 * 4] = -{ - /*Q15 */ - 3876, 5920, 8951, 11884, - 6556, 7979, 10835, 13133, - 4401, 6781, 10676, 13493, - 8453, 9693, 12024, 13921, -}; - -const Word16 SHBCB_SubGain5bit_fx[128] = -{ - /*Q14 */ - -2388, -7806, -6576, -6024, - -7066, -5430, -4998, -3495, - -16722, -15343, -960, -7940, - -26291, -5921, -4917, -4378, - -1526, -6621, -8475, -9624, - -8047, -4086, -8940, -3043, - -3630, -5129, -4964, -7381, - -270, -18662, -24233, -25418, - -9246, -7551, -5584, -2053, - -2091, -4622, -9199, -14628, - -4645, -2197, -10255, -9697, - -2438, -9386, -11737, -4570, - -14366, -11436, -8252, -819, - -16192, -16332, -17043, -225, - -5407, -8588, -7577, -2296, - -26309, -21930, -7522, -2514, - -3260, -4246, -7947, -6614, - -1820, -5520, -15272, -19764, - -3706, -3737, -5850, -10520, - -10081, -4050, -4065, -5001, - -3908, -9909, -2881, -9604, - -520, -11156, -12620, -12768, - -4539, -5149, -6208, -4462, - -4866, -7672, -4235, -4407, - -9163, -13411, -2975, -3915, - -12267, -7568, -3842, -2827, - -7181, -4914, -2608, -9392, - -6275, -2868, -5962, -6511, - -12962, -1034, -8517, -10992, - -8247, -7608, -2502, -5026, - -5812, -4998, -3860, -5778, - -16907, -5974, -4434, -3276, -}; - - -const Word16 HBCB_SubGain5bit_fx[128] = -{//Q8 - -15224, -17789, -9897, -5048, -456, -1232, -2238, -2782, - -3391, -3864, -4026, -4045, -2017, -1311, -878, -1973, - -12837, -15376, -8273, -4141, -2791, -3037, -2403, -342, - -3388, -3646, -3471, -2829, -157, -2025, -2318, -2243, - -14652, -16433, -7699, -1188, -2567, -1755, -346, -1682, - -2068, -2321, -2344, -2348, -1759, -1038, -1865, -2041, - -11396, -13719, -7749, -2734, -809, -1935, -1886, -781, - -2136, -1940, -942, -1571, -1926, -2378, -2572, -2145, - -17531, -19267, -7721, -2672, -714, -675, -1516, -2071, - -1925, -2325, -2523, -2657, -1644, -1674, -2036, -2017, - -12781, -14601, -6714, -1380, -2093, -1704, -1124, -756, - -2776, -2687, -2066, -1202, -1102, -680, -1956, -2376, - -14436, -15846, -4918, -2071, -1613, -744, -1807, -1381, - -620, -1294, -2026, -2162, -794, -1755, -1167, -1762, - -11627, -13377, -5876, -1959, -1009, -1879, -1027, -1915, - -1734, -1265, -2001, -1018, -698, -1733, -2172, -1195, - -}; - - -const Word32 SHBCB_FrameGain64_fx[64] = -{ - /* Q18 */ - 11553, 19429, 27466, 35948, 45184, 54817, 65050, 76114, - 88089, 100815, 114314, 128727, 144236, 160812, 178639, 197656, - 217917, 239688, 263098, 288617, 315962, 345380, 376751, 410569, - 446867, 485779, 527885, 574220, 624562, 679333, 738912, 803391, - 873329, 949299, 1032054, 1121728, 1219559, 1327347, 1446046, 1576547, - 1720983, 1881933, 2062979, 2266614, 2496129, 2759206, 3060575, 3409584, - 3818114, 4295643, 4868000, 5551295, 6368310, 7329048, 8475924, 9889403, - 11649918, 13794493, 16487623, 19979932, 24732260, 31339886, 41958624, 64261100, -}; - -/* 4 bit Quantizer table for SHB overall gain */ - -const Word32 SHBCB_FrameGain16_fx[16] = -{ - /*Q18*/ - 38968, 125277, 254474, 493383, 1043711, 2083177, 3792746, 6395076, - 10256080, 15738899, 23269902, 34118236, 48362464, 71128080, 107459896, 192888864 -}; - -/* 18th order elliptic Bandpass filter at 14.15 to 20 kHz sampled at 48 kHz b0,b1,b2,a0,a1,a2 */ - -const Word16 full_band_bpf_1_fx[6][5] = /*in Q13*/ -{ - { 789, 802, 248, 802, 789}, - { 789, 1199, 838, 1199, 789}, - { 789, 136, -1123, 136, 789}, - { 8192, 19654, 24391, 17059, 6561}, - { 8192, 15339, 20118, 13819, 6190}, - { 8192, 21155, 26558, 17237, 5599} -}; - -/* 12th order elliptic Bandpass filter at 16.3 to 19.8 kHz sampled at 48 kHz b0,b1,b2,a0,a1,a2 */ - -const Word16 full_band_bpf_2_fx[6][5] = /*in Q13*/ -{ - { 492, 912, 974, 912, 492}, - { 492, 1161, 1353, 1161, 492}, - { 492, 259, -311, 259, 492}, - { 8192, 22912, 30622, 21214, 7143}, - { 8192, 20364, 27329, 18844, 6886}, - { 8192, 23496, 31199, 20826, 6487} -}; - -/* 12th order elliptic Bandpass filter at 15.4 to 20.0 kHz sampled at 48 kHz b0,b1,b2,a0,a1,a2 */ - -const Word16 full_band_bpf_3_fx[6][5] = /*in Q13*/ -{ - {611, 888, 717, 888, 611}, - {611, 1211, 1214, 1211, 611}, - {611, 197, -671, 197, 611}, - {8192, 21727, 28230, 19588, 6871}, - {8192, 18438, 24377, 16796, 6567}, - {8192, 22683, 29442, 19400, 6081} -}; - -/* 4-bit/3-bit TD SWB BWE differential LSF scalar quantizer tables */ - -const Word16 lsf_q_cb_size[NUM_Q_LSF] = {16, 16, 8, 8, 8}; // Q0 -const Word16 lsf_q_num_bits[NUM_Q_LSF] = { 4, 4, 3, 3, 3 }; // Q0 - -/* Tables for approximation of upper half of SWB LSFs */ - -const Word16 mirror_point_q_cb_fx[MIRROR_POINT_Q_CB_SIZE] = { 471, 692, 896, 1216 }; // Q15 - -const Word16 allpass_poles_3_ov_2[9] = /* Q15 */ -{ - 2368, - 20545, - 30606, - 25520, - 7188, - 31808, - 28575, - 14384, - 32472 -}; - -const Word16 decimate_3_ov_2_lowpass_num_fx[3] = /* Q15 */ -{ - 6399, - 12797, - 6399 -}; - -const Word16 decimate_3_ov_2_lowpass_den_fx[3] = /* Q15 */ -{ - 32767, - 0, - 5624 -}; - - -/*------------------------------------------------------------------------------* - * WB BWE tables - *------------------------------------------------------------------------------*/ -const Word16 F_2_5_fx[64] = /*Q10 */ -{ - 1189, 675, -5106, -5293, 10476, -12, 10860, 10026, - -382, -616, 6426, 339, 9681, 9068, 3002, 2216, - 3208, 3042, 8255, -604, 16133, 5171, 17641, 18769, - -2529, -3248, -1447, -1991, 15511, 14855, 11631, 11996, - 9654, -124, 7267, -1617, 12799, 3237, 10598, 1555, - 5510, -1775, 1149, -2292, 12659, 12425, 4382, -1814, - 6305, 5629, 3404, -2632, 19555, 9582, 7835, 7619, - -517, -3795, 19031, 11574, 19156, 18748, 23563, 23465, -}; -/*------------------------------------------------------------------------------* - * SWB BWE tables - *------------------------------------------------------------------------------*/ - -const Word16 swb_bwe_trans_subband[SWB_FENV_TRANS+1] = {240, 316, 392, 476, 560}; // Q0 -const Word16 swb_bwe_trans_subband_width[SWB_FENV_TRANS] = {76, 76, 84, 84}; // Q0 - -const Word16 sqrt_swb_bwe_trans_subband_width_fx[SWB_FENV_TRANS] = { 17854, 17854, 18770, 18770 };/*Q11 */ - -const Word16 sqrt_swb_bwe_subband_fx_L1[SWB_FENV] = { 16384, 20066, 16384, 20066, 16384, 20066, 16384, 20066, 20066, 20066, 20066, 20066, 23170, 23170 }; /*Q12 */ - -const Word16 sqrt_swb_bwe_subband_fx_L2[SWB_FENV / 2] = { 25905, 25905, 25905, 25905, 28378, 28378, 32767 }; /*Q12 */ - -const Word16 swb_bwe_subband[SWB_FENV+1] = {240, 256, 280, 296, 320, 336, 360, 376, 400, 424, 448, 472, 496, 528, 560}; // Q0 -const Word16 fb_bwe_subband[DIM_FB + 1] = { 640, 680, 720, 800 }; // Q0 -const Word16 fb_bwe_sm_subband[DIM_FB] = { 656, 696, 760 }; // Q0 -const Word16 swb_inv_bwe_subband_width_fx[SWB_FENV] = { 2048,1365,2048,1365,2048,1365,2048,1365,1365,1365,1365,1365,1024,1024 };//Q15 -const Word16 swb_bwe_sm_subband[SWB_FENV] = {248, 268, 288, 308, 328, 348, 368, 388, 412, 436, 460, 484, 512, 544}; // Q0 -const Word16 smooth_factor_fx[SWB_FENV - 1] = { 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1366, 1366, 1366, 1366, 1024, 1024 };//Q15 - -const Word16 fb_bwe_subband_float[DIM_FB+1] = {640, 680, 720, 800}; // Q0 -const Word16 fb_inv_bwe_subband_width_fx[DIM_FB] = { 819, 819, 409 };//Q15 -const Word16 fb_bwe_sm_subband_float[DIM_FB] = {656, 696, 760}; // Q0 -const Word16 fb_smooth_factor_fx[DIM_FB] = { 1024, 819, 512 };//Q15 - - -const Word16 EnvCdbk11_fx[N_CB11 * DIM11] = /*Q8 */ -{ - -2220, 29, 1168, 2124, 2180, 1208, 741, - 1521, -312, -843, -1523, -1970, -2205, -2541, - 746, 1835, 3461, 4398, 4292, 4184, 3462, - 1627, 2475, 2937, 2839, 2198, 1729, 1325, - -514, -731, -557, -200, 100, 475, 540, - 655, 956, 1272, 1083, 774, 687, 459, - 5987, 5460, 4689, 4192, 3845, 3615, 3393, - 3571, 4840, 5784, 6266, 5933, 5158, 4433, - 2959, 2087, 1180, 979, 1180, 1371, 1636, - 6029, 6157, 6431, 6762, 6998, 7153, 7050, - -822, 210, 450, 178, -639, -1346, -1577, - 4451, 4184, 4111, 4329, 4833, 5232, 5512, - 3420, 3994, 4321, 4205, 3684, 3154, 2651, - -3734, -2305, -1388, -324, 22, -847, -1141, - 850, 510, 896, 1780, 2130, 2688, 2826, - 3294, 2823, 2510, 2516, 3029, 3413, 3843, - -3563, -3409, -3199, -2917, -2584, -2282, -1981, - -2738, -3185, -3752, -4320, -4484, -4524, -4329, - -7534, -7481, -7283, -7175, -6757, -6281, -5865, - -4868, -4836, -4603, -4422, -4086, -3738, -3323, - -13896, -13775, -13484, -13339, -12926, -12399, -11970, - 8409, 8420, 8305, 8103, 7954, 7778, 7496, - 7180, 6845, 6369, 5971, 5557, 5309, 5027, - 4633, 4008, 3267, 2422, 2072, 1778, 1510, - 10128, 10432, 10540, 10473, 10176, 9837, 9586, - 2933, 2695, 2060, 1286, 424, -254, -825, - -10032, -9847, -9544, -9420, -9000, -8508, -8084, - 1830, 927, -158, -388, -360, -368, -287, - -21962, -21904, -21548, -21471, -21004, -20511, -20064, - -6090, -6142, -5937, -5852, -5493, -5104, -4671, - -1382, -1640, -2205, -2557, -2785, -3019, -2994, - -1300, -1567, -1744, -1642, -1409, -1080, -902, -}; - -const Word16 EnvCdbk1st_fx[N_CB1ST * DIM1ST] = /*Q8 */ -{ - -1819, -1138, 751, - -494, 162, -826, - -3199, -123, 2479, - -2071, 238, -429, - -1819, 1780, 1233, - 284, 1187, -1123, - -1689, -722, -484, - -1256, 52, -1336, - -604, 3738, -1297, - 555, 412, 743, - -626, -1685, 1527, - 145, 1557, -224, - -638, 1370, 1589, - -1188, 37, -410, - -428, -3320, 1860, - 2597, -95, -2876, - -742, -583, -684, - 1607, -1671, -1874, - -1111, -936, -1374, - 275, -2314, 518, - 2682, 2368, -302, - 1809, -555, -579, - 3193, -1270, -1208, - 750, 84, 154, - -1160, 429, 1098, - 816, -613, -2897, - 2159, -1885, 1245, - -671, 426, 3177, - 867, -144, -639, - 843, -1888, 2271, - 1542, 259, -148, - -1680, 1027, 285, - 162, -763, 1666, - -1916, 1175, -1227, - -345, -907, -151, - 1979, 1062, 402, - -1231, 2437, 3130, - -2422, 361, 1040, - -4314, -4106, -4221, - 146, -1200, -1828, - 485, 889, -3847, - 384, -2461, -2845, - 1526, -600, 1599, - -838, -571, 1097, - 1776, -3393, 4058, - -3330, 2429, 1732, - 468, -2140, -934, - 833, 2292, -1129, - -20, -1029, 652, - -346, 168, 1834, - -1730, 838, 2234, - 1622, -1695, -194, - -3198, -773, 228, - 1070, 1741, 285, - 1655, -212, -1628, - 2178, 604, 1784, - 1801, -3224, -848, - -819, 348, 187, - 16, 300, 244, - 769, 201, 1554, - 719, -394, 780, - 311, 2853, 185, - 1163, 489, -1022, - -330, 459, 877, - 109, -541, -691, - -509, -267, 478, - -340, -417, -1403, - -860, -675, -2703, - 1025, 826, 250, - -1043, 1008, -434, - -1042, -631, 60, - -173, 332, -2084, - 984, 919, -2042, - -1257, -2287, 339, - 366, -1309, -158, - 1041, 1039, 1083, - 3566, 918, 227, - 62, -139, 936, - 2424, 730, -1022, - -745, 1954, 427, - -1091, -1358, -478, - -173, 2121, -2367, - -2175, 2535, -1946, - -880, -1964, -1549, - -249, -1203, -927, - -2377, -443, -1775, - -1439, -582, 2037, - -529, -3679, -550, - 608, -284, -1566, - 201, 63, -344, - 1376, 218, 816, - 2471, -348, 479, - -1388, 988, -2674, - 1429, -3538, 1125, - 864, -1351, 845, - 301, 977, 408, - -1122, 3364, 1107, - -213, 730, -329, - 839, -683, -92, - 631, 1172, 2364, - 598, 685, -329, - -780, -1317, 448, - -424, -153, -199, - 768, -331, 2825, - 882, -1047, -975, - -375, -1835, -299, - 2861, -3375, -3158, - 2099, 2168, -2630, - 1602, 1930, 1451, - 1294, 1265, -586, - -2500, -2570, -2667, - -806, -1529, 3272, - -522, 1072, 478, - 4035, -2491, 480, - -1908, 2414, -178, - -1563, -143, 438, - 205, 861, 1287, - -691, 963, -1374, - -2359, -2032, -886, - 162, -442, 160, - 194, 2494, 1960, - -2533, -2578, 1924, - 267, 1701, 937, - 2919, 2950, 2382, - -670, 2102, -859, - -3147, 1385, -215, - 1482, -595, 415, - 228, 290, -1060, -}; - -const Word16 EnvCdbk2nd_fx[N_CB2ND * DIM2ND] = /*Q8 */ -{ - 1104, -1833, -1110, -954, - 757, 853, -176, 286, - -873, -587, -7, 1458, - -462, -553, -350, 104, - 1938, 1957, -1340, -703, - 1202, -779, 21, 1996, - -2851, -169, 1049, 940, - -1355, -726, -1788, 1076, - -767, -641, -646, -880, - 135, -832, -197, -889, - -826, 3, 279, -502, - -714, 544, -526, 375, - 291, -1076, -816, -3929, - -1175, -475, 2219, -642, - 197, -219, -1052, -1601, - 1175, -162, -695, -336, - 1124, 126, -2326, -1573, - 1164, -1323, -1958, 1074, - -2080, -2152, 113, 649, - -637, -860, 721, 267, - -609, 1658, -1006, -1352, - 1631, 2225, 2128, 1827, - -1112, -1351, 1856, 1656, - -2132, 1006, 770, -1294, - -472, 776, 1661, 2248, - -121, -574, -1481, -316, - 2565, -1081, 188, 293, - 398, 2598, 704, -1129, - 1023, 104, 550, 499, - -416, 127, 253, -1894, - 456, -2578, 190, 1018, - -1488, 286, -1202, -915, - -1164, 1874, 1651, 302, - -1312, -1547, -1625, -1516, - 170, -233, 817, 1209, - -1090, 341, 709, 725, - 854, 819, -278, -1083, - -15, 113, 286, 283, - 1166, -906, 1880, 301, - 342, -7, -587, 776, - -785, -1259, -1166, 3194, - -1630, -1071, 300, -1080, - -12, 190, -538, -493, - 351, 907, 1929, -1534, - 480, 36, 593, -526, - 813, 1216, 986, 89, - 98, 1010, -2272, 268, - 2766, -102, -1307, -873, - -1660, -467, -365, 47, - 1496, 1277, -228, -2791, - 1565, -669, 520, -1598, - -361, 1078, 457, -364, - 543, -950, 28, 248, - 1904, 815, -1034, 1125, - -13, -1951, 1085, -1005, - -2223, 1519, -624, 857, - 1121, 831, 872, 1295, - 193, 2284, -422, 609, - -156, 827, -733, 2065, - -3390, -3384, -3197, -3220, - 31, 896, 539, 978, - -21, 408, 1502, 405, - -583, -1662, -665, -164, - 2193, 976, 613, -436, -}; - -const Word16 EnvCdbk3rd_fx[N_CB3RD * DIM3RD] = /*Q8 */ -{ - 1031, -2454, 748, - 2770, 2442, 1761, - -2348, 4079, -959, - 1874, -735, -2242, - -59, 35, 201, - -1518, 162, 1809, - -1977, -1063, -103, - 2485, 1212, -863, - 882, 192, 39, - 1356, 851, 979, - -1377, -2961, -1477, - 497, -808, 593, - -394, -748, -1564, - -950, -198, -436, - -503, -1420, -234, - 318, 985, -1905, - -118, 1783, 1563, - 220, 929, 400, - 857, 37, -995, - -807, 1943, -409, - -743, -524, 552, - 940, 1643, -299, - 805, -1421, -768, - -2330, 705, 156, - 61, 203, 1213, - -138, 517, -642, - 64, -501, -435, - 2194, -625, 157, - -1600, 341, -1611, - 1137, -351, 2353, - -811, -1715, 1522, - -870, 613, 446, -}; - -const Word16 EnvCdbk4th_fx[N_CB4TH * DIM4TH] = /*Q8 */ -{ - 1024, -210, -207, 591, - -280, -2486, -951, 958, - 1539, 1136, 411, 1314, - 1761, -202, 1339, 203, - -2438, -2109, -2028, -2125, - 1849, -1408, -670, 144, - -469, 2674, -1589, -3604, - 1642, -702, 139, 2476, - -483, 372, -861, 540, - -119, 827, 863, 952, - 23, 99, -24, -303, - 488, -2233, -1432, -1399, - 54, -43, 96, -1527, - 1170, 133, -119, -717, - 258, -1215, -439, 160, - -1049, 793, 970, -770, - -1914, -1245, 1281, 422, - -1194, 1005, 176, -2368, - -1631, 1316, -1125, -361, - 1124, 1132, 61, -2186, - 790, -2055, 1174, 938, - 2974, 3874, 2315, 2040, - -300, 2484, 59, -860, - 543, 1307, -1868, -725, - 389, -115, -945, -146, - -1837, -578, -620, 975, - 389, 1779, 1732, 296, - 377, 897, 1555, 2269, - -854, 26, 590, 1413, - -780, -985, 1389, 2639, - 312, -277, -935, -3289, - 1740, 1852, 641, -519, - 738, 898, -466, 115, - 1187, -286, -1514, -1309, - 74, -801, -583, -987, - 510, -667, 430, -191, - 418, -303, 806, 1258, - -1083, -1065, 362, -2114, - -1075, 82, 260, 286, - -2579, 14, 75, -854, - -661, -634, 482, -581, - -338, -306, 3255, 388, - -230, -24, 1161, 205, - 256, 546, -141, 1379, - -63, -775, -484, 1478, - -517, -546, -451, 86, - 1473, -1201, 430, -1892, - 394, 831, 620, -664, - 334, 64, 1773, -1576, - -1783, 1270, 1020, 944, - 1023, 98, -1908, 1330, - -560, -1044, 380, 707, - -427, -708, -1815, -90, - -54, 2298, -537, 1151, - -499, 703, -1018, 3322, - 92, 717, -607, -1032, - -1313, -1393, -580, -485, - 34, -2192, 788, -860, - 2641, 628, -776, -259, - -702, -159, -1483, -1638, - -33, -63, 97, 553, - 692, 523, 548, 349, - -913, 54, -456, -702, - -341, 944, 157, 100, -}; - - -const Word16 EnvCdbkFB_fx[N_CB_FB * DIM_FB] = /*Q7 */ -{ - -2126, -1242, -945, - 1628, -686, -539, - 1230, 2245, 2532, - 2822, 3094, 2669, - -12376, -11507, -11342, - 2678, 3533, 3510, - 489, 903, 689, - 1930, 2929, 3025, - 3424, 4179, 4050, - -2500, -1707, -1415, - -3511, -2563, -2224, - -865, -987, -1212, - -424, 891, 1919, - 1976, 2520, 2277, - 673, 1667, 1945, - 5169, 6024, 5983, - -1367, -501, -236, - -254, 679, 989, - -18974, -18088, -17834, - -23007, -22053, -22109, - 2262, 2301, -625, - -124, 431, 372, - 1454, 1962, 1791, - 200, 1094, 1347, - -997, -110, 213, - -697, 267, 602, - -3066, -2172, -1876, - -4358, -3493, -3164, - -360, 59, -472, - -1813, -919, -601, - 4204, 4967, 4913, - 953, 1457, 1245 -}; - -const Word16 Mean_env_fb_fx[DIM_FB] = { 1760, 805, 473 }; /*Q8 */ - -const Word16 w_NOR_fx[SWB_FENV] = /*Q15 */ -{ - 32767, 32056, 31374, 30720, 30093, 29491, 28913, - 28357, 27822, 27307, 26810, 26331, 25869, 25423, -}; -const Word16 Mean_env_fx[SWB_FENV] = /*Q8 */ -{ - 7327, 7414, 7181, 7160, 6889, 6866, 6746, - 6651, 6385, 6152, 5873, 5668, 5435, 5222, -}; - -const Word16 Env_TR_Cdbk1_fx[N_CB_TR1 * DIM_TR1] = /*Q8 */ -{ - 229, -2347, - 8199, 7726, - -312, 1700, - 9881, 5949, - 8942, 8358, - 3865, 3287, - 2405, 796, - 3664, 1433, - 3059, 2215, - 618, 874, - -5479, -4636, - 2237, 2512, - 4265, 2428, - 6583, 2065, - 4548, 6579, - 11325, 7340, - 10578, 9264, - 8491, 6457, - -1380, -2484, - 3377, 5069, - 7393, 5120, - 4798, 4440, - 5506, 7614, - -3371, -3982, - 2806, 2959, - 2242, 3550, - 1334, 3065, - 2055, -1350, - 815, 5507, - 4940, 1457, - -1950, -1046, - 653, -1133, - 872, -3622, - -1756, 245, - 5792, 5542, - 4084, 7696, - 4569, 5204, - -810, -1555, - 10127, 10384, - 11341, 11713, - 6365, 4996, - 8641, 10527, - 5914, 3366, - 4522, 3266, - 5217, 2830, - 8107, 8980, - 3952, 5858, - 5848, 8990, - 6424, 5931, - 5185, 3823, - 6367, 6917, - 3548, 2683, - 1634, 2098, - 2729, -89, - 6964, 7664, - 3179, 3561, - 6388, 4193, - 4024, 4828, - -378, 434, - 9338, 9507, - 7593, 3483, - -6835, -6317, - 5207, 5029, - 11326, 10488, - 7411, 6086, - 10072, 8255, - -6099, -5652, - 7074, 8702, - -12228, -11384, - -11471, -10567, - -13025, -12253, - -12879, -11289, - -13952, -13062, - -16214, -15389, - -11659, -10789, - -12351, -11477, - -12789, -11947, - -15139, -14249, - -11326, -11219, - -11950, -11093, - -11800, -10928, - -23738, -22881, - 12795, 11890, - -3793, -2879, - -27373, -26492, - -11928, -11531, - -12110, -11258, - -20492, -19634, - -14371, -13608, - -12591, -11728, - -14055, -11739, - 9471, 7272, - -11184, -10335, - -13313, -11673, - -12209, -10610, - -13465, -12761, - 7690, 7115, - 2564, 4496, - 5587, 4551, - -813, -562, - -4483, -5521, - 1556, 98, - 2, 3468, - 1410, 1339, - 4049, 161, - -4538, -4026, - -9866, -9115, - -1616, -4727, - 2457, 1653, - 631, 2155, - -17982, -17082, - 2628, 6088, - -10791, -9933, - -12426, -11566, - 4322, 4000, - -1574, 2162, - -7968, -7599, - 1523, 4192, - 5621, 6537, - -2511, -1987, - 12471, 9218, - 8746, 4971, - 3642, 4148, - 5089, 5948, - 350, -92, - 7028, 6683, - -2430, -3216, - -3974, -886, -}; - -const Word16 Env_TR_Cdbk2_fx[N_CB_TR2 * DIM_TR2] = /*Q8 */ -{ - 2639, 375, - -481, 1694, - -2400, -3306, - 86, -4018, - -1301, 47, - 734, 299, - 957, -1039, - 2204, 1486, - 361, -1136, - 2628, -838, - -2010, 1296, - 373, 127, - -573, 2604, - 689, -1554, - 1676, -371, - 1298, 279, - -901, 1086, - 1747, -2723, - 214, -657, - -731, -909, - 1545, -1658, - -369, -2208, - -1276, 1748, - 1141, -522, - 186, -1893, - -1260, -2016, - -478, -504, - 1287, 1882, - -97, -1400, - -1372, -1165, - 800, -152, - 413, -240, - -208, -858, - -90, -399, - 492, 2519, - 913, 1368, - -344, 282, - 305, 526, - -251, 860, - -1066, 567, - -2800, -687, - 1, 674, - 176, 878, - -716, -153, - 706, 831, - -1083, -424, - 419, 1192, - -132, 565, - 708, -2406, - 600, -661, - 1712, 2969, - -1974, 379, - -672, 208, - 26, 296, - -1821, -501, - -513, 635, - 266, 1737, - -221, 1232, - -3498, 1632, - -337, -66, - -552, -1427, - 1329, 850, - -718, -2948, - -3, 0, -}; - -const Word16 Mean_env_tr_fx[5] = { 6971, 6095, 6111, 4995 }; /*Q8 */ - -/*------------------------------------------------------------------------------* - * LR MDCT SWB BWE coding tables - *------------------------------------------------------------------------------*/ - - -const Word16 gain_table_SWB_BWE_fx[NB_SWB_SUBBANDS] = { -6554/*-0.4f*/, 1638/*0.1f*/, 9830/*0.6f*/, 18022/*1.1f*/ }; /* Q14 */ - -const Word16 bits_lagIndices_modeNormal[NB_SWB_SUBBANDS] = {2, 2, 1, 1}; // Q0 -const Word16 subband_offsets_12KBPS[NB_SWB_SUBBANDS] = {SWB_SB_OFF0_12KBPS, SWB_SB_OFF1_12KBPS, SWB_SB_OFF2_12KBPS, SWB_SB_OFF3_12KBPS}; // Q0 -const Word16 subband_offsets_16KBPS[NB_SWB_SUBBANDS] = {SWB_SB_OFF0_16KBPS, SWB_SB_OFF1_16KBPS, SWB_SB_OFF2_16KBPS, SWB_SB_OFF3_16KBPS}; // Q0 - -/* Search offset for the subbands that use a partial search */ -const Word16 subband_search_offsets[NB_SWB_SUBBANDS] = -{ - 0, 0, 64, 64 -}; // Q0 - - - -/* SPT : shorten subband length table */ -const Word16 bw_SPT_tbl[2][SPT_SHORTEN_SBNUM]= -{ - {15, 31, 31, 31}, /* 13.2kbps: original band_width 53, 66, 82, 102 */ - {15, 15, 31, 31} /* 16.4kbps: original band_width 51 64, 80, 90 */ -}; - - -/* Harmonic Mode */ -const Word16 bits_lagIndices_mode0_Har[NB_SWB_SUBBANDS_HAR_SEARCH_SB] = {1,1}; // Q0 - - -/* 13.2 kbps */ -const Word16 subband_offsets_sub5_13p2kbps_Har[NB_SWB_SUBBANDS_HAR] = -{ - SWB_SB_OFF0_SUB5_12KBPS_HAR, SWB_SB_OFF1_SUB5_12KBPS_HAR, SWB_SB_OFF2_SUB5_12KBPS_HAR, SWB_SB_OFF3_SUB5_12KBPS_HAR -}; // Q0 - -/* Search offset for the subbands that use a partial search */ -const Word16 subband_search_offsets_13p2kbps_Har[NB_SWB_SUBBANDS_HAR_SEARCH_SB] = -{ - 120, 210 -}; // Q0 - -/* 16.4 kbps */ -const Word16 subband_offsets_sub5_16p4kbps_Har[NB_SWB_SUBBANDS_HAR] = -{ - SWB_SB_OFF0_SUB5_16KBPS_HAR, SWB_SB_OFF1_SUB5_16KBPS_HAR, SWB_SB_OFF2_SUB5_16KBPS_HAR, SWB_SB_OFF3_SUB5_16KBPS_HAR -}; // Q0 - -/* Search offset for the subbands that use a partial search */ -const Word16 subband_search_offsets_16p4kbps_Har[NB_SWB_SUBBANDS_HAR_SEARCH_SB] = -{ - 120, 210 -}; // Q0 - - -/*------------------------------------------------------------------------------* - * HQ core tables - *------------------------------------------------------------------------------*/ -const Word16 wscw16q15_fx[240] =/*Q15 */ -{ - -32768, -32766, -32764, -32759, -32754, -32747, -32738, -32729, -32717, -32705, -32691, - -32675, -32658, -32640, -32621, -32600, -32577, -32553, -32528, -32501, -32473, -32444, - -32413, -32381, -32348, -32313, -32276, -32239, -32200, -32159, -32117, -32074, -32029, - -31984, -31936, -31887, -31837, -31786, -31733, -31679, -31624, -31567, -31508, -31449, - -31388, -31326, -31262, -31197, -31131, -31063, -30994, -30924, -30853, -30780, -30705, - -30630, -30553, -30475, -30395, -30315, -30232, -30149, -30064, -29979, -29891, -29803, - -29713, -29622, -29530, -29436, -29341, -29245, -29148, -29049, -28949, -28848, -28746, - -28642, -28537, -28431, -28324, -28216, -28106, -27995, -27883, -27770, -27655, -27540, - -27423, -27305, -27186, -27066, -26944, -26821, -26698, -26573, -26447, -26320, -26191, - -26062, -25931, -25800, -25667, -25533, -25398, -25262, -25125, -24986, -24847, -24707, - -24565, -24423, -24279, -24135, -23989, -23843, -23695, -23546, -23397, -23246, 23095, - 22942, 22788, 22634, 22478, 22322, 22164, 22006, 21846, 21686, 21525, 21363, - 21199, 21035, 20871, 20705, 20538, 20371, 20202, 20033, 19863, 19692, 19520, - 19347, 19174, 18999, 18824, 18648, 18472, 18294, 18116, 17937, 17757, 17576, - 17395, 17213, 17030, 16846, 16662, 16477, 16291, 16105, 15917, 15730, 15541, - 15352, 15162, 14972, 14781, 14589, 14397, 14204, 14010, 13816, 13621, 13426, - 13230, 13033, 12836, 12639, 12441, 12242, 12043, 11843, 11643, 11442, 11241, - 11039, 10837, 10634, 10431, 10228, 10024, 9819, 9615, 9409, 9204, 8998, - 8791, 8585, 8377, 8170, 7962, 7754, 7545, 7336, 7127, 6918, 6708, - 6498, 6288, 6077, 5866, 5655, 5444, 5232, 5020, 4808, 4596, 4383, - 4171, 3958, 3745, 3532, 3319, 3105, 2892, 2678, 2464, 2250, 2036, - 1822, 1608, 1394, 1179, 965, 751, 536, 322, 107 -}; -const Word16 wscw16q15_8_fx[40] =/*Q15 */ -{ - -32762, -32711, -32610, -32459, -32258, -32007, -31706, -31357, - -30959, -30514, -30022, -29483, -28899, -28270, -27598, -26883, - -26127, -25330, -24494, -23621, 22711, 21766, 20788, 19777, - 18736, 17666, 16569, 15447, 14300, 13132, 11943, 10736, - 9512, 8274, 7022, 5760, 4490, 3212, 1929, 643 -}; -const Word16 wscw16q15_16_fx[80] =/*Q15 */ -{ - -32766, -32754, -32729, -32691, -32640, -32577, -32501, -32413, - -32313, -32200, -32074, -31936, -31786, -31624, -31449, -31262, - -31063, -30853, -30630, -30395, -30149, -29891, -29622, -29341, - -29049, -28746, -28431, -28106, -27770, -27423, -27066, -26698, - -26320, -25931, -25533, -25125, -24707, -24279, -23843, -23397, - 22942, 22478, 22006, 21525, 21035, 20538, 20033, 19520, - 18999, 18472, 17937, 17395, 16846, 16291, 15730, 15162, - 14589, 14010, 13426, 12836, 12242, 11643, 11039, 10431, - 9819, 9204, 8585, 7962, 7336, 6708, 6077, 5444, - 4808, 4171, 3532, 2892, 2250, 1608, 965, 322 -}; -const Word16 wscw16q15_32_fx[160] =/*Q15 */ -{ - -32768, -32764, -32758, -32749, -32736, -32720, -32701, -32679, -32654, -32626, -32594, - -32559, -32522, -32481, -32437, -32389, -32339, -32286, -32229, -32169, -32107, -32041, - -31972, -31900, -31825, -31747, -31665, -31581, -31494, -31403, -31310, -31214, -31114, - -31012, -30906, -30798, -30687, -30572, -30455, -30335, -30212, -30086, -29957, -29825, - -29690, -29553, -29412, -29269, -29123, -28974, -28823, -28668, -28511, -28351, -28188, - -28023, -27855, -27684, -27511, -27335, -27156, -26975, -26791, -26604, -26415, -26223, - -26029, -25833, -25633, -25432, -25228, -25021, -24812, -24601, -24387, -24171, -23953, - -23732, -23509, -23284, 23056, 22827, 22595, 22361, 22125, 21886, 21646, 21403, - 21159, 20912, 20663, 20413, 20160, 19905, 19649, 19390, 19130, 18868, 18604, - 18338, 18071, 17802, 17531, 17258, 16984, 16708, 16430, 16151, 15871, 15588, - 15305, 15019, 14733, 14445, 14155, 13865, 13572, 13279, 12984, 12688, 12391, - 12093, 11793, 11492, 11191, 10888, 10584, 10279, 9973, 9666, 9358, 9049, - 8740, 8429, 8118, 7806, 7493, 7180, 6865, 6550, 6235, 5919, 5602, - 5285, 4967, 4649, 4330, 4011, 3692, 3372, 3052, 2731, 2411, 2090, - 1768, 1447, 1126, 804, 483, 161 -}; - -/* Codebook for quantization of norms */ -const Word32 dicn_fx[40] = /* Q=14 */ -{ - 2147483647, 1518500224, - 1073741824, 759250112, - 536870912, 379625056, - 268435456, 189812528, - 134217728, 94906264, - 67108864, 47453132, - 33554432, 23726566, - 16777216, 11863283, - 8388608, 5931642, - 4194304, 2965821, - 2097152, 1482910, - 1048576, 741455, - 524288, 370728, - 262144, 185364, - 131072, 92682, - 65536, 46341, - 32768, 23170, - 16384, 11585, - 8192, 5793, - 4096, 2896 -}; - -const Word32 dicn_pg_fx[45] = /* Q12 */ -{ - 536870912, 451452834, 379625056, 319225344, 268435456, - 225726416, 189812528, 159612672, 134217728, 112863208, - 94906264, 67108864, 47453132, 33554432, 23726566, - 16777216, 11863283, 8388608, 5931641, 4194304, - 2965821, 2097152, 1482910, 1048576, 741455, - 524288, 370728, 262144, 185364, 131072, - 92682, 65536, 46341, 32768, 23170, - 16384, 11585, 8192, 5793, 4096, - 2896, 2048, 1448, 1024, 724 -}; -const Word16 expPkEnrg_tbl[45] = -{ - 0, 0, 0, 0, 0, 2, 2, 2, 2, - 4, 4, 4, 6, 6, 8, 8, 10, 10, - 12, 12, 14, 14, 16, 16, 18, 18, 20, - 20, 22, 22, 24, 24, 26, 26, 28, 28, - 30, 30, 32, 32, 34, 34, 36, 36, 38 -}; // Q0 - -const Word32 manPkEnrg_tbl[45] = -{ - 2147483646, 1518500308, 1073741787, 759250076, 536870912, - 1518500294, 1073741787, 759250076, 536870912, 1518500294, - 1073741787, 536870912, 1073741787, 536870912, 1073741787, - 536870912, 1073741787, 536870912, 1073741606, 536870912, - 1073741968, 536870912, 1073741244, 536870912, 1073741244, - 536870912, 1073744140, 536870912, 1073744140, 536870912, - 1073744140, 536870912, 1073744140, 536870912, 1073697800, - 536870912, 1073697800, 536870912, 1073883168, 536870912, - 1073512448, 536870912, 1073512448, 536870912, 1073512448 -}; // Q0 -const Word32 E_max5_tbl[40] = -{ - 2047999999, 1448154663, 1024000000, 1448154663, 1024000000, - 1448154663, 1024000000, 1448154663, 1024000000, 1448154663, - 1024000000, 1448154663, 1024000000, 1448154663, 1024000000, - 1448154663, 1024000000, 1448154785, 1024000000, 1448154785, - 1024000000, 1448154296, 1024000000, 1448154296, 1024000000, - 1448156250, 1024000000, 1448156250, 1024000000, 1448156250, - 1024000000, 1448156250, 1024000000, 1448125000, 1024000000, - 1448125000, 1024000000, 1448250000, 1024000000, 1448000000 -}; // Q0 - - -const Word16 resize_huffsizn[32] = -{ - 0, 0, 0, 0, 0, 11, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, - 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0 -}; // Q0 - -const Word16 huffsizn[32] = -{ - 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 4, 4, 3, 3, - 3, 3, 4, 4, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7 -}; // Q0 - -const Word16 huffnorm_tran[32] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 10, 6, 1, - 0, 3, 2, 26, 58, 186, 442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; // Q0 - -const Word16 huffsizn_tran[32] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 5, 3, 2, 2, - 2, 4, 6, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; // Q0 - -const Word16 pgain_huffsizn[32] = -{ - 10, 11, 10, 10, 9, 8, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 10, 10, 12, 12 -}; // Q0 - -const Word16 dicnlg2_float[40] = -{ - 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, - 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, - 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, - 4, 3, 2, 1, 0, -1, -2, -3, -4, -5 -}; // Q0 - -/*** Table for quantization of MLT coefficients ***/ -const Word16 norm_order_48[NB_SFM] = -{ - 0, 1, 8, 9, 16, 20, 24, 28, 32, 36, 40, 41, 37, 33, 29, 25, 21, 17, 11, 10, 3, 2, - 4, 5, 12, 13, 18, 22, 26, 30, 34, 38, 42, 43, 39, 35, 31, 27, 23, 19, 15, 14, 7, 6 -}; // Q0 - -const Word16 norm_order_32[SFM_N_SWB] = -{ - 0, 1, 8, 9, 16, 20, 24, 28, 32, 36, 37, 33, 29, 25, 21, 17, 11, 10, 3, 2, - 4, 5, 12, 13, 18, 22, 26, 30, 34, 38, 35, 31, 27, 23, 19, 15, 14, 7, 6 -}; // Q0 - -const Word16 norm_order_16[SFM_N_WB] = -{ - 0, 1, 8, 9, 16, 20, 24, 21, 17, 11, 10, 3, 2, - 4, 5, 12, 13, 18, 22, 25, 23, 19, 15, 14, 7, 6 -}; // Q0 - -const Word16 intl_bw_16[N_INTL_GRP_16] = {16, 16}; // Q0 -const Word16 intl_bw_32[N_INTL_GRP_32] = {16, 24}; // Q0 -const Word16 intl_bw_48[N_INTL_GRP_48] = {16, 24, 32}; // Q0 - -const Word16 intl_cnt_16[N_INTL_GRP_16] = {4, 1}; // Q0 -const Word16 intl_cnt_32[N_INTL_GRP_32] = {4, 4}; // Q0 -const Word16 intl_cnt_48[N_INTL_GRP_48] = {4, 3, 2}; // Q0 - -const Word16 band_start_HQ[44] = -{ - 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, - 96, 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, - 256, 280, 304, 328, 352, 376, 400, 424, 448, 472, 496, 520, - 544, 576, 608, 640, 672, 704, 736, 768 -}; // Q0 - -const Word16 band_end_HQ[44] = -{ - 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, - 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, 256, - 280, 304, 328, 352, 376, 400, 424, 448, 472, 496, 520, 544, - 576, 608, 640, 672, 704, 736, 768, 800 -}; // Q0 - -const Word16 band_len_HQ[44] = -{ - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 32, 32, 32, 32, 32, 32, 32, 32 -}; // Q0 - -const Word16 band_start_wb[26] = -{ - 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, - 96, 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, - 256, 288 -}; // Q0 - -const Word16 band_end_wb[26] = -{ - 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, - 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, 256, - 288, 320 -}; // Q0 - -const Word16 band_len_wb[26] = -{ - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, - 32, 32 -}; // Q0 -const Word16 band_len_harm_float[SFM_N_HARM_FB] = // Q0 -{ - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 16, 16, 16, 16, 16, 16, 32, 32, 32, 48, 48, 48, 48, 64, 64, 64, 96 -}; - -const Word16 band_start_harm[SFM_N_HARM_FB] =//Q0 -{ - 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, - 128, 144, 160, 176, 192, 208, 224, 256, 288, 320, 368, 416, 464, 512, 576, 640, 704 -}; - -const Word16 band_end_harm[SFM_N_HARM_FB] =//Q0 -{ - 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, - 144, 160, 176, 192, 208, 224, 256, 288, 320, 368, 416, 464, 512, 576, 640, 704, 800 -}; - -const Word16 rat_fx[SFM_N_WB] = { 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, - 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 13107, 13107 -};//Q14 - -const Word16 sfm_width[20] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 8}; // Q0 -const Word16 a_map[20] = {8, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 7, 11}; // Q0 - - -const Word32 SQRT_DIM_fx[65] = /* sqrt(x) for x = 0, 1, ..., 64. in Q15 */ -{ - 0, 32768, 46341, 56756, 65536, 73271, 80265, 86696, - 92682, 98304, 103622, 108679, 113512, 118147, 122607, 126910, - 131072, 135106, 139023, 142832, 146543, 150162, 153696, 157150, - 160530, 163840, 167085, 170268, 173392, 176461, 179478, 182445, - 185364, 188238, 191069, 193858, 196608, 199320, 201996, 204636, - 207243, 209818, 212361, 214874, 217358, 219814, 222243, 224646, - 227023, 229376, 231705, 234010, 236293, 238555, 240795, 243014, - 245213, 247393, 249554, 251696, 253820, 255926, 258015, 260088, - 262144 -}; - - - -/*------------------------------------------------------------------------------* - * HQ core tables for SWB signals - *------------------------------------------------------------------------------*/ - -const Word16 short_window_48kHz_fx[L_FRAME48k / 2 / 2] = /* second half is symetric and omitted Q15*/ -{ - 107, 322, 536, 751, 965, 1179, 1394, 1608, 1822, 2036, 2250, 2464, 2678, 2892, 3105, 3319, - 3532, 3745, 3958, 4171, 4383, 4596, 4808, 5020, 5232, 5444, 5655, 5866, 6077, 6288, 6498, 6708, - 6918, 7127, 7336, 7545, 7754, 7962, 8170, 8377, 8585, 8791, 8998, 9204, 9409, 9615, 9819, 10024, - 10228, 10431, 10634, 10837, 11039, 11241, 11442, 11643, 11843, 12043, 12242, 12441, 12639, 12836, 13033, 13230, - 13426, 13621, 13816, 14010, 14204, 14397, 14589, 14781, 14972, 15162, 15352, 15541, 15730, 15917, 16105, 16291, - 16477, 16662, 16846, 17030, 17213, 17395, 17576, 17757, 17937, 18116, 18294, 18472, 18648, 18824, 18999, 19174, - 19347, 19520, 19692, 19863, 20033, 20202, 20371, 20538, 20705, 20871, 21035, 21199, 21363, 21525, 21686, 21846, - 22006, 22164, 22322, 22478, 22634, 22788, 22942, 23095, 23246, 23397, 23546, 23695, 23843, 23989, 24135, 24279, - 24423, 24565, 24707, 24847, 24986, 25125, 25262, 25398, 25533, 25667, 25800, 25931, 26062, 26191, 26320, 26447, - 26573, 26698, 26821, 26944, 27066, 27186, 27305, 27423, 27540, 27655, 27770, 27883, 27995, 28106, 28216, 28324, - 28431, 28537, 28642, 28746, 28848, 28949, 29049, 29148, 29245, 29341, 29436, 29530, 29622, 29713, 29803, 29891, - 29979, 30064, 30149, 30232, 30315, 30395, 30475, 30553, 30630, 30705, 30780, 30853, 30924, 30994, 31063, 31131, - 31197, 31262, 31326, 31388, 31449, 31508, 31567, 31624, 31679, 31733, 31786, 31837, 31887, 31936, 31984, 32029, - 32074, 32117, 32159, 32200, 32239, 32276, 32313, 32348, 32381, 32413, 32444, 32473, 32501, 32528, 32553, 32577, - 32600, 32621, 32640, 32658, 32675, 32691, 32705, 32717, 32729, 32738, 32747, 32754, 32759, 32764, 32766, 32767, -}; -const Word16 short_window_32kHz_fx[L_FRAME32k / 2 / 2] = /* second half is symetric and omitted Q15*/ -{ - 161, 483, 804, 1126, 1447, 1768, 2090, 2411, 2731, 3052, 3372, 3692, 4011, 4330, 4649, 4967, - 5285, 5602, 5919, 6235, 6550, 6865, 7180, 7493, 7806, 8118, 8429, 8740, 9049, 9358, 9666, 9973, - 10279, 10584, 10888, 11191, 11492, 11793, 12093, 12391, 12688, 12984, 13279, 13572, 13865, 14155, 14445, 14733, - 15019, 15305, 15588, 15871, 16151, 16430, 16708, 16984, 17258, 17531, 17802, 18071, 18338, 18604, 18868, 19130, - 19390, 19649, 19905, 20160, 20413, 20663, 20912, 21159, 21403, 21646, 21886, 22125, 22361, 22595, 22827, 23056, - 23284, 23509, 23732, 23953, 24171, 24387, 24601, 24812, 25021, 25228, 25432, 25633, 25833, 26029, 26223, 26415, - 26604, 26791, 26975, 27156, 27335, 27511, 27684, 27855, 28023, 28188, 28351, 28511, 28668, 28823, 28974, 29123, - 29269, 29412, 29553, 29690, 29825, 29957, 30086, 30212, 30335, 30455, 30572, 30687, 30798, 30906, 31012, 31114, - 31214, 31310, 31403, 31494, 31581, 31665, 31747, 31825, 31900, 31972, 32041, 32107, 32169, 32229, 32286, 32339, - 32389, 32437, 32481, 32522, 32559, 32594, 32626, 32654, 32679, 32701, 32720, 32736, 32749, 32758, 32764, 32767, -}; - -const Word16 short_window_16kHz_fx[L_FRAME16k / 2 / 2] = /* second half is symetric and omitted Q15*/ -{ - 322, 965, 1608, 2250, 2892, 3532, 4171, 4808, 5444, 6077, 6708, 7336, 7962, 8585, 9204, 9819, - 10431, 11039, 11643, 12242, 12836, 13426, 14010, 14589, 15162, 15730, 16291, 16846, 17395, 17937, 18472, 18999, - 19520, 20033, 20538, 21035, 21525, 22006, 22478, 22942, 23397, 23843, 24279, 24707, 25125, 25533, 25931, 26320, - 26698, 27066, 27423, 27770, 28106, 28431, 28746, 29049, 29341, 29622, 29891, 30149, 30395, 30630, 30853, 31063, - 31262, 31449, 31624, 31786, 31936, 32074, 32200, 32313, 32413, 32501, 32577, 32640, 32691, 32729, 32754, 32766, -}; - -const Word16 short_window_8kHz_fx[L_FRAME8k / 2 / 2] = /* second half is symetric and omitted Q15*/ -{ - 643, 1929, 3212, 4490, 5760, 7022, 8274, 9512, - 10736, 11943, 13132, 14300, 15447, 16569, 17666, 18736, - 19777, 20788, 21766, 22711, 23621, 24494, 25330, 26127, - 26883, 27598, 28270, 28899, 29483, 30022, 30514, 30959, - 31357, 31706, 32007, 32258, 32459, 32610, 32711, 32762, -}; - -const Word16 inv_jp2[64] =//Q15 -{ - 16384, 10923, 8192, 6554, 5461, 4681, 4096, 3641, 3277, 2979, 2731, 2521, 2341, 2185, 2048, 1928, - 1820, 1725, 1638, 1560, 1489, 1425, 1365, 1311, 1260, 1214, 1170, 1130, 1092, 1057, 1024, 993, - 964, 936, 910, 886, 862, 840, 819, 799, 780, 762, 745, 728, 712, 697, 683, 669, - 655, 643, 630, 618, 607, 596, 585, 575, 565, 555, 546, 537, 529, 520, 512, 504 -}; -const Word16 subf_norm_groups[4][11] = -{ - {0,1,8,9,16,20,24,28,32,36,40}, - {2,3,10,11,17,21,25,29,33,37,41}, - {4,5,12,13,18,22,26,30,34,38,42}, - {6,7,14,15,19,23,27,31,35,39,43} -}; // Q0 - -const Word16 gain_att_fx[40] = /* Q=15 */ -{ - 15711, 19367, 21781, 23743, 24899, 25929, 26758, 27514, - 28059, 28562, 28994, 29398, 29693, 29970, 30213, 30442, - 30619, 30786, 30936, 31077, 31190, 31298, 31395, 31488, - 31564, 31637, 31704, 31768, 31822, 31873, 31920, 31966, - 32005, 32042, 32077, 32111, 32140, 32168, 32195, 32220 -}; - -const Word16 stab_trans_fx[10] = /* Q15 */ -{ - 16384, 11381, 7232, 4292, 2433, - 1341, 728, 391, 209, 112 -}; - -const Word16 env_stab_tp_fx[2][2] = /* Q15 */ -{ - {32735, 16384}, - {33, 16384} -}; - -const Word16 att_step_fx[4] = /* Q=13 */ -{ - 32767, 16384, 10923, 8192 -}; - -const Word32 table_logcum_fx[563] =//Q16 -{ - 0, 0, 0, 65536, 169408, 300480, 452650, 622058, 806041, - 1002649, 1210393, 1428099, 1654816, 1889761, 2132272, 2381791, 2637833, - 2899977, 3167853, 3441134, 3719526, 4002767, 4290623, 4582876, 4879332, - 5179812, 5484152, 5792200, 6103816, 6418871, 6737244, 7058822, 7383500, - 7711180, 8041769, 8375181, 8711333, 9050150, 9391557, 9735485, 10081869, - 10430647, 10781759, 11135150, 11490766, 11848556, 12208469, 12570461, 12934487, - 13300503, 13668469, 14038345, 14410092, 14783676, 15159061, 15536214, 15915101, - 16295692, 16677956, 17061866, 17447390, 17834504, 18223180, 18613394, 19005122, - 19398338, 19793020, 20189146, 20586692, 20985640, 21385968, 21787658, 22190686, - 22595040, 23000696, 23407638, 23815850, 24225314, 24636014, 25047934, 25461060, - 25875374, 26290862, 26707510, 27125304, 27544232, 27964278, 28385428, 28807674, - 29231000, 29655392, 30080844, 30507338, 30934866, 31363416, 31792978, 32223540, - 32655092, 33087624, 33521126, 33955588, 34391000, 34827352, 35264636, 35702840, - 36141960, 36581988, 37022908, 37464716, 37907404, 38350964, 38795388, 39240668, - 39686792, 40133760, 40581560, 41030188, 41479632, 41929888, 42380948, 42832808, - 43285456, 43738892, 44193104, 44648088, 45103840, 45560348, 46017612, 46475624, - 46934376, 47393864, 47854080, 48315024, 48776684, 49239060, 49702144, 50165928, - 50630412, 51095588, 51561452, 52028000, 52495224, 52963124, 53431688, 53900916, - 54370808, 54841348, 55312540, 55784380, 56256856, 56729972, 57203720, 57678096, - 58153096, 58628716, 59104952, 59581800, 60059256, 60537316, 61015980, 61495236, - 61975084, 62455524, 62936548, 63418156, 63900340, 64383100, 64866428, 65350328, - 65834792, 66319816, 66805396, 67291536, 67778224, 68265456, 68753240, 69241560, - 69730424, 70219816, 70709744, 71200208, 71691192, 72182704, 72674736, 73167280, - 73660344, 74153920, 74648008, 75142600, 75637704, 76133296, 76629400, 77125992, - 77623080, 78120656, 78618728, 79117280, 79616320, 80115840, 80615832, 81116312, - 81617256, 82118680, 82620568, 83122920, 83625744, 84129024, 84632768, 85136968, - 85641624, 86146728, 86652288, 87158304, 87664760, 88171664, 88679008, 89186792, - 89695016, 90203680, 90712776, 91222304, 91732256, 92242648, 92753464, 93264704, - 93776368, 94288448, 94800952, 95313872, 95827208, 96340960, 96855120, 97369696, - 97884672, 98400064, 98915856, 99432048, 99948648, 100465640, 100983040, 101500832, - 102019016, 102537592, 103056568, 103575928, 104095672, 104615808, 105136328, 105657232, - 106178520, 106700184, 107222232, 107744656, 108267456, 108790632, 109314176, 109838096, - 110362384, 110887040, 111412064, 111937448, 112463208, 112989320, 113515800, 114042640, - 114569832, 115097392, 115625304, 116153568, 116682184, 117211160, 117740480, 118270152, - 118800168, 119330536, 119861248, 120392312, 120923712, 121455448, 121987536, 122519960, - 123052720, 123585816, 124119248, 124653016, 125187120, 125721552, 126256320, 126791416, - 127326840, 127862592, 128398664, 128935072, 129471800, 130008856, 130546224, 131083920, - 131621936, 132160272, 132698920, 133237888, 133777176, 134316768, 134856688, 135396912, - 135937440, 136478288, 137019440, 137560912, 138102688, 138644768, 139187152, 139729840, - 140272832, 140816128, 141359712, 141903616, 142447808, 142992304, 143537104, 144082192, - 144627568, 145173248, 145719232, 146265504, 146812064, 147358912, 147906048, 148453488, - 149001200, 149549216, 150097504, 150646096, 151194960, 151744112, 152293536, 152843264, - 153393264, 153943536, 154494096, 155044944, 155596064, 156147456, 156699120, 157251072, - 157803296, 158355792, 158908560, 159461616, 160014928, 160568512, 161122368, 161676496, - 162230896, 162785568, 163340496, 163895696, 164451168, 165006896, 165562896, 166119152, - 166675664, 167232448, 167789504, 168346816, 168904368, 169462208, 170020288, 170578624, - 171137232, 171696080, 172255200, 172814560, 173374192, 173934064, 174494192, 175054576, - 175615216, 176176096, 176737232, 177298608, 177860256, 178422128, 178984256, 179546640, - 180109264, 180672128, 181235248, 181798608, 182362208, 182926064, 183490144, 184054480, - 184619056, 185183872, 185748928, 186314224, 186879760, 187445520, 188011536, 188577776, - 189144272, 189710992, 190277936, 190845136, 191412560, 191980208, 192548112, 193116224, - 193684592, 194253168, 194821984, 195391040, 195960320, 196529824, 197099568, 197669520, - 198239712, 198810144, 199380784, 199951648, 200522752, 201094080, 201665616, 202237392, - 202809376, 203381600, 203954032, 204526688, 205099568, 205672672, 206246000, 206819536, - 207393296, 207967280, 208541472, 209115888, 209690528, 210265376, 210840432, 211415712, - 211991216, 212566912, 213142848, 213718976, 214295328, 214871888, 215448672, 216025664, - 216602864, 217180272, 217757888, 218335712, 218913760, 219492000, 220070464, 220649120, - 221228000, 221807072, 222386368, 222965856, 223545552, 224125456, 224705568, 225285872, - 225866400, 226447120, 227028032, 227609168, 228190496, 228772016, 229353760, 229935680, - 230517824, 231100160, 231682688, 232265424, 232848352, 233431472, 234014800, 234598336, - 235182048, 235765968, 236350080, 236934400, 237518896, 238103600, 238688496, 239273600, - 239858880, 240444352, 241030032, 241615888, 242201952, 242788192, 243374640, 243961264, - 244548096, 245135104, 245722304, 246309696, 246897280, 247485056, 248073008, 248661152, - 249249488, 249838016, 250426720, 251015616, 251604704, 252193968, 252783424, 253373056, - 253962880, 254552896, 255143088, 255733472, 256324032, 256914768, 257505696, 258096800, - 258688096, 259279568, 259871216, 260463056, 261055056, 261647264, 262239632, 262832192, - 263424928, 264017840, 264610928, 265204192, 265797632, 266391264, 266985072, 267579040, - 268173200, 268767520, 269362048, 269956736, 270551584, 271146624, 271741824, 272337216, - 272932768, 273528480, 274124384, 274720480, 275316704, 275913120, 276509728, 277106496, - 277703424, 278300544, 278897824, 279495264, 280092896, 280690688, 281288640, 281886752, - 282485056, 283083520 -}; -const Word32 pow_getbitsfrompulses_fx[16] = /*Q21 */ -{ - 2097152, 2190001, 2286961, 2388214, 2493948, 2604365, 2719671, 2840081, - 2965822, 3097129, 3234251, 3377442, 3526976, 3683128, 3846194, 4016480 -}; -const Word16 DDP_fx[4] = { 3, 0, 1, 2 };//Q0 - -const Word16 step_tcq[8][STATES] = { {0,4}, {0,4}, {1,5}, {1,5}, {2,6}, {2,6}, {3,7}, {3,7} }; // Q0 -const Word16 denc[8][STATES] = { {0,2}, {2,0}, {1,3}, {3,1}, {2,0}, {0,2}, {3,1}, {1,3} }; /* enc trellis Q0*/ -const Word16 ddec[8][STATES] = { {0,2}, {1,3}, {2,0}, {3,1}, {2,0}, {3,1}, {0,2}, {1,3} }; /* dec trellis Q0*/ - - -const Word16 step_LSB[STATES_LSB][2] = { {0,1}, {2,3}, {0,1}, {2,3} }; // Q0 -const Word16 denc_LSB[STATES_LSB][2] = { {0,3}, {2,1}, {3,0}, {1,2} }; // Q0 -const Word16 dqnt_LSB[STATES_LSB][4] = { {0,8,1,8}, {0,8,1,8}, {8,0,8,1}, {8,0,8,1} }; // Q0 - -const Word16 dstep_LSB[4][2] = { {0,2}, {0,2}, {1,3}, {1,3} }; // Q0 -const Word16 ddec_LSB[4][2] = { {0,3}, {3,0}, {2,1}, {1,2} }; // Q0 - - -const Word16 nextstate[STATES][2] = {{0, 1}, {2, 3}, {4, 5}, {6, 7}, {0, 1}, {2, 3}, {4, 5}, {6, 7}};/*current state points to next two states Q0*/ - -/*------------------------------------------------------------------------------* - * PVQ tables - *------------------------------------------------------------------------------*/ - -const Word16 fine_gain_bits[8] = {0, 0, 0, 1, 2, 2, 4, 5}; // Q0 -const Word16 finegain_1_fx[2] = { -12204, 12647 }; /* Q14 */ -const Word16 finegain_2_fx[4] = { -17773, -5925, 6010, 18769 }; /* Q14 */ -const Word16 finegain_3_fx[8] = { -16384, -11703, -7022, -2341, 2341, 7022, 11703, 16384 }; /* Q14 */ -const Word16 finegain_4_fx[16] = /* Q14 */ -{ - -21683, -18292, -14998, -11876, -8936, -6239, -3702, -1371, - 945, 3275, 6088, 9079, 12450, 15999, 19796, 23868 -}; -const Word16 finegain_5_fx[32] = /* Q14 */ -{ - -21462, -18895, -16284, -14135, -12605, -11307, -10139, -8910, - -8028, -6792, -5638, -4812, -3672, -2681, -1725, -479, - 449, 1390, 2364, 3433, 4579, 5516, 6769, 7767, - 9085, 10152, 11009, 12535, 14765, 17093, 20094, 24716 -}; -const Word16* finegain_fx[5] = { finegain_1_fx, finegain_2_fx, finegain_3_fx, finegain_4_fx, finegain_5_fx };/* Q14 */ - - -const UWord8 hBitsMinus1_N01[2] = {1, 7}; // Q0 - -const UWord8 hBitsMinus1_N02[65]= -{ - 64, 15, 23, 28, 31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, - 47, 48, 49, 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, 57, 58, 59, - 60, 61, 62, 63, 63, 64, 65, 65, 67, 68, 69, 69, 70, 71, 72, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 80, 81, 82, 83, 84, 85, 86, 87, - 87 -}; // Q0 - -const UWord8 hBitsMinus1_N03[65]= -{ - 64, 20, 33, 41, 48, 53, 57, 61, 64, 66, 69, 71, 73, 75, 76, 78, - 80, 81, 82, 83, 85, 86, 88, 90, 92, 93, 95, 96, 98, 99, 100, 102, - 104, 106, 108, 110, 111, 113, 114, 115, 118, 120, 122, 123, 125, 127, 128, 129, - 131, 133, 135, 137, 139, 141, 142, 144, 145, 146, 149, 151, 153, 155, 157, 158, - 160 -}; // Q0 - -const UWord8 hBitsMinus1_N04[65]= -{ - 64, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, 97, 100, 102, 105, - 107, 109, 111, 113, 115, 116, 119, 122, 125, 127, 130, 132, 134, 136, 138, 141, - 144, 147, 150, 152, 154, 156, 158, 160, 164, 167, 170, 173, 175, 177, 180, 182, - 184, 187, 190, 193, 196, 199, 201, 203, 205, 207, 211, 214, 217, 220, 222, 225, - 227 -}; // Q0 - -const UWord8 hBitsMinus1_N05[54]= -{ - 53, 26, 45, 59, 70, 79, 87, 94, 100, 105, 110, 114, 118, 122, 125, 128, - 131, 134, 136, 139, 141, 144, 148, 152, 155, 158, 161, 164, 167, 170, 172, 176, - 181, 184, 188, 191, 194, 197, 200, 202, 207, 211, 215, 219, 222, 225, 228, 231, - 233, 238, 242, 246, 250, 253 -}; // Q0 - -const UWord8 hBitsMinus1_N06[42]= -{ - 41, 28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, - 153, 156, 159, 162, 165, 168, 173, 178, 183, 187, 191, 194, 198, 201, 204, 209, - 214, 219, 224, 228, 231, 235, 238, 241, 247, 253 -}; // Q0 - -const UWord8 hBitsMinus1_N07[34]= -{ - 33, 30, 52, 70, 85, 98, 109, 118, 126, 134, 141, 147, 153, 158, 163, 168, - 172, 176, 180, 184, 188, 191, 197, 203, 208, 213, 218, 222, 226, 230, 233, 240, - 246, 252 -}; // Q0 - -const UWord8 hBitsMinus1_N08[29]= -{ - 28, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, 185, - 190, 195, 200, 204, 208, 212, 219, 226, 232, 238, 243, 248, 253 -}; // Q0 - -const UWord8 hBitsMinus1_N09[25]= -{ - 24, 33, 58, 79, 97, 112, 125, 137, 148, 157, 166, 174, 182, 189, 195, 201, - 207, 212, 217, 222, 227, 231, 240, 247, 254 -}; // Q0 - -const UWord8 hBitsMinus1_N10[22]= -{ - 21, 34, 61, 83, 101, 118, 132, 145, 157, 167, 177, 186, 194, 202, 209, 216, - 222, 228, 234, 239, 245, 250 -}; // Q0 - -const UWord8 hBitsMinus1_N11[19]= -{ - 18, 35, 63, 86, 106, 123, 139, 152, 165, 176, 187, 197, 206, 214, 222, 230, - 237, 243, 250 -}; // Q0 - -const UWord8 hBitsMinus1_N12[17]= -{ - 16, 36, 65, 89, 110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, - 250 -}; // Q0 - -const UWord8 hBitsMinus1_N13[16]= -{ - 15, 37, 67, 92, 113, 133, 150, 165, 180, 193, 205, 216, 227, 237, 246, 254, -}; // Q0 - -const UWord8 hBitsMinus1_N14[14]= -{ - 13, 38, 68, 94, 117, 137, 155, 171, 186, 200, 213, 225, 236, 247 -}; // Q0 - -const UWord8 hBitsMinus1_N15[13]= -{ - 12, 39, 70, 97, 120, 141, 160, 177, 193, 207, 221, 233, 245 -}; // Q0 - -const UWord8 hBitsMinus1_N16[13]= -{ - 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, 228, 241, 253 -}; // Q0 - -const UWord8 hBitsMinus1_N17[12]= -{ - 11, 40, 73, 101, 126, 148, 168, 187, 204, 220, 234, 248 -}; // Q0 - -const UWord8 hBitsMinus1_N18[12]= -{ - 11, 41, 74, 103, 128, 151, 172, 191, 209, 225, 241, 255 -}; // Q0 - -const UWord8 hBitsMinus1_N19[11]= -{ - 10, 41, 75, 105, 131, 154, 176, 196, 214, 231, 247 -}; // Q0 - -const UWord8 hBitsMinus1_N20[11]= -{ - 10, 42, 77, 107, 133, 157, 179, 200, 219, 236, 253 -}; // Q0 - -const UWord8 hBitsMinus1_N21[10]= -{ - 9, 43, 78, 108, 135, 160, 183, 204, 223, 241 -}; // Q0 - -const UWord8 hBitsMinus1_N22[10]= -{ - 9, 43, 79, 110, 138, 163, 186, 207, 227, 246 -}; // Q0 - -const UWord8 hBitsMinus1_N23[10]= -{ - 9, 44, 80, 111, 140, 165, 189, 211, 231, 250 -}; // Q0 - -const UWord8 hBitsMinus1_N24[10]= -{ - 9, 44, 81, 113, 142, 168, 192, 214, 235, 255 -}; // Q0 - -const UWord8 hBitsMinus1_N25[9]= -{ - 8, 45, 82, 114, 143, 170, 195, 217, 239 -}; // Q0 - -const UWord8 hBitsMinus1_N26[9]= -{ - 8, 45, 83, 116, 145, 172, 197, 221, 242 -}; // Q0 - -const UWord8 hBitsMinus1_N27[9]= -{ - 8, 46, 84, 117, 147, 175, 200, 224, 246 -}; // Q0 - -const UWord8 hBitsMinus1_N28[9]= -{ - 8, 46, 84, 118, 149, 177, 202, 227, 249 -}; // Q0 -const UWord8 hBitsMinus1_N29[9]= -{ - 8, 46, 85, 119, 150, 179, 205, 229, 252 -}; // Q0 -const UWord8 hBitsMinus1_N30[8]= -{ - 7, 47, 86, 121, 152, 181, 207, 232 -}; // Q0 -const UWord8 hBitsMinus1_N31[8]= -{ - 7, 47, 87, 122, 153, 182, 209, 235 -}; // Q0 -const UWord8 hBitsMinus1_N32[8]= -{ - 7, 47, 87, 123, 155, 184, 212, 237 -}; // Q0 -const UWord8 hBitsMinus1_N33[8]= -{ - 7, 48, 88, 124, 156, 186, 214, 240 -}; // Q0 -const UWord8 hBitsMinus1_N34[8]= -{ - 7, 48, 89, 125, 158, 188, 216, 242 -}; // Q0 -const UWord8 hBitsMinus1_N35[8]= -{ - 7, 49, 90, 126, 159, 189, 218, 245 -}; // Q0 -const UWord8 hBitsMinus1_N36[8]= -{ - 7, 49, 90, 127, 160, 191, 220, 247 -}; // Q0 -const UWord8 hBitsMinus1_N37[8]= -{ - 7, 49, 91, 128, 162, 193, 222, 249 -}; // Q0 -const UWord8 hBitsMinus1_N38[8]= -{ - 7, 49, 91, 129, 163, 194, 224, 251 -}; // Q0 -const UWord8 hBitsMinus1_N39[8]= -{ - 7, 50, 92, 130, 164, 196, 225, 253 -}; // Q0 -const UWord8 hBitsMinus1_N40[8]= -{ - 7, 50, 93, 131, 165, 197, 227, 255 -}; // Q0 -const UWord8 hBitsMinus1_N41[7]= -{ - 6, 50, 93, 131, 166, 199, 229 -}; // Q0 -const UWord8 hBitsMinus1_N42[7]= -{ - 6, 51, 94, 132, 167, 200, 230 -}; // Q0 -const UWord8 hBitsMinus1_N43[7]= -{ - 6, 51, 94, 133, 168, 201, 232 -}; // Q0 -const UWord8 hBitsMinus1_N44[7]= -{ - 6, 51, 95, 134, 170, 203, 234 -}; // Q0 -const UWord8 hBitsMinus1_N45[7]= -{ - 6, 51, 95, 135, 171, 204, 235 -}; // Q0 -const UWord8 hBitsMinus1_N46[7]= -{ - 6, 52, 96, 135, 172, 205, 237 -}; // Q0 -const UWord8 hBitsMinus1_N47[7]= -{ - 6, 52, 96, 136, 173, 206, 238 -}; // Q0 -const UWord8 hBitsMinus1_N48[7]= -{ - 6, 52, 97, 137, 174, 208, 240 -}; // Q0 -const UWord8 hBitsMinus1_N49[7]= -{ - 6, 52, 97, 138, 175, 209, 241 -}; // Q0 -const UWord8 hBitsMinus1_N50[7]= -{ - 6, 53, 98, 138, 175, 210, 243 -}; // Q0 -const UWord8 hBitsMinus1_N51[7]= -{ - 6, 53, 98, 139, 176, 211, 244 -}; // Q0 -const UWord8 hBitsMinus1_N52[7]= -{ - 6, 53, 99, 140, 177, 212, 245 -}; // Q0 -const UWord8 hBitsMinus1_N53[7]= -{ - 6, 53, 99, 140, 178, 213, 247 -}; // Q0 -const UWord8 hBitsMinus1_N54[7]= -{ - 6, 54, 100, 141, 179, 214, 248 -}; // Q0 -const UWord8 hBitsMinus1_N55[7]= -{ - 6, 54, 100, 142, 180, 216, 249 -}; // Q0 -const UWord8 hBitsMinus1_N56[7]= -{ - 6, 54, 100, 142, 181, 217, 250 -}; // Q0 -const UWord8 hBitsMinus1_N57[7]= -{ - 6, 54, 101, 143, 181, 218, 252 -}; -const UWord8 hBitsMinus1_N58[7]= -{ - 6, 54, 101, 143, 182, 219, 253 -}; // Q0 -const UWord8 hBitsMinus1_N59[7]= -{ - 6, 55, 102, 144, 183, 220, 254 -}; // Q0 -const UWord8 hBitsMinus1_N60[7]= -{ - 6, 55, 102, 145, 184, 221, 255 -}; // Q0 -const UWord8 hBitsMinus1_N61[6]= -{ - 5, 55, 102, 145, 185, 221 -}; // Q0 -const UWord8 hBitsMinus1_N62[6]= -{ - 5, 55, 103, 146, 185, 222 -}; // Q0 -const UWord8 hBitsMinus1_N63[6]= -{ - 5, 55, 103, 146, 186, 223 -}; // Q0 -const UWord8 hBitsMinus1_N64[6]= -{ - 5, 55, 103, 147, 187, 224 -}; // Q0 -const Word16 dsHighDiracsTab[PVQ_MAX_BAND_SIZE - DS_INDEX_LINEAR_END ] = -{ - 23, 25, 27, 29, 31, 33, 35, 37, 39, - 43, 47, 51, 55, 59, 63, 67, 71, 75, - 83, 91, 99, 107, 115, 123, 131, 139, 147, - 163, 179, 195, 211, 227, 243, 259, 275, 291, - 323, 355, 387, 419, 451, 483, 512 -}; // Q0 - -const UWord32 intLimCDivInvDQ31[67+1] = -{ - 0x00000000, 0x80000000, 0x40000000, 0x2aaaaaab, 0x20000000, 0x1999999a, 0x15555556, 0x12492493, - 0x10000000, 0x0e38e38f, 0x0ccccccd, 0x0ba2e8bb, 0x0aaaaaab, 0x09d89d8a, 0x0924924a, 0x08888889, - 0x08000000, 0x07878788, 0x071c71c8, 0x06bca1b0, 0x06666667, 0x06186187, 0x05d1745e, 0x0590b217, - 0x05555556, 0x051eb852, 0x04ec4ec5, 0x04bda130, 0x04924925, 0x0469ee59, 0x04444445, 0x04210843, - 0x04000000, 0x03e0f83f, 0x03c3c3c4, 0x03a83a84, 0x038e38e4, 0x03759f23, 0x035e50d8, 0x03483484, - 0x03333334, 0x031f3832, 0x030c30c4, 0x02fa0be9, 0x02e8ba2f, 0x02d82d83, 0x02c8590c, 0x02b93106, - 0x02aaaaab, 0x029cbc15, 0x028f5c29, 0x02828283, 0x02762763, 0x026a43a0, 0x025ed098, 0x0253c826, - 0x02492493, 0x023ee090, 0x0234f72d, 0x022b63cc, 0x02222223, 0x02192e2a, 0x02108422, 0x02082083, - 0x02000000, 0x01f81f82, 0x01f07c20, 0x01e9131b -}; // Q0 - -const UWord8 obtainEnergyQuantizerDensity_f[57] = - { - 1, 1, 1, 1, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 4, 4, 4, - 4, 4, 4, 6, 6, 6, 6, 8, - 8, 8, 10,10,12,12,14,14, - 16,18,20,20,22,24,26,30, - 32,34,38,42,46,50,54,58, - 64,70,76,82,90,98,108,118, 128 -}; // Q0 - - -/* (char)ceil(log2(hBitsN[N][0])) - 2) */ -const UWord8 f_log2_n[ PVQ_MAX_BAND_SIZE + 1] = -{ - 0xff, 0xff, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01}; // Q0 - -const UWord8 * const hBitsN[ PVQ_MAX_BAND_SIZE + 1 ]= -{ -f_log2_n/*N=0*/, hBitsMinus1_N01, hBitsMinus1_N02, hBitsMinus1_N03, hBitsMinus1_N04, -hBitsMinus1_N05, hBitsMinus1_N06, hBitsMinus1_N07, hBitsMinus1_N08, hBitsMinus1_N09, -hBitsMinus1_N10, hBitsMinus1_N11, hBitsMinus1_N12, hBitsMinus1_N13, hBitsMinus1_N14, -hBitsMinus1_N15, hBitsMinus1_N16, hBitsMinus1_N17, hBitsMinus1_N18, hBitsMinus1_N19, -hBitsMinus1_N20, hBitsMinus1_N21, hBitsMinus1_N22, hBitsMinus1_N23, hBitsMinus1_N24, -hBitsMinus1_N25, hBitsMinus1_N26, hBitsMinus1_N27, hBitsMinus1_N28, hBitsMinus1_N29, -hBitsMinus1_N30, hBitsMinus1_N31, hBitsMinus1_N32, hBitsMinus1_N33, hBitsMinus1_N34, -hBitsMinus1_N35, hBitsMinus1_N36, hBitsMinus1_N37, hBitsMinus1_N38, hBitsMinus1_N39, -hBitsMinus1_N40, hBitsMinus1_N41, hBitsMinus1_N42, hBitsMinus1_N43, hBitsMinus1_N44, -hBitsMinus1_N45, hBitsMinus1_N46, hBitsMinus1_N47, hBitsMinus1_N48, hBitsMinus1_N49, -hBitsMinus1_N50, hBitsMinus1_N51, hBitsMinus1_N52, hBitsMinus1_N53, hBitsMinus1_N54, -hBitsMinus1_N55, hBitsMinus1_N56, hBitsMinus1_N57, hBitsMinus1_N58, hBitsMinus1_N59, -hBitsMinus1_N60, hBitsMinus1_N61, hBitsMinus1_N62, hBitsMinus1_N63, hBitsMinus1_N64, -}; // Q0 - -const Word16 lim_neg_inv_tbl_fx[MAX_SPLITS + 1 ] = -{ /* 1 = optimized inv_tbl_fx constant for div by 1, Q15 */ - /* 2-10 = negated inv_tbl_fx Q15*/ - 0, - -32768, -16384, -10923, -8192, -6554, - -5462, -4681, -4096, -3641, -3277 -}; - -const Word16 Idx2Freq_Tbl[] = { 6554/*12.8*512*/, 48 * 512, 13108/*25.6*512*/, 32 * 512, 16 * 512, 8 * 512 }; /* in Q9 */ - -const Word16 fg_inv_tbl_fx [HQ_MAX_BAND_LEN/8 + 1 ] = -{ /* i/8 , slice of inv_tbl_fx , Q15 */ - 0, - 4096, 2048, 1366, 1024, 820, 683, - 586, 512, 456, 410, 373, 342 -}; - - -const UWord32 exactdivodd[ODD_DIV_SIZE] = -{ - /* exactdivodd[0]=1/1, exactdivodd[1]=1/3, exactdivodd[n]=1/(2*n+1), exactdivodd[47]=1/95 ) */ - 1U, 2863311531U, 3435973837U, 3067833783U, 954437177U, 3123612579U, 3303820997U, 4008636143U, - 4042322161U, 678152731U, 1022611261U, 3921491879U, 3264175145U, 1749801491U, 1332920885U, 3186588639U, - 1041204193U, 2331553675U, 2437684141U, 2532929431U, 3247414297U, 799063683U, 2767867813U, 1736263375U, - 438261969U, 4210752251U, 2350076445U, 1483715975U, 3089362441U, 2693454067U, 3238827797U, 3204181951U, - 3237744577U, 128207979U, 2738819725U, 3811027319U, 3353604601U, 2519714147U, 1059797125U, 1631000239U, - 2014922929U, 724452315U, 4244438269U, 1875962727U, 4198451177U, 3539808211U, 1062196213U, 3571604383U -}; // Q0 - -const Word16 gain_cb_size[MAX_GAIN_BITS] = {2, 4, 8, 16, 32}; // Q0 - -const Word16 inner_frame_tbl[4] = {L_FRAME8k, L_FRAME16k, L_FRAME32k, L_FRAME48k}; /* corresponds to NB, WB, SWB, FB Q0*/ -const Word16 hq_nominal_scaling_inv[7] = { 0, 8192, 11585, 0, 16384, 0, 20066 }; /*Q13 */ -const Word16 hq_nominal_scaling[7] = { 0, 32767, 23170, 0, 16384, 0, 13377 }; /*Q15 */ - -const Word16 l_spec_tbl[4] = {L_SPEC8k, L_SPEC16k, L_SPEC32k, L_SPEC48k}; /* corresponds to NB, WB, SWB, FB Q0*/ -const Word16 l_spec_ext_tbl[4] = {0, L_SPEC16k_EXT, L_SPEC32k_EXT, L_SPEC48k_EXT}; /* corresponds to NB, WB, SWB, FB Q0*/ -const Word16 sinq_16k[3 * L_FRAME16k / 20] =/*Q15 */ -{ - 536, 1608, 2678, 3745, 4808, 5866, 6918, 7962, - 8998, 10024, 11039, 12043, 13033, 14010, 14972, 15917, - 16846, 17757, 18648, 19520, 20371, 21199, 22006, 22788, - 23546, 24279, 24986, 25667, 26319, 26944, 27540, 28106, - 28642, 29147, 29622, 30064, 30475, 30852, 31197, 31508, - 31786, 32029, 32238, 32413, 32553, 32658, 32728, 32763 -}; -const Word16 sinq_32k[3 * L_FRAME32k / 20] =/*Q15 */ -{ - 268, 804, 1340, 1876, 2411, 2945, 3479, 4011, 4543, 5073, 5602, 6130, - 6655, 7180, 7702, 8222, 8740, 9255, 9768, 10279, 10786, 11291, 11793, 12292, - 12787, 13279, 13767, 14252, 14733, 15210, 15683, 16151, 16616, 17075, 17531, 17981, - 18427, 18868, 19304, 19734, 20160, 20580, 20994, 21403, 21806, 22203, 22595, 22980, - 23359, 23732, 24098, 24459, 24812, 25159, 25499, 25832, 26159, 26478, 26790, 27095, - 27393, 27684, 27967, 28243, 28511, 28771, 29024, 29269, 29506, 29735, 29956, 30170, - 30375, 30572, 30761, 30941, 31114, 31278, 31433, 31580, 31719, 31849, 31971, 32084, - 32189, 32285, 32372, 32451, 32521, 32582, 32634, 32678, 32713, 32740, 32757, 32766 -}; -const Word16 sinq_48k[3 * L_FRAME48k / 20] =/*Q15 */ -{ - 179, 536, 893, 1251, 1608, 1965, 2321, 2678, 3034, 3390, 3745, 4100, - 4454, 4808, 5161, 5514, 5866, 6217, 6568, 6918, 7267, 7615, 7962, 8308, - 8654, 8998, 9341, 9683, 10024, 10364, 10702, 11039, 11375, 11710, 12043, 12375, - 12705, 13033, 13361, 13686, 14010, 14332, 14653, 14972, 15289, 15604, 15918, 16229, - 16539, 16846, 17152, 17455, 17757, 18056, 18353, 18648, 18941, 19232, 19520, 19806, - 20090, 20371, 20650, 20926, 21200, 21471, 21740, 22006, 22269, 22530, 22789, 23044, - 23297, 23547, 23794, 24038, 24280, 24519, 24754, 24987, 25217, 25444, 25667, 25888, - 26106, 26320, 26531, 26740, 26945, 27147, 27345, 27541, 27733, 27921, 28107, 28289, - 28468, 28643, 28815, 28984, 29149, 29310, 29468, 29623, 29774, 29922, 30066, 30206, - 30343, 30476, 30606, 30732, 30854, 30973, 31087, 31199, 31306, 31410, 31510, 31606, - 31699, 31788, 31873, 31954, 32031, 32105, 32175, 32241, 32303, 32361, 32415, 32466, - 32513, 32556, 32595, 32630, 32661, 32688, 32712, 32731, 32747, 32759, 32766, 32767 -}; -/*------------------------------------------------------------------------------* - * LR-MDCT tables - *------------------------------------------------------------------------------*/ - -/* subband width tables */ - -/* NB short win: 7200/8000/9600, 13200/16400/24400 */ -const Word16 band_width_40_4_6_0_0_0[4] = { 6, 8, 11, 15 }; // Q0 -const Word16 band_width_40_5_6_0_0_0[5] = { 6, 7, 7, 9, 11 }; // Q0 - -/* NB long win: 7200, 8000, 9600, 13200, 16400 */ -const Word16 band_width_160_13_6_2_0_0[13] = { 6, 6, 6, 6, 7, 8, 9, 10, 13, 15, 19, 24, 31 }; // Q0 -const Word16 band_width_160_14_6_3_0_0[14] = { 6, 6, 6, 6, 6, 7, 8, 9, 10, 12, 15, 18, 22, 29 }; // Q0 -const Word16 band_width_160_17_6_3_0_0[17] = { 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 13, 15, 17, 19 }; // Q0 -const Word16 band_width_160_18_6_4_0_0[18] = { 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 12, 14, 15, 17 }; // Q0 - -/* WB short win: 13200/16400/24400 */ -const Word16 band_width_80_7_6_0_0_0[7] = { 6, 7, 8, 10, 12, 16, 21 }; // Q0 - -/* WB long win: 13200, 16400 */ -const Word16 band_width_320_18_6_3_0_0[18] = { 6, 6, 6, 6, 6, 7, 7, 8, 10, 11, 13, 16, 19, 24, 30, 37, 47, 61 }; // Q0 -const Word16 band_width_320_20_6_3_0_0[20] = { 6, 6, 6, 6, 6, 6, 7, 8, 8, 9, 11, 12, 14, 17, 20, 23, 28, 34, 42, 51 }; // Q0 - -/* SWB short win: 13200, 16400 */ -const Word16 band_width_142_8_8_0_0_0[8] = {7,8,10,11,15,21,29,41}; // Q0 -const Word16 band_width_160_8_8_0_0_0[8] = { 8, 9, 11,13,17,23,32,47}; // Q0 - -/* SWB long win: 13200, 16400 */ -const Word16 band_width_568_22_6_2_0_0[22] = { 6, 6, 6, 6, 6, 6, 7, 8, 9, 10, 11, 13, 16, 19, 23, 28, 34, 42, 55, 68, 84, 105}; // Q0 -const Word16 band_width_640_24_6_4_0_0[24] = { 6, 6, 6, 6, 6, 6, 7,7,8,9,10,11,13,15,18,21,26,32,39,48,59, 74,92,115}; // Q0 - -/* LR-MDCT: NB configuration tables */ -const Xcore_Config xcore_config_8kHz_007200bps_long = { 13, L_FRAME8k, band_width_160_13_6_2_0_0, 536870912L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 2, 0, 0 /*p2a_th*/, 13107/*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; -const Xcore_Config xcore_config_8kHz_008000bps_long = { 14, L_FRAME8k, band_width_160_14_6_3_0_0, 536870912L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 2, 0, 0 /*p2a_th*/, 13107/*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; -const Xcore_Config xcore_config_8kHz_013200bps_long = { 17, L_FRAME8k, band_width_160_17_6_3_0_0, 429496730L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 4, 2, 24576/*p2a_th*/, 13107/*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; -const Xcore_Config xcore_config_8kHz_016400bps_long = { 18, L_FRAME8k, band_width_160_18_6_4_0_0, 322122547L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 2, 0, 0 /*p2a_th*/, 13107/*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; - -const Xcore_Config xcore_config_8kHz_007200bps_short = { 4, L_FRAME8k / NUM_TIME_SWITCHING_BLOCKS, band_width_40_4_6_0_0_0, 966367642L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 2, 0, 0/*p2a_th*/,9830 /*pd_thresh*/, 2949/*ld_slope*/, 19661/*ni_coef*/ }; -const Xcore_Config xcore_config_8kHz_008000bps_short = { 4, L_FRAME8k / NUM_TIME_SWITCHING_BLOCKS, band_width_40_4_6_0_0_0, 1181116006L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 4, 0, 0/*p2a_th*/,9830 /*pd_thresh*/, 2949/*ld_slope*/, 19661/*ni_coef*/ }; -const Xcore_Config xcore_config_8kHz_013200bps_short = { 5, L_FRAME8k / NUM_TIME_SWITCHING_BLOCKS, band_width_40_5_6_0_0_0, 751619276L, 24576, 24576/*eref*/, 11469, 11469/*bit_alloc_weight*/, 2, 4, 0, 0/*p2a_th*/,22938/*pd_thresh*/, 3604/*ld_slope*/, 19661/*ni_coef*/ }; -const Xcore_Config xcore_config_8kHz_016400bps_short = { 5, L_FRAME8k / NUM_TIME_SWITCHING_BLOCKS, band_width_40_5_6_0_0_0, 536870912L, 24576, 24576/*eref*/, 11469, 11469/*bit_alloc_weight*/, 2, 6, 0, 0/*p2a_th*/,22491/*pd_thresh*/, 3604/*ld_slope*/, 19661/*ni_coef*/ }; - -/* LR-MDCT: WB configuration tables */ -const Xcore_Config xcore_config_16kHz_013200bps_long = { 18, L_FRAME16k, band_width_320_18_6_3_0_0, 429496730L, 24576, 24576/*eref*/, 13106, 13106/*bit_alloc_weight*/, 2, 6, 3, 24576/*p2a_th*/, 13107/*pd_thresh*/, 3932/*ld_slope*/, 18022/*ni_coef*/ }; -const Xcore_Config xcore_config_16kHz_016400bps_long = { 20, L_FRAME16k, band_width_320_20_6_3_0_0, 429496730L, 24576, 24576/*eref*/, 13106, 13106/*bit_alloc_weight*/, 2, 6, 3, 24576/*p2a_th*/, 13107/*pd_thresh*/, 3932/*ld_slope*/, 19660/*ni_coef*/ }; - -const Xcore_Config xcore_config_16kHz_013200bps_short = { 7, L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS, band_width_80_7_6_0_0_0, 966367642L, 24576, 24576/*eref*/, 9830, 9830/*bit_alloc_weight*/, 2, 4, 0, 0 /*p2a_th*/, 9830 /*pd_thresh*/, 4258/*ld_slope*/, 18022/*ni_coef*/ }; -const Xcore_Config xcore_config_16kHz_016400bps_short = { 7, L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS, band_width_80_7_6_0_0_0, 966367642L, 24576, 24576/*eref*/, 11468, 11468/*bit_alloc_weight*/, 2, 8, 0, 0 /*p2a_th*/, 9830 /*pd_thresh*/, 4258/*ld_slope*/, 19660/*ni_coef*/ }; - -/* LR-MDCT: SWB configuration tables */ -const Xcore_Config xcore_config_32kHz_013200bps_long = { 22, 568, band_width_568_22_6_2_0_0, 322122547L, 24576, 24576/*eref*/, 6554, 6554/*bit_alloc_weight*/, 2, 4, 5, 28672/*p2a_th*/, 13107 /*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; -const Xcore_Config xcore_config_32kHz_016400bps_long = { 24, 640, band_width_640_24_6_4_0_0, 322122547L, 24576, 24576/*eref*/, 8192, 8192/*bit_alloc_weight*/, 2, 4, 5, 28672/*p2a_th*/, 13107 /*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; -const Xcore_Config xcore_config_32kHz_013200bps_short = { 8, 568 / NUM_TIME_SWITCHING_BLOCKS, band_width_142_8_8_0_0_0, 1610612736L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 4, 0, 0 /*p2a_th*/, 16384 /*pd_thresh*/, 3604/*ld_slope*/, 19661/*ni_coef*/ }; -const Xcore_Config xcore_config_32kHz_016400bps_short = { 8, 640 / NUM_TIME_SWITCHING_BLOCKS, band_width_160_8_8_0_0_0, 644245094L, 24576, 24576/*eref*/, 8192, 8192/*bit_alloc_weight*/, 2, 4, 0, 0 /*p2a_th*/, 9830 /*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; - -/* bandwidths */ -const Word16 Nb[ NB_SFM] = -{ - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, - 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 32, 32, 32, 32, 32, 32, 32, 32 -}; // Q0 - -/* log2(Nb) to calculate minimum bits for one pulse in PVQ */ -const Word16 LNb[ NB_SFM] = -{ - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, - 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5 -}; // Q0 - - -/*------------------------------------------------------------------------------* - * GSC tables - *------------------------------------------------------------------------------*/ - -const Word16 gsc_sfm_start[MBANDS_GN] = {0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240}; // Q0 - -const Word16 gsc_sfm_end[MBANDS_GN] = {16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256}; // Q0 - -const Word16 gsc_sfm_size[MBANDS_GN] = {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; // Q0 - -const Word16 sm_table_fx[] = -{ - 32767, 32126, 31480, 30838, 30196, 29557, 28918, 28279, 27643, 27007, - 26375, 25746, 25120, 24494, 23875, 23255, 22643, 22033, 21427, 20824, - 20228, 19638, 19048, 18468, 17891, 17321, 16758, 16197, 15647, 15103, - 14562, 14031, 13507, 12989, 12481, 11980, 11488, 11000, 10525, 10056, - 9598, 9146, 8706, 8274, 7851, 7438, 7035, 6642, 6259, 5885, - 5521, 5171, 4830, 4499, 4178, 3870, 3572, 3287, 3011, 2746, - 2494, 2254, 2025, 1809, 1602, 1412, 1229, 1062, 904, 760, - 629, 511, 403, 308, 226, 157, 102, 56, 26, 7, -}; // Q15 - -const Word16 GSC_freq_bits[] = -{ - 21, 66, -6, 25, 15, 11, 10, 5, 0, 0, 5, 4, 0, 0, 4, 0, 0, /* ACELP_5k00*/ - 21, 66, -6, 25, 15, 11, 10, 5, 0, 0, 5, 4, 0, 0, 4, 0, 0, /* ACELP_6k15*/ - 21, 66, -6, 25, 15, 11, 10, 5, 0, 0, 5, 4, 0, 0, 4, 0, 0, /* ACELP_7k20*/ - 21, 74, -4, 26, 16, 12, 11, 9, 0, 0, 4, 4, 1, 1, 3, 0, 0, /* ACELP_8k00*/ - 26, 80, -3, 28, 18, 13, 12, 9, 0, 0, 4, 4, 1, 1, 3, 0, 0, /* ACELP_9k60*/ - 26, 96, -4, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_11k60*/ - 26, 96, -4, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_12k15*/ - 26, 96, -4, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_12k85*/ - 26, 96, -4, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_13k20*/ - 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_14k80*/ - 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_16k40*/ - 26, 96, 0, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_22k60*/ - 26, 96, 0, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4 /* ACELP_24k40*/ -}; // Q0 -#ifdef MOD_BIT_ALLOC_ROM_TABLE -const Word32 GSC_freq_bits_fx[] =/*Q18*/ -{ - 5505024, 17563648, -1572864, 6553600, 3932160, 2883584, 2621440, 1310720, 0, 0, 1310720, 1048576, 0, 0, 1048576, 0, 0, /* ACELP_5k00*/ - 5505024, 17563648, -1572864, 6553600, 3932160, 2883584, 2621440, 1310720, 0, 0, 1310720, 1048576, 0, 0, 1048576, 0, 0, /* ACELP_6k15*/ - 5505024, 17563648, -1572864, 6553600, 3932160, 2883584, 2621440, 1310720, 0, 0, 1310720, 1048576, 0, 0, 1048576, 0, 0, /* ACELP_7k20*/ - 5505024, 19660800, -1048576, 6815744, 4194304, 3145728, 2883584, 2359296, 0, 0, 1048576, 1048576, 262144, 262144, 786432, 0, 0, /* ACELP_8k00*/ - 6815744, 20971520, -786432, 7340032, 4718592, 3407872, 3145728, 2359296, 0, 0, 1048576, 1048576, 262144, 262144, 786432, 0, 0, /* ACELP_8k00*/ - 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_11k60*/ - 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_12k15*/ - 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_12k85*/ - 8126464, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_13k20*/ 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_14k80*/ - 8126464, 25165824, -262144, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_13k20*/ 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_16k40*/ - 8126464, 25165824, 0, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_22k60*/ 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_16k40*/ - 8126464, 25165824, 0, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_22k60*/ 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_16k40*/ -}; - -const Word32 GSC_freq_bits_fx_Q18[] =/*Q18*/ -{ - 5505024, 17301504, -1572864, 6553600, 3932160, 2883584, 2621440, 1310720, 0, 0, 1310720, 1048576, 0, 0, 1048576, 0, 0, - 5505024, 17301504, -1572864, 6553600, 3932160, 2883584, 2621440, 1310720, 0, 0, 1310720, 1048576, 0, 0, 1048576, 0, 0, - 5505024, 17301504, -1572864, 6553600, 3932160, 2883584, 2621440, 1310720, 0, 0, 1310720, 1048576, 0, 0, 1048576, 0, 0, - 5505024, 19398656, -1048576, 6815744, 4194304, 3145728, 2883584, 2359296, 0, 0, 1048576, 1048576, 262144, 262144, 786432, 0, 0, - 6815744, 20971520, -786432, 7340032, 4718592, 3407872, 3145728, 2359296, 0, 0, 1048576, 1048576, 262144, 262144, 786432, 0, 0, - 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, - 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, - 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, - 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, - 6815744, 25165824, -262144, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, - 6815744, 25165824, -262144, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, - 6815744, 25165824, 0, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, - 6815744, 25165824, 0, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, -}; -#else -const Word32 GSC_freq_bits_fx[] = -{ - 5505024, 17563648, -1572864, 6553600, 3932160, 2883584, 2621440, 1310720, 0, 0, 1310720, 1048576, 0, 0, 1048576, 0, 0, /* ACELP_7k20*/ - 5505024, 19660800, -1048576, 6815744, 4194304, 3145728, 2883584, 2359296, 0, 0, 1048576, 1048576, 262144, 262144, 786432, 0, 0, /* ACELP_8k00*/ - 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_11k60*/ - 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_12k15*/ - 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_12k85*/ - 8126464, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_13k20*/ -}; -#endif -const Word16 Compl_GSC_freq_bits[] = -{ - 5, 10, 10, 10 /* bitrate > ACELP_16k40 && FS = 16kHz */ -}; // Q0 - -const Word16 mfreq_bindiv_loc[] = { 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 32, 32, 32 }; // Q0 - -const Word16 mean_gp_fx[] = { 9590 }; /*Q14*/ - -const Word16 dic_gp_fx[] = /*Q14*/ -{ - -9580, -7692, -6385, -4474, -3254, -2038, -806, -82, - 1034, 2259, 3457, 4684, 5290, 6544, 8548, 10052, - -8964, -8338, -7021, -5754, -5118, -3850, -2654, -1429, - 408, 1660, 2852, 4071, 5915, 7170, 7825, 9249 -}; -const Word16 Gain_meanNB_fx[] = -{ - 9852, -};/* Q12 */ - -const Word16 Gain_mean_dicNB_fx[1 * 64] = /*Q12 */ -{ - -1309, -931, -568, -396, -54, 807, 1174, 1533, - 1901, 2092, 2286, 2493, 2698, 3130, 2909, 286, - -748, 990, 631, -1119, -1697, -2114, -2788, -5399, - -9841, -1902, -3270, -7975, -7438, -6926, -7192, -2325, - -1504, -2549, -3022, -3532, -3818, -4136, -4751, -5071, - -5756, -6093, -8998, -6389, -8765, -9438, 3369, 3917, - 3619, 4684, -8264, 4255, -4433, -6662, -9230, -7678, - 5859, 118, 457, -227, 1717, 1353, -8499, -9649 -}; - -const Word16 Mean_dic_NB_fx[1 * 10] = /*Q12 */ -{ - -444, -100, -120, -37, 25, - 70, 148, 63, 170, 229 -}; - -const Word16 Gain_dic1_NB_fx[3 * 64] = /*Q12 */ -{ - -606, -92, 5, - -1965, 294, 666, - -440, 119, 661, - -106, 267, 108, - -1213, 345, -136, - -1251, 618, 566, - -1905, -750, 648, - -1043, -360, -498, - -18, -322, 96, - 334, 116, -247, - -1929, 660, 23, - -1845, 1178, 485, - -180, 836, 167, - -1892, -922, -321, - 416, -437, -344, - 595, -548, 158, - -265, -807, -338, - -1065, -1015, -20, - -626, 595, -333, - -569, 1090, 651, - 27, 587, -331, - -184, -85, -503, - -1902, -1807, 326, - -1861, -159, -989, - -666, 143, -1163, - -1718, 1031, -744, - 847, 301, -59, - 720, -1001, -216, - 1380, -866, -969, - 803, -4, -608, - 233, 408, -998, - 1459, 87, 263, - 345, -615, -1026, - 877, -148, -7, - 68, -1075, 270, - 802, 329, 475, - -1923, -126, -38, - 1275, -419, -349, - 401, 926, 575, - 846, -233, 547, - 693, -1880, 356, - -362, -1683, -219, - 231, -339, 598, - 1227, -616, 267, - 1116, 91, -1316, - -551, -650, 530, - 444, 32, 181, - -384, 1207, -775, - -993, 1163, 41, - 784, -1018, 538, - 635, 636, -424, - 1373, -1367, 149, - 1442, 401, -444, - 1094, 888, 123, - 874, 1113, -1082, - -646, -1112, -1103, - 539, -1632, -683, - 402, 571, 99, - -1778, -1809, -849, - -732, -1691, 700, - -678, 526, 274, - 320, 1227, -118, - -1222, -180, 454, - 173, 349, 530 -}; - -const Word16 Gain_dic2_NB_fx[3 * 32] = /*Q12 */ -{ - 28, 0, -66, - -557, 4, 206, - 281, -642, 36, - -417, 81, -494, - -380, 684, 450, - 521, -1544, 258, - -1119, 613, -1151, - 514, 24, 797, - 292, -84, -526, - 296, 418, -231, - -419, -68, 976, - 2, -308, 398, - -456, -1007, 263, - -1221, -371, 446, - -221, -390, -181, - -1210, 588, 751, - -1093, 528, -174, - 590, 372, -1271, - -79, -251, -1241, - -1016, -487, -512, - 542, 581, 338, - -265, 456, -105, - 490, -71, 89, - 42, 235, 379, - 31, 1194, -202, - 173, -839, 850, - -46, 500, -802, - 152, 933, 1073, - 980, 345, -263, - 807, -580, -521, - -23, -992, -585, - 876, -576, 411 -}; - -const Word16 Gain_dic3_NB_fx[4 * 16] = /*Q12 */ -{ - -16, 65, -227, 11, - -214, 553, 366, 185, - 137, -338, -300, -625, - -122, 82, 538, -797, - 160, 285, -1103, 35, - -594, 312, -379, -423, - 169, -642, -395, 363, - 351, -1166, 630, -261, - -1190, 217, 416, 187, - -577, 244, -636, 858, - 580, 482, -220, 635, - 475, -188, 372, 27, - -65, -369, 504, 910, - -423, -442, 124, -40, - 480, 575, -41, -651, - 682, 680, 910, 489 -}; - -const Word16 Gain_dic2_NBHR_fx[3 * 64] = /*Q12 */ -{ - 29, 0, -94, - -605, -202, -174, - 324, -380, -163, - -126, -301, -306, - -288, 124, 112, - -86, 524, -115, - 234, 18, -464, - -55, -281, 179, - 161, 446, 632, - 366, -82, 97, - 228, -1149, 270, - 293, 286, -143, - -123, -35, -896, - -540, -675, 175, - 331, -483, -687, - -779, 204, -668, - -492, 768, -510, - -1215, -620, -483, - 681, -76, -296, - -671, 396, -45, - -759, 298, 564, - -284, 589, 321, - -1366, -592, 496, - -448, -585, -712, - 12, -756, -90, - 513, 167, -927, - -1172, 1060, -1198, - -477, 748, 1006, - 42, 103, 1277, - -940, 1049, 138, - -924, -14, -1469, - 684, 679, -1580, - 417, -374, -1572, - 607, 270, 256, - 567, 778, 843, - 1414, -223, -542, - 97, 200, 251, - 222, 1074, -547, - -714, -285, 1046, - 386, -684, 984, - 338, 674, 116, - -274, 171, -368, - 581, -1871, 342, - 94, 442, -597, - -293, -1205, 851, - -127, 501, -1247, - 175, 1700, 1357, - -24, 1224, 285, - 707, -952, -293, - 668, 492, -407, - 1164, 751, 201, - 381, -595, 288, - -1570, 481, -531, - -597, -160, 326, - -578, -1311, -40, - -118, -523, 576, - -1513, 527, 757, - -184, 40, 609, - -1215, 98, 68, - -65, -1324, -836, - 821, -299, 204, - 796, 21, 840, - 310, -133, 542, - 1042, -974, 537 -}; - -const Word16 Gain_dic3_NBHR_fx[4 * 128] = /*Q12 */ -{ - 293, 7, -202, -95, - 535, 110, 542, -512, - -578, 65, -560, -345, - 206, 332, 10, -533, - -76, 356, -14, 83, - 149, -372, -195, -490, - -478, -241, -55, 113, - -293, -470, -606, 62, - 797, -1448, 625, -1128, - 173, 464, -1686, -49, - -392, -295, -159, -464, - -715, 420, -146, -984, - -36, 28, -484, 119, - 472, 272, -729, -116, - 68, -87, -628, -429, - 429, -918, -158, -191, - -545, 230, -435, 261, - -128, 15, -791, 612, - 268, -387, -1258, 102, - 378, 238, 301, 3, - -494, 149, 131, -124, - 634, -308, 99, 24, - 572, 711, 754, -1137, - -1109, 400, 1093, 369, - -831, -423, 1583, 1089, - -83, 156, -105, 1078, - -930, 476, 152, 380, - 776, 1162, 788, -43, - 279, 50, 408, 597, - 476, 483, 73, 749, - 903, 686, 80, -411, - 195, -768, 280, 344, - -263, -999, -46, -284, - -66, 263, 315, -1239, - 435, 578, -234, -1169, - 199, -1669, 188, 114, - -57, 419, -509, -633, - 98, -119, 129, -816, - -157, -365, -249, 537, - 67, -624, 121, 1153, - 1444, 142, -584, 38, - 1086, -84, 162, 994, - 392, -384, -124, 533, - 252, 183, -1161, -885, - -431, -829, 102, 432, - -708, 987, -1021, -644, - -64, 120, -1684, 985, - 210, -494, -906, 1302, - 50, -186, 177, 185, - -256, 872, -1004, 387, - 564, -80, -679, 515, - -763, -40, -1174, 228, - -1029, 199, -59, -297, - 30, -47, 198, -264, - -396, -1435, 913, -1018, - -141, 962, 36, 458, - 36, -388, 776, -1000, - -74, 489, 1137, 140, - -970, -766, 666, -117, - 90, 599, 1665, 1405, - -313, -685, -764, -615, - 563, -462, -627, -768, - 792, 560, -1445, 556, - -581, 721, -559, 1137, - -699, -273, 274, -846, - 940, -690, 747, -253, - -177, -541, 1355, -217, - -586, 427, 1196, -868, - 147, 532, -550, 405, - 258, 677, -245, -166, - 772, 1062, -331, 482, - 388, 1870, -576, 1585, - 462, 865, 454, 1212, - 570, 528, -681, 1229, - -386, 607, 599, 865, - -154, -20, -211, -231, - 96, 736, 408, -259, - 763, -1533, 1094, 249, - 705, -1132, 1757, -1082, - 310, -481, 329, -395, - 194, -781, 59, -954, - -933, -957, -25, 1866, - -852, -224, -482, 822, - -1438, 490, 221, 1281, - 392, 677, 539, 347, - 884, -614, 1844, 678, - -773, 484, -928, 2477, - -274, -461, 378, -263, - -283, -312, 583, 342, - 453, -1541, 378, 1266, - 778, 1095, 1290, 824, - -958, -443, -208, -71, - 985, -1001, -123, 473, - 56, -1003, -513, 474, - -259, 1435, 975, 315, - -59, -169, 724, 961, - -210, 1030, 341, -977, - 1054, 2917, -7, -877, - -852, -228, 330, 625, - 9, -524, -97, -14, - 16, -50, 476, 2406, - 264, -238, 768, 56, - 187, 108, -169, 446, - 673, 238, 992, 671, - -218, 285, 485, 181, - 669, -526, 639, 571, - 650, 20, -188, -516, - 1031, 165, 526, 136, - -333, 307, 102, -569, - -157, 309, -934, -121, - -336, 141, 39, 536, - 662, 364, -133, 222, - -1284, 637, -636, 77, - 1241, 846, 467, 638, - 842, 328, 1330, -320, - 152, -1009, 550, -215, - -772, 13, 594, -122, - 336, -410, -547, -2, - 869, -106, 321, -1180, - 516, 1247, -828, -577, - -670, 873, 367, -132, - -415, 630, -287, -164, - -105, 138, 657, -441, - -160, -1085, 940, 704, - -128, -68, -369, -1052, - -1434, 594, 546, -665, - -1849, 75, 175, 174, - -1283, 729, -1590, 1032 -}; - -const Word16 YG_mean16_fx[1 * 16] = /*Q12 */ -{ - -396, -192, -168, -136, -60, -17, 45, 39, - 120, 81, 90, 67, 147, 34, 163, 184 -}; - -const Word16 YG_dicMR_1_fx[4 * 64] = /*Q12 */ -{ - -1879, 826, 539, -210, - -120, 267, -137, -142, - -798, -473, 434, 243, - 297, -896, 369, 307, - -1883, -1333, 416, 510, - -1955, -660, -471, 224, - -905, -804, -517, 433, - -961, 20, -258, -224, - 209, 977, -213, -17, - 536, -244, 159, 97, - -265, 775, 412, -327, - 337, -391, -237, -472, - -1962, -1836, -692, 471, - 625, 173, -463, -15, - -965, 263, 62, 600, - -782, 889, -433, 211, - -1791, 852, -453, -776, - -182, -177, -1078, 80, - -364, 350, 280, 293, - -902, 1119, 295, -1194, - 16, 440, -342, 459, - -1825, -1584, -1382, -798, - 723, 57, -1235, -661, - 888, -1638, 277, 234, - 340, 345, 141, -610, - 1280, -23, 17, 144, - -639, -852, -520, -553, - 1032, 843, 149, 435, - 581, 783, 519, -196, - 457, 945, 498, -1289, - -1897, -41, 425, 514, - 787, 161, 506, 385, - -559, 1079, 319, 515, - 500, 340, 60, 106, - 251, -997, -1163, -960, - 261, -1288, -631, 335, - 1241, -620, -387, -662, - 167, 194, 476, 67, - 830, -261, 430, -1201, - -479, -123, 71, -1162, - 225, -1482, 132, -802, - 680, 763, -1010, 429, - 200, -125, 261, 590, - 771, -740, -183, 229, - -1860, -348, 278, -549, - -1768, 967, 281, 594, - -1727, -1697, 87, -764, - 1169, 631, -114, -471, - -1636, -101, -1324, -91, - 821, -745, 458, -264, - 1014, -576, 390, 470, - 1041, -517, -1018, 367, - 826, 17, 426, -326, - -467, -1641, 201, 325, - -1906, 428, -338, 222, - -1021, 630, 419, -75, - -86, -379, -203, 234, - 659, 527, -491, -1507, - -564, -1745, -979, -173, - -1764, -433, -743, -1090, - 242, 709, 269, 497, - 716, 74, -208, 618, - -297, 645, -864, -805, - -46, -326, 412, -296 -}; -const Word16 YG_dicMR_2_fx[4 * 32] = /*Q12 */ -{ - 93, 217, -122, 37, - -13, -83, 105, -491, - -398, -592, 399, -160, - 543, -81, -470, 408, - 394, -630, -94, -258, - -665, 133, -136, -125, - 397, -351, 630, -148, - -1166, 406, -865, 554, - -136, -302, -263, 81, - -674, -657, -571, -691, - -206, 381, -699, 122, - 272, -1506, 356, 15, - 451, -961, 638, -1133, - 316, -787, 165, 585, - 312, -144, 185, 274, - 39, -706, -997, 250, - -915, -871, -114, 458, - -834, 348, 364, -1188, - 450, 723, -256, 412, - 369, 468, -1371, 416, - 344, 164, 290, -1094, - 664, 122, 34, -218, - 555, 254, 559, 825, - 312, 492, 496, -27, - -399, 315, 690, -330, - -458, 710, 206, 415, - 290, 89, -662, -467, - -72, 593, -108, -460, - -217, 46, 319, 189, - -1366, 199, 365, 62, - -552, -166, 772, 861, - -159, 120, -215, 775 -}; -const Word16 YG_dicMR_3_fx[4 * 32] = /*Q12 */ -{ - -103, -143, -85, -19, - -404, 182, -795, 84, - 398, -594, -55, -256, - 283, 128, -472, 279, - -246, -628, 281, 297, - -853, 468, 358, -915, - 272, 149, 209, -443, - -168, -504, 452, -525, - 624, -427, 779, 117, - 1079, 404, -98, 80, - 136, 165, 142, -1394, - 513, -566, -150, 822, - 124, 646, 199, 272, - -165, -702, -615, 165, - 333, 810, -457, 1038, - -360, 105, -110, 537, - -224, 125, 562, -26, - 699, -1105, 809, -1323, - -1229, 841, -767, 571, - -310, 437, -114, -230, - -1045, 630, 564, 322, - 282, 1170, -723, -306, - -328, -247, -251, -598, - 354, 332, -1593, 499, - 332, -23, 219, 304, - 325, -1511, 378, 299, - -94, -54, 679, 956, - 507, 830, 861, -739, - -895, -135, 16, -34, - 677, 650, 961, 714, - 816, -665, -1741, -671, - 274, 93, -617, -433 -}; -const Word16 YG_dicMR_4_fx[4 * 16] = /*Q12 */ -{ - -163, -44, -108, 32, - 556, 153, 115, 120, - 617, 818, 802, 719, - -639, -665, 122, 664, - 353, -555, -352, -86, - -1162, 833, -1034, 326, - -511, -406, -478, -523, - 491, -1473, 404, -21, - 148, 288, -45, -544, - -61, 172, -791, -44, - 715, -449, 861, 504, - -108, 263, 610, 118, - 962, 826, -1013, -37, - -32, -495, 362, -214, - -37, 661, -75, 289, - -835, 243, 85, -105 -}; - - -const Word16 mean_m_fx[1 * 1] = /*Q12 */ -{ - 11762 -}; - -const Word16 mean_gain_dic_fx[1 * 64] = -{ - -739, -519, -76, 147, 574, 779, 983, 1185, - 1384, 1580, 1784, 1989, 2204, 2643, 2864, 2422, - 362, -295, -1197, -1936, -2757, -11755, -8216, 3083, - 3311, -1434, -1682, -3341, -9284, -9057, -8616, -7783, - -7359, -6964, -6592, -6233, -5470, -5050, -4651, -3954, - -2470, -963, -2199, -3042, -3643, -4292, -5854, -10199, - 4103, 3548, 4390, 4717, 3817, -10525, -11521, -9570, - -9899, -9171, -10841, -11165, 5500, 5079, 6139, 6993 -}; /* Q12 */ - -const Word16 YGain_mean_LR_fx[1 * 12] =/* Q12 */ -{ - -385, -178, -143, -116, -46, -12, - 64, 50, 118, 68, 133, 151 -}; - -const Word16 YGain_dic1_LR_fx[3 * 32] = /*Q12 */ -{ - -1909, 159, -90, - -155, 416, -15, - -99, -84, 396, - -1832, -848, -320, - -779, 1024, 45, - -1860, -1761, 273, - 81, -341, -309, - -819, -3, -315, - 483, 215, -194, - 242, 937, -76, - -1830, -1753, -1102, - -1589, 868, -657, - -911, 389, 421, - -1834, 915, 390, - -144, 564, -869, - 878, -1544, 301, - 446, 332, 376, - -540, -822, -1001, - 548, -192, 232, - 920, -589, -175, - 869, 717, -564, - 797, -103, -1047, - -335, -1732, -186, - -1840, -345, 566, - 1205, 109, 43, - 985, -456, 570, - 650, -1223, -874, - 928, 752, 390, - -124, 833, 575, - -1811, -249, -1142, - -711, -767, 185, - 344, -876, 267, -}; - -const Word16 YGain_dic2_LR_fx[4 * 32] = /*Q12 */ -{ - -294, -73, -41, 11, - 276, 330, -1316, 173, - 26, -712, 86, 1, - -841, -539, 246, -479, - 43, -207, 709, 116, - 104, -197, 227, -548, - 261, -228, 165, 606, - 613, 403, -122, -420, - 14, 182, -544, -669, - -734, 392, -492, -131, - -1316, 274, 116, 331, - -1339, 535, -1261, 608, - -346, 277, -426, 729, - -1067, -836, -571, 388, - 643, 503, 484, 532, - -148, 447, 120, -392, - -600, 263, 519, -75, - 686, -346, 379, 23, - 130, 239, 376, -1366, - 68, 656, -361, 92, - 608, 286, -405, 487, - -1031, 507, 523, -971, - 51, -44, -521, 172, - -573, -500, 398, 632, - 240, 147, 104, 51, - -319, -680, -890, -398, - -195, 503, 306, 459, - 335, 368, 662, -389, - 378, -788, -537, 680, - 433, -1129, 472, -883, - 472, -312, -301, -207, - 378, -1346, 433, 408, -}; - -const Word16 YGain_dic3_LR_fx[5 * 32] = /*Q12 */ -{ - -332, -191, -122, -455, -210, - 364, -48, -664, 408, 225, - -576, -342, 367, 52, 270, - -392, -157, -77, 625, -224, - -183, -652, -406, 99, 266, - 24, 65, 74, 525, 613, - -805, 306, -383, -21, 247, - 16, 133, -416, -4, -567, - 294, -750, 443, -367, 228, - 536, 816, 767, 562, 594, - -54, 200, -1108, -582, 227, - 123, -43, 414, -376, -649, - 592, -652, -674, -386, -356, - 100, -58, -45, -108, 103, - -727, -194, -1170, 931, 1096, - 512, 758, -440, -769, -1051, - 362, 787, -276, -139, 149, - -218, 387, 457, -414, 265, - -202, 663, -1104, 882, -338, - -57, 405, 269, 257, -221, - 335, 864, 1164, -611, -618, - 1275, 494, -1783, 119, 1222, - 752, 76, 270, 73, -57, - 376, -1255, 145, 724, 603, - -989, 618, 659, 675, 560, - 128, -147, -138, -368, 963, - 140, -170, 866, 538, 127, - 122, -616, 166, 236, -396, - 374, 279, 407, 650, -1269, - -861, 613, -755, -1334, -972, - -922, 314, 416, -114, -648, - 265, 85, 61, -1110, 45 -}; - -const Word16 YG_mean16HR_fx[] = -{ - //Q12 - -396, -191, -167, -135, - -60, -17, 45, 39, - 120, 81, 89, 67, - 146, 33, 163, 183, -}; - -const Word16 YG_dicHR_1_fx[] = -{ - //Q12 - -1955, 412, 133, 32, - -340, 88, -42, 20, - -999, 314, -144, 456, - -429, -190, 186, 547, - -1057, 160, 243, -197, - -46, -81, -491, -223, - 143, 986, -113, 15, - 286, -313, 77, 3, - 249, -1251, 380, 305, - -1909, -258, 481, 86, - 902, 59, 42, -186, - -1969, -992, -335, 223, - -1913, -163, -465, -167, - -806, 1201, 24, 481, - -564, -1943, 212, 380, - -120, -691, -162, 138, - -966, 1009, 437, -464, - 434, 147, 185, 158, - -1944, -133, -313, 602, - -1029, 236, -612, -373, - -749, -571, -1008, -399, - 666, -954, -111, 88, - 186, -16, -174, 338, - -235, -314, 403, -244, - 285, 133, 85, -349, - -1981, -1506, -1290, 338, - -1977, -1925, -368, 876, - -1930, 256, 453, 667, - -1884, 259, -123, -779, - -813, 1087, -595, -1014, - 396, 66, -876, 412, - -543, 907, -657, 301, - -485, 612, 515, 777, - -362, 420, 417, -518, - -1754, 1307, 65, -1202, - -618, 705, -56, -56, - -1938, 1005, 561, 59, - 62, 521, -440, 319, - -1776, 1011, -279, -165, - 558, 357, -444, -47, - 801, -1998, 313, 319, - -1873, -826, -1691, -978, - -588, -294, -328, -1021, - -91, 513, -288, -530, - -1945, -1964, -350, -293, - -307, -1057, 203, -631, - 94, -1713, -548, -62, - 616, -11, -510, -780, - 682, -1574, 260, -441, - 507, -778, 522, -88, - 1321, -635, -432, -619, - 369, -615, -335, -1646, - 1026, -572, 265, -256, - 779, 127, -155, 356, - -462, -180, -637, 405, - 1329, 1071, 543, 784, - 434, -468, 120, -581, - 1293, -532, 60, 377, - 63, -1290, -336, 708, - 756, 42, 412, 607, - 731, 1003, 598, -1388, - -1818, -1666, 547, 185, - -1915, -802, 485, 789, - 907, 437, 455, 108, - 507, -102, 573, -109, - 1037, -1292, -691, 512, - 1428, 159, 20, 271, - 111, -826, -607, -563, - -622, -1328, -1391, -1000, - -15, 1094, 339, -684, - 448, 790, -439, -1617, - -1765, -943, -657, -675, - 107, -835, -1140, 241, - 33, 122, 520, 242, - 194, 204, 313, -1080, - 1308, 548, -711, -850, - 1520, 474, 334, -516, - 1091, -42, 347, -1543, - 1098, -219, 680, 139, - 855, -895, 613, -985, - -1631, -1550, 539, -1277, - 672, 905, -1057, 430, - 555, 659, -38, 450, - -1118, -53, 536, 487, - 563, -485, -204, 650, - -678, -930, 470, 425, - 1180, -259, -990, 319, - 993, 319, -362, 926, - 782, -254, -1447, -534, - -1946, 964, 86, 617, - -1651, 727, -813, 514, - -552, 395, 522, 124, - -1710, 579, 831, -542, - 34, 463, 143, 2, - -1742, -207, -642, -1517, - -1967, -740, 272, -606, - 663, 670, 58, -620, - 229, 274, 122, 677, - 65, 1144, 24, 693, - -1383, 1061, 630, 894, - 536, 539, 106, -31, - 1080, 774, -267, 67, - 355, 518, 609, -336, - 777, -735, 412, 551, - 219, -424, 392, 451, - -543, -1909, -189, -933, - -938, -178, 489, -1008, - -749, -1216, -440, -157, - 681, -355, -423, -19, - 299, 1053, -913, -506, - -258, 360, -1457, -38, - -264, 967, 519, 58, - -718, -1676, -1184, 185, - 741, -314, 184, 210, - -1780, -305, -1299, 167, - -1912, -1932, -1292, -970, - -1017, -520, -96, -136, - -1829, 500, -1244, -625, - -1041, -791, -461, 591, - 708, -1386, -1078, -956, - 339, 636, 509, 408, - -131, 106, -1202, -1118, - 818, 18, 477, -676, - 668, 1176, 422, -36, - 1074, -1259, 425, 267, - -281, 539, 31, 430, - -1196, 756, 338, 236, - -568, 1030, 421, -1589, -}; - -const Word16 YG_dicHR_2_fx[] = -{ - //Q12 - 146, -73, -67, -101, - -11, 330, -176, -609, - -283, -31, -381, -191, - -208, -81, 142, 234, - 141, -376, -66, -646, - 568, -38, -429, 160, - 166, 831, 89, -103, - 280, -881, -296, -82, - -117, -4, 340, -956, - 286, -136, -679, -410, - 141, 181, -197, 511, - -685, 648, 246, -365, - 625, -670, 591, 190, - -7, -296, -454, 235, - 840, 126, 652, 1064, - -428, -570, -18, -77, - -298, -973, 637, 380, - -774, -31, -333, -902, - -1509, 167, 471, -369, - 431, -1437, 124, 610, - -917, 511, 518, -1488, - -97, 262, -872, 247, - 549, -166, 602, -590, - 644, -1030, 796, -1279, - 525, -37, 212, 197, - 141, 345, 195, 211, - 91, -71, 674, 223, - -1343, -902, -27, 234, - -467, -981, -427, 725, - 176, -527, 85, 275, - -654, -859, 473, -873, - 671, -457, -326, 742, - 699, 613, -78, 457, - -487, 505, 231, 578, - -194, 927, -493, 529, - 635, 554, -917, 532, - -554, -12, -314, 611, - 172, 667, 532, -874, - 594, 270, -27, -378, - 388, -530, -1307, 274, - 647, 451, 670, 24, - 745, -470, 8, -260, - -725, -292, -1018, -32, - 95, 184, 330, -280, - -761, -135, 552, 250, - -415, -3, 197, -307, - 142, 702, 584, 755, - 450, 595, -1010, -525, - -455, -1143, -775, -639, - 228, 496, -1676, 399, - 82, 242, -532, 1222, - 125, -214, 319, 804, - -292, 380, -126, 70, - 96, -480, 407, -259, - -636, -148, 890, 1241, - 213, 404, -382, -7, - -315, 509, 660, 61, - 505, 18, 33, -1385, - -568, 716, -623, -338, - -440, 38, 972, -455, - -1420, 576, -1125, 668, - -1391, 481, 229, 593, - 335, -1464, 430, -375, - -918, 124, -155, 34, -}; - -const Word16 YG_dicHR_3_fx[] = -{ - //Q12 - -174, -82, -158, -12, - 155, -403, 114, -132, - 188, 2, -231, -470, - 448, -222, -598, -103, - -353, 304, -1173, 420, - -43, -77, -533, 386, - 526, -57, 360, -247, - -837, -219, -344, 42, - -236, 88, -664, -226, - -1218, 66, 362, -529, - -398, 496, -300, 299, - 212, 508, -521, 80, - -267, -522, 45, 286, - -65, -1143, 154, -169, - 725, -1483, 883, -1459, - 9, -109, 334, -752, - -38, 860, -22, -333, - -487, 340, 202, -1529, - -349, 387, 645, -464, - -106, 73, 170, 427, - 180, 384, -292, 989, - 178, -505, 618, 375, - 481, 539, -1777, 1050, - 680, -792, 65, 136, - -1388, 798, -1090, 670, - -377, -507, -139, -580, - 301, 614, 194, 392, - -218, -1155, 341, 834, - 338, -1071, -1177, 673, - -406, 188, -92, -546, - -58, -656, 773, -540, - 461, 649, 840, -108, - -775, -352, 620, 233, - -390, 666, 601, 438, - -394, 1594, -299, 1009, - 367, 448, 291, -886, - 788, 76, 479, 531, - -77, -655, -500, -14, - 514, -1745, 497, 217, - 904, -963, 630, 1261, - 775, 224, -795, 520, - 291, -435, -112, 679, - 494, 1380, -1018, -186, - -75, 86, 731, 1048, - 65, 74, 617, 99, - 512, -46, 709, -1636, - -926, 1237, 1090, -812, - 40, 297, 97, -131, - 656, 770, 1176, 920, - 1313, -582, -1832, -912, - 490, -648, -43, -805, - -449, -882, -1473, -698, - 1028, 421, -151, -289, - 1089, 1107, -144, 760, - 188, 357, -638, -1027, - -337, -210, 300, -194, - 319, 223, -1587, -64, - 972, 1384, 786, -1026, - 928, -468, 1116, -198, - -1489, 642, 269, 385, - -627, 250, 153, 50, - -906, 613, -518, -436, - 379, 18, -68, 218, - -648, -85, -110, 765, -}; - -const Word16 YG_mean16HR_16kHz_fx[] = -{ - //Q12 - 342, 152, 373, 359 -}; - -const Word16 YG_dicHR_4_16kHz_fx[] = -{ - //Q12 - 137, 109, 215, 21, - 328, -26, 537, -270, - -137, -851, -385, -703, - -537, -81, -244, -23, - -174, -425, -175, -351, - 861, 1100, 696, 574, - -150, -14, -390, -241, - -828, 166, 164, -151, - -226, 541, 204, -110, - 184, 820, -89, 264, - -26, 889, 709, 520, - 83, -176, -713, -276, - -149, -1318, 731, -193, - -324, -55, 118, 182, - 474, -493, -411, 52, - 156, -1459, -370, -71, - 513, 451, 973, 283, - 903, -296, 309, 121, - 1261, 296, 886, 702, - 984, -1204, 915, 15, - -401, 456, -316, 136, - 458, -1779, 335, -788, - 471, -796, 239, -331, - -390, -2265, 493, -305, - 469, -1946, 389, 280, - 150, 463, -725, 114, - -411, 99, -906, -128, - 628, 888, 1299, 1039, - 1454, 1377, 1415, 1350, - -1, 242, -164, -11, - 632, 621, 416, 695, - 396, -1030, 356, 492, - 48, -279, -98, -30, - -568, -212, -376, -571, - 275, 570, 382, 152, - 443, 75, 521, 418, - -1366, -1566, -2460, -2925, - -1059, 64, -585, -231, - 134, 489, -296, -380, - -1453, -890, -1200, -1157, - -27, 240, -1694, 47, - 464, 86, -204, -79, - 746, 462, 234, 57, - 1087, -738, 1095, 1050, - 922, 619, -412, 409, - -261, 35, 124, -313, - -794, 842, -992, 314, - 280, -465, 1028, 196, - 233, -346, 257, 183, - -1640, 244, -110, 28, - 377, 171, -57, 392, - -89, 368, 195, 456, - 501, 1327, 119, 980, - -64, -84, -417, 262, - -414, -558, -638, -102, - -1785, 392, -1756, -430, - -705, -299, -1189, -730, - -477, 347, -400, -367, - -93, -825, -20, -13, - -710, -540, 45, -265, - -151, -487, 380, -243, - -269, 32, 702, 143, - 206, -145, -27, -474, - -694, 777, 287, 357, -}; - -const Word16 YG_meanL2G_16kHz_fx[] = -{ - //Q12 - 424, 651, -}; - -const Word16 YG_dicL2G_16kHz_fx[] =//Q12 -{ - -255, 122, - 296, 314, - -226, -333, - 668, 668, - 101, -53, - -579, -647, - -1202, -1244, - 1213, 1254, -}; - -const Word16 Odx_fft64[64] = -{ - 0,59,54,49,44,39,34,29,24,19,14,9,4,63,58,53,48,43,38,33,28,23,18,13,8,3,62,57,52,47,42,37, - 32,27,22,17,12,7,2,61,56,51,46,41,36,31,26,21,16,11,6,1,60,55,50,45,40,35,30,25,20,15,10,5 -}; // Q0 - -const Word16 Ip_fft64[6] = { 32,1,0,64,32,96 }; // Q0 - -const Word16 Odx_fft32_15[32] = { 0,17,2,19,4,21,6,23,8,25,10,27,12,29,14,31,16,1,18,3,20,5,22,7,24,9,26,11,28,13,30,15 }; // Q0 - -const Word32 w_fft32_16fx[16] =//Q30 -{ - 1073741824, 0, 759250113, 759250113, 992008059, 410903236, 410903236, 992008059, - 1053110143, 209476636, 596539003, 892783685, 892783685, 596539003, 209476636, 1053110143 -}; -const Word16 Ip_fft32[6] = { 16,1,0,32,16,48 }; // Q0 - -const Word16 Odx_fft32_5[32] = { 0,27,22,17,12,7,2,29,24,19,14,9,4,31,26,21,16,11,6,1,28,23,18,13,8,3,30,25,20,15,10,5 }; // Q0 - -const Word16 Odx_fft16[16] = {0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5}; // Q0 - -const Word16 Ip_fft16[6] = {8,1,0,16,8,24}; // Q0 - -const Word16 Ip_fft8[6] = {4,1,0,8,4,12}; // Q0 - -const Word16 Idx_dortft80[80] = -{ - 0,65,50,35,20,5,70,55,40,25,10,75,60,45,30,15,16,1,66,51,36,21,6,71,56,41,26,11,76,61, - 46,31,32,17,2,67,52,37,22,7,72,57,42,27,12,77,62,47,48,33,18,3,68,53,38,23,8,73,58,43, - 28,13,78,63,64,49,34,19,4,69,54,39,24,9,74,59,44,29,14,79 -}; // Q0 - -const Word16 Idx_dortft120[120] = -{ - 0,105,90,75,60,45,30,15,16,1,106,91,76,61,46,31,32,17,2,107,92,77,62,47, - 48,33,18,3,108,93,78,63,64,49,34,19,4,109,94,79,80,65,50,35,20,5,110,95, - 96,81,66,51,36,21,6,111,112,97,82,67,52,37,22,7,8,113,98,83,68,53,38,23, - 24,9,114,99,84,69,54,39,40,25,10,115,100,85,70,55,56,41,26,11,116,101,86, - 71,72,57,42,27,12,117,102,87,88,73,58,43,28,13,118,103,104,89,74,59,44,29,14,119 -}; // Q0 - -const Word16 Idx_dortft160[160] = -{ - 0,65,130,35,100,5,70,135,40,105,10,75,140,45,110,15,80,145, - 50,115,20,85,150,55,120,25,90,155,60,125,30,95,96,1,66,131, - 36,101,6,71,136,41,106,11,76,141,46,111,16,81,146,51,116,21, - 86,151,56,121,26,91,156,61,126,31,32,97,2,67,132,37,102,7, - 72,137,42,107,12,77,142,47,112,17,82,147,52,117,22,87,152,57, - 122,27,92,157,62,127,128,33,98,3,68,133,38,103,8,73,138,43, - 108,13,78,143,48,113,18,83,148,53,118,23,88,153,58,123,28,93, - 158,63,64,129,34,99,4,69,134,39,104,9,74,139,44,109,14,79, - 144,49,114,19,84,149,54,119,24,89,154,59,124,29,94,159 -}; // Q0 - -const Word16 Idx_dortft320[320] = -{ - 0,65,130,195,260,5,70,135,200,265,10,75,140,205,270,15,80,145,210,275,20,85,150,215,280,25,90,155,220,285,30,95, - 160,225,290,35,100,165,230,295,40,105,170,235,300,45,110,175,240,305,50,115,180,245,310,55,120,185,250,315,60,125, - 190,255,256,1,66,131,196,261,6,71,136,201,266,11,76,141,206,271,16,81,146,211,276,21,86,151,216,281,26,91,156,221, - 286,31,96,161,226,291,36,101,166,231,296,41,106,171,236,301,46,111,176,241,306,51,116,181,246,311,56,121,186,251, - 316,61,126,191,192,257,2,67,132,197,262,7,72,137,202,267,12,77,142,207,272,17,82,147,212,277,22,87,152,217,282,27, - 92,157,222,287,32,97,162,227,292,37,102,167,232,297,42,107,172,237,302,47,112,177,242,307,52,117,182,247,312,57,122, - 187,252,317,62,127,128,193,258,3,68,133,198,263,8,73,138,203,268,13,78,143,208,273,18,83,148,213,278,23,88,153,218, - 283,28,93,158,223,288,33,98,163,228,293,38,103,168,233,298,43,108,173,238,303,48,113,178,243,308,53,118,183,248,313, - 58,123,188,253,318,63,64,129,194,259,4,69,134,199,264,9,74,139,204,269,14,79,144,209,274,19,84,149,214,279,24,89,154, - 219,284,29,94,159,224,289,34,99,164,229,294,39,104,169,234,299,44,109,174,239,304,49,114,179,244,309,54,119,184,249, - 314,59,124,189,254,319 -}; // Q0 - -const Word16 Idx_dortft480[480] = -{ - 0,225,450,195,420,165,390,135,360,105,330,75,300,45,270,15,240,465,210,435,180,405,150,375,120,345, - 90,315,60,285,30,255,256,1,226,451,196,421,166,391,136,361,106,331,76,301,46,271,16,241,466,211,436, - 181,406,151,376,121,346,91,316,61,286,31,32,257,2,227,452,197,422,167,392,137,362,107,332,77,302,47, - 272,17,242,467,212,437,182,407,152,377,122,347,92,317,62,287,288,33,258,3,228,453,198,423,168,393,138, - 363,108,333,78,303,48,273,18,243,468,213,438,183,408,153,378,123,348,93,318,63,64,289,34,259,4,229,454, - 199,424,169,394,139,364,109,334,79,304,49,274,19,244,469,214,439,184,409,154,379,124,349,94,319,320, - 65,290,35,260,5,230,455,200,425,170,395,140,365,110,335,80,305,50,275,20,245,470,215,440,185,410,155, - 380,125,350,95,96,321,66,291,36,261,6,231,456,201,426,171,396,141,366,111,336,81,306,51,276,21,246,471, - 216,441,186,411,156,381,126,351,352,97,322,67,292,37,262,7,232,457,202,427,172,397,142,367,112,337,82, - 307,52,277,22,247,472,217,442,187,412,157,382,127,128,353,98,323,68,293,38,263,8,233,458,203,428,173, - 398,143,368,113,338,83,308,53,278,23,248,473,218,443,188,413,158,383,384,129,354,99,324,69,294,39,264, - 9,234,459,204,429,174,399,144,369,114,339,84,309,54,279,24,249,474,219,444,189,414,159,160,385,130,355, - 100,325,70,295,40,265,10,235,460,205,430,175,400,145,370,115,340,85,310,55,280,25,250,475,220,445,190, - 415,416,161,386,131,356,101,326,71,296,41,266,11,236,461,206,431,176,401,146,371,116,341,86,311,56,281, - 26,251,476,221,446,191,192,417,162,387,132,357,102,327,72,297,42,267,12,237,462,207,432,177,402,147,372, - 117,342,87,312,57,282,27,252,477,222,447,448,193,418,163,388,133,358,103,328,73,298,43,268,13,238,463, - 208,433,178,403,148,373,118,343,88,313,58,283,28,253,478,223,224,449,194,419,164,389,134,359,104,329,74, - 299,44,269,14,239,464,209,434,179,404,149,374,119,344,89,314,59,284,29,254,479 -}; // Q0 - -const Word16 Ip_fft128[10] = { 64, 1, 0, 128, 64, 192, 32, 160, 96, 224 }; // Q0 - -const Word32 w_fft128_16fx[64] = -{ - 1073741824, 0, 759250112, 759250112, 992008064, 410903232, 410903232, 992008064, - 1053110144, 209476640, 596539008, 892783680, 892783680, 596539008, 209476640, 1053110144, - 1068571456, 105245104, 681174592, 830013632, 946955712, 506158400, 311690816, 1027506880, - 1027506880, 311690816, 506158400, 946955712, 830013632, 681174592, 105245104, 1068571456, - 1072448448, 52686008, 721080960, 795590208, 970651136, 459083776, 361732736, 1010975232, - 1041563136, 260897968, 552013632, 920979072, 862437504, 639627264, 157550640, 1062120192, - 1062120192, 157550640, 639627264, 862437504, 920979072, 552013632, 260897968, 1041563136, - 1010975232, 361732736, 459083776, 970651136, 795590208, 721080960, 52686008, 1072448448, -}; // Q30 - -const Word16 Ip_fft256[10] = {128, 1, 0, 256, 128, 384, 64, 320,192, 448}; // Q0 - -const Word16 Ip_fft512[18] = {256, 1, 0, 512, 256, 768, 128, 640,384, 896, 64, 576, 320, 832, 192, 704,448, 960}; // Q0 - -const Word16 w_fft512_fx_evs[256] =//Q14 -{ - 16384, 0, 11585, 11585, 15137, 6270, 6270, 15137, - 16069, 3196, 9102, 13623, 13623, 9102, 3196, 16069, - 16305, 1606, 10394, 12665, 14449, 7723, 4756, 15679, - 15679, 4756, 7723, 14449, 12665, 10394, 1606, 16305, - 16364, 804, 11003, 12140, 14811, 7005, 5520, 15426, - 15893, 3981, 8423, 14053, 13160, 9760, 2404, 16207, - 16207, 2404, 9760, 13160, 14053, 8423, 3981, 15893, - 15426, 5520, 7005, 14811, 12140, 11003, 804, 16364, - 16379, 402, 11297, 11866, 14978, 6639, 5897, 15286, - 15986, 3590, 8765, 13842, 13395, 9434, 2801, 16143, - 16261, 2006, 10080, 12916, 14256, 8076, 4370, 15791, - 15557, 5139, 7366, 14635, 12406, 10702, 1205, 16340, - 16340, 1205, 10702, 12406, 14635, 7366, 5139, 15557, - 15791, 4370, 8076, 14256, 12916, 10080, 2006, 16261, - 16143, 2801, 9434, 13395, 13842, 8765, 3590, 15986, - 15286, 5897, 6639, 14978, 11866, 11297, 402, 16379, - 16383, 201, 11442, 11727, 15059, 6455, 6084, 15213, - 16029, 3393, 8935, 13733, 13510, 9269, 2999, 16107, - 16284, 1806, 10238, 12792, 14354, 7900, 4563, 15736, - 15619, 4948, 7545, 14543, 12537, 10549, 1406, 16324, - 16353, 1005, 10853, 12274, 14724, 7186, 5330, 15493, - 15843, 4176, 8250, 14155, 13039, 9921, 2205, 16235, - 16176, 2603, 9598, 13279, 13949, 8595, 3786, 15941, - 15357, 5708, 6823, 14896, 12004, 11151, 603, 16373, - 16373, 603, 11151, 12004, 14896, 6823, 5708, 15357, - 15941, 3786, 8595, 13949, 13279, 9598, 2603, 16176, - 16235, 2205, 9921, 13039, 14155, 8250, 4176, 15843, - 15493, 5330, 7186, 14724, 12274, 10853, 1005, 16353, - 16324, 1406, 10549, 12537, 14543, 7545, 4948, 15619, - 15736, 4563, 7900, 14354, 12792, 10238, 1806, 16284, - 16107, 2999, 9269, 13510, 13733, 8935, 3393, 16029, - 15213, 6084, 6455, 15059, 11727, 11442, 201, 16383 -}; -const Word16 Idx_dortft40[40] = -{ - 0, 25, 10, 35, 20, 5, 30, 15, 16, 1, 26, 11, 36, 21, 6, 31, 32, 17, 2, 27, - 12, 37, 22, 7, 8, 33, 18, 3, 28, 13, 38, 23, 24, 9, 34, 19, 4, 29, 14, 39 -}; // Q0 - -const Word16 Odx_fft8_5[8] = {0, 3, 6, 1, 4, 7, 2, 5}; // Q0 -const Word16 Idx_dortft20[20] = {0, 5, 10, 15, 16, 1, 6, 11, 12, 17, 2, 7, 8, 13, 18, 3, 4, 9, 14, 19}; // Q0 -const Word16 Odx_fft4_5[4] = {0, 3, 2, 1}; // Q0 -const Word16 Ip_fft4[6] = {2,1,0,4,2,6}; // Q0 -const Word16 ip_edct2_64[6] = {16, 64, 0, 32, 16, 48}; // Q0 - -const Word16 w_edct2_64_fx[80] = /*Q14 */ -{ - 16384, 0, 11585, 11585, 15137, 6270, 6270, 15137, - 16069, 3196, 9102, 13623, 13623, 9102, 3196, 16069, - 11585, 8190, 8182, 8170, 8153, 8130, 8103, 8071, - 8035, 7993, 7946, 7895, 7839, 7779, 7713, 7643, - 7568, 7489, 7405, 7317, 7225, 7128, 7027, 6921, - 6811, 6698, 6580, 6458, 6333, 6203, 6070, 5933, - 5793, 5649, 5501, 5351, 5197, 5040, 4880, 4717, - 4551, 4383, 4212, 4038, 3862, 3683, 3503, 3320, - 3135, 2948, 2760, 2570, 2378, 2185, 1990, 1795, - 1598, 1401, 1202, 1003, 803, 603, 402, 201 -}; - -/* HVQ */ -const Word16 hvq_thr_adj_fx[5] = { 23170, 16384, 8192, 16384, 23170 }; /* Q15 */ - -const Word16 hvq_index_mapping_fx[4] = { 0, 1, 3, 4 }; - -const Word16 hvq_class_c_fx[16] = /* Q15 */ -{ - -7617, -14387, 2136, 6914, - 4821, -4428, 14131, -4538, - -4538, 14131, -4428, 4821, - 6914, 2136, -14387, -7617 -}; - -const Word16 hvq_cb_search_overlap24k[17] = -{ - 0, 8, 17, 27, - 39, 53, 69, 89, - 113, 128, 128, 128, - 128, 128, 128, 128, - 128 -}; // Q0 - -const Word16 hvq_cb_search_overlap32k[21] = -{ - 0, 6, 13, 21, - 30, 40, 51, 64, - 78, 96, 116, 128, - 128, 128, 128, 128, - 128, 128, 128, 128, - 128 -}; // Q0 - -const Word16 hvq_peak_cb_fx[1024] = /* Q15 */ -{ - -22652,-20549,-23019, 13968,-25496,-27493, -6957, 5753,-19678,-20274, - -6119, 18297, -5329,-22843,-21254, 13929,-27525,-29034, 563, 7265, - -26138,-13138, -9678, 7972, -517,-20830,-10703, 26832,-27818,-21449, - 208, 6297,-14803,-28396, -7655, 5118, 15134,-24005,-21776, 25330, - -11282,-23669,-20340, -2006,-16212,-24127, 9075, 22581,-20047,-25695, - -254, 6509,-17174,-29714, 1589, 7104,-17683, -4117, -4049, 22347, - -28338,-13898, 671, 6777,-18368,-17925, -7409, 5169,-22093,-19561, - 702, 5969, -6610,-27398, -4875, 8773,-29634, -5552, 272, 6992, - -9167,-19887, -9136, 6447,-23125,-25612, 9760, 5749,-10410,-29816, - 1606, 7019,-13758,-24849, 2084, 7129,-17795,-16160, 596, 7287, - -22276,-11145, 521, 6474,-13471,-20705, -74, 6740, 1891,-16245, - -12763, 13602, -1617,-27384, -9648, 2511,-21802,-11734, -4836, -1602, - -9670,-27913, 6456, 6338,-23227, -4603, 754, 5830, -7699,-24416, - 2204, 6518,-27591, 2763, 1885, 6839,-15248,-10500, 344, 6942, - -13247, -9761, -4486, 4294,-12097,-15164, 637, 6142,-25994,-16384, - 17277, 6511,-10346,-26179, 923, -2374,-13316,-18125, 6841, 7100, - -21083,-24251, 4207, -9464,-22914, -7057, 8647, 8026, 2488,-20731, - -799, 13754, -3451,-12872, 2545, 17315, 2576,-19594,-10340, 4361, - -7007,-19401, 1937, 6751, 17502,-24923,-16948, 8534, -3436,-29004, - 6315, 6467,-16936, -4957, 591, 6604, 1099,-26790, -708, 5543, - -5949,-14167, -4750, 4068,-10682,-14990, -7489, -5197, 169, -6472, - -5143, 16200,-20331, 1722, 395, 6233,-15661,-22913, 24689, 14221, - -3892,-22862, 5154, 6301, -8786,-10120, 216, 6831,-12390,-11062, - 4824, 6473, -7705, -4195, -5326, 6572, -560,-20773, -2777, 1822, - -6703,-14413, 2409, 6083,-10595,-25038, 14291, 4825, 2064,-25736, - 16863, 20463, -2752,-29103, 12609, 7539, -7638,-18024, 1948, 689, - -10961, -5839, 683, 6170,-26004, 12209, 10742, 15580, -2105, -8625, - -4932, 6977, -9940,-15129, 12160, 9806,-13921, -55, 440, 6315, - -305, -6080, 11303, 25730,-12423, -3161, 6875, 9836, -2780,-16434, - 4128, 5778, 17790,-10991, -6633, 21111, 12367,-26550,-10581, -2530, - -6713,-10210, 4804, 6280, -5932, 2832, 4978, 18330, 2696,-23822, - -11870,-13313, 5266,-10870, -7933, 4455, -3155,-10994, 2225, 5803, - 820,-11966, -1397, 5344, -5027, -7230, 1236, 5812, -1649,-21007, - 8948, 5539,-16246, -801, -533, -3132, -8272, -1302, 367, 5958, - -26574, -3470, 7126, -8876, -4819, -5380, -3923, 1466, 1929,-20655, - 4419, 3663, 2437,-26758, 10897, 5616, -6601,-10394, 2148, 137, - 15007,-22909, -3948, 6197, -9059,-27702, 23041, 4088, 8312, -267, - 2973, 25579, -3795, -3612, -489, 5401, 7711,-25887, 3443, 2623, - -24306, 3091, 13248, 3273, -3113, -1410, 3541, 12047, 306,-11933, - -4493, -1997,-18725, 8257, 7593, 7218,-13588, -8411, 8715, -1137, - -12028, 5907, 17904, 21327, -2223,-22989, 9863, -1633, -723, -5944, - 714, 5170, 2128,-15199, 2081, 1626, -482, -8521, 8131, 10765, - 53,-12020, 5152, 5033, 2361,-13747, 24714, 26357, 1074,-28538, - 18087, 4333, 1067,-22148, 14277, 5540, 729,-15049, 7936, 4648, - -16646, -6350, 23646, 9628, -91, -8477, 3298, 4297, 3499, -7417, - -2214, 2931, -4795, -4424, 6487, 4264, -9333, 3377, 6570, 5734, - 1733,-17598, 11163, 4167, -2713,-16183, 14693, 4188,-23780, 9825, - 25701, 15331, 586,-19288, 21576, 12040, 11328,-15656, 2944, 7335, - 9203,-16906, -5723, -5371, -7906, -4632, 12470, 5724, -123,-16520, - 976, -8288, 1262, -3966, -3014, -148, 230, -2169, 505, 3954, - -2256,-11474, 9990, 2644, 4841, -8017, -4617, -2959, 24226,-22733, - 7475, 17722, 6747, -5782, 4877, 8664, -6893,-24218, 12181,-14683, - 2839, -7574, 4815, 2376, 2680, -3986, 1749, 2061, -563, 3232, - 3039, 5761, 343, -4150, 6600, 3792, 6356, 7199, 10702, 24266, - -25636,-12157, 22874,-14633, 2438, -8680, 8312, 3091, 7135, -3110, - 268, 4547, 4272, 4886, 5861, 14177, 11382,-10386, -767, 1448, - 1770,-28758, 27658, 4643, -3008,-10314, 18024, 5252, 6999,-17854, - 9789, 909, 1556,-21532, 20929, 3182, 26836,-23774, -2868, 3509, - -9884,-14471, 24685, 193, -3300, -5891, 5237, -5722, -9043,-14338, - 17448, -7167, -683, 26, 4002, -235, 3072,-12689, 13537, 2670, - 3577,-10477, 10097, 1435, 17713,-24555, 7486, 1713, 6633, -6645, - 1863, -783, 3185, -8349, 3975, -3967, 8090,-23915, 7470, -8732, - 2793,-16733, 17412, 1948, -5975,-14195, 1741,-22095, 3376, -782, - 18258, 16642, 3845, -3536, 5136, 335, 3267, -719, 10538, 7756, - -10993, 5165, 17885, 4767, 4733, -7751, 15643, 8215, 3678, 1686, - 3571, 2189,-11186, 1470, 6152,-11489, 4353, -2197, 1357, -3164, - 4258, -6029, 8420, -230, 6220, -1478, 2105, -787, -4229, -4632, - 15095, -1672, 1986,-16134, 14035, -6088, 7849,-14512, 2875,-10127, - 4796,-14269, -8761,-25428, 1192,-24490, 22001, -6216, 258,-10418, - 27459, 10524, -754, 7182, 7574, 3444, 5995, 3253, 25190, 25483, - 6379, -6363, 409, -8435, -3319, 3253, 12035, 1358, 3184, -6482, - 12864, -216, 25363, -7652, -2971, 5718, 4969, -3415, 7040, -2605, - 2616,-21129, 28211, 1289, 2553,-15075, 23833, 1871, 14598, -6793, - 7189, 4535, 5581, -1997, 4257, -4337, 6027,-10630, 9913, -5633, - 3695,-11614, 19091, 585, 4415, -8798, 15569, -1099, -879, 752, - 19480, 5412, 5743, 448, 9863, 1342, 20634,-16941, -7404,-16938, - -11946, 17852, 19422, 5918, 12538,-20829, 22707, 1113, 4715, -4341, - 12573, -3709, 4015, -8219, 3349,-17549, 6395, -1551, 4414, -8302, - 24598,-24474, 21909, 9778, 5346, 1386, 6942, -4708, -1507, 2077, - 8224,-10420, 6088, -3411, 8824, -6355, 7219, 17353, 22325, 25889, - 6666, -1811, 1964,-13461, 8123, -4454, 26614, 11418, 4582, -7133, - 18420, -3918, -264, 10545, 24810, 12821, 6936,-22880, 10241,-24118, - 3108, -7220, 11991,-12963, 4237,-10392, 23417, -2591, 4624,-14780, - 29121, -1235, 7543, -1157, 17358, 1244, 20161, -6319, 2575, -5204, - 4384, 5974, 10993, -2909, 1619, -4017, 26017, 722, 4659, 11545, - 14463, 4774, -2892, 10593, 15058, -4543, 1972,-15782, 26652,-10199, - 6046, -562, 11992, -8022, 6197, -349, 7928,-12070, 21399,-13670, - 15116, 99, 5829, -4061, 16713, -7200, -8904, 4170, 24814, -7599, - 12177, 6080, 19388, 11094, 4262, 1544, 17090, -4775, -6957, -5908, - 19576,-23176, 7126,-23499, 24889,-17683, 5514, -5416, 23284, -5830, - 6388, -1788, 14378,-11597, 5099, -8771, 28791, -4573, 6029, -4164, - 3217,-26929, 6427, 145, 9306,-17874, 5544, 3835, 25432, -15, - 8297,-10673, 21003,-15084, 6019, -7628, 13891,-22535, 27144, 1685, - 10077, 4230, 5211, -1543, 22179,-10638, 6385, 5710, 13476,-12976, - 5272, 17571, 23747, 5084, -2100, 9127, 13746,-20852,-16310, 15716, - 21422,-23074, 6532, -31, 17127,-16620, 5397, -3362, 28477, -9453, - 6238, 1258, 13189,-22475, 12895, -4568, 8062,-26648, 2873, 5975, - 22151,-15208, 6319, -507, 23117,-17415, 24129,-14207, 12908,-21101, - 7262, 8470, 25405, -9450, 5424, -1162, 29494,-16114, 21373, 22875, - 24554, 16783, 6684, 2453, 15785,-28885, 6504, 1085, 21619,-24241, - 21468, 620, 23222, -7235, 10917, 8863, 18570,-21606, 6710, -2091, - 28961,-25837, 6884, 20869, 27603, -8999, 6798, 5617, 28706,-21501, - 6066, 4720, 25084,-28951 -}; - -const Word16 hvq_pg_huff_offset[NUM_PG_HUFFLEN] = {0,2,3,8,9,11,13,15,19}; // Q0 -const Word16 hvq_pg_huff_thres[NUM_PG_HUFFLEN] = {0,0x2,0x4,0x18,0x20,0x40,0x80,0x100,0x300}; // Q0 - -const Word16 hvq_pg_huff_tab[32] = -{ - 30, 31, 1, 0, 2, 3, 28, 29, 4, 5, 27, 25, 26, 6, 24, 7, 8, 22, 23, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21 -}; // Q0 - -const Word16 hvq_cp_huff_len[52] = -{ - 3, 4, 5, 6, 6, 6, 6, 6, 4, 4, 5, 5, 5, 5, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 8, - 8, 8, 8, 8, 9, 10, 10, 11, 11, 11, 10, 10, 10, 10, 11, 12, 12, 13, 13, 12, 12, 11, 12 -}; // Q0 - -const Word16 hvq_cp_huff_val[52] = -{ - 7, 8, 6, 3, 4, 5, 6, 7, 9, 10, 7, 8, 9, 10, 11, 12, 13, 11, 12, 13, 14, 15, 8, 9, 10, - 11, 4, 5, 3, 4, 5, 6, 7, 5, 4, 5, 3, 4, 5, 6, 7, 8, 9, 6, 1, 2, 0, 1, 3, 4, 7, 5 -}; // Q0 - -const Word16 hvq_cp_layer1_map5[HVQ_CP_MAP_LEN] = { 16, 8, 4, 2, 1, 18, 17, 9 }; // Q0 - -const Word16 hvq_cp_huff_thres[HVQ_CP_HUFF_NUM_LEN] = { 0x0, 0x2, 0xC, 0x20, 0x50, 0x60, 0x100, 0x180, 0x600, 0x1000, 0x1C00 }; // Q0 -const Word16 hvq_cp_huff_offset[HVQ_CP_HUFF_NUM_LEN] = { 0, 2, 7, 12, 18, 19, 24, 26, 35, 45, 51 }; // Q0 - -const Word16 hvq_cp_huff_tab[52] = -{ - 46, 47, 44, 45, 48, 49, 51, 36, 37, 38, 43, 50, 34, 35, 39, 40, 41, 42, 33, 28, 29, 30, 31, 32, 26, 27, - 3, 4, 5, 6, 7, 22, 23, 24, 25, 2, 10, 11, 12, 13, 17, 18, 19, 20, 21, 1, 8, 9, 14, 15, 16, 0 -}; // Q0 - -/*----------------------------------------------------------------------------------* - * FEC for HQ core - *----------------------------------------------------------------------------------*/ - -const Word16 Num_bands_NB[MAX_SB_NB] = {8,8,2}; // Q0 - -const Word16 SmoothingWin_NB875_fx[70] = /*Q15*/ -{ - 0, 16, 66, 148, 263, 411, 590, 802, 1045, 1318, - 1623, 1956, 2319, 2710, 3129, 3574, 4046, 4542, 5062, 5604, - 6169, 6754, 7358, 7981, 8620, 9275, 9945, 10627, 11321, 12025, - 12738, 13459, 14185, 14915, 15649, 16384, 17119, 17853, 18583, 19309, - 20030, 20743, 21447, 22141, 22823, 23493, 24148, 24787, 25410, 26014, - 26599, 27164, 27706, 28226, 28722, 29194, 29639, 30058, 30449, 30812, - 31145, 31450, 31723, 31966, 32178, 32357, 32505, 32620, 32702, 32752 -}; - -const Word16 SmoothingWin_NB2_fx[16] = -{/* Q15 */ - 0, 315, 1247, 2761, 4799, 7282, 10114, 13188, 16384, 19580, 22654, 25486, 27969, 30007, 31521, 32453 -}; -/*----------------------------------------------------------------------------------* - * SC-VBR - *----------------------------------------------------------------------------------*/ - -const Word16 bp1_num_coef_wb_fx[5] = { 15286, 0, -30572, 0, 15286, }; /* Q14 */ -const Word16 bp1_den_coef_wb_fx[5] = { 16384, 0, -30498, 0, 14262, }; /* Q14 */ - -const Word16 shape1_num_coef_fx[11] = /* Q15 */ -{ - 31437, -2443, -13636, 4316, - -10188, 48, 2639, -3575, - -776, 1046, 399 -}; - -const Word16 shape1_den_coef_fx[11] = { 32767, /* Q15 */ - 2940, -12237, 4032, -9609, - -1998, 2335, -3900, -1595, - 857, 253 -}; - -const Word16 shape2_num_coef_fx[11] = /* Q15 */ -{ - 30760, 31, -9699, 9516, - -5878, -7249, -10468, 442, - 3278, -63, 1115 -}; - -const Word16 shape2_den_coef_fx[11] = { 32767, /* Q15 */ - 16019, -890, 12799, 2346, - -6985, -13192, -5795, -949, - -1492, -304 -}; - -const Word16 shape3_num_coef_fx[11] = /* Q15 */ -{ - 30685, -383, -9937, -9605, - -5997, 7611, -10393, -355, - 3239, 12, 1196 -}; - -const Word16 shape3_den_coef_fx[11] = { 32767, /* Q15 */ - -16498, -911, -12947, 2286, - 7430, -13385, 6066, -1182, - 1580, -273 -}; - -const Word16 txlpf1_num_coef_fx[11] = /* Q13 */ -{ - 138, 198, 514, 681, 921, - 964, 921, 681, 514, 198, - 138, -}; - - -const Word16 txlpf1_den_coef_fx[11] = /* Q13 */ -{ - 8192,-18945, 31613,-31149, 24494, - -12753, 5528, -1436, 347, -25, - 4, -}; - - -const Word16 txhpf1_num_coef_fx[11] = /* Q13 */ -{ - 138, -198, 514, -681, 921, - -964, 921, -681, 514, -198, - 138, -}; - -const Word16 txhpf1_den_coef_fx[11] = /* Q13 */ -{ - 8192, 18945, 31613, 31149, 24494, - 12753, 5528, 1436, 347, 25, - 4, -}; - -/* NELP filter coefficients */ -const Word16 bp1_num_coef_nb_fx_order7[8] = -{ - /* Q = BP1_COEF_NB_QF_ORDER7 = 13 */ - 1481, 6730, 15579, 22923, 22923, 15579, 6730, 1481, - -}; - -const Word16 bp1_den_coef_nb_fx_order7[8] = -{ - /* Q = BP1_COEF_NB_QF_ORDER7 = 13 */ - 8192, 16156, 23814, 21855, 14620, 6614, 1907, 268, -}; - -/* NELP gain tables */ -const Word16 UVG1CB_WB_FX[UVG1_CBSIZE][2] = /* Q13 */ -{ - { -2224, -2114, }, - { 12666, 12314, }, - { 3723, 9690, }, - { 17880, 17978, }, - { 4136, 3946, }, - { 11605, 21280, }, - { 9777, 9340, }, - { 21701, 21627, }, - { 1088, 1679, }, - { 13993, 13697, }, - { 10443, 5214, }, - { 19702, 19692, }, - { 5458, 5317, }, - { 17051, 16918, }, - { 14206, 8503, }, - { 24330, 24271, }, - { -118, -279, }, - { 11615, 14863, }, - { 6898, 6544, }, - { 18913, 18637, }, - { 1142, 6811, }, - { 15995, 16070, }, - { 6921, 13182, }, - { 22857, 22741, }, - { 3017, 2260, }, - { 14952, 14992, }, - { 8176, 8093, }, - { 20721, 20549, }, - { 7441, 2370, }, - { 17897, 13988, }, - { 10986, 10966, }, - { 26098, 25992, }, -}; - -const Word16 UVG1CB_NB_FX[UVG1_CBSIZE][2] = /* Q13 */ -{ - { -4791, -5157, }, - { 4824, 4937, }, - { -3443, 3610, }, - { 5539, 15293, }, - { -469, -3986, }, - { 7977, 8157, }, - { 2748, 2492, }, - { 14070, 14014, }, - { -2486, -2863, }, - { 6033, 5892, }, - { 2678, -441, }, - { 11741, 11804, }, - { -256, -847, }, - { 9153, 8922, }, - { -106, 5979, }, - { 16876, 16741, }, - { -3584, -3873, }, - { 3511, 9538, }, - { 401, 416, }, - { 11082, 10550, }, - { -1418, -1725, }, - { 8988, 5255, }, - { 6275, 1137, }, - { 15372, 15247, }, - { -3899, 301, }, - { 6976, 7095, }, - { 1581, 1453, }, - { 12988, 12824, }, - { 2692, -3093, }, - { 9778, 10153, }, - { 3938, 3628, }, - { 18823, 18695, }, -}; - -const Word16 UVG2CB1_WB_FX[UVG2_CBSIZE][5] = /* Q12 */ -{ - { 914, 990, 1490, 5954, 2618, }, - { 5599, 4621, 4078, 3493, 3057, }, - { 4930, 4031, 2999, 2150, 1706, }, - { 7722, 3021, 1804, 1478, 1452, }, - { 1171, 1390, 6895, 2592, 1486, }, - { 4155, 4287, 4409, 4515, 4577, }, - { 3633, 3661, 3694, 3711, 3736, }, - { 13212, 5009, 2611, 2175, 2048, }, - { 3716, 2887, 2253, 1965, 1723, }, - { 7141, 4567, 3434, 2970, 2396, }, - { 2856, 3038, 3259, 3481, 3709, }, - { 5929, 5459, 4923, 4448, 4084, }, - { 980, 1024, 1550, 5686, 8038, }, - { 3516, 7354, 10392, 3619, 2856, }, - { 2598, 3093, 3582, 4780, 5965, }, - { 1962, 10993, 5020, 2861, 2587, }, - { 796, 916, 1010, 1175, 7720, }, - { 4445, 4406, 4344, 4249, 4175, }, - { 1454, 6493, 2611, 1758, 1765, }, - { 6296, 7686, 4763, 2945, 2203, }, - { 1502, 1573, 1895, 2981, 5464, }, - { 4750, 4829, 4909, 4929, 4895, }, - { 3644, 3774, 3922, 4037, 4116, }, - { 9051, 7403, 6003, 4746, 4081, }, - { 1558, 1869, 2331, 3000, 3595, }, - { 4671, 4646, 4614, 4553, 4482, }, - { 2262, 2608, 3158, 3890, 4468, }, - { 5556, 5441, 6824, 7146, 5724, }, - { 1470, 1550, 2016, 11169, 3828, }, - { 5488, 6270, 6771, 8202, 9281, }, - { 3477, 3693, 4113, 4460, 4705, }, - { 10877, 17984, 10194, 7291, 2824, }, - { 1327, 1498, 1476, 1667, 2138, }, - { 4463, 4299, 4094, 3880, 3731, }, - { 3188, 3164, 3156, 3104, 3140, }, - { 9757, 5690, 3366, 2296, 1792, }, - { 1731, 1753, 12406, 4082, 2247, }, - { 3866, 4060, 5007, 5274, 5225, }, - { 3998, 3957, 3900, 3839, 3789, }, - { 18040, 9417, 5567, 3465, 2504, }, - { 2160, 2532, 2895, 2577, 2321, }, - { 5052, 4789, 4490, 4203, 3953, }, - { 3381, 3415, 3458, 3496, 3536, }, - { 6166, 5811, 5440, 5035, 4650, }, - { 2839, 3389, 5057, 7558, 10414, }, - { 3875, 4431, 5183, 6310, 7166, }, - { 4311, 4130, 3571, 3070, 8555, }, - { 8791, 8260, 7299, 6243, 5421, }, - { 1191, 1237, 1368, 1814, 11819, }, - { 2486, 5729, 6150, 4222, 3667, }, - { 4018, 3825, 3600, 3388, 3256, }, - { 7504, 5817, 4989, 4065, 3322, }, - { 1430, 1962, 5546, 4096, 4681, }, - { 5393, 5378, 5324, 5230, 5052, }, - { 4041, 4090, 4132, 4159, 4181, }, - { 12469, 9221, 5735, 3617, 2501, }, - { 2482, 2565, 2768, 3088, 3461, }, - { 5209, 5080, 4905, 4706, 4522, }, - { 3139, 3362, 3647, 3910, 4156, }, - { 7139, 6588, 5941, 5251, 4674, }, - { 1719, 1866, 7993, 7634, 3987, }, - { 3587, 5289, 7882, 13519, 16095, }, - { 2409, 2515, 2749, 7316, 4636, }, - { 30391, 18493, 13798, 4799, 2283, }, -}; - -const Word16 UVG2CB2_WB_FX[UVG2_CBSIZE][5] = /* Q12 */ -{ - { 1565, 1391, 1635, 5228, 2681, }, - { 2156, 2558, 6205, 5561, 3944, }, - { 2039, 2406, 3094, 3409, 3968, }, - { 5090, 5065, 4989, 4858, 4764, }, - { 1436, 1736, 2816, 2362, 2400, }, - { 4375, 4425, 4465, 4478, 4493, }, - { 4648, 4081, 3550, 2981, 2667, }, - { 1705, 1950, 3679, 7828, 9895, }, - { 2839, 1826, 1443, 1210, 1245, }, - { 1387, 1410, 1768, 8873, 4383, }, - { 4022, 3784, 3565, 3316, 3096, }, - { 9983, 7147, 5225, 3742, 3027, }, - { 6769, 2357, 1531, 1448, 1556, }, - { 4591, 4671, 4735, 4765, 4789, }, - { 4308, 4198, 4052, 3896, 3769, }, - { 2288, 2550, 4922, 8294, 14878, }, - { 1361, 1480, 1511, 1991, 10450, }, - { 2933, 3131, 3694, 4687, 5201, }, - { 3984, 3048, 2479, 2644, 5514, }, - { 5353, 5480, 5488, 5434, 5437, }, - { 3319, 2881, 2528, 2152, 1927, }, - { 4873, 4748, 4578, 4407, 4257, }, - { 6185, 4396, 3751, 3400, 2899, }, - { 2159, 8067, 7534, 5121, 3640, }, - { 2265, 10177, 3803, 2588, 2441, }, - { 2188, 2206, 4293, 12691, 5893, }, - { 3587, 3651, 3760, 3864, 3960, }, - { 13158, 9752, 7171, 5431, 5364, }, - { 5710, 4173, 2928, 2090, 1774, }, - { 3531, 3831, 4641, 5787, 6622, }, - { 4395, 4356, 4281, 4194, 4111, }, - { 2243, 2476, 5814, 3965, 27176, }, - { 1575, 1667, 7544, 3005, 1984, }, - { 2583, 2511, 11684, 5765, 4807, }, - { 3632, 3458, 3277, 3114, 2971, }, - { 8569, 6778, 5866, 5515, 5141, }, - { 3267, 3035, 2940, 2782, 2691, }, - { 3929, 4249, 4577, 4877, 5162, }, - { 4443, 4173, 3864, 3590, 3337, }, - { 3998, 4725, 5728, 6873, 7885, }, - { 4369, 2824, 2237, 1648, 1404, }, - { 1000, 1022, 1477, 2682, 15276, }, - { 3916, 3851, 3766, 3664, 3591, }, - { 13206, 4485, 3230, 3897, 3648, }, - { 10002, 3515, 2393, 2233, 2211, }, - { 4603, 4836, 5071, 5259, 5411, }, - { 3919, 4035, 4177, 4304, 4419, }, - { 3046, 8332, 16475, 11172, 10858, }, - { 1027, 1007, 1196, 1578, 5937, }, - { 1892, 2422, 3227, 3920, 7400, }, - { 3584, 3532, 3508, 3470, 3437, }, - { 5363, 6155, 6805, 6854, 6811, }, - { 4038, 3512, 3030, 2636, 2332, }, - { 6760, 6124, 5235, 4299, 3687, }, - { 4125, 6528, 4068, 3238, 3483, }, - { 5020, 5905, 7082, 8554, 9623, }, - { 1399, 5868, 3069, 1726, 1655, }, - { 4691, 4234, 3974, 3757, 9616, }, - { 3978, 4003, 4003, 3983, 3960, }, - { 2103, 16858, 9252, 4860, 4727, }, - { 8043, 5294, 3970, 3098, 2583, }, - { 4680, 5109, 5576, 5965, 6275, }, - { 4867, 4584, 4276, 3958, 3682, }, - { 1213, 3115, 6552, 22778, 20977, }, -}; - -const Word16 UVG2CB1_NB_FX[UVG2_CBSIZE][5] = /* Q12 */ -{ - { 773, 785, 785, 785, 860, }, - { 3560, 3521, 3410, 3265, 3167, }, - { 1766, 2982, 10273, 3790, 2248, }, - { 4986, 4753, 4496, 4172, 3922, }, - { 2036, 2030, 2009, 1973, 1897, }, - { 3291, 3554, 3868, 4126, 4345, }, - { 3207, 3122, 3026, 2913, 2797, }, - { 13220, 6844, 3967, 2746, 2466, }, - { 1553, 1627, 1392, 1766, 3679, }, - { 5379, 4640, 3844, 3254, 2635, }, - { 1600, 1622, 2430, 9446, 4214, }, - { 5115, 5200, 5311, 5365, 5343, }, - { 6229, 3008, 1989, 1622, 1597, }, - { 1726, 2114, 7046, 6162, 4301, }, - { 1004, 1056, 1841, 6006, 7101, }, - { 6388, 9659, 4510, 2774, 2113, }, - { 1060, 1153, 1400, 1733, 2121, }, - { 3448, 3523, 3612, 3683, 3770, }, - { 1496, 2045, 2910, 3563, 4058, }, - { 4419, 4592, 4795, 4921, 4978, }, - { 1407, 5314, 2788, 1675, 1350, }, - { 4210, 4225, 4227, 4186, 4169, }, - { 2247, 8245, 4392, 2522, 1709, }, - { 7211, 6741, 6110, 5397, 4680, }, - { 3602, 2286, 1577, 1229, 1148, }, - { 6674, 5227, 3576, 2448, 1901, }, - { 954, 1035, 1079, 1683, 9558, }, - { 4011, 5853, 8979, 7138, 4484, }, - { 2784, 2702, 2637, 2546, 2471, }, - { 4414, 4065, 4627, 4208, 9275, }, - { 2771, 3012, 3357, 3735, 4066, }, - { 19742, 8603, 3943, 2546, 2085, }, - { 1132, 1123, 1107, 1093, 1114, }, - { 3913, 3838, 3733, 3630, 3548, }, - { 948, 1565, 6063, 2654, 1667, }, - { 6159, 5567, 4884, 4241, 3770, }, - { 925, 1164, 1585, 6062, 3090, }, - { 3818, 4037, 4322, 4536, 4726, }, - { 4291, 3894, 3441, 3006, 2733, }, - { 8544, 6487, 4962, 3812, 2970, }, - { 1744, 1758, 1704, 1633, 1576, }, - { 4416, 4259, 4044, 3810, 3628, }, - { 1919, 2159, 3323, 13977, 7898, }, - { 5952, 5731, 5419, 5061, 4732, }, - { 2775, 2812, 2507, 2540, 6585, }, - { 3436, 3960, 4661, 5975, 6274, }, - { 3082, 3150, 3246, 3337, 3404, }, - { 4089, 16018, 8285, 4116, 2704, }, - { 1419, 1425, 1400, 1371, 1363, }, - { 3825, 3890, 3953, 3993, 4015, }, - { 2498, 2689, 2846, 3011, 3213, }, - { 5122, 5024, 4881, 4691, 4524, }, - { 2285, 2325, 2317, 2313, 2271, }, - { 4493, 4529, 4517, 4478, 4443, }, - { 9138, 3969, 2522, 2222, 2415, }, - { 10009, 8719, 7292, 5837, 4532, }, - { 831, 908, 1039, 1656, 6813, }, - { 2070, 5478, 5174, 3911, 3694, }, - { 1577, 1565, 1635, 2583, 13154, }, - { 5590, 5788, 5922, 6752, 7063, }, - { 4061, 3497, 2710, 2099, 1716, }, - { 2750, 3118, 16574, 7891, 3651, }, - { 2598, 3072, 3809, 4906, 5172, }, - { 15348, 10948, 7740, 4979, 3446, }, -}; - -const Word16 UVG2CB2_NB_FX[UVG2_CBSIZE][5] = /* Q12 */ -{ - { 961, 867, 812, 771, 775, }, - { 2544, 2686, 3010, 3605, 5048, }, - { 1524, 1818, 2889, 3029, 3046, }, - { 4195, 4301, 4421, 4497, 4580, }, - { 2026, 1990, 1965, 1943, 1939, }, - { 4338, 4156, 3963, 3750, 3590, }, - { 7732, 2904, 1804, 1407, 1513, }, - { 1613, 2353, 11315, 5764, 4291, }, - { 1519, 1462, 1434, 1341, 1294, }, - { 1627, 1710, 2163, 9654, 5615, }, - { 2322, 7293, 3251, 2020, 2066, }, - { 4967, 5112, 5174, 5203, 5230, }, - { 1590, 1449, 1943, 5947, 3563, }, - { 7747, 5170, 3268, 2392, 2082, }, - { 3970, 3559, 3164, 2774, 2493, }, - { 1993, 2210, 3204, 3717, 23534, }, - { 1185, 1236, 1423, 2115, 4772, }, - { 3935, 3840, 3714, 3583, 3477, }, - { 1640, 1550, 1800, 2609, 10880, }, - { 4067, 4437, 4811, 5108, 5536, }, - { 1472, 1367, 1533, 2132, 7352, }, - { 4310, 4284, 4216, 4117, 4057, }, - { 10817, 4587, 2611, 2066, 2037, }, - { 2089, 2427, 4698, 14635, 7517, }, - { 2529, 1561, 1209, 976, 945, }, - { 2908, 3070, 4055, 5862, 6448, }, - { 2676, 2861, 3115, 3295, 3408, }, - { 2932, 14330, 6533, 3739, 3462, }, - { 3681, 3079, 2559, 2151, 1903, }, - { 5636, 5316, 4978, 4690, 4425, }, - { 2298, 7228, 6976, 4251, 3347, }, - { 2504, 3421, 6784, 8483, 15064, }, - { 1253, 1180, 1136, 1094, 1076, }, - { 3451, 3524, 3600, 3646, 3707, }, - { 1701, 2030, 6574, 4746, 4451, }, - { 4688, 4751, 4762, 4727, 4722, }, - { 2977, 2363, 1883, 1563, 1399, }, - { 5080, 4685, 4275, 3835, 3513, }, - { 5445, 3828, 2851, 2242, 1948, }, - { 1929, 5037, 17760, 8346, 6300, }, - { 1839, 1782, 1680, 1586, 1534, }, - { 3086, 3472, 4031, 4950, 9695, }, - { 3199, 3052, 2896, 2751, 2622, }, - { 5822, 5782, 5727, 5566, 5478, }, - { 1548, 2234, 6748, 2562, 1722, }, - { 6699, 5216, 4475, 3531, 3028, }, - { 3773, 3628, 3460, 3279, 3155, }, - { 1581, 1672, 2929, 20221, 16432, }, - { 1210, 1215, 1389, 1678, 2177, }, - { 3863, 3886, 3937, 3961, 3989, }, - { 1541, 1745, 1829, 3479, 15563, }, - { 4444, 4952, 5573, 6056, 6545, }, - { 2460, 2397, 2284, 2133, 2041, }, - { 4808, 4676, 4493, 4322, 4213, }, - { 15031, 6644, 3315, 2900, 2885, }, - { 4003, 4760, 6946, 8274, 8401, }, - { 5001, 2495, 1594, 1337, 1365, }, - { 3428, 3706, 4073, 4457, 4670, }, - { 3326, 3277, 3222, 3142, 3088, }, - { 6162, 6317, 6494, 6459, 6530, }, - { 2659, 2599, 2537, 2482, 2546, }, - { 8554, 6902, 5233, 4116, 3650, }, - { 4643, 4099, 3616, 3201, 2895, }, - { 9589, 26630, 15412, 12532, 8715, }, -}; - -const Word16 frac_4sf_fx[NB_SUBFR + 2] = { 4,8,12,16,16,16 }; /* Q4 */ - -/* ERB table for PPP-ampl-quant */ -const Word16 erb_WB_fx[NUM_ERB_WB + 1] = { 0, 238, 475, 713, 950, 1188, 1426, 1663, 1911, 2185, 2490, 2826, 3205, 3624, 4094, 4620, 5210, 5875, 6626, 7478, 8448, 9558, 11264, 13568, 16387 };//Q(log2(2.56) - - -/* ERB table for PPP-ampl-quant */ -const Word16 erb_NB_fx[NUM_ERB_NB + 1] = { 0, 238, 475, 713, 950, 1188, 1426, 1663, 1911, 2185, 2490, 2826, 3205, 3624, 4094, 4620, 5210, 5875, 6626, 7478, 8448, 9558, 10243 };//Q(log2(2.56) - - - -/*Amplitude and power tables for PPP*/ - -const Word16 AmpCB1_WB_fx[640] = -{//Q13 - 5655, 1589, -653, 3568, -3173, -1852, -3204, -4623, -2100, -5103, - -923, -67, -7152, -4958, -2019, -1810, -8532, -648, 6581, 8043, - 160, 778, -1535, 863, 5482, 1674, -3576, 123, -3163, -3595, - -852, -53, -1080, -2683, -3199, -950, -1353, 6258, -1431, 1249, - 2059, 677, 146, 1011, 956, -2022, -25, 300, 421, -5859, - 1027, -452, -7343, -1052, 3818, 1099, -1005, 659, -511, -658, - 2091, 720, -600, 145, -1504, -1716, -442, -2172, -1505, 2702, - 731, 1473, -213, -4120, -2976, 688, 3205, 1213, 679, 232, - 3672, 4770, -1198, -298, -1714, -3669, -2833, -664, -1859, -2380, - -1169, -1593, -453, 295, -1225, -3110, -1776, 2112, 2710, 3333, - 1022, 1248, 1091, 1164, 1200, 1782, -809, -2306, -3124, -2194, - -1567, 465, 2223, -1301, -463, -2157, 729, 2279, -1938, 610, - 437, -803, -1025, 775, -171, -637, 163, 2251, 316, -1663, - -4123, -20, -2827, -1529, -1436, 3447, 79, -274, 1650, 4097, - 2369, 927, 448, -449, 293, -239, -1028, -4805, 1354, 431, - -2219, -490, -3849, 1639, -2925, 817, 1485, 2527, 5444, -1994, - 1476, 506, -1643, 2003, -1676, -788, -1681, -2011, 1389, 452, - 593, 3, -1200, -3987, -1634, -4310, -686, 882, 6235, 2420, - -196, -1257, -2038, -498, 1394, 671, -2302, -809, -446, 3644, - -1643, -2304, -828, 105, -323, -3906, -960, 7324, 3095, -786, - 95, 633, 1266, 750, 1509, -2033, -3134, 432, 1028, -1825, - 1258, 256, -3249, -6868, -523, -325, -1779, 4313, 2524, 3433, - -600, -410, -88, 410, -1182, -1140, -1448, -1344, -5074, 6054, - 2194, 1505, -681, -2408, 1376, 1389, 1209, 1048, -4199, -2939, - 1855, 1744, -1344, -1431, -1955, -1805, -4992, 512, 624, 2749, - -3446, -1215, -3764, -2169, -3601, -1321, 67, 4326, 6624, 5816, - -334, -1746, -441, -754, 1853, 3889, -595, -493, 441, -811, - -48, -764, -1473, -683, 603, -1754, 780, 698, 1084, 1713, - 560, -808, -754, -2890, -1205, -318, -1021, 3195, 5693, -4603, - 1343, -1061, -2441, -1784, 721, 267, 227, -622, 3013, -768, - -472, 90, 13, 290, 1055, 948, 1617, -2368, -1087, 1103, - -4784, -3872, 5125, -2518, -215, 6962, 1095, -1521, 2091, -2962, - 2285, 1117, 1174, 2635, -1907, -1012, 814, -417, -2162, -2805, - -1188, -707, -808, -1757, 260, -1093, -3957, -3266, 4132, 5980, - 177, -1478, 960, 2029, 3989, 597, -3062, -3940, -1688, 236, - -1559, 150, 2432, 348, -242, -2014, -1027, 6298, -2957, -3960, - 1090, 1014, -1261, -744, -954, -938, -3713, -3272, 5356, -2356, - -1439, 3808, -2330, -4437, 5177, -3606, -1382, 1824, 407, 325, - 649, 330, 85, 206, -415, 183, -646, 602, -2656, 808, - 1039, 29, -3202, -6168, -3640, 3736, 4183, 3959, 330, 339, - 2701, 343, 1501, 1879, -3194, -4648, -1630, 1656, -1578, -84, - -3065, -4126, 24, -260, 263, -1705, -1289, 2432, 1229, 7481, - 2586, 1696, 646, -1773, -792, 1932, -1908, -1897, -1129, 112, - -5667, -1592, 2253, -980, 1581, 211, 5277, 4846, -288, -159, - 956, 1196, 771, -973, -1785, -516, -1015, 847, 614, -791, - -442, -1594, -4632, -4392, -416, 1398, 2570, 752, 264, 6570, - 1655, 546, 1238, -1362, -1330, -2005, 3590, -2155, -184, -1224, - -1452, -1533, -534, 1010, -1707, 801, 3628, -289, 2414, 132, - 2643, -2813, -4524, 5092, -7362, 740, 428, -510, 81, -1209, - 616, 1454, 1861, -3958, -4084, 189, -1219, -875, 3764, 2086, - -1554, -2071, 1515, 3392, 12, -686, -2414, -1382, 176, 1685, - 2055, -5698, 1582, 4117, -4846, -2922, 610, 2082, 4682, -2487, - 348, 2258, -338, -1379, 1472, 618, -202, -1122, -76, -2468, - -1216, -986, -327, -1441, 102, 403, -2105, 2411, 1510, 1288, - -715, -577, 1074, 2533, -3521, -3449, 2140, -751, -307, 3805, - 158, -1385, -404, -1378, -1948, 3785, 4216, 2667, -1894, -1559, - 1037, 1371, 989, -205, -333, -4784, -3429, -1283, 3299, 859, - -4922, -5481, -1196, -1748, -720, 516, 113, 4590, 7071, 4345, - -5729, -3862, 3590, 1463, 7094, 4991, 854, -66, -1630, -686, - -923, -3266, -1988, 2345, 785, -1420, 3004, 2934, -1245, -65, - -2696, -3088, -1438, 614, 1584, -239, -1552, 580, 6285, -1673, - -1598, -4018, -1909, 747, 3191, 366, 1467, -1933, 2759, 2804, - 518, 193, -1149, -3108, 441, 1458, 2791, -4131, 2694, 3372, - -5023, -6491, 1794, 2739, 1463, 5843, 2869, 1993, -1409, 4832 -}; - -const Word16 AmpCB2_WB_fx[64 * (NUM_ERB_WB - 13)] = -{//Q13 - -5276, -7711, -3518, -2416, -382, 319, -1900, -900, 1725, 884, - 4071, -4052, -2430, -336, 2136, 3006, 591, -3893, -2731, 2625, - 2390, -1047, -883, -3368, -4235, -3726, 189, -1803, 784, 2336, - 206, -2140, 3001, -730, -2279, 85, -3395, 4367, 2214, -254, - -3114, -2348, 2763, 686, -7495, -6618, 3164, -3957, -2681, -2049, - 1659, 3634, 2962, 1574, 379, -2478, 2861, 616, 1124, 205, - -3075, -348, -2006, -90, 761, 1157, -114, -9460, -2786, -3254, - -1120, -1500, -446, 2835, -314, 3205, 2115, -837, -261, 36, - 80, -485, 1133, 2124, -1031, -401, -3166, 1145, -1616, -3425, - -3071, -6891, -4198, 2292, 5160, -46, 1430, 280, 1378, 1700, - -1673, -1126, 5270, 5096, -975, -1070, 1314, -2389, -2982, 20, - -3218, -892, -636, -876, -302, -2923, -3240, 4121, 1625, -557, - 994, 544, 2657, 7133, -273, -3530, -1419, 1431, -936, -2622, - 303, 75, -5444, -5549, 4183, 1248, 3474, -789, 2375, -1778, - 1660, 1520, -1433, -4047, 531, 7001, 695, 1889, 4261, -2791, - -1557, -2980, -316, 415, 1134, 1501, -6923, 521, -3134, -1812, - 1848, 676, -1733, 734, 2207, 2029, -476, -1976, -161, 29, - 7147, -1774, 720, -1070, -372, -1626, -6473, -2448, -5235, -2651, - -1800, -1477, -767, 1335, 471, 4857, 888, 593, -370, 196, - 907, 174, 557, -720, -1339, 1590, 37, -1247, -1307, 276, - -1739, -6032, -3088, -2499, -497, -393, -569, 3003, 2694, 3751, - 4652, -258, -1305, 175, 189, -344, -2381, -1992, 463, 529, - -6375, 3966, -3558, -3001, -640, 3117, 1120, 966, 1316, -561, - 27, 2794, 2831, 3512, 3453, -418, -2319, -6741, -3443, 80, - 1281, 1691, 1500, -591, -739, 2385, -4676, -5822, -1437, 730, - 3593, -437, 1090, 3497, -1932, 2854, 4858, 2654, 947, 1879, - -4115, 2700, -3092, -1524, 225, -8272, -6736, -1277, 2991, 2983, - 1129, -1661, 2817, 468, 491, -744, 390, 677, 8129, -3130, - -687, -433, 1488, -3763, -177, -581, -764, 39, 1537, -2203, - -1678, 263, -1214, 2175, -1857, 3097, -894, 4207, -1943, -834, - 1513, -4123, 3981, 6041, 653, -757, -313, -3024, -4614, -3139, - -2966, 178, 4956, -427, -41, 2376, 1008, -1351, -92, 978, - 1998, 5146, 2069, 117, -1754, -2756, 4425, 168, -1807, -1761, - -1215, 178, -1562, -3369, -919, -2576, 3614, 4968, -30, -396, - -1151, -1146, 868, 1073, -359, 2732, 546, 4431, -321, -1081, - 1410, -3214, -2316, -4889, -2460, -3844, -7323, -1438, -1488, 1849, - 4037, 2421, 2697, -2372, -1877, 670, 3674, -907, 888, -3703, - 375, -1278, -1477, 2501, -936, -1682, -1353, -335, -4440, 383, - -2730, -2130, -1105, 1588, 3340, 4816, -4023, 502, -4146, 236, - 4481, 589, -3696, 826, -97, 222, -8037, -2244, 142, 810, - -2195, 1315, 656, 1901, -485, 317, 1512, 1465, -2026, 1853, - 929, 1670, -2736, -463, -836, -4946, -134, 2769, 2972, -5148, - -3147, 913, -1483, 267, -1560, 3903, 1507, 1105, -1496, 210, - -1196, 3764, 601, 1630, 3842, 6374, -1293, -4555, -3087, 199, - -1917, -3331, -2317, -1774, 479, 3712, 2729, 1309, -3047, -514, - 861, -213, 1317, -2035, 4369, 5228, 942, -3052, -2316, -3377, - 1123, -65, 2507, 2711, -2096, -2164, -2634, -5215, -3919, 1551, - -47, 1990, 2370, 2025, -2401, 4833, -3879, -162, -3081, 501, - -510, 2744, -907, 253, -1746, -2520, 3418, -1461, 2140, 2507, - 135, 1457, 3195, -1277, -2558, -66, 10850, -1633, -1051, -3436, - -1617, 1438, -1231, -1744, 696, -348, 3434, 2121, -1629, -2460, - -4065, 1159, -1288, 2843, 697, -862, 4, 966, -444, -1860, - 1450, 6426, 5544, 1456, -2826, -1303, -2778, -1278, -6656, -3241, - -7083, 2234, 204, 1753, 803, 499, 1641, 87, 1471, -1325, - 398, 2983, 4340, -1382, 735, -600, -4671, -254, 2327, -1008, - -144, -1453, -1806, -1669, 395, -3285, -1803, -2119, 1232, 2914, - 1480, 8610, 1788, 2644, 1359, 3783, -110, -1339, -1337, -3427, - -630, -1189, -2560, 976, 483, -2744, -3653, -1289, 2910, -2437, - 3171, 1479, 157, 823, 4631, -1910, 3736, -424, -155, -5470, - -741, 3829, -2794, -55, -1447, -3469, -1947, 2914, -61, -3430, - 3544, -1867, 2986, 1009, -1051, 725, 2933, 2926, 5849, 257, - -2666, 6286, -2282, -2998, -2576, -975, -3655, -1867, -5040, -1440, - 3542, -603, 4806, -2808, -1633, 1388, 1149, -1616, -1851, 2122, - 4477, 2485, 1376, 721, 2174, -3072, 1378, -2574, -37, 1322, - -1646, -3612, 4443, 1612, -3403, 711, 132, 119, -227, 5059, - 2892, 840, 5462, -3471, -1340, 2097, 143, 1750, -3052, -1932, - -6352, -4166, -645, 4317, 633, 3681, 2811, 2346, 2374, -2999, - -1265, -210, 5115, 4652, 1305, 3704, -1456, -307, -457, -1455, - -3580, 674, 2215, 2458, -3021, -66, 2535, -652, 1226, 685, - 875, -1753, -1164, -609, 3444, 563, 3826, 1607, 3798, 1385, - 3902, -1990, -4078, -2509 -}; - -const Word16 AmpCB1_NB_fx[640] = -{//Q13 - -1355, 185, -222, -221, 1976, 3119, 540, 1333, -3646, -2511, - -979, 1664, 2087, 951, 787, -1687, -855, 1594, 1264, -4990, - -1957, -215, -850, 1369, -113, 2541, -2904, 743, 634, -657, - -3438, -2047, 706, 85, -596, -50, 212, 944, 118, 1380, - -1203, -78, -213, -1811, -781, -1970, 6607, -2971, 147, -1483, - 38, 5607, 5222, -4567, -4040, -2259, -3110, -2120, 932, -236, - -1052, 1039, -872, 334, -919, 2761, 3320, -5828, 53, 1063, - -1064, -75, -1015, -2137, -722, 565, 629, 1961, -454, 866, - -888, 2652, 1996, -2170, -885, 3325, -645, -1898, -984, -643, - -1008, 2472, 2400, -3708, -2408, -1051, 2029, 1357, -636, -470, - -1307, 655, 663, 29, 892, -95, -91, -2966, -1610, 2657, - -2175, -3170, -3799, -3065, 1130, 1351, 3814, 2791, 1478, 1520, - -1326, -520, -692, 899, 1979, -397, -407, 450, -569, -611, - -1228, 864, 2549, 3067, -2511, -4737, -2701, -304, 680, 1426, - -1070, -19, -1582, -2813, -1832, 3010, 250, -613, 3390, -171, - -1450, -417, -773, -651, -405, -2304, -780, 6656, -3270, -1322, - 70, 5105, 3202, -83, -925, -458, 1203, -1582, -4158, -3630, - -1702, -849, -55, -986, -1963, -1140, -1942, 3347, 3526, -435, - -1429, -2089, -1620, -1271, 2851, 2184, -2472, 3216, 2885, -2922, - -1217, 86, -186, -279, -746, 1288, 3016, -651, -2719, 317, - -1307, -127, -1110, 1389, 212, 1783, 2619, -1718, 1795, -4086, - -1295, 743, 301, -1823, -223, -651, -1774, -405, 1687, 2031, - -865, 1059, -391, 505, -2739, -2773, 16, -2960, 3071, 3325, - -791, 2301, 435, 107, -4039, 801, -1224, 1854, -1039, 507, - -518, 997, 837, 3311, 506, 1026, -232, -1920, -3904, 406, - -1857, -529, -776, -700, -663, -1520, 1699, 814, 2084, -477, - -1341, -1123, -2564, -2784, 2457, 3223, -959, 385, -1864, 3754, - -1351, -1347, -2229, -2882, -1061, -1499, -3028, 3302, 2250, 5539, - -957, -340, 27, 1508, 167, -3513, 1689, 2577, -1810, -516, - -1061, 2171, 1774, 2031, 923, -1933, -1640, -2881, 859, -834, - 408, 2462, 2073, 2107, -2671, 1140, -3497, -2497, 2984, -2707, - -1762, -2524, -2196, 279, -2580, 477, 2306, 4645, 693, -909, - -1089, 1952, 3034, -1790, 786, -1149, -3117, 3605, -1933, -1886, - -959, 934, 246, -2177, -2440, 1356, 871, 3472, 2558, -4512, - -782, 1262, 893, 1979, 2386, -1809, -4357, -392, -1928, 1576, - -1751, -327, -1018, -617, -2370, -2910, 4230, -90, -1361, 3596, - -1069, -315, -162, -339, -313, 33, 4684, 2811, -2717, -3684, - 695, 4567, -745, -2311, -776, -2600, -827, -1040, -997, 2480, - -1549, -748, -622, -260, 1460, 1116, -302, -2529, 2156, -42, - -1318, -568, -266, -446, -2212, 2690, -4669, 5325, -2022, 1358, - -1312, 2293, 1528, 706, 970, -291, 383, -683, -1532, -1843, - -1379, 845, 1218, 395, -1884, 14, 676, -1711, 795, 290, - -742, 386, -435, 411, 1311, 549, -4181, -4922, 1497, 4465, - -1722, -699, -1958, -4126, -3727, -655, 1553, 1793, 4933, 3055, - -1260, -618, 535, -2008, 3802, -3784, 2527, -833, 193, -1062, - -866, 823, 1562, 147, -623, -1808, -1099, 694, -577, 745, - -2282, -4139, -3171, 76, 25, -1077, 477, 545, 6081, 3244, - -1332, -785, 98, -1681, -3603, -3937, 524, 4648, 1114, 2547, - -1145, 407, 2030, 3120, -1739, -513, -518, 1325, -1700, -2860, - -1427, 520, -1040, -792, -366, -2174, -522, -240, 5660, -3163, - -1449, -1653, -1507, 581, 1338, -2627, -1863, 1831, 1301, 2106, - -1252, 974, 199, 68, -69, -869, 864, 2373, -5818, 2873, - 26, 972, 359, -561, -390, 376, 225, 517, 649, -1767, - -653, 2167, 882, -698, 214, -4084, -4134, 2092, 2798, -523, - -1002, 486, 648, -1082, 404, -1490, 1560, -4984, 5614, -1441, - -1024, -311, 427, 356, -2342, 215, -2312, 445, -2378, 5111, - -568, 85, 1328, 1847, 3506, 1183, -2521, -2070, -794, -1881, - -485, 1121, 1242, 1301, -4365, -2222, 2602, -387, 1498, -1344, - -1272, -1365, -2207, -213, -1877, 2858, 849, -915, 333, 2488, - -2019, -2048, -1461, -1930, -1409, -400, 490, -2222, 1276, 7305, - -1530, -1741, -2663, 3159, 1162, -1490, 1516, -1498, 1222, 838, - 1325, 5387, 3888, 1944, -1706, -2890, -1905, -3901, -3207, 206, - -1411, -959, -292, -396, -1547, -84, -4405, -1073, 5532, 1796, - 3160, 48, -2339, -5884, -184, -52, 129, 5398, 378, -321 -}; - -const Word16 AmpCB2_NB_fx[64 * (NUM_ERB_NB - 13)] = -{//Q13 - -2681, -4389, -4270, -4727, -239, 1938, 1748, 2311, 4300, -3957, - -1299, 3487, 1595, -377, 295, -1193, -1588, 2112, -1573, -6362, - -504, 1796, -2521, -68, 1322, 1223, 2263, -503, -3906, 3686, - -3899, -139, 2086, 48, 349, 547, -6387, 1340, -1467, -1062, - -193, 1325, -1190, 2394, 1671, -1982, -2597, -390, -1504, 2271, - -379, -2350, 4071, 70, -955, -883, -1770, -1065, -2443, -1779, - -1101, -661, 6325, 1871, -2673, 3596, 3773, -681, 3340, -1418, - 701, -4253, -3931, -1840, -2388, -2677, -3545, -41, 3675, 3843, - 2198, -1713, -324, 599, 1323, 1827, -4909, -1668, 616, 2608, - 360, -1769, -5263, -1278, 3490, 1935, 1355, -1298, 952, 1801, - 449, 251, -1021, -3666, 479, 3497, 1542, -2234, -3414, -4483, - -5785, 1406, 1207, 2984, 1767, 3262, -799, -3124, 5237, 460, - 2007, -1525, -2106, -770, 546, 137, 401, -1308, 969, 204, - -1626, -589, -4257, 1744, 2836, 2383, 2740, -423, 3166, 1920, - -690, -3000, -4489, 2523, -6693, -5135, -739, -1919, 1228, 2354, - 3340, 1902, 1069, -3185, -2614, 2764, -212, -2061, -1377, 698, - 3694, -125, -954, -4132, -404, 4297, 1294, 1765, 2446, -2287, - -1387, -14, 508, 1149, 9, -437, 519, -420, 450, -751, - -1632, -1391, -2208, -1955, -1170, 4818, 1112, 1086, -782, 1337, - 846, -3434, 569, 1721, -776, -2723, 1207, 982, -1432, -887, - 315, -3031, 3452, 765, -1263, -2146, 2959, -2619, 1507, 1312, - 4087, 3125, 1637, -1402, -45, -3193, 1397, -2611, -3641, -2478, - -1706, 588, 199, 3721, 1217, -1249, -1196, 7228, 996, 879, - -1339, 11, -971, -1680, 716, -39, 233, 1945, 1548, -1476, - 550, -2277, 307, 7413, 2094, -1631, -569, -1351, -198, -483, - -515, -1347, -212, -2649, -519, 195, 2944, -795, 1470, 654, - -1448, 3156, 1369, 3966, 3382, -2782, -4255, -1157, -212, 392, - 861, 5064, 4740, -2513, -3413, -552, -2298, -575, 1130, 1178, - 1568, 4591, 1238, 367, 1626, 600, -5889, 163, -3742, -3650, - -3911, 716, 919, -1501, 55, 1807, 3801, -5571, -4635, 1225, - 3211, 3804, 1491, -906, 100, 404, -1742, -1878, -2140, 1651, - 1640, 3976, -3432, -1149, 1365, 2042, 392, 768, -1534, 1096, - 3811, -211, -2067, -1315, -4167, 1145, -2747, -149, 5296, -735, - 438, 56, -404, -159, -2164, -959, 3492, -690, -688, -1081, - 2762, -1191, 654, 2051, -2144, -3210, -1823, 743, 686, -751, - 2483, 160, 1279, 3246, 1874, 2488, 1192, -5977, -478, 120, - -349, -65, -2350, -222, -1678, -3584, 1114, 3269, 1462, -1114, - -138, 2360, -2762, 720, -3822, 2523, 216, 1170, 4398, -4229, - -1850, 1272, 383, 1736, -383, -1295, 85, -132, 1133, 1505, - 1467, -2389, -2175, 4028, -2752, 241, -4353, -2103, -562, 817, - 3959, 5471, 1941, -1598, -2349, 201, 1412, -796, 2791, -4226, - 3227, -1992, -159, -159, 4085, -1549, 1020, -2179, -776, -2088, - -147, -42, 1880, -1029, 4982, -2056, 111, 1420, 2141, 302, - -2574, -986, -477, -3697, -2349, -2064, -335, -220, 5857, 57, - -7, -5407, -546, -353, 2866, 137, -136, 3508, 992, -2059, - -2034, -1127, -189, -300, -2153, 3606, 2523, -3727, 1526, -3797, - 2134, 4352, -920, -459, 2722, 1784, -71, -3030, -877, 1967, - -1645, -4432, 512, 39, 1757, 2875, -947, 1842, 1365, 1500, - 851, 594, -2892, -404, 3327, -3078, -1575, -1258, -973, -191, - -390, 45, 627, -227, 1624, -143, 215, 2157, 4846, 5335, - 3397, -199, -4443, -3091, -283, -216, 1237, -1478, -5639, -775, - 525, 2107, 2469, 2934, -255, 2438, 824, 5973, -1820, -1330, - -1202, -2433, 900, 650, -5654, 2891, -1539, -453, 1662, 231, - -145, 1661, 741, -332, 1221, 1809, 943, 4831, -1588, -4619, - 65, -790, -985, -893, 3374, 3148, 289, 2947, -4980, -661, - -427, 1441, 7696, 158, -1914, -2069, -1717, -418, 2657, 4219, - 1505, -1096, 601, -1466, -1754, -479, -159, 3378, 5252, 5060, - 4001, 1301, 420, -1268, -2813, -4196 -}; - -const Word16 PowerCB_WB_fx[128] = /* Q11 */ -{ - -3371, -1712, - -170, 350, - -638, -939, - 56, 1074, - -1559, -626, - 200, 344, - -397, 238, - 284, 1415, - -1323, -1880, - -544, 1170, - -619, -255, - 587, 974, - -1262, -98, - 327, 151, - 41, -302, - 941, 1876, - -2257, -1233, - 28, 202, - -520, -561, - 338, 1048, - -1080, -495, - 190, 582, - -284, -24, - 578, 1585, - -1324, -1089, - -71, 568, - -471, -26, - 1140, 909, - -856, -128, - 425, 740, - 140, 12, - 1595, 1891, - -2176, -2310, - -308, 541, - -315, -859, - -80, 1314, - -1782, 510, - 403, 450, - -607, 582, - 145, 1837, - -920, -1386, - -225, 872, - -395, -258, - 829, 981, - -945, 345, - 643, 241, - -56, -23, - 1211, 1482, - -1793, -1459, - 40, 400, - -239, -471, - 532, 1238, - -774, -516, - 244, 831, - -157, 152, - 576, 2287, - -928, -844, - 41, 759, - -161, -198, - 873, 1353, - -640, 105, - 695, 623, - 364, -184, - 1238, 2446 -}; - -const Word16 PowerCB_NB_fx[128] = /* Q11 */ -{ - -3349, -2784, - -784, 385, - -891, -562, - 126, 915, - -1518, -1438, - 304, 53, - -314, -447, - 687, 1219, - -2585, -1807, - -65, 153, - -1219, -337, - 497, 700, - -894, -1051, - 161, 451, - -46, -516, - 987, 1519, - -2277, -2303, - -354, 445, - -532, -540, - 5, 1271, - -1047, -1433, - 672, -225, - -335, -75, - 1007, 1056, - -1362, -1879, - -93, 367, - -468, -259, - 1800, -290, - -1118, -793, - 412, 472, - -9, -197, - 1471, 1634, - -2627, -2847, - -269, 164, - -689, -373, - 432, 940, - -1601, -839, - 311, 271, - -212, -251, - 543, 1714, - -2014, -1336, - 109, 241, - -789, -110, - 729, 888, - -418, -1277, - 256, 674, - 218, -217, - 1027, 2065, - -1769, -2293, - -276, 853, - -360, -764, - 376, 1247, - -1274, -1122, - 602, 272, - -133, -32, - 1374, 1118, - -1860, -1795, - -23, 620, - -525, 60, - 1070, 548, - -691, -799, - 701, 572, - 81, 18, - 1949, 2120 -}; - - -const Word16 sinc_fx[8][12] = /* sinc for warp/extrapolate, in Q14 */ -{ - {0,0,0,0,0,16384,0,0,0,0,0,0,}, - {-388,484,-638,939,-1773,15966,2281,-1063,694,-514,409,-339,}, - {-701,868,-1134,1639,-2949,14751,4917,-2106,1341,-982,776,-640,}, - {-895,1101,-1427,2029,-3503,12849,7709,-2964,1835,-1328,1042,-856,}, - {-947,1159,-1489,2086,-3476,10430,10430,-3476,2086,-1489,1159,-947,}, - {-856,1042,-1328,1835,-2964,7709,12849,-3503,2029,-1427,1101,-895,}, - {-640,776,-982,1341,-2106,4917,14751,-2949,1639,-1134,868,-701,}, - {-339,409,-514,694,-1063,2281,15966,-1773,939,-638,484,-388,}, -}; -/*----------------------------------------------------------------------------------* - * Highrate SWB BWE tables - *----------------------------------------------------------------------------------*/ -const Word16 overlap_coefs_48kHz_fx[NSV_OVERLAP*WIDTH_BAND] = /* in Q15 */ -{ - 9830, 11141, 11796, 12780, 13763, 14418, 15073, 15565, 16056, 16712, 17695, 18678, 20316, 23593, 27197, 31130 -}; - -const Word16 overlap_coefs_fx[NSV_OVERLAP*WIDTH_BAND] = /* in Q15 */ -{ - 8847, 10027, 10617, 11502, 12386, 12976, 13566, 14008, 14451, 15041, 15925, 16810, 18285, 21234, 24478, 28017 -}; - - -const Word16 swb_hr_env_code1_fx[NUM_ENVLOPE_CODE_HR1 * 2] = /* in Q9 */ -{ - 23, 21, 268, 240, 344, 310, 504, 438, - 629, 580, 856, 734, 1305, 1209, 1637, 1693, - 1321, 2671, 2154, 3709, 1801, 890, 2243, 1410, - 2436, 2404, 3496, 3127, 2279, 5187, 3715, 6394, - 3435, 1000, 3381, 1894, 5434, 1299, 4806, 2171, - 3645, 4240, 4640, 3628, 4567, 4999, 5785, 6023, - 6032, 3010, 7194, 4949, 5735, 4609, 7391, 6777, - 7341, 1999, 10276, 2220, 9270, 4210, 11444, 4917, - 3708, 8481, 6030, 9814, 5694, 7913, 7457, 8888, - 9124, 6090, 8943, 7832, 10925, 6889, 10519, 8768, - 4637, 11437, 5754, 14762, 6791, 12873, 8317, 14468, - 7818, 11028, 8696, 12646, 10031, 11617, 10315, 13255, - 9112, 9960, 10901, 10336, 12338, 9772, 12090, 11543, - 12125, 8360, 13766, 9934, 13317, 8004, 14817, 8315, - 12848, 6332, 14189, 6791, 14505, 5289, 15684, 6580, - 12940, 3143, 14948, 3698, 16472, 2570, 16373, 4851 -}; - -const Word16 swb_hr_env_code2_fx[NUM_ENVLOPE_CODE_HR2 * 2] = /* in Q9 */ -{ - 262, 242, 686, 568, 1303, 901, 1600, 1559, - 2505, 1905, 2053, 2944, 2617, 1108, 3414, 1993, - 4329, 1409, 5695, 1801, 3391, 3052, 4384, 2562, - 4567, 3985, 5509, 3051, 6374, 4280, 7003, 5750, - 7000, 2794, 8434, 2006, 10706, 3294, 13034, 4412, - 8402, 3878, 9510, 5269, 11309, 6406, 10839, 8811, - 2701, 4927, 4656, 5773, 6116, 7956, 8474, 7704, - 3255, 8984, 6818, 11144, 3915, 13367, 1255, 16350 -}; - -const Word16 swb_hr_env_code3_fx[NUM_ENVLOPE_CODE_HR_TR*N_BANDS_TRANS_BWE_HR] = /* in Q9 */ -{ - 409, 347, 898, 622, 1457, 1033, 2242, 1012, - 3039, 1508, 2017, 2161, 4137, 1348, 3881, 2553, - 2538, 5306, 3962, 4430, 4730, 3610, 5225, 2877, - 5450, 2240, 5970, 1779, 5553, 1364, 6003, 838 -}; -const Word32 thren_HQ_fx[39] = -{//Q14 - 1805811328, - 1276901376, - 902905664, - 638450688, - 451452832, - 319225344, - 225726416, - 159612672, - 112863208, - 79806336, - 56431604, - 39903168, - 28215802, - 19951584, - 14107901, - 9975792, - 7053950, - 4987896, - 3526975, - 2493948, - 1763487, - 1246974, - 881743, - 623487, - 440871, - 311743, - 220435, - 155871, - 110217, - 77935, - 55108, - 38967, - 27554, - 19483, - 13777, - 9741, - 6888, - 4870, - 3444, -}; - -/*----------------------------------------------------------------------------------* - * ACELP/HQ core switching - *----------------------------------------------------------------------------------*/ - -/* short filters for BWE of ACELP->HQ switching frame */ -const Word16 hp12800_16000_fx[21] = -{//Q15 - -0, 70, -207, 380, -405, 0, 1041, -2668, 4505, - -5968, 6526, -5968, 4505, -2668, 1041, 0, -405, 380, - -207, 70, -0 -}; - -const Word16 hp12800_32000_fx[41] = -{//Q15 - -0, 45, 35, -47, -104, 0, 191, 156, - -203, -422, -0, 675, 523, -656, -1341, 0, - 2264, 1943, -2999, -9872, 19678, -9872, -2999, 1943, - 2264, 0, -1341, -656, 523, 675, -0, -422, - -203, 156, 191, 0, -104, -47, 35, 45, -0 -}; - -const Word16 hp12800_48000_fx[61] =//Q15 -{ - -0, 22, 33, 23, -10, -51, -69, -37, 45, 127, - 140, 40, -136, -271, -238, 0, 326, 507, 349, -143, - -696, -894, -450, 535, 1509, 1696, 521, -1998, -5136, -7735, - 24039, -7735, -5136, -1998, 521, 1696, 1509, 535, -450, -894, - -696, -143, 349, 507, 326, 0, -238, -271, -136, 40, - 140, 127, 45, -37, -69, -51, -10, 23, 33, 22, -0, -}; - -const Word16 hp16000_32000_fx[33] =//Q15 -{ - -0, 62, -0, -127, -0, 270, -0, -523, -0, 940, - -0, -1662, -0, 3212, -0, -10353, 16407, -10353, -0, 3212, - -0, -1662, -0, 940, -0, -523, -0, 270, -0, -127, - -0, 62, -0 -}; - -const Word16 hp16000_48000_fx[49] =//Q15 -{ - -0, 33, 39, -0, -64, -83, -0, 138, 175, 0, - -272, -334, -0, 493, 596, 0, -870, -1059, -0, 1636, - 2120, 0, -4448, -9003, 21858, -9003, -4448, 0, 2120, 1636, - -0, -1059, -870, 0, 596, 493, -0, -334, -272, 0, - 175, 138, -0, -83, -64, -0, 39, 33, -0 -}; - -const Word16 ct2[7][13] = -{ - /* accepted configurations */ - /*input 12.8, output :*/ - /*8*/ {30, 22, 30, 16, 25, 30, 19, 30, 30, 0, 8, 4, 15}, - /*16*/ {25, 22, 19, 16, 16, 0, 0, 0, 12, 1, 4, 4, 15}, - /*32*/ {19, 16, 19, 16, 16, 0, 0, 0, 6, 2, 2, 4, 15}, - /*48*/ {17, 14, 15, 16, 16, 0, 0, 0, 4, 3, 4, 4, 15}, - - /*input 16, output :*/ - /*12*/ { 9, 3, 4, 5, 9, 0, 0, 0, 5, 0, 5, 5, 4}, - /*32*/ { 4, 4, 4, 4, 4, 0, 0, 0, 2, 1, 1, 4, 4}, - /*48*/ {18, 18, 18, 18, 18, 0, 0, 0, 5, 2, 1, 4, 15}, -}; // Q0 -const Word16 ct2_fx[7][14] = -{ - /* accepted configurations */ - /*input 12.8, output : fout/fin Q13*/ - /*8*/ {30, 22, 30, 16, 25, 30, 19, 30, 30, 0, 8, 4, 15, 5120}, - /*16*/ {25, 22, 19, 16, 16, 0, 0, 0, 12, 1, 4, 4, 15, 10240}, - /*32*/ {19, 16, 19, 16, 16, 0, 0, 0, 6, 2, 2, 4, 15, 20480}, - /*48*/ {17, 14, 15, 16, 16, 0, 0, 0, 4, 3, 4, 4, 15, 30720}, - - /*input 16, output :*/ - /*12*/ { 9, 3, 4, 5, 9, 0, 0, 0, 5, 0, 5, 5, 4, 6554}, - /*32*/ { 4, 4, 4, 4, 4, 0, 0, 0, 2, 1, 1, 4, 4, 16384}, - /*48*/ {18, 18, 18, 18, 18, 0, 0, 0, 5, 2, 1, 4, 15, 24576}, -}; - -const Word16 cu15_fx[28][3] = /*Q13*/ -{ - /* xx/3, xx*xx/3, xx*xx*xx/3 xx v */ - /* 0:*/ { 182, 12, 1 }, /* 1/15 */ - /* 1:*/ { 364, 49, 6 }, /* 2/15 */ - /* 2:*/ { 546, 109, 22 }, /* 3/15 */ - /* 3:*/ { 728, 194, 52 }, /* 4/15 */ - /* 4:*/ { 910, 303, 101 }, /* 5/15 */ - /* 5:*/ { 1092, 437, 175 }, /* 6/15 */ - /* 6:*/ { 1274, 595, 278 }, /* 7/15 */ - /* 7:*/ { 1456, 777, 414 }, /* 8/15 */ - /* 8:*/ { 1638, 983, 590 }, /* 9/15 */ - /* 9:*/ { 1820, 1214, 809 }, /* 10/15 */ - /*10:*/ { 2002, 1468, 1077 }, /* 11/15 */ - /*11:*/ { 2185, 1748, 1398 }, /* 12/15 */ - /*12:*/ { 2367, 2051, 1778 }, /* 13/15 */ - /*13:*/ { 2549, 2379, 2220 }, /* 14/15 */ - /*14:*/ { 2913, 3107, 3314 }, /* 16/15 */ - /*15:*/ { 3095, 3507, 3975 }, /* 17/15 */ - /*16:*/ { 3277, 3932, 4719 }, /* 18/15 */ - /*17:*/ { 3459, 4381, 5550 }, /* 19/15 */ - /*18:*/ { 3641, 4855, 6473 }, /* 20/15 */ - /*19:*/ { 3823, 5352, 7493 }, /* 21/15 */ - /*20:*/ { 4005, 5874, 8615 }, /* 22/15 */ - /*21:*/ { 4187, 6420, 9844 }, /* 23/15 */ - /*22:*/ { 4369, 6991, 11185 }, /* 24/15 */ - /*23:*/ { 4551, 7585, 12642 }, /* 25/15 */ - /*24:*/ { 4733, 8204, 14221 }, /* 26/15 */ - /*25:*/ { 4915, 8847, 15925 }, /* 27/15 */ - /*26:*/ { 5097, 9515, 17761 }, /* 28/15 */ - /*27:*/ { 5279, 10207, 19733 }, /* 29/15 */ -}; - -const Word16 cu4_fx[6][3] = /*Q13*/ -{ - /* xx/3, xx*xx/3, xx*xx*xx/3 xx v */ - /* 0:*/ { 683, 171, 43 }, /* 1/4 */ - /* 1:*/ { 1365, 683, 341 }, /* 2/4 */ - /* 2:*/ { 2048, 1536, 1152 }, /* 3/4 */ - /* 3:*/ { 3413, 4267, 5333 }, /* 5/4 */ - /* 4:*/ { 4096, 6144, 9216 }, /* 6/4 */ - /* 5:*/ { 4779, 8363, 14635 }, /* 7/4 */ -}; - - -/*----------------------------------------------------------------------------------* - * hp filter for filtering random part of excitation in frame error concealment - * Used in lib_dec\syn_bfi.c - *----------------------------------------------------------------------------------*/ - -const Word16 h_high_fx[5] = { -410, -3572, 25602, -3572, -410 };//Q15 - -const Word16 sincos_t_rad3_fx[T_SIN_PI_2 + 1] = -{//Q15 - 0, 134, 268, 402, 536, 670, 804, 938, - 1072, 1206, 1340, 1474, 1608, 1742, 1876, 2009, - 2143, 2277, 2411, 2544, 2678, 2811, 2945, 3078, - 3212, 3345, 3479, 3612, 3745, 3878, 4011, 4144, - 4277, 4410, 4543, 4675, 4808, 4941, 5073, 5205, - 5338, 5470, 5602, 5734, 5866, 5998, 6130, 6261, - 6393, 6524, 6655, 6787, 6918, 7049, 7180, 7310, - 7441, 7571, 7702, 7832, 7962, 8092, 8222, 8351, - 8481, 8610, 8740, 8869, 8998, 9127, 9255, 9384, - 9512, 9640, 9768, 9896, 10024, 10151, 10279, 10406, - 10533, 10660, 10786, 10913, 11039, 11165, 11291, 11417, - 11543, 11668, 11793, 11918, 12043, 12167, 12292, 12416, - 12540, 12664, 12787, 12910, 13033, 13156, 13279, 13401, - 13524, 13646, 13767, 13889, 14010, 14131, 14252, 14373, - 14493, 14613, 14733, 14852, 14972, 15091, 15210, 15328, - 15447, 15565, 15683, 15800, 15917, 16035, 16151, 16268, - 16384, 16500, 16616, 16731, 16846, 16961, 17075, 17190, - 17304, 17417, 17531, 17644, 17757, 17869, 17981, 18093, - 18205, 18316, 18427, 18538, 18648, 18758, 18868, 18978, - 19087, 19195, 19304, 19412, 19520, 19627, 19735, 19841, - 19948, 20054, 20160, 20265, 20371, 20475, 20580, 20684, - 20788, 20891, 20994, 21097, 21199, 21301, 21403, 21504, - 21605, 21706, 21806, 21906, 22006, 22105, 22204, 22302, - 22400, 22498, 22595, 22692, 22788, 22884, 22980, 23076, - 23170, 23265, 23359, 23453, 23546, 23640, 23732, 23824, - 23916, 24008, 24099, 24189, 24279, 24369, 24459, 24548, - 24636, 24724, 24812, 24900, 24986, 25073, 25159, 25245, - 25330, 25415, 25499, 25583, 25667, 25750, 25833, 25915, - 25997, 26078, 26159, 26239, 26320, 26399, 26478, 26557, - 26635, 26713, 26791, 26868, 26944, 27020, 27096, 27171, - 27246, 27320, 27394, 27467, 27540, 27612, 27684, 27756, - 27827, 27897, 27967, 28037, 28106, 28175, 28243, 28311, - 28378, 28445, 28511, 28577, 28642, 28707, 28771, 28835, - 28899, 28962, 29024, 29086, 29148, 29209, 29269, 29329, - 29389, 29448, 29506, 29564, 29622, 29679, 29736, 29792, - 29847, 29902, 29957, 30011, 30064, 30118, 30170, 30222, - 30274, 30325, 30375, 30425, 30475, 30524, 30572, 30620, - 30668, 30715, 30761, 30807, 30853, 30897, 30942, 30986, - 31029, 31072, 31114, 31156, 31197, 31238, 31278, 31318, - 31357, 31396, 31434, 31471, 31508, 31545, 31581, 31617, - 31651, 31686, 31720, 31753, 31786, 31818, 31850, 31881, - 31912, 31942, 31972, 32001, 32029, 32058, 32085, 32112, - 32138, 32164, 32190, 32214, 32239, 32262, 32286, 32308, - 32330, 32352, 32373, 32393, 32413, 32433, 32452, 32470, - 32488, 32505, 32522, 32538, 32553, 32568, 32583, 32597, - 32610, 32623, 32635, 32647, 32658, 32669, 32679, 32689, - 32698, 32706, 32714, 32722, 32729, 32735, 32741, 32746, - 32750, 32755, 32758, 32761, 32764, 32766, 32767, 32767, - 32767 -}; - -/*----------------------------------------------------------------------------------* - * TCX - *----------------------------------------------------------------------------------*/ - -const Word16 gain_corr_fac[3] = { 0x4155, 0x40A9, 0x4055 }; /* pow(10, 2^(-n-2)/28) (1Q14) */ -const Word16 gain_corr_inv_fac[3] = { 0x7D67, 0x7EB2, 0x7F59 }; /* pow(10,-2^(-n-2)/28) (0Q15) */ - -const Word16 inter4_2tcx2[4][4] = -{ - { 7620/*0.2325402f Q15*/, 17528/*0.5349195f Q15*/, 7620/*0.2325402f Q15*/, 0/*0.0000000f Q15*/ }, - { 4434/*0.1353017f Q15*/, 16694/*0.5094465f Q15*/, 11141/*0.3400065f Q15*/, 500/*0.0152453f Q15*/ }, - { 1995/*0.0608774f Q15*/, 14389/*0.4391226f Q15*/, 14389/*0.4391226f Q15*/, 1995/*0.0608774f Q15*/ }, - { 500/*0.0152453f Q15*/, 11141/*0.3400065f Q15*/, 16694/*0.5094465f Q15*/, 4434/*0.1353017f Q15*/ } -}; -const Word16 inter6_2tcx2[6][4] = -{ - { 7345/*0.2241379f Q15*/, 18079/*0.5517241f Q15*/, 7345/*0.2241379f Q15*/, 0/*0.0000000f Q15*/ }, - { 5119/*0.1562044f Q15*/, 17657/*0.5388595f Q15*/, 9798/*0.2990011f Q15*/, 194/*0.0059349f Q15*/ }, - { 3249/*0.0991379f Q15*/, 16444/*0.5018346f Q15*/, 12288/*0.3750000f Q15*/, 787/*0.0240275f Q15*/ }, - { 1800/*0.0549361f Q15*/, 14584/*0.4450639f Q15*/, 14584/*0.4450639f Q15*/, 1800/*0.0549361f Q15*/ }, - { 787/*0.0240275f Q15*/, 12288/*0.3750000f Q15*/, 16444/*0.5018346f Q15*/, 3249/*0.0991379f Q15*/ }, - { 194/*0.0059349f Q15*/, 9798/*0.2990011f Q15*/, 17657/*0.5388595f Q15*/, 5119/*0.1562044f Q15*/ } -}; - -const Word16 inter_core_12_8kHz_output_8kHz[] = -{ - 17528/*0.5349196f Q15*/, 16694/*0.5094466f Q15*/, 14389/*0.4391227f Q15*/, 11141/*0.3400065f Q15*/, - 7620/*0.2325402f Q15*/, 4434/*0.1353016f Q15*/, 1995/*0.0608773f Q15*/, 500/*0.0152453f Q15*/, - 0/*0.0000000f Q15*/ -}; -const Word16 inter_core_12_8kHz_output_16kHz[] = -{ - 14023/*0.4279357f Q15*/, 13592/*0.4147958f Q15*/, 12367/*0.3774199f Q15*/, 10533/*0.3214508f Q15*/, - 8350/*0.2548195f Q15*/, 6096/*0.1860321f Q15*/, 4017/*0.1225801f Q15*/, 2291/*0.0699165f Q15*/, - 1023/*0.0312127f Q15*/, 256/*0.0078047f Q15*/, 0/*0.0000000f Q15*/, 0/*0.0000000f Q15*/, - 0/*0.0000000f Q15*/ -}; -const Word16 inter_core_12_8kHz_output_32kHz[] = -{ - 7011/*0.2139679f Q15*/, 6957/*0.2123089f Q15*/, 6796/*0.2073979f Q15*/, 6535/*0.1994284f Q15*/, - 6184/*0.1887100f Q15*/, 5756/*0.1756491f Q15*/, 5267/*0.1607254f Q15*/, 4734/*0.1444646f Q15*/, - 4175/*0.1274097f Q15*/, 3608/*0.1100939f Q15*/, 3048/*0.0930161f Q15*/, 2511/*0.0766219f Q15*/, - 2008/*0.0612900f Q15*/, 1551/*0.0473253f Q15*/, 1146/*0.0349583f Q15*/, 798/*0.0243509f Q15*/, - 511/*0.0156063f Q15*/, 288/*0.0087817f Q15*/, 128/*0.0039024f Q15*/, 32/*0.0009753f Q15*/, - 0/*0.0000000f Q15*/ -}; -const Word16 inter_core_12_8kHz_output_48kHz[] = -{ - 4674/*0.1426452f Q15*/, 4658/*0.1421528f Q15*/, 4610/*0.1406841f Q15*/, 4531/*0.1382653f Q15*/, - 4422/*0.1349386f Q15*/, 4285/*0.1307618f Q15*/, 4122/*0.1258066f Q15*/, 3937/*0.1201564f Q15*/, - 3732/*0.1139041f Q15*/, 3511/*0.1071503f Q15*/, 3277/*0.1000000f Q15*/, 3033/*0.0925607f Q15*/, - 2783/*0.0849398f Q15*/, 2531/*0.0772420f Q15*/, 2280/*0.0695677f Q15*/, 2032/*0.0620107f Q15*/, - 1791/*0.0546572f Q15*/, 1559/*0.0475844f Q15*/, 1339/*0.0408600f Q15*/, 1132/*0.0345417f Q15*/, - 940/*0.0286774f Q15*/, 764/*0.0233055f Q15*/, 605/*0.0184558f Q15*/, 464/*0.0141503f Q15*/, - 341/*0.0104042f Q15*/, 237/*0.0072274f Q15*/, 152/*0.0046257f Q15*/, 85/*0.0026016f Q15*/, - 38/*0.0011560f Q15*/, 9/*0.0002890f Q15*/, 0/*0.0000000f Q15*/, 0/*0.0000000f Q15*/, - 0/*0.0000000f Q15*/ -}; -const Word16 inter_core_16kHz_output_8kHz[] = -{ - 18079/*0.5517241f Q15*/, 17657/*0.5388595f Q15*/, 16444/*0.5018346f Q15*/, 14584/*0.4450639f Q15*/, 12288/*0.3750000f Q15*/, 9798/*0.2990011f Q15*/, - 7345/*0.2241379f Q15*/, 5119/*0.1562044f Q15*/, 3249/*0.0991379f Q15*/, 1800/*0.0549361f Q15*/, 787/*0.0240275f Q15*/, 194/*0.0059349f Q15*/, - 0/*0.0000000f Q15*/ -}; -const Word16 inter_core_16kHz_output_16kHz[] = -{ - 18079/*0.5517241f Q15*/, 17657/*0.5388595f Q15*/, 16444/*0.5018346f Q15*/, 14584/*0.4450639f Q15*/, 12288/*0.3750000f Q15*/, 9798/*0.2990011f Q15*/, - 7345/*0.2241379f Q15*/, 5119/*0.1562044f Q15*/, 3249/*0.0991379f Q15*/, 1800/*0.0549361f Q15*/, 787/*0.0240275f Q15*/, 194/*0.0059349f Q15*/, - 0/*0.0000000f Q15*/ -}; -const Word16 inter_core_16kHz_output_32kHz[] = -{ - 9039/*0.2758621f Q15*/, 8986/*0.2742414f Q15*/, 8829/*0.2694298f Q15*/, 8571/*0.2615753f Q15*/, 8222/*0.2509173f Q15*/, 7791/*0.2377748f Q15*/, - 7292/*0.2225320f Q15*/, 6738/*0.2056203f Q15*/, 6144/*0.1875000f Q15*/, 5526/*0.1686403f Q15*/, 4899/*0.1495006f Q15*/, 4277/*0.1305132f Q15*/, - 3672/*0.1120690f Q15*/, 3097/*0.0945060f Q15*/, 2559/*0.0781022f Q15*/, 2067/*0.0630725f Q15*/, 1624/*0.0495690f Q15*/, 1235/*0.0376861f Q15*/, - 900/*0.0274680f Q15*/, 620/*0.0189188f Q15*/, 394/*0.0120137f Q15*/, 220/*0.0067120f Q15*/, 97/*0.0029675f Q15*/, 24/*0.0007394f Q15*/, - 0/*0.0000000f Q15*/ -}; -const Word16 inter_core_16kHz_output_48kHz[] = -{ - 6026/*0.1839080f Q15*/, 6011/*0.1834272f Q15*/, 5963/*0.1819912f Q15*/, 5886/*0.1796198f Q15*/, 5778/*0.1763457f Q15*/, 5643/*0.1722133f Q15*/, - 5481/*0.1672782f Q15*/, 5296/*0.1616061f Q15*/, 5088/*0.1552712f Q15*/, 4861/*0.1483546f Q15*/, 4618/*0.1409433f Q15*/, 4362/*0.1331275f Q15*/, - 4096/*0.1250000f Q15*/, 3823/*0.1166535f Q15*/, 3545/*0.1081796f Q15*/, 3266/*0.0996670f Q15*/, 2988/*0.0912002f Q15*/, 2715/*0.0828579f Q15*/, - 2448/*0.0747126f Q15*/, 2190/*0.0668293f Q15*/, 1942/*0.0592649f Q15*/, 1706/*0.0520681f Q15*/, 1484/*0.0452794f Q15*/, 1276/*0.0389306f Q15*/, - 1083/*0.0330460f Q15*/, 906/*0.0276422f Q15*/, 745/*0.0227295f Q15*/, 600/*0.0183120f Q15*/, 472/*0.0143894f Q15*/, 359/*0.0109575f Q15*/, - 262/*0.0080092f Q15*/, 181/*0.0055360f Q15*/, 116/*0.0035286f Q15*/, 65/*0.0019783f Q15*/, 29/*0.0008771f Q15*/, 7/*0.0002189f Q15*/, - 0/*0.0000000f Q15*/ -}; -const Word16 inter_core_25_6kHz_output_8kHz[] = -{ - 17528/*0.5349196f Q15*/, 16694/*0.5094466f Q15*/, 14389/*0.4391227f Q15*/, 11141/*0.3400065f Q15*/, - 7620/*0.2325402f Q15*/, 4434/*0.1353016f Q15*/, 1995/*0.0608773f Q15*/, 500/*0.0152453f Q15*/, - 0/*0.0000000f Q15*/ -}; -const Word16 inter_core_25_6kHz_output_16kHz[] = -{ - 17528/*0.5349196f Q15*/, 16694/*0.5094466f Q15*/, 14389/*0.4391227f Q15*/, 11141/*0.3400065f Q15*/, - 7620/*0.2325402f Q15*/, 4434/*0.1353016f Q15*/, 1995/*0.0608773f Q15*/, 500/*0.0152453f Q15*/, - 0/*0.0000000f Q15*/ -}; -const Word16 inter_core_25_6kHz_output_32kHz[] = -{ - 14023/*0.4279357f Q15*/, 13592/*0.4147958f Q15*/, 12367/*0.3774199f Q15*/, 10533/*0.3214508f Q15*/, - 8350/*0.2548195f Q15*/, 6096/*0.1860321f Q15*/, 4017/*0.1225801f Q15*/, 2291/*0.0699165f Q15*/, - 1023/*0.0312127f Q15*/, 256/*0.0078047f Q15*/, 0/*0.0000000f Q15*/, 0/*0.0000000f Q15*/, - 0/*0.0000000f Q15*/ -}; -const Word16 inter_core_25_6kHz_output_48kHz[] = -{ - 9349/*0.2852965f Q15*/, 9220/*0.2813740f Q15*/, 8843/*0.2698819f Q15*/, 8245/*0.2516166f Q15*/, - 7465/*0.2278099f Q15*/, 6554/*0.2000000f Q15*/, 5567/*0.1698781f Q15*/, 4559/*0.1391327f Q15*/, - 3582/*0.1093111f Q15*/, 2678/*0.0817166f Q15*/, 1879/*0.0573517f Q15*/, 1209/*0.0369093f Q15*/, - 682/*0.0208069f Q15*/, 303/*0.0092505f Q15*/, 76/*0.0023118f Q15*/, 0/*0.0000000f Q15*/, - 0/*0.0000000f Q15*/ -}; - -const TCX_LTP_FILTER tcxLtpFilters[12] = -{ - { inter_core_12_8kHz_output_8kHz, 2 }, - { inter_core_12_8kHz_output_16kHz, 3 }, - { inter_core_12_8kHz_output_32kHz, 5 }, - { inter_core_12_8kHz_output_48kHz, 8 }, - { inter_core_16kHz_output_8kHz, 2 }, - { inter_core_16kHz_output_16kHz, 2 }, - { inter_core_16kHz_output_32kHz, 4 }, - { inter_core_16kHz_output_48kHz, 6 }, - { inter_core_25_6kHz_output_8kHz, 2 }, - { inter_core_25_6kHz_output_16kHz, 2 }, - { inter_core_25_6kHz_output_32kHz, 3 }, - { inter_core_25_6kHz_output_48kHz, 4 }, -}; - - - -const SCALE_TCX_SETUP scaleTcxTable[SIZE_SCALE_TABLE_TCX] = -{ - { 0, 0, 8000, /* 0.67f ,*/ 21955/*0.67f Q15*/ }, - { 0, 8000, 9600, /* 0.70f ,*/ 22938/*0.70f Q15*/ }, - { 0, 9600, 13200, /* 0.76f ,*/ 24904/*0.76f Q15*/ }, - { 0, 13200, 16400, /* 0.86f ,*/ 28180/*0.86f Q15*/ }, - { 0, 16400, 24400, /* 0.90f ,*/ 29491/*0.90f Q15*/ }, - { 0, 24400, 64000, /* 0.96f ,*/ 31457/*0.96f Q15*/ }, - { 1, 0, 8000, /* 1.f ,*/ 32767/*1.f Q15*/ }, - { 1, 8000, 9600, /* 1.f ,*/ 32767/*1.f Q15*/ }, - { 1, 9600, 13200, /* 1.f ,*/ 32767/*1.f Q15*/ }, - { 1, 13200, 16400, /* 0.85f ,*/ 27853/*0.85f Q15*/ }, - { 1, 16400, 24400, /* 0.88f ,*/ 28836/*0.88f Q15*/ }, - { 1, 24400, 32000, /* 0.90f ,*/ 29491/*0.90f Q15*/ }, - { 1, 32000, 32400, /* 0.95f ,*/ 31130/*0.95f Q15*/ }, -}; - - -/*----------------------------------------------------------------------------------* - * Arithmetic coder - *----------------------------------------------------------------------------------*/ - -const UWord8 ari_lookup_s17_LC[4096] = // Q0 -{ - 0x01,0x04,0x29,0x13,0x0A,0x0D,0x05,0x10, - 0x10,0x0D,0x00,0x0D,0x2A,0x2A,0x22,0x25, - 0x25,0x28,0x2B,0x2E,0x31,0x34,0x34,0x0E, - 0x21,0x21,0x21,0x36,0x38,0x38,0x36,0x10, - 0x10,0x08,0x09,0x0B,0x0C,0x0E,0x0E,0x21, - 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x10, - 0x10,0x1A,0x09,0x1D,0x0C,0x20,0x20,0x21, - 0x36,0x36,0x36,0x36,0x36,0x0A,0x36,0x16, - 0x1A,0x1A,0x2D,0x0C,0x20,0x20,0x21,0x21, - 0x21,0x36,0x38,0x38,0x38,0x38,0x36,0x16, - 0x16,0x1A,0x3F,0x1F,0x20,0x21,0x24,0x06, - 0x36,0x36,0x36,0x38,0x00,0x0A,0x36,0x22, - 0x3E,0x3E,0x3F,0x30,0x20,0x21,0x06,0x06, - 0x06,0x38,0x36,0x36,0x36,0x26,0x36,0x1C, - 0x1C,0x3E,0x3F,0x02,0x20,0x21,0x06,0x36, - 0x36,0x38,0x0A,0x0A,0x0A,0x0A,0x05,0x16, - 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, - 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, - 0x16,0x3F,0x3F,0x0E,0x35,0x14,0x38,0x38, - 0x05,0x05,0x05,0x0D,0x13,0x13,0x1C,0x16, - 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, - 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, - 0x3F,0x3F,0x3F,0x20,0x35,0x14,0x27,0x38, - 0x38,0x0A,0x2A,0x2A,0x2A,0x16,0x05,0x10, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x3F,0x02,0x0E,0x02,0x14,0x13,0x0A, - 0x0D,0x0D,0x0D,0x13,0x00,0x00,0x16,0x19, - 0x19,0x3F,0x3F,0x02,0x02,0x14,0x38,0x36, - 0x0A,0x0A,0x0A,0x0D,0x0D,0x0D,0x1C,0x22, - 0x22,0x3F,0x3F,0x02,0x17,0x26,0x26,0x1C, - 0x1C,0x10,0x16,0x16,0x16,0x19,0x22,0x25, - 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, - 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, - 0x39,0x39,0x15,0x2C,0x2E,0x2E,0x2E,0x31, - 0x31,0x31,0x31,0x31,0x31,0x31,0x34,0x39, - 0x39,0x39,0x15,0x2C,0x2E,0x2E,0x0C,0x34, - 0x34,0x34,0x36,0x36,0x36,0x36,0x36,0x36, - 0x36,0x39,0x15,0x3C,0x2E,0x31,0x34,0x34, - 0x31,0x31,0x31,0x1F,0x1E,0x1E,0x1E,0x1E, - 0x1E,0x39,0x28,0x2C,0x2E,0x31,0x37,0x34, - 0x01,0x01,0x01,0x01,0x01,0x00,0x39,0x39, - 0x39,0x39,0x39,0x2C,0x2E,0x31,0x1E,0x34, - 0x34,0x35,0x01,0x01,0x01,0x01,0x01,0x01, - 0x01,0x39,0x39,0x3C,0x2E,0x03,0x07,0x34, - 0x34,0x0F,0x39,0x39,0x39,0x39,0x39,0x39, - 0x39,0x39,0x39,0x15,0x2B,0x31,0x1E,0x34, - 0x34,0x01,0x39,0x39,0x39,0x39,0x39,0x39, - 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, - 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, - 0x39,0x39,0x39,0x2C,0x39,0x2F,0x2E,0x2E, - 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E, - 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E, - 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E, - 0x2E,0x39,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, - 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, - 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, - 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, - 0x1E,0x1E,0x1E,0x1E,0x1E,0x0F,0x2E,0x2E, - 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E, - 0x2E,0x2E,0x39,0x15,0x39,0x39,0x39,0x39, - 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, - 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, - 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, - 0x19,0x1C,0x16,0x22,0x22,0x25,0x25,0x25, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x3E,0x3E,0x2F,0x3D,0x21,0x36,0x38,0x05, - 0x0D,0x0D,0x0D,0x10,0x16,0x16,0x16,0x25, - 0x2D,0x2D,0x37,0x3D,0x33,0x38,0x05,0x0D, - 0x0D,0x10,0x16,0x16,0x16,0x16,0x16,0x25, - 0x2F,0x2F,0x30,0x12,0x06,0x05,0x0A,0x0D, - 0x0D,0x10,0x16,0x16,0x16,0x22,0x22,0x25, - 0x1F,0x1F,0x32,0x3B,0x29,0x0A,0x0A,0x10, - 0x16,0x16,0x16,0x16,0x22,0x22,0x22,0x25, - 0x02,0x02,0x14,0x29,0x05,0x0D,0x2A,0x10, - 0x16,0x16,0x16,0x22,0x22,0x22,0x22,0x25, - 0x35,0x35,0x14,0x29,0x0A,0x2A,0x2A,0x10, - 0x16,0x16,0x16,0x22,0x22,0x22,0x22,0x25, - 0x17,0x17,0x26,0x05,0x0D,0x10,0x10,0x16, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x25, - 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, - 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, - 0x26,0x26,0x26,0x1C,0x0D,0x16,0x16,0x16, - 0x22,0x22,0x22,0x22,0x22,0x22,0x25,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x26,0x1C,0x1C,0x10,0x16,0x16,0x22, - 0x22,0x22,0x22,0x22,0x22,0x25,0x25,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x1C,0x1C,0x1C,0x16,0x16,0x16,0x22, - 0x22,0x22,0x22,0x25,0x25,0x25,0x25,0x00, - 0x00,0x26,0x1C,0x1C,0x16,0x16,0x16,0x22, - 0x22,0x22,0x22,0x25,0x25,0x25,0x25,0x00, - 0x16,0x16,0x16,0x16,0x16,0x22,0x22,0x22, - 0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x00, - 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, - 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, - 0x15,0x15,0x3C,0x1E,0x0F,0x06,0x27,0x2A, - 0x2A,0x10,0x16,0x16,0x16,0x16,0x16,0x22, - 0x2C,0x2C,0x0B,0x37,0x23,0x27,0x13,0x2A, - 0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x22, - 0x1B,0x1B,0x1D,0x0F,0x24,0x13,0x13,0x2A, - 0x00,0x10,0x16,0x16,0x16,0x16,0x16,0x22, - 0x1F,0x1F,0x03,0x24,0x07,0x0A,0x0A,0x10, - 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x22, - 0x22,0x35,0x06,0x27,0x13,0x2A,0x2A,0x10, - 0x16,0x16,0x16,0x16,0x16,0x22,0x22,0x22, - 0x22,0x06,0x27,0x27,0x13,0x2A,0x2A,0x10, - 0x16,0x16,0x16,0x16,0x16,0x16,0x22,0x22, - 0x22,0x05,0x0A,0x2A,0x2A,0x10,0x10,0x16, - 0x16,0x16,0x16,0x16,0x16,0x22,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, - 0x22,0x0D,0x2A,0x10,0x10,0x10,0x10,0x16, - 0x16,0x16,0x16,0x16,0x16,0x22,0x22,0x25, - 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, - 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, - 0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x16, - 0x16,0x16,0x16,0x22,0x22,0x22,0x22,0x25, - 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, - 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, - 0x10,0x10,0x10,0x10,0x16,0x16,0x16,0x16, - 0x16,0x22,0x22,0x22,0x22,0x22,0x22,0x25, - 0x0D,0x0D,0x10,0x10,0x10,0x16,0x16,0x16, - 0x16,0x22,0x22,0x22,0x22,0x22,0x22,0x25, - 0x0D,0x0D,0x0D,0x0D,0x0D,0x10,0x10,0x16, - 0x16,0x16,0x16,0x22,0x22,0x22,0x22,0x25, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x11,0x11,0x3A,0x11,0x11,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x3A,0x11, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x11,0x3A,0x3A,0x3A,0x11, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x18, - 0x00,0x11,0x3A,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x11,0x11,0x11,0x18,0x18,0x18,0x18, - 0x18,0x25,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x3A,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x3A,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x18,0x18, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x18,0x18, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x18,0x18,0x18,0x18, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x11,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x11,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x11,0x11,0x11,0x3A,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x18,0x3A,0x3A,0x11,0x11,0x11,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x11,0x11,0x11,0x3A,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 0x18,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x11,0x11,0x11,0x11,0x11,0x18, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x11,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x2A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, - 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A -}; - -const UWord16 ari_pk_s17_LC_ext[64][18] = // Q0 -{ - { - 16384, 16368,16337,16231,16143,16115,16059,15916,15793,15710,15586,15472,15367,15302,15201,15107,15020, - 0 - }, - { - 16384, 8983, 8540, 8498, 8485, 4319, 3666, 3594, 3579, 2285, 1908, 1851, 1835, 1326, 1120, 1085, 1074, - 0 - }, - { - 16384, 12022,10039, 9520, 9346, 7347, 5335, 4648, 4382, 3815, 3083, 2728, 2562, 2363, 2050, 1869, 1777, - 0 - }, - { - 16384, 13429,11201,10562,10371, 8231, 5713, 4770, 4441, 3798, 2844, 2359, 2152, 1947, 1614, 1406, 1304, - 0 - }, - { - 16384, 13229,11403,10769,10529, 8415, 6431, 5645, 5311, 4448, 3547, 3176, 3001, 2617, 2181, 1984, 1886, - 0 - }, - { - 16384, 15168,13754,13120,12826,11553, 9705, 8723, 8227, 7675, 6762, 6180, 5842, 5585, 5141, 4816, 4607, - 0 - }, - { - 16384, 14625,12743,12034,11772,10059, 7706, 6652, 6223, 5594, 4594, 4023, 3742, 3501, 3089, 2818, 2664, - 0 - }, - { - 16384, 15275,13679,12951,12652,11158, 8852, 7652, 7121, 6406, 5242, 4542, 4196, 3894, 3398, 3063, 2864, - 0 - }, - { - 16384, 4860, 3338, 3214, 3193, 1428, 676, 571, 547, 356, 222, 189, 180, 139, 102, 89, 84, - 0 - }, - { - 16384, 8357, 5798, 5475, 5410, 3093, 1523, 1227, 1152, 849, 560, 470, 441, 370, 294, 261, 248, - 0 - }, - { - 16384, 15550,14350,13710,13387,12297,10541, 9493, 8929, 8354, 7371, 6696, 6299, 6008, 5491, 5107, 4856, - 0 - }, - { - 16384, 10346, 7298, 6933, 6865, 4052, 1863, 1471, 1381, 1055, 673, 536, 491, 429, 339, 293, 273, - 0 - }, - { - 16384, 11652, 8699, 8030, 7839, 5667, 3460, 2766, 2532, 2093, 1542, 1301, 1203, 1070, 893, 802, 759, - 0 - }, - { - 16384, 15639,14601,14037,13729,12847,11421,10520, 9978, 9521, 8720, 8136, 7750, 7493, 7033, 6676, 6426, - 0 - }, - { - 16384, 12427, 9590, 8715, 8386, 6641, 4708, 3886, 3515, 3071, 2490, 2198, 2052, 1886, 1670, 1549, 1478, - 0 - }, - { - 16384, 13605,10996,10363,10183, 7802, 5032, 4124, 3840, 3267, 2403, 1976, 1804, 1633, 1345, 1171, 1086, - 0 - }, - { - 16384, 15936,15224,14759,14464,13808,12678,11866,11331,10910,10150, 9549, 9122, 8853, 8352, 7938, 7626, - 0 - }, - { - 16384, 16383,16382,14829,14138,14137,14136,12895,12272,10935, 9788, 9082, 8674, 8073, 7508, 7118, 6867, - 0 - }, - { - 16384, 13888,11474,10840,10662, 8335, 5585, 4695, 4411, 3801, 2917, 2506, 2337, 2150, 1847, 1672, 1581, - 0 - }, - { - 16384, 15463,14162,13504,13196,11977,10063, 8978, 8429, 7811, 6768, 6088, 5705, 5406, 4882, 4504, 4266, - 0 - }, - { - 16384, 13764,11941,11367,11151, 9312, 7171, 6301, 5943, 5335, 4430, 3942, 3708, 3466, 3074, 2819, 2679, - 0 - }, - { - 16384, 5179, 3300, 3206, 3197, 1220, 374, 303, 293, 171, 81, 63, 59, 44, 29, 24, 22, - 0 - }, - { - 16384, 16026,15468,15096,14842,14329,13447,12790,12322,11985,11367,10860,10477,10248, 9811, 9443, 9148, - 0 - }, - { - 16384, 12809,11291,10848,10649, 8976, 7199, 6506, 6196, 5657, 4887, 4451, 4219, 3974, 3590, 3365, 3218, - 0 - }, - { - 16384, 16383,16382,15744,15348,15347,15346,14714,14288,13688,13097,12652,12328,11967,11584,11278,11045, - 0 - }, - { - 16384, 15415,14987,14866,14806,13751,13046,12818,12709,12187,11720,11527,11427,11096,10759,10601,10510, - 0 - }, - { - 16384, 5926, 4280, 4090, 4053, 2138, 1120, 947, 903, 632, 413, 353, 334, 264, 198, 174, 166, - 0 - }, - { - 16384, 9206, 6640, 6345, 6291, 3683, 1772, 1423, 1342, 1024, 652, 515, 467, 406, 314, 267, 245, - 0 - }, - { - 16384, 15086,13966,13505,13271,12238,10875,10157, 9763, 9331, 8629, 8155, 7845, 7608, 7198, 6892, 6670, - 0 - }, - { - 16384, 11427, 8599, 8132, 8027, 5406, 3012, 2429, 2270, 1823, 1244, 1006, 920, 814, 654, 564, 524, - 0 - }, - { - 16384, 11561, 8220, 7814, 7737, 4780, 2215, 1731, 1621, 1279, 830, 657, 599, 532, 424, 366, 339, - 0 - }, - { - 16384, 11649, 9374, 8867, 8724, 6398, 4154, 3470, 3253, 2718, 2010, 1695, 1570, 1412, 1172, 1042, 980, - 0 - }, - { - 16384, 13021,10503, 9726, 9443, 7520, 5271, 4369, 4016, 3495, 2741, 2365, 2181, 1990, 1719, 1561, 1478, - 0 - }, - { - 16384, 13815,11388,10605,10316, 8467, 6133, 5175, 4782, 4255, 3466, 3063, 2864, 2688, 2408, 2229, 2125, - 0 - }, - { - 16384, 16175,15807,15536,15338,15006,14402,13919,13549,13312,12871,12491,12182,12010,11681,11390,11143, - 0 - }, - { - 16384, 14310,12047,11336,11110, 9065, 6381, 5318, 4938, 4279, 3272, 2732, 2499, 2284, 1920, 1693, 1574, - 0 - }, - { - 16384, 14765,12824,12096,11834,10003, 7429, 6282, 5841, 5145, 4022, 3402, 3123, 2868, 2426, 2150, 2003, - 0 - }, - { - 16384, 16295,16127,15943,15802,15650,15360,15059,14816,14668,14401,14162,13954,13839,13634,13443,13275, - 0 - }, - { - 16384, 14182,12821,12340,12120,10698, 9040, 8284, 7908, 7378, 6549, 6053, 5772, 5520, 5080, 4785, 4597, - 0 - }, - { - 16384, 15164,13583,12892,12600,11161, 8997, 7888, 7386, 6744, 5673, 5015, 4673, 4391, 3898, 3555, 3349, - 0 - }, - { - 16384, 3758, 2571, 2481, 2467, 988, 478, 412, 397, 245, 154, 133, 127, 95, 69, 61, 58, - 0 - }, - { - 16384, 14805,13193,12553,12285,10706, 8596, 7623, 7178, 6542, 5563, 4996, 4703, 4426, 3967, 3662, 3482, - 0 - }, - { - 16384, 15787,14870,14320,14005,13147,11705,10747,10171, 9651, 8735, 8068, 7629, 7332, 6785, 6361, 6061, - 0 - }, - { - 16384, 7111, 4622, 4304, 4233, 2346, 1174, 938, 870, 659, 455, 389, 365, 316, 260, 236, 226, - 0 - }, - { - 16384, 7146, 4703, 4532, 4512, 2078, 740, 583, 556, 371, 201, 153, 141, 118, 87, 72, 66, - 0 - }, - { - 16384, 9593, 7184, 6853, 6790, 4144, 2206, 1832, 1745, 1320, 878, 741, 697, 599, 476, 424, 401, - 0 - }, - { - 16384, 9209, 5969, 5479, 5351, 3346, 1763, 1382, 1261, 1017, 733, 622, 578, 520, 446, 410, 392, - 0 - }, - { - 16384, 11324, 8681, 8252, 8159, 5450, 3114, 2606, 2473, 1987, 1412, 1211, 1142, 1017, 847, 765, 730, - 0 - }, - { - 16384, 12663,10073, 9527, 9392, 6827, 4204, 3489, 3286, 2713, 1966, 1666, 1554, 1400, 1172, 1051, 994, - 0 - }, - { - 16384, 10413, 7096, 6340, 6115, 4393, 2704, 2156, 1947, 1634, 1254, 1091, 1010, 925, 805, 742, 707, - 0 - }, - { - 16384, 13337,11073,10477,10306, 8045, 5534, 4705, 4438, 3804, 2942, 2530, 2360, 2164, 1850, 1668, 1574, - 0 - }, - { - 16384, 14323,12104,11391,11156, 9183, 6649, 5649, 5287, 4676, 3778, 3302, 3089, 2886, 2548, 2341, 2223, - 0 - }, - { - 16384, 11646, 8435, 7504, 7150, 5603, 3882, 3170, 2853, 2487, 2029, 1791, 1666, 1549, 1386, 1288, 1231, - 0 - }, - { - 16384, 13147,11339,10752,10524, 8775, 6682, 5776, 5398, 4813, 3908, 3406, 3154, 2933, 2554, 2310, 2176, - 0 - }, - { - 16384, 14551,12495,11707,11356, 9962, 8005, 7006, 6500, 6034, 5298, 4839, 4575, 4381, 4057, 3825, 3673, - 0 - }, - { - 16384, 12395, 9526, 9032, 8925, 6130, 3448, 2813, 2649, 2144, 1489, 1231, 1142, 1020, 836, 738, 694, - 0 - }, - { - 16384, 14921,13187,12475,12164,10758, 8775, 7752, 7257, 6727, 5864, 5306, 5004, 4777, 4393, 4119, 3942, - 0 - }, - { - 16384, 2151, 1301, 1276, 1274, 315, 84, 70, 68, 32, 14, 11, 10, 7, 4, 3, 2, - 0 - }, - { - 16384, 16383,16382,13774,13091,13090,13089,11287,10713, 7917, 6052, 5265, 4947, 4161, 3534, 3199, 3039, - 0 - }, - { - 16384, 14374,12331,11688,11474, 9505, 6993, 5998, 5634, 4991, 4008, 3498, 3265, 3036, 2658, 2417, 2285, - 0 - }, - { - 16384, 8798, 5867, 5626, 5593, 2841, 1038, 807, 765, 538, 302, 234, 215, 182, 139, 119, 111, - 0 - }, - { - 16384, 13325,10612,10015, 9860, 7343, 4583, 3802, 3571, 3023, 2269, 1945, 1817, 1670, 1440, 1309, 1243, - 0 - }, - { - 16384, 7741, 5790, 5571, 5528, 3110, 1698, 1464, 1409, 1034, 704, 613, 585, 487, 381, 342, 327, - 0 - }, - { - 16384, 9664, 7506, 7059, 6917, 4820, 3136, 2640, 2455, 2000, 1504, 1297, 1217, 1073, 896, 815, 777, - 0 - } -}; - -const Word16 NumRatioBits[2][17] = -{ - /* NB */ - { - 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 - }, - - /* WB */ - { - 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2 - } -}; // Q0 - -/* 7Q8 */ -const Word16 Ratios_WB_2_fx[32] = -/* 2 */{ 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 6144, 6656, 7168, 7680, 8192, 8704, 9216, 9728, 10240, 15360, 16384, 18432 }; -const Word16 Ratios_WB_3_fx[32] =/* 7Q8 */ -/* 3 */{ 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3584, 4096, 4608, 5120, 5632, 6144, 6656, 7168, 7680, 8192, 8704, 9216, 9728, 10240, 11264, 12288, 13824, 15360, 17408, 19968, 20480 }; -const Word16 Ratios_WB_4_fx[32] =/* 7Q8 */ -/* 4 */{ 384, 512, 640, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3584, 4096, 4608, 5120, 5632, 6144, 6656, 7168, 7680, 8192, 8704, 9216, 9728, 10240, 10752, 11264, 12288, 13312, 13824, 17408 }; -const Word16 Ratios_WB_5_fx[32] =/* 7Q8 */ -/* 5 */{ 256, 384, 512, 640, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4608, 5120, 5632, 6144, 6656, 7168, 7680, 8192, 8704, 9216, 10240, 11264, 12288, 13824 }; -const Word16 Ratios_WB_6_fx[32] =/* 7Q8 */ -/* 6 */{ 256, 384, 512, 640, 768, 896, 1024, 1152, 1280, 1408, 1536, 1664, 1792, 1920, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4608, 5120, 5632, 6144, 6656, 7168, 8704, 10240, 10496 }; -const Word16 Ratios_WB_7_fx[32] =/* 7Q8 */ -/* 7 */{ 256, 384, 512, 640, 768, 896, 1024, 1152, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5760, 6144, 6400, 6912, 7168, 7680, 8960 }; -const Word16 Ratios_WB_8_fx[16] =/* 7Q8 */ -/* 8 */{ 128, 256, 384, 512, 640, 768, 896, 1024, 1152, 1280, 1408, 1536, 1792, 2048, 2304, 2560 }; -const Word16 Ratios_WB_9_fx[16] =/* 7Q8 */ -/* 9 */{ 256, 512, 640, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3840, 4096, 4608, 6912 }; -const Word16 Ratios_WB_10_fx[16] =/* 7Q8 */ -/* 10 */{ 256, 384, 512, 640, 768, 896, 1024, 1280, 1536, 2048, 2560, 3840, 4608, 5632, 6144, 6656 }; -const Word16 Ratios_WB_11_fx[16] =/* 7Q8 */ -/* 11 */{ 256, 384, 512, 640, 768, 896, 1024, 1280, 1536, 2048, 2560, 3072, 3328, 3584, 4608, 5376 }; -const Word16 Ratios_WB_12_fx[16] =/* 7Q8 */ -/* 12 */{ 128, 256, 384, 512, 640, 768, 1024, 1280, 1536, 2048, 2304, 2816, 3072, 3456, 4096, 5120 }; -const Word16 Ratios_WB_13_fx[16] =/* 7Q8 */ -/* 13 */{ 128, 256, 384, 512, 640, 768, 1024, 1280, 1536, 1792, 2048, 2560, 2816, 3072, 3584, 5120 }; -const Word16 Ratios_WB_14_fx[16] =/* 7Q8 */ -/* 14 */{ 128, 256, 384, 512, 640, 768, 1024, 1152, 1536, 1920, 2304, 2560, 3072, 3584, 3840, 4608 }; -const Word16 Ratios_WB_15_fx[16] =/* 7Q8 */ -/* 15 */{ 128, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1152, 1280, 1536, 2048, 2304, 3584 }; -const Word16 Ratios_WB_16_fx[4] =/* 7Q8 */ -/* 16 */{ 128, 256, 512, 1024 }; -const Word16 Ratios_WB_17_fx[4] =/* 7Q8 */ -/* 17 */{ 256, 384, 512, 1024 }; -const Word16 Ratios_WB_18_fx[4] =/* 7Q8 */ -/* 18 */{ 256, 512, 768, 1024 }; - -/******************************************************************************/ - -/* 7Q8 */ -const Word16 Ratios_NB_2_fx[32] = -/* 2 */{ 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 5888, 6144, 6400, 6656, 6912, 7168, 7680, 8192, 8704, 9216, 9728, 10240 }; -const Word16 Ratios_NB_3_fx[16] =/* 7Q8 */ -/* 3 */{ 128, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 4096, 5120, 6144, 7680 }; -const Word16 Ratios_NB_4_fx[16] =/* 7Q8 */ -/* 4 */{ 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3584, 4096, 4608, 5120, 6144, 7680 }; -const Word16 Ratios_NB_5_fx[16] =/* 7Q8 */ -/* 5 */{ 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3584, 4096, 4608, 5120, 6144, 7680 }; -const Word16 Ratios_NB_6_fx[16] =/* 7Q8 */ -/* 6 */{ 512, 640, 768, 896, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3584, 4096, 4608, 5120 }; -const Word16 Ratios_NB_7_fx[16] =/* 7Q8 */ -/* 7 */{ 256, 512, 640, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3584, 4096, 4608, 5120 }; -const Word16 Ratios_NB_8_fx[16] =/* 7Q8 */ -/* 8 */{ 256, 384, 512, 640, 768, 896, 1024, 1152, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 4096 }; -const Word16 Ratios_NB_9_fx[8] =/* 7Q8 */ -/* 9 */{ 256, 512, 768, 1024, 1280, 1536, 2048, 2560 }; -const Word16 Ratios_NB_10_fx[8] =/* 7Q8 */ -/* 10 */{ 256, 512, 768, 1024, 1280, 1536, 2048, 2560 }; -const Word16 Ratios_NB_11_fx[8] =/* 7Q8 */ -/* 11 */{ 256, 384, 512, 768, 1024, 1280, 1536, 2048 }; -const Word16 Ratios_NB_12_fx[8] =/* 7Q8 */ -/* 12 */{ 256, 512, 640, 768, 1024, 1280, 1536, 2048 }; -const Word16 Ratios_NB_13_fx[4] =/* 7Q8 */ -/* 13 */{ 256, 512, 768, 1024 }; -const Word16 Ratios_NB_14_fx[4] =/* 7Q8 */ -/* 14 */{ 256, 512, 1024, 1536 }; -const Word16 Ratios_NB_15_fx[4] =/* 7Q8 */ -/* 15 */{ 256, 512, 768, 1024 }; -const Word16 Ratios_NB_16_fx[4] =/* 7Q8 */ -/* 16 */{ 256, 384, 512, 1024 }; -const Word16 Ratios_NB_17_fx[4] =/* 7Q8 */ -/* 17 */{ 256, 384, 512, 768 }; -const Word16 Ratios_NB_18_fx[4] =/* 7Q8 */ -/* 18 */{ 128, 256, 512, 768 }; - -/******************************************************************************/ - -const Word16 *const Ratios_fx[2][17] =/* 7Q8 */ -{ - /* NB */ - { - Ratios_NB_2_fx, - Ratios_NB_3_fx, - Ratios_NB_4_fx, - Ratios_NB_5_fx, - Ratios_NB_6_fx, - Ratios_NB_7_fx, - Ratios_NB_8_fx, - Ratios_NB_9_fx, - Ratios_NB_10_fx, - Ratios_NB_11_fx, - Ratios_NB_12_fx, - Ratios_NB_13_fx, - Ratios_NB_14_fx, - Ratios_NB_15_fx - , Ratios_NB_16_fx - , Ratios_NB_17_fx - , Ratios_NB_18_fx - }, - - /* WB */ - { - Ratios_WB_2_fx, - Ratios_WB_3_fx, - Ratios_WB_4_fx, - Ratios_WB_5_fx, - Ratios_WB_6_fx, - Ratios_WB_7_fx, - Ratios_WB_8_fx, - Ratios_WB_9_fx, - Ratios_WB_10_fx, - Ratios_WB_11_fx, - Ratios_WB_12_fx, - Ratios_WB_13_fx, - Ratios_WB_14_fx, - Ratios_WB_15_fx - , Ratios_WB_16_fx - , Ratios_WB_17_fx - , Ratios_WB_18_fx - } -}; -#define QGC(x) FL2WORD16_SCALE(x, 4) -const Word16 qGains[2][1 << kTcxHmNumGainBits] = -{ - /* GC */ { QGC(0.75f) }, - /* VC */ { QGC(0.6f), QGC(1.4f), QGC(4.5f), QGC(10.0f) } -}; - - -/*----------------------------------------------------------------------------------* - * TNS - *----------------------------------------------------------------------------------*/ - -const struct TnsParameters tnsParametersIGF32kHz_LowBR[1] = -{ - { 600, 3, /*1.85f, 0.075f, 4.4f,*/ 237/*1.85f Q7*/, 2458/*0.075f Q15*/,563 /*4.4f Q7*/ } -}; - -const struct TnsParameters tnsParameters32kHz[2] = -{ - { 4500, 3, /*1.35f, 0.0300f, 1.0f ,*/ 173/*1.35f Q7*/, 983/*0.0300f Q15*/, 128/*1.0f Q7*/}, - { 600, 1, /*1.75f, 0.0625f, 4.4f ,*/ 224/*1.75f Q7*/, 2048/*0.0625f Q15*/, 563 /*4.4f Q7*/ } -}; - -const struct TnsParameters tnsParameters32kHz_grouped[2] = -{ - { 8400, 3, /*1.375f, 0.03125f, 1.0f ,*/ 176/*1.375f Q7*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/ }, - { 800, 3, /*1.375f, 0.03125f, 1.0f ,*/ 176/*1.375f Q7*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/} -}; - -const struct TnsParameters tnsParameters16kHz[1] = -{ - { 600, 3, /*1.5f, 0.05f, 4.4f,*/ 192/*1.5f Q7*/, 1638/*0.05f Q15*/ ,563 /*4.4f Q7*/ } -}; - -const struct TnsParameters tnsParameters16kHz_grouped[2] = -{ - { 4400, 3, /*1.5f, 0.05f, 1.0f,*/ 192/*1.5f Q7*/, 1638/*0.05f Q15*/ , 128/*1.0f Q7*/}, - { 800, 3, /*1.5f, 0.05f, 1.0f,*/ 192/*1.5f Q7*/, 1638/*0.05f Q15*/ , 128/*1.0f Q7*/} -}; - -const struct TnsParameters tnsParameters48kHz_grouped[2] = -{ - { 10400, 3, /*1.375f, 0.03125f, 1.0f,*/ 176/*1.375f Q7*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/}, - { 800, 3, /*1.375f, 0.03125f, 1.0f,*/ 176/*1.375f Q7*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/ } -}; - -const struct TnsParameters tnsParameters32kHz_Stereo[2]= -{ - { 4500, 3, /*1.35f, 0.0300f, 1.0f ,*/ 173/*1.35f Q7*/, 983/*0.0300f Q15*/ , 128/*1.0f Q7*/}, - { 600, 3, /*1.75f, 0.0625f, 4.4f ,*/ 224/*1.75f Q7*/, 2048/*0.0625f Q15*/ ,563 /*4.4f Q7*/ } -}; - -const Word16 tnsAcfWindow_fx[TNS_MAX_FILTER_ORDER] = -{ - 32696/*0.997803f Q15*/, 32480/*0.991211f Q15*/, 32120/*0.980225f Q15*/, 31616/*0.964844f Q15*/, 30968/*0.945068f Q15*/, 30176/*0.920898f Q15*/, 29240/*0.892334f Q15*/, 28160/*0.859375f Q15*/ -}; - - -/* Definition of the mapping between TNS parameters and a bitstream */ -/* Helper structures for hufmann table coding */ - -const Coding codesTnsCoeff0TCX20[] = -{ - { -8+INDEX_SHIFT, 609, 11 }, /* 01001100001 */ - { -7+INDEX_SHIFT, 305, 10 }, /* 0100110001 */ - { -6+INDEX_SHIFT, 77, 8 }, /* 01001101 */ - { -5+INDEX_SHIFT, 39, 7 }, /* 0100111 */ - { -4+INDEX_SHIFT, 8, 5 }, /* 01000 */ - { -3+INDEX_SHIFT, 21, 5 }, /* 10101 */ - { -2+INDEX_SHIFT, 11, 4 }, /* 1011 */ - { -1+INDEX_SHIFT, 3, 3 }, /* 011 */ - { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ - { 1+INDEX_SHIFT, 0, 2 }, /* 00 */ - { 2+INDEX_SHIFT, 4, 3 }, /* 100 */ - { 3+INDEX_SHIFT, 5, 4 }, /* 0101 */ - { 4+INDEX_SHIFT, 20, 5 }, /* 10100 */ - { 5+INDEX_SHIFT, 18, 6 }, /* 010010 */ - { 6+INDEX_SHIFT, 153, 9 }, /* 010011001 */ - { 7+INDEX_SHIFT, 608, 11 } /* 01001100000 */ -}; - -const Coding codesTnsCoeff0TCX10[] = -{ - { -8+INDEX_SHIFT, 441, 9 }, /* 110111001 */ - { -7+INDEX_SHIFT, 111, 7 }, /* 1101111 */ - { -6+INDEX_SHIFT, 8, 4 }, /* 1000 */ - { -5+INDEX_SHIFT, 9, 4 }, /* 1001 */ - { -4+INDEX_SHIFT, 14, 4 }, /* 1110 */ - { -3+INDEX_SHIFT, 15, 4 }, /* 1111 */ - { -2+INDEX_SHIFT, 3, 3 }, /* 011 */ - { -1+INDEX_SHIFT, 5, 3 }, /* 101 */ - { 0+INDEX_SHIFT, 0, 2 }, /* 00 */ - { 1+INDEX_SHIFT, 2, 3 }, /* 010 */ - { 2+INDEX_SHIFT, 12, 4 }, /* 1100 */ - { 3+INDEX_SHIFT, 26, 5 }, /* 11010 */ - { 4+INDEX_SHIFT, 54, 6 }, /* 110110 */ - { 5+INDEX_SHIFT, 221, 8 }, /* 11011101 */ - { 6+INDEX_SHIFT, 881, 10 }, /* 1101110001 */ - { 7+INDEX_SHIFT, 880, 10 } /* 1101110000 */ -}; - -const Coding codesTnsCoeff1TCX20[] = -{ - { -8+INDEX_SHIFT, 30018, 15 }, /* 111010101000010 */ - { -7+INDEX_SHIFT, 30019, 15 }, /* 111010101000011 */ - { -6+INDEX_SHIFT, 7505, 13 }, /* 1110101010001 */ - { -5+INDEX_SHIFT, 3753, 12 }, /* 111010101001 */ - { -4+INDEX_SHIFT, 939, 10 }, /* 1110101011 */ - { -3+INDEX_SHIFT, 235, 8 }, /* 11101011 */ - { -2+INDEX_SHIFT, 28, 5 }, /* 11100 */ - { -1+INDEX_SHIFT, 6, 3 }, /* 110 */ - { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ - { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ - { 2+INDEX_SHIFT, 15, 4 }, /* 1111 */ - { 3+INDEX_SHIFT, 59, 6 }, /* 111011 */ - { 4+INDEX_SHIFT, 116, 7 }, /* 1110100 */ - { 5+INDEX_SHIFT, 468, 9 }, /* 111010100 */ - { 6+INDEX_SHIFT, 1877, 11 }, /* 11101010101 */ - { 7+INDEX_SHIFT, 15008, 14 } /* 11101010100000 */ -}; - -const Coding codesTnsCoeff1TCX10[] = -{ - { -8+INDEX_SHIFT, 2818, 12 }, /* 101100000010 */ - { -7+INDEX_SHIFT, 2819, 12 }, /* 101100000011 */ - { -6+INDEX_SHIFT, 705, 10 }, /* 1011000001 */ - { -5+INDEX_SHIFT, 353, 9 }, /* 101100001 */ - { -4+INDEX_SHIFT, 177, 8 }, /* 10110001 */ - { -3+INDEX_SHIFT, 45, 6 }, /* 101101 */ - { -2+INDEX_SHIFT, 10, 4 }, /* 1010 */ - { -1+INDEX_SHIFT, 3, 3 }, /* 011 */ - { 0+INDEX_SHIFT, 6, 3 }, /* 110 */ - { 1+INDEX_SHIFT, 0, 2 }, /* 00 */ - { 2+INDEX_SHIFT, 7, 3 }, /* 111 */ - { 3+INDEX_SHIFT, 4, 3 }, /* 100 */ - { 4+INDEX_SHIFT, 2, 3 }, /* 010 */ - { 5+INDEX_SHIFT, 23, 5 }, /* 10111 */ - { 6+INDEX_SHIFT, 89, 7 }, /* 1011001 */ - { 7+INDEX_SHIFT, 1408, 11 } /* 10110000000 */ -}; - -const Coding codesTnsCoeff2TCX20[] = -{ - { -8+INDEX_SHIFT, 13312, 14 }, /* 11010000000000 */ - { -7+INDEX_SHIFT, 13313, 14 }, /* 11010000000001 */ - { -6+INDEX_SHIFT, 3329, 12 }, /* 110100000001 */ - { -5+INDEX_SHIFT, 833, 10 }, /* 1101000001 */ - { -4+INDEX_SHIFT, 209, 8 }, /* 11010001 */ - { -3+INDEX_SHIFT, 53, 6 }, /* 110101 */ - { -2+INDEX_SHIFT, 12, 4 }, /* 1100 */ - { -1+INDEX_SHIFT, 2, 2 }, /* 10 */ - { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ - { 1+INDEX_SHIFT, 7, 3 }, /* 111 */ - { 2+INDEX_SHIFT, 27, 5 }, /* 11011 */ - { 3+INDEX_SHIFT, 105, 7 }, /* 1101001 */ - { 4+INDEX_SHIFT, 417, 9 }, /* 110100001 */ - { 5+INDEX_SHIFT, 1665, 11 }, /* 11010000001 */ - { 6+INDEX_SHIFT, 13314, 14 }, /* 11010000000010 */ - { 7+INDEX_SHIFT, 13315, 14 } /* 11010000000011 */ -}; - -const Coding codesTnsCoeff2TCX10[] = -{ - { -8+INDEX_SHIFT, 512, 12 }, /* 001000000000 */ - { -7+INDEX_SHIFT, 513, 12 }, /* 001000000001 */ - { -6+INDEX_SHIFT, 65, 9 }, /* 001000001 */ - { -5+INDEX_SHIFT, 17, 7 }, /* 0010001 */ - { -4+INDEX_SHIFT, 5, 5 }, /* 00101 */ - { -3+INDEX_SHIFT, 0, 3 }, /* 000 */ - { -2+INDEX_SHIFT, 6, 3 }, /* 110 */ - { -1+INDEX_SHIFT, 1, 2 }, /* 01 */ - { 0+INDEX_SHIFT, 2, 2 }, /* 10 */ - { 1+INDEX_SHIFT, 7, 3 }, /* 111 */ - { 2+INDEX_SHIFT, 3, 4 }, /* 0011 */ - { 3+INDEX_SHIFT, 9, 6 }, /* 001001 */ - { 4+INDEX_SHIFT, 33, 8 }, /* 00100001 */ - { 5+INDEX_SHIFT, 129, 10 }, /* 0010000001 */ - { 6+INDEX_SHIFT, 514, 12 }, /* 001000000010 */ - { 7+INDEX_SHIFT, 515, 12 } /* 001000000011 */ -}; - -const Coding codesTnsCoeff3TCX20[] = -{ - { -8+INDEX_SHIFT, 13318, 14 }, /* 11010000000110 */ - { -7+INDEX_SHIFT, 13319, 14 }, /* 11010000000111 */ - { -6+INDEX_SHIFT, 6656, 13 }, /* 1101000000000 */ - { -5+INDEX_SHIFT, 1665, 11 }, /* 11010000001 */ - { -4+INDEX_SHIFT, 417, 9 }, /* 110100001 */ - { -3+INDEX_SHIFT, 105, 7 }, /* 1101001 */ - { -2+INDEX_SHIFT, 27, 5 }, /* 11011 */ - { -1+INDEX_SHIFT, 7, 3 }, /* 111 */ - { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ - { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ - { 2+INDEX_SHIFT, 12, 4 }, /* 1100 */ - { 3+INDEX_SHIFT, 53, 6 }, /* 110101 */ - { 4+INDEX_SHIFT, 209, 8 }, /* 11010001 */ - { 5+INDEX_SHIFT, 833, 10 }, /* 1101000001 */ - { 6+INDEX_SHIFT, 6657, 13 }, /* 1101000000001 */ - { 7+INDEX_SHIFT, 6658, 13 } /* 1101000000010 */ -}; - -const Coding codesTnsCoeff3TCX10[] = -{ - { -8+INDEX_SHIFT, 1284, 12 }, /* 010100000100 */ - { -7+INDEX_SHIFT, 1285, 12 }, /* 010100000101 */ - { -6+INDEX_SHIFT, 1286, 12 }, /* 010100000110 */ - { -5+INDEX_SHIFT, 1287, 12 }, /* 010100000111 */ - { -4+INDEX_SHIFT, 161, 9 }, /* 010100001 */ - { -3+INDEX_SHIFT, 41, 7 }, /* 0101001 */ - { -2+INDEX_SHIFT, 11, 5 }, /* 01011 */ - { -1+INDEX_SHIFT, 0, 2 }, /* 00 */ - { 0+INDEX_SHIFT, 2, 2 }, /* 10 */ - { 1+INDEX_SHIFT, 3, 2 }, /* 11 */ - { 2+INDEX_SHIFT, 3, 3 }, /* 011 */ - { 3+INDEX_SHIFT, 4, 4 }, /* 0100 */ - { 4+INDEX_SHIFT, 21, 6 }, /* 010101 */ - { 5+INDEX_SHIFT, 81, 8 }, /* 01010001 */ - { 6+INDEX_SHIFT, 640, 11 }, /* 01010000000 */ - { 7+INDEX_SHIFT, 641, 11 } /* 01010000001 */ -}; - -const Coding codesTnsCoeff4TCX20[] = -{ - { -8+INDEX_SHIFT, 13318, 14 }, /* 11010000000110 */ - { -7+INDEX_SHIFT, 13319, 14 }, /* 11010000000111 */ - { -6+INDEX_SHIFT, 6656, 13 }, /* 1101000000000 */ - { -5+INDEX_SHIFT, 833, 10 }, /* 1101000001 */ - { -4+INDEX_SHIFT, 209, 8 }, /* 11010001 */ - { -3+INDEX_SHIFT, 53, 6 }, /* 110101 */ - { -2+INDEX_SHIFT, 12, 4 }, /* 1100 */ - { -1+INDEX_SHIFT, 2, 2 }, /* 10 */ - { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ - { 1+INDEX_SHIFT, 7, 3 }, /* 111 */ - { 2+INDEX_SHIFT, 27, 5 }, /* 11011 */ - { 3+INDEX_SHIFT, 105, 7 }, /* 1101001 */ - { 4+INDEX_SHIFT, 417, 9 }, /* 110100001 */ - { 5+INDEX_SHIFT, 1665, 11 }, /* 11010000001 */ - { 6+INDEX_SHIFT, 6657, 13 }, /* 1101000000001 */ - { 7+INDEX_SHIFT, 6658, 13 } /* 1101000000010 */ -}; - -const Coding codesTnsCoeff4TCX10[] = -{ - { -8+INDEX_SHIFT, 20, 12 }, /* 000000010100 */ - { -7+INDEX_SHIFT, 21, 12 }, /* 000000010101 */ - { -6+INDEX_SHIFT, 22, 12 }, /* 000000010110 */ - { -5+INDEX_SHIFT, 3, 9 }, /* 000000011 */ - { -4+INDEX_SHIFT, 1, 7 }, /* 0000001 */ - { -3+INDEX_SHIFT, 1, 5 }, /* 00001 */ - { -2+INDEX_SHIFT, 1, 3 }, /* 001 */ - { -1+INDEX_SHIFT, 2, 2 }, /* 10 */ - { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ - { 1+INDEX_SHIFT, 1, 2 }, /* 01 */ - { 2+INDEX_SHIFT, 1, 4 }, /* 0001 */ - { 3+INDEX_SHIFT, 1, 6 }, /* 000001 */ - { 4+INDEX_SHIFT, 0, 8 }, /* 00000000 */ - { 5+INDEX_SHIFT, 23, 12 }, /* 000000010111 */ - { 6+INDEX_SHIFT, 8, 11 }, /* 00000001000 */ - { 7+INDEX_SHIFT, 9, 11 } /* 00000001001 */ -}; - -const Coding codesTnsCoeff5[] = -{ - { -8+INDEX_SHIFT, 6788, 13 }, /* 1101010000100 */ - { -7+INDEX_SHIFT, 6789, 13 }, /* 1101010000101 */ - { -6+INDEX_SHIFT, 6790, 13 }, /* 1101010000110 */ - { -5+INDEX_SHIFT, 849, 10 }, /* 1101010001 */ - { -4+INDEX_SHIFT, 213, 8 }, /* 11010101 */ - { -3+INDEX_SHIFT, 107, 7 }, /* 1101011 */ - { -2+INDEX_SHIFT, 27, 5 }, /* 11011 */ - { -1+INDEX_SHIFT, 7, 3 }, /* 111 */ - { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ - { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ - { 2+INDEX_SHIFT, 12, 4 }, /* 1100 */ - { 3+INDEX_SHIFT, 52, 6 }, /* 110100 */ - { 4+INDEX_SHIFT, 425, 9 }, /* 110101001 */ - { 5+INDEX_SHIFT, 6791, 13 }, /* 1101010000111 */ - { 6+INDEX_SHIFT, 3392, 12 }, /* 110101000000 */ - { 7+INDEX_SHIFT, 3393, 12 } /* 110101000001 */ -}; - -const Coding codesTnsCoeff6[] = -{ - { -8+INDEX_SHIFT, 4, 12 }, /* 000000000100 */ - { -7+INDEX_SHIFT, 5, 12 }, /* 000000000101 */ - { -6+INDEX_SHIFT, 6, 12 }, /* 000000000110 */ - { -5+INDEX_SHIFT, 1, 9 }, /* 000000001 */ - { -4+INDEX_SHIFT, 1, 7 }, /* 0000001 */ - { -3+INDEX_SHIFT, 1, 5 }, /* 00001 */ - { -2+INDEX_SHIFT, 1, 3 }, /* 001 */ - { -1+INDEX_SHIFT, 2, 2 }, /* 10 */ - { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ - { 1+INDEX_SHIFT, 1, 2 }, /* 01 */ - { 2+INDEX_SHIFT, 1, 4 }, /* 0001 */ - { 3+INDEX_SHIFT, 1, 6 }, /* 000001 */ - { 4+INDEX_SHIFT, 1, 8 }, /* 00000001 */ - { 5+INDEX_SHIFT, 7, 12 }, /* 000000000111 */ - { 6+INDEX_SHIFT, 0, 11 }, /* 00000000000 */ - { 7+INDEX_SHIFT, 1, 11 } /* 00000000001 */ -}; - -const Coding codesTnsCoeff7[] = -{ - { -8+INDEX_SHIFT, 14, 11 }, /* 00000001110 */ - { -7+INDEX_SHIFT, 15, 11 }, /* 00000001111 */ - { -6+INDEX_SHIFT, 0, 10 }, /* 0000000000 */ - { -5+INDEX_SHIFT, 1, 10 }, /* 0000000001 */ - { -4+INDEX_SHIFT, 1, 7 }, /* 0000001 */ - { -3+INDEX_SHIFT, 1, 5 }, /* 00001 */ - { -2+INDEX_SHIFT, 1, 4 }, /* 0001 */ - { -1+INDEX_SHIFT, 1, 2 }, /* 01 */ - { 0+INDEX_SHIFT, 2, 10 }, /* 0000000010 */ - { 1+INDEX_SHIFT, 1, 1 }, /* 1 */ - { 2+INDEX_SHIFT, 1, 3 }, /* 001 */ - { 3+INDEX_SHIFT, 1, 6 }, /* 000001 */ - { 4+INDEX_SHIFT, 3, 10 }, /* 0000000011 */ - { 5+INDEX_SHIFT, 4, 10 }, /* 0000000100 */ - { 6+INDEX_SHIFT, 5, 10 }, /* 0000000101 */ - { 7+INDEX_SHIFT, 6, 10 } /* 0000000110 */ -}; - -const Coding codesTnsCoeff456[] = -{ - { -8+INDEX_SHIFT, 516, 12 }, /* 001000000100 */ - { -7+INDEX_SHIFT, 517, 12 }, /* 001000000101 */ - { -6+INDEX_SHIFT, 518, 12 }, /* 001000000110 */ - { -5+INDEX_SHIFT, 65, 9 }, /* 001000001 */ - { -4+INDEX_SHIFT, 17, 7 }, /* 0010001 */ - { -3+INDEX_SHIFT, 5, 5 }, /* 00101 */ - { -2+INDEX_SHIFT, 3, 4 }, /* 0011 */ - { -1+INDEX_SHIFT, 1, 2 }, /* 01 */ - { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ - { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ - { 2+INDEX_SHIFT, 0, 3 }, /* 000 */ - { 3+INDEX_SHIFT, 9, 6 }, /* 001001 */ - { 4+INDEX_SHIFT, 33, 8 }, /* 00100001 */ - { 5+INDEX_SHIFT, 519, 12 }, /* 001000000111 */ - { 6+INDEX_SHIFT, 256, 11 }, /* 00100000000 */ - { 7+INDEX_SHIFT, 257, 11 } /* 00100000001 */ -}; - -const Coding codesTnsCoeff0WBTCX20[] = -{ - { -8+INDEX_SHIFT, 225, 10 }, /* 0011100001 */ - { -7+INDEX_SHIFT, 113, 9 }, /* 001110001 */ - { -6+INDEX_SHIFT, 29, 7 }, /* 0011101 */ - { -5+INDEX_SHIFT, 15, 6 }, /* 001111 */ - { -4+INDEX_SHIFT, 2, 4 }, /* 0010 */ - { -3+INDEX_SHIFT, 0, 3 }, /* 000 */ - { -2+INDEX_SHIFT, 13, 4 }, /* 1101 */ - { -1+INDEX_SHIFT, 2, 3 }, /* 010 */ - { 0+INDEX_SHIFT, 5, 3 }, /* 101 */ - { 1+INDEX_SHIFT, 3, 3 }, /* 011 */ - { 2+INDEX_SHIFT, 4, 3 }, /* 100 */ - { 3+INDEX_SHIFT, 7, 3 }, /* 111 */ - { 4+INDEX_SHIFT, 12, 4 }, /* 1100 */ - { 5+INDEX_SHIFT, 6, 5 }, /* 00110 */ - { 6+INDEX_SHIFT, 57, 8 }, /* 00111001 */ - { 7+INDEX_SHIFT, 224, 10 } /* 0011100000 */ -}; - - -const Coding codesTnsCoeff1WBTCX20[] = -{ - { -8+INDEX_SHIFT, 512, 12 }, /* 001000000000 */ - { -7+INDEX_SHIFT, 513, 12 }, /* 001000000001 */ - { -6+INDEX_SHIFT, 514, 12 }, /* 001000000010 */ - { -5+INDEX_SHIFT, 65, 9 }, /* 001000001 */ - { -4+INDEX_SHIFT, 17, 7 }, /* 0010001 */ - { -3+INDEX_SHIFT, 5, 5 }, /* 00101 */ - { -2+INDEX_SHIFT, 0, 3 }, /* 000 */ - { -1+INDEX_SHIFT, 2, 3 }, /* 010 */ - { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ - { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ - { 2+INDEX_SHIFT, 3, 3 }, /* 011 */ - { 3+INDEX_SHIFT, 3, 4 }, /* 0011 */ - { 4+INDEX_SHIFT, 9, 6 }, /* 001001 */ - { 5+INDEX_SHIFT, 33, 8 }, /* 00100001 */ - { 6+INDEX_SHIFT, 129, 10 }, /* 0010000001 */ - { 7+INDEX_SHIFT, 515, 12 } /* 001000000011 */ -}; - - -const Coding codesTnsCoeff2WB[] = -{ - { -8+INDEX_SHIFT, 5632, 13 }, /* 1011000000000 */ - { -7+INDEX_SHIFT, 5633, 13 }, /* 1011000000001 */ - { -6+INDEX_SHIFT, 1409, 11 }, /* 10110000001 */ - { -5+INDEX_SHIFT, 353, 9 }, /* 101100001 */ - { -4+INDEX_SHIFT, 89, 7 }, /* 1011001 */ - { -3+INDEX_SHIFT, 23, 5 }, /* 10111 */ - { -2+INDEX_SHIFT, 4, 3 }, /* 100 */ - { -1+INDEX_SHIFT, 0, 2 }, /* 00 */ - { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ - { 1+INDEX_SHIFT, 1, 2 }, /* 01 */ - { 2+INDEX_SHIFT, 10, 4 }, /* 1010 */ - { 3+INDEX_SHIFT, 45, 6 }, /* 101101 */ - { 4+INDEX_SHIFT, 177, 8 }, /* 10110001 */ - { 5+INDEX_SHIFT, 705, 10 }, /* 1011000001 */ - { 6+INDEX_SHIFT, 5634, 13 }, /* 1011000000010 */ - { 7+INDEX_SHIFT, 5635, 13 } /* 1011000000011 */ -}; - -const Coding codesTnsCoeff3WB[] = -{ - { -8+INDEX_SHIFT, 5638, 13 }, /* 1011000000110 */ - { -7+INDEX_SHIFT, 5639, 13 }, /* 1011000000111 */ - { -6+INDEX_SHIFT, 2816, 12 }, /* 101100000000 */ - { -5+INDEX_SHIFT, 353, 9 }, /* 101100001 */ - { -4+INDEX_SHIFT, 177, 8 }, /* 10110001 */ - { -3+INDEX_SHIFT, 45, 6 }, /* 101101 */ - { -2+INDEX_SHIFT, 10, 4 }, /* 1010 */ - { -1+INDEX_SHIFT, 0, 2 }, /* 00 */ - { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ - { 1+INDEX_SHIFT, 1, 2 }, /* 01 */ - { 2+INDEX_SHIFT, 4, 3 }, /* 100 */ - { 3+INDEX_SHIFT, 23, 5 }, /* 10111 */ - { 4+INDEX_SHIFT, 89, 7 }, /* 1011001 */ - { 5+INDEX_SHIFT, 705, 10 }, /* 1011000001 */ - { 6+INDEX_SHIFT, 2817, 12 }, /* 101100000001 */ - { 7+INDEX_SHIFT, 2818, 12 } /* 101100000010 */ -}; - -const Word16 nTnsCoeffCodes = sizeof(codesTnsCoeff0TCX20)/sizeof(codesTnsCoeff0TCX20[0]); - -const Coding * const codesTnsCoeffSWBTCX20[] = { codesTnsCoeff0TCX20, codesTnsCoeff1TCX20, codesTnsCoeff2TCX20, codesTnsCoeff3TCX20, codesTnsCoeff4TCX20, codesTnsCoeff5, codesTnsCoeff6, codesTnsCoeff7 }; -const Coding * const codesTnsCoeffSWBTCX10[] = { codesTnsCoeff0TCX10, codesTnsCoeff1TCX10, codesTnsCoeff2TCX10, codesTnsCoeff3TCX10, codesTnsCoeff4TCX10, codesTnsCoeff5, codesTnsCoeff6, codesTnsCoeff7 }; -const Coding * const codesTnsCoeffWBTCX20[] = { codesTnsCoeff0WBTCX20, codesTnsCoeff1WBTCX20, codesTnsCoeff2WB, codesTnsCoeff3WB, codesTnsCoeff456, codesTnsCoeff456, codesTnsCoeff456, codesTnsCoeff7 }; - -const Word16 nTnsCoeffTables = sizeof(codesTnsCoeffSWBTCX20)/sizeof(codesTnsCoeffSWBTCX20[0]); // Q0 - -const Coding codesTnsOrderTCX20[] = -{ - { 1, 0, 2 }, /* 00 */ - { 2, 40, 6 }, /* 101000 */ - { 3, 41, 6 }, /* 101001 */ - { 4, 21, 5 }, /* 10101 */ - { 5, 11, 4 }, /* 1011 */ - { 6, 4, 3 }, /* 100 */ - { 7, 1, 2 }, /* 01 */ - { 8, 3, 2 } /* 11 */ -}; -const Coding codesTnsOrderTCX10[] = -{ - { 1, 0, 3 }, /* 000 */ - { 2, 16, 5 }, /* 10000 */ - { 3, 17, 5 }, /* 10001 */ - { 4, 9, 4 }, /* 1001 */ - { 5, 1, 3 }, /* 001 */ - { 6, 5, 3 }, /* 101 */ - { 7, 1, 2 }, /* 01 */ - { 8, 3, 2 } /* 11 */ -}; -const Coding codesTnsOrder[] = -{ - { 1, 96, 7 }, /* 1100000 */ - { 2, 97, 7 }, /* 1100001 */ - { 3, 49, 6 }, /* 110001 */ - { 4, 25, 5 }, /* 11001 */ - { 5, 13, 4 }, /* 1101 */ - { 6, 7, 3 }, /* 111 */ - { 7, 2, 2 }, /* 10 */ - { 8, 0, 1 } /* 0 */ -}; - -const Word16 nTnsOrderCodes = sizeof(codesTnsOrder)/sizeof(codesTnsOrder[0]); // Q0 - -const ParamsBitMap tnsSWBTCX20FilterCoeffBitMap = -{ - 1, - { - { 0, GetSWBTCX20TnsFilterCoeffBits, TRUE, GetTnsFilterCoeff, SetTnsFilterCoeff, EncodeSWBTCX20TnsFilterCoeff, DecodeSWBTCX20TnsFilterCoeff_flt, NULL } /* TNS filter coefficients */ - } -}; - -const ParamsBitMap tnsSWBTCX10FilterCoeffBitMap = -{ - 1, - { - { 0, GetSWBTCX10TnsFilterCoeffBits, TRUE, GetTnsFilterCoeff, SetTnsFilterCoeff, EncodeSWBTCX10TnsFilterCoeff, DecodeSWBTCX10TnsFilterCoeff_flt, NULL } /* TNS filter coefficients */ - } -}; - -const ParamsBitMap tnsSWBTCX20FilterBitMap = -{ - 1, - { - { 0, GetTnsFilterOrderBitsSWBTCX20, FALSE, GetTnsFilterOrder, SetTnsFilterOrder, EncodeTnsFilterOrderSWBTCX20, DecodeTnsFilterOrderSWBTCX20_flt, &tnsSWBTCX20FilterCoeffBitMap } /* TNS filter order */ - } -}; - -const ParamsBitMap tnsSWBTCX10FilterBitMap = -{ - 1, - { - { 0, GetTnsFilterOrderBitsSWBTCX10, FALSE, GetTnsFilterOrder, SetTnsFilterOrder, EncodeTnsFilterOrderSWBTCX10, DecodeTnsFilterOrderSWBTCX10_flt, &tnsSWBTCX10FilterCoeffBitMap } /* TNS filter order */ - } -}; - -const ParamsBitMap tnsSWBTCX20BitMap = -{ - 1, - { - { 1, NULL, FALSE, GetNumOfTnsFilters_flt, SetNumOfTnsFilters_flt, NULL, NULL, &tnsSWBTCX20FilterBitMap } /* Number of TNS filters */ - } -}; - -/* For storing/reading bits in SWB/FB mode */ -const ParamsBitMap tnsEnabledSWBTCX20BitMap = -{ - 1, - { - { 1, NULL, TRUE, GetTnsEnabled, SetTnsEnabled, NULL, NULL, &tnsSWBTCX20BitMap } /* TNS Enabled/Disable */ - } -}; - -const ParamsBitMap tnsSWBTCX10BitMap = -{ - 1, - { - { 1, NULL, FALSE, GetNumOfTnsFilters_flt, SetNumOfTnsFilters_flt, NULL, NULL, &tnsSWBTCX10FilterBitMap } /* Number of TNS filters */ - } -}; - -/* For storing/reading bits in SWB/FB mode */ -const ParamsBitMap tnsEnabledSWBTCX10BitMap = -{ - 1, - { - { 1, NULL, TRUE, GetTnsEnabled, SetTnsEnabled, NULL, NULL, &tnsSWBTCX10BitMap } /* TNS Enabled/Disable */ - } -}; - -const ParamsBitMap tnsWBTCX20FilterCoeffBitMap = -{ - 1, - { - { 0, GetWBTCX20TnsFilterCoeffBits, TRUE, GetTnsFilterCoeff, SetTnsFilterCoeff, EncodeWBTCX20TnsFilterCoeff, DecodeWBTCX20TnsFilterCoeff_flt, NULL } /* TNS filter coefficients */ - } -}; - - -const ParamsBitMap tnsWBTCX20FilterBitMap = -{ - 1, - { - { 0, GetTnsFilterOrderBits, FALSE, GetTnsFilterOrder, SetTnsFilterOrder, EncodeTnsFilterOrder, DecodeTnsFilterOrder_flt, &tnsWBTCX20FilterCoeffBitMap } /* TNS filter order */ - } -}; - - -/* For storing/reading bits in WB mode */ -const ParamsBitMap tnsEnabledWBTCX20BitMap = -{ - 1, - { - { 1, NULL, TRUE, GetTnsEnabledSingleFilter, SetTnsEnabledSingleFilter, NULL, NULL, &tnsWBTCX20FilterBitMap } /* TNS Enabled/Disable */ - } -}; - -/* For storing/reading bits in SWB/FB mode */ -const ParamsBitMap tnsOnWhiteSWBTCX20BitMap = -{ - 2, - { - { 1, NULL, TRUE, GetTnsOnWhite, SetTnsOnWhite, NULL, NULL, NULL }, /* TNS Enabled/Disable */ - { 1, NULL, FALSE, GetNumOfTnsFilters_flt, SetNumOfTnsFilters_flt, NULL, NULL, &tnsSWBTCX20FilterBitMap } - } -}; - -const ParamsBitMap tnsEnabledOnWhiteSWBTCX20BitMap = -{ - 1, - { - { 1, NULL, TRUE, GetTnsEnabled, SetTnsEnabled, NULL, NULL, &tnsOnWhiteSWBTCX20BitMap } /* TNS Enabled/Disable */ - } -}; -/* For storing/reading bits in SWB/FB mode */ -const ParamsBitMap tnsOnWhiteSWBTCX10BitMap = -{ - 2, - { - { 1, NULL, TRUE, GetTnsOnWhite, SetTnsOnWhite, NULL, NULL, NULL }, /* TNS on whitened spectra */ - { 1, NULL, FALSE, GetNumOfTnsFilters_flt, SetNumOfTnsFilters_flt, NULL, NULL, &tnsSWBTCX10FilterBitMap } - } -}; - -/* For storing/reading bits in SWB/FB mode */ -const ParamsBitMap tnsEnabledOnWhiteSWBTCX10BitMap = -{ - 1, - { - { 1, NULL, TRUE, GetTnsEnabled, SetTnsEnabled, NULL, NULL, &tnsOnWhiteSWBTCX10BitMap } /* TNS Enabled/Disable */ - } -}; - - -/** - * 4 bit resolution TNS coefficients. - */ -const Word16 tnsCoeff4[16] = -{ - -32628/*-0.99573418F Q15*/, /* = sin(-8*(PI/2.0)/(8 + 0.5)) */ - -31517/*-0.96182564F Q15*/, /* = sin(-7*(PI/2.0)/(8 + 0.5)) */ - -29333/*-0.89516329F Q15*/, - -26149/*-0.79801723F Q15*/, - -22076/*-0.67369564F Q15*/, - -17250/*-0.52643216F Q15*/, - -11837/*-0.36124167F Q15*/, - -6021/*-0.18374952F Q15*/, /* = sin(-1*(PI/2.0)/(8 + 0.5)) */ - 0/* 0.00000000F Q15*/, /* = sin(0*(PI/2.0)/(8 + 0.5)) */ - 6813/* 0.20791169F Q15*/, /* = sin(1*(PI/2.0)/(8 - 0.5)) */ - 13328/* 0.40673664F Q15*/, - 19261/* 0.58778525F Q15*/, - 24351/* 0.74314483F Q15*/, - 28378/* 0.86602540F Q15*/, - 31164/* 0.95105652F Q15*/, /* = sin(6*(PI/2.0)/(8 - 0.5)) */ - 32588/* 0.99452190F Q15*/ /* = sin(7*(PI/2.0)/(8 - 0.5)) */ -}; - - -/*----------------------------------------------------------------------------------* - * IGF settings for each bitrate - *----------------------------------------------------------------------------------*/ - -const Word16 swb_offset_LB_new[IGF_BITRATE_UNKNOWN][IGF_MAX_SFB] = // Q0 -{ - /* 0: for 9600 kbs WB */ - { - 4, 164, 186, 242, 320 - }, - /* 1: for 13200 kbs WB RF */ - { - 4, 164, 186, 242, 320 - }, - /* 2: for 9600 kbs SWB */ - { - 4, 200, 322, 444, 566 - }, - /* 3: for 13200 kbs SWB */ - { - 7, 256, 288, 328, 376, 432, 496, 566 - }, - /* 4: for 13200 kbs SWB RF */ - { - 4, 200, 322, 444, 566 - }, - /* 5: for 16400 kbs SWB */ - { - 8, 256, 288, 328, 376, 432, 496, 576, 640 - }, - /* 6: for 24400 kbs SWB */ - { - 9, 256, 284, 318, 358, 402, 450, 508, 576, 640 - }, - /* 7: for 32000 kbs SWB */ - { - 9, 256, 284, 318, 358, 402, 450, 508, 576, 640 - }, - /* 8: for 48000 kbs SWB */ - { - 4, 512, 534, 576, 640 - }, - /* 9: for 64000 kbs SWB */ - { - 4, 512, 534, 576, 640 - }, - /* 10: for 16400 kbs FB */ - { - 10, 256, 288, 328, 376, 432, 496, 576, 640, 720, 800 - }, - /* 11: for 24400 kbs FB */ - { - 11, 256, 284, 318, 358, 402, 450, 508, 576, 640, 720, 800 - }, - /* 12: for 32000 kbs FB */ - { - 11, 256, 284, 318, 358, 402, 450, 508, 576, 640, 720, 800 - }, - /* 13: for 48000 kbs FB */ - { - 5, 512, 584, 656, 728, 800 - }, - /* 14: for 64000 kbs FB */ - { - 5, 512, 584, 656, 728, 800 - }, - /* 15: for 96000 kbs FB */ - { - 3, 640, 720, 800 /* old: 640, 760, 880 */ - }, - /* 16: for 128000 kbs FB */ - { - 3, 640, 720, 800 /* old: 640, 760, 880 */ - }, - /* 17: for 13200 kbs WB (stereo) */ - { - 3, 196, 248, 320 - }, - /* 18: for 16400 kbs WB (stereo) */ - { - 3, 228, 268, 320 - }, - /* 19: for 13200 kbs SWB (stereo) */ - { - 5, 200, 264, 344, 440, 566 - }, - /* 20: for 16400 kbs SWB (stereo) */ - { - 7, 228, 264, 308, 360, 420, 488, 566 - }, - /* 21: for 24400 kbs SWB (stereo) */ - { - 8, 256, 288, 328, 376, 432, 496, 576, 640 - }, - /* 22: for 32000 kbs SWB (stereo) */ - { - 9, 256, 284, 320, 360, 404, 452, 508, 576, 640 - }, - /* 23: for 48000 kbs SWB (stereo) */ - { - 7, 360, 392, 424, 464, 508, 560, 640 - }, - /* 24: for 48000 kbs SWB (stereo TCX10) */ - { - 4, 360, 424, 508, 640 - }, - /* 25: for 64000 kbs SWB (stereo) */ - { - 8, 400, 424, 448, 476, 508, 540, 576, 640 - }, - /* 26: for 80000 kbs SWB (stereo) */ - { - 5, 464, 496, 532, 576, 640 - }, - /* 27: for 96000 kbs SWB (stereo) */ - { - 4, 512, 536, 576, 640 - }, - /* 28: for 24400 kbs FB (stereo) */ - { - 10, 256, 288, 328, 376, 432, 496, 576, 640, 720, 800 - }, - /* 29: for 32000 kbs FB (stereo) */ - { - 11, 256, 284, 320, 360, 404, 452, 508, 576, 640, 720, 800 - }, - /* 30: for 48000 kbs FB (stereo) */ - { - 9, 360, 392, 424, 464, 508, 560, 640, 720, 800 - }, - /* 31: for 48000 kbs FB (stereo TCX10) */ - { - 5, 360, 424, 508, 640, 800 - }, - /* 32: for 64000 kbs FB (stereo) */ - { - 10, 400, 424, 448, 476, 508, 540, 576, 640, 720, 800 - }, - /* 33: for 80000 kbs FB (stereo) */ - { - 7, 464, 496, 532, 576, 640, 720, 800 - }, - /* 34: for 96000 kbs FB (stereo) */ - { - 6, 512, 536, 576, 640, 720, 800 - }, - /* 35: for 128000 kbs FB (stereo) */ - { - 3, 640, 720, 800 - } -};/*Q0*/ - -const Word16 igf_tile_offset_table[IGF_BITRATE_UNKNOWN][2*IGF_MAX_TILES+1] = { // Q0 - { 2, 2, 0, 3, 0}, /* 9600 WB*/ - { 2, 2, 0, 3, 0}, /* 13200 WB RF */ - { 3, 1, 0, 2, 32, 3, 46}, /* 9600 SWB */ - { 2, 4, 0, 6, 32}, /* 13200 SWB RF */ - { 3, 1, 0, 2, 32, 3, 46}, /* 13200 SWB */ - { 3, 4, 0, 6, 48, 7, 64}, /* 16400 SWB */ - { 3, 4, 0, 7, 32, 8, 64}, /* 24400 SWB */ - { 3, 4, 0, 7, 32, 8, 64}, /* 32000 SWB */ - { 1, 3, 320}, /* 48000 SWB */ - { 1, 3, 320}, /* 64000 SWB */ - { 3, 4, 0, 7, 0, 9, 0}, /* 16400 FB */ - { 4, 4, 0, 6, 32, 9, 0, 10, 80}, /* 24400 FB */ - { 4, 4, 0, 6, 32, 9, 0, 10, 80}, /* 32000 FB */ - { 1, 4, 160}, /* 48000 FB */ - { 1, 4, 160}, /* 64000 FB */ - { 1, 2, 416}, /* 96000 FB */ - { 1, 2, 416}, /*128000 FB */ - { 2, 1, 40, 2, 92}, /* 13200 WB (stereo) */ - { 2, 1, 80, 2, 120}, /* 16400 WB (stereo) */ - { 4, 1, 0, 2, 32, 3, 46, 4, 40}, /* 13200 SWB (stereo) */ - { 6, 1, 0, 2, 36, 3, 80, 4, 132, 5, 32, 6, 100 }, /* 16400 SWB (stereo) */ - { 7, 1, 0, 2, 32, 3, 72, 4, 120, 5, 48, 6, 112, 7, 64 }, /* 24400 SWB (stereo) */ - { 8, 1, 0, 2, 28, 3, 64, 4, 104, 5, 32, 6, 80, 7, 136, 8, 64 }, /* 32000 SWB (stereo) */ - { 6, 1, 120, 2, 152, 3, 184, 4, 224, 5, 140, 6, 192}, /* 48000 SWB (stereo) */ - { 3, 1, 0, 2, 40, 3, 80 }, /* 48000 SWB (stereo TCX10) */ - { 4, 2, 80, 4, 128, 6, 144, 7, 212 }, /* 64000 SWB (stereo) */ - { 2, 2, 212, 4, 280 }, /* 80000 SWB (stereo) */ - { 1, 3, 200}, /* 96000 SWB (stereo) */ - { 9, 1, 0, 2, 32, 3, 72, 4, 120, 5, 48, 6, 112, 7, 64, 8, 0, 9, 80 }, /* 24400 FB (stereo) */ - {10, 1, 0, 2, 28, 3, 64, 4, 104, 5, 32, 6, 80, 7, 136, 8, 64, 9, 0, 10, 80 }, /* 32000 FB (stereo) */ - { 7, 1, 120, 2, 152, 3, 184, 4, 224, 5, 140, 6, 192, 8, 140}, /* 48000 FB (stereo) */ - { 4, 1, 0, 2, 40, 3, 80, 4, 140 }, /* 48000 FB (stereo TCX10) */ - { 5, 2, 80, 4, 128, 6, 144, 7, 212, 9, 160 }, /* 64000 FB (stereo) */ - { 3, 2, 212, 4, 280, 6, 200 }, /* 80000 FB (stereo) */ - { 2, 3, 200, 5, 240}, /* 96000 FB (stereo) */ - { 1, 2, 416} /*128000 FB (stereo) */ -}; - -const Word16 igf_whitening_TH_ivas_fx[][2][IGF_MAX_TILES] = -{ - /* 0: for 9600 kbs WB */ - { - /* medium */ { 2949/*0.36f Q13*/, 2949/*0.36f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 11551/*1.41f Q13*/, 11551/*1.41f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} - }, - /* 1: for 13200 kbs WB RF */ - { - /* medium */ { 2949/*0.36f Q13*/, 2949/*0.36f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 11551/*1.41f Q13*/, 11551/*1.41f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} - }, - /* 2: for 9600 kbs SWB */ - { - /* medium */ { 6881/*0.84f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 10650/*1.30f Q13*/, 10240/*1.25f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} - }, - /* 3: for 13200 kbs SWB */ - { - /* medium */ { 6881/*0.84f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 10650/*1.30f Q13*/, 10240/*1.25f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} - }, - /* 4: for 13200 kbs SWB RF */ - { - /* medium */ { 6881/*0.84f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 10650/*1.30f Q13*/, 10240/*1.25f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} - }, - /* 5: for 16400 kbs SWB */ - { - /* medium */ { 6799/*0.83f Q13*/, 7291/*0.89f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 10732/*1.31f Q13*/, 9748/*1.19f Q13*/, 9748/*1.19f Q13*/, 0/*0.f Q13*/} - }, - /* 6: for 24400 kbs SWB*/ - { - /* medium */ { 6636/*0.81f Q13*/, 6963/*0.85f Q13*/, 6963/*0.85f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 11059/*1.35f Q13*/, 10076/*1.23f Q13*/, 10076/*1.23f Q13*/, 0/*0.f Q13*/} - }, - /* 7: for 32000 kbs SWB */ - { - /* medium */ { 7455/*0.91f Q13*/, 6963/*0.85f Q13*/, 6963/*0.85f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 10977/*1.34f Q13*/, 11059/*1.35f Q13*/, 11059/*1.35f Q13*/, 0/*0.f Q13*/} - }, - /* 8: for 48000 kbs SWB */ - { - /* medium */ { 9421/*1.15f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 9748/*1.19f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} - }, - /* 9: for 64000 kbs SWB */ - { - /* medium */ { 9421/*1.15f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 9748/*1.19f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} - }, - /* 10: for 16400 kbs FB */ - { - /* medium */ { 5161/*0.63f Q13*/, 2212/*0.27f Q13*/, 2949/*0.36f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 12534/*1.53f Q13*/, 10813/*1.32f Q13*/, 5489/*0.67f Q13*/, 0/*0.f Q13*/} - }, - /* 11: for 24400 kbs FB */ - { - /* medium */ { 6390/*0.78f Q13*/, 2540/*0.31f Q13*/, 2785/*0.34f Q13*/, 2785/*0.34f Q13*/}, - /* strong */ { 12206/*1.49f Q13*/, 11305/*1.38f Q13*/, 5325/*0.65f Q13*/, 5325/*0.65f Q13*/} - }, - /* 12: for 32000 kbs FB */ - { - /* medium */ { 6390/*0.78f Q13*/, 2540/*0.31f Q13*/, 2785/*0.34f Q13*/, 2785/*0.34f Q13*/}, - /* strong */ { 12206/*1.49f Q13*/, 11305/*1.38f Q13*/, 5325/*0.65f Q13*/, 5325/*0.65f Q13*/} - }, - /* 13: for 48000 kbs FB */ - { - /* medium */ { 6554/*0.80f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 8192/*1.00f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} - }, - /* 14: for 64000 kbs FB */ - { - /* medium */ { 6554/*0.80f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 8192/*1.00f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} - }, - /* 15: for 96000 kbs FB */ - { - /* medium */ { 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 23101/*2.82f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} - }, - /* 16: for 128000 kbs FB */ - { - /* medium */ { 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 23101/*2.82f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} - }, - /* 17: for 13200 kbs WB (stereo) */ - { - /* medium */ {6554/*0.800000 Q13*/, 6144/*0.750000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/ }, - /* strong */ {12288/*1.500000 Q13*/, 11878/*1.450000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/ } - }, - /* 18: for 16400 kbs WB (stereo) */ - { - - /* medium */ {7373/*0.900000 Q13*/, 6963/*0.850000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/ }, - /* strong */ {13107/*1.600000 Q13*/, 12288/*1.500000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/ } - }, - /* 19: for 13200 kbs SWB (stereo) */ - { - /* medium */ {7291/*0.890000 Q13*/, 7291/*0.890000 Q13*/, 6554/*0.800000 Q13*/, 6554/*0.800000 Q13*/, }, - /* strong */ {10240/*1.250000 Q13*/, 10240/*1.250000 Q13*/, 9748/*1.190000 Q13*/, 9748/*1.190000 Q13*/, } - }, - /* 20: for 16400 kbs SWB (stereo) */ - { - /* medium */ {8602/*1.050000 Q13*/, 8602/*1.050000 Q13*/, 9011/*1.100000 Q13*/, 9011/*1.100000 Q13*/, 8602/*1.050000 Q13*/, 8602/*1.050000 Q13*/, }, - /* strong */ {13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 13517/*1.650000 Q13*/, 13517/*1.650000 Q13*/, 13107/*1.600000 Q13*/, 12288/*1.500000 Q13*/, } - }, - /* 21: for 24400 kbs SWB (stereo) */ - { - /* medium */ {9830/*1.200000 Q13*/, 9830/*1.200000 Q13*/, 9421/*1.150000 Q13*/, 9011/*1.100000 Q13*/, 8602/*1.050000 Q13*/, 8192/*1.000000 Q13*/, 7373/*0.900000 Q13*/, }, - /* strong */ {13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 12698/*1.550000 Q13*/, 11878/*1.450000 Q13*/, 9830/*1.200000 Q13*/, } - }, - /* 22: for 32000 kbs SWB (stereo) */ - { - /* medium */ {9830/*1.200000 Q13*/, 9830/*1.200000 Q13*/, 9421/*1.150000 Q13*/, 9421/*1.150000 Q13*/, 9011/*1.100000 Q13*/, 8602/*1.050000 Q13*/, 8192/*1.000000 Q13*/, 7373/*0.900000 Q13*/, }, - /* strong */ {14746/*1.800000 Q13*/, 14746/*1.800000 Q13*/, 14746/*1.800000 Q13*/, 14746/*1.800000 Q13*/, 13517/*1.650000 Q13*/, 12698/*1.550000 Q13*/, 11878/*1.450000 Q13*/, 9830/*1.200000 Q13*/, } - }, - /* 23: for 48000 kbs SWB (stereo) */ /* currently not used due to adaptive calculation of thresholds at 48 kbps */ - { - /* medium */ {6144/*0.750000 Q13*/, 5734/*0.700000 Q13*/, 4096/*0.500000 Q13*/, 0/*0.000000 Q13*/ }, - /* strong */ {10240/*1.250000 Q13*/, 9011/*1.100000 Q13*/, 8192/*1.000000 Q13*/, 0/*0.000000 Q13*/ } - }, - /* 24: for 48000 kbs SWB (stereo TCX10) */ /* currently not used due to adaptive calculation of thresholds at 48 kbps */ - { - /* medium */ {6144/*0.750000 Q13*/, 5734/*0.700000 Q13*/, 4096/*0.500000 Q13*/, 0/*0.000000 Q13*/ }, - /* strong */ {10240/*1.250000 Q13*/, 9011/*1.100000 Q13*/, 8192/*1.000000 Q13*/, 0/*0.000000 Q13*/ } - }, - /* 25: for 64000 kbs SWB (stereo) */ - { - /* medium */ {8192/*1.000000 Q13*/, 8192/*1.000000 Q13*/, 9830/*1.200000 Q13*/, 10240/*1.250000 Q13*/ }, - /* strong */ {12288/*1.500000 Q13*/, 12288/*1.500000 Q13*/, 13107/*1.600000 Q13*/, 13107/*1.600000 Q13*/ } - }, - /* 26: for 80000 kbs SWB (stereo) */ - { - /* medium */ {9830/*1.200000 Q13*/, 10240/*1.250000 Q13*/, 0/*0.000000 Q13*/ }, - /* strong */ {13107/*1.600000 Q13*/, 13107/*1.600000 Q13*/, 0/*0.000000 Q13*/ } - }, - /* 27: for 96000 kbs SWB (stereo) */ - { - /* medium */ {9421/*1.150000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/ }, - /* strong */ {9748/*1.190000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/ } - }, - /* 28: for 24400 kbs FB (stereo) */ - { - /* medium */ {9830/*1.200000 Q13*/, 9830/*1.200000 Q13*/, 9421/*1.150000 Q13*/, 9011/*1.100000 Q13*/, 8602/*1.050000 Q13*/, 8192/*1.000000 Q13*/, 7373/*0.900000 Q13*/, 2785/*0.340000 Q13*/, 2785/*0.340000 Q13*/ }, - /* strong */ {13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 12698/*1.550000 Q13*/, 11878/*1.450000 Q13*/, 9830/*1.200000 Q13*/, 5325/*0.650000 Q13*/, 5325/*0.650000 Q13*/ } - }, - /* 29: for 32000 kbs FB (stereo) */ - { - /* medium */ {9830/*1.200000 Q13*/, 9830/*1.200000 Q13*/, 9421/*1.150000 Q13*/, 9421/*1.150000 Q13*/, 9011/*1.100000 Q13*/, 8602/*1.050000 Q13*/, 8192/*1.000000 Q13*/, 7373/*0.900000 Q13*/, 2785/*0.340000 Q13*/, 2785/*0.340000 Q13*/ }, - /* strong */ {14746/*1.800000 Q13*/, 14746/*1.800000 Q13*/, 14746/*1.800000 Q13*/, 14746/*1.800000 Q13*/, 13517/*1.650000 Q13*/, 12698/*1.550000 Q13*/, 11878/*1.450000 Q13*/, 9830/*1.200000 Q13*/, 5325/*0.650000 Q13*/, 5325/*0.650000 Q13*/ } - }, - /* 30: for 48000 kbs FB (stereo) */ /* currently not used due to adaptive calculation of thresholds at 48 kbps */ - { - /* medium */ {6390/*0.780000 Q13*/, 2540/*0.310000 Q13*/, 2785/*0.340000 Q13*/, 2785/*0.340000 Q13*/ }, - /* strong */ {12206/*1.490000 Q13*/, 11305/*1.380000 Q13*/, 5325/*0.650000 Q13*/, 5325/*0.650000 Q13*/ } - }, - /* 31: for 48000 kbs FB (stereo TCX10) */ /* currently not used due to adaptive calculation of thresholds at 48 kbps */ - { - /* medium */ {6144/*0.750000 Q13*/, 5734/*0.700000 Q13*/, 4096/*0.500000 Q13*/, 4096/*0.500000 Q13*/ }, - /* strong */ {10240/*1.250000 Q13*/, 9011/*1.100000 Q13*/, 8192/*1.000000 Q13*/, 8192/*1.000000 Q13*/ } - }, - /* 32: for 64000 kbs FB (stereo) */ - { - /* medium */ {8192/*1.000000 Q13*/, 8192/*1.000000 Q13*/, 9830/*1.200000 Q13*/, 10240/*1.250000 Q13*/, 6144/*0.750000 Q13*/ }, - /* strong */ {12288/*1.500000 Q13*/, 12288/*1.500000 Q13*/, 13107/*1.600000 Q13*/, 13107/*1.600000 Q13*/, 8192/*1.000000 Q13*/ } - }, - /* 33: for 80000 kbs FB (stereo) */ - { - /* medium */ {9830/*1.200000 Q13*/, 10240/*1.250000 Q13*/, 6144/*0.750000 Q13*/, 0/*0.000000 Q13*/ }, - /* strong */ {13107/*1.600000 Q13*/, 13107/*1.600000 Q13*/, 8192/*1.000000 Q13*/, 0/*0.000000 Q13*/ } - }, - /* 34: for 96000 kbs FB (stereo) */ - { - /* medium */ {7455/*0.910000 Q13*/, 6963/*0.850000 Q13*/ , 0/*0.000000 Q13*/ }, - /* strong */ {10977/*1.340000 Q13*/, 11059/*1.350000 Q13*/, 0/*0.000000 Q13*/ } - }, - /* 35: for 128000 kbs FB (stereo) */ - { - /* medium */ { 0/*0.000000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/}, - /* strong */ {23101/*2.820000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/} - } -}; -const Word16 igf_whitening_TH[][2][IGF_MAX_TILES] = -{ - /* 0: for 9600 kbs WB */ - { - /* medium */ { 2949/*0.36f Q13*/, 2949/*0.36f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 11551/*1.41f Q13*/, 11551/*1.41f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} -}, -/* 1: for 13200 kbs WB RF */ -{ - /* medium */ { 2949/*0.36f Q13*/, 2949/*0.36f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 11551/*1.41f Q13*/, 11551/*1.41f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} -}, -/* 2: for 9600 kbs SWB */ -{ - /* medium */ { 6881/*0.84f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 10650/*1.30f Q13*/, 10240/*1.25f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} -}, -/* 3: for 13200 kbs SWB */ -{ - /* medium */ { 6881/*0.84f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 10650/*1.30f Q13*/, 10240/*1.25f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} -}, -/* 4: for 13200 kbs SWB RF */ -{ - /* medium */ { 6881/*0.84f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 10650/*1.30f Q13*/, 10240/*1.25f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} -}, -/* 5: for 16400 kbs SWB */ -{ - /* medium */ { 6799/*0.83f Q13*/, 7291/*0.89f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 10732/*1.31f Q13*/, 9748/*1.19f Q13*/, 9748/*1.19f Q13*/, 0/*0.f Q13*/} -}, -/* 6: for 24400 kbs SWB*/ -{ - /* medium */ { 6636/*0.81f Q13*/, 6963/*0.85f Q13*/, 6963/*0.85f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 11059/*1.35f Q13*/, 10076/*1.23f Q13*/, 10076/*1.23f Q13*/, 0/*0.f Q13*/} -}, -/* 7: for 32000 kbs SWB */ -{ - /* medium */ { 7455/*0.91f Q13*/, 6963/*0.85f Q13*/, 6963/*0.85f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 10977/*1.34f Q13*/, 11059/*1.35f Q13*/, 11059/*1.35f Q13*/, 0/*0.f Q13*/} -}, -/* 8: for 48000 kbs SWB */ -{ - /* medium */ { 9421/*1.15f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 9748/*1.19f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} -}, -/* 9: for 64000 kbs SWB */ -{ - /* medium */ { 9421/*1.15f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 9748/*1.19f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} -}, -/* 10: for 16400 kbs FB */ -{ - /* medium */ { 5161/*0.63f Q13*/, 2212/*0.27f Q13*/, 2949/*0.36f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 12534/*1.53f Q13*/, 10813/*1.32f Q13*/, 5489/*0.67f Q13*/, 0/*0.f Q13*/} -}, -/* 11: for 24400 kbs FB */ -{ - /* medium */ { 6390/*0.78f Q13*/, 2540/*0.31f Q13*/, 2785/*0.34f Q13*/, 2785/*0.34f Q13*/}, - /* strong */ { 12206/*1.49f Q13*/, 11305/*1.38f Q13*/, 5325/*0.65f Q13*/, 5325/*0.65f Q13*/} -}, -/* 12: for 32000 kbs FB */ -{ - /* medium */ { 6390/*0.78f Q13*/, 2540/*0.31f Q13*/, 2785/*0.34f Q13*/, 2785/*0.34f Q13*/}, - /* strong */ { 12206/*1.49f Q13*/, 11305/*1.38f Q13*/, 5325/*0.65f Q13*/, 5325/*0.65f Q13*/} -}, -/* 13: for 48000 kbs FB */ -{ - /* medium */ { 6554/*0.80f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 8192/*1.00f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} -}, -/* 14: for 64000 kbs FB */ -{ - /* medium */ { 6554/*0.80f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 8192/*1.00f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} -}, -/* 15: for 96000 kbs FB */ -{ - /* medium */ { 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 23101/*2.82f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} -}, -/* 16: for 128000 kbs FB */ -{ - /* medium */ { 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, - /* strong */ { 23101/*2.82f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} -} -}; - -/* IGF SCF arithmetic coder cumulative frequency tables and offsets */ - -const Word16 cf_off_se01_tab[10] = { // Q0 - +1, /* 9.6 kbs B*/ - +1, /* 13.2 kbs WB RF B*/ - +1, /* 9.6 kbs SWB B*/ - +1, /* 13.2 kbs A*/ - +1, /* 13.2 kbs SWB RF B*/ - +1, /* 16.4 kbs B*/ - +1, /* 24.4 kbs B*/ - +1, /* 32.0 kbs A*/ - -1, /* 48.0 kbs B*/ - -1 /* 64.0 kbs B*/ -}; - -const Word16 cf_off_se02_tab[10][IGF_CTX_COUNT] = { // Q0 - { +1, +2, +2, +2, +3, +3, +4}, /* 9.6 kbs B*/ - { +1, +2, +2, +2, +3, +3, +4}, /* 13.2 kbs WB RF B*/ - { +0, +2, +3, +3, +2, +2, +4}, /* 9.6 kbs SWB B*/ - { +0, +2, +3, +3, +2, +2, +4}, /* 13.2 kbs A*/ - { +0, +2, +3, +3, +2, +2, +4}, /* 13.2 kbs SWB RF B*/ - { +0, +2, +3, +3, +2, +2, +4}, /* 16.4 kbs B*/ - { -1, +2, +2, +2, +2, +3, +5}, /* 24.4 kbs B*/ - { -1, +2, +2, +2, +2, +3, +5}, /* 32.0 kbs A*/ - { +3, +2, +3, +2, +3, +3, +6}, /* 48.0 kbs B*/ - { +3, +2, +3, +2, +3, +3, +6} /* 64.0 kbs B*/ -}; - -const Word16 cf_off_se10_tab = -7; // Q0 - -const Word16 cf_off_se11_tab[IGF_CTX_COUNT][IGF_CTX_COUNT] = // Q0 -{ - { -5, +0, +0, +0, +0, +0, +0}, - { +0, +0, +0, +0, +0, +0, +0}, - { +0, +0, +0, +0, +0, +0, +0}, - { +0, +0, +0, +0, +0, +0, +0}, - { +0, +0, +0, +0, +0, +0, +0}, - { +0, +0, +0, +0, +0, +0, +1}, - { +0, +1, +0, +0, +3, +0, +3} -}; - -const UWord16 cf_se00_tab[IGF_SYMBOLS_IN_TABLE + 1] = // Q0 -{ - 16384, 16356, 16299, 16185, 15904, 15282, 14669, 13598, 11886, 9541, 6613, 3845, 1799, 606, 153, 32, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 -}; - -const UWord16 cf_se01_tab[10][IGF_SYMBOLS_IN_TABLE + 1] = // Q0 -{ - {16384, 16320, 16285, 16237, 16163, 16049, 15864, 15604, 15187, 14557, 13612, 12308, 10590, 8535, 6346, 4396, 2900, 1917, 1289, 870, 593, 408, 279, 181, 122, 78, 52, 0}, /* 9.6 kbs B*/ - {16384, 16320, 16285, 16237, 16163, 16049, 15864, 15604, 15187, 14557, 13612, 12308, 10590, 8535, 6346, 4396, 2900, 1917, 1289, 870, 593, 408, 279, 181, 122, 78, 52, 0}, /* 13.2 kbs WB RF B*/ - {16384, 16375, 16362, 16339, 16307, 16258, 16180, 16061, 15845, 15463, 14795, 13680, 11828, 9252, 6358, 3769, 2079, 1186, 687, 415, 242, 150, 100, 67, 44, 30, 19, 0}, /* 9.6 kbs SWB B*/ - {16384, 16375, 16362, 16339, 16307, 16258, 16180, 16061, 15845, 15463, 14795, 13680, 11828, 9252, 6358, 3769, 2079, 1186, 687, 415, 242, 150, 100, 67, 44, 30, 19, 0}, /* 13.2 kbs A*/ - {16384, 16375, 16362, 16339, 16307, 16258, 16180, 16061, 15845, 15463, 14795, 13680, 11828, 9252, 6358, 3769, 2079, 1186, 687, 415, 242, 150, 100, 67, 44, 30, 19, 0}, /* 13.2 kbs SWB RF B*/ - {16384, 16375, 16362, 16339, 16307, 16258, 16180, 16061, 15845, 15463, 14795, 13680, 11828, 9252, 6358, 3769, 2079, 1186, 687, 415, 242, 150, 100, 67, 44, 30, 19, 0}, /* 16.4 kbs B*/ - {16384, 16369, 16356, 16337, 16311, 16268, 16197, 16073, 15876, 15544, 14977, 13987, 12327, 9908, 7017, 4393, 2545, 1446, 840, 493, 292, 183, 111, 70, 45, 31, 20, 0 }, /* 24.4 kbs B*/ - {16384, 16369, 16356, 16337, 16311, 16268, 16197, 16073, 15876, 15544, 14977, 13987, 12327, 9908, 7017, 4393, 2545, 1446, 840, 493, 292, 183, 111, 70, 45, 31, 20, 0}, /* 32.0 kbs A*/ - {16384, 16368, 16355, 16334, 16291, 16212, 16071, 15816, 15359, 14523, 13014, 10534, 7345, 4272, 2228, 1149, 626, 357, 215, 139, 93, 67, 53, 43, 36, 28, 22, 0}, /* 48.0 kbs B*/ - {16384, 16368, 16355, 16334, 16291, 16212, 16071, 15816, 15359, 14523, 13014, 10534, 7345, 4272, 2228, 1149, 626, 357, 215, 139, 93, 67, 53, 43, 36, 28, 22, 0} /* 64.0 kbs B*/ -}; - -const UWord16 cf_se02_tab[10][IGF_CTX_COUNT][IGF_SYMBOLS_IN_TABLE + 1] = // Q0 -{ - { /* 9.6 kbs B */ - { 16384, 16369, 16348, 16316, 16256, 16172, 16017, 15735, 15246, 14363, 13036, 11139, 8916, 6724, 4757, 3282, 2221, 1549, 1105, 771, 548, 364, 238, 151, 89, 50, 30, 0}, - { 16384, 16371, 16358, 16339, 16290, 16241, 16153, 16040, 15813, 15397, 14601, 13301, 11360, 8916, 6254, 3911, 2220, 1280, 755, 461, 278, 177, 111, 70, 35, 20, 12, 0}, - { 16384, 16375, 16359, 16333, 16286, 16243, 16154, 16024, 15771, 15380, 14712, 13537, 11742, 9425, 6872, 4378, 2327, 1197, 671, 412, 259, 145, 93, 52, 26, 13, 5, 0}, - { 16384, 16372, 16358, 16326, 16289, 16241, 16147, 16014, 15765, 15321, 14670, 13546, 11912, 9787, 7323, 4824, 2536, 1330, 731, 438, 258, 148, 86, 37, 22, 11, 2, 0}, - { 16384, 16376, 16364, 16344, 16315, 16272, 16219, 16119, 15910, 15620, 15100, 14254, 13063, 11489, 9413, 7100, 4738, 2751, 1584, 973, 597, 349, 201, 96, 47, 22, 9, 0}, - { 16384, 16364, 16340, 16312, 16288, 16237, 16166, 16026, 15756, 15390, 14833, 13870, 12627, 10998, 8985, 6893, 4720, 3048, 1860, 1131, 725, 449, 215, 111, 56, 34, 14, 0}, - { 16384, 16326, 16297, 16246, 16183, 16064, 15884, 15632, 15240, 14763, 14107, 13230, 12185, 10886, 9390, 7781, 6194, 4696, 3350, 2259, 1506, 975, 604, 356, 201, 106, 48, 0} - }, - { /* 13.2 kbs WB RF B*/ - { 16384, 16369, 16348, 16316, 16256, 16172, 16017, 15735, 15246, 14363, 13036, 11139, 8916, 6724, 4757, 3282, 2221, 1549, 1105, 771, 548, 364, 238, 151, 89, 50, 30, 0}, - { 16384, 16371, 16358, 16339, 16290, 16241, 16153, 16040, 15813, 15397, 14601, 13301, 11360, 8916, 6254, 3911, 2220, 1280, 755, 461, 278, 177, 111, 70, 35, 20, 12, 0}, - { 16384, 16375, 16359, 16333, 16286, 16243, 16154, 16024, 15771, 15380, 14712, 13537, 11742, 9425, 6872, 4378, 2327, 1197, 671, 412, 259, 145, 93, 52, 26, 13, 5, 0}, - { 16384, 16372, 16358, 16326, 16289, 16241, 16147, 16014, 15765, 15321, 14670, 13546, 11912, 9787, 7323, 4824, 2536, 1330, 731, 438, 258, 148, 86, 37, 22, 11, 2, 0}, - { 16384, 16376, 16364, 16344, 16315, 16272, 16219, 16119, 15910, 15620, 15100, 14254, 13063, 11489, 9413, 7100, 4738, 2751, 1584, 973, 597, 349, 201, 96, 47, 22, 9, 0}, - { 16384, 16364, 16340, 16312, 16288, 16237, 16166, 16026, 15756, 15390, 14833, 13870, 12627, 10998, 8985, 6893, 4720, 3048, 1860, 1131, 725, 449, 215, 111, 56, 34, 14, 0}, - { 16384, 16326, 16297, 16246, 16183, 16064, 15884, 15632, 15240, 14763, 14107, 13230, 12185, 10886, 9390, 7781, 6194, 4696, 3350, 2259, 1506, 975, 604, 356, 201, 106, 48, 0} - }, - { /* 9.6 kbs SWB B*/ - { 16384, 16359, 16349, 16331, 16300, 16236, 16112, 15894, 15480, 14691, 13257, 10996, 8168, 5357, 3193, 1864, 1098, 676, 426, 265, 173, 117, 81, 59, 45, 35, 26, 0}, - { 16384, 16374, 16370, 16367, 16362, 16348, 16325, 16283, 16204, 16058, 15715, 14980, 13521, 11144, 7972, 4702, 2366, 1063, 480, 241, 128, 71, 42, 22, 14, 9, 5, 0}, - { 16384, 16380, 16377, 16375, 16372, 16365, 16354, 16334, 16295, 16216, 16056, 15716, 15034, 13690, 11467, 8404, 5150, 2385, 908, 417, 199, 106, 62, 35, 21, 13, 7, 0}, - { 16384, 16378, 16376, 16373, 16368, 16360, 16346, 16318, 16267, 16173, 15991, 15644, 14932, 13623, 11575, 8688, 5224, 2309, 891, 393, 202, 103, 57, 34, 20, 11, 8, 0}, - { 16384, 16375, 16372, 16365, 16348, 16322, 16279, 16201, 16046, 15728, 15214, 14297, 12811, 10673, 7918, 4530, 2109, 978, 466, 234, 121, 72, 46, 31, 25, 17, 13, 0}, - { 16384, 16366, 16357, 16341, 16325, 16289, 16220, 16084, 15768, 15300, 14466, 13206, 11402, 9176, 6633, 4092, 2192, 1171, 592, 315, 179, 111, 74, 46, 31, 26, 18, 0}, - { 16384, 16301, 16266, 16211, 16140, 16045, 15889, 15652, 15358, 14883, 14192, 13119, 11753, 10181, 8445, 6708, 5023, 3449, 2226, 1375, 849, 516, 353, 231, 153, 107, 78, 0} - }, - { /* 13.2 kbs A */ - { 16384, 16359, 16349, 16331, 16300, 16236, 16112, 15894, 15480, 14691, 13257, 10996, 8168, 5357, 3193, 1864, 1098, 676, 426, 265, 173, 117, 81, 59, 45, 35, 26, 0}, - { 16384, 16374, 16370, 16367, 16362, 16348, 16325, 16283, 16204, 16058, 15715, 14980, 13521, 11144, 7972, 4702, 2366, 1063, 480, 241, 128, 71, 42, 22, 14, 9, 5, 0}, - { 16384, 16380, 16377, 16375, 16372, 16365, 16354, 16334, 16295, 16216, 16056, 15716, 15034, 13690, 11467, 8404, 5150, 2385, 908, 417, 199, 106, 62, 35, 21, 13, 7, 0}, - { 16384, 16378, 16376, 16373, 16368, 16360, 16346, 16318, 16267, 16173, 15991, 15644, 14932, 13623, 11575, 8688, 5224, 2309, 891, 393, 202, 103, 57, 34, 20, 11, 8, 0}, - { 16384, 16375, 16372, 16365, 16348, 16322, 16279, 16201, 16046, 15728, 15214, 14297, 12811, 10673, 7918, 4530, 2109, 978, 466, 234, 121, 72, 46, 31, 25, 17, 13, 0}, - { 16384, 16366, 16357, 16341, 16325, 16289, 16220, 16084, 15768, 15300, 14466, 13206, 11402, 9176, 6633, 4092, 2192, 1171, 592, 315, 179, 111, 74, 46, 31, 26, 18, 0}, - { 16384, 16301, 16266, 16211, 16140, 16045, 15889, 15652, 15358, 14883, 14192, 13119, 11753, 10181, 8445, 6708, 5023, 3449, 2226, 1375, 849, 516, 353, 231, 153, 107, 78, 0} - }, - { /* 13.2 kbs SWB RF B*/ - { 16384, 16359, 16349, 16331, 16300, 16236, 16112, 15894, 15480, 14691, 13257, 10996, 8168, 5357, 3193, 1864, 1098, 676, 426, 265, 173, 117, 81, 59, 45, 35, 26, 0}, - { 16384, 16374, 16370, 16367, 16362, 16348, 16325, 16283, 16204, 16058, 15715, 14980, 13521, 11144, 7972, 4702, 2366, 1063, 480, 241, 128, 71, 42, 22, 14, 9, 5, 0}, - { 16384, 16380, 16377, 16375, 16372, 16365, 16354, 16334, 16295, 16216, 16056, 15716, 15034, 13690, 11467, 8404, 5150, 2385, 908, 417, 199, 106, 62, 35, 21, 13, 7, 0}, - { 16384, 16378, 16376, 16373, 16368, 16360, 16346, 16318, 16267, 16173, 15991, 15644, 14932, 13623, 11575, 8688, 5224, 2309, 891, 393, 202, 103, 57, 34, 20, 11, 8, 0}, - { 16384, 16375, 16372, 16365, 16348, 16322, 16279, 16201, 16046, 15728, 15214, 14297, 12811, 10673, 7918, 4530, 2109, 978, 466, 234, 121, 72, 46, 31, 25, 17, 13, 0}, - { 16384, 16366, 16357, 16341, 16325, 16289, 16220, 16084, 15768, 15300, 14466, 13206, 11402, 9176, 6633, 4092, 2192, 1171, 592, 315, 179, 111, 74, 46, 31, 26, 18, 0}, - { 16384, 16301, 16266, 16211, 16140, 16045, 15889, 15652, 15358, 14883, 14192, 13119, 11753, 10181, 8445, 6708, 5023, 3449, 2226, 1375, 849, 516, 353, 231, 153, 107, 78, 0} - }, - { /* 16.4 kbs B */ - { 16384, 16359, 16349, 16331, 16300, 16236, 16112, 15894, 15480, 14691, 13257, 10996, 8168, 5357, 3193, 1864, 1098, 676, 426, 265, 173, 117, 81, 59, 45, 35, 26, 0}, - { 16384, 16374, 16370, 16367, 16362, 16348, 16325, 16283, 16204, 16058, 15715, 14980, 13521, 11144, 7972, 4702, 2366, 1063, 480, 241, 128, 71, 42, 22, 14, 9, 5, 0}, - { 16384, 16380, 16377, 16375, 16372, 16365, 16354, 16334, 16295, 16216, 16056, 15716, 15034, 13690, 11467, 8404, 5150, 2385, 908, 417, 199, 106, 62, 35, 21, 13, 7, 0}, - { 16384, 16378, 16376, 16373, 16368, 16360, 16346, 16318, 16267, 16173, 15991, 15644, 14932, 13623, 11575, 8688, 5224, 2309, 891, 393, 202, 103, 57, 34, 20, 11, 8, 0}, - { 16384, 16375, 16372, 16365, 16348, 16322, 16279, 16201, 16046, 15728, 15214, 14297, 12811, 10673, 7918, 4530, 2109, 978, 466, 234, 121, 72, 46, 31, 25, 17, 13, 0}, - { 16384, 16366, 16357, 16341, 16325, 16289, 16220, 16084, 15768, 15300, 14466, 13206, 11402, 9176, 6633, 4092, 2192, 1171, 592, 315, 179, 111, 74, 46, 31, 26, 18, 0}, - { 16384, 16301, 16266, 16211, 16140, 16045, 15889, 15652, 15358, 14883, 14192, 13119, 11753, 10181, 8445, 6708, 5023, 3449, 2226, 1375, 849, 516, 353, 231, 153, 107, 78, 0} - }, - { /* 24.4 kbs B */ - { 16384, 16351, 16333, 16303, 16254, 16163, 15993, 15681, 15080, 13987, 12109, 9465, 6588, 4160, 2488, 1480, 912, 589, 389, 266, 190, 131, 93, 68, 47, 34, 24, 0}, - { 16384, 16379, 16375, 16369, 16360, 16345, 16328, 16286, 16211, 16078, 15810, 15233, 14058, 11933, 8881, 5609, 2940, 1290, 558, 274, 150, 80, 47, 29, 17, 11, 6, 0}, - { 16384, 16382, 16380, 16377, 16370, 16358, 16337, 16300, 16224, 16088, 15811, 15233, 14112, 12019, 9061, 5723, 2780, 1121, 480, 239, 123, 69, 41, 22, 13, 8, 5, 0}, - { 16384, 16377, 16375, 16369, 16363, 16351, 16325, 16268, 16172, 16009, 15686, 15039, 13830, 11799, 8924, 5422, 2444, 960, 441, 220, 111, 63, 37, 22, 11, 6, 3, 0}, - { 16384, 16374, 16369, 16363, 16356, 16335, 16290, 16214, 16068, 15826, 15382, 14550, 13126, 10956, 8000, 4622, 2090, 973, 478, 249, 128, 75, 42, 19, 13, 7, 4, 0}, - { 16384, 16375, 16370, 16367, 16362, 16340, 16298, 16232, 16097, 15860, 15440, 14718, 13570, 11874, 9557, 6790, 4053, 2166, 1150, 622, 323, 179, 96, 53, 33, 17, 12, 0}, - { 16384, 16335, 16304, 16276, 16228, 16166, 16094, 15983, 15775, 15501, 15040, 14417, 13552, 12326, 10847, 9117, 7308, 5373, 3666, 2297, 1336, 807, 495, 313, 216, 152, 114, 0} - }, - { /* 32.0 kbs A */ - { 16384, 16351, 16333, 16303, 16254, 16163, 15993, 15681, 15080, 13987, 12109, 9465, 6588, 4160, 2488, 1480, 912, 589, 389, 266, 190, 131, 93, 68, 47, 34, 24, 0}, - { 16384, 16379, 16375, 16369, 16360, 16345, 16328, 16286, 16211, 16078, 15810, 15233, 14058, 11933, 8881, 5609, 2940, 1290, 558, 274, 150, 80, 47, 29, 17, 11, 6, 0}, - { 16384, 16382, 16380, 16377, 16370, 16358, 16337, 16300, 16224, 16088, 15811, 15233, 14112, 12019, 9061, 5723, 2780, 1121, 480, 239, 123, 69, 41, 22, 13, 8, 5, 0}, - { 16384, 16377, 16375, 16369, 16363, 16351, 16325, 16268, 16172, 16009, 15686, 15039, 13830, 11799, 8924, 5422, 2444, 960, 441, 220, 111, 63, 37, 22, 11, 6, 3, 0}, - { 16384, 16374, 16369, 16363, 16356, 16335, 16290, 16214, 16068, 15826, 15382, 14550, 13126, 10956, 8000, 4622, 2090, 973, 478, 249, 128, 75, 42, 19, 13, 7, 4, 0}, - { 16384, 16375, 16370, 16367, 16362, 16340, 16298, 16232, 16097, 15860, 15440, 14718, 13570, 11874, 9557, 6790, 4053, 2166, 1150, 622, 323, 179, 96, 53, 33, 17, 12, 0}, - { 16384, 16335, 16304, 16276, 16228, 16166, 16094, 15983, 15775, 15501, 15040, 14417, 13552, 12326, 10847, 9117, 7308, 5373, 3666, 2297, 1336, 807, 495, 313, 216, 152, 114, 0} - }, - { /* 48.0 kbs B */ - { 16384, 16334, 16310, 16285, 16254, 16204, 16128, 16031, 15903, 15697, 15380, 14820, 13857, 12267, 9878, 7099, 4509, 2576, 1478, 871, 531, 349, 230, 163, 111, 80, 62, 0}, - { 16384, 16337, 16327, 16307, 16278, 16239, 16178, 16092, 15947, 15719, 15286, 14428, 12833, 10246, 7123, 4088, 1896, 849, 481, 287, 190, 139, 94, 66, 52, 34, 24, 0}, - { 16384, 16352, 16341, 16329, 16312, 16295, 16265, 16223, 16151, 16026, 15825, 15437, 14645, 13089, 10612, 7364, 4077, 1783, 779, 444, 281, 192, 138, 93, 65, 43, 30, 0}, - { 16384, 16354, 16347, 16337, 16314, 16284, 16233, 16165, 16051, 15847, 15450, 14621, 13069, 10623, 7298, 3789, 1569, 727, 445, 302, 207, 143, 96, 59, 36, 18, 9, 0}, - { 16384, 16352, 16342, 16330, 16314, 16295, 16266, 16215, 16127, 15984, 15709, 15190, 14242, 12540, 9979, 6448, 3160, 1392, 752, 481, 344, 251, 169, 115, 73, 28, 8, 0}, - { 16384, 16340, 16320, 16302, 16272, 16257, 16220, 16135, 16011, 15784, 15370, 14688, 13423, 11457, 8721, 5529, 2736, 1375, 784, 525, 353, 263, 172, 113, 78, 26, 11, 0}, - { 16384, 16238, 16170, 16113, 16077, 16030, 16000, 15948, 15873, 15752, 15535, 15157, 14595, 13788, 12569, 10767, 8611, 6186, 4101, 2459, 1478, 881, 607, 385, 243, 168, 116, 0} - }, - { /* 64.0 kbs B */ - { 16384, 16334, 16310, 16285, 16254, 16204, 16128, 16031, 15903, 15697, 15380, 14820, 13857, 12267, 9878, 7099, 4509, 2576, 1478, 871, 531, 349, 230, 163, 111, 80, 62, 0}, - { 16384, 16337, 16327, 16307, 16278, 16239, 16178, 16092, 15947, 15719, 15286, 14428, 12833, 10246, 7123, 4088, 1896, 849, 481, 287, 190, 139, 94, 66, 52, 34, 24, 0}, - { 16384, 16352, 16341, 16329, 16312, 16295, 16265, 16223, 16151, 16026, 15825, 15437, 14645, 13089, 10612, 7364, 4077, 1783, 779, 444, 281, 192, 138, 93, 65, 43, 30, 0}, - { 16384, 16354, 16347, 16337, 16314, 16284, 16233, 16165, 16051, 15847, 15450, 14621, 13069, 10623, 7298, 3789, 1569, 727, 445, 302, 207, 143, 96, 59, 36, 18, 9, 0}, - { 16384, 16352, 16342, 16330, 16314, 16295, 16266, 16215, 16127, 15984, 15709, 15190, 14242, 12540, 9979, 6448, 3160, 1392, 752, 481, 344, 251, 169, 115, 73, 28, 8, 0}, - { 16384, 16340, 16320, 16302, 16272, 16257, 16220, 16135, 16011, 15784, 15370, 14688, 13423, 11457, 8721, 5529, 2736, 1375, 784, 525, 353, 263, 172, 113, 78, 26, 11, 0}, - { 16384, 16238, 16170, 16113, 16077, 16030, 16000, 15948, 15873, 15752, 15535, 15157, 14595, 13788, 12569, 10767, 8611, 6186, 4101, 2459, 1478, 881, 607, 385, 243, 168, 116, 0} - } -}; - -/* only needed for >= 48 kbps */ - -const UWord16 cf_se10_tab[IGF_SYMBOLS_IN_TABLE + 1] = // Q0 -{ - 16384, 15493, 15154, 14810, 14331, 13701, 13086, 12403, 11585, 10923, 10293, 9631, 8943, 8385, 7760, 7182, 6593, 6009, 5540, 5082, 4571, 4133, 3711, 3299, 2887, 2460, 2043, 0 -}; - -const UWord16 cf_se11_tab[IGF_CTX_COUNT][IGF_CTX_COUNT][IGF_SYMBOLS_IN_TABLE + 1] = // Q0 -{ - { - { 16384, 16313, 16312, 16241, 16206, 16099, 15957, 15386, 14601, 12852, 10282, 7534, 4964, 2966, 1824, 896, 504, 255, 113, 112, 41, 40, 39, 38, 37, 36, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16207, 16206, 16205, 16120, 15949, 14663, 12777, 9947, 6860, 3773, 1972, 772, 430, 259, 174, 89, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16115, 15941, 14891, 12965, 11477, 8587, 5347, 3421, 1407, 620, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16254, 16253, 16004, 15005, 13756, 12006, 9256, 5755, 3755, 1755, 756, 132, 131, 130, 129, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 15964, 15550, 14929, 12856, 9954, 6430, 2906, 1456, 1042, 628, 214, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16087, 15503, 14334, 14333, 11994, 10240, 8193, 5268, 2929, 1760, 1176, 299, 298, 297, 296, 295, 294, 293, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 14922, 13467, 10919, 9464, 7280, 6189, 3641, 2914, 2187, 1824, 1823, 1096, 369, 368, 367, 4, 3, 2, 1, 0} - }, - { - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16238, 16237, 15678, 15399, 14840, 13441, 11341, 8681, 6161, 3781, 2522, 702, 283, 144, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 16374, 15693, 14671, 12625, 7507, 4778, 2390, 1368, 1028, 347, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 16374, 15595, 13776, 9877, 6498, 3639, 3120, 1561, 1042, 523, 265, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 15709, 13704, 12702, 11032, 7355, 3010, 1340, 1007, 674, 341, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 16374, 12816, 10683, 7125, 2854, 720, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 12738, 12737, 10920, 9103, 5466, 1828, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 15359, 15358, 14337, 14336, 14335, 14334, 14333, 10240, 7170, 5124, 2054, 1032, 1031, 1030, 1029, 7, 6, 5, 4, 3, 2, 1, 0} - }, - { - { 16384, 16383, 16382, 16107, 16106, 16105, 16104, 16103, 15966, 15965, 15690, 15140, 14315, 12939, 10324, 8122, 4956, 2479, 1654, 966, 691, 416, 141, 140, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 15320, 14265, 12945, 10568, 8984, 6343, 4230, 1853, 797, 270, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16112, 16111, 16110, 15037, 14501, 12622, 11012, 7790, 5374, 3226, 1347, 542, 275, 274, 273, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 15597, 14819, 12090, 7021, 4292, 1953, 1175, 787, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 15935, 14165, 12838, 9297, 6641, 3985, 1772, 1331, 890, 449, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 14740, 13923, 9010, 6555, 4100, 2464, 828, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 13104, 13103, 8192, 4920, 1647, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} - }, - { - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16077, 16076, 16075, 15926, 15176, 14425, 10819, 7664, 5711, 2856, 1354, 754, 454, 154, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16044, 16043, 14373, 12369, 10030, 7023, 5019, 1677, 676, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16077, 16076, 16075, 15470, 14258, 12743, 11531, 6375, 3040, 3039, 917, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 15309, 13531, 11396, 7480, 3564, 1786, 364, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 15833, 15289, 13652, 10377, 6556, 3827, 3283, 1646, 555, 554, 553, 552, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 14146, 13404, 13403, 13402, 10425, 7448, 3727, 2240, 2239, 752, 751, 750, 749, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 15562, 14745, 13928, 10653, 7378, 5742, 2467, 830, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} - }, - { - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 16219, 15590, 14803, 13544, 11339, 9292, 6930, 4568, 2521, 1419, 790, 318, 161, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16014, 15652, 14925, 14198, 12743, 10196, 5464, 3645, 1826, 371, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16050, 15396, 15395, 12447, 10810, 8518, 4915, 2950, 1313, 659, 333, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 14792, 14001, 11096, 8455, 6079, 3174, 2119, 535, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 15796, 15795, 15794, 15793, 11700, 8777, 6439, 4101, 1178, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 15473, 15472, 15471, 14563, 13655, 12746, 10017, 7288, 6379, 6378, 4559, 1830, 1829, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 15723, 15069, 13105, 9174, 7865, 3934, 3280, 1971, 1317, 663, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} - }, - { - { 16384, 16383, 16382, 16381, 16232, 16231, 16230, 16229, 16228, 16227, 16078, 15628, 15329, 13977, 12325, 10222, 5413, 4212, 1959, 908, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16109, 15842, 15841, 13694, 11815, 10205, 5640, 3493, 2151, 1347, 543, 542, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16168, 14699, 13650, 11761, 9452, 6093, 3784, 1685, 636, 427, 426, 425, 424, 423, 422, 421, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16122, 15611, 14332, 13053, 10238, 7423, 4608, 2561, 2050, 1027, 516, 515, 260, 259, 258, 257, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 15207, 13649, 10531, 6632, 3514, 1176, 398, 397, 396, 395, 394, 393, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 15749, 15120, 12601, 10082, 8823, 6304, 3785, 3156, 1267, 638, 637, 636, 7, 6, 5, 4, 3, 2, 1, 0}, - { 16384, 16383, 15729, 15728, 15727, 15726, 15725, 15071, 14417, 12453, 10489, 8525, 5905, 1975, 1321, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} - }, - { - { 16384, 16383, 16372, 16340, 16339, 16328, 16285, 16253, 16136, 15923, 15614, 14931, 13833, 12201, 10175, 7615, 5269, 3243, 2123, 1142, 673, 342, 182, 150, 86, 54, 11, 0}, - { 16384, 16383, 16366, 16349, 16332, 16331, 16314, 16245, 16244, 16141, 15813, 15451, 14105, 12672, 9910, 7113, 4472, 2590, 1071, 484, 294, 156, 53, 36, 19, 18, 1, 0}, - { 16384, 16383, 16382, 16369, 16355, 16341, 16271, 16117, 15921, 15627, 14772, 13089, 10929, 8334, 5487, 3299, 1644, 999, 424, 228, 88, 46, 18, 17, 16, 15, 14, 0}, - { 16384, 16367, 16366, 16365, 16364, 16363, 16259, 16173, 15809, 15028, 13951, 12214, 9278, 6203, 3719, 2052, 1079, 402, 194, 125, 56, 22, 21, 20, 3, 2, 1, 0}, - { 16384, 16383, 16360, 16359, 16358, 16357, 16356, 16333, 16332, 16143, 15954, 15434, 14227, 12262, 9540, 6652, 3882, 1988, 1207, 829, 427, 191, 73, 50, 49, 2, 1, 0}, - { 16384, 16383, 16382, 16381, 16380, 16296, 16254, 15748, 14862, 13427, 11189, 8487, 5278, 3252, 2028, 1099, 551, 340, 298, 214, 172, 88, 46, 45, 3, 2, 1, 0}, - { 16384, 16383, 16307, 16269, 16231, 16230, 16077, 15886, 15464, 14620, 13546, 11896, 9671, 7024, 4338, 2382, 1423, 809, 541, 311, 158, 43, 5, 4, 3, 2, 1, 0} - } -}; - -const IGF_MODE igfMode[IGF_BITRATE_UNKNOWN] = -{ - /* sampleRate, frameLength, igfMinFq, maxHopsize */ - { 16000, 320, 774, 4 }, /* 9.6kbs WB 0 */ - { 16000, 320, 774, 4 }, /* 13.2kbs WB RF 1 */ - { 32000, 640, 800, 2 }, /* 9.6kbs SWB 2 */ - { 32000, 640, 800, 4 }, /* 13.2kbs SWB 3 */ - { 32000, 640, 800, 2 }, /* 13.2kbs SWB RF 4 */ - { 32000, 640, 800, 4 }, /* 16.4kbs SWB 5 */ - { 32000, 640, 800, 4 }, /* 24.4kbs SWB 6 */ - { 32000, 640, 800, 4 }, /* 32.0kbs SWB 7 */ - { 32000, 640, 1600, 4 }, /* 48.0kbs SWB 8 */ - { 32000, 640, 1600, 4 }, /* 64.0kbs SWB 9 */ - { 48000, 960, 800, 4 }, /* 16.4kbs FB 10 */ - { 48000, 960, 800, 2 }, /* 24.4kbs FB 11 */ - { 48000, 960, 800, 2 }, /* 32.0kbs FB 12 */ - { 48000, 960, 1600, 2 }, /* 48.0kbs FB 13 */ - { 48000, 960, 1600, 2 }, /* 64.0kbs FB 14 */ - { 48000, 960, 1600, 1 }, /* 96.0kbs FB 15 */ - { 48000, 960, 1600, 1 }, /*128.0kbs FB 16 */ - { 16000, 320, 800, 2 }, /* 13.2kbs WB CPE 17 */ /* stereo mode */ - { 16000, 320, 800, 2 }, /* 16.4kbs WB CPE 18 */ /* stereo mode */ - { 32000, 640, 800, 2 }, /* 13.2kbs SWB CPE 19 */ /* stereo mode */ - { 32000, 640, 800, 2 }, /* 16.4kbs SWB CPE 20 */ /* stereo mode */ - { 32000, 640, 800, 2 }, /* 24.4kbs SWB CPE 21 */ /* stereo mode */ - { 32000, 640, 800, 2 }, /* 32.0kbs SWB CPE 22 */ /* stereo mode */ - { 32000, 640, 1200, 2 }, /* 48.0kbs SWB CPE 23 */ /* stereo mode */ - { 32000, 640, 1200, 2 }, /* 48.0kbs SWB CPE 24 */ /* stereo TCX10 mode */ - { 32000, 640, 1200, 2 }, /* 64.0kbs SWB CPE 25 */ /* stereo mode */ - { 32000, 640, 1600, 2 }, /* 80.0kbs SWB CPE 26 */ /* stereo mode */ - { 32000, 640, 1600, 4 }, /* 96.0kbs SWB CPE 27 */ /* stereo mode */ - { 48000, 960, 800, 2 }, /* 24.4kbs FB CPE 28 */ /* stereo mode */ - { 48000, 960, 800, 2 }, /* 32.0kbs FB CPE 29 */ /* stereo mode */ - { 48000, 960, 1200, 2 }, /* 48.0kbs FB CPE 30 */ /* stereo mode */ - { 48000, 960, 1200, 2 }, /* 48.0kbs FB CPE 31 */ /* stereo TCX10 mode */ - { 48000, 960, 1200, 2 }, /* 64.0kbs FB CPE 32 */ /* stereo mode */ - { 48000, 960, 1600, 2 }, /* 80.0kbs FB CPE 33 */ /* stereo mode */ - { 48000, 960, 1600, 1 }, /* 96.0kbs FB CPE 34 */ /* stereo mode */ - { 48000, 960, 1600, 1 } /*128.0kbs FB CPE 35 */ /* stereo mode */ -}; - -#define STCP( a, b ) {{ WORD322WORD16( a ), WORD322WORD16( b ) }} - -const PWord16 SineTable512_fx[] =//Q15 -{ - STCP(0x7fffffff, 0x00000000), STCP(0x7fffd886, 0x006487e3), STCP(0x7fff6216, 0x00c90f88), STCP(0x7ffe9cb2, 0x012d96b1), - STCP(0x7ffd885a, 0x01921d20), STCP(0x7ffc250f, 0x01f6a297), STCP(0x7ffa72d1, 0x025b26d7), STCP(0x7ff871a2, 0x02bfa9a4), - STCP(0x7ff62182, 0x03242abf), STCP(0x7ff38274, 0x0388a9ea), STCP(0x7ff09478, 0x03ed26e6), STCP(0x7fed5791, 0x0451a177), - STCP(0x7fe9cbc0, 0x04b6195d), STCP(0x7fe5f108, 0x051a8e5c), STCP(0x7fe1c76b, 0x057f0035), STCP(0x7fdd4eec, 0x05e36ea9), - STCP(0x7fd8878e, 0x0647d97c), STCP(0x7fd37153, 0x06ac406f), STCP(0x7fce0c3e, 0x0710a345), STCP(0x7fc85854, 0x077501be), - STCP(0x7fc25596, 0x07d95b9e), STCP(0x7fbc040a, 0x083db0a7), STCP(0x7fb563b3, 0x08a2009a), STCP(0x7fae7495, 0x09064b3a), - STCP(0x7fa736b4, 0x096a9049), STCP(0x7f9faa15, 0x09cecf89), STCP(0x7f97cebd, 0x0a3308bd), STCP(0x7f8fa4b0, 0x0a973ba5), - STCP(0x7f872bf3, 0x0afb6805), STCP(0x7f7e648c, 0x0b5f8d9f), STCP(0x7f754e80, 0x0bc3ac35), STCP(0x7f6be9d4, 0x0c27c389), - STCP(0x7f62368f, 0x0c8bd35e), STCP(0x7f5834b7, 0x0cefdb76), STCP(0x7f4de451, 0x0d53db92), STCP(0x7f434563, 0x0db7d376), - STCP(0x7f3857f6, 0x0e1bc2e4), STCP(0x7f2d1c0e, 0x0e7fa99e), STCP(0x7f2191b4, 0x0ee38766), STCP(0x7f15b8ee, 0x0f475bff), - STCP(0x7f0991c4, 0x0fab272b), STCP(0x7efd1c3c, 0x100ee8ad), STCP(0x7ef05860, 0x1072a048), STCP(0x7ee34636, 0x10d64dbd), - STCP(0x7ed5e5c6, 0x1139f0cf), STCP(0x7ec8371a, 0x119d8941), STCP(0x7eba3a39, 0x120116d5), STCP(0x7eabef2c, 0x1264994e), - STCP(0x7e9d55fc, 0x12c8106f), STCP(0x7e8e6eb2, 0x132b7bf9), STCP(0x7e7f3957, 0x138edbb1), STCP(0x7e6fb5f4, 0x13f22f58), - STCP(0x7e5fe493, 0x145576b1), STCP(0x7e4fc53e, 0x14b8b17f), STCP(0x7e3f57ff, 0x151bdf86), STCP(0x7e2e9cdf, 0x157f0086), - STCP(0x7e1d93ea, 0x15e21445), STCP(0x7e0c3d29, 0x16451a83), STCP(0x7dfa98a8, 0x16a81305), STCP(0x7de8a670, 0x170afd8d), - STCP(0x7dd6668f, 0x176dd9de), STCP(0x7dc3d90d, 0x17d0a7bc), STCP(0x7db0fdf8, 0x183366e9), STCP(0x7d9dd55a, 0x18961728), - STCP(0x7d8a5f40, 0x18f8b83c), STCP(0x7d769bb5, 0x195b49ea), STCP(0x7d628ac6, 0x19bdcbf3), STCP(0x7d4e2c7f, 0x1a203e1b), - STCP(0x7d3980ec, 0x1a82a026), STCP(0x7d24881b, 0x1ae4f1d6), STCP(0x7d0f4218, 0x1b4732ef), STCP(0x7cf9aef0, 0x1ba96335), - STCP(0x7ce3ceb2, 0x1c0b826a), STCP(0x7ccda169, 0x1c6d9053), STCP(0x7cb72724, 0x1ccf8cb3), STCP(0x7ca05ff1, 0x1d31774d), - STCP(0x7c894bde, 0x1d934fe5), STCP(0x7c71eaf9, 0x1df5163f), STCP(0x7c5a3d50, 0x1e56ca1e), STCP(0x7c4242f2, 0x1eb86b46), - STCP(0x7c29fbee, 0x1f19f97b), STCP(0x7c116853, 0x1f7b7481), STCP(0x7bf88830, 0x1fdcdc1b), STCP(0x7bdf5b94, 0x203e300d), - STCP(0x7bc5e290, 0x209f701c), STCP(0x7bac1d31, 0x21009c0c), STCP(0x7b920b89, 0x2161b3a0), STCP(0x7b77ada8, 0x21c2b69c), - STCP(0x7b5d039e, 0x2223a4c5), STCP(0x7b420d7a, 0x22847de0), STCP(0x7b26cb4f, 0x22e541af), STCP(0x7b0b3d2c, 0x2345eff8), - STCP(0x7aef6323, 0x23a6887f), STCP(0x7ad33d45, 0x24070b08), STCP(0x7ab6cba4, 0x24677758), STCP(0x7a9a0e50, 0x24c7cd33), - STCP(0x7a7d055b, 0x25280c5e), STCP(0x7a5fb0d8, 0x2588349d), STCP(0x7a4210d8, 0x25e845b6), STCP(0x7a24256f, 0x26483f6c), - STCP(0x7a05eead, 0x26a82186), STCP(0x79e76ca7, 0x2707ebc7), STCP(0x79c89f6e, 0x27679df4), STCP(0x79a98715, 0x27c737d3), - STCP(0x798a23b1, 0x2826b928), STCP(0x796a7554, 0x288621b9), STCP(0x794a7c12, 0x28e5714b), STCP(0x792a37fe, 0x2944a7a2), - STCP(0x7909a92d, 0x29a3c485), STCP(0x78e8cfb2, 0x2a02c7b8), STCP(0x78c7aba2, 0x2a61b101), STCP(0x78a63d11, 0x2ac08026), - STCP(0x78848414, 0x2b1f34eb), STCP(0x786280bf, 0x2b7dcf17), STCP(0x78403329, 0x2bdc4e6f), STCP(0x781d9b65, 0x2c3ab2b9), - STCP(0x77fab989, 0x2c98fbba), STCP(0x77d78daa, 0x2cf72939), STCP(0x77b417df, 0x2d553afc), STCP(0x7790583e, 0x2db330c7), - STCP(0x776c4edb, 0x2e110a62), STCP(0x7747fbce, 0x2e6ec792), STCP(0x77235f2d, 0x2ecc681e), STCP(0x76fe790e, 0x2f29ebcc), - STCP(0x76d94989, 0x2f875262), STCP(0x76b3d0b4, 0x2fe49ba7), STCP(0x768e0ea6, 0x3041c761), STCP(0x76680376, 0x309ed556), - STCP(0x7641af3d, 0x30fbc54d), STCP(0x761b1211, 0x3158970e), STCP(0x75f42c0b, 0x31b54a5e), STCP(0x75ccfd42, 0x3211df04), - STCP(0x75a585cf, 0x326e54c7), STCP(0x757dc5ca, 0x32caab6f), STCP(0x7555bd4c, 0x3326e2c3), STCP(0x752d6c6c, 0x3382fa88), - STCP(0x7504d345, 0x33def287), STCP(0x74dbf1ef, 0x343aca87), STCP(0x74b2c884, 0x34968250), STCP(0x7489571c, 0x34f219a8), - STCP(0x745f9dd1, 0x354d9057), STCP(0x74359cbd, 0x35a8e625), STCP(0x740b53fb, 0x36041ad9), STCP(0x73e0c3a3, 0x365f2e3b), - STCP(0x73b5ebd1, 0x36ba2014), STCP(0x738acc9e, 0x3714f02a), STCP(0x735f6626, 0x376f9e46), STCP(0x7333b883, 0x37ca2a30), - STCP(0x7307c3d0, 0x382493b0), STCP(0x72db8828, 0x387eda8e), STCP(0x72af05a7, 0x38d8fe93), STCP(0x72823c67, 0x3932ff87), - STCP(0x72552c85, 0x398cdd32), STCP(0x7227d61c, 0x39e6975e), STCP(0x71fa3949, 0x3a402dd2), STCP(0x71cc5626, 0x3a99a057), - STCP(0x719e2cd2, 0x3af2eeb7), STCP(0x716fbd68, 0x3b4c18ba), STCP(0x71410805, 0x3ba51e29), STCP(0x71120cc5, 0x3bfdfecd), - STCP(0x70e2cbc6, 0x3c56ba70), STCP(0x70b34525, 0x3caf50da), STCP(0x708378ff, 0x3d07c1d6), STCP(0x70536771, 0x3d600d2c), - STCP(0x7023109a, 0x3db832a6), STCP(0x6ff27497, 0x3e10320d), STCP(0x6fc19385, 0x3e680b2c), STCP(0x6f906d84, 0x3ebfbdcd), - STCP(0x6f5f02b2, 0x3f1749b8), STCP(0x6f2d532c, 0x3f6eaeb8), STCP(0x6efb5f12, 0x3fc5ec98), STCP(0x6ec92683, 0x401d0321), - STCP(0x6e96a99d, 0x4073f21d), STCP(0x6e63e87f, 0x40cab958), STCP(0x6e30e34a, 0x4121589b), STCP(0x6dfd9a1c, 0x4177cfb1), - STCP(0x6dca0d14, 0x41ce1e65), STCP(0x6d963c54, 0x42244481), STCP(0x6d6227fa, 0x427a41d0), STCP(0x6d2dd027, 0x42d0161e), - STCP(0x6cf934fc, 0x4325c135), STCP(0x6cc45698, 0x437b42e1), STCP(0x6c8f351c, 0x43d09aed), STCP(0x6c59d0a9, 0x4425c923), - STCP(0x6c242960, 0x447acd50), STCP(0x6bee3f62, 0x44cfa740), STCP(0x6bb812d1, 0x452456bd), STCP(0x6b81a3cd, 0x4578db93), - STCP(0x6b4af279, 0x45cd358f), STCP(0x6b13fef5, 0x4621647d), STCP(0x6adcc964, 0x46756828), STCP(0x6aa551e9, 0x46c9405c), - STCP(0x6a6d98a4, 0x471cece7), STCP(0x6a359db9, 0x47706d93), STCP(0x69fd614a, 0x47c3c22f), STCP(0x69c4e37a, 0x4816ea86), - STCP(0x698c246c, 0x4869e665), STCP(0x69532442, 0x48bcb599), STCP(0x6919e320, 0x490f57ee), STCP(0x68e06129, 0x4961cd33), - STCP(0x68a69e81, 0x49b41533), STCP(0x686c9b4b, 0x4a062fbd), STCP(0x683257ab, 0x4a581c9e), STCP(0x67f7d3c5, 0x4aa9dba2), - STCP(0x67bd0fbd, 0x4afb6c98), STCP(0x67820bb7, 0x4b4ccf4d), STCP(0x6746c7d8, 0x4b9e0390), STCP(0x670b4444, 0x4bef092d), - STCP(0x66cf8120, 0x4c3fdff4), STCP(0x66937e91, 0x4c9087b1), STCP(0x66573cbb, 0x4ce10034), STCP(0x661abbc5, 0x4d31494b), - STCP(0x65ddfbd3, 0x4d8162c4), STCP(0x65a0fd0b, 0x4dd14c6e), STCP(0x6563bf92, 0x4e210617), STCP(0x6526438f, 0x4e708f8f), - STCP(0x64e88926, 0x4ebfe8a5), STCP(0x64aa907f, 0x4f0f1126), STCP(0x646c59bf, 0x4f5e08e3), STCP(0x642de50d, 0x4faccfab), - STCP(0x63ef3290, 0x4ffb654d), STCP(0x63b0426d, 0x5049c999), STCP(0x637114cc, 0x5097fc5e), STCP(0x6331a9d4, 0x50e5fd6d), - STCP(0x62f201ac, 0x5133cc94), STCP(0x62b21c7b, 0x518169a5), STCP(0x6271fa69, 0x51ced46e), STCP(0x62319b9d, 0x521c0cc2), - STCP(0x61f1003f, 0x5269126e), STCP(0x61b02876, 0x52b5e546), STCP(0x616f146c, 0x53028518), STCP(0x612dc447, 0x534ef1b5), - STCP(0x60ec3830, 0x539b2af0), STCP(0x60aa7050, 0x53e73097), STCP(0x60686ccf, 0x5433027d), STCP(0x60262dd6, 0x547ea073), - STCP(0x5fe3b38d, 0x54ca0a4b), STCP(0x5fa0fe1f, 0x55153fd4), STCP(0x5f5e0db3, 0x556040e2), STCP(0x5f1ae274, 0x55ab0d46), - STCP(0x5ed77c8a, 0x55f5a4d2), STCP(0x5e93dc1f, 0x56400758), STCP(0x5e50015d, 0x568a34a9), STCP(0x5e0bec6e, 0x56d42c99), - STCP(0x5dc79d7c, 0x571deefa), STCP(0x5d8314b1, 0x57677b9d), STCP(0x5d3e5237, 0x57b0d256), STCP(0x5cf95638, 0x57f9f2f8), - STCP(0x5cb420e0, 0x5842dd54), STCP(0x5c6eb258, 0x588b9140), STCP(0x5c290acc, 0x58d40e8c), STCP(0x5be32a67, 0x591c550e), - STCP(0x5b9d1154, 0x59646498), STCP(0x5b56bfbd, 0x59ac3cfd), STCP(0x5b1035cf, 0x59f3de12), STCP(0x5ac973b5, 0x5a3b47ab), - STCP(0x5a82799a, 0x5a82799a) -}; - -/* Lookup-Table for binary logarithm */ -const Word16 ldCoeff[7] =//Q15 -{ - -32768, -16384, -10923, -8192, -6554, -5461, -4681 - /* -4096, -3641, -3277 */ -}; - -/* Lookup-Table for binary power algorithm */ -/* This table is used for lookup 2^x with x in range [0...1.0[ in steps of 1/32 */ -const UWord32 exp2_tab_long[32] =//Q31 -{ - 0x40000000,0x4166C34C,0x42D561B4,0x444C0740, - 0x45CAE0F2,0x47521CC6,0x48E1E9BA,0x4A7A77D4, - 0x4C1BF829,0x4DC69CDD,0x4F7A9930,0x51382182, - 0x52FF6B55,0x54D0AD5A,0x56AC1F75,0x5891FAC1, - 0x5A82799A,0x5C7DD7A4,0x5E8451D0,0x60962665, - 0x62B39509,0x64DCDEC3,0x6712460B,0x69540EC9, - 0x6BA27E65,0x6DFDDBCC,0x70666F76,0x72DC8374, - 0x75606374,0x77F25CCE,0x7A92BE8B,0x7D41D96E -}; - -/* Lookup-Table for binary power algorithm */ -/* This table is used for lookup 2^x with x in range [0...1/32[ in steps of 1/1024 */ -const UWord32 exp2w_tab_long[32] =//Q31 -{ - 0x40000000,0x400B1818,0x4016321B,0x40214E0C, - 0x402C6BE9,0x40378BB4,0x4042AD6D,0x404DD113, - 0x4058F6A8,0x40641E2B,0x406F479E,0x407A7300, - 0x4085A051,0x4090CF92,0x409C00C4,0x40A733E6, - 0x40B268FA,0x40BD9FFF,0x40C8D8F5,0x40D413DD, - 0x40DF50B8,0x40EA8F86,0x40F5D046,0x410112FA, - 0x410C57A2,0x41179E3D,0x4122E6CD,0x412E3152, - 0x41397DCC,0x4144CC3B,0x41501CA0,0x415B6EFB -}; - -/* Lookup-Table for binary power algorithm */ -/* This table is used for lookup 2^x with x in range [0...1/1024[ in steps of 1/32768 */ -const UWord32 exp2x_tab_long[32] =//Q31 -{ - 0x40000000,0x400058B9,0x4000B173,0x40010A2D, - 0x400162E8,0x4001BBA3,0x4002145F,0x40026D1B, - 0x4002C5D8,0x40031E95,0x40037752,0x4003D011, - 0x400428CF,0x4004818E,0x4004DA4E,0x4005330E, - 0x40058BCE,0x4005E48F,0x40063D51,0x40069613, - 0x4006EED5,0x40074798,0x4007A05B,0x4007F91F, - 0x400851E4,0x4008AAA8,0x4009036E,0x40095C33, - 0x4009B4FA,0x400A0DC0,0x400A6688,0x400ABF4F -}; - -/* square root tables */ -const Word32 SqrtTable[32] = /* Q31 */ -{ - 0x5A82D429, 0x5BEA10FE, 0x5D4BE6E5, 0x5EA89270, 0x60004BE2, 0x615347A1, 0x62A1B68C, 0x63EBC651, - 0x6531A1B5, 0x667370D4, 0x67B1595F, 0x68EB7EC8, 0x6A220277, 0x6B5503F0, 0x6C84A0F9, 0x6DB0F5BD, - 0x6EDA1CE9, 0x70002FC7, 0x7123465A, 0x72437773, 0x7360D8C5, 0x747B7EFA, 0x75937DC4, 0x76A8E7EB, - 0x77BBCF60, 0x78CC4545, 0x79DA5A00, 0x7AE61D3E, 0x7BEF9E07, 0x7CF6EAC2, 0x7DFC113F, 0x7EFF1EC0 -}; - -const Word16 SqrtDiffTable[32] = /* Q15 */ -{ - 0x59CF, 0x5875, 0x572B, 0x55EE, 0x54BF, 0x539C, 0x5284, 0x5177, - 0x5074, 0x4F7A, 0x4E89, 0x4DA1, 0x4CC0, 0x4BE7, 0x4B15, 0x4A4A, - 0x4985, 0x48C6, 0x480C, 0x4758, 0x46AA, 0x4600, 0x455B, 0x44BA, - 0x441D, 0x4385, 0x42F1, 0x4260, 0x41D3, 0x414A, 0x40C3, 0x4040 -}; - -const Word32 ISqrtTable[32] = /* Q31 */ -{ - 0x7FFE7F85, 0x7E0A4E25, 0x7C2C56C7, 0x7A63002C, 0x78ACD922, 0x7708939D, 0x75750088, 0x73F10C2D, - 0x727BBB1A, 0x71142774, 0x6FB97EA5, 0x6E6AFF54, 0x6D27F79D, 0x6BEFC388, 0x6AC1CBA4, 0x699D83DA, - 0x68826A53, 0x6770068E, 0x6665E882, 0x6563A7DF, 0x6468E364, 0x63754043, 0x62886999, 0x61A20FEE, - 0x60C1E8C8, 0x5FE7AE45, 0x5F131EBE, 0x5E43FC76, 0x5D7A0D4F, 0x5CB51A81, 0x5BF4F061, 0x5B395E26 -}; - -const Word16 ISqrtDiffTable[32] = /* Q15 */ -{ - 0x7D0C, 0x777E, 0x7256, 0x6D8A, 0x6911, 0x64E5, 0x60FD, 0x5D54, - 0x59E5, 0x56AA, 0x53A0, 0x50C2, 0x4E0D, 0x4B7E, 0x4912, 0x46C6, - 0x4499, 0x4288, 0x4090, 0x3EB1, 0x3CE9, 0x3B36, 0x3996, 0x380A, - 0x368F, 0x3524, 0x33C9, 0x327C, 0x313D, 0x300B, 0x2EE5, 0x2DCA -}; - -/* 1/x tables */ -const Word32 InvTable[32] = /* Q31 */ -{ - 0x7FFBFE40, 0x7C1B608E, 0x78752176, 0x750440BA, 0x71C44C49, 0x6EB14D0A, 0x6BC7B6B4, 0x69045A19, - 0x6664598A, 0x63E51EE2, 0x61845308, 0x5F3FD698, 0x5D15BB8E, 0x5B043FD0, 0x5909C861, 0x5724DD3C, - 0x555425B2, 0x53966532, 0x51EA787F, 0x504F5331, 0x4EC3FD84, 0x4D479267, 0x4BD93DBE, 0x4A783ADC, - 0x4923D31D, 0x47DB5CAE, 0x469E3974, 0x456BD608, 0x4443A8D9, 0x43253159, 0x420FF746, 0x41038A01 -}; - -const Word16 InvDiffTable[32] = /* Q15 */ -{ - 0x7C14, 0x74C8, 0x6E1C, 0x67FF, 0x6260, 0x5D33, 0x586C, 0x5400, - 0x4FE7, 0x4C19, 0x4890, 0x4543, 0x422F, 0x3F4F, 0x3C9D, 0x3A17, - 0x37B8, 0x357E, 0x3365, 0x316B, 0x2F8D, 0x2DCB, 0x2C20, 0x2A8D, - 0x290F, 0x27A4, 0x264C, 0x2506, 0x23CF, 0x22A7, 0x218E, 0x2081 -}; - -const Word16 tcx_mdct_window_48_fx[420] =//Q15 -{ 61, 183, 306, 428, 551, 673, 796, 919, 1041, 1163, 1286, -1408, 1531, 1653, 1776, 1898, 2020, 2143, 2265, 2387, 2509, -2632, 2754, 2876, 2998, 3120, 3242, 3364, 3486, 3607, 3729, -3851, 3973, 4094, 4216, 4337, 4459, 4580, 4701, 4823, 4944, -5065, 5186, 5307, 5428, 5549, 5669, 5790, 5911, 6031, 6152, -6272, 6392, 6512, 6632, 6752, 6872, 6992, 7112, 7231, 7351, -7470, 7589, 7709, 7828, 7947, 8065, 8184, 8303, 8421, 8540, -8658, 8776, 8894, 9012, 9130, 9247, 9365, 9482, 9599, 9717, -9834, 9950, 10067, 10184, 10300, 10416, 10532, 10648, 10764, 10880, -10995, 11111, 11226, 11341, 11456, 11571, 11685, 11800, 11914, 12028, -12142, 12256, 12369, 12483, 12596, 12709, 12822, 12934, 13047, 13159, -13271, 13383, 13495, 13607, 13718, 13829, 13940, 14051, 14162, 14272, -14382, 14492, 14602, 14712, 14821, 14930, 15039, 15148, 15257, 15365, -15473, 15581, 15689, 15796, 15904, 16011, 16117, 16224, 16330, 16437, -16542, 16648, 16754, 16859, 16964, 17068, 17173, 17277, 17381, 17485, -17589, 17692, 17795, 17898, 18000, 18102, 18204, 18306, 18408, 18509, -18610, 18711, 18811, 18911, 19011, 19111, 19210, 19310, 19408, 19507, -19605, 19703, 19801, 19899, 19996, 20093, 20190, 20286, 20382, 20478, -20573, 20669, 20764, 20858, 20953, 21047, 21140, 21234, 21327, 21420, -21513, 21605, 21697, 21789, 21880, 21971, 22062, 22152, 22242, 22332, -22422, 22511, 22600, 22688, 22777, 22865, 22952, 23040, 23127, 23213, -23300, 23386, 23471, 23557, 23642, 23726, 23811, 23895, 23978, 24062, -24145, 24227, 24310, 24392, 24473, 24555, 24636, 24716, 24797, 24877, -24956, 25035, 25114, 25193, 25271, 25349, 25426, 25504, 25580, 25657, -25733, 25808, 25884, 25959, 26033, 26108, 26181, 26255, 26328, 26401, -26473, 26545, 26617, 26688, 26759, 26830, 26900, 26970, 27039, 27108, -27177, 27245, 27313, 27381, 27448, 27514, 27581, 27647, 27712, 27778, -27842, 27907, 27971, 28034, 28098, 28161, 28223, 28285, 28347, 28408, -28469, 28529, 28589, 28649, 28708, 28767, 28826, 28884, 28942, 28999, -29056, 29112, 29168, 29224, 29279, 29334, 29388, 29442, 29496, 29549, -29602, 29654, 29706, 29758, 29809, 29859, 29910, 29959, 30009, 30058, -30106, 30155, 30202, 30250, 30297, 30343, 30389, 30435, 30480, 30525, -30569, 30613, 30656, 30700, 30742, 30784, 30826, 30867, 30908, 30949, -30989, 31029, 31068, 31106, 31145, 31183, 31220, 31257, 31294, 31330, -31365, 31401, 31435, 31470, 31504, 31537, 31570, 31603, 31635, 31667, -31698, 31729, 31759, 31789, 31819, 31848, 31876, 31905, 31932, 31960, -31986, 32013, 32039, 32064, 32089, 32114, 32138, 32162, 32185, 32208, -32230, 32252, 32273, 32294, 32315, 32335, 32354, 32374, 32392, 32411, -32428, 32446, 32463, 32479, 32495, 32511, 32526, 32540, 32555, 32568, -32582, 32594, 32607, 32619, 32630, 32641, 32652, 32662, 32671, 32680, -32689, 32697, 32705, 32712, 32719, 32726, 32732, 32737, 32742, 32747, -32751, 32755, 32758, 32761, 32763, 32765, 32766, 32767, 32767 }; - -const Word16 tcx_mdct_window_half_48_fx[180] =//Q15 -{ - 142, 428, 714, 1000, 1286, 1572, 1857, 2143, 2428, 2713, 2998, -3282, 3567, 3851, 4135, 4418, 4701, 4984, 5267, 5549, 5830, -6112, 6392, 6672, 6952, 7231, 7510, 7788, 8065, 8342, 8619, -8894, 9169, 9443, 9717, 9989, 10261, 10532, 10803, 11072, 11341, -11609, 11876, 12142, 12407, 12671, 12934, 13197, 13458, 13718, 13977, -14235, 14492, 14748, 15003, 15257, 15509, 15761, 16011, 16260, 16507, -16754, 16999, 17242, 17485, 17726, 17966, 18204, 18441, 18677, 18911, -19144, 19376, 19605, 19834, 20061, 20286, 20510, 20732, 20953, 21172, -21389, 21605, 21819, 22032, 22242, 22452, 22659, 22865, 23069, 23271, -23471, 23670, 23867, 24062, 24255, 24446, 24636, 24823, 25009, 25193, -25375, 25555, 25733, 25909, 26083, 26255, 26425, 26593, 26759, 26923, -27085, 27245, 27403, 27559, 27712, 27864, 28013, 28161, 28306, 28449, -28589, 28728, 28865, 28999, 29131, 29261, 29388, 29514, 29637, 29758, -29876, 29992, 30106, 30218, 30328, 30435, 30540, 30642, 30742, 30840, -30935, 31029, 31119, 31208, 31294, 31377, 31458, 31537, 31614, 31688, -31759, 31828, 31895, 31960, 32021, 32081, 32138, 32192, 32245, 32294, -32341, 32386, 32428, 32468, 32506, 32540, 32573, 32603, 32630, 32655, -32677, 32697, 32715, 32730, 32742, 32752, 32760, 32765, 32767 }; - - -const Word16 tcx_mdct_window_trans_48_fx[60] =//Q15 -{ 428, 1286, 2143, 2998, 3851, 4701, 5549, 6392, 7231, 8065, 8894, -9717, 10532, 11341, 12142, 12934, 13718, 14492, 15257, 16011, 16754, -17485, 18204, 18911, 19605, 20286, 20953, 21605, 22242, 22865, 23471, -24062, 24636, 25193, 25733, 26255, 26759, 27245, 27712, 28161, 28589, -28999, 29388, 29758, 30106, 30435, 30742, 31029, 31294, 31537, 31759, -31960, 32138, 32294, 32428, 32540, 32630, 32697, 32742, 32765 -}; - -/*----------------------------------------------------------------------------------* - * SWB TBE LSF tables (1.75 kbps) - *----------------------------------------------------------------------------------*/ - -const Word32 sigma_BWE_fx[] = {//Q31 -17011214, 16701976, 17561200, -17474996, 19251270, 20645372, 39204284, -40792208, 18917444, 18895726, 19477682, -19499580, 20916386, 22705246, 39204284, -40792208 }; /* for 3 bits first stage */ - - -const Word16 inv_modified_sigma_BWE_fx[] = {//Q1 - 259, -254, -267, -266, -293, -315, -598, -622, -288, -288, -297, -297, -319, -346, -598, -622 -}; - -const Word16 modified_sigma_BWE_fx[] =//Q(log2(2.56) -{ 323, -329, -313, -314, -285, -266, -140, -134, -290, -290, -282, -281, -262, -242, -140, -134 }; - - -const Word16 SHB_LSF_mean_fx[10] = {//Q15 -1353, 2646, 4046, -5428, 6896, 8339, 9863, -11368, 12977, 14558 -}; - -/* 4 bit VQ first stage */ -/* An 6-by-16 matrix */ - -const Word16 SHB_LSF_VQ4_fx[96] =//Q15 -{ 150, 51, -507, -986, -1115, -944, --184, -77, 95, 232, 440, 497, -115, --107, -109, -242, -446, -592, 387, 799, -1132, 1263, 1259, 1122, -128, -599, -1214, --1389, -1319, -1016, 533, 424, 148, -125, --378, -501, -337, -590, -587, -630, -715, --750, 504, 849, 750, 508, 234, 68, -176, -177, -407, 327, 206, 21, -107, -341, 423, 264, -17, -180, -110, -381, --716, -725, -232, -42, 170, 265, 273, -336, 397, 450, 69, 285, 519, 686, -656, 564, 120, 115, -123, -382, -19, -234, -377, -629, -296, -95, 21, 63, --206, -456, 518, 472, 179, 22 }; -/* 3 bit VQ first stage */ -const Word16 SHB_LSF_VQ3_fx[48] =//Q15 -{ 278, 403, 285, 65, -206, -337, -386, 770, 838, 753, 599, 445, -196, --455, -609, -524, -206, -78, 39, 199, -393, 514, 491, 462, -91, -435, -979, --1241, -1225, -976, -52, -98, -216, -422, --599, -688, 127, 137, 0, 52, 301, -412, -278, -422, 9, 199, 137, 72 }; -const Word16 *const cb_LSF_BWE_fx[] = { SHB_LSF_VQ4_fx, SHB_LSF_VQ3_fx }; // Q15 - -const Word16 mslvq_SHB_min_bits[] = {14, 12}; /* for 4 bits and 3 bits respectively Q0*/ - -const Word16 scales_BWE_fx[] = {//Q13 -7634, 13737, -23027, 7299, 14499, -24592, 6955, 14491, -26427 }; - -const Word16 scales_BWE_fx_new[] = {//Q11 - -1908, -3434, -5756, -1824, -3624, -6148, -1738, -3622, -6606 -}; -const Word8 no_lead_BWE[] = { // Q0 - 8, 6, 5, /* 14 bits */ - 10,9,5, /* 15 bits*/ - 16, 11, 5}; /* 16 bits */ - -const Word16 scales_BWE_3b_fx[] = {//Q13 -7847, 14262, -28934, 7610, 12771, -21544, 7249, 12689, -23060 }; - -const Word16 scales_BWE_3b_fx_new[] = {//Q11 - 1961, -3565, -7233, -1902, -3192, -5386, -1812, -3172, -5765 -}; - -const Word8 no_lead_BWE_3b[] = { // Q0 - 4, 5, 2, /* 12 bits */ - 5, 5, 5, /* 13 bits */ - 8, 6, 5 /* 14 bits */ - }; - -const Word32 LastCoefPred_0bit_fx[18] =//Q31 -{ -10930692, -29356102, -14495515, --11918534, 3435973, 89292368, 269423296, -1105954048, 0, 17544942, -13851270, --20121922, -15590731, 7795365, 46127948, -176888224, 438086656, 0 }; - - -const Word32 LastCoefPred_1bit_fx[36] = {//Q31 -37795712, -47094316, 24910810, -18060338, 38268160, 87424056, 217346816, -810181184, 9685151, 53107272, -26843546, -11703786, -7301444, 20444044, 22655952, -138448272, 307648512, 9234180 }; - -const Word16 config_LSF_BWE[] = { // Q0 - 4, 16, 1, /* 21 bits */ - 4, 16, 1, /* 20 */ - 4, 16, 1, /* 19 */ - 3, 8, 1, /* 18 */ - 3, 8, 1, /* 17 */ - 3, 8, 0 /* 16 */ -}; - -//basops -const Word32 BASOP_util_normReciprocal[CHEAP_NORM_SIZE] = -{ - 0l/*0.0 Q31*/, 2147483647l/*1.0000000000 Q31*/, 1073741824l/*0.5000000000 Q31*/, 715827883l/*0.3333333333 Q31*/, 536870912l/*0.2500000000 Q31*/, 429496730l/*0.2000000000 Q31*/, - 357913941l/*0.1666666667 Q31*/, 306783378l/*0.1428571429 Q31*/, 268435456l/*0.1250000000 Q31*/, 238609294l/*0.1111111111 Q31*/, 214748365l/*0.1000000000 Q31*/, 195225786l/*0.0909090909 Q31*/, - 178956971l/*0.0833333333 Q31*/, 165191050l/*0.0769230769 Q31*/, 153391689l/*0.0714285714 Q31*/, 143165577l/*0.0666666667 Q31*/, 134217728l/*0.0625000000 Q31*/, 126322568l/*0.0588235294 Q31*/, - 119304647l/*0.0555555556 Q31*/, 113025455l/*0.0526315789 Q31*/, 107374182l/*0.0500000000 Q31*/, 102261126l/*0.0476190476 Q31*/, 97612893l/*0.0454545455 Q31*/, 93368854l/*0.0434782609 Q31*/, - 89478485l/*0.0416666667 Q31*/, 85899346l/*0.0400000000 Q31*/, 82595525l/*0.0384615385 Q31*/, 79536431l/*0.0370370370 Q31*/, 76695845l/*0.0357142857 Q31*/, 74051160l/*0.0344827586 Q31*/, - 71582788l/*0.0333333333 Q31*/, 69273666l/*0.0322580645 Q31*/, 67108864l/*0.0312500000 Q31*/, 65075262l/*0.0303030303 Q31*/, 63161284l/*0.0294117647 Q31*/, 61356676l/*0.0285714286 Q31*/, - 59652324l/*0.0277777778 Q31*/, 58040099l/*0.0270270270 Q31*/, 56512728l/*0.0263157895 Q31*/, 55063683l/*0.0256410256 Q31*/, 53687091l/*0.0250000000 Q31*/, 52377650l/*0.0243902439 Q31*/, - 51130563l/*0.0238095238 Q31*/, 49941480l/*0.0232558140 Q31*/, 48806446l/*0.0227272727 Q31*/, 47721859l/*0.0222222222 Q31*/, 46684427l/*0.0217391304 Q31*/, 45691141l/*0.0212765957 Q31*/, - 44739243l/*0.0208333333 Q31*/, 43826197l/*0.0204081633 Q31*/, 42949673l/*0.0200000000 Q31*/, 42107522l/*0.0196078431 Q31*/, 41297762l/*0.0192307692 Q31*/, 40518559l/*0.0188679245 Q31*/, - 39768216l/*0.0185185185 Q31*/, 39045157l/*0.0181818182 Q31*/, 38347922l/*0.0178571429 Q31*/, 37675152l/*0.0175438596 Q31*/, 37025580l/*0.0172413793 Q31*/, 36398028l/*0.0169491525 Q31*/, - 35791394l/*0.0166666667 Q31*/, 35204650l/*0.0163934426 Q31*/, 34636833l/*0.0161290323 Q31*/, 34087042l/*0.0158730159 Q31*/, 33554432l/*0.0156250000 Q31*/, 33038210l/*0.0153846154 Q31*/, - 32537631l/*0.0151515152 Q31*/, 32051995l/*0.0149253731 Q31*/, 31580642l/*0.0147058824 Q31*/, 31122951l/*0.0144927536 Q31*/, 30678338l/*0.0142857143 Q31*/, 30246248l/*0.0140845070 Q31*/, - 29826162l/*0.0138888889 Q31*/, 29417584l/*0.0136986301 Q31*/, 29020049l/*0.0135135135 Q31*/, 28633115l/*0.0133333333 Q31*/, 28256364l/*0.0131578947 Q31*/, 27889398l/*0.0129870130 Q31*/, - 27531842l/*0.0128205128 Q31*/, 27183337l/*0.0126582278 Q31*/, 26843546l/*0.0125000000 Q31*/, 26512144l/*0.0123456790 Q31*/, 26188825l/*0.0121951220 Q31*/, 25873297l/*0.0120481928 Q31*/, - 25565282l/*0.0119047619 Q31*/, 25264514l/*0.0117647059 Q31*/, 24970740l/*0.0116279070 Q31*/, 24683720l/*0.0114942529 Q31*/, 24403223l/*0.0113636364 Q31*/, 24129030l/*0.0112359551 Q31*/, - 23860929l/*0.0111111111 Q31*/, 23598721l/*0.0109890110 Q31*/, 23342214l/*0.0108695652 Q31*/, 23091222l/*0.0107526882 Q31*/, 22845571l/*0.0106382979 Q31*/, 22605091l/*0.0105263158 Q31*/, - 22369621l/*0.0104166667 Q31*/, 22139007l/*0.0103092784 Q31*/, 21913098l/*0.0102040816 Q31*/, 21691754l/*0.0101010101 Q31*/, 21474836l/*0.0100000000 Q31*/, 21262214l/*0.0099009901 Q31*/, - 21053761l/*0.0098039216 Q31*/, 20849356l/*0.0097087379 Q31*/, 20648881l/*0.0096153846 Q31*/, 20452225l/*0.0095238095 Q31*/, 20259280l/*0.0094339623 Q31*/, 20069941l/*0.0093457944 Q31*/, - 19884108l/*0.0092592593 Q31*/, 19701685l/*0.0091743119 Q31*/, 19522579l/*0.0090909091 Q31*/, 19346700l/*0.0090090090 Q31*/, 19173961l/*0.0089285714 Q31*/, 19004280l/*0.0088495575 Q31*/, - 18837576l/*0.0087719298 Q31*/, 18673771l/*0.0086956522 Q31*/, 18512790l/*0.0086206897 Q31*/, 18354561l/*0.0085470085 Q31*/, 18199014l/*0.0084745763 Q31*/, 18046081l/*0.0084033613 Q31*/, - 17895697l/*0.0083333333 Q31*/, 17747799l/*0.0082644628 Q31*/, 17602325l/*0.0081967213 Q31*/, 17459217l/*0.0081300813 Q31*/, 17318416l/*0.0080645161 Q31*/, 17179869l/*0.0080000000 Q31*/, - 17043521l/*0.0079365079 Q31*/, 16909320l/*0.0078740157 Q31*/, 16777216l/*0.0078125000 Q31*/, 16647160l/*0.0077519380 Q31*/, 16519105l/*0.0076923077 Q31*/, 16393005l/*0.0076335878 Q31*/, - 16268816l/*0.0075757576 Q31*/, 16146494l/*0.0075187970 Q31*/, 16025997l/*0.0074626866 Q31*/, 15907286l/*0.0074074074 Q31*/, 15790321l/*0.0073529412 Q31*/, 15675063l/*0.0072992701 Q31*/, - 15561476l/*0.0072463768 Q31*/, 15449523l/*0.0071942446 Q31*/, 15339169l/*0.0071428571 Q31*/, 15230381l/*0.0070921986 Q31*/, 15123124l/*0.0070422535 Q31*/, 15017368l/*0.0069930070 Q31*/, - 14913081l/*0.0069444444 Q31*/, 14810232l/*0.0068965517 Q31*/, 14708792l/*0.0068493151 Q31*/, 14608732l/*0.0068027211 Q31*/, 14510025l/*0.0067567568 Q31*/, 14412642l/*0.0067114094 Q31*/, - 14316558l/*0.0066666667 Q31*/, 14221746l/*0.0066225166 Q31*/, 14128182l/*0.0065789474 Q31*/, 14035841l/*0.0065359477 Q31*/, 13944699l/*0.0064935065 Q31*/, 13854733l/*0.0064516129 Q31*/, - 13765921l/*0.0064102564 Q31*/, 13678240l/*0.0063694268 Q31*/, 13591669l/*0.0063291139 Q31*/, 13506187l/*0.0062893082 Q31*/, 13421773l/*0.0062500000 Q31*/ -}; - -const Word16 f_atan_expand_range[MAXSFTAB - (MINSFTAB - 1)] = -{ - /***************************************************************************** - * - * Table holds fixp_atan() output values which are outside of input range - * of fixp_atan() to improve SNR of fixp_atan2(). - * - * This Table might also be used in fixp_atan() [todo] so there a wider input - * range can be covered, too. - * - * Matlab (generate table): - * for scl = 7:25 % MINSFTAB .. MAXSFTAB - * at=atan(0.5 *(2^scl)); % 0.5 because get in 'middle' area of current scale level 'scl' - * at/2 % div at by ATO_SCALE - * end - * - * Table divided by 2=ATO_SCALE <-- SF=ATO_SF - *****************************************************************************/ - 25480/*7.775862990872099e-001 Q15*/, 25608/*7.814919928673978e-001 Q15*/, 25672/*7.834450483314648e-001 Q15*/, - 25704/*7.844216021392089e-001 Q15*/, 25720/*7.849098823026687e-001 Q15*/, 25728/*7.851540227918509e-001 Q15*/, - 25732/*7.852760930873737e-001 Q15*/, 25734/*7.853371282415015e-001 Q15*/, 25735/*7.853676458193612e-001 Q15*/, - 25735/*7.853829046083906e-001 Q15*/, 25736/*7.853905340029177e-001 Q15*/, 25736/*7.853943487001828e-001 Q15*/, - 25736/*7.853962560488155e-001 Q15*/, 25736/*7.853972097231319e-001 Q15*/, 25736/*7.853976865602901e-001 Q15*/, - 25736/*7.853979249788692e-001 Q15*/, 25736/*7.853980441881587e-001 Q15*/, 25736/*7.853981037928035e-001 Q15*/, - 25736/*7.853981335951259e-001 Q15*/ - /* pi/4 = 0.785398163397448 = pi/2/ATO_SCALE */ -}; - - -const Word16 Grid[GRID100_POINTS + 1] =//Q15 -{ - 32767, 32751, 32703, 32622, 32509, 32364, - 32187, 31978, 31738, 31466, 31164, 30830, - 30466, 30072, 29649, 29196, 28714, 28204, - 27666, 27101, 26509, 25891, 25248, 24579, - 23886, 23170, 22431, 21669, 20887, 20083, - 19260, 18418, 17557, 16680, 15786, 14876, - 13951, 13013, 12062, 11099, 10125, 9141, - 8149, 7148, 6140, 5126, 4106, 3083, - 2057, 1029, 0, -1029, -2057, -3083, - -4106, -5126, -6140, -7148, -8149, -9141, - -10125, -11099, -12062, -13013, -13951, -14876, - -15786, -16680, -17557, -18418, -19260, -20083, - -20887, -21669, -22431, -23170, -23886, -24579, - -25248, -25891, -26509, -27101, -27666, -28204, - -28714, -29196, -29649, -30072, -30466, -30830, - -31164, -31466, -31738, -31978, -32187, -32364, - -32509, -32622, -32703, -32751, -32760 -}; - -const Word16 pwAlpha[10] = { 0x6666, 0x51ec, 0x4189, 0x346e, 0x29f1,//Q15 - 0x218e, 0x1ad8, 0x157a, 0x112e, 0x0dbe -}; - -/* Used in 'lsp2lsf_fx.c' */ -const Word8 Ind_Guess[256] = -{ - 126, 122, 120, 119, 117, 116, 115, 114, - 113, 112, 111, 110, 110, 109, 108, 108, - 107, 106, 106, 105, 104, 104, 103, 103, - 102, 102, 101, 101, 100, 100, 99, 99, - 98, 98, 97, 97, 96, 96, 95, 95, - 94, 94, 94, 93, 93, 92, 92, 91, - 91, 91, 90, 90, 89, 89, 89, 88, - 88, 87, 87, 87, 86, 86, 86, 85, - 85, 84, 84, 84, 83, 83, 83, 82, - 82, 82, 81, 81, 81, 80, 80, 80, - 79, 79, 78, 78, 78, 77, 77, 77, - 76, 76, 76, 75, 75, 75, 74, 74, - 74, 73, 73, 73, 72, 72, 72, 72, - 71, 71, 71, 70, 70, 70, 69, 69, - 69, 68, 68, 68, 67, 67, 67, 66, - 66, 66, 65, 65, 65, 64, 64, 64, - 64, 63, 63, 63, 62, 62, 62, 61, - 61, 61, 60, 60, 60, 59, 59, 59, - 58, 58, 58, 57, 57, 57, 56, 56, - 56, 55, 55, 55, 55, 54, 54, 54, - 53, 53, 53, 52, 52, 52, 51, 51, - 51, 50, 50, 50, 49, 49, 49, 48, - 48, 47, 47, 47, 46, 46, 46, 45, - 45, 45, 44, 44, 44, 43, 43, 43, - 42, 42, 41, 41, 41, 40, 40, 40, - 39, 39, 38, 38, 38, 37, 37, 36, - 36, 36, 35, 35, 34, 34, 33, 33, - 33, 32, 32, 31, 31, 30, 30, 29, - 29, 28, 28, 27, 27, 26, 26, 25, - 25, 24, 24, 23, 23, 22, 21, 21, - 20, 19, 19, 18, 17, 17, 16, 15, - 14, 13, 12, 11, 10, 8, 7, 5 -}; - -const Word16 cos_table_129[129] =//Q15 -{ - 32767, - 32758, 32729, 32679, 32610, 32522, 32413, 32286, 32138, - 31972, 31786, 31581, 31357, 31114, 30853, 30572, 30274, - 29957, 29622, 29269, 28899, 28511, 28106, 27684, 27246, - 26791, 26320, 25833, 25330, 24812, 24279, 23732, 23170, - 22595, 22006, 21403, 20788, 20160, 19520, 18868, 18205, - 17531, 16846, 16151, 15447, 14733, 14010, 13279, 12540, - 11793, 11039, 10279, 9512, 8740, 7962, 7180, 6393, - 5602, 4808, 4011, 3212, 2411, 1608, 804, 0, - -804, -1608, -2411, -3212, -4011, -4808, -5602, -6393, - -7180, -7962, -8740, -9512, -10279, -11039, -11793, -12540, - -13279, -14010, -14733, -15447, -16151, -16846, -17531, -18205, - -18868, -19520, -20160, -20788, -21403, -22006, -22595, -23170, - -23732, -24279, -24812, -25330, -25833, -26320, -26791, -27246, - -27684, -28106, -28511, -28899, -29269, -29622, -29957, -30274, - -30572, -30853, -31114, -31357, -31581, -31786, -31972, -32138, - -32286, -32413, -32522, -32610, -32679, -32729, -32758, -32768 -}; - -const Word16 acos_slope[128] =//Q15 -{ - -26214, -9039, -5243, -3799, -2979, -2405, -2064, -1771, - -1579, -1409, -1279, -1170, -1079, -1004, -933, -880, - -827, -783, -743, -708, -676, -647, -621, -599, - -576, -557, -538, -521, -506, -492, -479, -466, - -456, -445, -435, -426, -417, -410, -402, -395, - -389, -383, -377, -372, -367, -363, -359, -355, - -351, -348, -345, -342, -340, -337, -335, -333, - -331, -330, -329, -328, -327, -326, -326, -326, - -326, -326, -326, -327, -328, -329, -330, -331, - -333, -335, -337, -340, -342, -345, -348, -351, - -355, -359, -363, -367, -372, -377, -383, -389, - -395, -402, -410, -417, -426, -435, -445, -456, - -466, -479, -492, -506, -521, -538, -557, -576, - -599, -621, -647, -676, -708, -743, -783, -827, - -880, -933, -1004, -1079, -1170, -1279, -1409, -1579, - -1771, -2064, -2405, -2979, -3799, -5243, -9039,-26214 -}; -#define SHC(x) ((Word16)x) - -const Word16 cos_coef_new[4] = { SHC(0x02BA), SHC(0xE60A), SHC(0xEEEF), SHC(0xAAAB) };//Q15 - -const Word16 cos_table[512] =//Q15 -{ - SHC(0x7fff), - SHC(0x7ffe), - SHC(0x7ff6), - SHC(0x7fea), - SHC(0x7fd9), - SHC(0x7fc2), - SHC(0x7fa7), - SHC(0x7f87), - SHC(0x7f62), - SHC(0x7f38), - SHC(0x7f0a), - SHC(0x7ed6), - SHC(0x7e9d), - SHC(0x7e60), - SHC(0x7e1e), - SHC(0x7dd6), - SHC(0x7d8a), - SHC(0x7d3a), - SHC(0x7ce4), - SHC(0x7c89), - SHC(0x7c2a), - SHC(0x7bc6), - SHC(0x7b5d), - SHC(0x7aef), - SHC(0x7a7d), - SHC(0x7a06), - SHC(0x798a), - SHC(0x790a), - SHC(0x7885), - SHC(0x77fb), - SHC(0x776c), - SHC(0x76d9), - SHC(0x7642), - SHC(0x75a6), - SHC(0x7505), - SHC(0x7460), - SHC(0x73b6), - SHC(0x7308), - SHC(0x7255), - SHC(0x719e), - SHC(0x70e3), - SHC(0x7023), - SHC(0x6f5f), - SHC(0x6e97), - SHC(0x6dca), - SHC(0x6cf9), - SHC(0x6c24), - SHC(0x6b4b), - SHC(0x6a6e), - SHC(0x698c), - SHC(0x68a7), - SHC(0x67bd), - SHC(0x66d0), - SHC(0x65de), - SHC(0x64e9), - SHC(0x63ef), - SHC(0x62f2), - SHC(0x61f1), - SHC(0x60ec), - SHC(0x5fe4), - SHC(0x5ed7), - SHC(0x5dc8), - SHC(0x5cb4), - SHC(0x5b9d), - SHC(0x5a82), - SHC(0x5964), - SHC(0x5843), - SHC(0x571e), - SHC(0x55f6), - SHC(0x54ca), - SHC(0x539b), - SHC(0x5269), - SHC(0x5134), - SHC(0x4ffb), - SHC(0x4ec0), - SHC(0x4d81), - SHC(0x4c40), - SHC(0x4afb), - SHC(0x49b4), - SHC(0x486a), - SHC(0x471d), - SHC(0x45cd), - SHC(0x447b), - SHC(0x4326), - SHC(0x41ce), - SHC(0x4074), - SHC(0x3f17), - SHC(0x3db8), - SHC(0x3c57), - SHC(0x3af3), - SHC(0x398d), - SHC(0x3825), - SHC(0x36ba), - SHC(0x354e), - SHC(0x33df), - SHC(0x326e), - SHC(0x30fc), - SHC(0x2f87), - SHC(0x2e11), - SHC(0x2c99), - SHC(0x2b1f), - SHC(0x29a4), - SHC(0x2827), - SHC(0x26a8), - SHC(0x2528), - SHC(0x23a7), - SHC(0x2224), - SHC(0x209f), - SHC(0x1f1a), - SHC(0x1d93), - SHC(0x1c0c), - SHC(0x1a83), - SHC(0x18f9), - SHC(0x176e), - SHC(0x15e2), - SHC(0x1455), - SHC(0x12c8), - SHC(0x113a), - SHC(0xfab), - SHC(0xe1c), - SHC(0xc8c), - SHC(0xafb), - SHC(0x96b), - SHC(0x7d9), - SHC(0x648), - SHC(0x4b6), - SHC(0x324), - SHC(0x192), - SHC(0x0), - SHC(0xfe6e), - SHC(0xfcdc), - SHC(0xfb4a), - SHC(0xf9b8), - SHC(0xf827), - SHC(0xf695), - SHC(0xf505), - SHC(0xf374), - SHC(0xf1e4), - SHC(0xf055), - SHC(0xeec6), - SHC(0xed38), - SHC(0xebab), - SHC(0xea1e), - SHC(0xe892), - SHC(0xe707), - SHC(0xe57d), - SHC(0xe3f4), - SHC(0xe26d), - SHC(0xe0e6), - SHC(0xdf61), - SHC(0xdddc), - SHC(0xdc59), - SHC(0xdad8), - SHC(0xd958), - SHC(0xd7d9), - SHC(0xd65c), - SHC(0xd4e1), - SHC(0xd367), - SHC(0xd1ef), - SHC(0xd079), - SHC(0xcf04), - SHC(0xcd92), - SHC(0xcc21), - SHC(0xcab2), - SHC(0xc946), - SHC(0xc7db), - SHC(0xc673), - SHC(0xc50d), - SHC(0xc3a9), - SHC(0xc248), - SHC(0xc0e9), - SHC(0xbf8c), - SHC(0xbe32), - SHC(0xbcda), - SHC(0xbb85), - SHC(0xba33), - SHC(0xb8e3), - SHC(0xb796), - SHC(0xb64c), - SHC(0xb505), - SHC(0xb3c0), - SHC(0xb27f), - SHC(0xb140), - SHC(0xb005), - SHC(0xaecc), - SHC(0xad97), - SHC(0xac65), - SHC(0xab36), - SHC(0xaa0a), - SHC(0xa8e2), - SHC(0xa7bd), - SHC(0xa69c), - SHC(0xa57e), - SHC(0xa463), - SHC(0xa34c), - SHC(0xa238), - SHC(0xa129), - SHC(0xa01c), - SHC(0x9f14), - SHC(0x9e0f), - SHC(0x9d0e), - SHC(0x9c11), - SHC(0x9b17), - SHC(0x9a22), - SHC(0x9930), - SHC(0x9843), - SHC(0x9759), - SHC(0x9674), - SHC(0x9592), - SHC(0x94b5), - SHC(0x93dc), - SHC(0x9307), - SHC(0x9236), - SHC(0x9169), - SHC(0x90a1), - SHC(0x8fdd), - SHC(0x8f1d), - SHC(0x8e62), - SHC(0x8dab), - SHC(0x8cf8), - SHC(0x8c4a), - SHC(0x8ba0), - SHC(0x8afb), - SHC(0x8a5a), - SHC(0x89be), - SHC(0x8927), - SHC(0x8894), - SHC(0x8805), - SHC(0x877b), - SHC(0x86f6), - SHC(0x8676), - SHC(0x85fa), - SHC(0x8583), - SHC(0x8511), - SHC(0x84a3), - SHC(0x843a), - SHC(0x83d6), - SHC(0x8377), - SHC(0x831c), - SHC(0x82c6), - SHC(0x8276), - SHC(0x822a), - SHC(0x81e2), - SHC(0x81a0), - SHC(0x8163), - SHC(0x812a), - SHC(0x80f6), - SHC(0x80c8), - SHC(0x809e), - SHC(0x8079), - SHC(0x8059), - SHC(0x803e), - SHC(0x8027), - SHC(0x8016), - SHC(0x800a), - SHC(0x8002), - SHC(0x8001), - SHC(0x8002), - SHC(0x800a), - SHC(0x8016), - SHC(0x8027), - SHC(0x803e), - SHC(0x8059), - SHC(0x8079), - SHC(0x809e), - SHC(0x80c8), - SHC(0x80f6), - SHC(0x812a), - SHC(0x8163), - SHC(0x81a0), - SHC(0x81e2), - SHC(0x822a), - SHC(0x8276), - SHC(0x82c6), - SHC(0x831c), - SHC(0x8377), - SHC(0x83d6), - SHC(0x843a), - SHC(0x84a3), - SHC(0x8511), - SHC(0x8583), - SHC(0x85fa), - SHC(0x8676), - SHC(0x86f6), - SHC(0x877b), - SHC(0x8805), - SHC(0x8894), - SHC(0x8927), - SHC(0x89be), - SHC(0x8a5a), - SHC(0x8afb), - SHC(0x8ba0), - SHC(0x8c4a), - SHC(0x8cf8), - SHC(0x8dab), - SHC(0x8e62), - SHC(0x8f1d), - SHC(0x8fdd), - SHC(0x90a1), - SHC(0x9169), - SHC(0x9236), - SHC(0x9307), - SHC(0x93dc), - SHC(0x94b5), - SHC(0x9592), - SHC(0x9674), - SHC(0x9759), - SHC(0x9843), - SHC(0x9930), - SHC(0x9a22), - SHC(0x9b17), - SHC(0x9c11), - SHC(0x9d0e), - SHC(0x9e0f), - SHC(0x9f14), - SHC(0xa01c), - SHC(0xa129), - SHC(0xa238), - SHC(0xa34c), - SHC(0xa463), - SHC(0xa57e), - SHC(0xa69c), - SHC(0xa7bd), - SHC(0xa8e2), - SHC(0xaa0a), - SHC(0xab36), - SHC(0xac65), - SHC(0xad97), - SHC(0xaecc), - SHC(0xb005), - SHC(0xb140), - SHC(0xb27f), - SHC(0xb3c0), - SHC(0xb505), - SHC(0xb64c), - SHC(0xb796), - SHC(0xb8e3), - SHC(0xba33), - SHC(0xbb85), - SHC(0xbcda), - SHC(0xbe32), - SHC(0xbf8c), - SHC(0xc0e9), - SHC(0xc248), - SHC(0xc3a9), - SHC(0xc50d), - SHC(0xc673), - SHC(0xc7db), - SHC(0xc946), - SHC(0xcab2), - SHC(0xcc21), - SHC(0xcd92), - SHC(0xcf04), - SHC(0xd079), - SHC(0xd1ef), - SHC(0xd367), - SHC(0xd4e1), - SHC(0xd65c), - SHC(0xd7d9), - SHC(0xd958), - SHC(0xdad8), - SHC(0xdc59), - SHC(0xdddc), - SHC(0xdf61), - SHC(0xe0e6), - SHC(0xe26d), - SHC(0xe3f4), - SHC(0xe57d), - SHC(0xe707), - SHC(0xe892), - SHC(0xea1e), - SHC(0xebab), - SHC(0xed38), - SHC(0xeec6), - SHC(0xf055), - SHC(0xf1e4), - SHC(0xf374), - SHC(0xf505), - SHC(0xf695), - SHC(0xf827), - SHC(0xf9b8), - SHC(0xfb4a), - SHC(0xfcdc), - SHC(0xfe6e), - SHC(0x0), - SHC(0x192), - SHC(0x324), - SHC(0x4b6), - SHC(0x648), - SHC(0x7d9), - SHC(0x96b), - SHC(0xafb), - SHC(0xc8c), - SHC(0xe1c), - SHC(0xfab), - SHC(0x113a), - SHC(0x12c8), - SHC(0x1455), - SHC(0x15e2), - SHC(0x176e), - SHC(0x18f9), - SHC(0x1a83), - SHC(0x1c0c), - SHC(0x1d93), - SHC(0x1f1a), - SHC(0x209f), - SHC(0x2224), - SHC(0x23a7), - SHC(0x2528), - SHC(0x26a8), - SHC(0x2827), - SHC(0x29a4), - SHC(0x2b1f), - SHC(0x2c99), - SHC(0x2e11), - SHC(0x2f87), - SHC(0x30fc), - SHC(0x326e), - SHC(0x33df), - SHC(0x354e), - SHC(0x36ba), - SHC(0x3825), - SHC(0x398d), - SHC(0x3af3), - SHC(0x3c57), - SHC(0x3db8), - SHC(0x3f17), - SHC(0x4074), - SHC(0x41ce), - SHC(0x4326), - SHC(0x447b), - SHC(0x45cd), - SHC(0x471d), - SHC(0x486a), - SHC(0x49b4), - SHC(0x4afb), - SHC(0x4c40), - SHC(0x4d81), - SHC(0x4ec0), - SHC(0x4ffb), - SHC(0x5134), - SHC(0x5269), - SHC(0x539b), - SHC(0x54ca), - SHC(0x55f6), - SHC(0x571e), - SHC(0x5843), - SHC(0x5964), - SHC(0x5a82), - SHC(0x5b9d), - SHC(0x5cb4), - SHC(0x5dc8), - SHC(0x5ed7), - SHC(0x5fe4), - SHC(0x60ec), - SHC(0x61f1), - SHC(0x62f2), - SHC(0x63ef), - SHC(0x64e9), - SHC(0x65de), - SHC(0x66d0), - SHC(0x67bd), - SHC(0x68a7), - SHC(0x698c), - SHC(0x6a6e), - SHC(0x6b4b), - SHC(0x6c24), - SHC(0x6cf9), - SHC(0x6dca), - SHC(0x6e97), - SHC(0x6f5f), - SHC(0x7023), - SHC(0x70e3), - SHC(0x719e), - SHC(0x7255), - SHC(0x7308), - SHC(0x73b6), - SHC(0x7460), - SHC(0x7505), - SHC(0x75a6), - SHC(0x7642), - SHC(0x76d9), - SHC(0x776c), - SHC(0x77fb), - SHC(0x7885), - SHC(0x790a), - SHC(0x798a), - SHC(0x7a06), - SHC(0x7a7d), - SHC(0x7aef), - SHC(0x7b5d), - SHC(0x7bc6), - SHC(0x7c2a), - SHC(0x7c89), - SHC(0x7ce4), - SHC(0x7d3a), - SHC(0x7d8a), - SHC(0x7dd6), - SHC(0x7e1e), - SHC(0x7e60), - SHC(0x7e9d), - SHC(0x7ed6), - SHC(0x7f0a), - SHC(0x7f38), - SHC(0x7f62), - SHC(0x7f87), - SHC(0x7fa7), - SHC(0x7fc2), - SHC(0x7fd9), - SHC(0x7fea), - SHC(0x7ff6), - SHC(0x7ffe) -}; - -const PWord16 w1N8[15] = -{ - {{ 32729/*0.998795 Q15*/, -1608/*-0.049068 Q15*/}}, - {{ 32610/*0.995185 Q15*/, -3212/*-0.098017 Q15*/}}, - {{ 32413/*0.989177 Q15*/, -4808/*-0.146730 Q15*/}}, - {{ 32138/*0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, - {{ 31786/*0.970031 Q15*/, -7962/*-0.242980 Q15*/}}, - {{ 31357/*0.956940 Q15*/, -9512/*-0.290285 Q15*/}}, - {{ 30853/*0.941544 Q15*/, -11039/*-0.336890 Q15*/}}, - {{ 30274/*0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, - {{ 29622/*0.903989 Q15*/, -14010/*-0.427555 Q15*/}}, - {{ 28899/*0.881921 Q15*/, -15447/*-0.471397 Q15*/}}, - {{ 28106/*0.857729 Q15*/, -16846/*-0.514103 Q15*/}}, - {{ 27246/*0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, - {{ 26320/*0.803208 Q15*/, -19520/*-0.595699 Q15*/}}, - {{ 25330/*0.773010 Q15*/, -20788/*-0.634393 Q15*/}}, - {{ 24279/*0.740951 Q15*/, -22006/*-0.671559 Q15*/}} -}; - -const PWord16 w2N8[15] = -{ - {{ 32610/*0.995185 Q15*/, -3212/*-0.098017 Q15*/}}, - {{ 32138/*0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, - {{ 31357/*0.956940 Q15*/, -9512/*-0.290285 Q15*/}}, - {{ 30274/*0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, - {{ 28899/*0.881921 Q15*/, -15447/*-0.471397 Q15*/}}, - {{ 27246/*0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, - {{ 25330/*0.773010 Q15*/, -20788/*-0.634393 Q15*/}}, - {{ 23170/*0.707107 Q15*/, -23170/*-0.707107 Q15*/}}, - {{ 20788/*0.634393 Q15*/, -25330/*-0.773010 Q15*/}}, - {{ 18205/*0.555570 Q15*/, -27246/*-0.831470 Q15*/}}, - {{ 15447/*0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, - {{ 12540/*0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, - {{ 9512/*0.290285 Q15*/, -31357/*-0.956940 Q15*/}}, - {{ 6393/*0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, - {{ 3212/*0.098017 Q15*/, -32610/*-0.995185 Q15*/}} -}; - -const PWord16 w3N8[15] = -{ - {{ 32413/*0.989177 Q15*/, -4808/*-0.146730 Q15*/}}, - {{ 31357/*0.956940 Q15*/, -9512/*-0.290285 Q15*/}}, - {{ 29622/*0.903989 Q15*/, -14010/*-0.427555 Q15*/}}, - {{ 27246/*0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, - {{ 24279/*0.740951 Q15*/, -22006/*-0.671559 Q15*/}}, - {{ 20788/*0.634393 Q15*/, -25330/*-0.773010 Q15*/}}, - {{ 16846/*0.514103 Q15*/, -28106/*-0.857729 Q15*/}}, - {{ 12540/*0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, - {{ 7962/*0.242980 Q15*/, -31786/*-0.970031 Q15*/}}, - {{ 3212/*0.098017 Q15*/, -32610/*-0.995185 Q15*/}}, - {{ -1608/*-0.049068 Q15*/, -32729/*-0.998795 Q15*/}}, - {{ -6393/*-0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, - {{-11039/*-0.336890 Q15*/, -30853/*-0.941544 Q15*/}}, - {{-15447/*-0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, - {{-19520/*-0.595699 Q15*/, -26320/*-0.803208 Q15*/}} -}; - -const PWord16 w4N8[15] = -{ - {{ 32138/*0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, - {{ 30274/*0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, - {{ 27246/*0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, - {{ 23170/*0.707107 Q15*/, -23170/*-0.707107 Q15*/}}, - {{ 18205/*0.555570 Q15*/, -27246/*-0.831470 Q15*/}}, - {{ 12540/*0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, - {{ 6393/*0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, - {{ 0/*0.000000 Q15*/, -32768/*-1.000000 Q15*/}}, - {{ -6393/*-0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, - {{-12540/*-0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, - {{-18205/*-0.555570 Q15*/, -27246/*-0.831470 Q15*/}}, - {{-23170/*-0.707107 Q15*/, -23170/*-0.707107 Q15*/}}, - {{-27246/*-0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, - {{-30274/*-0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, - {{-32138/*-0.980785 Q15*/, -6393/*-0.195090 Q15*/}} -}; - -const PWord16 w5N8[15] = -{ - {{ 31786/*0.970031 Q15*/, -7962/*-0.242980 Q15*/}}, - {{ 28899/*0.881921 Q15*/, -15447/*-0.471397 Q15*/}}, - {{ 24279/*0.740951 Q15*/, -22006/*-0.671559 Q15*/}}, - {{ 18205/*0.555570 Q15*/, -27246/*-0.831470 Q15*/}}, - {{ 11039/*0.336890 Q15*/, -30853/*-0.941544 Q15*/}}, - {{ 3212/*0.098017 Q15*/, -32610/*-0.995185 Q15*/}}, - {{ -4808/*-0.146730 Q15*/, -32413/*-0.989177 Q15*/}}, - {{-12540/*-0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, - {{-19520/*-0.595699 Q15*/, -26320/*-0.803208 Q15*/}}, - {{-25330/*-0.773010 Q15*/, -20788/*-0.634393 Q15*/}}, - {{-29622/*-0.903989 Q15*/, -14010/*-0.427555 Q15*/}}, - {{-32138/*-0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, - {{-32729/*-0.998795 Q15*/, 1608/*0.049068 Q15*/}}, - {{-31357/*-0.956940 Q15*/, 9512/*0.290285 Q15*/}}, - {{-28106/*-0.857729 Q15*/, 16846/*0.514103 Q15*/}} -}; - -const PWord16 w6N8[15] = -{ - {{ 31357/*0.956940 Q15*/, -9512/*-0.290285 Q15*/}}, - {{ 27246/*0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, - {{ 20788/*0.634393 Q15*/, -25330/*-0.773010 Q15*/}}, - {{ 12540/*0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, - {{ 3212/*0.098017 Q15*/, -32610/*-0.995185 Q15*/}}, - {{ -6393/*-0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, - {{-15447/*-0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, - {{-23170/*-0.707107 Q15*/, -23170/*-0.707107 Q15*/}}, - {{-28899/*-0.881921 Q15*/, -15447/*-0.471397 Q15*/}}, - {{-32138/*-0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, - {{-32610/*-0.995185 Q15*/, 3212/*0.098017 Q15*/}}, - {{-30274/*-0.923880 Q15*/, 12540/*0.382683 Q15*/}}, - {{-25330/*-0.773010 Q15*/, 20788/*0.634393 Q15*/}}, - {{-18205/*-0.555570 Q15*/, 27246/*0.831470 Q15*/}}, - {{ -9512/*-0.290285 Q15*/, 31357/*0.956940 Q15*/}} -}; - -const PWord16 w7N8[15] = -{ - {{ 30853/*0.941544 Q15*/, -11039/*-0.336890 Q15*/}}, - {{ 25330/*0.773010 Q15*/, -20788/*-0.634393 Q15*/}}, - {{ 16846/*0.514103 Q15*/, -28106/*-0.857729 Q15*/}}, - {{ 6393/*0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, - {{ -4808/*-0.146730 Q15*/, -32413/*-0.989177 Q15*/}}, - {{-15447/*-0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, - {{-24279/*-0.740951 Q15*/, -22006/*-0.671559 Q15*/}}, - {{-30274/*-0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, - {{-32729/*-0.998795 Q15*/, -1608/*-0.049068 Q15*/}}, - {{-31357/*-0.956940 Q15*/, 9512/*0.290285 Q15*/}}, - {{-26320/*-0.803208 Q15*/, 19520/*0.595699 Q15*/}}, - {{-18205/*-0.555570 Q15*/, 27246/*0.831470 Q15*/}}, - {{ -7962/*-0.242980 Q15*/, 31786/*0.970031 Q15*/}}, - {{ 3212/*0.098017 Q15*/, 32610/*0.995185 Q15*/}}, - {{ 14010/*0.427555 Q15*/, 29622/*0.903989 Q15*/}} -}; - -const PWord16 *w_a[7] = { w1N8, w2N8, w3N8, w4N8, w5N8, w6N8, w7N8 };//Q15 - -const PWord16 w19N[127] = -{ - {{ 31881/*0.972940 Q15*/, 7571/*0.231058 Q15*/}}, - {{ 29269/*0.893224 Q15*/, 14733/*0.449611 Q15*/}}, - {{ 25073/*0.765167 Q15*/, 21097/*0.643832 Q15*/}}, - {{ 19520/*0.595699 Q15*/, 26320/*0.803208 Q15*/}}, - {{ 12910/*0.393992 Q15*/, 30118/*0.919114 Q15*/}}, - {{ 5602/*0.170962 Q15*/, 32286/*0.985278 Q15*/}}, - {{ -2009/*-0.061321 Q15*/, 32706/*0.998118 Q15*/}}, - {{ -9512/*-0.290285 Q15*/, 31357/*0.956940 Q15*/}}, - {{-16500/*-0.503538 Q15*/, 28311/*0.863973 Q15*/}}, - {{-22595/*-0.689541 Q15*/, 23732/*0.724247 Q15*/}}, - {{-27467/*-0.838225 Q15*/, 17869/*0.545325 Q15*/}}, - {{-30853/*-0.941544 Q15*/, 11039/*0.336890 Q15*/}}, - {{-32568/*-0.993907 Q15*/, 3612/*0.110222 Q15*/}}, - {{-32522/*-0.992480 Q15*/, -4011/*-0.122411 Q15*/}}, - {{-30715/*-0.937339 Q15*/, -11417/*-0.348419 Q15*/}}, - {{-27246/*-0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, - {{-22302/*-0.680601 Q15*/, -24008/*-0.732654 Q15*/}}, - {{-16151/*-0.492898 Q15*/, -28511/*-0.870087 Q15*/}}, - {{ -9127/*-0.278520 Q15*/, -31471/*-0.960431 Q15*/}}, - {{ -1608/*-0.049068 Q15*/, -32729/*-0.998795 Q15*/}}, - {{ 5998/*0.183040 Q15*/, -32214/*-0.983105 Q15*/}}, - {{ 13279/*0.405241 Q15*/, -29957/*-0.914210 Q15*/}}, - {{ 19841/*0.605511 Q15*/, -26078/*-0.795837 Q15*/}}, - {{ 25330/*0.773010 Q15*/, -20788/*-0.634393 Q15*/}}, - {{ 29448/*0.898674 Q15*/, -14373/*-0.438616 Q15*/}}, - {{ 31972/*0.975702 Q15*/, -7180/*-0.219101 Q15*/}}, - {{ 32766/*0.999925 Q15*/, 402/*0.012272 Q15*/}}, - {{ 31786/*0.970031 Q15*/, 7962/*0.242980 Q15*/}}, - {{ 29086/*0.887640 Q15*/, 15091/*0.460539 Q15*/}}, - {{ 24812/*0.757209 Q15*/, 21403/*0.653173 Q15*/}}, - {{ 19195/*0.585798 Q15*/, 26557/*0.810457 Q15*/}}, - {{ 12540/*0.382683 Q15*/, 30274/*0.923880 Q15*/}}, - {{ 5205/*0.158858 Q15*/, 32352/*0.987301 Q15*/}}, - {{ -2411/*-0.073565 Q15*/, 32679/*0.997290 Q15*/}}, - {{ -9896/*-0.302006 Q15*/, 31238/*0.953306 Q15*/}}, - {{-16846/*-0.514103 Q15*/, 28106/*0.857729 Q15*/}}, - {{-22884/*-0.698376 Q15*/, 23453/*0.715731 Q15*/}}, - {{-27684/*-0.844854 Q15*/, 17531/*0.534998 Q15*/}}, - {{-30986/*-0.945607 Q15*/, 10660/*0.325310 Q15*/}}, - {{-32610/*-0.995185 Q15*/, 3212/*0.098017 Q15*/}}, - {{-32470/*-0.990903 Q15*/, -4410/*-0.134581 Q15*/}}, - {{-30572/*-0.932993 Q15*/, -11793/*-0.359895 Q15*/}}, - {{-27020/*-0.824589 Q15*/, -18538/*-0.565732 Q15*/}}, - {{-22006/*-0.671559 Q15*/, -24279/*-0.740951 Q15*/}}, - {{-15800/*-0.482184 Q15*/, -28707/*-0.876070 Q15*/}}, - {{ -8740/*-0.266713 Q15*/, -31581/*-0.963776 Q15*/}}, - {{ -1206/*-0.036807 Q15*/, -32746/*-0.999322 Q15*/}}, - {{ 6393/*0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, - {{ 13646/*0.416430 Q15*/, -29792/*-0.909168 Q15*/}}, - {{ 20160/*0.615232 Q15*/, -25833/*-0.788346 Q15*/}}, - {{ 25583/*0.780737 Q15*/, -20475/*-0.624859 Q15*/}}, - {{ 29622/*0.903989 Q15*/, -14010/*-0.427555 Q15*/}}, - {{ 32057/*0.978317 Q15*/, -6787/*-0.207111 Q15*/}}, - {{ 32758/*0.999699 Q15*/, 804/*0.024541 Q15*/}}, - {{ 31686/*0.966976 Q15*/, 8351/*0.254866 Q15*/}}, - {{ 28899/*0.881921 Q15*/, 15447/*0.471397 Q15*/}}, - {{ 24548/*0.749136 Q15*/, 21706/*0.662416 Q15*/}}, - {{ 18868/*0.575808 Q15*/, 26791/*0.817585 Q15*/}}, - {{ 12167/*0.371317 Q15*/, 30425/*0.928506 Q15*/}}, - {{ 4808/*0.146730 Q15*/, 32413/*0.989177 Q15*/}}, - {{ -2811/*-0.085797 Q15*/, 32647/*0.996313 Q15*/}}, - {{-10279/*-0.313682 Q15*/, 31114/*0.949528 Q15*/}}, - {{-17190/*-0.524590 Q15*/, 27897/*0.851355 Q15*/}}, - {{-23170/*-0.707107 Q15*/, 23170/*0.707107 Q15*/}}, - {{-27897/*-0.851355 Q15*/, 17190/*0.524590 Q15*/}}, - {{-31114/*-0.949528 Q15*/, 10279/*0.313682 Q15*/}}, - {{-32647/*-0.996313 Q15*/, 2811/*0.085797 Q15*/}}, - {{-32413/*-0.989177 Q15*/, -4808/*-0.146730 Q15*/}}, - {{-30425/*-0.928506 Q15*/, -12167/*-0.371317 Q15*/}}, - {{-26791/*-0.817585 Q15*/, -18868/*-0.575808 Q15*/}}, - {{-21706/*-0.662416 Q15*/, -24548/*-0.749136 Q15*/}}, - {{-15447/*-0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, - {{ -8351/*-0.254866 Q15*/, -31686/*-0.966976 Q15*/}}, - {{ -804/*-0.024541 Q15*/, -32758/*-0.999699 Q15*/}}, - {{ 6787/*0.207111 Q15*/, -32057/*-0.978317 Q15*/}}, - {{ 14010/*0.427555 Q15*/, -29622/*-0.903989 Q15*/}}, - {{ 20475/*0.624859 Q15*/, -25583/*-0.780737 Q15*/}}, - {{ 25833/*0.788346 Q15*/, -20160/*-0.615232 Q15*/}}, - {{ 29792/*0.909168 Q15*/, -13646/*-0.416430 Q15*/}}, - {{ 32138/*0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, - {{ 32746/*0.999322 Q15*/, 1206/*0.036807 Q15*/}}, - {{ 31581/*0.963776 Q15*/, 8740/*0.266713 Q15*/}}, - {{ 28707/*0.876070 Q15*/, 15800/*0.482184 Q15*/}}, - {{ 24279/*0.740951 Q15*/, 22006/*0.671559 Q15*/}}, - {{ 18538/*0.565732 Q15*/, 27020/*0.824589 Q15*/}}, - {{ 11793/*0.359895 Q15*/, 30572/*0.932993 Q15*/}}, - {{ 4410/*0.134581 Q15*/, 32470/*0.990903 Q15*/}}, - {{ -3212/*-0.098017 Q15*/, 32610/*0.995185 Q15*/}}, - {{-10660/*-0.325310 Q15*/, 30986/*0.945607 Q15*/}}, - {{-17531/*-0.534998 Q15*/, 27684/*0.844854 Q15*/}}, - {{-23453/*-0.715731 Q15*/, 22884/*0.698376 Q15*/}}, - {{-28106/*-0.857729 Q15*/, 16846/*0.514103 Q15*/}}, - {{-31238/*-0.953306 Q15*/, 9896/*0.302006 Q15*/}}, - {{-32679/*-0.997290 Q15*/, 2411/*0.073565 Q15*/}}, - {{-32352/*-0.987301 Q15*/, -5205/*-0.158858 Q15*/}}, - {{-30274/*-0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, - {{-26557/*-0.810457 Q15*/, -19195/*-0.585798 Q15*/}}, - {{-21403/*-0.653173 Q15*/, -24812/*-0.757209 Q15*/}}, - {{-15091/*-0.460539 Q15*/, -29086/*-0.887640 Q15*/}}, - {{ -7962/*-0.242980 Q15*/, -31786/*-0.970031 Q15*/}}, - {{ -402/*-0.012272 Q15*/, -32766/*-0.999925 Q15*/}}, - {{ 7180/*0.219101 Q15*/, -31972/*-0.975702 Q15*/}}, - {{ 14373/*0.438616 Q15*/, -29448/*-0.898674 Q15*/}}, - {{ 20788/*0.634393 Q15*/, -25330/*-0.773010 Q15*/}}, - {{ 26078/*0.795837 Q15*/, -19841/*-0.605511 Q15*/}}, - {{ 29957/*0.914210 Q15*/, -13279/*-0.405241 Q15*/}}, - {{ 32214/*0.983105 Q15*/, -5998/*-0.183040 Q15*/}}, - {{ 32729/*0.998795 Q15*/, 1608/*0.049068 Q15*/}}, - {{ 31471/*0.960431 Q15*/, 9127/*0.278520 Q15*/}}, - {{ 28511/*0.870087 Q15*/, 16151/*0.492898 Q15*/}}, - {{ 24008/*0.732654 Q15*/, 22302/*0.680601 Q15*/}}, - {{ 18205/*0.555570 Q15*/, 27246/*0.831470 Q15*/}}, - {{ 11417/*0.348419 Q15*/, 30715/*0.937339 Q15*/}}, - {{ 4011/*0.122411 Q15*/, 32522/*0.992480 Q15*/}}, - {{ -3612/*-0.110222 Q15*/, 32568/*0.993907 Q15*/}}, - {{-11039/*-0.336890 Q15*/, 30853/*0.941544 Q15*/}}, - {{-17869/*-0.545325 Q15*/, 27467/*0.838225 Q15*/}}, - {{-23732/*-0.724247 Q15*/, 22595/*0.689541 Q15*/}}, - {{-28311/*-0.863973 Q15*/, 16500/*0.503538 Q15*/}}, - {{-31357/*-0.956940 Q15*/, 9512/*0.290285 Q15*/}}, - {{-32706/*-0.998118 Q15*/, 2009/*0.061321 Q15*/}}, - {{-32286/*-0.985278 Q15*/, -5602/*-0.170962 Q15*/}}, - {{-30118/*-0.919114 Q15*/, -12910/*-0.393992 Q15*/}}, - {{-26320/*-0.803208 Q15*/, -19520/*-0.595699 Q15*/}}, - {{-21097/*-0.643832 Q15*/, -25073/*-0.765167 Q15*/}}, - {{-14733/*-0.449611 Q15*/, -29269/*-0.893224 Q15*/}}, - {{ -7571/*-0.231058 Q15*/, -31881/*-0.972940 Q15*/}} -}; - -const PWord16 w18N[127] = -{ - {{ 31972/*0.975702 Q15*/, 7180/*0.219101 Q15*/}}, - {{ 29622/*0.903989 Q15*/, 14010/*0.427555 Q15*/}}, - {{ 25833/*0.788346 Q15*/, 20160/*0.615232 Q15*/}}, - {{ 20788/*0.634393 Q15*/, 25330/*0.773010 Q15*/}}, - {{ 14733/*0.449611 Q15*/, 29269/*0.893224 Q15*/}}, - {{ 7962/*0.242980 Q15*/, 31786/*0.970031 Q15*/}}, - {{ 804/*0.024541 Q15*/, 32758/*0.999699 Q15*/}}, - {{ -6393/*-0.195090 Q15*/, 32138/*0.980785 Q15*/}}, - {{-13279/*-0.405241 Q15*/, 29957/*0.914210 Q15*/}}, - {{-19520/*-0.595699 Q15*/, 26320/*0.803208 Q15*/}}, - {{-24812/*-0.757209 Q15*/, 21403/*0.653173 Q15*/}}, - {{-28899/*-0.881921 Q15*/, 15447/*0.471397 Q15*/}}, - {{-31581/*-0.963776 Q15*/, 8740/*0.266713 Q15*/}}, - {{-32729/*-0.998795 Q15*/, 1608/*0.049068 Q15*/}}, - {{-32286/*-0.985278 Q15*/, -5602/*-0.170962 Q15*/}}, - {{-30274/*-0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, - {{-26791/*-0.817585 Q15*/, -18868/*-0.575808 Q15*/}}, - {{-22006/*-0.671559 Q15*/, -24279/*-0.740951 Q15*/}}, - {{-16151/*-0.492898 Q15*/, -28511/*-0.870087 Q15*/}}, - {{ -9512/*-0.290285 Q15*/, -31357/*-0.956940 Q15*/}}, - {{ -2411/*-0.073565 Q15*/, -32679/*-0.997290 Q15*/}}, - {{ 4808/*0.146730 Q15*/, -32413/*-0.989177 Q15*/}}, - {{ 11793/*0.359895 Q15*/, -30572/*-0.932993 Q15*/}}, - {{ 18205/*0.555570 Q15*/, -27246/*-0.831470 Q15*/}}, - {{ 23732/*0.724247 Q15*/, -22595/*-0.689541 Q15*/}}, - {{ 28106/*0.857729 Q15*/, -16846/*-0.514103 Q15*/}}, - {{ 31114/*0.949528 Q15*/, -10279/*-0.313682 Q15*/}}, - {{ 32610/*0.995185 Q15*/, -3212/*-0.098017 Q15*/}}, - {{ 32522/*0.992480 Q15*/, 4011/*0.122411 Q15*/}}, - {{ 30853/*0.941544 Q15*/, 11039/*0.336890 Q15*/}}, - {{ 27684/*0.844854 Q15*/, 17531/*0.534998 Q15*/}}, - {{ 23170/*0.707107 Q15*/, 23170/*0.707107 Q15*/}}, - {{ 17531/*0.534998 Q15*/, 27684/*0.844854 Q15*/}}, - {{ 11039/*0.336890 Q15*/, 30853/*0.941544 Q15*/}}, - {{ 4011/*0.122411 Q15*/, 32522/*0.992480 Q15*/}}, - {{ -3212/*-0.098017 Q15*/, 32610/*0.995185 Q15*/}}, - {{-10279/*-0.313682 Q15*/, 31114/*0.949528 Q15*/}}, - {{-16846/*-0.514103 Q15*/, 28106/*0.857729 Q15*/}}, - {{-22595/*-0.689541 Q15*/, 23732/*0.724247 Q15*/}}, - {{-27246/*-0.831470 Q15*/, 18205/*0.555570 Q15*/}}, - {{-30572/*-0.932993 Q15*/, 11793/*0.359895 Q15*/}}, - {{-32413/*-0.989177 Q15*/, 4808/*0.146730 Q15*/}}, - {{-32679/*-0.997290 Q15*/, -2411/*-0.073565 Q15*/}}, - {{-31357/*-0.956940 Q15*/, -9512/*-0.290285 Q15*/}}, - {{-28511/*-0.870087 Q15*/, -16151/*-0.492898 Q15*/}}, - {{-24279/*-0.740951 Q15*/, -22006/*-0.671559 Q15*/}}, - {{-18868/*-0.575808 Q15*/, -26791/*-0.817585 Q15*/}}, - {{-12540/*-0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, - {{ -5602/*-0.170962 Q15*/, -32286/*-0.985278 Q15*/}}, - {{ 1608/*0.049068 Q15*/, -32729/*-0.998795 Q15*/}}, - {{ 8740/*0.266713 Q15*/, -31581/*-0.963776 Q15*/}}, - {{ 15447/*0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, - {{ 21403/*0.653173 Q15*/, -24812/*-0.757209 Q15*/}}, - {{ 26320/*0.803208 Q15*/, -19520/*-0.595699 Q15*/}}, - {{ 29957/*0.914210 Q15*/, -13279/*-0.405241 Q15*/}}, - {{ 32138/*0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, - {{ 32758/*0.999699 Q15*/, 804/*0.024541 Q15*/}}, - {{ 31786/*0.970031 Q15*/, 7962/*0.242980 Q15*/}}, - {{ 29269/*0.893224 Q15*/, 14733/*0.449611 Q15*/}}, - {{ 25330/*0.773010 Q15*/, 20788/*0.634393 Q15*/}}, - {{ 20160/*0.615232 Q15*/, 25833/*0.788346 Q15*/}}, - {{ 14010/*0.427555 Q15*/, 29622/*0.903989 Q15*/}}, - {{ 7180/*0.219101 Q15*/, 31972/*0.975702 Q15*/}}, - {{ 0/*0.000000 Q15*/, 32767/*1.000000 Q15*/}}, - {{ -7180/*-0.219101 Q15*/, 31972/*0.975702 Q15*/}}, - {{-14010/*-0.427555 Q15*/, 29622/*0.903989 Q15*/}}, - {{-20160/*-0.615232 Q15*/, 25833/*0.788346 Q15*/}}, - {{-25330/*-0.773010 Q15*/, 20788/*0.634393 Q15*/}}, - {{-29269/*-0.893224 Q15*/, 14733/*0.449611 Q15*/}}, - {{-31786/*-0.970031 Q15*/, 7962/*0.242980 Q15*/}}, - {{-32758/*-0.999699 Q15*/, 804/*0.024541 Q15*/}}, - {{-32138/*-0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, - {{-29957/*-0.914210 Q15*/, -13279/*-0.405241 Q15*/}}, - {{-26320/*-0.803208 Q15*/, -19520/*-0.595699 Q15*/}}, - {{-21403/*-0.653173 Q15*/, -24812/*-0.757209 Q15*/}}, - {{-15447/*-0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, - {{ -8740/*-0.266713 Q15*/, -31581/*-0.963776 Q15*/}}, - {{ -1608/*-0.049068 Q15*/, -32729/*-0.998795 Q15*/}}, - {{ 5602/*0.170962 Q15*/, -32286/*-0.985278 Q15*/}}, - {{ 12540/*0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, - {{ 18868/*0.575808 Q15*/, -26791/*-0.817585 Q15*/}}, - {{ 24279/*0.740951 Q15*/, -22006/*-0.671559 Q15*/}}, - {{ 28511/*0.870087 Q15*/, -16151/*-0.492898 Q15*/}}, - {{ 31357/*0.956940 Q15*/, -9512/*-0.290285 Q15*/}}, - {{ 32679/*0.997290 Q15*/, -2411/*-0.073565 Q15*/}}, - {{ 32413/*0.989177 Q15*/, 4808/*0.146730 Q15*/}}, - {{ 30572/*0.932993 Q15*/, 11793/*0.359895 Q15*/}}, - {{ 27246/*0.831470 Q15*/, 18205/*0.555570 Q15*/}}, - {{ 22595/*0.689541 Q15*/, 23732/*0.724247 Q15*/}}, - {{ 16846/*0.514103 Q15*/, 28106/*0.857729 Q15*/}}, - {{ 10279/*0.313682 Q15*/, 31114/*0.949528 Q15*/}}, - {{ 3212/*0.098017 Q15*/, 32610/*0.995185 Q15*/}}, - {{ -4011/*-0.122411 Q15*/, 32522/*0.992480 Q15*/}}, - {{-11039/*-0.336890 Q15*/, 30853/*0.941544 Q15*/}}, - {{-17531/*-0.534998 Q15*/, 27684/*0.844854 Q15*/}}, - {{-23170/*-0.707107 Q15*/, 23170/*0.707107 Q15*/}}, - {{-27684/*-0.844854 Q15*/, 17531/*0.534998 Q15*/}}, - {{-30853/*-0.941544 Q15*/, 11039/*0.336890 Q15*/}}, - {{-32522/*-0.992480 Q15*/, 4011/*0.122411 Q15*/}}, - {{-32610/*-0.995185 Q15*/, -3212/*-0.098017 Q15*/}}, - {{-31114/*-0.949528 Q15*/, -10279/*-0.313682 Q15*/}}, - {{-28106/*-0.857729 Q15*/, -16846/*-0.514103 Q15*/}}, - {{-23732/*-0.724247 Q15*/, -22595/*-0.689541 Q15*/}}, - {{-18205/*-0.555570 Q15*/, -27246/*-0.831470 Q15*/}}, - {{-11793/*-0.359895 Q15*/, -30572/*-0.932993 Q15*/}}, - {{ -4808/*-0.146730 Q15*/, -32413/*-0.989177 Q15*/}}, - {{ 2411/*0.073565 Q15*/, -32679/*-0.997290 Q15*/}}, - {{ 9512/*0.290285 Q15*/, -31357/*-0.956940 Q15*/}}, - {{ 16151/*0.492898 Q15*/, -28511/*-0.870087 Q15*/}}, - {{ 22006/*0.671559 Q15*/, -24279/*-0.740951 Q15*/}}, - {{ 26791/*0.817585 Q15*/, -18868/*-0.575808 Q15*/}}, - {{ 30274/*0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, - {{ 32286/*0.985278 Q15*/, -5602/*-0.170962 Q15*/}}, - {{ 32729/*0.998795 Q15*/, 1608/*0.049068 Q15*/}}, - {{ 31581/*0.963776 Q15*/, 8740/*0.266713 Q15*/}}, - {{ 28899/*0.881921 Q15*/, 15447/*0.471397 Q15*/}}, - {{ 24812/*0.757209 Q15*/, 21403/*0.653173 Q15*/}}, - {{ 19520/*0.595699 Q15*/, 26320/*0.803208 Q15*/}}, - {{ 13279/*0.405241 Q15*/, 29957/*0.914210 Q15*/}}, - {{ 6393/*0.195090 Q15*/, 32138/*0.980785 Q15*/}}, - {{ -804/*-0.024541 Q15*/, 32758/*0.999699 Q15*/}}, - {{ -7962/*-0.242980 Q15*/, 31786/*0.970031 Q15*/}}, - {{-14733/*-0.449611 Q15*/, 29269/*0.893224 Q15*/}}, - {{-20788/*-0.634393 Q15*/, 25330/*0.773010 Q15*/}}, - {{-25833/*-0.788346 Q15*/, 20160/*0.615232 Q15*/}}, - {{-29622/*-0.903989 Q15*/, 14010/*0.427555 Q15*/}}, - {{-31972/*-0.975702 Q15*/, 7180/*0.219101 Q15*/}} -}; - -/*-------------------------------------------------------------------* - * 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) - * for fractional pitch search - * Used in lib_enc\pit_enc.c Q14 - *-------------------------------------------------------------------*/ -const Word16 inter4_1_fx[32] =//Q14 -{ - -12, -26, 32, 206, - 420, 455, 73, -766, - -1732, -2142,-1242, 1376, - 5429, 9910,13418,14746, - 13418, 9910, 5429, 1376, - -1242, -2142,-1732, -766, - 73, 455, 420, 206, - 32, -26, -12, 0 -}; - -const Word16 sin_switch_8[15] = { 3212, 6393, 9512, 12540, 15447, 18205, 20788, 23170, - 25330, 27246, 28899, 30274, 31357, 32138, 32610 -};//Q15 - -const Word16 sin_switch_16[30] = { 1660, 3315, 4962, 6596, 8213, 9810, 11380, 12922, - 14431, 15902, 17333, 18719, 20057, 21344, 22576, 23750, - 24863, 25912, 26895, 27808, 28651, 29419, 30112, 30728, - 31265, 31722, 32097, 32390, 32600, 32726 -};//Q15 - - -const Word16 sin_switch_32[60] = { 844, 1687, 2529, 3369, 4207, 5043, 5875, 6703, - 7526, 8345, 9158, 9965, 10766, 11559, 12345, 13122, - 13891, 14650, 15400, 16140, 16869, 17586, 18293, 18986, - 19668, 20336, 20991, 21632, 22258, 22870, 23467, 24048, - 24613, 25162, 25694, 26209, 26707, 27187, 27649, 28092, - 28518, 28924, 29311, 29678, 30026, 30354, 30662, 30949, - 31216, 31462, 31688, 31892, 32075, 32237, 32378, 32497, - 32594, 32670, 32725, 32757 -};//Q15 - - -const Word16 sin_switch_48[90] = { 566, 1131, 1696, 2261, 2825, 3388, 3950, 4511, - 5070, 5628, 6185, 6739, 7292, 7842, 8390, 8935, - 9478, 10018, 10555, 11089, 11620, 12147, 12670, 13190, - 13706, 14218, 14725, 15228, 15727, 16220, 16709, 17194, - 17672, 18146, 18614, 19077, 19534, 19985, 20431, 20870, - 21303, 21729, 22149, 22563, 22970, 23370, 23763, 24148, - 24527, 24899, 25263, 25619, 25968, 26309, 26642, 26968, - 27285, 27594, 27895, 28188, 28472, 28747, 29015, 29273, - 29523, 29764, 29996, 30219, 30433, 30639, 30835, 31021, - 31199, 31367, 31526, 31676, 31816, 31946, 32068, 32179, - 32281, 32373, 32456, 32529, 32592, 32646, 32690, 32724, - 32748, 32763 -};//Q15 - -const Word16 one_on_win_48k_fx[210] = -{ - 16399, 16412, 16425, 16439, 16452, 16465, 16479, 16492, - 16506, 16519, 16533, 16547, 16561, 16575, 16589, 16603, - 16618, 16632, 16647, 16662, 16677, 16692, 16707, 16722, - 16738, 16754, 16770, 16786, 16802, 16818, 16835, 16851, - 16868, 16885, 16902, 16919, 16937, 16955, 16972, 16990, - 17008, 17027, 17045, 17064, 17083, 17102, 17121, 17140, - 17160, 17180, 17200, 17220, 17240, 17261, 17281, 17302, - 17323, 17345, 17366, 17388, 17410, 17432, 17454, 17477, - 17499, 17522, 17545, 17569, 17592, 17616, 17640, 17664, - 17689, 17713, 17738, 17763, 17789, 17814, 17840, 17866, - 17892, 17918, 17945, 17972, 17999, 18027, 18054, 18082, - 18110, 18139, 18167, 18196, 18225, 18255, 18284, 18314, - 18345, 18375, 18406, 18437, 18468, 18499, 18531, 18563, - 18596, 18628, 18661, 18695, 18728, 18762, 18796, 18830, - 18865, 18900, 18935, 18971, 19007, 19043, 19080, 19117, - 19154, 19191, 19229, 19267, 19306, 19345, 19384, 19423, - 19463, 19504, 19544, 19585, 19626, 19668, 19710, 19752, - 19795, 19838, 19882, 19926, 19970, 20015, 20060, 20105, - 20151, 20198, 20244, 20291, 20339, 20387, 20435, 20484, - 20533, 20583, 20633, 20684, 20735, 20787, 20839, 20891, - 20944, 20997, 21051, 21106, 21161, 21216, 21272, 21328, - 21385, 21443, 21501, 21559, 21618, 21678, 21738, 21799, - 21860, 21922, 21984, 22048, 22111, 22175, 22240, 22306, - 22372, 22439, 22506, 22574, 22643, 22712, 22782, 22853, - 22924, 22996, 23069, 23142, 23216, 23291, 23367, 23443, - 23521, 23599, 23677, 23757, 23837, 23918, 24000, 24083, - 24167, 24251 -};//Q14 - -const Word16 one_on_win_8k_16k_48k_fx[70] = -{ - 16432, 16472, 16512, 16554, 16596, 16639, 16684, 16730, - 16778, 16826, 16876, 16928, 16981, 17036, 17092, 17150, - 17210, 17271, 17334, 17399, 17465, 17534, 17604, 17676, - 17751, 17827, 17905, 17986, 18068, 18153, 18240, 18329, - 18421, 18515, 18612, 18711, 18813, 18918, 19025, 19135, - 19248, 19364, 19483, 19606, 19731, 19860, 19992, 20128, - 20268, 20411, 20558, 20709, 20865, 21024, 21188, 21357, - 21530, 21708, 21891, 22079, 22273, 22472, 22677, 22888, - 23105, 23329, 23560, 23797, 24041, 24251 -};//Q14 - -const Word16 window_8_16_32kHz_fx[370] = -{ - 3, 9, 19, 33, 49, 69, 93, 119, - 149, 182, 219, 258, 301, 347, 396, 448, - 503, 561, 623, 687, 755, 825, 898, 974, - 1054, 1136, 1221, 1309, 1399, 1493, 1589, 1688, - 1790, 1895, 2002, 2112, 2225, 2340, 2458, 2579, - 2702, 2827, 2955, 3086, 3219, 3355, 3493, 3633, - 3775, 3920, 4068, 4217, 4369, 4523, 4679, 4837, - 4998, 5160, 5325, 5491, 5660, 5830, 6003, 6177, - 6353, 6531, 6711, 6892, 7076, 7260, 7447, 7635, - 7825, 8016, 8209, 8403, 8599, 8796, 8995, 9195, - 9396, 9598, 9802, 10007, 10212, 10419, 10628, 10837, - 11047, 11248, 11437, 11623, 11809, 11997, 12185, 12374, - 12564, 12754, 12944, 13135, 13326, 13517, 13709, 13901, - 14093, 14286, 14478, 14671, 14864, 15057, 15250, 15443, - 15636, 15829, 16023, 16216, 16409, 16602, 16794, 16987, - 17179, 17372, 17564, 17755, 17947, 18138, 18329, 18519, - 18710, 18899, 19089, 19278, 19466, 19654, 19841, 20028, - 20214, 20400, 20585, 20770, 20954, 21137, 21319, 21501, - 21682, 21862, 22042, 22220, 22398, 22575, 22751, 22926, - 23101, 23274, 23446, 23618, 23788, 23958, 24126, 24266, - 24321, 24460, 24625, 24789, 24953, 25114, 25275, 25435, - 25593, 25751, 25907, 26061, 26215, 26367, 26518, 26668, - 26817, 26964, 27110, 27254, 27398, 27540, 27680, 27819, - 27957, 28093, 28228, 28362, 28494, 28625, 28754, 28882, - 29008, 29133, 29256, 29378, 29499, 29618, 29736, 29852, - 29966, 30079, 30191, 30301, 30410, 30517, 30623, 30727, - 30830, 30931, 31031, 31129, 31226, 31322, 31416, 31508, - 31599, 31689, 31777, 31864, 31950, 32035, 32118, 32200, - 32280, 32360, 32439, 32517, 32595, 32673, 32673, 32593, - 32513, 32432, 32349, 32265, 32178, 32090, 31999, 31907, - 31812, 31715, 31615, 31514, 31410, 31304, 31196, 31085, - 30972, 30857, 30739, 30619, 30497, 30372, 30245, 30116, - 29984, 29850, 29714, 29575, 29434, 29290, 29144, 28996, - 28845, 28692, 28537, 28379, 28219, 28057, 27892, 27725, - 27555, 27383, 27209, 27033, 26854, 26672, 26489, 26303, - 26115, 25924, 25731, 25536, 25338, 25138, 24936, 24731, - 24525, 24316, 24104, 23890, 23674, 23456, 23236, 23013, - 22788, 22561, 22331, 22138, 22060, 21865, 21629, 21390, - 21150, 20907, 20662, 20414, 20165, 19913, 19659, 19403, - 19145, 18885, 18622, 18357, 18090, 17821, 17550, 17277, - 17001, 16723, 16443, 16161, 15877, 15591, 15303, 15012, - 14719, 14425, 14127, 13828, 13527, 13223, 12918, 12610, - 12300, 11988, 11673, 11356, 11038, 10716, 10393, 10067, - 9739, 9408, 9076, 8740, 8403, 8062, 7720, 7374, - 7026, 6675, 6322, 5965, 5606, 5243, 4878, 4508, - 4136, 3759, 3378, 2993, 2603, 2208, 1807, 1397, - 978, 545 -};//Q15 - -const Word16 window_48kHz_fx[1110] = -{ - 0, 1, 2, 3, 5, 8, 10, 13, - 17, 21, 25, 30, 35, 40, 46, 52, - 58, 65, 72, 80, 88, 96, 105, 114, - 124, 133, 144, 154, 165, 176, 188, 200, - 212, 225, 238, 251, 265, 279, 293, 308, - 323, 339, 354, 371, 387, 404, 421, 439, - 457, 475, 493, 512, 532, 551, 571, 591, - 612, 633, 654, 676, 698, 720, 743, 766, - 789, 813, 837, 861, 885, 910, 936, 961, - 987, 1013, 1040, 1067, 1094, 1122, 1149, 1178, - 1206, 1235, 1264, 1293, 1323, 1353, 1384, 1414, - 1445, 1477, 1508, 1540, 1573, 1605, 1638, 1671, - 1705, 1739, 1773, 1807, 1842, 1877, 1912, 1948, - 1984, 2020, 2057, 2093, 2130, 2168, 2206, 2244, - 2282, 2320, 2359, 2399, 2438, 2478, 2518, 2558, - 2599, 2640, 2681, 2722, 2764, 2806, 2848, 2891, - 2934, 2977, 3020, 3064, 3108, 3152, 3196, 3241, - 3286, 3332, 3377, 3423, 3469, 3515, 3562, 3609, - 3656, 3704, 3751, 3799, 3847, 3896, 3945, 3994, - 4043, 4092, 4142, 4192, 4242, 4293, 4343, 4394, - 4445, 4497, 4549, 4600, 4653, 4705, 4758, 4811, - 4864, 4917, 4971, 5024, 5078, 5133, 5187, 5242, - 5297, 5352, 5407, 5463, 5519, 5575, 5631, 5688, - 5744, 5801, 5859, 5916, 5974, 6031, 6089, 6147, - 6206, 6265, 6323, 6382, 6442, 6501, 6561, 6620, - 6680, 6741, 6801, 6862, 6922, 6983, 7045, 7106, - 7168, 7229, 7291, 7353, 7416, 7478, 7541, 7604, - 7667, 7730, 7793, 7857, 7920, 7984, 8048, 8112, - 8177, 8241, 8306, 8371, 8436, 8501, 8566, 8632, - 8697, 8763, 8829, 8895, 8961, 9028, 9094, 9161, - 9228, 9295, 9362, 9429, 9497, 9564, 9632, 9700, - 9768, 9836, 9904, 9972, 10041, 10109, 10178, 10247, - 10316, 10385, 10454, 10523, 10593, 10662, 10732, 10802, - 10871, 10941, 11012, 11082, 11152, 11222, 11283, 11344, - 11406, 11467, 11529, 11591, 11653, 11716, 11778, 11840, - 11903, 11966, 12028, 12091, 12154, 12217, 12280, 12343, - 12406, 12469, 12532, 12595, 12658, 12722, 12785, 12849, - 12912, 12976, 13039, 13103, 13166, 13230, 13294, 13358, - 13421, 13485, 13549, 13613, 13677, 13741, 13805, 13869, - 13933, 13997, 14061, 14125, 14189, 14253, 14318, 14382, - 14446, 14510, 14574, 14639, 14703, 14767, 14832, 14896, - 14960, 15025, 15089, 15153, 15218, 15282, 15346, 15411, - 15475, 15540, 15604, 15668, 15733, 15797, 15862, 15926, - 15990, 16055, 16119, 16183, 16248, 16312, 16376, 16441, - 16505, 16569, 16634, 16698, 16762, 16826, 16891, 16955, - 17019, 17083, 17147, 17211, 17275, 17339, 17404, 17468, - 17532, 17596, 17659, 17723, 17787, 17851, 17915, 17979, - 18042, 18106, 18170, 18233, 18297, 18361, 18424, 18488, - 18551, 18614, 18678, 18741, 18804, 18868, 18931, 18994, - 19057, 19120, 19183, 19246, 19309, 19372, 19434, 19497, - 19560, 19622, 19685, 19748, 19810, 19872, 19935, 19997, - 20059, 20121, 20183, 20245, 20307, 20369, 20431, 20493, - 20554, 20616, 20677, 20739, 20800, 20862, 20923, 20984, - 21045, 21106, 21167, 21228, 21289, 21349, 21410, 21471, - 21531, 21591, 21652, 21712, 21772, 21832, 21892, 21952, - 22012, 22071, 22131, 22190, 22250, 22309, 22368, 22427, - 22486, 22545, 22604, 22663, 22722, 22780, 22839, 22897, - 22955, 23013, 23071, 23129, 23187, 23245, 23303, 23360, - 23418, 23475, 23532, 23589, 23646, 23703, 23760, 23817, - 23873, 23930, 23986, 24042, 24098, 24154, 24210, 24266, - 24321, 24377, 24432, 24488, 24543, 24598, 24653, 24707, - 24762, 24817, 24871, 24925, 24979, 25034, 25087, 25141, - 25195, 25248, 25302, 25355, 25408, 25461, 25514, 25567, - 25620, 25672, 25724, 25777, 25829, 25881, 25932, 25984, - 26036, 26087, 26138, 26189, 26240, 26291, 26342, 26393, - 26443, 26493, 26543, 26593, 26643, 26693, 26743, 26792, - 26841, 26890, 26939, 26988, 27037, 27086, 27134, 27182, - 27230, 27278, 27326, 27374, 27421, 27469, 27516, 27563, - 27610, 27657, 27703, 27750, 27796, 27842, 27888, 27934, - 27980, 28025, 28071, 28116, 28161, 28206, 28250, 28295, - 28340, 28384, 28428, 28472, 28516, 28559, 28603, 28646, - 28689, 28732, 28775, 28818, 28860, 28903, 28945, 28987, - 29029, 29071, 29112, 29154, 29195, 29236, 29277, 29318, - 29358, 29399, 29439, 29479, 29519, 29559, 29598, 29638, - 29677, 29716, 29755, 29794, 29832, 29871, 29909, 29947, - 29985, 30023, 30061, 30098, 30135, 30172, 30209, 30246, - 30283, 30319, 30356, 30392, 30428, 30464, 30499, 30535, - 30570, 30605, 30640, 30675, 30710, 30744, 30779, 30813, - 30847, 30881, 30914, 30948, 30981, 31014, 31047, 31080, - 31113, 31145, 31178, 31210, 31242, 31274, 31306, 31337, - 31369, 31400, 31431, 31462, 31493, 31523, 31554, 31584, - 31614, 31644, 31674, 31704, 31733, 31763, 31792, 31821, - 31850, 31879, 31907, 31936, 31964, 31992, 32020, 32048, - 32076, 32104, 32131, 32159, 32186, 32213, 32240, 32267, - 32294, 32320, 32347, 32373, 32399, 32426, 32452, 32478, - 32504, 32530, 32556, 32582, 32607, 32633, 32659, 32685, - 32712, 32739, 32739, 32712, 32685, 32659, 32633, 32606, - 32580, 32553, 32527, 32500, 32473, 32446, 32418, 32391, - 32363, 32335, 32307, 32279, 32251, 32222, 32193, 32164, - 32134, 32105, 32075, 32045, 32015, 31984, 31953, 31922, - 31891, 31859, 31828, 31796, 31764, 31731, 31698, 31665, - 31632, 31599, 31565, 31531, 31497, 31462, 31428, 31393, - 31357, 31322, 31286, 31250, 31214, 31177, 31141, 31104, - 31066, 31029, 30991, 30953, 30915, 30876, 30837, 30798, - 30759, 30719, 30679, 30639, 30599, 30558, 30517, 30476, - 30435, 30393, 30351, 30309, 30266, 30224, 30181, 30138, - 30094, 30050, 30006, 29962, 29917, 29873, 29827, 29782, - 29737, 29691, 29645, 29598, 29551, 29505, 29457, 29410, - 29362, 29314, 29266, 29218, 29169, 29120, 29070, 29021, - 28971, 28921, 28871, 28820, 28769, 28718, 28667, 28615, - 28563, 28511, 28459, 28406, 28353, 28300, 28246, 28192, - 28138, 28084, 28030, 27975, 27920, 27864, 27809, 27753, - 27697, 27640, 27584, 27527, 27470, 27412, 27355, 27297, - 27238, 27180, 27121, 27062, 27003, 26944, 26884, 26824, - 26763, 26703, 26642, 26581, 26520, 26458, 26396, 26334, - 26272, 26209, 26146, 26083, 26020, 25956, 25892, 25828, - 25763, 25699, 25634, 25568, 25503, 25437, 25371, 25305, - 25239, 25172, 25105, 25037, 24970, 24902, 24834, 24766, - 24697, 24628, 24559, 24490, 24420, 24351, 24281, 24210, - 24140, 24069, 23998, 23926, 23855, 23783, 23711, 23638, - 23566, 23493, 23420, 23346, 23273, 23199, 23125, 23050, - 22976, 22901, 22826, 22750, 22675, 22599, 22523, 22446, - 22370, 22293, 22215, 22138, 22060, 21983, 21904, 21826, - 21747, 21669, 21589, 21510, 21430, 21351, 21271, 21190, - 21110, 21029, 20948, 20866, 20785, 20703, 20621, 20538, - 20456, 20373, 20290, 20207, 20123, 20039, 19955, 19871, - 19787, 19702, 19617, 19532, 19446, 19360, 19274, 19188, - 19102, 19015, 18928, 18841, 18754, 18666, 18578, 18490, - 18402, 18313, 18224, 18135, 18046, 17956, 17866, 17776, - 17686, 17595, 17505, 17414, 17322, 17231, 17139, 17047, - 16955, 16863, 16770, 16677, 16584, 16490, 16397, 16303, - 16209, 16114, 16020, 15925, 15830, 15735, 15639, 15543, - 15447, 15351, 15254, 15158, 15061, 14964, 14866, 14768, - 14671, 14572, 14474, 14375, 14276, 14177, 14078, 13978, - 13878, 13778, 13678, 13578, 13477, 13376, 13274, 13173, - 13071, 12969, 12867, 12764, 12662, 12559, 12455, 12352, - 12248, 12144, 12040, 11936, 11831, 11726, 11621, 11515, - 11410, 11304, 11197, 11091, 10984, 10877, 10770, 10663, - 10555, 10447, 10339, 10230, 10122, 10013, 9904, 9794, - 9684, 9574, 9464, 9353, 9243, 9131, 9020, 8908, - 8797, 8684, 8572, 8459, 8346, 8233, 8119, 8006, - 7892, 7777, 7662, 7547, 7432, 7317, 7201, 7085, - 6968, 6851, 6734, 6617, 6499, 6381, 6263, 6144, - 6025, 5906, 5786, 5666, 5546, 5425, 5304, 5183, - 5061, 4939, 4817, 4694, 4570, 4447, 4323, 4198, - 4074, 3948, 3823, 3696, 3570, 3443, 3315, 3187, - 3058, 2929, 2800, 2669, 2539, 2407, 2275, 2142, - 2009, 1875, 1740, 1604, 1467, 1330, 1191, 1051, - 909, 766, 621, 474, 324, 169 -};//Q15 - -const Word16 window_256kHz[592] = /*ALDO at 25.6 maybe not needed ?Q15*/ -{ - 1, 3, 7, 12, 19, 27, 36, 47, - 58, 72, 86, 102, 119, 138, 157, 178, - 201, 224, 249, 275, 302, 331, 361, 391, - 424, 457, 492, 527, 564, 603, 642, 683, - 724, 767, 811, 857, 903, 951, 999, 1049, - 1100, 1152, 1205, 1260, 1315, 1372, 1430, 1488, - 1548, 1609, 1671, 1735, 1799, 1864, 1931, 1998, - 2066, 2136, 2207, 2278, 2351, 2424, 2499, 2575, - 2651, 2729, 2808, 2887, 2968, 3049, 3132, 3215, - 3300, 3385, 3472, 3559, 3647, 3736, 3826, 3917, - 4009, 4101, 4195, 4289, 4385, 4481, 4578, 4676, - 4774, 4874, 4974, 5075, 5177, 5280, 5384, 5488, - 5593, 5699, 5806, 5913, 6021, 6130, 6240, 6350, - 6461, 6573, 6685, 6798, 6912, 7026, 7141, 7257, - 7373, 7491, 7608, 7726, 7845, 7965, 8085, 8206, - 8327, 8449, 8571, 8694, 8817, 8941, 9066, 9191, - 9316, 9442, 9569, 9696, 9823, 9951, 10079, 10208, - 10337, 10467, 10597, 10727, 10858, 10990, 11121, 11253, - 11367, 11482, 11598, 11714, 11831, 11948, 12065, 12182, - 12300, 12418, 12536, 12654, 12772, 12891, 13010, 13129, - 13248, 13367, 13486, 13605, 13725, 13844, 13964, 14084, - 14203, 14323, 14443, 14563, 14683, 14804, 14924, 15044, - 15164, 15284, 15405, 15525, 15645, 15765, 15885, 16006, - 16126, 16246, 16366, 16486, 16606, 16726, 16846, 16966, - 17086, 17206, 17325, 17445, 17564, 17684, 17803, 17922, - 18041, 18160, 18279, 18397, 18516, 18634, 18753, 18871, - 18988, 19106, 19224, 19341, 19458, 19575, 19692, 19809, - 19925, 20041, 20157, 20273, 20388, 20503, 20618, 20733, - 20848, 20962, 21076, 21190, 21303, 21416, 21529, 21642, - 21754, 21866, 21978, 22089, 22200, 22311, 22421, 22531, - 22641, 22751, 22860, 22968, 23077, 23185, 23293, 23400, - 23507, 23613, 23719, 23825, 23931, 24036, 24140, 24244, - 24348, 24452, 24555, 24657, 24759, 24861, 24962, 25063, - 25163, 25263, 25363, 25462, 25561, 25659, 25756, 25854, - 25950, 26047, 26142, 26238, 26333, 26427, 26521, 26614, - 26707, 26799, 26891, 26982, 27073, 27164, 27253, 27343, - 27432, 27520, 27608, 27695, 27781, 27868, 27953, 28038, - 28123, 28207, 28290, 28373, 28456, 28537, 28619, 28699, - 28780, 28859, 28938, 29017, 29095, 29172, 29249, 29325, - 29401, 29476, 29550, 29624, 29698, 29771, 29843, 29915, - 29986, 30056, 30126, 30196, 30264, 30333, 30400, 30467, - 30534, 30600, 30665, 30730, 30794, 30858, 30921, 30984, - 31046, 31107, 31168, 31228, 31288, 31347, 31406, 31464, - 31522, 31579, 31635, 31691, 31746, 31801, 31856, 31909, - 31963, 32016, 32068, 32120, 32171, 32222, 32273, 32323, - 32372, 32422, 32471, 32520, 32568, 32617, 32666, 32715, - 32715, 32666, 32616, 32567, 32517, 32466, 32415, 32364, - 32311, 32258, 32204, 32150, 32094, 32038, 31981, 31923, - 31864, 31805, 31744, 31683, 31621, 31557, 31494, 31429, - 31363, 31296, 31229, 31161, 31091, 31021, 30950, 30878, - 30805, 30731, 30657, 30581, 30505, 30427, 30349, 30270, - 30189, 30108, 30026, 29943, 29860, 29775, 29689, 29603, - 29515, 29427, 29337, 29247, 29156, 29064, 28971, 28877, - 28782, 28687, 28590, 28492, 28394, 28294, 28194, 28093, - 27991, 27888, 27784, 27679, 27573, 27466, 27358, 27250, - 27140, 27030, 26919, 26806, 26693, 26579, 26464, 26349, - 26232, 26114, 25996, 25876, 25756, 25635, 25512, 25389, - 25265, 25140, 25015, 24888, 24761, 24632, 24503, 24373, - 24242, 24110, 23977, 23843, 23708, 23573, 23436, 23299, - 23161, 23022, 22882, 22741, 22599, 22457, 22313, 22169, - 22024, 21878, 21731, 21583, 21435, 21285, 21135, 20984, - 20832, 20679, 20525, 20370, 20215, 20059, 19901, 19743, - 19584, 19425, 19264, 19103, 18940, 18777, 18613, 18448, - 18283, 18116, 17949, 17781, 17612, 17442, 17271, 17100, - 16927, 16754, 16580, 16405, 16230, 16053, 15876, 15698, - 15518, 15339, 15158, 14976, 14794, 14611, 14427, 14242, - 14056, 13869, 13682, 13494, 13305, 13115, 12924, 12732, - 12540, 12346, 12152, 11957, 11761, 11564, 11366, 11168, - 10968, 10768, 10566, 10364, 10161, 9957, 9752, 9547, - 9340, 9132, 8924, 8714, 8503, 8292, 8079, 7866, - 7651, 7436, 7219, 7002, 6783, 6563, 6343, 6121, - 5897, 5673, 5448, 5221, 4993, 4764, 4533, 4301, - 4067, 3832, 3596, 3358, 3118, 2876, 2632, 2387, - 2139, 1888, 1635, 1379, 1119, 854, 583, 304 -}; - -const Word16 small_overlap_48[R2_48 / 7] =//Q15 -{ - 429, 1286, 2143, 2998, 3851, 4702, 5549, 6393, - 7232, 8066, 8895, 9717, 10533, 11342, 12142, 12935, - 13719, 14493, 15257, 16011, 16754, 17485, 18205, 18912, - 19606, 20286, 20953, 21605, 22243, 22865, 23472, 24062, - 24636, 25193, 25733, 26255, 26760, 27246, 27713, 28161, - 28590, 28999, 29389, 29758, 30107, 30435, 30743, 31029, - 31294, 31538, 31760, 31960, 32138, 32295, 32429, 32541, - 32631, 32698, 32743, 32765 -}; - -const Word16 small_overlap_25[R2_25 / 7] =//Q15 -{ - 804, 2411, 4011, 5602, 7180, 8740, 10279, 11793, - 13279, 14733, 16151, 17531, 18868, 20160, 21403, 22595, - 23732, 24812, 25833, 26791, 27684, 28511, 29269, 29957, - 30572, 31114, 31581, 31972, 32286, 32522, 32679, 32758 -}; - -const Word16 small_overlap_int[R2_16 / 7] =//Q15 -{ - 2571, 5126, - 7650, 10126, 12540, 14876, 17121, 19261, 21281, 22865, - 23472, 24917, 26510, 27939, 29197, 30274, 31164, 31863, - 32365, 32667 -}; - - -const Word16 half_overlap_48[3 * R2_48 / 7] =//Q15 -{ - 143, 429, - 715, 1001, 1286, 1572, 1858, 2143, 2428, 2713, - 2998, 3283, 3567, 3851, 4135, 4419, 4702, 4985, - 5267, 5549, 5831, 6112, 6393, 6673, 6953, 7232, - 7510, 7788, 8066, 8343, 8619, 8895, 9169, 9444, - 9717, 9990, 10262, 10533, 10803, 11073, 11342, 11609, - 11876, 12142, 12408, 12672, 12935, 13197, 13458, 13719, - 13978, 14236, 14493, 14749, 15004, 15257, 15510, 15761, - 16011, 16260, 16508, 16754, 16999, 17243, 17485, 17727, - 17966, 18205, 18442, 18678, 18912, 19145, 19376, 19606, - 19834, 20061, 20286, 20510, 20732, 20953, 21172, 21390, - 21605, 21820, 22032, 22243, 22452, 22659, 22865, 23069, - 23271, 23472, 23670, 23867, 24062, 24255, 24447, 24636, - 24824, 25010, 25193, 25375, 25555, 25733, 25909, 26083, - 26255, 26426, 26594, 26760, 26924, 27086, 27246, 27403, - 27559, 27713, 27864, 28014, 28161, 28306, 28449, 28590, - 28729, 28865, 28999, 29131, 29261, 29389, 29514, 29637, - 29758, 29877, 29993, 30107, 30219, 30328, 30435, 30540, - 30643, 30743, 30840, 30936, 31029, 31120, 31208, 31294, - 31378, 31459, 31538, 31614, 31688, 31760, 31829, 31896, - 31960, 32022, 32081, 32138, 32193, 32245, 32295, 32342, - 32387, 32429, 32469, 32506, 32541, 32573, 32603, 32631, - 32655, 32678, 32698, 32715, 32730, 32743, 32753, 32760, - 32765, 32767 -}; - -const Word16 half_overlap_25[3 * R2_25 / 7] =//Q15 -{ - 268, 804, 1340, 1876, 2411, 2945, 3479, 4011, - 4543, 5073, 5602, 6130, 6655, 7180, 7702, 8222, - 8740, 9255, 9768, 10279, 10786, 11291, 11793, 12292, - 12787, 13279, 13767, 14252, 14733, 15210, 15683, 16151, - 16616, 17075, 17531, 17981, 18427, 18868, 19304, 19735, - 20160, 20580, 20994, 21403, 21806, 22204, 22595, 22980, - 23359, 23732, 24099, 24459, 24812, 25159, 25499, 25833, - 26159, 26478, 26791, 27096, 27394, 27684, 27967, 28243, - 28511, 28771, 29024, 29269, 29506, 29736, 29957, 30170, - 30375, 30572, 30761, 30942, 31114, 31278, 31434, 31581, - 31720, 31850, 31972, 32085, 32190, 32286, 32373, 32452, - 32522, 32583, 32635, 32679, 32714, 32741, 32758, 32767 -}; - -const Word16 half_overlap_int[3 * R2_16 / 7] =//Q15 -{ - 858, 1715, 2571, 3425, 4277, 5126, - 5971, 6813, 7650, 8481, 9307, 10126, 10938, 11743, - 12540, 13328, 14107, 14876, 15636, 16384, 17121, 17847, - 18560, 19261, 19948, 20622, 21281, 21926, 22556, 23069, - 23271, 23769, 24351, 24917, 25466, 25997, 26510, 27005, - 27482, 27939, 28378, 28797, 29197, 29576, 29935, 30274, - 30592, 30888, 31164, 31419, 31651, 31863, 32052, 32219, - 32365, 32488, 32588, 32667, 32723, 32757 -}; -const Word16 wac_h[LPC_SHB_ORDER] =//Q15 -{ - 32763, - 32751, - 32731, - 32703, - 32667, - 32622, - 32570, - 32510, - 32442, - 32366 -}; - -const Word16 wac_l[LPC_SHB_ORDER] =//Q15 -{ - 31381, - 27317, - 20869, - 12529, - 2980, - 25869, - 16731, - 9600, - 5926, - 7354 -}; - -const Word16 dsDiracsTab[65] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 23, 25, - 27, 29, 31, 33, 35, 37, 39, 43, - 47, 51, 55, 59, 63, 67, 71, 75, - 83, 91, 99, 107, 115, 123, 131, 139, - 147, 163, 179, 195, 211, 227, 243, 259, - 275, 291, 323, 355, 387, 419, 451, 483, - 512 -}; - -const Word16 pwf_fx[17] =//Q12 -{ - 22938, 16056, 11239, 7868, 5507, 3855, 2699, 1889, - 1322, 926, 648, 454, 317, 222, 156, 109, - 76 -}; - -const Word32 inverse_table[] =//Q29 -{ - 0, - 134217728, 67108864, 44739242, 33554432, 26843545, 22369621, 19173961, 16777216, 14913080, 13421772, 12201611, 11184810, 10324440, 9586980, 8947848, 8388608, 7895160, 7456540, 7064090, 6710886, 6391320, 6100805, 5835553, 5592405, 5368709, 5162220, 4971026, 4793490, 4628197, 4473924, 4329604, 4194304, 4067203, 3947580, 3834792, 3728270, 3627506, 3532045, 3441480, 3355443, 3273603, 3195660, 3121342, 3050402, 2982616, 2917776, 2855696, 2796202, 2739137, 2684354, 2631720, 2581110, 2532409, 2485513, 2440322, 2396745, 2354696, 2314098, 2274876, 2236962, 2200290, 2164802, 2130440, 2097152, 2064888, 2033601, 2003249, 1973790, 1945184, 1917396, 1890390, 1864135, 1838599, 1813753, 1789569, 1766022, 1743087, 1720740, 1698958, 1677721, 1657008, 1636801, 1617081, 1597830, 1579032, 1560671, 1542732, 1525201, 1508064, 1491308, 1474920, 1458888, 1443201, 1427848, 1412818, 1398101, 1383687, 1369568, 1355734, 1342177, 1328888, 1315860, 1303084, 1290555, 1278264, 1266204, 1254371, 1242756, 1231355, 1220161, 1209168, 1198372, 1187767, 1177348, 1167110, 1157049, 1147160, 1137438, 1127880, 1118481, 1109237, 1100145, 1091201, 1082401, 1073741, 1065220, 1056832, 1048576, 1040447, 1032444, 1024562, 1016800, 1009155, 1001624, 994205, 986895, 979691, 972592, 965595, 958698, 951898, 945195, 938585, 932067, 925639, 919299, 913045, 906876, 900790, 894784, 888859, 883011, 877240, 871543, 865920, 860370, 854889, 849479, 844136, 838860, 833650, 828504, 823421, 818400, 813440, 808540, 803698, 798915, 794187, 789516, 784898, 780335, 775825, 771366, 766958, 762600, 758292, 754032, 749819, 745654, 741534, 737460, 733430, 729444, 725501, 721600, 717741, 713924, 710146, 706409, 702710, 699050, 695428, 691843, 688296, 684784, 681308, 677867, 674460, 671088, 667749, 664444, 661171, 657930, 654720, 651542, 648394, 645277, 642190, 639132, 636102, 633102, 630130, 627185, 624268, 621378, 618514, 615677, 612866, 610080, 607320, 604584, 601873, 599186, 596523, 593883, 591267, 588674, 586103, 583555, 581029, 578524, 576041, 573580, 571139, 568719, 566319, 563940, 561580, 559240, 556920, 554618, 552336, 550072, 547827, 545600, 543391, 541200, 539027, 536870, 534731, 532610, 530504, 528416, 526344, -}; - -const Word16 cos_diff_table[512] =//Q15 -{ - SHC(0xFFFF), SHC(0xFFF8), SHC(0xFFF4), SHC(0xFFEF), SHC(0xFFE9), SHC(0xFFE5), SHC(0xFFE0), SHC(0xFFDB), - SHC(0xFFD6), SHC(0xFFD2), SHC(0xFFCC), SHC(0xFFC7), SHC(0xFFC3), SHC(0xFFBE), SHC(0xFFB8), SHC(0xFFB4), - SHC(0xFFB0), SHC(0xFFAA), SHC(0xFFA5), SHC(0xFFA1), SHC(0xFF9C), SHC(0xFF97), SHC(0xFF92), SHC(0xFF8E), - SHC(0xFF89), SHC(0xFF84), SHC(0xFF80), SHC(0xFF7B), SHC(0xFF76), SHC(0xFF71), SHC(0xFF6D), SHC(0xFF69), - SHC(0xFF64), SHC(0xFF5F), SHC(0xFF5B), SHC(0xFF56), SHC(0xFF52), SHC(0xFF4D), SHC(0xFF49), SHC(0xFF45), - SHC(0xFF40), SHC(0xFF3C), SHC(0xFF38), SHC(0xFF33), SHC(0xFF2F), SHC(0xFF2B), SHC(0xFF27), SHC(0xFF23), - SHC(0xFF1E), SHC(0xFF1B), SHC(0xFF16), SHC(0xFF13), SHC(0xFF0E), SHC(0xFF0B), SHC(0xFF06), SHC(0xFF03), - SHC(0xFEFF), SHC(0xFEFB), SHC(0xFEF8), SHC(0xFEF3), SHC(0xFEF1), SHC(0xFEEC), SHC(0xFEE9), SHC(0xFEE5), - SHC(0xFEE2), SHC(0xFEDF), SHC(0xFEDB), SHC(0xFED8), SHC(0xFED4), SHC(0xFED1), SHC(0xFECE), SHC(0xFECB), - SHC(0xFEC7), SHC(0xFEC5), SHC(0xFEC1), SHC(0xFEBF), SHC(0xFEBB), SHC(0xFEB9), SHC(0xFEB6), SHC(0xFEB3), - SHC(0xFEB0), SHC(0xFEAE), SHC(0xFEAB), SHC(0xFEA8), SHC(0xFEA6), SHC(0xFEA3), SHC(0xFEA1), SHC(0xFE9F), - SHC(0xFE9C), SHC(0xFE9A), SHC(0xFE98), SHC(0xFE95), SHC(0xFE94), SHC(0xFE91), SHC(0xFE8F), SHC(0xFE8E), - SHC(0xFE8B), SHC(0xFE8A), SHC(0xFE88), SHC(0xFE86), SHC(0xFE85), SHC(0xFE83), SHC(0xFE81), SHC(0xFE80), - SHC(0xFE7F), SHC(0xFE7D), SHC(0xFE7B), SHC(0xFE7B), SHC(0xFE79), SHC(0xFE79), SHC(0xFE77), SHC(0xFE76), - SHC(0xFE75), SHC(0xFE74), SHC(0xFE73), SHC(0xFE73), SHC(0xFE72), SHC(0xFE71), SHC(0xFE71), SHC(0xFE70), - SHC(0xFE6F), SHC(0xFE70), SHC(0xFE6E), SHC(0xFE6F), SHC(0xFE6E), SHC(0xFE6E), SHC(0xFE6E), SHC(0xFE6E), - SHC(0xFE6E), SHC(0xFE6E), SHC(0xFE6E), SHC(0xFE6E), SHC(0xFE6F), SHC(0xFE6E), SHC(0xFE70), SHC(0xFE6F), - SHC(0xFE70), SHC(0xFE71), SHC(0xFE71), SHC(0xFE72), SHC(0xFE73), SHC(0xFE73), SHC(0xFE74), SHC(0xFE75), - SHC(0xFE76), SHC(0xFE77), SHC(0xFE79), SHC(0xFE79), SHC(0xFE7B), SHC(0xFE7B), SHC(0xFE7D), SHC(0xFE7F), - SHC(0xFE80), SHC(0xFE81), SHC(0xFE83), SHC(0xFE85), SHC(0xFE86), SHC(0xFE88), SHC(0xFE8A), SHC(0xFE8B), - SHC(0xFE8E), SHC(0xFE8F), SHC(0xFE91), SHC(0xFE94), SHC(0xFE95), SHC(0xFE98), SHC(0xFE9A), SHC(0xFE9C), - SHC(0xFE9F), SHC(0xFEA1), SHC(0xFEA3), SHC(0xFEA6), SHC(0xFEA8), SHC(0xFEAB), SHC(0xFEAE), SHC(0xFEB0), - SHC(0xFEB3), SHC(0xFEB6), SHC(0xFEB9), SHC(0xFEBB), SHC(0xFEBF), SHC(0xFEC1), SHC(0xFEC5), SHC(0xFEC7), - SHC(0xFECB), SHC(0xFECE), SHC(0xFED1), SHC(0xFED4), SHC(0xFED8), SHC(0xFEDB), SHC(0xFEDF), SHC(0xFEE2), - SHC(0xFEE5), SHC(0xFEE9), SHC(0xFEEC), SHC(0xFEF1), SHC(0xFEF3), SHC(0xFEF8), SHC(0xFEFB), SHC(0xFEFF), - SHC(0xFF03), SHC(0xFF06), SHC(0xFF0B), SHC(0xFF0E), SHC(0xFF13), SHC(0xFF16), SHC(0xFF1B), SHC(0xFF1E), - SHC(0xFF23), SHC(0xFF27), SHC(0xFF2B), SHC(0xFF2F), SHC(0xFF33), SHC(0xFF38), SHC(0xFF3C), SHC(0xFF40), - SHC(0xFF45), SHC(0xFF49), SHC(0xFF4D), SHC(0xFF52), SHC(0xFF56), SHC(0xFF5B), SHC(0xFF5F), SHC(0xFF64), - SHC(0xFF69), SHC(0xFF6D), SHC(0xFF71), SHC(0xFF76), SHC(0xFF7B), SHC(0xFF80), SHC(0xFF84), SHC(0xFF89), - SHC(0xFF8E), SHC(0xFF92), SHC(0xFF97), SHC(0xFF9C), SHC(0xFFA1), SHC(0xFFA5), SHC(0xFFAA), SHC(0xFFB0), - SHC(0xFFB4), SHC(0xFFB8), SHC(0xFFBE), SHC(0xFFC3), SHC(0xFFC7), SHC(0xFFCC), SHC(0xFFD2), SHC(0xFFD6), - SHC(0xFFDB), SHC(0xFFE0), SHC(0xFFE5), SHC(0xFFE9), SHC(0xFFEF), SHC(0xFFF4), SHC(0xFFF8), SHC(0xFFFF), - SHC(0x0001), SHC(0x0008), SHC(0x000C), SHC(0x0011), SHC(0x0017), SHC(0x001B), SHC(0x0020), SHC(0x0025), - SHC(0x002A), SHC(0x002E), SHC(0x0034), SHC(0x0039), SHC(0x003D), SHC(0x0042), SHC(0x0048), SHC(0x004C), - SHC(0x0050), SHC(0x0056), SHC(0x005B), SHC(0x005F), SHC(0x0064), SHC(0x0069), SHC(0x006E), SHC(0x0072), - SHC(0x0077), SHC(0x007C), SHC(0x0080), SHC(0x0085), SHC(0x008A), SHC(0x008F), SHC(0x0093), SHC(0x0097), - SHC(0x009C), SHC(0x00A1), SHC(0x00A5), SHC(0x00AA), SHC(0x00AE), SHC(0x00B3), SHC(0x00B7), SHC(0x00BB), - SHC(0x00C0), SHC(0x00C4), SHC(0x00C8), SHC(0x00CD), SHC(0x00D1), SHC(0x00D5), SHC(0x00D9), SHC(0x00DD), - SHC(0x00E2), SHC(0x00E5), SHC(0x00EA), SHC(0x00ED), SHC(0x00F2), SHC(0x00F5), SHC(0x00FA), SHC(0x00FD), - SHC(0x0101), SHC(0x0105), SHC(0x0108), SHC(0x010D), SHC(0x010F), SHC(0x0114), SHC(0x0117), SHC(0x011B), - SHC(0x011E), SHC(0x0121), SHC(0x0125), SHC(0x0128), SHC(0x012C), SHC(0x012F), SHC(0x0132), SHC(0x0135), - SHC(0x0139), SHC(0x013B), SHC(0x013F), SHC(0x0141), SHC(0x0145), SHC(0x0147), SHC(0x014A), SHC(0x014D), - SHC(0x0150), SHC(0x0152), SHC(0x0155), SHC(0x0158), SHC(0x015A), SHC(0x015D), SHC(0x015F), SHC(0x0161), - SHC(0x0164), SHC(0x0166), SHC(0x0168), SHC(0x016B), SHC(0x016C), SHC(0x016F), SHC(0x0171), SHC(0x0172), - SHC(0x0175), SHC(0x0176), SHC(0x0178), SHC(0x017A), SHC(0x017B), SHC(0x017D), SHC(0x017F), SHC(0x0180), - SHC(0x0181), SHC(0x0183), SHC(0x0185), SHC(0x0185), SHC(0x0187), SHC(0x0187), SHC(0x0189), SHC(0x018A), - SHC(0x018B), SHC(0x018C), SHC(0x018D), SHC(0x018D), SHC(0x018E), SHC(0x018F), SHC(0x018F), SHC(0x0190), - SHC(0x0191), SHC(0x0190), SHC(0x0192), SHC(0x0191), SHC(0x0192), SHC(0x0192), SHC(0x0192), SHC(0x0192), - SHC(0x0192), SHC(0x0192), SHC(0x0192), SHC(0x0192), SHC(0x0191), SHC(0x0192), SHC(0x0190), SHC(0x0191), - SHC(0x0190), SHC(0x018F), SHC(0x018F), SHC(0x018E), SHC(0x018D), SHC(0x018D), SHC(0x018C), SHC(0x018B), - SHC(0x018A), SHC(0x0189), SHC(0x0187), SHC(0x0187), SHC(0x0185), SHC(0x0185), SHC(0x0183), SHC(0x0181), - SHC(0x0180), SHC(0x017F), SHC(0x017D), SHC(0x017B), SHC(0x017A), SHC(0x0178), SHC(0x0176), SHC(0x0175), - SHC(0x0172), SHC(0x0171), SHC(0x016F), SHC(0x016C), SHC(0x016B), SHC(0x0168), SHC(0x0166), SHC(0x0164), - SHC(0x0161), SHC(0x015F), SHC(0x015D), SHC(0x015A), SHC(0x0158), SHC(0x0155), SHC(0x0152), SHC(0x0150), - SHC(0x014D), SHC(0x014A), SHC(0x0147), SHC(0x0145), SHC(0x0141), SHC(0x013F), SHC(0x013B), SHC(0x0139), - SHC(0x0135), SHC(0x0132), SHC(0x012F), SHC(0x012C), SHC(0x0128), SHC(0x0125), SHC(0x0121), SHC(0x011E), - SHC(0x011B), SHC(0x0117), SHC(0x0114), SHC(0x010F), SHC(0x010D), SHC(0x0108), SHC(0x0105), SHC(0x0101), - SHC(0x00FD), SHC(0x00FA), SHC(0x00F5), SHC(0x00F2), SHC(0x00ED), SHC(0x00EA), SHC(0x00E5), SHC(0x00E2), - SHC(0x00DD), SHC(0x00D9), SHC(0x00D5), SHC(0x00D1), SHC(0x00CD), SHC(0x00C8), SHC(0x00C4), SHC(0x00C0), - SHC(0x00BB), SHC(0x00B7), SHC(0x00B3), SHC(0x00AE), SHC(0x00AA), SHC(0x00A5), SHC(0x00A1), SHC(0x009C), - SHC(0x0097), SHC(0x0093), SHC(0x008F), SHC(0x008A), SHC(0x0085), SHC(0x0080), SHC(0x007C), SHC(0x0077), - SHC(0x0072), SHC(0x006E), SHC(0x0069), SHC(0x0064), SHC(0x005F), SHC(0x005B), SHC(0x0056), SHC(0x0050), - SHC(0x004C), SHC(0x0048), SHC(0x0042), SHC(0x003D), SHC(0x0039), SHC(0x0034), SHC(0x002E), SHC(0x002A), - SHC(0x0025), SHC(0x0020), SHC(0x001B), SHC(0x0017), SHC(0x0011), SHC(0x000C), SHC(0x0008), SHC(0x0001) - -}; - -const Word16 fftSineTab640_fx[ 321 ] = -{//Q15 - SHC( 0x0000 ), SHC( 0x0141 ), SHC( 0x0283 ), SHC( 0x03c4 ), SHC( 0x0506 ), SHC( 0x0647 ), SHC( 0x0789 ), SHC( 0x08ca ), - SHC( 0x0a0a ), SHC( 0x0b4b ), SHC( 0x0c8b ), SHC( 0x0dcb ), SHC( 0x0f0b ), SHC( 0x104a ), SHC( 0x1189 ), SHC( 0x12c8 ), - SHC( 0x1406 ), SHC( 0x1543 ), SHC( 0x1680 ), SHC( 0x17bc ), SHC( 0x18f8 ), SHC( 0x1a33 ), SHC( 0x1b6e ), SHC( 0x1ca8 ), - SHC( 0x1de1 ), SHC( 0x1f19 ), SHC( 0x2051 ), SHC( 0x2188 ), SHC( 0x22be ), SHC( 0x23f3 ), SHC( 0x2528 ), SHC( 0x265b ), - SHC( 0x278d ), SHC( 0x28bf ), SHC( 0x29ef ), SHC( 0x2b1f ), SHC( 0x2c4d ), SHC( 0x2d7a ), SHC( 0x2ea6 ), SHC( 0x2fd1 ), - SHC( 0x30fb ), SHC( 0x3224 ), SHC( 0x334b ), SHC( 0x3471 ), SHC( 0x3596 ), SHC( 0x36ba ), SHC( 0x37dc ), SHC( 0x38fd ), - SHC( 0x3a1c ), SHC( 0x3b3a ), SHC( 0x3c56 ), SHC( 0x3d71 ), SHC( 0x3e8b ), SHC( 0x3fa3 ), SHC( 0x40b9 ), SHC( 0x41ce ), - SHC( 0x42e1 ), SHC( 0x43f2 ), SHC( 0x4502 ), SHC( 0x4610 ), SHC( 0x471c ), SHC( 0x4827 ), SHC( 0x4930 ), SHC( 0x4a37 ), - SHC( 0x4b3c ), SHC( 0x4c3f ), SHC( 0x4d41 ), SHC( 0x4e40 ), SHC( 0x4f3e ), SHC( 0x503a ), SHC( 0x5133 ), SHC( 0x522b ), - SHC( 0x5321 ), SHC( 0x5414 ), SHC( 0x5506 ), SHC( 0x55f5 ), SHC( 0x56e2 ), SHC( 0x57ce ), SHC( 0x58b7 ), SHC( 0x599d ), - SHC( 0x5a82 ), SHC( 0x5b64 ), SHC( 0x5c44 ), SHC( 0x5d22 ), SHC( 0x5dfe ), SHC( 0x5ed7 ), SHC( 0x5fae ), SHC( 0x6082 ), - SHC( 0x6154 ), SHC( 0x6224 ), SHC( 0x62f2 ), SHC( 0x63bc ), SHC( 0x6485 ), SHC( 0x654b ), SHC( 0x660e ), SHC( 0x66cf ), - SHC( 0x678d ), SHC( 0x6849 ), SHC( 0x6902 ), SHC( 0x69b9 ), SHC( 0x6a6d ), SHC( 0x6b1f ), SHC( 0x6bcd ), SHC( 0x6c79 ), - SHC( 0x6d23 ), SHC( 0x6dca ), SHC( 0x6e6e ), SHC( 0x6f0f ), SHC( 0x6fad ), SHC( 0x7049 ), SHC( 0x70e2 ), SHC( 0x7179 ), - SHC( 0x720c ), SHC( 0x729d ), SHC( 0x732a ), SHC( 0x73b5 ), SHC( 0x743e ), SHC( 0x74c3 ), SHC( 0x7545 ), SHC( 0x75c5 ), - SHC( 0x7641 ), SHC( 0x76bb ), SHC( 0x7732 ), SHC( 0x77a5 ), SHC( 0x7816 ), SHC( 0x7884 ), SHC( 0x78ef ), SHC( 0x7957 ), - SHC( 0x79bc ), SHC( 0x7a1e ), SHC( 0x7a7d ), SHC( 0x7ad8 ), SHC( 0x7b31 ), SHC( 0x7b87 ), SHC( 0x7bda ), SHC( 0x7c29 ), - SHC( 0x7c76 ), SHC( 0x7cc0 ), SHC( 0x7d06 ), SHC( 0x7d4a ), SHC( 0x7d8a ), SHC( 0x7dc7 ), SHC( 0x7e01 ), SHC( 0x7e38 ), - SHC( 0x7e6c ), SHC( 0x7e9d ), SHC( 0x7eca ), SHC( 0x7ef5 ), SHC( 0x7f1c ), SHC( 0x7f41 ), SHC( 0x7f62 ), SHC( 0x7f80 ), - SHC( 0x7f9a ), SHC( 0x7fb2 ), SHC( 0x7fc7 ), SHC( 0x7fd8 ), SHC( 0x7fe6 ), SHC( 0x7ff1 ), SHC( 0x7ff9 ), SHC( 0x7ffe ), - SHC( 0x7fff ), SHC( 0x7ffe ), SHC( 0x7ff9 ), SHC( 0x7ff1 ), SHC( 0x7fe6 ), SHC( 0x7fd8 ), SHC( 0x7fc7 ), SHC( 0x7fb2 ), - SHC( 0x7f9a ), SHC( 0x7f80 ), SHC( 0x7f62 ), SHC( 0x7f41 ), SHC( 0x7f1c ), SHC( 0x7ef5 ), SHC( 0x7eca ), SHC( 0x7e9d ), - SHC( 0x7e6c ), SHC( 0x7e38 ), SHC( 0x7e01 ), SHC( 0x7dc7 ), SHC( 0x7d8a ), SHC( 0x7d4a ), SHC( 0x7d06 ), SHC( 0x7cc0 ), - SHC( 0x7c76 ), SHC( 0x7c29 ), SHC( 0x7bda ), SHC( 0x7b87 ), SHC( 0x7b31 ), SHC( 0x7ad8 ), SHC( 0x7a7d ), SHC( 0x7a1e ), - SHC( 0x79bc ), SHC( 0x7957 ), SHC( 0x78ef ), SHC( 0x7884 ), SHC( 0x7816 ), SHC( 0x77a5 ), SHC( 0x7732 ), SHC( 0x76bb ), - SHC( 0x7641 ), SHC( 0x75c5 ), SHC( 0x7545 ), SHC( 0x74c3 ), SHC( 0x743e ), SHC( 0x73b5 ), SHC( 0x732a ), SHC( 0x729d ), - SHC( 0x720c ), SHC( 0x7179 ), SHC( 0x70e2 ), SHC( 0x7049 ), SHC( 0x6fad ), SHC( 0x6f0f ), SHC( 0x6e6e ), SHC( 0x6dca ), - SHC( 0x6d23 ), SHC( 0x6c79 ), SHC( 0x6bcd ), SHC( 0x6b1f ), SHC( 0x6a6d ), SHC( 0x69b9 ), SHC( 0x6902 ), SHC( 0x6849 ), - SHC( 0x678d ), SHC( 0x66cf ), SHC( 0x660e ), SHC( 0x654b ), SHC( 0x6485 ), SHC( 0x63bc ), SHC( 0x62f2 ), SHC( 0x6224 ), - SHC( 0x6154 ), SHC( 0x6082 ), SHC( 0x5fae ), SHC( 0x5ed7 ), SHC( 0x5dfe ), SHC( 0x5d22 ), SHC( 0x5c44 ), SHC( 0x5b64 ), - SHC( 0x5a82 ), SHC( 0x599d ), SHC( 0x58b7 ), SHC( 0x57ce ), SHC( 0x56e2 ), SHC( 0x55f5 ), SHC( 0x5506 ), SHC( 0x5414 ), - SHC( 0x5321 ), SHC( 0x522b ), SHC( 0x5133 ), SHC( 0x503a ), SHC( 0x4f3e ), SHC( 0x4e40 ), SHC( 0x4d41 ), SHC( 0x4c3f ), - SHC( 0x4b3c ), SHC( 0x4a37 ), SHC( 0x4930 ), SHC( 0x4827 ), SHC( 0x471c ), SHC( 0x4610 ), SHC( 0x4502 ), SHC( 0x43f2 ), - SHC( 0x42e1 ), SHC( 0x41ce ), SHC( 0x40b9 ), SHC( 0x3fa3 ), SHC( 0x3e8b ), SHC( 0x3d71 ), SHC( 0x3c56 ), SHC( 0x3b3a ), - SHC( 0x3a1c ), SHC( 0x38fd ), SHC( 0x37dc ), SHC( 0x36ba ), SHC( 0x3596 ), SHC( 0x3471 ), SHC( 0x334b ), SHC( 0x3224 ), - SHC( 0x30fb ), SHC( 0x2fd1 ), SHC( 0x2ea6 ), SHC( 0x2d7a ), SHC( 0x2c4d ), SHC( 0x2b1f ), SHC( 0x29ef ), SHC( 0x28bf ), - SHC( 0x278d ), SHC( 0x265b ), SHC( 0x2528 ), SHC( 0x23f3 ), SHC( 0x22be ), SHC( 0x2188 ), SHC( 0x2051 ), SHC( 0x1f19 ), - SHC( 0x1de1 ), SHC( 0x1ca8 ), SHC( 0x1b6e ), SHC( 0x1a33 ), SHC( 0x18f8 ), SHC( 0x17bc ), SHC( 0x1680 ), SHC( 0x1543 ), - SHC( 0x1406 ), SHC( 0x12c8 ), SHC( 0x1189 ), SHC( 0x104a ), SHC( 0x0f0b ), SHC( 0x0dcb ), SHC( 0x0c8b ), SHC( 0x0b4b ), - SHC( 0x0a0a ), SHC( 0x08ca ), SHC( 0x0789 ), SHC( 0x0647 ), SHC( 0x0506 ), SHC( 0x03c4 ), SHC( 0x0283 ), SHC( 0x0141 ), - SHC( 0x0000 ), -}; - - -const Word32 bwMode2fs[4] = { 8000, 16000, 32000, 48000 };//Q0 - -const Word16 cos_pi_by_127[128] = /* Q15 */ -{ - 32767 ,32756 ,32726 ,32676 ,32606 ,32516 , - 32406 ,32276 ,32127 ,31958 ,31769 , - 31561 ,31333 ,31087 ,30821 ,30537 , - 30233 ,29912 ,29572 ,29213 ,28837 , - 28444 ,28033 ,27605 ,27160 ,26698 , - 26220 ,25726 ,25216 ,24691 ,24150 , - 23595 ,23026 ,22442 ,21844 ,21234 , - 20610 ,19974 ,19325 ,18665 ,17993 , - 17310 ,16616 ,15913 ,15199 ,14477 , - 13745 ,13005 ,12258 ,11502 ,10740 , - 9971 ,9196 ,8415 ,7629 ,6839 , - 6044 ,5245 ,4444 ,3639 ,2833 , - 2025 ,1215 ,405 ,-405 ,-1215 , - -2025 ,-2833 ,-3639 ,-4444 ,-5245 , - -6044 ,-6839 ,-7629 ,-8415 ,-9196 , - -9971 ,-10740 ,-11502 ,-12258 ,-13005 , - -13745 ,-14477 ,-15199 ,-15913 ,-16616 , - -17310 ,-17993 ,-18665 ,-19325 ,-19974 , - -20610 ,-21234 ,-21844 ,-22442 ,-23026 , - -23595 ,-24150 ,-24691 ,-25216 ,-25726 , - -26220 ,-26698 ,-27160 ,-27605 ,-28033 , - -28444 ,-28837 ,-29213 ,-29572 ,-29912 , - -30233 ,-30537 ,-30821 ,-31087 ,-31333 , - -31561 ,-31769 ,-31958 ,-32127 ,-32276 , - -32406 ,-32516 ,-32606 ,-32676 ,-32726 , - -32756 ,-32767 -}; - -const Word16 cos_pi_by_255[256] = /* Q15 */ -{ - 32767 ,32764 ,32757 ,32744 ,32727 ,32704 , - 32677 ,32645 ,32607 ,32565 ,32518 , - 32466 ,32409 ,32347 ,32280 ,32209 , - 32132 ,32050 ,31964 ,31873 ,31777 , - 31676 ,31570 ,31460 ,31345 ,31225 , - 31100 ,30970 ,30836 ,30697 ,30554 , - 30406 ,30253 ,30096 ,29934 ,29767 , - 29596 ,29421 ,29241 ,29056 ,28868 , - 28674 ,28477 ,28275 ,28069 ,27859 , - 27644 ,27425 ,27202 ,26975 ,26744 , - 26509 ,26269 ,26026 ,25779 ,25528 , - 25273 ,25014 ,24751 ,24485 ,24215 , - 23941 ,23663 ,23382 ,23098 ,22810 , - 22518 ,22223 ,21925 ,21623 ,21318 , - 21010 ,20699 ,20384 ,20067 ,19746 , - 19422 ,19096 ,18766 ,18434 ,18099 , - 17761 ,17420 ,17077 ,16731 ,16383 , - 16032 ,15679 ,15323 ,14965 ,14605 , - 14243 ,13878 ,13511 ,13142 ,12772 , - 12399 ,12024 ,11648 ,11270 ,10890 , - 10508 ,10125 ,9740 ,9354 ,8967 , - 8578 ,8187 ,7796 ,7403 ,7009 , - 6615 ,6219 ,5822 ,5424 ,5026 , - 4626 ,4226 ,3826 ,3425 ,3023 , - 2621 ,2218 ,1815 ,1412 ,1009 , - 605 ,201 ,-201 ,-605 ,-1009 , - -1412 ,-1815 ,-2218 ,-2621 ,-3023 , - -3425 ,-3826 ,-4226 ,-4626 ,-5026 , - -5424 ,-5822 ,-6219 ,-6615 ,-7009 , - -7403 ,-7796 ,-8187 ,-8578 ,-8967 , - -9354 ,-9740 ,-10125 ,-10508 ,-10890 , - -11270 ,-11648 ,-12024 ,-12399 ,-12772 , - -13142 ,-13511 ,-13878 ,-14243 ,-14605 , - -14965 ,-15323 ,-15679 ,-16032 ,-16383 , - -16731 ,-17077 ,-17420 ,-17761 ,-18099 , - -18434 ,-18766 ,-19096 ,-19422 ,-19746 , - -20067 ,-20384 ,-20699 ,-21010 ,-21318 , - -21623 ,-21925 ,-22223 ,-22518 ,-22810 , - -23098 ,-23382 ,-23663 ,-23941 ,-24215 , - -24485 ,-24751 ,-25014 ,-25273 ,-25528 , - -25779 ,-26026 ,-26269 ,-26509 ,-26744 , - -26975 ,-27202 ,-27425 ,-27644 ,-27859 , - -28069 ,-28275 ,-28477 ,-28674 ,-28868 , - -29056 ,-29241 ,-29421 ,-29596 ,-29767 , - -29934 ,-30096 ,-30253 ,-30406 ,-30554 , - -30697 ,-30836 ,-30970 ,-31100 ,-31225 , - -31345 ,-31460 ,-31570 ,-31676 ,-31777 , - -31873 ,-31964 ,-32050 ,-32132 ,-32209 , - -32280 ,-32347 ,-32409 ,-32466 ,-32518 , - -32565 ,-32607 ,-32645 ,-32677 ,-32704 , - -32727 ,-32744 ,-32757 ,-32764 ,-32767 -}; - -const Word16 cos_pi_by_383[384] = /* Q15 */ -{ - 32767 ,32765 ,32762 ,32757 ,32749 ,32739 , - 32727 ,32713 ,32696 ,32677 ,32656 , - 32633 ,32608 ,32580 ,32551 ,32519 , - 32485 ,32448 ,32410 ,32369 ,32327 , - 32282 ,32234 ,32185 ,32134 ,32080 , - 32024 ,31966 ,31906 ,31844 ,31779 , - 31713 ,31644 ,31573 ,31500 ,31425 , - 31348 ,31269 ,31188 ,31104 ,31019 , - 30931 ,30841 ,30749 ,30655 ,30560 , - 30462 ,30361 ,30259 ,30155 ,30049 , - 29941 ,29831 ,29719 ,29604 ,29488 , - 29370 ,29250 ,29128 ,29004 ,28878 , - 28750 ,28620 ,28488 ,28354 ,28218 , - 28081 ,27941 ,27800 ,27657 ,27512 , - 27365 ,27216 ,27066 ,26913 ,26759 , - 26603 ,26445 ,26286 ,26124 ,25961 , - 25796 ,25630 ,25461 ,25291 ,25120 , - 24946 ,24771 ,24594 ,24416 ,24236 , - 24054 ,23871 ,23686 ,23499 ,23311 , - 23122 ,22930 ,22738 ,22543 ,22348 , - 22150 ,21952 ,21751 ,21550 ,21346 , - 21142 ,20936 ,20728 ,20519 ,20309 , - 20097 ,19885 ,19670 ,19455 ,19238 , - 19019 ,18800 ,18579 ,18357 ,18134 , - 17910 ,17684 ,17457 ,17229 ,17000 , - 16769 ,16538 ,16305 ,16072 ,15837 , - 15601 ,15364 ,15126 ,14887 ,14647 , - 14407 ,14165 ,13922 ,13678 ,13433 , - 13188 ,12941 ,12694 ,12446 ,12197 , - 11947 ,11696 ,11445 ,11192 ,10939 , - 10686 ,10431 ,10176 ,9920 ,9664 , - 9407 ,9149 ,8891 ,8632 ,8372 , - 8112 ,7851 ,7590 ,7328 ,7066 , - 6803 ,6540 ,6277 ,6013 ,5748 , - 5483 ,5218 ,4953 ,4687 ,4421 , - 4154 ,3888 ,3621 ,3353 ,3086 , - 2818 ,2550 ,2282 ,2014 ,1746 , - 1477 ,1209 ,940 ,671 ,403 , - 134 ,-134 ,-403 ,-671 ,-940 , - -1209 ,-1477 ,-1746 ,-2014 ,-2282 , - -2550 ,-2818 ,-3086 ,-3353 ,-3621 , - -3888 ,-4154 ,-4421 ,-4687 ,-4953 , - -5218 ,-5483 ,-5748 ,-6013 ,-6277 , - -6540 ,-6803 ,-7066 ,-7328 ,-7590 , - -7851 ,-8112 ,-8372 ,-8632 ,-8891 , - -9149 ,-9407 ,-9664 ,-9920 ,-10176 , - -10431 ,-10686 ,-10939 ,-11192 ,-11445 , - -11696 ,-11947 ,-12197 ,-12446 ,-12694 , - -12941 ,-13188 ,-13433 ,-13678 ,-13922 , - -14165 ,-14407 ,-14647 ,-14887 ,-15126 , - -15364 ,-15601 ,-15837 ,-16072 ,-16305 , - -16538 ,-16769 ,-17000 ,-17229 ,-17457 , - -17684 ,-17910 ,-18134 ,-18357 ,-18579 , - -18800 ,-19019 ,-19238 ,-19455 ,-19670 , - -19885 ,-20097 ,-20309 ,-20519 ,-20728 , - -20936 ,-21142 ,-21346 ,-21550 ,-21751 , - -21952 ,-22150 ,-22348 ,-22543 ,-22738 , - -22930 ,-23122 ,-23311 ,-23499 ,-23686 , - -23871 ,-24054 ,-24236 ,-24416 ,-24594 , - -24771 ,-24946 ,-25120 ,-25291 ,-25461 , - -25630 ,-25796 ,-25961 ,-26124 ,-26286 , - -26445 ,-26603 ,-26759 ,-26913 ,-27066 , - -27216 ,-27365 ,-27512 ,-27657 ,-27800 , - -27941 ,-28081 ,-28218 ,-28354 ,-28488 , - -28620 ,-28750 ,-28878 ,-29004 ,-29128 , - -29250 ,-29370 ,-29488 ,-29604 ,-29719 , - -29831 ,-29941 ,-30049 ,-30155 ,-30259 , - -30361 ,-30462 ,-30560 ,-30655 ,-30749 , - -30841 ,-30931 ,-31019 ,-31104 ,-31188 , - -31269 ,-31348 ,-31425 ,-31500 ,-31573 , - -31644 ,-31713 ,-31779 ,-31844 ,-31906 , - -31966 ,-32024 ,-32080 ,-32134 ,-32185 , - -32234 ,-32282 ,-32327 ,-32369 ,-32410 , - -32448 ,-32485 ,-32519 ,-32551 ,-32580 , - -32608 ,-32633 ,-32656 ,-32677 ,-32696 , - -32713 ,-32727 ,-32739 ,-32749 ,-32757 , - -32762 ,-32765 ,-32767 -}; - -const Word16 swb_lsp_prev_interp_init[10] = { 32767, 31164, 26510, 19261, 10126, 0, -10126, -19261, -26510, -31164 };//Q15 -/* st->swb_lsp_prev_interp[i] = (float)cos( (float)i * PI / (float)10.0f )*/ - -//ivas_sns_com_fx.c -/* - powf( 10.0f, (float) i * (float) tilt / ( (float) FDNS_NPTS - 1.0f ) / 10.0f ) where 0 =< i < FDNS_NPTS; - tilt = 19.f for L_FRAME16k, - 22.f for L_FRAME25_6k, - 23.5f for L_FRAME32k; -*/ - -/* Q23 */ -const Word32 pow_tilt_16k[64] = { - 8388608, 8991841, 9638454, 10331564, 11074518, 11870897, 12724546, 13639580, - 14620416, 15671785, 16798759, 18006775, 19301660, 20689662, 22177476, 23772281, - 25481769, 27314189, 29278380, 31383818, 33640660, 36059793, 38652889, 41432458, - 44411907, 47605612, 51028980, 54698525, 58631951, 62848233, 67367713, 72212193, - 77405045, 82971319, 88937870, 95333482, 102189009, 109537523, 117414477, 125857870, - 134908436, 144609837, 155008876, 166155720, 178104145, 190911793, 204640453, 219356353, - 235130489, 252038960, 270163335, 289591052, 310415836, 332738151, 356665686, 382313874, - 409806450, 439276044, 470864826, 504725189, 541020486, 579925813, 621628862, 666330818 -}; - -/* Q23 */ -const Word32 pow_tilt_25_6k[64] = { - 8388608, 9090977, 9852154, 10677063, 11571041, 12539871, 13589820, 14727680, - 15960812, 17297192, 18745466, 20315003, 22015955, 23859325, 25857039, 28022019, - 30368270, 32910971, 35666569, 38652889, 41889251, 45396590, 49197594, 53316853, - 57781011, 62618949, 67861961, 73543965, 79701717, 86375050, 93607134, 101444752, - 109938604, 119143637, 129119397, 139930415, 151646628, 164343826, 178104145, 193016600, - 209177658, 226691863, 245672512, 266242389, 288534558, 312693225, 338874669, 367248256, - 397997530, 431321405, 467435450, 506573283, 548988082, 594954222, 644769055, 698754827, - 757260765, 820665338, 889378703, 963845359, 1044547023, 1132005744, 1226787283, 1329504771 -}; - -/* Q23 */ -const Word32 pow_tilt_32k[64] = { - 8388608, 9140953, 9960774, 10854121, 11827590, 12888365, 14044278, 15303861, - 16676411, 18172061, 19801850, 21577810, 23513049, 25621853, 27919788, 30423818, - 33152425, 36125751, 39365745, 42896322, 46743545, 50935812, 55504069, 60482037, - 65906462, 71817384, 78258437, 85277166, 92925380, 101259536, 110341153, 120237270, - 131020935, 142771749, 155576454, 169529568, 184734089, 201302251, 219356353, 239029666, - 260467410, 283827832, 309283369, 337021925, 367248256, 400185482, 436076734, 475186948, - 517804822, 564244946, 614850125, 669993906, 730083343, 795561993, 866913198, 944663645, - 1029387260, 1121709444, 1222311686, 1331936594, 1451393382, 1581563835, 1723408827, 1877975405 -}; - -const Word16 L_frame_inv[8] = { 0x4000, 0x369D, 0x3333, 0x2D83, 0x2AAB, 0x28F6, 0, 0x2222 }; // Q14 - -const Word16 InvIntTable[65] = // Q15 -{ - 0x7FFF, - 0x7FFF, 0x4000, 0x2AAB, 0x2000, 0x199A, 0x1555, 0x1249, 0x1000, - 0x0E39, 0x0CCD, 0x0BA3, 0x0AAB, 0x09D9, 0x0925, 0x0889, 0x0800, - 0x0788, 0x071C, 0x06BD, 0x0666, 0x0618, 0x05D1, 0x0591, 0x0555, - 0x051F, 0x04EC, 0x04BE, 0x0492, 0x046A, 0x0444, 0x0421, 0x0400, - 0x03E1, 0x03C4, 0x03A8, 0x038E, 0x0376, 0x035E, 0x0348, 0x0333, - 0x031F, 0x030C, 0x02FA, 0x02E9, 0x02D8, 0x02C8, 0x02B9, 0x02AB, - 0x029D, 0x028F, 0x0283, 0x0276, 0x026A, 0x025F, 0x0254, 0x0249, - 0x023F, 0x0235, 0x022B, 0x0222, 0x0219, 0x0211, 0x0208, 0x0200 -}; - -const Word16 TecLowBandTable[] = { 0, 2, 4, 6 }; //Q0 -const Word16 TecSC_Fx[] = -{ - 23999/*0.3662f*2.0f Q15*/, 7065/*0.1078f*2.0f Q15*/, 7825/*0.1194f*2.0f Q15*/, - 8448/*0.1289f*2.0f Q15*/, 8946/*0.1365f*2.0f Q15*/, 9254/*0.1412f*2.0f Q15*/ -}; - -/* clang-format on */ -const Word16 sqrt_table_pitch_search[256 + 1] = /* Q11 */ - { - 0, 2048, 2896, 3547, 4096, 4579, 5017, 5418, - 5793, 6144, 6476, 6792, 7094, 7384, 7663, 7932, - 8192, 8444, 8689, 8927, 9159, 9385, 9606, 9822, - 10033, 10240, 10443, 10642, 10837, 11029, 11217, 11403, - 11585, 11765, 11942, 12116, 12288, 12457, 12625, 12790, - 12953, 13114, 13273, 13430, 13585, 13738, 13890, 14040, - 14189, 14336, 14482, 14626, 14768, 14910, 15050, 15188, - 15326, 15462, 15597, 15731, 15864, 15995, 16126, 16255, - 16384, 16512, 16638, 16764, 16888, 17012, 17135, 17257, - 17378, 17498, 17618, 17736, 17854, 17971, 18087, 18203, - 18318, 18432, 18545, 18658, 18770, 18882, 18992, 19102, - 19212, 19321, 19429, 19537, 19644, 19750, 19856, 19961, - 20066, 20170, 20274, 20377, 20480, 20582, 20684, 20785, - 20886, 20986, 21085, 21185, 21283, 21382, 21480, 21577, - 21674, 21771, 21867, 21962, 22058, 22153, 22247, 22341, - 22435, 22528, 22621, 22713, 22806, 22897, 22989, 23080, - 23170, 23261, 23351, 23440, 23530, 23619, 23707, 23796, - 23884, 23971, 24059, 24146, 24232, 24319, 24405, 24491, - 24576, 24661, 24746, 24831, 24915, 24999, 25083, 25166, - 25249, 25332, 25415, 25497, 25580, 25661, 25743, 25824, - 25905, 25986, 26067, 26147, 26227, 26307, 26387, 26466, - 26545, 26624, 26703, 26781, 26859, 26937, 27015, 27092, - 27170, 27247, 27324, 27400, 27477, 27553, 27629, 27705, - 27780, 27856, 27931, 28006, 28081, 28155, 28230, 28304, - 28378, 28452, 28525, 28599, 28672, 28745, 28818, 28891, - 28963, 29035, 29108, 29180, 29251, 29323, 29394, 29466, - 29537, 29608, 29678, 29749, 29819, 29890, 29960, 30030, - 30099, 30169, 30238, 30308, 30377, 30446, 30515, 30583, - 30652, 30720, 30788, 30856, 30924, 30992, 31059, 31127, - 31194, 31261, 31328, 31395, 31462, 31529, 31595, 31661, - 31727, 31794, 31859, 31925, 31991, 32056, 32122, 32187, - 32252, 32317, 32382, 32446, 32511, 32575, 32640, 32704, - 32766 - }; - -// fft_evs.c -const Word16 RotVector_32[2 * 20] = { // Q15 - /** - * \brief Twiddle factors are unscaled - */ - SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x5a82 ), SHC( 0xa57e ), - SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x7642 ), SHC( 0xcf04 ), - SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xa57e ), SHC( 0xa57e ), - SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0xe707 ), SHC( 0x8276 ), - SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x89be ), SHC( 0x30fc ), SHC( 0xb8e3 ), SHC( 0x6a6e ) -}; - -/** - * \brief Twiddle factors are unscaled - */ -const Word16 RotVector_480[2 * ( 480 - 30 )] = { // Q15 - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ff5 ), SHC( 0xfca6 ), - SHC( 0x7fd3 ), SHC( 0xf94d ), SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7f4c ), SHC( 0xf29f ), SHC( 0x7ee8 ), SHC( 0xef4b ), - SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7ddb ), SHC( 0xe8ad ), SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7c77 ), SHC( 0xe21e ), - SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x7abb ), SHC( 0xdba5 ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x78a8 ), SHC( 0xd546 ), - SHC( 0x7780 ), SHC( 0xd221 ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x7388 ), SHC( 0xc8e5 ), - SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x707d ), SHC( 0xc2ec ), SHC( 0x6eda ), SHC( 0xc000 ), SHC( 0x6d23 ), SHC( 0xbd1f ), - SHC( 0x6b5a ), SHC( 0xba49 ), SHC( 0x697d ), SHC( 0xb780 ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x658d ), SHC( 0xb214 ), - SHC( 0x637a ), SHC( 0xaf72 ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x5cd9 ), SHC( 0xa7e4 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fd3 ), SHC( 0xf94d ), SHC( 0x7f4c ), SHC( 0xf29f ), SHC( 0x7e6d ), SHC( 0xebfa ), - SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7780 ), SHC( 0xd221 ), - SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6eda ), SHC( 0xc000 ), SHC( 0x6b5a ), SHC( 0xba49 ), - SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x637a ), SHC( 0xaf72 ), SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x5a82 ), SHC( 0xa57e ), - SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x508e ), SHC( 0x9c86 ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x45b7 ), SHC( 0x94a6 ), - SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x3410 ), SHC( 0x8b11 ), SHC( 0x2ddf ), SHC( 0x8880 ), - SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x2121 ), SHC( 0x845d ), SHC( 0x1a9d ), SHC( 0x82cc ), SHC( 0x1406 ), SHC( 0x8193 ), - SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0x06b3 ), SHC( 0x802d ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f9b ), SHC( 0xf5f5 ), - SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7642 ), SHC( 0xcf04 ), - SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x6155 ), SHC( 0xacdf ), - SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5321 ), SHC( 0x9eab ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x42e1 ), SHC( 0x92dd ), - SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1de2 ), SHC( 0x8389 ), - SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0a0b ), SHC( 0x8065 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xf5f5 ), SHC( 0x8065 ), - SHC( 0xebfa ), SHC( 0x8193 ), SHC( 0xe21e ), SHC( 0x8389 ), SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xcf04 ), SHC( 0x89be ), - SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xbd1f ), SHC( 0x92dd ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xacdf ), SHC( 0x9eab ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f4c ), SHC( 0xf29f ), SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x79bc ), SHC( 0xd872 ), - SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x6eda ), SHC( 0xc000 ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5f1f ), SHC( 0xaa5a ), - SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x3410 ), SHC( 0x8b11 ), - SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1a9d ), SHC( 0x82cc ), SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0x0000 ), SHC( 0x8000 ), - SHC( 0xf29f ), SHC( 0x80b4 ), SHC( 0xe563 ), SHC( 0x82cc ), SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xcbf0 ), SHC( 0x8b11 ), - SHC( 0xc000 ), SHC( 0x9126 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xaa5a ), SHC( 0xa0e1 ), SHC( 0xa0e1 ), SHC( 0xaa5a ), - SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x9126 ), SHC( 0xc000 ), SHC( 0x8b11 ), SHC( 0xcbf0 ), SHC( 0x8644 ), SHC( 0xd872 ), - SHC( 0x82cc ), SHC( 0xe563 ), SHC( 0x80b4 ), SHC( 0xf29f ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ee8 ), SHC( 0xef4b ), - SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x6eda ), SHC( 0xc000 ), SHC( 0x658d ), SHC( 0xb214 ), - SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x4dec ), SHC( 0x9a73 ), SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x30fc ), SHC( 0x89be ), - SHC( 0x2121 ), SHC( 0x845d ), SHC( 0x10b5 ), SHC( 0x8118 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xef4b ), SHC( 0x8118 ), - SHC( 0xdedf ), SHC( 0x845d ), SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xc000 ), SHC( 0x9126 ), SHC( 0xb214 ), SHC( 0x9a73 ), - SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9a73 ), SHC( 0xb214 ), SHC( 0x9126 ), SHC( 0xc000 ), SHC( 0x89be ), SHC( 0xcf04 ), - SHC( 0x845d ), SHC( 0xdedf ), SHC( 0x8118 ), SHC( 0xef4b ), SHC( 0x8000 ), SHC( 0x0000 ), SHC( 0x8118 ), SHC( 0x10b5 ), - SHC( 0x845d ), SHC( 0x2121 ), SHC( 0x89be ), SHC( 0x30fc ), SHC( 0x9126 ), SHC( 0x4000 ), SHC( 0x9a73 ), SHC( 0x4dec ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x720d ), SHC( 0xc5e4 ), - SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3a1c ), SHC( 0x8df3 ), - SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xebfa ), SHC( 0x8193 ), - SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa57e ), SHC( 0xa57e ), - SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x8df3 ), SHC( 0xc5e4 ), SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8193 ), SHC( 0xebfa ), - SHC( 0x8000 ), SHC( 0x0000 ), SHC( 0x8193 ), SHC( 0x1406 ), SHC( 0x8644 ), SHC( 0x278e ), SHC( 0x8df3 ), SHC( 0x3a1c ), - SHC( 0x9872 ), SHC( 0x4b3d ), SHC( 0xa57e ), SHC( 0x5a82 ), SHC( 0xb4c3 ), SHC( 0x678e ), SHC( 0xc5e4 ), SHC( 0x720d ), - SHC( 0xd872 ), SHC( 0x79bc ), SHC( 0xebfa ), SHC( 0x7e6d ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ddb ), SHC( 0xe8ad ), - SHC( 0x7780 ), SHC( 0xd221 ), SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x4dec ), SHC( 0x9a73 ), - SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x245b ), SHC( 0x8545 ), SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0xf5f5 ), SHC( 0x8065 ), - SHC( 0xdedf ), SHC( 0x845d ), SHC( 0xc8e5 ), SHC( 0x8c78 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa327 ), SHC( 0xa7e4 ), - SHC( 0x94a6 ), SHC( 0xba49 ), SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x82cc ), SHC( 0xe563 ), SHC( 0x800b ), SHC( 0xfca6 ), - SHC( 0x8193 ), SHC( 0x1406 ), SHC( 0x8758 ), SHC( 0x2aba ), SHC( 0x9126 ), SHC( 0x4000 ), SHC( 0x9eab ), SHC( 0x5321 ), - SHC( 0xaf72 ), SHC( 0x637a ), SHC( 0xc2ec ), SHC( 0x707d ), SHC( 0xd872 ), SHC( 0x79bc ), SHC( 0xef4b ), SHC( 0x7ee8 ), - SHC( 0x06b3 ), SHC( 0x7fd3 ), SHC( 0x1de2 ), SHC( 0x7c77 ), SHC( 0x3410 ), SHC( 0x74ef ), SHC( 0x4880 ), SHC( 0x697d ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ffd ), SHC( 0xfe53 ), SHC( 0x7ff5 ), SHC( 0xfca6 ), SHC( 0x7fe7 ), SHC( 0xfafa ), - SHC( 0x7fd3 ), SHC( 0xf94d ), SHC( 0x7fba ), SHC( 0xf7a1 ), SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7f77 ), SHC( 0xf44a ), - SHC( 0x7f4c ), SHC( 0xf29f ), SHC( 0x7f1d ), SHC( 0xf0f5 ), SHC( 0x7ee8 ), SHC( 0xef4b ), SHC( 0x7ead ), SHC( 0xeda2 ), - SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7e27 ), SHC( 0xea53 ), SHC( 0x7ddb ), SHC( 0xe8ad ), SHC( 0x7d8a ), SHC( 0xe707 ), - SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7cd8 ), SHC( 0xe3c0 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7c10 ), SHC( 0xe07e ), - SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x7b32 ), SHC( 0xdd41 ), SHC( 0x7abb ), SHC( 0xdba5 ), SHC( 0x7a3e ), SHC( 0xda0b ), - SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7935 ), SHC( 0xd6db ), SHC( 0x78a8 ), SHC( 0xd546 ), SHC( 0x7817 ), SHC( 0xd3b2 ), - SHC( 0x7780 ), SHC( 0xd221 ), SHC( 0x76e3 ), SHC( 0xd092 ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fe7 ), SHC( 0xfafa ), - SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7f1d ), SHC( 0xf0f5 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7d8a ), SHC( 0xe707 ), - SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7b32 ), SHC( 0xdd41 ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7817 ), SHC( 0xd3b2 ), - SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x743e ), SHC( 0xca69 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6fae ), SHC( 0xc175 ), - SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x6485 ), SHC( 0xb0c2 ), - SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5dfe ), SHC( 0xa91d ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x56e3 ), SHC( 0xa202 ), - SHC( 0x5321 ), SHC( 0x9eab ), SHC( 0x4f3e ), SHC( 0x9b7b ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x471d ), SHC( 0x9592 ), - SHC( 0x42e1 ), SHC( 0x92dd ), SHC( 0x3e8b ), SHC( 0x9052 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x3597 ), SHC( 0x8bc2 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fba ), SHC( 0xf7a1 ), SHC( 0x7ee8 ), SHC( 0xef4b ), SHC( 0x7d8a ), SHC( 0xe707 ), - SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x7935 ), SHC( 0xd6db ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x72cd ), SHC( 0xc763 ), - SHC( 0x6eda ), SHC( 0xc000 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x658d ), SHC( 0xb214 ), SHC( 0x603c ), SHC( 0xab9b ), - SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5465 ), SHC( 0x9fc4 ), SHC( 0x4dec ), SHC( 0x9a73 ), SHC( 0x471d ), SHC( 0x9592 ), - SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x389d ), SHC( 0x8d33 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2925 ), SHC( 0x86cb ), - SHC( 0x2121 ), SHC( 0x845d ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x10b5 ), SHC( 0x8118 ), SHC( 0x085f ), SHC( 0x8046 ), - SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xf7a1 ), SHC( 0x8046 ), SHC( 0xef4b ), SHC( 0x8118 ), SHC( 0xe707 ), SHC( 0x8276 ), - SHC( 0xdedf ), SHC( 0x845d ), SHC( 0xd6db ), SHC( 0x86cb ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f77 ), SHC( 0xf44a ), - SHC( 0x7ddb ), SHC( 0xe8ad ), SHC( 0x7b32 ), SHC( 0xdd41 ), SHC( 0x7780 ), SHC( 0xd221 ), SHC( 0x72cd ), SHC( 0xc763 ), - SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x668f ), SHC( 0xb36a ), SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x56e3 ), SHC( 0xa202 ), - SHC( 0x4dec ), SHC( 0x9a73 ), SHC( 0x444d ), SHC( 0x93bf ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x2f6e ), SHC( 0x891d ), - SHC( 0x245b ), SHC( 0x8545 ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0x01ad ), SHC( 0x8003 ), - SHC( 0xf5f5 ), SHC( 0x8065 ), SHC( 0xea53 ), SHC( 0x81d9 ), SHC( 0xdedf ), SHC( 0x845d ), SHC( 0xd3b2 ), SHC( 0x87e9 ), - SHC( 0xc8e5 ), SHC( 0x8c78 ), SHC( 0xbe8e ), SHC( 0x91ff ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xab9b ), SHC( 0x9fc4 ), - SHC( 0xa327 ), SHC( 0xa7e4 ), SHC( 0x9b7b ), SHC( 0xb0c2 ), SHC( 0x94a6 ), SHC( 0xba49 ), SHC( 0x8eb9 ), SHC( 0xc467 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f1d ), SHC( 0xf0f5 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7817 ), SHC( 0xd3b2 ), - SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x56e3 ), SHC( 0xa202 ), - SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3e8b ), SHC( 0x9052 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x22bf ), SHC( 0x84ce ), - SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0506 ), SHC( 0x8019 ), SHC( 0xf5f5 ), SHC( 0x8065 ), SHC( 0xe707 ), SHC( 0x8276 ), - SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xca69 ), SHC( 0x8bc2 ), SHC( 0xbd1f ), SHC( 0x92dd ), SHC( 0xb0c2 ), SHC( 0x9b7b ), - SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9b7b ), SHC( 0xb0c2 ), SHC( 0x92dd ), SHC( 0xbd1f ), SHC( 0x8bc2 ), SHC( 0xca69 ), - SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x8065 ), SHC( 0xf5f5 ), SHC( 0x8019 ), SHC( 0x0506 ), - SHC( 0x8193 ), SHC( 0x1406 ), SHC( 0x84ce ), SHC( 0x22bf ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ead ), SHC( 0xeda2 ), - SHC( 0x7abb ), SHC( 0xdba5 ), SHC( 0x743e ), SHC( 0xca69 ), SHC( 0x6b5a ), SHC( 0xba49 ), SHC( 0x603c ), SHC( 0xab9b ), - SHC( 0x5321 ), SHC( 0x9eab ), SHC( 0x444d ), SHC( 0x93bf ), SHC( 0x3410 ), SHC( 0x8b11 ), SHC( 0x22bf ), SHC( 0x84ce ), - SHC( 0x10b5 ), SHC( 0x8118 ), SHC( 0xfe53 ), SHC( 0x8003 ), SHC( 0xebfa ), SHC( 0x8193 ), SHC( 0xda0b ), SHC( 0x85c2 ), - SHC( 0xc8e5 ), SHC( 0x8c78 ), SHC( 0xb8e3 ), SHC( 0x9592 ), SHC( 0xaa5a ), SHC( 0xa0e1 ), SHC( 0x9d97 ), SHC( 0xae27 ), - SHC( 0x92dd ), SHC( 0xbd1f ), SHC( 0x8a65 ), SHC( 0xcd79 ), SHC( 0x845d ), SHC( 0xdedf ), SHC( 0x80e3 ), SHC( 0xf0f5 ), - SHC( 0x800b ), SHC( 0x035a ), SHC( 0x81d9 ), SHC( 0x15ad ), SHC( 0x8644 ), SHC( 0x278e ), SHC( 0x8d33 ), SHC( 0x389d ), - SHC( 0x9683 ), SHC( 0x4880 ), SHC( 0xa202 ), SHC( 0x56e3 ), SHC( 0xaf72 ), SHC( 0x637a ), SHC( 0xbe8e ), SHC( 0x6e01 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e27 ), SHC( 0xea53 ), SHC( 0x78a8 ), SHC( 0xd546 ), SHC( 0x6fae ), SHC( 0xc175 ), - SHC( 0x637a ), SHC( 0xaf72 ), SHC( 0x5465 ), SHC( 0x9fc4 ), SHC( 0x42e1 ), SHC( 0x92dd ), SHC( 0x2f6e ), SHC( 0x891d ), - SHC( 0x1a9d ), SHC( 0x82cc ), SHC( 0x0506 ), SHC( 0x8019 ), SHC( 0xef4b ), SHC( 0x8118 ), SHC( 0xda0b ), SHC( 0x85c2 ), - SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xb36a ), SHC( 0x9971 ), SHC( 0xa327 ), SHC( 0xa7e4 ), SHC( 0x9592 ), SHC( 0xb8e3 ), - SHC( 0x8b11 ), SHC( 0xcbf0 ), SHC( 0x83f0 ), SHC( 0xe07e ), SHC( 0x8065 ), SHC( 0xf5f5 ), SHC( 0x8089 ), SHC( 0x0bb6 ), - SHC( 0x845d ), SHC( 0x2121 ), SHC( 0x8bc2 ), SHC( 0x3597 ), SHC( 0x9683 ), SHC( 0x4880 ), SHC( 0xa450 ), SHC( 0x5951 ), - SHC( 0xb4c3 ), SHC( 0x678e ), SHC( 0xc763 ), SHC( 0x72cd ), SHC( 0xdba5 ), SHC( 0x7abb ), SHC( 0xf0f5 ), SHC( 0x7f1d ), - SHC( 0x06b3 ), SHC( 0x7fd3 ), SHC( 0x1c40 ), SHC( 0x7cd8 ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7d8a ), SHC( 0xe707 ), - SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x471d ), SHC( 0x9592 ), - SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xe707 ), SHC( 0x8276 ), - SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xb8e3 ), SHC( 0x9592 ), SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9592 ), SHC( 0xb8e3 ), - SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x8000 ), SHC( 0x0000 ), SHC( 0x8276 ), SHC( 0x18f9 ), - SHC( 0x89be ), SHC( 0x30fc ), SHC( 0x9592 ), SHC( 0x471d ), SHC( 0xa57e ), SHC( 0x5a82 ), SHC( 0xb8e3 ), SHC( 0x6a6e ), - SHC( 0xcf04 ), SHC( 0x7642 ), SHC( 0xe707 ), SHC( 0x7d8a ), SHC( 0x0000 ), SHC( 0x7fff ), SHC( 0x18f9 ), SHC( 0x7d8a ), - SHC( 0x30fc ), SHC( 0x7642 ), SHC( 0x471d ), SHC( 0x6a6e ), SHC( 0x5a82 ), SHC( 0x5a82 ), SHC( 0x6a6e ), SHC( 0x471d ) -}; - -const Word16 RotVector_600[2 * ( 600 - 30 )] = { // Q15 - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ff9 ), SHC( 0xfd52 ), - SHC( 0x7fe3 ), SHC( 0xfaa4 ), SHC( 0x7fbf ), SHC( 0xf7f6 ), SHC( 0x7f8d ), SHC( 0xf54a ), SHC( 0x7f4c ), SHC( 0xf29f ), - SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7ea0 ), SHC( 0xed4d ), SHC( 0x7e35 ), SHC( 0xeaa7 ), SHC( 0x7dbc ), SHC( 0xe804 ), - SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7c9e ), SHC( 0xe2c5 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7b49 ), SHC( 0xdd94 ), - SHC( 0x7a89 ), SHC( 0xdb01 ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x78e1 ), SHC( 0xd5e8 ), SHC( 0x77f9 ), SHC( 0xd362 ), - SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x7600 ), SHC( 0xce66 ), SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x73d1 ), SHC( 0xc980 ), - SHC( 0x72a7 ), SHC( 0xc716 ), SHC( 0x716f ), SHC( 0xc4b3 ), SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6eda ), SHC( 0xc000 ), - SHC( 0x6d7d ), SHC( 0xbdb1 ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x6a9d ), SHC( 0xb92a ), SHC( 0x691b ), SHC( 0xb6f3 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fe3 ), SHC( 0xfaa4 ), SHC( 0x7f8d ), SHC( 0xf54a ), SHC( 0x7efe ), SHC( 0xeff5 ), - SHC( 0x7e35 ), SHC( 0xeaa7 ), SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7a89 ), SHC( 0xdb01 ), - SHC( 0x78e1 ), SHC( 0xd5e8 ), SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x72a7 ), SHC( 0xc716 ), - SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6d7d ), SHC( 0xbdb1 ), SHC( 0x6a9d ), SHC( 0xb92a ), SHC( 0x678e ), SHC( 0xb4c3 ), - SHC( 0x6450 ), SHC( 0xb07e ), SHC( 0x60e5 ), SHC( 0xac5d ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x598f ), SHC( 0xa48c ), - SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x4d64 ), SHC( 0x9a0b ), SHC( 0x490d ), SHC( 0x96e5 ), - SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x3b4d ), SHC( 0x8e91 ), SHC( 0x3680 ), SHC( 0x8c2f ), - SHC( 0x319a ), SHC( 0x8a00 ), SHC( 0x2c9e ), SHC( 0x8807 ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fbf ), SHC( 0xf7f6 ), - SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x79bc ), SHC( 0xd872 ), - SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6c13 ), SHC( 0xbb6a ), - SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x62a0 ), SHC( 0xae69 ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x579f ), SHC( 0xa2b1 ), - SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x3daa ), SHC( 0x8fd5 ), - SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x2f1f ), SHC( 0x88fd ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1fd5 ), SHC( 0x8405 ), - SHC( 0x17fc ), SHC( 0x8244 ), SHC( 0x100b ), SHC( 0x8102 ), SHC( 0x080a ), SHC( 0x8041 ), SHC( 0x0000 ), SHC( 0x8000 ), - SHC( 0xf7f6 ), SHC( 0x8041 ), SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xe02b ), SHC( 0x8405 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f8d ), SHC( 0xf54a ), SHC( 0x7e35 ), SHC( 0xeaa7 ), SHC( 0x7bfb ), SHC( 0xe02b ), - SHC( 0x78e1 ), SHC( 0xd5e8 ), SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6a9d ), SHC( 0xb92a ), - SHC( 0x6450 ), SHC( 0xb07e ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x4d64 ), SHC( 0x9a0b ), - SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x3b4d ), SHC( 0x8e91 ), SHC( 0x319a ), SHC( 0x8a00 ), SHC( 0x278e ), SHC( 0x8644 ), - SHC( 0x1d3b ), SHC( 0x8362 ), SHC( 0x12b3 ), SHC( 0x8160 ), SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xfd52 ), SHC( 0x8007 ), - SHC( 0xf29f ), SHC( 0x80b4 ), SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xdd94 ), SHC( 0x84b7 ), SHC( 0xd362 ), SHC( 0x8807 ), - SHC( 0xc980 ), SHC( 0x8c2f ), SHC( 0xc000 ), SHC( 0x9126 ), SHC( 0xb6f3 ), SHC( 0x96e5 ), SHC( 0xae69 ), SHC( 0x9d60 ), - SHC( 0xa671 ), SHC( 0xa48c ), SHC( 0x9f1b ), SHC( 0xac5d ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f4c ), SHC( 0xf29f ), - SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x6eda ), SHC( 0xc000 ), - SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x4b3d ), SHC( 0x9872 ), - SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x3410 ), SHC( 0x8b11 ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1a9d ), SHC( 0x82cc ), - SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xf29f ), SHC( 0x80b4 ), SHC( 0xe563 ), SHC( 0x82cc ), - SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xcbf0 ), SHC( 0x8b11 ), SHC( 0xc000 ), SHC( 0x9126 ), SHC( 0xb4c3 ), SHC( 0x9872 ), - SHC( 0xaa5a ), SHC( 0xa0e1 ), SHC( 0xa0e1 ), SHC( 0xaa5a ), SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x9126 ), SHC( 0xc000 ), - SHC( 0x8b11 ), SHC( 0xcbf0 ), SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x82cc ), SHC( 0xe563 ), SHC( 0x80b4 ), SHC( 0xf29f ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7703 ), SHC( 0xd0e1 ), - SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x5197 ), SHC( 0x9d60 ), - SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x17fc ), SHC( 0x8244 ), - SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xf7f6 ), SHC( 0x8041 ), SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xd872 ), SHC( 0x8644 ), - SHC( 0xc980 ), SHC( 0x8c2f ), SHC( 0xbb6a ), SHC( 0x93ed ), SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0xa2b1 ), SHC( 0xa861 ), - SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x8fd5 ), SHC( 0xc256 ), SHC( 0x88fd ), SHC( 0xd0e1 ), SHC( 0x8405 ), SHC( 0xe02b ), - SHC( 0x8102 ), SHC( 0xeff5 ), SHC( 0x8000 ), SHC( 0x0000 ), SHC( 0x8102 ), SHC( 0x100b ), SHC( 0x8405 ), SHC( 0x1fd5 ), - SHC( 0x88fd ), SHC( 0x2f1f ), SHC( 0x8fd5 ), SHC( 0x3daa ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ea0 ), SHC( 0xed4d ), - SHC( 0x7a89 ), SHC( 0xdb01 ), SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x6a9d ), SHC( 0xb92a ), SHC( 0x5f1f ), SHC( 0xaa5a ), - SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x424f ), SHC( 0x9283 ), SHC( 0x319a ), SHC( 0x8a00 ), SHC( 0x1fd5 ), SHC( 0x8405 ), - SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0xfaa4 ), SHC( 0x801d ), SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xd5e8 ), SHC( 0x871f ), - SHC( 0xc4b3 ), SHC( 0x8e91 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa671 ), SHC( 0xa48c ), SHC( 0x9a0b ), SHC( 0xb29c ), - SHC( 0x8fd5 ), SHC( 0xc256 ), SHC( 0x8807 ), SHC( 0xd362 ), SHC( 0x82cc ), SHC( 0xe563 ), SHC( 0x8041 ), SHC( 0xf7f6 ), - SHC( 0x8073 ), SHC( 0x0ab6 ), SHC( 0x8362 ), SHC( 0x1d3b ), SHC( 0x88fd ), SHC( 0x2f1f ), SHC( 0x9126 ), SHC( 0x4000 ), - SHC( 0x9bb0 ), SHC( 0x4f82 ), SHC( 0xa861 ), SHC( 0x5d4f ), SHC( 0xb6f3 ), SHC( 0x691b ), SHC( 0xc716 ), SHC( 0x72a7 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e35 ), SHC( 0xeaa7 ), SHC( 0x78e1 ), SHC( 0xd5e8 ), SHC( 0x702b ), SHC( 0xc256 ), - SHC( 0x6450 ), SHC( 0xb07e ), SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x319a ), SHC( 0x8a00 ), - SHC( 0x1d3b ), SHC( 0x8362 ), SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xf29f ), SHC( 0x80b4 ), SHC( 0xdd94 ), SHC( 0x84b7 ), - SHC( 0xc980 ), SHC( 0x8c2f ), SHC( 0xb6f3 ), SHC( 0x96e5 ), SHC( 0xa671 ), SHC( 0xa48c ), SHC( 0x9872 ), SHC( 0xb4c3 ), - SHC( 0x8d59 ), SHC( 0xc716 ), SHC( 0x8577 ), SHC( 0xdb01 ), SHC( 0x8102 ), SHC( 0xeff5 ), SHC( 0x801d ), SHC( 0x055c ), - SHC( 0x82cc ), SHC( 0x1a9d ), SHC( 0x88fd ), SHC( 0x2f1f ), SHC( 0x9283 ), SHC( 0x424f ), SHC( 0x9f1b ), SHC( 0x53a3 ), - SHC( 0xae69 ), SHC( 0x62a0 ), SHC( 0xc000 ), SHC( 0x6eda ), SHC( 0xd362 ), SHC( 0x77f9 ), SHC( 0xe804 ), SHC( 0x7dbc ), - SHC( 0xfd52 ), SHC( 0x7ff9 ), SHC( 0x12b3 ), SHC( 0x7ea0 ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7dbc ), SHC( 0xe804 ), - SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x4b3d ), SHC( 0x9872 ), - SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x1fd5 ), SHC( 0x8405 ), SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xeff5 ), SHC( 0x8102 ), - SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xc256 ), SHC( 0x8fd5 ), SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0x9d60 ), SHC( 0xae69 ), - SHC( 0x8fd5 ), SHC( 0xc256 ), SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8102 ), SHC( 0xeff5 ), SHC( 0x8041 ), SHC( 0x080a ), - SHC( 0x8405 ), SHC( 0x1fd5 ), SHC( 0x8c2f ), SHC( 0x3680 ), SHC( 0x9872 ), SHC( 0x4b3d ), SHC( 0xa861 ), SHC( 0x5d4f ), - SHC( 0xbb6a ), SHC( 0x6c13 ), SHC( 0xd0e1 ), SHC( 0x7703 ), SHC( 0xe804 ), SHC( 0x7dbc ), SHC( 0x0000 ), SHC( 0x7fff ), - SHC( 0x17fc ), SHC( 0x7dbc ), SHC( 0x2f1f ), SHC( 0x7703 ), SHC( 0x4496 ), SHC( 0x6c13 ), SHC( 0x579f ), SHC( 0x5d4f ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ffe ), SHC( 0xfea9 ), SHC( 0x7ff9 ), SHC( 0xfd52 ), SHC( 0x7ff0 ), SHC( 0xfbfb ), - SHC( 0x7fe3 ), SHC( 0xfaa4 ), SHC( 0x7fd3 ), SHC( 0xf94d ), SHC( 0x7fbf ), SHC( 0xf7f6 ), SHC( 0x7fa8 ), SHC( 0xf6a0 ), - SHC( 0x7f8d ), SHC( 0xf54a ), SHC( 0x7f6f ), SHC( 0xf3f4 ), SHC( 0x7f4c ), SHC( 0xf29f ), SHC( 0x7f27 ), SHC( 0xf14a ), - SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7ed1 ), SHC( 0xeea1 ), SHC( 0x7ea0 ), SHC( 0xed4d ), SHC( 0x7e6d ), SHC( 0xebfa ), - SHC( 0x7e35 ), SHC( 0xeaa7 ), SHC( 0x7dfa ), SHC( 0xe955 ), SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7d7a ), SHC( 0xe6b3 ), - SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7ceb ), SHC( 0xe414 ), SHC( 0x7c9e ), SHC( 0xe2c5 ), SHC( 0x7c4e ), SHC( 0xe178 ), - SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x7b49 ), SHC( 0xdd94 ), SHC( 0x7aeb ), SHC( 0xdc4a ), - SHC( 0x7a89 ), SHC( 0xdb01 ), SHC( 0x7a25 ), SHC( 0xd9b9 ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ff0 ), SHC( 0xfbfb ), - SHC( 0x7fbf ), SHC( 0xf7f6 ), SHC( 0x7f6f ), SHC( 0xf3f4 ), SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7e6d ), SHC( 0xebfa ), - SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7ceb ), SHC( 0xe414 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7aeb ), SHC( 0xdc4a ), - SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x786f ), SHC( 0xd4a4 ), SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x7579 ), SHC( 0xcd2a ), - SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6e2d ), SHC( 0xbed8 ), - SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x69de ), SHC( 0xb80e ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x6524 ), SHC( 0xb18c ), - SHC( 0x62a0 ), SHC( 0xae69 ), SHC( 0x6004 ), SHC( 0xab5a ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x5a82 ), SHC( 0xa57e ), - SHC( 0x579f ), SHC( 0xa2b1 ), SHC( 0x54a6 ), SHC( 0x9ffc ), SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x4e74 ), SHC( 0x9adc ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fd3 ), SHC( 0xf94d ), SHC( 0x7f4c ), SHC( 0xf29f ), SHC( 0x7e6d ), SHC( 0xebfa ), - SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7780 ), SHC( 0xd221 ), - SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6eda ), SHC( 0xc000 ), SHC( 0x6b5a ), SHC( 0xba49 ), - SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x637a ), SHC( 0xaf72 ), SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x5a82 ), SHC( 0xa57e ), - SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x508e ), SHC( 0x9c86 ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x45b7 ), SHC( 0x94a6 ), - SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x3410 ), SHC( 0x8b11 ), SHC( 0x2ddf ), SHC( 0x8880 ), - SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x2121 ), SHC( 0x845d ), SHC( 0x1a9d ), SHC( 0x82cc ), SHC( 0x1406 ), SHC( 0x8193 ), - SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0x06b3 ), SHC( 0x802d ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fa8 ), SHC( 0xf6a0 ), - SHC( 0x7ea0 ), SHC( 0xed4d ), SHC( 0x7ceb ), SHC( 0xe414 ), SHC( 0x7a89 ), SHC( 0xdb01 ), SHC( 0x7780 ), SHC( 0xd221 ), - SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x6f84 ), SHC( 0xc12a ), SHC( 0x6a9d ), SHC( 0xb92a ), SHC( 0x6524 ), SHC( 0xb18c ), - SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x5898 ), SHC( 0xa39d ), SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x4a26 ), SHC( 0x97aa ), - SHC( 0x424f ), SHC( 0x9283 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x319a ), SHC( 0x8a00 ), SHC( 0x28d4 ), SHC( 0x86b0 ), - SHC( 0x1fd5 ), SHC( 0x8405 ), SHC( 0x16ab ), SHC( 0x8206 ), SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0x0405 ), SHC( 0x8010 ), - SHC( 0xfaa4 ), SHC( 0x801d ), SHC( 0xf14a ), SHC( 0x80d9 ), SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xdedf ), SHC( 0x845d ), - SHC( 0xd5e8 ), SHC( 0x871f ), SHC( 0xcd2a ), SHC( 0x8a87 ), SHC( 0xc4b3 ), SHC( 0x8e91 ), SHC( 0xbc8d ), SHC( 0x9337 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f6f ), SHC( 0xf3f4 ), SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7aeb ), SHC( 0xdc4a ), - SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x6524 ), SHC( 0xb18c ), - SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x54a6 ), SHC( 0x9ffc ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x4128 ), SHC( 0x91d3 ), - SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x2b5c ), SHC( 0x8791 ), SHC( 0x1fd5 ), SHC( 0x8405 ), SHC( 0x1406 ), SHC( 0x8193 ), - SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xfbfb ), SHC( 0x8010 ), SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0xe414 ), SHC( 0x8315 ), - SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xcd2a ), SHC( 0x8a87 ), SHC( 0xc256 ), SHC( 0x8fd5 ), SHC( 0xb80e ), SHC( 0x9622 ), - SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9d60 ), SHC( 0xae69 ), SHC( 0x9622 ), SHC( 0xb80e ), - SHC( 0x8fd5 ), SHC( 0xc256 ), SHC( 0x8a87 ), SHC( 0xcd2a ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f27 ), SHC( 0xf14a ), - SHC( 0x7c9e ), SHC( 0xe2c5 ), SHC( 0x786f ), SHC( 0xd4a4 ), SHC( 0x72a7 ), SHC( 0xc716 ), SHC( 0x6b5a ), SHC( 0xba49 ), - SHC( 0x62a0 ), SHC( 0xae69 ), SHC( 0x5898 ), SHC( 0xa39d ), SHC( 0x4d64 ), SHC( 0x9a0b ), SHC( 0x4128 ), SHC( 0x91d3 ), - SHC( 0x3410 ), SHC( 0x8b11 ), SHC( 0x2647 ), SHC( 0x85db ), SHC( 0x17fc ), SHC( 0x8244 ), SHC( 0x0960 ), SHC( 0x8058 ), - SHC( 0xfaa4 ), SHC( 0x801d ), SHC( 0xebfa ), SHC( 0x8193 ), SHC( 0xdd94 ), SHC( 0x84b7 ), SHC( 0xcfa3 ), SHC( 0x897d ), - SHC( 0xc256 ), SHC( 0x8fd5 ), SHC( 0xb5da ), SHC( 0x97aa ), SHC( 0xaa5a ), SHC( 0xa0e1 ), SHC( 0x9ffc ), SHC( 0xab5a ), - SHC( 0x96e5 ), SHC( 0xb6f3 ), SHC( 0x8f31 ), SHC( 0xc383 ), SHC( 0x88fd ), SHC( 0xd0e1 ), SHC( 0x845d ), SHC( 0xdedf ), - SHC( 0x8160 ), SHC( 0xed4d ), SHC( 0x8010 ), SHC( 0xfbfb ), SHC( 0x8073 ), SHC( 0x0ab6 ), SHC( 0x8286 ), SHC( 0x194d ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ed1 ), SHC( 0xeea1 ), SHC( 0x7b49 ), SHC( 0xdd94 ), SHC( 0x7579 ), SHC( 0xcd2a ), - SHC( 0x6d7d ), SHC( 0xbdb1 ), SHC( 0x637a ), SHC( 0xaf72 ), SHC( 0x579f ), SHC( 0xa2b1 ), SHC( 0x4a26 ), SHC( 0x97aa ), - SHC( 0x3b4d ), SHC( 0x8e91 ), SHC( 0x2b5c ), SHC( 0x8791 ), SHC( 0x1a9d ), SHC( 0x82cc ), SHC( 0x0960 ), SHC( 0x8058 ), - SHC( 0xf7f6 ), SHC( 0x8041 ), SHC( 0xe6b3 ), SHC( 0x8286 ), SHC( 0xd5e8 ), SHC( 0x871f ), SHC( 0xc5e4 ), SHC( 0x8df3 ), - SHC( 0xb6f3 ), SHC( 0x96e5 ), SHC( 0xa95c ), SHC( 0xa1c8 ), SHC( 0x9d60 ), SHC( 0xae69 ), SHC( 0x9337 ), SHC( 0xbc8d ), - SHC( 0x8b11 ), SHC( 0xcbf0 ), SHC( 0x8515 ), SHC( 0xdc4a ), SHC( 0x8160 ), SHC( 0xed4d ), SHC( 0x8002 ), SHC( 0xfea9 ), - SHC( 0x8102 ), SHC( 0x100b ), SHC( 0x845d ), SHC( 0x2121 ), SHC( 0x8a00 ), SHC( 0x319a ), SHC( 0x91d3 ), SHC( 0x4128 ), - SHC( 0x9bb0 ), SHC( 0x4f82 ), SHC( 0xa768 ), SHC( 0x5c63 ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e6d ), SHC( 0xebfa ), - SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5a82 ), SHC( 0xa57e ), - SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1406 ), SHC( 0x8193 ), - SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xebfa ), SHC( 0x8193 ), SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xc5e4 ), SHC( 0x8df3 ), - SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x8df3 ), SHC( 0xc5e4 ), - SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8193 ), SHC( 0xebfa ), SHC( 0x8000 ), SHC( 0x0000 ), SHC( 0x8193 ), SHC( 0x1406 ), - SHC( 0x8644 ), SHC( 0x278e ), SHC( 0x8df3 ), SHC( 0x3a1c ), SHC( 0x9872 ), SHC( 0x4b3d ), SHC( 0xa57e ), SHC( 0x5a82 ), - SHC( 0xb4c3 ), SHC( 0x678e ), SHC( 0xc5e4 ), SHC( 0x720d ), SHC( 0xd872 ), SHC( 0x79bc ), SHC( 0xebfa ), SHC( 0x7e6d ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7dfa ), SHC( 0xe955 ), SHC( 0x77f9 ), SHC( 0xd362 ), SHC( 0x6e2d ), SHC( 0xbed8 ), - SHC( 0x60e5 ), SHC( 0xac5d ), SHC( 0x508e ), SHC( 0x9c86 ), SHC( 0x3daa ), SHC( 0x8fd5 ), SHC( 0x28d4 ), SHC( 0x86b0 ), - SHC( 0x12b3 ), SHC( 0x8160 ), SHC( 0xfbfb ), SHC( 0x8010 ), SHC( 0xe563 ), SHC( 0x82cc ), SHC( 0xcfa3 ), SHC( 0x897d ), - SHC( 0xbb6a ), SHC( 0x93ed ), SHC( 0xa95c ), SHC( 0xa1c8 ), SHC( 0x9a0b ), SHC( 0xb29c ), SHC( 0x8df3 ), SHC( 0xc5e4 ), - SHC( 0x8577 ), SHC( 0xdb01 ), SHC( 0x80d9 ), SHC( 0xf14a ), SHC( 0x8041 ), SHC( 0x080a ), SHC( 0x83b2 ), SHC( 0x1e88 ), - SHC( 0x8b11 ), SHC( 0x3410 ), SHC( 0x9622 ), SHC( 0x47f2 ), SHC( 0xa48c ), SHC( 0x598f ), SHC( 0xb5da ), SHC( 0x6856 ), - SHC( 0xc980 ), SHC( 0x73d1 ), SHC( 0xdedf ), SHC( 0x7ba3 ), SHC( 0xf54a ), SHC( 0x7f8d ), SHC( 0x0c0c ), SHC( 0x7f6f ), - SHC( 0x226c ), SHC( 0x7b49 ), SHC( 0x37b6 ), SHC( 0x733e ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7d7a ), SHC( 0xe6b3 ), - SHC( 0x7600 ), SHC( 0xce66 ), SHC( 0x69de ), SHC( 0xb80e ), SHC( 0x598f ), SHC( 0xa48c ), SHC( 0x45b7 ), SHC( 0x94a6 ), - SHC( 0x2f1f ), SHC( 0x88fd ), SHC( 0x16ab ), SHC( 0x8206 ), SHC( 0xfd52 ), SHC( 0x8007 ), SHC( 0xe414 ), SHC( 0x8315 ), - SHC( 0xcbf0 ), SHC( 0x8b11 ), SHC( 0xb5da ), SHC( 0x97aa ), SHC( 0xa2b1 ), SHC( 0xa861 ), SHC( 0x9337 ), SHC( 0xbc8d ), - SHC( 0x8807 ), SHC( 0xd362 ), SHC( 0x8193 ), SHC( 0xebfa ), SHC( 0x801d ), SHC( 0x055c ), SHC( 0x83b2 ), SHC( 0x1e88 ), - SHC( 0x8c2f ), SHC( 0x3680 ), SHC( 0x993d ), SHC( 0x4c51 ), SHC( 0xaa5a ), SHC( 0x5f1f ), SHC( 0xbed8 ), SHC( 0x6e2d ), - SHC( 0xd5e8 ), SHC( 0x78e1 ), SHC( 0xeea1 ), SHC( 0x7ed1 ), SHC( 0x080a ), SHC( 0x7fbf ), SHC( 0x2121 ), SHC( 0x7ba3 ), - SHC( 0x38ea ), SHC( 0x72a7 ), SHC( 0x4e74 ), SHC( 0x6524 ), SHC( 0x60e5 ), SHC( 0x53a3 ), SHC( 0x6f84 ), SHC( 0x3ed6 ) -}; - - -/** - * \brief Twiddle factors are unscaled - */ -const Word16 RotVector_256[2 * ( 256 - 32 )] = { // Q15 - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ff6 ), SHC( 0xfcdc ), SHC( 0x7fd9 ), SHC( 0xf9b8 ), SHC( 0x7fa7 ), SHC( 0xf695 ), - SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7f0a ), SHC( 0xf055 ), SHC( 0x7e9d ), SHC( 0xed38 ), SHC( 0x7e1e ), SHC( 0xea1e ), - SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7ce4 ), SHC( 0xe3f4 ), SHC( 0x7c2a ), SHC( 0xe0e6 ), SHC( 0x7b5d ), SHC( 0xdddc ), - SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x798a ), SHC( 0xd7d9 ), SHC( 0x7885 ), SHC( 0xd4e1 ), SHC( 0x776c ), SHC( 0xd1ef ), - SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x7505 ), SHC( 0xcc21 ), SHC( 0x73b6 ), SHC( 0xc946 ), SHC( 0x7255 ), SHC( 0xc673 ), - SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6f5f ), SHC( 0xc0e9 ), SHC( 0x6dca ), SHC( 0xbe32 ), SHC( 0x6c24 ), SHC( 0xbb85 ), - SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x68a7 ), SHC( 0xb64c ), SHC( 0x66d0 ), SHC( 0xb3c0 ), SHC( 0x64e9 ), SHC( 0xb140 ), - SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x60ec ), SHC( 0xac65 ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x5cb4 ), SHC( 0xa7bd ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fd9 ), SHC( 0xf9b8 ), SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7e9d ), SHC( 0xed38 ), - SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7c2a ), SHC( 0xe0e6 ), SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x7885 ), SHC( 0xd4e1 ), - SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x73b6 ), SHC( 0xc946 ), SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6dca ), SHC( 0xbe32 ), - SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x66d0 ), SHC( 0xb3c0 ), SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x5ed7 ), SHC( 0xaa0a ), - SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x55f6 ), SHC( 0xa129 ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x4c40 ), SHC( 0x9930 ), - SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x41ce ), SHC( 0x9236 ), SHC( 0x3c57 ), SHC( 0x8f1d ), SHC( 0x36ba ), SHC( 0x8c4a ), - SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2b1f ), SHC( 0x877b ), SHC( 0x2528 ), SHC( 0x8583 ), SHC( 0x1f1a ), SHC( 0x83d6 ), - SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x12c8 ), SHC( 0x8163 ), SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0x0648 ), SHC( 0x8027 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fa7 ), SHC( 0xf695 ), SHC( 0x7e9d ), SHC( 0xed38 ), SHC( 0x7ce4 ), SHC( 0xe3f4 ), - SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x776c ), SHC( 0xd1ef ), SHC( 0x73b6 ), SHC( 0xc946 ), SHC( 0x6f5f ), SHC( 0xc0e9 ), - SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x64e9 ), SHC( 0xb140 ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x5843 ), SHC( 0xa34c ), - SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x49b4 ), SHC( 0x9759 ), SHC( 0x41ce ), SHC( 0x9236 ), SHC( 0x398d ), SHC( 0x8dab ), - SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2827 ), SHC( 0x8676 ), SHC( 0x1f1a ), SHC( 0x83d6 ), SHC( 0x15e2 ), SHC( 0x81e2 ), - SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0x0324 ), SHC( 0x800a ), SHC( 0xf9b8 ), SHC( 0x8027 ), SHC( 0xf055 ), SHC( 0x80f6 ), - SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xdddc ), SHC( 0x84a3 ), SHC( 0xd4e1 ), SHC( 0x877b ), SHC( 0xcc21 ), SHC( 0x8afb ), - SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xbb85 ), SHC( 0x93dc ), SHC( 0xb3c0 ), SHC( 0x9930 ), SHC( 0xac65 ), SHC( 0x9f14 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7a7d ), SHC( 0xdad8 ), - SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x62f2 ), SHC( 0xaecc ), - SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x3c57 ), SHC( 0x8f1d ), - SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2528 ), SHC( 0x8583 ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0c8c ), SHC( 0x809e ), - SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xf374 ), SHC( 0x809e ), SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xdad8 ), SHC( 0x8583 ), - SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xb8e3 ), SHC( 0x9592 ), SHC( 0xaecc ), SHC( 0x9d0e ), - SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9d0e ), SHC( 0xaecc ), SHC( 0x9592 ), SHC( 0xb8e3 ), SHC( 0x8f1d ), SHC( 0xc3a9 ), - SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x8583 ), SHC( 0xdad8 ), SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x809e ), SHC( 0xf374 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f0a ), SHC( 0xf055 ), SHC( 0x7c2a ), SHC( 0xe0e6 ), SHC( 0x776c ), SHC( 0xd1ef ), - SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x68a7 ), SHC( 0xb64c ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x539b ), SHC( 0x9f14 ), - SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x398d ), SHC( 0x8dab ), SHC( 0x2b1f ), SHC( 0x877b ), SHC( 0x1c0c ), SHC( 0x831c ), - SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0xfcdc ), SHC( 0x800a ), SHC( 0xed38 ), SHC( 0x8163 ), SHC( 0xdddc ), SHC( 0x84a3 ), - SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xc0e9 ), SHC( 0x90a1 ), SHC( 0xb3c0 ), SHC( 0x9930 ), SHC( 0xa7bd ), SHC( 0xa34c ), - SHC( 0x9d0e ), SHC( 0xaecc ), SHC( 0x93dc ), SHC( 0xbb85 ), SHC( 0x8c4a ), SHC( 0xc946 ), SHC( 0x8676 ), SHC( 0xd7d9 ), - SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x8059 ), SHC( 0xf695 ), SHC( 0x8027 ), SHC( 0x0648 ), SHC( 0x81e2 ), SHC( 0x15e2 ), - SHC( 0x8583 ), SHC( 0x2528 ), SHC( 0x8afb ), SHC( 0x33df ), SHC( 0x9236 ), SHC( 0x41ce ), SHC( 0x9b17 ), SHC( 0x4ec0 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e9d ), SHC( 0xed38 ), SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x73b6 ), SHC( 0xc946 ), - SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x41ce ), SHC( 0x9236 ), - SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x1f1a ), SHC( 0x83d6 ), SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0xf9b8 ), SHC( 0x8027 ), - SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xd4e1 ), SHC( 0x877b ), SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xb3c0 ), SHC( 0x9930 ), - SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9930 ), SHC( 0xb3c0 ), SHC( 0x8f1d ), SHC( 0xc3a9 ), SHC( 0x877b ), SHC( 0xd4e1 ), - SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x8027 ), SHC( 0xf9b8 ), SHC( 0x809e ), SHC( 0x0c8c ), SHC( 0x83d6 ), SHC( 0x1f1a ), - SHC( 0x89be ), SHC( 0x30fc ), SHC( 0x9236 ), SHC( 0x41ce ), SHC( 0x9d0e ), SHC( 0x5134 ), SHC( 0xaa0a ), SHC( 0x5ed7 ), - SHC( 0xb8e3 ), SHC( 0x6a6e ), SHC( 0xc946 ), SHC( 0x73b6 ), SHC( 0xdad8 ), SHC( 0x7a7d ), SHC( 0xed38 ), SHC( 0x7e9d ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e1e ), SHC( 0xea1e ), SHC( 0x7885 ), SHC( 0xd4e1 ), SHC( 0x6f5f ), SHC( 0xc0e9 ), - SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x539b ), SHC( 0x9f14 ), SHC( 0x41ce ), SHC( 0x9236 ), SHC( 0x2e11 ), SHC( 0x8894 ), - SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0324 ), SHC( 0x800a ), SHC( 0xed38 ), SHC( 0x8163 ), SHC( 0xd7d9 ), SHC( 0x8676 ), - SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xb140 ), SHC( 0x9b17 ), SHC( 0xa129 ), SHC( 0xaa0a ), SHC( 0x93dc ), SHC( 0xbb85 ), - SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x831c ), SHC( 0xe3f4 ), SHC( 0x8027 ), SHC( 0xf9b8 ), SHC( 0x80f6 ), SHC( 0x0fab ), - SHC( 0x8583 ), SHC( 0x2528 ), SHC( 0x8dab ), SHC( 0x398d ), SHC( 0x9930 ), SHC( 0x4c40 ), SHC( 0xa7bd ), SHC( 0x5cb4 ), - SHC( 0xb8e3 ), SHC( 0x6a6e ), SHC( 0xcc21 ), SHC( 0x7505 ), SHC( 0xe0e6 ), SHC( 0x7c2a ), SHC( 0xf695 ), SHC( 0x7fa7 ), - SHC( 0x0c8c ), SHC( 0x7f62 ), SHC( 0x2224 ), SHC( 0x7b5d ), SHC( 0x36ba ), SHC( 0x73b6 ), SHC( 0x49b4 ), SHC( 0x68a7 ) -}; - -/** - * \brief Twiddle factors are unscaled - */ -const Word16 RotVector_320[2 * ( 320 - 20 )] = { // Q15 - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fe7 ), SHC( 0xfafa ), SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7f1d ), SHC( 0xf0f5 ), - SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7b32 ), SHC( 0xdd41 ), - SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7817 ), SHC( 0xd3b2 ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x743e ), SHC( 0xca69 ), - SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6fae ), SHC( 0xc175 ), SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x6a6e ), SHC( 0xb8e3 ), - SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x6485 ), SHC( 0xb0c2 ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5dfe ), SHC( 0xa91d ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7c77 ), SHC( 0xe21e ), - SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6d23 ), SHC( 0xbd1f ), - SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5321 ), SHC( 0x9eab ), - SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x42e1 ), SHC( 0x92dd ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x30fc ), SHC( 0x89be ), - SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1de2 ), SHC( 0x8389 ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0a0b ), SHC( 0x8065 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f1d ), SHC( 0xf0f5 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7817 ), SHC( 0xd3b2 ), - SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x56e3 ), SHC( 0xa202 ), - SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3e8b ), SHC( 0x9052 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x22bf ), SHC( 0x84ce ), - SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0506 ), SHC( 0x8019 ), SHC( 0xf5f5 ), SHC( 0x8065 ), SHC( 0xe707 ), SHC( 0x8276 ), - SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xca69 ), SHC( 0x8bc2 ), SHC( 0xbd1f ), SHC( 0x92dd ), SHC( 0xb0c2 ), SHC( 0x9b7b ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x720d ), SHC( 0xc5e4 ), - SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3a1c ), SHC( 0x8df3 ), - SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xebfa ), SHC( 0x8193 ), - SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa57e ), SHC( 0xa57e ), - SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x8df3 ), SHC( 0xc5e4 ), SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8193 ), SHC( 0xebfa ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), - SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x18f9 ), SHC( 0x8276 ), - SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xb8e3 ), SHC( 0x9592 ), - SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9592 ), SHC( 0xb8e3 ), SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x8276 ), SHC( 0xe707 ), - SHC( 0x8000 ), SHC( 0x0000 ), SHC( 0x8276 ), SHC( 0x18f9 ), SHC( 0x89be ), SHC( 0x30fc ), SHC( 0x9592 ), SHC( 0x471d ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6155 ), SHC( 0xacdf ), - SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0xf5f5 ), SHC( 0x8065 ), - SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xbd1f ), SHC( 0x92dd ), SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x92dd ), SHC( 0xbd1f ), - SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8065 ), SHC( 0xf5f5 ), SHC( 0x8193 ), SHC( 0x1406 ), SHC( 0x89be ), SHC( 0x30fc ), - SHC( 0x9872 ), SHC( 0x4b3d ), SHC( 0xacdf ), SHC( 0x6155 ), SHC( 0xc5e4 ), SHC( 0x720d ), SHC( 0xe21e ), SHC( 0x7c77 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7b32 ), SHC( 0xdd41 ), SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x56e3 ), SHC( 0xa202 ), - SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0xf5f5 ), SHC( 0x8065 ), SHC( 0xd3b2 ), SHC( 0x87e9 ), - SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0x9b7b ), SHC( 0xb0c2 ), SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x80e3 ), SHC( 0xf0f5 ), - SHC( 0x8193 ), SHC( 0x1406 ), SHC( 0x8bc2 ), SHC( 0x3597 ), SHC( 0x9eab ), SHC( 0x5321 ), SHC( 0xb8e3 ), SHC( 0x6a6e ), - SHC( 0xd872 ), SHC( 0x79bc ), SHC( 0xfafa ), SHC( 0x7fe7 ), SHC( 0x1de2 ), SHC( 0x7c77 ), SHC( 0x3e8b ), SHC( 0x6fae ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ffa ), SHC( 0xfd7d ), SHC( 0x7fe7 ), SHC( 0xfafa ), SHC( 0x7fc7 ), SHC( 0xf877 ), - SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7f1d ), SHC( 0xf0f5 ), SHC( 0x7ecb ), SHC( 0xee76 ), - SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7e02 ), SHC( 0xe980 ), SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7d07 ), SHC( 0xe492 ), - SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7bda ), SHC( 0xdfae ), SHC( 0x7b32 ), SHC( 0xdd41 ), SHC( 0x7a7d ), SHC( 0xdad8 ), - SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x78ef ), SHC( 0xd610 ), SHC( 0x7817 ), SHC( 0xd3b2 ), SHC( 0x7732 ), SHC( 0xd159 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fc7 ), SHC( 0xf877 ), SHC( 0x7f1d ), SHC( 0xf0f5 ), SHC( 0x7e02 ), SHC( 0xe980 ), - SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x7817 ), SHC( 0xd3b2 ), SHC( 0x7546 ), SHC( 0xccb4 ), - SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6e6e ), SHC( 0xbf47 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x660f ), SHC( 0xb2bf ), - SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5c45 ), SHC( 0xa749 ), SHC( 0x56e3 ), SHC( 0xa202 ), SHC( 0x5134 ), SHC( 0x9d0e ), - SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x4502 ), SHC( 0x9432 ), SHC( 0x3e8b ), SHC( 0x9052 ), SHC( 0x37dc ), SHC( 0x8cd5 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7a7d ), SHC( 0xdad8 ), - SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x62f2 ), SHC( 0xaecc ), - SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x3c57 ), SHC( 0x8f1d ), - SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2528 ), SHC( 0x8583 ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0c8c ), SHC( 0x809e ), - SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xf374 ), SHC( 0x809e ), SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xdad8 ), SHC( 0x8583 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ecb ), SHC( 0xee76 ), SHC( 0x7b32 ), SHC( 0xdd41 ), SHC( 0x7546 ), SHC( 0xccb4 ), - SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x56e3 ), SHC( 0xa202 ), SHC( 0x4930 ), SHC( 0x96fd ), - SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x29f0 ), SHC( 0x8711 ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0789 ), SHC( 0x8039 ), - SHC( 0xf5f5 ), SHC( 0x8065 ), SHC( 0xe492 ), SHC( 0x82f9 ), SHC( 0xd3b2 ), SHC( 0x87e9 ), SHC( 0xc3a9 ), SHC( 0x8f1d ), - SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa749 ), SHC( 0xa3bb ), SHC( 0x9b7b ), SHC( 0xb0c2 ), SHC( 0x9192 ), SHC( 0xbf47 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e02 ), SHC( 0xe980 ), SHC( 0x7817 ), SHC( 0xd3b2 ), SHC( 0x6e6e ), SHC( 0xbf47 ), - SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x3e8b ), SHC( 0x9052 ), SHC( 0x29f0 ), SHC( 0x8711 ), - SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0xfd7d ), SHC( 0x8006 ), SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xd159 ), SHC( 0x88ce ), - SHC( 0xbd1f ), SHC( 0x92dd ), SHC( 0xaafa ), SHC( 0xa052 ), SHC( 0x9b7b ), SHC( 0xb0c2 ), SHC( 0x8f1d ), SHC( 0xc3a9 ), - SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8135 ), SHC( 0xee76 ), SHC( 0x8019 ), SHC( 0x0506 ), SHC( 0x82f9 ), SHC( 0x1b6e ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7d07 ), SHC( 0xe492 ), SHC( 0x743e ), SHC( 0xca69 ), SHC( 0x660f ), SHC( 0xb2bf ), - SHC( 0x5321 ), SHC( 0x9eab ), SHC( 0x3c57 ), SHC( 0x8f1d ), SHC( 0x22bf ), SHC( 0x84ce ), SHC( 0x0789 ), SHC( 0x8039 ), - SHC( 0xebfa ), SHC( 0x8193 ), SHC( 0xd159 ), SHC( 0x88ce ), SHC( 0xb8e3 ), SHC( 0x9592 ), SHC( 0xa3bb ), SHC( 0xa749 ), - SHC( 0x92dd ), SHC( 0xbd1f ), SHC( 0x8711 ), SHC( 0xd610 ), SHC( 0x80e3 ), SHC( 0xf0f5 ), SHC( 0x809e ), SHC( 0x0c8c ), - SHC( 0x8644 ), SHC( 0x278e ), SHC( 0x9192 ), SHC( 0x40b9 ), SHC( 0xa202 ), SHC( 0x56e3 ), SHC( 0xb6d0 ), SHC( 0x6903 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7bda ), SHC( 0xdfae ), SHC( 0x6fae ), SHC( 0xc175 ), SHC( 0x5c45 ), SHC( 0xa749 ), - SHC( 0x42e1 ), SHC( 0x92dd ), SHC( 0x2528 ), SHC( 0x8583 ), SHC( 0x0506 ), SHC( 0x8019 ), SHC( 0xe492 ), SHC( 0x82f9 ), - SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xaafa ), SHC( 0xa052 ), SHC( 0x9592 ), SHC( 0xb8e3 ), SHC( 0x8711 ), SHC( 0xd610 ), - SHC( 0x8065 ), SHC( 0xf5f5 ), SHC( 0x81fe ), SHC( 0x1680 ), SHC( 0x8bc2 ), SHC( 0x3597 ), SHC( 0x9d0e ), SHC( 0x5134 ), - SHC( 0xb4c3 ), SHC( 0x678e ), SHC( 0xd159 ), SHC( 0x7732 ), SHC( 0xf0f5 ), SHC( 0x7f1d ), SHC( 0x118a ), SHC( 0x7ecb ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x5134 ), SHC( 0x9d0e ), - SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xc3a9 ), SHC( 0x8f1d ), - SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x8f1d ), SHC( 0xc3a9 ), SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x809e ), SHC( 0x0c8c ), - SHC( 0x89be ), SHC( 0x30fc ), SHC( 0x9d0e ), SHC( 0x5134 ), SHC( 0xb8e3 ), SHC( 0x6a6e ), SHC( 0xdad8 ), SHC( 0x7a7d ), - SHC( 0x0000 ), SHC( 0x7fff ), SHC( 0x2528 ), SHC( 0x7a7d ), SHC( 0x471d ), SHC( 0x6a6e ), SHC( 0x62f2 ), SHC( 0x5134 ) -}; - - -/** - * \brief Twiddle factors are unscaled - * Rotation factor table, real and imaginary part interleaved, for dim1=20,dim2=20 - */ - -const Word16 RotVector_400[2 * ( 400 - 20 )] = { // Q15 - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ff0 ), SHC( 0xfbfb ), SHC( 0x7fbf ), SHC( 0xf7f6 ), SHC( 0x7f6f ), SHC( 0xf3f4 ), - SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7ceb ), SHC( 0xe414 ), - SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7aeb ), SHC( 0xdc4a ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x786f ), SHC( 0xd4a4 ), - SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x7579 ), SHC( 0xcd2a ), SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x720d ), SHC( 0xc5e4 ), - SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6e2d ), SHC( 0xbed8 ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x69de ), SHC( 0xb80e ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fbf ), SHC( 0xf7f6 ), SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7dbc ), SHC( 0xe804 ), - SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x73d1 ), SHC( 0xc980 ), - SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x62a0 ), SHC( 0xae69 ), - SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x579f ), SHC( 0xa2b1 ), SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x4b3d ), SHC( 0x9872 ), - SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x3daa ), SHC( 0x8fd5 ), SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x2f1f ), SHC( 0x88fd ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f6f ), SHC( 0xf3f4 ), SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7aeb ), SHC( 0xdc4a ), - SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x6524 ), SHC( 0xb18c ), - SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x54a6 ), SHC( 0x9ffc ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x4128 ), SHC( 0x91d3 ), - SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x2b5c ), SHC( 0x8791 ), SHC( 0x1fd5 ), SHC( 0x8405 ), SHC( 0x1406 ), SHC( 0x8193 ), - SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xfbfb ), SHC( 0x8010 ), SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0xe414 ), SHC( 0x8315 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7703 ), SHC( 0xd0e1 ), - SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x5197 ), SHC( 0x9d60 ), - SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x17fc ), SHC( 0x8244 ), - SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xf7f6 ), SHC( 0x8041 ), SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xd872 ), SHC( 0x8644 ), - SHC( 0xc980 ), SHC( 0x8c2f ), SHC( 0xbb6a ), SHC( 0x93ed ), SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0xa2b1 ), SHC( 0xa861 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x720d ), SHC( 0xc5e4 ), - SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3a1c ), SHC( 0x8df3 ), - SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xebfa ), SHC( 0x8193 ), - SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa57e ), SHC( 0xa57e ), - SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x8df3 ), SHC( 0xc5e4 ), SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8193 ), SHC( 0xebfa ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x6c13 ), SHC( 0xbb6a ), - SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x1fd5 ), SHC( 0x8405 ), - SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xc256 ), SHC( 0x8fd5 ), - SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0x9d60 ), SHC( 0xae69 ), SHC( 0x8fd5 ), SHC( 0xc256 ), SHC( 0x8644 ), SHC( 0xd872 ), - SHC( 0x8102 ), SHC( 0xeff5 ), SHC( 0x8041 ), SHC( 0x080a ), SHC( 0x8405 ), SHC( 0x1fd5 ), SHC( 0x8c2f ), SHC( 0x3680 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ceb ), SHC( 0xe414 ), SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x6524 ), SHC( 0xb18c ), - SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x1fd5 ), SHC( 0x8405 ), SHC( 0x0405 ), SHC( 0x8010 ), - SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xcd2a ), SHC( 0x8a87 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0x9ffc ), SHC( 0xab5a ), - SHC( 0x8fd5 ), SHC( 0xc256 ), SHC( 0x8515 ), SHC( 0xdc4a ), SHC( 0x8041 ), SHC( 0xf7f6 ), SHC( 0x8193 ), SHC( 0x1406 ), - SHC( 0x88fd ), SHC( 0x2f1f ), SHC( 0x9622 ), SHC( 0x47f2 ), SHC( 0xa861 ), SHC( 0x5d4f ), SHC( 0xbed8 ), SHC( 0x6e2d ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x5d4f ), SHC( 0xa861 ), - SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xe804 ), SHC( 0x8244 ), - SHC( 0xc980 ), SHC( 0x8c2f ), SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x88fd ), SHC( 0xd0e1 ), - SHC( 0x8102 ), SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0x100b ), SHC( 0x88fd ), SHC( 0x2f1f ), SHC( 0x9872 ), SHC( 0x4b3d ), - SHC( 0xae69 ), SHC( 0x62a0 ), SHC( 0xc980 ), SHC( 0x73d1 ), SHC( 0xe804 ), SHC( 0x7dbc ), SHC( 0x080a ), SHC( 0x7fbf ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7aeb ), SHC( 0xdc4a ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x54a6 ), SHC( 0x9ffc ), - SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0xcd2a ), SHC( 0x8a87 ), - SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0x9622 ), SHC( 0xb80e ), SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8010 ), SHC( 0xfbfb ), - SHC( 0x8405 ), SHC( 0x1fd5 ), SHC( 0x91d3 ), SHC( 0x4128 ), SHC( 0xa861 ), SHC( 0x5d4f ), SHC( 0xc5e4 ), SHC( 0x720d ), - SHC( 0xe804 ), SHC( 0x7dbc ), SHC( 0x0c0c ), SHC( 0x7f6f ), SHC( 0x2f1f ), SHC( 0x7703 ), SHC( 0x4e74 ), SHC( 0x6524 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ffc ), SHC( 0xfdfd ), SHC( 0x7ff0 ), SHC( 0xfbfb ), SHC( 0x7fdc ), SHC( 0xf9f8 ), - SHC( 0x7fbf ), SHC( 0xf7f6 ), SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7f6f ), SHC( 0xf3f4 ), SHC( 0x7f3a ), SHC( 0xf1f4 ), - SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7eb9 ), SHC( 0xedf7 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7e18 ), SHC( 0xe9fe ), - SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7d57 ), SHC( 0xe60b ), SHC( 0x7ceb ), SHC( 0xe414 ), SHC( 0x7c77 ), SHC( 0xe21e ), - SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7b77 ), SHC( 0xde39 ), SHC( 0x7aeb ), SHC( 0xdc4a ), SHC( 0x7a57 ), SHC( 0xda5d ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fdc ), SHC( 0xf9f8 ), SHC( 0x7f6f ), SHC( 0xf3f4 ), SHC( 0x7eb9 ), SHC( 0xedf7 ), - SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7aeb ), SHC( 0xdc4a ), SHC( 0x7919 ), SHC( 0xd68a ), - SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x74a9 ), SHC( 0xcb53 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6f2f ), SHC( 0xc095 ), - SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x68b9 ), SHC( 0xb666 ), SHC( 0x6524 ), SHC( 0xb18c ), SHC( 0x6155 ), SHC( 0xacdf ), - SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x5914 ), SHC( 0xa414 ), SHC( 0x54a6 ), SHC( 0x9ffc ), SHC( 0x5008 ), SHC( 0x9c1b ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7c77 ), SHC( 0xe21e ), - SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6d23 ), SHC( 0xbd1f ), - SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5321 ), SHC( 0x9eab ), - SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x42e1 ), SHC( 0x92dd ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x30fc ), SHC( 0x89be ), - SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1de2 ), SHC( 0x8389 ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0a0b ), SHC( 0x8065 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f3a ), SHC( 0xf1f4 ), SHC( 0x7ceb ), SHC( 0xe414 ), SHC( 0x7919 ), SHC( 0xd68a ), - SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x6524 ), SHC( 0xb18c ), SHC( 0x5bec ), SHC( 0xa6ec ), - SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x4646 ), SHC( 0x9504 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x2d3f ), SHC( 0x8843 ), - SHC( 0x1fd5 ), SHC( 0x8405 ), SHC( 0x1209 ), SHC( 0x8147 ), SHC( 0x0405 ), SHC( 0x8010 ), SHC( 0xf5f5 ), SHC( 0x8065 ), - SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xda5d ), SHC( 0x85a9 ), SHC( 0xcd2a ), SHC( 0x8a87 ), SHC( 0xc095 ), SHC( 0x90d1 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7eb9 ), SHC( 0xedf7 ), SHC( 0x7aeb ), SHC( 0xdc4a ), SHC( 0x74a9 ), SHC( 0xcb53 ), - SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x54a6 ), SHC( 0x9ffc ), SHC( 0x4646 ), SHC( 0x9504 ), - SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x25a3 ), SHC( 0x85a9 ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0203 ), SHC( 0x8004 ), - SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0xde39 ), SHC( 0x8489 ), SHC( 0xcd2a ), SHC( 0x8a87 ), SHC( 0xbd1f ), SHC( 0x92dd ), - SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0xa154 ), SHC( 0xa9db ), SHC( 0x9622 ), SHC( 0xb80e ), SHC( 0x8d0d ), SHC( 0xc7b0 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e18 ), SHC( 0xe9fe ), SHC( 0x786f ), SHC( 0xd4a4 ), SHC( 0x6f2f ), SHC( 0xc095 ), - SHC( 0x62a0 ), SHC( 0xae69 ), SHC( 0x5321 ), SHC( 0x9eab ), SHC( 0x4128 ), SHC( 0x91d3 ), SHC( 0x2d3f ), SHC( 0x8843 ), - SHC( 0x17fc ), SHC( 0x8244 ), SHC( 0x0203 ), SHC( 0x8004 ), SHC( 0xebfa ), SHC( 0x8193 ), SHC( 0xd68a ), SHC( 0x86e7 ), - SHC( 0xc256 ), SHC( 0x8fd5 ), SHC( 0xaff8 ), SHC( 0x9c1b ), SHC( 0x9ffc ), SHC( 0xab5a ), SHC( 0x92dd ), SHC( 0xbd1f ), - SHC( 0x88fd ), SHC( 0xd0e1 ), SHC( 0x82a9 ), SHC( 0xe60b ), SHC( 0x8010 ), SHC( 0xfbfb ), SHC( 0x8147 ), SHC( 0x1209 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7d57 ), SHC( 0xe60b ), SHC( 0x7579 ), SHC( 0xcd2a ), SHC( 0x68b9 ), SHC( 0xb666 ), - SHC( 0x579f ), SHC( 0xa2b1 ), SHC( 0x42e1 ), SHC( 0x92dd ), SHC( 0x2b5c ), SHC( 0x8791 ), SHC( 0x1209 ), SHC( 0x8147 ), - SHC( 0xf7f6 ), SHC( 0x8041 ), SHC( 0xde39 ), SHC( 0x8489 ), SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xaff8 ), SHC( 0x9c1b ), - SHC( 0x9d60 ), SHC( 0xae69 ), SHC( 0x8ee1 ), SHC( 0xc41b ), SHC( 0x8515 ), SHC( 0xdc4a ), SHC( 0x8065 ), SHC( 0xf5f5 ), - SHC( 0x8102 ), SHC( 0x100b ), SHC( 0x86e7 ), SHC( 0x2976 ), SHC( 0x91d3 ), SHC( 0x4128 ), SHC( 0xa154 ), SHC( 0x5625 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6155 ), SHC( 0xacdf ), - SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0xf5f5 ), SHC( 0x8065 ), - SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xbd1f ), SHC( 0x92dd ), SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x92dd ), SHC( 0xbd1f ), - SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8065 ), SHC( 0xf5f5 ), SHC( 0x8193 ), SHC( 0x1406 ), SHC( 0x89be ), SHC( 0x30fc ), - SHC( 0x9872 ), SHC( 0x4b3d ), SHC( 0xacdf ), SHC( 0x6155 ), SHC( 0xc5e4 ), SHC( 0x720d ), SHC( 0xe21e ), SHC( 0x7c77 ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7b77 ), SHC( 0xde39 ), SHC( 0x6e2d ), SHC( 0xbed8 ), SHC( 0x5914 ), SHC( 0xa414 ), - SHC( 0x3daa ), SHC( 0x8fd5 ), SHC( 0x1de2 ), SHC( 0x8389 ), SHC( 0xfbfb ), SHC( 0x8010 ), SHC( 0xda5d ), SHC( 0x85a9 ), - SHC( 0xbb6a ), SHC( 0x93ed ), SHC( 0xa154 ), SHC( 0xa9db ), SHC( 0x8df3 ), SHC( 0xc5e4 ), SHC( 0x82a9 ), SHC( 0xe60b ), - SHC( 0x8041 ), SHC( 0x080a ), SHC( 0x86e7 ), SHC( 0x2976 ), SHC( 0x9622 ), SHC( 0x47f2 ), SHC( 0xacdf ), SHC( 0x6155 ), - SHC( 0xc980 ), SHC( 0x73d1 ), SHC( 0xe9fe ), SHC( 0x7e18 ), SHC( 0x0c0c ), SHC( 0x7f6f ), SHC( 0x2d3f ), SHC( 0x77bd ), - SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7a57 ), SHC( 0xda5d ), SHC( 0x69de ), SHC( 0xb80e ), SHC( 0x5008 ), SHC( 0x9c1b ), - SHC( 0x2f1f ), SHC( 0x88fd ), SHC( 0x0a0b ), SHC( 0x8065 ), SHC( 0xe414 ), SHC( 0x8315 ), SHC( 0xc095 ), SHC( 0x90d1 ), - SHC( 0xa2b1 ), SHC( 0xa861 ), SHC( 0x8d0d ), SHC( 0xc7b0 ), SHC( 0x8193 ), SHC( 0xebfa ), SHC( 0x8147 ), SHC( 0x1209 ), - SHC( 0x8c2f ), SHC( 0x3680 ), SHC( 0xa154 ), SHC( 0x5625 ), SHC( 0xbed8 ), SHC( 0x6e2d ), SHC( 0xe21e ), SHC( 0x7c77 ), - SHC( 0x080a ), SHC( 0x7fbf ), SHC( 0x2d3f ), SHC( 0x77bd ), SHC( 0x4e74 ), SHC( 0x6524 ), SHC( 0x68b9 ), SHC( 0x499a ) -}; - -const Word16 FFT_W64[( 64 * 2 ) * 2] = { // Q15 - 16384, 0, 16364, -804, 16305, -1606, 16207, -2404, - 16069, -3196, 15893, -3981, 15679, -4756, 15426, -5520, - 15137, -6270, 14811, -7005, 14449, -7723, 14053, -8423, - 13623, -9102, 13160, -9760, 12665, -10394, 12140, -11003, - 11585, -11585, 11003, -12140, 10394, -12665, 9760, -13160, - 9102, -13623, 8423, -14053, 7723, -14449, 7005, -14811, - 6270, -15137, 5520, -15426, 4756, -15679, 3981, -15893, - 3196, -16069, 2404, -16207, 1606, -16305, 804, -16364, - 0, -16384, -804, -16364, -1606, -16305, -2404, -16207, - -3196, -16069, -3981, -15893, -4756, -15679, -5520, -15426, - -6270, -15137, -7005, -14811, -7723, -14449, -8423, -14053, - -9102, -13623, -9760, -13160, -10394, -12665, -11003, -12140, - -11585, -11585, -12140, -11003, -12665, -10394, -13160, -9760, - -13623, -9102, -14053, -8423, -14449, -7723, -14811, -7005, - -15137, -6270, -15426, -5520, -15679, -4756, -15893, -3981, - -16069, -3196, -16207, -2404, -16305, -1606, -16364, -804, - /* The following is a duplication of the above but scaled up by a factor of 2. - * This save one operation in inverse FFT inner loops */ - 32767, 0, 32729, -1608, 32610, -3212, 32413, -4808, - 32138, -6393, 31786, -7962, 31357, -9512, 30853, -11039, - 30274, -12540, 29622, -14010, 28899, -15447, 28106, -16846, - 27246, -18205, 26320, -19520, 25330, -20788, 24279, -22006, - 23170, -23170, 22006, -24279, 20788, -25330, 19520, -26320, - 18205, -27246, 16846, -28106, 15447, -28899, 14010, -29622, - 12540, -30274, 11039, -30853, 9512, -31357, 7962, -31786, - 6393, -32138, 4808, -32413, 3212, -32610, 1608, -32729, - 0, -32768, -1608, -32729, -3212, -32610, -4808, -32413, - -6393, -32138, -7962, -31786, -9512, -31357, -11039, -30853, - -12540, -30274, -14010, -29622, -15447, -28899, -16846, -28106, - -18205, -27246, -19520, -26320, -20788, -25330, -22006, -24279, - -23170, -23170, -24279, -22006, -25330, -20788, -26320, -19520, - -27246, -18205, -28106, -16846, -28899, -15447, -29622, -14010, - -30274, -12540, -30853, -11039, -31357, -9512, -31786, -7962, - -32138, -6393, -32413, -4808, -32610, -3212, -32729, -1608 -}; - -const Word16 FFT_W128[] = { // Q15 - /* part of table that is not scaled by 2 */ - 16384, 0, 16379, -402, 16364, -804, 16339, -1205, - 16305, -1606, 16260, -2006, 16206, -2404, 16142, -2801, - 16069, -3196, 15985, -3590, 15893, -3981, 15790, -4370, - 15678, -4756, 15557, -5139, 15426, -5519, 15286, -5896, - 15136, -6270, 14978, -6639, 14811, -7005, 14634, -7366, - 14449, -7723, 14255, -8075, 14053, -8423, 13842, -8765, - 13622, -9102, 13395, -9434, 13159, -9760, 12916, -10080, - 12665, -10394, 12406, -10701, 12139, -11002, 11866, -11297, - 11585, -11585, 11297, -11866, 11002, -12139, 10701, -12406, - 10394, -12665, 10080, -12916, 9760, -13159, 9434, -13395, - 9102, -13622, 8765, -13842, 8423, -14053, 8075, -14255, - 7723, -14449, 7366, -14634, 7005, -14811, 6639, -14978, - 6270, -15136, 5896, -15286, 5519, -15426, 5139, -15557, - 4756, -15678, 4370, -15790, 3981, -15893, 3590, -15985, - 3196, -16069, 2801, -16142, 2404, -16206, 2006, -16260, - 1606, -16305, 1205, -16339, 804, -16364, 402, -16379, - 0, -16384, -402, -16379, -804, -16364, -1205, -16339, - -1606, -16305, -2006, -16260, -2404, -16206, -2801, -16142, - -3196, -16069, -3590, -15985, -3981, -15893, -4370, -15790, - -4756, -15678, -5139, -15557, -5519, -15426, -5896, -15286, - -6270, -15136, -6639, -14978, -7005, -14811, -7366, -14634, - -7723, -14449, -8075, -14255, -8423, -14053, -8765, -13842, - -9102, -13622, -9434, -13395, -9760, -13159, -10080, -12916, - -10394, -12665, -10701, -12406, -11002, -12139, -11297, -11866, - -11585, -11585, -11866, -11297, -12139, -11002, -12406, -10701, - -12665, -10394, -12916, -10080, -13159, -9760, -13395, -9434, - -13622, -9102, -13842, -8765, -14053, -8423, -14255, -8075, - -14449, -7723, -14634, -7366, -14811, -7005, -14978, -6639, - -15136, -6270, -15286, -5896, -15426, -5519, -15557, -5139, - -15678, -4756, -15790, -4370, -15893, -3981, -15985, -3590, - -16069, -3196, -16142, -2801, -16206, -2404, -16260, -2006, - -16305, -1606, -16339, -1205, -16364, -804, -16379, -402, - /* part of table that is scaled by 2 (this save one operation in FFT inner loops) */ - 32767, 0, 32758, -804, 32728, -1608, 32678, -2410, - 32610, -3212, 32520, -4012, 32412, -4808, 32284, -5602, - 32138, -6392, 31970, -7180, 31786, -7962, 31580, -8740, - 31356, -9512, 31114, -10278, 30852, -11038, 30572, -11792, - 30272, -12540, 29956, -13278, 29622, -14010, 29268, -14732, - 28898, -15446, 28510, -16150, 28106, -16846, 27684, -17530, - 27244, -18204, 26790, -18868, 26318, -19520, 25832, -20160, - 25330, -20788, 24812, -21402, 24278, -22004, 23732, -22594, - 23170, -23170, 22594, -23732, 22004, -24278, 21402, -24812, - 20788, -25330, 20160, -25832, 19520, -26318, 18868, -26790, - 18204, -27244, 17530, -27684, 16846, -28106, 16150, -28510, - 15446, -28898, 14732, -29268, 14010, -29622, 13278, -29956, - 12540, -30272, 11792, -30572, 11038, -30852, 10278, -31114, - 9512, -31356, 8740, -31580, 7962, -31786, 7180, -31970, - 6392, -32138, 5602, -32284, 4808, -32412, 4012, -32520, - 3212, -32610, 2410, -32678, 1608, -32728, 804, -32758, - 0, -32768, -804, -32758, -1608, -32728, -2410, -32678, - -3212, -32610, -4012, -32520, -4808, -32412, -5602, -32284, - -6392, -32138, -7180, -31970, -7962, -31786, -8740, -31580, - -9512, -31356, -10278, -31114, -11038, -30852, -11792, -30572, - -12540, -30272, -13278, -29956, -14010, -29622, -14732, -29268, - -15446, -28898, -16150, -28510, -16846, -28106, -17530, -27684, - -18204, -27244, -18868, -26790, -19520, -26318, -20160, -25832, - -20788, -25330, -21402, -24812, -22004, -24278, -22594, -23732, - -23170, -23170, -23732, -22594, -24278, -22004, -24812, -21402, - -25330, -20788, -25832, -20160, -26318, -19520, -26790, -18868, - -27244, -18204, -27684, -17530, -28106, -16846, -28510, -16150, - -28898, -15446, -29268, -14732, -29622, -14010, -29956, -13278, - -30272, -12540, -30572, -11792, -30852, -11038, -31114, -10278, - -31356, -9512, -31580, -8740, -31786, -7962, -31970, -7180, - -32138, -6392, -32284, -5602, -32412, -4808, -32520, -4012, - -32610, -3212, -32678, -2410, -32728, -1608, -32758, -804 -}; - -const Word16 FFT_W256[( 256 * 2 ) * 2] = { // Q15 - /* Each adjacent pair represents the real and imaginary part of a complex number: */ - /* W = exp{-j*(PI*n/256)} = cos(PI*n/256)*16384 -j*sin(PI*n/256)*16384 for n=0, 1, ..., 255. */ - 16384, 0, 16383, -201, 16379, -402, 16373, -603, - 16364, -804, 16353, -1005, 16340, -1205, 16324, -1406, - 16305, -1606, 16284, -1806, 16261, -2006, 16235, -2205, - 16207, -2404, 16176, -2603, 16143, -2801, 16107, -2999, - 16069, -3196, 16029, -3393, 15986, -3590, 15941, -3786, - 15893, -3981, 15843, -4176, 15791, -4370, 15736, -4563, - 15679, -4756, 15619, -4948, 15557, -5139, 15493, -5330, - 15426, -5520, 15357, -5708, 15286, -5897, 15213, -6084, - 15137, -6270, 15059, -6455, 14978, -6639, 14896, -6823, - 14811, -7005, 14724, -7186, 14635, -7366, 14543, -7545, - 14449, -7723, 14354, -7900, 14256, -8076, 14155, -8250, - 14053, -8423, 13949, -8595, 13842, -8765, 13733, -8935, - 13623, -9102, 13510, -9269, 13395, -9434, 13279, -9598, - 13160, -9760, 13039, -9921, 12916, -10080, 12792, -10238, - 12665, -10394, 12537, -10549, 12406, -10702, 12274, -10853, - 12140, -11003, 12004, -11151, 11866, -11297, 11727, -11442, - 11585, -11585, 11442, -11727, 11297, -11866, 11151, -12004, - 11003, -12140, 10853, -12274, 10702, -12406, 10549, -12537, - 10394, -12665, 10238, -12792, 10080, -12916, 9921, -13039, - 9760, -13160, 9598, -13279, 9434, -13395, 9269, -13510, - 9102, -13623, 8935, -13733, 8765, -13842, 8595, -13949, - 8423, -14053, 8250, -14155, 8076, -14256, 7900, -14354, - 7723, -14449, 7545, -14543, 7366, -14635, 7186, -14724, - 7005, -14811, 6823, -14896, 6639, -14978, 6455, -15059, - 6270, -15137, 6084, -15213, 5897, -15286, 5708, -15357, - 5520, -15426, 5330, -15493, 5139, -15557, 4948, -15619, - 4756, -15679, 4563, -15736, 4370, -15791, 4176, -15843, - 3981, -15893, 3786, -15941, 3590, -15986, 3393, -16029, - 3196, -16069, 2999, -16107, 2801, -16143, 2603, -16176, - 2404, -16207, 2205, -16235, 2006, -16261, 1806, -16284, - 1606, -16305, 1406, -16324, 1205, -16340, 1005, -16353, - 804, -16364, 603, -16373, 402, -16379, 201, -16383, - 0, -16384, -201, -16383, -402, -16379, -603, -16373, - -804, -16364, -1005, -16353, -1205, -16340, -1406, -16324, - -1606, -16305, -1806, -16284, -2006, -16261, -2205, -16235, - -2404, -16207, -2603, -16176, -2801, -16143, -2999, -16107, - -3196, -16069, -3393, -16029, -3590, -15986, -3786, -15941, - -3981, -15893, -4176, -15843, -4370, -15791, -4563, -15736, - -4756, -15679, -4948, -15619, -5139, -15557, -5330, -15493, - -5520, -15426, -5708, -15357, -5897, -15286, -6084, -15213, - -6270, -15137, -6455, -15059, -6639, -14978, -6823, -14896, - -7005, -14811, -7186, -14724, -7366, -14635, -7545, -14543, - -7723, -14449, -7900, -14354, -8076, -14256, -8250, -14155, - -8423, -14053, -8595, -13949, -8765, -13842, -8935, -13733, - -9102, -13623, -9269, -13510, -9434, -13395, -9598, -13279, - -9760, -13160, -9921, -13039, -10080, -12916, -10238, -12792, - -10394, -12665, -10549, -12537, -10702, -12406, -10853, -12274, - -11003, -12140, -11151, -12004, -11297, -11866, -11442, -11727, - -11585, -11585, -11727, -11442, -11866, -11297, -12004, -11151, - -12140, -11003, -12274, -10853, -12406, -10702, -12537, -10549, - -12665, -10394, -12792, -10238, -12916, -10080, -13039, -9921, - -13160, -9760, -13279, -9598, -13395, -9434, -13510, -9269, - -13623, -9102, -13733, -8935, -13842, -8765, -13949, -8595, - -14053, -8423, -14155, -8250, -14256, -8076, -14354, -7900, - -14449, -7723, -14543, -7545, -14635, -7366, -14724, -7186, - -14811, -7005, -14896, -6823, -14978, -6639, -15059, -6455, - -15137, -6270, -15213, -6084, -15286, -5897, -15357, -5708, - -15426, -5520, -15493, -5330, -15557, -5139, -15619, -4948, - -15679, -4756, -15736, -4563, -15791, -4370, -15843, -4176, - -15893, -3981, -15941, -3786, -15986, -3590, -16029, -3393, - -16069, -3196, -16107, -2999, -16143, -2801, -16176, -2603, - -16207, -2404, -16235, -2205, -16261, -2006, -16284, -1806, - -16305, -1606, -16324, -1406, -16340, -1205, -16353, -1005, - -16364, -804, -16373, -603, -16379, -402, -16383, -201, - - /* The following is a duplication of the above but scaled up by a factor of 2. - * This save one operation in inverse FFT inner loops */ - 32767, 0, 32766, -402, 32758, -804, 32746, -1206, - 32729, -1608, 32706, -2009, 32679, -2411, 32647, -2811, - 32610, -3212, 32568, -3612, 32522, -4011, 32470, -4410, - 32413, -4808, 32352, -5205, 32286, -5602, 32214, -5998, - 32138, -6393, 32058, -6787, 31972, -7180, 31881, -7571, - 31786, -7962, 31686, -8351, 31581, -8740, 31471, -9127, - 31357, -9512, 31238, -9896, 31114, -10279, 30986, -10660, - 30853, -11039, 30715, -11417, 30572, -11793, 30425, -12167, - 30274, -12540, 30118, -12910, 29957, -13279, 29792, -13646, - 29622, -14010, 29448, -14373, 29269, -14733, 29086, -15091, - 28899, -15447, 28707, -15800, 28511, -16151, 28311, -16500, - 28106, -16846, 27897, -17190, 27684, -17531, 27467, -17869, - 27246, -18205, 27020, -18538, 26791, -18868, 26557, -19195, - 26320, -19520, 26078, -19841, 25833, -20160, 25583, -20475, - 25330, -20788, 25073, -21097, 24812, -21403, 24548, -21706, - 24279, -22006, 24008, -22302, 23732, -22595, 23453, -22884, - 23170, -23170, 22884, -23453, 22595, -23732, 22302, -24008, - 22006, -24279, 21706, -24548, 21403, -24812, 21097, -25073, - 20788, -25330, 20475, -25583, 20160, -25833, 19841, -26078, - 19520, -26320, 19195, -26557, 18868, -26791, 18538, -27020, - 18205, -27246, 17869, -27467, 17531, -27684, 17190, -27897, - 16846, -28106, 16500, -28311, 16151, -28511, 15800, -28707, - 15447, -28899, 15091, -29086, 14733, -29269, 14373, -29448, - 14010, -29622, 13646, -29792, 13279, -29957, 12910, -30118, - 12540, -30274, 12167, -30425, 11793, -30572, 11417, -30715, - 11039, -30853, 10660, -30986, 10279, -31114, 9896, -31238, - 9512, -31357, 9127, -31471, 8740, -31581, 8351, -31686, - 7962, -31786, 7571, -31881, 7180, -31972, 6787, -32058, - 6393, -32138, 5998, -32214, 5602, -32286, 5205, -32352, - 4808, -32413, 4410, -32470, 4011, -32522, 3612, -32568, - 3212, -32610, 2811, -32647, 2411, -32679, 2009, -32706, - 1608, -32729, 1206, -32746, 804, -32758, 402, -32766, - 0, -32768, -402, -32766, -804, -32758, -1206, -32746, - -1608, -32729, -2009, -32706, -2411, -32679, -2811, -32647, - -3212, -32610, -3612, -32568, -4011, -32522, -4410, -32470, - -4808, -32413, -5205, -32352, -5602, -32286, -5998, -32214, - -6393, -32138, -6787, -32058, -7180, -31972, -7571, -31881, - -7962, -31786, -8351, -31686, -8740, -31581, -9127, -31471, - -9512, -31357, -9896, -31238, -10279, -31114, -10660, -30986, - -11039, -30853, -11417, -30715, -11793, -30572, -12167, -30425, - -12540, -30274, -12910, -30118, -13279, -29957, -13646, -29792, - -14010, -29622, -14373, -29448, -14733, -29269, -15091, -29086, - -15447, -28899, -15800, -28707, -16151, -28511, -16500, -28311, - -16846, -28106, -17190, -27897, -17531, -27684, -17869, -27467, - -18205, -27246, -18538, -27020, -18868, -26791, -19195, -26557, - -19520, -26320, -19841, -26078, -20160, -25833, -20475, -25583, - -20788, -25330, -21097, -25073, -21403, -24812, -21706, -24548, - -22006, -24279, -22302, -24008, -22595, -23732, -22884, -23453, - -23170, -23170, -23453, -22884, -23732, -22595, -24008, -22302, - -24279, -22006, -24548, -21706, -24812, -21403, -25073, -21097, - -25330, -20788, -25583, -20475, -25833, -20160, -26078, -19841, - -26320, -19520, -26557, -19195, -26791, -18868, -27020, -18538, - -27246, -18205, -27467, -17869, -27684, -17531, -27897, -17190, - -28106, -16846, -28311, -16500, -28511, -16151, -28707, -15800, - -28899, -15447, -29086, -15091, -29269, -14733, -29448, -14373, - -29622, -14010, -29792, -13646, -29957, -13279, -30118, -12910, - -30274, -12540, -30425, -12167, -30572, -11793, -30715, -11417, - -30853, -11039, -30986, -10660, -31114, -10279, -31238, -9896, - -31357, -9512, -31471, -9127, -31581, -8740, -31686, -8351, - -31786, -7962, -31881, -7571, -31972, -7180, -32058, -6787, - -32138, -6393, -32214, -5998, -32286, -5602, -32352, -5205, - -32413, -4808, -32470, -4410, -32522, -4011, -32568, -3612, - -32610, -3212, -32647, -2811, -32679, -2411, -32706, -2009, - -32729, -1608, -32746, -1206, -32758, -804, -32766, -402 -}; - -const Word16 FFT_W512[( 512 * 2 ) * 2] = { // Q15 - 16384, 0, 16384, -101, 16383, -201, 16381, -302, - 16379, -402, 16376, -503, 16373, -603, 16369, -704, - 16364, -804, 16359, -904, 16353, -1005, 16347, -1105, - 16340, -1205, 16332, -1306, 16324, -1406, 16315, -1506, - 16305, -1606, 16295, -1706, 16284, -1806, 16273, -1906, - 16261, -2006, 16248, -2105, 16235, -2205, 16221, -2305, - 16207, -2404, 16192, -2503, 16176, -2603, 16160, -2702, - 16143, -2801, 16125, -2900, 16107, -2999, 16088, -3098, - 16069, -3196, 16049, -3295, 16029, -3393, 16008, -3492, - 15986, -3590, 15964, -3688, 15941, -3786, 15917, -3883, - 15893, -3981, 15868, -4078, 15843, -4176, 15817, -4273, - 15791, -4370, 15763, -4467, 15736, -4563, 15707, -4660, - 15679, -4756, 15649, -4852, 15619, -4948, 15588, -5044, - 15557, -5139, 15525, -5235, 15493, -5330, 15460, -5425, - 15426, -5520, 15392, -5614, 15357, -5708, 15322, -5803, - 15286, -5897, 15250, -5990, 15213, -6084, 15175, -6177, - 15137, -6270, 15098, -6363, 15059, -6455, 15019, -6547, - 14978, -6639, 14937, -6731, 14896, -6823, 14854, -6914, - 14811, -7005, 14768, -7096, 14724, -7186, 14680, -7276, - 14635, -7366, 14589, -7456, 14543, -7545, 14497, -7635, - 14449, -7723, 14402, -7812, 14354, -7900, 14305, -7988, - 14256, -8076, 14206, -8163, 14155, -8250, 14104, -8337, - 14053, -8423, 14001, -8509, 13949, -8595, 13896, -8680, - 13842, -8765, 13788, -8850, 13733, -8935, 13678, -9019, - 13623, -9102, 13567, -9186, 13510, -9269, 13453, -9352, - 13395, -9434, 13337, -9516, 13279, -9598, 13219, -9679, - 13160, -9760, 13100, -9841, 13039, -9921, 12978, -10001, - 12916, -10080, 12854, -10159, 12792, -10238, 12729, -10316, - 12665, -10394, 12601, -10471, 12537, -10549, 12472, -10625, - 12406, -10702, 12340, -10778, 12274, -10853, 12207, -10928, - 12140, -11003, 12072, -11077, 12004, -11151, 11935, -11224, - 11866, -11297, 11797, -11370, 11727, -11442, 11656, -11514, - 11585, -11585, 11514, -11656, 11442, -11727, 11370, -11797, - 11297, -11866, 11224, -11935, 11151, -12004, 11077, -12072, - 11003, -12140, 10928, -12207, 10853, -12274, 10778, -12340, - 10702, -12406, 10625, -12472, 10549, -12537, 10471, -12601, - 10394, -12665, 10316, -12729, 10238, -12792, 10159, -12854, - 10080, -12916, 10001, -12978, 9921, -13039, 9841, -13100, - 9760, -13160, 9679, -13219, 9598, -13279, 9516, -13337, - 9434, -13395, 9352, -13453, 9269, -13510, 9186, -13567, - 9102, -13623, 9019, -13678, 8935, -13733, 8850, -13788, - 8765, -13842, 8680, -13896, 8595, -13949, 8509, -14001, - 8423, -14053, 8337, -14104, 8250, -14155, 8163, -14206, - 8076, -14256, 7988, -14305, 7900, -14354, 7812, -14402, - 7723, -14449, 7635, -14497, 7545, -14543, 7456, -14589, - 7366, -14635, 7276, -14680, 7186, -14724, 7096, -14768, - 7005, -14811, 6914, -14854, 6823, -14896, 6731, -14937, - 6639, -14978, 6547, -15019, 6455, -15059, 6363, -15098, - 6270, -15137, 6177, -15175, 6084, -15213, 5990, -15250, - 5897, -15286, 5803, -15322, 5708, -15357, 5614, -15392, - 5520, -15426, 5425, -15460, 5330, -15493, 5235, -15525, - 5139, -15557, 5044, -15588, 4948, -15619, 4852, -15649, - 4756, -15679, 4660, -15707, 4563, -15736, 4467, -15763, - 4370, -15791, 4273, -15817, 4176, -15843, 4078, -15868, - 3981, -15893, 3883, -15917, 3786, -15941, 3688, -15964, - 3590, -15986, 3492, -16008, 3393, -16029, 3295, -16049, - 3196, -16069, 3098, -16088, 2999, -16107, 2900, -16125, - 2801, -16143, 2702, -16160, 2603, -16176, 2503, -16192, - 2404, -16207, 2305, -16221, 2205, -16235, 2105, -16248, - 2006, -16261, 1906, -16273, 1806, -16284, 1706, -16295, - 1606, -16305, 1506, -16315, 1406, -16324, 1306, -16332, - 1205, -16340, 1105, -16347, 1005, -16353, 904, -16359, - 804, -16364, 703, -16369, 603, -16373, 503, -16376, - 402, -16379, 302, -16381, 201, -16383, 101, -16384, - 0, -16384, -101, -16384, -201, -16383, -302, -16381, - -402, -16379, -503, -16376, -603, -16373, -704, -16369, - -804, -16364, -904, -16359, -1005, -16353, -1105, -16347, - -1205, -16340, -1306, -16332, -1406, -16324, -1506, -16315, - -1606, -16305, -1706, -16295, -1806, -16284, -1906, -16273, - -2006, -16261, -2105, -16248, -2205, -16235, -2305, -16221, - -2404, -16207, -2503, -16192, -2603, -16176, -2702, -16160, - -2801, -16143, -2900, -16125, -2999, -16107, -3098, -16088, - -3196, -16069, -3295, -16049, -3393, -16029, -3492, -16008, - -3590, -15986, -3688, -15964, -3786, -15941, -3883, -15917, - -3981, -15893, -4078, -15868, -4176, -15843, -4273, -15817, - -4370, -15791, -4467, -15763, -4563, -15736, -4660, -15707, - -4756, -15679, -4852, -15649, -4948, -15619, -5044, -15588, - -5139, -15557, -5235, -15525, -5330, -15493, -5425, -15460, - -5520, -15426, -5614, -15392, -5708, -15357, -5803, -15322, - -5897, -15286, -5990, -15250, -6084, -15213, -6177, -15175, - -6270, -15137, -6363, -15098, -6455, -15059, -6547, -15019, - -6639, -14978, -6731, -14937, -6823, -14896, -6914, -14854, - -7005, -14811, -7096, -14768, -7186, -14724, -7276, -14680, - -7366, -14635, -7456, -14589, -7545, -14543, -7635, -14497, - -7723, -14449, -7812, -14402, -7900, -14354, -7988, -14305, - -8076, -14256, -8163, -14206, -8250, -14155, -8337, -14104, - -8423, -14053, -8509, -14001, -8595, -13949, -8680, -13896, - -8765, -13842, -8850, -13788, -8935, -13733, -9019, -13678, - -9102, -13623, -9186, -13567, -9269, -13510, -9352, -13453, - -9434, -13395, -9516, -13337, -9598, -13279, -9679, -13219, - -9760, -13160, -9841, -13100, -9921, -13039, -10001, -12978, - -10080, -12916, -10159, -12854, -10238, -12792, -10316, -12729, - -10394, -12665, -10471, -12601, -10549, -12537, -10625, -12472, - -10702, -12406, -10778, -12340, -10853, -12274, -10928, -12207, - -11003, -12140, -11077, -12072, -11151, -12004, -11224, -11935, - -11297, -11866, -11370, -11797, -11442, -11727, -11514, -11656, - -11585, -11585, -11656, -11514, -11727, -11442, -11797, -11370, - -11866, -11297, -11935, -11224, -12004, -11151, -12072, -11077, - -12140, -11003, -12207, -10928, -12274, -10853, -12340, -10778, - -12406, -10702, -12472, -10625, -12537, -10549, -12601, -10471, - -12665, -10394, -12729, -10316, -12792, -10238, -12854, -10159, - -12916, -10080, -12978, -10001, -13039, -9921, -13100, -9840, - -13160, -9760, -13219, -9679, -13279, -9598, -13337, -9516, - -13395, -9434, -13453, -9352, -13510, -9269, -13567, -9186, - -13623, -9102, -13678, -9019, -13733, -8935, -13788, -8850, - -13842, -8765, -13896, -8680, -13949, -8595, -14001, -8509, - -14053, -8423, -14104, -8337, -14155, -8250, -14206, -8163, - -14256, -8076, -14305, -7988, -14354, -7900, -14402, -7812, - -14449, -7723, -14497, -7635, -14543, -7545, -14589, -7456, - -14635, -7366, -14680, -7276, -14724, -7186, -14768, -7096, - -14811, -7005, -14854, -6914, -14896, -6823, -14937, -6731, - -14978, -6639, -15019, -6547, -15059, -6455, -15098, -6363, - -15137, -6270, -15175, -6177, -15213, -6084, -15250, -5990, - -15286, -5897, -15322, -5803, -15357, -5708, -15392, -5614, - -15426, -5520, -15460, -5425, -15493, -5330, -15525, -5235, - -15557, -5139, -15588, -5044, -15619, -4948, -15649, -4852, - -15679, -4756, -15707, -4660, -15736, -4563, -15763, -4467, - -15791, -4370, -15817, -4273, -15843, -4176, -15868, -4078, - -15893, -3981, -15917, -3883, -15941, -3786, -15964, -3688, - -15986, -3590, -16008, -3492, -16029, -3393, -16049, -3295, - -16069, -3196, -16088, -3098, -16107, -2999, -16125, -2900, - -16143, -2801, -16160, -2702, -16176, -2603, -16192, -2503, - -16207, -2404, -16221, -2305, -16235, -2205, -16248, -2105, - -16261, -2006, -16273, -1906, -16284, -1806, -16295, -1706, - -16305, -1606, -16315, -1506, -16324, -1406, -16332, -1306, - -16340, -1205, -16347, -1105, -16353, -1005, -16359, -904, - -16364, -804, -16369, -703, -16373, -603, -16376, -503, - -16379, -402, -16381, -302, -16383, -201, -16384, -101, - /* The following is a duplication of the above but scaled up by a factor of 2. - * This save one operation in inverse FFT inner loops */ - 32767, 0, 32767, -201, 32766, -402, 32762, -603, - 32758, -804, 32753, -1005, 32746, -1206, 32738, -1407, - 32729, -1608, 32718, -1809, 32706, -2009, 32693, -2210, - 32679, -2411, 32664, -2611, 32647, -2811, 32629, -3012, - 32610, -3212, 32590, -3412, 32568, -3612, 32546, -3812, - 32522, -4011, 32496, -4211, 32470, -4410, 32442, -4609, - 32413, -4808, 32383, -5007, 32352, -5205, 32319, -5404, - 32286, -5602, 32251, -5800, 32214, -5998, 32177, -6195, - 32138, -6393, 32099, -6590, 32058, -6787, 32015, -6983, - 31972, -7180, 31927, -7376, 31881, -7571, 31834, -7767, - 31786, -7962, 31737, -8157, 31686, -8351, 31634, -8546, - 31581, -8740, 31527, -8933, 31471, -9127, 31415, -9319, - 31357, -9512, 31298, -9704, 31238, -9896, 31177, -10088, - 31114, -10279, 31050, -10469, 30986, -10660, 30920, -10850, - 30853, -11039, 30784, -11228, 30715, -11417, 30644, -11605, - 30572, -11793, 30499, -11980, 30425, -12167, 30350, -12354, - 30274, -12540, 30196, -12725, 30118, -12910, 30038, -13095, - 29957, -13279, 29875, -13463, 29792, -13646, 29707, -13828, - 29622, -14010, 29535, -14192, 29448, -14373, 29359, -14553, - 29269, -14733, 29178, -14912, 29086, -15091, 28993, -15269, - 28899, -15447, 28803, -15624, 28707, -15800, 28610, -15976, - 28511, -16151, 28411, -16326, 28311, -16500, 28209, -16673, - 28106, -16846, 28002, -17018, 27897, -17190, 27791, -17361, - 27684, -17531, 27576, -17700, 27467, -17869, 27357, -18037, - 27246, -18205, 27133, -18372, 27020, -18538, 26906, -18703, - 26791, -18868, 26674, -19032, 26557, -19195, 26439, -19358, - 26320, -19520, 26199, -19681, 26078, -19841, 25956, -20001, - 25833, -20160, 25708, -20318, 25583, -20475, 25457, -20632, - 25330, -20788, 25202, -20943, 25073, -21097, 24943, -21251, - 24812, -21403, 24680, -21555, 24548, -21706, 24414, -21856, - 24279, -22006, 24144, -22154, 24008, -22302, 23870, -22449, - 23732, -22595, 23593, -22740, 23453, -22884, 23312, -23028, - 23170, -23170, 23028, -23312, 22884, -23453, 22740, -23593, - 22595, -23732, 22449, -23870, 22302, -24008, 22154, -24144, - 22006, -24279, 21856, -24414, 21706, -24548, 21555, -24680, - 21403, -24812, 21251, -24943, 21097, -25073, 20943, -25202, - 20788, -25330, 20632, -25457, 20475, -25583, 20318, -25708, - 20160, -25833, 20001, -25956, 19841, -26078, 19681, -26199, - 19520, -26320, 19358, -26439, 19195, -26557, 19032, -26674, - 18868, -26791, 18703, -26906, 18538, -27020, 18372, -27133, - 18205, -27246, 18037, -27357, 17869, -27467, 17700, -27576, - 17531, -27684, 17361, -27791, 17190, -27897, 17018, -28002, - 16846, -28106, 16673, -28209, 16500, -28311, 16326, -28411, - 16151, -28511, 15976, -28610, 15800, -28707, 15624, -28803, - 15447, -28899, 15269, -28993, 15091, -29086, 14912, -29178, - 14733, -29269, 14553, -29359, 14373, -29448, 14192, -29535, - 14010, -29622, 13828, -29707, 13646, -29792, 13463, -29875, - 13279, -29957, 13095, -30038, 12910, -30118, 12725, -30196, - 12540, -30274, 12354, -30350, 12167, -30425, 11980, -30499, - 11793, -30572, 11605, -30644, 11417, -30715, 11228, -30784, - 11039, -30853, 10850, -30920, 10660, -30986, 10469, -31050, - 10279, -31114, 10088, -31177, 9896, -31238, 9704, -31298, - 9512, -31357, 9319, -31415, 9127, -31471, 8933, -31527, - 8740, -31581, 8546, -31634, 8351, -31686, 8157, -31737, - 7962, -31786, 7767, -31834, 7571, -31881, 7376, -31927, - 7180, -31972, 6983, -32015, 6787, -32058, 6590, -32099, - 6393, -32138, 6195, -32177, 5998, -32214, 5800, -32251, - 5602, -32286, 5404, -32319, 5205, -32352, 5007, -32383, - 4808, -32413, 4609, -32442, 4410, -32470, 4211, -32496, - 4011, -32522, 3812, -32546, 3612, -32568, 3412, -32590, - 3212, -32610, 3012, -32629, 2811, -32647, 2611, -32664, - 2411, -32679, 2210, -32693, 2009, -32706, 1809, -32718, - 1608, -32729, 1407, -32738, 1206, -32746, 1005, -32753, - 804, -32758, 603, -32762, 402, -32766, 201, -32767, - 0, -32768, -201, -32767, -402, -32766, -603, -32762, - -804, -32758, -1005, -32753, -1206, -32746, -1407, -32738, - -1608, -32729, -1809, -32718, -2009, -32706, -2210, -32693, - -2411, -32679, -2611, -32664, -2811, -32647, -3012, -32629, - -3212, -32610, -3412, -32590, -3612, -32568, -3812, -32546, - -4011, -32522, -4211, -32496, -4410, -32470, -4609, -32442, - -4808, -32413, -5007, -32383, -5205, -32352, -5404, -32319, - -5602, -32286, -5800, -32251, -5998, -32214, -6195, -32177, - -6393, -32138, -6590, -32099, -6787, -32058, -6983, -32015, - -7180, -31972, -7376, -31927, -7571, -31881, -7767, -31834, - -7962, -31786, -8157, -31737, -8351, -31686, -8546, -31634, - -8740, -31581, -8933, -31527, -9127, -31471, -9319, -31415, - -9512, -31357, -9704, -31298, -9896, -31238, -10088, -31177, - -10279, -31114, -10469, -31050, -10660, -30986, -10850, -30920, - -11039, -30853, -11228, -30784, -11417, -30715, -11605, -30644, - -11793, -30572, -11980, -30499, -12167, -30425, -12354, -30350, - -12540, -30274, -12725, -30196, -12910, -30118, -13095, -30038, - -13279, -29957, -13463, -29875, -13646, -29792, -13828, -29707, - -14010, -29622, -14192, -29535, -14373, -29448, -14553, -29359, - -14733, -29269, -14912, -29178, -15091, -29086, -15269, -28993, - -15447, -28899, -15624, -28803, -15800, -28707, -15976, -28610, - -16151, -28511, -16326, -28411, -16500, -28311, -16673, -28209, - -16846, -28106, -17018, -28002, -17190, -27897, -17361, -27791, - -17531, -27684, -17700, -27576, -17869, -27467, -18037, -27357, - -18205, -27246, -18372, -27133, -18538, -27020, -18703, -26906, - -18868, -26791, -19032, -26674, -19195, -26557, -19358, -26439, - -19520, -26320, -19681, -26199, -19841, -26078, -20001, -25956, - -20160, -25833, -20318, -25708, -20475, -25583, -20632, -25457, - -20788, -25330, -20943, -25202, -21097, -25073, -21251, -24943, - -21403, -24812, -21555, -24680, -21706, -24548, -21856, -24414, - -22006, -24279, -22154, -24144, -22302, -24008, -22449, -23870, - -22595, -23732, -22740, -23593, -22884, -23453, -23028, -23312, - -23170, -23170, -23312, -23028, -23453, -22884, -23593, -22740, - -23732, -22595, -23870, -22449, -24008, -22302, -24144, -22154, - -24279, -22006, -24414, -21856, -24548, -21706, -24680, -21555, - -24812, -21403, -24943, -21251, -25073, -21097, -25202, -20943, - -25330, -20788, -25457, -20632, -25583, -20475, -25708, -20318, - -25833, -20160, -25956, -20001, -26078, -19841, -26199, -19681, - -26320, -19520, -26439, -19358, -26557, -19195, -26674, -19032, - -26791, -18868, -26906, -18703, -27020, -18538, -27133, -18372, - -27246, -18205, -27357, -18037, -27467, -17869, -27576, -17700, - -27684, -17531, -27791, -17361, -27897, -17190, -28002, -17018, - -28106, -16846, -28209, -16673, -28311, -16500, -28411, -16326, - -28511, -16151, -28610, -15976, -28707, -15800, -28803, -15624, - -28899, -15447, -28993, -15269, -29086, -15091, -29178, -14912, - -29269, -14733, -29359, -14553, -29448, -14373, -29535, -14192, - -29622, -14010, -29707, -13828, -29792, -13646, -29875, -13463, - -29957, -13279, -30038, -13095, -30118, -12910, -30196, -12725, - -30274, -12540, -30350, -12354, -30425, -12167, -30499, -11980, - -30572, -11793, -30644, -11605, -30715, -11417, -30784, -11228, - -30853, -11039, -30920, -10850, -30986, -10660, -31050, -10469, - -31114, -10279, -31177, -10088, -31238, -9896, -31298, -9704, - -31357, -9512, -31415, -9319, -31471, -9127, -31527, -8933, - -31581, -8740, -31634, -8546, -31686, -8351, -31737, -8157, - -31786, -7962, -31834, -7767, -31881, -7571, -31927, -7376, - -31972, -7180, -32015, -6983, -32058, -6787, -32099, -6590, - -32138, -6393, -32177, -6195, -32214, -5998, -32251, -5800, - -32286, -5602, -32319, -5404, -32352, -5205, -32383, -5007, - -32413, -4808, -32442, -4609, -32470, -4410, -32496, -4211, - -32522, -4011, -32546, -3812, -32568, -3612, -32590, -3412, - -32610, -3212, -32629, -3012, -32647, -2811, -32664, -2611, - -32679, -2411, -32693, -2210, -32706, -2009, -32718, -1809, - -32729, -1608, -32738, -1407, -32746, -1206, -32753, -1005, - -32758, -804, -32762, -603, -32766, -402, -32767, -201 -}; - -const Word16 FFT_REORDER_1024[512] = { - 0, 512, 256, 768, 128, 640, 384, 896, - 64, 576, 320, 832, 192, 704, 448, 960, - 32, 544, 288, 800, 160, 672, 416, 928, - 96, 608, 352, 864, 224, 736, 480, 992, - 16, 528, 272, 784, 144, 656, 400, 912, - 80, 592, 336, 848, 208, 720, 464, 976, - 48, 560, 304, 816, 176, 688, 432, 944, - 112, 624, 368, 880, 240, 752, 496, 1008, - 8, 520, 264, 776, 136, 648, 392, 904, - 72, 584, 328, 840, 200, 712, 456, 968, - 40, 552, 296, 808, 168, 680, 424, 936, - 104, 616, 360, 872, 232, 744, 488, 1000, - 24, 536, 280, 792, 152, 664, 408, 920, - 88, 600, 344, 856, 216, 728, 472, 984, - 56, 568, 312, 824, 184, 696, 440, 952, - 120, 632, 376, 888, 248, 760, 504, 1016, - 4, 516, 260, 772, 132, 644, 388, 900, - 68, 580, 324, 836, 196, 708, 452, 964, - 36, 548, 292, 804, 164, 676, 420, 932, - 100, 612, 356, 868, 228, 740, 484, 996, - 20, 532, 276, 788, 148, 660, 404, 916, - 84, 596, 340, 852, 212, 724, 468, 980, - 52, 564, 308, 820, 180, 692, 436, 948, - 116, 628, 372, 884, 244, 756, 500, 1012, - 12, 524, 268, 780, 140, 652, 396, 908, - 76, 588, 332, 844, 204, 716, 460, 972, - 44, 556, 300, 812, 172, 684, 428, 940, - 108, 620, 364, 876, 236, 748, 492, 1004, - 28, 540, 284, 796, 156, 668, 412, 924, - 92, 604, 348, 860, 220, 732, 476, 988, - 60, 572, 316, 828, 188, 700, 444, 956, - 124, 636, 380, 892, 252, 764, 508, 1020, - 2, 514, 258, 770, 130, 642, 386, 898, - 66, 578, 322, 834, 194, 706, 450, 962, - 34, 546, 290, 802, 162, 674, 418, 930, - 98, 610, 354, 866, 226, 738, 482, 994, - 18, 530, 274, 786, 146, 658, 402, 914, - 82, 594, 338, 850, 210, 722, 466, 978, - 50, 562, 306, 818, 178, 690, 434, 946, - 114, 626, 370, 882, 242, 754, 498, 1010, - 10, 522, 266, 778, 138, 650, 394, 906, - 74, 586, 330, 842, 202, 714, 458, 970, - 42, 554, 298, 810, 170, 682, 426, 938, - 106, 618, 362, 874, 234, 746, 490, 1002, - 26, 538, 282, 794, 154, 666, 410, 922, - 90, 602, 346, 858, 218, 730, 474, 986, - 58, 570, 314, 826, 186, 698, 442, 954, - 122, 634, 378, 890, 250, 762, 506, 1018, - 6, 518, 262, 774, 134, 646, 390, 902, - 70, 582, 326, 838, 198, 710, 454, 966, - 38, 550, 294, 806, 166, 678, 422, 934, - 102, 614, 358, 870, 230, 742, 486, 998, - 22, 534, 278, 790, 150, 662, 406, 918, - 86, 598, 342, 854, 214, 726, 470, 982, - 54, 566, 310, 822, 182, 694, 438, 950, - 118, 630, 374, 886, 246, 758, 502, 1014, - 14, 526, 270, 782, 142, 654, 398, 910, - 78, 590, 334, 846, 206, 718, 462, 974, - 46, 558, 302, 814, 174, 686, 430, 942, - 110, 622, 366, 878, 238, 750, 494, 1006, - 30, 542, 286, 798, 158, 670, 414, 926, - 94, 606, 350, 862, 222, 734, 478, 990, - 62, 574, 318, 830, 190, 702, 446, 958, - 126, 638, 382, 894, 254, 766, 510, 1022 -}; - -const Word16 Gamma_19661_Tbl_fx[] = { - 19661, 11797, 7078, 4247, 2548, 1529, 917, 550, 330, 198, 119, 71, 43, 26, 16, 10 -}; /*Q15 */ - -const Word16 Gamma_29491_Tbl[] = { - 29491, 26542, 23888, 21499, 19349, 17414, 15672, 14105, - 12694, 11425, 10282, 9254, 8329, 7496, 6746, 6071 -}; // Q15 - -/*---------------------------------------------------------------------* - * NB post-filter tables - *---------------------------------------------------------------------*/ - -const Word16 tab_hup_s_fx[SIZ_TAB_HUP_S] = { // Q15 - -188, 2873, 31650, -1597, -484, 7041, 28469, -2147, -933, 12266, - 23705, -1992, -1492, 18050, 18050, -1492, -1992, 23705, 12266, -933, - -2147, 28469, 7041, -484, -1597, 31650, 2873, -188 -}; - -const Word16 tab_hup_l_fx[SIZ_TAB_HUP_L] = { // Q15 - -40, 72, -156, 315, -579, 1023, -1874, 4439, - 31915, -3390, 1595, -887, 501, -266, 130, -59, - -77, 147, -317, 631, -1150, 2030, -3773, 9639, - 29436, -5579, 2727, -1527, 859, -453, 218, -101, - -106, 212, -455, 892, -1614, 2850, -5392, 15206, - 25569, -6549, 3303, -1860, 1041, -543, 258, -122, - -123, 253, -538, 1044, -1876, 3319, -6414, 20676, - 20676, -6414, 3319, -1876, 1044, -538, 253, -123, - -122, 258, -543, 1041, -1860, 3303, -6549, 25569, - 15206, -5392, 2850, -1614, 892, -455, 212, -106, - -101, 218, -453, 859, -1527, 2727, -5579, 29436, - 9639, -3773, 2030, -1150, 631, -317, 147, -77, - -59, 130, -266, 501, -887, 1595, -3390, 31915, - 4439, -1874, 1023, -579, 315, -156, 72, -40 -}; - -const Word16 mfreq_loc_Q2fx[] = { 700, 1500, 3100, 4700, 6300, 7900, 9500, 11100, 12700, 14300, 15900, 17500, 19100, 20700, 22300, 25500, 28700, 31900 }; // Q0 -const Word16 mfreq_loc_div_25[] = { 7, 15, 31, 47, 63, 79, 95, 111, 127, 143, 159, 175, 191, 207, 223, 255, 287, 319 }; // Q0 - -// low_rate_band_att_fx.c -/* %* lowered Table ROM, call with band_len_idx[sfm_size>>3] */ -/* % sfms =[ 8, 16, 24, 32, 48, 64, 80, 96 ], */ -/* sfm/8= [ 1 2 3 4 6 8 10 12]; */ -/* % idx= 0 1 2 3 4 5 6 7; */ -/* call with band_len_idx[sfm_size>>3] */ -const Word16 band_len_idx[1 + ( MAX_SFM_LEN_FX / 8 )] = { - // Q0 - /*sfm/8*/ /*1*/ /*2 */ /*3 */ /*4 */ /*6 */ /*8 */ /*10*/ /*12*/ - -1, 0 /*8*/, 1 /*16*/, 2 /*24*/, 3 /*32*/, -1, 4 /*48 */, -1, 5 /*64 */, -1, 6 /*80*/, -1, 7 /*96*/ -}; -const Word16 band_len_ener_shift[8] = { 1, 2, 2, 2, 3, 3, 4 /*sfm==80*/, 4 /*sfm==96*/ }; /* 96 requires 1 bit more than 48 */ // Q0 -/*% sfms=[8,16,24,32,48,64,80,96], round(sqrt(sfms)*2^11) */ -const Word16 fine_gain_pred_sqrt_bw[8] = { 5793, 8192, 10033, 11585, 14189, 16384, 18318, 20066 }; /* (Q11) */ -const Word16 ivas_band_len_idx[1 + ( MAX_SFM_LEN_FX / 8 )] = { - /*sfm/8*/ /*1*/ /*2 */ /*3 */ /*4 */ /*6 */ /*8 */ /*10*/ /*12*/ - -1, 0 /*8*/, 1 /*16*/, 2 /*24*/, 3 /*32*/, 4 /*40*/, 5 /*48 */, -1, 6 /*64 */, -1, 7 /*80*/, -1, 8 /*96*/ -}; // Q0 -const Word16 ivas_band_len_ener_shift[9] = { 1, 2, 2, 2, 3, 3, 3, 4 /*sfm==80*/, 4 /*sfm==96*/ }; // Q0 /* 96 requires 1 bit more than 48 */ -const Word16 ivas_fine_gain_pred_sqrt_bw[9] = { 5793, 8192, 10033, 11585, 12953, 14189, 16384, 18318, 20066 }; /* (Q11) */ -/*% sfms=[8,16,24,32,40,48,64,80,96], round(sqrt(sfms)*2^11) */ -/*----------------------------------------------------------------------------------* - * means of ISFs for WB active speech - *----------------------------------------------------------------------------------*/ -const Word16 Mean_isf_wb[M] = /* G722.2 active speech ISF's means Q2.56*/ - { - 738, 1326, 2336, 3578, 4596, 5662, 6711, 7730, - 8750, 9753, 10705, 11728, 12833, 13971, 15043, 4037 - }; - -const Word16 lsp_shb_prev_tbl_fx[LPC_SHB_ORDER] = { - /*Q15 */ - 0, - 1638, - 3277, - 4915, - 6554, - 8192, - 9830, - 11469, - 13107, - 14746 -}; - -const Word16 lsp_shb_prev_tbl_swb_tbe_enc_fx[LPC_SHB_ORDER] = { - // Q15 - 32767, - 31165, - 26509, - 19262, - 10123, - 0, - -10124, - -19261, - -26509, - -31166, -}; - -const Word16 ivas_lsp_shb_prev_tbl_fx[LPC_SHB_ORDER] = { - /* Q15 */ - 1489, - 2979, - 4468, - 5958, - 7447, - 8937, - 10426, - 11916, - 13405, - 14895 -}; - -/* These words are subtracted from high/low/value with a shift left by 1. */ -/* The value 0x0CCC should never be referenced, low is less/equal high */ -/* The value 0x0BBB should never be referenced, loop must break instead. */ -/* Refer to this table with indices: tab_ari_qnew[msb_high][msb_low] */ -const Word16 tab_ari_qnew[4][4] = { { 0x0000, 0x0CCC, 0x0CCC, 0x0CCC }, - { 0x0000, 0x0000, 0x0CCC, 0x0CCC }, - { 0x0BBB, 0x2000, 0x4000, 0x0CCC }, - { 0x0BBB, 0x0BBB, 0x4000, 0x4000 } }; - -const Word16 phs_tbl_dec[64 * 2] = { // Q15 - /* part of table that is not scaled by 2 */ - 16384, 0, 16305, -1606, 16069, -3196, 15678, -4756, 15136, -6270, - 14449, -7723, 13622, -9102, 12665, -10394, 11585, -11585, 10394, -12665, - 9102, -13622, 7723, -14449, 6270, -15136, 4756, -15678, 3196, -16069, - 1606, -16305, 0, -16384, -1606, -16305, -3196, -16069, -4756, -15678, - -6270, -15136, -7723, -14449, -9102, -13622, -10394, -12665, -11585, -11585, - -12665, -10394, -13622, -9102, -14449, -7723, -15136, -6270, -15678, -4756, - -16069, -3196, -16305, -1606, - /* part of table that is scaled by 2 (this save one operation in FFT inner loops) */ - 32767, 0, 32610, -3212, 32138, -6392, 31356, -9512, 30272, -12540, - 28898, -15446, 27244, -18204, 25330, -20788, 23170, -23170, 20788, -25330, - 18204, -27244, 15446, -28898, 12540, -30272, 9512, -31356, 6392, -32138, - 3212, -32610, 0, -32768, -3212, -32610, -6392, -32138, -9512, -31356, - -12540, -30272, -15446, -28898, -18204, -27244, -20788, -25330, -23170, -23170, - -25330, -20788, -27244, -18204, -28898, -15446, -30272, -12540, -31356, -9512, - -32138, -6392, -32610, -3212 -}; - -/* 2.0 - 6.4 kHz phase dispersion */ -const Word16 Low_H_phasedisp[L_SUBFR] = { // Q15 - 16389, 16381, 16386, 16382, 16382, 16383, 16381, 16384, 16385, 10265, - 10154, 9894, 14052, 16343, -531, 13216, 16373, 15510, 9407, 15949, - 4726, 14593, 10404, 9796, -16336, -1815, -10623, 12647, 14556, -12683, - 11389, 8176, 16382, -14197, 11781, 10379, 7516, 10424, -12472, 16285, - -1200, -13137, 12659, -7446, 15684, -3763, -13418, -5280, 521, -9685, - -16375, -1219, 8436, -13059, -12861, -12775, 0, 3, 0, -2, - -1, -1, -1, 2 -}; - -/* 3.2 - 6.4 kHz phase dispersion */ -const Word16 Mid_H_phasedisp[L_SUBFR] = { // Q15 - 16382, 16382, 16384, 16385, 16386, 16388, 16387, 16383, 16387, 16383, - 16386, 16386, 16386, 16384, 16382, 16388, 14847, 9629, 13249, 14487, - 10995, 643, 13818, 13779, 6468, 8665, 11634, 9781, -14636, -982, - 11746, -722, 16386, -16365, -11422, 16354, 7363, 13148, -11538, -13903, - -15051, -8862, 8812, -16371, -12146, 7661, -9637, -13253, -6922, 4, - -4, -1, -5, 1, 7, 6, -7, -1, 4, -4, - 0, -1, -3, 3 -}; - -// ACcontextMapping_dec_fx.c -const Word16 Tab_esc_nb[4] = { 0 << ( NBITS_CONTEXT + NBITS_RATEQ ), - 1 << ( NBITS_CONTEXT + NBITS_RATEQ ), - 2 << ( NBITS_CONTEXT + NBITS_RATEQ ), - 3 << ( NBITS_CONTEXT + NBITS_RATEQ ) }; // Q0 - -const Word16 pow2tab[15] = { 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; // Q0 -const Word32 pow2[] = { // Q0 - 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576 -}; -// d_gain2p.c -const Word16 Es_pred_qua[8] = { - 1521 /* 5.9422f Q8*/, - 3909 /*15.2711f Q8*/, - 5987 /*23.3857f Q8*/, - 7816 /*30.5310f Q8*/, - 9477 /*37.0190f Q8*/, - 11124 /*43.4539f Q8*/, - 12863 /*50.2442f Q8*/, - 15031 /*58.7164f Q8*/ -}; - -const Word16 Es_pred_qua_2[16] = { - -1280 /*-5.f Q8*/, - 0 /* 0.f Q8*/, - 1280 /* 5.f Q8*/, - 2560 /*10.f Q8*/, - 3840 /*15.f Q8*/, - 5120 /*20.f Q8*/, - 6400 /*25.f Q8*/, - 7680 /*30.f Q8*/, - 8960 /*35.f Q8*/, - 10240 /*40.f Q8*/, - 11520 /*45.f Q8*/, - 12800 /*50.f Q8*/, - 14080 /*55.f Q8*/, - 15360 /*60.f Q8*/, - 16640 /*65.f Q8*/, - 17920 /*70.f Q8*/ -}; -const Word16 T_DIV_L_Frame[] = /*0Q15 * 2^-7 */ - { - 26214 /*160*/ - , - 16384 /*256*/ - , - 13107 /*320*/ - , - 8738 /*480*/ - , - 8192 /*512*/ - , - 6553 /*640*/ - }; - -/* order 8 LPF for nelp frames when non-native sampling freq inputs used with -max_band NB */ -/* used to suppress frequencies above 4kHz present at the output of filters in pre_proc() */ - -const Word16 num_nelp_lp_fx[NELP_LP_ORDER + 1] = /*Q13*/ - { - 727, - 3506, - 8988, - 15029, - 17732, - 15022, - 8979, - 3501, - 726 - }; - -const Word16 den_nelp_lp_fx[NELP_LP_ORDER + 1] = { // Q13 - 8192, - 8819, - 21618, - 12167, - 15902, - 3553, - 3998, - -120, - 353 -}; - -/*----------------------------------------------------------------------------------* - * AMR-WB IO WB BWE - band-pass 6-8kHz FIR filter, values in Q15: - *----------------------------------------------------------------------------------*/ -const Word16 fir_6k_8k_fx[31] = { // Q15 - 44, -155, 323, -482, 563, -590, 726, -1180, 1986, -2818, 3028, - -1991, -423, 3583, -6281, 7342, -6281, 3583, -423, -1991, 3028, - -2818, 1986, -1180, 726, -590, 563, -482, 323, -155, 44 -}; - -const Word16 pwf78_fx[17] = { 25559, 19936, 15550, 12129, 9460, 7379, 5755, 4489, - 3501, 2731, 2130, 1661, 1296, 1011, 788, 615, - 479 }; /* 0.78^i (i=1,...,17), Q15 */ - -/*------------------------------------------------------------------------------* - * lag window for windowing the autocorrelations in LP analysis - * Used in lib_enc\analy_lp_fx.c - *------------------------------------------------------------------------------*/ -const Word16 hamcos_window_fx[L_LP_AMR_WB] = { // Q15 - 2621, 2622, 2626, 2632, 2640, 2650, 2662, 2677, - 2694, 2714, 2735, 2759, 2785, 2814, 2844, 2877, - 2912, 2949, 2989, 3031, 3075, 3121, 3169, 3220, - 3273, 3328, 3385, 3444, 3506, 3569, 3635, 3703, - 3773, 3845, 3919, 3996, 4074, 4155, 4237, 4321, - 4408, 4496, 4587, 4680, 4774, 4870, 4969, 5069, - 5171, 5275, 5381, 5489, 5599, 5710, 5824, 5939, - 6056, 6174, 6295, 6417, 6541, 6666, 6793, 6922, - 7052, 7185, 7318, 7453, 7590, 7728, 7868, 8009, - 8152, 8296, 8442, 8589, 8737, 8887, 9038, 9191, - 9344, 9499, 9655, 9813, 9971, 10131, 10292, 10454, - 10617, 10781, 10946, 11113, 11280, 11448, 11617, 11787, - 11958, 12130, 12303, 12476, 12650, 12825, 13001, 13178, - 13355, 13533, 13711, 13890, 14070, 14250, 14431, 14612, - 14793, 14975, 15158, 15341, 15524, 15708, 15891, 16076, - 16260, 16445, 16629, 16814, 16999, 17185, 17370, 17555, - 17740, 17926, 18111, 18296, 18481, 18666, 18851, 19036, - 19221, 19405, 19589, 19773, 19956, 20139, 20322, 20504, - 20686, 20867, 21048, 21229, 21408, 21588, 21767, 21945, - 22122, 22299, 22475, 22651, 22825, 22999, 23172, 23344, - 23516, 23686, 23856, 24025, 24192, 24359, 24525, 24689, - 24853, 25016, 25177, 25337, 25496, 25654, 25811, 25967, - 26121, 26274, 26426, 26576, 26725, 26873, 27019, 27164, - 27308, 27450, 27590, 27729, 27867, 28003, 28137, 28270, - 28401, 28531, 28659, 28785, 28910, 29033, 29154, 29274, - 29391, 29507, 29622, 29734, 29845, 29953, 30060, 30165, - 30268, 30370, 30469, 30566, 30662, 30755, 30847, 30936, - 31024, 31109, 31193, 31274, 31354, 31431, 31506, 31579, - 31651, 31719, 31786, 31851, 31914, 31974, 32032, 32088, - 32142, 32194, 32243, 32291, 32336, 32379, 32419, 32458, - 32494, 32528, 32560, 32589, 32617, 32642, 32664, 32685, - 32703, 32719, 32733, 32744, 32753, 32760, 32764, 32767, - 32767, 32765, 32757, 32745, 32727, 32705, 32678, 32646, - 32609, 32567, 32520, 32468, 32411, 32349, 32283, 32211, - 32135, 32054, 31968, 31877, 31781, 31681, 31575, 31465, - 31351, 31231, 31107, 30978, 30844, 30706, 30563, 30415, - 30263, 30106, 29945, 29779, 29609, 29434, 29255, 29071, - 28883, 28691, 28494, 28293, 28087, 27878, 27664, 27446, - 27224, 26997, 26767, 26533, 26294, 26052, 25806, 25555, - 25301, 25043, 24782, 24516, 24247, 23974, 23698, 23418, - 23134, 22847, 22557, 22263, 21965, 21665, 21361, 21054, - 20743, 20430, 20113, 19794, 19471, 19146, 18817, 18486, - 18152, 17815, 17476, 17134, 16789, 16442, 16092, 15740, - 15385, 15028, 14669, 14308, 13944, 13579, 13211, 12841, - 12470, 12096, 11721, 11344, 10965, 10584, 10202, 9819, - 9433, 9047, 8659, 8270, 7879, 7488, 7095, 6701, - 6306, 5910, 5514, 5116, 4718, 4319, 3919, 3519, - 3118, 2716, 2315, 1913, 1510, 1108, 705, 302 -}; - - -const Word16 CNG_burst_att_fx[6][8] = { // Q15 - { 30076, 27793, 25832, 24129, 22637, 21319, 20146, 19095 }, - { 29714, 27181, 25046, 23222, 21646, 20270, 20205, 20205 }, - { 29415, 26685, 24418, 22506, 22410, 22410, 22410, 22410 }, - { 29310, 26512, 24201, 23198, 23198, 23198, 23198, 23198 }, - { 29310, 26512, 24201, 23198, 23198, 23198, 23198, 23198 }, - { 29789, 27307, 25206, 23406, 21845, 20480, 19661, 19661 } -}; - -const Word16 lpc_weights_fx[LPC_SHB_ORDER + 1] = { // Q15 - 32767, 31948, 31150, 30371, 29612, - 28871, 28149, 27446, 26760, 26091, 25438 -}; - -const Word16 SHBCB_SubGain5bit_12_fx[128] = { - /*Q12 */ - -597, - -1952, - -1644, - -1506, - -1767, - -1357, - -1249, - -874, - -4181, - -3836, - -240, - -1985, - -6573, - -1480, - -1229, - -1094, - -381, - -1655, - -2119, - -2406, - -2012, - -1022, - -2235, - -761, - -908, - -1282, - -1241, - -1845, - -68, - -4666, - -6058, - -6355, - -2311, - -1888, - -1396, - -513, - -523, - -1155, - -2300, - -3657, - -1161, - -549, - -2564, - -2424, - -609, - -2346, - -2934, - -1142, - -3591, - -2859, - -2063, - -205, - -4048, - -4083, - -4261, - -56, - -1352, - -2147, - -1894, - -574, - -6577, - -5483, - -1881, - -628, - -815, - -1061, - -1987, - -1654, - -455, - -1380, - -3818, - -4941, - -926, - -934, - -1463, - -2630, - -2520, - -1013, - -1016, - -1250, - -977, - -2477, - -720, - -2401, - -130, - -2789, - -3155, - -3192, - -1135, - -1287, - -1552, - -1115, - -1217, - -1918, - -1059, - -1102, - -2291, - -3353, - -744, - -979, - -3067, - -1892, - -961, - -707, - -1795, - -1229, - -652, - -2348, - -1569, - -717, - -1490, - -1628, - -3240, - -258, - -2129, - -2748, - -2062, - -1902, - -625, - -1257, - -1453, - -1250, - -965, - -1445, - -4227, - -1494, - -1108, - -819, - - -}; - - -const Word16 E_ROM_inter4_1_fx[UP_SAMP * L_INTERPOL1 + 1] = { - /* cut-off frequency at 0.9*fs/2 */ - 14746 /*0.900000F Q14*/, - 13418 /*0.818959F Q14*/, 9910 /*0.604850F Q14*/, 5429 /*0.331379F Q14*/, 1376 /*0.083958F Q14*/, - -1242 /*-0.075795F Q14*/, -2142 /*-0.130717F Q14*/, -1732 /*-0.105685F Q14*/, -766 /*-0.046774F Q14*/, - 73 /*0.004467F Q14*/, 455 /*0.027789F Q14*/, 420 /*0.025642F Q14*/, 206 /*0.012571F Q14*/, - 32 /*0.001927F Q14*/, -26 /*-0.001571F Q14*/, -12 /*-0.000753F Q14*/, 0 /*0.000000f Q14*/ -}; -const Word16 E_ROM_inter6_1_fx[PIT_UP_SAMP6 * L_INTERPOL1 + 1] = { - 14759 /*0.900848F Q14*/, - 14158 /*0.864136F Q14*/, - 12453 /*0.760071F Q14*/, - 9919 /*0.605408F Q14*/, - 6948 /*0.424072F Q14*/, - 3972 /*0.242462F Q14*/, - 1377 /*0.0840759F Q14*/, - -563 /*-0.0343933F Q14*/, - -1729 /*-0.105560F Q14*/, - -2152 /*-0.131348F Q14*/, - -1984 /*-0.121124F Q14*/, - -1450 /*-0.0884705F Q14*/, - -780 /*-0.0476379F Q14*/, - -168 /*-0.0102539F Q14*/, - 267 /*0.0162964F Q14*/, - 485 /*0.0296021F Q14*/, - 512 /*0.0312195F Q14*/, - 412 /*0.0251160F Q14*/, - 258 /*0.0157471F Q14*/, - 110 /*0.00671387F Q14*/, - 0 /*0.000000F Q14*/, - -65 /*-0.00399780F Q14*/, - -97 /*-0.00592041F Q14*/, - -108 /*-0.00656128F Q14*/, - 0 /*0.000000F Q14*/ -}; -const Word16 kLog2TableFrac_x[256] = { // Q8 - 0, 1, 3, 4, 6, 7, 9, 10, - 11, 13, 14, 16, 17, 18, 20, 21, - 22, 24, 25, 26, 28, 29, 30, 32, - 33, 34, 36, 37, 38, 40, 41, 42, - 44, 45, 46, 47, 49, 50, 51, 52, - 54, 55, 56, 57, 59, 60, 61, 62, - 63, 65, 66, 67, 68, 69, 71, 72, - 73, 74, 75, 77, 78, 79, 80, 81, - 82, 84, 85, 86, 87, 88, 89, 90, - 92, 93, 94, 95, 96, 97, 98, 99, - 100, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 178, - 179, 180, 181, 182, 183, 184, 185, 185, - 186, 187, 188, 189, 190, 191, 192, 192, - 193, 194, 195, 196, 197, 198, 198, 199, - 200, 201, 202, 203, 203, 204, 205, 206, - 207, 208, 208, 209, 210, 211, 212, 212, - 213, 214, 215, 216, 216, 217, 218, 219, - 220, 220, 221, 222, 223, 224, 224, 225, - 226, 227, 228, 228, 229, 230, 231, 231, - 232, 233, 234, 234, 235, 236, 237, 238, - 238, 239, 240, 241, 241, 242, 243, 244, - 244, 245, 246, 247, 247, 248, 249, 249, - 250, 251, 252, 252, 253, 254, 255, 255 -}; - -const Word16 kExp2TableFrac_x[256] = /* Q15 */ - { - 32767, 32678, 32590, 32502, 32414, 32326, 32239, 32152, - 32065, 31978, 31892, 31805, 31719, 31634, 31548, 31463, - 31378, 31293, 31208, 31124, 31040, 30956, 30872, 30789, - 30705, 30622, 30540, 30457, 30375, 30293, 30211, 30129, - 30047, 29966, 29885, 29804, 29724, 29643, 29563, 29483, - 29404, 29324, 29245, 29166, 29087, 29008, 28930, 28852, - 28774, 28696, 28618, 28541, 28464, 28387, 28310, 28233, - 28157, 28081, 28005, 27929, 27854, 27778, 27703, 27628, - 27554, 27479, 27405, 27331, 27257, 27183, 27110, 27036, - 26963, 26890, 26818, 26745, 26673, 26601, 26529, 26457, - 26385, 26314, 26243, 26172, 26101, 26031, 25960, 25890, - 25820, 25750, 25681, 25611, 25542, 25473, 25404, 25335, - 25267, 25198, 25130, 25062, 24995, 24927, 24860, 24792, - 24725, 24659, 24592, 24525, 24459, 24393, 24327, 24261, - 24196, 24130, 24065, 24000, 23935, 23870, 23806, 23741, - 23677, 23613, 23549, 23486, 23422, 23359, 23296, 23233, - 23170, 23107, 23045, 22982, 22920, 22858, 22796, 22735, - 22673, 22612, 22551, 22490, 22429, 22368, 22308, 22248, - 22187, 22127, 22068, 22008, 21948, 21889, 21830, 21771, - 21712, 21653, 21595, 21536, 21478, 21420, 21362, 21304, - 21247, 21189, 21132, 21075, 21018, 20961, 20904, 20848, - 20791, 20735, 20679, 20623, 20568, 20512, 20456, 20401, - 20346, 20291, 20236, 20181, 20127, 20072, 20018, 19964, - 19910, 19856, 19802, 19749, 19696, 19642, 19589, 19536, - 19483, 19431, 19378, 19326, 19274, 19221, 19169, 19118, - 19066, 19014, 18963, 18912, 18861, 18810, 18759, 18708, - 18657, 18607, 18557, 18506, 18456, 18406, 18357, 18307, - 18258, 18208, 18159, 18110, 18061, 18012, 17963, 17915, - 17866, 17818, 17770, 17722, 17674, 17626, 17578, 17531, - 17483, 17436, 17389, 17342, 17295, 17248, 17202, 17155, - 17109, 17063, 17016, 16970, 16925, 16879, 16833, 16788, - 16742, 16697, 16652, 16607, 16562, 16517, 16472, 16428 - }; - -/*-------------------------------------------------------------------* - * inverse (reciprocal) of integer, used in FEC_fx.c, pitch_extr and in pitchDoubling_det - * 1/n = One_div[n-1] - *-------------------------------------------------------------------*/ -const Word16 One_div_fx[] = /* in Q15 */ - { - 32767, /* 1/1 */ - 16384, /* 1/2 */ - 10923, /* 1/3 */ - 8192, /* 1/4 */ - 6554, /* 1/5 */ - 5461, /* 1/6 */ - 4681, /* 1/7 */ - 4096 /* 1/8 */ - }; - -const Word32 tbl_two_pow_shift_by_4[35] = { // Q30 - 1073741824, 902905664, 759250112, 638450688, 536870912, 451452832, 379625056, 319225344, - 268435456, 225726416, 189812528, 159612672, 134217728, 112863208, 94906264, 79806336, - 67108864, 56431604, 47453132, 39903168, 33554432, 28215802, 23726566, 19951584, - 16777216, 14107901, 11863283, 9975792, 8388608, 7053950, 5931641, 4987896, - 4194304, 3526975, 2965820 -}; - - -const Word16 ivas_tan_panning_gain_tbl_fx[601] = { // Q15 - SHC( 0x0000 ), SHC( 0x0042 ), SHC( 0x0084 ), SHC( 0x00c6 ), SHC( 0x0109 ), SHC( 0x014b ), SHC( 0x018e ), SHC( 0x01d1 ), - SHC( 0x0214 ), SHC( 0x0257 ), SHC( 0x029b ), SHC( 0x02de ), SHC( 0x0322 ), SHC( 0x0365 ), SHC( 0x03a9 ), SHC( 0x03ed ), - SHC( 0x0431 ), SHC( 0x0475 ), SHC( 0x04ba ), SHC( 0x04fe ), SHC( 0x0543 ), SHC( 0x0588 ), SHC( 0x05cd ), SHC( 0x0612 ), - SHC( 0x0657 ), SHC( 0x069c ), SHC( 0x06e1 ), SHC( 0x0727 ), SHC( 0x076d ), SHC( 0x07b2 ), SHC( 0x07f8 ), SHC( 0x083e ), - SHC( 0x0885 ), SHC( 0x08cb ), SHC( 0x0911 ), SHC( 0x0958 ), SHC( 0x099f ), SHC( 0x09e6 ), SHC( 0x0a2d ), SHC( 0x0a74 ), - SHC( 0x0abb ), SHC( 0x0b02 ), SHC( 0x0b4a ), SHC( 0x0b91 ), SHC( 0x0bd9 ), SHC( 0x0c21 ), SHC( 0x0c69 ), SHC( 0x0cb1 ), - SHC( 0x0cf9 ), SHC( 0x0d42 ), SHC( 0x0d8a ), SHC( 0x0dd3 ), SHC( 0x0e1c ), SHC( 0x0e65 ), SHC( 0x0eae ), SHC( 0x0ef7 ), - SHC( 0x0f40 ), SHC( 0x0f89 ), SHC( 0x0fd3 ), SHC( 0x101d ), SHC( 0x1066 ), SHC( 0x10b0 ), SHC( 0x10fa ), SHC( 0x1144 ), - SHC( 0x118f ), SHC( 0x11d9 ), SHC( 0x1223 ), SHC( 0x126e ), SHC( 0x12b9 ), SHC( 0x1304 ), SHC( 0x134f ), SHC( 0x139a ), - SHC( 0x13e5 ), SHC( 0x1430 ), SHC( 0x147c ), SHC( 0x14c7 ), SHC( 0x1513 ), SHC( 0x155f ), SHC( 0x15aa ), SHC( 0x15f6 ), - SHC( 0x1643 ), SHC( 0x168f ), SHC( 0x16db ), SHC( 0x1728 ), SHC( 0x1774 ), SHC( 0x17c1 ), SHC( 0x180e ), SHC( 0x185a ), - SHC( 0x18a7 ), SHC( 0x18f5 ), SHC( 0x1942 ), SHC( 0x198f ), SHC( 0x19dd ), SHC( 0x1a2a ), SHC( 0x1a78 ), SHC( 0x1ac5 ), - SHC( 0x1b13 ), SHC( 0x1b61 ), SHC( 0x1baf ), SHC( 0x1bfd ), SHC( 0x1c4c ), SHC( 0x1c9a ), SHC( 0x1ce8 ), SHC( 0x1d37 ), - SHC( 0x1d86 ), SHC( 0x1dd4 ), SHC( 0x1e23 ), SHC( 0x1e72 ), SHC( 0x1ec1 ), SHC( 0x1f10 ), SHC( 0x1f5f ), SHC( 0x1faf ), - SHC( 0x1ffe ), SHC( 0x204d ), SHC( 0x209d ), SHC( 0x20ed ), SHC( 0x213c ), SHC( 0x218c ), SHC( 0x21dc ), SHC( 0x222c ), - SHC( 0x227c ), SHC( 0x22cc ), SHC( 0x231c ), SHC( 0x236d ), SHC( 0x23bd ), SHC( 0x240e ), SHC( 0x245e ), SHC( 0x24af ), - SHC( 0x24ff ), SHC( 0x2550 ), SHC( 0x25a1 ), SHC( 0x25f2 ), SHC( 0x2643 ), SHC( 0x2694 ), SHC( 0x26e5 ), SHC( 0x2736 ), - SHC( 0x2787 ), SHC( 0x27d9 ), SHC( 0x282a ), SHC( 0x287b ), SHC( 0x28cd ), SHC( 0x291e ), SHC( 0x2970 ), SHC( 0x29c2 ), - SHC( 0x2a13 ), SHC( 0x2a65 ), SHC( 0x2ab7 ), SHC( 0x2b09 ), SHC( 0x2b5b ), SHC( 0x2bad ), SHC( 0x2bff ), SHC( 0x2c51 ), - SHC( 0x2ca3 ), SHC( 0x2cf5 ), SHC( 0x2d47 ), SHC( 0x2d99 ), SHC( 0x2dec ), SHC( 0x2e3e ), SHC( 0x2e90 ), SHC( 0x2ee3 ), - SHC( 0x2f35 ), SHC( 0x2f87 ), SHC( 0x2fda ), SHC( 0x302c ), SHC( 0x307f ), SHC( 0x30d2 ), SHC( 0x3124 ), SHC( 0x3177 ), - SHC( 0x31c9 ), SHC( 0x321c ), SHC( 0x326f ), SHC( 0x32c1 ), SHC( 0x3314 ), SHC( 0x3367 ), SHC( 0x33ba ), SHC( 0x340c ), - SHC( 0x345f ), SHC( 0x34b2 ), SHC( 0x3505 ), SHC( 0x3557 ), SHC( 0x35aa ), SHC( 0x35fd ), SHC( 0x3650 ), SHC( 0x36a2 ), - SHC( 0x36f5 ), SHC( 0x3748 ), SHC( 0x379b ), SHC( 0x37ed ), SHC( 0x3840 ), SHC( 0x3893 ), SHC( 0x38e6 ), SHC( 0x3938 ), - SHC( 0x398b ), SHC( 0x39de ), SHC( 0x3a30 ), SHC( 0x3a83 ), SHC( 0x3ad6 ), SHC( 0x3b28 ), SHC( 0x3b7b ), SHC( 0x3bcd ), - SHC( 0x3c20 ), SHC( 0x3c72 ), SHC( 0x3cc5 ), SHC( 0x3d17 ), SHC( 0x3d69 ), SHC( 0x3dbc ), SHC( 0x3e0e ), SHC( 0x3e60 ), - SHC( 0x3eb2 ), SHC( 0x3f04 ), SHC( 0x3f57 ), SHC( 0x3fa9 ), SHC( 0x3ffb ), SHC( 0x404c ), SHC( 0x409e ), SHC( 0x40f0 ), - SHC( 0x4142 ), SHC( 0x4194 ), SHC( 0x41e5 ), SHC( 0x4237 ), SHC( 0x4288 ), SHC( 0x42da ), SHC( 0x432b ), SHC( 0x437c ), - SHC( 0x43ce ), SHC( 0x441f ), SHC( 0x4470 ), SHC( 0x44c1 ), SHC( 0x4512 ), SHC( 0x4563 ), SHC( 0x45b3 ), SHC( 0x4604 ), - SHC( 0x4654 ), SHC( 0x46a5 ), SHC( 0x46f5 ), SHC( 0x4746 ), SHC( 0x4796 ), SHC( 0x47e6 ), SHC( 0x4836 ), SHC( 0x4886 ), - SHC( 0x48d5 ), SHC( 0x4925 ), SHC( 0x4975 ), SHC( 0x49c4 ), SHC( 0x4a13 ), SHC( 0x4a63 ), SHC( 0x4ab2 ), SHC( 0x4b01 ), - SHC( 0x4b50 ), SHC( 0x4b9e ), SHC( 0x4bed ), SHC( 0x4c3b ), SHC( 0x4c8a ), SHC( 0x4cd8 ), SHC( 0x4d26 ), SHC( 0x4d74 ), - SHC( 0x4dc2 ), SHC( 0x4e10 ), SHC( 0x4e5d ), SHC( 0x4eab ), SHC( 0x4ef8 ), SHC( 0x4f45 ), SHC( 0x4f92 ), SHC( 0x4fdf ), - SHC( 0x502c ), SHC( 0x5078 ), SHC( 0x50c4 ), SHC( 0x5111 ), SHC( 0x515d ), SHC( 0x51a9 ), SHC( 0x51f4 ), SHC( 0x5240 ), - SHC( 0x528b ), SHC( 0x52d7 ), SHC( 0x5322 ), SHC( 0x536d ), SHC( 0x53b8 ), SHC( 0x5402 ), SHC( 0x544d ), SHC( 0x5497 ), - SHC( 0x54e1 ), SHC( 0x552b ), SHC( 0x5574 ), SHC( 0x55be ), SHC( 0x5607 ), SHC( 0x5650 ), SHC( 0x5699 ), SHC( 0x56e2 ), - SHC( 0x572b ), SHC( 0x5773 ), SHC( 0x57bb ), SHC( 0x5803 ), SHC( 0x584b ), SHC( 0x5893 ), SHC( 0x58da ), SHC( 0x5921 ), - SHC( 0x5968 ), SHC( 0x59af ), SHC( 0x59f5 ), SHC( 0x5a3c ), SHC( 0x5a82 ), SHC( 0x5ac8 ), SHC( 0x5b0e ), SHC( 0x5b53 ), - SHC( 0x5b98 ), SHC( 0x5bde ), SHC( 0x5c22 ), SHC( 0x5c67 ), SHC( 0x5cab ), SHC( 0x5cf0 ), SHC( 0x5d34 ), SHC( 0x5d77 ), - SHC( 0x5dbb ), SHC( 0x5dfe ), SHC( 0x5e41 ), SHC( 0x5e84 ), SHC( 0x5ec7 ), SHC( 0x5f09 ), SHC( 0x5f4b ), SHC( 0x5f8d ), - SHC( 0x5fcf ), SHC( 0x6010 ), SHC( 0x6051 ), SHC( 0x6092 ), SHC( 0x60d3 ), SHC( 0x6113 ), SHC( 0x6153 ), SHC( 0x6193 ), - SHC( 0x61d3 ), SHC( 0x6213 ), SHC( 0x6252 ), SHC( 0x6291 ), SHC( 0x62cf ), SHC( 0x630e ), SHC( 0x634c ), SHC( 0x638a ), - SHC( 0x63c8 ), SHC( 0x6405 ), SHC( 0x6442 ), SHC( 0x647f ), SHC( 0x64bc ), SHC( 0x64f8 ), SHC( 0x6534 ), SHC( 0x6570 ), - SHC( 0x65ac ), SHC( 0x65e7 ), SHC( 0x6622 ), SHC( 0x665d ), SHC( 0x6698 ), SHC( 0x66d2 ), SHC( 0x670c ), SHC( 0x6746 ), - SHC( 0x677f ), SHC( 0x67b8 ), SHC( 0x67f1 ), SHC( 0x682a ), SHC( 0x6862 ), SHC( 0x689a ), SHC( 0x68d2 ), SHC( 0x690a ), - SHC( 0x6941 ), SHC( 0x6978 ), SHC( 0x69af ), SHC( 0x69e5 ), SHC( 0x6a1c ), SHC( 0x6a52 ), SHC( 0x6a87 ), SHC( 0x6abd ), - SHC( 0x6af2 ), SHC( 0x6b26 ), SHC( 0x6b5b ), SHC( 0x6b8f ), SHC( 0x6bc3 ), SHC( 0x6bf7 ), SHC( 0x6c2a ), SHC( 0x6c5d ), - SHC( 0x6c90 ), SHC( 0x6cc3 ), SHC( 0x6cf5 ), SHC( 0x6d27 ), SHC( 0x6d59 ), SHC( 0x6d8a ), SHC( 0x6dbb ), SHC( 0x6dec ), - SHC( 0x6e1d ), SHC( 0x6e4d ), SHC( 0x6e7d ), SHC( 0x6ead ), SHC( 0x6edc ), SHC( 0x6f0b ), SHC( 0x6f3a ), SHC( 0x6f69 ), - SHC( 0x6f97 ), SHC( 0x6fc5 ), SHC( 0x6ff3 ), SHC( 0x7020 ), SHC( 0x704e ), SHC( 0x707a ), SHC( 0x70a7 ), SHC( 0x70d3 ), - SHC( 0x70ff ), SHC( 0x712b ), SHC( 0x7157 ), SHC( 0x7182 ), SHC( 0x71ad ), SHC( 0x71d7 ), SHC( 0x7202 ), SHC( 0x722c ), - SHC( 0x7255 ), SHC( 0x727f ), SHC( 0x72a8 ), SHC( 0x72d1 ), SHC( 0x72fa ), SHC( 0x7322 ), SHC( 0x734a ), SHC( 0x7372 ), - SHC( 0x7399 ), SHC( 0x73c0 ), SHC( 0x73e7 ), SHC( 0x740e ), SHC( 0x7434 ), SHC( 0x745a ), SHC( 0x7480 ), SHC( 0x74a6 ), - SHC( 0x74cb ), SHC( 0x74f0 ), SHC( 0x7515 ), SHC( 0x7539 ), SHC( 0x755d ), SHC( 0x7581 ), SHC( 0x75a5 ), SHC( 0x75c8 ), - SHC( 0x75eb ), SHC( 0x760e ), SHC( 0x7630 ), SHC( 0x7652 ), SHC( 0x7674 ), SHC( 0x7696 ), SHC( 0x76b7 ), SHC( 0x76d9 ), - SHC( 0x76f9 ), SHC( 0x771a ), SHC( 0x773a ), SHC( 0x775a ), SHC( 0x777a ), SHC( 0x779a ), SHC( 0x77b9 ), SHC( 0x77d8 ), - SHC( 0x77f6 ), SHC( 0x7815 ), SHC( 0x7833 ), SHC( 0x7851 ), SHC( 0x786e ), SHC( 0x788c ), SHC( 0x78a9 ), SHC( 0x78c6 ), - SHC( 0x78e2 ), SHC( 0x78ff ), SHC( 0x791b ), SHC( 0x7937 ), SHC( 0x7952 ), SHC( 0x796d ), SHC( 0x7988 ), SHC( 0x79a3 ), - SHC( 0x79be ), SHC( 0x79d8 ), SHC( 0x79f2 ), SHC( 0x7a0c ), SHC( 0x7a25 ), SHC( 0x7a3e ), SHC( 0x7a57 ), SHC( 0x7a70 ), - SHC( 0x7a89 ), SHC( 0x7aa1 ), SHC( 0x7ab9 ), SHC( 0x7ad1 ), SHC( 0x7ae8 ), SHC( 0x7aff ), SHC( 0x7b16 ), SHC( 0x7b2d ), - SHC( 0x7b44 ), SHC( 0x7b5a ), SHC( 0x7b70 ), SHC( 0x7b86 ), SHC( 0x7b9b ), SHC( 0x7bb1 ), SHC( 0x7bc6 ), SHC( 0x7bdb ), - SHC( 0x7bef ), SHC( 0x7c04 ), SHC( 0x7c18 ), SHC( 0x7c2c ), SHC( 0x7c40 ), SHC( 0x7c53 ), SHC( 0x7c66 ), SHC( 0x7c79 ), - SHC( 0x7c8c ), SHC( 0x7c9e ), SHC( 0x7cb1 ), SHC( 0x7cc3 ), SHC( 0x7cd5 ), SHC( 0x7ce6 ), SHC( 0x7cf8 ), SHC( 0x7d09 ), - SHC( 0x7d1a ), SHC( 0x7d2b ), SHC( 0x7d3b ), SHC( 0x7d4c ), SHC( 0x7d5c ), SHC( 0x7d6b ), SHC( 0x7d7b ), SHC( 0x7d8b ), - SHC( 0x7d9a ), SHC( 0x7da9 ), SHC( 0x7db8 ), SHC( 0x7dc6 ), SHC( 0x7dd5 ), SHC( 0x7de3 ), SHC( 0x7df1 ), SHC( 0x7dff ), - SHC( 0x7e0c ), SHC( 0x7e19 ), SHC( 0x7e27 ), SHC( 0x7e34 ), SHC( 0x7e40 ), SHC( 0x7e4d ), SHC( 0x7e59 ), SHC( 0x7e65 ), - SHC( 0x7e71 ), SHC( 0x7e7d ), SHC( 0x7e89 ), SHC( 0x7e94 ), SHC( 0x7e9f ), SHC( 0x7eaa ), SHC( 0x7eb5 ), SHC( 0x7ebf ), - SHC( 0x7eca ), SHC( 0x7ed4 ), SHC( 0x7ede ), SHC( 0x7ee8 ), SHC( 0x7ef1 ), SHC( 0x7efb ), SHC( 0x7f04 ), SHC( 0x7f0d ), - SHC( 0x7f16 ), SHC( 0x7f1f ), SHC( 0x7f27 ), SHC( 0x7f30 ), SHC( 0x7f38 ), SHC( 0x7f40 ), SHC( 0x7f48 ), SHC( 0x7f4f ), - SHC( 0x7f57 ), SHC( 0x7f5e ), SHC( 0x7f65 ), SHC( 0x7f6c ), SHC( 0x7f73 ), SHC( 0x7f79 ), SHC( 0x7f80 ), SHC( 0x7f86 ), - SHC( 0x7f8c ), SHC( 0x7f92 ), SHC( 0x7f98 ), SHC( 0x7f9d ), SHC( 0x7fa3 ), SHC( 0x7fa8 ), SHC( 0x7fad ), SHC( 0x7fb2 ), - SHC( 0x7fb7 ), SHC( 0x7fbb ), SHC( 0x7fc0 ), SHC( 0x7fc4 ), SHC( 0x7fc8 ), SHC( 0x7fcc ), SHC( 0x7fd0 ), SHC( 0x7fd4 ), - SHC( 0x7fd7 ), SHC( 0x7fdb ), SHC( 0x7fde ), SHC( 0x7fe1 ), SHC( 0x7fe4 ), SHC( 0x7fe7 ), SHC( 0x7fe9 ), SHC( 0x7fec ), - SHC( 0x7fee ), SHC( 0x7ff0 ), SHC( 0x7ff2 ), SHC( 0x7ff4 ), SHC( 0x7ff6 ), SHC( 0x7ff7 ), SHC( 0x7ff9 ), SHC( 0x7ffa ), - SHC( 0x7ffb ), SHC( 0x7ffc ), SHC( 0x7ffd ), SHC( 0x7ffe ), SHC( 0x7ffe ), SHC( 0x7fff ), SHC( 0x7fff ), SHC( 0x7fff ), - SHC( 0x7fff ) -}; - -const Word16 ivas_sine_panning_tbl_fx[601] = { // Q15 - SHC( 0xc001 ), SHC( 0xc032 ), SHC( 0xc064 ), SHC( 0xc095 ), SHC( 0xc0c7 ), SHC( 0xc0f9 ), SHC( 0xc12b ), SHC( 0xc15c ), - SHC( 0xc18e ), SHC( 0xc1c0 ), SHC( 0xc1f2 ), SHC( 0xc224 ), SHC( 0xc256 ), SHC( 0xc289 ), SHC( 0xc2bb ), SHC( 0xc2ed ), - SHC( 0xc31f ), SHC( 0xc352 ), SHC( 0xc384 ), SHC( 0xc3b6 ), SHC( 0xc3e9 ), SHC( 0xc41b ), SHC( 0xc44e ), SHC( 0xc481 ), - SHC( 0xc4b3 ), SHC( 0xc4e6 ), SHC( 0xc519 ), SHC( 0xc54b ), SHC( 0xc57e ), SHC( 0xc5b1 ), SHC( 0xc5e4 ), SHC( 0xc617 ), - SHC( 0xc64a ), SHC( 0xc67d ), SHC( 0xc6b0 ), SHC( 0xc6e3 ), SHC( 0xc717 ), SHC( 0xc74a ), SHC( 0xc77d ), SHC( 0xc7b1 ), - SHC( 0xc7e4 ), SHC( 0xc817 ), SHC( 0xc84b ), SHC( 0xc87e ), SHC( 0xc8b2 ), SHC( 0xc8e6 ), SHC( 0xc919 ), SHC( 0xc94d ), - SHC( 0xc981 ), SHC( 0xc9b4 ), SHC( 0xc9e8 ), SHC( 0xca1c ), SHC( 0xca50 ), SHC( 0xca84 ), SHC( 0xcab8 ), SHC( 0xcaec ), - SHC( 0xcb20 ), SHC( 0xcb54 ), SHC( 0xcb88 ), SHC( 0xcbbc ), SHC( 0xcbf1 ), SHC( 0xcc25 ), SHC( 0xcc59 ), SHC( 0xcc8d ), - SHC( 0xccc2 ), SHC( 0xccf6 ), SHC( 0xcd2b ), SHC( 0xcd5f ), SHC( 0xcd94 ), SHC( 0xcdc8 ), SHC( 0xcdfd ), SHC( 0xce32 ), - SHC( 0xce66 ), SHC( 0xce9b ), SHC( 0xced0 ), SHC( 0xcf05 ), SHC( 0xcf3a ), SHC( 0xcf6e ), SHC( 0xcfa3 ), SHC( 0xcfd8 ), - SHC( 0xd00d ), SHC( 0xd042 ), SHC( 0xd078 ), SHC( 0xd0ad ), SHC( 0xd0e2 ), SHC( 0xd117 ), SHC( 0xd14c ), SHC( 0xd181 ), - SHC( 0xd1b7 ), SHC( 0xd1ec ), SHC( 0xd221 ), SHC( 0xd257 ), SHC( 0xd28c ), SHC( 0xd2c2 ), SHC( 0xd2f7 ), SHC( 0xd32d ), - SHC( 0xd362 ), SHC( 0xd398 ), SHC( 0xd3ce ), SHC( 0xd403 ), SHC( 0xd439 ), SHC( 0xd46f ), SHC( 0xd4a5 ), SHC( 0xd4db ), - SHC( 0xd510 ), SHC( 0xd546 ), SHC( 0xd57c ), SHC( 0xd5b2 ), SHC( 0xd5e8 ), SHC( 0xd61e ), SHC( 0xd654 ), SHC( 0xd68a ), - SHC( 0xd6c0 ), SHC( 0xd6f7 ), SHC( 0xd72d ), SHC( 0xd763 ), SHC( 0xd799 ), SHC( 0xd7d0 ), SHC( 0xd806 ), SHC( 0xd83c ), - SHC( 0xd873 ), SHC( 0xd8a9 ), SHC( 0xd8df ), SHC( 0xd916 ), SHC( 0xd94c ), SHC( 0xd983 ), SHC( 0xd9ba ), SHC( 0xd9f0 ), - SHC( 0xda27 ), SHC( 0xda5d ), SHC( 0xda94 ), SHC( 0xdacb ), SHC( 0xdb02 ), SHC( 0xdb38 ), SHC( 0xdb6f ), SHC( 0xdba6 ), - SHC( 0xdbdd ), SHC( 0xdc14 ), SHC( 0xdc4b ), SHC( 0xdc81 ), SHC( 0xdcb8 ), SHC( 0xdcef ), SHC( 0xdd26 ), SHC( 0xdd5d ), - SHC( 0xdd95 ), SHC( 0xddcc ), SHC( 0xde03 ), SHC( 0xde3a ), SHC( 0xde71 ), SHC( 0xdea8 ), SHC( 0xdee0 ), SHC( 0xdf17 ), - SHC( 0xdf4e ), SHC( 0xdf85 ), SHC( 0xdfbd ), SHC( 0xdff4 ), SHC( 0xe02b ), SHC( 0xe063 ), SHC( 0xe09a ), SHC( 0xe0d2 ), - SHC( 0xe109 ), SHC( 0xe141 ), SHC( 0xe178 ), SHC( 0xe1b0 ), SHC( 0xe1e7 ), SHC( 0xe21f ), SHC( 0xe257 ), SHC( 0xe28e ), - SHC( 0xe2c6 ), SHC( 0xe2fe ), SHC( 0xe335 ), SHC( 0xe36d ), SHC( 0xe3a5 ), SHC( 0xe3dd ), SHC( 0xe414 ), SHC( 0xe44c ), - SHC( 0xe484 ), SHC( 0xe4bc ), SHC( 0xe4f4 ), SHC( 0xe52c ), SHC( 0xe564 ), SHC( 0xe59c ), SHC( 0xe5d4 ), SHC( 0xe60c ), - SHC( 0xe644 ), SHC( 0xe67c ), SHC( 0xe6b4 ), SHC( 0xe6ec ), SHC( 0xe724 ), SHC( 0xe75c ), SHC( 0xe794 ), SHC( 0xe7cc ), - SHC( 0xe804 ), SHC( 0xe83d ), SHC( 0xe875 ), SHC( 0xe8ad ), SHC( 0xe8e5 ), SHC( 0xe91e ), SHC( 0xe956 ), SHC( 0xe98e ), - SHC( 0xe9c6 ), SHC( 0xe9ff ), SHC( 0xea37 ), SHC( 0xea6f ), SHC( 0xeaa8 ), SHC( 0xeae0 ), SHC( 0xeb19 ), SHC( 0xeb51 ), - SHC( 0xeb8a ), SHC( 0xebc2 ), SHC( 0xebfa ), SHC( 0xec33 ), SHC( 0xec6b ), SHC( 0xeca4 ), SHC( 0xecdd ), SHC( 0xed15 ), - SHC( 0xed4e ), SHC( 0xed86 ), SHC( 0xedbf ), SHC( 0xedf7 ), SHC( 0xee30 ), SHC( 0xee69 ), SHC( 0xeea1 ), SHC( 0xeeda ), - SHC( 0xef13 ), SHC( 0xef4b ), SHC( 0xef84 ), SHC( 0xefbd ), SHC( 0xeff6 ), SHC( 0xf02e ), SHC( 0xf067 ), SHC( 0xf0a0 ), - SHC( 0xf0d9 ), SHC( 0xf111 ), SHC( 0xf14a ), SHC( 0xf183 ), SHC( 0xf1bc ), SHC( 0xf1f5 ), SHC( 0xf22e ), SHC( 0xf266 ), - SHC( 0xf29f ), SHC( 0xf2d8 ), SHC( 0xf311 ), SHC( 0xf34a ), SHC( 0xf383 ), SHC( 0xf3bc ), SHC( 0xf3f5 ), SHC( 0xf42e ), - SHC( 0xf467 ), SHC( 0xf4a0 ), SHC( 0xf4d9 ), SHC( 0xf512 ), SHC( 0xf54b ), SHC( 0xf584 ), SHC( 0xf5bd ), SHC( 0xf5f6 ), - SHC( 0xf62f ), SHC( 0xf668 ), SHC( 0xf6a1 ), SHC( 0xf6da ), SHC( 0xf713 ), SHC( 0xf74c ), SHC( 0xf785 ), SHC( 0xf7be ), - SHC( 0xf7f7 ), SHC( 0xf830 ), SHC( 0xf869 ), SHC( 0xf8a2 ), SHC( 0xf8db ), SHC( 0xf914 ), SHC( 0xf94e ), SHC( 0xf987 ), - SHC( 0xf9c0 ), SHC( 0xf9f9 ), SHC( 0xfa32 ), SHC( 0xfa6b ), SHC( 0xfaa4 ), SHC( 0xfadd ), SHC( 0xfb17 ), SHC( 0xfb50 ), - SHC( 0xfb89 ), SHC( 0xfbc2 ), SHC( 0xfbfb ), SHC( 0xfc34 ), SHC( 0xfc6e ), SHC( 0xfca7 ), SHC( 0xfce0 ), SHC( 0xfd19 ), - SHC( 0xfd52 ), SHC( 0xfd8b ), SHC( 0xfdc5 ), SHC( 0xfdfe ), SHC( 0xfe37 ), SHC( 0xfe70 ), SHC( 0xfea9 ), SHC( 0xfee3 ), - SHC( 0xff1c ), SHC( 0xff55 ), SHC( 0xff8e ), SHC( 0xffc7 ), SHC( 0x0000 ), SHC( 0x0039 ), SHC( 0x0072 ), SHC( 0x00ab ), - SHC( 0x00e4 ), SHC( 0x011d ), SHC( 0x0157 ), SHC( 0x0190 ), SHC( 0x01c9 ), SHC( 0x0202 ), SHC( 0x023b ), SHC( 0x0275 ), - SHC( 0x02ae ), SHC( 0x02e7 ), SHC( 0x0320 ), SHC( 0x0359 ), SHC( 0x0392 ), SHC( 0x03cc ), SHC( 0x0405 ), SHC( 0x043e ), - SHC( 0x0477 ), SHC( 0x04b0 ), SHC( 0x04e9 ), SHC( 0x0523 ), SHC( 0x055c ), SHC( 0x0595 ), SHC( 0x05ce ), SHC( 0x0607 ), - SHC( 0x0640 ), SHC( 0x0679 ), SHC( 0x06b2 ), SHC( 0x06ec ), SHC( 0x0725 ), SHC( 0x075e ), SHC( 0x0797 ), SHC( 0x07d0 ), - SHC( 0x0809 ), SHC( 0x0842 ), SHC( 0x087b ), SHC( 0x08b4 ), SHC( 0x08ed ), SHC( 0x0926 ), SHC( 0x095f ), SHC( 0x0998 ), - SHC( 0x09d1 ), SHC( 0x0a0a ), SHC( 0x0a43 ), SHC( 0x0a7c ), SHC( 0x0ab5 ), SHC( 0x0aee ), SHC( 0x0b27 ), SHC( 0x0b60 ), - SHC( 0x0b99 ), SHC( 0x0bd2 ), SHC( 0x0c0b ), SHC( 0x0c44 ), SHC( 0x0c7d ), SHC( 0x0cb6 ), SHC( 0x0cef ), SHC( 0x0d28 ), - SHC( 0x0d61 ), SHC( 0x0d9a ), SHC( 0x0dd2 ), SHC( 0x0e0b ), SHC( 0x0e44 ), SHC( 0x0e7d ), SHC( 0x0eb6 ), SHC( 0x0eef ), - SHC( 0x0f27 ), SHC( 0x0f60 ), SHC( 0x0f99 ), SHC( 0x0fd2 ), SHC( 0x100a ), SHC( 0x1043 ), SHC( 0x107c ), SHC( 0x10b5 ), - SHC( 0x10ed ), SHC( 0x1126 ), SHC( 0x115f ), SHC( 0x1197 ), SHC( 0x11d0 ), SHC( 0x1209 ), SHC( 0x1241 ), SHC( 0x127a ), - SHC( 0x12b2 ), SHC( 0x12eb ), SHC( 0x1323 ), SHC( 0x135c ), SHC( 0x1395 ), SHC( 0x13cd ), SHC( 0x1406 ), SHC( 0x143e ), - SHC( 0x1476 ), SHC( 0x14af ), SHC( 0x14e7 ), SHC( 0x1520 ), SHC( 0x1558 ), SHC( 0x1591 ), SHC( 0x15c9 ), SHC( 0x1601 ), - SHC( 0x163a ), SHC( 0x1672 ), SHC( 0x16aa ), SHC( 0x16e2 ), SHC( 0x171b ), SHC( 0x1753 ), SHC( 0x178b ), SHC( 0x17c3 ), - SHC( 0x17fc ), SHC( 0x1834 ), SHC( 0x186c ), SHC( 0x18a4 ), SHC( 0x18dc ), SHC( 0x1914 ), SHC( 0x194c ), SHC( 0x1984 ), - SHC( 0x19bc ), SHC( 0x19f4 ), SHC( 0x1a2c ), SHC( 0x1a64 ), SHC( 0x1a9c ), SHC( 0x1ad4 ), SHC( 0x1b0c ), SHC( 0x1b44 ), - SHC( 0x1b7c ), SHC( 0x1bb4 ), SHC( 0x1bec ), SHC( 0x1c23 ), SHC( 0x1c5b ), SHC( 0x1c93 ), SHC( 0x1ccb ), SHC( 0x1d02 ), - SHC( 0x1d3a ), SHC( 0x1d72 ), SHC( 0x1da9 ), SHC( 0x1de1 ), SHC( 0x1e19 ), SHC( 0x1e50 ), SHC( 0x1e88 ), SHC( 0x1ebf ), - SHC( 0x1ef7 ), SHC( 0x1f2e ), SHC( 0x1f66 ), SHC( 0x1f9d ), SHC( 0x1fd5 ), SHC( 0x200c ), SHC( 0x2043 ), SHC( 0x207b ), - SHC( 0x20b2 ), SHC( 0x20e9 ), SHC( 0x2120 ), SHC( 0x2158 ), SHC( 0x218f ), SHC( 0x21c6 ), SHC( 0x21fd ), SHC( 0x2234 ), - SHC( 0x226b ), SHC( 0x22a3 ), SHC( 0x22da ), SHC( 0x2311 ), SHC( 0x2348 ), SHC( 0x237f ), SHC( 0x23b5 ), SHC( 0x23ec ), - SHC( 0x2423 ), SHC( 0x245a ), SHC( 0x2491 ), SHC( 0x24c8 ), SHC( 0x24fe ), SHC( 0x2535 ), SHC( 0x256c ), SHC( 0x25a3 ), - SHC( 0x25d9 ), SHC( 0x2610 ), SHC( 0x2646 ), SHC( 0x267d ), SHC( 0x26b4 ), SHC( 0x26ea ), SHC( 0x2721 ), SHC( 0x2757 ), - SHC( 0x278d ), SHC( 0x27c4 ), SHC( 0x27fa ), SHC( 0x2830 ), SHC( 0x2867 ), SHC( 0x289d ), SHC( 0x28d3 ), SHC( 0x2909 ), - SHC( 0x2940 ), SHC( 0x2976 ), SHC( 0x29ac ), SHC( 0x29e2 ), SHC( 0x2a18 ), SHC( 0x2a4e ), SHC( 0x2a84 ), SHC( 0x2aba ), - SHC( 0x2af0 ), SHC( 0x2b25 ), SHC( 0x2b5b ), SHC( 0x2b91 ), SHC( 0x2bc7 ), SHC( 0x2bfd ), SHC( 0x2c32 ), SHC( 0x2c68 ), - SHC( 0x2c9e ), SHC( 0x2cd3 ), SHC( 0x2d09 ), SHC( 0x2d3e ), SHC( 0x2d74 ), SHC( 0x2da9 ), SHC( 0x2ddf ), SHC( 0x2e14 ), - SHC( 0x2e49 ), SHC( 0x2e7f ), SHC( 0x2eb4 ), SHC( 0x2ee9 ), SHC( 0x2f1e ), SHC( 0x2f53 ), SHC( 0x2f88 ), SHC( 0x2fbe ), - SHC( 0x2ff3 ), SHC( 0x3028 ), SHC( 0x305d ), SHC( 0x3092 ), SHC( 0x30c6 ), SHC( 0x30fb ), SHC( 0x3130 ), SHC( 0x3165 ), - SHC( 0x319a ), SHC( 0x31ce ), SHC( 0x3203 ), SHC( 0x3238 ), SHC( 0x326c ), SHC( 0x32a1 ), SHC( 0x32d5 ), SHC( 0x330a ), - SHC( 0x333e ), SHC( 0x3373 ), SHC( 0x33a7 ), SHC( 0x33db ), SHC( 0x340f ), SHC( 0x3444 ), SHC( 0x3478 ), SHC( 0x34ac ), - SHC( 0x34e0 ), SHC( 0x3514 ), SHC( 0x3548 ), SHC( 0x357c ), SHC( 0x35b0 ), SHC( 0x35e4 ), SHC( 0x3618 ), SHC( 0x364c ), - SHC( 0x367f ), SHC( 0x36b3 ), SHC( 0x36e7 ), SHC( 0x371a ), SHC( 0x374e ), SHC( 0x3782 ), SHC( 0x37b5 ), SHC( 0x37e9 ), - SHC( 0x381c ), SHC( 0x384f ), SHC( 0x3883 ), SHC( 0x38b6 ), SHC( 0x38e9 ), SHC( 0x391d ), SHC( 0x3950 ), SHC( 0x3983 ), - SHC( 0x39b6 ), SHC( 0x39e9 ), SHC( 0x3a1c ), SHC( 0x3a4f ), SHC( 0x3a82 ), SHC( 0x3ab5 ), SHC( 0x3ae7 ), SHC( 0x3b1a ), - SHC( 0x3b4d ), SHC( 0x3b7f ), SHC( 0x3bb2 ), SHC( 0x3be5 ), SHC( 0x3c17 ), SHC( 0x3c4a ), SHC( 0x3c7c ), SHC( 0x3cae ), - SHC( 0x3ce1 ), SHC( 0x3d13 ), SHC( 0x3d45 ), SHC( 0x3d77 ), SHC( 0x3daa ), SHC( 0x3ddc ), SHC( 0x3e0e ), SHC( 0x3e40 ), - SHC( 0x3e72 ), SHC( 0x3ea4 ), SHC( 0x3ed5 ), SHC( 0x3f07 ), SHC( 0x3f39 ), SHC( 0x3f6b ), SHC( 0x3f9c ), SHC( 0x3fce ), - SHC( 0x3fff ) -}; - -const Word16 ivas_sin_az_fx[361] = { // Q15 - SHC( 0x0000 ), SHC( 0xfdc5 ), SHC( 0xfb89 ), SHC( 0xf94e ), SHC( 0xf713 ), SHC( 0xf4d9 ), SHC( 0xf29f ), SHC( 0xf067 ), - SHC( 0xee30 ), SHC( 0xebfa ), SHC( 0xe9c6 ), SHC( 0xe794 ), SHC( 0xe564 ), SHC( 0xe335 ), SHC( 0xe109 ), SHC( 0xdee0 ), - SHC( 0xdcb8 ), SHC( 0xda94 ), SHC( 0xd873 ), SHC( 0xd654 ), SHC( 0xd439 ), SHC( 0xd221 ), SHC( 0xd00d ), SHC( 0xcdfd ), - SHC( 0xcbf1 ), SHC( 0xc9e8 ), SHC( 0xc7e4 ), SHC( 0xc5e4 ), SHC( 0xc3e9 ), SHC( 0xc1f2 ), SHC( 0xc001 ), SHC( 0xbe14 ), - SHC( 0xbc2c ), SHC( 0xba4a ), SHC( 0xb86d ), SHC( 0xb696 ), SHC( 0xb4c4 ), SHC( 0xb2f8 ), SHC( 0xb133 ), SHC( 0xaf73 ), - SHC( 0xadba ), SHC( 0xac07 ), SHC( 0xaa5a ), SHC( 0xa8b5 ), SHC( 0xa716 ), SHC( 0xa57e ), SHC( 0xa3ed ), SHC( 0xa264 ), - SHC( 0xa0e1 ), SHC( 0x9f66 ), SHC( 0x9df3 ), SHC( 0x9c87 ), SHC( 0x9b23 ), SHC( 0x99c7 ), SHC( 0x9873 ), SHC( 0x9727 ), - SHC( 0x95e3 ), SHC( 0x94a7 ), SHC( 0x9374 ), SHC( 0x9249 ), SHC( 0x9127 ), SHC( 0x900d ), SHC( 0x8efc ), SHC( 0x8df4 ), - SHC( 0x8cf5 ), SHC( 0x8bff ), SHC( 0x8b11 ), SHC( 0x8a2d ), SHC( 0x8953 ), SHC( 0x8881 ), SHC( 0x87b9 ), SHC( 0x86fa ), - SHC( 0x8644 ), SHC( 0x8598 ), SHC( 0x84f6 ), SHC( 0x845d ), SHC( 0x83ce ), SHC( 0x8348 ), SHC( 0x82cd ), SHC( 0x825b ), - SHC( 0x81f2 ), SHC( 0x8194 ), SHC( 0x813f ), SHC( 0x80f5 ), SHC( 0x80b4 ), SHC( 0x807d ), SHC( 0x8050 ), SHC( 0x802d ), - SHC( 0x8014 ), SHC( 0x8005 ), SHC( 0x8000 ), SHC( 0x8005 ), SHC( 0x8014 ), SHC( 0x802d ), SHC( 0x8050 ), SHC( 0x807d ), - SHC( 0x80b4 ), SHC( 0x80f5 ), SHC( 0x813f ), SHC( 0x8194 ), SHC( 0x81f2 ), SHC( 0x825b ), SHC( 0x82cd ), SHC( 0x8348 ), - SHC( 0x83ce ), SHC( 0x845d ), SHC( 0x84f6 ), SHC( 0x8598 ), SHC( 0x8644 ), SHC( 0x86fa ), SHC( 0x87b9 ), SHC( 0x8881 ), - SHC( 0x8953 ), SHC( 0x8a2d ), SHC( 0x8b11 ), SHC( 0x8bff ), SHC( 0x8cf5 ), SHC( 0x8df4 ), SHC( 0x8efc ), SHC( 0x900d ), - SHC( 0x9127 ), SHC( 0x9249 ), SHC( 0x9374 ), SHC( 0x94a7 ), SHC( 0x95e3 ), SHC( 0x9727 ), SHC( 0x9873 ), SHC( 0x99c7 ), - SHC( 0x9b23 ), SHC( 0x9c87 ), SHC( 0x9df3 ), SHC( 0x9f66 ), SHC( 0xa0e1 ), SHC( 0xa264 ), SHC( 0xa3ed ), SHC( 0xa57e ), - SHC( 0xa716 ), SHC( 0xa8b5 ), SHC( 0xaa5a ), SHC( 0xac07 ), SHC( 0xadba ), SHC( 0xaf73 ), SHC( 0xb133 ), SHC( 0xb2f8 ), - SHC( 0xb4c4 ), SHC( 0xb696 ), SHC( 0xb86d ), SHC( 0xba4a ), SHC( 0xbc2c ), SHC( 0xbe14 ), SHC( 0xc001 ), SHC( 0xc1f2 ), - SHC( 0xc3e9 ), SHC( 0xc5e4 ), SHC( 0xc7e4 ), SHC( 0xc9e8 ), SHC( 0xcbf1 ), SHC( 0xcdfd ), SHC( 0xd00d ), SHC( 0xd221 ), - SHC( 0xd439 ), SHC( 0xd654 ), SHC( 0xd873 ), SHC( 0xda94 ), SHC( 0xdcb8 ), SHC( 0xdee0 ), SHC( 0xe109 ), SHC( 0xe335 ), - SHC( 0xe564 ), SHC( 0xe794 ), SHC( 0xe9c6 ), SHC( 0xebfa ), SHC( 0xee30 ), SHC( 0xf067 ), SHC( 0xf29f ), SHC( 0xf4d9 ), - SHC( 0xf713 ), SHC( 0xf94e ), SHC( 0xfb89 ), SHC( 0xfdc5 ), SHC( 0x0000 ), SHC( 0x023b ), SHC( 0x0477 ), SHC( 0x06b2 ), - SHC( 0x08ed ), SHC( 0x0b27 ), SHC( 0x0d61 ), SHC( 0x0f99 ), SHC( 0x11d0 ), SHC( 0x1406 ), SHC( 0x163a ), SHC( 0x186c ), - SHC( 0x1a9c ), SHC( 0x1ccb ), SHC( 0x1ef7 ), SHC( 0x2120 ), SHC( 0x2348 ), SHC( 0x256c ), SHC( 0x278d ), SHC( 0x29ac ), - SHC( 0x2bc7 ), SHC( 0x2ddf ), SHC( 0x2ff3 ), SHC( 0x3203 ), SHC( 0x340f ), SHC( 0x3618 ), SHC( 0x381c ), SHC( 0x3a1c ), - SHC( 0x3c17 ), SHC( 0x3e0e ), SHC( 0x3fff ), SHC( 0x41ec ), SHC( 0x43d4 ), SHC( 0x45b6 ), SHC( 0x4793 ), SHC( 0x496a ), - SHC( 0x4b3c ), SHC( 0x4d08 ), SHC( 0x4ecd ), SHC( 0x508d ), SHC( 0x5246 ), SHC( 0x53f9 ), SHC( 0x55a6 ), SHC( 0x574b ), - SHC( 0x58ea ), SHC( 0x5a82 ), SHC( 0x5c13 ), SHC( 0x5d9c ), SHC( 0x5f1f ), SHC( 0x609a ), SHC( 0x620d ), SHC( 0x6379 ), - SHC( 0x64dd ), SHC( 0x6639 ), SHC( 0x678d ), SHC( 0x68d9 ), SHC( 0x6a1d ), SHC( 0x6b59 ), SHC( 0x6c8c ), SHC( 0x6db7 ), - SHC( 0x6ed9 ), SHC( 0x6ff3 ), SHC( 0x7104 ), SHC( 0x720c ), SHC( 0x730b ), SHC( 0x7401 ), SHC( 0x74ef ), SHC( 0x75d3 ), - SHC( 0x76ad ), SHC( 0x777f ), SHC( 0x7847 ), SHC( 0x7906 ), SHC( 0x79bc ), SHC( 0x7a68 ), SHC( 0x7b0a ), SHC( 0x7ba3 ), - SHC( 0x7c32 ), SHC( 0x7cb8 ), SHC( 0x7d33 ), SHC( 0x7da5 ), SHC( 0x7e0e ), SHC( 0x7e6c ), SHC( 0x7ec1 ), SHC( 0x7f0b ), - SHC( 0x7f4c ), SHC( 0x7f83 ), SHC( 0x7fb0 ), SHC( 0x7fd3 ), SHC( 0x7fec ), SHC( 0x7ffb ), SHC( 0x7fff ), SHC( 0x7ffb ), - SHC( 0x7fec ), SHC( 0x7fd3 ), SHC( 0x7fb0 ), SHC( 0x7f83 ), SHC( 0x7f4c ), SHC( 0x7f0b ), SHC( 0x7ec1 ), SHC( 0x7e6c ), - SHC( 0x7e0e ), SHC( 0x7da5 ), SHC( 0x7d33 ), SHC( 0x7cb8 ), SHC( 0x7c32 ), SHC( 0x7ba3 ), SHC( 0x7b0a ), SHC( 0x7a68 ), - SHC( 0x79bc ), SHC( 0x7906 ), SHC( 0x7847 ), SHC( 0x777f ), SHC( 0x76ad ), SHC( 0x75d3 ), SHC( 0x74ef ), SHC( 0x7401 ), - SHC( 0x730b ), SHC( 0x720c ), SHC( 0x7104 ), SHC( 0x6ff3 ), SHC( 0x6ed9 ), SHC( 0x6db7 ), SHC( 0x6c8c ), SHC( 0x6b59 ), - SHC( 0x6a1d ), SHC( 0x68d9 ), SHC( 0x678d ), SHC( 0x6639 ), SHC( 0x64dd ), SHC( 0x6379 ), SHC( 0x620d ), SHC( 0x609a ), - SHC( 0x5f1f ), SHC( 0x5d9c ), SHC( 0x5c13 ), SHC( 0x5a82 ), SHC( 0x58ea ), SHC( 0x574b ), SHC( 0x55a6 ), SHC( 0x53f9 ), - SHC( 0x5246 ), SHC( 0x508d ), SHC( 0x4ecd ), SHC( 0x4d08 ), SHC( 0x4b3c ), SHC( 0x496a ), SHC( 0x4793 ), SHC( 0x45b6 ), - SHC( 0x43d4 ), SHC( 0x41ec ), SHC( 0x3fff ), SHC( 0x3e0e ), SHC( 0x3c17 ), SHC( 0x3a1c ), SHC( 0x381c ), SHC( 0x3618 ), - SHC( 0x340f ), SHC( 0x3203 ), SHC( 0x2ff3 ), SHC( 0x2ddf ), SHC( 0x2bc7 ), SHC( 0x29ac ), SHC( 0x278d ), SHC( 0x256c ), - SHC( 0x2348 ), SHC( 0x2120 ), SHC( 0x1ef7 ), SHC( 0x1ccb ), SHC( 0x1a9c ), SHC( 0x186c ), SHC( 0x163a ), SHC( 0x1406 ), - SHC( 0x11d0 ), SHC( 0x0f99 ), SHC( 0x0d61 ), SHC( 0x0b27 ), SHC( 0x08ed ), SHC( 0x06b2 ), SHC( 0x0477 ), SHC( 0x023b ), - SHC( 0x0000 ) - -}; - -/* Tables required in edxt_fx() */ -const Word16 sin_scale_tbl_960[960] = /* Q15 */ - { - 0, 53, 107, 160, 214, - 268, 321, 375, 428, 482, - 536, 589, 643, 696, 750, - 804, 857, 911, 964, 1018, - 1072, 1125, 1179, 1232, 1286, - 1339, 1393, 1447, 1500, 1554, - 1607, 1661, 1714, 1768, 1821, - 1875, 1929, 1982, 2036, 2089, - 2143, 2196, 2250, 2303, 2357, - 2410, 2463, 2517, 2570, 2624, - 2677, 2731, 2784, 2838, 2891, - 2944, 2998, 3051, 3104, 3158, - 3211, 3265, 3318, 3371, 3425, - 3478, 3531, 3585, 3638, 3691, - 3744, 3798, 3851, 3904, 3957, - 4011, 4064, 4117, 4170, 4223, - 4276, 4330, 4383, 4436, 4489, - 4542, 4595, 4648, 4701, 4754, - 4807, 4860, 4913, 4966, 5019, - 5072, 5125, 5178, 5231, 5284, - 5337, 5390, 5443, 5496, 5549, - 5601, 5654, 5707, 5760, 5813, - 5865, 5918, 5971, 6024, 6076, - 6129, 6182, 6234, 6287, 6339, - 6392, 6445, 6497, 6550, 6602, - 6655, 6707, 6760, 6812, 6865, - 6917, 6969, 7022, 7074, 7126, - 7179, 7231, 7283, 7336, 7388, - 7440, 7492, 7544, 7597, 7649, - 7701, 7753, 7805, 7857, 7909, - 7961, 8013, 8065, 8117, 8169, - 8221, 8273, 8325, 8377, 8428, - 8480, 8532, 8584, 8635, 8687, - 8739, 8791, 8842, 8894, 8945, - 8997, 9048, 9100, 9151, 9203, - 9254, 9306, 9357, 9409, 9460, - 9511, 9563, 9614, 9665, 9716, - 9767, 9819, 9870, 9921, 9972, - 10023, 10074, 10125, 10176, 10227, - 10278, 10329, 10380, 10431, 10481, - 10532, 10583, 10634, 10684, 10735, - 10786, 10836, 10887, 10937, 10988, - 11038, 11089, 11139, 11190, 11240, - 11290, 11341, 11391, 11441, 11491, - 11542, 11592, 11642, 11692, 11742, - 11792, 11842, 11892, 11942, 11992, - 12042, 12092, 12142, 12191, 12241, - 12291, 12340, 12390, 12440, 12489, - 12539, 12588, 12638, 12687, 12737, - 12786, 12835, 12885, 12934, 12983, - 13033, 13082, 13131, 13180, 13229, - 13278, 13327, 13376, 13425, 13474, - 13523, 13571, 13620, 13669, 13718, - 13766, 13815, 13864, 13912, 13961, - 14009, 14058, 14106, 14154, 14203, - 14251, 14299, 14348, 14396, 14444, - 14492, 14540, 14588, 14636, 14684, - 14732, 14780, 14828, 14875, 14923, - 14971, 15019, 15066, 15114, 15161, - 15209, 15256, 15304, 15351, 15398, - 15446, 15493, 15540, 15587, 15635, - 15682, 15729, 15776, 15823, 15870, - 15917, 15963, 16010, 16057, 16104, - 16150, 16197, 16244, 16290, 16337, - 16383, 16429, 16476, 16522, 16568, - 16615, 16661, 16707, 16753, 16799, - 16845, 16891, 16937, 16983, 17029, - 17074, 17120, 17166, 17212, 17257, - 17303, 17348, 17394, 17439, 17484, - 17530, 17575, 17620, 17665, 17711, - 17756, 17801, 17846, 17891, 17936, - 17980, 18025, 18070, 18115, 18159, - 18204, 18248, 18293, 18337, 18382, - 18426, 18470, 18515, 18559, 18603, - 18647, 18691, 18735, 18779, 18823, - 18867, 18911, 18955, 18998, 19042, - 19086, 19129, 19173, 19216, 19259, - 19303, 19346, 19389, 19433, 19476, - 19519, 19562, 19605, 19648, 19691, - 19733, 19776, 19819, 19862, 19904, - 19947, 19989, 20032, 20074, 20116, - 20159, 20201, 20243, 20285, 20327, - 20369, 20411, 20453, 20495, 20537, - 20579, 20620, 20662, 20704, 20745, - 20787, 20828, 20869, 20911, 20952, - 20993, 21034, 21075, 21116, 21157, - 21198, 21239, 21280, 21321, 21361, - 21402, 21443, 21483, 21524, 21564, - 21604, 21645, 21685, 21725, 21765, - 21805, 21845, 21885, 21925, 21965, - 22004, 22044, 22084, 22123, 22163, - 22202, 22242, 22281, 22320, 22360, - 22399, 22438, 22477, 22516, 22555, - 22594, 22632, 22671, 22710, 22749, - 22787, 22826, 22864, 22902, 22941, - 22979, 23017, 23055, 23093, 23131, - 23169, 23207, 23245, 23283, 23320, - 23358, 23396, 23433, 23471, 23508, - 23545, 23583, 23620, 23657, 23694, - 23731, 23768, 23805, 23842, 23878, - 23915, 23952, 23988, 24025, 24061, - 24097, 24134, 24170, 24206, 24242, - 24278, 24314, 24350, 24386, 24422, - 24457, 24493, 24529, 24564, 24600, - 24635, 24670, 24706, 24741, 24776, - 24811, 24846, 24881, 24916, 24951, - 24985, 25020, 25054, 25089, 25123, - 25158, 25192, 25226, 25261, 25295, - 25329, 25363, 25397, 25430, 25464, - 25498, 25532, 25565, 25599, 25632, - 25665, 25699, 25732, 25765, 25798, - 25831, 25864, 25897, 25930, 25963, - 25995, 26028, 26060, 26093, 26125, - 26158, 26190, 26222, 26254, 26286, - 26318, 26350, 26382, 26414, 26445, - 26477, 26509, 26540, 26571, 26603, - 26634, 26665, 26696, 26727, 26758, - 26789, 26820, 26851, 26882, 26912, - 26943, 26973, 27004, 27034, 27064, - 27094, 27125, 27155, 27185, 27214, - 27244, 27274, 27304, 27333, 27363, - 27392, 27422, 27451, 27480, 27509, - 27538, 27567, 27596, 27625, 27654, - 27683, 27711, 27740, 27769, 27797, - 27825, 27854, 27882, 27910, 27938, - 27966, 27994, 28022, 28049, 28077, - 28105, 28132, 28160, 28187, 28214, - 28242, 28269, 28296, 28323, 28350, - 28377, 28403, 28430, 28457, 28483, - 28510, 28536, 28562, 28589, 28615, - 28641, 28667, 28693, 28719, 28744, - 28770, 28796, 28821, 28847, 28872, - 28897, 28923, 28948, 28973, 28998, - 29023, 29048, 29072, 29097, 29122, - 29146, 29171, 29195, 29219, 29244, - 29268, 29292, 29316, 29340, 29364, - 29387, 29411, 29435, 29458, 29482, - 29505, 29528, 29551, 29575, 29598, - 29621, 29643, 29666, 29689, 29712, - 29734, 29757, 29779, 29801, 29824, - 29846, 29868, 29890, 29912, 29934, - 29955, 29977, 29999, 30020, 30042, - 30063, 30084, 30106, 30127, 30148, - 30169, 30190, 30210, 30231, 30252, - 30272, 30293, 30313, 30333, 30354, - 30374, 30394, 30414, 30434, 30454, - 30473, 30493, 30513, 30532, 30552, - 30571, 30590, 30609, 30628, 30647, - 30666, 30685, 30704, 30723, 30741, - 30760, 30778, 30797, 30815, 30833, - 30851, 30869, 30887, 30905, 30923, - 30940, 30958, 30975, 30993, 31010, - 31028, 31045, 31062, 31079, 31096, - 31113, 31129, 31146, 31163, 31179, - 31196, 31212, 31228, 31245, 31261, - 31277, 31293, 31308, 31324, 31340, - 31356, 31371, 31387, 31402, 31417, - 31432, 31447, 31462, 31477, 31492, - 31507, 31522, 31536, 31551, 31565, - 31580, 31594, 31608, 31622, 31636, - 31650, 31664, 31678, 31691, 31705, - 31718, 31732, 31745, 31758, 31771, - 31785, 31797, 31810, 31823, 31836, - 31849, 31861, 31874, 31886, 31898, - 31911, 31923, 31935, 31947, 31959, - 31970, 31982, 31994, 32005, 32017, - 32028, 32039, 32050, 32062, 32073, - 32084, 32094, 32105, 32116, 32126, - 32137, 32147, 32158, 32168, 32178, - 32188, 32198, 32208, 32218, 32228, - 32237, 32247, 32256, 32266, 32275, - 32284, 32293, 32302, 32311, 32320, - 32329, 32338, 32346, 32355, 32363, - 32371, 32380, 32388, 32396, 32404, - 32412, 32420, 32427, 32435, 32443, - 32450, 32457, 32465, 32472, 32479, - 32486, 32493, 32500, 32507, 32513, - 32520, 32527, 32533, 32539, 32546, - 32552, 32558, 32564, 32570, 32576, - 32581, 32587, 32593, 32598, 32603, - 32609, 32614, 32619, 32624, 32629, - 32634, 32639, 32643, 32648, 32652, - 32657, 32661, 32665, 32670, 32674, - 32678, 32682, 32685, 32689, 32693, - 32696, 32700, 32703, 32706, 32710, - 32713, 32716, 32719, 32722, 32724, - 32727, 32730, 32732, 32735, 32737, - 32739, 32741, 32743, 32745, 32747, - 32749, 32751, 32752, 32754, 32755, - 32757, 32758, 32759, 32760, 32761, - 32762, 32763, 32764, 32764, 32765, - 32765, 32766, 32766, 32766, 32766 - }; - -const Word16 cos_scale_tbl_960[960] = /* Q15 */ - { - 32767, 32766, 32766, 32766, 32766, - 32765, 32765, 32764, 32764, 32763, - 32762, 32761, 32760, 32759, 32758, - 32757, 32755, 32754, 32752, 32751, - 32749, 32747, 32745, 32743, 32741, - 32739, 32737, 32735, 32732, 32730, - 32727, 32724, 32722, 32719, 32716, - 32713, 32710, 32706, 32703, 32700, - 32696, 32693, 32689, 32685, 32682, - 32678, 32674, 32670, 32665, 32661, - 32657, 32652, 32648, 32643, 32639, - 32634, 32629, 32624, 32619, 32614, - 32609, 32603, 32598, 32593, 32587, - 32581, 32576, 32570, 32564, 32558, - 32552, 32546, 32539, 32533, 32527, - 32520, 32513, 32507, 32500, 32493, - 32486, 32479, 32472, 32465, 32457, - 32450, 32443, 32435, 32427, 32420, - 32412, 32404, 32396, 32388, 32380, - 32371, 32363, 32355, 32346, 32338, - 32329, 32320, 32311, 32302, 32293, - 32284, 32275, 32266, 32256, 32247, - 32237, 32228, 32218, 32208, 32198, - 32188, 32178, 32168, 32158, 32147, - 32137, 32126, 32116, 32105, 32094, - 32084, 32073, 32062, 32050, 32039, - 32028, 32017, 32005, 31994, 31982, - 31970, 31959, 31947, 31935, 31923, - 31911, 31898, 31886, 31874, 31861, - 31849, 31836, 31823, 31810, 31797, - 31785, 31771, 31758, 31745, 31732, - 31718, 31705, 31691, 31678, 31664, - 31650, 31636, 31622, 31608, 31594, - 31580, 31565, 31551, 31536, 31522, - 31507, 31492, 31477, 31462, 31447, - 31432, 31417, 31402, 31387, 31371, - 31356, 31340, 31324, 31308, 31293, - 31277, 31261, 31245, 31228, 31212, - 31196, 31179, 31163, 31146, 31129, - 31113, 31096, 31079, 31062, 31045, - 31028, 31010, 30993, 30975, 30958, - 30940, 30923, 30905, 30887, 30869, - 30851, 30833, 30815, 30797, 30778, - 30760, 30741, 30723, 30704, 30685, - 30666, 30647, 30628, 30609, 30590, - 30571, 30552, 30532, 30513, 30493, - 30473, 30454, 30434, 30414, 30394, - 30374, 30354, 30333, 30313, 30293, - 30272, 30252, 30231, 30210, 30190, - 30169, 30148, 30127, 30106, 30084, - 30063, 30042, 30020, 29999, 29977, - 29955, 29934, 29912, 29890, 29868, - 29846, 29824, 29801, 29779, 29757, - 29734, 29712, 29689, 29666, 29643, - 29621, 29598, 29575, 29551, 29528, - 29505, 29482, 29458, 29435, 29411, - 29387, 29364, 29340, 29316, 29292, - 29268, 29244, 29219, 29195, 29171, - 29146, 29122, 29097, 29072, 29048, - 29023, 28998, 28973, 28948, 28923, - 28897, 28872, 28847, 28821, 28796, - 28770, 28744, 28719, 28693, 28667, - 28641, 28615, 28589, 28562, 28536, - 28510, 28483, 28457, 28430, 28403, - 28377, 28350, 28323, 28296, 28269, - 28242, 28214, 28187, 28160, 28132, - 28105, 28077, 28049, 28022, 27994, - 27966, 27938, 27910, 27882, 27854, - 27825, 27797, 27769, 27740, 27711, - 27683, 27654, 27625, 27596, 27567, - 27538, 27509, 27480, 27451, 27422, - 27392, 27363, 27333, 27304, 27274, - 27244, 27214, 27185, 27155, 27125, - 27094, 27064, 27034, 27004, 26973, - 26943, 26912, 26882, 26851, 26820, - 26789, 26758, 26727, 26696, 26665, - 26634, 26603, 26571, 26540, 26509, - 26477, 26445, 26414, 26382, 26350, - 26318, 26286, 26254, 26222, 26190, - 26158, 26125, 26093, 26060, 26028, - 25995, 25963, 25930, 25897, 25864, - 25831, 25798, 25765, 25732, 25699, - 25665, 25632, 25599, 25565, 25532, - 25498, 25464, 25430, 25397, 25363, - 25329, 25295, 25261, 25226, 25192, - 25158, 25123, 25089, 25054, 25020, - 24985, 24951, 24916, 24881, 24846, - 24811, 24776, 24741, 24706, 24670, - 24635, 24600, 24564, 24529, 24493, - 24457, 24422, 24386, 24350, 24314, - 24278, 24242, 24206, 24170, 24134, - 24097, 24061, 24025, 23988, 23952, - 23915, 23878, 23842, 23805, 23768, - 23731, 23694, 23657, 23620, 23583, - 23545, 23508, 23471, 23433, 23396, - 23358, 23320, 23283, 23245, 23207, - 23169, 23131, 23093, 23055, 23017, - 22979, 22941, 22902, 22864, 22826, - 22787, 22749, 22710, 22671, 22632, - 22594, 22555, 22516, 22477, 22438, - 22399, 22360, 22320, 22281, 22242, - 22202, 22163, 22123, 22084, 22044, - 22004, 21965, 21925, 21885, 21845, - 21805, 21765, 21725, 21685, 21645, - 21604, 21564, 21524, 21483, 21443, - 21402, 21361, 21321, 21280, 21239, - 21198, 21157, 21116, 21075, 21034, - 20993, 20952, 20911, 20869, 20828, - 20787, 20745, 20704, 20662, 20620, - 20579, 20537, 20495, 20453, 20411, - 20369, 20327, 20285, 20243, 20201, - 20159, 20116, 20074, 20032, 19989, - 19947, 19904, 19862, 19819, 19776, - 19733, 19691, 19648, 19605, 19562, - 19519, 19476, 19433, 19389, 19346, - 19303, 19259, 19216, 19173, 19129, - 19086, 19042, 18998, 18955, 18911, - 18867, 18823, 18779, 18735, 18691, - 18647, 18603, 18559, 18515, 18470, - 18426, 18382, 18337, 18293, 18248, - 18204, 18159, 18115, 18070, 18025, - 17980, 17936, 17891, 17846, 17801, - 17756, 17711, 17665, 17620, 17575, - 17530, 17484, 17439, 17394, 17348, - 17303, 17257, 17212, 17166, 17120, - 17074, 17029, 16983, 16937, 16891, - 16845, 16799, 16753, 16707, 16661, - 16615, 16568, 16522, 16476, 16429, - 16383, 16337, 16290, 16244, 16197, - 16150, 16104, 16057, 16010, 15963, - 15917, 15870, 15823, 15776, 15729, - 15682, 15635, 15587, 15540, 15493, - 15446, 15398, 15351, 15304, 15256, - 15209, 15161, 15114, 15066, 15019, - 14971, 14923, 14875, 14828, 14780, - 14732, 14684, 14636, 14588, 14540, - 14492, 14444, 14396, 14348, 14299, - 14251, 14203, 14154, 14106, 14058, - 14009, 13961, 13912, 13864, 13815, - 13766, 13718, 13669, 13620, 13571, - 13523, 13474, 13425, 13376, 13327, - 13278, 13229, 13180, 13131, 13082, - 13033, 12983, 12934, 12885, 12835, - 12786, 12737, 12687, 12638, 12588, - 12539, 12489, 12440, 12390, 12340, - 12291, 12241, 12191, 12142, 12092, - 12042, 11992, 11942, 11892, 11842, - 11792, 11742, 11692, 11642, 11592, - 11542, 11491, 11441, 11391, 11341, - 11290, 11240, 11190, 11139, 11089, - 11038, 10988, 10937, 10887, 10836, - 10786, 10735, 10684, 10634, 10583, - 10532, 10481, 10431, 10380, 10329, - 10278, 10227, 10176, 10125, 10074, - 10023, 9972, 9921, 9870, 9819, - 9767, 9716, 9665, 9614, 9563, - 9511, 9460, 9409, 9357, 9306, - 9254, 9203, 9151, 9100, 9048, - 8997, 8945, 8894, 8842, 8791, - 8739, 8687, 8635, 8584, 8532, - 8480, 8428, 8377, 8325, 8273, - 8221, 8169, 8117, 8065, 8013, - 7961, 7909, 7857, 7805, 7753, - 7701, 7649, 7597, 7544, 7492, - 7440, 7388, 7336, 7283, 7231, - 7179, 7126, 7074, 7022, 6969, - 6917, 6865, 6812, 6760, 6707, - 6655, 6602, 6550, 6497, 6445, - 6392, 6339, 6287, 6234, 6182, - 6129, 6076, 6024, 5971, 5918, - 5865, 5813, 5760, 5707, 5654, - 5601, 5549, 5496, 5443, 5390, - 5337, 5284, 5231, 5178, 5125, - 5072, 5019, 4966, 4913, 4860, - 4807, 4754, 4701, 4648, 4595, - 4542, 4489, 4436, 4383, 4330, - 4276, 4223, 4170, 4117, 4064, - 4011, 3957, 3904, 3851, 3798, - 3744, 3691, 3638, 3585, 3531, - 3478, 3425, 3371, 3318, 3265, - 3211, 3158, 3104, 3051, 2998, - 2944, 2891, 2838, 2784, 2731, - 2677, 2624, 2570, 2517, 2463, - 2410, 2357, 2303, 2250, 2196, - 2143, 2089, 2036, 1982, 1929, - 1875, 1821, 1768, 1714, 1661, - 1607, 1554, 1500, 1447, 1393, - 1339, 1286, 1232, 1179, 1125, - 1072, 1018, 964, 911, 857, - 804, 750, 696, 643, 589, - 536, 482, 428, 375, 321, - 268, 214, 160, 107, 53 - }; - -const Word16 cos_scale_tbl_640[640] = /* Q15 */ - { - 32767, 32766, 32766, 32766, 32765, - 32764, 32763, 32762, 32760, 32759, - 32757, 32755, 32752, 32750, 32747, - 32744, 32741, 32738, 32735, 32731, - 32727, 32723, 32719, 32714, 32710, - 32705, 32700, 32695, 32689, 32684, - 32678, 32672, 32665, 32659, 32652, - 32646, 32639, 32631, 32624, 32617, - 32609, 32601, 32593, 32584, 32576, - 32567, 32558, 32549, 32539, 32530, - 32520, 32510, 32500, 32490, 32479, - 32468, 32457, 32446, 32435, 32424, - 32412, 32400, 32388, 32376, 32363, - 32350, 32338, 32324, 32311, 32298, - 32284, 32270, 32256, 32242, 32228, - 32213, 32198, 32183, 32168, 32152, - 32137, 32121, 32105, 32089, 32073, - 32056, 32039, 32022, 32005, 31988, - 31970, 31953, 31935, 31917, 31898, - 31880, 31861, 31842, 31823, 31804, - 31785, 31765, 31745, 31725, 31705, - 31684, 31664, 31643, 31622, 31601, - 31580, 31558, 31536, 31514, 31492, - 31470, 31447, 31425, 31402, 31379, - 31356, 31332, 31308, 31285, 31261, - 31236, 31212, 31188, 31163, 31138, - 31113, 31087, 31062, 31036, 31010, - 30984, 30958, 30932, 30905, 30878, - 30851, 30824, 30797, 30769, 30741, - 30713, 30685, 30657, 30628, 30600, - 30571, 30542, 30513, 30483, 30454, - 30424, 30394, 30364, 30333, 30303, - 30272, 30241, 30210, 30179, 30148, - 30116, 30084, 30052, 30020, 29988, - 29955, 29923, 29890, 29857, 29824, - 29790, 29757, 29723, 29689, 29655, - 29621, 29586, 29551, 29517, 29482, - 29446, 29411, 29375, 29340, 29304, - 29268, 29232, 29195, 29159, 29122, - 29085, 29048, 29010, 28973, 28935, - 28897, 28859, 28821, 28783, 28744, - 28706, 28667, 28628, 28589, 28549, - 28510, 28470, 28430, 28390, 28350, - 28309, 28269, 28228, 28187, 28146, - 28105, 28063, 28022, 27980, 27938, - 27896, 27854, 27811, 27769, 27726, - 27683, 27640, 27596, 27553, 27509, - 27466, 27422, 27378, 27333, 27289, - 27244, 27200, 27155, 27109, 27064, - 27019, 26973, 26927, 26882, 26836, - 26789, 26743, 26696, 26650, 26603, - 26556, 26509, 26461, 26414, 26366, - 26318, 26270, 26222, 26174, 26125, - 26077, 26028, 25979, 25930, 25881, - 25831, 25782, 25732, 25682, 25632, - 25582, 25532, 25481, 25430, 25380, - 25329, 25278, 25226, 25175, 25123, - 25072, 25020, 24968, 24916, 24863, - 24811, 24758, 24706, 24653, 24600, - 24546, 24493, 24440, 24386, 24332, - 24278, 24224, 24170, 24116, 24061, - 24006, 23952, 23897, 23842, 23786, - 23731, 23675, 23620, 23564, 23508, - 23452, 23396, 23339, 23283, 23226, - 23169, 23112, 23055, 22998, 22941, - 22883, 22826, 22768, 22710, 22652, - 22594, 22535, 22477, 22418, 22360, - 22301, 22242, 22183, 22123, 22064, - 22004, 21945, 21885, 21825, 21765, - 21705, 21645, 21584, 21524, 21463, - 21402, 21341, 21280, 21219, 21157, - 21096, 21034, 20973, 20911, 20849, - 20787, 20724, 20662, 20600, 20537, - 20474, 20411, 20348, 20285, 20222, - 20159, 20095, 20032, 19968, 19904, - 19840, 19776, 19712, 19648, 19583, - 19519, 19454, 19389, 19324, 19259, - 19194, 19129, 19064, 18998, 18933, - 18867, 18801, 18735, 18669, 18603, - 18537, 18470, 18404, 18337, 18271, - 18204, 18137, 18070, 18003, 17936, - 17868, 17801, 17733, 17665, 17598, - 17530, 17462, 17394, 17325, 17257, - 17189, 17120, 17052, 16983, 16914, - 16845, 16776, 16707, 16638, 16568, - 16499, 16429, 16360, 16290, 16220, - 16150, 16080, 16010, 15940, 15870, - 15799, 15729, 15658, 15587, 15517, - 15446, 15375, 15304, 15233, 15161, - 15090, 15019, 14947, 14875, 14804, - 14732, 14660, 14588, 14516, 14444, - 14372, 14299, 14227, 14154, 14082, - 14009, 13936, 13864, 13791, 13718, - 13645, 13571, 13498, 13425, 13352, - 13278, 13204, 13131, 13057, 12983, - 12909, 12835, 12761, 12687, 12613, - 12539, 12465, 12390, 12316, 12241, - 12166, 12092, 12017, 11942, 11867, - 11792, 11717, 11642, 11567, 11491, - 11416, 11341, 11265, 11190, 11114, - 11038, 10963, 10887, 10811, 10735, - 10659, 10583, 10507, 10431, 10354, - 10278, 10202, 10125, 10049, 9972, - 9895, 9819, 9742, 9665, 9588, - 9511, 9434, 9357, 9280, 9203, - 9126, 9048, 8971, 8894, 8816, - 8739, 8661, 8584, 8506, 8428, - 8351, 8273, 8195, 8117, 8039, - 7961, 7883, 7805, 7727, 7649, - 7571, 7492, 7414, 7336, 7257, - 7179, 7100, 7022, 6943, 6865, - 6786, 6707, 6628, 6550, 6471, - 6392, 6313, 6234, 6155, 6076, - 5997, 5918, 5839, 5760, 5681, - 5601, 5522, 5443, 5364, 5284, - 5205, 5125, 5046, 4966, 4887, - 4807, 4728, 4648, 4569, 4489, - 4409, 4330, 4250, 4170, 4090, - 4011, 3931, 3851, 3771, 3691, - 3611, 3531, 3451, 3371, 3291, - 3211, 3131, 3051, 2971, 2891, - 2811, 2731, 2651, 2570, 2490, - 2410, 2330, 2250, 2169, 2089, - 2009, 1929, 1848, 1768, 1688, - 1607, 1527, 1447, 1366, 1286, - 1206, 1125, 1045, 964, 884, - 804, 723, 643, 562, 482, - 402, 321, 241, 160, 80 - }; - -const Word16 sin_scale_tbl_640[640] = /* Q15 */ - { - 0, 80, 160, 241, 321, - 402, 482, 562, 643, 723, - 804, 884, 964, 1045, 1125, - 1206, 1286, 1366, 1447, 1527, - 1607, 1688, 1768, 1848, 1929, - 2009, 2089, 2169, 2250, 2330, - 2410, 2490, 2570, 2651, 2731, - 2811, 2891, 2971, 3051, 3131, - 3211, 3291, 3371, 3451, 3531, - 3611, 3691, 3771, 3851, 3931, - 4011, 4090, 4170, 4250, 4330, - 4409, 4489, 4569, 4648, 4728, - 4807, 4887, 4966, 5046, 5125, - 5205, 5284, 5364, 5443, 5522, - 5601, 5681, 5760, 5839, 5918, - 5997, 6076, 6155, 6234, 6313, - 6392, 6471, 6550, 6628, 6707, - 6786, 6865, 6943, 7022, 7100, - 7179, 7257, 7336, 7414, 7492, - 7571, 7649, 7727, 7805, 7883, - 7961, 8039, 8117, 8195, 8273, - 8351, 8428, 8506, 8584, 8661, - 8739, 8816, 8894, 8971, 9048, - 9126, 9203, 9280, 9357, 9434, - 9511, 9588, 9665, 9742, 9819, - 9895, 9972, 10049, 10125, 10202, - 10278, 10354, 10431, 10507, 10583, - 10659, 10735, 10811, 10887, 10963, - 11038, 11114, 11190, 11265, 11341, - 11416, 11491, 11567, 11642, 11717, - 11792, 11867, 11942, 12017, 12092, - 12166, 12241, 12316, 12390, 12465, - 12539, 12613, 12687, 12761, 12835, - 12909, 12983, 13057, 13131, 13204, - 13278, 13352, 13425, 13498, 13571, - 13645, 13718, 13791, 13864, 13936, - 14009, 14082, 14154, 14227, 14299, - 14372, 14444, 14516, 14588, 14660, - 14732, 14804, 14875, 14947, 15019, - 15090, 15161, 15233, 15304, 15375, - 15446, 15517, 15587, 15658, 15729, - 15799, 15870, 15940, 16010, 16080, - 16150, 16220, 16290, 16360, 16429, - 16499, 16568, 16638, 16707, 16776, - 16845, 16914, 16983, 17052, 17120, - 17189, 17257, 17325, 17394, 17462, - 17530, 17598, 17665, 17733, 17801, - 17868, 17936, 18003, 18070, 18137, - 18204, 18271, 18337, 18404, 18470, - 18537, 18603, 18669, 18735, 18801, - 18867, 18933, 18998, 19064, 19129, - 19194, 19259, 19324, 19389, 19454, - 19519, 19583, 19648, 19712, 19776, - 19840, 19904, 19968, 20032, 20095, - 20159, 20222, 20285, 20348, 20411, - 20474, 20537, 20600, 20662, 20724, - 20787, 20849, 20911, 20973, 21034, - 21096, 21157, 21219, 21280, 21341, - 21402, 21463, 21524, 21584, 21645, - 21705, 21765, 21825, 21885, 21945, - 22004, 22064, 22123, 22183, 22242, - 22301, 22360, 22418, 22477, 22535, - 22594, 22652, 22710, 22768, 22826, - 22883, 22941, 22998, 23055, 23112, - 23169, 23226, 23283, 23339, 23396, - 23452, 23508, 23564, 23620, 23675, - 23731, 23786, 23842, 23897, 23952, - 24006, 24061, 24116, 24170, 24224, - 24278, 24332, 24386, 24440, 24493, - 24546, 24600, 24653, 24706, 24758, - 24811, 24863, 24916, 24968, 25020, - 25072, 25123, 25175, 25226, 25278, - 25329, 25380, 25430, 25481, 25532, - 25582, 25632, 25682, 25732, 25782, - 25831, 25881, 25930, 25979, 26028, - 26077, 26125, 26174, 26222, 26270, - 26318, 26366, 26414, 26461, 26509, - 26556, 26603, 26650, 26696, 26743, - 26789, 26836, 26882, 26927, 26973, - 27019, 27064, 27109, 27155, 27200, - 27244, 27289, 27333, 27378, 27422, - 27466, 27509, 27553, 27596, 27640, - 27683, 27726, 27769, 27811, 27854, - 27896, 27938, 27980, 28022, 28063, - 28105, 28146, 28187, 28228, 28269, - 28309, 28350, 28390, 28430, 28470, - 28510, 28549, 28589, 28628, 28667, - 28706, 28744, 28783, 28821, 28859, - 28897, 28935, 28973, 29010, 29048, - 29085, 29122, 29159, 29195, 29232, - 29268, 29304, 29340, 29375, 29411, - 29446, 29482, 29517, 29551, 29586, - 29621, 29655, 29689, 29723, 29757, - 29790, 29824, 29857, 29890, 29923, - 29955, 29988, 30020, 30052, 30084, - 30116, 30148, 30179, 30210, 30241, - 30272, 30303, 30333, 30364, 30394, - 30424, 30454, 30483, 30513, 30542, - 30571, 30600, 30628, 30657, 30685, - 30713, 30741, 30769, 30797, 30824, - 30851, 30878, 30905, 30932, 30958, - 30984, 31010, 31036, 31062, 31087, - 31113, 31138, 31163, 31188, 31212, - 31236, 31261, 31285, 31308, 31332, - 31356, 31379, 31402, 31425, 31447, - 31470, 31492, 31514, 31536, 31558, - 31580, 31601, 31622, 31643, 31664, - 31684, 31705, 31725, 31745, 31765, - 31785, 31804, 31823, 31842, 31861, - 31880, 31898, 31917, 31935, 31953, - 31970, 31988, 32005, 32022, 32039, - 32056, 32073, 32089, 32105, 32121, - 32137, 32152, 32168, 32183, 32198, - 32213, 32228, 32242, 32256, 32270, - 32284, 32298, 32311, 32324, 32338, - 32350, 32363, 32376, 32388, 32400, - 32412, 32424, 32435, 32446, 32457, - 32468, 32479, 32490, 32500, 32510, - 32520, 32530, 32539, 32549, 32558, - 32567, 32576, 32584, 32593, 32601, - 32609, 32617, 32624, 32631, 32639, - 32646, 32652, 32659, 32665, 32672, - 32678, 32684, 32689, 32695, 32700, - 32705, 32710, 32714, 32719, 32723, - 32727, 32731, 32735, 32738, 32741, - 32744, 32747, 32750, 32752, 32755, - 32757, 32759, 32760, 32762, 32763, - 32764, 32765, 32766, 32766, 32766 - }; - -const Word16 sin_scale_tbl_512[512] = /* Q15 */ - { - 0, 100, 201, 301, 402, - 502, 603, 703, 804, 904, - 1005, 1105, 1206, 1306, 1406, - 1507, 1607, 1708, 1808, 1908, - 2009, 2109, 2209, 2310, 2410, - 2510, 2610, 2711, 2811, 2911, - 3011, 3111, 3211, 3311, 3411, - 3511, 3611, 3711, 3811, 3911, - 4011, 4110, 4210, 4310, 4409, - 4509, 4608, 4708, 4807, 4907, - 5006, 5106, 5205, 5304, 5403, - 5502, 5601, 5700, 5799, 5898, - 5997, 6096, 6195, 6293, 6392, - 6491, 6589, 6688, 6786, 6884, - 6982, 7081, 7179, 7277, 7375, - 7473, 7571, 7668, 7766, 7864, - 7961, 8059, 8156, 8253, 8351, - 8448, 8545, 8642, 8739, 8836, - 8932, 9029, 9126, 9222, 9319, - 9415, 9511, 9607, 9703, 9799, - 9895, 9991, 10087, 10182, 10278, - 10373, 10469, 10564, 10659, 10754, - 10849, 10944, 11038, 11133, 11227, - 11322, 11416, 11510, 11604, 11698, - 11792, 11886, 11980, 12073, 12166, - 12260, 12353, 12446, 12539, 12632, - 12724, 12817, 12909, 13002, 13094, - 13186, 13278, 13370, 13462, 13553, - 13645, 13736, 13827, 13918, 14009, - 14100, 14191, 14281, 14372, 14462, - 14552, 14642, 14732, 14822, 14911, - 15001, 15090, 15179, 15268, 15357, - 15446, 15534, 15623, 15711, 15799, - 15887, 15975, 16063, 16150, 16238, - 16325, 16412, 16499, 16586, 16672, - 16759, 16845, 16931, 17017, 17103, - 17189, 17274, 17360, 17445, 17530, - 17615, 17699, 17784, 17868, 17952, - 18036, 18120, 18204, 18287, 18371, - 18454, 18537, 18620, 18702, 18785, - 18867, 18949, 19031, 19113, 19194, - 19276, 19357, 19438, 19519, 19599, - 19680, 19760, 19840, 19920, 20000, - 20079, 20159, 20238, 20317, 20396, - 20474, 20553, 20631, 20709, 20787, - 20864, 20942, 21019, 21096, 21173, - 21249, 21326, 21402, 21478, 21554, - 21629, 21705, 21780, 21855, 21930, - 22004, 22079, 22153, 22227, 22301, - 22374, 22448, 22521, 22594, 22666, - 22739, 22811, 22883, 22955, 23027, - 23098, 23169, 23240, 23311, 23382, - 23452, 23522, 23592, 23661, 23731, - 23800, 23869, 23938, 24006, 24075, - 24143, 24211, 24278, 24346, 24413, - 24480, 24546, 24613, 24679, 24745, - 24811, 24877, 24942, 25007, 25072, - 25136, 25201, 25265, 25329, 25392, - 25456, 25519, 25582, 25645, 25707, - 25769, 25831, 25893, 25954, 26016, - 26077, 26137, 26198, 26258, 26318, - 26378, 26437, 26497, 26556, 26615, - 26673, 26731, 26789, 26847, 26905, - 26962, 27019, 27076, 27132, 27188, - 27244, 27300, 27355, 27411, 27466, - 27520, 27575, 27629, 27683, 27736, - 27790, 27843, 27896, 27948, 28001, - 28053, 28105, 28156, 28208, 28259, - 28309, 28360, 28410, 28460, 28510, - 28559, 28608, 28657, 28706, 28754, - 28802, 28850, 28897, 28945, 28992, - 29038, 29085, 29131, 29177, 29222, - 29268, 29313, 29358, 29402, 29446, - 29490, 29534, 29577, 29621, 29663, - 29706, 29748, 29790, 29832, 29873, - 29915, 29955, 29996, 30036, 30076, - 30116, 30156, 30195, 30234, 30272, - 30311, 30349, 30386, 30424, 30461, - 30498, 30535, 30571, 30607, 30643, - 30678, 30713, 30748, 30783, 30817, - 30851, 30885, 30918, 30951, 30984, - 31017, 31049, 31081, 31113, 31144, - 31175, 31206, 31236, 31267, 31297, - 31326, 31356, 31385, 31413, 31442, - 31470, 31498, 31525, 31553, 31580, - 31606, 31633, 31659, 31684, 31710, - 31735, 31760, 31785, 31809, 31833, - 31856, 31880, 31903, 31926, 31948, - 31970, 31992, 32014, 32035, 32056, - 32077, 32097, 32117, 32137, 32156, - 32176, 32194, 32213, 32231, 32249, - 32267, 32284, 32301, 32318, 32334, - 32350, 32366, 32382, 32397, 32412, - 32426, 32441, 32455, 32468, 32482, - 32495, 32508, 32520, 32532, 32544, - 32556, 32567, 32578, 32588, 32599, - 32609, 32618, 32628, 32637, 32646, - 32654, 32662, 32670, 32678, 32685, - 32692, 32699, 32705, 32711, 32717, - 32722, 32727, 32732, 32736, 32740, - 32744, 32748, 32751, 32754, 32757, - 32759, 32761, 32763, 32764, 32765, - 32766, 32766 - }; - -const Word16 cos_scale_tbl_512[512] = /* Q15 */ - { - 32767, 32766, 32766, 32765, 32764, - 32763, 32761, 32759, 32757, 32754, - 32751, 32748, 32744, 32740, 32736, - 32732, 32727, 32722, 32717, 32711, - 32705, 32699, 32692, 32685, 32678, - 32670, 32662, 32654, 32646, 32637, - 32628, 32618, 32609, 32599, 32588, - 32578, 32567, 32556, 32544, 32532, - 32520, 32508, 32495, 32482, 32468, - 32455, 32441, 32426, 32412, 32397, - 32382, 32366, 32350, 32334, 32318, - 32301, 32284, 32267, 32249, 32231, - 32213, 32194, 32176, 32156, 32137, - 32117, 32097, 32077, 32056, 32035, - 32014, 31992, 31970, 31948, 31926, - 31903, 31880, 31856, 31833, 31809, - 31785, 31760, 31735, 31710, 31684, - 31659, 31633, 31606, 31580, 31553, - 31525, 31498, 31470, 31442, 31413, - 31385, 31356, 31326, 31297, 31267, - 31236, 31206, 31175, 31144, 31113, - 31081, 31049, 31017, 30984, 30951, - 30918, 30885, 30851, 30817, 30783, - 30748, 30713, 30678, 30643, 30607, - 30571, 30535, 30498, 30461, 30424, - 30386, 30349, 30311, 30272, 30234, - 30195, 30156, 30116, 30076, 30036, - 29996, 29955, 29915, 29873, 29832, - 29790, 29748, 29706, 29663, 29621, - 29577, 29534, 29490, 29446, 29402, - 29358, 29313, 29268, 29222, 29177, - 29131, 29085, 29038, 28992, 28945, - 28897, 28850, 28802, 28754, 28706, - 28657, 28608, 28559, 28510, 28460, - 28410, 28360, 28309, 28259, 28208, - 28156, 28105, 28053, 28001, 27948, - 27896, 27843, 27790, 27736, 27683, - 27629, 27575, 27520, 27466, 27411, - 27355, 27300, 27244, 27188, 27132, - 27076, 27019, 26962, 26905, 26847, - 26789, 26731, 26673, 26615, 26556, - 26497, 26437, 26378, 26318, 26258, - 26198, 26137, 26077, 26016, 25954, - 25893, 25831, 25769, 25707, 25645, - 25582, 25519, 25456, 25392, 25329, - 25265, 25201, 25136, 25072, 25007, - 24942, 24877, 24811, 24745, 24679, - 24613, 24546, 24480, 24413, 24346, - 24278, 24211, 24143, 24075, 24006, - 23938, 23869, 23800, 23731, 23661, - 23592, 23522, 23452, 23382, 23311, - 23240, 23169, 23098, 23027, 22955, - 22883, 22811, 22739, 22666, 22594, - 22521, 22448, 22374, 22301, 22227, - 22153, 22079, 22004, 21930, 21855, - 21780, 21705, 21629, 21554, 21478, - 21402, 21326, 21249, 21173, 21096, - 21019, 20942, 20864, 20787, 20709, - 20631, 20553, 20474, 20396, 20317, - 20238, 20159, 20079, 20000, 19920, - 19840, 19760, 19680, 19599, 19519, - 19438, 19357, 19276, 19194, 19113, - 19031, 18949, 18867, 18785, 18702, - 18620, 18537, 18454, 18371, 18287, - 18204, 18120, 18036, 17952, 17868, - 17784, 17699, 17615, 17530, 17445, - 17360, 17274, 17189, 17103, 17017, - 16931, 16845, 16759, 16672, 16586, - 16499, 16412, 16325, 16238, 16150, - 16063, 15975, 15887, 15799, 15711, - 15623, 15534, 15446, 15357, 15268, - 15179, 15090, 15001, 14911, 14822, - 14732, 14642, 14552, 14462, 14372, - 14281, 14191, 14100, 14009, 13918, - 13827, 13736, 13645, 13553, 13462, - 13370, 13278, 13186, 13094, 13002, - 12909, 12817, 12724, 12632, 12539, - 12446, 12353, 12260, 12166, 12073, - 11980, 11886, 11792, 11698, 11604, - 11510, 11416, 11322, 11227, 11133, - 11038, 10944, 10849, 10754, 10659, - 10564, 10469, 10373, 10278, 10182, - 10087, 9991, 9895, 9799, 9703, - 9607, 9511, 9415, 9319, 9222, - 9126, 9029, 8932, 8836, 8739, - 8642, 8545, 8448, 8351, 8253, - 8156, 8059, 7961, 7864, 7766, - 7668, 7571, 7473, 7375, 7277, - 7179, 7081, 6982, 6884, 6786, - 6688, 6589, 6491, 6392, 6293, - 6195, 6096, 5997, 5898, 5799, - 5700, 5601, 5502, 5403, 5304, - 5205, 5106, 5006, 4907, 4807, - 4708, 4608, 4509, 4409, 4310, - 4210, 4110, 4011, 3911, 3811, - 3711, 3611, 3511, 3411, 3311, - 3211, 3111, 3011, 2911, 2811, - 2711, 2610, 2510, 2410, 2310, - 2209, 2109, 2009, 1908, 1808, - 1708, 1607, 1507, 1406, 1306, - 1206, 1105, 1005, 904, 804, - 703, 603, 502, 402, 301, - 201, 100 - }; - -const Word16 sin_scale_tbl_1200[1200] = { /* Q15 */ - 0, 42, 85, 128, 171, 214, 257, 300, - 343, 386, 428, 471, 514, 557, 600, 643, - 686, 729, 771, 814, 857, 900, 943, 986, - 1029, 1072, 1114, 1157, 1200, 1243, 1286, 1329, - 1372, 1414, 1457, 1500, 1543, 1586, 1629, 1672, - 1714, 1757, 1800, 1843, 1886, 1929, 1971, 2014, - 2057, 2100, 2143, 2185, 2228, 2271, 2314, 2357, - 2399, 2442, 2485, 2528, 2570, 2613, 2656, 2699, - 2741, 2784, 2827, 2870, 2912, 2955, 2998, 3040, - 3083, 3126, 3169, 3211, 3254, 3297, 3339, 3382, - 3425, 3467, 3510, 3553, 3595, 3638, 3680, 3723, - 3766, 3808, 3851, 3893, 3936, 3979, 4021, 4064, - 4106, 4149, 4191, 4234, 4276, 4319, 4361, 4404, - 4446, 4489, 4531, 4574, 4616, 4659, 4701, 4744, - 4786, 4829, 4871, 4913, 4956, 4998, 5041, 5083, - 5125, 5168, 5210, 5252, 5295, 5337, 5379, 5422, - 5464, 5506, 5549, 5591, 5633, 5675, 5718, 5760, - 5802, 5844, 5886, 5929, 5971, 6013, 6055, 6097, - 6139, 6182, 6224, 6266, 6308, 6350, 6392, 6434, - 6476, 6518, 6560, 6602, 6644, 6686, 6728, 6770, - 6812, 6854, 6896, 6938, 6980, 7022, 7064, 7106, - 7147, 7189, 7231, 7273, 7315, 7357, 7398, 7440, - 7482, 7524, 7565, 7607, 7649, 7691, 7732, 7774, - 7816, 7857, 7899, 7940, 7982, 8024, 8065, 8107, - 8148, 8190, 8231, 8273, 8314, 8356, 8397, 8439, - 8480, 8522, 8563, 8604, 8646, 8687, 8729, 8770, - 8811, 8853, 8894, 8935, 8976, 9018, 9059, 9100, - 9141, 9182, 9224, 9265, 9306, 9347, 9388, 9429, - 9470, 9511, 9552, 9593, 9634, 9675, 9716, 9757, - 9798, 9839, 9880, 9921, 9962, 10003, 10043, 10084, - 10125, 10166, 10207, 10247, 10288, 10329, 10370, 10410, - 10451, 10491, 10532, 10573, 10613, 10654, 10694, 10735, - 10775, 10816, 10856, 10897, 10937, 10978, 11018, 11059, - 11099, 11139, 11180, 11220, 11260, 11300, 11341, 11381, - 11421, 11461, 11502, 11542, 11582, 11622, 11662, 11702, - 11742, 11782, 11822, 11862, 11902, 11942, 11982, 12022, - 12062, 12102, 12142, 12181, 12221, 12261, 12301, 12340, - 12380, 12420, 12460, 12499, 12539, 12579, 12618, 12658, - 12697, 12737, 12776, 12816, 12855, 12895, 12934, 12973, - 13013, 13052, 13092, 13131, 13170, 13209, 13249, 13288, - 13327, 13366, 13405, 13444, 13484, 13523, 13562, 13601, - 13640, 13679, 13718, 13757, 13796, 13834, 13873, 13912, - 13951, 13990, 14029, 14067, 14106, 14145, 14183, 14222, - 14261, 14299, 14338, 14376, 14415, 14453, 14492, 14530, - 14569, 14607, 14646, 14684, 14722, 14761, 14799, 14837, - 14875, 14914, 14952, 14990, 15028, 15066, 15104, 15142, - 15180, 15218, 15256, 15294, 15332, 15370, 15408, 15446, - 15484, 15521, 15559, 15597, 15635, 15672, 15710, 15748, - 15785, 15823, 15860, 15898, 15935, 15973, 16010, 16048, - 16085, 16122, 16160, 16197, 16234, 16271, 16309, 16346, - 16383, 16420, 16457, 16494, 16531, 16568, 16605, 16642, - 16679, 16716, 16753, 16790, 16827, 16863, 16900, 16937, - 16974, 17010, 17047, 17084, 17120, 17157, 17193, 17230, - 17266, 17303, 17339, 17375, 17412, 17448, 17484, 17521, - 17557, 17593, 17629, 17665, 17702, 17738, 17774, 17810, - 17846, 17882, 17918, 17953, 17989, 18025, 18061, 18097, - 18132, 18168, 18204, 18240, 18275, 18311, 18346, 18382, - 18417, 18453, 18488, 18524, 18559, 18594, 18630, 18665, - 18700, 18735, 18770, 18806, 18841, 18876, 18911, 18946, - 18981, 19016, 19051, 19086, 19120, 19155, 19190, 19225, - 19259, 19294, 19329, 19363, 19398, 19433, 19467, 19502, - 19536, 19570, 19605, 19639, 19673, 19708, 19742, 19776, - 19810, 19845, 19879, 19913, 19947, 19981, 20015, 20049, - 20083, 20117, 20150, 20184, 20218, 20252, 20285, 20319, - 20353, 20386, 20420, 20453, 20487, 20520, 20554, 20587, - 20620, 20654, 20687, 20720, 20753, 20787, 20820, 20853, - 20886, 20919, 20952, 20985, 21018, 21051, 21084, 21116, - 21149, 21182, 21215, 21247, 21280, 21313, 21345, 21378, - 21410, 21443, 21475, 21507, 21540, 21572, 21604, 21637, - 21669, 21701, 21733, 21765, 21797, 21829, 21861, 21893, - 21925, 21957, 21989, 22020, 22052, 22084, 22115, 22147, - 22179, 22210, 22242, 22273, 22305, 22336, 22367, 22399, - 22430, 22461, 22493, 22524, 22555, 22586, 22617, 22648, - 22679, 22710, 22741, 22772, 22802, 22833, 22864, 22895, - 22925, 22956, 22987, 23017, 23048, 23078, 23109, 23139, - 23169, 23200, 23230, 23260, 23290, 23320, 23351, 23381, - 23411, 23441, 23471, 23500, 23530, 23560, 23590, 23620, - 23649, 23679, 23709, 23738, 23768, 23797, 23827, 23856, - 23886, 23915, 23944, 23974, 24003, 24032, 24061, 24090, - 24119, 24148, 24177, 24206, 24235, 24264, 24293, 24321, - 24350, 24379, 24407, 24436, 24465, 24493, 24522, 24550, - 24578, 24607, 24635, 24663, 24692, 24720, 24748, 24776, - 24804, 24832, 24860, 24888, 24916, 24944, 24971, 24999, - 25027, 25054, 25082, 25110, 25137, 25165, 25192, 25220, - 25247, 25274, 25302, 25329, 25356, 25383, 25410, 25437, - 25464, 25491, 25518, 25545, 25572, 25599, 25625, 25652, - 25679, 25705, 25732, 25759, 25785, 25811, 25838, 25864, - 25891, 25917, 25943, 25969, 25995, 26021, 26047, 26073, - 26099, 26125, 26151, 26177, 26203, 26228, 26254, 26280, - 26305, 26331, 26356, 26382, 26407, 26433, 26458, 26483, - 26509, 26534, 26559, 26584, 26609, 26634, 26659, 26684, - 26709, 26734, 26758, 26783, 26808, 26832, 26857, 26882, - 26906, 26931, 26955, 26979, 27004, 27028, 27052, 27076, - 27100, 27125, 27149, 27173, 27197, 27220, 27244, 27268, - 27292, 27316, 27339, 27363, 27386, 27410, 27433, 27457, - 27480, 27504, 27527, 27550, 27573, 27596, 27620, 27643, - 27666, 27689, 27711, 27734, 27757, 27780, 27803, 27825, - 27848, 27871, 27893, 27916, 27938, 27960, 27983, 28005, - 28027, 28049, 28072, 28094, 28116, 28138, 28160, 28182, - 28203, 28225, 28247, 28269, 28290, 28312, 28334, 28355, - 28377, 28398, 28419, 28441, 28462, 28483, 28504, 28525, - 28547, 28568, 28589, 28610, 28630, 28651, 28672, 28693, - 28713, 28734, 28755, 28775, 28796, 28816, 28837, 28857, - 28877, 28897, 28918, 28938, 28958, 28978, 28998, 29018, - 29038, 29058, 29077, 29097, 29117, 29136, 29156, 29176, - 29195, 29215, 29234, 29253, 29273, 29292, 29311, 29330, - 29349, 29368, 29387, 29406, 29425, 29444, 29463, 29482, - 29500, 29519, 29537, 29556, 29575, 29593, 29611, 29630, - 29648, 29666, 29684, 29703, 29721, 29739, 29757, 29775, - 29792, 29810, 29828, 29846, 29863, 29881, 29899, 29916, - 29934, 29951, 29968, 29986, 30003, 30020, 30037, 30055, - 30072, 30089, 30106, 30122, 30139, 30156, 30173, 30190, - 30206, 30223, 30239, 30256, 30272, 30289, 30305, 30321, - 30338, 30354, 30370, 30386, 30402, 30418, 30434, 30450, - 30465, 30481, 30497, 30513, 30528, 30544, 30559, 30575, - 30590, 30605, 30621, 30636, 30651, 30666, 30681, 30696, - 30711, 30726, 30741, 30756, 30771, 30786, 30800, 30815, - 30829, 30844, 30858, 30873, 30887, 30901, 30916, 30930, - 30944, 30958, 30972, 30986, 31000, 31014, 31028, 31041, - 31055, 31069, 31082, 31096, 31109, 31123, 31136, 31149, - 31163, 31176, 31189, 31202, 31215, 31228, 31241, 31254, - 31267, 31280, 31293, 31305, 31318, 31331, 31343, 31356, - 31368, 31380, 31393, 31405, 31417, 31429, 31441, 31453, - 31465, 31477, 31489, 31501, 31513, 31525, 31536, 31548, - 31559, 31571, 31582, 31594, 31605, 31616, 31628, 31639, - 31650, 31661, 31672, 31683, 31694, 31705, 31716, 31726, - 31737, 31748, 31758, 31769, 31779, 31790, 31800, 31810, - 31821, 31831, 31841, 31851, 31861, 31871, 31881, 31891, - 31901, 31911, 31920, 31930, 31940, 31949, 31959, 31968, - 31977, 31987, 31996, 32005, 32014, 32023, 32033, 32042, - 32050, 32059, 32068, 32077, 32086, 32094, 32103, 32112, - 32120, 32128, 32137, 32145, 32154, 32162, 32170, 32178, - 32186, 32194, 32202, 32210, 32218, 32226, 32233, 32241, - 32249, 32256, 32264, 32271, 32279, 32286, 32293, 32300, - 32308, 32315, 32322, 32329, 32336, 32343, 32350, 32356, - 32363, 32370, 32376, 32383, 32389, 32396, 32402, 32409, - 32415, 32421, 32427, 32434, 32440, 32446, 32452, 32457, - 32463, 32469, 32475, 32481, 32486, 32492, 32497, 32503, - 32508, 32513, 32519, 32524, 32529, 32534, 32539, 32544, - 32549, 32554, 32559, 32564, 32569, 32573, 32578, 32582, - 32587, 32591, 32596, 32600, 32604, 32609, 32613, 32617, - 32621, 32625, 32629, 32633, 32637, 32641, 32644, 32648, - 32652, 32655, 32659, 32662, 32665, 32669, 32672, 32675, - 32679, 32682, 32685, 32688, 32691, 32694, 32696, 32699, - 32702, 32705, 32707, 32710, 32712, 32715, 32717, 32719, - 32722, 32724, 32726, 32728, 32730, 32732, 32734, 32736, - 32738, 32740, 32741, 32743, 32744, 32746, 32748, 32749, - 32750, 32752, 32753, 32754, 32755, 32756, 32757, 32758, - 32759, 32760, 32761, 32762, 32762, 32763, 32764, 32764, - 32765, 32765, 32765, 32766, 32766, 32766, 32766, 32766 -}; - -const Word16 cos_scale_tbl_1200[1200] = { /* Q15 */ - 0, 42, 85, 128, 171, 214, 257, 300, - 343, 386, 428, 471, 514, 557, 600, 643, - 686, 729, 771, 814, 857, 900, 943, 986, - 1029, 1072, 1114, 1157, 1200, 1243, 1286, 1329, - 1372, 1414, 1457, 1500, 1543, 1586, 1629, 1672, - 1714, 1757, 1800, 1843, 1886, 1929, 1971, 2014, - 2057, 2100, 2143, 2185, 2228, 2271, 2314, 2357, - 2399, 2442, 2485, 2528, 2570, 2613, 2656, 2699, - 2741, 2784, 2827, 2870, 2912, 2955, 2998, 3040, - 3083, 3126, 3169, 3211, 3254, 3297, 3339, 3382, - 3425, 3467, 3510, 3553, 3595, 3638, 3680, 3723, - 3766, 3808, 3851, 3893, 3936, 3979, 4021, 4064, - 4106, 4149, 4191, 4234, 4276, 4319, 4361, 4404, - 4446, 4489, 4531, 4574, 4616, 4659, 4701, 4744, - 4786, 4829, 4871, 4913, 4956, 4998, 5041, 5083, - 5125, 5168, 5210, 5252, 5295, 5337, 5379, 5422, - 5464, 5506, 5549, 5591, 5633, 5675, 5718, 5760, - 5802, 5844, 5886, 5929, 5971, 6013, 6055, 6097, - 6139, 6182, 6224, 6266, 6308, 6350, 6392, 6434, - 6476, 6518, 6560, 6602, 6644, 6686, 6728, 6770, - 6812, 6854, 6896, 6938, 6980, 7022, 7064, 7106, - 7147, 7189, 7231, 7273, 7315, 7357, 7398, 7440, - 7482, 7524, 7565, 7607, 7649, 7691, 7732, 7774, - 7816, 7857, 7899, 7940, 7982, 8024, 8065, 8107, - 8148, 8190, 8231, 8273, 8314, 8356, 8397, 8439, - 8480, 8522, 8563, 8604, 8646, 8687, 8729, 8770, - 8811, 8853, 8894, 8935, 8976, 9018, 9059, 9100, - 9141, 9182, 9224, 9265, 9306, 9347, 9388, 9429, - 9470, 9511, 9552, 9593, 9634, 9675, 9716, 9757, - 9798, 9839, 9880, 9921, 9962, 10003, 10043, 10084, - 10125, 10166, 10207, 10247, 10288, 10329, 10370, 10410, - 10451, 10491, 10532, 10573, 10613, 10654, 10694, 10735, - 10775, 10816, 10856, 10897, 10937, 10978, 11018, 11059, - 11099, 11139, 11180, 11220, 11260, 11300, 11341, 11381, - 11421, 11461, 11502, 11542, 11582, 11622, 11662, 11702, - 11742, 11782, 11822, 11862, 11902, 11942, 11982, 12022, - 12062, 12102, 12142, 12181, 12221, 12261, 12301, 12340, - 12380, 12420, 12460, 12499, 12539, 12579, 12618, 12658, - 12697, 12737, 12776, 12816, 12855, 12895, 12934, 12973, - 13013, 13052, 13092, 13131, 13170, 13209, 13249, 13288, - 13327, 13366, 13405, 13444, 13484, 13523, 13562, 13601, - 13640, 13679, 13718, 13757, 13796, 13834, 13873, 13912, - 13951, 13990, 14029, 14067, 14106, 14145, 14183, 14222, - 14261, 14299, 14338, 14376, 14415, 14453, 14492, 14530, - 14569, 14607, 14646, 14684, 14722, 14761, 14799, 14837, - 14875, 14914, 14952, 14990, 15028, 15066, 15104, 15142, - 15180, 15218, 15256, 15294, 15332, 15370, 15408, 15446, - 15484, 15521, 15559, 15597, 15635, 15672, 15710, 15748, - 15785, 15823, 15860, 15898, 15935, 15973, 16010, 16048, - 16085, 16122, 16160, 16197, 16234, 16271, 16309, 16346, - 16383, 16420, 16457, 16494, 16531, 16568, 16605, 16642, - 16679, 16716, 16753, 16790, 16827, 16863, 16900, 16937, - 16974, 17010, 17047, 17084, 17120, 17157, 17193, 17230, - 17266, 17303, 17339, 17375, 17412, 17448, 17484, 17521, - 17557, 17593, 17629, 17665, 17702, 17738, 17774, 17810, - 17846, 17882, 17918, 17953, 17989, 18025, 18061, 18097, - 18132, 18168, 18204, 18240, 18275, 18311, 18346, 18382, - 18417, 18453, 18488, 18524, 18559, 18594, 18630, 18665, - 18700, 18735, 18770, 18806, 18841, 18876, 18911, 18946, - 18981, 19016, 19051, 19086, 19120, 19155, 19190, 19225, - 19259, 19294, 19329, 19363, 19398, 19433, 19467, 19502, - 19536, 19570, 19605, 19639, 19673, 19708, 19742, 19776, - 19810, 19845, 19879, 19913, 19947, 19981, 20015, 20049, - 20083, 20117, 20150, 20184, 20218, 20252, 20285, 20319, - 20353, 20386, 20420, 20453, 20487, 20520, 20554, 20587, - 20620, 20654, 20687, 20720, 20753, 20787, 20820, 20853, - 20886, 20919, 20952, 20985, 21018, 21051, 21084, 21116, - 21149, 21182, 21215, 21247, 21280, 21313, 21345, 21378, - 21410, 21443, 21475, 21507, 21540, 21572, 21604, 21637, - 21669, 21701, 21733, 21765, 21797, 21829, 21861, 21893, - 21925, 21957, 21989, 22020, 22052, 22084, 22115, 22147, - 22179, 22210, 22242, 22273, 22305, 22336, 22367, 22399, - 22430, 22461, 22493, 22524, 22555, 22586, 22617, 22648, - 22679, 22710, 22741, 22772, 22802, 22833, 22864, 22895, - 22925, 22956, 22987, 23017, 23048, 23078, 23109, 23139, - 23169, 23200, 23230, 23260, 23290, 23320, 23351, 23381, - 23411, 23441, 23471, 23500, 23530, 23560, 23590, 23620, - 23649, 23679, 23709, 23738, 23768, 23797, 23827, 23856, - 23886, 23915, 23944, 23974, 24003, 24032, 24061, 24090, - 24119, 24148, 24177, 24206, 24235, 24264, 24293, 24321, - 24350, 24379, 24407, 24436, 24465, 24493, 24522, 24550, - 24578, 24607, 24635, 24663, 24692, 24720, 24748, 24776, - 24804, 24832, 24860, 24888, 24916, 24944, 24971, 24999, - 25027, 25054, 25082, 25110, 25137, 25165, 25192, 25220, - 25247, 25274, 25302, 25329, 25356, 25383, 25410, 25437, - 25464, 25491, 25518, 25545, 25572, 25599, 25625, 25652, - 25679, 25705, 25732, 25759, 25785, 25811, 25838, 25864, - 25891, 25917, 25943, 25969, 25995, 26021, 26047, 26073, - 26099, 26125, 26151, 26177, 26203, 26228, 26254, 26280, - 26305, 26331, 26356, 26382, 26407, 26433, 26458, 26483, - 26509, 26534, 26559, 26584, 26609, 26634, 26659, 26684, - 26709, 26734, 26758, 26783, 26808, 26832, 26857, 26882, - 26906, 26931, 26955, 26979, 27004, 27028, 27052, 27076, - 27100, 27125, 27149, 27173, 27197, 27220, 27244, 27268, - 27292, 27316, 27339, 27363, 27386, 27410, 27433, 27457, - 27480, 27504, 27527, 27550, 27573, 27596, 27620, 27643, - 27666, 27689, 27711, 27734, 27757, 27780, 27803, 27825, - 27848, 27871, 27893, 27916, 27938, 27960, 27983, 28005, - 28027, 28049, 28072, 28094, 28116, 28138, 28160, 28182, - 28203, 28225, 28247, 28269, 28290, 28312, 28334, 28355, - 28377, 28398, 28419, 28441, 28462, 28483, 28504, 28525, - 28547, 28568, 28589, 28610, 28630, 28651, 28672, 28693, - 28713, 28734, 28755, 28775, 28796, 28816, 28837, 28857, - 28877, 28897, 28918, 28938, 28958, 28978, 28998, 29018, - 29038, 29058, 29077, 29097, 29117, 29136, 29156, 29176, - 29195, 29215, 29234, 29253, 29273, 29292, 29311, 29330, - 29349, 29368, 29387, 29406, 29425, 29444, 29463, 29482, - 29500, 29519, 29537, 29556, 29575, 29593, 29611, 29630, - 29648, 29666, 29684, 29703, 29721, 29739, 29757, 29775, - 29792, 29810, 29828, 29846, 29863, 29881, 29899, 29916, - 29934, 29951, 29968, 29986, 30003, 30020, 30037, 30055, - 30072, 30089, 30106, 30122, 30139, 30156, 30173, 30190, - 30206, 30223, 30239, 30256, 30272, 30289, 30305, 30321, - 30338, 30354, 30370, 30386, 30402, 30418, 30434, 30450, - 30465, 30481, 30497, 30513, 30528, 30544, 30559, 30575, - 30590, 30605, 30621, 30636, 30651, 30666, 30681, 30696, - 30711, 30726, 30741, 30756, 30771, 30786, 30800, 30815, - 30829, 30844, 30858, 30873, 30887, 30901, 30916, 30930, - 30944, 30958, 30972, 30986, 31000, 31014, 31028, 31041, - 31055, 31069, 31082, 31096, 31109, 31123, 31136, 31149, - 31163, 31176, 31189, 31202, 31215, 31228, 31241, 31254, - 31267, 31280, 31293, 31305, 31318, 31331, 31343, 31356, - 31368, 31380, 31393, 31405, 31417, 31429, 31441, 31453, - 31465, 31477, 31489, 31501, 31513, 31525, 31536, 31548, - 31559, 31571, 31582, 31594, 31605, 31616, 31628, 31639, - 31650, 31661, 31672, 31683, 31694, 31705, 31716, 31726, - 31737, 31748, 31758, 31769, 31779, 31790, 31800, 31810, - 31821, 31831, 31841, 31851, 31861, 31871, 31881, 31891, - 31901, 31911, 31920, 31930, 31940, 31949, 31959, 31968, - 31977, 31987, 31996, 32005, 32014, 32023, 32033, 32042, - 32050, 32059, 32068, 32077, 32086, 32094, 32103, 32112, - 32120, 32128, 32137, 32145, 32154, 32162, 32170, 32178, - 32186, 32194, 32202, 32210, 32218, 32226, 32233, 32241, - 32249, 32256, 32264, 32271, 32279, 32286, 32293, 32300, - 32308, 32315, 32322, 32329, 32336, 32343, 32350, 32356, - 32363, 32370, 32376, 32383, 32389, 32396, 32402, 32409, - 32415, 32421, 32427, 32434, 32440, 32446, 32452, 32457, - 32463, 32469, 32475, 32481, 32486, 32492, 32497, 32503, - 32508, 32513, 32519, 32524, 32529, 32534, 32539, 32544, - 32549, 32554, 32559, 32564, 32569, 32573, 32578, 32582, - 32587, 32591, 32596, 32600, 32604, 32609, 32613, 32617, - 32621, 32625, 32629, 32633, 32637, 32641, 32644, 32648, - 32652, 32655, 32659, 32662, 32665, 32669, 32672, 32675, - 32679, 32682, 32685, 32688, 32691, 32694, 32696, 32699, - 32702, 32705, 32707, 32710, 32712, 32715, 32717, 32719, - 32722, 32724, 32726, 32728, 32730, 32732, 32734, 32736, - 32738, 32740, 32741, 32743, 32744, 32746, 32748, 32749, - 32750, 32752, 32753, 32754, 32755, 32756, 32757, 32758, - 32759, 32760, 32761, 32762, 32762, 32763, 32764, 32764, - 32765, 32765, 32765, 32766, 32766, 32766, 32766, 32766 -}; - -const Word16 sin_scale_tbl_800[800] = { /* Q15 */ - 0, 64, 128, 193, 257, 321, 386, 450, - 514, 579, 643, 707, 771, 836, 900, 964, - 1029, 1093, 1157, 1222, 1286, 1350, 1414, 1479, - 1543, 1607, 1672, 1736, 1800, 1864, 1929, 1993, - 2057, 2121, 2185, 2250, 2314, 2378, 2442, 2506, - 2570, 2635, 2699, 2763, 2827, 2891, 2955, 3019, - 3083, 3147, 3211, 3275, 3339, 3403, 3467, 3531, - 3595, 3659, 3723, 3787, 3851, 3915, 3979, 4042, - 4106, 4170, 4234, 4298, 4361, 4425, 4489, 4553, - 4616, 4680, 4744, 4807, 4871, 4935, 4998, 5062, - 5125, 5189, 5252, 5316, 5379, 5443, 5506, 5570, - 5633, 5696, 5760, 5823, 5886, 5950, 6013, 6076, - 6139, 6203, 6266, 6329, 6392, 6455, 6518, 6581, - 6644, 6707, 6770, 6833, 6896, 6959, 7022, 7085, - 7147, 7210, 7273, 7336, 7398, 7461, 7524, 7586, - 7649, 7711, 7774, 7836, 7899, 7961, 8024, 8086, - 8148, 8211, 8273, 8335, 8397, 8460, 8522, 8584, - 8646, 8708, 8770, 8832, 8894, 8956, 9018, 9079, - 9141, 9203, 9265, 9326, 9388, 9450, 9511, 9573, - 9634, 9696, 9757, 9819, 9880, 9941, 10003, 10064, - 10125, 10186, 10247, 10308, 10370, 10431, 10491, 10552, - 10613, 10674, 10735, 10796, 10856, 10917, 10978, 11038, - 11099, 11159, 11220, 11280, 11341, 11401, 11461, 11522, - 11582, 11642, 11702, 11762, 11822, 11882, 11942, 12002, - 12062, 12122, 12181, 12241, 12301, 12360, 12420, 12479, - 12539, 12598, 12658, 12717, 12776, 12835, 12895, 12954, - 13013, 13072, 13131, 13190, 13249, 13307, 13366, 13425, - 13484, 13542, 13601, 13659, 13718, 13776, 13834, 13893, - 13951, 14009, 14067, 14125, 14183, 14241, 14299, 14357, - 14415, 14473, 14530, 14588, 14646, 14703, 14761, 14818, - 14875, 14933, 14990, 15047, 15104, 15161, 15218, 15275, - 15332, 15389, 15446, 15502, 15559, 15616, 15672, 15729, - 15785, 15841, 15898, 15954, 16010, 16066, 16122, 16178, - 16234, 16290, 16346, 16402, 16457, 16513, 16568, 16624, - 16679, 16735, 16790, 16845, 16900, 16955, 17010, 17065, - 17120, 17175, 17230, 17284, 17339, 17394, 17448, 17503, - 17557, 17611, 17665, 17720, 17774, 17828, 17882, 17936, - 17989, 18043, 18097, 18150, 18204, 18257, 18311, 18364, - 18417, 18470, 18524, 18577, 18630, 18682, 18735, 18788, - 18841, 18893, 18946, 18998, 19051, 19103, 19155, 19207, - 19259, 19311, 19363, 19415, 19467, 19519, 19570, 19622, - 19673, 19725, 19776, 19827, 19879, 19930, 19981, 20032, - 20083, 20133, 20184, 20235, 20285, 20336, 20386, 20437, - 20487, 20537, 20587, 20637, 20687, 20737, 20787, 20836, - 20886, 20936, 20985, 21034, 21084, 21133, 21182, 21231, - 21280, 21329, 21378, 21426, 21475, 21524, 21572, 21620, - 21669, 21717, 21765, 21813, 21861, 21909, 21957, 22004, - 22052, 22100, 22147, 22194, 22242, 22289, 22336, 22383, - 22430, 22477, 22524, 22570, 22617, 22663, 22710, 22756, - 22802, 22849, 22895, 22941, 22987, 23032, 23078, 23124, - 23169, 23215, 23260, 23305, 23351, 23396, 23441, 23486, - 23530, 23575, 23620, 23664, 23709, 23753, 23797, 23842, - 23886, 23930, 23974, 24017, 24061, 24105, 24148, 24192, - 24235, 24278, 24321, 24364, 24407, 24450, 24493, 24536, - 24578, 24621, 24663, 24706, 24748, 24790, 24832, 24874, - 24916, 24957, 24999, 25041, 25082, 25123, 25165, 25206, - 25247, 25288, 25329, 25370, 25410, 25451, 25491, 25532, - 25572, 25612, 25652, 25692, 25732, 25772, 25811, 25851, - 25891, 25930, 25969, 26008, 26047, 26086, 26125, 26164, - 26203, 26241, 26280, 26318, 26356, 26395, 26433, 26471, - 26509, 26546, 26584, 26622, 26659, 26696, 26734, 26771, - 26808, 26845, 26882, 26918, 26955, 26991, 27028, 27064, - 27100, 27137, 27173, 27208, 27244, 27280, 27316, 27351, - 27386, 27422, 27457, 27492, 27527, 27562, 27596, 27631, - 27666, 27700, 27734, 27769, 27803, 27837, 27871, 27904, - 27938, 27972, 28005, 28038, 28072, 28105, 28138, 28171, - 28203, 28236, 28269, 28301, 28334, 28366, 28398, 28430, - 28462, 28494, 28525, 28557, 28589, 28620, 28651, 28682, - 28713, 28744, 28775, 28806, 28837, 28867, 28897, 28928, - 28958, 28988, 29018, 29048, 29077, 29107, 29136, 29166, - 29195, 29224, 29253, 29282, 29311, 29340, 29368, 29397, - 29425, 29453, 29482, 29510, 29537, 29565, 29593, 29621, - 29648, 29675, 29703, 29730, 29757, 29784, 29810, 29837, - 29863, 29890, 29916, 29942, 29968, 29994, 30020, 30046, - 30072, 30097, 30122, 30148, 30173, 30198, 30223, 30248, - 30272, 30297, 30321, 30346, 30370, 30394, 30418, 30442, - 30465, 30489, 30513, 30536, 30559, 30582, 30605, 30628, - 30651, 30674, 30696, 30719, 30741, 30763, 30786, 30807, - 30829, 30851, 30873, 30894, 30916, 30937, 30958, 30979, - 31000, 31021, 31041, 31062, 31082, 31103, 31123, 31143, - 31163, 31183, 31202, 31222, 31241, 31261, 31280, 31299, - 31318, 31337, 31356, 31374, 31393, 31411, 31429, 31447, - 31465, 31483, 31501, 31519, 31536, 31554, 31571, 31588, - 31605, 31622, 31639, 31656, 31672, 31689, 31705, 31721, - 31737, 31753, 31769, 31785, 31800, 31816, 31831, 31846, - 31861, 31876, 31891, 31906, 31920, 31935, 31949, 31963, - 31977, 31991, 32005, 32019, 32033, 32046, 32059, 32073, - 32086, 32099, 32112, 32124, 32137, 32149, 32162, 32174, - 32186, 32198, 32210, 32222, 32233, 32245, 32256, 32267, - 32279, 32290, 32300, 32311, 32322, 32332, 32343, 32353, - 32363, 32373, 32383, 32393, 32402, 32412, 32421, 32430, - 32440, 32449, 32457, 32466, 32475, 32483, 32492, 32500, - 32508, 32516, 32524, 32532, 32539, 32547, 32554, 32561, - 32569, 32576, 32582, 32589, 32596, 32602, 32609, 32615, - 32621, 32627, 32633, 32639, 32644, 32650, 32655, 32660, - 32665, 32670, 32675, 32680, 32685, 32689, 32694, 32698, - 32702, 32706, 32710, 32713, 32717, 32720, 32724, 32727, - 32730, 32733, 32736, 32739, 32741, 32744, 32746, 32748, - 32750, 32752, 32754, 32756, 32757, 32759, 32760, 32761, - 32762, 32763, 32764, 32765, 32765, 32766, 32766, 32766 -}; - -const Word16 cos_scale_tbl_800[800] = { /* Q15 */ - 0, 64, 128, 193, 257, 321, 386, 450, - 514, 579, 643, 707, 771, 836, 900, 964, - 1029, 1093, 1157, 1222, 1286, 1350, 1414, 1479, - 1543, 1607, 1672, 1736, 1800, 1864, 1929, 1993, - 2057, 2121, 2185, 2250, 2314, 2378, 2442, 2506, - 2570, 2635, 2699, 2763, 2827, 2891, 2955, 3019, - 3083, 3147, 3211, 3275, 3339, 3403, 3467, 3531, - 3595, 3659, 3723, 3787, 3851, 3915, 3979, 4042, - 4106, 4170, 4234, 4298, 4361, 4425, 4489, 4553, - 4616, 4680, 4744, 4807, 4871, 4935, 4998, 5062, - 5125, 5189, 5252, 5316, 5379, 5443, 5506, 5570, - 5633, 5696, 5760, 5823, 5886, 5950, 6013, 6076, - 6139, 6203, 6266, 6329, 6392, 6455, 6518, 6581, - 6644, 6707, 6770, 6833, 6896, 6959, 7022, 7085, - 7147, 7210, 7273, 7336, 7398, 7461, 7524, 7586, - 7649, 7711, 7774, 7836, 7899, 7961, 8024, 8086, - 8148, 8211, 8273, 8335, 8397, 8460, 8522, 8584, - 8646, 8708, 8770, 8832, 8894, 8956, 9018, 9079, - 9141, 9203, 9265, 9326, 9388, 9450, 9511, 9573, - 9634, 9696, 9757, 9819, 9880, 9941, 10003, 10064, - 10125, 10186, 10247, 10308, 10370, 10431, 10491, 10552, - 10613, 10674, 10735, 10796, 10856, 10917, 10978, 11038, - 11099, 11159, 11220, 11280, 11341, 11401, 11461, 11522, - 11582, 11642, 11702, 11762, 11822, 11882, 11942, 12002, - 12062, 12122, 12181, 12241, 12301, 12360, 12420, 12479, - 12539, 12598, 12658, 12717, 12776, 12835, 12895, 12954, - 13013, 13072, 13131, 13190, 13249, 13307, 13366, 13425, - 13484, 13542, 13601, 13659, 13718, 13776, 13834, 13893, - 13951, 14009, 14067, 14125, 14183, 14241, 14299, 14357, - 14415, 14473, 14530, 14588, 14646, 14703, 14761, 14818, - 14875, 14933, 14990, 15047, 15104, 15161, 15218, 15275, - 15332, 15389, 15446, 15502, 15559, 15616, 15672, 15729, - 15785, 15841, 15898, 15954, 16010, 16066, 16122, 16178, - 16234, 16290, 16346, 16402, 16457, 16513, 16568, 16624, - 16679, 16735, 16790, 16845, 16900, 16955, 17010, 17065, - 17120, 17175, 17230, 17284, 17339, 17394, 17448, 17503, - 17557, 17611, 17665, 17720, 17774, 17828, 17882, 17936, - 17989, 18043, 18097, 18150, 18204, 18257, 18311, 18364, - 18417, 18470, 18524, 18577, 18630, 18682, 18735, 18788, - 18841, 18893, 18946, 18998, 19051, 19103, 19155, 19207, - 19259, 19311, 19363, 19415, 19467, 19519, 19570, 19622, - 19673, 19725, 19776, 19827, 19879, 19930, 19981, 20032, - 20083, 20133, 20184, 20235, 20285, 20336, 20386, 20437, - 20487, 20537, 20587, 20637, 20687, 20737, 20787, 20836, - 20886, 20936, 20985, 21034, 21084, 21133, 21182, 21231, - 21280, 21329, 21378, 21426, 21475, 21524, 21572, 21620, - 21669, 21717, 21765, 21813, 21861, 21909, 21957, 22004, - 22052, 22100, 22147, 22194, 22242, 22289, 22336, 22383, - 22430, 22477, 22524, 22570, 22617, 22663, 22710, 22756, - 22802, 22849, 22895, 22941, 22987, 23032, 23078, 23124, - 23169, 23215, 23260, 23305, 23351, 23396, 23441, 23486, - 23530, 23575, 23620, 23664, 23709, 23753, 23797, 23842, - 23886, 23930, 23974, 24017, 24061, 24105, 24148, 24192, - 24235, 24278, 24321, 24364, 24407, 24450, 24493, 24536, - 24578, 24621, 24663, 24706, 24748, 24790, 24832, 24874, - 24916, 24957, 24999, 25041, 25082, 25123, 25165, 25206, - 25247, 25288, 25329, 25370, 25410, 25451, 25491, 25532, - 25572, 25612, 25652, 25692, 25732, 25772, 25811, 25851, - 25891, 25930, 25969, 26008, 26047, 26086, 26125, 26164, - 26203, 26241, 26280, 26318, 26356, 26395, 26433, 26471, - 26509, 26546, 26584, 26622, 26659, 26696, 26734, 26771, - 26808, 26845, 26882, 26918, 26955, 26991, 27028, 27064, - 27100, 27137, 27173, 27208, 27244, 27280, 27316, 27351, - 27386, 27422, 27457, 27492, 27527, 27562, 27596, 27631, - 27666, 27700, 27734, 27769, 27803, 27837, 27871, 27904, - 27938, 27972, 28005, 28038, 28072, 28105, 28138, 28171, - 28203, 28236, 28269, 28301, 28334, 28366, 28398, 28430, - 28462, 28494, 28525, 28557, 28589, 28620, 28651, 28682, - 28713, 28744, 28775, 28806, 28837, 28867, 28897, 28928, - 28958, 28988, 29018, 29048, 29077, 29107, 29136, 29166, - 29195, 29224, 29253, 29282, 29311, 29340, 29368, 29397, - 29425, 29453, 29482, 29510, 29537, 29565, 29593, 29621, - 29648, 29675, 29703, 29730, 29757, 29784, 29810, 29837, - 29863, 29890, 29916, 29942, 29968, 29994, 30020, 30046, - 30072, 30097, 30122, 30148, 30173, 30198, 30223, 30248, - 30272, 30297, 30321, 30346, 30370, 30394, 30418, 30442, - 30465, 30489, 30513, 30536, 30559, 30582, 30605, 30628, - 30651, 30674, 30696, 30719, 30741, 30763, 30786, 30807, - 30829, 30851, 30873, 30894, 30916, 30937, 30958, 30979, - 31000, 31021, 31041, 31062, 31082, 31103, 31123, 31143, - 31163, 31183, 31202, 31222, 31241, 31261, 31280, 31299, - 31318, 31337, 31356, 31374, 31393, 31411, 31429, 31447, - 31465, 31483, 31501, 31519, 31536, 31554, 31571, 31588, - 31605, 31622, 31639, 31656, 31672, 31689, 31705, 31721, - 31737, 31753, 31769, 31785, 31800, 31816, 31831, 31846, - 31861, 31876, 31891, 31906, 31920, 31935, 31949, 31963, - 31977, 31991, 32005, 32019, 32033, 32046, 32059, 32073, - 32086, 32099, 32112, 32124, 32137, 32149, 32162, 32174, - 32186, 32198, 32210, 32222, 32233, 32245, 32256, 32267, - 32279, 32290, 32300, 32311, 32322, 32332, 32343, 32353, - 32363, 32373, 32383, 32393, 32402, 32412, 32421, 32430, - 32440, 32449, 32457, 32466, 32475, 32483, 32492, 32500, - 32508, 32516, 32524, 32532, 32539, 32547, 32554, 32561, - 32569, 32576, 32582, 32589, 32596, 32602, 32609, 32615, - 32621, 32627, 32633, 32639, 32644, 32650, 32655, 32660, - 32665, 32670, 32675, 32680, 32685, 32689, 32694, 32698, - 32702, 32706, 32710, 32713, 32717, 32720, 32724, 32727, - 32730, 32733, 32736, 32739, 32741, 32744, 32746, 32748, - 32750, 32752, 32754, 32756, 32757, 32759, 32760, 32761, - 32762, 32763, 32764, 32765, 32765, 32766, 32766, 32766 -}; - -const Word16 scales_ivas_fx[][MAX_NO_SCALES * 2] = /* 2 subvectors Q11*/ - { - { - 3129, - 0, - 0, - 3137, - 0, - 0, - }, - { - 3287, - 0, - 0, - 3137, - 0, - 0, - }, - { - 2611, - 5033, - 0, - 3137, - 0, - 0, - }, - { - 2611, - 5033, - 0, - 3340, - 0, - 0, - }, - { - 2164, - 3674, - 5931, - 2363, - 3809, - 6281, - }, - { - 1898, - 2985, - 4745, - 2115, - 3667, - 7045, - }, - { - 2629, - 5480, - 0, - 2971, - 0, - 0, - }, - { - 2801, - 0, - 0, - 2869, - 5072, - 0, - }, - { - 1763, - 2545, - 3723, - 2514, - 4558, - 21108, - }, - { - 2195, - 3960, - 7440, - 2500, - 6017, - 21960, - }, - { - 1841, - 2902, - 1386, - 2115, - 3762, - 22308, - }, - { - 1699, - 2709, - 1288, - 1865, - 3246, - 20660, - }, - { - 3221, - 0, - 0, - 3391, - 0, - 0, - }, - { - 2537, - 4923, - 0, - 3186, - 0, - 0, - }, - { - 2816, - 4229, - 6397, - 3676, - 0, - 0, - }, - { - 2816, - 4229, - 6397, - 3893, - 0, - 0, - }, - { - 2160, - 3481, - 9091, - 3391, - 0, - 0, - }, - { - 2560, - 4923, - 8462, - 2775, - 4835, - 0, - }, - { - 2551, - 3803, - 5619, - 3072, - 5537, - 0, - }, - { - 2545, - 4206, - 7450, - 3229, - 0, - 0, - }, - { - 2162, - 3655, - 9263, - 2699, - 5296, - 0, - }, - { - 2039, - 3082, - 6871, - 2426, - 3637, - 5586, - }, - { - 1902, - 2840, - 6875, - 2211, - 3483, - 5908, - }, - { - 1888, - 3057, - 6899, - 2211, - 3483, - 5908, - }, - { - 1888, - 3057, - 6899, - 2183, - 3469, - 6420, - }, - { - 1888, - 3057, - 6899, - 1970, - 3174, - 8081, - }, - { - 2633, - 1855, - 4960, - 2301, - 3477, - 5083, - }, - { - 1527, - 2269, - 5875, - 1964, - 3033, - 8001, - }, - { - 1576, - 2445, - 5781, - 1857, - 2871, - 4333, - }, - { - 1531, - 2258, - 5869, - 2420, - 1660, - 6823, - }, - { - 1566, - 2318, - 3776, - 2543, - 3876, - 1888, - }, - { - 1568, - 2320, - 3780, - 2183, - 3360, - 1665, - }, - { - 1386, - 1972, - 4356, - 1486, - 2215, - 4513, - }, - { - 3356, - 0, - 0, - 2494, - 4425, - 0, - }, - { - 2633, - 5009, - 0, - 2887, - 0, - 0, - }, - { - 2224, - 3538, - 7696, - 2494, - 4425, - 0, - }, - { - 2119, - 3225, - 9861, - 2494, - 4425, - 0, - }, - { - 1974, - 3139, - 10121, - 2494, - 4425, - 0, - }, - { - 1722, - 2453, - 4059, - 2494, - 4425, - 0, - }, - { - 1839, - 2658, - 4472, - 2490, - 5455, - 0, - }, - { - 1722, - 2533, - 4581, - 2037, - 3393, - 5808, - }, - { - 1427, - 2009, - 4184, - 1914, - 3082, - 1349, - }, - { - 1370, - 1861, - 2719, - 2017, - 1339, - 3913, - }, - { - 2482, - 3885, - 0, - 0, - 0, - 0, - }, - { - 2375, - 3827, - 6975, - 0, - 0, - 0, - }, - { - 3395, - 0, - 0, - 3883, - 0, - 0, - }, - { - 3563, - 0, - 0, - 3883, - 0, - 0, - }, - { - 3346, - 0, - 0, - 3418, - 0, - 0, - }, - { - 3563, - 0, - 0, - 4128, - 0, - 0, - }, - { - 2820, - 5218, - 0, - 3883, - 0, - 0, - }, - { - 2637, - 4962, - 0, - 3418, - 0, - 0, - }, - { - 2482, - 3885, - 0, - 3418, - 0, - 0, - }, - { - 2217, - 3616, - 6502, - 3418, - 0, - 0, - }, - { - 2123, - 3295, - 8658, - 3418, - 0, - 0, - }, - { - 2242, - 3397, - 5562, - 2693, - 5132, - 0, - }, - { - 2387, - 4024, - 7483, - 3452, - 0, - 0, - }, - { - 1927, - 2838, - 4548, - 2693, - 5132, - 0, - }, - { - 1859, - 2674, - 3893, - 2703, - 5371, - 0, - }, - { - 2201, - 3618, - 1617, - 2703, - 5371, - 0, - }, - { - 2093, - 3135, - 1554, - 2273, - 3594, - 5312, - }, - { - 2201, - 3618, - 1617, - 2238, - 3895, - 6172, - }, - { - 1828, - 3014, - 1382, - 2258, - 3624, - 5820, - }, - { - 1863, - 3170, - 1402, - 2113, - 3381, - 5146, - }, - { - 1691, - 2572, - 1294, - 2009, - 3158, - 4540, - }, - { - 2424, - 3706, - 5654, - 0, - 0, - 0, - }, - { - 3299, - 0, - 0, - 3313, - 0, - 0, - }, - { - 2424, - 3706, - 5654, - 3174, - 0, - 0, - }, - { - 2424, - 3706, - 5654, - 3313, - 0, - 0, - }, - { - 2177, - 3557, - 6113, - 3313, - 0, - 0, - }, - { - 2207, - 3737, - 6475, - 3008, - 4605, - 0, - }, - { - 2816, - 1873, - 4263, - 3008, - 4605, - 0, - }, - { - 1966, - 2914, - 1433, - 2682, - 4366, - 0, - }, - { - 2301, - 1626, - 3895, - 2627, - 4714, - 0, - }, - { - 2205, - 3536, - 1570, - 2560, - 3995, - 6105, - }, - { - 1910, - 3012, - 1402, - 2560, - 3995, - 6105, - }, - { - 1898, - 3276, - 1380, - 2363, - 3637, - 5844, - }, - { - 2144, - 1478, - 3655, - 2162, - 3362, - 5531, - }, - { - 1988, - 1409, - 3090, - 2136, - 3543, - 6002, - }, - { - 1882, - 1355, - 2799, - 2164, - 3702, - 6285, - }, - { - 3311, - 0, - 0, - 3393, - 0, - 0, - }, - { - 2611, - 4706, - 0, - 3201, - 0, - 0, - }, - { - 2820, - 5218, - 0, - 4128, - 0, - 0, - }, - { - 2660, - 4134, - 0, - 4128, - 0, - 0, - }, - { - 2678, - 4820, - 0, - 2840, - 0, - 0, - }, - { - 2643, - 4952, - 0, - 2775, - 5003, - 0, - }, - { - 2402, - 3618, - 5726, - 3252, - 6201, - 0, - }, - { - 2209, - 3622, - 6168, - 2840, - 0, - 0, - }, - { - 2209, - 3622, - 6168, - 2713, - 5232, - 0, - }, - { - 1992, - 2850, - 4124, - 3262, - 6518, - 0, - }, - { - 2353, - 3835, - 1736, - 3262, - 6518, - 0, - }, - { - 1837, - 2744, - 5332, - 2191, - 3459, - 5175, - }, - { - 2353, - 3835, - 1736, - 2701, - 4685, - 7550, - }, - { - 1837, - 2744, - 5332, - 1923, - 2977, - 4265, - }, - { - 1853, - 2717, - 5322, - 2271, - 1591, - 3491, - }, - { - 1560, - 2254, - 4831, - 1923, - 2977, - 4265, - }, - { - 1626, - 2510, - 6512, - 2271, - 1591, - 3491, - }, - { - 3336, - 0, - 0, - 2439, - 4528, - 0, - }, - { - 2615, - 5236, - 0, - 2799, - 0, - 0, - }, - { - 2215, - 3606, - 8046, - 2439, - 4528, - 0, - }, - { - 2084, - 3143, - 5750, - 2439, - 4528, - 0, - }, - { - 1933, - 3024, - 5658, - 2439, - 4528, - 0, - }, - { - 1863, - 3571, - 6793, - 2439, - 4528, - 0, - }, - { - 1884, - 3375, - 6283, - 1984, - 3446, - 8095, - }, - { - 1513, - 2275, - 5517, - 1800, - 2889, - 4720, - }, - { - 1452, - 2113, - 5564, - 1658, - 2549, - 3735, - }, - { - 1552, - 2285, - 4022, - 4139, - 1634, - 2496, - }, - { - 1431, - 2117, - 4050, - 4139, - 1634, - 2496, - }, - { - 1486, - 2150, - 3778, - 2775, - 1761, - 4515, - }, - { - 1386, - 2041, - 3418, - 2775, - 1761, - 4515, - }, - { - 3371, - 0, - 0, - 2568, - 5036, - 0, - }, - { - 3031, - 6023, - 0, - 3733, - 0, - 0, - }, - { - 2801, - 4704, - 0, - 3733, - 0, - 0, - }, - { - 2801, - 4704, - 0, - 4065, - 0, - 0, - }, - { - 2197, - 3815, - 6617, - 3436, - 0, - 0, - }, - { - 2197, - 3815, - 6617, - 2568, - 5036, - 0, - }, - { - 2162, - 3229, - 5052, - 3698, - 6123, - 0, - }, - { - 2314, - 3723, - 1712, - 4065, - 0, - 0, - }, - { - 1947, - 3055, - 5111, - 2570, - 6084, - 0, - }, - { - 2351, - 3770, - 1665, - 2570, - 6084, - 0, - }, - { - 2351, - 1656, - 3932, - 3133, - 5603, - 0, - }, - { - 2469, - 1742, - 4464, - 3098, - 6504, - 0, - }, - { - 1646, - 2457, - 4046, - 3080, - 6574, - 0, - }, - { - 2336, - 1650, - 3921, - 4040, - 2387, - 7604, - }, - { - 2289, - 1593, - 4149, - 2537, - 4380, - 7731, - }, - { - 1576, - 2322, - 3921, - 2521, - 4706, - 7946, - }, - { - 2099, - 1452, - 3545, - 2521, - 4706, - 7946, - }, - { - 1980, - 1460, - 3385, - 3768, - 2252, - 5793, - }, - { - 2025, - 1429, - 3278, - 2224, - 4022, - 5902, - }, - { - 1232, - 1779, - 2904, - 2588, - 1564, - 4542, - }, - { - 1746, - 3622, - 9062, - 2048, - 2048, - 2048, - }, - { - 2070, - 3405, - 9017, - 3231, - 0, - 0, - }, - { - 2070, - 3405, - 9017, - 2461, - 4964, - 0, - }, - { - 1804, - 3313, - 8470, - 2461, - 4964, - 0, - }, - { - 1734, - 3667, - 9146, - 2461, - 4964, - 0, - }, - { - 1372, - 2277, - 4892, - 2461, - 4964, - 0, - }, - { - 2316, - 3717, - 1630, - 2590, - 5722, - 0, - }, - { - 1167, - 1646, - 2451, - 2379, - 3991, - 1490, - }, - { - 2140, - 3248, - 7688, - 3418, - 0, - 0, - }, - { - 2252, - 3284, - 4700, - 2732, - 4962, - 0, - }, - { - 2234, - 3588, - 6479, - 2881, - 0, - 0, - }, - { - 2234, - 3588, - 6479, - 2756, - 5171, - 0, - }, - { - 2234, - 3588, - 6479, - 2230, - 3448, - 5167, - }, - { - 1925, - 2762, - 3897, - 2455, - 3665, - 5251, - }, - { - 1802, - 2621, - 5783, - 2250, - 3553, - 0, - }, - { - 1701, - 2488, - 5994, - 2230, - 3497, - 5076, - }, - { - 1781, - 2717, - 5951, - 2183, - 3520, - 5480, - }, - { - 1566, - 6379, - 3723, - 2299, - 4728, - 9779, - }, - { - 1581, - 2297, - 4814, - 2961, - 1933, - 4243, - }, - { - 1435, - 2000, - 3559, - 1939, - 2975, - 4263, - }, - { - 1472, - 2091, - 3483, - 2291, - 1626, - 3473, - }, - { - 1718, - 1310, - 3117, - 2289, - 3475, - 1630, - }, - { - 1718, - 1310, - 3117, - 1968, - 3008, - 1447, - }, - { - 1310, - 1810, - 3547, - 1546, - 2232, - 3170, - }, - { - 2494, - 1630, - 4675, - 2641, - 6809, - 0, - }, - { - 3256, - 1710, - 9084, - 2246, - 6287, - 0, - }, - { - 2035, - 5359, - 0, - 2234, - 4573, - 7079, - }, - { - 1816, - 3221, - 7256, - 2228, - 3741, - 6281, - }, - { - 1714, - 2535, - 3897, - 2658, - 5728, - 0, - }, - { - 2330, - 5787, - 0, - 2265, - 5726, - 8992, - }, - { - 1927, - 3954, - 9160, - 1394, - 2592, - 4767, - }, - { - 2768, - 8871, - 0, - 1679, - 3164, - 8550, - }, - { - 2750, - 7387, - 0, - 1759, - 2975, - 5304, - }, - { - 2473, - 5611, - 0, - 1554, - 2539, - 4468, - }, - { - 2299, - 5603, - 0, - 1789, - 3067, - 5296, - }, - { - 1882, - 5060, - 0, - 1259, - 2195, - 4292, - }, - { - 3170, - 9232, - 0, - 1689, - 4460, - 8816, - }, - { - 2492, - 5935, - 0, - 1509, - 2492, - 3952, - }, - { - 1998, - 4485, - 11706, - 3084, - 1314, - 8624, - }, - { - 2267, - 5314, - 0, - 2666, - 1236, - 1802, - } - }; -const Word16 scales_p_ivas_fx[][MAX_NO_SCALES * 2] = /* 2 subvectors 20 modes Q11 */ - { - { - 2998, - 4861, - 0, - 0, - 0, - 0, - }, - { - 2629, - 4421, - 0, - 0, - 0, - 0, - }, - { - 2549, - 5304, - 0, - 0, - 0, - 0, - }, - { - 2338, - 3805, - 5994, - 0, - 0, - 0, - }, - { - 2125, - 3762, - 6162, - 0, - 0, - 0, - }, - { - 3102, - 0, - 0, - 3153, - 0, - 0, - }, - { - 3244, - 0, - 0, - 3153, - 0, - 0, - }, - { - 3244, - 0, - 0, - 3317, - 0, - 0, - }, - { - 2629, - 4421, - 0, - 3317, - 0, - 0, - }, - { - 2549, - 5304, - 0, - 3153, - 0, - 0, - }, - { - 2590, - 5251, - 0, - 3354, - 0, - 0, - }, - { - 2338, - 3805, - 5994, - 3317, - 0, - 0, - }, - { - 2125, - 3762, - 6162, - 3317, - 0, - 0, - }, - { - 2023, - 3401, - 5199, - 3317, - 0, - 0, - }, - { - 2177, - 3487, - 5744, - 2650, - 4818, - 0, - }, - { - 2177, - 3926, - 6273, - 2795, - 0, - 0, - }, - { - 1871, - 2891, - 4552, - 2650, - 4818, - 0, - }, - { - 1843, - 2887, - 4616, - 2658, - 4941, - 0, - }, - { - 1806, - 2869, - 4919, - 2689, - 4999, - 0, - }, - { - 2777, - 1775, - 4868, - 2191, - 3452, - 5214, - }, - { - 1732, - 2760, - 5214, - 2203, - 3567, - 5443, - }, - { - 1730, - 2824, - 5255, - 2086, - 3229, - 5003, - }, - { - 1548, - 2435, - 5732, - 2220, - 3694, - 5648, - }, - { - 1546, - 2494, - 5777, - 1933, - 2934, - 4040, - }, - { - 1525, - 2451, - 5935, - 2543, - 1726, - 3997, - }, - { - 1482, - 2529, - 6025, - 2570, - 1736, - 4096, - }, - { - 1406, - 2279, - 4788, - 1746, - 2719, - 3981, - }, - { - 1327, - 2107, - 3760, - 1748, - 2777, - 4016, - }, - { - 1243, - 1912, - 3106, - 1603, - 2484, - 3141, - }, - { - 1226, - 1853, - 3131, - 1497, - 2275, - 3072, - }, - { - 1327, - 2107, - 3760, - 1406, - 2166, - 3891, - }, - { - 3303, - 0, - 0, - 0, - 0, - 0, - }, - { - 2594, - 5068, - 0, - 3315, - 0, - 0, - }, - { - 2076, - 3338, - 5046, - 2631, - 4405, - 0, - }, - { - 1828, - 2846, - 4739, - 3000, - 4708, - 0, - }, - { - 1904, - 2869, - 4403, - 2621, - 4616, - 0, - }, - { - 1828, - 2846, - 4739, - 2613, - 4517, - 6111, - }, - { - 1828, - 2846, - 4739, - 2121, - 3371, - 5060, - }, - { - 1755, - 2738, - 5046, - 2136, - 3543, - 5376, - }, - { - 1566, - 2496, - 3180, - 2121, - 3371, - 5060, - }, - { - 1615, - 2719, - 3383, - 2154, - 3653, - 5541, - }, - { - 1564, - 2506, - 3184, - 1884, - 2955, - 4167, - }, - { - 1357, - 2172, - 2535, - 2824, - 1839, - 3995, - }, - { - 1378, - 2260, - 2674, - 2578, - 1695, - 4001, - }, - { - 1363, - 2193, - 2557, - 1644, - 2541, - 3540, - }, - { - 1347, - 2127, - 2486, - 1945, - 1333, - 2926, - }, - { - 3276, - 0, - 0, - 3180, - 0, - 0, - }, - { - 2674, - 4970, - 0, - 3235, - 0, - 0, - }, - { - 2674, - 4970, - 0, - 3432, - 0, - 0, - }, - { - 2560, - 5926, - 0, - 3235, - 0, - 0, - }, - { - 2322, - 4067, - 6748, - 3180, - 0, - 0, - }, - { - 2340, - 4202, - 6850, - 3432, - 0, - 0, - }, - { - 2138, - 4159, - 7141, - 3432, - 0, - 0, - }, - { - 2021, - 3661, - 5445, - 3373, - 0, - 0, - }, - { - 1841, - 3280, - 5281, - 3373, - 0, - 0, - }, - { - 1632, - 2650, - 4382, - 3373, - 0, - 0, - }, - { - 1632, - 2650, - 4382, - 2734, - 4556, - 0, - }, - { - 1517, - 2357, - 3719, - 2734, - 4556, - 0, - }, - { - 2007, - 3485, - 1445, - 2697, - 5382, - 0, - }, - { - 1632, - 2650, - 4382, - 2428, - 3956, - 0, - }, - { - 1517, - 2357, - 3719, - 2383, - 3733, - 5670, - }, - { - 1449, - 2306, - 3999, - 2203, - 3543, - 5687, - }, - { - 1351, - 2148, - 3217, - 2203, - 3543, - 5687, - }, - { - 1355, - 2101, - 3182, - 2199, - 3917, - 6189, - }, - { - 1351, - 2148, - 3217, - 2947, - 1896, - 4364, - }, - { - 1290, - 1978, - 3117, - 2686, - 1804, - 4519, - }, - { - 1263, - 1886, - 2963, - 2113, - 3172, - 1548, - }, - { - 3266, - 0, - 0, - 3076, - 0, - 0, - }, - { - 2299, - 3985, - 7643, - 3076, - 0, - 0, - }, - { - 2115, - 4249, - 8886, - 2906, - 5009, - 0, - }, - { - 2017, - 3672, - 12216, - 2623, - 4759, - 0, - }, - { - 1804, - 3289, - 14325, - 2906, - 5009, - 0, - }, - { - 1728, - 3239, - 14376, - 2623, - 4759, - 0, - }, - { - 1615, - 3112, - 14751, - 2623, - 4759, - 0, - }, - { - 1779, - 3168, - 14325, - 2109, - 3592, - 6352, - }, - { - 1673, - 3055, - 14581, - 2109, - 3592, - 6352, - }, - { - 1546, - 2830, - 14608, - 2109, - 3592, - 6352, - }, - { - 1445, - 2693, - 14796, - 2109, - 3592, - 6352, - }, - { - 1411, - 2654, - 14929, - 2080, - 3840, - 6633, - }, - { - 1429, - 2611, - 14764, - 1871, - 3170, - 4982, - }, - { - 1390, - 2693, - 14929, - 2516, - 3778, - 1665, - }, - { - 1390, - 2693, - 14929, - 2433, - 1581, - 4003, - }, - { - 2070, - 3639, - 5652, - 3305, - 0, - 0, - }, - { - 1974, - 3235, - 8183, - 3540, - 0, - 0, - }, - { - 1798, - 2949, - 4687, - 3540, - 0, - 0, - }, - { - 1744, - 3364, - 4974, - 3540, - 0, - 0, - }, - { - 1746, - 2830, - 4231, - 2549, - 5486, - 0, - }, - { - 2471, - 1593, - 4521, - 2549, - 5486, - 0, - }, - { - 1646, - 2772, - 5421, - 2883, - 5355, - 0, - }, - { - 1601, - 2568, - 5732, - 2822, - 5545, - 0, - }, - { - 2471, - 1593, - 4521, - 2074, - 3751, - 6252, - }, - { - 2471, - 1593, - 4521, - 2908, - 1785, - 4771, - }, - { - 1398, - 2080, - 3661, - 2306, - 3862, - 5988, - }, - { - 1284, - 1878, - 2965, - 2306, - 3862, - 5988, - }, - { - 1347, - 2105, - 3188, - 3035, - 1996, - 4397, - }, - { - 1626, - 1187, - 2725, - 3035, - 1996, - 4397, - }, - { - 1685, - 1212, - 2709, - 2756, - 1832, - 4726, - }, - { - 2248, - 1511, - 1136, - 1779, - 2641, - 3813, - }, - { - 1552, - 2275, - 1126, - 1783, - 2799, - 3903, - }, - { - 1128, - 1568, - 2285, - 1619, - 2459, - 3405, - }, - { - 1128, - 1568, - 2285, - 1972, - 1427, - 2709, - }, - { - 1075, - 1576, - 2197, - 1669, - 2533, - 1161, - }, - { - 2191, - 3667, - 7993, - 3274, - 0, - 0, - }, - { - 1679, - 2492, - 4278, - 2570, - 4689, - 0, - }, - { - 1597, - 2394, - 5109, - 2570, - 4689, - 0, - }, - { - 2201, - 1480, - 4835, - 2273, - 4016, - 7149, - }, - { - 1415, - 2107, - 4786, - 2117, - 3667, - 8200, - }, - { - 1374, - 2203, - 5337, - 1955, - 3168, - 5148, - }, - { - 2424, - 1589, - 4335, - 2164, - 3420, - 1380, - }, - { - 1937, - 2965, - 5576, - 2854, - 5416, - 9381, - }, - { - 1941, - 2977, - 5576, - 4034, - 2404, - 7135, - }, - { - 1812, - 2879, - 5658, - 4034, - 2404, - 7135, - }, - { - 2549, - 1724, - 4870, - 4093, - 2392, - 7540, - }, - { - 1781, - 2756, - 5763, - 3571, - 2166, - 5933, - }, - { - 1693, - 2496, - 4456, - 3252, - 5324, - 2037, - }, - { - 1673, - 2428, - 4079, - 3262, - 1994, - 5363, - }, - { - 1683, - 2467, - 4298, - 2998, - 1851, - 4911, - }, - { - 1683, - 2467, - 4298, - 4204, - 1714, - 2783, - }, - { - 1067, - 1529, - 2115, - 1630, - 2729, - 1110, - }, - { - 3438, - 0, - 0, - 2625, - 5060, - 0, - }, - { - 2228, - 3786, - 6543, - 3454, - 0, - 0, - }, - { - 2228, - 3786, - 6543, - 2625, - 5060, - 0, - }, - { - 2306, - 3459, - 1617, - 2625, - 5060, - 0, - }, - { - 1904, - 2830, - 1396, - 2625, - 5060, - 0, - }, - { - 2283, - 1626, - 3792, - 2623, - 6211, - 0, - }, - { - 1720, - 2818, - 1275, - 1638, - 2899, - 8724, - }, - { - 1640, - 2351, - 3690, - 0, - 0, - 0, - }, - { - 2752, - 5380, - 0, - 3223, - 0, - 0, - }, - { - 2580, - 4188, - 0, - 3223, - 0, - 0, - }, - { - 2580, - 4188, - 0, - 3430, - 0, - 0, - }, - { - 2230, - 3710, - 6496, - 3434, - 0, - 0, - }, - { - 2230, - 3899, - 6596, - 3115, - 5396, - 0, - }, - { - 1972, - 2949, - 4335, - 3430, - 0, - 0, - }, - { - 1972, - 2949, - 4335, - 2666, - 4935, - 0, - }, - { - 1730, - 2482, - 3960, - 2689, - 4954, - 0, - }, - { - 1595, - 2242, - 3481, - 2689, - 4954, - 0, - }, - { - 1480, - 2078, - 3407, - 2689, - 4954, - 0, - }, - { - 2066, - 3414, - 1540, - 2676, - 6187, - 0, - }, - { - 2058, - 3373, - 1533, - 2179, - 3831, - 6856, - }, - { - 1832, - 3051, - 1396, - 2179, - 3831, - 6856, - }, - { - 1611, - 2605, - 1245, - 2179, - 3831, - 6856, - }, - { - 1763, - 1327, - 2988, - 2179, - 3831, - 6856, - }, - { - 1697, - 1292, - 2738, - 2168, - 4161, - 7020, - }, - { - 1763, - 1327, - 2988, - 3155, - 1884, - 5142, - }, - { - 1736, - 1296, - 2781, - 2883, - 1800, - 5552, - }, - { - 1828, - 1335, - 2945, - 2203, - 1474, - 3674, - }, - { - 2783, - 4722, - 0, - 3418, - 0, - 0, - }, - { - 2205, - 3946, - 7262, - 3418, - 0, - 0, - }, - { - 2205, - 4161, - 7327, - 2926, - 5552, - 0, - }, - { - 1705, - 2566, - 4311, - 2627, - 5234, - 0, - }, - { - 1589, - 2359, - 3805, - 2627, - 5234, - 0, - }, - { - 1472, - 2183, - 3547, - 2627, - 5234, - 0, - }, - { - 1927, - 1333, - 3205, - 1478, - 2437, - 3973, - }, - { - 2646, - 5076, - 0, - 3155, - 0, - 0, - }, - { - 2461, - 3897, - 0, - 3155, - 0, - 0, - }, - { - 2105, - 3360, - 5027, - 3375, - 0, - 0, - }, - { - 2553, - 1798, - 4769, - 3375, - 0, - 0, - }, - { - 1767, - 2781, - 5165, - 3375, - 0, - 0, - }, - { - 1673, - 2502, - 4116, - 2199, - 3655, - 5597, - }, - { - 1669, - 1253, - 2623, - 2160, - 3530, - 6045, - }, - { - 3164, - 0, - 0, - 3170, - 0, - 0, - }, - { - 3358, - 0, - 0, - 3170, - 0, - 0, - }, - { - 2723, - 0, - 0, - 3270, - 0, - 0, - }, - { - 2529, - 4743, - 0, - 3270, - 0, - 0, - }, - { - 2635, - 5629, - 0, - 3170, - 0, - 0, - }, - { - 2635, - 5629, - 0, - 3387, - 0, - 0, - }, - { - 2437, - 4149, - 0, - 3387, - 0, - 0, - }, - { - 1949, - 3428, - 5656, - 3270, - 0, - 0, - }, - { - 1880, - 3217, - 6574, - 3270, - 0, - 0, - }, - { - 2572, - 1622, - 4255, - 3270, - 0, - 0, - }, - { - 1550, - 2463, - 3837, - 3270, - 0, - 0, - }, - { - 1906, - 2985, - 5017, - 2650, - 5615, - 0, - }, - { - 2287, - 1507, - 3840, - 2562, - 5257, - 0, - }, - { - 1581, - 2531, - 3934, - 2562, - 5257, - 0, - }, - { - 1796, - 2859, - 5605, - 2213, - 3719, - 6881, - }, - { - 2316, - 3350, - 0, - 2807, - 0, - 0, - }, - { - 1826, - 3260, - 7012, - 2658, - 6565, - 0, - }, - { - 1792, - 3168, - 7084, - 2631, - 5937, - 8499, - }, - { - 1732, - 3379, - 6772, - 2611, - 5009, - 8202, - }, - { - 1654, - 6285, - 3514, - 2611, - 5009, - 8202, - }, - { - 1566, - 6406, - 3733, - 2611, - 5009, - 8202, - }, - { - 1912, - 2615, - 1490, - 2369, - 3475, - 0, - }, - { - 1705, - 2379, - 1347, - 2357, - 3454, - 0, - }, - { - 1538, - 2113, - 1224, - 2357, - 3454, - 0, - }, - { - 1554, - 6426, - 3778, - 1888, - 3088, - 6369, - }, - { - 1452, - 2058, - 1167, - 2170, - 3629, - 5568, - }, - { - 1527, - 2050, - 1230, - 2056, - 3692, - 5922, - }, - { - 1521, - 2048, - 1226, - 1916, - 3811, - 5885, - }, - { - 1536, - 6492, - 3942, - 1509, - 2914, - 5502, - }, - { - 1536, - 6492, - 3942, - 1349, - 2168, - 4044, - }, - { - 1587, - 1257, - 2123, - 1630, - 2670, - 3901, - }, - { - 1830, - 2742, - 5220, - 2678, - 5326, - 0, - }, - { - 1703, - 2568, - 3966, - 2676, - 5353, - 0, - }, - { - 1703, - 2523, - 3923, - 2371, - 4048, - 0, - }, - { - 1689, - 2580, - 4081, - 2095, - 3561, - 5726, - }, - { - 1536, - 2281, - 3201, - 2140, - 3690, - 5490, - }, - { - 1417, - 2048, - 2930, - 2095, - 3561, - 5726, - }, - { - 1474, - 2072, - 3272, - 3096, - 1896, - 4376, - }, - { - 1394, - 1992, - 3377, - 2828, - 1794, - 4360, - }, - { - 1400, - 1974, - 3358, - 2392, - 3637, - 1611, - }, - { - 1368, - 1914, - 3176, - 2080, - 3108, - 1458, - }, - { - 1349, - 1865, - 2918, - 2738, - 1820, - 1314, - }, - { - 1349, - 1865, - 2918, - 1718, - 2635, - 1243, - }, - { - 3344, - 0, - 0, - 3454, - 0, - 0, - }, - { - 3463, - 0, - 0, - 3428, - 0, - 0, - }, - { - 2719, - 5251, - 0, - 3180, - 0, - 0, - }, - { - 2560, - 4079, - 0, - 3180, - 0, - 0, - }, - { - 2560, - 4079, - 0, - 3428, - 0, - 0, - }, - { - 2203, - 3665, - 6025, - 3454, - 0, - 0, - }, - { - 2183, - 3446, - 8349, - 3428, - 0, - 0, - }, - { - 2621, - 1865, - 5072, - 3428, - 0, - 0, - }, - { - 1708, - 2516, - 3870, - 3454, - 0, - 0, - }, - { - 1921, - 2875, - 4409, - 2674, - 5386, - 0, - }, - { - 2744, - 1814, - 4751, - 2674, - 5386, - 0, - }, - { - 1705, - 2560, - 3907, - 2674, - 5386, - 0, - }, - { - 1705, - 2484, - 3835, - 2304, - 3766, - 5773, - }, - { - 1748, - 2594, - 3743, - 2138, - 3604, - 5902, - }, - { - 1566, - 2379, - 3461, - 2097, - 3559, - 5812, - }, - { - 1484, - 2150, - 3667, - 3031, - 1888, - 6356, - }, - { - 1458, - 2072, - 3172, - 3059, - 1849, - 6889, - }, - { - 1349, - 1898, - 2779, - 3059, - 1849, - 6889, - }, - { - 1683, - 1257, - 2637, - 1863, - 3090, - 4618, - }, - { - 1722, - 1277, - 2617, - 2377, - 1560, - 3702, - }, - { - 1716, - 1273, - 2592, - 2211, - 1456, - 3502, - }, - { - 1703, - 1267, - 2611, - 1921, - 2928, - 1318, - }, - { - 1810, - 2762, - 5263, - 2691, - 5343, - 0, - }, - { - 2009, - 3016, - 5701, - 3461, - 6844, - 0, - }, - { - 1976, - 3100, - 5500, - 2885, - 5089, - 8081, - }, - { - 1998, - 2983, - 5453, - 4405, - 2603, - 8552, - }, - { - 2029, - 3080, - 6320, - 5091, - 2693, - 9277, - }, - { - 1937, - 2965, - 5576, - 2854, - 5416, - 9381, - }, - { - 1456, - 2084, - 3307, - 3035, - 1886, - 7026, - }, - { - 1390, - 1994, - 3397, - 1941, - 3172, - 7061, - }, - { - 1701, - 1265, - 3033, - 1910, - 3100, - 4730, - }, - { - 1671, - 1249, - 2871, - 2920, - 1796, - 4638, - }, - { - 1611, - 2574, - 1220, - 1759, - 2963, - 4978, - }, - { - 1611, - 2574, - 1220, - 2265, - 1505, - 3397, - } - }; diff --git a/lib_com/rom_com.h b/lib_com/rom_com.h index 73156b9892df5be8df2ea273d450acaf492e1fdc..1ba9251d304ce6969f3889bdd8c55089bee933df 100644 --- a/lib_com/rom_com.h +++ b/lib_com/rom_com.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef ROM_COM_H @@ -47,21 +47,17 @@ #define MINSFTAB 7 #define MAXSFTAB 25 #define INTERP_EXP 0 + typedef struct { - Word32 fin_fx; /* input frequency Q0 */ - Word32 fout_fx; /* output frequency Q0 */ - Word16 fac_num_fx; /* numerator of resampling factor Q0 */ - - Word16 fac_den_fx; /* denominator of resampling factor Q0 */ - Word16 lg_out; /* denominator of resampling factor Q15 */ - - const Word16 *filter_fx; /* resampling filter coefficients Q14 */ - - Word16 filt_len_fx; /* number of filter coeff. Q0 */ - UWord16 flags_fx; /* flags from config. table Q0 */ - // UNS_Word16 flags_fx; /* flags from config. table Q0 */ - + Word32 fin_fx; /* input frequency Q0 */ + Word32 fout_fx; /* output frequency Q0 */ + Word16 fac_num_fx; /* numerator of resampling factor Q0 */ + Word16 fac_den_fx; /* denominator of resampling factor Q0 */ + Word16 lg_out; /* denominator of resampling factor Q15 */ + const Word16 *filter_fx; /* resampling filter coefficients Q14 */ + Word16 filt_len_fx; /* number of filter coeff. Q0 */ + UWord16 flags_fx; /* flags from config. table Q0 */ } Resampling_cfg; typedef struct @@ -70,27 +66,24 @@ typedef struct Word16 bw; // Q0 const Word16 *band_width; // Q0 Word32 L_qint; - Word16 eref_fx; Word16 eref; - Word16 bit_alloc_weight_fx; Word16 bit_alloc_weight; - Word16 gqlevs; // Q0 Word16 Ngq; // Q0 Word16 p2a_bands; // Q0 - Word16 p2a_th; - Word16 pd_thresh; - Word16 ld_slope; - Word16 ni_coef; } Xcore_Config; +/*-----------------------------------------------------------------* + * LP filters tables + *-----------------------------------------------------------------*/ + extern const Word16 filter_LP15_180H_fx[]; // Q14 /* Sincfilt.m: N=180*2+1, Fmin=0, Fmax=1/15, hann( N )' */ extern const Word16 filter_LP3_90H_fx[]; // Q14 /* Sincfilt.m: N=90*2+1, Fmin=0, Fmax=1/3, hann( N )' */ extern const Word16 filter_LP12_180H_13b_fx[]; // Q13/* Sincfilt.m: N=180*2+1, Fmin=0, Fmax=1/12, hann( N )' */ @@ -116,16 +109,16 @@ extern const Word16 mid_LSF_bits_tbl[]; /* Bit allocation table for mid-frame IS extern const Word16 Es_pred_bits_tbl[]; /* Bit allocation table for scaled innovation energy prediction Q0*/ extern const Word16 gain_bits_tbl[]; /* Bit allocation table for gain quantizer Q0*/ -extern const Word16 ACB_bits_tbl[]; /* Bit allocation table for adaptive codebook (pitch) Q0*/ +extern const Word16 ACB_bits_tbl[]; /* Bit allocation table for adaptive codebook (pitch) Q0*/ extern const Word16 FCB_bits_tbl[]; /* Bit allocation table for algebraic (fixed) codebook (innovation) Q0*/ -extern const Word16 reserved_bits_tbl[]; /* Bit allocation table for reseved bits Q0*/ +extern const Word16 reserved_bits_tbl[]; /* Bit allocation table for reseved bits Q0*/ -extern const Word16 ACB_bits_16kHz_tbl[]; /* Bit allocation table for adaptive codebook (pitch) @16kHz Q0*/ +extern const Word16 ACB_bits_16kHz_tbl[]; /* Bit allocation table for adaptive codebook (pitch) @16kHz Q0*/ extern const Word16 FCB_bits_16kHz_tbl[]; /* Bit allocation table for algebraic (fixed) codebook (innovation) @16kHz Q0*/ -extern const Word16 gain_bits_16kHz_tbl[]; /* Bit allocation table for gain quantizer @16kHz Q0*/ -extern const Word16 AVQ_bits_16kHz_tbl[]; /* Bit allocation table for AVQ bits @16kHz ACELP, active segments Q0*/ +extern const Word16 gain_bits_16kHz_tbl[]; /* Bit allocation table for gain quantizer @16kHz Q0*/ +extern const Word16 AVQ_bits_16kHz_tbl[]; /* Bit allocation table for AVQ bits @16kHz ACELP, active segments Q0*/ -extern const UWord32 pulsestostates[17][9]; /* Number of states for any combination of pulses in any combination of vector length Q0*/ +extern const UWord32 pulsestostates[17][9]; /* Number of states for any combination of pulses in any combination of vector length Q0*/ extern const UWord8 ACELP_NRG_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX + RF_MODE_MAX]; // Q0 extern const UWord8 ACELP_NRG_BITS[3]; // Q0 @@ -156,7 +149,6 @@ extern const Word16 inv_N_fx[32]; // Q15 extern const Word16 band_len_harm[]; // Q0 /* PVQ tables */ - extern const Word32 thren_fx[39]; // Q8 /* Band structure */ @@ -169,18 +161,17 @@ extern const Word16 h_high_fx[5]; // Q15 extern const Word16 sincos_t_fx[161]; // Q15 extern const Word16 sincos_t_ext_fx[]; // Q15 extern const Word32 crit_bands_fx[]; -extern const float sincos_t_ext[]; // fft_rel dep -extern const Word16 sincos_t_rad3_fx[]; // Q15 -extern const Word16 fft256_read_indexes[]; /* FFT Q0*/ -extern const Word16 inter4_2_fx_Q15[]; // Q15 /* 1/4 resolution interpolation filter */ +extern const Word16 fft256_read_indexes[]; /* FFT Q0*/ extern const Word16 inter4_2_fx[]; -extern const Word16 pitch_inter4_1[UP_SAMP * L_INTERPOL1 + 1]; /*1Q14*/ -extern const Word16 pitch_inter4_2[PIT_FIR_SIZE2]; /*1Q14*/ -extern const Word16 Assym_window_W16fx[]; // Q15 -extern const Word16 assym_window_16k_fx[]; // Q15 -extern const Word16 grid50_fx[( GRID50_POINTS - 1 ) / 2 - 1]; // Q15 -extern const Word16 grid40_fx[( GRID40_POINTS - 1 ) / 2 - 1]; // Q15 -extern const Word32 crit_bands_fx[]; /* Table of critical bands Q0*/ +extern const Word16 pitch_inter4_1[UP_SAMP * L_INTERPOL1 + 1]; /*1Q14*/ +extern const Word16 pitch_inter4_2[PIT_FIR_SIZE2]; /*Q15*/ +extern const Word32 L_pitch_inter4_1[UP_SAMP * L_INTERPOL1 + 1]; /*Q31*/ +extern const Word32 L_pitch_inter4_2[PIT_FIR_SIZE2]; /*Q31*/ +extern const Word16 Assym_window_W16fx[]; // Q15 +extern const Word16 assym_window_16k_fx[]; // Q15 +extern const Word16 grid50_fx[( GRID50_POINTS - 1 ) / 2 - 1]; // Q15 +extern const Word16 grid40_fx[( GRID40_POINTS - 1 ) / 2 - 1]; // Q15 +extern const Word32 crit_bands_fx[]; /* Table of critical bands Q0*/ extern const Word16 wind_sss_fx[LEN_WIN_SSS]; // Q15 /*window for modify_sf ana*/ extern const Word16 filter5_39s320_120_fx[]; // Q15 @@ -335,17 +326,14 @@ extern const Word16 hq_swb_bwe_nb_bits[]; // Q0 /*----------------------------------------------------------------------------------* * ISF quantization (AMR-WB IO mode) *----------------------------------------------------------------------------------*/ -extern const Word16 Indirect_dico1[SIZE_BK1]; // Q0 - -extern const Word16 mean_isf_amr_wb_fx[M]; /*Qlog2(2.56)*/ /* Mean ISF vector (only in AMR-WB IO mode) */ +extern const Word16 Indirect_dico1[SIZE_BK1]; // Q0 +extern const Word16 mean_isf_amr_wb_fx[M]; /*Qlog2(2.56)*/ /* Mean ISF vector (only in AMR-WB IO mode) */ extern const Word16 mean_isf_noise_amr_wb_fx[]; /*Qlog2(2.56)*/ /* Mean ISF vector for SID frame (only in AMR-WB IO mode) */ - -extern const Word16 gaus_dico_fx[]; // Q12 -extern const Word16 gaus_dico_swb_fx[]; // Q15 +extern const Word16 gaus_dico_fx[]; // Q12 +extern const Word16 gaus_dico_swb_fx[]; // Q15 extern const Word16 dico1_isf_fx[]; /* ISF codebook - common 1st stage, 1st split (only in AMR-WB IO mode) Qlog2(2.56)*/ - extern const Word16 dico2_isf_fx[]; /* ISF codebook - common 1st stage, 2nd split (only in AMR-WB IO mode) Qlog2(2.56)*/ extern const Word16 dico21_isf_46b_fx[]; /* ISF codebook - 46b, 2nd stage, 1st split (only in AMR-WB IO mode) Qlog2(2.56)*/ @@ -355,16 +343,14 @@ extern const Word16 dico24_isf_46b_fx[]; /* ISF codebook - 46b, 2nd stage, 4th s extern const Word16 dico25_isf_46b_fx[]; /* ISF codebook - 46b, 2nd stage, 5th split (only in AMR-WB IO mode) Qlog2(2.56)*/ extern const Word16 dico21_isf_36b_fx[]; /* ISF codebook - 36b, 2nd stage, 1st split (only in AMR-WB IO mode) Qlog2(2.56)*/ - extern const Word16 dico22_isf_36b_fx[]; /* ISF codebook - 36b, 2nd stage, 2nd split (only in AMR-WB IO mode) Qlog2(2.56)*/ - extern const Word16 dico23_isf_36b_fx[]; /* ISF codebook - 36b, 2nd stage, 3rd split (only in AMR-WB IO mode) Qlog2(2.56)*/ -extern const Word16 dico1_ns_28b_fx[]; /*Qlog2(2.56)*/ /* ISF codebook for SID frames - 28b, 1st split Qlog2(2.56)*/ -extern const Word16 dico2_ns_28b_fx[]; /*Qlog2(2.56)*/ /* ISF codebook for SID frames - 28b, 2nd spilt Qlog2(2.56)*/ -extern const Word16 dico3_ns_28b_fx[]; /*Qlog2(2.56)*/ /* ISF codebook for SID frames - 28b, 3rd spilt Qlog2(2.56)*/ -extern const Word16 dico4_ns_28b_fx[]; /*Qlog2(2.56)*/ /* ISF codebook for SID frames - 28b, 4th spilt Qlog2(2.56)*/ -extern const Word16 dico5_ns_28b_fx[]; /*Qlog2(2.56)*/ /* ISF codebook for SID frames - 28b, 5th spilt Qlog2(2.56)*/ +extern const Word16 dico1_ns_28b_fx[]; /*Qlog2(2.56)*/ /* ISF codebook for SID frames - 28b, 1st split Qlog2(2.56)*/ +extern const Word16 dico2_ns_28b_fx[]; /*Qlog2(2.56)*/ /* ISF codebook for SID frames - 28b, 2nd spilt Qlog2(2.56)*/ +extern const Word16 dico3_ns_28b_fx[]; /*Qlog2(2.56)*/ /* ISF codebook for SID frames - 28b, 3rd spilt Qlog2(2.56)*/ +extern const Word16 dico4_ns_28b_fx[]; /*Qlog2(2.56)*/ /* ISF codebook for SID frames - 28b, 4th spilt Qlog2(2.56)*/ +extern const Word16 dico5_ns_28b_fx[]; /*Qlog2(2.56)*/ /* ISF codebook for SID frames - 28b, 5th spilt Qlog2(2.56)*/ /*----------------------------------------------------------------------------------* * LSF quantization - MSVQ tables @@ -447,7 +433,7 @@ extern const UWord32 table_no_cv[]; // Q0 extern const Word32 table_no_cv_fx[]; // Q0 extern const Word16 pl_par[]; // Q0 -// extern const Word16 pl_par_fx[]; /* 1 if even number of signs */ +// extern const Word16 pl_par_fx[]; /* 1 if even number of signs */ extern const Word16 *const Quantizers_p_fx[]; // Qlog2(2.56) extern const Word16 *const Quantizers_fx[]; // Qlog2(2.56) @@ -591,8 +577,8 @@ extern const Word16 Da_nq[]; /* Codebook number for each absolute leader */ * SWB TBE tables *------------------------------------------------------------------------------*/ -extern const Word16 skip_bands_SWB_TBE[]; /* bands for SWB TBE quantisation Q0*/ -extern const Word16 skip_bands_WB_TBE[]; /* bands for WB TBE quantisation Q0*/ +extern const Word16 skip_bands_SWB_TBE[]; /* bands for SWB TBE quantisation Q0*/ +extern const Word16 skip_bands_WB_TBE[]; /* bands for WB TBE quantisation Q0*/ extern const Word16 interpol_frac_shb[NB_SUBFR * 2]; // Q15 extern const Word16 interpol_frac_shb[NB_SUBFR * 2]; // Q15 @@ -615,8 +601,10 @@ extern const Word16 window_wb_fx[]; // extern const Word16 subwin_wb_fx[]; // Q15 extern const Word16 Hilbert_coeffs_fx[4 * NUM_HILBERTS][HILBERT_ORDER1 + 1]; // Q14 -extern const Word16 wac_swb_h[]; // Q15 -extern const Word16 wac_swb_l[]; // Q15 +extern const Word16 wac_swb_h[]; // Q15 +extern const Word16 wac_swb_l[]; // Q15 +extern const Word16 wac_swb_ivas_h[]; // Q15 +extern const Word16 wac_swb_ivas_l[]; // Q15 extern const Word16 wb_bwe_lsfvq_cbook_8bit_fx[]; // Q15 extern const Word16 lbr_wb_bwe_lsfvq_cbook_2bit_fx[]; // Q15 @@ -629,11 +617,11 @@ extern const Word16 full_band_bpf_1_fx[][5]; /*Q13*/ extern const Word16 full_band_bpf_2_fx[][5]; /*Q13*/ extern const Word16 full_band_bpf_3_fx[][5]; /*Q13*/ extern const Word16 *const lsf_q_cb_fx[]; // Q15 -extern const Word16 lsf_q_cb_size[]; /* Size of each element of the above Q0*/ -extern const Word16 lsf_q_num_bits[]; /* Size of each element of the above, in bits Q0*/ +extern const Word16 lsf_q_cb_size[]; /* Size of each element of the above Q0*/ +extern const Word16 lsf_q_num_bits[]; /* Size of each element of the above, in bits Q0*/ extern const Word16 mirror_point_q_cb_fx[]; // Q15 extern const Word16 lsf_grid_fx[4][5]; // Q15 -extern const Word16 grid_smoothing_fx[]; /* LSF mirroring smoothing table Q15*/ +extern const Word16 grid_smoothing_fx[]; /* LSF mirroring smoothing table Q15*/ extern const Word16 overlap_coefs_fx[NSV_OVERLAP * WIDTH_BAND]; /* in Q15 */ extern const Word16 overlap_coefs_48kHz_fx[NSV_OVERLAP * WIDTH_BAND]; /* in Q15 */ @@ -1123,13 +1111,6 @@ extern const Word16 CLDFB80_32[320]; // Q.5 extern const Word16 CLDFB80_40[400]; // Q.5 extern const Word16 CLDFB80_60[600]; // Q.5 extern const Word16 CLDFB80_30[300]; // Q.5 -extern const Word16 LDQMF_10_enc_fx[100]; -extern const Word16 LDQMF_16_enc_fx[160]; -extern const Word16 LDQMF_20_enc_fx[200]; -extern const Word16 LDQMF_30_enc_fx[300]; -extern const Word16 LDQMF_32_enc_fx[320]; -extern const Word16 LDQMF_40_enc_fx[400]; -extern const Word16 LDQMF_60_enc_fx[600]; extern const Word16 rRotVectr_10[]; // Q(sqrt(1.0/16.00)) extern const Word16 iRotVectr_10[]; // Q(sqrt(1.0/16.00)) @@ -1152,7 +1133,7 @@ extern const Word16 cldfb_synGain[]; // Q0 extern const Word16 *cldfb_protoFilter_2_5ms[]; // extern const Word16 *cldfb_protoFilter_5_0ms[]; extern const Word16 cldfb_scale_2_5ms[7]; // Q8 -extern const Word16 cldfb_scale_5_0ms[7]; // Q8 + extern const Word32 rot_vec_syn_re_L10_fx[5]; // Q31 extern const Word32 rot_vec_syn_im_L10_fx[5]; // Q31 @@ -1494,6 +1475,7 @@ extern const Word16 FFT_W256[]; // Q15 extern const Word16 FFT_W512[]; // Q15 extern const Word16 Gamma_19661_Tbl_fx[]; // Q15 extern const Word16 Gamma_29491_Tbl[]; // Q15 + /*---------------------------------------------------------------------* * NB post-filter tables *---------------------------------------------------------------------*/ @@ -1540,7 +1522,7 @@ extern const Word32 pow_tilt_32k[64]; /* Q23 */ extern const Word16 num_nelp_lp_fx[NELP_LP_ORDER + 1]; // Q13 extern const Word16 den_nelp_lp_fx[NELP_LP_ORDER + 1]; // Q13 -extern const Word16 fir_6k_8k_fx[]; /* HF BWE - band-pass filter coefficients Q15*/ +extern const Word16 fir_6k_8k_fx[]; /* HF BWE - band-pass filter coefficients Q15*/ extern const Word16 pwf78_fx[17]; // Q15 enum FUNC_GAIN_ENC @@ -1555,7 +1537,7 @@ enum FUNC_GAIN_ENC extern const Word16 hamcos_window_fx[]; // Q15 extern const Word16 CNG_burst_att_fx[6][8]; // Q15 extern const Word16 lpc_weights_fx[]; // Q15 -extern const Word16 SHBCB_SubGain5bit_12_fx[]; /* 5 bit Quantizer table for SHB gain shapes Q12*/ +extern const Word16 SHBCB_SubGain5bit_12_fx[]; /* 5 bit Quantizer table for SHB gain shapes Q12*/ extern const Word16 E_ROM_inter4_1_fx[PIT_UP_SAMP * L_INTERPOL1 + 1]; // Q14 extern const Word16 E_ROM_inter6_1_fx[PIT_UP_SAMP6 * L_INTERPOL1 + 1]; // Q14 extern const Word16 kLog2TableFrac_x[256]; // Q8 @@ -1584,4 +1566,69 @@ extern const Word16 sin_scale_tbl_800[800]; // Q15 extern const Word16 scales_ivas_fx[][MAX_NO_SCALES * 2]; // Q11 extern const Word16 scales_p_ivas_fx[][MAX_NO_SCALES * 2]; // Q11 +/*------------------------------------------------------------------------------* + * FFT transform tables + *------------------------------------------------------------------------------*/ + +extern const Word16 w_fft64_fx[32]; // Q15 +extern const Word16 w_fft32_fx[16]; // Q15 +extern const Word16 w_fft16_fx[8]; // Q15 +extern const Word16 w_fft8_fx[8]; // Q15 +extern const Word16 w_fft128_fx[64]; // Q15 +extern const Word16 w_fft256_fx[128]; // Q15 +extern const Word16 w_fft512_fx[256]; // Q15 +extern const Word16 w_fft4_fx[2]; // Q15 + +extern const Word16 FFT_RotVector_960_fx[1860]; // Q15 +extern const Word16 FFT_RotVector_640_fx[1240]; // Q15 +extern const Word16 FFT_RotVector_600_fx[1140]; // Q15 +extern const Word16 FFT_RotVector_400_fx[760]; // Q15 +extern const Word16 FFT_RotVector_256_fx[448]; // Q15 +extern const Word16 FFT_RotVector_32_fx[40]; // Q15 + +extern const Word16 sincos_t_rad3_fx[T_SIN_PI_2 + 1]; // Q15 + +extern const Word16 cos_twiddle_table_25_5_5[25]; // Q15 +extern const Word16 sin_twiddle_table_25_5_5[25]; // Q15 +extern const Word16 cos_twiddle_table_16_8_2[16]; // Q15 +extern const Word16 sin_twiddle_table_16_8_2[16]; // Q15 + +extern const Word32 CLDFB80_10_fx[100]; // Q30 +extern const Word32 CLDFB80_16_fx[160]; // Q30 +extern const Word32 CLDFB80_20_fx[200]; // Q30 +extern const Word32 CLDFB80_30_fx[300]; // Q30 +extern const Word32 CLDFB80_32_fx[320]; // Q30 +extern const Word32 CLDFB80_40_fx[400]; // Q30 +extern const Word32 CLDFB80_60_fx[600]; // Q30 + +/*5ms delay*/ +extern const Word32 LDQMF_10_fx[100]; // Q30 +extern const Word32 LDQMF_16_fx[160]; // Q30 +extern const Word32 LDQMF_20_fx[200]; // Q30 +extern const Word32 LDQMF_30_fx[300]; // Q30 +extern const Word32 LDQMF_32_fx[320]; // Q30 +extern const Word32 LDQMF_40_fx[400]; // Q30 +extern const Word32 LDQMF_60_fx[600]; // Q30 + +extern const Word32 rot_vec_delay_re_LDQMF_fx[60]; // Q31 +extern const Word32 rot_vec_delay_im_LDQMF_fx[60]; // Q31 + +extern const Word32 rot_vec_ana_re_L10_fx[5]; // Q29 +extern const Word32 rot_vec_ana_im_L10_fx[5]; // Q29 +extern const Word32 rot_vec_ana_re_L16_fx[8]; // Q29 +extern const Word32 rot_vec_ana_im_L16_fx[8]; // Q29 +extern const Word32 rot_vec_ana_re_L20_fx[10]; // Q29 +extern const Word32 rot_vec_ana_im_L20_fx[10]; // Q29 +extern const Word32 rot_vec_ana_re_L30_fx[15]; // Q29 +extern const Word32 rot_vec_ana_im_L30_fx[15]; // Q29 +extern const Word32 rot_vec_ana_re_L32_fx[16]; // Q29 +extern const Word32 rot_vec_ana_im_L32_fx[16]; // Q29 +extern const Word32 rot_vec_ana_re_L40_fx[20]; // Q29 +extern const Word32 rot_vec_ana_im_L40_fx[20]; // Q29 +extern const Word32 rot_vec_ana_re_L60_fx[30]; // Q29 +extern const Word32 rot_vec_ana_im_L60_fx[30]; // Q29 + +extern const Word16 LP_assym_window_fx[]; /* Assymetric window for LP analysis @12.8kHz (Q15) */ +extern const Word16 LP_assym_window_16k_fx[]; /* Assymetric window for LP analysis @16kHz (Q15) */ + #endif diff --git a/lib_com/rom_com_fx.c b/lib_com/rom_com_fx.c index 49f50e1622ba4a26b851bc236695c6e4b472078d..f1fdf7f78d581ff201922df2be5d9f0464f3f811 100644 --- a/lib_com/rom_com_fx.c +++ b/lib_com/rom_com_fx.c @@ -31,19 +31,31149 @@ *******************************************************************************************************/ /*==================================================================================== - 3GPP TS26.258 Aug 24, 2023. IVAS Codec Version IVAS-FL-1.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot_fx.h" +#include "basop_util.h" +#include "wmc_auto.h" + +/* clang-format off */ +#define SHC(x) ( (Word16) x ) +#define W16(x) ( (Word16) x ) + +/*----------------------------------------------------------------------------------* + * Table of bitrates + *----------------------------------------------------------------------------------*/ + +const Word32 brate_tbl[SIZE_BRATE_TBL] = // Q0 +{ + ACELP_7k20, ACELP_8k00, ACELP_9k60, ACELP_13k20, ACELP_16k40, ACELP_24k40, + ACELP_32k, ACELP_48k, ACELP_64k, HQ_96k, HQ_128k +}; + +const Word32 brate_intermed_tbl[SIZE_BRATE_INTERMED_TBL] = // Q0 +{ + ACELP_5k00, ACELP_6k15, ACELP_7k20, ACELP_8k00, ACELP_9k60, ACELP_11k60, ACELP_12k15, ACELP_12k85, ACELP_13k20, + ACELP_14k80, ACELP_16k40, ACELP_22k60, ACELP_24k40, ACELP_29k00, ACELP_29k20, ACELP_30k20, + ACELP_30k40, ACELP_32k, ACELP_48k, ACELP_64k, HQ_96k, HQ_128k +}; + +const Word16 bit_rates_div50[] = /* bit rate values / 50 to Fit in a Word16 */ +{ + ACELP_5k00 / 50, ACELP_6k15 / 50, ACELP_7k20 / 50, ACELP_8k00 / 50, ACELP_9k60 / 50, ACELP_11k60 / 50, ACELP_12k15 / 50, + ACELP_12k85 / 50, ACELP_13k20 / 50, ACELP_14k80 / 50, ACELP_16k40 / 50, ACELP_22k60 / 50, + ACELP_24k40 / 50, ACELP_29k00 / 50, ACELP_29k20 / 50, ACELP_30k20 / 50, ACELP_30k40 / 50, + ACELP_32k / 50, ACELP_48k / 50, ACELP_64k / 50, HQ_96k / 50, HQ_128k / 50 +}; + +const Word16 bit_rates_16k_div50[] = /* bit rate values / 50 to Fit in a Word16 */ +{ + ACELP_8k00 / 50, ACELP_14k80 / 50, ACELP_22k60 / 50, ACELP_24k40 / 50, ACELP_29k00 / 50, + ACELP_29k20 / 50, ACELP_30k20 / 50, ACELP_30k40 / 50, ACELP_32k / 50, ACELP_48k / 50, ACELP_64k / 50 +}; + +/*----------------------------------------------------------------------------------* + * Frame size and mode configuration tables + *----------------------------------------------------------------------------------*/ + +const FrameSizeParams FrameSizeConfig[FRAME_SIZE_NB] = +{ + /* bits, net bits, trans_bits, trans_mode, band_bits, band_mode_min, band_mode_max, reserved_bits */ + { FRAME_0, FRAME_0, 0, {0,0}, 0, 0, 0, 0}, /* 0 kbps ZERO_FRAME*/ + { FRAME_2_4, FRAME_2_4-2, 1, {1,1}, 1, NB, WB, 0}, /* 2.4kbps VBR(SID)*/ + { FRAME_7_2, FRAME_7_2-1, 0, {0,1}, 1, NB, WB, 0}, /* 7.2kbps VBR/CBR*/ + { FRAME_8, FRAME_8-1, 0, {0,1}, 1, NB, WB, 0}, /* 8 kbps VBR/CBR*/ + { FRAME_9_6, FRAME_9_6-2, 0, {0,1}, 2, NB, SWB, 0}, /* 9.6kbps CBR*/ + { FRAME_13_2, FRAME_13_2-2, 0, {0,1}, 2, NB, SWB, 0}, /* 13.2kbps CBR*/ + { FRAME_16_4, FRAME_16_4-3, 0, {0,1}, 2, NB, FB, 1}, /* 16.4kbps CBR*/ + { FRAME_24_4, FRAME_24_4-3, 0, {0,1}, 2, NB, FB, 1}, /* 24.4kbps CBR*/ + { FRAME_32, FRAME_32-3, 0, {0,1}, 2, WB, FB, 1}, /* 32 kbps CBR*/ + { FRAME_48, FRAME_48-3, 0, {0,1}, 2, WB, FB, 1}, /* 48 kbps CBR*/ + { FRAME_64, FRAME_64-3, 0, {0,1}, 2, WB, FB, 1}, /* 64 kbps CBR*/ + { FRAME_96, FRAME_96-3, 0, {0,1}, 2, WB, FB, 1}, /* 96 kbps CBR*/ + { FRAME_128, FRAME_128-3, 0, {0,1}, 2, WB, FB, 1} /*128 kbps CBR*/ +}; + + +/*----------------------------------------------------------------------------------* + * Conversion of ACELP signaling parameters (ACELP internal Fs, coder type, bandwidth, sharpening flag) to index + * (to be consulted with the decision matrix) + * + * - in order to retrieve the index, each section in this table starts with the bitrate + * - the second value in each section corresponds to the number of bits + * - the other values represent indices created by combining different parameters into a single value through the macro SIG2IND() + *----------------------------------------------------------------------------------*/ + +const Word32 acelp_sig_tbl[MAX_ACELP_SIG] = // Q0 +{ + /* GENERIC UNVOICED VOICED TRANSITION AUDIO INACTIVE */ + ACELP_7k20, 4, + SIG2IND(GENERIC, NB, 1, 0), SIG2IND(UNVOICED, NB, 0, 0), SIG2IND(VOICED, NB, 1, 0), SIG2IND(TRANSITION, NB, 1, 0), SIG2IND(AUDIO, NB, 0, 0), SIG2IND(INACTIVE, NB, 0, 0), + SIG2IND(GENERIC, WB, 1, 0), SIG2IND(UNVOICED, WB, 0, 0), SIG2IND(VOICED, WB, 1, 0), SIG2IND(TRANSITION, WB, 1, 0), SIG2IND(AUDIO, WB, 0, 0), SIG2IND(INACTIVE, WB, 0, 0), + SIG2IND(GENERIC, NB, 0, 0), + SIG2IND(GENERIC, WB, 0, 0), + SIG2IND(LR_MDCT, NB, 0, 0), + + ACELP_8k00, 4, + SIG2IND(GENERIC, NB, 1, 0), SIG2IND(UNVOICED, NB, 0, 0), SIG2IND(VOICED, NB, 1, 0), SIG2IND(TRANSITION, NB, 1, 0), SIG2IND(AUDIO, NB, 0, 0), SIG2IND(INACTIVE, NB, 0, 0), + SIG2IND(GENERIC, WB, 1, 0), SIG2IND(UNVOICED, WB, 0, 0), SIG2IND(VOICED, WB, 1, 0), SIG2IND(TRANSITION, WB, 1, 0), SIG2IND(AUDIO, WB, 0, 0), SIG2IND(INACTIVE, WB, 0, 0), + SIG2IND(GENERIC, NB, 0, 0), + SIG2IND(GENERIC, WB, 0, 0), + SIG2IND(LR_MDCT, NB, 0, 0), + + ACELP_13k20, 5, + SIG2IND(GENERIC, NB, 1, 0), SIG2IND(VOICED, NB, 1, 0), SIG2IND(TRANSITION, NB, 0, 0), SIG2IND(AUDIO, NB, 0, 0), SIG2IND(INACTIVE, NB, 0, 0), + SIG2IND(GENERIC, WB, 1, 0), SIG2IND(VOICED, WB, 1, 0), SIG2IND(TRANSITION, WB, 0, 0), SIG2IND(AUDIO, WB, 0, 0), SIG2IND(INACTIVE, WB, 0, 0), + SIG2IND(GENERIC, SWB, 1, 0), SIG2IND(VOICED, SWB, 1, 0), SIG2IND(TRANSITION, SWB, 0, 0), SIG2IND(AUDIO, SWB, 0, 0), SIG2IND(INACTIVE, SWB, 0, 0), + SIG2IND(GENERIC, NB, 0, 0), SIG2IND(VOICED, NB, 0, 0), + SIG2IND(GENERIC, WB, 0, 0), SIG2IND(VOICED, WB, 0, 0), + SIG2IND(GENERIC, SWB, 0, 0), SIG2IND(VOICED, SWB, 0, 0), + SIG2IND(GENERIC, WB, 1, 1), SIG2IND(UNVOICED, WB, 0, 1), SIG2IND(VOICED, WB, 1, 1), SIG2IND(INACTIVE, WB, 0, 1), + SIG2IND(GENERIC, SWB, 1, 1), SIG2IND(UNVOICED, SWB, 0, 1), SIG2IND(VOICED, SWB, 1, 1), SIG2IND(INACTIVE, SWB, 0, 1), + SIG2IND(LR_MDCT, NB, 0, 0), + SIG2IND(LR_MDCT, WB, 0, 0), + SIG2IND(LR_MDCT, SWB, 0, 0), + + ACELP_32k, 4, + SIG2IND(GENERIC, WB, 1, 0), SIG2IND(TRANSITION, WB, 1, 0), SIG2IND(INACTIVE, WB, 0, 0), + SIG2IND(GENERIC, SWB, 1, 0), SIG2IND(TRANSITION, SWB, 1, 0), SIG2IND(INACTIVE, SWB, 0, 0), + SIG2IND(GENERIC, FB, 1, 0), SIG2IND(TRANSITION, FB, 1, 0), SIG2IND(INACTIVE, FB, 0, 0), + SIG2IND(GENERIC, WB, 0, 0), SIG2IND(TRANSITION, WB, 0, 0), + SIG2IND(GENERIC, SWB, 0, 0), SIG2IND(TRANSITION, SWB, 0, 0), + SIG2IND(GENERIC, FB, 0, 0), SIG2IND(TRANSITION, FB, 0, 0), + + ACELP_64k, 4, + SIG2IND(GENERIC, WB, 0, 0), SIG2IND(TRANSITION, WB, 0, 0), SIG2IND(INACTIVE, WB, 0, 0), + SIG2IND(GENERIC, SWB, 1, 0), SIG2IND(TRANSITION, SWB, 1, 0), SIG2IND(INACTIVE, SWB, 0, 0), + SIG2IND(GENERIC, FB, 1, 0), SIG2IND(TRANSITION, FB, 1, 0), SIG2IND(INACTIVE, FB, 0, 0), + SIG2IND(GENERIC, SWB, 0, 0), SIG2IND(TRANSITION, SWB, 0, 0), + SIG2IND(GENERIC, FB, 0, 0), SIG2IND(TRANSITION, FB, 0, 0), +}; + +/*----------------------------------------------------------------------------------* + * ACELP bit allocation tables + *----------------------------------------------------------------------------------*/ + +/* bit allocation table for end-frame LSF quantizer */ +const Word16 LSF_bits_tbl[] = // Q0 +{ + /* IC UC VC GC TC AC */ + 22, 31, 24, 29, 24, 22, /* ACELP_5k00 */ + 22, 31, 24, 29, 24, 22, /* ACELP_6k15 */ + 22, 37, 31, 29, 31, 22, /* ACELP_7k20 */ + 22, 40, 36, 33, 34, 22, /* ACELP_8k00 */ + 27, 40, 34, 35, 37, 27, /* ACELP_9k60 */ + 31, 0, 37, 37, 40, 31, /* ACELP_11k60 */ + 31, 0, 39, 39, 41, 31, /* ACELP_12k15 */ + 31, 0, 38, 38, 40, 31, /* ACELP_12k85 */ + 31, 0, 38, 38, 40, 31, /* ACELP_13k20 */ + 31, 0, 37, 42, 42, 31, /* ACELP_14k80 */ + 31, 0, 43, 40, 40, 31, /* ACELP_16k40 */ + 31, 0, 42, 40, 40, 31, /* ACELP_22k60 */ + 31, 0, 46, 41, 41, 31, /* ACELP_24k40 */ + 41, 0, 0, 41, 41, 0, /* ACELP_29k00 */ + 41, 0, 0, 41, 41, 0, /* ACELP_29k20 */ + 41, 0, 0, 41, 41, 0, /* ACELP_30k20 */ + 41, 0, 0, 41, 41, 0, /* ACELP_30k40 */ + 41, 0, 0, 41, 41, 0, /* ACELP_32k */ + 41, 0, 0, 41, 41, 0, /* ACELP_48k */ + 41, 0, 0, 41, 41, 0, /* ACELP_64k */ +}; + +/* bit allocation table for mid-frame LSF quantizer */ +const Word16 mid_LSF_bits_tbl[] = // Q0 +{ + /* IC UC VC GC TC AC */ + 2, 5, 1, 2, 2, 2, /* ACELP_5k00 */ + 2, 5, 1, 2, 2, 2, /* ACELP_6k15 */ + 2, 5, 4, 5, 5, 2, /* ACELP_7k20 */ + 2, 5, 4, 5, 5, 2, /* ACELP_8k00 */ + 2, 5, 4, 5, 5, 2, /* ACELP_9k60 */ + 2, 5, 4, 5, 5, 2, /* ACELP_11k60 */ + 2, 5, 5, 5, 5, 2, /* ACELP_12k15 */ + 2, 5, 5, 5, 5, 2, /* ACELP_12k85 */ + 2, 5, 5, 5, 5, 2, /* ACELP_13k20 */ + 4, 0, 5, 5, 5, 4, /* ACELP_14k80 */ + 4, 0, 5, 5, 5, 4, /* ACELP_16k40 */ + 5, 0, 5, 5, 5, 5, /* ACELP_22k60 */ + 5, 0, 5, 5, 5, 5, /* ACELP_24k40 */ + 5, 0, 0, 5, 5, 5, /* ACELP_29k00 */ + 5, 0, 0, 5, 5, 5, /* ACELP_29k20 */ + 5, 0, 0, 5, 5, 5, /* ACELP_30k20 */ + 5, 0, 0, 5, 5, 5, /* ACELP_30k40 */ + 5, 0, 0, 5, 5, 5, /* ACELP_32k */ + 5, 0, 0, 5, 5, 5, /* ACELP_48k */ + 5, 0, 0, 5, 5, 5, /* ACELP_64k */ +}; + + +/* bit allocation table for scaled innovation energy prediction */ +const Word16 Es_pred_bits_tbl[] = // Q0 +{ +/* UC VC GC TC */ + 0, 0, 0, 4, /* ACELP_5k00 */ + 0, 0, 0, 4, /* ACELP_6k15 */ + 0, 0, 0, 4, /* ACELP_7k20 */ + 0, 0, 0, 4, /* ACELP_8k00 */ + 0, 5, 5, 5, /* ACELP_9k60 */ + 0, 5, 4, 4, /* ACELP_11k60 */ + 0, 5, 5, 5, /* ACELP_12k15 */ + 0, 5, 4, 5, /* ACELP_12k85 */ + 0, 5, 4, 4, /* ACELP_13k20 */ + 0, 5, 5, 5, /* ACELP_14k80 */ + 0, 5, 5, 5, /* ACELP_16k40 */ + 0, 5, 5, 5, /* ACELP_22k60 */ + 0, 5, 5, 5, /* ACELP_24k40 */ + 0, 0, 5, 5, /* ACELP_29k00 */ + 0, 0, 5, 5, /* ACELP_29k20 */ + 0, 0, 5, 5, /* ACELP_30k20 */ + 0, 0, 5, 5, /* ACELP_30k40 */ + 0, 0, 5, 5, /* ACELP_32k */ + 0, 0, 5, 5, /* ACELP_48k */ + 0, 0, 5, 5, /* ACELP_64k */ +}; + +/* bit allocation table for gain quantizer (ACELP@12.8kHz) */ +/* the 4 values allocated correspond to 4 subframes */ +const Word16 gain_bits_tbl[] = // Q0 +{ +/* UC VC GC TC0_0 TC0_64 TC0_128 TC0_192 TC64 TC128 TC192 */ + 6,6,6,6, 7,6,6,6, 7,6,6,6, 5,5,5,5, 5,5,6,5, 5,3,6,6, 5,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,10, /* ACELP_5k00 */ + 6,6,6,6, 7,6,6,6, 7,6,6,6, 5,5,5,5, 5,5,6,5, 5,3,6,6, 5,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,10, /* ACELP_6k15 */ + 7,7,7,7, 7,6,6,6, 6,6,6,6, 5,5,5,5, 5,5,6,5, 5,3,6,6, 5,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,10, /* ACELP_7k20 */ + 7,7,7,7, 8,7,6,6, 8,7,6,6, 5,5,5,5, 5,6,5,5, 5,3,6,6, 5,3,3,6, 3,5,5,5, 3,3,6,6, 3,3,3,14, /* ACELP_8k00 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,10, /* ACELP_9k60 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,13, /* ACELP_11k60 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,14, /* ACELP_12k15 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,5, 3,3,3,14, /* ACELP_12k85 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,15, /* ACELP_13k20 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,15, /* ACELP_14k80 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,15, /* ACELP_16k40 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,14, /* ACELP_22k60 */ + 7,7,7,7, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,3,6,6, 6,3,3,6, 3,6,6,6, 3,3,6,6, 3,3,3,15, /* ACELP_24k40 */ +}; + + +/* bit allocation table for gain gain quantizer (ACELP@16kHz) */ +/* the 5 values allocated correspond to 5 subframes */ +const Word16 gain_bits_16kHz_tbl[] = // Q0 +{ + /* IC GC TC0 TC64 TC128 TC192 TC256 */ + 0,0,0,0,0, 6,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0, 0, /* ACELP_8k00 */ + 0,0,0,0,0, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,15, /* ACELP_14k80 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,15, /* ACELP_22k60 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,16, /* ACELP_24k40 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_29k00 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_29k20 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_30k20 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_30k40 */ + 6,6,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 3,6,6,6,6, 3,3,6,6,6, 3,3,3,6,6, 3,3,3,3,14, /* ACELP_32k */ + 12,12,12,12,12, 12,12,12,12,12, 12,12,12,12,12, 6,12,12,12,12, 6,6,12,12,12, 6,6,6,12,12, 6,6,6,6,12, /* ACELP_48k */ + 12,12,12,12,12, 12,12,12,12,12, 12,12,12,12,12, 6,12,12,12,12, 6,6,12,12,12, 6,6,6,12,12, 6,6,6,6,12 /* ACELP_64k */ +}; + +/* bit allocation table for adaptive codebook (pitch) (ACELP@12.8kHz) */ +/* the 4 values correspond to 4 subframes */ +const Word16 ACB_bits_tbl[] = // Q0 +{ +/* UC VC GC TC0_0 TC0_64 TC0_128 TC0_192 TC64 TC128 TC192 */ + 0,0,0,0, 9,5,5,5, 8,5, 8,5, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,8, /* ACELP_5k00 */ + 0,0,0,0, 9,5,5,5, 8,5, 8,5, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,8, /* ACELP_6k15 */ + 0,0,0,0, 9,5,5,5, 8,5, 8,5, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,8, /* ACELP_7k20 */ + 0,0,0,0, 10,5,5,5, 9,5, 8,5, 6,5,6,6, 0,7,6,6, 0,0,7,5, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_8k00 */ + 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_9k60 */ + 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_11k60 */ + 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_12k15 */ + 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_12k85 */ + 0,0,0,0, 10,5,5,5, 10,6, 9,6, 6,5,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_13k20 */ + 0,0,0,0, 10,5,5,5, 10,6,10,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_14k80 */ + 0,0,0,0, 10,5,5,5, 10,6,10,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_16k40 */ + 0,0,0,0, 10,5,5,5, 10,6,10,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_22k60 */ + 0,0,0,0, 10,5,5,5, 10,6,10,6, 6,6,6,6, 0,7,6,6, 0,0,7,6, 0,0,0,7, 0,0,9,6, 0,0,5,9, 0,0,0,9, /* ACELP_24k40 */ +}; + +/* bit allocation table for adaptive codebook (pitch) (ACELP@16kHz) */ +/* the 5 values correspond to 5 subframes */ +const Word16 ACB_bits_16kHz_tbl[] = // Q0 +{ + /* IC GC TC0 TC64 TC128 TC192 TC256 */ + 0,0, 0,0,0, 9,0, 0,0,0, 0,0, 0,0,0, 0,0, 0,0,0, 0,0, 0,0,0, 0,0,0, 0,0, 0,0,0,0, 0, /* ACELP_8k00 */ + 0,0, 0,0,0, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_14k80 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_22k60 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_24k40 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_29k00 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_29k20 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_30k20 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_30k40 */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_32k */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10, /* ACELP_48k */ + 10,6,10,6,6, 10,6,10,6,6, 6,8,10,6,6, 0,6,10,6,6, 0,0,10,6,6, 0,0,0,10,6, 0,0,0,0,10 /* ACELP_64k */ +}; + +/* bit allocation table for algebraic (fixed) codebook (innovation) (ACELP@12.8kHz) */ +/* the 4 values correspond to 4 subframes */ +const Word16 FCB_bits_tbl[] = // Q0 +{ +/* UC VC GC TC0_0 TC0_64 TC0_128 TC0_192 TC64 TC128 TC192 */ + 8,8,8,8, 12,12,12,20, 7, 7, 0, 7, 12, 7,12,12, 12,12, 7,12, 12,12,12,12, 12,12,20,12, 12,12,12,12, 12,12,12,12, 12,12,12,20, /* ACELP_5k00 */ + 10,10,10,10, 12,12,12,20, 12, 7,12, 7, 12, 7,12,12, 12,12, 7,12, 12,12,12,12, 12,12,20,12, 12,12,12,12, 12,12,12,12, 12,12,12,20, /* ACELP_6k15 */ + 13,13,13,13, 12,12,12,20, 12,12,12,20, 12, 7,12,12, 12,12, 7,12, 12,12,12,12, 12,12,20,12, 12,12,12,12, 12,12,12,12, 12,12,12,20, /* ACELP_7k20 */ + 13,13,13,13, 12,20,12,20, 12,20,12,20, 20,12,12,12, 20,12,12,12, 20,12,20,12, 20,12,20,20, 20,12,12,20, 20,12,20,12, 12,20,12,20, /* ACELP_8k00 */ + 13,13,13,13, 20,28,20,28, 20,20,20,28, 20,20,20,20, 20,20,20,20, 20,20,28,20, 20,28,20,28, 20,28,20,20, 20,20,20,28, 20,28,20,28, /* ACELP_9k60 */ + 0, 0, 0, 0, 28,36,28,36, 28,28,28,36, 28,28,28,28, 28,28,28,28, 28,28,36,28, 28,36,28,36, 28,36,28,28, 28,28,28,36, 28,36,28,36, /* ACELP_11k60 */ + 0, 0, 0, 0, 28,36,36,36, 28,36,28,36, 36,28,28,28, 36,28,28,28, 36,28,36,28, 36,36,28,43, 28,36,28,36, 28,36,28,36, 28,36,36,36, /* ACELP_12k15 */ + 0, 0, 0, 0, 36,36,36,43, 36,36,36,36, 36,36,28,36, 36,28,36,36, 36,36,36,36, 36,36,43,43, 36,36,36,36, 36,36,36,43, 36,36,36,43, /* ACELP_12k85 */ + 0, 0, 0, 0, 36,43,36,43, 36,36,36,43, 36,36,36,36, 36,36,36,36, 36,36,43,36, 36,43,43,43, 36,43,36,36, 43,36,43,36, 36,43,36,43, /* ACELP_13k20 */ + 0, 0, 0, 0, 43,50,43,50, 43,43,43,43, 43,43,43,43, 43,43,43,43, 43,43,50,43, 43,50,50,50, 43,43,43,50, 50,43,50,43, 43,50,43,50, /* ACELP_14k80 */ + 0, 0, 0, 0, 50,56,50,56, 50,50,50,56, 56,50,50,50, 56,50,50,50, 56,50,56,56, 56,56,56,56, 50,56,50,56, 50,56,56,56, 50,56,56,56, /* ACELP_16k40 */ + 0, 0, 0, 0, 83,83,83,87, 78,83,83,83, 83,78,83,83, 83,78,83,87, 83,87,83,87, 83,87,87,92, 87,83,87,83, 87,83,87,87, 83,87,87,87, /* ACELP_22k60 */ + 0, 0, 0, 0, 92,92,92,92, 87,92,92,92, 92,87,92,92, 92,87,92,92, 92,92,92,92, 92,92,92,92, 92,92,92,92, 92,92,92,92, 92,92,92,92, /* ACELP_24k40 */ +}; + +/* bit allocation table for algebraic (fixed) codebook (innovation) (ACELP@16kHz) */ +/* the 5 values correspond to 5 subframes */ +const Word16 FCB_bits_16kHz_tbl[] = // Q0 +{ + /* IC GC TC0 TC64 TC128 TC192 TC256 */ + 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_8k00 */ + 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_14k80 */ + 0, 0, 0, 0, 0, 62,56,56,56,62, 62,56,56,56,56, 56,56,56,56,73, 62,56,62,62,62, 56,62,62,62,73, 62,62,62,62,68, /* ACELP_22k60 */ + 0, 0, 0, 0, 0, 68,68,68,73,73, 68,68,68,68,73, 68,73,68,73,73, 73,73,73,73,73, 73,78,73,73,78, 73,78,73,73,78, /* ACELP_24k40 */ + 12,12,12,12,12, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, /* ACELP_29k00 */ + 12,12,12,12,12, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, 36,28,28,36,36, /* ACELP_29k20 */ + 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, /* ACELP_30k20 */ + 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, /* ACELP_30k40 */ + 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, /* ACELP_32k */ + 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, /* ACELP_48k */ + 12,12,12,12,12, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36, 36,36,36,36,36 /* ACELP_64k */ +}; + +/* bit allocation table for AVQ bits in active segments (ACELP@16kHz) */ +const Word16 AVQ_bits_16kHz_tbl[] = // Q0 +{ + /* IC GC TC0 TC64 TC128 TC192 TC256 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_8k00 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_14k80 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_22k60 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_24k40 */ + 78, 78, 78, 78, 78, 48, 48, 48, 48, 49, 48, 49, 49, 48, 49, 50, 50, 51, 52, 52, 50, 54, 53, 54, 54, 55, 55, 55, 55, 54, 52, 56, 56, 56, 56, /* ACELP_29k00 */ + 79, 79, 79, 79, 78, 49, 49, 49, 49, 49, 50, 49, 49, 50, 49, 52, 52, 51, 52, 52, 54, 54, 53, 54, 54, 56, 55, 55, 56, 56, 56, 56, 56, 56, 56, /* ACELP_29k20 */ + 78, 78, 78, 78, 78, 50, 50, 50, 50, 49, 51, 50, 50, 50, 50, 53, 53, 53, 52, 52, 55, 55, 55, 54, 54, 57, 57, 56, 56, 56, 57, 57, 57, 57, 56, /* ACELP_30k20 */ + 79, 79, 79, 79, 78, 51, 51, 51, 50, 50, 51, 51, 51, 51, 51, 54, 54, 53, 53, 53, 56, 56, 56, 55, 54, 58, 57, 57, 57, 57, 58, 58, 58, 57, 57, /* ACELP_30k40 */ + 86, 85, 85, 85, 85, 57, 57, 57, 57, 57, 58, 58, 57, 57, 57, 60, 60, 60, 60, 59, 62, 62, 62, 62, 61, 64, 64, 64, 63, 63, 64, 64, 64, 64, 64, /* ACELP_32k */ + 143,142,142,142,142, 116,115,115,115,115, 116,116,115,115,115, 119,119,118,118,118, 121,121,121,121,121, 124,124,123,123,123, 126,126,126,126,126, /* ACELP_48k */ + 207,206,206,206,206, 180,179,179,179,179, 180,180,179,179,179, 183,183,182,182,182, 185,185,185,185,185, 188,188,187,187,187, 190,190,190,190,190 /* ACELP_64k */ +}; + +/* bit allocation table for reserved bits (ACELP@12.8kHz) */ +const Word16 reserved_bits_tbl[] = // Q0 +{ +/* UC VC GC TC0_0 TC0_64 TC0_128 TC0_192 TC64 TC128 TC192 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_5k00 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ACELP_6k15 */ + 1, 0, 0, 0, 0, 2, 4, 0, 3, 0, /* ACELP_7k20 */ + 14, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* ACELP_8k00 */ + 46, 0, 0, 0, 1, 2, 4, 1, 4, 0, /* ACELP_9k60 */ + 0, 0, 0, 0, 1, 3, 6, 2, 6, 0, /* ACELP_11k60 */ + 0, 0, 0, 0, 2, 4, 0, 3, 7, 0, /* ACELP_12k15 */ + 0, 0, 0, 0, 1, 3, 0, 2, 0, 0, /* ACELP_12k85 */ + 0, 0, 0, 0, 1, 4, 1, 3, 0, 0, /* ACELP_13k20 */ + 0, 0, 0, 0, 2, 5, 2, 4, 1, 1, /* ACELP_14k80 */ + 0, 0, 0, 0, 2, 0, 5, 5, 3, 3, /* ACELP_16k40 */ + 0, 0, 2, 2, 0, 1, 3, 0, 0, 1, /* ACELP_22k60 */ + 0, 0, 1, 1, 3, 8, 19, 7, 11, 11, /* ACELP_24k40 */ +}; + +/* NRG mode */ +const UWord8 ACELP_NRG_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = // Q0 +{ + {{0,0,1,1,0,0,0,0},{2,2,1,1,0,0,0,0}}, + {{1,1,1,1,0,0,0,0},{1,1,1,1,1,1,1,0}}, +}; + +/* NRG bits : (0/2/3 bits) */ +const UWord8 ACELP_NRG_BITS[3] = { 0, 3, 4 }; // Q0 + +/* LTP MODE*/ +const UWord8 ACELP_LTP_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = // Q0 +{ + {{0,0,1,2,0,0,0,0},{0,0,1,2,0,0,0,0}}, + {{4,4,3,4,0,0,0,0},{4,4,3,4,8,0,9,0}}, +}; + +/* LTP bits */ +const UWord8 ACELP_LTP_BITS_SFR[8+RF_MODE_MAX][5] = // Q0 +{ + {0,0,0,0,0}, + {8,4,4,4,4}, + {8,5,8,5,5}, + {9,6,6,6,6}, + {9,6,9,6,6}, + {8,5,5,5,5}, + {8,5,8,5,5}, + {8,0,0,0,0}, + {8,5,5,5,5}, /* All-pred mode in RF, rf_frame_type = 0 */ + {8,4,4,4,0}, /* Gen-pred mode in RF, rf_frame_type = 2 */ +}; + +/* LTF modes (0 - LOW_PASS (LP filtering), 1 - FULL_BAND (no filtering), 2 - NORMAL_OPERATION (adaptive)) */ +/* Mode 2 ACELP: INACTIVE,UNVOICED,VOICED,GENERIC */ +const UWord8 ACELP_LTF_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = // Q0 +{ + {{1,1,1,0,0,0,0,0},{1,1,1,0,0,0,0,0}}, + {{0,0,2,0,0,0,0,0},{0,0,2,0,1,1,1,0}}, +}; + +/* LTF bits */ +const UWord8 ACELP_LTF_BITS[4] = { 0, 0, 4, 0 }; // Q0 + +/* GAINS ELEMENT */ +/* 5 modes: (EVS: 5b/subframe), (AMRWB: 7b/subframe),(AMRWB: 6b/subframe),(UC: 5b/subframe) */ +const UWord8 ACELP_GAINS_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = // Q0 +{ + {{6,6,1,1,0,0,0,0},{7,7,1,1,0,0,0,0}}, + {{2,2,3,3,0,0,0,0},{2,2,3,3,3,2,1,0}}, +}; + +/* gains bits */ +const UWord8 ACELP_GAINS_BITS[10] = // Q0 +{ + 0, /* skip sub-frame wise gain coding*/ + 5, + 6, + 7, + 6, + 7, + 6, /* UC */ + 7, /* GUNVOICED UV (5b ICB/2b Gaussian) */ + 4, /* GNELP UV */ + 5 /* GNELP UV */ +}; + +/* BPF modes (0 - no filtering, 1 - filtering, 2 - adaptive) */ +const UWord8 ACELP_BPF_MODE[RATE_MODE_MAX][BANDWIDTH_MODE_MAX][ACELP_MODE_MAX+RF_MODE_MAX] = // Q0 +{ + {{1,1,1,1,0,0,0,0},{1,1,1,1,0,0,0,0}}, + {{1,1,2,2,0,0,0,0},{1,1,2,2,1,1,1,1}}, +}; + +/* BPF bits */ +const UWord8 ACELP_BPF_BITS[3] = { 0, 0, 2 }; // Q0 +const Word16 ACELP_CDK_BITS[ACELP_FIXED_CDK_NB] = +{ + 7, 10, 12, 15, 17, 20, 24, 26, 28, 30, 32, 34, 36, 40, 43, 46, + 47, 49, 50, 53, 55, 56, 58, 59, 61, 62, 65, 68, 70, 73, 75, 78, 80, 83, + 85, 87, 89, 92, 94, 96, 98 +}; + +/*----------------------------------------------------------------------------------* + * Perceptual critical bands + *----------------------------------------------------------------------------------*/ + +const Word32 crit_bands_fx[] =//Q0 +{ + 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, + 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, 6350, 7700, + 9500, 12000, 15500, 40000 +}; + + +const Word16 crit_bins_corr_fx[CRIT_NOIS_BAND] = +{//Q15 + /*.9f, .9f, .85f, .8f, .775f, .75f, .725f , .7f , .675f, .65f, .625f , .60f, .6f, .6f, .6f, .6f, .6f, .6f, .6f, .6f, .6f, .6f, .6f*/ + 29491, 29491, 27853, 26214, 25395, 24576, 23577 , 22938, 22118, 21299, 20480, + 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661 +}; +const Word16 crit_bins[CRIT_NOIS_BAND] = // Q0 +{ + 4, 4, 4, 4, 4, 5, 6, 6, 6, 8, 8, 10, 11, 13, 15, 18, 22, 16, 16, 20, 20, 20, 16 +}; + + +const Word16 crit_bands_loc_fx[CRIT_NOIS_BAND] = +{//Q0 + 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, + 2000, 2320, 2700, 3150, 3700, 4100, 4500, 5000, 5500, 6000, 6375 +}; + +const Word16 inv_tbl_fx[146] =//Q15 +{ + 0, 32767, 16384, 10923, 8192, 6554, 5462, 4681, + 4096, 3641, 3277, 2979, 2731, 2521, 2341, 2185, + 2048, 1928, 1820, 1725, 1638, 1560, 1489, 1425, + 1365, 1311, 1260, 1214, 1170, 1130, 1092, 1057, + 1024, 993, 964, 936, 910, 886, 862, 840, + 819, 799, 780, 762, 745, 728, 712, 697, + 683, 669, 655, 643, 630, 618, 607, 596, + 585, 575, 565, 555, 546, 537, 529, 520, + 512, 504, 496, 489, 482, 475, 468, 462, + 455, 449, 443, 437, 431, 426, 420, 415, + 410, 405, 400, 395, 390, 386, 381, 377, + 372, 368, 364, 360, 356, 352, 349, 345, + 341, 338, 334, 331, 328, 324, 321, 318, + 315, 312, 309, 306, 303, 301, 298, 295, + 293, 290, 287, 285, 282, 280, 278, 275, + 273, 271, 269, 266, 264, 262, 260, 258, + 256, 254, 252, 250, 248, 246, 245, 243, + 241, 239, 237, 236, 234, 232, 231, 229, + 228, 226 +}; + + +const Word16 hvq_bwe_fac_fx[16] = /* Q15 */ +{ + 16384, 17408, 18432, 19456, + 20480, 21504, 22528, 23552, + 24576, 25600, 26624, 27648, + 28672, 29696, 30720, 31744 +}; + +const Word16 sqac_headroom_fx[146] = /* Q0 */ +{ + 0 /*not used */, 0, 0, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4 +}; + +const Word16 inv_N_fx[32] = /* Q15 */ +{ + 0, 1056, 2113, 3170, + 4227, 5284, 6341, 7398, + 8455, 9512, 10569, 11626, + 12683, 13740, 14797, 15854, + 16912, 17969, 19026, 20083, + 21140, 22197, 23254, 24311, + 25368, 26425, 27482, 28539, + 29596, 30653, 31710, 32767 +}; + +const Word16 band_len_harm[SFM_N_HARM_FB] = +{ + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 16, 16, 16, 16, 16, 16, 32, 32, 32, 48, 48, 48, 48, 64, 64, 64, 96 +}; + +const Word32 thren_fx[39] = /* Q8 */ +{ + 28215802, 19951584, 14107901, + 9975792, 7053951, 4987896, + 3526975, 2493948, 1763488, + 1246974, 881744, 623487, + 440872, 311744, 220436, + 155872, 110218, 77936, + 55109, 38968, 27554, + 19484, 13777, 9742, + 6889, 4871, 3444, + 2435, 1722, 1218, + 861, 609, 431, + 304, 215, 152, + 108, 76, 54 +}; + +const Word16 dicnlg2[40] = // Q0 +{ + 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, + 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, + 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, + 4, 3, 2, 1, 0, -1, -2, -3, -4, -5 +}; + +/*----------------------------------------------------------------------------------* + * LD music post-filter + *----------------------------------------------------------------------------------*/ + +const Word16 mfreq_loc_LD_fx[] = { 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480,//Q0 + 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, (6400 - BIN_16kdct_fx) +}; + +const Word16 mfreq_bindiv_LD[] = {10, 10, 10, 10, 11, 12, 14, 15, 16, 19, 21, 24, 28, 32, 38, 45, 55, 70, 90, 110}; // Q0 +const Word16 sc_qnoise_fx[] = { 3277, 3277, 3277, 3277, 3277, 3277, 2979, 2979, 2979, 2979, 2979, 2979, 2979, 2979, 2979, 2185, 2185, 2185, 2185, 2185 };//Q15 +const Word16 inv_mfreq_bindiv_LD_fx[] = { 3277, 3277, 3277, 3277, 2979, 2731, 2341, 2185, 2048, 1725, 1560, 1365, 1170, 1024, 862, 728, 596, 468, 364, 298 }; /*Q15 */ + +const Word16 inv_mfreq_bindiv_LD_M1_fx[] = { 3641, 3641, 3641, 3641, 3277, 2979, 2521, 2341, 2185, 1820, 1638, 1425, 1214, 1057, 886, 745, 607, 475, 368, 301 }; /*Q15 */ + +const Word16 post_dct_wind_fx[OFFSET2] = /*Q15 */ +{ + 32767, 32766, 32759, 32748, 32733, 32713, 32689, 32660, + 32627, 32590, 32548, 32502, 32452, 32397, 32338, 32274, + 32207, 32135, 32059, 31979, 31894, 31805, 31712, 31615, + 31514, 31409, 31300, 31187, 31070, 30949, 30823, 30695, + 30562, 30425, 30285, 30141, 29993, 29841, 29686, 29527, + 29365, 29200, 29030, 28858, 28682, 28503, 28320, 28134, + 27945, 27753, 27558, 27360, 27159, 26955, 26749, 26539, + 26327, 26112, 25894, 25674, 25452, 25226, 24999, 24769, + 24537, 24303, 24067, 23828, 23588, 23345, 23101, 22855, + 22607, 22358, 22107, 21854, 21600, 21345, 21088, 20830, + 20570, 20310, 20049, 19786, 19523, 19258, 18993, 18728, + 18461, 18195, 17927, 17659, 17391, 17123, 16854, 16586, + 16317, 16048, 15779, 15511, 15243, 14975, 14707, 14440, + 14173, 13907, 13642, 13377, 13114, 12851, 12589, 12328, + 12068, 11809, 11552, 11296, 11041, 10787, 10536, 10285, + 10037, 9790, 9545, 9301, 9060, 8820, 8583, 8348, + 8115, 7884, 7655, 7429, 7205, 6983, 6765, 6548, + 6335, 6124, 5916, 5710, 5508, 5308, 5112, 4918, + 4728, 4540, 4356, 4175, 3998, 3824, 3653, 3485, + 3321, 3161, 3004, 2851, 2701, 2555, 2413, 2274, + 2139, 2009, 1882, 1758, 1639, 1524, 1413, 1306, + 1203, 1104, 1009, 918, 831, 749, 671, 597, + 527, 461, 400, 343, 291, 242, 199, 159, + 124, 93, 67, 45, 27, 14, 5, 1 +}; + +const Word16 MAX_SNR_SNR1_tab_FX[MBANDS_GN_LD] = { 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 16815, 17096, 17096, 17096, 17096 };//Q14 + +const Word16 INV_MAX_SNR_tab_FX[MBANDS_GN_LD] = { 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 1425, 1425, 1425, 1425 };//Q15 + +const Word16 wind_sss_fx[LEN_WIN_SSS] = /*window for subsampling*/ +{//Q15 + 2621, 2627, 2645, 2675, 2717, 2771, 2836, 2914, + 3003, 3103, 3216, 3340, 3475, 3621, 3779, 3948, + 4127, 4318, 4519, 4730, 4952, 5184, 5426, 5677, + 5938, 6209, 6488, 6777, 7074, 7379, 7693, 8015, + 8344, 8681, 9025, 9375, 9733, 10097, 10466, 10842, + 11223, 11609, 12000, 12395, 12795, 13198, 13605, 14016, + 14429, 14845, 15263, 15683, 16105, 16527, 16951, 17376, + 17800, 18225, 18649, 19072, 19495, 19916, 20335, 20752, + 21166, 21578, 21987, 22392, 22794, 23191, 23585, 23973, + 24357, 24735, 25108, 25474, 25835, 26189, 26537, 26877, + 27210, 27536, 27853, 28163, 28464, 28757, 29041, 29316, + 29582, 29838, 30085, 30322, 30549, 30765, 30972, 31167, + 31352, 31526, 31690, 31842, 31983, 32112, 32230, 32337, + 32432, 32515, 32586, 32646, 32694, 32730, 32754, 32766, + 32767, 32096, 30111, 26894, 22575, 17333, 11380, 4962 +}; +/*----------------------------------------------------------------------------------* + * Low-pass FIR filter for low-frequency post-filtering @ 8kHz + * fir1(240,(3900/32000),hanning(241))*5 + *----------------------------------------------------------------------------------*/ + +const Word16 filter5_39s320_120_fx[121] = /* Q15 */ +{ + 19968, 19480, 18061, 15834, 12993, 9779, 6458, 3290, + 506, -1713, -3253, -4075, -4212, -3762, -2873, -1720, + -488, 654, 1568, 2160, 2389, 2263, 1838, 1201, + 460, -275, -903, -1348, -1566, -1546, -1312, -914, + -422, 90, 547, 891, 1083, 1108, 975, 716, + 376, 9, -331, -599, -762, -805, -732, -562, + -325, -61, 192, 399, 533, 582, 546, 435, + 272, 83, -103, -259, -366, -413, -398, -328, + -218, -86, 46, 161, 243, 283, 280, 238, + 166, 77, -14, -94, -153, -185, -188, -163, + -119, -62, -3, 50, 90, 113, 117, 104, + 78, 44, 9, -23, -47, -62, -65, -58, + -45, -27, -8, 9, 21, 28, 30, 27, + 20, 13, 5, -2, -7, -9, -9, -8, + -6, -3, -1, 0, 1, 1, 1, 0, + 0 + +}; + + +/*----------------------------------------------------------------------------------* + * LP analysis windows + *----------------------------------------------------------------------------------*/ +const Word16 Assym_window_W16fx[L_LP] = /*Q15*/ +{ + 2621, 2624, 2630, 2640, 2655, 2674, 2698, 2725, + 2757, 2792, 2833, 2877, 2925, 2978, 3034, 3095, + 3160, 3229, 3302, 3379, 3460, 3545, 3634, 3727, + 3824, 3925, 4029, 4138, 4250, 4366, 4486, 4609, + 4737, 4867, 5002, 5140, 5281, 5426, 5575, 5727, + 5882, 6040, 6202, 6367, 6535, 6707, 6881, 7059, + 7239, 7422, 7609, 7798, 7990, 8184, 8382, 8581, + 8784, 8989, 9196, 9406, 9618, 9832, 10049, 10268, + 10489, 10711, 10936, 11163, 11391, 11622, 11854, 12087, + 12322, 12559, 12797, 13037, 13278, 13520, 13763, 14007, + 14253, 14499, 14746, 14994, 15243, 15493, 15743, 15994, + 16245, 16496, 16748, 17000, 17253, 17505, 17758, 18010, + 18263, 18515, 18767, 19019, 19270, 19521, 19772, 20022, + 20271, 20519, 20767, 21014, 21260, 21504, 21748, 21991, + 22232, 22473, 22711, 22949, 23185, 23419, 23652, 23883, + 24113, 24340, 24566, 24790, 25012, 25231, 25449, 25664, + 25878, 26089, 26297, 26503, 26707, 26908, 27107, 27303, + 27496, 27687, 27874, 28059, 28241, 28420, 28596, 28769, + 28939, 29105, 29269, 29429, 29586, 29739, 29889, 30036, + 30179, 30319, 30455, 30588, 30717, 30842, 30964, 31082, + 31196, 31306, 31413, 31516, 31615, 31709, 31800, 31888, + 31971, 32050, 32125, 32196, 32263, 32325, 32384, 32439, + 32489, 32535, 32577, 32615, 32649, 32679, 32704, 32725, + 32742, 32755, 32763, 32767, 32767, 32758, 32741, 32715, + 32681, 32638, 32587, 32527, 32458, 32381, 32296, 32203, + 32101, 31991, 31873, 31746, 31612, 31470, 31320, 31162, + 30996, 30823, 30642, 30454, 30259, 30056, 29847, 29630, + 29407, 29177, 28940, 28697, 28448, 28193, 27931, 27664, + 27391, 27113, 26829, 26540, 26246, 25947, 25643, 25335, + 25022, 24706, 24385, 24060, 23732, 23401, 23066, 22728, + 22387, 22043, 21697, 21349, 20999, 20646, 20292, 19937, + 19580, 19223, 18864, 18505, 18145, 17785, 17425, 17065, + 16705, 16346, 15988, 15631, 15275, 14920, 14567, 14215, + 13866, 13519, 13174, 12832, 12492, 12156, 11823, 11493, + 11166, 10844, 10525, 10210, 9900, 9594, 9292, 8996, + 8704, 8418, 8137, 7861, 7591, 7327, 7068, 6816, + 6570, 6330, 6097, 5870, 5650, 5437, 5231, 5032, + 4840, 4656, 4479, 4310, 4148, 3994, 3848, 3709, + 3579, 3457, 3343, 3237, 3139, 3050, 2969, 2896, + 2832, 2776, 2729, 2690, 2660, 2639, 2626, 2621 +}; + +const Word16 assym_window_16k_fx[L_LP_16k] = /*Q15*/ +{ + 2621, 2623, 2627, 2634, 2643, 2655, 2670, 2688, + 2708, 2731, 2757, 2785, 2816, 2849, 2886, 2925, + 2966, 3011, 3058, 3107, 3159, 3214, 3271, 3331, + 3394, 3459, 3527, 3597, 3670, 3745, 3823, 3903, + 3985, 4071, 4158, 4248, 4341, 4436, 4533, 4632, + 4734, 4839, 4945, 5054, 5165, 5279, 5394, 5512, + 5632, 5754, 5879, 6005, 6134, 6264, 6397, 6531, + 6668, 6807, 6947, 7090, 7234, 7381, 7529, 7679, + 7831, 7984, 8140, 8297, 8455, 8616, 8778, 8941, + 9107, 9273, 9442, 9611, 9782, 9955, 10129, 10304, + 10481, 10659, 10838, 11019, 11200, 11383, 11567, 11752, + 11938, 12125, 12313, 12502, 12693, 12883, 13075, 13268, + 13461, 13655, 13850, 14046, 14242, 14439, 14637, 14835, + 15033, 15232, 15432, 15631, 15832, 16032, 16233, 16434, + 16635, 16837, 17039, 17240, 17442, 17644, 17846, 18048, + 18250, 18452, 18653, 18855, 19056, 19257, 19458, 19658, + 19858, 20058, 20257, 20456, 20654, 20852, 21049, 21245, + 21441, 21637, 21831, 22025, 22218, 22410, 22602, 22792, + 22982, 23170, 23358, 23545, 23730, 23915, 24098, 24280, + 24461, 24641, 24820, 24997, 25173, 25348, 25521, 25693, + 25863, 26032, 26200, 26366, 26530, 26693, 26854, 27014, + 27171, 27328, 27482, 27635, 27786, 27935, 28082, 28227, + 28371, 28513, 28652, 28790, 28926, 29059, 29191, 29320, + 29448, 29573, 29697, 29818, 29937, 30053, 30168, 30280, + 30390, 30498, 30603, 30706, 30807, 30905, 31002, 31095, + 31186, 31275, 31362, 31446, 31527, 31606, 31683, 31757, + 31828, 31897, 31963, 32027, 32088, 32147, 32203, 32257, + 32307, 32356, 32401, 32444, 32484, 32522, 32557, 32589, + 32619, 32646, 32670, 32692, 32711, 32727, 32741, 32751, + 32760, 32765, 32767, 32767, 32762, 32751, 32734, 32712, + 32685, 32652, 32614, 32570, 32521, 32466, 32406, 32341, + 32270, 32194, 32112, 32026, 31934, 31837, 31735, 31627, + 31515, 31398, 31275, 31148, 31016, 30878, 30737, 30590, + 30438, 30282, 30122, 29957, 29787, 29613, 29434, 29252, + 29065, 28874, 28679, 28480, 28277, 28070, 27859, 27644, + 27426, 27205, 26980, 26751, 26520, 26285, 26047, 25805, + 25561, 25314, 25065, 24812, 24557, 24300, 24040, 23777, + 23513, 23246, 22978, 22707, 22435, 22161, 21885, 21608, + 21329, 21049, 20768, 20485, 20202, 19918, 19632, 19347, + 19060, 18773, 18486, 18198, 17911, 17623, 17335, 17047, + 16760, 16473, 16186, 15900, 15614, 15330, 15046, 14763, + 14481, 14200, 13921, 13643, 13367, 13092, 12818, 12547, + 12277, 12010, 11744, 11481, 11220, 10961, 10705, 10451, + 10200, 9951, 9706, 9463, 9223, 8987, 8754, 8523, + 8297, 8073, 7854, 7637, 7425, 7216, 7011, 6810, + 6613, 6420, 6231, 6046, 5865, 5689, 5517, 5350, + 5187, 5028, 4875, 4726, 4581, 4442, 4307, 4177, + 4052, 3932, 3818, 3708, 3603, 3503, 3409, 3320, + 3236, 3157, 3084, 3016, 2953, 2895, 2844, 2797, + 2756, 2720, 2690, 2665, 2646, 2632, 2624, 2621 +}; + +const Word16 lag_window_8k[2][16] = /* LAGW_STRONG Q15*/ +{ + /* h */ { 32728, 32619, 32438, 32187, 31867, 31480, 31029, 30517, 29946, 29321, 28645, 27923, 27158, 26356, 25521, 24658 }, + /* l */ { 11904, 17280, 30720, 25856, 24192, 28992, 24384, 7360, 19456, 14720, 22080, 12928, 31040, 27328, 22080, 5184 } +}; +const Word16 lag_window_12k8[NUM_LAGW_STRENGTHS][2][16] = +{//Q15 + /* LAGW_WEAK */ + { + /* h */ { 32763, 32758, 32750, 32739, 32725, 32707, 32687, 32663, 32637, 32607, 32574, 32538, 32498, 32456, 32411, 32362 }, + /* l */ { 4736, 13312, 16896, 15360, 8896, 30464, 14528, 27008, 2496, 6720, 7296, 4480, 31424, 22976, 12160, 32384 } +}, +/* LAGW_MEDIUM */ +{ + /* h */ { 32758, 32739, 32707, 32663, 32607, 32538, 32456, 32362, 32257, 32139, 32009, 31867, 31714, 31549, 31374, 31187 }, + /* l */ { 13312, 15360, 30464, 27008, 6720, 4480, 22976, 32384, 3520, 5888, 11200, 24192, 17472, 29376, 576, 3136 } +}, +/* LAGW_STRONG */ +{ + /* h */ { 32750, 32707, 32637, 32538, 32411, 32257, 32075, 31867, 31633, 31374, 31089, 30780, 30449, 30094, 29718, 29321 }, + /* l */ { 16896, 30464, 2496, 4480, 12160, 3520, 24256, 24192, 20736, 576, 18240, 31488, 128, 16704, 11520, 14720 } +} +}; +const Word16 lag_window_16k[NUM_LAGW_STRENGTHS][2][16] = +{//Q15 + /* LAGW_WEAK */ + { + /* h */ { 32763, 32760, 32755, 32748, 32739, 32728, 32715, 32700, 32682, 32663, 32642, 32619, 32594, 32567, 32538, 32507 }, + /* l */ { 23360, 22272, 20672, 18304, 15360, 11904, 8000, 3648, 31808, 27008, 22080, 17280, 12608, 8256, 4480, 1344 } +}, +/* LAGW_MEDIUM */ +{ + /* h */ { 32760, 32748, 32728, 32700, 32663, 32619, 32567, 32507, 32438, 32362, 32279, 32187, 32088, 31981, 31867, 31746 }, + /* l */ { 22272, 18304, 11904, 3648, 27008, 17280, 8256, 1344, 30720, 32384, 8256, 25856, 21824, 31360, 24192, 3072 } +}, +/* LAGW_STRONG */ +{ + /* h */ { 32755, 32728, 32682, 32619, 32538, 32438, 32322, 32187, 32036, 31867, 31682, 31480, 31263, 31029, 30780, 30517 }, + /* l */ { 20672, 11904, 31808, 17280, 4480, 30720, 2944, 25856, 8320, 24192, 16896, 28992, 5824, 24384, 31488, 7360 } +} +}; +const Word16 lag_window_25k6[NUM_LAGW_STRENGTHS][2][16] = +{//Q15 + /* LAGW_WEAK */ + { + /* h */ { 32764, 32763, 32761, 32758, 32754, 32750, 32745, 32739, 32732, 32725, 32716, 32707, 32698, 32687, 32676, 32663 }, + /* l */ { 10752, 4736, 5568, 13312, 28096, 16896, 12672, 15360, 25024, 8896, 32576, 30464, 2624, 14528, 832, 27008 } +}, +/* LAGW_MEDIUM */ +{ + /* h */ { 32763, 32758, 32750, 32739, 32725, 32707, 32687, 32663, 32637, 32607, 32574, 32538, 32498, 32456, 32411, 32362 }, + /* l */ { 4736, 13312, 16896, 15360, 8896, 30464, 14528, 27008, 2496, 6720, 7296, 4480, 31424, 22976, 12160, 32384 } +}, +/* LAGW_STRONG */ +{ + /* h */ { 32761, 32750, 32732, 32707, 32676, 32637, 32591, 32538, 32478, 32411, 32337, 32257, 32169, 32075, 31975, 31867 }, + /* l */ { 5568, 16896, 25024, 30464, 832, 2496, 3328, 4480, 7040, 12160, 21440, 3520, 25728, 24256, 1216, 24192 } +} +}; +const Word16 lag_window_32k[NUM_LAGW_STRENGTHS][2][16] = +{//Q15 + /* LAGW_WEAK */ + { + /* h */ { 32764, 32763, 32762, 32760, 32758, 32755, 32752, 32748, 32744, 32739, 32734, 32728, 32722, 32715, 32707, 32700 }, + /* l */ { 15424, 23360, 14720, 22272, 13312, 20672, 11328, 18304, 8704, 15360, 5504, 11904, 1792, 8000, 30464, 3648 } +}, +/* LAGW_MEDIUM */ +{ + /* h */ { 32763, 32760, 32755, 32748, 32739, 32728, 32715, 32700, 32682, 32663, 32642, 32619, 32594, 32567, 32538, 32507 }, + /* l */ { 23360, 22272, 20672, 18304, 15360, 11904, 8000, 3648, 31808, 27008, 22080, 17280, 12608, 8256, 4480, 1344 } +}, +/* LAGW_STRONG */ +{ + /* h */ { 32762, 32755, 32744, 32728, 32707, 32682, 32653, 32619, 32581, 32538, 32490, 32438, 32382, 32322, 32257, 32187 }, + /* l */ { 14720, 20672, 8704, 11904, 30464, 31808, 16384, 17280, 2240, 4480, 24704, 30720, 23168, 2944, 3520, 25856 } +} +}; +const Word16 lag_window_48k[2][16] = /* LAGW_STRONG */ +{//Q15 + /* h */ { 32763, 32760, 32755, 32748, 32739, 32728, 32715, 32700, 32682, 32663, 32642, 32619, 32594, 32567, 32538, 32507 }, + /* l */ { 23360, 22272, 20672, 18304, 15360, 11904, 8000, 3648, 31808, 27008, 22080, 17280, 12608, 8256, 4480, 1344 } +}; + +/* 32 bit declarations */ +const Word32 lag_window_8k_32[16] = /* LAGW_STRONG */ +{//Q31 + 2144886016, 2137753344, 2125918208, 2109458944, 2088484096, 2063131264, 2033565312, 1999976832, 1962579968, 1921610496, 1877322880, 1829987584, 1779888768, 1727321472, 1672588416, 1615997056 +}; + +const Word32 lag_window_12k8_32[NUM_LAGW_STRENGTHS][16] = +{//Q31 + /* LAGW_WEAK */ + { + 2147165440, 2146854912, 2146337792, 2145613824, 2144683392, 2143546880, 2142204288, 2140656384, 2138903424, 2136945792, 2134784256, 2132419328, 2129851776, 2127082368, 2124111616, 2120940800 +}, +/* LAGW_MEDIUM */ +{ + 2146854912, 2145613824, 2143546880, 2140656384, 2136945792, 2132419328, 2127082368, 2120940800, 2114001792, 2106273280, 2097764224, 2088484096, 2078443648, 2067654016, 2056127616, 2043877504 +}, +/* LAGW_STRONG */ +{ + 2146337792, 2143546880, 2138903424, 2132419328, 2124111616, 2114001792, 2102115712, 2088484096, 2073141760, 2056127616, 2037485184, 2017261056, 1995505920, 1972273792, 1947621888, 1921610496 +} +}; + +const Word32 lag_window_16k_32[NUM_LAGW_STRENGTHS][16] = +{//Q31 + /* LAGW_WEAK */ + { + 2147202688, 2147003904, 2146673024, 2146209536, 2145613824, 2144886016, 2144026240, 2143034496, 2141911168, 2140656384, 2139270272, 2137753344, 2136105600, 2134327424, 2132419328, 2130381440 +}, +/* LAGW_MEDIUM */ +{ + 2147003904, 2146209536, 2144886016, 2143034496, 2140656384, 2137753344, 2134327424, 2130381440, 2125918208, 2120940800, 2115453056, 2109458944, 2102962816, 2095969536, 2088484096, 2080512000 +}, +/* LAGW_STRONG */ +{ + 2146673024, 2144886016, 2141911168, 2137753344, 2132419328, 2125918208, 2118260480, 2109458944, 2099527936, 2088484096, 2076345344, 2063131264, 2048863616, 2033565312, 2017261056, 1999976832 +} +}; +const Word32 lag_window_25k6_32[NUM_LAGW_STRENGTHS][16] = +{//Q31 + /* LAGW_WEAK */ + { + 2147243008, 2147165440, 2147036032, 2146854912, 2146622336, 2146337792, 2146001664, 2145613824, 2145174400, 2144683392, 2144140928, 2143546880, 2142901376, 2142204288, 2141456000, 2140656384 +}, +/* LAGW_MEDIUM */ +{ + 2147165440, 2146854912, 2146337792, 2145613824, 2144683392, 2143546880, 2142204288, 2140656384, 2138903424, 2136945792, 2134784256, 2132419328, 2129851776, 2127082368, 2124111616, 2120940800 +}, +/* LAGW_STRONG */ +{ + 2147036032, 2146337792, 2145174400, 2143546880, 2141456000, 2138903424, 2135890432, 2132419328, 2128492288, 2124111616, 2119280512, 2114001792, 2108279040, 2102115712, 2095516032, 2088484096 +} +}; +const Word32 lag_window_32k_32[NUM_LAGW_STRENGTHS][16] = +{//Q31 + /* LAGW_WEAK */ + { + 2147252352, 2147202688, 2147119872, 2147003904, 2146854912, 2146673024, 2146457728, 2146209536, 2145928192, 2145613824, 2145266432, 2144886016, 2144472576, 2144026240, 2143546880, 2143034496 +}, +/* LAGW_MEDIUM */ +{ + 2147202688, 2147003904, 2146673024, 2146209536, 2145613824, 2144886016, 2144026240, 2143034496, 2141911168, 2140656384, 2139270272, 2137753344, 2136105600, 2134327424, 2132419328, 2130381440 +}, +/* LAGW_STRONG */ +{ + 2147119872, 2146673024, 2145928192, 2144886016, 2143546880, 2141911168, 2139979776, 2137753344, 2135232896, 2132419328, 2129314048, 2125918208, 2122233088, 2118260480, 2114001792, 2109458944 +} +}; +const Word32 lag_window_48k_32[16] = /* LAGW_STRONG */ +{//Q31 + 2147202688, 2147003904, 2146673024, 2146209536, 2145613824, 2144886016, 2144026240, 2143034496, 2141911168, 2140656384, 2139270272, 2137753344, 2136105600, 2134327424, 2132419328, 2130381440 +}; +/*----------------------------------------------------------------------------------* + * LP analysis - grid of points for evaluating Chebyshev polynomials + *----------------------------------------------------------------------------------*/ + +const Word16 grid50_fx[(GRID50_POINTS - 1) / 2 - 1] = +{//Q15 + 32703, 32510, 32188, 31739, 31164, 30467, + 29649, 28715, 27667, 26510, 25248, 23887, + 22431, 20887, 19261, 17558, 15786, 13952, + 12063, 10126, 8149, 6140, 4107, 2058 +}; + +const Word16 grid40_fx[(GRID40_POINTS - 1) / 2 - 1] = +{//Q15 + 32667, 32365, 31863, 31164, 30274, 29197, + 27939, 26510, 24917, 23170, 21281, 19261, + 17121, 14876, 12540, 10126, 7650, 5126, + 2571 +}; + +/*----------------------------------------------------------------------------------* + * Sinus & Cosinus - table for the FFT and IFFT of 256 points, + * dimension of the table = 161 + *----------------------------------------------------------------------------------*/ +const Word16 sincos_t_fx[161] = +{ + /*Q15 */ + 0, + 804, 1607, 2410, 3211, 4011, + 4808, 5602, 6392, 7179, 7961, + 8739, 9512, 10278, 11039, 11793, + 12539, 13278, 14010, 14732, 15446, + 16151, 16846, 17530, 18204, 18868, + 19519, 20159, 20787, 21403, 22005, + 22594, 23170, 23732, 24279, 24812, + 25330, 25832, 26319, 26790, 27245, + 27684, 28106, 28511, 28898, 29269, + 29621, 29956, 30273, 30572, 30852, + 31114, 31357, 31581, 31785, 31971, + 32138, 32285, 32413, 32521, 32610, + 32679, 32728, 32758, 32767, 32758, + 32728, 32679, 32610, 32521, 32413, + 32285, 32138, 31971, 31785, 31581, + 31357, 31114, 30852, 30572, 30273, + 29956, 29621, 29269, 28898, 28511, + 28106, 27684, 27245, 26790, 26319, + 25832, 25330, 24812, 24279, 23732, + 23170, 22594, 22005, 21403, 20787, + 20159, 19519, 18868, 18204, 17530, + 16846, 16151, 15446, 14732, 14010, + 13278, 12539, 11793, 11039, 10278, + 9512, 8739, 7961, 7179, 6392, + 5602, 4808, 4011, 3211, 2410, + 1607, 804, 0, -804, -1607, + -2410, -3211, -4011, -4808, -5602, + -6392, -7179, -7961, -8739, -9512, + -10278, -11039, -11793, -12539, -13278, + -14010, -14732, -15446, -16151, -16846, + -17530, -18204, -18868, -19519, -20159, + -20787, -21403, -22005, -22594, -23170, +}; + + +/*----------------------------------------------------------------------------------* + * Sinus & Cosinus - table for the FFT and IFFT of 1024 points, value range [0 ... sin(-5pi/4)] + * dimension of the table = 641=4*256*(5/8)+1 + *----------------------------------------------------------------------------------*/ + +const Word16 sincos_t_ext_fx[641] = +{//Q15 + 0, 201, 402, 603, 804, 1005, 1206, 1407, + 1608, 1809, 2009, 2210, 2411, 2611, 2811, 3012, + 3212, 3412, 3612, 3812, 4011, 4211, 4410, 4609, + 4808, 5007, 5205, 5404, 5602, 5800, 5998, 6195, + 6393, 6590, 6787, 6983, 7180, 7376, 7571, 7767, + 7962, 8157, 8351, 8546, 8740, 8933, 9127, 9319, + 9512, 9704, 9896, 10088, 10279, 10469, 10660, 10850, + 11039, 11228, 11417, 11605, 11793, 11980, 12167, 12354, + 12540, 12725, 12910, 13095, 13279, 13463, 13646, 13828, + 14010, 14192, 14373, 14553, 14733, 14912, 15091, 15269, + 15447, 15624, 15800, 15976, 16151, 16326, 16500, 16673, + 16846, 17018, 17190, 17361, 17531, 17700, 17869, 18037, + 18205, 18372, 18538, 18703, 18868, 19032, 19195, 19358, + 19520, 19681, 19841, 20001, 20160, 20318, 20475, 20632, + 20788, 20943, 21097, 21251, 21403, 21555, 21706, 21856, + 22006, 22154, 22302, 22449, 22595, 22740, 22884, 23028, + 23170, 23312, 23453, 23593, 23732, 23870, 24008, 24144, + 24279, 24414, 24548, 24680, 24812, 24943, 25073, 25202, + 25330, 25457, 25583, 25708, 25833, 25956, 26078, 26199, + 26320, 26439, 26557, 26674, 26791, 26906, 27020, 27133, + 27246, 27357, 27467, 27576, 27684, 27791, 27897, 28002, + 28106, 28209, 28311, 28411, 28511, 28610, 28707, 28803, + 28899, 28993, 29086, 29178, 29269, 29359, 29448, 29535, + 29622, 29707, 29792, 29875, 29957, 30038, 30118, 30196, + 30274, 30350, 30425, 30499, 30572, 30644, 30715, 30784, + 30853, 30920, 30986, 31050, 31114, 31177, 31238, 31298, + 31357, 31415, 31471, 31527, 31581, 31634, 31686, 31737, + 31786, 31834, 31881, 31927, 31972, 32015, 32058, 32099, + 32138, 32177, 32214, 32251, 32286, 32319, 32352, 32383, + 32413, 32442, 32470, 32496, 32522, 32546, 32568, 32590, + 32610, 32629, 32647, 32664, 32679, 32693, 32706, 32718, + 32729, 32738, 32746, 32753, 32758, 32762, 32766, 32767, + 32767, 32767, 32766, 32762, 32758, 32753, 32746, 32738, + 32729, 32718, 32706, 32693, 32679, 32664, 32647, 32629, + 32610, 32590, 32568, 32546, 32522, 32496, 32470, 32442, + 32413, 32383, 32352, 32319, 32286, 32251, 32214, 32177, + 32138, 32099, 32058, 32015, 31972, 31927, 31881, 31834, + 31786, 31737, 31686, 31634, 31581, 31527, 31471, 31415, + 31357, 31298, 31238, 31177, 31114, 31050, 30986, 30920, + 30853, 30784, 30715, 30644, 30572, 30499, 30425, 30350, + 30274, 30196, 30118, 30038, 29957, 29875, 29792, 29707, + 29622, 29535, 29448, 29359, 29269, 29178, 29086, 28993, + 28899, 28803, 28707, 28610, 28511, 28411, 28311, 28209, + 28106, 28002, 27897, 27791, 27684, 27576, 27467, 27357, + 27246, 27133, 27020, 26906, 26791, 26674, 26557, 26439, + 26320, 26199, 26078, 25956, 25833, 25708, 25583, 25457, + 25330, 25202, 25073, 24943, 24812, 24680, 24548, 24414, + 24279, 24144, 24008, 23870, 23732, 23593, 23453, 23312, + 23170, 23028, 22884, 22740, 22595, 22449, 22302, 22154, + 22006, 21856, 21706, 21555, 21403, 21251, 21097, 20943, + 20788, 20632, 20475, 20318, 20160, 20001, 19841, 19681, + 19520, 19358, 19195, 19032, 18868, 18703, 18538, 18372, + 18205, 18037, 17869, 17700, 17531, 17361, 17190, 17018, + 16846, 16673, 16500, 16326, 16151, 15976, 15800, 15624, + 15447, 15269, 15091, 14912, 14733, 14553, 14373, 14192, + 14010, 13828, 13646, 13463, 13279, 13095, 12910, 12725, + 12540, 12354, 12167, 11980, 11793, 11605, 11417, 11228, + 11039, 10850, 10660, 10469, 10279, 10088, 9896, 9704, + 9512, 9319, 9127, 8933, 8740, 8546, 8351, 8157, + 7962, 7767, 7571, 7376, 7180, 6983, 6787, 6590, + 6393, 6195, 5998, 5800, 5602, 5404, 5205, 5007, + 4808, 4609, 4410, 4211, 4011, 3812, 3612, 3412, + 3212, 3012, 2811, 2611, 2411, 2210, 2009, 1809, + 1608, 1407, 1206, 1005, 804, 603, 402, 201, + 0, -201, -402, -603, -804, -1005, -1206, -1407, + -1608, -1809, -2009, -2210, -2411, -2611, -2811, -3012, + -3212, -3412, -3612, -3812, -4011, -4211, -4410, -4609, + -4808, -5007, -5205, -5404, -5602, -5800, -5998, -6195, + -6393, -6590, -6787, -6983, -7180, -7376, -7571, -7767, + -7962, -8157, -8351, -8546, -8740, -8933, -9127, -9319, + -9512, -9704, -9896, -10088, -10279, -10469, -10660, -10850, + -11039, -11228, -11417, -11605, -11793, -11980, -12167, -12354, + -12540, -12725, -12910, -13095, -13279, -13463, -13646, -13828, + -14010, -14192, -14373, -14553, -14733, -14912, -15091, -15269, + -15447, -15624, -15800, -15976, -16151, -16326, -16500, -16673, + -16846, -17018, -17190, -17361, -17531, -17700, -17869, -18037, + -18205, -18372, -18538, -18703, -18868, -19032, -19195, -19358, + -19520, -19681, -19841, -20001, -20160, -20318, -20475, -20632, + -20788, -20943, -21097, -21251, -21403, -21555, -21706, -21856, + -22006, -22154, -22302, -22449, -22595, -22740, -22884, -23028, + -23028 +};/*Q15*/ + + +const Word16 Asr_LP16_fx[21] = +{ + /*Q15 */ + 0, 110, 0, -428, 0, 1153, 0, -2832, + 0, 10199, 16384, 10199, 0, -2832, 0, 1153, + 0, -428, 0, 110, 0 +}; + +const Word16 Asr_LP32_fx[41] = +{ + /*Q15 */ + 0, 24, 55, 58, 0, -113, -214, -198, + 0, 323, 576, 510, 0, -795, -1416, -1280, + 0, 2337, 5099, 7334, 8192, 7334, 5099, 2337, + 0, -1280, -1416, -795, 0, 510, 576, 323, + 0, -198, -214, -113, 0, 58, 55, 24, + 0 +}; + +const Word16 Asr_LP48_fx[61] = +{ + /*Q17 */ + 0, 38, 93, 146, 167, 123, 0, -192, + -408, -571, -592, -407, 0, 564, 1143, 1537, + 1546, 1035, 0, -1391, -2801, -3776, -3843, -2635, + 0, 3919, 8679, 13599, 17887, 20809, 21845, 20809, + 17887, 13599, 8679, 3919, 0, -2635, -3843, -3776, + -2801, -1391, 0, 1035, 1546, 1537, 1143, 564, + 0, -407, -592, -571, -408, -192, 0, 123, + 167, 146, 93, 38, 0 +}; + +const Word16 fft256_read_indexes[]= // Q0 +{ + 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, + 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, + 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, + 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, + 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, + 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, + 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, + 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, + 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, + 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, + 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, + 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, + 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, + 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, + 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, + 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255 +}; + + +/*----------------------------------------------------------------------------------* + * Sinus & Cosinus - table for the DCT-IV based 2 + *----------------------------------------------------------------------------------*/ + +const Word16 sin_table256_fx[] = +{//Q15 + 101, 302, 503, 704, 905, 1106, 1307, 1507, 1708, + 1909, 2110, 2310, 2511, 2711, 2912, 3112, 3312, 3512, + 3712, 3911, 4111, 4310, 4510, 4709, 4907, 5106, 5305, + 5503, 5701, 5899, 6097, 6294, 6491, 6688, 6885, 7081, + 7278, 7473, 7669, 7864, 8059, 8254, 8449, 8643, 8836, + 9030, 9223, 9416, 9608, 9800, 9992, 10183, 10374, 10565, + 10755, 10945, 11134, 11323, 11511, 11699, 11887, 12074, 12261, + 12447, 12633, 12818, 13003, 13187, 13371, 13554, 13737, 13919, + 14101, 14282, 14463, 14643, 14823, 15002, 15180, 15358, 15535, + 15712, 15888, 16064, 16239, 16413, 16587, 16760, 16932, 17104, + 17275, 17446, 17616, 17785, 17953, 18121, 18288, 18455, 18621, + 18786, 18950, 19114, 19277, 19439, 19601, 19761, 19921, 20081, + 20239, 20397, 20554, 20710, 20865, 21020, 21174, 21327, 21479, + 21631, 21781, 21931, 22080, 22228, 22375, 22522, 22668, 22812, + 22956, 23099, 23241, 23383, 23523, 23663, 23801, 23939, 24076, + 24212, 24347, 24481, 24614, 24746, 24878, 25008, 25138, 25266, + 25394, 25520, 25646, 25771, 25894, 26017, 26139, 26259, 26379, + 26498, 26616, 26733, 26848, 26963, 27077, 27190, 27301, 27412, + 27522, 27630, 27738, 27844, 27950, 28054, 28158, 28260, 28361, + 28461, 28560, 28658, 28755, 28851, 28946, 29040, 29132, 29224, + 29314, 29404, 29492, 29579, 29665, 29750, 29833, 29916, 29997, + 30078, 30157, 30235, 30312, 30388, 30462, 30536, 30608, 30680, + 30750, 30819, 30886, 30953, 31018, 31082, 31146, 31207, 31268, + 31328, 31386, 31443, 31499, 31554, 31608, 31660, 31711, 31761, + 31810, 31858, 31904, 31950, 31994, 32037, 32078, 32119, 32158, + 32196, 32233, 32268, 32303, 32336, 32368, 32398, 32428, 32456, + 32483, 32509, 32534, 32557, 32579, 32600, 32620, 32638, 32656, + 32672, 32686, 32700, 32712, 32723, 32733, 32742, 32749, 32756, + 32760, 32764, 32767, 32767 +}; +/*----------------------------------------------------------------------------------* + * 1/4 resolution interpolation filter (-3 dB at 0.913*fs/2) + *----------------------------------------------------------------------------------*/ + +const Word16 inter4_2_fx[] = +{//evs table , some mismatch in values compared to float is observed + 0, 1, 2, 1, + -2, -7, -10, -7, + 4, 19, 28, 22, + -2, -33, -55, -49, + -10, 47, 91, 92, + 38, -52, -133, -153, + -88, 43, 175, 231, + 165, -9, -209, -325, + -275, -60, 226, 431, + 424, 175, -213, -544, + -619, -355, 153, 656, + 871, 626, -16, -762, + -1207, -1044, -249, 853, + 1699, 1749, 780, -923, + -2598, -3267, -2147, 968, + 5531, 10359, 14031, 15401, + 14031, 10359, 5531, 968, + -2147, -3267, -2598, -923, + 780, 1749, 1699, 853, + -249, -1044, -1207, -762, + -16, 626, 871, 656, + 153, -355, -619, -544, + -213, 175, 424, 431, + 226, -60, -275, -325, + -209, -9, 165, 231, + 175, 43, -88, -153, + -133, -52, 38, 92, + 91, 47, -10, -49, + -55, -33, -2, 22, + 28, 19, 4, -7, + -10, -7, -2, 1, + 2, 1, 0, 0 +}; + +/* 1/4 resolution interpolation filter (-3 dB at 0.856*fs/2) */ +const Word32 L_pitch_inter4_2[PIT_FIR_SIZE2] = { /* Q31 */ + 2018634624, 1839083520, 1357785216, 724904576, 126856152, -281447072, + -428193216, -340524320, -121030032, 102233104, 229241728, 222704784, + 111802296, -32603096, -136805440, -158183648, -99851544, -2110976, + 82091856, 114123720, 86026048, 19988778, -46544560, -81104016, + -71266392, -27977416, 22982370, 55621972, 56517476, 29680372, + -7827578, -36105644, -42638288, -27414776, -1138166, 21646636, + 30326764, 22885734, 5570572, -11516955, -20066088, -17396766, + -6833293, 5003637, 12101070, 11944304, 6107443, -1346472, -6427418, + -7219840, -4389456, -249108, 2823941, 3633542, 2471753, 556198, + -895500, -1327144, -932007, -285615, 135291, 210453, 103079, 15032, 0 +}; +const Word16 pitch_inter4_2[PIT_FIR_SIZE2] = +{ + /* cut-off frequency at 0.94*fs/2 */ + 30802/*0.940000f Q15*/, + 28062/*0.856390f Q15*/, 20718/*0.632268f Q15*/, 11061/*0.337560f Q15*/, 1936/*0.059072f Q15*/, + -4295/*-0.131059f Q15*/, -6534/*-0.199393f Q15*/, -5196/*-0.158569f Q15*/, -1847/*-0.056359f Q15*/, + 1560/*0.047606f Q15*/, 3498/*0.106749f Q15*/, 3398/*0.1037059f Q15*/, 1706/*0.052062f Q15*/, + -497/*-0.015182f Q15*/, -2087/*-0.063705f Q15*/, -2414/*-0.073660f Q15*/, -1524/*-0.046497f Q15*/, + -32/*-0.000983f Q15*/, 1253/*0.038227f Q15*/, 1741/*0.053143f Q15*/, 1313/*0.040059f Q15*/, + 305/*0.009308f Q15*/, -710/*-0.021674f Q15*/, -1238/*-0.037767f Q15*/, -1087/*-0.033186f Q15*/, + -427/*-0.013028f Q15*/, 351/*0.010702f Q15*/, 849/*0.025901f Q15*/, 862/*0.026318f Q15*/, + 453/*0.013821f Q15*/, -119/*-0.003645f Q15*/, -551/*-0.016813f Q15*/, -651/*-0.019855f Q15*/, + -418/*-0.012766f Q15*/, -17/*-0.000530f Q15*/, 330/*0.010080f Q15*/, 463/*0.014122f Q15*/, + 349/*0.010657f Q15*/, 85/*0.002594f Q15*/, -176/*-0.005363f Q15*/, -306/*-0.009344f Q15*/, + -265/*-0.008101f Q15*/, -104/*-0.003182f Q15*/, 76/*0.002330f Q15*/, 185/*0.005635f Q15*/, + 182/*0.005562f Q15*/, 93/*0.002844f Q15*/, -21/*-0.000627f Q15*/, -98/*-0.002993f Q15*/, + -110/*-0.003362f Q15*/, -67/*-0.002044f Q15*/, -4/*-0.000116f Q15*/, 43/*0.001315f Q15*/, + 55/*0.001692f Q15*/, 38/*0.001151f Q15*/, 8/*0.000259f Q15*/, -14/*-0.000417f Q15*/, + -20/*-0.000618f Q15*/, -14/*-0.000434f Q15*/, -4/*-0.000133f Q15*/, 2/*0.000063f Q15*/, + 3/*0.000098f Q15*/, 2/*0.000048f Q15*/, 0/*0.000007f Q15*/, 0/*0.000000f Q15*/ +}; +/* 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) */ +const Word32 L_pitch_inter4_1[UP_SAMP * L_INTERPOL1 + 1] = /* Q31 */ +{ + 1932735283, 1758701061, 1298905484, 711630983, 180298432, -162768528, + -280712608, -226956816, -100446400, 9592809, 59676424, 55065776, + 26996016, 4138201, -3373696, -1617055, 0 +}; +/* 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) */ +const Word16 pitch_inter4_1[UP_SAMP * L_INTERPOL1 + 1] = +{ + 29491/*0.900000F Q15*/, + 26836/*0.818959F Q15*/, 19820/* 0.604850F Q15*/, 10859/* 0.331379F Q15*/, 2751/* 0.083958F Q15*/, + -2484/*-0.075795F Q15*/, -4283/* -0.130717F Q15*/, -3463/*-0.105685F Q15*/, -1533/*-0.046774F Q15*/, + 146/*0.004467F Q15*/, 911/* 0.027789F Q15*/, 840/* 0.025642F Q15*/, 412/* 0.012571F Q15*/, + 63/*0.001927F Q15*/, -51/* -0.001571F Q15*/, -25/*-0.000753F Q15*/, 0/* 0.000000f Q15*/ +}; + +/*----------------------------------------------------------------------------------* + * 1/6 resolution interpolation filter (-3 dB at 0.95*fs/2) + *----------------------------------------------------------------------------------*/ + +/* 1/6 resolution interpolation filter (-3 dB at 0.95*fs/2) */ +const Word16 pitch_inter6_2[PIT_FIR_SIZE6_2] = +{ + 31129/*0.949986374119862f Q15*/, + 29854/*0.911081104469830f Q15*/, + 26218/*0.800115099292852f Q15*/, + 20753/*0.633320673120883f Q15*/, + 14240/*0.434558462154083f Q15*/, + 7575/*0.231177017786780f Q15*/, + 1618/*0.049378173063717f Q15*/, + -2950/*-0.090039611811170f Q15*/, + -5727/*-0.174782560924477f Q15*/, + -6635/*-0.202477516286360f Q15*/, + -5905/*-0.180218293244902f Q15*/, + -4012/*-0.122429229978978f Q15*/, + -1558/*-0.047552067127379f Q15*/, + 843/*0.025733669494145f Q15*/, + 2687/*0.081995376731897f Q15*/, + 3656/*0.111581381838187f Q15*/, + 3663/*0.111781798292302f Q15*/, + 2834/*0.086499988914996f Q15*/, + 1462/*0.044629684447068f Q15*/, + -79/*-0.002416435594242f Q15*/, + -1423/*-0.043440027386915f Q15*/, + -2289/*-0.069857782812169f Q15*/, + -2533/*-0.077293683967992f Q15*/, + -2166/*-0.066098268486336f Q15*/, + -1336/*-0.040782649068098f Q15*/, + -282/*-0.008590773415008f Q15*/, + 734/*0.022397654632128f Q15*/, + 1480/*0.045171360007974f Q15*/, + 1811/*0.055274128677739f Q15*/, + 1690/*0.051578034020076f Q15*/, + 1187/*0.036232016917169f Q15*/, + 454/*0.013869500422767f Q15*/, + -317/*-0.009680698856947f Q15*/, + -945/*-0.028843394410080f Q15*/, + -1296/*-0.039560663181280f Q15*/, + -1314/*-0.040095747151623f Q15*/, + -1023/*-0.031231107680685f Q15*/, + -520/*-0.015866154815425f Q15*/, + 60/*0.001841532922707f Q15*/, + 575/*0.017553701334759f Q15*/, + 910/*0.027778555138199f Q15*/, + 1003/*0.030612329573745f Q15*/, + 853/*0.026046143652186f Q15*/, + 518/*0.015803012695681f Q15*/, + 91/*0.002782973481834f Q15*/, + -319/*-0.009720124055079f Q15*/, + -617/*-0.018826488463900f Q15*/, + -744/*-0.022710487805852f Q15*/, + -686/*-0.020936374578238f Q15*/, + -473/*-0.014436620433404f Q15*/, + -169/*-0.005169079181373f Q15*/, + 145/*0.004437651243491f Q15*/, + 397/*0.012100372954920f Q15*/, + 531/*0.016207075406240f Q15*/, + 529/*0.016135389123271f Q15*/, + 403/*0.012306629559665f Q15*/, + 196/*0.005986734945567f Q15*/, + -36/*-0.001094950878591f Q15*/, + -236/*-0.007200842219958f Q15*/, + -360/*-0.010998212848124f Q15*/, + -388/*-0.011835179448280f Q15*/, + -322/*-0.009826566540474f Q15*/, + -188/*-0.005747665080695f Q15*/, + -26/*-0.000780600030751f Q15*/, + 125/*0.003810613287985f Q15*/, + 229/*0.006990479233404f Q15*/, + 268/*0.008174249796791f Q15*/, + 240/*0.007317375965949f Q15*/, + 159/*0.004864690818765f Q15*/, + 52/*0.001587005259212f Q15*/, + -54/*-0.001642504305841f Q15*/, + -133/*-0.004070609517416f Q15*/, + -171/*-0.005230670504649f Q15*/, + -164/*-0.005019147682711f Q15*/, + -120/*-0.003673879223241f Q15*/, + -55/*-0.001671460853812f Q15*/, + 14/*0.000420750005150f Q15*/, + 69/*0.002095384947391f Q15*/, + 99/*0.003020513665060f Q15*/, + 101/*0.003095468528243f Q15*/, + 80/*0.002441025550729f Q15*/, + 44/*0.001335514431569f Q15*/, + 4/*0.000120805384516f Q15*/, + -29/*-0.000893340757369f Q15*/, + -49/*-0.001501610712267f Q15*/, + -54/*-0.001636887611783f Q15*/, + -45/*-0.001362571776250f Q15*/, + -27/*-0.000832126175863f Q15*/, + -8/*-0.000232033375863f Q15*/, + 9/*0.000273627139471f Q15*/, + 19/*0.000582092683087f Q15*/, + 22/*0.000666445711949f Q15*/, + 19/*0.000566088888178f Q15*/, + 12/*0.000360374058147f Q15*/, + 4/*0.000136306914913f Q15*/, + -1/*-0.000038864994777f Q15*/, + -4/*-0.000132755824518f Q15*/, + -5/*-0.000148377158880f Q15*/, + -4/*-0.000112937171810f Q15*/, + -2/*-0.000061132514471f Q15*/, + -1/*-0.000019974224468f Q15*/, + 0/*-0.000000460344975f Q15*/, + 0/*0.000001976848453f Q15*/ +}; + + +/*----------------------------------------------------------------------------------* + * Low-pass FIR filter for low-frequency post-filtering @ 16kHz + * response : -6dB @ 50Hz, -3dB @ 500Hz, -6dB @ 6.4kHz) + * L_FILT=15 @ 16kHz (1+4x15=61 coef) + * L_FILT=12 @ 12.8kHz (1+5x12=61 coef) + * filter parameters: fs/2=32000, fc=6400, gain=5.0, n=61 + *----------------------------------------------------------------------------------*/ + +const Word16 filter_LP12_180H_fx[] = /* Sincfilt.m: N=180*2+1, Fmin=0, Fmax=1/12, hann( N )' */ +{//Q14 + 16384, 16196, 15641, 14741, 13533, 12067, + 10402, 8604, 6742, 4887, 3105, 1459, + 0, -1230, -2202, -2900, -3322, -3478, + -3392, -3095, -2628, -2037, -1371, -676, + 0, 618, 1143, 1550, 1822, 1954, + 1946, 1811, 1565, 1233, 842, 421, + 0, -394, -736, -1008, -1196, -1294, + -1299, -1217, -1059, -839, -576, -290, + 0, 274, 514, 707, 842, 913, + 920, 865, 755, 600, 413, 208, + 0, -197, -371, -511, -609, -662, + -667, -627, -548, -436, -300, -151, + 0, 143, 270, 371, 443, 481, + 485, 456, 398, 316, 217, 109, + 0, -104, -195, -268, -319, -346, + -348, -326, -284, -225, -155, -78, + 0, 73, 137, 189, 224, 242, + 243, 227, 198, 156, 107, 54, + 0, -50, -94, -128, -151, -163, + -163, -152, -131, -103, -70, -35, + 0, 32, 60, 82, 96, 103, + 102, 95, 81, 64, 43, 21, + 0, -19, -36, -48, -56, -59, + -58, -53, -45, -35, -23, -11, + 0, 10, 18, 24, 28, 29, + 28, 25, 21, 16, 10, 5, + 0, -4, -7, -9, -10, -10, + -9, -8, -6, -5, -3, -1, + 0, 1, 1, 2, 2, 1, + 1, 1, 0, 0, 0, 0, + 0 +}; +const Word16 filter_LP12_180H_13b_fx[] = /*Q13 Sincfilt.m: N=180*2+1, Fmin=0, Fmax=1/12, hann( N )*/ +{//Q13 + 8192, 8098, 7820, 7370, 6766, 6033, + 5201, 4302, 3371, 2443, 1553, 729, + 0, -615, -1101, -1450, -1661, -1739, + -1696, -1547, -1314, -1019, -685, -338, + 0, 309, 571, 775, 911, 977, + 973, 905, 783, 616, 421, 210, + 0, -197, -368, -504, -598, -647, + -649, -608, -529, -420, -288, -145, + 0, 137, 257, 353, 421, 457, + 460, 432, 377, 300, 206, 104, + 0, -99, -185, -255, -305, -331, + -333, -314, -274, -218, -150, -76, + 0, 72, 135, 186, 221, 240, + 242, 228, 199, 158, 109, 55, + 0, -52, -97, -134, -159, -173, + -174, -163, -142, -113, -77, -39, + 0, 37, 69, 94, 112, 121, + 121, 114, 99, 78, 53, 27, + 0, -25, -47, -64, -76, -81, + -81, -76, -66, -52, -35, -18, + 0, 16, 30, 41, 48, 52, + 51, 47, 41, 32, 21, 11, + 0, -10, -18, -24, -28, -30, + -29, -27, -23, -17, -12, -6, + 0, 5, 9, 12, 14, 14, + 14, 13, 10, 8, 5, 2, + 0, -2, -4, -5, -5, -5, + -5, -4, -3, -2, -1, -1, + 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, + 0 +}; + +const Word16 filter_LP15_180H_fx[] = /* Sincfilt.m: N=180*2+1, Fmin=0, Fmax=1/15, hann( N )' */ +{//Q14 + 16384, 16263, 15904, 15317, 14516, 13524, + 12366, 11073, 9678, 8216, 6723, 5236, + 3790, 2416, 1144, 0, -997, -1831, + -2492, -2976, -3285, -3425, -3408, -3248, + -2966, -2583, -2123, -1610, -1070, -526, + 0, 487, 919, 1281, 1564, 1761, + 1869, 1891, 1830, 1695, 1496, 1244, + 954, 641, 318, 0, -300, -569, + -799, -982, -1113, -1188, -1209, -1176, + -1094, -969, -809, -623, -420, -209, + 0, 198, 377, 531, 653, 741, + 793, 807, 786, 732, 649, 543, + 418, 282, 140, 0, -133, -253, + -356, -438, -497, -531, -540, -526, + -489, -433, -362, -278, -187, -93, + 0, 88, 167, 234, 288, 325, + 347, 352, 342, 317, 280, 233, + 179, 120, 59, 0, -56, -105, + -147, -180, -203, -215, -217, -210, + -194, -170, -141, -107, -72, -35, + 0, 33, 61, 85, 103, 116, + 122, 122, 117, 107, 93, 76, + 58, 38, 19, 0, -17, -31, + -43, -51, -57, -59, -58, -55, + -49, -42, -34, -25, -16, -8, + 0, 7, 12, 16, 19, 20, + 21, 20, 18, 16, 13, 10, + 7, 4, 2, 0, -1, -2, + -3, -3, -3, -3, -2, -2, + -1, -1, 0, 0, 0, 0, + 0 +}; + +const Word16 filter_LP15_180H_13b_fx[6 * 31] = /*Q13 Sincfilt.m: N=180*2+1, Fmin=0, Fmax=1/12, hann( N )'*/ +{//Q13 + 8192, 8132, 7952, 7658, 7258, 6762, + 6183, 5536, 4839, 4108, 3362, 2618, + 1895, 1208, 572, 0, -498, -915, + -1246, -1488, -1643, -1713, -1704, -1624, + -1483, -1291, -1061, -805, -535, -263, + 0, 244, 459, 640, 782, 880, + 935, 945, 915, 848, 748, 622, + 477, 320, 159, 0, -150, -285, + -400, -491, -556, -594, -604, -588, + -547, -485, -405, -312, -210, -104, + 0, 99, 189, 265, 327, 371, + 396, 404, 393, 366, 325, 271, + 209, 141, 70, 0, -66, -127, + -178, -219, -248, -266, -270, -263, + -245, -217, -181, -139, -94, -46, + 0, 44, 83, 117, 144, 163, + 173, 176, 171, 158, 140, 116, + 89, 60, 30, 0, -28, -53, + -74, -90, -101, -108, -109, -105, + -97, -85, -70, -54, -36, -18, + 0, 16, 31, 43, 52, 58, + 61, 61, 58, 53, 47, 38, + 29, 19, 9, 0, -8, -16, + -21, -26, -28, -29, -29, -27, + -25, -21, -17, -13, -8, -4, + 0, 3, 6, 8, 10, 10, + 10, 10, 9, 8, 6, 5, + 3, 2, 1, 0, -1, -1, + -1, -2, -2, -1, -1, -1, + -1, 0, 0, 0, 0, 0, + 0 +}; + +const Word16 filter_LP24_90H_fx[] = +{//Q14 + + 10240, 10208, 10111, 9951, 9731, + 9452, 9119, 8734, 8304, 7834, + 7328, 6794, 6237, 5664, 5081, + 4495, 3913, 3339, 2780, 2241, + 1727, 1242, 791, 376, 0, + -335, -629, -880, -1089, -1256, + -1383, -1471, -1523, -1540, -1527, + -1487, -1422, -1337, -1235, -1119, + -994, -862, -727, -592, -460, + -333, -212, -101, 0, 90, + 167, 232, 285, 325, 354, + 371, 378, 376, 366, 349, + 326, 299, 269, 236, 203, + 171, 139, 109, 81, 56, + 34, 15, 0, -12, -21, + -27, -30, -31, -31, -29, + -26, -22, -18, -14, -10, + -7, -4, -2, -1, 0, + 0, 0, 0, 0, 0, + 0, + 0 + +}; + +const Word16 filter_LP24_90H_13b_fx[] = +{//Q13 + + 5120, 5104, 5056, 4976, 4865, + 4726, 4559, 4367, 4152, 3917, + 3664, 3397, 3119, 2832, 2541, + 2248, 1956, 1669, 1390, 1120, + 863, 621, 396, 188, 0, + -168, -315, -440, -545, -628, + -691, -735, -761, -770, -764, + -743, -711, -668, -617, -560, + -497, -431, -364, -296, -230, + -166, -106, -51, 0, 45, + 84, 116, 143, 163, 177, + 186, 189, 188, 183, 174, + 163, 149, 134, 118, 102, + 85, 69, 54, 40, 28, + 17, 8, 0, -6, -10, + -13, -15, -16, -15, -14, + -13, -11, -9, -7, -5, + -3, -2, -1, 0, 0, + 0, 0, 0, 0, 0, + 0, + 0 +}; + +const Word16 filter_LP3_90H_fx[] = /* Sincfilt.m: N=90*2+1, Fmin=0, Fmax=1/3, hann( N )' */ +{//Q14 + 16384, 13545, 6766, 0, -3371, -2689, + 0, 1907, 1661, 0, -1314, -1187, + 0, 990, 911, 0, -783, -729, + 0, 638, 598, 0, -529, -499, + 0, 445, 421, 0, -377, -357, + 0, 321, 305, 0, -274, -260, + 0, 234, 221, 0, -199, -188, + 0, 169, 159, 0, -142, -134, + 0, 119, 112, 0, -99, -93, + 0, 81, 76, 0, -66, -61, + 0, 52, 48, 0, -41, -37, + 0, 31, 28, 0, -23, -20, + 0, 16, 14, 0, -10, -9, + 0, 6, 5, 0, -3, -2, + 0, 1, 1, 0, 0, 0, + 0 +}; + +const Word16 filter_LP15_360H_13b_fx[] = /* Sincfilt.m: N=360*2+1, Fmin=0, Fmax=1/15, hann( N )' */ +{//Q13 + + 8192, 8132, 7954, 7662, 7265, 6772, 6196, 5552, + 4857, 4127, 3381, 2636, 1911, 1220, 579, 0, + -506, -931, -1269, -1519, -1681, -1757, -1752, -1674, + -1533, -1339, -1104, -840, -560, -276, 0, 258, + 488, 682, 836, 946, 1008, 1024, 996, 927, + 821, 687, 529, 357, 178, 0, -170, -325, + -458, -567, -646, -694, -710, -696, -652, -581, + -489, -379, -257, -129, 0, 124, 238, 338, + 420, 481, 518, 533, 523, 492, 440, 372, + 289, 197, 99, 0, -96, -184, -262, -326, + -374, -405, -417, -410, -386, -346, -293, -228, + -156, -78, 0, 76, 147, 209, 260, 299, + 324, 334, 329, 310, 279, 236, 184, 125, + 63, 0, -62, -119, -169, -211, -243, -263, + -271, -268, -252, -227, -192, -150, -102, -52, + 0, 50, 97, 138, 173, 198, 215, 222, + 219, 207, 186, 157, 123, 84, 42, 0, + -41, -80, -113, -142, -163, -176, -182, -180, + -170, -152, -129, -101, -69, -35, 0, 34, + 65, 93, 116, 133, 144, 149, 147, 139, + 125, 106, 82, 56, 28, 0, -28, -53, + -76, -95, -109, -118, -121, -120, -113, -101, + -86, -67, -46, -23, 0, 22, 43, 61, + 77, 88, 95, 98, 97, 91, 82, 69, + 54, 37, 19, 0, -18, -35, -49, -61, + -70, -76, -78, -77, -73, -65, -55, -43, + -29, -15, 0, 14, 27, 39, 48, 55, + 60, 62, 61, 57, 51, 43, 33, 23, + 11, 0, -11, -21, -30, -37, -43, -46, + -48, -47, -44, -39, -33, -26, -17, -9, + 0, 8, 16, 23, 28, 32, 35, 36, + 35, 33, 29, 25, 19, 13, 6, 0, + -6, -12, -17, -21, -24, -25, -26, -25, + -24, -21, -18, -14, -9, -5, 0, 4, + 8, 12, 14, 16, 18, 18, 17, 16, + 14, 12, 9, 6, 3, 0, -3, -6, + -8, -10, -11, -11, -12, -11, -10, -9, + -8, -6, -4, -2, 0, 2, 3, 5, + 6, 6, 7, 7, 7, 6, 5, 4, + 3, 2, 1, 0, -1, -2, -3, -3, + -3, -3, -3, -3, -3, -3, -2, -2, + -1, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 + +}; + +static const Word16 filter_LP30_300K_fx[LFE_PLC_FDEL + 1] = +{//Q14 +16395,16364,16273,16123,15913,15646,15323,14947,14520,14045,13524,12963,12363,11730,11067,10379,9669, +8943,8205,7460,6712,5965,5225,4495,3779,3082,2408,1759,1140,552,0,-515,-991,-1426,-1819,-2169,-2475, +-2736,-2953,-3126,-3257,-3345,-3392,-3400,-3371,-3307,-3210,-3083,-2928,-2749,-2547,-2327,-2091,-1842, +-1584,-1319,-1051,-782,-515,-254,0,244,476,695,897,1083,1249,1397,1523,1628,1712,1774,1815,1834,1833, +1811,1771,1712,1637,1546,1442,1325,1197,1060,916,767,614,459,304,150,0,-145,-285,-417,-541,-655,-758, +-850,-930,-997,-1051,-1092,-1119,-1134,-1136,-1125,-1102,-1068,-1023,-968,-904,-832,-753,-668,-578, +-484,-388,-290,-192,-95,0,92,181,266,345,418,484,543,594,638,672,699,717,727,728,721,707,685,656,621,580, +534,483,428,371,311,249,186,123,61,0,-59,-116,-170,-220,-267,-309,-347,-379,-407,-429,-445,-456,-462,-463, +-458,-448,-434,-416,-393,-367,-337,-305,-270,-233,-195,-156,-117,-77,-38,0,37,72,106,137,166,192,215,234,251, +264,274,280,283,283,280,274,264,253,238,222,204,184,162,140,117,93,69,46,22,0,-21,-42,-62,-80,-97,-112,-125,-136, +-146,-153,-158,-161,-163,-162,-160,-156,-150,-143,-135,-125,-114,-103,-91,-78,-65,-51,-38,-25,-12,0,11,23,33,43, +52,59,66,72,76,80,82,84,84,83,82,79,76,72,67,62,57,51,44,38,31,25,18,12,5,0,-5,-10,-15,-19,-23,-27,-29,-32,-34, +-35,-36,-36,-36,-35,-34,-33,-31,-29,-27,-24,-22,-19,-17,-14,-11,-9,-6,-4,-2,0 + +}; + +const Resampling_cfg resampling_cfg_tbl[] = +{ + /* fin fout up.fact. den.fac. len.out filter coefs. filter length/2 filter mem./2 flags */ + { 8000, 12800, 8, 5, 256, /*filter5_39s320_120,*/ filter5_39s320_120_fx, 15, RS_INV_FAC }, + { 12800, 8000, 5, 8, 160, /*filter5_39s320_120,*/ filter5_39s320_120_fx, L_FILT_UP8k, RS_INV_FAC }, + { 16000, 8000, 6, 12, 160, /*filter_LP12_180H,*/ filter_LP12_180H_fx, 180 / 6, 0 }, + { 12800, 16000, 15, 12, 320, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT_UP16k, 0 }, + { 12800, 32000, 15, 6, 640, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT_UP32k, 0 }, + { 12800, 48000, 15, 4, 960, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT_UP48k, 0 }, + + { 16000, 12800, 12, 15, 256, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT16k, 0, }, + { 16000, 32000, 12, 6, 640, /*filter_LP12_180H, */ filter_LP12_180H_fx, L_FILT16k, 0, }, + { 16000, 48000, 12, 4, 960, /*filter_LP12_180H,*/ filter_LP12_180H_fx, L_FILT16k, 0, }, + + { 32000, 12800, 6, 15, 256, /*filter_LP15_180H,*/ filter_LP15_180H_13b_fx, L_FILT32k, 0, }, + { 32000, 16000, 6, 12, 320, /*filter_LP12_180H,*/ filter_LP12_180H_13b_fx, L_FILT32k, 0, }, + { 32000, 25600, 12, 15, 512, /*filter_LP15_360H,*/ filter_LP15_360H_13b_fx, L_FILT32k, 0, }, + { 32000, 48000, 3, 2, 960, /*filter_LP3_90H,*/ filter_LP3_90H_fx, L_FILT32k, 0, }, + + { 48000, 12800, 4, 15, 256, /*filter_LP15_180H,*/ filter_LP15_180H_13b_fx, L_FILT48k, 0, }, + { 48000, 16000, 4, 12, 320, /*filter_LP12_180H,*/ filter_LP12_180H_13b_fx, L_FILT48k, 0, }, + { 48000, 25600, 8, 15, 512, /*filter_LP15_360H,*/ filter_LP15_360H_13b_fx, L_FILT48k, 0, }, + { 48000, 32000, 2, 3, 640, /*filter_LP3_90H,*/ filter_LP3_90H_fx, L_FILT48k, 0, }, + + /* configs with NB 4kHz low-pass */ + { 16000, 12800, 12, 15, 256, /*filter_LP24_90H,*/ filter_LP24_90H_fx, L_FILT16k, 0, }, + { 32000, 12800, 6, 15, 256, /*filter_LP24_90H,*/ filter_LP24_90H_13b_fx, L_FILT32k, 0, }, + { 48000, 12800, 4, 15, 256, /*filter_LP24_90H,*/ filter_LP24_90H_13b_fx, L_FILT48k, 0, }, + + /* entry for LFE PLC */ + { 1600, 48000, 30, 1, 960, /*filter_LP30_300K,*/ filter_LP30_300K_fx, LFE_PLC_FDEL / 30, 0, }, + { 0, 0, 0, 0, 0, /* 0, */ 0, 0, 0, } /* trailing entry (just to calculate the length of this table) */ +}; + +//den fac value for last entry is calculated as den.fac = (num.fac*fin)/fout +//lg_out value for last entry is calculated as = fout/50 = ((fin/50)*num.fac)/den.fac +//filter_LP30_300K_fx has been calculated with Q14 + +/*----------------------------------------------------------------------------------* + * LSP interpolation coefficients + *----------------------------------------------------------------------------------*/ + + +const Word16 interpol_frac2_fx[NB_SUBFR] = {//Q15 + 16384, 16384, 32767, 32767 +}; + +const Word16 interpol_frac2_mid_fx[NB_SUBFR * 3] = {//Q15 + 8191, 24575, 0, + 8191, 24575, 0, + 0, 8191, 24575, + 0, 8191, 24575 +};/*Q15*/ + + +const Word16 interpol_frac_12k8_fx[NB_SUBFR] = {//Q15 + 8191, 16383, 24575, 32767 +}; + +const Word16 interpol_frac_fx[NB_SUBFR] = { 8192, 16384, 24576,32767 };/*Q15*/ + +const Word16 interpol_isp_amr_wb_fx[] = { 14746, 26214, 31457, 32767 };/*Q15*/ + +const Word16 interpol_frac_16k_fx[NB_SUBFR16k] = { 6554, 13107, 19661, 26214, 32767 };//Q15 + +const Word16 interpol_frac_mid_fx[NB_SUBFR * 3] = { 16384, 16384, 0,//Q15 + 0, 32767, 0, + 0, 16384, 16384, + 0, 0, 32767 +};/*Q15*/ + +const Word16 interpol_frac_mid_16k_fx[NB_SUBFR16k * 3] = { 18022, 14746, 0,//Q15 + 4915, 27853, 0, + 0, 24576, 8192, + 0, 11469, 21299, + 0, 0, 32767 +}; + +const Word16 interpol_frac_mid_relaxprev_12k8_fx[NB_SUBFR * 3] = { 0, 22938, 9830,//Q15 + 0, 0, 32767, + 0, 0, 32767, + 0, 0, 32767 +};/*Q15*/ + +const Word16 interpol_frac_mid_FEC_fx[NB_SUBFR * 3] = { 8192, 18022, 6554,//Q15 + 0, 22938, 9830, + 0, 14746, 18022, + 0, 0, 32767 +};/*Q15*/ + +const Word16 interpol_frac_mid_relaxprev_pred_12k8_fx[NB_SUBFR * 3] = { 4915, 22938, 4915,//Q15 + 1638, 21299, 9830, + 0, 16384, 16384, + 0, 0, 32767 +}; + +const Word16 interpol_frac_mid_relaxprev_16k_fx[NB_SUBFR16k * 3] = { 0, 22938, 9830,//Q15 + 0, 0, 32767, + 0, 0, 32767, + 0, 0, 32767, + 0, 0, 32767 +};/*Q15*/ + +const Word16 interpol_frac_mid_16k_FEC_fx[NB_SUBFR16k * 3] = { 13107, 13107, 6554,//Q15 + 0, 26214, 6554, + 0, 21299, 11469, + 0, 4915, 27853, + 0, 0, 32767 +};/*Q15*/ + +const Word16 interpol_frac_mid_relaxprev_pred_16k_fx[NB_SUBFR16k * 3] = { 4915, 22938, 4915,//Q15 + 1638, 21299, 9830, + 0, 16384, 16384, + 0, 4915, 27853, + 0, 0, 32767 +};/*Q15*/ + +/*----------------------------------------------------------------------------------* + * Innovative codebook + *----------------------------------------------------------------------------------*/ + +/* Innovative codebook config */ +const PulseConfig PulseConfTable[] = +{ + /* Design rules: + * ---> "fixed" + "tried-pair-pos"*2 = pulses & 0xfe + * ---> tracks with pulses % 3 == 0, have always TRACKPOS_FIXED_FIRST */ + /* bits,iter,alp,pulses,fixed,tried-pair-pos,codetrack */ + { 7, 4, 16384/*2.0f Q13*/, 1, 0, {8}, TRACKPOS_FREE_ONE }, /* 7 bits, 1 pulses, 4 tracks, 1000 free track */ + { 10, 4, 16384/*2.0f Q13*/, 2, 0, {8}, TRACKPOS_FIXED_EVEN }, /* 10 bits, 2 pulses, 4 tracks 1010 (used only even tracks designed for NB) */ + { 12, 4, 16384/*2.0f Q13*/, 2, 0, {8}, TRACKPOS_FIXED_TWO }, /* 12 bits, 2 pulses, 2 tracks 11 used all tracks ala AMR-WB 6.6 */ + { 15, 4, 16384/*2.0f Q13*/, 3, 0, {8}, TRACKPOS_FIXED_FIRST }, /* 15 bits, 3 pulses, 4 tracks 1110 fixed track to first ? */ + { 17, 6, 16384/*2.0f Q13*/, 3, 0, {8}, TRACKPOS_FREE_THREE }, /* 17 bits, 3 pulses, 4 tracks (used all tracks) - 1110, 1101, 1011, 0111 */ + { 20, 4, 16384/*2.0f Q13*/, 4, 0, {4, 8}, TRACKPOS_FIXED_FIRST }, /* 20 bits, 4 pulses, 4 tracks 1111 */ + { 24, 4, 16384/*2.0f Q13*/, 5, 0, {4, 8}, TRACKPOS_FIXED_FIRST }, /* 24 bits, 5 pulses, 4 tracks 2111 fixed track to first */ + { 26, 4, 16384/*2.0f Q13*/, 5, 0, {4, 8}, TRACKPOS_FREE_ONE }, /* 26 bits, 5 pulses, 4 tracks 2111 one free track ? */ + { 28, 4, 12288/*1.5f Q13*/, 6, 0, {4, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 28 bits, 6 pulses, 4 tracks 2211 */ + { 30, 4, 12288/*1.5f Q13*/, 6, 0, {4, 8, 8}, TRACKPOS_FIXED_TWO }, /* 30 bits, 6 pulses, 4 tracks 2211 free consecutive track positions ? */ + { 32, 4, 12288/*1.5f Q13*/, 7, 0, {4, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 32 bits, 6 pulses, 4 tracks 2221 fixed ?*/ + { 34, 4, 12288/*1.5f Q13*/, 7, 0, {4, 8, 8}, TRACKPOS_FREE_THREE }, /* 34 bits, 6 pulses, 4 tracks 2221 free track positions ? */ + { 36, 4, 8192/*1.0f Q13*/, 8, 2, {4, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 36 bits, 8 pulses, 4 tracks 2222 */ + { 40, 4, 8192/*1.0f Q13*/, 9, 2, {4, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 40 bits, 9 pulses, 4 tracks 3222 fixed ?*/ + { 43, 4, 8192/*1.0f Q13*/, 10, 2, {4, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 44 bits, 10 pulses, 4 tracks 3322 */ + { 46, 4, 8192/*1.0f Q13*/, 10, 2, {4, 6, 8, 8}, TRACKPOS_FIXED_TWO }, /* 46 bits, 10 pulses, 4 tracks 3322 free consecutive tracks ? */ + { 47, 4, 8192/*1.0f Q13*/, 11, 2, {4, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 47 bits, 10 pulses, 4 tracks 3332 fixed ? */ + { 49, 4, 8192/*1.0f Q13*/, 11, 2, {4, 6, 8, 8}, TRACKPOS_FREE_THREE }, /* 49 bits, 10 pulses, 4 tracks 3332 free three track positions ? */ + { 50, 4, 8192/*1.0f Q13*/, 12, 4, {4, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 50 bits, 12 pulses, 4 tracks 3333 */ + { 53, 4, 8192/*1.0f Q13*/, 13, 4, {4, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 53 bits, 13 pulses, 4 tracks 4333 fixed ? */ + { 55, 4, 8192/*1.0f Q13*/, 13, 4, {4, 6, 8, 8}, TRACKPOS_FREE_ONE }, /* 55 bits, 13 pulses, 4 tracks 4333 free one ? */ + { 56, 4, 8192/*1.0f Q13*/, 14, 4, {4, 6, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 56 bits, 14 pulses, 4 tracks 4433 fixed ?!?! */ + { 58, 4, 8192/*1.0f Q13*/, 14, 4, {4, 6, 6, 8, 8}, TRACKPOS_FIXED_TWO }, /* 58 bits, 14 pulses, 4 tracks 4433 free consecutive ? */ + { 59, 4, 8192/*1.0f Q13*/, 15, 4, {4, 6, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 59 bits, 15 pulses, 4 tracks 4443 fixed ? */ + { 61, 4, 8192/*1.0f Q13*/, 15, 4, {4, 6, 6, 8, 8}, TRACKPOS_FREE_THREE }, /* 61 bits, 15 pulses, 4 tracks 4443 free ? */ + { 62, 3, 6554/*0.8f Q13*/, 16, 4, {4, 4, 6, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 62 bits, 16 pulses, 4 tracks 4444 */ + { 65, 3, 6554/*0.8f Q13*/, 17, 4, {4, 4, 6, 6, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 65 bits, 17 pulses, 4 tracks 5444 fixed ?*/ + { 68, 3, 6144/*0.75f Q13*/, 18, 4, {2, 3, 4, 5, 6, 7, 8}, TRACKPOS_FIXED_FIRST }, /* 68 bits, 18 pulses, 4 tracks 5544 */ + { 70, 3, 6144/*0.75f Q13*/, 19, 4, {2, 3, 4, 5, 6, 7, 8}, TRACKPOS_FIXED_FIRST }, /* 70 bits, 19 pulses, 4 tracks 5554 fixed ? */ + { 73, 3, 6144/*0.75f Q13*/, 20, 4, {2, 3, 4, 5, 6, 7, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 73 bits, 20 pulses, 4 tracks 5555 fixed ? */ + { 75, 3, 6144/*0.75f Q13*/, 21, 4, {2, 3, 4, 5, 6, 7, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 75 bits, 21 pulses, 4 tracks 6555 fixed ? */ + { 78, 3, 6144/*0.75f Q13*/, 22, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 78 bits, 22 pulses, 4 tracks 6655 fixed ? */ + { 80, 3, 6144/*0.75f Q13*/, 23, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8}, TRACKPOS_FIXED_FIRST }, /* 80 bits, 23 pulses, 4 tracks 6665 fixed ? */ + { 83, 2, 2458/*0.30f Q13*/, 24, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 83 bits, 24 pulses, 4 tracks 6666 */ + { 85, 2, 2458/*0.30f Q13*/, 25, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 85 bits, 25 pulses, 4 tracks 7666 */ + { 87, 2, 2048/*0.25f Q13*/, 26, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 87 bits, 26 pulses, 4 tracks 7766 */ + { 89, 2, 2048/*0.25f Q13*/, 27, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 89 bits, 27 pulses, 4 tracks 7776 */ + { 92, 2, 2048/*0.25f Q13*/, 28, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 92 bits, 28 pulses, 4 tracks 7777 */ + { 94, 2, 2048/*0.25f Q13*/, 29, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 94 bits, 29 pulses, 4 tracks 8777 */ + { 96, 1, 1638/*0.20f Q13*/, 30, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 96 bits, 30 pulses, 4 tracks 8877 */ + { 98, 1, 1638/*0.20f Q13*/, 31, 4, {2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8}, TRACKPOS_FIXED_FIRST}, /* 98 bits, 31 pulses, 4 tracks 8887 */ +}; + + +/* Number of pulses & positions to the number of unique states that can be achieved with those pulses */ +const UWord32 pulsestostates[17][9] = +{ + { 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 2, 2, 2, 2, 2, 2, 2, 2, 2}, + { 4, 8, 12, 16, 20, 24, 28, 32, 36}, + { 6, 18, 38, 66, 102, 146, 198, 258, 326}, + { 8, 32, 88, 192, 360, 608, 952, 1408, 1992}, + { 10, 50, 170, 450, 1002, 1970, 3530, 5890, 9290}, + { 12, 72, 292, 912, 2364, 5336, 10836, 20256, 35436}, + { 14, 98, 462, 1666, 4942, 12642, 28814, 59906, 115598}, + { 16, 128, 688, 2816, 9424, 27008, 68464, 157184, 332688}, + { 18, 162, 978, 4482, 16722, 53154, 148626, 374274, 864146}, + { 20, 200, 1340, 6800, 28004, 97880, 299660, 822560, 2060980}, + { 22, 242, 1782, 9922, 44726, 170610, 568150, 1690370, 4573910}, + { 24, 288, 2312, 14016, 68664, 284000, 1022760, 3281280, 9545560}, + { 26, 338, 2938, 19266, 101946, 454610, 1761370, 6065410, 18892250}, + { 28, 392, 3668, 25872, 147084, 703640, 2919620, 10746400, 35704060}, + { 30, 450, 4510, 34050, 207006, 1057730, 4680990, 18347010, 64797470}, + { 32, 512, 5472, 44032, 285088, 1549824, 7288544, 30316544, 113461024}, +}; + +/*----------------------------------------------------------------------------------* + * Gain quantization table for memory-less gain quantizer + *----------------------------------------------------------------------------------*/ + +const Word16 gain_qua_mless_7b_fx[128*2] = +{//Q14 + 419, 28, + 1499, 607, + 1586, 322, + 1632, 144, + 1686, 229, + 1745, 495, + 2182, 409, + 2515, 716, + 2772, 824, + 3069, 1069, + 3211, 936, + 3218, 89, + 3477, 1244, + 3755, 272, + 3865, 549, + 3881, 348, + 4171, 181, + 4414, 627, + 4419, 472, + 4909, 1429, + 5238, 404, + 5241, 1651, + 5721, 85, + 5833, 250, + 5846, 693, + 5897, 325, + 6036, 544, + 6088, 779, + 6459, 1889, + 6650, 157, + 6678, 462, + 6798, 879, + 6922, 993, + 6929, 1130, + 7352, 620, + 7461, 386, + 7864, 232, + 7999, 314, + 8136, 536, + 8398, 712, + 8680, 459, + 8797, 1276, + 9046, 806, + 9198, 86, + 9434, 398, + 9730, 587, + 9735, 267, + 9742, 175, + 9917, 917, + 10042, 509, + 10053, 655, + 10132, 1030, + 10238, 339, + 10694, 1560, + 10817, 447, + 10964, 723, + 11405, 1149, + 11526, 549, + 11582, 386, + 11602, 791, + 11618, 286, + 11883, 862, + 11954, 607, + 12057, 214, + 12104, 496, + 12170, 1397, + 12437, 668, + 12616, 335, + 12668, 952, + 12684, 435, + 12983, 112, + 13235, 742, + 13399, 549, + 13525, 380, + 13527, 270, + 13625, 1044, + 13733, 482, + 13820, 617, + 14036, 817, + 14041, 1257, + 14295, 425, + 14346, 684, + 14367, 319, + 14416, 199, + 14644, 898, + 14944, 518, + 15090, 364, + 15154, 578, + 15309, 462, + 15360, 1933, + 15362, 756, + 15381, 262, + 15566, 1127, + 15699, 639, + 15804, 410, + 16081, 316, + 16161, 993, + 16359, 701, + 16451, 828, + 16500, 543, + 16540, 491, + 16617, 1729, + 16630, 196, + 16749, 369, + 16959, 1530, + 17028, 442, + 17139, 603, + 17369, 898, + 17393, 268, + 17972, 763, + 17985, 1361, + 18016, 333, + 18032, 667, + 18234, 406, + 18270, 105, + 18299, 554, + 18342, 488, + 18747, 1207, + 19027, 1073, + 19530, 216, + 19566, 963, + 19751, 835, + 19794, 615, + 19810, 298, + 19988, 710, + 19990, 449, + 20005, 374, + 20149, 531, +}; + +const Word16 gain_qua_mless_6b_stereo_fx[64 * 2] = +{//Q14 + 570, 695, + 932, 535, + 972, 913, + 1305, 165, + 1503, 343, + 1942, 2102, + 2763, 440, + 2957, 1204, + 3163, 621, + 3232, 760, + 4215, 255, + 4415, 533, + 4884, 873, + 5395, 429, + 5601, 664, + 5724, 1615, + 6847, 1057, + 6849, 535, + 6889, 3303, + 7086, 335, + 7135, 766, + 8267, 616, + 8601, 907, + 8690, 442, + 9501, 1264, + 9517, 728, + 10050, 73, + 10243, 514, + 10723, 861, + 10884, 641, + 11005, 339, + 11919, 1623, + 11976, 1037, + 12219, 564, + 12286, 770, + 12858, 413, + 12944, 8191, + 13347, 684, + 13751, 502, + 13802, 873, + 13812, 1207, + 14417, 615, + 14633, 392, + 15119, 732, + 15214, 521, + 15247, 976, + 15509, 290, + 15936, 1440, + 16101, 603, + 16157, 448, + 16277, 799, + 16358, 2544, + 16863, 4652, + 17010, 1093, + 17073, 350, + 17348, 659, + 17583, 509, + 17853, 854, + 19087, 1756, + 19109, 405, + 19348, 727, + 19553, 566, + 19553, 1240, + 19659, 953 +}; + +const Word16 gain_qua_mless_6b_fx[64 * 2] = +{//Q14 + 1676, 71, + 2128, 198, + 2318, 491, + 2348, 339, + 2798, 625, + 2893, 785, + 3911, 1099, + 4779, 244, + 4781, 427, + 5115, 935, + 5294, 1509, + 5767, 114, + 6018, 543, + 6152, 335, + 6205, 675, + 6234, 1822, + 6740, 1251, + 7034, 802, + 7782, 434, + 8005, 230, + 9232, 622, + 9337, 336, + 9388, 520, + 9770, 1038, + 9865, 734, + 10224, 879, + 10617, 118, + 10776, 426, + 11518, 249, + 11708, 1399, + 12044, 587, + 12270, 501, + 12277, 348, + 12498, 684, + 13020, 786, + 13097, 1196, + 13530, 422, + 13818, 917, + 14123, 290, + 14500, 1039, + 14538, 636, + 14636, 556, + 14667, 484, + 14931, 362, + 15055, 210, + 15653, 1594, + 15830, 1874, + 15868, 717, + 15897, 828, + 16153, 434, + 16540, 294, + 16874, 608, + 16936, 513, + 17182, 373, + 17644, 1337, + 17696, 126, + 18342, 1122, + 18461, 944, + 18991, 242, + 19114, 795, + 19187, 674, + 19256, 449, + 19485, 557, + 19515, 344, +}; + +const Word16 gain_qua_mless_5b_fx[32 * 2] = +{//Q14 + 2695, 109, + 3444, 271, + 3529, 433, + 4284, 801, + 4365, 607, + 4935, 1089, + 6896, 1407, + 7722, 324, + 7913, 146, + 8090, 468, + 9049, 913, + 9499, 600, + 9894, 741, + 9942, 1840, + 11906, 382, + 12008, 1103, + 12349, 243, + 12429, 501, + 13687, 630, + 13974, 896, + 14510, 748, + 15160, 322, + 15424, 428, + 15679, 541, + 15832, 1574, + 15999, 1281, + 17223, 211, + 17719, 1029, + 18185, 649, + 18432, 818, + 18638, 353, + 18889, 493, +}; + +const Word16 E_ROM_qua_gain5b_const[NB_QUA_GAIN5B * 2]= +{//Q0 + 1774,577, + 2090,1805, + 2103,3371, + 3908,1116, + 4834,2500, + 6030,4763, + 6838,1334, + 7490,2033, + 8585,3036, + 9845,1575, + 10437,2320, + 10649,3739, + 11298,945, + 12108,1920, + 12310,5108, + 12391,2758, + 12659,1237, + 13729,1557, + 13798,2201, + 13972,3275, + 14881,993, + 15175,1776, + 15409,16190, + 15551,2395, + 15879,4048, + 16341,1335, + 16988,2918, + 18317,7449, + 18368,2026, + 19114,1364, + 19991,4472, + 20644,2790, +}; + +const Word16 E_ROM_qua_gain6b_const[NB_QUA_GAIN6B * 2] = +{//Q0 + 0,2758, + 143,3562, + 397,2146, + 544,4306, + 952,1726, + 1236,724, + 1779,3158, + 1820,5448, + 1975,2473, + 2121,1343, + 3049,3912, + 3081,1885, + 3289,8261, + 3416,2843, + 3495,2204, + 3831,3386, + 4295,4590, + 4300,2476, + 4345,1545, + 4913,1122, + 5198,2080, + 5200,3079, + 5448,3714, + 5482,2689, + 5546,1817, + 5783,17318, + 5934,6236, + 6156,2320, + 6481,4225, + 6828,3351, + 6832,5045, + 6888,2895, + 7186,2559, + 7214,1663, + 7373,2052, + 7906,3819, + 8192,1372, + 8452,3063, + 8464,2354, + 9021,4468, + 9037,2715, + 9175,1874, + 9219,3463, + 9831,2155, + 10523,5383, + 10557,9061, + 10618,3093, + 10633,3949, + 10890,2465, + 11141,1654, + 12132,2790, + 12180,3477, + 12376,2079, + 12494,4560, + 14430,2468, + 14573,3914, + 14576,3111, + 15043,1827, + 15207,1329, + 16073,6155, + 17519,4719, + 18345,2148, + 18554,2784, + 18576,3563, +}; + +const Word16 E_ROM_qua_gain7b_const[NB_QUA_GAIN7B * 2] = +{//Q0 + 123,2777, + 369,2102, + 404,4368, + 693,3486, + 1107,719, + 1222,1679, + 1657,1293, + 1667,5547, + 1805,2425, + 2369,3075, + 2489,12063, + 2681,1901, + 2693,3984, + 3031,7547, + 3248,990, + 3466,2672, + 3674,2165, + 3718,1513, + 3844,3456, + 4120,4656, + 4748,2967, + 4821,19622, + 4855,2400, + 4912,1776, + 5245,3860, + 5312,6282, + 5500,1176, + 5713,2056, + 5872,3287, + 5960,2662, + 6170,9756, + 6364,5021, + 6545,1476, + 6788,2283, + 6796,4163, + 7038,2949, + 7216,1831, + 7274,3516, + 7707,2510, + 8123,5762, + 8361,4485, + 8376,2110, + 8594,3135, + 8611,3755, + 8634,1570, + 8636,2748, + 8683,8222, + 9274,335, + 9512,2404, + 9640,5020, + 9690,1893, + 9778,3361, + 9808,15435, + 9936,4029, + 10194,2767, + 10306,6510, + 10325,1252, + 10686,2186, + 10844,32767, + 10913,4453, + 10968,3078, + 11044,1666, + 11076,3609, + 11398,2509, + 11423,5160, + 11848,1994, + 11997,2823, + 12002,3880, + 12084,7573, + 12129,3325, + 12214,5867, + 12331,1496, + 12450,4245, + 12458,2283, + 12768,901, + 12896,4741, + 12898,1811, + 12902,2569, + 12983,2959, + 13173,3331, + 13413,2059, + 13416,3734, + 13429,10641, + 13448,1148, + 13615,5340, + 13674,1425, + 13779,2332, + 13847,4264, + 13909,2657, + 13958,6488, + 14047,3085, + 14130,1648, + 14547,1915, + 14554,3684, + 14749,2739, + 14868,5017, + 14875,2216, + 14898,3197, + 14988,1085, + 15026,4246, + 15375,7971, + 15421,1446, + 15548,2462, + 15722,5920, + 15882,3449, + 15960,1782, + 15994,2863, + 16365,3977, + 16419,4754, + 16472,2162, + 17378,3101, + 17410,2550, + 17743,1339, + 17856,5485, + 17979,1982, + 17996,3628, + 18041,7110, + 18242,4381, + 18602,22207, + 19373,12827, + 19533,2777, + 19640,1678, + 19728,2272, + 19795,8861, + 20065,3275, + 20133,4881, + 20198,3947, + 20290,6128, +}; + +/*----------------------------------------------------------------------------------* + * MA predicition coefficients for gain quantizer + *----------------------------------------------------------------------------------*/ + +const Word16 pred_gain_fx[GAIN_PRED_ORDER] = { 8192, 6554, 4915, 3277 };//Q14 + +/*----------------------------------------------------------------------------------* + * 6-bit gain quantization table (only for AMR-WB IO mode) + *----------------------------------------------------------------------------------*/ + +const Word16 t_qua_gain6b_fx[64 * 2] = +{//Q14 + 1566, 1332, + 1577, 3557, + 3071, 6490, + 4193, 10163, + 4496, 2534, + 5019, 4488, + 5586, 15614, + 5725, 1422, + 6453, 580, + 6724, 6831, + 7657, 3527, + 8072, 2099, + 8232, 5319, + 8827, 8775, + 9740, 2868, + 9856, 1465, + 10087, 12488, + 10241, 4453, + 10859, 6618, + 11321, 3587, + 11417, 1800, + 11643, 2428, + 11718, 988, + 12312, 5093, + 12523, 8413, + 12574, 26214, + 12601, 3396, + 13172, 1623, + 13285, 2423, + 13418, 6087, + 13459, 12810, + 13656, 3607, + 14111, 4521, + 14144, 1229, + 14425, 1871, + 14431, 7234, + 14445, 2834, + 14628, 10036, + 14860, 17496, + 15161, 3629, + 15209, 5819, + 15299, 2256, + 15518, 4722, + 15663, 1060, + 15759, 7972, + 15939, 11964, + 16020, 2996, + 16086, 1707, + 16521, 4254, + 16576, 6224, + 16894, 2380, + 16906, 681, + 17213, 8406, + 17610, 3418, + 17895, 5269, + 18168, 11748, + 18230, 1575, + 18607, 32767, + 18728, 21684, + 19137, 2543, + 19422, 6577, + 19446, 4097, + 19450, 9056, + 20371, 14885 +}; + + +/*----------------------------------------------------------------------------------* + * 7-bit gain quantization table (only for AMR-WB IO mode) + *----------------------------------------------------------------------------------*/ + +const Word16 t_qua_gain7b_fx[128 * 2] = +{//Q14 + 204, 441, + 464, 1977, + 869, 1077, + 1072, 3062, + 1281, 4759, + 1647, 1539, + 1845, 7020, + 1853, 634, + 1995, 2336, + 2351, 15400, + 2661, 1165, + 2702, 3900, + 2710, 10133, + 3195, 1752, + 3498, 2624, + 3663, 849, + 3984, 5697, + 4214, 3399, + 4415, 1304, + 4695, 2056, + 5376, 4558, + 5386, 676, + 5518, 23554, + 5567, 7794, + 5644, 3061, + 5672, 1513, + 5957, 2338, + 6533, 1060, + 6804, 5998, + 6820, 1767, + 6937, 3837, + 7277, 414, + 7305, 2665, + 7466, 11304, + 7942, 794, + 8007, 1982, + 8007, 1366, + 8326, 3105, + 8336, 4810, + 8708, 7954, + 8989, 2279, + 9031, 1055, + 9247, 3568, + 9283, 1631, + 9654, 6311, + 9811, 2605, + 10120, 683, + 10143, 4179, + 10245, 1946, + 10335, 1218, + 10468, 9960, + 10651, 3000, + 10951, 1530, + 10969, 5290, + 11203, 2305, + 11325, 3562, + 11771, 6754, + 11839, 1849, + 11941, 4495, + 11954, 1298, + 11975, 15223, + 11977, 883, + 11986, 2842, + 12438, 2141, + 12593, 3665, + 12636, 8367, + 12658, 1594, + 12886, 2628, + 12984, 4942, + 13146, 1115, + 13224, 524, + 13341, 3163, + 13399, 1923, + 13549, 5961, + 13606, 1401, + 13655, 2399, + 13782, 3909, + 13868, 10923, + 14226, 1723, + 14232, 2939, + 14278, 7528, + 14439, 4598, + 14451, 984, + 14458, 2265, + 14792, 1403, + 14818, 3445, + 14899, 5709, + 15017, 15362, + 15048, 1946, + 15069, 2655, + 15405, 9591, + 15405, 4079, + 15570, 7183, + 15687, 2286, + 15691, 1624, + 15699, 3068, + 15772, 5149, + 15868, 1205, + 15970, 696, + 16249, 3584, + 16338, 1917, + 16424, 2560, + 16483, 4438, + 16529, 6410, + 16620, 11966, + 16839, 8780, + 17030, 3050, + 17033, 18325, + 17092, 1568, + 17123, 5197, + 17351, 2113, + 17374, 980, + 17566, 26214, + 17609, 3912, + 17639, 32767, + 18151, 7871, + 18197, 2516, + 18202, 5649, + 18679, 3283, + 18930, 1370, + 19271, 13757, + 19317, 4120, + 19460, 1973, + 19654, 10018, + 19764, 6792, + 19912, 5135, + 20040, 2841, + 21234, 19833 +}; + +/*----------------------------------------------------------------------------------* + * Quantization table for scaled innovation energy prediciton + *----------------------------------------------------------------------------------*/ + +const Word16 Es_pred_qua_5b_fx[32] = +{//Q8 + -2048, + -525, + 642, + 1688, + 2547, + 3326, + 4026, + 4647, + 5211, + 5740, + 6221, + 6661, + 7067, + 7447, + 7815, + 8170, + 8518, + 8865, + 9204, + 9551, + 9912, + 10284, + 10669, + 11077, + 11509, + 11976, + 12486, + 13049, + 13695, + 14434, + 15354, + 16640, +}; + +const Word16 Es_pred_qua_4b_fx[16] = +{//Q8 + -2048, + -36, + 1828, + 3284, + 4584, + 5742, + 6821, + 7834, + /*8779, */ + 8778, + 9701, + 10610, + 11524, + 12487, + 13560, + 14862, + 16640 +}; + +const Word16 Es_pred_qua_3b_fx[8] = +{ + 1521/* 5.9422f Q8*/, + 3909/*15.2711f Q8*/, + 5987/*23.3857f Q8*/, + 7816/*30.5310f Q8*/, + 9477/*37.0190f Q8*/, + 11124/*43.4539f Q8*/, + 12863/*50.2442f Q8*/, + 15031/*58.7164f Q8*/ +}; + +const Word16 Es_pred_qua_4b_no_ltp_fx[16] = +{ + -1280/*-5.f Q8*/, + 0/* 0.f Q8*/, + 1280/* 5.f Q8*/, + 2560/*10.f Q8*/, + 3840/*15.f Q8*/, + 5120/*20.f Q8*/, + 6400/*25.f Q8*/, + 7680/*30.f Q8*/, + 8960/*35.f Q8*/, + 10240/*40.f Q8*/, + 11520/*45.f Q8*/, + 12800/*50.f Q8*/, + 14080/*55.f Q8*/, + 15360/*60.f Q8*/, + 16640/*65.f Q8*/, + 17920/*70.f Q8*/ +}; +/*----------------------------------------------------------------------------------* + * Gain estimation constants (for gain quantizer at 7.2 and 8.0 kbps) + *----------------------------------------------------------------------------------*/ + +const Word16 b_1sfr_fx[2] = /*Q12 */ +{ + 9697, -920 +}; + +const Word16 b_2sfr_fx[4] = /*Q12 */ +{ + -1, 70, 3763, 542 +}; + +const Word16 b_3sfr_fx[6] =//Q12 +{ + -478, 110, 553, 3264, 92, 730 +}; + +const Word16 b_4sfr_fx[8] =//Q12 +{ + -381, 65, -271, 836, 3246, 34, 143, 650 +}; + +/*----------------------------------------------------------------------------------* + * Gain codebooks (for gain quantizer at 7.2 and 8.0 kbps) + *----------------------------------------------------------------------------------*/ + +const Word16 gp_gamma_3sfr_7b_fx[2 * 128] = //Q14/Q9 +{ + 141, 207, + 268, 836, + 355, 385, + 470, 124, + 944, 265, + 1202, 503, + 1308, 640, + 1384, 150, + 1399, 75, + 1534, 323, + 1835, 1252, + 1872, 216, + 2297, 443, + 2495, 122, + 2697, 358, + 2849, 181, + 2920, 274, + 2937, 552, + 3353, 2982, + 3666, 394, + 3759, 1755, + 3790, 972, + 3838, 225, + 3929, 758, + 3973, 143, + 4075, 313, + 4329, 471, + 4689, 625, + 4938, 178, + 5073, 266, + 5216, 379, + 5519, 520, + 6089, 321, + 6149, 221, + 6247, 432, + 6254, 1083, + 6556, 131, + 6751, 733, + 6773, 587, + 7140, 17402, + 7257, 366, + 7295, 269, + 7314, 483, + 8121, 204, + 8214, 1515, + 8332, 538, + 8386, 842, + 8483, 314, + 8484, 660, + 8503, 395, + 9079, 455, + 9543, 249, + 9687, 1056, + 9724, 11493, + 9727, 336, + 9862, 603, + 10141, 158, + 10278, 498, + 10347, 393, + 10380, 751, + 10899, 287, + 11239, 564, + 11377, 210, + 11389, 437, + 11531, 926, + 11565, 339, + 11594, 684, + 11635, 7228, + 12176, 509, + 12240, 1235, + 12467, 381, + 12631, 254, + 12758, 809, + 12877, 458, + 12881, 620, + 13160, 313, + 13243, 1692, + 13441, 533, + 13620, 420, + 13855, 718, + 13895, 998, + 14047, 354, + 14150, 199, + 14170, 586, + 14358, 477, + 14770, 280, + 14777, 143, + 14810, 397, + 14965, 857, + 14984, 655, + 15112, 524, + 15406, 330, + 15535, 442, + 15599, 1120, + 15635, 4946, + 15823, 582, + 15891, 736, + 16161, 374, + 16216, 229, + 16265, 493, + 16607, 638, + 16610, 2511, + 16905, 803, + 16906, 433, + 16911, 310, + 16924, 1415, + 17161, 543, + 17656, 951, + 17694, 680, + 17736, 375, + 17982, 479, + 18345, 287, + 18372, 586, + 18469, 3627, + 18649, 183, + 18898, 2002, + 18925, 403, + 18959, 712, + 19244, 857, + 19306, 245, + 19447, 1203, + 19455, 334, + 19458, 526, + 19600, 455, + 19699, 623, + 19724, 1583, + 19788, 1001, + 20031, 749, +}; + +const Word16 gp_gamma_4sfr_7b_fx[2 * 128] = /*Q14/Q9 */ +{ + 101, 174, + 228, 542, + 400, 269, + 735, 418, + 799, 111, + 1146, 802, + 1250, 345, + 1291, 1138, + 1327, 224, + 1478, 1705, + 1557, 491, + 1947, 295, + 1988, 639, + 2343, 386, + 2386, 213, + 2541, 133, + 2904, 2881, + 3198, 455, + 3204, 736, + 3219, 276, + 3463, 549, + 3709, 343, + 3741, 177, + 4431, 226, + 4480, 927, + 4516, 396, + 4547, 622, + 4900, 290, + 5011, 503, + 5601, 742, + 5616, 173, + 5688, 428, + 5975, 337, + 6196, 5865, + 6293, 253, + 6294, 580, + 6305, 1053, + 6792, 480, + 6951, 391, + 7151, 212, + 7298, 671, + 7475, 317, + 7757, 534, + 7917, 856, + 8195, 1449, + 8198, 437, + 8228, 261, + 8434, 154, + 8493, 622, + 8552, 358, + 9324, 493, + 9373, 744, + 9391, 217, + 9410, 296, + 9711, 14146, + 9711, 405, + 9724, 598, + 10128, 1140, + 10248, 8800, + 10391, 344, + 10530, 883, + 10541, 542, + 10559, 257, + 10772, 441, + 11075, 664, + 11463, 304, + 11510, 196, + 11551, 2230, + 11574, 501, + 11611, 391, + 12154, 784, + 12205, 576, + 12304, 133, + 12413, 343, + 12457, 84, + 12468, 445, + 12734, 247, + 12970, 639, + 13072, 1411, + 13142, 983, + 13159, 499, + 13356, 386, + 13460, 298, + 13838, 710, + 13850, 550, + 13930, 429, + 14446, 343, + 14449, 170, + 14511, 467, + 14530, 857, + 14697, 623, + 14770, 4569, + 14833, 229, + 15086, 512, + 15112, 387, + 15527, 574, + 15552, 1126, + 15573, 764, + 15662, 291, + 15677, 442, + 16056, 648, + 16200, 508, + 16322, 369, + 16719, 586, + 16832, 936, + 16835, 450, + 16969, 702, + 17188, 315, + 17425, 538, + 17680, 395, + 17808, 209, + 17855, 791, + 18054, 1861, + 18122, 471, + 18273, 632, + 18425, 3478, + 18630, 1239, + 18947, 143, + 18948, 2576, + 19051, 264, + 19068, 349, + 19112, 502, + 19303, 1530, + 19502, 836, + 19558, 422, + 19571, 692, + 19667, 1014, + 19685, 569 +}; + +const Word16 gp_gamma_1sfr_8b_fx[2 * 256] = /*Q14/Q9 */ +{ + 305, 152, + 333, 37, + 352, 556, + 573, 82, + 652, 12, + 694, 207, + 808, 389, + 915, 776, + 986, 1089, + 987, 1583, + 1055, 60, + 1202, 2779, + 1205, 20, + 1346, 127, + 1432, 332, + 1689, 6554, + 1715, 261, + 1820, 49, + 2041, 698, + 2179, 4032, + 2199, 100, + 2272, 1303, + 2317, 461, + 2340, 175, + 2562, 26, + 2574, 14814, + 2657, 2101, + 2732, 66, + 2818, 9, + 2836, 296, + 2929, 938, + 3479, 130, + 3510, 220, + 3651, 3154, + 3667, 717, + 3720, 384, + 3783, 530, + 3811, 10744, + 3883, 5385, + 3941, 1609, + 3964, 46, + 4120, 80, + 4402, 15, + 4440, 1181, + 4485, 173, + 4740, 311, + 4848, 31, + 5125, 7642, + 5147, 110, + 5167, 908, + 5237, 252, + 5323, 623, + 5376, 2514, + 5590, 7, + 5595, 4475, + 5634, 64, + 5654, 461, + 5822, 22, + 5893, 140, + 5905, 1810, + 6177, 367, + 6268, 201, + 6352, 1092, + 6567, 752, + 6626, 50, + 6734, 95, + 6758, 295, + 6882, 3085, + 6962, 1363, + 7274, 540, + 7413, 166, + 7635, 2120, + 7642, 38, + 7671, 393, + 7730, 227, + 7860, 75, + 7980, 115, + 8011, 955, + 8092, 3687, + 8120, 17, + 8146, 5902, + 8453, 672, + 8524, 1602, + 8583, 58, + 8679, 275, + 8873, 332, + 8920, 454, + 8969, 9712, + 9129, 2566, + 9159, 196, + 9193, 1127, + 9219, 142, + 9300, 9, + 9302, 828, + 9409, 91, + 9736, 26, + 9872, 574, + 10066, 246, + 10131, 1352, + 10154, 1971, + 10196, 399, + 10238, 15785, + 10255, 4254, + 10401, 67, + 10439, 43, + 10511, 116, + 10531, 7399, + 10706, 998, + 10798, 722, + 10845, 171, + 10848, 304, + 10876, 2981, + 11069, 28204, + 11139, 507, + 11280, 12, + 11427, 388, + 11459, 214, + 11647, 1174, + 11710, 5061, + 11742, 1614, + 11793, 806, + 11816, 82, + 11890, 132, + 11996, 2301, + 12000, 603, + 12060, 55, + 12232, 256, + 12299, 33, + 12438, 338, + 12452, 458, + 12627, 3563, + 12646, 9489, + 12665, 934, + 12801, 1329, + 12802, 190, + 12877, 683, + 12941, 103, + 13038, 1890, + 13209, 6209, + 13222, 12674, + 13318, 21, + 13374, 283, + 13385, 149, + 13391, 383, + 13453, 545, + 13564, 1064, + 13596, 2561, + 13771, 810, + 13834, 1481, + 13874, 69, + 14027, 226, + 14093, 4429, + 14147, 7, + 14171, 609, + 14185, 47, + 14223, 3051, + 14273, 434, + 14321, 314, + 14415, 120, + 14443, 1252, + 14500, 173, + 14557, 933, + 14616, 1696, + 14639, 8229, + 14724, 89, + 14837, 703, + 14902, 2072, + 14917, 366, + 15000, 487, + 15009, 30, + 15095, 256, + 15138, 1119, + 15228, 3580, + 15371, 1386, + 15387, 5525, + 15398, 17932, + 15462, 149, + 15471, 791, + 15551, 569, + 15554, 2467, + 15559, 201, + 15616, 14, + 15664, 319, + 15798, 401, + 15811, 974, + 15874, 41, + 15929, 1649, + 15945, 79, + 16046, 111, + 16225, 647, + 16230, 1240, + 16297, 4110, + 16328, 10499, + 16331, 278, + 16355, 3003, + 16383, 455, + 16404, 169, + 16435, 2172, + 16438, 850, + 16745, 7090, + 16776, 354, + 16801, 1063, + 16803, 62, + 16812, 223, + 16927, 530, + 16951, 721, + 17039, 1447, + 17208, 1837, + 17233, 135, + 17371, 4642, + 17570, 406, + 17608, 267, + 17696, 906, + 17702, 2529, + 17705, 23239, + 17709, 1209, + 17745, 592, + 17800, 92, + 17858, 35, + 17860, 3360, + 17866, 9, + 17978, 184, + 18035, 321, + 18255, 754, + 18274, 480, + 18320, 18, + 18406, 55, + 18582, 13017, + 18677, 1516, + 18726, 1998, + 18904, 25, + 18914, 6103, + 19020, 8567, + 19022, 1116, + 19025, 349, + 19147, 239, + 19224, 604, + 19251, 160, + 19270, 4870, + 19358, 3789, + 19394, 126, + 19394, 103, + 19433, 72, + 19444, 46, + 19448, 2842, + 19489, 430, + 19575, 815, + 19628, 1306, + 19631, 972, + 19637, 202, + 19642, 289, + 19660, 527, + 19717, 1697, + 19731, 2263, + 19754, 676, + 19854, 382, +}; + +const Word16 gp_gamma_1sfr_7b_fx[2 * 128] = /*Q14/Q9 */ +{ + 350, 85, + 428, 24, + 438, 681, + 642, 195, + 1071, 2012, + 1080, 402, + 1148, 1236, + 1159, 62, + 1424, 12, + 1662, 134, + 1985, 299, + 2100, 34, + 2163, 3168, + 2219, 538, + 2393, 6580, + 2499, 967, + 2882, 221, + 2974, 12743, + 3251, 98, + 3294, 51, + 3586, 1560, + 3711, 411, + 3721, 700, + 3862, 21, + 3947, 169, + 4001, 2249, + 4198, 4632, + 4372, 8, + 4993, 70, + 5022, 265, + 5568, 1194, + 5664, 495, + 5698, 115, + 5885, 854, + 6115, 2990, + 6266, 153, + 6376, 39, + 6432, 16, + 6601, 345, + 7108, 1957, + 7231, 660, + 7491, 202, + 7687, 93, + 8054, 3882, + 8108, 9624, + 8186, 1424, + 8243, 59, + 8354, 935, + 8358, 6401, + 8383, 439, + 8794, 285, + 8940, 124, + 9643, 25, + 9643, 581, + 9670, 2709, + 10065, 160, + 10218, 9, + 10240, 1728, + 10249, 80, + 10418, 1113, + 10497, 373, + 10650, 236, + 11095, 44, + 11095, 756, + 11284, 4978, + 11290, 16722, + 11815, 2299, + 11882, 482, + 12059, 114, + 12332, 8550, + 12363, 1394, + 12392, 186, + 12517, 336, + 12549, 3413, + 12694, 953, + 13096, 614, + 13185, 71, + 13247, 262, + 13479, 1914, + 13791, 14, + 13805, 30, + 14064, 138, + 14182, 420, + 14212, 1175, + 14477, 765, + 14605, 2745, + 14612, 6324, + 14730, 4199, + 14833, 301, + 14842, 203, + 14910, 12790, + 15171, 100, + 15191, 1625, + 15289, 532, + 15405, 52, + 15550, 985, + 16096, 357, + 16175, 2113, + 16284, 232, + 16333, 669, + 16363, 22999, + 16396, 156, + 16443, 1270, + 16455, 3482, + 16543, 8, + 16650, 5425, + 16878, 452, + 16989, 84, + 17024, 9676, + 17194, 876, + 17730, 20, + 17780, 1442, + 17864, 38, + 17874, 254, + 17929, 526, + 18011, 2403, + 18751, 7153, + 18786, 117, + 18820, 4420, + 19002, 63, + 19099, 401, + 19111, 183, + 19197, 776, + 19202, 2953, + 19236, 1052, + 19255, 301, + 19354, 1760, + 19432, 593, +}; + +const Word16 gp_gamma_1sfr_6b_fx[2 * 64] = /*Q14/Q9 */ +{ + 436, 182, + 473, 63, + 962, 16, + 992, 647, + 1258, 1582, + 1447, 351, + 1711, 125, + 1809, 46, + 2569, 4173, + 2607, 957, + 2826, 251, + 2904, 12481, + 3248, 26, + 3594, 2254, + 3664, 78, + 3715, 483, + 4232, 8, + 4681, 188, + 5066, 6623, + 5232, 1273, + 6232, 695, + 6234, 49, + 6238, 113, + 6312, 318, + 7012, 17, + 7327, 3183, + 8008, 1739, + 8692, 446, + 8769, 163, + 8923, 1019, + 9094, 81, + 10358, 286, + 10491, 28, + 10612, 9788, + 10715, 760, + 11045, 4822, + 11319, 2403, + 11684, 56, + 12314, 108, + 12460, 556, + 12580, 9, + 12716, 213, + 12821, 1336, + 14202, 374, + 14325, 16971, + 14612, 838, + 14625, 3285, + 14668, 6231, + 14919, 39, + 15131, 137, + 15476, 1847, + 16056, 255, + 16277, 494, + 16290, 66, + 16582, 1048, + 16859, 17, + 17220, 8723, + 17443, 4295, + 18069, 2499, + 18212, 176, + 18499, 91, + 18517, 1445, + 18522, 332, + 18596, 663, +}; + +const Word16 gp_gamma_2sfr_7b_fx[2 * 128] = /*Q14/Q9 */ +{ + 99, 1224, + 156, 243, + 168, 579, + 290, 355, + 437, 441, + 475, 187, + 734, 738, + 930, 93, + 1133, 153, + 1136, 298, + 1490, 508, + 1946, 401, + 1978, 16790, + 2098, 224, + 2117, 962, + 2407, 119, + 2686, 339, + 2929, 555, + 3404, 271, + 3465, 171, + 3469, 422, + 3714, 663, + 4436, 494, + 4494, 332, + 4571, 220, + 4583, 2182, + 4997, 848, + 5346, 380, + 5419, 108, + 5570, 579, + 5758, 266, + 5875, 442, + 5927, 170, + 6204, 3338, + 6394, 6435, + 6515, 328, + 6638, 730, + 6687, 1472, + 7045, 1056, + 7101, 498, + 7123, 210, + 7163, 9668, + 7345, 386, + 7598, 280, + 7853, 627, + 8462, 442, + 8648, 331, + 8822, 236, + 8887, 551, + 8953, 906, + 9317, 136, + 9587, 386, + 9651, 691, + 9796, 286, + 9852, 489, + 10005, 1215, + 10041, 192, + 10623, 576, + 10758, 329, + 10840, 425, + 10944, 792, + 11038, 257, + 11190, 1870, + 11541, 501, + 11729, 642, + 11873, 367, + 12064, 163, + 12332, 216, + 12339, 1100, + 12339, 295, + 12478, 444, + 12561, 568, + 12665, 845, + 13257, 396, + 13317, 677, + 13411, 511, + 13709, 324, + 13710, 1547, + 13711, 246, + 14054, 991, + 14112, 447, + 14246, 580, + 14355, 748, + 14394, 175, + 14453, 99, + 14604, 363, + 14887, 491, + 15074, 282, + 15110, 637, + 15242, 1292, + 15351, 413, + 15430, 843, + 15700, 541, + 15776, 204, + 15964, 335, + 15992, 688, + 16077, 453, + 16315, 4617, + 16406, 1032, + 16549, 595, + 16666, 384, + 16850, 776, + 16851, 482, + 16916, 253, + 17234, 309, + 17307, 2128, + 17469, 546, + 17666, 643, + 17699, 421, + 17852, 882, + 17870, 146, + 18146, 1244, + 18457, 489, + 18478, 346, + 18588, 723, + 18826, 208, + 19011, 1731, + 19042, 586, + 19286, 281, + 19428, 944, + 19446, 382, + 19555, 444, + 19689, 792, + 19755, 1111, + 19762, 527, + 19769, 1405, + 19774, 657, + 19780, 2675, +}; + +const Word16 gp_gamma_2sfr_6b_fx[2 * 64] = /*Q14/Q9 */ +{ + 185, 306, + 435, 519, + 458, 145, + 1000, 211, + 1217, 394, + 1241, 751, + 1788, 93, + 2026, 1234, + 2162, 265, + 2397, 158, + 2617, 472, + 3324, 340, + 3391, 623, + 3835, 207, + 4503, 17210, + 4628, 407, + 4939, 897, + 5102, 275, + 5300, 120, + 5560, 511, + 6309, 1909, + 6571, 335, + 6770, 205, + 6990, 642, + 7085, 5087, + 7500, 428, + 8357, 827, + 8452, 261, + 9079, 537, + 9289, 354, + 9854, 1176, + 9864, 165, + 10436, 8580, + 10549, 437, + 10615, 677, + 11010, 282, + 11940, 530, + 12183, 367, + 12475, 920, + 12865, 225, + 13359, 618, + 13431, 441, + 13521, 1623, + 14177, 341, + 14299, 130, + 14452, 775, + 14799, 508, + 15250, 276, + 15715, 1130, + 15757, 660, + 15879, 422, + 16355, 3256, + 16439, 187, + 16751, 562, + 16906, 331, + 17178, 827, + 17889, 471, + 18219, 2175, + 18786, 248, + 18985, 1354, + 19067, 703, + 19220, 384, + 19349, 954, + 19422, 553, +}; +const Word16 gp_gamma_3sfr_6b_fx[2 * 64] = /*Q14/Q9 */ +{ + 195, 150, + 817, 288, + 1152, 616, + 1366, 188, + 1377, 410, + 1526, 902, + 1570, 98, + 2258, 238, + 2489, 518, + 2935, 338, + 3142, 161, + 3456, 1705, + 3990, 432, + 4159, 709, + 4187, 270, + 4374, 1236, + 5283, 526, + 5431, 131, + 5507, 356, + 5762, 211, + 6792, 620, + 6842, 446, + 6969, 304, + 7671, 807, + 8362, 245, + 8448, 530, + 8610, 380, + 9314, 1088, + 9828, 170, + 9921, 7010, + 10026, 459, + 10193, 312, + 10261, 658, + 11554, 394, + 11739, 882, + 11791, 542, + 11985, 4329, + 11996, 246, + 12762, 13441, + 12844, 1512, + 13131, 465, + 13135, 339, + 13215, 740, + 14138, 608, + 14524, 417, + 14780, 1030, + 14823, 283, + 15016, 171, + 15264, 527, + 15823, 2706, + 15943, 699, + 15959, 360, + 16350, 473, + 17211, 573, + 17366, 901, + 17517, 238, + 17799, 414, + 18069, 1415, + 18630, 1920, + 18887, 634, + 19018, 318, + 19304, 495, + 19400, 1114, + 19413, 767, +}; + + +const Word16 gp_gamma_4sfr_6b_fx[2 * 64] = /*Q14/Q9 */ +{ + 153, 141, + 282, 501, + 399, 239, + 783, 369, + 1110, 744, + 1430, 183, + 1440, 1748, + 1524, 1091, + 1602, 296, + 1828, 99, + 2000, 439, + 2678, 228, + 2815, 600, + 3084, 347, + 3861, 477, + 4154, 163, + 4214, 285, + 4428, 733, + 4976, 384, + 5482, 566, + 5552, 234, + 6158, 929, + 6536, 470, + 6560, 326, + 7288, 173, + 7429, 663, + 7447, 10616, + 7871, 407, + 8457, 266, + 8559, 550, + 8679, 1421, + 9457, 356, + 9533, 785, + 9854, 471, + 10584, 5781, + 10792, 3815, + 10813, 206, + 10829, 302, + 10986, 606, + 11380, 433, + 11468, 1073, + 12485, 356, + 12726, 520, + 12783, 721, + 13554, 259, + 13763, 139, + 13884, 430, + 14060, 2592, + 14266, 599, + 14332, 925, + 14997, 337, + 15355, 485, + 15526, 712, + 16440, 587, + 16504, 395, + 16626, 204, + 17228, 1287, + 17563, 805, + 17629, 517, + 18159, 1814, + 18320, 303, + 19228, 437, + 19263, 636, + 19417, 989, +}; + + + +/*----------------------------------------------------------------------------------* + * Transition coding - gain quantization table + *----------------------------------------------------------------------------------*/ +const Word16 tbl_gain_code_tc_fx[N_GAIN_CODE_TC] = /*q13 */ +{ + 2966, + 5930, + 7924, + 9712, + 11566, + 13754, + 16993, + 27280 +}; +const Word16 tbl_gain_code_tc_quant_mean[N_GAIN_CODE_TC - 1] = +{ + 4448, 6927, 8818, 10639, + 12660, 15374, 22136 +}; /* Q13 */ +/*-----------------------------------------------------------------* + * Transition coding - gain quantization table for g_trans + *-----------------------------------------------------------------*/ +const Word16 tbl_gain_trans_tc_fx[N_GAIN_TC] = +{ + 4588, 11109, 19212, 29862,/*<- Q7 +Q4 ->*/ 5536, 8184, 13115, 24000 +}; +/*-----------------------------------------------------------------* + * Transition coding - table of prototype glottal impulses + *-----------------------------------------------------------------*/ + +const Word16 Glottal_cdbk_fx[L_IMPULSE*NUM_IMPULSE] = /*Q13*/ +{ + /* impulse 0 */ + -715, -1690, -2903, -1742, -1295, -4266, + -4893, 1725, 8192, 5812, -628, -1956, + 581, 936, -81, 831, 1517, + + /* impulse 1 */ + -2168, -1356, -404, -2715, -4469, -2164, + -2180, -8058, -9140, 1163, 10343, 6677, + -1758, -2839, 377, 326, -490, + + /* impulse 2 */ + 360, 561, 4184, 2533, -3326, -2549, + 2059, -2112, -9542, -6134, 1307, 124, + -3421, -1465, 475, -886, -1262, + + /* impulse 3 */ + -1294, -715, -184, -1544, -1638, -219, + -3503, -9409, -7955, -1407, -285, -2494, + 305, 4658, 3289, 116, 1488, + + /* impulse 4 */ + 837, 2523, 2444, 2679, 5962, 6935, + -924, -9907, -7565, 643, 1350, -2577, + -2100, -277, -1546, -2279, -882, + + /* impulse 5 */ + -418, -886, -48, -494, -2368, -2060, + -1233, -5271,-10430, -6955, 3301, 7578, + 2599, -1665, -461, 735, -181, + + /* impulse 6 */ + -467, -1865, -1455, -127, -1881, -3776, + 822, 8335, 8192, 863, -2762, -375, + 757, -558, -285, 653, 150, + + /* impulse 7 */ + 1087, 471, -618, 706, 1546, -1605, + -3256, 2396, 8060, 5189, -99, -37, + 1105, -668, -1434, -59, -81 +}; + +/*----------------------------------------------------------------------------------* + * AMR-WB IO WB BWE - deemphasis + *----------------------------------------------------------------------------------*/ +const Word16 deem_tab_fx[56] = +{//Q15 + 20668, 20625, 20583, 20541, 20501, 20462, 20423, 20385, + 20348, 20313, 20277, 20243, 20210, 20177, 20146, 20115, + 20085, 20055, 20027, 19999, 19972, 19946, 19921, 19896, + 19873, 19850, 19827, 19806, 19785, 19766, 19746, 19728, + 19710, 19693, 19677, 19662, 19647, 19633, 19620, 19607, + 19596, 19585, 19574, 19565, 19556, 19548, 19540, 19533, + 19527, 19522, 19518, 19514, 19510, 19508, 19506, 19505 +}; + + +const Word16 filt_hp_fx[56] = +{//Q15 + 53, 153, 274, 415, 578, 765, 978, 1217, 1483, 1778, 2102, + 2457, 2843, 3261, 3710, 4192, 4706, 5252, 5829, 6438, 7077, + 7746, 8443, 9168, 9918, 10693, 11489, 12306, 13141, 13992, + 14856, 15732, 16615, 17504, 18395, 19287, 20174, 21056, 21928, + 22787, 23631, 24456, 25260, 26039, 26791, 27512, 28201, 28853, + 29468, 30043, 30574, 31061, 31502, 31894, 32237, 32529 +}; + +/* table of values exp(-j*w*i) */ + +const Word16 exp_tab_q_fx[34] = /*Q14 */ +{ + 16384, -16068, 15137, -13622, + 11585, -9101, 6270, -3195, + 0, 3196, -6269, 9102, + -11584, 13623, -15136, 16069, + -16383, 0, -3195, 6270, + -9101, 11585, -13622, 15137, + -16068, 16384, -16068, 15137, + -13622, 11585, -9101, 6270, + -3195, 0 +}; + + +const Word16 exp_tab_p_fx[34] = /*Q14 */ +{ + 16384, -11584, 0, 11585, + -16383, 11585, 0, -11584, + 16384, -11584, 0, 11585, + -16383, 11585, 0, -11584, + 16384, 0, -11584, 16384, + -11584, 0, 11585, -16383, + 11585, 0, -11584, 16384, + -11584, 0, 11585, -16383, + 11585, 0 +}; +/* gains for 23k85 mode */ + +const Word16 HP_gain_fx[16] = +{//Q15 + 3624, 4673, 5597, 6479, 7425, 8378, 9324, 10264, + 11210, 12206, 13391, 14844, 16770, 19655, 24289, 32728 +}; +/* band-pass 6-8kHz filter */ + +const Word16 fir_6k_7k_fx[31] = +{//Q15 + -32, 47, 32, -27, -369, + 1122, -1421, 0, 3798, -8880, + 12349, -10984, 3548, 7766, -18001, + 22118, -18001, 7766, 3548, -10984, + 12349, -8880, 3798, 0, -1421, + 1122, -369, -27, 32, 47, + -32 +}; +const Word16 no_lead_fx[][MAX_NO_SCALES * 2] = +{//Q0 + { 1, 0, 0, 1, 0, 0, }, /* 14 */ + { 2, 0, 0, 1, 0, 0, }, /* 15 */ + { 4, 2, 0, 1, 0, 0, }, /* 18 */ + { 4, 2, 0, 2, 0, 0, }, /* 19 */ + { 7, 5, 2, 5, 4, 2, }, /* 25 */ + { 8, 8, 3, 8, 6, 2, }, /* 28 */ /* mode UV WB*/ + { 4, 2, 0, 1, 0, 0, }, /* 18 */ + { 4, 0, 0, 2, 1, 0, }, /* 19 */ + { 9, 8, 8, 2, 2, 1, }, /* 24 */ + { 8, 5, 2, 5, 2, 1, }, /* 25 */ + { 18, 16, 8, 5, 5, 1, }, /* 29 */ + { 24, 21, 10, 8, 8, 2, }, /* 32 */ /* mode UV NB*/ + + { 2, 0, 0, 2, 0, 0, }, /* 17 */ + { 4, 2, 0, 1, 0, 0, }, /* 18 */ + { 7, 5, 2, 2, 0, 0, }, /* 21 */ + { 5, 2, 1, 4, 1, 0, }, /* 22 */ + { 8, 5, 2, 5, 2, 0, }, /* 25 */ + { 8, 7, 4, 5, 3, 2, }, + { 8, 8, 4, 6, 5, 2, }, + { 13, 8, 5, 6, 5, 2, }, + { 13, 8, 5, 8, 6, 2, }, + { 13, 8, 5, 11, 8, 2, }, /* 30 */ + { 24, 21, 8, 9, 8, 2, }, /* 32 */ + { 23, 18, 8, 13, 11, 3, }, + { 23, 21, 8, 17, 13, 4, }, /* 34 */ + { 31, 31, 17, 26, 25, 9, }, /* 37 */ /* mode V WB*/ + { 2, 0, 0, 2, 2, 0, }, /* 17 */ + { 4, 2, 0, 1, 0, 0, }, /* 18 */ + { 7, 5, 2, 2, 2, 0, }, /* 22 */ + { 8, 7, 2, 2, 2, 0, }, /* 23 */ + { 11, 8, 2, 2, 2, 0, }, /* 24 */ + { 13, 13, 9, 2, 2, 0, }, /* 25 */ + { 13, 11, 7, 5, 2, 0, }, /* 27 */ + { 18, 14, 9, 5, 5, 2, }, /* 29 */ + { 31, 31, 14, 11, 11, 5, }, /* 34 */ + { 31, 31, 27, 24, 21, 14, }, /* 37 */ /* mode V NB */ + { 5, 4, 0, 0, 0, 0, }, /* 12 (11.883) */ + { 2, 0, 0, 2, 0, 0, }, /* 16 (15.826) */ + { 4, 2, 0, 2, 0, 0, }, /* 19 (18.572) */ + { 5, 4, 0, 2, 0, 0, }, /* 20 (19.796) */ + { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ + { 8, 7, 2, 2, 0, 0, }, /* 22 (21.776) */ + { 5, 5, 2, 4, 2, 0, }, /* 23 (22.959) */ + { 8, 8, 5, 4, 2, 0, }, /* 25 (24.992) */ + { 8, 8, 7, 5, 2, 0, }, /* 26 (25.904) */ + { 13, 9, 8, 5, 2, 0, }, /* 27 (26.829) */ + { 13, 11, 8, 5, 5, 1, }, /* 28 (27.989) */ + { 13, 9, 8, 8, 5, 2, }, /* 29 (28.984) */ + { 22, 16, 10, 6, 5, 2, }, /* 30 (29.980) */ + { 21, 14, 10, 8, 7, 2, }, /* 31 (30.966) */ + { 24, 21, 10, 8, 8, 2, }, /* 32 (31.995) */ /* G WB*/ + + { 5, 4, 1, 0, 0, 0, }, /* 12 (11.925) */ + { 2, 0, 0, 2, 0, 0, }, /* 16 (15.826) */ + { 5, 4, 1, 1, 0, 0, }, /* 19 (18.745) */ + { 5, 4, 1, 2, 0, 0, }, /* 20 (19.838) */ + { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ + { 8, 5, 2, 2, 1, 0, }, /* 22 (21.985) */ + { 9, 8, 5, 2, 1, 0, }, /* 23 (22.815) */ + { 14, 13, 8, 2, 2, 0, }, /* 25 (24.996) */ + { 13, 8, 7, 4, 2, 0, }, /* 26 (25.993) */ + { 13, 9, 8, 5, 2, 2, }, /* 27 (26.954) */ + { 18, 13, 8, 5, 2, 2, }, /* 28 (27.992) */ + { 21, 13, 11, 5, 3, 2, }, /* 29 (28.996) */ + { 22, 21, 13, 5, 5, 2, }, /* 30 (29.988) */ + { 23, 21, 17, 7, 5, 2, }, /* 31 (30.962) */ + { 27, 23, 21, 8, 5, 2, }, /* 32 (31.987) */ /* G NB*/ + { 2, 0, 0, 2, 0, 0, }, /* 17 */ + { 4, 2, 0, 1, 0, 0, }, /* 18 */ + { 4, 1, 0, 4, 0, 0, }, /* 21 */ + { 5, 2, 0, 4, 1, 0, }, /* 22 */ + { 8, 5, 2, 4, 0, 0, }, /* 24 */ + { 8, 5, 2, 5, 2, 0, }, /* 25 */ + { 14, 10, 5, 5, 5, 1, }, /* 28 */ + { 14, 10, 5, 8, 8, 4, }, /* 30 */ + { 13, 10, 5, 13, 8, 8, }, + { 23, 21, 8, 8, 8, 4, }, + { 23, 18, 5, 13, 8, 8, }, /* 33 */ + /* mode T WB */ + { 2, 0, 0, 2, 2, 0, }, /* 17 */ + { 4, 2, 0, 1, 0, 0, }, /* 18 */ + { 7, 5, 2, 2, 2, 0, }, /* 22 */ + { 8, 7, 4, 2, 2, 0, }, /* 23 */ + { 11, 8, 5, 2, 2, 0, }, /* 24 */ + { 18, 8, 5, 2, 2, 0, }, /* 25 */ + { 16, 8, 5, 5, 5, 2, }, /* 28 */ + { 28, 23, 8, 5, 5, 5, }, /* 31 */ + { 31, 31, 8, 5, 5, 7, }, /* 32 */ /* mode T NB */ + + { 18, 18, 11, 9, 6, 5, }, /* 31 */ + { 24, 23, 13, 9, 6, 5, }, /* 32 */ /* mode G 16k */ + + { 24, 23, 13, 9, 6, 5, }, /* 32 (31.998) */ + { 36, 31, 18, 9, 6, 5, }, /* 33 (32.983) */ /* T 16k */ + + { 2, 0, 0, 2, 2, 0, }, /* 17 */ + { 7, 5, 2, 2, 0, 0, }, /* 21 */ + { 7, 5, 2, 2, 2, 0, }, /* 22 */ + { 9, 8, 3, 4, 2, 0, }, /* 25 */ + { 11, 9, 8, 4, 2, 0, }, /* 26 */ + { 48, 48, 34, 13, 11, 9 }, /* 36 */ /* mode AUDIO_WB 36 + 4 + 1 */ + + { 22, 10, 3, 0, 0, 0 }, /* 17 */ + { 6, 6, 2, 2, 0, 0 }, /* 21 */ + { 6, 6, 2, 2, 2, 0 }, /* 22 */ + { 23, 10, 3, 2, 2, 0 }, /* 26 */ + { 32, 16, 3, 2, 2, 0 }, /* 27 */ /* AUDIO_NB */ + { 39, 30, 12, 2, 2, 0 }, /* 28 */ /* AUDIO_NB */ + { 11, 9, 8, 4, 2, 0, }, /* 26 */ + { 48, 48, 48, 13, 9, 8 }, /* 36 */ /* mode AUDIO_WB 16k 15-36 + 4 + 1*/ + { 8, 7, 2, 2, 0, 0, }, /* 22 (21.776) */ + { 13, 13, 5, 5, 5, 0, }, /* 28 (27.994) */ + { 18, 17, 5, 5, 5, 1, }, /* 29 (28.996) */ + { 17, 13, 5, 8, 6, 2, }, /* 30 (29.991) */ + { 23, 21, 8, 9, 8, 3, }, /* 32 (31.992) */ + { 31, 29, 16, 8, 8, 3, }, /* 33 (32.993) */ + { 31, 25, 16, 12, 8, 8, }, /* 34 (33.968) */ + { 46, 48, 18, 18, 18, 12, }, /* 37 (36.995) */ /* VOICED 16k */ + { 14, 12, 9, 2, 2, 0, }, /* 25 (24.980) */ + { 15, 13, 3, 2, 2, 0, }, /* 25 (24.974) */ + { 17, 3, 0, 2, 2, 1, }, /* 25 (24.852) */ + { 13, 10, 3, 2, 2, 2, }, /* 25 (24.994) */ + { 14, 13, 8, 2, 2, 0, }, /* 25 (24.996) */ + { 7, 3, 0, 5, 3, 1, }, /* 25 (24.671) */ + { 4, 3, 2, 6, 6, 5, }, /* 25 (24.936) */ + { 4, 2, 0, 9, 9, 3, }, /* 25 (24.955) */ + { 4, 2, 0, 9, 8, 2, }, /* 25 (24.853) */ + { 4, 2, 0, 9, 7, 6, }, /* 25 (24.881) */ + { 6, 3, 0, 6, 3, 2, }, /* 25 (24.939) */ + { 3, 2, 0, 9, 8, 5, }, /* 25 (24.996) */ + { 2, 2, 0, 15, 3, 3, }, /* 25 (24.310) */ + { 4, 2, 0, 9, 9, 3, }, /* 25 (24.955) */ + { 4, 4, 2, 7, 6, 3, }, /* 25 (24.984) */ + { 3, 2, 0, 9, 7, 6, }, /* 25 (24.866) */ + +}; + +const Word16 no_lead_p_fx[][MAX_NO_SCALES * 2] = // Q0 +{ + + { 2, 1, 0, 0, 0, 0, }, /* 9 (8.464) */ + { 4, 2, 0, 2, 0, 0, }, /* 19 (18.572) */ + { 5, 5, 2, 4, 2, 0, }, /* 23 (22.959) */ + { 8, 5, 2, 4, 0, 0, }, /* 24 (23.949) */ + { 8, 8, 5, 4, 2, 0, }, /* 25 (24.992) */ + { 13, 11, 5, 5, 2, 0, }, /* 27 (26.902) */ + { 11, 10, 5, 6, 5, 2, }, /* 28 (27.996) */ + { 14, 13, 5, 7, 5, 2, }, /* 29 (28.937) */ + { 16, 13, 5, 8, 7, 2, }, /* 30 (29.954) */ + { 21, 21, 5, 8, 5, 2, }, /* 31 (30.978) */ + { 24, 21, 5, 8, 8, 4, }, /* 32 (31.978) */ + { 32, 23, 5, 13, 11, 5, }, /* 34 (33.975) */ + { 36, 31, 8, 16, 13, 5, }, /* 35 (34.975) */ + { 45, 35, 16, 18, 13, 5, }, /* 36 (35.889) */ + { 45, 35, 16, 38, 31, 8, }, /* 39 (38.488) */ /* V WB*/ /* 14 */ + + { 2, 0, 0, 0, 0, 0, }, /* 8 (7.913) */ + { 4, 2, 0, 2, 0, 0, }, /* 19 (18.572) */ + { 8, 7, 2, 2, 2, 0, }, /* 23 (22.773) */ + { 13, 11, 5, 2, 1, 0, }, /* 24 (23.999) */ + { 8, 8, 5, 4, 2, 0, }, /* 25 (24.992) */ + { 13, 11, 5, 5, 2, 1, }, /* 27 (26.962) */ + { 13, 11, 5, 5, 5, 2, }, /* 28 (27.835) */ + { 14, 13, 5, 7, 5, 2, }, /* 29 (28.937) */ + { 23, 21, 5, 5, 5, 2, }, /* 30 (29.969) */ + { 23, 18, 5, 8, 5, 2, }, /* 31 (30.952) */ + { 24, 21, 5, 8, 8, 4, }, /* 32 (31.978) */ + { 43, 41, 13, 9, 8, 5, }, /* 34 (33.992) */ + { 43, 36, 13, 13, 10, 5, }, /* 35 (35.000) */ + { 43, 40, 13, 17, 13, 9, }, /* 36 (35.980) */ + { 43, 42, 13, 31, 30, 18, }, /* 39 (38.512) */ /* V NB*/ /* 29 */ + + { 2, 0, 0, 1, 0, 0, }, /* 15 (14.733) */ + { 5, 4, 1, 1, 0, 0, }, /* 19 (18.745) */ + { 8, 7, 2, 2, 0, 0, }, /* 22 (21.776) */ + { 10, 9, 5, 2, 0, 0, }, /* 23 (22.791) */ + { 14, 13, 8, 2, 0, 0, }, /* 24 (23.999) */ + { 14, 13, 8, 2, 2, 0, }, /* 25 (24.996) */ + { 18, 17, 13, 2, 2, 0, }, /* 26 (25.934) */ + { 14, 13, 8, 5, 4, 0, }, /* 28 (27.969) */ + { 18, 17, 13, 5, 4, 2, }, /* 29 (28.996) */ + { 22, 21, 13, 5, 5, 2, }, /* 30 (29.988) */ + { 31, 23, 21, 5, 5, 2, }, /* 31 (30.931) */ + { 27, 23, 21, 8, 5, 2, }, /* 32 (31.987) */ + { 31, 23, 21, 9, 8, 5, }, /* 33 (32.982) */ + { 32, 31, 24, 11, 8, 5, }, /* 34 (33.967) */ + { 32, 32, 28, 13, 11, 8, }, /* 35 (34.994) */ /* G WB*/ /* 44 */ + + { 2, 0, 0, 1, 0, 0, }, /* 15 (14.733) */ + { 5, 4, 2, 1, 0, 0, }, /* 19 (18.792) */ + { 8, 5, 2, 2, 1, 0, }, /* 22 (21.985) */ + { 8, 7, 2, 2, 2, 0, }, /* 23 (22.773) */ + { 13, 11, 2, 2, 1, 0, }, /* 24 (23.932) */ + { 16, 13, 2, 2, 2, 0, }, /* 25 (24.955) */ + { 21, 17, 2, 2, 2, 0, }, /* 26 (25.991) */ + { 13, 12, 2, 5, 5, 2, }, /* 28 (27.979) */ + { 18, 16, 2, 5, 5, 2, }, /* 29 (28.878) */ + { 23, 21, 2, 5, 5, 2, }, /* 30 (29.954) */ + { 32, 28, 2, 5, 5, 2, }, /* 31 (30.893) */ + { 38, 31, 2, 7, 5, 2, }, /* 32 (31.963) */ + { 33, 31, 2, 8, 8, 4, }, /* 33 (32.997) */ + { 42, 31, 2, 9, 9, 8, }, /* 34 (33.986) */ + { 42, 31, 2, 13, 11, 9, }, /* 35 (34.952) */ /* G NB*/ /* 59 */ + + { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ + { 8, 8, 5, 4, 2, 0, }, /* 25 (24.992) */ + { 13, 8, 5, 4, 2, 0, }, /* 26 */ + { 13, 8, 5, 8, 6, 2, }, /* 29 */ + { 13, 8, 5, 9, 8, 5, }, /* 30 */ + { 48, 48, 48, 36, 36, 28 }, /* 40 */ /* mode 7 AUDIO_WB */ /* 65*/ + + { 7, 5, 2, 2, 0, 0 }, /* 21 */ + { 13, 13, 9, 2, 2, 0 }, /* 25 */ + { 18, 18, 9, 2, 2, 0 }, /* 26 */ + { 24, 23, 10, 5, 4, 2 }, /* 30 */ + { 31, 31, 12, 5, 5, 2 }, /* 31 */ /*AUDIO_NB */ /* 70 */ + { 43, 34, 12, 5, 5, 4 }, /* 32 */ /*AUDIO_NB */ /* 71 */ + { 13, 8, 5, 9, 8, 5, }, /* 30 */ + { 48, 48, 45, 45, 31, 25 }, /* 40 */ /* mode AUDIO_WB 16k */ /* 73*/ + + { 2, 0, 0, 2, 2, 0, }, /* 17 (16.823) */ + { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ + { 7, 5, 2, 2, 2, 0, }, /* 22 (21.907) */ + { 13, 11, 10, 2, 2, 0, }, /* 25 (24.863) */ + { 18, 18, 10, 2, 2, 0, }, /* 26 (25.921) */ + { 13, 9, 9, 5, 2, 0, }, /* 27 (26.837) */ + { 40, 28, 25, 18, 17, 2, }, /* 36 (35.998) */ /* INACTIVE NB*/ /* 80*/ + + { 18, 17, 11, 0, 0, 0, }, /* 17 (16.932) */ + { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ + { 8, 5, 2, 2, 1, 0, }, /* 22 (21.985) */ + { 13, 13, 9, 2, 2, 0, }, /* 25 (24.845) */ + { 18, 18, 12, 2, 2, 0, }, /* 26 (25.999) */ + { 23, 23, 16, 2, 2, 0, }, /* 27 (26.981) */ + { 36, 32, 24, 17, 13, 13, }, /* 36 (35.929) */ /* INACTIVE WB */ /* 87 */ + + { 2, 2, 0, 2, 0, 0, }, /* 17 (16.823) */ + { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ + { 8, 5, 2, 2, 1, 0, }, /* 22 (21.985) */ + { 13, 13, 9, 2, 2, 0, }, /* 25 (24.845) */ + { 18, 17, 13, 2, 2, 0, }, /* 26 (25.934) */ + { 23, 22, 17, 2, 2, 0, }, /* 27 (26.914) */ + { 34, 32, 24, 16, 16, 13, }, /* 36 (35.915) */ /* INACTIVE WB 16k*/ /* 94 */ + + { 4, 2, 0, 1, 0, 0, }, /* 18 (17.479) */ + { 5, 4, 0, 1, 0, 0, }, /* 19 (18.703) */ + { 8, 7, 2, 2, 0, 0, }, /* 22 (21.776) */ + { 10, 9, 5, 2, 0, 0, }, /* 23 (22.791) */ + { 15, 13, 5, 2, 0, 0, }, /* 24 (23.999) */ + { 18, 16, 8, 5, 5, 1, }, /* 29 (28.966) */ + { 42, 32, 31, 5, 5, 2, }, /* 32 (31.990) */ /* UNVOICED NB*/ /* 100 */ + + { 1, 0, 0, 1, 0, 0, }, /* 14 (13.640) */ + { 2, 0, 0, 1, 0, 0, }, /* 15 (14.733) */ + { 4, 2, 0, 1, 0, 0, }, /* 18 (17.479) */ + { 4, 2, 0, 2, 0, 0, }, /* 19 (18.572) */ + { 5, 4, 0, 2, 0, 0, }, /* 20 (19.796) */ + { 8, 8, 5, 4, 2, 0, }, /* 25 (24.992) */ + { 11, 10, 5, 6, 5, 2, }, /* 28 (27.996) */ /* UNVOICED WB */ /* 106 */ + { 9, 3, 0, 4, 0, 0, }, /* 24 (23.818) */ + { 18, 13, 10, 8, 3, 0, }, /* 30 (29.992) */ + { 24, 18, 10, 9, 3, 0, }, /* 31 (30.998) */ + { 32, 25, 10, 9, 3, 0, }, /* 32 (31.987) */ + { 42, 31, 10, 12, 3, 2, }, /* 34 (33.994) */ + { 44, 32, 27, 15, 3, 2, }, /* 35 (35.000) */ + { 44, 32, 25, 19, 3, 2, }, /* 36 (35.994) */ + { 48, 39, 32, 35, 15, 3, }, /* 39 (38.301) */ /* VOICED 16k */ + { 11, 10, 5, 4, 2, 0, }, /* 26 (25.917) */ /* 107 */ + { 23, 23, 17, 8, 7, 2, }, /* 32 (31.980) */ + { 32, 31, 18, 9, 7, 5, }, /* 33 (32.990) */ + { 31, 31, 18, 11, 9, 8, }, /* 34 (33.974) */ + { 32, 32, 20, 13, 12, 8, }, /* 35 (34.989) */ + { 32, 32, 23, 18, 17, 8, }, /* 36 (35.988) */ + { 32, 32, 23, 23, 22, 10, }, /* 37 (36.989) */ /* GENERIC 16k*/ /* 113 */ + + { 2, 0, 0, 2, 0, 0, }, /* 16 (15.826) */ /* 114 */ + { 7, 5, 2, 2, 0, 0, }, /* 21 (20.910) */ + { 14, 13, 8, 2, 0, 0, }, /* 24 (23.999) */ + { 8, 8, 5, 4, 2, 0, }, /* 25 (24.992) */ + { 11, 10, 5, 4, 2, 0, }, /* 26 (25.917) */ + { 16, 13, 8, 4, 2, 0, }, /* 27 (26.883) */ + { 13, 13, 8, 5, 4, 2, }, /* 28 (27.901) */ + { 23, 18, 13, 5, 5, 2, }, /* 30 (29.916) */ + { 23, 23, 13, 7, 5, 2, }, /* 31 (30.993) */ + { 23, 23, 17, 8, 7, 2, }, /* 32 (31.980) */ + { 32, 31, 24, 8, 7, 2, }, /* 33 (32.958) */ + { 42, 32, 31, 9, 9, 4, }, /* 34 (33.987) */ + { 40, 32, 29, 12, 9, 9, }, /* 35 (34.994) */ + { 40, 32, 31, 17, 11, 11, }, /* 36 (35.968) */ + { 41, 32, 31, 20, 18, 13, }, /* 37 (36.971) */ /* GENERIC 12.8k MA*/ /* 128 */ + + { 11, 10, 5, 4, 2, 0, }, /* 26 (25.917) */ /* 129 */ + { 23, 23, 17, 8, 7, 2, }, /* 32 (31.980) */ + { 31, 31, 18, 9, 8, 2, }, /* 33 (32.995) */ + { 48, 32, 24, 9, 8, 3, }, /* 34 (33.993) */ + { 48, 32, 28, 11, 10, 3, }, /* 35 (34.992) */ + { 48, 37, 32, 16, 12, 4, }, /* 36 (35.997) */ + { 48, 37, 32, 18, 17, 12, }, /* 37 (36.961) */ /* AUDIO 16k */ +}; + +/*----------------------------------------------------------------------------------* + * Enhacer - 2.0 - 6.4 kHz impulse response with phase dispersion in freq. domain + *----------------------------------------------------------------------------------*/ +const Word16 low_H[64] = /* (1Q14) */ +{ + 16388, 16380, 16386, 16381, 16382, 16382, 16381, 16383, 16385, 10265, + 10154, 9894, 14051, 16342, -531, 13216, 16372, 15509, 9406, 15948, + 4726, 14593, 10404, 9795, -16337, -1815, -10624, 12646, 14555, -12684, + 11388, 8175, 16382, -14198, 11781, 10378, 7515, 10423, -12473, 16284, + -1200, -13137, 12658, -7446, 15683, -3764, -13419, -5281, 521, -9686, + -16375, -1219, 8435, -13059, -12862, -12775, -1, 2, 0, -3, + -1, -1, -2, 1 +}; + +const Word16 low_H16k[80] = /* (1Q14) */ +{ + 16388, 16380, 16386, 16381, 16382, 16382, 16381, 16383, 16385, 10265, + 10154, 9894, 14051, 16342, -531, 13216, 16372, 15509, 9406, 15948, + 4726, 14593, 10404, 9795, -16337, -1815, -10624, 12646, 14555, -12684, + 11388, 8175, -4121, -13408, 10605, -12308, 16358, 4699, 7640, -7360, + 16382, -14639, -14494, 15695, -907, -10815, -12489, 9416, 15857, + -14198, 11781, 10378, 7515, 10423, -12473, 16284, -1200, -13137, 12658, + -7446, 15683, -3764, -13419, -5281, 521, -9686, -16375, -1219, 8435, + -13059, -12862, -12775, -1, 2, 0, -3, -1, -1, -2, 1 +}; +/*----------------------------------------------------------------------------------* + * Enhancer - 3.2 - 6.4 kHz impulse response with phase dispersion in freq. domain + *----------------------------------------------------------------------------------*/ + +const Word16 mid_H[64] = /* (1Q14) */ +{ + 16382, 16381, 16384, 16384, 16385, 16387, 16386, 16382, 16387, 16382, + 16385, 16385, 16385, 16384, 16382, 16388, 14847, 9629, 13248, 14486, + 10995, 642, 13817, 13779, 6468, 8664, 11634, 9780, -14636, -982, + 11746, -722, 16385, -16366, -11423, 16354, 7362, 13147, -11538, -13904, + -15052, -8862, 8811, -16371, -12146, 7660, -9638, -13254, -6923, 3, + -5, -2, -6, 1, 6, 5, -8, -2, 3, -5, + 0, -2, -4, 3 +}; + +const Word16 mid_H16k[80] = /* (1Q14) */ +{ + 16382, 16381, 16384, 16384, 16385, 16387, 16386, 16382, 16387, 16382, + 16385, 16385, 16385, 16384, 16382, 16388, 14847, 9629, 13248, 14486, + 10995, 642, 13817, 13779, 6468, 8664, 11634, 9780, -14636, -982, + 11746, -722, 108, -16195, -13199, -13289, 5114, 12941, 7110, 8873, + 16385, -13774, -14761, 10047, -15566, -9584, 9707, 2483, 16383, + -16366, -11423, 16354, 7362, 13147, -11538, -13904, -15052, -8862, + 8811, -16371, -12146, 7660, -9638, -13254, -6923, 3, -5, -2, -6, + 1, 6, 5, -8, -2, 3, -5, 0, -2, -4, 3 +}; + +/*-------------------------------------------------------------------* + * Low-pass FIR filter for low-freq post-filtering + * response : 0dB @ 50Hz, -6dB @ 500Hz, -45dB @ 1kHz) + * filter parameters: fs/2=8000, fc=500, gain=1.0, n=16 + *-------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------* + * Bass post-filter + *-------------------------------------------------------------------*/ + +/* For bass post filter */ +const Word16 filt_lp_fx[1 + L_FILT] = +{ + 2892/*0.088250f Q15*/, 2831/*0.086410f Q15*/, 2657/*0.081074f Q15*/, 2384/*0.072768f Q15*/, + 2041/*0.062294f Q15*/, 1659/*0.050623f Q15*/, 1271/*0.038774f Q15*/, 907/*0.027692f Q15*/, + 594/*0.018130f Q15*/, 347/*0.010578f Q15*/, 171/*0.005221f Q15*/, 64/*0.001946f Q15*/, + 13/*0.000385f Q15*/ +}; + +const Word16 filt_lp_16kHz_fx[1 + L_FILT16k] = +{ + 2340/*0.071410f Q15*/, 2308/*0.070433f Q15*/, 2214/*0.067568f Q15*/, 2064/*0.062999f Q15*/, + 1868/*0.057020f Q15*/, 1639/*0.050005f Q15*/, 1389/*0.042378f Q15*/, 1133/*0.034577f Q15*/, + 885/*0.027022f Q15*/, 658/*0.020078f Q15*/, 460/*0.014031f Q15*/, 297/*0.009070f Q15*/, + 173/*0.005276f Q15*/, 86/*0.002625f Q15*/, 33/*0.000999f Q15*/, 7/*0.000205f Q15*/ +}; + +/*-------------------------------------------------------------------* + * Pulse indexing tables for ACELP innovation coding + *-------------------------------------------------------------------*/ + +const Word32 PI_select_table[23][8] = // Q0 +{ + {1, 0, 0, 0, 0, 0, 0, 0}, + {1, 1, 0, 0, 0, 0, 0, 0}, + {1, 2, 1, 0, 0, 0, 0, 0}, + {1, 3, 3, 1, 0, 0, 0, 0}, + {1, 4, 6, 4, 1, 0, 0, 0}, + {1, 5, 10, 10, 5, 1, 0, 0}, + {1, 6, 15, 20, 15, 6, 1, 0}, + {1, 7, 21, 35, 35, 21, 7, 1}, + {1, 8, 28, 56, 70, 56, 28, 8}, + {1, 9, 36, 84, 126, 126, 84, 36}, + {1, 10, 45, 120, 210, 252, 210, 120}, + {1, 11, 55, 165, 330, 462, 462, 330}, + {1, 12, 66, 220, 495, 792, 924, 792}, + {1, 13, 78, 286, 715, 1287, 1716, 1716}, + {1, 14, 91, 364, 1001, 2002, 3003, 3432}, + {1, 15, 105, 455, 1365, 3003, 5005, 6435}, + {1, 16, 120, 560, 1820, 4368, 8008, 11440}, + {1, 17, 136, 680, 2380, 6188, 12376, 19448}, + {1, 18, 153, 816, 3060, 8568, 18564, 31824}, + {1, 19, 171, 969, 3876, 11628, 27132, 50388}, + {1, 20, 190, 1140, 4845, 15504, 38760, 77520}, + {1, 21, 210, 1330, 5985, 20349, 54264, 116280}, + {1, 22, 231, 1540, 7315, 26334, 74613, 1705444} +}; + +const Word32 PI_offset[8][8] = // Q0 +{ + /* for 0p(0). */ + {0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000}, + /* for 1p(1). */ + {0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000}, + /* for 2p(2,1). */ + {0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000}, + /* for 3p(3,2,1). */ + {0x00000,0x00000,0x01180,0x01540,0x00000,0x00000,0x00000,0x00000}, + /* for 4p(4,3,2,1). */ + {0x00000,0x00000,0x071C0,0x0A640,0x0ABE0,0x00000,0x00000,0x00000}, + /* for 5p(5,4,3,2,1). */ + {0x00000,0x00000,0x22200,0x3E900,0x45200,0x45980,0x00000,0x00000}, + /* for 6p(6,5,4,3,2,1). */ + {0x00000,0x00000,0x07d200,0x127c00,0x16ed80,0x179c80,0x17a5e0,0x00000}, + /* for 7p(7,6,5,4,3,2,1). */ + {0x00000,0x00000,0x165800,0x454400,0x654200,0x6E2500,0x6F2B80,0x6F36C0} +}; + +const Word16 PI_factor[7] = {0,0,120,560,1820,4368,8008}; // Q0 + +/* ACELP pulse coding */ +const Word16 hi_to_low_tmpl[10] = { 0, 0, 0, 3, 9, 5, 3, 1, 8, 8 }; // Q0 +const UWord16 low_len[10] = { 0, 0, 8, 5, 7,11,13,15,16,16 }; // Q0 +const UWord16 low_mask[10] = { 0, 0, 255,31,127,2047,8191,32767,65535,65535 }; // Q0 +const UWord16 indx_fact[10] = { 0, 0,2,172,345,140,190,223,463,1732 }; // Q0 +const Word16 index_len[3] = { 0, 5, 9 }; // Q0 +const Word16 index_mask_ACELP[3] = { 0, 31, 511 }; // Q0 + + +/*------------------------------------------------------------------------------* + * EDCT tables + *------------------------------------------------------------------------------*/ + +//Fix +const Word16 edct_table_80_fx[80] = /*Q16 */ +{ + 21911, 21903, 21886, 21860, 21827, 21784, 21734, 21675, + 21608, 21532, 21448, 21356, 21255, 21147, 21030, 20905, + 20772, 20631, 20482, 20325, 20161, 19988, 19808, 19621, + 19425, 19222, 19012, 18795, 18570, 18338, 18099, 17853, + 17600, 17340, 17074, 16801, 16522, 16236, 15944, 15646, + 15341, 15031, 14715, 14394, 14067, 13734, 13396, 13053, + 12705, 12352, 11994, 11632, 11265, 10894, 10519, 10139, + 9756, 9369, 8978, 8584, 8186, 7786, 7382, 6975, + 6566, 6155, 5741, 5324, 4906, 4486, 4064, 3640, + 3215, 2789, 2362, 1934, 1505, 1075, 645, 215 +}; + +const Word16 edct_table_100_fx[] = +{/*Q16 */ + 20723, 20718, 20708, 20692, 20672, 20646, 20616, 20580, + 20539, 20493, 20442, 20386, 20325, 20259, 20188, 20112, + 20031, 19946, 19855, 19759, 19658, 19553, 19443, 19328, + 19208, 19083, 18954, 18820, 18681, 18538, 18390, 18238, + 18081, 17920, 17754, 17584, 17410, 17231, 17048, 16861, + 16670, 16474, 16275, 16071, 15864, 15652, 15437, 15218, + 14995, 14768, 14538, 14304, 14067, 13826, 13582, 13335, + 13084, 12830, 12573, 12312, 12049, 11783, 11513, 11241, + 10966, 10689, 10409, 10126, 9841, 9553, 9263, 8971, + 8676, 8379, 8081, 7780, 7477, 7173, 6867, 6559, + 6249, 5938, 5625, 5311, 4996, 4679, 4362, 4043, + 3723, 3403, 3081, 2759, 2436, 2112, 1788, 1464, + 1139, 814, 488, 163 +}; + +const Word16 edct_table_120_fx[120] = /*Q16 */ +{ + 19800, 19797, 19790, 19780, 19766, 19749, 19729, 19705, + 19678, 19648, 19614, 19576, 19536, 19492, 19445, 19394, + 19340, 19283, 19223, 19159, 19092, 19021, 18948, 18871, + 18791, 18708, 18621, 18531, 18438, 18342, 18243, 18141, + 18035, 17927, 17815, 17701, 17583, 17462, 17339, 17212, + 17082, 16950, 16815, 16676, 16535, 16391, 16244, 16095, + 15942, 15787, 15629, 15469, 15306, 15140, 14972, 14801, + 14628, 14452, 14273, 14092, 13909, 13723, 13535, 13345, + 13152, 12958, 12761, 12561, 12360, 12156, 11951, 11743, + 11533, 11322, 11108, 10893, 10675, 10456, 10235, 10012, + 9788, 9562, 9334, 9104, 8874, 8641, 8407, 8172, + 7935, 7697, 7457, 7217, 6975, 6732, 6487, 6242, + 5995, 5748, 5499, 5250, 4999, 4748, 4496, 4243, + 3990, 3736, 3481, 3225, 2969, 2713, 2456, 2199, + 1941, 1683, 1424, 1166, 907, 648, 389, 130 +}; + +const Word16 edct_table_320_fx[320] = /*Q16 */ +{ + 15495, 15495, 15494, 15493, 15491, 15489, 15487, 15484, + 15481, 15478, 15474, 15470, 15466, 15461, 15456, 15450, + 15444, 15438, 15431, 15424, 15417, 15409, 15401, 15392, + 15383, 15374, 15364, 15354, 15344, 15333, 15322, 15310, + 15298, 15286, 15273, 15260, 15247, 15233, 15219, 15205, + 15190, 15175, 15159, 15143, 15127, 15110, 15093, 15076, + 15058, 15040, 15021, 15002, 14983, 14964, 14944, 14924, + 14903, 14882, 14860, 14839, 14817, 14794, 14771, 14748, + 14725, 14701, 14677, 14652, 14627, 14602, 14576, 14550, + 14524, 14497, 14470, 14443, 14415, 14387, 14359, 14330, + 14301, 14271, 14242, 14212, 14181, 14150, 14119, 14088, + 14056, 14024, 13991, 13958, 13925, 13891, 13858, 13823, + 13789, 13754, 13719, 13683, 13647, 13611, 13575, 13538, + 13501, 13463, 13425, 13387, 13349, 13310, 13271, 13231, + 13192, 13152, 13111, 13071, 13030, 12988, 12947, 12905, + 12862, 12820, 12777, 12734, 12690, 12647, 12602, 12558, + 12513, 12468, 12423, 12377, 12331, 12285, 12239, 12192, + 12145, 12098, 12050, 12002, 11954, 11905, 11856, 11807, + 11758, 11708, 11658, 11608, 11557, 11507, 11455, 11404, + 11352, 11301, 11248, 11196, 11143, 11090, 11037, 10983, + 10930, 10876, 10821, 10767, 10712, 10657, 10601, 10546, + 10490, 10434, 10378, 10321, 10264, 10207, 10150, 10092, + 10034, 9976, 9918, 9859, 9800, 9741, 9682, 9623, + 9563, 9503, 9443, 9382, 9322, 9261, 9200, 9138, + 9077, 9015, 8953, 8891, 8829, 8766, 8703, 8640, + 8577, 8513, 8450, 8386, 8322, 8258, 8193, 8129, + 8064, 7999, 7933, 7868, 7802, 7737, 7671, 7604, + 7538, 7471, 7405, 7338, 7271, 7203, 7136, 7068, + 7001, 6933, 6865, 6796, 6728, 6659, 6591, 6522, + 6453, 6383, 6314, 6244, 6175, 6105, 6035, 5965, + 5895, 5824, 5754, 5683, 5612, 5541, 5470, 5399, + 5327, 5256, 5184, 5113, 5041, 4969, 4897, 4824, + 4752, 4680, 4607, 4534, 4462, 4389, 4316, 4243, + 4169, 4096, 4023, 3949, 3876, 3802, 3728, 3654, + 3580, 3506, 3432, 3358, 3284, 3209, 3135, 3060, + 2986, 2911, 2836, 2761, 2687, 2612, 2537, 2462, + 2386, 2311, 2236, 2161, 2085, 2010, 1934, 1859, + 1783, 1708, 1632, 1557, 1481, 1405, 1329, 1254, + 1178, 1102, 1026, 950, 874, 798, 722, 646, + 570, 494, 418, 342, 266, 190, 114, 38 +}; + +const Word16 edct_table_480_fx[480] = /*Q16 */ +{ + 14001, 14001, 14001, 14000, 14000, 13999, 13998, 13997, + 13996, 13995, 13993, 13991, 13990, 13988, 13986, 13983, + 13981, 13978, 13976, 13973, 13970, 13967, 13963, 13960, + 13956, 13953, 13949, 13945, 13940, 13936, 13932, 13927, + 13922, 13917, 13912, 13907, 13902, 13896, 13890, 13885, + 13879, 13872, 13866, 13860, 13853, 13846, 13840, 13833, + 13825, 13818, 13811, 13803, 13795, 13787, 13779, 13771, + 13763, 13754, 13746, 13737, 13728, 13719, 13709, 13700, + 13691, 13681, 13671, 13661, 13651, 13641, 13630, 13620, + 13609, 13598, 13587, 13576, 13565, 13553, 13542, 13530, + 13518, 13506, 13494, 13482, 13469, 13457, 13444, 13431, + 13418, 13405, 13392, 13378, 13365, 13351, 13337, 13323, + 13309, 13295, 13280, 13266, 13251, 13236, 13221, 13206, + 13191, 13175, 13160, 13144, 13128, 13112, 13096, 13080, + 13063, 13047, 13030, 13013, 12996, 12979, 12962, 12944, + 12927, 12909, 12891, 12873, 12855, 12837, 12819, 12800, + 12782, 12763, 12744, 12725, 12706, 12686, 12667, 12647, + 12628, 12608, 12588, 12568, 12547, 12527, 12506, 12486, + 12465, 12444, 12423, 12402, 12380, 12359, 12337, 12316, + 12294, 12272, 12250, 12227, 12205, 12182, 12160, 12137, + 12114, 12091, 12068, 12045, 12021, 11998, 11974, 11950, + 11926, 11902, 11878, 11854, 11829, 11804, 11780, 11755, + 11730, 11705, 11680, 11654, 11629, 11603, 11578, 11552, + 11526, 11500, 11474, 11447, 11421, 11394, 11368, 11341, + 11314, 11287, 11260, 11232, 11205, 11177, 11150, 11122, + 11094, 11066, 11038, 11010, 10981, 10953, 10924, 10895, + 10867, 10838, 10809, 10779, 10750, 10721, 10691, 10662, + 10632, 10602, 10572, 10542, 10512, 10481, 10451, 10420, + 10390, 10359, 10328, 10297, 10266, 10235, 10203, 10172, + 10140, 10109, 10077, 10045, 10013, 9981, 9949, 9917, + 9884, 9852, 9819, 9786, 9754, 9721, 9688, 9654, + 9621, 9588, 9554, 9521, 9487, 9454, 9420, 9386, + 9352, 9318, 9283, 9249, 9214, 9180, 9145, 9111, + 9076, 9041, 9006, 8971, 8935, 8900, 8865, 8829, + 8794, 8758, 8722, 8686, 8650, 8614, 8578, 8542, + 8505, 8469, 8432, 8396, 8359, 8322, 8285, 8248, + 8211, 8174, 8137, 8099, 8062, 8025, 7987, 7949, + 7912, 7874, 7836, 7798, 7760, 7721, 7683, 7645, + 7606, 7568, 7529, 7491, 7452, 7413, 7374, 7335, + 7296, 7257, 7218, 7178, 7139, 7100, 7060, 7020, + 6981, 6941, 6901, 6861, 6821, 6781, 6741, 6701, + 6661, 6620, 6580, 6539, 6499, 6458, 6418, 6377, + 6336, 6295, 6254, 6213, 6172, 6131, 6090, 6048, + 6007, 5966, 5924, 5883, 5841, 5799, 5758, 5716, + 5674, 5632, 5590, 5548, 5506, 5464, 5422, 5379, + 5337, 5295, 5252, 5210, 5167, 5124, 5082, 5039, + 4996, 4953, 4911, 4868, 4825, 4782, 4738, 4695, + 4652, 4609, 4566, 4522, 4479, 4435, 4392, 4348, + 4305, 4261, 4218, 4174, 4130, 4086, 4042, 3999, + 3955, 3911, 3867, 3823, 3778, 3734, 3690, 3646, + 3602, 3557, 3513, 3469, 3424, 3380, 3335, 3291, + 3246, 3202, 3157, 3112, 3068, 3023, 2978, 2933, + 2889, 2844, 2799, 2754, 2709, 2664, 2619, 2574, + 2529, 2484, 2439, 2394, 2349, 2303, 2258, 2213, + 2168, 2122, 2077, 2032, 1986, 1941, 1896, 1850, + 1805, 1759, 1714, 1668, 1623, 1577, 1532, 1486, + 1441, 1395, 1350, 1304, 1258, 1213, 1167, 1121, + 1076, 1030, 984, 939, 893, 847, 801, 756, + 710, 664, 618, 573, 527, 481, 435, 389, + 344, 298, 252, 206, 160, 115, 69, 23 +}; + +const Word16 edct_table_600_fx[] =/*Q16 */ +{ + 26483, 26483, 26483, 26482, 26481, 26481, 26479, 26478, + 26477, 26475, 26473, 26471, 26469, 26467, 26464, 26461, + 26459, 26455, 26452, 26449, 26445, 26441, 26437, 26433, + 26429, 26424, 26420, 26415, 26410, 26404, 26399, 26393, + 26387, 26381, 26375, 26369, 26362, 26356, 26349, 26342, + 26335, 26327, 26320, 26312, 26304, 26296, 26287, 26279, + 26270, 26261, 26252, 26243, 26234, 26224, 26214, 26204, + 26194, 26184, 26173, 26163, 26152, 26141, 26130, 26118, + 26107, 26095, 26083, 26071, 26059, 26046, 26033, 26021, + 26008, 25994, 25981, 25968, 25954, 25940, 25926, 25912, + 25897, 25883, 25868, 25853, 25838, 25823, 25807, 25791, + 25776, 25760, 25743, 25727, 25711, 25694, 25677, 25660, + 25643, 25625, 25608, 25590, 25572, 25554, 25535, 25517, + 25498, 25480, 25461, 25441, 25422, 25403, 25383, 25363, + 25343, 25323, 25302, 25282, 25261, 25240, 25219, 25198, + 25176, 25155, 25133, 25111, 25089, 25067, 25044, 25022, + 24999, 24976, 24953, 24929, 24906, 24882, 24858, 24834, + 24810, 24786, 24761, 24737, 24712, 24687, 24662, 24636, + 24611, 24585, 24559, 24533, 24507, 24481, 24454, 24427, + 24401, 24373, 24346, 24319, 24291, 24264, 24236, 24208, + 24180, 24151, 24123, 24094, 24065, 24036, 24007, 23978, + 23948, 23918, 23888, 23858, 23828, 23798, 23767, 23737, + 23706, 23675, 23644, 23612, 23581, 23549, 23518, 23486, + 23453, 23421, 23389, 23356, 23323, 23290, 23257, 23224, + 23191, 23157, 23123, 23090, 23056, 23021, 22987, 22953, + 22918, 22883, 22848, 22813, 22778, 22742, 22707, 22671, + 22635, 22599, 22563, 22526, 22490, 22453, 22416, 22379, + 22342, 22305, 22267, 22230, 22192, 22154, 22116, 22078, + 22039, 22001, 21962, 21923, 21884, 21845, 21806, 21766, + 21727, 21687, 21647, 21607, 21567, 21527, 21486, 21446, + 21405, 21364, 21323, 21282, 21241, 21199, 21157, 21116, + 21074, 21032, 20989, 20947, 20905, 20862, 20819, 20776, + 20733, 20690, 20647, 20603, 20560, 20516, 20472, 20428, + 20384, 20339, 20295, 20250, 20205, 20161, 20116, 20070, + 20025, 19980, 19934, 19888, 19842, 19796, 19750, 19704, + 19658, 19611, 19565, 19518, 19471, 19424, 19377, 19329, + 19282, 19234, 19186, 19139, 19091, 19042, 18994, 18946, + 18897, 18849, 18800, 18751, 18702, 18653, 18604, 18554, + 18505, 18455, 18405, 18355, 18305, 18255, 18205, 18154, + 18104, 18053, 18002, 17951, 17900, 17849, 17798, 17747, + 17695, 17643, 17592, 17540, 17488, 17436, 17383, 17331, + 17278, 17226, 17173, 17120, 17067, 17014, 16961, 16908, + 16854, 16801, 16747, 16693, 16640, 16586, 16531, 16477, + 16423, 16368, 16314, 16259, 16204, 16149, 16094, 16039, + 15984, 15929, 15873, 15818, 15762, 15706, 15650, 15595, + 15538, 15482, 15426, 15370, 15313, 15256, 15200, 15143, + 15086, 15029, 14972, 14914, 14857, 14800, 14742, 14684, + 14627, 14569, 14511, 14453, 14395, 14336, 14278, 14220, + 14161, 14103, 14044, 13985, 13926, 13867, 13808, 13749, + 13689, 13630, 13570, 13511, 13451, 13391, 13332, 13272, + 13212, 13151, 13091, 13031, 12971, 12910, 12849, 12789, + 12728, 12667, 12606, 12545, 12484, 12423, 12362, 12300, + 12239, 12177, 12116, 12054, 11992, 11930, 11868, 11806, + 11744, 11682, 11620, 11558, 11495, 11433, 11370, 11307, + 11245, 11182, 11119, 11056, 10993, 10930, 10867, 10803, + 10740, 10677, 10613, 10550, 10486, 10422, 10358, 10295, + 10231, 10167, 10103, 10039, 9974, 9910, 9846, 9781, + 9717, 9652, 9588, 9523, 9458, 9394, 9329, 9264, + 9199, 9134, 9069, 9003, 8938, 8873, 8808, 8742, + 8677, 8611, 8546, 8480, 8414, 8348, 8283, 8217, + 8151, 8085, 8019, 7953, 7886, 7820, 7754, 7688, + 7621, 7555, 7488, 7422, 7355, 7289, 7222, 7155, + 7088, 7022, 6955, 6888, 6821, 6754, 6687, 6620, + 6553, 6485, 6418, 6351, 6283, 6216, 6149, 6081, + 6014, 5946, 5879, 5811, 5743, 5676, 5608, 5540, + 5472, 5404, 5337, 5269, 5201, 5133, 5065, 4997, + 4928, 4860, 4792, 4724, 4656, 4587, 4519, 4451, + 4382, 4314, 4246, 4177, 4109, 4040, 3972, 3903, + 3834, 3766, 3697, 3629, 3560, 3491, 3422, 3354, + 3285, 3216, 3147, 3078, 3009, 2941, 2872, 2803, + 2734, 2665, 2596, 2527, 2458, 2389, 2320, 2251, + 2182, 2112, 2043, 1974, 1905, 1836, 1767, 1697, + 1628, 1559, 1490, 1421, 1351, 1282, 1213, 1144, + 1074, 1005, 936, 867, 797, 728, 659, 589, + 520, 451, 381, 312, 243, 173, 104, 35 +}; + +const Word16 edct_table_128_fx[128] = /*Q16 */ +{ + 19483, 19480, 19474, 19466, 19454, 19439, 19422, 19401, + 19378, 19351, 19322, 19290, 19255, 19217, 19176, 19132, + 19086, 19036, 18984, 18928, 18870, 18809, 18746, 18679, + 18610, 18537, 18462, 18385, 18304, 18221, 18135, 18046, + 17954, 17860, 17763, 17664, 17561, 17457, 17349, 17239, + 17126, 17011, 16893, 16773, 16650, 16524, 16396, 16266, + 16133, 15998, 15860, 15720, 15578, 15433, 15286, 15137, + 14985, 14831, 14675, 14516, 14356, 14193, 14028, 13861, + 13692, 13521, 13348, 13173, 12996, 12816, 12635, 12452, + 12268, 12081, 11892, 11702, 11510, 11316, 11121, 10924, + 10725, 10524, 10322, 10119, 9914, 9707, 9499, 9290, + 9079, 8867, 8653, 8438, 8222, 8005, 7786, 7566, + 7345, 7123, 6900, 6676, 6451, 6225, 5998, 5770, + 5541, 5312, 5081, 4850, 4618, 4385, 4152, 3918, + 3684, 3449, 3213, 2977, 2741, 2504, 2266, 2029, + 1791, 1552, 1314, 1075, 837, 598, 359, 120 +}; + +const Word16 edct_table_160_fx[160] = /*Q16 */ +{ + 18426, 18425, 18421, 18416, 18409, 18400, 18389, 18377, + 18362, 18346, 18329, 18309, 18288, 18265, 18240, 18214, + 18185, 18155, 18123, 18090, 18055, 18018, 17979, 17938, + 17896, 17852, 17806, 17759, 17710, 17659, 17607, 17552, + 17497, 17439, 17380, 17319, 17256, 17192, 17126, 17058, + 16989, 16918, 16846, 16772, 16696, 16619, 16540, 16459, + 16377, 16293, 16208, 16121, 16033, 15943, 15851, 15758, + 15664, 15568, 15470, 15371, 15271, 15169, 15065, 14960, + 14854, 14746, 14637, 14527, 14415, 14301, 14186, 14070, + 13953, 13834, 13714, 13592, 13469, 13345, 13220, 13093, + 12965, 12836, 12706, 12574, 12441, 12307, 12172, 12036, + 11898, 11759, 11620, 11479, 11337, 11193, 11049, 10904, + 10758, 10610, 10462, 10312, 10162, 10011, 9858, 9705, + 9551, 9395, 9239, 9082, 8925, 8766, 8606, 8446, + 8285, 8123, 7960, 7797, 7632, 7467, 7301, 7135, + 6968, 6800, 6632, 6463, 6293, 6122, 5952, 5780, + 5608, 5435, 5262, 5089, 4915, 4740, 4565, 4389, + 4214, 4037, 3861, 3684, 3506, 3328, 3150, 2972, + 2793, 2614, 2435, 2256, 2076, 1896, 1716, 1536, + 1356, 1175, 994, 814, 633, 452, 271, 90 +}; + +const Word16 edct_table_40_fx[40] = /*Q16 */ +{ + 26049, 26009, 25928, 25808, 25648, 25448, 25210, 24932, + 24616, 24262, 23870, 23442, 22977, 22477, 21943, 21375, + 20773, 20140, 19475, 18781, 18058, 17306, 16528, 15725, + 14897, 14047, 13174, 12282, 11370, 10441, 9496, 8536, + 7563, 6578, 5584, 4580, 3570, 2554, 1534, 512 +}; + +const Word16 edct_table_20_fx[20] = /*Q16 */ +{ + 30939, 30749, 30368, 29801, 29049, 28119, 27015, 25745, + 24316, 22737, 21018, 19169, 17202, 15129, 12963, 10717, + 8405, 6041, 3639, 1216 +}; + + +const Word16 edct_table_64_fx[] =/*Q16 */ +{ + 23167, 23153, 23125, 23083, 23027, 22958, 22874, 22777, + 22666, 22542, 22403, 22252, 22087, 21908, 21717, 21512, + 21295, 21064, 20821, 20565, 20297, 20017, 19725, 19420, + 19105, 18777, 18438, 18089, 17728, 17356, 16975, 16582, + 16180, 15769, 15347, 14917, 14477, 14029, 13572, 13107, + 12634, 12154, 11666, 11171, 10670, 10162, 9648, 9128, + 8603, 8072, 7537, 6997, 6453, 5905, 5353, 4798, + 4241, 3681, 3118, 2554, 1988, 1421, 853, 284 +}; + + +const Word16 edct_table_200_fx[] =/*Q16 */ +{ + 17427, 17426, 17423, 17420, 17416, 17411, 17404, 17397, + 17388, 17378, 17368, 17356, 17343, 17329, 17314, 17298, + 17281, 17262, 17243, 17223, 17201, 17179, 17155, 17131, + 17105, 17079, 17051, 17022, 16992, 16961, 16929, 16896, + 16862, 16827, 16791, 16754, 16716, 16676, 16636, 16595, + 16553, 16509, 16465, 16420, 16373, 16326, 16278, 16228, + 16178, 16126, 16074, 16021, 15966, 15911, 15855, 15797, + 15739, 15680, 15620, 15558, 15496, 15433, 15369, 15304, + 15238, 15171, 15103, 15035, 14965, 14894, 14823, 14751, + 14677, 14603, 14528, 14452, 14375, 14297, 14218, 14139, + 14058, 13977, 13895, 13812, 13728, 13643, 13558, 13471, + 13384, 13296, 13207, 13117, 13027, 12935, 12843, 12750, + 12657, 12562, 12467, 12371, 12274, 12177, 12078, 11979, + 11880, 11779, 11678, 11576, 11473, 11370, 11266, 11161, + 11055, 10949, 10843, 10735, 10627, 10518, 10409, 10299, + 10188, 10076, 9964, 9852, 9739, 9625, 9510, 9395, + 9280, 9164, 9047, 8930, 8812, 8694, 8575, 8455, + 8335, 8215, 8094, 7973, 7851, 7728, 7605, 7482, + 7358, 7234, 7109, 6984, 6858, 6732, 6606, 6479, + 6352, 6224, 6096, 5967, 5839, 5710, 5580, 5450, + 5320, 5190, 5059, 4928, 4796, 4664, 4532, 4400, + 4268, 4135, 4002, 3868, 3735, 3601, 3467, 3333, + 3198, 3064, 2929, 2794, 2659, 2523, 2388, 2252, + 2116, 1980, 1844, 1708, 1572, 1436, 1299, 1163, + 1026, 889, 753, 616, 479, 342, 205, 68 +}; + +const Word16 edct_table_240_fx[] =/*Q16 */ +{ + 16650, 16650, 16648, 16646, 16643, 16640, 16635, 16630, + 16625, 16618, 16611, 16603, 16595, 16585, 16575, 16565, + 16553, 16541, 16528, 16515, 16501, 16486, 16470, 16454, + 16437, 16419, 16401, 16381, 16362, 16341, 16320, 16298, + 16275, 16252, 16228, 16203, 16178, 16151, 16125, 16097, + 16069, 16040, 16010, 15980, 15949, 15918, 15885, 15852, + 15819, 15784, 15749, 15713, 15677, 15640, 15602, 15564, + 15525, 15485, 15445, 15404, 15362, 15320, 15277, 15233, + 15189, 15144, 15098, 15052, 15005, 14957, 14909, 14860, + 14811, 14761, 14710, 14659, 14607, 14554, 14501, 14447, + 14392, 14337, 14282, 14225, 14168, 14111, 14053, 13994, + 13934, 13874, 13814, 13753, 13691, 13629, 13566, 13502, + 13438, 13374, 13309, 13243, 13176, 13109, 13042, 12974, + 12905, 12836, 12767, 12696, 12626, 12554, 12482, 12410, + 12337, 12264, 12190, 12115, 12040, 11965, 11889, 11812, + 11735, 11657, 11579, 11501, 11422, 11342, 11262, 11182, + 11101, 11019, 10937, 10855, 10772, 10689, 10605, 10521, + 10436, 10351, 10265, 10179, 10093, 10006, 9919, 9831, + 9743, 9654, 9565, 9476, 9386, 9296, 9205, 9114, + 9023, 8931, 8839, 8746, 8653, 8560, 8466, 8372, + 8278, 8183, 8088, 7993, 7897, 7801, 7704, 7608, + 7511, 7413, 7315, 7217, 7119, 7020, 6921, 6822, + 6723, 6623, 6523, 6422, 6321, 6221, 6119, 6018, + 5916, 5814, 5712, 5609, 5507, 5404, 5300, 5197, + 5093, 4990, 4885, 4781, 4677, 4572, 4467, 4362, + 4257, 4151, 4046, 3940, 3834, 3728, 3622, 3515, + 3408, 3302, 3195, 3088, 2981, 2873, 2766, 2658, + 2551, 2443, 2335, 2227, 2119, 2011, 1903, 1795, + 1686, 1578, 1469, 1361, 1252, 1143, 1035, 926, + 817, 708, 599, 490, 381, 272, 163, 54 +}; + +const Word16 edct_table_256_fx[] =/*Q16 */ +{ + 16384, 16383, 16382, 16380, 16378, 16375, 16371, 16367, + 16362, 16356, 16350, 16343, 16336, 16328, 16319, 16310, + 16300, 16290, 16278, 16267, 16254, 16242, 16228, 16214, + 16199, 16184, 16168, 16151, 16134, 16116, 16098, 16079, + 16059, 16039, 16018, 15997, 15975, 15952, 15929, 15905, + 15881, 15856, 15830, 15804, 15777, 15750, 15722, 15693, + 15664, 15634, 15604, 15573, 15541, 15509, 15476, 15443, + 15409, 15375, 15340, 15304, 15268, 15231, 15194, 15156, + 15117, 15078, 15039, 14999, 14958, 14917, 14875, 14832, + 14789, 14746, 14702, 14657, 14612, 14566, 14520, 14473, + 14426, 14378, 14329, 14280, 14231, 14181, 14130, 14079, + 14027, 13975, 13922, 13869, 13815, 13761, 13706, 13651, + 13595, 13538, 13481, 13424, 13366, 13308, 13249, 13190, + 13130, 13069, 13008, 12947, 12885, 12823, 12760, 12697, + 12633, 12569, 12504, 12439, 12373, 12307, 12240, 12173, + 12106, 12038, 11969, 11901, 11831, 11762, 11691, 11621, + 11550, 11478, 11406, 11334, 11261, 11188, 11114, 11040, + 10965, 10891, 10815, 10740, 10663, 10587, 10510, 10433, + 10355, 10277, 10198, 10119, 10040, 9961, 9881, 9800, + 9719, 9638, 9557, 9475, 9393, 9310, 9227, 9144, + 9061, 8977, 8892, 8808, 8723, 8638, 8552, 8466, + 8380, 8293, 8206, 8119, 8032, 7944, 7856, 7768, + 7679, 7590, 7501, 7411, 7321, 7231, 7141, 7050, + 6960, 6868, 6777, 6685, 6593, 6501, 6409, 6316, + 6223, 6130, 6037, 5943, 5850, 5756, 5661, 5567, + 5472, 5377, 5282, 5187, 5092, 4996, 4900, 4804, + 4708, 4611, 4515, 4418, 4321, 4224, 4127, 4030, + 3932, 3835, 3737, 3639, 3541, 3442, 3344, 3246, + 3147, 3048, 2949, 2851, 2751, 2652, 2553, 2454, + 2354, 2255, 2155, 2055, 1956, 1856, 1756, 1656, + 1556, 1456, 1356, 1255, 1155, 1055, 954, 854, + 754, 653, 553, 452, 352, 251, 151, 50 +}; + +const Word16 edct_table_400_fx[] =/*Q16 */ +{ + 29308, 29308, 29307, 29306, 29304, 29302, 29299, 29296, + 29292, 29288, 29284, 29279, 29273, 29267, 29261, 29254, + 29247, 29239, 29231, 29223, 29214, 29204, 29194, 29184, + 29173, 29162, 29150, 29138, 29125, 29112, 29099, 29085, + 29070, 29055, 29040, 29024, 29008, 28991, 28974, 28957, + 28939, 28920, 28901, 28882, 28862, 28842, 28821, 28800, + 28779, 28757, 28734, 28711, 28688, 28664, 28640, 28615, + 28590, 28565, 28539, 28512, 28485, 28458, 28430, 28402, + 28373, 28344, 28315, 28285, 28255, 28224, 28192, 28161, + 28129, 28096, 28063, 28030, 27996, 27962, 27927, 27892, + 27856, 27820, 27784, 27747, 27710, 27672, 27634, 27595, + 27556, 27517, 27477, 27437, 27396, 27355, 27313, 27272, + 27229, 27186, 27143, 27100, 27055, 27011, 26966, 26921, + 26875, 26829, 26782, 26736, 26688, 26640, 26592, 26544, + 26495, 26445, 26395, 26345, 26294, 26243, 26192, 26140, + 26088, 26035, 25982, 25929, 25875, 25821, 25766, 25711, + 25655, 25600, 25543, 25487, 25430, 25372, 25315, 25256, + 25198, 25139, 25079, 25020, 24960, 24899, 24838, 24777, + 24715, 24653, 24591, 24528, 24465, 24401, 24337, 24273, + 24208, 24143, 24078, 24012, 23946, 23879, 23812, 23745, + 23677, 23609, 23541, 23472, 23403, 23334, 23264, 23194, + 23123, 23052, 22981, 22909, 22837, 22765, 22692, 22619, + 22546, 22472, 22398, 22324, 22249, 22174, 22098, 22023, + 21947, 21870, 21793, 21716, 21639, 21561, 21483, 21404, + 21326, 21246, 21167, 21087, 21007, 20927, 20846, 20765, + 20684, 20602, 20520, 20437, 20355, 20272, 20189, 20105, + 20021, 19937, 19852, 19768, 19682, 19597, 19511, 19425, + 19339, 19252, 19165, 19078, 18991, 18903, 18815, 18726, + 18638, 18549, 18459, 18370, 18280, 18190, 18100, 18009, + 17918, 17827, 17735, 17643, 17551, 17459, 17366, 17274, + 17181, 17087, 16994, 16900, 16805, 16711, 16616, 16521, + 16426, 16331, 16235, 16139, 16043, 15946, 15850, 15753, + 15656, 15558, 15461, 15363, 15265, 15166, 15068, 14969, + 14870, 14770, 14671, 14571, 14471, 14371, 14271, 14170, + 14069, 13968, 13867, 13765, 13663, 13562, 13459, 13357, + 13254, 13152, 13049, 12946, 12842, 12739, 12635, 12531, + 12427, 12323, 12218, 12113, 12008, 11903, 11798, 11693, + 11587, 11481, 11375, 11269, 11163, 11056, 10950, 10843, + 10736, 10628, 10521, 10414, 10306, 10198, 10090, 9982, + 9874, 9765, 9657, 9548, 9439, 9330, 9221, 9112, + 9002, 8892, 8783, 8673, 8563, 8453, 8342, 8232, + 8122, 8011, 7900, 7789, 7678, 7567, 7456, 7344, + 7233, 7121, 7010, 6898, 6786, 6674, 6562, 6450, + 6337, 6225, 6112, 6000, 5887, 5774, 5661, 5548, + 5435, 5322, 5209, 5096, 4982, 4869, 4755, 4642, + 4528, 4414, 4300, 4187, 4073, 3959, 3845, 3730, + 3616, 3502, 3388, 3273, 3159, 3044, 2930, 2815, + 2701, 2586, 2472, 2357, 2242, 2127, 2013, 1898, + 1783, 1668, 1553, 1438, 1323, 1208, 1093, 978, + 863, 748, 633, 518, 403, 288, 173, 58 +}; + +const Word16 edct_table_320_16fx[320] =/*Q16 */ +{ + 7747, 7747, 7747, 7746, 7746, 7745, 7744, 7742, + 7741, 7739, 7737, 7735, 7733, 7730, 7728, 7725, + 7722, 7719, 7716, 7712, 7708, 7704, 7700, 7696, + 7692, 7687, 7682, 7677, 7672, 7666, 7661, 7655, + 7649, 7643, 7637, 7630, 7623, 7617, 7610, 7602, + 7595, 7587, 7580, 7572, 7563, 7555, 7547, 7538, + 7529, 7520, 7511, 7501, 7492, 7482, 7472, 7462, + 7451, 7441, 7430, 7419, 7408, 7397, 7386, 7374, + 7362, 7350, 7338, 7326, 7314, 7301, 7288, 7275, + 7262, 7249, 7235, 7221, 7208, 7194, 7179, 7165, + 7150, 7136, 7121, 7106, 7091, 7075, 7060, 7044, + 7028, 7012, 6995, 6979, 6962, 6946, 6929, 6912, + 6894, 6877, 6859, 6842, 6824, 6806, 6787, 6769, + 6750, 6732, 6713, 6694, 6674, 6655, 6635, 6616, + 6596, 6576, 6556, 6535, 6515, 6494, 6473, 6452, + 6431, 6410, 6388, 6367, 6345, 6323, 6301, 6279, + 6257, 6234, 6211, 6189, 6166, 6143, 6119, 6096, + 6072, 6049, 6025, 6001, 5977, 5953, 5928, 5904, + 5879, 5854, 5829, 5804, 5779, 5753, 5728, 5702, + 5676, 5650, 5624, 5598, 5572, 5545, 5518, 5492, + 5465, 5438, 5411, 5383, 5356, 5328, 5301, 5273, + 5245, 5217, 5189, 5160, 5132, 5104, 5075, 5046, + 5017, 4988, 4959, 4930, 4900, 4871, 4841, 4811, + 4781, 4751, 4721, 4691, 4661, 4630, 4600, 4569, + 4538, 4508, 4477, 4446, 4414, 4383, 4352, 4320, + 4288, 4257, 4225, 4193, 4161, 4129, 4097, 4064, + 4032, 3999, 3967, 3934, 3901, 3868, 3835, 3802, + 3769, 3736, 3702, 3669, 3635, 3602, 3568, 3534, + 3500, 3466, 3432, 3398, 3364, 3330, 3295, 3261, + 3226, 3192, 3157, 3122, 3087, 3052, 3017, 2982, + 2947, 2912, 2877, 2841, 2806, 2771, 2735, 2699, + 2664, 2628, 2592, 2556, 2520, 2484, 2448, 2412, + 2376, 2340, 2304, 2267, 2231, 2194, 2158, 2121, + 2085, 2048, 2011, 1975, 1938, 1901, 1864, 1827, + 1790, 1753, 1716, 1679, 1642, 1605, 1567, 1530, + 1493, 1455, 1418, 1381, 1343, 1306, 1268, 1231, + 1193, 1156, 1118, 1080, 1043, 1005, 967, 930, + 892, 854, 816, 778, 740, 703, 665, 627, + 589, 551, 513, 475, 437, 399, 361, 323, + 285, 247, 209, 171, 133, 95, 57, 19 +}; +const Word16 edct_table_128_16fx[128] = /*Q15 */ +{ + 9742, 9740, 9737, 9733, 9727, 9720, 9711, 9701, + 9689, 9676, 9661, 9645, 9627, 9608, 9588, 9566, + 9543, 9518, 9492, 9464, 9435, 9405, 9373, 9339, + 9305, 9269, 9231, 9192, 9152, 9110, 9067, 9023, + 8977, 8930, 8882, 8832, 8781, 8728, 8675, 8619, + 8563, 8505, 8447, 8386, 8325, 8262, 8198, 8133, + 8067, 7999, 7930, 7860, 7789, 7717, 7643, 7568, + 7492, 7415, 7337, 7258, 7178, 7097, 7014, 6931, + 6846, 6761, 6674, 6586, 6498, 6408, 6318, 6226, + 6134, 6040, 5946, 5851, 5755, 5658, 5560, 5462, + 5362, 5262, 5161, 5059, 4957, 4854, 4750, 4645, + 4539, 4433, 4327, 4219, 4111, 4002, 3893, 3783, + 3673, 3562, 3450, 3338, 3226, 3113, 2999, 2885, + 2771, 2656, 2541, 2425, 2309, 2193, 2076, 1959, + 1842, 1724, 1607, 1489, 1370, 1252, 1133, 1014, + 895, 776, 657, 538, 418, 299, 179, 60 +}; +const Word16 edct_table_160_16fx[160] =//Q15 +{ + 9213, 9212, 9211, 9208, 9204, 9200, 9195, 9188, + 9181, 9173, 9164, 9155, 9144, 9132, 9120, 9107, + 9093, 9078, 9062, 9045, 9027, 9009, 8989, 8969, + 8948, 8926, 8903, 8880, 8855, 8830, 8803, 8776, + 8748, 8719, 8690, 8659, 8628, 8596, 8563, 8529, + 8495, 8459, 8423, 8386, 8348, 8309, 8270, 8230, + 8188, 8147, 8104, 8061, 8016, 7971, 7926, 7879, + 7832, 7784, 7735, 7686, 7635, 7584, 7533, 7480, + 7427, 7373, 7319, 7263, 7207, 7151, 7093, 7035, + 6976, 6917, 6857, 6796, 6735, 6673, 6610, 6547, + 6483, 6418, 6353, 6287, 6221, 6154, 6086, 6018, + 5949, 5880, 5810, 5739, 5668, 5597, 5525, 5452, + 5379, 5305, 5231, 5156, 5081, 5005, 4929, 4852, + 4775, 4698, 4620, 4541, 4462, 4383, 4303, 4223, + 4142, 4061, 3980, 3898, 3816, 3734, 3651, 3568, + 3484, 3400, 3316, 3231, 3146, 3061, 2976, 2890, + 2804, 2718, 2631, 2544, 2457, 2370, 2282, 2195, + 2107, 2019, 1930, 1842, 1753, 1664, 1575, 1486, + 1397, 1307, 1218, 1128, 1038, 948, 858, 768, + 678, 588, 497, 407, 317, 226, 136, 45 +}; + + +/*----------------------------------------------------------------------------------* + * Mean ISF vector for active signal (only for AMR-WB IO mode) + *----------------------------------------------------------------------------------*/ + +const Word16 mean_isf_amr_wb_fx[M] =/*Qlog2(2.56)*/ +{ + 738, 1326, 2336, 3578, 4596, 5662, 6711, 7730, + 8750, 9753,10705, 11728, 12833, 13971,15043, 4037 +};/*1.28f Q1*/ + +/*----------------------------------------------------------------------------------* + * Mean ISF vector for SID frames (only in AMR-WB IO mode) + *----------------------------------------------------------------------------------*/ + +const Word16 mean_isf_noise_amr_wb_fx[M] =/*Qlog2(2.56)*/ +{ + 478, 1100, 2213, 3267, 4219, 5222, 6198, 7240, + 8229, 9153,10098, 11108, 12144, 13184,14165, 3803 +};/*14Q1*1.28*/ + +/* ISF codebook - common 1st stage, 1st split (only in AMR-WB IO mode) */ +/*------------------------------------------------------* + * Indirection for 1st stage 1st split of 46 bit cb. : + The transmitted_index = indirect_dico1[found_index]; + *------------------------------------------------------*/ +const Word16 Indirect_dico1[SIZE_BK1] = // Q0 +{ + 2, 6, 18, 22, 34, 35, 38, 50, + 66, 67, 70, 82, 98, 99, 102, 130, + 131, 134, 146, 150, 162, 178, 194, 198, + 210, 226, 230, 242, 0, 1, 3, 4, + 5, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 19, 20, 21, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 36, 37, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 51, + 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 68, 69, + 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 100, 101, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 132, + 133, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 147, 148, 149, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, + 177, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, + 195, 196, 197, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 227, 228, 229, + 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255 +}; + +/*----------------------------------------------------------------------------------* + * Initial LSF memory + *----------------------------------------------------------------------------------*/ + +const Word16 lsf_init_fx[16] = /*14Q1*1.28*/ +{ + 960, 1920, 2880, 3840, 4800, 5760, 6720, 7680, 8640, 9600, 10560, 11520, 12480, 13440, 14400, 15360 +}; + +/*----------------------------------------------------------------------------------* + * Gaussian codebook + *----------------------------------------------------------------------------------*/ + +/*table in Q12*/ +const Word16 gaus_dico_fx[190] = +{ + -399, -125, 523, -466, 305, -658, -809, 47, + -141, -171, -583, -259, 296, 1334, -285, -401, + -478, -418, 140, -540, 177, -1089, 130, -292, + 143, 492, -310, -862, -320, 388, 546, 84, + -1202, 107, 108, 340, 239, -130, 930, 342, + 153, -264, -763, -113, 387, -535, 83, -856, + -361, -421, 120, 396, -367, 640, 817, 222, + -1017, -82, -120, 890, 340, -384, 47, 339, + -505, -430, 161, 979, 890, -267, 104, 508, + -150, -194, 442, 193, 413, -24, 395, -43, + -217, 69, -398, 167, 116, -936, -95, 1466, + -435, 461, 862, -136, -94, 1311, -371, 68, + 134, -296, -156, -564, -48, -487, 647, 315, + 513, -101, -685, -318, -344, -644, -66, 851, + 414, -29, 509, 414, 502, 399, 557, 649, + -299, 750, 546, -756, -12, -365, 593, -707, + 394, -131, -375, -62, -914, -256, -424, 64, + 464, -1140, 280, 91, -83, -288, -550, 389, + 52, -1228, 6, -430, 74, 205, -478, -148, + -592, 282, -73, 1212, 42, 580, -334, 484, + -765, 443, 649, 271, -739, 375, 613, -460, + -208, 235, -120, -49, -311, 605, 875, 521, + 202, -506, -548, -1088, -43, -221, 673, -245, + -27, 469, 353, 53, 744, 275 +}; + +const Word16 gaus_dico_swb_fx[256] = +{ + /*Q15 */ + 709, 11759, -5333, -2701, 2397, -18, -4286, 2368, + -4576, -1584, -900, -940, 3676, 5441, -44, 2234, + -5698, 3082, -2671, 1666, -640, -3343, -1005, -1689, + 2048, 281, -3935, -3723, 5628, 385, -746, -3243, + -3332, -7228, -1748, -206, -5474, 2554, 2861, 3168, + 5039, 588, -508, -8167, 6549, -3433, 2187, -3666, + -5874, 2767, 8370, 1038, 6434, 6279, 625, 4030, + -1031, 1823, 9896, -1395, 2712, -1110, -742, 6142, + -4456, -10487, -144, -5104, 1968, -312, 6176, 2173, + 2334, -240, 2712, 7460, 2219, -3116, -56, 2770, + 5577, -1225, 770, 3557, 2246, 2322, 3077, 41, + 992, -4971, 441, -5039, 4913, 3811, 1142, -1283, + -6578, 4171, -1473, -3793, -5008, 1984, -1138, -1185, + 5646, 1014, -5118, 7141, 2656, -7241, -3538, 2337, + 7239, -504, -943, -10129, 702, -3811, -302, 2435, + 5090, 3744, 2335, -3904, -1401, -1662, -7256, 6484, + -6864, -5428, 1954, -7316, -1420, -1542, 5442, 311, + 3698, -1343, -2974, 8756, 324, -1903, 2580, 2635, + 4236, -1851, 3147, -772, -708, -3830, 2601, -1889, + -3444, -762, 3939, 3206, -7406, -837, -1167, -438, + 3707, -1015, -7472, 1849, 4277, 1459, -3047, -3760, + 740, -7134, -3753, -3092, 209, -12121, 1398, 2266, + 2505, -7974, -1121, -3481, -5644, 1329, 4532, 958, + 5311, -4258, -3195, -1769, -3055, 4399, -15, 10182, + 4503, 1912, -1574, 5054, -3163, 4881, -5364, 1925, + -1205, -6432, 2305, -8917, -1422, 514, -3001, 3928, + 2321, 360, -355, 1477, -3492, -4570, 1913, 2772, + -1380, -5161, 3812, 2614, 2204, -3135, 1244, -3066, + -4446, -6389, 4899, -5250, 1372, 1999, 1122, 5312, + 1310, -1189, -3310, 6403, 3818, 7734, 1620, -8533, + 706, 7498, -4472, 1272, -949, 3203, -4427, -2855, + 4419, 2283, 6410, 2584, -3397, -3382, -2976, -48, +}; + + +/*----------------------------------------------------------------------------------* + * CLDFB tables + *----------------------------------------------------------------------------------*/ + +const Word16 freqTable[2] = {20, 40}; // Q0 + +/* SNR: 109.44, PHASE: 3.500000000000000 */ + +/* SNR: 109.44, PHASE: 3.500000000000000 */ + +const Word32 CLDFB80_10_fx[100] = // q = 30 +{ + 3584, -2501, -707, 157, -1170, -1038, +-11, -1944, -1380, 1837, 14727, -9096, +-1691, -267, 3897, -4705, 419, 4651, +5275, -6639, -243747, -72521, -17071, 14831, +-23632, -38285, 18452, -20885, -6245, -281515, +-1070487, -153329, -20195, -4338, -209848, 194011, +24972, -5106, -34468, 1151402, -2164680, -832327, +376720, 1686598, 1844777, 1697325, 2356308, 3037447, +3248821, 1779296, -1533240, -1713947, 833816, 2751563, +2421812, 284255, -3540922, -6991555, -10248264, -14642952, +20031906, 26043234, 34417552, 45928496, 60756732, 78698864, +98151832, 116245496, 129823136, 136344976, 134601568, 122059576, +95304000, 53433792, -3371365, -74987256, -160511088, -258343120, +-366360320, -481533344, 599091264, 714631872, 823505600, 920768896, +1001735168, 1062249792, 1100603392, 1116473216, 1114030976, 1091249536, +1031959808, 939413760, 835792512, 727712064, 614651648, 499141824, +382288320, 266885408, 148867680, 44714176 +}; + + +/* SNR: 292.49, PHASE: 2.000000000000000 */ +const Word32 CLDFB80_16_fx[160] = // q = 30 +{ 592, -824, -251, 104, 64, -2, +-19, 2357, 3222, -18, -2, 75, +37, -82, -596, 808, 2242, -3035, +-755, 254, 126, -435, 107, -19350, +26445, -100, 482, -149, -91, 247, +2196, -3062, -344117, -158537, -67240, -47926, +-21715, 16231, 6227, 48320, 46494, 5449, +17932, -33783, -26258, -13467, -97911, -469416, +-1317171, -563405, -199456, -118497, -43264, 11679, +-61886, 64706, -248886, 55869, 3768, 67211, +64791, 39611, 345778, 1796799, -2314105, -1658358, +-815220, -115680, 761413, 1616443, 1931089, 1230669, +1712206, 1949652, 2418775, 2970521, 3179526, 3272216, +2739046, 1383591, -1186345, -2091284, -1594461, -20541, +1561481, 2685864, 2822045, 2243697, 1007270, -1321111, +-3774214, -5979353, -7970747, -10025660, -12576468, -15588057, +19092548, 22464968, 26489252, 31480652, 37681832, 45115060, +53868456, 63884792, 75139712, 87185504, 99355152, 110921760, +121117896, 129158840, 134480400, 136595408, 135565040, 130704096, +120827352, 105296200, 83827480, 56486836, 23319760, -15680647, +-60454808, -110775264, -166285472, -226570624, -291114656, -359358976, +-430528992, -503583200, 577127680, 650096768, 721690560, 790528896, +855345280, 915113088, 968648896, 1014713216, 1052549440, 1081848192, +1102232576, 1113723648, 1117499392, 1114694144, 1104247168, 1084392960, +1047294336, 993703296, 933123072, 868665920, 802559168, 734628416, +664562240, 593135168, 520952544, 448011680, 375024864, 302909728, +230463232, 156264608, 85568040, 29877076 +}; + + +/* SNR: 89.77, PHASE: 1.500000000000000 */ +const Word32 CLDFB80_20_fx[200] = // q = 30 +{ 1767, -5032, -88, -196, 26, 203, +-254, -755, -8, 5224, 7569, 3, +161, -101, 462, -85, -115, 1651, +-2694, 4755, 4946, -22236, -524, -658, +65, 469, -402, -1021, 719, -9362, +12273, -828, -312, 170, -1089, 201, +407, -7058, 12038, -3893, -327043, -222151, +-35479, -70712, -44739, -22286, -4950, 10391, +-6975, 55398, 27635, -7373, 3144, -22481, +-20586, -25326, -30793, 63871, -118589, -531211, +-1262671, -706692, -140675, -191397, -107627, -49946, +-20212, 30609, -145958, 302172, -516943, 139838, +-27637, 62099, 52144, 58317, 81974, -160536, +375017, 1963206, -2140127, -2009648, -925313, -652848, +-36271, 664400, 1339893, 1799274, 1945125, 831665, +1777056, 1828829, 2078398, 2585601, 2993432, 3154609, +3289693, 3034094, 2356141, 1146722, -993260, -1911082, +-2021484, -1182252, 157141, 1427332, 2466905, 2979250, +2692828, 2193128, 1283653, -616499, -2589952, -4472529, +-6187298, -7776617, -9380603, -11192438, -13438549, -15899665, +18725886, 21392202, 24336266, 27874318, 32044188, 37006492, +42749912, 49318540, 56747120, 64938688, 73960840, 83528888, +93302528, 102923904, 112017456, 120184144, 127010856, 132191136, +135478896, 136610544, 135791440, 132663544, 126439184, 116783968, +103416816, 86239880, 65299188, 40633116, 12229525, -19893306, +-55715672, -95119752, -137902624, -183892768, -232841840, -284483936, +-338536576, -394642624, -452297696, -510956224, 569805312, 628294144, +686151296, 742695360, 797209408, 849073920, 897777728, 942743488, +983299712, 1018874944, 1049145600, 1073975296, 1093176448, 1106582656, +1114420736, 1117424512, 1116238848, 1110577792, 1099271424, 1081958528, +1052270720, 1010577920, 964128448, 914037760, 862118336, 809238464, +755241024, 699830528, 643231744, 585949312, 528205504, 469954944, +411440896, 353300032, 295721536, 237791168, 178588864, 119772248, +66882256, 25081918 +}; + + +/* SNR: 89.29, PHASE: 0.833333333333333 */ +const Word32 CLDFB80_30_fx[300] = // q = 30 +{ -298, 3584, 1941, -855, -2501, -18, +108, -707, 31, 15, 157, 303, +46, -1170, 5206, 7621, -1038, 39, +476, -11, -29, -11, -1944, 58, +-3, -1380, -660, 1053, 1837, -2898, +-12992, 14727, 8112, -3476, -9096, -22, +265, -1691, 46, -32, -267, 593, +210, 3897, 9064, -12976, -4705, -177, +-1102, 419, 158, 60, 4651, -142, +-11, 5275, 2753, -4425, -6639, 19639, +-341195, -243747, -157895, -76329, -72521, -65719, +-49275, -17071, -21325, -4817, 14831, 27866, +-1522, -23632, 5019, -51348, -38285, -878, +59536, 18452, -11251, -36822, -20885, -26546, +-28596, -6245, -16613, -92408, -281515, -679650, +-1089989, -1070487, -687312, -252030, -153329, -178007, +-122647, -20195, -41359, -29533, -4338, 53191, +-112253, -209848, 617831, -803951, 194011, 106901, +-106999, 24972, 64775, 70954, -5106, 66493, +77725, -34468, 24005, 399486, 1151402, 2091330, +-1945866, -2164680, -1871142, -1133490, -832327, -560635, +-144700, 376720, 793103, 1258629, 1686598, 1843272, +1942367, 1844777, 286874, 1790714, 1697325, 1882734, +2048236, 2356308, 2670961, 2960784, 3037447, 3187788, +3282834, 3248821, 2972461, 2561469, 1779296, 779690, +-670109, -1533240, -2023874, -2068454, -1713947, -979306, +-79112, 833816, 1606493, 2311180, 2751563, 2948543, +2758276, 2421812, 2144318, 1669907, 284255, -925661, +-2240403, -3540922, -4767759, -5909822, -6991555, -8035796, +-9103931, -10248264, -11549851, -13052389, -14642952, -16334399, +18220558, 20031906, 21872604, 23814234, 26043234, 28516756, +31295850, 34417552, 37909524, 41736344, 45928496, 50500180, +55453996, 60756732, 66352956, 72392624, 78698864, 85151696, +91671536, 98151832, 104484224, 110553528, 116245496, 121424144, +125981624, 129823136, 132872256, 135069696, 136344976, 136548112, +135995744, 134601568, 131846392, 127706624, 122059576, 114818808, +105909512, 95304000, 83010216, 69049472, 53433792, 36159948, +17222988, -3371365, -25594396, -49478012, -74987256, -102019216, +-130543792, -160511088, -191851984, -224489536, -258343120, -293333280, +-329374368, -366360320, -404158112, -442603456, -481533344, -520813312, +560055680, 599091264, 637996480, 676579264, 714631872, 751940864, +788293056, 823505600, 857424640, 889902848, 920768896, 949826944, +976873792, 1001735168, 1024295104, 1044475456, 1062249792, 1077572608, +1090377088, 1100603392, 1108260608, 1113474048, 1116473216, 1117510400, +1116725248, 1114030976, 1109119488, 1101598848, 1091249536, 1078932736, +1059134272, 1031959808, 1003169408, 972174976, 939413760, 905472960, +870845632, 835792512, 800328576, 764335744, 727712064, 690466496, +652724672, 614651648, 576357376, 537862912, 499141824, 460206112, +421184800, 382288320, 343676096, 305305440, 266885408, 228014720, +188521408, 148867680, 110353960, 74971128, 44714176, 18455688 +}; + + +const Word32 CLDFB80_32_fx[320] = // q = 30 +{ + -1093, 2020, -1500, 75, -3259, -200, +2, 86, -307, -6, -372, -406, +686, 39, -1685, 4713, 6814, -1488, +47, 778, -40, -130, 24, -872, +225, -5, -116, -556, -123, -751, +1334, -5815, -17696, 8208, -6989, 239, +-11912, -669, 1, 206, -738, 0, +-579, -811, 1617, 569, 3828, 10109, +-14335, -4601, -628, -1935, 180, 186, +-69, 2086, -538, 14, 408, 1524, +585, 3601, -4502, 26170, -348871, -274413, +-191283, -101650, -55023, -71745, -57839, -39470, +-16489, -17154, -4618, 1542, 27531, -4838, +-24078, -6041, -61576, -45939, -4350, 52992, +-21467, -30551, -47624, -16879, -16327, -28526, +-30774, 45781, -47861, -103961, -321282, -704888, +-1065517, -1123685, -707166, -371532, -86309, -196314, +-147630, -95796, -26567, -30201, -12085, -23646, +30175, -133297, -186726, 644643, -823106, 165914, +127129, -77847, 76139, 59764, 84597, 13696, +44921, 72597, 82827, -180230, 163871, 385660, +1272552, 2097220, -1940583, -2216918, -1963534, -1312195, +-811283, -684818, -332127, 81208, 566324, 995811, +1374732, 1743252, 1885233, 1944746, 1791356, 230889, +1776037, 1693755, 1848743, 2021967, 2237951, 2554532, +2866858, 3010232, 3111818, 3235821, 3289505, 3179984, +2912034, 2438977, 1724392, 733947, -625866, -1486531, +-1958890, -2094028, -1863598, -1255187, -454123, 425746, +1212702, 1901282, 2517750, 2869908, 2908450, 2719155, +2384774, 2140992, 1717492, 398307, -731735, -1939480, +-3196994, -4359654, -5453402, -6492968, -7485701, -8462297, +-9485345, -10586349, -11872517, -13293064, -14799378, -16391634, +18159074, 19878216, 21572990, 23372214, 25384474, 27638258, +30127980, 32911950, 36012916, 39421380, 43135868, 47172528, +51552328, 56259572, 61272356, 66530936, 72196904, 78102488, +84136944, 90243120, 96340328, 102334376, 108124720, 113633800, +118743656, 123354504, 127384760, 130768192, 133428752, 135331936, +136411184, 136532064, 136012736, 134791376, 132367184, 128735088, +123803096, 117494272, 109734136, 100486232, 89749032, 77539936, +63866580, 48743548, 32160198, 14114131, -5387419, -26313940, +-48704924, -72531920, -97696000, -124178280, -151940320, -180929216, +-211078752, -242327632, -274608448, -307853568, -341987136, -376916512, +-412518528, -448658976, -485200704, -522047808, 558838528, 595432000, +631934592, 668176768, 703995904, 739213504, 773652800, 807151808, +839574912, 870801792, 900704320, 929133248, 955922048, 980906240, +1003949120, 1024962240, 1043881152, 1060686784, 1075342592, 1087794688, +1097989248, 1105913344, 1111637504, 1115325568, 1117191552, 1117410816, +1116024960, 1112890624, 1107711872, 1100166016, 1090143104, 1078585600, +1060024128, 1034545088, 1007817280, 979127552, 948772416, 917237312, +884973248, 852271488, 819225472, 785777536, 751820160, 717295872, +682246976, 646793792, 611070144, 575157504, 539069056, 502781984, +466300064, 429718016, 393203360, 356913536, 320878656, 284927936, +248740064, 212036736, 174863904, 137843808, 102263632, 69872776, +42173520, 17586372 +}; + + +/* SNR: 81.55, PHASE: 0.500000000000000 */ +const Word32 CLDFB80_40_fx[400] = // q = 30 +{ +-4459, -419, -3627, 1424, -337, -2077, +303, 18, 81, 159, -711, 9, +12, -289, -782, 599, -26, 261, +-439, 2799, 3758, -185, 230, -43, +682, -21, -75, -29, -55, -1950, +416, 56, 16, 233, 887, -479, +680, -2718, -569, -16448, -33103, -1653, +-16424, 6275, -1401, -7536, 1256, 82, +202, 378, -1703, -5, -27, -665, +-1194, 1295, -18, 118, -11445, 11396, +-15922, 16043, 175, 78, -1655, 102, +374, 132, 161, 4663, -995, -137, +-67, -970, -4393, 2058, -3082, 11739, +-993, 52507, -372470, -339964, -238020, -154668, +-91227, -39704, -68193, -63466, -52270, -36721, +-12972, -20431, -6925, 7426, -2361, 29241, +920, -11369, 13936, -42084, -90219, 4460, +-7456, 295, 60570, -36066, -9836, -23630, +-40550, -22839, -11573, -27317, -28142, -21799, +74247, -37443, -94761, -175261, -418504, -781461, +-995765, -1274142, -822204, -644197, -320592, -79371, +-211045, -170432, -131251, -90676, -8615, -38865, +-25806, 10490, -21115, 43834, -93771, -212052, +-80067, 687824, -841077, -28319, 196054, 89800, +-98757, 81413, 22561, 71310, 76947, -1234, +38817, 69237, 75947, 74313, -220677, 108139, +388007, 614410, 1602908, 2104013, -1945962, -2345233, +-2073811, -1788974, -1237042, -801097, -773094, -511061, +-205272, 126459, 548962, 854332, 1215260, 1516757, +1754373, 1867886, 1938796, 1938332, 1525725, 104199, +1696967, 1687208, 1745905, 1910502, 2033618, 2194668, +2472078, 2712787, 2937869, 3012596, 3095693, 3204093, +3274808, 3283756, 3148592, 2939051, 2641685, 2031332, +1549503, 597843, -490013, -1328870, -1713436, -2059616, +-2084878, -1903964, -1464478, -873102, -195311, 513856, +1135793, 1697317, 2228107, 2629045, 2909611, 2926214, +2785543, 2569874, 2293850, 2134485, 1852516, 752397, +-164140, -1082527, -2067571, -3082101, -4010647, -4913513, +-5770452, -6592737, -7388101, -8166445, -8966356, -9806266, +-10700961, -11733450, -12861255, -14030459, -15273330, -16566203, +17977196, 19420796, 20683474, 22109952, 23560036, 25167814, +26942868, 28845886, 30930688, 33206692, 35686848, 38368864, +41237952, 44313740, 47594052, 51099240, 54815852, 58726668, +62834600, 67067844, 71610536, 76321632, 81103048, 85964624, +90855304, 95735248, 100552568, 105257896, 109812680, 114164760, +118253480, 122029112, 125449296, 128468360, 131068744, 133194984, +134844544, 135983552, 136548480, 136476080, 136056288, 135290432, +133727152, 131405624, 128303264, 124356992, 119537688, 113797504, +107116320, 99479544, 90889712, 81356080, 70886368, 59482072, +47150368, 33884192, 19681098, 4546190, -11521655, -28482206, +-46395036, -65246120, -84945856, -105504280, -126897840, -149107856, +-172107808, -195862240, -220341504, -245510512, -271335616, -297782912, +-324814976, -352387008, -380449280, -408931776, -437767552, -466890752, +-496221408, -525752320, 555187200, 584450368, 613710272, 642840512, +671780800, 700438528, 728721728, 756541312, 783807872, 810444608, +836384512, 861566464, 885927424, 909395008, 931888896, 953321728, +973609216, 992677120, 1010468928, 1026949632, 1042084096, 1055868544, +1068286464, 1079312512, 1088916480, 1097072128, 1103772032, 1109042176, +1112948608, 1115590912, 1117080960, 1117511680, 1116923264, 1115280512, +1112471040, 1108330880, 1102691712, 1095455872, 1086748672, 1077537920, +1062688064, 1042243712, 1021432192, 999408768, 976158720, 951869952, +926793472, 901173760, 875200384, 848982208, 822546624, 795860992, +768868224, 741522368, 713812928, 685772416, 657463808, 628958848, +600314432, 571556608, 542686272, 513690592, 484561600, 455329056, +426060320, 396846880, 367771776, 338869952, 310096864, 281325184, +252379520, 223109248, 193485184, 163693120, 134192648, 105710896, +79151352, 55383672, 34725716, 14899882 +}; + + +/* SNR: 85.15, PHASE: 0.166666666666667 */ +const Word32 CLDFB80_60_fx[600] = // q = 30 +{ -11638, 1767, -122, 1628, -5032, -196, +161, -88, -3545, 137, -196, 21, +36, 26, 132, -1128, 203, 12, +-29, -254, -97, -286, -755, 689, +-55, -8, 215, -1583, 5224, -169, +-595, 7569, -1361, 190, 3, -67, +788, 161, -43, -20, -101, -32, +-10, 462, -3064, 321, -85, 24, +12, -115, 151, -968, 1651, -22, +-258, -2694, -28, 68, 4755, -32803, +-51846, 4946, -596, 6086, -22236, -388, +578, -524, -12974, 673, -658, 65, +91, 65, 314, -2699, 469, 12, +-69, -402, -518, -689, -1021, 1669, +-23, 719, 449, -2322, -9362, 9537, +-13566, 12273, 3730, -157, -828, 61, +-1978, -312, 206, 462, 170, 84, +41, -1089, 7330, -768, 201, -60, +-41, 407, -660, 3231, -7058, 161, +771, 12038, 198, -1291, -3893, 106546, +-387363, -327043, -319712, -213953, -222151, -158504, +-105319, -35479, -59682, -66733, -70712, -61610, +-55171, -44739, -31711, -9900, -22286, -19252, +-9917, -4950, 14172, 3111, 10391, 26566, +4086, -6975, -13332, -9892, 55398, -89244, +-120822, 27635, -30751, -9363, -7373, 2810, +49557, 3144, -15960, 10651, -22481, -39335, +-43081, -20586, -29742, -8098, -25326, -28071, +-28128, -30793, -15878, 36414, 63871, -51035, +-98423, -118589, -196780, -380753, -531211, -867079, +-924260, -1262671, -1211187, -909700, -706692, -590140, +-387713, -140675, -90592, -207147, -191397, -163116, +-139419, -107627, -77449, 8620, -49946, -36329, +-21446, -20212, 13295, -23389, 30609, 24765, +-73159, -145958, -228347, -136170, 302172, 622362, +-742756, -516943, 79533, 208728, 139838, 68780, +-69177, -27637, 72365, 6204, 62099, 78720, +81230, 52144, -15436, 27781, 58317, 71170, +74613, 81974, 55368, -164496, -160536, 180918, +362005, 375017, 795458, 1461875, 1963206, 2095155, +-1983049, -2140127, -2301661, -2078197, -2009648, -1702455, +-1336746, -925313, -815553, -803613, -652848, -461551, +-265137, -36271, 196856, 518314, 664400, 915382, +1166217, 1339893, 1585569, 1738976, 1799274, 1890535, +1933937, 1945125, 1923994, 1665861, 831665, 77564, +1488037, 1777056, 1688417, 1721975, 1828829, 1937199, +2017937, 2078398, 2252451, 2437196, 2585601, 2754365, +2909842, 2993432, 3016599, 3074266, 3154609, 3219375, +3265044, 3289693, 3277126, 3189837, 3034094, 2902602, +2709099, 2356141, 1938986, 1632226, 1146722, 418214, +-305018, -993260, -1403823, -1653092, -1911082, -2083225, +-2096449, -2021484, -1849083, -1552144, -1182252, -764155, +-310625, 157141, 627282, 1032601, 1427332, 1788414, +2142931, 2466905, 2666629, 2856089, 2979250, 2902477, +2810289, 2692828, 2523008, 2330296, 2193128, 2132550, +2001086, 1283653, 592123, -15236, -616499, -1241115, +-1897102, -2589952, -3235046, -3852858, -4472529, -5058432, +-5630304, -6187298, -6725206, -7257095, -7776617, -8297675, +-8829816, -9380603, -9952123, -10548511, -11192438, -11919065, +-12671172, -13438549, -14232061, -15062200, -15899665, -16802572, +17739412, 18725886, 19625418, 20458448, 21392202, 22346532, +23310144, 24336266, 25457146, 26639572, 27874318, 29180440, +30570936, 32044188, 33604364, 35257056, 37006492, 38833420, +40745368, 42749912, 44846596, 47032812, 49318540, 51704112, +54183000, 56747120, 59397304, 62137772, 64938688, 67793344, +70831448, 73960840, 77111768, 80298224, 83528888, 86778376, +90039080, 93302528, 96541856, 99755032, 102923904, 106027616, +109066040, 112017456, 114866184, 117592440, 120184144, 122624224, +124905544, 127010856, 128931552, 130666344, 132191136, 133505016, +134605360, 135478896, 136120576, 136498544, 136610544, 136390896, +136106368, 135791440, 135081680, 134039064, 132663544, 130943336, +128876128, 126439184, 123615464, 120403880, 116783968, 112750168, +108296544, 103416816, 98114136, 92387688, 86239880, 79676032, +72697184, 65299188, 57491652, 49271324, 40633116, 31582262, +22113356, 12229525, 1933215, -8779568, -19893306, -31396530, +-43338216, -55715672, -68469528, -81601800, -95119752, -109012544, +-123274624, -137902624, -152887216, -168220960, -183892768, -199892672, +-216212560, -232841840, -249770272, -266987040, -284483936, -302248800, +-320270592, -338536576, -357031680, -375740448, -394642624, -413715328, +-432939744, -452297696, -471766976, -491319872, -510956224, -530689568, +550314688, 569805312, 589331520, 608841280, 628294144, 647679424, +666974528, 686151296, 705180416, 724037376, 742695360, 761126400, +779305216, 797209408, 814818048, 832112192, 849073920, 865685504, +881927232, 897777728, 913213888, 928211072, 942743488, 956784768, +970310720, 983299712, 995732352, 1007593856, 1018874944, 1029566592, +1039655360, 1049145600, 1058033856, 1066312576, 1073975296, 1081012992, +1087415680, 1093176448, 1098289920, 1102755712, 1106582656, 1109785856, +1112388096, 1114420736, 1115916544, 1116907776, 1117424512, 1117484800, +1117091968, 1116238848, 1114897920, 1113026048, 1110577792, 1107500160, +1103739520, 1099271424, 1094099328, 1088271360, 1081958528, 1076012800, +1066112832, 1052270720, 1038832960, 1024980800, 1010577920, 995613248, +980113280, 964128448, 947737280, 931017344, 914037760, 896864896, +879548544, 862118336, 844591360, 826968768, 809238464, 791384896, +773390848, 755241024, 736928896, 718455680, 699830528, 681070912, +662197568, 643231744, 624193216, 605096768, 585949312, 566752640, +547506176, 528205504, 508844544, 489425088, 469954944, 450450944, +430937408, 411440896, 391989376, 372605984, 353300032, 334067616, +314888448, 295721536, 276517248, 257224080, 237791168, 218193616, +198443888, 178588864, 158737840, 139063920, 119772248, 101121944, +83411368, 66882256, 51724928, 38009000, 25081918, 11097560 +}; + + +/* 5ms delay prototype */ +const Word32 LDQMF_10_fx[] = // q = 30 +{ + 136778, 68195, -70890, -226890, -352352, -420072, +-436802, -444543, -506661, -672815, -980068, -1367880, +-1747442, -2041059, -2171766, -2084001, -1756846, -1205000, +-470033, 391658, -1352314, -2311012, -3225024, -4068760, +-4825637, -5483931, -6033975, -6472204, -6808585, -7075060, +-7325812, -7636335, -8074047, -8676456, -9424478, -10219283, +-10865228, -11073811, -10475044, -8652076, 5180201, -339904, +-8224782, -18673422, -31726070, -47229416, -64809980, -83846512, +-103451368, -122477480, -139540384, -153063904, -161342016, -162639632, +-155309920, -137908720, -109304704, -68777832, -16099735, 48410956, +-123867744, -208812656, -301278944, -398795360, -498505440, -597277184, +-691834048, -778907776, -855407232, -918606592, -966152640, -996390080, +-1008509056, -1002265344, -978191040, -937540800, -882190336, -814525888, +-737309056, -653527872, 566225280, 478344672, 392910464, 312395584, +238918544, 174094816, 118926376, 73749168, 38239292, 11438051, +-6809585, -17473586, -23179288, -24893300, -23497172, -19904868, +-15070633, -9938406, -5364481, -2000462 +}; + + +const Word32 LDQMF_16_fx[] = // q = 30 +{ +135840, 119105, 61025, -23300, -120396, -217572, +-303688, -369787, -411986, -431913, -436960, -439365, +-455121, -500073, -585815, -716339, -910646, -1146410, +-1392576, -1634245, -1852285, -2026746, -2138911, -2173116, +-2118583, -1970211, -1728614, -1399460, -992562, -520340, +3268, 562389, -1169900, -1774888, -2369781, -2945925, +-3497147, -4018445, -4506032, -4956920, -5368526, -5738270, +-6064626, -6347064, -6587229, -6790047, -6964112, -7121373, +-7276728, -7449880, -7659373, -7920485, -8244154, -8633965, +-9083566, -9574508, -10074442, -10534940, -10894573, -11076715, +-10992408, -10543848, -9627864, -8139161, 5976364, 3037887, +-760649, -5491840, -11209240, -17943616, -25700144, -34454400, +-44150032, -54695840, -65964980, -77789648, -89960896, -102229872, +-114308392, -125871952, -136561440, -145990880, -153753088, -159424128, +-162577504, -162794960, -159676832, -152853360, -141995744, -126825840, +-107126032, -82747424, -53617472, -19744928, 18775524, 61761592, +-108947912, -159965984, -214394832, -271716064, -331337920, -392605120, +-454808224, -517194272, -578978880, -639359104, -697528768, -752693376, +-804086912, -850989824, -892747136, -928791232, -958536704, -981563328, +-997684800, -1006698432, -1008520640, -1003187328, -990852800, -971782976, +-946346880, -915003328, -878295040, -836832960, -791284544, -742359104, +-690793664, -637338560, 582754624, 527645440, 472906400, 419190784, +367113152, 317241312, 270082016, 226065808, 185534960, 148735312, +115810224, 86800312, 61646000, 40190228, 22181636, 7245162, +-4169367, -12156084, -17964338, -21866804, -24101958, -24886370, +-24433336, -22962478, -20701850, -17885954, -14749119, -11519968, +-8412224, -5619924, -3298610, -1524161 +}; + + +const Word32 LDQMF_20_fx[] = // q = 30 +{ +132095, 130054, 94118, 37811, -32619, -110471, +-188997, -262715, -325880, -375095, -408842, -427924, +-435582, -437285, -440062, -452482, -482692, -537287, +-620381, -731564, -887814, -1074239, -1268925, -1466394, +-1657422, -1832122, -1980124, -2091724, -2157946, -2171782, +-2128230, -2024638, -1860817, -1638685, -1362085, -1036418, +-668022, -263994, 167952, 619489, -1109006, -1594302, +-2074063, -2544892, -3002259, -3443307, -3865450, -4266665, +-4645248, -4999899, -5329217, -5631869, -5906959, -6153951, +-6372928, -6565001, -6732690, -6880012, -7012401, -7136777, +-7260809, -7394870, -7549043, -7731644, -7949919, -8208793, +-8510223, -8852171, -9227619, -9624792, -10025312, -10404401, +-10731825, -10971712, -11081824, -11015548, -10722771, -10150872, +-9246198, -7954792, 6226194, 4006049, 1251053, -2079213, +-6018496, -10592059, -15815707, -21694928, -28223572, -35382820, +-43140436, -51449560, -60249600, -69462792, -78994976, -88734976, +-98555328, -108312432, -117847120, -126986608, -135542896, -143318016, +-150106768, -155693424, -159859744, -162387488, -163062224, -161676800, +-158034768, -151954128, -143271408, -131843832, -117553208, -100308496, +-80048728, -56744644, -30400730, -1056328, 31212950, 66296312, +-104051416, -144280880, -186784688, -231313168, -277585056, -325290400, +-374093504, -423635840, -473540064, -523412928, -572850304, -621440576, +-668770368, -714429248, -758014656, -799138176, -837430848, -872549376, +-904183040, -932063424, -955866112, -975368256, -990502784, -1001141248, +-1007204608, -1008661952, -1005531712, -997881088, -985824192, -969518976, +-949164608, -924995776, -897283008, -866326016, -832450624, -796003264, +-757347840, -716859456, -674920448, -631918336, 588261568, 544170240, +500187776, 456655456, 413899520, 372230592, 331939808, 293293792, +256529792, 221851008, 189423392, 159373024, 131783696, 106697088, +84113256, 63991576, 46252108, 30775584, 17400960, 5897692, +-3242832, -10003035, -15315395, -19324048, -22161874, -23947232, +-24790774, -24801182, -24088950, -22768174, -20956786, -18774960, +-16343248, -13780261, -11200397, -8711802, -6413878, -4393110, +-2713518, -1364255 +}; + + +const Word32 LDQMF_30_fx[] = // q = 30 +{ + 121571, 136778, 125655, 101704, 68195, 26875, +-20212, -70890, -123705, -176138, -226890, -274106, +-316253, -352352, -381787, -404297, -420072, -429892, +-434876, -436802, -437431, -439163, -444543, -456066, +-476087, -506661, -549091, -604538, -672815, -752814, +-858037, -980068, -1106184, -1235998, -1367880, -1498945, +-1626464, -1747442, -1858910, -1957741, -2041059, -2106142, +-2150372, -2171766, -2168618, -2139643, -2084001, -2001495, +-1892255, -1756846, -1596236, -1411745, -1205000, -977797, +-732072, -470033, -193708, 94399, 391658, 694989, +-1028102, -1352314, -1674661, -1994503, -2311012, -2622127, +-2927093, -3225024, -3515027, -3796480, -4068760, -4331384, +-4583784, -4825637, -5056603, -5276176, -5483931, -5679645, +-5863044, -6033975, -6192384, -6338348, -6472204, -6594554, +-6706284, -6808585, -6902959, -6991107, -7075060, -7157331, +-7239857, -7325812, -7418951, -7521577, -7636335, -7765375, +-7910813, -8074047, -8256089, -8457071, -8676456, -8912695, +-9163169, -9424478, -9691922, -9959316, -10219283, -10463412, +-10682245, -10865228, -11000298, -11074417, -11073811, -10983892, +-10789539, -10475044, -10024687, -9422374, -8652076, -7698111, +6547450, 5180201, 3585185, 1749124, -339904, -2692689, +-5318487, -8224782, -11417230, -14899579, -18673422, -22738288, +-27091010, -31726070, -36635292, -41807760, -47229416, -52884028, +-58751904, -64809980, -71032152, -77388632, -83846512, -90369776, +-96918936, -103451368, -109921528, -116280640, -122477480, -128458624, +-134165992, -139540384, -144523760, -149052944, -153063904, -156492352, +-159273296, -161342016, -162634320, -163087360, -162639632, -161231616, +-158806368, -155309920, -150691824, -144905568, -137908720, -129663752, +-120138088, -109304704, -97142448, -83636416, -68777832, -52564528, +-35001268, -16099735, 4121304, 25635912, 48410956, 72407360, +-97584200, -123867744, -151213264, -179552912, -208812656, -238912112, +-269764832, -301278944, -333357440, -365898336, -398795360, -431938528, +-465214080, -498505440, -531693760, -564658432, -597277184, -629427584, +-660987072, -691834048, -721848128, -750911168, -778907776, -805726528, +-831260224, -855407232, -878071616, -899164800, -918606592, -936328128, +-952202112, -966152640, -978197888, -988289792, -996390080, -1002471040, +-1006513664, -1008509056, -1008457600, -1006369728, -1002265344, -996173888, +-988133504, -978191040, -966401920, -952828672, -937540800, -920615360, +-902135488, -882190336, -860873664, -838284672, -814525888, -789704064, +-763927872, -737309056, -709960000, -681994880, -653527872, -624673024, +595607552, 566225280, 536822976, 507495872, 478344672, 449466912, +420958208, 392910464, 365412224, 338547584, 312395584, 287029856, +262517344, 238918544, 216286160, 194665808, 174094816, 154602160, +136208672, 118926376, 102759984, 87704592, 73749168, 60872400, +49048000, 38239292, 28404982, 19492542, 11438051, 4150853, +-1959299, -6809585, -10983833, -14524688, -17473586, -19875174, +-21764768, -23179288, -24150308, -24711158, -24893300, -24729546, +-24252922, -23497172, -22497182, -21287720, -19904868, -18383770, +-16760795, -15070633, -13348427, -11626766, -9938406, -8313092, +-6779951, -5364481, -4088471, -2966834, -2000462, -1134160 +}; + + +const Word32 LDQMF_32_fx[] = // q = 30 +{ +119697, 137151, 128520, 107723, 78400, 41836, +-442, -46740, -95597, -145201, -193804, -240598, +-283800, -322316, -355411, -382593, -403699, -418862, +-428699, -434120, -436480, -437237, -438149, -441391, +-449045, -463039, -485346, -517326, -560092, -614348, +-679872, -755580, -854379, -968457, -1086190, -1207329, +-1330799, -1454135, -1575271, -1691704, -1801098, -1900763, +-1988263, -2061316, -2117677, -2155275, -2172543, -2168111, +-2140952, -2090356, -2016155, -1918414, -1797519, -1654212, +-1489464, -1304576, -1100939, -880095, -643755, -393648, +-131597, 140303, 419876, 704520, -1017921, -1322020, +-1624457, -1924758, -2222508, -2515835, -2804014, -3086295, +-3361992, -3630425, -3891163, -4143616, -4387487, -4622276, +-4847761, -5063642, -5269495, -5464963, -5649876, -5823971, +-5987172, -6139337, -6280537, -6410931, -6530943, -6641149, +-6742439, -6835855, -6922708, -7004445, -7082802, -7159902, +-7237256, -7317480, -7403834, -7498178, -7602711, -7719257, +-7849652, -7995245, -8157013, -8335469, -8530447, -8741283, +-8966383, -9203373, -9449370, -9700315, -9951033, -10195449, +-10426707, -10637019, -10818085, -10960053, -11052529, -11084311, +-11043675, -10918394, -10695736, -10362793, -9906464, -9313511, +-8570674, -7665161, 6586647, 5317833, 3849979, 2171972, +273875, -1853535, -4218327, -6827112, -9685347, -12796811, +-16163952, -19787344, -23665996, -27796800, -32174812, -36793016, +-41642268, -46710992, -51985904, -57451192, -63088408, -68876552, +-74792144, -80808992, -86898528, -93029584, -99168576, -105279432, +-111323816, -117260928, -123048216, -128641440, -133992400, -139052160, +-143773440, -148104208, -151991888, -155383600, -158225792, -160465072, +-162048320, -162923104, -163038096, -162343200, -160789920, -158332016, +-154925376, -150528912, -145104496, -138617152, -131035664, -122332640, +-112485024, -101474136, -89286032, -75911456, -61346324, -45591780, +-28653996, -10544916, 8718141, 29112362, 50609392, 73176464, +-96780680, -121357544, -146873168, -173272304, -200494976, -228475968, +-257145792, -286430368, -316251616, -346527296, -377172096, -408096800, +-439210240, -470417824, -501623072, -532727936, -563632832, -594237184, +-624439872, -654140096, -683237312, -711632192, -739226496, -765924288, +-791632320, -816260416, -839722176, -861935360, -882823040, -902313408, +-920341952, -936853184, -951735680, -964924736, -976443584, -986251200, +-994314944, -1000609792, -1005117952, -1007828864, -1008739392, -1007854080, +-1005185024, -1000751488, -994580096, -986704064, -977163328, -966004416, +-953279168, -939044864, -923364608, -906306368, -887942656, -868349888, +-847608448, -825801792, -803016512, -779341120, -754867072, -729686080, +-703891520, -677576896, -650837184, -623766656, 596524928, 568982144, +541414592, 513899552, 486520032, 459356832, 432489472, 405994688, +379947008, 354417408, 329473600, 305178976, 281592608, 258768368, +236754960, 215594992, 195325728, 175977920, 157575920, 140137536, +123674336, 108191456, 93687496, 80154992, 67580128, 55943780, +45219876, 35377480, 26377892, 18179138, 10724362, 3937154, +-1793747, -6383129, -10375463, -13802420, -16701194, -19108980, +-21056298, -22573612, -23687536, -24425978, -24814642, -24880884, +-24650790, -24152456, -23413234, -22462376, -21328340, -20040900, +-18629038, -17122794, -15550818, -13942058, -12323783, -10723672, +-9166937, -7678115, -6278687, -4990172, -3829056, -2807491, +-1918388, -1103400 +}; + + +const Word32 LDQMF_40_fx[] = // q = 30 +{ +113206, 137254, 134425, 123146, 105211, 81666, +53560, 21302, -14069, -51499, -90644, -130324, +-169687, -208133, -245093, -279677, -311296, -339564, +-364227, -384972, -401866, -414904, -424383, -430758, +-434462, -436342, -437086, -437526, -438798, -441921, +-448029, -458055, -473038, -493889, -521096, -555299, +-596905, -645667, -701531, -764070, -843495, -933719, +-1026835, -1122239, -1219597, -1318430, -1417239, -1515133, +-1610824, -1702996, -1790556, -1872015, -1946188, -2011806, +-2067738, -2112859, -2146050, -2166539, -2173557, -2166437, +-2144725, -2108000, -2056211, -1989295, -1907357, -1810628, +-1699503, -1574446, -1436054, -1285028, -1122103, -948052, +-763730, -570121, -367947, -158284, 57837, 279329, +505114, 733496, -987128, -1230885, -1473412, -1714779, +-1954662, -2192913, -2428356, -2660607, -2889345, -3114179, +-3334742, -3550687, -3761781, -3967793, -4168400, -4363503, +-4552806, -4736194, -4913551, -5084693, -5249383, -5407420, +-5558753, -5703241, -5840790, -5971350, -6094838, -6211308, +-6320774, -6423390, -6519396, -6609079, -6692852, -6771222, +-6844809, -6914280, -6980363, -7043921, -7105964, -7167616, +-7229469, -7292854, -7359781, -7431209, -7508135, -7591745, +-7682927, -7782628, -7891680, -8010673, -8140087, -8280182, +-8430924, -8592083, -8763179, -8943293, -9131195, -9325472, +-9524332, -9725493, -9926142, -10123188, -10313198, -10492333, +-10656603, -10801577, -10922158, -11013175, -11068951, -11083709, +-11051345, -10965628, -10820070, -10607987, -10322919, -9958035, +-9506509, -8961670, -8316717, -7565184, 6702942, 5718827, +4609517, 3369113, 1992225, 473872, -1190731, -3005819, +-4975066, -7101637, -9388180, -11836610, -14448347, -17224060, +-20163764, -23266722, -26531342, -29955288, -33535422, -37267720, +-41147260, -45168140, -49323552, -53606284, -58007508, -62517548, +-67125584, -71820016, -76587808, -81415152, -86287160, -91187832, +-96100320, -101006496, -105887512, -110723520, -115493552, -120176040, +-124748632, -129188288, -133469680, -137567456, -141458352, -145116032, +-148513808, -151624560, -154421360, -156876704, -158963328, -160653808, +-161921024, -162738128, -163078752, -162916896, -162227280, -160985216, +-159167008, -156749920, -153712208, -150033328, -145694224, -140676912, +-134964928, -128543672, -121399776, -113521832, -104900488, -95527920, +-85398544, -74508560, -62856444, -50442808, -37270156, -23343566, +-8670189, 6740502, 22876916, 39724980, 57268860, 75490816, +-94376496, -113883272, -134001320, -154702832, -175958544, -197737504, +-220006032, -242729312, -265870144, -289389664, -313247648, -337401888, +-361809024, -386424256, -411201216, -436093120, -461051360, -486026816, +-510969600, -535829088, -560554240, -585093440, -609395008, -633407296, +-657078592, -680357568, -703193408, -725535424, -747334272, -768541184, +-789108672, -808990656, -828142272, -846520832, -864084928, -880795968, +-896616960, -911514304, -925457216, -938417536, -950324992, -961141376, +-970896128, -979566976, -987136576, -993587776, -998908288, -1003088128, +-1006120192, -1008000960, -1008729280, -1008307648, -1006741504, -1004039168, +-1000212096, -995274560, -989243584, -982139008, -973983296, -964801472, +-954620608, -943470016, -931381312, -918388608, -904527488, -889835648, +-874352128, -858117568, -841174400, -823565824, -805336512, -786531904, +-767198144, -747382720, -727132672, -706495808, -685520512, -664254656, +-642746560, -621047616, 599273536, 577248256, 555196416, 533150944, +511154144, 489249568, 467478368, 445881248, 424498464, 403368608, +382529632, 362017792, 341868224, 322114240, 302787552, 283917824, +265532592, 247657504, 230315568, 213527440, 197311648, 181683920, +166657488, 152242496, 138447232, 125276624, 112733328, 100817520, +89526080, 78854768, 68795096, 59337532, 50469688, 42175888, +34440516, 27241264, 20558124, 14361678, 8619497, 3303077, +-1288525, -5070930, -8454926, -11459781, -14115485, -16433949, +-18436136, -20138626, -21555150, -22702724, -23593500, -24242222, +-24662498, -24867088, -24870766, -24686354, -24328404, -23811232, +-23148884, -22356736, -21449164, -20441404, -19348716, -18185774, +-16968062, -15710186, -14426756, -13132428, -11840736, -10565599, +-9320040, -8115962, -6965903, -5879984, -4867950, -3939393, +-3097321, -2346408, -1680052, -1007771 +}; + + +const Word32 LDQMF_60_fx[] = // q = 30 +{ + 102336, 132095, 137435, 135349, 130054, 120487, +108540, 94118, 77297, 58570, 37811, 15643, +-7974, -32619, -57897, -84046, -110471, -136942, +-163210, -188997, -214438, -239091, -262715, -285164, +-306247, -325880, -343923, -360378, -375095, -388054, +-399325, -408842, -416725, -423037, -427924, -431547, +-434000, -435582, -436522, -437005, -437285, -437644, +-438481, -440062, -442703, -446767, -452482, -460182, +-470154, -482692, -497967, -516093, -537287, -561715, +-589463, -620381, -654511, -691825, -731564, -775911, +-829205, -887814, -949148, -1011179, -1074239, -1138341, +-1203246, -1268925, -1334921, -1400802, -1466394, -1531260, +-1595082, -1657422, -1717943, -1776350, -1832122, -1884921, +-1934396, -1980124, -2021834, -2059138, -2091724, -2119241, +-2141378, -2157946, -2168655, -2173353, -2171782, -2163852, +-2149388, -2128230, -2100421, -2065896, -2024638, -1976676, +-1922048, -1860817, -1793099, -1719008, -1638685, -1552286, +-1460012, -1362085, -1258676, -1150050, -1036418, -918024, +-795131, -668022, -536993, -402188, -263994, -122679, +21420, 167952, 316690, 467104, 619489, 773430, +-945239, -1109006, -1271451, -1433050, -1594302, -1754861, +-1914784, -2074063, -2232363, -2389328, -2544892, -2698989, +-2851488, -3002259, -3151251, -3298296, -3443307, -3586211, +-3726943, -3865450, -4001599, -4135335, -4266665, -4395461, +-4521664, -4645248, -4766175, -4884420, -4999899, -5112604, +-5222404, -5329217, -5433113, -5533999, -5631869, -5726641, +-5818340, -5906959, -5992421, -6074745, -6153951, -6230036, +-6303010, -6372928, -6439843, -6503845, -6565001, -6623435, +-6679269, -6732690, -6783804, -6832855, -6880012, -6925506, +-6969547, -7012401, -7054336, -7095680, -7136777, -7177903, +-7219120, -7260809, -7303731, -7348340, -7394870, -7443617, +-7494881, -7549043, -7606393, -7667166, -7731644, -7800142, +-7872827, -7949919, -8031501, -8117779, -8208793, -8304570, +-8405066, -8510223, -8619935, -8734017, -8852171, -8974106, +-9099397, -9227619, -9358364, -9490965, -9624792, -9759051, +-9892867, -10025312, -10155439, -10282162, -10404401, -10520844, +-10630426, -10731825, -10823502, -10903968, -10971712, -11025073, +-11062346, -11081824, -11081759, -11060277, -11015548, -10945697, +-10848751, -10722771, -10565739, -10375810, -10150872, -9888970, +-9588053, -9246198, -8861297, -8431401, -7954792, -7429283, +6854949, 6226194, 5542800, 4803353, 4006049, 3149248, +2231398, 1251053, 206700, -902968, -2079213, -3323232, +-4636016, -6018496, -7471561, -8995894, -10592059, -12260527, +-14001671, -15815707, -17702624, -19662438, -21694928, -23799650, +-25976100, -28223572, -30541232, -32928052, -35382820, -37904240, +-40490688, -43140436, -45851544, -48621904, -51449560, -54331840, +-57266136, -60249600, -63279032, -66351236, -69462792, -72609920, +-75788648, -78994976, -82224448, -85472704, -88734976, -92006232, +-95281520, -98555328, -101822272, -105076584, -108312432, -111523680, +-114704032, -117847120, -120946376, -123995120, -126986608, -129913560, +-132768248, -135542896, -138230992, -140825344, -143318016, -145701104, +-147966688, -150106768, -152113232, -153978192, -155693424, -157250816, +-158642336, -159859744, -160895152, -161740352, -162387488, -162828688, +-163056176, -163062224, -162839296, -162379936, -161676800, -160722816, +-159511024, -158034768, -156287280, -154262480, -151954128, -149356496, +-146464032, -143271408, -139773568, -135965808, -131843832, -127403488, +-122641048, -117553208, -112136840, -106389392, -100308496, -93892368, +-87139520, -80048728, -72619504, -64851416, -56744644, -48299972, +-39518100, -30400730, -20949652, -11167261, -1056328, 9379870, +20137698, 31212950, 42601076, 54297248, 66296312, 78593112, +-91185600, -104051416, -117194704, -130607064, -144280880, -158207776, +-172378736, -186784688, -201415824, -216262032, -231313168, -246558128, +-261985952, -277585056, -293343616, -309249600, -325290400, -341453376, +-357725472, -374093504, -390543744, -407062432, -423635840, -440249504, +-456889088, -473540064, -490187584, -506816896, -523412928, -539960640, +-556444864, -572850304, -589161600, -605363456, -621440576, -637377600, +-653159232, -668770368, -684195712, -699420352, -714429248, -729207616, +-743740992, -758014656, -772014784, -785727168, -799138176, -812234496, +-825002880, -837430848, -849505856, -861215872, -872549376, -883495616, +-894043456, -904183040, -913905152, -923200640, -932063424, -940477696, +-948417216, -955866112, -962841216, -969345024, -975368256, -980905536, +-985952256, -990502784, -994553344, -998100544, -1001141248, -1003673344, +-1005694720, -1007204608, -1008202304, -1008687808, -1008661952, -1008125952, +-1007081664, -1005531712, -1003479040, -1000927424, -997881088, -994344832, +-990323904, -985824192, -980852096, -975414528, -969518976, -963173312, +-956385600, -949164608, -941519424, -933459776, -924995776, -916137728, +-906896448, -897283008, -887308928, -876985984, -866326016, -855341824, +-844045696, -832450624, -820569472, -808415936, -796003264, -783345088, +-770455104, -757347840, -744036608, -730535808, -716859456, -703022272, +-689038016, -674920448, -660685696, -646345600, -631918336, -617424704, +602927232, 588261568, 573575488, 558872576, 544170240, 529480224, +514815008, 500187776, 485610624, 471095904, 456655456, 442301536, +428045760, 413899520, 399874240, 385981024, 372230592, 358633472, +345199872, 331939808, 318862624, 305977728, 293293792, 280819232, +268562016, 256529792, 244729552, 233167968, 221851008, 210784624, +199973840, 189423392, 179137440, 169119664, 159373024, 149900064, +140703152, 131783696, 123142424, 114780232, 106697088, 98892400, +91364808, 84113256, 77135992, 70429688, 63991576, 57819020, +51907328, 46252108, 40848248, 35691672, 30775584, 26091894, +21637068, 17400960, 13374445, 9548629, 5897692, 2475272, +-592184, -3242832, -5659970, -7917455, -10003035, -11926348, +-13696880, -15315395, -16789184, -18123694, -19324048, -20394110, +-21338122, -22161874, -22868630, -23462238, -23947232, -24327810, +-24607834, -24790774, -24881324, -24883598, -24801182, -24638338, +-24399474, -24088950, -23710470, -23268668, -22768174, -22213084, +-21607820, -20956786, -20264828, -19536176, -18774960, -17986262, +-17174228, -16343248, -15497611, -14641749, -13780261, -12916498, +-12055168, -11200397, -10355588, -9525147, -8711802, -7920384, +-7153632, -6413878, -5706099, -5031208, -4393110, -3792571, +-3230785, -2713518, -2227977, -1784736, -1364255, -871387 +}; + +const Word32 rot_vec_delay_re_LDQMF_fx[60] = // q = 31 +{ + -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, + 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, + -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, + 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, + -1518500224, 1518500224, 1518500224, -1518500224 +}; + +const Word32 rot_vec_delay_im_LDQMF_fx[60] = // q = 31 +{ + -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, + 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, + -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, + 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, + -1518500224, -1518500224, 1518500224, 1518500224 +}; + +const Word32 rot_vec_ana_re_L10_fx[5] = // q = 29 +{ + 1517329536, 1424643840, 1192503936, 843633536, 412182400 +}; + +const Word32 rot_vec_ana_im_L10_fx[5] = // q = 29 +{ + -59616040, -525578848, -940094336, -1262586752, -1461488512 +}; + +const Word32 rot_vec_ana_re_L16_fx[8] = // q = 29 +{ + 1200118272, 1171310720, 1097490432, 981494080, 827779520, 642253888, 432046752, 205236304 +}; + +const Word32 rot_vec_ana_im_L16_fx[8] = // q = 29 +{ + -29461250, -263026624, -486484032, -691246144, -869444032, -1014229696, -1120039040, -1182806016 +}; + +const Word32 rot_vec_ana_re_L20_fx[10] = // q = 29 +{ + 1073534848, 1057019968, 1014477760, 946955776, 856116544, 744196864, 613952640, 468590848, 311690784, 147115888 +}; + +const Word32 rot_vec_ana_im_L20_fx[10] = // q = 29 +{ + -21081516, -188759824, -351790240, -506158400, -648063232, -774010624, -880899328, -966097344, -1027506880, -1063615744 +}; + +const Word32 rot_vec_ana_re_L30_fx[15] = // q = 29 +{ + 876631424, 870629568, 855088960, 830179840, 796175040, 753447232, 702464448, 643785344, 578052800, 505986944, 428377440, 346074528, 259979936, 171036960, 80220064 +}; + +const Word32 rot_vec_ana_im_L30_fx[15] = // q = 29 +{ + -11475734, -103045800, -193486880, -281808064, -367041728, -448253984, -524555072, -595109056, -659142848, -715955008, -764922944, -805510272, -837272192, -859860864, -873028672 +}; + +const Word32 rot_vec_ana_re_L32_fx[16] = // q = 29 +{ + 848803520, 843695296, 830461760, 809230464, 780205824, 743667392, 699967040, 649525568, 592828864, 530422880, 462908640, 390936320, 315199072, 236426304, 155376608, 72830544 +}; + +const Word32 rot_vec_ana_im_L32_fx[16] = // q = 29 +{ + -10416909, -93564040, -175810112, -256363024, -334447008, -409310112, -480231328, -546527616, -607560576, -662742400, -711541696, -753488384, -788178560, -815278208, -834526272, -845737344 +}; + +const Word32 rot_vec_ana_re_L40_fx[20] = // q = 29 +{ + 759213504, 756288320, 748700352, 736496320, 719751616, 698569408, 673080256, 643441344, 609835392, 572469632, 531574400, 487401824, 440224256, 390332576, 338034336, + 283652032, 227520896, 169987024, 111405128, 52136384 +}; + +const Word32 rot_vec_ana_im_L40_fx[20] = // q = 29 +{ + -7453801, -66998032, -126129192, -184482736, -241698864, -297424864, -351317120, -403043392, -452284768, -498737664, -542115648, -582151360, -618597888, -651230528, + -679848192, -704274304, -724358336, -739976448, -751032384, -757457984 +}; + +const Word32 rot_vec_ana_re_L60_fx[30] = // q = 29 +{ + 619911872, 618849920, 616091776, 611644992, 605521728, 597738752, 588317440, 577283520, 564667392, 550503488, 534830720, 517692032, 499134368, 479208608, 457969376, 435474880, 411786784, + 386970016, 361092576, 334225408, 306442144, 277818944, 248434272, 218368656, 187704512, 156525872, 124918216, 92968160, 60763288, 28391868 +}; + +const Word32 rot_vec_ana_im_L60_fx[30] = // q = 29 +{ + -4057371, -36495492, -68833576, -100983000, -132855632, -164364112, -195422080, -225944416, -255847456, -285049248, -313469728, -341030976, -367657536, -393276352, -417817216, -441212864, + -463399200, -484315392, -503904096, -522111616, -538888128, -554187520, -567967936, -580191616, -590825024, -599838976, -607208896, -612914432, -616940032, -619274624 +}; + + +/*! + * \brief CLDFB prototype filter + * + * cldfb bands: 10 + * delay[ms]: 1.00 + * abs. max Val: 1.04 + * scale: 0.50 + */ +const Word16 CLDFB80_10[] =//Q.5 +{ + W16(0x0000), W16(0xfffc), W16(0xffdf), W16(0x0132), W16(0x23b5), + W16(0x0000), W16(0xffff), W16(0xfff3), W16(0x018d), W16(0x2a98), + W16(0x0000), W16(0x0000), W16(0x0006), W16(0x020d), W16(0x3116), + W16(0x0000), W16(0x0000), W16(0x001a), W16(0x02bd), W16(0x36e2), + W16(0x0000), W16(0x0000), W16(0x001c), W16(0x039f), W16(0x3bb5), + W16(0x0000), W16(0xffff), W16(0x001a), W16(0x04b1), W16(0x3f51), + W16(0x0000), W16(0x0000), W16(0x0024), W16(0x05da), W16(0x419a), + W16(0x0000), W16(0x0000), W16(0x002e), W16(0x06ee), W16(0x428c), + W16(0x0000), W16(0x0000), W16(0x0032), W16(0x07bd), W16(0x4267), + W16(0x0000), W16(0xfffc), W16(0x001b), W16(0x0820), W16(0x410b), + W16(0x0000), W16(0xfff0), W16(0xffe9), W16(0x0806), W16(0x3d82), + W16(0x0000), W16(0xfffe), W16(0xffe6), W16(0x0746), W16(0x37fe), + W16(0x0000), W16(0x0000), W16(0x000d), W16(0x05ae), W16(0x31d1), + W16(0x0000), W16(0x0000), W16(0x002a), W16(0x032f), W16(0x2b60), + W16(0x0000), W16(0xfffd), W16(0x0025), W16(0xffcd), W16(0x24a3), + W16(0x0000), W16(0x0003), W16(0x0004), W16(0xfb88), W16(0x1dc0), + W16(0x0000), W16(0x0000), W16(0xffca), W16(0xf66f), W16(0x16c9), + W16(0x0000), W16(0x0000), W16(0xff95), W16(0xf09a), W16(0x0fe8), + W16(0x0000), W16(0xffff), W16(0xff64), W16(0xea2a), W16(0x08e0), + W16(0x0000), W16(0x0012), W16(0xff21), W16(0xe34c), W16(0x02aa) +}; + +/*! + * \brief CLDFB prototype filter + * + * cldfb bands: 16 + * delay[ms]: 1.00 + * abs. max Val: 1.04 + * scale: 0.50 + */ +const Word16 CLDFB80_16[] =//Q.5 +{ + W16(0x0000), W16(0xfffb), W16(0xffdd), W16(0x0123), W16(0x2266), + W16(0x0000), W16(0xfffe), W16(0xffe7), W16(0x0157), W16(0x26c0), + W16(0x0000), W16(0xffff), W16(0xfff4), W16(0x0194), W16(0x2b04), + W16(0x0000), W16(0xffff), W16(0xfffe), W16(0x01e0), W16(0x2f1f), + W16(0x0000), W16(0x0000), W16(0x000c), W16(0x023f), W16(0x32fc), + W16(0x0000), W16(0x0000), W16(0x0019), W16(0x02b0), W16(0x368c), + W16(0x0000), W16(0x0000), W16(0x001d), W16(0x0336), W16(0x39bc), + W16(0x0000), W16(0x0001), W16(0x0013), W16(0x03cf), W16(0x3c7b), + W16(0x0000), W16(0x0001), W16(0x001a), W16(0x047b), W16(0x3ebd), + W16(0x0000), W16(0x0000), W16(0x001e), W16(0x0532), W16(0x407c), + W16(0x0000), W16(0x0000), W16(0x0025), W16(0x05ec), W16(0x41b3), + W16(0x0000), W16(0xffff), W16(0x002d), W16(0x069d), W16(0x4262), + W16(0x0000), W16(0x0000), W16(0x0031), W16(0x0738), W16(0x429c), + W16(0x0000), W16(0x0000), W16(0x0032), W16(0x07b3), W16(0x4271), + W16(0x0000), W16(0xffff), W16(0x002a), W16(0x0804), W16(0x41d1), + W16(0x0000), W16(0xfff9), W16(0x0015), W16(0x0824), W16(0x40a3), + W16(0x0000), W16(0xffec), W16(0xffee), W16(0x0815), W16(0x3e6c), + W16(0x0000), W16(0xfff7), W16(0xffe0), W16(0x07ca), W16(0x3b3b), + W16(0x0000), W16(0xfffd), W16(0xffe8), W16(0x0734), W16(0x379e), + W16(0x0000), W16(0xfffe), W16(0x0000), W16(0x0647), W16(0x33c7), + W16(0x0000), W16(0xffff), W16(0x0018), W16(0x04ff), W16(0x2fd6), + W16(0x0000), W16(0x0000), W16(0x0029), W16(0x035e), W16(0x2bca), + W16(0x0000), W16(0xffff), W16(0x002b), W16(0x0164), W16(0x279c), + W16(0x0000), W16(0x0001), W16(0x0022), W16(0xff11), W16(0x235b), + W16(0x0000), W16(0xfffc), W16(0x000f), W16(0xfc66), W16(0x1f0d), + W16(0x0000), W16(0x0001), W16(0xffec), W16(0xf966), W16(0x1ab4), + W16(0x0000), W16(0x0000), W16(0xffc6), W16(0xf617), W16(0x165a), + W16(0x0000), W16(0x0001), W16(0xffa5), W16(0xf27f), W16(0x120e), + W16(0x0000), W16(0x0001), W16(0xff86), W16(0xeea6), W16(0x0dbd), + W16(0x0000), W16(0x0001), W16(0xff67), W16(0xea95), W16(0x0950), + W16(0x0000), W16(0x0005), W16(0xff40), W16(0xe657), W16(0x051a), + W16(0x0000), W16(0x001b), W16(0xff12), W16(0xe1fc), W16(0x01c8) +}; + +/*! + * \brief CLDFB prototype filter + * + * cldfb bands: 20 + * delay[ms]: 1.00 + * abs. max Val: 1.04 + * scale: 0.50 + */ +const Word16 CLDFB80_20[] =//Q.5 +{ + W16(0x0000), W16(0xfffb), W16(0xffdf), W16(0x011e), W16(0x21f7), + W16(0x0000), W16(0xfffd), W16(0xffe1), W16(0x0146), W16(0x2573), + W16(0x0000), W16(0xffff), W16(0xfff2), W16(0x0173), W16(0x28e6), + W16(0x0000), W16(0xffff), W16(0xfff6), W16(0x01a9), W16(0x2c45), + W16(0x0000), W16(0xffff), W16(0xffff), W16(0x01e9), W16(0x2f84), + W16(0x0000), W16(0x0000), W16(0x000a), W16(0x0235), W16(0x329c), + W16(0x0000), W16(0x0000), W16(0x0014), W16(0x028c), W16(0x3583), + W16(0x0000), W16(0x0000), W16(0x001b), W16(0x02f1), W16(0x3831), + W16(0x0000), W16(0x0000), W16(0x001e), W16(0x0362), W16(0x3a9c), + W16(0x0000), W16(0x0001), W16(0x000d), W16(0x03df), W16(0x3cbb), + W16(0x0000), W16(0x0000), W16(0x001b), W16(0x0469), W16(0x3e89), + W16(0x0000), W16(0x0000), W16(0x001c), W16(0x04fb), W16(0x4004), + W16(0x0000), W16(0x0000), W16(0x0020), W16(0x0590), W16(0x4129), + W16(0x0000), W16(0x0000), W16(0x0027), W16(0x0622), W16(0x41f5), + W16(0x0000), W16(0x0000), W16(0x002e), W16(0x06ad), W16(0x426d), + W16(0x0000), W16(0x0000), W16(0x0030), W16(0x072a), W16(0x429b), + W16(0x0000), W16(0x0000), W16(0x0032), W16(0x0792), W16(0x4288), + W16(0x0000), W16(0x0001), W16(0x002e), W16(0x07e1), W16(0x4232), + W16(0x0000), W16(0xfffe), W16(0x0024), W16(0x0813), W16(0x4186), + W16(0x0000), W16(0xfff8), W16(0x0011), W16(0x0825), W16(0x407d), + W16(0x0000), W16(0xffed), W16(0xfff1), W16(0x0818), W16(0x3eb8), + W16(0x0000), W16(0xfff5), W16(0xffe3), W16(0x07e8), W16(0x3c3c), + W16(0x0000), W16(0xfffe), W16(0xffe1), W16(0x0789), W16(0x3977), + W16(0x0000), W16(0xfffd), W16(0xffee), W16(0x06f6), W16(0x367b), + W16(0x0000), W16(0xfffe), W16(0x0002), W16(0x062a), W16(0x3363), + W16(0x0000), W16(0xffff), W16(0x0016), W16(0x0524), W16(0x303c), + W16(0x0000), W16(0x0000), W16(0x0026), W16(0x03e4), W16(0x2d04), + W16(0x0000), W16(0x0000), W16(0x002d), W16(0x026c), W16(0x29b7), + W16(0x0000), W16(0xfffe), W16(0x0029), W16(0x00bb), W16(0x2657), + W16(0x0000), W16(0x0005), W16(0x0021), W16(0xfed0), W16(0x22ed), + W16(0x0000), W16(0xfff8), W16(0x0014), W16(0xfcae), W16(0x1f7c), + W16(0x0000), W16(0x0002), W16(0xfff7), W16(0xfa55), W16(0x1c03), + W16(0x0000), W16(0x0000), W16(0xffd8), W16(0xf7c8), W16(0x1886), + W16(0x0000), W16(0x0001), W16(0xffbc), W16(0xf50a), W16(0x150f), + W16(0x0000), W16(0x0001), W16(0xffa2), W16(0xf21f), W16(0x11a0), + W16(0x0000), W16(0x0001), W16(0xff89), W16(0xef0b), W16(0x0e2c), + W16(0x0000), W16(0x0001), W16(0xff71), W16(0xebd2), W16(0x0aa5), + W16(0x0000), W16(0xfffe), W16(0xff55), W16(0xe87a), W16(0x0724), + W16(0x0000), W16(0x0006), W16(0xff33), W16(0xe50a), W16(0x03fd), + W16(0x0000), W16(0x001e), W16(0xff0d), W16(0xe18b), W16(0x017f) +}; + +/*! + * \brief CLDFB prototype filter + * + * cldfb bands: 32 + * delay[ms]: 1.00 + * abs. max Val: 1.04 + * scale: 0.50 + */ +const Word16 CLDFB80_32[] =//Q.5 +{ + W16(0x0000), W16(0xfffb), W16(0xffe2), W16(0x0115), W16(0x214f), + W16(0x0000), W16(0xfffc), W16(0xffde), W16(0x012f), W16(0x237e), + W16(0x0000), W16(0xfffd), W16(0xffe2), W16(0x0149), W16(0x25ab), + W16(0x0000), W16(0xfffe), W16(0xffec), W16(0x0165), W16(0x27d4), + W16(0x0000), W16(0xffff), W16(0xfff4), W16(0x0183), W16(0x29f6), + W16(0x0000), W16(0xffff), W16(0xfff6), W16(0x01a6), W16(0x2c10), + W16(0x0000), W16(0xffff), W16(0xfffb), W16(0x01cc), W16(0x2e1d), + W16(0x0000), W16(0xffff), W16(0x0001), W16(0x01f6), W16(0x301c), + W16(0x0000), W16(0x0000), W16(0x0009), W16(0x0226), W16(0x320b), + W16(0x0000), W16(0x0000), W16(0x000f), W16(0x025a), W16(0x33e7), + W16(0x0000), W16(0x0000), W16(0x0015), W16(0x0292), W16(0x35b0), + W16(0x0000), W16(0x0000), W16(0x001b), W16(0x02d0), W16(0x3761), + W16(0x0000), W16(0x0000), W16(0x001d), W16(0x0313), W16(0x38fa), + W16(0x0000), W16(0x0000), W16(0x001e), W16(0x035a), W16(0x3a77), + W16(0x0000), W16(0x0000), W16(0x001b), W16(0x03a7), W16(0x3bd7), + W16(0x0000), W16(0x0000), W16(0x0004), W16(0x03f7), W16(0x3d18), + W16(0x0000), W16(0xffff), W16(0x001b), W16(0x044e), W16(0x3e38), + W16(0x0000), W16(0xffff), W16(0x001a), W16(0x04a8), W16(0x3f39), + W16(0x0000), W16(0x0000), W16(0x001c), W16(0x0504), W16(0x4018), + W16(0x0000), W16(0x0001), W16(0x001f), W16(0x0561), W16(0x40d6), + W16(0x0000), W16(0x0000), W16(0x0022), W16(0x05be), W16(0x4172), + W16(0x0000), W16(0x0000), W16(0x0027), W16(0x0619), W16(0x41eb), + W16(0x0000), W16(0xffff), W16(0x002c), W16(0x0672), W16(0x4242), + W16(0x0000), W16(0x0000), W16(0x002e), W16(0x06c6), W16(0x427b), + W16(0x0000), W16(0x0000), W16(0x002f), W16(0x0714), W16(0x4297), + W16(0x0000), W16(0x0000), W16(0x0031), W16(0x075a), W16(0x429a), + W16(0x0000), W16(0x0000), W16(0x0032), W16(0x0798), W16(0x4285), + W16(0x0000), W16(0x0001), W16(0x0031), W16(0x07cb), W16(0x4255), + W16(0x0000), W16(0xffff), W16(0x002c), W16(0x07f4), W16(0x4206), + W16(0x0000), W16(0xfffe), W16(0x0025), W16(0x0811), W16(0x4193), + W16(0x0000), W16(0xfffb), W16(0x001a), W16(0x0821), W16(0x40fa), + W16(0x0000), W16(0xfff5), W16(0x000b), W16(0x0823), W16(0x404a), + W16(0x0000), W16(0xfff0), W16(0xfff6), W16(0x081b), W16(0x3f2f), + W16(0x0000), W16(0xffef), W16(0xffe9), W16(0x0809), W16(0x3daa), + W16(0x0000), W16(0xfff5), W16(0xffe2), W16(0x07e4), W16(0x3c12), + W16(0x0000), W16(0xfffa), W16(0xffe0), W16(0x07ac), W16(0x3a5c), + W16(0x0000), W16(0xffff), W16(0xffe4), W16(0x0761), W16(0x388d), + W16(0x0000), W16(0xfffd), W16(0xffed), W16(0x0701), W16(0x36ac), + W16(0x0000), W16(0xfffe), W16(0xfff9), W16(0x068a), W16(0x34c0), + W16(0x0000), W16(0xffff), W16(0x0006), W16(0x05fd), W16(0x32cd), + W16(0x0000), W16(0x0000), W16(0x0013), W16(0x0559), W16(0x30d4), + W16(0x0000), W16(0x0000), W16(0x001d), W16(0x049f), W16(0x2ed6), + W16(0x0000), W16(0x0000), W16(0x0026), W16(0x03cf), W16(0x2cd0), + W16(0x0000), W16(0x0000), W16(0x002c), W16(0x02e8), W16(0x2ac1), + W16(0x0000), W16(0x0000), W16(0x002c), W16(0x01eb), W16(0x28aa), + W16(0x0000), W16(0xfffe), W16(0x0029), W16(0x00d7), W16(0x268d), + W16(0x0000), W16(0xfffd), W16(0x0024), W16(0xffae), W16(0x246c), + W16(0x0000), W16(0x000a), W16(0x0021), W16(0xfe6e), W16(0x2248), + W16(0x0000), W16(0xfff3), W16(0x001a), W16(0xfd19), W16(0x2022), + W16(0x0000), W16(0x0003), W16(0x0006), W16(0xfbad), W16(0x1df8), + W16(0x0000), W16(0x0002), W16(0xfff5), W16(0xfa2d), W16(0x1bcb), + W16(0x0000), W16(0xffff), W16(0xffe2), W16(0xf899), W16(0x199d), + W16(0x0000), W16(0x0001), W16(0xffcf), W16(0xf6f2), W16(0x1770), + W16(0x0000), W16(0x0001), W16(0xffbd), W16(0xf537), W16(0x1546), + W16(0x0000), W16(0x0001), W16(0xffad), W16(0xf36b), W16(0x1320), + W16(0x0000), W16(0x0000), W16(0xff9d), W16(0xf18e), W16(0x10fc), + W16(0x0000), W16(0x0001), W16(0xff8e), W16(0xefa2), W16(0x0ed3), + W16(0x0000), W16(0x0001), W16(0xff7f), W16(0xeda7), W16(0x0ca3), + W16(0x0000), W16(0x0001), W16(0xff6f), W16(0xeb9e), W16(0x0a6c), + W16(0x0000), W16(0xfffd), W16(0xff5e), W16(0xe989), W16(0x0837), + W16(0x0000), W16(0x0003), W16(0xff4b), W16(0xe769), W16(0x0618), + W16(0x0000), W16(0x0006), W16(0xff35), W16(0xe542), W16(0x042a), + W16(0x0000), W16(0x0013), W16(0xff1e), W16(0xe314), W16(0x0284), + W16(0x0000), W16(0x0020), W16(0xff06), W16(0xe0e2), W16(0x010c) +}; + +/*! + * \brief CLDFB prototype filter + * + * cldfb bands: 40 + * delay[ms]: 1.00 + * abs. max Val: 1.04 + * scale: 0.50 + */ +const Word16 CLDFB80_40[] =//Q.5 +{ + W16(0x0000), W16(0xfffa), W16(0xffe2), W16(0x0112), W16(0x2117), + W16(0x0000), W16(0xfffb), W16(0xffdc), W16(0x0128), W16(0x22d6), + W16(0x0000), W16(0xfffc), W16(0xffe0), W16(0x013c), W16(0x2494), + W16(0x0000), W16(0xfffe), W16(0xffe5), W16(0x0151), W16(0x2651), + W16(0x0000), W16(0xffff), W16(0xffed), W16(0x0167), W16(0x280b), + W16(0x0000), W16(0xffff), W16(0xfff4), W16(0x0180), W16(0x29c0), + W16(0x0000), W16(0xffff), W16(0xfff4), W16(0x019b), W16(0x2b6f), + W16(0x0000), W16(0xffff), W16(0xfff8), W16(0x01b8), W16(0x2d18), + W16(0x0000), W16(0xffff), W16(0xfffd), W16(0x01d8), W16(0x2eb8), + W16(0x0000), W16(0xffff), W16(0x0002), W16(0x01fb), W16(0x304e), + W16(0x0000), W16(0x0000), W16(0x0008), W16(0x0221), W16(0x31da), + W16(0x0000), W16(0x0000), W16(0x000d), W16(0x0249), W16(0x335a), + W16(0x0000), W16(0x0000), W16(0x0013), W16(0x0275), W16(0x34ce), + W16(0x0000), W16(0x0000), W16(0x0017), W16(0x02a4), W16(0x3634), + W16(0x0000), W16(0x0000), W16(0x001b), W16(0x02d6), W16(0x378b), + W16(0x0000), W16(0x0000), W16(0x001d), W16(0x030c), W16(0x38d3), + W16(0x0000), W16(0x0000), W16(0x001e), W16(0x0344), W16(0x3a08), + W16(0x0000), W16(0x0000), W16(0x001e), W16(0x0380), W16(0x3b2b), + W16(0x0000), W16(0x0000), W16(0x0017), W16(0x03bf), W16(0x3c3b), + W16(0x0000), W16(0xffff), W16(0x0002), W16(0x03ff), W16(0x3d36), + W16(0x0000), W16(0xffff), W16(0x001a), W16(0x0445), W16(0x3e1d), + W16(0x0000), W16(0x0000), W16(0x001a), W16(0x048d), W16(0x3eef), + W16(0x0000), W16(0x0000), W16(0x001b), W16(0x04d6), W16(0x3fad), + W16(0x0000), W16(0x0000), W16(0x001d), W16(0x0520), W16(0x4055), + W16(0x0000), W16(0x0001), W16(0x001f), W16(0x056a), W16(0x40e8), + W16(0x0000), W16(0xffff), W16(0x0021), W16(0x05b5), W16(0x4164), + W16(0x0000), W16(0x0000), W16(0x0026), W16(0x05fe), W16(0x41ca), + W16(0x0000), W16(0x0000), W16(0x0029), W16(0x0646), W16(0x421b), + W16(0x0000), W16(0xffff), W16(0x002d), W16(0x068c), W16(0x4256), + W16(0x0000), W16(0x0000), W16(0x002e), W16(0x06ce), W16(0x427f), + W16(0x0000), W16(0x0000), W16(0x002f), W16(0x070c), W16(0x4295), + W16(0x0000), W16(0x0000), W16(0x0031), W16(0x0746), W16(0x429c), + W16(0x0000), W16(0x0000), W16(0x0032), W16(0x077a), W16(0x4293), + W16(0x0000), W16(0x0000), W16(0x0032), W16(0x07a8), W16(0x427a), + W16(0x0000), W16(0x0001), W16(0x0030), W16(0x07d0), W16(0x424f), + W16(0x0000), W16(0xffff), W16(0x002d), W16(0x07f0), W16(0x4210), + W16(0x0000), W16(0xffff), W16(0x0028), W16(0x080a), W16(0x41ba), + W16(0x0000), W16(0xfffd), W16(0x001f), W16(0x081b), W16(0x414b), + W16(0x0000), W16(0xfffa), W16(0x0018), W16(0x0824), W16(0x40c6), + W16(0x0000), W16(0xfff4), W16(0x0009), W16(0x0822), W16(0x403a), + W16(0xffff), W16(0xfff1), W16(0xfff9), W16(0x081c), W16(0x3f57), + W16(0x0000), W16(0xffed), W16(0xffec), W16(0x0810), W16(0x3e1f), + W16(0x0000), W16(0xfff3), W16(0xffe6), W16(0x07f9), W16(0x3ce2), + W16(0x0000), W16(0xfff6), W16(0xffe1), W16(0x07d5), W16(0x3b92), + W16(0x0000), W16(0xfffb), W16(0xffe0), W16(0x07a6), W16(0x3a2f), + W16(0x0000), W16(0xffff), W16(0xffe3), W16(0x076a), W16(0x38bc), + W16(0x0000), W16(0xfffd), W16(0xffea), W16(0x0720), W16(0x373e), + W16(0x0000), W16(0xfffd), W16(0xfff3), W16(0x06c8), W16(0x35b7), + W16(0x0000), W16(0xfffe), W16(0xfffd), W16(0x0662), W16(0x342a), + W16(0x0000), W16(0xffff), W16(0x0008), W16(0x05ee), W16(0x329a), + W16(0x0000), W16(0x0000), W16(0x0011), W16(0x056b), W16(0x3107), + W16(0x0000), W16(0xffff), W16(0x001a), W16(0x04d9), W16(0x2f70), + W16(0x0000), W16(0x0000), W16(0x0022), W16(0x043a), W16(0x2dd4), + W16(0x0000), W16(0x0000), W16(0x0028), W16(0x038c), W16(0x2c33), + W16(0x0000), W16(0x0000), W16(0x002c), W16(0x02cf), W16(0x2a8c), + W16(0x0000), W16(0x0001), W16(0x002d), W16(0x0205), W16(0x28e0), + W16(0x0000), W16(0xffff), W16(0x002b), W16(0x012c), W16(0x2730), + W16(0x0000), W16(0xfffd), W16(0x0027), W16(0x0045), W16(0x257d), + W16(0x0000), W16(0xffff), W16(0x0023), W16(0xff50), W16(0x23c8), + W16(0x0000), W16(0x000a), W16(0x0021), W16(0xfe4d), W16(0x2211), + W16(0x0000), W16(0xfff3), W16(0x001c), W16(0xfd3c), W16(0x2059), + W16(0x0000), W16(0x0000), W16(0x000b), W16(0xfc1c), W16(0x1e9e), + W16(0x0000), W16(0x0003), W16(0xfffd), W16(0xfaf0), W16(0x1ce2), + W16(0x0000), W16(0x0001), W16(0xffef), W16(0xf9b6), W16(0x1b24), + W16(0x0000), W16(0xfffe), W16(0xffe0), W16(0xf870), W16(0x1965), + W16(0x0000), W16(0x0001), W16(0xffd1), W16(0xf71d), W16(0x17a7), + W16(0x0000), W16(0x0000), W16(0xffc3), W16(0xf5be), W16(0x15ec), + W16(0x0000), W16(0x0001), W16(0xffb5), W16(0xf453), W16(0x1433), + W16(0x0000), W16(0x0001), W16(0xffa8), W16(0xf2de), W16(0x127c), + W16(0x0000), W16(0x0000), W16(0xff9b), W16(0xf15e), W16(0x10c5), + W16(0x0000), W16(0x0001), W16(0xff8f), W16(0xefd4), W16(0x0f0b), + W16(0x0000), W16(0x0001), W16(0xff83), W16(0xee40), W16(0x0d4c), + W16(0x0000), W16(0x0001), W16(0xff77), W16(0xeca4), W16(0x0b88), + W16(0x0000), W16(0x0001), W16(0xff6a), W16(0xeaff), W16(0x09c2), + W16(0x0000), W16(0xfffd), W16(0xff5d), W16(0xe953), W16(0x0800), + W16(0x0000), W16(0x0002), W16(0xff4d), W16(0xe7a0), W16(0x064d), + W16(0x0000), W16(0x0006), W16(0xff3c), W16(0xe5e8), W16(0x04b8), + W16(0x0000), W16(0x0009), W16(0xff2a), W16(0xe42c), W16(0x034d), + W16(0x0000), W16(0x0018), W16(0xff17), W16(0xe26c), W16(0x0212), + W16(0x0001), W16(0x0020), W16(0xff03), W16(0xe0aa), W16(0x00e3) +}; + +/*! + * \brief CLDFB prototype filter + * + * cldfb bands: 60 + * delay[ms]: 1.00 + * abs. max Val: 1.04 + * scale: 0.50 + */ +const Word16 CLDFB80_60[] =//Q.5 +{ + W16(0x0000), W16(0xfffa), W16(0xffe2), W16(0x010f), W16(0x20cd), + W16(0x0000), W16(0xfffb), W16(0xffdf), W16(0x011e), W16(0x21f7), + W16(0x0000), W16(0xfffb), W16(0xffdd), W16(0x012b), W16(0x2320), + W16(0x0000), W16(0xfffd), W16(0xffe0), W16(0x0138), W16(0x244a), + W16(0x0000), W16(0xfffd), W16(0xffe1), W16(0x0146), W16(0x2573), + W16(0x0000), W16(0xfffe), W16(0xffe6), W16(0x0155), W16(0x269b), + W16(0x0000), W16(0xfffe), W16(0xffec), W16(0x0164), W16(0x27c1), + W16(0x0000), W16(0xffff), W16(0xfff2), W16(0x0173), W16(0x28e6), + W16(0x0000), W16(0xffff), W16(0xfff4), W16(0x0184), W16(0x2a08), + W16(0x0000), W16(0xffff), W16(0xfff4), W16(0x0196), W16(0x2b28), + W16(0x0000), W16(0xffff), W16(0xfff6), W16(0x01a9), W16(0x2c45), + W16(0x0000), W16(0xffff), W16(0xfff9), W16(0x01bd), W16(0x2d5e), + W16(0x0000), W16(0xffff), W16(0xfffc), W16(0x01d2), W16(0x2e73), + W16(0x0000), W16(0xffff), W16(0xffff), W16(0x01e9), W16(0x2f84), + W16(0x0000), W16(0x0000), W16(0x0003), W16(0x0201), W16(0x3091), + W16(0x0000), W16(0x0000), W16(0x0008), W16(0x021a), W16(0x3199), + W16(0x0000), W16(0x0000), W16(0x000a), W16(0x0235), W16(0x329c), + W16(0x0000), W16(0x0000), W16(0x000e), W16(0x0251), W16(0x3399), + W16(0x0000), W16(0x0000), W16(0x0012), W16(0x026e), W16(0x3491), + W16(0x0000), W16(0x0000), W16(0x0014), W16(0x028c), W16(0x3583), + W16(0x0000), W16(0x0000), W16(0x0018), W16(0x02ac), W16(0x366f), + W16(0x0000), W16(0x0000), W16(0x001b), W16(0x02ce), W16(0x3753), + W16(0x0000), W16(0x0000), W16(0x001b), W16(0x02f1), W16(0x3831), + W16(0x0000), W16(0x0000), W16(0x001d), W16(0x0315), W16(0x3907), + W16(0x0000), W16(0x0000), W16(0x001e), W16(0x033b), W16(0x39d6), + W16(0x0000), W16(0x0000), W16(0x001e), W16(0x0362), W16(0x3a9c), + W16(0x0000), W16(0x0000), W16(0x001d), W16(0x038a), W16(0x3b5a), + W16(0x0000), W16(0x0000), W16(0x0019), W16(0x03b4), W16(0x3c0f), + W16(0x0000), W16(0x0001), W16(0x000d), W16(0x03df), W16(0x3cbb), + W16(0x0000), W16(0xffff), W16(0x0001), W16(0x040a), W16(0x3d5e), + W16(0x0000), W16(0xfffe), W16(0x0017), W16(0x0439), W16(0x3df8), + W16(0x0000), W16(0x0000), W16(0x001b), W16(0x0469), W16(0x3e89), + W16(0x0000), W16(0x0000), W16(0x001a), W16(0x0499), W16(0x3f10), + W16(0x0000), W16(0x0000), W16(0x001a), W16(0x04c9), W16(0x3f8f), + W16(0x0000), W16(0x0000), W16(0x001c), W16(0x04fb), W16(0x4004), + W16(0x0000), W16(0x0000), W16(0x001e), W16(0x052c), W16(0x406f), + W16(0x0000), W16(0x0001), W16(0x001f), W16(0x055e), W16(0x40d1), + W16(0x0000), W16(0x0000), W16(0x0020), W16(0x0590), W16(0x4129), + W16(0x0000), W16(0x0000), W16(0x0022), W16(0x05c1), W16(0x4177), + W16(0x0000), W16(0x0000), W16(0x0025), W16(0x05f2), W16(0x41bb), + W16(0x0000), W16(0x0000), W16(0x0027), W16(0x0622), W16(0x41f5), + W16(0x0000), W16(0xffff), W16(0x002a), W16(0x0652), W16(0x4226), + W16(0x0000), W16(0xffff), W16(0x002c), W16(0x0680), W16(0x424e), + W16(0x0000), W16(0x0000), W16(0x002e), W16(0x06ad), W16(0x426d), + W16(0x0000), W16(0x0000), W16(0x002e), W16(0x06d9), W16(0x4284), + W16(0x0000), W16(0x0000), W16(0x002f), W16(0x0702), W16(0x4293), + W16(0x0000), W16(0x0000), W16(0x0030), W16(0x072a), W16(0x429b), + W16(0x0000), W16(0x0000), W16(0x0031), W16(0x074f), W16(0x429b), + W16(0x0000), W16(0x0000), W16(0x0032), W16(0x0772), W16(0x4295), + W16(0x0000), W16(0x0000), W16(0x0032), W16(0x0792), W16(0x4288), + W16(0x0000), W16(0x0000), W16(0x0032), W16(0x07af), W16(0x4274), + W16(0x0000), W16(0x0001), W16(0x0031), W16(0x07ca), W16(0x4257), + W16(0x0000), W16(0x0001), W16(0x002e), W16(0x07e1), W16(0x4232), + W16(0x0000), W16(0xffff), W16(0x002c), W16(0x07f5), W16(0x4203), + W16(0x0000), W16(0xfffe), W16(0x0029), W16(0x0806), W16(0x41ca), + W16(0x0000), W16(0xfffe), W16(0x0024), W16(0x0813), W16(0x4186), + W16(0x0000), W16(0xfffd), W16(0x001e), W16(0x081d), W16(0x4137), + W16(0x0000), W16(0xfffa), W16(0x0019), W16(0x0823), W16(0x40de), + W16(0x0000), W16(0xfff8), W16(0x0011), W16(0x0825), W16(0x407d), + W16(0xffff), W16(0xfff3), W16(0x0006), W16(0x0821), W16(0x4023), + W16(0xffff), W16(0xfff2), W16(0xfffb), W16(0x081d), W16(0x3f8c), + W16(0x0000), W16(0xffed), W16(0xfff1), W16(0x0818), W16(0x3eb8), + W16(0x0000), W16(0xffee), W16(0xffeb), W16(0x080d), W16(0x3deb), + W16(0x0000), W16(0xfff2), W16(0xffe7), W16(0x07fd), W16(0x3d18), + W16(0x0000), W16(0xfff5), W16(0xffe3), W16(0x07e8), W16(0x3c3c), + W16(0x0000), W16(0xfff7), W16(0xffe0), W16(0x07ce), W16(0x3b58), + W16(0x0000), W16(0xfffa), W16(0xffe0), W16(0x07ae), W16(0x3a6b), + W16(0x0000), W16(0xfffe), W16(0xffe1), W16(0x0789), W16(0x3977), + W16(0x0000), W16(0xffff), W16(0xffe4), W16(0x075e), W16(0x387d), + W16(0x0000), W16(0xfffd), W16(0xffe8), W16(0x072d), W16(0x377e), + W16(0x0000), W16(0xfffd), W16(0xffee), W16(0x06f6), W16(0x367b), + W16(0x0000), W16(0xfffe), W16(0xfff4), W16(0x06b8), W16(0x3575), + W16(0x0000), W16(0xfffe), W16(0xfffb), W16(0x0674), W16(0x346d), + W16(0x0000), W16(0xfffe), W16(0x0002), W16(0x062a), W16(0x3363), + W16(0x0000), W16(0xffff), W16(0x000a), W16(0x05d9), W16(0x3257), + W16(0x0000), W16(0x0000), W16(0x0010), W16(0x0582), W16(0x314b), + W16(0x0000), W16(0xffff), W16(0x0016), W16(0x0524), W16(0x303c), + W16(0x0000), W16(0xffff), W16(0x001b), W16(0x04c0), W16(0x2f2c), + W16(0x0000), W16(0x0000), W16(0x0021), W16(0x0455), W16(0x2e19), + W16(0x0000), W16(0x0000), W16(0x0026), W16(0x03e4), W16(0x2d04), + W16(0x0000), W16(0x0000), W16(0x0029), W16(0x036d), W16(0x2bed), + W16(0x0000), W16(0x0000), W16(0x002c), W16(0x02f0), W16(0x2ad3), + W16(0x0000), W16(0x0000), W16(0x002d), W16(0x026c), W16(0x29b7), + W16(0x0000), W16(0x0000), W16(0x002c), W16(0x01e2), W16(0x2898), + W16(0x0000), W16(0xffff), W16(0x002b), W16(0x0151), W16(0x2778), + W16(0x0000), W16(0xfffe), W16(0x0029), W16(0x00bb), W16(0x2657), + W16(0x0000), W16(0xfffd), W16(0x0026), W16(0x001d), W16(0x2534), + W16(0x0000), W16(0xfffe), W16(0x0024), W16(0xff7a), W16(0x2411), + W16(0x0000), W16(0x0005), W16(0x0021), W16(0xfed0), W16(0x22ed), + W16(0x0000), W16(0x0009), W16(0x0021), W16(0xfe21), W16(0x21c8), + W16(0x0000), W16(0xfff5), W16(0x001f), W16(0xfd6b), W16(0x20a2), + W16(0x0000), W16(0xfff8), W16(0x0014), W16(0xfcae), W16(0x1f7c), + W16(0x0000), W16(0x0001), W16(0x0009), W16(0xfbeb), W16(0x1e54), + W16(0x0000), W16(0x0003), W16(0x0000), W16(0xfb23), W16(0x1d2c), + W16(0x0000), W16(0x0002), W16(0xfff7), W16(0xfa55), W16(0x1c03), + W16(0x0000), W16(0x0001), W16(0xffed), W16(0xf981), W16(0x1ad9), + W16(0x0000), W16(0xffff), W16(0xffe3), W16(0xf8a7), W16(0x19b0), + W16(0x0000), W16(0x0000), W16(0xffd8), W16(0xf7c8), W16(0x1886), + W16(0x0000), W16(0x0001), W16(0xffcf), W16(0xf6e3), W16(0x175d), + W16(0x0000), W16(0x0000), W16(0xffc5), W16(0xf5f9), W16(0x1636), + W16(0x0000), W16(0x0001), W16(0xffbc), W16(0xf50a), W16(0x150f), + W16(0x0000), W16(0x0001), W16(0xffb3), W16(0xf416), W16(0x13e9), + W16(0x0000), W16(0x0001), W16(0xffaa), W16(0xf31d), W16(0x12c5), + W16(0x0000), W16(0x0001), W16(0xffa2), W16(0xf21f), W16(0x11a0), + W16(0x0000), W16(0x0000), W16(0xff99), W16(0xf11d), W16(0x107b), + W16(0x0000), W16(0x0000), W16(0xff91), W16(0xf016), W16(0x0f55), + W16(0x0000), W16(0x0001), W16(0xff89), W16(0xef0b), W16(0x0e2c), + W16(0x0000), W16(0x0001), W16(0xff81), W16(0xedfc), W16(0x0d01), + W16(0x0000), W16(0x0001), W16(0xff79), W16(0xece9), W16(0x0bd4), + W16(0x0000), W16(0x0001), W16(0xff71), W16(0xebd2), W16(0x0aa5), + W16(0x0000), W16(0x0001), W16(0xff68), W16(0xeab8), W16(0x0976), + W16(0x0000), W16(0xfffd), W16(0xff5f), W16(0xe99b), W16(0x084a), + W16(0x0000), W16(0xfffe), W16(0xff55), W16(0xe87a), W16(0x0724), + W16(0x0000), W16(0x0003), W16(0xff4a), W16(0xe757), W16(0x0607), + W16(0x0000), W16(0x0006), W16(0xff3f), W16(0xe632), W16(0x04f9), + W16(0x0000), W16(0x0006), W16(0xff33), W16(0xe50a), W16(0x03fd), + W16(0x0000), W16(0x000c), W16(0xff27), W16(0xe3e1), W16(0x0315), + W16(0x0000), W16(0x0016), W16(0xff1a), W16(0xe2b7), W16(0x0244), + W16(0x0000), W16(0x001e), W16(0xff0d), W16(0xe18b), W16(0x017f), + W16(0x0002), W16(0x0020), W16(0xff00), W16(0xe05e), W16(0x00a9) +}; + +const Word16 CLDFB80_30[] =//Q.5 +{ + 0, -5, -30, 278, 8546, + 0, -4, -33, 306, 9141, + 0, -2, -29, 334, 9735, + 0, -1, -17, 363, 10324, + 0, -1, -13, 397, 10904, + 0, -1, -9, 435, 11474, + 0, -1, -2, 478, 12028, + 0, 0, 6, 525, 12566, + 0, 0, 12, 578, 13083, + 0, 0, 19, 637, 13579, + 0, 0, 26, 701, 14050, + 0, 0, 28, 771, 14493, + 0, 0, 30, 846, 14906, + 0, 0, 28, 927, 15285, + 0, 0, 4, 1012, 15630, + 0, -1, 27, 1105, 15937, + 0, -1, 26, 1201, 16209, + 0, 0, 29, 1299, 16442, + 0, 1, 31, 1399, 16638, + 0, 0, 36, 1498, 16794, + 0, 0, 41, 1594, 16911, + 0, -1, 45, 1687, 16990, + 0, 0, 46, 1774, 17036, + 0, 0, 49, 1853, 17052, + 0, 0, 50, 1922, 17040, + 0, 0, 50, 1981, 16999, + 0, 0, 45, 2027, 16924, + 0, -1, 39, 2061, 16809, + 0, -4, 27, 2080, 16651, + 0, -10, 12, 2084, 16463, + 0, -17, -10, 2075, 16161, + 0, -16, -23, 2054, 15746, + 0, -10, -31, 2012, 15307, + 0, -4, -32, 1949, 14834, + 0, -2, -26, 1862, 14334, + 0, -3, -15, 1752, 13816, + 0, -2, -1, 1616, 13288, + 0, 0, 13, 1454, 12753, + 0, -1, 25, 1267, 12212, + 0, 0, 35, 1054, 11663, + 0, 0, 42, 815, 11104, + 0, 1, 45, 552, 10536, + 0, -2, 42, 263, 9960, + 0, -3, 37, -51, 9379, + 0, 9, 33, -391, 8795, + 0, -12, 25, -755, 8207, + 0, 3, 4, -1144, 7616, + 0, 2, -14, -1557, 7022, + 0, -2, -34, -1992, 6427, + 0, 0, -54, -2449, 5833, + 0, 1, -73, -2927, 5244, + 0, 1, -90, -3425, 4659, + 0, 0, -107, -3942, 4072, + 0, 1, -123, -4476, 3479, + 0, 1, -139, -5026, 2877, + 0, -1, -156, -5590, 2272, + 0, 0, -176, -6167, 1684, + 0, 6, -199, -6754, 1144, + 0, 18, -223, -7348, 682, + 0, 32, -249, -7947, 282 +}; + +/*! + * \brief CLDFB rRotVectr + * + * cldfb bands: 10 + * global gain: 8.00 + * scale: sqrt(1.0/16.00) + */ +const Word16 rRotVectr_10[] =//Q(sqrt(1.0/16.00)) +{ + W16(0x5a71), W16(0x54ea), W16(0x4714), W16(0x3249), W16(0x1891) +}; + +/*! + * \brief CLDFB iRotVectr + * + * cldfb bands: 10 + * global gain: 8.00 + * scale: sqrt(1.0/16.00) + */ +const Word16 iRotVectr_10[] =//Q(sqrt(1.0/16.00)) +{ + W16(0xfc72), W16(0xe0ac), W16(0xc7f7), W16(0xb4be), W16(0xa8e3) +}; + +/*! + * \brief CLDFB rRotVectr + * + * cldfb bands: 16 + * global gain: 5.00 + * scale: sqrt(1.0/8.00) + */ +const Word16 rRotVectr_16[] =//Q(sqrt(1.0/8.00)) +{ + W16(0x652a), W16(0x62bc), W16(0x5c83), W16(0x52bc), W16(0x45c7), + W16(0x3623), W16(0x246b), W16(0x114d) +}; + +/*! + * \brief CLDFB iRotVectr + * + * cldfb bands: 16 + * global gain: 5.00 + * scale: sqrt(1.0/8.00) + */ +const Word16 iRotVectr_16[] =//Q(sqrt(1.0/8.00)) +{ + W16(0xfd84), W16(0xe9d4), W16(0xd6fe), W16(0xc5bb), W16(0xb6b6), + W16(0xaa82), W16(0xa196), W16(0x9c4c) +}; + +/*! + * \brief CLDFB rRotVectr + * + * cldfb bands: 20 + * global gain: 4.00 + * scale: sqrt(1.0/8.00) + */ +const Word16 rRotVectr_20[] =//Q(sqrt(1.0/8.00)) +{ + W16(0x5a7e), W16(0x591a), W16(0x5584), W16(0x4fd3), W16(0x482a), + W16(0x3ebb), W16(0x33c1), W16(0x2780), W16(0x1a46), W16(0x0c67) +}; + +/*! + * \brief CLDFB iRotVectr + * + * cldfb bands: 20 + * global gain: 4.00 + * scale: sqrt(1.0/8.00) + */ +const Word16 iRotVectr_20[] =//Q(sqrt(1.0/8.00) +{ + W16(0xfe39), W16(0xf017), W16(0xe259), W16(0xd556), W16(0xc95f), + W16(0xbec1), W16(0xb5bf), W16(0xae90), W16(0xa963), W16(0xa658) +}; + +/*! + * \brief CLDFB rRotVectr + * + * cldfb bands: 30 + * global gain: 2.50 + * scale: sqrt(1.0/4.00) + */ +const Word16 rRotVectr_30[] =//Q(sqrt(1.0/4.00)) +{ + 25902, 25725, 25265, 24529, 23525, 22262, 20756, 19022, 17080, 14950, 12657, 10226, 7682, 5054, 2370 +}; + +/*! + * \brief CLDFB iRotVectr + * + * cldfb bands: 30 + * global gain: 2.50 + * scale: sqrt(1.0/4.00) + */ +const Word16 iRotVectr_30[] =//Q(sqrt(1.0/4.00)) +{ + -339, -3045, -5717, -8327, -10845, -13245, -15499, -17584, -19476, -21154, -22601, -23801, -24739, -25406, -25796 +}; +/*! + * \brief CLDFB rRotVectr + * + * cldfb bands: 32 + * global gain: 2.50 + * scale: sqrt(1.0/4.00) + */ +const Word16 rRotVectr_32[] =//Q(sqrt(1.0/4.00)) +{ + W16(0x652f), W16(0x6494), W16(0x6300), W16(0x6078), W16(0x5d02), + W16(0x58a7), W16(0x5371), W16(0x4d6e), W16(0x46ac), W16(0x3f3b), + W16(0x372f), W16(0x2e9a), W16(0x2593), W16(0x1c2f), W16(0x1286), + W16(0x08af) +}; + +/*! + * \brief CLDFB iRotVectr + * + * cldfb bands: 32 + * global gain: 2.50 + * scale: sqrt(1.0/4.00) + */ +const Word16 iRotVectr_32[] =//Q(sqrt(1.0/4.00)) +{ + W16(0xfec2), W16(0xf4d9), W16(0xeb0b), W16(0xe170), W16(0xd821), + W16(0xcf35), W16(0xc6c1), W16(0xbed9), W16(0xb793), W16(0xb0ff), + W16(0xab2d), W16(0xa62d), W16(0xa20b), W16(0x9ed0), W16(0x9c84), + W16(0x9b2e) +}; + +/*! + * \brief CLDFB rRotVectr + * + * cldfb bands: 40 + * global gain: 2.00 + * scale: sqrt(1.0/4.00) + */ +const Word16 rRotVectr_40[] =//Q(sqrt(1.0/4.00)) +{ + W16(0x5a81), W16(0x5a28), W16(0x5941), W16(0x57cc), W16(0x55cd), + W16(0x5347), W16(0x503d), W16(0x4cb4), W16(0x48b3), W16(0x443e), + W16(0x3f5e), W16(0x3a1a), W16(0x347b), W16(0x2e88), W16(0x284c), + W16(0x21d0), W16(0x1b1f), W16(0x1444), W16(0x0d48), W16(0x0637) +}; + +/*! + * \brief CLDFB iRotVectr + * + * cldfb bands: 40 + * global gain: 2.00 + * scale: sqrt(1.0/4.00) + */ +const Word16 iRotVectr_40[] =//Q(sqrt(1.0/4.00)) +{ + W16(0xff1d), W16(0xf803), W16(0xf0f7), W16(0xea02), W16(0xe330), + W16(0xdc8b), W16(0xd61f), W16(0xcff4), W16(0xca15), W16(0xc48c), + W16(0xbf60), W16(0xba9a), W16(0xb642), W16(0xb25e), W16(0xaef5), + W16(0xac0b), W16(0xa9a6), W16(0xa7ca), W16(0xa678), W16(0xa5b4) +}; + +/*! + * \brief CLDFB rRotVectr + * + * cldfb bands: 60 + * global gain: 1.33 + * scale: sqrt(1.0/2.00) + */ +const Word16 rRotVectr_60[] =//Q(sqrt(1.0/2.00)) +{ + W16(0x6882), W16(0x6855), W16(0x67de), W16(0x671e), W16(0x6615), + W16(0x64c5), W16(0x632f), W16(0x6153), W16(0x5f32), W16(0x5ccf), + W16(0x5a2a), W16(0x5747), W16(0x5426), W16(0x50ca), W16(0x4d35), + W16(0x496a), W16(0x456c), W16(0x413d), W16(0x3ce0), W16(0x3859), + W16(0x33aa), W16(0x2ed6), W16(0x29e2), W16(0x24d0), W16(0x1fa5), + W16(0x1a63), W16(0x150f), W16(0x0fac), W16(0x0a3e), W16(0x04c9) +}; + +/*! + * \brief CLDFB iRotVectr + * + * cldfb bands: 60 + * global gain: 1.33 + * scale: sqrt(1.0/2.00) + */ +const Word16 iRotVectr_60[] =//Q(sqrt(1.0/2.00)) +{ + W16(0xff51), W16(0xf9d9), W16(0xf465), W16(0xeefa), W16(0xe99a), + W16(0xe44a), W16(0xdf0e), W16(0xd9e9), W16(0xd4de), W16(0xcff2), + W16(0xcb27), W16(0xc682), W16(0xc204), W16(0xbdb3), W16(0xb990), + W16(0xb59e), W16(0xb1e0), W16(0xae5a), W16(0xab0c), W16(0xa7fb), + W16(0xa526), W16(0xa292), W16(0xa03f), W16(0x9e30), W16(0x9c65), + W16(0x9ae0), W16(0x99a2), W16(0x98ac), W16(0x97fe), W16(0x9799) +}; + +const Word16 cldfb_anaScale[] = // Q0 +{ + SCALE_CLDFB_ANA_10, SCALE_CLDFB_ANA_16, SCALE_CLDFB_ANA_20, SCALE_CLDFB_ANA_32, SCALE_CLDFB_ANA_40, SCALE_CLDFB_ANA_60, SCALE_CLDFB_ANA_30 +}; +const Word16 cldfb_synScale[] = // Q0 +{ + SCALE_CLDFB_SYN_10, SCALE_CLDFB_SYN_16, SCALE_CLDFB_SYN_20, SCALE_CLDFB_SYN_32, SCALE_CLDFB_SYN_40, SCALE_CLDFB_SYN_60, SCALE_CLDFB_SYN_30 +}; +const Word16 cldfb_synGain[] =//Q0 +{ + 0x6666, /* 10 bands */ + 0x51EC, /* 16 bands */ + 0x6666, /* 20 bands */ + 0x51EC, /* 32 bands */ + 0x6666, /* 40 bands */ + 0x4CCD /* 60 bands */ +}; + +const Word16 *cldfb_protoFilter_2_5ms[] = +{ + CLDFB80_10, CLDFB80_16, CLDFB80_20, CLDFB80_32, CLDFB80_40, CLDFB80_60, CLDFB80_30 +}; + +const Word16 cldfb_scale_2_5ms[7] = +{ + 22603/*88.293854 Q8*/, /* 10 bands */ + 22605/*88.299622 Q8*/, /* 16 bands */ + 22605/*88.300926 Q8*/, /* 20 bands */ + 22606/*88.303848 Q8*/, /* 32 bands */ + 22606/*88.304718 Q8*/, /* 40 bands */ + 22535/*88.028412 Q8*/, /* 60 bands */ + 22588/*88.234489 Q8*/ /* 30 bands */ +}; + +const Word16 cldfb_scale_5_0ms[7] = +{ + 21649/*88.293854 Q8*/, /* 10 bands */ + 21649/*88.299622 Q8*/, /* 16 bands */ + 21649/*88.300926 Q8*/, /* 20 bands */ + 21649/*88.303848 Q8*/, /* 32 bands */ + 21649/*88.304718 Q8*/, /* 40 bands */ + 22535/*88.028412 Q8*/, /* 60 bands */ + 21581/*88.028412 Q8*/ /* 30 bands */ +}; + + +/*Q31*/ +const Word32 rot_vec_syn_re_L10_fx[5] = +{ + 239910864 ,225255952 ,188551424 ,133390176 ,65171760 , +}; + + +/*Q31*/ +const Word32 rot_vec_syn_im_L10_fx[5] = +{ + -9426123 ,-83101312 ,-148641968 ,-199632496 ,-231081632 , +}; + + +/*Q31*/ +const Word32 rot_vec_syn_re_L16_fx[8] = +{ + 240023664 ,234262144 ,219498080 ,196298816 ,165555904 ,128450776 ,86409352 ,41047260 , +}; + + +/*Q31*/ +const Word32 rot_vec_syn_im_L16_fx[8] = +{ + -5892250 ,-52605324 ,-97296808 ,-138249232 ,-173888800 ,-202845936 ,-224007808 ,-236561200 , +}; + + +/*Q31*/ +const Word32 rot_vec_syn_re_L20_fx[10] = +{ + 240049696 ,236356848 ,226844128 ,211745744 ,191433472 ,166407488 ,137283984 ,104780104 ,69696184 ,32896112 , +}; + + +/*Q31*/ +const Word32 rot_vec_syn_im_L20_fx[10] = +{ + -4713971 ,-42207980 ,-78662688 ,-113180456 ,-144911344 ,-173074048 ,-196975088 ,-216025936 ,-229757520 ,-237831712 , +}; + + +/*Q31*/ +const Word32 rot_vec_syn_re_L30_fx[15] = +{ + 240075408 ,238431728 ,234175760 ,227354112 ,218041520 ,206340016 ,192377808 ,176307872 , + 158306272 ,138570240 ,117315992 ,94776408 ,71198440 ,46840400 ,21969170 , +}; + + +/*Q31*/ +const Word32 rot_vec_syn_im_L30_fx[15] = +{ + -3142759 ,-28220256 ,-52988564 ,-77176320 ,-100518520 ,-122759408 ,-143655328 ,-162977328 , + -180513712 ,-196072352 ,-209482768 ,-220598064 ,-229296448 ,-235482592 ,-239088752 , +}; + + +/*Q31*/ +const Word32 rot_vec_syn_re_L32_fx[16] = +{ + 240077888 ,238633056 ,234890064 ,228884944 ,220675536 ,210340896 ,197980576 ,183713584 , + 167677328 ,150026240 ,130930336 ,110573488 ,89151760 ,66871456 ,43947140 ,20599588 , +}; + + +/*Q31*/ +const Word32 rot_vec_syn_im_L32_fx[16] = +{ + -2946347 ,-26463908 ,-49726608 ,-72510408 ,-94595904 ,-115770384 ,-135829936 ,-154581360 , + -171844080 ,-187451856 ,-201254368 ,-213118704 ,-222930576 ,-230595504 ,-236039664 ,-239210640 , +}; + + +/*Q31*/ +const Word32 rot_vec_syn_re_L40_fx[20] = +{ + 240084400 ,239159360 ,236759824 ,232900592 ,227605456 ,220907040 ,212846672 ,203474016 , + 192846896 ,181030800 ,168098592 ,154130000 ,139211136 ,123434000 ,106895848 ,89698648 , + 71948424 ,53754620 ,35229396 ,16486972 , +}; + + +/*Q31*/ +const Word32 rot_vec_syn_im_L40_fx[20] = +{ + -2357099 ,-21186638 ,-39885552 ,-58338564 ,-76431896 ,-94054000 ,-111096224 ,-127453512 , + -143025008 ,-157714704 ,-171432032 ,-184092416 ,-195617824 ,-205937184 ,-214986864 ,-222711088 , + -229062224 ,-234001104 ,-237497296 ,-239529232 , +}; + + +/*Q31*/ +const Word32 rot_vec_syn_re_L60_fx[30] = +{ + 240090832 ,239679552 ,238611328 ,236889088 ,234517552 ,231503216 ,227854352 ,223580960 ,218694736 , + 213209088 ,207139056 ,200501264 ,193313904 ,185596688 ,177370784 ,168658704 ,159484336 ,149872832 , + 139850544 ,129444936 ,118684528 ,107598816 ,96218184 ,84573816 ,72697640 ,60622212 ,48380616 , + 36006412 ,23533520 ,10996123 , +}; + + +/*Q31*/ +const Word32 rot_vec_syn_im_L60_fx[30] = +{ + -1571413 ,-14134643 ,-26659130 ,-39110548 ,-51454764 ,-63657948 ,-75686648 ,-87507896 ,-99089296 , + -110399096 ,-121406296 ,-132080736 ,-142393152 ,-152315264 ,-161819904 ,-170881008 ,-179473744 , + -187574544 ,-195161216 ,-202212960 ,-208710464 ,-214635904 ,-219973040 ,-224707248 ,-228825536 , + -232316640 ,-235170976 ,-237380736 ,-238939840 ,-239844032 , +}; + + +const Word16 bpf_weights_16_Fx[16] = +{ + 16385/*0.500020f Q15*/, 23022/*0.702561f Q15*/, 6843/*0.208838f Q15*/, 51/*0.001553f Q15*/, + 58/*0.001777f Q15*/, 45/*0.001370f Q15*/, 30/*0.000926f Q15*/, 18/*0.000554f Q15*/, + 9/*0.000270f Q15*/, 3/*0.000080f Q15*/, 1/*0.000030f Q15*/, 3/*0.000082f Q15*/, + 3/*0.000081f Q15*/, 2/*0.000052f Q15*/, 1/*0.000017f Q15*/, 1/*0.000016f Q15*/ +}; + +const Word16 bpf_weights_16_ivas_fx[16] = +{ + 32767/*0.999969f Q15*/, 23022/*0.702561f Q15*/, 6843/*0.208838f Q15*/, 51/*0.001553f Q15*/, + 58/*0.001777f Q15*/, 45/*0.001370f Q15*/, 30/*0.000926f Q15*/, 18/*0.000554f Q15*/, + 9/*0.000270f Q15*/, 3/*0.000080f Q15*/, 1/*0.000030f Q15*/, 3/*0.000082f Q15*/, + 3/*0.000081f Q15*/, 2/*0.000052f Q15*/, 1/*0.000017f Q15*/, 1/*0.000016f Q15*/ +}; +const Word32 bpf_weights_16_ivas_fx_32[16] = +{ + 1073784774/*1.000040f Q30*/, 754369130/*0.702561f Q30*/, 224238095/*0.208838f Q30*/, 1667521/*0.001553f Q30*/, + 1908039/*0.001777f Q30*/, 1435593/*0.001370f Q30*/, 994285/*0.000926f Q30*/, 594853/*0.000554f Q30*/, + 289910/*0.000270f Q30*/, 85899/*0.000080f Q30*/, 32212/*0.000030f Q30*/, 88047/*0.000082f Q30*/, + 86973/*0.000081f Q30*/, 55835/*0.000052f Q30*/, 18254/*0.000017f Q30*/, 17179/*0.000016f Q30*/ +}; + + +/*-------------------------------------------------------------------* + * LP CNG excitation details code book + *-------------------------------------------------------------------*/ + +const Word16 CNG_details_codebook_fx[64][NUM_ENV_CNG] = /* Q6 */ +{ + {443,547,613,547,510,471,540,479,586,535,565,611,532,500,462,551,498,463,446,484}, + {600,499,472,537,633,654,641,646,674,677,687,693,693,690,688,700,693,696,640,571}, + {529,537,501,582,537,474,505,491,521,545,561,591,566,609,570,608,636,655,649,524}, + {648,690,689,684,693,599,668,714,663,675,524,519,726,658,673,696,654,715,708,668}, + {623,630,660,656,686,688,637,666,630,555,470,468,464,445,502,583,615,545,605,592}, + {659,668,669,625,662,700,700,693,702,702,688,677,654,584,525,492,446,477,634,615}, + {634,648,656,552,520,557,662,659,572,617,691,683,684,666,673,695,682,698,680,623}, + {756,743,734,709,730,757,746,722,484,552,779,688,686,610,616,749,758,694,745,729}, + {549,568,556,625,683,619,609,667,663,684,709,649,691,668,594,511,525,617,542,684}, + {550,467,533,760,739,692,773,756,743,770,765,791,779,784,775,792,759,577,642,553}, + {658,674,656,651,670,582,593,520,467,470,522,589,600,596,587,631,652,679,645,669}, + {788,765,787,797,785,799,787,786,780,692,641,550,501,513,726,747,670,687,734,773}, + {641,654,668,673,665,682,689,684,697,665,664,593,544,494,458,537,622,650,635,635}, + {706,753,762,716,748,762,788,792,785,788,799,777,782,766,760,710,704,503,519,735}, + {748,775,784,635,717,504,539,640,764,778,681,721,791,786,787,780,780,770,774,781}, + {752,516,624,780,713,753,569,548,770,784,749,740,690,755,776,748,744,730,767,698}, + {453,471,516,517,561,653,659,616,629,608,682,698,679,681,645,587,594,522,499,469}, + {617,534,506,615,782,792,754,771,740,787,791,776,782,787,793,788,775,778,651,736}, + {661,593,490,495,491,495,554,656,658,611,628,660,680,677,698,678,673,699,687,679}, + {798,793,786,795,799,772,771,696,624,557,507,545,724,757,747,770,780,785,793,784}, + {703,695,703,714,697,701,697,631,598,498,475,451,503,611,648,664,664,683,679,688}, + {744,672,659,762,785,745,757,761,761,767,722,757,761,737,699,471,582,770,724,756}, + {775,746,535,680,541,513,697,723,743,744,769,741,741,738,769,772,779,743,714,724}, + {767,771,697,756,766,752,710,477,602,783,746,766,692,708,783,782,761,778,787,785}, + {483,588,700,665,665,640,650,717,699,707,692,698,700,692,668,650,609,610,540,484}, + {507,618,788,766,754,692,709,785,788,770,793,785,799,784,767,776,789,759,761,495}, + {709,712,706,678,661,604,503,480,653,664,664,639,621,675,695,689,704,681,711,709}, + {788,740,770,768,771,776,732,749,739,764,714,492,544,783,714,708,717,559,739,768}, + {758,771,789,779,777,799,791,785,779,779,752,675,718,510,501,600,727,750,752,758}, + {759,765,676,658,774,767,737,749,769,784,778,738,755,769,788,756,473,530,777,725}, + {669,665,721,653,499,774,780,781,767,561,690,747,722,779,757,727,764,745,770,736}, + {731,768,745,775,783,782,715,741,786,673,766,777,764,730,773,769,774,781,778,764}, + {557,505,545,604,660,672,604,596,580,612,587,556,546,597,530,494,437,480,546,555}, + {560,588,510,495,606,720,718,742,756,755,767,774,776,778,772,772,776,776,754,592}, + {680,644,620,612,516,477,471,499,502,598,664,588,656,682,689,671,668,672,682,692}, + {757,778,781,799,775,750,799,758,789,774,489,579,799,739,774,723,686,788,787,778}, + {705,685,654,680,672,680,657,579,574,619,639,518,482,545,665,587,540,599,606,651}, + {729,767,767,773,783,778,793,773,784,779,757,768,686,654,679,564,483,549,490,522}, + {725,693,715,588,522,629,721,647,697,684,614,725,708,674,715,729,717,725,689,738}, + {797,783,795,797,782,757,636,624,508,517,703,750,746,757,772,771,774,790,779,799}, + {556,591,652,692,728,712,698,688,704,718,728,717,713,693,716,558,490,540,620,678}, + {532,617,777,775,763,789,768,785,778,791,792,792,793,777,781,724,551,665,540,509}, + {710,697,706,717,673,679,620,581,546,474,562,684,680,675,660,656,702,680,701,708}, + {771,793,788,787,794,791,792,783,791,792,733,770,532,525,692,761,777,753,734,728}, + {724,695,678,652,695,735,697,712,714,721,696,710,569,581,570,522,642,704,748,726}, + {796,754,785,782,732,814,803,794,799,790,810,806,794,797,756,745,749,506,741,779}, + {793,767,785,780,724,648,488,747,784,771,793,740,759,805,794,796,795,795,801,806}, + {787,508,640,775,722,792,774,705,781,801,774,800,786,806,808,783,795,797,784,782}, + {654,649,601,597,594,667,646,662,615,623,651,671,669,674,682,653,624,484,473,665}, + {790,765,479,527,746,728,770,753,721,774,794,802,789,782,803,795,764,804,779,776}, + {738,699,642,509,515,501,466,614,702,612,683,720,687,717,704,739,714,733,721,718}, + {778,795,791,786,758,783,783,743,744,527,554,789,762,767,722,722,777,788,776,782}, + {694,696,700,696,709,710,696,689,674,662,581,538,496,637,644,681,679,671,689,704}, + {776,788,742,796,779,756,788,789,782,798,795,804,771,753,571,611,504,545,593,779}, + {799,717,747,682,487,573,766,774,775,762,711,802,799,796,790,787,802,789,773,786}, + {795,797,790,804,788,791,774,706,532,770,786,743,789,708,755,785,804,803,807,770}, + {568,722,738,680,713,703,693,749,703,705,740,720,712,631,621,727,730,722,574,612}, + {626,762,734,770,759,750,792,775,790,792,788,786,791,767,782,778,794,745,504,544}, + {774,784,779,753,654,560,530,532,555,699,742,695,716,767,770,772,778,780,779,782}, + {781,781,790,783,792,798,787,792,765,740,701,537,564,773,767,756,786,797,789,801}, + {738,717,799,794,772,784,774,790,788,748,789,769,768,763,504,587,783,751,784,732}, + {776,789,763,772,800,786,802,787,805,799,776,773,792,761,750,702,532,745,807,735}, + {765,778,764,484,607,791,757,760,700,687,789,777,779,783,768,791,778,757,784,770}, + {800,825,775,782,821,679,805,824,752,824,796,785,829,817,824,803,814,807,762,779} +}; +/*-------------------------------------------------------------------* + * FD CNG + *-------------------------------------------------------------------*/ + +const Word16 d_array[SIZE_SCALE_TABLE_CN] = { 1, 2, 5, 8, 10, 15, 20, 30, 40, 60, 80, 120, 140, 160, 180, 220, 260, 300 }; +const Word16 m_array[SIZE_SCALE_TABLE_CN] = { 0/*0.000f Q15*/, 8520/*0.260f Q15*/, 15729/*0.480f Q15*/, 19005/*0.580f Q15*/, 19988/*0.610f Q15*/, 21889/*0.668f Q15*/, 23101/*0.705f Q15*/, 24969/*0.762f Q15*/, 26214/*0.800f Q15*/, 27558/*0.841f Q15*/, 28344/*0.865f Q15*/, 29164/*0.890f Q15*/, 29491/*0.900f Q15*/, 29819/*0.910f Q15*/, 30147/*0.920f Q15*/, 30474/*0.930f Q15*/, 30638/*0.935f Q15*/, 30802/*0.940f Q15*/ }; +const Word16 msQeqInvAv_thresh[3] = { 328/*0.01f Q15*/, 983/*0.03f Q15*/, 1638/*0.05f Q15*/ }; +const Word16 msNoiseSlopeMax[4] = { 32767/*2.f Q14*/, 26214/*1.6f Q14*/, 21299/*1.3f Q14*/, 18022/*1.1f Q14*/ }; + + +const SCALE_SETUP scaleTableStereo[SIZE_SCALE_TABLE_STEREO] = +{ + { 1, 0, 8000, /* -5.5f,*/ -704/*-5.5f Q7*/, -704 }, + { 1, 8000, 9600, /* -5.0f,*/ -640/*-5.0f Q7*/, -640 }, + { 1, 9600, 13200, /* -4.0f,*/ -512/*-4.0f Q7*/, -512 }, + { 1, 13200, 16400, /* -3.0f,*/ -384/*-3.0f Q7*/, -384 }, + { 1, 16400, 24400, /* -1.6f,*/ -204/*-1.6f Q7*/, -204 }, + { 1, 24400, 32000, /* -0.2f,*/ -26/*-1.6f Q7*/, -26 }, + { 1, 32000,512001, /* 0.0f,*/ 0 /*0.0f Q7*/, 0 }, + + { 2, 0, 8000, /*-0.9f ,*/ -115/*-0.9f Q7*/, -115 }, + { 2, 8000, 9600, /*-0.65f,*/ -83/*-0.65f Q7*/, -83 }, + { 2, 9600, 13200, /*-2.0f ,*/ -256/*-2.0f Q7*/, -256 }, + { 2, 13200, 16400, /*-3.0f ,*/ -384/*-3.0f Q7*/, -384 }, + { 2, 16400, 24400, /*-0.8f ,*/ -102/*-0.8f Q7*/, -102 }, + { 2, 24400, 32000, /*-0.25f,*/ -32/*-0.25f Q7*/, -32 }, + { 2, 32000,512001, /* 0.0f ,*/ 0/* 0.0f Q7*/, 0 } +}; +const SCALE_SETUP scaleTableMono[SIZE_SCALE_TABLE_MONO] = +{ + { 0, 0, 8000, /* -5.5f,*/ -704/*-5.5f Q7*/, -704 }, + { 0, 8000, 9600, /* -5.0f,*/ -640/*-5.0f Q7*/, -640 }, + { 0, 9600, 13200, /* -4.0f,*/ -512/*-4.0f Q7*/, -512 }, + { 0, 13200, 16400, /* -3.0f,*/ -384/*-3.0f Q7*/, -384 }, + { 0, 16400, 24400, /* -1.5f,*/ -192/*-1.5f Q7*/, -192 }, + { 0, 24400,128001, /* -0.5f,*/ -64/*-0.5f Q7*/, -64 }, + + { 1, 0, 8000, /*-5.5f ,*/ -704/*-5.5f Q7*/, -704 }, + { 1, 8000, 9600, /*-5.0f ,*/ -640/*-5.0f Q7*/, -640 }, + { 1, 9600, 13200, /*-1.55f,*/ -198/*-1.55f Q7*/, -198 }, + { 1, 13200, 16400, /*-3.0f ,*/ -384/*-3.0f Q7*/,-384 }, + { 1, 16400, 24400, /*-0.6f ,*/ -77/*-0.6f Q7*/, -77 }, + { 1, 24400, 32000, /*-0.2f ,*/ -26/*-0.2f Q7*/, -26 }, + { 1, 32000,128001, /* 0.0f ,*/ 0/* 0.0f Q7*/, 0 }, + + { 2, 0, 8000, /*-0.9f ,*/ -115/*-0.9f Q7*/, -115 }, + { 2, 8000, 9600, /*-0.65f,*/ -83/*-0.65f Q7*/, -83 }, + { 2, 9600, 13200, /*-2.0f ,*/ -256/*-2.0f Q7*/, -256 }, + { 2, 13200, 16400, /*-3.0f ,*/ -384/*-3.0f Q7*/, -384 }, + { 2, 16400, 24400, /*-0.8f ,*/ -102/*-0.8f Q7*/, -102 }, + { 2, 24400, 32000, /*-0.25f,*/ -32/*-0.25f Q7*/, -32 }, + { 2, 32000,128001, /* 0.0f ,*/ 0/* 0.0f Q7*/,0 } +}; + +const SCALE_SETUP scaleTable_cn_only[SIZE_SCALE_TABLE_CN] = +{ + { 0, 0, 8000, /*-3.5f,*/ 20295/*1.2387211385 Q14*/ /*-3.5f*/, 20295 }, + { 0, 8000, 9600, /*-3.0f,*/ 16306/*0.9952622652 Q14*/ /*-3.0f*/, 16306 }, + { 0, 9600, 13200, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, + { 0, 13200, 16400, /*-2.0f,*/ 9583/*0.5848932266 Q14*/ /*-2.0f*/, 9583 }, + { 0, 16400,128001, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 }, + + { 1, 0, 8000, /*-3.0f,*/ 16306/*0.9952622652 Q14*/ /*-3.0f*/, 16306 }, + { 1, 8000, 9600, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, + { 1, 9600, 13200, /*-1.5f,*/ 6759/*0.4125375748 Q14*/ /*-1.5f*/, 6759 }, + { 1, 13200, 16400, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, + { 1, 16400, 24400, /*-0.5f,*/ 1999/*0.1220184565 Q14*/ /*-0.5f*/, 1999 }, + { 1, 24400,128001, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 }, + + { 2, 0, 8000, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, + { 2, 8000, 9600, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, + { 2, 9600, 13200, /*-2.0f,*/ 9583/*0.5848932266 Q14*/ /*-2.0f*/, 9583 }, + { 2, 13200, 16400, /*-1.0f,*/ 4242/*0.2589254379 Q14*/ /*-1.0f*/, 4242 }, + + { 2, 16400, 24400, /*-0.5f,*/ 1999/*0.1220184565 Q14*/ /*-0.5f*/, 1999 }, + { 2, 24400, 32000, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 }, + { 2, 32000,128001, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 } +}; + +const SCALE_SETUP scaleTable_cn_dirac[15] = +{ + { 0, 0, 13200, /*-3.0f,*/ 16306/*0.9952622652 Q14*/ /*-3.0f*/, 16306 }, + { 0, 13200, 16400, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, + { 0, 16400, 24400, /*-2.0f,*/ 9583/*0.5848932266 Q14*/ /*-2.0f*/, 9583 }, + { 0, 24400, 32000, /*-1.5f,*/ 6759/*0.4125375748 Q14*/ /*-1.5f*/, 6759 }, + { 0, 32000,512001, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 }, + + { 1, 0, 13200, /*-3.0f,*/ 16306/*0.9952622652 Q14*/ /*-3.0f*/, 16306 }, + { 1, 13200, 16400, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, + { 1, 16400, 24400, /*-2.0f,*/ 9583/*0.5848932266 Q14*/ /*-2.0f*/, 9583 }, + { 1, 24400, 32000, /*-1.5f,*/ 6759/*0.4125375748 Q14*/ /*-1.5f*/, 6759 }, + { 1, 32000,512001, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 }, + + { 2, 0, 13200, /*-3.0f,*/ 16306/*0.9952622652 Q14*/ /*-3.0f*/, 16306 }, + { 2, 13200, 16400, /*-2.5f,*/ 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, + { 2, 16400, 24400, /*-2.0f,*/ 9583/*0.5848932266 Q14*/ /*-2.0f*/, 9583 }, + { 2, 24400, 32000, /*-1.5f,*/ 6759/*0.4125375748 Q14*/ /*-1.5f*/, 6759 }, + { 2, 32000,512001, /* 0.0f,*/ 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 } +}; +const Word16 scaleTable_cn_only_amrwbio[3][2] = +{ + { ACELP_6k60, 24771/*1.5118864315 Q14*/ }, + { ACELP_8k85, 16306/*0.9952622652 Q14*/ }, + { ACELP_12k65, 9583/*0.5848932266 Q14*/ }, +}; +const Word32 scaleTable_cn_only_amrwbio_fx_by_10f[SIZE_SCALE_TABLE_CN_AMRWB][2] =//Q29 +{ + { ACELP_6k60, 858993459 }, + { ACELP_8k85, 644245094 }, + { ACELP_12k65, 429496729 } +}; + +const Word16 sidparts_encoder_noise_est[SIZE_SIDPARTS_ENC_NOISE_EST] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 259, 264, 269, 279 }; // Q0 + +const Word16 sidPartitions_nb[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 159 }; // Q0 +const Word16 sidPartitions_wb1[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255 }; // Q0 +const Word16 sidPartitions_wb2[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 259 }; // Q0 +const Word16 sidPartitions_wb3[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 319 }; // Q0 +const Word16 sidPartitions_swb1[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 259, 264, 269, 274 }; // Q0 +const Word16 sidPartitions_swb2[] = { 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 58, 68, 80, 92, 108, 126, 148, 176, 212, 255, 319, 324, 329, 339 }; // Q0 + +const Word16 shapingPartitions_nb[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 136, 159 }; // Q0 +const Word16 shapingPartitions_wb1[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 135, 148, 162, 176, 192, 212, 232, 255 }; // Q0 +const Word16 shapingPartitions_wb2[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 135, 148, 162, 176, 192, 212, 232, 255 }; // Q0 +const Word16 shapingPartitions_wb3[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 136, 148, 176, 212, 256, 308, 319 }; // Q0 +const Word16 shapingPartitions_swb1[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 135, 148, 162, 176, 192, 212, 232, 255 }; // Q0 +const Word16 shapingPartitions_swb2[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 51, 55, 59, 64, 69, 74, 80, 86, 93, 100, 108, 117, 126, 136, 148, 176, 212, 256, 308, 319 }; // Q0 + +const FD_CNG_SETUP FdCngSetup_nb = { 512, 160, sizeof(sidPartitions_nb)/sizeof(Word16), sidPartitions_nb, sizeof(shapingPartitions_nb)/sizeof(Word16), shapingPartitions_nb }; +const FD_CNG_SETUP FdCngSetup_wb1 = { 512, 256, sizeof(sidPartitions_wb1)/sizeof(Word16), sidPartitions_wb1, sizeof(shapingPartitions_wb1)/sizeof(Word16), shapingPartitions_wb1 }; +const FD_CNG_SETUP FdCngSetup_wb2 = { 512, 256, sizeof(sidPartitions_wb2)/sizeof(Word16), sidPartitions_wb2, sizeof(shapingPartitions_wb2)/sizeof(Word16), shapingPartitions_wb2 }; +const FD_CNG_SETUP FdCngSetup_wb3 = { 640, 320, sizeof(sidPartitions_wb3)/sizeof(Word16), sidPartitions_wb3, sizeof(shapingPartitions_wb3)/sizeof(Word16), shapingPartitions_wb3 }; +const FD_CNG_SETUP FdCngSetup_swb1 = { 512, 256, sizeof(sidPartitions_swb1)/sizeof(Word16), sidPartitions_swb1, sizeof(shapingPartitions_swb1)/sizeof(Word16), shapingPartitions_swb1 }; +const FD_CNG_SETUP FdCngSetup_swb2 = { 640, 320, sizeof(sidPartitions_swb2)/sizeof(Word16), sidPartitions_swb2, sizeof(shapingPartitions_swb2)/sizeof(Word16), shapingPartitions_swb2 }; + + +const Word16 levels_37bits[FD_CNG_stages_37bits] = { 128, 64, 64, 64, 64, 64 }; // Q0 +const Word16 bits_37bits[FD_CNG_stages_37bits] = { 7, 6, 6, 6, 6, 6 }; // Q0 + +/* IDCT_MATRIX_ROM: 18*24 Word16 = 432 Word16 */ +/* or compressed IDCT_MATRIX_ROM: 18*24 Word8 + 25 = 230 Word16 + WMOPS (INDIRECT(432) and STORE(432) ) */ + +/* Stage1 Word8 tables 16x8+ 17*10+ 17*16 + 78*18 = = 1974 Word8 -> 987 Word16 */ + +/* ROM storeSizeW8 = W8reduction (3072- (987+230) )/3072 = 1207/3072 --> 39.3 % */ +/* ROM with DCTII-24 in PROM = W8reduction (3072- (987) )/3072 = /3072 --> 31.8 % */ + +/* additional minor Table ROM ( dct_mid points 18 Word16, dct_col_upshifts 52, scaleFactors 2*2 = ~= 74 Word16s */ + + +const Word16 cdk1_ivas_entries_per_segment[FDCNG_VQ_DCT_NSEGM] = { 16, 17, 17, 78 }; // Q0 +const Word16 cdk1_ivas_cum_entries_per_segment[FDCNG_VQ_DCT_NSEGM + 1] = { 0, 16 ,33, 50, 128 }; // Q0 +const Word16 /* DCT trunc_len */ cdk1_ivas_cols_per_segment[FDCNG_VQ_DCT_NSEGM] = { FDCNG_VQ_DCT_MINTRUNC, 10, 16, FDCNG_VQ_DCT_MAXTRUNC }; /* 8, 10, 16, 18 */ +const Word16 /* segment inner DCT trunc_len */ cdk1_ivas_trunc_dct_cols_per_segment[FDCNG_VQ_DCT_NSEGM] = { FDCNG_VQ_DCT_MAXTRUNC - FDCNG_VQ_DCT_MINTRUNC, FDCNG_VQ_DCT_MAXTRUNC - 10 , FDCNG_VQ_DCT_MAXTRUNC - 16 , 0 }; + +/* to get back to FDCNG VQ domain for segment S use : idct as follows */ +/* cdk1r_vec[col, row] = cdk1r_tr_midQ_truncQ(col 1:24 ) + invScaleFQ * idctMat( cdk1_ivas_dct_sS_W8[1:col]<fftlen/2+1; j++) hs->fftSineTab[j] = (float)sin(2.0*EVS_PI*j/hs->fftlen); */ + + +const Word32 olapWinAna512_fx[512] = { /* Q30 */ + 4658693, 13975905, 23292590, 32608396, 41922980, 51235980, 60547056, 69855848, + 79162008, 88465192, 97765048, 107061216, 116353360, 125641120, 134924144, 144202096, + 153474624, 162741360, 172001968, 181256112, 190503440, 199743568, 208976192, 218200960, + 227417488, 236625472, 245824528, 255014368, 264194560, 273364832, 282524800, 291674144, + 300812512, 309939520, 319054880, 328158240, 337249248, 346327520, 355392768, 364444672, + 373482816, 382506912, 391516576, 400511584, 409491456, 418455904, 427404576, 436337216, + 445253408, 454152800, 463035104, 471900032, 480747136, 489576160, 498386752, 507178592, + 515951328, 524704608, 533438144, 542151616, 550844672, 559516992, 568168256, 576798144, + 585406272, 593992320, 602556096, 611097152, 619615168, 628109888, 636580992, 645028096, + 653450880, 661849088, 670222400, 678570432, 686892992, 695189632, 703460096, 711704128, + 719921344, 728111424, 736274112, 744409088, 752515968, 760594560, 768644608, 776665664, + 784657408, 792619584, 800552064, 808454272, 816326144, 824167232, 831977280, 839756032, + 847503104, 855218368, 862901376, 870551936, 878169728, 885754432, 893305728, 900823488, + 908307264, 915756864, 923171904, 930552256, 937897664, 945207680, 952482048, 959720640, + 966923136, 974089152, 981218496, 988310912, 995366080, 1002383808, 1009363840, 1016305856, + 1023209536, 1030074688, 1036901120, 1043688512, 1050436672, 1057145152, 1063813888, 1070442688, + 1077031040, 1083578880, 1090085888, 1096551936, 1102976640, 1109359872, 1115701248, 1122000640, + 1128257792, 1134472576, 1140644480, 1146773504, 1152859392, 1158901888, 1164900608, 1170855680, + 1176766592, 1182633088, 1188455168, 1194232448, 1199964800, 1205651968, 1211293824, 1216889984, + 1222440320, 1227944704, 1233402752, 1238814464, 1244179456, 1249497600, 1254768768, 1259992704, + 1265169152, 1270297984, 1275378944, 1280411904, 1285396736, 1290333056, 1295220992, 1300060032, + 1304850048, 1309591040, 1314282624, 1318924928, 1323517440, 1328060032, 1332552832, 1336995328, + 1341387520, 1345729152, 1350020224, 1354260352, 1358449536, 1362587648, 1366674432, 1370709632, + 1374693376, 1378625408, 1382505344, 1386333312, 1390109184, 1393832576, 1397503616, 1401121920, + 1404687488, 1408200320, 1411659904, 1415066496, 1418419840, 1421719680, 1424966016, 1428158720, + 1431297664, 1434382720, 1437413760, 1440390656, 1443313408, 1446181632, 1448995584, 1451755008, + 1454459648, 1457109632, 1459704704, 1462244864, 1464729856, 1467159808, 1469534464, 1471853824, + 1474117760, 1476326272, 1478479104, 1480576256, 1482617728, 1484603264, 1486533120, 1488406912, + 1490224640, 1491986176, 1493691648, 1495340800, 1496933760, 1498470400, 1499950464, 1501374080, + 1502741248, 1504051840, 1505305856, 1506503168, 1507643648, 1508727424, 1509754368, 1510724480, + 1511637888, 1512494208, 1513293568, 1514035968, 1514721408, 1515349760, 1515921152, 1516435456, + 1516892672, 1517292672, 1517635584, 1517921408, 1518150144, 1518321664, 1518435968, 1518493184, + 1518493184, 1518435968, 1518321664, 1518150144, 1517921408, 1517635584, 1517292672, 1516892672, + 1516435456, 1515921152, 1515349760, 1514721408, 1514035968, 1513293568, 1512494208, 1511637888, + 1510724480, 1509754368, 1508727424, 1507643648, 1506503040, 1505305728, 1504051840, 1502741248, + 1501374080, 1499950464, 1498470272, 1496933760, 1495340800, 1493691648, 1491986176, 1490224640, + 1488406784, 1486533120, 1484603264, 1482617728, 1480576256, 1478479104, 1476326272, 1474117760, + 1471853824, 1469534464, 1467159808, 1464729856, 1462244864, 1459704704, 1457109504, 1454459648, + 1451754880, 1448995584, 1446181632, 1443313408, 1440390656, 1437413760, 1434382720, 1431297664, + 1428158720, 1424966016, 1421719680, 1418419712, 1415066496, 1411659904, 1408200192, 1404687488, + 1401121920, 1397503488, 1393832576, 1390109056, 1386333312, 1382505344, 1378625280, 1374693376, + 1370709632, 1366674432, 1362587648, 1358449536, 1354260352, 1350020096, 1345729024, 1341387392, + 1336995200, 1332552704, 1328060032, 1323517440, 1318924800, 1314282624, 1309590912, 1304850048, + 1300059904, 1295220864, 1290333056, 1285396736, 1280411904, 1275378944, 1270297856, 1265169024, + 1259992576, 1254768640, 1249497600, 1244179456, 1238814336, 1233402752, 1227944576, 1222440192, + 1216889984, 1211293696, 1205651840, 1199964672, 1194232320, 1188455040, 1182632960, 1176766464, + 1170855552, 1164900608, 1158901760, 1152859264, 1146773504, 1140644352, 1134472448, 1128257664, + 1122000640, 1115701120, 1109359744, 1102976512, 1096551808, 1090085760, 1083578752, 1077030912, + 1070442560, 1063813824, 1057145088, 1050436608, 1043688448, 1036901056, 1030074624, 1023209472, + 1016305728, 1009363776, 1002383744, 995365952, 988310848, 981218432, 974089024, 966922944, + 959720576, 952481920, 945207488, 937897472, 930552192, 923171840, 915756736, 908307072, + 900823296, 893305664, 885754240, 878169600, 870551808, 862901248, 855218240, 847503040, + 839755968, 831977216, 824167104, 816326016, 808454208, 800551936, 792619520, 784657280, + 776665472, 768644480, 760594496, 752515904, 744408960, 736273984, 728111296, 719921216, + 711704000, 703460032, 695189504, 686892864, 678570368, 670222272, 661848960, 653450752, + 645027968, 636580864, 628109760, 619615104, 611097024, 602555968, 593992256, 585406144, + 576798016, 568168128, 559516864, 550844544, 542151488, 533438016, 524704480, 515951200, + 507178432, 498386592, 489576032, 480747008, 471899904, 463035040, 454152672, 445253280, + 436337056, 427404480, 418455744, 409491328, 400511456, 391516512, 382506816, 373482688, + 364444544, 355392672, 346327392, 337249088, 328158112, 319054752, 309939392, 300812384, + 291674016, 282524672, 273364704, 264194448, 255014224, 245824400, 236625328, 227417360, + 218200832, 208976064, 199743440, 190503312, 181255984, 172001856, 162741232, 153474480, + 144201968, 134924016, 125640984, 116353224, 107061080, 97764912, 88465064, 79161880, + 69855712, 60546920, 51235848, 41922844, 32608264, 23292456, 13975772, 4658560 +}; + +const Word32 olapWinAna640_fx[640] = { /* Q30 */ + 3726956, 11180779, 18634332, 26087438, 33539914, 40991584, 48442264, 55891776, + 63339940, 70786584, 78231520, 85674560, 93115552, 100554288, 107990608, 115424328, + 122855256, 130283240, 137708080, 145129584, 152547616, 159961952, 167372448, 174778896, + 182181152, 189579008, 196972288, 204360832, 211744464, 219122960, 226496192, 233863984, + 241226128, 248582448, 255932784, 263276976, 270614784, 277946112, 285270720, 292588448, + 299899136, 307202592, 314498688, 321787136, 329067872, 336340672, 343605344, 350861792, + 358109728, 365349088, 372579616, 379801184, 387013568, 394216640, 401410208, 408594112, + 415768160, 422932192, 430086016, 437229536, 444362464, 451484736, 458596064, 465696416, + 472785504, 479863168, 486929344, 493983712, 501026240, 508056672, 515074880, 522080640, + 529073824, 536054304, 543021824, 549976256, 556917440, 563845248, 570759424, 577659840, + 584546368, 591418816, 598276992, 605120768, 611949952, 618764352, 625563904, 632348352, + 639117568, 645871424, 652609664, 659332224, 666038848, 672729472, 679403776, 686061824, + 692703360, 699328128, 705936064, 712526976, 719100736, 725657216, 732196160, 738717440, + 745220992, 751706496, 758173952, 764623104, 771053888, 777466048, 783859456, 790234048, + 796589568, 802925888, 809242816, 815540288, 821818048, 828076096, 834314176, 840532096, + 846729856, 852907136, 859063872, 865199872, 871315072, 877409344, 883482368, 889534144, + 895564480, 901573248, 907560320, 913525504, 919468672, 925389632, 931288320, 937164672, + 943018240, 948849280, 954657344, 960442432, 966204416, 971943104, 977658304, 983350016, + 989017984, 994662144, 1000282368, 1005878464, 1011450368, 1016997760, 1022520768, 1028019136, + 1033492736, 1038941376, 1044364992, 1049763520, 1055136768, 1060484416, 1065806656, 1071103168, + 1076373888, 1081618688, 1086837376, 1092029952, 1097196160, 1102335872, 1107449088, 1112535680, + 1117595392, 1122628224, 1127633920, 1132612480, 1137563776, 1142487680, 1147383936, 1152252672, + 1157093632, 1161906688, 1166691712, 1171448576, 1176177280, 1180877696, 1185549568, 1190193024, + 1194807680, 1199393536, 1203950464, 1208478464, 1212977408, 1217447040, 1221887232, 1226298112, + 1230679424, 1235031040, 1239352960, 1243644928, 1247907072, 1252139008, 1256340864, 1260512384, + 1264653440, 1268764288, 1272844288, 1276893824, 1280912512, 1284900352, 1288857216, 1292782976, + 1296677760, 1300541056, 1304373120, 1308173824, 1311942912, 1315680512, 1319386240, 1323060224, + 1326702336, 1330312576, 1333890688, 1337436672, 1340950400, 1344431872, 1347880960, 1351297536, + 1354681472, 1358032896, 1361351424, 1364637312, 1367890304, 1371110272, 1374297216, 1377451008, + 1380571776, 1383659136, 1386713216, 1389733760, 1392720896, 1395674496, 1398594432, 1401480704, + 1404333312, 1407151872, 1409936640, 1412687360, 1415404160, 1418086784, 1420735232, 1423349376, + 1425929344, 1428475008, 1430986112, 1433462784, 1435904896, 1438312448, 1440685312, 1443023360, + 1445326848, 1447595392, 1449828992, 1452027776, 1454191616, 1456320256, 1458413824, 1460472448, + 1462495616, 1464483712, 1466436480, 1468353920, 1470235904, 1472082688, 1473893760, 1475669376, + 1477409536, 1479113984, 1480782720, 1482416000, 1484013440, 1485575040, 1487100928, 1488591104, + 1490045184, 1491463424, 1492845824, 1494192256, 1495502592, 1496776960, 1498015232, 1499217280, + 1500383360, 1501513344, 1502606976, 1503664512, 1504685824, 1505670912, 1506619520, 1507532032, + 1508408192, 1509247872, 1510051200, 1510818304, 1511548928, 1512243072, 1512900864, 1513522176, + 1514107008, 1514655360, 1515167104, 1515642496, 1516081408, 1516483584, 1516849280, 1517178496, + 1517471232, 1517727232, 1517946752, 1518129664, 1518276096, 1518385792, 1518459008, 1518495488, + 1518495488, 1518459008, 1518385792, 1518276096, 1518129664, 1517946752, 1517727232, 1517471104, + 1517178496, 1516849280, 1516483584, 1516081280, 1515642496, 1515167104, 1514655360, 1514107008, + 1513522176, 1512900864, 1512243072, 1511548928, 1510818304, 1510051200, 1509247872, 1508408192, + 1507532032, 1506619520, 1505670912, 1504685696, 1503664512, 1502606976, 1501513344, 1500383360, + 1499217280, 1498015232, 1496776960, 1495502592, 1494192128, 1492845824, 1491463424, 1490045184, + 1488590976, 1487100928, 1485575040, 1484013312, 1482416000, 1480782720, 1479113984, 1477409536, + 1475669376, 1473893760, 1472082560, 1470235904, 1468353920, 1466436480, 1464483712, 1462495616, + 1460472320, 1458413824, 1456320256, 1454191488, 1452027776, 1449828992, 1447595392, 1445326848, + 1443023360, 1440685312, 1438312448, 1435904768, 1433462656, 1430986112, 1428474880, 1425929344, + 1423349376, 1420735104, 1418086784, 1415404160, 1412687360, 1409936640, 1407151872, 1404333184, + 1401480704, 1398594432, 1395674496, 1392720896, 1389733760, 1386713088, 1383659008, 1380571648, + 1377451008, 1374297216, 1371110272, 1367890304, 1364637312, 1361351424, 1358032768, 1354681472, + 1351297408, 1347880832, 1344431744, 1340950272, 1337436672, 1333890688, 1330312576, 1326702336, + 1323060224, 1319386240, 1315680384, 1311942912, 1308173696, 1304373120, 1300541056, 1296677632, + 1292782848, 1288857088, 1284900224, 1280912512, 1276893696, 1272844288, 1268764160, 1264653440, + 1260512256, 1256340736, 1252138880, 1247906944, 1243644800, 1239352832, 1235030912, 1230679296, + 1226297984, 1221887104, 1217446912, 1212977280, 1208478336, 1203950464, 1199393408, 1194807552, + 1190192896, 1185549440, 1180877696, 1176177280, 1171448576, 1166691584, 1161906560, 1157093504, + 1152252544, 1147383808, 1142487552, 1137563648, 1132612352, 1127633792, 1122628096, 1117595264, + 1112535552, 1107448960, 1102335872, 1097196032, 1092029824, 1086837248, 1081618560, 1076373888, + 1071103104, 1065806592, 1060484352, 1055136576, 1049763456, 1044364928, 1038941312, 1033492608, + 1028019072, 1022520704, 1016997696, 1011450240, 1005878400, 1000282304, 994662080, 989017920, + 983349888, 977658240, 971942976, 966204288, 960442368, 954657280, 948849152, 943018176, + 937164480, 931288192, 925389504, 919468544, 913525312, 907560192, 901573184, 895564416, + 889534016, 883482304, 877409152, 871314944, 865199808, 859063744, 852907008, 846729728, + 840532032, 834314112, 828075968, 821817984, 815540096, 809242752, 802925696, 796589376, + 790233856, 783859392, 777465984, 771053824, 764622976, 758173824, 751706432, 745220864, + 738717312, 732196032, 725657088, 719100608, 712526848, 705935936, 699328000, 692703232, + 686061760, 679403712, 672729280, 666038720, 659332096, 652609536, 645871296, 639117440, + 632348224, 625563776, 618764224, 611949824, 605120640, 598276864, 591418688, 584546240, + 577659712, 570759296, 563845120, 556917312, 549976128, 543021696, 536054144, 529073696, + 522080512, 515074752, 508056512, 501026112, 493983648, 486929216, 479863072, 472785376, + 465696288, 458596000, 451484608, 444362336, 437229408, 430085952, 422932064, 415768032, + 408593952, 401410080, 394216512, 387013440, 379801024, 372579456, 365348960, 358109632, + 350861664, 343605248, 336340544, 329067744, 321787008, 314498528, 307202464, 299899008, + 292588320, 285270592, 277945984, 270614656, 263276832, 255932656, 248582320, 241225984, + 233863840, 226496064, 219122832, 211744320, 204360704, 196972144, 189578864, 182181008, + 174778768, 167372304, 159961824, 152547472, 145129456, 137707936, 130283104, 122855136, + 115424192, 107990472, 100554160, 93115416, 85674432, 78231384, 70786448, 63339808, + 55891640, 48442128, 40991448, 33539780, 26087306, 18634200, 11180647, 3726823 +}; + +/* Synthesis windows for overlap-add */ +/* for (j=0; jfftlen; j++) hs->olapWinSyn[j] = (float)sin(EVS_PI*((float)j+0.5f)/(float)(hs->fftlen); */ + +const Word16 olapWinSyn256_fx[256] = +{//Q15 + 201, 603, 1005, 1407, 1808, 2210, 2611, 3011, 3411, 3811, 4210, 4609, 5006, 5403, 5800, 6195, + 6589, 6983, 7375, 7766, 8156, 8545, 8933, 9319, 9704, 10087, 10469, 10849, 11228, 11605, 11980, 12353, + 12725, 13094, 13462, 13828, 14191, 14552, 14912, 15269, 15623, 15976, 16325, 16673, 17018, 17360, 17700, 18037, + 18371, 18703, 19032, 19358, 19681, 20001, 20318, 20631, 20942, 21250, 21555, 21856, 22154, 22448, 22740, 23027, + 23312, 23593, 23870, 24144, 24414, 24680, 24943, 25201, 25457, 25708, 25955, 26199, 26438, 26674, 26905, 27133, + 27356, 27576, 27791, 28002, 28208, 28411, 28609, 28803, 28993, 29178, 29359, 29535, 29707, 29874, 30037, 30196, + 30350, 30499, 30644, 30784, 30919, 31050, 31176, 31298, 31414, 31526, 31634, 31736, 31834, 31927, 32015, 32098, + 32176, 32250, 32319, 32383, 32442, 32496, 32545, 32589, 32629, 32663, 32693, 32718, 32737, 32752, 32762, 32767, + 32767, 32762, 32752, 32737, 32718, 32693, 32663, 32629, 32589, 32545, 32496, 32442, 32383, 32319, 32250, 32176, + 32098, 32015, 31927, 31834, 31736, 31634, 31526, 31414, 31298, 31176, 31050, 30919, 30784, 30644, 30499, 30350, + 30196, 30037, 29874, 29707, 29535, 29359, 29178, 28993, 28803, 28609, 28411, 28208, 28002, 27791, 27576, 27356, + 27133, 26905, 26674, 26438, 26199, 25955, 25708, 25457, 25201, 24943, 24680, 24414, 24144, 23870, 23593, 23312, + 23027, 22740, 22448, 22154, 21856, 21555, 21250, 20942, 20631, 20318, 20001, 19681, 19358, 19032, 18703, 18371, + 18037, 17700, 17360, 17018, 16673, 16325, 15976, 15623, 15269, 14912, 14552, 14191, 13828, 13462, 13094, 12725, + 12353, 11980, 11605, 11228, 10849, 10469, 10087, 9704, 9319, 8933, 8545, 8156, 7766, 7375, 6983, 6589, + 6195, 5800, 5403, 5006, 4609, 4210, 3811, 3411, 3011, 2611, 2210, 1808, 1407, 1005, 603, 201 +}; + + +const Word16 olapWinSyn320_fx[320] = +{//Q15 + 160, 482, 804, 1125, 1447, 1768, 2089, 2410, 2731, 3051, + 3371, 3691, 4011, 4330, 4648, 4967, 5284, 5602, 5918, 6234, + 6550, 6865, 7179, 7493, 7805, 8117, 8429, 8739, 9049, 9358, + 9665, 9972, 10278, 10583, 10887, 11190, 11492, 11793, 12092, 12391, + 12688, 12984, 13278, 13572, 13864, 14155, 14444, 14732, 15019, 15304, + 15588, 15870, 16151, 16430, 16707, 16983, 17258, 17530, 17801, 18070, + 18338, 18604, 18868, 19130, 19390, 19648, 19905, 20159, 20412, 20663, + 20911, 21158, 21403, 21645, 21886, 22124, 22360, 22594, 22826, 23056, + 23283, 23509, 23732, 23952, 24171, 24387, 24600, 24812, 25021, 25227, + 25431, 25633, 25832, 26029, 26223, 26415, 26604, 26790, 26974, 27155, + 27334, 27510, 27684, 27854, 28023, 28188, 28351, 28511, 28668, 28822, + 28974, 29123, 29269, 29412, 29552, 29690, 29825, 29956, 30085, 30211, + 30334, 30455, 30572, 30686, 30797, 30906, 31011, 31114, 31213, 31309, + 31403, 31493, 31581, 31665, 31746, 31824, 31899, 31971, 32040, 32106, + 32169, 32229, 32285, 32339, 32389, 32436, 32480, 32521, 32559, 32594, + 32625, 32653, 32679, 32701, 32720, 32736, 32748, 32758, 32764, 32767, + 32767, 32764, 32758, 32748, 32736, 32720, 32701, 32679, 32653, 32625, + 32594, 32559, 32521, 32480, 32436, 32389, 32339, 32285, 32229, 32169, + 32106, 32040, 31971, 31899, 31824, 31746, 31665, 31581, 31493, 31403, + 31309, 31213, 31114, 31011, 30906, 30797, 30686, 30572, 30455, 30334, + 30211, 30085, 29956, 29825, 29690, 29552, 29412, 29269, 29123, 28974, + 28822, 28668, 28511, 28351, 28188, 28023, 27854, 27684, 27510, 27334, + 27155, 26974, 26790, 26604, 26415, 26223, 26029, 25832, 25633, 25431, + 25227, 25021, 24812, 24600, 24387, 24171, 23952, 23732, 23509, 23283, + 23056, 22826, 22594, 22360, 22124, 21886, 21645, 21403, 21158, 20911, + 20663, 20412, 20159, 19905, 19648, 19390, 19130, 18868, 18604, 18338, + 18070, 17801, 17530, 17258, 16983, 16707, 16430, 16151, 15870, 15588, + 15304, 15019, 14732, 14444, 14155, 13864, 13572, 13278, 12984, 12688, + 12391, 12092, 11793, 11492, 11190, 10887, 10583, 10278, 9972, 9665, + 9358, 9049, 8739, 8429, 8117, 7805, 7493, 7179, 6865, 6550, + 6234, 5918, 5602, 5284, 4967, 4648, 4330, 4011, 3691, 3371, + 3051, 2731, 2410, 2089, 1768, 1447, 1125, 804, 482, 160 +}; + +/*-------------------------------------------------------------------* + * AMR-WB ISF codebook - common 1st stage for 46bit and 36bit codebooks, + * 2 splits + * + * codebook vector dimension number of vectors + * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ + * 1_1 9 256 + * 1_2 7 256 + *-------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------* + * 1nd stage, 1st split: ISF0 to ISF8 + *-------------------------------------------------------------------*/ + +const Word16 dico1_isf_fx[] = +{/*Qlog2(2.56)*/ + 740, 1263, 1292, 1006, 997, 1019, 1017, 976, 923, + 557, 946, 1049, 867, 846, 990, 1112, 1262, 1241, + 633, 898, 996, 756, 662, 683, 783, 909, 996, + 830, 736, 278, 820, 1254, 686, 712, 1039, 473, + 503, 885, 1508, 1307, 1282, 1172, 1119, 1209, 1061, + 416, 719, 989, 1227, 1001, 1052, 954, 741, 1044, + 585, 1132, 1233, 1091, 1247, 1433, 1512, 1448, 1314, + -31, 469, 803, 659, 619, 658, 843, 987, 1113, + 842, 1678, 1841, 1549, 1474, 1256, 1082, 905, 742, + 370, 1216, 1768, 1633, 1212, 636, 22, -330, 71, + 73, 738, 893, 968, 993, 1768, 2273, 1840, 1391, + 1513, 1714, 1238, 534, 276, 315, 461, 459, 508, + 421, 1293, 1640, 1623, 1742, 1617, 1499, 1284, 1006, + -95, 752, 1680, 1569, 1618, 1436, 1200, 980, 712, + -78, 831, 1194, 1110, 1378, 1481, 1492, 1365, 1217, + 670, 1208, 1168, 860, 742, 601, 528, 403, 309, + 397, 621, 966, 752, 579, 398, 400, 329, 252, + 510, 864, 1108, 807, 939, 902, 925, 717, 481, + 539, 835, 913, 719, 617, 544, 591, 565, 642, + 162, 889, 654, 108, -34, 244, 488, 561, 532, + -62, 1033, 1308, 1035, 1127, 1098, 1029, 961, 823, + -14, 945, 990, 801, 755, 815, 847, 913, 892, + 394, 1765, 1666, 1339, 1117, 806, 642, 479, 380, + 529, 1851, 2003, 1228, 622, -41, -416, 344, 819, + 635, 1058, 883, 492, 372, 312, 317, 274, 241, + 279, 966, 1642, 1478, 1463, 1123, 795, 525, 339, + 457, 955, 1177, 1214, 1427, 1457, 1345, 917, 539, + 148, 751, 1515, 1105, 867, 606, 474, 448, 399, + 579, 1081, 1035, 390, 3, -263, -198, -82, 38, + 18, -68, -12, 313, 761, 405, 249, 111, -76, + -91, 827, 948, 648, 613, 535, 522, 490, 421, + 41, -44, -281, -472, 652, 534, 193, 135, -90, + 41, -121, -356, -60, 663, 307, 61, -48, -344, + -118, -204, 328, 512, 870, 793, 610, 402, 186, + 156, 293, 74, -338, -475, -897, -594, -161, -497, + 226, 131, -138, 307, 169, -271, -164, -387, -624, + 62, -32, -61, -252, -541, -828, -1027, -523, -662, + 102, -61, 141, 112, -270, -251, -541, 25, -150, + 6, -132, -356, -686, -96, -322, -522, -31, -326, + -36, -209, -521, -229, 307, -132, -5, -99, -384, + 60, -51, -237, -668, -973, -407, -708, -75, -172, + 26, -138, -266, 111, -302, 43, -278, -356, -359, + 570, 822, 496, -154, -312, -92, 137, 279, 371, + -146, 368, 409, 68, 6, 77, 167, 202, 162, + -103, 294, 607, 415, 483, 462, 480, 431, 408, + -120, -338, -612, -524, 584, 331, 92, 433, 276, + -178, -293, -154, -41, 269, 100, -9, 213, 160, + -218, -304, 463, 454, 397, 273, 202, 286, 273, + -232, 7, 6, -388, -472, -427, -378, -167, -100, + -294, -183, 134, -47, 101, -88, -84, -117, -3, + 57, 17, -202, -634, -989, -1119, -533, 176, -36, + 120, -28, 23, 111, -319, 318, -22, -77, 266, + -271, -464, -434, -658, -640, -385, -385, -99, -69, + -198, -259, -266, -44, -39, -139, -137, 171, 66, + 9, -145, -377, -846, -1000, -111, -325, 342, 135, + -81, -286, -380, 192, -57, 307, 76, -24, -140, + 677, 702, 247, 56, 249, 141, -105, -236, -99, + 36, -39, -69, 348, 198, -93, 322, 91, -72, + -127, -376, -657, 139, 623, 223, 501, 306, 220, + -113, -384, -796, 504, 438, 85, 213, -83, -194, + -174, -422, 7, 1155, 1089, 1182, 1003, 945, 806, + 8, -126, -317, -103, -351, -695, -98, -268, -537, + 33, -103, -290, 167, -39, -407, 44, -208, -375, + 104, -23, -64, -291, -637, -851, -1084, -61, -112, + -75, -306, -434, 218, -148, -354, -680, -133, -216, + -121, -377, -718, -97, -130, -361, -156, -379, -599, + -56, -254, -586, 235, 157, -214, 11, -260, -149, + -124, -267, -397, -580, -593, -527, -805, -385, 346, + -193, -440, -708, -351, -141, -255, -499, -147, -185, + 448, 660, 494, 208, 509, 461, 338, 291, 149, + -223, 88, 335, 159, 212, 191, 286, 308, 205, + -171, -242, 514, 362, 295, 524, 552, 694, 585, + -64, -308, -448, -21, 284, 786, 446, 289, 92, + -218, -390, -7, 169, 206, 330, 352, 408, 358, + -36, 702, 959, 859, 861, 1115, 1269, 1357, 1305, + -133, -341, -65, 678, 417, 440, 486, 518, 780, + 33, -44, -191, -344, -461, -755, -201, 217, -31, + -353, -547, -44, 123, -61, -68, -79, 29, 60, + 73, -57, -406, -766, -1243, -1203, 240, 400, 165, + -73, -282, -601, -213, -171, -375, 332, 35, -103, + -29, -207, -553, -476, -638, -908, 172, -22, -135, + -192, -239, -164, -103, -111, -47, 153, 125, 110, + -1, -203, -570, -1030, -1424, -535, 155, 1, 147, + -333, -653, -865, -197, -158, -21, -44, 95, 108, + 389, 588, 490, 33, -237, -524, -628, -136, -260, + 40, -177, -462, 453, 862, 380, 131, -130, -405, + -76, -281, -741, -742, 898, 619, 277, 71, -222, + -32, -265, -556, -25, 994, 682, 305, 126, -165, + -69, -349, -585, 234, 1158, 903, 626, 510, 251, + -1, -99, -272, -210, -603, -351, -540, -811, -383, + -16, -230, -504, 410, 149, -205, -343, -651, -639, + 103, -9, -227, -205, -562, -781, -1079, -1208, -156, + 143, 63, -135, -67, -317, -602, -784, -1154, -640, + -144, -391, -674, -622, -200, -254, -660, -947, -395, + -40, -250, -625, 27, 543, 94, -131, -386, -673, + -123, -371, -757, -451, -564, -614, -415, -711, -35, + -116, -309, -593, -268, 239, -33, -338, -650, -135, + 94, 251, 554, 57, -312, -423, -154, -57, 235, + -268, -71, 381, 114, -44, -87, 125, 173, 133, + -131, -19, 1149, 670, 486, 356, 309, 369, 296, + -223, -501, -899, -722, -70, 6, 131, 310, 394, + -99, -303, -517, 249, 64, -53, 135, -11, 453, + -147, -399, -730, -401, 817, 738, 802, 749, 575, + -154, -435, -739, 800, 593, 366, 529, 318, 326, + -224, 45, -39, -387, -515, -518, -608, -384, -321, + -315, -377, 143, -101, -113, -377, -177, -144, -12, + 117, 40, -239, -651, -1051, -581, -737, -990, -328, + 26, -50, -157, -23, -453, -283, -531, -546, 192, + -252, -501, -743, -589, -627, -499, -328, -118, -72, + -324, -494, -244, -306, -144, -177, -262, -135, -78, + -36, -234, -519, -961, -1290, -314, -479, -371, -45, + -95, -292, -535, -8, -300, 112, -164, -277, 198, + -99, -128, 880, 836, 579, 351, 23, -95, -217, + -27, -258, 124, 1011, 597, 425, 144, 7, -73, + -69, -300, -683, -435, 1132, 899, 504, 332, 109, + -74, -323, -637, 563, 1074, 608, 371, 105, -49, + -259, -121, 1440, 1334, 1628, 1490, 1438, 1223, 933, + -82, -306, -613, -222, -378, -675, -545, -671, -845, + 53, -124, -347, 422, 52, -125, -270, -529, 9, + 79, -89, -320, -662, -999, -1199, -1243, -676, -297, + -68, -273, -611, 137, -146, -397, -627, -845, -220, + -112, -346, -797, -826, 234, -132, -188, -278, -522, + -159, -405, -734, -419, 293, 74, -167, -167, 184, + -153, -437, -833, -1080, -336, -472, -561, -340, -253, + -169, -423, -820, -904, -131, -19, -346, -604, 31, + 33, -31, 312, 62, -148, 49, -59, 564, 486, + -306, -333, 194, -44, 67, 72, 147, 205, 243, + -207, -49, 1360, 983, 969, 991, 1014, 1110, 973, + -211, -172, 883, 627, 711, 674, 705, 798, 746, + -88, -325, -763, -974, 687, 908, 514, 382, 172, + -292, -612, -805, 63, 131, 270, 259, 352, 348, + -235, -84, 955, 818, 1120, 1289, 1559, 1480, 1285, + -180, -461, -614, 657, 691, 745, 854, 783, 713, + -97, -309, -477, -614, -777, -734, -768, -526, -472, + -344, -476, -35, -169, 49, -77, -150, -240, -141, + -52, -268, -639, -919, -1278, -1113, -342, -333, -151, + -68, -242, -585, -73, -209, -478, -159, -429, 133, + -197, -499, -1005, -1268, -272, -224, -105, -67, 17, + -363, -618, -414, -116, -62, 20, 10, 116, 108, + -195, -475, -906, -1260, -891, -441, -277, -142, -28, + -226, -519, -950, -700, -275, -266, -116, -105, 82, + 404, 511, 520, 327, 17, -194, -333, -536, -586, + -114, -130, 276, 237, 204, 342, 135, -16, -111, + 191, 180, -137, -467, 272, 106, -95, 17, -192, + -80, -290, -626, 194, 598, 196, 21, -281, 77, + 137, 367, 534, 764, 670, 382, 296, 153, 84, + 303, 497, 144, -85, -125, -539, -482, -464, -764, + 233, 347, 68, -147, 169, -210, -242, -226, -482, + 307, 422, 154, -175, -386, -722, -724, -904, -1015, + 309, 308, 160, -60, -470, -420, -598, -791, -219, + 68, 121, -137, -560, -146, -446, -515, -494, -729, + 130, 53, -227, 46, 474, 32, -161, -192, -490, + 213, 164, -71, -465, -876, -161, -456, -587, -48, + 218, 117, 39, 177, -194, -88, -226, -418, 50, + 210, 547, 569, 279, 121, -44, -50, 10, -84, + 58, 140, 182, -5, 267, 117, 106, 211, 198, + 153, 559, 872, 460, 222, 108, 188, 180, 183, + 158, 119, 284, -153, -271, 229, 87, 110, -57, + -183, 82, 118, 21, 13, 40, 118, 191, 185, + 163, 56, 609, 341, 50, 329, 68, 266, 218, + 100, 206, 18, -304, -107, -436, -487, -65, -306, + -86, 154, 134, -30, -45, -73, -104, -80, -96, + 245, 330, 10, -440, -849, -1082, 79, 40, -265, + 196, 372, 272, -181, -493, -389, 275, 80, -59, + 2, -12, -246, -505, -100, -436, 21, -187, -431, + -221, -48, 36, -271, -186, -147, -109, 26, 71, + 213, 140, 72, -351, -620, -84, -363, 69, 46, + 91, 167, -3, -95, -99, -105, -48, 114, 147, + 259, 249, 172, 607, 406, 52, 59, -189, -320, + 115, -85, -54, 574, 128, 226, -59, -253, 130, + 39, 364, 757, 940, 728, 660, 659, 583, 770, + -115, -338, -760, -471, 394, 37, 441, 178, 6, + -57, -305, -525, 796, 453, 188, -4, -114, 248, + 71, 444, 797, 731, 1096, 1157, 1222, 1029, 811, + 135, 359, 551, 425, 749, 815, 874, 704, 502, + 132, 247, 0, -206, -449, -750, -258, -514, -633, + 248, 249, 91, 121, -195, -499, -90, -282, -435, + 78, 20, -277, -623, -983, -1224, -415, -458, -639, + 347, 509, 208, -179, -464, -728, -76, -237, -486, + -103, -343, -756, -713, -265, -609, -191, -398, -636, + -121, -383, -749, 567, 252, -36, -354, -417, -50, + 204, 100, -149, -650, -1081, -47, -7, -263, 111, + -46, -180, -267, -324, -562, -394, -692, 398, 292, + 482, 670, 683, 624, 442, 165, 116, 36, -149, + 108, 247, 291, 247, 355, 122, 109, 224, 296, + 292, 349, 725, 482, 388, 329, 429, 620, 667, + -34, 197, 213, -127, 84, 494, 620, 575, 375, + 126, 207, 172, 167, 362, 202, 296, 395, 455, + -6, 250, 539, 467, 636, 801, 1149, 1287, 1118, + 27, 240, 369, 280, 440, 411, 634, 892, 953, + 159, 170, -58, -395, -797, -690, 77, -211, -334, + -5, -28, -13, -74, -335, -603, 300, 88, -205, + 82, -33, -364, -698, -1203, -1153, 110, -146, -289, + 113, 1, -243, -588, -994, -496, 414, 160, 42, + -56, -247, -440, -693, -996, -479, 11, -178, -357, + -151, -353, -327, -211, -340, 141, 65, 425, 453, + 34, -169, -455, -932, -1215, 138, 499, 256, 324, + 68, 139, -15, -547, -478, 17, 306, 502, 481, + -32, -134, 445, 129, -143, -244, -503, -507, -599, + 61, -140, -345, 496, 458, -2, 20, -227, -514, + 215, 519, 920, 1053, 1090, 791, 528, 290, 155, + -54, -233, -647, -602, 639, 294, -2, -167, -442, + -78, -315, -791, -113, 820, 403, 158, -116, -356, + -105, -379, -236, 1224, 893, 749, 568, 356, 214, + -17, -199, -144, 50, -283, -247, -578, -846, -1087, + 69, -11, -381, -206, 209, -284, -387, -416, -716, + 39, -5, -145, -374, -682, -909, -1074, -1169, -1066, + 287, 226, 67, -221, -662, -171, -421, -642, -707, + -132, -348, -538, -448, -20, -4, -354, -748, -933, + 4, -75, -289, -598, 317, 52, -208, -297, -559, + -88, -264, -358, -589, -631, -248, -523, -822, -1071, + 70, -8, 54, -314, -515, 92, -146, -274, -493, + 199, 62, 391, 158, -141, 71, -219, -203, -207, + 152, 40, 329, 162, -29, 48, -149, 108, 127, + 267, 722, 1256, 882, 625, 248, 8, -81, -60, + -58, -138, -291, -600, -12, -2, -39, 147, 117, + -107, -345, -513, 459, 76, 92, -272, 388, 262, + 362, 516, 203, -409, -716, -831, -331, 185, 209, + -117, -391, -298, 671, 292, 538, 257, 166, -38, + -102, -319, -194, -283, -573, -262, -579, -219, -444, + -235, 78, 11, -168, -101, -229, -263, -321, -123, + 70, 50, -170, -599, -996, -588, -263, -516, -455, + 394, 363, 229, -136, -538, 21, -183, -348, -201, + -124, -368, -640, -879, -847, -209, -409, -494, -515, + -127, -341, -541, -425, -510, -10, -252, -473, -291, + 84, -69, -201, -676, -868, 103, -311, -132, -320, + 5, -173, -188, -297, -628, 197, -57, 7, -11, + 49, -160, 56, 558, 111, 33, -311, -440, -463, + -1, -246, -307, 862, 453, 139, -170, -355, -232, + -197, -38, 1702, 1331, 1252, 950, 692, 504, 426, + -108, -344, -861, -1172, 444, 354, 88, -46, -220, + -53, -321, -494, 1113, 744, 364, 198, -34, -75, + -69, 199, 897, 1140, 1343, 1183, 977, 742, 522, + 122, 44, -269, 27, -155, -562, -307, -590, -773, + 154, 42, -160, 252, -129, -305, -471, -733, -371, + 135, 185, -82, -416, -722, -913, -504, -743, -880, + 149, 214, -84, -329, -680, -835, -426, -661, -81, + -128, -380, -735, -998, -337, 17, -182, -467, -697, + -84, -290, -510, -592, 13, 440, 154, -38, -279, + 70, -61, -246, -727, -1047, -80, -381, -535, -704, + 178, -2, -146, -670, -938, 482, 138, 63, 65, + -11, 15, 772, 443, 142, -20, -209, -126, -161, + -32, -249, 95, 552, 124, 30, -343, 82, -86, + -163, -257, 899, 1097, 906, 751, 502, 390, 294, + -51, -258, -447, -806, -368, 763, 464, 364, 183, + -166, -374, -367, 87, 35, 399, 418, 856, 833, + -205, -310, 588, 778, 785, 1065, 1118, 1245, 1157, + -173, -312, 107, 345, 400, 790, 870, 1113, 1001, + -7, -120, -387, -410, -614, -943, -226, -384, -491, + -203, -288, -51, -331, -90, -178, -408, -573, -338, + 56, -29, -273, -627, -1041, -798, -247, -467, 148, + 66, -2, -205, -205, -575, -349, -57, -352, -58, + -45, -225, -471, -924, -497, 77, -32, 44, -135, + -277, -491, -497, -502, -424, -202, -137, 77, 96, + 26, -179, -469, -1008, -1260, 262, -35, -132, -259, + -66, -232, -447, -533, -789, -191, -100, -267, 364, + 111, 43, -287, -423, -608, -987, -922, -799, -827, + 77, 76, -101, -260, -549, -850, -88, -231, -329, + 75, 24, -66, -269, -427, -528, -773, 201, -5, + 67, 7, -61, -320, -487, 12, -200, -242, -94, + 27, -54, -149, -354, -661, -594, -450, -481, 560, + 31, -69, -246, -549, -1141, -178, -232, -275, -288, + 16, -84, -176, 7, -83, -210, -246, -424, -589, + 63, -60, -201, -90, -269, -400, -685, -1218, -258, + 169, 217, 142, -71, -243, -433, -504, -511, -537, + 6, -105, -234, -321, -188, -131, -307, -521, -1319, + -34, -151, -369, 11, 44, -95, -280, -500, 160, + 31, -37, -163, -334, 288, 89, -150, -86, -299, + -35, -161, -362, -74, -74, -263, 240, 9, -153, + -45, -208, -529, -896, 89, 24, -130, -313, -373, + 234, 276, 197, -10, -236, -162, -134, -85, -112, + 42, -73, 133, 392, 98, 72, -153, -162, -99, + -3, -145, -338, 408, 401, 133, -52, -296, -501, + 3, -109, -152, -85, -56, 42, -145, 703, 205, + -49, -149, -281, -134, -121, -41, -21, 16, 958, + 30, -107, -196, -463, -523, 490, 236, 70, -128, + -33, -161, -364, -148, 757, 516, 250, 43, -65, + -34, -193, -244, 750, 527, 349, 234, 172, 134, + -64, -223, -379, 55, 28, 248, 793, 442, 320, + 29, -85, -298, -622, -888, 127, 206, 387, 460, + -48, -170, -477, -876, 573, 635, 440, 375, 311, + 42, 3, -212, -441, -718, -821, 388, 373, 211, + -106, -155, 1092, 459, 570, 561, 506, 604, 514, + -144, -264, 0, 460, 619, 877, 916, 1273, 921 +}; + +/*-------------------------------------------------------------------* + * 1nd stage, 2nd split: ISF9 to ISF15 + *-------------------------------------------------------------------*/ + +/* ISF codebook - common 1st stage, 2nd split (only in AMR-WB IO mode) */ +const Word16 dico2_isf_fx[] = +{/*Qlog2(2.56)*/ + 1357, 1313, 1136, 784, 438, 181, 145, + 636, 648, 667, 568, 442, 217, 362, + 427, 440, 674, 524, 332, 117, -417, + 121, 295, 468, 465, 230, 44, -221, + -147, -240, 149, 80, 390, 278, 106, + -418, -556, 552, 511, 235, 144, -95, + 43, 193, 274, 150, 67, 34, -273, + -43, -126, 171, 416, 282, 63, -354, + -372, -86, -344, -108, -94, -182, -89, + -600, -840, -200, 465, 258, -11, -253, + -48, 329, 97, -290, -543, -795, -354, + -570, -117, 187, 10, -133, -416, -76, + -618, -129, -247, -371, 45, -76, 277, + -1022, -1079, 126, 474, 254, 127, 52, + -281, 76, -167, -361, -283, -551, -283, + -119, -52, -1, 134, -32, -204, -415, + 1064, 827, 637, 684, 464, 209, 12, + 482, 416, 449, 371, 335, 294, 194, + 719, 576, 365, 135, 113, 91, -199, + 298, 176, 493, 366, 194, 163, 36, + -35, -236, -259, -36, -4, 99, 152, + -98, -306, -27, 228, 90, 111, -86, + 91, 13, -211, -258, -106, 86, -64, + 73, -35, -57, -31, 162, 35, -192, + -109, -335, -629, -66, -61, -128, 322, + -495, -669, -728, 193, 31, -220, 122, + 324, 95, -89, -91, -409, -710, -154, + 0, -234, 92, 33, -343, -609, -220, + -343, -408, -476, -655, -153, 82, 222, + -490, -745, -255, 49, -48, 135, -127, + 119, -67, -328, -390, -272, -545, -56, + -57, -130, -10, -7, -164, -47, -22, + 984, 1064, 961, 568, 210, -27, 16, + 811, 691, 754, 514, 224, -35, 166, + 662, 704, 618, 386, 57, -211, -257, + 510, 359, 418, 393, 91, -144, -18, + -193, -31, -27, 223, 89, -143, 24, + -112, -98, 471, 319, 185, 3, 175, + 252, 146, -47, 272, 48, -211, -234, + 146, 69, 203, 364, 68, -52, 51, + -259, -478, -697, -349, -758, -501, 63, + -501, -769, -289, 79, -311, -497, -106, + 251, 53, -235, -469, -895, -884, 145, + -416, -551, 140, -133, -523, -775, 44, + -326, -423, -713, -497, -86, -431, 99, + -757, -772, -160, -76, -46, -32, 379, + 85, -35, -200, -401, -663, -1040, -247, + -180, -330, -92, -376, 27, -183, -110, + 1279, 1086, 781, 502, 324, 164, 157, + 682, 466, 449, 277, 146, 28, 409, + 635, 472, 390, 107, -232, -538, -139, + 196, 396, 332, 213, 209, -29, -81, + 150, -95, -312, 76, -77, -320, -50, + 46, 9, 47, 175, 139, 30, 384, + 218, 206, -24, -250, -96, -276, -183, + 26, 119, 38, 14, -4, -133, -52, + -477, -614, -987, -715, -631, -813, 200, + -744, -1009, -1065, -745, -631, -171, 18, + -137, -251, -483, -613, -980, -1203, 12, + -605, -767, -562, -686, -1088, -515, 58, + -202, -428, -782, -1072, -96, -234, -179, + -480, -709, -1070, -897, -131, -92, 321, + -145, -193, -512, -729, -572, -765, -210, + -331, -585, -525, -631, -281, -208, -303, + 1165, 1104, 939, 828, 716, 426, 155, + 6, -109, 820, 778, 415, 113, -27, + 381, 339, 314, 265, 121, -9, -474, + -373, 47, 584, 442, 99, -231, -113, + -496, -38, -285, 262, 305, 170, 4, + -587, -556, 69, 66, 471, 354, 13, + -138, 70, -18, 106, 67, 167, -302, + -445, -141, 185, 191, 151, 83, -133, + -257, -521, -720, -198, 134, -46, -182, + -819, -1168, -777, 512, 359, 95, -113, + 137, -2, -74, -138, -401, -114, -371, + -242, -466, 204, 223, -31, -212, -192, + -532, -637, -466, -686, 256, 277, -139, + -1141, -1244, -381, -75, -54, 14, 88, + -311, 115, -143, -499, -343, 124, -416, + -616, -147, -135, 43, -4, 121, -369, + 835, 783, 641, 390, 355, 350, 64, + 72, 194, 443, 467, 436, 219, 372, + 464, 369, 192, 4, -156, -72, -226, + 57, 206, 303, 205, 188, 101, 265, + -40, -205, -488, -184, 276, 64, -26, + -217, -433, -297, 137, 328, 308, -289, + 378, 81, -308, -465, 57, -37, 227, + -100, 24, -36, -151, 199, 8, 143, + -426, -697, -1059, -133, 388, 161, 321, + -644, -1023, -1271, 39, 66, -123, 70, + 372, 177, -173, -556, -553, -304, -189, + -117, -369, -425, -122, -462, -152, -73, + -649, -850, -1189, -767, 497, 360, 222, + -798, -1139, -1455, -190, 430, 234, 179, + 42, -94, -405, -692, 38, -202, -246, + -169, -366, -290, -88, -64, 32, -292, + 1010, 923, 938, 710, 465, 230, 342, + 217, 300, 1054, 675, 68, -458, -179, + 78, 453, 316, 18, -237, -496, -243, + 167, 21, 424, 215, -91, -303, -170, + -290, -81, -70, -67, 40, 54, -59, + -353, -427, -90, 53, 94, 9, 54, + -28, 318, 283, 15, -240, -58, 79, + -75, -121, 229, 35, 58, 6, -133, + -351, -514, -744, -834, -705, -137, 164, + -1124, -1388, -1055, -230, -73, 40, 36, + -163, -233, -532, -785, -1170, -697, 96, + -788, -959, -246, -430, -624, -165, -8, + -856, -540, -630, -907, -337, -70, 76, + -937, -1042, -659, -733, -208, 199, -26, + -523, 78, -98, -501, -869, -890, -81, + -624, -703, -45, -348, -25, 87, -186, + 1005, 823, 546, 249, 90, -22, 207, + 298, 397, 381, 319, 200, 62, 303, + 473, 379, 133, -247, -632, -441, 75, + 284, 208, 391, 115, -25, 44, 95, + -72, 79, -95, -63, -129, -293, 203, + -164, -349, 115, 122, 69, -1, 378, + 348, 170, 99, 58, -179, -302, 188, + -190, -2, 150, 23, -51, -11, 216, + -615, -863, -1090, -1427, -802, -48, -6, + -961, -1276, -1548, -727, -58, 56, 223, + -124, -255, -561, -988, -1277, -148, -82, + -480, -660, -891, -1191, -1339, -325, 20, + -621, -917, -1296, -1350, 264, 289, 50, + -844, -1022, -1345, -1329, -293, 46, 278, + -260, -468, -829, -1176, -533, -560, -78, + -215, -484, -822, -1233, -791, 15, -138, + 1301, 1317, 1262, 1048, 716, 357, -64, + 578, 824, 925, 802, 630, 362, 102, + 470, 925, 767, 514, 327, 190, -112, + 225, 492, 495, 437, 598, 384, -45, + 43, 82, -42, 175, 519, 342, -64, + -304, -154, 159, 576, 403, 221, 327, + 214, 244, 122, -62, 312, 92, -160, + 218, 208, 310, 268, 306, 323, -199, + -285, -269, -79, -124, -143, -153, 236, + -205, -384, -426, 344, 59, -185, -184, + -272, 247, 126, -210, -518, -468, 78, + -99, -120, 502, 160, -280, -557, 304, + -423, -17, -283, -443, 215, 212, -140, + -564, -684, -228, 510, 361, 130, 323, + -428, 335, 98, -65, 36, -215, -246, + -362, 51, 364, -16, -234, 150, -165, + 914, 883, 751, 653, 676, 464, -153, + 631, 545, 535, 720, 596, 360, -81, + 783, 712, 512, 439, 341, 251, -391, + 497, 417, 249, 372, 295, 173, -193, + 128, -110, -385, 93, 39, 173, -231, + 216, -59, -253, 462, 389, 154, 69, + 455, 270, -4, -337, -49, 233, -322, + 307, 143, 53, 218, 128, 236, -156, + -37, -186, -240, -411, -110, 9, 399, + -140, -365, -628, 258, 380, 214, 277, + 131, 454, 177, -285, -520, 108, -214, + 77, -141, 201, -123, -490, -131, 60, + -14, -194, -521, -741, 273, 362, -33, + -362, -566, -287, -228, 161, 237, 317, + -269, 195, -75, -375, -204, 11, 77, + -128, -264, -156, -223, -475, 265, 27, + 1238, 1147, 916, 689, 432, 210, -280, + 800, 664, 879, 726, 411, 160, -164, + 454, 686, 536, 275, 147, 46, 111, + 303, 486, 512, 355, 241, 181, -69, + 79, 92, 29, 147, 233, 52, 17, + -171, 289, 131, 439, 271, 3, -10, + 413, 241, 144, 174, 155, -2, 14, + 58, 217, 247, 219, 149, 175, -18, + 228, -8, -240, -206, -513, -191, 202, + -96, -272, -454, 33, -300, -575, 46, + -10, -108, -246, -347, -770, -535, 9, + -326, -430, -61, -321, -704, -299, 201, + -1, -280, -603, -419, -185, 18, -36, + -516, -522, -379, -291, -181, -97, 27, + -159, -313, -525, -224, -510, -831, -197, + -292, -459, -59, -310, -562, -143, -351, + 1066, 912, 631, 389, 207, 86, -224, + 596, 512, 596, 505, 314, 122, -48, + 787, 861, 441, -93, -303, 33, -190, + 257, 469, 337, 51, 15, 298, -93, + 295, 73, -119, 25, 36, 23, 108, + -28, -3, -32, 114, 21, 185, 107, + 482, 305, 15, -279, -319, 52, 96, + 226, 46, 115, 72, -136, 133, -125, + 18, -207, -559, -590, -503, -482, 321, + -571, -789, -951, -172, -441, -538, 113, + 181, 14, -310, -641, -1001, -202, 159, + -136, -393, -433, -513, -911, -144, -22, + 72, -265, -706, -954, -159, 53, 332, + -338, -591, -852, -383, -395, 56, 44, + 43, -158, -464, -897, -631, -157, -294, + -161, -128, -328, -573, -483, -125, 11, + 1017, 906, 1051, 1005, 679, 341, -102, + 359, 334, 1567, 1314, 723, 105, 10, + -65, 726, 529, 301, 220, 43, -273, + -510, 436, 719, 566, 358, 179, 114, + -560, 298, 133, -120, 342, 225, 14, + -899, -101, 217, 617, 400, 146, -58, + -41, 352, 82, -196, 39, 121, -167, + -212, 59, 447, 284, 423, 250, -169, + -371, -484, -596, 30, -41, 249, 22, + -372, -650, -794, 477, 445, 216, -79, + -352, 275, 17, -443, -929, 92, 19, + -699, -696, 431, 264, -49, -310, 182, + -978, -217, -430, -400, 101, 261, 72, + -929, -889, -357, -13, 463, 378, 236, + -826, 56, 30, -299, -360, -128, -51, + -878, -299, -111, 75, 65, 36, 3, + 817, 368, -25, 354, 697, 591, -173, + 309, 212, 222, 751, 484, 140, -56, + 593, 379, 70, -8, 258, 180, 110, + 165, -46, 255, 297, 219, 273, 105, + 160, -70, -358, -181, 379, 330, 319, + -238, -369, -198, 740, 580, 319, -143, + 201, 109, -202, -456, 328, 276, -141, + 203, 170, 111, 42, 207, 360, 188, + -345, -399, -513, -233, 650, 422, 81, + -635, -961, -1220, 463, 539, 204, 209, + 202, -25, -194, -498, -787, 193, -143, + -449, -538, 195, -106, -331, 68, 62, + -228, -477, -840, -576, 317, 128, 283, + -671, -937, -807, -114, 391, 335, -62, + 246, 2, -314, -679, -303, 180, -88, + -107, -272, 90, -198, -28, 290, -112, + 885, 1149, 1021, 712, 496, 281, -83, + 269, 492, 787, 643, 347, 70, 124, + 336, 636, 499, 92, -229, -179, 191, + 26, 402, 564, 340, 149, -11, 135, + -440, 561, 470, 204, -72, -186, 140, + -720, 14, 355, 229, 68, -133, 465, + 110, 310, 103, 12, 106, 29, 158, + -178, 113, 161, 142, 121, 115, 27, + -651, -414, -645, -152, -164, -13, -429, + -639, -944, -681, -104, -81, 52, -189, + -663, -164, -316, -683, -954, -205, -83, + -609, -669, -172, -517, -694, 283, -80, + -646, -152, -383, -678, -246, -40, -143, + -747, -796, -745, -390, -98, 43, 275, + -599, -199, -398, -433, -436, -538, 31, + -1107, -568, -376, -265, -126, -21, 1, + 847, 573, 308, 392, 305, 101, 55, + 273, 293, 201, 267, 346, 201, 123, + 727, 480, 226, 2, -65, -138, 164, + 273, 208, 173, 292, 12, 253, 174, + 340, 207, 180, 88, 116, 46, 475, + -460, -166, -30, 13, 110, 173, 396, + 137, 88, 43, -137, -94, 34, 284, + 96, -14, 226, 40, 63, 70, 130, + -467, -735, -1012, -1174, -307, 305, -67, + -612, -920, -1146, -567, -8, 92, -25, + -182, -271, -492, -754, -857, 287, -75, + -494, -787, -689, -683, -709, 137, -326, + -288, -550, -903, -1105, 334, 321, -62, + -354, -653, -834, -445, 1, 377, -152, + -162, -306, -608, -937, -297, 247, -192, + -234, -477, -244, -488, -266, 342, -332 +}; + +/*-------------------------------------------------------------------* + * AMR-WB ISF codebook - 46bits, 2 stages, 1st stage common with the + * 36bit codebook,5 splits in the 2nd stage + * + * codebook vector dimension number of vectors + * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ + * 2_1 3 64 + * 2_2 3 128 + * 2_3 3 128 + * 2_4 3 32 + * 2_5 4 32 + *-------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------* + * 2nd stage, 1st split: ISF0 to ISF2 + *-------------------------------------------------------------------*/ + +/* ISF codebook - 46b, 2nd stage, 1st split (only in AMR-WB IO mode) */ +const Word16 dico21_isf_46b_fx[] = +{/*Qlog2(2.56)*/ + 329, 409, 249, + -33, 505, 160, + -29, -14, 582, + -262, 127, 354, + 145, 237, 175, + -152, 245, 122, + 27, 42, 340, + -84, -93, 311, + 285, 222, -156, + 47, -43, -504, + 234, 121, 385, + 104, -317, 45, + 176, 195, 8, + 104, -59, -94, + 177, 53, 192, + -34, -127, 152, + 570, 277, -34, + -67, -329, -639, + -157, -272, 462, + -177, -462, 198, + 322, 179, 115, + -386, 171, 19, + 19, -12, 195, + -120, -252, 201, + 304, 36, -336, + -128, -221, -380, + 171, -185, 296, + -242, -312, 23, + 198, 39, 16, + -3, -177, -111, + 111, -93, 76, + -92, -223, 4, + 177, 406, -44, + -168, 380, -149, + -4, 273, 331, + -420, 513, 277, + 21, 247, 47, + -58, 131, -2, + -3, 134, 180, + -145, 40, 175, + 189, 74, -145, + -27, -45, -325, + 370, -114, -21, + -83, -415, -173, + 77, 95, -51, + -40, -30, -67, + 71, 88, 86, + -35, -98, 14, + 69, 197, -334, + -196, 79, -231, + -348, -137, 218, + -352, -89, -85, + 47, 201, -130, + -165, 37, -15, + -43, 3, 86, + -161, -108, 79, + 83, 21, -237, + -81, -149, -238, + 150, -186, -251, + -186, -249, -162, + -19, 66, -139, + -26, -50, -181, + 24, 11, 0, + -130, -105, -98 +}; + +/*-------------------------------------------------------------------* + * 2nd stage, 2nd split: ISF3 to ISF5 + *-------------------------------------------------------------------*/ + +/* ISF codebook - 46b, 2nd stage, 2st split (only in AMR-WB IO mode) */ +const Word16 dico22_isf_46b_fx[] = +{/*Qlog2(2.56)*/ + -127, 310, 42, + -242, 197, 5, + -151, 84, -17, + -214, 127, -149, + -247, -131, 159, + -268, -267, -95, + -217, 1, -79, + -271, -80, -185, + -45, 436, 159, + 165, 199, 391, + -33, 81, 187, + -66, -42, 355, + -298, -57, 343, + -108, -537, 226, + -144, -23, 193, + 176, -402, 87, + 53, 296, 25, + -84, 253, -104, + -58, 105, -126, + -169, 174, -314, + -48, 44, -294, + -164, -417, -242, + -139, 3, -194, + -155, -207, -211, + 119, 322, 213, + 333, 50, 380, + 237, 247, -2, + 466, -16, 201, + 238, -255, -107, + 67, -440, -149, + 122, -88, -139, + 88, -247, -73, + -41, 231, 167, + -62, 155, 16, + -65, 16, 77, + -68, -2, -63, + -151, -300, 160, + -18, -333, 54, + -56, -94, 5, + 2, -190, 14, + 92, 148, 209, + 108, 9, 272, + 108, 35, 110, + 142, -85, 145, + 47, -157, 279, + 3, -320, 246, + 43, -72, 68, + 86, -217, 135, + 36, 140, 79, + 56, 175, -49, + 26, 45, 3, + 73, 55, -101, + 109, -183, -242, + -4, -283, -242, + 48, -68, -48, + -6, -153, -122, + 161, 196, 96, + 232, 80, 190, + 165, 97, 11, + 258, -31, 71, + 267, -77, -91, + 311, -209, 87, + 152, -14, -22, + 150, -149, 9, + -324, 557, 187, + -384, 307, 46, + -251, 27, 77, + -365, 77, -52, + -482, -84, 160, + -424, -515, -64, + -294, -120, -4, + -476, -116, -109, + -97, 318, 365, + 106, 627, 445, + -190, 120, 287, + -146, 65, 619, + -427, 242, 363, + -361, -371, 432, + -347, 102, 168, + -629, 195, -14, + -65, 476, -47, + -297, 320, -168, + -55, 356, -264, + -391, 82, -286, + -51, -31, -556, + -178, -399, -586, + -205, -49, -360, + -343, -238, -337, + 220, 457, 58, + 561, 467, 259, + 340, 270, -168, + 450, 77, -280, + 60, 167, -413, + 133, -252, -492, + 216, 157, -290, + 282, 0, -495, + -226, 293, 183, + -157, 135, 122, + -158, -59, 39, + -133, -118, -97, + -332, -309, 113, + -160, -425, -6, + -149, -211, 24, + -80, -277, -90, + -11, 125, 338, + 130, -71, 465, + 5, -45, 184, + 237, -95, 253, + -139, -197, 297, + -19, -300, 511, + -63, -152, 139, + 250, -289, 336, + 124, 339, -150, + 34, 176, -208, + 171, 166, -116, + 94, 38, -229, + 75, -65, -339, + -78, -205, -385, + 0, -30, -163, + -56, -110, -242, + 321, 244, 194, + 505, 238, -1, + 317, 116, 65, + 309, 88, -74, + 452, -51, -50, + 334, -217, -290, + 211, 41, -152, + 238, -55, -260 +}; + +/*-------------------------------------------------------------------* + * 2nd stage, 3rd split: ISF6 to ISF8 + *-------------------------------------------------------------------*/ + +/* ISF codebook - 46b, 2nd stage, 3rd split (only in AMR-WB IO mode) */ +const Word16 dico23_isf_46b_fx[] = +{/*Qlog2(2.56)*/ + -10, 151, 359, + 136, 298, 223, + 255, -104, 290, + 423, 6, 183, + -270, -269, -98, + -52, -82, 13, + -82, -274, -97, + 90, -246, -72, + -299, -70, 421, + -88, 365, 430, + 187, -318, 381, + 380, 37, 488, + -373, -316, 79, + -308, -101, 5, + -135, -451, 8, + 72, -421, -154, + 180, 170, -121, + 62, 177, -40, + 326, 80, -105, + 248, 263, -5, + -168, -181, -221, + -2, -23, -158, + -14, -149, -121, + 119, -91, -147, + 119, 332, -153, + 49, 303, 34, + 442, -55, -69, + 217, 454, 58, + -359, -187, -375, + -42, 50, -274, + -8, -267, -249, + 85, -86, -346, + -77, -40, 345, + 89, 134, 219, + 156, -80, 160, + 108, 40, 116, + -158, -206, 29, + 5, -32, 175, + -65, -158, 146, + 55, -78, 73, + -114, -222, 353, + -47, 81, 211, + 49, -151, 268, + 105, 4, 302, + -263, -132, 183, + -151, -28, 201, + -177, -307, 166, + 101, -221, 130, + 74, 58, -98, + 32, 44, 13, + 194, 30, -142, + 170, 96, 8, + -136, -119, -91, + -65, 8, -55, + 3, -188, 12, + 45, -63, -49, + 149, -21, -19, + 24, 144, 95, + 254, -22, 60, + 161, 196, 96, + -158, -61, 48, + -70, 33, 82, + -23, -321, 58, + 155, -147, 5, + -364, 328, 77, + -21, 453, 173, + -108, 82, 630, + 367, 263, 208, + -300, -62, -176, + -205, 143, -158, + -169, -410, -264, + 257, -269, -100, + -636, 289, -2, + -292, 627, 173, + -382, -363, 387, + 248, 524, 447, + -521, -111, -107, + -395, 118, -274, + -343, -680, -125, + -172, -447, -663, + 75, 148, -367, + -79, 263, -94, + 249, 148, -286, + 380, 271, -162, + -142, -4, -186, + -57, 111, -125, + -35, -108, -254, + 100, 29, -242, + -80, 303, -264, + -78, 464, -57, + 248, -22, -494, + 661, 662, 44, + -193, -40, -330, + -178, 145, -337, + -90, -199, -400, + -40, -23, -498, + -192, 114, 315, + -41, 244, 190, + 88, -97, 485, + 241, 80, 212, + -246, 40, 87, + -156, 147, 134, + -2, -334, 239, + 308, -203, 110, + -459, 251, 422, + -218, 310, 228, + -86, -346, 654, + 184, 175, 425, + -481, -63, 169, + -349, 117, 188, + -125, -560, 310, + 158, -416, 94, + 46, 171, -192, + -63, 157, 14, + 256, -35, -271, + 322, 123, 53, + -214, 4, -76, + -156, 86, -18, + 128, -197, -232, + 265, -90, -98, + -308, 332, -145, + -131, 308, 58, + 509, 59, -339, + 562, 196, -14, + -378, 100, -47, + -234, 202, 1, + 104, -270, -493, + 319, -210, -325 +}; + +/*-------------------------------------------------------------------* + * 2nd stage, 4th split: ISF9 to ISF11 + *-------------------------------------------------------------------*/ + +/* ISF codebook - 46b, 2nd stage, 4th split (only in AMR-WB IO mode) */ +const Word16 dico24_isf_46b_fx[] = +{/*Qlog2(2.56)*/ + -79, -89, -4, + -171, 77, -211, + 160, -193, 98, + 120, -103, 323, + 32, -22, -129, + 72, 78, -268, + 182, -76, -66, + 309, 99, -145, + -229, -157, -84, + -383, 98, -71, + -90, -352, 12, + -284, -178, 178, + -65, -125, -166, + -87, -175, -351, + 42, -198, -48, + 154, -140, -243, + -77, 18, 108, + -39, 355, 91, + 87, 8, 155, + -4, 158, 239, + 128, 95, -54, + 7, 246, -124, + 258, 15, 89, + 206, 216, 98, + -201, 9, 18, + -312, 233, 204, + -39, -174, 155, + -144, -9, 284, + -57, 70, -69, + -157, 187, 18, + 54, -30, 23, + 24, 135, 55 +}; + +/*-------------------------------------------------------------------* + * 2nd stage, 1st split: ISF12 to ISF15 + *-------------------------------------------------------------------*/ + +/* ISF codebook - 46b, 2nd stage, 5th split (only in AMR-WB IO mode) */ +const Word16 dico25_isf_46b_fx[] = +{/*Qlog2(2.56)*/ + 169, 142, -119, 115, + 206, -20, 94, 226, + -106, 313, -21, 16, + -62, 161, 71, 255, + -89, 101, -185, 125, + 72, -30, -201, 344, + -258, 33, -8, 81, + -104, -154, 72, 296, + 144, -68, -268, -25, + 81, -78, -87, 106, + 22, 155, -186, -119, + -46, -28, 27, 91, + -114, -37, -175, -33, + -94, -222, -189, 122, + -132, -119, -191, -270, + -172, -173, 18, -43, + 279, 135, -42, -128, + 187, -86, 229, -138, + 159, 240, 140, 46, + 69, 25, 227, 77, + 21, 115, 13, 8, + 68, -248, 126, 81, + -150, 137, 207, -9, + -154, -133, 289, 67, + 143, -37, -86, -326, + 180, -32, 19, -23, + 26, 168, 116, -233, + -32, -26, 118, -78, + 3, -8, -45, -115, + 57, -215, -54, -83, + -209, 112, -22, -167, + -91, -151, 168, -262 +}; + + +/*-------------------------------------------------------------------* + * AMR-WB ISF codebook - 36bits, 2 stages, 1st stage common with the + * 46bit codebook,3 splits in the 2nd stage + * + * codebook vector dimension number of vectors + * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ + * 2_1 5 128 + * 2_2 4 128 + * 2_3 7 64 + *-------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------* + * 2nd stage, 1st split: ISF0 to ISF4 + *-------------------------------------------------------------------*/ + +/* ISF codebook - 36b, 2nd stage, 1st split (only in AMR-WB IO mode) */ +const Word16 dico21_isf_36b_fx[] = +{/*Qlog2(2.56)*/ + -52, -96, 212, 315, -73, + 82, -204, 363, 136, -197, + -126, -331, 183, 218, 143, + -49, -41, 557, 230, 72, + 2, -73, 163, 377, 221, + 133, 111, 278, 215, -110, + -102, -20, 284, 113, 273, + 84, 319, 290, 18, 85, + -25, -5, 125, 132, -204, + -38, -5, 286, -9, -356, + -140, -256, 92, 117, -189, + -144, 191, 313, 51, -98, + 167, -10, 44, 247, 36, + 381, 197, 238, 74, 6, + 38, -408, 29, -3, -85, + 92, 266, 157, -25, -200, + 161, -121, 70, 84, -140, + -16, -86, 112, -94, -189, + -269, -270, 351, 107, -24, + -68, -67, 492, -103, -155, + -53, -131, 62, 122, 10, + 135, 84, 283, -55, -120, + -12, -219, 331, -81, 167, + 220, -136, 147, -172, -42, + 140, -95, -109, -88, -194, + 0, -2, -4, -33, -381, + -66, -217, 152, -186, -402, + 244, 108, 156, -140, -395, + 113, -136, -196, 110, -24, + 214, 118, 11, -64, -131, + -110, -286, -6, -332, 16, + 94, 97, 79, -291, -205, + -5, -39, -20, 252, -96, + 76, 174, 101, 163, 61, + -69, -239, -55, 399, 6, + -115, 319, 164, 275, 196, + -15, 36, -47, 331, 121, + 226, 209, 271, 325, 184, + 13, -80, -218, 471, 353, + 288, 378, 16, -51, 251, + 174, 116, 52, 149, -279, + 235, 276, 39, 120, -48, + 0, -108, -108, 241, -339, + -93, 534, 45, 33, -87, + 194, 149, -71, 405, -44, + 409, 370, 81, -186, -154, + 25, -102, -448, 124, -173, + 22, 408, -110, -310, -214, + -26, 23, -83, 114, 14, + -110, 164, 52, 223, -82, + 37, -25, -263, 306, -15, + -466, 415, 292, 165, -18, + 29, -19, -171, 155, 182, + 179, 144, -27, 231, 258, + -103, -247, -396, 238, 113, + 375, -154, -109, -4, 156, + 98, 85, -292, -5, -124, + 116, 139, -116, -98, -294, + -14, -83, -278, -117, -378, + 106, 33, -106, -344, -484, + 119, 17, -412, 138, 166, + 384, 101, -204, 88, -156, + -121, -284, -300, -1, -166, + 280, 33, -152, -313, -81, + -37, 22, 229, 153, 37, + -60, -83, 236, -8, -41, + -169, -228, 126, -20, 363, + -235, 17, 364, -156, 156, + -25, -30, 72, 144, 156, + 153, -26, 256, 97, 144, + -21, -37, 48, -65, 250, + 63, 77, 273, -128, 124, + -129, -26, 40, 9, -115, + -6, 82, 38, -90, -182, + -336, -13, 28, 158, 91, + -30, 241, 137, -170, -17, + 146, 14, -11, 33, 61, + 192, 197, 54, -84, 85, + 23, -200, -78, -29, 140, + 122, 237, 106, -341, 136, + -57, -142, -85, -16, -74, + -59, -90, -8, -187, -20, + -211, -267, 216, -179, -110, + -50, -7, 220, -267, -70, + -57, -42, -17, -15, 71, + 32, 21, 63, -137, 33, + -137, -175, 104, -68, 97, + -67, -43, 133, -301, 221, + -116, -200, -81, -92, -272, + -64, -41, -54, -244, -220, + -287, -242, -50, -87, -89, + -245, 236, 102, -166, -295, + 66, 24, -162, -71, 95, + 66, 136, -90, -220, -36, + -98, -161, -222, -188, 29, + -18, 18, -19, -415, 9, + 49, 61, 100, 39, -56, + -111, 82, 135, -31, 52, + -90, -153, -93, 189, 182, + -214, 295, 119, -74, 284, + 2, 137, 37, 47, 182, + 92, 117, 184, -53, 373, + -21, -14, -35, 136, 391, + 146, 129, -164, -28, 333, + 92, 80, -84, 100, -134, + -8, 217, -32, 3, -47, + -151, 251, -215, 142, 92, + -224, 310, -172, -275, 98, + 159, 155, -177, 112, 53, + 205, 27, 8, -240, 192, + 169, 120, -319, -201, 106, + 11, 36, -86, -237, 455, + -109, -154, -163, 174, -55, + -38, 32, -101, -78, -59, + -205, -321, -97, 69, 79, + -310, 44, 18, -185, 34, + -115, -20, -148, -39, 203, + -29, 154, -30, -158, 166, + -45, -131, -317, -24, 363, + -165, -205, -112, -222, 265, + -32, -44, -150, 54, -193, + -6, -38, -255, -169, -115, + -266, 87, -189, -36, -169, + -60, -87, -266, -436, -170, + -68, -81, -278, 24, 38, + -23, -19, -155, -256, 141, + -61, -226, -565, -175, 71, + 9, -29, -237, -515, 263 +}; + +/*-------------------------------------------------------------------* + * 2nd stage, 2nd split: ISF5 to ISF8 + *-------------------------------------------------------------------*/ + +/* ISF codebook - 36b, 2nd stage, 2nd split (only in AMR-WB IO mode) */ + +const Word16 dico22_isf_36b_fx[] = +{/*Qlog2(2.56)*/ + -298, -6, 95, 31, + -213, -87, -122, 261, + 4, -49, 208, 14, + -129, -110, 30, 118, + -214, 258, 110, -235, + -41, -18, -126, 120, + 103, 65, 127, -37, + 126, -36, -24, 25, + -138, -67, -278, -186, + -164, -194, -201, 78, + -211, -87, -51, -221, + -174, -79, -94, -39, + 23, -6, -157, -240, + 22, -110, -153, -68, + 148, -5, -2, -149, + -1, -135, -39, -179, + 68, 360, -117, -15, + 137, 47, -278, 146, + 136, 260, 135, 65, + 61, 116, -45, 97, + 231, 379, 87, -120, + 338, 177, -272, 3, + 266, 156, 28, -69, + 260, 84, -85, 86, + -266, 154, -256, -182, + -17, -65, -304, -6, + -40, 175, -151, -180, + -27, 27, -87, -63, + 121, 114, -166, -469, + 159, -66, -323, -231, + 214, 152, -141, -212, + 137, 36, -184, -51, + -282, -237, 40, 10, + -48, -235, -37, 251, + -54, -323, 136, 29, + -88, -174, 213, 198, + -390, 99, -63, -375, + 107, -169, -164, 424, + 69, -111, 141, -167, + 74, -129, 65, 144, + -353, -207, -205, -109, + -160, -386, -355, 98, + -176, -493, -20, -143, + -252, -432, -2, 216, + -90, -174, -168, -411, + 13, -284, -229, -160, + -87, -279, 34, -251, + -75, -263, -58, -42, + 420, 53, -211, -358, + 384, -35, -374, 396, + 68, -228, 323, -2, + 167, -307, 192, 194, + 459, 329, -5, -332, + 375, 79, -7, 313, + 282, -124, 200, -92, + 271, -162, -70, 180, + -157, -298, -514, -309, + 58, -163, -546, 18, + 124, -364, 167, -238, + 83, -411, -117, 96, + 140, -112, -388, -624, + 259, -133, -317, 41, + 163, -130, -64, -334, + 226, -165, -124, -110, + -466, -61, 6, 229, + -153, 205, -145, 242, + -159, 48, 195, 148, + -58, 28, 31, 279, + -303, 185, 279, -4, + -61, 197, 59, 86, + -114, 123, 168, -52, + 35, 36, 100, 126, + -407, 102, -77, -40, + -338, -1, -342, 156, + -179, 105, -34, -97, + -185, 84, -35, 108, + -133, 107, -91, -357, + -180, 54, -229, 24, + -44, 47, 47, -182, + -66, 13, 45, 4, + -339, 251, 64, 226, + -42, 101, -350, 275, + -99, 398, 142, 121, + 111, 12, -102, 260, + 0, 505, 260, -94, + 161, 285, -96, 224, + -4, 206, 314, 33, + 167, 139, 88, 204, + -235, 316, -60, -25, + -8, -150, -312, 201, + -36, 292, 61, -104, + -40, 174, -162, 42, + -21, 402, -29, -351, + 21, 152, -360, -93, + 57, 191, 212, -196, + 76, 158, -21, -69, + -328, -185, 331, 119, + -53, 285, 56, 337, + -107, -24, 405, 29, + -18, 137, 272, 277, + -255, 22, 173, -191, + 295, 322, 325, 302, + 21, -27, 332, -178, + 119, 13, 271, 129, + -455, -180, 116, -191, + -227, 62, -148, 524, + -176, -287, 282, -157, + -243, 13, 199, 430, + -59, -49, 115, -365, + 72, -172, -137, 93, + -138, -126, 141, -84, + 5, -124, 38, -20, + -258, 311, 601, 213, + 94, 130, -61, 502, + -1, -157, 485, 313, + 146, -74, 158, 345, + 276, 135, 280, -57, + 490, 252, 99, 43, + 267, -74, 429, 105, + 278, -23, 119, 94, + -542, 488, 257, -115, + -84, -244, -438, 478, + -113, -545, 387, 101, + -95, -306, 111, 498, + 95, 166, 22, -301, + 420, -15, -58, -78, + 270, 29, 122, -282, + 160, -240, 50, -38 +}; + +/*-------------------------------------------------------------------* + * 2nd stage, 3rd split: ISF9 to ISF15 + *-------------------------------------------------------------------*/ + +/* ISF codebook - 36b, 2nd stage, 3rd split (only in AMR-WB IO mode) */ +const Word16 dico23_isf_36b_fx[] = +{/*Qlog2(2.56)*/ + 81, -18, 68, -27, -122, -280, -4, + 45, -177, 209, -30, -136, -74, 131, + -44, 101, -75, -88, -48, -137, -54, + -245, -28, 63, -18, -112, -103, 58, + -79, -6, 220, -65, 114, -35, -50, + 109, -65, 143, -114, 129, 76, 125, + 166, 90, -61, -242, 186, -74, -43, + -46, -92, 49, -227, 24, -155, 39, + 67, 85, 99, -42, 53, -184, -281, + 142, -122, 0, 21, -142, -15, -17, + 223, 92, -21, -48, -82, -14, -167, + 51, -37, -243, -30, -90, 18, -56, + 54, 105, 74, 86, 69, 13, -101, + 196, 72, -89, 43, 65, 19, 39, + 121, 34, 131, -82, 25, 213, -156, + 101, -102, -136, -21, 57, 214, 22, + 36, -124, 205, 204, 58, -156, -83, + 83, -117, 137, 137, 85, 116, 44, + -92, -148, -68, 11, -102, -197, -220, + -76, -185, -58, 132, -26, -183, 85, + -7, -31, -2, 23, 205, -151, 10, + -27, -37, -5, -18, 292, 131, 1, + 117, -168, 9, -93, 80, -59, -125, + -182, -244, 98, -24, 135, -22, 94, + 221, 97, 106, 42, 43, -160, 83, + 25, -64, -21, 6, 14, -15, 154, + 126, 15, -140, 150, -10, -207, -114, + 79, -63, -211, -70, -28, -217, 165, + 46, 38, -22, 281, 132, -62, 109, + 112, 54, -112, -93, 208, 27, 296, + 115, 10, -147, 41, 216, 42, -276, + 50, -115, -254, 167, 117, -2, 61, + 17, 144, 34, -72, -186, -150, 272, + -29, -66, -89, -95, -149, 129, 251, + 122, 0, -50, -234, -91, 36, 26, + -105, -102, -88, -121, -236, -7, -11, + -204, 109, 5, -191, 105, -15, 163, + -80, 32, -24, -209, 41, 294, 70, + -106, -94, -204, -118, 120, -50, -37, + -82, -241, 46, -131, -29, 150, -55, + 33, 155, 120, -89, -8, 7, 62, + 213, 82, 61, 18, -161, 144, 152, + 30, 131, 65, -87, -255, -17, -107, + -8, 85, -64, 51, -162, 223, -53, + -134, 261, 69, -56, 218, 72, -111, + 2, 155, -113, -87, 49, 85, -28, + -163, 42, -1, -196, 7, 39, -245, + 14, -137, -79, 11, -160, 202, -293, + -94, 33, 208, 100, 56, -44, 326, + -78, -41, 232, 13, -142, 227, 80, + -16, -87, 201, 33, -133, 15, -183, + -58, -192, -47, 184, -128, 133, 99, + -205, 11, -155, 78, 52, 72, 141, + -246, 26, 99, 151, 59, 115, -64, + -79, -47, -16, -14, 6, 47, -43, + -72, -178, -27, 162, 112, 43, -174, + -175, 238, 186, 71, -54, -188, -76, + -225, 233, 39, -39, -158, 122, 44, + -26, 43, 84, 130, -93, -51, 22, + 3, 92, -150, 136, -182, -57, 97, + -131, 179, -78, 80, 91, -165, 90, + -2, 148, 15, 130, 65, 175, 117, + -138, 114, -137, 132, 3, -10, -186, + 140, -4, -37, 254, -62, 92, -109 +}; + +/*-------------------------------------------------------------------* + * AMR-WB ISF codebook for SID - 28bits, 1 stage, 5 splits + * + * codebook vector dimension number of vectors + * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ + * 1 2 64 + * 2 3 64 + * 3 3 64 + * 4 4 32 + * 5 4 32 + *-------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------* + * 1st stage, 1st split: ISF0 to ISF1 + *-------------------------------------------------------------------*/ + +/* ISF codebook for SID frames - 28b, 1st split */ +const Word16 dico1_ns_28b_fx[] = +{/*Qlog2(2.56)*/ + -269, -673, + -222, -537, + -233, -430, + -138, -451, + -212, -331, + -192, -241, + -87, -231, + -191, -128, + -70, -106, + -164, -6, + 74, -179, + 27, -33, + -102, 74, + -162, 115, + -94, 172, + -6, 130, + -143, 234, + 14, 218, + -65, 270, + 88, 182, + -124, 341, + -44, 381, + 38, 335, + 117, 274, + -112, 454, + 74, 431, + -5, 488, + 175, 384, + -83, 561, + 122, 529, + 21, 601, + 229, 481, + 231, 303, + 226, 608, + 300, 372, + 210, 187, + 306, 265, + 328, 473, + 382, 331, + 371, 132, + 139, 58, + 365, 21, + 250, -82, + 443, 218, + 483, 110, + 426, 415, + 579, 222, + 518, 333, + 573, 448, + 455, 529, + 685, 329, + 332, 580, + 595, 593, + 468, 645, + 762, 517, + 326, 709, + 485, 793, + 130, 684, + 671, 737, + 354, 876, + 88, 806, + -65, 706, + -35, 1016, + 266, 1123 +}; + +/*-------------------------------------------------------------------* + * 1st stage, 2ndt split: ISF2 to ISF4 + *-------------------------------------------------------------------*/ + +/* ISF codebook for SID frames - 28b, 2nd spilt */ +const Word16 dico2_ns_28b_fx[] = +{/*Qlog2(2.56)*/ + -824, -884, -949, + -805, -456, -418, + -442, -438, -541, + -217, -578, -793, + -168, -444, -582, + -287, -492, -274, + -552, -297, -300, + -163, -333, -358, + -370, -232, -232, + -175, -358, -159, + -381, -21, -357, + -184, -159, -162, + -53, -191, -280, + 18, -267, -215, + -138, 61, -283, + 71, -95, -294, + 13, -156, -546, + 0, -83, -79, + 44, 97, -316, + 178, -52, -213, + 222, -261, -422, + 237, -118, -44, + 141, 145, -132, + 363, 81, -287, + 213, 65, 34, + -107, 94, -5, + 91, -29, 126, + -355, 51, -41, + -219, -76, 145, + -63, 100, 244, + -719, 44, 27, + -572, -124, 155, + -423, 133, 315, + -917, 71, 224, + -268, 318, 131, + -93, -190, 420, + -97, 122, 491, + -79, 317, 355, + 130, 100, 325, + 86, -293, 210, + 133, 258, 161, + 176, -73, 465, + 195, 300, 384, + 348, 22, 221, + 376, 183, 409, + 377, 286, 202, + 242, 213, 659, + 257, 565, 248, + 344, 408, -76, + 405, 440, 509, + 612, 385, 379, + 536, 607, 216, + -56, 582, 192, + 100, 517, 567, + -365, 448, 445, + 728, 347, 10, + 505, 357, 759, + 636, 582, 658, + 335, 517, 852, + 378, 809, 572, + -195, 878, 829, + 529, 707, 987, + 918, 726, 392, + 1250, 997, 1063 +}; + +/*-------------------------------------------------------------------* + * 1st stage, 3rd split: ISF5 to ISF7 + *-------------------------------------------------------------------*/ + +/* ISF codebook for SID frames - 28b, 3rd spilt */ +const Word16 dico3_ns_28b_fx[] = +{/*Qlog2(2.56)*/ + -805, -838, -774, + -522, -627, -828, + -477, -486, -603, + -295, -481, -634, + -366, -384, -393, + -186, -414, -396, + -237, -394, -106, + -252, -202, -275, + -61, -177, -442, + -84, -198, -199, + -179, -125, -31, + -72, -47, -163, + -298, -220, 215, + -64, -168, 251, + -133, 156, -59, + -30, -2, 127, + 54, 66, -61, + -233, 21, 251, + 209, -50, 32, + 33, 194, 136, + -117, -18, 475, + 202, 46, 309, + 256, 185, 53, + 35, 200, 390, + 200, 263, 242, + -216, 302, 294, + 128, 358, 0, + 19, 431, 287, + 224, 447, 280, + 367, 165, 213, + 397, 314, 319, + 383, 379, 75, + 277, 325, 462, + 394, 505, 334, + 251, 98, -213, + 450, 153, 448, + 565, 226, 76, + 470, 383, 502, + 635, 390, 278, + 237, 135, 620, + 342, 401, 649, + 331, 551, 518, + 130, 418, 592, + 531, 306, 737, + 729, 389, 580, + 497, 557, 699, + 296, 383, 874, + 283, 624, 759, + 126, 622, 476, + 559, 595, 472, + 382, 770, 616, + 719, 613, 745, + 540, 639, 928, + 517, 826, 801, + 684, 811, 604, + 752, 786, 857, + 933, 661, 350, + 694, 450, 1061, + 562, 911, 1051, + 824, 813, 1104, + 758, 1047, 882, + 1140, 917, 889, + 1039, 1246, 1426, + 1483, 1666, 1876 +}; + +/*-------------------------------------------------------------------* + * 1st stage, 4th split: ISF8 to ISF11 + *-------------------------------------------------------------------*/ + +/* ISF codebook for SID frames - 28b, 4th spilt */ +const Word16 dico4_ns_28b_fx[] = +{/*Qlog2(2.56)*/ + -776, -854, -891, -920, + -552, -610, -663, -741, + -321, -370, -476, -565, + 274, -160, -456, 201, + 265, 67, -160, -306, + -8, -210, 79, 272, + 163, 236, 307, 308, + 578, 317, 64, 298, + -9, 197, 342, 620, + 343, 232, 314, 622, + 173, 149, 548, 527, + 356, 370, 481, 376, + 135, 444, 488, 556, + 391, 471, 487, 653, + 228, 424, 576, 835, + 422, 372, 722, 682, + 295, 673, 693, 635, + 539, 596, 590, 449, + 475, 618, 659, 818, + 735, 517, 491, 673, + 602, 346, 257, 877, + 625, 635, 849, 720, + 727, 818, 698, 595, + 653, 481, 690, 1139, + 814, 762, 704, 908, + 507, 747, 898, 936, + 848, 855, 924, 785, + 646, 1037, 882, 795, + 772, 845, 1024, 1151, + 1133, 983, 818, 921, + 940, 1068, 1252, 1302, + 1588, 1767, 1718, 1513 +}; + +/*-------------------------------------------------------------------* + * 1st stage, 5th split: ISF12 to ISF15 + *-------------------------------------------------------------------*/ + +/* ISF codebook for SID frames - 28b, 5th spilt */ +const Word16 dico5_ns_28b_fx[] = +{/*Qlog2(2.56)*/ + -810, -879, -945, -254, + 248, 184, 671, 128, + 288, 703, 918, 99, + 658, 558, 662, 219, + 552, 585, 910, 208, + 559, 804, 759, 119, + 606, 774, 921, -139, + 782, 761, 748, 208, + 756, 708, 983, 56, + 544, 864, 1010, 152, + 737, 698, 987, 299, + 771, 924, 879, 103, + 536, 785, 961, 405, + 667, 916, 801, 328, + 738, 705, 773, 439, + 823, 871, 992, 355, + 640, 1004, 1052, 369, + 724, 822, 949, 597, + 415, 655, 729, 482, + 1009, 896, 793, 363, + 908, 803, 687, -25, + 1016, 838, 1011, 189, + 947, 1112, 942, 222, + 914, 1049, 981, 527, + 956, 987, 1011, -120, + 781, 1049, 1121, 92, + 1178, 1053, 884, 47, + 1123, 1059, 1182, 118, + 933, 972, 1277, 357, + 1109, 918, 1101, 503, + 1039, 1286, 1220, 317, + 1351, 1207, 1010, 326 +}; /*1.28f Q1*/ + +const Word16 means_nb_31bits_ma_lsf[16] = { 861 /*336.3281f*1.28f Q1*/, 1360 /*531.2500f*1.28f Q1*/, 2270 /*886.7188f*1.28f Q1*/, 3243 /*1266.7969f*1.28f Q1*/, 4171 /*1629.2969f*1.28f Q1*/, 5052 /*1973.4375f*1.28f Q1*/, 6012 /*2348.4375f*1.28f Q1*/, 6776 /*2646.8750f*1.28f Q1*/, 7676 /*2998.4375f*1.28f Q1*/, 8428 /*3292.1875f*1.28f Q1*/, 9194 /*3591.4062f*1.28f Q1*/, 9744 /*3806.2500f*1.28f Q1*/, 10580 /*4132.8125f*1.28f Q1*/, 11911 /*4652.7344f*1.28f Q1*/, 13440 /*5250.0000f*1.28f Q1*/, 15061 /*5883.2031f*1.28f Q1*/ }; +const Word16 means_wb_31bits_ma_lsf[16] = { 818 /*319.5312f*1.28f Q1*/, 1403 /*548.0469f*1.28f Q1*/, 2392 /*934.3750f*1.28f Q1*/, 3465 /*1353.5156f*1.28f Q1*/, 4429 /*1730.0781f*1.28f Q1*/, 5428 /*2120.3125f*1.28f Q1*/, 6414 /*2505.4688f*1.28f Q1*/, 7323 /*2860.5469f*1.28f Q1*/, 8304 /*3243.7500f*1.28f Q1*/, 9221 /*3601.9531f*1.28f Q1*/, 10162 /*3969.5312f*1.28f Q1*/, 11091 /*4332.4219f*1.28f Q1*/, 12125 /*4736.3281f*1.28f Q1*/, 13153 /*5137.8906f*1.28f Q1*/, 14241 /*5562.8906f*1.28f Q1*/, 15266 /*5963.2812f*1.28f Q1*/ }; + + +const Word16 *lsf_means[2] = { means_wb_31bits_ma_lsf, means_nb_31bits_ma_lsf }; + +const lsp_unw_triplet p16_gamma0_92to1[16] = /* Q14 */ +{ + { 0, 19622, -9695 }, + { -14938, 29357, -13258 }, + { -8483, 23708, -13414 }, + { -7350, 22410, -12305 }, + { -7397, 21417, -12160 }, + { -7071, 19878, -11229 }, + { -7144, 19877, -11326 }, + { -6423, 17194, -9613 }, + { -7407, 18024, -9695 }, + { -6972, 16339, -8191 }, + { -8220, 17625, -8422 }, + { -8159, 17459, -8289 }, + { -8700, 19066, -9508 }, + { -7986, 17629, -8607 }, + { -8503, 17203, -8109 }, + { -7820, 14903, 0 } +}; + +const lsp_unw_triplet p16_gamma0_94to1[16] = /* Q14 */ +{ + { 0, 12931, -6314 }, + { -9364, 19577, -8870 }, + { -5512, 16236, -9305 }, + { -4892, 15366, -8398 }, + { -4869, 14631, -8275 }, + { -4631, 13358, -7540 }, + { -4575, 13271, -7599 }, + { -4151, 11403, -6385 }, + { -4859, 11947, -6371 }, + { -4504, 10805, -5407 }, + { -5346, 11618, -5515 }, + { -5418, 11578, -5424 }, + { -5806, 12711, -6226 }, + { -5205, 11592, -5606 }, + { -5745, 11498, -5188 }, + { -5473, 10245, 0 } +}; + + +const Word16 dico_lsf_abs_8b[256 * M] = /*14Q1*1.28*/ +{ + 966, 1761, 2937, 3740, 4574, 5488, 6457, 7398, 8355, 9289, 10254, 11211, 12247, 13202, 14221, 15172, + 1540, 2731, 3544, 4232, 5065, 5917, 6846, 7707, 8602, 9538, 10479, 11445, 12439, 13339, 14332, 15243, + 1414, 2201, 3469, 4160, 4832, 5563, 6504, 7493, 8507, 9423, 10261, 11087, 12014, 12887, 13935, 15041, + 1176, 2031, 3312, 4141, 4915, 5612, 6368, 7097, 7965, 8861, 9900, 10956, 12137, 13161, 14215, 15190, + 840, 1102, 1853, 3913, 4514, 5155, 5976, 6577, 7726, 8469, 9195, 9896, 12016, 13534, 14458, 15327, + 1165, 1552, 2467, 3520, 3933, 4902, 6085, 6607, 7652, 8343, 8922, 9577, 11002, 13331, 14521, 15310, + 1113, 1431, 2280, 3471, 3975, 4853, 5690, 6407, 7275, 8032, 8621, 9884, 12276, 13033, 13880, 15039, + 719, 1036, 1867, 2553, 4352, 5021, 5775, 6505, 7179, 7826, 9601, 11113, 12075, 12807, 14022, 15272, + 953, 1294, 1952, 2553, 3007, 5085, 6062, 6718, 8178, 8712, 9927, 11330, 12351, 13205, 14164, 15087, + 940, 1283, 2111, 2792, 3256, 3911, 6096, 6898, 7589, 9317, 10103, 10891, 11893, 12886, 13757, 15049, + 587, 903, 1795, 3140, 4297, 4853, 5479, 6468, 7886, 8442, 9844, 11336, 12043, 12793, 13911, 15151, + 861, 1323, 2258, 3258, 3853, 4815, 5824, 6684, 8004, 9358, 10709, 11951, 12810, 13582, 14465, 15216, + 758, 1202, 2449, 3134, 3694, 4423, 5673, 6885, 7835, 9014, 10027, 11120, 12196, 13199, 14218, 15199, + 1042, 1478, 2150, 3726, 4263, 4954, 6139, 6790, 7965, 8974, 9643, 10764, 12030, 12725, 13557, 14581, + 719, 926, 2434, 3748, 4185, 5032, 5661, 6815, 7286, 9180, 10365, 11159, 11991, 12918, 13824, 15248, + 715, 1008, 2245, 3846, 4283, 5859, 6516, 7754, 9005, 9791, 10611, 11473, 12342, 13216, 14190, 15177, + 972, 1282, 1856, 2557, 3020, 4536, 7105, 8030, 8649, 9405, 10103, 10712, 11575, 12633, 13608, 14745, + 813, 1132, 1994, 2990, 3472, 4041, 4711, 7349, 8285, 8967, 9924, 10497, 11905, 13402, 14503, 15358, + 897, 1260, 1953, 3238, 3878, 4495, 6373, 7420, 8046, 9326, 10330, 10893, 11883, 13155, 14226, 15156, + 772, 1190, 1952, 2591, 4617, 5613, 6788, 7715, 8323, 9061, 10103, 11442, 12520, 13313, 14105, 15130, + 648, 914, 1614, 2978, 3913, 5180, 6371, 7029, 7510, 8288, 10181, 11303, 12262, 13298, 14629, 15443, + 679, 934, 1510, 2061, 4006, 5506, 6056, 6653, 7326, 8996, 10254, 11800, 12686, 13410, 14130, 15080, + 536, 802, 1288, 2431, 4428, 4896, 5421, 6396, 8409, 9756, 10509, 11135, 12212, 13338, 14298, 15284, + 774, 1064, 1751, 2361, 3813, 5723, 6272, 7170, 7837, 9027, 9999, 10677, 11383, 12564, 14005, 15142, + 678, 938, 1492, 2025, 4146, 5207, 5984, 6738, 7509, 8781, 9766, 10948, 12156, 13220, 14217, 15296, + 639, 927, 1490, 2153, 4243, 5592, 6466, 7219, 7989, 9277, 10369, 11353, 12295, 13240, 14272, 15267, + 743, 1035, 1700, 2248, 3167, 5728, 6394, 7572, 8421, 9284, 10729, 11762, 12753, 13526, 14380, 15202, + 468, 692, 1255, 2740, 4287, 5357, 6462, 7499, 8537, 9503, 10499, 11458, 12457, 13393, 14352, 15260, + 734, 989, 1478, 1957, 2947, 5157, 6144, 7370, 8090, 8834, 9907, 11183, 12331, 13280, 14246, 15263, + 461, 681, 1659, 3534, 4547, 5654, 6632, 7664, 8623, 9608, 10561, 11542, 12490, 13438, 14368, 15271, + 792, 1113, 1855, 2398, 3238, 5817, 6524, 7434, 8483, 9164, 10021, 11002, 12178, 13218, 14316, 15216, + 658, 1008, 1970, 3074, 4543, 5908, 7154, 8105, 8980, 9832, 10606, 11401, 12264, 13165, 14158, 15163, + 1009, 1541, 2392, 3464, 4644, 5562, 6666, 7588, 8538, 9554, 10547, 11489, 12487, 13412, 14326, 15206, + 955, 1704, 3142, 3903, 4985, 6046, 7112, 8024, 8864, 9606, 10417, 11275, 12242, 13171, 14188, 15188, + 1152, 2084, 3441, 4308, 5341, 6367, 7465, 8361, 9258, 10034, 10799, 11569, 12435, 13295, 14269, 15192, + 1361, 2472, 3734, 4540, 5724, 6786, 7934, 8876, 9753, 10482, 11209, 11930, 12704, 13494, 14411, 15293, + 1448, 2793, 3997, 5078, 6382, 7418, 8278, 9062, 9827, 10479, 11193, 11976, 12798, 13632, 14523, 15357, + 1488, 2499, 3704, 4557, 5499, 6512, 7628, 8636, 9720, 10662, 11547, 12425, 13250, 13991, 14754, 15490, + 1099, 2055, 3146, 3872, 4700, 5675, 6721, 7670, 8652, 9638, 10640, 11603, 12561, 13473, 14404, 15285, + 575, 841, 1577, 3091, 3894, 4777, 5587, 6225, 8293, 8937, 9666, 10986, 12135, 13292, 14164, 15178, + 799, 1086, 1834, 2360, 3186, 5166, 5756, 7271, 8036, 8703, 9532, 10239, 11731, 13180, 14418, 15362, + 956, 1297, 2021, 2413, 4341, 5175, 5948, 6783, 7304, 8114, 9024, 9853, 10910, 12746, 14094, 15167, + 1288, 1856, 2407, 3125, 3686, 4421, 5672, 6339, 7288, 8274, 9315, 10205, 11191, 12856, 14483, 15463, + 1020, 1359, 2139, 2709, 3398, 4646, 5412, 6441, 7053, 7923, 9213, 10192, 11791, 13084, 14208, 15242, + 839, 1165, 2114, 2625, 3382, 3972, 5064, 7268, 7966, 8749, 9833, 12022, 13123, 13848, 14622, 15279, + 837, 1104, 1848, 2230, 3860, 4731, 5491, 6377, 6917, 8917, 10029, 10891, 12043, 12753, 13952, 15201, + 1136, 1564, 2097, 2558, 3026, 4824, 5743, 6459, 7664, 8183, 9819, 10837, 11538, 12762, 14193, 15309, + 1013, 1492, 2105, 2593, 3135, 5090, 6278, 6877, 7559, 8026, 9120, 10257, 11268, 12899, 14253, 15324, + 677, 952, 1578, 2156, 3456, 4665, 5545, 6815, 7822, 8967, 10044, 11143, 12218, 13205, 14269, 15290, + 560, 833, 1626, 2825, 4189, 5300, 5822, 6280, 7858, 9256, 10189, 11481, 12413, 13040, 14138, 15123, + 666, 1181, 2686, 3416, 4169, 5158, 6179, 7282, 8275, 9372, 10419, 11434, 12436, 13400, 14358, 15244, + 773, 1040, 1809, 3551, 4049, 5132, 5867, 6525, 7877, 8558, 9275, 10956, 12231, 13016, 14012, 15032, + 881, 1209, 1988, 3725, 4126, 5152, 6189, 6712, 8497, 9495, 10097, 11006, 12228, 13271, 14197, 15140, + 850, 1109, 2540, 3212, 3836, 4671, 5423, 6258, 6873, 7502, 9107, 10990, 12254, 13154, 14378, 15352, + 721, 954, 2751, 3694, 4320, 5071, 5825, 6738, 7291, 7984, 9289, 11579, 12483, 13254, 14338, 15260, + 1055, 1371, 1968, 3743, 4580, 4986, 5695, 6267, 7257, 8890, 9548, 10261, 11586, 12347, 13324, 15091, + 676, 972, 2112, 2850, 3753, 4728, 5494, 6367, 7285, 8675, 9943, 11368, 12460, 13350, 14172, 15122, + 1049, 1494, 2200, 3000, 3527, 5081, 6046, 6884, 8291, 9069, 10097, 11369, 12496, 13375, 14347, 15128, + 814, 1123, 2183, 2717, 3304, 3975, 5256, 6076, 7491, 8840, 10493, 11738, 12716, 13494, 14450, 15263, + 948, 1271, 2388, 3106, 3719, 4616, 5356, 6675, 7383, 7967, 9440, 11584, 12408, 13133, 13866, 14860, + 635, 881, 1924, 3907, 4384, 5217, 5950, 6984, 7695, 8650, 9877, 11108, 12074, 13120, 14245, 15282, + 762, 1028, 2283, 3533, 3943, 4563, 5144, 6692, 7423, 8653, 9739, 10969, 12023, 13103, 14147, 15192, + 579, 854, 1748, 3347, 3979, 4734, 5418, 7056, 8203, 9063, 10246, 11271, 12279, 13293, 14338, 15258, + 503, 768, 1465, 3077, 4620, 5151, 5798, 7143, 8378, 9391, 10401, 11373, 12315, 13200, 14113, 15106, + 717, 1002, 1807, 3675, 4066, 5418, 6034, 6837, 8445, 8980, 10353, 11755, 12753, 13520, 14476, 15232, + 672, 949, 1676, 3274, 4729, 5344, 6538, 7393, 8330, 9755, 10902, 11594, 12475, 13327, 14247, 15152, + 496, 912, 2757, 3804, 4833, 5819, 6853, 7814, 8753, 9709, 10654, 11604, 12540, 13471, 14395, 15300, + 775, 1049, 2302, 3012, 3920, 4950, 5709, 7219, 7761, 9746, 10544, 11297, 12044, 12831, 13700, 15084, + 1078, 1504, 2140, 3195, 3778, 4555, 5966, 6673, 7747, 8995, 9612, 10447, 11613, 12329, 13101, 14856, + 968, 1849, 3399, 4265, 5004, 5732, 6679, 7575, 8554, 9526, 10485, 11412, 12400, 13344, 14309, 15220, + 1199, 2464, 3945, 4913, 6009, 6786, 7495, 8106, 8835, 9620, 10520, 11438, 12438, 13342, 14319, 15235, + 1081, 2165, 3828, 4637, 5448, 6070, 6800, 7534, 8434, 9349, 10320, 11262, 12293, 13218, 14232, 15192, + 1083, 1694, 2537, 3083, 3771, 5128, 6256, 7141, 8587, 9530, 10324, 11062, 11832, 12707, 13900, 15104, + 925, 1244, 2121, 3433, 3834, 5306, 6241, 6848, 8344, 9060, 9700, 10464, 11277, 12214, 14081, 15400, + 773, 1006, 1754, 4566, 5209, 5778, 6451, 7124, 8069, 8706, 9253, 10001, 10837, 12064, 14326, 15356, + 620, 950, 1866, 3048, 4740, 5460, 5977, 6457, 7915, 9271, 9868, 10687, 11496, 12237, 13203, 15016, + 1104, 1439, 2275, 2648, 3695, 5401, 5983, 7243, 7860, 8327, 8987, 11178, 12399, 13141, 14208, 14977, + 1076, 1712, 2332, 3118, 4625, 5250, 6130, 7069, 7734, 8740, 10166, 11116, 12011, 12960, 13959, 14830, + 659, 949, 1548, 2807, 4382, 4952, 5938, 7089, 7729, 8587, 10547, 11148, 11668, 12528, 13953, 15131, + 618, 891, 1593, 3197, 3993, 4733, 5928, 6583, 7372, 9278, 10158, 10852, 12066, 13201, 14256, 15298, + 1226, 1611, 2351, 3438, 3930, 4616, 6358, 6975, 7675, 9306, 10025, 10545, 11077, 12750, 14164, 15269, + 680, 957, 1852, 3036, 3864, 5284, 5883, 6570, 7132, 8763, 9943, 10590, 11425, 12827, 14180, 15184, + 567, 890, 1811, 3039, 4034, 4670, 5067, 5886, 7597, 8889, 10127, 10989, 12275, 13126, 14471, 15240, + 1017, 1306, 1912, 4065, 5098, 5506, 6244, 6943, 7610, 8963, 10029, 10608, 11375, 12363, 14054, 15433, + 718, 949, 1640, 4407, 4989, 5504, 6145, 6846, 8055, 8755, 9764, 11309, 12335, 13157, 13991, 15052, + 833, 1104, 2582, 3256, 3910, 5291, 5740, 7382, 8142, 8582, 9618, 11230, 12436, 13284, 14118, 14993, + 1157, 1491, 2370, 3490, 3848, 5022, 5800, 6591, 7995, 8564, 9304, 10921, 12495, 13372, 14254, 15054, + 1052, 1417, 2072, 2620, 3044, 4572, 5432, 6284, 7546, 8244, 9800, 10798, 12368, 13625, 14662, 15445, + 795, 1132, 1902, 2810, 3433, 4747, 5790, 6745, 8443, 9315, 10050, 10836, 11673, 12528, 13832, 15149, + 967, 1250, 2420, 3159, 3625, 4266, 4948, 7030, 7674, 8235, 9112, 9840, 11161, 12837, 14235, 15341, + 730, 997, 2113, 3171, 3737, 4764, 5577, 6449, 7240, 8394, 9116, 10604, 12009, 13102, 14231, 15244, + 1192, 1617, 2341, 3430, 4000, 4721, 5596, 6358, 7429, 8167, 8895, 9916, 10855, 12188, 13896, 15254, + 872, 1150, 2032, 3553, 3983, 4963, 5636, 6604, 7462, 8064, 9470, 10203, 11089, 12799, 14118, 15282, + 1013, 1444, 1984, 3267, 4408, 4772, 5805, 7143, 7690, 8647, 10029, 10669, 11431, 12636, 13988, 15117, + 830, 1134, 1866, 3581, 4056, 4925, 6011, 6558, 8076, 8830, 9656, 10706, 12639, 13726, 14663, 15367, + 684, 957, 1801, 3005, 3559, 4879, 5574, 6920, 7739, 8471, 9724, 10719, 12040, 13148, 14262, 15275, + 699, 1022, 2042, 3021, 3652, 5369, 6030, 7152, 8031, 8854, 9968, 10869, 11910, 13073, 14255, 15228, + 831, 1105, 1945, 3827, 4272, 5403, 6214, 6843, 8117, 8827, 9516, 10328, 11201, 12905, 14507, 15398, + 785, 1036, 2037, 4291, 4698, 5531, 6223, 7000, 8372, 9181, 9784, 10501, 11195, 12592, 13855, 15023, + 1079, 1556, 2081, 3294, 4678, 5189, 5975, 6991, 7650, 8458, 9624, 10387, 11370, 12518, 13343, 14521, + 1085, 1535, 2122, 2772, 3190, 4157, 6280, 7310, 8119, 8898, 9511, 10169, 11313, 12529, 13732, 15153, + 1130, 1625, 2359, 3044, 3504, 5151, 6102, 6755, 7616, 8099, 8791, 9828, 10718, 12434, 14231, 15302, + 894, 1194, 1854, 2315, 3048, 5073, 5700, 6637, 7336, 8181, 9563, 10924, 12316, 13331, 14349, 15237, + 1274, 1843, 2368, 2935, 3396, 4031, 5905, 6950, 7597, 8704, 9554, 10193, 11657, 13031, 13891, 14934, + 1208, 1660, 2310, 3189, 3644, 4355, 5442, 6162, 7602, 8433, 9505, 10600, 12310, 13625, 14495, 15234, + 884, 1244, 2154, 2652, 3187, 3810, 5991, 6674, 7284, 8251, 9106, 10547, 11947, 13173, 14248, 15300, + 851, 1095, 2125, 2913, 3429, 4068, 4931, 6228, 6911, 8477, 9513, 10932, 12187, 13333, 14385, 15286, + 637, 976, 2370, 3892, 4718, 6063, 7126, 8378, 9405, 10359, 11188, 12001, 12807, 13610, 14465, 15303, + 674, 1156, 3206, 3848, 4574, 5332, 6275, 7180, 7979, 8944, 9945, 11135, 12211, 13166, 14189, 15185, + 648, 874, 1620, 4523, 5335, 5818, 6480, 7079, 8024, 8654, 9320, 10068, 11602, 13428, 14329, 15293, + 602, 831, 3174, 4258, 4758, 5558, 6154, 6862, 7261, 8173, 9894, 11228, 12406, 13185, 14416, 15390, + 728, 1050, 2523, 3324, 4581, 5112, 6274, 7249, 7665, 8228, 9024, 9779, 11962, 13886, 14569, 15310, + 625, 1064, 2658, 3373, 4317, 5328, 6341, 7576, 8230, 9137, 10072, 11030, 12105, 13071, 14050, 15127, + 860, 1199, 2569, 3264, 3928, 5082, 6012, 7023, 7568, 8726, 9899, 10975, 11665, 12602, 13465, 14849, + 994, 1326, 2131, 3392, 3914, 4629, 5507, 6365, 7208, 8086, 9307, 10139, 11960, 13752, 14791, 15505, + 1297, 1723, 2304, 2955, 3528, 4575, 5330, 6141, 7321, 7873, 9079, 11066, 12114, 12781, 13485, 14866, + 1247, 1673, 2480, 3557, 4100, 4892, 5843, 6678, 7764, 8607, 9292, 10007, 11055, 11895, 12912, 14829, + 1108, 1515, 2302, 3815, 4582, 5275, 6233, 7271, 7993, 8890, 9807, 10489, 11145, 11905, 12753, 14036, + 969, 1302, 2055, 2425, 3922, 5219, 6014, 6785, 7331, 9195, 10032, 10897, 11788, 12542, 13408, 14826, + 1042, 1398, 2217, 2813, 3449, 4242, 5032, 6957, 7766, 8985, 9916, 10576, 11237, 12222, 13952, 15302, + 1099, 1456, 2313, 2814, 3532, 5651, 6349, 7119, 8208, 8769, 9427, 10112, 11070, 12005, 12975, 14815, + 952, 1343, 2279, 4277, 5014, 5588, 6550, 7259, 8172, 9304, 10112, 10905, 11848, 12798, 13734, 14852, + 827, 1155, 2015, 2590, 3389, 5575, 6147, 7237, 8788, 9352, 9943, 10452, 11166, 11866, 13017, 14908, + 965, 1342, 1904, 3530, 4756, 5265, 6282, 7430, 8006, 8866, 10189, 10858, 11593, 12497, 13413, 14286, + 791, 1033, 1807, 4669, 5445, 6065, 6777, 7311, 8217, 8955, 9594, 10171, 10891, 11711, 13024, 15079, + 703, 982, 1468, 2926, 5508, 6551, 7045, 7648, 8280, 9027, 10043, 10724, 11477, 12486, 13816, 15160, + 636, 1084, 3228, 4342, 5051, 5884, 6638, 7545, 8362, 9253, 10190, 11160, 12212, 13207, 14220, 15198, + 821, 1100, 1682, 3559, 5618, 6419, 6944, 7630, 8233, 9075, 10130, 10822, 11427, 12149, 13027, 14146, + 629, 1332, 3013, 3722, 4532, 5532, 6531, 7553, 8517, 9499, 10507, 11474, 12457, 13390, 14358, 15272, + 1317, 2450, 3297, 3892, 4613, 5418, 6425, 7337, 8291, 9245, 10282, 11346, 12442, 13393, 14373, 15268, + 1375, 2387, 3533, 4376, 5325, 6263, 7320, 8268, 9276, 10272, 11197, 12094, 13000, 13818, 14648, 15432, + 1158, 2044, 2814, 3372, 4231, 5273, 6326, 7190, 8055, 8945, 9909, 11036, 12230, 13264, 14271, 15192, + 871, 1102, 2233, 4189, 4539, 5309, 5875, 6894, 8135, 8683, 9397, 10814, 12535, 13312, 14286, 15134, + 814, 1062, 2256, 4246, 4741, 5468, 6095, 6832, 7800, 8445, 9019, 9623, 10539, 12957, 14398, 15333, + 958, 1249, 1879, 3625, 4221, 4743, 5374, 6010, 7564, 8370, 9054, 10537, 11472, 12580, 13996, 15129, + 871, 1148, 2666, 3651, 4193, 5040, 5660, 6778, 7459, 8017, 8780, 9530, 10508, 12721, 14270, 15304, + 651, 1057, 2426, 3096, 4328, 5224, 6148, 6984, 7722, 9038, 10150, 11248, 12299, 13281, 14301, 15245, + 617, 889, 2138, 4101, 4573, 5464, 6134, 7293, 8294, 9277, 10316, 11265, 12281, 13301, 14327, 15273, + 792, 1161, 2081, 2883, 3644, 5502, 6438, 7760, 8867, 9704, 10404, 11003, 11913, 13286, 14647, 15445, + 1202, 1869, 2491, 2996, 4025, 5336, 6574, 7586, 8415, 9166, 9940, 11099, 12441, 13461, 14408, 15252, + 1164, 2036, 2762, 3315, 4510, 5722, 6901, 7925, 8892, 9813, 10715, 11594, 12526, 13416, 14359, 15235, + 1442, 2242, 2916, 3528, 4751, 5836, 6787, 7599, 8395, 9235, 10177, 11157, 12208, 13147, 14145, 15115, + 1182, 2189, 3501, 4359, 5481, 6402, 7306, 7997, 8719, 9457, 10314, 11195, 12207, 13152, 14186, 15159, + 1123, 1928, 3249, 4174, 5190, 6018, 6841, 7570, 8320, 9079, 9969, 10880, 11946, 12957, 14056, 15116, + 1391, 2121, 3172, 3766, 4449, 5215, 6232, 7171, 8096, 8981, 9854, 10664, 11746, 12851, 14017, 15116, + 1330, 2144, 2998, 3489, 4141, 5059, 6328, 7427, 8552, 9564, 10505, 11379, 12290, 13173, 14193, 15189, + 1109, 1492, 2303, 2946, 3382, 4987, 6548, 6997, 8296, 9305, 9871, 10389, 11172, 13047, 14487, 15395, + 1088, 1547, 2223, 3092, 3620, 4386, 6452, 7580, 8220, 9176, 10021, 10624, 11535, 12511, 13349, 14330, + 888, 1265, 1930, 3715, 4354, 4929, 6671, 7348, 8125, 9622, 10527, 11265, 12457, 13225, 13909, 14800, + 815, 1189, 2006, 3817, 4374, 5838, 6485, 7386, 8816, 9395, 10242, 10930, 11702, 12358, 13510, 14977, + 990, 1329, 1856, 2513, 2960, 3841, 6200, 7584, 8128, 9084, 9884, 10615, 11927, 13026, 14162, 15236, + 809, 1891, 3000, 3978, 4992, 5938, 6931, 7857, 8818, 9757, 10695, 11637, 12557, 13495, 14394, 15295, + 554, 1531, 2712, 3754, 4813, 5795, 6805, 7758, 8739, 9677, 10642, 11569, 12527, 13426, 14344, 15173, + 961, 1247, 2162, 4030, 4594, 5392, 6191, 6804, 7979, 8852, 9449, 10061, 10905, 11757, 12852, 14951, + 1214, 1854, 2494, 3286, 3894, 4471, 5973, 7358, 7967, 8807, 9608, 10178, 10994, 12344, 13316, 14487, + 1024, 1446, 2069, 2773, 3329, 5327, 6627, 7318, 8209, 8780, 9592, 11114, 12066, 12765, 13662, 14618, + 907, 1229, 2135, 2657, 3456, 4585, 5614, 6412, 7107, 8072, 10517, 11769, 12447, 13038, 14011, 15186, + 608, 888, 1729, 3791, 4395, 4825, 5374, 6977, 7738, 8387, 9316, 10715, 12651, 13548, 14546, 15311, + 941, 1202, 2101, 3123, 3503, 4159, 4619, 6676, 7402, 8223, 9627, 10280, 11822, 13131, 14470, 15468, + 800, 1065, 1726, 2186, 4630, 5715, 6394, 7256, 7782, 8452, 9368, 11407, 12394, 13086, 14086, 15167, + 875, 1208, 1941, 2508, 3296, 4447, 5532, 6821, 7582, 8862, 9556, 10519, 11696, 12896, 14109, 15273, + 900, 1183, 1959, 2423, 3386, 5868, 6409, 7218, 7883, 8442, 9143, 9913, 11104, 13003, 14241, 15213, + 1115, 1573, 2286, 3113, 3574, 4645, 5519, 6311, 8196, 8937, 9864, 11290, 12252, 13043, 13810, 14631, + 754, 1068, 2679, 3694, 4190, 5008, 5606, 7347, 8013, 8864, 9972, 10786, 11627, 12824, 14010, 15316, + 825, 1144, 1765, 3426, 4206, 4874, 6385, 7180, 7946, 9319, 10153, 10682, 11276, 11957, 13415, 15087, + 537, 862, 1866, 3116, 4349, 4842, 5496, 7245, 7958, 8822, 9611, 10099, 11455, 13291, 14370, 15284, + 887, 1205, 1698, 3243, 5173, 5813, 6470, 7237, 7881, 8707, 9739, 10497, 11284, 12115, 13185, 14869, + 726, 1002, 2984, 3728, 4334, 5142, 5946, 7127, 7676, 8367, 9085, 10668, 11889, 13054, 14011, 15180, + 771, 981, 1772, 4221, 4795, 5401, 6003, 6690, 7480, 8115, 8717, 9938, 12232, 13037, 13941, 15157, + 1303, 1922, 2468, 3316, 4185, 4656, 5507, 6631, 7341, 8291, 9593, 10378, 11412, 12616, 13556, 14820, + 1080, 1403, 2477, 2954, 3741, 4642, 5517, 6582, 7111, 7805, 8786, 9547, 11253, 12874, 14045, 15236, + 872, 1141, 2386, 3209, 3896, 5042, 5805, 7002, 7549, 8285, 9036, 9939, 12031, 13030, 13767, 15055, + 728, 1046, 2013, 4276, 5230, 5799, 6889, 7772, 8535, 9890, 10949, 11702, 12791, 13661, 14459, 15218, + 768, 1578, 3171, 4134, 5114, 6061, 7128, 8112, 9139, 10152, 11101, 12005, 12913, 13736, 14586, 15387, + 622, 1221, 3202, 4279, 5529, 6753, 7808, 8631, 9408, 10115, 10830, 11631, 12512, 13365, 14324, 15263, + 621, 848, 1626, 4612, 5335, 5797, 6416, 7167, 8286, 8933, 9880, 11327, 12709, 13565, 14439, 15329, + 650, 861, 3115, 4397, 4828, 5572, 6159, 7071, 7513, 8108, 8667, 9739, 12413, 13532, 14414, 15581, + 756, 1091, 1615, 2958, 4679, 5429, 6304, 7065, 7657, 8329, 10012, 10763, 11425, 12569, 14285, 15324, + 765, 1051, 2074, 3446, 3838, 5659, 6318, 7149, 8407, 8942, 9688, 11058, 12443, 13347, 14361, 15231, + 1121, 1473, 2217, 2827, 3347, 5017, 5872, 6668, 7595, 8264, 9085, 10487, 12210, 13022, 13866, 14985, + 1056, 1457, 2212, 2861, 3453, 5060, 5976, 6759, 7697, 8519, 9461, 10348, 11169, 12000, 13798, 15274, + 1042, 1388, 2220, 3677, 4297, 5120, 6037, 6788, 7788, 8549, 9262, 10069, 10878, 11755, 14085, 15413, + 961, 1331, 1957, 3111, 3796, 4344, 5010, 5553, 7612, 9441, 10155, 10903, 11982, 12664, 13391, 14959, + 1135, 1470, 2082, 3284, 3937, 4423, 5140, 5618, 7055, 8860, 9355, 10318, 11706, 12556, 13826, 15192, + 1084, 1383, 2209, 3550, 4038, 4636, 5240, 5911, 8011, 9044, 9570, 10294, 11155, 11865, 13587, 15219, + 737, 1028, 1858, 2434, 3038, 3815, 5414, 6560, 7753, 9010, 10088, 11109, 12200, 13241, 14292, 15286, + 979, 1377, 2142, 3511, 4042, 4787, 5869, 6505, 7764, 8710, 9567, 10378, 11383, 13445, 14620, 15417, + 802, 1063, 1768, 3997, 4648, 5273, 6005, 6694, 7698, 8427, 9191, 10230, 11176, 12425, 13991, 15244, + 926, 1148, 2359, 3438, 3811, 4446, 4994, 6492, 7088, 7840, 8921, 9955, 11823, 13037, 14140, 15275, + 639, 939, 1753, 3080, 4204, 5022, 5702, 6198, 6811, 8268, 9786, 10836, 12243, 13126, 14260, 15306, + 736, 1079, 1802, 3276, 4001, 5415, 6381, 7119, 8492, 9232, 10308, 11105, 12031, 12793, 13904, 15114, + 1249, 1897, 2616, 3398, 4149, 4840, 5809, 6616, 7453, 8768, 9869, 10767, 12051, 13177, 14339, 15241, + 1026, 1314, 2014, 3249, 3690, 4344, 4892, 5691, 7289, 7970, 9397, 10615, 11663, 13015, 14272, 15328, + 970, 1249, 2342, 2895, 3661, 4685, 5348, 6691, 7176, 8850, 10323, 11025, 11936, 12697, 13429, 14816, + 872, 1155, 1680, 2334, 2880, 4439, 6448, 7088, 8221, 9517, 10060, 10691, 11577, 12830, 14274, 15377, + 874, 1131, 2067, 2714, 3203, 3786, 4480, 6643, 7487, 8708, 9861, 10989, 12079, 13208, 14240, 15290, + 804, 1079, 1708, 2236, 2842, 5275, 6096, 7030, 7886, 8704, 9978, 11354, 12923, 13800, 14706, 15380, + 646, 907, 1724, 3428, 3981, 5158, 5889, 7244, 8226, 8728, 9227, 10055, 11833, 13065, 14232, 15287, + 986, 1315, 1948, 2518, 3010, 5465, 6638, 7224, 8275, 8820, 9602, 10482, 11268, 12169, 14206, 15449, + 565, 805, 1593, 3458, 4571, 5319, 6411, 7828, 8796, 9460, 10121, 10926, 11931, 12989, 14085, 15181, + 532, 795, 1654, 3253, 3949, 5323, 6246, 7279, 8378, 9364, 10397, 11379, 12395, 13375, 14390, 15290, + 835, 1169, 1895, 2461, 3233, 5608, 6358, 7353, 8521, 9756, 10632, 11371, 12291, 12967, 13777, 14575, + 528, 840, 1585, 2511, 4342, 5075, 5825, 7183, 8370, 8938, 9529, 10614, 12398, 13483, 14482, 15340, + 789, 1044, 2065, 2677, 3589, 5397, 5969, 7559, 8126, 8638, 9332, 10989, 12645, 13441, 14355, 15188, + 685, 970, 1644, 2232, 4331, 5344, 6203, 6877, 7736, 9534, 10331, 11186, 11981, 12778, 13629, 14878, + 800, 1120, 1829, 2303, 4180, 4963, 5877, 6722, 7425, 8436, 9106, 10138, 12113, 13163, 14087, 15242, + 851, 1150, 2243, 3088, 3642, 5370, 6027, 6953, 7919, 8562, 9276, 9957, 10896, 12786, 14320, 15324, + 735, 1113, 2000, 3196, 4699, 5471, 6589, 7347, 8003, 8855, 9650, 10594, 12001, 13017, 13918, 15089, + 837, 1098, 1699, 2175, 3008, 6101, 6902, 7529, 8229, 8790, 9674, 10585, 11532, 12971, 14334, 15323, + 626, 1278, 3315, 4325, 5436, 6586, 7790, 8824, 9821, 10690, 11482, 12268, 13043, 13789, 14591, 15381, + 1439, 2612, 3825, 4715, 5881, 7098, 8204, 9129, 10075, 10889, 11673, 12416, 13159, 13897, 14672, 15420, + 1489, 2697, 3785, 4568, 5440, 6284, 7191, 8043, 8936, 9852, 10756, 11696, 12662, 13539, 14458, 15314, + 663, 932, 1850, 4514, 5042, 5800, 6482, 7381, 8674, 9537, 10447, 11239, 12074, 12975, 13958, 14969, + 695, 1028, 1781, 2195, 4548, 5142, 6539, 7282, 7728, 8259, 8915, 9755, 11646, 13482, 14373, 15221, + 846, 1138, 1713, 2239, 2823, 5254, 6237, 6940, 7777, 8443, 9981, 10858, 11793, 13022, 14259, 15331, + 595, 882, 1481, 3108, 4815, 5391, 5979, 6529, 8058, 8939, 9706, 10649, 11884, 13065, 14350, 15334, + 887, 1139, 1829, 2276, 3102, 5552, 6221, 7067, 7712, 8368, 9127, 10682, 12241, 13127, 14112, 15133, + 1019, 1418, 2165, 2865, 3353, 4937, 6019, 6784, 7810, 8440, 9197, 10025, 12092, 13614, 14602, 15352, + 951, 1206, 2295, 3066, 3586, 4125, 4780, 7215, 7687, 8320, 9079, 10918, 12519, 13503, 14488, 15224, + 847, 1149, 2069, 2504, 4231, 5041, 6034, 6862, 7321, 7882, 8765, 10837, 12433, 13022, 13809, 15203, + 829, 1111, 2677, 3505, 3999, 5080, 5694, 7033, 7667, 8302, 8963, 10297, 12410, 13340, 14485, 15373, + 908, 1284, 2182, 2613, 3944, 5116, 5768, 7284, 7825, 8461, 10123, 11755, 12583, 13368, 14195, 15053, + 930, 1215, 2323, 2834, 3500, 4216, 5200, 5956, 6576, 7757, 9998, 10921, 12073, 12844, 14003, 15254, + 973, 1343, 2164, 3265, 3733, 4538, 5294, 6469, 7850, 8468, 9747, 10750, 11398, 12428, 13990, 15226, + 952, 1239, 1992, 3093, 3498, 4156, 4605, 5695, 7946, 8668, 9684, 11027, 12029, 13102, 14093, 15158, + 558, 828, 1638, 2628, 3361, 4827, 6046, 7182, 8226, 9297, 10326, 11331, 12343, 13333, 14312, 15248, + 543, 797, 1292, 2197, 4031, 4954, 6096, 7133, 8292, 9244, 10253, 11267, 12293, 13293, 14303, 15272, + 562, 818, 1546, 2854, 3792, 5212, 5897, 6697, 8329, 9105, 10103, 11572, 13033, 13866, 14716, 15223, + 897, 1320, 1937, 2717, 3205, 4412, 6880, 7773, 8381, 9585, 10492, 11242, 12589, 13425, 14212, 15053, + 798, 1174, 2038, 2482, 3869, 4999, 5820, 7157, 7807, 9160, 10013, 11078, 12122, 13113, 14028, 14997, + 686, 1000, 2269, 3020, 3755, 5347, 5960, 7664, 8406, 9199, 10485, 11521, 12512, 13361, 14217, 15144, + 715, 1058, 1660, 3282, 4591, 4997, 6361, 7315, 7878, 9084, 10356, 11033, 12186, 13333, 14390, 15279, + 784, 1087, 1584, 3299, 5404, 6007, 6611, 7254, 7870, 8870, 10201, 10911, 11780, 12799, 14077, 15156, + 664, 905, 1952, 4880, 5346, 5934, 6519, 7374, 8530, 9311, 10103, 10819, 11525, 12818, 14071, 15168, + 626, 914, 2854, 4227, 4737, 5634, 6361, 7354, 7918, 8636, 9491, 10701, 11785, 13139, 14220, 15292, + 1793, 3491, 4468, 5330, 6092, 6716, 7382, 8023, 8852, 9777, 10729, 11640, 12576, 13418, 14323, 15182, + 688, 949, 1560, 3990, 5022, 5519, 6194, 6798, 8071, 8773, 9515, 10514, 12712, 13784, 14609, 15400, + 783, 1014, 2824, 3542, 4129, 4903, 5606, 6542, 6965, 7778, 10053, 10913, 11995, 12759, 13498, 15320, + 753, 1093, 2085, 2706, 4391, 5134, 5930, 6777, 7408, 8184, 9523, 10719, 12392, 13543, 14552, 15277, + 920, 1325, 2067, 2928, 3400, 4646, 5913, 6704, 8091, 8819, 9941, 10843, 12080, 13740, 14761, 15449, + 618, 961, 2096, 3325, 4242, 5555, 6567, 7721, 8801, 9891, 10891, 11871, 12871, 13717, 14555, 15310, + 826, 1165, 2466, 3876, 4364, 5723, 6461, 7667, 8417, 9095, 9913, 10755, 11704, 12971, 14239, 15196, + 1056, 1577, 2885, 3726, 4232, 5031, 5736, 6842, 8006, 8903, 10198, 11414, 12536, 13409, 14359, 15205, + 876, 1205, 2453, 3059, 3652, 4312, 5617, 6518, 7542, 8743, 9363, 11286, 13049, 13835, 14643, 15303, + 763, 990, 2805, 3723, 4228, 4936, 5628, 6613, 7058, 7705, 8476, 10130, 11974, 13113, 14180, 15342, + 857, 1152, 1913, 3994, 4629, 5137, 6183, 6861, 7722, 9347, 10177, 10777, 11599, 13112, 14298, 15264, + 656, 1269, 3434, 4621, 5637, 6438, 7220, 7942, 8741, 9612, 10517, 11433, 12435, 13354, 14316, 15237, + 1359, 2605, 3748, 4758, 6042, 7092, 7952, 8651, 9338, 9974, 10723, 11579, 12528, 13418, 14397, 15297, + 1529, 3067, 4410, 5449, 6449, 7233, 7901, 8525, 9237, 10002, 10859, 11784, 12730, 13589, 14467, 15300, + 1790, 3311, 4192, 4897, 5538, 6210, 6922, 7697, 8597, 9590, 10560, 11494, 12426, 13283, 14229, 15138, + 1252, 2359, 3404, 4211, 5155, 6055, 7030, 7899, 8850, 9793, 10761, 11714, 12674, 13565, 14489, 15352, + 590, 998, 2402, 3314, 4528, 5604, 6649, 7644, 8508, 9487, 10408, 11383, 12335, 13276, 14293, 15243, + 727, 1025, 1614, 3818, 5876, 6391, 6980, 7606, 8211, 9304, 10696, 11324, 12381, 13241, 13988, 14791, + 621, 899, 2068, 4152, 5232, 6483, 7323, 8193, 8960, 9627, 10417, 11291, 12234, 13192, 14216, 15187, + 582, 828, 1926, 4025, 4942, 6029, 6957, 7599, 8278, 9093, 10032, 11126, 12233, 13209, 14256, 15311, + 788, 1126, 1690, 3183, 3923, 4599, 6240, 6890, 7758, 9022, 9656, 10453, 11779, 12706, 13913, 15214 +}; + + +const Word16 lsf_cdk_nb_gc_stg1[] = /* 14Q1*1.28 */ +{ + -2046, -827, -3490, -8984, -9331, -8562, -2854, 112, 2194, 13294, 11592, 7952, + -294, 2271, 1647, -1260, -2029, -3649, -4081, -3432, -3649, 333, 5042, 4720, + -1209, 984, -241, -3413, -4476, -4817, -2910, -2016, -2016, 2900, 6868, 5408, + -1900, 896, 688, -197, -33, -993, -1470, -1283, -2145, -665, 2161, 4064, + -1998, -351, -1985, -4742, -4879, -5329, -3500, -2023, -1264, 8507, 9766, 6640, + 245, 3962, 3664, 1935, 1601, 144, -1054, -1236, -2225, -2647, -3746, 1695, + -3051, -1382, -1825, 828, 2537, 1872, 957, 689, -592, 1675, 5507, 5216, + -2178, -281, 2097, 5417, 4372, 1648, -802, -1304, -2817, -754, 3345, 4224, + -3400, -2402, -4098, -3148, -2066, -1985, -558, 466, 705, 11042, 11096, 7424, + 776, 4355, 3200, -1139, -2922, -3985, -2990, -2405, -2881, -661, 2897, 4176, + -1818, 394, -385, -1504, -1545, -2913, -3062, -2451, -2609, 2093, 6387, 5248, + -1081, 2069, 1952, 1345, 1649, 64, -1394, -1526, -2577, -2051, -1025, 2863, + 276, 2780, 1567, -3228, -4881, -5970, -4363, -3523, -3089, 3447, 7300, 5456, + 1917, 6445, 5552, 2069, 684, -1233, -2371, -2377, -3409, -1635, 1616, 3648, + -2734, -1049, -2001, -1927, -1908, -2273, -1294, -652, -944, 4451, 7893, 5888, + -1193, 2108, 5153, 7875, 8214, 6145, 2891, 2001, 208, -1312, -2273, 1599, + -3697, -3538, -6739, -7238, -4524, -2464, 2424, 4591, 6098, 15691, 13066, 8912, + -352, 2108, 847, -247, 1179, -769, -2757, -2873, -3713, 203, 4994, 4688, + -1185, 1565, 703, -1788, -2372, -2721, -1951, -1554, -2129, -374, 2529, 4192, + -2094, 401, 352, 1118, 2376, 1632, 582, 351, -1009, -1389, -784, 3056, + -367, 1637, -145, -5132, -6888, -8178, -5371, -3397, -1776, 9469, 9894, 6752, + 953, 5894, 6785, 5196, 4663, 2400, 31, -598, -2065, -2581, -2786, 1743, + -2637, -1222, -560, 5363, 6867, 5329, 2192, 1264, -544, -508, 1345, 3664, + -1112, 1918, 2976, 3989, 4508, 3104, 1245, 606, -897, -2381, -4258, 1119, + -1983, -328, -2930, -6112, -1802, 144, 486, 194, -960, 4066, 7797, 5872, + 648, 3526, 3104, 562, -200, -2177, -3380, -3162, -3857, -1516, 2433, 3920, + -2908, -722, -417, -181, 290, -352, -352, -175, -1088, 1689, 5603, 5184, + -536, 2771, 2064, 10, -643, -1793, -1733, -1523, -2193, -1813, -1585, 2831, + 2239, 5541, 4400, -637, -2370, -4802, -5148, -3901, -2912, 7328, 9222, 6320, + 8159, 12344, 9921, 5311, 4611, 2480, -1461, -1819, -2032, 5438, 7396, 5968, + -3908, -2998, -3105, 1031, 2171, 1952, 2012, 1982, 1280, 8825, 10343, 7056, + -80, 5935, 10546, 12414, 12351, 9601, 4823, 3380, 1152, -840, -2161, 1967 +}; +const Word16 lsf_cdk_nb_gc_stg2[] = /* 14Q1*1.28 */ +{ + -476, -1387, -3185, 464, 1104, 0, + -1029, -675, 63, -1664, -1168, 0, + -691, -1002, -1697, -1968, -704, 0, + -957, -724, -945, 816, 928, 0, + -1131, -2087, -1296, 2704, 1376, 0, + -1167, -1003, 512, 592, 192, 0, + 492, 517, -721, -3600, -1888, 0, + 489, -147, -1153, -688, -864, 0, + 865, 179, -608, 2000, 1008, 0, + -1286, -1953, -1633, -304, -368, 0, + 2033, 1593, -369, -576, 272, 0, + -718, 685, 751, -192, 192, 0, + 1394, 1172, 1520, -480, -576, 0, + -1455, -466, 2896, 2176, 896, 0, + -1171, 324, 2512, -272, -496, 0, + 4950, 5112, 3536, 1040, 80, 0 +}; +const Word16 lsf_cdk_nb_gc_stg3[] = /* 14Q1*1.28 */ +{ + 1, 6, -801, -3701, -3408, -1712, 2661, 2257, 768, + 4, 11, -481, -1886, -2409, -2353, -652, 1216, 256, + 14, 6, -1713, -1706, -1012, -817, -1158, -369, -97, + 8, 15, 127, -780, -1241, -1617, -2819, -1474, -577, + 13, 6, 2320, 103, -1175, -1681, 297, 1536, 384, + 4, 14, -529, -319, -161, -129, -2113, -4131, -1281, + 0, 5, -2001, -1650, -185, 1040, 2146, 1713, 736, + 12, 4, 320, 1615, 1634, 1376, -1700, -4675, -1697, + 15, 13, -401, -348, -511, -320, 2570, 2865, 944, + 7, 14, 335, -1107, -768, -112, -338, -65, 15, + 13, 15, -1025, 563, -38, -865, -1105, 383, 31, + 4, 6, 1056, 1034, 443, -289, -2357, -1986, -689, + 7, 6, 1008, 1608, 1329, 816, 730, 1312, 432, + 4, 12, -1281, 789, 1794, 1328, -517, -561, -113, + 12, 4, 704, 1656, 2289, 3153, 5215, 3682, 1680, + 11, 15, 2528, 4255, 3539, 2320, -669, -1585, -641 +}; +const Word16 lsf_cdk_nb_vc_stg1[] = /* 14Q1*1.28 */ +{ + -1950, -1358, -4562, -8912, -8626, -8050, -2211, 1051, 4226, 15749, 13194, 8800, + 224, 2532, 175, -5316, -6930, -5601, 381, 515, -416, 3224, 6964, 5584, + -2481, -1570, -3746, -3444, -3066, -3665, -2328, -929, -256, 10781, 10903, 7280, + -164, 2676, 1952, 1170, 1362, 32, -809, -978, -1793, -2288, -3137, 2287, + -1649, -589, -3746, -9056, -6586, -2160, 1693, 1869, 1072, 8982, 10375, 7056, + -1442, 731, -465, -352, 881, 0, -1397, -1476, -2273, -792, 2209, 4048, + -570, 1125, -577, -4067, -5011, -6130, -4457, -3228, -2464, 7796, 9414, 6432, + 314, 2780, 1599, -2442, -4050, -5762, -4680, -3747, -3169, 3706, 7556, 5568, + -3306, -3212, -6178, -5257, -2978, -2209, 33, 2038, 3490, 15396, 13130, 8704, + -303, 2334, 927, -1025, -1877, -2753, -1964, -1602, -2145, -943, 1457, 3872, + -1437, 228, -1633, -3020, -3188, -2833, -1579, -942, -1184, 2482, 6532, 5408, + 2622, 6487, 4448, 511, -1383, -2769, -2495, -2230, -2977, -107, 4082, 4480, + -1897, -706, -2994, -2432, 566, 704, 220, 99, -608, 3533, 7300, 5744, + -2605, -1419, -1376, 1700, 1217, 112, -957, -849, -1633, 1902, 6131, 5296, + 2177, 3621, 751, -6700, -10534, -11698, -2205, 713, 3954, 15329, 12986, 8656, + 7156, 9030, 4704, 653, -2345, -6178, -4996, -1616, 1762, 14213, 12329, 8272, + -997, 238, -2066, -5868, -6868, -7474, -4302, -2171, -623, 12371, 11336, 7600, + 2585, 4011, 959, -298, 477, -353, -2457, -2786, -3233, 5865, 8693, 6064, + -2145, -680, -1553, -1961, -2011, -3249, -3184, -2317, -1968, 5674, 8613, 6080, + 675, 4202, 4128, 2060, 1483, -865, -2647, -2552, -3377, -2094, 64, 3184, + -3084, -2915, -5698, -905, 1626, 2176, 1517, 1566, 1024, 9339, 10663, 7232, + -741, 1377, 1168, 206, 185, -1601, -3079, -2936, -3553, -265, 4402, 4528, + 872, 3048, 799, -4039, -5660, -7890, -7222, -4564, -1792, 10306, 10311, 6992, + 2766, 6132, 4848, -1357, -2881, -4914, -4864, -3528, -2608, 9503, 10134, 6832, + -1649, -1598, -6691, -10943, -5664, -3632, 2663, 6788, 11044, 19895, 15933, 10416, + 530, 3138, 2560, -401, -1453, -3425, -4047, -3463, -3713, 252, 4914, 4672, + -879, 1210, 47, -2253, -2732, -3777, -3689, -2947, -2833, 2110, 6499, 5232, + 5749, 8736, 6865, 3519, 2447, 383, -1446, -1459, -2385, 970, 4146, 4560, + -2556, -1914, -3969, 3390, 7938, 6305, 1777, 560, -928, 1091, 4563, 4928, + -1808, -411, 1313, 6469, 6395, 3680, 398, -149, -1713, -1588, 832, 3360, + 3630, 5517, 2479, -2938, -6552, -10675, -4951, -545, 1441, 13744, 12041, 8080, + 10956, 13776, 9201, 4285, 3873, -801, -5835, -2466, 1233, 13746, 12105, 8192 +}; +const Word16 lsf_cdk_nb_vc_stg2[] = /* 14Q1*1.28 */ +{ + -377, -729, -1793, 400, 1312, 0, + -1197, -1432, -2033, -1936, -1520, 0, + -403, -100, 127, -3232, -3456, 0, + 555, 364, -865, -592, -1264, 0, + -1136, -1968, -2640, 4448, 3824, 0, + -1539, 94, 591, 1600, 1376, 0, + -1564, -393, 2528, -304, -688, 0, + 1075, 823, 1648, -96, -704, 0, + -770, -404, 527, -1648, 64, 0, + -1320, -1678, -1072, 48, -688, 0, + 145, 83, -1089, -3632, -448, 0, + 1994, 1756, 159, 1120, 1504, 0, + 282, -236, -800, 2080, 624, 0, + -1357, -1537, 1008, 2624, 1360, 0, + 2002, 2046, 1215, -2336, -1808, 0, + 3757, 3480, 2592, 1472, 512, 0 +}; +const Word16 lsf_cdk_nb_vc_stg3[] = /* 14Q1*1.28 */ +{ + 3, 5, -657, -4633, -3805, -736, 1304, 1024, 368, + 6, 12, -305, -1836, -2507, -2625, -1818, -241, -305, + 6, 4, -2577, -1854, -1236, -1073, -594, 207, -1, + 2, 2, -80, 643, 38, -993, -3719, -1602, -769, + 13, 10, -625, -1825, -2422, -2449, 2887, 2625, 784, + 6, 0, -336, 315, 466, 560, -2183, -4867, -1345, + 10, 7, -2625, 1255, 2305, 1296, 181, 544, 208, + 0, 7, 912, 1998, 1662, 623, -416, 256, 32, + 10, 6, -1713, -1720, -311, 1408, 2066, 1585, 672, + 7, 11, 15, -1217, -99, -33, -851, -33, -81, + 12, 0, -1680, 556, -499, -897, 454, 896, 256, + 2, 8, 2608, 425, -938, -1937, -1205, 15, -177, + 6, 2, 1504, -796, -939, 80, 2179, 1777, 672, + 3, 13, 1984, 3517, 3171, 2320, -2605, -5651, -1857, + 14, 2, -160, 1660, 2380, 2832, 2924, 2097, 992, + 10, 0, 3857, 3623, 2853, 1728, 1554, 1441, 656 +}; +const Word16 lsf_cdk_wb_gc_stg1[] = /* 14Q1*1.28 */ +{ + -854, -266, -3202, -8408, -10604, -11763, -10826, -9448, -7970, -4784, -3493, -2593, + -2727, -1241, -1489, -1469, -1977, -2529, -2344, -2279, -2273, -1750, -1365, -1505, + -728, 1001, -113, -1594, -2256, -3553, -4619, -4591, -4497, -3300, -2327, -2129, + -590, 1699, 1264, 1187, 300, -865, -1554, -1669, -1649, -1202, -837, -1169, + -1612, -578, -2546, -5013, -6155, -6834, -6779, -6002, -5506, -3988, -2968, -2625, + -1725, 1072, 1280, 74, 277, 672, 1385, 2172, 2688, 2643, 2065, 848, + -86, 3639, 3824, 1931, 2115, 1120, 338, 500, 496, 751, 718, -65, + -1024, 1647, 5377, 9202, 8763, 7665, 5376, 4447, 3824, 2803, 2000, 608, + -2585, -2600, -6211, -11489, -11790, -10322, -5788, -3684, -2289, -465, -33, -289, + -3165, -2478, -3521, -1181, 298, 1632, 2160, 2107, 2272, 2075, 1407, 319, + 1275, 3587, 2848, 570, -26, -1489, -4034, -4818, -5202, -3732, -2550, -2049, + -2614, -1530, -848, 4992, 6996, 8002, 9185, 9172, 9106, 7739, 5862, 3408, + 440, 2263, 751, -3627, -4674, -4978, -4938, -5078, -5554, -5428, -4266, -3361, + -2308, -80, 176, 2603, 3871, 3792, 3219, 2667, 2480, 2189, 1405, 95, + 2569, 6546, 6257, 3885, 2438, 1504, 1431, 1319, 1392, 1337, 942, -65, + -712, 3328, 6290, 10673, 12635, 13827, 14544, 13939, 13619, 10691, 8026, 4768, + 842, 2338, 159, -5945, -8498, -9619, -8197, -7076, -6066, -4502, -3722, -3409, + -1628, 617, -129, -1907, -2194, -1505, -95, 486, 928, 1268, 1071, 175, + 538, 3277, 2111, -1606, -3194, -3553, -2105, -1604, -1393, -974, -740, -1009, + -1279, 456, 2593, 6823, 5435, 3536, 1502, 544, -96, -521, -548, -1105, + -983, 675, -865, -4388, -5936, -5697, -3245, -2211, -1633, -519, -276, -849, + -102, 3506, 2480, 332, -670, -448, 859, 1384, 1776, 1846, 1568, 448, + 270, 5022, 5136, 4435, 4546, 4305, 4185, 4385, 4337, 3659, 2785, 1152, + 216, 5449, 10098, 11459, 11060, 9922, 8139, 7175, 6289, 4794, 3394, 1600, + -3137, -3309, -5826, -6310, -5500, -4385, -2187, -1054, -288, 502, 527, -129, + -2997, -2031, -1344, 2452, 2535, 1856, 912, 451, 272, -124, -515, -993, + 3808, 7001, 5536, 908, -807, -1665, -2041, -2232, -2449, -2206, -1782, -1905, + -1117, 2493, 3616, 4843, 5755, 6273, 6815, 6906, 6769, 5801, 4580, 2528, + 2509, 4911, 3439, -2294, -4945, -7203, -9006, -7957, -6818, -4297, -3321, -3009, + -1110, 1877, 1776, 2112, 2398, 2704, 3465, 3938, 4257, 4039, 3202, 1568, + 7131, 11568, 10626, 7755, 6467, 5073, 4839, 4543, 4128, 3206, 2160, 912, + 2457, 10049, 15204, 18687, 18433, 17364, 14947, 13353, 11682, 8277, 6182, 3232 +}; +const Word16 lsf_cdk_wb_gc_stg2[] = /* 14Q1*1.28 */ +{ + -1224, -2316, -3425, -928, 128, 0, + -1874, -2354, -1025, -624, -448, 0, + -1026, -888, -481, -2352, -1024, 0, + 838, 174, -2306, -4048, -960, 0, + -1336, -2679, -1776, 2464, 1200, 0, + 497, 2649, 3536, 1344, 320, 0, + -1099, 4, 2448, -544, -752, 0, + 993, 486, 592, 64, -480, 0, + 288, -551, -2385, 1824, 2016, 0, + -1090, -815, 128, 1008, 704, 0, + 279, -579, -1729, -560, -832, 0, + 60, 1211, 543, -288, 272, 0, + 480, 1062, 560, 3152, 1680, 0, + -1276, -672, 2961, 2704, 1200, 0, + 1357, 1787, 767, -3424, -2768, 0, + 4229, 3682, 1696, 192, -256, 0 +}; +const Word16 lsf_cdk_wb_gc_stg3[] = /* 14Q1*1.28 */ +{ + 15, 1, -1665, -4778, -4630, -3105, -554, -304, -112, + 13, 10, -753, -1579, -1817, -1953, -2415, -2148, -1697, + 8, 15, 1135, -1716, -3415, -5154, -4958, -3443, -1905, + 4, 1, -32, 570, 443, -65, -2187, -2759, -2561, + 4, 14, 399, -979, -269, 816, 385, -194, -673, + 2, 5, -2161, -1600, -401, -97, -412, -433, -321, + 0, 15, 2128, 3449, 1993, 175, -2815, -2580, -1729, + 3, 2, 400, 714, 1209, 1904, 2711, 2436, 1840, + 9, 13, 143, -1925, -2694, -2545, 358, 930, 960, + 10, 0, -960, 868, 173, -513, -97, 577, 896, + 0, 5, 1824, 11, -1080, -1761, -1565, -1058, -705, + 7, 1, -880, 2304, 2790, 2384, 573, -18, -273, + 5, 8, 1840, 1467, 978, 768, 598, 351, -17, + 6, 7, -1473, -2052, -711, 992, 3166, 2788, 2080, + 7, 12, 1856, 3557, 3483, 3184, 2417, 1923, 1408, + 3, 13, -1649, 1850, 4068, 5073, 4907, 4086, 2976 +}; +const Word16 lsf_cdk_wb_vc_stg1[] = /* 14Q1*1.28 */ +{ + -1159, -1161, -5395, -12785, -14024, -12291, -8572, -6523, -4593, -1979, -1169, -897, + -1903, -921, -2065, -1931, -2752, -3825, -4238, -4174, -4145, -3108, -2167, -2081, + 522, 1696, -513, -6103, -8611, -9571, -9024, -8617, -7826, -5631, -4489, -3761, + -1839, -544, -1280, 1080, 564, 752, 844, 1110, 1344, 1185, 1039, 63, + -2685, -2538, -5074, -6161, -6745, -6738, -5709, -4457, -3377, -1830, -1188, -1185, + -3059, -3565, -6706, -3405, -1183, -272, -112, 33, 160, -5, 13, -721, + 4464, 5425, 1535, -8151, -13242, -15171, -5882, -2159, -288, 176, 739, 1440, + 1431, 2210, -769, -2539, -889, -721, -4378, -6019, -8099, -8147, -6215, -3873, + -1779, -2663, -8548, -12911, -8955, -5265, -1796, -700, 240, 746, 528, -160, + -847, 1228, 735, -1117, -1191, -1857, -2236, -2407, -2321, -1779, -1542, -1665, + -11, 1561, 591, -2764, -3940, -4994, -5679, -5652, -5586, -4852, -3930, -3297, + -783, 2500, 2912, 1480, 864, -64, -492, -833, -769, -353, -452, -1009, + -1207, 305, -1169, -3978, -4167, -3249, -1227, -606, -48, 233, -51, -545, + -2442, -2531, -3873, 5622, 7990, 7025, 4210, 3337, 2576, 1042, 237, -673, + 7644, 9215, 4703, -2206, -6625, -10676, -11281, -8039, -4321, -386, 15, -113, + 5397, 7494, 5296, -39, -1846, -2017, -1875, -1846, -1697, -2156, -2072, -1969, + -279, 230, -3010, -8280, -10317, -11859, -10729, -9576, -7922, -4867, -3862, -2865, + -899, -234, -2897, 3569, 4566, 799, -5740, -7153, -6546, -3276, -2048, -960, + 954, 3319, 1295, -3334, -5133, -5137, -2866, -2245, -1793, -1073, -934, -1281, + -1098, 1538, 1024, 1919, 2978, 3729, 4709, 5431, 5521, 4962, 3843, 1920, + -772, 429, -1810, -5319, -6411, -7074, -6828, -6001, -5266, -3901, -3160, -2833, + -140, 1442, -1153, -2496, -631, 1264, 2033, 3167, 3840, 3225, 2577, 1232, + 2263, 4102, 1167, -4671, -6812, -9651, -10507, -2400, 272, 1823, 1124, -2641, + 3904, 5709, 4800, 1435, -1797, -3682, -7176, -9009, -11812, -10666, -5157, -2353, + 122, 738, -2898, -9698, -11180, -8161, -1527, -926, -352, 476, -116, -705, + 1615, 3938, 3296, -117, -1405, -2593, -4075, -4383, -4273, -3528, -3017, -2881, + 3319, 4999, 2191, -4352, -6684, -7394, -7503, -7494, -6914, -5038, -4138, -3841, + 1933, 5658, 4544, 2619, 2149, 1456, 812, 401, 240, 207, 12, -673, + 1747, 3791, 1295, -236, -1712, -1232, 632, 903, 1488, 1527, 1184, 368, + -1030, 922, 4017, 7665, 6754, 5073, 3236, 1989, 1056, 426, 45, -609, + 12487, 14522, 8896, 2687, 1057, -3810, -10425, -9171, -6482, -2948, -2321, -1169, + 7344, 9906, 7921, 4454, 3289, 2320, 1483, 513, 192, 491, 493, 79 +}; +const Word16 lsf_cdk_wb_vc_stg2[] = /* 14Q1*1.28 */ +{ + -182, -1035, -2593, -176, 528, 0, + -2110, -2904, -2881, -1696, -864, 0, + -160, -876, -1777, -4160, -2112, 0, + 1601, 651, -1393, 208, -896, 0, + -1109, -1806, -2112, 2592, 1360, 0, + -1723, -1575, 1104, 912, 288, 0, + -700, 1343, 687, 1408, 144, 0, + 863, 454, 864, 464, -160, 0, + -1234, -1141, -289, -832, 832, 0, + -230, -608, -480, -1520, -2352, 0, + 1268, 2126, 1919, -3440, -3072, 0, + 1298, 1365, -65, -2832, 672, 0, + 1095, 493, -849, 3184, 3056, 0, + -469, -479, 1617, 3728, 2112, 0, + -675, 1400, 3984, 240, -592, 0, + 2580, 2697, 2432, 1920, 1040, 0 +}; +const Word16 lsf_cdk_wb_vc_stg3[] = /* 14Q1*1.28 */ +{ + 7, 3, -1329, -4391, -3913, -3041, -859, -255, 176, + 13, 7, -2257, -960, -1287, -1649, -1313, -770, -433, + 3, 13, -33, -1650, -2302, -2721, -4039, -3798, -2609, + 10, 4, 0, 1123, 279, -1057, -2271, -1039, 160, + 7, 12, 15, -748, 384, 848, -1029, -1992, -2385, + 4, 1, -2417, -2753, -316, 912, 1240, 993, 704, + 0, 0, 2497, 3043, 1347, -849, -5667, -5913, -4193, + 5, 2, 848, 519, 1737, 2560, 1763, 1506, 912, + 12, 12, 271, -2734, -3306, -736, 1294, 383, -209, + 10, 14, -577, -71, -129, -449, 1561, 2068, 1920, + 14, 1, 1408, -1285, -2943, -4177, -1355, 306, 752, + 15, 8, -2529, 2194, 2953, 2368, 1761, 1377, 816, + 14, 10, 3024, 1322, 224, -304, 514, 511, -81, + 1, 12, -849, -709, 112, 2417, 5221, 4664, 3648, + 1, 9, 160, 3607, 3314, 2016, -333, -884, -1233, + 13, 12, 1888, 3621, 3935, 4000, 3607, 2932, 2128 +}; + +const Word16 *const lsf_codebook[2][2][TCXLPC_NUMSTAGES] = /* 14Q1*1.28 */ +{ + { + { lsf_cdk_wb_gc_stg1, lsf_cdk_wb_gc_stg2, lsf_cdk_wb_gc_stg3 }, + { lsf_cdk_wb_vc_stg1, lsf_cdk_wb_vc_stg2, lsf_cdk_wb_vc_stg3 } + }, + { + { lsf_cdk_nb_gc_stg1, lsf_cdk_nb_gc_stg2, lsf_cdk_nb_gc_stg3 }, + { lsf_cdk_nb_vc_stg1, lsf_cdk_nb_vc_stg2, lsf_cdk_nb_vc_stg3 } + } +}; + +const Word16 lsf_numbits[TCXLPC_NUMSTAGES] = { 5, 4, 4 }; // Q0 + +const Word16 lsf_dims_ivas[TCXLPC_NUMSTAGES] = { 16, 6, 10 }; // Q0 +const Word16 lsf_offs_ivas[TCXLPC_NUMSTAGES] = { 0, 0, 6 }; // Q0 +const Word16 lsf_dims[TCXLPC_NUMSTAGES] = { 16, 8, 12 }; // Q0 +const Word16 lsf_offs[TCXLPC_NUMSTAGES] = { 0, 0, 4 }; // Q0 + + +const Word16 lsf_ind_cdk_nb_gc_stg4[] = /* 14Q1*1.28 */ +{ + -1360, -704, 0, + 80, 256, 0, + -896, 1008, 0, + 960, 2016, 0 +}; +const Word16 lsf_ind_cdk_nb_vc_stg4[] = /* 14Q1*1.28 */ +{ + -1360, -944, 0, + 624, 1408, 0, + -368, 240, 0, + 2480, 3216, 0 +}; +const Word16 lsf_ind_cdk_wb_gc_stg4[] = /* 14Q1*1.28 */ +{ + -1280, -816, 0, + 368, 272, 0, + -704, 1136, 0, + 1296, 2448, 0 +}; +const Word16 lsf_ind_cdk_wb_vc_stg4[] = /* 14Q1*1.28 */ +{ + -1040, -848, 0, + 688, 400, 0, + -560, 1520, 0, + 2256, 2704, 0 +}; + +const Word16 *const lsf_ind_codebook[2][2][TCXLPC_IND_NUMSTAGES] = /* 14Q1*1.28 */ +{ + { { lsf_ind_cdk_wb_gc_stg4 }, { lsf_ind_cdk_wb_vc_stg4 } }, + { { lsf_ind_cdk_nb_gc_stg4 }, { lsf_ind_cdk_nb_vc_stg4 } } +}; + +const Word16 lsf_ind_numbits[TCXLPC_IND_NUMSTAGES] = { 2 }; // Q0 + +const Word16 lsf_ind_dims_ivas[TCXLPC_IND_NUMSTAGES] = { 2 }; // Q0 +const Word16 lsf_ind_dims[TCXLPC_IND_NUMSTAGES] = { 4 }; // Q0 +const Word16 lsf_ind_offs[TCXLPC_IND_NUMSTAGES] = { 0 }; // Q0 + +const Word16 min_distance_thr[2][2] = /* 14Q1*1.28 */ +{ + /* GC, VC */ + /* WB */ { 580, 580 }, + /* NB */ {1000, 580 } +}; +const Word16 lsf_q_diff_cb_8b_rf[256 * 16] = /* Q6 */ +{ + -3145, 863, -1389, 4087, 1110, 3193, 290, -3160, 824, 212, -2936, -5827, -10181, -15650, -13373, -3849, + -4602, -3228, -8398, -1649, -5788, -8971, -2025, -2971, -1476, -2748, -2458, 966, -4, -1802, -1360, 654, + -8629, -7702, 6280, 3296, -1205, 365, -5964, 3125, 2443, 1442, 1149, -3835, -9867, -4238, -1977, -1955, + -2629, -759, -2056, -2297, -1839, 1678, -2412, -7539, -13208, -9624, -1688, -2171, 943, -454, 536, 2644, + -2840, -1391, -10500, 2516, 907, 146, -2762, -6750, 2949, -2282, -4614, -5663, -7773, -5510, -5947, -3727, + -4006, -939, -2500, -771, -3414, -4521, -6417, -4064, 3698, 3969, 4300, 4177, -3195, -10419, -13072, -6695, + -4284, -1172, -4415, -1601, -6029, 66, -4338, -2300, -3402, -5614, -7181, -7288, 7154, 6538, 64, -3263, + -6470, -4503, -9698, -5885, 235, 5049, 2698, -3656, -3600, -6261, -4270, 766, 1037, -1511, -1274, 1800, + 669, 2937, -3464, -1034, -4098, -11296, -382, -4610, -9613, -2081, 3947, 2832, 2962, -332, -9039, -10702, + -11109, -5950, -7200, -6525, -4260, -5060, -8936, -91, -672, 4557, 3192, -147, -2247, 1566, -734, -3007, + -2411, 1587, -2575, 2172, -3270, 10648, 7093, 1517, 1512, -392, 49, -9117, -16895, -908, -8443, -9923, + -1934, -603, -6588, 5335, -1565, -11521, 5944, -5092, -615, -2221, -7703, -1903, -5195, 2323, 3958, 3050, + -7094, 5361, -7885, -3299, -3282, -3125, -1888, -406, 1522, -23, -1506, -6075, -8517, -7605, -3450, -3362, + -3573, -2421, 1385, -181, -11027, 4778, -4014, -4956, 7316, 3138, 2351, 3406, -1998, -968, -2375, -3262, + -141, 6652, 11944, -4131, -2073, -2592, -1562, 1521, -1804, -2585, -2685, -5798, -10850, -11629, -4300, -4287, + -1569, 2229, 2330, 3147, -1026, -7010, 265, -1320, -3648, 1942, -5375, 73, 10348, 3913, -5535, -5938, + -5642, -3433, -8423, 1178, -540, -4790, -1976, 4686, 1701, -1323, -2009, -5997, -5693, -3852, -7604, -5361, + -1784, -325, -8561, -17592, 1663, 1377, 2347, -245, -2426, 141, -137, 985, -4926, -7898, -3559, 895, + -2548, -1563, -5007, 7311, 4409, 3177, 3920, 1546, -725, -5252, -9754, -9267, -5701, -6900, -961, 1772, + -1676, 889, -4798, 8060, 3460, -1911, 415, -4044, -6146, -12074, -10588, 13056, 2765, 1396, -4737, -4905, + 943, 3342, -8515, 4676, -774, -3963, -5503, -1625, 3909, -3614, 12347, 2835, -9710, 5877, 297, -918, + -5317, -2799, -3708, -4084, -8175, -6155, 1752, 6801, 7493, 6271, 4083, 3132, -809, -4200, -5389, -5982, + -5060, -5285, -1533, -2751, 2259, -3893, -3473, -108, -4711, -2627, -2069, -2320, -172, 1547, 770, 309, + -4485, -2618, -7238, 1767, -2965, 6693, 5256, 18, -1789, -5076, 7167, 3204, -1242, 1628, 4519, 1796, + -114, 1225, -3083, 321, -4002, 4834, -3014, -741, -4189, -5946, 6871, -2068, -13016, -9772, -3235, 2044, + 559, 10477, -9704, -7733, -8989, -10787, -10342, -8585, -2844, 1474, 5638, 9798, 10986, 9105, 4619, 2186, + 1576, 9039, 4354, 2073, 1861, -1492, -715, 1840, -6736, -10798, 994, -2921, -6369, 779, 2668, -443, + -2067, -1020, 1, 14571, 2253, -2163, 5255, 973, -1722, 4173, 102, -3633, -1430, -1720, 1243, 1749, + -6589, -1601, -9469, -5581, 3018, 1186, -11, 1252, 5708, 3338, 187, -3950, -6035, -3294, -106, -1130, + -2490, 445, -2543, -3283, -3432, -6963, 9950, 4072, 2294, 4517, 2736, 8173, 4270, -8347, -9374, 4776, + -66, 3476, 537, 2659, -677, 1552, 1974, -1703, -2139, -634, -1988, 694, 1921, -12938, -16525, 5848, + -9849, 7389, 4653, -1158, 1340, -2250, -2460, -2201, -3122, -90, 3974, 5105, 9127, 8701, 6184, 3770, + -5086, -3159, -3197, -9944, -7474, 961, 1158, -3536, 1050, 5572, -1480, -11120, -9276, -1841, -2086, -24, + -1019, -346, -6765, -8343, -6302, -3019, -5606, 2728, -3994, -6909, 10146, 6321, -230, -393, -846, -1536, + -1598, 3610, 3330, -233, -1215, -1953, -1330, 19, -4839, -10681, -11699, -1104, 1146, -6143, -6849, 422, + 892, 7937, -5005, -5547, 1756, -4020, -3420, -6811, -6304, -7812, -6019, 5109, 5503, 5568, 4600, 6472, + -3296, -2230, -6010, 3497, 5502, -2291, -2342, -6544, -12576, 2192, -1004, -5205, -500, -6764, -6200, 1816, + 5114, 4922, 6498, 6613, 4909, 2318, -5626, -11915, 3072, 11570, 1766, 4361, 552, -8139, -14006, -17228, + -3321, -1514, -473, 3295, -1028, -4536, -12374, 12452, 7396, -2269, -5052, 554, 1053, -4370, -5859, 97, + -2532, 2546, -4920, -13800, 8116, 2425, 1695, -2088, -5105, -346, -2869, -2457, 9336, 13166, 6150, 5166, + -2329, 72, 11513, -3075, -7745, -5492, -8015, -5108, -16, 3261, 876, -357, -3241, -2956, -4265, -2320, + -7869, -6495, -16668, -1339, -3678, 975, -2740, -2776, 3755, 141, -190, 1026, 5972, 3232, -924, -3212, + -1077, 568, -5606, 1478, -243, 2479, 10198, 3667, 682, -2873, -9164, -9042, 2186, 4347, -750, 5303, + 556, 5098, -6825, -2564, -3946, -5752, 1977, -6171, -5627, 4580, -835, -6362, 10132, 9511, 6475, 2861, + 3320, 11074, -483, 2698, -20, -4084, -4213, -3931, -231, -17, -1826, -2737, -5920, -1539, -1897, -3347, + -1346, 2075, -1230, -5248, 10906, 9461, 5046, 3485, -267, -948, 4273, 1889, 81, -488, -4763, -5532, + -1237, 6446, 3974, 5166, -723, -10033, 8338, 4102, 683, 1474, 624, -5287, -8628, -7519, -6290, 1767, + 207, 2676, 870, 13754, 7087, 2357, -922, -1734, -4651, 352, 14028, 10050, 8916, 2725, -5722, -9415, + 364, 3660, -813, 4370, -2151, -2115, 5570, -2545, -8167, -1978, -8301, -10715, 959, -5127, -11250, -7721, + -1668, -1437, -5508, -11155, -15130, 6829, 6070, -1555, -3048, -314, -528, 1714, 1474, -42, -541, 3361, + -15356, -12047, -4659, -1598, 4105, 3069, 2375, 3647, 1217, 140, -2518, -4195, -3080, 2155, 66, -570, + 84, 1523, -742, 13326, 5544, -2653, -5484, -3816, -9239, -10794, 6967, 2095, -4231, -2102, 4368, 8737, + 2959, 3968, -2430, 4601, 317, 5804, -3547, -11099, 5849, 273, -5513, 767, -9421, -11095, 3029, 8472, + -518, 2355, 2733, 53, -1439, -2709, -394, 5355, -2408, -3122, 8729, 5660, 7771, 4999, -7588, -15134, + -2240, 2281, 6677, -5155, 5663, 266, -4355, -7052, -3825, -2235, -2745, -3212, -2018, 1828, 1971, 2086, + -1241, 699, -2126, 3835, 1147, 4456, -3810, -23, 1284, -4878, 3807, 14029, 2820, -6773, 9556, 6600, + -1716, 315, -3259, -3282, -2859, -2219, 3508, -3452, -7850, 623, -5558, -2168, 1842, -8228, -885, 15388, + -8177, -7705, -14377, -6808, -7099, -7676, -4141, -5548, 3677, 5846, 6160, 10031, 11318, 8141, 3326, 904, + -3072, 1139, 1875, 4811, 3767, 7294, 4507, 1476, -1622, -6385, 384, 3318, -3867, -10447, -6387, -4252, + -19, 1102, -6317, 3433, -1856, -5732, 7225, -2107, -6977, 9620, 7964, 3013, 7152, 4986, -2184, 2136, + -524, 1479, -923, 3729, -259, 227, 6477, 2660, 4208, 1017, -423, -6090, -13677, 5309, 702, 2721, + -822, 2175, 1717, 3580, 1133, 3835, 980, 13265, 6367, 2741, 7462, 6211, -2347, -7635, 4781, 4132, + -8168, 13481, 5777, -963, 643, -2853, -2086, -1593, -2092, 2348, 3867, 413, 461, 1644, -259, -1656, + -846, 1615, -2805, 935, 3206, 1907, 7862, 3901, -975, 4507, 3151, 1433, 15449, 4412, -1221, 1001, + -3952, 1411, -2148, -1025, -2553, -4164, -4725, -3465, -2654, -3828, -6151, -7679, -5881, -2007, -581, -2499, + -1744, 4546, -8725, -6274, -1364, -1087, -2198, -4504, -3542, -1966, -516, -802, 448, -162, -1277, -2081, + -12133, -10923, 10206, 4436, 611, -2300, -4926, -4708, -5138, -3373, 2358, 295, -370, 4406, 2947, 351, + 1477, 3584, 3776, 4714, -1508, 2029, 426, -5245, -2805, -5852, -8752, 199, -3945, 10358, 10127, 4852, + -1894, 528, -776, 2698, -1298, -7579, -12457, -12545, 2483, 2421, -140, 723, -395, -292, -4196, -1766, + -3071, 1449, -3716, 3712, -3017, 543, -391, -1984, 3301, 375, 1107, -2635, 4730, 870, -19666, -12653, + -2823, 3165, 5399, -10321, -6087, -2824, -329, -1699, -268, -1995, -2254, 2744, 319, 51, 2834, 452, + -2837, -240, -1298, 2244, 1977, 3061, 3676, -1207, -3774, -2607, -3405, 9701, 12102, -3052, -10263, 1164, + -1548, -515, -3862, 1117, 3329, 4105, -804, -4141, -9321, -3136, 1792, 3484, 2025, -6747, -11991, -10905, + -3361, -2922, -3472, 1165, -3055, -1620, -4751, -8940, -477, 1932, 1054, 4687, 5735, 5566, 2447, -778, + 1791, 3768, 602, -2421, -6876, 9505, 7350, 2428, -3175, -6252, -707, -3720, -7723, -42, 4292, -1141, + -2469, 269, -1028, 1057, -890, 383, -128, 821, -2854, -5548, -2437, -3349, 3935, 1474, 14267, 13393, + -3416, 14072, 1196, -3166, -4252, -711, 521, 2462, 5346, 1483, -4287, -7676, -5805, -321, 867, 475, + -1674, 1391, 539, -471, -5201, -25, 6911, -2142, 10454, 10963, 1353, -2831, -3219, -131, -3005, -4468, + 3476, 4986, 6318, -2959, -9204, -87, 3906, -833, -247, 5687, 451, 716, -2970, -5788, -6743, -9436, + 4831, 6767, 3852, 2164, -1362, -1404, -3260, -4807, 2809, -2699, -4693, 21984, 10803, 4063, 2353, 6177, + -2813, -890, -5363, -165, -5755, -20361, 3639, 4639, -2073, 1798, -1097, -6169, 30, -1827, -4590, -2586, + -5855, -6418, -10115, -6038, 2674, 3620, 1206, 1379, -520, 5333, 5334, 3618, 439, -1048, 439, 777, + -7871, 2657, -3649, 7671, 10875, 5285, 423, 1869, -2283, -6081, -2750, -3935, -1815, 2851, 754, -2545, + -2253, -245, 87, 3432, 4323, 803, -3981, -8416, -12174, 6263, 9281, 7472, 2558, 327, -3198, -1436, + -1398, -211, -6595, 4670, 63, 2041, -4372, 967, 2444, -9123, -11355, 1727, -4221, -3144, 6411, 4338, + -4409, -3256, -6504, 6064, 4055, -2268, 5638, 5466, 82, -516, 6974, 5206, 1235, -364, -4919, -6016, + 2, 7, -5, 5, 1, 2, -8, 4, 4, 2, 4, 5, 0, -1, -3, 1, + -1139, 1101, -1501, -3122, 2059, 9130, 5593, -2976, -5845, -8198, 10800, 771, -4815, 20594, 5385, 9434, + -497, 877, -5365, -1190, -2940, -6216, 4700, 872, -2276, 9901, 5530, 417, -4381, -9743, -1935, -1025, + -3555, -643, -5254, -6674, -6586, -4879, -3791, -2733, 1046, 2275, 3157, 3643, 8384, 10607, 11929, 9237, + 1573, 3323, 130, 12128, 9521, 6522, 4035, -1444, -7190, 565, 2160, -2808, -3716, -9398, -1115, 4631, + -1938, -2034, -5142, 6407, 5972, 302, -3078, -7362, -12229, 6591, 5640, 1240, 2727, 3243, 9738, 7334, + -8793, 935, -4176, 103, 2398, 1724, 1579, 7649, 5685, 2791, 1754, -453, -5030, -4870, -3871, -3139, + -243, 3111, -2068, 3022, -4587, -11340, 14571, 7771, 3558, 5750, 1203, 4665, -1981, -109, 4442, 1369, + -2041, 3713, 1013, 1345, 4716, 129, 3062, 1444, -3639, -6184, 7457, 7819, 958, -8391, -8799, 9312, + 235, 3895, 12172, 2716, -1347, -1094, -4869, -880, 7519, 9011, 9914, 5683, 5909, 7805, 4428, 2129, + -1538, -36, -678, 1486, -649, 1517, -5121, 8530, 5048, -1844, -4781, -9145, -11353, -8076, -4133, -307, + -2707, 80, -5905, -4315, -4389, -6758, -6105, -9003, -10744, -1701, 3765, 6091, 10523, 7504, 4350, 4312, + 786, 3663, 9280, 6578, 391, 1514, -7019, 5089, 3483, -6871, -8172, -180, -7469, 1419, -121, 838, + 2692, 6995, 1431, -1074, 1394, -268, -1170, -3367, -7586, -5698, 7587, 7378, 5733, 8353, 10152, 10834, + -8158, -6271, -9914, 9985, 5364, -2601, -1959, -6260, -4097, 3235, 2097, -196, 2968, 3371, 2095, -1207, + -2269, 648, -1910, 7766, 5356, 3667, 981, 2825, 4288, 6668, 696, -661, 4042, -5356, -12858, -3646, + -4703, -3239, 10100, -2312, -256, -2120, -2612, 4835, -1675, 1068, 5746, -140, -869, 3620, 3505, 1703, + -3250, -2423, -1423, -674, -4843, 10905, 4109, 635, -1606, -6241, -2449, 3295, 6275, 14389, 8002, 4352, + -842, 3170, 1430, 1513, -4583, -12820, 1470, -4220, -8952, 6987, 4718, 532, -2136, -3700, -1727, 4512, + -3663, -2257, -8998, 5471, 843, -2858, -4142, 5134, 7250, 525, 3002, 118, 423, 6929, 5389, -1003, + -3457, -2564, 4399, 5758, -1462, 9992, 2582, 885, 6350, -670, -4446, -5882, -1814, -1178, -3073, 1157, + 2529, 7505, 5440, 202, -5746, -976, 8235, 1049, -181, -142, -6919, -6675, 18283, 16554, 8385, 3001, + 2266, 12753, -3253, -3832, -7200, -5627, -4778, -925, 239, 539, 2225, 324, 3182, 1914, -309, -507, + 5074, 4381, 9167, 1915, -3908, 1754, -5997, 2537, 17796, 13293, 7314, 12286, 1815, -4329, -8064, -20774, + -2484, 4942, 14515, 5406, -2595, -1380, 8417, 5956, 1651, 1559, -1389, 24, -6421, -4047, 2557, -1331, + -3164, 848, 15096, 9663, 6043, 3180, 595, 2733, 830, 1861, 9051, 8435, 8904, 6571, 2208, -762, + -135, 870, -2484, -3227, -9497, -586, 14177, 5880, -3708, 505, -1483, -415, 2507, -1973, -13853, -8468, + -3854, -2420, -9258, -4766, -3435, -2360, 10467, 7572, 598, -4099, 3457, 402, -195, 4193, 2023, 1851, + -4359, -3760, -1315, -585, 11411, 2958, 5446, 1608, 228, 4691, 1446, -1971, -3898, -3822, -1651, -1697, + 5112, 1738, -12375, 11069, 8416, -139, -721, 740, -8678, -7527, 10378, 4791, 5388, 2724, 4652, 1931, + -1419, 520, -6325, 10393, 8379, 2544, -2104, -11110, 7461, 2884, -1766, 548, -217, -2709, -1287, -2598, + 1996, 4969, 3862, 5813, -629, -7138, 7107, 9009, 5157, 1564, 5244, 1326, 78, 263, -4389, -5858, + -5423, -34, 1648, 2316, -3981, -5525, -1762, -996, 2075, 878, 718, 1458, 613, 3914, 3912, 2074, + -1176, 643, -3222, -444, 779, 9634, 14238, 11755, 3727, 1970, -1421, 3653, 1795, -2315, 10947, 8623, + 19, 6095, 3277, 2648, 2148, 509, 3577, 978, 1862, 5842, 1302, -3853, -10993, -12406, 858, 7763, + -4944, -1993, -5563, 833, -1365, -2240, -25, 2546, 10150, 10369, 10670, 10551, 9322, 5582, 881, -1029, + -763, 4474, 9314, 8818, 2703, 4844, 7776, 1684, 1, -3980, -9739, 5565, 2667, 1185, 2203, 1611, + -635, 724, -4112, 8414, 3049, 1437, 2314, -2611, -5835, 5541, -3027, 1017, 14246, 10165, 9910, 14393, + 2201, 3204, -295, 2519, -855, 5303, -2184, -12725, 10839, 1337, 154, -5290, -7908, 9490, 4292, 5533, + 544, 3574, 602, -783, -3121, 21721, 8166, -1137, 4729, -2399, 2504, 3721, -2704, -10309, 4957, 8028, + 2782, 11109, 5440, 2691, -3942, 3286, 2848, -532, -186, -2661, 7318, 6015, -1200, 2174, 5498, -379, + 4440, 6050, 3576, -819, -3697, 13144, 9664, -2178, 2966, 3302, -623, 10572, 15713, 9000, 2137, -5160, + -1593, 613, 3985, -7128, -5989, 2429, 721, -5488, -11848, 981, -3054, -4499, -4102, -7743, -7416, -340, + -2759, -2449, -4426, -6796, -13804, -7472, -1409, -1103, 181, 3071, 434, -741, 1045, 1976, 1407, 1365, + -2578, -1275, 5323, 9313, 4798, -1130, -6220, -2101, -3402, -868, -1959, -4365, -4536, -1626, -3701, -5011, + -3479, -3407, -9706, 4812, -812, -4014, 2558, -5416, -10543, -5186, -3840, 1189, 3804, 5839, 4744, 1003, + -3585, -2339, -4745, 3869, -2763, 1306, -6059, -8604, -1377, -5116, -730, -1693, -3321, 888, -685, 876, + -3492, 910, -7012, -2555, -5147, -1372, -1910, -8518, 2661, 7652, 6967, 7296, 4514, -4741, -9827, 873, + -1258, 4649, 3654, 653, -5264, -5509, -4222, 1703, 3992, -5102, -4342, -6447, 6603, 2642, -923, 6242, + -992, 647, 1228, -3124, -3463, 15067, 838, -6186, -3433, 872, 97, 2876, 3686, -2643, -6780, 356, + -1727, 2555, 2552, -1938, -8798, -773, -757, -3588, -7005, -6121, 4601, 235, -4446, 2984, 1353, -776, + -15055, -12154, -6273, 84, 390, -3286, -4758, -3713, -2185, -1512, 1403, 3479, 7578, 6327, 5045, 3075, + 2469, 8960, 6679, 3813, 1059, 9183, 2971, 4300, -1040, -927, -2376, -6240, -5131, -6030, -7385, -7560, + 933, 4512, -899, -1226, -7230, -10649, 11249, 4655, -7924, -5423, -5107, 993, 588, 2896, 4305, 1369, + -1938, 11282, -2696, -7285, 1163, -6289, -344, -2329, 3632, 2191, -1017, -1404, -2305, -6223, -2822, -1369, + -3688, -918, -3118, 256, -5446, 8638, 6195, 2855, 7432, 6937, 8638, 4020, -3296, -4260, 21, -3914, + 3006, 5845, 16377, 17059, 3579, 103, 204, -563, 1735, 6204, -405, -2618, -7929, -14028, -9415, -5277, + 303, 934, -305, 3211, -2970, 2963, 10231, 2833, 1656, 1162, -4439, 6346, 9314, 7062, -5015, -15980, + -320, 499, -14803, 4610, 2112, -4049, 7242, -245, -3115, 1323, -1276, -4286, -1951, 100, -1389, -1612, + -4391, -2691, -5202, -11000, 373, -2423, 4221, 4146, 1045, 503, -4063, -2244, 2311, 1646, -1779, -3188, + -3374, 346, -3243, -3662, 5971, 5519, 3022, 516, -4538, -6550, -5227, -6165, -4919, -1105, 30, 721, + 2935, 3922, -1041, 4217, 2528, 1985, 661, -824, -10133, -13715, 8714, 2218, 3769, 3384, 1193, -6246, + -5357, -2959, -8106, 5394, 1542, -4964, -7749, -4183, 877, 1146, 8307, 2891, -4905, -5775, 1888, 1442, + -2472, -850, 1278, 1397, -4545, -3625, -11722, 9811, 7790, 7832, 12234, 6079, -2436, -890, -1820, -234, + -3905, -1081, -7818, 2577, -299, 5742, 4982, -1421, 3506, -604, -4944, 2130, 544, 1545, -2399, -3202, + -895, -203, 783, -203, -2734, 10200, 7718, 3943, -6098, 9859, 9374, 6777, 2263, -2089, 866, 3381, + -3828, 1991, -2866, -1612, 747, -3896, 6041, 2875, -5838, -6829, -2319, -1146, -8845, -10612, 3630, 2942, + -509, 5457, 1119, -3222, -3623, -6421, -9746, -8661, 5658, 8283, 8062, 6310, 1787, 454, 1766, 2750, + -1632, 7787, 5349, 243, -1526, 3143, 5218, 10290, 1446, -6324, -3035, -1055, 2974, -7871, 39, 3664, + -769, -9, -8896, 9699, 4546, -1295, 6107, -4534, 3367, 1450, -3607, 8816, 3219, -5601, 1298, 12366, + -7130, -4420, -6848, 3453, 3599, 4371, 609, -6059, 8057, 9067, 2408, -3523, -6908, -6822, -6636, -2017, + -477, 5145, -1462, -475, -2003, -3769, 7781, 4563, 4437, 2134, -2726, 15777, 2839, -1929, 2913, 2174, + 841, 2396, 754, 14163, 4130, -1807, -177, -3884, -6782, 9287, 1864, -599, 5913, -2587, -10749, 5856, + 1304, 7980, -2237, -2092, -4384, -828, 552, -6108, 2193, 10107, 6057, 9885, 13003, 8977, 4006, -926, + -1523, 1282, -1805, -2709, -6024, -7618, -10251, 832, -689, -1488, 1528, -1635, -4512, -3974, 3366, 5884, + -2891, -646, -4227, -16787, 4586, 2689, -48, 1956, -5398, -5693, 4030, 1138, 2292, 2634, 6453, 3271, + -3526, 9059, 2896, 8101, 3313, -270, -1336, -3002, 826, -1572, -3793, -2235, -1597, 272, 910, -778, + -1195, 3634, 1576, 2036, -3675, -10512, -6414, -3268, -9714, -6636, 3287, -947, 6643, 7755, 4317, 2928, + -592, -46, -6118, -3775, 11750, 5301, -2878, -7240, -4674, 1543, -626, -1300, -608, -1661, -4053, -3154, + -2514, -545, 771, 7292, 3641, 749, -1664, -1652, 2686, 8715, 10176, 4547, -6065, -7417, -6454, -4928, + -576, 940, 681, 2977, -2947, -1968, -6468, 10093, 7720, -2235, -3869, -8057, -4152, 7399, 8617, 5658, + -1043, 1637, -3699, -5968, 13092, 1526, 1185, -3128, -2234, 3343, 5773, 9935, 7870, 6240, 3284, 3932, + 377, 5872, 3528, 3824, -852, -1575, -3799, -8401, -5628, -3612, -2451, 1396, 1471, -1669, -579, -384, + -6978, -4522, -6731, -1881, 1485, -73, -38, -3990, 11379, 4104, 1154, 5492, 3709, -645, -641, -750, + -97, 2556, 1619, 3351, 1996, 10845, 8411, 2751, 3099, -165, -6582, -11822, 8128, 7722, 4495, 3322, + 950, 2744, -2039, -3959, -6098, -2113, 4512, -1699, -758, 3243, -4760, 7788, 11837, 5336, 7626, 5509, + -4876, 13906, -3059, 1351, 4037, 2283, 614, -5014, 2149, 613, 744, -4239, -5981, -4296, -1799, -3121, + -2111, 3530, -1221, 1654, 9442, 10361, 6422, 7826, 7510, 7790, 3836, -323, -761, 1652, 330, -386, + -3239, 3070, 7009, -1209, 6710, 213, 5225, 3105, 1173, 842, -1774, -5027, -3901, -1359, -2786, -3513, + 1481, 1904, 7402, 23443, 5946, -3615, -1528, -4317, -2629, 11277, 7171, 5620, 7938, 4715, 3575, -3794, + 2315, 5200, 63, 4010, -400, -2074, 6624, -516, -731, -2133, -10088, 6969, -3380, -7450, -7347, -6915, + -3407, -3447, -1422, -4020, -11809, 3562, 3865, 570, 7656, 6367, 5964, 802, -2306, 5862, 7700, 6476, + -17049, -2577, 3748, -1004, 990, 2569, 4487, 2137, -3540, -3508, 608, -2102, 90, 4634, 3115, 1273, + -1960, -1414, 1516, 9460, 6833, 2088, -3598, -3590, -2554, -1783, 2680, 2127, 939, 8562, 4170, 1914, + 3335, 6241, -2988, 1816, 3233, -951, 587, -5590, -3415, -926, -7987, 8897, 3700, -12712, 5722, 4683, + -756, 1823, 2804, 3392, -2019, 801, -2923, 43, 5720, 2302, 3604, 14791, 4960, -425, -7298, -6606, + 205, 5909, 8599, 4641, -4600, -1580, -4536, -5178, 2346, 6910, 3641, -2630, -6079, 351, 5478, 5524, + 151, 1252, -2569, 6834, 5377, 4284, 450, -1607, 7257, 4429, -2568, 9851, 9183, 2197, 20053, 9155, + -1462, 924, -3196, -3257, -8953, 6147, 6251, -3186, 3285, 3198, 2326, 1225, -8446, -11295, 5393, 10785, + -2381, -2014, -9329, 4719, -880, -2308, -4714, 4429, 3675, -1874, 3253, 9686, 12557, 9338, 4719, 3836, + -3103, 7031, 11258, 6883, 11690, 8131, 3644, -307, -2590, -274, 1004, -1314, -166, 3063, 695, -1815, + -2455, 811, -1161, 2731, 5931, 2352, 3361, -363, -7371, 2805, 4053, 3586, 7364, 242, -1692, 17531, + -4497, -535, 286, 214, 3804, 11412, 4562, -1157, 550, 4841, 1657, -4984, -6307, 1482, 5745, 3540, + -2763, -1313, -1385, 3735, -2423, 5601, 14635, 10815, 9726, 6141, 4010, 3556, -104, -3353, -7143, 7077, + -245, 8209, 15457, 5234, 1860, -2195, -4620, -4895, -4263, -759, 2016, 2664, 3153, 2966, 1601, 30, + -4764, -1351, 3227, 2660, 1556, 198, 5379, 11277, 8580, 6978, 2506, 3310, 13165, 9623, 7120, 1665, + -59, 558, 3194, 1299, -2918, -2455, 3754, -3394, -3634, -2782, -7987, -7903, -7058, -2214, -1060, 2183, + -1954, -186, -11418, -2859, -1110, -2027, -932, -2040, 1282, 174, -161, -2628, -3341, 2675, 4169, 2475, + -5934, -5196, 10580, 9382, 1417, -1362, -2572, -4391, 7418, 4314, 148, 31, -82, 461, -2595, -570, + -3639, -2081, -1014, 4355, 5943, 6217, 2491, -4106, -6520, -4050, -5030, -2053, 6821, 6135, 2456, 1015, + -3447, -1303, -5380, -6759, -3272, -129, -4989, -11231, 5106, 1264, -3433, -3327, -3139, -1282, 1031, 1558, + 4180, 1592, -3435, 2252, -4803, -6443, 8937, 1696, -5599, 9240, 5481, -328, 3197, -4392, -12452, -16482, + -4613, 5693, 11596, -9035, 1399, 1388, 5182, 4750, 958, 310, -866, 829, 5122, 1203, -115, -759, + -3551, -1843, -3272, -1753, -195, 17324, 8182, -502, -2987, -146, -2640, 6865, 6979, -3675, -6047, 12865, + 3739, 8307, 5634, -2783, 96, 1167, -274, -636, -5808, -8880, 835, 6363, 5092, -700, -8229, -7634, + -6799, -5871, 4391, 1265, -1493, 440, -7322, 2387, 1763, -1406, 4030, 8075, 8810, 5655, 1375, 2309, + 3191, 6527, 2671, -128, -5345, 14221, 13006, 1792, -548, -2974, -7549, -3471, 1835, -1490, -3556, -4240, + -3368, -1748, -3945, 8349, 2444, -5349, 5825, 4222, -1891, -3570, -10832, 8764, 2791, 5495, 9332, 5366, + 1020, 5766, -8313, 522, -568, -20, -2169, 3981, 6641, 4235, 1781, -4362, -7143, -3864, -2205, -3217, + -3300, -1346, -1200, 5950, -1315, -285, 2642, -180, 12986, 11560, 5996, 6755, -2578, -1417, 1848, 5560, + 10662, 13080, 11225, 419, -4335, -128, 6716, 1638, -4903, 154, -2404, -4228, 5262, -364, -5170, -12310, + 360, 1588, 2173, 8939, 4304, 7241, 367, -2361, 6569, 837, -4801, 8650, 7208, 5996, 3566, 1112, + -5017, 4300, 2649, 3064, -6110, -14292, 2204, 13008, 5245, 1594, -6536, -11045, 5146, -211, -4067, -11435, + -530, 1840, 187, -12175, 1984, -1576, 3659, 4293, -1971, 8025, 8287, 4420, 3935, 358, -1691, -2707, + -3429, 252, 1235, 3895, 13024, 5900, 317, 1720, 3724, 1510, -3576, -6091, -8218, -3620, -844, -406, + 2105, 7096, 3064, 3952, 2071, -2774, 8459, 1501, -10913, 1387, -405, 12863, 2328, 4475, 3498, -1584, + -3085, -920, -7032, 8494, 2146, 1346, 1867, -404, 1886, -1042, -378, -2121, -10433, -7336, 15525, 9808, + -15685, -7623, 1925, 2963, 4001, -105, 3843, 5498, 4039, 6151, 6044, 3867, 1730, 2971, 1484, -319, + 3080, 9412, -1223, -3973, 4734, 2248, 3127, 1119, -1738, -1669, -1477, -1472, 1412, 1213, 773, 1674, + -730, 2282, 495, 1849, 753, 4313, 2052, 11060, 2638, -4153, 12967, 4232, 1600, 8305, 6247, 4101, + 1078, -516, -6160, -2738, -3949, 549, 2665, 313, -11805, 5780, 13753, 4964, -3343, -3825, 7392, 657, + -3356, -672, 2091, 1930, -1942, -6931, -7983, -7306, 1452, 3417, 9758, 12537, 14305, 11570, 5653, 1593, + 2820, 8229, 5573, 6212, 5169, 4568, 4877, 1219, -5520, -3569, -4997, 3799, -1152, -6233, 13054, 8210, + -1905, -1112, -1728, 19102, 8663, -331, 3226, 1066, -1807, 8189, 5678, 1987, 4661, 3278, 7947, 11458, + -4574, -517, -5124, 4711, -740, 416, 4847, 4427, 11056, 3251, -1915, -3528, -2529, -2213, 1857, 1203, + 316, 3731, 4619, -1294, -3138, -336, 8691, 7311, 3124, 9892, 5880, 614, 1873, 1916, 3856, 3588, + 1323, 8284, 7332, 4197, 626, 4877, 9117, 4163, 1998, 4387, 5489, 4184, 2124, -5170, -10914, 3921, + -1504, 12727, 938, 3478, 1876, -1017, 389, 3233, 8278, 8027, 8392, 12663, 13264, 9858, 5767, 4287, + -4008, 49, -1854, -5454, -9369, 5309, -1597, 6002, 6031, -2543, -4793, -2340, -2559, 229, -983, -2068, + -3514, 815, -7510, -3824, -931, -1573, -1337, -1189, -2019, 245, 4084, 4416, 6165, 7239, 3899, 2461, + -4781, -2173, 17577, 2751, -894, 2264, 1789, -623, 992, -322, -3113, -1854, -1553, 2213, 731, 850, + 2054, 3456, 3747, 3842, 980, -940, -5065, -5905, 423, -2009, 74, 3933, 13511, 12742, 8908, 5783, + 894, 6872, -2742, 7127, 5497, -660, -2361, -3114, -5552, -884, -1825, -8536, 4278, 4047, 3263, 2117, + 46, 3829, 3392, 7000, 5004, 11640, 7090, 2661, 2072, 3834, 6408, 9453, 4328, -5807, -11811, -6081, + 1119, 3292, 8329, 5549, -1361, -4414, -15806, 7144, 6824, -4515, -1143, 4774, 1451, 5261, 4830, 5562, + -1393, 5662, 4446, 1807, 8826, 6248, 6415, 4547, -1665, 1181, 6405, 5864, 8293, 10387, 7545, 4688, + 1312, 7883, 6317, -3965, -8535, -2725, 1117, -5447, -7012, 3655, 3196, 4576, 6822, -341, -646, 6098, + -6332, -4527, -5839, 4942, 2805, 6652, 925, -1187, 3859, 4466, 5194, 4814, 7489, 8532, 2922, 2874, + -1137, 1068, 2253, 3741, -2505, 9887, 10247, 3472, 9158, 1176, -2976, 1937, -2064, 7351, 6057, 2696, + 532, 4702, 4601, 502, -1350, -5364, 9112, 2103, -4340, 18, -1329, -2532, 2939, 15707, 4071, -2154, + -628, 13794, -2239, -2982, -3391, -2332, -1483, 5699, 7418, 5487, 5469, 3426, 2471, 2248, -610, -2978, + 4520, 7035, 8360, 8190, 4367, 11231, 9045, 6518, 5468, 6414, -626, -2179, -2327, -6601, -11740, -18010, + 872, 6597, 9823, 6115, 5121, 3028, -3065, 9266, 9664, 2144, 2461, -758, -3373, -348, -421, -2786, + -2998, -2310, 5826, 14327, 10399, 10344, 5906, 4646, 4013, 7488, 6656, 3601, 212, 2499, 812, -4251, + -3455, -259, -2801, -3743, -3930, 4402, 11531, 8368, 3812, 2663, -1885, -3062, -3413, -12432, -6348, -1832, + -2574, 1227, -6578, -7396, -131, 1139, 3464, 2303, 6848, 4302, 422, 1994, 4840, 6023, 4369, 1222, + -5186, -3043, -5221, 9413, 9009, 6329, 6302, 7712, 4428, -1745, -1711, 1216, 1855, 1215, 1003, 58, + 3844, 4380, -2452, 17587, 5229, 106, 3809, 5238, 2909, -6280, 6367, 4649, 3777, 2815, 4377, 9833, + -3469, 6722, -2982, 1867, 2944, 3428, -115, -6063, 4740, 2369, 3681, 2580, 319, 76, 4169, 1079, + 5357, 7937, 8749, 6732, 3237, 475, 10599, 7708, 2300, 9384, 6872, 6516, 11437, 2109, -2788, -10922, + -2925, 1420, 3109, 500, 6953, 1289, -522, 1064, 2885, 6445, 3595, 2000, 2669, 2797, 2174, 873, + 1980, 6159, 1331, 1321, -1922, 6722, 11666, 3321, -1515, 1233, -1664, 9262, 9668, 2502, 13862, 9666, + 3582, 10575, 2715, -603, 596, -1567, 4182, 49, 2208, 1795, 10525, 9472, -2866, -8439, 7591, 11197, + -2356, 153, -10244, -4768, -2178, -2408, 1367, 708, 4615, 9681, 13007, 14875, 15382, 12708, 8355, 5074, + -358, 1803, 1987, 7888, 9168, 16089, 2288, -2716, -1669, 1078, 1165, 5324, 4412, -4354, 298, 6519, + 4826, 9355, 6507, 12087, 4177, -6, 2865, -2898, -5149, 6100, -1829, 80, 12459, 4967, 591, 7846, + -3452, 13887, -142, 4052, 5842, 3702, 4535, 2718, 4976, 3690, 1377, -72, -1938, -836, 961, -1944, + 4315, 5391, 6496, 1795, -2279, 20485, 16142, 9768, 8889, 6390, 1789, 3149, 4186, 487, -922, -2249, + -1225, 14246, 10277, 980, 2427, 180, 5713, 4730, -901, 590, 3351, 1871, 4389, 4760, 8650, 3433, + 1760, 3580, 5798, 6813, 4246, 17695, 7227, 4364, 2222, 13912, 11731, 10965, 14919, 7273, -6023, 6474, +}; + +/*----------------------------------------------------------------------------------* + * LSF quantization - Scaling factors + *----------------------------------------------------------------------------------*/ + +/* Stable ISP vector in Q15 */ +const Word16 stable_ISP_fx[16] = { 32139, 30274, 27247, 23170, 18206, 12540, 6393, 0, -6390, -12537, -18203, -23170, -27243, -30271, -32139, 1475 }; +/* Stable LSP vector in Q15 */ +/* This LSP corresponds to GEWB_Ave_fx Q15*/ +const Word16 stable_LSP_fx[16] = { 32437, 31676, 29486, 25681, 21564, 16413, 10838, 5385, -735, -6405, -11986, -17040, -22052, -26346, -29678, -31784 }; + +/* stable ISF vector */ +const Word16 stable_ISF_fx[M] =/*15Q16*/ +{ 1023, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13311, 14335, 15361, 3978 }; + +/*----------------------------------------------------------------------------------* + * LSF quantization - Mean LSF vectors + *----------------------------------------------------------------------------------*/ +/* These are not used anywhere */ +/* Length 16 vector in Scale = 2.56f */ +const Word16 means_wb_cleanspeech_lsf16k0[16] = { 727, 1426, 2582, 3554, 4548, 5481, 6397, 7293, 8170, 9010, 9972, 11003, 12072, 13034, 14097, 14956 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 means_swb_cleanspeech_lsf25k6[16] = { 786, 1840, 2892, 3833, 4778, 5658, 6641, 7662, 8692, 9630, 10603, 11534, 12489, 13387, 14349, 15217 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 means_swb_cleanspeech_lsf32k0[16] = { 757, 1855, 2862, 3798, 4705, 5661, 6742, 7692, 8658, 9577, 10513, 11401, 12358, 13269, 14275, 15149 }; + + +/* An 16-by-1 matrix */ +const Word16 SVWB2_Ave_fx[16] = { 998, 1488, 2682, 3823, 5084, 6305, 7485, 8686, 9861, 11004, 12339, 13664, 15088, 16330, 17663, 18754 }; // Q2.56 +/* An 16-by-1 matrix */ +const Word16 IANB_Ave_fx[16] = +{ + 726, 1433, 2493, 3408, 4340, 5215, 6103, 6947, 7772, 8536, 9252, 10012, 10909, 12427, 13997, 15193 +}; // Q2.56 +/* An 16-by-1 matrix */ +const Word16 IAWB_Ave_fx[16] = +{ + 577, 1350, 2526, 3535, 4539, 5504, 6497, 7460, 8445, 9396, 10371, 11319, 12307, 13268, 14249, 15207 +}; // Q2.56 +/* An 16-by-1 matrix */ +const Word16 IAWB2_Ave_fx[16] = +{ + 731, 1777, 3194, 4386, 5629, 6806, 8012, 9164, 10329, 11469, 12731, 14037, 15326, 16538, 17801, 18927 +}; // Q2.56 +/* Length 16 vector in Scale = 2.56f */ +const Word16 UVNB_Ave_fx[16] = { 1018, 1764, 2856, 3751, 4611, 5410, 6233, 6961, 7685, 8304, 8859, 9325, 9977, 11741, 13699, 15074 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 UVWB_Ave_fx[16] = { 898, 1900, 3172, 4190, 5181, 6161, 7134, 8066, 8995, 9888, 10784, 11636, 12527, 13396, 14301, 15183 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 SVNB_Ave_fx[16] = { 890, 1268, 1930, 2902, 3938, 4823, 5832, 6644, 7487, 8202, 8906, 9545, 10788, 12565, 13959, 15183 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 SVWB_Ave_fx[16] = { 832, 1248, 1949, 3083, 4131, 5117, 6179, 7067, 8008, 8922, 9875, 10741, 11785, 12860, 13968, 15048 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 GEWB_Ave_fx[16] = { 742, 1350, 2354, 3495, 4446, 5456, 6434, 7331, 8309, 9218, 10145, 11044, 12042, 13063, 14101, 15103 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 GEWB2_Ave_fx[16] = { 909, 1783, 3227, 4443, 5685, 6851, 7996, 9116, 10213, 11263, 12465, 13754, 15090, 16293, 17621, 18695 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 GENB_Ave_fx[16] = { 836, 1344, 2257, 3263, 4173, 5031, 5950, 6707, 7514, 8234, 8881, 9439, 10393, 12226, 13855, 15135 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 TRNB_Ave_fx[16] = { 919, 1335, 2106, 3142, 4092, 4938, 5905, 6670, 7490, 8199, 8868, 9444, 10544, 12383, 13900, 15156 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 TRWB_Ave_fx[16] = { 834, 1326, 2151, 3341, 4305, 5299, 6318, 7198, 8167, 9071, 10001, 10867, 11871, 12912, 13986, 15046 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 TRWB2_Ave_fx[16] = { 945, 1546, 2866, 4150, 5342, 6568, 7660, 8809, 9894, 10934, 12170, 13577, 14981, 16280, 17614, 18778 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 AUNB_Ave_fx[16] = { 887, 1443, 2356, 3194, 4105, 4949, 5841, 6635, 7437, 8181, 8867, 9478, 10385, 12182, 13858, 15131 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 AUWB_Ave_fx[16] = { 810, 1468, 2476, 3417, 4396, 5342, 6311, 7215, 8171, 9078, 10030, 10969, 12014, 13075, 14146, 15133 }; +/* Length 16 vector in Scale = 2.56f */ +const Word16 AUWB2_Ave_fx[16] = { 933, 1745, 3040, 4157, 5379, 6490, 7646, 8725, 9852, 10930, 12214, 13647, 15062, 16297, 17636, 18768 }; + + + + + +/* Length 16 vector in Q = 15 */ +const Word16 Predictor0_fx[16] = { 27361, 27361, 27361, 27197, 27197, 27197, 26378, 26460, 26214, 25985, 26460, 26460, 25985, 25723, 25723, 24740 }; +/* Length 16 vector in Q = 15 */ +const Word16 Predictor1_fx[16] = { 27034, 27034, 27034, 26640, 26313, 26640, 26640, 26132, 26214, 26214, 26460, 26870, 26870, 26706, 27034, 26640 }; +/* Length 16 vector in Q = 15 */ +const Word16 Predictor2_fx[16] = { 24248, 23593, 24510, 24248, 24510, 24019, 24019, 23757, 23757, 24019, 24248, 24248, 23593, 23101, 23593, 23101 }; +/* Length 16 vector in Q = 15 */ +const Word16 Predictor3_fx[16] = { 24248, 24248, 24740, 24248, 24510, 23757, 23429, 23101, 22610, 23101, 23593, 24740, 25002, 24740, 25002, 24838 }; +/* Length 16 vector in Q = 15 */ +const Word16 Predictor4_fx[16] = { 19005, 18350, 19268, 19005, 19268, 18776, 18776, 18514, 18514, 18776, 19005, 19005, 18350, 17859, 17695, 17203 }; +/* Length 16 vector in Q = 15 */ +const Word16 Predictor5_fx[16] = { 23839, 23593, 23593, 23839, 23839, 23593, 23593, 23593, 23839, 24084, 24347, 24576, 24576, 23364, 23364, 23364 }; +/* Length 16 vector in Q = 15 */ +const Word16 Predictor6_fx[16] = { 24084, 23839, 24084, 23593, 23593, 22938, 22381, 21791, 21135, 21955, 22381, 24347, 24576, 23593, 24576, 24347 }; +/* Length 16 vector in Q = 15 */ +const Word16 Predictor7_fx[16] = { 24347, 24084, 24347, 24347, 24347, 24084, 24347, 24576, 24576, 24740, 25068, 24347, 24084, 23839, 23364, 24740 }; +/* Length 16 vector in Q = 15 */ +const Word16 Predictor8_fx[16] = { 24740, 24740, 24740, 24576, 24576, 24576, 24084, 23839, 23593, 23364, 23839, 23839, 23364, 23101, 23101, 22118 }; + +/* An 16-by-16 matrix */ +const Word16 CNG_SN1_fx[256] = +{//Qlog2(2.56) + 600, 1640, 3039, 4257, 5512, 6740, 7989, 9169, 10393, 11612, 12880, 14100, 15378, 16554, 17816, 18918, + 1188, 2487, 3746, 4903, 6103, 7261, 8437, 9587, 10776, 11954, 13172, 14355, 15564, 16712, 17913, 19012, + 346, 799, 2259, 3555, 4876, 6175, 7516, 8803, 10073, 11323, 12631, 13938, 15282, 16553, 17817, 19039, + 439, 1616, 3446, 4743, 6073, 7288, 8553, 9726, 10947, 12106, 13312, 14474, 15650, 16773, 17894, 18977, + 921, 1800, 2976, 4007, 5105, 6137, 7178, 8150, 9057, 9914, 11009, 12545, 13671, 15502, 17428, 18927, + 896, 1899, 3035, 4128, 5301, 6429, 7604, 8719, 9886, 11059, 12417, 13621, 14962, 16135, 17475, 18460, + 722, 1507, 2537, 3437, 4328, 5190, 6018, 6841, 7587, 8343, 8925, 9511, 9919, 11075, 13613, 15021, + 315, 612, 1671, 2910, 3990, 5083, 6120, 7170, 8188, 9173, 10148, 11186, 12250, 13262, 14290, 15284, + 885, 1928, 3010, 3973, 4952, 5900, 6848, 7769, 8701, 9609, 10581, 11540, 12508, 13450, 14412, 15349, + 338, 1020, 2657, 3736, 4839, 5791, 6806, 7760, 8738, 9659, 10627, 11567, 12534, 13468, 14416, 15334, + 1126, 1964, 2999, 3855, 4764, 5608, 6482, 7286, 8109, 8827, 9570, 10649, 11999, 13125, 14223, 15252, + 385, 815, 2000, 2939, 3906, 4879, 5793, 6734, 7661, 8526, 9309, 10146, 11597, 12955, 14106, 15241, + 633, 1445, 2400, 3293, 4235, 5171, 6143, 7084, 8057, 8980, 9924, 10924, 11987, 12998, 14016, 15058, + 584, 1248, 2250, 3131, 4050, 4920, 5811, 6652, 7471, 8244, 8913, 9480, 10188, 12225, 13871, 15123, + 1157, 1820, 2745, 3505, 4354, 5097, 5932, 6648, 7408, 8034, 8635, 9083, 9977, 12228, 13819, 15108, + 572, 1401, 2514, 3501, 4503, 5465, 6469, 7435, 8416, 9328, 10306, 11309, 12328, 13303, 14306, 15261, +}; + +const Word16 SVWB2_SN1_fx[256] = {//Qlog2(2.56) + -257, -385, -673, 926, 1408, 874, 735, 512, 624, 587, 493, 688, 845, 521, 428, 95, + -32, -90, 1046, 666, 329, -59, -324, -282, -712, -783, -229, 28, -354, -434, -497, -351, + 182, 111, 512, 746, 365, 91, -214, -477, -401, -496, -931, -1180, -1422, -1085, -456, -9, + -286, -387, -325, 317, 172, 274, 238, 550, 555, 574, 618, 717, 751, 611, 441, 233, + 96, 178, 203, -112, -464, -591, -212, 124, 32, 192, 244, 94, -41, -293, -507, -649, + -94, -164, 1011, 926, 688, 461, 593, 587, 398, 400, 351, 486, 482, 424, 294, 219, + -260, -356, -458, -252, -162, -350, -394, -255, 30, 173, 90, 64, 93, 157, 66, 2, + 43, 100, -48, -596, -852, -787, -569, -536, -780, -607, -169, -125, -75, 96, 98, 154, + 240, 203, 404, 79, -202, -555, -718, -1023, -1158, -1390, -1537, -774, -478, -173, -63, 272, + -164, -291, -405, 1049, 779, 349, 224, 12, 265, 37, -182, -446, -396, -81, -16, -146, + 75, 45, -248, -832, 729, 416, 499, 178, -115, 16, 79, 243, 265, 77, -69, -43, + 639, 705, 482, -40, -529, -198, -109, -399, -242, -433, -713, -811, -934, -777, -332, 26, + 110, 166, -54, -792, -974, 386, 190, 192, 67, -172, -141, -298, -539, -400, -139, 80, + 147, 307, 168, 52, -285, -270, -212, -179, 138, 200, 194, 64, 476, 673, 636, 500, + 5, 38, -176, 212, 752, 433, 322, 500, 560, 276, 107, -245, -358, -768, -817, -1065, + -233, -294, -581, -1147, -869, 77, 144, 335, 269, 501, 638, 719, 614, 376, 219, 172 +}; + +/* An 16-by-16 matrix */ +const Word16 SVWB2_SN2_fx[256] = {//Qlog2(2.56) + -100, -130, -545, -834, 489, 501, 523, 297, 137, 198, 270, 172, 17, -50, -147, -63, + 333, 351, 143, 142, 47, -137, -131, -323, -216, -32, 105, 264, 541, 425, 342, 153, + -93, -168, 184, 605, 372, 237, 186, 175, 307, 321, 448, 205, -128, -481, -477, -512, + -24, -30, 26, -47, -159, -88, -344, -130, -88, -280, -742, -901, -264, 176, 38, -26, + 258, 250, 114, -75, -186, -326, -360, -237, 268, 532, 236, -341, -556, -334, -181, -30, + 123, 241, 118, 205, 441, 172, 49, -158, -273, -214, -428, -729, -758, -532, -289, -112, + -160, -224, -512, 393, 460, 216, 179, -94, -78, -320, -473, 13, 224, 196, 127, 37, + -35, -65, 360, 164, -185, -563, -683, -357, -634, -61, 400, 133, -232, -264, -174, 32, + -140, -196, -470, -355, -532, -323, -268, -76, 260, 258, 218, 161, 206, 266, 234, 168, + 99, 109, -60, -368, -564, -49, 75, -60, -160, -654, -847, 162, 278, 76, -24, 42, + 12, 88, 124, -54, -91, 197, 289, 211, 240, 184, 10, 16, 560, 677, 619, 350, + -37, -91, 771, 654, 291, 165, 104, 43, -224, -365, -411, -78, -90, -20, 85, 168, + 45, 1, 58, 80, 293, 411, 443, 655, 604, 642, 624, 529, 373, 227, 166, 128, + -176, -124, -182, -131, -260, -127, 350, 460, 425, 260, -76, -400, -605, -506, -121, -49, + -96, -92, -274, -176, -220, -323, -399, -505, -610, -530, 124, 268, 235, 272, 128, 160, + -6, 80, 145, -198, -197, 38, -15, 100, 45, 58, 542, 524, 197, -128, -324, -448 +}; + +/* SVWB2_AR1 * 2.56f */ +const Word16 SVWB2_AR1_fx[128] = {//Qlog2(2.56) + -28, -38, -122, 74, 296, 148, 146, 120, 148, 36, -11, -163, -223, -299, -290, -320, + -22, -30, -138, -319, -385, 159, 124, 51, 32, -44, -15, -78, -96, -53, 40, 64, + -96, -144, -205, -96, 80, 96, 152, 246, 206, 193, 265, 333, 320, 232, 131, 32, + 108, 106, 102, 37, -14, -17, -61, -144, -161, -160, -257, -404, -540, -316, -124, 18, + 22, 12, 34, -14, -52, -106, -144, -266, -346, -472, -401, -30, -4, -43, -88, -10, + -52, -117, -203, 415, 324, 171, 121, -31, 48, -31, -60, -65, 128, 193, 141, 67, + -47, -86, 430, 334, 193, 136, 85, 82, 1, -34, 47, 84, 2, -30, -77, -45, + -4, -14, -9, -38, -136, -242, -217, -54, -38, 179, 191, 61, 42, -3, 5, -37 +}; + +/* SVWB2_AR2 * 2.56f */ +const Word16 SVWB2_AR2_fx[128] = {//Qlog2(2.56) + 12, 16, -46, -156, -329, -293, 43, 141, 61, 15, -9, 29, -74, -41, -37, 16, + -47, -81, -136, 82, -33, -111, -268, -293, 109, 136, 53, -58, -51, 62, 64, 14, + -15, -19, -171, -347, 258, 161, 88, 13, -57, -26, -59, 24, 10, 14, -41, -8, + 33, 38, 139, 157, 31, 65, -14, 52, 63, 30, -8, -1, -182, -341, -344, -258, + 14, 16, 46, 6, -54, -64, -136, -132, -318, -303, 261, 146, -19, -57, -30, 30, + -34, -34, 21, 93, 163, 201, 290, 257, 225, 296, 209, 197, 72, 26, 57, 1, + 33, 66, 73, -8, -104, 44, 31, -13, 70, 72, -17, -48, 430, 373, 218, 92, + 1, -2, 74, 172, 67, -3, -34, -25, -156, -219, -432, -288, -181, -35, 113, 112 +}; + +/*----------------------------------------------------------------------------------* + * LSF quantization - LSF mode/codebook selection tables + *----------------------------------------------------------------------------------*/ +const Word16 CB_lsf[] = +{ + -1, /* Mode 0 : INACTIVE NB, Safety net */ + -1, /* Mode 1 : UNVOICED NB, Safety net */ + 0, /* Mode 2 : VOICED NB, Safety net */ + 2, /* Mode 3 : GENERIC NB, Safety net */ + 2, /* Mode 4 : TRANSITION NB, Safety net */ + 4, /* Mode 5 : AUDIO NB, Safety net */ + -1, /* Mode 6 : INACTIVE WB, Safety net */ + -1, /* Mode 7 : UNVOICED WB, Safety net */ + 5, /* Mode 8 : VOICED WB, Safety net */ + 7, /* Mode 9 : GENERIC WB, Safety net */ + 7, /* Mode 10 : TRANSITION WB, Safety net */ + 9, /* Mode 11 : AUDIO WB, Safety net */ + -1, /* Mode 12 : INACTIVE WB16k, Safety net */ + -1, /* Mode 13 : UNVOICED WB16k, Safety net */ + 14, /* Mode 14 : VOICED WB16k, Safety net */ + -1, /* Mode 15 : GENERIC WB 16k, Safety net */ + 10, /* Mode 16 : TRANSITION WB16k, Safety net */ + -1, /* Mode 17 : AUDIO WB16k, Safety net */ + 13 /* Mode 18 : CNG, Safety net */ +}; // Q0 + +const Word16 CB_p_lsf[] = +{ + 0, /* Mode 0 : INACTIVE NB, Predictive */ + 1, /* Mode 1 : UNVOICED NB, Predictive */ + 4, /* Mode 2 : VOICED NB, Predictive */ + 4, /* Mode 3 : GENERIC NB, Predictive */ + -1, /* Mode 4 : TRANSITION NB, Predictive */ + -1, /* Mode 5 : AUDIO NB, Predictive */ + 0, /* Mode 6 : INACTIVE WB, Predictive */ + 1, /* Mode 7 : UNVOICED WB, Predictive */ + 6, /* Mode 8 : VOICED WB, Predictive */ + 6, /* Mode 9 : GENERIC WB, Predictive */ + -1, /* Mode 10 : TRANSITION WB, Predictive */ + -1, /* Mode 11 : AUDIO WB, Predictive */ + 0, /* Mode 12 : INACTIVE WB16k, Predictive */ + -1, /* Mode 13 : UNVOICED WB16k, Predictive */ + 11, /* Mode 14 : VOICED WB16k, Predictive */ + 8, /* Mode 15 : GENERIC WB16k, Predictive */ + -1, /* Mode 16 : TRANSITION WB16k, Predictive */ + 10, /* Mode 17 : AUDIO WB16k, Predictive */ + 9, /* Mode 18 : GENERIC WB, MA Predictive */ +}; // Q0 + + +const Word16 *const ModeMeans_fx[] = { IANB_Ave_fx, UVNB_Ave_fx, SVNB_Ave_fx, GENB_Ave_fx, TRNB_Ave_fx, AUNB_Ave_fx, IAWB_Ave_fx, UVWB_Ave_fx, + SVWB_Ave_fx, GEWB_Ave_fx, TRWB_Ave_fx, AUWB_Ave_fx, IAWB2_Ave_fx, NULL, SVWB2_Ave_fx, GEWB2_Ave_fx, TRWB2_Ave_fx, AUWB2_Ave_fx +}; //Qlog2(2.56) +const Word16 * const Predictors_fx[] = { Predictor6_fx, NULL, Predictor1_fx, Predictor3_fx, NULL, Predictor6_fx,Predictor5_fx, NULL, Predictor0_fx, + Predictor2_fx, NULL, Predictor5_fx, Predictor7_fx, NULL, Predictor8_fx, Predictor4_fx, NULL, Predictor7_fx +}; // Q15 + +const Word16 CBsizes[] = +{ + 1,2,4,8,16,32,64 +}; // Q0 + + +const Word16 CBbits[] = +{ + -1, /* Mode 0 : INACTIVE NB, Safety net */ + -1, /* Mode 1 : UNVOICED NB, Safety net */ + 4, /* Mode 2 : VOICED NB, Safety net */ + 5, /* Mode 3 : GENERIC NB, Safety net */ + 5, /* Mode 4 : TRANSITION NB, Safety net */ + 4, /* Mode 5 : AUDIO NB, Safety net */ + -1, /* Mode 6 : INACTIVE WB, Safety net */ + -1, /* Mode 7 : UNVOICED WB, Safety net */ + 4, /* Mode 8 : VOICED WB, Safety net */ + 5, /* Mode 9 : GENERIC WB, Safety net */ + 5, /* Mode 10 : TRANSITION WB, Safety net */ + 4, /* Mode 11 : AUDIO WB, Safety net */ + -1, /* Mode 12 : INACTIVE WB16k, Safety net */ + -1, /* Mode 13 : UNVOICED WB16k, Safety net */ + 4, /* Mode 14 : VOICED WB16k, Safety net */ + -1, /* Mode 15 : GENERIC WB16k, Safety net */ + 4, /* Mode 16 : TRANSITION WB16k, Safety net */ + -1, /* Mode 17 : AUDIO WB16k, Safety net */ + 4, /* Mode 18: CNG, Safety net */ +}; // Q0 + + +const Word16 CBbits_p[] = +{ + 5, /* Mode 0 : INACTIVE NB, Predictive */ + 4, /* Mode 1 : UNVOICED NB, Predictive */ + 3, /* Mode 2 : VOICED NB, Predictive */ + 3, /* Mode 3 : GENERIC NB, Predictive */ + -1, /* Mode 4 : TRANSITION NB, Predictive */ + 0, /* Mode 5 : AUDIO NB, Predictive */ + 5, /* Mode 6 : INACTIVE WB, Predictive */ + 4, /* Mode 7 : UNVOICED WB, Predictive */ + 3, /* Mode 8 : VOICED WB, Predictive */ + 3, /* Mode 9 : GENERIC WB, Predictive */ + -1, /* Mode 10 : TRANSITION WB, Predictive */ + 0, /* Mode 11 : AUDIO WB, Predictive */ + 5, /* Mode 12 : INACTIVE WB16k, Predictive */ + -1, /* Mode 13 : UNVOICED WB16k, Predictive */ + 3, /* Mode 14 : VOICED WB16k, Predictive */ + 5, /* Mode 15 : GENERIC WB16k, Predictive */ + -1, /* Mode 16 : TRANSITION WB16k, Predictive */ + 5, /* Mode 17 : AUDIO WB16k, Predictive */ + 5, /* Mode 9 : GENERIC WB, Predictive */ +}; // Q0 + + + +const Word16 BitsVQ[]= +{ + -1, /* Mode 0 : INACTIVE NB, Safety net */ + -1, /* Mode 1 : UNVOICED NB, Safety net */ + 8, /* Mode 2 : VOICED NB, Safety net */ + 9, /* Mode 3 : GENERIC NB, Safety net */ + 9, /* Mode 4 : TRANSITION NB, Safety net */ + 4, /* Mode 5 : AUDIO NB, Safety net */ + -1, /* Mode 6 : INACTIVE WB, Safety net */ + -1, /* Mode 7 : UNVOICED WB, Safety net */ + 8, /* Mode 8 : VOICED WB, Safety net */ + 9, /* Mode 9 : GENERIC WB, Safety net */ + 9, /* Mode 10 : TRANSITION WB, Safety net */ + 4, /* Mode 11 : AUDIO WB, Safety net */ + -1, /* Mode 12 : INACTIVE WB16k, Safety net */ + -1, /* Mode 13 : UNVOICED WB16k, Safety net */ + 8, /* Mode 14 : VOICED WB16k, Safety net */ + -1, /* Mode 15 : GENERIC WB16k, Safety net */ + 8, /* Mode 16 : TRANSITION WB16k, Safety net */ + -1, /* Mode 17 : AUDIO WB16k, Safety net */ + 4, /* Mode 18: CNG, Safety net */ +}; // Q0 + + +const Word16 BitsVQ_p[]= +{ + 5, /* Mode 0 : INACTIVE NB, Predictive */ + 8, /* Mode 1 : UNVOICED NB, Predictive */ + 6, /* Mode 2 : VOICED NB, Predictive */ + 6, /* Mode 3 : GENERIC NB, Predictive */ + -1, /* Mode 4 : TRANSITION NB, Predictive */ + 0, /* Mode 5 : AUDIO NB, Predictive */ + 5, /* Mode 6 : INACTIVE WB, Predictive */ + 12, /* Mode 7 : UNVOICED WB, Predictive */ + 6, /* Mode 8 : VOICED WB, Predictive */ + 6, /* Mode 9 : GENERIC WB, Predictive */ + -1, /* Mode 10 : TRANSITION WB, Predictive */ + 0, /* Mode 11 : AUDIO WB, Predictive */ + 5, /* Mode 12 : INACTIVE WB16k, Predictive */ + -1, /* Mode 13 : UNVOICED WB16k, Predictive */ + 6, /* Mode 14 : VOICED WB16k, Predictive */ + 5, /* Mode 15 : GENERIC WB16k, Predictive */ + -1, /* Mode 16 : TRANSITION WB16k, Predictive */ + 5, /* Mode 17 : AUDIO WB16k, Predictive */ + 5, /* Mode 18 : GENERIC WB, MA Predictive */ +}; // Q0 + + +const Word16 predmode_tab_float[][6] = +{ + {1,1,2,2,0,2}, + {1,1,2,2,0,2}, + {1,-1,2,1,0,1}, + {1,1,2,1,0,1} /* should check how is the cb for audio mode at 13.2*/ +}; + +const Word16 predmode_tab[][6] = +{ + {1,1,2,2,0,2}, + {1,1,2,2,0,2}, + {1,-1,2,1,0,1}, + {1,1,2,1,0,2} /* should check how is the cb for audio mode at 13.2*/ +}; // Q0 + + +const Word16 SVNB_SN1_fx[256] = +{//Qlog2(2.56) + 135, 109, 135, -153, -549, 214, 416, 195, 291, 247, 100, -127, -579, -160, -66, -32, + -107, -150, -274, -149, 642, 594, 338, 183, 81, -31, -14, -150, -387, -40, -44, -18, + 73, 42, 171, 339, 213, 42, -137, -277, -379, -441, -440, -478, 270, 126, -4, 6, + -307, -479, -636, -596, -100, 83, 167, 200, 260, 376, 523, 1051, 1142, 490, 249, 108, + -148, -215, -324, -570, -917, -685, -208, 127, 285, 353, 441, 940, 1100, 458, 229, 100, + 427, 432, 548, 426, 133, 13, -9, -141, -108, -144, -195, -419, -733, -144, -109, -45, + -115, -220, -194, 661, 896, 688, 489, 351, 211, 258, 147, 30, -746, -784, -156, -95, + 16, -48, -88, -430, -798, 36, 204, 68, 174, 162, 20, 61, 627, 266, 102, 48, + -252, -370, -630, -614, 680, 1024, 869, 598, 419, 259, 193, 27, 90, 156, 53, 27, + -48, 33, 26, -227, -556, -766, -391, 231, 413, 282, 226, 89, 194, 187, 44, 30, + -204, -291, -345, -131, 125, 72, 16, -29, -106, -49, -27, 183, 714, 277, 114, 49, + -11, 205, 285, 69, -58, -207, -301, -160, -30, -2, 12, -99, -580, -178, -80, -41, + 120, 189, 281, 427, 234, 138, 124, 126, 50, 205, 121, 76, -797, -1204, -235, -133, + 63, -18, 146, 666, 480, 236, 134, -39, -97, -130, -175, -378, -746, -159, -106, -46, + 386, 399, 415, 157, -175, -282, -315, -318, -222, -225, -267, -342, 317, 152, 15, 14, + 39, 56, 71, -95, -387, -509, -595, -466, -395, -186, -24, 421, 814, 292, 127, 52 +}; + +/* An 16-by-16 matrix in Scale = 2.56f */ +const Word16 SVNB_SN2_fx[256] = +{//Qlog2(2.56) + -16, 111, 111, -89, -115, -404, -514, 162, 277, 41, -94, -89, 15, 31, 2, 2, + -82, -99, -25, -287, -464, 204, 18, -123, -38, 56, 109, 198, 160, 96, 41, 19, + -95, -62, -242, -415, 318, 118, -121, 44, 74, 40, 85, 114, 52, 36, 21, 8, + 29, 40, 43, 23, -202, -149, 288, 149, -20, -109, -186, -275, -127, 18, -25, -6, + 20, 36, -97, -228, 565, 508, 134, 42, -70, -237, -258, -259, -123, -9, -29, -10, + -72, -169, 492, 463, 193, 204, -13, -75, -82, -125, -181, -230, -181, -10, -40, -12, + -108, -221, -229, 648, 575, 288, 146, 1, -14, -4, -51, -120, -81, -14, -17, -5, + -199, -264, -309, 209, 8, -128, 24, -47, 87, 257, 240, 185, 93, 70, 34, 16, + 25, 82, -60, -155, -407, -615, 29, 100, -113, 32, 207, 258, 203, 111, 49, 21, + 37, 127, 95, 4, 112, -45, -217, -158, -277, -407, -304, -152, 72, 52, -6, 0, + -30, -81, -116, -416, -219, 677, 538, 328, 213, 60, -60, -109, -78, 0, -5, 0, + 9, -15, 26, 75, -175, -336, -673, -586, 238, 310, 198, 189, 212, 126, 48, 24, + -18, -4, -80, 102, 130, -116, -268, -471, -567, -104, 205, 221, 143, 81, 29, 12, + 4, 39, 65, 115, 88, 189, 136, 124, 49, 106, 37, 89, -375, -626, -114, -73, + 540, 525, 472, 221, 118, -31, 15, 7, -71, -139, -108, -93, -13, -4, -13, -8, + -44, -44, -143, -272, -525, -365, 479, 502, 312, 225, 161, 72, 28, 42, 26, 12 +}; + +const Word16 GETRNB_SN1_fx[512] = +{//Qlog2(2.56) + -119, -271, -427, 447, 321, 58, 37, -105, -65, 99, 106, 21, -277, 53, 9, -6, + -93, -241, -433, -826, -1028, 17, 180, 138, 320, 234, 152, 235, 973, 594, 199, 96, + -300, -474, -553, -497, -374, -231, -224, -170, -145, 51, 154, 714, 1338, 690, 271, 118, + -115, -228, -248, 9, -27, -196, -240, -269, -293, -310, -276, -254, 769, 481, 117, 59, + 172, 58, 469, 585, 512, 336, 145, -52, -167, -344, -379, -487, 285, 377, 27, 27, + 81, 34, 574, 859, 818, 702, 521, 344, 177, 23, -116, -274, -611, -78, -61, -35, + 76, 19, -104, -388, -687, 54, 279, 144, 237, 223, 110, 9, -335, 4, 3, -10, + 115, 380, 486, 446, 389, 316, 239, 249, 197, 207, 162, 141, -435, -1516, -409, -136, + -146, -348, -425, 645, 998, 790, 609, 468, 282, 287, 153, 87, -461, -592, -88, -64, + -249, -471, -835, -642, 589, 960, 887, 637, 442, 286, 242, 132, 142, 299, 99, 44, + 128, 37, -120, -314, -571, -730, -868, -558, -259, -109, 8, 413, 1145, 593, 210, 92, + 151, 331, 267, 130, -24, -89, -133, -43, -75, 57, 19, 94, -469, -796, -124, -90, + -339, -468, -292, -34, 76, 179, 231, 269, 259, 281, 275, 204, -93, 157, 53, 16, + 33, 176, 25, -201, -311, -497, -509, -242, -47, 6, 86, 48, -165, 176, 24, 8, + 27, 223, 461, 500, 479, 475, 489, 560, 635, 741, 924, 1347, 1546, 806, 277, 54, + 510, 464, 402, 114, -80, -285, -290, -321, -283, -368, -325, -424, 388, 402, 52, 38, + 521, 614, 732, 549, 428, 278, 180, 81, 14, -110, -204, -355, -649, -32, -56, -36, + 72, 26, 262, 263, 159, 113, 60, -10, -73, -121, -201, -329, -768, -61, -60, -39, + 85, 57, 116, -40, -78, -159, -154, -247, -220, -366, -331, -532, -35, 344, 0, 25, + 527, 919, 1339, 1225, 1190, 1023, 774, 577, 393, 160, -4, -184, -281, 29, -21, -12, + -230, -283, -338, -379, -313, -293, -163, -122, 15, 97, 243, 168, 361, 449, 102, 61, + 378, 369, 369, 136, 42, -72, -73, -154, -155, -260, -270, -444, -562, 173, -36, -9, + 168, 108, -36, -347, -559, -436, -254, -263, -236, -227, -247, -238, 796, 488, 123, 62, + -151, -118, 163, 452, 430, 484, 456, 418, 377, 363, 256, 183, -403, -1429, -382, -126, + -204, -366, -652, -512, 428, 353, 182, 88, -10, -94, -54, -11, 801, 527, 151, 76, + 60, 79, -169, -465, -789, -844, -55, 181, 209, 172, 210, 107, 260, 399, 91, 52, + -69, -205, -377, -164, 647, 584, 302, 151, 32, -135, -136, -223, -269, 170, 4, 5, + 38, 418, 885, 979, 990, 1027, 870, 804, 669, 537, 360, 241, -336, -1281, -338, -111, + -420, -700, -912, -622, -337, -51, 67, 173, 326, 554, 766, 1395, 1656, 894, 390, 178, + -141, -252, -507, -822, -1084, -845, -280, 20, 149, 242, 393, 951, 1428, 740, 303, 135, + -120, -37, 31, 105, 72, 99, 53, 117, 59, 171, 120, 177, -414, -993, -160, -98, + -382, -612, -631, -167, 4, 104, 130, 141, 242, 325, 348, 430, 1048, 651, 222, 109 +}; + +/* An 16-by-16 matrix in Scale = 2.56f */ +const Word16 GETRNB_SN2_fx[256] = +{//Qlog2(2.56) + -27, 71, 45, -4, 28, 69, 25, 94, 45, 90, 45, 87, -177, -567, -116, -59, + -208, -147, 531, 399, 199, 113, -21, -28, -34, -38, -48, -46, -47, 18, -1, -1, + 69, -20, -115, -355, -380, 388, 379, 193, 134, 37, -42, -60, -35, 29, 6, 5, + 107, 89, -98, -189, 379, 289, 68, 22, -71, -179, -187, -192, -137, 4, -17, -7, + -44, -81, -371, -448, 226, 75, -52, 43, 40, 36, 79, 120, 130, 76, 36, 15, + 131, 115, 192, 177, 25, -7, -23, -95, -132, -184, -206, -245, -200, -12, -29, -11, + 45, -25, -249, 50, -189, -358, 253, 145, -39, 27, 34, -20, -52, 13, 1, 2, + -254, -155, 23, -89, -30, 23, -23, -21, -45, -86, -92, -109, -48, 52, 3, 3, + -248, -233, 139, 213, 232, 361, 349, 401, 373, 301, 230, 207, 204, 101, 32, 14, + 491, 546, 409, 147, 34, -18, 52, 59, 48, 27, 14, 7, -1, -37, -16, -9, + 36, 41, 0, -21, -29, -64, -207, -346, -516, -355, -64, 73, 156, 94, 30, 11, + -28, -173, -278, 506, 427, 164, 111, 21, -33, -61, -78, -90, -32, 39, 4, 4, + -44, -60, -215, -373, -485, -270, 12, 151, 271, 265, 215, 178, 153, 71, 32, 17, + 110, 155, -29, -259, -218, -183, -175, -132, -85, -98, -87, -93, -77, 0, -9, -4, + -116, -14, 235, 1, -238, -398, -419, -55, 109, 77, 62, 74, 73, 47, 16, 8, + -20, -108, -219, 246, 20, -184, -328, -449, -67, 142, 125, 110, 91, 74, 28, 13 +}; + +/* An 16-by-16 matrix in Scale = 2.56f */ +const Word16 AUNB_SN1_fx[256] = +{//Qlog2(2.56) + -180, -79, -51, 39, 66, 99, 48, 108, 56, 127, 34, 46, -470, -845, -141, -90, + -212, 82, 284, 422, 416, 416, 313, 289, 233, 210, 108, 55, -439, -1323, -336, -123, + -9, 405, 532, 659, 710, 798, 844, 971, 1072, 1181, 1464, 1913, 2028, 1232, 549, 265, + 75, 49, 330, 493, 448, 329, 204, 67, -18, -134, -235, -400, -605, -30, -67, -36, + -9, -7, -95, -222, -322, -421, -321, -233, -110, -86, 67, -19, 3, 345, 41, 30, + 153, 34, -172, -386, -500, -548, -503, -420, -317, -207, -114, 183, 1096, 661, 198, 94, + 616, 501, 471, 220, 157, 55, 4, -161, -178, -314, -267, -389, 216, 429, 46, 38, + -559, -854, -789, -369, -153, 64, 146, 296, 388, 520, 574, 958, 1481, 898, 340, 164, + 131, 137, 116, 57, 64, -21, -38, -112, -123, -199, -214, -379, -641, 83, -53, -21, + -101, -324, -648, -801, -835, -737, -501, -296, -86, 144, 400, 1025, 1501, 861, 322, 151, + -231, -397, -512, -506, -308, -200, -127, -91, -18, 17, 94, 114, 798, 625, 161, 88, + -518, -617, -201, 103, 258, 279, 273, 267, 281, 251, 214, 114, 58, 270, 70, 31, + 17, -86, -78, -82, -22, -73, -171, -299, -334, -431, -422, -526, 517, 511, 71, 53, + 276, 182, -40, -336, -461, -93, 342, 267, 166, 18, -43, -196, -146, 236, 18, 14, + 227, 338, 224, 188, 107, 80, 57, 92, 34, 80, -5, -4, -515, -927, -174, -100, + 731, 744, 797, 675, 590, 438, 328, 215, 144, 24, -96, -239, -486, -175, -65, -41 +}; + +const Word16 SVWB_SN1_fx[256] = +{//Qlog2(2.56) + -71, -61, -170, -563, -962, -845, 186, 421, 282, 344, 260, 155, 186, 52, -18, -11, + -107, -139, -289, -270, 788, 615, 249, 174, -1, -24, 159, 106, -46, -183, -187, -107, + -144, -221, -215, 359, 192, -34, -186, -326, -256, -124, -49, 84, 214, 237, 186, 91, + 218, 332, 335, 41, -191, -394, -614, -543, -415, -379, -285, -153, -86, -101, -69, -13, + 587, 616, 732, 419, 270, 252, 102, 40, 53, -35, -57, -34, 19, -14, -15, -120, + -76, -222, -127, 1216, 1188, 815, 532, 320, 311, 228, 34, -59, -96, -86, -44, -38, + -176, -282, -507, -455, 1122, 1359, 965, 742, 610, 448, 474, 412, 185, 127, 127, -24, + -156, -225, 16, 458, 423, 438, 393, 400, 525, 658, 682, 681, 612, 438, 267, 68, + 89, 120, 172, 355, 195, -8, -22, -67, -110, -40, -93, -163, -382, -685, -926, -468, + -227, -362, -452, -577, -213, -22, 56, 82, 132, 216, 348, 420, 358, 299, 257, 143, + 38, -77, 117, 856, 486, 282, 16, -154, -130, -315, -618, -783, -892, -545, -88, 59, + 218, 324, 232, -162, -583, -552, 126, 62, -40, -27, -227, -348, -334, -324, -238, -65, + 82, 16, -20, -539, -787, 604, 340, 259, 260, -53, -251, -211, -12, 127, 171, 99, + -24, 168, 202, -142, -223, -448, -282, 122, 148, 155, 363, 380, 347, 263, 124, -68, + 165, 150, 226, 95, -172, -257, -413, -510, -533, -734, -1014, -1206, -834, -162, 6, 97, + -78, -72, -81, -322, -605, -731, -740, -564, -356, -219, -151, 11, 200, 237, 212, 170 +}; + +const Word16 SVWB_SN2_fx[256] = +{//Qlog2(2.56) + -126, -152, -342, -423, 311, 95, 3, 29, -93, 4, 227, 193, 142, 120, 93, 62, + 190, 258, 382, 310, 166, -11, -77, -67, -217, -327, -330, -378, -461, -309, -142, -47, + -16, -58, -77, -339, -534, 469, 399, 237, 290, 135, 34, 86, -14, -77, -30, 10, + 13, -4, 644, 572, 412, 438, 272, 286, 234, 177, 118, 147, 131, 138, 127, 38, + -73, -88, -112, 42, 36, 141, 424, 386, 504, 576, 523, 483, 431, 328, 233, 59, + -120, -169, -270, -445, -593, -268, -133, -138, -11, 56, 133, 210, 166, 116, 122, 137, + 282, 370, 255, 76, -89, -191, 139, 80, 12, 176, 185, 145, 244, 253, 173, -18, + 13, 14, -43, 73, -59, -270, -448, -622, -59, 374, 353, 293, 189, -54, -199, -122, + -75, -106, -281, -312, 585, 405, 185, 62, -176, -319, -330, -400, -418, -162, -4, 78, + -31, -11, -79, -83, -88, -274, -343, -431, -623, -518, -148, -11, -17, -21, 21, 90, + -101, -173, -240, 444, 303, 121, 104, -37, 185, 134, -45, -136, -164, 4, 153, 114, + -8, 40, 107, -76, -254, -551, -673, 288, 318, 25, 14, -62, -97, -2, 13, -20, + 87, 127, 80, 216, 336, 147, 188, 165, -10, 125, 193, 87, -126, -396, -736, -669, + 2, 4, 96, 185, 6, 62, -37, -136, -177, -250, -227, 201, 744, 651, 351, 74, + -16, -39, -82, -177, -380, -183, -24, -109, -194, -407, -641, -615, -157, 146, 191, 167, + -21, -12, -39, -63, -159, -128, 20, 6, 16, 39, -60, -243, -594, -733, -364, 46 +}; + +const Word16 GETRWB_SN1_fx[512] = +{//Qlog2(2.56) + -232, -191, 282, 248, 344, 390, 428, 490, 538, 592, 620, 607, 533, 372, 261, 136, + -59, -227, -418, -288, -247, -448, -501, -644, -760, -922, -1112, -1204, -523, -130, 12, 131, + 139, 838, 1402, 1327, 1465, 1391, 1371, 1342, 1220, 1147, 1041, 910, 733, 518, 335, 181, + 211, 148, -94, -275, -484, -586, -541, -634, -583, -511, -424, -322, -285, -299, -194, -87, + 410, 362, 337, 73, -36, -113, -180, -274, -373, -493, -501, -473, -393, -361, -271, -251, + -85, -366, -819, -532, 753, 688, 414, 203, 24, -43, 129, 60, -100, -123, -97, -114, + 4, 37, 484, 514, 340, 225, 89, 59, 40, 3, -5, -1, -11, -49, -43, -48, + -223, -471, -661, -567, -496, -519, -464, -542, -484, -343, -276, -185, -43, 17, 84, 133, + -106, -312, -668, -741, 385, 329, 121, -157, -423, -710, -957, -1280, -1143, -330, -20, 131, + 250, 157, 71, -310, -552, -740, -745, -778, -827, -1064, -1336, -1629, -788, -195, -44, 131, + 140, 633, 970, 864, 867, 761, 683, 648, 572, 544, 516, 469, 383, 238, 143, 55, + 116, 143, 229, 134, -25, -120, -232, -333, -535, -642, -985, -1259, -1873, -1727, -330, -10, + -64, -82, -62, -232, -308, -346, -296, -272, -153, -26, 108, 205, 232, 158, 129, 53, + 82, -92, -309, -791, -1128, -259, -243, -405, -367, -637, -903, -1084, -675, -199, 17, 146, + -247, -569, -886, -758, -334, -206, -158, -150, -64, 57, 190, 252, 261, 210, 163, 129, + -23, -319, -458, 791, 718, 400, 233, -81, -174, -400, -758, -1048, -1338, -1038, -288, -6, + 50, 462, 303, -47, -122, -134, 15, 137, 179, 222, 266, 249, 219, 123, 80, 30, + -116, -332, -650, -1104, -1367, -691, -376, -295, -178, -199, -170, -24, 125, 95, 125, 168, + -66, -314, -526, 325, 156, -56, -114, -287, -126, -185, -292, -298, -189, -81, 1, 23, + 147, -30, -291, -771, -939, 262, 182, 126, 127, -100, -163, -134, -91, -95, -52, -19, + -225, -496, -449, -61, 46, 135, 182, 247, 324, 404, 457, 464, 420, 305, 209, 106, + 418, 312, 415, 74, -156, -345, -400, -634, -769, -1057, -1362, -1841, -1848, -471, -147, 87, + 38, 19, -232, -552, -698, -941, -483, 119, 54, -34, 70, -68, -144, -192, -253, -236, + 80, -30, -214, -157, -292, -312, -283, -347, -384, -372, -487, -503, -746, -950, -1372, -644, + 44, 55, 124, 181, 125, 109, 61, 29, -73, -54, -206, -278, -638, -929, -1563, -1742, + 802, 823, 726, 353, 272, 122, 117, 94, 80, 40, 68, 47, 42, -19, -26, -69, + 50, -97, -306, -666, -918, -1109, -1124, -776, -710, -728, -675, -486, -150, -3, 93, 160, + 81, -144, -131, 319, 227, -96, -236, -517, -711, -949, -1231, -1644, -1625, -444, -117, 86, + -230, -237, 586, 799, 931, 1023, 1077, 1179, 1133, 1101, 1027, 909, 731, 515, 330, 171, + 448, 632, 1047, 782, 631, 390, 155, -82, -342, -685, -1103, -1520, -1779, -931, -214, 34, + -77, -352, -353, 787, 938, 677, 513, 352, 284, 278, 247, 181, 141, 73, 8, -39, + 54, 42, -67, -298, -465, -593, -533, -547, -626, -741, -977, -1317, -1665, -613, -119, 80 +}; + +const Word16 GETRWB_SN2_fx[256] = +{//Qlog2(2.56) + -202, -246, -356, -356, -232, -164, -79, 4, 78, 130, 152, 165, 170, 141, 90, 70, + 38, 78, -72, -185, -446, -552, 269, 295, 104, 77, -54, -184, -168, -72, -32, -2, + 69, 93, 39, 116, 100, 46, 50, -1, -2, 62, 8, -105, -404, -656, -494, -224, + -285, -305, 263, 97, 29, 33, -24, 54, 35, 25, -4, -6, -30, 13, 20, 21, + -28, -70, -160, 34, 5, -145, -264, -425, -539, -329, -19, 228, 411, 280, 141, 51, + 244, 245, 19, -319, -461, -184, -10, 47, 220, 293, 309, 330, 281, 140, 71, 12, + -128, -251, -374, 424, 279, 68, 35, -68, 13, 45, -6, -41, -73, -17, 8, 27, + -55, -7, 438, 500, 493, 442, 286, 211, 68, -39, -117, -167, -180, -131, -75, -63, + 30, 31, 69, 114, -172, -407, -596, -391, 102, 169, 158, 131, 46, 4, -6, -3, + 69, 76, 33, 238, 164, 119, 160, 165, 273, 342, 383, 419, 456, 378, 262, 96, + -55, 43, -59, -273, -200, -286, -287, -221, -247, -245, -194, -160, -129, -36, -31, 3, + -35, -46, -272, -357, 484, 246, -11, 21, -123, -197, -102, -94, -96, -22, 6, 6, + -117, -188, -252, -227, 0, 460, 506, 526, 501, 389, 250, 131, -28, -32, 24, 17, + 399, 511, 390, 146, 80, -84, -81, -57, -123, -138, -95, -82, -51, -33, -14, -45, + -9, 12, 300, 304, 182, 27, -197, -258, -344, -393, -384, -318, -140, -5, -6, 6, + 64, 25, -7, -256, -306, 381, 243, 96, -17, -190, -285, -246, -65, 48, 37, 29 +}; + +const Word16 AUWB_SN1_fx[256] = +{//Qlog2(2.56) + 328, 137, 358, 330, 184, 145, -60, -294, -555, -784, -945, -872, -601, -337, -155, -33, + 32, -212, -488, -651, -752, -877, -892, -886, -853, -795, -705, -549, -330, -224, -127, -9, + 372, 327, 197, 33, 13, -55, -87, -124, -125, -148, -144, -168, -175, -184, -127, -125, + 752, 727, 623, 519, 449, 350, 309, 289, 272, 252, 185, 124, 118, 35, 22, -20, + 14, 144, 296, 432, 416, 325, 177, 166, 151, 123, 109, 104, 47, -22, -45, -49, + 310, 112, -141, -529, -654, -53, 162, -33, -297, -551, -772, -817, -540, -287, -95, -7, + -158, 241, 443, 543, 559, 579, 566, 606, 610, 622, 602, 578, 485, 331, 197, 104, + -471, -530, 37, 272, 397, 442, 466, 523, 561, 592, 608, 576, 485, 348, 222, 133, + 162, 0, -87, -85, -151, -331, -410, -603, -767, -1030, -1348, -1812, -1735, -678, -284, -6, + -156, 36, 15, 26, 41, 118, 201, 265, 339, 382, 420, 435, 377, 264, 159, 84, + -69, -274, -411, -158, 60, -56, -190, -305, -371, -389, -411, -407, -338, -276, -173, -99, + 0, -26, -196, -379, -369, -327, -193, -148, -77, -10, 63, 98, 98, 49, 40, -5, + -149, -432, -729, -923, -927, -766, -568, -455, -333, -219, -122, -29, 11, 9, 20, 54, + 177, 64, -60, -232, -411, -552, -557, -550, -509, -464, -380, -331, -297, -288, -215, -170, + -16, 439, 971, 1104, 1209, 1323, 1339, 1374, 1317, 1223, 1107, 983, 781, 535, 315, 151, + -432, -727, -686, -340, -156, -40, 18, 102, 169, 257, 306, 335, 296, 213, 137, 97 +}; + +/* An 16-by-16 matrix in Scale = 2.56f */ +const Word16 TRWB2_SN1_fx[256] = +{//Qlog2(2.56) + -74, -384, -764, -964, -1122, -912, -819, -740, -728, -572, -379, -317, -250, -51, -67, 85, + -311, -618, -439, -108, 156, 257, 404, 543, 643, 729, 732, 572, 446, 329, 236, 164, + 523, 1549, 1557, 1476, 1374, 1192, 1068, 923, 901, 788, 717, 401, 262, 6, -100, -368, + -13, -80, -189, -386, -486, -357, -216, -63, 65, 189, 248, 194, 218, 219, 205, 169, + -104, -519, -772, 492, 224, 18, -203, -244, -126, -220, -362, -417, -271, -71, -34, -50, + -202, 124, 811, 975, 1326, 1468, 1613, 1527, 1474, 1366, 1220, 906, 700, 509, 351, 207, + -57, -196, -238, -281, -267, -239, -190, -137, -27, 4, 77, -178, -256, -553, -669, -1105, + -183, -211, 804, 789, 685, 529, 479, 403, 371, 313, 279, 49, -19, -156, -179, -335, + 758, 848, 608, 313, 271, 176, 177, 73, 106, 61, 59, -159, -203, -287, -268, -343, + 199, 70, 95, -29, -245, -411, -745, -1009, -1473, -1921, -2633, -1648, -537, -284, -87, 207, + 82, -217, -460, -646, -718, -821, -983, -1282, -1580, -2108, -1863, -609, -407, -122, -50, 243, + -132, 364, 364, 340, 489, 496, 596, 606, 704, 756, 777, 616, 521, 409, 305, 211, + 123, -189, -91, -306, -319, -407, -600, -679, -911, -855, -566, -249, -65, -1, -65, -25, + 79, -58, -103, -150, -268, -265, -426, -479, -614, -671, -1005, -1378, -2027, -1547, -568, -52, + -275, -669, -1070, -1097, -688, -433, -340, -148, -27, 194, 309, 277, 229, 188, 82, 127, + 397, 1343, 1482, 1729, 1978, 2012, 1969, 1852, 1729, 1574, 1407, 1087, 848, 636, 431, 278 +}; + +/* An 16-by-16 matrix in Scale = 2.56f */ +const Word16 TRWB2_SN2_fx[256] = +{//Qlog2(2.56) + 50, -66, -486, -850, 504, 345, 261, 10, -207, -218, -174, -18, 72, 69, 3, 24, + -171, -439, -632, 390, 143, -89, -292, -314, -227, -157, 33, 181, 185, 204, 128, 167, + 458, 459, 78, -250, -365, -381, -353, -382, -327, -284, -191, -18, 3, 37, 29, 95, + -169, -227, -423, -448, -485, -426, -364, -284, -238, -184, -228, -190, -145, 17, 65, 145, + -4, -120, -170, -333, -677, -782, -719, -391, -112, 232, 464, 392, 275, 215, 121, 139, + -94, -130, 453, 295, -45, -286, -444, -473, -519, -428, -268, -40, -12, 46, 39, 118, + -189, -245, 805, 815, 518, 293, 162, 110, -67, -158, -223, -120, -36, 15, 26, 60, + 23, 130, 107, 0, -31, -66, 33, 22, 101, -10, -32, -232, -281, -590, -672, -1089, + 51, 106, 157, 132, 40, 11, -73, -66, -165, -294, -561, -770, -742, -489, -202, 4, + 25, 230, 286, 179, 75, 18, 15, 24, 109, 187, 310, 334, 328, 291, 237, 212, + -238, -492, -550, 563, 764, 610, 542, 427, 373, 261, 166, 171, 122, 34, -21, -92, + -359, -462, -10, 22, -42, -2, 78, 167, 154, 155, 74, 73, 66, 94, 89, 126, + -5, -110, -374, -546, -386, -136, 95, 305, 437, 570, 615, 558, 463, 335, 209, 151, + 23, 376, 292, 235, 485, 519, 657, 549, 478, 338, 186, 7, -28, -155, -95, -188, + 166, 139, -277, -716, -822, 234, 319, 326, 234, 36, -155, -317, -247, -80, 49, 117, + 431, 853, 745, 512, 325, 139, 83, -31, -25, -47, -17, -12, -24, -43, -5, 13 +}; + +/* An 16-by-16 matrix in Scale = 2.56f */ +const Word16 AUWB2_SN1_fx[256] = +{//Qlog2(2.56) + -107, -446, -835, -1041, -1152, -1161, -1146, -969, -828, -533, -251, -242, -139, 172, 95, 466, + 1052, 1008, 1052, 875, 864, 748, 783, 690, 754, 715, 688, 342, 195, -32, -251, -509, + -311, -170, 366, 632, 748, 863, 983, 1042, 1118, 1188, 1133, 895, 728, 621, 460, 418, + 608, 525, 322, 30, -237, -483, -862, -1178, -1651, -2184, -2770, -1349, -430, -28, 128, 562, + 296, 171, -192, -429, -488, -470, -492, -473, -448, -352, -242, -309, -337, -210, -265, -182, + 831, 703, 456, 217, 165, 65, 17, -53, -67, -78, -38, -222, -340, -329, -349, -391, + 162, -13, -158, -335, -526, -705, -986, -1245, -1640, -2149, -2754, -1344, -372, -12, 134, 564, + -79, -389, -569, -699, -811, -940, -1058, -1299, -1534, -2077, -1953, -507, -216, 143, 191, 607, + -106, -116, -210, -225, -323, -330, -494, -491, -700, -757, -1057, -1424, -2222, -1509, -259, 348, + -366, -748, -1177, -1216, -1017, -698, -444, -154, 10, 285, 361, 284, 255, 359, 187, 365, + 77, 447, 418, 475, 453, 459, 475, 515, 562, 648, 658, 452, 367, 334, 244, 204, + 10, 197, 170, 166, 144, 60, 52, -2, -20, -40, 18, -238, -279, -434, -451, -807, + -460, -713, -547, -153, 64, 243, 386, 492, 620, 752, 759, 536, 445, 324, 151, -32, + -246, -396, -413, -371, -354, -317, -307, -228, -195, -101, -36, -174, -197, -162, -261, -349, + -329, -240, 326, 462, 428, 344, 405, 374, 439, 434, 467, 127, 85, -154, -248, -683, + -12, 15, -222, -227, -31, 124, 200, 294, 357, 541, 607, 459, 376, 352, 282, 283 +}; + +/* An 16-by-32 matrix */ +const Word16 IAA_MA1_fx[512] = +{//Qlog2(2.56) + -175, -490, -520, -631, -645, -614, -610, -548, -503, -432, -353, -301, -238, -141, -67, 26, + 301, 407, 227, 96, -12, -18, -13, 2, 39, 107, 124, 92, 83, 100, 62, 72, + -280, -737, -569, -164, -9, 100, 141, 211, 252, 281, 274, 217, 206, 219, 117, 106, + -266, -753, -841, -587, -487, -345, -263, -167, -114, -30, 8, 32, 34, 61, 55, 104, + -91, -137, -293, -349, -352, -326, -268, -247, -178, -129, -56, -96, -11, 219, 49, 56, + -18, 1, -33, -14, -19, -5, -22, -14, -43, -37, -104, -143, -375, -770, -190, -100, + 72, -22, -121, -220, -320, -378, -500, -587, -729, -795, -1056, -1305, -1691, -1090, -452, -60, + 19, -279, -453, -580, -588, -739, -858, -1044, -1281, -1614, -921, -376, -273, -84, -2, 187, + 853, 759, 591, 376, 260, 122, 39, -71, -133, -184, -209, -297, -299, -171, -124, -83, + 266, 34, -182, -367, -516, -686, -881, -1121, -1414, -1834, -2110, -997, -519, -274, -109, 137, + -2, -8, 42, 91, 172, 211, 298, 336, 433, 409, 546, 1043, 1499, 1038, 410, 189, + 86, 254, 259, 254, 246, 219, 184, 122, 79, 11, -55, -170, -363, -934, -371, -188, + 168, 167, -122, -244, -325, -340, -359, -343, -331, -291, -278, -270, -272, -162, -101, -46, + -244, -459, -367, -340, -295, -220, -173, -107, -22, 53, 103, 293, 1084, 807, 260, 117, + -319, -650, -685, -427, -290, -105, 25, 161, 303, 418, 587, 1074, 1563, 1085, 400, 170, + 146, 257, 282, 295, 303, 294, 297, 262, 237, 193, 92, 341, 1220, 884, 315, 144, + -291, -558, 147, 201, 282, 280, 310, 302, 313, 306, 292, 239, 198, 188, 106, 94, + -11, -8, -156, -204, -231, -250, -265, -289, -269, -316, -322, -450, -488, -676, -778, -973, + -117, -27, 4, 96, 174, 229, 271, 310, 344, 362, 344, 273, 209, 180, 109, 106, + -260, -290, 151, 269, 406, 442, 551, 590, 679, 681, 900, 1293, 1631, 1132, 477, 221, + -37, 374, 394, 414, 419, 395, 345, 313, 282, 255, 211, 126, 84, 51, -10, -53, + 404, 327, 174, 28, -124, -290, -490, -695, -1011, -1111, -529, -288, -183, -69, -7, 142, + 563, 752, 585, 555, 512, 478, 424, 396, 376, 343, 300, 194, 193, 162, 78, 46, + -59, -131, -35, 49, 54, -12, -92, -185, -243, -289, -288, -344, -326, 0, -38, 6, + 496, 582, 564, 514, 521, 490, 486, 436, 432, 320, 456, 1060, 1523, 1058, 419, 194, + 174, 77, 18, -89, -112, -196, -165, -247, -222, -326, -332, -494, 499, 617, 121, 60, + 315, 299, 229, 137, 78, -3, -40, -138, -198, -307, -375, -502, -515, -25, -88, -49, + -232, -29, 353, 399, 485, 487, 523, 526, 556, 559, 520, 415, 328, 283, 187, 166, + 182, 385, 403, 453, 515, 572, 635, 691, 787, 852, 1154, 1483, 1779, 1231, 524, 246, + -273, -492, -185, -97, -52, -51, -17, -27, 13, 20, 45, -20, 52, 244, 58, 56, + 20, -3, -241, -267, -194, -86, 4, 75, 140, 191, 200, 154, 137, 146, 85, 77, + 92, 628, 611, 708, 706, 716, 672, 694, 655, 619, 550, 432, 354, 284, 204, 172 +}; + +/* An 16-by-16 matrix in Scale = 2.56f */ +const Word16 UVD_MA1_fx[256] = +{//Qlog2(2.56) + -301, -503, -426, -187, -131, -64, -45, -20, 11, 56, 63, 90, 110, 175, 97, 33, + 161, 353, 474, 502, 709, 782, 794, 765, 632, 532, 406, 285, 230, 145, 97, 52, + -37, -5, 205, 323, 412, 349, 221, 91, -6, -59, -86, -112, -32, 209, 73, 23, + -273, -615, -820, -794, -834, -838, -822, -819, -751, -701, -641, -562, -391, -271, -184, -63, + 262, 168, 104, -9, -78, -163, -141, -199, -191, -249, -245, -317, -168, 535, 109, 33, + -410, -675, -681, -611, -500, -396, -273, -183, -47, 60, 194, 357, 1044, 1080, 335, 140, + 154, 185, 256, 238, 203, 238, 280, 260, 300, 267, 258, 196, 121, -618, -263, -60, + 345, 705, 859, 786, 743, 584, 425, 267, 168, 105, 74, 28, 119, 267, 105, 39, + -39, -166, -230, -196, -255, -276, -318, -349, -387, -438, -539, -613, -752, -956, -1353, -1628, + 498, 479, 414, 231, 98, 5, -18, -41, -60, -78, -91, -96, -81, 72, 30, -8, + 41, 120, 65, 141, 117, 186, 249, 299, 418, 520, 566, 618, 692, 579, 321, 166, + -236, -278, -69, 13, 113, 362, 445, 539, 503, 387, 269, 172, 120, -21, 1, 4, + -103, -46, -137, -132, -108, -97, -67, -37, -8, 41, 82, 107, 43, -605, -189, -56, + -220, -315, -482, -516, -489, -445, -415, -362, -304, -205, -136, -68, -7, 131, 70, 25, + -10, -121, -210, -237, -224, -302, -246, -310, -271, -343, -285, -364, 28, 703, 135, 54, + 118, 50, -67, -166, -349, -416, -442, -446, -439, -420, -382, -319, -245, -209, -140, -82 +}; + +/* An 16-by-16 matrix in Scale = 2.56f */ +const Word16 UVD_MA2_fx[256] = +{//Qlog2(2.56) + -75, -64, -150, -231, -272, -278, -248, -194, -156, -107, -74, -43, -92, -21, 9, 5, + 393, 275, -12, -156, -208, -215, -162, -132, -115, -109, -94, -85, -104, -10, 5, -1, + -297, -389, -99, -78, -66, -19, -12, 8, 0, -3, -15, -22, -113, -82, -16, 2, + 59, -11, 5, -33, -11, -61, -70, -139, -143, -239, -207, -223, 711, 701, 143, 68, + -195, 406, 222, 49, -6, -23, -6, 9, 0, 13, 26, 49, -44, -129, -18, -7, + 23, -30, -141, 79, -18, -76, -55, -14, 44, 98, 88, 86, -96, -351, -112, -39, + 380, 329, 235, 173, 141, 72, 25, -4, -6, -19, -21, -33, -55, -23, 3, -1, + -81, -210, -284, 158, 396, 290, 163, 59, -25, -22, -10, -6, -46, -32, 9, 5, + 9, 34, -15, 5, 23, -48, -127, -243, -347, -421, -455, -475, -495, -449, -294, -163, + -13, -171, -416, -414, -245, -25, 69, 102, 104, 84, 50, 33, -38, -4, 0, 5, + 50, 118, 68, 37, 147, 319, 371, 355, 291, 204, 130, 81, 21, 46, 36, 22, + -95, -108, 311, 214, -28, -153, -226, -192, -129, -69, -42, -11, -48, -17, 13, 2, + -185, -223, -104, 26, 53, 89, 132, 181, 258, 346, 397, 445, 392, 241, 125, 58, + 83, 33, -9, -81, 40, 99, 56, 8, -51, -85, -106, -124, -196, 5, 5, 0, + 143, 148, 19, -121, -247, -211, -67, 83, 198, 268, 290, 300, 240, 164, 86, 37, + -198, -136, 370, 372, 300, 240, 156, 113, 79, 60, 44, 29, -35, -38, 6, 7 +}; + +/* An 16-by-16 matrix in Scale = 2.56f */ +const Word16 UVWB_MA3_fx[256] = +{//Qlog2(2.56) + -26, 23, 7, -6, -1, 3, 40, 35, -43, -24, 56, 157, 265, 423, 382, 260, + 61, -300, -130, -101, -8, 106, 108, 114, 88, 43, -2, -33, -56, 67, 29, 13, + -31, 47, 45, -121, 46, 22, 111, 233, -256, -252, -123, -71, -31, 54, 56, 33, + 20, -154, 67, 198, -232, -167, -86, -12, 79, 116, 88, 78, 44, 75, 27, -7, + -14, 153, -166, 21, 107, 64, 233, -223, -147, -27, -1, 43, 61, 70, 50, 18, + 3, -115, -8, 143, 192, 193, -124, -195, -198, -162, -75, 14, 45, 83, 79, 49, + 12, -57, 25, -29, -11, 12, -7, -13, -12, 31, 74, 99, -10, -421, -209, -111, + -25, 115, 119, -19, -117, -164, -203, -237, -206, -169, -110, -41, -11, 15, 1, -7, + -13, 170, -143, -128, -224, -94, 1, 96, 144, 102, 29, 2, -37, 46, 7, -12, + -11, 10, -34, 38, 24, 86, 149, 211, 240, 279, 247, 218, 154, 161, 74, 15, + -24, 64, 110, 125, -24, 123, 161, 166, 177, 18, -112, -116, -141, -117, -113, -91, + -4, -20, -17, -11, -27, 13, -15, -40, -58, -157, -252, -283, -288, -186, -162, -112, + -20, 2, 32, 44, -31, -49, 8, 13, 55, -59, -162, -212, -61, 384, 115, 36, + -4, 42, -75, 92, 268, -203, -125, 10, 52, 121, 72, -43, -109, -47, -66, -76, + -39, 76, 268, -254, -28, 87, 2, 91, 85, 68, 89, 96, 42, 90, 39, 4, + 2, 2, -56, 7, 67, -31, -219, -192, -24, 146, 249, 269, 209, 199, 106, 31 +}; + +/* An 16-by-8 matrix in Scale = 2.56f */ +const Word16 GESVNB_AR1_fx[128] = +{//Qlog2(2.56) + -25, -64, -140, -118, 270, 240, 127, 70, 20, -40, -56, -111, -82, 64, 2, 5, + 81, 104, 71, 70, 0, -49, -54, -73, -59, -92, -102, -201, -404, -52, -40, -15, + -112, -217, -251, -202, -34, 57, 58, 62, 79, 127, 177, 306, 524, 315, 112, 53, + 17, -6, 34, 66, 14, -26, -174, -196, -142, -131, -102, -97, 180, 154, 29, 17, + 5, -27, -107, -197, -343, -333, -182, -143, -91, -17, 43, 120, 383, 267, 83, 40, + -1, -15, -35, -56, -169, -145, 86, 101, 77, 48, 29, 78, -9, 68, 15, 9, + 3, 9, 320, 450, 385, 348, 215, 155, 105, 45, -13, -75, -272, -129, -52, -23, + 4, 49, 54, 90, 92, 101, 59, 69, 20, 70, 23, 43, -280, -624, -114, -55 +}; + +/* An 16-by-8 matrix in Scale = 2.56f */ +const Word16 GESVNB_AR2_fx[128] = +{//Qlog2(2.56) + -22, -35, -31, -166, -164, 217, 212, 155, 166, 123, 67, 33, -21, -41, -3, -1, + -14, -20, -16, -70, -77, -53, 23, -7, -98, -123, -99, -49, 357, 114, 36, 19, + -57, -119, -303, -215, -33, -103, -97, -117, -105, -102, -67, -134, -176, 113, 16, 8, + -12, 14, 30, -37, -112, -226, -206, -25, 125, 134, 99, 83, 55, -4, 9, 4, + -19, 23, 171, 57, 13, -15, -26, -42, -65, -69, -77, -169, -351, -105, -49, -21, + -14, -10, 8, 35, 161, 104, -74, -102, -135, -47, 45, 264, 52, -69, -1, -5, + 213, 284, 230, 121, 50, 12, 43, 48, 27, -7, -24, -39, 75, 1, -9, -3, + -75, -137, -89, 275, 164, 65, 125, 91, 86, 91, 56, 10, 9, -10, 0, 0 +}; + +/* An 16-by-8 matrix in Scale = 2.56f */ +const Word16 GESVWB_AR1_fx[128] = +{//Qlog2(2.56) + -3, -16, -31, 2, -81, -123, -226, -260, -196, -122, -20, 78, 178, 145, 84, 46, + 55, 42, 15, 32, -48, -81, -109, -137, -187, -264, -330, -387, -363, -176, -38, 37, + -32, -70, -144, -269, -337, -183, 59, 58, 44, 49, 42, 51, 72, 50, 26, 38, + -18, -58, -79, 125, 352, 291, 180, 118, 72, 25, -23, -82, -185, -167, -33, 6, + -10, 135, 544, 517, 517, 561, 515, 528, 500, 472, 413, 383, 318, 219, 118, 57, + -54, -280, -614, -548, -521, -522, -448, -479, -457, -438, -377, -355, -318, -271, -222, -89, + -62, -96, -86, -10, 104, 155, 120, 112, 190, 264, 291, 272, 232, 166, 95, 27, + 33, 61, 155, 121, 9, -28, 6, 103, 64, 17, 4, -2, -31, -88, -209, -206 +}; + +/* An 16-by-8 matrix in Scale = 2.56f */ +const Word16 GESVWB_AR2_fx[128] = +{//Qlog2(2.56) + -147, -326, -421, -91, -22, -25, -14, -21, 32, 76, 104, 102, 65, 47, 50, 41, + -39, -16, 61, -13, -38, -56, 47, 153, 195, 213, 212, 220, 245, 245, 209, 86, + -34, -73, 82, 387, 199, 71, 56, -18, -33, -56, -88, -79, -5, 59, 55, 29, + -7, -21, -21, -158, -123, 304, 226, 168, 124, 8, -75, -91, -54, -5, 37, 30, + -26, -22, -67, -225, 107, 38, -82, -113, -213, -205, -62, 28, 89, 95, 52, 17, + 227, 404, 325, 134, 45, -16, 3, -15, -55, -65, -55, -54, -18, -8, 1, -14, + 19, 30, 12, 28, 48, 13, 2, -47, -38, 41, 29, -8, -154, -315, -411, -242, + 8, 24, 29, -61, -215, -329, -237, -106, -12, -12, -64, -118, -167, -119, 8, 52 +}; + +/* An 16-by-32 matrix in Scale = 2.56f */ +const Word16 GEWB2_MA1_fx[512] = +{//Qlog2(2.56) + 659, 1694, 1634, 1513, 1305, 1098, 933, 805, 733, 624, 525, 339, 239, 50, -35, -215, + 6, 65, 125, 55, -85, -126, -272, -316, -507, -586, -1010, -1278, -1941, -1910, -426, 78, + 281, 315, 236, -4, -102, -171, -232, -335, -362, -425, -488, -603, -669, -736, -648, -593, + 29, -251, -582, -871, -969, -897, -991, -1077, -1275, -1480, -998, -393, -247, -9, 28, 271, + -60, -361, 401, 552, 236, 35, -196, -215, -496, -683, -911, -820, -576, -299, -240, -141, + 416, 574, 662, 350, 133, -160, -431, -781, -1200, -1652, -2035, -1092, -449, -192, -11, 263, + -206, -609, -931, 28, -229, -358, -543, -462, -377, -360, -336, -251, -105, 35, 26, 80, + 369, 1256, 1380, 1571, 1726, 1727, 1644, 1521, 1350, 1156, 984, 748, 580, 395, 254, 108, + -147, -479, -330, -73, -272, -441, -685, -837, -1139, -1458, -1370, -414, -208, -12, 14, 213, + -50, 100, -82, -253, -7, 119, 294, 392, 494, 578, 589, 523, 462, 383, 300, 249, + -94, -362, -575, -770, -987, -999, -922, -697, -582, -305, -135, -31, -8, 23, -33, 62, + 29, -64, -4, -123, -344, -414, -679, -767, -1152, -1401, -2105, -1905, -582, -300, -64, 223, + 428, 990, 1019, 809, 681, 470, 366, 179, 126, -26, -141, -363, -423, -536, -437, -545, + -133, -357, 364, 241, -39, -227, -334, -305, -426, -292, -102, 87, 159, 182, 160, 190, + 560, 764, 531, 156, 22, -18, 23, -20, 19, 0, 13, -61, -35, -44, -12, -48, + 33, -235, -634, -1093, 136, -31, -68, -285, -529, -535, -462, -249, -95, -53, -116, -61, + -188, -628, -894, 702, 700, 373, 196, 51, 95, -56, -191, -181, -173, -132, -116, -218, + 37, -188, -661, -1087, -1322, -258, -186, -181, -238, -372, -418, -508, -433, -197, -73, 28, + -231, -222, 911, 875, 669, 440, 363, 301, 257, 192, 147, 68, 77, 43, 57, 17, + -4, -187, -356, -410, -569, -499, -584, -568, -660, -703, -965, -1201, -1540, -708, -252, 87, + 220, 64, -67, -357, -572, -744, -913, -1176, -1439, -1894, -2152, -762, -419, -146, -10, 281, + -253, -627, -1075, -1206, -721, -398, -337, -188, -118, 50, 125, 198, 200, 190, 96, 164, + -348, -741, -854, -357, -163, -103, -26, 143, 231, 318, 335, 325, 274, 233, 167, 190, + -143, -256, -191, -280, -250, -191, -82, 37, 126, 102, 67, -130, -202, -430, -495, -810, + 232, 107, -22, -341, -497, -523, -607, -646, -746, -690, -478, -295, -160, -77, -53, -7, + -33, -98, -258, -501, -589, -438, -316, -168, -58, 82, 175, 219, 249, 259, 237, 226, + -393, -665, -19, 185, 249, 266, 378, 468, 499, 508, 464, 388, 310, 238, 186, 145, + -240, -99, 408, 480, 693, 761, 946, 943, 951, 893, 782, 613, 482, 351, 260, 163, + -23, 523, 885, 903, 1172, 1287, 1482, 1491, 1476, 1402, 1240, 1005, 787, 604, 433, 292, + 262, 988, 904, 732, 734, 665, 715, 656, 673, 615, 541, 372, 284, 139, 68, -84, + -119, 446, 1118, 1215, 1372, 1280, 1208, 989, 881, 675, 557, 319, 227, 23, -39, -256, + -102, 178, 379, 252, 365, 319, 455, 377, 413, 278, 225, -36, -67, -351, -375, -772 +}; + +/* An 16-by-32 matrix in Scale = 2.56f */ +const Word16 GEWB_MA1_fx[512] = +{//Qlog2(2.56) + 269, 268, 416, 287, 157, 7, -132, -276, -482, -701, -1025, -1350, -1642, -982, -321, -49, + 237, 949, 1374, 1228, 1337, 1219, 1123, 1016, 852, 752, 664, 559, 448, 306, 194, 83, + -6, -176, -373, -111, -221, -387, -483, -639, -753, -786, -774, -655, -328, -114, -25, 27, + 135, 164, -4, -181, -364, -528, -464, -424, -393, -314, -242, -185, -104, -61, -32, -37, + 15, -218, -322, 668, 597, 343, 196, -5, -46, -159, -359, -524, -629, -548, -308, -95, + 242, 463, 767, 661, 558, 403, 268, 191, 71, -4, -51, -103, -141, -176, -161, -142, + -179, -147, 715, 865, 970, 932, 822, 763, 602, 514, 436, 370, 285, 189, 106, 36, + -49, -227, -589, -933, -1172, -700, -248, -175, -132, -132, -125, -103, -47, -49, -12, 60, + -7, -227, -404, 272, 83, -50, -165, -319, -343, -501, -731, -939, -1013, -607, -202, -2, + -76, -271, -661, -582, 296, 86, -60, -166, -335, -314, -213, -285, -324, -280, -164, -39, + -264, -452, -111, 171, 229, 357, 355, 461, 509, 517, 489, 441, 347, 246, 158, 75, + 67, -49, -340, -546, -758, -919, -876, -727, -658, -567, -492, -400, -234, -140, -63, 36, + -142, 94, 514, 400, 406, 389, 379, 413, 391, 377, 354, 314, 245, 156, 94, 34, + 97, -47, -316, -620, -874, -179, -206, -290, -304, -514, -690, -723, -503, -252, -73, 39, + 485, 674, 532, 195, 38, -60, 17, 52, 63, 74, 85, 62, 35, -10, -22, -51, + -105, -23, 287, 394, 469, 609, 706, 860, 933, 933, 874, 789, 638, 465, 297, 148, + -223, -499, -837, -813, -391, -231, -178, -182, -81, 2, 84, 113, 131, 142, 127, 107, + -64, 269, 879, 849, 1013, 1157, 1250, 1337, 1263, 1176, 1048, 900, 703, 502, 318, 165, + 61, 1, -198, -209, -345, -417, -280, -280, -307, -272, -341, -418, -604, -738, -887, -394, + 45, 77, 124, 152, 99, 43, 20, -4, -91, -85, -192, -280, -544, -754, -1176, -1296, + 173, 69, -49, -226, -344, -479, -489, -618, -727, -909, -1122, -1446, -1292, -492, -205, 10, + -80, -80, 338, 285, 123, 48, -76, -80, -105, -118, -108, -80, -58, -28, -9, -8, + 74, -79, -292, -618, -756, 345, 216, 180, 143, -73, -186, -223, -200, -143, -52, -21, + -253, -519, -578, -188, -96, -35, -7, 27, 133, 218, 258, 258, 231, 180, 120, 70, + 273, 740, 950, 736, 701, 635, 611, 602, 566, 533, 494, 447, 350, 230, 131, 42, + -100, -345, -702, -352, 709, 682, 485, 324, 161, 112, 148, 25, -88, -106, -86, -101, + 307, 265, 253, 65, -63, -75, -169, -282, -390, -501, -550, -532, -406, -296, -186, -132, + -26, 70, 50, -84, -89, 28, 106, 199, 305, 391, 450, 469, 419, 301, 191, 80, + 22, 39, -154, -426, -597, -497, -159, -69, 41, 95, 114, 114, 99, 33, -7, -40, + -162, -356, -511, -461, -475, -513, -477, -485, -395, -249, -136, -71, -4, 33, 54, 64, + -82, -295, -562, 241, 65, -163, -227, -384, -237, -229, -266, -223, -94, 10, 41, 31, + -104, -323, -302, 733, 646, 418, 271, 149, 155, 154, 119, 99, 89, 63, 13, -16 +}; + +/* An 16-by-32 matrix in Scale = 2.56f */ +const Word16 AUWB2_MA1_fx[512] = +{//Qlog2(2.56) + 391, 298, 179, -37, -225, -387, -627, -864, -1216, -1644, -2108, -804, -277, -5, 121, 468, + 351, 213, 141, -75, -130, -164, -332, -410, -524, -573, -575, -474, -331, -103, -22, 201, + 81, 874, 1137, 1223, 1242, 1262, 1238, 1185, 1141, 1085, 993, 733, 570, 424, 256, 145, + -6, -25, -105, -147, -327, -342, -587, -620, -954, -1143, -1878, -2059, -356, -100, 134, 477, + -197, -505, -826, -1043, -863, -485, -296, -103, -6, 178, 269, 245, 231, 320, 243, 413, + -518, -605, 282, 430, 532, 596, 676, 748, 808, 861, 834, 681, 534, 498, 293, 337, + -244, -563, -720, -599, -500, -494, -627, -739, -1028, -1219, -297, 9, 71, 272, 285, 563, + -448, -854, -916, -518, -287, -52, 56, 245, 347, 524, 557, 497, 416, 452, 321, 437, + 150, 113, 28, -26, 1, -80, -177, -226, -193, -156, -62, -227, -240, -383, -535, -809, + -240, -246, -174, -66, 80, 149, 244, 284, 413, 434, 473, 158, 56, -167, -326, -723, + 131, -11, 141, 32, 24, -122, -397, -610, -888, -812, 30, 232, 306, 371, 341, 446, + -158, -545, -529, 151, 142, -101, -426, -716, -1031, -1479, -1550, -352, -132, 145, 187, 517, + 148, -104, -445, -841, -31, 183, -86, -316, -615, -660, -231, 84, 192, 275, 201, 311, + -183, -220, -243, -182, -237, -176, -266, -233, -336, -339, -650, -1019, -1652, -846, -52, 387, + -104, -117, -254, -332, -191, 1, 64, 182, 317, 495, 626, 574, 519, 508, 456, 505, + -151, -237, 492, 479, 273, 139, 36, -60, -119, 74, 174, 188, 298, 366, 347, 478, + 158, 23, -210, -450, -673, -637, -423, -331, -133, 14, 128, 69, 62, 143, 171, 313, + 501, 394, 37, -57, 67, 70, 46, 35, 92, 120, 337, 258, 276, 283, 368, 500, + 42, -157, -398, -600, -742, -780, -781, -980, -1166, -1629, -968, -149, -99, 188, 209, 529, + -240, 190, 465, 543, 575, 565, 605, 596, 653, 599, 583, 279, 203, -51, -186, -589, + 316, 371, 417, 372, 293, 189, 230, 154, 184, 91, 94, -175, -198, -358, -454, -736, + 72, -159, -362, -499, -633, -690, -794, -739, -662, -456, -360, -338, -251, -6, 50, 346, + -202, -332, -428, -462, -508, -440, -552, -647, -885, -1217, -1733, -619, -162, 95, 202, 510, + -91, -391, -709, -884, -1012, -1001, -936, -714, -509, -198, 42, 99, 119, 261, 238, 496, + -370, 92, 476, 604, 681, 762, 826, 893, 934, 1001, 954, 783, 629, 590, 412, 467, + -193, -22, -28, 46, 214, 387, 502, 643, 728, 864, 859, 723, 581, 569, 435, 483, + 223, 291, 633, 508, 350, 141, -156, -476, -930, -1417, -1809, -764, -206, 77, 191, 515, + -475, -791, -417, 75, 201, 343, 408, 549, 612, 707, 686, 572, 463, 457, 321, 373, + 842, 716, 669, 593, 419, 423, 373, 321, 273, 280, 354, 217, 193, 232, 175, 294, + 116, -60, -144, -299, -421, -551, -732, -952, -1203, -1662, -1996, -537, -240, 55, 138, 486, + -323, -665, -686, -214, -201, -260, -373, -329, -333, -165, 66, 96, 175, 310, 291, 486, + -19, 43, 35, 40, 42, 55, 63, 101, 133, 194, 222, 152, 117, 145, 133, 213 +}; + +const Word16 *const Quantizers_fx[] = { SVNB_SN1_fx, SVNB_SN2_fx, GETRNB_SN1_fx, GETRNB_SN2_fx, AUNB_SN1_fx,SVWB_SN1_fx, SVWB_SN2_fx, GETRWB_SN1_fx, + GETRWB_SN2_fx, AUWB_SN1_fx,/* U13, */ + TRWB2_SN1_fx, TRWB2_SN2_fx, AUWB2_SN1_fx, CNG_SN1_fx, SVWB2_SN1_fx, SVWB2_SN2_fx +};//Qlog2(2.56) + +const Word16 *const Quantizers_p_fx[] = { IAA_MA1_fx, UVD_MA1_fx, UVD_MA2_fx, UVWB_MA3_fx, GESVNB_AR1_fx, GESVNB_AR2_fx, GESVWB_AR1_fx, GESVWB_AR2_fx, + GEWB2_MA1_fx,GEWB_MA1_fx, AUWB2_MA1_fx, SVWB2_AR1_fx, SVWB2_AR2_fx +};//Qlog2(2.56) + +const Word16 vals_fx[NO_LEADERS][MAX_NO_VALS] = /*Q1 */ +{ + {2, 0, 0, 0}, + {1, 0, 0, 0}, + {2, 0, 0, 0}, + {4, 0, 0, 0}, + {3, 1, 0, 0}, + {2, 0, 0, 0}, + {4, 2, 0, 0}, + {3, 1, 0, 0}, + {2, 0, 0, 0}, + {4, 2, 0, 0}, + {4, 0, 0, 0}, + {3, 1, 0, 0}, + {5, 1, 0, 0}, + {4, 2, 0, 0}, + {4, 2, 0, 0}, + {6, 2, 0, 0}, + {3, 1, 0, 0}, + {5, 3, 1, 0}, + {4, 2, 0, 0}, + {4, 0, 0, 0}, + {6, 2, 0, 0}, + {3, 1, 0, 0}, + {5, 3, 1, 0}, + {4, 2, 0, 0}, + {4, 2, 0, 0}, + {6, 2, 0, 0}, + {6, 4, 2, 0}, + {3, 1, 0, 0}, + {5, 3, 1, 0}, + {5, 1, 0, 0}, + {7, 1, 0, 0}, + {4, 2, 0, 0}, + {4, 0, 0, 0}, + {6, 2, 0, 0}, + {6, 4, 2, 0}, + {8, 0, 0, 0}, + {3, 1, 0, 0}, + {5, 3, 1, 0}, + {5, 3, 1, 0}, + {7, 3, 1, 0}, + {4, 2, 0, 0}, + {6, 4, 2, 0}, + {6, 4, 2, 0}, + {6, 0, 0, 0}, + {8, 2, 0, 0}, + {3, 0, 0, 0}, + {5, 3, 1, 0}, + {5, 3, 1, 0}, + {7, 3, 1, 0}, +}; + +const Word16 no_vals[NO_LEADERS]= {2,1,2,2,2,2,3,2,1,3,2,2,2,3,3,3,2,3,3,2,3,2,3,2,3,3,4,2,3,2,2,3,2,2,4,2,2,3,3,3,3,4,4,2,3,1,3,3,3}; // Q0 + +const Word16 no_vals_ind[NO_LEADERS][MAX_NO_VALS]= +{ + {2,6,0,0}, + {8,0,0,0}, + {4,4,0,0}, + {1,7,0,0}, + {1,7,0,0}, + {6,2,0,0}, + {1,2,5,0}, + {2,6,0,0}, + {8,0,0,0}, + {1,4,3,0}, + {2,6,0,0}, + {3,5,0,0}, + {1,7,0,0}, + {1,6,1,0}, + {2,2,4,0}, + {1,1,6,0}, + {4,4,0,0}, + {1,1,6,0}, + {2,4,2,0}, + {3,5,0,0}, + {1,3,4,0}, + {5,3,0,0}, + {1,2,5,0}, + {2,6,0,0}, + {3,2,3,0}, + {1,5,2,0}, + {1,1,1,5}, + {6,2,0,0}, + {1,3,4,0}, + {2,6,0,0}, + {1,7,0,0}, + {3,4,1,0}, + {4,4,0,0}, + {1,7,0,0}, + {1,1,3,3}, + {1,7,0,0}, + {7,1,0,0}, + {1,4,3,0}, + {2,1,5,0}, + {1,1,6,0}, + {4,2,2,0}, + {1,1,5,1}, + {1,2,1,4}, + {2,6,0,0}, + {1,2,5,0}, + {8,0,0,0}, + {1,5,2,0}, + {2,2,4,0}, + {1,2,5,0} +}; // Q0 + + +const Word16 C_VQ[LATTICE_DIM+1][LATTICE_DIM+1] = +{ + {1,0,0,0,0,0,0,0,0}, + {1,1,0,0,0,0,0,0,0}, + {1,2,1,0,0,0,0,0,0}, + {1,3,3,1,0,0,0,0,0}, + {1,4,6,4,1,0,0,0,0}, + {1,5,10,10,5,1,0,0,0}, + {1,6,15,20,15,6,1,0,0}, + {1,7,21,35,35,21,7,1,0}, + {1,8,28,56,70,56,28,8,1} +}; + +const Word16 C_VQ_fx[LATTICE_DIM + 1][LATTICE_DIM + 1] = +{ + {1,0,0,0,0,0,0,0,0}, + {1,1,0,0,0,0,0,0,0}, + {1,2,1,0,0,0,0,0,0}, + {1,3,3,1,0,0,0,0,0}, + {1,4,6,4,1,0,0,0,0}, + {1,5,10,10,5,1,0,0,0}, + {1,6,15,20,15,6,1,0,0}, + {1,7,21,35,35,21,7,1,0}, + {1,8,28,56,70,56,28,8,1} +}; // Q0 + +const UWord32 table_no_cv[] = //Q0 +{ + 0, 112, 240, 1360, 1376, 2400, 4192, 5536, 9120, 9376, 18336, 18448, 25616, 26640, 33808, 40528, 40752, + 49712, 56880, 83760, 84208, 88688, 95856, 117360, 124528, 142448, 153200, 155888, 159472, 195312, 198896, 199920, 235760, 236880, + 238928, 274768, 274784, 275808, 311648, 333152, 340320, 367200, 410208, 423648, 423760, 425104, 425232, 446736, 500496, 522000, 0 +}; +//Q0 +const Word32 table_no_cv_fx[] = { 0, 112, 240, 1360, 1376, 2400, 4192, 5536, 9120, 9376, 18336, 18448, 25616, 26640, 33808, 40528, 40752, + 49712, 56880, 83760, 84208, 88688, 95856, 117360, 124528, 142448, 153200, 155888, 159472, 195312, 198896, 199920, + 235760, 236880, 238928, 274768, 274784, 275808, 311648, 333152, 340320, 367200, 410208, 423648,423760, 425104, 425232, 446736, 500496, 522000 + ,0 +}; // Q0 + + +const Word16 pi0[] = +{ + 28,1,70,8,8,28,168,28,1,280,28,56,8,56,420,56, 70, 56,420, 56, 280, 56, 168, 28, 560, 168,336,28,280,28,8, + 280,70, 8, 1120, 8, 8, 280, 168, 56, 420, 336, 840, 28, 168, 1, 168, 420, 168 +}; // Q0 + +const Word16 pl_HQ_fx[] = /* Q1 vectors in first layers */ +{ + 2, 2, 0, 0, 0, 0, 0, 0, /* 112, 4, 28 */ + 1, 1, 1, 1, 1, 1, 1, 1, /* 128, 128, 1 */ + 2, 2, 2, 2, 0, 0, 0, 0, /* 1120, 16, 70 */ + 4, 0, 0, 0, 0, 0, 0, 0, /* 16 , 2, 8 */ + 3, 1, 1, 1, 1, 1, 1, 1, /* 5 */ /* 1024,128, 8 */ + 2, 2, 2, 2, 2, 2, 0, 0, /* 1792, 64, 28 */ + 4, 2, 2, 0, 0, 0, 0, 0, /* 1344, 8, 168 */ + 3, 3, 1, 1, 1, 1, 1, 1, /* 3584, 128, 28*/ + 2, 2, 2, 2, 2, 2, 2, 2, /*256, 256, 1*/ + 4, 2, 2, 2, 2, 0, 0, 0, /* 10 */ /* 8960, 32, 280 */ + 4, 4, 0, 0, 0, 0, 0, 0, /* 112, 4, 28 */ + 3, 3, 3, 1, 1, 1, 1, 1, /* 7168, 128, 56 */ + 5, 1, 1, 1, 1, 1, 1, 1, /* 1024, 128, 8*/ + 4, 2, 2, 2, 2, 2, 2, 0, /* 7168, 128, 56*/ + 4, 4, 2, 2, 0, 0, 0, 0, /* 15 */ /* 6720, 16, 420 */ + 6, 2, 0, 0, 0, 0, 0, 0, /* 224, 4, 56 */ + 3, 3, 3, 3, 1, 1, 1, 1, /* 8960, 128, 70 */ + 5, 3, 1, 1, 1, 1, 1, 1, /* 7168, 128, 56*/ + 4, 4, 2, 2, 2, 2, 0, 0, /* 26880, 64, 420 */ + 4, 4, 4, 0, 0, 0, 0, 0, /*20 */ /* 448, 8, 56 */ + 6, 2, 2, 2, 0, 0, 0, 0, /* 4480, 16, 280 */ + 3, 3, 3, 3, 3, 1, 1, 1, /* 7168, 128, 56 */ + 5, 3, 3, 1, 1, 1, 1, 1, /* 21504, 128, 168 */ + 4, 4, 2, 2, 2, 2, 2, 2, /* 7168, 256, 28 */ + 4, 4, 4, 2, 2, 0, 0, 0, /* 25 */ /* 17920, 32, 560 */ + 6, 2, 2, 2, 2, 2, 0, 0, /* 10752, 64, 168 */ + 6, 4, 2, 0, 0, 0, 0, 0, /* 2688, 8, 336 */ + 3, 3, 3, 3, 3, 3, 1, 1, /* 3584, 128, 28 */ + 5, 3, 3, 3, 1, 1, 1, 1, /* 35840,128,280*/ + 5, 5, 1, 1, 1, 1, 1, 1, /*30 */ /* 3584, 128, 28*/ + 7, 1, 1, 1, 1, 1, 1, 1, /* 1024,128, 8 */ + 4, 4, 4, 2, 2, 2, 2, 0, + 4, 4, 4, 4, 0, 0, 0, 0, + 6, 2, 2, 2, 2, 2, 2, 2, + 6, 4, 2, 2, 2, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 1, + 5, 3, 3, 3, 3, 1, 1, 1, + 5, 5, 3, 1, 1, 1, 1, 1, + 7, 3, 1, 1, 1, 1, 1, 1, + 4, 4, 4, 4, 2, 2, 0, 0, + 6, 4, 2, 2, 2, 2, 2, 0, + 6, 4, 4, 2, 0, 0, 0, 0, + 6, 6, 0, 0, 0, 0, 0, 0, + 8, 2, 2, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, + 5, 3, 3, 3, 3, 3, 1, 1, + 5, 5, 3, 3, 1, 1, 1, 1, + 7, 3, 3, 1, 1, 1, 1, 1 +}; +/*----------------------------------------------------------------------------------* + * LSF quantization for CNG + *----------------------------------------------------------------------------------*/ + +const Word16 cng_sort[] = {/*5f */1,1,0,1,0,0, /* 4f */0,1,0,1,0,0,1,1,1,1}; // Q0 + + +const Word16 perm_MSLVQ[][4] = +{ + /* 5f*/ + {6,11,7,15}, + {6,15,-1,0}, + {5,8,7,15}, + {7,10,-1,0}, + {-1,0,0,0}, + {-1,0,0,0}, + /* 4f */ + {-1,0,0,0}, + {0,9,7,10}, + {-1,0,0,0}, + {7,15,-1,0}, + {-1,0,0,0}, + {-1,0,0,0}, + {6,10,7,11}, + {6,11,7,12}, + {6,11,7,12}, + {6,11,7,12} +}; // Q0 + +const Word16 pl_par[] = /* 1 if even number of signs */ +{ + 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, + 0, -1, 1, 0, 0, 0, 1, -1, 0, 0, + 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, + 0, 0, 0, 0, -1, 1, -1, 1, 0, 0, 0, 0, 0, 1, -1, 1, -1 +}; // Q0 + +const Word16 scales_fx[][6] =//Q11 +{ + {3129, 0, 0, 3138, 0, 0, }, /* 14 */ + {3287, 0, 0, 3138, 0, 0, }, /* 15 */ + {2611, 5034, 0, 3138, 0, 0, }, + {2611, 5034, 0, 3340, 0, 0, }, + {2165, 3674, 5931, 2363, 3809, 6281, }, + {1898, 2986, 4745, 2116, 3668, 7045, }, /* 28 */ /* mode 0 UV WB*/ + {2630, 5480, 0, 2972, 0, 0, }, + {2802, 0, 0, 2869, 5073, 0, }, + {1763, 2546, 3723, 2515, 4559, 21109, }, + {2195, 3961, 7440, 2501, 6017, 21961, }, + {1841, 2902, 1386, 2116, 3762, 22309, }, + {1700, 2710, 1288, 1866, 3246, 20660, }, /* 32 */ /* mode 1 UV NB*/ + + + {3222, 0, 0, 3391, 0, 0, }, + {2537, 4923, 0, 3187, 0, 0, }, + {2161, 3482, 9091, 3391, 0, 0, }, + {2560, 4923, 8462, 2775, 4835, 0, }, + {2163, 3656, 9263, 2699, 5296, 0, }, + {2040, 3082, 6871, 2427, 3637, 5587, }, + {1903, 2841, 6875, 2212, 3484, 5908, }, + {1888, 3058, 6900, 2212, 3484, 5908, }, + {1888, 3058, 6900, 2183, 3469, 6420, }, + {1888, 3058, 6900, 1970, 3174, 8081, }, + {1528, 2269, 5876, 1964, 3033, 8002, }, + {1577, 2445, 5782, 1858, 2871, 4334, }, + + {1532, 2259, 5870, 2421, 1661, 6824, }, /* 34 */ + + {1386, 1972, 4356, 1487, 2216, 4514, }, /* 37 */ /* mode 2 V WB*/ + {3357, 0, 0, 2494, 4426, 0, }, + {2634, 5009, 0, 2888, 0, 0, }, + {2224, 3539, 7696, 2494, 4426, 0, }, + {2120, 3226, 9861, 2494, 4426, 0, }, + {1974, 3140, 10121, 2494, 4426, 0, }, + {1722, 2454, 4059, 2494, 4426, 0, }, + {1839, 2658, 4473, 2490, 5456, 0, }, + {1722, 2533, 4581, 2038, 3394, 5808, }, + + {1427, 2009, 4184, 1915, 3082, 1350, }, + {1370, 1862, 2720, 2017, 1339, 3914, }, /* 37 */ /* mode 3 V NB */ + + {2482, 3885, 0, 0, 0, 0, }, + {3346, 0, 0, 3418, 0, 0, }, + {2638, 4962, 0, 3418, 0, 0, }, + {2482, 3885, 0, 3418, 0, 0, }, + {2218, 3617, 6502, 3418, 0, 0, }, + {2124, 3295, 8659, 3418, 0, 0, }, + {2243, 3398, 5562, 2693, 5132, 0, }, + {1927, 2839, 4549, 2693, 5132, 0, }, + {1860, 2675, 3893, 2703, 5372, 0, }, + {2202, 3619, 1618, 2703, 5372, 0, }, + {2093, 3135, 1554, 2273, 3594, 5313, }, + {2202, 3619, 1618, 2238, 3895, 6173, }, + {1829, 3015, 1382, 2259, 3625, 5820, }, + {1864, 3170, 1403, 2114, 3381, 5147, }, + {1692, 2572, 1294, 2009, 3158, 4540, }, /* 32 (31.995) */ /* G WB*/ + {2425, 3707, 5655, 0, 0, 0, }, + {3299, 0, 0, 3314, 0, 0, }, + {2425, 3707, 5655, 3174, 0, 0, }, + {2425, 3707, 5655, 3314, 0, 0, }, + {2177, 3557, 6113, 3314, 0, 0, }, + {2208, 3738, 6476, 3009, 4606, 0, }, + {2816, 1874, 4264, 3009, 4606, 0, }, + {1966, 2914, 1434, 2683, 4366, 0, }, + {2302, 1626, 3895, 2628, 4714, 0, }, + {2206, 3537, 1571, 2560, 3996, 6105, }, + {1911, 3013, 1403, 2560, 3996, 6105, }, + {1898, 3277, 1380, 2363, 3637, 5845, }, + {2144, 1479, 3656, 2163, 3363, 5532, }, + {1989, 1409, 3090, 2136, 3543, 6003, }, + {1882, 1356, 2800, 2165, 3703, 6285, }, /* 32 (31.987) */ /* G NB*/ + {3312, 0, 0, 3394, 0, 0, }, + {2611, 4706, 0, 3201, 0, 0, }, + {2679, 4821, 0, 2841, 0, 0, }, + {2644, 4952, 0, 2775, 5003, 0, }, + {2210, 3623, 6169, 2841, 0, 0, }, + {2210, 3623, 6169, 2714, 5233, 0, }, + {1837, 2744, 5333, 2191, 3459, 5175, }, + {1837, 2744, 5333, 1923, 2978, 4266, }, + {1853, 2718, 5323, 2271, 1591, 3492, }, + {1561, 2255, 4831, 1923, 2978, 4266, }, + {1626, 2511, 6513, 2271, 1591, 3492, }, /* 33 */ + /* mode 6 T WB */ + {3336, 0, 0, 2439, 4528, 0, }, + {2615, 5237, 0, 2800, 0, 0, }, + {2216, 3607, 8047, 2439, 4528, 0, }, + {2085, 3144, 5751, 2439, 4528, 0, }, + {1933, 3025, 5659, 2439, 4528, 0, }, + {1864, 3572, 6793, 2439, 4528, 0, }, + {1884, 3375, 6283, 1985, 3447, 8096, }, + {1513, 2275, 5517, 1800, 2890, 4721, }, + {1452, 2114, 5564, 1659, 2550, 3736, }, /* 32 */ /* mode 7 T NB */ + + {1552, 2286, 4022, 2497, 4139, 1634,}, + {1432, 2118, 4051, 2497, 4139, 1634, }, /* 32 */ /* mode 8 G 16k */ + + {1487, 2150, 3779, 2775, 1761, 4516, }, + {1386, 2042, 3418, 2775, 1761, 4516, }, /* 33 (32.983) */ /* T 16k */ + + {3371, 0, 0, 2568, 5036, 0, }, + {2198, 3815, 6617, 3437, 0, 0, }, + {2198, 3815, 6617, 2568, 5036, 0, }, + {1948, 3056, 5112, 2570, 6085, 0, }, + {2351, 3770, 1665, 2570, 6085, 0, }, /* 26 */ + {1233, 1780, 2904, 2589, 1565, 4542, }, /* 36 */ /* mode 10 AUDIO_WB 36 + 4 + 1 */ + + {1747, 3623, 9062, 0, 0, 0, }, + {2071, 3406, 9017, 3232, 0, 0, }, + {2071, 3406, 9017, 2462, 4964, 0, }, + {1804, 3314, 8471, 2462, 4964, 0, }, + {1735, 3668, 9146, 2462, 4964, 0, }, /* 27 */ /* AUDIO_NB */ + {1372, 2277, 4893, 2462, 4964, 0, }, /* 28 */ /* AUDIO_NB */ + {2316, 3717, 1630, 2591, 5722, 0, }, + {1167, 1647, 2451, 2380, 3992, 1491, }, /* 36 */ /* mode 12 AUDIO_WB 16k 15-36 + 4 + 1*/ + {2140, 3248, 7688, 3418, 0, 0, }, + {1802, 2621, 5784, 2251, 3553, 0, }, + {1702, 2488, 5994, 2230, 3498, 5077, }, + {1782, 2718, 5951, 2183, 3521, 5480, }, + + {1581, 2298, 4815, 2961, 1933, 4243, }, + + {1436, 2001, 3559, 1939, 2976, 4264, }, + + {1473, 2091, 3484, 2292, 1626, 3473, }, + + {1311, 1810, 3547, 1546, 2232, 3170, }, /* 37 (36.995) */ /* VOICED 16k */ + {2494, 1630, 4676, 2642, 6810, 0, }, + {3256, 1710, 9085, 2247, 6287, 0, }, + + {2036, 5360, 0, 2234, 4573, 7080, }, + {1817, 3222, 7256, 2228, 3742, 6281, }, + {1714, 2535, 3897, 2658, 5728, 0, }, + {2331, 5788, 0, 2265, 5726, 8993, }, + {1927, 3955, 9161, 1395, 2593, 4768, }, + {2769, 8872, 0, 1679, 3164, 8550, }, + {2750, 7387, 0, 1759, 2976, 5304, }, + {2474, 5612, 0, 1554, 2540, 4469, }, + {2300, 5603, 0, 1790, 3068, 5296, }, + {1882, 5061, 0, 1260, 2195, 4293, }, + {3170, 9232, 0, 1690, 4461, 8817, }, + {2492, 5935, 0, 1509, 2492, 3953, }, + + {1999, 4485, 11706, 3084, 1315, 8624, }, + {2267, 5315, 0, 2666, 1237, 1802}, /* CNG */ + +};/* An 6-by-146 matrix in Scale = 2048.00f */ + +const Word16 scales_p_fx[][6] = +{//Q11 + {2998, 4862, 0, 0, 0, 0, }, + {2591, 5251, 0, 3355, 0, 0, }, + {2177, 3488, 5745, 2650, 4819, 0, }, + {2177, 3926, 6273, 2796, 0, 0, }, + {1872, 2892, 4553, 2650, 4819, 0, }, + {1806, 2869, 4919, 2689, 4999, 0, }, + {2777, 1776, 4868, 2191, 3453, 5214, }, + {1733, 2761, 5214, 2204, 3568, 5444, }, + {1731, 2824, 5255, 2087, 3230, 5003, }, + {1548, 2435, 5732, 2220, 3695, 5648, }, + {1546, 2494, 5777, 1933, 2935, 4041, }, + {1483, 2529, 6025, 2570, 1737, 4096, }, + {1407, 2279, 4788, 1747, 2720, 3981, }, + {1327, 2107, 3760, 1749, 2777, 4016, }, + {1327, 2107, 3760, 1407, 2167, 3891, }, /* 39 (38.488) */ /* V WB*/ /* 14 */ + {3303, 0, 0, 0, 0, 0, }, + {2595, 5069, 0, 3316, 0, 0, }, + {2077, 3338, 5046, 2632, 4405, 0, }, + {1829, 2847, 4739, 3000, 4708, 0, }, + {1905, 2869, 4403, 2621, 4616, 0, }, + {1829, 2847, 4739, 2613, 4518, 6111, }, + {1829, 2847, 4739, 2122, 3371, 5061, }, + {1755, 2738, 5046, 2136, 3543, 5376, }, + {1567, 2497, 3181, 2122, 3371, 5061, }, + {1616, 2720, 3383, 2154, 3654, 5542, }, + {1565, 2507, 3185, 1884, 2955, 4168, }, + {1358, 2173, 2535, 2824, 1839, 3996, }, + {1378, 2261, 2675, 2578, 1696, 4002, }, + {1364, 2193, 2558, 1645, 2542, 3541, }, + {1348, 2128, 2486, 1946, 1333, 2927, }, /* 39 (38.512) */ /* V NB*/ /* 29 */ + {3277, 0, 0, 3181, 0, 0, }, + {2322, 4067, 6748, 3181, 0, 0, }, + {2021, 3662, 5446, 3373, 0, 0, }, + {1841, 3281, 5282, 3373, 0, 0, }, + {1632, 2650, 4383, 3373, 0, 0, }, + {1632, 2650, 4383, 2734, 4557, 0, }, + {1518, 2357, 3719, 2734, 4557, 0, }, + {1632, 2650, 4383, 2429, 3957, 0, }, + {1518, 2357, 3719, 2384, 3734, 5671, }, + {1450, 2306, 4000, 2204, 3543, 5687, }, + {1352, 2148, 3217, 2204, 3543, 5687, }, + {1356, 2101, 3183, 2200, 3918, 6189, }, + {1352, 2148, 3217, 2947, 1896, 4364, }, + {1290, 1978, 3117, 2687, 1804, 4520, }, + {1264, 1886, 2963, 2114, 3172, 1548, }, /* 35 (34.994) */ /* G WB*/ /* 44 */ + {3267, 0, 0, 3076, 0, 0, }, + {2300, 3985, 7643, 3076, 0, 0, }, + {2116, 4250, 8886, 2906, 5009, 0, }, + {2017, 3672, 12216, 2623, 4760, 0, }, + {1804, 3289, 14326, 2906, 5009, 0, }, + {1729, 3240, 14377, 2623, 4760, 0, }, + {1616, 3113, 14752, 2623, 4760, 0, }, + {1780, 3168, 14326, 2109, 3592, 6353, }, + {1673, 3056, 14582, 2109, 3592, 6353, }, + {1546, 2830, 14608, 2109, 3592, 6353, }, + {1446, 2693, 14797, 2109, 3592, 6353, }, + {1411, 2654, 14930, 2081, 3840, 6633, }, + {1430, 2611, 14764, 1872, 3170, 4983, }, + {1391, 2693, 14930, 2517, 3779, 1665, }, + {1391, 2693, 14930, 2433, 1581, 4004, }, /* 35 (34.952) */ /* G NB*/ /* 59 */ + + {2070, 3639, 5652, 3305, 0,0,}, + {1747, 2830, 4231, 2550, 5487, 0,}, + {2472, 1593, 4522, 2550, 5487, 0,}, + {2472, 1593, 4522, 2075, 3752, 6253}, + {2472, 1593, 4522, 2908, 1786, 4772,}, + {1075, 1577, 2198, 1669, 2533, 1161}, /* 40 (39.990) */ /* AUDIO_WB */ /* 65 */ + + {2191, 3668, 7993, 3275, 0, 0, }, + {1679, 2492, 4278, 2570, 4690, 0, }, + {1597, 2394, 5110, 2570, 4690, 0, }, + {2202, 1481, 4835, 2273, 4016, 7150, }, + + {1415, 2107, 4786, 2118, 3668, 8200, }, /* 31 */ /*AUDIO_NB */ /* 70 */ + {1374, 2204, 5337, 1956, 3168, 5149, }, /* 32 */ /*AUDIO_NB */ /* 71 */ + {2425, 4336, 1589,3420, 2165, 1380, }, + {1067, 1530, 2116, 1630, 2730, 1110,}, /* 40 */ /* mode AUDIO_WB 16k */ /* 73*/ + + {3439, 0, 0, 2626, 5061, 0, }, + {2228, 3787, 6543, 3455, 0, 0, }, + {2228, 3787, 6543, 2626, 5061, 0, }, + {2306, 3459, 1618, 2626, 5061, 0, }, + {1905, 2830, 1397, 2626, 5061, 0, }, + {2284, 1626, 3793, 2623, 6212, 0, }, + {1720, 2818, 1276, 1638, 2900, 8724, }, /* 36 (35.998) */ /* INACTIVE NB */ + {1640, 2351, 3690, 0, 0, 0, }, + {2230, 3711, 6496, 3434, 0, 0, }, + {2230, 3899, 6597, 3115, 5396, 0, }, + {1731, 2482, 3961, 2689, 4954, 0, }, + {1595, 2243, 3482, 2689, 4954, 0, }, + {1481, 2079, 3408, 2689, 4954, 0, }, + {1829, 1335, 2945, 2204, 1475, 3674, }, /* 36 (35.929) */ /* INACTIVE WB*/ + {2783, 4723, 0, 3418, 0, 0, }, + {2206, 3946, 7262, 3418, 0, 0, }, + {2206, 4162, 7328, 2927, 5552, 0, }, + {1706, 2566, 4311, 2628, 5235, 0, }, + {1589, 2359, 3805, 2628, 5235, 0, }, + {1473, 2183, 3547, 2628, 5235, 0, }, + {1927, 1333, 3205, 1479, 2437, 3973, }, /* 36 (35.915) */ /* INACTIVE 16k*/ + + {2646, 5077, 0, 3156, 0, 0, }, + {2462, 3897, 0, 3156, 0, 0, }, + {2105, 3361, 5028, 3375, 0, 0, }, + {2554, 1798, 4770, 3375, 0, 0, }, + {1767, 2781, 5165, 3375, 0, 0, }, + {1673, 2503, 4116, 2200, 3656, 5597, }, + {1669, 1253, 2623, 2161, 3531, 6046, }, /* 32 (31.990) */ /* UNVOICED NB*/ + + {3164, 0, 0, 3170, 0, 0, }, + {3359, 0, 0, 3170, 0, 0, }, + {2636, 5630, 0, 3170, 0, 0, }, + {2636, 5630, 0, 3387, 0, 0, }, + {2437, 4149, 0, 3387, 0, 0, }, + {1907, 2986, 5018, 2650, 5616, 0, }, + {1796, 2859, 5605, 2214, 3719, 6881, }, /* 28 (27.996) */ /* UNVOICED WB */ + {2316, 3351, 0, 2808, 0, 0, }, + {1913, 2615, 1491, 2370, 3475, 0, }, + {1706, 2380, 1348, 2357, 3455, 0, }, + {1538, 2114, 1225, 2357, 3455, 0, }, + {1452, 2058, 1167, 2171, 3629, 5569, }, + {1528, 2050, 1231, 2056, 3693, 5923, }, + {1522, 2048, 1227, 1917, 3811, 5886, }, + {1587, 1257, 2124, 1630, 2671, 3901, }, /* 39 (38.301) */ /* VOICED 16k */ + {1831, 2742, 5220, 2679, 5327, 0, }, + {1475, 2073, 3273, 3097, 1896, 4377, }, + {1395, 1993, 3377, 2828, 1794, 4360, }, + {1401, 1974, 3359, 2392, 3637, 1612, }, + {1368, 1915, 3176, 2081, 3109, 1458, }, + {1350, 1866, 2918, 2738, 1821, 1315, }, + {1350, 1866, 2918, 1718, 2636, 1243, }, /* 37 (36.989) */ /* GENERIC 16k*/ + {3344, 0, 0, 3455, 0, 0, }, + {2204, 3666, 6025, 3455, 0, 0, }, + {1708, 2517, 3871, 3455, 0, 0, }, + {1921, 2875, 4409, 2675, 5386, 0, }, + {2744, 1815, 4751, 2675, 5386, 0, }, + {1706, 2560, 3908, 2675, 5386, 0, }, + {1706, 2484, 3836, 2304, 3766, 5773, }, + {1567, 2380, 3461, 2097, 3559, 5812, }, + {1485, 2150, 3668, 3031, 1888, 6357, }, + {1458, 2073, 3172, 3060, 1849, 6889, }, + {1350, 1898, 2779, 3060, 1849, 6889, }, + {1683, 1257, 2638, 1864, 3090, 4618, }, + {1722, 1278, 2617, 2378, 1561, 3703, }, + {1716, 1274, 2593, 2212, 1456, 3502, }, + {1704, 1268, 2611, 1921, 2929, 1319, }, /* 37 (36.971) */ /* GENERIC 12.8k MA*/ + {1810, 2763, 5263, 2691, 5343, 0, }, + {1456, 2085, 3308, 3035, 1886, 7027, }, + + {1391, 1995, 3398, 1942, 3172, 7062, }, + + {1702, 1266, 3033, 1911, 3101, 4731, }, + {1671, 1249, 2871, 2920, 1796, 4639, }, + {1612, 2574, 1221, 1759, 2963, 4979, }, + {1612, 2574, 1221, 2265, 1505, 3398}, /* 37 (36.993) */ /* AUDIO 16k */ + +}; + +const Word16 sigma_MSLVQ_fx[][16] = +{//Qlog2(2.56) + {3}, + {3}, + {107, 113, 160, 185, 202, 211, 219, 222, 222, 217, 218, 270, 327, 176, 66, 43}, + {125, 130, 182, 185, 191, 199, 204, 207, 205, 191, 179, 227, 305, 261, 95, 64}, + {123, 123, 176, 197, 207, 218, 228, 235, 232, 218, 209, 272, 342, 216, 89, 68}, + {219, 212, 255, 271, 273, 274, 260, 255, 250, 248, 249, 302, 328, 394, 85, 37}, + {3}, + {3}, + {113, 134, 220, 253, 260, 275, 274, 287, 304, 323, 321, 325, 349, 350, 376, 332}, + {158, 179, 242, 248, 246, 259, 257, 267, 278, 274, 276, 289, 309, 309, 312, 306}, + {146, 146, 222, 256, 261, 278, 290, 302, 318, 313, 323, 352, 394, 407, 415, 399}, + {217, 227, 287, 303, 316, 310, 296, 304, 303, 305, 317, 327, 355, 321, 305, 279}, + {3}, + {3}, + {193, 216, 283, 320, 343, 359, 375, 408, 413, 445, 479, 489, 502, 466, 456, 479}, + {230, 238, 312, 330, 334, 329, 339, 357, 353, 358, 391, 403, 441, 459, 379, 497}, + {231, 277, 304, 322, 347, 353, 366, 372, 373, 397, 438, 451, 424, 413, 381, 447}, + {264, 287, 364, 386, 384, 373, 382, 373, 393, 403, 448, 438, 403, 430, 401, 586}, + {224, 298, 262, 264, 258, 244, 260, 283, 313, 295, 275, 279, 260, 286, 286, 399}, + {411, 314, 301, 332, 335, 343, 356, 409, 430, 413, 363, 364, 338, 332, 315, 412}, + {136, 269, 343, 367, 405, 430, 411, 421, 444, 466, 435, 423, 328, 247, 235, 240}, + {178, 433, 305, 268, 258, 252, 253, 246, 250, 250, 245, 256, 242, 273, 300, 371}, + {349, 334, 335, 341, 336, 331, 343, 425, 505, 722, 783, 655,1006, 862, 346, 248}, + {315, 306, 323, 306, 300, 278, 276, 287, 380, 394, 327, 333, 339, 382, 370, 626}, + {236, 250, 241, 231, 241, 245, 238, 221, 215, 190, 181, 178, 183, 428, 184, 55}, + {113, 189, 360, 312, 332, 326, 296, 268, 272, 282, 320, 275, 219, 203, 179, 143}, + {273, 255, 245, 237, 242, 236, 214, 217, 223, 260, 233, 193, 187, 183, 174, 163}, + {111, 321, 275, 219, 213, 207, 202, 205, 205, 225, 239, 208, 192, 187, 168, 152}, + {383, 326, 300, 287, 290, 292, 276, 251, 258, 291, 430, 521, 397, 305, 274, 269}, + {152, 221, 271, 291, 344, 310, 308, 257, 252, 256, 339, 491, 499, 199, 179, 107}, + {226, 237, 236, 239, 250, 238, 228, 223, 227, 241, 311, 312, 299, 313, 421, 360}, + {221, 238, 214, 220, 246, 244, 232, 221, 210, 208, 200, 229, 368, 431, 106, 71}, + {249, 259, 267, 283, 278, 275, 251, 237, 203, 209, 198, 279, 543, 509, 122, 90}, + {192, 249, 256, 235, 231, 230, 213, 215, 210, 247, 284, 237, 214, 210, 199, 181}, +}; + +/* An 16-by-33 matrix in Scale = 32768.00f */ +const Word16 inv_sigma_MSLVQ_fx[][16] =//Q15 +{ + {32767}, + {32767}, + {783, 746, 523, 453, 416, 397, 384, 378, 378, 386, 384, 310, 256, 477, 1273, 1935}, + {670, 647, 461, 452, 440, 421, 412, 405, 410, 440, 468, 369, 275, 321, 883, 1305}, + {679, 682, 477, 426, 405, 385, 368, 357, 362, 385, 401, 308, 245, 388, 942, 1231}, + {383, 395, 329, 309, 307, 307, 322, 329, 335, 338, 337, 278, 256, 213, 989, 2243}, + {32767}, + {32767}, + {740, 628, 382, 332, 322, 305, 306, 292, 276, 259, 261, 258, 240, 240, 223, 253}, + {530, 469, 346, 338, 341, 323, 326, 314, 302, 306, 304, 290, 271, 272, 269, 274}, + {576, 576, 378, 327, 322, 302, 289, 278, 264, 268, 259, 238, 213, 206, 202, 210}, + {386, 370, 292, 277, 266, 271, 284, 276, 276, 275, 264, 257, 236, 262, 275, 300}, + {32767}, + {32767}, + {435, 389, 296, 262, 244, 233, 223, 205, 203, 188, 175, 172, 167, 180, 184, 175}, + {365, 352, 268, 254, 251, 255, 247, 235, 237, 234, 214, 208, 190, 183, 221, 169}, + {363, 302, 276, 261, 241, 237, 229, 226, 225, 211, 191, 186, 198, 203, 220, 188}, + {318, 292, 230, 218, 218, 225, 219, 225, 213, 208, 187, 192, 208, 195, 209, 143}, + {374, 281, 320, 318, 325, 344, 322, 296, 268, 284, 305, 301, 322, 294, 293, 210}, + {204, 267, 279, 253, 250, 245, 235, 205, 195, 203, 231, 231, 248, 252, 266, 204}, + {616, 312, 245, 229, 207, 195, 204, 199, 189, 180, 193, 198, 256, 340, 356, 349}, + {471, 194, 275, 313, 325, 333, 332, 342, 335, 336, 342, 328, 347, 307, 280, 226}, + {241, 251, 250, 246, 250, 254, 245, 197, 166, 116, 107, 128, 83, 97, 242, 339}, + {266, 274, 259, 274, 279, 302, 304, 292, 221, 213, 257, 252, 247, 219, 227, 134}, + {355, 336, 348, 363, 348, 342, 353, 379, 391, 442, 462, 472, 458, 196, 456,1518}, + {744, 443, 233, 269, 253, 257, 283, 313, 308, 298, 262, 305, 383, 413, 469, 585}, + {308, 330, 343, 353, 347, 356, 392, 387, 376, 322, 359, 435, 448, 458, 482, 514}, + {756, 261, 305, 384, 394, 406, 415, 409, 409, 372, 352, 403, 438, 448, 498, 552}, + {219, 257, 280, 293, 289, 288, 304, 335, 325, 289, 195, 161, 211, 275, 306, 312}, + {550, 380, 309, 288, 244, 271, 272, 326, 332, 328, 248, 171, 168, 421, 468, 781}, + {371, 355, 356, 350, 336, 353, 368, 376, 369, 348, 269, 269, 281, 268, 199, 233}, + {380, 353, 392, 381, 342, 344, 362, 379, 399, 403, 420, 367, 228, 195, 789,1184}, + {337, 324, 314, 297, 301, 305, 335, 354, 414, 401, 425, 301, 154, 165, 690, 927}, + {438, 337, 327, 357, 363, 365, 394, 390, 400, 340, 295, 354, 392, 399, 421, 462}, +}; + +/* An 16-by-19 matrix in Scale = 32768.00f */ +const Word16 inv_sigma_p_fx[][16] =//Q15 +{ + {552, 513, 469, 494, 486, 478, 492, 496, 496, 482, 480, 388, 339, 276, 743, 760}, + {640, 492, 472, 478, 482, 471, 470, 471, 623, 504, 501, 477, 459, 425, 421, 408}, + {1001, 939, 696, 589, 545, 480, 456, 451, 444, 462, 472, 424, 342, 441, 1567, 3002}, + {609, 534, 419, 432, 444, 403, 406, 407, 391, 425, 452, 378, 269, 278, 818, 1939}, + {32767}, + {574, 507, 459, 432, 425, 415, 440, 442, 449, 450, 490, 443, 299, 270, 1377, 2451}, + {591, 499, 456, 457, 449, 441, 448, 446, 443, 436, 420, 397, 364, 342, 496, 475}, + {482, 512, 498, 426, 280, 225, 422, 1411, 404, 404, 402, 385, 364, 342, 355, 361}, + {917, 831, 572, 507, 482, 430, 406, 399, 385, 365, 364, 344, 313, 309, 311, 335}, + {533, 436, 371, 399, 398, 368, 367, 348, 343, 342, 338, 319, 306, 305, 311, 334}, + {32767}, + {641, 523, 458, 434, 415, 410, 412, 395, 397, 394, 386, 381, 366, 392, 413, 419}, + {449, 380, 364, 366, 354, 362, 362, 356, 337, 323, 293, 296, 336, 352, 353, 283}, + {32767}, + {601, 485, 348, 262, 267, 266, 276, 285, 255, 233, 227, 235, 216, 237, 233, 212}, + {338, 279, 247, 244, 233, 239, 231, 232, 228, 215, 194, 194, 207, 210, 222, 180}, + {32767}, + {594, 466, 394, 376, 362, 358, 346, 350, 336, 332, 313, 329, 343, 358, 370, 419}, + {471, 409, 323, 325, 308, 295, 305, 290, 281, 280, 271, 262, 251, 255, 266, 312}, +}; + +const Word16 sigma_p_fx[][16] = +{//Qlog2(2.56) + {152, 164, 179, 170, 172, 176, 171, 169, 169, 174, 175, 216, 247, 304, 113, 110}, + {131, 171, 178, 176, 174, 178, 178, 178, 135, 166, 167, 176, 183, 197, 199, 206}, + {84, 89, 120, 142, 154, 175, 184, 186, 189, 181, 178, 198, 245, 190, 54, 28}, + {138, 157, 200, 194, 189, 208, 207, 206, 214, 197, 186, 222, 311, 302, 103, 43}, + {3}, + {146, 165, 183, 194, 197, 202, 191, 190, 187, 186, 171, 189, 281, 311, 61, 34}, + {142, 168, 184, 183, 187, 190, 187, 188, 189, 193, 200, 212, 231, 245, 169, 177}, + {174, 164, 168, 197, 300, 372, 199, 59, 208, 208, 209, 218, 231, 246, 237, 232}, + {91, 101, 147, 165, 174, 195, 207, 210, 218, 230, 230, 244, 268, 272, 269, 250}, + {157, 192, 226, 210, 211, 228, 228, 241, 245, 246, 248, 263, 274, 275, 270, 251}, + {3}, + {131, 160, 183, 193, 202, 205, 203, 212, 212, 213, 217, 220, 229, 214, 203, 200}, + {187, 221, 231, 229, 237, 232, 232, 236, 249, 259, 286, 284, 250, 238, 238, 296}, + {3}, + {140, 173, 241, 320, 314, 315, 304, 295, 329, 359, 369, 357, 388, 354, 359, 396}, + {248, 300, 339, 344, 360, 350, 363, 361, 368, 391, 431, 433, 406, 400, 377, 467}, + {3}, + {141, 180, 213, 223, 232, 234, 242, 240, 250, 253, 268, 255, 245, 235, 227, 200}, + {178, 205, 259, 258, 273, 285, 275, 289, 299, 300, 310, 320, 335, 329, 316, 269}, +}; + +const Word16 sigma_p_ivas_fx[][16] = +{//Qlog2(2.56) + {152, 164, 179, 170, 172, 176, 171, 169, 169, 174, 175, 216, 247, 304, 113, 110}, + {131, 171, 178, 176, 174, 178, 178, 178, 135, 166, 167, 176, 183, 197, 199, 206}, + {84, 89, 120, 142, 154, 175, 184, 186, 189, 181, 178, 198, 245, 190, 54, 28}, + {138, 157, 200, 194, 189, 208, 207, 206, 214, 197, 186, 222, 311, 302, 103, 43}, + {3}, + {146, 165, 183, 194, 197, 202, 191, 190, 187, 186, 171, 189, 281, 311, 61, 34}, + {142, 168, 184, 183, 187, 190, 187, 188, 189, 193, 200, 212, 231, 245, 169, 177}, + {174, 164, 168, 197, 300, 372, 199, 59, 208, 208, 209, 218, 231, 246, 237, 232}, + {91, 101, 147, 165, 174, 195, 207, 210, 218, 230, 230, 244, 268, 272, 269, 250}, + {157, 192, 226, 210, 211, 228, 228, 241, 245, 246, 248, 263, 274, 275, 270, 251}, + {3}, + {131, 160, 183, 193, 202, 205, 203, 212, 212, 213, 217, 220, 229, 214, 203, 200}, + {187, 221, 231, 229, 237, 232, 232, 236, 249, 259, 286, 284, 250, 238, 238, 296}, + {3}, + {127, 173, 226, 217, 264, 256, 290, 295, 297, 325, 334, 326, 302, 290, 275, 254}, + {248, 300, 339, 344, 360, 350, 363, 361, 368, 391, 431, 433, 406, 400, 377, 467}, + {3}, + {141, 180, 213, 223, 232, 234, 242, 240, 250, 253, 268, 255, 245, 235, 227, 200}, + {178, 205, 259, 258, 273, 285, 275, 289, 299, 300, 310, 320, 335, 329, 316, 269}, +}; + +const Word16 inv_sigma_p_ivas_fx[][16] = +{//Qlog2(2.56) + {552, 513, 470, 494, 487, 478, 492, 496, 496, 482, 480, 389, 339, 276, 743, 760}, + {640, 492, 472, 478, 482, 471, 470, 471, 623, 504, 501, 477, 459, 425, 420, 408}, + {1002, 939, 696, 589, 545, 480, 456, 450, 444, 462, 472, 424, 342, 441, 1568, 2996}, + {609, 534, 419, 432, 444, 403, 406, 407, 392, 425, 452, 378, 269, 278, 818, 1940}, + {32767}, + {575, 507, 459, 432, 425, 415, 440, 442, 449, 450, 489, 443, 299, 270, 1378, 2449}, + {591, 499, 456, 457, 449, 441, 448, 446, 444, 435, 420, 397, 364, 342, 496, 475}, + {482, 512, 498, 426, 280, 225, 422, 1410, 404, 404, 402, 385, 364, 342, 355, 361}, + {918, 832, 572, 507, 482, 430, 406, 399, 385, 366, 364, 344, 313, 309, 311, 335}, + {533, 436, 371, 399, 398, 368, 367, 348, 343, 342, 338, 319, 306, 305, 311, 334}, + {32767}, + {641, 523, 458, 434, 415, 410, 412, 395, 397, 394, 386, 380, 366, 392, 413, 419}, + {449, 380, 364, 366, 355, 362, 362, 356, 337, 323, 293, 296, 336, 352, 353, 283}, + {32767}, + {659, 486, 371, 386, 318, 328, 289, 284, 283, 258, 251, 257, 278, 290, 305, 330}, + {338, 279, 247, 244, 233, 239, 231, 232, 228, 215, 194, 194, 207, 210, 222, 180}, + {32767}, + {594, 466, 394, 376, 362, 358, 346, 350, 336, 332, 313, 329, 343, 358, 370, 419}, + {471, 409, 323, 325, 308, 295, 304, 290, 281, 280, 271, 262, 251, 255, 266, 312} +}; + +const Word8 leaders_short[][MAX_NO_SCALES] = // Q0 +{{ 0, 0, 0}, +{ 1, 0, 0}, +{ 15, 3, 3}, +{ 2, 2, 0}, +{ 2, 0, 0}, +{ 2, 1, 0}, +{ 4, 0, 0}, +{ 9, 7, 6}, +{ 4, 1, 0}, +{ 5, 2, 0}, +{ 6, 3, 2}, +{ 5, 3, 1}, +{ 8, 3, 0}, +{ 9, 3, 0}, +{ 2, 2, 1}, +{ 9, 8, 5}, +{ 5, 5, 0}, +{ 17, 3, 0}, +{ 5, 2, 1}, +{ 7, 3, 0}, +{ 5, 4, 0}, +{ 5, 5, 1}, +{ 2, 2, 2}, +{ 4, 2, 2}, +{ 5, 2, 2}, +{ 6, 6, 5}, +{ 5, 3, 2}, +{ 6, 3, 0}, +{ 12, 3, 2}, +{ 15, 3, 2}, +{ 19, 3, 2}, +{ 7, 6, 3}, +{ 5, 4, 2}, +{ 9, 8, 2}, +{ 6, 5, 2}, +{ 5, 4, 1}, +{ 9, 9, 3}, +{ 6, 6, 2}, +{ 8, 6, 2}, +{ 8, 7, 2}, +{ 8, 8, 2}, +{ 4, 2, 0}, +{ 11, 8, 2}, +{ 13, 11, 2}, +{ 5, 5, 2}, +{ 16, 13, 2}, +{ 13, 12, 2}, +{ 18, 17, 2}, +{ 21, 17, 2}, +{ 18, 16, 2}, +{ 32, 28, 2}, +{ 8, 8, 4}, +{ 7, 5, 2}, +{ 13, 11, 9}, +{ 38, 31, 2}, +{ 4, 4, 2}, +{ 8, 8, 3}, +{ 9, 8, 3}, +{ 8, 5, 2}, +{ 10, 9, 3}, +{ 11, 10, 3}, +{ 13, 10, 3}, +{ 22, 10, 3}, +{ 23, 10, 3}, +{ 13, 11, 3}, +{ 15, 13, 3}, +{ 35, 15, 3}, +{ 32, 16, 3}, +{ 5, 5, 4}, +{ 8, 7, 4}, +{ 33, 31, 2}, +{ 9, 9, 4}, +{ 16, 12, 4}, +{ 17, 13, 4}, +{ 5, 5, 5}, +{ 7, 5, 5}, +{ 4, 3, 2}, +{ 8, 6, 5}, +{ 9, 6, 5}, +{ 9, 7, 5}, +{ 8, 8, 5}, +{ 3, 2, 0}, +{ 10, 8, 5}, +{ 11, 8, 5}, +{ 12, 8, 5}, +{ 13, 8, 5}, +{ 16, 8, 5}, +{ 18, 8, 5}, +{ 10, 9, 5}, +{ 18, 9, 5}, +{ 23, 21, 2}, +{ 13, 8, 8}, +{ 14, 10, 5}, +{ 11, 11, 5}, +{ 13, 11, 5}, +{ 13, 13, 5}, +{ 14, 13, 5}, +{ 15, 13, 5}, +{ 16, 13, 5}, +{ 17, 13, 5}, +{ 18, 13, 5}, +{ 18, 16, 5}, +{ 18, 17, 5}, +{ 19, 18, 5}, +{ 13, 10, 5}, +{ 21, 21, 5}, +{ 23, 21, 5}, +{ 24, 21, 5}, +{ 25, 23, 5}, +{ 32, 23, 5}, +{ 11, 10, 5}, +{ 8, 8, 6}, +{ 5, 5, 7}, +{ 8, 7, 7}, +{ 8, 8, 7}, +{ 10, 8, 7}, +{ 13, 8, 7}, +{ 10, 9, 7}, +{ 13, 11, 7}, +{ 9, 8, 8}, +{ 12, 8, 8}, +{ 23, 18, 5}, +{ 9, 9, 8}, +{ 11, 9, 8}, +{ 13, 9, 8}, +{ 18, 10, 8}, +{ 26, 10, 8}, +{ 27, 10, 8}, +{ 31, 10, 8}, +{ 40, 21, 11}, +{ 13, 11, 8}, +{ 13, 12, 8}, +{ 14, 12, 8}, +{ 18, 12, 8}, +{ 13, 13, 8}, +{ 14, 13, 8}, +{ 16, 13, 8}, +{ 18, 13, 8}, +{ 18, 16, 8}, +{ 18, 17, 8}, +{ 23, 18, 8}, +{ 23, 21, 8}, +{ 24, 21, 8}, +{ 28, 23, 8}, +{ 31, 31, 8}, +{ 36, 31, 8}, +{ 38, 31, 8}, +{ 11, 9, 9}, +{ 12, 9, 9}, +{ 13, 9, 9}, +{ 12, 11, 9}, +{ 42, 31, 2}, +{ 14, 12, 9}, +{ 13, 13, 9}, +{ 14, 13, 9}, +{ 16, 13, 9}, +{ 17, 13, 9}, +{ 18, 13, 9}, +{ 18, 14, 9}, +{ 18, 18, 9}, +{ 26, 25, 9}, +{ 13, 11, 10}, +{ 18, 12, 10}, +{ 18, 13, 10}, +{ 21, 14, 10}, +{ 22, 16, 10}, +{ 18, 18, 10}, +{ 23, 18, 10}, +{ 24, 18, 10}, +{ 24, 21, 10}, +{ 23, 22, 10}, +{ 24, 23, 10}, +{ 32, 25, 10}, +{ 34, 28, 10}, +{ 42, 31, 10}, +{ 17, 11, 11}, +{ 18, 13, 11}, +{ 21, 13, 11}, +{ 18, 17, 11}, +{ 18, 18, 11}, +{ 48, 35, 24}, +{ 18, 17, 12}, +{ 18, 18, 12}, +{ 20, 18, 12}, +{ 39, 30, 12}, +{ 31, 31, 12}, +{ 43, 34, 12}, +{ 16, 13, 13}, +{ 17, 13, 13}, +{ 16, 16, 13}, +{ 18, 17, 13}, +{ 20, 18, 13}, +{ 22, 18, 13}, +{ 23, 18, 13}, +{ 22, 21, 13}, +{ 23, 23, 13}, +{ 24, 23, 13}, +{ 43, 36, 13}, +{ 43, 40, 13}, +{ 43, 41, 13}, +{ 31, 30, 18}, +{ 24, 21, 14}, +{ 31, 31, 14}, +{ 23, 18, 16}, +{ 23, 23, 16}, +{ 31, 25, 16}, +{ 31, 29, 16}, +{ 45, 35, 16}, +{ 23, 21, 17}, +{ 23, 22, 17}, +{ 23, 23, 17}, +{ 31, 31, 17}, +{ 21, 18, 18}, +{ 23, 21, 18}, +{ 23, 22, 18}, +{ 27, 23, 18}, +{ 29, 23, 18}, +{ 32, 23, 18}, +{ 31, 27, 18}, +{ 30, 28, 18}, +{ 31, 28, 18}, +{ 43, 42, 13}, +{ 31, 31, 18}, +{ 32, 31, 18}, +{ 36, 31, 18}, +{ 46, 48, 18}, +{ 46, 32, 19}, +{ 43, 38, 19}, +{ 43, 42, 19}, +{ 32, 32, 20}, +{ 27, 23, 21}, +{ 31, 23, 21}, +{ 31, 24, 21}, +{ 32, 30, 21}, +{ 32, 31, 21}, +{ 43, 33, 21}, +{ 43, 34, 21}, +{ 24, 23, 23}, +{ 32, 32, 23}, +{ 48, 40, 23}, +{ 48, 46, 23}, +{ 28, 24, 24}, +{ 32, 31, 24}, +{ 34, 32, 24}, +{ 36, 32, 24}, +{ 48, 32, 24}, +{ 35, 10, 8}, +{ 40, 28, 25}, +{ 45, 31, 25}, +{ 44, 32, 25}, +{ 31, 31, 27}, +{ 39, 32, 27}, +{ 44, 32, 27}, +{ 32, 32, 28}, +{ 43, 32, 28}, +{ 48, 32, 28}, +{ 36, 36, 28}, +{ 48, 45, 28}, +{ 40, 32, 29}, +{ 44, 34, 30}, +{ 40, 32, 31}, +{ 41, 32, 31}, +{ 42, 32, 31}, +{ 44, 43, 31}, +{ 48, 37, 32}, +{ 48, 39, 32}, +{ 46, 43, 32}, +{ 48, 48, 34}, +{ 48, 36, 35}, +{ 48, 41, 35}, +{ 47, 43, 36}, +{ 48, 48, 37}, +{ 48, 48, 40}, +{ 48, 48, 45}, +{ 48, 48, 47}, +{ 48, 48, 48}}; + +const UWord8 no_lead_idx[][2] = { // Q0 +{ 1, 1}, +{ 4, 1}, +{ 41, 1}, +{ 41, 4}, +{ 52, 32}, +{ 56, 38}, +{ 41, 1}, +{ 6, 5}, +{119, 14}, +{ 58, 18}, +{138, 21}, +{169, 40}, +{ 4, 4}, +{ 41, 1}, +{ 35, 1}, +{ 35, 4}, +{ 52, 4}, +{ 18, 8}, +{ 44, 41}, +{ 58, 6}, +{ 58, 9}, +{ 69, 26}, +{ 51, 34}, +{ 85, 34}, +{ 85, 38}, +{ 85, 42}, +{139, 40}, +{142, 33}, +{140, 64}, +{141, 73}, +{236, 124}, +{235, 133}, +{211, 160}, +{ 4, 3}, +{ 41, 1}, +{ 52, 3}, +{ 39, 3}, +{ 42, 3}, +{153, 3}, +{118, 9}, +{158, 44}, +{202, 93}, +{250, 201}, +{ 20, 0}, +{ 52, 0}, +{ 1, 1}, +{ 4, 1}, +{ 4, 4}, +{ 4, 4}, +{ 41, 1}, +{ 41, 4}, +{ 20, 4}, +{ 52, 4}, +{ 39, 4}, +{ 44, 41}, +{ 58, 6}, +{ 80, 41}, +{114, 9}, +{124, 9}, +{130, 21}, +{124, 58}, +{165, 34}, +{164, 39}, +{169, 40}, +{ 35, 0}, +{ 4, 4}, +{ 35, 1}, +{ 35, 4}, +{ 52, 4}, +{ 58, 5}, +{ 15, 5}, +{135, 3}, +{116, 41}, +{124, 24}, +{137, 24}, +{177, 26}, +{194, 44}, +{208, 52}, +{230, 58}, +{ 4, 4}, +{ 41, 1}, +{ 41, 4}, +{ 20, 4}, +{ 8, 6}, +{ 9, 8}, +{ 44, 41}, +{ 58, 6}, +{ 58, 9}, +{114, 9}, +{124, 9}, +{ 92, 21}, +{124, 58}, +{ 92, 51}, +{104, 91}, +{141, 51}, +{121, 91}, +{ 4, 3}, +{ 41, 1}, +{ 52, 3}, +{ 69, 3}, +{ 83, 3}, +{ 87, 3}, +{ 86, 44}, +{143, 74}, +{144, 112}, +{179, 78}, +{196, 78}, +{196, 78}, +{224, 78}, +{ 4, 3}, +{ 41, 1}, +{ 20, 1}, +{ 20, 4}, +{ 52, 4}, +{ 52, 3}, +{111, 5}, +{132, 4}, +{ 57, 41}, +{123, 41}, +{214, 3}, +{183, 81}, +{215, 41}, +{213, 32}, +{219, 44}, +{233, 52}, +{ 7, 52}, +{ 3, 57}, +{ 14, 59}, +{ 11, 53}, +{ 62, 0}, +{ 37, 4}, +{ 37, 3}, +{ 63, 3}, +{ 67, 3}, +{184, 3}, +{123, 41}, +{ 19, 124}, +{ 39, 4}, +{ 44, 41}, +{ 58, 6}, +{ 58, 9}, +{ 58, 44}, +{115, 32}, +{ 95, 16}, +{102, 21}, +{ 99, 38}, +{126, 58}, +{141, 57}, +{206, 56}, +{205, 120}, +{226, 124}, +{226, 133}, +{225, 182}, +{152, 3}, +{ 65, 3}, +{ 17, 14}, +{ 61, 22}, +{135, 3}, +{ 19, 11}, +{ 76, 25}, +{ 41, 36}, +{ 41, 33}, +{ 41, 7}, +{ 27, 10}, +{ 81, 15}, +{ 3, 2}, +{ 41, 36}, +{ 55, 31}, +{ 81, 7}, +}; +const UWord8 no_lead_p_idx[][2] = { // Q0 + { 5, 0}, +{ 3, 0}, +{ 41, 0}, +{ 35, 0}, +{ 52, 0}, +{ 1, 1}, +{ 4, 1}, +{ 4, 4}, +{ 3, 4}, +{ 41, 1}, +{ 41, 4}, +{ 35, 4}, +{ 52, 4}, +{ 39, 4}, +{ 44, 41}, +{ 58, 6}, +{ 80, 41}, +{ 15, 9}, +{ 94, 9}, +{110, 34}, +{ 96, 52}, +{ 98, 39}, +{105, 58}, +{107, 51}, +{105, 104}, +{109, 94}, +{145, 98}, +{207, 100}, +{239, 103}, +{240, 108}, +{207, 146}, +{ 4, 0}, +{ 41, 4}, +{ 39, 3}, +{ 94, 5}, +{ 80, 41}, +{ 94, 18}, +{ 94, 44}, +{ 96, 52}, +{106, 44}, +{121, 58}, +{107, 51}, +{199, 15}, +{197, 104}, +{198, 156}, +{221, 200}, +{ 4, 1}, +{ 3, 1}, +{ 3, 4}, +{ 41, 1}, +{ 35, 1}, +{ 35, 4}, +{ 52, 4}, +{ 39, 4}, +{ 88, 4}, +{135, 4}, +{135, 3}, +{190, 3}, +{155, 41}, +{135, 20}, +{190, 32}, +{194, 44}, +{231, 44}, +{230, 58}, +{231, 15}, +{242, 83}, +{253, 130}, +{ 4, 1}, +{ 32, 1}, +{ 58, 5}, +{ 39, 3}, +{ 43, 5}, +{ 45, 3}, +{ 48, 3}, +{ 46, 44}, +{ 49, 44}, +{ 90, 44}, +{ 50, 44}, +{ 54, 52}, +{ 70, 51}, +{151, 122}, +{151, 53}, +{ 52, 4}, +{ 39, 4}, +{ 83, 4}, +{ 89, 4}, +{ 80, 41}, +{ 85, 41}, +{100, 8}, +{101, 9}, +{ 85, 38}, +{ 85, 15}, +{195, 52}, +{234, 52}, +{217, 15}, +{254, 15}, +{251, 104}, +{ 10, 153}, +{ 18, 157}, +{ 19, 192}, +{ 19, 237}, +{ 19, 0}, +{ 52, 4}, +{153, 3}, +{159, 3}, +{171, 32}, +{185, 44}, +{186, 68}, +{ 85, 15}, +{220, 44}, +{218, 75}, +{227, 75}, +{ 1, 77}, +{228, 147}, +{ 15, 150}, +{ 18, 187}, +{ 16, 212}, +{ 16, 241}, +{ 17, 248}, +{ 4, 3}, +{ 52, 4}, +{ 52, 3}, +{161, 3}, +{166, 3}, +{149, 9}, +{247, 47}, +{178, 0}, +{ 41, 1}, +{ 20, 1}, +{ 20, 4}, +{ 52, 4}, +{ 58, 5}, +{117, 4}, +{117, 3}, +{153, 3}, +{182, 3}, +{204, 3}, +{162, 9}, +{163, 44}, +{167, 44}, +{173, 44}, +{254, 44}, +{ 12, 52}, +{254, 15}, +{ 13, 82}, +{244, 188}, +{ 3, 4}, +{ 52, 4}, +{ 58, 5}, +{153, 3}, +{190, 3}, +{209, 3}, +{243, 189}, +{ 41, 1}, +{ 20, 1}, +{ 39, 4}, +{ 88, 4}, +{ 97, 4}, +{138, 21}, +{ 6, 44}, +{ 1, 1}, +{ 4, 1}, +{ 4, 4}, +{ 5, 4}, +{ 41, 1}, +{ 41, 4}, +{ 20, 4}, +{ 52, 4}, +{ 39, 4}, +{ 83, 4}, +{135, 4}, +{ 80, 41}, +{116, 41}, +{136, 41}, +{110, 34}, +{ 13, 6}, +{113, 41}, +{114, 18}, +{ 91, 24}, +{125, 24}, +{127, 24}, +{163, 12}, +{168, 13}, +{172, 13}, +{128, 84}, +{174, 28}, +{252, 29}, +{249, 30}, +{246, 129}, +{246, 180}, +{ 9, 66}, +{110, 41}, +{155, 41}, +{154, 20}, +{158, 44}, +{203, 21}, +{232, 44}, +{210, 39}, +{223, 79}, +{222, 123}, +{229, 131}, +{238, 139}, +{238, 170}, +{ 4, 4}, +{ 4, 4}, +{ 41, 1}, +{ 20, 1}, +{ 20, 4}, +{ 52, 4}, +{ 39, 4}, +{ 88, 4}, +{135, 4}, +{ 80, 41}, +{110, 41}, +{136, 41}, +{134, 32}, +{176, 44}, +{193, 44}, +{195, 52}, +{210, 39}, +{242, 39}, +{ 6, 71}, +{ 2, 148}, +{ 4, 175}, +{ 5, 191}, +{110, 41}, +{204, 3}, +{216, 22}, +{210, 23}, +{195, 32}, +{220, 44}, +{210, 39}, +{222, 33}, +{245, 57}, +{255, 60}, +{ 8, 72}, +{ 8, 181}, +}; + +const Word16 min_lat_bits_SN[] = {-1, -1, 17, 12, 17, 17, -1, -1, 17, 12, 17, 17, -1, -1, 22, -1, 32, 26 }; +//Q0 +const Word16 min_lat_bits_SN_fx[] = { -1, -1, 17, 12, 17, 17, -1, -1, 17, 12, 17, 17, -1, -1, 22, -1, 32, 26 }; + +const Word16 min_lat_bits_pred[] = {17, 18, 9, 15, -1, 21, 17, 14, 9, 15, -1, 21, 17, -1, 24, 26, -1, 26, 16}; +//Q0 +const Word16 min_lat_bits_pred_fx[] = { 17, 18, 9, 15, -1, 21, 17, 14, 9, 15, -1, 21, 17, -1, 24, 26, -1, 26, 16 }; + +const Word16 offset_lvq_modes_SN[] = {-1,-1,33,64,96, 129,-1,-1,12,43,79,109,-1,-1,137,-1,107,135, + 112 + }; /* CNG */ +//Q0 +const Word16 offset_lvq_modes_SN_fx[] = { -1,-1,26,51,77,96,-1,-1,12,36,66,90,-1,-1,105,-1,88,102,112 }; /* CNG */ + +const Word16 offset_lvq_modes_pred[] = {119, 153, 31, 67, -1, 102, 126, 160, 0, 46, -1, 82, 146, -1, 175, 191, -1, 225, 203}; +//Qlog2(1.6) +const Word16 offset_lvq_modes_pred_fx[] = { 74, 95, 15, 45, -1, 66, 81, 102, 0, 30, -1, 60, 88, -1, 109, 117, -1, 139, 124 }; + +const Word16 offset_in_lvq_mode_SN[][21] = +{ + {0}, /* I NB */ + {0,1,1,1,1,1,2,3,3,3,3,4,4,4,5}, /* UV NB*/ + {0,1,1,1,1,2,3,4,5,5,6,6,7,7,7,7,7,8,8,8,9}, /* V NB */ + {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G NB */ + {0,1,1,1,1,2,3,4,5,5,5,6,6,6,7,8}, /* T NB */ + {0,0,0,0,1,2,2,2,2,3,4,5}, /* A NB */ + {0}, /* I WB */ + {0}, /* UV WB*/ + {1}, /* V WB */ /* granularity 1 */ + {1}, /* G WB */ /* granularity 1 */ + {1}, /* T WB */ /* granularity 1 */ + {1}, /* A WB */ /* granularity 1 */ + {0}, /* I 16k */ + {0}, /* UV 16k */ + {1}, /* V 16k */ /* granularity 1 */ + {0}, /* G 16k */ + {0,1}, /* T 16k */ + {0}, /* A 16k */ +}; + +const Word16 offset_in_lvq_mode_SN_fx[][21] = +{//Q0 + {0}, /* I NB */ + {0,1,1,1,1,1,2,3,3,3,3,4,4,4,5}, /* UV NB*/ + {0,1,1,1,1,2,3,4,5,5,6,6,7,7,7,7,7,8,8,8,9}, /* V NB */ + {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G NB */ + {0,1,1,1,1,2,3,4,5,5,5,6,6,6,7,8}, /* T NB */ + {0,0,0,0,1,2,2,2,2,3,4,5}, /* A NB */ + {0}, /* I WB */ + {0,1,1,1,2,3,3,3,3,3,3,4,4,4,5}, /* UV WB*/ + {0,1,1,1,2,3,3,3,4,5,6,7,8,9,9,10,11,12,12,12,13}, /* V WB */ + {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G WB */ + {0,1,1,1,2,3,3,4,5,5,5,6,6,7,8,9,10}, /* T WB */ + {0,0,0,0,1,2,2,2,3,4,4,4,4,4,4,4,4,4,4,5}, /* A WB */ + {0}, + {0}, + {0,0,0,0,0,0,1,2,3,3,4,5,6,6,6,7}, /* V 16k */ + {0}, /* G 16k */ + {0,1}, /* T 16k */ + {0}, /*{0,0,0,0,0,0,0,0,0,0,1} */ /* A 16k */ +}; + +const Word16 offset_in_lvq_mode_pred[][32] = +{ + {0,0,0,0,1,2,2,2,3,4,5,5,5,5,5,5,5,5,5,6}, /* I NB */ + {0,1,1,1,2,3,4,4,4,4,4,5,5,5,6}, /* UV NB */ + {0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,3,4,4,5,6,7,8,9,10,10,11,12,13,13,13,14}, /* V NB */ + {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G NB */ + {0}, /* T NB */ + {0,0,0,0,1,2,2,2,2,3,4,5}, /* A NB */ + {1}, /* I WB */ + {1}, /* UV WB */ /* granularity 1 */ + {1}, /* V WB */ /* granularity 1 */ + {1}, /* G WB */ + {0}, /* T WB */ + {1}, /* A WB */ + {0,0,0,0,1,2,2,2,3,4,5,5,5,5,5,5,5,5,5,6}, /* I 16k */ + {0}, /* UV 16k */ + {1}, /* V 16k */ + {1}, /* G 16k */ + {0}, /* T 16k */ + {1}, /* A 16k */ + {1}, /* G WB MA*/ +}; + +const Word16 offset_in_lvq_mode_pred_fx[][32] = +{//Q0 + {0,0,0,0,1,2,2,2,3,4,5,5,5,5,5,5,5,5,5,6}, /* I NB */ + {0,1,1,1,2,3,4,4,4,4,4,5,5,5,6}, /* UV NB */ + {0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,3,4,4,5,6,7,8,9,10,10,11,12,13,13,13,14}, /* V NB */ + {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G NB */ + {0}, /* T NB */ + {0,0,0,0,1,2,2,2,2,3,4,5}, /* A NB */ + {0,0,0,0,1,2,2,2,3,4,5,5,5,5,5,5,5,5,5,6}, /* I WB */ + {0,1,1,1,2,3,4,4,4,4,4,5,5,5,6}, /* UV WB */ + {0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,3,4,4,5,6,7,8,9,10,10,11,12,13,13,13,14}, /* V WB */ + {0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G WB */ + {0}, /* T WB */ + {0,0,0,0,1,2,2,2,3,4,4,4,4,4,4,4,4,4,4,5}, /* A WB */ + {0,0,0,0,1,2,2,2,3,4,5,5,5,5,5,5,5,5,5,6}, /* I 16k */ + {0}, /* UV 16k */ + {0,0,0,0,0,0,1,2,3,3,4,5,6,6,6,7}, /* V 16k */ + {0,0,0,0,0,0,1,2,3,4,5,6}, /* G 16k */ + {0}, /* T 16k */ + {0,0,0,0,0,0,1,2,3,4,5,6}, /* A 16k */ + {0,0,0,0,0,1,1,1,2,3,4,5,6,6,7,8,9,10,11,12,13,14}, /* G WB MA*/ +}; + +/*-----------------------------------------------------------------* + * BC-TCVQ frame-end quantization tables (BC-TCVQ is used in Voiced mode for 16kHz isf) + *-----------------------------------------------------------------*/ +const Word16 NTRANS[4][NUM_STATE] = {{0,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14}, /* indices of previous state of first branche */ + {1,3,5,7,9,11,13,15,1,3,5,7,9,11,13,15}, /* indices of previous state of second branches */ + {4,2,1,3,0,2,1,3,2,0,3,1,7,0,3,1}, /* indices of previous subset of first branch */ + {2,0,3,6,2,0,3,1,0,2,1,3,0,2,1,5} /* indices of previous subset of second branch */ +}; // Q0 + +const Word16 NTRANS2[4][NUM_STATE] = {{0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7}, + {8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15}, + {4,2,2,0,1,3,3,6,0,2,2,0,1,3,3,1}, + {2,0,0,2,3,1,1,3,7,0,0,2,3,1,1,5} +}; // Q0 + +/* BC-TCQ Bit Allocations */ +const Word16 BC_TCVQ_BIT_ALLOC_40B[M/2+4] = {1, 4, 5,5,4,4, 2,2,2,2, 5,4 }; /*1+39bit Q0*/ + +const Word16 FixBranch_tbl[4][4][N_STAGE_VQ - 4] = +{ + {{0, 0, 0, 0}, {1, 0, 0, 0}, {0, 1, 0, 0}, {1, 1, 0, 0}}, /* incase of initial state 0 */ + {{0, 0, 1, 0}, {1, 0, 1, 0}, {0, 1, 1, 0}, {1, 1, 1, 0}}, /* incase of initial state 4 */ + {{0, 0, 0, 1}, {1, 0, 0, 1}, {0, 1, 0, 1}, {1, 1, 0, 1}}, /* incase of initial state 8 */ + {{0, 0, 1, 1}, {1, 0, 1, 1}, {0, 1, 1, 1}, {1, 1, 1, 1}} /* incase of initial state 12 */ +}; // Q0 + +/* Intra-Prediction */ + +const Word16 SN_IntraCoeff_fx[N_STAGE_VQ - 1][2][2] = /* Q15 */ +{ + {{-14822, 26501}, {-17180, 10012}}, + {{ 317, 19858}, { -432, 13799}}, + {{ 4747, 22069}, { 2653, 19016}}, + {{ 6823, 20747}, { 7077, 19154}}, + {{ 1665, 25161}, { 2519, 13654}}, + {{ 166, 18043}, { -221, 9732}}, + {{ -781, 20026}, { -5332, 18882}} +}; + +const Word16 AR_IntraCoeff_fx[N_STAGE_VQ - 1][2][2] = /* Q15 */ +{ + {{-9584, 22162}, {-13849, 7127}}, + {{ 1604, 16400}, { 2861, 9414}}, + {{ 6537, 16475}, { 3498, 13792}}, + {{ 7879, 14434}, { 7021, 12992}}, + {{ 6329, 16215}, { 5200, 10052}}, + {{ 3062, 12146}, { 2147, 4857}}, + {{ 1226, 11040}, { -794, 6137}} +}; + +const Word16 scale_ARSN_fx[M] = /* Q14 */ +{ + 29994, 30153, 29506, 28534, 28246, 28618, 26388, 27029, + 25726, 25474, 25797, 26540, 25613, 24968, 25880, 25584 +}; + +const Word16 scale_inv_ARSN_fx[M] = /* Q15 */ +{ + 17898, 17806, 18196, 18815, 19005, 18760, 20342, 19864, + 20870, 21076, 20811, 20228, 20962, 21502, 20745, 20985 +}; + +/* TCVQ Codebook */ + +const Word16 AR_TCVQ_CB_SUB1_fx[2][128][2] = /* x2.65 */ +{//Qlog2(2.56) + { + {-435 , -434}, {-233 , 124}, {-381 , 44}, {-274 , -88}, {-332 , -224}, {-563 , -600}, {-332 , 134}, { 53 , -739}, + {-567 , 0}, { 149 , 316}, {-191 , 541}, {-123 , 317}, {-493 , -634}, {-528 , 268}, {-321 , -386}, {-432 , -220}, + {-244 , -230}, { -33 , 454}, {-188 , -642}, {-131 , -215}, {-676 , 263}, {-472 , -403}, {-312 , -159}, {-340 , 297}, + {-121 , -217}, { -6 , 241}, {-203 , -211}, {-126 , -15}, {-734 , -374}, {-458 , -6}, {-297 , -27}, {-307 , -553}, + {-177 , 3}, {-175 , -273}, { 63 , 363}, { 133 , 527}, {-133 , -185}, {-449 , -1206}, {-287 , -281}, {-131 , 869}, + {-100 , -105}, { -75 , -179}, {-141 , 131}, { -32 , 108}, { -81 , 161}, {-446 , -230}, {-283 , -884}, {-128 , -165}, + {-153 , -451}, {-177 , -114}, {-113 , -127}, {-223 , -355}, {-246 , -447}, {-396 , -705}, {-280 , 329}, { -37 , -64}, + {-118 , 208}, { -82 , 64}, {-339 , -367}, { -58 , -132}, {-458 , 644}, {-381 , -543}, {-272 , 557}, { 62 , 75}, + {-307 , -829}, { 310 , 445}, { 73 , -26}, { 95 , 219}, { 223 , 611}, { 279 , 195}, { 430 , 575}, { 424 , 221}, + { -25 , 2}, { 323 , 236}, {-100 , -310}, { 11 , -35}, { 83 , -3}, { 281 , 738}, { 495 , 393}, { 89 , 1284}, + { 32 , 136}, { 29 , 34}, { 491 , 575}, { 105 , -188}, { 15 , -440}, { 285 , 10}, { 516 , -105}, { 313 , 704}, + { -6 , -274}, { -62 , -64}, { -12 , -127}, { 170 , 2387}, { 162 , 196}, { 336 , 413}, { 543 , 210}, { 231 , -70}, + { -2 , 691}, { 98 , 134}, { 25 , 141}, { 261 , 305}, { 312 , -322}, { 336 , 228}, { 561 , 781}, { 766 , 514}, + { -14 , -117}, { 166 , 905}, { -50 , 1}, { 471 , 369}, { 345 , 247}, { 347 , -383}, { 561 , 1128}, { 513 , 1030}, + { 100 , -15}, { 185 , 70}, { 167 , 131}, { 122 , 36}, { 561 , 743}, { 401 , 111}, { 595 , -579}, { 674 , 215}, + { 191 , 189}, { 38 , -78}, { 428 , 0}, { 261 , 136}, { -29 , -99}, { 405 , 308}, { 614 , 574}, {1682 , 1704} + }, + { + {-942 , -168}, {-262 , -361}, { -53 , -171}, {-245 , 472}, {-2145 , -2315}, {-1307 , 1261}, {-870 , -1940}, { -652 , -564}, + {-500 , 447}, {-578 , -198}, {-554 , 111}, { -98 , -84}, {-1315 , 0}, {-1229 , -1618}, {-868 , 230}, { -385 , 1061}, + {-768 , -998}, {-202 , -60}, {-283 , -197}, {-142 , -325}, { -558 , 755}, {-1217 , 456}, {-803 , 766}, { -982 , 743}, + {-415 , -357}, { -28 , 1054}, { 114 , -246}, { 81 , 732}, { -804 , -506}, {-1126 , -112}, {-797 , -132}, { -289 , -204}, + {-347 , -29}, { -37 , -259}, {-142 , -438}, {-249 , 87}, { -874 , 341}, {-1074 , -2635}, {-668 , -1552}, {-1140 , -764}, + {-245 , -513}, { -48 , 526}, { 14 , 395}, {-452 , -646}, { -441 , -969}, { -953 , -1284}, {-645 , -387}, { -736 , 111}, + {-163 , 305}, {-349 , 224}, {-225 , 736}, { 94 , -85}, { -302 , -549}, { -937 , -892}, {-605 , -1089}, { -64 , -101}, + {-161 , -211}, {-392 , -1299}, {-148 , 125}, { 14 , 131}, { -432 , -127}, { -920 , -510}, {-598 , -730}, { 85 , 154}, + { 25 , -155}, { -57 , 238}, { 471 , 276}, { 421 , 680}, { -173 , 316}, { 597 , 1805}, { 906 , -673}, { 538 , 450}, + {-267 , -805}, { 2 , -19}, { 222 , 219}, { 185 , 352}, { -33 , -178}, { 606 , 118}, { 959 , -70}, { 350 , -91}, + { -87 , 42}, { 727 , 905}, { 54 , 33}, { 316 , 44}, { 251 , 15}, { 610 , -122}, { 990 , 1436}, { 82 , 1480}, + { 181 , 535}, { 177 , 130}, { 700 , 565}, { 626 , 331}, { 279 , 551}, { 680 , 707}, {1012 , 727}, { 1057 , 766}, + { -13 , -396}, { 364 , 412}, { 442 , -181}, { 202 , -386}, { 565 , 1397}, { 740 , 2621}, {1080 , 361}, { 1118 , 191}, + { 81 , 266}, { 217 , -130}, { 349 , 1009}, { 678 , -476}, { 1361 , 878}, { 795 , 472}, {1267 , 1034}, { 1040 , 1255}, + { 351 , 201}, { -69 , -633}, { -36 , -1046}, { 808 , 30}, { 1300 , -198}, { 803 , 1026}, {1390 , -326}, { 2291 , 2479}, + { 166 , 13}, { 521 , 84}, { 255 , -717}, { 987 , 448}, { 777 , 220}, { 811 , 208}, {1395 , 2021}, { 1499 , 417} + } +}; +const Word16 AR_TCVQ_CB_SUB2_fx[2][64][2] = +{//Qlog2(2.56) + { + {-357 , -53}, {-525 , 167}, {-232 , 255}, {-132 , -359}, {-940 , -221}, { -260 , -1296}, {-1197 , -455}, { -833 , 49}, + {-132 , -1}, {-401 , -280}, {-212 , -217}, {-194 , 92}, {-580 , -710}, { -862 , -750}, { -669 , 430}, { -521 , 719}, + {-620 , -454}, {-239 , 509}, { -15 , -575}, { 389 , 704}, {-890 , 518}, {-1154 , 84}, { -632 , -1023}, { -620 , -1263}, + {-268 , -470}, {-326 , -738}, { 44 , 635}, { 73 , 362}, {-226 , -22}, { -625 , -106}, { -720 , -114}, {-1114 , -1070}, + { 19 , -250}, { 83 , 99}, { 35 , -16}, { 263 , -316}, { 472 , 1096}, { -52 , -328}, { -249 , 971}, { 1387 , 876}, + { 10 , 203}, { 869 , 649}, { 225 , 170}, { 301 , 83}, {1256 , 482}, { 391 , -777}, { 1064 , -320}, { 52 , 1207}, + { 309 , 375}, { 469 , 226}, { 619 , 400}, { 60 , -93}, { 335 , 244}, { 316 , -65}, { -45 , -987}, { 648 , -294}, + { 218 , -66}, {-108 , -133}, { 500 , -19}, { 824 , 163}, { 483 , -443}, { 1297 , 240}, { 1000 , 1205}, { 623 , 1347} + }, + { + {-424 , -965}, { -46 , -194}, { 20 , 298}, {-333 , -278}, {-797 , -522}, {-868 , -60}, { -20 , -140}, {-1085 , -904}, + {-615 , -243}, {-367 , 22}, {-261 , -519}, {-111 , -27}, {-745 , 142}, {-484 , -1519}, { -329 , 13}, {-1077 , 92}, + {-529 , 218}, {-519 , -597}, {-276 , -72}, { -87 , -398}, { -51 , -1257}, {-291 , 409}, { -883 , 611}, { 176 , -401}, + {-134 , -245}, { 37 , 506}, { 23 , -10}, {-225 , 293}, {-913 , -1324}, {-174 , -290}, {-1086 , -386}, { -139 , -78}, + {-123 , 125}, { -26 , -738}, { 113 , -344}, { 175 , 182}, { 754 , -446}, {1207 , 529}, { 932 , 990}, { 136 , 122}, + { 267 , 327}, { 382 , -182}, { 718 , 471}, { 738 , 108}, { 158 , 130}, { 437 , 401}, { 358 , -667}, { 1380 , 836}, + { 184 , -17}, { 435 , 231}, { 403 , 63}, { 151 , -125}, {-109 , -237}, { 692 , -241}, { 1247 , 193}, { 885 , 324}, + {-283 , 661}, { 44 , 105}, { 156 , 911}, { 387 , 588}, { 690 , 1459}, { 664 , 1057}, { -38 , 1455}, { 645 , 909} + } +}; +const Word16 AR_TCVQ_CB_SUB3_fx[4][32][2] = +{//Qlog2(2.56) + { + {-487 , 9}, {-456 , -400}, { 96 , 451}, {-239 , 422}, {-685 , -1309}, { 68 , -709}, {-302 , -1185}, { 481 , -287}, + {-287 , -697}, {-194 , 73}, {-159 , -132}, {-161 , -312}, {-809 , 417}, {-860 , -926}, { -26 , -71}, {-1052 , -432}, + { 53 , 134}, { 106 , -140}, { 336 , -18}, { 404 , 735}, {-109 , -516}, { 719 , -65}, { -34 , 1336}, { -171 , 905}, + { 52 , -347}, { 359 , 266}, { 715 , 351}, { 100 , 133}, { 87 , 130}, { 975 , 999}, {1257 , 547}, { 738 , 1372} + }, + { + {-340 , -464}, {-216 , -779}, { 104 , -403}, { -92 , -221}, {-760 , -602}, {-914 , -811}, {-661 , -895}, {-1292 , -290}, + {-317 , 131}, {-575 , -154}, {-228 , -129}, {-257 , 487}, {-286 , -1354}, { -93 , -259}, {-798 , 179}, { -815 , -1368}, + { 215 , 570}, { -2 , 73}, { 545 , 167}, { 250 , 188}, { 76 , 48}, {-943 , 587}, { 379 , 1232}, { 1070 , 112}, + { 117 , -27}, { 389 , -142}, { 18 , 214}, { 735 , 581}, {1098 , 1244}, { 451 , 408}, {1482 , 650}, { -174 , 1160} + }, + { + {-256 , -485}, { -67 , 571}, { -5 , 161}, {-171 , 153}, {-1188 , -440}, {-1081 , 110}, {-641 , -921}, {-232 , -96}, + {-511 , 146}, {-288 , -93}, { 484 , 665}, {-610 , -366}, { -357 , -899}, { -861 , -1088}, { -78 , -105}, {-265 , -845}, + { 15 , 18}, { 79 , -383}, {-205 , -258}, { 306 , 264}, { 28 , 69}, { 34 , 65}, {1170 , 669}, { 133 , 74}, + { 521 , 183}, { 132 , 84}, { 362 , -90}, { 57 , -181}, { 894 , 456}, { 1147 , 742}, { 212 , 274}, { 891 , 262} + }, + { + { 94 , 464}, { 8 , 138}, {-365 , -640}, {-399 , 172}, {-249 , -109}, { -94 , -316}, {-163 , -250}, {-598 , -704}, + {-185 , 36}, {-470 , -199}, { 65 , 241}, {-104 , -362}, {-220 , -801}, {-866 , -66}, {-931 , -400}, {-172 , -132}, + {-148 , -494}, { 465 , 251}, {-179 , -72}, { 439 , 287}, { 824 , 559}, { 33 , 134}, { 59 , 134}, { 88 , 146}, + { 186 , 43}, { 69 , -261}, { 267 , -96}, { 40 , 79}, { 84 , 130}, { 678 , 378}, { 811 , 448}, { 920 , 541} + } +}; + + +const Word16 SN_TCVQ_CB_SUB1_fx[2][128][2] = +{//Qlog2(2.56) + { + {-639 , 105}, {-488 , -449}, {-530 , -811}, {-419 , -634}, {-781 , -1061}, {-585 , 386}, {-501 , -737}, {-489 , -728}, + {-702 , -685}, {-510 , -762}, {-390 , -287}, {-379 , -379}, {-573 , -848}, {-583 , -778}, {-500 , -810}, {-671 , -420}, + {-516 , 802}, {-265 , -492}, {-523 , -568}, {-195 , 2882}, {-600 , -172}, {-568 , -869}, {-497 , 663}, {-643 , -929}, + {-346 , -378}, {-253 , -313}, {-418 , 595}, {-240 , -465}, {-424 , -546}, {-556 , -305}, {-497 , 2453}, {-451 , -235}, + {-452 , -670}, {-368 , -624}, {-379 , -662}, {-305 , -85}, {-549 , 399}, {-546 , -644}, {-484 , -426}, {-387 , -546}, + {-325 , -550}, {-229 , 118}, { -83 , 1004}, {-120 , 465}, {-289 , -222}, {-516 , 155}, {-480 , 1494}, {-415 , 138}, + {-419 , -100}, {-347 , 1091}, {-434 , 76}, {-138 , -291}, {-434 , -719}, {-514 , 945}, {-473 , -26}, {-144 , -320}, + {-376 , 1505}, {-329 , 374}, {-316 , -504}, { -58 , -6}, {-270 , -466}, {-507 , -540}, {-466 , -181}, {-256 , -518}, + {-196 , 726}, { -88 , -356}, {-186 , -394}, { 31 , -201}, { -77 , -319}, { 408 , 136}, { 630 , 680}, { 875 , 1365}, + {-200 , -190}, { 166 , 1289}, { 600 , 1085}, { 276 , 464}, { 567 , 1575}, { 425 , 278}, { 666 , 377}, {1209 , 2344}, + {-182 , -409}, { -95 , -141}, { 65 , 507}, { 127 , 212}, { 340 , 235}, { 481 , 408}, { 721 , 1203}, {1112 , 756}, + { 162 , 362}, { 138 , 753}, {-169 , -128}, { 187 , -32}, { 68 , -93}, { 528 , 2866}, { 786 , 789}, {1247 , 1468}, + {-476 , 2428}, { 20 , 133}, { 2 , -236}, { 426 , 799}, { 393 , 590}, { 532 , 1562}, { 807 , 534}, {1410 , 1051}, + { -14 , -263}, { 83 , -158}, { 158 , -38}, { 616 , 550}, { 845 , 543}, { 536 , 238}, { 912 , 1521}, {1635 , 1344}, + { 115 , -55}, { 263 , 87}, {-126 , 234}, { 376 , 191}, { 459 , 2644}, { 542 , 927}, { 941 , 948}, {1896 , 1528}, + { -19 , 1853}, { 455 , 366}, { 545 , 283}, { 831 , 835}, {1217 , 846}, { 560 , 542}, {1013 , 650}, {1905 , 2343} + }, + { + {-528 , -246}, {-631 , 56}, {-717 , -277}, { -40 , 1327}, {-1011 , -688}, {-827 , -341}, {-656 , -1599}, { -992 , -1559}, + {-450 , 933}, {-540 , 2109}, {-598 , -1267}, {-387 , -512}, {-1100 , -1979}, {-812 , -617}, {-649 , -147}, { -874 , 586}, + {-720 , -601}, {-281 , -279}, {-578 , 635}, { 169 , 80}, {-1020 , -134}, {-794 , 259}, {-638 , 821}, { -907 , 42}, + {-709 , -1525}, {-482 , 1340}, {-232 , -979}, { 104 , 2314}, { -918 , -1179}, {-790 , 1284}, {-609 , 2259}, { -854 , -978}, + {-624 , 326}, {-194 , 1705}, { -88 , 1060}, { 383 , 1190}, { -415 , 15}, {-789 , -1145}, {-604 , 407}, { -869 , 1136}, + {-503 , -1047}, {-545 , -794}, {-128 , 471}, { 84 , 638}, { -591 , -1509}, {-699 , 1746}, {-600 , -369}, { -784 , 1642}, + {-221 , -668}, {-223 , 261}, { -82 , -446}, {-378 , -1215}, { -741 , 969}, {-689 , -863}, {-569 , -595}, {-1012 , -403}, + {-331 , 518}, {-175 , 787}, {-220 , -3}, { -46 , -841}, { -960 , 297}, {-666 , 68}, {-565 , -1364}, { -265 , -21}, + { 649 , 767}, { 255 , 360}, { 338 , -342}, {1664 , 1627}, { 205 , -226}, { 967 , 31}, {1217 , 928}, { 1697 , 1233}, + { 322 , 1445}, { 320 , 1790}, { 413 , 212}, { 994 , 209}, { 766 , 264}, { 974 , 883}, {1228 , 241}, { 1679 , 801}, + { 75 , 312}, { 754 , 1425}, { 348 , 621}, { 644 , 474}, { 1008 , 763}, {1036 , 2024}, {1354 , 530}, { 1611 , 2129}, + { 162 , 931}, { 883 , 822}, { 990 , 488}, { 615 , -203}, { 1929 , 1234}, {1059 , 1375}, {1382 , 1426}, { 2048 , 1599}, + { 602 , 162}, { 380 , 820}, { 709 , 1064}, {1168 , 1374}, { 549 , 583}, {1062 , 470}, {1415 , 1092}, { 2095 , 2234}, + { 187 , -630}, { 118 , -493}, { 714 , 1787}, {1298 , 673}, { 957 , 1258}, {1082 , 1124}, {1460 , 786}, { 2124 , 1205}, + { 34 , -189}, { 54 , -35}, { 798 , 0}, { 747 , 2378}, { 1420 , 1152}, {1118 , 1673}, {1492 , 2287}, { 2416 , 1618}, + {1159 , 1795}, { 389 , -126}, {1194 , 1003}, {1578 , 1002}, { 1294 , 366}, {1148 , 694}, {1513 , 1791}, { 2746 , 2096} + } +}; + +const Word16 SN_TCVQ_CB_SUB2_fx[2][64][2] = +{//Qlog2(2.56) + { + {-709 , -609}, {-615 , -1025}, {-430 , -321}, { -44 , 1032}, {-1050 , -32}, {-1028 , -1856}, {-970 , -109}, { -572 , -1426}, + {-568 , 154}, {-142 , -189}, { -80 , 533}, { -38 , -632}, { -391 , 1275}, { -986 , -732}, {-479 , -510}, { -966 , 96}, + {-847 , -1387}, {-895 , 607}, {-368 , -930}, {-386 , 352}, { -290 , 10}, { -833 , 94}, {-528 , 1718}, { -210 , 115}, + {-529 , 857}, {-727 , -230}, {-128 , 31}, { 133 , 76}, { -275 , -777}, { -615 , -1367}, {-339 , -13}, {-1035 , 1231}, + { 448 , 851}, { 599 , 106}, {1103 , 1112}, { 635 , 1249}, { 761 , 774}, { 531 , -71}, { 722 , 473}, { 767 , 413}, + { 258 , 276}, { 346 , -380}, { 487 , 504}, {1114 , 122}, { 882 , 1553}, { 1983 , 1239}, {2126 , 1217}, { 1742 , 1262}, + { 135 , -252}, { 216 , 545}, { 500 , -125}, {1379 , 1910}, { 304 , 76}, { 1509 , 609}, {1543 , 1385}, { 542 , 1831}, + {-240 , -467}, { 771 , 652}, { 913 , 280}, {1307 , 716}, { 1834 , 1029}, { 1049 , 491}, {1624 , 733}, { 2495 , 1944} + }, + { + {-729 , -852}, {-590 , 306}, {-398 , 295}, { -31 , 13}, {-659 , -75}, {-604 , -1229}, {-519 , -675}, {-823 , 47}, + {-755 , -207}, {-818 , -424}, {-705 , -1285}, {-258 , -828}, {-807 , -707}, {-182 , -712}, {-928 , 3}, {-455 , -1149}, + {-844 , 422}, {-596 , -1008}, {-504 , -470}, {-459 , 737}, {-338 , -728}, {-836 , 1028}, {-613 , 1242}, {-609 , 1292}, + {-285 , 36}, {-280 , -424}, { 100 , 126}, {-459 , -135}, {-159 , -151}, {-287 , 190}, { 56 , -262}, {-264 , -317}, + { -8 , 603}, { 63 , 301}, { 537 , -155}, { 289 , 569}, { 193 , -412}, { 864 , 79}, { 686 , 399}, { 842 , 1657}, + { 115 , -211}, { 608 , 340}, { 12 , -650}, { 711 , 1103}, { 101 , 510}, { 358 , -416}, {1266 , 453}, { 532 , 612}, + {-256 , -680}, { 41 , 1163}, { 597 , 793}, { 484 , -61}, { 476 , 256}, {1729 , 1246}, {1209 , 1483}, {1472 , 1113}, + { 389 , 330}, { 176 , -388}, {1025 , 317}, {1049 , 732}, {1480 , 1108}, {1285 , 616}, {1730 , 999}, {2001 , 1669} + } +}; +const Word16 SN_TCVQ_CB_SUB3_fx[4][32][2] = +{//Qlog2(2.56) + { + {-377 , -872}, {-407 , 801}, {-611 , -449}, {-397 , -87}, {-476 , -1063}, {-797 , -249}, {-263 , -662}, {-473 , 1508}, + {-716 , 310}, {-616 , -982}, {-742 , -1326}, { 197 , 327}, {-894 , -1556}, {-871 , -1259}, {-708 , -1380}, {-789 , -848}, + { 64 , -313}, { -59 , -547}, { -2 , 67}, { 363 , -167}, { 633 , 1840}, { 232 , -357}, {1243 , 1492}, {1640 , 973}, + { 203 , 518}, { 511 , 946}, { 612 , 241}, {1085 , 724}, { 811 , 326}, { 863 , 241}, { 556 , 534}, {1956 , 2087} + }, + { + {-948 , 28}, {-827 , -1180}, {-348 , -331}, { -36 , 216}, {-1453 , -1162}, {-682 , -639}, {-747 , -1517}, {-704 , 1228}, + {-535 , -988}, {-550 , -109}, {-478 , 580}, {-310 , -699}, {-1308 , -225}, {-775 , -1581}, {-831 , -613}, {-120 , -222}, + { 32 , 200}, { 120 , -221}, { 470 , 466}, { 808 , 313}, { 950 , 711}, { 430 , -576}, {1984 , 1405}, {1645 , 887}, + { 131 , 1148}, { 286 , 508}, { 342 , -236}, {1003 , 1202}, { 317 , -726}, {1493 , 732}, {1336 , 694}, {2382 , 1772} + }, + { + {-874 , -374}, {-237 , 26}, { 15 , 870}, {-710 , 433}, { 40 , -769}, {-1059 , -1350}, { 65 , 208}, {-1012 , -1369}, + { -79 , -459}, {-671 , -942}, { -12 , 56}, {-162 , -431}, {-820 , -1073}, { -886 , -136}, {-327 , -501}, { -55 , -14}, + { 652 , 647}, { 365 , 411}, { 614 , 252}, { 154 , 215}, { 12 , 62}, { 226 , 177}, {1689 , 1213}, { 751 , 179}, + { 31 , 182}, { 281 , -291}, {-354 , -642}, { 939 , 924}, { 619 , 90}, { 1675 , 1130}, { 827 , 272}, { 1550 , 1446} + }, + { + {-366 , -916}, {-346 , -234}, {-518 , -140}, { 26 , 305}, {-254 , -92}, {-634 , -976}, {-493 , -1076}, {-334 , -913}, + {-566 , 68}, { 102 , 216}, {-296 , -927}, {-501 , -1030}, {-437 , -1006}, {-146 , -145}, {-211 , -202}, { 62 , 359}, + { 163 , -122}, { 759 , 553}, { 82 , 207}, {-177 , -243}, { 163 , 343}, {1152 , 929}, { 197 , 248}, { 43 , -147}, + { 169 , 371}, {-468 , -1043}, { 686 , 418}, { 563, 245}, {1052 , 843}, { 259 , 341}, {1063 , 637}, { 865 , 654} + } +}; + + +const Word16 AR_SVQ_CB1_fx[32][8] = /* x2.56 */ +{//Qlog2(2.56) + { -1, 4, 16, 4, 45, -110, 10, 167, }, + { -3, 2, 8, -12, -7, 23, 279, -46, }, + { 0, 2, 1, 8, -73, -40, 71, -97, }, + { 0, 2, 42, 74, -39, 72, 27, 8, }, + { 0, 1, 9, -6, 40, -65, -55, -128, }, + { 0, 0, 8, -10, -43, 105, -5, -126, }, + { 0, 0, 12, -3, -98, -18, -88, -73, }, + { 0, 1, -6, -12, -49, -179, -30, -15, }, + { -1, 0, 24, 78, 25, -69, -26, -14, }, + { 0, 1, -1, -29, 23, -65, -126, 34, }, + { 2, -4, -23, -7, -13, -2, -22, -4, }, + { -1, 1, -2, 44, -54, -58, 107, 60, }, + { 0, 1, -3, -15, -54, 97, -100, 41, }, + { 0, -2, -81, 93, -13, 18, -31, -75, }, + { -1, 2, 0, -5, 166, -64, -48, 8, }, + { -2, 0, -27, -108, 36, 3, 12, -80, }, + { 0, 0, 0, 4, 82, -1, 79, 54, }, + { 1, -4, 5, -9, -38, 289, 16, 16, }, + { -1, 2, 6, -68, 61, 67, -31, 100, }, + { 3, -6, 2, -2, -1, -6, -217, 273, }, + { 0, 1, -43, -62, -7, -60, 28, 78, }, + { -1, 2, 10, 0, 76, 84, -55, -45, }, + { -1, -2, 4, 5, -32, 75, 70, 176, }, + { 2, -1, 0, 6, 27, 29, -220, -97, }, + { -1, 1, 90, -56, -10, -16, 29, 8, }, + { -1, 3, -10, 0, 2, -24, 49, -336, }, + { -1, 1, -8, -9, 55, -134, 105, -44, }, + { 0, 1, -16, 69, 51, 40, -51, 98, }, + { 0, 2, -12, -32, -140, 49, 50, 26, }, + { 0, 3, 8, 29, 77, 24, 76, -103, }, + { -1, 2, -24, -18, 7, 100, 94, 5, }, + { 0, -1, 10, 26, -87, -34, -56, 103, } +}; + +const Word16 AR_SVQ_CB2_fx[16][8] = /* x2.56 */ +{//Qlog2(2.56) + { -37, -59, 208, -88, 54, 58, -16, -24, }, + { 0, -98, 9, -65, -182, -21, 19, 9, }, + { -1, 110, -8, 59, 201, 9, -38, -22, }, + { -1, 40, -22, -183, 46, -162, -38, -6, }, + { 12, 2, -193, 64, -43, -48, 11, 9, }, + { -83, 175, -8, -55, -65, 66, 26, 6, }, + { 29, 3, 2, -10, -100, 293, 75, -12, }, + { 7, -54, -76, -91, 63, 119, -84, -84, }, + { 3, 7, 6, 6, -30, 15, -176, 168, }, + { -10, 45, 26, 57, -92, -68, -117, -134, }, + { 0, -37, -34, -69, 106, 54, 121, 131, }, + { -25, -64, 7, 205, 1, 93, 27, 6, }, + { 64, 28, 51, 8, -7, 18, 27, 0, }, + { -20, 44, 57, 78, -55, -170, 88, 93, }, + { 12, -125, 12, 56, 100, -160, -87, -3, }, + { -7, -18, -7, -6, 36, -54, 175, -176, } +}; + + +const Word16 W_DTX_HO_FX[HO_HIST_SIZE] = /* Q15 */ +{ + 6554, 5243, 4194, 3355, 2684, 2147, 1718, 344 +}; + + +const Word16 ENR_ATT_fx[5] = /*Q8*/ +{ + 459, 357, 281, 255, 255 +}; + + +const Word16 HO_ATT_FX[5] = /* Q15 */ +{ + 17597, 20205, 22410, 23198, 23198 +}; + +const Word16 uniform_model[] = { MAX_AR_FREQ, MAX_AR_FREQ / 2, 0 }; // Q0 + + +/*-----------------------------------------------------------------* + * LSF quantization - mid-frame quantization tables + *-----------------------------------------------------------------*/ + + +const Word16 tbl_mid_gen_wb_2b_fx[] =//Q13 +{ + 3814, 5145, 5856, 5290, 5277, 4880, 4877, 4273, 3868, 3776, 3392, 3163, 3120, 3019, 3395, 5814, + 1482, 861, 1968, 3198, 3105, 3737, 3749, 4525, 4982, 4828, 5023, 5335, 5327, 5296, 5092, 3444, + 3955, 3851, 1520, 1666, 1554, 1385, 1537, 1276, 1443, 1526, 1597, 1636, 1867, 2041, 2483, 2059, + 7038, 8112, 7324, 6969, 6877, 7028, 6987, 7098, 7003, 6955, 6927, 6808, 6685, 6459, 5871, 6047, +}; + +const Word16 tbl_mid_gen_wb_4b_fx[] = +{//Q13 + 5532, 5133, 2125, 3516, 4905, 5624, 6338, 6918, 6854, 6354, 5345, 3996, 3603, 5588, 6962, 7511, + 4218, 4157, 4892, 6332, 5786, 2931, 2749, 2306, 3420, 4629, 5591, 6249, 6638, 7273, 7904, 8379, + 993, 369, 2927, 5138, 4840, 5892, 5331, 5158, 3956, 3130, 3324, 5022, 5292, 3974, 2488, 1119, + 1067, 2471, 6356, 4184, 3166, 3224, 3980, 5055, 4965, 4822, 3843, 2328, 1438, 916, 2514, 8248, + 3788, 949, 522, 1709, 1932, 3306, 3287, 4521, 5432, 5291, 5644, 6116, 6166, 5943, 5631, 2088, + 7865, 8237, 6466, 4043, 3793, 4589, 4885, 5405, 6002, 6746, 7203, 7361, 6982, 6157, 3994, 2143, + 2837, 7217, 7926, 7751, 7605, 7549, 6937, 6852, 6270, 5895, 5612, 5245, 4862, 3654, 3139, 6321, + 4317, 3387, 1035, 2799, 2769, 3400, 3054, 2246, 2307, 1829, 1456, 1007, 1055, 895, 782, 108, + 7164, 8021, 6869, 6458, 6311, 5505, 5577, 4491, 3934, 3760, 3244, 2798, 2498, 2166, 1950, 4759, + 5758, 5400, 1203, 687, 647, 963, 1486, 2000, 2998, 3179, 3634, 4296, 4465, 3719, 3275, 4785, + 1051, 1802, 6133, 6475, 6875, 6981, 7181, 7303, 7136, 7036, 7276, 7197, 6986, 7118, 6659, 5813, + 4095, 6275, 6049, 4850, 3198, 4942, 3257, 1456, 1327, 504, 559, 1472, 3985, 5835, 5772, 7356, + 6814, 7430, 4049, 2579, 4315, 2443, 3236, 3107, 2458, 2891, 2553, 1923, 1871, 2068, 3583, -188, + 412, 238, 247, 507, 498, 540, 811, 767, 679, 480, 416, 306, 574, 532, 731, 2227, + 8495, 9589, 8346, 7953, 7655, 7990, 8089, 8412, 8530, 8482, 8421, 8420, 8464, 8242, 7698, 7341, + 3085, 2920, 3059, 3020, 1227, -101, -417, -872, -195, 1126, 1766, 2513, 2649, 3451, 4444, 1734 +}; + + +const Word16 tbl_mid_gen_wb_5b_fx[] = +{//Q13 + 6510, 8058, 7103, 6095, 6483, 5866, 6026, 6443, 6882, 6907, 7015, 6581, 5649, 4044, 2816, 2519, + 3778, 2123, 3580, 4221, 2598, 4631, 2844, 4905, 5446, 4529, 5186, 6228, 6210, 5693, 6213, -4670, + 9050, 9934, 8441, 7921, 7546, 7840, 7977, 8335, 8679, 8706, 8703, 8607, 8560, 8375, 7759, 6405, + 4243, 5775, 2939, 5887, 4078, 3117, 5267, 5680, 4589, 2401, 731, 1011, 1657, 4733, 7051, 3992, + 2508, 3156, 3347, 1605, 4450, 4633, 3476, 6019, 4083, 3824, 5133, 6020, 3253, 1368, 1736, 13507, + 5934, 6372, 4494, 2957, 4424, 6667, 8167, 8413, 7957, 7139, 5518, 3059, 2829, 2821, 2773, 3274, + 4984, 5566, 5831, 4556, 5732, 6738, 6689, 4683, 2265, 4214, 7242, 9989, 9776, 9068, 4748, 2292, + 2601, 4933, 2764, 4923, 3763, 3678, 5596, 2079, 6108, 6824, 5507, 5612, 6793, 5553, 1140, 9993, + 7084, 6685, 5313, 5196, 3111, 5337, 3535, 2476, 2477, 1737, 2090, 4033, 5680, 6548, 7310, 11811, + 8140, 8602, 7166, 6738, 6018, 5299, 5686, 4722, 4108, 4456, 3713, 3131, 2658, 2336, 2250, 8051, + 727, 1865, 6073, 3932, 2258, 2413, 4823, 5733, 5101, 6126, 4690, 1130, 1172, 1479, 3956, 7204, + 6042, 1024, 5371, 5997, 4964, 5575, 5078, 5843, 6909, 8465, 8601, 6137, 5699, 8049, 9922, 8318, + 2728, 1625, 4750, 5004, 5799, 4938, 6353, 3274, 1781, 3095, 1479, 3136, 5470, 1391, -626, 2422, + 4407, 3228, 1266, 1488, 1222, 963, 1148, 1182, 1330, 1770, 860, 381, 813, 1268, 2352, 3956, + 1683, -120, 83, 1239, 946, 1609, 1982, 3215, 3950, 4200, 4497, 4898, 4551, 3595, 2345, 2444, + 1055, 3207, 7460, 6808, 7103, 6980, 7902, 8196, 6821, 6190, 6405, 7414, 7967, 7506, 6921, 9871, + 3164, 7995, 8446, 8770, 8443, 8302, 7372, 7049, 6090, 5698, 5090, 4792, 4996, 4874, 4285, 6685, + 3681, 319, 536, 3174, 4495, 5486, 5807, 5751, 5461, 4423, 3556, 3449, 5148, 7560, 6277, 3783, + 1987, 4209, 6954, 5880, 7459, 7762, 4326, 4958, 5154, 2150, 2988, 2469, 1175, 1099, 3999, 3950, + 1306, 2303, 7748, 8238, 6116, 2824, 1772, 1130, 2538, 3345, 5317, 4773, 3668, 5458, 5519, 5594, + 4140, 4329, 3339, 3001, 2669, -79, -582, -1729, -680, 1294, 2752, 3700, 3627, 4428, 4950, 2744, + 5309, 3611, 993, 3526, 2043, 3938, 2069, 1434, 4173, 2609, 2704, 3690, 3686, 1894, 1401, -1682, + 6091, 4810, 970, 1063, 1707, 3056, 4597, 6742, 7397, 6913, 7359, 7884, 7571, 6830, 6039, 3823, + 6599, 6006, 1248, 4330, 6935, 3784, 3535, 3902, 3221, 5384, 5691, 5997, 5975, 6731, 9125, 5385, + 204, 242, 2009, 3375, 3412, 3407, 2691, 2547, 598, -150, 67, 250, 618, 1185, 1987, 1157, + 4986, 7977, 6971, 1528, 86, 281, 1497, 3002, 4193, 4430, 4721, 5317, 6001, 6181, 6962, 5480, + 6914, 7963, 5254, 3050, 5365, 3224, 3781, 3044, 2571, 3155, 2243, 1612, 2157, 2526, 2784, -1629, + 7350, 6702, 2435, 1937, 2549, 1978, 2819, 2817, 2059, 2493, 3408, 2344, 1239, 1177, 914, 3763, + 4362, 3105, -1457, -1760, 314, 1452, 2603, 1642, 1670, 1652, 2258, 2492, 3844, 4399, 5213, 660, + 350, 357, 109, 83, -555, -886, -714, -587, -120, 25, 189, 531, 591, 146, 156, 1435, + 498, 211, 3062, 6766, 7150, 8142, 7531, 7527, 7855, 6898, 6613, 6480, 5290, 4310, 5341, 4129, + 2753, 6959, 7088, 4622, 2646, 2395, 1756, 325, 488, 259, -125, -577, -553, 615, 557, 4617, +}; + + + +const Word16 tbl_mid_voi_wb_1b_fx[] = /* Q13*/ +{ + 4551, 4599, 4754, 5035, 4982, 5228, 5318, 5603, 5699, 5652, 5642, 5766, 5825, 5874, 5819, 6056, + 3816, 3355, 2321, 2712, 2900, 2715, 2790, 2508, 2506, 2610, 2617, 2419, 2538, 2622, 3004, 2725, +}; +const Word16 tbl_mid_voi_wb_4b_fx[] =//Q13 +{ + 4337, 4235, 3526, 4083, 3514, 5457, 3168, 2509, 4418, 5021, 1313, 2952, 5347, 3893, 8325, 11758, + 4180, 4037, 3965, 3481, 4028, 3284, 2644, 4585, 4749, 3076, 3211, 1101, 4175, 7440, 5745, -4105, + 4239, 3957, 4450, 4974, 5400, 5734, 6246, 6586, 7774, 2699, 2783, 3474, 1345, -316, 5069, 4904, + 3964, 3810, 2673, 3031, 2249, 3168, 3155, 4204, 7316, 7176, 8680, 7147, 4918, 4136, 3142, 3011, + 4071, 3853, 3898, 3973, 3464, 2878, 5783, 5341, 1725, 801, 1194, 4239, 6866, 4950, 794, 6270, + 3933, 3750, 4931, 3667, 3585, 2550, 4308, 5757, 4503, 7081, 4893, 1076, 109, 1650, 1887, 8861, + 4803, 4827, 4969, 5511, 5768, 4327, 5277, 4934, 6909, 7672, 5355, 3940, 9990, 9622, 7457, 4202, + 4515, 4259, 2444, 4847, 3728, 4599, 4975, 6144, 4087, 4367, 7025, 5028, 2405, 7014, 13366, 6264, + 4746, 4556, 5408, 5866, 4733, 4088, 3965, 3329, 4669, 3105, 5918, 7824, 6026, 9177, 1856, 13229, + 4130, 4214, 2516, 3542, 4847, 3751, 3704, 2380, 4190, 4787, 4651, 4981, 5702, -27, -2961, 129, + 4461, 4724, 5233, 4680, 6010, 7222, 6351, 3069, 605, 5934, 5627, 3836, 3490, 6060, 3556, 2585, + 4628, 4723, 5465, 4180, 4460, 6173, 5915, 7260, 4703, 4114, 3938, 9585, 8085, 3781, 7520, 625, + 5002, 5621, 6352, 6914, 7170, 7719, 7585, 8408, 8360, 7883, 7370, 7222, 6616, 6002, 5565, 9394, + 4059, 4121, 4178, 4417, 3437, 1460, 1031, 111, 585, 1708, 4219, 5419, 2585, 3195, 6149, 3221, + 3394, 2776, 1970, 2707, 2983, 3931, 3247, 1729, 449, -109, -46, -469, 397, 1980, 2305, 1573, + 3259, 1870, 242, 392, 748, 615, 1185, 1285, 2259, 2687, 2212, 1762, 2174, 1887, 1847, 2073, +}; +const Word16 tbl_mid_voi_wb_5b_fx[] =//Q13 +{ + 4182, 3820, 4103, 5620, 4100, 4478, 3949, 5053, 2918, 3083, 4229, 3732, 1823, 6350, 17230, 4601, + 4361, 4077, 2236, 4128, 3216, 4673, 6022, 6522, 5746, 4282, 3121, 4448, 6457, 12573, 4401, 7796, + 4228, 4086, 4375, 4320, 4474, 4735, 4427, 5616, 5975, 138, 5887, 3722, 2304, -3430, 4995, 6246, + 4320, 4344, 4008, 4327, 3323, 6835, 3627, 3330, 3123, 3971, 2382, 1801, 6422, 3162, 9038, 14129, + 4193, 4202, 4413, 2703, 4175, 4330, 2615, 7600, 1717, 3506, 5671, 7170, 3545, 2350, -2738, 7287, + 4170, 3912, 4323, 3821, 4450, 6765, 7496, 8107, 7447, 5525, 3088, 1963, 2014, 3330, 976, 1002, + 4583, 4419, 3584, 4125, 4783, 5133, 3188, 5000, 4812, 4639, 10038, 7018, 5114, 5567, 3292, -6364, + 3926, 4092, 2710, 2721, 1799, 3509, 4542, 3351, 4583, 5877, 6539, 5135, 981, 4029, 7221, 592, + 4624, 4567, 4468, 4630, 5710, 5222, 5883, 2562, 8453, 2825, 109, 6491, 1210, 2921, 7292, 7118, + 4245, 4160, 5119, 4356, 5544, 3034, 1507, 4179, 5971, 1949, 3388, 613, 4995, 9019, 6755, -628, + 4905, 4962, 4529, 7025, 4905, 4470, 5063, 3440, 6348, 6102, 4319, 4395, 7515, 6549, -3697, 6513, + 4683, 4592, 5303, 4593, 4171, 5264, 6116, 7434, 4105, 5454, 2544, 8493, 6491, 894, 8983, -2406, + 3632, 3435, 3988, 4195, 3684, 2173, 6735, 4552, -339, 763, 308, 3463, 6123, 2895, 2831, 5715, + 4316, 4111, 2236, 2682, 1058, 544, 2541, 1677, 3549, 2767, 3376, 5901, 6689, 5811, 6617, 3311, + 4487, 4285, 4992, 3656, 5970, 4547, 3975, 5998, 4985, 6614, 4807, 1971, 14937, 4388, 6153, 3352, + 4601, 4710, 4957, 4454, 4873, 7207, 5881, 3461, 2282, 1829, 5617, 9926, 10043, 7722, 3232, 4629, + 3965, 3837, 2088, 4265, 5042, 3478, 4453, 2804, 4162, 4858, 4315, 4343, 5193, -1823, -5028, -1137, + 3439, 2837, 2549, 4062, 2857, 2657, 2662, 5088, 10548, 8913, 6631, 6395, 5568, 3210, 2431, 3400, + 4073, 3839, 5806, 5296, 3766, 2342, 2585, 891, 3144, 2988, 6807, 4626, 3700, 5854, 1543, 16158, + 4189, 4045, 4293, 4527, 4008, 1413, 4871, 6081, 3297, 6546, 5006, -365, -2369, 1375, 5522, 8787, + 4778, 4782, 4941, 4538, 4497, 3129, 4934, 4371, 7175, 6923, 8620, 10236, 8664, 10088, 10923, 7314, + 4945, 5016, 6439, 6353, 6624, 6463, 6938, 7547, 7004, 7283, 7655, 7149, 7650, 2747, 3416, 14892, + 4776, 5431, 5515, 6194, 5700, 5485, 2795, 5476, 4024, 8891, 2930, 7916, 3428, 8070, 5920, 13440, + 4718, 4986, 4800, 5286, 6567, 6554, 6601, 1235, -1216, 6556, 6098, 3962, 4361, 5536, 5517, 3935, + 4741, 4679, 5593, 4891, 3849, 5675, 6487, 6239, 7062, 12044, 10918, 2438, 3977, 7296, 8445, 6625, + 4859, 5781, 6592, 7399, 8027, 8858, 8139, 8951, 8760, 5506, 6294, 6540, 6516, 7527, 7688, 4084, + 4077, 3771, 3650, 3381, 3367, 4048, 3899, 4382, 3017, -2156, -1464, -2207, 828, 4838, 2071, 2363, + 3796, 3437, 3558, 3842, 2170, 4311, 2602, 696, 1939, 2576, 1239, 328, -129, -647, 1702, 2893, + 4015, 3506, 367, 1350, 3328, 3700, 3827, 2439, 1434, 3887, 2279, 1593, 3673, 5508, 3905, -2973, + 4088, 3990, 3732, 3256, 4718, 1375, 152, -99, -254, 1140, 3578, 3316, 2195, 2408, 5027, 999, + 3749, 3175, 1475, 686, 2006, 1959, 1558, 3059, 5374, 5014, 2439, 2396, 2467, 2218, 1031, 7866, + 2037, 701, 124, 278, 328, 253, 660, 528, 826, 473, 801, 800, 1053, 1330, 804, 967, +}; + + +const Word16 tbl_mid_unv_wb_4b_fx[] =//Q13 +{ + 5190, 3143, 50, 2521, 5180, 6320, 3890, 3365, 3582, 3517, 3406, 3049, 2864, 1621, 1932, -950, + 6813, 6650, 2135, 972, 452, 1453, 3221, 1697, 3165, 4443, 5924, 6297, 3907, 2862, 3586, 4625, + 3204, 2673, 6499, 4319, 1054, 559, 4404, 5815, 5072, 6625, 4493, 2479, 1773, 1606, 2099, 8330, + 1924, 2666, 4171, 5517, 5898, 7238, 7318, 7696, 7250, 6269, 6164, 6038, 5249, 4284, 4147, 2828, + 2834, 788, 77, 2016, 1824, 3224, 3441, 4472, 6286, 6717, 6783, 6743, 6715, 7051, 6562, 2531, + 6386, 5634, 5761, 5184, 3523, 4284, 1867, 1045, 579, 1176, 1743, 2599, 5276, 5564, 5368, 7914, + 1795, 1380, 5184, 9326, 8023, 3138, 1258, 1729, 3328, 3934, 5169, 5645, 5271, 5894, 5591, 5145, + 5734, 5844, 8799, 8753, 5628, 5710, 5255, 4872, 5349, 3431, 3006, 2486, 1418, 974, 1115, 2035, + 4194, 8421, 1812, 6078, 3003, 3455, 6719, 7501, 2120, 1892, 2658, 2317, 2296, 5735, 6553, 4485, + 8072, 11456, 6455, 5069, 4918, 4936, 4819, 4932, 6029, 6246, 6289, 6704, 6749, 5337, 4526, 3974, + 3709, 5584, 4884, -1502, 4864, 2333, 606, 5976, 6438, 2413, 1937, 3663, 5593, 6989, 6450, 3555, + 3843, -6887, 3697, 3880, 4448, 4264, 5961, 4198, 3583, 3942, 3606, 3768, 4457, 4374, 4096, 4524, + 2551, 6781, 7017, 2902, 9227, 8728, 7130, 1873, 2308, 4393, 3981, 3976, 4002, 4080, 4820, 5611, + 220, -174, -43, -542, 449, 1470, 1759, 1893, 1294, 995, 723, 723, 769, 994, 1369, 4413, + 1651, 2259, 3079, 2913, 1176, -491, -1262, -827, -217, 908, 1126, 1751, 1901, 1765, 2656, 247, + 5380, 7307, 7727, 8135, 8270, 8471, 8792, 8573, 8335, 8420, 8057, 7562, 7119, 7458, 6806, 7385, +}; +const Word16 tbl_mid_unv_wb_5b_fx[] = +{//Q13 + 6237, 6323, 1151, 763, 4218, 6546, 8437, 8701, 7456, 6604, 4631, 2901, 3050, 1793, 1955, 2260, + 5542, 4318, 5343, 5521, 5999, 5477, 5265, 5234, 4616, 3329, 3444, 1816, -442, 45, -2, 8922, + 6370, 8208, 6583, 5630, 5401, 5458, 5188, 5595, 6637, 6891, 6962, 6967, 7014, 6330, 5445, 3101, + 2750, 2858, 5206, 4594, 3310, 3494, 2463, 3410, 3405, 6151, 7682, 8593, 4440, 3715, 2946, -4371, + 1157, 661, 3743, 6418, 7515, 8319, 7485, 7298, 7928, 7515, 6812, 5671, 5095, 5122, 4997, 3940, + 5133, 3446, 2693, 1620, 1860, 2663, 4603, 6289, 7451, 7255, 7511, 7486, 8869, 8704, 8431, 6632, + 2497, 6706, 7036, 3437, 10854, 8893, 6033, 3021, 2936, 4766, 4145, 4097, 5177, 4883, 5920, 7612, + -152, -54, 3955, 1170, 5562, 4695, 1370, 8293, 3106, 1942, 5508, 4878, 3495, 1094, 1079, 5401, + 482, 373, 220, -355, -236, -328, -426, -147, 244, 563, 567, 915, 1012, 676, 804, 2721, + 437, 816, 3208, 3395, 2501, 3795, 4380, 2553, 399, 31, -519, -475, -162, 1755, 2852, 1040, + 2067, 2125, 1247, 2393, 2872, 2218, 3502, 3977, 4712, 4275, 2600, 2380, 2314, 2893, 3555, 13929, + 3967, -635, -1752, 2490, 303, 969, 1045, 2839, 5670, 4651, 5202, 5248, 4182, 4381, 5492, 53, + 3041, 2494, 9264, 4970, 360, -3795, 6296, 6475, 4482, 6667, 5265, 2908, 2381, 2889, 3718, 5160, + 3364, 4119, 5929, 3164, -745, 9368, 1652, -719, 6323, 5113, 1919, 1260, 2630, 3585, 2224, 3178, + 1643, 837, 8074, 8337, 4237, 2332, 2190, -1176, 1968, 1238, 2354, 4756, 5269, 5759, 4962, 5411, + 7590, 6471, 2635, 1869, 1209, 1505, 2118, 892, 1652, 3717, 5010, 3969, 2265, 2428, 3278, 5027, + 7289, 8658, 11183, 8913, 6084, 6673, 5961, 4041, 3839, 2643, 2094, 3215, 2956, 2895, 3327, 5063, + 5814, -4982, 1120, 2112, 4384, 5288, 6052, 4305, 4724, 5062, 3380, 4200, 5838, 7181, 6383, 4771, + 3891, 7361, 4160, 1422, 4971, 939, 281, 3585, 4817, 1176, -306, 260, 3815, 8273, 7095, 1529, + 8179, 19416, 3518, 3547, 4619, 4231, 3359, 3606, 5131, 4469, 5204, 5115, 4941, 4772, 4175, 5160, + 4539, 5393, 2706, 5371, 1468, 8488, 10356, 2778, 1426, 371, 8093, 7808, 5208, 5996, 6081, 5057, + 3266, 3481, -4953, -5638, 4022, 5502, 3586, 3117, 2737, 3826, 3658, 3933, 3602, 4920, 4959, 3483, + 3846, 9592, 3360, 6480, 1215, 3170, 5218, 8641, 664, 2695, 3353, 1479, 1687, 6049, 7074, 4696, + 2231, 4497, 6761, 6799, 5941, 5445, 8083, 7944, 5879, 3744, 2518, 6482, 6581, 6096, 6379, -133, + 3360, 6078, 1064, 13807, 8185, 3605, 4327, 3777, 6211, 4977, 5015, 4871, 5825, 2506, 2130, 4946, + 5412, 4507, 952, 4098, 5027, 3949, 3501, 1778, 1955, 2126, 1626, 3669, 4446, -1101, 736, -2708, + 4824, 7481, 8884, -2619, -2754, 281, 4158, 3251, 4602, 2946, 3915, 6169, 6075, 3495, 3266, 4375, + 6135, 2668, 6784, 10326, 6892, 5479, 1511, 3070, 6410, 9193, 6954, 1084, 2873, 7030, 8139, 5670, + 7255, 5764, 5122, 5787, 3129, 5475, -2720, 3770, -827, 872, 1591, 4645, 7218, 5513, 5778, 6323, + 1185, -13100, 5560, 5867, 4153, 2591, 4923, 3450, 2062, 4251, 4289, 3397, 3835, 2082, 2343, 3172, + 4460, 4411, 3940, 4420, 9410, -2789, -2525, -2877, -1868, 2850, 4490, 4093, 3162, 3889, 3800, 3492, + 6408, 8292, 8434, 8544, 8707, 9146, 9377, 9301, 9063, 8945, 8346, 8173, 7175, 7254, 6120, 7420, +}; + + +/*------------------------------------------------------------------------------* + * AVQ - RE8 tables + *------------------------------------------------------------------------------*/ + +const Word16 select_table22[5][9] = +{ + {1, 1, 1, 1, 1, 1, 1, 1, 1}, + {0, 1, 2, 3, 4, 5, 6, 7, 8}, + {0, 0, 1, 3, 6, 10, 15, 21, 28}, + {0, 0, 0, 1, 4, 10, 20, 35, 56}, + {0, 0, 0, 0, 1, 5, 15, 35, 70} +}; // Q0 + +/* value of leader element */ +const Word16 vals_a[36][4] = +{ + {1}, {0,2}, {0,2}, {1,3}, {0,4}, {2,0}, {1,3}, {0,2,4}, + {2}, {1,3}, {2,0,4}, {0,4}, {1,5}, {1,3}, {2,0,4}, {0,2,4}, + {1,3,5}, {0,2,6}, {0,4}, {0,2,6}, {0,2,4,6}, {1,7}, {0,8}, {0,6}, + {0,2,8}, {0,4,8}, {1,9}, {0,2,10}, {0,8}, {0,6,10}, {0,12}, {0,4,12}, + {0,10}, {0,2,14}, {0,8,12}, {0,16} +}; // Q0 + +/* code parameter for every leader */ +const Word16 vals_q[36][4] = +{ + {7,1}, {2,2,2}, {4,2,4}, {7,2,1}, {1,2,1}, {6,2,2}, {7,2,2}, {3,3,3,1}, + {8,1}, {7,2,3}, {5,3,4,1}, {2,2,2}, {7,2,1}, {7,2,4}, {7,3,2,1}, {4,3,4,2}, + {7,3,2,1}, {2,3,2,1}, {3,2,3}, {4,3,4,1}, {3,4,3,2}, {7,2,1}, {1,2,1}, {2,2,2}, + {3,3,3,1}, {2,3,2,1}, {7,2,1}, {2,3,2,1}, {2,2,2}, {2,3,2,1}, {1,2,1}, {2,3,2,1}, + {2,2,2}, {2,3,2,1}, {2,3,2,1}, {1,2,1} +}; // Q0 + +/* codebook start address for every leader */ +const UWord16 Is[36] = +{ + 0, 128, 256, 1376, 240, 0, 1792, 2400, 5376, 5632, 12800, 3744, + 21760, 22784, 31744, 38912, 45632, 3856, 52800, 53248, 57728, 60416, 4080, 61440, + 61552, 62896, 63120, 64144, 64368, 64480, 64704, 64720, 64944, 65056, 65280, 65504 +}; // Q0 + +/* A3 - Number of the absolute leaders in codebook Q3 */ +const Word16 AA3[NB_LDQ3] = +{ + 0, 1, 4, 2, 3, 7, 11, 17, 22 +}; // Q0 + +/* A4 - Number of the absolute leaders in codebook Q4 */ +const Word16 AA4[NB_LDQ4] = +{ + 5, 6, 8, 9, 10, 12, 13, 14, 15, + 16, 18, 19, 20, 21, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35 +}; // Q0 + +/* I3 - Cardinality offsets for absolute leaders in Q3 */ +const UWord16 II3[NB_LDQ3] = +{ + 0, 128, 240, 256, 1376, 2400, 3744, 3856, 4080 +}; // Q0 + +/* I4 - Cardinality offset for absolute leaders in Q4 */ +const UWord16 II4[NB_LDQ4] = +{ + 0, 1792, 5376, 5632, 12800, 21760, 22784, 31744, 38912, + 45632, 52800, 53248, 57728, 60416, 61440, 61552, 62896, 63120, + 64144, 64368, 64480, 64704, 64720, 64944, 65056, 65280, 65504 +}; // Q0 + + /* Position of the first absolute leader on a spherical shell (or sphere) */ +const Word16 Da_pos[NB_SPHERE] = +{ + 0, 2, 5, 8, 13, 18, 20, 22, 23, 25, 26, 27, 27, 28, 28, 28, + 29, 30, 31, 31, 32, 32, 32, 32, 32, 34, 35, 35, 35, 35, 35, 35 +}; // Q0 + +/* Number of absolute leaders on a spherical shell */ +const Word16 Da_nb[NB_SPHERE] = +{ + 2, 3, 3, 5, 5, 2, 2, 1, 2, 1, 1, 0, 1, 0, 0, 1, + 1, 1, 0, 1, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1 +}; // Q0 + +/* Identification code of an absolute leader */ +const Word16 Da_id[NB_LEADER] = +{ + 0x0001, 0x0004, 0x0008, 0x000B, 0x0020, 0x000C, 0x0015, 0x0024, + 0x0010, 0x001F, 0x0028, 0x0040, 0x004F, 0x0029, 0x002C, 0x0044, + 0x0059, 0x00A4, 0x0060, 0x00A8, 0x00C4, 0x012D, 0x0200, 0x0144, + 0x0204, 0x0220, 0x0335, 0x04E4, 0x0400, 0x0584, 0x0A20, 0x0A40, + 0x09C4, 0x12C4, 0x0C20, 0x2000 +}; // Q0 + +/* Codebook number for each absolute leader */ +const Word16 Da_nq[NB_LEADER+2] = +{ + 2, 2, 3, 3, 2, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 4, + 4, 3, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 0, 100 +}; // Q0 + + +/*------------------------------------------------------------------------------* + * SWB TBE tables + *------------------------------------------------------------------------------*/ + +const Word16 skip_bands_SWB_TBE[NUM_SHB_SUBFR+1] = {0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300, 320}; /* bands for SWB TBE quantisation Q0*/ +const Word16 skip_bands_WB_TBE[NUM_SHB_SUBFR/2+1] = {0, 10, 20, 30, 40, 50, 60, 70, 80}; /* bands for WB TBE quantisation Q0*/ + +const Word16 interpol_frac_shb[NB_SUBFR * 2] = +{ + 22938, 9830, 13107, 19660, 3277, 29490, 0, 32767 /* Q15*/ + /*0.7f, 0.3f, 0.4f, 0.6f, 0.1f, 0.9f, 0.0f, 1.0f */ +}; +/* All pass filter coeffs for interpolation and decimation by a factor of 2 */ +const Word16 AP1_STEEP_FX[ALLPASSSECTIONS_STEEP] = { 1985, 14072, 26500 }; /*Q15 Format */ +const Word16 AP2_STEEP_FX[ALLPASSSECTIONS_STEEP] = { 7230, 20838, 30852 }; /*Q15 Format */ +const Word16 cos_fb_exc_fx[32] = /* Q15 */ +{ + /*Q35*/ + 32767, 32138, 30274, 27246, 23170, 18205, 12540, 6393, + 0, -6393, -12540, -18205, -23170, -27246, -30274, -32138, + -32768, -32138, -30274, -27246, -23170, -18205, -12540, -6393, + 0, 6393, 12540, 18205, 23170, 27246, 30274, 32138, +}; + +const Word16 Hilbert_coeffs_fx[4 * NUM_HILBERTS][HILBERT_ORDER1 + 1] = /* Q14 */ +{ + { 0, 14320, 0, -30699, 0, 16384}, /* num_Real[0] */ + {11897, 0, -28240, 0, 16384, 0}, /* num_Imag[0] */ + {16384, 0, -30699, 0, 14320, 0}, /* den_Real[0] */ + {16384, 0, -28240, 0, 11897, 0}, /* den_Imag[0] */ + {7671, 0, -23855, 0, 16384, 0}, /* num_Real[1] */ + { 2505, 0, -18139, 0, 16384, 0}, /* num_Imag[1] */ + {16384, 0, -23855, 0, 7671, 0}, /* den_Imag[1] */ + {16384, 0, -18139, 0, 2505, 0}, /* den_Imag[1] */ +}; + + +/* Overlap add window for SHB excitation used in analysis and synthesis */ + +const Word16 window_shb_fx[L_SHB_LAHEAD] = /*sin, 1, sin */ +{ + /*Q15(round) */ + 1513, 4527, 7502, 10413, 13236, 15945, 18518, 20934, 23170, 25210, + 27034, 28627, 29976, 31069, 31898, 32454, 32733, 32767, 32767, 32767, +}; + +/* Upsampled overlap add window for SHB excitation used transition generation */ + +const Word16 window_shb_32k_fx[2 * L_SHB_LAHEAD] = +{ + /*Q15(round) */ + 1513, 3020, 4527, 6015, 7502, 8958, 10413, 11825, 13236, 14590, + 15945, 17232, 18518, 19726, 20934, 22052, 23170, 24190, 25210, 26122, + 27034, 27830, 28627, 29301, 29976, 30523, 31069, 31483, 31898, 32176, + 32454, 32593, 32733, 32751, 32767, 32767, 32767, 32767, 32767, 32767, +}; + +/* Short overlap add window for SHB excitation used in anal and synth */ + +const Word16 subwin_shb_fx[SHB_OVERLAP_LEN + 1] = +{ + /*Q15(round) */ + 0, 202, 802, 1786, 3129, + 4799, 6754, 8946, 11321, 13821, + 16384,18947, 21447, 23822, 26014, + 27969, 29639, 30982, 31966, 32566, + 32767 +}; + +const Word16 window_wb_fx[L_SHB_LAHEAD / 4] =/*sin, 1 */ +{ 7502, 18518, 27034, 31898, 32767 }; /*Q15*/ + +/* Short overlap add window for SHB excitation used in anal and synth */ + +const Word16 subwin_wb_fx[SHB_OVERLAP_LEN / 2 + 1] = +{ 0, 5126, 10126, 14876, 19261, 23170, 26510, 29197, 31164, 32365, 32767 }; // Q15 + +/* Window for calculating SHB LPC coeffs */ + +const Word16 win_lpc_shb_fx[(L_LOOK_12k8 + L_SUBFR + L_FRAME) * 5 / 8] = +{ + /*Q15 */ + 1, 4, 10, 18, 28, 40, 54, 71, 89, 110, 134, 159, 186, 216, 248, + 282, 318, 357, 397, 440, 485, 532, 581, 632, 686, 741, 799, 859, 921, + 984, 1050, 1119, 1189, 1261, 1335, 1411, 1490, 1570, 1652, 1736, 1823, + 1911, 2001, 2093, 2187, 2283, 2381, 2481, 2582, 2686, 2791, 2898, 3007, + 3118, 3230, 3345, 3461, 3579, 3698, 3819, 3942, 4067, 4193, 4321, 4451, + 4582, 4715, 4849, 4985, 5123, 5261, 5402, 5544, 5687, 5832, 5978, 6126, + 6275, 6426, 6577, 6730, 6885, 7041, 7197, 7356, 7515, 7676, 7837, 8000, + 8164, 8329, 8496, 8663, 8831, 9001, 9171, 9342, 9515, 9688, 9862, 10037, + 10213, 10390, 10567, 10745, 10924, 11104, 11285, 11466, 11648, 11830, 12013, + 12197, 12381, 12566, 12751, 12937, 13123, 13310, 13497, 13684, 13872, 14060, + 14249, 14438, 14627, 14816, 15006, 15195, 15385, 15575, 15765, 15955, 16146, + 16336, 16526, 16716, 16907, 17097, 17287, 17477, 17667, 17856, 18046, 18235, + 18424, 18612, 18801, 18989, 19176, 19364, 19551, 19737, 19923, 20109, 20294, + 20478, 20662, 20846, 21028, 21210, 21392, 21573, 21753, 21932, 22111, 22289, + 22466, 22642, 22818, 22992, 23166, 23339, 23510, 23681, 23851, 24020, 24188, + 24355, 24520, 24685, 24848, 25011, 25172, 25332, 25491, 25648, 25804, 25960, + 26113, 26266, 26417, 26567, 26715, 26862, 27007, 27152, 27294, 27435, 27575, + 27713, 27850, 27985, 28119, 28251, 28381, 28510, 28637, 28762, 28886, 29008, + 29129, 29248, 29364, 29480, 29593, 29705, 29815, 29923, 30029, 30133, 30236, + 30337, 30435, 30532, 30627, 30720, 30811, 30901, 30988, 31073, 31156, 31238, + 31317, 31394, 31469, 31543, 31614, 31683, 31750, 31815, 31878, 31938, 31997, + 32054, 32108, 32161, 32211, 32259, 32305, 32349, 32390, 32430, 32467, 32502, + 32535, 32566, 32595, 32621, 32645, 32667, 32687, 32705, 32720, 32734, 32745, + 32753, 32760, 32765, 32767 +}; + + +const Word16 win_lpc_hb_wb_fx[(L_LOOK_12k8 + L_SUBFR + L_FRAME) * 5 / 32] = +{//Q15 + 17, 70, 157, 279, 435, 625, 849, 1106, + 1396, 1718, 2071, 2454, 2867, 3309, 3779, 4276, + 4799, 5346, 5917, 6510, 7125, 7759, 8411, 9081, + 9766, 10465, 11177, 11900, 12633, 13373, 14120, 14872, + 15627, 16384, 17141, 17896, 18648, 19395, 20135, 20868, + 21591, 22303, 23002, 23687, 24357, 25009, 25643, 26258, + 26851, 27422, 27969, 28492, 28989, 29459, 29901, 30314, + 30697, 31050, 31372, 31662, 31919, 32143, 32333, 32489, + 32611, 32698, 32751 +}; + +const Word16 win_lpc_hb_wb_ivas_fx[(L_LOOK_12k8 + L_SUBFR + L_FRAME) * 5 / 32] = +{//Q15 + 6, 51, 140, 274, + 453, 675, 940, 1247, + 1596, 1985, 2414, 2882, + 3386, 3926, 4499, 5106, + 5743, 6410, 7104, 7823, + 8566, 9331, 10114, 10915, + 11731, 12559, 13398, 14245, + 15099, 15955, 16813, 17669, + 18523, 19370, 20209, 21037, + 21853, 22654, 23437, 24202, + 24945, 25664, 26358, 27025, + 27662, 28269, 28842, 29382, + 29886, 30354, 30783, 31172, + 31521, 31828, 32093, 32315, + 32494, 32628, 32717, 32762 +}; + + +const Word16 ola_win_shb_switch_fold_fx[L_SUBFR16k] = +{//Q15 + 322, 965, 1608, 2250, 2892, 3532, 4171, 4808, + 5444, 6077, 6708, 7336, 7962, 8585, 9204, 9819, + 10431, 11039, 11643, 12242, 12836, 13426, 14010, 14589, + 15162, 15730, 16291, 16846, 17395, 17937, 18472, 18999, + 19520, 20033, 20538, 21035, 21525, 22006, 22478, 22942, + 23397, 23843, 24279, 24707, 25125, 25533, 25931, 26320, + 26698, 27066, 27423, 27770, 28106, 28431, 28746, 29049, + 29341, 29622, 29891, 30149, 30395, 30630, 30853, 31063, + 31262, 31449, 31624, 31786, 31936, 32074, 32200, 32313, + 32413, 32501, 32577, 32640, 32691, 32729, 32754, 32766 +}; + +/* Window for calculating whitening filter for SHB excitation */ + +const Word16 win_flatten_fx[L_FRAME16k / 2] = /*Q15 */ +{ + 3, 13, 28, 50, 78, 113, 154, 200, 254, 313, + 378, 450, 528, 611, 701, 797, 899, 1006, 1120, 1239, + 1365, 1496, 1632, 1775, 1923, 2076, 2235, 2400, 2569, 2745, + 2925, 3110, 3301, 3496, 3697, 3902, 4112, 4327, 4546, 4770, + 4999, 5232, 5469, 5710, 5955, 6205, 6458, 6715, 6976, 7240, + 7508, 7779, 8054, 8331, 8612, 8896, 9183, 9472, 9764, 10059, + 10356, 10655, 10956, 11260, 11566, 11873, 12182, 12493, 12805, 13119, + 13434, 13750, 14067, 14385, 14703, 15023, 15342, 15663, 15983, 16304, + 16625, 16945, 17265, 17586, 17905, 18224, 18542, 18860, 19176, 19492, + 19806, 20119, 20431, 20741, 21049, 21355, 21660, 21963, 22263, 22561, + 22857, 23150, 23441, 23729, 24014, 24297, 24576, 24852, 25125, 25395, + 25661, 25923, 26182, 26437, 26689, 26936, 27179, 27418, 27653, 27884, + 28110, 28332, 28549, 28761, 28969, 29172, 29370, 29563, 29751, 29934, + 30112, 30284, 30451, 30613, 30769, 30920, 31065, 31205, 31338, 31467, + 31589, 31705, 31816, 31921, 32020, 32113, 32199, 32280, 32355, 32423, + 32486, 32542, 32592, 32636, 32673, 32704, 32730, 32748, 32761, 32767 +}; + +const Word16 win_flatten_4k_fx[L_FRAME16k / 8] = /*Q15 */ +{ + 13, 114, 315, 615, 1013, 1505, 2089, 2761, + 3517, 4353, 5263, 6241, 7282, 8378, 9525, 10713, + 11937, 13188, 14458, 15741, 17027, 18310, 19580, 20831, + 22055, 23243, 24390, 25486, 26527, 27505, 28415, 29251, + 30007, 30679, 31263, 31755, 32153, 32453, 32654, 32755 +}; + +const Word16 wb_bwe_lsfvq_cbook_8bit_fx[256 * 6] = +{//Q15 + 2107, 3430, 5123, 6677, 9403, 13197, + 4031, 5069, 7343, 8910, 10647, 12245, + 2037, 3542, 6708, 8763, 10505, 12655, + 5732, 6373, 7912, 9546, 12584, 14230, + 2028, 3337, 5473, 7880, 10269, 12450, + 5809, 6497, 8317, 9624, 11497, 14007, + 2428, 3962, 5675, 7724, 11361, 13385, + 6348, 8307, 8898, 9948, 11058, 13350, + 3552, 4421, 5896, 7143, 9975, 13233, + 5719, 6344, 7482, 8403, 10765, 13455, + 3509, 4379, 5896, 7437, 11765, 14307, + 4521, 8122, 8791, 9856, 11232, 14020, + 2175, 3970, 7788, 9803, 11334, 12910, + 4511, 8156, 8886, 10450, 12686, 14959, + 4223, 5285, 7053, 8423, 11317, 14566, + 7159, 8379, 9040, 10122, 11799, 14270, + 1866, 3064, 4848, 7227, 11225, 13963, + 5915, 6631, 8740, 10002, 11385, 12726, + 3342, 4547, 6475, 9404, 11994, 13418, + 6156, 6880, 8932, 10353, 12380, 13746, + 2648, 4972, 7575, 9476, 12117, 13875, + 5822, 6526, 8747, 10941, 12671, 13971, + 4032, 5110, 7592, 9267, 11374, 14390, + 6864, 8384, 9086, 10649, 12944, 15026, + 3661, 4636, 6668, 8329, 10374, 12185, + 5802, 6444, 8344, 9811, 12234, 14843, + 3593, 4436, 6663, 8693, 11539, 14272, + 5110, 8270, 9006, 10703, 12269, 13901, + 1992, 3229, 5616, 9085, 11419, 13254, + 4319, 5859, 9602, 11396, 12836, 14199, + 3836, 4822, 8285, 10190, 11728, 13302, + 8016, 8698, 10179, 11434, 12944, 14783, + 1891, 3329, 6168, 8307, 10818, 14213, + 5803, 6442, 7973, 9131, 11090, 12657, + 2803, 5499, 8093, 9694, 11223, 12849, + 6222, 6981, 8615, 9848, 12016, 13380, + 2543, 4747, 7638, 9373, 11129, 13652, + 5912, 6615, 9006, 10553, 11959, 13312, + 3604, 4520, 7650, 9833, 12161, 14748, + 7970, 8729, 9780, 10789, 12483, 13985, + 3793, 4716, 7041, 8547, 10610, 13601, + 5640, 6235, 7313, 8370, 12057, 14300, + 3765, 4699, 6784, 9512, 12663, 14216, + 4634, 8363, 9195, 10385, 11477, 13310, + 2462, 4816, 8556, 10394, 11920, 13468, + 3698, 7974, 9207, 10962, 13507, 15208, + 3738, 4667, 7545, 10775, 13024, 14559, + 7267, 8610, 9509, 11264, 12821, 14495, + 2624, 4295, 6173, 8897, 12343, 14174, + 6324, 7135, 8742, 10013, 12598, 14108, + 4448, 5839, 8842, 10335, 11737, 13071, + 6147, 6988, 9510, 10893, 12240, 13535, + 3025, 5140, 7152, 9223, 11404, 13255, + 5985, 6782, 9611, 11341, 12723, 14007, + 4679, 5958, 8100, 9842, 11835, 13492, + 7740, 8565, 9432, 10478, 12611, 14609, + 3830, 4784, 7681, 9528, 11134, 12675, + 5742, 6527, 8359, 10728, 13195, 14626, + 4491, 5635, 7284, 8749, 11594, 13785, + 6772, 8490, 9253, 10943, 12476, 13973, + 2024, 3588, 7524, 10453, 12198, 13858, + 5783, 8882, 9978, 11763, 13237, 14829, + 3979, 5009, 8342, 10323, 12231, 14313, + 8148, 8903, 10193, 11350, 13246, 14490, + 2297, 3810, 5638, 7265, 9162, 11514, + 5809, 6518, 7832, 8766, 10327, 11957, + 2535, 4591, 7415, 9080, 10623, 12257, + 5948, 6598, 8515, 10082, 12721, 14188, + 2443, 4278, 6581, 8172, 9883, 11807, + 5913, 6535, 8878, 10296, 12141, 14245, + 2428, 3925, 6409, 9835, 11962, 13628, + 7430, 8531, 9302, 10259, 11444, 12933, + 3701, 4694, 6372, 7671, 9445, 11571, + 5822, 6470, 7807, 8885, 11506, 14529, + 3742, 4580, 6232, 7860, 11252, 13127, + 5710, 8330, 8943, 10243, 11696, 14511, + 2607, 4197, 6714, 10408, 12714, 14320, + 4116, 8438, 9717, 11018, 12156, 13663, + 4224, 5318, 7486, 10110, 12779, 14331, + 5565, 8413, 9115, 10930, 12588, 14759, + 1898, 3150, 5779, 9497, 12432, 14439, + 6274, 7186, 9258, 10404, 11733, 12952, + 3700, 4591, 7575, 9533, 11461, 13777, + 6234, 7104, 9032, 10986, 13088, 14417, + 2354, 4579, 7744, 9960, 12629, 14802, + 6050, 6729, 9345, 10745, 12436, 14253, + 4345, 5529, 8117, 9718, 12433, 14109, + 8009, 8701, 9863, 10954, 13046, 14474, + 4184, 5186, 6876, 8428, 11236, 12973, + 6113, 6842, 8386, 9659, 12892, 14707, + 3989, 4936, 7152, 8879, 11743, 13632, + 5169, 8411, 9209, 11361, 13452, 15076, + 2397, 4387, 7033, 9035, 11821, 13736, + 3607, 8128, 10170, 11565, 12819, 14147, + 4449, 5805, 8963, 10676, 12596, 14558, + 7911, 8741, 10040, 11622, 13579, 15092, + 2372, 4290, 6990, 8705, 10637, 13685, + 6137, 6917, 8382, 9380, 10859, 12348, + 3235, 5973, 8187, 10174, 12420, 14382, + 6077, 6764, 8551, 9803, 12150, 14079, + 2952, 5097, 6853, 8952, 12066, 14080, + 6606, 7683, 9508, 10695, 12182, 13601, + 3707, 4638, 7468, 10484, 12295, 13754, + 7960, 8715, 10051, 11348, 12757, 14072, + 4139, 5241, 7576, 9037, 10912, 13485, + 5838, 6444, 7768, 8965, 12867, 14998, + 4245, 5338, 7248, 9190, 12328, 14047, + 6159, 8874, 9899, 11134, 12150, 13512, + 2250, 4288, 8698, 10944, 12624, 14316, + 3146, 6848, 9904, 11775, 13534, 14953, + 4044, 5161, 8365, 10294, 12945, 14907, + 7398, 8724, 9813, 11821, 13246, 14552, + 2121, 3890, 6855, 9274, 12059, 14663, + 6329, 7182, 8789, 10081, 13001, 14917, + 4484, 5761, 8634, 10295, 12111, 14022, + 6326, 7208, 9672, 11078, 12830, 14529, + 3230, 5564, 7646, 9955, 12011, 13683, + 4683, 6896, 10002, 11805, 13329, 14747, + 4771, 6044, 8081, 10305, 12526, 14037, + 8231, 9203, 10351, 11427, 12926, 14635, + 4385, 5774, 7989, 9305, 10751, 12299, + 5810, 6658, 9062, 11629, 13359, 14655, + 4288, 5388, 7804, 9378, 11781, 13652, + 4398, 8560, 9646, 11161, 12701, 14872, + 1947, 3440, 7202, 10953, 13222, 14806, + 4686, 8972, 10615, 12054, 13260, 14615, + 3801, 4849, 8922, 11200, 12882, 14423, + 8061, 8813, 10453, 11912, 13335, 14710, + 2365, 3888, 5664, 7346, 10407, 14331, + 4563, 5839, 7472, 8684, 10572, 12800, + 2593, 4197, 6719, 9323, 11229, 12919, + 6081, 6774, 8132, 9244, 12202, 13918, + 2405, 3981, 6144, 8740, 11347, 13796, + 5793, 6444, 8286, 10049, 12152, 13520, + 2795, 4727, 6528, 8506, 11323, 13474, + 6181, 8598, 9346, 10614, 11725, 13545, + 4002, 5001, 6596, 7792, 9987, 13065, + 5748, 6365, 7759, 9028, 11818, 13487, + 3906, 4863, 6462, 7763, 10705, 14359, + 4315, 8428, 9322, 10582, 11942, 14500, + 2812, 4622, 7346, 10036, 11745, 13429, + 4221, 8338, 9277, 11280, 12869, 14317, + 4345, 5427, 7121, 8736, 12787, 14837, + 7678, 8614, 9456, 10461, 12024, 13852, + 2193, 3662, 5609, 7867, 12276, 14739, + 6083, 6864, 8879, 10080, 11623, 13720, + 4114, 5125, 7224, 9729, 11808, 13297, + 6383, 7232, 9252, 10720, 12622, 14030, + 2788, 5189, 8074, 9953, 11795, 14361, + 6079, 6987, 8662, 10589, 12444, 14390, + 4480, 5690, 7708, 9115, 11800, 14576, + 7848, 8763, 9802, 10924, 12515, 14832, + 3582, 4575, 6729, 9084, 11139, 12800, + 5885, 6534, 8853, 10432, 12664, 14960, + 3891, 4850, 7195, 8932, 12097, 14665, + 5797, 8545, 9385, 11556, 12997, 14392, + 1962, 3544, 7039, 9349, 11272, 13857, + 4106, 5493, 9652, 12038, 13603, 14932, + 4328, 5413, 7949, 10282, 12164, 13618, + 8135, 8918, 10057, 11085, 13190, 15015, + 2702, 4627, 6447, 8009, 10197, 13676, + 5998, 6656, 8315, 9496, 11597, 13122, + 3146, 6293, 8530, 10158, 11798, 13558, + 6374, 7289, 8698, 9776, 11885, 14236, + 3171, 5794, 7737, 9377, 11312, 13878, + 6279, 7150, 9192, 10414, 12052, 14174, + 4117, 5195, 7805, 9512, 12450, 14849, + 7963, 8955, 10071, 11129, 12324, 13605, + 4365, 5505, 7013, 8171, 10488, 13658, + 6124, 6894, 8286, 9349, 11859, 14737, + 3753, 4673, 6421, 8146, 12726, 14980, + 5457, 8706, 9598, 11035, 12294, 14268, + 2783, 4916, 7947, 10568, 12395, 14123, + 3909, 8145, 9524, 11951, 14052, 15282, + 3952, 5139, 8180, 11380, 13699, 15085, + 7200, 9031, 10025, 11484, 12924, 14848, + 2533, 4412, 6472, 8299, 11405, 14627, + 6563, 7530, 9064, 10267, 12560, 14422, + 4849, 6618, 8678, 10166, 11983, 13841, + 6393, 7569, 9960, 11300, 12644, 13906, + 3170, 5117, 7158, 9665, 11687, 14114, + 6122, 7071, 10013, 11733, 13170, 14466, + 4308, 5441, 7607, 9900, 11904, 14292, + 8129, 9024, 10087, 11081, 12670, 14356, + 4253, 5392, 8175, 9780, 11353, 12988, + 5453, 6638, 8596, 11453, 13885, 15263, + 4664, 5903, 7618, 9420, 12198, 13853, + 7149, 8859, 9746, 11029, 12219, 14188, + 2318, 4251, 7702, 9889, 11778, 14182, + 6679, 9280, 10573, 11950, 13100, 14491, + 4010, 5176, 8989, 10821, 12250, 13654, + 8076, 8886, 10411, 11722, 12992, 14267, + 2308, 4017, 6024, 7618, 9736, 13081, + 6001, 6751, 7987, 8966, 10964, 13589, + 2908, 5350, 7266, 8739, 10442, 12981, + 6143, 6839, 9027, 10366, 12881, 14416, + 2667, 4224, 6172, 8378, 10717, 12602, + 6275, 7120, 9249, 10613, 12580, 14823, + 2692, 4586, 6968, 9858, 12120, 14209, + 7771, 8769, 9743, 10745, 11943, 13225, + 4201, 5355, 7129, 8337, 9975, 11767, + 6216, 7100, 8444, 9442, 11298, 13690, + 4111, 5040, 6562, 8071, 12034, 13923, + 6657, 8599, 9337, 10665, 12040, 14704, + 3060, 5215, 7260, 10118, 12577, 14386, + 5103, 8913, 10157, 11519, 12669, 14220, + 4633, 5920, 7804, 9514, 12741, 14690, + 6720, 8585, 9448, 11556, 13510, 15095, + 2361, 3970, 6213, 9335, 13270, 15075, + 6506, 7440, 9041, 10179, 12024, 13587, + 4221, 5405, 8311, 9818, 11579, 14044, + 6216, 7224, 9515, 11389, 13545, 15068, + 2872, 5507, 8153, 10650, 13065, 14825, + 6002, 6676, 9393, 11023, 12965, 14755, + 4438, 5642, 8268, 10097, 12295, 14724, + 7797, 8622, 9642, 10932, 13287, 15118, + 4471, 5638, 7551, 9217, 11440, 12928, + 6051, 6890, 8906, 10655, 13437, 15116, + 3953, 4934, 7779, 9619, 12204, 14012, + 5439, 8649, 9791, 12232, 13899, 15193, + 2728, 4495, 6728, 9363, 11344, 14053, + 4069, 8460, 9835, 11742, 13366, 14825, + 4874, 6937, 9226, 10944, 12845, 14547, + 8195, 9093, 10392, 11594, 13355, 15010, + 2956, 5192, 7080, 8765, 11014, 14174, + 6384, 7287, 8812, 9816, 11336, 12808, + 2912, 6122, 9132, 10874, 12583, 14265, + 6148, 6925, 8821, 10030, 12212, 14758, + 2572, 4778, 7325, 9216, 11620, 14651, + 6654, 7718, 9546, 10806, 12633, 14354, + 4328, 5514, 8231, 10852, 12821, 14261, + 8051, 9205, 10385, 11490, 12674, 13988, + 4624, 6013, 7907, 9239, 11160, 13787, + 5786, 6531, 8210, 9968, 13410, 15249, + 3859, 4898, 7132, 9692, 13395, 15118, + 6712, 8944, 10028, 11521, 12690, 14118, + 2417, 4875, 9132, 11671, 13382, 14841, + 4113, 8355, 10734, 12517, 13905, 15115, + 4455, 5753, 7923, 10298, 13343, 15030, + 6998, 8878, 10113, 12233, 13768, 15107, + 2720, 4801, 6883, 9267, 12694, 14837, + 6507, 7496, 9312, 10696, 13185, 14850, + 4631, 6341, 9164, 10796, 12325, 13734, + 6602, 7817, 9932, 11349, 13132, 14672, + 3089, 5561, 7579, 9433, 12256, 14633, + 6246, 7715, 10371, 12065, 13563, 14878, + 4757, 6352, 8543, 10216, 12748, 14620, + 8183, 9366, 10628, 11857, 13185, 14599, + 4734, 6314, 8348, 9716, 11274, 12942, + 5824, 6871, 9829, 12268, 13874, 15138, + 4719, 6142, 8224, 9683, 11915, 14350, + 6288, 8774, 9655, 11204, 12696, 14867, + 2661, 4586, 7326, 10934, 13501, 15026, + 5932, 9323, 10877, 12454, 13715, 15004, + 4467, 6039, 8842, 11164, 13356, 14901, + 7880, 9158, 10593, 12209, 13609, 14989, +}; + +const Word16 swb_tbe_lsfvq_cbook_8b[256 * LPC_SHB_ORDER] = /* Q15 */ +{ + 1705, 3230, 4202, 5086, 6148, 7221, 8127, 10728, 13656, 15364, + 1668, 2958, 4063, 5644, 7356, 9440, 11046, 12261, 13228, 14503, + 1546, 2917, 4226, 5477, 6976, 8349, 9709, 11882, 13218, 14715, + 1158, 2729, 5177, 6967, 8297, 9611, 10655, 11668, 12757, 14415, + 1616, 3005, 4368, 5810, 7107, 8129, 9376, 10457, 12738, 14835, + 1232, 2451, 4145, 6446, 7741, 8993, 10377, 11898, 14213, 15314, + 1638, 3089, 5134, 6351, 7360, 8304, 9787, 12377, 13755, 15209, + 1264, 2543, 5564, 6686, 7958, 9481, 11021, 12517, 13875, 15147, + 1304, 2537, 3713, 4863, 6564, 7910, 9400, 11794, 13268, 14834, + 1652, 3245, 4686, 6405, 7931, 9223, 10591, 12020, 13193, 14759, + 1302, 2619, 4287, 5884, 7166, 8556, 10512, 12471, 13767, 15075, + 2034, 3467, 5577, 6530, 7674, 8783, 10920, 12798, 13727, 15002, + 2621, 3956, 5275, 6542, 7509, 8517, 9456, 10781, 12456, 14099, + 1496, 2653, 4147, 5637, 7370, 9233, 11817, 12986, 13968, 15046, + 2224, 3324, 4700, 5868, 7211, 8638, 11369, 12695, 13600, 14559, + 1267, 3050, 4707, 6321, 8663, 10140, 11174, 12453, 13425, 14844, + 1662, 2980, 4155, 5414, 6639, 7797, 9253, 11360, 12838, 14440, + 1521, 2856, 4944, 6367, 7506, 8857, 10971, 12183, 13275, 15006, + 1454, 2859, 4563, 5971, 7186, 8569, 10151, 11770, 13396, 14984, + 1143, 2942, 5267, 6840, 8377, 9457, 10589, 11615, 13892, 15271, + 1674, 3053, 4605, 5768, 7104, 8452, 10094, 11782, 12793, 13758, + 1702, 3261, 4723, 6245, 7899, 9494, 11010, 12387, 13680, 15066, + 1365, 2796, 5406, 6505, 7488, 8679, 10447, 12000, 13637, 15046, + 2090, 3931, 5788, 7157, 8254, 9717, 11007, 12081, 13238, 14880, + 1952, 3157, 4132, 5164, 6334, 7389, 9004, 11798, 14096, 15505, + 1641, 3212, 4919, 6364, 7863, 9311, 10766, 12234, 13694, 15054, + 1653, 3008, 4213, 5354, 6980, 8821, 11185, 12685, 13903, 15251, + 1856, 3444, 5146, 6579, 7801, 9250, 11062, 12947, 14145, 15291, + 1365, 3567, 5552, 6474, 7332, 8254, 9952, 11364, 13505, 14951, + 1488, 2896, 4521, 6279, 7880, 9446, 11418, 12921, 14431, 15465, + 1516, 3174, 5364, 6410, 7295, 8285, 10799, 12594, 14172, 15424, + 1738, 3416, 5237, 6878, 8440, 10539, 12105, 13063, 13924, 15150, + 1431, 2659, 3909, 5328, 6641, 7950, 9347, 11037, 13510, 14992, + 1400, 2646, 4233, 6366, 7749, 9220, 10560, 11594, 13046, 14992, + 1115, 2198, 3607, 5279, 8055, 9774, 11024, 12426, 13972, 15232, + 1360, 3418, 5724, 6973, 7912, 9078, 10810, 12437, 13630, 14826, + 1422, 3051, 5132, 6141, 7206, 8275, 9355, 10859, 13814, 15202, + 1080, 2227, 4117, 6404, 8080, 9318, 10934, 12404, 13688, 14827, + 1611, 3423, 4928, 6214, 7426, 8723, 10502, 11915, 13438, 15105, + 1947, 3524, 5198, 7008, 8358, 10006, 11397, 12444, 13583, 15135, + 1394, 2672, 4004, 5681, 6953, 8301, 9815, 12000, 13709, 15079, + 1788, 3193, 4579, 6221, 7874, 9170, 11186, 12647, 13521, 14538, + 1548, 2811, 4058, 5331, 6528, 7769, 10982, 12743, 13822, 15131, + 1751, 4007, 5154, 6463, 7935, 9470, 11103, 12406, 13337, 14520, + 2004, 3172, 5079, 6116, 7109, 8155, 10351, 12192, 13413, 14773, + 1644, 3185, 4750, 6290, 7816, 9271, 11041, 12831, 14139, 15341, + 2311, 3779, 5116, 6100, 7321, 9139, 10353, 12134, 13834, 15172, + 1723, 3339, 5049, 6754, 8353, 10290, 12048, 13157, 14206, 15460, + 2218, 3501, 4639, 5764, 6789, 7834, 9804, 11907, 13182, 14689, + 1640, 3173, 4679, 6202, 7660, 9120, 10773, 12395, 13894, 15200, + 1591, 3070, 4537, 6005, 7341, 8802, 10480, 12240, 13768, 15130, + 1169, 3611, 5983, 7054, 8601, 10022, 10948, 11927, 12834, 14747, + 1708, 3191, 4642, 6156, 7396, 8805, 10028, 11733, 13206, 14857, + 1519, 3082, 4752, 6484, 7730, 9328, 10796, 12003, 14524, 15513, + 2153, 3558, 5162, 6714, 7762, 8857, 10008, 12012, 13725, 15209, + 2680, 4053, 5310, 6996, 8309, 9343, 10361, 12333, 14224, 15498, + 2356, 3805, 5032, 5970, 6915, 7880, 8924, 12060, 13838, 15185, + 1807, 3439, 4962, 6483, 8013, 9556, 10952, 12327, 13686, 15059, + 1571, 2900, 4208, 6449, 7675, 8592, 11138, 12775, 14181, 15422, + 2006, 4262, 5508, 6414, 7621, 8725, 10788, 12605, 13609, 14776, + 1785, 3741, 5267, 6702, 8097, 9460, 10487, 11481, 12889, 14885, + 1647, 3223, 4795, 6391, 8007, 9620, 11575, 12955, 14100, 15381, + 1518, 3214, 5233, 6509, 7687, 8803, 11778, 13932, 14760, 15491, + 2136, 3647, 5373, 7317, 8671, 10261, 11786, 12933, 13820, 15186, + 1633, 3265, 4672, 5640, 6776, 7783, 8907, 10184, 12066, 14492, + 1690, 3028, 4184, 6049, 7489, 8678, 11045, 12244, 13372, 15016, + 1649, 3080, 4358, 5795, 7364, 8601, 10257, 12126, 13328, 15113, + 1850, 3286, 5392, 6765, 7826, 9185, 10506, 11776, 13248, 15163, + 2111, 3522, 4870, 6087, 7162, 8385, 9645, 10861, 12341, 14302, + 1529, 2909, 4136, 6783, 8064, 9325, 10942, 12094, 13886, 15169, + 1847, 3281, 4752, 6098, 7310, 8744, 10129, 12278, 13554, 14930, + 1149, 2767, 5869, 7479, 8514, 9723, 11235, 12300, 13871, 15068, + 1689, 3066, 4325, 5613, 6772, 7936, 9051, 12135, 13730, 15025, + 2127, 3394, 5263, 6880, 7874, 9155, 10305, 12136, 13494, 14437, + 1682, 3054, 4412, 6053, 7380, 8465, 9817, 12460, 14155, 15285, + 1799, 3430, 5123, 6594, 7934, 9609, 11472, 12791, 13686, 14849, + 1899, 3656, 5369, 6355, 7516, 8800, 9888, 11646, 13024, 13965, + 1410, 3252, 5101, 6050, 7480, 9912, 11739, 12806, 14085, 15186, + 1487, 3934, 5351, 6390, 7519, 8890, 11488, 12818, 13787, 14941, + 1562, 3156, 5075, 7044, 8872, 10271, 11479, 12632, 13907, 14993, + 1548, 2926, 4338, 5796, 7011, 8143, 9336, 11323, 13461, 14904, + 1421, 2907, 4736, 6272, 7730, 8977, 10453, 12374, 13840, 15234, + 1495, 2996, 4496, 6036, 7545, 9034, 10534, 12014, 13486, 14958, + 1388, 3203, 5691, 7076, 8578, 9661, 10874, 12326, 14433, 15423, + 1248, 2983, 5304, 6423, 7544, 8611, 10290, 11682, 12904, 14549, + 1496, 2988, 4632, 6342, 7852, 9329, 11175, 12546, 13758, 15182, + 1373, 3379, 5067, 6179, 7379, 8775, 10005, 11464, 14147, 15386, + 2537, 3849, 5533, 7263, 8318, 9657, 11346, 12355, 13955, 15314, + 2113, 3405, 4419, 5268, 6436, 8005, 10292, 12442, 13655, 15176, + 1620, 3681, 5454, 6406, 7459, 9354, 10872, 12035, 14163, 15279, + 1903, 3232, 4517, 5758, 7156, 8851, 10670, 12413, 14518, 15565, + 1714, 3779, 5166, 6557, 8107, 9168, 10560, 12854, 14208, 15329, + 1926, 3645, 5521, 7072, 7999, 8974, 9806, 11088, 13527, 15298, + 1820, 2840, 4726, 7091, 8261, 9758, 11218, 12148, 14064, 15262, + 2072, 3303, 5391, 6710, 7504, 8497, 10457, 12394, 14480, 15541, + 1627, 3294, 5209, 7432, 8846, 10147, 11517, 12890, 14488, 15411, + 2172, 3405, 4580, 5623, 6732, 7648, 8485, 9913, 13396, 15213, + 1581, 3058, 4633, 6225, 7724, 9238, 10779, 12240, 13650, 15094, + 1675, 2927, 4090, 5753, 7461, 8922, 10277, 11670, 13987, 15336, + 1868, 3611, 5256, 6927, 8093, 9434, 10998, 12144, 13380, 15165, + 1498, 3635, 5273, 6823, 7825, 8916, 9811, 10903, 12514, 14884, + 1448, 2626, 3930, 6895, 8348, 9746, 11404, 12565, 14288, 15325, + 1945, 3408, 4987, 6340, 7627, 8954, 10251, 12381, 13481, 14983, + 1956, 3759, 5388, 6894, 8466, 9962, 11460, 12759, 14145, 15321, + 1670, 3271, 4588, 5970, 7185, 8366, 9640, 12011, 13488, 14833, + 1964, 3444, 4826, 6213, 7936, 9097, 10785, 12617, 13612, 15229, + 1646, 3390, 4669, 6049, 7001, 7940, 10461, 12478, 14675, 15704, + 2202, 3782, 5107, 6754, 8280, 9628, 11687, 13028, 13871, 15207, + 2354, 3830, 5174, 6360, 7555, 8997, 10681, 11977, 13066, 14781, + 2351, 3525, 4892, 6386, 7616, 9133, 11859, 13061, 13946, 15004, + 2252, 3772, 5155, 6485, 7799, 9145, 10769, 12561, 13763, 15241, + 1714, 3107, 4725, 6097, 9158, 10459, 11619, 12699, 14346, 15256, + 1830, 3506, 4969, 5973, 6900, 7836, 8994, 11088, 13366, 14860, + 1856, 3406, 4898, 6367, 7810, 9186, 10422, 12172, 13969, 15331, + 2006, 3382, 4743, 6100, 7430, 8753, 10805, 12234, 13673, 15195, + 1491, 3607, 5343, 7464, 9179, 10087, 11024, 12099, 13199, 14956, + 1749, 3371, 5121, 6500, 7646, 8770, 9968, 11673, 13339, 14931, + 1857, 3506, 5083, 6595, 8200, 9739, 11138, 12528, 13884, 15137, + 1780, 3860, 5581, 6692, 7837, 8989, 10304, 12318, 13611, 15109, + 2164, 4463, 5655, 7632, 9047, 9922, 10784, 12950, 14723, 15589, + 2305, 3300, 4366, 5608, 6857, 7795, 10006, 11950, 14376, 15700, + 1628, 3408, 5074, 6761, 8312, 9687, 11104, 12332, 13619, 15076, + 1842, 3314, 4771, 6460, 7463, 8661, 11191, 12739, 14592, 15633, + 1808, 4360, 5904, 6869, 8134, 9174, 10780, 12589, 13995, 15150, + 2966, 4354, 5686, 6983, 7938, 9092, 10062, 11747, 13307, 14611, + 1932, 3293, 4910, 6818, 7690, 9074, 11715, 13019, 14429, 15478, + 1978, 3772, 5429, 6580, 7448, 8496, 11755, 13132, 14549, 15560, + 1881, 3635, 5627, 7292, 8573, 10911, 12325, 13200, 14068, 15243, + 1436, 2716, 4002, 5347, 6553, 7646, 8955, 10690, 12967, 14784, + 1426, 2825, 4206, 5726, 8100, 9391, 10712, 12262, 13506, 14954, + 1448, 2767, 4089, 5265, 7185, 8684, 10378, 12257, 13431, 14803, + 1669, 3312, 4990, 6887, 8050, 9595, 10943, 12015, 13145, 14920, + 1534, 2814, 4191, 5933, 7393, 8687, 9865, 11185, 12958, 14743, + 1397, 2706, 4322, 6052, 7618, 9168, 10995, 12433, 13931, 15267, + 1717, 3164, 4630, 6329, 7519, 8846, 10088, 12116, 14012, 15197, + 1606, 3316, 5165, 6942, 8278, 9625, 11461, 12806, 14095, 15299, + 2014, 3357, 4281, 5076, 6191, 7372, 9501, 12414, 13419, 14901, + 1322, 3655, 5269, 6494, 7613, 9253, 10752, 11974, 13302, 14833, + 1687, 3291, 4718, 5817, 7001, 8136, 10741, 12692, 13884, 15224, + 2255, 3723, 5555, 7021, 8101, 9345, 10765, 12705, 13693, 15223, + 2376, 3715, 5249, 6505, 7410, 8345, 10176, 11618, 12708, 14488, + 1842, 3232, 4371, 5954, 7832, 9126, 11296, 12743, 13862, 15331, + 2046, 3597, 5325, 6453, 7353, 8588, 10588, 12082, 13664, 15152, + 1970, 3564, 4925, 6547, 8672, 9980, 11383, 12786, 13969, 15234, + 1497, 2938, 4909, 6099, 7102, 8072, 9514, 11294, 12761, 14578, + 1666, 3164, 5098, 6255, 7350, 8902, 10694, 12503, 13808, 14980, + 1467, 2774, 4556, 6308, 7435, 8644, 10040, 12356, 13597, 14776, + 1915, 3618, 5160, 6707, 8479, 9521, 10481, 11536, 14163, 15479, + 1857, 3466, 4760, 6205, 7312, 8801, 10376, 11978, 13161, 14235, + 1615, 3107, 4710, 6452, 8069, 9877, 11348, 12575, 13751, 15049, + 1563, 3092, 4977, 6851, 8056, 9025, 10327, 12181, 14039, 15192, + 2294, 3843, 5781, 7222, 8505, 9851, 11210, 12802, 13676, 15158, + 1931, 3436, 4681, 5837, 6908, 7825, 9440, 12600, 14162, 15305, + 1572, 3189, 4879, 6680, 7970, 9293, 10974, 12193, 13506, 15218, + 1759, 3172, 4687, 5950, 7484, 8874, 10563, 12821, 14112, 15299, + 1461, 4009, 5495, 6608, 7867, 9497, 11307, 12520, 14357, 15467, + 1922, 4314, 5736, 6599, 7481, 8598, 9852, 11345, 14012, 15280, + 1249, 2609, 4690, 7006, 8061, 9011, 11477, 13214, 14382, 15337, + 2251, 3776, 5514, 6458, 7300, 8078, 10961, 12696, 14279, 15567, + 1697, 3374, 5134, 6984, 8675, 10700, 12194, 13233, 14184, 15464, + 1985, 3326, 4440, 5685, 6870, 8207, 9545, 11223, 13672, 15143, + 1453, 2824, 4722, 6476, 7730, 8963, 10217, 11743, 13545, 15152, + 1217, 2442, 3821, 5409, 7315, 8949, 10797, 12564, 14281, 15410, + 1546, 3204, 5604, 6730, 8040, 9677, 11029, 12107, 13803, 15267, + 2042, 3424, 4830, 6328, 7473, 8525, 9386, 10755, 13398, 14998, + 1106, 2508, 4816, 7337, 8399, 9630, 11278, 12453, 14067, 15024, + 1764, 3305, 4955, 6537, 7767, 9117, 10404, 11961, 13576, 15021, + 1604, 3797, 5700, 7128, 8515, 9896, 11389, 12534, 13696, 15136, + 1623, 3004, 4355, 6217, 7351, 8437, 9819, 11537, 13974, 15340, + 2457, 3890, 4962, 5848, 7311, 9718, 11213, 12292, 13705, 15111, + 1601, 3330, 4648, 6043, 7138, 8179, 11247, 13078, 14768, 15641, + 2457, 3677, 5174, 6432, 7982, 10024, 11164, 12170, 13704, 15112, + 1552, 3777, 5267, 6325, 7532, 8642, 9894, 12404, 13569, 14620, + 1961, 3463, 4720, 6498, 8059, 9304, 11486, 12824, 14102, 15458, + 2443, 3699, 5252, 6348, 7638, 8733, 10224, 12666, 13768, 15009, + 2204, 3657, 5086, 6792, 8300, 10152, 12313, 13306, 14079, 15287, + 2360, 3731, 5002, 6094, 6952, 8009, 9152, 11586, 13038, 14158, + 1888, 3469, 4880, 6183, 7603, 9244, 10801, 12319, 13657, 15002, + 1670, 3283, 4591, 6080, 7801, 8951, 10534, 12572, 13620, 14969, + 1304, 4140, 5864, 7008, 8377, 9651, 10825, 11805, 13637, 15300, + 2077, 3547, 4890, 6216, 7303, 8608, 9810, 11796, 13525, 14984, + 1658, 3252, 4916, 6498, 8069, 9529, 11029, 12538, 13903, 15184, + 2206, 3648, 4949, 6636, 7875, 8833, 9853, 12624, 14448, 15475, + 3039, 4664, 5792, 7321, 8798, 9724, 10485, 12329, 14465, 15650, + 1885, 3201, 5227, 6590, 7343, 8049, 9372, 12313, 14594, 15645, + 1826, 3446, 5138, 6665, 8008, 9352, 10668, 12583, 13810, 15065, + 1455, 3065, 5233, 6306, 7404, 8776, 11422, 12775, 14032, 15239, + 2395, 4674, 5883, 6877, 7900, 9322, 10931, 12537, 13765, 14888, + 1840, 4359, 5629, 6875, 7968, 9185, 10266, 11861, 13202, 14464, + 1662, 3278, 4865, 6555, 8122, 10011, 11874, 13087, 14128, 15418, + 1643, 3366, 5837, 7033, 7854, 8928, 11487, 12972, 14409, 15467, + 1878, 3685, 5789, 7325, 8714, 10906, 12273, 13110, 13834, 14837, + 2259, 3652, 4995, 6055, 7005, 7900, 8843, 10024, 12609, 14736, + 1568, 2949, 4504, 6035, 7428, 9194, 10893, 12444, 13595, 14939, + 1678, 3143, 4416, 5872, 7501, 8768, 10418, 12127, 13144, 14622, + 1878, 3549, 5481, 7178, 8322, 9347, 10532, 12117, 13554, 15167, + 2055, 3346, 4814, 6193, 7418, 8757, 10144, 11365, 12698, 14779, + 1486, 2779, 3954, 6134, 8290, 9646, 10767, 12112, 14441, 15428, + 1787, 3511, 4962, 6055, 7295, 8858, 10179, 12437, 13813, 15217, + 1374, 3184, 5771, 7998, 9354, 10209, 11249, 12469, 14015, 15248, + 1627, 2947, 4046, 5182, 6798, 8225, 9770, 12661, 14250, 15408, + 2117, 3704, 5007, 6630, 8002, 9222, 10550, 12108, 13472, 15034, + 1365, 2885, 4896, 6144, 7426, 9137, 10283, 12727, 14709, 15505, + 2073, 3691, 5305, 6800, 8134, 9508, 11139, 12857, 13896, 15239, + 1564, 4084, 5497, 6495, 7391, 8539, 10468, 11705, 12804, 14704, + 1844, 3180, 4380, 5754, 8181, 9923, 11738, 12995, 14138, 15232, + 2157, 3736, 5059, 5932, 7192, 8916, 11216, 12783, 13945, 15189, + 1782, 2860, 4362, 7179, 9083, 10438, 11580, 12929, 14789, 15500, + 1651, 3273, 4587, 5886, 7069, 8346, 9787, 11277, 13152, 14811, + 1549, 3138, 5049, 6704, 7803, 9102, 10748, 12577, 13813, 15215, + 1674, 3187, 4709, 6204, 7622, 9024, 10541, 12135, 13576, 15063, + 1888, 3562, 5468, 7111, 8694, 9948, 11111, 12286, 14070, 15300, + 1905, 3158, 5368, 6372, 7554, 8719, 10568, 12430, 13449, 14427, + 1953, 3411, 4718, 6545, 8090, 9298, 11232, 12723, 13668, 15077, + 1459, 3444, 5688, 6814, 7843, 8977, 10119, 12107, 14316, 15368, + 2450, 4363, 5827, 7349, 8683, 10032, 11143, 12131, 13519, 15058, + 2482, 3664, 4763, 5944, 7191, 8390, 10105, 12234, 13702, 15188, + 1838, 3465, 5255, 6751, 8016, 9254, 10946, 12321, 13790, 15337, + 2497, 3548, 4702, 5987, 7645, 8883, 10740, 12247, 14393, 15540, + 1717, 3679, 5335, 6587, 8564, 9808, 10735, 12675, 14672, 15558, + 2454, 3997, 5364, 6810, 8026, 8913, 9715, 11315, 14258, 15605, + 1906, 3443, 4901, 6363, 8186, 9716, 11074, 13186, 14701, 15474, + 1992, 3246, 5488, 6514, 7455, 8324, 10807, 13238, 14763, 15579, + 1721, 3438, 5244, 7173, 9106, 10873, 12178, 13181, 14060, 15415, + 2191, 3555, 4802, 6108, 7015, 7850, 8947, 11115, 14483, 15593, + 1925, 3232, 4601, 6574, 7791, 8989, 11038, 12282, 13630, 15136, + 1816, 3167, 4292, 5730, 7588, 9096, 10743, 12341, 13760, 15252, + 2069, 3850, 5424, 6815, 8274, 9569, 10910, 12283, 13835, 15185, + 2419, 3773, 5288, 6591, 7672, 8909, 9832, 10975, 13163, 14998, + 1215, 2710, 4939, 6437, 8745, 9918, 11200, 12553, 14234, 15384, + 1867, 3527, 5134, 6496, 7656, 8923, 10602, 12568, 13896, 15276, + 2259, 4214, 5751, 7270, 8590, 10120, 11611, 12822, 14130, 15258, + 1911, 3261, 4446, 5685, 6897, 8494, 10128, 11970, 13707, 15106, + 1762, 3549, 4874, 6153, 8146, 9634, 10690, 11886, 13713, 15057, + 2371, 3716, 4778, 6111, 7097, 8063, 10544, 12615, 14716, 15724, + 2254, 3759, 5627, 6870, 7896, 9379, 11627, 12889, 13795, 15272, + 2516, 4000, 5378, 6444, 7496, 8634, 9767, 12110, 13503, 14640, + 2385, 3201, 4283, 6677, 8216, 9689, 11654, 12319, 14142, 15367, + 2775, 4055, 5455, 6553, 7821, 8901, 10890, 12775, 13696, 14884, + 1568, 3940, 5341, 6824, 9355, 10305, 11405, 12879, 14291, 15334, + 2436, 3807, 5183, 6189, 7099, 8116, 9655, 11275, 13641, 15137, + 1755, 3340, 4871, 6382, 7790, 9316, 10921, 12432, 13903, 15217, + 1932, 3246, 4603, 6454, 7590, 8678, 10609, 12641, 13938, 15245, + 1417, 4366, 6289, 7362, 8846, 10151, 11160, 12134, 13593, 15216, + 1820, 3378, 4782, 6421, 7788, 9056, 10070, 11271, 13614, 15297, + 1855, 3399, 4933, 6526, 8097, 9655, 11043, 12475, 14301, 15370, + 1901, 3653, 6053, 7290, 8154, 8986, 10262, 12993, 14405, 15387, + 1958, 4295, 5824, 8196, 9580, 10318, 11267, 12551, 13716, 15374, + 2082, 4060, 5500, 6423, 7298, 8128, 9713, 12497, 14442, 15562, + 1878, 3425, 4781, 7062, 8455, 9625, 10810, 12311, 13948, 15201, + 2035, 3727, 4804, 6256, 7248, 9235, 11563, 13120, 14882, 15662, + 2143, 3982, 6527, 7709, 8742, 9804, 11240, 12658, 14397, 15409, + 2593, 4431, 5861, 7222, 8381, 9351, 10400, 11837, 13286, 15326, + 1840, 3798, 5465, 6800, 7919, 9752, 12004, 13265, 14424, 15420, + 2157, 4145, 5394, 6454, 7240, 8776, 11093, 12831, 14856, 15708, + 1467, 3782, 5811, 8123, 9314, 10456, 11641, 13211, 14562, 15331, +}; + + +const Word16 wac_swb_h[LPC_SHB_ORDER] = +{//Q15 + 32758, + 32731, + 32686, + 32622, + 32541, + 32442, + 32325, + 32191, + 32039, + 31870 +}; + +const Word16 wac_swb_l[LPC_SHB_ORDER] = +{//Q15 + 29673, + 20874, + 7850, + 25873, + 12831, + 5927, + 10541, + 239, + 15037, + 30328 +}; + +const Word16 wac_swb_ivas_h[LPC_SHB_ORDER] = +{//Q15 + 32749, + 32731, + 32686, + 32622, + 32541, + 32442, + 32325, + 32191, + 32039, + 31870 +}; + +const Word16 wac_swb_ivas_l[LPC_SHB_ORDER] = +{//Q15 + 2624, + 20874, + 7850, + 25873, + 12831, + 5927, + 10541, + 239, + 15037, + 30328 +}; + +const Word16 lbr_wb_bwe_lsfvq_cbook_2bit_fx[4 * 4] = +{ + /*Q15 */ + 3876, 5920, 8951, 11884, + 6556, 7979, 10835, 13133, + 4401, 6781, 10676, 13493, + 8453, 9693, 12024, 13921, +}; + +const Word16 SHBCB_SubGain5bit_fx[128] = +{ + /*Q14 */ + -2388, -7806, -6576, -6024, + -7066, -5430, -4998, -3495, + -16722, -15343, -960, -7940, + -26291, -5921, -4917, -4378, + -1526, -6621, -8475, -9624, + -8047, -4086, -8940, -3043, + -3630, -5129, -4964, -7381, + -270, -18662, -24233, -25418, + -9246, -7551, -5584, -2053, + -2091, -4622, -9199, -14628, + -4645, -2197, -10255, -9697, + -2438, -9386, -11737, -4570, + -14366, -11436, -8252, -819, + -16192, -16332, -17043, -225, + -5407, -8588, -7577, -2296, + -26309, -21930, -7522, -2514, + -3260, -4246, -7947, -6614, + -1820, -5520, -15272, -19764, + -3706, -3737, -5850, -10520, + -10081, -4050, -4065, -5001, + -3908, -9909, -2881, -9604, + -520, -11156, -12620, -12768, + -4539, -5149, -6208, -4462, + -4866, -7672, -4235, -4407, + -9163, -13411, -2975, -3915, + -12267, -7568, -3842, -2827, + -7181, -4914, -2608, -9392, + -6275, -2868, -5962, -6511, + -12962, -1034, -8517, -10992, + -8247, -7608, -2502, -5026, + -5812, -4998, -3860, -5778, + -16907, -5974, -4434, -3276, +}; + + +const Word16 HBCB_SubGain5bit_fx[128] = +{//Q8 + -15224, -17789, -9897, -5048, -456, -1232, -2238, -2782, + -3391, -3864, -4026, -4045, -2017, -1311, -878, -1973, + -12837, -15376, -8273, -4141, -2791, -3037, -2403, -342, + -3388, -3646, -3471, -2829, -157, -2025, -2318, -2243, + -14652, -16433, -7699, -1188, -2567, -1755, -346, -1682, + -2068, -2321, -2344, -2348, -1759, -1038, -1865, -2041, + -11396, -13719, -7749, -2734, -809, -1935, -1886, -781, + -2136, -1940, -942, -1571, -1926, -2378, -2572, -2145, + -17531, -19267, -7721, -2672, -714, -675, -1516, -2071, + -1925, -2325, -2523, -2657, -1644, -1674, -2036, -2017, + -12781, -14601, -6714, -1380, -2093, -1704, -1124, -756, + -2776, -2687, -2066, -1202, -1102, -680, -1956, -2376, + -14436, -15846, -4918, -2071, -1613, -744, -1807, -1381, + -620, -1294, -2026, -2162, -794, -1755, -1167, -1762, + -11627, -13377, -5876, -1959, -1009, -1879, -1027, -1915, + -1734, -1265, -2001, -1018, -698, -1733, -2172, -1195, + +}; + + +const Word32 SHBCB_FrameGain64_fx[64] = +{ + /* Q18 */ + 11553, 19429, 27466, 35948, 45184, 54817, 65050, 76114, + 88089, 100815, 114314, 128727, 144236, 160812, 178639, 197656, + 217917, 239688, 263098, 288617, 315962, 345380, 376751, 410569, + 446867, 485779, 527885, 574220, 624562, 679333, 738912, 803391, + 873329, 949299, 1032054, 1121728, 1219559, 1327347, 1446046, 1576547, + 1720983, 1881933, 2062979, 2266614, 2496129, 2759206, 3060575, 3409584, + 3818114, 4295643, 4868000, 5551295, 6368310, 7329048, 8475924, 9889403, + 11649918, 13794493, 16487623, 19979932, 24732260, 31339886, 41958624, 64261100, +}; + +/* 4 bit Quantizer table for SHB overall gain */ + +const Word32 SHBCB_FrameGain16_fx[16] = +{ + /*Q18*/ + 38968, 125277, 254474, 493383, 1043711, 2083177, 3792746, 6395076, + 10256080, 15738899, 23269902, 34118236, 48362464, 71128080, 107459896, 192888864 +}; + +/* 18th order elliptic Bandpass filter at 14.15 to 20 kHz sampled at 48 kHz b0,b1,b2,a0,a1,a2 */ + +const Word16 full_band_bpf_1_fx[6][5] = /*in Q13*/ +{ + { 789, 802, 248, 802, 789}, + { 789, 1199, 838, 1199, 789}, + { 789, 136, -1123, 136, 789}, + { 8192, 19654, 24391, 17059, 6561}, + { 8192, 15339, 20118, 13819, 6190}, + { 8192, 21155, 26558, 17237, 5599} +}; + +/* 12th order elliptic Bandpass filter at 16.3 to 19.8 kHz sampled at 48 kHz b0,b1,b2,a0,a1,a2 */ + +const Word16 full_band_bpf_2_fx[6][5] = /*in Q13*/ +{ + { 492, 912, 974, 912, 492}, + { 492, 1161, 1353, 1161, 492}, + { 492, 259, -311, 259, 492}, + { 8192, 22912, 30622, 21214, 7143}, + { 8192, 20364, 27329, 18844, 6886}, + { 8192, 23496, 31199, 20826, 6487} +}; + +/* 12th order elliptic Bandpass filter at 15.4 to 20.0 kHz sampled at 48 kHz b0,b1,b2,a0,a1,a2 */ + +const Word16 full_band_bpf_3_fx[6][5] = /*in Q13*/ +{ + {611, 888, 717, 888, 611}, + {611, 1211, 1214, 1211, 611}, + {611, 197, -671, 197, 611}, + {8192, 21727, 28230, 19588, 6871}, + {8192, 18438, 24377, 16796, 6567}, + {8192, 22683, 29442, 19400, 6081} +}; + +/* 4-bit/3-bit TD SWB BWE differential LSF scalar quantizer tables */ + +const Word16 lsf_q_cb_size[NUM_Q_LSF] = {16, 16, 8, 8, 8}; // Q0 +const Word16 lsf_q_num_bits[NUM_Q_LSF] = { 4, 4, 3, 3, 3 }; // Q0 + +/* Tables for approximation of upper half of SWB LSFs */ + +const Word16 mirror_point_q_cb_fx[MIRROR_POINT_Q_CB_SIZE] = { 471, 692, 896, 1216 }; // Q15 + +const Word16 allpass_poles_3_ov_2[9] = /* Q15 */ +{ + 2368, + 20545, + 30606, + 25520, + 7188, + 31808, + 28575, + 14384, + 32472 +}; + +const Word16 decimate_3_ov_2_lowpass_num_fx[3] = /* Q15 */ +{ + 6399, + 12797, + 6399 +}; + +const Word16 decimate_3_ov_2_lowpass_den_fx[3] = /* Q15 */ +{ + 32767, + 0, + 5624 +}; + + +/*------------------------------------------------------------------------------* + * WB BWE tables + *------------------------------------------------------------------------------*/ +const Word16 F_2_5_fx[64] = /*Q10 */ +{ + 1189, 675, -5106, -5293, 10476, -12, 10860, 10026, + -382, -616, 6426, 339, 9681, 9068, 3002, 2216, + 3208, 3042, 8255, -604, 16133, 5171, 17641, 18769, + -2529, -3248, -1447, -1991, 15511, 14855, 11631, 11996, + 9654, -124, 7267, -1617, 12799, 3237, 10598, 1555, + 5510, -1775, 1149, -2292, 12659, 12425, 4382, -1814, + 6305, 5629, 3404, -2632, 19555, 9582, 7835, 7619, + -517, -3795, 19031, 11574, 19156, 18748, 23563, 23465, +}; +/*------------------------------------------------------------------------------* + * SWB BWE tables + *------------------------------------------------------------------------------*/ + +const Word16 swb_bwe_trans_subband[SWB_FENV_TRANS+1] = {240, 316, 392, 476, 560}; // Q0 +const Word16 swb_bwe_trans_subband_width[SWB_FENV_TRANS] = {76, 76, 84, 84}; // Q0 + +const Word16 sqrt_swb_bwe_trans_subband_width_fx[SWB_FENV_TRANS] = { 17854, 17854, 18770, 18770 };/*Q11 */ + +const Word16 sqrt_swb_bwe_subband_fx_L1[SWB_FENV] = { 16384, 20066, 16384, 20066, 16384, 20066, 16384, 20066, 20066, 20066, 20066, 20066, 23170, 23170 }; /*Q12 */ + +const Word16 sqrt_swb_bwe_subband_fx_L2[SWB_FENV / 2] = { 25905, 25905, 25905, 25905, 28378, 28378, 32767 }; /*Q12 */ + +const Word16 swb_bwe_subband[SWB_FENV+1] = {240, 256, 280, 296, 320, 336, 360, 376, 400, 424, 448, 472, 496, 528, 560}; // Q0 +const Word16 fb_bwe_subband[DIM_FB + 1] = { 640, 680, 720, 800 }; // Q0 +const Word16 fb_bwe_sm_subband[DIM_FB] = { 656, 696, 760 }; // Q0 +const Word16 swb_inv_bwe_subband_width_fx[SWB_FENV] = { 2048,1365,2048,1365,2048,1365,2048,1365,1365,1365,1365,1365,1024,1024 };//Q15 +const Word16 swb_bwe_sm_subband[SWB_FENV] = {248, 268, 288, 308, 328, 348, 368, 388, 412, 436, 460, 484, 512, 544}; // Q0 +const Word16 smooth_factor_fx[SWB_FENV - 1] = { 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1366, 1366, 1366, 1366, 1024, 1024 };//Q15 + +const Word16 fb_bwe_subband_float[DIM_FB+1] = {640, 680, 720, 800}; // Q0 +const Word16 fb_inv_bwe_subband_width_fx[DIM_FB] = { 819, 819, 409 };//Q15 +const Word16 fb_bwe_sm_subband_float[DIM_FB] = {656, 696, 760}; // Q0 +const Word16 fb_smooth_factor_fx[DIM_FB] = { 1024, 819, 512 };//Q15 + + +const Word16 EnvCdbk11_fx[N_CB11 * DIM11] = /*Q8 */ +{ + -2220, 29, 1168, 2124, 2180, 1208, 741, + 1521, -312, -843, -1523, -1970, -2205, -2541, + 746, 1835, 3461, 4398, 4292, 4184, 3462, + 1627, 2475, 2937, 2839, 2198, 1729, 1325, + -514, -731, -557, -200, 100, 475, 540, + 655, 956, 1272, 1083, 774, 687, 459, + 5987, 5460, 4689, 4192, 3845, 3615, 3393, + 3571, 4840, 5784, 6266, 5933, 5158, 4433, + 2959, 2087, 1180, 979, 1180, 1371, 1636, + 6029, 6157, 6431, 6762, 6998, 7153, 7050, + -822, 210, 450, 178, -639, -1346, -1577, + 4451, 4184, 4111, 4329, 4833, 5232, 5512, + 3420, 3994, 4321, 4205, 3684, 3154, 2651, + -3734, -2305, -1388, -324, 22, -847, -1141, + 850, 510, 896, 1780, 2130, 2688, 2826, + 3294, 2823, 2510, 2516, 3029, 3413, 3843, + -3563, -3409, -3199, -2917, -2584, -2282, -1981, + -2738, -3185, -3752, -4320, -4484, -4524, -4329, + -7534, -7481, -7283, -7175, -6757, -6281, -5865, + -4868, -4836, -4603, -4422, -4086, -3738, -3323, + -13896, -13775, -13484, -13339, -12926, -12399, -11970, + 8409, 8420, 8305, 8103, 7954, 7778, 7496, + 7180, 6845, 6369, 5971, 5557, 5309, 5027, + 4633, 4008, 3267, 2422, 2072, 1778, 1510, + 10128, 10432, 10540, 10473, 10176, 9837, 9586, + 2933, 2695, 2060, 1286, 424, -254, -825, + -10032, -9847, -9544, -9420, -9000, -8508, -8084, + 1830, 927, -158, -388, -360, -368, -287, + -21962, -21904, -21548, -21471, -21004, -20511, -20064, + -6090, -6142, -5937, -5852, -5493, -5104, -4671, + -1382, -1640, -2205, -2557, -2785, -3019, -2994, + -1300, -1567, -1744, -1642, -1409, -1080, -902, +}; + +const Word16 EnvCdbk1st_fx[N_CB1ST * DIM1ST] = /*Q8 */ +{ + -1819, -1138, 751, + -494, 162, -826, + -3199, -123, 2479, + -2071, 238, -429, + -1819, 1780, 1233, + 284, 1187, -1123, + -1689, -722, -484, + -1256, 52, -1336, + -604, 3738, -1297, + 555, 412, 743, + -626, -1685, 1527, + 145, 1557, -224, + -638, 1370, 1589, + -1188, 37, -410, + -428, -3320, 1860, + 2597, -95, -2876, + -742, -583, -684, + 1607, -1671, -1874, + -1111, -936, -1374, + 275, -2314, 518, + 2682, 2368, -302, + 1809, -555, -579, + 3193, -1270, -1208, + 750, 84, 154, + -1160, 429, 1098, + 816, -613, -2897, + 2159, -1885, 1245, + -671, 426, 3177, + 867, -144, -639, + 843, -1888, 2271, + 1542, 259, -148, + -1680, 1027, 285, + 162, -763, 1666, + -1916, 1175, -1227, + -345, -907, -151, + 1979, 1062, 402, + -1231, 2437, 3130, + -2422, 361, 1040, + -4314, -4106, -4221, + 146, -1200, -1828, + 485, 889, -3847, + 384, -2461, -2845, + 1526, -600, 1599, + -838, -571, 1097, + 1776, -3393, 4058, + -3330, 2429, 1732, + 468, -2140, -934, + 833, 2292, -1129, + -20, -1029, 652, + -346, 168, 1834, + -1730, 838, 2234, + 1622, -1695, -194, + -3198, -773, 228, + 1070, 1741, 285, + 1655, -212, -1628, + 2178, 604, 1784, + 1801, -3224, -848, + -819, 348, 187, + 16, 300, 244, + 769, 201, 1554, + 719, -394, 780, + 311, 2853, 185, + 1163, 489, -1022, + -330, 459, 877, + 109, -541, -691, + -509, -267, 478, + -340, -417, -1403, + -860, -675, -2703, + 1025, 826, 250, + -1043, 1008, -434, + -1042, -631, 60, + -173, 332, -2084, + 984, 919, -2042, + -1257, -2287, 339, + 366, -1309, -158, + 1041, 1039, 1083, + 3566, 918, 227, + 62, -139, 936, + 2424, 730, -1022, + -745, 1954, 427, + -1091, -1358, -478, + -173, 2121, -2367, + -2175, 2535, -1946, + -880, -1964, -1549, + -249, -1203, -927, + -2377, -443, -1775, + -1439, -582, 2037, + -529, -3679, -550, + 608, -284, -1566, + 201, 63, -344, + 1376, 218, 816, + 2471, -348, 479, + -1388, 988, -2674, + 1429, -3538, 1125, + 864, -1351, 845, + 301, 977, 408, + -1122, 3364, 1107, + -213, 730, -329, + 839, -683, -92, + 631, 1172, 2364, + 598, 685, -329, + -780, -1317, 448, + -424, -153, -199, + 768, -331, 2825, + 882, -1047, -975, + -375, -1835, -299, + 2861, -3375, -3158, + 2099, 2168, -2630, + 1602, 1930, 1451, + 1294, 1265, -586, + -2500, -2570, -2667, + -806, -1529, 3272, + -522, 1072, 478, + 4035, -2491, 480, + -1908, 2414, -178, + -1563, -143, 438, + 205, 861, 1287, + -691, 963, -1374, + -2359, -2032, -886, + 162, -442, 160, + 194, 2494, 1960, + -2533, -2578, 1924, + 267, 1701, 937, + 2919, 2950, 2382, + -670, 2102, -859, + -3147, 1385, -215, + 1482, -595, 415, + 228, 290, -1060, +}; + +const Word16 EnvCdbk2nd_fx[N_CB2ND * DIM2ND] = /*Q8 */ +{ + 1104, -1833, -1110, -954, + 757, 853, -176, 286, + -873, -587, -7, 1458, + -462, -553, -350, 104, + 1938, 1957, -1340, -703, + 1202, -779, 21, 1996, + -2851, -169, 1049, 940, + -1355, -726, -1788, 1076, + -767, -641, -646, -880, + 135, -832, -197, -889, + -826, 3, 279, -502, + -714, 544, -526, 375, + 291, -1076, -816, -3929, + -1175, -475, 2219, -642, + 197, -219, -1052, -1601, + 1175, -162, -695, -336, + 1124, 126, -2326, -1573, + 1164, -1323, -1958, 1074, + -2080, -2152, 113, 649, + -637, -860, 721, 267, + -609, 1658, -1006, -1352, + 1631, 2225, 2128, 1827, + -1112, -1351, 1856, 1656, + -2132, 1006, 770, -1294, + -472, 776, 1661, 2248, + -121, -574, -1481, -316, + 2565, -1081, 188, 293, + 398, 2598, 704, -1129, + 1023, 104, 550, 499, + -416, 127, 253, -1894, + 456, -2578, 190, 1018, + -1488, 286, -1202, -915, + -1164, 1874, 1651, 302, + -1312, -1547, -1625, -1516, + 170, -233, 817, 1209, + -1090, 341, 709, 725, + 854, 819, -278, -1083, + -15, 113, 286, 283, + 1166, -906, 1880, 301, + 342, -7, -587, 776, + -785, -1259, -1166, 3194, + -1630, -1071, 300, -1080, + -12, 190, -538, -493, + 351, 907, 1929, -1534, + 480, 36, 593, -526, + 813, 1216, 986, 89, + 98, 1010, -2272, 268, + 2766, -102, -1307, -873, + -1660, -467, -365, 47, + 1496, 1277, -228, -2791, + 1565, -669, 520, -1598, + -361, 1078, 457, -364, + 543, -950, 28, 248, + 1904, 815, -1034, 1125, + -13, -1951, 1085, -1005, + -2223, 1519, -624, 857, + 1121, 831, 872, 1295, + 193, 2284, -422, 609, + -156, 827, -733, 2065, + -3390, -3384, -3197, -3220, + 31, 896, 539, 978, + -21, 408, 1502, 405, + -583, -1662, -665, -164, + 2193, 976, 613, -436, +}; + +const Word16 EnvCdbk3rd_fx[N_CB3RD * DIM3RD] = /*Q8 */ +{ + 1031, -2454, 748, + 2770, 2442, 1761, + -2348, 4079, -959, + 1874, -735, -2242, + -59, 35, 201, + -1518, 162, 1809, + -1977, -1063, -103, + 2485, 1212, -863, + 882, 192, 39, + 1356, 851, 979, + -1377, -2961, -1477, + 497, -808, 593, + -394, -748, -1564, + -950, -198, -436, + -503, -1420, -234, + 318, 985, -1905, + -118, 1783, 1563, + 220, 929, 400, + 857, 37, -995, + -807, 1943, -409, + -743, -524, 552, + 940, 1643, -299, + 805, -1421, -768, + -2330, 705, 156, + 61, 203, 1213, + -138, 517, -642, + 64, -501, -435, + 2194, -625, 157, + -1600, 341, -1611, + 1137, -351, 2353, + -811, -1715, 1522, + -870, 613, 446, +}; + +const Word16 EnvCdbk4th_fx[N_CB4TH * DIM4TH] = /*Q8 */ +{ + 1024, -210, -207, 591, + -280, -2486, -951, 958, + 1539, 1136, 411, 1314, + 1761, -202, 1339, 203, + -2438, -2109, -2028, -2125, + 1849, -1408, -670, 144, + -469, 2674, -1589, -3604, + 1642, -702, 139, 2476, + -483, 372, -861, 540, + -119, 827, 863, 952, + 23, 99, -24, -303, + 488, -2233, -1432, -1399, + 54, -43, 96, -1527, + 1170, 133, -119, -717, + 258, -1215, -439, 160, + -1049, 793, 970, -770, + -1914, -1245, 1281, 422, + -1194, 1005, 176, -2368, + -1631, 1316, -1125, -361, + 1124, 1132, 61, -2186, + 790, -2055, 1174, 938, + 2974, 3874, 2315, 2040, + -300, 2484, 59, -860, + 543, 1307, -1868, -725, + 389, -115, -945, -146, + -1837, -578, -620, 975, + 389, 1779, 1732, 296, + 377, 897, 1555, 2269, + -854, 26, 590, 1413, + -780, -985, 1389, 2639, + 312, -277, -935, -3289, + 1740, 1852, 641, -519, + 738, 898, -466, 115, + 1187, -286, -1514, -1309, + 74, -801, -583, -987, + 510, -667, 430, -191, + 418, -303, 806, 1258, + -1083, -1065, 362, -2114, + -1075, 82, 260, 286, + -2579, 14, 75, -854, + -661, -634, 482, -581, + -338, -306, 3255, 388, + -230, -24, 1161, 205, + 256, 546, -141, 1379, + -63, -775, -484, 1478, + -517, -546, -451, 86, + 1473, -1201, 430, -1892, + 394, 831, 620, -664, + 334, 64, 1773, -1576, + -1783, 1270, 1020, 944, + 1023, 98, -1908, 1330, + -560, -1044, 380, 707, + -427, -708, -1815, -90, + -54, 2298, -537, 1151, + -499, 703, -1018, 3322, + 92, 717, -607, -1032, + -1313, -1393, -580, -485, + 34, -2192, 788, -860, + 2641, 628, -776, -259, + -702, -159, -1483, -1638, + -33, -63, 97, 553, + 692, 523, 548, 349, + -913, 54, -456, -702, + -341, 944, 157, 100, +}; + + +const Word16 EnvCdbkFB_fx[N_CB_FB * DIM_FB] = /*Q7 */ +{ + -2126, -1242, -945, + 1628, -686, -539, + 1230, 2245, 2532, + 2822, 3094, 2669, + -12376, -11507, -11342, + 2678, 3533, 3510, + 489, 903, 689, + 1930, 2929, 3025, + 3424, 4179, 4050, + -2500, -1707, -1415, + -3511, -2563, -2224, + -865, -987, -1212, + -424, 891, 1919, + 1976, 2520, 2277, + 673, 1667, 1945, + 5169, 6024, 5983, + -1367, -501, -236, + -254, 679, 989, + -18974, -18088, -17834, + -23007, -22053, -22109, + 2262, 2301, -625, + -124, 431, 372, + 1454, 1962, 1791, + 200, 1094, 1347, + -997, -110, 213, + -697, 267, 602, + -3066, -2172, -1876, + -4358, -3493, -3164, + -360, 59, -472, + -1813, -919, -601, + 4204, 4967, 4913, + 953, 1457, 1245 +}; + +const Word16 Mean_env_fb_fx[DIM_FB] = { 1760, 805, 473 }; /*Q8 */ + +const Word16 w_NOR_fx[SWB_FENV] = /*Q15 */ +{ + 32767, 32056, 31374, 30720, 30093, 29491, 28913, + 28357, 27822, 27307, 26810, 26331, 25869, 25423, +}; +const Word16 Mean_env_fx[SWB_FENV] = /*Q8 */ +{ + 7327, 7414, 7181, 7160, 6889, 6866, 6746, + 6651, 6385, 6152, 5873, 5668, 5435, 5222, +}; + +const Word16 Env_TR_Cdbk1_fx[N_CB_TR1 * DIM_TR1] = /*Q8 */ +{ + 229, -2347, + 8199, 7726, + -312, 1700, + 9881, 5949, + 8942, 8358, + 3865, 3287, + 2405, 796, + 3664, 1433, + 3059, 2215, + 618, 874, + -5479, -4636, + 2237, 2512, + 4265, 2428, + 6583, 2065, + 4548, 6579, + 11325, 7340, + 10578, 9264, + 8491, 6457, + -1380, -2484, + 3377, 5069, + 7393, 5120, + 4798, 4440, + 5506, 7614, + -3371, -3982, + 2806, 2959, + 2242, 3550, + 1334, 3065, + 2055, -1350, + 815, 5507, + 4940, 1457, + -1950, -1046, + 653, -1133, + 872, -3622, + -1756, 245, + 5792, 5542, + 4084, 7696, + 4569, 5204, + -810, -1555, + 10127, 10384, + 11341, 11713, + 6365, 4996, + 8641, 10527, + 5914, 3366, + 4522, 3266, + 5217, 2830, + 8107, 8980, + 3952, 5858, + 5848, 8990, + 6424, 5931, + 5185, 3823, + 6367, 6917, + 3548, 2683, + 1634, 2098, + 2729, -89, + 6964, 7664, + 3179, 3561, + 6388, 4193, + 4024, 4828, + -378, 434, + 9338, 9507, + 7593, 3483, + -6835, -6317, + 5207, 5029, + 11326, 10488, + 7411, 6086, + 10072, 8255, + -6099, -5652, + 7074, 8702, + -12228, -11384, + -11471, -10567, + -13025, -12253, + -12879, -11289, + -13952, -13062, + -16214, -15389, + -11659, -10789, + -12351, -11477, + -12789, -11947, + -15139, -14249, + -11326, -11219, + -11950, -11093, + -11800, -10928, + -23738, -22881, + 12795, 11890, + -3793, -2879, + -27373, -26492, + -11928, -11531, + -12110, -11258, + -20492, -19634, + -14371, -13608, + -12591, -11728, + -14055, -11739, + 9471, 7272, + -11184, -10335, + -13313, -11673, + -12209, -10610, + -13465, -12761, + 7690, 7115, + 2564, 4496, + 5587, 4551, + -813, -562, + -4483, -5521, + 1556, 98, + 2, 3468, + 1410, 1339, + 4049, 161, + -4538, -4026, + -9866, -9115, + -1616, -4727, + 2457, 1653, + 631, 2155, + -17982, -17082, + 2628, 6088, + -10791, -9933, + -12426, -11566, + 4322, 4000, + -1574, 2162, + -7968, -7599, + 1523, 4192, + 5621, 6537, + -2511, -1987, + 12471, 9218, + 8746, 4971, + 3642, 4148, + 5089, 5948, + 350, -92, + 7028, 6683, + -2430, -3216, + -3974, -886, +}; + +const Word16 Env_TR_Cdbk2_fx[N_CB_TR2 * DIM_TR2] = /*Q8 */ +{ + 2639, 375, + -481, 1694, + -2400, -3306, + 86, -4018, + -1301, 47, + 734, 299, + 957, -1039, + 2204, 1486, + 361, -1136, + 2628, -838, + -2010, 1296, + 373, 127, + -573, 2604, + 689, -1554, + 1676, -371, + 1298, 279, + -901, 1086, + 1747, -2723, + 214, -657, + -731, -909, + 1545, -1658, + -369, -2208, + -1276, 1748, + 1141, -522, + 186, -1893, + -1260, -2016, + -478, -504, + 1287, 1882, + -97, -1400, + -1372, -1165, + 800, -152, + 413, -240, + -208, -858, + -90, -399, + 492, 2519, + 913, 1368, + -344, 282, + 305, 526, + -251, 860, + -1066, 567, + -2800, -687, + 1, 674, + 176, 878, + -716, -153, + 706, 831, + -1083, -424, + 419, 1192, + -132, 565, + 708, -2406, + 600, -661, + 1712, 2969, + -1974, 379, + -672, 208, + 26, 296, + -1821, -501, + -513, 635, + 266, 1737, + -221, 1232, + -3498, 1632, + -337, -66, + -552, -1427, + 1329, 850, + -718, -2948, + -3, 0, +}; + +const Word16 Mean_env_tr_fx[5] = { 6971, 6095, 6111, 4995 }; /*Q8 */ + +/*------------------------------------------------------------------------------* + * LR MDCT SWB BWE coding tables + *------------------------------------------------------------------------------*/ + + +const Word16 gain_table_SWB_BWE_fx[NB_SWB_SUBBANDS] = { -6554/*-0.4f*/, 1638/*0.1f*/, 9830/*0.6f*/, 18022/*1.1f*/ }; /* Q14 */ + +const Word16 bits_lagIndices_modeNormal[NB_SWB_SUBBANDS] = {2, 2, 1, 1}; // Q0 +const Word16 subband_offsets_12KBPS[NB_SWB_SUBBANDS] = {SWB_SB_OFF0_12KBPS, SWB_SB_OFF1_12KBPS, SWB_SB_OFF2_12KBPS, SWB_SB_OFF3_12KBPS}; // Q0 +const Word16 subband_offsets_16KBPS[NB_SWB_SUBBANDS] = {SWB_SB_OFF0_16KBPS, SWB_SB_OFF1_16KBPS, SWB_SB_OFF2_16KBPS, SWB_SB_OFF3_16KBPS}; // Q0 + +/* Search offset for the subbands that use a partial search */ +const Word16 subband_search_offsets[NB_SWB_SUBBANDS] = +{ + 0, 0, 64, 64 +}; // Q0 + + + +/* SPT : shorten subband length table */ +const Word16 bw_SPT_tbl[2][SPT_SHORTEN_SBNUM]= +{ + {15, 31, 31, 31}, /* 13.2kbps: original band_width 53, 66, 82, 102 */ + {15, 15, 31, 31} /* 16.4kbps: original band_width 51 64, 80, 90 */ +}; + + +/* Harmonic Mode */ +const Word16 bits_lagIndices_mode0_Har[NB_SWB_SUBBANDS_HAR_SEARCH_SB] = {1,1}; // Q0 + + +/* 13.2 kbps */ +const Word16 subband_offsets_sub5_13p2kbps_Har[NB_SWB_SUBBANDS_HAR] = +{ + SWB_SB_OFF0_SUB5_12KBPS_HAR, SWB_SB_OFF1_SUB5_12KBPS_HAR, SWB_SB_OFF2_SUB5_12KBPS_HAR, SWB_SB_OFF3_SUB5_12KBPS_HAR +}; // Q0 + +/* Search offset for the subbands that use a partial search */ +const Word16 subband_search_offsets_13p2kbps_Har[NB_SWB_SUBBANDS_HAR_SEARCH_SB] = +{ + 120, 210 +}; // Q0 + +/* 16.4 kbps */ +const Word16 subband_offsets_sub5_16p4kbps_Har[NB_SWB_SUBBANDS_HAR] = +{ + SWB_SB_OFF0_SUB5_16KBPS_HAR, SWB_SB_OFF1_SUB5_16KBPS_HAR, SWB_SB_OFF2_SUB5_16KBPS_HAR, SWB_SB_OFF3_SUB5_16KBPS_HAR +}; // Q0 + +/* Search offset for the subbands that use a partial search */ +const Word16 subband_search_offsets_16p4kbps_Har[NB_SWB_SUBBANDS_HAR_SEARCH_SB] = +{ + 120, 210 +}; // Q0 + + +/*------------------------------------------------------------------------------* + * HQ core tables + *------------------------------------------------------------------------------*/ +const Word16 wscw16q15_fx[240] =/*Q15 */ +{ + -32768, -32766, -32764, -32759, -32754, -32747, -32738, -32729, -32717, -32705, -32691, + -32675, -32658, -32640, -32621, -32600, -32577, -32553, -32528, -32501, -32473, -32444, + -32413, -32381, -32348, -32313, -32276, -32239, -32200, -32159, -32117, -32074, -32029, + -31984, -31936, -31887, -31837, -31786, -31733, -31679, -31624, -31567, -31508, -31449, + -31388, -31326, -31262, -31197, -31131, -31063, -30994, -30924, -30853, -30780, -30705, + -30630, -30553, -30475, -30395, -30315, -30232, -30149, -30064, -29979, -29891, -29803, + -29713, -29622, -29530, -29436, -29341, -29245, -29148, -29049, -28949, -28848, -28746, + -28642, -28537, -28431, -28324, -28216, -28106, -27995, -27883, -27770, -27655, -27540, + -27423, -27305, -27186, -27066, -26944, -26821, -26698, -26573, -26447, -26320, -26191, + -26062, -25931, -25800, -25667, -25533, -25398, -25262, -25125, -24986, -24847, -24707, + -24565, -24423, -24279, -24135, -23989, -23843, -23695, -23546, -23397, -23246, 23095, + 22942, 22788, 22634, 22478, 22322, 22164, 22006, 21846, 21686, 21525, 21363, + 21199, 21035, 20871, 20705, 20538, 20371, 20202, 20033, 19863, 19692, 19520, + 19347, 19174, 18999, 18824, 18648, 18472, 18294, 18116, 17937, 17757, 17576, + 17395, 17213, 17030, 16846, 16662, 16477, 16291, 16105, 15917, 15730, 15541, + 15352, 15162, 14972, 14781, 14589, 14397, 14204, 14010, 13816, 13621, 13426, + 13230, 13033, 12836, 12639, 12441, 12242, 12043, 11843, 11643, 11442, 11241, + 11039, 10837, 10634, 10431, 10228, 10024, 9819, 9615, 9409, 9204, 8998, + 8791, 8585, 8377, 8170, 7962, 7754, 7545, 7336, 7127, 6918, 6708, + 6498, 6288, 6077, 5866, 5655, 5444, 5232, 5020, 4808, 4596, 4383, + 4171, 3958, 3745, 3532, 3319, 3105, 2892, 2678, 2464, 2250, 2036, + 1822, 1608, 1394, 1179, 965, 751, 536, 322, 107 +}; +const Word16 wscw16q15_8_fx[40] =/*Q15 */ +{ + -32762, -32711, -32610, -32459, -32258, -32007, -31706, -31357, + -30959, -30514, -30022, -29483, -28899, -28270, -27598, -26883, + -26127, -25330, -24494, -23621, 22711, 21766, 20788, 19777, + 18736, 17666, 16569, 15447, 14300, 13132, 11943, 10736, + 9512, 8274, 7022, 5760, 4490, 3212, 1929, 643 +}; +const Word16 wscw16q15_16_fx[80] =/*Q15 */ +{ + -32766, -32754, -32729, -32691, -32640, -32577, -32501, -32413, + -32313, -32200, -32074, -31936, -31786, -31624, -31449, -31262, + -31063, -30853, -30630, -30395, -30149, -29891, -29622, -29341, + -29049, -28746, -28431, -28106, -27770, -27423, -27066, -26698, + -26320, -25931, -25533, -25125, -24707, -24279, -23843, -23397, + 22942, 22478, 22006, 21525, 21035, 20538, 20033, 19520, + 18999, 18472, 17937, 17395, 16846, 16291, 15730, 15162, + 14589, 14010, 13426, 12836, 12242, 11643, 11039, 10431, + 9819, 9204, 8585, 7962, 7336, 6708, 6077, 5444, + 4808, 4171, 3532, 2892, 2250, 1608, 965, 322 +}; +const Word16 wscw16q15_32_fx[160] =/*Q15 */ +{ + -32768, -32764, -32758, -32749, -32736, -32720, -32701, -32679, -32654, -32626, -32594, + -32559, -32522, -32481, -32437, -32389, -32339, -32286, -32229, -32169, -32107, -32041, + -31972, -31900, -31825, -31747, -31665, -31581, -31494, -31403, -31310, -31214, -31114, + -31012, -30906, -30798, -30687, -30572, -30455, -30335, -30212, -30086, -29957, -29825, + -29690, -29553, -29412, -29269, -29123, -28974, -28823, -28668, -28511, -28351, -28188, + -28023, -27855, -27684, -27511, -27335, -27156, -26975, -26791, -26604, -26415, -26223, + -26029, -25833, -25633, -25432, -25228, -25021, -24812, -24601, -24387, -24171, -23953, + -23732, -23509, -23284, 23056, 22827, 22595, 22361, 22125, 21886, 21646, 21403, + 21159, 20912, 20663, 20413, 20160, 19905, 19649, 19390, 19130, 18868, 18604, + 18338, 18071, 17802, 17531, 17258, 16984, 16708, 16430, 16151, 15871, 15588, + 15305, 15019, 14733, 14445, 14155, 13865, 13572, 13279, 12984, 12688, 12391, + 12093, 11793, 11492, 11191, 10888, 10584, 10279, 9973, 9666, 9358, 9049, + 8740, 8429, 8118, 7806, 7493, 7180, 6865, 6550, 6235, 5919, 5602, + 5285, 4967, 4649, 4330, 4011, 3692, 3372, 3052, 2731, 2411, 2090, + 1768, 1447, 1126, 804, 483, 161 +}; + +/* Codebook for quantization of norms */ +const Word32 dicn_fx[40] = /* Q=14 */ +{ + 2147483647, 1518500224, + 1073741824, 759250112, + 536870912, 379625056, + 268435456, 189812528, + 134217728, 94906264, + 67108864, 47453132, + 33554432, 23726566, + 16777216, 11863283, + 8388608, 5931642, + 4194304, 2965821, + 2097152, 1482910, + 1048576, 741455, + 524288, 370728, + 262144, 185364, + 131072, 92682, + 65536, 46341, + 32768, 23170, + 16384, 11585, + 8192, 5793, + 4096, 2896 +}; + +const Word32 dicn_pg_fx[45] = /* Q12 */ +{ + 536870912, 451452834, 379625056, 319225344, 268435456, + 225726416, 189812528, 159612672, 134217728, 112863208, + 94906264, 67108864, 47453132, 33554432, 23726566, + 16777216, 11863283, 8388608, 5931641, 4194304, + 2965821, 2097152, 1482910, 1048576, 741455, + 524288, 370728, 262144, 185364, 131072, + 92682, 65536, 46341, 32768, 23170, + 16384, 11585, 8192, 5793, 4096, + 2896, 2048, 1448, 1024, 724 +}; +const Word16 expPkEnrg_tbl[45] = +{ + 0, 0, 0, 0, 0, 2, 2, 2, 2, + 4, 4, 4, 6, 6, 8, 8, 10, 10, + 12, 12, 14, 14, 16, 16, 18, 18, 20, + 20, 22, 22, 24, 24, 26, 26, 28, 28, + 30, 30, 32, 32, 34, 34, 36, 36, 38 +}; // Q0 + +const Word32 manPkEnrg_tbl[45] = +{ + 2147483646, 1518500308, 1073741787, 759250076, 536870912, + 1518500294, 1073741787, 759250076, 536870912, 1518500294, + 1073741787, 536870912, 1073741787, 536870912, 1073741787, + 536870912, 1073741787, 536870912, 1073741606, 536870912, + 1073741968, 536870912, 1073741244, 536870912, 1073741244, + 536870912, 1073744140, 536870912, 1073744140, 536870912, + 1073744140, 536870912, 1073744140, 536870912, 1073697800, + 536870912, 1073697800, 536870912, 1073883168, 536870912, + 1073512448, 536870912, 1073512448, 536870912, 1073512448 +}; // Q0 +const Word32 E_max5_tbl[40] = +{ + 2047999999, 1448154663, 1024000000, 1448154663, 1024000000, + 1448154663, 1024000000, 1448154663, 1024000000, 1448154663, + 1024000000, 1448154663, 1024000000, 1448154663, 1024000000, + 1448154663, 1024000000, 1448154785, 1024000000, 1448154785, + 1024000000, 1448154296, 1024000000, 1448154296, 1024000000, + 1448156250, 1024000000, 1448156250, 1024000000, 1448156250, + 1024000000, 1448156250, 1024000000, 1448125000, 1024000000, + 1448125000, 1024000000, 1448250000, 1024000000, 1448000000 +}; // Q0 + + +const Word16 resize_huffsizn[32] = +{ + 0, 0, 0, 0, 0, 11, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0 +}; // Q0 + +const Word16 huffsizn[32] = +{ + 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 4, 4, 3, 3, + 3, 3, 4, 4, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7 +}; // Q0 + +const Word16 huffnorm_tran[32] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 10, 6, 1, + 0, 3, 2, 26, 58, 186, 442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; // Q0 + +const Word16 huffsizn_tran[32] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 5, 3, 2, 2, + 2, 4, 6, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; // Q0 + +const Word16 pgain_huffsizn[32] = +{ + 10, 11, 10, 10, 9, 8, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 10, 10, 12, 12 +}; // Q0 + +const Word16 dicnlg2_float[40] = +{ + 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, + 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, + 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, + 4, 3, 2, 1, 0, -1, -2, -3, -4, -5 +}; // Q0 + +/*** Table for quantization of MLT coefficients ***/ +const Word16 norm_order_48[NB_SFM] = +{ + 0, 1, 8, 9, 16, 20, 24, 28, 32, 36, 40, 41, 37, 33, 29, 25, 21, 17, 11, 10, 3, 2, + 4, 5, 12, 13, 18, 22, 26, 30, 34, 38, 42, 43, 39, 35, 31, 27, 23, 19, 15, 14, 7, 6 +}; // Q0 + +const Word16 norm_order_32[SFM_N_SWB] = +{ + 0, 1, 8, 9, 16, 20, 24, 28, 32, 36, 37, 33, 29, 25, 21, 17, 11, 10, 3, 2, + 4, 5, 12, 13, 18, 22, 26, 30, 34, 38, 35, 31, 27, 23, 19, 15, 14, 7, 6 +}; // Q0 + +const Word16 norm_order_16[SFM_N_WB] = +{ + 0, 1, 8, 9, 16, 20, 24, 21, 17, 11, 10, 3, 2, + 4, 5, 12, 13, 18, 22, 25, 23, 19, 15, 14, 7, 6 +}; // Q0 + +const Word16 intl_bw_16[N_INTL_GRP_16] = {16, 16}; // Q0 +const Word16 intl_bw_32[N_INTL_GRP_32] = {16, 24}; // Q0 +const Word16 intl_bw_48[N_INTL_GRP_48] = {16, 24, 32}; // Q0 + +const Word16 intl_cnt_16[N_INTL_GRP_16] = {4, 1}; // Q0 +const Word16 intl_cnt_32[N_INTL_GRP_32] = {4, 4}; // Q0 +const Word16 intl_cnt_48[N_INTL_GRP_48] = {4, 3, 2}; // Q0 + +const Word16 band_start_HQ[44] = +{ + 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, + 96, 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, + 256, 280, 304, 328, 352, 376, 400, 424, 448, 472, 496, 520, + 544, 576, 608, 640, 672, 704, 736, 768 +}; // Q0 + +const Word16 band_end_HQ[44] = +{ + 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, + 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, 256, + 280, 304, 328, 352, 376, 400, 424, 448, 472, 496, 520, 544, + 576, 608, 640, 672, 704, 736, 768, 800 +}; // Q0 + +const Word16 band_len_HQ[44] = +{ + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 32, 32, 32, 32, 32, 32, 32, 32 +}; // Q0 + +const Word16 band_start_wb[26] = +{ + 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, + 96, 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, + 256, 288 +}; // Q0 + +const Word16 band_end_wb[26] = +{ + 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, + 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, 256, + 288, 320 +}; // Q0 + +const Word16 band_len_wb[26] = +{ + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, + 32, 32 +}; // Q0 +const Word16 band_len_harm_float[SFM_N_HARM_FB] = // Q0 +{ + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 16, 16, 16, 16, 16, 16, 32, 32, 32, 48, 48, 48, 48, 64, 64, 64, 96 +}; + +const Word16 band_start_harm[SFM_N_HARM_FB] =//Q0 +{ + 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, + 128, 144, 160, 176, 192, 208, 224, 256, 288, 320, 368, 416, 464, 512, 576, 640, 704 +}; + +const Word16 band_end_harm[SFM_N_HARM_FB] =//Q0 +{ + 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, + 144, 160, 176, 192, 208, 224, 256, 288, 320, 368, 416, 464, 512, 576, 640, 704, 800 +}; + +const Word16 rat_fx[SFM_N_WB] = { 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, 24576, + 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 13107, 13107 +};//Q14 + +const Word16 sfm_width[20] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 8}; // Q0 +const Word16 a_map[20] = {8, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 7, 11}; // Q0 + + +const Word32 SQRT_DIM_fx[65] = /* sqrt(x) for x = 0, 1, ..., 64. in Q15 */ +{ + 0, 32768, 46341, 56756, 65536, 73271, 80265, 86696, + 92682, 98304, 103622, 108679, 113512, 118147, 122607, 126910, + 131072, 135106, 139023, 142832, 146543, 150162, 153696, 157150, + 160530, 163840, 167085, 170268, 173392, 176461, 179478, 182445, + 185364, 188238, 191069, 193858, 196608, 199320, 201996, 204636, + 207243, 209818, 212361, 214874, 217358, 219814, 222243, 224646, + 227023, 229376, 231705, 234010, 236293, 238555, 240795, 243014, + 245213, 247393, 249554, 251696, 253820, 255926, 258015, 260088, + 262144 +}; + + + +/*------------------------------------------------------------------------------* + * HQ core tables for SWB signals + *------------------------------------------------------------------------------*/ + +const Word16 short_window_48kHz_fx[L_FRAME48k / 2 / 2] = /* second half is symetric and omitted Q15*/ +{ + 107, 322, 536, 751, 965, 1179, 1394, 1608, 1822, 2036, 2250, 2464, 2678, 2892, 3105, 3319, + 3532, 3745, 3958, 4171, 4383, 4596, 4808, 5020, 5232, 5444, 5655, 5866, 6077, 6288, 6498, 6708, + 6918, 7127, 7336, 7545, 7754, 7962, 8170, 8377, 8585, 8791, 8998, 9204, 9409, 9615, 9819, 10024, + 10228, 10431, 10634, 10837, 11039, 11241, 11442, 11643, 11843, 12043, 12242, 12441, 12639, 12836, 13033, 13230, + 13426, 13621, 13816, 14010, 14204, 14397, 14589, 14781, 14972, 15162, 15352, 15541, 15730, 15917, 16105, 16291, + 16477, 16662, 16846, 17030, 17213, 17395, 17576, 17757, 17937, 18116, 18294, 18472, 18648, 18824, 18999, 19174, + 19347, 19520, 19692, 19863, 20033, 20202, 20371, 20538, 20705, 20871, 21035, 21199, 21363, 21525, 21686, 21846, + 22006, 22164, 22322, 22478, 22634, 22788, 22942, 23095, 23246, 23397, 23546, 23695, 23843, 23989, 24135, 24279, + 24423, 24565, 24707, 24847, 24986, 25125, 25262, 25398, 25533, 25667, 25800, 25931, 26062, 26191, 26320, 26447, + 26573, 26698, 26821, 26944, 27066, 27186, 27305, 27423, 27540, 27655, 27770, 27883, 27995, 28106, 28216, 28324, + 28431, 28537, 28642, 28746, 28848, 28949, 29049, 29148, 29245, 29341, 29436, 29530, 29622, 29713, 29803, 29891, + 29979, 30064, 30149, 30232, 30315, 30395, 30475, 30553, 30630, 30705, 30780, 30853, 30924, 30994, 31063, 31131, + 31197, 31262, 31326, 31388, 31449, 31508, 31567, 31624, 31679, 31733, 31786, 31837, 31887, 31936, 31984, 32029, + 32074, 32117, 32159, 32200, 32239, 32276, 32313, 32348, 32381, 32413, 32444, 32473, 32501, 32528, 32553, 32577, + 32600, 32621, 32640, 32658, 32675, 32691, 32705, 32717, 32729, 32738, 32747, 32754, 32759, 32764, 32766, 32767, +}; +const Word16 short_window_32kHz_fx[L_FRAME32k / 2 / 2] = /* second half is symetric and omitted Q15*/ +{ + 161, 483, 804, 1126, 1447, 1768, 2090, 2411, 2731, 3052, 3372, 3692, 4011, 4330, 4649, 4967, + 5285, 5602, 5919, 6235, 6550, 6865, 7180, 7493, 7806, 8118, 8429, 8740, 9049, 9358, 9666, 9973, + 10279, 10584, 10888, 11191, 11492, 11793, 12093, 12391, 12688, 12984, 13279, 13572, 13865, 14155, 14445, 14733, + 15019, 15305, 15588, 15871, 16151, 16430, 16708, 16984, 17258, 17531, 17802, 18071, 18338, 18604, 18868, 19130, + 19390, 19649, 19905, 20160, 20413, 20663, 20912, 21159, 21403, 21646, 21886, 22125, 22361, 22595, 22827, 23056, + 23284, 23509, 23732, 23953, 24171, 24387, 24601, 24812, 25021, 25228, 25432, 25633, 25833, 26029, 26223, 26415, + 26604, 26791, 26975, 27156, 27335, 27511, 27684, 27855, 28023, 28188, 28351, 28511, 28668, 28823, 28974, 29123, + 29269, 29412, 29553, 29690, 29825, 29957, 30086, 30212, 30335, 30455, 30572, 30687, 30798, 30906, 31012, 31114, + 31214, 31310, 31403, 31494, 31581, 31665, 31747, 31825, 31900, 31972, 32041, 32107, 32169, 32229, 32286, 32339, + 32389, 32437, 32481, 32522, 32559, 32594, 32626, 32654, 32679, 32701, 32720, 32736, 32749, 32758, 32764, 32767, +}; + +const Word16 short_window_16kHz_fx[L_FRAME16k / 2 / 2] = /* second half is symetric and omitted Q15*/ +{ + 322, 965, 1608, 2250, 2892, 3532, 4171, 4808, 5444, 6077, 6708, 7336, 7962, 8585, 9204, 9819, + 10431, 11039, 11643, 12242, 12836, 13426, 14010, 14589, 15162, 15730, 16291, 16846, 17395, 17937, 18472, 18999, + 19520, 20033, 20538, 21035, 21525, 22006, 22478, 22942, 23397, 23843, 24279, 24707, 25125, 25533, 25931, 26320, + 26698, 27066, 27423, 27770, 28106, 28431, 28746, 29049, 29341, 29622, 29891, 30149, 30395, 30630, 30853, 31063, + 31262, 31449, 31624, 31786, 31936, 32074, 32200, 32313, 32413, 32501, 32577, 32640, 32691, 32729, 32754, 32766, +}; + +const Word16 short_window_8kHz_fx[L_FRAME8k / 2 / 2] = /* second half is symetric and omitted Q15*/ +{ + 643, 1929, 3212, 4490, 5760, 7022, 8274, 9512, + 10736, 11943, 13132, 14300, 15447, 16569, 17666, 18736, + 19777, 20788, 21766, 22711, 23621, 24494, 25330, 26127, + 26883, 27598, 28270, 28899, 29483, 30022, 30514, 30959, + 31357, 31706, 32007, 32258, 32459, 32610, 32711, 32762, +}; + +const Word16 inv_jp2[64] =//Q15 +{ + 16384, 10923, 8192, 6554, 5461, 4681, 4096, 3641, 3277, 2979, 2731, 2521, 2341, 2185, 2048, 1928, + 1820, 1725, 1638, 1560, 1489, 1425, 1365, 1311, 1260, 1214, 1170, 1130, 1092, 1057, 1024, 993, + 964, 936, 910, 886, 862, 840, 819, 799, 780, 762, 745, 728, 712, 697, 683, 669, + 655, 643, 630, 618, 607, 596, 585, 575, 565, 555, 546, 537, 529, 520, 512, 504 +}; +const Word16 subf_norm_groups[4][11] = +{ + {0,1,8,9,16,20,24,28,32,36,40}, + {2,3,10,11,17,21,25,29,33,37,41}, + {4,5,12,13,18,22,26,30,34,38,42}, + {6,7,14,15,19,23,27,31,35,39,43} +}; // Q0 + +const Word16 gain_att_fx[40] = /* Q=15 */ +{ + 15711, 19367, 21781, 23743, 24899, 25929, 26758, 27514, + 28059, 28562, 28994, 29398, 29693, 29970, 30213, 30442, + 30619, 30786, 30936, 31077, 31190, 31298, 31395, 31488, + 31564, 31637, 31704, 31768, 31822, 31873, 31920, 31966, + 32005, 32042, 32077, 32111, 32140, 32168, 32195, 32220 +}; + +const Word16 stab_trans_fx[10] = /* Q15 */ +{ + 16384, 11381, 7232, 4292, 2433, + 1341, 728, 391, 209, 112 +}; + +const Word16 env_stab_tp_fx[2][2] = /* Q15 */ +{ + {32735, 16384}, + {33, 16384} +}; + +const Word16 att_step_fx[4] = /* Q=13 */ +{ + 32767, 16384, 10923, 8192 +}; + +const Word32 table_logcum_fx[563] =//Q16 +{ + 0, 0, 0, 65536, 169408, 300480, 452650, 622058, 806041, + 1002649, 1210393, 1428099, 1654816, 1889761, 2132272, 2381791, 2637833, + 2899977, 3167853, 3441134, 3719526, 4002767, 4290623, 4582876, 4879332, + 5179812, 5484152, 5792200, 6103816, 6418871, 6737244, 7058822, 7383500, + 7711180, 8041769, 8375181, 8711333, 9050150, 9391557, 9735485, 10081869, + 10430647, 10781759, 11135150, 11490766, 11848556, 12208469, 12570461, 12934487, + 13300503, 13668469, 14038345, 14410092, 14783676, 15159061, 15536214, 15915101, + 16295692, 16677956, 17061866, 17447390, 17834504, 18223180, 18613394, 19005122, + 19398338, 19793020, 20189146, 20586692, 20985640, 21385968, 21787658, 22190686, + 22595040, 23000696, 23407638, 23815850, 24225314, 24636014, 25047934, 25461060, + 25875374, 26290862, 26707510, 27125304, 27544232, 27964278, 28385428, 28807674, + 29231000, 29655392, 30080844, 30507338, 30934866, 31363416, 31792978, 32223540, + 32655092, 33087624, 33521126, 33955588, 34391000, 34827352, 35264636, 35702840, + 36141960, 36581988, 37022908, 37464716, 37907404, 38350964, 38795388, 39240668, + 39686792, 40133760, 40581560, 41030188, 41479632, 41929888, 42380948, 42832808, + 43285456, 43738892, 44193104, 44648088, 45103840, 45560348, 46017612, 46475624, + 46934376, 47393864, 47854080, 48315024, 48776684, 49239060, 49702144, 50165928, + 50630412, 51095588, 51561452, 52028000, 52495224, 52963124, 53431688, 53900916, + 54370808, 54841348, 55312540, 55784380, 56256856, 56729972, 57203720, 57678096, + 58153096, 58628716, 59104952, 59581800, 60059256, 60537316, 61015980, 61495236, + 61975084, 62455524, 62936548, 63418156, 63900340, 64383100, 64866428, 65350328, + 65834792, 66319816, 66805396, 67291536, 67778224, 68265456, 68753240, 69241560, + 69730424, 70219816, 70709744, 71200208, 71691192, 72182704, 72674736, 73167280, + 73660344, 74153920, 74648008, 75142600, 75637704, 76133296, 76629400, 77125992, + 77623080, 78120656, 78618728, 79117280, 79616320, 80115840, 80615832, 81116312, + 81617256, 82118680, 82620568, 83122920, 83625744, 84129024, 84632768, 85136968, + 85641624, 86146728, 86652288, 87158304, 87664760, 88171664, 88679008, 89186792, + 89695016, 90203680, 90712776, 91222304, 91732256, 92242648, 92753464, 93264704, + 93776368, 94288448, 94800952, 95313872, 95827208, 96340960, 96855120, 97369696, + 97884672, 98400064, 98915856, 99432048, 99948648, 100465640, 100983040, 101500832, + 102019016, 102537592, 103056568, 103575928, 104095672, 104615808, 105136328, 105657232, + 106178520, 106700184, 107222232, 107744656, 108267456, 108790632, 109314176, 109838096, + 110362384, 110887040, 111412064, 111937448, 112463208, 112989320, 113515800, 114042640, + 114569832, 115097392, 115625304, 116153568, 116682184, 117211160, 117740480, 118270152, + 118800168, 119330536, 119861248, 120392312, 120923712, 121455448, 121987536, 122519960, + 123052720, 123585816, 124119248, 124653016, 125187120, 125721552, 126256320, 126791416, + 127326840, 127862592, 128398664, 128935072, 129471800, 130008856, 130546224, 131083920, + 131621936, 132160272, 132698920, 133237888, 133777176, 134316768, 134856688, 135396912, + 135937440, 136478288, 137019440, 137560912, 138102688, 138644768, 139187152, 139729840, + 140272832, 140816128, 141359712, 141903616, 142447808, 142992304, 143537104, 144082192, + 144627568, 145173248, 145719232, 146265504, 146812064, 147358912, 147906048, 148453488, + 149001200, 149549216, 150097504, 150646096, 151194960, 151744112, 152293536, 152843264, + 153393264, 153943536, 154494096, 155044944, 155596064, 156147456, 156699120, 157251072, + 157803296, 158355792, 158908560, 159461616, 160014928, 160568512, 161122368, 161676496, + 162230896, 162785568, 163340496, 163895696, 164451168, 165006896, 165562896, 166119152, + 166675664, 167232448, 167789504, 168346816, 168904368, 169462208, 170020288, 170578624, + 171137232, 171696080, 172255200, 172814560, 173374192, 173934064, 174494192, 175054576, + 175615216, 176176096, 176737232, 177298608, 177860256, 178422128, 178984256, 179546640, + 180109264, 180672128, 181235248, 181798608, 182362208, 182926064, 183490144, 184054480, + 184619056, 185183872, 185748928, 186314224, 186879760, 187445520, 188011536, 188577776, + 189144272, 189710992, 190277936, 190845136, 191412560, 191980208, 192548112, 193116224, + 193684592, 194253168, 194821984, 195391040, 195960320, 196529824, 197099568, 197669520, + 198239712, 198810144, 199380784, 199951648, 200522752, 201094080, 201665616, 202237392, + 202809376, 203381600, 203954032, 204526688, 205099568, 205672672, 206246000, 206819536, + 207393296, 207967280, 208541472, 209115888, 209690528, 210265376, 210840432, 211415712, + 211991216, 212566912, 213142848, 213718976, 214295328, 214871888, 215448672, 216025664, + 216602864, 217180272, 217757888, 218335712, 218913760, 219492000, 220070464, 220649120, + 221228000, 221807072, 222386368, 222965856, 223545552, 224125456, 224705568, 225285872, + 225866400, 226447120, 227028032, 227609168, 228190496, 228772016, 229353760, 229935680, + 230517824, 231100160, 231682688, 232265424, 232848352, 233431472, 234014800, 234598336, + 235182048, 235765968, 236350080, 236934400, 237518896, 238103600, 238688496, 239273600, + 239858880, 240444352, 241030032, 241615888, 242201952, 242788192, 243374640, 243961264, + 244548096, 245135104, 245722304, 246309696, 246897280, 247485056, 248073008, 248661152, + 249249488, 249838016, 250426720, 251015616, 251604704, 252193968, 252783424, 253373056, + 253962880, 254552896, 255143088, 255733472, 256324032, 256914768, 257505696, 258096800, + 258688096, 259279568, 259871216, 260463056, 261055056, 261647264, 262239632, 262832192, + 263424928, 264017840, 264610928, 265204192, 265797632, 266391264, 266985072, 267579040, + 268173200, 268767520, 269362048, 269956736, 270551584, 271146624, 271741824, 272337216, + 272932768, 273528480, 274124384, 274720480, 275316704, 275913120, 276509728, 277106496, + 277703424, 278300544, 278897824, 279495264, 280092896, 280690688, 281288640, 281886752, + 282485056, 283083520 +}; +const Word32 pow_getbitsfrompulses_fx[16] = /*Q21 */ +{ + 2097152, 2190001, 2286961, 2388214, 2493948, 2604365, 2719671, 2840081, + 2965822, 3097129, 3234251, 3377442, 3526976, 3683128, 3846194, 4016480 +}; +const Word16 DDP_fx[4] = { 3, 0, 1, 2 };//Q0 + +const Word16 step_tcq[8][STATES] = { {0,4}, {0,4}, {1,5}, {1,5}, {2,6}, {2,6}, {3,7}, {3,7} }; // Q0 +const Word16 denc[8][STATES] = { {0,2}, {2,0}, {1,3}, {3,1}, {2,0}, {0,2}, {3,1}, {1,3} }; /* enc trellis Q0*/ +const Word16 ddec[8][STATES] = { {0,2}, {1,3}, {2,0}, {3,1}, {2,0}, {3,1}, {0,2}, {1,3} }; /* dec trellis Q0*/ + + +const Word16 step_LSB[STATES_LSB][2] = { {0,1}, {2,3}, {0,1}, {2,3} }; // Q0 +const Word16 denc_LSB[STATES_LSB][2] = { {0,3}, {2,1}, {3,0}, {1,2} }; // Q0 +const Word16 dqnt_LSB[STATES_LSB][4] = { {0,8,1,8}, {0,8,1,8}, {8,0,8,1}, {8,0,8,1} }; // Q0 + +const Word16 dstep_LSB[4][2] = { {0,2}, {0,2}, {1,3}, {1,3} }; // Q0 +const Word16 ddec_LSB[4][2] = { {0,3}, {3,0}, {2,1}, {1,2} }; // Q0 + + +const Word16 nextstate[STATES][2] = {{0, 1}, {2, 3}, {4, 5}, {6, 7}, {0, 1}, {2, 3}, {4, 5}, {6, 7}};/*current state points to next two states Q0*/ + +/*------------------------------------------------------------------------------* + * PVQ tables + *------------------------------------------------------------------------------*/ + +const Word16 fine_gain_bits[8] = {0, 0, 0, 1, 2, 2, 4, 5}; // Q0 +const Word16 finegain_1_fx[2] = { -12204, 12647 }; /* Q14 */ +const Word16 finegain_2_fx[4] = { -17773, -5925, 6010, 18769 }; /* Q14 */ +const Word16 finegain_3_fx[8] = { -16384, -11703, -7022, -2341, 2341, 7022, 11703, 16384 }; /* Q14 */ +const Word16 finegain_4_fx[16] = /* Q14 */ +{ + -21683, -18292, -14998, -11876, -8936, -6239, -3702, -1371, + 945, 3275, 6088, 9079, 12450, 15999, 19796, 23868 +}; +const Word16 finegain_5_fx[32] = /* Q14 */ +{ + -21462, -18895, -16284, -14135, -12605, -11307, -10139, -8910, + -8028, -6792, -5638, -4812, -3672, -2681, -1725, -479, + 449, 1390, 2364, 3433, 4579, 5516, 6769, 7767, + 9085, 10152, 11009, 12535, 14765, 17093, 20094, 24716 +}; +const Word16* finegain_fx[5] = { finegain_1_fx, finegain_2_fx, finegain_3_fx, finegain_4_fx, finegain_5_fx };/* Q14 */ + + +const UWord8 hBitsMinus1_N01[2] = {1, 7}; // Q0 + +const UWord8 hBitsMinus1_N02[65]= +{ + 64, 15, 23, 28, 31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, + 47, 48, 49, 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, 57, 58, 59, + 60, 61, 62, 63, 63, 64, 65, 65, 67, 68, 69, 69, 70, 71, 72, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 80, 81, 82, 83, 84, 85, 86, 87, + 87 +}; // Q0 + +const UWord8 hBitsMinus1_N03[65]= +{ + 64, 20, 33, 41, 48, 53, 57, 61, 64, 66, 69, 71, 73, 75, 76, 78, + 80, 81, 82, 83, 85, 86, 88, 90, 92, 93, 95, 96, 98, 99, 100, 102, + 104, 106, 108, 110, 111, 113, 114, 115, 118, 120, 122, 123, 125, 127, 128, 129, + 131, 133, 135, 137, 139, 141, 142, 144, 145, 146, 149, 151, 153, 155, 157, 158, + 160 +}; // Q0 + +const UWord8 hBitsMinus1_N04[65]= +{ + 64, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, 97, 100, 102, 105, + 107, 109, 111, 113, 115, 116, 119, 122, 125, 127, 130, 132, 134, 136, 138, 141, + 144, 147, 150, 152, 154, 156, 158, 160, 164, 167, 170, 173, 175, 177, 180, 182, + 184, 187, 190, 193, 196, 199, 201, 203, 205, 207, 211, 214, 217, 220, 222, 225, + 227 +}; // Q0 + +const UWord8 hBitsMinus1_N05[54]= +{ + 53, 26, 45, 59, 70, 79, 87, 94, 100, 105, 110, 114, 118, 122, 125, 128, + 131, 134, 136, 139, 141, 144, 148, 152, 155, 158, 161, 164, 167, 170, 172, 176, + 181, 184, 188, 191, 194, 197, 200, 202, 207, 211, 215, 219, 222, 225, 228, 231, + 233, 238, 242, 246, 250, 253 +}; // Q0 + +const UWord8 hBitsMinus1_N06[42]= +{ + 41, 28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, + 153, 156, 159, 162, 165, 168, 173, 178, 183, 187, 191, 194, 198, 201, 204, 209, + 214, 219, 224, 228, 231, 235, 238, 241, 247, 253 +}; // Q0 + +const UWord8 hBitsMinus1_N07[34]= +{ + 33, 30, 52, 70, 85, 98, 109, 118, 126, 134, 141, 147, 153, 158, 163, 168, + 172, 176, 180, 184, 188, 191, 197, 203, 208, 213, 218, 222, 226, 230, 233, 240, + 246, 252 +}; // Q0 + +const UWord8 hBitsMinus1_N08[29]= +{ + 28, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, 185, + 190, 195, 200, 204, 208, 212, 219, 226, 232, 238, 243, 248, 253 +}; // Q0 + +const UWord8 hBitsMinus1_N09[25]= +{ + 24, 33, 58, 79, 97, 112, 125, 137, 148, 157, 166, 174, 182, 189, 195, 201, + 207, 212, 217, 222, 227, 231, 240, 247, 254 +}; // Q0 + +const UWord8 hBitsMinus1_N10[22]= +{ + 21, 34, 61, 83, 101, 118, 132, 145, 157, 167, 177, 186, 194, 202, 209, 216, + 222, 228, 234, 239, 245, 250 +}; // Q0 + +const UWord8 hBitsMinus1_N11[19]= +{ + 18, 35, 63, 86, 106, 123, 139, 152, 165, 176, 187, 197, 206, 214, 222, 230, + 237, 243, 250 +}; // Q0 + +const UWord8 hBitsMinus1_N12[17]= +{ + 16, 36, 65, 89, 110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, + 250 +}; // Q0 + +const UWord8 hBitsMinus1_N13[16]= +{ + 15, 37, 67, 92, 113, 133, 150, 165, 180, 193, 205, 216, 227, 237, 246, 254, +}; // Q0 + +const UWord8 hBitsMinus1_N14[14]= +{ + 13, 38, 68, 94, 117, 137, 155, 171, 186, 200, 213, 225, 236, 247 +}; // Q0 + +const UWord8 hBitsMinus1_N15[13]= +{ + 12, 39, 70, 97, 120, 141, 160, 177, 193, 207, 221, 233, 245 +}; // Q0 + +const UWord8 hBitsMinus1_N16[13]= +{ + 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, 228, 241, 253 +}; // Q0 + +const UWord8 hBitsMinus1_N17[12]= +{ + 11, 40, 73, 101, 126, 148, 168, 187, 204, 220, 234, 248 +}; // Q0 + +const UWord8 hBitsMinus1_N18[12]= +{ + 11, 41, 74, 103, 128, 151, 172, 191, 209, 225, 241, 255 +}; // Q0 + +const UWord8 hBitsMinus1_N19[11]= +{ + 10, 41, 75, 105, 131, 154, 176, 196, 214, 231, 247 +}; // Q0 + +const UWord8 hBitsMinus1_N20[11]= +{ + 10, 42, 77, 107, 133, 157, 179, 200, 219, 236, 253 +}; // Q0 + +const UWord8 hBitsMinus1_N21[10]= +{ + 9, 43, 78, 108, 135, 160, 183, 204, 223, 241 +}; // Q0 + +const UWord8 hBitsMinus1_N22[10]= +{ + 9, 43, 79, 110, 138, 163, 186, 207, 227, 246 +}; // Q0 + +const UWord8 hBitsMinus1_N23[10]= +{ + 9, 44, 80, 111, 140, 165, 189, 211, 231, 250 +}; // Q0 + +const UWord8 hBitsMinus1_N24[10]= +{ + 9, 44, 81, 113, 142, 168, 192, 214, 235, 255 +}; // Q0 + +const UWord8 hBitsMinus1_N25[9]= +{ + 8, 45, 82, 114, 143, 170, 195, 217, 239 +}; // Q0 + +const UWord8 hBitsMinus1_N26[9]= +{ + 8, 45, 83, 116, 145, 172, 197, 221, 242 +}; // Q0 + +const UWord8 hBitsMinus1_N27[9]= +{ + 8, 46, 84, 117, 147, 175, 200, 224, 246 +}; // Q0 + +const UWord8 hBitsMinus1_N28[9]= +{ + 8, 46, 84, 118, 149, 177, 202, 227, 249 +}; // Q0 +const UWord8 hBitsMinus1_N29[9]= +{ + 8, 46, 85, 119, 150, 179, 205, 229, 252 +}; // Q0 +const UWord8 hBitsMinus1_N30[8]= +{ + 7, 47, 86, 121, 152, 181, 207, 232 +}; // Q0 +const UWord8 hBitsMinus1_N31[8]= +{ + 7, 47, 87, 122, 153, 182, 209, 235 +}; // Q0 +const UWord8 hBitsMinus1_N32[8]= +{ + 7, 47, 87, 123, 155, 184, 212, 237 +}; // Q0 +const UWord8 hBitsMinus1_N33[8]= +{ + 7, 48, 88, 124, 156, 186, 214, 240 +}; // Q0 +const UWord8 hBitsMinus1_N34[8]= +{ + 7, 48, 89, 125, 158, 188, 216, 242 +}; // Q0 +const UWord8 hBitsMinus1_N35[8]= +{ + 7, 49, 90, 126, 159, 189, 218, 245 +}; // Q0 +const UWord8 hBitsMinus1_N36[8]= +{ + 7, 49, 90, 127, 160, 191, 220, 247 +}; // Q0 +const UWord8 hBitsMinus1_N37[8]= +{ + 7, 49, 91, 128, 162, 193, 222, 249 +}; // Q0 +const UWord8 hBitsMinus1_N38[8]= +{ + 7, 49, 91, 129, 163, 194, 224, 251 +}; // Q0 +const UWord8 hBitsMinus1_N39[8]= +{ + 7, 50, 92, 130, 164, 196, 225, 253 +}; // Q0 +const UWord8 hBitsMinus1_N40[8]= +{ + 7, 50, 93, 131, 165, 197, 227, 255 +}; // Q0 +const UWord8 hBitsMinus1_N41[7]= +{ + 6, 50, 93, 131, 166, 199, 229 +}; // Q0 +const UWord8 hBitsMinus1_N42[7]= +{ + 6, 51, 94, 132, 167, 200, 230 +}; // Q0 +const UWord8 hBitsMinus1_N43[7]= +{ + 6, 51, 94, 133, 168, 201, 232 +}; // Q0 +const UWord8 hBitsMinus1_N44[7]= +{ + 6, 51, 95, 134, 170, 203, 234 +}; // Q0 +const UWord8 hBitsMinus1_N45[7]= +{ + 6, 51, 95, 135, 171, 204, 235 +}; // Q0 +const UWord8 hBitsMinus1_N46[7]= +{ + 6, 52, 96, 135, 172, 205, 237 +}; // Q0 +const UWord8 hBitsMinus1_N47[7]= +{ + 6, 52, 96, 136, 173, 206, 238 +}; // Q0 +const UWord8 hBitsMinus1_N48[7]= +{ + 6, 52, 97, 137, 174, 208, 240 +}; // Q0 +const UWord8 hBitsMinus1_N49[7]= +{ + 6, 52, 97, 138, 175, 209, 241 +}; // Q0 +const UWord8 hBitsMinus1_N50[7]= +{ + 6, 53, 98, 138, 175, 210, 243 +}; // Q0 +const UWord8 hBitsMinus1_N51[7]= +{ + 6, 53, 98, 139, 176, 211, 244 +}; // Q0 +const UWord8 hBitsMinus1_N52[7]= +{ + 6, 53, 99, 140, 177, 212, 245 +}; // Q0 +const UWord8 hBitsMinus1_N53[7]= +{ + 6, 53, 99, 140, 178, 213, 247 +}; // Q0 +const UWord8 hBitsMinus1_N54[7]= +{ + 6, 54, 100, 141, 179, 214, 248 +}; // Q0 +const UWord8 hBitsMinus1_N55[7]= +{ + 6, 54, 100, 142, 180, 216, 249 +}; // Q0 +const UWord8 hBitsMinus1_N56[7]= +{ + 6, 54, 100, 142, 181, 217, 250 +}; // Q0 +const UWord8 hBitsMinus1_N57[7]= +{ + 6, 54, 101, 143, 181, 218, 252 +}; +const UWord8 hBitsMinus1_N58[7]= +{ + 6, 54, 101, 143, 182, 219, 253 +}; // Q0 +const UWord8 hBitsMinus1_N59[7]= +{ + 6, 55, 102, 144, 183, 220, 254 +}; // Q0 +const UWord8 hBitsMinus1_N60[7]= +{ + 6, 55, 102, 145, 184, 221, 255 +}; // Q0 +const UWord8 hBitsMinus1_N61[6]= +{ + 5, 55, 102, 145, 185, 221 +}; // Q0 +const UWord8 hBitsMinus1_N62[6]= +{ + 5, 55, 103, 146, 185, 222 +}; // Q0 +const UWord8 hBitsMinus1_N63[6]= +{ + 5, 55, 103, 146, 186, 223 +}; // Q0 +const UWord8 hBitsMinus1_N64[6]= +{ + 5, 55, 103, 147, 187, 224 +}; // Q0 +const Word16 dsHighDiracsTab[PVQ_MAX_BAND_SIZE - DS_INDEX_LINEAR_END ] = +{ + 23, 25, 27, 29, 31, 33, 35, 37, 39, + 43, 47, 51, 55, 59, 63, 67, 71, 75, + 83, 91, 99, 107, 115, 123, 131, 139, 147, + 163, 179, 195, 211, 227, 243, 259, 275, 291, + 323, 355, 387, 419, 451, 483, 512 +}; // Q0 + +const UWord32 intLimCDivInvDQ31[67+1] = +{ + 0x00000000, 0x80000000, 0x40000000, 0x2aaaaaab, 0x20000000, 0x1999999a, 0x15555556, 0x12492493, + 0x10000000, 0x0e38e38f, 0x0ccccccd, 0x0ba2e8bb, 0x0aaaaaab, 0x09d89d8a, 0x0924924a, 0x08888889, + 0x08000000, 0x07878788, 0x071c71c8, 0x06bca1b0, 0x06666667, 0x06186187, 0x05d1745e, 0x0590b217, + 0x05555556, 0x051eb852, 0x04ec4ec5, 0x04bda130, 0x04924925, 0x0469ee59, 0x04444445, 0x04210843, + 0x04000000, 0x03e0f83f, 0x03c3c3c4, 0x03a83a84, 0x038e38e4, 0x03759f23, 0x035e50d8, 0x03483484, + 0x03333334, 0x031f3832, 0x030c30c4, 0x02fa0be9, 0x02e8ba2f, 0x02d82d83, 0x02c8590c, 0x02b93106, + 0x02aaaaab, 0x029cbc15, 0x028f5c29, 0x02828283, 0x02762763, 0x026a43a0, 0x025ed098, 0x0253c826, + 0x02492493, 0x023ee090, 0x0234f72d, 0x022b63cc, 0x02222223, 0x02192e2a, 0x02108422, 0x02082083, + 0x02000000, 0x01f81f82, 0x01f07c20, 0x01e9131b +}; // Q0 + +const UWord8 obtainEnergyQuantizerDensity_f[57] = + { + 1, 1, 1, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 4, 4, 4, + 4, 4, 4, 6, 6, 6, 6, 8, + 8, 8, 10,10,12,12,14,14, + 16,18,20,20,22,24,26,30, + 32,34,38,42,46,50,54,58, + 64,70,76,82,90,98,108,118, 128 +}; // Q0 + + +/* (char)ceil(log2(hBitsN[N][0])) - 2) */ +const UWord8 f_log2_n[ PVQ_MAX_BAND_SIZE + 1] = +{ + 0xff, 0xff, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01}; // Q0 + +const UWord8 * const hBitsN[ PVQ_MAX_BAND_SIZE + 1 ]= +{ +f_log2_n/*N=0*/, hBitsMinus1_N01, hBitsMinus1_N02, hBitsMinus1_N03, hBitsMinus1_N04, +hBitsMinus1_N05, hBitsMinus1_N06, hBitsMinus1_N07, hBitsMinus1_N08, hBitsMinus1_N09, +hBitsMinus1_N10, hBitsMinus1_N11, hBitsMinus1_N12, hBitsMinus1_N13, hBitsMinus1_N14, +hBitsMinus1_N15, hBitsMinus1_N16, hBitsMinus1_N17, hBitsMinus1_N18, hBitsMinus1_N19, +hBitsMinus1_N20, hBitsMinus1_N21, hBitsMinus1_N22, hBitsMinus1_N23, hBitsMinus1_N24, +hBitsMinus1_N25, hBitsMinus1_N26, hBitsMinus1_N27, hBitsMinus1_N28, hBitsMinus1_N29, +hBitsMinus1_N30, hBitsMinus1_N31, hBitsMinus1_N32, hBitsMinus1_N33, hBitsMinus1_N34, +hBitsMinus1_N35, hBitsMinus1_N36, hBitsMinus1_N37, hBitsMinus1_N38, hBitsMinus1_N39, +hBitsMinus1_N40, hBitsMinus1_N41, hBitsMinus1_N42, hBitsMinus1_N43, hBitsMinus1_N44, +hBitsMinus1_N45, hBitsMinus1_N46, hBitsMinus1_N47, hBitsMinus1_N48, hBitsMinus1_N49, +hBitsMinus1_N50, hBitsMinus1_N51, hBitsMinus1_N52, hBitsMinus1_N53, hBitsMinus1_N54, +hBitsMinus1_N55, hBitsMinus1_N56, hBitsMinus1_N57, hBitsMinus1_N58, hBitsMinus1_N59, +hBitsMinus1_N60, hBitsMinus1_N61, hBitsMinus1_N62, hBitsMinus1_N63, hBitsMinus1_N64, +}; // Q0 + +const Word16 lim_neg_inv_tbl_fx[MAX_SPLITS + 1 ] = +{ /* 1 = optimized inv_tbl_fx constant for div by 1, Q15 */ + /* 2-10 = negated inv_tbl_fx Q15*/ + 0, + -32768, -16384, -10923, -8192, -6554, + -5462, -4681, -4096, -3641, -3277 +}; + +const Word16 Idx2Freq_Tbl[] = { 6554/*12.8*512*/, 48 * 512, 13108/*25.6*512*/, 32 * 512, 16 * 512, 8 * 512 }; /* in Q9 */ + +const Word16 fg_inv_tbl_fx [HQ_MAX_BAND_LEN/8 + 1 ] = +{ /* i/8 , slice of inv_tbl_fx , Q15 */ + 0, + 4096, 2048, 1366, 1024, 820, 683, + 586, 512, 456, 410, 373, 342 +}; + + +const UWord32 exactdivodd[ODD_DIV_SIZE] = +{ + /* exactdivodd[0]=1/1, exactdivodd[1]=1/3, exactdivodd[n]=1/(2*n+1), exactdivodd[47]=1/95 ) */ + 1U, 2863311531U, 3435973837U, 3067833783U, 954437177U, 3123612579U, 3303820997U, 4008636143U, + 4042322161U, 678152731U, 1022611261U, 3921491879U, 3264175145U, 1749801491U, 1332920885U, 3186588639U, + 1041204193U, 2331553675U, 2437684141U, 2532929431U, 3247414297U, 799063683U, 2767867813U, 1736263375U, + 438261969U, 4210752251U, 2350076445U, 1483715975U, 3089362441U, 2693454067U, 3238827797U, 3204181951U, + 3237744577U, 128207979U, 2738819725U, 3811027319U, 3353604601U, 2519714147U, 1059797125U, 1631000239U, + 2014922929U, 724452315U, 4244438269U, 1875962727U, 4198451177U, 3539808211U, 1062196213U, 3571604383U +}; // Q0 + +const Word16 gain_cb_size[MAX_GAIN_BITS] = {2, 4, 8, 16, 32}; // Q0 + +const Word16 inner_frame_tbl[4] = {L_FRAME8k, L_FRAME16k, L_FRAME32k, L_FRAME48k}; /* corresponds to NB, WB, SWB, FB Q0*/ +const Word16 hq_nominal_scaling_inv[7] = { 0, 8192, 11585, 0, 16384, 0, 20066 }; /*Q13 */ +const Word16 hq_nominal_scaling[7] = { 0, 32767, 23170, 0, 16384, 0, 13377 }; /*Q15 */ + +const Word16 l_spec_tbl[4] = {L_SPEC8k, L_SPEC16k, L_SPEC32k, L_SPEC48k}; /* corresponds to NB, WB, SWB, FB Q0*/ +const Word16 l_spec_ext_tbl[4] = {0, L_SPEC16k_EXT, L_SPEC32k_EXT, L_SPEC48k_EXT}; /* corresponds to NB, WB, SWB, FB Q0*/ +const Word16 sinq_16k[3 * L_FRAME16k / 20] =/*Q15 */ +{ + 536, 1608, 2678, 3745, 4808, 5866, 6918, 7962, + 8998, 10024, 11039, 12043, 13033, 14010, 14972, 15917, + 16846, 17757, 18648, 19520, 20371, 21199, 22006, 22788, + 23546, 24279, 24986, 25667, 26319, 26944, 27540, 28106, + 28642, 29147, 29622, 30064, 30475, 30852, 31197, 31508, + 31786, 32029, 32238, 32413, 32553, 32658, 32728, 32763 +}; +const Word16 sinq_32k[3 * L_FRAME32k / 20] =/*Q15 */ +{ + 268, 804, 1340, 1876, 2411, 2945, 3479, 4011, 4543, 5073, 5602, 6130, + 6655, 7180, 7702, 8222, 8740, 9255, 9768, 10279, 10786, 11291, 11793, 12292, + 12787, 13279, 13767, 14252, 14733, 15210, 15683, 16151, 16616, 17075, 17531, 17981, + 18427, 18868, 19304, 19734, 20160, 20580, 20994, 21403, 21806, 22203, 22595, 22980, + 23359, 23732, 24098, 24459, 24812, 25159, 25499, 25832, 26159, 26478, 26790, 27095, + 27393, 27684, 27967, 28243, 28511, 28771, 29024, 29269, 29506, 29735, 29956, 30170, + 30375, 30572, 30761, 30941, 31114, 31278, 31433, 31580, 31719, 31849, 31971, 32084, + 32189, 32285, 32372, 32451, 32521, 32582, 32634, 32678, 32713, 32740, 32757, 32766 +}; +const Word16 sinq_48k[3 * L_FRAME48k / 20] =/*Q15 */ +{ + 179, 536, 893, 1251, 1608, 1965, 2321, 2678, 3034, 3390, 3745, 4100, + 4454, 4808, 5161, 5514, 5866, 6217, 6568, 6918, 7267, 7615, 7962, 8308, + 8654, 8998, 9341, 9683, 10024, 10364, 10702, 11039, 11375, 11710, 12043, 12375, + 12705, 13033, 13361, 13686, 14010, 14332, 14653, 14972, 15289, 15604, 15918, 16229, + 16539, 16846, 17152, 17455, 17757, 18056, 18353, 18648, 18941, 19232, 19520, 19806, + 20090, 20371, 20650, 20926, 21200, 21471, 21740, 22006, 22269, 22530, 22789, 23044, + 23297, 23547, 23794, 24038, 24280, 24519, 24754, 24987, 25217, 25444, 25667, 25888, + 26106, 26320, 26531, 26740, 26945, 27147, 27345, 27541, 27733, 27921, 28107, 28289, + 28468, 28643, 28815, 28984, 29149, 29310, 29468, 29623, 29774, 29922, 30066, 30206, + 30343, 30476, 30606, 30732, 30854, 30973, 31087, 31199, 31306, 31410, 31510, 31606, + 31699, 31788, 31873, 31954, 32031, 32105, 32175, 32241, 32303, 32361, 32415, 32466, + 32513, 32556, 32595, 32630, 32661, 32688, 32712, 32731, 32747, 32759, 32766, 32767 +}; +/*------------------------------------------------------------------------------* + * LR-MDCT tables + *------------------------------------------------------------------------------*/ + +/* subband width tables */ + +/* NB short win: 7200/8000/9600, 13200/16400/24400 */ +const Word16 band_width_40_4_6_0_0_0[4] = { 6, 8, 11, 15 }; // Q0 +const Word16 band_width_40_5_6_0_0_0[5] = { 6, 7, 7, 9, 11 }; // Q0 + +/* NB long win: 7200, 8000, 9600, 13200, 16400 */ +const Word16 band_width_160_13_6_2_0_0[13] = { 6, 6, 6, 6, 7, 8, 9, 10, 13, 15, 19, 24, 31 }; // Q0 +const Word16 band_width_160_14_6_3_0_0[14] = { 6, 6, 6, 6, 6, 7, 8, 9, 10, 12, 15, 18, 22, 29 }; // Q0 +const Word16 band_width_160_17_6_3_0_0[17] = { 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 13, 15, 17, 19 }; // Q0 +const Word16 band_width_160_18_6_4_0_0[18] = { 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 12, 14, 15, 17 }; // Q0 + +/* WB short win: 13200/16400/24400 */ +const Word16 band_width_80_7_6_0_0_0[7] = { 6, 7, 8, 10, 12, 16, 21 }; // Q0 + +/* WB long win: 13200, 16400 */ +const Word16 band_width_320_18_6_3_0_0[18] = { 6, 6, 6, 6, 6, 7, 7, 8, 10, 11, 13, 16, 19, 24, 30, 37, 47, 61 }; // Q0 +const Word16 band_width_320_20_6_3_0_0[20] = { 6, 6, 6, 6, 6, 6, 7, 8, 8, 9, 11, 12, 14, 17, 20, 23, 28, 34, 42, 51 }; // Q0 + +/* SWB short win: 13200, 16400 */ +const Word16 band_width_142_8_8_0_0_0[8] = {7,8,10,11,15,21,29,41}; // Q0 +const Word16 band_width_160_8_8_0_0_0[8] = { 8, 9, 11,13,17,23,32,47}; // Q0 + +/* SWB long win: 13200, 16400 */ +const Word16 band_width_568_22_6_2_0_0[22] = { 6, 6, 6, 6, 6, 6, 7, 8, 9, 10, 11, 13, 16, 19, 23, 28, 34, 42, 55, 68, 84, 105}; // Q0 +const Word16 band_width_640_24_6_4_0_0[24] = { 6, 6, 6, 6, 6, 6, 7,7,8,9,10,11,13,15,18,21,26,32,39,48,59, 74,92,115}; // Q0 + +/* LR-MDCT: NB configuration tables */ +const Xcore_Config xcore_config_8kHz_007200bps_long = { 13, L_FRAME8k, band_width_160_13_6_2_0_0, 536870912L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 2, 0, 0 /*p2a_th*/, 13107/*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; +const Xcore_Config xcore_config_8kHz_008000bps_long = { 14, L_FRAME8k, band_width_160_14_6_3_0_0, 536870912L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 2, 0, 0 /*p2a_th*/, 13107/*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; +const Xcore_Config xcore_config_8kHz_013200bps_long = { 17, L_FRAME8k, band_width_160_17_6_3_0_0, 429496730L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 4, 2, 24576/*p2a_th*/, 13107/*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; +const Xcore_Config xcore_config_8kHz_016400bps_long = { 18, L_FRAME8k, band_width_160_18_6_4_0_0, 322122547L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 2, 0, 0 /*p2a_th*/, 13107/*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; + +const Xcore_Config xcore_config_8kHz_007200bps_short = { 4, L_FRAME8k / NUM_TIME_SWITCHING_BLOCKS, band_width_40_4_6_0_0_0, 966367642L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 2, 0, 0/*p2a_th*/,9830 /*pd_thresh*/, 2949/*ld_slope*/, 19661/*ni_coef*/ }; +const Xcore_Config xcore_config_8kHz_008000bps_short = { 4, L_FRAME8k / NUM_TIME_SWITCHING_BLOCKS, band_width_40_4_6_0_0_0, 1181116006L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 4, 0, 0/*p2a_th*/,9830 /*pd_thresh*/, 2949/*ld_slope*/, 19661/*ni_coef*/ }; +const Xcore_Config xcore_config_8kHz_013200bps_short = { 5, L_FRAME8k / NUM_TIME_SWITCHING_BLOCKS, band_width_40_5_6_0_0_0, 751619276L, 24576, 24576/*eref*/, 11469, 11469/*bit_alloc_weight*/, 2, 4, 0, 0/*p2a_th*/,22938/*pd_thresh*/, 3604/*ld_slope*/, 19661/*ni_coef*/ }; +const Xcore_Config xcore_config_8kHz_016400bps_short = { 5, L_FRAME8k / NUM_TIME_SWITCHING_BLOCKS, band_width_40_5_6_0_0_0, 536870912L, 24576, 24576/*eref*/, 11469, 11469/*bit_alloc_weight*/, 2, 6, 0, 0/*p2a_th*/,22491/*pd_thresh*/, 3604/*ld_slope*/, 19661/*ni_coef*/ }; + +/* LR-MDCT: WB configuration tables */ +const Xcore_Config xcore_config_16kHz_013200bps_long = { 18, L_FRAME16k, band_width_320_18_6_3_0_0, 429496730L, 24576, 24576/*eref*/, 13106, 13106/*bit_alloc_weight*/, 2, 6, 3, 24576/*p2a_th*/, 13107/*pd_thresh*/, 3932/*ld_slope*/, 18022/*ni_coef*/ }; +const Xcore_Config xcore_config_16kHz_016400bps_long = { 20, L_FRAME16k, band_width_320_20_6_3_0_0, 429496730L, 24576, 24576/*eref*/, 13106, 13106/*bit_alloc_weight*/, 2, 6, 3, 24576/*p2a_th*/, 13107/*pd_thresh*/, 3932/*ld_slope*/, 19660/*ni_coef*/ }; + +const Xcore_Config xcore_config_16kHz_013200bps_short = { 7, L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS, band_width_80_7_6_0_0_0, 966367642L, 24576, 24576/*eref*/, 9830, 9830/*bit_alloc_weight*/, 2, 4, 0, 0 /*p2a_th*/, 9830 /*pd_thresh*/, 4258/*ld_slope*/, 18022/*ni_coef*/ }; +const Xcore_Config xcore_config_16kHz_016400bps_short = { 7, L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS, band_width_80_7_6_0_0_0, 966367642L, 24576, 24576/*eref*/, 11468, 11468/*bit_alloc_weight*/, 2, 8, 0, 0 /*p2a_th*/, 9830 /*pd_thresh*/, 4258/*ld_slope*/, 19660/*ni_coef*/ }; + +/* LR-MDCT: SWB configuration tables */ +const Xcore_Config xcore_config_32kHz_013200bps_long = { 22, 568, band_width_568_22_6_2_0_0, 322122547L, 24576, 24576/*eref*/, 6554, 6554/*bit_alloc_weight*/, 2, 4, 5, 28672/*p2a_th*/, 13107 /*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; +const Xcore_Config xcore_config_32kHz_016400bps_long = { 24, 640, band_width_640_24_6_4_0_0, 322122547L, 24576, 24576/*eref*/, 8192, 8192/*bit_alloc_weight*/, 2, 4, 5, 28672/*p2a_th*/, 13107 /*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; +const Xcore_Config xcore_config_32kHz_013200bps_short = { 8, 568 / NUM_TIME_SWITCHING_BLOCKS, band_width_142_8_8_0_0_0, 1610612736L, 24576, 24576/*eref*/, 13107, 13107/*bit_alloc_weight*/, 2, 4, 0, 0 /*p2a_th*/, 16384 /*pd_thresh*/, 3604/*ld_slope*/, 19661/*ni_coef*/ }; +const Xcore_Config xcore_config_32kHz_016400bps_short = { 8, 640 / NUM_TIME_SWITCHING_BLOCKS, band_width_160_8_8_0_0_0, 644245094L, 24576, 24576/*eref*/, 8192, 8192/*bit_alloc_weight*/, 2, 4, 0, 0 /*p2a_th*/, 9830 /*pd_thresh*/, 4260/*ld_slope*/, 19661/*ni_coef*/ }; + +/* bandwidths */ +const Word16 Nb[ NB_SFM] = +{ + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, + 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 32, 32, 32, 32, 32, 32, 32, 32 +}; // Q0 + +/* log2(Nb) to calculate minimum bits for one pulse in PVQ */ +const Word16 LNb[ NB_SFM] = +{ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, + 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5 +}; // Q0 + + +/*------------------------------------------------------------------------------* + * GSC tables + *------------------------------------------------------------------------------*/ + +const Word16 gsc_sfm_start[MBANDS_GN] = {0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240}; // Q0 + +const Word16 gsc_sfm_end[MBANDS_GN] = {16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256}; // Q0 + +const Word16 gsc_sfm_size[MBANDS_GN] = {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; // Q0 + +const Word16 sm_table_fx[] = +{ + 32767, 32126, 31480, 30838, 30196, 29557, 28918, 28279, 27643, 27007, + 26375, 25746, 25120, 24494, 23875, 23255, 22643, 22033, 21427, 20824, + 20228, 19638, 19048, 18468, 17891, 17321, 16758, 16197, 15647, 15103, + 14562, 14031, 13507, 12989, 12481, 11980, 11488, 11000, 10525, 10056, + 9598, 9146, 8706, 8274, 7851, 7438, 7035, 6642, 6259, 5885, + 5521, 5171, 4830, 4499, 4178, 3870, 3572, 3287, 3011, 2746, + 2494, 2254, 2025, 1809, 1602, 1412, 1229, 1062, 904, 760, + 629, 511, 403, 308, 226, 157, 102, 56, 26, 7, +}; // Q15 + +const Word16 GSC_freq_bits[] = +{ + 21, 66, -6, 25, 15, 11, 10, 5, 0, 0, 5, 4, 0, 0, 4, 0, 0, /* ACELP_5k00*/ + 21, 66, -6, 25, 15, 11, 10, 5, 0, 0, 5, 4, 0, 0, 4, 0, 0, /* ACELP_6k15*/ + 21, 66, -6, 25, 15, 11, 10, 5, 0, 0, 5, 4, 0, 0, 4, 0, 0, /* ACELP_7k20*/ + 21, 74, -4, 26, 16, 12, 11, 9, 0, 0, 4, 4, 1, 1, 3, 0, 0, /* ACELP_8k00*/ + 26, 80, -3, 28, 18, 13, 12, 9, 0, 0, 4, 4, 1, 1, 3, 0, 0, /* ACELP_9k60*/ + 26, 96, -4, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_11k60*/ + 26, 96, -4, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_12k15*/ + 26, 96, -4, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_12k85*/ + 26, 96, -4, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_13k20*/ + 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_14k80*/ + 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_16k40*/ + 26, 96, 0, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_22k60*/ + 26, 96, 0, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4 /* ACELP_24k40*/ +}; // Q0 +const Word32 GSC_freq_bits_fx[] =/*Q18*/ +{ + 5505024, 17563648, -1572864, 6553600, 3932160, 2883584, 2621440, 1310720, 0, 0, 1310720, 1048576, 0, 0, 1048576, 0, 0, /* ACELP_5k00*/ + 5505024, 17563648, -1572864, 6553600, 3932160, 2883584, 2621440, 1310720, 0, 0, 1310720, 1048576, 0, 0, 1048576, 0, 0, /* ACELP_6k15*/ + 5505024, 17563648, -1572864, 6553600, 3932160, 2883584, 2621440, 1310720, 0, 0, 1310720, 1048576, 0, 0, 1048576, 0, 0, /* ACELP_7k20*/ + 5505024, 19660800, -1048576, 6815744, 4194304, 3145728, 2883584, 2359296, 0, 0, 1048576, 1048576, 262144, 262144, 786432, 0, 0, /* ACELP_8k00*/ + 6815744, 20971520, -786432, 7340032, 4718592, 3407872, 3145728, 2359296, 0, 0, 1048576, 1048576, 262144, 262144, 786432, 0, 0, /* ACELP_8k00*/ + 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_11k60*/ + 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_12k15*/ + 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_12k85*/ + 8126464, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_13k20*/ 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_14k80*/ + 8126464, 25165824, -262144, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_13k20*/ 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_16k40*/ + 8126464, 25165824, 0, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_22k60*/ 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_16k40*/ + 8126464, 25165824, 0, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, /* ACELP_22k60*/ 26, 96, -1, 28, 18, 13, 12,10,10, 5, 4, 4, 1, 0, 1, 3, 4, /* ACELP_16k40*/ +}; + +const Word32 GSC_freq_bits_fx_Q18[] =/*Q18*/ +{ + 5505024, 17301504, -1572864, 6553600, 3932160, 2883584, 2621440, 1310720, 0, 0, 1310720, 1048576, 0, 0, 1048576, 0, 0, + 5505024, 17301504, -1572864, 6553600, 3932160, 2883584, 2621440, 1310720, 0, 0, 1310720, 1048576, 0, 0, 1048576, 0, 0, + 5505024, 17301504, -1572864, 6553600, 3932160, 2883584, 2621440, 1310720, 0, 0, 1310720, 1048576, 0, 0, 1048576, 0, 0, + 5505024, 19398656, -1048576, 6815744, 4194304, 3145728, 2883584, 2359296, 0, 0, 1048576, 1048576, 262144, 262144, 786432, 0, 0, + 6815744, 20971520, -786432, 7340032, 4718592, 3407872, 3145728, 2359296, 0, 0, 1048576, 1048576, 262144, 262144, 786432, 0, 0, + 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, + 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, + 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, + 6815744, 25165824, -1048576, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, + 6815744, 25165824, -262144, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, + 6815744, 25165824, -262144, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, + 6815744, 25165824, 0, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, + 6815744, 25165824, 0, 7340032, 4718592, 3407872, 3145728, 2621440, 2621440, 1310720, 1048576, 1048576, 262144, 0, 262144, 786432, 1048576, +}; +const Word16 Compl_GSC_freq_bits[] = +{ + 5, 10, 10, 10 /* bitrate > ACELP_16k40 && FS = 16kHz */ +}; // Q0 + +const Word16 mfreq_bindiv_loc[] = { 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 32, 32, 32 }; // Q0 + +const Word16 mean_gp_fx[] = { 9590 }; /*Q14*/ + +const Word16 dic_gp_fx[] = /*Q14*/ +{ + -9580, -7692, -6385, -4474, -3254, -2038, -806, -82, + 1034, 2259, 3457, 4684, 5290, 6544, 8548, 10052, + -8964, -8338, -7021, -5754, -5118, -3850, -2654, -1429, + 408, 1660, 2852, 4071, 5915, 7170, 7825, 9249 +}; +const Word16 Gain_meanNB_fx[] = +{ + 9852, +};/* Q12 */ + +const Word16 Gain_mean_dicNB_fx[1 * 64] = /*Q12 */ +{ + -1309, -931, -568, -396, -54, 807, 1174, 1533, + 1901, 2092, 2286, 2493, 2698, 3130, 2909, 286, + -748, 990, 631, -1119, -1697, -2114, -2788, -5399, + -9841, -1902, -3270, -7975, -7438, -6926, -7192, -2325, + -1504, -2549, -3022, -3532, -3818, -4136, -4751, -5071, + -5756, -6093, -8998, -6389, -8765, -9438, 3369, 3917, + 3619, 4684, -8264, 4255, -4433, -6662, -9230, -7678, + 5859, 118, 457, -227, 1717, 1353, -8499, -9649 +}; + +const Word16 Mean_dic_NB_fx[1 * 10] = /*Q12 */ +{ + -444, -100, -120, -37, 25, + 70, 148, 63, 170, 229 +}; + +const Word16 Gain_dic1_NB_fx[3 * 64] = /*Q12 */ +{ + -606, -92, 5, + -1965, 294, 666, + -440, 119, 661, + -106, 267, 108, + -1213, 345, -136, + -1251, 618, 566, + -1905, -750, 648, + -1043, -360, -498, + -18, -322, 96, + 334, 116, -247, + -1929, 660, 23, + -1845, 1178, 485, + -180, 836, 167, + -1892, -922, -321, + 416, -437, -344, + 595, -548, 158, + -265, -807, -338, + -1065, -1015, -20, + -626, 595, -333, + -569, 1090, 651, + 27, 587, -331, + -184, -85, -503, + -1902, -1807, 326, + -1861, -159, -989, + -666, 143, -1163, + -1718, 1031, -744, + 847, 301, -59, + 720, -1001, -216, + 1380, -866, -969, + 803, -4, -608, + 233, 408, -998, + 1459, 87, 263, + 345, -615, -1026, + 877, -148, -7, + 68, -1075, 270, + 802, 329, 475, + -1923, -126, -38, + 1275, -419, -349, + 401, 926, 575, + 846, -233, 547, + 693, -1880, 356, + -362, -1683, -219, + 231, -339, 598, + 1227, -616, 267, + 1116, 91, -1316, + -551, -650, 530, + 444, 32, 181, + -384, 1207, -775, + -993, 1163, 41, + 784, -1018, 538, + 635, 636, -424, + 1373, -1367, 149, + 1442, 401, -444, + 1094, 888, 123, + 874, 1113, -1082, + -646, -1112, -1103, + 539, -1632, -683, + 402, 571, 99, + -1778, -1809, -849, + -732, -1691, 700, + -678, 526, 274, + 320, 1227, -118, + -1222, -180, 454, + 173, 349, 530 +}; + +const Word16 Gain_dic2_NB_fx[3 * 32] = /*Q12 */ +{ + 28, 0, -66, + -557, 4, 206, + 281, -642, 36, + -417, 81, -494, + -380, 684, 450, + 521, -1544, 258, + -1119, 613, -1151, + 514, 24, 797, + 292, -84, -526, + 296, 418, -231, + -419, -68, 976, + 2, -308, 398, + -456, -1007, 263, + -1221, -371, 446, + -221, -390, -181, + -1210, 588, 751, + -1093, 528, -174, + 590, 372, -1271, + -79, -251, -1241, + -1016, -487, -512, + 542, 581, 338, + -265, 456, -105, + 490, -71, 89, + 42, 235, 379, + 31, 1194, -202, + 173, -839, 850, + -46, 500, -802, + 152, 933, 1073, + 980, 345, -263, + 807, -580, -521, + -23, -992, -585, + 876, -576, 411 +}; + +const Word16 Gain_dic3_NB_fx[4 * 16] = /*Q12 */ +{ + -16, 65, -227, 11, + -214, 553, 366, 185, + 137, -338, -300, -625, + -122, 82, 538, -797, + 160, 285, -1103, 35, + -594, 312, -379, -423, + 169, -642, -395, 363, + 351, -1166, 630, -261, + -1190, 217, 416, 187, + -577, 244, -636, 858, + 580, 482, -220, 635, + 475, -188, 372, 27, + -65, -369, 504, 910, + -423, -442, 124, -40, + 480, 575, -41, -651, + 682, 680, 910, 489 +}; + +const Word16 Gain_dic2_NBHR_fx[3 * 64] = /*Q12 */ +{ + 29, 0, -94, + -605, -202, -174, + 324, -380, -163, + -126, -301, -306, + -288, 124, 112, + -86, 524, -115, + 234, 18, -464, + -55, -281, 179, + 161, 446, 632, + 366, -82, 97, + 228, -1149, 270, + 293, 286, -143, + -123, -35, -896, + -540, -675, 175, + 331, -483, -687, + -779, 204, -668, + -492, 768, -510, + -1215, -620, -483, + 681, -76, -296, + -671, 396, -45, + -759, 298, 564, + -284, 589, 321, + -1366, -592, 496, + -448, -585, -712, + 12, -756, -90, + 513, 167, -927, + -1172, 1060, -1198, + -477, 748, 1006, + 42, 103, 1277, + -940, 1049, 138, + -924, -14, -1469, + 684, 679, -1580, + 417, -374, -1572, + 607, 270, 256, + 567, 778, 843, + 1414, -223, -542, + 97, 200, 251, + 222, 1074, -547, + -714, -285, 1046, + 386, -684, 984, + 338, 674, 116, + -274, 171, -368, + 581, -1871, 342, + 94, 442, -597, + -293, -1205, 851, + -127, 501, -1247, + 175, 1700, 1357, + -24, 1224, 285, + 707, -952, -293, + 668, 492, -407, + 1164, 751, 201, + 381, -595, 288, + -1570, 481, -531, + -597, -160, 326, + -578, -1311, -40, + -118, -523, 576, + -1513, 527, 757, + -184, 40, 609, + -1215, 98, 68, + -65, -1324, -836, + 821, -299, 204, + 796, 21, 840, + 310, -133, 542, + 1042, -974, 537 +}; + +const Word16 Gain_dic3_NBHR_fx[4 * 128] = /*Q12 */ +{ + 293, 7, -202, -95, + 535, 110, 542, -512, + -578, 65, -560, -345, + 206, 332, 10, -533, + -76, 356, -14, 83, + 149, -372, -195, -490, + -478, -241, -55, 113, + -293, -470, -606, 62, + 797, -1448, 625, -1128, + 173, 464, -1686, -49, + -392, -295, -159, -464, + -715, 420, -146, -984, + -36, 28, -484, 119, + 472, 272, -729, -116, + 68, -87, -628, -429, + 429, -918, -158, -191, + -545, 230, -435, 261, + -128, 15, -791, 612, + 268, -387, -1258, 102, + 378, 238, 301, 3, + -494, 149, 131, -124, + 634, -308, 99, 24, + 572, 711, 754, -1137, + -1109, 400, 1093, 369, + -831, -423, 1583, 1089, + -83, 156, -105, 1078, + -930, 476, 152, 380, + 776, 1162, 788, -43, + 279, 50, 408, 597, + 476, 483, 73, 749, + 903, 686, 80, -411, + 195, -768, 280, 344, + -263, -999, -46, -284, + -66, 263, 315, -1239, + 435, 578, -234, -1169, + 199, -1669, 188, 114, + -57, 419, -509, -633, + 98, -119, 129, -816, + -157, -365, -249, 537, + 67, -624, 121, 1153, + 1444, 142, -584, 38, + 1086, -84, 162, 994, + 392, -384, -124, 533, + 252, 183, -1161, -885, + -431, -829, 102, 432, + -708, 987, -1021, -644, + -64, 120, -1684, 985, + 210, -494, -906, 1302, + 50, -186, 177, 185, + -256, 872, -1004, 387, + 564, -80, -679, 515, + -763, -40, -1174, 228, + -1029, 199, -59, -297, + 30, -47, 198, -264, + -396, -1435, 913, -1018, + -141, 962, 36, 458, + 36, -388, 776, -1000, + -74, 489, 1137, 140, + -970, -766, 666, -117, + 90, 599, 1665, 1405, + -313, -685, -764, -615, + 563, -462, -627, -768, + 792, 560, -1445, 556, + -581, 721, -559, 1137, + -699, -273, 274, -846, + 940, -690, 747, -253, + -177, -541, 1355, -217, + -586, 427, 1196, -868, + 147, 532, -550, 405, + 258, 677, -245, -166, + 772, 1062, -331, 482, + 388, 1870, -576, 1585, + 462, 865, 454, 1212, + 570, 528, -681, 1229, + -386, 607, 599, 865, + -154, -20, -211, -231, + 96, 736, 408, -259, + 763, -1533, 1094, 249, + 705, -1132, 1757, -1082, + 310, -481, 329, -395, + 194, -781, 59, -954, + -933, -957, -25, 1866, + -852, -224, -482, 822, + -1438, 490, 221, 1281, + 392, 677, 539, 347, + 884, -614, 1844, 678, + -773, 484, -928, 2477, + -274, -461, 378, -263, + -283, -312, 583, 342, + 453, -1541, 378, 1266, + 778, 1095, 1290, 824, + -958, -443, -208, -71, + 985, -1001, -123, 473, + 56, -1003, -513, 474, + -259, 1435, 975, 315, + -59, -169, 724, 961, + -210, 1030, 341, -977, + 1054, 2917, -7, -877, + -852, -228, 330, 625, + 9, -524, -97, -14, + 16, -50, 476, 2406, + 264, -238, 768, 56, + 187, 108, -169, 446, + 673, 238, 992, 671, + -218, 285, 485, 181, + 669, -526, 639, 571, + 650, 20, -188, -516, + 1031, 165, 526, 136, + -333, 307, 102, -569, + -157, 309, -934, -121, + -336, 141, 39, 536, + 662, 364, -133, 222, + -1284, 637, -636, 77, + 1241, 846, 467, 638, + 842, 328, 1330, -320, + 152, -1009, 550, -215, + -772, 13, 594, -122, + 336, -410, -547, -2, + 869, -106, 321, -1180, + 516, 1247, -828, -577, + -670, 873, 367, -132, + -415, 630, -287, -164, + -105, 138, 657, -441, + -160, -1085, 940, 704, + -128, -68, -369, -1052, + -1434, 594, 546, -665, + -1849, 75, 175, 174, + -1283, 729, -1590, 1032 +}; + +const Word16 YG_mean16_fx[1 * 16] = /*Q12 */ +{ + -396, -192, -168, -136, -60, -17, 45, 39, + 120, 81, 90, 67, 147, 34, 163, 184 +}; + +const Word16 YG_dicMR_1_fx[4 * 64] = /*Q12 */ +{ + -1879, 826, 539, -210, + -120, 267, -137, -142, + -798, -473, 434, 243, + 297, -896, 369, 307, + -1883, -1333, 416, 510, + -1955, -660, -471, 224, + -905, -804, -517, 433, + -961, 20, -258, -224, + 209, 977, -213, -17, + 536, -244, 159, 97, + -265, 775, 412, -327, + 337, -391, -237, -472, + -1962, -1836, -692, 471, + 625, 173, -463, -15, + -965, 263, 62, 600, + -782, 889, -433, 211, + -1791, 852, -453, -776, + -182, -177, -1078, 80, + -364, 350, 280, 293, + -902, 1119, 295, -1194, + 16, 440, -342, 459, + -1825, -1584, -1382, -798, + 723, 57, -1235, -661, + 888, -1638, 277, 234, + 340, 345, 141, -610, + 1280, -23, 17, 144, + -639, -852, -520, -553, + 1032, 843, 149, 435, + 581, 783, 519, -196, + 457, 945, 498, -1289, + -1897, -41, 425, 514, + 787, 161, 506, 385, + -559, 1079, 319, 515, + 500, 340, 60, 106, + 251, -997, -1163, -960, + 261, -1288, -631, 335, + 1241, -620, -387, -662, + 167, 194, 476, 67, + 830, -261, 430, -1201, + -479, -123, 71, -1162, + 225, -1482, 132, -802, + 680, 763, -1010, 429, + 200, -125, 261, 590, + 771, -740, -183, 229, + -1860, -348, 278, -549, + -1768, 967, 281, 594, + -1727, -1697, 87, -764, + 1169, 631, -114, -471, + -1636, -101, -1324, -91, + 821, -745, 458, -264, + 1014, -576, 390, 470, + 1041, -517, -1018, 367, + 826, 17, 426, -326, + -467, -1641, 201, 325, + -1906, 428, -338, 222, + -1021, 630, 419, -75, + -86, -379, -203, 234, + 659, 527, -491, -1507, + -564, -1745, -979, -173, + -1764, -433, -743, -1090, + 242, 709, 269, 497, + 716, 74, -208, 618, + -297, 645, -864, -805, + -46, -326, 412, -296 +}; +const Word16 YG_dicMR_2_fx[4 * 32] = /*Q12 */ +{ + 93, 217, -122, 37, + -13, -83, 105, -491, + -398, -592, 399, -160, + 543, -81, -470, 408, + 394, -630, -94, -258, + -665, 133, -136, -125, + 397, -351, 630, -148, + -1166, 406, -865, 554, + -136, -302, -263, 81, + -674, -657, -571, -691, + -206, 381, -699, 122, + 272, -1506, 356, 15, + 451, -961, 638, -1133, + 316, -787, 165, 585, + 312, -144, 185, 274, + 39, -706, -997, 250, + -915, -871, -114, 458, + -834, 348, 364, -1188, + 450, 723, -256, 412, + 369, 468, -1371, 416, + 344, 164, 290, -1094, + 664, 122, 34, -218, + 555, 254, 559, 825, + 312, 492, 496, -27, + -399, 315, 690, -330, + -458, 710, 206, 415, + 290, 89, -662, -467, + -72, 593, -108, -460, + -217, 46, 319, 189, + -1366, 199, 365, 62, + -552, -166, 772, 861, + -159, 120, -215, 775 +}; +const Word16 YG_dicMR_3_fx[4 * 32] = /*Q12 */ +{ + -103, -143, -85, -19, + -404, 182, -795, 84, + 398, -594, -55, -256, + 283, 128, -472, 279, + -246, -628, 281, 297, + -853, 468, 358, -915, + 272, 149, 209, -443, + -168, -504, 452, -525, + 624, -427, 779, 117, + 1079, 404, -98, 80, + 136, 165, 142, -1394, + 513, -566, -150, 822, + 124, 646, 199, 272, + -165, -702, -615, 165, + 333, 810, -457, 1038, + -360, 105, -110, 537, + -224, 125, 562, -26, + 699, -1105, 809, -1323, + -1229, 841, -767, 571, + -310, 437, -114, -230, + -1045, 630, 564, 322, + 282, 1170, -723, -306, + -328, -247, -251, -598, + 354, 332, -1593, 499, + 332, -23, 219, 304, + 325, -1511, 378, 299, + -94, -54, 679, 956, + 507, 830, 861, -739, + -895, -135, 16, -34, + 677, 650, 961, 714, + 816, -665, -1741, -671, + 274, 93, -617, -433 +}; +const Word16 YG_dicMR_4_fx[4 * 16] = /*Q12 */ +{ + -163, -44, -108, 32, + 556, 153, 115, 120, + 617, 818, 802, 719, + -639, -665, 122, 664, + 353, -555, -352, -86, + -1162, 833, -1034, 326, + -511, -406, -478, -523, + 491, -1473, 404, -21, + 148, 288, -45, -544, + -61, 172, -791, -44, + 715, -449, 861, 504, + -108, 263, 610, 118, + 962, 826, -1013, -37, + -32, -495, 362, -214, + -37, 661, -75, 289, + -835, 243, 85, -105 +}; + + +const Word16 mean_m_fx[1 * 1] = /*Q12 */ +{ + 11762 +}; + +const Word16 mean_gain_dic_fx[1 * 64] = +{ + -739, -519, -76, 147, 574, 779, 983, 1185, + 1384, 1580, 1784, 1989, 2204, 2643, 2864, 2422, + 362, -295, -1197, -1936, -2757, -11755, -8216, 3083, + 3311, -1434, -1682, -3341, -9284, -9057, -8616, -7783, + -7359, -6964, -6592, -6233, -5470, -5050, -4651, -3954, + -2470, -963, -2199, -3042, -3643, -4292, -5854, -10199, + 4103, 3548, 4390, 4717, 3817, -10525, -11521, -9570, + -9899, -9171, -10841, -11165, 5500, 5079, 6139, 6993 +}; /* Q12 */ + +const Word16 YGain_mean_LR_fx[1 * 12] =/* Q12 */ +{ + -385, -178, -143, -116, -46, -12, + 64, 50, 118, 68, 133, 151 +}; + +const Word16 YGain_dic1_LR_fx[3 * 32] = /*Q12 */ +{ + -1909, 159, -90, + -155, 416, -15, + -99, -84, 396, + -1832, -848, -320, + -779, 1024, 45, + -1860, -1761, 273, + 81, -341, -309, + -819, -3, -315, + 483, 215, -194, + 242, 937, -76, + -1830, -1753, -1102, + -1589, 868, -657, + -911, 389, 421, + -1834, 915, 390, + -144, 564, -869, + 878, -1544, 301, + 446, 332, 376, + -540, -822, -1001, + 548, -192, 232, + 920, -589, -175, + 869, 717, -564, + 797, -103, -1047, + -335, -1732, -186, + -1840, -345, 566, + 1205, 109, 43, + 985, -456, 570, + 650, -1223, -874, + 928, 752, 390, + -124, 833, 575, + -1811, -249, -1142, + -711, -767, 185, + 344, -876, 267, +}; + +const Word16 YGain_dic2_LR_fx[4 * 32] = /*Q12 */ +{ + -294, -73, -41, 11, + 276, 330, -1316, 173, + 26, -712, 86, 1, + -841, -539, 246, -479, + 43, -207, 709, 116, + 104, -197, 227, -548, + 261, -228, 165, 606, + 613, 403, -122, -420, + 14, 182, -544, -669, + -734, 392, -492, -131, + -1316, 274, 116, 331, + -1339, 535, -1261, 608, + -346, 277, -426, 729, + -1067, -836, -571, 388, + 643, 503, 484, 532, + -148, 447, 120, -392, + -600, 263, 519, -75, + 686, -346, 379, 23, + 130, 239, 376, -1366, + 68, 656, -361, 92, + 608, 286, -405, 487, + -1031, 507, 523, -971, + 51, -44, -521, 172, + -573, -500, 398, 632, + 240, 147, 104, 51, + -319, -680, -890, -398, + -195, 503, 306, 459, + 335, 368, 662, -389, + 378, -788, -537, 680, + 433, -1129, 472, -883, + 472, -312, -301, -207, + 378, -1346, 433, 408, +}; + +const Word16 YGain_dic3_LR_fx[5 * 32] = /*Q12 */ +{ + -332, -191, -122, -455, -210, + 364, -48, -664, 408, 225, + -576, -342, 367, 52, 270, + -392, -157, -77, 625, -224, + -183, -652, -406, 99, 266, + 24, 65, 74, 525, 613, + -805, 306, -383, -21, 247, + 16, 133, -416, -4, -567, + 294, -750, 443, -367, 228, + 536, 816, 767, 562, 594, + -54, 200, -1108, -582, 227, + 123, -43, 414, -376, -649, + 592, -652, -674, -386, -356, + 100, -58, -45, -108, 103, + -727, -194, -1170, 931, 1096, + 512, 758, -440, -769, -1051, + 362, 787, -276, -139, 149, + -218, 387, 457, -414, 265, + -202, 663, -1104, 882, -338, + -57, 405, 269, 257, -221, + 335, 864, 1164, -611, -618, + 1275, 494, -1783, 119, 1222, + 752, 76, 270, 73, -57, + 376, -1255, 145, 724, 603, + -989, 618, 659, 675, 560, + 128, -147, -138, -368, 963, + 140, -170, 866, 538, 127, + 122, -616, 166, 236, -396, + 374, 279, 407, 650, -1269, + -861, 613, -755, -1334, -972, + -922, 314, 416, -114, -648, + 265, 85, 61, -1110, 45 +}; + +const Word16 YG_mean16HR_fx[] = +{ + //Q12 + -396, -191, -167, -135, + -60, -17, 45, 39, + 120, 81, 89, 67, + 146, 33, 163, 183, +}; + +const Word16 YG_dicHR_1_fx[] = +{ + //Q12 + -1955, 412, 133, 32, + -340, 88, -42, 20, + -999, 314, -144, 456, + -429, -190, 186, 547, + -1057, 160, 243, -197, + -46, -81, -491, -223, + 143, 986, -113, 15, + 286, -313, 77, 3, + 249, -1251, 380, 305, + -1909, -258, 481, 86, + 902, 59, 42, -186, + -1969, -992, -335, 223, + -1913, -163, -465, -167, + -806, 1201, 24, 481, + -564, -1943, 212, 380, + -120, -691, -162, 138, + -966, 1009, 437, -464, + 434, 147, 185, 158, + -1944, -133, -313, 602, + -1029, 236, -612, -373, + -749, -571, -1008, -399, + 666, -954, -111, 88, + 186, -16, -174, 338, + -235, -314, 403, -244, + 285, 133, 85, -349, + -1981, -1506, -1290, 338, + -1977, -1925, -368, 876, + -1930, 256, 453, 667, + -1884, 259, -123, -779, + -813, 1087, -595, -1014, + 396, 66, -876, 412, + -543, 907, -657, 301, + -485, 612, 515, 777, + -362, 420, 417, -518, + -1754, 1307, 65, -1202, + -618, 705, -56, -56, + -1938, 1005, 561, 59, + 62, 521, -440, 319, + -1776, 1011, -279, -165, + 558, 357, -444, -47, + 801, -1998, 313, 319, + -1873, -826, -1691, -978, + -588, -294, -328, -1021, + -91, 513, -288, -530, + -1945, -1964, -350, -293, + -307, -1057, 203, -631, + 94, -1713, -548, -62, + 616, -11, -510, -780, + 682, -1574, 260, -441, + 507, -778, 522, -88, + 1321, -635, -432, -619, + 369, -615, -335, -1646, + 1026, -572, 265, -256, + 779, 127, -155, 356, + -462, -180, -637, 405, + 1329, 1071, 543, 784, + 434, -468, 120, -581, + 1293, -532, 60, 377, + 63, -1290, -336, 708, + 756, 42, 412, 607, + 731, 1003, 598, -1388, + -1818, -1666, 547, 185, + -1915, -802, 485, 789, + 907, 437, 455, 108, + 507, -102, 573, -109, + 1037, -1292, -691, 512, + 1428, 159, 20, 271, + 111, -826, -607, -563, + -622, -1328, -1391, -1000, + -15, 1094, 339, -684, + 448, 790, -439, -1617, + -1765, -943, -657, -675, + 107, -835, -1140, 241, + 33, 122, 520, 242, + 194, 204, 313, -1080, + 1308, 548, -711, -850, + 1520, 474, 334, -516, + 1091, -42, 347, -1543, + 1098, -219, 680, 139, + 855, -895, 613, -985, + -1631, -1550, 539, -1277, + 672, 905, -1057, 430, + 555, 659, -38, 450, + -1118, -53, 536, 487, + 563, -485, -204, 650, + -678, -930, 470, 425, + 1180, -259, -990, 319, + 993, 319, -362, 926, + 782, -254, -1447, -534, + -1946, 964, 86, 617, + -1651, 727, -813, 514, + -552, 395, 522, 124, + -1710, 579, 831, -542, + 34, 463, 143, 2, + -1742, -207, -642, -1517, + -1967, -740, 272, -606, + 663, 670, 58, -620, + 229, 274, 122, 677, + 65, 1144, 24, 693, + -1383, 1061, 630, 894, + 536, 539, 106, -31, + 1080, 774, -267, 67, + 355, 518, 609, -336, + 777, -735, 412, 551, + 219, -424, 392, 451, + -543, -1909, -189, -933, + -938, -178, 489, -1008, + -749, -1216, -440, -157, + 681, -355, -423, -19, + 299, 1053, -913, -506, + -258, 360, -1457, -38, + -264, 967, 519, 58, + -718, -1676, -1184, 185, + 741, -314, 184, 210, + -1780, -305, -1299, 167, + -1912, -1932, -1292, -970, + -1017, -520, -96, -136, + -1829, 500, -1244, -625, + -1041, -791, -461, 591, + 708, -1386, -1078, -956, + 339, 636, 509, 408, + -131, 106, -1202, -1118, + 818, 18, 477, -676, + 668, 1176, 422, -36, + 1074, -1259, 425, 267, + -281, 539, 31, 430, + -1196, 756, 338, 236, + -568, 1030, 421, -1589, +}; + +const Word16 YG_dicHR_2_fx[] = +{ + //Q12 + 146, -73, -67, -101, + -11, 330, -176, -609, + -283, -31, -381, -191, + -208, -81, 142, 234, + 141, -376, -66, -646, + 568, -38, -429, 160, + 166, 831, 89, -103, + 280, -881, -296, -82, + -117, -4, 340, -956, + 286, -136, -679, -410, + 141, 181, -197, 511, + -685, 648, 246, -365, + 625, -670, 591, 190, + -7, -296, -454, 235, + 840, 126, 652, 1064, + -428, -570, -18, -77, + -298, -973, 637, 380, + -774, -31, -333, -902, + -1509, 167, 471, -369, + 431, -1437, 124, 610, + -917, 511, 518, -1488, + -97, 262, -872, 247, + 549, -166, 602, -590, + 644, -1030, 796, -1279, + 525, -37, 212, 197, + 141, 345, 195, 211, + 91, -71, 674, 223, + -1343, -902, -27, 234, + -467, -981, -427, 725, + 176, -527, 85, 275, + -654, -859, 473, -873, + 671, -457, -326, 742, + 699, 613, -78, 457, + -487, 505, 231, 578, + -194, 927, -493, 529, + 635, 554, -917, 532, + -554, -12, -314, 611, + 172, 667, 532, -874, + 594, 270, -27, -378, + 388, -530, -1307, 274, + 647, 451, 670, 24, + 745, -470, 8, -260, + -725, -292, -1018, -32, + 95, 184, 330, -280, + -761, -135, 552, 250, + -415, -3, 197, -307, + 142, 702, 584, 755, + 450, 595, -1010, -525, + -455, -1143, -775, -639, + 228, 496, -1676, 399, + 82, 242, -532, 1222, + 125, -214, 319, 804, + -292, 380, -126, 70, + 96, -480, 407, -259, + -636, -148, 890, 1241, + 213, 404, -382, -7, + -315, 509, 660, 61, + 505, 18, 33, -1385, + -568, 716, -623, -338, + -440, 38, 972, -455, + -1420, 576, -1125, 668, + -1391, 481, 229, 593, + 335, -1464, 430, -375, + -918, 124, -155, 34, +}; + +const Word16 YG_dicHR_3_fx[] = +{ + //Q12 + -174, -82, -158, -12, + 155, -403, 114, -132, + 188, 2, -231, -470, + 448, -222, -598, -103, + -353, 304, -1173, 420, + -43, -77, -533, 386, + 526, -57, 360, -247, + -837, -219, -344, 42, + -236, 88, -664, -226, + -1218, 66, 362, -529, + -398, 496, -300, 299, + 212, 508, -521, 80, + -267, -522, 45, 286, + -65, -1143, 154, -169, + 725, -1483, 883, -1459, + 9, -109, 334, -752, + -38, 860, -22, -333, + -487, 340, 202, -1529, + -349, 387, 645, -464, + -106, 73, 170, 427, + 180, 384, -292, 989, + 178, -505, 618, 375, + 481, 539, -1777, 1050, + 680, -792, 65, 136, + -1388, 798, -1090, 670, + -377, -507, -139, -580, + 301, 614, 194, 392, + -218, -1155, 341, 834, + 338, -1071, -1177, 673, + -406, 188, -92, -546, + -58, -656, 773, -540, + 461, 649, 840, -108, + -775, -352, 620, 233, + -390, 666, 601, 438, + -394, 1594, -299, 1009, + 367, 448, 291, -886, + 788, 76, 479, 531, + -77, -655, -500, -14, + 514, -1745, 497, 217, + 904, -963, 630, 1261, + 775, 224, -795, 520, + 291, -435, -112, 679, + 494, 1380, -1018, -186, + -75, 86, 731, 1048, + 65, 74, 617, 99, + 512, -46, 709, -1636, + -926, 1237, 1090, -812, + 40, 297, 97, -131, + 656, 770, 1176, 920, + 1313, -582, -1832, -912, + 490, -648, -43, -805, + -449, -882, -1473, -698, + 1028, 421, -151, -289, + 1089, 1107, -144, 760, + 188, 357, -638, -1027, + -337, -210, 300, -194, + 319, 223, -1587, -64, + 972, 1384, 786, -1026, + 928, -468, 1116, -198, + -1489, 642, 269, 385, + -627, 250, 153, 50, + -906, 613, -518, -436, + 379, 18, -68, 218, + -648, -85, -110, 765, +}; + +const Word16 YG_mean16HR_16kHz_fx[] = +{ + //Q12 + 342, 152, 373, 359 +}; + +const Word16 YG_dicHR_4_16kHz_fx[] = +{ + //Q12 + 137, 109, 215, 21, + 328, -26, 537, -270, + -137, -851, -385, -703, + -537, -81, -244, -23, + -174, -425, -175, -351, + 861, 1100, 696, 574, + -150, -14, -390, -241, + -828, 166, 164, -151, + -226, 541, 204, -110, + 184, 820, -89, 264, + -26, 889, 709, 520, + 83, -176, -713, -276, + -149, -1318, 731, -193, + -324, -55, 118, 182, + 474, -493, -411, 52, + 156, -1459, -370, -71, + 513, 451, 973, 283, + 903, -296, 309, 121, + 1261, 296, 886, 702, + 984, -1204, 915, 15, + -401, 456, -316, 136, + 458, -1779, 335, -788, + 471, -796, 239, -331, + -390, -2265, 493, -305, + 469, -1946, 389, 280, + 150, 463, -725, 114, + -411, 99, -906, -128, + 628, 888, 1299, 1039, + 1454, 1377, 1415, 1350, + -1, 242, -164, -11, + 632, 621, 416, 695, + 396, -1030, 356, 492, + 48, -279, -98, -30, + -568, -212, -376, -571, + 275, 570, 382, 152, + 443, 75, 521, 418, + -1366, -1566, -2460, -2925, + -1059, 64, -585, -231, + 134, 489, -296, -380, + -1453, -890, -1200, -1157, + -27, 240, -1694, 47, + 464, 86, -204, -79, + 746, 462, 234, 57, + 1087, -738, 1095, 1050, + 922, 619, -412, 409, + -261, 35, 124, -313, + -794, 842, -992, 314, + 280, -465, 1028, 196, + 233, -346, 257, 183, + -1640, 244, -110, 28, + 377, 171, -57, 392, + -89, 368, 195, 456, + 501, 1327, 119, 980, + -64, -84, -417, 262, + -414, -558, -638, -102, + -1785, 392, -1756, -430, + -705, -299, -1189, -730, + -477, 347, -400, -367, + -93, -825, -20, -13, + -710, -540, 45, -265, + -151, -487, 380, -243, + -269, 32, 702, 143, + 206, -145, -27, -474, + -694, 777, 287, 357, +}; + +const Word16 YG_meanL2G_16kHz_fx[] = +{ + //Q12 + 424, 651, +}; + +const Word16 YG_dicL2G_16kHz_fx[] =//Q12 +{ + -255, 122, + 296, 314, + -226, -333, + 668, 668, + 101, -53, + -579, -647, + -1202, -1244, + 1213, 1254, +}; + +const Word16 Odx_fft64[64] = +{ + 0,59,54,49,44,39,34,29,24,19,14,9,4,63,58,53,48,43,38,33,28,23,18,13,8,3,62,57,52,47,42,37, + 32,27,22,17,12,7,2,61,56,51,46,41,36,31,26,21,16,11,6,1,60,55,50,45,40,35,30,25,20,15,10,5 +}; // Q0 + +const Word16 Ip_fft64[6] = { 32,1,0,64,32,96 }; // Q0 + +const Word16 Odx_fft32_15[32] = { 0,17,2,19,4,21,6,23,8,25,10,27,12,29,14,31,16,1,18,3,20,5,22,7,24,9,26,11,28,13,30,15 }; // Q0 + +const Word32 w_fft32_16fx[16] =//Q30 +{ + 1073741824, 0, 759250113, 759250113, 992008059, 410903236, 410903236, 992008059, + 1053110143, 209476636, 596539003, 892783685, 892783685, 596539003, 209476636, 1053110143 +}; +const Word16 Ip_fft32[6] = { 16,1,0,32,16,48 }; // Q0 + +const Word16 Odx_fft32_5[32] = { 0,27,22,17,12,7,2,29,24,19,14,9,4,31,26,21,16,11,6,1,28,23,18,13,8,3,30,25,20,15,10,5 }; // Q0 + +const Word16 Odx_fft16[16] = {0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5}; // Q0 + +const Word16 Ip_fft16[6] = {8,1,0,16,8,24}; // Q0 + +const Word16 Ip_fft8[6] = {4,1,0,8,4,12}; // Q0 + +const Word16 Idx_dortft80[80] = +{ + 0,65,50,35,20,5,70,55,40,25,10,75,60,45,30,15,16,1,66,51,36,21,6,71,56,41,26,11,76,61, + 46,31,32,17,2,67,52,37,22,7,72,57,42,27,12,77,62,47,48,33,18,3,68,53,38,23,8,73,58,43, + 28,13,78,63,64,49,34,19,4,69,54,39,24,9,74,59,44,29,14,79 +}; // Q0 + +const Word16 Idx_dortft120[120] = +{ + 0,105,90,75,60,45,30,15,16,1,106,91,76,61,46,31,32,17,2,107,92,77,62,47, + 48,33,18,3,108,93,78,63,64,49,34,19,4,109,94,79,80,65,50,35,20,5,110,95, + 96,81,66,51,36,21,6,111,112,97,82,67,52,37,22,7,8,113,98,83,68,53,38,23, + 24,9,114,99,84,69,54,39,40,25,10,115,100,85,70,55,56,41,26,11,116,101,86, + 71,72,57,42,27,12,117,102,87,88,73,58,43,28,13,118,103,104,89,74,59,44,29,14,119 +}; // Q0 + +const Word16 Idx_dortft160[160] = +{ + 0,65,130,35,100,5,70,135,40,105,10,75,140,45,110,15,80,145, + 50,115,20,85,150,55,120,25,90,155,60,125,30,95,96,1,66,131, + 36,101,6,71,136,41,106,11,76,141,46,111,16,81,146,51,116,21, + 86,151,56,121,26,91,156,61,126,31,32,97,2,67,132,37,102,7, + 72,137,42,107,12,77,142,47,112,17,82,147,52,117,22,87,152,57, + 122,27,92,157,62,127,128,33,98,3,68,133,38,103,8,73,138,43, + 108,13,78,143,48,113,18,83,148,53,118,23,88,153,58,123,28,93, + 158,63,64,129,34,99,4,69,134,39,104,9,74,139,44,109,14,79, + 144,49,114,19,84,149,54,119,24,89,154,59,124,29,94,159 +}; // Q0 + +const Word16 Idx_dortft320[320] = +{ + 0,65,130,195,260,5,70,135,200,265,10,75,140,205,270,15,80,145,210,275,20,85,150,215,280,25,90,155,220,285,30,95, + 160,225,290,35,100,165,230,295,40,105,170,235,300,45,110,175,240,305,50,115,180,245,310,55,120,185,250,315,60,125, + 190,255,256,1,66,131,196,261,6,71,136,201,266,11,76,141,206,271,16,81,146,211,276,21,86,151,216,281,26,91,156,221, + 286,31,96,161,226,291,36,101,166,231,296,41,106,171,236,301,46,111,176,241,306,51,116,181,246,311,56,121,186,251, + 316,61,126,191,192,257,2,67,132,197,262,7,72,137,202,267,12,77,142,207,272,17,82,147,212,277,22,87,152,217,282,27, + 92,157,222,287,32,97,162,227,292,37,102,167,232,297,42,107,172,237,302,47,112,177,242,307,52,117,182,247,312,57,122, + 187,252,317,62,127,128,193,258,3,68,133,198,263,8,73,138,203,268,13,78,143,208,273,18,83,148,213,278,23,88,153,218, + 283,28,93,158,223,288,33,98,163,228,293,38,103,168,233,298,43,108,173,238,303,48,113,178,243,308,53,118,183,248,313, + 58,123,188,253,318,63,64,129,194,259,4,69,134,199,264,9,74,139,204,269,14,79,144,209,274,19,84,149,214,279,24,89,154, + 219,284,29,94,159,224,289,34,99,164,229,294,39,104,169,234,299,44,109,174,239,304,49,114,179,244,309,54,119,184,249, + 314,59,124,189,254,319 +}; // Q0 + +const Word16 Idx_dortft480[480] = +{ + 0,225,450,195,420,165,390,135,360,105,330,75,300,45,270,15,240,465,210,435,180,405,150,375,120,345, + 90,315,60,285,30,255,256,1,226,451,196,421,166,391,136,361,106,331,76,301,46,271,16,241,466,211,436, + 181,406,151,376,121,346,91,316,61,286,31,32,257,2,227,452,197,422,167,392,137,362,107,332,77,302,47, + 272,17,242,467,212,437,182,407,152,377,122,347,92,317,62,287,288,33,258,3,228,453,198,423,168,393,138, + 363,108,333,78,303,48,273,18,243,468,213,438,183,408,153,378,123,348,93,318,63,64,289,34,259,4,229,454, + 199,424,169,394,139,364,109,334,79,304,49,274,19,244,469,214,439,184,409,154,379,124,349,94,319,320, + 65,290,35,260,5,230,455,200,425,170,395,140,365,110,335,80,305,50,275,20,245,470,215,440,185,410,155, + 380,125,350,95,96,321,66,291,36,261,6,231,456,201,426,171,396,141,366,111,336,81,306,51,276,21,246,471, + 216,441,186,411,156,381,126,351,352,97,322,67,292,37,262,7,232,457,202,427,172,397,142,367,112,337,82, + 307,52,277,22,247,472,217,442,187,412,157,382,127,128,353,98,323,68,293,38,263,8,233,458,203,428,173, + 398,143,368,113,338,83,308,53,278,23,248,473,218,443,188,413,158,383,384,129,354,99,324,69,294,39,264, + 9,234,459,204,429,174,399,144,369,114,339,84,309,54,279,24,249,474,219,444,189,414,159,160,385,130,355, + 100,325,70,295,40,265,10,235,460,205,430,175,400,145,370,115,340,85,310,55,280,25,250,475,220,445,190, + 415,416,161,386,131,356,101,326,71,296,41,266,11,236,461,206,431,176,401,146,371,116,341,86,311,56,281, + 26,251,476,221,446,191,192,417,162,387,132,357,102,327,72,297,42,267,12,237,462,207,432,177,402,147,372, + 117,342,87,312,57,282,27,252,477,222,447,448,193,418,163,388,133,358,103,328,73,298,43,268,13,238,463, + 208,433,178,403,148,373,118,343,88,313,58,283,28,253,478,223,224,449,194,419,164,389,134,359,104,329,74, + 299,44,269,14,239,464,209,434,179,404,149,374,119,344,89,314,59,284,29,254,479 +}; // Q0 + +const Word16 Ip_fft128[10] = { 64, 1, 0, 128, 64, 192, 32, 160, 96, 224 }; // Q0 + +const Word32 w_fft128_16fx[64] = +{ + 1073741824, 0, 759250112, 759250112, 992008064, 410903232, 410903232, 992008064, + 1053110144, 209476640, 596539008, 892783680, 892783680, 596539008, 209476640, 1053110144, + 1068571456, 105245104, 681174592, 830013632, 946955712, 506158400, 311690816, 1027506880, + 1027506880, 311690816, 506158400, 946955712, 830013632, 681174592, 105245104, 1068571456, + 1072448448, 52686008, 721080960, 795590208, 970651136, 459083776, 361732736, 1010975232, + 1041563136, 260897968, 552013632, 920979072, 862437504, 639627264, 157550640, 1062120192, + 1062120192, 157550640, 639627264, 862437504, 920979072, 552013632, 260897968, 1041563136, + 1010975232, 361732736, 459083776, 970651136, 795590208, 721080960, 52686008, 1072448448, +}; // Q30 + +const Word16 Ip_fft256[10] = {128, 1, 0, 256, 128, 384, 64, 320,192, 448}; // Q0 + +const Word16 Ip_fft512[18] = {256, 1, 0, 512, 256, 768, 128, 640,384, 896, 64, 576, 320, 832, 192, 704,448, 960}; // Q0 + +const Word16 w_fft512_fx_evs[256] =//Q14 +{ + 16384, 0, 11585, 11585, 15137, 6270, 6270, 15137, + 16069, 3196, 9102, 13623, 13623, 9102, 3196, 16069, + 16305, 1606, 10394, 12665, 14449, 7723, 4756, 15679, + 15679, 4756, 7723, 14449, 12665, 10394, 1606, 16305, + 16364, 804, 11003, 12140, 14811, 7005, 5520, 15426, + 15893, 3981, 8423, 14053, 13160, 9760, 2404, 16207, + 16207, 2404, 9760, 13160, 14053, 8423, 3981, 15893, + 15426, 5520, 7005, 14811, 12140, 11003, 804, 16364, + 16379, 402, 11297, 11866, 14978, 6639, 5897, 15286, + 15986, 3590, 8765, 13842, 13395, 9434, 2801, 16143, + 16261, 2006, 10080, 12916, 14256, 8076, 4370, 15791, + 15557, 5139, 7366, 14635, 12406, 10702, 1205, 16340, + 16340, 1205, 10702, 12406, 14635, 7366, 5139, 15557, + 15791, 4370, 8076, 14256, 12916, 10080, 2006, 16261, + 16143, 2801, 9434, 13395, 13842, 8765, 3590, 15986, + 15286, 5897, 6639, 14978, 11866, 11297, 402, 16379, + 16383, 201, 11442, 11727, 15059, 6455, 6084, 15213, + 16029, 3393, 8935, 13733, 13510, 9269, 2999, 16107, + 16284, 1806, 10238, 12792, 14354, 7900, 4563, 15736, + 15619, 4948, 7545, 14543, 12537, 10549, 1406, 16324, + 16353, 1005, 10853, 12274, 14724, 7186, 5330, 15493, + 15843, 4176, 8250, 14155, 13039, 9921, 2205, 16235, + 16176, 2603, 9598, 13279, 13949, 8595, 3786, 15941, + 15357, 5708, 6823, 14896, 12004, 11151, 603, 16373, + 16373, 603, 11151, 12004, 14896, 6823, 5708, 15357, + 15941, 3786, 8595, 13949, 13279, 9598, 2603, 16176, + 16235, 2205, 9921, 13039, 14155, 8250, 4176, 15843, + 15493, 5330, 7186, 14724, 12274, 10853, 1005, 16353, + 16324, 1406, 10549, 12537, 14543, 7545, 4948, 15619, + 15736, 4563, 7900, 14354, 12792, 10238, 1806, 16284, + 16107, 2999, 9269, 13510, 13733, 8935, 3393, 16029, + 15213, 6084, 6455, 15059, 11727, 11442, 201, 16383 +}; +const Word16 Idx_dortft40[40] = +{ + 0, 25, 10, 35, 20, 5, 30, 15, 16, 1, 26, 11, 36, 21, 6, 31, 32, 17, 2, 27, + 12, 37, 22, 7, 8, 33, 18, 3, 28, 13, 38, 23, 24, 9, 34, 19, 4, 29, 14, 39 +}; // Q0 + +const Word16 Odx_fft8_5[8] = {0, 3, 6, 1, 4, 7, 2, 5}; // Q0 +const Word16 Idx_dortft20[20] = {0, 5, 10, 15, 16, 1, 6, 11, 12, 17, 2, 7, 8, 13, 18, 3, 4, 9, 14, 19}; // Q0 +const Word16 Odx_fft4_5[4] = {0, 3, 2, 1}; // Q0 +const Word16 Ip_fft4[6] = {2,1,0,4,2,6}; // Q0 +const Word16 ip_edct2_64[6] = {16, 64, 0, 32, 16, 48}; // Q0 + +const Word16 w_edct2_64_fx[80] = /*Q14 */ +{ + 16384, 0, 11585, 11585, 15137, 6270, 6270, 15137, + 16069, 3196, 9102, 13623, 13623, 9102, 3196, 16069, + 11585, 8190, 8182, 8170, 8153, 8130, 8103, 8071, + 8035, 7993, 7946, 7895, 7839, 7779, 7713, 7643, + 7568, 7489, 7405, 7317, 7225, 7128, 7027, 6921, + 6811, 6698, 6580, 6458, 6333, 6203, 6070, 5933, + 5793, 5649, 5501, 5351, 5197, 5040, 4880, 4717, + 4551, 4383, 4212, 4038, 3862, 3683, 3503, 3320, + 3135, 2948, 2760, 2570, 2378, 2185, 1990, 1795, + 1598, 1401, 1202, 1003, 803, 603, 402, 201 +}; + +/* HVQ */ +const Word16 hvq_thr_adj_fx[5] = { 23170, 16384, 8192, 16384, 23170 }; /* Q15 */ + +const Word16 hvq_index_mapping_fx[4] = { 0, 1, 3, 4 }; + +const Word16 hvq_class_c_fx[16] = /* Q15 */ +{ + -7617, -14387, 2136, 6914, + 4821, -4428, 14131, -4538, + -4538, 14131, -4428, 4821, + 6914, 2136, -14387, -7617 +}; + +const Word16 hvq_cb_search_overlap24k[17] = +{ + 0, 8, 17, 27, + 39, 53, 69, 89, + 113, 128, 128, 128, + 128, 128, 128, 128, + 128 +}; // Q0 + +const Word16 hvq_cb_search_overlap32k[21] = +{ + 0, 6, 13, 21, + 30, 40, 51, 64, + 78, 96, 116, 128, + 128, 128, 128, 128, + 128, 128, 128, 128, + 128 +}; // Q0 + +const Word16 hvq_peak_cb_fx[1024] = /* Q15 */ +{ + -22652,-20549,-23019, 13968,-25496,-27493, -6957, 5753,-19678,-20274, + -6119, 18297, -5329,-22843,-21254, 13929,-27525,-29034, 563, 7265, + -26138,-13138, -9678, 7972, -517,-20830,-10703, 26832,-27818,-21449, + 208, 6297,-14803,-28396, -7655, 5118, 15134,-24005,-21776, 25330, + -11282,-23669,-20340, -2006,-16212,-24127, 9075, 22581,-20047,-25695, + -254, 6509,-17174,-29714, 1589, 7104,-17683, -4117, -4049, 22347, + -28338,-13898, 671, 6777,-18368,-17925, -7409, 5169,-22093,-19561, + 702, 5969, -6610,-27398, -4875, 8773,-29634, -5552, 272, 6992, + -9167,-19887, -9136, 6447,-23125,-25612, 9760, 5749,-10410,-29816, + 1606, 7019,-13758,-24849, 2084, 7129,-17795,-16160, 596, 7287, + -22276,-11145, 521, 6474,-13471,-20705, -74, 6740, 1891,-16245, + -12763, 13602, -1617,-27384, -9648, 2511,-21802,-11734, -4836, -1602, + -9670,-27913, 6456, 6338,-23227, -4603, 754, 5830, -7699,-24416, + 2204, 6518,-27591, 2763, 1885, 6839,-15248,-10500, 344, 6942, + -13247, -9761, -4486, 4294,-12097,-15164, 637, 6142,-25994,-16384, + 17277, 6511,-10346,-26179, 923, -2374,-13316,-18125, 6841, 7100, + -21083,-24251, 4207, -9464,-22914, -7057, 8647, 8026, 2488,-20731, + -799, 13754, -3451,-12872, 2545, 17315, 2576,-19594,-10340, 4361, + -7007,-19401, 1937, 6751, 17502,-24923,-16948, 8534, -3436,-29004, + 6315, 6467,-16936, -4957, 591, 6604, 1099,-26790, -708, 5543, + -5949,-14167, -4750, 4068,-10682,-14990, -7489, -5197, 169, -6472, + -5143, 16200,-20331, 1722, 395, 6233,-15661,-22913, 24689, 14221, + -3892,-22862, 5154, 6301, -8786,-10120, 216, 6831,-12390,-11062, + 4824, 6473, -7705, -4195, -5326, 6572, -560,-20773, -2777, 1822, + -6703,-14413, 2409, 6083,-10595,-25038, 14291, 4825, 2064,-25736, + 16863, 20463, -2752,-29103, 12609, 7539, -7638,-18024, 1948, 689, + -10961, -5839, 683, 6170,-26004, 12209, 10742, 15580, -2105, -8625, + -4932, 6977, -9940,-15129, 12160, 9806,-13921, -55, 440, 6315, + -305, -6080, 11303, 25730,-12423, -3161, 6875, 9836, -2780,-16434, + 4128, 5778, 17790,-10991, -6633, 21111, 12367,-26550,-10581, -2530, + -6713,-10210, 4804, 6280, -5932, 2832, 4978, 18330, 2696,-23822, + -11870,-13313, 5266,-10870, -7933, 4455, -3155,-10994, 2225, 5803, + 820,-11966, -1397, 5344, -5027, -7230, 1236, 5812, -1649,-21007, + 8948, 5539,-16246, -801, -533, -3132, -8272, -1302, 367, 5958, + -26574, -3470, 7126, -8876, -4819, -5380, -3923, 1466, 1929,-20655, + 4419, 3663, 2437,-26758, 10897, 5616, -6601,-10394, 2148, 137, + 15007,-22909, -3948, 6197, -9059,-27702, 23041, 4088, 8312, -267, + 2973, 25579, -3795, -3612, -489, 5401, 7711,-25887, 3443, 2623, + -24306, 3091, 13248, 3273, -3113, -1410, 3541, 12047, 306,-11933, + -4493, -1997,-18725, 8257, 7593, 7218,-13588, -8411, 8715, -1137, + -12028, 5907, 17904, 21327, -2223,-22989, 9863, -1633, -723, -5944, + 714, 5170, 2128,-15199, 2081, 1626, -482, -8521, 8131, 10765, + 53,-12020, 5152, 5033, 2361,-13747, 24714, 26357, 1074,-28538, + 18087, 4333, 1067,-22148, 14277, 5540, 729,-15049, 7936, 4648, + -16646, -6350, 23646, 9628, -91, -8477, 3298, 4297, 3499, -7417, + -2214, 2931, -4795, -4424, 6487, 4264, -9333, 3377, 6570, 5734, + 1733,-17598, 11163, 4167, -2713,-16183, 14693, 4188,-23780, 9825, + 25701, 15331, 586,-19288, 21576, 12040, 11328,-15656, 2944, 7335, + 9203,-16906, -5723, -5371, -7906, -4632, 12470, 5724, -123,-16520, + 976, -8288, 1262, -3966, -3014, -148, 230, -2169, 505, 3954, + -2256,-11474, 9990, 2644, 4841, -8017, -4617, -2959, 24226,-22733, + 7475, 17722, 6747, -5782, 4877, 8664, -6893,-24218, 12181,-14683, + 2839, -7574, 4815, 2376, 2680, -3986, 1749, 2061, -563, 3232, + 3039, 5761, 343, -4150, 6600, 3792, 6356, 7199, 10702, 24266, + -25636,-12157, 22874,-14633, 2438, -8680, 8312, 3091, 7135, -3110, + 268, 4547, 4272, 4886, 5861, 14177, 11382,-10386, -767, 1448, + 1770,-28758, 27658, 4643, -3008,-10314, 18024, 5252, 6999,-17854, + 9789, 909, 1556,-21532, 20929, 3182, 26836,-23774, -2868, 3509, + -9884,-14471, 24685, 193, -3300, -5891, 5237, -5722, -9043,-14338, + 17448, -7167, -683, 26, 4002, -235, 3072,-12689, 13537, 2670, + 3577,-10477, 10097, 1435, 17713,-24555, 7486, 1713, 6633, -6645, + 1863, -783, 3185, -8349, 3975, -3967, 8090,-23915, 7470, -8732, + 2793,-16733, 17412, 1948, -5975,-14195, 1741,-22095, 3376, -782, + 18258, 16642, 3845, -3536, 5136, 335, 3267, -719, 10538, 7756, + -10993, 5165, 17885, 4767, 4733, -7751, 15643, 8215, 3678, 1686, + 3571, 2189,-11186, 1470, 6152,-11489, 4353, -2197, 1357, -3164, + 4258, -6029, 8420, -230, 6220, -1478, 2105, -787, -4229, -4632, + 15095, -1672, 1986,-16134, 14035, -6088, 7849,-14512, 2875,-10127, + 4796,-14269, -8761,-25428, 1192,-24490, 22001, -6216, 258,-10418, + 27459, 10524, -754, 7182, 7574, 3444, 5995, 3253, 25190, 25483, + 6379, -6363, 409, -8435, -3319, 3253, 12035, 1358, 3184, -6482, + 12864, -216, 25363, -7652, -2971, 5718, 4969, -3415, 7040, -2605, + 2616,-21129, 28211, 1289, 2553,-15075, 23833, 1871, 14598, -6793, + 7189, 4535, 5581, -1997, 4257, -4337, 6027,-10630, 9913, -5633, + 3695,-11614, 19091, 585, 4415, -8798, 15569, -1099, -879, 752, + 19480, 5412, 5743, 448, 9863, 1342, 20634,-16941, -7404,-16938, + -11946, 17852, 19422, 5918, 12538,-20829, 22707, 1113, 4715, -4341, + 12573, -3709, 4015, -8219, 3349,-17549, 6395, -1551, 4414, -8302, + 24598,-24474, 21909, 9778, 5346, 1386, 6942, -4708, -1507, 2077, + 8224,-10420, 6088, -3411, 8824, -6355, 7219, 17353, 22325, 25889, + 6666, -1811, 1964,-13461, 8123, -4454, 26614, 11418, 4582, -7133, + 18420, -3918, -264, 10545, 24810, 12821, 6936,-22880, 10241,-24118, + 3108, -7220, 11991,-12963, 4237,-10392, 23417, -2591, 4624,-14780, + 29121, -1235, 7543, -1157, 17358, 1244, 20161, -6319, 2575, -5204, + 4384, 5974, 10993, -2909, 1619, -4017, 26017, 722, 4659, 11545, + 14463, 4774, -2892, 10593, 15058, -4543, 1972,-15782, 26652,-10199, + 6046, -562, 11992, -8022, 6197, -349, 7928,-12070, 21399,-13670, + 15116, 99, 5829, -4061, 16713, -7200, -8904, 4170, 24814, -7599, + 12177, 6080, 19388, 11094, 4262, 1544, 17090, -4775, -6957, -5908, + 19576,-23176, 7126,-23499, 24889,-17683, 5514, -5416, 23284, -5830, + 6388, -1788, 14378,-11597, 5099, -8771, 28791, -4573, 6029, -4164, + 3217,-26929, 6427, 145, 9306,-17874, 5544, 3835, 25432, -15, + 8297,-10673, 21003,-15084, 6019, -7628, 13891,-22535, 27144, 1685, + 10077, 4230, 5211, -1543, 22179,-10638, 6385, 5710, 13476,-12976, + 5272, 17571, 23747, 5084, -2100, 9127, 13746,-20852,-16310, 15716, + 21422,-23074, 6532, -31, 17127,-16620, 5397, -3362, 28477, -9453, + 6238, 1258, 13189,-22475, 12895, -4568, 8062,-26648, 2873, 5975, + 22151,-15208, 6319, -507, 23117,-17415, 24129,-14207, 12908,-21101, + 7262, 8470, 25405, -9450, 5424, -1162, 29494,-16114, 21373, 22875, + 24554, 16783, 6684, 2453, 15785,-28885, 6504, 1085, 21619,-24241, + 21468, 620, 23222, -7235, 10917, 8863, 18570,-21606, 6710, -2091, + 28961,-25837, 6884, 20869, 27603, -8999, 6798, 5617, 28706,-21501, + 6066, 4720, 25084,-28951 +}; + +const Word16 hvq_pg_huff_offset[NUM_PG_HUFFLEN] = {0,2,3,8,9,11,13,15,19}; // Q0 +const Word16 hvq_pg_huff_thres[NUM_PG_HUFFLEN] = {0,0x2,0x4,0x18,0x20,0x40,0x80,0x100,0x300}; // Q0 + +const Word16 hvq_pg_huff_tab[32] = +{ + 30, 31, 1, 0, 2, 3, 28, 29, 4, 5, 27, 25, 26, 6, 24, 7, 8, 22, 23, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21 +}; // Q0 + +const Word16 hvq_cp_huff_len[52] = +{ + 3, 4, 5, 6, 6, 6, 6, 6, 4, 4, 5, 5, 5, 5, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 8, + 8, 8, 8, 8, 9, 10, 10, 11, 11, 11, 10, 10, 10, 10, 11, 12, 12, 13, 13, 12, 12, 11, 12 +}; // Q0 + +const Word16 hvq_cp_huff_val[52] = +{ + 7, 8, 6, 3, 4, 5, 6, 7, 9, 10, 7, 8, 9, 10, 11, 12, 13, 11, 12, 13, 14, 15, 8, 9, 10, + 11, 4, 5, 3, 4, 5, 6, 7, 5, 4, 5, 3, 4, 5, 6, 7, 8, 9, 6, 1, 2, 0, 1, 3, 4, 7, 5 +}; // Q0 + +const Word16 hvq_cp_layer1_map5[HVQ_CP_MAP_LEN] = { 16, 8, 4, 2, 1, 18, 17, 9 }; // Q0 + +const Word16 hvq_cp_huff_thres[HVQ_CP_HUFF_NUM_LEN] = { 0x0, 0x2, 0xC, 0x20, 0x50, 0x60, 0x100, 0x180, 0x600, 0x1000, 0x1C00 }; // Q0 +const Word16 hvq_cp_huff_offset[HVQ_CP_HUFF_NUM_LEN] = { 0, 2, 7, 12, 18, 19, 24, 26, 35, 45, 51 }; // Q0 + +const Word16 hvq_cp_huff_tab[52] = +{ + 46, 47, 44, 45, 48, 49, 51, 36, 37, 38, 43, 50, 34, 35, 39, 40, 41, 42, 33, 28, 29, 30, 31, 32, 26, 27, + 3, 4, 5, 6, 7, 22, 23, 24, 25, 2, 10, 11, 12, 13, 17, 18, 19, 20, 21, 1, 8, 9, 14, 15, 16, 0 +}; // Q0 + +/*----------------------------------------------------------------------------------* + * FEC for HQ core + *----------------------------------------------------------------------------------*/ + +const Word16 Num_bands_NB[MAX_SB_NB] = {8,8,2}; // Q0 + +const Word16 SmoothingWin_NB875_fx[70] = /*Q15*/ +{ + 0, 16, 66, 148, 263, 411, 590, 802, 1045, 1318, + 1623, 1956, 2319, 2710, 3129, 3574, 4046, 4542, 5062, 5604, + 6169, 6754, 7358, 7981, 8620, 9275, 9945, 10627, 11321, 12025, + 12738, 13459, 14185, 14915, 15649, 16384, 17119, 17853, 18583, 19309, + 20030, 20743, 21447, 22141, 22823, 23493, 24148, 24787, 25410, 26014, + 26599, 27164, 27706, 28226, 28722, 29194, 29639, 30058, 30449, 30812, + 31145, 31450, 31723, 31966, 32178, 32357, 32505, 32620, 32702, 32752 +}; + +const Word16 SmoothingWin_NB2_fx[16] = +{/* Q15 */ + 0, 315, 1247, 2761, 4799, 7282, 10114, 13188, 16384, 19580, 22654, 25486, 27969, 30007, 31521, 32453 +}; +/*----------------------------------------------------------------------------------* + * SC-VBR + *----------------------------------------------------------------------------------*/ + +const Word16 bp1_num_coef_wb_fx[5] = { 15286, 0, -30572, 0, 15286, }; /* Q14 */ +const Word16 bp1_den_coef_wb_fx[5] = { 16384, 0, -30498, 0, 14262, }; /* Q14 */ + +const Word16 shape1_num_coef_fx[11] = /* Q15 */ +{ + 31437, -2443, -13636, 4316, + -10188, 48, 2639, -3575, + -776, 1046, 399 +}; + +const Word16 shape1_den_coef_fx[11] = { 32767, /* Q15 */ + 2940, -12237, 4032, -9609, + -1998, 2335, -3900, -1595, + 857, 253 +}; + +const Word16 shape2_num_coef_fx[11] = /* Q15 */ +{ + 30760, 31, -9699, 9516, + -5878, -7249, -10468, 442, + 3278, -63, 1115 +}; + +const Word16 shape2_den_coef_fx[11] = { 32767, /* Q15 */ + 16019, -890, 12799, 2346, + -6985, -13192, -5795, -949, + -1492, -304 +}; + +const Word16 shape3_num_coef_fx[11] = /* Q15 */ +{ + 30685, -383, -9937, -9605, + -5997, 7611, -10393, -355, + 3239, 12, 1196 +}; + +const Word16 shape3_den_coef_fx[11] = { 32767, /* Q15 */ + -16498, -911, -12947, 2286, + 7430, -13385, 6066, -1182, + 1580, -273 +}; + +const Word16 txlpf1_num_coef_fx[11] = /* Q13 */ +{ + 138, 198, 514, 681, 921, + 964, 921, 681, 514, 198, + 138, +}; + + +const Word16 txlpf1_den_coef_fx[11] = /* Q13 */ +{ + 8192,-18945, 31613,-31149, 24494, + -12753, 5528, -1436, 347, -25, + 4, +}; + + +const Word16 txhpf1_num_coef_fx[11] = /* Q13 */ +{ + 138, -198, 514, -681, 921, + -964, 921, -681, 514, -198, + 138, +}; + +const Word16 txhpf1_den_coef_fx[11] = /* Q13 */ +{ + 8192, 18945, 31613, 31149, 24494, + 12753, 5528, 1436, 347, 25, + 4, +}; + +/* NELP filter coefficients */ +const Word16 bp1_num_coef_nb_fx_order7[8] = +{ + /* Q = BP1_COEF_NB_QF_ORDER7 = 13 */ + 1481, 6730, 15579, 22923, 22923, 15579, 6730, 1481, + +}; + +const Word16 bp1_den_coef_nb_fx_order7[8] = +{ + /* Q = BP1_COEF_NB_QF_ORDER7 = 13 */ + 8192, 16156, 23814, 21855, 14620, 6614, 1907, 268, +}; + +/* NELP gain tables */ +const Word16 UVG1CB_WB_FX[UVG1_CBSIZE][2] = /* Q13 */ +{ + { -2224, -2114, }, + { 12666, 12314, }, + { 3723, 9690, }, + { 17880, 17978, }, + { 4136, 3946, }, + { 11605, 21280, }, + { 9777, 9340, }, + { 21701, 21627, }, + { 1088, 1679, }, + { 13993, 13697, }, + { 10443, 5214, }, + { 19702, 19692, }, + { 5458, 5317, }, + { 17051, 16918, }, + { 14206, 8503, }, + { 24330, 24271, }, + { -118, -279, }, + { 11615, 14863, }, + { 6898, 6544, }, + { 18913, 18637, }, + { 1142, 6811, }, + { 15995, 16070, }, + { 6921, 13182, }, + { 22857, 22741, }, + { 3017, 2260, }, + { 14952, 14992, }, + { 8176, 8093, }, + { 20721, 20549, }, + { 7441, 2370, }, + { 17897, 13988, }, + { 10986, 10966, }, + { 26098, 25992, }, +}; + +const Word16 UVG1CB_NB_FX[UVG1_CBSIZE][2] = /* Q13 */ +{ + { -4791, -5157, }, + { 4824, 4937, }, + { -3443, 3610, }, + { 5539, 15293, }, + { -469, -3986, }, + { 7977, 8157, }, + { 2748, 2492, }, + { 14070, 14014, }, + { -2486, -2863, }, + { 6033, 5892, }, + { 2678, -441, }, + { 11741, 11804, }, + { -256, -847, }, + { 9153, 8922, }, + { -106, 5979, }, + { 16876, 16741, }, + { -3584, -3873, }, + { 3511, 9538, }, + { 401, 416, }, + { 11082, 10550, }, + { -1418, -1725, }, + { 8988, 5255, }, + { 6275, 1137, }, + { 15372, 15247, }, + { -3899, 301, }, + { 6976, 7095, }, + { 1581, 1453, }, + { 12988, 12824, }, + { 2692, -3093, }, + { 9778, 10153, }, + { 3938, 3628, }, + { 18823, 18695, }, +}; + +const Word16 UVG2CB1_WB_FX[UVG2_CBSIZE][5] = /* Q12 */ +{ + { 914, 990, 1490, 5954, 2618, }, + { 5599, 4621, 4078, 3493, 3057, }, + { 4930, 4031, 2999, 2150, 1706, }, + { 7722, 3021, 1804, 1478, 1452, }, + { 1171, 1390, 6895, 2592, 1486, }, + { 4155, 4287, 4409, 4515, 4577, }, + { 3633, 3661, 3694, 3711, 3736, }, + { 13212, 5009, 2611, 2175, 2048, }, + { 3716, 2887, 2253, 1965, 1723, }, + { 7141, 4567, 3434, 2970, 2396, }, + { 2856, 3038, 3259, 3481, 3709, }, + { 5929, 5459, 4923, 4448, 4084, }, + { 980, 1024, 1550, 5686, 8038, }, + { 3516, 7354, 10392, 3619, 2856, }, + { 2598, 3093, 3582, 4780, 5965, }, + { 1962, 10993, 5020, 2861, 2587, }, + { 796, 916, 1010, 1175, 7720, }, + { 4445, 4406, 4344, 4249, 4175, }, + { 1454, 6493, 2611, 1758, 1765, }, + { 6296, 7686, 4763, 2945, 2203, }, + { 1502, 1573, 1895, 2981, 5464, }, + { 4750, 4829, 4909, 4929, 4895, }, + { 3644, 3774, 3922, 4037, 4116, }, + { 9051, 7403, 6003, 4746, 4081, }, + { 1558, 1869, 2331, 3000, 3595, }, + { 4671, 4646, 4614, 4553, 4482, }, + { 2262, 2608, 3158, 3890, 4468, }, + { 5556, 5441, 6824, 7146, 5724, }, + { 1470, 1550, 2016, 11169, 3828, }, + { 5488, 6270, 6771, 8202, 9281, }, + { 3477, 3693, 4113, 4460, 4705, }, + { 10877, 17984, 10194, 7291, 2824, }, + { 1327, 1498, 1476, 1667, 2138, }, + { 4463, 4299, 4094, 3880, 3731, }, + { 3188, 3164, 3156, 3104, 3140, }, + { 9757, 5690, 3366, 2296, 1792, }, + { 1731, 1753, 12406, 4082, 2247, }, + { 3866, 4060, 5007, 5274, 5225, }, + { 3998, 3957, 3900, 3839, 3789, }, + { 18040, 9417, 5567, 3465, 2504, }, + { 2160, 2532, 2895, 2577, 2321, }, + { 5052, 4789, 4490, 4203, 3953, }, + { 3381, 3415, 3458, 3496, 3536, }, + { 6166, 5811, 5440, 5035, 4650, }, + { 2839, 3389, 5057, 7558, 10414, }, + { 3875, 4431, 5183, 6310, 7166, }, + { 4311, 4130, 3571, 3070, 8555, }, + { 8791, 8260, 7299, 6243, 5421, }, + { 1191, 1237, 1368, 1814, 11819, }, + { 2486, 5729, 6150, 4222, 3667, }, + { 4018, 3825, 3600, 3388, 3256, }, + { 7504, 5817, 4989, 4065, 3322, }, + { 1430, 1962, 5546, 4096, 4681, }, + { 5393, 5378, 5324, 5230, 5052, }, + { 4041, 4090, 4132, 4159, 4181, }, + { 12469, 9221, 5735, 3617, 2501, }, + { 2482, 2565, 2768, 3088, 3461, }, + { 5209, 5080, 4905, 4706, 4522, }, + { 3139, 3362, 3647, 3910, 4156, }, + { 7139, 6588, 5941, 5251, 4674, }, + { 1719, 1866, 7993, 7634, 3987, }, + { 3587, 5289, 7882, 13519, 16095, }, + { 2409, 2515, 2749, 7316, 4636, }, + { 30391, 18493, 13798, 4799, 2283, }, +}; + +const Word16 UVG2CB2_WB_FX[UVG2_CBSIZE][5] = /* Q12 */ +{ + { 1565, 1391, 1635, 5228, 2681, }, + { 2156, 2558, 6205, 5561, 3944, }, + { 2039, 2406, 3094, 3409, 3968, }, + { 5090, 5065, 4989, 4858, 4764, }, + { 1436, 1736, 2816, 2362, 2400, }, + { 4375, 4425, 4465, 4478, 4493, }, + { 4648, 4081, 3550, 2981, 2667, }, + { 1705, 1950, 3679, 7828, 9895, }, + { 2839, 1826, 1443, 1210, 1245, }, + { 1387, 1410, 1768, 8873, 4383, }, + { 4022, 3784, 3565, 3316, 3096, }, + { 9983, 7147, 5225, 3742, 3027, }, + { 6769, 2357, 1531, 1448, 1556, }, + { 4591, 4671, 4735, 4765, 4789, }, + { 4308, 4198, 4052, 3896, 3769, }, + { 2288, 2550, 4922, 8294, 14878, }, + { 1361, 1480, 1511, 1991, 10450, }, + { 2933, 3131, 3694, 4687, 5201, }, + { 3984, 3048, 2479, 2644, 5514, }, + { 5353, 5480, 5488, 5434, 5437, }, + { 3319, 2881, 2528, 2152, 1927, }, + { 4873, 4748, 4578, 4407, 4257, }, + { 6185, 4396, 3751, 3400, 2899, }, + { 2159, 8067, 7534, 5121, 3640, }, + { 2265, 10177, 3803, 2588, 2441, }, + { 2188, 2206, 4293, 12691, 5893, }, + { 3587, 3651, 3760, 3864, 3960, }, + { 13158, 9752, 7171, 5431, 5364, }, + { 5710, 4173, 2928, 2090, 1774, }, + { 3531, 3831, 4641, 5787, 6622, }, + { 4395, 4356, 4281, 4194, 4111, }, + { 2243, 2476, 5814, 3965, 27176, }, + { 1575, 1667, 7544, 3005, 1984, }, + { 2583, 2511, 11684, 5765, 4807, }, + { 3632, 3458, 3277, 3114, 2971, }, + { 8569, 6778, 5866, 5515, 5141, }, + { 3267, 3035, 2940, 2782, 2691, }, + { 3929, 4249, 4577, 4877, 5162, }, + { 4443, 4173, 3864, 3590, 3337, }, + { 3998, 4725, 5728, 6873, 7885, }, + { 4369, 2824, 2237, 1648, 1404, }, + { 1000, 1022, 1477, 2682, 15276, }, + { 3916, 3851, 3766, 3664, 3591, }, + { 13206, 4485, 3230, 3897, 3648, }, + { 10002, 3515, 2393, 2233, 2211, }, + { 4603, 4836, 5071, 5259, 5411, }, + { 3919, 4035, 4177, 4304, 4419, }, + { 3046, 8332, 16475, 11172, 10858, }, + { 1027, 1007, 1196, 1578, 5937, }, + { 1892, 2422, 3227, 3920, 7400, }, + { 3584, 3532, 3508, 3470, 3437, }, + { 5363, 6155, 6805, 6854, 6811, }, + { 4038, 3512, 3030, 2636, 2332, }, + { 6760, 6124, 5235, 4299, 3687, }, + { 4125, 6528, 4068, 3238, 3483, }, + { 5020, 5905, 7082, 8554, 9623, }, + { 1399, 5868, 3069, 1726, 1655, }, + { 4691, 4234, 3974, 3757, 9616, }, + { 3978, 4003, 4003, 3983, 3960, }, + { 2103, 16858, 9252, 4860, 4727, }, + { 8043, 5294, 3970, 3098, 2583, }, + { 4680, 5109, 5576, 5965, 6275, }, + { 4867, 4584, 4276, 3958, 3682, }, + { 1213, 3115, 6552, 22778, 20977, }, +}; + +const Word16 UVG2CB1_NB_FX[UVG2_CBSIZE][5] = /* Q12 */ +{ + { 773, 785, 785, 785, 860, }, + { 3560, 3521, 3410, 3265, 3167, }, + { 1766, 2982, 10273, 3790, 2248, }, + { 4986, 4753, 4496, 4172, 3922, }, + { 2036, 2030, 2009, 1973, 1897, }, + { 3291, 3554, 3868, 4126, 4345, }, + { 3207, 3122, 3026, 2913, 2797, }, + { 13220, 6844, 3967, 2746, 2466, }, + { 1553, 1627, 1392, 1766, 3679, }, + { 5379, 4640, 3844, 3254, 2635, }, + { 1600, 1622, 2430, 9446, 4214, }, + { 5115, 5200, 5311, 5365, 5343, }, + { 6229, 3008, 1989, 1622, 1597, }, + { 1726, 2114, 7046, 6162, 4301, }, + { 1004, 1056, 1841, 6006, 7101, }, + { 6388, 9659, 4510, 2774, 2113, }, + { 1060, 1153, 1400, 1733, 2121, }, + { 3448, 3523, 3612, 3683, 3770, }, + { 1496, 2045, 2910, 3563, 4058, }, + { 4419, 4592, 4795, 4921, 4978, }, + { 1407, 5314, 2788, 1675, 1350, }, + { 4210, 4225, 4227, 4186, 4169, }, + { 2247, 8245, 4392, 2522, 1709, }, + { 7211, 6741, 6110, 5397, 4680, }, + { 3602, 2286, 1577, 1229, 1148, }, + { 6674, 5227, 3576, 2448, 1901, }, + { 954, 1035, 1079, 1683, 9558, }, + { 4011, 5853, 8979, 7138, 4484, }, + { 2784, 2702, 2637, 2546, 2471, }, + { 4414, 4065, 4627, 4208, 9275, }, + { 2771, 3012, 3357, 3735, 4066, }, + { 19742, 8603, 3943, 2546, 2085, }, + { 1132, 1123, 1107, 1093, 1114, }, + { 3913, 3838, 3733, 3630, 3548, }, + { 948, 1565, 6063, 2654, 1667, }, + { 6159, 5567, 4884, 4241, 3770, }, + { 925, 1164, 1585, 6062, 3090, }, + { 3818, 4037, 4322, 4536, 4726, }, + { 4291, 3894, 3441, 3006, 2733, }, + { 8544, 6487, 4962, 3812, 2970, }, + { 1744, 1758, 1704, 1633, 1576, }, + { 4416, 4259, 4044, 3810, 3628, }, + { 1919, 2159, 3323, 13977, 7898, }, + { 5952, 5731, 5419, 5061, 4732, }, + { 2775, 2812, 2507, 2540, 6585, }, + { 3436, 3960, 4661, 5975, 6274, }, + { 3082, 3150, 3246, 3337, 3404, }, + { 4089, 16018, 8285, 4116, 2704, }, + { 1419, 1425, 1400, 1371, 1363, }, + { 3825, 3890, 3953, 3993, 4015, }, + { 2498, 2689, 2846, 3011, 3213, }, + { 5122, 5024, 4881, 4691, 4524, }, + { 2285, 2325, 2317, 2313, 2271, }, + { 4493, 4529, 4517, 4478, 4443, }, + { 9138, 3969, 2522, 2222, 2415, }, + { 10009, 8719, 7292, 5837, 4532, }, + { 831, 908, 1039, 1656, 6813, }, + { 2070, 5478, 5174, 3911, 3694, }, + { 1577, 1565, 1635, 2583, 13154, }, + { 5590, 5788, 5922, 6752, 7063, }, + { 4061, 3497, 2710, 2099, 1716, }, + { 2750, 3118, 16574, 7891, 3651, }, + { 2598, 3072, 3809, 4906, 5172, }, + { 15348, 10948, 7740, 4979, 3446, }, +}; + +const Word16 UVG2CB2_NB_FX[UVG2_CBSIZE][5] = /* Q12 */ +{ + { 961, 867, 812, 771, 775, }, + { 2544, 2686, 3010, 3605, 5048, }, + { 1524, 1818, 2889, 3029, 3046, }, + { 4195, 4301, 4421, 4497, 4580, }, + { 2026, 1990, 1965, 1943, 1939, }, + { 4338, 4156, 3963, 3750, 3590, }, + { 7732, 2904, 1804, 1407, 1513, }, + { 1613, 2353, 11315, 5764, 4291, }, + { 1519, 1462, 1434, 1341, 1294, }, + { 1627, 1710, 2163, 9654, 5615, }, + { 2322, 7293, 3251, 2020, 2066, }, + { 4967, 5112, 5174, 5203, 5230, }, + { 1590, 1449, 1943, 5947, 3563, }, + { 7747, 5170, 3268, 2392, 2082, }, + { 3970, 3559, 3164, 2774, 2493, }, + { 1993, 2210, 3204, 3717, 23534, }, + { 1185, 1236, 1423, 2115, 4772, }, + { 3935, 3840, 3714, 3583, 3477, }, + { 1640, 1550, 1800, 2609, 10880, }, + { 4067, 4437, 4811, 5108, 5536, }, + { 1472, 1367, 1533, 2132, 7352, }, + { 4310, 4284, 4216, 4117, 4057, }, + { 10817, 4587, 2611, 2066, 2037, }, + { 2089, 2427, 4698, 14635, 7517, }, + { 2529, 1561, 1209, 976, 945, }, + { 2908, 3070, 4055, 5862, 6448, }, + { 2676, 2861, 3115, 3295, 3408, }, + { 2932, 14330, 6533, 3739, 3462, }, + { 3681, 3079, 2559, 2151, 1903, }, + { 5636, 5316, 4978, 4690, 4425, }, + { 2298, 7228, 6976, 4251, 3347, }, + { 2504, 3421, 6784, 8483, 15064, }, + { 1253, 1180, 1136, 1094, 1076, }, + { 3451, 3524, 3600, 3646, 3707, }, + { 1701, 2030, 6574, 4746, 4451, }, + { 4688, 4751, 4762, 4727, 4722, }, + { 2977, 2363, 1883, 1563, 1399, }, + { 5080, 4685, 4275, 3835, 3513, }, + { 5445, 3828, 2851, 2242, 1948, }, + { 1929, 5037, 17760, 8346, 6300, }, + { 1839, 1782, 1680, 1586, 1534, }, + { 3086, 3472, 4031, 4950, 9695, }, + { 3199, 3052, 2896, 2751, 2622, }, + { 5822, 5782, 5727, 5566, 5478, }, + { 1548, 2234, 6748, 2562, 1722, }, + { 6699, 5216, 4475, 3531, 3028, }, + { 3773, 3628, 3460, 3279, 3155, }, + { 1581, 1672, 2929, 20221, 16432, }, + { 1210, 1215, 1389, 1678, 2177, }, + { 3863, 3886, 3937, 3961, 3989, }, + { 1541, 1745, 1829, 3479, 15563, }, + { 4444, 4952, 5573, 6056, 6545, }, + { 2460, 2397, 2284, 2133, 2041, }, + { 4808, 4676, 4493, 4322, 4213, }, + { 15031, 6644, 3315, 2900, 2885, }, + { 4003, 4760, 6946, 8274, 8401, }, + { 5001, 2495, 1594, 1337, 1365, }, + { 3428, 3706, 4073, 4457, 4670, }, + { 3326, 3277, 3222, 3142, 3088, }, + { 6162, 6317, 6494, 6459, 6530, }, + { 2659, 2599, 2537, 2482, 2546, }, + { 8554, 6902, 5233, 4116, 3650, }, + { 4643, 4099, 3616, 3201, 2895, }, + { 9589, 26630, 15412, 12532, 8715, }, +}; + +const Word16 frac_4sf_fx[NB_SUBFR + 2] = { 4,8,12,16,16,16 }; /* Q4 */ + +/* ERB table for PPP-ampl-quant */ +const Word16 erb_WB_fx[NUM_ERB_WB + 1] = { 0, 238, 475, 713, 950, 1188, 1426, 1663, 1911, 2185, 2490, 2826, 3205, 3624, 4094, 4620, 5210, 5875, 6626, 7478, 8448, 9558, 11264, 13568, 16387 };//Q(log2(2.56) + + +/* ERB table for PPP-ampl-quant */ +const Word16 erb_NB_fx[NUM_ERB_NB + 1] = { 0, 238, 475, 713, 950, 1188, 1426, 1663, 1911, 2185, 2490, 2826, 3205, 3624, 4094, 4620, 5210, 5875, 6626, 7478, 8448, 9558, 10243 };//Q(log2(2.56) + + + +/*Amplitude and power tables for PPP*/ + +const Word16 AmpCB1_WB_fx[640] = +{//Q13 + 5655, 1589, -653, 3568, -3173, -1852, -3204, -4623, -2100, -5103, + -923, -67, -7152, -4958, -2019, -1810, -8532, -648, 6581, 8043, + 160, 778, -1535, 863, 5482, 1674, -3576, 123, -3163, -3595, + -852, -53, -1080, -2683, -3199, -950, -1353, 6258, -1431, 1249, + 2059, 677, 146, 1011, 956, -2022, -25, 300, 421, -5859, + 1027, -452, -7343, -1052, 3818, 1099, -1005, 659, -511, -658, + 2091, 720, -600, 145, -1504, -1716, -442, -2172, -1505, 2702, + 731, 1473, -213, -4120, -2976, 688, 3205, 1213, 679, 232, + 3672, 4770, -1198, -298, -1714, -3669, -2833, -664, -1859, -2380, + -1169, -1593, -453, 295, -1225, -3110, -1776, 2112, 2710, 3333, + 1022, 1248, 1091, 1164, 1200, 1782, -809, -2306, -3124, -2194, + -1567, 465, 2223, -1301, -463, -2157, 729, 2279, -1938, 610, + 437, -803, -1025, 775, -171, -637, 163, 2251, 316, -1663, + -4123, -20, -2827, -1529, -1436, 3447, 79, -274, 1650, 4097, + 2369, 927, 448, -449, 293, -239, -1028, -4805, 1354, 431, + -2219, -490, -3849, 1639, -2925, 817, 1485, 2527, 5444, -1994, + 1476, 506, -1643, 2003, -1676, -788, -1681, -2011, 1389, 452, + 593, 3, -1200, -3987, -1634, -4310, -686, 882, 6235, 2420, + -196, -1257, -2038, -498, 1394, 671, -2302, -809, -446, 3644, + -1643, -2304, -828, 105, -323, -3906, -960, 7324, 3095, -786, + 95, 633, 1266, 750, 1509, -2033, -3134, 432, 1028, -1825, + 1258, 256, -3249, -6868, -523, -325, -1779, 4313, 2524, 3433, + -600, -410, -88, 410, -1182, -1140, -1448, -1344, -5074, 6054, + 2194, 1505, -681, -2408, 1376, 1389, 1209, 1048, -4199, -2939, + 1855, 1744, -1344, -1431, -1955, -1805, -4992, 512, 624, 2749, + -3446, -1215, -3764, -2169, -3601, -1321, 67, 4326, 6624, 5816, + -334, -1746, -441, -754, 1853, 3889, -595, -493, 441, -811, + -48, -764, -1473, -683, 603, -1754, 780, 698, 1084, 1713, + 560, -808, -754, -2890, -1205, -318, -1021, 3195, 5693, -4603, + 1343, -1061, -2441, -1784, 721, 267, 227, -622, 3013, -768, + -472, 90, 13, 290, 1055, 948, 1617, -2368, -1087, 1103, + -4784, -3872, 5125, -2518, -215, 6962, 1095, -1521, 2091, -2962, + 2285, 1117, 1174, 2635, -1907, -1012, 814, -417, -2162, -2805, + -1188, -707, -808, -1757, 260, -1093, -3957, -3266, 4132, 5980, + 177, -1478, 960, 2029, 3989, 597, -3062, -3940, -1688, 236, + -1559, 150, 2432, 348, -242, -2014, -1027, 6298, -2957, -3960, + 1090, 1014, -1261, -744, -954, -938, -3713, -3272, 5356, -2356, + -1439, 3808, -2330, -4437, 5177, -3606, -1382, 1824, 407, 325, + 649, 330, 85, 206, -415, 183, -646, 602, -2656, 808, + 1039, 29, -3202, -6168, -3640, 3736, 4183, 3959, 330, 339, + 2701, 343, 1501, 1879, -3194, -4648, -1630, 1656, -1578, -84, + -3065, -4126, 24, -260, 263, -1705, -1289, 2432, 1229, 7481, + 2586, 1696, 646, -1773, -792, 1932, -1908, -1897, -1129, 112, + -5667, -1592, 2253, -980, 1581, 211, 5277, 4846, -288, -159, + 956, 1196, 771, -973, -1785, -516, -1015, 847, 614, -791, + -442, -1594, -4632, -4392, -416, 1398, 2570, 752, 264, 6570, + 1655, 546, 1238, -1362, -1330, -2005, 3590, -2155, -184, -1224, + -1452, -1533, -534, 1010, -1707, 801, 3628, -289, 2414, 132, + 2643, -2813, -4524, 5092, -7362, 740, 428, -510, 81, -1209, + 616, 1454, 1861, -3958, -4084, 189, -1219, -875, 3764, 2086, + -1554, -2071, 1515, 3392, 12, -686, -2414, -1382, 176, 1685, + 2055, -5698, 1582, 4117, -4846, -2922, 610, 2082, 4682, -2487, + 348, 2258, -338, -1379, 1472, 618, -202, -1122, -76, -2468, + -1216, -986, -327, -1441, 102, 403, -2105, 2411, 1510, 1288, + -715, -577, 1074, 2533, -3521, -3449, 2140, -751, -307, 3805, + 158, -1385, -404, -1378, -1948, 3785, 4216, 2667, -1894, -1559, + 1037, 1371, 989, -205, -333, -4784, -3429, -1283, 3299, 859, + -4922, -5481, -1196, -1748, -720, 516, 113, 4590, 7071, 4345, + -5729, -3862, 3590, 1463, 7094, 4991, 854, -66, -1630, -686, + -923, -3266, -1988, 2345, 785, -1420, 3004, 2934, -1245, -65, + -2696, -3088, -1438, 614, 1584, -239, -1552, 580, 6285, -1673, + -1598, -4018, -1909, 747, 3191, 366, 1467, -1933, 2759, 2804, + 518, 193, -1149, -3108, 441, 1458, 2791, -4131, 2694, 3372, + -5023, -6491, 1794, 2739, 1463, 5843, 2869, 1993, -1409, 4832 +}; + +const Word16 AmpCB2_WB_fx[64 * (NUM_ERB_WB - 13)] = +{//Q13 + -5276, -7711, -3518, -2416, -382, 319, -1900, -900, 1725, 884, + 4071, -4052, -2430, -336, 2136, 3006, 591, -3893, -2731, 2625, + 2390, -1047, -883, -3368, -4235, -3726, 189, -1803, 784, 2336, + 206, -2140, 3001, -730, -2279, 85, -3395, 4367, 2214, -254, + -3114, -2348, 2763, 686, -7495, -6618, 3164, -3957, -2681, -2049, + 1659, 3634, 2962, 1574, 379, -2478, 2861, 616, 1124, 205, + -3075, -348, -2006, -90, 761, 1157, -114, -9460, -2786, -3254, + -1120, -1500, -446, 2835, -314, 3205, 2115, -837, -261, 36, + 80, -485, 1133, 2124, -1031, -401, -3166, 1145, -1616, -3425, + -3071, -6891, -4198, 2292, 5160, -46, 1430, 280, 1378, 1700, + -1673, -1126, 5270, 5096, -975, -1070, 1314, -2389, -2982, 20, + -3218, -892, -636, -876, -302, -2923, -3240, 4121, 1625, -557, + 994, 544, 2657, 7133, -273, -3530, -1419, 1431, -936, -2622, + 303, 75, -5444, -5549, 4183, 1248, 3474, -789, 2375, -1778, + 1660, 1520, -1433, -4047, 531, 7001, 695, 1889, 4261, -2791, + -1557, -2980, -316, 415, 1134, 1501, -6923, 521, -3134, -1812, + 1848, 676, -1733, 734, 2207, 2029, -476, -1976, -161, 29, + 7147, -1774, 720, -1070, -372, -1626, -6473, -2448, -5235, -2651, + -1800, -1477, -767, 1335, 471, 4857, 888, 593, -370, 196, + 907, 174, 557, -720, -1339, 1590, 37, -1247, -1307, 276, + -1739, -6032, -3088, -2499, -497, -393, -569, 3003, 2694, 3751, + 4652, -258, -1305, 175, 189, -344, -2381, -1992, 463, 529, + -6375, 3966, -3558, -3001, -640, 3117, 1120, 966, 1316, -561, + 27, 2794, 2831, 3512, 3453, -418, -2319, -6741, -3443, 80, + 1281, 1691, 1500, -591, -739, 2385, -4676, -5822, -1437, 730, + 3593, -437, 1090, 3497, -1932, 2854, 4858, 2654, 947, 1879, + -4115, 2700, -3092, -1524, 225, -8272, -6736, -1277, 2991, 2983, + 1129, -1661, 2817, 468, 491, -744, 390, 677, 8129, -3130, + -687, -433, 1488, -3763, -177, -581, -764, 39, 1537, -2203, + -1678, 263, -1214, 2175, -1857, 3097, -894, 4207, -1943, -834, + 1513, -4123, 3981, 6041, 653, -757, -313, -3024, -4614, -3139, + -2966, 178, 4956, -427, -41, 2376, 1008, -1351, -92, 978, + 1998, 5146, 2069, 117, -1754, -2756, 4425, 168, -1807, -1761, + -1215, 178, -1562, -3369, -919, -2576, 3614, 4968, -30, -396, + -1151, -1146, 868, 1073, -359, 2732, 546, 4431, -321, -1081, + 1410, -3214, -2316, -4889, -2460, -3844, -7323, -1438, -1488, 1849, + 4037, 2421, 2697, -2372, -1877, 670, 3674, -907, 888, -3703, + 375, -1278, -1477, 2501, -936, -1682, -1353, -335, -4440, 383, + -2730, -2130, -1105, 1588, 3340, 4816, -4023, 502, -4146, 236, + 4481, 589, -3696, 826, -97, 222, -8037, -2244, 142, 810, + -2195, 1315, 656, 1901, -485, 317, 1512, 1465, -2026, 1853, + 929, 1670, -2736, -463, -836, -4946, -134, 2769, 2972, -5148, + -3147, 913, -1483, 267, -1560, 3903, 1507, 1105, -1496, 210, + -1196, 3764, 601, 1630, 3842, 6374, -1293, -4555, -3087, 199, + -1917, -3331, -2317, -1774, 479, 3712, 2729, 1309, -3047, -514, + 861, -213, 1317, -2035, 4369, 5228, 942, -3052, -2316, -3377, + 1123, -65, 2507, 2711, -2096, -2164, -2634, -5215, -3919, 1551, + -47, 1990, 2370, 2025, -2401, 4833, -3879, -162, -3081, 501, + -510, 2744, -907, 253, -1746, -2520, 3418, -1461, 2140, 2507, + 135, 1457, 3195, -1277, -2558, -66, 10850, -1633, -1051, -3436, + -1617, 1438, -1231, -1744, 696, -348, 3434, 2121, -1629, -2460, + -4065, 1159, -1288, 2843, 697, -862, 4, 966, -444, -1860, + 1450, 6426, 5544, 1456, -2826, -1303, -2778, -1278, -6656, -3241, + -7083, 2234, 204, 1753, 803, 499, 1641, 87, 1471, -1325, + 398, 2983, 4340, -1382, 735, -600, -4671, -254, 2327, -1008, + -144, -1453, -1806, -1669, 395, -3285, -1803, -2119, 1232, 2914, + 1480, 8610, 1788, 2644, 1359, 3783, -110, -1339, -1337, -3427, + -630, -1189, -2560, 976, 483, -2744, -3653, -1289, 2910, -2437, + 3171, 1479, 157, 823, 4631, -1910, 3736, -424, -155, -5470, + -741, 3829, -2794, -55, -1447, -3469, -1947, 2914, -61, -3430, + 3544, -1867, 2986, 1009, -1051, 725, 2933, 2926, 5849, 257, + -2666, 6286, -2282, -2998, -2576, -975, -3655, -1867, -5040, -1440, + 3542, -603, 4806, -2808, -1633, 1388, 1149, -1616, -1851, 2122, + 4477, 2485, 1376, 721, 2174, -3072, 1378, -2574, -37, 1322, + -1646, -3612, 4443, 1612, -3403, 711, 132, 119, -227, 5059, + 2892, 840, 5462, -3471, -1340, 2097, 143, 1750, -3052, -1932, + -6352, -4166, -645, 4317, 633, 3681, 2811, 2346, 2374, -2999, + -1265, -210, 5115, 4652, 1305, 3704, -1456, -307, -457, -1455, + -3580, 674, 2215, 2458, -3021, -66, 2535, -652, 1226, 685, + 875, -1753, -1164, -609, 3444, 563, 3826, 1607, 3798, 1385, + 3902, -1990, -4078, -2509 +}; + +const Word16 AmpCB1_NB_fx[640] = +{//Q13 + -1355, 185, -222, -221, 1976, 3119, 540, 1333, -3646, -2511, + -979, 1664, 2087, 951, 787, -1687, -855, 1594, 1264, -4990, + -1957, -215, -850, 1369, -113, 2541, -2904, 743, 634, -657, + -3438, -2047, 706, 85, -596, -50, 212, 944, 118, 1380, + -1203, -78, -213, -1811, -781, -1970, 6607, -2971, 147, -1483, + 38, 5607, 5222, -4567, -4040, -2259, -3110, -2120, 932, -236, + -1052, 1039, -872, 334, -919, 2761, 3320, -5828, 53, 1063, + -1064, -75, -1015, -2137, -722, 565, 629, 1961, -454, 866, + -888, 2652, 1996, -2170, -885, 3325, -645, -1898, -984, -643, + -1008, 2472, 2400, -3708, -2408, -1051, 2029, 1357, -636, -470, + -1307, 655, 663, 29, 892, -95, -91, -2966, -1610, 2657, + -2175, -3170, -3799, -3065, 1130, 1351, 3814, 2791, 1478, 1520, + -1326, -520, -692, 899, 1979, -397, -407, 450, -569, -611, + -1228, 864, 2549, 3067, -2511, -4737, -2701, -304, 680, 1426, + -1070, -19, -1582, -2813, -1832, 3010, 250, -613, 3390, -171, + -1450, -417, -773, -651, -405, -2304, -780, 6656, -3270, -1322, + 70, 5105, 3202, -83, -925, -458, 1203, -1582, -4158, -3630, + -1702, -849, -55, -986, -1963, -1140, -1942, 3347, 3526, -435, + -1429, -2089, -1620, -1271, 2851, 2184, -2472, 3216, 2885, -2922, + -1217, 86, -186, -279, -746, 1288, 3016, -651, -2719, 317, + -1307, -127, -1110, 1389, 212, 1783, 2619, -1718, 1795, -4086, + -1295, 743, 301, -1823, -223, -651, -1774, -405, 1687, 2031, + -865, 1059, -391, 505, -2739, -2773, 16, -2960, 3071, 3325, + -791, 2301, 435, 107, -4039, 801, -1224, 1854, -1039, 507, + -518, 997, 837, 3311, 506, 1026, -232, -1920, -3904, 406, + -1857, -529, -776, -700, -663, -1520, 1699, 814, 2084, -477, + -1341, -1123, -2564, -2784, 2457, 3223, -959, 385, -1864, 3754, + -1351, -1347, -2229, -2882, -1061, -1499, -3028, 3302, 2250, 5539, + -957, -340, 27, 1508, 167, -3513, 1689, 2577, -1810, -516, + -1061, 2171, 1774, 2031, 923, -1933, -1640, -2881, 859, -834, + 408, 2462, 2073, 2107, -2671, 1140, -3497, -2497, 2984, -2707, + -1762, -2524, -2196, 279, -2580, 477, 2306, 4645, 693, -909, + -1089, 1952, 3034, -1790, 786, -1149, -3117, 3605, -1933, -1886, + -959, 934, 246, -2177, -2440, 1356, 871, 3472, 2558, -4512, + -782, 1262, 893, 1979, 2386, -1809, -4357, -392, -1928, 1576, + -1751, -327, -1018, -617, -2370, -2910, 4230, -90, -1361, 3596, + -1069, -315, -162, -339, -313, 33, 4684, 2811, -2717, -3684, + 695, 4567, -745, -2311, -776, -2600, -827, -1040, -997, 2480, + -1549, -748, -622, -260, 1460, 1116, -302, -2529, 2156, -42, + -1318, -568, -266, -446, -2212, 2690, -4669, 5325, -2022, 1358, + -1312, 2293, 1528, 706, 970, -291, 383, -683, -1532, -1843, + -1379, 845, 1218, 395, -1884, 14, 676, -1711, 795, 290, + -742, 386, -435, 411, 1311, 549, -4181, -4922, 1497, 4465, + -1722, -699, -1958, -4126, -3727, -655, 1553, 1793, 4933, 3055, + -1260, -618, 535, -2008, 3802, -3784, 2527, -833, 193, -1062, + -866, 823, 1562, 147, -623, -1808, -1099, 694, -577, 745, + -2282, -4139, -3171, 76, 25, -1077, 477, 545, 6081, 3244, + -1332, -785, 98, -1681, -3603, -3937, 524, 4648, 1114, 2547, + -1145, 407, 2030, 3120, -1739, -513, -518, 1325, -1700, -2860, + -1427, 520, -1040, -792, -366, -2174, -522, -240, 5660, -3163, + -1449, -1653, -1507, 581, 1338, -2627, -1863, 1831, 1301, 2106, + -1252, 974, 199, 68, -69, -869, 864, 2373, -5818, 2873, + 26, 972, 359, -561, -390, 376, 225, 517, 649, -1767, + -653, 2167, 882, -698, 214, -4084, -4134, 2092, 2798, -523, + -1002, 486, 648, -1082, 404, -1490, 1560, -4984, 5614, -1441, + -1024, -311, 427, 356, -2342, 215, -2312, 445, -2378, 5111, + -568, 85, 1328, 1847, 3506, 1183, -2521, -2070, -794, -1881, + -485, 1121, 1242, 1301, -4365, -2222, 2602, -387, 1498, -1344, + -1272, -1365, -2207, -213, -1877, 2858, 849, -915, 333, 2488, + -2019, -2048, -1461, -1930, -1409, -400, 490, -2222, 1276, 7305, + -1530, -1741, -2663, 3159, 1162, -1490, 1516, -1498, 1222, 838, + 1325, 5387, 3888, 1944, -1706, -2890, -1905, -3901, -3207, 206, + -1411, -959, -292, -396, -1547, -84, -4405, -1073, 5532, 1796, + 3160, 48, -2339, -5884, -184, -52, 129, 5398, 378, -321 +}; + +const Word16 AmpCB2_NB_fx[64 * (NUM_ERB_NB - 13)] = +{//Q13 + -2681, -4389, -4270, -4727, -239, 1938, 1748, 2311, 4300, -3957, + -1299, 3487, 1595, -377, 295, -1193, -1588, 2112, -1573, -6362, + -504, 1796, -2521, -68, 1322, 1223, 2263, -503, -3906, 3686, + -3899, -139, 2086, 48, 349, 547, -6387, 1340, -1467, -1062, + -193, 1325, -1190, 2394, 1671, -1982, -2597, -390, -1504, 2271, + -379, -2350, 4071, 70, -955, -883, -1770, -1065, -2443, -1779, + -1101, -661, 6325, 1871, -2673, 3596, 3773, -681, 3340, -1418, + 701, -4253, -3931, -1840, -2388, -2677, -3545, -41, 3675, 3843, + 2198, -1713, -324, 599, 1323, 1827, -4909, -1668, 616, 2608, + 360, -1769, -5263, -1278, 3490, 1935, 1355, -1298, 952, 1801, + 449, 251, -1021, -3666, 479, 3497, 1542, -2234, -3414, -4483, + -5785, 1406, 1207, 2984, 1767, 3262, -799, -3124, 5237, 460, + 2007, -1525, -2106, -770, 546, 137, 401, -1308, 969, 204, + -1626, -589, -4257, 1744, 2836, 2383, 2740, -423, 3166, 1920, + -690, -3000, -4489, 2523, -6693, -5135, -739, -1919, 1228, 2354, + 3340, 1902, 1069, -3185, -2614, 2764, -212, -2061, -1377, 698, + 3694, -125, -954, -4132, -404, 4297, 1294, 1765, 2446, -2287, + -1387, -14, 508, 1149, 9, -437, 519, -420, 450, -751, + -1632, -1391, -2208, -1955, -1170, 4818, 1112, 1086, -782, 1337, + 846, -3434, 569, 1721, -776, -2723, 1207, 982, -1432, -887, + 315, -3031, 3452, 765, -1263, -2146, 2959, -2619, 1507, 1312, + 4087, 3125, 1637, -1402, -45, -3193, 1397, -2611, -3641, -2478, + -1706, 588, 199, 3721, 1217, -1249, -1196, 7228, 996, 879, + -1339, 11, -971, -1680, 716, -39, 233, 1945, 1548, -1476, + 550, -2277, 307, 7413, 2094, -1631, -569, -1351, -198, -483, + -515, -1347, -212, -2649, -519, 195, 2944, -795, 1470, 654, + -1448, 3156, 1369, 3966, 3382, -2782, -4255, -1157, -212, 392, + 861, 5064, 4740, -2513, -3413, -552, -2298, -575, 1130, 1178, + 1568, 4591, 1238, 367, 1626, 600, -5889, 163, -3742, -3650, + -3911, 716, 919, -1501, 55, 1807, 3801, -5571, -4635, 1225, + 3211, 3804, 1491, -906, 100, 404, -1742, -1878, -2140, 1651, + 1640, 3976, -3432, -1149, 1365, 2042, 392, 768, -1534, 1096, + 3811, -211, -2067, -1315, -4167, 1145, -2747, -149, 5296, -735, + 438, 56, -404, -159, -2164, -959, 3492, -690, -688, -1081, + 2762, -1191, 654, 2051, -2144, -3210, -1823, 743, 686, -751, + 2483, 160, 1279, 3246, 1874, 2488, 1192, -5977, -478, 120, + -349, -65, -2350, -222, -1678, -3584, 1114, 3269, 1462, -1114, + -138, 2360, -2762, 720, -3822, 2523, 216, 1170, 4398, -4229, + -1850, 1272, 383, 1736, -383, -1295, 85, -132, 1133, 1505, + 1467, -2389, -2175, 4028, -2752, 241, -4353, -2103, -562, 817, + 3959, 5471, 1941, -1598, -2349, 201, 1412, -796, 2791, -4226, + 3227, -1992, -159, -159, 4085, -1549, 1020, -2179, -776, -2088, + -147, -42, 1880, -1029, 4982, -2056, 111, 1420, 2141, 302, + -2574, -986, -477, -3697, -2349, -2064, -335, -220, 5857, 57, + -7, -5407, -546, -353, 2866, 137, -136, 3508, 992, -2059, + -2034, -1127, -189, -300, -2153, 3606, 2523, -3727, 1526, -3797, + 2134, 4352, -920, -459, 2722, 1784, -71, -3030, -877, 1967, + -1645, -4432, 512, 39, 1757, 2875, -947, 1842, 1365, 1500, + 851, 594, -2892, -404, 3327, -3078, -1575, -1258, -973, -191, + -390, 45, 627, -227, 1624, -143, 215, 2157, 4846, 5335, + 3397, -199, -4443, -3091, -283, -216, 1237, -1478, -5639, -775, + 525, 2107, 2469, 2934, -255, 2438, 824, 5973, -1820, -1330, + -1202, -2433, 900, 650, -5654, 2891, -1539, -453, 1662, 231, + -145, 1661, 741, -332, 1221, 1809, 943, 4831, -1588, -4619, + 65, -790, -985, -893, 3374, 3148, 289, 2947, -4980, -661, + -427, 1441, 7696, 158, -1914, -2069, -1717, -418, 2657, 4219, + 1505, -1096, 601, -1466, -1754, -479, -159, 3378, 5252, 5060, + 4001, 1301, 420, -1268, -2813, -4196 +}; + +const Word16 PowerCB_WB_fx[128] = /* Q11 */ +{ + -3371, -1712, + -170, 350, + -638, -939, + 56, 1074, + -1559, -626, + 200, 344, + -397, 238, + 284, 1415, + -1323, -1880, + -544, 1170, + -619, -255, + 587, 974, + -1262, -98, + 327, 151, + 41, -302, + 941, 1876, + -2257, -1233, + 28, 202, + -520, -561, + 338, 1048, + -1080, -495, + 190, 582, + -284, -24, + 578, 1585, + -1324, -1089, + -71, 568, + -471, -26, + 1140, 909, + -856, -128, + 425, 740, + 140, 12, + 1595, 1891, + -2176, -2310, + -308, 541, + -315, -859, + -80, 1314, + -1782, 510, + 403, 450, + -607, 582, + 145, 1837, + -920, -1386, + -225, 872, + -395, -258, + 829, 981, + -945, 345, + 643, 241, + -56, -23, + 1211, 1482, + -1793, -1459, + 40, 400, + -239, -471, + 532, 1238, + -774, -516, + 244, 831, + -157, 152, + 576, 2287, + -928, -844, + 41, 759, + -161, -198, + 873, 1353, + -640, 105, + 695, 623, + 364, -184, + 1238, 2446 +}; + +const Word16 PowerCB_NB_fx[128] = /* Q11 */ +{ + -3349, -2784, + -784, 385, + -891, -562, + 126, 915, + -1518, -1438, + 304, 53, + -314, -447, + 687, 1219, + -2585, -1807, + -65, 153, + -1219, -337, + 497, 700, + -894, -1051, + 161, 451, + -46, -516, + 987, 1519, + -2277, -2303, + -354, 445, + -532, -540, + 5, 1271, + -1047, -1433, + 672, -225, + -335, -75, + 1007, 1056, + -1362, -1879, + -93, 367, + -468, -259, + 1800, -290, + -1118, -793, + 412, 472, + -9, -197, + 1471, 1634, + -2627, -2847, + -269, 164, + -689, -373, + 432, 940, + -1601, -839, + 311, 271, + -212, -251, + 543, 1714, + -2014, -1336, + 109, 241, + -789, -110, + 729, 888, + -418, -1277, + 256, 674, + 218, -217, + 1027, 2065, + -1769, -2293, + -276, 853, + -360, -764, + 376, 1247, + -1274, -1122, + 602, 272, + -133, -32, + 1374, 1118, + -1860, -1795, + -23, 620, + -525, 60, + 1070, 548, + -691, -799, + 701, 572, + 81, 18, + 1949, 2120 +}; + + +const Word16 sinc_fx[8][12] = /* sinc for warp/extrapolate, in Q14 */ +{ + {0,0,0,0,0,16384,0,0,0,0,0,0,}, + {-388,484,-638,939,-1773,15966,2281,-1063,694,-514,409,-339,}, + {-701,868,-1134,1639,-2949,14751,4917,-2106,1341,-982,776,-640,}, + {-895,1101,-1427,2029,-3503,12849,7709,-2964,1835,-1328,1042,-856,}, + {-947,1159,-1489,2086,-3476,10430,10430,-3476,2086,-1489,1159,-947,}, + {-856,1042,-1328,1835,-2964,7709,12849,-3503,2029,-1427,1101,-895,}, + {-640,776,-982,1341,-2106,4917,14751,-2949,1639,-1134,868,-701,}, + {-339,409,-514,694,-1063,2281,15966,-1773,939,-638,484,-388,}, +}; +/*----------------------------------------------------------------------------------* + * Highrate SWB BWE tables + *----------------------------------------------------------------------------------*/ +const Word16 overlap_coefs_48kHz_fx[NSV_OVERLAP*WIDTH_BAND] = /* in Q15 */ +{ + 9830, 11141, 11796, 12780, 13763, 14418, 15073, 15565, 16056, 16712, 17695, 18678, 20316, 23593, 27197, 31130 +}; + +const Word16 overlap_coefs_fx[NSV_OVERLAP*WIDTH_BAND] = /* in Q15 */ +{ + 8847, 10027, 10617, 11502, 12386, 12976, 13566, 14008, 14451, 15041, 15925, 16810, 18285, 21234, 24478, 28017 +}; + + +const Word16 swb_hr_env_code1_fx[NUM_ENVLOPE_CODE_HR1 * 2] = /* in Q9 */ +{ + 23, 21, 268, 240, 344, 310, 504, 438, + 629, 580, 856, 734, 1305, 1209, 1637, 1693, + 1321, 2671, 2154, 3709, 1801, 890, 2243, 1410, + 2436, 2404, 3496, 3127, 2279, 5187, 3715, 6394, + 3435, 1000, 3381, 1894, 5434, 1299, 4806, 2171, + 3645, 4240, 4640, 3628, 4567, 4999, 5785, 6023, + 6032, 3010, 7194, 4949, 5735, 4609, 7391, 6777, + 7341, 1999, 10276, 2220, 9270, 4210, 11444, 4917, + 3708, 8481, 6030, 9814, 5694, 7913, 7457, 8888, + 9124, 6090, 8943, 7832, 10925, 6889, 10519, 8768, + 4637, 11437, 5754, 14762, 6791, 12873, 8317, 14468, + 7818, 11028, 8696, 12646, 10031, 11617, 10315, 13255, + 9112, 9960, 10901, 10336, 12338, 9772, 12090, 11543, + 12125, 8360, 13766, 9934, 13317, 8004, 14817, 8315, + 12848, 6332, 14189, 6791, 14505, 5289, 15684, 6580, + 12940, 3143, 14948, 3698, 16472, 2570, 16373, 4851 +}; + +const Word16 swb_hr_env_code2_fx[NUM_ENVLOPE_CODE_HR2 * 2] = /* in Q9 */ +{ + 262, 242, 686, 568, 1303, 901, 1600, 1559, + 2505, 1905, 2053, 2944, 2617, 1108, 3414, 1993, + 4329, 1409, 5695, 1801, 3391, 3052, 4384, 2562, + 4567, 3985, 5509, 3051, 6374, 4280, 7003, 5750, + 7000, 2794, 8434, 2006, 10706, 3294, 13034, 4412, + 8402, 3878, 9510, 5269, 11309, 6406, 10839, 8811, + 2701, 4927, 4656, 5773, 6116, 7956, 8474, 7704, + 3255, 8984, 6818, 11144, 3915, 13367, 1255, 16350 +}; + +const Word16 swb_hr_env_code3_fx[NUM_ENVLOPE_CODE_HR_TR*N_BANDS_TRANS_BWE_HR] = /* in Q9 */ +{ + 409, 347, 898, 622, 1457, 1033, 2242, 1012, + 3039, 1508, 2017, 2161, 4137, 1348, 3881, 2553, + 2538, 5306, 3962, 4430, 4730, 3610, 5225, 2877, + 5450, 2240, 5970, 1779, 5553, 1364, 6003, 838 +}; +const Word32 thren_HQ_fx[39] = +{//Q14 + 1805811328, + 1276901376, + 902905664, + 638450688, + 451452832, + 319225344, + 225726416, + 159612672, + 112863208, + 79806336, + 56431604, + 39903168, + 28215802, + 19951584, + 14107901, + 9975792, + 7053950, + 4987896, + 3526975, + 2493948, + 1763487, + 1246974, + 881743, + 623487, + 440871, + 311743, + 220435, + 155871, + 110217, + 77935, + 55108, + 38967, + 27554, + 19483, + 13777, + 9741, + 6888, + 4870, + 3444, +}; + +/*----------------------------------------------------------------------------------* + * ACELP/HQ core switching + *----------------------------------------------------------------------------------*/ + +/* short filters for BWE of ACELP->HQ switching frame */ +const Word16 hp12800_16000_fx[21] = +{//Q15 + -0, 70, -207, 380, -405, 0, 1041, -2668, 4505, + -5968, 6526, -5968, 4505, -2668, 1041, 0, -405, 380, + -207, 70, -0 +}; + +const Word16 hp12800_32000_fx[41] = +{//Q15 + -0, 45, 35, -47, -104, 0, 191, 156, + -203, -422, -0, 675, 523, -656, -1341, 0, + 2264, 1943, -2999, -9872, 19678, -9872, -2999, 1943, + 2264, 0, -1341, -656, 523, 675, -0, -422, + -203, 156, 191, 0, -104, -47, 35, 45, -0 +}; + +const Word16 hp12800_48000_fx[61] =//Q15 +{ + -0, 22, 33, 23, -10, -51, -69, -37, 45, 127, + 140, 40, -136, -271, -238, 0, 326, 507, 349, -143, + -696, -894, -450, 535, 1509, 1696, 521, -1998, -5136, -7735, + 24039, -7735, -5136, -1998, 521, 1696, 1509, 535, -450, -894, + -696, -143, 349, 507, 326, 0, -238, -271, -136, 40, + 140, 127, 45, -37, -69, -51, -10, 23, 33, 22, -0, +}; + +const Word16 hp16000_32000_fx[33] =//Q15 +{ + -0, 62, -0, -127, -0, 270, -0, -523, -0, 940, + -0, -1662, -0, 3212, -0, -10353, 16407, -10353, -0, 3212, + -0, -1662, -0, 940, -0, -523, -0, 270, -0, -127, + -0, 62, -0 +}; + +const Word16 hp16000_48000_fx[49] =//Q15 +{ + -0, 33, 39, -0, -64, -83, -0, 138, 175, 0, + -272, -334, -0, 493, 596, 0, -870, -1059, -0, 1636, + 2120, 0, -4448, -9003, 21858, -9003, -4448, 0, 2120, 1636, + -0, -1059, -870, 0, 596, 493, -0, -334, -272, 0, + 175, 138, -0, -83, -64, -0, 39, 33, -0 +}; + +const Word16 ct2[7][13] = +{ + /* accepted configurations */ + /*input 12.8, output :*/ + /*8*/ {30, 22, 30, 16, 25, 30, 19, 30, 30, 0, 8, 4, 15}, + /*16*/ {25, 22, 19, 16, 16, 0, 0, 0, 12, 1, 4, 4, 15}, + /*32*/ {19, 16, 19, 16, 16, 0, 0, 0, 6, 2, 2, 4, 15}, + /*48*/ {17, 14, 15, 16, 16, 0, 0, 0, 4, 3, 4, 4, 15}, + + /*input 16, output :*/ + /*12*/ { 9, 3, 4, 5, 9, 0, 0, 0, 5, 0, 5, 5, 4}, + /*32*/ { 4, 4, 4, 4, 4, 0, 0, 0, 2, 1, 1, 4, 4}, + /*48*/ {18, 18, 18, 18, 18, 0, 0, 0, 5, 2, 1, 4, 15}, +}; // Q0 +const Word16 ct2_fx[7][14] = +{ + /* accepted configurations */ + /*input 12.8, output : fout/fin Q13*/ + /*8*/ {30, 22, 30, 16, 25, 30, 19, 30, 30, 0, 8, 4, 15, 5120}, + /*16*/ {25, 22, 19, 16, 16, 0, 0, 0, 12, 1, 4, 4, 15, 10240}, + /*32*/ {19, 16, 19, 16, 16, 0, 0, 0, 6, 2, 2, 4, 15, 20480}, + /*48*/ {17, 14, 15, 16, 16, 0, 0, 0, 4, 3, 4, 4, 15, 30720}, + + /*input 16, output :*/ + /*12*/ { 9, 3, 4, 5, 9, 0, 0, 0, 5, 0, 5, 5, 4, 6554}, + /*32*/ { 4, 4, 4, 4, 4, 0, 0, 0, 2, 1, 1, 4, 4, 16384}, + /*48*/ {18, 18, 18, 18, 18, 0, 0, 0, 5, 2, 1, 4, 15, 24576}, +}; + +const Word16 cu15_fx[28][3] = /*Q13*/ +{ + /* xx/3, xx*xx/3, xx*xx*xx/3 xx v */ + /* 0:*/ { 182, 12, 1 }, /* 1/15 */ + /* 1:*/ { 364, 49, 6 }, /* 2/15 */ + /* 2:*/ { 546, 109, 22 }, /* 3/15 */ + /* 3:*/ { 728, 194, 52 }, /* 4/15 */ + /* 4:*/ { 910, 303, 101 }, /* 5/15 */ + /* 5:*/ { 1092, 437, 175 }, /* 6/15 */ + /* 6:*/ { 1274, 595, 278 }, /* 7/15 */ + /* 7:*/ { 1456, 777, 414 }, /* 8/15 */ + /* 8:*/ { 1638, 983, 590 }, /* 9/15 */ + /* 9:*/ { 1820, 1214, 809 }, /* 10/15 */ + /*10:*/ { 2002, 1468, 1077 }, /* 11/15 */ + /*11:*/ { 2185, 1748, 1398 }, /* 12/15 */ + /*12:*/ { 2367, 2051, 1778 }, /* 13/15 */ + /*13:*/ { 2549, 2379, 2220 }, /* 14/15 */ + /*14:*/ { 2913, 3107, 3314 }, /* 16/15 */ + /*15:*/ { 3095, 3507, 3975 }, /* 17/15 */ + /*16:*/ { 3277, 3932, 4719 }, /* 18/15 */ + /*17:*/ { 3459, 4381, 5550 }, /* 19/15 */ + /*18:*/ { 3641, 4855, 6473 }, /* 20/15 */ + /*19:*/ { 3823, 5352, 7493 }, /* 21/15 */ + /*20:*/ { 4005, 5874, 8615 }, /* 22/15 */ + /*21:*/ { 4187, 6420, 9844 }, /* 23/15 */ + /*22:*/ { 4369, 6991, 11185 }, /* 24/15 */ + /*23:*/ { 4551, 7585, 12642 }, /* 25/15 */ + /*24:*/ { 4733, 8204, 14221 }, /* 26/15 */ + /*25:*/ { 4915, 8847, 15925 }, /* 27/15 */ + /*26:*/ { 5097, 9515, 17761 }, /* 28/15 */ + /*27:*/ { 5279, 10207, 19733 }, /* 29/15 */ +}; + +const Word16 cu4_fx[6][3] = /*Q13*/ +{ + /* xx/3, xx*xx/3, xx*xx*xx/3 xx v */ + /* 0:*/ { 683, 171, 43 }, /* 1/4 */ + /* 1:*/ { 1365, 683, 341 }, /* 2/4 */ + /* 2:*/ { 2048, 1536, 1152 }, /* 3/4 */ + /* 3:*/ { 3413, 4267, 5333 }, /* 5/4 */ + /* 4:*/ { 4096, 6144, 9216 }, /* 6/4 */ + /* 5:*/ { 4779, 8363, 14635 }, /* 7/4 */ +}; + + +/*----------------------------------------------------------------------------------* + * hp filter for filtering random part of excitation in frame error concealment + * Used in lib_dec\syn_bfi.c + *----------------------------------------------------------------------------------*/ + +const Word16 h_high_fx[5] = { -410, -3572, 25602, -3572, -410 };//Q15 + +const Word16 sincos_t_rad3_fx[T_SIN_PI_2 + 1] = +{//Q15 + 0, 134, 268, 402, 536, 670, 804, 938, + 1072, 1206, 1340, 1474, 1608, 1742, 1876, 2009, + 2143, 2277, 2411, 2544, 2678, 2811, 2945, 3078, + 3212, 3345, 3479, 3612, 3745, 3878, 4011, 4144, + 4277, 4410, 4543, 4675, 4808, 4941, 5073, 5205, + 5338, 5470, 5602, 5734, 5866, 5998, 6130, 6261, + 6393, 6524, 6655, 6787, 6918, 7049, 7180, 7310, + 7441, 7571, 7702, 7832, 7962, 8092, 8222, 8351, + 8481, 8610, 8740, 8869, 8998, 9127, 9255, 9384, + 9512, 9640, 9768, 9896, 10024, 10151, 10279, 10406, + 10533, 10660, 10786, 10913, 11039, 11165, 11291, 11417, + 11543, 11668, 11793, 11918, 12043, 12167, 12292, 12416, + 12540, 12664, 12787, 12910, 13033, 13156, 13279, 13401, + 13524, 13646, 13767, 13889, 14010, 14131, 14252, 14373, + 14493, 14613, 14733, 14852, 14972, 15091, 15210, 15328, + 15447, 15565, 15683, 15800, 15917, 16035, 16151, 16268, + 16384, 16500, 16616, 16731, 16846, 16961, 17075, 17190, + 17304, 17417, 17531, 17644, 17757, 17869, 17981, 18093, + 18205, 18316, 18427, 18538, 18648, 18758, 18868, 18978, + 19087, 19195, 19304, 19412, 19520, 19627, 19735, 19841, + 19948, 20054, 20160, 20265, 20371, 20475, 20580, 20684, + 20788, 20891, 20994, 21097, 21199, 21301, 21403, 21504, + 21605, 21706, 21806, 21906, 22006, 22105, 22204, 22302, + 22400, 22498, 22595, 22692, 22788, 22884, 22980, 23076, + 23170, 23265, 23359, 23453, 23546, 23640, 23732, 23824, + 23916, 24008, 24099, 24189, 24279, 24369, 24459, 24548, + 24636, 24724, 24812, 24900, 24986, 25073, 25159, 25245, + 25330, 25415, 25499, 25583, 25667, 25750, 25833, 25915, + 25997, 26078, 26159, 26239, 26320, 26399, 26478, 26557, + 26635, 26713, 26791, 26868, 26944, 27020, 27096, 27171, + 27246, 27320, 27394, 27467, 27540, 27612, 27684, 27756, + 27827, 27897, 27967, 28037, 28106, 28175, 28243, 28311, + 28378, 28445, 28511, 28577, 28642, 28707, 28771, 28835, + 28899, 28962, 29024, 29086, 29148, 29209, 29269, 29329, + 29389, 29448, 29506, 29564, 29622, 29679, 29736, 29792, + 29847, 29902, 29957, 30011, 30064, 30118, 30170, 30222, + 30274, 30325, 30375, 30425, 30475, 30524, 30572, 30620, + 30668, 30715, 30761, 30807, 30853, 30897, 30942, 30986, + 31029, 31072, 31114, 31156, 31197, 31238, 31278, 31318, + 31357, 31396, 31434, 31471, 31508, 31545, 31581, 31617, + 31651, 31686, 31720, 31753, 31786, 31818, 31850, 31881, + 31912, 31942, 31972, 32001, 32029, 32058, 32085, 32112, + 32138, 32164, 32190, 32214, 32239, 32262, 32286, 32308, + 32330, 32352, 32373, 32393, 32413, 32433, 32452, 32470, + 32488, 32505, 32522, 32538, 32553, 32568, 32583, 32597, + 32610, 32623, 32635, 32647, 32658, 32669, 32679, 32689, + 32698, 32706, 32714, 32722, 32729, 32735, 32741, 32746, + 32750, 32755, 32758, 32761, 32764, 32766, 32767, 32767, + 32767 +}; + +/*----------------------------------------------------------------------------------* + * TCX + *----------------------------------------------------------------------------------*/ + +const Word16 gain_corr_fac[3] = { 0x4155, 0x40A9, 0x4055 }; /* pow(10, 2^(-n-2)/28) (1Q14) */ +const Word16 gain_corr_inv_fac[3] = { 0x7D67, 0x7EB2, 0x7F59 }; /* pow(10,-2^(-n-2)/28) (0Q15) */ + +const Word16 inter4_2tcx2[4][4] = +{ + { 7620/*0.2325402f Q15*/, 17528/*0.5349195f Q15*/, 7620/*0.2325402f Q15*/, 0/*0.0000000f Q15*/ }, + { 4434/*0.1353017f Q15*/, 16694/*0.5094465f Q15*/, 11141/*0.3400065f Q15*/, 500/*0.0152453f Q15*/ }, + { 1995/*0.0608774f Q15*/, 14389/*0.4391226f Q15*/, 14389/*0.4391226f Q15*/, 1995/*0.0608774f Q15*/ }, + { 500/*0.0152453f Q15*/, 11141/*0.3400065f Q15*/, 16694/*0.5094465f Q15*/, 4434/*0.1353017f Q15*/ } +}; +const Word16 inter6_2tcx2[6][4] = +{ + { 7345/*0.2241379f Q15*/, 18079/*0.5517241f Q15*/, 7345/*0.2241379f Q15*/, 0/*0.0000000f Q15*/ }, + { 5119/*0.1562044f Q15*/, 17657/*0.5388595f Q15*/, 9798/*0.2990011f Q15*/, 194/*0.0059349f Q15*/ }, + { 3249/*0.0991379f Q15*/, 16444/*0.5018346f Q15*/, 12288/*0.3750000f Q15*/, 787/*0.0240275f Q15*/ }, + { 1800/*0.0549361f Q15*/, 14584/*0.4450639f Q15*/, 14584/*0.4450639f Q15*/, 1800/*0.0549361f Q15*/ }, + { 787/*0.0240275f Q15*/, 12288/*0.3750000f Q15*/, 16444/*0.5018346f Q15*/, 3249/*0.0991379f Q15*/ }, + { 194/*0.0059349f Q15*/, 9798/*0.2990011f Q15*/, 17657/*0.5388595f Q15*/, 5119/*0.1562044f Q15*/ } +}; + +const Word16 inter_core_12_8kHz_output_8kHz[] = +{ + 17528/*0.5349196f Q15*/, 16694/*0.5094466f Q15*/, 14389/*0.4391227f Q15*/, 11141/*0.3400065f Q15*/, + 7620/*0.2325402f Q15*/, 4434/*0.1353016f Q15*/, 1995/*0.0608773f Q15*/, 500/*0.0152453f Q15*/, + 0/*0.0000000f Q15*/ +}; +const Word16 inter_core_12_8kHz_output_16kHz[] = +{ + 14023/*0.4279357f Q15*/, 13592/*0.4147958f Q15*/, 12367/*0.3774199f Q15*/, 10533/*0.3214508f Q15*/, + 8350/*0.2548195f Q15*/, 6096/*0.1860321f Q15*/, 4017/*0.1225801f Q15*/, 2291/*0.0699165f Q15*/, + 1023/*0.0312127f Q15*/, 256/*0.0078047f Q15*/, 0/*0.0000000f Q15*/, 0/*0.0000000f Q15*/, + 0/*0.0000000f Q15*/ +}; +const Word16 inter_core_12_8kHz_output_32kHz[] = +{ + 7011/*0.2139679f Q15*/, 6957/*0.2123089f Q15*/, 6796/*0.2073979f Q15*/, 6535/*0.1994284f Q15*/, + 6184/*0.1887100f Q15*/, 5756/*0.1756491f Q15*/, 5267/*0.1607254f Q15*/, 4734/*0.1444646f Q15*/, + 4175/*0.1274097f Q15*/, 3608/*0.1100939f Q15*/, 3048/*0.0930161f Q15*/, 2511/*0.0766219f Q15*/, + 2008/*0.0612900f Q15*/, 1551/*0.0473253f Q15*/, 1146/*0.0349583f Q15*/, 798/*0.0243509f Q15*/, + 511/*0.0156063f Q15*/, 288/*0.0087817f Q15*/, 128/*0.0039024f Q15*/, 32/*0.0009753f Q15*/, + 0/*0.0000000f Q15*/ +}; +const Word16 inter_core_12_8kHz_output_48kHz[] = +{ + 4674/*0.1426452f Q15*/, 4658/*0.1421528f Q15*/, 4610/*0.1406841f Q15*/, 4531/*0.1382653f Q15*/, + 4422/*0.1349386f Q15*/, 4285/*0.1307618f Q15*/, 4122/*0.1258066f Q15*/, 3937/*0.1201564f Q15*/, + 3732/*0.1139041f Q15*/, 3511/*0.1071503f Q15*/, 3277/*0.1000000f Q15*/, 3033/*0.0925607f Q15*/, + 2783/*0.0849398f Q15*/, 2531/*0.0772420f Q15*/, 2280/*0.0695677f Q15*/, 2032/*0.0620107f Q15*/, + 1791/*0.0546572f Q15*/, 1559/*0.0475844f Q15*/, 1339/*0.0408600f Q15*/, 1132/*0.0345417f Q15*/, + 940/*0.0286774f Q15*/, 764/*0.0233055f Q15*/, 605/*0.0184558f Q15*/, 464/*0.0141503f Q15*/, + 341/*0.0104042f Q15*/, 237/*0.0072274f Q15*/, 152/*0.0046257f Q15*/, 85/*0.0026016f Q15*/, + 38/*0.0011560f Q15*/, 9/*0.0002890f Q15*/, 0/*0.0000000f Q15*/, 0/*0.0000000f Q15*/, + 0/*0.0000000f Q15*/ +}; +const Word16 inter_core_16kHz_output_8kHz[] = +{ + 18079/*0.5517241f Q15*/, 17657/*0.5388595f Q15*/, 16444/*0.5018346f Q15*/, 14584/*0.4450639f Q15*/, 12288/*0.3750000f Q15*/, 9798/*0.2990011f Q15*/, + 7345/*0.2241379f Q15*/, 5119/*0.1562044f Q15*/, 3249/*0.0991379f Q15*/, 1800/*0.0549361f Q15*/, 787/*0.0240275f Q15*/, 194/*0.0059349f Q15*/, + 0/*0.0000000f Q15*/ +}; +const Word16 inter_core_16kHz_output_16kHz[] = +{ + 18079/*0.5517241f Q15*/, 17657/*0.5388595f Q15*/, 16444/*0.5018346f Q15*/, 14584/*0.4450639f Q15*/, 12288/*0.3750000f Q15*/, 9798/*0.2990011f Q15*/, + 7345/*0.2241379f Q15*/, 5119/*0.1562044f Q15*/, 3249/*0.0991379f Q15*/, 1800/*0.0549361f Q15*/, 787/*0.0240275f Q15*/, 194/*0.0059349f Q15*/, + 0/*0.0000000f Q15*/ +}; +const Word16 inter_core_16kHz_output_32kHz[] = +{ + 9039/*0.2758621f Q15*/, 8986/*0.2742414f Q15*/, 8829/*0.2694298f Q15*/, 8571/*0.2615753f Q15*/, 8222/*0.2509173f Q15*/, 7791/*0.2377748f Q15*/, + 7292/*0.2225320f Q15*/, 6738/*0.2056203f Q15*/, 6144/*0.1875000f Q15*/, 5526/*0.1686403f Q15*/, 4899/*0.1495006f Q15*/, 4277/*0.1305132f Q15*/, + 3672/*0.1120690f Q15*/, 3097/*0.0945060f Q15*/, 2559/*0.0781022f Q15*/, 2067/*0.0630725f Q15*/, 1624/*0.0495690f Q15*/, 1235/*0.0376861f Q15*/, + 900/*0.0274680f Q15*/, 620/*0.0189188f Q15*/, 394/*0.0120137f Q15*/, 220/*0.0067120f Q15*/, 97/*0.0029675f Q15*/, 24/*0.0007394f Q15*/, + 0/*0.0000000f Q15*/ +}; +const Word16 inter_core_16kHz_output_48kHz[] = +{ + 6026/*0.1839080f Q15*/, 6011/*0.1834272f Q15*/, 5963/*0.1819912f Q15*/, 5886/*0.1796198f Q15*/, 5778/*0.1763457f Q15*/, 5643/*0.1722133f Q15*/, + 5481/*0.1672782f Q15*/, 5296/*0.1616061f Q15*/, 5088/*0.1552712f Q15*/, 4861/*0.1483546f Q15*/, 4618/*0.1409433f Q15*/, 4362/*0.1331275f Q15*/, + 4096/*0.1250000f Q15*/, 3823/*0.1166535f Q15*/, 3545/*0.1081796f Q15*/, 3266/*0.0996670f Q15*/, 2988/*0.0912002f Q15*/, 2715/*0.0828579f Q15*/, + 2448/*0.0747126f Q15*/, 2190/*0.0668293f Q15*/, 1942/*0.0592649f Q15*/, 1706/*0.0520681f Q15*/, 1484/*0.0452794f Q15*/, 1276/*0.0389306f Q15*/, + 1083/*0.0330460f Q15*/, 906/*0.0276422f Q15*/, 745/*0.0227295f Q15*/, 600/*0.0183120f Q15*/, 472/*0.0143894f Q15*/, 359/*0.0109575f Q15*/, + 262/*0.0080092f Q15*/, 181/*0.0055360f Q15*/, 116/*0.0035286f Q15*/, 65/*0.0019783f Q15*/, 29/*0.0008771f Q15*/, 7/*0.0002189f Q15*/, + 0/*0.0000000f Q15*/ +}; +const Word16 inter_core_25_6kHz_output_8kHz[] = +{ + 17528/*0.5349196f Q15*/, 16694/*0.5094466f Q15*/, 14389/*0.4391227f Q15*/, 11141/*0.3400065f Q15*/, + 7620/*0.2325402f Q15*/, 4434/*0.1353016f Q15*/, 1995/*0.0608773f Q15*/, 500/*0.0152453f Q15*/, + 0/*0.0000000f Q15*/ +}; +const Word16 inter_core_25_6kHz_output_16kHz[] = +{ + 17528/*0.5349196f Q15*/, 16694/*0.5094466f Q15*/, 14389/*0.4391227f Q15*/, 11141/*0.3400065f Q15*/, + 7620/*0.2325402f Q15*/, 4434/*0.1353016f Q15*/, 1995/*0.0608773f Q15*/, 500/*0.0152453f Q15*/, + 0/*0.0000000f Q15*/ +}; +const Word16 inter_core_25_6kHz_output_32kHz[] = +{ + 14023/*0.4279357f Q15*/, 13592/*0.4147958f Q15*/, 12367/*0.3774199f Q15*/, 10533/*0.3214508f Q15*/, + 8350/*0.2548195f Q15*/, 6096/*0.1860321f Q15*/, 4017/*0.1225801f Q15*/, 2291/*0.0699165f Q15*/, + 1023/*0.0312127f Q15*/, 256/*0.0078047f Q15*/, 0/*0.0000000f Q15*/, 0/*0.0000000f Q15*/, + 0/*0.0000000f Q15*/ +}; +const Word16 inter_core_25_6kHz_output_48kHz[] = +{ + 9349/*0.2852965f Q15*/, 9220/*0.2813740f Q15*/, 8843/*0.2698819f Q15*/, 8245/*0.2516166f Q15*/, + 7465/*0.2278099f Q15*/, 6554/*0.2000000f Q15*/, 5567/*0.1698781f Q15*/, 4559/*0.1391327f Q15*/, + 3582/*0.1093111f Q15*/, 2678/*0.0817166f Q15*/, 1879/*0.0573517f Q15*/, 1209/*0.0369093f Q15*/, + 682/*0.0208069f Q15*/, 303/*0.0092505f Q15*/, 76/*0.0023118f Q15*/, 0/*0.0000000f Q15*/, + 0/*0.0000000f Q15*/ +}; + +const TCX_LTP_FILTER tcxLtpFilters[12] = +{ + { inter_core_12_8kHz_output_8kHz, 2 }, + { inter_core_12_8kHz_output_16kHz, 3 }, + { inter_core_12_8kHz_output_32kHz, 5 }, + { inter_core_12_8kHz_output_48kHz, 8 }, + { inter_core_16kHz_output_8kHz, 2 }, + { inter_core_16kHz_output_16kHz, 2 }, + { inter_core_16kHz_output_32kHz, 4 }, + { inter_core_16kHz_output_48kHz, 6 }, + { inter_core_25_6kHz_output_8kHz, 2 }, + { inter_core_25_6kHz_output_16kHz, 2 }, + { inter_core_25_6kHz_output_32kHz, 3 }, + { inter_core_25_6kHz_output_48kHz, 4 }, +}; + + + +const SCALE_TCX_SETUP scaleTcxTable[SIZE_SCALE_TABLE_TCX] = +{ + { 0, 0, 8000, /* 0.67f ,*/ 21955/*0.67f Q15*/ }, + { 0, 8000, 9600, /* 0.70f ,*/ 22938/*0.70f Q15*/ }, + { 0, 9600, 13200, /* 0.76f ,*/ 24904/*0.76f Q15*/ }, + { 0, 13200, 16400, /* 0.86f ,*/ 28180/*0.86f Q15*/ }, + { 0, 16400, 24400, /* 0.90f ,*/ 29491/*0.90f Q15*/ }, + { 0, 24400, 64000, /* 0.96f ,*/ 31457/*0.96f Q15*/ }, + { 1, 0, 8000, /* 1.f ,*/ 32767/*1.f Q15*/ }, + { 1, 8000, 9600, /* 1.f ,*/ 32767/*1.f Q15*/ }, + { 1, 9600, 13200, /* 1.f ,*/ 32767/*1.f Q15*/ }, + { 1, 13200, 16400, /* 0.85f ,*/ 27853/*0.85f Q15*/ }, + { 1, 16400, 24400, /* 0.88f ,*/ 28836/*0.88f Q15*/ }, + { 1, 24400, 32000, /* 0.90f ,*/ 29491/*0.90f Q15*/ }, + { 1, 32000, 32400, /* 0.95f ,*/ 31130/*0.95f Q15*/ }, +}; + + +/*----------------------------------------------------------------------------------* + * Arithmetic coder + *----------------------------------------------------------------------------------*/ + +const UWord8 ari_lookup_s17_LC[4096] = // Q0 +{ + 0x01,0x04,0x29,0x13,0x0A,0x0D,0x05,0x10, + 0x10,0x0D,0x00,0x0D,0x2A,0x2A,0x22,0x25, + 0x25,0x28,0x2B,0x2E,0x31,0x34,0x34,0x0E, + 0x21,0x21,0x21,0x36,0x38,0x38,0x36,0x10, + 0x10,0x08,0x09,0x0B,0x0C,0x0E,0x0E,0x21, + 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x10, + 0x10,0x1A,0x09,0x1D,0x0C,0x20,0x20,0x21, + 0x36,0x36,0x36,0x36,0x36,0x0A,0x36,0x16, + 0x1A,0x1A,0x2D,0x0C,0x20,0x20,0x21,0x21, + 0x21,0x36,0x38,0x38,0x38,0x38,0x36,0x16, + 0x16,0x1A,0x3F,0x1F,0x20,0x21,0x24,0x06, + 0x36,0x36,0x36,0x38,0x00,0x0A,0x36,0x22, + 0x3E,0x3E,0x3F,0x30,0x20,0x21,0x06,0x06, + 0x06,0x38,0x36,0x36,0x36,0x26,0x36,0x1C, + 0x1C,0x3E,0x3F,0x02,0x20,0x21,0x06,0x36, + 0x36,0x38,0x0A,0x0A,0x0A,0x0A,0x05,0x16, + 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, + 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, + 0x16,0x3F,0x3F,0x0E,0x35,0x14,0x38,0x38, + 0x05,0x05,0x05,0x0D,0x13,0x13,0x1C,0x16, + 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, + 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, + 0x3F,0x3F,0x3F,0x20,0x35,0x14,0x27,0x38, + 0x38,0x0A,0x2A,0x2A,0x2A,0x16,0x05,0x10, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x3F,0x02,0x0E,0x02,0x14,0x13,0x0A, + 0x0D,0x0D,0x0D,0x13,0x00,0x00,0x16,0x19, + 0x19,0x3F,0x3F,0x02,0x02,0x14,0x38,0x36, + 0x0A,0x0A,0x0A,0x0D,0x0D,0x0D,0x1C,0x22, + 0x22,0x3F,0x3F,0x02,0x17,0x26,0x26,0x1C, + 0x1C,0x10,0x16,0x16,0x16,0x19,0x22,0x25, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x15,0x2C,0x2E,0x2E,0x2E,0x31, + 0x31,0x31,0x31,0x31,0x31,0x31,0x34,0x39, + 0x39,0x39,0x15,0x2C,0x2E,0x2E,0x0C,0x34, + 0x34,0x34,0x36,0x36,0x36,0x36,0x36,0x36, + 0x36,0x39,0x15,0x3C,0x2E,0x31,0x34,0x34, + 0x31,0x31,0x31,0x1F,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x39,0x28,0x2C,0x2E,0x31,0x37,0x34, + 0x01,0x01,0x01,0x01,0x01,0x00,0x39,0x39, + 0x39,0x39,0x39,0x2C,0x2E,0x31,0x1E,0x34, + 0x34,0x35,0x01,0x01,0x01,0x01,0x01,0x01, + 0x01,0x39,0x39,0x3C,0x2E,0x03,0x07,0x34, + 0x34,0x0F,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x15,0x2B,0x31,0x1E,0x34, + 0x34,0x01,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x2C,0x39,0x2F,0x2E,0x2E, + 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E, + 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E, + 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E, + 0x2E,0x39,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x0F,0x2E,0x2E, + 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E, + 0x2E,0x2E,0x39,0x15,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, + 0x19,0x1C,0x16,0x22,0x22,0x25,0x25,0x25, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x3E,0x3E,0x2F,0x3D,0x21,0x36,0x38,0x05, + 0x0D,0x0D,0x0D,0x10,0x16,0x16,0x16,0x25, + 0x2D,0x2D,0x37,0x3D,0x33,0x38,0x05,0x0D, + 0x0D,0x10,0x16,0x16,0x16,0x16,0x16,0x25, + 0x2F,0x2F,0x30,0x12,0x06,0x05,0x0A,0x0D, + 0x0D,0x10,0x16,0x16,0x16,0x22,0x22,0x25, + 0x1F,0x1F,0x32,0x3B,0x29,0x0A,0x0A,0x10, + 0x16,0x16,0x16,0x16,0x22,0x22,0x22,0x25, + 0x02,0x02,0x14,0x29,0x05,0x0D,0x2A,0x10, + 0x16,0x16,0x16,0x22,0x22,0x22,0x22,0x25, + 0x35,0x35,0x14,0x29,0x0A,0x2A,0x2A,0x10, + 0x16,0x16,0x16,0x22,0x22,0x22,0x22,0x25, + 0x17,0x17,0x26,0x05,0x0D,0x10,0x10,0x16, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x25, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x1C,0x0D,0x16,0x16,0x16, + 0x22,0x22,0x22,0x22,0x22,0x22,0x25,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x26,0x1C,0x1C,0x10,0x16,0x16,0x22, + 0x22,0x22,0x22,0x22,0x22,0x25,0x25,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x1C,0x1C,0x1C,0x16,0x16,0x16,0x22, + 0x22,0x22,0x22,0x25,0x25,0x25,0x25,0x00, + 0x00,0x26,0x1C,0x1C,0x16,0x16,0x16,0x22, + 0x22,0x22,0x22,0x25,0x25,0x25,0x25,0x00, + 0x16,0x16,0x16,0x16,0x16,0x22,0x22,0x22, + 0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x00, + 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, + 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, + 0x15,0x15,0x3C,0x1E,0x0F,0x06,0x27,0x2A, + 0x2A,0x10,0x16,0x16,0x16,0x16,0x16,0x22, + 0x2C,0x2C,0x0B,0x37,0x23,0x27,0x13,0x2A, + 0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x22, + 0x1B,0x1B,0x1D,0x0F,0x24,0x13,0x13,0x2A, + 0x00,0x10,0x16,0x16,0x16,0x16,0x16,0x22, + 0x1F,0x1F,0x03,0x24,0x07,0x0A,0x0A,0x10, + 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x22, + 0x22,0x35,0x06,0x27,0x13,0x2A,0x2A,0x10, + 0x16,0x16,0x16,0x16,0x16,0x22,0x22,0x22, + 0x22,0x06,0x27,0x27,0x13,0x2A,0x2A,0x10, + 0x16,0x16,0x16,0x16,0x16,0x16,0x22,0x22, + 0x22,0x05,0x0A,0x2A,0x2A,0x10,0x10,0x16, + 0x16,0x16,0x16,0x16,0x16,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x0D,0x2A,0x10,0x10,0x10,0x10,0x16, + 0x16,0x16,0x16,0x16,0x16,0x22,0x22,0x25, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x16, + 0x16,0x16,0x16,0x22,0x22,0x22,0x22,0x25, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x10,0x10,0x10,0x10,0x16,0x16,0x16,0x16, + 0x16,0x22,0x22,0x22,0x22,0x22,0x22,0x25, + 0x0D,0x0D,0x10,0x10,0x10,0x16,0x16,0x16, + 0x16,0x22,0x22,0x22,0x22,0x22,0x22,0x25, + 0x0D,0x0D,0x0D,0x0D,0x0D,0x10,0x10,0x16, + 0x16,0x16,0x16,0x22,0x22,0x22,0x22,0x25, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x3A,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x11,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x18, + 0x00,0x11,0x3A,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x11,0x11,0x11,0x18,0x18,0x18,0x18, + 0x18,0x25,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x3A,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x18,0x18, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x18,0x18, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x18,0x18,0x18,0x18, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x11,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x11,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x11,0x11,0x11,0x3A,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x18,0x3A,0x3A,0x11,0x11,0x11,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x11,0x11,0x11,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x11,0x11,0x11,0x11,0x11,0x18, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x11,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x2A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x18, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x11,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x11, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A +}; + +const UWord16 ari_pk_s17_LC_ext[64][18] = // Q0 +{ + { + 16384, 16368,16337,16231,16143,16115,16059,15916,15793,15710,15586,15472,15367,15302,15201,15107,15020, + 0 + }, + { + 16384, 8983, 8540, 8498, 8485, 4319, 3666, 3594, 3579, 2285, 1908, 1851, 1835, 1326, 1120, 1085, 1074, + 0 + }, + { + 16384, 12022,10039, 9520, 9346, 7347, 5335, 4648, 4382, 3815, 3083, 2728, 2562, 2363, 2050, 1869, 1777, + 0 + }, + { + 16384, 13429,11201,10562,10371, 8231, 5713, 4770, 4441, 3798, 2844, 2359, 2152, 1947, 1614, 1406, 1304, + 0 + }, + { + 16384, 13229,11403,10769,10529, 8415, 6431, 5645, 5311, 4448, 3547, 3176, 3001, 2617, 2181, 1984, 1886, + 0 + }, + { + 16384, 15168,13754,13120,12826,11553, 9705, 8723, 8227, 7675, 6762, 6180, 5842, 5585, 5141, 4816, 4607, + 0 + }, + { + 16384, 14625,12743,12034,11772,10059, 7706, 6652, 6223, 5594, 4594, 4023, 3742, 3501, 3089, 2818, 2664, + 0 + }, + { + 16384, 15275,13679,12951,12652,11158, 8852, 7652, 7121, 6406, 5242, 4542, 4196, 3894, 3398, 3063, 2864, + 0 + }, + { + 16384, 4860, 3338, 3214, 3193, 1428, 676, 571, 547, 356, 222, 189, 180, 139, 102, 89, 84, + 0 + }, + { + 16384, 8357, 5798, 5475, 5410, 3093, 1523, 1227, 1152, 849, 560, 470, 441, 370, 294, 261, 248, + 0 + }, + { + 16384, 15550,14350,13710,13387,12297,10541, 9493, 8929, 8354, 7371, 6696, 6299, 6008, 5491, 5107, 4856, + 0 + }, + { + 16384, 10346, 7298, 6933, 6865, 4052, 1863, 1471, 1381, 1055, 673, 536, 491, 429, 339, 293, 273, + 0 + }, + { + 16384, 11652, 8699, 8030, 7839, 5667, 3460, 2766, 2532, 2093, 1542, 1301, 1203, 1070, 893, 802, 759, + 0 + }, + { + 16384, 15639,14601,14037,13729,12847,11421,10520, 9978, 9521, 8720, 8136, 7750, 7493, 7033, 6676, 6426, + 0 + }, + { + 16384, 12427, 9590, 8715, 8386, 6641, 4708, 3886, 3515, 3071, 2490, 2198, 2052, 1886, 1670, 1549, 1478, + 0 + }, + { + 16384, 13605,10996,10363,10183, 7802, 5032, 4124, 3840, 3267, 2403, 1976, 1804, 1633, 1345, 1171, 1086, + 0 + }, + { + 16384, 15936,15224,14759,14464,13808,12678,11866,11331,10910,10150, 9549, 9122, 8853, 8352, 7938, 7626, + 0 + }, + { + 16384, 16383,16382,14829,14138,14137,14136,12895,12272,10935, 9788, 9082, 8674, 8073, 7508, 7118, 6867, + 0 + }, + { + 16384, 13888,11474,10840,10662, 8335, 5585, 4695, 4411, 3801, 2917, 2506, 2337, 2150, 1847, 1672, 1581, + 0 + }, + { + 16384, 15463,14162,13504,13196,11977,10063, 8978, 8429, 7811, 6768, 6088, 5705, 5406, 4882, 4504, 4266, + 0 + }, + { + 16384, 13764,11941,11367,11151, 9312, 7171, 6301, 5943, 5335, 4430, 3942, 3708, 3466, 3074, 2819, 2679, + 0 + }, + { + 16384, 5179, 3300, 3206, 3197, 1220, 374, 303, 293, 171, 81, 63, 59, 44, 29, 24, 22, + 0 + }, + { + 16384, 16026,15468,15096,14842,14329,13447,12790,12322,11985,11367,10860,10477,10248, 9811, 9443, 9148, + 0 + }, + { + 16384, 12809,11291,10848,10649, 8976, 7199, 6506, 6196, 5657, 4887, 4451, 4219, 3974, 3590, 3365, 3218, + 0 + }, + { + 16384, 16383,16382,15744,15348,15347,15346,14714,14288,13688,13097,12652,12328,11967,11584,11278,11045, + 0 + }, + { + 16384, 15415,14987,14866,14806,13751,13046,12818,12709,12187,11720,11527,11427,11096,10759,10601,10510, + 0 + }, + { + 16384, 5926, 4280, 4090, 4053, 2138, 1120, 947, 903, 632, 413, 353, 334, 264, 198, 174, 166, + 0 + }, + { + 16384, 9206, 6640, 6345, 6291, 3683, 1772, 1423, 1342, 1024, 652, 515, 467, 406, 314, 267, 245, + 0 + }, + { + 16384, 15086,13966,13505,13271,12238,10875,10157, 9763, 9331, 8629, 8155, 7845, 7608, 7198, 6892, 6670, + 0 + }, + { + 16384, 11427, 8599, 8132, 8027, 5406, 3012, 2429, 2270, 1823, 1244, 1006, 920, 814, 654, 564, 524, + 0 + }, + { + 16384, 11561, 8220, 7814, 7737, 4780, 2215, 1731, 1621, 1279, 830, 657, 599, 532, 424, 366, 339, + 0 + }, + { + 16384, 11649, 9374, 8867, 8724, 6398, 4154, 3470, 3253, 2718, 2010, 1695, 1570, 1412, 1172, 1042, 980, + 0 + }, + { + 16384, 13021,10503, 9726, 9443, 7520, 5271, 4369, 4016, 3495, 2741, 2365, 2181, 1990, 1719, 1561, 1478, + 0 + }, + { + 16384, 13815,11388,10605,10316, 8467, 6133, 5175, 4782, 4255, 3466, 3063, 2864, 2688, 2408, 2229, 2125, + 0 + }, + { + 16384, 16175,15807,15536,15338,15006,14402,13919,13549,13312,12871,12491,12182,12010,11681,11390,11143, + 0 + }, + { + 16384, 14310,12047,11336,11110, 9065, 6381, 5318, 4938, 4279, 3272, 2732, 2499, 2284, 1920, 1693, 1574, + 0 + }, + { + 16384, 14765,12824,12096,11834,10003, 7429, 6282, 5841, 5145, 4022, 3402, 3123, 2868, 2426, 2150, 2003, + 0 + }, + { + 16384, 16295,16127,15943,15802,15650,15360,15059,14816,14668,14401,14162,13954,13839,13634,13443,13275, + 0 + }, + { + 16384, 14182,12821,12340,12120,10698, 9040, 8284, 7908, 7378, 6549, 6053, 5772, 5520, 5080, 4785, 4597, + 0 + }, + { + 16384, 15164,13583,12892,12600,11161, 8997, 7888, 7386, 6744, 5673, 5015, 4673, 4391, 3898, 3555, 3349, + 0 + }, + { + 16384, 3758, 2571, 2481, 2467, 988, 478, 412, 397, 245, 154, 133, 127, 95, 69, 61, 58, + 0 + }, + { + 16384, 14805,13193,12553,12285,10706, 8596, 7623, 7178, 6542, 5563, 4996, 4703, 4426, 3967, 3662, 3482, + 0 + }, + { + 16384, 15787,14870,14320,14005,13147,11705,10747,10171, 9651, 8735, 8068, 7629, 7332, 6785, 6361, 6061, + 0 + }, + { + 16384, 7111, 4622, 4304, 4233, 2346, 1174, 938, 870, 659, 455, 389, 365, 316, 260, 236, 226, + 0 + }, + { + 16384, 7146, 4703, 4532, 4512, 2078, 740, 583, 556, 371, 201, 153, 141, 118, 87, 72, 66, + 0 + }, + { + 16384, 9593, 7184, 6853, 6790, 4144, 2206, 1832, 1745, 1320, 878, 741, 697, 599, 476, 424, 401, + 0 + }, + { + 16384, 9209, 5969, 5479, 5351, 3346, 1763, 1382, 1261, 1017, 733, 622, 578, 520, 446, 410, 392, + 0 + }, + { + 16384, 11324, 8681, 8252, 8159, 5450, 3114, 2606, 2473, 1987, 1412, 1211, 1142, 1017, 847, 765, 730, + 0 + }, + { + 16384, 12663,10073, 9527, 9392, 6827, 4204, 3489, 3286, 2713, 1966, 1666, 1554, 1400, 1172, 1051, 994, + 0 + }, + { + 16384, 10413, 7096, 6340, 6115, 4393, 2704, 2156, 1947, 1634, 1254, 1091, 1010, 925, 805, 742, 707, + 0 + }, + { + 16384, 13337,11073,10477,10306, 8045, 5534, 4705, 4438, 3804, 2942, 2530, 2360, 2164, 1850, 1668, 1574, + 0 + }, + { + 16384, 14323,12104,11391,11156, 9183, 6649, 5649, 5287, 4676, 3778, 3302, 3089, 2886, 2548, 2341, 2223, + 0 + }, + { + 16384, 11646, 8435, 7504, 7150, 5603, 3882, 3170, 2853, 2487, 2029, 1791, 1666, 1549, 1386, 1288, 1231, + 0 + }, + { + 16384, 13147,11339,10752,10524, 8775, 6682, 5776, 5398, 4813, 3908, 3406, 3154, 2933, 2554, 2310, 2176, + 0 + }, + { + 16384, 14551,12495,11707,11356, 9962, 8005, 7006, 6500, 6034, 5298, 4839, 4575, 4381, 4057, 3825, 3673, + 0 + }, + { + 16384, 12395, 9526, 9032, 8925, 6130, 3448, 2813, 2649, 2144, 1489, 1231, 1142, 1020, 836, 738, 694, + 0 + }, + { + 16384, 14921,13187,12475,12164,10758, 8775, 7752, 7257, 6727, 5864, 5306, 5004, 4777, 4393, 4119, 3942, + 0 + }, + { + 16384, 2151, 1301, 1276, 1274, 315, 84, 70, 68, 32, 14, 11, 10, 7, 4, 3, 2, + 0 + }, + { + 16384, 16383,16382,13774,13091,13090,13089,11287,10713, 7917, 6052, 5265, 4947, 4161, 3534, 3199, 3039, + 0 + }, + { + 16384, 14374,12331,11688,11474, 9505, 6993, 5998, 5634, 4991, 4008, 3498, 3265, 3036, 2658, 2417, 2285, + 0 + }, + { + 16384, 8798, 5867, 5626, 5593, 2841, 1038, 807, 765, 538, 302, 234, 215, 182, 139, 119, 111, + 0 + }, + { + 16384, 13325,10612,10015, 9860, 7343, 4583, 3802, 3571, 3023, 2269, 1945, 1817, 1670, 1440, 1309, 1243, + 0 + }, + { + 16384, 7741, 5790, 5571, 5528, 3110, 1698, 1464, 1409, 1034, 704, 613, 585, 487, 381, 342, 327, + 0 + }, + { + 16384, 9664, 7506, 7059, 6917, 4820, 3136, 2640, 2455, 2000, 1504, 1297, 1217, 1073, 896, 815, 777, + 0 + } +}; + +const Word16 NumRatioBits[2][17] = +{ + /* NB */ + { + 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 + }, + + /* WB */ + { + 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2 + } +}; // Q0 + +/* 7Q8 */ +const Word16 Ratios_WB_2_fx[32] = +/* 2 */{ 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 6144, 6656, 7168, 7680, 8192, 8704, 9216, 9728, 10240, 15360, 16384, 18432 }; +const Word16 Ratios_WB_3_fx[32] =/* 7Q8 */ +/* 3 */{ 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3584, 4096, 4608, 5120, 5632, 6144, 6656, 7168, 7680, 8192, 8704, 9216, 9728, 10240, 11264, 12288, 13824, 15360, 17408, 19968, 20480 }; +const Word16 Ratios_WB_4_fx[32] =/* 7Q8 */ +/* 4 */{ 384, 512, 640, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3584, 4096, 4608, 5120, 5632, 6144, 6656, 7168, 7680, 8192, 8704, 9216, 9728, 10240, 10752, 11264, 12288, 13312, 13824, 17408 }; +const Word16 Ratios_WB_5_fx[32] =/* 7Q8 */ +/* 5 */{ 256, 384, 512, 640, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4608, 5120, 5632, 6144, 6656, 7168, 7680, 8192, 8704, 9216, 10240, 11264, 12288, 13824 }; +const Word16 Ratios_WB_6_fx[32] =/* 7Q8 */ +/* 6 */{ 256, 384, 512, 640, 768, 896, 1024, 1152, 1280, 1408, 1536, 1664, 1792, 1920, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4608, 5120, 5632, 6144, 6656, 7168, 8704, 10240, 10496 }; +const Word16 Ratios_WB_7_fx[32] =/* 7Q8 */ +/* 7 */{ 256, 384, 512, 640, 768, 896, 1024, 1152, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5760, 6144, 6400, 6912, 7168, 7680, 8960 }; +const Word16 Ratios_WB_8_fx[16] =/* 7Q8 */ +/* 8 */{ 128, 256, 384, 512, 640, 768, 896, 1024, 1152, 1280, 1408, 1536, 1792, 2048, 2304, 2560 }; +const Word16 Ratios_WB_9_fx[16] =/* 7Q8 */ +/* 9 */{ 256, 512, 640, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3840, 4096, 4608, 6912 }; +const Word16 Ratios_WB_10_fx[16] =/* 7Q8 */ +/* 10 */{ 256, 384, 512, 640, 768, 896, 1024, 1280, 1536, 2048, 2560, 3840, 4608, 5632, 6144, 6656 }; +const Word16 Ratios_WB_11_fx[16] =/* 7Q8 */ +/* 11 */{ 256, 384, 512, 640, 768, 896, 1024, 1280, 1536, 2048, 2560, 3072, 3328, 3584, 4608, 5376 }; +const Word16 Ratios_WB_12_fx[16] =/* 7Q8 */ +/* 12 */{ 128, 256, 384, 512, 640, 768, 1024, 1280, 1536, 2048, 2304, 2816, 3072, 3456, 4096, 5120 }; +const Word16 Ratios_WB_13_fx[16] =/* 7Q8 */ +/* 13 */{ 128, 256, 384, 512, 640, 768, 1024, 1280, 1536, 1792, 2048, 2560, 2816, 3072, 3584, 5120 }; +const Word16 Ratios_WB_14_fx[16] =/* 7Q8 */ +/* 14 */{ 128, 256, 384, 512, 640, 768, 1024, 1152, 1536, 1920, 2304, 2560, 3072, 3584, 3840, 4608 }; +const Word16 Ratios_WB_15_fx[16] =/* 7Q8 */ +/* 15 */{ 128, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1152, 1280, 1536, 2048, 2304, 3584 }; +const Word16 Ratios_WB_16_fx[4] =/* 7Q8 */ +/* 16 */{ 128, 256, 512, 1024 }; +const Word16 Ratios_WB_17_fx[4] =/* 7Q8 */ +/* 17 */{ 256, 384, 512, 1024 }; +const Word16 Ratios_WB_18_fx[4] =/* 7Q8 */ +/* 18 */{ 256, 512, 768, 1024 }; + +/******************************************************************************/ + +/* 7Q8 */ +const Word16 Ratios_NB_2_fx[32] = +/* 2 */{ 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 5888, 6144, 6400, 6656, 6912, 7168, 7680, 8192, 8704, 9216, 9728, 10240 }; +const Word16 Ratios_NB_3_fx[16] =/* 7Q8 */ +/* 3 */{ 128, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 4096, 5120, 6144, 7680 }; +const Word16 Ratios_NB_4_fx[16] =/* 7Q8 */ +/* 4 */{ 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3584, 4096, 4608, 5120, 6144, 7680 }; +const Word16 Ratios_NB_5_fx[16] =/* 7Q8 */ +/* 5 */{ 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3584, 4096, 4608, 5120, 6144, 7680 }; +const Word16 Ratios_NB_6_fx[16] =/* 7Q8 */ +/* 6 */{ 512, 640, 768, 896, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3584, 4096, 4608, 5120 }; +const Word16 Ratios_NB_7_fx[16] =/* 7Q8 */ +/* 7 */{ 256, 512, 640, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3584, 4096, 4608, 5120 }; +const Word16 Ratios_NB_8_fx[16] =/* 7Q8 */ +/* 8 */{ 256, 384, 512, 640, 768, 896, 1024, 1152, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 4096 }; +const Word16 Ratios_NB_9_fx[8] =/* 7Q8 */ +/* 9 */{ 256, 512, 768, 1024, 1280, 1536, 2048, 2560 }; +const Word16 Ratios_NB_10_fx[8] =/* 7Q8 */ +/* 10 */{ 256, 512, 768, 1024, 1280, 1536, 2048, 2560 }; +const Word16 Ratios_NB_11_fx[8] =/* 7Q8 */ +/* 11 */{ 256, 384, 512, 768, 1024, 1280, 1536, 2048 }; +const Word16 Ratios_NB_12_fx[8] =/* 7Q8 */ +/* 12 */{ 256, 512, 640, 768, 1024, 1280, 1536, 2048 }; +const Word16 Ratios_NB_13_fx[4] =/* 7Q8 */ +/* 13 */{ 256, 512, 768, 1024 }; +const Word16 Ratios_NB_14_fx[4] =/* 7Q8 */ +/* 14 */{ 256, 512, 1024, 1536 }; +const Word16 Ratios_NB_15_fx[4] =/* 7Q8 */ +/* 15 */{ 256, 512, 768, 1024 }; +const Word16 Ratios_NB_16_fx[4] =/* 7Q8 */ +/* 16 */{ 256, 384, 512, 1024 }; +const Word16 Ratios_NB_17_fx[4] =/* 7Q8 */ +/* 17 */{ 256, 384, 512, 768 }; +const Word16 Ratios_NB_18_fx[4] =/* 7Q8 */ +/* 18 */{ 128, 256, 512, 768 }; + +/******************************************************************************/ + +const Word16 *const Ratios_fx[2][17] =/* 7Q8 */ +{ + /* NB */ + { + Ratios_NB_2_fx, + Ratios_NB_3_fx, + Ratios_NB_4_fx, + Ratios_NB_5_fx, + Ratios_NB_6_fx, + Ratios_NB_7_fx, + Ratios_NB_8_fx, + Ratios_NB_9_fx, + Ratios_NB_10_fx, + Ratios_NB_11_fx, + Ratios_NB_12_fx, + Ratios_NB_13_fx, + Ratios_NB_14_fx, + Ratios_NB_15_fx + , Ratios_NB_16_fx + , Ratios_NB_17_fx + , Ratios_NB_18_fx + }, + + /* WB */ + { + Ratios_WB_2_fx, + Ratios_WB_3_fx, + Ratios_WB_4_fx, + Ratios_WB_5_fx, + Ratios_WB_6_fx, + Ratios_WB_7_fx, + Ratios_WB_8_fx, + Ratios_WB_9_fx, + Ratios_WB_10_fx, + Ratios_WB_11_fx, + Ratios_WB_12_fx, + Ratios_WB_13_fx, + Ratios_WB_14_fx, + Ratios_WB_15_fx + , Ratios_WB_16_fx + , Ratios_WB_17_fx + , Ratios_WB_18_fx + } +}; +#define QGC(x) FL2WORD16_SCALE(x, 4) +const Word16 qGains[2][1 << kTcxHmNumGainBits] = +{ + /* GC */ { QGC(0.75f) }, + /* VC */ { QGC(0.6f), QGC(1.4f), QGC(4.5f), QGC(10.0f) } +}; + + +/*----------------------------------------------------------------------------------* + * TNS + *----------------------------------------------------------------------------------*/ + +const struct TnsParameters tnsParametersIGF32kHz_LowBR[1] = +{ + { 600, 3, /*1.85f, 0.075f, 4.4f,*/ 237/*1.85f Q7*/, 15518925/*1.85f Q23*/, 2458/*0.075f Q15*/,563 /*4.4f Q7*/ } +}; + +const struct TnsParameters tnsParameters32kHz[2] = +{ + { 4500, 3, /*1.35f, 0.0300f, 1.0f ,*/ 173/*1.35f Q7*/,11324621/*1.35f Q23*/, 983/*0.0300f Q15*/, 128/*1.0f Q7*/}, + { 600, 1, /*1.75f, 0.0625f, 4.4f ,*/ 224/*1.75f Q7*/,14680064/*1.75f Q23*/, 2048/*0.0625f Q15*/, 563 /*4.4f Q7*/ } +}; + +const struct TnsParameters tnsParameters32kHz_grouped[2] = +{ + { 8400, 3, /*1.375f, 0.03125f, 1.0f ,*/ 176/*1.375f Q7*/,11534336/*1.375f Q23*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/ }, + { 800, 3, /*1.375f, 0.03125f, 1.0f ,*/ 176/*1.375f Q7*/,11534336/*1.375f Q23*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/} +}; + +const struct TnsParameters tnsParameters16kHz[1] = +{ + { 600, 3, /*1.5f, 0.05f, 4.4f,*/ 192/*1.5f Q7*/, 12582912/*1.5f Q23*/, 1638/*0.05f Q15*/ ,563 /*4.4f Q7*/ } +}; + +const struct TnsParameters tnsParameters16kHz_grouped[2] = +{ + { 4400, 3, /*1.5f, 0.05f, 1.0f,*/ 192/*1.5f Q7*/, 12582912/*1.5f Q23*/, 1638/*0.05f Q15*/ , 128/*1.0f Q7*/}, + { 800, 3, /*1.5f, 0.05f, 1.0f,*/ 192/*1.5f Q7*/, 12582912/*1.5f Q23*/, 1638/*0.05f Q15*/ , 128/*1.0f Q7*/} +}; + +const struct TnsParameters tnsParameters48kHz_grouped[2] = +{ + { 10400, 3, /*1.375f, 0.03125f, 1.0f,*/ 176/*1.375f Q7*/,11534336/*1.375f Q23*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/}, + { 800, 3, /*1.375f, 0.03125f, 1.0f,*/ 176/*1.375f Q7*/,11534336/*1.375f Q23*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/ } +}; + +const struct TnsParameters tnsParameters32kHz_Stereo[2]= +{ + { 4500, 3, /*1.35f, 0.0300f, 1.0f ,*/ 173/*1.35f Q7*/, 11324621/*1.35f Q23*/, 983/*0.0300f Q15*/ , 128/*1.0f Q7*/}, + { 600, 3, /*1.75f, 0.0625f, 4.4f ,*/ 224/*1.75f Q7*/,14680064/*1.75f Q23*/, 2048/*0.0625f Q15*/ ,563 /*4.4f Q7*/ } +}; + +const Word16 tnsAcfWindow_fx[TNS_MAX_FILTER_ORDER] = +{ + 32696/*0.997803f Q15*/, 32480/*0.991211f Q15*/, 32120/*0.980225f Q15*/, 31616/*0.964844f Q15*/, 30968/*0.945068f Q15*/, 30176/*0.920898f Q15*/, 29240/*0.892334f Q15*/, 28160/*0.859375f Q15*/ +}; + + +/* Definition of the mapping between TNS parameters and a bitstream */ +/* Helper structures for hufmann table coding */ + +const Coding codesTnsCoeff0TCX20[] = +{ + { -8+INDEX_SHIFT, 609, 11 }, /* 01001100001 */ + { -7+INDEX_SHIFT, 305, 10 }, /* 0100110001 */ + { -6+INDEX_SHIFT, 77, 8 }, /* 01001101 */ + { -5+INDEX_SHIFT, 39, 7 }, /* 0100111 */ + { -4+INDEX_SHIFT, 8, 5 }, /* 01000 */ + { -3+INDEX_SHIFT, 21, 5 }, /* 10101 */ + { -2+INDEX_SHIFT, 11, 4 }, /* 1011 */ + { -1+INDEX_SHIFT, 3, 3 }, /* 011 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 0, 2 }, /* 00 */ + { 2+INDEX_SHIFT, 4, 3 }, /* 100 */ + { 3+INDEX_SHIFT, 5, 4 }, /* 0101 */ + { 4+INDEX_SHIFT, 20, 5 }, /* 10100 */ + { 5+INDEX_SHIFT, 18, 6 }, /* 010010 */ + { 6+INDEX_SHIFT, 153, 9 }, /* 010011001 */ + { 7+INDEX_SHIFT, 608, 11 } /* 01001100000 */ +}; + +const Coding codesTnsCoeff0TCX10[] = +{ + { -8+INDEX_SHIFT, 441, 9 }, /* 110111001 */ + { -7+INDEX_SHIFT, 111, 7 }, /* 1101111 */ + { -6+INDEX_SHIFT, 8, 4 }, /* 1000 */ + { -5+INDEX_SHIFT, 9, 4 }, /* 1001 */ + { -4+INDEX_SHIFT, 14, 4 }, /* 1110 */ + { -3+INDEX_SHIFT, 15, 4 }, /* 1111 */ + { -2+INDEX_SHIFT, 3, 3 }, /* 011 */ + { -1+INDEX_SHIFT, 5, 3 }, /* 101 */ + { 0+INDEX_SHIFT, 0, 2 }, /* 00 */ + { 1+INDEX_SHIFT, 2, 3 }, /* 010 */ + { 2+INDEX_SHIFT, 12, 4 }, /* 1100 */ + { 3+INDEX_SHIFT, 26, 5 }, /* 11010 */ + { 4+INDEX_SHIFT, 54, 6 }, /* 110110 */ + { 5+INDEX_SHIFT, 221, 8 }, /* 11011101 */ + { 6+INDEX_SHIFT, 881, 10 }, /* 1101110001 */ + { 7+INDEX_SHIFT, 880, 10 } /* 1101110000 */ +}; + +const Coding codesTnsCoeff1TCX20[] = +{ + { -8+INDEX_SHIFT, 30018, 15 }, /* 111010101000010 */ + { -7+INDEX_SHIFT, 30019, 15 }, /* 111010101000011 */ + { -6+INDEX_SHIFT, 7505, 13 }, /* 1110101010001 */ + { -5+INDEX_SHIFT, 3753, 12 }, /* 111010101001 */ + { -4+INDEX_SHIFT, 939, 10 }, /* 1110101011 */ + { -3+INDEX_SHIFT, 235, 8 }, /* 11101011 */ + { -2+INDEX_SHIFT, 28, 5 }, /* 11100 */ + { -1+INDEX_SHIFT, 6, 3 }, /* 110 */ + { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ + { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 2+INDEX_SHIFT, 15, 4 }, /* 1111 */ + { 3+INDEX_SHIFT, 59, 6 }, /* 111011 */ + { 4+INDEX_SHIFT, 116, 7 }, /* 1110100 */ + { 5+INDEX_SHIFT, 468, 9 }, /* 111010100 */ + { 6+INDEX_SHIFT, 1877, 11 }, /* 11101010101 */ + { 7+INDEX_SHIFT, 15008, 14 } /* 11101010100000 */ +}; + +const Coding codesTnsCoeff1TCX10[] = +{ + { -8+INDEX_SHIFT, 2818, 12 }, /* 101100000010 */ + { -7+INDEX_SHIFT, 2819, 12 }, /* 101100000011 */ + { -6+INDEX_SHIFT, 705, 10 }, /* 1011000001 */ + { -5+INDEX_SHIFT, 353, 9 }, /* 101100001 */ + { -4+INDEX_SHIFT, 177, 8 }, /* 10110001 */ + { -3+INDEX_SHIFT, 45, 6 }, /* 101101 */ + { -2+INDEX_SHIFT, 10, 4 }, /* 1010 */ + { -1+INDEX_SHIFT, 3, 3 }, /* 011 */ + { 0+INDEX_SHIFT, 6, 3 }, /* 110 */ + { 1+INDEX_SHIFT, 0, 2 }, /* 00 */ + { 2+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 3+INDEX_SHIFT, 4, 3 }, /* 100 */ + { 4+INDEX_SHIFT, 2, 3 }, /* 010 */ + { 5+INDEX_SHIFT, 23, 5 }, /* 10111 */ + { 6+INDEX_SHIFT, 89, 7 }, /* 1011001 */ + { 7+INDEX_SHIFT, 1408, 11 } /* 10110000000 */ +}; + +const Coding codesTnsCoeff2TCX20[] = +{ + { -8+INDEX_SHIFT, 13312, 14 }, /* 11010000000000 */ + { -7+INDEX_SHIFT, 13313, 14 }, /* 11010000000001 */ + { -6+INDEX_SHIFT, 3329, 12 }, /* 110100000001 */ + { -5+INDEX_SHIFT, 833, 10 }, /* 1101000001 */ + { -4+INDEX_SHIFT, 209, 8 }, /* 11010001 */ + { -3+INDEX_SHIFT, 53, 6 }, /* 110101 */ + { -2+INDEX_SHIFT, 12, 4 }, /* 1100 */ + { -1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ + { 1+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 2+INDEX_SHIFT, 27, 5 }, /* 11011 */ + { 3+INDEX_SHIFT, 105, 7 }, /* 1101001 */ + { 4+INDEX_SHIFT, 417, 9 }, /* 110100001 */ + { 5+INDEX_SHIFT, 1665, 11 }, /* 11010000001 */ + { 6+INDEX_SHIFT, 13314, 14 }, /* 11010000000010 */ + { 7+INDEX_SHIFT, 13315, 14 } /* 11010000000011 */ +}; + +const Coding codesTnsCoeff2TCX10[] = +{ + { -8+INDEX_SHIFT, 512, 12 }, /* 001000000000 */ + { -7+INDEX_SHIFT, 513, 12 }, /* 001000000001 */ + { -6+INDEX_SHIFT, 65, 9 }, /* 001000001 */ + { -5+INDEX_SHIFT, 17, 7 }, /* 0010001 */ + { -4+INDEX_SHIFT, 5, 5 }, /* 00101 */ + { -3+INDEX_SHIFT, 0, 3 }, /* 000 */ + { -2+INDEX_SHIFT, 6, 3 }, /* 110 */ + { -1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 0+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 1+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 2+INDEX_SHIFT, 3, 4 }, /* 0011 */ + { 3+INDEX_SHIFT, 9, 6 }, /* 001001 */ + { 4+INDEX_SHIFT, 33, 8 }, /* 00100001 */ + { 5+INDEX_SHIFT, 129, 10 }, /* 0010000001 */ + { 6+INDEX_SHIFT, 514, 12 }, /* 001000000010 */ + { 7+INDEX_SHIFT, 515, 12 } /* 001000000011 */ +}; + +const Coding codesTnsCoeff3TCX20[] = +{ + { -8+INDEX_SHIFT, 13318, 14 }, /* 11010000000110 */ + { -7+INDEX_SHIFT, 13319, 14 }, /* 11010000000111 */ + { -6+INDEX_SHIFT, 6656, 13 }, /* 1101000000000 */ + { -5+INDEX_SHIFT, 1665, 11 }, /* 11010000001 */ + { -4+INDEX_SHIFT, 417, 9 }, /* 110100001 */ + { -3+INDEX_SHIFT, 105, 7 }, /* 1101001 */ + { -2+INDEX_SHIFT, 27, 5 }, /* 11011 */ + { -1+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ + { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 2+INDEX_SHIFT, 12, 4 }, /* 1100 */ + { 3+INDEX_SHIFT, 53, 6 }, /* 110101 */ + { 4+INDEX_SHIFT, 209, 8 }, /* 11010001 */ + { 5+INDEX_SHIFT, 833, 10 }, /* 1101000001 */ + { 6+INDEX_SHIFT, 6657, 13 }, /* 1101000000001 */ + { 7+INDEX_SHIFT, 6658, 13 } /* 1101000000010 */ +}; + +const Coding codesTnsCoeff3TCX10[] = +{ + { -8+INDEX_SHIFT, 1284, 12 }, /* 010100000100 */ + { -7+INDEX_SHIFT, 1285, 12 }, /* 010100000101 */ + { -6+INDEX_SHIFT, 1286, 12 }, /* 010100000110 */ + { -5+INDEX_SHIFT, 1287, 12 }, /* 010100000111 */ + { -4+INDEX_SHIFT, 161, 9 }, /* 010100001 */ + { -3+INDEX_SHIFT, 41, 7 }, /* 0101001 */ + { -2+INDEX_SHIFT, 11, 5 }, /* 01011 */ + { -1+INDEX_SHIFT, 0, 2 }, /* 00 */ + { 0+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 1+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 2+INDEX_SHIFT, 3, 3 }, /* 011 */ + { 3+INDEX_SHIFT, 4, 4 }, /* 0100 */ + { 4+INDEX_SHIFT, 21, 6 }, /* 010101 */ + { 5+INDEX_SHIFT, 81, 8 }, /* 01010001 */ + { 6+INDEX_SHIFT, 640, 11 }, /* 01010000000 */ + { 7+INDEX_SHIFT, 641, 11 } /* 01010000001 */ +}; + +const Coding codesTnsCoeff4TCX20[] = +{ + { -8+INDEX_SHIFT, 13318, 14 }, /* 11010000000110 */ + { -7+INDEX_SHIFT, 13319, 14 }, /* 11010000000111 */ + { -6+INDEX_SHIFT, 6656, 13 }, /* 1101000000000 */ + { -5+INDEX_SHIFT, 833, 10 }, /* 1101000001 */ + { -4+INDEX_SHIFT, 209, 8 }, /* 11010001 */ + { -3+INDEX_SHIFT, 53, 6 }, /* 110101 */ + { -2+INDEX_SHIFT, 12, 4 }, /* 1100 */ + { -1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ + { 1+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 2+INDEX_SHIFT, 27, 5 }, /* 11011 */ + { 3+INDEX_SHIFT, 105, 7 }, /* 1101001 */ + { 4+INDEX_SHIFT, 417, 9 }, /* 110100001 */ + { 5+INDEX_SHIFT, 1665, 11 }, /* 11010000001 */ + { 6+INDEX_SHIFT, 6657, 13 }, /* 1101000000001 */ + { 7+INDEX_SHIFT, 6658, 13 } /* 1101000000010 */ +}; + +const Coding codesTnsCoeff4TCX10[] = +{ + { -8+INDEX_SHIFT, 20, 12 }, /* 000000010100 */ + { -7+INDEX_SHIFT, 21, 12 }, /* 000000010101 */ + { -6+INDEX_SHIFT, 22, 12 }, /* 000000010110 */ + { -5+INDEX_SHIFT, 3, 9 }, /* 000000011 */ + { -4+INDEX_SHIFT, 1, 7 }, /* 0000001 */ + { -3+INDEX_SHIFT, 1, 5 }, /* 00001 */ + { -2+INDEX_SHIFT, 1, 3 }, /* 001 */ + { -1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 2+INDEX_SHIFT, 1, 4 }, /* 0001 */ + { 3+INDEX_SHIFT, 1, 6 }, /* 000001 */ + { 4+INDEX_SHIFT, 0, 8 }, /* 00000000 */ + { 5+INDEX_SHIFT, 23, 12 }, /* 000000010111 */ + { 6+INDEX_SHIFT, 8, 11 }, /* 00000001000 */ + { 7+INDEX_SHIFT, 9, 11 } /* 00000001001 */ +}; + +const Coding codesTnsCoeff5[] = +{ + { -8+INDEX_SHIFT, 6788, 13 }, /* 1101010000100 */ + { -7+INDEX_SHIFT, 6789, 13 }, /* 1101010000101 */ + { -6+INDEX_SHIFT, 6790, 13 }, /* 1101010000110 */ + { -5+INDEX_SHIFT, 849, 10 }, /* 1101010001 */ + { -4+INDEX_SHIFT, 213, 8 }, /* 11010101 */ + { -3+INDEX_SHIFT, 107, 7 }, /* 1101011 */ + { -2+INDEX_SHIFT, 27, 5 }, /* 11011 */ + { -1+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 0+INDEX_SHIFT, 0, 1 }, /* 0 */ + { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 2+INDEX_SHIFT, 12, 4 }, /* 1100 */ + { 3+INDEX_SHIFT, 52, 6 }, /* 110100 */ + { 4+INDEX_SHIFT, 425, 9 }, /* 110101001 */ + { 5+INDEX_SHIFT, 6791, 13 }, /* 1101010000111 */ + { 6+INDEX_SHIFT, 3392, 12 }, /* 110101000000 */ + { 7+INDEX_SHIFT, 3393, 12 } /* 110101000001 */ +}; + +const Coding codesTnsCoeff6[] = +{ + { -8+INDEX_SHIFT, 4, 12 }, /* 000000000100 */ + { -7+INDEX_SHIFT, 5, 12 }, /* 000000000101 */ + { -6+INDEX_SHIFT, 6, 12 }, /* 000000000110 */ + { -5+INDEX_SHIFT, 1, 9 }, /* 000000001 */ + { -4+INDEX_SHIFT, 1, 7 }, /* 0000001 */ + { -3+INDEX_SHIFT, 1, 5 }, /* 00001 */ + { -2+INDEX_SHIFT, 1, 3 }, /* 001 */ + { -1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 2+INDEX_SHIFT, 1, 4 }, /* 0001 */ + { 3+INDEX_SHIFT, 1, 6 }, /* 000001 */ + { 4+INDEX_SHIFT, 1, 8 }, /* 00000001 */ + { 5+INDEX_SHIFT, 7, 12 }, /* 000000000111 */ + { 6+INDEX_SHIFT, 0, 11 }, /* 00000000000 */ + { 7+INDEX_SHIFT, 1, 11 } /* 00000000001 */ +}; + +const Coding codesTnsCoeff7[] = +{ + { -8+INDEX_SHIFT, 14, 11 }, /* 00000001110 */ + { -7+INDEX_SHIFT, 15, 11 }, /* 00000001111 */ + { -6+INDEX_SHIFT, 0, 10 }, /* 0000000000 */ + { -5+INDEX_SHIFT, 1, 10 }, /* 0000000001 */ + { -4+INDEX_SHIFT, 1, 7 }, /* 0000001 */ + { -3+INDEX_SHIFT, 1, 5 }, /* 00001 */ + { -2+INDEX_SHIFT, 1, 4 }, /* 0001 */ + { -1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 0+INDEX_SHIFT, 2, 10 }, /* 0000000010 */ + { 1+INDEX_SHIFT, 1, 1 }, /* 1 */ + { 2+INDEX_SHIFT, 1, 3 }, /* 001 */ + { 3+INDEX_SHIFT, 1, 6 }, /* 000001 */ + { 4+INDEX_SHIFT, 3, 10 }, /* 0000000011 */ + { 5+INDEX_SHIFT, 4, 10 }, /* 0000000100 */ + { 6+INDEX_SHIFT, 5, 10 }, /* 0000000101 */ + { 7+INDEX_SHIFT, 6, 10 } /* 0000000110 */ +}; + +const Coding codesTnsCoeff456[] = +{ + { -8+INDEX_SHIFT, 516, 12 }, /* 001000000100 */ + { -7+INDEX_SHIFT, 517, 12 }, /* 001000000101 */ + { -6+INDEX_SHIFT, 518, 12 }, /* 001000000110 */ + { -5+INDEX_SHIFT, 65, 9 }, /* 001000001 */ + { -4+INDEX_SHIFT, 17, 7 }, /* 0010001 */ + { -3+INDEX_SHIFT, 5, 5 }, /* 00101 */ + { -2+INDEX_SHIFT, 3, 4 }, /* 0011 */ + { -1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 2+INDEX_SHIFT, 0, 3 }, /* 000 */ + { 3+INDEX_SHIFT, 9, 6 }, /* 001001 */ + { 4+INDEX_SHIFT, 33, 8 }, /* 00100001 */ + { 5+INDEX_SHIFT, 519, 12 }, /* 001000000111 */ + { 6+INDEX_SHIFT, 256, 11 }, /* 00100000000 */ + { 7+INDEX_SHIFT, 257, 11 } /* 00100000001 */ +}; + +const Coding codesTnsCoeff0WBTCX20[] = +{ + { -8+INDEX_SHIFT, 225, 10 }, /* 0011100001 */ + { -7+INDEX_SHIFT, 113, 9 }, /* 001110001 */ + { -6+INDEX_SHIFT, 29, 7 }, /* 0011101 */ + { -5+INDEX_SHIFT, 15, 6 }, /* 001111 */ + { -4+INDEX_SHIFT, 2, 4 }, /* 0010 */ + { -3+INDEX_SHIFT, 0, 3 }, /* 000 */ + { -2+INDEX_SHIFT, 13, 4 }, /* 1101 */ + { -1+INDEX_SHIFT, 2, 3 }, /* 010 */ + { 0+INDEX_SHIFT, 5, 3 }, /* 101 */ + { 1+INDEX_SHIFT, 3, 3 }, /* 011 */ + { 2+INDEX_SHIFT, 4, 3 }, /* 100 */ + { 3+INDEX_SHIFT, 7, 3 }, /* 111 */ + { 4+INDEX_SHIFT, 12, 4 }, /* 1100 */ + { 5+INDEX_SHIFT, 6, 5 }, /* 00110 */ + { 6+INDEX_SHIFT, 57, 8 }, /* 00111001 */ + { 7+INDEX_SHIFT, 224, 10 } /* 0011100000 */ +}; + + +const Coding codesTnsCoeff1WBTCX20[] = +{ + { -8+INDEX_SHIFT, 512, 12 }, /* 001000000000 */ + { -7+INDEX_SHIFT, 513, 12 }, /* 001000000001 */ + { -6+INDEX_SHIFT, 514, 12 }, /* 001000000010 */ + { -5+INDEX_SHIFT, 65, 9 }, /* 001000001 */ + { -4+INDEX_SHIFT, 17, 7 }, /* 0010001 */ + { -3+INDEX_SHIFT, 5, 5 }, /* 00101 */ + { -2+INDEX_SHIFT, 0, 3 }, /* 000 */ + { -1+INDEX_SHIFT, 2, 3 }, /* 010 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 2, 2 }, /* 10 */ + { 2+INDEX_SHIFT, 3, 3 }, /* 011 */ + { 3+INDEX_SHIFT, 3, 4 }, /* 0011 */ + { 4+INDEX_SHIFT, 9, 6 }, /* 001001 */ + { 5+INDEX_SHIFT, 33, 8 }, /* 00100001 */ + { 6+INDEX_SHIFT, 129, 10 }, /* 0010000001 */ + { 7+INDEX_SHIFT, 515, 12 } /* 001000000011 */ +}; + + +const Coding codesTnsCoeff2WB[] = +{ + { -8+INDEX_SHIFT, 5632, 13 }, /* 1011000000000 */ + { -7+INDEX_SHIFT, 5633, 13 }, /* 1011000000001 */ + { -6+INDEX_SHIFT, 1409, 11 }, /* 10110000001 */ + { -5+INDEX_SHIFT, 353, 9 }, /* 101100001 */ + { -4+INDEX_SHIFT, 89, 7 }, /* 1011001 */ + { -3+INDEX_SHIFT, 23, 5 }, /* 10111 */ + { -2+INDEX_SHIFT, 4, 3 }, /* 100 */ + { -1+INDEX_SHIFT, 0, 2 }, /* 00 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 2+INDEX_SHIFT, 10, 4 }, /* 1010 */ + { 3+INDEX_SHIFT, 45, 6 }, /* 101101 */ + { 4+INDEX_SHIFT, 177, 8 }, /* 10110001 */ + { 5+INDEX_SHIFT, 705, 10 }, /* 1011000001 */ + { 6+INDEX_SHIFT, 5634, 13 }, /* 1011000000010 */ + { 7+INDEX_SHIFT, 5635, 13 } /* 1011000000011 */ +}; + +const Coding codesTnsCoeff3WB[] = +{ + { -8+INDEX_SHIFT, 5638, 13 }, /* 1011000000110 */ + { -7+INDEX_SHIFT, 5639, 13 }, /* 1011000000111 */ + { -6+INDEX_SHIFT, 2816, 12 }, /* 101100000000 */ + { -5+INDEX_SHIFT, 353, 9 }, /* 101100001 */ + { -4+INDEX_SHIFT, 177, 8 }, /* 10110001 */ + { -3+INDEX_SHIFT, 45, 6 }, /* 101101 */ + { -2+INDEX_SHIFT, 10, 4 }, /* 1010 */ + { -1+INDEX_SHIFT, 0, 2 }, /* 00 */ + { 0+INDEX_SHIFT, 3, 2 }, /* 11 */ + { 1+INDEX_SHIFT, 1, 2 }, /* 01 */ + { 2+INDEX_SHIFT, 4, 3 }, /* 100 */ + { 3+INDEX_SHIFT, 23, 5 }, /* 10111 */ + { 4+INDEX_SHIFT, 89, 7 }, /* 1011001 */ + { 5+INDEX_SHIFT, 705, 10 }, /* 1011000001 */ + { 6+INDEX_SHIFT, 2817, 12 }, /* 101100000001 */ + { 7+INDEX_SHIFT, 2818, 12 } /* 101100000010 */ +}; + +const Word16 nTnsCoeffCodes = sizeof(codesTnsCoeff0TCX20)/sizeof(codesTnsCoeff0TCX20[0]); + +const Coding * const codesTnsCoeffSWBTCX20[] = { codesTnsCoeff0TCX20, codesTnsCoeff1TCX20, codesTnsCoeff2TCX20, codesTnsCoeff3TCX20, codesTnsCoeff4TCX20, codesTnsCoeff5, codesTnsCoeff6, codesTnsCoeff7 }; +const Coding * const codesTnsCoeffSWBTCX10[] = { codesTnsCoeff0TCX10, codesTnsCoeff1TCX10, codesTnsCoeff2TCX10, codesTnsCoeff3TCX10, codesTnsCoeff4TCX10, codesTnsCoeff5, codesTnsCoeff6, codesTnsCoeff7 }; +const Coding * const codesTnsCoeffWBTCX20[] = { codesTnsCoeff0WBTCX20, codesTnsCoeff1WBTCX20, codesTnsCoeff2WB, codesTnsCoeff3WB, codesTnsCoeff456, codesTnsCoeff456, codesTnsCoeff456, codesTnsCoeff7 }; + +const Word16 nTnsCoeffTables = sizeof(codesTnsCoeffSWBTCX20)/sizeof(codesTnsCoeffSWBTCX20[0]); // Q0 + +const Coding codesTnsOrderTCX20[] = +{ + { 1, 0, 2 }, /* 00 */ + { 2, 40, 6 }, /* 101000 */ + { 3, 41, 6 }, /* 101001 */ + { 4, 21, 5 }, /* 10101 */ + { 5, 11, 4 }, /* 1011 */ + { 6, 4, 3 }, /* 100 */ + { 7, 1, 2 }, /* 01 */ + { 8, 3, 2 } /* 11 */ +}; +const Coding codesTnsOrderTCX10[] = +{ + { 1, 0, 3 }, /* 000 */ + { 2, 16, 5 }, /* 10000 */ + { 3, 17, 5 }, /* 10001 */ + { 4, 9, 4 }, /* 1001 */ + { 5, 1, 3 }, /* 001 */ + { 6, 5, 3 }, /* 101 */ + { 7, 1, 2 }, /* 01 */ + { 8, 3, 2 } /* 11 */ +}; +const Coding codesTnsOrder[] = +{ + { 1, 96, 7 }, /* 1100000 */ + { 2, 97, 7 }, /* 1100001 */ + { 3, 49, 6 }, /* 110001 */ + { 4, 25, 5 }, /* 11001 */ + { 5, 13, 4 }, /* 1101 */ + { 6, 7, 3 }, /* 111 */ + { 7, 2, 2 }, /* 10 */ + { 8, 0, 1 } /* 0 */ +}; + +const Word16 nTnsOrderCodes = sizeof(codesTnsOrder)/sizeof(codesTnsOrder[0]); // Q0 + +const ParamsBitMap tnsSWBTCX20FilterCoeffBitMap = +{ + 1, + { + { 0, GetSWBTCX20TnsFilterCoeffBits, TRUE, GetTnsFilterCoeff, SetTnsFilterCoeff, EncodeSWBTCX20TnsFilterCoeff, DecodeSWBTCX20TnsFilterCoeff_flt, NULL } /* TNS filter coefficients */ + } +}; + +const ParamsBitMap tnsSWBTCX10FilterCoeffBitMap = +{ + 1, + { + { 0, GetSWBTCX10TnsFilterCoeffBits, TRUE, GetTnsFilterCoeff, SetTnsFilterCoeff, EncodeSWBTCX10TnsFilterCoeff, DecodeSWBTCX10TnsFilterCoeff_flt, NULL } /* TNS filter coefficients */ + } +}; + +const ParamsBitMap tnsSWBTCX20FilterBitMap = +{ + 1, + { + { 0, GetTnsFilterOrderBitsSWBTCX20, FALSE, GetTnsFilterOrder, SetTnsFilterOrder, EncodeTnsFilterOrderSWBTCX20, DecodeTnsFilterOrderSWBTCX20_flt, &tnsSWBTCX20FilterCoeffBitMap } /* TNS filter order */ + } +}; + +const ParamsBitMap tnsSWBTCX10FilterBitMap = +{ + 1, + { + { 0, GetTnsFilterOrderBitsSWBTCX10, FALSE, GetTnsFilterOrder, SetTnsFilterOrder, EncodeTnsFilterOrderSWBTCX10, DecodeTnsFilterOrderSWBTCX10_flt, &tnsSWBTCX10FilterCoeffBitMap } /* TNS filter order */ + } +}; + +const ParamsBitMap tnsSWBTCX20BitMap = +{ + 1, + { + { 1, NULL, FALSE, GetNumOfTnsFilters_flt, SetNumOfTnsFilters_flt, NULL, NULL, &tnsSWBTCX20FilterBitMap } /* Number of TNS filters */ + } +}; + +/* For storing/reading bits in SWB/FB mode */ +const ParamsBitMap tnsEnabledSWBTCX20BitMap = +{ + 1, + { + { 1, NULL, TRUE, GetTnsEnabled, SetTnsEnabled, NULL, NULL, &tnsSWBTCX20BitMap } /* TNS Enabled/Disable */ + } +}; + +const ParamsBitMap tnsSWBTCX10BitMap = +{ + 1, + { + { 1, NULL, FALSE, GetNumOfTnsFilters_flt, SetNumOfTnsFilters_flt, NULL, NULL, &tnsSWBTCX10FilterBitMap } /* Number of TNS filters */ + } +}; + +/* For storing/reading bits in SWB/FB mode */ +const ParamsBitMap tnsEnabledSWBTCX10BitMap = +{ + 1, + { + { 1, NULL, TRUE, GetTnsEnabled, SetTnsEnabled, NULL, NULL, &tnsSWBTCX10BitMap } /* TNS Enabled/Disable */ + } +}; + +const ParamsBitMap tnsWBTCX20FilterCoeffBitMap = +{ + 1, + { + { 0, GetWBTCX20TnsFilterCoeffBits, TRUE, GetTnsFilterCoeff, SetTnsFilterCoeff, EncodeWBTCX20TnsFilterCoeff, DecodeWBTCX20TnsFilterCoeff_flt, NULL } /* TNS filter coefficients */ + } +}; + + +const ParamsBitMap tnsWBTCX20FilterBitMap = +{ + 1, + { + { 0, GetTnsFilterOrderBits, FALSE, GetTnsFilterOrder, SetTnsFilterOrder, EncodeTnsFilterOrder, DecodeTnsFilterOrder_flt, &tnsWBTCX20FilterCoeffBitMap } /* TNS filter order */ + } +}; + + +/* For storing/reading bits in WB mode */ +const ParamsBitMap tnsEnabledWBTCX20BitMap = +{ + 1, + { + { 1, NULL, TRUE, GetTnsEnabledSingleFilter, SetTnsEnabledSingleFilter, NULL, NULL, &tnsWBTCX20FilterBitMap } /* TNS Enabled/Disable */ + } +}; + +/* For storing/reading bits in SWB/FB mode */ +const ParamsBitMap tnsOnWhiteSWBTCX20BitMap = +{ + 2, + { + { 1, NULL, TRUE, GetTnsOnWhite, SetTnsOnWhite, NULL, NULL, NULL }, /* TNS Enabled/Disable */ + { 1, NULL, FALSE, GetNumOfTnsFilters_flt, SetNumOfTnsFilters_flt, NULL, NULL, &tnsSWBTCX20FilterBitMap } + } +}; + +const ParamsBitMap tnsEnabledOnWhiteSWBTCX20BitMap = +{ + 1, + { + { 1, NULL, TRUE, GetTnsEnabled, SetTnsEnabled, NULL, NULL, &tnsOnWhiteSWBTCX20BitMap } /* TNS Enabled/Disable */ + } +}; +/* For storing/reading bits in SWB/FB mode */ +const ParamsBitMap tnsOnWhiteSWBTCX10BitMap = +{ + 2, + { + { 1, NULL, TRUE, GetTnsOnWhite, SetTnsOnWhite, NULL, NULL, NULL }, /* TNS on whitened spectra */ + { 1, NULL, FALSE, GetNumOfTnsFilters_flt, SetNumOfTnsFilters_flt, NULL, NULL, &tnsSWBTCX10FilterBitMap } + } +}; + +/* For storing/reading bits in SWB/FB mode */ +const ParamsBitMap tnsEnabledOnWhiteSWBTCX10BitMap = +{ + 1, + { + { 1, NULL, TRUE, GetTnsEnabled, SetTnsEnabled, NULL, NULL, &tnsOnWhiteSWBTCX10BitMap } /* TNS Enabled/Disable */ + } +}; + + +/** + * 4 bit resolution TNS coefficients. + */ +const Word16 tnsCoeff4[16] = +{ + -32628/*-0.99573418F Q15*/, /* = sin(-8*(PI/2.0)/(8 + 0.5)) */ + -31517/*-0.96182564F Q15*/, /* = sin(-7*(PI/2.0)/(8 + 0.5)) */ + -29333/*-0.89516329F Q15*/, + -26149/*-0.79801723F Q15*/, + -22076/*-0.67369564F Q15*/, + -17250/*-0.52643216F Q15*/, + -11837/*-0.36124167F Q15*/, + -6021/*-0.18374952F Q15*/, /* = sin(-1*(PI/2.0)/(8 + 0.5)) */ + 0/* 0.00000000F Q15*/, /* = sin(0*(PI/2.0)/(8 + 0.5)) */ + 6813/* 0.20791169F Q15*/, /* = sin(1*(PI/2.0)/(8 - 0.5)) */ + 13328/* 0.40673664F Q15*/, + 19261/* 0.58778525F Q15*/, + 24351/* 0.74314483F Q15*/, + 28378/* 0.86602540F Q15*/, + 31164/* 0.95105652F Q15*/, /* = sin(6*(PI/2.0)/(8 - 0.5)) */ + 32588/* 0.99452190F Q15*/ /* = sin(7*(PI/2.0)/(8 - 0.5)) */ +}; + + +/*----------------------------------------------------------------------------------* + * IGF settings for each bitrate + *----------------------------------------------------------------------------------*/ + +const Word16 swb_offset_LB_new[IGF_BITRATE_UNKNOWN][IGF_MAX_SFB] = // Q0 +{ + /* 0: for 9600 kbs WB */ + { + 4, 164, 186, 242, 320 + }, + /* 1: for 13200 kbs WB RF */ + { + 4, 164, 186, 242, 320 + }, + /* 2: for 9600 kbs SWB */ + { + 4, 200, 322, 444, 566 + }, + /* 3: for 13200 kbs SWB */ + { + 7, 256, 288, 328, 376, 432, 496, 566 + }, + /* 4: for 13200 kbs SWB RF */ + { + 4, 200, 322, 444, 566 + }, + /* 5: for 16400 kbs SWB */ + { + 8, 256, 288, 328, 376, 432, 496, 576, 640 + }, + /* 6: for 24400 kbs SWB */ + { + 9, 256, 284, 318, 358, 402, 450, 508, 576, 640 + }, + /* 7: for 32000 kbs SWB */ + { + 9, 256, 284, 318, 358, 402, 450, 508, 576, 640 + }, + /* 8: for 48000 kbs SWB */ + { + 4, 512, 534, 576, 640 + }, + /* 9: for 64000 kbs SWB */ + { + 4, 512, 534, 576, 640 + }, + /* 10: for 16400 kbs FB */ + { + 10, 256, 288, 328, 376, 432, 496, 576, 640, 720, 800 + }, + /* 11: for 24400 kbs FB */ + { + 11, 256, 284, 318, 358, 402, 450, 508, 576, 640, 720, 800 + }, + /* 12: for 32000 kbs FB */ + { + 11, 256, 284, 318, 358, 402, 450, 508, 576, 640, 720, 800 + }, + /* 13: for 48000 kbs FB */ + { + 5, 512, 584, 656, 728, 800 + }, + /* 14: for 64000 kbs FB */ + { + 5, 512, 584, 656, 728, 800 + }, + /* 15: for 96000 kbs FB */ + { + 3, 640, 720, 800 /* old: 640, 760, 880 */ + }, + /* 16: for 128000 kbs FB */ + { + 3, 640, 720, 800 /* old: 640, 760, 880 */ + }, + /* 17: for 13200 kbs WB (stereo) */ + { + 3, 196, 248, 320 + }, + /* 18: for 16400 kbs WB (stereo) */ + { + 3, 228, 268, 320 + }, + /* 19: for 13200 kbs SWB (stereo) */ + { + 5, 200, 264, 344, 440, 566 + }, + /* 20: for 16400 kbs SWB (stereo) */ + { + 7, 228, 264, 308, 360, 420, 488, 566 + }, + /* 21: for 24400 kbs SWB (stereo) */ + { + 8, 256, 288, 328, 376, 432, 496, 576, 640 + }, + /* 22: for 32000 kbs SWB (stereo) */ + { + 9, 256, 284, 320, 360, 404, 452, 508, 576, 640 + }, + /* 23: for 48000 kbs SWB (stereo) */ + { + 7, 360, 392, 424, 464, 508, 560, 640 + }, + /* 24: for 48000 kbs SWB (stereo TCX10) */ + { + 4, 360, 424, 508, 640 + }, + /* 25: for 64000 kbs SWB (stereo) */ + { + 8, 400, 424, 448, 476, 508, 540, 576, 640 + }, + /* 26: for 80000 kbs SWB (stereo) */ + { + 5, 464, 496, 532, 576, 640 + }, + /* 27: for 96000 kbs SWB (stereo) */ + { + 4, 512, 536, 576, 640 + }, + /* 28: for 24400 kbs FB (stereo) */ + { + 10, 256, 288, 328, 376, 432, 496, 576, 640, 720, 800 + }, + /* 29: for 32000 kbs FB (stereo) */ + { + 11, 256, 284, 320, 360, 404, 452, 508, 576, 640, 720, 800 + }, + /* 30: for 48000 kbs FB (stereo) */ + { + 9, 360, 392, 424, 464, 508, 560, 640, 720, 800 + }, + /* 31: for 48000 kbs FB (stereo TCX10) */ + { + 5, 360, 424, 508, 640, 800 + }, + /* 32: for 64000 kbs FB (stereo) */ + { + 10, 400, 424, 448, 476, 508, 540, 576, 640, 720, 800 + }, + /* 33: for 80000 kbs FB (stereo) */ + { + 7, 464, 496, 532, 576, 640, 720, 800 + }, + /* 34: for 96000 kbs FB (stereo) */ + { + 6, 512, 536, 576, 640, 720, 800 + }, + /* 35: for 128000 kbs FB (stereo) */ + { + 3, 640, 720, 800 + } +};/*Q0*/ + +const Word16 igf_tile_offset_table[IGF_BITRATE_UNKNOWN][2*IGF_MAX_TILES+1] = { // Q0 + { 2, 2, 0, 3, 0}, /* 9600 WB*/ + { 2, 2, 0, 3, 0}, /* 13200 WB RF */ + { 3, 1, 0, 2, 32, 3, 46}, /* 9600 SWB */ + { 2, 4, 0, 6, 32}, /* 13200 SWB RF */ + { 3, 1, 0, 2, 32, 3, 46}, /* 13200 SWB */ + { 3, 4, 0, 6, 48, 7, 64}, /* 16400 SWB */ + { 3, 4, 0, 7, 32, 8, 64}, /* 24400 SWB */ + { 3, 4, 0, 7, 32, 8, 64}, /* 32000 SWB */ + { 1, 3, 320}, /* 48000 SWB */ + { 1, 3, 320}, /* 64000 SWB */ + { 3, 4, 0, 7, 0, 9, 0}, /* 16400 FB */ + { 4, 4, 0, 6, 32, 9, 0, 10, 80}, /* 24400 FB */ + { 4, 4, 0, 6, 32, 9, 0, 10, 80}, /* 32000 FB */ + { 1, 4, 160}, /* 48000 FB */ + { 1, 4, 160}, /* 64000 FB */ + { 1, 2, 416}, /* 96000 FB */ + { 1, 2, 416}, /*128000 FB */ + { 2, 1, 40, 2, 92}, /* 13200 WB (stereo) */ + { 2, 1, 80, 2, 120}, /* 16400 WB (stereo) */ + { 4, 1, 0, 2, 32, 3, 46, 4, 40}, /* 13200 SWB (stereo) */ + { 6, 1, 0, 2, 36, 3, 80, 4, 132, 5, 32, 6, 100 }, /* 16400 SWB (stereo) */ + { 7, 1, 0, 2, 32, 3, 72, 4, 120, 5, 48, 6, 112, 7, 64 }, /* 24400 SWB (stereo) */ + { 8, 1, 0, 2, 28, 3, 64, 4, 104, 5, 32, 6, 80, 7, 136, 8, 64 }, /* 32000 SWB (stereo) */ + { 6, 1, 120, 2, 152, 3, 184, 4, 224, 5, 140, 6, 192}, /* 48000 SWB (stereo) */ + { 3, 1, 0, 2, 40, 3, 80 }, /* 48000 SWB (stereo TCX10) */ + { 4, 2, 80, 4, 128, 6, 144, 7, 212 }, /* 64000 SWB (stereo) */ + { 2, 2, 212, 4, 280 }, /* 80000 SWB (stereo) */ + { 1, 3, 200}, /* 96000 SWB (stereo) */ + { 9, 1, 0, 2, 32, 3, 72, 4, 120, 5, 48, 6, 112, 7, 64, 8, 0, 9, 80 }, /* 24400 FB (stereo) */ + {10, 1, 0, 2, 28, 3, 64, 4, 104, 5, 32, 6, 80, 7, 136, 8, 64, 9, 0, 10, 80 }, /* 32000 FB (stereo) */ + { 7, 1, 120, 2, 152, 3, 184, 4, 224, 5, 140, 6, 192, 8, 140}, /* 48000 FB (stereo) */ + { 4, 1, 0, 2, 40, 3, 80, 4, 140 }, /* 48000 FB (stereo TCX10) */ + { 5, 2, 80, 4, 128, 6, 144, 7, 212, 9, 160 }, /* 64000 FB (stereo) */ + { 3, 2, 212, 4, 280, 6, 200 }, /* 80000 FB (stereo) */ + { 2, 3, 200, 5, 240}, /* 96000 FB (stereo) */ + { 1, 2, 416} /*128000 FB (stereo) */ +}; + +const Word16 igf_whitening_TH_ivas_fx[][2][IGF_MAX_TILES] = +{ + /* 0: for 9600 kbs WB */ + { + /* medium */ { 2949/*0.36f Q13*/, 2949/*0.36f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 11551/*1.41f Q13*/, 11551/*1.41f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} + }, + /* 1: for 13200 kbs WB RF */ + { + /* medium */ { 2949/*0.36f Q13*/, 2949/*0.36f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 11551/*1.41f Q13*/, 11551/*1.41f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} + }, + /* 2: for 9600 kbs SWB */ + { + /* medium */ { 6881/*0.84f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 10650/*1.30f Q13*/, 10240/*1.25f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} + }, + /* 3: for 13200 kbs SWB */ + { + /* medium */ { 6881/*0.84f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 10650/*1.30f Q13*/, 10240/*1.25f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} + }, + /* 4: for 13200 kbs SWB RF */ + { + /* medium */ { 6881/*0.84f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 10650/*1.30f Q13*/, 10240/*1.25f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} + }, + /* 5: for 16400 kbs SWB */ + { + /* medium */ { 6799/*0.83f Q13*/, 7291/*0.89f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 10732/*1.31f Q13*/, 9748/*1.19f Q13*/, 9748/*1.19f Q13*/, 0/*0.f Q13*/} + }, + /* 6: for 24400 kbs SWB*/ + { + /* medium */ { 6636/*0.81f Q13*/, 6963/*0.85f Q13*/, 6963/*0.85f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 11059/*1.35f Q13*/, 10076/*1.23f Q13*/, 10076/*1.23f Q13*/, 0/*0.f Q13*/} + }, + /* 7: for 32000 kbs SWB */ + { + /* medium */ { 7455/*0.91f Q13*/, 6963/*0.85f Q13*/, 6963/*0.85f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 10977/*1.34f Q13*/, 11059/*1.35f Q13*/, 11059/*1.35f Q13*/, 0/*0.f Q13*/} + }, + /* 8: for 48000 kbs SWB */ + { + /* medium */ { 9421/*1.15f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 9748/*1.19f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} + }, + /* 9: for 64000 kbs SWB */ + { + /* medium */ { 9421/*1.15f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 9748/*1.19f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} + }, + /* 10: for 16400 kbs FB */ + { + /* medium */ { 5161/*0.63f Q13*/, 2212/*0.27f Q13*/, 2949/*0.36f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 12534/*1.53f Q13*/, 10813/*1.32f Q13*/, 5489/*0.67f Q13*/, 0/*0.f Q13*/} + }, + /* 11: for 24400 kbs FB */ + { + /* medium */ { 6390/*0.78f Q13*/, 2540/*0.31f Q13*/, 2785/*0.34f Q13*/, 2785/*0.34f Q13*/}, + /* strong */ { 12206/*1.49f Q13*/, 11305/*1.38f Q13*/, 5325/*0.65f Q13*/, 5325/*0.65f Q13*/} + }, + /* 12: for 32000 kbs FB */ + { + /* medium */ { 6390/*0.78f Q13*/, 2540/*0.31f Q13*/, 2785/*0.34f Q13*/, 2785/*0.34f Q13*/}, + /* strong */ { 12206/*1.49f Q13*/, 11305/*1.38f Q13*/, 5325/*0.65f Q13*/, 5325/*0.65f Q13*/} + }, + /* 13: for 48000 kbs FB */ + { + /* medium */ { 6554/*0.80f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 8192/*1.00f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} + }, + /* 14: for 64000 kbs FB */ + { + /* medium */ { 6554/*0.80f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 8192/*1.00f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} + }, + /* 15: for 96000 kbs FB */ + { + /* medium */ { 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 23101/*2.82f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} + }, + /* 16: for 128000 kbs FB */ + { + /* medium */ { 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 23101/*2.82f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} + }, + /* 17: for 13200 kbs WB (stereo) */ + { + /* medium */ {6554/*0.800000 Q13*/, 6144/*0.750000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/ }, + /* strong */ {12288/*1.500000 Q13*/, 11878/*1.450000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/ } + }, + /* 18: for 16400 kbs WB (stereo) */ + { + + /* medium */ {7373/*0.900000 Q13*/, 6963/*0.850000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/ }, + /* strong */ {13107/*1.600000 Q13*/, 12288/*1.500000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/ } + }, + /* 19: for 13200 kbs SWB (stereo) */ + { + /* medium */ {7291/*0.890000 Q13*/, 7291/*0.890000 Q13*/, 6554/*0.800000 Q13*/, 6554/*0.800000 Q13*/, }, + /* strong */ {10240/*1.250000 Q13*/, 10240/*1.250000 Q13*/, 9748/*1.190000 Q13*/, 9748/*1.190000 Q13*/, } + }, + /* 20: for 16400 kbs SWB (stereo) */ + { + /* medium */ {8602/*1.050000 Q13*/, 8602/*1.050000 Q13*/, 9011/*1.100000 Q13*/, 9011/*1.100000 Q13*/, 8602/*1.050000 Q13*/, 8602/*1.050000 Q13*/, }, + /* strong */ {13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 13517/*1.650000 Q13*/, 13517/*1.650000 Q13*/, 13107/*1.600000 Q13*/, 12288/*1.500000 Q13*/, } + }, + /* 21: for 24400 kbs SWB (stereo) */ + { + /* medium */ {9830/*1.200000 Q13*/, 9830/*1.200000 Q13*/, 9421/*1.150000 Q13*/, 9011/*1.100000 Q13*/, 8602/*1.050000 Q13*/, 8192/*1.000000 Q13*/, 7373/*0.900000 Q13*/, }, + /* strong */ {13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 12698/*1.550000 Q13*/, 11878/*1.450000 Q13*/, 9830/*1.200000 Q13*/, } + }, + /* 22: for 32000 kbs SWB (stereo) */ + { + /* medium */ {9830/*1.200000 Q13*/, 9830/*1.200000 Q13*/, 9421/*1.150000 Q13*/, 9421/*1.150000 Q13*/, 9011/*1.100000 Q13*/, 8602/*1.050000 Q13*/, 8192/*1.000000 Q13*/, 7373/*0.900000 Q13*/, }, + /* strong */ {14746/*1.800000 Q13*/, 14746/*1.800000 Q13*/, 14746/*1.800000 Q13*/, 14746/*1.800000 Q13*/, 13517/*1.650000 Q13*/, 12698/*1.550000 Q13*/, 11878/*1.450000 Q13*/, 9830/*1.200000 Q13*/, } + }, + /* 23: for 48000 kbs SWB (stereo) */ /* currently not used due to adaptive calculation of thresholds at 48 kbps */ + { + /* medium */ {6144/*0.750000 Q13*/, 5734/*0.700000 Q13*/, 4096/*0.500000 Q13*/, 0/*0.000000 Q13*/ }, + /* strong */ {10240/*1.250000 Q13*/, 9011/*1.100000 Q13*/, 8192/*1.000000 Q13*/, 0/*0.000000 Q13*/ } + }, + /* 24: for 48000 kbs SWB (stereo TCX10) */ /* currently not used due to adaptive calculation of thresholds at 48 kbps */ + { + /* medium */ {6144/*0.750000 Q13*/, 5734/*0.700000 Q13*/, 4096/*0.500000 Q13*/, 0/*0.000000 Q13*/ }, + /* strong */ {10240/*1.250000 Q13*/, 9011/*1.100000 Q13*/, 8192/*1.000000 Q13*/, 0/*0.000000 Q13*/ } + }, + /* 25: for 64000 kbs SWB (stereo) */ + { + /* medium */ {8192/*1.000000 Q13*/, 8192/*1.000000 Q13*/, 9830/*1.200000 Q13*/, 10240/*1.250000 Q13*/ }, + /* strong */ {12288/*1.500000 Q13*/, 12288/*1.500000 Q13*/, 13107/*1.600000 Q13*/, 13107/*1.600000 Q13*/ } + }, + /* 26: for 80000 kbs SWB (stereo) */ + { + /* medium */ {9830/*1.200000 Q13*/, 10240/*1.250000 Q13*/, 0/*0.000000 Q13*/ }, + /* strong */ {13107/*1.600000 Q13*/, 13107/*1.600000 Q13*/, 0/*0.000000 Q13*/ } + }, + /* 27: for 96000 kbs SWB (stereo) */ + { + /* medium */ {9421/*1.150000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/ }, + /* strong */ {9748/*1.190000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/ } + }, + /* 28: for 24400 kbs FB (stereo) */ + { + /* medium */ {9830/*1.200000 Q13*/, 9830/*1.200000 Q13*/, 9421/*1.150000 Q13*/, 9011/*1.100000 Q13*/, 8602/*1.050000 Q13*/, 8192/*1.000000 Q13*/, 7373/*0.900000 Q13*/, 2785/*0.340000 Q13*/, 2785/*0.340000 Q13*/ }, + /* strong */ {13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 13926/*1.700000 Q13*/, 12698/*1.550000 Q13*/, 11878/*1.450000 Q13*/, 9830/*1.200000 Q13*/, 5325/*0.650000 Q13*/, 5325/*0.650000 Q13*/ } + }, + /* 29: for 32000 kbs FB (stereo) */ + { + /* medium */ {9830/*1.200000 Q13*/, 9830/*1.200000 Q13*/, 9421/*1.150000 Q13*/, 9421/*1.150000 Q13*/, 9011/*1.100000 Q13*/, 8602/*1.050000 Q13*/, 8192/*1.000000 Q13*/, 7373/*0.900000 Q13*/, 2785/*0.340000 Q13*/, 2785/*0.340000 Q13*/ }, + /* strong */ {14746/*1.800000 Q13*/, 14746/*1.800000 Q13*/, 14746/*1.800000 Q13*/, 14746/*1.800000 Q13*/, 13517/*1.650000 Q13*/, 12698/*1.550000 Q13*/, 11878/*1.450000 Q13*/, 9830/*1.200000 Q13*/, 5325/*0.650000 Q13*/, 5325/*0.650000 Q13*/ } + }, + /* 30: for 48000 kbs FB (stereo) */ /* currently not used due to adaptive calculation of thresholds at 48 kbps */ + { + /* medium */ {6390/*0.780000 Q13*/, 2540/*0.310000 Q13*/, 2785/*0.340000 Q13*/, 2785/*0.340000 Q13*/ }, + /* strong */ {12206/*1.490000 Q13*/, 11305/*1.380000 Q13*/, 5325/*0.650000 Q13*/, 5325/*0.650000 Q13*/ } + }, + /* 31: for 48000 kbs FB (stereo TCX10) */ /* currently not used due to adaptive calculation of thresholds at 48 kbps */ + { + /* medium */ {6144/*0.750000 Q13*/, 5734/*0.700000 Q13*/, 4096/*0.500000 Q13*/, 4096/*0.500000 Q13*/ }, + /* strong */ {10240/*1.250000 Q13*/, 9011/*1.100000 Q13*/, 8192/*1.000000 Q13*/, 8192/*1.000000 Q13*/ } + }, + /* 32: for 64000 kbs FB (stereo) */ + { + /* medium */ {8192/*1.000000 Q13*/, 8192/*1.000000 Q13*/, 9830/*1.200000 Q13*/, 10240/*1.250000 Q13*/, 6144/*0.750000 Q13*/ }, + /* strong */ {12288/*1.500000 Q13*/, 12288/*1.500000 Q13*/, 13107/*1.600000 Q13*/, 13107/*1.600000 Q13*/, 8192/*1.000000 Q13*/ } + }, + /* 33: for 80000 kbs FB (stereo) */ + { + /* medium */ {9830/*1.200000 Q13*/, 10240/*1.250000 Q13*/, 6144/*0.750000 Q13*/, 0/*0.000000 Q13*/ }, + /* strong */ {13107/*1.600000 Q13*/, 13107/*1.600000 Q13*/, 8192/*1.000000 Q13*/, 0/*0.000000 Q13*/ } + }, + /* 34: for 96000 kbs FB (stereo) */ + { + /* medium */ {7455/*0.910000 Q13*/, 6963/*0.850000 Q13*/ , 0/*0.000000 Q13*/ }, + /* strong */ {10977/*1.340000 Q13*/, 11059/*1.350000 Q13*/, 0/*0.000000 Q13*/ } + }, + /* 35: for 128000 kbs FB (stereo) */ + { + /* medium */ { 0/*0.000000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/}, + /* strong */ {23101/*2.820000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/, 0/*0.000000 Q13*/} + } +}; +const Word16 igf_whitening_TH[][2][IGF_MAX_TILES] = +{ + /* 0: for 9600 kbs WB */ + { + /* medium */ { 2949/*0.36f Q13*/, 2949/*0.36f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 11551/*1.41f Q13*/, 11551/*1.41f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} +}, +/* 1: for 13200 kbs WB RF */ +{ + /* medium */ { 2949/*0.36f Q13*/, 2949/*0.36f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 11551/*1.41f Q13*/, 11551/*1.41f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} +}, +/* 2: for 9600 kbs SWB */ +{ + /* medium */ { 6881/*0.84f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 10650/*1.30f Q13*/, 10240/*1.25f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} +}, +/* 3: for 13200 kbs SWB */ +{ + /* medium */ { 6881/*0.84f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 10650/*1.30f Q13*/, 10240/*1.25f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} +}, +/* 4: for 13200 kbs SWB RF */ +{ + /* medium */ { 6881/*0.84f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 10650/*1.30f Q13*/, 10240/*1.25f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} +}, +/* 5: for 16400 kbs SWB */ +{ + /* medium */ { 6799/*0.83f Q13*/, 7291/*0.89f Q13*/, 7291/*0.89f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 10732/*1.31f Q13*/, 9748/*1.19f Q13*/, 9748/*1.19f Q13*/, 0/*0.f Q13*/} +}, +/* 6: for 24400 kbs SWB*/ +{ + /* medium */ { 6636/*0.81f Q13*/, 6963/*0.85f Q13*/, 6963/*0.85f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 11059/*1.35f Q13*/, 10076/*1.23f Q13*/, 10076/*1.23f Q13*/, 0/*0.f Q13*/} +}, +/* 7: for 32000 kbs SWB */ +{ + /* medium */ { 7455/*0.91f Q13*/, 6963/*0.85f Q13*/, 6963/*0.85f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 10977/*1.34f Q13*/, 11059/*1.35f Q13*/, 11059/*1.35f Q13*/, 0/*0.f Q13*/} +}, +/* 8: for 48000 kbs SWB */ +{ + /* medium */ { 9421/*1.15f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 9748/*1.19f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} +}, +/* 9: for 64000 kbs SWB */ +{ + /* medium */ { 9421/*1.15f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 9748/*1.19f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} +}, +/* 10: for 16400 kbs FB */ +{ + /* medium */ { 5161/*0.63f Q13*/, 2212/*0.27f Q13*/, 2949/*0.36f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 12534/*1.53f Q13*/, 10813/*1.32f Q13*/, 5489/*0.67f Q13*/, 0/*0.f Q13*/} +}, +/* 11: for 24400 kbs FB */ +{ + /* medium */ { 6390/*0.78f Q13*/, 2540/*0.31f Q13*/, 2785/*0.34f Q13*/, 2785/*0.34f Q13*/}, + /* strong */ { 12206/*1.49f Q13*/, 11305/*1.38f Q13*/, 5325/*0.65f Q13*/, 5325/*0.65f Q13*/} +}, +/* 12: for 32000 kbs FB */ +{ + /* medium */ { 6390/*0.78f Q13*/, 2540/*0.31f Q13*/, 2785/*0.34f Q13*/, 2785/*0.34f Q13*/}, + /* strong */ { 12206/*1.49f Q13*/, 11305/*1.38f Q13*/, 5325/*0.65f Q13*/, 5325/*0.65f Q13*/} +}, +/* 13: for 48000 kbs FB */ +{ + /* medium */ { 6554/*0.80f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 8192/*1.00f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} +}, +/* 14: for 64000 kbs FB */ +{ + /* medium */ { 6554/*0.80f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 8192/*1.00f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} +}, +/* 15: for 96000 kbs FB */ +{ + /* medium */ { 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 23101/*2.82f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} +}, +/* 16: for 128000 kbs FB */ +{ + /* medium */ { 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/}, + /* strong */ { 23101/*2.82f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/, 0/*0.f Q13*/} +} +}; + +/* IGF SCF arithmetic coder cumulative frequency tables and offsets */ + +const Word16 cf_off_se01_tab[10] = { // Q0 + +1, /* 9.6 kbs B*/ + +1, /* 13.2 kbs WB RF B*/ + +1, /* 9.6 kbs SWB B*/ + +1, /* 13.2 kbs A*/ + +1, /* 13.2 kbs SWB RF B*/ + +1, /* 16.4 kbs B*/ + +1, /* 24.4 kbs B*/ + +1, /* 32.0 kbs A*/ + -1, /* 48.0 kbs B*/ + -1 /* 64.0 kbs B*/ +}; + +const Word16 cf_off_se02_tab[10][IGF_CTX_COUNT] = { // Q0 + { +1, +2, +2, +2, +3, +3, +4}, /* 9.6 kbs B*/ + { +1, +2, +2, +2, +3, +3, +4}, /* 13.2 kbs WB RF B*/ + { +0, +2, +3, +3, +2, +2, +4}, /* 9.6 kbs SWB B*/ + { +0, +2, +3, +3, +2, +2, +4}, /* 13.2 kbs A*/ + { +0, +2, +3, +3, +2, +2, +4}, /* 13.2 kbs SWB RF B*/ + { +0, +2, +3, +3, +2, +2, +4}, /* 16.4 kbs B*/ + { -1, +2, +2, +2, +2, +3, +5}, /* 24.4 kbs B*/ + { -1, +2, +2, +2, +2, +3, +5}, /* 32.0 kbs A*/ + { +3, +2, +3, +2, +3, +3, +6}, /* 48.0 kbs B*/ + { +3, +2, +3, +2, +3, +3, +6} /* 64.0 kbs B*/ +}; + +const Word16 cf_off_se10_tab = -7; // Q0 + +const Word16 cf_off_se11_tab[IGF_CTX_COUNT][IGF_CTX_COUNT] = // Q0 +{ + { -5, +0, +0, +0, +0, +0, +0}, + { +0, +0, +0, +0, +0, +0, +0}, + { +0, +0, +0, +0, +0, +0, +0}, + { +0, +0, +0, +0, +0, +0, +0}, + { +0, +0, +0, +0, +0, +0, +0}, + { +0, +0, +0, +0, +0, +0, +1}, + { +0, +1, +0, +0, +3, +0, +3} +}; + +const UWord16 cf_se00_tab[IGF_SYMBOLS_IN_TABLE + 1] = // Q0 +{ + 16384, 16356, 16299, 16185, 15904, 15282, 14669, 13598, 11886, 9541, 6613, 3845, 1799, 606, 153, 32, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 +}; + +const UWord16 cf_se01_tab[10][IGF_SYMBOLS_IN_TABLE + 1] = // Q0 +{ + {16384, 16320, 16285, 16237, 16163, 16049, 15864, 15604, 15187, 14557, 13612, 12308, 10590, 8535, 6346, 4396, 2900, 1917, 1289, 870, 593, 408, 279, 181, 122, 78, 52, 0}, /* 9.6 kbs B*/ + {16384, 16320, 16285, 16237, 16163, 16049, 15864, 15604, 15187, 14557, 13612, 12308, 10590, 8535, 6346, 4396, 2900, 1917, 1289, 870, 593, 408, 279, 181, 122, 78, 52, 0}, /* 13.2 kbs WB RF B*/ + {16384, 16375, 16362, 16339, 16307, 16258, 16180, 16061, 15845, 15463, 14795, 13680, 11828, 9252, 6358, 3769, 2079, 1186, 687, 415, 242, 150, 100, 67, 44, 30, 19, 0}, /* 9.6 kbs SWB B*/ + {16384, 16375, 16362, 16339, 16307, 16258, 16180, 16061, 15845, 15463, 14795, 13680, 11828, 9252, 6358, 3769, 2079, 1186, 687, 415, 242, 150, 100, 67, 44, 30, 19, 0}, /* 13.2 kbs A*/ + {16384, 16375, 16362, 16339, 16307, 16258, 16180, 16061, 15845, 15463, 14795, 13680, 11828, 9252, 6358, 3769, 2079, 1186, 687, 415, 242, 150, 100, 67, 44, 30, 19, 0}, /* 13.2 kbs SWB RF B*/ + {16384, 16375, 16362, 16339, 16307, 16258, 16180, 16061, 15845, 15463, 14795, 13680, 11828, 9252, 6358, 3769, 2079, 1186, 687, 415, 242, 150, 100, 67, 44, 30, 19, 0}, /* 16.4 kbs B*/ + {16384, 16369, 16356, 16337, 16311, 16268, 16197, 16073, 15876, 15544, 14977, 13987, 12327, 9908, 7017, 4393, 2545, 1446, 840, 493, 292, 183, 111, 70, 45, 31, 20, 0 }, /* 24.4 kbs B*/ + {16384, 16369, 16356, 16337, 16311, 16268, 16197, 16073, 15876, 15544, 14977, 13987, 12327, 9908, 7017, 4393, 2545, 1446, 840, 493, 292, 183, 111, 70, 45, 31, 20, 0}, /* 32.0 kbs A*/ + {16384, 16368, 16355, 16334, 16291, 16212, 16071, 15816, 15359, 14523, 13014, 10534, 7345, 4272, 2228, 1149, 626, 357, 215, 139, 93, 67, 53, 43, 36, 28, 22, 0}, /* 48.0 kbs B*/ + {16384, 16368, 16355, 16334, 16291, 16212, 16071, 15816, 15359, 14523, 13014, 10534, 7345, 4272, 2228, 1149, 626, 357, 215, 139, 93, 67, 53, 43, 36, 28, 22, 0} /* 64.0 kbs B*/ +}; + +const UWord16 cf_se02_tab[10][IGF_CTX_COUNT][IGF_SYMBOLS_IN_TABLE + 1] = // Q0 +{ + { /* 9.6 kbs B */ + { 16384, 16369, 16348, 16316, 16256, 16172, 16017, 15735, 15246, 14363, 13036, 11139, 8916, 6724, 4757, 3282, 2221, 1549, 1105, 771, 548, 364, 238, 151, 89, 50, 30, 0}, + { 16384, 16371, 16358, 16339, 16290, 16241, 16153, 16040, 15813, 15397, 14601, 13301, 11360, 8916, 6254, 3911, 2220, 1280, 755, 461, 278, 177, 111, 70, 35, 20, 12, 0}, + { 16384, 16375, 16359, 16333, 16286, 16243, 16154, 16024, 15771, 15380, 14712, 13537, 11742, 9425, 6872, 4378, 2327, 1197, 671, 412, 259, 145, 93, 52, 26, 13, 5, 0}, + { 16384, 16372, 16358, 16326, 16289, 16241, 16147, 16014, 15765, 15321, 14670, 13546, 11912, 9787, 7323, 4824, 2536, 1330, 731, 438, 258, 148, 86, 37, 22, 11, 2, 0}, + { 16384, 16376, 16364, 16344, 16315, 16272, 16219, 16119, 15910, 15620, 15100, 14254, 13063, 11489, 9413, 7100, 4738, 2751, 1584, 973, 597, 349, 201, 96, 47, 22, 9, 0}, + { 16384, 16364, 16340, 16312, 16288, 16237, 16166, 16026, 15756, 15390, 14833, 13870, 12627, 10998, 8985, 6893, 4720, 3048, 1860, 1131, 725, 449, 215, 111, 56, 34, 14, 0}, + { 16384, 16326, 16297, 16246, 16183, 16064, 15884, 15632, 15240, 14763, 14107, 13230, 12185, 10886, 9390, 7781, 6194, 4696, 3350, 2259, 1506, 975, 604, 356, 201, 106, 48, 0} + }, + { /* 13.2 kbs WB RF B*/ + { 16384, 16369, 16348, 16316, 16256, 16172, 16017, 15735, 15246, 14363, 13036, 11139, 8916, 6724, 4757, 3282, 2221, 1549, 1105, 771, 548, 364, 238, 151, 89, 50, 30, 0}, + { 16384, 16371, 16358, 16339, 16290, 16241, 16153, 16040, 15813, 15397, 14601, 13301, 11360, 8916, 6254, 3911, 2220, 1280, 755, 461, 278, 177, 111, 70, 35, 20, 12, 0}, + { 16384, 16375, 16359, 16333, 16286, 16243, 16154, 16024, 15771, 15380, 14712, 13537, 11742, 9425, 6872, 4378, 2327, 1197, 671, 412, 259, 145, 93, 52, 26, 13, 5, 0}, + { 16384, 16372, 16358, 16326, 16289, 16241, 16147, 16014, 15765, 15321, 14670, 13546, 11912, 9787, 7323, 4824, 2536, 1330, 731, 438, 258, 148, 86, 37, 22, 11, 2, 0}, + { 16384, 16376, 16364, 16344, 16315, 16272, 16219, 16119, 15910, 15620, 15100, 14254, 13063, 11489, 9413, 7100, 4738, 2751, 1584, 973, 597, 349, 201, 96, 47, 22, 9, 0}, + { 16384, 16364, 16340, 16312, 16288, 16237, 16166, 16026, 15756, 15390, 14833, 13870, 12627, 10998, 8985, 6893, 4720, 3048, 1860, 1131, 725, 449, 215, 111, 56, 34, 14, 0}, + { 16384, 16326, 16297, 16246, 16183, 16064, 15884, 15632, 15240, 14763, 14107, 13230, 12185, 10886, 9390, 7781, 6194, 4696, 3350, 2259, 1506, 975, 604, 356, 201, 106, 48, 0} + }, + { /* 9.6 kbs SWB B*/ + { 16384, 16359, 16349, 16331, 16300, 16236, 16112, 15894, 15480, 14691, 13257, 10996, 8168, 5357, 3193, 1864, 1098, 676, 426, 265, 173, 117, 81, 59, 45, 35, 26, 0}, + { 16384, 16374, 16370, 16367, 16362, 16348, 16325, 16283, 16204, 16058, 15715, 14980, 13521, 11144, 7972, 4702, 2366, 1063, 480, 241, 128, 71, 42, 22, 14, 9, 5, 0}, + { 16384, 16380, 16377, 16375, 16372, 16365, 16354, 16334, 16295, 16216, 16056, 15716, 15034, 13690, 11467, 8404, 5150, 2385, 908, 417, 199, 106, 62, 35, 21, 13, 7, 0}, + { 16384, 16378, 16376, 16373, 16368, 16360, 16346, 16318, 16267, 16173, 15991, 15644, 14932, 13623, 11575, 8688, 5224, 2309, 891, 393, 202, 103, 57, 34, 20, 11, 8, 0}, + { 16384, 16375, 16372, 16365, 16348, 16322, 16279, 16201, 16046, 15728, 15214, 14297, 12811, 10673, 7918, 4530, 2109, 978, 466, 234, 121, 72, 46, 31, 25, 17, 13, 0}, + { 16384, 16366, 16357, 16341, 16325, 16289, 16220, 16084, 15768, 15300, 14466, 13206, 11402, 9176, 6633, 4092, 2192, 1171, 592, 315, 179, 111, 74, 46, 31, 26, 18, 0}, + { 16384, 16301, 16266, 16211, 16140, 16045, 15889, 15652, 15358, 14883, 14192, 13119, 11753, 10181, 8445, 6708, 5023, 3449, 2226, 1375, 849, 516, 353, 231, 153, 107, 78, 0} + }, + { /* 13.2 kbs A */ + { 16384, 16359, 16349, 16331, 16300, 16236, 16112, 15894, 15480, 14691, 13257, 10996, 8168, 5357, 3193, 1864, 1098, 676, 426, 265, 173, 117, 81, 59, 45, 35, 26, 0}, + { 16384, 16374, 16370, 16367, 16362, 16348, 16325, 16283, 16204, 16058, 15715, 14980, 13521, 11144, 7972, 4702, 2366, 1063, 480, 241, 128, 71, 42, 22, 14, 9, 5, 0}, + { 16384, 16380, 16377, 16375, 16372, 16365, 16354, 16334, 16295, 16216, 16056, 15716, 15034, 13690, 11467, 8404, 5150, 2385, 908, 417, 199, 106, 62, 35, 21, 13, 7, 0}, + { 16384, 16378, 16376, 16373, 16368, 16360, 16346, 16318, 16267, 16173, 15991, 15644, 14932, 13623, 11575, 8688, 5224, 2309, 891, 393, 202, 103, 57, 34, 20, 11, 8, 0}, + { 16384, 16375, 16372, 16365, 16348, 16322, 16279, 16201, 16046, 15728, 15214, 14297, 12811, 10673, 7918, 4530, 2109, 978, 466, 234, 121, 72, 46, 31, 25, 17, 13, 0}, + { 16384, 16366, 16357, 16341, 16325, 16289, 16220, 16084, 15768, 15300, 14466, 13206, 11402, 9176, 6633, 4092, 2192, 1171, 592, 315, 179, 111, 74, 46, 31, 26, 18, 0}, + { 16384, 16301, 16266, 16211, 16140, 16045, 15889, 15652, 15358, 14883, 14192, 13119, 11753, 10181, 8445, 6708, 5023, 3449, 2226, 1375, 849, 516, 353, 231, 153, 107, 78, 0} + }, + { /* 13.2 kbs SWB RF B*/ + { 16384, 16359, 16349, 16331, 16300, 16236, 16112, 15894, 15480, 14691, 13257, 10996, 8168, 5357, 3193, 1864, 1098, 676, 426, 265, 173, 117, 81, 59, 45, 35, 26, 0}, + { 16384, 16374, 16370, 16367, 16362, 16348, 16325, 16283, 16204, 16058, 15715, 14980, 13521, 11144, 7972, 4702, 2366, 1063, 480, 241, 128, 71, 42, 22, 14, 9, 5, 0}, + { 16384, 16380, 16377, 16375, 16372, 16365, 16354, 16334, 16295, 16216, 16056, 15716, 15034, 13690, 11467, 8404, 5150, 2385, 908, 417, 199, 106, 62, 35, 21, 13, 7, 0}, + { 16384, 16378, 16376, 16373, 16368, 16360, 16346, 16318, 16267, 16173, 15991, 15644, 14932, 13623, 11575, 8688, 5224, 2309, 891, 393, 202, 103, 57, 34, 20, 11, 8, 0}, + { 16384, 16375, 16372, 16365, 16348, 16322, 16279, 16201, 16046, 15728, 15214, 14297, 12811, 10673, 7918, 4530, 2109, 978, 466, 234, 121, 72, 46, 31, 25, 17, 13, 0}, + { 16384, 16366, 16357, 16341, 16325, 16289, 16220, 16084, 15768, 15300, 14466, 13206, 11402, 9176, 6633, 4092, 2192, 1171, 592, 315, 179, 111, 74, 46, 31, 26, 18, 0}, + { 16384, 16301, 16266, 16211, 16140, 16045, 15889, 15652, 15358, 14883, 14192, 13119, 11753, 10181, 8445, 6708, 5023, 3449, 2226, 1375, 849, 516, 353, 231, 153, 107, 78, 0} + }, + { /* 16.4 kbs B */ + { 16384, 16359, 16349, 16331, 16300, 16236, 16112, 15894, 15480, 14691, 13257, 10996, 8168, 5357, 3193, 1864, 1098, 676, 426, 265, 173, 117, 81, 59, 45, 35, 26, 0}, + { 16384, 16374, 16370, 16367, 16362, 16348, 16325, 16283, 16204, 16058, 15715, 14980, 13521, 11144, 7972, 4702, 2366, 1063, 480, 241, 128, 71, 42, 22, 14, 9, 5, 0}, + { 16384, 16380, 16377, 16375, 16372, 16365, 16354, 16334, 16295, 16216, 16056, 15716, 15034, 13690, 11467, 8404, 5150, 2385, 908, 417, 199, 106, 62, 35, 21, 13, 7, 0}, + { 16384, 16378, 16376, 16373, 16368, 16360, 16346, 16318, 16267, 16173, 15991, 15644, 14932, 13623, 11575, 8688, 5224, 2309, 891, 393, 202, 103, 57, 34, 20, 11, 8, 0}, + { 16384, 16375, 16372, 16365, 16348, 16322, 16279, 16201, 16046, 15728, 15214, 14297, 12811, 10673, 7918, 4530, 2109, 978, 466, 234, 121, 72, 46, 31, 25, 17, 13, 0}, + { 16384, 16366, 16357, 16341, 16325, 16289, 16220, 16084, 15768, 15300, 14466, 13206, 11402, 9176, 6633, 4092, 2192, 1171, 592, 315, 179, 111, 74, 46, 31, 26, 18, 0}, + { 16384, 16301, 16266, 16211, 16140, 16045, 15889, 15652, 15358, 14883, 14192, 13119, 11753, 10181, 8445, 6708, 5023, 3449, 2226, 1375, 849, 516, 353, 231, 153, 107, 78, 0} + }, + { /* 24.4 kbs B */ + { 16384, 16351, 16333, 16303, 16254, 16163, 15993, 15681, 15080, 13987, 12109, 9465, 6588, 4160, 2488, 1480, 912, 589, 389, 266, 190, 131, 93, 68, 47, 34, 24, 0}, + { 16384, 16379, 16375, 16369, 16360, 16345, 16328, 16286, 16211, 16078, 15810, 15233, 14058, 11933, 8881, 5609, 2940, 1290, 558, 274, 150, 80, 47, 29, 17, 11, 6, 0}, + { 16384, 16382, 16380, 16377, 16370, 16358, 16337, 16300, 16224, 16088, 15811, 15233, 14112, 12019, 9061, 5723, 2780, 1121, 480, 239, 123, 69, 41, 22, 13, 8, 5, 0}, + { 16384, 16377, 16375, 16369, 16363, 16351, 16325, 16268, 16172, 16009, 15686, 15039, 13830, 11799, 8924, 5422, 2444, 960, 441, 220, 111, 63, 37, 22, 11, 6, 3, 0}, + { 16384, 16374, 16369, 16363, 16356, 16335, 16290, 16214, 16068, 15826, 15382, 14550, 13126, 10956, 8000, 4622, 2090, 973, 478, 249, 128, 75, 42, 19, 13, 7, 4, 0}, + { 16384, 16375, 16370, 16367, 16362, 16340, 16298, 16232, 16097, 15860, 15440, 14718, 13570, 11874, 9557, 6790, 4053, 2166, 1150, 622, 323, 179, 96, 53, 33, 17, 12, 0}, + { 16384, 16335, 16304, 16276, 16228, 16166, 16094, 15983, 15775, 15501, 15040, 14417, 13552, 12326, 10847, 9117, 7308, 5373, 3666, 2297, 1336, 807, 495, 313, 216, 152, 114, 0} + }, + { /* 32.0 kbs A */ + { 16384, 16351, 16333, 16303, 16254, 16163, 15993, 15681, 15080, 13987, 12109, 9465, 6588, 4160, 2488, 1480, 912, 589, 389, 266, 190, 131, 93, 68, 47, 34, 24, 0}, + { 16384, 16379, 16375, 16369, 16360, 16345, 16328, 16286, 16211, 16078, 15810, 15233, 14058, 11933, 8881, 5609, 2940, 1290, 558, 274, 150, 80, 47, 29, 17, 11, 6, 0}, + { 16384, 16382, 16380, 16377, 16370, 16358, 16337, 16300, 16224, 16088, 15811, 15233, 14112, 12019, 9061, 5723, 2780, 1121, 480, 239, 123, 69, 41, 22, 13, 8, 5, 0}, + { 16384, 16377, 16375, 16369, 16363, 16351, 16325, 16268, 16172, 16009, 15686, 15039, 13830, 11799, 8924, 5422, 2444, 960, 441, 220, 111, 63, 37, 22, 11, 6, 3, 0}, + { 16384, 16374, 16369, 16363, 16356, 16335, 16290, 16214, 16068, 15826, 15382, 14550, 13126, 10956, 8000, 4622, 2090, 973, 478, 249, 128, 75, 42, 19, 13, 7, 4, 0}, + { 16384, 16375, 16370, 16367, 16362, 16340, 16298, 16232, 16097, 15860, 15440, 14718, 13570, 11874, 9557, 6790, 4053, 2166, 1150, 622, 323, 179, 96, 53, 33, 17, 12, 0}, + { 16384, 16335, 16304, 16276, 16228, 16166, 16094, 15983, 15775, 15501, 15040, 14417, 13552, 12326, 10847, 9117, 7308, 5373, 3666, 2297, 1336, 807, 495, 313, 216, 152, 114, 0} + }, + { /* 48.0 kbs B */ + { 16384, 16334, 16310, 16285, 16254, 16204, 16128, 16031, 15903, 15697, 15380, 14820, 13857, 12267, 9878, 7099, 4509, 2576, 1478, 871, 531, 349, 230, 163, 111, 80, 62, 0}, + { 16384, 16337, 16327, 16307, 16278, 16239, 16178, 16092, 15947, 15719, 15286, 14428, 12833, 10246, 7123, 4088, 1896, 849, 481, 287, 190, 139, 94, 66, 52, 34, 24, 0}, + { 16384, 16352, 16341, 16329, 16312, 16295, 16265, 16223, 16151, 16026, 15825, 15437, 14645, 13089, 10612, 7364, 4077, 1783, 779, 444, 281, 192, 138, 93, 65, 43, 30, 0}, + { 16384, 16354, 16347, 16337, 16314, 16284, 16233, 16165, 16051, 15847, 15450, 14621, 13069, 10623, 7298, 3789, 1569, 727, 445, 302, 207, 143, 96, 59, 36, 18, 9, 0}, + { 16384, 16352, 16342, 16330, 16314, 16295, 16266, 16215, 16127, 15984, 15709, 15190, 14242, 12540, 9979, 6448, 3160, 1392, 752, 481, 344, 251, 169, 115, 73, 28, 8, 0}, + { 16384, 16340, 16320, 16302, 16272, 16257, 16220, 16135, 16011, 15784, 15370, 14688, 13423, 11457, 8721, 5529, 2736, 1375, 784, 525, 353, 263, 172, 113, 78, 26, 11, 0}, + { 16384, 16238, 16170, 16113, 16077, 16030, 16000, 15948, 15873, 15752, 15535, 15157, 14595, 13788, 12569, 10767, 8611, 6186, 4101, 2459, 1478, 881, 607, 385, 243, 168, 116, 0} + }, + { /* 64.0 kbs B */ + { 16384, 16334, 16310, 16285, 16254, 16204, 16128, 16031, 15903, 15697, 15380, 14820, 13857, 12267, 9878, 7099, 4509, 2576, 1478, 871, 531, 349, 230, 163, 111, 80, 62, 0}, + { 16384, 16337, 16327, 16307, 16278, 16239, 16178, 16092, 15947, 15719, 15286, 14428, 12833, 10246, 7123, 4088, 1896, 849, 481, 287, 190, 139, 94, 66, 52, 34, 24, 0}, + { 16384, 16352, 16341, 16329, 16312, 16295, 16265, 16223, 16151, 16026, 15825, 15437, 14645, 13089, 10612, 7364, 4077, 1783, 779, 444, 281, 192, 138, 93, 65, 43, 30, 0}, + { 16384, 16354, 16347, 16337, 16314, 16284, 16233, 16165, 16051, 15847, 15450, 14621, 13069, 10623, 7298, 3789, 1569, 727, 445, 302, 207, 143, 96, 59, 36, 18, 9, 0}, + { 16384, 16352, 16342, 16330, 16314, 16295, 16266, 16215, 16127, 15984, 15709, 15190, 14242, 12540, 9979, 6448, 3160, 1392, 752, 481, 344, 251, 169, 115, 73, 28, 8, 0}, + { 16384, 16340, 16320, 16302, 16272, 16257, 16220, 16135, 16011, 15784, 15370, 14688, 13423, 11457, 8721, 5529, 2736, 1375, 784, 525, 353, 263, 172, 113, 78, 26, 11, 0}, + { 16384, 16238, 16170, 16113, 16077, 16030, 16000, 15948, 15873, 15752, 15535, 15157, 14595, 13788, 12569, 10767, 8611, 6186, 4101, 2459, 1478, 881, 607, 385, 243, 168, 116, 0} + } +}; + +/* only needed for >= 48 kbps */ + +const UWord16 cf_se10_tab[IGF_SYMBOLS_IN_TABLE + 1] = // Q0 +{ + 16384, 15493, 15154, 14810, 14331, 13701, 13086, 12403, 11585, 10923, 10293, 9631, 8943, 8385, 7760, 7182, 6593, 6009, 5540, 5082, 4571, 4133, 3711, 3299, 2887, 2460, 2043, 0 +}; + +const UWord16 cf_se11_tab[IGF_CTX_COUNT][IGF_CTX_COUNT][IGF_SYMBOLS_IN_TABLE + 1] = // Q0 +{ + { + { 16384, 16313, 16312, 16241, 16206, 16099, 15957, 15386, 14601, 12852, 10282, 7534, 4964, 2966, 1824, 896, 504, 255, 113, 112, 41, 40, 39, 38, 37, 36, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16207, 16206, 16205, 16120, 15949, 14663, 12777, 9947, 6860, 3773, 1972, 772, 430, 259, 174, 89, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16115, 15941, 14891, 12965, 11477, 8587, 5347, 3421, 1407, 620, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16254, 16253, 16004, 15005, 13756, 12006, 9256, 5755, 3755, 1755, 756, 132, 131, 130, 129, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 15964, 15550, 14929, 12856, 9954, 6430, 2906, 1456, 1042, 628, 214, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16087, 15503, 14334, 14333, 11994, 10240, 8193, 5268, 2929, 1760, 1176, 299, 298, 297, 296, 295, 294, 293, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 14922, 13467, 10919, 9464, 7280, 6189, 3641, 2914, 2187, 1824, 1823, 1096, 369, 368, 367, 4, 3, 2, 1, 0} + }, + { + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16238, 16237, 15678, 15399, 14840, 13441, 11341, 8681, 6161, 3781, 2522, 702, 283, 144, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 16374, 15693, 14671, 12625, 7507, 4778, 2390, 1368, 1028, 347, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 16374, 15595, 13776, 9877, 6498, 3639, 3120, 1561, 1042, 523, 265, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 15709, 13704, 12702, 11032, 7355, 3010, 1340, 1007, 674, 341, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 16374, 12816, 10683, 7125, 2854, 720, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 12738, 12737, 10920, 9103, 5466, 1828, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 15359, 15358, 14337, 14336, 14335, 14334, 14333, 10240, 7170, 5124, 2054, 1032, 1031, 1030, 1029, 7, 6, 5, 4, 3, 2, 1, 0} + }, + { + { 16384, 16383, 16382, 16107, 16106, 16105, 16104, 16103, 15966, 15965, 15690, 15140, 14315, 12939, 10324, 8122, 4956, 2479, 1654, 966, 691, 416, 141, 140, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 15320, 14265, 12945, 10568, 8984, 6343, 4230, 1853, 797, 270, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16112, 16111, 16110, 15037, 14501, 12622, 11012, 7790, 5374, 3226, 1347, 542, 275, 274, 273, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 15597, 14819, 12090, 7021, 4292, 1953, 1175, 787, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 15935, 14165, 12838, 9297, 6641, 3985, 1772, 1331, 890, 449, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 14740, 13923, 9010, 6555, 4100, 2464, 828, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 13104, 13103, 8192, 4920, 1647, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} + }, + { + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16077, 16076, 16075, 15926, 15176, 14425, 10819, 7664, 5711, 2856, 1354, 754, 454, 154, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16044, 16043, 14373, 12369, 10030, 7023, 5019, 1677, 676, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16077, 16076, 16075, 15470, 14258, 12743, 11531, 6375, 3040, 3039, 917, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 15309, 13531, 11396, 7480, 3564, 1786, 364, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 15833, 15289, 13652, 10377, 6556, 3827, 3283, 1646, 555, 554, 553, 552, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 14146, 13404, 13403, 13402, 10425, 7448, 3727, 2240, 2239, 752, 751, 750, 749, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 15562, 14745, 13928, 10653, 7378, 5742, 2467, 830, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} + }, + { + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 16219, 15590, 14803, 13544, 11339, 9292, 6930, 4568, 2521, 1419, 790, 318, 161, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16014, 15652, 14925, 14198, 12743, 10196, 5464, 3645, 1826, 371, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16050, 15396, 15395, 12447, 10810, 8518, 4915, 2950, 1313, 659, 333, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 14792, 14001, 11096, 8455, 6079, 3174, 2119, 535, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 15796, 15795, 15794, 15793, 11700, 8777, 6439, 4101, 1178, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 15473, 15472, 15471, 14563, 13655, 12746, 10017, 7288, 6379, 6378, 4559, 1830, 1829, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 15723, 15069, 13105, 9174, 7865, 3934, 3280, 1971, 1317, 663, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} + }, + { + { 16384, 16383, 16382, 16381, 16232, 16231, 16230, 16229, 16228, 16227, 16078, 15628, 15329, 13977, 12325, 10222, 5413, 4212, 1959, 908, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16109, 15842, 15841, 13694, 11815, 10205, 5640, 3493, 2151, 1347, 543, 542, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16168, 14699, 13650, 11761, 9452, 6093, 3784, 1685, 636, 427, 426, 425, 424, 423, 422, 421, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16122, 15611, 14332, 13053, 10238, 7423, 4608, 2561, 2050, 1027, 516, 515, 260, 259, 258, 257, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 16376, 16375, 15207, 13649, 10531, 6632, 3514, 1176, 398, 397, 396, 395, 394, 393, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16379, 16378, 16377, 15749, 15120, 12601, 10082, 8823, 6304, 3785, 3156, 1267, 638, 637, 636, 7, 6, 5, 4, 3, 2, 1, 0}, + { 16384, 16383, 15729, 15728, 15727, 15726, 15725, 15071, 14417, 12453, 10489, 8525, 5905, 1975, 1321, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} + }, + { + { 16384, 16383, 16372, 16340, 16339, 16328, 16285, 16253, 16136, 15923, 15614, 14931, 13833, 12201, 10175, 7615, 5269, 3243, 2123, 1142, 673, 342, 182, 150, 86, 54, 11, 0}, + { 16384, 16383, 16366, 16349, 16332, 16331, 16314, 16245, 16244, 16141, 15813, 15451, 14105, 12672, 9910, 7113, 4472, 2590, 1071, 484, 294, 156, 53, 36, 19, 18, 1, 0}, + { 16384, 16383, 16382, 16369, 16355, 16341, 16271, 16117, 15921, 15627, 14772, 13089, 10929, 8334, 5487, 3299, 1644, 999, 424, 228, 88, 46, 18, 17, 16, 15, 14, 0}, + { 16384, 16367, 16366, 16365, 16364, 16363, 16259, 16173, 15809, 15028, 13951, 12214, 9278, 6203, 3719, 2052, 1079, 402, 194, 125, 56, 22, 21, 20, 3, 2, 1, 0}, + { 16384, 16383, 16360, 16359, 16358, 16357, 16356, 16333, 16332, 16143, 15954, 15434, 14227, 12262, 9540, 6652, 3882, 1988, 1207, 829, 427, 191, 73, 50, 49, 2, 1, 0}, + { 16384, 16383, 16382, 16381, 16380, 16296, 16254, 15748, 14862, 13427, 11189, 8487, 5278, 3252, 2028, 1099, 551, 340, 298, 214, 172, 88, 46, 45, 3, 2, 1, 0}, + { 16384, 16383, 16307, 16269, 16231, 16230, 16077, 15886, 15464, 14620, 13546, 11896, 9671, 7024, 4338, 2382, 1423, 809, 541, 311, 158, 43, 5, 4, 3, 2, 1, 0} + } +}; + +const IGF_MODE igfMode[IGF_BITRATE_UNKNOWN] = +{ + /* sampleRate, frameLength, igfMinFq, maxHopsize */ + { 16000, 320, 774, 4 }, /* 9.6kbs WB 0 */ + { 16000, 320, 774, 4 }, /* 13.2kbs WB RF 1 */ + { 32000, 640, 800, 2 }, /* 9.6kbs SWB 2 */ + { 32000, 640, 800, 4 }, /* 13.2kbs SWB 3 */ + { 32000, 640, 800, 2 }, /* 13.2kbs SWB RF 4 */ + { 32000, 640, 800, 4 }, /* 16.4kbs SWB 5 */ + { 32000, 640, 800, 4 }, /* 24.4kbs SWB 6 */ + { 32000, 640, 800, 4 }, /* 32.0kbs SWB 7 */ + { 32000, 640, 1600, 4 }, /* 48.0kbs SWB 8 */ + { 32000, 640, 1600, 4 }, /* 64.0kbs SWB 9 */ + { 48000, 960, 800, 4 }, /* 16.4kbs FB 10 */ + { 48000, 960, 800, 2 }, /* 24.4kbs FB 11 */ + { 48000, 960, 800, 2 }, /* 32.0kbs FB 12 */ + { 48000, 960, 1600, 2 }, /* 48.0kbs FB 13 */ + { 48000, 960, 1600, 2 }, /* 64.0kbs FB 14 */ + { 48000, 960, 1600, 1 }, /* 96.0kbs FB 15 */ + { 48000, 960, 1600, 1 }, /*128.0kbs FB 16 */ + { 16000, 320, 800, 2 }, /* 13.2kbs WB CPE 17 */ /* stereo mode */ + { 16000, 320, 800, 2 }, /* 16.4kbs WB CPE 18 */ /* stereo mode */ + { 32000, 640, 800, 2 }, /* 13.2kbs SWB CPE 19 */ /* stereo mode */ + { 32000, 640, 800, 2 }, /* 16.4kbs SWB CPE 20 */ /* stereo mode */ + { 32000, 640, 800, 2 }, /* 24.4kbs SWB CPE 21 */ /* stereo mode */ + { 32000, 640, 800, 2 }, /* 32.0kbs SWB CPE 22 */ /* stereo mode */ + { 32000, 640, 1200, 2 }, /* 48.0kbs SWB CPE 23 */ /* stereo mode */ + { 32000, 640, 1200, 2 }, /* 48.0kbs SWB CPE 24 */ /* stereo TCX10 mode */ + { 32000, 640, 1200, 2 }, /* 64.0kbs SWB CPE 25 */ /* stereo mode */ + { 32000, 640, 1600, 2 }, /* 80.0kbs SWB CPE 26 */ /* stereo mode */ + { 32000, 640, 1600, 4 }, /* 96.0kbs SWB CPE 27 */ /* stereo mode */ + { 48000, 960, 800, 2 }, /* 24.4kbs FB CPE 28 */ /* stereo mode */ + { 48000, 960, 800, 2 }, /* 32.0kbs FB CPE 29 */ /* stereo mode */ + { 48000, 960, 1200, 2 }, /* 48.0kbs FB CPE 30 */ /* stereo mode */ + { 48000, 960, 1200, 2 }, /* 48.0kbs FB CPE 31 */ /* stereo TCX10 mode */ + { 48000, 960, 1200, 2 }, /* 64.0kbs FB CPE 32 */ /* stereo mode */ + { 48000, 960, 1600, 2 }, /* 80.0kbs FB CPE 33 */ /* stereo mode */ + { 48000, 960, 1600, 1 }, /* 96.0kbs FB CPE 34 */ /* stereo mode */ + { 48000, 960, 1600, 1 } /*128.0kbs FB CPE 35 */ /* stereo mode */ +}; + +#define STCP( a, b ) {{ WORD322WORD16( a ), WORD322WORD16( b ) }} + +const PWord16 SineTable512_fx[] =//Q15 +{ + STCP(0x7fffffff, 0x00000000), STCP(0x7fffd886, 0x006487e3), STCP(0x7fff6216, 0x00c90f88), STCP(0x7ffe9cb2, 0x012d96b1), + STCP(0x7ffd885a, 0x01921d20), STCP(0x7ffc250f, 0x01f6a297), STCP(0x7ffa72d1, 0x025b26d7), STCP(0x7ff871a2, 0x02bfa9a4), + STCP(0x7ff62182, 0x03242abf), STCP(0x7ff38274, 0x0388a9ea), STCP(0x7ff09478, 0x03ed26e6), STCP(0x7fed5791, 0x0451a177), + STCP(0x7fe9cbc0, 0x04b6195d), STCP(0x7fe5f108, 0x051a8e5c), STCP(0x7fe1c76b, 0x057f0035), STCP(0x7fdd4eec, 0x05e36ea9), + STCP(0x7fd8878e, 0x0647d97c), STCP(0x7fd37153, 0x06ac406f), STCP(0x7fce0c3e, 0x0710a345), STCP(0x7fc85854, 0x077501be), + STCP(0x7fc25596, 0x07d95b9e), STCP(0x7fbc040a, 0x083db0a7), STCP(0x7fb563b3, 0x08a2009a), STCP(0x7fae7495, 0x09064b3a), + STCP(0x7fa736b4, 0x096a9049), STCP(0x7f9faa15, 0x09cecf89), STCP(0x7f97cebd, 0x0a3308bd), STCP(0x7f8fa4b0, 0x0a973ba5), + STCP(0x7f872bf3, 0x0afb6805), STCP(0x7f7e648c, 0x0b5f8d9f), STCP(0x7f754e80, 0x0bc3ac35), STCP(0x7f6be9d4, 0x0c27c389), + STCP(0x7f62368f, 0x0c8bd35e), STCP(0x7f5834b7, 0x0cefdb76), STCP(0x7f4de451, 0x0d53db92), STCP(0x7f434563, 0x0db7d376), + STCP(0x7f3857f6, 0x0e1bc2e4), STCP(0x7f2d1c0e, 0x0e7fa99e), STCP(0x7f2191b4, 0x0ee38766), STCP(0x7f15b8ee, 0x0f475bff), + STCP(0x7f0991c4, 0x0fab272b), STCP(0x7efd1c3c, 0x100ee8ad), STCP(0x7ef05860, 0x1072a048), STCP(0x7ee34636, 0x10d64dbd), + STCP(0x7ed5e5c6, 0x1139f0cf), STCP(0x7ec8371a, 0x119d8941), STCP(0x7eba3a39, 0x120116d5), STCP(0x7eabef2c, 0x1264994e), + STCP(0x7e9d55fc, 0x12c8106f), STCP(0x7e8e6eb2, 0x132b7bf9), STCP(0x7e7f3957, 0x138edbb1), STCP(0x7e6fb5f4, 0x13f22f58), + STCP(0x7e5fe493, 0x145576b1), STCP(0x7e4fc53e, 0x14b8b17f), STCP(0x7e3f57ff, 0x151bdf86), STCP(0x7e2e9cdf, 0x157f0086), + STCP(0x7e1d93ea, 0x15e21445), STCP(0x7e0c3d29, 0x16451a83), STCP(0x7dfa98a8, 0x16a81305), STCP(0x7de8a670, 0x170afd8d), + STCP(0x7dd6668f, 0x176dd9de), STCP(0x7dc3d90d, 0x17d0a7bc), STCP(0x7db0fdf8, 0x183366e9), STCP(0x7d9dd55a, 0x18961728), + STCP(0x7d8a5f40, 0x18f8b83c), STCP(0x7d769bb5, 0x195b49ea), STCP(0x7d628ac6, 0x19bdcbf3), STCP(0x7d4e2c7f, 0x1a203e1b), + STCP(0x7d3980ec, 0x1a82a026), STCP(0x7d24881b, 0x1ae4f1d6), STCP(0x7d0f4218, 0x1b4732ef), STCP(0x7cf9aef0, 0x1ba96335), + STCP(0x7ce3ceb2, 0x1c0b826a), STCP(0x7ccda169, 0x1c6d9053), STCP(0x7cb72724, 0x1ccf8cb3), STCP(0x7ca05ff1, 0x1d31774d), + STCP(0x7c894bde, 0x1d934fe5), STCP(0x7c71eaf9, 0x1df5163f), STCP(0x7c5a3d50, 0x1e56ca1e), STCP(0x7c4242f2, 0x1eb86b46), + STCP(0x7c29fbee, 0x1f19f97b), STCP(0x7c116853, 0x1f7b7481), STCP(0x7bf88830, 0x1fdcdc1b), STCP(0x7bdf5b94, 0x203e300d), + STCP(0x7bc5e290, 0x209f701c), STCP(0x7bac1d31, 0x21009c0c), STCP(0x7b920b89, 0x2161b3a0), STCP(0x7b77ada8, 0x21c2b69c), + STCP(0x7b5d039e, 0x2223a4c5), STCP(0x7b420d7a, 0x22847de0), STCP(0x7b26cb4f, 0x22e541af), STCP(0x7b0b3d2c, 0x2345eff8), + STCP(0x7aef6323, 0x23a6887f), STCP(0x7ad33d45, 0x24070b08), STCP(0x7ab6cba4, 0x24677758), STCP(0x7a9a0e50, 0x24c7cd33), + STCP(0x7a7d055b, 0x25280c5e), STCP(0x7a5fb0d8, 0x2588349d), STCP(0x7a4210d8, 0x25e845b6), STCP(0x7a24256f, 0x26483f6c), + STCP(0x7a05eead, 0x26a82186), STCP(0x79e76ca7, 0x2707ebc7), STCP(0x79c89f6e, 0x27679df4), STCP(0x79a98715, 0x27c737d3), + STCP(0x798a23b1, 0x2826b928), STCP(0x796a7554, 0x288621b9), STCP(0x794a7c12, 0x28e5714b), STCP(0x792a37fe, 0x2944a7a2), + STCP(0x7909a92d, 0x29a3c485), STCP(0x78e8cfb2, 0x2a02c7b8), STCP(0x78c7aba2, 0x2a61b101), STCP(0x78a63d11, 0x2ac08026), + STCP(0x78848414, 0x2b1f34eb), STCP(0x786280bf, 0x2b7dcf17), STCP(0x78403329, 0x2bdc4e6f), STCP(0x781d9b65, 0x2c3ab2b9), + STCP(0x77fab989, 0x2c98fbba), STCP(0x77d78daa, 0x2cf72939), STCP(0x77b417df, 0x2d553afc), STCP(0x7790583e, 0x2db330c7), + STCP(0x776c4edb, 0x2e110a62), STCP(0x7747fbce, 0x2e6ec792), STCP(0x77235f2d, 0x2ecc681e), STCP(0x76fe790e, 0x2f29ebcc), + STCP(0x76d94989, 0x2f875262), STCP(0x76b3d0b4, 0x2fe49ba7), STCP(0x768e0ea6, 0x3041c761), STCP(0x76680376, 0x309ed556), + STCP(0x7641af3d, 0x30fbc54d), STCP(0x761b1211, 0x3158970e), STCP(0x75f42c0b, 0x31b54a5e), STCP(0x75ccfd42, 0x3211df04), + STCP(0x75a585cf, 0x326e54c7), STCP(0x757dc5ca, 0x32caab6f), STCP(0x7555bd4c, 0x3326e2c3), STCP(0x752d6c6c, 0x3382fa88), + STCP(0x7504d345, 0x33def287), STCP(0x74dbf1ef, 0x343aca87), STCP(0x74b2c884, 0x34968250), STCP(0x7489571c, 0x34f219a8), + STCP(0x745f9dd1, 0x354d9057), STCP(0x74359cbd, 0x35a8e625), STCP(0x740b53fb, 0x36041ad9), STCP(0x73e0c3a3, 0x365f2e3b), + STCP(0x73b5ebd1, 0x36ba2014), STCP(0x738acc9e, 0x3714f02a), STCP(0x735f6626, 0x376f9e46), STCP(0x7333b883, 0x37ca2a30), + STCP(0x7307c3d0, 0x382493b0), STCP(0x72db8828, 0x387eda8e), STCP(0x72af05a7, 0x38d8fe93), STCP(0x72823c67, 0x3932ff87), + STCP(0x72552c85, 0x398cdd32), STCP(0x7227d61c, 0x39e6975e), STCP(0x71fa3949, 0x3a402dd2), STCP(0x71cc5626, 0x3a99a057), + STCP(0x719e2cd2, 0x3af2eeb7), STCP(0x716fbd68, 0x3b4c18ba), STCP(0x71410805, 0x3ba51e29), STCP(0x71120cc5, 0x3bfdfecd), + STCP(0x70e2cbc6, 0x3c56ba70), STCP(0x70b34525, 0x3caf50da), STCP(0x708378ff, 0x3d07c1d6), STCP(0x70536771, 0x3d600d2c), + STCP(0x7023109a, 0x3db832a6), STCP(0x6ff27497, 0x3e10320d), STCP(0x6fc19385, 0x3e680b2c), STCP(0x6f906d84, 0x3ebfbdcd), + STCP(0x6f5f02b2, 0x3f1749b8), STCP(0x6f2d532c, 0x3f6eaeb8), STCP(0x6efb5f12, 0x3fc5ec98), STCP(0x6ec92683, 0x401d0321), + STCP(0x6e96a99d, 0x4073f21d), STCP(0x6e63e87f, 0x40cab958), STCP(0x6e30e34a, 0x4121589b), STCP(0x6dfd9a1c, 0x4177cfb1), + STCP(0x6dca0d14, 0x41ce1e65), STCP(0x6d963c54, 0x42244481), STCP(0x6d6227fa, 0x427a41d0), STCP(0x6d2dd027, 0x42d0161e), + STCP(0x6cf934fc, 0x4325c135), STCP(0x6cc45698, 0x437b42e1), STCP(0x6c8f351c, 0x43d09aed), STCP(0x6c59d0a9, 0x4425c923), + STCP(0x6c242960, 0x447acd50), STCP(0x6bee3f62, 0x44cfa740), STCP(0x6bb812d1, 0x452456bd), STCP(0x6b81a3cd, 0x4578db93), + STCP(0x6b4af279, 0x45cd358f), STCP(0x6b13fef5, 0x4621647d), STCP(0x6adcc964, 0x46756828), STCP(0x6aa551e9, 0x46c9405c), + STCP(0x6a6d98a4, 0x471cece7), STCP(0x6a359db9, 0x47706d93), STCP(0x69fd614a, 0x47c3c22f), STCP(0x69c4e37a, 0x4816ea86), + STCP(0x698c246c, 0x4869e665), STCP(0x69532442, 0x48bcb599), STCP(0x6919e320, 0x490f57ee), STCP(0x68e06129, 0x4961cd33), + STCP(0x68a69e81, 0x49b41533), STCP(0x686c9b4b, 0x4a062fbd), STCP(0x683257ab, 0x4a581c9e), STCP(0x67f7d3c5, 0x4aa9dba2), + STCP(0x67bd0fbd, 0x4afb6c98), STCP(0x67820bb7, 0x4b4ccf4d), STCP(0x6746c7d8, 0x4b9e0390), STCP(0x670b4444, 0x4bef092d), + STCP(0x66cf8120, 0x4c3fdff4), STCP(0x66937e91, 0x4c9087b1), STCP(0x66573cbb, 0x4ce10034), STCP(0x661abbc5, 0x4d31494b), + STCP(0x65ddfbd3, 0x4d8162c4), STCP(0x65a0fd0b, 0x4dd14c6e), STCP(0x6563bf92, 0x4e210617), STCP(0x6526438f, 0x4e708f8f), + STCP(0x64e88926, 0x4ebfe8a5), STCP(0x64aa907f, 0x4f0f1126), STCP(0x646c59bf, 0x4f5e08e3), STCP(0x642de50d, 0x4faccfab), + STCP(0x63ef3290, 0x4ffb654d), STCP(0x63b0426d, 0x5049c999), STCP(0x637114cc, 0x5097fc5e), STCP(0x6331a9d4, 0x50e5fd6d), + STCP(0x62f201ac, 0x5133cc94), STCP(0x62b21c7b, 0x518169a5), STCP(0x6271fa69, 0x51ced46e), STCP(0x62319b9d, 0x521c0cc2), + STCP(0x61f1003f, 0x5269126e), STCP(0x61b02876, 0x52b5e546), STCP(0x616f146c, 0x53028518), STCP(0x612dc447, 0x534ef1b5), + STCP(0x60ec3830, 0x539b2af0), STCP(0x60aa7050, 0x53e73097), STCP(0x60686ccf, 0x5433027d), STCP(0x60262dd6, 0x547ea073), + STCP(0x5fe3b38d, 0x54ca0a4b), STCP(0x5fa0fe1f, 0x55153fd4), STCP(0x5f5e0db3, 0x556040e2), STCP(0x5f1ae274, 0x55ab0d46), + STCP(0x5ed77c8a, 0x55f5a4d2), STCP(0x5e93dc1f, 0x56400758), STCP(0x5e50015d, 0x568a34a9), STCP(0x5e0bec6e, 0x56d42c99), + STCP(0x5dc79d7c, 0x571deefa), STCP(0x5d8314b1, 0x57677b9d), STCP(0x5d3e5237, 0x57b0d256), STCP(0x5cf95638, 0x57f9f2f8), + STCP(0x5cb420e0, 0x5842dd54), STCP(0x5c6eb258, 0x588b9140), STCP(0x5c290acc, 0x58d40e8c), STCP(0x5be32a67, 0x591c550e), + STCP(0x5b9d1154, 0x59646498), STCP(0x5b56bfbd, 0x59ac3cfd), STCP(0x5b1035cf, 0x59f3de12), STCP(0x5ac973b5, 0x5a3b47ab), + STCP(0x5a82799a, 0x5a82799a) +}; + +/* Lookup-Table for binary logarithm */ +const Word16 ldCoeff[7] =//Q15 +{ + -32768, -16384, -10923, -8192, -6554, -5461, -4681 + /* -4096, -3641, -3277 */ +}; + +/* Lookup-Table for binary power algorithm */ +/* This table is used for lookup 2^x with x in range [0...1.0[ in steps of 1/32 */ +const UWord32 exp2_tab_long[32] =//Q31 +{ + 0x40000000,0x4166C34C,0x42D561B4,0x444C0740, + 0x45CAE0F2,0x47521CC6,0x48E1E9BA,0x4A7A77D4, + 0x4C1BF829,0x4DC69CDD,0x4F7A9930,0x51382182, + 0x52FF6B55,0x54D0AD5A,0x56AC1F75,0x5891FAC1, + 0x5A82799A,0x5C7DD7A4,0x5E8451D0,0x60962665, + 0x62B39509,0x64DCDEC3,0x6712460B,0x69540EC9, + 0x6BA27E65,0x6DFDDBCC,0x70666F76,0x72DC8374, + 0x75606374,0x77F25CCE,0x7A92BE8B,0x7D41D96E +}; + +/* Lookup-Table for binary power algorithm */ +/* This table is used for lookup 2^x with x in range [0...1/32[ in steps of 1/1024 */ +const UWord32 exp2w_tab_long[32] =//Q31 +{ + 0x40000000,0x400B1818,0x4016321B,0x40214E0C, + 0x402C6BE9,0x40378BB4,0x4042AD6D,0x404DD113, + 0x4058F6A8,0x40641E2B,0x406F479E,0x407A7300, + 0x4085A051,0x4090CF92,0x409C00C4,0x40A733E6, + 0x40B268FA,0x40BD9FFF,0x40C8D8F5,0x40D413DD, + 0x40DF50B8,0x40EA8F86,0x40F5D046,0x410112FA, + 0x410C57A2,0x41179E3D,0x4122E6CD,0x412E3152, + 0x41397DCC,0x4144CC3B,0x41501CA0,0x415B6EFB +}; + +/* Lookup-Table for binary power algorithm */ +/* This table is used for lookup 2^x with x in range [0...1/1024[ in steps of 1/32768 */ +const UWord32 exp2x_tab_long[32] =//Q31 +{ + 0x40000000,0x400058B9,0x4000B173,0x40010A2D, + 0x400162E8,0x4001BBA3,0x4002145F,0x40026D1B, + 0x4002C5D8,0x40031E95,0x40037752,0x4003D011, + 0x400428CF,0x4004818E,0x4004DA4E,0x4005330E, + 0x40058BCE,0x4005E48F,0x40063D51,0x40069613, + 0x4006EED5,0x40074798,0x4007A05B,0x4007F91F, + 0x400851E4,0x4008AAA8,0x4009036E,0x40095C33, + 0x4009B4FA,0x400A0DC0,0x400A6688,0x400ABF4F +}; + +/* square root tables */ +const Word32 SqrtTable[32] = /* Q31 */ +{ + 0x5A82D429, 0x5BEA10FE, 0x5D4BE6E5, 0x5EA89270, 0x60004BE2, 0x615347A1, 0x62A1B68C, 0x63EBC651, + 0x6531A1B5, 0x667370D4, 0x67B1595F, 0x68EB7EC8, 0x6A220277, 0x6B5503F0, 0x6C84A0F9, 0x6DB0F5BD, + 0x6EDA1CE9, 0x70002FC7, 0x7123465A, 0x72437773, 0x7360D8C5, 0x747B7EFA, 0x75937DC4, 0x76A8E7EB, + 0x77BBCF60, 0x78CC4545, 0x79DA5A00, 0x7AE61D3E, 0x7BEF9E07, 0x7CF6EAC2, 0x7DFC113F, 0x7EFF1EC0 +}; + +const Word16 SqrtDiffTable[32] = /* Q15 */ +{ + 0x59CF, 0x5875, 0x572B, 0x55EE, 0x54BF, 0x539C, 0x5284, 0x5177, + 0x5074, 0x4F7A, 0x4E89, 0x4DA1, 0x4CC0, 0x4BE7, 0x4B15, 0x4A4A, + 0x4985, 0x48C6, 0x480C, 0x4758, 0x46AA, 0x4600, 0x455B, 0x44BA, + 0x441D, 0x4385, 0x42F1, 0x4260, 0x41D3, 0x414A, 0x40C3, 0x4040 +}; + +const Word32 ISqrtTable[32] = /* Q31 */ +{ + 0x7FFE7F85, 0x7E0A4E25, 0x7C2C56C7, 0x7A63002C, 0x78ACD922, 0x7708939D, 0x75750088, 0x73F10C2D, + 0x727BBB1A, 0x71142774, 0x6FB97EA5, 0x6E6AFF54, 0x6D27F79D, 0x6BEFC388, 0x6AC1CBA4, 0x699D83DA, + 0x68826A53, 0x6770068E, 0x6665E882, 0x6563A7DF, 0x6468E364, 0x63754043, 0x62886999, 0x61A20FEE, + 0x60C1E8C8, 0x5FE7AE45, 0x5F131EBE, 0x5E43FC76, 0x5D7A0D4F, 0x5CB51A81, 0x5BF4F061, 0x5B395E26 +}; + +const Word16 ISqrtDiffTable[32] = /* Q15 */ +{ + 0x7D0C, 0x777E, 0x7256, 0x6D8A, 0x6911, 0x64E5, 0x60FD, 0x5D54, + 0x59E5, 0x56AA, 0x53A0, 0x50C2, 0x4E0D, 0x4B7E, 0x4912, 0x46C6, + 0x4499, 0x4288, 0x4090, 0x3EB1, 0x3CE9, 0x3B36, 0x3996, 0x380A, + 0x368F, 0x3524, 0x33C9, 0x327C, 0x313D, 0x300B, 0x2EE5, 0x2DCA +}; + +/* 1/x tables */ +const Word32 InvTable[32] = /* Q31 */ +{ + 0x7FFBFE40, 0x7C1B608E, 0x78752176, 0x750440BA, 0x71C44C49, 0x6EB14D0A, 0x6BC7B6B4, 0x69045A19, + 0x6664598A, 0x63E51EE2, 0x61845308, 0x5F3FD698, 0x5D15BB8E, 0x5B043FD0, 0x5909C861, 0x5724DD3C, + 0x555425B2, 0x53966532, 0x51EA787F, 0x504F5331, 0x4EC3FD84, 0x4D479267, 0x4BD93DBE, 0x4A783ADC, + 0x4923D31D, 0x47DB5CAE, 0x469E3974, 0x456BD608, 0x4443A8D9, 0x43253159, 0x420FF746, 0x41038A01 +}; + +const Word16 InvDiffTable[32] = /* Q15 */ +{ + 0x7C14, 0x74C8, 0x6E1C, 0x67FF, 0x6260, 0x5D33, 0x586C, 0x5400, + 0x4FE7, 0x4C19, 0x4890, 0x4543, 0x422F, 0x3F4F, 0x3C9D, 0x3A17, + 0x37B8, 0x357E, 0x3365, 0x316B, 0x2F8D, 0x2DCB, 0x2C20, 0x2A8D, + 0x290F, 0x27A4, 0x264C, 0x2506, 0x23CF, 0x22A7, 0x218E, 0x2081 +}; + +const Word16 tcx_mdct_window_48_fx[420] =//Q15 +{ 61, 183, 306, 428, 551, 673, 796, 919, 1041, 1163, 1286, +1408, 1531, 1653, 1776, 1898, 2020, 2143, 2265, 2387, 2509, +2632, 2754, 2876, 2998, 3120, 3242, 3364, 3486, 3607, 3729, +3851, 3973, 4094, 4216, 4337, 4459, 4580, 4701, 4823, 4944, +5065, 5186, 5307, 5428, 5549, 5669, 5790, 5911, 6031, 6152, +6272, 6392, 6512, 6632, 6752, 6872, 6992, 7112, 7231, 7351, +7470, 7589, 7709, 7828, 7947, 8065, 8184, 8303, 8421, 8540, +8658, 8776, 8894, 9012, 9130, 9247, 9365, 9482, 9599, 9717, +9834, 9950, 10067, 10184, 10300, 10416, 10532, 10648, 10764, 10880, +10995, 11111, 11226, 11341, 11456, 11571, 11685, 11800, 11914, 12028, +12142, 12256, 12369, 12483, 12596, 12709, 12822, 12934, 13047, 13159, +13271, 13383, 13495, 13607, 13718, 13829, 13940, 14051, 14162, 14272, +14382, 14492, 14602, 14712, 14821, 14930, 15039, 15148, 15257, 15365, +15473, 15581, 15689, 15796, 15904, 16011, 16117, 16224, 16330, 16437, +16542, 16648, 16754, 16859, 16964, 17068, 17173, 17277, 17381, 17485, +17589, 17692, 17795, 17898, 18000, 18102, 18204, 18306, 18408, 18509, +18610, 18711, 18811, 18911, 19011, 19111, 19210, 19310, 19408, 19507, +19605, 19703, 19801, 19899, 19996, 20093, 20190, 20286, 20382, 20478, +20573, 20669, 20764, 20858, 20953, 21047, 21140, 21234, 21327, 21420, +21513, 21605, 21697, 21789, 21880, 21971, 22062, 22152, 22242, 22332, +22422, 22511, 22600, 22688, 22777, 22865, 22952, 23040, 23127, 23213, +23300, 23386, 23471, 23557, 23642, 23726, 23811, 23895, 23978, 24062, +24145, 24227, 24310, 24392, 24473, 24555, 24636, 24716, 24797, 24877, +24956, 25035, 25114, 25193, 25271, 25349, 25426, 25504, 25580, 25657, +25733, 25808, 25884, 25959, 26033, 26108, 26181, 26255, 26328, 26401, +26473, 26545, 26617, 26688, 26759, 26830, 26900, 26970, 27039, 27108, +27177, 27245, 27313, 27381, 27448, 27514, 27581, 27647, 27712, 27778, +27842, 27907, 27971, 28034, 28098, 28161, 28223, 28285, 28347, 28408, +28469, 28529, 28589, 28649, 28708, 28767, 28826, 28884, 28942, 28999, +29056, 29112, 29168, 29224, 29279, 29334, 29388, 29442, 29496, 29549, +29602, 29654, 29706, 29758, 29809, 29859, 29910, 29959, 30009, 30058, +30106, 30155, 30202, 30250, 30297, 30343, 30389, 30435, 30480, 30525, +30569, 30613, 30656, 30700, 30742, 30784, 30826, 30867, 30908, 30949, +30989, 31029, 31068, 31106, 31145, 31183, 31220, 31257, 31294, 31330, +31365, 31401, 31435, 31470, 31504, 31537, 31570, 31603, 31635, 31667, +31698, 31729, 31759, 31789, 31819, 31848, 31876, 31905, 31932, 31960, +31986, 32013, 32039, 32064, 32089, 32114, 32138, 32162, 32185, 32208, +32230, 32252, 32273, 32294, 32315, 32335, 32354, 32374, 32392, 32411, +32428, 32446, 32463, 32479, 32495, 32511, 32526, 32540, 32555, 32568, +32582, 32594, 32607, 32619, 32630, 32641, 32652, 32662, 32671, 32680, +32689, 32697, 32705, 32712, 32719, 32726, 32732, 32737, 32742, 32747, +32751, 32755, 32758, 32761, 32763, 32765, 32766, 32767, 32767 }; + +const Word16 tcx_mdct_window_half_48_fx[180] =//Q15 +{ + 142, 428, 714, 1000, 1286, 1572, 1857, 2143, 2428, 2713, 2998, +3282, 3567, 3851, 4135, 4418, 4701, 4984, 5267, 5549, 5830, +6112, 6392, 6672, 6952, 7231, 7510, 7788, 8065, 8342, 8619, +8894, 9169, 9443, 9717, 9989, 10261, 10532, 10803, 11072, 11341, +11609, 11876, 12142, 12407, 12671, 12934, 13197, 13458, 13718, 13977, +14235, 14492, 14748, 15003, 15257, 15509, 15761, 16011, 16260, 16507, +16754, 16999, 17242, 17485, 17726, 17966, 18204, 18441, 18677, 18911, +19144, 19376, 19605, 19834, 20061, 20286, 20510, 20732, 20953, 21172, +21389, 21605, 21819, 22032, 22242, 22452, 22659, 22865, 23069, 23271, +23471, 23670, 23867, 24062, 24255, 24446, 24636, 24823, 25009, 25193, +25375, 25555, 25733, 25909, 26083, 26255, 26425, 26593, 26759, 26923, +27085, 27245, 27403, 27559, 27712, 27864, 28013, 28161, 28306, 28449, +28589, 28728, 28865, 28999, 29131, 29261, 29388, 29514, 29637, 29758, +29876, 29992, 30106, 30218, 30328, 30435, 30540, 30642, 30742, 30840, +30935, 31029, 31119, 31208, 31294, 31377, 31458, 31537, 31614, 31688, +31759, 31828, 31895, 31960, 32021, 32081, 32138, 32192, 32245, 32294, +32341, 32386, 32428, 32468, 32506, 32540, 32573, 32603, 32630, 32655, +32677, 32697, 32715, 32730, 32742, 32752, 32760, 32765, 32767 }; + + +const Word16 tcx_mdct_window_trans_48_fx[60] =//Q15 +{ 428, 1286, 2143, 2998, 3851, 4701, 5549, 6392, 7231, 8065, 8894, +9717, 10532, 11341, 12142, 12934, 13718, 14492, 15257, 16011, 16754, +17485, 18204, 18911, 19605, 20286, 20953, 21605, 22242, 22865, 23471, +24062, 24636, 25193, 25733, 26255, 26759, 27245, 27712, 28161, 28589, +28999, 29388, 29758, 30106, 30435, 30742, 31029, 31294, 31537, 31759, +31960, 32138, 32294, 32428, 32540, 32630, 32697, 32742, 32765 +}; -#include "prot_fx.h" -#include "basop_util.h" -#include "wmc_auto.h" -#include "rom_com_fx.h" +/*----------------------------------------------------------------------------------* + * SWB TBE LSF tables (1.75 kbps) + *----------------------------------------------------------------------------------*/ + +const Word32 sigma_BWE_fx[] = {//Q31 +17011214, 16701976, 17561200, +17474996, 19251270, 20645372, 39204284, +40792208, 18917444, 18895726, 19477682, +19499580, 20916386, 22705246, 39204284, +40792208 }; /* for 3 bits first stage */ + + +const Word16 inv_modified_sigma_BWE_fx[] = {//x2.56 +323, +329, +313, +314, +285, +266, +140, +134, +290, +290, +282, +281, +262, +242, +140, +134 +}; + +const Word16 modified_sigma_BWE_fx[] =//Q15 +{ 259, +254, +267, +266, +293, +315, +598, +622, +288, +288, +297, +297, +319, +346, +598, +622 }; + + +const Word16 SHB_LSF_mean_fx[10] = {//Q15 +1353, 2646, 4046, +5428, 6896, 8339, 9863, +11368, 12977, 14558 +}; + +/* 4 bit VQ first stage */ +/* An 6-by-16 matrix */ + +const Word16 SHB_LSF_VQ4_fx[96] =//Q15 +{ 150, 51, -507, -986, -1115, -944, +-184, -77, 95, 232, 440, 497, -115, +-107, -109, -242, -446, -592, 387, 799, +1132, 1263, 1259, 1122, -128, -599, -1214, +-1389, -1319, -1016, 533, 424, 148, -125, +-378, -501, -337, -590, -587, -630, -715, +-750, 504, 849, 750, 508, 234, 68, +176, -177, -407, 327, 206, 21, -107, +341, 423, 264, -17, -180, -110, -381, +-716, -725, -232, -42, 170, 265, 273, +336, 397, 450, 69, 285, 519, 686, +656, 564, 120, 115, -123, -382, -19, +234, -377, -629, -296, -95, 21, 63, +-206, -456, 518, 472, 179, 22 }; +/* 3 bit VQ first stage */ +const Word16 SHB_LSF_VQ3_fx[48] =//Q15 +{ 278, 403, 285, 65, -206, -337, +386, 770, 838, 753, 599, 445, -196, +-455, -609, -524, -206, -78, 39, 199, +393, 514, 491, 462, -91, -435, -979, +-1241, -1225, -976, -52, -98, -216, -422, +-599, -688, 127, 137, 0, 52, 301, +412, -278, -422, 9, 199, 137, 72 }; +const Word16 *const cb_LSF_BWE_fx[] = { SHB_LSF_VQ4_fx, SHB_LSF_VQ3_fx }; // Q15 + +const Word16 mslvq_SHB_min_bits[] = {14, 12}; /* for 4 bits and 3 bits respectively Q0*/ + +const Word16 scales_BWE_fx[] = {//Q13 +7634, 13737, +23027, 7299, 14499, +24592, 6955, 14491, +26427 }; + +const Word16 scales_BWE_fx_new[] = {//Q11 + +1908, +3434, +5756, +1824, +3624, +6148, +1738, +3622, +6606 +}; +const Word8 no_lead_BWE[] = { // Q0 + 8, 6, 5, /* 14 bits */ + 10,9,5, /* 15 bits*/ + 16, 11, 5}; /* 16 bits */ + +const Word16 scales_BWE_3b_fx[] = {//Q13 +7847, 14262, +28934, 7610, 12771, +21544, 7249, 12689, +23060 }; + +const Word16 scales_BWE_3b_fx_new[] = {//Q11 + 1961, +3565, +7233, +1902, +3192, +5386, +1812, +3172, +5765 +}; + +const Word8 no_lead_BWE_3b[] = { // Q0 + 4, 5, 2, /* 12 bits */ + 5, 5, 5, /* 13 bits */ + 8, 6, 5 /* 14 bits */ + }; + +const Word32 LastCoefPred_0bit_fx[18] =//Q31 +{ +10930692, -29356102, -14495515, +-11918534, 3435973, 89292368, 269423296, +1105954048, 0, 17544942, -13851270, +-20121922, -15590731, 7795365, 46127948, +176888224, 438086656, 0 }; + + +const Word32 LastCoefPred_1bit_fx[36] = {//Q31 +37795712, -47094316, 24910810, +18060338, 38268160, 87424056, 217346816, +810181184, 9685151, 53107272, -26843546, +11703786, -7301444, 20444044, 22655952, +138448272, 307648512, 9234180 }; + +const Word16 config_LSF_BWE[] = { // Q0 + 4, 16, 1, /* 21 bits */ + 4, 16, 1, /* 20 */ + 4, 16, 1, /* 19 */ + 3, 8, 1, /* 18 */ + 3, 8, 1, /* 17 */ + 3, 8, 0 /* 16 */ +}; + +//basops +const Word32 BASOP_util_normReciprocal[CHEAP_NORM_SIZE] = +{ + 0l/*0.0 Q31*/, 2147483647l/*1.0000000000 Q31*/, 1073741824l/*0.5000000000 Q31*/, 715827883l/*0.3333333333 Q31*/, 536870912l/*0.2500000000 Q31*/, 429496730l/*0.2000000000 Q31*/, + 357913941l/*0.1666666667 Q31*/, 306783378l/*0.1428571429 Q31*/, 268435456l/*0.1250000000 Q31*/, 238609294l/*0.1111111111 Q31*/, 214748365l/*0.1000000000 Q31*/, 195225786l/*0.0909090909 Q31*/, + 178956971l/*0.0833333333 Q31*/, 165191050l/*0.0769230769 Q31*/, 153391689l/*0.0714285714 Q31*/, 143165577l/*0.0666666667 Q31*/, 134217728l/*0.0625000000 Q31*/, 126322568l/*0.0588235294 Q31*/, + 119304647l/*0.0555555556 Q31*/, 113025455l/*0.0526315789 Q31*/, 107374182l/*0.0500000000 Q31*/, 102261126l/*0.0476190476 Q31*/, 97612893l/*0.0454545455 Q31*/, 93368854l/*0.0434782609 Q31*/, + 89478485l/*0.0416666667 Q31*/, 85899346l/*0.0400000000 Q31*/, 82595525l/*0.0384615385 Q31*/, 79536431l/*0.0370370370 Q31*/, 76695845l/*0.0357142857 Q31*/, 74051160l/*0.0344827586 Q31*/, + 71582788l/*0.0333333333 Q31*/, 69273666l/*0.0322580645 Q31*/, 67108864l/*0.0312500000 Q31*/, 65075262l/*0.0303030303 Q31*/, 63161284l/*0.0294117647 Q31*/, 61356676l/*0.0285714286 Q31*/, + 59652324l/*0.0277777778 Q31*/, 58040099l/*0.0270270270 Q31*/, 56512728l/*0.0263157895 Q31*/, 55063683l/*0.0256410256 Q31*/, 53687091l/*0.0250000000 Q31*/, 52377650l/*0.0243902439 Q31*/, + 51130563l/*0.0238095238 Q31*/, 49941480l/*0.0232558140 Q31*/, 48806446l/*0.0227272727 Q31*/, 47721859l/*0.0222222222 Q31*/, 46684427l/*0.0217391304 Q31*/, 45691141l/*0.0212765957 Q31*/, + 44739243l/*0.0208333333 Q31*/, 43826197l/*0.0204081633 Q31*/, 42949673l/*0.0200000000 Q31*/, 42107522l/*0.0196078431 Q31*/, 41297762l/*0.0192307692 Q31*/, 40518559l/*0.0188679245 Q31*/, + 39768216l/*0.0185185185 Q31*/, 39045157l/*0.0181818182 Q31*/, 38347922l/*0.0178571429 Q31*/, 37675152l/*0.0175438596 Q31*/, 37025580l/*0.0172413793 Q31*/, 36398028l/*0.0169491525 Q31*/, + 35791394l/*0.0166666667 Q31*/, 35204650l/*0.0163934426 Q31*/, 34636833l/*0.0161290323 Q31*/, 34087042l/*0.0158730159 Q31*/, 33554432l/*0.0156250000 Q31*/, 33038210l/*0.0153846154 Q31*/, + 32537631l/*0.0151515152 Q31*/, 32051995l/*0.0149253731 Q31*/, 31580642l/*0.0147058824 Q31*/, 31122951l/*0.0144927536 Q31*/, 30678338l/*0.0142857143 Q31*/, 30246248l/*0.0140845070 Q31*/, + 29826162l/*0.0138888889 Q31*/, 29417584l/*0.0136986301 Q31*/, 29020049l/*0.0135135135 Q31*/, 28633115l/*0.0133333333 Q31*/, 28256364l/*0.0131578947 Q31*/, 27889398l/*0.0129870130 Q31*/, + 27531842l/*0.0128205128 Q31*/, 27183337l/*0.0126582278 Q31*/, 26843546l/*0.0125000000 Q31*/, 26512144l/*0.0123456790 Q31*/, 26188825l/*0.0121951220 Q31*/, 25873297l/*0.0120481928 Q31*/, + 25565282l/*0.0119047619 Q31*/, 25264514l/*0.0117647059 Q31*/, 24970740l/*0.0116279070 Q31*/, 24683720l/*0.0114942529 Q31*/, 24403223l/*0.0113636364 Q31*/, 24129030l/*0.0112359551 Q31*/, + 23860929l/*0.0111111111 Q31*/, 23598721l/*0.0109890110 Q31*/, 23342214l/*0.0108695652 Q31*/, 23091222l/*0.0107526882 Q31*/, 22845571l/*0.0106382979 Q31*/, 22605091l/*0.0105263158 Q31*/, + 22369621l/*0.0104166667 Q31*/, 22139007l/*0.0103092784 Q31*/, 21913098l/*0.0102040816 Q31*/, 21691754l/*0.0101010101 Q31*/, 21474836l/*0.0100000000 Q31*/, 21262214l/*0.0099009901 Q31*/, + 21053761l/*0.0098039216 Q31*/, 20849356l/*0.0097087379 Q31*/, 20648881l/*0.0096153846 Q31*/, 20452225l/*0.0095238095 Q31*/, 20259280l/*0.0094339623 Q31*/, 20069941l/*0.0093457944 Q31*/, + 19884108l/*0.0092592593 Q31*/, 19701685l/*0.0091743119 Q31*/, 19522579l/*0.0090909091 Q31*/, 19346700l/*0.0090090090 Q31*/, 19173961l/*0.0089285714 Q31*/, 19004280l/*0.0088495575 Q31*/, + 18837576l/*0.0087719298 Q31*/, 18673771l/*0.0086956522 Q31*/, 18512790l/*0.0086206897 Q31*/, 18354561l/*0.0085470085 Q31*/, 18199014l/*0.0084745763 Q31*/, 18046081l/*0.0084033613 Q31*/, + 17895697l/*0.0083333333 Q31*/, 17747799l/*0.0082644628 Q31*/, 17602325l/*0.0081967213 Q31*/, 17459217l/*0.0081300813 Q31*/, 17318416l/*0.0080645161 Q31*/, 17179869l/*0.0080000000 Q31*/, + 17043521l/*0.0079365079 Q31*/, 16909320l/*0.0078740157 Q31*/, 16777216l/*0.0078125000 Q31*/, 16647160l/*0.0077519380 Q31*/, 16519105l/*0.0076923077 Q31*/, 16393005l/*0.0076335878 Q31*/, + 16268816l/*0.0075757576 Q31*/, 16146494l/*0.0075187970 Q31*/, 16025997l/*0.0074626866 Q31*/, 15907286l/*0.0074074074 Q31*/, 15790321l/*0.0073529412 Q31*/, 15675063l/*0.0072992701 Q31*/, + 15561476l/*0.0072463768 Q31*/, 15449523l/*0.0071942446 Q31*/, 15339169l/*0.0071428571 Q31*/, 15230381l/*0.0070921986 Q31*/, 15123124l/*0.0070422535 Q31*/, 15017368l/*0.0069930070 Q31*/, + 14913081l/*0.0069444444 Q31*/, 14810232l/*0.0068965517 Q31*/, 14708792l/*0.0068493151 Q31*/, 14608732l/*0.0068027211 Q31*/, 14510025l/*0.0067567568 Q31*/, 14412642l/*0.0067114094 Q31*/, + 14316558l/*0.0066666667 Q31*/, 14221746l/*0.0066225166 Q31*/, 14128182l/*0.0065789474 Q31*/, 14035841l/*0.0065359477 Q31*/, 13944699l/*0.0064935065 Q31*/, 13854733l/*0.0064516129 Q31*/, + 13765921l/*0.0064102564 Q31*/, 13678240l/*0.0063694268 Q31*/, 13591669l/*0.0063291139 Q31*/, 13506187l/*0.0062893082 Q31*/, 13421773l/*0.0062500000 Q31*/ +}; + +const Word16 f_atan_expand_range[MAXSFTAB - (MINSFTAB - 1)] = +{ + /***************************************************************************** + * + * Table holds fixp_atan() output values which are outside of input range + * of fixp_atan() to improve SNR of fixp_atan2(). + * + * This Table might also be used in fixp_atan() [todo] so there a wider input + * range can be covered, too. + * + * Matlab (generate table): + * for scl = 7:25 % MINSFTAB .. MAXSFTAB + * at=atan(0.5 *(2^scl)); % 0.5 because get in 'middle' area of current scale level 'scl' + * at/2 % div at by ATO_SCALE + * end + * + * Table divided by 2=ATO_SCALE <-- SF=ATO_SF + *****************************************************************************/ + 25480/*7.775862990872099e-001 Q15*/, 25608/*7.814919928673978e-001 Q15*/, 25672/*7.834450483314648e-001 Q15*/, + 25704/*7.844216021392089e-001 Q15*/, 25720/*7.849098823026687e-001 Q15*/, 25728/*7.851540227918509e-001 Q15*/, + 25732/*7.852760930873737e-001 Q15*/, 25734/*7.853371282415015e-001 Q15*/, 25735/*7.853676458193612e-001 Q15*/, + 25735/*7.853829046083906e-001 Q15*/, 25736/*7.853905340029177e-001 Q15*/, 25736/*7.853943487001828e-001 Q15*/, + 25736/*7.853962560488155e-001 Q15*/, 25736/*7.853972097231319e-001 Q15*/, 25736/*7.853976865602901e-001 Q15*/, + 25736/*7.853979249788692e-001 Q15*/, 25736/*7.853980441881587e-001 Q15*/, 25736/*7.853981037928035e-001 Q15*/, + 25736/*7.853981335951259e-001 Q15*/ + /* pi/4 = 0.785398163397448 = pi/2/ATO_SCALE */ +}; + + +const Word16 Grid[GRID100_POINTS + 1] =//Q15 +{ + 32767, 32751, 32703, 32622, 32509, 32364, + 32187, 31978, 31738, 31466, 31164, 30830, + 30466, 30072, 29649, 29196, 28714, 28204, + 27666, 27101, 26509, 25891, 25248, 24579, + 23886, 23170, 22431, 21669, 20887, 20083, + 19260, 18418, 17557, 16680, 15786, 14876, + 13951, 13013, 12062, 11099, 10125, 9141, + 8149, 7148, 6140, 5126, 4106, 3083, + 2057, 1029, 0, -1029, -2057, -3083, + -4106, -5126, -6140, -7148, -8149, -9141, + -10125, -11099, -12062, -13013, -13951, -14876, + -15786, -16680, -17557, -18418, -19260, -20083, + -20887, -21669, -22431, -23170, -23886, -24579, + -25248, -25891, -26509, -27101, -27666, -28204, + -28714, -29196, -29649, -30072, -30466, -30830, + -31164, -31466, -31738, -31978, -32187, -32364, + -32509, -32622, -32703, -32751, -32760 +}; + +const Word16 pwAlpha[10] = { 0x6666, 0x51ec, 0x4189, 0x346e, 0x29f1,//Q15 + 0x218e, 0x1ad8, 0x157a, 0x112e, 0x0dbe +}; + +/* Used in 'lsp2lsf_fx.c' */ +const Word8 Ind_Guess[256] = +{ + 126, 122, 120, 119, 117, 116, 115, 114, + 113, 112, 111, 110, 110, 109, 108, 108, + 107, 106, 106, 105, 104, 104, 103, 103, + 102, 102, 101, 101, 100, 100, 99, 99, + 98, 98, 97, 97, 96, 96, 95, 95, + 94, 94, 94, 93, 93, 92, 92, 91, + 91, 91, 90, 90, 89, 89, 89, 88, + 88, 87, 87, 87, 86, 86, 86, 85, + 85, 84, 84, 84, 83, 83, 83, 82, + 82, 82, 81, 81, 81, 80, 80, 80, + 79, 79, 78, 78, 78, 77, 77, 77, + 76, 76, 76, 75, 75, 75, 74, 74, + 74, 73, 73, 73, 72, 72, 72, 72, + 71, 71, 71, 70, 70, 70, 69, 69, + 69, 68, 68, 68, 67, 67, 67, 66, + 66, 66, 65, 65, 65, 64, 64, 64, + 64, 63, 63, 63, 62, 62, 62, 61, + 61, 61, 60, 60, 60, 59, 59, 59, + 58, 58, 58, 57, 57, 57, 56, 56, + 56, 55, 55, 55, 55, 54, 54, 54, + 53, 53, 53, 52, 52, 52, 51, 51, + 51, 50, 50, 50, 49, 49, 49, 48, + 48, 47, 47, 47, 46, 46, 46, 45, + 45, 45, 44, 44, 44, 43, 43, 43, + 42, 42, 41, 41, 41, 40, 40, 40, + 39, 39, 38, 38, 38, 37, 37, 36, + 36, 36, 35, 35, 34, 34, 33, 33, + 33, 32, 32, 31, 31, 30, 30, 29, + 29, 28, 28, 27, 27, 26, 26, 25, + 25, 24, 24, 23, 23, 22, 21, 21, + 20, 19, 19, 18, 17, 17, 16, 15, + 14, 13, 12, 11, 10, 8, 7, 5 +}; + +const Word16 cos_table_129[129] =//Q15 +{ + 32767, + 32758, 32729, 32679, 32610, 32522, 32413, 32286, 32138, + 31972, 31786, 31581, 31357, 31114, 30853, 30572, 30274, + 29957, 29622, 29269, 28899, 28511, 28106, 27684, 27246, + 26791, 26320, 25833, 25330, 24812, 24279, 23732, 23170, + 22595, 22006, 21403, 20788, 20160, 19520, 18868, 18205, + 17531, 16846, 16151, 15447, 14733, 14010, 13279, 12540, + 11793, 11039, 10279, 9512, 8740, 7962, 7180, 6393, + 5602, 4808, 4011, 3212, 2411, 1608, 804, 0, + -804, -1608, -2411, -3212, -4011, -4808, -5602, -6393, + -7180, -7962, -8740, -9512, -10279, -11039, -11793, -12540, + -13279, -14010, -14733, -15447, -16151, -16846, -17531, -18205, + -18868, -19520, -20160, -20788, -21403, -22006, -22595, -23170, + -23732, -24279, -24812, -25330, -25833, -26320, -26791, -27246, + -27684, -28106, -28511, -28899, -29269, -29622, -29957, -30274, + -30572, -30853, -31114, -31357, -31581, -31786, -31972, -32138, + -32286, -32413, -32522, -32610, -32679, -32729, -32758, -32768 +}; + +const Word16 acos_slope[128] =//Q15 +{ + -26214, -9039, -5243, -3799, -2979, -2405, -2064, -1771, + -1579, -1409, -1279, -1170, -1079, -1004, -933, -880, + -827, -783, -743, -708, -676, -647, -621, -599, + -576, -557, -538, -521, -506, -492, -479, -466, + -456, -445, -435, -426, -417, -410, -402, -395, + -389, -383, -377, -372, -367, -363, -359, -355, + -351, -348, -345, -342, -340, -337, -335, -333, + -331, -330, -329, -328, -327, -326, -326, -326, + -326, -326, -326, -327, -328, -329, -330, -331, + -333, -335, -337, -340, -342, -345, -348, -351, + -355, -359, -363, -367, -372, -377, -383, -389, + -395, -402, -410, -417, -426, -435, -445, -456, + -466, -479, -492, -506, -521, -538, -557, -576, + -599, -621, -647, -676, -708, -743, -783, -827, + -880, -933, -1004, -1079, -1170, -1279, -1409, -1579, + -1771, -2064, -2405, -2979, -3799, -5243, -9039,-26214 +}; + + +const Word16 cos_coef_new[4] = { SHC(0x02BA), SHC(0xE60A), SHC(0xEEEF), SHC(0xAAAB) };//Q15 + +const Word16 cos_table[512] =//Q15 +{ + SHC(0x7fff), + SHC(0x7ffe), + SHC(0x7ff6), + SHC(0x7fea), + SHC(0x7fd9), + SHC(0x7fc2), + SHC(0x7fa7), + SHC(0x7f87), + SHC(0x7f62), + SHC(0x7f38), + SHC(0x7f0a), + SHC(0x7ed6), + SHC(0x7e9d), + SHC(0x7e60), + SHC(0x7e1e), + SHC(0x7dd6), + SHC(0x7d8a), + SHC(0x7d3a), + SHC(0x7ce4), + SHC(0x7c89), + SHC(0x7c2a), + SHC(0x7bc6), + SHC(0x7b5d), + SHC(0x7aef), + SHC(0x7a7d), + SHC(0x7a06), + SHC(0x798a), + SHC(0x790a), + SHC(0x7885), + SHC(0x77fb), + SHC(0x776c), + SHC(0x76d9), + SHC(0x7642), + SHC(0x75a6), + SHC(0x7505), + SHC(0x7460), + SHC(0x73b6), + SHC(0x7308), + SHC(0x7255), + SHC(0x719e), + SHC(0x70e3), + SHC(0x7023), + SHC(0x6f5f), + SHC(0x6e97), + SHC(0x6dca), + SHC(0x6cf9), + SHC(0x6c24), + SHC(0x6b4b), + SHC(0x6a6e), + SHC(0x698c), + SHC(0x68a7), + SHC(0x67bd), + SHC(0x66d0), + SHC(0x65de), + SHC(0x64e9), + SHC(0x63ef), + SHC(0x62f2), + SHC(0x61f1), + SHC(0x60ec), + SHC(0x5fe4), + SHC(0x5ed7), + SHC(0x5dc8), + SHC(0x5cb4), + SHC(0x5b9d), + SHC(0x5a82), + SHC(0x5964), + SHC(0x5843), + SHC(0x571e), + SHC(0x55f6), + SHC(0x54ca), + SHC(0x539b), + SHC(0x5269), + SHC(0x5134), + SHC(0x4ffb), + SHC(0x4ec0), + SHC(0x4d81), + SHC(0x4c40), + SHC(0x4afb), + SHC(0x49b4), + SHC(0x486a), + SHC(0x471d), + SHC(0x45cd), + SHC(0x447b), + SHC(0x4326), + SHC(0x41ce), + SHC(0x4074), + SHC(0x3f17), + SHC(0x3db8), + SHC(0x3c57), + SHC(0x3af3), + SHC(0x398d), + SHC(0x3825), + SHC(0x36ba), + SHC(0x354e), + SHC(0x33df), + SHC(0x326e), + SHC(0x30fc), + SHC(0x2f87), + SHC(0x2e11), + SHC(0x2c99), + SHC(0x2b1f), + SHC(0x29a4), + SHC(0x2827), + SHC(0x26a8), + SHC(0x2528), + SHC(0x23a7), + SHC(0x2224), + SHC(0x209f), + SHC(0x1f1a), + SHC(0x1d93), + SHC(0x1c0c), + SHC(0x1a83), + SHC(0x18f9), + SHC(0x176e), + SHC(0x15e2), + SHC(0x1455), + SHC(0x12c8), + SHC(0x113a), + SHC(0xfab), + SHC(0xe1c), + SHC(0xc8c), + SHC(0xafb), + SHC(0x96b), + SHC(0x7d9), + SHC(0x648), + SHC(0x4b6), + SHC(0x324), + SHC(0x192), + SHC(0x0), + SHC(0xfe6e), + SHC(0xfcdc), + SHC(0xfb4a), + SHC(0xf9b8), + SHC(0xf827), + SHC(0xf695), + SHC(0xf505), + SHC(0xf374), + SHC(0xf1e4), + SHC(0xf055), + SHC(0xeec6), + SHC(0xed38), + SHC(0xebab), + SHC(0xea1e), + SHC(0xe892), + SHC(0xe707), + SHC(0xe57d), + SHC(0xe3f4), + SHC(0xe26d), + SHC(0xe0e6), + SHC(0xdf61), + SHC(0xdddc), + SHC(0xdc59), + SHC(0xdad8), + SHC(0xd958), + SHC(0xd7d9), + SHC(0xd65c), + SHC(0xd4e1), + SHC(0xd367), + SHC(0xd1ef), + SHC(0xd079), + SHC(0xcf04), + SHC(0xcd92), + SHC(0xcc21), + SHC(0xcab2), + SHC(0xc946), + SHC(0xc7db), + SHC(0xc673), + SHC(0xc50d), + SHC(0xc3a9), + SHC(0xc248), + SHC(0xc0e9), + SHC(0xbf8c), + SHC(0xbe32), + SHC(0xbcda), + SHC(0xbb85), + SHC(0xba33), + SHC(0xb8e3), + SHC(0xb796), + SHC(0xb64c), + SHC(0xb505), + SHC(0xb3c0), + SHC(0xb27f), + SHC(0xb140), + SHC(0xb005), + SHC(0xaecc), + SHC(0xad97), + SHC(0xac65), + SHC(0xab36), + SHC(0xaa0a), + SHC(0xa8e2), + SHC(0xa7bd), + SHC(0xa69c), + SHC(0xa57e), + SHC(0xa463), + SHC(0xa34c), + SHC(0xa238), + SHC(0xa129), + SHC(0xa01c), + SHC(0x9f14), + SHC(0x9e0f), + SHC(0x9d0e), + SHC(0x9c11), + SHC(0x9b17), + SHC(0x9a22), + SHC(0x9930), + SHC(0x9843), + SHC(0x9759), + SHC(0x9674), + SHC(0x9592), + SHC(0x94b5), + SHC(0x93dc), + SHC(0x9307), + SHC(0x9236), + SHC(0x9169), + SHC(0x90a1), + SHC(0x8fdd), + SHC(0x8f1d), + SHC(0x8e62), + SHC(0x8dab), + SHC(0x8cf8), + SHC(0x8c4a), + SHC(0x8ba0), + SHC(0x8afb), + SHC(0x8a5a), + SHC(0x89be), + SHC(0x8927), + SHC(0x8894), + SHC(0x8805), + SHC(0x877b), + SHC(0x86f6), + SHC(0x8676), + SHC(0x85fa), + SHC(0x8583), + SHC(0x8511), + SHC(0x84a3), + SHC(0x843a), + SHC(0x83d6), + SHC(0x8377), + SHC(0x831c), + SHC(0x82c6), + SHC(0x8276), + SHC(0x822a), + SHC(0x81e2), + SHC(0x81a0), + SHC(0x8163), + SHC(0x812a), + SHC(0x80f6), + SHC(0x80c8), + SHC(0x809e), + SHC(0x8079), + SHC(0x8059), + SHC(0x803e), + SHC(0x8027), + SHC(0x8016), + SHC(0x800a), + SHC(0x8002), + SHC(0x8001), + SHC(0x8002), + SHC(0x800a), + SHC(0x8016), + SHC(0x8027), + SHC(0x803e), + SHC(0x8059), + SHC(0x8079), + SHC(0x809e), + SHC(0x80c8), + SHC(0x80f6), + SHC(0x812a), + SHC(0x8163), + SHC(0x81a0), + SHC(0x81e2), + SHC(0x822a), + SHC(0x8276), + SHC(0x82c6), + SHC(0x831c), + SHC(0x8377), + SHC(0x83d6), + SHC(0x843a), + SHC(0x84a3), + SHC(0x8511), + SHC(0x8583), + SHC(0x85fa), + SHC(0x8676), + SHC(0x86f6), + SHC(0x877b), + SHC(0x8805), + SHC(0x8894), + SHC(0x8927), + SHC(0x89be), + SHC(0x8a5a), + SHC(0x8afb), + SHC(0x8ba0), + SHC(0x8c4a), + SHC(0x8cf8), + SHC(0x8dab), + SHC(0x8e62), + SHC(0x8f1d), + SHC(0x8fdd), + SHC(0x90a1), + SHC(0x9169), + SHC(0x9236), + SHC(0x9307), + SHC(0x93dc), + SHC(0x94b5), + SHC(0x9592), + SHC(0x9674), + SHC(0x9759), + SHC(0x9843), + SHC(0x9930), + SHC(0x9a22), + SHC(0x9b17), + SHC(0x9c11), + SHC(0x9d0e), + SHC(0x9e0f), + SHC(0x9f14), + SHC(0xa01c), + SHC(0xa129), + SHC(0xa238), + SHC(0xa34c), + SHC(0xa463), + SHC(0xa57e), + SHC(0xa69c), + SHC(0xa7bd), + SHC(0xa8e2), + SHC(0xaa0a), + SHC(0xab36), + SHC(0xac65), + SHC(0xad97), + SHC(0xaecc), + SHC(0xb005), + SHC(0xb140), + SHC(0xb27f), + SHC(0xb3c0), + SHC(0xb505), + SHC(0xb64c), + SHC(0xb796), + SHC(0xb8e3), + SHC(0xba33), + SHC(0xbb85), + SHC(0xbcda), + SHC(0xbe32), + SHC(0xbf8c), + SHC(0xc0e9), + SHC(0xc248), + SHC(0xc3a9), + SHC(0xc50d), + SHC(0xc673), + SHC(0xc7db), + SHC(0xc946), + SHC(0xcab2), + SHC(0xcc21), + SHC(0xcd92), + SHC(0xcf04), + SHC(0xd079), + SHC(0xd1ef), + SHC(0xd367), + SHC(0xd4e1), + SHC(0xd65c), + SHC(0xd7d9), + SHC(0xd958), + SHC(0xdad8), + SHC(0xdc59), + SHC(0xdddc), + SHC(0xdf61), + SHC(0xe0e6), + SHC(0xe26d), + SHC(0xe3f4), + SHC(0xe57d), + SHC(0xe707), + SHC(0xe892), + SHC(0xea1e), + SHC(0xebab), + SHC(0xed38), + SHC(0xeec6), + SHC(0xf055), + SHC(0xf1e4), + SHC(0xf374), + SHC(0xf505), + SHC(0xf695), + SHC(0xf827), + SHC(0xf9b8), + SHC(0xfb4a), + SHC(0xfcdc), + SHC(0xfe6e), + SHC(0x0), + SHC(0x192), + SHC(0x324), + SHC(0x4b6), + SHC(0x648), + SHC(0x7d9), + SHC(0x96b), + SHC(0xafb), + SHC(0xc8c), + SHC(0xe1c), + SHC(0xfab), + SHC(0x113a), + SHC(0x12c8), + SHC(0x1455), + SHC(0x15e2), + SHC(0x176e), + SHC(0x18f9), + SHC(0x1a83), + SHC(0x1c0c), + SHC(0x1d93), + SHC(0x1f1a), + SHC(0x209f), + SHC(0x2224), + SHC(0x23a7), + SHC(0x2528), + SHC(0x26a8), + SHC(0x2827), + SHC(0x29a4), + SHC(0x2b1f), + SHC(0x2c99), + SHC(0x2e11), + SHC(0x2f87), + SHC(0x30fc), + SHC(0x326e), + SHC(0x33df), + SHC(0x354e), + SHC(0x36ba), + SHC(0x3825), + SHC(0x398d), + SHC(0x3af3), + SHC(0x3c57), + SHC(0x3db8), + SHC(0x3f17), + SHC(0x4074), + SHC(0x41ce), + SHC(0x4326), + SHC(0x447b), + SHC(0x45cd), + SHC(0x471d), + SHC(0x486a), + SHC(0x49b4), + SHC(0x4afb), + SHC(0x4c40), + SHC(0x4d81), + SHC(0x4ec0), + SHC(0x4ffb), + SHC(0x5134), + SHC(0x5269), + SHC(0x539b), + SHC(0x54ca), + SHC(0x55f6), + SHC(0x571e), + SHC(0x5843), + SHC(0x5964), + SHC(0x5a82), + SHC(0x5b9d), + SHC(0x5cb4), + SHC(0x5dc8), + SHC(0x5ed7), + SHC(0x5fe4), + SHC(0x60ec), + SHC(0x61f1), + SHC(0x62f2), + SHC(0x63ef), + SHC(0x64e9), + SHC(0x65de), + SHC(0x66d0), + SHC(0x67bd), + SHC(0x68a7), + SHC(0x698c), + SHC(0x6a6e), + SHC(0x6b4b), + SHC(0x6c24), + SHC(0x6cf9), + SHC(0x6dca), + SHC(0x6e97), + SHC(0x6f5f), + SHC(0x7023), + SHC(0x70e3), + SHC(0x719e), + SHC(0x7255), + SHC(0x7308), + SHC(0x73b6), + SHC(0x7460), + SHC(0x7505), + SHC(0x75a6), + SHC(0x7642), + SHC(0x76d9), + SHC(0x776c), + SHC(0x77fb), + SHC(0x7885), + SHC(0x790a), + SHC(0x798a), + SHC(0x7a06), + SHC(0x7a7d), + SHC(0x7aef), + SHC(0x7b5d), + SHC(0x7bc6), + SHC(0x7c2a), + SHC(0x7c89), + SHC(0x7ce4), + SHC(0x7d3a), + SHC(0x7d8a), + SHC(0x7dd6), + SHC(0x7e1e), + SHC(0x7e60), + SHC(0x7e9d), + SHC(0x7ed6), + SHC(0x7f0a), + SHC(0x7f38), + SHC(0x7f62), + SHC(0x7f87), + SHC(0x7fa7), + SHC(0x7fc2), + SHC(0x7fd9), + SHC(0x7fea), + SHC(0x7ff6), + SHC(0x7ffe) +}; + +const PWord16 w1N8[15] = +{ + {{ 32729/*0.998795 Q15*/, -1608/*-0.049068 Q15*/}}, + {{ 32610/*0.995185 Q15*/, -3212/*-0.098017 Q15*/}}, + {{ 32413/*0.989177 Q15*/, -4808/*-0.146730 Q15*/}}, + {{ 32138/*0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, + {{ 31786/*0.970031 Q15*/, -7962/*-0.242980 Q15*/}}, + {{ 31357/*0.956940 Q15*/, -9512/*-0.290285 Q15*/}}, + {{ 30853/*0.941544 Q15*/, -11039/*-0.336890 Q15*/}}, + {{ 30274/*0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, + {{ 29622/*0.903989 Q15*/, -14010/*-0.427555 Q15*/}}, + {{ 28899/*0.881921 Q15*/, -15447/*-0.471397 Q15*/}}, + {{ 28106/*0.857729 Q15*/, -16846/*-0.514103 Q15*/}}, + {{ 27246/*0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, + {{ 26320/*0.803208 Q15*/, -19520/*-0.595699 Q15*/}}, + {{ 25330/*0.773010 Q15*/, -20788/*-0.634393 Q15*/}}, + {{ 24279/*0.740951 Q15*/, -22006/*-0.671559 Q15*/}} +}; + +const PWord16 w2N8[15] = +{ + {{ 32610/*0.995185 Q15*/, -3212/*-0.098017 Q15*/}}, + {{ 32138/*0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, + {{ 31357/*0.956940 Q15*/, -9512/*-0.290285 Q15*/}}, + {{ 30274/*0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, + {{ 28899/*0.881921 Q15*/, -15447/*-0.471397 Q15*/}}, + {{ 27246/*0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, + {{ 25330/*0.773010 Q15*/, -20788/*-0.634393 Q15*/}}, + {{ 23170/*0.707107 Q15*/, -23170/*-0.707107 Q15*/}}, + {{ 20788/*0.634393 Q15*/, -25330/*-0.773010 Q15*/}}, + {{ 18205/*0.555570 Q15*/, -27246/*-0.831470 Q15*/}}, + {{ 15447/*0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, + {{ 12540/*0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, + {{ 9512/*0.290285 Q15*/, -31357/*-0.956940 Q15*/}}, + {{ 6393/*0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, + {{ 3212/*0.098017 Q15*/, -32610/*-0.995185 Q15*/}} +}; + +const PWord16 w3N8[15] = +{ + {{ 32413/*0.989177 Q15*/, -4808/*-0.146730 Q15*/}}, + {{ 31357/*0.956940 Q15*/, -9512/*-0.290285 Q15*/}}, + {{ 29622/*0.903989 Q15*/, -14010/*-0.427555 Q15*/}}, + {{ 27246/*0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, + {{ 24279/*0.740951 Q15*/, -22006/*-0.671559 Q15*/}}, + {{ 20788/*0.634393 Q15*/, -25330/*-0.773010 Q15*/}}, + {{ 16846/*0.514103 Q15*/, -28106/*-0.857729 Q15*/}}, + {{ 12540/*0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, + {{ 7962/*0.242980 Q15*/, -31786/*-0.970031 Q15*/}}, + {{ 3212/*0.098017 Q15*/, -32610/*-0.995185 Q15*/}}, + {{ -1608/*-0.049068 Q15*/, -32729/*-0.998795 Q15*/}}, + {{ -6393/*-0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, + {{-11039/*-0.336890 Q15*/, -30853/*-0.941544 Q15*/}}, + {{-15447/*-0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, + {{-19520/*-0.595699 Q15*/, -26320/*-0.803208 Q15*/}} +}; + +const PWord16 w4N8[15] = +{ + {{ 32138/*0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, + {{ 30274/*0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, + {{ 27246/*0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, + {{ 23170/*0.707107 Q15*/, -23170/*-0.707107 Q15*/}}, + {{ 18205/*0.555570 Q15*/, -27246/*-0.831470 Q15*/}}, + {{ 12540/*0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, + {{ 6393/*0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, + {{ 0/*0.000000 Q15*/, -32768/*-1.000000 Q15*/}}, + {{ -6393/*-0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, + {{-12540/*-0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, + {{-18205/*-0.555570 Q15*/, -27246/*-0.831470 Q15*/}}, + {{-23170/*-0.707107 Q15*/, -23170/*-0.707107 Q15*/}}, + {{-27246/*-0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, + {{-30274/*-0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, + {{-32138/*-0.980785 Q15*/, -6393/*-0.195090 Q15*/}} +}; + +const PWord16 w5N8[15] = +{ + {{ 31786/*0.970031 Q15*/, -7962/*-0.242980 Q15*/}}, + {{ 28899/*0.881921 Q15*/, -15447/*-0.471397 Q15*/}}, + {{ 24279/*0.740951 Q15*/, -22006/*-0.671559 Q15*/}}, + {{ 18205/*0.555570 Q15*/, -27246/*-0.831470 Q15*/}}, + {{ 11039/*0.336890 Q15*/, -30853/*-0.941544 Q15*/}}, + {{ 3212/*0.098017 Q15*/, -32610/*-0.995185 Q15*/}}, + {{ -4808/*-0.146730 Q15*/, -32413/*-0.989177 Q15*/}}, + {{-12540/*-0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, + {{-19520/*-0.595699 Q15*/, -26320/*-0.803208 Q15*/}}, + {{-25330/*-0.773010 Q15*/, -20788/*-0.634393 Q15*/}}, + {{-29622/*-0.903989 Q15*/, -14010/*-0.427555 Q15*/}}, + {{-32138/*-0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, + {{-32729/*-0.998795 Q15*/, 1608/*0.049068 Q15*/}}, + {{-31357/*-0.956940 Q15*/, 9512/*0.290285 Q15*/}}, + {{-28106/*-0.857729 Q15*/, 16846/*0.514103 Q15*/}} +}; + +const PWord16 w6N8[15] = +{ + {{ 31357/*0.956940 Q15*/, -9512/*-0.290285 Q15*/}}, + {{ 27246/*0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, + {{ 20788/*0.634393 Q15*/, -25330/*-0.773010 Q15*/}}, + {{ 12540/*0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, + {{ 3212/*0.098017 Q15*/, -32610/*-0.995185 Q15*/}}, + {{ -6393/*-0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, + {{-15447/*-0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, + {{-23170/*-0.707107 Q15*/, -23170/*-0.707107 Q15*/}}, + {{-28899/*-0.881921 Q15*/, -15447/*-0.471397 Q15*/}}, + {{-32138/*-0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, + {{-32610/*-0.995185 Q15*/, 3212/*0.098017 Q15*/}}, + {{-30274/*-0.923880 Q15*/, 12540/*0.382683 Q15*/}}, + {{-25330/*-0.773010 Q15*/, 20788/*0.634393 Q15*/}}, + {{-18205/*-0.555570 Q15*/, 27246/*0.831470 Q15*/}}, + {{ -9512/*-0.290285 Q15*/, 31357/*0.956940 Q15*/}} +}; + +const PWord16 w7N8[15] = +{ + {{ 30853/*0.941544 Q15*/, -11039/*-0.336890 Q15*/}}, + {{ 25330/*0.773010 Q15*/, -20788/*-0.634393 Q15*/}}, + {{ 16846/*0.514103 Q15*/, -28106/*-0.857729 Q15*/}}, + {{ 6393/*0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, + {{ -4808/*-0.146730 Q15*/, -32413/*-0.989177 Q15*/}}, + {{-15447/*-0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, + {{-24279/*-0.740951 Q15*/, -22006/*-0.671559 Q15*/}}, + {{-30274/*-0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, + {{-32729/*-0.998795 Q15*/, -1608/*-0.049068 Q15*/}}, + {{-31357/*-0.956940 Q15*/, 9512/*0.290285 Q15*/}}, + {{-26320/*-0.803208 Q15*/, 19520/*0.595699 Q15*/}}, + {{-18205/*-0.555570 Q15*/, 27246/*0.831470 Q15*/}}, + {{ -7962/*-0.242980 Q15*/, 31786/*0.970031 Q15*/}}, + {{ 3212/*0.098017 Q15*/, 32610/*0.995185 Q15*/}}, + {{ 14010/*0.427555 Q15*/, 29622/*0.903989 Q15*/}} +}; + +const PWord16 *w_a[7] = { w1N8, w2N8, w3N8, w4N8, w5N8, w6N8, w7N8 };//Q15 + +const PWord16 w19N[127] = +{ + {{ 31881/*0.972940 Q15*/, 7571/*0.231058 Q15*/}}, + {{ 29269/*0.893224 Q15*/, 14733/*0.449611 Q15*/}}, + {{ 25073/*0.765167 Q15*/, 21097/*0.643832 Q15*/}}, + {{ 19520/*0.595699 Q15*/, 26320/*0.803208 Q15*/}}, + {{ 12910/*0.393992 Q15*/, 30118/*0.919114 Q15*/}}, + {{ 5602/*0.170962 Q15*/, 32286/*0.985278 Q15*/}}, + {{ -2009/*-0.061321 Q15*/, 32706/*0.998118 Q15*/}}, + {{ -9512/*-0.290285 Q15*/, 31357/*0.956940 Q15*/}}, + {{-16500/*-0.503538 Q15*/, 28311/*0.863973 Q15*/}}, + {{-22595/*-0.689541 Q15*/, 23732/*0.724247 Q15*/}}, + {{-27467/*-0.838225 Q15*/, 17869/*0.545325 Q15*/}}, + {{-30853/*-0.941544 Q15*/, 11039/*0.336890 Q15*/}}, + {{-32568/*-0.993907 Q15*/, 3612/*0.110222 Q15*/}}, + {{-32522/*-0.992480 Q15*/, -4011/*-0.122411 Q15*/}}, + {{-30715/*-0.937339 Q15*/, -11417/*-0.348419 Q15*/}}, + {{-27246/*-0.831470 Q15*/, -18205/*-0.555570 Q15*/}}, + {{-22302/*-0.680601 Q15*/, -24008/*-0.732654 Q15*/}}, + {{-16151/*-0.492898 Q15*/, -28511/*-0.870087 Q15*/}}, + {{ -9127/*-0.278520 Q15*/, -31471/*-0.960431 Q15*/}}, + {{ -1608/*-0.049068 Q15*/, -32729/*-0.998795 Q15*/}}, + {{ 5998/*0.183040 Q15*/, -32214/*-0.983105 Q15*/}}, + {{ 13279/*0.405241 Q15*/, -29957/*-0.914210 Q15*/}}, + {{ 19841/*0.605511 Q15*/, -26078/*-0.795837 Q15*/}}, + {{ 25330/*0.773010 Q15*/, -20788/*-0.634393 Q15*/}}, + {{ 29448/*0.898674 Q15*/, -14373/*-0.438616 Q15*/}}, + {{ 31972/*0.975702 Q15*/, -7180/*-0.219101 Q15*/}}, + {{ 32766/*0.999925 Q15*/, 402/*0.012272 Q15*/}}, + {{ 31786/*0.970031 Q15*/, 7962/*0.242980 Q15*/}}, + {{ 29086/*0.887640 Q15*/, 15091/*0.460539 Q15*/}}, + {{ 24812/*0.757209 Q15*/, 21403/*0.653173 Q15*/}}, + {{ 19195/*0.585798 Q15*/, 26557/*0.810457 Q15*/}}, + {{ 12540/*0.382683 Q15*/, 30274/*0.923880 Q15*/}}, + {{ 5205/*0.158858 Q15*/, 32352/*0.987301 Q15*/}}, + {{ -2411/*-0.073565 Q15*/, 32679/*0.997290 Q15*/}}, + {{ -9896/*-0.302006 Q15*/, 31238/*0.953306 Q15*/}}, + {{-16846/*-0.514103 Q15*/, 28106/*0.857729 Q15*/}}, + {{-22884/*-0.698376 Q15*/, 23453/*0.715731 Q15*/}}, + {{-27684/*-0.844854 Q15*/, 17531/*0.534998 Q15*/}}, + {{-30986/*-0.945607 Q15*/, 10660/*0.325310 Q15*/}}, + {{-32610/*-0.995185 Q15*/, 3212/*0.098017 Q15*/}}, + {{-32470/*-0.990903 Q15*/, -4410/*-0.134581 Q15*/}}, + {{-30572/*-0.932993 Q15*/, -11793/*-0.359895 Q15*/}}, + {{-27020/*-0.824589 Q15*/, -18538/*-0.565732 Q15*/}}, + {{-22006/*-0.671559 Q15*/, -24279/*-0.740951 Q15*/}}, + {{-15800/*-0.482184 Q15*/, -28707/*-0.876070 Q15*/}}, + {{ -8740/*-0.266713 Q15*/, -31581/*-0.963776 Q15*/}}, + {{ -1206/*-0.036807 Q15*/, -32746/*-0.999322 Q15*/}}, + {{ 6393/*0.195090 Q15*/, -32138/*-0.980785 Q15*/}}, + {{ 13646/*0.416430 Q15*/, -29792/*-0.909168 Q15*/}}, + {{ 20160/*0.615232 Q15*/, -25833/*-0.788346 Q15*/}}, + {{ 25583/*0.780737 Q15*/, -20475/*-0.624859 Q15*/}}, + {{ 29622/*0.903989 Q15*/, -14010/*-0.427555 Q15*/}}, + {{ 32057/*0.978317 Q15*/, -6787/*-0.207111 Q15*/}}, + {{ 32758/*0.999699 Q15*/, 804/*0.024541 Q15*/}}, + {{ 31686/*0.966976 Q15*/, 8351/*0.254866 Q15*/}}, + {{ 28899/*0.881921 Q15*/, 15447/*0.471397 Q15*/}}, + {{ 24548/*0.749136 Q15*/, 21706/*0.662416 Q15*/}}, + {{ 18868/*0.575808 Q15*/, 26791/*0.817585 Q15*/}}, + {{ 12167/*0.371317 Q15*/, 30425/*0.928506 Q15*/}}, + {{ 4808/*0.146730 Q15*/, 32413/*0.989177 Q15*/}}, + {{ -2811/*-0.085797 Q15*/, 32647/*0.996313 Q15*/}}, + {{-10279/*-0.313682 Q15*/, 31114/*0.949528 Q15*/}}, + {{-17190/*-0.524590 Q15*/, 27897/*0.851355 Q15*/}}, + {{-23170/*-0.707107 Q15*/, 23170/*0.707107 Q15*/}}, + {{-27897/*-0.851355 Q15*/, 17190/*0.524590 Q15*/}}, + {{-31114/*-0.949528 Q15*/, 10279/*0.313682 Q15*/}}, + {{-32647/*-0.996313 Q15*/, 2811/*0.085797 Q15*/}}, + {{-32413/*-0.989177 Q15*/, -4808/*-0.146730 Q15*/}}, + {{-30425/*-0.928506 Q15*/, -12167/*-0.371317 Q15*/}}, + {{-26791/*-0.817585 Q15*/, -18868/*-0.575808 Q15*/}}, + {{-21706/*-0.662416 Q15*/, -24548/*-0.749136 Q15*/}}, + {{-15447/*-0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, + {{ -8351/*-0.254866 Q15*/, -31686/*-0.966976 Q15*/}}, + {{ -804/*-0.024541 Q15*/, -32758/*-0.999699 Q15*/}}, + {{ 6787/*0.207111 Q15*/, -32057/*-0.978317 Q15*/}}, + {{ 14010/*0.427555 Q15*/, -29622/*-0.903989 Q15*/}}, + {{ 20475/*0.624859 Q15*/, -25583/*-0.780737 Q15*/}}, + {{ 25833/*0.788346 Q15*/, -20160/*-0.615232 Q15*/}}, + {{ 29792/*0.909168 Q15*/, -13646/*-0.416430 Q15*/}}, + {{ 32138/*0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, + {{ 32746/*0.999322 Q15*/, 1206/*0.036807 Q15*/}}, + {{ 31581/*0.963776 Q15*/, 8740/*0.266713 Q15*/}}, + {{ 28707/*0.876070 Q15*/, 15800/*0.482184 Q15*/}}, + {{ 24279/*0.740951 Q15*/, 22006/*0.671559 Q15*/}}, + {{ 18538/*0.565732 Q15*/, 27020/*0.824589 Q15*/}}, + {{ 11793/*0.359895 Q15*/, 30572/*0.932993 Q15*/}}, + {{ 4410/*0.134581 Q15*/, 32470/*0.990903 Q15*/}}, + {{ -3212/*-0.098017 Q15*/, 32610/*0.995185 Q15*/}}, + {{-10660/*-0.325310 Q15*/, 30986/*0.945607 Q15*/}}, + {{-17531/*-0.534998 Q15*/, 27684/*0.844854 Q15*/}}, + {{-23453/*-0.715731 Q15*/, 22884/*0.698376 Q15*/}}, + {{-28106/*-0.857729 Q15*/, 16846/*0.514103 Q15*/}}, + {{-31238/*-0.953306 Q15*/, 9896/*0.302006 Q15*/}}, + {{-32679/*-0.997290 Q15*/, 2411/*0.073565 Q15*/}}, + {{-32352/*-0.987301 Q15*/, -5205/*-0.158858 Q15*/}}, + {{-30274/*-0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, + {{-26557/*-0.810457 Q15*/, -19195/*-0.585798 Q15*/}}, + {{-21403/*-0.653173 Q15*/, -24812/*-0.757209 Q15*/}}, + {{-15091/*-0.460539 Q15*/, -29086/*-0.887640 Q15*/}}, + {{ -7962/*-0.242980 Q15*/, -31786/*-0.970031 Q15*/}}, + {{ -402/*-0.012272 Q15*/, -32766/*-0.999925 Q15*/}}, + {{ 7180/*0.219101 Q15*/, -31972/*-0.975702 Q15*/}}, + {{ 14373/*0.438616 Q15*/, -29448/*-0.898674 Q15*/}}, + {{ 20788/*0.634393 Q15*/, -25330/*-0.773010 Q15*/}}, + {{ 26078/*0.795837 Q15*/, -19841/*-0.605511 Q15*/}}, + {{ 29957/*0.914210 Q15*/, -13279/*-0.405241 Q15*/}}, + {{ 32214/*0.983105 Q15*/, -5998/*-0.183040 Q15*/}}, + {{ 32729/*0.998795 Q15*/, 1608/*0.049068 Q15*/}}, + {{ 31471/*0.960431 Q15*/, 9127/*0.278520 Q15*/}}, + {{ 28511/*0.870087 Q15*/, 16151/*0.492898 Q15*/}}, + {{ 24008/*0.732654 Q15*/, 22302/*0.680601 Q15*/}}, + {{ 18205/*0.555570 Q15*/, 27246/*0.831470 Q15*/}}, + {{ 11417/*0.348419 Q15*/, 30715/*0.937339 Q15*/}}, + {{ 4011/*0.122411 Q15*/, 32522/*0.992480 Q15*/}}, + {{ -3612/*-0.110222 Q15*/, 32568/*0.993907 Q15*/}}, + {{-11039/*-0.336890 Q15*/, 30853/*0.941544 Q15*/}}, + {{-17869/*-0.545325 Q15*/, 27467/*0.838225 Q15*/}}, + {{-23732/*-0.724247 Q15*/, 22595/*0.689541 Q15*/}}, + {{-28311/*-0.863973 Q15*/, 16500/*0.503538 Q15*/}}, + {{-31357/*-0.956940 Q15*/, 9512/*0.290285 Q15*/}}, + {{-32706/*-0.998118 Q15*/, 2009/*0.061321 Q15*/}}, + {{-32286/*-0.985278 Q15*/, -5602/*-0.170962 Q15*/}}, + {{-30118/*-0.919114 Q15*/, -12910/*-0.393992 Q15*/}}, + {{-26320/*-0.803208 Q15*/, -19520/*-0.595699 Q15*/}}, + {{-21097/*-0.643832 Q15*/, -25073/*-0.765167 Q15*/}}, + {{-14733/*-0.449611 Q15*/, -29269/*-0.893224 Q15*/}}, + {{ -7571/*-0.231058 Q15*/, -31881/*-0.972940 Q15*/}} +}; + +const PWord16 w18N[127] = +{ + {{ 31972/*0.975702 Q15*/, 7180/*0.219101 Q15*/}}, + {{ 29622/*0.903989 Q15*/, 14010/*0.427555 Q15*/}}, + {{ 25833/*0.788346 Q15*/, 20160/*0.615232 Q15*/}}, + {{ 20788/*0.634393 Q15*/, 25330/*0.773010 Q15*/}}, + {{ 14733/*0.449611 Q15*/, 29269/*0.893224 Q15*/}}, + {{ 7962/*0.242980 Q15*/, 31786/*0.970031 Q15*/}}, + {{ 804/*0.024541 Q15*/, 32758/*0.999699 Q15*/}}, + {{ -6393/*-0.195090 Q15*/, 32138/*0.980785 Q15*/}}, + {{-13279/*-0.405241 Q15*/, 29957/*0.914210 Q15*/}}, + {{-19520/*-0.595699 Q15*/, 26320/*0.803208 Q15*/}}, + {{-24812/*-0.757209 Q15*/, 21403/*0.653173 Q15*/}}, + {{-28899/*-0.881921 Q15*/, 15447/*0.471397 Q15*/}}, + {{-31581/*-0.963776 Q15*/, 8740/*0.266713 Q15*/}}, + {{-32729/*-0.998795 Q15*/, 1608/*0.049068 Q15*/}}, + {{-32286/*-0.985278 Q15*/, -5602/*-0.170962 Q15*/}}, + {{-30274/*-0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, + {{-26791/*-0.817585 Q15*/, -18868/*-0.575808 Q15*/}}, + {{-22006/*-0.671559 Q15*/, -24279/*-0.740951 Q15*/}}, + {{-16151/*-0.492898 Q15*/, -28511/*-0.870087 Q15*/}}, + {{ -9512/*-0.290285 Q15*/, -31357/*-0.956940 Q15*/}}, + {{ -2411/*-0.073565 Q15*/, -32679/*-0.997290 Q15*/}}, + {{ 4808/*0.146730 Q15*/, -32413/*-0.989177 Q15*/}}, + {{ 11793/*0.359895 Q15*/, -30572/*-0.932993 Q15*/}}, + {{ 18205/*0.555570 Q15*/, -27246/*-0.831470 Q15*/}}, + {{ 23732/*0.724247 Q15*/, -22595/*-0.689541 Q15*/}}, + {{ 28106/*0.857729 Q15*/, -16846/*-0.514103 Q15*/}}, + {{ 31114/*0.949528 Q15*/, -10279/*-0.313682 Q15*/}}, + {{ 32610/*0.995185 Q15*/, -3212/*-0.098017 Q15*/}}, + {{ 32522/*0.992480 Q15*/, 4011/*0.122411 Q15*/}}, + {{ 30853/*0.941544 Q15*/, 11039/*0.336890 Q15*/}}, + {{ 27684/*0.844854 Q15*/, 17531/*0.534998 Q15*/}}, + {{ 23170/*0.707107 Q15*/, 23170/*0.707107 Q15*/}}, + {{ 17531/*0.534998 Q15*/, 27684/*0.844854 Q15*/}}, + {{ 11039/*0.336890 Q15*/, 30853/*0.941544 Q15*/}}, + {{ 4011/*0.122411 Q15*/, 32522/*0.992480 Q15*/}}, + {{ -3212/*-0.098017 Q15*/, 32610/*0.995185 Q15*/}}, + {{-10279/*-0.313682 Q15*/, 31114/*0.949528 Q15*/}}, + {{-16846/*-0.514103 Q15*/, 28106/*0.857729 Q15*/}}, + {{-22595/*-0.689541 Q15*/, 23732/*0.724247 Q15*/}}, + {{-27246/*-0.831470 Q15*/, 18205/*0.555570 Q15*/}}, + {{-30572/*-0.932993 Q15*/, 11793/*0.359895 Q15*/}}, + {{-32413/*-0.989177 Q15*/, 4808/*0.146730 Q15*/}}, + {{-32679/*-0.997290 Q15*/, -2411/*-0.073565 Q15*/}}, + {{-31357/*-0.956940 Q15*/, -9512/*-0.290285 Q15*/}}, + {{-28511/*-0.870087 Q15*/, -16151/*-0.492898 Q15*/}}, + {{-24279/*-0.740951 Q15*/, -22006/*-0.671559 Q15*/}}, + {{-18868/*-0.575808 Q15*/, -26791/*-0.817585 Q15*/}}, + {{-12540/*-0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, + {{ -5602/*-0.170962 Q15*/, -32286/*-0.985278 Q15*/}}, + {{ 1608/*0.049068 Q15*/, -32729/*-0.998795 Q15*/}}, + {{ 8740/*0.266713 Q15*/, -31581/*-0.963776 Q15*/}}, + {{ 15447/*0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, + {{ 21403/*0.653173 Q15*/, -24812/*-0.757209 Q15*/}}, + {{ 26320/*0.803208 Q15*/, -19520/*-0.595699 Q15*/}}, + {{ 29957/*0.914210 Q15*/, -13279/*-0.405241 Q15*/}}, + {{ 32138/*0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, + {{ 32758/*0.999699 Q15*/, 804/*0.024541 Q15*/}}, + {{ 31786/*0.970031 Q15*/, 7962/*0.242980 Q15*/}}, + {{ 29269/*0.893224 Q15*/, 14733/*0.449611 Q15*/}}, + {{ 25330/*0.773010 Q15*/, 20788/*0.634393 Q15*/}}, + {{ 20160/*0.615232 Q15*/, 25833/*0.788346 Q15*/}}, + {{ 14010/*0.427555 Q15*/, 29622/*0.903989 Q15*/}}, + {{ 7180/*0.219101 Q15*/, 31972/*0.975702 Q15*/}}, + {{ 0/*0.000000 Q15*/, 32767/*1.000000 Q15*/}}, + {{ -7180/*-0.219101 Q15*/, 31972/*0.975702 Q15*/}}, + {{-14010/*-0.427555 Q15*/, 29622/*0.903989 Q15*/}}, + {{-20160/*-0.615232 Q15*/, 25833/*0.788346 Q15*/}}, + {{-25330/*-0.773010 Q15*/, 20788/*0.634393 Q15*/}}, + {{-29269/*-0.893224 Q15*/, 14733/*0.449611 Q15*/}}, + {{-31786/*-0.970031 Q15*/, 7962/*0.242980 Q15*/}}, + {{-32758/*-0.999699 Q15*/, 804/*0.024541 Q15*/}}, + {{-32138/*-0.980785 Q15*/, -6393/*-0.195090 Q15*/}}, + {{-29957/*-0.914210 Q15*/, -13279/*-0.405241 Q15*/}}, + {{-26320/*-0.803208 Q15*/, -19520/*-0.595699 Q15*/}}, + {{-21403/*-0.653173 Q15*/, -24812/*-0.757209 Q15*/}}, + {{-15447/*-0.471397 Q15*/, -28899/*-0.881921 Q15*/}}, + {{ -8740/*-0.266713 Q15*/, -31581/*-0.963776 Q15*/}}, + {{ -1608/*-0.049068 Q15*/, -32729/*-0.998795 Q15*/}}, + {{ 5602/*0.170962 Q15*/, -32286/*-0.985278 Q15*/}}, + {{ 12540/*0.382683 Q15*/, -30274/*-0.923880 Q15*/}}, + {{ 18868/*0.575808 Q15*/, -26791/*-0.817585 Q15*/}}, + {{ 24279/*0.740951 Q15*/, -22006/*-0.671559 Q15*/}}, + {{ 28511/*0.870087 Q15*/, -16151/*-0.492898 Q15*/}}, + {{ 31357/*0.956940 Q15*/, -9512/*-0.290285 Q15*/}}, + {{ 32679/*0.997290 Q15*/, -2411/*-0.073565 Q15*/}}, + {{ 32413/*0.989177 Q15*/, 4808/*0.146730 Q15*/}}, + {{ 30572/*0.932993 Q15*/, 11793/*0.359895 Q15*/}}, + {{ 27246/*0.831470 Q15*/, 18205/*0.555570 Q15*/}}, + {{ 22595/*0.689541 Q15*/, 23732/*0.724247 Q15*/}}, + {{ 16846/*0.514103 Q15*/, 28106/*0.857729 Q15*/}}, + {{ 10279/*0.313682 Q15*/, 31114/*0.949528 Q15*/}}, + {{ 3212/*0.098017 Q15*/, 32610/*0.995185 Q15*/}}, + {{ -4011/*-0.122411 Q15*/, 32522/*0.992480 Q15*/}}, + {{-11039/*-0.336890 Q15*/, 30853/*0.941544 Q15*/}}, + {{-17531/*-0.534998 Q15*/, 27684/*0.844854 Q15*/}}, + {{-23170/*-0.707107 Q15*/, 23170/*0.707107 Q15*/}}, + {{-27684/*-0.844854 Q15*/, 17531/*0.534998 Q15*/}}, + {{-30853/*-0.941544 Q15*/, 11039/*0.336890 Q15*/}}, + {{-32522/*-0.992480 Q15*/, 4011/*0.122411 Q15*/}}, + {{-32610/*-0.995185 Q15*/, -3212/*-0.098017 Q15*/}}, + {{-31114/*-0.949528 Q15*/, -10279/*-0.313682 Q15*/}}, + {{-28106/*-0.857729 Q15*/, -16846/*-0.514103 Q15*/}}, + {{-23732/*-0.724247 Q15*/, -22595/*-0.689541 Q15*/}}, + {{-18205/*-0.555570 Q15*/, -27246/*-0.831470 Q15*/}}, + {{-11793/*-0.359895 Q15*/, -30572/*-0.932993 Q15*/}}, + {{ -4808/*-0.146730 Q15*/, -32413/*-0.989177 Q15*/}}, + {{ 2411/*0.073565 Q15*/, -32679/*-0.997290 Q15*/}}, + {{ 9512/*0.290285 Q15*/, -31357/*-0.956940 Q15*/}}, + {{ 16151/*0.492898 Q15*/, -28511/*-0.870087 Q15*/}}, + {{ 22006/*0.671559 Q15*/, -24279/*-0.740951 Q15*/}}, + {{ 26791/*0.817585 Q15*/, -18868/*-0.575808 Q15*/}}, + {{ 30274/*0.923880 Q15*/, -12540/*-0.382683 Q15*/}}, + {{ 32286/*0.985278 Q15*/, -5602/*-0.170962 Q15*/}}, + {{ 32729/*0.998795 Q15*/, 1608/*0.049068 Q15*/}}, + {{ 31581/*0.963776 Q15*/, 8740/*0.266713 Q15*/}}, + {{ 28899/*0.881921 Q15*/, 15447/*0.471397 Q15*/}}, + {{ 24812/*0.757209 Q15*/, 21403/*0.653173 Q15*/}}, + {{ 19520/*0.595699 Q15*/, 26320/*0.803208 Q15*/}}, + {{ 13279/*0.405241 Q15*/, 29957/*0.914210 Q15*/}}, + {{ 6393/*0.195090 Q15*/, 32138/*0.980785 Q15*/}}, + {{ -804/*-0.024541 Q15*/, 32758/*0.999699 Q15*/}}, + {{ -7962/*-0.242980 Q15*/, 31786/*0.970031 Q15*/}}, + {{-14733/*-0.449611 Q15*/, 29269/*0.893224 Q15*/}}, + {{-20788/*-0.634393 Q15*/, 25330/*0.773010 Q15*/}}, + {{-25833/*-0.788346 Q15*/, 20160/*0.615232 Q15*/}}, + {{-29622/*-0.903989 Q15*/, 14010/*0.427555 Q15*/}}, + {{-31972/*-0.975702 Q15*/, 7180/*0.219101 Q15*/}} +}; + +/*-------------------------------------------------------------------* + * 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) + * for fractional pitch search + * Used in lib_enc\pit_enc.c Q14 + *-------------------------------------------------------------------*/ +const Word16 inter4_1_fx[32] =//Q14 +{ + -12, -26, 32, 206, + 420, 455, 73, -766, + -1732, -2142,-1242, 1376, + 5429, 9910,13418,14746, + 13418, 9910, 5429, 1376, + -1242, -2142,-1732, -766, + 73, 455, 420, 206, + 32, -26, -12, 0 +}; + +const Word16 sin_switch_8[15] = { 3212, 6393, 9512, 12540, 15447, 18205, 20788, 23170, + 25330, 27246, 28899, 30274, 31357, 32138, 32610 +};//Q15 + +const Word16 sin_switch_16[30] = { 1660, 3315, 4962, 6596, 8213, 9810, 11380, 12922, + 14431, 15902, 17333, 18719, 20057, 21344, 22576, 23750, + 24863, 25912, 26895, 27808, 28651, 29419, 30112, 30728, + 31265, 31722, 32097, 32390, 32600, 32726 +};//Q15 + + +const Word16 sin_switch_32[60] = { 844, 1687, 2529, 3369, 4207, 5043, 5875, 6703, + 7526, 8345, 9158, 9965, 10766, 11559, 12345, 13122, + 13891, 14650, 15400, 16140, 16869, 17586, 18293, 18986, + 19668, 20336, 20991, 21632, 22258, 22870, 23467, 24048, + 24613, 25162, 25694, 26209, 26707, 27187, 27649, 28092, + 28518, 28924, 29311, 29678, 30026, 30354, 30662, 30949, + 31216, 31462, 31688, 31892, 32075, 32237, 32378, 32497, + 32594, 32670, 32725, 32757 +};//Q15 + + +const Word16 sin_switch_48[90] = { 566, 1131, 1696, 2261, 2825, 3388, 3950, 4511, + 5070, 5628, 6185, 6739, 7292, 7842, 8390, 8935, + 9478, 10018, 10555, 11089, 11620, 12147, 12670, 13190, + 13706, 14218, 14725, 15228, 15727, 16220, 16709, 17194, + 17672, 18146, 18614, 19077, 19534, 19985, 20431, 20870, + 21303, 21729, 22149, 22563, 22970, 23370, 23763, 24148, + 24527, 24899, 25263, 25619, 25968, 26309, 26642, 26968, + 27285, 27594, 27895, 28188, 28472, 28747, 29015, 29273, + 29523, 29764, 29996, 30219, 30433, 30639, 30835, 31021, + 31199, 31367, 31526, 31676, 31816, 31946, 32068, 32179, + 32281, 32373, 32456, 32529, 32592, 32646, 32690, 32724, + 32748, 32763 +};//Q15 + +const Word16 one_on_win_48k_fx[210] = +{ + 16399, 16412, 16425, 16439, 16452, 16465, 16479, 16492, + 16506, 16519, 16533, 16547, 16561, 16575, 16589, 16603, + 16618, 16632, 16647, 16662, 16677, 16692, 16707, 16722, + 16738, 16754, 16770, 16786, 16802, 16818, 16835, 16851, + 16868, 16885, 16902, 16919, 16937, 16955, 16972, 16990, + 17008, 17027, 17045, 17064, 17083, 17102, 17121, 17140, + 17160, 17180, 17200, 17220, 17240, 17261, 17281, 17302, + 17323, 17345, 17366, 17388, 17410, 17432, 17454, 17477, + 17499, 17522, 17545, 17569, 17592, 17616, 17640, 17664, + 17689, 17713, 17738, 17763, 17789, 17814, 17840, 17866, + 17892, 17918, 17945, 17972, 17999, 18027, 18054, 18082, + 18110, 18139, 18167, 18196, 18225, 18255, 18284, 18314, + 18345, 18375, 18406, 18437, 18468, 18499, 18531, 18563, + 18596, 18628, 18661, 18695, 18728, 18762, 18796, 18830, + 18865, 18900, 18935, 18971, 19007, 19043, 19080, 19117, + 19154, 19191, 19229, 19267, 19306, 19345, 19384, 19423, + 19463, 19504, 19544, 19585, 19626, 19668, 19710, 19752, + 19795, 19838, 19882, 19926, 19970, 20015, 20060, 20105, + 20151, 20198, 20244, 20291, 20339, 20387, 20435, 20484, + 20533, 20583, 20633, 20684, 20735, 20787, 20839, 20891, + 20944, 20997, 21051, 21106, 21161, 21216, 21272, 21328, + 21385, 21443, 21501, 21559, 21618, 21678, 21738, 21799, + 21860, 21922, 21984, 22048, 22111, 22175, 22240, 22306, + 22372, 22439, 22506, 22574, 22643, 22712, 22782, 22853, + 22924, 22996, 23069, 23142, 23216, 23291, 23367, 23443, + 23521, 23599, 23677, 23757, 23837, 23918, 24000, 24083, + 24167, 24251 +};//Q14 + +const Word16 one_on_win_8k_16k_48k_fx[70] = +{ + 16432, 16472, 16512, 16554, 16596, 16639, 16684, 16730, + 16778, 16826, 16876, 16928, 16981, 17036, 17092, 17150, + 17210, 17271, 17334, 17399, 17465, 17534, 17604, 17676, + 17751, 17827, 17905, 17986, 18068, 18153, 18240, 18329, + 18421, 18515, 18612, 18711, 18813, 18918, 19025, 19135, + 19248, 19364, 19483, 19606, 19731, 19860, 19992, 20128, + 20268, 20411, 20558, 20709, 20865, 21024, 21188, 21357, + 21530, 21708, 21891, 22079, 22273, 22472, 22677, 22888, + 23105, 23329, 23560, 23797, 24041, 24251 +};//Q14 + +const Word16 window_8_16_32kHz_fx[370] = +{ + 3, 9, 19, 33, 49, 69, 93, 119, + 149, 182, 219, 258, 301, 347, 396, 448, + 503, 561, 623, 687, 755, 825, 898, 974, + 1054, 1136, 1221, 1309, 1399, 1493, 1589, 1688, + 1790, 1895, 2002, 2112, 2225, 2340, 2458, 2579, + 2702, 2827, 2955, 3086, 3219, 3355, 3493, 3633, + 3775, 3920, 4068, 4217, 4369, 4523, 4679, 4837, + 4998, 5160, 5325, 5491, 5660, 5830, 6003, 6177, + 6353, 6531, 6711, 6892, 7076, 7260, 7447, 7635, + 7825, 8016, 8209, 8403, 8599, 8796, 8995, 9195, + 9396, 9598, 9802, 10007, 10212, 10419, 10628, 10837, + 11047, 11248, 11437, 11623, 11809, 11997, 12185, 12374, + 12564, 12754, 12944, 13135, 13326, 13517, 13709, 13901, + 14093, 14286, 14478, 14671, 14864, 15057, 15250, 15443, + 15636, 15829, 16023, 16216, 16409, 16602, 16794, 16987, + 17179, 17372, 17564, 17755, 17947, 18138, 18329, 18519, + 18710, 18899, 19089, 19278, 19466, 19654, 19841, 20028, + 20214, 20400, 20585, 20770, 20954, 21137, 21319, 21501, + 21682, 21862, 22042, 22220, 22398, 22575, 22751, 22926, + 23101, 23274, 23446, 23618, 23788, 23958, 24126, 24266, + 24321, 24460, 24625, 24789, 24953, 25114, 25275, 25435, + 25593, 25751, 25907, 26061, 26215, 26367, 26518, 26668, + 26817, 26964, 27110, 27254, 27398, 27540, 27680, 27819, + 27957, 28093, 28228, 28362, 28494, 28625, 28754, 28882, + 29008, 29133, 29256, 29378, 29499, 29618, 29736, 29852, + 29966, 30079, 30191, 30301, 30410, 30517, 30623, 30727, + 30830, 30931, 31031, 31129, 31226, 31322, 31416, 31508, + 31599, 31689, 31777, 31864, 31950, 32035, 32118, 32200, + 32280, 32360, 32439, 32517, 32595, 32673, 32673, 32593, + 32513, 32432, 32349, 32265, 32178, 32090, 31999, 31907, + 31812, 31715, 31615, 31514, 31410, 31304, 31196, 31085, + 30972, 30857, 30739, 30619, 30497, 30372, 30245, 30116, + 29984, 29850, 29714, 29575, 29434, 29290, 29144, 28996, + 28845, 28692, 28537, 28379, 28219, 28057, 27892, 27725, + 27555, 27383, 27209, 27033, 26854, 26672, 26489, 26303, + 26115, 25924, 25731, 25536, 25338, 25138, 24936, 24731, + 24525, 24316, 24104, 23890, 23674, 23456, 23236, 23013, + 22788, 22561, 22331, 22138, 22060, 21865, 21629, 21390, + 21150, 20907, 20662, 20414, 20165, 19913, 19659, 19403, + 19145, 18885, 18622, 18357, 18090, 17821, 17550, 17277, + 17001, 16723, 16443, 16161, 15877, 15591, 15303, 15012, + 14719, 14425, 14127, 13828, 13527, 13223, 12918, 12610, + 12300, 11988, 11673, 11356, 11038, 10716, 10393, 10067, + 9739, 9408, 9076, 8740, 8403, 8062, 7720, 7374, + 7026, 6675, 6322, 5965, 5606, 5243, 4878, 4508, + 4136, 3759, 3378, 2993, 2603, 2208, 1807, 1397, + 978, 545 +};//Q15 + +const Word16 window_48kHz_fx[1110] = +{ + 0, 1, 2, 3, 5, 8, 10, 13, + 17, 21, 25, 30, 35, 40, 46, 52, + 58, 65, 72, 80, 88, 96, 105, 114, + 124, 133, 144, 154, 165, 176, 188, 200, + 212, 225, 238, 251, 265, 279, 293, 308, + 323, 339, 354, 371, 387, 404, 421, 439, + 457, 475, 493, 512, 532, 551, 571, 591, + 612, 633, 654, 676, 698, 720, 743, 766, + 789, 813, 837, 861, 885, 910, 936, 961, + 987, 1013, 1040, 1067, 1094, 1122, 1149, 1178, + 1206, 1235, 1264, 1293, 1323, 1353, 1384, 1414, + 1445, 1477, 1508, 1540, 1573, 1605, 1638, 1671, + 1705, 1739, 1773, 1807, 1842, 1877, 1912, 1948, + 1984, 2020, 2057, 2093, 2130, 2168, 2206, 2244, + 2282, 2320, 2359, 2399, 2438, 2478, 2518, 2558, + 2599, 2640, 2681, 2722, 2764, 2806, 2848, 2891, + 2934, 2977, 3020, 3064, 3108, 3152, 3196, 3241, + 3286, 3332, 3377, 3423, 3469, 3515, 3562, 3609, + 3656, 3704, 3751, 3799, 3847, 3896, 3945, 3994, + 4043, 4092, 4142, 4192, 4242, 4293, 4343, 4394, + 4445, 4497, 4549, 4600, 4653, 4705, 4758, 4811, + 4864, 4917, 4971, 5024, 5078, 5133, 5187, 5242, + 5297, 5352, 5407, 5463, 5519, 5575, 5631, 5688, + 5744, 5801, 5859, 5916, 5974, 6031, 6089, 6147, + 6206, 6265, 6323, 6382, 6442, 6501, 6561, 6620, + 6680, 6741, 6801, 6862, 6922, 6983, 7045, 7106, + 7168, 7229, 7291, 7353, 7416, 7478, 7541, 7604, + 7667, 7730, 7793, 7857, 7920, 7984, 8048, 8112, + 8177, 8241, 8306, 8371, 8436, 8501, 8566, 8632, + 8697, 8763, 8829, 8895, 8961, 9028, 9094, 9161, + 9228, 9295, 9362, 9429, 9497, 9564, 9632, 9700, + 9768, 9836, 9904, 9972, 10041, 10109, 10178, 10247, + 10316, 10385, 10454, 10523, 10593, 10662, 10732, 10802, + 10871, 10941, 11012, 11082, 11152, 11222, 11283, 11344, + 11406, 11467, 11529, 11591, 11653, 11716, 11778, 11840, + 11903, 11966, 12028, 12091, 12154, 12217, 12280, 12343, + 12406, 12469, 12532, 12595, 12658, 12722, 12785, 12849, + 12912, 12976, 13039, 13103, 13166, 13230, 13294, 13358, + 13421, 13485, 13549, 13613, 13677, 13741, 13805, 13869, + 13933, 13997, 14061, 14125, 14189, 14253, 14318, 14382, + 14446, 14510, 14574, 14639, 14703, 14767, 14832, 14896, + 14960, 15025, 15089, 15153, 15218, 15282, 15346, 15411, + 15475, 15540, 15604, 15668, 15733, 15797, 15862, 15926, + 15990, 16055, 16119, 16183, 16248, 16312, 16376, 16441, + 16505, 16569, 16634, 16698, 16762, 16826, 16891, 16955, + 17019, 17083, 17147, 17211, 17275, 17339, 17404, 17468, + 17532, 17596, 17659, 17723, 17787, 17851, 17915, 17979, + 18042, 18106, 18170, 18233, 18297, 18361, 18424, 18488, + 18551, 18614, 18678, 18741, 18804, 18868, 18931, 18994, + 19057, 19120, 19183, 19246, 19309, 19372, 19434, 19497, + 19560, 19622, 19685, 19748, 19810, 19872, 19935, 19997, + 20059, 20121, 20183, 20245, 20307, 20369, 20431, 20493, + 20554, 20616, 20677, 20739, 20800, 20862, 20923, 20984, + 21045, 21106, 21167, 21228, 21289, 21349, 21410, 21471, + 21531, 21591, 21652, 21712, 21772, 21832, 21892, 21952, + 22012, 22071, 22131, 22190, 22250, 22309, 22368, 22427, + 22486, 22545, 22604, 22663, 22722, 22780, 22839, 22897, + 22955, 23013, 23071, 23129, 23187, 23245, 23303, 23360, + 23418, 23475, 23532, 23589, 23646, 23703, 23760, 23817, + 23873, 23930, 23986, 24042, 24098, 24154, 24210, 24266, + 24321, 24377, 24432, 24488, 24543, 24598, 24653, 24707, + 24762, 24817, 24871, 24925, 24979, 25034, 25087, 25141, + 25195, 25248, 25302, 25355, 25408, 25461, 25514, 25567, + 25620, 25672, 25724, 25777, 25829, 25881, 25932, 25984, + 26036, 26087, 26138, 26189, 26240, 26291, 26342, 26393, + 26443, 26493, 26543, 26593, 26643, 26693, 26743, 26792, + 26841, 26890, 26939, 26988, 27037, 27086, 27134, 27182, + 27230, 27278, 27326, 27374, 27421, 27469, 27516, 27563, + 27610, 27657, 27703, 27750, 27796, 27842, 27888, 27934, + 27980, 28025, 28071, 28116, 28161, 28206, 28250, 28295, + 28340, 28384, 28428, 28472, 28516, 28559, 28603, 28646, + 28689, 28732, 28775, 28818, 28860, 28903, 28945, 28987, + 29029, 29071, 29112, 29154, 29195, 29236, 29277, 29318, + 29358, 29399, 29439, 29479, 29519, 29559, 29598, 29638, + 29677, 29716, 29755, 29794, 29832, 29871, 29909, 29947, + 29985, 30023, 30061, 30098, 30135, 30172, 30209, 30246, + 30283, 30319, 30356, 30392, 30428, 30464, 30499, 30535, + 30570, 30605, 30640, 30675, 30710, 30744, 30779, 30813, + 30847, 30881, 30914, 30948, 30981, 31014, 31047, 31080, + 31113, 31145, 31178, 31210, 31242, 31274, 31306, 31337, + 31369, 31400, 31431, 31462, 31493, 31523, 31554, 31584, + 31614, 31644, 31674, 31704, 31733, 31763, 31792, 31821, + 31850, 31879, 31907, 31936, 31964, 31992, 32020, 32048, + 32076, 32104, 32131, 32159, 32186, 32213, 32240, 32267, + 32294, 32320, 32347, 32373, 32399, 32426, 32452, 32478, + 32504, 32530, 32556, 32582, 32607, 32633, 32659, 32685, + 32712, 32739, 32739, 32712, 32685, 32659, 32633, 32606, + 32580, 32553, 32527, 32500, 32473, 32446, 32418, 32391, + 32363, 32335, 32307, 32279, 32251, 32222, 32193, 32164, + 32134, 32105, 32075, 32045, 32015, 31984, 31953, 31922, + 31891, 31859, 31828, 31796, 31764, 31731, 31698, 31665, + 31632, 31599, 31565, 31531, 31497, 31462, 31428, 31393, + 31357, 31322, 31286, 31250, 31214, 31177, 31141, 31104, + 31066, 31029, 30991, 30953, 30915, 30876, 30837, 30798, + 30759, 30719, 30679, 30639, 30599, 30558, 30517, 30476, + 30435, 30393, 30351, 30309, 30266, 30224, 30181, 30138, + 30094, 30050, 30006, 29962, 29917, 29873, 29827, 29782, + 29737, 29691, 29645, 29598, 29551, 29505, 29457, 29410, + 29362, 29314, 29266, 29218, 29169, 29120, 29070, 29021, + 28971, 28921, 28871, 28820, 28769, 28718, 28667, 28615, + 28563, 28511, 28459, 28406, 28353, 28300, 28246, 28192, + 28138, 28084, 28030, 27975, 27920, 27864, 27809, 27753, + 27697, 27640, 27584, 27527, 27470, 27412, 27355, 27297, + 27238, 27180, 27121, 27062, 27003, 26944, 26884, 26824, + 26763, 26703, 26642, 26581, 26520, 26458, 26396, 26334, + 26272, 26209, 26146, 26083, 26020, 25956, 25892, 25828, + 25763, 25699, 25634, 25568, 25503, 25437, 25371, 25305, + 25239, 25172, 25105, 25037, 24970, 24902, 24834, 24766, + 24697, 24628, 24559, 24490, 24420, 24351, 24281, 24210, + 24140, 24069, 23998, 23926, 23855, 23783, 23711, 23638, + 23566, 23493, 23420, 23346, 23273, 23199, 23125, 23050, + 22976, 22901, 22826, 22750, 22675, 22599, 22523, 22446, + 22370, 22293, 22215, 22138, 22060, 21983, 21904, 21826, + 21747, 21669, 21589, 21510, 21430, 21351, 21271, 21190, + 21110, 21029, 20948, 20866, 20785, 20703, 20621, 20538, + 20456, 20373, 20290, 20207, 20123, 20039, 19955, 19871, + 19787, 19702, 19617, 19532, 19446, 19360, 19274, 19188, + 19102, 19015, 18928, 18841, 18754, 18666, 18578, 18490, + 18402, 18313, 18224, 18135, 18046, 17956, 17866, 17776, + 17686, 17595, 17505, 17414, 17322, 17231, 17139, 17047, + 16955, 16863, 16770, 16677, 16584, 16490, 16397, 16303, + 16209, 16114, 16020, 15925, 15830, 15735, 15639, 15543, + 15447, 15351, 15254, 15158, 15061, 14964, 14866, 14768, + 14671, 14572, 14474, 14375, 14276, 14177, 14078, 13978, + 13878, 13778, 13678, 13578, 13477, 13376, 13274, 13173, + 13071, 12969, 12867, 12764, 12662, 12559, 12455, 12352, + 12248, 12144, 12040, 11936, 11831, 11726, 11621, 11515, + 11410, 11304, 11197, 11091, 10984, 10877, 10770, 10663, + 10555, 10447, 10339, 10230, 10122, 10013, 9904, 9794, + 9684, 9574, 9464, 9353, 9243, 9131, 9020, 8908, + 8797, 8684, 8572, 8459, 8346, 8233, 8119, 8006, + 7892, 7777, 7662, 7547, 7432, 7317, 7201, 7085, + 6968, 6851, 6734, 6617, 6499, 6381, 6263, 6144, + 6025, 5906, 5786, 5666, 5546, 5425, 5304, 5183, + 5061, 4939, 4817, 4694, 4570, 4447, 4323, 4198, + 4074, 3948, 3823, 3696, 3570, 3443, 3315, 3187, + 3058, 2929, 2800, 2669, 2539, 2407, 2275, 2142, + 2009, 1875, 1740, 1604, 1467, 1330, 1191, 1051, + 909, 766, 621, 474, 324, 169 +};//Q15 + +const Word16 window_256kHz[592] = /*ALDO at 25.6 maybe not needed ?Q15*/ +{ + 1, 3, 7, 12, 19, 27, 36, 47, + 58, 72, 86, 102, 119, 138, 157, 178, + 201, 224, 249, 275, 302, 331, 361, 391, + 424, 457, 492, 527, 564, 603, 642, 683, + 724, 767, 811, 857, 903, 951, 999, 1049, + 1100, 1152, 1205, 1260, 1315, 1372, 1430, 1488, + 1548, 1609, 1671, 1735, 1799, 1864, 1931, 1998, + 2066, 2136, 2207, 2278, 2351, 2424, 2499, 2575, + 2651, 2729, 2808, 2887, 2968, 3049, 3132, 3215, + 3300, 3385, 3472, 3559, 3647, 3736, 3826, 3917, + 4009, 4101, 4195, 4289, 4385, 4481, 4578, 4676, + 4774, 4874, 4974, 5075, 5177, 5280, 5384, 5488, + 5593, 5699, 5806, 5913, 6021, 6130, 6240, 6350, + 6461, 6573, 6685, 6798, 6912, 7026, 7141, 7257, + 7373, 7491, 7608, 7726, 7845, 7965, 8085, 8206, + 8327, 8449, 8571, 8694, 8817, 8941, 9066, 9191, + 9316, 9442, 9569, 9696, 9823, 9951, 10079, 10208, + 10337, 10467, 10597, 10727, 10858, 10990, 11121, 11253, + 11367, 11482, 11598, 11714, 11831, 11948, 12065, 12182, + 12300, 12418, 12536, 12654, 12772, 12891, 13010, 13129, + 13248, 13367, 13486, 13605, 13725, 13844, 13964, 14084, + 14203, 14323, 14443, 14563, 14683, 14804, 14924, 15044, + 15164, 15284, 15405, 15525, 15645, 15765, 15885, 16006, + 16126, 16246, 16366, 16486, 16606, 16726, 16846, 16966, + 17086, 17206, 17325, 17445, 17564, 17684, 17803, 17922, + 18041, 18160, 18279, 18397, 18516, 18634, 18753, 18871, + 18988, 19106, 19224, 19341, 19458, 19575, 19692, 19809, + 19925, 20041, 20157, 20273, 20388, 20503, 20618, 20733, + 20848, 20962, 21076, 21190, 21303, 21416, 21529, 21642, + 21754, 21866, 21978, 22089, 22200, 22311, 22421, 22531, + 22641, 22751, 22860, 22968, 23077, 23185, 23293, 23400, + 23507, 23613, 23719, 23825, 23931, 24036, 24140, 24244, + 24348, 24452, 24555, 24657, 24759, 24861, 24962, 25063, + 25163, 25263, 25363, 25462, 25561, 25659, 25756, 25854, + 25950, 26047, 26142, 26238, 26333, 26427, 26521, 26614, + 26707, 26799, 26891, 26982, 27073, 27164, 27253, 27343, + 27432, 27520, 27608, 27695, 27781, 27868, 27953, 28038, + 28123, 28207, 28290, 28373, 28456, 28537, 28619, 28699, + 28780, 28859, 28938, 29017, 29095, 29172, 29249, 29325, + 29401, 29476, 29550, 29624, 29698, 29771, 29843, 29915, + 29986, 30056, 30126, 30196, 30264, 30333, 30400, 30467, + 30534, 30600, 30665, 30730, 30794, 30858, 30921, 30984, + 31046, 31107, 31168, 31228, 31288, 31347, 31406, 31464, + 31522, 31579, 31635, 31691, 31746, 31801, 31856, 31909, + 31963, 32016, 32068, 32120, 32171, 32222, 32273, 32323, + 32372, 32422, 32471, 32520, 32568, 32617, 32666, 32715, + 32715, 32666, 32616, 32567, 32517, 32466, 32415, 32364, + 32311, 32258, 32204, 32150, 32094, 32038, 31981, 31923, + 31864, 31805, 31744, 31683, 31621, 31557, 31494, 31429, + 31363, 31296, 31229, 31161, 31091, 31021, 30950, 30878, + 30805, 30731, 30657, 30581, 30505, 30427, 30349, 30270, + 30189, 30108, 30026, 29943, 29860, 29775, 29689, 29603, + 29515, 29427, 29337, 29247, 29156, 29064, 28971, 28877, + 28782, 28687, 28590, 28492, 28394, 28294, 28194, 28093, + 27991, 27888, 27784, 27679, 27573, 27466, 27358, 27250, + 27140, 27030, 26919, 26806, 26693, 26579, 26464, 26349, + 26232, 26114, 25996, 25876, 25756, 25635, 25512, 25389, + 25265, 25140, 25015, 24888, 24761, 24632, 24503, 24373, + 24242, 24110, 23977, 23843, 23708, 23573, 23436, 23299, + 23161, 23022, 22882, 22741, 22599, 22457, 22313, 22169, + 22024, 21878, 21731, 21583, 21435, 21285, 21135, 20984, + 20832, 20679, 20525, 20370, 20215, 20059, 19901, 19743, + 19584, 19425, 19264, 19103, 18940, 18777, 18613, 18448, + 18283, 18116, 17949, 17781, 17612, 17442, 17271, 17100, + 16927, 16754, 16580, 16405, 16230, 16053, 15876, 15698, + 15518, 15339, 15158, 14976, 14794, 14611, 14427, 14242, + 14056, 13869, 13682, 13494, 13305, 13115, 12924, 12732, + 12540, 12346, 12152, 11957, 11761, 11564, 11366, 11168, + 10968, 10768, 10566, 10364, 10161, 9957, 9752, 9547, + 9340, 9132, 8924, 8714, 8503, 8292, 8079, 7866, + 7651, 7436, 7219, 7002, 6783, 6563, 6343, 6121, + 5897, 5673, 5448, 5221, 4993, 4764, 4533, 4301, + 4067, 3832, 3596, 3358, 3118, 2876, 2632, 2387, + 2139, 1888, 1635, 1379, 1119, 854, 583, 304 +}; + +const Word16 small_overlap_48[R2_48 / 7] =//Q15 +{ + 429, 1286, 2143, 2998, 3851, 4702, 5549, 6393, + 7232, 8066, 8895, 9717, 10533, 11342, 12142, 12935, + 13719, 14493, 15257, 16011, 16754, 17485, 18205, 18912, + 19606, 20286, 20953, 21605, 22243, 22865, 23472, 24062, + 24636, 25193, 25733, 26255, 26760, 27246, 27713, 28161, + 28590, 28999, 29389, 29758, 30107, 30435, 30743, 31029, + 31294, 31538, 31760, 31960, 32138, 32295, 32429, 32541, + 32631, 32698, 32743, 32765 +}; + +const Word16 small_overlap_25[R2_25 / 7] =//Q15 +{ + 804, 2411, 4011, 5602, 7180, 8740, 10279, 11793, + 13279, 14733, 16151, 17531, 18868, 20160, 21403, 22595, + 23732, 24812, 25833, 26791, 27684, 28511, 29269, 29957, + 30572, 31114, 31581, 31972, 32286, 32522, 32679, 32758 +}; + +const Word16 small_overlap_int[R2_16 / 7] =//Q15 +{ + 2571, 5126, + 7650, 10126, 12540, 14876, 17121, 19261, 21281, 22865, + 23472, 24917, 26510, 27939, 29197, 30274, 31164, 31863, + 32365, 32667 +}; + + +const Word16 half_overlap_48[3 * R2_48 / 7] =//Q15 +{ + 143, 429, + 715, 1001, 1286, 1572, 1858, 2143, 2428, 2713, + 2998, 3283, 3567, 3851, 4135, 4419, 4702, 4985, + 5267, 5549, 5831, 6112, 6393, 6673, 6953, 7232, + 7510, 7788, 8066, 8343, 8619, 8895, 9169, 9444, + 9717, 9990, 10262, 10533, 10803, 11073, 11342, 11609, + 11876, 12142, 12408, 12672, 12935, 13197, 13458, 13719, + 13978, 14236, 14493, 14749, 15004, 15257, 15510, 15761, + 16011, 16260, 16508, 16754, 16999, 17243, 17485, 17727, + 17966, 18205, 18442, 18678, 18912, 19145, 19376, 19606, + 19834, 20061, 20286, 20510, 20732, 20953, 21172, 21390, + 21605, 21820, 22032, 22243, 22452, 22659, 22865, 23069, + 23271, 23472, 23670, 23867, 24062, 24255, 24447, 24636, + 24824, 25010, 25193, 25375, 25555, 25733, 25909, 26083, + 26255, 26426, 26594, 26760, 26924, 27086, 27246, 27403, + 27559, 27713, 27864, 28014, 28161, 28306, 28449, 28590, + 28729, 28865, 28999, 29131, 29261, 29389, 29514, 29637, + 29758, 29877, 29993, 30107, 30219, 30328, 30435, 30540, + 30643, 30743, 30840, 30936, 31029, 31120, 31208, 31294, + 31378, 31459, 31538, 31614, 31688, 31760, 31829, 31896, + 31960, 32022, 32081, 32138, 32193, 32245, 32295, 32342, + 32387, 32429, 32469, 32506, 32541, 32573, 32603, 32631, + 32655, 32678, 32698, 32715, 32730, 32743, 32753, 32760, + 32765, 32767 +}; + +const Word16 half_overlap_25[3 * R2_25 / 7] =//Q15 +{ + 268, 804, 1340, 1876, 2411, 2945, 3479, 4011, + 4543, 5073, 5602, 6130, 6655, 7180, 7702, 8222, + 8740, 9255, 9768, 10279, 10786, 11291, 11793, 12292, + 12787, 13279, 13767, 14252, 14733, 15210, 15683, 16151, + 16616, 17075, 17531, 17981, 18427, 18868, 19304, 19735, + 20160, 20580, 20994, 21403, 21806, 22204, 22595, 22980, + 23359, 23732, 24099, 24459, 24812, 25159, 25499, 25833, + 26159, 26478, 26791, 27096, 27394, 27684, 27967, 28243, + 28511, 28771, 29024, 29269, 29506, 29736, 29957, 30170, + 30375, 30572, 30761, 30942, 31114, 31278, 31434, 31581, + 31720, 31850, 31972, 32085, 32190, 32286, 32373, 32452, + 32522, 32583, 32635, 32679, 32714, 32741, 32758, 32767 +}; + +const Word16 half_overlap_int[3 * R2_16 / 7] =//Q15 +{ + 858, 1715, 2571, 3425, 4277, 5126, + 5971, 6813, 7650, 8481, 9307, 10126, 10938, 11743, + 12540, 13328, 14107, 14876, 15636, 16384, 17121, 17847, + 18560, 19261, 19948, 20622, 21281, 21926, 22556, 23069, + 23271, 23769, 24351, 24917, 25466, 25997, 26510, 27005, + 27482, 27939, 28378, 28797, 29197, 29576, 29935, 30274, + 30592, 30888, 31164, 31419, 31651, 31863, 32052, 32219, + 32365, 32488, 32588, 32667, 32723, 32757 +}; +const Word16 wac_h[LPC_SHB_ORDER] =//Q15 +{ + 32763, + 32751, + 32731, + 32703, + 32667, + 32622, + 32570, + 32510, + 32442, + 32366 +}; + +const Word16 wac_l[LPC_SHB_ORDER] =//Q15 +{ + 31381, + 27317, + 20869, + 12529, + 2980, + 25869, + 16731, + 9600, + 5926, + 7354 +}; + +const Word16 dsDiracsTab[65] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 23, 25, + 27, 29, 31, 33, 35, 37, 39, 43, + 47, 51, 55, 59, 63, 67, 71, 75, + 83, 91, 99, 107, 115, 123, 131, 139, + 147, 163, 179, 195, 211, 227, 243, 259, + 275, 291, 323, 355, 387, 419, 451, 483, + 512 +}; + +const Word16 pwf_fx[17] =//Q12 +{ + 22938, 16056, 11239, 7868, 5507, 3855, 2699, 1889, + 1322, 926, 648, 454, 317, 222, 156, 109, + 76 +}; + +const Word32 inverse_table[] =//Q29 +{ + 0, + 134217728, 67108864, 44739242, 33554432, 26843545, 22369621, 19173961, 16777216, 14913080, 13421772, 12201611, 11184810, 10324440, 9586980, 8947848, 8388608, 7895160, 7456540, 7064090, 6710886, 6391320, 6100805, 5835553, 5592405, 5368709, 5162220, 4971026, 4793490, 4628197, 4473924, 4329604, 4194304, 4067203, 3947580, 3834792, 3728270, 3627506, 3532045, 3441480, 3355443, 3273603, 3195660, 3121342, 3050402, 2982616, 2917776, 2855696, 2796202, 2739137, 2684354, 2631720, 2581110, 2532409, 2485513, 2440322, 2396745, 2354696, 2314098, 2274876, 2236962, 2200290, 2164802, 2130440, 2097152, 2064888, 2033601, 2003249, 1973790, 1945184, 1917396, 1890390, 1864135, 1838599, 1813753, 1789569, 1766022, 1743087, 1720740, 1698958, 1677721, 1657008, 1636801, 1617081, 1597830, 1579032, 1560671, 1542732, 1525201, 1508064, 1491308, 1474920, 1458888, 1443201, 1427848, 1412818, 1398101, 1383687, 1369568, 1355734, 1342177, 1328888, 1315860, 1303084, 1290555, 1278264, 1266204, 1254371, 1242756, 1231355, 1220161, 1209168, 1198372, 1187767, 1177348, 1167110, 1157049, 1147160, 1137438, 1127880, 1118481, 1109237, 1100145, 1091201, 1082401, 1073741, 1065220, 1056832, 1048576, 1040447, 1032444, 1024562, 1016800, 1009155, 1001624, 994205, 986895, 979691, 972592, 965595, 958698, 951898, 945195, 938585, 932067, 925639, 919299, 913045, 906876, 900790, 894784, 888859, 883011, 877240, 871543, 865920, 860370, 854889, 849479, 844136, 838860, 833650, 828504, 823421, 818400, 813440, 808540, 803698, 798915, 794187, 789516, 784898, 780335, 775825, 771366, 766958, 762600, 758292, 754032, 749819, 745654, 741534, 737460, 733430, 729444, 725501, 721600, 717741, 713924, 710146, 706409, 702710, 699050, 695428, 691843, 688296, 684784, 681308, 677867, 674460, 671088, 667749, 664444, 661171, 657930, 654720, 651542, 648394, 645277, 642190, 639132, 636102, 633102, 630130, 627185, 624268, 621378, 618514, 615677, 612866, 610080, 607320, 604584, 601873, 599186, 596523, 593883, 591267, 588674, 586103, 583555, 581029, 578524, 576041, 573580, 571139, 568719, 566319, 563940, 561580, 559240, 556920, 554618, 552336, 550072, 547827, 545600, 543391, 541200, 539027, 536870, 534731, 532610, 530504, 528416, 526344, +}; + +const Word16 cos_diff_table[512] =//Q15 +{ + SHC(0xFFFF), SHC(0xFFF8), SHC(0xFFF4), SHC(0xFFEF), SHC(0xFFE9), SHC(0xFFE5), SHC(0xFFE0), SHC(0xFFDB), + SHC(0xFFD6), SHC(0xFFD2), SHC(0xFFCC), SHC(0xFFC7), SHC(0xFFC3), SHC(0xFFBE), SHC(0xFFB8), SHC(0xFFB4), + SHC(0xFFB0), SHC(0xFFAA), SHC(0xFFA5), SHC(0xFFA1), SHC(0xFF9C), SHC(0xFF97), SHC(0xFF92), SHC(0xFF8E), + SHC(0xFF89), SHC(0xFF84), SHC(0xFF80), SHC(0xFF7B), SHC(0xFF76), SHC(0xFF71), SHC(0xFF6D), SHC(0xFF69), + SHC(0xFF64), SHC(0xFF5F), SHC(0xFF5B), SHC(0xFF56), SHC(0xFF52), SHC(0xFF4D), SHC(0xFF49), SHC(0xFF45), + SHC(0xFF40), SHC(0xFF3C), SHC(0xFF38), SHC(0xFF33), SHC(0xFF2F), SHC(0xFF2B), SHC(0xFF27), SHC(0xFF23), + SHC(0xFF1E), SHC(0xFF1B), SHC(0xFF16), SHC(0xFF13), SHC(0xFF0E), SHC(0xFF0B), SHC(0xFF06), SHC(0xFF03), + SHC(0xFEFF), SHC(0xFEFB), SHC(0xFEF8), SHC(0xFEF3), SHC(0xFEF1), SHC(0xFEEC), SHC(0xFEE9), SHC(0xFEE5), + SHC(0xFEE2), SHC(0xFEDF), SHC(0xFEDB), SHC(0xFED8), SHC(0xFED4), SHC(0xFED1), SHC(0xFECE), SHC(0xFECB), + SHC(0xFEC7), SHC(0xFEC5), SHC(0xFEC1), SHC(0xFEBF), SHC(0xFEBB), SHC(0xFEB9), SHC(0xFEB6), SHC(0xFEB3), + SHC(0xFEB0), SHC(0xFEAE), SHC(0xFEAB), SHC(0xFEA8), SHC(0xFEA6), SHC(0xFEA3), SHC(0xFEA1), SHC(0xFE9F), + SHC(0xFE9C), SHC(0xFE9A), SHC(0xFE98), SHC(0xFE95), SHC(0xFE94), SHC(0xFE91), SHC(0xFE8F), SHC(0xFE8E), + SHC(0xFE8B), SHC(0xFE8A), SHC(0xFE88), SHC(0xFE86), SHC(0xFE85), SHC(0xFE83), SHC(0xFE81), SHC(0xFE80), + SHC(0xFE7F), SHC(0xFE7D), SHC(0xFE7B), SHC(0xFE7B), SHC(0xFE79), SHC(0xFE79), SHC(0xFE77), SHC(0xFE76), + SHC(0xFE75), SHC(0xFE74), SHC(0xFE73), SHC(0xFE73), SHC(0xFE72), SHC(0xFE71), SHC(0xFE71), SHC(0xFE70), + SHC(0xFE6F), SHC(0xFE70), SHC(0xFE6E), SHC(0xFE6F), SHC(0xFE6E), SHC(0xFE6E), SHC(0xFE6E), SHC(0xFE6E), + SHC(0xFE6E), SHC(0xFE6E), SHC(0xFE6E), SHC(0xFE6E), SHC(0xFE6F), SHC(0xFE6E), SHC(0xFE70), SHC(0xFE6F), + SHC(0xFE70), SHC(0xFE71), SHC(0xFE71), SHC(0xFE72), SHC(0xFE73), SHC(0xFE73), SHC(0xFE74), SHC(0xFE75), + SHC(0xFE76), SHC(0xFE77), SHC(0xFE79), SHC(0xFE79), SHC(0xFE7B), SHC(0xFE7B), SHC(0xFE7D), SHC(0xFE7F), + SHC(0xFE80), SHC(0xFE81), SHC(0xFE83), SHC(0xFE85), SHC(0xFE86), SHC(0xFE88), SHC(0xFE8A), SHC(0xFE8B), + SHC(0xFE8E), SHC(0xFE8F), SHC(0xFE91), SHC(0xFE94), SHC(0xFE95), SHC(0xFE98), SHC(0xFE9A), SHC(0xFE9C), + SHC(0xFE9F), SHC(0xFEA1), SHC(0xFEA3), SHC(0xFEA6), SHC(0xFEA8), SHC(0xFEAB), SHC(0xFEAE), SHC(0xFEB0), + SHC(0xFEB3), SHC(0xFEB6), SHC(0xFEB9), SHC(0xFEBB), SHC(0xFEBF), SHC(0xFEC1), SHC(0xFEC5), SHC(0xFEC7), + SHC(0xFECB), SHC(0xFECE), SHC(0xFED1), SHC(0xFED4), SHC(0xFED8), SHC(0xFEDB), SHC(0xFEDF), SHC(0xFEE2), + SHC(0xFEE5), SHC(0xFEE9), SHC(0xFEEC), SHC(0xFEF1), SHC(0xFEF3), SHC(0xFEF8), SHC(0xFEFB), SHC(0xFEFF), + SHC(0xFF03), SHC(0xFF06), SHC(0xFF0B), SHC(0xFF0E), SHC(0xFF13), SHC(0xFF16), SHC(0xFF1B), SHC(0xFF1E), + SHC(0xFF23), SHC(0xFF27), SHC(0xFF2B), SHC(0xFF2F), SHC(0xFF33), SHC(0xFF38), SHC(0xFF3C), SHC(0xFF40), + SHC(0xFF45), SHC(0xFF49), SHC(0xFF4D), SHC(0xFF52), SHC(0xFF56), SHC(0xFF5B), SHC(0xFF5F), SHC(0xFF64), + SHC(0xFF69), SHC(0xFF6D), SHC(0xFF71), SHC(0xFF76), SHC(0xFF7B), SHC(0xFF80), SHC(0xFF84), SHC(0xFF89), + SHC(0xFF8E), SHC(0xFF92), SHC(0xFF97), SHC(0xFF9C), SHC(0xFFA1), SHC(0xFFA5), SHC(0xFFAA), SHC(0xFFB0), + SHC(0xFFB4), SHC(0xFFB8), SHC(0xFFBE), SHC(0xFFC3), SHC(0xFFC7), SHC(0xFFCC), SHC(0xFFD2), SHC(0xFFD6), + SHC(0xFFDB), SHC(0xFFE0), SHC(0xFFE5), SHC(0xFFE9), SHC(0xFFEF), SHC(0xFFF4), SHC(0xFFF8), SHC(0xFFFF), + SHC(0x0001), SHC(0x0008), SHC(0x000C), SHC(0x0011), SHC(0x0017), SHC(0x001B), SHC(0x0020), SHC(0x0025), + SHC(0x002A), SHC(0x002E), SHC(0x0034), SHC(0x0039), SHC(0x003D), SHC(0x0042), SHC(0x0048), SHC(0x004C), + SHC(0x0050), SHC(0x0056), SHC(0x005B), SHC(0x005F), SHC(0x0064), SHC(0x0069), SHC(0x006E), SHC(0x0072), + SHC(0x0077), SHC(0x007C), SHC(0x0080), SHC(0x0085), SHC(0x008A), SHC(0x008F), SHC(0x0093), SHC(0x0097), + SHC(0x009C), SHC(0x00A1), SHC(0x00A5), SHC(0x00AA), SHC(0x00AE), SHC(0x00B3), SHC(0x00B7), SHC(0x00BB), + SHC(0x00C0), SHC(0x00C4), SHC(0x00C8), SHC(0x00CD), SHC(0x00D1), SHC(0x00D5), SHC(0x00D9), SHC(0x00DD), + SHC(0x00E2), SHC(0x00E5), SHC(0x00EA), SHC(0x00ED), SHC(0x00F2), SHC(0x00F5), SHC(0x00FA), SHC(0x00FD), + SHC(0x0101), SHC(0x0105), SHC(0x0108), SHC(0x010D), SHC(0x010F), SHC(0x0114), SHC(0x0117), SHC(0x011B), + SHC(0x011E), SHC(0x0121), SHC(0x0125), SHC(0x0128), SHC(0x012C), SHC(0x012F), SHC(0x0132), SHC(0x0135), + SHC(0x0139), SHC(0x013B), SHC(0x013F), SHC(0x0141), SHC(0x0145), SHC(0x0147), SHC(0x014A), SHC(0x014D), + SHC(0x0150), SHC(0x0152), SHC(0x0155), SHC(0x0158), SHC(0x015A), SHC(0x015D), SHC(0x015F), SHC(0x0161), + SHC(0x0164), SHC(0x0166), SHC(0x0168), SHC(0x016B), SHC(0x016C), SHC(0x016F), SHC(0x0171), SHC(0x0172), + SHC(0x0175), SHC(0x0176), SHC(0x0178), SHC(0x017A), SHC(0x017B), SHC(0x017D), SHC(0x017F), SHC(0x0180), + SHC(0x0181), SHC(0x0183), SHC(0x0185), SHC(0x0185), SHC(0x0187), SHC(0x0187), SHC(0x0189), SHC(0x018A), + SHC(0x018B), SHC(0x018C), SHC(0x018D), SHC(0x018D), SHC(0x018E), SHC(0x018F), SHC(0x018F), SHC(0x0190), + SHC(0x0191), SHC(0x0190), SHC(0x0192), SHC(0x0191), SHC(0x0192), SHC(0x0192), SHC(0x0192), SHC(0x0192), + SHC(0x0192), SHC(0x0192), SHC(0x0192), SHC(0x0192), SHC(0x0191), SHC(0x0192), SHC(0x0190), SHC(0x0191), + SHC(0x0190), SHC(0x018F), SHC(0x018F), SHC(0x018E), SHC(0x018D), SHC(0x018D), SHC(0x018C), SHC(0x018B), + SHC(0x018A), SHC(0x0189), SHC(0x0187), SHC(0x0187), SHC(0x0185), SHC(0x0185), SHC(0x0183), SHC(0x0181), + SHC(0x0180), SHC(0x017F), SHC(0x017D), SHC(0x017B), SHC(0x017A), SHC(0x0178), SHC(0x0176), SHC(0x0175), + SHC(0x0172), SHC(0x0171), SHC(0x016F), SHC(0x016C), SHC(0x016B), SHC(0x0168), SHC(0x0166), SHC(0x0164), + SHC(0x0161), SHC(0x015F), SHC(0x015D), SHC(0x015A), SHC(0x0158), SHC(0x0155), SHC(0x0152), SHC(0x0150), + SHC(0x014D), SHC(0x014A), SHC(0x0147), SHC(0x0145), SHC(0x0141), SHC(0x013F), SHC(0x013B), SHC(0x0139), + SHC(0x0135), SHC(0x0132), SHC(0x012F), SHC(0x012C), SHC(0x0128), SHC(0x0125), SHC(0x0121), SHC(0x011E), + SHC(0x011B), SHC(0x0117), SHC(0x0114), SHC(0x010F), SHC(0x010D), SHC(0x0108), SHC(0x0105), SHC(0x0101), + SHC(0x00FD), SHC(0x00FA), SHC(0x00F5), SHC(0x00F2), SHC(0x00ED), SHC(0x00EA), SHC(0x00E5), SHC(0x00E2), + SHC(0x00DD), SHC(0x00D9), SHC(0x00D5), SHC(0x00D1), SHC(0x00CD), SHC(0x00C8), SHC(0x00C4), SHC(0x00C0), + SHC(0x00BB), SHC(0x00B7), SHC(0x00B3), SHC(0x00AE), SHC(0x00AA), SHC(0x00A5), SHC(0x00A1), SHC(0x009C), + SHC(0x0097), SHC(0x0093), SHC(0x008F), SHC(0x008A), SHC(0x0085), SHC(0x0080), SHC(0x007C), SHC(0x0077), + SHC(0x0072), SHC(0x006E), SHC(0x0069), SHC(0x0064), SHC(0x005F), SHC(0x005B), SHC(0x0056), SHC(0x0050), + SHC(0x004C), SHC(0x0048), SHC(0x0042), SHC(0x003D), SHC(0x0039), SHC(0x0034), SHC(0x002E), SHC(0x002A), + SHC(0x0025), SHC(0x0020), SHC(0x001B), SHC(0x0017), SHC(0x0011), SHC(0x000C), SHC(0x0008), SHC(0x0001) + +}; + +const Word16 fftSineTab640_fx[ 321 ] = +{//Q15 + SHC( 0x0000 ), SHC( 0x0141 ), SHC( 0x0283 ), SHC( 0x03c4 ), SHC( 0x0506 ), SHC( 0x0647 ), SHC( 0x0789 ), SHC( 0x08ca ), + SHC( 0x0a0a ), SHC( 0x0b4b ), SHC( 0x0c8b ), SHC( 0x0dcb ), SHC( 0x0f0b ), SHC( 0x104a ), SHC( 0x1189 ), SHC( 0x12c8 ), + SHC( 0x1406 ), SHC( 0x1543 ), SHC( 0x1680 ), SHC( 0x17bc ), SHC( 0x18f8 ), SHC( 0x1a33 ), SHC( 0x1b6e ), SHC( 0x1ca8 ), + SHC( 0x1de1 ), SHC( 0x1f19 ), SHC( 0x2051 ), SHC( 0x2188 ), SHC( 0x22be ), SHC( 0x23f3 ), SHC( 0x2528 ), SHC( 0x265b ), + SHC( 0x278d ), SHC( 0x28bf ), SHC( 0x29ef ), SHC( 0x2b1f ), SHC( 0x2c4d ), SHC( 0x2d7a ), SHC( 0x2ea6 ), SHC( 0x2fd1 ), + SHC( 0x30fb ), SHC( 0x3224 ), SHC( 0x334b ), SHC( 0x3471 ), SHC( 0x3596 ), SHC( 0x36ba ), SHC( 0x37dc ), SHC( 0x38fd ), + SHC( 0x3a1c ), SHC( 0x3b3a ), SHC( 0x3c56 ), SHC( 0x3d71 ), SHC( 0x3e8b ), SHC( 0x3fa3 ), SHC( 0x40b9 ), SHC( 0x41ce ), + SHC( 0x42e1 ), SHC( 0x43f2 ), SHC( 0x4502 ), SHC( 0x4610 ), SHC( 0x471c ), SHC( 0x4827 ), SHC( 0x4930 ), SHC( 0x4a37 ), + SHC( 0x4b3c ), SHC( 0x4c3f ), SHC( 0x4d41 ), SHC( 0x4e40 ), SHC( 0x4f3e ), SHC( 0x503a ), SHC( 0x5133 ), SHC( 0x522b ), + SHC( 0x5321 ), SHC( 0x5414 ), SHC( 0x5506 ), SHC( 0x55f5 ), SHC( 0x56e2 ), SHC( 0x57ce ), SHC( 0x58b7 ), SHC( 0x599d ), + SHC( 0x5a82 ), SHC( 0x5b64 ), SHC( 0x5c44 ), SHC( 0x5d22 ), SHC( 0x5dfe ), SHC( 0x5ed7 ), SHC( 0x5fae ), SHC( 0x6082 ), + SHC( 0x6154 ), SHC( 0x6224 ), SHC( 0x62f2 ), SHC( 0x63bc ), SHC( 0x6485 ), SHC( 0x654b ), SHC( 0x660e ), SHC( 0x66cf ), + SHC( 0x678d ), SHC( 0x6849 ), SHC( 0x6902 ), SHC( 0x69b9 ), SHC( 0x6a6d ), SHC( 0x6b1f ), SHC( 0x6bcd ), SHC( 0x6c79 ), + SHC( 0x6d23 ), SHC( 0x6dca ), SHC( 0x6e6e ), SHC( 0x6f0f ), SHC( 0x6fad ), SHC( 0x7049 ), SHC( 0x70e2 ), SHC( 0x7179 ), + SHC( 0x720c ), SHC( 0x729d ), SHC( 0x732a ), SHC( 0x73b5 ), SHC( 0x743e ), SHC( 0x74c3 ), SHC( 0x7545 ), SHC( 0x75c5 ), + SHC( 0x7641 ), SHC( 0x76bb ), SHC( 0x7732 ), SHC( 0x77a5 ), SHC( 0x7816 ), SHC( 0x7884 ), SHC( 0x78ef ), SHC( 0x7957 ), + SHC( 0x79bc ), SHC( 0x7a1e ), SHC( 0x7a7d ), SHC( 0x7ad8 ), SHC( 0x7b31 ), SHC( 0x7b87 ), SHC( 0x7bda ), SHC( 0x7c29 ), + SHC( 0x7c76 ), SHC( 0x7cc0 ), SHC( 0x7d06 ), SHC( 0x7d4a ), SHC( 0x7d8a ), SHC( 0x7dc7 ), SHC( 0x7e01 ), SHC( 0x7e38 ), + SHC( 0x7e6c ), SHC( 0x7e9d ), SHC( 0x7eca ), SHC( 0x7ef5 ), SHC( 0x7f1c ), SHC( 0x7f41 ), SHC( 0x7f62 ), SHC( 0x7f80 ), + SHC( 0x7f9a ), SHC( 0x7fb2 ), SHC( 0x7fc7 ), SHC( 0x7fd8 ), SHC( 0x7fe6 ), SHC( 0x7ff1 ), SHC( 0x7ff9 ), SHC( 0x7ffe ), + SHC( 0x7fff ), SHC( 0x7ffe ), SHC( 0x7ff9 ), SHC( 0x7ff1 ), SHC( 0x7fe6 ), SHC( 0x7fd8 ), SHC( 0x7fc7 ), SHC( 0x7fb2 ), + SHC( 0x7f9a ), SHC( 0x7f80 ), SHC( 0x7f62 ), SHC( 0x7f41 ), SHC( 0x7f1c ), SHC( 0x7ef5 ), SHC( 0x7eca ), SHC( 0x7e9d ), + SHC( 0x7e6c ), SHC( 0x7e38 ), SHC( 0x7e01 ), SHC( 0x7dc7 ), SHC( 0x7d8a ), SHC( 0x7d4a ), SHC( 0x7d06 ), SHC( 0x7cc0 ), + SHC( 0x7c76 ), SHC( 0x7c29 ), SHC( 0x7bda ), SHC( 0x7b87 ), SHC( 0x7b31 ), SHC( 0x7ad8 ), SHC( 0x7a7d ), SHC( 0x7a1e ), + SHC( 0x79bc ), SHC( 0x7957 ), SHC( 0x78ef ), SHC( 0x7884 ), SHC( 0x7816 ), SHC( 0x77a5 ), SHC( 0x7732 ), SHC( 0x76bb ), + SHC( 0x7641 ), SHC( 0x75c5 ), SHC( 0x7545 ), SHC( 0x74c3 ), SHC( 0x743e ), SHC( 0x73b5 ), SHC( 0x732a ), SHC( 0x729d ), + SHC( 0x720c ), SHC( 0x7179 ), SHC( 0x70e2 ), SHC( 0x7049 ), SHC( 0x6fad ), SHC( 0x6f0f ), SHC( 0x6e6e ), SHC( 0x6dca ), + SHC( 0x6d23 ), SHC( 0x6c79 ), SHC( 0x6bcd ), SHC( 0x6b1f ), SHC( 0x6a6d ), SHC( 0x69b9 ), SHC( 0x6902 ), SHC( 0x6849 ), + SHC( 0x678d ), SHC( 0x66cf ), SHC( 0x660e ), SHC( 0x654b ), SHC( 0x6485 ), SHC( 0x63bc ), SHC( 0x62f2 ), SHC( 0x6224 ), + SHC( 0x6154 ), SHC( 0x6082 ), SHC( 0x5fae ), SHC( 0x5ed7 ), SHC( 0x5dfe ), SHC( 0x5d22 ), SHC( 0x5c44 ), SHC( 0x5b64 ), + SHC( 0x5a82 ), SHC( 0x599d ), SHC( 0x58b7 ), SHC( 0x57ce ), SHC( 0x56e2 ), SHC( 0x55f5 ), SHC( 0x5506 ), SHC( 0x5414 ), + SHC( 0x5321 ), SHC( 0x522b ), SHC( 0x5133 ), SHC( 0x503a ), SHC( 0x4f3e ), SHC( 0x4e40 ), SHC( 0x4d41 ), SHC( 0x4c3f ), + SHC( 0x4b3c ), SHC( 0x4a37 ), SHC( 0x4930 ), SHC( 0x4827 ), SHC( 0x471c ), SHC( 0x4610 ), SHC( 0x4502 ), SHC( 0x43f2 ), + SHC( 0x42e1 ), SHC( 0x41ce ), SHC( 0x40b9 ), SHC( 0x3fa3 ), SHC( 0x3e8b ), SHC( 0x3d71 ), SHC( 0x3c56 ), SHC( 0x3b3a ), + SHC( 0x3a1c ), SHC( 0x38fd ), SHC( 0x37dc ), SHC( 0x36ba ), SHC( 0x3596 ), SHC( 0x3471 ), SHC( 0x334b ), SHC( 0x3224 ), + SHC( 0x30fb ), SHC( 0x2fd1 ), SHC( 0x2ea6 ), SHC( 0x2d7a ), SHC( 0x2c4d ), SHC( 0x2b1f ), SHC( 0x29ef ), SHC( 0x28bf ), + SHC( 0x278d ), SHC( 0x265b ), SHC( 0x2528 ), SHC( 0x23f3 ), SHC( 0x22be ), SHC( 0x2188 ), SHC( 0x2051 ), SHC( 0x1f19 ), + SHC( 0x1de1 ), SHC( 0x1ca8 ), SHC( 0x1b6e ), SHC( 0x1a33 ), SHC( 0x18f8 ), SHC( 0x17bc ), SHC( 0x1680 ), SHC( 0x1543 ), + SHC( 0x1406 ), SHC( 0x12c8 ), SHC( 0x1189 ), SHC( 0x104a ), SHC( 0x0f0b ), SHC( 0x0dcb ), SHC( 0x0c8b ), SHC( 0x0b4b ), + SHC( 0x0a0a ), SHC( 0x08ca ), SHC( 0x0789 ), SHC( 0x0647 ), SHC( 0x0506 ), SHC( 0x03c4 ), SHC( 0x0283 ), SHC( 0x0141 ), + SHC( 0x0000 ), +}; + + +const Word32 bwMode2fs[4] = { 8000, 16000, 32000, 48000 };//Q0 + +const Word16 cos_pi_by_127[128] = /* Q15 */ +{ + 32767 ,32756 ,32726 ,32676 ,32606 ,32516 , + 32406 ,32276 ,32127 ,31958 ,31769 , + 31561 ,31333 ,31087 ,30821 ,30537 , + 30233 ,29912 ,29572 ,29213 ,28837 , + 28444 ,28033 ,27605 ,27160 ,26698 , + 26220 ,25726 ,25216 ,24691 ,24150 , + 23595 ,23026 ,22442 ,21844 ,21234 , + 20610 ,19974 ,19325 ,18665 ,17993 , + 17310 ,16616 ,15913 ,15199 ,14477 , + 13745 ,13005 ,12258 ,11502 ,10740 , + 9971 ,9196 ,8415 ,7629 ,6839 , + 6044 ,5245 ,4444 ,3639 ,2833 , + 2025 ,1215 ,405 ,-405 ,-1215 , + -2025 ,-2833 ,-3639 ,-4444 ,-5245 , + -6044 ,-6839 ,-7629 ,-8415 ,-9196 , + -9971 ,-10740 ,-11502 ,-12258 ,-13005 , + -13745 ,-14477 ,-15199 ,-15913 ,-16616 , + -17310 ,-17993 ,-18665 ,-19325 ,-19974 , + -20610 ,-21234 ,-21844 ,-22442 ,-23026 , + -23595 ,-24150 ,-24691 ,-25216 ,-25726 , + -26220 ,-26698 ,-27160 ,-27605 ,-28033 , + -28444 ,-28837 ,-29213 ,-29572 ,-29912 , + -30233 ,-30537 ,-30821 ,-31087 ,-31333 , + -31561 ,-31769 ,-31958 ,-32127 ,-32276 , + -32406 ,-32516 ,-32606 ,-32676 ,-32726 , + -32756 ,-32767 +}; + +const Word16 cos_pi_by_255[256] = /* Q15 */ +{ + 32767 ,32764 ,32757 ,32744 ,32727 ,32704 , + 32677 ,32645 ,32607 ,32565 ,32518 , + 32466 ,32409 ,32347 ,32280 ,32209 , + 32132 ,32050 ,31964 ,31873 ,31777 , + 31676 ,31570 ,31460 ,31345 ,31225 , + 31100 ,30970 ,30836 ,30697 ,30554 , + 30406 ,30253 ,30096 ,29934 ,29767 , + 29596 ,29421 ,29241 ,29056 ,28868 , + 28674 ,28477 ,28275 ,28069 ,27859 , + 27644 ,27425 ,27202 ,26975 ,26744 , + 26509 ,26269 ,26026 ,25779 ,25528 , + 25273 ,25014 ,24751 ,24485 ,24215 , + 23941 ,23663 ,23382 ,23098 ,22810 , + 22518 ,22223 ,21925 ,21623 ,21318 , + 21010 ,20699 ,20384 ,20067 ,19746 , + 19422 ,19096 ,18766 ,18434 ,18099 , + 17761 ,17420 ,17077 ,16731 ,16383 , + 16032 ,15679 ,15323 ,14965 ,14605 , + 14243 ,13878 ,13511 ,13142 ,12772 , + 12399 ,12024 ,11648 ,11270 ,10890 , + 10508 ,10125 ,9740 ,9354 ,8967 , + 8578 ,8187 ,7796 ,7403 ,7009 , + 6615 ,6219 ,5822 ,5424 ,5026 , + 4626 ,4226 ,3826 ,3425 ,3023 , + 2621 ,2218 ,1815 ,1412 ,1009 , + 605 ,201 ,-201 ,-605 ,-1009 , + -1412 ,-1815 ,-2218 ,-2621 ,-3023 , + -3425 ,-3826 ,-4226 ,-4626 ,-5026 , + -5424 ,-5822 ,-6219 ,-6615 ,-7009 , + -7403 ,-7796 ,-8187 ,-8578 ,-8967 , + -9354 ,-9740 ,-10125 ,-10508 ,-10890 , + -11270 ,-11648 ,-12024 ,-12399 ,-12772 , + -13142 ,-13511 ,-13878 ,-14243 ,-14605 , + -14965 ,-15323 ,-15679 ,-16032 ,-16383 , + -16731 ,-17077 ,-17420 ,-17761 ,-18099 , + -18434 ,-18766 ,-19096 ,-19422 ,-19746 , + -20067 ,-20384 ,-20699 ,-21010 ,-21318 , + -21623 ,-21925 ,-22223 ,-22518 ,-22810 , + -23098 ,-23382 ,-23663 ,-23941 ,-24215 , + -24485 ,-24751 ,-25014 ,-25273 ,-25528 , + -25779 ,-26026 ,-26269 ,-26509 ,-26744 , + -26975 ,-27202 ,-27425 ,-27644 ,-27859 , + -28069 ,-28275 ,-28477 ,-28674 ,-28868 , + -29056 ,-29241 ,-29421 ,-29596 ,-29767 , + -29934 ,-30096 ,-30253 ,-30406 ,-30554 , + -30697 ,-30836 ,-30970 ,-31100 ,-31225 , + -31345 ,-31460 ,-31570 ,-31676 ,-31777 , + -31873 ,-31964 ,-32050 ,-32132 ,-32209 , + -32280 ,-32347 ,-32409 ,-32466 ,-32518 , + -32565 ,-32607 ,-32645 ,-32677 ,-32704 , + -32727 ,-32744 ,-32757 ,-32764 ,-32767 +}; + +const Word16 cos_pi_by_383[384] = /* Q15 */ +{ + 32767 ,32765 ,32762 ,32757 ,32749 ,32739 , + 32727 ,32713 ,32696 ,32677 ,32656 , + 32633 ,32608 ,32580 ,32551 ,32519 , + 32485 ,32448 ,32410 ,32369 ,32327 , + 32282 ,32234 ,32185 ,32134 ,32080 , + 32024 ,31966 ,31906 ,31844 ,31779 , + 31713 ,31644 ,31573 ,31500 ,31425 , + 31348 ,31269 ,31188 ,31104 ,31019 , + 30931 ,30841 ,30749 ,30655 ,30560 , + 30462 ,30361 ,30259 ,30155 ,30049 , + 29941 ,29831 ,29719 ,29604 ,29488 , + 29370 ,29250 ,29128 ,29004 ,28878 , + 28750 ,28620 ,28488 ,28354 ,28218 , + 28081 ,27941 ,27800 ,27657 ,27512 , + 27365 ,27216 ,27066 ,26913 ,26759 , + 26603 ,26445 ,26286 ,26124 ,25961 , + 25796 ,25630 ,25461 ,25291 ,25120 , + 24946 ,24771 ,24594 ,24416 ,24236 , + 24054 ,23871 ,23686 ,23499 ,23311 , + 23122 ,22930 ,22738 ,22543 ,22348 , + 22150 ,21952 ,21751 ,21550 ,21346 , + 21142 ,20936 ,20728 ,20519 ,20309 , + 20097 ,19885 ,19670 ,19455 ,19238 , + 19019 ,18800 ,18579 ,18357 ,18134 , + 17910 ,17684 ,17457 ,17229 ,17000 , + 16769 ,16538 ,16305 ,16072 ,15837 , + 15601 ,15364 ,15126 ,14887 ,14647 , + 14407 ,14165 ,13922 ,13678 ,13433 , + 13188 ,12941 ,12694 ,12446 ,12197 , + 11947 ,11696 ,11445 ,11192 ,10939 , + 10686 ,10431 ,10176 ,9920 ,9664 , + 9407 ,9149 ,8891 ,8632 ,8372 , + 8112 ,7851 ,7590 ,7328 ,7066 , + 6803 ,6540 ,6277 ,6013 ,5748 , + 5483 ,5218 ,4953 ,4687 ,4421 , + 4154 ,3888 ,3621 ,3353 ,3086 , + 2818 ,2550 ,2282 ,2014 ,1746 , + 1477 ,1209 ,940 ,671 ,403 , + 134 ,-134 ,-403 ,-671 ,-940 , + -1209 ,-1477 ,-1746 ,-2014 ,-2282 , + -2550 ,-2818 ,-3086 ,-3353 ,-3621 , + -3888 ,-4154 ,-4421 ,-4687 ,-4953 , + -5218 ,-5483 ,-5748 ,-6013 ,-6277 , + -6540 ,-6803 ,-7066 ,-7328 ,-7590 , + -7851 ,-8112 ,-8372 ,-8632 ,-8891 , + -9149 ,-9407 ,-9664 ,-9920 ,-10176 , + -10431 ,-10686 ,-10939 ,-11192 ,-11445 , + -11696 ,-11947 ,-12197 ,-12446 ,-12694 , + -12941 ,-13188 ,-13433 ,-13678 ,-13922 , + -14165 ,-14407 ,-14647 ,-14887 ,-15126 , + -15364 ,-15601 ,-15837 ,-16072 ,-16305 , + -16538 ,-16769 ,-17000 ,-17229 ,-17457 , + -17684 ,-17910 ,-18134 ,-18357 ,-18579 , + -18800 ,-19019 ,-19238 ,-19455 ,-19670 , + -19885 ,-20097 ,-20309 ,-20519 ,-20728 , + -20936 ,-21142 ,-21346 ,-21550 ,-21751 , + -21952 ,-22150 ,-22348 ,-22543 ,-22738 , + -22930 ,-23122 ,-23311 ,-23499 ,-23686 , + -23871 ,-24054 ,-24236 ,-24416 ,-24594 , + -24771 ,-24946 ,-25120 ,-25291 ,-25461 , + -25630 ,-25796 ,-25961 ,-26124 ,-26286 , + -26445 ,-26603 ,-26759 ,-26913 ,-27066 , + -27216 ,-27365 ,-27512 ,-27657 ,-27800 , + -27941 ,-28081 ,-28218 ,-28354 ,-28488 , + -28620 ,-28750 ,-28878 ,-29004 ,-29128 , + -29250 ,-29370 ,-29488 ,-29604 ,-29719 , + -29831 ,-29941 ,-30049 ,-30155 ,-30259 , + -30361 ,-30462 ,-30560 ,-30655 ,-30749 , + -30841 ,-30931 ,-31019 ,-31104 ,-31188 , + -31269 ,-31348 ,-31425 ,-31500 ,-31573 , + -31644 ,-31713 ,-31779 ,-31844 ,-31906 , + -31966 ,-32024 ,-32080 ,-32134 ,-32185 , + -32234 ,-32282 ,-32327 ,-32369 ,-32410 , + -32448 ,-32485 ,-32519 ,-32551 ,-32580 , + -32608 ,-32633 ,-32656 ,-32677 ,-32696 , + -32713 ,-32727 ,-32739 ,-32749 ,-32757 , + -32762 ,-32765 ,-32767 +}; + +const Word16 swb_lsp_prev_interp_init[10] = { 32767, 31164, 26510, 19261, 10126, 0, -10126, -19261, -26510, -31164 };//Q15 +/* st->swb_lsp_prev_interp[i] = (float)cos( (float)i * PI / (float)10.0f )*/ + +//ivas_sns_com_fx.c +/* + powf( 10.0f, (float) i * (float) tilt / ( (float) FDNS_NPTS - 1.0f ) / 10.0f ) where 0 =< i < FDNS_NPTS; + tilt = 19.f for L_FRAME16k, + 22.f for L_FRAME25_6k, + 23.5f for L_FRAME32k; +*/ + +/* Q23 */ +const Word32 pow_tilt_16k[64] = { + 8388608, 8991841, 9638454, 10331564, 11074518, 11870897, 12724546, 13639580, + 14620416, 15671785, 16798759, 18006775, 19301660, 20689662, 22177476, 23772281, + 25481769, 27314189, 29278380, 31383818, 33640660, 36059793, 38652889, 41432458, + 44411907, 47605612, 51028980, 54698525, 58631951, 62848233, 67367713, 72212193, + 77405045, 82971319, 88937870, 95333482, 102189009, 109537523, 117414477, 125857870, + 134908436, 144609837, 155008876, 166155720, 178104145, 190911793, 204640453, 219356353, + 235130489, 252038960, 270163335, 289591052, 310415836, 332738151, 356665686, 382313874, + 409806450, 439276044, 470864826, 504725189, 541020486, 579925813, 621628862, 666330818 +}; + +/* Q23 */ +const Word32 pow_tilt_25_6k[64] = { + 8388608, 9090977, 9852154, 10677063, 11571041, 12539871, 13589820, 14727680, + 15960812, 17297192, 18745466, 20315003, 22015955, 23859325, 25857039, 28022019, + 30368270, 32910971, 35666569, 38652889, 41889251, 45396590, 49197594, 53316853, + 57781011, 62618949, 67861961, 73543965, 79701717, 86375050, 93607134, 101444752, + 109938604, 119143637, 129119397, 139930415, 151646628, 164343826, 178104145, 193016600, + 209177658, 226691863, 245672512, 266242389, 288534558, 312693225, 338874669, 367248256, + 397997530, 431321405, 467435450, 506573283, 548988082, 594954222, 644769055, 698754827, + 757260765, 820665338, 889378703, 963845359, 1044547023, 1132005744, 1226787283, 1329504771 +}; + +/* Q23 */ +const Word32 pow_tilt_32k[64] = { + 8388608, 9140953, 9960774, 10854121, 11827590, 12888365, 14044278, 15303861, + 16676411, 18172061, 19801850, 21577810, 23513049, 25621853, 27919788, 30423818, + 33152425, 36125751, 39365745, 42896322, 46743545, 50935812, 55504069, 60482037, + 65906462, 71817384, 78258437, 85277166, 92925380, 101259536, 110341153, 120237270, + 131020935, 142771749, 155576454, 169529568, 184734089, 201302251, 219356353, 239029666, + 260467410, 283827832, 309283369, 337021925, 367248256, 400185482, 436076734, 475186948, + 517804822, 564244946, 614850125, 669993906, 730083343, 795561993, 866913198, 944663645, + 1029387260, 1121709444, 1222311686, 1331936594, 1451393382, 1581563835, 1723408827, 1877975405 +}; + +const Word16 L_frame_inv[8] = { 0x4000, 0x369D, 0x3333, 0x2D83, 0x2AAB, 0x28F6, 0, 0x2222 }; // Q14 + +const Word16 InvIntTable[65] = // Q15 +{ + 0x7FFF, + 0x7FFF, 0x4000, 0x2AAB, 0x2000, 0x199A, 0x1555, 0x1249, 0x1000, + 0x0E39, 0x0CCD, 0x0BA3, 0x0AAB, 0x09D9, 0x0925, 0x0889, 0x0800, + 0x0788, 0x071C, 0x06BD, 0x0666, 0x0618, 0x05D1, 0x0591, 0x0555, + 0x051F, 0x04EC, 0x04BE, 0x0492, 0x046A, 0x0444, 0x0421, 0x0400, + 0x03E1, 0x03C4, 0x03A8, 0x038E, 0x0376, 0x035E, 0x0348, 0x0333, + 0x031F, 0x030C, 0x02FA, 0x02E9, 0x02D8, 0x02C8, 0x02B9, 0x02AB, + 0x029D, 0x028F, 0x0283, 0x0276, 0x026A, 0x025F, 0x0254, 0x0249, + 0x023F, 0x0235, 0x022B, 0x0222, 0x0219, 0x0211, 0x0208, 0x0200 +}; + +const Word16 TecLowBandTable[] = { 0, 2, 4, 6 }; //Q0 +const Word16 TecSC_Fx[] = +{ + 23999/*0.3662f*2.0f Q15*/, 7065/*0.1078f*2.0f Q15*/, 7825/*0.1194f*2.0f Q15*/, + 8448/*0.1289f*2.0f Q15*/, 8946/*0.1365f*2.0f Q15*/, 9254/*0.1412f*2.0f Q15*/ +}; -#define SHC( x ) ( (Word16) x ) +/* clang-format on */ +const Word16 sqrt_table_pitch_search[256 + 1] = /* Q11 */ + { + 0, 2048, 2896, 3547, 4096, 4579, 5017, 5418, + 5793, 6144, 6476, 6792, 7094, 7384, 7663, 7932, + 8192, 8444, 8689, 8927, 9159, 9385, 9606, 9822, + 10033, 10240, 10443, 10642, 10837, 11029, 11217, 11403, + 11585, 11765, 11942, 12116, 12288, 12457, 12625, 12790, + 12953, 13114, 13273, 13430, 13585, 13738, 13890, 14040, + 14189, 14336, 14482, 14626, 14768, 14910, 15050, 15188, + 15326, 15462, 15597, 15731, 15864, 15995, 16126, 16255, + 16384, 16512, 16638, 16764, 16888, 17012, 17135, 17257, + 17378, 17498, 17618, 17736, 17854, 17971, 18087, 18203, + 18318, 18432, 18545, 18658, 18770, 18882, 18992, 19102, + 19212, 19321, 19429, 19537, 19644, 19750, 19856, 19961, + 20066, 20170, 20274, 20377, 20480, 20582, 20684, 20785, + 20886, 20986, 21085, 21185, 21283, 21382, 21480, 21577, + 21674, 21771, 21867, 21962, 22058, 22153, 22247, 22341, + 22435, 22528, 22621, 22713, 22806, 22897, 22989, 23080, + 23170, 23261, 23351, 23440, 23530, 23619, 23707, 23796, + 23884, 23971, 24059, 24146, 24232, 24319, 24405, 24491, + 24576, 24661, 24746, 24831, 24915, 24999, 25083, 25166, + 25249, 25332, 25415, 25497, 25580, 25661, 25743, 25824, + 25905, 25986, 26067, 26147, 26227, 26307, 26387, 26466, + 26545, 26624, 26703, 26781, 26859, 26937, 27015, 27092, + 27170, 27247, 27324, 27400, 27477, 27553, 27629, 27705, + 27780, 27856, 27931, 28006, 28081, 28155, 28230, 28304, + 28378, 28452, 28525, 28599, 28672, 28745, 28818, 28891, + 28963, 29035, 29108, 29180, 29251, 29323, 29394, 29466, + 29537, 29608, 29678, 29749, 29819, 29890, 29960, 30030, + 30099, 30169, 30238, 30308, 30377, 30446, 30515, 30583, + 30652, 30720, 30788, 30856, 30924, 30992, 31059, 31127, + 31194, 31261, 31328, 31395, 31462, 31529, 31595, 31661, + 31727, 31794, 31859, 31925, 31991, 32056, 32122, 32187, + 32252, 32317, 32382, 32446, 32511, 32575, 32640, 32704, + 32766 + }; + +// fft_evs.c +const Word16 RotVector_32[2 * 20] = { // Q15 + /** + * \brief Twiddle factors are unscaled + */ + SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x5a82 ), SHC( 0xa57e ), + SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x7642 ), SHC( 0xcf04 ), + SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xa57e ), SHC( 0xa57e ), + SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0xe707 ), SHC( 0x8276 ), + SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x89be ), SHC( 0x30fc ), SHC( 0xb8e3 ), SHC( 0x6a6e ) +}; + +/** + * \brief Twiddle factors are unscaled + */ +const Word16 RotVector_480[2 * ( 480 - 30 )] = { // Q15 + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ff5 ), SHC( 0xfca6 ), + SHC( 0x7fd3 ), SHC( 0xf94d ), SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7f4c ), SHC( 0xf29f ), SHC( 0x7ee8 ), SHC( 0xef4b ), + SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7ddb ), SHC( 0xe8ad ), SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7c77 ), SHC( 0xe21e ), + SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x7abb ), SHC( 0xdba5 ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x78a8 ), SHC( 0xd546 ), + SHC( 0x7780 ), SHC( 0xd221 ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x7388 ), SHC( 0xc8e5 ), + SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x707d ), SHC( 0xc2ec ), SHC( 0x6eda ), SHC( 0xc000 ), SHC( 0x6d23 ), SHC( 0xbd1f ), + SHC( 0x6b5a ), SHC( 0xba49 ), SHC( 0x697d ), SHC( 0xb780 ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x658d ), SHC( 0xb214 ), + SHC( 0x637a ), SHC( 0xaf72 ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x5cd9 ), SHC( 0xa7e4 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fd3 ), SHC( 0xf94d ), SHC( 0x7f4c ), SHC( 0xf29f ), SHC( 0x7e6d ), SHC( 0xebfa ), + SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7780 ), SHC( 0xd221 ), + SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6eda ), SHC( 0xc000 ), SHC( 0x6b5a ), SHC( 0xba49 ), + SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x637a ), SHC( 0xaf72 ), SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x5a82 ), SHC( 0xa57e ), + SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x508e ), SHC( 0x9c86 ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x45b7 ), SHC( 0x94a6 ), + SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x3410 ), SHC( 0x8b11 ), SHC( 0x2ddf ), SHC( 0x8880 ), + SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x2121 ), SHC( 0x845d ), SHC( 0x1a9d ), SHC( 0x82cc ), SHC( 0x1406 ), SHC( 0x8193 ), + SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0x06b3 ), SHC( 0x802d ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f9b ), SHC( 0xf5f5 ), + SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7642 ), SHC( 0xcf04 ), + SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x6155 ), SHC( 0xacdf ), + SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5321 ), SHC( 0x9eab ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x42e1 ), SHC( 0x92dd ), + SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1de2 ), SHC( 0x8389 ), + SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0a0b ), SHC( 0x8065 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xf5f5 ), SHC( 0x8065 ), + SHC( 0xebfa ), SHC( 0x8193 ), SHC( 0xe21e ), SHC( 0x8389 ), SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xcf04 ), SHC( 0x89be ), + SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xbd1f ), SHC( 0x92dd ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xacdf ), SHC( 0x9eab ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f4c ), SHC( 0xf29f ), SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x79bc ), SHC( 0xd872 ), + SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x6eda ), SHC( 0xc000 ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5f1f ), SHC( 0xaa5a ), + SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x3410 ), SHC( 0x8b11 ), + SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1a9d ), SHC( 0x82cc ), SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0x0000 ), SHC( 0x8000 ), + SHC( 0xf29f ), SHC( 0x80b4 ), SHC( 0xe563 ), SHC( 0x82cc ), SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xcbf0 ), SHC( 0x8b11 ), + SHC( 0xc000 ), SHC( 0x9126 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xaa5a ), SHC( 0xa0e1 ), SHC( 0xa0e1 ), SHC( 0xaa5a ), + SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x9126 ), SHC( 0xc000 ), SHC( 0x8b11 ), SHC( 0xcbf0 ), SHC( 0x8644 ), SHC( 0xd872 ), + SHC( 0x82cc ), SHC( 0xe563 ), SHC( 0x80b4 ), SHC( 0xf29f ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ee8 ), SHC( 0xef4b ), + SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x6eda ), SHC( 0xc000 ), SHC( 0x658d ), SHC( 0xb214 ), + SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x4dec ), SHC( 0x9a73 ), SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x30fc ), SHC( 0x89be ), + SHC( 0x2121 ), SHC( 0x845d ), SHC( 0x10b5 ), SHC( 0x8118 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xef4b ), SHC( 0x8118 ), + SHC( 0xdedf ), SHC( 0x845d ), SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xc000 ), SHC( 0x9126 ), SHC( 0xb214 ), SHC( 0x9a73 ), + SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9a73 ), SHC( 0xb214 ), SHC( 0x9126 ), SHC( 0xc000 ), SHC( 0x89be ), SHC( 0xcf04 ), + SHC( 0x845d ), SHC( 0xdedf ), SHC( 0x8118 ), SHC( 0xef4b ), SHC( 0x8000 ), SHC( 0x0000 ), SHC( 0x8118 ), SHC( 0x10b5 ), + SHC( 0x845d ), SHC( 0x2121 ), SHC( 0x89be ), SHC( 0x30fc ), SHC( 0x9126 ), SHC( 0x4000 ), SHC( 0x9a73 ), SHC( 0x4dec ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x720d ), SHC( 0xc5e4 ), + SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3a1c ), SHC( 0x8df3 ), + SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xebfa ), SHC( 0x8193 ), + SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa57e ), SHC( 0xa57e ), + SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x8df3 ), SHC( 0xc5e4 ), SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8193 ), SHC( 0xebfa ), + SHC( 0x8000 ), SHC( 0x0000 ), SHC( 0x8193 ), SHC( 0x1406 ), SHC( 0x8644 ), SHC( 0x278e ), SHC( 0x8df3 ), SHC( 0x3a1c ), + SHC( 0x9872 ), SHC( 0x4b3d ), SHC( 0xa57e ), SHC( 0x5a82 ), SHC( 0xb4c3 ), SHC( 0x678e ), SHC( 0xc5e4 ), SHC( 0x720d ), + SHC( 0xd872 ), SHC( 0x79bc ), SHC( 0xebfa ), SHC( 0x7e6d ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ddb ), SHC( 0xe8ad ), + SHC( 0x7780 ), SHC( 0xd221 ), SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x4dec ), SHC( 0x9a73 ), + SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x245b ), SHC( 0x8545 ), SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0xf5f5 ), SHC( 0x8065 ), + SHC( 0xdedf ), SHC( 0x845d ), SHC( 0xc8e5 ), SHC( 0x8c78 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa327 ), SHC( 0xa7e4 ), + SHC( 0x94a6 ), SHC( 0xba49 ), SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x82cc ), SHC( 0xe563 ), SHC( 0x800b ), SHC( 0xfca6 ), + SHC( 0x8193 ), SHC( 0x1406 ), SHC( 0x8758 ), SHC( 0x2aba ), SHC( 0x9126 ), SHC( 0x4000 ), SHC( 0x9eab ), SHC( 0x5321 ), + SHC( 0xaf72 ), SHC( 0x637a ), SHC( 0xc2ec ), SHC( 0x707d ), SHC( 0xd872 ), SHC( 0x79bc ), SHC( 0xef4b ), SHC( 0x7ee8 ), + SHC( 0x06b3 ), SHC( 0x7fd3 ), SHC( 0x1de2 ), SHC( 0x7c77 ), SHC( 0x3410 ), SHC( 0x74ef ), SHC( 0x4880 ), SHC( 0x697d ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ffd ), SHC( 0xfe53 ), SHC( 0x7ff5 ), SHC( 0xfca6 ), SHC( 0x7fe7 ), SHC( 0xfafa ), + SHC( 0x7fd3 ), SHC( 0xf94d ), SHC( 0x7fba ), SHC( 0xf7a1 ), SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7f77 ), SHC( 0xf44a ), + SHC( 0x7f4c ), SHC( 0xf29f ), SHC( 0x7f1d ), SHC( 0xf0f5 ), SHC( 0x7ee8 ), SHC( 0xef4b ), SHC( 0x7ead ), SHC( 0xeda2 ), + SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7e27 ), SHC( 0xea53 ), SHC( 0x7ddb ), SHC( 0xe8ad ), SHC( 0x7d8a ), SHC( 0xe707 ), + SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7cd8 ), SHC( 0xe3c0 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7c10 ), SHC( 0xe07e ), + SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x7b32 ), SHC( 0xdd41 ), SHC( 0x7abb ), SHC( 0xdba5 ), SHC( 0x7a3e ), SHC( 0xda0b ), + SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7935 ), SHC( 0xd6db ), SHC( 0x78a8 ), SHC( 0xd546 ), SHC( 0x7817 ), SHC( 0xd3b2 ), + SHC( 0x7780 ), SHC( 0xd221 ), SHC( 0x76e3 ), SHC( 0xd092 ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fe7 ), SHC( 0xfafa ), + SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7f1d ), SHC( 0xf0f5 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7d8a ), SHC( 0xe707 ), + SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7b32 ), SHC( 0xdd41 ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7817 ), SHC( 0xd3b2 ), + SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x743e ), SHC( 0xca69 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6fae ), SHC( 0xc175 ), + SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x6485 ), SHC( 0xb0c2 ), + SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5dfe ), SHC( 0xa91d ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x56e3 ), SHC( 0xa202 ), + SHC( 0x5321 ), SHC( 0x9eab ), SHC( 0x4f3e ), SHC( 0x9b7b ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x471d ), SHC( 0x9592 ), + SHC( 0x42e1 ), SHC( 0x92dd ), SHC( 0x3e8b ), SHC( 0x9052 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x3597 ), SHC( 0x8bc2 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fba ), SHC( 0xf7a1 ), SHC( 0x7ee8 ), SHC( 0xef4b ), SHC( 0x7d8a ), SHC( 0xe707 ), + SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x7935 ), SHC( 0xd6db ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x72cd ), SHC( 0xc763 ), + SHC( 0x6eda ), SHC( 0xc000 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x658d ), SHC( 0xb214 ), SHC( 0x603c ), SHC( 0xab9b ), + SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5465 ), SHC( 0x9fc4 ), SHC( 0x4dec ), SHC( 0x9a73 ), SHC( 0x471d ), SHC( 0x9592 ), + SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x389d ), SHC( 0x8d33 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2925 ), SHC( 0x86cb ), + SHC( 0x2121 ), SHC( 0x845d ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x10b5 ), SHC( 0x8118 ), SHC( 0x085f ), SHC( 0x8046 ), + SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xf7a1 ), SHC( 0x8046 ), SHC( 0xef4b ), SHC( 0x8118 ), SHC( 0xe707 ), SHC( 0x8276 ), + SHC( 0xdedf ), SHC( 0x845d ), SHC( 0xd6db ), SHC( 0x86cb ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f77 ), SHC( 0xf44a ), + SHC( 0x7ddb ), SHC( 0xe8ad ), SHC( 0x7b32 ), SHC( 0xdd41 ), SHC( 0x7780 ), SHC( 0xd221 ), SHC( 0x72cd ), SHC( 0xc763 ), + SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x668f ), SHC( 0xb36a ), SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x56e3 ), SHC( 0xa202 ), + SHC( 0x4dec ), SHC( 0x9a73 ), SHC( 0x444d ), SHC( 0x93bf ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x2f6e ), SHC( 0x891d ), + SHC( 0x245b ), SHC( 0x8545 ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0x01ad ), SHC( 0x8003 ), + SHC( 0xf5f5 ), SHC( 0x8065 ), SHC( 0xea53 ), SHC( 0x81d9 ), SHC( 0xdedf ), SHC( 0x845d ), SHC( 0xd3b2 ), SHC( 0x87e9 ), + SHC( 0xc8e5 ), SHC( 0x8c78 ), SHC( 0xbe8e ), SHC( 0x91ff ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xab9b ), SHC( 0x9fc4 ), + SHC( 0xa327 ), SHC( 0xa7e4 ), SHC( 0x9b7b ), SHC( 0xb0c2 ), SHC( 0x94a6 ), SHC( 0xba49 ), SHC( 0x8eb9 ), SHC( 0xc467 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f1d ), SHC( 0xf0f5 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7817 ), SHC( 0xd3b2 ), + SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x56e3 ), SHC( 0xa202 ), + SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3e8b ), SHC( 0x9052 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x22bf ), SHC( 0x84ce ), + SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0506 ), SHC( 0x8019 ), SHC( 0xf5f5 ), SHC( 0x8065 ), SHC( 0xe707 ), SHC( 0x8276 ), + SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xca69 ), SHC( 0x8bc2 ), SHC( 0xbd1f ), SHC( 0x92dd ), SHC( 0xb0c2 ), SHC( 0x9b7b ), + SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9b7b ), SHC( 0xb0c2 ), SHC( 0x92dd ), SHC( 0xbd1f ), SHC( 0x8bc2 ), SHC( 0xca69 ), + SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x8065 ), SHC( 0xf5f5 ), SHC( 0x8019 ), SHC( 0x0506 ), + SHC( 0x8193 ), SHC( 0x1406 ), SHC( 0x84ce ), SHC( 0x22bf ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ead ), SHC( 0xeda2 ), + SHC( 0x7abb ), SHC( 0xdba5 ), SHC( 0x743e ), SHC( 0xca69 ), SHC( 0x6b5a ), SHC( 0xba49 ), SHC( 0x603c ), SHC( 0xab9b ), + SHC( 0x5321 ), SHC( 0x9eab ), SHC( 0x444d ), SHC( 0x93bf ), SHC( 0x3410 ), SHC( 0x8b11 ), SHC( 0x22bf ), SHC( 0x84ce ), + SHC( 0x10b5 ), SHC( 0x8118 ), SHC( 0xfe53 ), SHC( 0x8003 ), SHC( 0xebfa ), SHC( 0x8193 ), SHC( 0xda0b ), SHC( 0x85c2 ), + SHC( 0xc8e5 ), SHC( 0x8c78 ), SHC( 0xb8e3 ), SHC( 0x9592 ), SHC( 0xaa5a ), SHC( 0xa0e1 ), SHC( 0x9d97 ), SHC( 0xae27 ), + SHC( 0x92dd ), SHC( 0xbd1f ), SHC( 0x8a65 ), SHC( 0xcd79 ), SHC( 0x845d ), SHC( 0xdedf ), SHC( 0x80e3 ), SHC( 0xf0f5 ), + SHC( 0x800b ), SHC( 0x035a ), SHC( 0x81d9 ), SHC( 0x15ad ), SHC( 0x8644 ), SHC( 0x278e ), SHC( 0x8d33 ), SHC( 0x389d ), + SHC( 0x9683 ), SHC( 0x4880 ), SHC( 0xa202 ), SHC( 0x56e3 ), SHC( 0xaf72 ), SHC( 0x637a ), SHC( 0xbe8e ), SHC( 0x6e01 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e27 ), SHC( 0xea53 ), SHC( 0x78a8 ), SHC( 0xd546 ), SHC( 0x6fae ), SHC( 0xc175 ), + SHC( 0x637a ), SHC( 0xaf72 ), SHC( 0x5465 ), SHC( 0x9fc4 ), SHC( 0x42e1 ), SHC( 0x92dd ), SHC( 0x2f6e ), SHC( 0x891d ), + SHC( 0x1a9d ), SHC( 0x82cc ), SHC( 0x0506 ), SHC( 0x8019 ), SHC( 0xef4b ), SHC( 0x8118 ), SHC( 0xda0b ), SHC( 0x85c2 ), + SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xb36a ), SHC( 0x9971 ), SHC( 0xa327 ), SHC( 0xa7e4 ), SHC( 0x9592 ), SHC( 0xb8e3 ), + SHC( 0x8b11 ), SHC( 0xcbf0 ), SHC( 0x83f0 ), SHC( 0xe07e ), SHC( 0x8065 ), SHC( 0xf5f5 ), SHC( 0x8089 ), SHC( 0x0bb6 ), + SHC( 0x845d ), SHC( 0x2121 ), SHC( 0x8bc2 ), SHC( 0x3597 ), SHC( 0x9683 ), SHC( 0x4880 ), SHC( 0xa450 ), SHC( 0x5951 ), + SHC( 0xb4c3 ), SHC( 0x678e ), SHC( 0xc763 ), SHC( 0x72cd ), SHC( 0xdba5 ), SHC( 0x7abb ), SHC( 0xf0f5 ), SHC( 0x7f1d ), + SHC( 0x06b3 ), SHC( 0x7fd3 ), SHC( 0x1c40 ), SHC( 0x7cd8 ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7d8a ), SHC( 0xe707 ), + SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x471d ), SHC( 0x9592 ), + SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xe707 ), SHC( 0x8276 ), + SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xb8e3 ), SHC( 0x9592 ), SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9592 ), SHC( 0xb8e3 ), + SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x8000 ), SHC( 0x0000 ), SHC( 0x8276 ), SHC( 0x18f9 ), + SHC( 0x89be ), SHC( 0x30fc ), SHC( 0x9592 ), SHC( 0x471d ), SHC( 0xa57e ), SHC( 0x5a82 ), SHC( 0xb8e3 ), SHC( 0x6a6e ), + SHC( 0xcf04 ), SHC( 0x7642 ), SHC( 0xe707 ), SHC( 0x7d8a ), SHC( 0x0000 ), SHC( 0x7fff ), SHC( 0x18f9 ), SHC( 0x7d8a ), + SHC( 0x30fc ), SHC( 0x7642 ), SHC( 0x471d ), SHC( 0x6a6e ), SHC( 0x5a82 ), SHC( 0x5a82 ), SHC( 0x6a6e ), SHC( 0x471d ) +}; + +const Word16 RotVector_600[2 * ( 600 - 30 )] = { // Q15 + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ff9 ), SHC( 0xfd52 ), + SHC( 0x7fe3 ), SHC( 0xfaa4 ), SHC( 0x7fbf ), SHC( 0xf7f6 ), SHC( 0x7f8d ), SHC( 0xf54a ), SHC( 0x7f4c ), SHC( 0xf29f ), + SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7ea0 ), SHC( 0xed4d ), SHC( 0x7e35 ), SHC( 0xeaa7 ), SHC( 0x7dbc ), SHC( 0xe804 ), + SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7c9e ), SHC( 0xe2c5 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7b49 ), SHC( 0xdd94 ), + SHC( 0x7a89 ), SHC( 0xdb01 ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x78e1 ), SHC( 0xd5e8 ), SHC( 0x77f9 ), SHC( 0xd362 ), + SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x7600 ), SHC( 0xce66 ), SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x73d1 ), SHC( 0xc980 ), + SHC( 0x72a7 ), SHC( 0xc716 ), SHC( 0x716f ), SHC( 0xc4b3 ), SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6eda ), SHC( 0xc000 ), + SHC( 0x6d7d ), SHC( 0xbdb1 ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x6a9d ), SHC( 0xb92a ), SHC( 0x691b ), SHC( 0xb6f3 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fe3 ), SHC( 0xfaa4 ), SHC( 0x7f8d ), SHC( 0xf54a ), SHC( 0x7efe ), SHC( 0xeff5 ), + SHC( 0x7e35 ), SHC( 0xeaa7 ), SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7a89 ), SHC( 0xdb01 ), + SHC( 0x78e1 ), SHC( 0xd5e8 ), SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x72a7 ), SHC( 0xc716 ), + SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6d7d ), SHC( 0xbdb1 ), SHC( 0x6a9d ), SHC( 0xb92a ), SHC( 0x678e ), SHC( 0xb4c3 ), + SHC( 0x6450 ), SHC( 0xb07e ), SHC( 0x60e5 ), SHC( 0xac5d ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x598f ), SHC( 0xa48c ), + SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x4d64 ), SHC( 0x9a0b ), SHC( 0x490d ), SHC( 0x96e5 ), + SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x3b4d ), SHC( 0x8e91 ), SHC( 0x3680 ), SHC( 0x8c2f ), + SHC( 0x319a ), SHC( 0x8a00 ), SHC( 0x2c9e ), SHC( 0x8807 ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fbf ), SHC( 0xf7f6 ), + SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x79bc ), SHC( 0xd872 ), + SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6c13 ), SHC( 0xbb6a ), + SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x62a0 ), SHC( 0xae69 ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x579f ), SHC( 0xa2b1 ), + SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x3daa ), SHC( 0x8fd5 ), + SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x2f1f ), SHC( 0x88fd ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1fd5 ), SHC( 0x8405 ), + SHC( 0x17fc ), SHC( 0x8244 ), SHC( 0x100b ), SHC( 0x8102 ), SHC( 0x080a ), SHC( 0x8041 ), SHC( 0x0000 ), SHC( 0x8000 ), + SHC( 0xf7f6 ), SHC( 0x8041 ), SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xe02b ), SHC( 0x8405 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f8d ), SHC( 0xf54a ), SHC( 0x7e35 ), SHC( 0xeaa7 ), SHC( 0x7bfb ), SHC( 0xe02b ), + SHC( 0x78e1 ), SHC( 0xd5e8 ), SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6a9d ), SHC( 0xb92a ), + SHC( 0x6450 ), SHC( 0xb07e ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x4d64 ), SHC( 0x9a0b ), + SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x3b4d ), SHC( 0x8e91 ), SHC( 0x319a ), SHC( 0x8a00 ), SHC( 0x278e ), SHC( 0x8644 ), + SHC( 0x1d3b ), SHC( 0x8362 ), SHC( 0x12b3 ), SHC( 0x8160 ), SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xfd52 ), SHC( 0x8007 ), + SHC( 0xf29f ), SHC( 0x80b4 ), SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xdd94 ), SHC( 0x84b7 ), SHC( 0xd362 ), SHC( 0x8807 ), + SHC( 0xc980 ), SHC( 0x8c2f ), SHC( 0xc000 ), SHC( 0x9126 ), SHC( 0xb6f3 ), SHC( 0x96e5 ), SHC( 0xae69 ), SHC( 0x9d60 ), + SHC( 0xa671 ), SHC( 0xa48c ), SHC( 0x9f1b ), SHC( 0xac5d ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f4c ), SHC( 0xf29f ), + SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x6eda ), SHC( 0xc000 ), + SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x4b3d ), SHC( 0x9872 ), + SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x3410 ), SHC( 0x8b11 ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1a9d ), SHC( 0x82cc ), + SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xf29f ), SHC( 0x80b4 ), SHC( 0xe563 ), SHC( 0x82cc ), + SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xcbf0 ), SHC( 0x8b11 ), SHC( 0xc000 ), SHC( 0x9126 ), SHC( 0xb4c3 ), SHC( 0x9872 ), + SHC( 0xaa5a ), SHC( 0xa0e1 ), SHC( 0xa0e1 ), SHC( 0xaa5a ), SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x9126 ), SHC( 0xc000 ), + SHC( 0x8b11 ), SHC( 0xcbf0 ), SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x82cc ), SHC( 0xe563 ), SHC( 0x80b4 ), SHC( 0xf29f ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7703 ), SHC( 0xd0e1 ), + SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x5197 ), SHC( 0x9d60 ), + SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x17fc ), SHC( 0x8244 ), + SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xf7f6 ), SHC( 0x8041 ), SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xd872 ), SHC( 0x8644 ), + SHC( 0xc980 ), SHC( 0x8c2f ), SHC( 0xbb6a ), SHC( 0x93ed ), SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0xa2b1 ), SHC( 0xa861 ), + SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x8fd5 ), SHC( 0xc256 ), SHC( 0x88fd ), SHC( 0xd0e1 ), SHC( 0x8405 ), SHC( 0xe02b ), + SHC( 0x8102 ), SHC( 0xeff5 ), SHC( 0x8000 ), SHC( 0x0000 ), SHC( 0x8102 ), SHC( 0x100b ), SHC( 0x8405 ), SHC( 0x1fd5 ), + SHC( 0x88fd ), SHC( 0x2f1f ), SHC( 0x8fd5 ), SHC( 0x3daa ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ea0 ), SHC( 0xed4d ), + SHC( 0x7a89 ), SHC( 0xdb01 ), SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x6a9d ), SHC( 0xb92a ), SHC( 0x5f1f ), SHC( 0xaa5a ), + SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x424f ), SHC( 0x9283 ), SHC( 0x319a ), SHC( 0x8a00 ), SHC( 0x1fd5 ), SHC( 0x8405 ), + SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0xfaa4 ), SHC( 0x801d ), SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xd5e8 ), SHC( 0x871f ), + SHC( 0xc4b3 ), SHC( 0x8e91 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa671 ), SHC( 0xa48c ), SHC( 0x9a0b ), SHC( 0xb29c ), + SHC( 0x8fd5 ), SHC( 0xc256 ), SHC( 0x8807 ), SHC( 0xd362 ), SHC( 0x82cc ), SHC( 0xe563 ), SHC( 0x8041 ), SHC( 0xf7f6 ), + SHC( 0x8073 ), SHC( 0x0ab6 ), SHC( 0x8362 ), SHC( 0x1d3b ), SHC( 0x88fd ), SHC( 0x2f1f ), SHC( 0x9126 ), SHC( 0x4000 ), + SHC( 0x9bb0 ), SHC( 0x4f82 ), SHC( 0xa861 ), SHC( 0x5d4f ), SHC( 0xb6f3 ), SHC( 0x691b ), SHC( 0xc716 ), SHC( 0x72a7 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e35 ), SHC( 0xeaa7 ), SHC( 0x78e1 ), SHC( 0xd5e8 ), SHC( 0x702b ), SHC( 0xc256 ), + SHC( 0x6450 ), SHC( 0xb07e ), SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x319a ), SHC( 0x8a00 ), + SHC( 0x1d3b ), SHC( 0x8362 ), SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xf29f ), SHC( 0x80b4 ), SHC( 0xdd94 ), SHC( 0x84b7 ), + SHC( 0xc980 ), SHC( 0x8c2f ), SHC( 0xb6f3 ), SHC( 0x96e5 ), SHC( 0xa671 ), SHC( 0xa48c ), SHC( 0x9872 ), SHC( 0xb4c3 ), + SHC( 0x8d59 ), SHC( 0xc716 ), SHC( 0x8577 ), SHC( 0xdb01 ), SHC( 0x8102 ), SHC( 0xeff5 ), SHC( 0x801d ), SHC( 0x055c ), + SHC( 0x82cc ), SHC( 0x1a9d ), SHC( 0x88fd ), SHC( 0x2f1f ), SHC( 0x9283 ), SHC( 0x424f ), SHC( 0x9f1b ), SHC( 0x53a3 ), + SHC( 0xae69 ), SHC( 0x62a0 ), SHC( 0xc000 ), SHC( 0x6eda ), SHC( 0xd362 ), SHC( 0x77f9 ), SHC( 0xe804 ), SHC( 0x7dbc ), + SHC( 0xfd52 ), SHC( 0x7ff9 ), SHC( 0x12b3 ), SHC( 0x7ea0 ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7dbc ), SHC( 0xe804 ), + SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x4b3d ), SHC( 0x9872 ), + SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x1fd5 ), SHC( 0x8405 ), SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xeff5 ), SHC( 0x8102 ), + SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xc256 ), SHC( 0x8fd5 ), SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0x9d60 ), SHC( 0xae69 ), + SHC( 0x8fd5 ), SHC( 0xc256 ), SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8102 ), SHC( 0xeff5 ), SHC( 0x8041 ), SHC( 0x080a ), + SHC( 0x8405 ), SHC( 0x1fd5 ), SHC( 0x8c2f ), SHC( 0x3680 ), SHC( 0x9872 ), SHC( 0x4b3d ), SHC( 0xa861 ), SHC( 0x5d4f ), + SHC( 0xbb6a ), SHC( 0x6c13 ), SHC( 0xd0e1 ), SHC( 0x7703 ), SHC( 0xe804 ), SHC( 0x7dbc ), SHC( 0x0000 ), SHC( 0x7fff ), + SHC( 0x17fc ), SHC( 0x7dbc ), SHC( 0x2f1f ), SHC( 0x7703 ), SHC( 0x4496 ), SHC( 0x6c13 ), SHC( 0x579f ), SHC( 0x5d4f ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ffe ), SHC( 0xfea9 ), SHC( 0x7ff9 ), SHC( 0xfd52 ), SHC( 0x7ff0 ), SHC( 0xfbfb ), + SHC( 0x7fe3 ), SHC( 0xfaa4 ), SHC( 0x7fd3 ), SHC( 0xf94d ), SHC( 0x7fbf ), SHC( 0xf7f6 ), SHC( 0x7fa8 ), SHC( 0xf6a0 ), + SHC( 0x7f8d ), SHC( 0xf54a ), SHC( 0x7f6f ), SHC( 0xf3f4 ), SHC( 0x7f4c ), SHC( 0xf29f ), SHC( 0x7f27 ), SHC( 0xf14a ), + SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7ed1 ), SHC( 0xeea1 ), SHC( 0x7ea0 ), SHC( 0xed4d ), SHC( 0x7e6d ), SHC( 0xebfa ), + SHC( 0x7e35 ), SHC( 0xeaa7 ), SHC( 0x7dfa ), SHC( 0xe955 ), SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7d7a ), SHC( 0xe6b3 ), + SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7ceb ), SHC( 0xe414 ), SHC( 0x7c9e ), SHC( 0xe2c5 ), SHC( 0x7c4e ), SHC( 0xe178 ), + SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x7b49 ), SHC( 0xdd94 ), SHC( 0x7aeb ), SHC( 0xdc4a ), + SHC( 0x7a89 ), SHC( 0xdb01 ), SHC( 0x7a25 ), SHC( 0xd9b9 ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ff0 ), SHC( 0xfbfb ), + SHC( 0x7fbf ), SHC( 0xf7f6 ), SHC( 0x7f6f ), SHC( 0xf3f4 ), SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7e6d ), SHC( 0xebfa ), + SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7ceb ), SHC( 0xe414 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7aeb ), SHC( 0xdc4a ), + SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x786f ), SHC( 0xd4a4 ), SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x7579 ), SHC( 0xcd2a ), + SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6e2d ), SHC( 0xbed8 ), + SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x69de ), SHC( 0xb80e ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x6524 ), SHC( 0xb18c ), + SHC( 0x62a0 ), SHC( 0xae69 ), SHC( 0x6004 ), SHC( 0xab5a ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x5a82 ), SHC( 0xa57e ), + SHC( 0x579f ), SHC( 0xa2b1 ), SHC( 0x54a6 ), SHC( 0x9ffc ), SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x4e74 ), SHC( 0x9adc ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fd3 ), SHC( 0xf94d ), SHC( 0x7f4c ), SHC( 0xf29f ), SHC( 0x7e6d ), SHC( 0xebfa ), + SHC( 0x7d34 ), SHC( 0xe563 ), SHC( 0x7ba3 ), SHC( 0xdedf ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7780 ), SHC( 0xd221 ), + SHC( 0x74ef ), SHC( 0xcbf0 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6eda ), SHC( 0xc000 ), SHC( 0x6b5a ), SHC( 0xba49 ), + SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x637a ), SHC( 0xaf72 ), SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x5a82 ), SHC( 0xa57e ), + SHC( 0x55a6 ), SHC( 0xa0e1 ), SHC( 0x508e ), SHC( 0x9c86 ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x45b7 ), SHC( 0x94a6 ), + SHC( 0x4000 ), SHC( 0x9126 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x3410 ), SHC( 0x8b11 ), SHC( 0x2ddf ), SHC( 0x8880 ), + SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x2121 ), SHC( 0x845d ), SHC( 0x1a9d ), SHC( 0x82cc ), SHC( 0x1406 ), SHC( 0x8193 ), + SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0x06b3 ), SHC( 0x802d ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fa8 ), SHC( 0xf6a0 ), + SHC( 0x7ea0 ), SHC( 0xed4d ), SHC( 0x7ceb ), SHC( 0xe414 ), SHC( 0x7a89 ), SHC( 0xdb01 ), SHC( 0x7780 ), SHC( 0xd221 ), + SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x6f84 ), SHC( 0xc12a ), SHC( 0x6a9d ), SHC( 0xb92a ), SHC( 0x6524 ), SHC( 0xb18c ), + SHC( 0x5f1f ), SHC( 0xaa5a ), SHC( 0x5898 ), SHC( 0xa39d ), SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x4a26 ), SHC( 0x97aa ), + SHC( 0x424f ), SHC( 0x9283 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x319a ), SHC( 0x8a00 ), SHC( 0x28d4 ), SHC( 0x86b0 ), + SHC( 0x1fd5 ), SHC( 0x8405 ), SHC( 0x16ab ), SHC( 0x8206 ), SHC( 0x0d61 ), SHC( 0x80b4 ), SHC( 0x0405 ), SHC( 0x8010 ), + SHC( 0xfaa4 ), SHC( 0x801d ), SHC( 0xf14a ), SHC( 0x80d9 ), SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xdedf ), SHC( 0x845d ), + SHC( 0xd5e8 ), SHC( 0x871f ), SHC( 0xcd2a ), SHC( 0x8a87 ), SHC( 0xc4b3 ), SHC( 0x8e91 ), SHC( 0xbc8d ), SHC( 0x9337 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f6f ), SHC( 0xf3f4 ), SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7aeb ), SHC( 0xdc4a ), + SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x6524 ), SHC( 0xb18c ), + SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x54a6 ), SHC( 0x9ffc ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x4128 ), SHC( 0x91d3 ), + SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x2b5c ), SHC( 0x8791 ), SHC( 0x1fd5 ), SHC( 0x8405 ), SHC( 0x1406 ), SHC( 0x8193 ), + SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xfbfb ), SHC( 0x8010 ), SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0xe414 ), SHC( 0x8315 ), + SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xcd2a ), SHC( 0x8a87 ), SHC( 0xc256 ), SHC( 0x8fd5 ), SHC( 0xb80e ), SHC( 0x9622 ), + SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9d60 ), SHC( 0xae69 ), SHC( 0x9622 ), SHC( 0xb80e ), + SHC( 0x8fd5 ), SHC( 0xc256 ), SHC( 0x8a87 ), SHC( 0xcd2a ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f27 ), SHC( 0xf14a ), + SHC( 0x7c9e ), SHC( 0xe2c5 ), SHC( 0x786f ), SHC( 0xd4a4 ), SHC( 0x72a7 ), SHC( 0xc716 ), SHC( 0x6b5a ), SHC( 0xba49 ), + SHC( 0x62a0 ), SHC( 0xae69 ), SHC( 0x5898 ), SHC( 0xa39d ), SHC( 0x4d64 ), SHC( 0x9a0b ), SHC( 0x4128 ), SHC( 0x91d3 ), + SHC( 0x3410 ), SHC( 0x8b11 ), SHC( 0x2647 ), SHC( 0x85db ), SHC( 0x17fc ), SHC( 0x8244 ), SHC( 0x0960 ), SHC( 0x8058 ), + SHC( 0xfaa4 ), SHC( 0x801d ), SHC( 0xebfa ), SHC( 0x8193 ), SHC( 0xdd94 ), SHC( 0x84b7 ), SHC( 0xcfa3 ), SHC( 0x897d ), + SHC( 0xc256 ), SHC( 0x8fd5 ), SHC( 0xb5da ), SHC( 0x97aa ), SHC( 0xaa5a ), SHC( 0xa0e1 ), SHC( 0x9ffc ), SHC( 0xab5a ), + SHC( 0x96e5 ), SHC( 0xb6f3 ), SHC( 0x8f31 ), SHC( 0xc383 ), SHC( 0x88fd ), SHC( 0xd0e1 ), SHC( 0x845d ), SHC( 0xdedf ), + SHC( 0x8160 ), SHC( 0xed4d ), SHC( 0x8010 ), SHC( 0xfbfb ), SHC( 0x8073 ), SHC( 0x0ab6 ), SHC( 0x8286 ), SHC( 0x194d ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ed1 ), SHC( 0xeea1 ), SHC( 0x7b49 ), SHC( 0xdd94 ), SHC( 0x7579 ), SHC( 0xcd2a ), + SHC( 0x6d7d ), SHC( 0xbdb1 ), SHC( 0x637a ), SHC( 0xaf72 ), SHC( 0x579f ), SHC( 0xa2b1 ), SHC( 0x4a26 ), SHC( 0x97aa ), + SHC( 0x3b4d ), SHC( 0x8e91 ), SHC( 0x2b5c ), SHC( 0x8791 ), SHC( 0x1a9d ), SHC( 0x82cc ), SHC( 0x0960 ), SHC( 0x8058 ), + SHC( 0xf7f6 ), SHC( 0x8041 ), SHC( 0xe6b3 ), SHC( 0x8286 ), SHC( 0xd5e8 ), SHC( 0x871f ), SHC( 0xc5e4 ), SHC( 0x8df3 ), + SHC( 0xb6f3 ), SHC( 0x96e5 ), SHC( 0xa95c ), SHC( 0xa1c8 ), SHC( 0x9d60 ), SHC( 0xae69 ), SHC( 0x9337 ), SHC( 0xbc8d ), + SHC( 0x8b11 ), SHC( 0xcbf0 ), SHC( 0x8515 ), SHC( 0xdc4a ), SHC( 0x8160 ), SHC( 0xed4d ), SHC( 0x8002 ), SHC( 0xfea9 ), + SHC( 0x8102 ), SHC( 0x100b ), SHC( 0x845d ), SHC( 0x2121 ), SHC( 0x8a00 ), SHC( 0x319a ), SHC( 0x91d3 ), SHC( 0x4128 ), + SHC( 0x9bb0 ), SHC( 0x4f82 ), SHC( 0xa768 ), SHC( 0x5c63 ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e6d ), SHC( 0xebfa ), + SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5a82 ), SHC( 0xa57e ), + SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1406 ), SHC( 0x8193 ), + SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xebfa ), SHC( 0x8193 ), SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xc5e4 ), SHC( 0x8df3 ), + SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x8df3 ), SHC( 0xc5e4 ), + SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8193 ), SHC( 0xebfa ), SHC( 0x8000 ), SHC( 0x0000 ), SHC( 0x8193 ), SHC( 0x1406 ), + SHC( 0x8644 ), SHC( 0x278e ), SHC( 0x8df3 ), SHC( 0x3a1c ), SHC( 0x9872 ), SHC( 0x4b3d ), SHC( 0xa57e ), SHC( 0x5a82 ), + SHC( 0xb4c3 ), SHC( 0x678e ), SHC( 0xc5e4 ), SHC( 0x720d ), SHC( 0xd872 ), SHC( 0x79bc ), SHC( 0xebfa ), SHC( 0x7e6d ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7dfa ), SHC( 0xe955 ), SHC( 0x77f9 ), SHC( 0xd362 ), SHC( 0x6e2d ), SHC( 0xbed8 ), + SHC( 0x60e5 ), SHC( 0xac5d ), SHC( 0x508e ), SHC( 0x9c86 ), SHC( 0x3daa ), SHC( 0x8fd5 ), SHC( 0x28d4 ), SHC( 0x86b0 ), + SHC( 0x12b3 ), SHC( 0x8160 ), SHC( 0xfbfb ), SHC( 0x8010 ), SHC( 0xe563 ), SHC( 0x82cc ), SHC( 0xcfa3 ), SHC( 0x897d ), + SHC( 0xbb6a ), SHC( 0x93ed ), SHC( 0xa95c ), SHC( 0xa1c8 ), SHC( 0x9a0b ), SHC( 0xb29c ), SHC( 0x8df3 ), SHC( 0xc5e4 ), + SHC( 0x8577 ), SHC( 0xdb01 ), SHC( 0x80d9 ), SHC( 0xf14a ), SHC( 0x8041 ), SHC( 0x080a ), SHC( 0x83b2 ), SHC( 0x1e88 ), + SHC( 0x8b11 ), SHC( 0x3410 ), SHC( 0x9622 ), SHC( 0x47f2 ), SHC( 0xa48c ), SHC( 0x598f ), SHC( 0xb5da ), SHC( 0x6856 ), + SHC( 0xc980 ), SHC( 0x73d1 ), SHC( 0xdedf ), SHC( 0x7ba3 ), SHC( 0xf54a ), SHC( 0x7f8d ), SHC( 0x0c0c ), SHC( 0x7f6f ), + SHC( 0x226c ), SHC( 0x7b49 ), SHC( 0x37b6 ), SHC( 0x733e ), SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7d7a ), SHC( 0xe6b3 ), + SHC( 0x7600 ), SHC( 0xce66 ), SHC( 0x69de ), SHC( 0xb80e ), SHC( 0x598f ), SHC( 0xa48c ), SHC( 0x45b7 ), SHC( 0x94a6 ), + SHC( 0x2f1f ), SHC( 0x88fd ), SHC( 0x16ab ), SHC( 0x8206 ), SHC( 0xfd52 ), SHC( 0x8007 ), SHC( 0xe414 ), SHC( 0x8315 ), + SHC( 0xcbf0 ), SHC( 0x8b11 ), SHC( 0xb5da ), SHC( 0x97aa ), SHC( 0xa2b1 ), SHC( 0xa861 ), SHC( 0x9337 ), SHC( 0xbc8d ), + SHC( 0x8807 ), SHC( 0xd362 ), SHC( 0x8193 ), SHC( 0xebfa ), SHC( 0x801d ), SHC( 0x055c ), SHC( 0x83b2 ), SHC( 0x1e88 ), + SHC( 0x8c2f ), SHC( 0x3680 ), SHC( 0x993d ), SHC( 0x4c51 ), SHC( 0xaa5a ), SHC( 0x5f1f ), SHC( 0xbed8 ), SHC( 0x6e2d ), + SHC( 0xd5e8 ), SHC( 0x78e1 ), SHC( 0xeea1 ), SHC( 0x7ed1 ), SHC( 0x080a ), SHC( 0x7fbf ), SHC( 0x2121 ), SHC( 0x7ba3 ), + SHC( 0x38ea ), SHC( 0x72a7 ), SHC( 0x4e74 ), SHC( 0x6524 ), SHC( 0x60e5 ), SHC( 0x53a3 ), SHC( 0x6f84 ), SHC( 0x3ed6 ) +}; + + +/** + * \brief Twiddle factors are unscaled + */ +const Word16 RotVector_256[2 * ( 256 - 32 )] = { // Q15 + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ff6 ), SHC( 0xfcdc ), SHC( 0x7fd9 ), SHC( 0xf9b8 ), SHC( 0x7fa7 ), SHC( 0xf695 ), + SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7f0a ), SHC( 0xf055 ), SHC( 0x7e9d ), SHC( 0xed38 ), SHC( 0x7e1e ), SHC( 0xea1e ), + SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7ce4 ), SHC( 0xe3f4 ), SHC( 0x7c2a ), SHC( 0xe0e6 ), SHC( 0x7b5d ), SHC( 0xdddc ), + SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x798a ), SHC( 0xd7d9 ), SHC( 0x7885 ), SHC( 0xd4e1 ), SHC( 0x776c ), SHC( 0xd1ef ), + SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x7505 ), SHC( 0xcc21 ), SHC( 0x73b6 ), SHC( 0xc946 ), SHC( 0x7255 ), SHC( 0xc673 ), + SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6f5f ), SHC( 0xc0e9 ), SHC( 0x6dca ), SHC( 0xbe32 ), SHC( 0x6c24 ), SHC( 0xbb85 ), + SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x68a7 ), SHC( 0xb64c ), SHC( 0x66d0 ), SHC( 0xb3c0 ), SHC( 0x64e9 ), SHC( 0xb140 ), + SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x60ec ), SHC( 0xac65 ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x5cb4 ), SHC( 0xa7bd ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fd9 ), SHC( 0xf9b8 ), SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7e9d ), SHC( 0xed38 ), + SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7c2a ), SHC( 0xe0e6 ), SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x7885 ), SHC( 0xd4e1 ), + SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x73b6 ), SHC( 0xc946 ), SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6dca ), SHC( 0xbe32 ), + SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x66d0 ), SHC( 0xb3c0 ), SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x5ed7 ), SHC( 0xaa0a ), + SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x55f6 ), SHC( 0xa129 ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x4c40 ), SHC( 0x9930 ), + SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x41ce ), SHC( 0x9236 ), SHC( 0x3c57 ), SHC( 0x8f1d ), SHC( 0x36ba ), SHC( 0x8c4a ), + SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2b1f ), SHC( 0x877b ), SHC( 0x2528 ), SHC( 0x8583 ), SHC( 0x1f1a ), SHC( 0x83d6 ), + SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x12c8 ), SHC( 0x8163 ), SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0x0648 ), SHC( 0x8027 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fa7 ), SHC( 0xf695 ), SHC( 0x7e9d ), SHC( 0xed38 ), SHC( 0x7ce4 ), SHC( 0xe3f4 ), + SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x776c ), SHC( 0xd1ef ), SHC( 0x73b6 ), SHC( 0xc946 ), SHC( 0x6f5f ), SHC( 0xc0e9 ), + SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x64e9 ), SHC( 0xb140 ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x5843 ), SHC( 0xa34c ), + SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x49b4 ), SHC( 0x9759 ), SHC( 0x41ce ), SHC( 0x9236 ), SHC( 0x398d ), SHC( 0x8dab ), + SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2827 ), SHC( 0x8676 ), SHC( 0x1f1a ), SHC( 0x83d6 ), SHC( 0x15e2 ), SHC( 0x81e2 ), + SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0x0324 ), SHC( 0x800a ), SHC( 0xf9b8 ), SHC( 0x8027 ), SHC( 0xf055 ), SHC( 0x80f6 ), + SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xdddc ), SHC( 0x84a3 ), SHC( 0xd4e1 ), SHC( 0x877b ), SHC( 0xcc21 ), SHC( 0x8afb ), + SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xbb85 ), SHC( 0x93dc ), SHC( 0xb3c0 ), SHC( 0x9930 ), SHC( 0xac65 ), SHC( 0x9f14 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7a7d ), SHC( 0xdad8 ), + SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x62f2 ), SHC( 0xaecc ), + SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x3c57 ), SHC( 0x8f1d ), + SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2528 ), SHC( 0x8583 ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0c8c ), SHC( 0x809e ), + SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xf374 ), SHC( 0x809e ), SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xdad8 ), SHC( 0x8583 ), + SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xb8e3 ), SHC( 0x9592 ), SHC( 0xaecc ), SHC( 0x9d0e ), + SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9d0e ), SHC( 0xaecc ), SHC( 0x9592 ), SHC( 0xb8e3 ), SHC( 0x8f1d ), SHC( 0xc3a9 ), + SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x8583 ), SHC( 0xdad8 ), SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x809e ), SHC( 0xf374 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f0a ), SHC( 0xf055 ), SHC( 0x7c2a ), SHC( 0xe0e6 ), SHC( 0x776c ), SHC( 0xd1ef ), + SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x68a7 ), SHC( 0xb64c ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x539b ), SHC( 0x9f14 ), + SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x398d ), SHC( 0x8dab ), SHC( 0x2b1f ), SHC( 0x877b ), SHC( 0x1c0c ), SHC( 0x831c ), + SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0xfcdc ), SHC( 0x800a ), SHC( 0xed38 ), SHC( 0x8163 ), SHC( 0xdddc ), SHC( 0x84a3 ), + SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xc0e9 ), SHC( 0x90a1 ), SHC( 0xb3c0 ), SHC( 0x9930 ), SHC( 0xa7bd ), SHC( 0xa34c ), + SHC( 0x9d0e ), SHC( 0xaecc ), SHC( 0x93dc ), SHC( 0xbb85 ), SHC( 0x8c4a ), SHC( 0xc946 ), SHC( 0x8676 ), SHC( 0xd7d9 ), + SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x8059 ), SHC( 0xf695 ), SHC( 0x8027 ), SHC( 0x0648 ), SHC( 0x81e2 ), SHC( 0x15e2 ), + SHC( 0x8583 ), SHC( 0x2528 ), SHC( 0x8afb ), SHC( 0x33df ), SHC( 0x9236 ), SHC( 0x41ce ), SHC( 0x9b17 ), SHC( 0x4ec0 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e9d ), SHC( 0xed38 ), SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x73b6 ), SHC( 0xc946 ), + SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x41ce ), SHC( 0x9236 ), + SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x1f1a ), SHC( 0x83d6 ), SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0xf9b8 ), SHC( 0x8027 ), + SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xd4e1 ), SHC( 0x877b ), SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xb3c0 ), SHC( 0x9930 ), + SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9930 ), SHC( 0xb3c0 ), SHC( 0x8f1d ), SHC( 0xc3a9 ), SHC( 0x877b ), SHC( 0xd4e1 ), + SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x8027 ), SHC( 0xf9b8 ), SHC( 0x809e ), SHC( 0x0c8c ), SHC( 0x83d6 ), SHC( 0x1f1a ), + SHC( 0x89be ), SHC( 0x30fc ), SHC( 0x9236 ), SHC( 0x41ce ), SHC( 0x9d0e ), SHC( 0x5134 ), SHC( 0xaa0a ), SHC( 0x5ed7 ), + SHC( 0xb8e3 ), SHC( 0x6a6e ), SHC( 0xc946 ), SHC( 0x73b6 ), SHC( 0xdad8 ), SHC( 0x7a7d ), SHC( 0xed38 ), SHC( 0x7e9d ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e1e ), SHC( 0xea1e ), SHC( 0x7885 ), SHC( 0xd4e1 ), SHC( 0x6f5f ), SHC( 0xc0e9 ), + SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x539b ), SHC( 0x9f14 ), SHC( 0x41ce ), SHC( 0x9236 ), SHC( 0x2e11 ), SHC( 0x8894 ), + SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0324 ), SHC( 0x800a ), SHC( 0xed38 ), SHC( 0x8163 ), SHC( 0xd7d9 ), SHC( 0x8676 ), + SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xb140 ), SHC( 0x9b17 ), SHC( 0xa129 ), SHC( 0xaa0a ), SHC( 0x93dc ), SHC( 0xbb85 ), + SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x831c ), SHC( 0xe3f4 ), SHC( 0x8027 ), SHC( 0xf9b8 ), SHC( 0x80f6 ), SHC( 0x0fab ), + SHC( 0x8583 ), SHC( 0x2528 ), SHC( 0x8dab ), SHC( 0x398d ), SHC( 0x9930 ), SHC( 0x4c40 ), SHC( 0xa7bd ), SHC( 0x5cb4 ), + SHC( 0xb8e3 ), SHC( 0x6a6e ), SHC( 0xcc21 ), SHC( 0x7505 ), SHC( 0xe0e6 ), SHC( 0x7c2a ), SHC( 0xf695 ), SHC( 0x7fa7 ), + SHC( 0x0c8c ), SHC( 0x7f62 ), SHC( 0x2224 ), SHC( 0x7b5d ), SHC( 0x36ba ), SHC( 0x73b6 ), SHC( 0x49b4 ), SHC( 0x68a7 ) +}; + +/** + * \brief Twiddle factors are unscaled + */ +const Word16 RotVector_320[2 * ( 320 - 20 )] = { // Q15 + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fe7 ), SHC( 0xfafa ), SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7f1d ), SHC( 0xf0f5 ), + SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7b32 ), SHC( 0xdd41 ), + SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7817 ), SHC( 0xd3b2 ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x743e ), SHC( 0xca69 ), + SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6fae ), SHC( 0xc175 ), SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x6a6e ), SHC( 0xb8e3 ), + SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x6485 ), SHC( 0xb0c2 ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5dfe ), SHC( 0xa91d ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7c77 ), SHC( 0xe21e ), + SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6d23 ), SHC( 0xbd1f ), + SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5321 ), SHC( 0x9eab ), + SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x42e1 ), SHC( 0x92dd ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x30fc ), SHC( 0x89be ), + SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1de2 ), SHC( 0x8389 ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0a0b ), SHC( 0x8065 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f1d ), SHC( 0xf0f5 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7817 ), SHC( 0xd3b2 ), + SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x56e3 ), SHC( 0xa202 ), + SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3e8b ), SHC( 0x9052 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x22bf ), SHC( 0x84ce ), + SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0506 ), SHC( 0x8019 ), SHC( 0xf5f5 ), SHC( 0x8065 ), SHC( 0xe707 ), SHC( 0x8276 ), + SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xca69 ), SHC( 0x8bc2 ), SHC( 0xbd1f ), SHC( 0x92dd ), SHC( 0xb0c2 ), SHC( 0x9b7b ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x720d ), SHC( 0xc5e4 ), + SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3a1c ), SHC( 0x8df3 ), + SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xebfa ), SHC( 0x8193 ), + SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa57e ), SHC( 0xa57e ), + SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x8df3 ), SHC( 0xc5e4 ), SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8193 ), SHC( 0xebfa ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), + SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x18f9 ), SHC( 0x8276 ), + SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xb8e3 ), SHC( 0x9592 ), + SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9592 ), SHC( 0xb8e3 ), SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x8276 ), SHC( 0xe707 ), + SHC( 0x8000 ), SHC( 0x0000 ), SHC( 0x8276 ), SHC( 0x18f9 ), SHC( 0x89be ), SHC( 0x30fc ), SHC( 0x9592 ), SHC( 0x471d ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6155 ), SHC( 0xacdf ), + SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0xf5f5 ), SHC( 0x8065 ), + SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xbd1f ), SHC( 0x92dd ), SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x92dd ), SHC( 0xbd1f ), + SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8065 ), SHC( 0xf5f5 ), SHC( 0x8193 ), SHC( 0x1406 ), SHC( 0x89be ), SHC( 0x30fc ), + SHC( 0x9872 ), SHC( 0x4b3d ), SHC( 0xacdf ), SHC( 0x6155 ), SHC( 0xc5e4 ), SHC( 0x720d ), SHC( 0xe21e ), SHC( 0x7c77 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7b32 ), SHC( 0xdd41 ), SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x56e3 ), SHC( 0xa202 ), + SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0xf5f5 ), SHC( 0x8065 ), SHC( 0xd3b2 ), SHC( 0x87e9 ), + SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0x9b7b ), SHC( 0xb0c2 ), SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x80e3 ), SHC( 0xf0f5 ), + SHC( 0x8193 ), SHC( 0x1406 ), SHC( 0x8bc2 ), SHC( 0x3597 ), SHC( 0x9eab ), SHC( 0x5321 ), SHC( 0xb8e3 ), SHC( 0x6a6e ), + SHC( 0xd872 ), SHC( 0x79bc ), SHC( 0xfafa ), SHC( 0x7fe7 ), SHC( 0x1de2 ), SHC( 0x7c77 ), SHC( 0x3e8b ), SHC( 0x6fae ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ffa ), SHC( 0xfd7d ), SHC( 0x7fe7 ), SHC( 0xfafa ), SHC( 0x7fc7 ), SHC( 0xf877 ), + SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7f1d ), SHC( 0xf0f5 ), SHC( 0x7ecb ), SHC( 0xee76 ), + SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7e02 ), SHC( 0xe980 ), SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7d07 ), SHC( 0xe492 ), + SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7bda ), SHC( 0xdfae ), SHC( 0x7b32 ), SHC( 0xdd41 ), SHC( 0x7a7d ), SHC( 0xdad8 ), + SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x78ef ), SHC( 0xd610 ), SHC( 0x7817 ), SHC( 0xd3b2 ), SHC( 0x7732 ), SHC( 0xd159 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fc7 ), SHC( 0xf877 ), SHC( 0x7f1d ), SHC( 0xf0f5 ), SHC( 0x7e02 ), SHC( 0xe980 ), + SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x7817 ), SHC( 0xd3b2 ), SHC( 0x7546 ), SHC( 0xccb4 ), + SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6e6e ), SHC( 0xbf47 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x660f ), SHC( 0xb2bf ), + SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5c45 ), SHC( 0xa749 ), SHC( 0x56e3 ), SHC( 0xa202 ), SHC( 0x5134 ), SHC( 0x9d0e ), + SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x4502 ), SHC( 0x9432 ), SHC( 0x3e8b ), SHC( 0x9052 ), SHC( 0x37dc ), SHC( 0x8cd5 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7a7d ), SHC( 0xdad8 ), + SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x62f2 ), SHC( 0xaecc ), + SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x3c57 ), SHC( 0x8f1d ), + SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2528 ), SHC( 0x8583 ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0c8c ), SHC( 0x809e ), + SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xf374 ), SHC( 0x809e ), SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xdad8 ), SHC( 0x8583 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ecb ), SHC( 0xee76 ), SHC( 0x7b32 ), SHC( 0xdd41 ), SHC( 0x7546 ), SHC( 0xccb4 ), + SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x56e3 ), SHC( 0xa202 ), SHC( 0x4930 ), SHC( 0x96fd ), + SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x29f0 ), SHC( 0x8711 ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0789 ), SHC( 0x8039 ), + SHC( 0xf5f5 ), SHC( 0x8065 ), SHC( 0xe492 ), SHC( 0x82f9 ), SHC( 0xd3b2 ), SHC( 0x87e9 ), SHC( 0xc3a9 ), SHC( 0x8f1d ), + SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa749 ), SHC( 0xa3bb ), SHC( 0x9b7b ), SHC( 0xb0c2 ), SHC( 0x9192 ), SHC( 0xbf47 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e02 ), SHC( 0xe980 ), SHC( 0x7817 ), SHC( 0xd3b2 ), SHC( 0x6e6e ), SHC( 0xbf47 ), + SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x3e8b ), SHC( 0x9052 ), SHC( 0x29f0 ), SHC( 0x8711 ), + SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0xfd7d ), SHC( 0x8006 ), SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xd159 ), SHC( 0x88ce ), + SHC( 0xbd1f ), SHC( 0x92dd ), SHC( 0xaafa ), SHC( 0xa052 ), SHC( 0x9b7b ), SHC( 0xb0c2 ), SHC( 0x8f1d ), SHC( 0xc3a9 ), + SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8135 ), SHC( 0xee76 ), SHC( 0x8019 ), SHC( 0x0506 ), SHC( 0x82f9 ), SHC( 0x1b6e ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7d07 ), SHC( 0xe492 ), SHC( 0x743e ), SHC( 0xca69 ), SHC( 0x660f ), SHC( 0xb2bf ), + SHC( 0x5321 ), SHC( 0x9eab ), SHC( 0x3c57 ), SHC( 0x8f1d ), SHC( 0x22bf ), SHC( 0x84ce ), SHC( 0x0789 ), SHC( 0x8039 ), + SHC( 0xebfa ), SHC( 0x8193 ), SHC( 0xd159 ), SHC( 0x88ce ), SHC( 0xb8e3 ), SHC( 0x9592 ), SHC( 0xa3bb ), SHC( 0xa749 ), + SHC( 0x92dd ), SHC( 0xbd1f ), SHC( 0x8711 ), SHC( 0xd610 ), SHC( 0x80e3 ), SHC( 0xf0f5 ), SHC( 0x809e ), SHC( 0x0c8c ), + SHC( 0x8644 ), SHC( 0x278e ), SHC( 0x9192 ), SHC( 0x40b9 ), SHC( 0xa202 ), SHC( 0x56e3 ), SHC( 0xb6d0 ), SHC( 0x6903 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7bda ), SHC( 0xdfae ), SHC( 0x6fae ), SHC( 0xc175 ), SHC( 0x5c45 ), SHC( 0xa749 ), + SHC( 0x42e1 ), SHC( 0x92dd ), SHC( 0x2528 ), SHC( 0x8583 ), SHC( 0x0506 ), SHC( 0x8019 ), SHC( 0xe492 ), SHC( 0x82f9 ), + SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xaafa ), SHC( 0xa052 ), SHC( 0x9592 ), SHC( 0xb8e3 ), SHC( 0x8711 ), SHC( 0xd610 ), + SHC( 0x8065 ), SHC( 0xf5f5 ), SHC( 0x81fe ), SHC( 0x1680 ), SHC( 0x8bc2 ), SHC( 0x3597 ), SHC( 0x9d0e ), SHC( 0x5134 ), + SHC( 0xb4c3 ), SHC( 0x678e ), SHC( 0xd159 ), SHC( 0x7732 ), SHC( 0xf0f5 ), SHC( 0x7f1d ), SHC( 0x118a ), SHC( 0x7ecb ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x5134 ), SHC( 0x9d0e ), + SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xc3a9 ), SHC( 0x8f1d ), + SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x8f1d ), SHC( 0xc3a9 ), SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x809e ), SHC( 0x0c8c ), + SHC( 0x89be ), SHC( 0x30fc ), SHC( 0x9d0e ), SHC( 0x5134 ), SHC( 0xb8e3 ), SHC( 0x6a6e ), SHC( 0xdad8 ), SHC( 0x7a7d ), + SHC( 0x0000 ), SHC( 0x7fff ), SHC( 0x2528 ), SHC( 0x7a7d ), SHC( 0x471d ), SHC( 0x6a6e ), SHC( 0x62f2 ), SHC( 0x5134 ) +}; + + +/** + * \brief Twiddle factors are unscaled + * Rotation factor table, real and imaginary part interleaved, for dim1=20,dim2=20 + */ + +const Word16 RotVector_400[2 * ( 400 - 20 )] = { // Q15 + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ff0 ), SHC( 0xfbfb ), SHC( 0x7fbf ), SHC( 0xf7f6 ), SHC( 0x7f6f ), SHC( 0xf3f4 ), + SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7ceb ), SHC( 0xe414 ), + SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7aeb ), SHC( 0xdc4a ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x786f ), SHC( 0xd4a4 ), + SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x7579 ), SHC( 0xcd2a ), SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x720d ), SHC( 0xc5e4 ), + SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6e2d ), SHC( 0xbed8 ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x69de ), SHC( 0xb80e ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fbf ), SHC( 0xf7f6 ), SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7dbc ), SHC( 0xe804 ), + SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x73d1 ), SHC( 0xc980 ), + SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x62a0 ), SHC( 0xae69 ), + SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x579f ), SHC( 0xa2b1 ), SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x4b3d ), SHC( 0x9872 ), + SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x3daa ), SHC( 0x8fd5 ), SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x2f1f ), SHC( 0x88fd ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f6f ), SHC( 0xf3f4 ), SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7aeb ), SHC( 0xdc4a ), + SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x6524 ), SHC( 0xb18c ), + SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x54a6 ), SHC( 0x9ffc ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x4128 ), SHC( 0x91d3 ), + SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x2b5c ), SHC( 0x8791 ), SHC( 0x1fd5 ), SHC( 0x8405 ), SHC( 0x1406 ), SHC( 0x8193 ), + SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xfbfb ), SHC( 0x8010 ), SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0xe414 ), SHC( 0x8315 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7703 ), SHC( 0xd0e1 ), + SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x5197 ), SHC( 0x9d60 ), + SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x17fc ), SHC( 0x8244 ), + SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xf7f6 ), SHC( 0x8041 ), SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xd872 ), SHC( 0x8644 ), + SHC( 0xc980 ), SHC( 0x8c2f ), SHC( 0xbb6a ), SHC( 0x93ed ), SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0xa2b1 ), SHC( 0xa861 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x720d ), SHC( 0xc5e4 ), + SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3a1c ), SHC( 0x8df3 ), + SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xebfa ), SHC( 0x8193 ), + SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0xa57e ), SHC( 0xa57e ), + SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x8df3 ), SHC( 0xc5e4 ), SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8193 ), SHC( 0xebfa ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x6c13 ), SHC( 0xbb6a ), + SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x1fd5 ), SHC( 0x8405 ), + SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xc256 ), SHC( 0x8fd5 ), + SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0x9d60 ), SHC( 0xae69 ), SHC( 0x8fd5 ), SHC( 0xc256 ), SHC( 0x8644 ), SHC( 0xd872 ), + SHC( 0x8102 ), SHC( 0xeff5 ), SHC( 0x8041 ), SHC( 0x080a ), SHC( 0x8405 ), SHC( 0x1fd5 ), SHC( 0x8c2f ), SHC( 0x3680 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ceb ), SHC( 0xe414 ), SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x6524 ), SHC( 0xb18c ), + SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x1fd5 ), SHC( 0x8405 ), SHC( 0x0405 ), SHC( 0x8010 ), + SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xcd2a ), SHC( 0x8a87 ), SHC( 0xb4c3 ), SHC( 0x9872 ), SHC( 0x9ffc ), SHC( 0xab5a ), + SHC( 0x8fd5 ), SHC( 0xc256 ), SHC( 0x8515 ), SHC( 0xdc4a ), SHC( 0x8041 ), SHC( 0xf7f6 ), SHC( 0x8193 ), SHC( 0x1406 ), + SHC( 0x88fd ), SHC( 0x2f1f ), SHC( 0x9622 ), SHC( 0x47f2 ), SHC( 0xa861 ), SHC( 0x5d4f ), SHC( 0xbed8 ), SHC( 0x6e2d ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x702b ), SHC( 0xc256 ), SHC( 0x5d4f ), SHC( 0xa861 ), + SHC( 0x4496 ), SHC( 0x93ed ), SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x080a ), SHC( 0x8041 ), SHC( 0xe804 ), SHC( 0x8244 ), + SHC( 0xc980 ), SHC( 0x8c2f ), SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0x9872 ), SHC( 0xb4c3 ), SHC( 0x88fd ), SHC( 0xd0e1 ), + SHC( 0x8102 ), SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0x100b ), SHC( 0x88fd ), SHC( 0x2f1f ), SHC( 0x9872 ), SHC( 0x4b3d ), + SHC( 0xae69 ), SHC( 0x62a0 ), SHC( 0xc980 ), SHC( 0x73d1 ), SHC( 0xe804 ), SHC( 0x7dbc ), SHC( 0x080a ), SHC( 0x7fbf ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7aeb ), SHC( 0xdc4a ), SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x54a6 ), SHC( 0x9ffc ), + SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0xcd2a ), SHC( 0x8a87 ), + SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0x9622 ), SHC( 0xb80e ), SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8010 ), SHC( 0xfbfb ), + SHC( 0x8405 ), SHC( 0x1fd5 ), SHC( 0x91d3 ), SHC( 0x4128 ), SHC( 0xa861 ), SHC( 0x5d4f ), SHC( 0xc5e4 ), SHC( 0x720d ), + SHC( 0xe804 ), SHC( 0x7dbc ), SHC( 0x0c0c ), SHC( 0x7f6f ), SHC( 0x2f1f ), SHC( 0x7703 ), SHC( 0x4e74 ), SHC( 0x6524 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ffc ), SHC( 0xfdfd ), SHC( 0x7ff0 ), SHC( 0xfbfb ), SHC( 0x7fdc ), SHC( 0xf9f8 ), + SHC( 0x7fbf ), SHC( 0xf7f6 ), SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7f6f ), SHC( 0xf3f4 ), SHC( 0x7f3a ), SHC( 0xf1f4 ), + SHC( 0x7efe ), SHC( 0xeff5 ), SHC( 0x7eb9 ), SHC( 0xedf7 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7e18 ), SHC( 0xe9fe ), + SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7d57 ), SHC( 0xe60b ), SHC( 0x7ceb ), SHC( 0xe414 ), SHC( 0x7c77 ), SHC( 0xe21e ), + SHC( 0x7bfb ), SHC( 0xe02b ), SHC( 0x7b77 ), SHC( 0xde39 ), SHC( 0x7aeb ), SHC( 0xdc4a ), SHC( 0x7a57 ), SHC( 0xda5d ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fdc ), SHC( 0xf9f8 ), SHC( 0x7f6f ), SHC( 0xf3f4 ), SHC( 0x7eb9 ), SHC( 0xedf7 ), + SHC( 0x7dbc ), SHC( 0xe804 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x7aeb ), SHC( 0xdc4a ), SHC( 0x7919 ), SHC( 0xd68a ), + SHC( 0x7703 ), SHC( 0xd0e1 ), SHC( 0x74a9 ), SHC( 0xcb53 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6f2f ), SHC( 0xc095 ), + SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x68b9 ), SHC( 0xb666 ), SHC( 0x6524 ), SHC( 0xb18c ), SHC( 0x6155 ), SHC( 0xacdf ), + SHC( 0x5d4f ), SHC( 0xa861 ), SHC( 0x5914 ), SHC( 0xa414 ), SHC( 0x54a6 ), SHC( 0x9ffc ), SHC( 0x5008 ), SHC( 0x9c1b ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f9b ), SHC( 0xf5f5 ), SHC( 0x7e6d ), SHC( 0xebfa ), SHC( 0x7c77 ), SHC( 0xe21e ), + SHC( 0x79bc ), SHC( 0xd872 ), SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6d23 ), SHC( 0xbd1f ), + SHC( 0x678e ), SHC( 0xb4c3 ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5321 ), SHC( 0x9eab ), + SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x42e1 ), SHC( 0x92dd ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x30fc ), SHC( 0x89be ), + SHC( 0x278e ), SHC( 0x8644 ), SHC( 0x1de2 ), SHC( 0x8389 ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0a0b ), SHC( 0x8065 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f3a ), SHC( 0xf1f4 ), SHC( 0x7ceb ), SHC( 0xe414 ), SHC( 0x7919 ), SHC( 0xd68a ), + SHC( 0x73d1 ), SHC( 0xc980 ), SHC( 0x6d23 ), SHC( 0xbd1f ), SHC( 0x6524 ), SHC( 0xb18c ), SHC( 0x5bec ), SHC( 0xa6ec ), + SHC( 0x5197 ), SHC( 0x9d60 ), SHC( 0x4646 ), SHC( 0x9504 ), SHC( 0x3a1c ), SHC( 0x8df3 ), SHC( 0x2d3f ), SHC( 0x8843 ), + SHC( 0x1fd5 ), SHC( 0x8405 ), SHC( 0x1209 ), SHC( 0x8147 ), SHC( 0x0405 ), SHC( 0x8010 ), SHC( 0xf5f5 ), SHC( 0x8065 ), + SHC( 0xe804 ), SHC( 0x8244 ), SHC( 0xda5d ), SHC( 0x85a9 ), SHC( 0xcd2a ), SHC( 0x8a87 ), SHC( 0xc095 ), SHC( 0x90d1 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7eb9 ), SHC( 0xedf7 ), SHC( 0x7aeb ), SHC( 0xdc4a ), SHC( 0x74a9 ), SHC( 0xcb53 ), + SHC( 0x6c13 ), SHC( 0xbb6a ), SHC( 0x6155 ), SHC( 0xacdf ), SHC( 0x54a6 ), SHC( 0x9ffc ), SHC( 0x4646 ), SHC( 0x9504 ), + SHC( 0x3680 ), SHC( 0x8c2f ), SHC( 0x25a3 ), SHC( 0x85a9 ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0x0203 ), SHC( 0x8004 ), + SHC( 0xeff5 ), SHC( 0x8102 ), SHC( 0xde39 ), SHC( 0x8489 ), SHC( 0xcd2a ), SHC( 0x8a87 ), SHC( 0xbd1f ), SHC( 0x92dd ), + SHC( 0xae69 ), SHC( 0x9d60 ), SHC( 0xa154 ), SHC( 0xa9db ), SHC( 0x9622 ), SHC( 0xb80e ), SHC( 0x8d0d ), SHC( 0xc7b0 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e18 ), SHC( 0xe9fe ), SHC( 0x786f ), SHC( 0xd4a4 ), SHC( 0x6f2f ), SHC( 0xc095 ), + SHC( 0x62a0 ), SHC( 0xae69 ), SHC( 0x5321 ), SHC( 0x9eab ), SHC( 0x4128 ), SHC( 0x91d3 ), SHC( 0x2d3f ), SHC( 0x8843 ), + SHC( 0x17fc ), SHC( 0x8244 ), SHC( 0x0203 ), SHC( 0x8004 ), SHC( 0xebfa ), SHC( 0x8193 ), SHC( 0xd68a ), SHC( 0x86e7 ), + SHC( 0xc256 ), SHC( 0x8fd5 ), SHC( 0xaff8 ), SHC( 0x9c1b ), SHC( 0x9ffc ), SHC( 0xab5a ), SHC( 0x92dd ), SHC( 0xbd1f ), + SHC( 0x88fd ), SHC( 0xd0e1 ), SHC( 0x82a9 ), SHC( 0xe60b ), SHC( 0x8010 ), SHC( 0xfbfb ), SHC( 0x8147 ), SHC( 0x1209 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7d57 ), SHC( 0xe60b ), SHC( 0x7579 ), SHC( 0xcd2a ), SHC( 0x68b9 ), SHC( 0xb666 ), + SHC( 0x579f ), SHC( 0xa2b1 ), SHC( 0x42e1 ), SHC( 0x92dd ), SHC( 0x2b5c ), SHC( 0x8791 ), SHC( 0x1209 ), SHC( 0x8147 ), + SHC( 0xf7f6 ), SHC( 0x8041 ), SHC( 0xde39 ), SHC( 0x8489 ), SHC( 0xc5e4 ), SHC( 0x8df3 ), SHC( 0xaff8 ), SHC( 0x9c1b ), + SHC( 0x9d60 ), SHC( 0xae69 ), SHC( 0x8ee1 ), SHC( 0xc41b ), SHC( 0x8515 ), SHC( 0xdc4a ), SHC( 0x8065 ), SHC( 0xf5f5 ), + SHC( 0x8102 ), SHC( 0x100b ), SHC( 0x86e7 ), SHC( 0x2976 ), SHC( 0x91d3 ), SHC( 0x4128 ), SHC( 0xa154 ), SHC( 0x5625 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7c77 ), SHC( 0xe21e ), SHC( 0x720d ), SHC( 0xc5e4 ), SHC( 0x6155 ), SHC( 0xacdf ), + SHC( 0x4b3d ), SHC( 0x9872 ), SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x1406 ), SHC( 0x8193 ), SHC( 0xf5f5 ), SHC( 0x8065 ), + SHC( 0xd872 ), SHC( 0x8644 ), SHC( 0xbd1f ), SHC( 0x92dd ), SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x92dd ), SHC( 0xbd1f ), + SHC( 0x8644 ), SHC( 0xd872 ), SHC( 0x8065 ), SHC( 0xf5f5 ), SHC( 0x8193 ), SHC( 0x1406 ), SHC( 0x89be ), SHC( 0x30fc ), + SHC( 0x9872 ), SHC( 0x4b3d ), SHC( 0xacdf ), SHC( 0x6155 ), SHC( 0xc5e4 ), SHC( 0x720d ), SHC( 0xe21e ), SHC( 0x7c77 ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7b77 ), SHC( 0xde39 ), SHC( 0x6e2d ), SHC( 0xbed8 ), SHC( 0x5914 ), SHC( 0xa414 ), + SHC( 0x3daa ), SHC( 0x8fd5 ), SHC( 0x1de2 ), SHC( 0x8389 ), SHC( 0xfbfb ), SHC( 0x8010 ), SHC( 0xda5d ), SHC( 0x85a9 ), + SHC( 0xbb6a ), SHC( 0x93ed ), SHC( 0xa154 ), SHC( 0xa9db ), SHC( 0x8df3 ), SHC( 0xc5e4 ), SHC( 0x82a9 ), SHC( 0xe60b ), + SHC( 0x8041 ), SHC( 0x080a ), SHC( 0x86e7 ), SHC( 0x2976 ), SHC( 0x9622 ), SHC( 0x47f2 ), SHC( 0xacdf ), SHC( 0x6155 ), + SHC( 0xc980 ), SHC( 0x73d1 ), SHC( 0xe9fe ), SHC( 0x7e18 ), SHC( 0x0c0c ), SHC( 0x7f6f ), SHC( 0x2d3f ), SHC( 0x77bd ), + SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7a57 ), SHC( 0xda5d ), SHC( 0x69de ), SHC( 0xb80e ), SHC( 0x5008 ), SHC( 0x9c1b ), + SHC( 0x2f1f ), SHC( 0x88fd ), SHC( 0x0a0b ), SHC( 0x8065 ), SHC( 0xe414 ), SHC( 0x8315 ), SHC( 0xc095 ), SHC( 0x90d1 ), + SHC( 0xa2b1 ), SHC( 0xa861 ), SHC( 0x8d0d ), SHC( 0xc7b0 ), SHC( 0x8193 ), SHC( 0xebfa ), SHC( 0x8147 ), SHC( 0x1209 ), + SHC( 0x8c2f ), SHC( 0x3680 ), SHC( 0xa154 ), SHC( 0x5625 ), SHC( 0xbed8 ), SHC( 0x6e2d ), SHC( 0xe21e ), SHC( 0x7c77 ), + SHC( 0x080a ), SHC( 0x7fbf ), SHC( 0x2d3f ), SHC( 0x77bd ), SHC( 0x4e74 ), SHC( 0x6524 ), SHC( 0x68b9 ), SHC( 0x499a ) +}; + +const Word16 FFT_W64[( 64 * 2 ) * 2] = { // Q15 + 16384, 0, 16364, -804, 16305, -1606, 16207, -2404, + 16069, -3196, 15893, -3981, 15679, -4756, 15426, -5520, + 15137, -6270, 14811, -7005, 14449, -7723, 14053, -8423, + 13623, -9102, 13160, -9760, 12665, -10394, 12140, -11003, + 11585, -11585, 11003, -12140, 10394, -12665, 9760, -13160, + 9102, -13623, 8423, -14053, 7723, -14449, 7005, -14811, + 6270, -15137, 5520, -15426, 4756, -15679, 3981, -15893, + 3196, -16069, 2404, -16207, 1606, -16305, 804, -16364, + 0, -16384, -804, -16364, -1606, -16305, -2404, -16207, + -3196, -16069, -3981, -15893, -4756, -15679, -5520, -15426, + -6270, -15137, -7005, -14811, -7723, -14449, -8423, -14053, + -9102, -13623, -9760, -13160, -10394, -12665, -11003, -12140, + -11585, -11585, -12140, -11003, -12665, -10394, -13160, -9760, + -13623, -9102, -14053, -8423, -14449, -7723, -14811, -7005, + -15137, -6270, -15426, -5520, -15679, -4756, -15893, -3981, + -16069, -3196, -16207, -2404, -16305, -1606, -16364, -804, + /* The following is a duplication of the above but scaled up by a factor of 2. + * This save one operation in inverse FFT inner loops */ + 32767, 0, 32729, -1608, 32610, -3212, 32413, -4808, + 32138, -6393, 31786, -7962, 31357, -9512, 30853, -11039, + 30274, -12540, 29622, -14010, 28899, -15447, 28106, -16846, + 27246, -18205, 26320, -19520, 25330, -20788, 24279, -22006, + 23170, -23170, 22006, -24279, 20788, -25330, 19520, -26320, + 18205, -27246, 16846, -28106, 15447, -28899, 14010, -29622, + 12540, -30274, 11039, -30853, 9512, -31357, 7962, -31786, + 6393, -32138, 4808, -32413, 3212, -32610, 1608, -32729, + 0, -32768, -1608, -32729, -3212, -32610, -4808, -32413, + -6393, -32138, -7962, -31786, -9512, -31357, -11039, -30853, + -12540, -30274, -14010, -29622, -15447, -28899, -16846, -28106, + -18205, -27246, -19520, -26320, -20788, -25330, -22006, -24279, + -23170, -23170, -24279, -22006, -25330, -20788, -26320, -19520, + -27246, -18205, -28106, -16846, -28899, -15447, -29622, -14010, + -30274, -12540, -30853, -11039, -31357, -9512, -31786, -7962, + -32138, -6393, -32413, -4808, -32610, -3212, -32729, -1608 +}; + +const Word16 FFT_W128[] = { // Q15 + /* part of table that is not scaled by 2 */ + 16384, 0, 16379, -402, 16364, -804, 16339, -1205, + 16305, -1606, 16260, -2006, 16206, -2404, 16142, -2801, + 16069, -3196, 15985, -3590, 15893, -3981, 15790, -4370, + 15678, -4756, 15557, -5139, 15426, -5519, 15286, -5896, + 15136, -6270, 14978, -6639, 14811, -7005, 14634, -7366, + 14449, -7723, 14255, -8075, 14053, -8423, 13842, -8765, + 13622, -9102, 13395, -9434, 13159, -9760, 12916, -10080, + 12665, -10394, 12406, -10701, 12139, -11002, 11866, -11297, + 11585, -11585, 11297, -11866, 11002, -12139, 10701, -12406, + 10394, -12665, 10080, -12916, 9760, -13159, 9434, -13395, + 9102, -13622, 8765, -13842, 8423, -14053, 8075, -14255, + 7723, -14449, 7366, -14634, 7005, -14811, 6639, -14978, + 6270, -15136, 5896, -15286, 5519, -15426, 5139, -15557, + 4756, -15678, 4370, -15790, 3981, -15893, 3590, -15985, + 3196, -16069, 2801, -16142, 2404, -16206, 2006, -16260, + 1606, -16305, 1205, -16339, 804, -16364, 402, -16379, + 0, -16384, -402, -16379, -804, -16364, -1205, -16339, + -1606, -16305, -2006, -16260, -2404, -16206, -2801, -16142, + -3196, -16069, -3590, -15985, -3981, -15893, -4370, -15790, + -4756, -15678, -5139, -15557, -5519, -15426, -5896, -15286, + -6270, -15136, -6639, -14978, -7005, -14811, -7366, -14634, + -7723, -14449, -8075, -14255, -8423, -14053, -8765, -13842, + -9102, -13622, -9434, -13395, -9760, -13159, -10080, -12916, + -10394, -12665, -10701, -12406, -11002, -12139, -11297, -11866, + -11585, -11585, -11866, -11297, -12139, -11002, -12406, -10701, + -12665, -10394, -12916, -10080, -13159, -9760, -13395, -9434, + -13622, -9102, -13842, -8765, -14053, -8423, -14255, -8075, + -14449, -7723, -14634, -7366, -14811, -7005, -14978, -6639, + -15136, -6270, -15286, -5896, -15426, -5519, -15557, -5139, + -15678, -4756, -15790, -4370, -15893, -3981, -15985, -3590, + -16069, -3196, -16142, -2801, -16206, -2404, -16260, -2006, + -16305, -1606, -16339, -1205, -16364, -804, -16379, -402, + /* part of table that is scaled by 2 (this save one operation in FFT inner loops) */ + 32767, 0, 32758, -804, 32728, -1608, 32678, -2410, + 32610, -3212, 32520, -4012, 32412, -4808, 32284, -5602, + 32138, -6392, 31970, -7180, 31786, -7962, 31580, -8740, + 31356, -9512, 31114, -10278, 30852, -11038, 30572, -11792, + 30272, -12540, 29956, -13278, 29622, -14010, 29268, -14732, + 28898, -15446, 28510, -16150, 28106, -16846, 27684, -17530, + 27244, -18204, 26790, -18868, 26318, -19520, 25832, -20160, + 25330, -20788, 24812, -21402, 24278, -22004, 23732, -22594, + 23170, -23170, 22594, -23732, 22004, -24278, 21402, -24812, + 20788, -25330, 20160, -25832, 19520, -26318, 18868, -26790, + 18204, -27244, 17530, -27684, 16846, -28106, 16150, -28510, + 15446, -28898, 14732, -29268, 14010, -29622, 13278, -29956, + 12540, -30272, 11792, -30572, 11038, -30852, 10278, -31114, + 9512, -31356, 8740, -31580, 7962, -31786, 7180, -31970, + 6392, -32138, 5602, -32284, 4808, -32412, 4012, -32520, + 3212, -32610, 2410, -32678, 1608, -32728, 804, -32758, + 0, -32768, -804, -32758, -1608, -32728, -2410, -32678, + -3212, -32610, -4012, -32520, -4808, -32412, -5602, -32284, + -6392, -32138, -7180, -31970, -7962, -31786, -8740, -31580, + -9512, -31356, -10278, -31114, -11038, -30852, -11792, -30572, + -12540, -30272, -13278, -29956, -14010, -29622, -14732, -29268, + -15446, -28898, -16150, -28510, -16846, -28106, -17530, -27684, + -18204, -27244, -18868, -26790, -19520, -26318, -20160, -25832, + -20788, -25330, -21402, -24812, -22004, -24278, -22594, -23732, + -23170, -23170, -23732, -22594, -24278, -22004, -24812, -21402, + -25330, -20788, -25832, -20160, -26318, -19520, -26790, -18868, + -27244, -18204, -27684, -17530, -28106, -16846, -28510, -16150, + -28898, -15446, -29268, -14732, -29622, -14010, -29956, -13278, + -30272, -12540, -30572, -11792, -30852, -11038, -31114, -10278, + -31356, -9512, -31580, -8740, -31786, -7962, -31970, -7180, + -32138, -6392, -32284, -5602, -32412, -4808, -32520, -4012, + -32610, -3212, -32678, -2410, -32728, -1608, -32758, -804 +}; + +const Word16 FFT_W256[( 256 * 2 ) * 2] = { // Q15 + /* Each adjacent pair represents the real and imaginary part of a complex number: */ + /* W = exp{-j*(PI*n/256)} = cos(PI*n/256)*16384 -j*sin(PI*n/256)*16384 for n=0, 1, ..., 255. */ + 16384, 0, 16383, -201, 16379, -402, 16373, -603, + 16364, -804, 16353, -1005, 16340, -1205, 16324, -1406, + 16305, -1606, 16284, -1806, 16261, -2006, 16235, -2205, + 16207, -2404, 16176, -2603, 16143, -2801, 16107, -2999, + 16069, -3196, 16029, -3393, 15986, -3590, 15941, -3786, + 15893, -3981, 15843, -4176, 15791, -4370, 15736, -4563, + 15679, -4756, 15619, -4948, 15557, -5139, 15493, -5330, + 15426, -5520, 15357, -5708, 15286, -5897, 15213, -6084, + 15137, -6270, 15059, -6455, 14978, -6639, 14896, -6823, + 14811, -7005, 14724, -7186, 14635, -7366, 14543, -7545, + 14449, -7723, 14354, -7900, 14256, -8076, 14155, -8250, + 14053, -8423, 13949, -8595, 13842, -8765, 13733, -8935, + 13623, -9102, 13510, -9269, 13395, -9434, 13279, -9598, + 13160, -9760, 13039, -9921, 12916, -10080, 12792, -10238, + 12665, -10394, 12537, -10549, 12406, -10702, 12274, -10853, + 12140, -11003, 12004, -11151, 11866, -11297, 11727, -11442, + 11585, -11585, 11442, -11727, 11297, -11866, 11151, -12004, + 11003, -12140, 10853, -12274, 10702, -12406, 10549, -12537, + 10394, -12665, 10238, -12792, 10080, -12916, 9921, -13039, + 9760, -13160, 9598, -13279, 9434, -13395, 9269, -13510, + 9102, -13623, 8935, -13733, 8765, -13842, 8595, -13949, + 8423, -14053, 8250, -14155, 8076, -14256, 7900, -14354, + 7723, -14449, 7545, -14543, 7366, -14635, 7186, -14724, + 7005, -14811, 6823, -14896, 6639, -14978, 6455, -15059, + 6270, -15137, 6084, -15213, 5897, -15286, 5708, -15357, + 5520, -15426, 5330, -15493, 5139, -15557, 4948, -15619, + 4756, -15679, 4563, -15736, 4370, -15791, 4176, -15843, + 3981, -15893, 3786, -15941, 3590, -15986, 3393, -16029, + 3196, -16069, 2999, -16107, 2801, -16143, 2603, -16176, + 2404, -16207, 2205, -16235, 2006, -16261, 1806, -16284, + 1606, -16305, 1406, -16324, 1205, -16340, 1005, -16353, + 804, -16364, 603, -16373, 402, -16379, 201, -16383, + 0, -16384, -201, -16383, -402, -16379, -603, -16373, + -804, -16364, -1005, -16353, -1205, -16340, -1406, -16324, + -1606, -16305, -1806, -16284, -2006, -16261, -2205, -16235, + -2404, -16207, -2603, -16176, -2801, -16143, -2999, -16107, + -3196, -16069, -3393, -16029, -3590, -15986, -3786, -15941, + -3981, -15893, -4176, -15843, -4370, -15791, -4563, -15736, + -4756, -15679, -4948, -15619, -5139, -15557, -5330, -15493, + -5520, -15426, -5708, -15357, -5897, -15286, -6084, -15213, + -6270, -15137, -6455, -15059, -6639, -14978, -6823, -14896, + -7005, -14811, -7186, -14724, -7366, -14635, -7545, -14543, + -7723, -14449, -7900, -14354, -8076, -14256, -8250, -14155, + -8423, -14053, -8595, -13949, -8765, -13842, -8935, -13733, + -9102, -13623, -9269, -13510, -9434, -13395, -9598, -13279, + -9760, -13160, -9921, -13039, -10080, -12916, -10238, -12792, + -10394, -12665, -10549, -12537, -10702, -12406, -10853, -12274, + -11003, -12140, -11151, -12004, -11297, -11866, -11442, -11727, + -11585, -11585, -11727, -11442, -11866, -11297, -12004, -11151, + -12140, -11003, -12274, -10853, -12406, -10702, -12537, -10549, + -12665, -10394, -12792, -10238, -12916, -10080, -13039, -9921, + -13160, -9760, -13279, -9598, -13395, -9434, -13510, -9269, + -13623, -9102, -13733, -8935, -13842, -8765, -13949, -8595, + -14053, -8423, -14155, -8250, -14256, -8076, -14354, -7900, + -14449, -7723, -14543, -7545, -14635, -7366, -14724, -7186, + -14811, -7005, -14896, -6823, -14978, -6639, -15059, -6455, + -15137, -6270, -15213, -6084, -15286, -5897, -15357, -5708, + -15426, -5520, -15493, -5330, -15557, -5139, -15619, -4948, + -15679, -4756, -15736, -4563, -15791, -4370, -15843, -4176, + -15893, -3981, -15941, -3786, -15986, -3590, -16029, -3393, + -16069, -3196, -16107, -2999, -16143, -2801, -16176, -2603, + -16207, -2404, -16235, -2205, -16261, -2006, -16284, -1806, + -16305, -1606, -16324, -1406, -16340, -1205, -16353, -1005, + -16364, -804, -16373, -603, -16379, -402, -16383, -201, + + /* The following is a duplication of the above but scaled up by a factor of 2. + * This save one operation in inverse FFT inner loops */ + 32767, 0, 32766, -402, 32758, -804, 32746, -1206, + 32729, -1608, 32706, -2009, 32679, -2411, 32647, -2811, + 32610, -3212, 32568, -3612, 32522, -4011, 32470, -4410, + 32413, -4808, 32352, -5205, 32286, -5602, 32214, -5998, + 32138, -6393, 32058, -6787, 31972, -7180, 31881, -7571, + 31786, -7962, 31686, -8351, 31581, -8740, 31471, -9127, + 31357, -9512, 31238, -9896, 31114, -10279, 30986, -10660, + 30853, -11039, 30715, -11417, 30572, -11793, 30425, -12167, + 30274, -12540, 30118, -12910, 29957, -13279, 29792, -13646, + 29622, -14010, 29448, -14373, 29269, -14733, 29086, -15091, + 28899, -15447, 28707, -15800, 28511, -16151, 28311, -16500, + 28106, -16846, 27897, -17190, 27684, -17531, 27467, -17869, + 27246, -18205, 27020, -18538, 26791, -18868, 26557, -19195, + 26320, -19520, 26078, -19841, 25833, -20160, 25583, -20475, + 25330, -20788, 25073, -21097, 24812, -21403, 24548, -21706, + 24279, -22006, 24008, -22302, 23732, -22595, 23453, -22884, + 23170, -23170, 22884, -23453, 22595, -23732, 22302, -24008, + 22006, -24279, 21706, -24548, 21403, -24812, 21097, -25073, + 20788, -25330, 20475, -25583, 20160, -25833, 19841, -26078, + 19520, -26320, 19195, -26557, 18868, -26791, 18538, -27020, + 18205, -27246, 17869, -27467, 17531, -27684, 17190, -27897, + 16846, -28106, 16500, -28311, 16151, -28511, 15800, -28707, + 15447, -28899, 15091, -29086, 14733, -29269, 14373, -29448, + 14010, -29622, 13646, -29792, 13279, -29957, 12910, -30118, + 12540, -30274, 12167, -30425, 11793, -30572, 11417, -30715, + 11039, -30853, 10660, -30986, 10279, -31114, 9896, -31238, + 9512, -31357, 9127, -31471, 8740, -31581, 8351, -31686, + 7962, -31786, 7571, -31881, 7180, -31972, 6787, -32058, + 6393, -32138, 5998, -32214, 5602, -32286, 5205, -32352, + 4808, -32413, 4410, -32470, 4011, -32522, 3612, -32568, + 3212, -32610, 2811, -32647, 2411, -32679, 2009, -32706, + 1608, -32729, 1206, -32746, 804, -32758, 402, -32766, + 0, -32768, -402, -32766, -804, -32758, -1206, -32746, + -1608, -32729, -2009, -32706, -2411, -32679, -2811, -32647, + -3212, -32610, -3612, -32568, -4011, -32522, -4410, -32470, + -4808, -32413, -5205, -32352, -5602, -32286, -5998, -32214, + -6393, -32138, -6787, -32058, -7180, -31972, -7571, -31881, + -7962, -31786, -8351, -31686, -8740, -31581, -9127, -31471, + -9512, -31357, -9896, -31238, -10279, -31114, -10660, -30986, + -11039, -30853, -11417, -30715, -11793, -30572, -12167, -30425, + -12540, -30274, -12910, -30118, -13279, -29957, -13646, -29792, + -14010, -29622, -14373, -29448, -14733, -29269, -15091, -29086, + -15447, -28899, -15800, -28707, -16151, -28511, -16500, -28311, + -16846, -28106, -17190, -27897, -17531, -27684, -17869, -27467, + -18205, -27246, -18538, -27020, -18868, -26791, -19195, -26557, + -19520, -26320, -19841, -26078, -20160, -25833, -20475, -25583, + -20788, -25330, -21097, -25073, -21403, -24812, -21706, -24548, + -22006, -24279, -22302, -24008, -22595, -23732, -22884, -23453, + -23170, -23170, -23453, -22884, -23732, -22595, -24008, -22302, + -24279, -22006, -24548, -21706, -24812, -21403, -25073, -21097, + -25330, -20788, -25583, -20475, -25833, -20160, -26078, -19841, + -26320, -19520, -26557, -19195, -26791, -18868, -27020, -18538, + -27246, -18205, -27467, -17869, -27684, -17531, -27897, -17190, + -28106, -16846, -28311, -16500, -28511, -16151, -28707, -15800, + -28899, -15447, -29086, -15091, -29269, -14733, -29448, -14373, + -29622, -14010, -29792, -13646, -29957, -13279, -30118, -12910, + -30274, -12540, -30425, -12167, -30572, -11793, -30715, -11417, + -30853, -11039, -30986, -10660, -31114, -10279, -31238, -9896, + -31357, -9512, -31471, -9127, -31581, -8740, -31686, -8351, + -31786, -7962, -31881, -7571, -31972, -7180, -32058, -6787, + -32138, -6393, -32214, -5998, -32286, -5602, -32352, -5205, + -32413, -4808, -32470, -4410, -32522, -4011, -32568, -3612, + -32610, -3212, -32647, -2811, -32679, -2411, -32706, -2009, + -32729, -1608, -32746, -1206, -32758, -804, -32766, -402 +}; + +const Word16 FFT_W512[( 512 * 2 ) * 2] = { // Q15 + 16384, 0, 16384, -101, 16383, -201, 16381, -302, + 16379, -402, 16376, -503, 16373, -603, 16369, -704, + 16364, -804, 16359, -904, 16353, -1005, 16347, -1105, + 16340, -1205, 16332, -1306, 16324, -1406, 16315, -1506, + 16305, -1606, 16295, -1706, 16284, -1806, 16273, -1906, + 16261, -2006, 16248, -2105, 16235, -2205, 16221, -2305, + 16207, -2404, 16192, -2503, 16176, -2603, 16160, -2702, + 16143, -2801, 16125, -2900, 16107, -2999, 16088, -3098, + 16069, -3196, 16049, -3295, 16029, -3393, 16008, -3492, + 15986, -3590, 15964, -3688, 15941, -3786, 15917, -3883, + 15893, -3981, 15868, -4078, 15843, -4176, 15817, -4273, + 15791, -4370, 15763, -4467, 15736, -4563, 15707, -4660, + 15679, -4756, 15649, -4852, 15619, -4948, 15588, -5044, + 15557, -5139, 15525, -5235, 15493, -5330, 15460, -5425, + 15426, -5520, 15392, -5614, 15357, -5708, 15322, -5803, + 15286, -5897, 15250, -5990, 15213, -6084, 15175, -6177, + 15137, -6270, 15098, -6363, 15059, -6455, 15019, -6547, + 14978, -6639, 14937, -6731, 14896, -6823, 14854, -6914, + 14811, -7005, 14768, -7096, 14724, -7186, 14680, -7276, + 14635, -7366, 14589, -7456, 14543, -7545, 14497, -7635, + 14449, -7723, 14402, -7812, 14354, -7900, 14305, -7988, + 14256, -8076, 14206, -8163, 14155, -8250, 14104, -8337, + 14053, -8423, 14001, -8509, 13949, -8595, 13896, -8680, + 13842, -8765, 13788, -8850, 13733, -8935, 13678, -9019, + 13623, -9102, 13567, -9186, 13510, -9269, 13453, -9352, + 13395, -9434, 13337, -9516, 13279, -9598, 13219, -9679, + 13160, -9760, 13100, -9841, 13039, -9921, 12978, -10001, + 12916, -10080, 12854, -10159, 12792, -10238, 12729, -10316, + 12665, -10394, 12601, -10471, 12537, -10549, 12472, -10625, + 12406, -10702, 12340, -10778, 12274, -10853, 12207, -10928, + 12140, -11003, 12072, -11077, 12004, -11151, 11935, -11224, + 11866, -11297, 11797, -11370, 11727, -11442, 11656, -11514, + 11585, -11585, 11514, -11656, 11442, -11727, 11370, -11797, + 11297, -11866, 11224, -11935, 11151, -12004, 11077, -12072, + 11003, -12140, 10928, -12207, 10853, -12274, 10778, -12340, + 10702, -12406, 10625, -12472, 10549, -12537, 10471, -12601, + 10394, -12665, 10316, -12729, 10238, -12792, 10159, -12854, + 10080, -12916, 10001, -12978, 9921, -13039, 9841, -13100, + 9760, -13160, 9679, -13219, 9598, -13279, 9516, -13337, + 9434, -13395, 9352, -13453, 9269, -13510, 9186, -13567, + 9102, -13623, 9019, -13678, 8935, -13733, 8850, -13788, + 8765, -13842, 8680, -13896, 8595, -13949, 8509, -14001, + 8423, -14053, 8337, -14104, 8250, -14155, 8163, -14206, + 8076, -14256, 7988, -14305, 7900, -14354, 7812, -14402, + 7723, -14449, 7635, -14497, 7545, -14543, 7456, -14589, + 7366, -14635, 7276, -14680, 7186, -14724, 7096, -14768, + 7005, -14811, 6914, -14854, 6823, -14896, 6731, -14937, + 6639, -14978, 6547, -15019, 6455, -15059, 6363, -15098, + 6270, -15137, 6177, -15175, 6084, -15213, 5990, -15250, + 5897, -15286, 5803, -15322, 5708, -15357, 5614, -15392, + 5520, -15426, 5425, -15460, 5330, -15493, 5235, -15525, + 5139, -15557, 5044, -15588, 4948, -15619, 4852, -15649, + 4756, -15679, 4660, -15707, 4563, -15736, 4467, -15763, + 4370, -15791, 4273, -15817, 4176, -15843, 4078, -15868, + 3981, -15893, 3883, -15917, 3786, -15941, 3688, -15964, + 3590, -15986, 3492, -16008, 3393, -16029, 3295, -16049, + 3196, -16069, 3098, -16088, 2999, -16107, 2900, -16125, + 2801, -16143, 2702, -16160, 2603, -16176, 2503, -16192, + 2404, -16207, 2305, -16221, 2205, -16235, 2105, -16248, + 2006, -16261, 1906, -16273, 1806, -16284, 1706, -16295, + 1606, -16305, 1506, -16315, 1406, -16324, 1306, -16332, + 1205, -16340, 1105, -16347, 1005, -16353, 904, -16359, + 804, -16364, 703, -16369, 603, -16373, 503, -16376, + 402, -16379, 302, -16381, 201, -16383, 101, -16384, + 0, -16384, -101, -16384, -201, -16383, -302, -16381, + -402, -16379, -503, -16376, -603, -16373, -704, -16369, + -804, -16364, -904, -16359, -1005, -16353, -1105, -16347, + -1205, -16340, -1306, -16332, -1406, -16324, -1506, -16315, + -1606, -16305, -1706, -16295, -1806, -16284, -1906, -16273, + -2006, -16261, -2105, -16248, -2205, -16235, -2305, -16221, + -2404, -16207, -2503, -16192, -2603, -16176, -2702, -16160, + -2801, -16143, -2900, -16125, -2999, -16107, -3098, -16088, + -3196, -16069, -3295, -16049, -3393, -16029, -3492, -16008, + -3590, -15986, -3688, -15964, -3786, -15941, -3883, -15917, + -3981, -15893, -4078, -15868, -4176, -15843, -4273, -15817, + -4370, -15791, -4467, -15763, -4563, -15736, -4660, -15707, + -4756, -15679, -4852, -15649, -4948, -15619, -5044, -15588, + -5139, -15557, -5235, -15525, -5330, -15493, -5425, -15460, + -5520, -15426, -5614, -15392, -5708, -15357, -5803, -15322, + -5897, -15286, -5990, -15250, -6084, -15213, -6177, -15175, + -6270, -15137, -6363, -15098, -6455, -15059, -6547, -15019, + -6639, -14978, -6731, -14937, -6823, -14896, -6914, -14854, + -7005, -14811, -7096, -14768, -7186, -14724, -7276, -14680, + -7366, -14635, -7456, -14589, -7545, -14543, -7635, -14497, + -7723, -14449, -7812, -14402, -7900, -14354, -7988, -14305, + -8076, -14256, -8163, -14206, -8250, -14155, -8337, -14104, + -8423, -14053, -8509, -14001, -8595, -13949, -8680, -13896, + -8765, -13842, -8850, -13788, -8935, -13733, -9019, -13678, + -9102, -13623, -9186, -13567, -9269, -13510, -9352, -13453, + -9434, -13395, -9516, -13337, -9598, -13279, -9679, -13219, + -9760, -13160, -9841, -13100, -9921, -13039, -10001, -12978, + -10080, -12916, -10159, -12854, -10238, -12792, -10316, -12729, + -10394, -12665, -10471, -12601, -10549, -12537, -10625, -12472, + -10702, -12406, -10778, -12340, -10853, -12274, -10928, -12207, + -11003, -12140, -11077, -12072, -11151, -12004, -11224, -11935, + -11297, -11866, -11370, -11797, -11442, -11727, -11514, -11656, + -11585, -11585, -11656, -11514, -11727, -11442, -11797, -11370, + -11866, -11297, -11935, -11224, -12004, -11151, -12072, -11077, + -12140, -11003, -12207, -10928, -12274, -10853, -12340, -10778, + -12406, -10702, -12472, -10625, -12537, -10549, -12601, -10471, + -12665, -10394, -12729, -10316, -12792, -10238, -12854, -10159, + -12916, -10080, -12978, -10001, -13039, -9921, -13100, -9840, + -13160, -9760, -13219, -9679, -13279, -9598, -13337, -9516, + -13395, -9434, -13453, -9352, -13510, -9269, -13567, -9186, + -13623, -9102, -13678, -9019, -13733, -8935, -13788, -8850, + -13842, -8765, -13896, -8680, -13949, -8595, -14001, -8509, + -14053, -8423, -14104, -8337, -14155, -8250, -14206, -8163, + -14256, -8076, -14305, -7988, -14354, -7900, -14402, -7812, + -14449, -7723, -14497, -7635, -14543, -7545, -14589, -7456, + -14635, -7366, -14680, -7276, -14724, -7186, -14768, -7096, + -14811, -7005, -14854, -6914, -14896, -6823, -14937, -6731, + -14978, -6639, -15019, -6547, -15059, -6455, -15098, -6363, + -15137, -6270, -15175, -6177, -15213, -6084, -15250, -5990, + -15286, -5897, -15322, -5803, -15357, -5708, -15392, -5614, + -15426, -5520, -15460, -5425, -15493, -5330, -15525, -5235, + -15557, -5139, -15588, -5044, -15619, -4948, -15649, -4852, + -15679, -4756, -15707, -4660, -15736, -4563, -15763, -4467, + -15791, -4370, -15817, -4273, -15843, -4176, -15868, -4078, + -15893, -3981, -15917, -3883, -15941, -3786, -15964, -3688, + -15986, -3590, -16008, -3492, -16029, -3393, -16049, -3295, + -16069, -3196, -16088, -3098, -16107, -2999, -16125, -2900, + -16143, -2801, -16160, -2702, -16176, -2603, -16192, -2503, + -16207, -2404, -16221, -2305, -16235, -2205, -16248, -2105, + -16261, -2006, -16273, -1906, -16284, -1806, -16295, -1706, + -16305, -1606, -16315, -1506, -16324, -1406, -16332, -1306, + -16340, -1205, -16347, -1105, -16353, -1005, -16359, -904, + -16364, -804, -16369, -703, -16373, -603, -16376, -503, + -16379, -402, -16381, -302, -16383, -201, -16384, -101, + /* The following is a duplication of the above but scaled up by a factor of 2. + * This save one operation in inverse FFT inner loops */ + 32767, 0, 32767, -201, 32766, -402, 32762, -603, + 32758, -804, 32753, -1005, 32746, -1206, 32738, -1407, + 32729, -1608, 32718, -1809, 32706, -2009, 32693, -2210, + 32679, -2411, 32664, -2611, 32647, -2811, 32629, -3012, + 32610, -3212, 32590, -3412, 32568, -3612, 32546, -3812, + 32522, -4011, 32496, -4211, 32470, -4410, 32442, -4609, + 32413, -4808, 32383, -5007, 32352, -5205, 32319, -5404, + 32286, -5602, 32251, -5800, 32214, -5998, 32177, -6195, + 32138, -6393, 32099, -6590, 32058, -6787, 32015, -6983, + 31972, -7180, 31927, -7376, 31881, -7571, 31834, -7767, + 31786, -7962, 31737, -8157, 31686, -8351, 31634, -8546, + 31581, -8740, 31527, -8933, 31471, -9127, 31415, -9319, + 31357, -9512, 31298, -9704, 31238, -9896, 31177, -10088, + 31114, -10279, 31050, -10469, 30986, -10660, 30920, -10850, + 30853, -11039, 30784, -11228, 30715, -11417, 30644, -11605, + 30572, -11793, 30499, -11980, 30425, -12167, 30350, -12354, + 30274, -12540, 30196, -12725, 30118, -12910, 30038, -13095, + 29957, -13279, 29875, -13463, 29792, -13646, 29707, -13828, + 29622, -14010, 29535, -14192, 29448, -14373, 29359, -14553, + 29269, -14733, 29178, -14912, 29086, -15091, 28993, -15269, + 28899, -15447, 28803, -15624, 28707, -15800, 28610, -15976, + 28511, -16151, 28411, -16326, 28311, -16500, 28209, -16673, + 28106, -16846, 28002, -17018, 27897, -17190, 27791, -17361, + 27684, -17531, 27576, -17700, 27467, -17869, 27357, -18037, + 27246, -18205, 27133, -18372, 27020, -18538, 26906, -18703, + 26791, -18868, 26674, -19032, 26557, -19195, 26439, -19358, + 26320, -19520, 26199, -19681, 26078, -19841, 25956, -20001, + 25833, -20160, 25708, -20318, 25583, -20475, 25457, -20632, + 25330, -20788, 25202, -20943, 25073, -21097, 24943, -21251, + 24812, -21403, 24680, -21555, 24548, -21706, 24414, -21856, + 24279, -22006, 24144, -22154, 24008, -22302, 23870, -22449, + 23732, -22595, 23593, -22740, 23453, -22884, 23312, -23028, + 23170, -23170, 23028, -23312, 22884, -23453, 22740, -23593, + 22595, -23732, 22449, -23870, 22302, -24008, 22154, -24144, + 22006, -24279, 21856, -24414, 21706, -24548, 21555, -24680, + 21403, -24812, 21251, -24943, 21097, -25073, 20943, -25202, + 20788, -25330, 20632, -25457, 20475, -25583, 20318, -25708, + 20160, -25833, 20001, -25956, 19841, -26078, 19681, -26199, + 19520, -26320, 19358, -26439, 19195, -26557, 19032, -26674, + 18868, -26791, 18703, -26906, 18538, -27020, 18372, -27133, + 18205, -27246, 18037, -27357, 17869, -27467, 17700, -27576, + 17531, -27684, 17361, -27791, 17190, -27897, 17018, -28002, + 16846, -28106, 16673, -28209, 16500, -28311, 16326, -28411, + 16151, -28511, 15976, -28610, 15800, -28707, 15624, -28803, + 15447, -28899, 15269, -28993, 15091, -29086, 14912, -29178, + 14733, -29269, 14553, -29359, 14373, -29448, 14192, -29535, + 14010, -29622, 13828, -29707, 13646, -29792, 13463, -29875, + 13279, -29957, 13095, -30038, 12910, -30118, 12725, -30196, + 12540, -30274, 12354, -30350, 12167, -30425, 11980, -30499, + 11793, -30572, 11605, -30644, 11417, -30715, 11228, -30784, + 11039, -30853, 10850, -30920, 10660, -30986, 10469, -31050, + 10279, -31114, 10088, -31177, 9896, -31238, 9704, -31298, + 9512, -31357, 9319, -31415, 9127, -31471, 8933, -31527, + 8740, -31581, 8546, -31634, 8351, -31686, 8157, -31737, + 7962, -31786, 7767, -31834, 7571, -31881, 7376, -31927, + 7180, -31972, 6983, -32015, 6787, -32058, 6590, -32099, + 6393, -32138, 6195, -32177, 5998, -32214, 5800, -32251, + 5602, -32286, 5404, -32319, 5205, -32352, 5007, -32383, + 4808, -32413, 4609, -32442, 4410, -32470, 4211, -32496, + 4011, -32522, 3812, -32546, 3612, -32568, 3412, -32590, + 3212, -32610, 3012, -32629, 2811, -32647, 2611, -32664, + 2411, -32679, 2210, -32693, 2009, -32706, 1809, -32718, + 1608, -32729, 1407, -32738, 1206, -32746, 1005, -32753, + 804, -32758, 603, -32762, 402, -32766, 201, -32767, + 0, -32768, -201, -32767, -402, -32766, -603, -32762, + -804, -32758, -1005, -32753, -1206, -32746, -1407, -32738, + -1608, -32729, -1809, -32718, -2009, -32706, -2210, -32693, + -2411, -32679, -2611, -32664, -2811, -32647, -3012, -32629, + -3212, -32610, -3412, -32590, -3612, -32568, -3812, -32546, + -4011, -32522, -4211, -32496, -4410, -32470, -4609, -32442, + -4808, -32413, -5007, -32383, -5205, -32352, -5404, -32319, + -5602, -32286, -5800, -32251, -5998, -32214, -6195, -32177, + -6393, -32138, -6590, -32099, -6787, -32058, -6983, -32015, + -7180, -31972, -7376, -31927, -7571, -31881, -7767, -31834, + -7962, -31786, -8157, -31737, -8351, -31686, -8546, -31634, + -8740, -31581, -8933, -31527, -9127, -31471, -9319, -31415, + -9512, -31357, -9704, -31298, -9896, -31238, -10088, -31177, + -10279, -31114, -10469, -31050, -10660, -30986, -10850, -30920, + -11039, -30853, -11228, -30784, -11417, -30715, -11605, -30644, + -11793, -30572, -11980, -30499, -12167, -30425, -12354, -30350, + -12540, -30274, -12725, -30196, -12910, -30118, -13095, -30038, + -13279, -29957, -13463, -29875, -13646, -29792, -13828, -29707, + -14010, -29622, -14192, -29535, -14373, -29448, -14553, -29359, + -14733, -29269, -14912, -29178, -15091, -29086, -15269, -28993, + -15447, -28899, -15624, -28803, -15800, -28707, -15976, -28610, + -16151, -28511, -16326, -28411, -16500, -28311, -16673, -28209, + -16846, -28106, -17018, -28002, -17190, -27897, -17361, -27791, + -17531, -27684, -17700, -27576, -17869, -27467, -18037, -27357, + -18205, -27246, -18372, -27133, -18538, -27020, -18703, -26906, + -18868, -26791, -19032, -26674, -19195, -26557, -19358, -26439, + -19520, -26320, -19681, -26199, -19841, -26078, -20001, -25956, + -20160, -25833, -20318, -25708, -20475, -25583, -20632, -25457, + -20788, -25330, -20943, -25202, -21097, -25073, -21251, -24943, + -21403, -24812, -21555, -24680, -21706, -24548, -21856, -24414, + -22006, -24279, -22154, -24144, -22302, -24008, -22449, -23870, + -22595, -23732, -22740, -23593, -22884, -23453, -23028, -23312, + -23170, -23170, -23312, -23028, -23453, -22884, -23593, -22740, + -23732, -22595, -23870, -22449, -24008, -22302, -24144, -22154, + -24279, -22006, -24414, -21856, -24548, -21706, -24680, -21555, + -24812, -21403, -24943, -21251, -25073, -21097, -25202, -20943, + -25330, -20788, -25457, -20632, -25583, -20475, -25708, -20318, + -25833, -20160, -25956, -20001, -26078, -19841, -26199, -19681, + -26320, -19520, -26439, -19358, -26557, -19195, -26674, -19032, + -26791, -18868, -26906, -18703, -27020, -18538, -27133, -18372, + -27246, -18205, -27357, -18037, -27467, -17869, -27576, -17700, + -27684, -17531, -27791, -17361, -27897, -17190, -28002, -17018, + -28106, -16846, -28209, -16673, -28311, -16500, -28411, -16326, + -28511, -16151, -28610, -15976, -28707, -15800, -28803, -15624, + -28899, -15447, -28993, -15269, -29086, -15091, -29178, -14912, + -29269, -14733, -29359, -14553, -29448, -14373, -29535, -14192, + -29622, -14010, -29707, -13828, -29792, -13646, -29875, -13463, + -29957, -13279, -30038, -13095, -30118, -12910, -30196, -12725, + -30274, -12540, -30350, -12354, -30425, -12167, -30499, -11980, + -30572, -11793, -30644, -11605, -30715, -11417, -30784, -11228, + -30853, -11039, -30920, -10850, -30986, -10660, -31050, -10469, + -31114, -10279, -31177, -10088, -31238, -9896, -31298, -9704, + -31357, -9512, -31415, -9319, -31471, -9127, -31527, -8933, + -31581, -8740, -31634, -8546, -31686, -8351, -31737, -8157, + -31786, -7962, -31834, -7767, -31881, -7571, -31927, -7376, + -31972, -7180, -32015, -6983, -32058, -6787, -32099, -6590, + -32138, -6393, -32177, -6195, -32214, -5998, -32251, -5800, + -32286, -5602, -32319, -5404, -32352, -5205, -32383, -5007, + -32413, -4808, -32442, -4609, -32470, -4410, -32496, -4211, + -32522, -4011, -32546, -3812, -32568, -3612, -32590, -3412, + -32610, -3212, -32629, -3012, -32647, -2811, -32664, -2611, + -32679, -2411, -32693, -2210, -32706, -2009, -32718, -1809, + -32729, -1608, -32738, -1407, -32746, -1206, -32753, -1005, + -32758, -804, -32762, -603, -32766, -402, -32767, -201 +}; + +const Word16 FFT_REORDER_1024[512] = { + 0, 512, 256, 768, 128, 640, 384, 896, + 64, 576, 320, 832, 192, 704, 448, 960, + 32, 544, 288, 800, 160, 672, 416, 928, + 96, 608, 352, 864, 224, 736, 480, 992, + 16, 528, 272, 784, 144, 656, 400, 912, + 80, 592, 336, 848, 208, 720, 464, 976, + 48, 560, 304, 816, 176, 688, 432, 944, + 112, 624, 368, 880, 240, 752, 496, 1008, + 8, 520, 264, 776, 136, 648, 392, 904, + 72, 584, 328, 840, 200, 712, 456, 968, + 40, 552, 296, 808, 168, 680, 424, 936, + 104, 616, 360, 872, 232, 744, 488, 1000, + 24, 536, 280, 792, 152, 664, 408, 920, + 88, 600, 344, 856, 216, 728, 472, 984, + 56, 568, 312, 824, 184, 696, 440, 952, + 120, 632, 376, 888, 248, 760, 504, 1016, + 4, 516, 260, 772, 132, 644, 388, 900, + 68, 580, 324, 836, 196, 708, 452, 964, + 36, 548, 292, 804, 164, 676, 420, 932, + 100, 612, 356, 868, 228, 740, 484, 996, + 20, 532, 276, 788, 148, 660, 404, 916, + 84, 596, 340, 852, 212, 724, 468, 980, + 52, 564, 308, 820, 180, 692, 436, 948, + 116, 628, 372, 884, 244, 756, 500, 1012, + 12, 524, 268, 780, 140, 652, 396, 908, + 76, 588, 332, 844, 204, 716, 460, 972, + 44, 556, 300, 812, 172, 684, 428, 940, + 108, 620, 364, 876, 236, 748, 492, 1004, + 28, 540, 284, 796, 156, 668, 412, 924, + 92, 604, 348, 860, 220, 732, 476, 988, + 60, 572, 316, 828, 188, 700, 444, 956, + 124, 636, 380, 892, 252, 764, 508, 1020, + 2, 514, 258, 770, 130, 642, 386, 898, + 66, 578, 322, 834, 194, 706, 450, 962, + 34, 546, 290, 802, 162, 674, 418, 930, + 98, 610, 354, 866, 226, 738, 482, 994, + 18, 530, 274, 786, 146, 658, 402, 914, + 82, 594, 338, 850, 210, 722, 466, 978, + 50, 562, 306, 818, 178, 690, 434, 946, + 114, 626, 370, 882, 242, 754, 498, 1010, + 10, 522, 266, 778, 138, 650, 394, 906, + 74, 586, 330, 842, 202, 714, 458, 970, + 42, 554, 298, 810, 170, 682, 426, 938, + 106, 618, 362, 874, 234, 746, 490, 1002, + 26, 538, 282, 794, 154, 666, 410, 922, + 90, 602, 346, 858, 218, 730, 474, 986, + 58, 570, 314, 826, 186, 698, 442, 954, + 122, 634, 378, 890, 250, 762, 506, 1018, + 6, 518, 262, 774, 134, 646, 390, 902, + 70, 582, 326, 838, 198, 710, 454, 966, + 38, 550, 294, 806, 166, 678, 422, 934, + 102, 614, 358, 870, 230, 742, 486, 998, + 22, 534, 278, 790, 150, 662, 406, 918, + 86, 598, 342, 854, 214, 726, 470, 982, + 54, 566, 310, 822, 182, 694, 438, 950, + 118, 630, 374, 886, 246, 758, 502, 1014, + 14, 526, 270, 782, 142, 654, 398, 910, + 78, 590, 334, 846, 206, 718, 462, 974, + 46, 558, 302, 814, 174, 686, 430, 942, + 110, 622, 366, 878, 238, 750, 494, 1006, + 30, 542, 286, 798, 158, 670, 414, 926, + 94, 606, 350, 862, 222, 734, 478, 990, + 62, 574, 318, 830, 190, 702, 446, 958, + 126, 638, 382, 894, 254, 766, 510, 1022 +}; + +const Word16 Gamma_19661_Tbl_fx[] = { + 19661, 11797, 7078, 4247, 2548, 1529, 917, 550, 330, 198, 119, 71, 43, 26, 16, 10 +}; /*Q15 */ + +const Word16 Gamma_29491_Tbl[] = { + 29491, 26542, 23888, 21499, 19349, 17414, 15672, 14105, + 12694, 11425, 10282, 9254, 8329, 7496, 6746, 6071 +}; // Q15 + +/*---------------------------------------------------------------------* + * NB post-filter tables + *---------------------------------------------------------------------*/ + +const Word16 tab_hup_s_fx[SIZ_TAB_HUP_S] = { // Q15 + -188, 2873, 31650, -1597, -484, 7041, 28469, -2147, -933, 12266, + 23705, -1992, -1492, 18050, 18050, -1492, -1992, 23705, 12266, -933, + -2147, 28469, 7041, -484, -1597, 31650, 2873, -188 +}; + +const Word16 tab_hup_l_fx[SIZ_TAB_HUP_L] = { // Q15 + -40, 72, -156, 315, -579, 1023, -1874, 4439, + 31915, -3390, 1595, -887, 501, -266, 130, -59, + -77, 147, -317, 631, -1150, 2030, -3773, 9639, + 29436, -5579, 2727, -1527, 859, -453, 218, -101, + -106, 212, -455, 892, -1614, 2850, -5392, 15206, + 25569, -6549, 3303, -1860, 1041, -543, 258, -122, + -123, 253, -538, 1044, -1876, 3319, -6414, 20676, + 20676, -6414, 3319, -1876, 1044, -538, 253, -123, + -122, 258, -543, 1041, -1860, 3303, -6549, 25569, + 15206, -5392, 2850, -1614, 892, -455, 212, -106, + -101, 218, -453, 859, -1527, 2727, -5579, 29436, + 9639, -3773, 2030, -1150, 631, -317, 147, -77, + -59, 130, -266, 501, -887, 1595, -3390, 31915, + 4439, -1874, 1023, -579, 315, -156, 72, -40 +}; + +const Word16 mfreq_loc_Q2fx[] = { 700, 1500, 3100, 4700, 6300, 7900, 9500, 11100, 12700, 14300, 15900, 17500, 19100, 20700, 22300, 25500, 28700, 31900 }; // Q0 +const Word16 mfreq_loc_div_25[] = { 7, 15, 31, 47, 63, 79, 95, 111, 127, 143, 159, 175, 191, 207, 223, 255, 287, 319 }; // Q0 + +// low_rate_band_att_fx.c +/* %* lowered Table ROM, call with band_len_idx[sfm_size>>3] */ +/* % sfms =[ 8, 16, 24, 32, 48, 64, 80, 96 ], */ +/* sfm/8= [ 1 2 3 4 6 8 10 12]; */ +/* % idx= 0 1 2 3 4 5 6 7; */ +/* call with band_len_idx[sfm_size>>3] */ +const Word16 band_len_idx[1 + ( MAX_SFM_LEN_FX / 8 )] = { + // Q0 + /*sfm/8*/ /*1*/ /*2 */ /*3 */ /*4 */ /*6 */ /*8 */ /*10*/ /*12*/ + -1, 0 /*8*/, 1 /*16*/, 2 /*24*/, 3 /*32*/, -1, 4 /*48 */, -1, 5 /*64 */, -1, 6 /*80*/, -1, 7 /*96*/ +}; +const Word16 band_len_ener_shift[8] = { 1, 2, 2, 2, 3, 3, 4 /*sfm==80*/, 4 /*sfm==96*/ }; /* 96 requires 1 bit more than 48 */ // Q0 +/*% sfms=[8,16,24,32,48,64,80,96], round(sqrt(sfms)*2^11) */ +const Word16 fine_gain_pred_sqrt_bw[8] = { 5793, 8192, 10033, 11585, 14189, 16384, 18318, 20066 }; /* (Q11) */ +const Word16 ivas_band_len_idx[1 + ( MAX_SFM_LEN_FX / 8 )] = { + /*sfm/8*/ /*1*/ /*2 */ /*3 */ /*4 */ /*6 */ /*8 */ /*10*/ /*12*/ + -1, 0 /*8*/, 1 /*16*/, 2 /*24*/, 3 /*32*/, 4 /*40*/, 5 /*48 */, -1, 6 /*64 */, -1, 7 /*80*/, -1, 8 /*96*/ +}; // Q0 +const Word16 ivas_band_len_ener_shift[9] = { 1, 2, 2, 2, 3, 3, 3, 4 /*sfm==80*/, 4 /*sfm==96*/ }; // Q0 /* 96 requires 1 bit more than 48 */ +const Word16 ivas_fine_gain_pred_sqrt_bw[9] = { 5793, 8192, 10033, 11585, 12953, 14189, 16384, 18318, 20066 }; /* (Q11) */ +/*% sfms=[8,16,24,32,40,48,64,80,96], round(sqrt(sfms)*2^11) */ +/*----------------------------------------------------------------------------------* + * means of ISFs for WB active speech + *----------------------------------------------------------------------------------*/ +const Word16 Mean_isf_wb[M] = /* G722.2 active speech ISF's means Q2.56*/ + { + 738, 1326, 2336, 3578, 4596, 5662, 6711, 7730, + 8750, 9753, 10705, 11728, 12833, 13971, 15043, 4037 + }; + +const Word16 lsp_shb_prev_tbl_fx[LPC_SHB_ORDER] = { + /*Q15 */ + 0, + 1638, + 3277, + 4915, + 6554, + 8192, + 9830, + 11469, + 13107, + 14746 +}; + +const Word16 lsp_shb_prev_tbl_swb_tbe_enc_fx[LPC_SHB_ORDER] = { + // Q15 + 32767, + 31165, + 26509, + 19262, + 10123, + 0, + -10124, + -19261, + -26509, + -31166, +}; + +const Word16 ivas_lsp_shb_prev_tbl_fx[LPC_SHB_ORDER] = { + /* Q15 */ + 1489, + 2979, + 4468, + 5958, + 7447, + 8937, + 10426, + 11916, + 13405, + 14895 +}; + +/* These words are subtracted from high/low/value with a shift left by 1. */ +/* The value 0x0CCC should never be referenced, low is less/equal high */ +/* The value 0x0BBB should never be referenced, loop must break instead. */ +/* Refer to this table with indices: tab_ari_qnew[msb_high][msb_low] */ +const Word16 tab_ari_qnew[4][4] = { { 0x0000, 0x0CCC, 0x0CCC, 0x0CCC }, + { 0x0000, 0x0000, 0x0CCC, 0x0CCC }, + { 0x0BBB, 0x2000, 0x4000, 0x0CCC }, + { 0x0BBB, 0x0BBB, 0x4000, 0x4000 } }; + +const Word16 phs_tbl_dec[64 * 2] = { // Q15 + /* part of table that is not scaled by 2 */ + 16384, 0, 16305, -1606, 16069, -3196, 15678, -4756, 15136, -6270, + 14449, -7723, 13622, -9102, 12665, -10394, 11585, -11585, 10394, -12665, + 9102, -13622, 7723, -14449, 6270, -15136, 4756, -15678, 3196, -16069, + 1606, -16305, 0, -16384, -1606, -16305, -3196, -16069, -4756, -15678, + -6270, -15136, -7723, -14449, -9102, -13622, -10394, -12665, -11585, -11585, + -12665, -10394, -13622, -9102, -14449, -7723, -15136, -6270, -15678, -4756, + -16069, -3196, -16305, -1606, + /* part of table that is scaled by 2 (this save one operation in FFT inner loops) */ + 32767, 0, 32610, -3212, 32138, -6392, 31356, -9512, 30272, -12540, + 28898, -15446, 27244, -18204, 25330, -20788, 23170, -23170, 20788, -25330, + 18204, -27244, 15446, -28898, 12540, -30272, 9512, -31356, 6392, -32138, + 3212, -32610, 0, -32768, -3212, -32610, -6392, -32138, -9512, -31356, + -12540, -30272, -15446, -28898, -18204, -27244, -20788, -25330, -23170, -23170, + -25330, -20788, -27244, -18204, -28898, -15446, -30272, -12540, -31356, -9512, + -32138, -6392, -32610, -3212 +}; + +/* 2.0 - 6.4 kHz phase dispersion */ +const Word16 Low_H_phasedisp[L_SUBFR] = { // Q15 + 16389, 16381, 16386, 16382, 16382, 16383, 16381, 16384, 16385, 10265, + 10154, 9894, 14052, 16343, -531, 13216, 16373, 15510, 9407, 15949, + 4726, 14593, 10404, 9796, -16336, -1815, -10623, 12647, 14556, -12683, + 11389, 8176, 16382, -14197, 11781, 10379, 7516, 10424, -12472, 16285, + -1200, -13137, 12659, -7446, 15684, -3763, -13418, -5280, 521, -9685, + -16375, -1219, 8436, -13059, -12861, -12775, 0, 3, 0, -2, + -1, -1, -1, 2 +}; + +/* 3.2 - 6.4 kHz phase dispersion */ +const Word16 Mid_H_phasedisp[L_SUBFR] = { // Q15 + 16382, 16382, 16384, 16385, 16386, 16388, 16387, 16383, 16387, 16383, + 16386, 16386, 16386, 16384, 16382, 16388, 14847, 9629, 13249, 14487, + 10995, 643, 13818, 13779, 6468, 8665, 11634, 9781, -14636, -982, + 11746, -722, 16386, -16365, -11422, 16354, 7363, 13148, -11538, -13903, + -15051, -8862, 8812, -16371, -12146, 7661, -9637, -13253, -6922, 4, + -4, -1, -5, 1, 7, 6, -7, -1, 4, -4, + 0, -1, -3, 3 +}; + +// ACcontextMapping_dec_fx.c +const Word16 Tab_esc_nb[4] = { 0 << ( NBITS_CONTEXT + NBITS_RATEQ ), + 1 << ( NBITS_CONTEXT + NBITS_RATEQ ), + 2 << ( NBITS_CONTEXT + NBITS_RATEQ ), + 3 << ( NBITS_CONTEXT + NBITS_RATEQ ) }; // Q0 + +const Word16 pow2tab[15] = { 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; // Q0 +const Word32 pow2[] = { // Q0 + 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576 +}; +// d_gain2p.c +const Word16 Es_pred_qua[8] = { + 1521 /* 5.9422f Q8*/, + 3909 /*15.2711f Q8*/, + 5987 /*23.3857f Q8*/, + 7816 /*30.5310f Q8*/, + 9477 /*37.0190f Q8*/, + 11124 /*43.4539f Q8*/, + 12863 /*50.2442f Q8*/, + 15031 /*58.7164f Q8*/ +}; + +const Word16 Es_pred_qua_2[16] = { + -1280 /*-5.f Q8*/, + 0 /* 0.f Q8*/, + 1280 /* 5.f Q8*/, + 2560 /*10.f Q8*/, + 3840 /*15.f Q8*/, + 5120 /*20.f Q8*/, + 6400 /*25.f Q8*/, + 7680 /*30.f Q8*/, + 8960 /*35.f Q8*/, + 10240 /*40.f Q8*/, + 11520 /*45.f Q8*/, + 12800 /*50.f Q8*/, + 14080 /*55.f Q8*/, + 15360 /*60.f Q8*/, + 16640 /*65.f Q8*/, + 17920 /*70.f Q8*/ +}; +const Word16 T_DIV_L_Frame[] = /*0Q15 * 2^-7 */ + { + 26214 /*160*/ + , + 16384 /*256*/ + , + 13107 /*320*/ + , + 8738 /*480*/ + , + 8192 /*512*/ + , + 6553 /*640*/ + }; + +/* order 8 LPF for nelp frames when non-native sampling freq inputs used with -max_band NB */ +/* used to suppress frequencies above 4kHz present at the output of filters in pre_proc() */ + +const Word16 num_nelp_lp_fx[NELP_LP_ORDER + 1] = /*Q13*/ + { + 727, + 3506, + 8988, + 15029, + 17732, + 15022, + 8979, + 3501, + 726 + }; + +const Word16 den_nelp_lp_fx[NELP_LP_ORDER + 1] = { // Q13 + 8192, + 8819, + 21618, + 12167, + 15902, + 3553, + 3998, + -120, + 353 +}; + +/*----------------------------------------------------------------------------------* + * AMR-WB IO WB BWE - band-pass 6-8kHz FIR filter, values in Q15: + *----------------------------------------------------------------------------------*/ +const Word16 fir_6k_8k_fx[31] = { // Q15 + 44, -155, 323, -482, 563, -590, 726, -1180, 1986, -2818, 3028, + -1991, -423, 3583, -6281, 7342, -6281, 3583, -423, -1991, 3028, + -2818, 1986, -1180, 726, -590, 563, -482, 323, -155, 44 +}; + +const Word16 pwf78_fx[17] = { 25559, 19936, 15550, 12129, 9460, 7379, 5755, 4489, + 3501, 2731, 2130, 1661, 1296, 1011, 788, 615, + 479 }; /* 0.78^i (i=1,...,17), Q15 */ + +/*------------------------------------------------------------------------------* + * lag window for windowing the autocorrelations in LP analysis + * Used in lib_enc\analy_lp_fx.c + *------------------------------------------------------------------------------*/ +const Word16 hamcos_window_fx[L_LP_AMR_WB] = { // Q15 + 2621, 2622, 2626, 2632, 2640, 2650, 2662, 2677, + 2694, 2714, 2735, 2759, 2785, 2814, 2844, 2877, + 2912, 2949, 2989, 3031, 3075, 3121, 3169, 3220, + 3273, 3328, 3385, 3444, 3506, 3569, 3635, 3703, + 3773, 3845, 3919, 3996, 4074, 4155, 4237, 4321, + 4408, 4496, 4587, 4680, 4774, 4870, 4969, 5069, + 5171, 5275, 5381, 5489, 5599, 5710, 5824, 5939, + 6056, 6174, 6295, 6417, 6541, 6666, 6793, 6922, + 7052, 7185, 7318, 7453, 7590, 7728, 7868, 8009, + 8152, 8296, 8442, 8589, 8737, 8887, 9038, 9191, + 9344, 9499, 9655, 9813, 9971, 10131, 10292, 10454, + 10617, 10781, 10946, 11113, 11280, 11448, 11617, 11787, + 11958, 12130, 12303, 12476, 12650, 12825, 13001, 13178, + 13355, 13533, 13711, 13890, 14070, 14250, 14431, 14612, + 14793, 14975, 15158, 15341, 15524, 15708, 15891, 16076, + 16260, 16445, 16629, 16814, 16999, 17185, 17370, 17555, + 17740, 17926, 18111, 18296, 18481, 18666, 18851, 19036, + 19221, 19405, 19589, 19773, 19956, 20139, 20322, 20504, + 20686, 20867, 21048, 21229, 21408, 21588, 21767, 21945, + 22122, 22299, 22475, 22651, 22825, 22999, 23172, 23344, + 23516, 23686, 23856, 24025, 24192, 24359, 24525, 24689, + 24853, 25016, 25177, 25337, 25496, 25654, 25811, 25967, + 26121, 26274, 26426, 26576, 26725, 26873, 27019, 27164, + 27308, 27450, 27590, 27729, 27867, 28003, 28137, 28270, + 28401, 28531, 28659, 28785, 28910, 29033, 29154, 29274, + 29391, 29507, 29622, 29734, 29845, 29953, 30060, 30165, + 30268, 30370, 30469, 30566, 30662, 30755, 30847, 30936, + 31024, 31109, 31193, 31274, 31354, 31431, 31506, 31579, + 31651, 31719, 31786, 31851, 31914, 31974, 32032, 32088, + 32142, 32194, 32243, 32291, 32336, 32379, 32419, 32458, + 32494, 32528, 32560, 32589, 32617, 32642, 32664, 32685, + 32703, 32719, 32733, 32744, 32753, 32760, 32764, 32767, + 32767, 32765, 32757, 32745, 32727, 32705, 32678, 32646, + 32609, 32567, 32520, 32468, 32411, 32349, 32283, 32211, + 32135, 32054, 31968, 31877, 31781, 31681, 31575, 31465, + 31351, 31231, 31107, 30978, 30844, 30706, 30563, 30415, + 30263, 30106, 29945, 29779, 29609, 29434, 29255, 29071, + 28883, 28691, 28494, 28293, 28087, 27878, 27664, 27446, + 27224, 26997, 26767, 26533, 26294, 26052, 25806, 25555, + 25301, 25043, 24782, 24516, 24247, 23974, 23698, 23418, + 23134, 22847, 22557, 22263, 21965, 21665, 21361, 21054, + 20743, 20430, 20113, 19794, 19471, 19146, 18817, 18486, + 18152, 17815, 17476, 17134, 16789, 16442, 16092, 15740, + 15385, 15028, 14669, 14308, 13944, 13579, 13211, 12841, + 12470, 12096, 11721, 11344, 10965, 10584, 10202, 9819, + 9433, 9047, 8659, 8270, 7879, 7488, 7095, 6701, + 6306, 5910, 5514, 5116, 4718, 4319, 3919, 3519, + 3118, 2716, 2315, 1913, 1510, 1108, 705, 302 +}; + + +const Word16 CNG_burst_att_fx[6][8] = { // Q15 + { 30076, 27793, 25832, 24129, 22637, 21319, 20146, 19095 }, + { 29714, 27181, 25046, 23222, 21646, 20270, 20205, 20205 }, + { 29415, 26685, 24418, 22506, 22410, 22410, 22410, 22410 }, + { 29310, 26512, 24201, 23198, 23198, 23198, 23198, 23198 }, + { 29310, 26512, 24201, 23198, 23198, 23198, 23198, 23198 }, + { 29789, 27307, 25206, 23406, 21845, 20480, 19661, 19661 } +}; + +const Word16 lpc_weights_fx[LPC_SHB_ORDER + 1] = { // Q15 + 32767, 31948, 31150, 30371, 29612, + 28871, 28149, 27446, 26760, 26091, 25438 +}; + +const Word16 SHBCB_SubGain5bit_12_fx[128] = { + /*Q12 */ + -597, + -1952, + -1644, + -1506, + -1767, + -1357, + -1249, + -874, + -4181, + -3836, + -240, + -1985, + -6573, + -1480, + -1229, + -1094, + -381, + -1655, + -2119, + -2406, + -2012, + -1022, + -2235, + -761, + -908, + -1282, + -1241, + -1845, + -68, + -4666, + -6058, + -6355, + -2311, + -1888, + -1396, + -513, + -523, + -1155, + -2300, + -3657, + -1161, + -549, + -2564, + -2424, + -609, + -2346, + -2934, + -1142, + -3591, + -2859, + -2063, + -205, + -4048, + -4083, + -4261, + -56, + -1352, + -2147, + -1894, + -574, + -6577, + -5483, + -1881, + -628, + -815, + -1061, + -1987, + -1654, + -455, + -1380, + -3818, + -4941, + -926, + -934, + -1463, + -2630, + -2520, + -1013, + -1016, + -1250, + -977, + -2477, + -720, + -2401, + -130, + -2789, + -3155, + -3192, + -1135, + -1287, + -1552, + -1115, + -1217, + -1918, + -1059, + -1102, + -2291, + -3353, + -744, + -979, + -3067, + -1892, + -961, + -707, + -1795, + -1229, + -652, + -2348, + -1569, + -717, + -1490, + -1628, + -3240, + -258, + -2129, + -2748, + -2062, + -1902, + -625, + -1257, + -1453, + -1250, + -965, + -1445, + -4227, + -1494, + -1108, + -819, + + +}; + + +const Word16 E_ROM_inter4_1_fx[UP_SAMP * L_INTERPOL1 + 1] = { + /* cut-off frequency at 0.9*fs/2 */ + 14746 /*0.900000F Q14*/, + 13418 /*0.818959F Q14*/, 9910 /*0.604850F Q14*/, 5429 /*0.331379F Q14*/, 1376 /*0.083958F Q14*/, + -1242 /*-0.075795F Q14*/, -2142 /*-0.130717F Q14*/, -1732 /*-0.105685F Q14*/, -766 /*-0.046774F Q14*/, + 73 /*0.004467F Q14*/, 455 /*0.027789F Q14*/, 420 /*0.025642F Q14*/, 206 /*0.012571F Q14*/, + 32 /*0.001927F Q14*/, -26 /*-0.001571F Q14*/, -12 /*-0.000753F Q14*/, 0 /*0.000000f Q14*/ +}; +const Word16 E_ROM_inter6_1_fx[PIT_UP_SAMP6 * L_INTERPOL1 + 1] = { + 14759 /*0.900848F Q14*/, + 14158 /*0.864136F Q14*/, + 12453 /*0.760071F Q14*/, + 9919 /*0.605408F Q14*/, + 6948 /*0.424072F Q14*/, + 3972 /*0.242462F Q14*/, + 1377 /*0.0840759F Q14*/, + -563 /*-0.0343933F Q14*/, + -1729 /*-0.105560F Q14*/, + -2152 /*-0.131348F Q14*/, + -1984 /*-0.121124F Q14*/, + -1450 /*-0.0884705F Q14*/, + -780 /*-0.0476379F Q14*/, + -168 /*-0.0102539F Q14*/, + 267 /*0.0162964F Q14*/, + 485 /*0.0296021F Q14*/, + 512 /*0.0312195F Q14*/, + 412 /*0.0251160F Q14*/, + 258 /*0.0157471F Q14*/, + 110 /*0.00671387F Q14*/, + 0 /*0.000000F Q14*/, + -65 /*-0.00399780F Q14*/, + -97 /*-0.00592041F Q14*/, + -108 /*-0.00656128F Q14*/, + 0 /*0.000000F Q14*/ +}; +const Word16 kLog2TableFrac_x[256] = { // Q8 + 0, 1, 3, 4, 6, 7, 9, 10, + 11, 13, 14, 16, 17, 18, 20, 21, + 22, 24, 25, 26, 28, 29, 30, 32, + 33, 34, 36, 37, 38, 40, 41, 42, + 44, 45, 46, 47, 49, 50, 51, 52, + 54, 55, 56, 57, 59, 60, 61, 62, + 63, 65, 66, 67, 68, 69, 71, 72, + 73, 74, 75, 77, 78, 79, 80, 81, + 82, 84, 85, 86, 87, 88, 89, 90, + 92, 93, 94, 95, 96, 97, 98, 99, + 100, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 178, + 179, 180, 181, 182, 183, 184, 185, 185, + 186, 187, 188, 189, 190, 191, 192, 192, + 193, 194, 195, 196, 197, 198, 198, 199, + 200, 201, 202, 203, 203, 204, 205, 206, + 207, 208, 208, 209, 210, 211, 212, 212, + 213, 214, 215, 216, 216, 217, 218, 219, + 220, 220, 221, 222, 223, 224, 224, 225, + 226, 227, 228, 228, 229, 230, 231, 231, + 232, 233, 234, 234, 235, 236, 237, 238, + 238, 239, 240, 241, 241, 242, 243, 244, + 244, 245, 246, 247, 247, 248, 249, 249, + 250, 251, 252, 252, 253, 254, 255, 255 +}; + +const Word16 kExp2TableFrac_x[256] = /* Q15 */ + { + 32767, 32678, 32590, 32502, 32414, 32326, 32239, 32152, + 32065, 31978, 31892, 31805, 31719, 31634, 31548, 31463, + 31378, 31293, 31208, 31124, 31040, 30956, 30872, 30789, + 30705, 30622, 30540, 30457, 30375, 30293, 30211, 30129, + 30047, 29966, 29885, 29804, 29724, 29643, 29563, 29483, + 29404, 29324, 29245, 29166, 29087, 29008, 28930, 28852, + 28774, 28696, 28618, 28541, 28464, 28387, 28310, 28233, + 28157, 28081, 28005, 27929, 27854, 27778, 27703, 27628, + 27554, 27479, 27405, 27331, 27257, 27183, 27110, 27036, + 26963, 26890, 26818, 26745, 26673, 26601, 26529, 26457, + 26385, 26314, 26243, 26172, 26101, 26031, 25960, 25890, + 25820, 25750, 25681, 25611, 25542, 25473, 25404, 25335, + 25267, 25198, 25130, 25062, 24995, 24927, 24860, 24792, + 24725, 24659, 24592, 24525, 24459, 24393, 24327, 24261, + 24196, 24130, 24065, 24000, 23935, 23870, 23806, 23741, + 23677, 23613, 23549, 23486, 23422, 23359, 23296, 23233, + 23170, 23107, 23045, 22982, 22920, 22858, 22796, 22735, + 22673, 22612, 22551, 22490, 22429, 22368, 22308, 22248, + 22187, 22127, 22068, 22008, 21948, 21889, 21830, 21771, + 21712, 21653, 21595, 21536, 21478, 21420, 21362, 21304, + 21247, 21189, 21132, 21075, 21018, 20961, 20904, 20848, + 20791, 20735, 20679, 20623, 20568, 20512, 20456, 20401, + 20346, 20291, 20236, 20181, 20127, 20072, 20018, 19964, + 19910, 19856, 19802, 19749, 19696, 19642, 19589, 19536, + 19483, 19431, 19378, 19326, 19274, 19221, 19169, 19118, + 19066, 19014, 18963, 18912, 18861, 18810, 18759, 18708, + 18657, 18607, 18557, 18506, 18456, 18406, 18357, 18307, + 18258, 18208, 18159, 18110, 18061, 18012, 17963, 17915, + 17866, 17818, 17770, 17722, 17674, 17626, 17578, 17531, + 17483, 17436, 17389, 17342, 17295, 17248, 17202, 17155, + 17109, 17063, 17016, 16970, 16925, 16879, 16833, 16788, + 16742, 16697, 16652, 16607, 16562, 16517, 16472, 16428 + }; + +/*-------------------------------------------------------------------* + * inverse (reciprocal) of integer, used in FEC_fx.c, pitch_extr and in pitchDoubling_det + * 1/n = One_div[n-1] + *-------------------------------------------------------------------*/ +const Word16 One_div_fx[] = /* in Q15 */ + { + 32767, /* 1/1 */ + 16384, /* 1/2 */ + 10923, /* 1/3 */ + 8192, /* 1/4 */ + 6554, /* 1/5 */ + 5461, /* 1/6 */ + 4681, /* 1/7 */ + 4096 /* 1/8 */ + }; + +const Word32 tbl_two_pow_shift_by_4[35] = { // Q30 + 1073741824, 902905664, 759250112, 638450688, 536870912, 451452832, 379625056, 319225344, + 268435456, 225726416, 189812528, 159612672, 134217728, 112863208, 94906264, 79806336, + 67108864, 56431604, 47453132, 39903168, 33554432, 28215802, 23726566, 19951584, + 16777216, 14107901, 11863283, 9975792, 8388608, 7053950, 5931641, 4987896, + 4194304, 3526975, 2965820 +}; + + +const Word16 ivas_tan_panning_gain_tbl_fx[601] = { // Q15 + SHC( 0x0000 ), SHC( 0x0042 ), SHC( 0x0084 ), SHC( 0x00c6 ), SHC( 0x0109 ), SHC( 0x014b ), SHC( 0x018e ), SHC( 0x01d1 ), + SHC( 0x0214 ), SHC( 0x0257 ), SHC( 0x029b ), SHC( 0x02de ), SHC( 0x0322 ), SHC( 0x0365 ), SHC( 0x03a9 ), SHC( 0x03ed ), + SHC( 0x0431 ), SHC( 0x0475 ), SHC( 0x04ba ), SHC( 0x04fe ), SHC( 0x0543 ), SHC( 0x0588 ), SHC( 0x05cd ), SHC( 0x0612 ), + SHC( 0x0657 ), SHC( 0x069c ), SHC( 0x06e1 ), SHC( 0x0727 ), SHC( 0x076d ), SHC( 0x07b2 ), SHC( 0x07f8 ), SHC( 0x083e ), + SHC( 0x0885 ), SHC( 0x08cb ), SHC( 0x0911 ), SHC( 0x0958 ), SHC( 0x099f ), SHC( 0x09e6 ), SHC( 0x0a2d ), SHC( 0x0a74 ), + SHC( 0x0abb ), SHC( 0x0b02 ), SHC( 0x0b4a ), SHC( 0x0b91 ), SHC( 0x0bd9 ), SHC( 0x0c21 ), SHC( 0x0c69 ), SHC( 0x0cb1 ), + SHC( 0x0cf9 ), SHC( 0x0d42 ), SHC( 0x0d8a ), SHC( 0x0dd3 ), SHC( 0x0e1c ), SHC( 0x0e65 ), SHC( 0x0eae ), SHC( 0x0ef7 ), + SHC( 0x0f40 ), SHC( 0x0f89 ), SHC( 0x0fd3 ), SHC( 0x101d ), SHC( 0x1066 ), SHC( 0x10b0 ), SHC( 0x10fa ), SHC( 0x1144 ), + SHC( 0x118f ), SHC( 0x11d9 ), SHC( 0x1223 ), SHC( 0x126e ), SHC( 0x12b9 ), SHC( 0x1304 ), SHC( 0x134f ), SHC( 0x139a ), + SHC( 0x13e5 ), SHC( 0x1430 ), SHC( 0x147c ), SHC( 0x14c7 ), SHC( 0x1513 ), SHC( 0x155f ), SHC( 0x15aa ), SHC( 0x15f6 ), + SHC( 0x1643 ), SHC( 0x168f ), SHC( 0x16db ), SHC( 0x1728 ), SHC( 0x1774 ), SHC( 0x17c1 ), SHC( 0x180e ), SHC( 0x185a ), + SHC( 0x18a7 ), SHC( 0x18f5 ), SHC( 0x1942 ), SHC( 0x198f ), SHC( 0x19dd ), SHC( 0x1a2a ), SHC( 0x1a78 ), SHC( 0x1ac5 ), + SHC( 0x1b13 ), SHC( 0x1b61 ), SHC( 0x1baf ), SHC( 0x1bfd ), SHC( 0x1c4c ), SHC( 0x1c9a ), SHC( 0x1ce8 ), SHC( 0x1d37 ), + SHC( 0x1d86 ), SHC( 0x1dd4 ), SHC( 0x1e23 ), SHC( 0x1e72 ), SHC( 0x1ec1 ), SHC( 0x1f10 ), SHC( 0x1f5f ), SHC( 0x1faf ), + SHC( 0x1ffe ), SHC( 0x204d ), SHC( 0x209d ), SHC( 0x20ed ), SHC( 0x213c ), SHC( 0x218c ), SHC( 0x21dc ), SHC( 0x222c ), + SHC( 0x227c ), SHC( 0x22cc ), SHC( 0x231c ), SHC( 0x236d ), SHC( 0x23bd ), SHC( 0x240e ), SHC( 0x245e ), SHC( 0x24af ), + SHC( 0x24ff ), SHC( 0x2550 ), SHC( 0x25a1 ), SHC( 0x25f2 ), SHC( 0x2643 ), SHC( 0x2694 ), SHC( 0x26e5 ), SHC( 0x2736 ), + SHC( 0x2787 ), SHC( 0x27d9 ), SHC( 0x282a ), SHC( 0x287b ), SHC( 0x28cd ), SHC( 0x291e ), SHC( 0x2970 ), SHC( 0x29c2 ), + SHC( 0x2a13 ), SHC( 0x2a65 ), SHC( 0x2ab7 ), SHC( 0x2b09 ), SHC( 0x2b5b ), SHC( 0x2bad ), SHC( 0x2bff ), SHC( 0x2c51 ), + SHC( 0x2ca3 ), SHC( 0x2cf5 ), SHC( 0x2d47 ), SHC( 0x2d99 ), SHC( 0x2dec ), SHC( 0x2e3e ), SHC( 0x2e90 ), SHC( 0x2ee3 ), + SHC( 0x2f35 ), SHC( 0x2f87 ), SHC( 0x2fda ), SHC( 0x302c ), SHC( 0x307f ), SHC( 0x30d2 ), SHC( 0x3124 ), SHC( 0x3177 ), + SHC( 0x31c9 ), SHC( 0x321c ), SHC( 0x326f ), SHC( 0x32c1 ), SHC( 0x3314 ), SHC( 0x3367 ), SHC( 0x33ba ), SHC( 0x340c ), + SHC( 0x345f ), SHC( 0x34b2 ), SHC( 0x3505 ), SHC( 0x3557 ), SHC( 0x35aa ), SHC( 0x35fd ), SHC( 0x3650 ), SHC( 0x36a2 ), + SHC( 0x36f5 ), SHC( 0x3748 ), SHC( 0x379b ), SHC( 0x37ed ), SHC( 0x3840 ), SHC( 0x3893 ), SHC( 0x38e6 ), SHC( 0x3938 ), + SHC( 0x398b ), SHC( 0x39de ), SHC( 0x3a30 ), SHC( 0x3a83 ), SHC( 0x3ad6 ), SHC( 0x3b28 ), SHC( 0x3b7b ), SHC( 0x3bcd ), + SHC( 0x3c20 ), SHC( 0x3c72 ), SHC( 0x3cc5 ), SHC( 0x3d17 ), SHC( 0x3d69 ), SHC( 0x3dbc ), SHC( 0x3e0e ), SHC( 0x3e60 ), + SHC( 0x3eb2 ), SHC( 0x3f04 ), SHC( 0x3f57 ), SHC( 0x3fa9 ), SHC( 0x3ffb ), SHC( 0x404c ), SHC( 0x409e ), SHC( 0x40f0 ), + SHC( 0x4142 ), SHC( 0x4194 ), SHC( 0x41e5 ), SHC( 0x4237 ), SHC( 0x4288 ), SHC( 0x42da ), SHC( 0x432b ), SHC( 0x437c ), + SHC( 0x43ce ), SHC( 0x441f ), SHC( 0x4470 ), SHC( 0x44c1 ), SHC( 0x4512 ), SHC( 0x4563 ), SHC( 0x45b3 ), SHC( 0x4604 ), + SHC( 0x4654 ), SHC( 0x46a5 ), SHC( 0x46f5 ), SHC( 0x4746 ), SHC( 0x4796 ), SHC( 0x47e6 ), SHC( 0x4836 ), SHC( 0x4886 ), + SHC( 0x48d5 ), SHC( 0x4925 ), SHC( 0x4975 ), SHC( 0x49c4 ), SHC( 0x4a13 ), SHC( 0x4a63 ), SHC( 0x4ab2 ), SHC( 0x4b01 ), + SHC( 0x4b50 ), SHC( 0x4b9e ), SHC( 0x4bed ), SHC( 0x4c3b ), SHC( 0x4c8a ), SHC( 0x4cd8 ), SHC( 0x4d26 ), SHC( 0x4d74 ), + SHC( 0x4dc2 ), SHC( 0x4e10 ), SHC( 0x4e5d ), SHC( 0x4eab ), SHC( 0x4ef8 ), SHC( 0x4f45 ), SHC( 0x4f92 ), SHC( 0x4fdf ), + SHC( 0x502c ), SHC( 0x5078 ), SHC( 0x50c4 ), SHC( 0x5111 ), SHC( 0x515d ), SHC( 0x51a9 ), SHC( 0x51f4 ), SHC( 0x5240 ), + SHC( 0x528b ), SHC( 0x52d7 ), SHC( 0x5322 ), SHC( 0x536d ), SHC( 0x53b8 ), SHC( 0x5402 ), SHC( 0x544d ), SHC( 0x5497 ), + SHC( 0x54e1 ), SHC( 0x552b ), SHC( 0x5574 ), SHC( 0x55be ), SHC( 0x5607 ), SHC( 0x5650 ), SHC( 0x5699 ), SHC( 0x56e2 ), + SHC( 0x572b ), SHC( 0x5773 ), SHC( 0x57bb ), SHC( 0x5803 ), SHC( 0x584b ), SHC( 0x5893 ), SHC( 0x58da ), SHC( 0x5921 ), + SHC( 0x5968 ), SHC( 0x59af ), SHC( 0x59f5 ), SHC( 0x5a3c ), SHC( 0x5a82 ), SHC( 0x5ac8 ), SHC( 0x5b0e ), SHC( 0x5b53 ), + SHC( 0x5b98 ), SHC( 0x5bde ), SHC( 0x5c22 ), SHC( 0x5c67 ), SHC( 0x5cab ), SHC( 0x5cf0 ), SHC( 0x5d34 ), SHC( 0x5d77 ), + SHC( 0x5dbb ), SHC( 0x5dfe ), SHC( 0x5e41 ), SHC( 0x5e84 ), SHC( 0x5ec7 ), SHC( 0x5f09 ), SHC( 0x5f4b ), SHC( 0x5f8d ), + SHC( 0x5fcf ), SHC( 0x6010 ), SHC( 0x6051 ), SHC( 0x6092 ), SHC( 0x60d3 ), SHC( 0x6113 ), SHC( 0x6153 ), SHC( 0x6193 ), + SHC( 0x61d3 ), SHC( 0x6213 ), SHC( 0x6252 ), SHC( 0x6291 ), SHC( 0x62cf ), SHC( 0x630e ), SHC( 0x634c ), SHC( 0x638a ), + SHC( 0x63c8 ), SHC( 0x6405 ), SHC( 0x6442 ), SHC( 0x647f ), SHC( 0x64bc ), SHC( 0x64f8 ), SHC( 0x6534 ), SHC( 0x6570 ), + SHC( 0x65ac ), SHC( 0x65e7 ), SHC( 0x6622 ), SHC( 0x665d ), SHC( 0x6698 ), SHC( 0x66d2 ), SHC( 0x670c ), SHC( 0x6746 ), + SHC( 0x677f ), SHC( 0x67b8 ), SHC( 0x67f1 ), SHC( 0x682a ), SHC( 0x6862 ), SHC( 0x689a ), SHC( 0x68d2 ), SHC( 0x690a ), + SHC( 0x6941 ), SHC( 0x6978 ), SHC( 0x69af ), SHC( 0x69e5 ), SHC( 0x6a1c ), SHC( 0x6a52 ), SHC( 0x6a87 ), SHC( 0x6abd ), + SHC( 0x6af2 ), SHC( 0x6b26 ), SHC( 0x6b5b ), SHC( 0x6b8f ), SHC( 0x6bc3 ), SHC( 0x6bf7 ), SHC( 0x6c2a ), SHC( 0x6c5d ), + SHC( 0x6c90 ), SHC( 0x6cc3 ), SHC( 0x6cf5 ), SHC( 0x6d27 ), SHC( 0x6d59 ), SHC( 0x6d8a ), SHC( 0x6dbb ), SHC( 0x6dec ), + SHC( 0x6e1d ), SHC( 0x6e4d ), SHC( 0x6e7d ), SHC( 0x6ead ), SHC( 0x6edc ), SHC( 0x6f0b ), SHC( 0x6f3a ), SHC( 0x6f69 ), + SHC( 0x6f97 ), SHC( 0x6fc5 ), SHC( 0x6ff3 ), SHC( 0x7020 ), SHC( 0x704e ), SHC( 0x707a ), SHC( 0x70a7 ), SHC( 0x70d3 ), + SHC( 0x70ff ), SHC( 0x712b ), SHC( 0x7157 ), SHC( 0x7182 ), SHC( 0x71ad ), SHC( 0x71d7 ), SHC( 0x7202 ), SHC( 0x722c ), + SHC( 0x7255 ), SHC( 0x727f ), SHC( 0x72a8 ), SHC( 0x72d1 ), SHC( 0x72fa ), SHC( 0x7322 ), SHC( 0x734a ), SHC( 0x7372 ), + SHC( 0x7399 ), SHC( 0x73c0 ), SHC( 0x73e7 ), SHC( 0x740e ), SHC( 0x7434 ), SHC( 0x745a ), SHC( 0x7480 ), SHC( 0x74a6 ), + SHC( 0x74cb ), SHC( 0x74f0 ), SHC( 0x7515 ), SHC( 0x7539 ), SHC( 0x755d ), SHC( 0x7581 ), SHC( 0x75a5 ), SHC( 0x75c8 ), + SHC( 0x75eb ), SHC( 0x760e ), SHC( 0x7630 ), SHC( 0x7652 ), SHC( 0x7674 ), SHC( 0x7696 ), SHC( 0x76b7 ), SHC( 0x76d9 ), + SHC( 0x76f9 ), SHC( 0x771a ), SHC( 0x773a ), SHC( 0x775a ), SHC( 0x777a ), SHC( 0x779a ), SHC( 0x77b9 ), SHC( 0x77d8 ), + SHC( 0x77f6 ), SHC( 0x7815 ), SHC( 0x7833 ), SHC( 0x7851 ), SHC( 0x786e ), SHC( 0x788c ), SHC( 0x78a9 ), SHC( 0x78c6 ), + SHC( 0x78e2 ), SHC( 0x78ff ), SHC( 0x791b ), SHC( 0x7937 ), SHC( 0x7952 ), SHC( 0x796d ), SHC( 0x7988 ), SHC( 0x79a3 ), + SHC( 0x79be ), SHC( 0x79d8 ), SHC( 0x79f2 ), SHC( 0x7a0c ), SHC( 0x7a25 ), SHC( 0x7a3e ), SHC( 0x7a57 ), SHC( 0x7a70 ), + SHC( 0x7a89 ), SHC( 0x7aa1 ), SHC( 0x7ab9 ), SHC( 0x7ad1 ), SHC( 0x7ae8 ), SHC( 0x7aff ), SHC( 0x7b16 ), SHC( 0x7b2d ), + SHC( 0x7b44 ), SHC( 0x7b5a ), SHC( 0x7b70 ), SHC( 0x7b86 ), SHC( 0x7b9b ), SHC( 0x7bb1 ), SHC( 0x7bc6 ), SHC( 0x7bdb ), + SHC( 0x7bef ), SHC( 0x7c04 ), SHC( 0x7c18 ), SHC( 0x7c2c ), SHC( 0x7c40 ), SHC( 0x7c53 ), SHC( 0x7c66 ), SHC( 0x7c79 ), + SHC( 0x7c8c ), SHC( 0x7c9e ), SHC( 0x7cb1 ), SHC( 0x7cc3 ), SHC( 0x7cd5 ), SHC( 0x7ce6 ), SHC( 0x7cf8 ), SHC( 0x7d09 ), + SHC( 0x7d1a ), SHC( 0x7d2b ), SHC( 0x7d3b ), SHC( 0x7d4c ), SHC( 0x7d5c ), SHC( 0x7d6b ), SHC( 0x7d7b ), SHC( 0x7d8b ), + SHC( 0x7d9a ), SHC( 0x7da9 ), SHC( 0x7db8 ), SHC( 0x7dc6 ), SHC( 0x7dd5 ), SHC( 0x7de3 ), SHC( 0x7df1 ), SHC( 0x7dff ), + SHC( 0x7e0c ), SHC( 0x7e19 ), SHC( 0x7e27 ), SHC( 0x7e34 ), SHC( 0x7e40 ), SHC( 0x7e4d ), SHC( 0x7e59 ), SHC( 0x7e65 ), + SHC( 0x7e71 ), SHC( 0x7e7d ), SHC( 0x7e89 ), SHC( 0x7e94 ), SHC( 0x7e9f ), SHC( 0x7eaa ), SHC( 0x7eb5 ), SHC( 0x7ebf ), + SHC( 0x7eca ), SHC( 0x7ed4 ), SHC( 0x7ede ), SHC( 0x7ee8 ), SHC( 0x7ef1 ), SHC( 0x7efb ), SHC( 0x7f04 ), SHC( 0x7f0d ), + SHC( 0x7f16 ), SHC( 0x7f1f ), SHC( 0x7f27 ), SHC( 0x7f30 ), SHC( 0x7f38 ), SHC( 0x7f40 ), SHC( 0x7f48 ), SHC( 0x7f4f ), + SHC( 0x7f57 ), SHC( 0x7f5e ), SHC( 0x7f65 ), SHC( 0x7f6c ), SHC( 0x7f73 ), SHC( 0x7f79 ), SHC( 0x7f80 ), SHC( 0x7f86 ), + SHC( 0x7f8c ), SHC( 0x7f92 ), SHC( 0x7f98 ), SHC( 0x7f9d ), SHC( 0x7fa3 ), SHC( 0x7fa8 ), SHC( 0x7fad ), SHC( 0x7fb2 ), + SHC( 0x7fb7 ), SHC( 0x7fbb ), SHC( 0x7fc0 ), SHC( 0x7fc4 ), SHC( 0x7fc8 ), SHC( 0x7fcc ), SHC( 0x7fd0 ), SHC( 0x7fd4 ), + SHC( 0x7fd7 ), SHC( 0x7fdb ), SHC( 0x7fde ), SHC( 0x7fe1 ), SHC( 0x7fe4 ), SHC( 0x7fe7 ), SHC( 0x7fe9 ), SHC( 0x7fec ), + SHC( 0x7fee ), SHC( 0x7ff0 ), SHC( 0x7ff2 ), SHC( 0x7ff4 ), SHC( 0x7ff6 ), SHC( 0x7ff7 ), SHC( 0x7ff9 ), SHC( 0x7ffa ), + SHC( 0x7ffb ), SHC( 0x7ffc ), SHC( 0x7ffd ), SHC( 0x7ffe ), SHC( 0x7ffe ), SHC( 0x7fff ), SHC( 0x7fff ), SHC( 0x7fff ), + SHC( 0x7fff ) +}; + +const Word16 ivas_sine_panning_tbl_fx[601] = { // Q15 + SHC( 0xc001 ), SHC( 0xc032 ), SHC( 0xc064 ), SHC( 0xc095 ), SHC( 0xc0c7 ), SHC( 0xc0f9 ), SHC( 0xc12b ), SHC( 0xc15c ), + SHC( 0xc18e ), SHC( 0xc1c0 ), SHC( 0xc1f2 ), SHC( 0xc224 ), SHC( 0xc256 ), SHC( 0xc289 ), SHC( 0xc2bb ), SHC( 0xc2ed ), + SHC( 0xc31f ), SHC( 0xc352 ), SHC( 0xc384 ), SHC( 0xc3b6 ), SHC( 0xc3e9 ), SHC( 0xc41b ), SHC( 0xc44e ), SHC( 0xc481 ), + SHC( 0xc4b3 ), SHC( 0xc4e6 ), SHC( 0xc519 ), SHC( 0xc54b ), SHC( 0xc57e ), SHC( 0xc5b1 ), SHC( 0xc5e4 ), SHC( 0xc617 ), + SHC( 0xc64a ), SHC( 0xc67d ), SHC( 0xc6b0 ), SHC( 0xc6e3 ), SHC( 0xc717 ), SHC( 0xc74a ), SHC( 0xc77d ), SHC( 0xc7b1 ), + SHC( 0xc7e4 ), SHC( 0xc817 ), SHC( 0xc84b ), SHC( 0xc87e ), SHC( 0xc8b2 ), SHC( 0xc8e6 ), SHC( 0xc919 ), SHC( 0xc94d ), + SHC( 0xc981 ), SHC( 0xc9b4 ), SHC( 0xc9e8 ), SHC( 0xca1c ), SHC( 0xca50 ), SHC( 0xca84 ), SHC( 0xcab8 ), SHC( 0xcaec ), + SHC( 0xcb20 ), SHC( 0xcb54 ), SHC( 0xcb88 ), SHC( 0xcbbc ), SHC( 0xcbf1 ), SHC( 0xcc25 ), SHC( 0xcc59 ), SHC( 0xcc8d ), + SHC( 0xccc2 ), SHC( 0xccf6 ), SHC( 0xcd2b ), SHC( 0xcd5f ), SHC( 0xcd94 ), SHC( 0xcdc8 ), SHC( 0xcdfd ), SHC( 0xce32 ), + SHC( 0xce66 ), SHC( 0xce9b ), SHC( 0xced0 ), SHC( 0xcf05 ), SHC( 0xcf3a ), SHC( 0xcf6e ), SHC( 0xcfa3 ), SHC( 0xcfd8 ), + SHC( 0xd00d ), SHC( 0xd042 ), SHC( 0xd078 ), SHC( 0xd0ad ), SHC( 0xd0e2 ), SHC( 0xd117 ), SHC( 0xd14c ), SHC( 0xd181 ), + SHC( 0xd1b7 ), SHC( 0xd1ec ), SHC( 0xd221 ), SHC( 0xd257 ), SHC( 0xd28c ), SHC( 0xd2c2 ), SHC( 0xd2f7 ), SHC( 0xd32d ), + SHC( 0xd362 ), SHC( 0xd398 ), SHC( 0xd3ce ), SHC( 0xd403 ), SHC( 0xd439 ), SHC( 0xd46f ), SHC( 0xd4a5 ), SHC( 0xd4db ), + SHC( 0xd510 ), SHC( 0xd546 ), SHC( 0xd57c ), SHC( 0xd5b2 ), SHC( 0xd5e8 ), SHC( 0xd61e ), SHC( 0xd654 ), SHC( 0xd68a ), + SHC( 0xd6c0 ), SHC( 0xd6f7 ), SHC( 0xd72d ), SHC( 0xd763 ), SHC( 0xd799 ), SHC( 0xd7d0 ), SHC( 0xd806 ), SHC( 0xd83c ), + SHC( 0xd873 ), SHC( 0xd8a9 ), SHC( 0xd8df ), SHC( 0xd916 ), SHC( 0xd94c ), SHC( 0xd983 ), SHC( 0xd9ba ), SHC( 0xd9f0 ), + SHC( 0xda27 ), SHC( 0xda5d ), SHC( 0xda94 ), SHC( 0xdacb ), SHC( 0xdb02 ), SHC( 0xdb38 ), SHC( 0xdb6f ), SHC( 0xdba6 ), + SHC( 0xdbdd ), SHC( 0xdc14 ), SHC( 0xdc4b ), SHC( 0xdc81 ), SHC( 0xdcb8 ), SHC( 0xdcef ), SHC( 0xdd26 ), SHC( 0xdd5d ), + SHC( 0xdd95 ), SHC( 0xddcc ), SHC( 0xde03 ), SHC( 0xde3a ), SHC( 0xde71 ), SHC( 0xdea8 ), SHC( 0xdee0 ), SHC( 0xdf17 ), + SHC( 0xdf4e ), SHC( 0xdf85 ), SHC( 0xdfbd ), SHC( 0xdff4 ), SHC( 0xe02b ), SHC( 0xe063 ), SHC( 0xe09a ), SHC( 0xe0d2 ), + SHC( 0xe109 ), SHC( 0xe141 ), SHC( 0xe178 ), SHC( 0xe1b0 ), SHC( 0xe1e7 ), SHC( 0xe21f ), SHC( 0xe257 ), SHC( 0xe28e ), + SHC( 0xe2c6 ), SHC( 0xe2fe ), SHC( 0xe335 ), SHC( 0xe36d ), SHC( 0xe3a5 ), SHC( 0xe3dd ), SHC( 0xe414 ), SHC( 0xe44c ), + SHC( 0xe484 ), SHC( 0xe4bc ), SHC( 0xe4f4 ), SHC( 0xe52c ), SHC( 0xe564 ), SHC( 0xe59c ), SHC( 0xe5d4 ), SHC( 0xe60c ), + SHC( 0xe644 ), SHC( 0xe67c ), SHC( 0xe6b4 ), SHC( 0xe6ec ), SHC( 0xe724 ), SHC( 0xe75c ), SHC( 0xe794 ), SHC( 0xe7cc ), + SHC( 0xe804 ), SHC( 0xe83d ), SHC( 0xe875 ), SHC( 0xe8ad ), SHC( 0xe8e5 ), SHC( 0xe91e ), SHC( 0xe956 ), SHC( 0xe98e ), + SHC( 0xe9c6 ), SHC( 0xe9ff ), SHC( 0xea37 ), SHC( 0xea6f ), SHC( 0xeaa8 ), SHC( 0xeae0 ), SHC( 0xeb19 ), SHC( 0xeb51 ), + SHC( 0xeb8a ), SHC( 0xebc2 ), SHC( 0xebfa ), SHC( 0xec33 ), SHC( 0xec6b ), SHC( 0xeca4 ), SHC( 0xecdd ), SHC( 0xed15 ), + SHC( 0xed4e ), SHC( 0xed86 ), SHC( 0xedbf ), SHC( 0xedf7 ), SHC( 0xee30 ), SHC( 0xee69 ), SHC( 0xeea1 ), SHC( 0xeeda ), + SHC( 0xef13 ), SHC( 0xef4b ), SHC( 0xef84 ), SHC( 0xefbd ), SHC( 0xeff6 ), SHC( 0xf02e ), SHC( 0xf067 ), SHC( 0xf0a0 ), + SHC( 0xf0d9 ), SHC( 0xf111 ), SHC( 0xf14a ), SHC( 0xf183 ), SHC( 0xf1bc ), SHC( 0xf1f5 ), SHC( 0xf22e ), SHC( 0xf266 ), + SHC( 0xf29f ), SHC( 0xf2d8 ), SHC( 0xf311 ), SHC( 0xf34a ), SHC( 0xf383 ), SHC( 0xf3bc ), SHC( 0xf3f5 ), SHC( 0xf42e ), + SHC( 0xf467 ), SHC( 0xf4a0 ), SHC( 0xf4d9 ), SHC( 0xf512 ), SHC( 0xf54b ), SHC( 0xf584 ), SHC( 0xf5bd ), SHC( 0xf5f6 ), + SHC( 0xf62f ), SHC( 0xf668 ), SHC( 0xf6a1 ), SHC( 0xf6da ), SHC( 0xf713 ), SHC( 0xf74c ), SHC( 0xf785 ), SHC( 0xf7be ), + SHC( 0xf7f7 ), SHC( 0xf830 ), SHC( 0xf869 ), SHC( 0xf8a2 ), SHC( 0xf8db ), SHC( 0xf914 ), SHC( 0xf94e ), SHC( 0xf987 ), + SHC( 0xf9c0 ), SHC( 0xf9f9 ), SHC( 0xfa32 ), SHC( 0xfa6b ), SHC( 0xfaa4 ), SHC( 0xfadd ), SHC( 0xfb17 ), SHC( 0xfb50 ), + SHC( 0xfb89 ), SHC( 0xfbc2 ), SHC( 0xfbfb ), SHC( 0xfc34 ), SHC( 0xfc6e ), SHC( 0xfca7 ), SHC( 0xfce0 ), SHC( 0xfd19 ), + SHC( 0xfd52 ), SHC( 0xfd8b ), SHC( 0xfdc5 ), SHC( 0xfdfe ), SHC( 0xfe37 ), SHC( 0xfe70 ), SHC( 0xfea9 ), SHC( 0xfee3 ), + SHC( 0xff1c ), SHC( 0xff55 ), SHC( 0xff8e ), SHC( 0xffc7 ), SHC( 0x0000 ), SHC( 0x0039 ), SHC( 0x0072 ), SHC( 0x00ab ), + SHC( 0x00e4 ), SHC( 0x011d ), SHC( 0x0157 ), SHC( 0x0190 ), SHC( 0x01c9 ), SHC( 0x0202 ), SHC( 0x023b ), SHC( 0x0275 ), + SHC( 0x02ae ), SHC( 0x02e7 ), SHC( 0x0320 ), SHC( 0x0359 ), SHC( 0x0392 ), SHC( 0x03cc ), SHC( 0x0405 ), SHC( 0x043e ), + SHC( 0x0477 ), SHC( 0x04b0 ), SHC( 0x04e9 ), SHC( 0x0523 ), SHC( 0x055c ), SHC( 0x0595 ), SHC( 0x05ce ), SHC( 0x0607 ), + SHC( 0x0640 ), SHC( 0x0679 ), SHC( 0x06b2 ), SHC( 0x06ec ), SHC( 0x0725 ), SHC( 0x075e ), SHC( 0x0797 ), SHC( 0x07d0 ), + SHC( 0x0809 ), SHC( 0x0842 ), SHC( 0x087b ), SHC( 0x08b4 ), SHC( 0x08ed ), SHC( 0x0926 ), SHC( 0x095f ), SHC( 0x0998 ), + SHC( 0x09d1 ), SHC( 0x0a0a ), SHC( 0x0a43 ), SHC( 0x0a7c ), SHC( 0x0ab5 ), SHC( 0x0aee ), SHC( 0x0b27 ), SHC( 0x0b60 ), + SHC( 0x0b99 ), SHC( 0x0bd2 ), SHC( 0x0c0b ), SHC( 0x0c44 ), SHC( 0x0c7d ), SHC( 0x0cb6 ), SHC( 0x0cef ), SHC( 0x0d28 ), + SHC( 0x0d61 ), SHC( 0x0d9a ), SHC( 0x0dd2 ), SHC( 0x0e0b ), SHC( 0x0e44 ), SHC( 0x0e7d ), SHC( 0x0eb6 ), SHC( 0x0eef ), + SHC( 0x0f27 ), SHC( 0x0f60 ), SHC( 0x0f99 ), SHC( 0x0fd2 ), SHC( 0x100a ), SHC( 0x1043 ), SHC( 0x107c ), SHC( 0x10b5 ), + SHC( 0x10ed ), SHC( 0x1126 ), SHC( 0x115f ), SHC( 0x1197 ), SHC( 0x11d0 ), SHC( 0x1209 ), SHC( 0x1241 ), SHC( 0x127a ), + SHC( 0x12b2 ), SHC( 0x12eb ), SHC( 0x1323 ), SHC( 0x135c ), SHC( 0x1395 ), SHC( 0x13cd ), SHC( 0x1406 ), SHC( 0x143e ), + SHC( 0x1476 ), SHC( 0x14af ), SHC( 0x14e7 ), SHC( 0x1520 ), SHC( 0x1558 ), SHC( 0x1591 ), SHC( 0x15c9 ), SHC( 0x1601 ), + SHC( 0x163a ), SHC( 0x1672 ), SHC( 0x16aa ), SHC( 0x16e2 ), SHC( 0x171b ), SHC( 0x1753 ), SHC( 0x178b ), SHC( 0x17c3 ), + SHC( 0x17fc ), SHC( 0x1834 ), SHC( 0x186c ), SHC( 0x18a4 ), SHC( 0x18dc ), SHC( 0x1914 ), SHC( 0x194c ), SHC( 0x1984 ), + SHC( 0x19bc ), SHC( 0x19f4 ), SHC( 0x1a2c ), SHC( 0x1a64 ), SHC( 0x1a9c ), SHC( 0x1ad4 ), SHC( 0x1b0c ), SHC( 0x1b44 ), + SHC( 0x1b7c ), SHC( 0x1bb4 ), SHC( 0x1bec ), SHC( 0x1c23 ), SHC( 0x1c5b ), SHC( 0x1c93 ), SHC( 0x1ccb ), SHC( 0x1d02 ), + SHC( 0x1d3a ), SHC( 0x1d72 ), SHC( 0x1da9 ), SHC( 0x1de1 ), SHC( 0x1e19 ), SHC( 0x1e50 ), SHC( 0x1e88 ), SHC( 0x1ebf ), + SHC( 0x1ef7 ), SHC( 0x1f2e ), SHC( 0x1f66 ), SHC( 0x1f9d ), SHC( 0x1fd5 ), SHC( 0x200c ), SHC( 0x2043 ), SHC( 0x207b ), + SHC( 0x20b2 ), SHC( 0x20e9 ), SHC( 0x2120 ), SHC( 0x2158 ), SHC( 0x218f ), SHC( 0x21c6 ), SHC( 0x21fd ), SHC( 0x2234 ), + SHC( 0x226b ), SHC( 0x22a3 ), SHC( 0x22da ), SHC( 0x2311 ), SHC( 0x2348 ), SHC( 0x237f ), SHC( 0x23b5 ), SHC( 0x23ec ), + SHC( 0x2423 ), SHC( 0x245a ), SHC( 0x2491 ), SHC( 0x24c8 ), SHC( 0x24fe ), SHC( 0x2535 ), SHC( 0x256c ), SHC( 0x25a3 ), + SHC( 0x25d9 ), SHC( 0x2610 ), SHC( 0x2646 ), SHC( 0x267d ), SHC( 0x26b4 ), SHC( 0x26ea ), SHC( 0x2721 ), SHC( 0x2757 ), + SHC( 0x278d ), SHC( 0x27c4 ), SHC( 0x27fa ), SHC( 0x2830 ), SHC( 0x2867 ), SHC( 0x289d ), SHC( 0x28d3 ), SHC( 0x2909 ), + SHC( 0x2940 ), SHC( 0x2976 ), SHC( 0x29ac ), SHC( 0x29e2 ), SHC( 0x2a18 ), SHC( 0x2a4e ), SHC( 0x2a84 ), SHC( 0x2aba ), + SHC( 0x2af0 ), SHC( 0x2b25 ), SHC( 0x2b5b ), SHC( 0x2b91 ), SHC( 0x2bc7 ), SHC( 0x2bfd ), SHC( 0x2c32 ), SHC( 0x2c68 ), + SHC( 0x2c9e ), SHC( 0x2cd3 ), SHC( 0x2d09 ), SHC( 0x2d3e ), SHC( 0x2d74 ), SHC( 0x2da9 ), SHC( 0x2ddf ), SHC( 0x2e14 ), + SHC( 0x2e49 ), SHC( 0x2e7f ), SHC( 0x2eb4 ), SHC( 0x2ee9 ), SHC( 0x2f1e ), SHC( 0x2f53 ), SHC( 0x2f88 ), SHC( 0x2fbe ), + SHC( 0x2ff3 ), SHC( 0x3028 ), SHC( 0x305d ), SHC( 0x3092 ), SHC( 0x30c6 ), SHC( 0x30fb ), SHC( 0x3130 ), SHC( 0x3165 ), + SHC( 0x319a ), SHC( 0x31ce ), SHC( 0x3203 ), SHC( 0x3238 ), SHC( 0x326c ), SHC( 0x32a1 ), SHC( 0x32d5 ), SHC( 0x330a ), + SHC( 0x333e ), SHC( 0x3373 ), SHC( 0x33a7 ), SHC( 0x33db ), SHC( 0x340f ), SHC( 0x3444 ), SHC( 0x3478 ), SHC( 0x34ac ), + SHC( 0x34e0 ), SHC( 0x3514 ), SHC( 0x3548 ), SHC( 0x357c ), SHC( 0x35b0 ), SHC( 0x35e4 ), SHC( 0x3618 ), SHC( 0x364c ), + SHC( 0x367f ), SHC( 0x36b3 ), SHC( 0x36e7 ), SHC( 0x371a ), SHC( 0x374e ), SHC( 0x3782 ), SHC( 0x37b5 ), SHC( 0x37e9 ), + SHC( 0x381c ), SHC( 0x384f ), SHC( 0x3883 ), SHC( 0x38b6 ), SHC( 0x38e9 ), SHC( 0x391d ), SHC( 0x3950 ), SHC( 0x3983 ), + SHC( 0x39b6 ), SHC( 0x39e9 ), SHC( 0x3a1c ), SHC( 0x3a4f ), SHC( 0x3a82 ), SHC( 0x3ab5 ), SHC( 0x3ae7 ), SHC( 0x3b1a ), + SHC( 0x3b4d ), SHC( 0x3b7f ), SHC( 0x3bb2 ), SHC( 0x3be5 ), SHC( 0x3c17 ), SHC( 0x3c4a ), SHC( 0x3c7c ), SHC( 0x3cae ), + SHC( 0x3ce1 ), SHC( 0x3d13 ), SHC( 0x3d45 ), SHC( 0x3d77 ), SHC( 0x3daa ), SHC( 0x3ddc ), SHC( 0x3e0e ), SHC( 0x3e40 ), + SHC( 0x3e72 ), SHC( 0x3ea4 ), SHC( 0x3ed5 ), SHC( 0x3f07 ), SHC( 0x3f39 ), SHC( 0x3f6b ), SHC( 0x3f9c ), SHC( 0x3fce ), + SHC( 0x3fff ) +}; + +const Word16 ivas_sin_az_fx[361] = { // Q15 + SHC( 0x0000 ), SHC( 0xfdc5 ), SHC( 0xfb89 ), SHC( 0xf94e ), SHC( 0xf713 ), SHC( 0xf4d9 ), SHC( 0xf29f ), SHC( 0xf067 ), + SHC( 0xee30 ), SHC( 0xebfa ), SHC( 0xe9c6 ), SHC( 0xe794 ), SHC( 0xe564 ), SHC( 0xe335 ), SHC( 0xe109 ), SHC( 0xdee0 ), + SHC( 0xdcb8 ), SHC( 0xda94 ), SHC( 0xd873 ), SHC( 0xd654 ), SHC( 0xd439 ), SHC( 0xd221 ), SHC( 0xd00d ), SHC( 0xcdfd ), + SHC( 0xcbf1 ), SHC( 0xc9e8 ), SHC( 0xc7e4 ), SHC( 0xc5e4 ), SHC( 0xc3e9 ), SHC( 0xc1f2 ), SHC( 0xc001 ), SHC( 0xbe14 ), + SHC( 0xbc2c ), SHC( 0xba4a ), SHC( 0xb86d ), SHC( 0xb696 ), SHC( 0xb4c4 ), SHC( 0xb2f8 ), SHC( 0xb133 ), SHC( 0xaf73 ), + SHC( 0xadba ), SHC( 0xac07 ), SHC( 0xaa5a ), SHC( 0xa8b5 ), SHC( 0xa716 ), SHC( 0xa57e ), SHC( 0xa3ed ), SHC( 0xa264 ), + SHC( 0xa0e1 ), SHC( 0x9f66 ), SHC( 0x9df3 ), SHC( 0x9c87 ), SHC( 0x9b23 ), SHC( 0x99c7 ), SHC( 0x9873 ), SHC( 0x9727 ), + SHC( 0x95e3 ), SHC( 0x94a7 ), SHC( 0x9374 ), SHC( 0x9249 ), SHC( 0x9127 ), SHC( 0x900d ), SHC( 0x8efc ), SHC( 0x8df4 ), + SHC( 0x8cf5 ), SHC( 0x8bff ), SHC( 0x8b11 ), SHC( 0x8a2d ), SHC( 0x8953 ), SHC( 0x8881 ), SHC( 0x87b9 ), SHC( 0x86fa ), + SHC( 0x8644 ), SHC( 0x8598 ), SHC( 0x84f6 ), SHC( 0x845d ), SHC( 0x83ce ), SHC( 0x8348 ), SHC( 0x82cd ), SHC( 0x825b ), + SHC( 0x81f2 ), SHC( 0x8194 ), SHC( 0x813f ), SHC( 0x80f5 ), SHC( 0x80b4 ), SHC( 0x807d ), SHC( 0x8050 ), SHC( 0x802d ), + SHC( 0x8014 ), SHC( 0x8005 ), SHC( 0x8000 ), SHC( 0x8005 ), SHC( 0x8014 ), SHC( 0x802d ), SHC( 0x8050 ), SHC( 0x807d ), + SHC( 0x80b4 ), SHC( 0x80f5 ), SHC( 0x813f ), SHC( 0x8194 ), SHC( 0x81f2 ), SHC( 0x825b ), SHC( 0x82cd ), SHC( 0x8348 ), + SHC( 0x83ce ), SHC( 0x845d ), SHC( 0x84f6 ), SHC( 0x8598 ), SHC( 0x8644 ), SHC( 0x86fa ), SHC( 0x87b9 ), SHC( 0x8881 ), + SHC( 0x8953 ), SHC( 0x8a2d ), SHC( 0x8b11 ), SHC( 0x8bff ), SHC( 0x8cf5 ), SHC( 0x8df4 ), SHC( 0x8efc ), SHC( 0x900d ), + SHC( 0x9127 ), SHC( 0x9249 ), SHC( 0x9374 ), SHC( 0x94a7 ), SHC( 0x95e3 ), SHC( 0x9727 ), SHC( 0x9873 ), SHC( 0x99c7 ), + SHC( 0x9b23 ), SHC( 0x9c87 ), SHC( 0x9df3 ), SHC( 0x9f66 ), SHC( 0xa0e1 ), SHC( 0xa264 ), SHC( 0xa3ed ), SHC( 0xa57e ), + SHC( 0xa716 ), SHC( 0xa8b5 ), SHC( 0xaa5a ), SHC( 0xac07 ), SHC( 0xadba ), SHC( 0xaf73 ), SHC( 0xb133 ), SHC( 0xb2f8 ), + SHC( 0xb4c4 ), SHC( 0xb696 ), SHC( 0xb86d ), SHC( 0xba4a ), SHC( 0xbc2c ), SHC( 0xbe14 ), SHC( 0xc001 ), SHC( 0xc1f2 ), + SHC( 0xc3e9 ), SHC( 0xc5e4 ), SHC( 0xc7e4 ), SHC( 0xc9e8 ), SHC( 0xcbf1 ), SHC( 0xcdfd ), SHC( 0xd00d ), SHC( 0xd221 ), + SHC( 0xd439 ), SHC( 0xd654 ), SHC( 0xd873 ), SHC( 0xda94 ), SHC( 0xdcb8 ), SHC( 0xdee0 ), SHC( 0xe109 ), SHC( 0xe335 ), + SHC( 0xe564 ), SHC( 0xe794 ), SHC( 0xe9c6 ), SHC( 0xebfa ), SHC( 0xee30 ), SHC( 0xf067 ), SHC( 0xf29f ), SHC( 0xf4d9 ), + SHC( 0xf713 ), SHC( 0xf94e ), SHC( 0xfb89 ), SHC( 0xfdc5 ), SHC( 0x0000 ), SHC( 0x023b ), SHC( 0x0477 ), SHC( 0x06b2 ), + SHC( 0x08ed ), SHC( 0x0b27 ), SHC( 0x0d61 ), SHC( 0x0f99 ), SHC( 0x11d0 ), SHC( 0x1406 ), SHC( 0x163a ), SHC( 0x186c ), + SHC( 0x1a9c ), SHC( 0x1ccb ), SHC( 0x1ef7 ), SHC( 0x2120 ), SHC( 0x2348 ), SHC( 0x256c ), SHC( 0x278d ), SHC( 0x29ac ), + SHC( 0x2bc7 ), SHC( 0x2ddf ), SHC( 0x2ff3 ), SHC( 0x3203 ), SHC( 0x340f ), SHC( 0x3618 ), SHC( 0x381c ), SHC( 0x3a1c ), + SHC( 0x3c17 ), SHC( 0x3e0e ), SHC( 0x3fff ), SHC( 0x41ec ), SHC( 0x43d4 ), SHC( 0x45b6 ), SHC( 0x4793 ), SHC( 0x496a ), + SHC( 0x4b3c ), SHC( 0x4d08 ), SHC( 0x4ecd ), SHC( 0x508d ), SHC( 0x5246 ), SHC( 0x53f9 ), SHC( 0x55a6 ), SHC( 0x574b ), + SHC( 0x58ea ), SHC( 0x5a82 ), SHC( 0x5c13 ), SHC( 0x5d9c ), SHC( 0x5f1f ), SHC( 0x609a ), SHC( 0x620d ), SHC( 0x6379 ), + SHC( 0x64dd ), SHC( 0x6639 ), SHC( 0x678d ), SHC( 0x68d9 ), SHC( 0x6a1d ), SHC( 0x6b59 ), SHC( 0x6c8c ), SHC( 0x6db7 ), + SHC( 0x6ed9 ), SHC( 0x6ff3 ), SHC( 0x7104 ), SHC( 0x720c ), SHC( 0x730b ), SHC( 0x7401 ), SHC( 0x74ef ), SHC( 0x75d3 ), + SHC( 0x76ad ), SHC( 0x777f ), SHC( 0x7847 ), SHC( 0x7906 ), SHC( 0x79bc ), SHC( 0x7a68 ), SHC( 0x7b0a ), SHC( 0x7ba3 ), + SHC( 0x7c32 ), SHC( 0x7cb8 ), SHC( 0x7d33 ), SHC( 0x7da5 ), SHC( 0x7e0e ), SHC( 0x7e6c ), SHC( 0x7ec1 ), SHC( 0x7f0b ), + SHC( 0x7f4c ), SHC( 0x7f83 ), SHC( 0x7fb0 ), SHC( 0x7fd3 ), SHC( 0x7fec ), SHC( 0x7ffb ), SHC( 0x7fff ), SHC( 0x7ffb ), + SHC( 0x7fec ), SHC( 0x7fd3 ), SHC( 0x7fb0 ), SHC( 0x7f83 ), SHC( 0x7f4c ), SHC( 0x7f0b ), SHC( 0x7ec1 ), SHC( 0x7e6c ), + SHC( 0x7e0e ), SHC( 0x7da5 ), SHC( 0x7d33 ), SHC( 0x7cb8 ), SHC( 0x7c32 ), SHC( 0x7ba3 ), SHC( 0x7b0a ), SHC( 0x7a68 ), + SHC( 0x79bc ), SHC( 0x7906 ), SHC( 0x7847 ), SHC( 0x777f ), SHC( 0x76ad ), SHC( 0x75d3 ), SHC( 0x74ef ), SHC( 0x7401 ), + SHC( 0x730b ), SHC( 0x720c ), SHC( 0x7104 ), SHC( 0x6ff3 ), SHC( 0x6ed9 ), SHC( 0x6db7 ), SHC( 0x6c8c ), SHC( 0x6b59 ), + SHC( 0x6a1d ), SHC( 0x68d9 ), SHC( 0x678d ), SHC( 0x6639 ), SHC( 0x64dd ), SHC( 0x6379 ), SHC( 0x620d ), SHC( 0x609a ), + SHC( 0x5f1f ), SHC( 0x5d9c ), SHC( 0x5c13 ), SHC( 0x5a82 ), SHC( 0x58ea ), SHC( 0x574b ), SHC( 0x55a6 ), SHC( 0x53f9 ), + SHC( 0x5246 ), SHC( 0x508d ), SHC( 0x4ecd ), SHC( 0x4d08 ), SHC( 0x4b3c ), SHC( 0x496a ), SHC( 0x4793 ), SHC( 0x45b6 ), + SHC( 0x43d4 ), SHC( 0x41ec ), SHC( 0x3fff ), SHC( 0x3e0e ), SHC( 0x3c17 ), SHC( 0x3a1c ), SHC( 0x381c ), SHC( 0x3618 ), + SHC( 0x340f ), SHC( 0x3203 ), SHC( 0x2ff3 ), SHC( 0x2ddf ), SHC( 0x2bc7 ), SHC( 0x29ac ), SHC( 0x278d ), SHC( 0x256c ), + SHC( 0x2348 ), SHC( 0x2120 ), SHC( 0x1ef7 ), SHC( 0x1ccb ), SHC( 0x1a9c ), SHC( 0x186c ), SHC( 0x163a ), SHC( 0x1406 ), + SHC( 0x11d0 ), SHC( 0x0f99 ), SHC( 0x0d61 ), SHC( 0x0b27 ), SHC( 0x08ed ), SHC( 0x06b2 ), SHC( 0x0477 ), SHC( 0x023b ), + SHC( 0x0000 ) + +}; + +/* Tables required in edxt_fx() */ +const Word16 sin_scale_tbl_960[960] = /* Q15 */ + { + 0, 53, 107, 160, 214, + 268, 321, 375, 428, 482, + 536, 589, 643, 696, 750, + 804, 857, 911, 964, 1018, + 1072, 1125, 1179, 1232, 1286, + 1339, 1393, 1447, 1500, 1554, + 1607, 1661, 1714, 1768, 1821, + 1875, 1929, 1982, 2036, 2089, + 2143, 2196, 2250, 2303, 2357, + 2410, 2463, 2517, 2570, 2624, + 2677, 2731, 2784, 2838, 2891, + 2944, 2998, 3051, 3104, 3158, + 3211, 3265, 3318, 3371, 3425, + 3478, 3531, 3585, 3638, 3691, + 3744, 3798, 3851, 3904, 3957, + 4011, 4064, 4117, 4170, 4223, + 4276, 4330, 4383, 4436, 4489, + 4542, 4595, 4648, 4701, 4754, + 4807, 4860, 4913, 4966, 5019, + 5072, 5125, 5178, 5231, 5284, + 5337, 5390, 5443, 5496, 5549, + 5601, 5654, 5707, 5760, 5813, + 5865, 5918, 5971, 6024, 6076, + 6129, 6182, 6234, 6287, 6339, + 6392, 6445, 6497, 6550, 6602, + 6655, 6707, 6760, 6812, 6865, + 6917, 6969, 7022, 7074, 7126, + 7179, 7231, 7283, 7336, 7388, + 7440, 7492, 7544, 7597, 7649, + 7701, 7753, 7805, 7857, 7909, + 7961, 8013, 8065, 8117, 8169, + 8221, 8273, 8325, 8377, 8428, + 8480, 8532, 8584, 8635, 8687, + 8739, 8791, 8842, 8894, 8945, + 8997, 9048, 9100, 9151, 9203, + 9254, 9306, 9357, 9409, 9460, + 9511, 9563, 9614, 9665, 9716, + 9767, 9819, 9870, 9921, 9972, + 10023, 10074, 10125, 10176, 10227, + 10278, 10329, 10380, 10431, 10481, + 10532, 10583, 10634, 10684, 10735, + 10786, 10836, 10887, 10937, 10988, + 11038, 11089, 11139, 11190, 11240, + 11290, 11341, 11391, 11441, 11491, + 11542, 11592, 11642, 11692, 11742, + 11792, 11842, 11892, 11942, 11992, + 12042, 12092, 12142, 12191, 12241, + 12291, 12340, 12390, 12440, 12489, + 12539, 12588, 12638, 12687, 12737, + 12786, 12835, 12885, 12934, 12983, + 13033, 13082, 13131, 13180, 13229, + 13278, 13327, 13376, 13425, 13474, + 13523, 13571, 13620, 13669, 13718, + 13766, 13815, 13864, 13912, 13961, + 14009, 14058, 14106, 14154, 14203, + 14251, 14299, 14348, 14396, 14444, + 14492, 14540, 14588, 14636, 14684, + 14732, 14780, 14828, 14875, 14923, + 14971, 15019, 15066, 15114, 15161, + 15209, 15256, 15304, 15351, 15398, + 15446, 15493, 15540, 15587, 15635, + 15682, 15729, 15776, 15823, 15870, + 15917, 15963, 16010, 16057, 16104, + 16150, 16197, 16244, 16290, 16337, + 16383, 16429, 16476, 16522, 16568, + 16615, 16661, 16707, 16753, 16799, + 16845, 16891, 16937, 16983, 17029, + 17074, 17120, 17166, 17212, 17257, + 17303, 17348, 17394, 17439, 17484, + 17530, 17575, 17620, 17665, 17711, + 17756, 17801, 17846, 17891, 17936, + 17980, 18025, 18070, 18115, 18159, + 18204, 18248, 18293, 18337, 18382, + 18426, 18470, 18515, 18559, 18603, + 18647, 18691, 18735, 18779, 18823, + 18867, 18911, 18955, 18998, 19042, + 19086, 19129, 19173, 19216, 19259, + 19303, 19346, 19389, 19433, 19476, + 19519, 19562, 19605, 19648, 19691, + 19733, 19776, 19819, 19862, 19904, + 19947, 19989, 20032, 20074, 20116, + 20159, 20201, 20243, 20285, 20327, + 20369, 20411, 20453, 20495, 20537, + 20579, 20620, 20662, 20704, 20745, + 20787, 20828, 20869, 20911, 20952, + 20993, 21034, 21075, 21116, 21157, + 21198, 21239, 21280, 21321, 21361, + 21402, 21443, 21483, 21524, 21564, + 21604, 21645, 21685, 21725, 21765, + 21805, 21845, 21885, 21925, 21965, + 22004, 22044, 22084, 22123, 22163, + 22202, 22242, 22281, 22320, 22360, + 22399, 22438, 22477, 22516, 22555, + 22594, 22632, 22671, 22710, 22749, + 22787, 22826, 22864, 22902, 22941, + 22979, 23017, 23055, 23093, 23131, + 23169, 23207, 23245, 23283, 23320, + 23358, 23396, 23433, 23471, 23508, + 23545, 23583, 23620, 23657, 23694, + 23731, 23768, 23805, 23842, 23878, + 23915, 23952, 23988, 24025, 24061, + 24097, 24134, 24170, 24206, 24242, + 24278, 24314, 24350, 24386, 24422, + 24457, 24493, 24529, 24564, 24600, + 24635, 24670, 24706, 24741, 24776, + 24811, 24846, 24881, 24916, 24951, + 24985, 25020, 25054, 25089, 25123, + 25158, 25192, 25226, 25261, 25295, + 25329, 25363, 25397, 25430, 25464, + 25498, 25532, 25565, 25599, 25632, + 25665, 25699, 25732, 25765, 25798, + 25831, 25864, 25897, 25930, 25963, + 25995, 26028, 26060, 26093, 26125, + 26158, 26190, 26222, 26254, 26286, + 26318, 26350, 26382, 26414, 26445, + 26477, 26509, 26540, 26571, 26603, + 26634, 26665, 26696, 26727, 26758, + 26789, 26820, 26851, 26882, 26912, + 26943, 26973, 27004, 27034, 27064, + 27094, 27125, 27155, 27185, 27214, + 27244, 27274, 27304, 27333, 27363, + 27392, 27422, 27451, 27480, 27509, + 27538, 27567, 27596, 27625, 27654, + 27683, 27711, 27740, 27769, 27797, + 27825, 27854, 27882, 27910, 27938, + 27966, 27994, 28022, 28049, 28077, + 28105, 28132, 28160, 28187, 28214, + 28242, 28269, 28296, 28323, 28350, + 28377, 28403, 28430, 28457, 28483, + 28510, 28536, 28562, 28589, 28615, + 28641, 28667, 28693, 28719, 28744, + 28770, 28796, 28821, 28847, 28872, + 28897, 28923, 28948, 28973, 28998, + 29023, 29048, 29072, 29097, 29122, + 29146, 29171, 29195, 29219, 29244, + 29268, 29292, 29316, 29340, 29364, + 29387, 29411, 29435, 29458, 29482, + 29505, 29528, 29551, 29575, 29598, + 29621, 29643, 29666, 29689, 29712, + 29734, 29757, 29779, 29801, 29824, + 29846, 29868, 29890, 29912, 29934, + 29955, 29977, 29999, 30020, 30042, + 30063, 30084, 30106, 30127, 30148, + 30169, 30190, 30210, 30231, 30252, + 30272, 30293, 30313, 30333, 30354, + 30374, 30394, 30414, 30434, 30454, + 30473, 30493, 30513, 30532, 30552, + 30571, 30590, 30609, 30628, 30647, + 30666, 30685, 30704, 30723, 30741, + 30760, 30778, 30797, 30815, 30833, + 30851, 30869, 30887, 30905, 30923, + 30940, 30958, 30975, 30993, 31010, + 31028, 31045, 31062, 31079, 31096, + 31113, 31129, 31146, 31163, 31179, + 31196, 31212, 31228, 31245, 31261, + 31277, 31293, 31308, 31324, 31340, + 31356, 31371, 31387, 31402, 31417, + 31432, 31447, 31462, 31477, 31492, + 31507, 31522, 31536, 31551, 31565, + 31580, 31594, 31608, 31622, 31636, + 31650, 31664, 31678, 31691, 31705, + 31718, 31732, 31745, 31758, 31771, + 31785, 31797, 31810, 31823, 31836, + 31849, 31861, 31874, 31886, 31898, + 31911, 31923, 31935, 31947, 31959, + 31970, 31982, 31994, 32005, 32017, + 32028, 32039, 32050, 32062, 32073, + 32084, 32094, 32105, 32116, 32126, + 32137, 32147, 32158, 32168, 32178, + 32188, 32198, 32208, 32218, 32228, + 32237, 32247, 32256, 32266, 32275, + 32284, 32293, 32302, 32311, 32320, + 32329, 32338, 32346, 32355, 32363, + 32371, 32380, 32388, 32396, 32404, + 32412, 32420, 32427, 32435, 32443, + 32450, 32457, 32465, 32472, 32479, + 32486, 32493, 32500, 32507, 32513, + 32520, 32527, 32533, 32539, 32546, + 32552, 32558, 32564, 32570, 32576, + 32581, 32587, 32593, 32598, 32603, + 32609, 32614, 32619, 32624, 32629, + 32634, 32639, 32643, 32648, 32652, + 32657, 32661, 32665, 32670, 32674, + 32678, 32682, 32685, 32689, 32693, + 32696, 32700, 32703, 32706, 32710, + 32713, 32716, 32719, 32722, 32724, + 32727, 32730, 32732, 32735, 32737, + 32739, 32741, 32743, 32745, 32747, + 32749, 32751, 32752, 32754, 32755, + 32757, 32758, 32759, 32760, 32761, + 32762, 32763, 32764, 32764, 32765, + 32765, 32766, 32766, 32766, 32766 + }; + +const Word16 cos_scale_tbl_960[960] = /* Q15 */ + { + 32767, 32766, 32766, 32766, 32766, + 32765, 32765, 32764, 32764, 32763, + 32762, 32761, 32760, 32759, 32758, + 32757, 32755, 32754, 32752, 32751, + 32749, 32747, 32745, 32743, 32741, + 32739, 32737, 32735, 32732, 32730, + 32727, 32724, 32722, 32719, 32716, + 32713, 32710, 32706, 32703, 32700, + 32696, 32693, 32689, 32685, 32682, + 32678, 32674, 32670, 32665, 32661, + 32657, 32652, 32648, 32643, 32639, + 32634, 32629, 32624, 32619, 32614, + 32609, 32603, 32598, 32593, 32587, + 32581, 32576, 32570, 32564, 32558, + 32552, 32546, 32539, 32533, 32527, + 32520, 32513, 32507, 32500, 32493, + 32486, 32479, 32472, 32465, 32457, + 32450, 32443, 32435, 32427, 32420, + 32412, 32404, 32396, 32388, 32380, + 32371, 32363, 32355, 32346, 32338, + 32329, 32320, 32311, 32302, 32293, + 32284, 32275, 32266, 32256, 32247, + 32237, 32228, 32218, 32208, 32198, + 32188, 32178, 32168, 32158, 32147, + 32137, 32126, 32116, 32105, 32094, + 32084, 32073, 32062, 32050, 32039, + 32028, 32017, 32005, 31994, 31982, + 31970, 31959, 31947, 31935, 31923, + 31911, 31898, 31886, 31874, 31861, + 31849, 31836, 31823, 31810, 31797, + 31785, 31771, 31758, 31745, 31732, + 31718, 31705, 31691, 31678, 31664, + 31650, 31636, 31622, 31608, 31594, + 31580, 31565, 31551, 31536, 31522, + 31507, 31492, 31477, 31462, 31447, + 31432, 31417, 31402, 31387, 31371, + 31356, 31340, 31324, 31308, 31293, + 31277, 31261, 31245, 31228, 31212, + 31196, 31179, 31163, 31146, 31129, + 31113, 31096, 31079, 31062, 31045, + 31028, 31010, 30993, 30975, 30958, + 30940, 30923, 30905, 30887, 30869, + 30851, 30833, 30815, 30797, 30778, + 30760, 30741, 30723, 30704, 30685, + 30666, 30647, 30628, 30609, 30590, + 30571, 30552, 30532, 30513, 30493, + 30473, 30454, 30434, 30414, 30394, + 30374, 30354, 30333, 30313, 30293, + 30272, 30252, 30231, 30210, 30190, + 30169, 30148, 30127, 30106, 30084, + 30063, 30042, 30020, 29999, 29977, + 29955, 29934, 29912, 29890, 29868, + 29846, 29824, 29801, 29779, 29757, + 29734, 29712, 29689, 29666, 29643, + 29621, 29598, 29575, 29551, 29528, + 29505, 29482, 29458, 29435, 29411, + 29387, 29364, 29340, 29316, 29292, + 29268, 29244, 29219, 29195, 29171, + 29146, 29122, 29097, 29072, 29048, + 29023, 28998, 28973, 28948, 28923, + 28897, 28872, 28847, 28821, 28796, + 28770, 28744, 28719, 28693, 28667, + 28641, 28615, 28589, 28562, 28536, + 28510, 28483, 28457, 28430, 28403, + 28377, 28350, 28323, 28296, 28269, + 28242, 28214, 28187, 28160, 28132, + 28105, 28077, 28049, 28022, 27994, + 27966, 27938, 27910, 27882, 27854, + 27825, 27797, 27769, 27740, 27711, + 27683, 27654, 27625, 27596, 27567, + 27538, 27509, 27480, 27451, 27422, + 27392, 27363, 27333, 27304, 27274, + 27244, 27214, 27185, 27155, 27125, + 27094, 27064, 27034, 27004, 26973, + 26943, 26912, 26882, 26851, 26820, + 26789, 26758, 26727, 26696, 26665, + 26634, 26603, 26571, 26540, 26509, + 26477, 26445, 26414, 26382, 26350, + 26318, 26286, 26254, 26222, 26190, + 26158, 26125, 26093, 26060, 26028, + 25995, 25963, 25930, 25897, 25864, + 25831, 25798, 25765, 25732, 25699, + 25665, 25632, 25599, 25565, 25532, + 25498, 25464, 25430, 25397, 25363, + 25329, 25295, 25261, 25226, 25192, + 25158, 25123, 25089, 25054, 25020, + 24985, 24951, 24916, 24881, 24846, + 24811, 24776, 24741, 24706, 24670, + 24635, 24600, 24564, 24529, 24493, + 24457, 24422, 24386, 24350, 24314, + 24278, 24242, 24206, 24170, 24134, + 24097, 24061, 24025, 23988, 23952, + 23915, 23878, 23842, 23805, 23768, + 23731, 23694, 23657, 23620, 23583, + 23545, 23508, 23471, 23433, 23396, + 23358, 23320, 23283, 23245, 23207, + 23169, 23131, 23093, 23055, 23017, + 22979, 22941, 22902, 22864, 22826, + 22787, 22749, 22710, 22671, 22632, + 22594, 22555, 22516, 22477, 22438, + 22399, 22360, 22320, 22281, 22242, + 22202, 22163, 22123, 22084, 22044, + 22004, 21965, 21925, 21885, 21845, + 21805, 21765, 21725, 21685, 21645, + 21604, 21564, 21524, 21483, 21443, + 21402, 21361, 21321, 21280, 21239, + 21198, 21157, 21116, 21075, 21034, + 20993, 20952, 20911, 20869, 20828, + 20787, 20745, 20704, 20662, 20620, + 20579, 20537, 20495, 20453, 20411, + 20369, 20327, 20285, 20243, 20201, + 20159, 20116, 20074, 20032, 19989, + 19947, 19904, 19862, 19819, 19776, + 19733, 19691, 19648, 19605, 19562, + 19519, 19476, 19433, 19389, 19346, + 19303, 19259, 19216, 19173, 19129, + 19086, 19042, 18998, 18955, 18911, + 18867, 18823, 18779, 18735, 18691, + 18647, 18603, 18559, 18515, 18470, + 18426, 18382, 18337, 18293, 18248, + 18204, 18159, 18115, 18070, 18025, + 17980, 17936, 17891, 17846, 17801, + 17756, 17711, 17665, 17620, 17575, + 17530, 17484, 17439, 17394, 17348, + 17303, 17257, 17212, 17166, 17120, + 17074, 17029, 16983, 16937, 16891, + 16845, 16799, 16753, 16707, 16661, + 16615, 16568, 16522, 16476, 16429, + 16383, 16337, 16290, 16244, 16197, + 16150, 16104, 16057, 16010, 15963, + 15917, 15870, 15823, 15776, 15729, + 15682, 15635, 15587, 15540, 15493, + 15446, 15398, 15351, 15304, 15256, + 15209, 15161, 15114, 15066, 15019, + 14971, 14923, 14875, 14828, 14780, + 14732, 14684, 14636, 14588, 14540, + 14492, 14444, 14396, 14348, 14299, + 14251, 14203, 14154, 14106, 14058, + 14009, 13961, 13912, 13864, 13815, + 13766, 13718, 13669, 13620, 13571, + 13523, 13474, 13425, 13376, 13327, + 13278, 13229, 13180, 13131, 13082, + 13033, 12983, 12934, 12885, 12835, + 12786, 12737, 12687, 12638, 12588, + 12539, 12489, 12440, 12390, 12340, + 12291, 12241, 12191, 12142, 12092, + 12042, 11992, 11942, 11892, 11842, + 11792, 11742, 11692, 11642, 11592, + 11542, 11491, 11441, 11391, 11341, + 11290, 11240, 11190, 11139, 11089, + 11038, 10988, 10937, 10887, 10836, + 10786, 10735, 10684, 10634, 10583, + 10532, 10481, 10431, 10380, 10329, + 10278, 10227, 10176, 10125, 10074, + 10023, 9972, 9921, 9870, 9819, + 9767, 9716, 9665, 9614, 9563, + 9511, 9460, 9409, 9357, 9306, + 9254, 9203, 9151, 9100, 9048, + 8997, 8945, 8894, 8842, 8791, + 8739, 8687, 8635, 8584, 8532, + 8480, 8428, 8377, 8325, 8273, + 8221, 8169, 8117, 8065, 8013, + 7961, 7909, 7857, 7805, 7753, + 7701, 7649, 7597, 7544, 7492, + 7440, 7388, 7336, 7283, 7231, + 7179, 7126, 7074, 7022, 6969, + 6917, 6865, 6812, 6760, 6707, + 6655, 6602, 6550, 6497, 6445, + 6392, 6339, 6287, 6234, 6182, + 6129, 6076, 6024, 5971, 5918, + 5865, 5813, 5760, 5707, 5654, + 5601, 5549, 5496, 5443, 5390, + 5337, 5284, 5231, 5178, 5125, + 5072, 5019, 4966, 4913, 4860, + 4807, 4754, 4701, 4648, 4595, + 4542, 4489, 4436, 4383, 4330, + 4276, 4223, 4170, 4117, 4064, + 4011, 3957, 3904, 3851, 3798, + 3744, 3691, 3638, 3585, 3531, + 3478, 3425, 3371, 3318, 3265, + 3211, 3158, 3104, 3051, 2998, + 2944, 2891, 2838, 2784, 2731, + 2677, 2624, 2570, 2517, 2463, + 2410, 2357, 2303, 2250, 2196, + 2143, 2089, 2036, 1982, 1929, + 1875, 1821, 1768, 1714, 1661, + 1607, 1554, 1500, 1447, 1393, + 1339, 1286, 1232, 1179, 1125, + 1072, 1018, 964, 911, 857, + 804, 750, 696, 643, 589, + 536, 482, 428, 375, 321, + 268, 214, 160, 107, 53 + }; + +const Word16 cos_scale_tbl_640[640] = /* Q15 */ + { + 32767, 32766, 32766, 32766, 32765, + 32764, 32763, 32762, 32760, 32759, + 32757, 32755, 32752, 32750, 32747, + 32744, 32741, 32738, 32735, 32731, + 32727, 32723, 32719, 32714, 32710, + 32705, 32700, 32695, 32689, 32684, + 32678, 32672, 32665, 32659, 32652, + 32646, 32639, 32631, 32624, 32617, + 32609, 32601, 32593, 32584, 32576, + 32567, 32558, 32549, 32539, 32530, + 32520, 32510, 32500, 32490, 32479, + 32468, 32457, 32446, 32435, 32424, + 32412, 32400, 32388, 32376, 32363, + 32350, 32338, 32324, 32311, 32298, + 32284, 32270, 32256, 32242, 32228, + 32213, 32198, 32183, 32168, 32152, + 32137, 32121, 32105, 32089, 32073, + 32056, 32039, 32022, 32005, 31988, + 31970, 31953, 31935, 31917, 31898, + 31880, 31861, 31842, 31823, 31804, + 31785, 31765, 31745, 31725, 31705, + 31684, 31664, 31643, 31622, 31601, + 31580, 31558, 31536, 31514, 31492, + 31470, 31447, 31425, 31402, 31379, + 31356, 31332, 31308, 31285, 31261, + 31236, 31212, 31188, 31163, 31138, + 31113, 31087, 31062, 31036, 31010, + 30984, 30958, 30932, 30905, 30878, + 30851, 30824, 30797, 30769, 30741, + 30713, 30685, 30657, 30628, 30600, + 30571, 30542, 30513, 30483, 30454, + 30424, 30394, 30364, 30333, 30303, + 30272, 30241, 30210, 30179, 30148, + 30116, 30084, 30052, 30020, 29988, + 29955, 29923, 29890, 29857, 29824, + 29790, 29757, 29723, 29689, 29655, + 29621, 29586, 29551, 29517, 29482, + 29446, 29411, 29375, 29340, 29304, + 29268, 29232, 29195, 29159, 29122, + 29085, 29048, 29010, 28973, 28935, + 28897, 28859, 28821, 28783, 28744, + 28706, 28667, 28628, 28589, 28549, + 28510, 28470, 28430, 28390, 28350, + 28309, 28269, 28228, 28187, 28146, + 28105, 28063, 28022, 27980, 27938, + 27896, 27854, 27811, 27769, 27726, + 27683, 27640, 27596, 27553, 27509, + 27466, 27422, 27378, 27333, 27289, + 27244, 27200, 27155, 27109, 27064, + 27019, 26973, 26927, 26882, 26836, + 26789, 26743, 26696, 26650, 26603, + 26556, 26509, 26461, 26414, 26366, + 26318, 26270, 26222, 26174, 26125, + 26077, 26028, 25979, 25930, 25881, + 25831, 25782, 25732, 25682, 25632, + 25582, 25532, 25481, 25430, 25380, + 25329, 25278, 25226, 25175, 25123, + 25072, 25020, 24968, 24916, 24863, + 24811, 24758, 24706, 24653, 24600, + 24546, 24493, 24440, 24386, 24332, + 24278, 24224, 24170, 24116, 24061, + 24006, 23952, 23897, 23842, 23786, + 23731, 23675, 23620, 23564, 23508, + 23452, 23396, 23339, 23283, 23226, + 23169, 23112, 23055, 22998, 22941, + 22883, 22826, 22768, 22710, 22652, + 22594, 22535, 22477, 22418, 22360, + 22301, 22242, 22183, 22123, 22064, + 22004, 21945, 21885, 21825, 21765, + 21705, 21645, 21584, 21524, 21463, + 21402, 21341, 21280, 21219, 21157, + 21096, 21034, 20973, 20911, 20849, + 20787, 20724, 20662, 20600, 20537, + 20474, 20411, 20348, 20285, 20222, + 20159, 20095, 20032, 19968, 19904, + 19840, 19776, 19712, 19648, 19583, + 19519, 19454, 19389, 19324, 19259, + 19194, 19129, 19064, 18998, 18933, + 18867, 18801, 18735, 18669, 18603, + 18537, 18470, 18404, 18337, 18271, + 18204, 18137, 18070, 18003, 17936, + 17868, 17801, 17733, 17665, 17598, + 17530, 17462, 17394, 17325, 17257, + 17189, 17120, 17052, 16983, 16914, + 16845, 16776, 16707, 16638, 16568, + 16499, 16429, 16360, 16290, 16220, + 16150, 16080, 16010, 15940, 15870, + 15799, 15729, 15658, 15587, 15517, + 15446, 15375, 15304, 15233, 15161, + 15090, 15019, 14947, 14875, 14804, + 14732, 14660, 14588, 14516, 14444, + 14372, 14299, 14227, 14154, 14082, + 14009, 13936, 13864, 13791, 13718, + 13645, 13571, 13498, 13425, 13352, + 13278, 13204, 13131, 13057, 12983, + 12909, 12835, 12761, 12687, 12613, + 12539, 12465, 12390, 12316, 12241, + 12166, 12092, 12017, 11942, 11867, + 11792, 11717, 11642, 11567, 11491, + 11416, 11341, 11265, 11190, 11114, + 11038, 10963, 10887, 10811, 10735, + 10659, 10583, 10507, 10431, 10354, + 10278, 10202, 10125, 10049, 9972, + 9895, 9819, 9742, 9665, 9588, + 9511, 9434, 9357, 9280, 9203, + 9126, 9048, 8971, 8894, 8816, + 8739, 8661, 8584, 8506, 8428, + 8351, 8273, 8195, 8117, 8039, + 7961, 7883, 7805, 7727, 7649, + 7571, 7492, 7414, 7336, 7257, + 7179, 7100, 7022, 6943, 6865, + 6786, 6707, 6628, 6550, 6471, + 6392, 6313, 6234, 6155, 6076, + 5997, 5918, 5839, 5760, 5681, + 5601, 5522, 5443, 5364, 5284, + 5205, 5125, 5046, 4966, 4887, + 4807, 4728, 4648, 4569, 4489, + 4409, 4330, 4250, 4170, 4090, + 4011, 3931, 3851, 3771, 3691, + 3611, 3531, 3451, 3371, 3291, + 3211, 3131, 3051, 2971, 2891, + 2811, 2731, 2651, 2570, 2490, + 2410, 2330, 2250, 2169, 2089, + 2009, 1929, 1848, 1768, 1688, + 1607, 1527, 1447, 1366, 1286, + 1206, 1125, 1045, 964, 884, + 804, 723, 643, 562, 482, + 402, 321, 241, 160, 80 + }; + +const Word16 sin_scale_tbl_640[640] = /* Q15 */ + { + 0, 80, 160, 241, 321, + 402, 482, 562, 643, 723, + 804, 884, 964, 1045, 1125, + 1206, 1286, 1366, 1447, 1527, + 1607, 1688, 1768, 1848, 1929, + 2009, 2089, 2169, 2250, 2330, + 2410, 2490, 2570, 2651, 2731, + 2811, 2891, 2971, 3051, 3131, + 3211, 3291, 3371, 3451, 3531, + 3611, 3691, 3771, 3851, 3931, + 4011, 4090, 4170, 4250, 4330, + 4409, 4489, 4569, 4648, 4728, + 4807, 4887, 4966, 5046, 5125, + 5205, 5284, 5364, 5443, 5522, + 5601, 5681, 5760, 5839, 5918, + 5997, 6076, 6155, 6234, 6313, + 6392, 6471, 6550, 6628, 6707, + 6786, 6865, 6943, 7022, 7100, + 7179, 7257, 7336, 7414, 7492, + 7571, 7649, 7727, 7805, 7883, + 7961, 8039, 8117, 8195, 8273, + 8351, 8428, 8506, 8584, 8661, + 8739, 8816, 8894, 8971, 9048, + 9126, 9203, 9280, 9357, 9434, + 9511, 9588, 9665, 9742, 9819, + 9895, 9972, 10049, 10125, 10202, + 10278, 10354, 10431, 10507, 10583, + 10659, 10735, 10811, 10887, 10963, + 11038, 11114, 11190, 11265, 11341, + 11416, 11491, 11567, 11642, 11717, + 11792, 11867, 11942, 12017, 12092, + 12166, 12241, 12316, 12390, 12465, + 12539, 12613, 12687, 12761, 12835, + 12909, 12983, 13057, 13131, 13204, + 13278, 13352, 13425, 13498, 13571, + 13645, 13718, 13791, 13864, 13936, + 14009, 14082, 14154, 14227, 14299, + 14372, 14444, 14516, 14588, 14660, + 14732, 14804, 14875, 14947, 15019, + 15090, 15161, 15233, 15304, 15375, + 15446, 15517, 15587, 15658, 15729, + 15799, 15870, 15940, 16010, 16080, + 16150, 16220, 16290, 16360, 16429, + 16499, 16568, 16638, 16707, 16776, + 16845, 16914, 16983, 17052, 17120, + 17189, 17257, 17325, 17394, 17462, + 17530, 17598, 17665, 17733, 17801, + 17868, 17936, 18003, 18070, 18137, + 18204, 18271, 18337, 18404, 18470, + 18537, 18603, 18669, 18735, 18801, + 18867, 18933, 18998, 19064, 19129, + 19194, 19259, 19324, 19389, 19454, + 19519, 19583, 19648, 19712, 19776, + 19840, 19904, 19968, 20032, 20095, + 20159, 20222, 20285, 20348, 20411, + 20474, 20537, 20600, 20662, 20724, + 20787, 20849, 20911, 20973, 21034, + 21096, 21157, 21219, 21280, 21341, + 21402, 21463, 21524, 21584, 21645, + 21705, 21765, 21825, 21885, 21945, + 22004, 22064, 22123, 22183, 22242, + 22301, 22360, 22418, 22477, 22535, + 22594, 22652, 22710, 22768, 22826, + 22883, 22941, 22998, 23055, 23112, + 23169, 23226, 23283, 23339, 23396, + 23452, 23508, 23564, 23620, 23675, + 23731, 23786, 23842, 23897, 23952, + 24006, 24061, 24116, 24170, 24224, + 24278, 24332, 24386, 24440, 24493, + 24546, 24600, 24653, 24706, 24758, + 24811, 24863, 24916, 24968, 25020, + 25072, 25123, 25175, 25226, 25278, + 25329, 25380, 25430, 25481, 25532, + 25582, 25632, 25682, 25732, 25782, + 25831, 25881, 25930, 25979, 26028, + 26077, 26125, 26174, 26222, 26270, + 26318, 26366, 26414, 26461, 26509, + 26556, 26603, 26650, 26696, 26743, + 26789, 26836, 26882, 26927, 26973, + 27019, 27064, 27109, 27155, 27200, + 27244, 27289, 27333, 27378, 27422, + 27466, 27509, 27553, 27596, 27640, + 27683, 27726, 27769, 27811, 27854, + 27896, 27938, 27980, 28022, 28063, + 28105, 28146, 28187, 28228, 28269, + 28309, 28350, 28390, 28430, 28470, + 28510, 28549, 28589, 28628, 28667, + 28706, 28744, 28783, 28821, 28859, + 28897, 28935, 28973, 29010, 29048, + 29085, 29122, 29159, 29195, 29232, + 29268, 29304, 29340, 29375, 29411, + 29446, 29482, 29517, 29551, 29586, + 29621, 29655, 29689, 29723, 29757, + 29790, 29824, 29857, 29890, 29923, + 29955, 29988, 30020, 30052, 30084, + 30116, 30148, 30179, 30210, 30241, + 30272, 30303, 30333, 30364, 30394, + 30424, 30454, 30483, 30513, 30542, + 30571, 30600, 30628, 30657, 30685, + 30713, 30741, 30769, 30797, 30824, + 30851, 30878, 30905, 30932, 30958, + 30984, 31010, 31036, 31062, 31087, + 31113, 31138, 31163, 31188, 31212, + 31236, 31261, 31285, 31308, 31332, + 31356, 31379, 31402, 31425, 31447, + 31470, 31492, 31514, 31536, 31558, + 31580, 31601, 31622, 31643, 31664, + 31684, 31705, 31725, 31745, 31765, + 31785, 31804, 31823, 31842, 31861, + 31880, 31898, 31917, 31935, 31953, + 31970, 31988, 32005, 32022, 32039, + 32056, 32073, 32089, 32105, 32121, + 32137, 32152, 32168, 32183, 32198, + 32213, 32228, 32242, 32256, 32270, + 32284, 32298, 32311, 32324, 32338, + 32350, 32363, 32376, 32388, 32400, + 32412, 32424, 32435, 32446, 32457, + 32468, 32479, 32490, 32500, 32510, + 32520, 32530, 32539, 32549, 32558, + 32567, 32576, 32584, 32593, 32601, + 32609, 32617, 32624, 32631, 32639, + 32646, 32652, 32659, 32665, 32672, + 32678, 32684, 32689, 32695, 32700, + 32705, 32710, 32714, 32719, 32723, + 32727, 32731, 32735, 32738, 32741, + 32744, 32747, 32750, 32752, 32755, + 32757, 32759, 32760, 32762, 32763, + 32764, 32765, 32766, 32766, 32766 + }; + +const Word16 sin_scale_tbl_512[512] = /* Q15 */ + { + 0, 100, 201, 301, 402, + 502, 603, 703, 804, 904, + 1005, 1105, 1206, 1306, 1406, + 1507, 1607, 1708, 1808, 1908, + 2009, 2109, 2209, 2310, 2410, + 2510, 2610, 2711, 2811, 2911, + 3011, 3111, 3211, 3311, 3411, + 3511, 3611, 3711, 3811, 3911, + 4011, 4110, 4210, 4310, 4409, + 4509, 4608, 4708, 4807, 4907, + 5006, 5106, 5205, 5304, 5403, + 5502, 5601, 5700, 5799, 5898, + 5997, 6096, 6195, 6293, 6392, + 6491, 6589, 6688, 6786, 6884, + 6982, 7081, 7179, 7277, 7375, + 7473, 7571, 7668, 7766, 7864, + 7961, 8059, 8156, 8253, 8351, + 8448, 8545, 8642, 8739, 8836, + 8932, 9029, 9126, 9222, 9319, + 9415, 9511, 9607, 9703, 9799, + 9895, 9991, 10087, 10182, 10278, + 10373, 10469, 10564, 10659, 10754, + 10849, 10944, 11038, 11133, 11227, + 11322, 11416, 11510, 11604, 11698, + 11792, 11886, 11980, 12073, 12166, + 12260, 12353, 12446, 12539, 12632, + 12724, 12817, 12909, 13002, 13094, + 13186, 13278, 13370, 13462, 13553, + 13645, 13736, 13827, 13918, 14009, + 14100, 14191, 14281, 14372, 14462, + 14552, 14642, 14732, 14822, 14911, + 15001, 15090, 15179, 15268, 15357, + 15446, 15534, 15623, 15711, 15799, + 15887, 15975, 16063, 16150, 16238, + 16325, 16412, 16499, 16586, 16672, + 16759, 16845, 16931, 17017, 17103, + 17189, 17274, 17360, 17445, 17530, + 17615, 17699, 17784, 17868, 17952, + 18036, 18120, 18204, 18287, 18371, + 18454, 18537, 18620, 18702, 18785, + 18867, 18949, 19031, 19113, 19194, + 19276, 19357, 19438, 19519, 19599, + 19680, 19760, 19840, 19920, 20000, + 20079, 20159, 20238, 20317, 20396, + 20474, 20553, 20631, 20709, 20787, + 20864, 20942, 21019, 21096, 21173, + 21249, 21326, 21402, 21478, 21554, + 21629, 21705, 21780, 21855, 21930, + 22004, 22079, 22153, 22227, 22301, + 22374, 22448, 22521, 22594, 22666, + 22739, 22811, 22883, 22955, 23027, + 23098, 23169, 23240, 23311, 23382, + 23452, 23522, 23592, 23661, 23731, + 23800, 23869, 23938, 24006, 24075, + 24143, 24211, 24278, 24346, 24413, + 24480, 24546, 24613, 24679, 24745, + 24811, 24877, 24942, 25007, 25072, + 25136, 25201, 25265, 25329, 25392, + 25456, 25519, 25582, 25645, 25707, + 25769, 25831, 25893, 25954, 26016, + 26077, 26137, 26198, 26258, 26318, + 26378, 26437, 26497, 26556, 26615, + 26673, 26731, 26789, 26847, 26905, + 26962, 27019, 27076, 27132, 27188, + 27244, 27300, 27355, 27411, 27466, + 27520, 27575, 27629, 27683, 27736, + 27790, 27843, 27896, 27948, 28001, + 28053, 28105, 28156, 28208, 28259, + 28309, 28360, 28410, 28460, 28510, + 28559, 28608, 28657, 28706, 28754, + 28802, 28850, 28897, 28945, 28992, + 29038, 29085, 29131, 29177, 29222, + 29268, 29313, 29358, 29402, 29446, + 29490, 29534, 29577, 29621, 29663, + 29706, 29748, 29790, 29832, 29873, + 29915, 29955, 29996, 30036, 30076, + 30116, 30156, 30195, 30234, 30272, + 30311, 30349, 30386, 30424, 30461, + 30498, 30535, 30571, 30607, 30643, + 30678, 30713, 30748, 30783, 30817, + 30851, 30885, 30918, 30951, 30984, + 31017, 31049, 31081, 31113, 31144, + 31175, 31206, 31236, 31267, 31297, + 31326, 31356, 31385, 31413, 31442, + 31470, 31498, 31525, 31553, 31580, + 31606, 31633, 31659, 31684, 31710, + 31735, 31760, 31785, 31809, 31833, + 31856, 31880, 31903, 31926, 31948, + 31970, 31992, 32014, 32035, 32056, + 32077, 32097, 32117, 32137, 32156, + 32176, 32194, 32213, 32231, 32249, + 32267, 32284, 32301, 32318, 32334, + 32350, 32366, 32382, 32397, 32412, + 32426, 32441, 32455, 32468, 32482, + 32495, 32508, 32520, 32532, 32544, + 32556, 32567, 32578, 32588, 32599, + 32609, 32618, 32628, 32637, 32646, + 32654, 32662, 32670, 32678, 32685, + 32692, 32699, 32705, 32711, 32717, + 32722, 32727, 32732, 32736, 32740, + 32744, 32748, 32751, 32754, 32757, + 32759, 32761, 32763, 32764, 32765, + 32766, 32766 + }; + +const Word16 cos_scale_tbl_512[512] = /* Q15 */ + { + 32767, 32766, 32766, 32765, 32764, + 32763, 32761, 32759, 32757, 32754, + 32751, 32748, 32744, 32740, 32736, + 32732, 32727, 32722, 32717, 32711, + 32705, 32699, 32692, 32685, 32678, + 32670, 32662, 32654, 32646, 32637, + 32628, 32618, 32609, 32599, 32588, + 32578, 32567, 32556, 32544, 32532, + 32520, 32508, 32495, 32482, 32468, + 32455, 32441, 32426, 32412, 32397, + 32382, 32366, 32350, 32334, 32318, + 32301, 32284, 32267, 32249, 32231, + 32213, 32194, 32176, 32156, 32137, + 32117, 32097, 32077, 32056, 32035, + 32014, 31992, 31970, 31948, 31926, + 31903, 31880, 31856, 31833, 31809, + 31785, 31760, 31735, 31710, 31684, + 31659, 31633, 31606, 31580, 31553, + 31525, 31498, 31470, 31442, 31413, + 31385, 31356, 31326, 31297, 31267, + 31236, 31206, 31175, 31144, 31113, + 31081, 31049, 31017, 30984, 30951, + 30918, 30885, 30851, 30817, 30783, + 30748, 30713, 30678, 30643, 30607, + 30571, 30535, 30498, 30461, 30424, + 30386, 30349, 30311, 30272, 30234, + 30195, 30156, 30116, 30076, 30036, + 29996, 29955, 29915, 29873, 29832, + 29790, 29748, 29706, 29663, 29621, + 29577, 29534, 29490, 29446, 29402, + 29358, 29313, 29268, 29222, 29177, + 29131, 29085, 29038, 28992, 28945, + 28897, 28850, 28802, 28754, 28706, + 28657, 28608, 28559, 28510, 28460, + 28410, 28360, 28309, 28259, 28208, + 28156, 28105, 28053, 28001, 27948, + 27896, 27843, 27790, 27736, 27683, + 27629, 27575, 27520, 27466, 27411, + 27355, 27300, 27244, 27188, 27132, + 27076, 27019, 26962, 26905, 26847, + 26789, 26731, 26673, 26615, 26556, + 26497, 26437, 26378, 26318, 26258, + 26198, 26137, 26077, 26016, 25954, + 25893, 25831, 25769, 25707, 25645, + 25582, 25519, 25456, 25392, 25329, + 25265, 25201, 25136, 25072, 25007, + 24942, 24877, 24811, 24745, 24679, + 24613, 24546, 24480, 24413, 24346, + 24278, 24211, 24143, 24075, 24006, + 23938, 23869, 23800, 23731, 23661, + 23592, 23522, 23452, 23382, 23311, + 23240, 23169, 23098, 23027, 22955, + 22883, 22811, 22739, 22666, 22594, + 22521, 22448, 22374, 22301, 22227, + 22153, 22079, 22004, 21930, 21855, + 21780, 21705, 21629, 21554, 21478, + 21402, 21326, 21249, 21173, 21096, + 21019, 20942, 20864, 20787, 20709, + 20631, 20553, 20474, 20396, 20317, + 20238, 20159, 20079, 20000, 19920, + 19840, 19760, 19680, 19599, 19519, + 19438, 19357, 19276, 19194, 19113, + 19031, 18949, 18867, 18785, 18702, + 18620, 18537, 18454, 18371, 18287, + 18204, 18120, 18036, 17952, 17868, + 17784, 17699, 17615, 17530, 17445, + 17360, 17274, 17189, 17103, 17017, + 16931, 16845, 16759, 16672, 16586, + 16499, 16412, 16325, 16238, 16150, + 16063, 15975, 15887, 15799, 15711, + 15623, 15534, 15446, 15357, 15268, + 15179, 15090, 15001, 14911, 14822, + 14732, 14642, 14552, 14462, 14372, + 14281, 14191, 14100, 14009, 13918, + 13827, 13736, 13645, 13553, 13462, + 13370, 13278, 13186, 13094, 13002, + 12909, 12817, 12724, 12632, 12539, + 12446, 12353, 12260, 12166, 12073, + 11980, 11886, 11792, 11698, 11604, + 11510, 11416, 11322, 11227, 11133, + 11038, 10944, 10849, 10754, 10659, + 10564, 10469, 10373, 10278, 10182, + 10087, 9991, 9895, 9799, 9703, + 9607, 9511, 9415, 9319, 9222, + 9126, 9029, 8932, 8836, 8739, + 8642, 8545, 8448, 8351, 8253, + 8156, 8059, 7961, 7864, 7766, + 7668, 7571, 7473, 7375, 7277, + 7179, 7081, 6982, 6884, 6786, + 6688, 6589, 6491, 6392, 6293, + 6195, 6096, 5997, 5898, 5799, + 5700, 5601, 5502, 5403, 5304, + 5205, 5106, 5006, 4907, 4807, + 4708, 4608, 4509, 4409, 4310, + 4210, 4110, 4011, 3911, 3811, + 3711, 3611, 3511, 3411, 3311, + 3211, 3111, 3011, 2911, 2811, + 2711, 2610, 2510, 2410, 2310, + 2209, 2109, 2009, 1908, 1808, + 1708, 1607, 1507, 1406, 1306, + 1206, 1105, 1005, 904, 804, + 703, 603, 502, 402, 301, + 201, 100 + }; + +const Word16 sin_scale_tbl_1200[1200] = { /* Q15 */ + 0, 42, 85, 128, 171, 214, 257, 300, + 343, 386, 428, 471, 514, 557, 600, 643, + 686, 729, 771, 814, 857, 900, 943, 986, + 1029, 1072, 1114, 1157, 1200, 1243, 1286, 1329, + 1372, 1414, 1457, 1500, 1543, 1586, 1629, 1672, + 1714, 1757, 1800, 1843, 1886, 1929, 1971, 2014, + 2057, 2100, 2143, 2185, 2228, 2271, 2314, 2357, + 2399, 2442, 2485, 2528, 2570, 2613, 2656, 2699, + 2741, 2784, 2827, 2870, 2912, 2955, 2998, 3040, + 3083, 3126, 3169, 3211, 3254, 3297, 3339, 3382, + 3425, 3467, 3510, 3553, 3595, 3638, 3680, 3723, + 3766, 3808, 3851, 3893, 3936, 3979, 4021, 4064, + 4106, 4149, 4191, 4234, 4276, 4319, 4361, 4404, + 4446, 4489, 4531, 4574, 4616, 4659, 4701, 4744, + 4786, 4829, 4871, 4913, 4956, 4998, 5041, 5083, + 5125, 5168, 5210, 5252, 5295, 5337, 5379, 5422, + 5464, 5506, 5549, 5591, 5633, 5675, 5718, 5760, + 5802, 5844, 5886, 5929, 5971, 6013, 6055, 6097, + 6139, 6182, 6224, 6266, 6308, 6350, 6392, 6434, + 6476, 6518, 6560, 6602, 6644, 6686, 6728, 6770, + 6812, 6854, 6896, 6938, 6980, 7022, 7064, 7106, + 7147, 7189, 7231, 7273, 7315, 7357, 7398, 7440, + 7482, 7524, 7565, 7607, 7649, 7691, 7732, 7774, + 7816, 7857, 7899, 7940, 7982, 8024, 8065, 8107, + 8148, 8190, 8231, 8273, 8314, 8356, 8397, 8439, + 8480, 8522, 8563, 8604, 8646, 8687, 8729, 8770, + 8811, 8853, 8894, 8935, 8976, 9018, 9059, 9100, + 9141, 9182, 9224, 9265, 9306, 9347, 9388, 9429, + 9470, 9511, 9552, 9593, 9634, 9675, 9716, 9757, + 9798, 9839, 9880, 9921, 9962, 10003, 10043, 10084, + 10125, 10166, 10207, 10247, 10288, 10329, 10370, 10410, + 10451, 10491, 10532, 10573, 10613, 10654, 10694, 10735, + 10775, 10816, 10856, 10897, 10937, 10978, 11018, 11059, + 11099, 11139, 11180, 11220, 11260, 11300, 11341, 11381, + 11421, 11461, 11502, 11542, 11582, 11622, 11662, 11702, + 11742, 11782, 11822, 11862, 11902, 11942, 11982, 12022, + 12062, 12102, 12142, 12181, 12221, 12261, 12301, 12340, + 12380, 12420, 12460, 12499, 12539, 12579, 12618, 12658, + 12697, 12737, 12776, 12816, 12855, 12895, 12934, 12973, + 13013, 13052, 13092, 13131, 13170, 13209, 13249, 13288, + 13327, 13366, 13405, 13444, 13484, 13523, 13562, 13601, + 13640, 13679, 13718, 13757, 13796, 13834, 13873, 13912, + 13951, 13990, 14029, 14067, 14106, 14145, 14183, 14222, + 14261, 14299, 14338, 14376, 14415, 14453, 14492, 14530, + 14569, 14607, 14646, 14684, 14722, 14761, 14799, 14837, + 14875, 14914, 14952, 14990, 15028, 15066, 15104, 15142, + 15180, 15218, 15256, 15294, 15332, 15370, 15408, 15446, + 15484, 15521, 15559, 15597, 15635, 15672, 15710, 15748, + 15785, 15823, 15860, 15898, 15935, 15973, 16010, 16048, + 16085, 16122, 16160, 16197, 16234, 16271, 16309, 16346, + 16383, 16420, 16457, 16494, 16531, 16568, 16605, 16642, + 16679, 16716, 16753, 16790, 16827, 16863, 16900, 16937, + 16974, 17010, 17047, 17084, 17120, 17157, 17193, 17230, + 17266, 17303, 17339, 17375, 17412, 17448, 17484, 17521, + 17557, 17593, 17629, 17665, 17702, 17738, 17774, 17810, + 17846, 17882, 17918, 17953, 17989, 18025, 18061, 18097, + 18132, 18168, 18204, 18240, 18275, 18311, 18346, 18382, + 18417, 18453, 18488, 18524, 18559, 18594, 18630, 18665, + 18700, 18735, 18770, 18806, 18841, 18876, 18911, 18946, + 18981, 19016, 19051, 19086, 19120, 19155, 19190, 19225, + 19259, 19294, 19329, 19363, 19398, 19433, 19467, 19502, + 19536, 19570, 19605, 19639, 19673, 19708, 19742, 19776, + 19810, 19845, 19879, 19913, 19947, 19981, 20015, 20049, + 20083, 20117, 20150, 20184, 20218, 20252, 20285, 20319, + 20353, 20386, 20420, 20453, 20487, 20520, 20554, 20587, + 20620, 20654, 20687, 20720, 20753, 20787, 20820, 20853, + 20886, 20919, 20952, 20985, 21018, 21051, 21084, 21116, + 21149, 21182, 21215, 21247, 21280, 21313, 21345, 21378, + 21410, 21443, 21475, 21507, 21540, 21572, 21604, 21637, + 21669, 21701, 21733, 21765, 21797, 21829, 21861, 21893, + 21925, 21957, 21989, 22020, 22052, 22084, 22115, 22147, + 22179, 22210, 22242, 22273, 22305, 22336, 22367, 22399, + 22430, 22461, 22493, 22524, 22555, 22586, 22617, 22648, + 22679, 22710, 22741, 22772, 22802, 22833, 22864, 22895, + 22925, 22956, 22987, 23017, 23048, 23078, 23109, 23139, + 23169, 23200, 23230, 23260, 23290, 23320, 23351, 23381, + 23411, 23441, 23471, 23500, 23530, 23560, 23590, 23620, + 23649, 23679, 23709, 23738, 23768, 23797, 23827, 23856, + 23886, 23915, 23944, 23974, 24003, 24032, 24061, 24090, + 24119, 24148, 24177, 24206, 24235, 24264, 24293, 24321, + 24350, 24379, 24407, 24436, 24465, 24493, 24522, 24550, + 24578, 24607, 24635, 24663, 24692, 24720, 24748, 24776, + 24804, 24832, 24860, 24888, 24916, 24944, 24971, 24999, + 25027, 25054, 25082, 25110, 25137, 25165, 25192, 25220, + 25247, 25274, 25302, 25329, 25356, 25383, 25410, 25437, + 25464, 25491, 25518, 25545, 25572, 25599, 25625, 25652, + 25679, 25705, 25732, 25759, 25785, 25811, 25838, 25864, + 25891, 25917, 25943, 25969, 25995, 26021, 26047, 26073, + 26099, 26125, 26151, 26177, 26203, 26228, 26254, 26280, + 26305, 26331, 26356, 26382, 26407, 26433, 26458, 26483, + 26509, 26534, 26559, 26584, 26609, 26634, 26659, 26684, + 26709, 26734, 26758, 26783, 26808, 26832, 26857, 26882, + 26906, 26931, 26955, 26979, 27004, 27028, 27052, 27076, + 27100, 27125, 27149, 27173, 27197, 27220, 27244, 27268, + 27292, 27316, 27339, 27363, 27386, 27410, 27433, 27457, + 27480, 27504, 27527, 27550, 27573, 27596, 27620, 27643, + 27666, 27689, 27711, 27734, 27757, 27780, 27803, 27825, + 27848, 27871, 27893, 27916, 27938, 27960, 27983, 28005, + 28027, 28049, 28072, 28094, 28116, 28138, 28160, 28182, + 28203, 28225, 28247, 28269, 28290, 28312, 28334, 28355, + 28377, 28398, 28419, 28441, 28462, 28483, 28504, 28525, + 28547, 28568, 28589, 28610, 28630, 28651, 28672, 28693, + 28713, 28734, 28755, 28775, 28796, 28816, 28837, 28857, + 28877, 28897, 28918, 28938, 28958, 28978, 28998, 29018, + 29038, 29058, 29077, 29097, 29117, 29136, 29156, 29176, + 29195, 29215, 29234, 29253, 29273, 29292, 29311, 29330, + 29349, 29368, 29387, 29406, 29425, 29444, 29463, 29482, + 29500, 29519, 29537, 29556, 29575, 29593, 29611, 29630, + 29648, 29666, 29684, 29703, 29721, 29739, 29757, 29775, + 29792, 29810, 29828, 29846, 29863, 29881, 29899, 29916, + 29934, 29951, 29968, 29986, 30003, 30020, 30037, 30055, + 30072, 30089, 30106, 30122, 30139, 30156, 30173, 30190, + 30206, 30223, 30239, 30256, 30272, 30289, 30305, 30321, + 30338, 30354, 30370, 30386, 30402, 30418, 30434, 30450, + 30465, 30481, 30497, 30513, 30528, 30544, 30559, 30575, + 30590, 30605, 30621, 30636, 30651, 30666, 30681, 30696, + 30711, 30726, 30741, 30756, 30771, 30786, 30800, 30815, + 30829, 30844, 30858, 30873, 30887, 30901, 30916, 30930, + 30944, 30958, 30972, 30986, 31000, 31014, 31028, 31041, + 31055, 31069, 31082, 31096, 31109, 31123, 31136, 31149, + 31163, 31176, 31189, 31202, 31215, 31228, 31241, 31254, + 31267, 31280, 31293, 31305, 31318, 31331, 31343, 31356, + 31368, 31380, 31393, 31405, 31417, 31429, 31441, 31453, + 31465, 31477, 31489, 31501, 31513, 31525, 31536, 31548, + 31559, 31571, 31582, 31594, 31605, 31616, 31628, 31639, + 31650, 31661, 31672, 31683, 31694, 31705, 31716, 31726, + 31737, 31748, 31758, 31769, 31779, 31790, 31800, 31810, + 31821, 31831, 31841, 31851, 31861, 31871, 31881, 31891, + 31901, 31911, 31920, 31930, 31940, 31949, 31959, 31968, + 31977, 31987, 31996, 32005, 32014, 32023, 32033, 32042, + 32050, 32059, 32068, 32077, 32086, 32094, 32103, 32112, + 32120, 32128, 32137, 32145, 32154, 32162, 32170, 32178, + 32186, 32194, 32202, 32210, 32218, 32226, 32233, 32241, + 32249, 32256, 32264, 32271, 32279, 32286, 32293, 32300, + 32308, 32315, 32322, 32329, 32336, 32343, 32350, 32356, + 32363, 32370, 32376, 32383, 32389, 32396, 32402, 32409, + 32415, 32421, 32427, 32434, 32440, 32446, 32452, 32457, + 32463, 32469, 32475, 32481, 32486, 32492, 32497, 32503, + 32508, 32513, 32519, 32524, 32529, 32534, 32539, 32544, + 32549, 32554, 32559, 32564, 32569, 32573, 32578, 32582, + 32587, 32591, 32596, 32600, 32604, 32609, 32613, 32617, + 32621, 32625, 32629, 32633, 32637, 32641, 32644, 32648, + 32652, 32655, 32659, 32662, 32665, 32669, 32672, 32675, + 32679, 32682, 32685, 32688, 32691, 32694, 32696, 32699, + 32702, 32705, 32707, 32710, 32712, 32715, 32717, 32719, + 32722, 32724, 32726, 32728, 32730, 32732, 32734, 32736, + 32738, 32740, 32741, 32743, 32744, 32746, 32748, 32749, + 32750, 32752, 32753, 32754, 32755, 32756, 32757, 32758, + 32759, 32760, 32761, 32762, 32762, 32763, 32764, 32764, + 32765, 32765, 32765, 32766, 32766, 32766, 32766, 32766 +}; + +const Word16 cos_scale_tbl_1200[1200] = { /* Q15 */ + 0, 42, 85, 128, 171, 214, 257, 300, + 343, 386, 428, 471, 514, 557, 600, 643, + 686, 729, 771, 814, 857, 900, 943, 986, + 1029, 1072, 1114, 1157, 1200, 1243, 1286, 1329, + 1372, 1414, 1457, 1500, 1543, 1586, 1629, 1672, + 1714, 1757, 1800, 1843, 1886, 1929, 1971, 2014, + 2057, 2100, 2143, 2185, 2228, 2271, 2314, 2357, + 2399, 2442, 2485, 2528, 2570, 2613, 2656, 2699, + 2741, 2784, 2827, 2870, 2912, 2955, 2998, 3040, + 3083, 3126, 3169, 3211, 3254, 3297, 3339, 3382, + 3425, 3467, 3510, 3553, 3595, 3638, 3680, 3723, + 3766, 3808, 3851, 3893, 3936, 3979, 4021, 4064, + 4106, 4149, 4191, 4234, 4276, 4319, 4361, 4404, + 4446, 4489, 4531, 4574, 4616, 4659, 4701, 4744, + 4786, 4829, 4871, 4913, 4956, 4998, 5041, 5083, + 5125, 5168, 5210, 5252, 5295, 5337, 5379, 5422, + 5464, 5506, 5549, 5591, 5633, 5675, 5718, 5760, + 5802, 5844, 5886, 5929, 5971, 6013, 6055, 6097, + 6139, 6182, 6224, 6266, 6308, 6350, 6392, 6434, + 6476, 6518, 6560, 6602, 6644, 6686, 6728, 6770, + 6812, 6854, 6896, 6938, 6980, 7022, 7064, 7106, + 7147, 7189, 7231, 7273, 7315, 7357, 7398, 7440, + 7482, 7524, 7565, 7607, 7649, 7691, 7732, 7774, + 7816, 7857, 7899, 7940, 7982, 8024, 8065, 8107, + 8148, 8190, 8231, 8273, 8314, 8356, 8397, 8439, + 8480, 8522, 8563, 8604, 8646, 8687, 8729, 8770, + 8811, 8853, 8894, 8935, 8976, 9018, 9059, 9100, + 9141, 9182, 9224, 9265, 9306, 9347, 9388, 9429, + 9470, 9511, 9552, 9593, 9634, 9675, 9716, 9757, + 9798, 9839, 9880, 9921, 9962, 10003, 10043, 10084, + 10125, 10166, 10207, 10247, 10288, 10329, 10370, 10410, + 10451, 10491, 10532, 10573, 10613, 10654, 10694, 10735, + 10775, 10816, 10856, 10897, 10937, 10978, 11018, 11059, + 11099, 11139, 11180, 11220, 11260, 11300, 11341, 11381, + 11421, 11461, 11502, 11542, 11582, 11622, 11662, 11702, + 11742, 11782, 11822, 11862, 11902, 11942, 11982, 12022, + 12062, 12102, 12142, 12181, 12221, 12261, 12301, 12340, + 12380, 12420, 12460, 12499, 12539, 12579, 12618, 12658, + 12697, 12737, 12776, 12816, 12855, 12895, 12934, 12973, + 13013, 13052, 13092, 13131, 13170, 13209, 13249, 13288, + 13327, 13366, 13405, 13444, 13484, 13523, 13562, 13601, + 13640, 13679, 13718, 13757, 13796, 13834, 13873, 13912, + 13951, 13990, 14029, 14067, 14106, 14145, 14183, 14222, + 14261, 14299, 14338, 14376, 14415, 14453, 14492, 14530, + 14569, 14607, 14646, 14684, 14722, 14761, 14799, 14837, + 14875, 14914, 14952, 14990, 15028, 15066, 15104, 15142, + 15180, 15218, 15256, 15294, 15332, 15370, 15408, 15446, + 15484, 15521, 15559, 15597, 15635, 15672, 15710, 15748, + 15785, 15823, 15860, 15898, 15935, 15973, 16010, 16048, + 16085, 16122, 16160, 16197, 16234, 16271, 16309, 16346, + 16383, 16420, 16457, 16494, 16531, 16568, 16605, 16642, + 16679, 16716, 16753, 16790, 16827, 16863, 16900, 16937, + 16974, 17010, 17047, 17084, 17120, 17157, 17193, 17230, + 17266, 17303, 17339, 17375, 17412, 17448, 17484, 17521, + 17557, 17593, 17629, 17665, 17702, 17738, 17774, 17810, + 17846, 17882, 17918, 17953, 17989, 18025, 18061, 18097, + 18132, 18168, 18204, 18240, 18275, 18311, 18346, 18382, + 18417, 18453, 18488, 18524, 18559, 18594, 18630, 18665, + 18700, 18735, 18770, 18806, 18841, 18876, 18911, 18946, + 18981, 19016, 19051, 19086, 19120, 19155, 19190, 19225, + 19259, 19294, 19329, 19363, 19398, 19433, 19467, 19502, + 19536, 19570, 19605, 19639, 19673, 19708, 19742, 19776, + 19810, 19845, 19879, 19913, 19947, 19981, 20015, 20049, + 20083, 20117, 20150, 20184, 20218, 20252, 20285, 20319, + 20353, 20386, 20420, 20453, 20487, 20520, 20554, 20587, + 20620, 20654, 20687, 20720, 20753, 20787, 20820, 20853, + 20886, 20919, 20952, 20985, 21018, 21051, 21084, 21116, + 21149, 21182, 21215, 21247, 21280, 21313, 21345, 21378, + 21410, 21443, 21475, 21507, 21540, 21572, 21604, 21637, + 21669, 21701, 21733, 21765, 21797, 21829, 21861, 21893, + 21925, 21957, 21989, 22020, 22052, 22084, 22115, 22147, + 22179, 22210, 22242, 22273, 22305, 22336, 22367, 22399, + 22430, 22461, 22493, 22524, 22555, 22586, 22617, 22648, + 22679, 22710, 22741, 22772, 22802, 22833, 22864, 22895, + 22925, 22956, 22987, 23017, 23048, 23078, 23109, 23139, + 23169, 23200, 23230, 23260, 23290, 23320, 23351, 23381, + 23411, 23441, 23471, 23500, 23530, 23560, 23590, 23620, + 23649, 23679, 23709, 23738, 23768, 23797, 23827, 23856, + 23886, 23915, 23944, 23974, 24003, 24032, 24061, 24090, + 24119, 24148, 24177, 24206, 24235, 24264, 24293, 24321, + 24350, 24379, 24407, 24436, 24465, 24493, 24522, 24550, + 24578, 24607, 24635, 24663, 24692, 24720, 24748, 24776, + 24804, 24832, 24860, 24888, 24916, 24944, 24971, 24999, + 25027, 25054, 25082, 25110, 25137, 25165, 25192, 25220, + 25247, 25274, 25302, 25329, 25356, 25383, 25410, 25437, + 25464, 25491, 25518, 25545, 25572, 25599, 25625, 25652, + 25679, 25705, 25732, 25759, 25785, 25811, 25838, 25864, + 25891, 25917, 25943, 25969, 25995, 26021, 26047, 26073, + 26099, 26125, 26151, 26177, 26203, 26228, 26254, 26280, + 26305, 26331, 26356, 26382, 26407, 26433, 26458, 26483, + 26509, 26534, 26559, 26584, 26609, 26634, 26659, 26684, + 26709, 26734, 26758, 26783, 26808, 26832, 26857, 26882, + 26906, 26931, 26955, 26979, 27004, 27028, 27052, 27076, + 27100, 27125, 27149, 27173, 27197, 27220, 27244, 27268, + 27292, 27316, 27339, 27363, 27386, 27410, 27433, 27457, + 27480, 27504, 27527, 27550, 27573, 27596, 27620, 27643, + 27666, 27689, 27711, 27734, 27757, 27780, 27803, 27825, + 27848, 27871, 27893, 27916, 27938, 27960, 27983, 28005, + 28027, 28049, 28072, 28094, 28116, 28138, 28160, 28182, + 28203, 28225, 28247, 28269, 28290, 28312, 28334, 28355, + 28377, 28398, 28419, 28441, 28462, 28483, 28504, 28525, + 28547, 28568, 28589, 28610, 28630, 28651, 28672, 28693, + 28713, 28734, 28755, 28775, 28796, 28816, 28837, 28857, + 28877, 28897, 28918, 28938, 28958, 28978, 28998, 29018, + 29038, 29058, 29077, 29097, 29117, 29136, 29156, 29176, + 29195, 29215, 29234, 29253, 29273, 29292, 29311, 29330, + 29349, 29368, 29387, 29406, 29425, 29444, 29463, 29482, + 29500, 29519, 29537, 29556, 29575, 29593, 29611, 29630, + 29648, 29666, 29684, 29703, 29721, 29739, 29757, 29775, + 29792, 29810, 29828, 29846, 29863, 29881, 29899, 29916, + 29934, 29951, 29968, 29986, 30003, 30020, 30037, 30055, + 30072, 30089, 30106, 30122, 30139, 30156, 30173, 30190, + 30206, 30223, 30239, 30256, 30272, 30289, 30305, 30321, + 30338, 30354, 30370, 30386, 30402, 30418, 30434, 30450, + 30465, 30481, 30497, 30513, 30528, 30544, 30559, 30575, + 30590, 30605, 30621, 30636, 30651, 30666, 30681, 30696, + 30711, 30726, 30741, 30756, 30771, 30786, 30800, 30815, + 30829, 30844, 30858, 30873, 30887, 30901, 30916, 30930, + 30944, 30958, 30972, 30986, 31000, 31014, 31028, 31041, + 31055, 31069, 31082, 31096, 31109, 31123, 31136, 31149, + 31163, 31176, 31189, 31202, 31215, 31228, 31241, 31254, + 31267, 31280, 31293, 31305, 31318, 31331, 31343, 31356, + 31368, 31380, 31393, 31405, 31417, 31429, 31441, 31453, + 31465, 31477, 31489, 31501, 31513, 31525, 31536, 31548, + 31559, 31571, 31582, 31594, 31605, 31616, 31628, 31639, + 31650, 31661, 31672, 31683, 31694, 31705, 31716, 31726, + 31737, 31748, 31758, 31769, 31779, 31790, 31800, 31810, + 31821, 31831, 31841, 31851, 31861, 31871, 31881, 31891, + 31901, 31911, 31920, 31930, 31940, 31949, 31959, 31968, + 31977, 31987, 31996, 32005, 32014, 32023, 32033, 32042, + 32050, 32059, 32068, 32077, 32086, 32094, 32103, 32112, + 32120, 32128, 32137, 32145, 32154, 32162, 32170, 32178, + 32186, 32194, 32202, 32210, 32218, 32226, 32233, 32241, + 32249, 32256, 32264, 32271, 32279, 32286, 32293, 32300, + 32308, 32315, 32322, 32329, 32336, 32343, 32350, 32356, + 32363, 32370, 32376, 32383, 32389, 32396, 32402, 32409, + 32415, 32421, 32427, 32434, 32440, 32446, 32452, 32457, + 32463, 32469, 32475, 32481, 32486, 32492, 32497, 32503, + 32508, 32513, 32519, 32524, 32529, 32534, 32539, 32544, + 32549, 32554, 32559, 32564, 32569, 32573, 32578, 32582, + 32587, 32591, 32596, 32600, 32604, 32609, 32613, 32617, + 32621, 32625, 32629, 32633, 32637, 32641, 32644, 32648, + 32652, 32655, 32659, 32662, 32665, 32669, 32672, 32675, + 32679, 32682, 32685, 32688, 32691, 32694, 32696, 32699, + 32702, 32705, 32707, 32710, 32712, 32715, 32717, 32719, + 32722, 32724, 32726, 32728, 32730, 32732, 32734, 32736, + 32738, 32740, 32741, 32743, 32744, 32746, 32748, 32749, + 32750, 32752, 32753, 32754, 32755, 32756, 32757, 32758, + 32759, 32760, 32761, 32762, 32762, 32763, 32764, 32764, + 32765, 32765, 32765, 32766, 32766, 32766, 32766, 32766 +}; + +const Word16 sin_scale_tbl_800[800] = { /* Q15 */ + 0, 64, 128, 193, 257, 321, 386, 450, + 514, 579, 643, 707, 771, 836, 900, 964, + 1029, 1093, 1157, 1222, 1286, 1350, 1414, 1479, + 1543, 1607, 1672, 1736, 1800, 1864, 1929, 1993, + 2057, 2121, 2185, 2250, 2314, 2378, 2442, 2506, + 2570, 2635, 2699, 2763, 2827, 2891, 2955, 3019, + 3083, 3147, 3211, 3275, 3339, 3403, 3467, 3531, + 3595, 3659, 3723, 3787, 3851, 3915, 3979, 4042, + 4106, 4170, 4234, 4298, 4361, 4425, 4489, 4553, + 4616, 4680, 4744, 4807, 4871, 4935, 4998, 5062, + 5125, 5189, 5252, 5316, 5379, 5443, 5506, 5570, + 5633, 5696, 5760, 5823, 5886, 5950, 6013, 6076, + 6139, 6203, 6266, 6329, 6392, 6455, 6518, 6581, + 6644, 6707, 6770, 6833, 6896, 6959, 7022, 7085, + 7147, 7210, 7273, 7336, 7398, 7461, 7524, 7586, + 7649, 7711, 7774, 7836, 7899, 7961, 8024, 8086, + 8148, 8211, 8273, 8335, 8397, 8460, 8522, 8584, + 8646, 8708, 8770, 8832, 8894, 8956, 9018, 9079, + 9141, 9203, 9265, 9326, 9388, 9450, 9511, 9573, + 9634, 9696, 9757, 9819, 9880, 9941, 10003, 10064, + 10125, 10186, 10247, 10308, 10370, 10431, 10491, 10552, + 10613, 10674, 10735, 10796, 10856, 10917, 10978, 11038, + 11099, 11159, 11220, 11280, 11341, 11401, 11461, 11522, + 11582, 11642, 11702, 11762, 11822, 11882, 11942, 12002, + 12062, 12122, 12181, 12241, 12301, 12360, 12420, 12479, + 12539, 12598, 12658, 12717, 12776, 12835, 12895, 12954, + 13013, 13072, 13131, 13190, 13249, 13307, 13366, 13425, + 13484, 13542, 13601, 13659, 13718, 13776, 13834, 13893, + 13951, 14009, 14067, 14125, 14183, 14241, 14299, 14357, + 14415, 14473, 14530, 14588, 14646, 14703, 14761, 14818, + 14875, 14933, 14990, 15047, 15104, 15161, 15218, 15275, + 15332, 15389, 15446, 15502, 15559, 15616, 15672, 15729, + 15785, 15841, 15898, 15954, 16010, 16066, 16122, 16178, + 16234, 16290, 16346, 16402, 16457, 16513, 16568, 16624, + 16679, 16735, 16790, 16845, 16900, 16955, 17010, 17065, + 17120, 17175, 17230, 17284, 17339, 17394, 17448, 17503, + 17557, 17611, 17665, 17720, 17774, 17828, 17882, 17936, + 17989, 18043, 18097, 18150, 18204, 18257, 18311, 18364, + 18417, 18470, 18524, 18577, 18630, 18682, 18735, 18788, + 18841, 18893, 18946, 18998, 19051, 19103, 19155, 19207, + 19259, 19311, 19363, 19415, 19467, 19519, 19570, 19622, + 19673, 19725, 19776, 19827, 19879, 19930, 19981, 20032, + 20083, 20133, 20184, 20235, 20285, 20336, 20386, 20437, + 20487, 20537, 20587, 20637, 20687, 20737, 20787, 20836, + 20886, 20936, 20985, 21034, 21084, 21133, 21182, 21231, + 21280, 21329, 21378, 21426, 21475, 21524, 21572, 21620, + 21669, 21717, 21765, 21813, 21861, 21909, 21957, 22004, + 22052, 22100, 22147, 22194, 22242, 22289, 22336, 22383, + 22430, 22477, 22524, 22570, 22617, 22663, 22710, 22756, + 22802, 22849, 22895, 22941, 22987, 23032, 23078, 23124, + 23169, 23215, 23260, 23305, 23351, 23396, 23441, 23486, + 23530, 23575, 23620, 23664, 23709, 23753, 23797, 23842, + 23886, 23930, 23974, 24017, 24061, 24105, 24148, 24192, + 24235, 24278, 24321, 24364, 24407, 24450, 24493, 24536, + 24578, 24621, 24663, 24706, 24748, 24790, 24832, 24874, + 24916, 24957, 24999, 25041, 25082, 25123, 25165, 25206, + 25247, 25288, 25329, 25370, 25410, 25451, 25491, 25532, + 25572, 25612, 25652, 25692, 25732, 25772, 25811, 25851, + 25891, 25930, 25969, 26008, 26047, 26086, 26125, 26164, + 26203, 26241, 26280, 26318, 26356, 26395, 26433, 26471, + 26509, 26546, 26584, 26622, 26659, 26696, 26734, 26771, + 26808, 26845, 26882, 26918, 26955, 26991, 27028, 27064, + 27100, 27137, 27173, 27208, 27244, 27280, 27316, 27351, + 27386, 27422, 27457, 27492, 27527, 27562, 27596, 27631, + 27666, 27700, 27734, 27769, 27803, 27837, 27871, 27904, + 27938, 27972, 28005, 28038, 28072, 28105, 28138, 28171, + 28203, 28236, 28269, 28301, 28334, 28366, 28398, 28430, + 28462, 28494, 28525, 28557, 28589, 28620, 28651, 28682, + 28713, 28744, 28775, 28806, 28837, 28867, 28897, 28928, + 28958, 28988, 29018, 29048, 29077, 29107, 29136, 29166, + 29195, 29224, 29253, 29282, 29311, 29340, 29368, 29397, + 29425, 29453, 29482, 29510, 29537, 29565, 29593, 29621, + 29648, 29675, 29703, 29730, 29757, 29784, 29810, 29837, + 29863, 29890, 29916, 29942, 29968, 29994, 30020, 30046, + 30072, 30097, 30122, 30148, 30173, 30198, 30223, 30248, + 30272, 30297, 30321, 30346, 30370, 30394, 30418, 30442, + 30465, 30489, 30513, 30536, 30559, 30582, 30605, 30628, + 30651, 30674, 30696, 30719, 30741, 30763, 30786, 30807, + 30829, 30851, 30873, 30894, 30916, 30937, 30958, 30979, + 31000, 31021, 31041, 31062, 31082, 31103, 31123, 31143, + 31163, 31183, 31202, 31222, 31241, 31261, 31280, 31299, + 31318, 31337, 31356, 31374, 31393, 31411, 31429, 31447, + 31465, 31483, 31501, 31519, 31536, 31554, 31571, 31588, + 31605, 31622, 31639, 31656, 31672, 31689, 31705, 31721, + 31737, 31753, 31769, 31785, 31800, 31816, 31831, 31846, + 31861, 31876, 31891, 31906, 31920, 31935, 31949, 31963, + 31977, 31991, 32005, 32019, 32033, 32046, 32059, 32073, + 32086, 32099, 32112, 32124, 32137, 32149, 32162, 32174, + 32186, 32198, 32210, 32222, 32233, 32245, 32256, 32267, + 32279, 32290, 32300, 32311, 32322, 32332, 32343, 32353, + 32363, 32373, 32383, 32393, 32402, 32412, 32421, 32430, + 32440, 32449, 32457, 32466, 32475, 32483, 32492, 32500, + 32508, 32516, 32524, 32532, 32539, 32547, 32554, 32561, + 32569, 32576, 32582, 32589, 32596, 32602, 32609, 32615, + 32621, 32627, 32633, 32639, 32644, 32650, 32655, 32660, + 32665, 32670, 32675, 32680, 32685, 32689, 32694, 32698, + 32702, 32706, 32710, 32713, 32717, 32720, 32724, 32727, + 32730, 32733, 32736, 32739, 32741, 32744, 32746, 32748, + 32750, 32752, 32754, 32756, 32757, 32759, 32760, 32761, + 32762, 32763, 32764, 32765, 32765, 32766, 32766, 32766 +}; + +const Word16 cos_scale_tbl_800[800] = { /* Q15 */ + 0, 64, 128, 193, 257, 321, 386, 450, + 514, 579, 643, 707, 771, 836, 900, 964, + 1029, 1093, 1157, 1222, 1286, 1350, 1414, 1479, + 1543, 1607, 1672, 1736, 1800, 1864, 1929, 1993, + 2057, 2121, 2185, 2250, 2314, 2378, 2442, 2506, + 2570, 2635, 2699, 2763, 2827, 2891, 2955, 3019, + 3083, 3147, 3211, 3275, 3339, 3403, 3467, 3531, + 3595, 3659, 3723, 3787, 3851, 3915, 3979, 4042, + 4106, 4170, 4234, 4298, 4361, 4425, 4489, 4553, + 4616, 4680, 4744, 4807, 4871, 4935, 4998, 5062, + 5125, 5189, 5252, 5316, 5379, 5443, 5506, 5570, + 5633, 5696, 5760, 5823, 5886, 5950, 6013, 6076, + 6139, 6203, 6266, 6329, 6392, 6455, 6518, 6581, + 6644, 6707, 6770, 6833, 6896, 6959, 7022, 7085, + 7147, 7210, 7273, 7336, 7398, 7461, 7524, 7586, + 7649, 7711, 7774, 7836, 7899, 7961, 8024, 8086, + 8148, 8211, 8273, 8335, 8397, 8460, 8522, 8584, + 8646, 8708, 8770, 8832, 8894, 8956, 9018, 9079, + 9141, 9203, 9265, 9326, 9388, 9450, 9511, 9573, + 9634, 9696, 9757, 9819, 9880, 9941, 10003, 10064, + 10125, 10186, 10247, 10308, 10370, 10431, 10491, 10552, + 10613, 10674, 10735, 10796, 10856, 10917, 10978, 11038, + 11099, 11159, 11220, 11280, 11341, 11401, 11461, 11522, + 11582, 11642, 11702, 11762, 11822, 11882, 11942, 12002, + 12062, 12122, 12181, 12241, 12301, 12360, 12420, 12479, + 12539, 12598, 12658, 12717, 12776, 12835, 12895, 12954, + 13013, 13072, 13131, 13190, 13249, 13307, 13366, 13425, + 13484, 13542, 13601, 13659, 13718, 13776, 13834, 13893, + 13951, 14009, 14067, 14125, 14183, 14241, 14299, 14357, + 14415, 14473, 14530, 14588, 14646, 14703, 14761, 14818, + 14875, 14933, 14990, 15047, 15104, 15161, 15218, 15275, + 15332, 15389, 15446, 15502, 15559, 15616, 15672, 15729, + 15785, 15841, 15898, 15954, 16010, 16066, 16122, 16178, + 16234, 16290, 16346, 16402, 16457, 16513, 16568, 16624, + 16679, 16735, 16790, 16845, 16900, 16955, 17010, 17065, + 17120, 17175, 17230, 17284, 17339, 17394, 17448, 17503, + 17557, 17611, 17665, 17720, 17774, 17828, 17882, 17936, + 17989, 18043, 18097, 18150, 18204, 18257, 18311, 18364, + 18417, 18470, 18524, 18577, 18630, 18682, 18735, 18788, + 18841, 18893, 18946, 18998, 19051, 19103, 19155, 19207, + 19259, 19311, 19363, 19415, 19467, 19519, 19570, 19622, + 19673, 19725, 19776, 19827, 19879, 19930, 19981, 20032, + 20083, 20133, 20184, 20235, 20285, 20336, 20386, 20437, + 20487, 20537, 20587, 20637, 20687, 20737, 20787, 20836, + 20886, 20936, 20985, 21034, 21084, 21133, 21182, 21231, + 21280, 21329, 21378, 21426, 21475, 21524, 21572, 21620, + 21669, 21717, 21765, 21813, 21861, 21909, 21957, 22004, + 22052, 22100, 22147, 22194, 22242, 22289, 22336, 22383, + 22430, 22477, 22524, 22570, 22617, 22663, 22710, 22756, + 22802, 22849, 22895, 22941, 22987, 23032, 23078, 23124, + 23169, 23215, 23260, 23305, 23351, 23396, 23441, 23486, + 23530, 23575, 23620, 23664, 23709, 23753, 23797, 23842, + 23886, 23930, 23974, 24017, 24061, 24105, 24148, 24192, + 24235, 24278, 24321, 24364, 24407, 24450, 24493, 24536, + 24578, 24621, 24663, 24706, 24748, 24790, 24832, 24874, + 24916, 24957, 24999, 25041, 25082, 25123, 25165, 25206, + 25247, 25288, 25329, 25370, 25410, 25451, 25491, 25532, + 25572, 25612, 25652, 25692, 25732, 25772, 25811, 25851, + 25891, 25930, 25969, 26008, 26047, 26086, 26125, 26164, + 26203, 26241, 26280, 26318, 26356, 26395, 26433, 26471, + 26509, 26546, 26584, 26622, 26659, 26696, 26734, 26771, + 26808, 26845, 26882, 26918, 26955, 26991, 27028, 27064, + 27100, 27137, 27173, 27208, 27244, 27280, 27316, 27351, + 27386, 27422, 27457, 27492, 27527, 27562, 27596, 27631, + 27666, 27700, 27734, 27769, 27803, 27837, 27871, 27904, + 27938, 27972, 28005, 28038, 28072, 28105, 28138, 28171, + 28203, 28236, 28269, 28301, 28334, 28366, 28398, 28430, + 28462, 28494, 28525, 28557, 28589, 28620, 28651, 28682, + 28713, 28744, 28775, 28806, 28837, 28867, 28897, 28928, + 28958, 28988, 29018, 29048, 29077, 29107, 29136, 29166, + 29195, 29224, 29253, 29282, 29311, 29340, 29368, 29397, + 29425, 29453, 29482, 29510, 29537, 29565, 29593, 29621, + 29648, 29675, 29703, 29730, 29757, 29784, 29810, 29837, + 29863, 29890, 29916, 29942, 29968, 29994, 30020, 30046, + 30072, 30097, 30122, 30148, 30173, 30198, 30223, 30248, + 30272, 30297, 30321, 30346, 30370, 30394, 30418, 30442, + 30465, 30489, 30513, 30536, 30559, 30582, 30605, 30628, + 30651, 30674, 30696, 30719, 30741, 30763, 30786, 30807, + 30829, 30851, 30873, 30894, 30916, 30937, 30958, 30979, + 31000, 31021, 31041, 31062, 31082, 31103, 31123, 31143, + 31163, 31183, 31202, 31222, 31241, 31261, 31280, 31299, + 31318, 31337, 31356, 31374, 31393, 31411, 31429, 31447, + 31465, 31483, 31501, 31519, 31536, 31554, 31571, 31588, + 31605, 31622, 31639, 31656, 31672, 31689, 31705, 31721, + 31737, 31753, 31769, 31785, 31800, 31816, 31831, 31846, + 31861, 31876, 31891, 31906, 31920, 31935, 31949, 31963, + 31977, 31991, 32005, 32019, 32033, 32046, 32059, 32073, + 32086, 32099, 32112, 32124, 32137, 32149, 32162, 32174, + 32186, 32198, 32210, 32222, 32233, 32245, 32256, 32267, + 32279, 32290, 32300, 32311, 32322, 32332, 32343, 32353, + 32363, 32373, 32383, 32393, 32402, 32412, 32421, 32430, + 32440, 32449, 32457, 32466, 32475, 32483, 32492, 32500, + 32508, 32516, 32524, 32532, 32539, 32547, 32554, 32561, + 32569, 32576, 32582, 32589, 32596, 32602, 32609, 32615, + 32621, 32627, 32633, 32639, 32644, 32650, 32655, 32660, + 32665, 32670, 32675, 32680, 32685, 32689, 32694, 32698, + 32702, 32706, 32710, 32713, 32717, 32720, 32724, 32727, + 32730, 32733, 32736, 32739, 32741, 32744, 32746, 32748, + 32750, 32752, 32754, 32756, 32757, 32759, 32760, 32761, + 32762, 32763, 32764, 32765, 32765, 32766, 32766, 32766 +}; + +const Word16 scales_ivas_fx[][MAX_NO_SCALES * 2] = /* 2 subvectors Q11*/ + { + { + 3129, + 0, + 0, + 3137, + 0, + 0, + }, + { + 3287, + 0, + 0, + 3137, + 0, + 0, + }, + { + 2611, + 5033, + 0, + 3137, + 0, + 0, + }, + { + 2611, + 5033, + 0, + 3340, + 0, + 0, + }, + { + 2164, + 3674, + 5931, + 2363, + 3809, + 6281, + }, + { + 1898, + 2985, + 4745, + 2115, + 3667, + 7045, + }, + { + 2629, + 5480, + 0, + 2971, + 0, + 0, + }, + { + 2801, + 0, + 0, + 2869, + 5072, + 0, + }, + { + 1763, + 2545, + 3723, + 2514, + 4558, + 21108, + }, + { + 2195, + 3960, + 7440, + 2500, + 6017, + 21960, + }, + { + 1841, + 2902, + 1386, + 2115, + 3762, + 22308, + }, + { + 1699, + 2709, + 1288, + 1865, + 3246, + 20660, + }, + { + 3221, + 0, + 0, + 3391, + 0, + 0, + }, + { + 2537, + 4923, + 0, + 3186, + 0, + 0, + }, + { + 2816, + 4229, + 6397, + 3676, + 0, + 0, + }, + { + 2816, + 4229, + 6397, + 3893, + 0, + 0, + }, + { + 2160, + 3481, + 9091, + 3391, + 0, + 0, + }, + { + 2560, + 4923, + 8462, + 2775, + 4835, + 0, + }, + { + 2551, + 3803, + 5619, + 3072, + 5537, + 0, + }, + { + 2545, + 4206, + 7450, + 3229, + 0, + 0, + }, + { + 2162, + 3655, + 9263, + 2699, + 5296, + 0, + }, + { + 2039, + 3082, + 6871, + 2426, + 3637, + 5586, + }, + { + 1902, + 2840, + 6875, + 2211, + 3483, + 5908, + }, + { + 1888, + 3057, + 6899, + 2211, + 3483, + 5908, + }, + { + 1888, + 3057, + 6899, + 2183, + 3469, + 6420, + }, + { + 1888, + 3057, + 6899, + 1970, + 3174, + 8081, + }, + { + 2633, + 1855, + 4960, + 2301, + 3477, + 5083, + }, + { + 1527, + 2269, + 5875, + 1964, + 3033, + 8001, + }, + { + 1576, + 2445, + 5781, + 1857, + 2871, + 4333, + }, + { + 1531, + 2258, + 5869, + 2420, + 1660, + 6823, + }, + { + 1566, + 2318, + 3776, + 2543, + 3876, + 1888, + }, + { + 1568, + 2320, + 3780, + 2183, + 3360, + 1665, + }, + { + 1386, + 1972, + 4356, + 1486, + 2215, + 4513, + }, + { + 3356, + 0, + 0, + 2494, + 4425, + 0, + }, + { + 2633, + 5009, + 0, + 2887, + 0, + 0, + }, + { + 2224, + 3538, + 7696, + 2494, + 4425, + 0, + }, + { + 2119, + 3225, + 9861, + 2494, + 4425, + 0, + }, + { + 1974, + 3139, + 10121, + 2494, + 4425, + 0, + }, + { + 1722, + 2453, + 4059, + 2494, + 4425, + 0, + }, + { + 1839, + 2658, + 4472, + 2490, + 5455, + 0, + }, + { + 1722, + 2533, + 4581, + 2037, + 3393, + 5808, + }, + { + 1427, + 2009, + 4184, + 1914, + 3082, + 1349, + }, + { + 1370, + 1861, + 2719, + 2017, + 1339, + 3913, + }, + { + 2482, + 3885, + 0, + 0, + 0, + 0, + }, + { + 2375, + 3827, + 6975, + 0, + 0, + 0, + }, + { + 3395, + 0, + 0, + 3883, + 0, + 0, + }, + { + 3563, + 0, + 0, + 3883, + 0, + 0, + }, + { + 3346, + 0, + 0, + 3418, + 0, + 0, + }, + { + 3563, + 0, + 0, + 4128, + 0, + 0, + }, + { + 2820, + 5218, + 0, + 3883, + 0, + 0, + }, + { + 2637, + 4962, + 0, + 3418, + 0, + 0, + }, + { + 2482, + 3885, + 0, + 3418, + 0, + 0, + }, + { + 2217, + 3616, + 6502, + 3418, + 0, + 0, + }, + { + 2123, + 3295, + 8658, + 3418, + 0, + 0, + }, + { + 2242, + 3397, + 5562, + 2693, + 5132, + 0, + }, + { + 2387, + 4024, + 7483, + 3452, + 0, + 0, + }, + { + 1927, + 2838, + 4548, + 2693, + 5132, + 0, + }, + { + 1859, + 2674, + 3893, + 2703, + 5371, + 0, + }, + { + 2201, + 3618, + 1617, + 2703, + 5371, + 0, + }, + { + 2093, + 3135, + 1554, + 2273, + 3594, + 5312, + }, + { + 2201, + 3618, + 1617, + 2238, + 3895, + 6172, + }, + { + 1828, + 3014, + 1382, + 2258, + 3624, + 5820, + }, + { + 1863, + 3170, + 1402, + 2113, + 3381, + 5146, + }, + { + 1691, + 2572, + 1294, + 2009, + 3158, + 4540, + }, + { + 2424, + 3706, + 5654, + 0, + 0, + 0, + }, + { + 3299, + 0, + 0, + 3313, + 0, + 0, + }, + { + 2424, + 3706, + 5654, + 3174, + 0, + 0, + }, + { + 2424, + 3706, + 5654, + 3313, + 0, + 0, + }, + { + 2177, + 3557, + 6113, + 3313, + 0, + 0, + }, + { + 2207, + 3737, + 6475, + 3008, + 4605, + 0, + }, + { + 2816, + 1873, + 4263, + 3008, + 4605, + 0, + }, + { + 1966, + 2914, + 1433, + 2682, + 4366, + 0, + }, + { + 2301, + 1626, + 3895, + 2627, + 4714, + 0, + }, + { + 2205, + 3536, + 1570, + 2560, + 3995, + 6105, + }, + { + 1910, + 3012, + 1402, + 2560, + 3995, + 6105, + }, + { + 1898, + 3276, + 1380, + 2363, + 3637, + 5844, + }, + { + 2144, + 1478, + 3655, + 2162, + 3362, + 5531, + }, + { + 1988, + 1409, + 3090, + 2136, + 3543, + 6002, + }, + { + 1882, + 1355, + 2799, + 2164, + 3702, + 6285, + }, + { + 3311, + 0, + 0, + 3393, + 0, + 0, + }, + { + 2611, + 4706, + 0, + 3201, + 0, + 0, + }, + { + 2820, + 5218, + 0, + 4128, + 0, + 0, + }, + { + 2660, + 4134, + 0, + 4128, + 0, + 0, + }, + { + 2678, + 4820, + 0, + 2840, + 0, + 0, + }, + { + 2643, + 4952, + 0, + 2775, + 5003, + 0, + }, + { + 2402, + 3618, + 5726, + 3252, + 6201, + 0, + }, + { + 2209, + 3622, + 6168, + 2840, + 0, + 0, + }, + { + 2209, + 3622, + 6168, + 2713, + 5232, + 0, + }, + { + 1992, + 2850, + 4124, + 3262, + 6518, + 0, + }, + { + 2353, + 3835, + 1736, + 3262, + 6518, + 0, + }, + { + 1837, + 2744, + 5332, + 2191, + 3459, + 5175, + }, + { + 2353, + 3835, + 1736, + 2701, + 4685, + 7550, + }, + { + 1837, + 2744, + 5332, + 1923, + 2977, + 4265, + }, + { + 1853, + 2717, + 5322, + 2271, + 1591, + 3491, + }, + { + 1560, + 2254, + 4831, + 1923, + 2977, + 4265, + }, + { + 1626, + 2510, + 6512, + 2271, + 1591, + 3491, + }, + { + 3336, + 0, + 0, + 2439, + 4528, + 0, + }, + { + 2615, + 5236, + 0, + 2799, + 0, + 0, + }, + { + 2215, + 3606, + 8046, + 2439, + 4528, + 0, + }, + { + 2084, + 3143, + 5750, + 2439, + 4528, + 0, + }, + { + 1933, + 3024, + 5658, + 2439, + 4528, + 0, + }, + { + 1863, + 3571, + 6793, + 2439, + 4528, + 0, + }, + { + 1884, + 3375, + 6283, + 1984, + 3446, + 8095, + }, + { + 1513, + 2275, + 5517, + 1800, + 2889, + 4720, + }, + { + 1452, + 2113, + 5564, + 1658, + 2549, + 3735, + }, + { + 1552, + 2285, + 4022, + 4139, + 1634, + 2496, + }, + { + 1431, + 2117, + 4050, + 4139, + 1634, + 2496, + }, + { + 1486, + 2150, + 3778, + 2775, + 1761, + 4515, + }, + { + 1386, + 2041, + 3418, + 2775, + 1761, + 4515, + }, + { + 3371, + 0, + 0, + 2568, + 5036, + 0, + }, + { + 3031, + 6023, + 0, + 3733, + 0, + 0, + }, + { + 2801, + 4704, + 0, + 3733, + 0, + 0, + }, + { + 2801, + 4704, + 0, + 4065, + 0, + 0, + }, + { + 2197, + 3815, + 6617, + 3436, + 0, + 0, + }, + { + 2197, + 3815, + 6617, + 2568, + 5036, + 0, + }, + { + 2162, + 3229, + 5052, + 3698, + 6123, + 0, + }, + { + 2314, + 3723, + 1712, + 4065, + 0, + 0, + }, + { + 1947, + 3055, + 5111, + 2570, + 6084, + 0, + }, + { + 2351, + 3770, + 1665, + 2570, + 6084, + 0, + }, + { + 2351, + 1656, + 3932, + 3133, + 5603, + 0, + }, + { + 2469, + 1742, + 4464, + 3098, + 6504, + 0, + }, + { + 1646, + 2457, + 4046, + 3080, + 6574, + 0, + }, + { + 2336, + 1650, + 3921, + 4040, + 2387, + 7604, + }, + { + 2289, + 1593, + 4149, + 2537, + 4380, + 7731, + }, + { + 1576, + 2322, + 3921, + 2521, + 4706, + 7946, + }, + { + 2099, + 1452, + 3545, + 2521, + 4706, + 7946, + }, + { + 1980, + 1460, + 3385, + 3768, + 2252, + 5793, + }, + { + 2025, + 1429, + 3278, + 2224, + 4022, + 5902, + }, + { + 1232, + 1779, + 2904, + 2588, + 1564, + 4542, + }, + { + 1746, + 3622, + 9062, + 2048, + 2048, + 2048, + }, + { + 2070, + 3405, + 9017, + 3231, + 0, + 0, + }, + { + 2070, + 3405, + 9017, + 2461, + 4964, + 0, + }, + { + 1804, + 3313, + 8470, + 2461, + 4964, + 0, + }, + { + 1734, + 3667, + 9146, + 2461, + 4964, + 0, + }, + { + 1372, + 2277, + 4892, + 2461, + 4964, + 0, + }, + { + 2316, + 3717, + 1630, + 2590, + 5722, + 0, + }, + { + 1167, + 1646, + 2451, + 2379, + 3991, + 1490, + }, + { + 2140, + 3248, + 7688, + 3418, + 0, + 0, + }, + { + 2252, + 3284, + 4700, + 2732, + 4962, + 0, + }, + { + 2234, + 3588, + 6479, + 2881, + 0, + 0, + }, + { + 2234, + 3588, + 6479, + 2756, + 5171, + 0, + }, + { + 2234, + 3588, + 6479, + 2230, + 3448, + 5167, + }, + { + 1925, + 2762, + 3897, + 2455, + 3665, + 5251, + }, + { + 1802, + 2621, + 5783, + 2250, + 3553, + 0, + }, + { + 1701, + 2488, + 5994, + 2230, + 3497, + 5076, + }, + { + 1781, + 2717, + 5951, + 2183, + 3520, + 5480, + }, + { + 1566, + 6379, + 3723, + 2299, + 4728, + 9779, + }, + { + 1581, + 2297, + 4814, + 2961, + 1933, + 4243, + }, + { + 1435, + 2000, + 3559, + 1939, + 2975, + 4263, + }, + { + 1472, + 2091, + 3483, + 2291, + 1626, + 3473, + }, + { + 1718, + 1310, + 3117, + 2289, + 3475, + 1630, + }, + { + 1718, + 1310, + 3117, + 1968, + 3008, + 1447, + }, + { + 1310, + 1810, + 3547, + 1546, + 2232, + 3170, + }, + { + 2494, + 1630, + 4675, + 2641, + 6809, + 0, + }, + { + 3256, + 1710, + 9084, + 2246, + 6287, + 0, + }, + { + 2035, + 5359, + 0, + 2234, + 4573, + 7079, + }, + { + 1816, + 3221, + 7256, + 2228, + 3741, + 6281, + }, + { + 1714, + 2535, + 3897, + 2658, + 5728, + 0, + }, + { + 2330, + 5787, + 0, + 2265, + 5726, + 8992, + }, + { + 1927, + 3954, + 9160, + 1394, + 2592, + 4767, + }, + { + 2768, + 8871, + 0, + 1679, + 3164, + 8550, + }, + { + 2750, + 7387, + 0, + 1759, + 2975, + 5304, + }, + { + 2473, + 5611, + 0, + 1554, + 2539, + 4468, + }, + { + 2299, + 5603, + 0, + 1789, + 3067, + 5296, + }, + { + 1882, + 5060, + 0, + 1259, + 2195, + 4292, + }, + { + 3170, + 9232, + 0, + 1689, + 4460, + 8816, + }, + { + 2492, + 5935, + 0, + 1509, + 2492, + 3952, + }, + { + 1998, + 4485, + 11706, + 3084, + 1314, + 8624, + }, + { + 2267, + 5314, + 0, + 2666, + 1236, + 1802, + } + }; +const Word16 scales_p_ivas_fx[][MAX_NO_SCALES * 2] = /* 2 subvectors 20 modes Q11 */ + { + { + 2998, + 4861, + 0, + 0, + 0, + 0, + }, + { + 2629, + 4421, + 0, + 0, + 0, + 0, + }, + { + 2549, + 5304, + 0, + 0, + 0, + 0, + }, + { + 2338, + 3805, + 5994, + 0, + 0, + 0, + }, + { + 2125, + 3762, + 6162, + 0, + 0, + 0, + }, + { + 3102, + 0, + 0, + 3153, + 0, + 0, + }, + { + 3244, + 0, + 0, + 3153, + 0, + 0, + }, + { + 3244, + 0, + 0, + 3317, + 0, + 0, + }, + { + 2629, + 4421, + 0, + 3317, + 0, + 0, + }, + { + 2549, + 5304, + 0, + 3153, + 0, + 0, + }, + { + 2590, + 5251, + 0, + 3354, + 0, + 0, + }, + { + 2338, + 3805, + 5994, + 3317, + 0, + 0, + }, + { + 2125, + 3762, + 6162, + 3317, + 0, + 0, + }, + { + 2023, + 3401, + 5199, + 3317, + 0, + 0, + }, + { + 2177, + 3487, + 5744, + 2650, + 4818, + 0, + }, + { + 2177, + 3926, + 6273, + 2795, + 0, + 0, + }, + { + 1871, + 2891, + 4552, + 2650, + 4818, + 0, + }, + { + 1843, + 2887, + 4616, + 2658, + 4941, + 0, + }, + { + 1806, + 2869, + 4919, + 2689, + 4999, + 0, + }, + { + 2777, + 1775, + 4868, + 2191, + 3452, + 5214, + }, + { + 1732, + 2760, + 5214, + 2203, + 3567, + 5443, + }, + { + 1730, + 2824, + 5255, + 2086, + 3229, + 5003, + }, + { + 1548, + 2435, + 5732, + 2220, + 3694, + 5648, + }, + { + 1546, + 2494, + 5777, + 1933, + 2934, + 4040, + }, + { + 1525, + 2451, + 5935, + 2543, + 1726, + 3997, + }, + { + 1482, + 2529, + 6025, + 2570, + 1736, + 4096, + }, + { + 1406, + 2279, + 4788, + 1746, + 2719, + 3981, + }, + { + 1327, + 2107, + 3760, + 1748, + 2777, + 4016, + }, + { + 1243, + 1912, + 3106, + 1603, + 2484, + 3141, + }, + { + 1226, + 1853, + 3131, + 1497, + 2275, + 3072, + }, + { + 1327, + 2107, + 3760, + 1406, + 2166, + 3891, + }, + { + 3303, + 0, + 0, + 0, + 0, + 0, + }, + { + 2594, + 5068, + 0, + 3315, + 0, + 0, + }, + { + 2076, + 3338, + 5046, + 2631, + 4405, + 0, + }, + { + 1828, + 2846, + 4739, + 3000, + 4708, + 0, + }, + { + 1904, + 2869, + 4403, + 2621, + 4616, + 0, + }, + { + 1828, + 2846, + 4739, + 2613, + 4517, + 6111, + }, + { + 1828, + 2846, + 4739, + 2121, + 3371, + 5060, + }, + { + 1755, + 2738, + 5046, + 2136, + 3543, + 5376, + }, + { + 1566, + 2496, + 3180, + 2121, + 3371, + 5060, + }, + { + 1615, + 2719, + 3383, + 2154, + 3653, + 5541, + }, + { + 1564, + 2506, + 3184, + 1884, + 2955, + 4167, + }, + { + 1357, + 2172, + 2535, + 2824, + 1839, + 3995, + }, + { + 1378, + 2260, + 2674, + 2578, + 1695, + 4001, + }, + { + 1363, + 2193, + 2557, + 1644, + 2541, + 3540, + }, + { + 1347, + 2127, + 2486, + 1945, + 1333, + 2926, + }, + { + 3276, + 0, + 0, + 3180, + 0, + 0, + }, + { + 2674, + 4970, + 0, + 3235, + 0, + 0, + }, + { + 2674, + 4970, + 0, + 3432, + 0, + 0, + }, + { + 2560, + 5926, + 0, + 3235, + 0, + 0, + }, + { + 2322, + 4067, + 6748, + 3180, + 0, + 0, + }, + { + 2340, + 4202, + 6850, + 3432, + 0, + 0, + }, + { + 2138, + 4159, + 7141, + 3432, + 0, + 0, + }, + { + 2021, + 3661, + 5445, + 3373, + 0, + 0, + }, + { + 1841, + 3280, + 5281, + 3373, + 0, + 0, + }, + { + 1632, + 2650, + 4382, + 3373, + 0, + 0, + }, + { + 1632, + 2650, + 4382, + 2734, + 4556, + 0, + }, + { + 1517, + 2357, + 3719, + 2734, + 4556, + 0, + }, + { + 2007, + 3485, + 1445, + 2697, + 5382, + 0, + }, + { + 1632, + 2650, + 4382, + 2428, + 3956, + 0, + }, + { + 1517, + 2357, + 3719, + 2383, + 3733, + 5670, + }, + { + 1449, + 2306, + 3999, + 2203, + 3543, + 5687, + }, + { + 1351, + 2148, + 3217, + 2203, + 3543, + 5687, + }, + { + 1355, + 2101, + 3182, + 2199, + 3917, + 6189, + }, + { + 1351, + 2148, + 3217, + 2947, + 1896, + 4364, + }, + { + 1290, + 1978, + 3117, + 2686, + 1804, + 4519, + }, + { + 1263, + 1886, + 2963, + 2113, + 3172, + 1548, + }, + { + 3266, + 0, + 0, + 3076, + 0, + 0, + }, + { + 2299, + 3985, + 7643, + 3076, + 0, + 0, + }, + { + 2115, + 4249, + 8886, + 2906, + 5009, + 0, + }, + { + 2017, + 3672, + 12216, + 2623, + 4759, + 0, + }, + { + 1804, + 3289, + 14325, + 2906, + 5009, + 0, + }, + { + 1728, + 3239, + 14376, + 2623, + 4759, + 0, + }, + { + 1615, + 3112, + 14751, + 2623, + 4759, + 0, + }, + { + 1779, + 3168, + 14325, + 2109, + 3592, + 6352, + }, + { + 1673, + 3055, + 14581, + 2109, + 3592, + 6352, + }, + { + 1546, + 2830, + 14608, + 2109, + 3592, + 6352, + }, + { + 1445, + 2693, + 14796, + 2109, + 3592, + 6352, + }, + { + 1411, + 2654, + 14929, + 2080, + 3840, + 6633, + }, + { + 1429, + 2611, + 14764, + 1871, + 3170, + 4982, + }, + { + 1390, + 2693, + 14929, + 2516, + 3778, + 1665, + }, + { + 1390, + 2693, + 14929, + 2433, + 1581, + 4003, + }, + { + 2070, + 3639, + 5652, + 3305, + 0, + 0, + }, + { + 1974, + 3235, + 8183, + 3540, + 0, + 0, + }, + { + 1798, + 2949, + 4687, + 3540, + 0, + 0, + }, + { + 1744, + 3364, + 4974, + 3540, + 0, + 0, + }, + { + 1746, + 2830, + 4231, + 2549, + 5486, + 0, + }, + { + 2471, + 1593, + 4521, + 2549, + 5486, + 0, + }, + { + 1646, + 2772, + 5421, + 2883, + 5355, + 0, + }, + { + 1601, + 2568, + 5732, + 2822, + 5545, + 0, + }, + { + 2471, + 1593, + 4521, + 2074, + 3751, + 6252, + }, + { + 2471, + 1593, + 4521, + 2908, + 1785, + 4771, + }, + { + 1398, + 2080, + 3661, + 2306, + 3862, + 5988, + }, + { + 1284, + 1878, + 2965, + 2306, + 3862, + 5988, + }, + { + 1347, + 2105, + 3188, + 3035, + 1996, + 4397, + }, + { + 1626, + 1187, + 2725, + 3035, + 1996, + 4397, + }, + { + 1685, + 1212, + 2709, + 2756, + 1832, + 4726, + }, + { + 2248, + 1511, + 1136, + 1779, + 2641, + 3813, + }, + { + 1552, + 2275, + 1126, + 1783, + 2799, + 3903, + }, + { + 1128, + 1568, + 2285, + 1619, + 2459, + 3405, + }, + { + 1128, + 1568, + 2285, + 1972, + 1427, + 2709, + }, + { + 1075, + 1576, + 2197, + 1669, + 2533, + 1161, + }, + { + 2191, + 3667, + 7993, + 3274, + 0, + 0, + }, + { + 1679, + 2492, + 4278, + 2570, + 4689, + 0, + }, + { + 1597, + 2394, + 5109, + 2570, + 4689, + 0, + }, + { + 2201, + 1480, + 4835, + 2273, + 4016, + 7149, + }, + { + 1415, + 2107, + 4786, + 2117, + 3667, + 8200, + }, + { + 1374, + 2203, + 5337, + 1955, + 3168, + 5148, + }, + { + 2424, + 1589, + 4335, + 2164, + 3420, + 1380, + }, + { + 1937, + 2965, + 5576, + 2854, + 5416, + 9381, + }, + { + 1941, + 2977, + 5576, + 4034, + 2404, + 7135, + }, + { + 1812, + 2879, + 5658, + 4034, + 2404, + 7135, + }, + { + 2549, + 1724, + 4870, + 4093, + 2392, + 7540, + }, + { + 1781, + 2756, + 5763, + 3571, + 2166, + 5933, + }, + { + 1693, + 2496, + 4456, + 3252, + 5324, + 2037, + }, + { + 1673, + 2428, + 4079, + 3262, + 1994, + 5363, + }, + { + 1683, + 2467, + 4298, + 2998, + 1851, + 4911, + }, + { + 1683, + 2467, + 4298, + 4204, + 1714, + 2783, + }, + { + 1067, + 1529, + 2115, + 1630, + 2729, + 1110, + }, + { + 3438, + 0, + 0, + 2625, + 5060, + 0, + }, + { + 2228, + 3786, + 6543, + 3454, + 0, + 0, + }, + { + 2228, + 3786, + 6543, + 2625, + 5060, + 0, + }, + { + 2306, + 3459, + 1617, + 2625, + 5060, + 0, + }, + { + 1904, + 2830, + 1396, + 2625, + 5060, + 0, + }, + { + 2283, + 1626, + 3792, + 2623, + 6211, + 0, + }, + { + 1720, + 2818, + 1275, + 1638, + 2899, + 8724, + }, + { + 1640, + 2351, + 3690, + 0, + 0, + 0, + }, + { + 2752, + 5380, + 0, + 3223, + 0, + 0, + }, + { + 2580, + 4188, + 0, + 3223, + 0, + 0, + }, + { + 2580, + 4188, + 0, + 3430, + 0, + 0, + }, + { + 2230, + 3710, + 6496, + 3434, + 0, + 0, + }, + { + 2230, + 3899, + 6596, + 3115, + 5396, + 0, + }, + { + 1972, + 2949, + 4335, + 3430, + 0, + 0, + }, + { + 1972, + 2949, + 4335, + 2666, + 4935, + 0, + }, + { + 1730, + 2482, + 3960, + 2689, + 4954, + 0, + }, + { + 1595, + 2242, + 3481, + 2689, + 4954, + 0, + }, + { + 1480, + 2078, + 3407, + 2689, + 4954, + 0, + }, + { + 2066, + 3414, + 1540, + 2676, + 6187, + 0, + }, + { + 2058, + 3373, + 1533, + 2179, + 3831, + 6856, + }, + { + 1832, + 3051, + 1396, + 2179, + 3831, + 6856, + }, + { + 1611, + 2605, + 1245, + 2179, + 3831, + 6856, + }, + { + 1763, + 1327, + 2988, + 2179, + 3831, + 6856, + }, + { + 1697, + 1292, + 2738, + 2168, + 4161, + 7020, + }, + { + 1763, + 1327, + 2988, + 3155, + 1884, + 5142, + }, + { + 1736, + 1296, + 2781, + 2883, + 1800, + 5552, + }, + { + 1828, + 1335, + 2945, + 2203, + 1474, + 3674, + }, + { + 2783, + 4722, + 0, + 3418, + 0, + 0, + }, + { + 2205, + 3946, + 7262, + 3418, + 0, + 0, + }, + { + 2205, + 4161, + 7327, + 2926, + 5552, + 0, + }, + { + 1705, + 2566, + 4311, + 2627, + 5234, + 0, + }, + { + 1589, + 2359, + 3805, + 2627, + 5234, + 0, + }, + { + 1472, + 2183, + 3547, + 2627, + 5234, + 0, + }, + { + 1927, + 1333, + 3205, + 1478, + 2437, + 3973, + }, + { + 2646, + 5076, + 0, + 3155, + 0, + 0, + }, + { + 2461, + 3897, + 0, + 3155, + 0, + 0, + }, + { + 2105, + 3360, + 5027, + 3375, + 0, + 0, + }, + { + 2553, + 1798, + 4769, + 3375, + 0, + 0, + }, + { + 1767, + 2781, + 5165, + 3375, + 0, + 0, + }, + { + 1673, + 2502, + 4116, + 2199, + 3655, + 5597, + }, + { + 1669, + 1253, + 2623, + 2160, + 3530, + 6045, + }, + { + 3164, + 0, + 0, + 3170, + 0, + 0, + }, + { + 3358, + 0, + 0, + 3170, + 0, + 0, + }, + { + 2723, + 0, + 0, + 3270, + 0, + 0, + }, + { + 2529, + 4743, + 0, + 3270, + 0, + 0, + }, + { + 2635, + 5629, + 0, + 3170, + 0, + 0, + }, + { + 2635, + 5629, + 0, + 3387, + 0, + 0, + }, + { + 2437, + 4149, + 0, + 3387, + 0, + 0, + }, + { + 1949, + 3428, + 5656, + 3270, + 0, + 0, + }, + { + 1880, + 3217, + 6574, + 3270, + 0, + 0, + }, + { + 2572, + 1622, + 4255, + 3270, + 0, + 0, + }, + { + 1550, + 2463, + 3837, + 3270, + 0, + 0, + }, + { + 1906, + 2985, + 5017, + 2650, + 5615, + 0, + }, + { + 2287, + 1507, + 3840, + 2562, + 5257, + 0, + }, + { + 1581, + 2531, + 3934, + 2562, + 5257, + 0, + }, + { + 1796, + 2859, + 5605, + 2213, + 3719, + 6881, + }, + { + 2316, + 3350, + 0, + 2807, + 0, + 0, + }, + { + 1826, + 3260, + 7012, + 2658, + 6565, + 0, + }, + { + 1792, + 3168, + 7084, + 2631, + 5937, + 8499, + }, + { + 1732, + 3379, + 6772, + 2611, + 5009, + 8202, + }, + { + 1654, + 6285, + 3514, + 2611, + 5009, + 8202, + }, + { + 1566, + 6406, + 3733, + 2611, + 5009, + 8202, + }, + { + 1912, + 2615, + 1490, + 2369, + 3475, + 0, + }, + { + 1705, + 2379, + 1347, + 2357, + 3454, + 0, + }, + { + 1538, + 2113, + 1224, + 2357, + 3454, + 0, + }, + { + 1554, + 6426, + 3778, + 1888, + 3088, + 6369, + }, + { + 1452, + 2058, + 1167, + 2170, + 3629, + 5568, + }, + { + 1527, + 2050, + 1230, + 2056, + 3692, + 5922, + }, + { + 1521, + 2048, + 1226, + 1916, + 3811, + 5885, + }, + { + 1536, + 6492, + 3942, + 1509, + 2914, + 5502, + }, + { + 1536, + 6492, + 3942, + 1349, + 2168, + 4044, + }, + { + 1587, + 1257, + 2123, + 1630, + 2670, + 3901, + }, + { + 1830, + 2742, + 5220, + 2678, + 5326, + 0, + }, + { + 1703, + 2568, + 3966, + 2676, + 5353, + 0, + }, + { + 1703, + 2523, + 3923, + 2371, + 4048, + 0, + }, + { + 1689, + 2580, + 4081, + 2095, + 3561, + 5726, + }, + { + 1536, + 2281, + 3201, + 2140, + 3690, + 5490, + }, + { + 1417, + 2048, + 2930, + 2095, + 3561, + 5726, + }, + { + 1474, + 2072, + 3272, + 3096, + 1896, + 4376, + }, + { + 1394, + 1992, + 3377, + 2828, + 1794, + 4360, + }, + { + 1400, + 1974, + 3358, + 2392, + 3637, + 1611, + }, + { + 1368, + 1914, + 3176, + 2080, + 3108, + 1458, + }, + { + 1349, + 1865, + 2918, + 2738, + 1820, + 1314, + }, + { + 1349, + 1865, + 2918, + 1718, + 2635, + 1243, + }, + { + 3344, + 0, + 0, + 3454, + 0, + 0, + }, + { + 3463, + 0, + 0, + 3428, + 0, + 0, + }, + { + 2719, + 5251, + 0, + 3180, + 0, + 0, + }, + { + 2560, + 4079, + 0, + 3180, + 0, + 0, + }, + { + 2560, + 4079, + 0, + 3428, + 0, + 0, + }, + { + 2203, + 3665, + 6025, + 3454, + 0, + 0, + }, + { + 2183, + 3446, + 8349, + 3428, + 0, + 0, + }, + { + 2621, + 1865, + 5072, + 3428, + 0, + 0, + }, + { + 1708, + 2516, + 3870, + 3454, + 0, + 0, + }, + { + 1921, + 2875, + 4409, + 2674, + 5386, + 0, + }, + { + 2744, + 1814, + 4751, + 2674, + 5386, + 0, + }, + { + 1705, + 2560, + 3907, + 2674, + 5386, + 0, + }, + { + 1705, + 2484, + 3835, + 2304, + 3766, + 5773, + }, + { + 1748, + 2594, + 3743, + 2138, + 3604, + 5902, + }, + { + 1566, + 2379, + 3461, + 2097, + 3559, + 5812, + }, + { + 1484, + 2150, + 3667, + 3031, + 1888, + 6356, + }, + { + 1458, + 2072, + 3172, + 3059, + 1849, + 6889, + }, + { + 1349, + 1898, + 2779, + 3059, + 1849, + 6889, + }, + { + 1683, + 1257, + 2637, + 1863, + 3090, + 4618, + }, + { + 1722, + 1277, + 2617, + 2377, + 1560, + 3702, + }, + { + 1716, + 1273, + 2592, + 2211, + 1456, + 3502, + }, + { + 1703, + 1267, + 2611, + 1921, + 2928, + 1318, + }, + { + 1810, + 2762, + 5263, + 2691, + 5343, + 0, + }, + { + 2009, + 3016, + 5701, + 3461, + 6844, + 0, + }, + { + 1976, + 3100, + 5500, + 2885, + 5089, + 8081, + }, + { + 1998, + 2983, + 5453, + 4405, + 2603, + 8552, + }, + { + 2029, + 3080, + 6320, + 5091, + 2693, + 9277, + }, + { + 1937, + 2965, + 5576, + 2854, + 5416, + 9381, + }, + { + 1456, + 2084, + 3307, + 3035, + 1886, + 7026, + }, + { + 1390, + 1994, + 3397, + 1941, + 3172, + 7061, + }, + { + 1701, + 1265, + 3033, + 1910, + 3100, + 4730, + }, + { + 1671, + 1249, + 2871, + 2920, + 1796, + 4638, + }, + { + 1611, + 2574, + 1220, + 1759, + 2963, + 4978, + }, + { + 1611, + 2574, + 1220, + 2265, + 1505, + 3397, + } + }; + + +/*-----------------------------------------------------------------* + * FFT transform tables + *-----------------------------------------------------------------*/ const Word16 w_fft4_fx[2] = { // Q15 @@ -6130,6 +37260,7 @@ const Word16 cos_twiddle_table_25_5_5[25] = { SHC( 0x8103 ), SHC( 0xae69 ), }; + const Word16 sin_twiddle_table_25_5_5[25] = { // Q15 SHC( 0x0000 ), @@ -6666,7 +37797,9 @@ const Word16 lsf_q_cb_3b_fx[8] = { 1739, 2011, 2365, 2953 }; -const Word16 *const lsf_q_cb_fx[NUM_Q_LSF] = { lsf_q_cb_4b_fx, lsf_q_cb_4b_fx, lsf_q_cb_3b_fx, lsf_q_cb_3b_fx, lsf_q_cb_3b_fx }; // Q15 +const Word16 *const lsf_q_cb_fx[NUM_Q_LSF] = { + lsf_q_cb_4b_fx, lsf_q_cb_4b_fx, lsf_q_cb_3b_fx, lsf_q_cb_3b_fx, lsf_q_cb_3b_fx +}; // Q15 /*Q15*/ const Word16 lsf_grid_fx[4][5] = { @@ -6701,4 +37834,6 @@ const Word16 lsf_grid_fx[4][5] = { }; /*Q15*/ -const Word16 grid_smoothing_fx[5] = { 6554, 11469, 16384, 24576, 26214 }; +const Word16 grid_smoothing_fx[5] = { + 6554, 11469, 16384, 24576, 26214 +}; diff --git a/lib_com/rom_com_fx.h b/lib_com/rom_com_fx.h deleted file mode 100644 index 29e7637574ac2d2085f44ff635a71493440b7444..0000000000000000000000000000000000000000 --- a/lib_com/rom_com_fx.h +++ /dev/null @@ -1,120 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - 3GPP TS26.258 Aug 24, 2023. IVAS Codec Version IVAS-FL-1.0 - ====================================================================================*/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#ifndef ROM_COM_FX_H -#define ROM_COM_FX_H - -#include "typedef.h" - -/*------------------------------------------------------------------------------* - * FFT transform - *------------------------------------------------------------------------------*/ - -extern const Word16 w_fft64_fx[32]; // Q15 -extern const Word16 w_fft32_fx[16]; // Q15 -extern const Word16 w_fft16_fx[8]; // Q15 -extern const Word16 w_fft8_fx[8]; // Q15 -extern const Word16 w_fft128_fx[64]; // Q15 -extern const Word16 w_fft256_fx[128]; // Q15 -extern const Word16 w_fft512_fx[256]; // Q15 -extern const Word16 w_fft4_fx[2]; // Q15 - -extern const Word16 FFT_RotVector_960_fx[1860]; // Q15 -extern const Word16 FFT_RotVector_640_fx[1240]; // Q15 -extern const Word16 FFT_RotVector_600_fx[1140]; // Q15 -extern const Word16 FFT_RotVector_400_fx[760]; // Q15 -extern const Word16 FFT_RotVector_256_fx[448]; // Q15 -extern const Word16 FFT_RotVector_32_fx[40]; // Q15 - -extern const Word16 sincos_t_rad3_fx[T_SIN_PI_2 + 1]; // Q15 - -extern const Word16 cos_twiddle_table_25_5_5[25]; // Q15 -extern const Word16 sin_twiddle_table_25_5_5[25]; // Q15 -extern const Word16 cos_twiddle_table_16_8_2[16]; // Q15 -extern const Word16 sin_twiddle_table_16_8_2[16]; // Q15 - - -extern const Word16 CLDFB80_10_fx[100]; // Q15 -extern const Word16 CLDFB80_16_fx[160]; // Q15 -extern const Word16 CLDFB80_20_fx[200]; // Q15 -extern const Word16 CLDFB80_30_fx[300]; // Q15 -extern const Word16 CLDFB80_32_fx[320]; // Q15 -extern const Word16 CLDFB80_40_fx[400]; // Q15 -extern const Word16 CLDFB80_60_fx[600]; // Q15 - -/*5ms delay*/ -extern const Word16 LDQMF_10_fx[100]; // Q15 -extern const Word16 LDQMF_16_fx[160]; // Q15 -extern const Word16 LDQMF_20_fx[200]; // Q15 -extern const Word16 LDQMF_30_fx[300]; // Q15 -extern const Word16 LDQMF_32_fx[320]; // Q15 -extern const Word16 LDQMF_40_fx[400]; // Q15 -extern const Word16 LDQMF_60_fx[600]; // Q15 -/* Not used anywhere -extern const Word16 LDQMF_10_enc_fx[100]; -extern const Word16 LDQMF_16_enc_fx[160]; -extern const Word16 LDQMF_20_enc_fx[200]; -extern const Word16 LDQMF_30_enc_fx[300]; -extern const Word16 LDQMF_32_enc_fx[320]; -extern const Word16 LDQMF_40_enc_fx[400]; -extern const Word16 LDQMF_60_enc_fx[600]; -*/ -extern const Word32 rot_vec_delay_re_LDQMF_fx[60]; // Q31 -extern const Word32 rot_vec_delay_im_LDQMF_fx[60]; // Q31 - -extern const Word32 rot_vec_ana_re_L10_fx[5]; // Q29 -extern const Word32 rot_vec_ana_im_L10_fx[5]; // Q29 -extern const Word32 rot_vec_ana_re_L16_fx[8]; // Q29 -extern const Word32 rot_vec_ana_im_L16_fx[8]; // Q29 -extern const Word32 rot_vec_ana_re_L20_fx[10]; // Q29 -extern const Word32 rot_vec_ana_im_L20_fx[10]; // Q29 -extern const Word32 rot_vec_ana_re_L30_fx[15]; // Q29 -extern const Word32 rot_vec_ana_im_L30_fx[15]; // Q29 -extern const Word32 rot_vec_ana_re_L32_fx[16]; // Q29 -extern const Word32 rot_vec_ana_im_L32_fx[16]; // Q29 -extern const Word32 rot_vec_ana_re_L40_fx[20]; // Q29 -extern const Word32 rot_vec_ana_im_L40_fx[20]; // Q29 -extern const Word32 rot_vec_ana_re_L60_fx[30]; // Q29 -extern const Word32 rot_vec_ana_im_L60_fx[30]; // Q29 - -extern const Word16 LP_assym_window_fx[]; /* Assymetric window for LP analysis @12.8kHz (Q15) */ -extern const Word16 LP_assym_window_16k_fx[]; /* Assymetric window for LP analysis @16kHz (Q15) */ - -#endif diff --git a/lib_com/scale_mem_fx.c b/lib_com/scale_mem_fx.c index 2ce2ffd12b8aad3cf41c48a53bfb7c253b1ee80b..52ba436de439de14d69c2f354877fac9f50390cb 100644 --- a/lib_com/scale_mem_fx.c +++ b/lib_com/scale_mem_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include "options.h" /* Common prototypes */ @@ -307,12 +307,10 @@ void scale_sig32( /* saturation can occur here */ x[i] = L_shl( x[i], exp0 ); move32(); -#ifdef OPT_STEREO_32KBPS_V1 if ( 0 == exp0 ) { i = lg; } -#endif /* OPT_STEREO_32KBPS_V1 */ } } @@ -329,12 +327,10 @@ void scale_sig32_r( /* saturation can occur here */ x[i] = L_shl_r( x[i], exp0 ); move32(); -#ifdef OPT_STEREO_32KBPS_V1 if ( 0 == exp0 ) { i = lg; } -#endif /* OPT_STEREO_32KBPS_V1 */ } } diff --git a/lib_com/stab_est_fx.c b/lib_com/stab_est_fx.c index 15cd254dfb9fbb09fc2dcacf3828682921c94baf..4b553eb5457a243400180d8cfa78b0b02dfe4e1e 100644 --- a/lib_com/stab_est_fx.c +++ b/lib_com/stab_est_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ diff --git a/lib_com/stat_com.h b/lib_com/stat_com.h index f99d498027a98db71cfbed521e46712659506917..2a37faef604e3c4189d8c939b9a99be895941167 100644 --- a/lib_com/stat_com.h +++ b/lib_com/stat_com.h @@ -31,13 +31,14 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef STAT_COM_H #define STAT_COM_H +#include "ivas_cnst.h" #include #include "options.h" #include "typedef.h" @@ -377,7 +378,8 @@ typedef struct Word16 *olapBufferAna; /* q_olapBufferAna */ /* points to FD_CNG_DEC->olapBufferAna[FFTLEN] in case of decoder */ Word16 olapBufferAna_fx[FFTLEN]; /* q_olapBufferAna_fx */ /* points to FD_CNG_DEC->olapBufferAna[FFTLEN] in case of decoder */ Word16 olapBufferSynth[FFTLEN]; /* q_olapBuffer */ - Word16 *olapBufferSynth2; /*Q_syn*/ /* points to FD_CNG_DEC->olapBufferSynth2[FFTLEN] in case of decoder */ + Word16 olapBufferSynth_exp; + Word16 *olapBufferSynth2; /*Q_syn*/ /* points to FD_CNG_DEC->olapBufferSynth2[FFTLEN] in case of decoder */ const PWord16 *olapWinAna; const PWord16 *olapWinSyn; @@ -441,9 +443,9 @@ typedef struct Word16 CngBandwidth; Word16 flag_noisy_speech; - Word16 likelihood_noisy_speech; /* Q15 */ - Word16 coherence_fx; /* inter-channel coherence of noise Q15 */ - Word16 no_side_flag; /* indicates whether the side noise shape should be zeroed-out or not */ + Word16 likelihood_noisy_speech; /* Q15 */ + Word16 coherence_fx[MDCT_ST_DTX_NUM_COHERENCE_BANDS]; /* inter-channel coherence of noise Q15 */ + Word16 no_side_flag; /* indicates whether the side noise shape should be zeroed-out or not */ } FD_CNG_COM, *HANDLE_FD_CNG_COM; @@ -557,11 +559,12 @@ typedef struct ParamsBitMap struct TnsParameters { /* Parameters for each TNS filter */ - Word16 startLineFrequency; /* Starting lower frequency of the TNS filter [20..16000] */ - Word16 nSubdivisions; /* Number of spectrum subdivisions in which the filter operates [1..8) */ - Word16 minPredictionGain; /* Minimum prediction gain required to turn on the TNS filter. Exponent = PRED_GAIN_E */ - Word16 minAvgSqrCoef; /* Minimum average square of coefficients required to turn on the TNS filter. Exponent = 0 */ - Word16 minEnergyChange; /* Minimum energy change required to turn on the TNS filter. Exponent = 8 */ + Word16 startLineFrequency; /* Starting lower frequency of the TNS filter [20..16000] */ + Word16 nSubdivisions; /* Number of spectrum subdivisions in which the filter operates [1..8) */ + Word16 minPredictionGain; /* Minimum prediction gain required to turn on the TNS filter. Exponent = PRED_GAIN_E */ + Word32 minPredictionGain_32; /* Minimum prediction gain required to turn on the TNS filter. Exponent = PRED_GAIN_E */ + Word16 minAvgSqrCoef; /* Minimum average square of coefficients required to turn on the TNS filter. Exponent = 0 */ + Word16 minEnergyChange; /* Minimum energy change required to turn on the TNS filter. Exponent = 8 */ }; /**********************************************/ @@ -575,7 +578,6 @@ typedef struct UWord8 nBits; } Coding; - /* Scale TCX setup */ typedef struct { @@ -588,7 +590,6 @@ typedef struct } SCALE_TCX_SETUP; - typedef struct { UWord16 frame_bits; /*Bits per frame*/ @@ -602,7 +603,7 @@ typedef struct } FrameSizeParams; -typedef struct cldfb_filter_bank_struct +typedef struct ivas_cldfb_filter_bank_struct { Word16 no_channels; Word16 no_col; @@ -616,9 +617,8 @@ typedef struct cldfb_filter_bank_struct Word16 ds; /* delay synthesis */ Word16 da; /* delay analysis */ CLDFB_PROTOTYPE prototype; - const Word16 *p_filter; /*!< Pointer to filter coefficients */ // Q15 - Word16 p_filter_sf; // Q0 - + const Word16 *p_filter; /*!< Pointer to filter coefficients */ // Q15 + const Word32 *p_filter_32; /*!< Pointer to filter coefficients */ // Q15 /* rotation vectors */ const Word32 *rot_vec_syn_re_fx; // Q29 @@ -626,12 +626,14 @@ typedef struct cldfb_filter_bank_struct const Word32 *rot_vec_syn_delay_re_fx; // Q31 const Word32 *rot_vec_syn_delay_im_fx; // Q31 + /* rotation vectors for delay */ const Word32 *rot_vec_ana_re_fx; // Q29 const Word32 *rot_vec_ana_im_fx; // Q29 const Word32 *rot_vec_ana_delay_re_fx; // Q31 const Word32 *rot_vec_ana_delay_im_fx; // Q31 + // Fix variables Word16 *FilterStates; /*!< Pointer to buffer of filter states Q15-FilterStates_eg*/ Word16 FilterStates_e[CLDFB_NO_COL_MAX + 9]; /*!< Filter states time slot exponents */ @@ -641,17 +643,14 @@ typedef struct cldfb_filter_bank_struct const Word16 *iRotVctr; /*Q(sqrt(1.0/16.00))*/ Word16 filterScale; /*!< filter scale Q0*/ - Word16 synGain; /*!< gain for synthesis filterbank Q0*/ - Word16 anaScalefactor; /*!< Scale factor of analysis cldfb Q0*/ - Word16 synScalefactor; /*!< Scale factor of synthesis cldfb Q0*/ - Word16 outScalefactor; /*!< Scale factor of output data (syn only) Q0*/ - Word16 synFilterHeadroom; /*!< Headroom for states in synthesis cldfb filterbank Q0*/ - + Word16 synGain; /*!< gain for synthesis filterbank Q0*/ + Word16 anaScalefactor; /*!< Scale factor of analysis cldfb Q0*/ + Word16 synScalefactor; /*!< Scale factor of synthesis cldfb Q0*/ + Word16 outScalefactor; /*!< Scale factor of output data (syn only) Q0*/ /* memory helper states */ Word16 *memory; // Qx Word32 *memory32; // Q_cldfb_state /*because cldfb_state_fx is word32 which is used to assign values*/ - UWord16 memory_length; /* main filter state */ @@ -662,13 +661,10 @@ typedef struct cldfb_filter_bank_struct /* other parameters */ Word16 bandsToZero; /* bands not synthesized */ - Word16 nab; /* number of active bands */ - Word16 filtermode; - Word16 scale; /* scaling of frequency domain */ /* Q8 */ + Word16 scale; /* scaling of frequency domain Q8 */ } CLDFB_FILTER_BANK, *HANDLE_CLDFB_FILTER_BANK; - typedef enum { FRAME_0 = 0, @@ -690,6 +686,7 @@ typedef enum } FRAME_SIZE; + /*---------------------------------------------------------------* * IGF * *---------------------------------------------------------------*/ @@ -741,7 +738,6 @@ typedef struct IGF_INFO_struct Word16 bitRateIndex; } IGF_INFO, *H_IGF_INFO; - typedef struct { Word16 *indexBuffer; diff --git a/lib_com/stat_noise_uv_mod_fx.c b/lib_com/stat_noise_uv_mod_fx.c index 67ca21cd29c3dd2ffae186785dfcd32794b3201f..ad87695e831dd5092ddb9456261828e46ca5ec72 100644 --- a/lib_com/stat_noise_uv_mod_fx.c +++ b/lib_com/stat_noise_uv_mod_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -29,22 +29,22 @@ Word32 L_Sqrt_Q0( const Word32 x ); *--------------------------------------------------------------------*/ void stat_noise_uv_mod_fx( - const Word16 coder_type, /* i : Coder type */ + const Word16 coder_type, /* i : Coder type */ Word16 noisiness, /* i : noisiness parameter Q0 */ const Word16 *lsp_old, /* i : old LSP vector at 4th sfr Q15 */ - const Word16 *lsp_new, /* i : LSP vector at 4th sfr Q15 */ - const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q15 */ - Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q12 */ - Word16 *exc2, /* i/o: excitation buffer Q_exc */ + const Word16 *lsp_new, /* i : LSP vector at 4th sfr Q15 */ + const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q15 */ + Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q12 */ + Word16 *exc2, /* i/o: excitation buffer Q_exc */ Word16 Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ - const Word16 bfi, /* i : Bad frame indicator */ - Word32 *ge_sm, /* i/o: smoothed excitation gain Q_ge */ - Word16 *uv_count, /* i/o: unvoiced counter */ - Word16 *act_count, /* i/o: activation counter */ - Word16 lspold_s[], /* i/o: old LSP Q15 */ - Word16 *noimix_seed, /* i/o: mixture seed Q0 */ - Word16 *st_min_alpha, /* i/o: minimum alpha Q15 */ - Word16 *exc_pe, /* i/o: scale Q_stat_noise Q_stat_noise */ + const Word16 bfi, /* i : Bad frame indicator */ + Word32 *ge_sm, /* i/o: smoothed excitation gain Q_ge */ + Word16 *uv_count, /* i/o: unvoiced counter */ + Word16 *act_count, /* i/o: activation counter */ + Word16 lspold_s[], /* i/o: old LSP Q15 */ + Word16 *noimix_seed, /* i/o: mixture seed Q0 */ + Word16 *st_min_alpha, /* i/o: minimum alpha Q15 */ + Word16 *exc_pe, /* i/o: scale Q_stat_noise Q_stat_noise */ const Word32 bitrate, /* i : core bitrate */ const Word16 bwidth_fx, /* i : input bandwidth */ Word16 *Q_stat_noise, /* i/o: noise scaling */ @@ -74,10 +74,6 @@ void stat_noise_uv_mod_fx( Word16 En_shift, Tmp; Word16 Exc2_local[L_FRAME]; /* local_copy in scaled Q_local*/ -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*---------------------------------------------------------* * Init local variables @@ -109,7 +105,7 @@ void stat_noise_uv_mod_fx( move16(); tmp_res = div_l( L_tmp_res, tmp_den ); move16(); - min_alpha = add_o( tmp_res, 16384, &Overflow ); + min_alpha = add_sat( tmp_res, 16384 ); move16(); /**st_min_alpha = sub(*st_min_alpha, 1638); move16();*/ @@ -160,9 +156,8 @@ void stat_noise_uv_mod_fx( { FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) { - exctilt = calc_tilt_fx( &Exc2_local[i_subfr], En_shift, L_SUBFR ); /*Q15 */ - exctilt = mult( shl_o( sub( TILT_COMP_LIM_FX, min_alpha ), 2, &Overflow ), exctilt ); /*Q15 */ - + exctilt = calc_tilt_fx( &Exc2_local[i_subfr], En_shift, L_SUBFR ); /*Q15 */ + exctilt = mult( shl_sat( sub( TILT_COMP_LIM_FX, min_alpha ), 2 ), exctilt ); /*Q15 */ PREEMPH_FX( &Exc2_local[i_subfr], exctilt, L_SUBFR, exc_pe ); } } @@ -186,7 +181,7 @@ void stat_noise_uv_mod_fx( tmp_shift = norm_s( tmp_den ); tmp_den = shl( tmp_den, tmp_shift ); tmp_res = div_s( tmp_nom, tmp_den ); - tmp_res = shl_o( tmp_res, tmp_shift, &Overflow ); + tmp_res = shl_sat( tmp_res, tmp_shift ); alpha = add( 32767, mult( tmp_res, sub( min_alpha, 32767 ) ) ); *act_count = 0; @@ -250,9 +245,8 @@ void stat_noise_uv_mod_fx( L_tmp_res = Mult_32_16( *ge_sm, tmp_res ); /* Q_stat_noise_ge+45-Q_local-Q_ge-tmp_shift-15 */ L_tmp_res = Mult_32_16( L_tmp_res, sub( 32767, beta ) ); /*30-Q_local-tmp_shift+15-15 */ L_tmp_res = L_add_sat( L_shl_sat( L_tmp_res, sub( add( Q_local, tmp_shift ), 15 ) ), beta ); /* Q15 */ - tmp_res = extract_h( L_shl_o( L_tmp_res, 15, &Overflow ) ); /* 15+15-16=14 */ - - Noimix_fract = extract_l( Mult_32_16( L_tmp_res, Noimix_fract ) ); /*15+15-15 */ + tmp_res = extract_h( L_shl_sat( L_tmp_res, 15 ) ); /* 15+15-16=14 */ + Noimix_fract = extract_l( Mult_32_16( L_tmp_res, Noimix_fract ) ); /*15+15-15 */ FOR( i = 0; i < L_FRAME; i++ ) { @@ -330,7 +324,6 @@ void stat_noise_uv_mod_fx( } } } - /*--------------------------------------------------------------------* * stat_noise_uv_mod() * @@ -338,26 +331,26 @@ void stat_noise_uv_mod_fx( *--------------------------------------------------------------------*/ void stat_noise_uv_mod_ivas_fx( - const Word16 coder_type, /* i : Coder type */ - Word16 noisiness, /* i : noisiness parameter Q=0 */ - const Word16 *lsp_old, /* i : old LSP vector at 4th sfr Q=15*/ - const Word16 *lsp_new, /* i : LSP vector at 4th sfr Q=15*/ - const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q=15*/ - Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q=12*/ - Word16 *exc2, /* i/o: excitation buffer Q=Q_exc*/ - Word16 Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ - const Word16 bfi, /* i : Bad frame indicator */ + const Word16 coder_type, /* i : Coder type */ + Word16 noisiness, /* i : noisiness parameter Q=0 */ + const Word16 *lsp_old, /* i : old LSP vector at 4th sfr Q=15*/ + const Word16 *lsp_new, /* i : LSP vector at 4th sfr Q=15*/ + const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q=15*/ + Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q=12*/ + Word16 *exc2, /* i/o: excitation buffer Q=Q_exc*/ + Word16 *Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ + const Word16 bfi, /* i : Bad frame indicator */ Word32 *ge_sm, /* i/o: smoothed excitation gain Q=Q_stat_noise_ge (6)*/ - Word16 *uv_count, /* i/o: unvoiced counter */ - Word16 *act_count, /* i/o: activation counter */ - Word16 lspold_s[], /* i/o: old LSP Q=15*/ - Word16 *noimix_seed, /* i/o: mixture seed Q0 */ - Word16 *st_min_alpha, /* i/o: minimum alpha Q=15*/ + Word16 *uv_count, /* i/o: unvoiced counter */ + Word16 *act_count, /* i/o: activation counter */ + Word16 lspold_s[], /* i/o: old LSP Q=15*/ + Word16 *noimix_seed, /* i/o: mixture seed Q0 */ + Word16 *st_min_alpha, /* i/o: minimum alpha Q=15*/ Word16 *exc_pe, /* i/o: scale Q_stat_noise Q=Q_stat_noise*/ - const Word32 bitrate, /* i : core bitrate */ - const Word16 bwidth_fx, /* i : i bandwidth */ - Word16 *Q_stat_noise, /* i/o: noise scaling */ - Word16 *Q_stat_noise_ge /* i/o: noise scaling */ + const Word32 bitrate, /* i : core bitrate */ + const Word16 bwidth_fx, /* i : i bandwidth */ + Word16 *Q_stat_noise, /* i/o: noise scaling */ + Word16 *Q_stat_noise_ge /* i/o: noise scaling */ ) { Word16 exctilt; /* Q15 */ @@ -370,8 +363,9 @@ void stat_noise_uv_mod_ivas_fx( Word16 oldlsp_mix[M]; Word16 midlsp_mix[M]; Word16 newlsp_mix[M]; - Word16 beta; /* Q15 */ - Word16 Noimix_fract; /* (noimix_fac - 1.0) in Q15 */ + Word16 beta; /* Q15 */ + Word16 Noimix_fract; /* (noimix_fac - 1.0) in Q15 */ + Word32 L_Noimix_fract; /* (noimix_fac - 1.0) in Q15 */ /* noimix_fax * x <-> x + Noimix_fract * x */ Word16 i_subfr; Word16 i, k; @@ -382,11 +376,8 @@ void stat_noise_uv_mod_ivas_fx( Word32 L_tmp_res, L_tmp, L_tmp3, L_Ge; Word16 En_shift, Tmp; - Word16 Exc2_local[L_FRAME]; /* local_copy in scaled Q_local*/ -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + Word16 Exc2_local[L_FRAME]; /* local_copy in scaled Q_local*/ + Word32 L_Exc2_local[L_FRAME]; /* local_copy in scaled Q_local*/ /*---------------------------------------------------------* * Init local variables @@ -415,7 +406,7 @@ void stat_noise_uv_mod_ivas_fx( L_tmp_res = L_shl( L_tmp_res, sub( tmp_shift, 1 ) ); tmp_den = shl( tmp_den, tmp_shift ); tmp_res = div_l( L_tmp_res, tmp_den ); - min_alpha = add_o( tmp_res, 16384, &Overflow ); + min_alpha = add_sat( tmp_res, 16384 ); /**st_min_alpha = sub(*st_min_alpha, 1638); move16();*/ min_alpha = s_max( min_alpha, sub( *st_min_alpha, 1638 ) ); @@ -437,9 +428,9 @@ void stat_noise_uv_mod_ivas_fx( Copy( exc2, Exc2_local, L_FRAME ); /* bound Q for internal use, optimization possible */ - Q_local = s_min( 11, s_max( -1, Q_exc ) ); + Q_local = s_min( 11, s_max( -1, *Q_exc ) ); /* local excitation Q and incoming excitation Q*/ - Qdiff = sub( Q_local, Q_exc ); + Qdiff = sub( Q_local, *Q_exc ); /* only shift if incoming Q is outside [11..-1] shift is done in energy calculations aswell */ Scale_sig( Exc2_local, L_FRAME, Qdiff ); /* current excitation Q and previous stat_noise states Q */ @@ -465,9 +456,8 @@ void stat_noise_uv_mod_ivas_fx( { FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) { - exctilt = calc_tilt_fx( &Exc2_local[i_subfr], En_shift, L_SUBFR ); /*Q15 */ - exctilt = mult( shl_o( sub( TILT_COMP_LIM_FX, min_alpha ), 2, &Overflow ), exctilt ); /*Q15 */ - + exctilt = calc_tilt_fx( &Exc2_local[i_subfr], En_shift, L_SUBFR ); /*Q15 */ + exctilt = mult( shl_sat( sub( TILT_COMP_LIM_FX, min_alpha ), 2 ), exctilt ); /*Q15 */ PREEMPH_FX( &Exc2_local[i_subfr], exctilt, L_SUBFR, exc_pe ); } } @@ -491,7 +481,7 @@ void stat_noise_uv_mod_ivas_fx( tmp_shift = norm_s( tmp_den ); tmp_den = shl( tmp_den, tmp_shift ); tmp_res = div_s( tmp_nom, tmp_den ); - tmp_res = shl_o( tmp_res, tmp_shift, &Overflow ); + tmp_res = shl_sat( tmp_res, tmp_shift ); alpha = add( 32767, mult( tmp_res, sub( min_alpha, 32767 ) ) ); *act_count = 0; @@ -539,14 +529,11 @@ void stat_noise_uv_mod_ivas_fx( L_tmp_res = L_mac( 0, alpha, alpha ); L_tmp_res = L_mac( L_tmp_res, alpha_m1, alpha_m1 ); tmp_den = round_fx( L_Frac_sqrtQ31( L_tmp_res ) ); - - tmp_nom = sub( 32767, tmp_den ); - tmp_shift = norm_s( tmp_den ); - tmp_den = shl( tmp_den, tmp_shift ); - tmp_res = div_s( tmp_nom, tmp_den ); - - Noimix_fract = shr( tmp_res, tmp_shift ); /* float value is in range 0.0 to 0.42 */ - + Word16 exp_sqr = 0; + move16(); + tmp_res = BASOP_Util_Divide1616_Scale( 32767, tmp_den, &exp_sqr ); // 15-exp_sqr + Noimix_fract = tmp_res; // 15-exp_sqr + move16(); /* L_Ge might be 0 in unvoiced WB */ L_Ge = L_max( L_Ge, 1 ); tmp_shift = norm_l( L_Ge ); @@ -555,9 +542,7 @@ void stat_noise_uv_mod_ivas_fx( L_tmp_res = Mult_32_16( *ge_sm, tmp_res ); /* Q_stat_noise_ge+45-Q_local-Q_ge-tmp_shift-15 */ L_tmp_res = Mult_32_16( L_tmp_res, sub( 32767, beta ) ); /*30-Q_local-tmp_shift+15-15 */ L_tmp_res = L_add_sat( L_shl_sat( L_tmp_res, sub( add( Q_local, tmp_shift ), 15 ) ), beta ); /* Q15 */ - tmp_res = extract_h( L_shl_o( L_tmp_res, 15, &Overflow ) ); /* 15+15-16=14 */ - - Noimix_fract = extract_l( Mult_32_16( L_tmp_res, Noimix_fract ) ); /*15+15-15 */ + L_Noimix_fract = Mult_32_16( L_tmp_res, Noimix_fract ); /*15+15-exp_sqr-15 =15-exp_sqr */ FOR( i = 0; i < L_FRAME; i++ ) { @@ -573,18 +558,27 @@ void stat_noise_uv_mod_ivas_fx( randval = mult_r( 28378, randval ); /* Q downscaled by 2 bits ends up in Q14 */ /*sqrt(12.0f) in Q13*/ randval = extract_l( L_shl( Mult_32_16( L_Ge, randval ), sub( 1, *Q_stat_noise_ge ) ) ); /*Q_local+Q_ge+14-15+1-Q_ge=Q_local */ - L_tmp = L_mult( Exc2_local[i], alpha ); /* Q_local + 16 */ - L_tmp = L_mac( L_tmp, randval, alpha_m1 ); /* Q_local + 16 */ - L_tmp3 = Mult_32_16( L_tmp, Noimix_fract ); /* Q_local+16+15-15 */ - L_tmp = L_add_sat( L_tmp3, L_shl_sat( Mult_32_16( L_tmp, tmp_res ), 1 ) ); /* Q_local+16+14-15+1 */ - Exc2_local[i] = extract_h( L_tmp ); /*Q_local */ + L_tmp = L_mult( Exc2_local[i], alpha ); /* Q_local + 16 */ + L_tmp = L_mac( L_tmp, randval, alpha_m1 ); /* Q_local + 16 */ + L_tmp3 = Mult_32_32( L_tmp, L_Noimix_fract ); /* Q_local+16+15-exp_sqr-15 =Q_local +1 */ + L_Exc2_local[i] = L_add( L_shr( L_tmp3, 1 ), Mpy_32_32( L_tmp, L_tmp_res ) ); // Q_local + 16 +15 -31 = Q_local + move32(); + } + Word32 max_val; + maximum_abs_32_fx( L_Exc2_local, L_FRAME, &max_val ); + Word16 shift = 0; + move16(); + IF( GT_32( max_val, ONE_IN_Q15 ) ) + { + shift = norm_l( max_val ); + shift = sub( Q31 - Q15, shift ); + *Q_exc = sub( Q_local, shift ); // Q_exc = Q_local -shift move16(); } *Q_stat_noise = Q_local; /* update for next call, routine can only be called once every frame */ move16(); - Qdiff = sub( Q_exc, Q_local ); /* local excitation and incoming excitation */ - Scale_sig( Exc2_local, L_FRAME, Qdiff ); - Copy( Exc2_local, exc2, L_FRAME ); + + Copy_Scale_sig_32_16( L_Exc2_local, exc2, L_FRAME, negate( shift ) ); // Q_exc /*--------------------------------------------------------------------* * Generate low-pass filtered version of ISP coefficients @@ -635,6 +629,7 @@ void stat_noise_uv_mod_ivas_fx( } } } + /*---------------------------------------------------------------------------* * calc_tilt() * diff --git a/lib_com/swb_bwe_com_fx.c b/lib_com/swb_bwe_com_fx.c index eda099cd93a4d2bf25843d1e4db24e9c4b98ba47..cc8b22db64fdf8b46a65290c72a58d61667a3615 100644 --- a/lib_com/swb_bwe_com_fx.c +++ b/lib_com/swb_bwe_com_fx.c @@ -241,14 +241,16 @@ Word16 WB_BWE_gain_pred_fx( tmp = extract_l( L_tmp ); enerL = L_deposit_l( enerL_16 ); - enerL = L_shl( enerL, 6 ); /*Q6 */ - tmp1 = i_mult_sat( 3, WB_fenv[0] ); /*Q3 */ - L_tmp = L_mult0( tmp1, WB_fenv[0] ); /*Q6 */ + enerL = L_shl( enerL, 6 ); /*Q6 */ + /* Here, we do not multiply L_tmp by 3 to avoid overflow */ + L_tmp = L_mult0( WB_fenv[0], WB_fenv[0] ); /* Q6 */ test(); test(); test(); - IF( GT_16( shr( enerL_16, 3 ), tmp ) && GT_32( enerL, L_tmp ) && NE_16( prev_coder_type, UNVOICED ) && WB_fenv[0] != 0 ) +#define ONE_DIV_3 ( (Word32) 0x2AAAAAAA ) + /* Here, L_tmp is not pre-multiplied with 3, we multiply enerL with 1/3 */ + IF( GT_16( shr( enerL_16, 3 ), tmp ) && GT_32( Mpy_32_32( ONE_DIV_3, enerL ), L_tmp ) && NE_16( prev_coder_type, UNVOICED ) && WB_fenv[0] != 0 ) { env_var_flag = 1; move16(); @@ -565,10 +567,8 @@ Word32 calc_tilt_bwe_fx( /* o : Tilt in Q24 Word16 tmp1, tmp2; const Word16 *ptr; Word16 exp2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif BASOP_SATURATE_WARNING_OFF_EVS @@ -593,7 +593,8 @@ Word32 calc_tilt_bwe_fx( /* o : Tilt in Q24 tmp1 = mult_ro( *ptr++, 8192 /*0.25 in Q15 */, &Overflow ); /* Divide by 4 */ L_ener = L_mac0_o( L_ener, tmp1, tmp1, &Overflow ); } - L_ener = L_shr_o( L_ener, exp2, &Overflow ); + /*Overflow will never happen because exp2 is always positive*/ + L_ener = L_shr( L_ener, exp2 ); L_temp = L_add_o( L_ener_tot, L_ener, &Overflow ); IF( Overflow != 0 ) { @@ -2533,12 +2534,8 @@ void hq_generic_decoding_fx( IF( L_tmp != 0 ) { exp = norm_l( L_tmp ); -#ifdef EVS_FUNC_MODIFIED frac = round_fx_sat( L_shl( L_tmp, exp ) ); /*cs+exp-16 */ -#else - frac = round_fx( L_shl( L_tmp, exp ) ); /*cs+exp-16 */ -#endif - tmp = div_s( 16384, frac ); /*15 + 14 - (cs+exp-16) */ + tmp = div_s( 16384, frac ); /*15 + 14 - (cs+exp-16) */ exp = sub( add( cs, exp ), 30 ); L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /*Q31 - exp */ fenvL_fx = round_fx_sat( L_shl_sat( L_tmp, sub( exp, 14 ) ) ); /*Q1 */ @@ -2868,11 +2865,7 @@ void hq_generic_decoding_fx( tmp4_fx = mult_r( tmp3_fx, 1638 /* 0.05 in Q15 */ ); WHILE( tmp3_fx > 1024 /* 1 in Q10*/ ) { -#ifdef EVS_FUNC_MODIFIED L_tmp1 = L_shl( Mult_32_16( *pit1_fx, tmp3_fx ), 5 ); /*15 + 5 + 10 -15 */ -#else - L_tmp1 = Mult_32_16( L_shl( *pit1_fx, 5 ), tmp3_fx ); /*15 + 5 + 10 -15 */ -#endif *pit1_fx-- = L_tmp1; move32(); tmp3_fx = sub( tmp3_fx, tmp4_fx ); @@ -3089,12 +3082,8 @@ void hq_generic_decoding_ivas_fx( IF( L_tmp != 0 ) { exp = norm_l( L_tmp ); -#ifdef EVS_FUNC_MODIFIED frac = round_fx_sat( L_shl( L_tmp, exp ) ); /*cs+exp-16 */ -#else - frac = round_fx( L_shl( L_tmp, exp ) ); /*cs+exp-16 */ -#endif - tmp = div_s( 16384, frac ); /*15 + 14 - (cs+exp-16) */ + tmp = div_s( 16384, frac ); /*15 + 14 - (cs+exp-16) */ exp = sub( add( cs, exp ), 30 ); L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /*Q31 - exp */ fenvL_fx = round_fx_sat( L_shl_sat( L_tmp, sub( exp, 14 ) ) ); /*Q1 */ @@ -3424,11 +3413,7 @@ void hq_generic_decoding_ivas_fx( tmp4_fx = mult_r( tmp3_fx, 1638 /* 0.05 in Q15 */ ); WHILE( tmp3_fx > 1024 /* 1 in Q10*/ ) { -#ifdef EVS_FUNC_MODIFIED L_tmp1 = L_shl( Mult_32_16( *pit1_fx, tmp3_fx ), 5 ); /*15 + 5 + 10 -15 */ -#else - L_tmp1 = Mult_32_16( L_shl( *pit1_fx, 5 ), tmp3_fx ); /*15 + 5 + 10 -15 */ -#endif *pit1_fx-- = L_tmp1; move32(); tmp3_fx = sub( tmp3_fx, tmp4_fx ); diff --git a/lib_com/swb_bwe_com_hr_fx.c b/lib_com/swb_bwe_com_hr_fx.c index 7755ec697b57343c855cfa39f012147fba2cc310..a1d6fe2a0fe474393cc863b5a7206d9dc7a3b4c5 100644 --- a/lib_com/swb_bwe_com_hr_fx.c +++ b/lib_com/swb_bwe_com_hr_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/swb_bwe_com_lr_fx.c b/lib_com/swb_bwe_com_lr_fx.c index d0b8d010022f45d3a388d47b8e799c5d288b7983..1326b31a98eac391da7fa04154e79c9759448955 100644 --- a/lib_com/swb_bwe_com_lr_fx.c +++ b/lib_com/swb_bwe_com_lr_fx.c @@ -927,10 +927,8 @@ void SpectrumSmoothing_fx( Word16 reset_flag; Word16 pp, pk; Word16 exp_norm; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif *Qss = 10; move16(); @@ -2225,10 +2223,8 @@ void ton_ene_est_fx( Word16 temp2_fx, Qtemp2; Word16 temp_fx; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif *QbeL = 3; move16(); @@ -2338,7 +2334,7 @@ void ton_ene_est_fx( move16(); /* 0.06=15729(Q18) */ exp_shift = sub( 18, QE_r ); - E_r_shift_fx = shl_o( E_r_fx, exp_shift, &Overflow ); + E_r_shift_fx = shl_sat( E_r_fx, exp_shift ); IF( LT_16( E_r_shift_fx, 15729 ) ) /* E_r < 0.06 */ { /* avg_pe[k] = (float) sqrt(pow(2.0f,band_energy[i])/band_width[i]); */ @@ -2366,11 +2362,7 @@ void ton_ene_est_fx( exp_normn = norm_s( peak_fx[k] ); fac_fx = div_s( shl( temp2_fx, exp_normd ), shl( peak_fx[k], exp_normn ) ); -#ifdef FIX_ISSUE_1062_AND_1068_TON_ENE_EST_FX fac_fx = shl_sat( fac_fx, sub( add( Qss, exp_normn ), add( Qtemp2, exp_normd ) ) ); /* Qtemp2+exp_normd-(Qss+exp_normn)+15 -> 15*/ -#else - fac_fx = shl( fac_fx, sub( add( Qss, exp_normn ), add( Qtemp2, exp_normd ) ) ); /* Qtemp2+exp_normd-(Qss+exp_normn)+15 -> 15*/ -#endif } ni_gain_fx[k] = mult_r( avg_pe_fx[k], fac_fx ); /* Qavg_pe[k] */ @@ -3213,10 +3205,6 @@ void noiseinj_hf_fx( Word16 exp_normn, exp_normd; Word16 div_fx; Word16 Qdiv; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif set16_fx( map_pulse_t_fx, 0, band_end_fx[BANDS_fx - 1] + 1 ); set16_fx( map_pulse_fx, 0, band_end_fx[BANDS_fx - 1] + 1 ); @@ -3250,7 +3238,7 @@ void noiseinj_hf_fx( move32(); /**p_L_En = (float)sqrt(*p_En);*/ sqrt_32n_16_fx( *p_L_En, QbeL, p_sqrt_En_fx, &Qtemp ); - *p_sqrt_En_fx = shl_o( *p_sqrt_En_fx, sub( QsEn, Qtemp ), &Overflow ); /* -> Q2 */ + *p_sqrt_En_fx = shl_sat( *p_sqrt_En_fx, sub( QsEn, Qtemp ) ); /* -> Q2 */ move16(); } p_L_En++; @@ -3320,7 +3308,7 @@ FOR( k = BANDS_fx - NB_SWB_SUBBANDS; k < BANDS_fx; k++ ) /* SQRT Part */ sqrt_32n_16_fx( L_deposit_h( div_fx ), add( Qdiv, 16 ), &ni_scale_fx, &Qtemp ); - ni_scale_fx = shl_o( ni_scale_fx, sub( 14, Qtemp ), &Overflow ); + ni_scale_fx = shl_sat( ni_scale_fx, sub( 14, Qtemp ) ); ni_scale_fx = s_min( 20408, ni_scale_fx ); /* 1.25=20408.0(Q14) */ ni_scale_fx = s_max( 12288, ni_scale_fx ); /* 0.75=12288.0(Q14) */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 04b6ba1879a786c55f30955a10ea9a45a204d44d..e63dc471ebd194f07d9a62648460c6ad02d96846 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -1,8 +1,7 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ - #include #include "options.h" #include "cnst.h" /* Common constants */ @@ -10,13 +9,18 @@ #include "prot_fx.h" #include "basop_util.h" #include "ivas_prot_fx.h" -#include "options_warnings.h" -#define POW_EXC16k_WHTND 1.14e11f /* power of random excitation, length 320 samples, uniform distribution */ -#define POW_EXC16k_WHTND_FX_INV_SQRT 6360 // Q31 -#define POW_EXC16k_WHTND_FX 178125000 // Q-6 -#define THR_ENV_ERROR_PLOSIVE 200.0f /* threshold for envelope error used in plosive detection */ -#define THR_ENV_ERROR_PLOSIVE_FX 200 /* threshold for envelope error used in plosive detection Q0 */ + +/*-----------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------*/ + +#define POW_EXC16k_WHTND 1.14e11f /* power of random excitation, length 320 samples, uniform distribution */ +#define POW_EXC16k_WHTND_FX_INV_SQRT 6360 // Q31 +#define POW_EXC16k_WHTND_FX_INV_SQRT_IN_Q49 1667313793 // Q49 +#define POW_EXC16k_WHTND_FX 178125000 // Q-6 +#define THR_ENV_ERROR_PLOSIVE 200.0f /* threshold for envelope error used in plosive detection */ +#define THR_ENV_ERROR_PLOSIVE_FX 200 /* threshold for envelope error used in plosive detection Q0 */ /*-----------------------------------------------------------------* * Local function prototypes @@ -995,9 +999,6 @@ static void filt_mu_fx( Word16 mu, ga, temp; const Word16 *ptrs; Word16 tmp, exp; - Flag Overflow = 0; - move32(); - IF( EQ_16( SubFrameLength, L_SUBFR ) ) { @@ -1036,12 +1037,8 @@ static void filt_mu_fx( FOR( n = 0; n < SubFrameLength; n++ ) { temp = mult_r( mu, ( *ptrs++ ) ); -#ifdef FIX_ISSUE_1155 temp = add_sat( temp, *ptrs ); /*Q12 */ -#else - temp = add( temp, *ptrs ); /*Q12 */ -#endif - sig_out[n] = shl_o( mult_r( ga, temp ), 1, &Overflow ); + sig_out[n] = shl_sat( mult_r( ga, temp ), 1 ); move16(); /*Q12 */ } @@ -1448,10 +1445,6 @@ void GenShapedWBExcitation_ivas_fx( Word32 LepsP[LPC_WHTN_ORDER_WB + 1]; Word16 tmp_vfac; Word16 avg_voice_fac; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif /*0.25f*sum_f(voice_factors, NB_SUBFR)*/ L_tmp = L_mult( voice_factors[0], 8192 /* 0.25 in Q15 */ ); @@ -1540,23 +1533,23 @@ void GenShapedWBExcitation_ivas_fx( n1 = norm_s( max_val ); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - excTmp2_frac[i] = shl_o( excTmp2[i], n1, &Overflow ); // Q_bwe_exc + n1 - move16(); /* Q14 */ + excTmp2_frac[i] = shl( excTmp2[i], n1 ); // Q_bwe_exc + n1 // saturation not possible + move16(); /* Q14 */ } n1 = sub( sub( 14, n1 ), Q_bwe_exc ); pow1 = 1; move32(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - L_tmp = L_mult_o( excTmp2_frac[i], excTmp2_frac[i], &Overflow ); /* Q29 */ - pow1 = L_add_o( pow1, L_shr( L_tmp, 10 ), &Overflow ); /* Q22 */ + L_tmp = L_mult( excTmp2_frac[i], excTmp2_frac[i] ); /* Q29 */ // saturation not possible: excTmp2_frac[i] < MIN_16 + pow1 = L_add_sat( pow1, L_shr( L_tmp, 10 ) ); /* Q22 */ } } FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - excNoisyEnv[i] = L_add_o( *mem_csfilt, L_mult_o( csfilt_num2[0], excTmp2[i], &Overflow ), &Overflow ); - move32(); /* Q_bwe_exc+16 */ + excNoisyEnv[i] = L_add_sat( *mem_csfilt, L_mult( csfilt_num2[0], excTmp2[i] ) ); // L_mult: sat not poosible, excTmp2 > 0 + move32(); /* Q_bwe_exc+16 */ *mem_csfilt = Mult_32_16( excNoisyEnv[i], neg_csfilt_den2[1] ); move32(); /* Q_bwe_exc+16 */ } @@ -1585,7 +1578,7 @@ void GenShapedWBExcitation_ivas_fx( n2 = norm_l( Lmax ); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - exc4k_frac[i] = extract_h( L_shl_o( exc4k_32[i], n2, &Overflow ) ); /* Q(14-n2) */ + exc4k_frac[i] = extract_h( L_shl( exc4k_32[i], n2 ) ); /* Q(14-n2) */ move16(); } n2 = 30 - n2 - ( Q_bwe_exc + 6 ); @@ -1593,8 +1586,8 @@ void GenShapedWBExcitation_ivas_fx( move32(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - L_tmp = L_mult_o( exc4k_frac[i], exc4k_frac[i], &Overflow ); /* Q29 */ - pow22 = L_add_o( pow22, L_shr( L_tmp, 10 ), &Overflow ); /* Q22 */ + L_tmp = L_mult_sat( exc4k_frac[i], exc4k_frac[i] ); /* Q29 */ + pow22 = L_add( pow22, L_shr( L_tmp, 10 ) ); /* Q22 */ } } @@ -1603,11 +1596,11 @@ void GenShapedWBExcitation_ivas_fx( IF( EQ_16( coder_type, UNVOICED ) || ( igf_flag != 0 && LT_16( avg_voice_fac, 6654 /* 0.2 in Q15 */ ) ) ) { L_tmp = root_a_over_b_fx( pow1, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp ); - scale = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */ + scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ sc = sub( add( n2, Q_bwe_exc ), 14 ); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - exc4kWhtnd[i] = round_fx_o( L_shl_o( L_mult_o( exc4k_frac[i], scale, &Overflow ), sc, &Overflow ), &Overflow ); /* Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */ + exc4kWhtnd[i] = round_fx_sat( L_shl_sat( L_mult_sat( exc4k_frac[i], scale ), sc ) ); /* Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */ move16(); } } @@ -1623,7 +1616,7 @@ void GenShapedWBExcitation_ivas_fx( { /*tmp_vfac = 2*voice_factors[i]; tmp_vfac = min(1, tmp_vfac);*/ - tmp_vfac = shl_o( voice_factors[i], 1, &Overflow ); + tmp_vfac = shl_sat( voice_factors[i], 1 ); } ELSE { @@ -1632,15 +1625,15 @@ void GenShapedWBExcitation_ivas_fx( } Ltemp1 = root_a_fx( L_deposit_h( tmp_vfac ), 31, &exp ); - temp1 = round_fx_o( L_shl_o( Ltemp1, exp, &Overflow ), &Overflow ); /* Q15 */ - L_tmp = Mult_32_16( pow1, sub( 32767, tmp_vfac ) ); /* Q22*/ + temp1 = round_fx_sat( L_shl_sat( Ltemp1, exp ) ); /* Q15 */ + L_tmp = Mult_32_16( pow1, sub( 32767, tmp_vfac ) ); /* Q22*/ Ltemp2 = root_a_over_b_fx( L_tmp, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp ); - temp2 = round_fx_o( L_shl_o( Ltemp2, exp, &Overflow ), &Overflow ); /* Q15 */ + temp2 = round_fx_sat( L_shl_sat( Ltemp2, exp ) ); /* Q15 */ FOR( j = 0; j < L_FRAME16k / 16; j++ ) { - L_tmp = L_mult_o( temp1, exc4kWhtnd[k], &Overflow ); /* Q(16+Q_bwe_exc) */ - L_tmp = L_add_o( L_tmp, L_shl_o( L_mult_o( temp2, exc4k_frac[k], &Overflow ), sc, &Overflow ), &Overflow ); /* Q(16+Q_bwe_exc) */ - exc4kWhtnd[k] = round_fx_o( L_tmp, &Overflow ); /* Q_bwe_exc */ + L_tmp = L_mult_sat( temp1, exc4kWhtnd[k] ); /* Q(16+Q_bwe_exc) */ + L_tmp = L_add_sat( L_tmp, L_shl_sat( L_mult_sat( temp2, exc4k_frac[k] ), sc ) ); /* Q(16+Q_bwe_exc) */ + exc4kWhtnd[k] = round_fx_sat( L_tmp ); /* Q_bwe_exc */ move16(); k++; } @@ -1648,7 +1641,12 @@ void GenShapedWBExcitation_ivas_fx( } } - Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 ); + Scale_sig( state_lpc_syn, LPC_SHB_ORDER, -Q2 ); /* Q(Q_bwe_exc) -> Q(Q_bwe_exc - 2) */ + + Syn_filt_s( Q2, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 ); + + Scale_sig( state_lpc_syn, LPC_SHB_ORDER, Q2 ); /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */ + Scale_sig( excSHB, L_FRAME16k / 4, Q2 ); /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */ return; } @@ -1693,10 +1691,6 @@ void GenShapedWBExcitation_fx( Word32 LepsP[LPC_WHTN_ORDER_WB + 1]; Word16 tmp_vfac; Word16 avg_voice_fac; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif move16(); move16(); move16(); @@ -1787,7 +1781,7 @@ void GenShapedWBExcitation_fx( n1 = norm_s( max_val ); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - excTmp2_frac[i] = shl_o( excTmp2[i], n1, &Overflow ); + excTmp2_frac[i] = shl( excTmp2[i], n1 ); move16(); /* Q14 */ } n1 = sub( sub( 14, n1 ), Q_bwe_exc ); @@ -1795,14 +1789,14 @@ void GenShapedWBExcitation_fx( move32(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - L_tmp = L_mult_o( excTmp2_frac[i], excTmp2_frac[i], &Overflow ); /* Q29 */ - pow1 = L_add_o( pow1, L_shr( L_tmp, 7 ), &Overflow ); /* Q22 */ + L_tmp = L_mult_sat( excTmp2_frac[i], excTmp2_frac[i] ); /* Q29 */ + pow1 = L_add_sat( pow1, L_shr( L_tmp, 7 ) ); /* Q22 */ } } FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - excNoisyEnv[i] = L_add_o( *mem_csfilt, L_mult_o( csfilt_num2[0], excTmp2[i], &Overflow ), &Overflow ); + excNoisyEnv[i] = L_add_sat( *mem_csfilt, L_mult( csfilt_num2[0], excTmp2[i] ) ); move32(); /* Q_bwe_exc+16 */ *mem_csfilt = Mpy_32_16_1( excNoisyEnv[i], neg_csfilt_den2[1] ); move32(); /* Q_bwe_exc+16 */ @@ -1833,7 +1827,7 @@ void GenShapedWBExcitation_fx( n2 = norm_l( Lmax ); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - exc4k_frac[i] = extract_h( L_shl_o( exc4k_32[i], n2, &Overflow ) ); /* Q(14-n2) */ + exc4k_frac[i] = extract_h( L_shl( exc4k_32[i], n2 ) ); /* Q(14-n2) */ move16(); } n2 = sub( sub( 30, n2 ), add( Q_bwe_exc, 6 ) ); @@ -1841,8 +1835,8 @@ void GenShapedWBExcitation_fx( move32(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - L_tmp = L_mult_o( exc4k_frac[i], exc4k_frac[i], &Overflow ); /* Q29 */ - pow22 = L_add_o( pow22, L_shr( L_tmp, 7 ), &Overflow ); /* Q22 */ + L_tmp = L_mult_sat( exc4k_frac[i], exc4k_frac[i] ); /* Q29 */ + pow22 = L_add( pow22, L_shr( L_tmp, 7 ) ); /* Q22 */ } } @@ -1851,11 +1845,11 @@ void GenShapedWBExcitation_fx( IF( EQ_16( coder_type, UNVOICED ) || ( igf_flag != 0 && LT_16( avg_voice_fac, 6654 /*0.2 in Q15 */ ) ) ) { L_tmp = root_a_over_b_fx( pow1, sub( 22, shl( n1, 1 ) ), pow22, sub( 22, shl( n2, 1 ) ), &exp ); - scale = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */ + scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ sc = sub( add( n2, Q_bwe_exc ), 14 ); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - exc4kWhtnd[i] = round_fx_o( L_shl_o( L_mult_o( exc4k_frac[i], scale, &Overflow ), sc, &Overflow ), &Overflow ); /* Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */ + exc4kWhtnd[i] = round_fx_sat( L_shl_sat( L_mult_sat( exc4k_frac[i], scale ), sc ) ); /* Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */ move16(); } } @@ -1871,8 +1865,8 @@ void GenShapedWBExcitation_fx( IF( igf_flag != 0 && EQ_16( coder_type, VOICED ) ) { /*tmp_vfac = 2*voice_factors[i]; - tmp_vfac = min(1, tmp_vfac);*/ - tmp_vfac = shl_o( voice_factors[i], 1, &Overflow ); + tmp_vfac = min(1, tmp_vfac);*/ + tmp_vfac = shl_sat( voice_factors[i], 1 ); } ELSE { @@ -1881,15 +1875,15 @@ void GenShapedWBExcitation_fx( } Ltemp1 = root_a_fx( L_deposit_h( tmp_vfac ), 31, &exp ); - temp1 = round_fx_o( L_shl_o( Ltemp1, exp, &Overflow ), &Overflow ); /* Q15 */ - L_tmp = Mpy_32_16_1( pow1, sub( 32767, tmp_vfac ) ); /* Q22*/ + temp1 = round_fx_sat( L_shl_sat( Ltemp1, exp ) ); /* Q15 */ + L_tmp = Mpy_32_16_1( pow1, sub( 32767, tmp_vfac ) ); /* Q22*/ Ltemp2 = root_a_over_b_fx( L_tmp, sub( 22, shl( n1, 1 ) ), pow22, sub( 22, shl( n2, 1 ) ), &exp ); - temp2 = round_fx_o( L_shl_o( Ltemp2, exp, &Overflow ), &Overflow ); /* Q15 */ + temp2 = round_fx_sat( L_shl_sat( Ltemp2, exp ) ); /* Q15 */ FOR( j = 0; j < L_FRAME16k / 16; j++ ) { - L_tmp = L_mult_o( temp1, exc4kWhtnd[k], &Overflow ); /* Q(16+Q_bwe_exc) */ - L_tmp = L_add_o( L_tmp, L_shl_o( L_mult_o( temp2, exc4k_frac[k], &Overflow ), sc, &Overflow ), &Overflow ); /* Q(16+Q_bwe_exc) */ - exc4kWhtnd[k] = round_fx_o( L_tmp, &Overflow ); /* Q_bwe_exc */ + L_tmp = L_mult_sat( temp1, exc4kWhtnd[k] ); /* Q(16+Q_bwe_exc) */ + L_tmp = L_add_sat( L_tmp, L_shl_sat( L_mult_sat( temp2, exc4k_frac[k] ), sc ) ); /* Q(16+Q_bwe_exc) */ + exc4kWhtnd[k] = round_fx_sat( L_tmp ); /* Q_bwe_exc */ move16(); k = add( k, 1 ); } @@ -1899,10 +1893,10 @@ void GenShapedWBExcitation_fx( Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 ); - return; } + /*-------------------------------------------------------------------* * GenWBSynth() * @@ -2100,22 +2094,7 @@ void GenShapedSHBExcitation_fx( Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */ Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ const Word32 bitrate, - const Word16 prev_bfi -#ifdef ADD_IVAS_TBE_CODE - , /* i : previous frame was concealed */ - const Word16 element_mode, /* i : element mode */ - const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ - Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */ - Word16 *mixExc16k, /* i/o: exc spreading for IC-BWE */ - const Word32 extl_brate, /* i : extension layer bitarte */ - const Word16 MSFlag, /* i : Multi Source flag */ - Word16 EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */ - Word16 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */ - Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */ - Word16 *Env_error, /* o : error in SHB residual envelope modelling*/ - Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling */ -#endif -) + const Word16 prev_bfi ) { Word16 i, j, k; Word16 wht_fil_mem[LPC_WHTN_ORDER]; @@ -2158,20 +2137,6 @@ void GenShapedSHBExcitation_fx( Word16 Q_temp; Word16 prev_Q_bwe_exc_fb; -#ifdef ADD_IVAS_TBE_CODE - Word32 tempD; - Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k]; - Word16 cbsize; - Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale; - Word16 c0, c1, c2, c3, c4, c5, g1, g2, g, den; - Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k]; - Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 }; - Word16 flag_plosive; - Word16 delta; - Word16 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS]; - - mix_factor = 0.0f; -#endif set16_fx( zero_mem, 0, LPC_SHB_ORDER ); set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER ); @@ -2203,12 +2168,7 @@ void GenShapedSHBExcitation_fx( /* i: exc16k in Q_bwe_exc */ /* o: exc16kWhtnd in Q_bwe_exc */ - -#ifdef ADD_IVAS_TBE_CODE - IF( GE_32( extl_brate, SWB_TBE_2k8 ) ) -#else IF( GE_32( bitrate, ACELP_24k40 ) ) -#endif { temp2 = 0; move16(); @@ -2242,11 +2202,7 @@ void GenShapedSHBExcitation_fx( Q_pow1 = shl( *Q_bwe_exc, 1 ); test(); -#ifdef ADD_IVAS_TBE_CODE - IF( EQ_16( flag_ACELP16k, 0 ) ) -#else IF( ( LE_32( bitrate, ACELP_13k20 ) ) && ( GE_32( bitrate, ACELP_7k20 ) ) ) -#endif { /* varEnvShape = mean_fx(voice_factors, 4); */ /* unroll the loop */ @@ -2292,11 +2248,7 @@ void GenShapedSHBExcitation_fx( test(); test(); test(); -#ifdef ADD_IVAS_TBE_CODE - IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) -#else IF( *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) -#endif { /* pre-init smoothing filter to avoid energy drop outs */ L_tmp = L_mult( excTmp2[0], 1638 ); @@ -2323,42 +2275,6 @@ void GenShapedSHBExcitation_fx( *mem_csfilt = Mult_32_16( L_tmp, varEnvShape ); move32(); } -#ifdef ADD_IVAS_TBE_CODE - if ( MSFlag > 0 ) - { - varEnvShape = 0.995f; - csfilt_num2[0] = 1.0f - varEnvShape; - csfilt_den2[1] = -varEnvShape; - } - - White_exc16k = exc16k; - - /* Track the low band envelope */ - if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) - { - if ( extl_brate != SWB_TBE_1k10 && extl_brate != SWB_TBE_1k75 ) - { - mem_csfilt_left = 0.0f; - mem_csfilt_right = 0.0f; - for ( k = 0; k < L_FRAME16k; k++ ) - { - excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k]; - mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k]; - excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1]; - mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1]; - } - - alpha = 0.0f; - step = 1.0f / L_FRAME16k; - for ( k = 0; k < L_FRAME16k; k++ ) - { - excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + ( 1 - alpha ) * excNoisyEnvRight[k]; - alpha += step; - } - } - } - else -#endif { /* Track the low band envelope */ L_tmp = *mem_csfilt; @@ -2374,21 +2290,6 @@ void GenShapedSHBExcitation_fx( *mem_csfilt = L_tmp; move32(); } -#ifdef ADD_IVAS_TBE_CODE - if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) - { - /* generate gaussian (white) excitation */ - for ( k = 0; k < L_FRAME16k; k++ ) - { - White_exc16k[k] = (float) own_random( &bwe_seed[0] ); - } - - /* normalize the amplitude of the gaussian excitation to that of the LB exc. */ - pow22 = POW_EXC16k_WHTND; - v_multc( White_exc16k, (float) sqrt( pow1 / pow22 ), White_exc16k, L_FRAME16k ); - } - else -#endif { /* create a random excitation - Reuse exc16k memory */ White_exc16k = exc16k; @@ -2437,98 +2338,10 @@ void GenShapedSHBExcitation_fx( Q_pow22 = shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ); } -#ifdef ADD_IVAS_TBE_CODE - flag_plosive = 0; - move16(); - test(); - test(); - test(); - IF(GE_32(extl_brate, SWB_TBE_2k8) || EQ_32(extl_brate, SWB_TBE_1k10) || EQ_32(extl_brate, SWB_TBE_1k75))) -#else IF( GE_32( bitrate, ACELP_24k40 ) ) -#endif { IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */ { -#ifdef ADD_IVAS_TBE_CODE - if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) - { - /* calculate TD envelopes of exc16kWhtnd and White_exc16k */ - find_td_envelope( White_exc16k, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); - find_td_envelope( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd ); - - for ( k = 0; k < L_FRAME4k; k++ ) - { - EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; - EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; - } - - /* calculate the optimal mix factor */ - c0 = c1 = c2 = c3 = c4 = c5 = 0.0f; - for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) - { - c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - - c0 += c0_part[i]; - c1 += c1_part[i]; - c2 += c2_part[i]; - c3 += c3_part[i]; - c4 += c4_part[i]; - c5 += c5_part[i]; - } - - den = 4.0f * c0 * c2 - c4 * c4; - g1 = ( c3 * c4 - 2 * c1 * c2 ) / den; - g2 = ( c1 * c4 - 2 * c0 * c3 ) / den; - - *Env_error = 0.0f; - flag_plosive = 0; - for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) - { - Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i]; - *Env_error += Env_error_part[i]; - - if ( Env_error_part[i] > THR_ENV_ERROR_PLOSIVE ) - { - /* envelope error is too high -> likely a plosive */ - flag_plosive = 1; - } - } - - if ( flag_plosive ) - { - /* plosive detected -> set the mixing factor to 0 */ - *vf_ind = 0; - mix_factor = 0.0f; - } - else - { - /* normalize gain */ - g = g2 / ( g1 + g2 ); - - /* quantization of the mixing factor */ - cbsize = 1 << NUM_BITS_SHB_VF; - delta = 1.0f / ( cbsize - 1 ); - if ( g > 1.0f ) - { - g = 1.0f; - } - else if ( g < delta ) - { - /* prevent low gains to be quantized to 0 as this is reserved for plosives */ - g = delta; - } - - *vf_ind = usquant( g, &mix_factor, 0.0f, 1.0f / ( cbsize - 1 ), cbsize ); - } - } - else -#endif { Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); @@ -2544,331 +2357,257 @@ void GenShapedSHBExcitation_fx( } } ELSE /* decoder side */ - { -#ifdef ADD_IVAS_TBE_CODE - if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) - { - if ( *vf_ind == 0 ) - { - mix_factor = 0.0f; - flag_plosive = 1; - } - else - { - mix_factor = usdequant( *vf_ind, 0.0f, 1.0f / ( ( 1 << NUM_BITS_SHB_VF ) - 1 ) ); - } - } - else -#endif { - /* *vf_ind is an integer scale by 0.125f*/ - tmp = shl( *vf_ind, ( 15 - 3 ) ); - tmp2 = MAX_16; - move16(); - if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) - { - tmp2 = 26214 /*0.8f Q15*/; - move16(); - } - } - } -#ifdef ADD_IVAS_TBE_CODE - IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) -#endif + { /* *vf_ind is an integer scale by 0.125f*/ + tmp = shl( *vf_ind, ( 15 - 3 ) ); + tmp2 = MAX_16; + move16(); + if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) { - voice_factors[0] = mult_r( voice_factors[0], tmp2 ); - move16(); - voice_factors[1] = mult_r( voice_factors[1], tmp2 ); - move16(); - voice_factors[2] = mult_r( voice_factors[2], tmp2 ); - move16(); - voice_factors[3] = mult_r( voice_factors[3], tmp2 ); - move16(); - voice_factors[4] = mult_r( voice_factors[4], tmp2 ); + tmp2 = 26214 /*0.8f Q15*/; move16(); } } -#ifdef ADD_IVAS_TBE_CODE - if ( element_mode >= IVAS_CPE_DFT && nlExc16k != NULL ) - { - /* save buffers for IC-BWE */ - mvr2r( exc16kWhtnd, nlExc16k, L_FRAME16k ); - v_multc( White_exc16k, (float) sqrt( pow1 / pow22 ), mixExc16k, L_FRAME16k ); - } -#endif - - tmp = sub( Q_temp, 3 ); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */ - } - prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; +} +{ + voice_factors[0] = mult_r( voice_factors[0], tmp2 ); move16(); - *Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 ); + voice_factors[1] = mult_r( voice_factors[1], tmp2 ); move16(); - deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); - /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */ - /* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */ -#ifdef ADD_IVAS_TBE_CODE - if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) + voice_factors[2] = mult_r( voice_factors[2], tmp2 ); + move16(); + voice_factors[3] = mult_r( voice_factors[3], tmp2 ); + move16(); + voice_factors[4] = mult_r( voice_factors[4], tmp2 ); + move16(); +} +} + +tmp = sub( Q_temp, 3 ); +FOR( k = 0; k < L_FRAME16k; k++ ) +{ + White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */ +} +prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; +move16(); +*Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 ); +move16(); +deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); +/* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */ +/* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */ +{ + IF( EQ_16( coder_type, UNVOICED ) ) { - if ( !flag_plosive ) /* use only LB excitation in case of plosives */ + L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); + scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ + FOR( k = 0; k < L_FRAME16k; k++ ) { - /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */ - old_scale = (float) sqrt( *prev_pow_exc16kWhtnd / pow1 ); - new_scale = 1.0f; - step_scale = ( new_scale - old_scale ) / ( L_FRAME16k / 2 ); - scale = old_scale; - - /* interpolate between the old and the new value of the mixing factor */ - old_fact = *prev_mix_factor; - new_fact = mix_factor; - step = ( new_fact - old_fact ) / ( L_FRAME16k / 2 ); - fact = old_fact; - - /* mixing of LB and gaussian excitation in the first half of the frame */ - for ( k = 0; k < L_FRAME16k / 2; k++ ) - { - exc16kWhtnd[k] = (float) fact * ( White_exc16k[k] * scale ) + (float) ( 1 - fact ) * exc16kWhtnd[k]; - fact += step; - scale += step_scale; - } - - /* mixing of LB and gaussian excitation in the second half of the frame */ - for ( ; k < L_FRAME16k; k++ ) - { - exc16kWhtnd[k] = (float) new_fact * White_exc16k[k] + (float) ( 1 - new_fact ) * exc16kWhtnd[k]; - } + /* White_exc16k: (Q_bwe_exc-NOISE_QADJ), scale: Q15 */ + L_tmp = L_mult( White_exc16k[k], scale ); + /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */ + exc16kWhtnd[k] = round_fx( L_shl( L_tmp, NOISE_QADJ ) ); + move16(); + /* exc16kWhtnd: Q_bwe_exc */ } - preemph( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); + PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); + /* i/o: exc16kWhtnd (Q_bwe_exc) */ + /* i/o: tbe_premph (Q_bwe_exc) */ } - else -#endif + ELSE { -#ifdef ADD_IVAS_TBE_CODE - if ( coder_type == UNVOICED || MSFlag == 1 ) -#else - IF( EQ_16( coder_type, UNVOICED ) ) -#endif + Word16 nbSubFr, lSubFr; + Word16 tempQ15; + Word32 tempQ31; + /*nbSubFr = ( bitrate < ACELP_24k40 )? NB_SUBFR : NB_SUBFR16k;*/ + nbSubFr = NB_SUBFR16k; + lSubFr = ( L_FRAME16k / NB_SUBFR16k ); + IF( LT_32( bitrate, ACELP_24k40 ) ) { - L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); - scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ - FOR( k = 0; k < L_FRAME16k; k++ ) - { - /* White_exc16k: (Q_bwe_exc-NOISE_QADJ), scale: Q15 */ - L_tmp = L_mult( White_exc16k[k], scale ); - /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */ - exc16kWhtnd[k] = round_fx( L_shl( L_tmp, NOISE_QADJ ) ); - move16(); - /* exc16kWhtnd: Q_bwe_exc */ - } - PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); - /* i/o: exc16kWhtnd (Q_bwe_exc) */ - /* i/o: tbe_premph (Q_bwe_exc) */ + nbSubFr = NB_SUBFR; + move16(); + lSubFr = ( L_FRAME16k / NB_SUBFR ); + move16(); } - ELSE + k = 0; + FOR( i = 0; i < nbSubFr; i++ ) { - Word16 nbSubFr, lSubFr; - Word16 tempQ15; - Word32 tempQ31; - /*nbSubFr = ( bitrate < ACELP_24k40 )? NB_SUBFR : NB_SUBFR16k;*/ - nbSubFr = NB_SUBFR16k; - lSubFr = ( L_FRAME16k / NB_SUBFR16k ); - IF( LT_32( bitrate, ACELP_24k40 ) ) + test(); + IF( EQ_16( coder_type, VOICED ) && ( LT_32( bitrate, ACELP_24k40 ) ) ) { - nbSubFr = NB_SUBFR; + exp = 0; move16(); - lSubFr = ( L_FRAME16k / NB_SUBFR ); + tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */ + temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + exp = 0; move16(); + tempQ15 = Sqrt16( temp, &exp ); /* Q15 */ + temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + + /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */ + temp = sub( MAX_16, temp ); + tempQ31 = Mult_32_16( pow1, temp ); + L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); + temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ } - k = 0; - FOR( i = 0; i < nbSubFr; i++ ) + ELSE { - test(); - IF( EQ_16( coder_type, VOICED ) && ( LT_32( bitrate, ACELP_24k40 ) ) ) - { - exp = 0; - move16(); - tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */ - temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - exp = 0; - move16(); - tempQ15 = Sqrt16( temp, &exp ); /* Q15 */ - temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - - /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */ - temp = sub( MAX_16, temp ); - tempQ31 = Mult_32_16( pow1, temp ); - L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); - temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ - } - ELSE - { - /* Adjust noise mixing for formant sharpening filter */ - tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac ); - /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */ - vf_tmp = sub( MAX_16, tempQ15 ); - vf_tmp = mult_r( voice_factors[i], vf_tmp ); - - exp = 0; - move16(); - tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */ - temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - - /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */ - temp = sub( MAX_16, vf_tmp ); - tempQ31 = Mult_32_16( pow1, temp ); - L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); - temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ - } + /* Adjust noise mixing for formant sharpening filter */ + tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac ); + /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */ + vf_tmp = sub( MAX_16, tempQ15 ); + vf_tmp = mult_r( voice_factors[i], vf_tmp ); - FOR( j = 0; j < lSubFr; j++ ) - { - /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */ - L_tmp = L_mult( temp2, White_exc16k[k + j] ); /* 16+(Q_bwe_exc-NOISE_QADJ)*/ - L_tmp = L_shl_sat( L_tmp, NOISE_QADJ ); /* 16+(Q_bwe_exc) */ - exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); - move16(); - /* Q_bwe_exc */ - } - k = add( k, lSubFr ); - - /* estimate the pre-emph factor */ - tempQ15 = sub( MAX_16, voice_factors[i] ); exp = 0; move16(); - temp = Sqrt16( tempQ15, &exp ); - temp = shl( temp, exp - 1 ); - - temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */ - temp = div_s( temp, temp2 ); /* Q15 */ - temp = mult_r( PREEMPH_FAC, temp ); + tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */ + temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + + /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */ + temp = sub( MAX_16, vf_tmp ); + tempQ31 = Mult_32_16( pow1, temp ); + L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); + temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ + } - PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); - /* exc16kWhtnd: Q_bwe_exc; - tbe_premph: Q_bwe_exc*/ + FOR( j = 0; j < lSubFr; j++ ) + { + /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */ + L_tmp = L_mult( temp2, White_exc16k[k + j] ); /* 16+(Q_bwe_exc-NOISE_QADJ)*/ + L_tmp = L_shl_sat( L_tmp, NOISE_QADJ ); /* 16+(Q_bwe_exc) */ + exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); + move16(); + /* Q_bwe_exc */ } + k = add( k, lSubFr ); + + /* estimate the pre-emph factor */ + tempQ15 = sub( MAX_16, voice_factors[i] ); + exp = 0; + move16(); + temp = Sqrt16( tempQ15, &exp ); + temp = shl( temp, exp - 1 ); + + temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */ + temp = div_s( temp, temp2 ); /* Q15 */ + temp = mult_r( PREEMPH_FAC, temp ); + + PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); + /* exc16kWhtnd: Q_bwe_exc; + tbe_premph: Q_bwe_exc*/ } } +} -#ifdef ADD_IVAS_TBE_CODE - IF( LT_32( extl_brate, SWB_TBE_2k8 ) ) -#else - IF( LT_32( bitrate, ACELP_24k40 ) ) -#endif - { - Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 ); - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: excSHB in Q_bwe_exc */ - } - ELSE - { - set16_fx( zero_mem, 0, LPC_SHB_ORDER ); +IF( LT_32( bitrate, ACELP_24k40 ) ) +{ + Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 ); + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: excSHB in Q_bwe_exc */ +} +ELSE +{ + set16_fx( zero_mem, 0, LPC_SHB_ORDER ); - Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 ); - syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); + Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); - Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 ); - syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); + Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); - Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 ); - syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); + Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); - Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 ); - syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); + Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: tempSHB in Q_bwe_exc */ - /* o: syn_shb_ener_sf in (2*Q_bwe_exc+1) */ - IF( LE_32( bitrate, ACELP_32k ) ) - { - L_tmp = sum32_fx( syn_shb_ener_sf, 4 ); + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: tempSHB in Q_bwe_exc */ + /* o: syn_shb_ener_sf in (2*Q_bwe_exc+1) */ + IF( LE_32( bitrate, ACELP_32k ) ) + { + L_tmp = sum32_fx( syn_shb_ener_sf, 4 ); - /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */ - tmp = shl( Q_shb, 1 ); - tmp2 = add( shl( *Q_bwe_exc, 1 ), 1 ); - L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */ + /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */ + tmp = shl( Q_shb, 1 ); + tmp2 = add( shl( *Q_bwe_exc, 1 ), 1 ); + L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */ - *Q_bwe_exc = sub( *Q_bwe_exc, exp ); - move16(); /* compensate for the exp shift */ - tmp2 = add( prev_Q_bwe_syn, n_mem2 ); - IF( GT_16( *Q_bwe_exc, tmp2 ) ) - { - L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) ); - *Q_bwe_exc = tmp2; - move16(); - } - FOR( i = 0; i < L_FRAME16k; i++ ) - { - L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */ - exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */ - move16(); - } - } - /* i: L_tmp2 in (Q31-exp) */ - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */ - - /* Rescale the past memories: LP synth and SHB look ahead buffers */ - tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn ); - FOR( i = 0; i < LPC_SHB_ORDER; i++ ) + *Q_bwe_exc = sub( *Q_bwe_exc, exp ); + move16(); /* compensate for the exp shift */ + tmp2 = add( prev_Q_bwe_syn, n_mem2 ); + IF( GT_16( *Q_bwe_exc, tmp2 ) ) { - state_lpc_syn[i] = shl( state_lpc_syn[i], tmp ); + L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) ); + *Q_bwe_exc = tmp2; move16(); } - FOR( i = -L_SHB_LAHEAD; i < 0; i++ ) + FOR( i = 0; i < L_FRAME16k; i++ ) { - excSHB[i] = shl( excSHB[i], tmp ); + L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */ + exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */ move16(); } - /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */ - - Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 ); - Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 ); - Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 ); - Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 ); - /* i: exc16kWhtnd in (Q_bwe_exc) */ - /* o: excSHB in (Q_bwe_exc) */ } + /* i: L_tmp2 in (Q31-exp) */ + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */ - IF( EQ_16( extl, FB_TBE ) ) + /* Rescale the past memories: LP synth and SHB look ahead buffers */ + tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn ); + FOR( i = 0; i < LPC_SHB_ORDER; i++ ) { - tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb ); - Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp ); - Scale_sig( fb_tbe_demph, 1, tmp ); - Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 ); - /* i: White_exc16k_FB in (14-n2) */ - /* o: White_exc16k_FB_temp in (14-n2) */ + state_lpc_syn[i] = shl( state_lpc_syn[i], tmp ); + move16(); + } + FOR( i = -L_SHB_LAHEAD; i < 0; i++ ) + { + excSHB[i] = shl( excSHB[i], tmp ); + move16(); + } + /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */ - FOR( i = 0; i < 10; i++ ) - { - FOR( j = 0; j < 32; ++j ) - { - White_exc16k_FB_temp[i * 32 + j] = mult_r( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] ); - move16(); - } - } + Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 ); + Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 ); + Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 ); + Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 ); + /* i: exc16kWhtnd in (Q_bwe_exc) */ + /* o: excSHB in (Q_bwe_exc) */ +} - *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 ); - move16(); /**Q_bwe_exc_fb +35 +1 -16*/ - flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k ); +IF( EQ_16( extl, FB_TBE ) ) +{ + tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb ); + Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp ); + Scale_sig( fb_tbe_demph, 1, tmp ); + Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 ); + /* i: White_exc16k_FB in (14-n2) */ + /* o: White_exc16k_FB_temp in (14-n2) */ - deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph ); - } - ELSE + FOR( i = 0; i < 10; i++ ) { - set16_fx( White_exc16k_FB, 0, L_FRAME16k ); + FOR( j = 0; j < 32; ++j ) + { + White_exc16k_FB_temp[i * 32 + j] = mult_r( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] ); + move16(); + } } -#ifdef ADD_IVAS_TBE_CODE - *prev_pow_exc16kWhtnd = pow1; - *prev_mix_factor = mix_factor; -#endif - return; + *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 ); + move16(); /**Q_bwe_exc_fb +35 +1 -16*/ + flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k ); + + deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph ); +} +ELSE +{ + set16_fx( White_exc16k_FB, 0, L_FRAME16k ); +} + +return; } void GenShapedSHBExcitation_ivas_enc_fx( @@ -3223,7 +2962,7 @@ void GenShapedSHBExcitation_ivas_enc_fx( /*Word16 out_exp; Word32 temp_pow1 = root_a_over_b_fx(pow1, Q_pow1, pow22, Q_pow22, &out_exp); temp_pow1 = L_shl(temp_pow1, out_exp);*/ - // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k); + // v_multc_fx_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k); L_tmp = 0; move32(); Q_White_exc16k = add( getScaleFactor16( White_exc16k, L_FRAME16k ), norm_l( temp_pow ) ); @@ -3286,7 +3025,6 @@ void GenShapedSHBExcitation_ivas_enc_fx( { IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */ { -#ifndef ADD_IVAS_TBE_CODE // BELOW PART WILL NEED TO BE CONVERTED FOR ENCODER!! test(); IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) { @@ -3472,33 +3210,6 @@ void GenShapedSHBExcitation_ivas_enc_fx( } } ELSE -#else - UNUSED_PARAM( Env_error_part ); - UNUSED_PARAM( Env_error ); - UNUSED_PARAM( EnvSHBres_4k ); - UNUSED_PARAM( c5_part ); - UNUSED_PARAM( c1 ); - UNUSED_PARAM( den ); - UNUSED_PARAM( c3_part ); - UNUSED_PARAM( c0 ); - UNUSED_PARAM( delta ); - UNUSED_PARAM( c3 ); - UNUSED_PARAM( c2_part ); - UNUSED_PARAM( c1_part ); - UNUSED_PARAM( EnvWhiteExc16k ); - UNUSED_PARAM( g2 ); - UNUSED_PARAM( c5 ); - UNUSED_PARAM( c4_part ); - UNUSED_PARAM( EnvWhiteExc16k_4k ); - UNUSED_PARAM( c2 ); - UNUSED_PARAM( g ); - UNUSED_PARAM( cbsize ); - UNUSED_PARAM( g1 ); - UNUSED_PARAM( EnvExc16kWhtnd ); - UNUSED_PARAM( c0_part ); - UNUSED_PARAM( EnvExc16kWhtnd_4k ); - UNUSED_PARAM( c4 ); -#endif { Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, Q_White_exc16k, pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); @@ -3590,6 +3301,9 @@ void GenShapedSHBExcitation_ivas_enc_fx( move16(); move16(); + scale_sig( White_exc16k, L_FRAME16k, -1 /* guard bit to prevent saturation in deemph*/ ); + Q_White_exc16k = sub( Q_White_exc16k, 1 ); + Word16 tbe_demph_fx = shl_sat( *tbe_demph, sub( Q_White_exc16k, *Q_bwe_exc ) ); // Q_White_exc16k deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, &tbe_demph_fx ); @@ -3962,7 +3676,7 @@ void GenShapedSHBExcitation_ivas_dec_fx( Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k]; Word32 pow1, pow22; Word16 scale, temp1, temp2, temp3; - + Word16 Q_White_exc16k; Word16 excTmp2[L_FRAME16k]; Word16 *White_exc16k; Word16 excNoisyEnv[L_FRAME16k]; @@ -3993,14 +3707,14 @@ void GenShapedSHBExcitation_ivas_dec_fx( Word32 White_exc16k_32[L_FRAME16k]; Word16 White_exc16k_tmp[L_FRAME16k]; Word16 Q_temp; - Word16 prev_Q_bwe_exc_fb; - Word16 chk1, chk2; + Word16 prev_Q_bwe_exc_fb, Q_exc16kWhtnd; + Word16 chk1; + Word32 chk2; chk1 = 0; chk2 = 0; move16(); - move16(); + move32(); -#if 1 // def ADD_IVAS_TBE_CODE Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k]; Word16 cbsize; Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale; @@ -4015,7 +3729,7 @@ void GenShapedSHBExcitation_ivas_dec_fx( mix_factor = 0; /* Q15 */ move16(); -#endif + set16_fx( zero_mem, 0, LPC_SHB_ORDER ); set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER ); FOR( i = 0; i < L_FRAME32k; i = i + 2 ) @@ -4047,11 +3761,7 @@ void GenShapedSHBExcitation_ivas_dec_fx( /* i: exc16k in Q_bwe_exc */ /* o: exc16kWhtnd in Q_bwe_exc */ -#if 1 // def ADD_IVAS_TBE_CODE IF( GE_32( extl_brate, SWB_TBE_2k8 ) ) -#else - IF( GE_32( bitrate, ACELP_24k40 ) ) -#endif { temp2 = 0; move16(); @@ -4086,11 +3796,8 @@ void GenShapedSHBExcitation_ivas_dec_fx( Q_pow1 = shl( *Q_bwe_exc, 1 ); test(); -#if 1 // ADD_IVAS_TBE_CODE + IF( flag_ACELP16k == 0 ) -#else - IF( ( LE_32( bitrate, ACELP_13k20 ) ) && ( GE_32( bitrate, ACELP_7k20 ) ) ) -#endif { /* varEnvShape = mean_fx(voice_factors, 4); */ /* unroll the loop */ @@ -4136,12 +3843,8 @@ void GenShapedSHBExcitation_ivas_dec_fx( test(); test(); test(); -#if 1 // def ADD_IVAS_TBE_CODE - test(); + IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) -#else - IF( *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) -#endif { /* pre-init smoothing filter to avoid energy drop outs */ L_tmp = L_mult( excTmp2[0], 1638 ); @@ -4168,7 +3871,7 @@ void GenShapedSHBExcitation_ivas_dec_fx( *mem_csfilt = Mult_32_16( L_tmp, varEnvShape ); move32(); } -#if 1 // def ADD_IVAS_TBE_CODE + IF( MSFlag > 0 ) { // varEnvShape = 0.995f; @@ -4228,7 +3931,7 @@ void GenShapedSHBExcitation_ivas_dec_fx( } } ELSE -#endif + { /* Track the low band envelope */ L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) ); @@ -4254,7 +3957,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) ); move32(); } -#if 1 // def ADD_IVAS_TBE_CODE test(); IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) { @@ -4266,7 +3968,7 @@ void GenShapedSHBExcitation_ivas_dec_fx( } /* normalize the amplitude of the gaussian excitation to that of the LB exc. */ - Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT; + Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT_IN_Q49; move32(); move32(); pow22 = POW_EXC16k_WHTND_FX; @@ -4275,21 +3977,23 @@ void GenShapedSHBExcitation_ivas_dec_fx( // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k); Word16 pow1_exp = sub( Q31, Q_pow1 ); Word32 temp_pow = Sqrt32( pow1, &pow1_exp ); - temp_pow = L_shl( Mpy_32_32( temp_pow, pow22_inv ), pow1_exp ); + temp_pow = Mpy_32_32( temp_pow, pow22_inv ); /*Word16 out_exp; Word32 temp_pow1 = root_a_over_b_fx(pow1, Q_pow1, pow22, Q_pow22, &out_exp); temp_pow1 = L_shl(temp_pow1, out_exp);*/ - // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k); + // v_multc_fx_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k); L_tmp = 0; move32(); + shift = getScaleFactor16( White_exc16k, L_FRAME16k ); FOR( k = 0; k < L_FRAME16k; k++ ) { White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] ); move32(); - White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], sub( *Q_bwe_exc, NOISE_QADJ ) ) ); // Q_bwe_exc - NOISE_QADJ + White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], shift ) ); // Q_White_exc16k move16(); L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) ); } + Q_White_exc16k = add( shift, sub( 49 - 31, pow1_exp ) ); Q_temp = norm_l( L_tmp ); IF( L_tmp == 0 ) { @@ -4298,7 +4002,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( } } ELSE -#endif { /* create a random excitation - Reuse exc16k memory */ White_exc16k = exc16k; @@ -4327,38 +4030,35 @@ void GenShapedSHBExcitation_ivas_dec_fx( /* calculate pow22 */ /* pow22=0.00001f */ tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 ); - pow22 = L_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */ + Word64 sum = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */ + Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k ); FOR( k = 0; k < L_FRAME16k; k++ ) { - /* White_exc16k[k] *= excNoisyEnv[k]; */ - White_exc16k[k] = mult_r( excNoisyEnv[k], shl( White_exc16k[k], 1 ) ); // Q_excTmp2 + 5 + 1 - 15 ==> Q_excTmp2 - 9 - move16(); - chk2 = s_or( chk2, White_exc16k[k] ); + + White_exc16k[k] = extract_h( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q_excTmp2 + 6 + Q_White_exc16k - 16 ==> Q_excTmp2 + Q_White_exc16k - 10 + chk2 = L_or( chk2, White_exc16k_32[k] ); /* i: excNoisyEnv in (Q_excTmp2) */ /* i: White_exc16k in Q6 */ - /* o: White_exc16k in (Q_bwe_exc-NOISE_QADJ) */ + /* o: White_exc16k in (Q_White_exc16k) */ /* pow22 += White_exc16k[k] * White_exc16k[k]; */ - pow22 = L_mac0_sat( pow22, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2-NOISE_QADJ)*/ + sum = W_mac0_16_16( sum, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/ + move16(); } - /*Q_pow22 = sub( shl(*Q_bwe_exc,1), 18 );*/ - Q_pow22 = shl( sub( Q_excTmp2, NOISE_QADJ ), 1 ); - Scale_sig( White_exc16k, L_FRAME16k, sub( *Q_bwe_exc, Q_excTmp2 ) ); + Q_pow22 = W_norm( sum ); + pow22 = W_extract_h( W_shl( sum, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32 + Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 ); + Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) ); } -#if 1 // def ADD_IVAS_TBE_CODE flag_plosive = 0; move16(); test(); test(); test(); IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) -#else - IF( GE_32( bitrate, ACELP_24k40 ) ) -#endif { IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */ { -#ifndef ADD_IVAS_TBE_CODE // BELOW PART WILL NEED TO BE CONVERTED FOR ENCODER!! test(); IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) { @@ -4537,33 +4237,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( } } ELSE -#else - UNUSED_PARAM( Env_error_part ); - UNUSED_PARAM( Env_error ); - UNUSED_PARAM( EnvSHBres_4k ); - UNUSED_PARAM( c5_part ); - UNUSED_PARAM( c1 ); - UNUSED_PARAM( den ); - UNUSED_PARAM( c3_part ); - UNUSED_PARAM( c0 ); - UNUSED_PARAM( delta ); - UNUSED_PARAM( c3 ); - UNUSED_PARAM( c2_part ); - UNUSED_PARAM( c1_part ); - UNUSED_PARAM( EnvWhiteExc16k ); - UNUSED_PARAM( g2 ); - UNUSED_PARAM( c5 ); - UNUSED_PARAM( c4_part ); - UNUSED_PARAM( EnvWhiteExc16k_4k ); - UNUSED_PARAM( c2 ); - UNUSED_PARAM( g ); - UNUSED_PARAM( cbsize ); - UNUSED_PARAM( g1 ); - UNUSED_PARAM( EnvExc16kWhtnd ); - UNUSED_PARAM( c0_part ); - UNUSED_PARAM( EnvExc16kWhtnd_4k ); - UNUSED_PARAM( c4 ); -#endif { Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); @@ -4581,7 +4254,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( ELSE /* decoder side */ { test(); -#if 1 // def ADD_IVAS_TBE_CODE IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) { IF( *vf_ind == 0 ) @@ -4599,7 +4271,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( } } ELSE -#endif { /* *vf_ind is an integer scale by 0.125f*/ tmp = shl( *vf_ind, ( 15 - 3 ) ); @@ -4612,10 +4283,8 @@ void GenShapedSHBExcitation_ivas_dec_fx( } } } -#if 1 // def ADD_IVAS_TBE_CODE test(); IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) -#endif { voice_factors[0] = mult_r( voice_factors[0], tmp2 ); move16(); @@ -4629,7 +4298,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( move16(); } } -#if 1 // def ADD_IVAS_TBE_CODE test(); IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL ) { @@ -4642,29 +4310,42 @@ void GenShapedSHBExcitation_ivas_dec_fx( temp_fac = Sqrt16(temp_fac, &temp_fac_exp);*/ L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); Word16 temp_fac = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15 - // v_multc_fixed_16_16(White_exc16k,shr(temp_fac, temp_fac_exp) , mixExc16k, L_FRAME16k); + shift = sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ); + // v_multc_fx_16_16(White_exc16k,shr(temp_fac, temp_fac_exp) , mixExc16k, L_FRAME16k); FOR( k = 0; k < L_FRAME16k; k++ ) { - mixExc16k[k] = mult_r( White_exc16k[k], temp_fac ); + mixExc16k[k] = mult_r( shl_sat( White_exc16k[k], shift ), temp_fac ); move16(); } } -#endif tmp = sub( Q_temp, 3 ); FOR( k = 0; k < L_FRAME16k; k++ ) { - White_exc16k_FB[k] = White_exc16k[k]; /* Q_bwe_exc-NOISE_QADJ */ + White_exc16k_FB[k] = White_exc16k[k]; /* Q_White_exc16k */ } prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; move16(); - *Q_bwe_exc_fb = sub( *Q_bwe_exc, NOISE_QADJ ); + *Q_bwe_exc_fb = Q_White_exc16k; move16(); + *tbe_demph = shl_sat( *tbe_demph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) ); deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); - /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */ - /* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */ + *tbe_demph = shl_sat( *tbe_demph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) ); + + Q_exc16kWhtnd = getScaleFactor16( exc16kWhtnd, L_FRAME16k ); + Q_exc16kWhtnd = add( Q_exc16kWhtnd, *Q_bwe_exc ); -#if 1 // def ADD_IVAS_TBE_CODE + shift = getScaleFactor16( White_exc16k, L_FRAME16k ); + + shift = s_min( Q_exc16kWhtnd, add( shift, Q_White_exc16k ) ); + scale_sig( exc16kWhtnd, L_FRAME16k, sub( shift, *Q_bwe_exc ) ); + scale_sig( White_exc16k, L_FRAME16k, sub( shift, Q_White_exc16k ) ); + + Q_exc16kWhtnd = Q_White_exc16k = shift; + move16(); + move16(); + *tbe_premph = shl_sat( *tbe_premph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) ); + move16(); test(); IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) { @@ -4697,11 +4378,8 @@ void GenShapedSHBExcitation_ivas_dec_fx( /* mixing of LB and gaussian excitation in the first half of the frame */ FOR( k = 0; k < L_FRAME16k / 2; k++ ) { - // exc16kWhtnd[k] = (float)fact * (White_exc16k[k] * scale) + (float)(1 - fact) * exc16kWhtnd[k]; - // exc16kWhtnd[k] = add(mult_r(fact, mult(shl(White_exc16k[k], *Q_bwe_exc), scale)), mult_r(sub(32767, fact), exc16kWhtnd[k])); - L_tmp = L_add( L_shl( L_mult( fact, mult_r( White_exc16k[k], scale ) ), NOISE_QADJ ), - L_mult( sub( 32767, fact ), exc16kWhtnd[k] ) ); // Q_bwe_exc - exc16kWhtnd[k] = round_fx( L_tmp ); + exc16kWhtnd[k] = mac_r( L_mult( fact, mult_r( White_exc16k[k], scale ) ), + sub( 32767, fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd move16(); fact = add_sat( fact, step ); scale = add_sat( scale, step_scale ); @@ -4710,11 +4388,8 @@ void GenShapedSHBExcitation_ivas_dec_fx( /* mixing of LB and gaussian excitation in the second half of the frame */ FOR( ; k < L_FRAME16k; k++ ) { - // exc16kWhtnd[k] = (float)new_fact * White_exc16k[k] + (float)(1 - new_fact) * exc16kWhtnd[k]; - // exc16kWhtnd[k] = add(mult_r(new_fact, shl(White_exc16k[k], *Q_bwe_exc)), mult_r(sub(32767, new_fact), exc16kWhtnd[k])); - L_tmp = L_add( L_shl( L_mult( new_fact, White_exc16k[k] ), NOISE_QADJ ), - mult_r( sub( 32767, new_fact ), exc16kWhtnd[k] ) ); // Q_bwe_exc - exc16kWhtnd[k] = round_fx( L_tmp ); + exc16kWhtnd[k] = mac_r( L_mult( new_fact, White_exc16k[k] ), + sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd move16(); } } @@ -4722,14 +4397,9 @@ void GenShapedSHBExcitation_ivas_dec_fx( PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); } ELSE -#endif { -#if 1 // def ADD_IVAS_TBE_CODE test(); IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) ) -#else - IF( EQ_16( coder_type, UNVOICED ) ) -#endif { L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); test(); @@ -4741,16 +4411,12 @@ void GenShapedSHBExcitation_ivas_dec_fx( scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ FOR( k = 0; k < L_FRAME16k; k++ ) { - /* White_exc16k: (Q_bwe_exc-NOISE_QADJ), scale: Q15 */ - L_tmp = L_mult( White_exc16k[k], scale ); - /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */ - exc16kWhtnd[k] = round_fx_sat( L_shl_sat( L_tmp, NOISE_QADJ ) ); + exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale ); move16(); - /* exc16kWhtnd: Q_bwe_exc */ } PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); - /* i/o: exc16kWhtnd (Q_bwe_exc) */ - /* i/o: tbe_premph (Q_bwe_exc) */ + /* i/o: exc16kWhtnd (Q_exc16kWhtnd) */ + /* i/o: tbe_premph (Q_exc16kWhtnd) */ } ELSE { @@ -4813,11 +4479,10 @@ void GenShapedSHBExcitation_ivas_dec_fx( FOR( j = 0; j < lSubFr; j++ ) { /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */ - L_tmp = L_mult( temp2, White_exc16k[k + j] ); /* 16+(Q_bwe_exc-NOISE_QADJ)*/ - L_tmp = L_shl_sat( L_tmp, NOISE_QADJ ); /* 16+(Q_bwe_exc) */ + L_tmp = L_mult( temp2, White_exc16k[k + j] ); exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); move16(); - /* Q_bwe_exc */ + /* Q_exc16kWhtnd */ } k = add( k, lSubFr ); @@ -4831,19 +4496,18 @@ void GenShapedSHBExcitation_ivas_dec_fx( temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */ temp = div_s( temp, temp2 ); /* Q15 */ temp = mult_r( PREEMPH_FAC, temp ); - PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); - /* exc16kWhtnd: Q_bwe_exc; - tbe_premph: Q_bwe_exc*/ + /* exc16kWhtnd: Q_exc16kWhtnd; + tbe_premph: Q_exc16kWhtnd*/ } } } + *tbe_premph = shl_sat( *tbe_premph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) ); + move16(); + Scale_sig( White_exc16k, L_FRAME16k, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) ); + Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) ); -#if 1 // def ADD_IVAS_TBE_CODE IF( LT_32( extl_brate, SWB_TBE_2k8 ) ) -#else - IF( LT_32( bitrate, ACELP_24k40 ) ) -#endif { Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 ); /* i: exc16kWhtnd in Q_bwe_exc */ @@ -4977,10 +4641,8 @@ void GenShapedSHBExcitation_ivas_dec_fx( set16_fx( White_exc16k_FB, 0, L_FRAME16k ); } -#if 1 // def ADD_IVAS_TBE_CODE *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32 *prev_mix_factor = mix_factor; -#endif return; } @@ -5087,7 +4749,6 @@ void GenSHBSynth_fx32( Word32 speech_buf_32k[L_FRAME32k]; Word16 i; -#ifdef FIX_881_HILBERT_FILTER Word16 shift = 0; Word32 maxm32, input_synspeech_temp[L_FRAME16k]; move16(); @@ -5123,9 +4784,6 @@ void GenSHBSynth_fx32( } Interpolate_allpass_steep_fx32( input_synspeech_temp, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k ); -#else - Interpolate_allpass_steep_fx32( input_synspeech, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k ); -#endif IF( EQ_16( L_frame, L_FRAME ) ) { @@ -5148,14 +4806,12 @@ void GenSHBSynth_fx32( } } -#ifdef FIX_881_HILBERT_FILTER IF( maxm32 != 0 ) { Scale_sig32( shb_syn_speech_32k, L_FRAME32k, negate( shift ) ); Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) ); Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) ); } -#endif return; } @@ -6005,11 +5661,6 @@ void non_linearity_fx( Word16 nframes; Word32 prev_scale; Word16 length_half; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - IF( EQ_16( L_frame, L_FRAME16k ) ) { @@ -6107,12 +5758,10 @@ void non_linearity_fx( tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */ /* (log2(scale / prev_scale))/length */ - L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */ - - frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ - + L_tmp = L_shl_sat( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ) ); /* Q(16+29-exp+1-16+exp-14)->Q16 */ + frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ tmp = extract_l( Pow2( 14, frac ) ); - scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */ + scale_step = shl_sat( tmp, exp ); /* Q14 */ } } @@ -6135,8 +5784,8 @@ void non_linearity_fx( IF( GT_16( max_val, shl( 1, Q_inp ) ) ) { exp = norm_s( max_val ); - tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ - scale = L_shl_o( L_mult( 21955 /* 0.67 in Q15 */, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */ + tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ + scale = L_shl_sat( L_mult( 21955 /* 0.67 in Q15 */, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */ } ELSE { @@ -6177,20 +5826,15 @@ void non_linearity_fx( L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */ /* Computing 1/(j - length/2) */ - tmp = sub( j, length_half ); exp = norm_s( tmp ); - - tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */ /* (log2(scale / prev_scale))/length */ - L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */ - - frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ - + L_tmp = L_shl_sat( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ) ); /*Q(16+29-exp+1-16+exp-14)->Q16 */ + frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ tmp = extract_l( Pow2( 14, frac ) ); - scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */ + scale_step = shl_sat( tmp, exp ); /*Q14 */ } } @@ -6257,11 +5901,7 @@ void non_linearity_ivas_fx( Word16 nframes; Word32 prev_scale; Word16 length_half; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - + Word16 sc_factor; IF( EQ_16( L_frame, L_FRAME16k ) ) { @@ -6310,7 +5950,7 @@ void non_linearity_ivas_fx( } - IF( GT_16( max_val, shl( 1, Q_inp ) ) ) + IF( GT_16( max_val, shl_sat( 1, Q_inp ) ) ) { exp = norm_s( max_val ); tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ @@ -6322,8 +5962,10 @@ void non_linearity_ivas_fx( move32(); /* Q31; 0.67 in Q31 */ } + sc_factor = s_max( sub( 13, norm_s( add( j, 1 ) ) ), 0 ); /* Adapt the scaling factor allowed depending of max position */ + sc_factor = s_max( sc_factor, 1 ); /* Note: The sc_factor is the log2 of the sc_factor in the float code to simplify condition below */ test(); - IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ) /*Q30 -> Q31*/, scale /*Q31*/ ) ) + IF( prev_scale <= 0 || GT_32( L_shr( prev_scale, sub( sc_factor, 1 ) /*Q30 -> Q31*/ ), scale /*Q31*/ ) ) /* Since the sc_factor is the log2 of sc_factor in float, we apply it using L_shr */ { scale_step = 16384; move16(); /* Q14 */ @@ -6359,12 +6001,12 @@ void non_linearity_ivas_fx( tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */ /* (log2(scale / prev_scale))/length */ - L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */ + L_tmp = L_shl_sat( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ) ); /* Q(16+29-exp+1-16+exp-14)->Q16 */ frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ tmp = extract_l( Pow2( 14, frac ) ); - scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */ + scale_step = shl_sat( tmp, exp ); /* Q14 */ } } @@ -6384,11 +6026,11 @@ void non_linearity_ivas_fx( max_val = s_max( max_val, tmp ); } - IF( GT_16( max_val, shl( 1, Q_inp ) ) ) + IF( GT_16( max_val, shl_sat( 1, Q_inp ) ) ) { exp = norm_s( max_val ); - tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ - scale = L_shl_o( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */ + tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ + scale = L_shl_sat( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */ } ELSE { @@ -6396,8 +6038,12 @@ void non_linearity_ivas_fx( move32(); /* Q31; 0.67 in Q31 */ } + /* if ( element_mode > EVS_MONO ) */ /* element mode is not needed because the function is duplicated for IVAS */ + sc_factor = s_max( sub( 12, norm_s( add( sub( j, length_half ), 1 ) ) ), 0 ); /* allowed intra frame jump is smaller */ + sc_factor = s_max( sc_factor, 1 ); /* Note: The sc_factor is the log2 of the sc_factor in the float code to simplify condition below */ + test(); - IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ), scale ) ) + IF( prev_scale <= 0 || GT_32( L_shr( prev_scale, sub( sc_factor, 1 ) /*Q30 -> Q31*/ ), scale /*Q31*/ ) ) /* Since the sc_factor is the log2 of sc_factor in float, we apply it using L_shr */ { scale_step = 16384; move16(); /*Q14 */ @@ -6429,20 +6075,15 @@ void non_linearity_ivas_fx( L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */ /* Computing 1/(j - length/2) */ - tmp = sub( j, length_half ); exp = norm_s( tmp ); - - tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */ /* (log2(scale / prev_scale))/length */ - L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */ - - frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ - + L_tmp = L_shl_sat( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ) ); /*Q(16+29-exp+1-16+exp-14)->Q16 */ + frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ tmp = extract_l( Pow2( 14, frac ) ); - scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */ + scale_step = shl_sat( tmp, exp ); /*Q14 */ } } @@ -6704,7 +6345,9 @@ void wb_tbe_extras_reset_synth_fx( *-------------------------------------------------------------------*/ void elliptic_bpf_48k_generic_fx( - const Word16 input_fx[], /* i : input signal Q_input_fx*/ + const Word16 element_mode, + Word16 IsUpsampled3, + Word16 input_fx[], /* i : input signal Q_input_fx*/ Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal memory_fx_Q */ Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ @@ -6713,17 +6356,23 @@ void elliptic_bpf_48k_generic_fx( ) { Word16 i, j; - Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; - Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; - Word32 memory2_fx_2[4], memory2_fx_3[4]; + Word16 memory_fx0, Q_temp, Q_temp2; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX; + Word32 L_tmpMax; + Word64 W_tmpX; + Word64 W_tmpY; + + Word32 *L_tmp = &L_tmp_buffer[4]; + Word32 *L_tmp2 = &L_tmp2_buffer[4]; + Word32 *L_output = &L_output_buffer[4]; FOR( i = 0; i < 4; i++ ) { - memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); - memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); - memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); + memory_fx0 = extract_l( memory_fx2[0][i] ); + input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); + L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); move32(); move32(); move32(); @@ -6731,61 +6380,114 @@ void elliptic_bpf_48k_generic_fx( move32(); } - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + L_tmpMax = L_add( 0, 0 ); + IF( !IsUpsampled3 ) + { + IF( element_mode ) + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + } + } + ELSE + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } + } + } /*IsUpsampled3*/ + ELSE + { + IF( element_mode ) + { + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + } + } + ELSE + { + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } + } + + } /*IsUpsampled3*/ - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; @@ -6796,65 +6498,45 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - move32(); - L_tmpMax = L_abs( L_tmp2[0] ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + + L_tmpMax = L_add( 0, 0 ); + IF( element_mode ) + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } + } + ELSE + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } } + Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); Scale_sig32( L_tmp2, 960, Q_temp ); @@ -6870,77 +6552,53 @@ void elliptic_bpf_48k_generic_fx( move32(); FOR( j = 0; j < 4; j++ ) { - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); move32(); move32(); move32(); } - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - move32(); - L_tmpMax = L_abs( L_output[0] ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ - L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); - - FOR( i = 4; i < L_FRAME48k; i++ ) + L_tmpMax = L_add( 0, 0 ); + IF( element_mode ) + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } + } + ELSE { - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } } + + memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; @@ -6998,16 +6656,18 @@ void synthesise_fb_high_band_fx( Word16 Q_fb_exc, Word16 output[], /* o : high band speech - 14.0 to 20 kHz */ const Word32 fb_exc_energy, /* i : full band excitation energy */ - const Word16 ratio, /* i : energy ratio */ + const Word16 ratio, /* i : energy ratio */ const Word16 L_frame, /* i : ACELP frame length */ - const Word16 bfi, /* i : fec flag */ + const Word16 bfi, /* i : fec flag */ Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout ) + Word16 Qout, + Word16 element_mode ) { Word16 i, j; - Word16 excitation_in_interp3[L_FRAME48k]; + Word16 excitation_in_interp3_buffer[L_FRAME48k + 4]; + Word16 *excitation_in_interp3 = &excitation_in_interp3_buffer[0] + 4; Word16 tmp[L_FRAME48k]; Word32 temp1; Word32 ratio2; @@ -7032,13 +6692,22 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); + elliptic_bpf_48k_generic_fx( + element_mode, + 1, // IsUpsampled3 + excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx + + ); } ELSE { /* for 12.8kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); + elliptic_bpf_48k_generic_fx( + element_mode, + 1, // IsUpsampled3 + excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } + /* temp1 = sum2_f( tmp, L_FRAME48k ) + 0.001f */ temp1 = sum2_fx_mod( tmp, L_FRAME48k ); L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/ @@ -7047,9 +6716,33 @@ void synthesise_fb_high_band_fx( tmp1 = sub( add( Q_fb_exc, Q_fb_exc ), 8 ); /* 1-9*/ exp = sub( sub( 31, tmp1 ), exp ); - exp2 = norm_l( temp1 ); - tmp2 = extract_h( L_shl( temp1, exp2 ) ); - exp2 = sub( sub( 31, sub( shl( exp_tmp, 1 ), 8 ) ), exp2 ); /* in Q15 (temp1 in Q9)*/ + IF( element_mode != EVS_MONO ) + { + Word16 sft, t_Q; + Word64 P_ONE = 33; /* 0.001f in Q15 */ + move64(); + Word64 W_temp; + + t_Q = sub( shl( exp_tmp, 1 ), 8 ); + P_ONE = W_shl( P_ONE, s_min( 63, sub( t_Q, 15 ) ) ); + + W_temp = W_add( P_ONE, temp1 ); + + sft = W_norm( W_temp ); + W_temp = W_shl( W_temp, sft ); + + temp1 = W_extract_h( W_temp ); + t_Q = sub( add( t_Q, sft ), 32 ); + + tmp2 = extract_h( temp1 ); + exp2 = sub( 31, t_Q ); + } + ELSE + { + exp2 = norm_l( temp1 ); + tmp2 = extract_h( L_shl( temp1, exp2 ) ); + exp2 = sub( sub( 31, sub( shl( exp_tmp, 1 ), 8 ) ), exp2 ); /* in Q15 (temp1 in Q9)*/ + } exp = sub( exp2, exp ); /* Denormalize and substract */ IF( GT_16( tmp2, tmp3 ) ) @@ -7125,10 +6818,6 @@ void Estimate_mix_factors_fx( Word16 exp1, exp2, expa, expb, fraca, fracb, scale, num_flag, den_flag; Word16 tmp, tmp1, sc1, sc2; Word32 L_tmp1, L_tmp2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif Copy( shb_res, shb_res_local, L_FRAME16k ); Copy( White_exc16k_frac, WN_exc_local, L_FRAME16k ); @@ -7186,7 +6875,7 @@ void Estimate_mix_factors_fx( expa = sub( 30, expa ); expb = norm_l( temp_p1_p2 ); - fracb = round_fx_o( L_shl_o( temp_p1_p2, expb, &Overflow ), &Overflow ); + fracb = round_fx_sat( L_shl( temp_p1_p2, expb ) ); expb = sub( 30, expb ); num_flag = 0; @@ -7246,56 +6935,7 @@ void Estimate_mix_factors_fx( return; } -#ifdef ADD_IVAS_TBE_CODE -/*-------------------------------------------------------------------* - * tbe_celp_exc() * - * * - * Prepare adaptive part of TBE excitation * - *-------------------------------------------------------------------*/ - -void tbe_celp_exc( - const int16_t element_mode, /* i : element mode */ - const int16_t idchan, /* i : channel ID */ - float *bwe_exc, /* i/o: BWE excitation */ - const int16_t L_frame, /* i : frame length */ - const int16_t L_subfr, /* i : subframe length */ - const int16_t i_subfr, /* i : subframe index */ - const int16_t T0, /* i : integer pitch lag */ - const int16_t T0_frac, /* i : fraction of lag */ - float *error, /* i/o: error */ - const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ -) -{ - int16_t i, offset; - - if ( element_mode == IVAS_CPE_TD && idchan == 1 && !tdm_LRTD_flag ) - { - return; - } - - if ( L_frame == L_FRAME ) - { - offset = tbe_celp_exc_offset( T0, T0_frac ); - - for ( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) - { - bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset + (int16_t) *error]; - } - *error += (float) offset - (float) T0 * HIBND_ACB_L_FAC - 0.25f * HIBND_ACB_L_FAC * (float) T0_frac; - } - else - { - offset = T0 * 2 + (int16_t) ( (float) T0_frac * 0.5f + 4 + 0.5f ) - 4; - for ( i = 0; i < L_subfr * 2; i++ ) - { - bwe_exc[i + i_subfr * 2] = bwe_exc[i + i_subfr * 2 - offset + (int16_t) *error]; - } - *error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac; - } - return; -} -#endif /*======================================================================================*/ /* FUNCTION : prep_tbe_exc_fx() */ /*--------------------------------------------------------------------------------------*/ @@ -7317,7 +6957,6 @@ void tbe_celp_exc( /* INPUT/OUTPUT ARGUMENTS : */ /* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */ /*--------------------------------------------------------------------------------------*/ - /* _ None */ /*--------------------------------------------------------------------------------------*/ /* RETURN ARGUMENTS : */ @@ -7325,200 +6964,28 @@ void tbe_celp_exc( /*======================================================================================*/ void prep_tbe_exc_fx( - const Word16 L_frame_fx, /* i : length of the frame */ -#ifdef ADD_IVAS_TBE_CODE - const Word16 L_subfr, -#endif - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate -#ifdef ADD_IVAS_TBE_CODE - , /* i : core bitrate */ - const int16_t element_mode, /* i : element mode */ - const int16_t idchan, /* i : channel ID */ - const int16_t flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif -) -{ - Word16 i; - Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC]; - Word16 tmp_code_preInt_fx[L_SUBFR]; - Word16 gain_code16 = 0; - move16(); - Word16 tmp /*, tmp1, tmp2*/; - /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/ - Word16 pitch; - - Word32 L_tmp, Ltemp1, Ltemp2; - Word32 tempQ31; - Word16 tempQ15; -#ifndef ADD_IVAS_TBE_CODE - Word16 L_subfr = L_SUBFR; - move16(); -#endif -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac; - = VF_0th_PARAM + voice_fac * (VF_1st_PARAM + VF_2nd_PARAM * voice_fac ) - *voice_factors = min( max_val(0.0f, *voice_factors), 1.0f); */ - tempQ31 = L_deposit_h( VF_1st_PARAM_FX ); - tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx ); - tempQ31 = L_deposit_h( VF_0th_PARAM_FX ); - *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 ); - move16(); - tmp = MAX_16; - move16(); - - pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */ - - test(); - test(); - IF( ( ( EQ_16( coder_type, VOICED ) ) || ( GT_16( pitch, 14784 /* 115.5 in Q7 */ ) ) ) && ( GT_32( core_brate, ACELP_8k00 ) ) ) - { - tmp = MAX_16; - move16(); - *voice_factors_fx = mult_r( *voice_factors_fx, tmp ); - move16(); - } - - *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 ); - move16(); -#ifdef ADD_IVAS_TBE_CODE - IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag ) - { - IF( flag_TD_BWE && i_subfr == 0 ) - { - set16_fx( bwe_exc, 0, L_FRAME32k ); - } - return; - } - -#endif - IF( EQ_16( L_frame_fx, L_FRAME ) ) - { - interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */ - gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */ - FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) - { - L_tmp = L_mult( gain_code16, tmp_code_fx[i] ); /* Q9 + Q_exc + 1*/ - L_tmp = L_shl_sat( L_tmp, 5 ); /* Q9 + Q_exc + Q6*/ - L_tmp = L_mac_sat( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] ); /*Q15+Q_exc */ - L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */ /* saturation can occur here */ - bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow ); /*Q_exc */ - move16(); - } - } - ELSE - { - IF( gain_preQ_fx != 0 ) - { - FOR( i = 0; i < L_subfr; i++ ) - { - /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ - Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ - Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */ - - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, 4 ) /*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */ - - tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */ - move16(); - } - } - ELSE - { - FOR( i = 0; i < L_subfr; i++ ) - { - /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ - Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ - move16(); - } - } - - interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */ - FOR( i = 0; i < L_subfr * 2; i++ ) - { - L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * 2] ); /*Q14+Q_exc+1 */ - tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */ - bwe_exc_fx[i + i_subfr_fx * 2] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ - move16(); - } - } - - return; -} - -/*======================================================================================*/ -/* FUNCTION : prep_tbe_exc_ivas_fx() */ -/*--------------------------------------------------------------------------------------*/ -/* PURPOSE : Prepare TBE excitation */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) L_frame_fx : length of the frame */ -/* _ (Word16) i_subfr_fx : subframe index */ -/* _ (Word16) gain_pit_fx : Pitch gain (14) */ -/* _ (Word32) gain_code_fx : algebraic codebook gain (Q(16+Q_exc)) */ -/* _ (Word16*[]) code_fx : algebraic excitation (Q9) */ -/* _ (Word16) voice_fac_fx : voicing factor (Q15) */ -/* _ (Word16) gain_preQ_fx : prequantizer excitation gain */ -/* _ (Word16[]) code_preQ_fx : prequantizer excitation */ -/*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*[]) voice_factors_fx : TBE voicing factor (Q15) */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */ -/*--------------------------------------------------------------------------------------*/ - -/* _ None */ -/*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*======================================================================================*/ + const Word16 L_frame_fx, /* i : length of the frame */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 i_subfr_fx, /* i : subframe index */ + const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ + const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ + const Word16 code_fx[], /* i : algebraic excitation Q9*/ + const Word16 voice_fac_fx, /* i : voicing factor Q15*/ + Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ + Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ + const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ + const Word16 code_preQ_fx[], /* i : prequantizer excitation */ + const Word16 Q_code_preQ, /* i : Q, prequantizer excitation */ + const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ + const Word16 T0, /* i : integer pitch variables Q0 */ + const Word16 T0_frac, /* i : Fractional pitch variables Q0*/ + const Word16 coder_type, /* i : coding type */ + const Word32 core_brate, /* i : core bitrate */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ + const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ -void prep_tbe_exc_ivas_fx( - const Word16 L_frame_fx, /* i : length of the frame */ -#if 1 // def ADD_IVAS_TBE_CODE - const Word16 L_subfr, -#endif - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate -#if 1 // def ADD_IVAS_TBE_CODE - , /* i : core bitrate */ - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif ) { Word16 i; @@ -7533,10 +7000,6 @@ void prep_tbe_exc_ivas_fx( Word32 L_tmp, Ltemp1, Ltemp2; Word32 tempQ31; Word16 tempQ15; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac; = VF_0th_PARAM + voice_fac * (VF_1st_PARAM + VF_2nd_PARAM * voice_fac ) @@ -7550,7 +7013,7 @@ void prep_tbe_exc_ivas_fx( tmp = MAX_16; move16(); - pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */ + pitch = shl_sat( add( shl_sat( T0, 2 ), T0_frac ), 5 ); /* Q7 */ test(); test(); @@ -7564,7 +7027,7 @@ void prep_tbe_exc_ivas_fx( *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 ); move16(); -#if 1 // def ADD_IVAS_TBE_CODE + test(); test(); IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag ) @@ -7577,24 +7040,30 @@ void prep_tbe_exc_ivas_fx( return; } -#endif IF( EQ_16( L_frame_fx, L_FRAME ) ) { - interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */ - gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */ + interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */ + gain_code16 = round_fx_sat( L_shl_sat( gain_code_fx, Q_exc ) ); /*Q_exc */ FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) { - L_tmp = L_mult( gain_code16, tmp_code_fx[i] ); /* Q9 + Q_exc + 1*/ - L_tmp = L_shl( L_tmp, 5 ); /* Q9 + Q_exc + Q6*/ - L_tmp = L_mac_o( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC], &Overflow ); /*Q15+Q_exc */ - L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */ /* saturation can occur here */ - bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow ); /*Q_exc */ + L_tmp = L_mult( gain_code16, tmp_code_fx[i] ); /* Q9 + Q_exc + 1*/ + L_tmp = L_shl_sat( L_tmp, 5 ); /* Q9 + Q_exc + Q6*/ + L_tmp = L_mac_sat( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] ); /*Q15+Q_exc */ + L_tmp = L_shl_sat( L_tmp, 1 ); /*16+Q_exc */ /* saturation can occur here */ + bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_sat( L_tmp ); /*Q_exc */ move16(); } } ELSE { Word16 shift = 4; + IF( NE_16( element_mode, EVS_MONO ) ) + { + /* shift of 4 assumes code_preQ_fx[] in Q10 - this is however not always given */ + shift = add( 2 + 1 - 1, Q_code_preQ ); /* gain_preQ_fx in Q2, code_preQ_fx[] in Q_code_preQ, 1 additional left-shift by L_mult() - factor of 2 (from "2 * gain_preQ * code_preQ[i]") */ + shift = sub( 16, shift ); + } + move16(); IF( gain_preQ_fx != 0 ) { @@ -7602,12 +7071,12 @@ void prep_tbe_exc_ivas_fx( { /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ - Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */ + Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /* Q2 + Q_code_preQ */ - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, shift ) /*Q_exc+ 2 + 6 (or) 10 - 13*/, &Overflow ); /*Q_exc+16 */ + Ltemp1 = L_shl_sat( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/ ); /*Q_exc+16 */ + Ltemp2 = L_shl_sat( Ltemp2, add( Q_exc, shift ) /*Q_exc+ 2 + 6 (or) 10 - 13*/ ); /*Q_exc+16 */ - tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */ + tmp_code_preInt_fx[i] = round_fx_sat( L_add_sat( Ltemp1, Ltemp2 ) ); /* Q_exc */ move16(); } } @@ -7616,9 +7085,9 @@ void prep_tbe_exc_ivas_fx( FOR( i = 0; i < L_subfr; i++ ) { /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ - Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ + Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ + Ltemp1 = L_shl_sat( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/ ); /*Q_exc+16 */ + tmp_code_preInt_fx[i] = round_fx_sat( Ltemp1 ); /* Q_exc */ move16(); } } @@ -7626,9 +7095,9 @@ void prep_tbe_exc_ivas_fx( interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */ FOR( i = 0; i < shl( L_subfr, 1 ); i++ ) { - L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + shl( i_subfr_fx, 1 )] ); /*Q14+Q_exc+1 */ - tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */ - bwe_exc_fx[i + shl( i_subfr_fx, 1 )] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ + L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + ( i_subfr_fx << 1 )] ); /*Q14+Q_exc+1 */ + tmp = round_fx_sat( L_shl_sat( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/ ) ); /* tmp in Q_exc */ + bwe_exc_fx[i + ( i_subfr_fx << 1 )] = add_sat( tmp, tmp_code_fx[i] ); /*Q_exc */ move16(); } } @@ -7636,6 +7105,7 @@ void prep_tbe_exc_ivas_fx( return; } + /*=============================================================================*/ /* FUNCTION : void swb_formant_fac_fx ( ) */ /*------------------------------------------------------------------------------*/ @@ -7655,16 +7125,14 @@ void prep_tbe_exc_ivas_fx( /* CALLED FROM : */ /*==============================================================================*/ -Word16 swb_formant_fac_fx( /* o : Formant filter strength [0,1] */ - const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ - Word16 *tilt_mem /* i/o: Tilt smoothing memory (Q12) */ +/*! r: Formant filter strength [0,1] */ +Word16 swb_formant_fac_fx( + const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ + Word16 *tilt_mem /* i/o: Tilt smoothing memory (Q12) */ ) { Word16 formant_fac; Word16 tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /* Smoothen tilt value */ /* tmp = 0.5f * (float)fabs(lpc_shb2) + 0.5f * *tilt_mem; */ @@ -7677,7 +7145,6 @@ Word16 swb_formant_fac_fx( /* o : Formant filter strength tmp = sub( tmp, SWB_TILT_LOW_FX ); /* Q12 */ formant_fac = mult_r( tmp, SWB_TILT_DELTA_FX ); /* Q12 */ - IF( GT_16( formant_fac, 4096 /* 1 in Q12 */ ) ) { formant_fac = 4096; /* 1 in Q12 */ @@ -7692,11 +7159,18 @@ Word16 swb_formant_fac_fx( /* o : Formant filter strength /* formant_fac = 1.0f - 0.5f*formant_fac */ tmp = mult_r( 16384, formant_fac ); /* 0.5 in Q15 */ - formant_fac = shl_o( sub( 4096 /* 1 in Q12 */, tmp ), 3, &Overflow ); + formant_fac = shl_sat( sub( 4096 /* 1 in Q12 */, tmp ), 3 ); + return formant_fac; /*Q15 */ } +/*-------------------------------------------------------------------* + * wb_tbe_extras_reset_fx() + * + * + *-------------------------------------------------------------------*/ + void wb_tbe_extras_reset_fx( Word16 mem_genSHBexc_filt_down_wb2[], Word16 mem_genSHBexc_filt_down_wb3[] ) @@ -7713,7 +7187,6 @@ void wb_tbe_extras_reset_fx( * Determine TBE bit consumption per frame from bitrate * *-------------------------------------------------------------------*/ - Word16 get_tbe_bits_fx( const Word32 total_brate, /* o : TBE bit consumption per frame */ const Word16 bwidth, /* i : overall bitrate */ diff --git a/lib_com/syn_12k8_fx.c b/lib_com/syn_12k8_fx.c index 86d4c6ef76bbc06a53d7f2bee16af0a546b985ea..7edf3a44b7378c4f9aef61fe7d534ad5b7432013 100644 --- a/lib_com/syn_12k8_fx.c +++ b/lib_com/syn_12k8_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -8,29 +8,29 @@ /*===========================================================================*/ -/* FUNCTION : syn_12k8_fx() */ +/* FUNCTION : syn_12k8_fx() */ /*---------------------------------------------------------------------------*/ -/* PURPOSE : perform the synthesis filtering 1/A(z). */ +/* PURPOSE : perform the synthesis filtering 1/A(z). */ /*---------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) st_fx->L_frame :length of the frame */ -/* _ (Word16[]) Aq : LP filter coefficients Q12 */ -/* _ (Word16) exc : input signal Q_exc */ -/* _ (Word16) update_m : update memory flag: 0-->no memory update */ -/* 1 --> update of memory */ -/* _ (Word16) Q_exc : Excitation scaling */ -/* _ (Word16) Q_syn : Synthesis scaling */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) st_fx->L_frame :length of the frame */ +/* _ (Word16[]) Aq : LP filter coefficients Q12 */ +/* _ (Word16) exc : input signal Q_exc */ +/* _ (Word16) update_m : update memory flag: 0-->no memory update */ +/* 1 --> update of memory */ +/* _ (Word16) Q_exc : Excitation scaling */ +/* _ (Word16) Q_syn : Synthesis scaling */ /*---------------------------------------------------------------------------*/ -/* INPUT OUTPUT ARGUMENTS : */ +/* INPUT OUTPUT ARGUMENTS : */ /*---------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) synth : initial filter states Q_syn */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) synth : initial filter states Q_syn */ /*---------------------------------------------------------------------------*/ /* _ (Word16[]) st_fx->mem_syn2_fx: initial filter states Q_syn */ /*---------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*===========================================================================*/ void syn_12k8_fx( Word16 L_frame, diff --git a/lib_com/syn_filt_fx.c b/lib_com/syn_filt_fx.c index ada0d243ea88b7c08fdb6ac8bd5d8720f9eb7f8f..08d040662b5285d9ab95e507d6498ad3cfc07b20 100644 --- a/lib_com/syn_filt_fx.c +++ b/lib_com/syn_filt_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -11,11 +11,8 @@ static Word32 syn_kern_2( Word32 L_tmp, const Word16 a[], const Word16 y[] ) { -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - L_tmp = L_msu_o( L_tmp, y[-1], a[1], &Overflow ); - return L_msu_o( L_tmp, y[-2], a[2], &Overflow ); + L_tmp = L_msu_sat( L_tmp, y[-1], a[1] ); + return L_msu_sat( L_tmp, y[-2], a[2] ); } static Word32 syn_kern_4( Word32 L_tmp, const Word16 a[], const Word16 y[] ) @@ -188,14 +185,12 @@ void syn_filt_fx( Word16 *yy; Word32 s; Word16 q; - Flag Overflow = 0; - move16(); Word16 a0; yy = &buf[0]; q = add( norm_s( a[0] ), 1 ); - a0 = shr_o( a[0], shift, &Overflow ); /* input / 2^shift */ + a0 = shr_sat( a[0], shift ); /* input / 2^shift */ /*------------------------------------------------------------------* * copy initial filter states into synthesis buffer and do synthesis @@ -337,16 +332,20 @@ void syn_filt_fx32( * Returns: * void */ -void E_UTIL_synthesis( const Word16 shift, const Word16 a[], const Word16 x[], Word16 y[], const Word16 lg, Word16 mem[], const Word16 update, const Word16 m ) +void E_UTIL_synthesis( + const Word16 shift, + const Word16 a[], + const Word16 x[], + Word16 y[], + const Word16 lg, + Word16 mem[], + const Word16 update, + const Word16 m ) { Word16 i, j, a0; Word32 L_tmp; Word16 q; Word32 ( *syn_kern )( Word32 L_tmp, const Word16 a[], const Word16 y[] ) = NULL; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif if ( EQ_16( m, 6 ) ) { @@ -373,14 +372,14 @@ void E_UTIL_synthesis( const Word16 shift, const Word16 a[], const Word16 x[], W *-----------------------------------------------------------------------*/ mem += m; /*move16();*/ - a0 = shr_o( a[0], shift, &Overflow ); /* input / 2^shift */ + a0 = shr_sat( a[0], shift ); /* input / 2^shift */ /*-----------------------------------------------------------------------* * Do the filtering *-----------------------------------------------------------------------*/ /* Filtering Only from Input + Memory */ L_tmp = syn_kern( L_mult( a0, *x++ ), a, mem ); - L_tmp = L_shl_o( L_tmp, q, &Overflow ); - *y++ = round_fx_o( L_tmp, &Overflow ); + L_tmp = L_shl_sat( L_tmp, q ); + *y++ = round_fx_sat( L_tmp ); move16(); /* Filtering from Input + Mix of Memory & Output Signal Past */ @@ -390,15 +389,15 @@ void E_UTIL_synthesis( const Word16 shift, const Word16 a[], const Word16 x[], W /* Process Output Signal Past */ FOR( j = 1; j <= i; j++ ) { - L_tmp = L_msu_o( L_tmp, a[j], y[-j], &Overflow ); + L_tmp = L_msu_sat( L_tmp, a[j], y[-j] ); } /* Process Memory */ FOR( ; j <= m; j++ ) { L_tmp = L_msu_sat( L_tmp, a[j], mem[i - j] ); } - L_tmp = L_shl_o( L_tmp, q, &Overflow ); - *y++ = round_fx_o( L_tmp, &Overflow ); + L_tmp = L_shl_sat( L_tmp, q ); + *y++ = round_fx_sat( L_tmp ); move16(); } @@ -406,8 +405,8 @@ void E_UTIL_synthesis( const Word16 shift, const Word16 a[], const Word16 x[], W FOR( ; i < lg; i++ ) { L_tmp = syn_kern( L_mult( a0, *x++ ), a, y ); - L_tmp = L_shl_o( L_tmp, q, &Overflow ); - *y++ = round_fx_o( L_tmp, &Overflow ); + L_tmp = L_shl_sat( L_tmp, q ); + *y++ = round_fx_sat( L_tmp ); move16(); } @@ -447,15 +446,21 @@ void E_UTIL_synthesis( const Word16 shift, const Word16 a[], const Word16 x[], W * Returns: * void */ -void E_UTIL_synthesis_fx( const Word16 shift, const Word32 a[], const Word32 x[], Word32 y[], const Word16 lg, Word32 mem[], const Word16 update, const Word16 m ) +void E_UTIL_synthesis_fx( + const Word16 shift, + const Word32 a[], + const Word32 x[], + Word32 y[], + const Word16 lg, + Word32 mem[], + const Word16 update, + const Word16 m ) { Word16 i, j; Word32 a0; Word32 L_tmp; Word16 q; Word32 ( *syn_kern )( Word32 L_tmp, const Word32 a[], const Word32 y[] ) = NULL; - Flag Overflow = 0; - move32(); if ( EQ_16( m, 6 ) ) { @@ -482,14 +487,14 @@ void E_UTIL_synthesis_fx( const Word16 shift, const Word32 a[], const Word32 x[] *-----------------------------------------------------------------------*/ mem += m; /*move32();*/ - a0 = L_shr_o( a[0], shift, &Overflow ); /* input / 2^shift */ + a0 = L_shr_sat( a[0], shift ); /* input / 2^shift */ /*-----------------------------------------------------------------------* * Do the filtering *-----------------------------------------------------------------------*/ /* Filtering Only from Input + Memory */ L_tmp = syn_kern( Mpy_32_32( a0, *x++ ), a, mem ); - L_tmp = L_shl_o( L_tmp, q, &Overflow ); + L_tmp = L_shl_sat( L_tmp, q ); *y++ = L_tmp; move32(); @@ -507,7 +512,7 @@ void E_UTIL_synthesis_fx( const Word16 shift, const Word32 a[], const Word32 x[] { L_tmp = Msub_32_32_r( L_tmp, a[j], mem[i - j] ); } - L_tmp = L_shl_o( L_tmp, q, &Overflow ); + L_tmp = L_shl_sat( L_tmp, q ); *y++ = L_tmp; move32(); } @@ -516,7 +521,7 @@ void E_UTIL_synthesis_fx( const Word16 shift, const Word32 a[], const Word32 x[] FOR( ; i < lg; i++ ) { L_tmp = syn_kern( Mpy_32_32( a0, *x++ ), a, y ); - L_tmp = L_shl_o( L_tmp, q, &Overflow ); + L_tmp = L_shl_sat( L_tmp, q ); *y++ = L_tmp; move32(); } diff --git a/lib_com/tcq_position_arith_fx.c b/lib_com/tcq_position_arith_fx.c index 0466dc133ffdcfacc31ed63696c9eda864027398..f74aea076c12bb762ec5a364a63e4d852ef22e07 100644 --- a/lib_com/tcq_position_arith_fx.c +++ b/lib_com/tcq_position_arith_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -1983,11 +1983,7 @@ Word32 encode_magnitude_tcq_fx( move16(); bits_fx = L_deposit_l( 0 ); -#ifdef IVAS_ISSUE_1188_EVS_CRASH tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - ( nzpos - 1 )] ) ); -#else - tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - nzpos - 1] ) ); -#endif *est_frame_bits_fx = L_add( *est_frame_bits_fx, tcq_bits_fx ); move32(); @@ -2470,11 +2466,7 @@ void decode_mangitude_tcq_fx( move16(); bits_fx = L_deposit_l( 0 ); -#ifdef IVAS_ISSUE_1188_EVS_CRASH tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - ( nzpos - 1 )] ) ); -#else - tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - nzpos - 1] ) ); -#endif IF( EQ_16( nzpos, npulses ) ) { diff --git a/lib_com/tcx_ltp_fx.c b/lib_com/tcx_ltp_fx.c index 322549a6f0841e9d147075092d263ad85526b9da..4eb334205f5230fce05a392f84970bacb68586f5 100644 --- a/lib_com/tcx_ltp_fx.c +++ b/lib_com/tcx_ltp_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" @@ -375,6 +375,8 @@ static void tcx_ltp_get_zir_fx( move32(); alpha = sub( alpha, step ); } + + return; } void predict_signal( @@ -389,10 +391,7 @@ void predict_signal( Word16 j; Word32 s; const Word16 *x0, *win; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + x0 = &excI[-T0 - 1]; frac = negate( frac ); @@ -408,14 +407,16 @@ void predict_signal( FOR( j = 0; j < L_subfr; j++ ) { - s = L_mult_o( win[0], x0[0], &Overflow ); /* Qx + 16 */ - s = L_mac_o( s, win[1], x0[1], &Overflow ); /* Qx + 16 */ - s = L_mac_o( s, win[2], x0[2], &Overflow ); /* Qx + 16 */ - excO[j] = mac_ro( s, win[3], x0[3], &Overflow ); /* Qx + 16 */ + s = L_mult_sat( win[0], x0[0] ); /* Qx + 16 */ + s = L_mac_sat( s, win[1], x0[1] ); /* Qx + 16 */ + s = L_mac_sat( s, win[2], x0[2] ); /* Qx + 16 */ + excO[j] = mac_r_sat( s, win[3], x0[3] ); /* Qx + 16 */ move16(); x0++; } + + return; } static void tcx_ltp_synth_filter( @@ -427,7 +428,7 @@ static void tcx_ltp_synth_filter( Word16 gain, /* Q15 */ Word16 pitch_res, /* Q0 */ Word16 *zir, /* can be NULL */ - Word16 fade, /* 0=normal, +1=fade-in, -1=fade-out Q0*/ + Word16 fade, /* 0=normal, +1=fade-in, -1=fade-out Q0*/ Word16 filtIdx /* Q0 */ ) { @@ -483,55 +484,163 @@ static void tcx_ltp_synth_filter( step = negate( step ); } - FOR( j = 0; j < length; j++ ) + IF( zir != NULL ) { - s = L_deposit_l( 0 ); - s2 = L_deposit_l( 0 ); - k = 0; - move16(); - FOR( i = 0; i < L; i++ ) + IF( fade != 0 ) { - s = L_mac_sat( L_mac_sat( s, w0[k], x0[i] ), w1[k], x1[-i] ); /* Qx */ - s2 = L_mac_sat( L_mac_sat( s2, v0[k], y0[i] ), v1[k], y1[-i] ); /* Qx */ - k = k + pitch_res; + FOR( j = 0; j < length; j++ ) + { + s = L_deposit_l( 0 ); + s2 = L_deposit_l( 0 ); + k = 0; + move16(); + FOR( i = 0; i < L; i++ ) + { + s = L_mac_sat( L_mac_sat( s, w0[k], x0[i] ), w1[k], x1[-i] ); /* Qx */ + s2 = L_mac_sat( L_mac_sat( s2, v0[k], y0[i] ), v1[k], y1[-i] ); /* Qx */ + k = k + pitch_res; + } + + /* s2 *= ALPHA; + normal: synth_ltp[j] = synth[j] - gain * s2 + gain * s; + zir: synth_ltp[j] = synth[j] - gain * s2 + gain * s - zir[j]; + fade-in/out: synth_ltp[j] = synth[j] - alpha * gain * s2 + alpha * gain * s; */ + i = sub_sat( round_fx_sat( s ), mult_r_sat( round_fx_sat( s2 ), ALPHA ) ); /* Qx */ + k = mult_r( gain, i ); /* Qx */ + k = mult_r( k, alpha ); /* Qx */ + k = add_sat( synth[j], k ); /* Qx */ + k = sub_sat( k, zir[j] ); /* Qx */ + + synth_ltp[j] = k; /* Qx */ + move16(); + + BASOP_SATURATE_WARNING_OFF_EVS; + alpha = add_sat( alpha, step ); + BASOP_SATURATE_WARNING_ON_EVS; + + x0++; + x1++; + y0++; + y1++; + } } - - /* s2 *= ALPHA; - normal: synth_ltp[j] = synth[j] - gain * s2 + gain * s; - zir: synth_ltp[j] = synth[j] - gain * s2 + gain * s - zir[j]; - fade-in/out: synth_ltp[j] = synth[j] - alpha * gain * s2 + alpha * gain * s; */ - i = sub_sat( round_fx_sat( s ), mult_r_sat( round_fx_sat( s2 ), ALPHA ) ); /* Qx */ - k = mult_r( gain, i ); /* Qx */ - if ( fade != 0 ) - k = mult_r( k, alpha ); /* Qx */ - k = add_sat( synth[j], k ); /* Qx */ - if ( zir != NULL ) + ELSE { - k = sub_sat( k, zir[j] ); /* Qx */ + FOR( j = 0; j < length; j++ ) + { + s = L_deposit_l( 0 ); + s2 = L_deposit_l( 0 ); + k = 0; + move16(); + FOR( i = 0; i < L; i++ ) + { + s = L_mac_sat( L_mac_sat( s, w0[k], x0[i] ), w1[k], x1[-i] ); /* Qx */ + s2 = L_mac_sat( L_mac_sat( s2, v0[k], y0[i] ), v1[k], y1[-i] ); /* Qx */ + k = k + pitch_res; + } + + /* s2 *= ALPHA; + normal: synth_ltp[j] = synth[j] - gain * s2 + gain * s; + zir: synth_ltp[j] = synth[j] - gain * s2 + gain * s - zir[j]; + fade-in/out: synth_ltp[j] = synth[j] - alpha * gain * s2 + alpha * gain * s; */ + i = sub_sat( round_fx_sat( s ), mult_r_sat( round_fx_sat( s2 ), ALPHA ) ); /* Qx */ + k = mult_r( gain, i ); /* Qx */ + k = add_sat( synth[j], k ); /* Qx */ + k = sub_sat( k, zir[j] ); /* Qx */ + + synth_ltp[j] = k; /* Qx */ + move16(); + + x0++; + x1++; + y0++; + y1++; + } } - - synth_ltp[j] = k; /* Qx */ - move16(); - - BASOP_SATURATE_WARNING_OFF_EVS; - if ( fade != 0 ) + } + ELSE + { + IF( fade != 0 ) { - alpha = add_sat( alpha, step ); + FOR( j = 0; j < length; j++ ) + { + s = L_deposit_l( 0 ); + s2 = L_deposit_l( 0 ); + k = 0; + move16(); + FOR( i = 0; i < L; i++ ) + { + s = L_mac_sat( L_mac_sat( s, w0[k], x0[i] ), w1[k], x1[-i] ); /* Qx */ + s2 = L_mac_sat( L_mac_sat( s2, v0[k], y0[i] ), v1[k], y1[-i] ); /* Qx */ + k = k + pitch_res; + } + + /* s2 *= ALPHA; + normal: synth_ltp[j] = synth[j] - gain * s2 + gain * s; + zir: synth_ltp[j] = synth[j] - gain * s2 + gain * s - zir[j]; + fade-in/out: synth_ltp[j] = synth[j] - alpha * gain * s2 + alpha * gain * s; */ + i = sub_sat( round_fx_sat( s ), mult_r_sat( round_fx_sat( s2 ), ALPHA ) ); /* Qx */ + k = mult_r( gain, i ); /* Qx */ + k = mult_r( k, alpha ); + k = add_sat( synth[j], k ); /* Qx */ + + synth_ltp[j] = k; /* Qx */ + move16(); + + BASOP_SATURATE_WARNING_OFF_EVS; + alpha = add_sat( alpha, step ); + BASOP_SATURATE_WARNING_ON_EVS; + + x0++; + x1++; + y0++; + y1++; + } + } + ELSE + { + FOR( j = 0; j < length; j++ ) + { + s = L_deposit_l( 0 ); + s2 = L_deposit_l( 0 ); + k = 0; + move16(); + FOR( i = 0; i < L; i++ ) + { + s = L_mac_sat( L_mac_sat( s, w0[k], x0[i] ), w1[k], x1[-i] ); /* Qx */ + s2 = L_mac_sat( L_mac_sat( s2, v0[k], y0[i] ), v1[k], y1[-i] ); /* Qx */ + k = k + pitch_res; + } + + /* s2 *= ALPHA; + normal: synth_ltp[j] = synth[j] - gain * s2 + gain * s; + zir: synth_ltp[j] = synth[j] - gain * s2 + gain * s - zir[j]; + fade-in/out: synth_ltp[j] = synth[j] - alpha * gain * s2 + alpha * gain * s; */ + i = sub_sat( round_fx_sat( s ), mult_r_sat( round_fx_sat( s2 ), ALPHA ) ); /* Qx */ + k = mult_r( gain, i ); /* Qx */ + k = add_sat( synth[j], k ); /* Qx */ + + synth_ltp[j] = k; /* Qx */ + move16(); + + + x0++; + x1++; + y0++; + y1++; + } } - BASOP_SATURATE_WARNING_ON_EVS; - - x0++; - x1++; - y0++; - y1++; } } ELSE { Copy( synth, synth_ltp, length ); /* Qx */ } + + return; } + static void tcx_ltp_synth_filter32( Word32 *synth_ltp, /* Qx */ Word32 *synth, /* Qx */ @@ -540,8 +649,8 @@ static void tcx_ltp_synth_filter32( Word16 pitch_fr, /* Q0 */ Word16 gain, /* Q15 */ Word16 pitch_res, /* Q0 */ - Word32 *zir, /* can be NULL Qx*/ - Word16 fade, /* 0=normal, +1=fade-in, -1=fade-out Q0*/ + Word32 *zir, /* can be NULL Qx*/ + Word16 fade, /* 0=normal, +1=fade-in, -1=fade-out Q0*/ Word16 filtIdx /* Q0 */ ) { @@ -570,7 +679,6 @@ static void tcx_ltp_synth_filter32( L = tcxLtpFilters[filtIdx].length; /* Q0 */ move16(); - alpha = 0; move16(); IF( fade != 0 ) @@ -594,58 +702,167 @@ static void tcx_ltp_synth_filter32( } if ( fade < 0 ) + { step = negate( step ); + } } - FOR( j = 0; j < length; j++ ) + IF( fade != 0 ) { - s = L_deposit_l( 0 ); - s2 = L_deposit_l( 0 ); - k = 0; - move16(); - FOR( i = 0; i < L; i++ ) + IF( zir != NULL ) { - s = Madd_32_16_r( Madd_32_16_r( s, x0[i], w0[k] ), x1[-i], w1[k] ); /* Qx */ - s2 = Madd_32_16_r( Madd_32_16_r( s2, y0[i], v0[k] ), y1[-i], v1[k] ); /* Qx */ - k = k + pitch_res; + FOR( j = 0; j < length; j++ ) + { + s = L_deposit_l( 0 ); + s2 = L_deposit_l( 0 ); + k = 0; + move16(); + FOR( i = 0; i < L; i++ ) + { + s = Madd_32_16_r( Madd_32_16_r( s, x0[i], w0[k] ), x1[-i], w1[k] ); /* Qx */ + s2 = Madd_32_16_r( Madd_32_16_r( s2, y0[i], v0[k] ), y1[-i], v1[k] ); /* Qx */ + k = k + pitch_res; + } + + /* s2 *= ALPHA; + normal: synth_ltp[j] = synth[j] - gain * s2 + gain * s; + zir: synth_ltp[j] = synth[j] - gain * s2 + gain * s - zir[j]; + fade-in/out: synth_ltp[j] = synth[j] - alpha * gain * s2 + alpha * gain * s; */ + L_tmp = L_sub_sat( s, Mpy_32_16_r( s2, ALPHA ) ); /* Qx */ + L_tmp2 = Mpy_32_16_r( L_tmp, gain ); /* Qx */ + L_tmp2 = Mpy_32_16_r( L_tmp2, alpha ); /* Qx */ + L_tmp2 = L_sub_sat( L_tmp2, zir[j] ); /* Qx */ + L_tmp2 = L_add_sat( synth[j], L_tmp2 ); /* Qx */ + + synth_ltp[j] = L_tmp2; /* Qx */ + move16(); + + BASOP_SATURATE_WARNING_OFF_EVS; + alpha = add_sat( alpha, step ); + BASOP_SATURATE_WARNING_ON_EVS; + + x0++; + x1++; + y0++; + y1++; + } } - - /* s2 *= ALPHA; - normal: synth_ltp[j] = synth[j] - gain * s2 + gain * s; - zir: synth_ltp[j] = synth[j] - gain * s2 + gain * s - zir[j]; - fade-in/out: synth_ltp[j] = synth[j] - alpha * gain * s2 + alpha * gain * s; */ - L_tmp = L_sub_sat( s, Mpy_32_16_r( s2, ALPHA ) ); /* Qx */ - L_tmp2 = Mpy_32_16_r( L_tmp, gain ); /* Qx */ - IF( fade != 0 ) - L_tmp2 = Mpy_32_16_r( L_tmp2, alpha ); /* Qx */ - L_tmp2 = L_add_sat( synth[j], L_tmp2 ); /* Qx */ - if ( zir != NULL ) + ELSE { - L_tmp2 = L_sub_sat( L_tmp2, zir[j] ); /* Qx */ + FOR( j = 0; j < length; j++ ) + { + s = L_deposit_l( 0 ); + s2 = L_deposit_l( 0 ); + k = 0; + move16(); + FOR( i = 0; i < L; i++ ) + { + s = Madd_32_16_r( Madd_32_16_r( s, x0[i], w0[k] ), x1[-i], w1[k] ); /* Qx */ + s2 = Madd_32_16_r( Madd_32_16_r( s2, y0[i], v0[k] ), y1[-i], v1[k] ); /* Qx */ + k = k + pitch_res; + } + + /* s2 *= ALPHA; + normal: synth_ltp[j] = synth[j] - gain * s2 + gain * s; + zir: synth_ltp[j] = synth[j] - gain * s2 + gain * s - zir[j]; + fade-in/out: synth_ltp[j] = synth[j] - alpha * gain * s2 + alpha * gain * s; */ + L_tmp = L_sub_sat( s, Mpy_32_16_r( s2, ALPHA ) ); /* Qx */ + L_tmp2 = Mpy_32_16_r( L_tmp, gain ); /* Qx */ + L_tmp2 = Mpy_32_16_r( L_tmp2, alpha ); /* Qx */ + L_tmp2 = L_add_sat( synth[j], L_tmp2 ); /* Qx */ + + synth_ltp[j] = L_tmp2; /* Qx */ + move16(); + + BASOP_SATURATE_WARNING_OFF_EVS; + alpha = add_sat( alpha, step ); + BASOP_SATURATE_WARNING_ON_EVS; + + x0++; + x1++; + y0++; + y1++; + } } - - synth_ltp[j] = L_tmp2; /* Qx */ - move16(); - - BASOP_SATURATE_WARNING_OFF_EVS; - if ( fade != 0 ) + } + ELSE + { + IF( zir != NULL ) { - alpha = add_sat( alpha, step ); + FOR( j = 0; j < length; j++ ) + { + s = L_deposit_l( 0 ); + s2 = L_deposit_l( 0 ); + k = 0; + move16(); + FOR( i = 0; i < L; i++ ) + { + s = Madd_32_16_r( Madd_32_16_r( s, x0[i], w0[k] ), x1[-i], w1[k] ); /* Qx */ + s2 = Madd_32_16_r( Madd_32_16_r( s2, y0[i], v0[k] ), y1[-i], v1[k] ); /* Qx */ + k = k + pitch_res; + } + + /* s2 *= ALPHA; + normal: synth_ltp[j] = synth[j] - gain * s2 + gain * s; + zir: synth_ltp[j] = synth[j] - gain * s2 + gain * s - zir[j]; + fade-in/out: synth_ltp[j] = synth[j] - alpha * gain * s2 + alpha * gain * s; */ + L_tmp = L_sub_sat( s, Mpy_32_16_r( s2, ALPHA ) ); /* Qx */ + L_tmp2 = Mpy_32_16_r( L_tmp, gain ); /* Qx */ + L_tmp2 = L_sub_sat( L_tmp2, zir[j] ); /* Qx */ + L_tmp2 = L_add_sat( synth[j], L_tmp2 ); /* Qx */ + + synth_ltp[j] = L_tmp2; /* Qx */ + move16(); + + x0++; + x1++; + y0++; + y1++; + } + } + ELSE + { + FOR( j = 0; j < length; j++ ) + { + s = L_deposit_l( 0 ); + s2 = L_deposit_l( 0 ); + k = 0; + move16(); + FOR( i = 0; i < L; i++ ) + { + s = Madd_32_16_r( Madd_32_16_r( s, x0[i], w0[k] ), x1[-i], w1[k] ); /* Qx */ + s2 = Madd_32_16_r( Madd_32_16_r( s2, y0[i], v0[k] ), y1[-i], v1[k] ); /* Qx */ + k = k + pitch_res; + } + + /* s2 *= ALPHA; + normal: synth_ltp[j] = synth[j] - gain * s2 + gain * s; + zir: synth_ltp[j] = synth[j] - gain * s2 + gain * s - zir[j]; + fade-in/out: synth_ltp[j] = synth[j] - alpha * gain * s2 + alpha * gain * s; */ + L_tmp = L_sub_sat( s, Mpy_32_16_r( s2, ALPHA ) ); /* Qx */ + L_tmp2 = Mpy_32_16_r( L_tmp, gain ); /* Qx */ + L_tmp2 = L_add_sat( synth[j], L_tmp2 ); /* Qx */ + + synth_ltp[j] = L_tmp2; /* Qx */ + move16(); + + x0++; + x1++; + y0++; + y1++; + } } - BASOP_SATURATE_WARNING_ON_EVS; - - x0++; - x1++; - y0++; - y1++; } } ELSE { Copy32( synth, synth_ltp, length ); /* Qx */ } + + return; } + static void tcx_ltp_synth_filter_10( Word16 *out, /* Qx */ Word16 *in, /* Qx */ diff --git a/lib_com/tcx_mdct_fx.c b/lib_com/tcx_mdct_fx.c index 1fc57871d4b4a6ab7096c28bc6dda728ee5cbd39..4fd016729f51dde64c070c963f22a3d129a4e74f 100644 --- a/lib_com/tcx_mdct_fx.c +++ b/lib_com/tcx_mdct_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -106,20 +106,14 @@ void TCX_MDCT( Word16 i; Word16 factor, neg_factor; Word16 factor_e; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) element_mode; -#endif -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + factor = TCX_MDCT_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &factor_e ); *y_e = add( *y_e, factor_e ); move16(); neg_factor = negate( factor ); - /* Init */ FOR( i = 0; i < m / 2; i++ ) { @@ -128,7 +122,7 @@ void TCX_MDCT( } FOR( i = 0; i < l / 2; i++ ) { - y[m / 2 + r / 2 + m / 2 + i] = L_msu_o( L_mult( x[i], factor ), x[l - 1 - i], factor, &Overflow ); /* exp(y_e) */ + y[m / 2 + r / 2 + m / 2 + i] = L_msu_sat( L_mult( x[i], factor ), x[l - 1 - i], factor ); /* exp(y_e) */ move32(); } FOR( i = 0; i < m / 2; i++ ) @@ -138,7 +132,7 @@ void TCX_MDCT( } FOR( i = 0; i < r / 2; i++ ) { - y[m / 2 + r / 2 - 1 - m / 2 - i] = L_mac_o( L_mult( x[l + m + i], neg_factor ), x[l + m + r - 1 - i], neg_factor, &Overflow ); /* exp(y_e) */ + y[m / 2 + r / 2 - 1 - m / 2 - i] = L_mac_sat( L_mult( x[l + m + i], neg_factor ), x[l + m + r - 1 - i], neg_factor ); /* exp(y_e) */ move32(); } @@ -164,13 +158,8 @@ void TCX_MDST( Word16 i; Word16 factor, neg_factor; Word16 factor_e; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) element_mode; -#endif -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + factor = TCX_MDCT_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &factor_e ); /* exp(factor_e) */ *y_e = add( *y_e, factor_e ); move16(); @@ -186,7 +175,7 @@ void TCX_MDST( } FOR( i = 0; i < l / 2; i++ ) { - y[m / 2 + r / 2 + m / 2 + i] = L_msu_o( L_mult( x[i], neg_factor ), x[l - 1 - i], factor, &Overflow ); /* exp(y_e) */ + y[m / 2 + r / 2 + m / 2 + i] = L_msu_sat( L_mult( x[i], neg_factor ), x[l - 1 - i], factor ); /* exp(y_e) */ move32(); } FOR( i = 0; i < m / 2; i++ ) @@ -226,9 +215,7 @@ void TCX_MDCT_Inverse( Word16 L2 = l, R2 = r; Word32 tmp_buf[N_MAX + L_MDCT_OVLP_MAX / 2]; Word16 fac_e; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) element_mode; -#endif L2 = shr( l, 1 ); R2 = shr( r, 1 ); @@ -246,14 +233,14 @@ void TCX_MDCT_Inverse( FOR( i = 0; i < R2; i++ ) { - y[l + m + R2 + i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); /* fold out right end of DCT exp(fac_e)*/ + y[l + m + R2 + i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); /* fold out right end of DCT exp(fac_e)*/ move16(); } FOR( i = 0; i < L2; i++ ) { - y[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], fac ), s ) ); /* negate, fold out left end of DCT exp(fac_e)*/ + y[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], fac ), s ) ); /* negate, fold out left end of DCT exp(fac_e)*/ move16(); } @@ -262,7 +249,7 @@ void TCX_MDCT_Inverse( Word16 f; f = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); - y[L2 + i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT exp(fac_e)*/ + y[L2 + i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT exp(fac_e)*/ move16(); y[l + m + R2 - 1 - i] = f; move16(); @@ -303,13 +290,13 @@ void TCX_MDST_Inverse_fx( FOR( i = 0; i < R2; i++ ) { - y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], fac ), s ) ); /* fold out right end of DCT exp(fac_e)*/ + y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], fac ), s ) ); /* fold out right end of DCT exp(fac_e)*/ move16(); } FOR( i = 0; i < L2; i++ ) { - y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], negfac ), s ) ); /* negate, fold out left end of DCT exp(fac_e)*/ + y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], negfac ), s ) ); /* negate, fold out left end of DCT exp(fac_e)*/ move16(); } @@ -380,12 +367,12 @@ void TCX_MDXT_Inverse_fx( FOR( i = 0; i < L2; i++ ) { - y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], signLeft ), s ) ); /* fold out the left end exp(fac_e)*/ + y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], signLeft ), s ) ); /* fold out the left end exp(fac_e)*/ } FOR( i = 0; i < R2; i++ ) { - y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], signRight ), s ) ); /* ...and right end exp(fac_e)*/ + y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], signRight ), s ) ); /* ...and right end exp(fac_e)*/ move16(); } @@ -394,7 +381,7 @@ void TCX_MDXT_Inverse_fx( f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); - y[L2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT exp(fac_e)*/ + y[L2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT exp(fac_e)*/ move16(); y[l + m + R2 - 1 - i] = f; diff --git a/lib_com/tcx_mdct_window.c b/lib_com/tcx_mdct_window_fx.c similarity index 88% rename from lib_com/tcx_mdct_window.c rename to lib_com/tcx_mdct_window_fx.c index 44ce806f73305390709b042c43728ab19ae3aab0..942eb15fabd5de8f0445e030f008693663ab6b77 100644 --- a/lib_com/tcx_mdct_window.c +++ b/lib_com/tcx_mdct_window_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -66,7 +66,6 @@ void mdct_window_sine_IVAS_updated( window[i].v.im = table[i].v.im; /* Qx */ move16(); } - // PMT("getSineWindowTable needs to be updated for IVAS") } ELSE { @@ -123,9 +122,6 @@ void mdct_window_sine( Word16 n /* Q0 */ ) { -#ifdef IVAS_CODE - if ( element_mode == EVS_MONO ) -#endif { const PWord16 *table; table = getSineWindowTable( n ); @@ -136,44 +132,7 @@ void mdct_window_sine( window[i].v.im = table[i].v.im; /* Qx */ move16(); } - // PMT("getSineWindowTable needs to be updated for IVAS") } -#ifdef IVAS_CODE - else - { - const float *window_table = 0; - Word16 buf_in_size = 0; - switch ( window_type ) - { - case FULL_OVERLAP: - window_table = tcx_mdct_window_48; - buf_in_size = 420; - break; - case HALF_OVERLAP: - window_table = tcx_mdct_window_half_48; - buf_in_size = 180; - break; - case TRANSITION_OVERLAP: - case MIN_OVERLAP: - window_table = tcx_mdct_window_trans_48; - buf_in_size = 60; - break; - - default: - assert( 0 && "Unsupported window type" ); - break; - } - - if ( Fs == 48000 ) - { - mvr2r( window_table, window, n ); - } - else - { - lerp( window_table, window, n, buf_in_size ); - } - } -#endif } diff --git a/lib_com/tcx_utils_fx.c b/lib_com/tcx_utils_fx.c index c5ff95e04e68c7904a93ddc7444440333131cded..f73fb5971b38de11530493d3bdd92d6df7fdd6ea 100644 --- a/lib_com/tcx_utils_fx.c +++ b/lib_com/tcx_utils_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -681,10 +681,6 @@ void lpc2mdct( const PWord16 *ptwiddle; Word32 workBuffer[2 * BASOP_CFFT_MAX_LENGTH]; -#ifndef IVAS_CODE_TCX_UTIL - (void) noInverse; -#endif - assert( length <= FDNS_NPTS ); sizeN = shl( length, 1 ); /*Q0*/ @@ -709,28 +705,17 @@ void lpc2mdct( move32(); } - move16(); -#ifdef IVAS_CODE_TCX_UTIL if ( noInverse ) { - /* half length FFT */ - scale = add( norm_s( lpcCoeffs[0] ), 1 ); - BASOP_cfft( (cmplx *) ComplexData, FDNS_NPTS, &scale, workBuffer ); // tbv -> In float the fft type changes as well - /*Get amplitude*/ - j = sub( length, 1 ); - k = 0; - for ( i = 0; i < length; i++ ) - { - mdct_gains[i] = (float) ( sqrt( RealData[i] * RealData[i] + ImagData[i] * ImagData[i] ) ); - } + assert( !"not supported option in lpc2mdct()" ); } else -#endif { /* half length FFT */ scale = add( norm_s( lpcCoeffs[0] ), 1 ); BASOP_cfft( (cmplx *) ComplexData, FDNS_NPTS, &scale, workBuffer ); /*Q31 - scale*/ - /*Get amplitude*/ + + /* Get amplitude */ j = sub( length, 1 ); k = 0; FOR( i = 0; i < length / 2; i++ ) @@ -991,9 +976,6 @@ void mdct_shaping( Word32 *px = x; /*Qx*/ Word16 const *pgains = gains; Word16 const *pgainsexp = gains_exp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /* FDNS_NPTS = 64 */ k = shr( lg, 6 ); /*Q0*/ @@ -1044,7 +1026,7 @@ void mdct_shaping( FOR( l = 0; l < k; l++ ) { - *x = L_shl_o( Mpy_32_16_r( *x, *gains ), *gains_exp, &Overflow ); /*Qx*/ + *x = L_shl_sat( Mpy_32_16_r( *x, *gains ), *gains_exp ); /*Qx*/ move32(); x++; } @@ -1063,7 +1045,7 @@ void mdct_shaping( gains_exp = pgainsexp; FOR( i = 0; i < FDNS_NPTS; i++ ) { - *x = L_shl_o( Mpy_32_16_r( *x, *gains ), *gains_exp, &Overflow ); /*Qx*/ + *x = L_shl_sat( Mpy_32_16_r( *x, *gains ), *gains_exp ); /*Qx*/ move32(); x += k; gains++; @@ -1389,10 +1371,6 @@ void PsychAdaptLowFreqDeemph( Word16 i; Word16 max_val, max_e, fac, min, min_e, tmp, tmp_e; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - assert( lpcGains[0] >= 0x4000 ); @@ -1433,13 +1411,13 @@ void PsychAdaptLowFreqDeemph( /* fac = tmp = (float)pow(max_val / min, 0.0078125f); */ tmp_e = min_e; move16(); - tmp = Inv16( min, &tmp_e ); /*Q15 - tmp_e*/ - L_tmp = L_shl( L_mult( tmp, max_val ), add( tmp_e, max_e ) ); /* Q31 */ - L_tmp = BASOP_Util_Log2( L_tmp ); /* Q25 */ - L_tmp = L_shr( L_tmp, 7 ); /* 0.0078125f = 1.f/(1<<7) */ - L_tmp = BASOP_Util_InvLog2( L_tmp ); /* Q31 */ - tmp = round_fx_o( L_tmp, &Overflow ); /* Q15 */ - fac = tmp; /* Q15 */ + tmp = Inv16( min, &tmp_e ); /*Q15 - tmp_e*/ + L_tmp = L_shl_sat( L_mult_sat( tmp, max_val ), add( tmp_e, max_e ) ); /* Q31 */ + L_tmp = BASOP_Util_Log2( L_tmp ); /* Q25 */ + L_tmp = L_shr( L_tmp, 7 ); /* 0.0078125f = 1.f/(1<<7) */ + L_tmp = BASOP_Util_InvLog2( L_tmp ); /* Q31 */ + tmp = round_fx_sat( L_tmp ); /* Q15 */ + fac = tmp; /* Q15 */ move16(); /* gradual lowering of lowest 32 bins; DC is lowered by (max_val/tmp)^1/4 */ @@ -2029,7 +2007,6 @@ void InitTnsConfigs_ivas_fx( InitTnsConfiguration_ivas_fx( bwidth, add( L_frame, shr( L_frame, 2 ) ), &tnsConfig[1][1], igfStopFreq, total_brate, element_mode, MCT_flag ); } - void SetTnsConfig( TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ const Word16 isTCX20, /*Q0*/ @@ -2039,8 +2016,7 @@ void SetTnsConfig( hTcxCfg->pCurrentTnsConfig = &hTcxCfg->tnsConfig[isTCX20][isAfterACELP]; assert( hTcxCfg->pCurrentTnsConfig != NULL ); } -#define IVAS_CODE_TCX_UTIL -#ifdef IVAS_CODE_TCX_UTIL + /*-------------------------------------------------------------------* * SetAllowTnsOnWhite * @@ -2062,8 +2038,6 @@ void SetAllowTnsOnWhite( move16(); return; } -#endif -#undef IVAS_CODE_TCX_UTIL void tcx_get_gain( Word32 *x, /* i: spectrum 1 Q31 - x_e*/ @@ -2081,9 +2055,6 @@ void tcx_get_gain( Word32 corr, ener; Word16 sx, sy, corr_e, ener_e; Word16 i, tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif maxX = L_deposit_l( 1 ); maxY = L_deposit_l( 1 ); @@ -2129,7 +2100,8 @@ void tcx_get_gain( ener = L_shl( ener, tmp ); /*Q31 - ener_e + tmp*/ ener_e = sub( ener_e, tmp ); - tmp = div_s( abs_s( round_fx_o( corr, &Overflow ) ), round_fx_o( ener, &Overflow ) ); /*Q15 - (corr_e - ener_e)*/ + tmp = div_s( abs_s( round_fx_sat( corr ) ), round_fx_sat( ener ) ); /*Q15 - (corr_e - ener_e)*/ + if ( corr < 0 ) tmp = negate( tmp ); diff --git a/lib_com/tec_com.c b/lib_com/tec_com_fx.c similarity index 99% rename from lib_com/tec_com.c rename to lib_com/tec_com_fx.c index 0a37504df957bc577c8fc9eed3c64c0b4fa17de3..5760b56b38cc56e06b8560d15f9e24ca0d47cb52 100644 --- a/lib_com/tec_com.c +++ b/lib_com/tec_com_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_com/tns_base.c b/lib_com/tns_base.c old mode 100644 new mode 100755 index 101bc1df8b6552407c352786dc2e08dd79ec5ec0..600b2e6fe9b03a725b1673a09f2db93a39e903a7 --- a/lib_com/tns_base.c +++ b/lib_com/tns_base.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -21,7 +21,6 @@ #define HLM_MIN_NRG_FX 32768 /*Q0*/ #define MAX_SUBDIVISIONS 3 - /*---------------------------------------------------------------------------- * Local prototypes *---------------------------------------------------------------------------*/ @@ -96,10 +95,8 @@ void InitTnsConfiguration( Word32 nSampleRate; Word16 s1; Word16 s2; -#ifndef ADD_IVAS_TNS (void) ( element_mode ); (void) ( is_mct ); -#endif nSampleRate = bwMode2fs[bwidth]; move32(); startLineFilter = &pTnsConfig->iFilterBorders[1]; @@ -138,21 +135,6 @@ void InitTnsConfiguration( ELSE IF( GT_32( nSampleRate, INT_FS_16k ) ) { -#ifdef ADD_IVAS_TNS - if ( ( element_mode > IVAS_SCE ) && ( total_brate >= ( is_mct ? IVAS_32k : IVAS_48k ) ) ) - { - pTnsConfig->nMaxFilters = sizeof( tnsParameters32kHz_Stereo ) / sizeof( tnsParameters32kHz_Stereo[0] ); - if ( nSampleRate == 100 * frameLength ) /* sub-frame length is <= 10 ms */ - { - pTnsConfig->pTnsParameters = tnsParameters32kHz_grouped; - } - else - { - pTnsConfig->pTnsParameters = tnsParameters32kHz_Stereo; - } - } - else -#endif { move16(); @@ -192,7 +174,7 @@ void InitTnsConfiguration( FOR( iFilter = 0; iFilter < pTnsConfig->nMaxFilters; iFilter++ ) { - assert( pTnsConfig->pTnsParameters[iFilter].startLineFrequency < 0.5f * nSampleRate ); + assert( pTnsConfig->pTnsParameters[iFilter].startLineFrequency < nSampleRate / 2 ); assert( nSampleRate <= 96000 ); move16(); startLineFilter[iFilter] = divide3232( L_mult0( frameLength, pTnsConfig->pTnsParameters[iFilter].startLineFrequency ), L_shl( nSampleRate, 14 ) ); @@ -212,9 +194,6 @@ void InitTnsConfiguration( move16(); pTnsConfig->iFilterBorders[0] = frameLength; } -#ifdef ADD_IVAS_TNS - pTnsConfig->allowTnsOnWhite = 0; -#endif return; /*TNS_NO_ERROR;*/ } @@ -459,11 +438,6 @@ Word16 ITF_Detect_fx( Word32 L_tmp, tmp32; Word16 tmpbuf[325]; Word16 n, i; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - move16(); move16(); move16(); @@ -495,7 +469,7 @@ Word16 ITF_Detect_fx( /* Check threshold HLM_MIN_NRG */ BASOP_SATURATE_WARNING_OFF_EVS; - tmp32 = L_sub( L_shl_o( L_tmp, sub( shift, sub( 24, Q ) ), &Overflow ), 4194304l /*HLM_MIN_NRG Q7*/ ); /*Q7*/ + tmp32 = L_sub( L_shl_sat( L_tmp, sub( shift, sub( 24, Q ) ) ), 4194304l /*HLM_MIN_NRG Q7*/ ); /*Q7*/ BASOP_SATURATE_WARNING_ON_EVS; /* get pre-shift for autocorrelation */ @@ -666,8 +640,7 @@ Word16 ITF_Detect_ivas_fx( { sum = W_mac_32_32( sum, temp_spectrum[i], temp_spectrum[i] ); // 2(Q+shift)+1 } - - IF( LE_64( sum, W_shl( 32768 * 2 /* HLM_MIN_NRG in Q1 */, shl( add( Q, shift ), 1 ) ) ) ) + IF( LE_64( sum, W_shl( 32768 * 2 /* HLM_MIN_NRG in Q1 */, s_min( 63, shl( add( Q, shift ), 1 ) ) ) ) ) { BREAK; } @@ -829,43 +802,19 @@ static Word16 DecodeUsingTable( Decoder_State *st, Word16 *pValue /*Q0*/, const /* TNS filter coefficients */ -int16_t DecodeSWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeSWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); return DecodeUsingTable( st, pValue, codesTnsCoeffSWBTCX20[index], nTnsCoeffCodes ); } -// int16_t GetSWBTCX10TnsFilterCoeffBits_flt( const int16_t value, const int16_t index ) -//{ -// assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); -// return GetBitsFromTable( value, codesTnsCoeffSWBTCX10[index], nTnsCoeffCodes ); -// } - -// int16_t EncodeSWBTCX10TnsFilterCoeff_flt( const int16_t value, const int16_t index ) -//{ -// assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); -// return EncodeUsingTable( value, codesTnsCoeffSWBTCX10[index], nTnsCoeffCodes ); -// } - -int16_t DecodeSWBTCX10TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeSWBTCX10TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); return DecodeUsingTable( st, pValue, codesTnsCoeffSWBTCX10[index], nTnsCoeffCodes ); } -// int16_t GetWBTCX20TnsFilterCoeffBits_flt( const int16_t value, const int16_t index ) -//{ -// assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); -// return GetBitsFromTable( value, codesTnsCoeffWBTCX20[index], nTnsCoeffCodes ); -// } - -// int16_t EncodeWBTCX20TnsFilterCoeff_flt( const int16_t value, const int16_t index ) -//{ -// assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); -// return EncodeUsingTable( value, codesTnsCoeffWBTCX20[index], nTnsCoeffCodes ); -// } - -int16_t DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); return DecodeUsingTable( st, pValue, codesTnsCoeffWBTCX20[index], nTnsCoeffCodes ); @@ -874,49 +823,25 @@ int16_t DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, /* TNS filter order */ -// void const *GetTnsFilterOrder_flt( void const *p, const int16_t index, int16_t *pValue ) -//{ -// *pValue = ( (STnsFilter const *) p )[index].order; -// return ( (STnsFilter const *) p )[index].coefIndex; -// } - -// void *SetTnsFilterOrder_flt( void *p, const int16_t index, const int16_t value ) -//{ -// ( (STnsFilter *) p )[index].order = value; -// return ( (STnsFilter *) p )[index].coefIndex; -// } - -// int16_t GetTnsFilterOrderBitsSWBTCX20_flt( const int16_t value, const int16_t index ) -//{ -// (void) index; -// return GetBitsFromTable( value - 1, codesTnsOrderTCX20, nTnsOrderCodes ); -// } - -// int16_t EncodeTnsFilterOrderSWBTCX20_flt( const int16_t value, const int16_t index ) -//{ -// (void) index; -// return EncodeUsingTable( value - 1, codesTnsOrderTCX20, nTnsOrderCodes ); -// } - -int16_t DecodeTnsFilterOrderSWBTCX20_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeTnsFilterOrderSWBTCX20_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { (void) index; return DecodeUsingTable( st, pValue, codesTnsOrderTCX20, nTnsOrderCodes ); } -int16_t GetTnsFilterOrderBitsSWBTCX10_flt( const int16_t value, const int16_t index ) +Word16 GetTnsFilterOrderBitsSWBTCX10_flt( const Word16 value, const Word16 index ) { (void) index; return GetBitsFromTable( value - 1, codesTnsOrderTCX10, nTnsOrderCodes ); } -int16_t EncodeTnsFilterOrderSWBTCX10_flt( const int16_t value, const int16_t index ) +Word16 EncodeTnsFilterOrderSWBTCX10_flt( const Word16 value, const Word16 index ) { (void) index; return EncodeUsingTable( value - 1, codesTnsOrderTCX10, nTnsOrderCodes ); } -int16_t DecodeTnsFilterOrderSWBTCX10_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeTnsFilterOrderSWBTCX10_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { (void) index; return DecodeUsingTable( st, pValue, codesTnsOrderTCX10, nTnsOrderCodes ); @@ -1125,42 +1050,36 @@ void *SetTnsEnabled( void *p, const Word16 index, const Word16 value ) /* Number of TNS filters */ -void const *GetNumOfTnsFilters_flt( void const *p, const int16_t index, int16_t *pValue ) +void const *GetNumOfTnsFilters_flt( void const *p, const Word16 index, Word16 *pValue ) { - *pValue = (int16_t) abs( ( (STnsData const *) p )[index].nFilters ); + *pValue = (Word16) abs( ( (STnsData const *) p )[index].nFilters ); return ( (STnsData const *) p )[index].filter; } -void *SetNumOfTnsFilters_flt( void *p, const int16_t index, const int16_t value ) +void *SetNumOfTnsFilters_flt( void *p, const Word16 index, const Word16 value ) { - ( (STnsData *) p )[index].nFilters = (int16_t) abs( value ); + ( (STnsData *) p )[index].nFilters = (Word16) abs( value ); return ( (STnsData *) p )[index].filter; } -int16_t DecodeTnsFilterOrder_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeTnsFilterOrder_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { (void) index; return DecodeUsingTable( st, pValue, codesTnsOrder, nTnsOrderCodes ); } /* TNS on whitened spectra flag */ -void const *GetTnsOnWhite( void const *p, const int16_t index, int16_t *pValue ) +void const *GetTnsOnWhite( void const *p, const Word16 index, Word16 *pValue ) { *pValue = ( (STnsData const *) p )[index].tnsOnWhitenedSpectra > 0 ? 1 : 0; return NULL; } -void *SetTnsOnWhite( void *p, const int16_t index, const int16_t value ) +void *SetTnsOnWhite( void *p, const Word16 index, const Word16 value ) { ( (STnsData *) p )[index].tnsOnWhitenedSpectra = value; return NULL; } -// void const *GetTnsEnabledSingleFilter( void const *p, const int16_t index, int16_t *pValue ) -//{ -// *pValue = ( (STnsData const *) p )[index].nFilters != 0 ? 1 : 0; -// return ( (STnsData const *) p )[index].filter; -// } - void const *GetTnsEnabledSingleFilter( void const *p, const Word16 index, Word16 *pValue ) { move16(); @@ -1281,17 +1200,17 @@ static Word32 FIRLattice( move32(); FOR( i = 0; i < order - 1; i++ ) { - tmp = L_add( state[i], Mpy_32_16_1( x, parCoeff[i] ) ); /*Q0*/ - x = L_add( x, Mpy_32_16_1( state[i], parCoeff[i] ) ); /* exponent: 31+0 */ - state[i] = tmpSave; /*Q0*/ + tmp = Madd_32_16( state[i], x, parCoeff[i] ); /*Q0*/ + x = Madd_32_16( x, state[i], parCoeff[i] ); /* exponent: 31+0 */ + state[i] = tmpSave; /*Q0*/ move32(); tmpSave = tmp; /*Q0*/ move32(); } /* last stage: only need half operations */ - x = L_add( x, Mpy_32_16_1( state[order - 1], parCoeff[order - 1] ) ); /*Q0*/ - state[order - 1] = tmpSave; /*Q0*/ + x = Madd_32_16( x, state[order - 1], parCoeff[order - 1] ); /*Q0*/ + state[order - 1] = tmpSave; /*Q0*/ move32(); return x; /*Q0*/ diff --git a/lib_com/tools.c b/lib_com/tools.c deleted file mode 100644 index e4ccd9955ff0ec12a935b289f98e151da54c2be2..0000000000000000000000000000000000000000 --- a/lib_com/tools.c +++ /dev/null @@ -1,1040 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include -#include "prot_fx.h" -#include "wmc_auto.h" - -/*------------------------------------------------------------------* - * own_random() - * - * Random generator - *------------------------------------------------------------------*/ - -/*! r: output random value */ -int16_t own_random( - int16_t *seed /* i/o: random seed */ -) -{ - *seed = (int16_t) ( *seed * 31821L + 13849L ); - - return ( *seed ); -} - -/*--------------------------------------------------------------------- - * sign() - * - *---------------------------------------------------------------------*/ - -/*! r: sign of x (+1/-1) */ -float sign( - const float x /* i : input value of x */ -) -{ - if ( x < 0.0f ) - { - return -1.0f; - } - else - { - return 1.0f; - } -} - -/*--------------------------------------------------------------------- - * log2_f() - * - *---------------------------------------------------------------------*/ - -/*! r: logarithm2 of x */ -float log2_f( - const float x /* i : input value of x */ -) -{ - return (float) ( log( x ) / log( 2.0f ) ); -} - -int16_t norm_ul_float( uint32_t UL_var1 ) -{ - int16_t var_out; - - if ( UL_var1 == 0 ) - { - var_out = 0; - } - else - { - for ( var_out = 0; UL_var1 < (uint32_t) 0x80000000U; var_out++ ) - { - UL_var1 <<= 1; - } - } - BASOP_CHECK(); - - return ( var_out ); -} - - -/*--------------------------------------------------------------------- - * sum_s() - * sum_l() - * sum_f() - * - *---------------------------------------------------------------------*/ - -/*! r: sum of all vector elements */ -int16_t sum_s( - const int16_t *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ -) -{ - int16_t i; - int16_t tmp; - - tmp = 0; - for ( i = 0; i < lvec; i++ ) - { - tmp += vec[i]; - } - - return tmp; -} - -/*! r: sum of all vector elements */ -Word32 sum_l_fx( - const Word32 *vec, /* i : input vector */ - const Word16 lvec /* i : length of input vector */ -) -{ - Word16 i; - Word32 tmpL; - - tmpL = 0; - move32(); - FOR( i = 0; i < lvec; i++ ) - { - tmpL = L_add( tmpL, vec[i] ); - } - - return tmpL; -} - -/*---------------------------------------------------------------------- - * sum2_f() - * - *---------------------------------------------------------------------*/ - -/*! r: sum of all squared vector elements */ -Word32 sum2_f_16_fx( - const Word16 *vec, /* i : input vector */ - const Word16 lvec /* i : length of input vector */ -) -{ - Word16 i; - Word32 tmp; - - tmp = 0; - move32(); - FOR( i = 0; i < lvec; i++ ) - { - tmp = L_add( tmp, L_mult0( vec[i], vec[i] ) ); - } - - return tmp; -} -Word32 sum2_f_16_gb_fx( - const Word16 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word16 gb ) -{ - int16_t i; - Word32 tmp; - - tmp = 0; - FOR( i = 0; i < lvec; i++ ) - { - tmp = L_add( tmp, L_shr( L_mult0( vec[i], vec[i] ), gb ) ); - } - - return tmp; -} - -Word32 sum2_16_exp_fx( - const Word16 *vec, /* i : input vector Q(15 - exp) */ - const Word16 lvec, /* i : length of input vector */ - Word16 *exp, /* i/o: exponent of vector */ - Word16 gb /* i : guard bits */ -) -{ - Word16 i, s; - Word32 L_tmp, var_a; - - L_tmp = 0; - move32(); - var_a = 0; - move32(); - FOR( i = 0; i < lvec; i++ ) - { - var_a = L_mult0( vec[i], vec[i] ); /* 2 * Q(15 - exp) */ - L_tmp = L_add( L_tmp, L_shr( var_a, gb ) ); /* 2 * Q(15 - exp) - gb */ - } - - s = norm_l( L_tmp ); - L_tmp = L_shl( L_tmp, s ); /* 2 * Q(15 - exp) - gb + s */ - - *exp = add( sub( add( shl( *exp, 1 ), gb ), s ), 1 ); - move16(); - - return L_tmp; -} - -Word32 sum2_32_exp_fx( - const Word32 *vec, /* i : input vector, Qx */ - const Word16 lvec, /* i : length of input vector */ - Word16 *exp, /* i/o: exponent of vector */ - Word16 gb /* i : guard bits */ -) -{ - Word16 i, s, norm; - Word64 W_tmp; - - W_tmp = 0; - Word64 var_a = 0; - move64(); - move64(); - - norm = L_norm_arr( vec, lvec ); - - gb = sub( gb, norm ); - - FOR( i = 0; i < lvec; i++ ) - { - var_a = W_mult0_32_32( vec[i], vec[i] ); // 2x - W_tmp = W_add( W_tmp, W_shr( var_a, gb ) ); // 2x-gb - } - - s = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, s ); // 2x - gb + s - - //*exp = 31 - (2*(31 - *exp) - gb + s) + 32; - *exp = add( sub( add( shl( *exp, 1 ), gb ), s ), 1 ); - move16(); - - return W_extract_h( W_tmp ); -} - -Word32 sum2_f_32_fx( /* o : Q(2x - 31 - gb) */ - const Word32 *vec, /* i : input vector, Qx */ - const Word16 lvec, /* i : length of input vector */ - Word16 gb /* i : guard bits */ -) -{ - Word16 i; - Word32 tmp; - - tmp = 0; - Word32 var_a = 0; - move32(); - move32(); - FOR( i = 0; i < lvec; i++ ) - { - var_a = Mpy_32_32( vec[i], vec[i] ); // 2x-31 - tmp = L_add( tmp, L_shr( var_a, gb ) ); // 2x-31-gb - } - - return tmp; -} - -Word32 sum2_32_fx( - const Word32 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word16 *e ) -{ - Word16 i; - Word32 tmp; - - tmp = 0; - Word32 var_a = 0; - Word16 exp = 0, exp_tmp; - move32(); - move32(); - move16(); - FOR( i = 0; i < lvec; i++ ) - { - exp_tmp = norm_l( vec[i] ); - var_a = L_shl( vec[i], exp_tmp ); - var_a = Mpy_32_32( var_a, var_a ); - exp_tmp = shl( sub( *e, exp_tmp ), 1 ); - tmp = BASOP_Util_Add_Mant32Exp( tmp, exp, var_a, exp_tmp, &exp ); - } - *e = exp; - move16(); - - return tmp; -} - -/*-------------------------------------------------------------------* - * set_c() - * set_s() - * set_f() - * set_l() - * set_d() - * - * Set the vector elements to a value - *-------------------------------------------------------------------*/ - -void set_c( - int8_t y[], /* i/o: Vector to set */ - const int8_t a, /* i : Value to set the vector to */ - const int32_t N /* i : Length of the vector */ -) -{ - int16_t i; - - for ( i = 0; i < N; i++ ) - { - y[i] = a; - } - - return; -} - - -void set_s( - int16_t y[], /* i/o: Vector to set */ - const int16_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Length of the vector */ -) -{ - int16_t i; - - for ( i = 0; i < N; i++ ) - { - y[i] = a; - } - - return; -} - - -void set_l( - int32_t y[], /* i/o: Vector to set */ - const int32_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Length of the vector */ -) -{ - int16_t i; - - for ( i = 0; i < N; i++ ) - { - y[i] = a; - } - - return; -} - -void set_f( - float y[], /* i/o: Vector to set */ - const float a, /* i : Value to set the vector to */ - const int16_t N /* i : Lenght of the vector */ -) -{ - int16_t i; - - for ( i = 0; i < N; i++ ) - { - y[i] = a; - } - - return; -} - -/*---------------------------------------------------------------------* - * set_zero() - * - * Set a vector vec[] of dimension lvec to zero - *---------------------------------------------------------------------*/ - -void set_zero( - float *vec, /* o : input vector */ - const int16_t lvec /* i : length of the vector */ -) -{ - int16_t i; - - for ( i = 0; i < lvec; i++ ) - { - *vec++ = 0.0f; - } - - return; -} - - -/*---------------------------------------------------------------------* - * mvr2r() - * mvs2s() - * mvr2s() - * mvs2r() - * mvr2d() - * mvd2r() - * - * Transfer the contents of vector x[] to vector y[] - *---------------------------------------------------------------------*/ - -void mvr2r( - const float x[], /* i : input vector */ - float y[], /* o : output vector */ - const int16_t n /* i : vector size */ -) -{ - int16_t i; - - if ( n <= 0 ) - { - /* cannot transfer vectors with size 0 */ - return; - } - - if ( y < x ) - { - for ( i = 0; i < n; i++ ) - { - y[i] = x[i]; - } - } - else - { - for ( i = n - 1; i >= 0; i-- ) - { - y[i] = x[i]; - } - } - - return; -} - -void mvs2s( - const int16_t x[], /* i : input vector */ - int16_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ -) -{ - int16_t i; - - if ( n <= 0 ) - { - /* cannot transfer vectors with size 0 */ - return; - } - - if ( y < x ) - { - for ( i = 0; i < n; i++ ) - { - y[i] = x[i]; - } - } - else - { - for ( i = n - 1; i >= 0; i-- ) - { - y[i] = x[i]; - } - } - - return; -} - -void mvl2l( - const int32_t x[], /* i : input vector */ - int32_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ -) -{ - int16_t i; - - if ( n <= 0 ) - { - /* no need to transfer vectors with size 0 */ - return; - } - - if ( y < x ) - { - for ( i = 0; i < n; i++ ) - { - y[i] = x[i]; - } - } - else - { - for ( i = n - 1; i >= 0; i-- ) - { - y[i] = x[i]; - } - } - - return; -} - -/*! r: index of the maximum value in the input vector */ -Word16 maximum_s( - const Word16 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word16 *max /* o : maximum value in the input vector */ -) -{ - Word16 i, ind; - Word16 tmp; - - ind = 0; - move16(); - tmp = vec[0]; - move16(); - - FOR( i = 1; i < lvec; i++ ) - { - IF( GT_16( vec[i], tmp ) ) - { - ind = i; - move16(); - tmp = vec[i]; - move16(); - } - } - - if ( max != NULL ) - { - *max = tmp; - move16(); - } - - return ind; -} - -/*! r: index of the maximum value in the input vector */ -Word16 maximum_l( - const Word32 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word32 *max_val /* o : maximum value in the input vector */ -) -{ - Word16 i, ind; - Word32 tmp; - - ind = 0; - tmp = vec[0]; - move16(); - move32(); - FOR( i = 1; i < lvec; i++ ) - { - IF( GT_32( vec[i], tmp ) ) - { - ind = i; - tmp = vec[i]; - move16(); - move32(); - } - } - - if ( max_val != NULL ) - { - *max_val = tmp; - move32(); - } - - return ind; -} - -/*! r: index of the maximum value in the input vector */ -Word16 maximumAbs_l( - const Word32 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word32 *max_val /* o : maximum value in the input vector */ -) -{ - Word16 j, ind; - Word32 tmp; - - ind = 0; - move16(); - tmp = L_abs( vec[0] ); - - FOR( j = 1; j < lvec; j++ ) - { - IF( GT_32( L_abs( vec[j] ), tmp ) ) - { - ind = j; - move16(); - tmp = L_abs( vec[j] ); - } - } - - IF( max_val != NULL ) - { - *max_val = tmp; - move32(); - } - - return ind; -} - -/*-------------------------------------------------------------------* - * minimum_s() - * - * Finds minimum 16-bit signed integer value in the array and returns it. - *-------------------------------------------------------------------*/ - -/*! r: index of the minimum value in the input vector */ -Word16 minimum_s( - const Word16 *vec, /* i : Input vector */ - const Word16 lvec, /* i : Vector length */ - Word16 *min_val /* o : minimum value in the input vector */ -) -{ -#ifdef FIX_1105_OPT_MINIMUM_SL - Word16 i, ind; -#else - Word16 i, ind, tmp; -#endif - - ind = 0; - move16(); -#ifndef FIX_1105_OPT_MINIMUM_SL - tmp = vec[0]; - move16(); -#endif - - FOR( i = 1; i < lvec; i++ ) - { -#ifdef FIX_1105_OPT_MINIMUM_SL - if ( LT_16( vec[i], vec[ind] ) ) - { - ind = i; - move16(); - } -#else - IF( LT_16( vec[i], tmp ) ) - { - ind = i; - move16(); - tmp = vec[i]; - move16(); - } -#endif - } - - if ( min_val != NULL ) - { -#ifdef FIX_1105_OPT_MINIMUM_SL - *min_val = vec[ind]; -#else - *min_val = tmp; -#endif - move16(); - } - - return ind; -} - -/*-------------------------------------------------------------------* - * minimum_l() - * - * Finds minimum 16-bit signed integer value in the array and returns it. - *-------------------------------------------------------------------*/ - -/*! r: index of the minimum value in the input vector */ -Word16 minimum_l( - const Word32 *vec, /* i : Input vector */ - const Word16 lvec, /* i : Vector length */ - Word32 *min_val /* o : minimum value in the input vector */ -) -{ - Word16 i, ind; -#ifndef FIX_1105_OPT_MINIMUM_SL - Word32 tmp; -#endif - - ind = 0; -#ifndef FIX_1105_OPT_MINIMUM_SL - tmp = vec[0]; -#endif - move16(); -#ifndef FIX_1105_OPT_MINIMUM_SL - move32(); -#endif - - FOR( i = 1; i < lvec; i++ ) - { -#ifdef FIX_1105_OPT_MINIMUM_SL - if ( LT_32( vec[i], vec[ind] ) ) - { - ind = i; - move16(); - } -#else - IF( LT_32( vec[i], tmp ) ) - { - ind = i; - tmp = vec[i]; - move16(); - move32(); - } -#endif - } - - if ( min_val != NULL ) - { -#ifdef FIX_1105_OPT_MINIMUM_SL - *min_val = vec[ind]; -#else - *min_val = tmp; -#endif - move32(); - } - - return ind; -} - -/*---------------------------------------------------------------------* - * dotp() - * - * Dot product of vector x[] and vector y[] - *---------------------------------------------------------------------*/ - -/*! r: dot product of x[] and y[] */ -float dotp( - const float x[], /* i : vector x[] */ - const float y[], /* i : vector y[] */ - const int16_t n /* i : vector length */ -) -{ - int16_t i; - float suma; - - suma = x[0] * y[0]; - - for ( i = 1; i < n; i++ ) - { - suma += x[i] * y[i]; - } - - return suma; -} - -/*---------------------------------------------------------------------* - * dotp() - * - * Dot product of vector x[] and vector y[] - *---------------------------------------------------------------------*/ - -/*! r: dot product of x[] and y[] */ -Word32 dotp_fixed( - const Word32 x[], /* i : vector x[] Qx */ - const Word32 y[], /* i : vector y[] Qy */ - const Word16 n /* i : vector length */ -) -{ - Word16 i; - Word32 suma; - - suma = Mpy_32_32( x[0], y[0] ); - - FOR( i = 1; i < n; i++ ) - { - suma = L_add( suma, Mpy_32_32( x[i], y[i] ) ); - } - - return suma; -} - -/*To calculate dot product of two 32 bit arrays in case of overflow*/ -Word32 dotp_fixed_o( - const Word32 x[], /* i : vector x[] */ - const Word32 y[], /* i : vector y[] */ - const Word16 n, /* i : vector length */ - const Word16 log_len, /* i : max factor added to result q after dot product (equal to log2(n)) */ - Word16 *res_q /*stores resultant Q*/ -) -{ - Word16 i; - Word64 suma; /*resultant q= q(x)+q(y)-9-x such that q<=31*/ - - suma = W_shr( W_mult_32_32( x[0], y[0] ), log_len ); - - FOR( i = 1; i < n; i++ ) - { - suma = W_add( suma, W_shr( W_mult_32_32( x[i], y[i] ), log_len ) ); - } - *res_q = add( sub( *res_q, log_len ), 1 ); - move16(); - test(); - test(); - WHILE( GT_64( suma, MAX_32 ) || LT_64( suma, MIN_32 ) || GT_16( *res_q, 31 ) ) - { - suma = W_shr( suma, 1 ); - *res_q = sub( *res_q, 1 ); - move16(); - } - return W_extract_l( suma ); -} - -Word32 dotp_fixed_32( - const Word32 x[], /* i : vector x[] */ - const Word32 y[], /* i : vector y[] */ - const Word16 n, /* i : vector length */ - const Word16 log_len, /* i : max factor added to result q after dot product (equal to log2(n)) */ - Word16 *res_q /*stores resultant Q*/ -) -{ - Word16 i; - Word64 suma; /*resultant q= q(x)+q(y)-9-x such that q<=31*/ - - suma = W_shr( W_mult_32_32( x[0], y[0] ), log_len ); - - FOR( i = 1; i < n; i++ ) - { - suma = W_add( suma, W_shr( W_mult_32_32( x[i], y[i] ), log_len ) ); - } - *res_q = add( *res_q, add( sub( *res_q, log_len ), 1 ) ); - move16(); - test(); - test(); - WHILE( GT_64( suma, MAX_32 ) || LT_64( suma, MIN_32 ) || GT_16( *res_q, 31 ) ) - { - suma = W_shr( suma, 1 ); - *res_q = sub( *res_q, 1 ); - move16(); - } - return W_extract_l( suma ); -} - -/*---------------------------------------------------------------------* - * inv_sqrt() - * - * Find the inverse square root of the input value - *---------------------------------------------------------------------*/ - -/*! r: inverse square root of input value */ -float inv_sqrt( - const float x /* i : input value */ -) -{ - return (float) ( 1.0 / sqrt( x ) ); -} - -/*-------------------------------------------------------------------* - * v_add_w64() - * - * Subtraction of two vectors sample by sample - *-------------------------------------------------------------------*/ - -void v_add_w64( - const Word64 x1[], /* i : Input vector 1 */ - const Word64 x2[], /* i : Input vector 2 */ - Word64 y[], /* o : Output vector that contains vector 1 - vector 2 */ - const Word16 N, /* i : Vector length */ - const Word16 hdrm /* i : headroom for when subtraction result > 1 or < -1 */ -) -{ - Word16 i; - - FOR( i = 0; i < N; i++ ) - { - y[i] = W_add( W_shr( x1[i], hdrm ), W_shr( x2[i], hdrm ) ); - move64(); - } - - return; -} - - -/*-------------------------------------------------------------------* - * v_sub() - * - * Subtraction of two vectors sample by sample - *-------------------------------------------------------------------*/ - -void v_sub( - const float x1[], /* i : Input vector 1 */ - const float x2[], /* i : Input vector 2 */ - float y[], /* o : Output vector that contains vector 1 - vector 2 */ - const int16_t N /* i : Vector length */ -) -{ - int16_t i; - - for ( i = 0; i < N; i++ ) - { - y[i] = x1[i] - x2[i]; - } - - return; -} - -/*-------------------------------------------------------------------* - * v_sub() - * - * Subtraction of two vectors sample by sample - *-------------------------------------------------------------------*/ - -void v_sub_fixed( - const Word32 x1[], /* i : Input vector 1 */ - const Word32 x2[], /* i : Input vector 2 */ - Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ - const Word16 N, /* i : Vector length */ - const Word16 hdrm /* i : headroom for when subtraction result > 1 or < -1 */ -) -{ - Word16 i; - - FOR( i = 0; i < N; i++ ) - { - y[i] = L_sub( L_shr( x1[i], hdrm ), L_shr( x2[i], hdrm ) ); - move32(); - } - - return; -} - -/*-------------------------------------------------------------------* - * v_multc_fixed() - * - * Multiplication of vector by constant - *-------------------------------------------------------------------*/ - -void v_multc_fixed( - const Word32 x[], /* i : Input vector */ - const Word32 c, /* i : Constant */ - Word32 y[], /* o : Output vector that contains c*x */ - const Word16 N /* i : Vector length */ -) -{ - Word16 i; - - FOR( i = 0; i < N; i++ ) - { - y[i] = Mpy_32_32( c, x[i] ); - move32(); - } - - return; -} - -void v_multc_fixed_16( - const Word32 x[], /* i : Input vector */ - const Word16 c, /* i : Constant */ - Word32 y[], /* o : Output vector that contains c*x */ - const Word16 N /* i : Vector length */ -) -{ - Word16 i; - - FOR( i = 0; i < N; i++ ) - { - y[i] = Mpy_32_16_1( x[i], c ); - move32(); - } - - return; -} - -void v_multc_fixed_16_16( - const Word16 x[], /* i : Input vector */ - const Word16 c, /* i : Constant */ - Word16 y[], /* o : Output vector that contains c*x */ - const Word16 N /* i : Vector length */ -) -{ - Word16 i; - - FOR( i = 0; i < N; i++ ) - { - y[i] = mult_r( x[i], c ); - move16(); - } - - return; -} - -/*-------------------------------------------------------------------* - * usdequant() - * - * Uniform scalar de-quantizer routine - * - * Applies de-quantization based on scale and round operations. - *-------------------------------------------------------------------*/ - -float usdequant( - const int16_t idx, /* i : quantizer index */ - const float qlow, /* i : lowest codebook entry (index 0) */ - const float delta /* i : quantization step */ -) -{ - float g; - - g = idx * delta + qlow; - - return ( g ); -} - -void sort( - UWord16 *x, /* i/o: Vector to be sorted */ - UWord16 len /* i/o: vector length */ -) -{ - Word16 i; - UWord16 j, tempr; - - FOR( i = len - 2; i >= 0; i-- ) - { - tempr = x[i]; - move16(); - FOR( j = i + 1; ( j < len ) && ( tempr > x[j] ); j++ ) - { - test(); - x[j - 1] = x[j]; - move16(); - } - x[j - 1] = tempr; - move16(); - } - - return; -} diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index fad2d64a8f4686f5b309cdaaa7dcc645ab028be8..66dde5a95db1fc1f5adb9e0e40115fb8f1e157f3 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -31,11 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - 3GPP TS26.258 Aug 24, 2023. IVAS Codec Version IVAS-FL-1.0 - ====================================================================================*/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -52,215 +48,777 @@ #include "prot_fx_enc.h" #include "ivas_prot_fx.h" -#define INV_BANDS10 3277 /* 1/10 in Q15 */ -#define INV_BANDS9 3641 /* 1/9 in Q15 */ -#define INV_BANDS3 10923 /* 1/9 in Q15 */ -const Word16 b_hp400_fx[3] = { 3660, -7320, 3660 }; /* Q12 (/4) */ -const Word16 a_hp400_fx[3] = { 16384, 29280, -14160 }; -const Word16 a_hp400_ivas_fx[3] = { 4096, 7320, -3540 }; /*Q12*/ -#define WMC_TOOL_SKIP +#define INV_BANDS10 3277 /* 1/10 in Q15 */ +#define INV_BANDS9 3641 /* 1/9 in Q15 */ +#define INV_BANDS3 10923 /* 1/9 in Q15 */ +static const Word16 b_hp400_fx[3] = { 3660, -7320, 3660 }; /* Q12 (/4) */ +static const Word16 a_hp400_fx[3] = { 16384, 29280, -14160 }; +static const Word16 a_hp400_ivas_fx[3] = { 4096, 7320, -3540 }; /*Q12*/ + +/*------------------------------------------------------------------* + * own_random() + * + * Random generator + *------------------------------------------------------------------*/ -// conversion functions: -Word32 float_to_fix( float number, Word32 Q ) +/*! r: output random value */ +Word16 own_random( + Word16 *seed /* i/o: random seed */ +) { - assert( Q >= 0 ); - if ( number == 1.0f && Q == Q31 ) + *seed = (Word16) ( *seed * 31821L + 13849L ); + + return ( *seed ); +} + + +/*--------------------------------------------------------------------- + * sum_s() + * sum_l() + * + *---------------------------------------------------------------------*/ + +/*! r: sum of all vector elements */ +Word16 sum_s( + const Word16 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ +) +{ + Word16 i; + Word16 tmp; + + tmp = 0; + for ( i = 0; i < lvec; i++ ) { - return ONE_IN_Q31; + tmp += vec[i]; } - if ( isnan( number ) ) + + return tmp; +} + +/*! r: sum of all vector elements */ +Word32 sum_l_fx( + const Word32 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ +) +{ + Word16 i; + Word32 tmpL; + + tmpL = 0; + move32(); + FOR( i = 0; i < lvec; i++ ) { - number = 0; + tmpL = L_add( tmpL, vec[i] ); } - assert( fabs( number ) < pow( 2, 31 - Q ) ); - Word32 ret = (Word32) ( number * ( (UWord32) 1 << Q ) ); - return ret; + + return tmpL; } -float fix_to_float( Word32 number, Word32 Q ) +/*---------------------------------------------------------------------- + * sum2_f() + * + *---------------------------------------------------------------------*/ + +/*! r: sum of all squared vector elements */ +Word32 sum2_f_16_fx( + const Word16 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ +) +{ + Word16 i; + Word32 tmp; + + tmp = 0; + move32(); + FOR( i = 0; i < lvec; i++ ) + { + tmp = L_add( tmp, L_mult0( vec[i], vec[i] ) ); + } + + return tmp; +} +Word32 sum2_f_16_gb_fx( + const Word16 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word16 gb ) { - assert( Q >= 0 ); - float ret = (float) number / ( (UWord32) 1 << Q ); - return ret; + Word16 i; + Word32 tmp; + + tmp = 0; + FOR( i = 0; i < lvec; i++ ) + { + tmp = L_add( tmp, L_shr( L_mult0( vec[i], vec[i] ), gb ) ); + } + + return tmp; } -Word16 float_to_fix16( float number, Word16 Q ) + +Word32 sum2_16_exp_fx( + const Word16 *vec, /* i : input vector Q(15 - exp) */ + const Word16 lvec, /* i : length of input vector */ + Word16 *exp, /* i/o: exponent of vector */ + Word16 gb /* i : guard bits */ +) +{ + Word16 i, s; + Word32 L_tmp, var_a; + + L_tmp = 0; + move32(); + var_a = 0; + move32(); + FOR( i = 0; i < lvec; i++ ) + { + var_a = L_mult0( vec[i], vec[i] ); /* 2 * Q(15 - exp) */ + L_tmp = L_add( L_tmp, L_shr( var_a, gb ) ); /* 2 * Q(15 - exp) - gb */ + } + + s = norm_l( L_tmp ); + L_tmp = L_shl( L_tmp, s ); /* 2 * Q(15 - exp) - gb + s */ + + *exp = add( sub( add( shl( *exp, 1 ), gb ), s ), 1 ); + move16(); + + return L_tmp; +} + + +Word32 sum2_32_exp_fx( + const Word32 *vec, /* i : input vector, Qx */ + const Word16 lvec, /* i : length of input vector */ + Word16 *exp, /* i/o: exponent of vector */ + Word16 gb /* i : guard bits */ +) { - assert( Q >= 0 ); - IF( isnan( number ) ) - return 0; - if ( number == 1.0f && Q == Q15 ) - return MAX16B; - if ( number == -1.0f && Q == Q15 ) - return MIN16B; - assert( fabs( number ) < pow( 2, 15 - Q ) ); - Word16 ret = (Word16) ( number * ( (UWord16) 1 << Q ) ); - return ret; + Word16 i, s, norm; + Word64 W_tmp; + + W_tmp = 0; + Word64 var_a = 0; + move64(); + move64(); + + norm = L_norm_arr( vec, lvec ); + + gb = sub( gb, norm ); + + FOR( i = 0; i < lvec; i++ ) + { + var_a = W_mult0_32_32( vec[i], vec[i] ); // 2x + W_tmp = W_add( W_tmp, W_shr( var_a, gb ) ); // 2x-gb + } + + s = W_norm( W_tmp ); + W_tmp = W_shl( W_tmp, s ); // 2x - gb + s + + //*exp = 31 - (2*(31 - *exp) - gb + s) + 32; + *exp = add( sub( add( shl( *exp, 1 ), gb ), s ), 1 ); + move16(); + + return W_extract_h( W_tmp ); } -Word16 float_to_fix16_thrld( float number, Word16 Q ) + +/* o : Q(2x - 31 - gb) */ +Word32 sum2_f_32_fx( + const Word32 *vec, /* i : input vector, Qx */ + const Word16 lvec, /* i : length of input vector */ + Word16 gb /* i : guard bits */ +) { - assert( Q >= 0 ); - if ( number == 1.0f && Q == Q15 ) - return MAX16B; - float limit = (float) pow( 2, 15 - Q ); - /*Add threshold*/ - if ( number > MAX16B_FLT ) + Word16 i; + Word32 tmp; + + tmp = 0; + Word32 var_a = 0; + move32(); + move32(); + FOR( i = 0; i < lvec; i++ ) { - number = MAX16B_FLT; + var_a = Mpy_32_32( vec[i], vec[i] ); // 2x-31 + tmp = L_add( tmp, L_shr( var_a, gb ) ); // 2x-31-gb } - else if ( number < MIN16B_FLT ) + + return tmp; +} + +Word32 sum2_32_fx( + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word16 *e ) +{ + Word16 i; + Word32 tmp; + + tmp = 0; + Word32 var_a = 0; + Word16 exp = 0, exp_tmp; + move32(); + move32(); + move16(); + FOR( i = 0; i < lvec; i++ ) { - number = MIN16B_FLT; + exp_tmp = norm_l( vec[i] ); + var_a = L_shl( vec[i], exp_tmp ); + var_a = Mpy_32_32( var_a, var_a ); + exp_tmp = shl( sub( *e, exp_tmp ), 1 ); + tmp = BASOP_Util_Add_Mant32Exp( tmp, exp, var_a, exp_tmp, &exp ); } - assert( number <= limit && number >= -limit ); - Word16 ret = (Word16) ( number * ( (UWord16) 1 << Q ) ); - return ret; + *e = exp; + move16(); + + return tmp; } -float fix16_to_float( Word16 number, Word16 Q ) + +/*-------------------------------------------------------------------* + * set_c() + * set_s() + * set_l() + * set_d() + * + * Set the vector elements to a value + *-------------------------------------------------------------------*/ + +void set_c( + Word8 y[], /* i/o: Vector to set */ + const Word8 a, /* i : Value to set the vector to */ + const Word32 N /* i : Length of the vector */ +) { - assert( Q >= 0 ); - float ret = (float) number / ( (UWord16) 1 << Q ); - return ret; + Word16 i; + + for ( i = 0; i < N; i++ ) + { + y[i] = a; + } + + return; } -// Float to 32-bit Mantissa and Exponent -void f2me( float n, Word32 *mantissa, Word16 *expo ) + +void set_s( + Word16 y[], /* i/o: Vector to set */ + const Word16 a, /* i : Value to set the vector to */ + const Word16 N /* i : Length of the vector */ +) { - Word32 e; - float mf = (float) frexp( n, &e ); - *expo = (Word16) e; - *mantissa = float_to_fix( mf, Q31 ); + Word16 i; + + for ( i = 0; i < N; i++ ) + { + y[i] = a; + } + + return; } -// 32-bit Mantissa and Exponent to Float -float me2f( Word32 m, Word16 expo ) + +void set_l( + Word32 y[], /* i/o: Vector to set */ + const Word32 a, /* i : Value to set the vector to */ + const Word16 N /* i : Length of the vector */ +) { - float mf = fix_to_float( m, Q31 ); - return (float) ldexp( mf, expo ); + Word16 i; + + for ( i = 0; i < N; i++ ) + { + y[i] = a; + } + + return; } -// Float buffer to 32-bit mantissa buffer and common exponent. -void f2me_buf( const float *x, Word32 *m, Word16 *e, const Word32 n ) + +void mvs2s( + const Word16 x[], /* i : input vector */ + Word16 y[], /* o : output vector */ + const Word16 n /* i : vector size */ +) { - Word16 max_e = -32, tmp_e; - Word32 i; + Word16 i; - for ( i = 0; i < n; i++ ) + if ( n <= 0 ) { - f2me( x[i], &m[i], &tmp_e ); - max_e = ( max_e > tmp_e ) ? max_e : tmp_e; + /* cannot transfer vectors with size 0 */ + return; } - for ( i = 0; i < n; i++ ) + if ( y < x ) { - f2me( x[i], &m[i], &tmp_e ); - m[i] = L_shr( m[i], max_e - tmp_e ); + for ( i = 0; i < n; i++ ) + { + y[i] = x[i]; + } + } + else + { + for ( i = n - 1; i >= 0; i-- ) + { + y[i] = x[i]; + } } - *e = max_e; + return; } -// 32-bit Mantissa buffer and exponent into float buffer. -void me2f_buf( const Word32 *m, const Word16 e, float *out, const Word32 n ) +void mvl2l( + const Word32 x[], /* i : input vector */ + Word32 y[], /* o : output vector */ + const Word16 n /* i : vector size */ +) { - for ( int i = 0; i < n; i++ ) + Word16 i; + + if ( n <= 0 ) + { + /* no need to transfer vectors with size 0 */ + return; + } + + if ( y < x ) { - out[i] = me2f( m[i], e ); + for ( i = 0; i < n; i++ ) + { + y[i] = x[i]; + } } + else + { + for ( i = n - 1; i >= 0; i-- ) + { + y[i] = x[i]; + } + } + + return; } -// Float to 16-bit Mantissa and Exponent -void f2me_16( float n, Word16 *mantissa, Word16 *expo ) +/*! r: index of the maximum value in the input vector */ +Word16 maximum_s( + const Word16 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word16 *max /* o : maximum value in the input vector */ +) { - Word32 e; - float mf = (float) frexp( n, &e ); - *expo = (Word16) e; - *mantissa = float_to_fix16( mf, 15 ); + Word16 i, ind; + Word16 tmp; + + ind = 0; + move16(); + tmp = vec[0]; + move16(); + + FOR( i = 1; i < lvec; i++ ) + { + IF( GT_16( vec[i], tmp ) ) + { + ind = i; + move16(); + tmp = vec[i]; + move16(); + } + } + + if ( max != NULL ) + { + *max = tmp; + move16(); + } + + return ind; } -// 16-bit Mantissa and Exponent to Float -float me2f_16( Word16 m, Word16 expo ) +/*! r: index of the maximum value in the input vector */ +Word16 maximum_l( + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word32 *max_val /* o : maximum value in the input vector */ +) { - float mf = fix16_to_float( m, 15 ); - return (float) ldexp( mf, expo ); + Word16 i, ind; + Word32 tmp; + + ind = 0; + tmp = vec[0]; + move16(); + move32(); + FOR( i = 1; i < lvec; i++ ) + { + IF( GT_32( vec[i], tmp ) ) + { + ind = i; + tmp = vec[i]; + move16(); + move32(); + } + } + + if ( max_val != NULL ) + { + *max_val = tmp; + move32(); + } + + return ind; } -// Float buffer to 16-bit mantissa buffer and common exponent. -void f2me_buf_16( const float *x, Word16 *m, Word16 *e, const Word32 n ) +/*! r: index of the maximum value in the input vector */ +Word16 maximumAbs_l( + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word32 *max_val /* o : maximum value in the input vector */ +) { - Word16 max_e = -16, tmp_e; - Word32 i; + Word16 j, ind; + Word32 tmp; + + ind = 0; + move16(); + tmp = L_abs( vec[0] ); - for ( i = 0; i < n; i++ ) + FOR( j = 1; j < lvec; j++ ) { - f2me_16( x[i], &m[i], &tmp_e ); - max_e = ( max_e > tmp_e ) ? max_e : tmp_e; + IF( GT_32( L_abs( vec[j] ), tmp ) ) + { + ind = j; + move16(); + tmp = L_abs( vec[j] ); + } } - for ( i = 0; i < n; i++ ) + IF( max_val != NULL ) { - f2me_16( x[i], &m[i], &tmp_e ); - m[i] = shr( m[i], max_e - tmp_e ); + *max_val = tmp; + move32(); } - *e = max_e; + return ind; } -// 16-bit Mantissa buffer and exponent into float buffer. -void me2f_buf_16( const Word16 *m, const Word16 e, float *out, const Word32 n ) +/*-------------------------------------------------------------------* + * minimum_s() + * + * Finds minimum 16-bit signed integer value in the array and returns it. + *-------------------------------------------------------------------*/ + +/*! r: index of the minimum value in the input vector */ +Word16 minimum_s( + const Word16 *vec, /* i : Input vector */ + const Word16 lvec, /* i : Vector length */ + Word16 *min_val /* o : minimum value in the input vector */ +) { - for ( int i = 0; i < n; i++ ) + Word16 i, ind; + + ind = 0; + move16(); + + FOR( i = 1; i < lvec; i++ ) { - out[i] = me2f_16( m[i], e ); + if ( LT_16( vec[i], vec[ind] ) ) + { + ind = i; + move16(); + } } + + if ( min_val != NULL ) + { + *min_val = vec[ind]; + move16(); + } + + return ind; } -void f2fix( float *var_flt, Word32 *var_fix, Word32 expo ) + +/*-------------------------------------------------------------------* + * minimum_l() + * + * Finds minimum 16-bit signed integer value in the array and returns it. + *-------------------------------------------------------------------*/ + +/*! r: index of the minimum value in the input vector */ +Word16 minimum_l( + const Word32 *vec, /* i : Input vector */ + const Word16 lvec, /* i : Vector length */ + Word32 *min_val /* o : minimum value in the input vector */ +) { - *var_fix = (Word32) ( *var_flt * pow( 2, 31 - expo ) ); + Word16 i, ind; + + ind = 0; + move16(); + + FOR( i = 1; i < lvec; i++ ) + { + if ( LT_32( vec[i], vec[ind] ) ) + { + ind = i; + move16(); + } + } + + if ( min_val != NULL ) + { + *min_val = vec[ind]; + move32(); + } + + return ind; } -void fix2f( Word32 *var_fix, float *var_flt, Word32 expo ) +/*---------------------------------------------------------------------* + * dotp() + * + * Dot product of vector x[] and vector y[] + *---------------------------------------------------------------------*/ + +/*! r: dot product of x[] and y[] */ +Word32 dotp_fx32( + const Word32 x[], /* i : vector x[] Qx */ + const Word32 y[], /* i : vector y[] Qy */ + const Word16 n /* i : vector length */ +) { - float mf = fix_to_float( *var_fix, 31 ); - *var_flt = (float) ldexp( mf, expo ); + Word16 i; + Word32 suma; + + suma = Mpy_32_32( x[0], y[0] ); + + FOR( i = 1; i < n; i++ ) + { + suma = L_add( suma, Mpy_32_32( x[i], y[i] ) ); + } + + return suma; } -void f2fix_16( float *var_flt, Word16 *var_fix, Word32 expo ) +/*To calculate dot product of two 32 bit arrays in case of overflow*/ +Word32 dotp_fx32_o( + const Word32 x[], /* i : vector x[] */ + const Word32 y[], /* i : vector y[] */ + const Word16 n, /* i : vector length */ + const Word16 log_len, /* i : max factor added to result q after dot product (equal to log2(n)) */ + Word16 *res_q /*stores resultant Q*/ +) { - *var_fix = (Word16) ( *var_flt * pow( 2, 15 - expo ) ); + Word16 i; + Word64 suma; /*resultant q= q(x)+q(y)-9-x such that q<=31*/ + + suma = W_shr( W_mult_32_32( x[0], y[0] ), log_len ); + + FOR( i = 1; i < n; i++ ) + { + suma = W_add( suma, W_shr( W_mult_32_32( x[i], y[i] ), log_len ) ); + } + *res_q = add( sub( *res_q, log_len ), 1 ); + move16(); + test(); + test(); + FOR( ; ( suma > MAX_32 ) || ( suma < MIN_32 ) || ( *res_q > 31 ); ) + { + suma = W_shr( suma, 1 ); + *res_q = sub( *res_q, 1 ); + move16(); + } + + return W_extract_l( suma ); } -void fix2f_16( Word16 *var_fix, float *var_flt, Word32 expo ) + +Word32 dotp_fx32_fac( + const Word32 x[], /* i : vector x[] */ + const Word32 y[], /* i : vector y[] */ + const Word16 n, /* i : vector length */ + const Word16 log_len, /* i : max factor added to result q after dot product (equal to log2(n)) */ + Word16 *res_q /*stores resultant Q*/ +) { - float mf = fix16_to_float( *var_fix, 15 ); - *var_flt = (float) ldexp( mf, expo ); + Word16 i; + Word64 suma; /*resultant q= q(x)+q(y)-9-x such that q<=31*/ + + suma = W_shr( W_mult_32_32( x[0], y[0] ), log_len ); + + FOR( i = 1; i < n; i++ ) + { + suma = W_add( suma, W_shr( W_mult_32_32( x[i], y[i] ), log_len ) ); + } + *res_q = add( *res_q, add( sub( *res_q, log_len ), 1 ) ); + move16(); + test(); + test(); + FOR( ; ( suma > MAX_32 ) || ( suma < MIN_32 ) || ( *res_q > 31 ); ) + { + suma = W_shr( suma, 1 ); + *res_q = sub( *res_q, 1 ); + move16(); + } + return W_extract_l( suma ); } -#undef WMC_TOOL_SKIP -int16_t norm_ul( uint32_t UL_var1 ) +/*-------------------------------------------------------------------* + * v_add_w64() + * + * Subtraction of two vectors sample by sample + *-------------------------------------------------------------------*/ + +void v_add_w64( + const Word64 x1[], /* i : Input vector 1 */ + const Word64 x2[], /* i : Input vector 2 */ + Word64 y[], /* o : Output vector that contains vector 1 - vector 2 */ + const Word16 N, /* i : Vector length */ + const Word16 hdrm /* i : headroom for when subtraction result > 1 or < -1 */ +) { - int16_t var_out; + Word16 i; - if ( UL_var1 == 0 ) + FOR( i = 0; i < N; i++ ) { - var_out = 0; + y[i] = W_add( W_shr( x1[i], hdrm ), W_shr( x2[i], hdrm ) ); + move64(); } - else + + return; +} + + +/*-------------------------------------------------------------------* + * v_sub_fx() + * + * Subtraction of two vectors sample by sample + *-------------------------------------------------------------------*/ + +void v_sub_fx( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ + const Word16 N, /* i : Vector length */ + const Word16 hdrm /* i : headroom for when subtraction result > 1 or < -1 */ +) +{ + Word16 i; + + FOR( i = 0; i < N; i++ ) + { + y[i] = L_sub( L_shr( x1[i], hdrm ), L_shr( x2[i], hdrm ) ); + move32(); + } + + return; +} + +void v_sub_fx_no_hdrm( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ + const Word16 N /* i : Vector length */ +) +{ + Word16 i; + + FOR( i = 0; i < N; i++ ) + { + y[i] = L_sub( x1[i], x2[i] ); + move32(); + } + + return; +} + +/*-------------------------------------------------------------------* + * v_multc() + * + * Multiplication of vector by constant + *-------------------------------------------------------------------*/ + +void v_multc_fx( + const Word32 x[], /* i : Input vector */ + const Word32 c, /* i : Constant */ + Word32 y[], /* o : Output vector that contains c*x */ + const Word16 N /* i : Vector length */ +) +{ + Word16 i; + + FOR( i = 0; i < N; i++ ) + { + y[i] = Mpy_32_32( c, x[i] ); + move32(); + } + + return; +} + +void v_multc_fx_16( + const Word32 x[], /* i : Input vector */ + const Word16 c, /* i : Constant */ + Word32 y[], /* o : Output vector that contains c*x */ + const Word16 N /* i : Vector length */ +) +{ + Word16 i; + + FOR( i = 0; i < N; i++ ) + { + y[i] = Mpy_32_16_1( x[i], c ); + move32(); + } + + return; +} + +void v_multc_fx_16_16( + const Word16 x[], /* i : Input vector */ + const Word16 c, /* i : Constant */ + Word16 y[], /* o : Output vector that contains c*x */ + const Word16 N /* i : Vector length */ +) +{ + Word16 i; + + FOR( i = 0; i < N; i++ ) + { + y[i] = mult_r( x[i], c ); + move16(); + } + + return; +} + + +void sort( + UWord16 *x, /* i/o: Vector to be sorted */ + UWord16 len /* i/o: vector length */ +) +{ + Word16 i; + UWord16 j, tempr; + + FOR( i = len - 2; i >= 0; i-- ) { - for ( var_out = 0; UL_var1 < (uint32_t) 0x80000000U; var_out++ ) + tempr = x[i]; + move16(); + FOR( j = i + 1; ( j < len ) && ( tempr > x[j] ); j++ ) { - UL_var1 <<= 1; + test(); + x[j - 1] = x[j]; + move16(); } + x[j - 1] = tempr; + move16(); } - BASOP_CHECK(); - return ( var_out ); + return; } + /*-------------------------------------------------------------------* * usdequant_fx() * @@ -268,10 +826,12 @@ int16_t norm_ul( uint32_t UL_var1 ) * * Applies de-quantization based on scale and round operations. *-------------------------------------------------------------------*/ -Word16 usdequant_fx( /* Qx*/ - const Word16 idx, /* i: quantizer index Q0*/ - const Word16 qlow, /* i: lowest codebook entry (index 0) Qx*/ - const Word16 delta /* i: quantization step Qx-1*/ + +/* Qx*/ +Word16 usdequant_fx( + const Word16 idx, /* i: quantizer index Q0*/ + const Word16 qlow, /* i: lowest codebook entry (index 0) Qx*/ + const Word16 delta /* i: quantization step Qx-1*/ ) { Word16 g; @@ -284,6 +844,32 @@ Word16 usdequant_fx( /* Qx*/ return ( g ); } +/* Qx*/ +Word32 usdequant32_fx( + const Word16 idx, /* i: quantizer index Q0*/ + const Word32 qlow, /* i: lowest codebook entry (index 0) Qx*/ + const Word32 delta /* i: quantization step Qx-1*/ +) +{ + Word32 g; + Word64 L_tmp; + + /*g = idx * delta + qlow;*/ + L_tmp = W_deposit32_l( qlow ); /*Qx */ + L_tmp = W_mac_32_16( L_tmp, delta, idx ); + IF( GE_64( L_tmp, MAX_32 ) ) + { + g = MAX_32; + move32(); + } + ELSE + { + g = W_extract_l( L_tmp ); /*Qx */ + } + return ( g ); +} + + /*-------------------------------------------------------------------* * usquant() * @@ -293,47 +879,49 @@ Word16 usdequant_fx( /* Qx*/ * Applies quantization based on scale and round operations. * Index of the winning codeword and the winning codeword itself are returned. *-------------------------------------------------------------------*/ -Word16 usquant_fx( /* o: index of the winning codeword */ - const Word16 x, /* i: scalar value to quantize Qx*/ - Word16 *xq, /* o: quantized value Qx*/ - const Word16 qlow, /* i: lowest codebook entry (index 0) Qx*/ - const Word16 delta, /* i: quantization step Qx-1*/ - const Word16 cbsize /* i: codebook size */ + +/* o: index of the winning codeword */ +Word16 usquant_fx( + const Word16 x, /* i: scalar value to quantize Qx*/ + Word16 *xq, /* o: quantized value Qx*/ + const Word16 qlow, /* i: lowest codebook entry (index 0) Qx*/ + const Word16 delta, /* i: quantization step Qx-1*/ + const Word16 cbsize /* i: codebook size */ ) { Word16 idx; Word16 tmp, exp; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* idx = (short)( (x - qlow)/delta + 0.5f); */ exp = norm_s( delta ); - tmp = div_s( shl( 1, sub( 14, exp ) ), delta ); /*Q(29-exp-(Qx-1))->Q(30-exp-Qx) */ - L_tmp = L_mult( sub_o( x, qlow, &Overflow ), tmp ); /*Q(31-exp) */ - idx = extract_l( L_shr_r( L_add( L_tmp, shl_o( 1, sub( 30, exp ), &Overflow ) ), sub( 31, exp ) ) ); /*Q0 */ + tmp = div_s( shl( 1, sub( 14, exp ) ), delta ); /*Q(29-exp-(Qx-1))->Q(30-exp-Qx) */ + L_tmp = L_mult( sub_sat( x, qlow ), tmp ); /*Q(31-exp) */ + idx = extract_l( L_shr_r( L_add( L_tmp, shl_sat( 1, sub( 30, exp ) ) ), sub( 31, exp ) ) ); /*Q0 */ idx = s_min( idx, sub( cbsize, 1 ) ); idx = s_max( idx, 0 ); /* *xq = idx*delta + qlow; */ - L_tmp = L_deposit_l( qlow ); /*Qx */ - L_tmp = L_mac( L_tmp, idx, delta ); /*Qx */ - *xq = round_fx_o( L_shl_o( L_tmp, 16, &Overflow ), &Overflow ); /*Qx */ + L_tmp = L_deposit_l( qlow ); /*Qx */ + L_tmp = L_mac( L_tmp, idx, delta ); /*Qx */ + *xq = round_fx_sat( L_shl_sat( L_tmp, 16 ) ); /*Qx */ + return idx; } + + /*-------------------------------------------------------------------* * Dot_product: * * Compute scalar product of using accumulator. * Performs no normalization, as opposed to Dot_product12() *-------------------------------------------------------------------*/ -Word32 Dot_product( /* o : Sum */ - const Word16 x[], /* i : 12bits: x vector */ - const Word16 y[], /* i : 12bits: y vector */ - const Word16 lg /* i : vector length */ +/* o : Sum */ +Word32 Dot_product( + const Word16 x[], /* i : 12bits: x vector */ + const Word16 y[], /* i : 12bits: y vector */ + const Word16 lg /* i : vector length */ ) { Word16 i; @@ -347,19 +935,23 @@ Word32 Dot_product( /* o : Sum */ L64_sum = W_mac_16_16( L64_sum, x[i], y[i] ); } L_sum = W_sat_l( L64_sum ); + return L_sum; } + + /*---------------------------------------------------------------------* * dotp_fx() * * Dot product of vector x[] and vector y[] *---------------------------------------------------------------------*/ -Word32 dotp_fx( /* o : dot product of x[] and y[] */ - const Word16 x[], /* i : vector x[] */ - const Word16 y[], /* i : vector y[] */ - const Word16 n, /* i : vector length */ - Word16 *exp /* (o) : exponent of result (0..+30) */ +/* o : dot product of x[] and y[] */ +Word32 dotp_fx( + const Word16 x[], /* i : vector x[] */ + const Word16 y[], /* i : vector y[] */ + const Word16 n, /* i : vector length */ + Word16 *exp /* o : exponent of result (0..+30) */ ) { Word16 sft; @@ -380,29 +972,29 @@ Word32 dotp_fx( /* o : dot product of x[] and y[] */ return L_sum; } -Word32 sum2_fx( /* o : sum of all squared vector elements Q(2x+1)*/ - const Word16 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ +/* o : sum of all squared vector elements Q(2x+1)*/ +Word32 sum2_fx( + const Word16 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ ) { Word16 i; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + L_tmp = L_deposit_l( 0 ); FOR( i = 0; i < lvec; i++ ) { - L_tmp = L_mac_o( L_tmp, vec[i], vec[i], &Overflow ); /*Q(2x+1) */ + L_tmp = L_mac_sat( L_tmp, vec[i], vec[i] ); /*Q(2x+1) */ } return L_tmp; } -Word64 sum2_fx_no_sat( /* o : sum of all squared vector elements Q(2*Qx)*/ - const Word16 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ + +/* o : sum of all squared vector elements Q(2*Qx)*/ +Word64 sum2_fx_no_sat( + const Word16 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ ) { Word16 i; @@ -441,32 +1033,32 @@ Word32 sum_32_fx( return ans; } -Word32 sum2_fx_mod( /* o : sum of all squared vector elements Q(2x+1 -5)*/ - const Word16 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ +/* o : sum of all squared vector elements Q(2x+1 -5)*/ +Word32 sum2_fx_mod( + const Word16 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ ) { Word16 i; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif L_tmp = L_deposit_l( 0 ); FOR( i = 0; i < lvec; i++ ) { - L_tmp = L_add_o( L_tmp, L_shr( L_mult_o( vec[i], vec[i], &Overflow ), 9 ), &Overflow ); + L_tmp = L_add_sat( L_tmp, L_shr( L_mult_sat( vec[i], vec[i] ), 9 ) ); } return L_tmp; } + + /*-------------------------------------------------------------------* * Copy: * * Copy vector x[] to y[] * *-------------------------------------------------------------------*/ + void Copy( const Word16 x[], /* i : input vector */ Word16 y[], /* o : output vector */ @@ -483,32 +1075,26 @@ void Copy( move16(); } -#ifdef FIX_1052_COPY_CMPLX_DISCREPANCY /* Location of x and y may differ depending on platform/memory allocation. Since IF and ELSE has different complexity count, the early return is used instead of ELSE to ensure the same complexity number regardless of x and y memory addresses. */ return; -#endif } -#ifndef FIX_1052_COPY_CMPLX_DISCREPANCY - ELSE + FOR( i = L - 1; i >= 0; i-- ) { -#endif - FOR( i = L - 1; i >= 0; i-- ) - { - y[i] = x[i]; - move16(); - } - - return; -#ifndef FIX_1052_COPY_CMPLX_DISCREPANCY + y[i] = x[i]; + move16(); } -#endif + + return; } + + /*-------------------------------------------------------------------* * Copy64: * * Copy vector x[] to y[] (64 bits) *-------------------------------------------------------------------*/ + void Copy64( const Word64 x[], /* i : input vector */ Word64 y[], /* o : output vector */ @@ -524,26 +1110,17 @@ void Copy64( move64(); } -#ifdef FIX_1052_COPY_CMPLX_DISCREPANCY /* Location of x and y may differ depending on platform/memory allocation. Since IF and ELSE has different complexity count, the early return is used instead of ELSE to ensure the same complexity number regardless of x and y memory addresses. */ return; -#endif } -#ifndef FIX_1052_COPY_CMPLX_DISCREPANCY - ELSE + FOR( i = L - 1; i >= 0; i-- ) { -#endif - FOR( i = L - 1; i >= 0; i-- ) - { - y[i] = x[i]; - move64(); - } - - return; -#ifndef FIX_1052_COPY_CMPLX_DISCREPANCY + y[i] = x[i]; + move64(); } -#endif + + return; } void set64_fx( @@ -580,28 +1157,19 @@ void Copy_pword( move16(); } -#ifdef FIX_1052_COPY_CMPLX_DISCREPANCY /* Location of x and y may differ depending on platform/memory allocation. Since IF and ELSE has different complexity count, the early return is used instead of ELSE to ensure the same complexity number regardless of x and y memory addresses. */ return; -#endif } -#ifndef FIX_1052_COPY_CMPLX_DISCREPANCY - ELSE + FOR( i = L - 1; i >= 0; i-- ) { -#endif - FOR( i = L - 1; i >= 0; i-- ) - { - y[i].v.im = x[i].v.im; - y[i].v.re = x[i].v.re; - move16(); - move16(); - } - - return; -#ifndef FIX_1052_COPY_CMPLX_DISCREPANCY + y[i].v.im = x[i].v.im; + y[i].v.re = x[i].v.re; + move16(); + move16(); } -#endif + + return; } /*-------------------------------------------------------------------* * Copy32: @@ -623,23 +1191,14 @@ void Copy32( move32(); } -#ifdef FIX_1052_COPY_CMPLX_DISCREPANCY return; -#endif } -#ifndef FIX_1052_COPY_CMPLX_DISCREPANCY - ELSE + FOR( i = L - 1; i >= 0; i-- ) { -#endif - FOR( i = L - 1; i >= 0; i-- ) - { - y[i] = x[i]; - move32(); - } -#ifndef FIX_1052_COPY_CMPLX_DISCREPANCY + y[i] = x[i]; + move32(); } -#endif } void set8_fx( @@ -659,12 +1218,14 @@ void set8_fx( return; } + /*-------------------------------------------------------------------* * set16_fx() * set32_fx() * * Set the vector elements to a value *-------------------------------------------------------------------*/ + void set16_fx( Word16 y[], /* i/o: Vector to set */ const Word16 a, /* i : Value to set the vector to */ @@ -688,7 +1249,6 @@ void set32_fx( const Word16 N /* i : Lenght of the vector */ ) { -#ifdef FIX_1106_SIMPLIFY_SET32FX Word16 i; FOR( i = 0; i < N; i++ ) @@ -696,34 +1256,17 @@ void set32_fx( y[i] = a; move32(); } -#else - Word16 i, tmp; - tmp = extract_l( a ); - IF( EQ_32( L_deposit_l( tmp ), a ) ) - { - FOR( i = 0; i < N; i++ ) - { - y[i] = L_deposit_l( tmp ); - move32(); - } - } - ELSE - { - FOR( i = 0; i < N; i++ ) - { - y[i] = a; - move32(); - } - } -#endif return; } + + /*-------------------------------------------------------------------* * Copy_Scale_sig * * Up/down scale a 16 bits vector x and move it into y *-------------------------------------------------------------------*/ + void Copy_Scale_sig( const Word16 x[], /* i : signal to scale input Qx */ Word16 y[], /* o : scaled signal output Qx */ @@ -733,10 +1276,7 @@ void Copy_Scale_sig( { Word16 i; Word16 tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + IF( exp0 == 0 ) { FOR( i = 0; i < lg; i++ ) @@ -758,15 +1298,20 @@ void Copy_Scale_sig( } FOR( i = 0; i < lg; i++ ) { - y[i] = shl_o( x[i], exp0, &Overflow ); + y[i] = shl_sat( x[i], exp0 ); move16(); /* saturation can occur here */ } + + return; } + + /*-------------------------------------------------------------------* * Copy_Scale_sig * * Up/down scale a 16 bits vector x and move it into y *-------------------------------------------------------------------*/ + void Copy_Scale_sig_16_32_DEPREC( const Word16 x[], /* i : signal to scale input Qx */ Word32 y[], /* o : scaled signal output Qx */ @@ -776,11 +1321,6 @@ void Copy_Scale_sig_16_32_DEPREC( { Word16 i; Word16 tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - IF( exp0 == 0 ) { @@ -796,12 +1336,11 @@ void Copy_Scale_sig_16_32_DEPREC( /*Should not happen */ FOR( i = 0; i < lg; i++ ) { - y[i] = L_deposit_l( shl_o( x[i], exp0, &Overflow ) ); + y[i] = L_deposit_l( shl_sat( x[i], exp0 ) ); move32(); } return; } -#ifdef FIX_ISSUE_1237 #ifdef DEBUGGING if ( exp0 >= 16 ) { @@ -810,13 +1349,31 @@ void Copy_Scale_sig_16_32_DEPREC( #else assert( exp0 < 16 ); #endif -#endif - tmp = shl_o( 1, exp0, &Overflow ); + tmp = shl_sat( 1, exp0 ); FOR( i = 0; i < lg; i++ ) { y[i] = L_mult0( x[i], tmp ); move32(); /* saturation can occur here */ } + + return; +} + +void Copy_Scale_sig_16_32_r( + const Word16 x[], /* i : signal to scale input Qx */ + Word32 y[], /* o : scaled signal output Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +) +{ + Word16 i; + + FOR( i = 0; i < lg; i++ ) + { + y[i] = L_shl_r( L_deposit_l( x[i] ), exp0 ); + } + + return; } void Copy_Scale_sig_16_32_no_sat( @@ -828,11 +1385,6 @@ void Copy_Scale_sig_16_32_no_sat( { Word16 i; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - IF( exp0 == 0 ) { @@ -848,20 +1400,38 @@ void Copy_Scale_sig_16_32_no_sat( /*Should not happen */ FOR( i = 0; i < lg; i++ ) { - y[i] = L_deposit_l( shl_o( x[i], exp0, &Overflow ) ); + y[i] = L_deposit_l( shl_sat( x[i], exp0 ) ); move32(); } return; } - L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); - FOR( i = 0; i < lg; i++ ) + + L_tmp = L_shl_sat( 1, exp0 - 1 ); + + IF( L_tmp >= 0x7FFF ) { - // y[i] = L_mult0(x[i], L_tmp); - y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* saturation can occur here */ + FOR( i = 0; i < lg; i++ ) + { + // y[i] = L_mult0(x[i], L_tmp); + y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); + move32(); /* Overflow can occur here */ + } + return; + } + // ELSE + { + Word16 tmp = extract_l( L_tmp ); + FOR( i = 0; i < lg; i++ ) + { + y[i] = L_mult( x[i], tmp ); + move32(); + } } + + return; } + void Copy_Scale_sig_32_16( const Word32 x[], /* i : signal to scale input Qx */ Word16 y[], /* o : scaled signal output Qx */ @@ -871,17 +1441,13 @@ void Copy_Scale_sig_32_16( { Word16 i; Word16 tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif tmp = add( 16, exp0 ); IF( tmp != 0 ) { FOR( i = 0; i < lg; i++ ) { - y[i] = round_fx_o( L_shl_o( x[i], tmp, &Overflow ), &Overflow ); + y[i] = round_fx_sat( L_shl_sat( x[i], tmp ) ); move16(); } } @@ -889,17 +1455,21 @@ void Copy_Scale_sig_32_16( { FOR( i = 0; i < lg; i++ ) { - y[i] = round_fx_o( x[i], &Overflow ); + y[i] = round_fx_sat( x[i] ); move16(); } } + + return; } + /*-------------------------------------------------------------------* * Scale_sig32 * * Up/down scale a 32 bits vector *-------------------------------------------------------------------*/ + void Scale_sig32( Word32 x[], /* i/o: signal to scale Qx */ const Word16 lg, /* i : size of x[] Q0 */ @@ -907,10 +1477,7 @@ void Scale_sig32( ) { Word16 i; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + IF( 0 == exp0 ) { return; @@ -918,11 +1485,14 @@ void Scale_sig32( FOR( i = 0; i < lg; i++ ) { - x[i] = L_shl_o( x[i], exp0, &Overflow ); + x[i] = L_shl_sat( x[i], exp0 ); move32(); /* saturation can occur here */ } + + return; } + /*------------------------------------------------------------------* * function Random_Fill * @@ -930,6 +1500,7 @@ void Scale_sig32( * (Avoids Store of Seed to Memory for 'n' Random Values and * Combines Scaling Operation.) *------------------------------------------------------------------*/ + void Random_Fill( Word16 *seed, /* i/o: random seed */ Word16 n, /* i : number of values */ @@ -950,11 +1521,16 @@ void Random_Fill( } *seed = local_seed; move16(); + + return; } + + /*-------------------------------------------------------------------* * Scale_sig * Up/down scale a 16 bits vector *-------------------------------------------------------------------*/ + void Scale_sig( Word16 x[], /* i/o: signal to scale Qx */ const Word16 lg, /* i : size of x[] Q0 */ @@ -985,10 +1561,12 @@ void Scale_sig( } } + /*-------------------------------------------------------------------* * scale_sig * Up/down scale a 16 bits vector *-------------------------------------------------------------------*/ + void scale_sig( Word16 x[], /* i/o: signal to scale Qx */ const Word16 lg, /* i : size of x[] Q0 */ @@ -1008,25 +1586,28 @@ void scale_sig( } /*---------------------------------------------------------------------* - * mean() + * mean_fx() * *---------------------------------------------------------------------*/ -Word16 mean_fx( /* o : mean of vector */ - const Word16 *vec_fx, /* i : input vector */ - const Word16 lvec_fx /* i : length of input vector */ + +/* o : mean of vector */ +Word16 mean_fx( + const Word16 *vec_fx, /* i : input vector */ + const Word16 lvec_fx /* i : length of input vector */ ) { Word16 tmp; - // PMT("TBV : this function could be written differently to minimize the risk of saturation"); + /* this function could be written differently to minimize the risk of saturation */ tmp = sum16_fx( vec_fx, lvec_fx ); tmp = mult_r( tmp, div_s( 1, lvec_fx ) ); return tmp; } -Word16 mean_no_sat_fx( /* o : mean of vector Qx */ - const Word16 *vec_fx, /* i : input vector Qx */ - const Word16 lvec_fx /* i : length of input vector */ +/* o : mean of vector Qx */ +Word16 mean_no_sat_fx( + const Word16 *vec_fx, /* i : input vector Qx */ + const Word16 lvec_fx /* i : length of input vector */ ) { Word16 i; @@ -1040,10 +1621,12 @@ Word16 mean_no_sat_fx( /* o : mean of vector Qx * return extract_l( L_tmp ); } -Word32 mean_no_sat_Word32_fx( /* o : mean of vector Qx */ - const Word32 *vec_fx, /* i : input vector Qx */ - const Word16 lvec_fx, /* i : length of input vector */ - const Word16 gb ) + +/* o : mean of vector Qx */ +Word32 mean_no_sat_Word32_fx( + const Word32 *vec_fx, /* i : input vector Qx */ + const Word16 lvec_fx, /* i : length of input vector */ + const Word16 gb ) { Word16 i; Word32 L_tmp = 0; @@ -1056,11 +1639,14 @@ Word32 mean_no_sat_Word32_fx( /* o : mean of vector return L_tmp; } + + /*-------------------------------------------------------------------* * Vr_add * * Add two Word16 vectors together integer by integer *-------------------------------------------------------------------*/ + void Vr_add( const Word16 *in1, /* i : Input vector 1 */ const Word16 *in2, /* i : Input vector 2 */ @@ -1105,6 +1691,8 @@ void sort_fx( r[j - 1] = tempr; move16(); } + + return; } void sort_32_fx( @@ -1136,10 +1724,11 @@ void sort_32_fx( return; } -Word16 minimum_fx( /* o : index of the minimum value in the input vector */ - const Word16 *vec_fx, /* i : input vector */ - const Word16 lvec_fx, /* i : length of input vector */ - Word16 *min_fx /* o : minimum value in the input vector */ +/* o : index of the minimum value in the input vector */ +Word16 minimum_fx( + const Word16 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word16 *min_fx /* o : minimum value in the input vector */ ) { Word16 j, ind; @@ -1166,10 +1755,11 @@ Word16 minimum_fx( /* o : index of the minimum value in t return ind; } -Word16 maximum_fx( /* o : index of the maximum value in the input vector */ - const Word16 *vec_fx, /* i : input vector */ - const Word16 lvec_fx, /* i : length of input vector */ - Word16 *max_fx /* o : maximum value in the input vector */ +/* o : index of the maximum value in the input vector */ +Word16 maximum_fx( + const Word16 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word16 *max_fx /* o : maximum value in the input vector */ ) { Word16 j, ind; @@ -1194,30 +1784,31 @@ Word16 maximum_fx( /* o : index of the maximum value in t return ind; } -Word16 maximum_exp_fx( /* o : index of the maximum value in the input vector */ - const Word16 *vec_fx, /* i : input vector */ - const Word16 *exp_vec, /* i : exponents of input vector */ - const Word16 lvec_fx /* i : length of input vector */ +/* o : index of the maximum value in the input vector */ +Word16 maximum_exp_fx( + const Word16 *vec_fx, /* i : input vector */ + const Word16 *exp_vec, /* i : exponents of input vector */ + const Word16 lvec_fx /* i : length of input vector */ ) { Word16 j, ind; - Word16 tmp, exp; ind = 0; move16(); - tmp = vec_fx[0]; - move16(); - exp = exp_vec[0]; - move16(); FOR( j = 1; j < lvec_fx; j++ ) { - IF( LT_16( tmp, shr_sat( vec_fx[j], sub( exp, exp_vec[j] ) ) ) ) + Word16 scale = sub( exp_vec[j], exp_vec[ind] ); + + test(); + if ( vec_fx[j] == 0 || vec_fx[ind] == 0 ) { - ind = j; - move16(); - tmp = vec_fx[j]; + scale = 0; move16(); - exp = exp_vec[j]; + } + + if ( L_mac0_sat( L_shl_sat( L_deposit_l( vec_fx[j] ), scale ), vec_fx[ind], -0x0001 ) > 0 ) + { + ind = j; move16(); } } @@ -1225,16 +1816,18 @@ Word16 maximum_exp_fx( /* o : index of the maximum value return ind; } + /*---------------------------------------------------------------------* * maximum_abs_16_fx() * * Find index and value of the absolute maximum in a vector *---------------------------------------------------------------------*/ -Word16 maximum_abs_16_fx( /* o : index of the maximum abs value in the input vector */ - const Word16 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word16 *max_val /* o : maximum value in the input vector */ +/* o : index of the maximum abs value in the input vector */ +Word16 maximum_abs_16_fx( + const Word16 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word16 *max_val /* o : maximum value in the input vector */ ) { Word16 j, ind; @@ -1263,10 +1856,12 @@ Word16 maximum_abs_16_fx( /* o : index of the maximum abs va * * Find index and value of the absolute minimum in a vector *---------------------------------------------------------------------*/ -Word16 minimum_abs32_fx( /* o : index of the minimum value in the input vector */ - const Word32 *vec_fx, /* i : input vector */ - const Word16 lvec_fx, /* i : length of input vector */ - Word32 *min_fx /* o : minimum value in the input vector */ + +/* o : index of the minimum value in the input vector */ +Word16 minimum_abs32_fx( + const Word32 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word32 *min_fx /* o : minimum value in the input vector */ ) { Word16 j, ind; @@ -1293,16 +1888,18 @@ Word16 minimum_abs32_fx( /* o : index of the minimum valu return ind; } + /*---------------------------------------------------------------------* * minimum_32_fx() * * Find index and value of the minimum in a vector *---------------------------------------------------------------------*/ -Word16 minimum_32_fx( /* o : index of the minimum value in the input vector */ - const Word32 *vec_fx, /* i : input vector */ - const Word16 lvec_fx, /* i : length of input vector */ - Word32 *min_fx /* o : minimum value in the input vector */ +/* o : index of the minimum value in the input vector */ +Word16 minimum_32_fx( + const Word32 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word32 *min_fx /* o : minimum value in the input vector */ ) { Word16 j, ind; @@ -1331,16 +1928,18 @@ Word16 minimum_32_fx( /* o : index of the minimum value i return ind; } + /*---------------------------------------------------------------------* * maximum_32_fx() * * Find index and value of the maximum in a vector *---------------------------------------------------------------------*/ -Word16 maximum_32_fx( /* o : index of the maximum value in the input vector */ - const Word32 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word32 *max_val /* o : maximum value in the input vector */ +/* o : index of the maximum value in the input vector */ +Word16 maximum_32_fx( + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word32 *max_val /* o : maximum value in the input vector */ ) { Word16 j, ind; @@ -1368,10 +1967,11 @@ Word16 maximum_32_fx( /* o : index of the maximum value in t return ind; } -Word16 maximum_abs_32_fx( /* o : index of the maximum abs value in the input vector */ - const Word32 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word32 *max_val /* o : maximum value in the input vector */ +/* o : index of the maximum abs value in the input vector */ +Word16 maximum_abs_32_fx( + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word32 *max_val /* o : maximum value in the input vector */ ) { Word16 j, ind; @@ -1402,6 +2002,7 @@ Word16 maximum_abs_32_fx( /* o : index of the maximum abs va *Return value *Number of shifts *----------------------------------------------------------------*/ + Word16 Exp16Array( const Word16 n, /* (i): Array size */ const Word16 *sx /* (i): Data array */ @@ -1451,9 +2052,10 @@ Word16 Exp32Array( return exp; } -Word32 sum16_32_fx( /* o : sum of all vector elements Qx*/ - const Word16 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ +/* o : index of the maximum abs value in the input vector */ +Word32 sum16_32_fx( + const Word16 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ ) { Word16 i; @@ -1469,9 +2071,11 @@ Word32 sum16_32_fx( /* o : sum of all vector elements return tmp; } -Word32 sum32_sat( /* o : sum of all vector elements Qx*/ - const Word32 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ + +/* o : sum of all vector elements Qx*/ +Word32 sum32_sat( + const Word32 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ ) { Word16 i; @@ -1486,10 +2090,11 @@ Word32 sum32_sat( /* o : sum of all vector elements return tmp; } -Word32 var_fx_32( /* o: variance of vector Qx+16*/ - const Word16 *x, /* i: input vector Qx*/ - const Word16 Qx, - const Word16 len /* i: length of inputvector */ +/* o: variance of vector Qx+16*/ +Word32 var_fx_32( + const Word16 *x, /* i: input vector Qx*/ + const Word16 Qx, + const Word16 len /* i: length of inputvector */ ) { Word16 m; @@ -1498,7 +2103,6 @@ Word32 var_fx_32( /* o: variance of vector Q Word16 tmp, exp, inv_len; Word32 L_tmp; - L_tmp = L_add( x[0], 0 ); FOR( i = 1; i < len; i++ ) { @@ -1521,11 +2125,12 @@ Word32 var_fx_32( /* o: variance of vector Q return v; } -Word32 var_fx_32in_32out( /* o: variance of vector Qx*/ - const Word32 *x, /* i: input vector Qx*/ - Word16 *Qx, /*i/o:Q for input/output */ - const Word16 len, /* i: length of inputvector */ - const Word16 gb ) +/* o: variance of vector Qx*/ +Word32 var_fx_32in_32out( + const Word32 *x, /* i: input vector Qx*/ + Word16 *Qx, /*i/o:Q for input/output */ + const Word16 len, /* i: length of inputvector */ + const Word16 gb ) { Word16 i; Word16 shift; @@ -1544,8 +2149,11 @@ Word32 var_fx_32in_32out( /* o: variance of vector *Qx = sub( add( shl( sub( *Qx, gb ), 1 ), shift ), 32 ); move16(); + return L_tmp; } + + /*-------------------------------------------------------------------* * conv() * @@ -1564,10 +2172,8 @@ Flag conv_fx( Word16 i, n; Word32 L_sum; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif y[0] = mult_r( x[0], h[0] ); move16(); FOR( n = 1; n < L; n++ ) @@ -1580,9 +2186,11 @@ Flag conv_fx( y[n] = mac_ro( L_sum, x[i], h[0], &Overflow ); move16(); } + return Overflow; } + /*-------------------------------------------------------------------* * conv_fx_32() * @@ -1590,6 +2198,7 @@ Flag conv_fx( * All vectors are of length L. Only the first L samples of the * convolution are considered. *-------------------------------------------------------------------*/ + Flag conv_fx_32( const Word16 x[], /* i : input vector Q_new*/ const Word16 h[], /* i : impulse response (or second input vector) Q(15)*/ @@ -1597,7 +2206,6 @@ Flag conv_fx_32( const Word16 L /* i : vector size */ ) { - Word16 i, n; Word32 L_sum; Flag Overflow = 0; @@ -1613,12 +2221,15 @@ Flag conv_fx_32( y[n] = L_mac_o( L_sum, x[i], h[0], &Overflow ); move32(); } + return Overflow; } -Word16 var_fx( /* o: variance of vector Qx*/ - const Word16 *x, /* i: input vector Qx*/ - const Word16 Qx, - const Word16 len /* i: length of inputvector */ + +/* o: variance of vector Qx*/ +Word16 var_fx( + const Word16 *x, /* i: input vector Qx*/ + const Word16 Qx, + const Word16 len /* i: length of inputvector */ ) { Word16 m; @@ -1651,15 +2262,17 @@ Word16 var_fx( /* o: variance of vector Qx*/ return v_16; } + /*---------------------------------------------------------------------* * std_fx() * * Calculate the standard deviation of a vector *---------------------------------------------------------------------*/ -Word16 std_fx( /* o: standard deviation */ - const Word16 x[], /* i: input vector */ - const Word16 len /* i: length of the input vector */ +/* o: standard deviation */ +Word16 std_fx( + const Word16 x[], /* i: input vector */ + const Word16 len /* i: length of the input vector */ ) { Word16 i; @@ -1686,14 +2299,14 @@ Word16 std_fx( /* o: standard deviation */ stdev = L_shl( stdev, sub( exp1, 1 ) ); /*30 */ } - return extract_h( stdev ); } -Word32 dot_product_mat_fx( /* o : the dot product x'*A*x */ - const Word16 *x, /* i : vector x Q15 */ - const Word32 *A, /* i : matrix A Q0*/ - const Word16 m /* i : vector & matrix size */ +/* o : the dot product x'*A*x */ +Word32 dot_product_mat_fx( + const Word16 *x, /* i : vector x Q15 */ + const Word32 *A, /* i : matrix A Q0*/ + const Word16 m /* i : vector & matrix size */ ) { @@ -1720,13 +2333,17 @@ Word32 dot_product_mat_fx( /* o : the dot product x'*A*x tmp_sum = W_sat_m( tmp_sum_64 ); suma = Madd_32_16( suma, tmp_sum, x[i] ); /*Q0 */ } + return suma; } + + /*-------------------------------------------------------------------* * Vr_subt * * Subtract two Word16 vectors integer by integer *-------------------------------------------------------------------*/ + void Vr_subt( const Word16 x1[], /* i : Input vector 1 */ const Word16 x2[], /* i : Input vector 2 */ @@ -1741,7 +2358,11 @@ void Vr_subt( y[i] = sub_sat( x1[i], x2[i] ); move16(); } + + return; } + + /*-------------------------------------------------------------------* * vquant() * @@ -1750,13 +2371,15 @@ void Vr_subt( * Searches a given codebook to find the nearest neighbour in Euclidean space. * Index of the winning codevector and the winning vector itself are returned. *-------------------------------------------------------------------*/ -Word16 vquant_ivas_fx( /* o: index of the winning codevector */ - Word32 x[], /* i: vector to quantize Q25 */ - const Word32 x_mean[], /* i: vector mean to subtract (0 if none) Q25 */ - Word32 xq[], /* o: quantized vector Q25 */ - const Word32 cb[], /* i: codebook Q25 */ - const Word16 dim, /* i: dimension of codebook vectors */ - const Word16 cbsize /* i: codebook size */ + +/* o: index of the winning codevector */ +Word16 vquant_ivas_fx( + Word32 x[], /* i: vector to quantize Q25 */ + const Word32 x_mean[], /* i: vector mean to subtract (0 if none) Q25 */ + Word32 xq[], /* o: quantized vector Q25 */ + const Word32 cb[], /* i: codebook Q25 */ + const Word16 dim, /* i: dimension of codebook vectors */ + const Word16 cbsize /* i: codebook size */ ) { Word16 c, d, idx, j; @@ -1820,13 +2443,14 @@ Word16 vquant_ivas_fx( /* o: index of the winning codevec return idx; } -Word16 vquant_fx( /* o: index of the winning codevector */ - Word16 x[], /* i: vector to quantize Q13 */ - const Word16 x_mean[], /* i: vector mean to subtract (0 if none) Q13 */ - Word16 xq[], /* o: quantized vector Q13 */ - const Word16 cb[], /* i: codebook Q13 */ - const Word16 dim, /* i: dimension of codebook vectors */ - const Word16 cbsize /* i: codebook size */ +/* o: index of the winning codevector */ +Word16 vquant_fx( + Word16 x[], /* i: vector to quantize Q13 */ + const Word16 x_mean[], /* i: vector mean to subtract (0 if none) Q13 */ + Word16 xq[], /* o: quantized vector Q13 */ + const Word16 cb[], /* i: codebook Q13 */ + const Word16 dim, /* i: dimension of codebook vectors */ + const Word16 cbsize /* i: codebook size */ ) { Word16 tmp; @@ -1891,6 +2515,7 @@ Word16 vquant_fx( /* o: index of the winning codevector return idx; } + /*-------------------------------------------------------------------* * w_vquant_fx() * @@ -1900,6 +2525,7 @@ Word16 vquant_fx( /* o: index of the winning codevector * Weights are put on the error for each vector element. * Index of the winning codevector and the winning vector itself are returned. *-------------------------------------------------------------------*/ + Word16 w_vquant_fx( Word16 x[], /* i: vector to quantize in Q10 */ Word16 Qx, @@ -1913,11 +2539,6 @@ Word16 w_vquant_fx( Word16 tmp; Word16 c, idx, j; Word32 dist, minDist; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - idx = 0; move16(); @@ -1933,25 +2554,25 @@ Word16 w_vquant_fx( { dist = L_deposit_l( 0 ); - tmp = sub_o( x[3], shr( cb[j++], Qx ), &Overflow ); + tmp = sub_sat( x[3], shr( cb[j++], Qx ) ); if ( weights[3] != 0 ) { - dist = L_mac0_o( dist, tmp, tmp, &Overflow ); + dist = L_mac0_sat( dist, tmp, tmp ); } - tmp = sub_o( x[2], shr( cb[j++], Qx ), &Overflow ); + tmp = sub_sat( x[2], shr( cb[j++], Qx ) ); if ( weights[2] != 0 ) { - dist = L_mac0_o( dist, tmp, tmp, &Overflow ); + dist = L_mac0_sat( dist, tmp, tmp ); } - tmp = sub_o( x[1], shr( cb[j++], Qx ), &Overflow ); + tmp = sub_sat( x[1], shr( cb[j++], Qx ) ); if ( weights[1] != 0 ) { - dist = L_mac0_o( dist, tmp, tmp, &Overflow ); + dist = L_mac0_sat( dist, tmp, tmp ); } - tmp = sub_o( x[0], shr( cb[j++], Qx ), &Overflow ); + tmp = sub_sat( x[0], shr( cb[j++], Qx ) ); if ( weights[0] != 0 ) { - dist = L_mac0_o( dist, tmp, tmp, &Overflow ); + dist = L_mac0_sat( dist, tmp, tmp ); } if ( LT_32( dist, minDist ) ) { @@ -1982,25 +2603,25 @@ Word16 w_vquant_fx( { dist = L_deposit_l( 0 ); - tmp = sub_o( x[0], shr( cb[j++], Qx ), &Overflow ); + tmp = sub_sat( x[0], shr( cb[j++], Qx ) ); if ( weights[0] != 0 ) { - dist = L_mac0_o( dist, tmp, tmp, &Overflow ); + dist = L_mac0_sat( dist, tmp, tmp ); } - tmp = sub_o( x[1], shr( cb[j++], Qx ), &Overflow ); + tmp = sub_sat( x[1], shr( cb[j++], Qx ) ); if ( weights[1] != 0 ) { - dist = L_mac0_o( dist, tmp, tmp, &Overflow ); + dist = L_mac0_sat( dist, tmp, tmp ); } - tmp = sub_o( x[2], shr( cb[j++], Qx ), &Overflow ); + tmp = sub_sat( x[2], shr( cb[j++], Qx ) ); if ( weights[2] != 0 ) { - dist = L_mac0_o( dist, tmp, tmp, &Overflow ); + dist = L_mac0_sat( dist, tmp, tmp ); } - tmp = sub_o( x[3], shr( cb[j++], Qx ), &Overflow ); + tmp = sub_sat( x[3], shr( cb[j++], Qx ) ); if ( weights[3] != 0 ) { - dist = L_mac0_o( dist, tmp, tmp, &Overflow ); + dist = L_mac0_sat( dist, tmp, tmp ); } if ( LT_32( dist, minDist ) ) { @@ -2028,16 +2649,20 @@ Word16 w_vquant_fx( return idx; } + + /*-------------------------------------------------------------------* * Emaximum: * * Find index of a maximum energy in a vector *-------------------------------------------------------------------*/ -Word16 emaximum_fx( /* o : return index with max energy value in vector Q0 */ - const Word16 Qvec, /* i : Q of input vector Q0 */ - const Word16 *vec, /* i : input vector Qx */ - const Word16 lvec, /* i : length of input vector Q0 */ - Word32 *ener_max /* o : maximum energy value Q0 */ + +/* o : return index with max energy value in vector Q0 */ +Word16 emaximum_fx( + const Word16 Qvec, /* i : Q of input vector Q0 */ + const Word16 *vec, /* i : input vector Qx */ + const Word16 lvec, /* i : length of input vector Q0 */ + Word32 *ener_max /* o : maximum energy value Q0 */ ) { Word16 j, ind; @@ -2066,11 +2691,12 @@ Word16 emaximum_fx( /* o : return index with max energy valu return ind; } -Word16 emaximum_32fx( /* o : return index with max energy value in vector Q0 */ - const Word16 Qvec, /* i : Q of input vector Q0 */ - const Word32 *vec, /* i : input vector Qx */ - const Word16 lvec, /* i : length of input vector Q0 */ - Word32 *ener_max /* o : maximum energy value Q0 */ +/* o : return index with max energy value in vector Q0 */ +Word16 emaximum_32fx( + const Word16 Qvec, /* i : Q of input vector Q0 */ + const Word32 *vec, /* i : input vector Qx */ + const Word16 lvec, /* i : length of input vector Q0 */ + Word32 *ener_max /* o : maximum energy value Q0 */ ) { Word16 j, ind; @@ -2103,14 +2729,16 @@ Word16 emaximum_32fx( /* o : return index with max energy va return ind; } + /*-------------------------------------------------------------------* * mean32: * * Find the mean of a 32 bits vector *-------------------------------------------------------------------*/ -Word32 Mean32( /* o : mean of the elements of the vector */ - const Word32 in[], /* i : input vector */ - const Word16 L /* i : length of input vector */ +/* o : mean of the elements of the vector */ +Word32 Mean32( + const Word32 in[], /* i : input vector */ + const Word16 L /* i : length of input vector */ ) { Word32 Ltmp; @@ -2130,9 +2758,11 @@ Word32 Mean32( /* o : mean of the elements of the vector */ return Ltmp; } -Word32 sum32_fx( /* o : sum of all vector elements Qx*/ - const Word32 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ + +/* o : sum of all vector elements Qx*/ +Word32 sum32_fx( + const Word32 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ ) { Word16 i; @@ -2146,9 +2776,11 @@ Word32 sum32_fx( /* o : sum of all vector elements return tmp; } -Word16 sum16_fx( /* o : sum of all vector elements Qx*/ - const Word16 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ + +/* o : sum of all vector elements Qx*/ +Word16 sum16_fx( + const Word16 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ ) { Word16 i; @@ -2162,27 +2794,34 @@ Word16 sum16_fx( /* o : sum of all vector elements return tmp; } + + /*------------------------------------------------------------------* * function Random * * Signed 16 bits random generator. *------------------------------------------------------------------*/ -Word16 Random( /* o : output random value */ - Word16 *seed /* i/o: random seed */ + +/* o : output random value */ +Word16 Random( + Word16 *seed /* i/o: random seed */ ) { *seed = extract_l( L_mac0( 13849L, *seed, 31821 ) ); move16(); + return *seed; } -Word16 own_random2_fx( Word16 seed ) +Word16 own_random2_fx( + Word16 seed ) { return extract_l( L_mac0( 13849, seed, 31821 ) ); } + /*--------------------------------------------------------------------- - * sign() + * sign_fx() * *---------------------------------------------------------------------*/ @@ -2215,12 +2854,16 @@ Word16 sign16_fx( } } + /*------------------------------------------------------------------* * function Div_32_optmz * * Performs 32 bits interger division *------------------------------------------------------------------*/ -static Word32 Div_32_optmz( Word32 L_num, Word16 denom_hi ) + +static Word32 Div_32_optmz( + Word32 L_num, + Word16 denom_hi ) { Word16 approx, hi, lo, n_hi, n_lo; Word32 L_32; @@ -2244,12 +2887,15 @@ static Word32 Div_32_optmz( Word32 L_num, Word16 denom_hi ) return ( L_32 ); } + + /*------------------------------------------------------------------* * function iDiv_and_mod_32 * * return the quotient and the modulo 32 bits numerator divided by a 16 bit denominator * The denominator might be right shifted by 1 *------------------------------------------------------------------*/ + void iDiv_and_mod_32( const Word32 Numer, /* i : 32 bits numerator */ const Word16 Denom, /* i : 16 bits denominator */ @@ -2426,6 +3072,8 @@ void pz_filter_sp_fx( y[i] = extract_h( Ltemp1 ); /* y[i] in Qn */ move16(); } + + return; } @@ -2468,10 +3116,7 @@ Word32 root_a_over_b_fx( Word16 tmp, num, den, scale; Word16 exp, exp_num, exp_den; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + test(); IF( ( a <= 0 ) || ( b <= 0 ) ) { @@ -2481,15 +3126,15 @@ Word32 root_a_over_b_fx( } exp_num = norm_l( b ); - num = round_fx_o( L_shl_o( b, exp_num, &Overflow ), &Overflow ); + num = round_fx_sat( L_shl_sat( b, exp_num ) ); exp_num = sub( sub( 30, exp_num ), Q_b ); exp_den = norm_l( a ); - den = round_fx_o( L_shl_o( a, exp_den, &Overflow ), &Overflow ); + den = round_fx_sat( L_shl_sat( a, exp_den ) ); exp_den = sub( sub( 30, exp_den ), Q_a ); scale = shr( sub( den, num ), 15 ); - num = shl_o( num, scale, &Overflow ); + num = shl_sat( num, scale ); exp_num = sub( exp_num, scale ); tmp = div_s( num, den ); @@ -2504,6 +3149,7 @@ Word32 root_a_over_b_fx( return L_tmp; } + Word32 root_a_over_b_ivas_fx( Word32 a, /* Q(Q_a) */ Word16 Q_a, @@ -2607,6 +3253,7 @@ Word32 root_a_over_b_ivas_fx( return approx; } + /*===================================================================*/ /* FUNCTION : fir_fx () */ /*-------------------------------------------------------------------*/ @@ -2630,25 +3277,23 @@ Word32 root_a_over_b_ivas_fx( /*-------------------------------------------------------------------*/ /* RETURN ARGUMENTS : _ None. */ /*===================================================================*/ -void fir_fx( const Word16 x[], /* i : input vector Qx*/ - const Word16 h[], /* i : impulse response of the FIR filter Q12*/ - Word16 y[], /* o : output vector (result of filtering) Qx*/ - Word16 mem[], /* i/o: memory of the input signal (L samples) Qx*/ - const Word16 L, /* i : input vector size */ - const Word16 K, /* i : order of the FIR filter (K+1 coefs.) */ - const Word16 upd /* i : 1 = update the memory, 0 = not */ - , - Word16 shift /* i : difference between Q15 and scaling of h[] */ + +void fir_fx( + const Word16 x[], /* i : input vector Qx*/ + const Word16 h[], /* i : impulse response of the FIR filter Q12*/ + Word16 y[], /* o : output vector (result of filtering) Qx*/ + Word16 mem[], /* i/o: memory of the input signal (L samples) Qx*/ + const Word16 L, /* i : input vector size */ + const Word16 K, /* i : order of the FIR filter (K+1 coefs.) */ + const Word16 upd, /* i : 1 = update the memory, 0 = not */ + Word16 shift /* i : difference between Q15 and scaling of h[] */ ) { Word16 buf_in[L_FRAME32k + L_FILT_MAX]; Word16 i, j; Word32 s; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + /* prepare the input buffer (copy and update memory) */ Copy( mem, buf_in, K ); Copy( x, buf_in + K, L ); @@ -2660,18 +3305,22 @@ void fir_fx( const Word16 x[], /* i : input vector /* do the filtering */ FOR( i = 0; i < L; i++ ) { - s = L_mult_o( buf_in[K + i], h[0], &Overflow ); + s = L_mult_sat( buf_in[K + i], h[0] ); FOR( j = 1; j <= K; j++ ) { - s = L_mac_o( s, h[j], buf_in[K + i - j], &Overflow ); + s = L_mac_sat( s, h[j], buf_in[K + i - j] ); } - s = L_shl_o( s, shift, &Overflow ); - y[i] = round_fx_o( s, &Overflow ); /*Qx */ + + s = L_shl_sat( s, shift ); + y[i] = round_fx_sat( s ); /*Qx */ move16(); } + + return; } + /*-------------------------------------------------------------------* * v_add_32() * @@ -2793,19 +3442,18 @@ void v_sub_16( /*--------------------------------------------------------------------------------*/ /* squant_fx() */ /*--------------------------------------------------------------------------------*/ -Word16 squant_fx( /* o: index of the winning codeword */ - const Word16 x, /* i: scalar value to quantize */ - Word16 *xq, /* o: quantized value */ - const Word16 cb[], /* i: codebook */ - const Word16 cbsize /* i: codebook size */ + +/* o: index of the winning codeword */ +Word16 squant_fx( + const Word16 x, /* i: scalar value to quantize */ + Word16 *xq, /* o: quantized value */ + const Word16 cb[], /* i: codebook */ + const Word16 cbsize /* i: codebook size */ ) { Word16 tmp; Word16 c, idx; Word32 L_mindist, L_dist; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif idx = 0; move16(); @@ -2815,10 +3463,10 @@ Word16 squant_fx( /* o: index of the winning codeword */ FOR( c = 0; c < cbsize; c++ ) { L_dist = L_deposit_l( 0 ); - tmp = sub_o( x, cb[c], &Overflow ); + tmp = sub_sat( x, cb[c] ); /*dist += tmp*tmp; */ - L_dist = L_mac_o( L_dist, tmp, tmp, &Overflow ); + L_dist = L_mac_sat( L_dist, tmp, tmp ); if ( LT_32( L_dist, L_mindist ) ) { @@ -2887,7 +3535,7 @@ Word16 squant_int_fx( /*-------------------------------------------------------------------*/ /* INPUT/OUTPUT ARGUMENTS : */ /* */ -/* _ (Word32 []) buf : filter memory (Qx+Qc) */ +/* _ (Word32 []) buf : filter memory (Qx+Qc) */ /*-------------------------------------------------------------------*/ /* RETURN ARGUMENTS : _ None. */ /*===================================================================*/ @@ -2939,27 +3587,28 @@ void pz_filter_dp_fx( y[i] = extract_h( Ltemp1 ); /* y[i] in Qn */ move16(); } + + return; } + /*-------------------------------------------------------------------* * Copy_Scale_sig * * Up/down scale a 16 bits vector x and move it into y *-------------------------------------------------------------------*/ + void Copy_Scale_sig32( const Word32 x[], /* i : signal to scale input Qx */ Word32 y[], /* o : scaled signal output Qx */ const Word16 lg, /* i : size of x[] Q0 */ - const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ ) { Word16 i; Word32 L_tmp; Word16 tmp = exp0; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + IF( exp0 == 0 ) { FOR( i = 0; i < lg; i++ ) @@ -2973,17 +3622,21 @@ void Copy_Scale_sig32( { FOR( i = 0; i < lg; i++ ) { - y[i] = L_shl_o( x[i], tmp, &Overflow ); + y[i] = L_shl_sat( x[i], tmp ); move16(); } return; } - L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); + + L_tmp = L_shl_sat( 1, exp0 - 1 ); + FOR( i = 0; i < lg; i++ ) { y[i] = W_extract_l( W_mult_32_32( L_tmp, x[i] ) ); move32(); /* saturation can occur here */ } + + return; } @@ -3018,6 +3671,8 @@ void Copy_Scale_sig32_16( *dst++ = round_fx_sat( L_temp ); move16(); } + + return; } /*-------------------------------------------------------------------* @@ -3042,11 +3697,16 @@ void v_multc_att( move16(); } } -} /*-------------------------------------------------------------------* - * v_multc_att32() - * - * Attenuation of a vector,, attenuation factor in Q15 - *-------------------------------------------------------------------*/ + + return; +} + + +/*-------------------------------------------------------------------* + * v_multc_att32() + * + * Attenuation of a vector,, attenuation factor in Q15 + *-------------------------------------------------------------------*/ void v_multc_att32( const Word32 x[], /* i : Input vector Qx */ @@ -3064,6 +3724,8 @@ void v_multc_att32( move32(); } } + + return; } /*-------------------------------------------------------------------* @@ -3088,6 +3750,8 @@ void v_multc_att3232( move32(); } } + + return; } /*-------------------------------------------------------------------* @@ -3155,17 +3819,14 @@ void add_vec_fx( ) { Word16 i, Qyx1, Qyx2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + Qyx1 = sub( Qx1, Qy ); Qyx2 = sub( Qx2, Qy ); IF( Qyx1 == 0 ) { FOR( i = 0; i < N; i++ ) { - y[i] = add_o( x1[i], shr_ro( x2[i], Qyx2, &Overflow ), &Overflow ); + y[i] = add_sat( x1[i], shr_r_sat( x2[i], Qyx2 ) ); move16(); } } @@ -3173,24 +3834,28 @@ void add_vec_fx( { FOR( i = 0; i < N; i++ ) { - y[i] = add_o( shr_ro( x1[i], Qyx1, &Overflow ), shr_ro( x2[i], Qyx2, &Overflow ), &Overflow ); + y[i] = add_sat( shr_r_sat( x1[i], Qyx1 ), shr_r_sat( x2[i], Qyx2 ) ); //!!sat //!!sat move16(); } } + return; } + /*-------------------------------------------------------------------* * Add_flt32_flt32 * * Add two Pseudo Float Value that are 32 Bits Mantisa and 16 Bits Exp *-------------------------------------------------------------------*/ -Word32 Add_flt32_flt32( /* o: Result (Normalized) */ - Word32 a, /* i: 1st Value */ - Word16 exp_a, /* i: Exponent of 1st Value (Q of Value) */ - Word32 b, /* i: 2nd Value */ - Word16 exp_b, /* i: Exponent of 2nd Value (Q of Value) */ - Word16 *exp_out /* o: Exponent of Result */ + +/* o: Result (Normalized) */ +Word32 Add_flt32_flt32( + Word32 a, /* i: 1st Value */ + Word16 exp_a, /* i: Exponent of 1st Value (Q of Value) */ + Word32 b, /* i: 2nd Value */ + Word16 exp_b, /* i: Exponent of 2nd Value (Q of Value) */ + Word16 *exp_out /* o: Exponent of Result */ ) { Word16 temp, temp2; @@ -3215,16 +3880,19 @@ Word32 Add_flt32_flt32( /* o: Result (Normalized) return L_shl( L_temp, temp2 ); } + /*-------------------------------------------------------------------* * Mul_flt32_Q15 * * Multiply one Pseudo Float Value (32 Bits Mantisa and 16 Bits Exp) * with a Q15 value *-------------------------------------------------------------------*/ -Word32 Mul_flt32_Q15( /* o: Result (Normalized) */ - Word32 value, /* i: Pseudo_float Value */ - Word16 *exp_v, /*i/o: Exponent of Value (Q of Value) */ - Word16 frac /* i: Q15 value */ + +/* o: Result (Normalized) */ +Word32 Mul_flt32_Q15( + Word32 value, /* i: Pseudo_float Value */ + Word16 *exp_v, /*i/o: Exponent of Value (Q of Value) */ + Word16 frac /* i: Q15 value */ ) { Word16 temp; @@ -3239,18 +3907,21 @@ Word32 Mul_flt32_Q15( /* o: Result (Normalized) */ return L_shl( L_temp, temp ); } + /*-------------------------------------------------------------------* * Div_flt32_flt32 * * Divide one Pseudo Float Value (32 Bits Mantisa and 16 Bits Exp) * by another one *-------------------------------------------------------------------*/ -Word32 Div_flt32_flt32( /* o: Result (Normalized) */ - Word32 a, /* i: 1st Value */ - Word16 exp_a, /* i: Exponent of 1st Value (Q of Value) */ - Word32 b, /* i: 2nd Value */ - Word16 exp_b, /* i: Exponent of 2nd Value (Q of Value) */ - Word16 *exp_out /* o: Exponent of Result */ + +/* o: Result (Normalized) */ +Word32 Div_flt32_flt32( + Word32 a, /* i: 1st Value */ + Word16 exp_a, /* i: Exponent of 1st Value (Q of Value) */ + Word32 b, /* i: 2nd Value */ + Word16 exp_b, /* i: Exponent of 2nd Value (Q of Value) */ + Word16 *exp_out /* o: Exponent of Result */ ) { Word16 temp, temp2; @@ -3275,20 +3946,20 @@ Word32 Div_flt32_flt32( /* o: Result (Normalized) * * Calculate Energy with overflow protection *-------------------------------------------------------------------*/ -Word32 Calc_Energy_Autoscaled( /* o: Result (Energy) */ - const Word16 *signal, /* i: Signal */ - Word16 signal_exp, /* i: Exponent of Signal (Q of Signal) */ - Word16 len, /* i: Frame Length */ - Word16 *energy_exp /* o: Exponent of Energy (Q of Energy) */ + +/* o: Result (Energy) */ +Word32 Calc_Energy_Autoscaled( + const Word16 *signal, /* i: Signal */ + Word16 signal_exp, /* i: Exponent of Signal (Q of Signal) */ + Word16 len, /* i: Frame Length */ + Word16 *energy_exp /* o: Exponent of Energy (Q of Energy) */ ) { Word16 temp, temp2; Word32 L_temp, L_Energy; Word16 i, j; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif Overflow = 0; move16(); @@ -3300,7 +3971,7 @@ Word32 Calc_Energy_Autoscaled( /* o: Result (Energy) FOR( i = 0; i < j; i++ ) { /* divide by 2 so energy will be divided by 4 */ - temp = mult_ro( *signal++, 16384, &Overflow ); + temp = mult_r( *signal++, 16384 ); L_Energy = L_mac0_o( L_Energy, temp, temp, &Overflow ); } FOR( i = j; i < len; i += 8 ) /* Process 8 Samples at a time */ @@ -3310,11 +3981,11 @@ Word32 Calc_Energy_Autoscaled( /* o: Result (Energy) L_temp = L_mult0( temp, temp ); FOR( j = 1; j < 8; j++ ) { - temp = mult_ro( *signal++, 16384, &Overflow ); + temp = mult_r( *signal++, 16384 ); L_temp = L_mac0_o( L_temp, temp, temp, &Overflow ); } - - L_temp = L_shr_o( L_temp, temp2, &Overflow ); + /*Overfloe will never happen because temp2 is always positive*/ + L_temp = L_shr( L_temp, temp2 ); /* Here we try the addition just to check if we can sum the energy of the small (8 Iterations) loop with the total energy calculated so far without an overflow. @@ -3342,7 +4013,9 @@ Word32 Calc_Energy_Autoscaled( /* o: Result (Energy) return L_Energy; } -Word16 Find_Max_Norm16( const Word16 *src, Word16 len ) +Word16 Find_Max_Norm16( + const Word16 *src, + Word16 len ) { Word16 i; Word16 max16; @@ -3360,7 +4033,9 @@ Word16 Find_Max_Norm16( const Word16 *src, Word16 len ) return norm_s( max16 ); } -Word16 Find_Max_Norm32( const Word32 *src, Word16 len ) +Word16 Find_Max_Norm32( + const Word32 *src, + Word16 len ) { Word16 i; Word32 max32; @@ -3375,17 +4050,20 @@ Word16 Find_Max_Norm32( const Word32 *src, Word16 len ) return norm_l( max32 ); } + /*-------------------------------------------------------------------* * Sqrt_Ratio32 * * Calculate Sqrt of Val1/Val2 *-------------------------------------------------------------------*/ -Word32 Sqrt_Ratio32( /* o: Result in Q31 */ - Word32 L_val1, /* i: Mantisa of Val1 */ - Word16 exp1, /* i: Exp of Val1 (>0: Val was Left Shifted, <0:Right Shifted) */ - Word32 L_val2, /* i: Mantisa of Val2 */ - Word16 exp2, /* i: Exp of Val2 (same as exp1) */ - Word16 *exp /* o: Exp of Result (# of 'L_shl' Req to get to Final Value) */ + +/* o: Result in Q31 */ +Word32 Sqrt_Ratio32( + Word32 L_val1, /* i: Mantisa of Val1 */ + Word16 exp1, /* i: Exp of Val1 (>0: Val was Left Shifted, <0:Right Shifted) */ + Word32 L_val2, /* i: Mantisa of Val2 */ + Word16 exp2, /* i: Exp of Val2 (same as exp1) */ + Word16 *exp /* o: Exp of Result (# of 'L_shl' Req to get to Final Value) */ ) { Word16 temp; @@ -3426,9 +4104,10 @@ Word32 Sqrt_Ratio32( /* o: Result in Q31 return L_val1; } -Word16 Invert16( /* result in Q'15 + 'exp' */ - Word16 val, - Word16 *exp ) +/* result in Q'15 + 'exp' */ +Word16 Invert16( + Word16 val, + Word16 *exp ) { Word16 temp; @@ -3446,7 +4125,10 @@ Word16 Invert16( /* result in Q'15 + 'exp' */ return temp; } -Word16 find_rem( Word16 n, Word16 m, Word16 *r ) +Word16 find_rem( + Word16 n, + Word16 m, + Word16 *r ) { Word16 i, q1, q2, qd; Word32 Ltemp2; @@ -3488,11 +4170,15 @@ Word16 find_rem( Word16 n, Word16 m, Word16 *r ) Ltemp2 = L_shr( Lacc, q2 ); *r = extract_h( Ltemp2 ); move16(); + return ( q1 ); } -Word32 find_remd( Word32 n, Word32 m, Word32 *r ) +Word32 find_remd( + Word32 n, + Word32 m, + Word32 *r ) { Word16 i, q1, q2, qd; Word32 Ltemp2, qo; @@ -3536,9 +4222,11 @@ Word32 find_remd( Word32 n, Word32 m, Word32 *r ) } *r = L_shr( Lacc, q2 ); move16(); + return ( qo ); } + Word16 rint_new_fx( Word32 x /*Q16 */ ) @@ -3601,7 +4289,15 @@ Word16 rint_new_fx( /* CALLED FROM : TX */ /*===================================================================*/ -Word16 erb_diff_search_fx( Word16 *prev_erb, const Word16 *curr_erb, Word16 *dif_erb, Word16 *pow_spec, const Word16 *cb_fx, Word16 cb_size, Word16 cb_dim, Word16 offset ) +Word16 erb_diff_search_fx( + Word16 *prev_erb, + const Word16 *curr_erb, + Word16 *dif_erb, + Word16 *pow_spec, + const Word16 *cb_fx, + Word16 cb_size, + Word16 cb_dim, + Word16 offset ) { Word16 i, j, mmseindex; Word16 dh, dl; @@ -3638,8 +4334,8 @@ Word16 erb_diff_search_fx( Word16 *prev_erb, const Word16 *curr_erb, Word16 *dif } ELSE { - dh = sub( dif_erb[i + offset], cb_fx[j * cb_dim + i] ); /* Q13 */ - Ltemp1 = L_mult( dh, dh ); /* Q27 */ + dh = sub_sat( dif_erb[i + offset], cb_fx[j * cb_dim + i] ); /* Q13 */ + Ltemp1 = L_mult_sat( dh, dh ); /* Q27 */ dh = extract_h( Ltemp1 ); dl = extract_l( Ltemp1 ); @@ -3686,6 +4382,8 @@ Word16 erb_diff_search_fx( Word16 *prev_erb, const Word16 *curr_erb, Word16 *dif return ( mmseindex ); } + + void Acelp_dec_total_exc( Word16 *exc_fx, /* i/o: adapt. excitation exc */ Word16 *exc2_fx, /* i/o: adapt. excitation/total exc */ @@ -3708,14 +4406,20 @@ void Acelp_dec_total_exc( move16(); move16(); } + + return; } + /*-------------------------------------------------------------------* * UL_inverse * * Calculate inverse of UL_val. Output in Q_exp. *-------------------------------------------------------------------*/ -UWord32 UL_inverse( const UWord32 UL_val, Word16 *exp ) + +UWord32 UL_inverse( + const UWord32 UL_val, + Word16 *exp ) { UWord32 UL_tmp; @@ -3735,7 +4439,10 @@ UWord32 UL_inverse( const UWord32 UL_val, Word16 *exp ) * Calculate UL_num/UL_den. UL_num assumed to be Q31, UL_den assumed * to be Q32, then result is in Q32. *-------------------------------------------------------------------*/ -UWord32 UL_div( const UWord32 UL_num, const UWord32 UL_den ) + +UWord32 UL_div( + const UWord32 UL_num, + const UWord32 UL_den ) { UWord32 UL_e, UL_Q; UWord32 UL_msb, UL_lsb; @@ -3775,9 +4482,11 @@ Word16 ratio( const Word32 numer, const Word32 denom, Word16 *expo ) *expo = sub( expNumer, expDenom ); move16(); + return quotient; /* Q14 */ } + /*-----------------------------------------------------------------------* * Function hp400_12k8() * * * @@ -3798,6 +4507,7 @@ Word16 ratio( const Word32 numer, const Word32 denom, Word16 *expo ) * float --> b[3] = {0.893554687, -1.787109375, 0.893554687}; * * a[3] = {1.000000000, 1.787109375, -0.864257812}; * *-----------------------------------------------------------------------*/ + void hp400_12k8_fx( Word16 signal[], /* i/o: input signal / output is divided by 16 */ const Word16 lg, /* i : lenght of signal */ @@ -3875,18 +4585,76 @@ void hp400_12k8_fx( return; } -Word16 dot_prod_satcontr( const Word16 *x, const Word16 *y, Word16 qx, Word16 qy, Word16 *qo, Word16 len ) + +void hp400_12k8_ivas_fx( + Word16 signal[], /* i/o: input signal / output is divided by 16 */ + const Word16 lg, /* i : lenght of signal */ + Word16 mem[] /* i/o: filter memory [6] */ +) +{ + Word16 i; + Word16 x0, x1, x2; + Word32 L_tmp, yy1, y2; + + yy1 = L_Comp( mem[2], mem[3] ); /* Q_syn + 13 */ + y2 = L_Comp( mem[0], mem[1] ); /* Q_syn + 13 */ + x0 = mem[4]; /* Q_syn */ + move16(); + x1 = mem[5]; /* Q_syn */ + move16(); + + FOR( i = 0; i < lg; i++ ) + { + x2 = x1; /* Q_syn */ + move16(); + x1 = x0; /* Q_syn */ + move16(); + x0 = signal[i]; /* Q_syn */ + move16(); + + L_tmp = Mpy_32_16_1( yy1, a_hp400_ivas_fx[1] ); /*yy1 * a_hp400[1]*/ /* Qx(Q_of_yy1) + 10 ---->( (Q_syn+13) + 12 - 15)*/ + L_tmp = Madd_32_16( L_tmp, y2, a_hp400_ivas_fx[2] ); /*y2 * a_hp400[2]*/ /* Qx + 10 ---->( (Q_syn+13) + 12 - 15)*/ + L_tmp = L_shl( L_tmp, 3 ); /* shifting by 3 to maintain same Q (Q_syn+13) */ + + L_tmp = L_mac( L_tmp, x0, b_hp400_fx[0] ); /* Q_syn + 13 */ + L_tmp = L_mac( L_tmp, x1, b_hp400_fx[1] ); /* Q_syn + 13 */ + L_tmp = L_mac( L_tmp, x2, b_hp400_fx[2] ); /* Q_syn + 13 */ + + y2 = yy1; /* Q_syn + 13 */ + move32(); + yy1 = L_tmp; /* Q_syn + 13 */ + move32(); + + signal[i] = round_fx( L_tmp ); /* Q_syn - 3 */ + move16(); + } + + L_Extract( yy1, &mem[2], &mem[3] ); + L_Extract( y2, &mem[0], &mem[1] ); + mem[4] = x0; /* Q_syn */ + mem[5] = x1; /* Q_syn */ + move16(); + move16(); + + return; +} + + +Word16 dot_prod_satcontr( + const Word16 *x, + const Word16 *y, + Word16 qx, + Word16 qy, + Word16 *qo, + Word16 len ) { Word16 tmp_tab_x[L_FRAME16k]; Word16 tmp_tab_y[L_FRAME16k]; Word16 shift, q, ener, i; Word32 L_tmp; Word16 *pt1, *pt2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif - Copy( x, tmp_tab_x, len ); /* OPTIMIZE !!!!! the copy into local table is not necessary */ Copy( y, tmp_tab_y, len ); /* could be reworked to do a 1st iteration with the original x[] and y[] */ @@ -3922,6 +4690,7 @@ Word16 dot_prod_satcontr( const Word16 *x, const Word16 *y, Word16 qx, Word16 qy q = add( q, add( qx, qy ) ); *qo = sub( q, add( shift, 16 ) ); move16(); + return ener; } @@ -3943,7 +4712,11 @@ Word16 dot_prod_satcontr( const Word16 *x, const Word16 *y, Word16 qx, Word16 qy * Returns: * void */ -void E_UTIL_f_convolve( const Word16 x[], const Word16 h[], Word16 y[], const Word16 size ) +void E_UTIL_f_convolve( + const Word16 x[], + const Word16 h[], + Word16 y[], + const Word16 size ) { Word16 i, n; Word32 L_sum; @@ -3961,14 +4734,17 @@ void E_UTIL_f_convolve( const Word16 x[], const Word16 h[], Word16 y[], const Wo y[n] = mac_r( L_sum, x[i], h[0] ); move16(); } + return; } + /*----------------------------------------------------------------------------- * floating_point_add: * * Add two floating point numbers: x <- x + y. *----------------------------------------------------------------------------*/ + void floating_point_add( Word32 *mx, /* io: mantissa of the addend Q31 */ Word16 *ex, /* io: exponent of the addend Q0 */ @@ -4002,9 +4778,11 @@ void floating_point_add( *ex = sub( add( *ex, expo ), 1 ); /* Subtract 1 due to 1-bit down-shift above ensuring 1 bit headroom before addition. */ move32(); move16(); + return; } + /*-------------------------------------------------------------------* * delay_signal_fx() * @@ -4073,23 +4851,7 @@ void delay_signal_q_adj_fx( return; } -void v_add_fx( - const Word32 x1[], /* i : Input vector 1 */ - const Word32 x2[], /* i : Input vector 2 */ - Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ - const Word16 N /* i : Vector length */ -) -{ - Word16 i; - - FOR( i = 0; i < N; i++ ) - { - y[i] = L_add_sat( x1[i], x2[i] ); - move32(); - } - return; -} Word16 floor_log_2( Word32 num ) { @@ -4137,6 +4899,7 @@ void v_shr_16( return; } + /*---------------------------------------------------------------------* * lin_interp_fx() * @@ -4217,8 +4980,9 @@ Word16 lin_interp_ivas_fx( return add_sat( y1, round_fx( L_shl( L_mult( sub( x, x1 ), div_res ), div_res_e ) ) ); } + /*--------------------------------------------------------------------- - * sign() + * sign_l() * *---------------------------------------------------------------------*/ @@ -4237,7 +5001,7 @@ Word32 sign_l( } } -void v_mult16_fixed( +void v_mult16_fx( const Word16 x1[], /* i : Input vector 1 */ const Word16 x2[], /* i : Input vector 2 */ Word16 y[], /* o : Output vector that contains vector 1 .* vector 2 */ @@ -4256,7 +5020,7 @@ void v_mult16_fixed( } /*---------------------------------------------------------------------* - * set_zero() + * set_zero_fx() * * Set a vector vec[] of dimension lvec to zero *---------------------------------------------------------------------*/ @@ -4276,6 +5040,7 @@ void set_zero_fx( return; } + void set_zero2_fx( Word32 *vec, /* o : input vector */ const Word32 lvec /* i : length of the vector */ @@ -4403,7 +5168,7 @@ Word32 dotp_me_fx( return suma; } -Word32 dotp_fixed_guarded( +Word32 dotp_fx_guarded( const Word32 x[], /* i : vector x[] */ const Word32 y[], /* i : vector y[] */ const Word16 n /* i : vector length */ @@ -4423,7 +5188,7 @@ Word32 dotp_fixed_guarded( } -Word32 dotp_fixed_ivas_fx( +Word32 dotp_fx_ivas_fx( const Word32 x[], /* i : vector x[] */ Word16 x_e, const Word32 y[], /* i : vector y[] */ @@ -4444,17 +5209,18 @@ Word32 dotp_fixed_ivas_fx( *out_e = exp; move16(); + return suma; } + /*-------------------------------------------------------------------* * v_mult() * * Multiplication of two vectors *-------------------------------------------------------------------*/ - -void v_mult_fixed( +void v_mult_fx( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ Word32 y[], /* o : Output vector that contains vector 1 .* vector 2 */ @@ -4472,12 +5238,16 @@ void v_mult_fixed( return; } + /*-------------------------------------------------------------------* - * anint_fixed() + * anint_fx() * * Round to the nearest integer. *-------------------------------------------------------------------*/ -Word32 anint_fixed( Word32 x, Word16 exp ) + +Word32 anint_fx( + const Word32 x, + const Word16 exp ) { IF( x == 0 ) { @@ -4493,20 +5263,26 @@ Word32 anint_fixed( Word32 x, Word16 exp ) } } + /*-------------------------------------------------------------------* - * ceil_fixed() + * ceil_fx() * * Ceil to the next multiple of (1 << exp). *-------------------------------------------------------------------*/ -Word32 ceil_fixed( Word32 x, Word16 exp ) + +Word32 ceil_fx( + const Word32 x, + const Word16 exp ) { Word32 step; + // step = x / L_shl( 1, exp ); step = L_shr( x, exp ); IF( ( x % L_shl( 1, exp ) ) > 0 ) { step = L_add( step, 1 ); } + return L_shl( step, exp ); } @@ -4534,13 +5310,33 @@ void sort_l( return; } + /*-------------------------------------------------------------------* - * v_add_fixed() + * v_add() * * Subtraction of two vectors sample by sample *-------------------------------------------------------------------*/ -void v_add_fixed( +void v_add_fx( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ + const Word16 N /* i : Vector length */ +) +{ + Word16 i; + + FOR( i = 0; i < N; i++ ) + { + y[i] = L_add_sat( x1[i], x2[i] ); + move32(); + } + + return; +} + + +void v_add_fx_hdrm( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ @@ -4559,7 +5355,25 @@ void v_add_fixed( return; } -void v_add_fixed_me( +void v_add_fx_no_hdrm( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ + const Word16 N /* i : Vector length */ +) +{ + Word16 i; + + FOR( i = 0; i < N; i++ ) + { + y[i] = L_add( x1[i], x2[i] ); + move32(); + } + + return; +} + +void v_add_fx_me( const Word32 x1[], /* i : Input vector 1 */ const Word16 x1_e, /* i : Exponent for input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ @@ -4585,3 +5399,206 @@ void v_add_fixed_me( return; } + +Word16 find_guarded_bits_fx( + const Word32 n ) +{ + // return n <= 1 ? 0 : n <= 2 ? 1 + // : n <= 4 ? 2 + // : n <= 8 ? 3 + // : n <= 16 ? 4 + // : n <= 32 ? 5 + // : n <= 64 ? 6 + // : n <= 128 ? 7 + // : n <= 256 ? 8 + // : n <= 512 ? 9 + // : n <= 1024 ? 10 + // : n <= 2048 ? 11 + // : n <= 4096 ? 12 + // : n <= 8192 ? 13 + // : n <= 16384 ? 14 + // : 15; + /*Word16 val = 0; + move32(); + test(); + WHILE( GT_32( n, L_shl( 1, val ) ) && LT_32( val, 16 ) ) + { + val = add( val, 1 ); + }*/ + IF( LE_32( n, 1 ) ) + { + return 0; + } + ELSE + { + + return sub( 31, norm_l( L_sub( n, 1 ) ) ); + } +} + + +Word16 L_norm_arr( + const Word32 *arr, + Word16 size ) +{ + Word16 q = 31; + move16(); + + FOR( Word16 i = 0; i < size; i++ ) + { + Word16 q_tst; + + q_tst = norm_l( arr[i] ); + if ( arr[i] != 0 ) + { + q = s_min( q, q_tst ); + } + } + + return q; +} + +Word16 norm_arr( + Word16 *arr, + Word16 size ) +{ + Word16 q = 15; + Word16 exp = 0; + move16(); + move16(); + + FOR( Word16 i = 0; i < size; i++ ) + { + if ( arr[i] != 0 ) + { + exp = norm_s( arr[i] ); + } + if ( arr[i] != 0 ) + { + q = s_min( q, exp ); + } + } + + return q; +} + +Word16 W_norm_arr( + Word64 *arr, + Word16 size ) +{ + Word16 q = 63; + Word16 exp = 0; + move16(); + move16(); + + FOR( Word16 i = 0; i < size; i++ ) + { + if ( arr[i] != 0 ) + { + exp = W_norm( arr[i] ); + } + if ( arr[i] != 0 ) + { + q = s_min( q, exp ); + } + } + + return q; +} + +Word16 get_min_scalefactor( + Word32 x, + Word32 y ) +{ + Word16 scf_y; + Word16 scf = Q31; + move16(); + + test(); + if ( x == 0 && y == 0 ) + { + scf = 0; + move16(); + } + + if ( x != 0 ) + { + scf = norm_l( x ); + } + + scf_y = norm_l( y ); + if ( y != 0 ) + { + scf = s_min( scf_y, scf ); + } + + return scf; +} + + +Flag is_zero_arr( + Word32 *arr, + Word16 size ) +{ + FOR( Word16 i = 0; i < size; i++ ) + { + IF( arr[i] != 0 ) + { + return 0; + } + } + + return 1; +} + +Flag is_zero_arr16( + Word16 *arr, + Word16 size ) +{ + FOR( Word16 i = 0; i < size; i++ ) + IF( arr[i] != 0 ) + { + return 0; + } + + return 1; +} + +Flag is_zero_arr64( + Word64 *arr, + Word16 size ) +{ + FOR( Word16 i = 0; i < size; i++ ) + { + IF( arr[i] != 0 ) + { + return 0; + } + } + return 1; +} + +void Scale_sig64( + Word64 x[], /* i/o: signal to scale Qx */ + Word16 len, /* i : size of x[] Q0 */ + Word16 exp /* i : exponent: x = round(x << exp) Qx exp */ +) +{ + Word16 i; + + assert( exp <= 63 && exp >= -63 ); + + IF( exp == 0 ) + { + return; + } + + FOR( i = 0; i < len; i++ ) + { + /* saturation can occur here */ + x[i] = W_shl( x[i], exp ); + move64(); + } + + return; +} diff --git a/lib_com/trans_direct_fx.c b/lib_com/trans_direct_fx.c index d4792fb7517c940a9244a9cc51089d14137b636a..4e259e0cc5076d1d74b4a16d3ed1410fdad505f4 100644 --- a/lib_com/trans_direct_fx.c +++ b/lib_com/trans_direct_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -40,9 +40,7 @@ void direct_transform_fx( Word16 shift, Qmin = 31; Word32 L_tmp; Word16 Qs[NUM_TIME_SWITCHING_BLOCKS]; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) ( element_mode ); -#endif move16(); segment_length = shr( L, 1 ); diff --git a/lib_com/trans_inv_fx.c b/lib_com/trans_inv_fx.c index 0033e2c9e5d37a44f7ca4989d041c25881c5d0af..8bf63fccac0734f9e46e5332ae9ba842825e42ea 100644 --- a/lib_com/trans_inv_fx.c +++ b/lib_com/trans_inv_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -84,9 +84,7 @@ void preecho_sb_fx( UWord16 tmp_u16; Word32 mean_prev_hb_fx_loc, mean_prev_nc_fx_loc, mean_prev_fx_loc; /* */ Word16 q16p1, qmemp1, qtmp; -#ifdef OPT_STEREO_32KBPS_V1 Word16 shift_q = sub( 15, q_sig32 ); -#endif /* OPT_STEREO_32KBPS_V1 */ q16p1 = add( q_sig16, 1 ); qmemp1 = q16p1; @@ -139,7 +137,6 @@ void preecho_sb_fx( /* len3xLp20 = framelength/2-(short)((float)framelength*N_ZERO_MDCT/FRAME_SIZE_MS); in float*/ fxptr1 = imdct_mem_fx; -#ifdef OPT_STEREO_32KBPS_V1 FOR( i = 0; i < len3xLp20; i++ ) { *fxptr1++ = negate( extract_h( L_shl_sat( wtda_audio_fx[len3xLp20 - 1 - i], shift_q ) ) ); /*Q-1*/ @@ -150,19 +147,6 @@ void preecho_sb_fx( *fxptr1++ = negate( extract_h( L_shl_sat( wtda_audio_fx[i], shift_q ) ) ); /*Q-1*/ move16(); /*convert to Word16 Q-1 with saturation (saturation not a problem here) */ } -#else /* OPT_STEREO_32KBPS_V1 */ - fx32ptr1 = wtda_audio_fx + len3xLp20 - 1; /*q_sig32*/ - FOR( i = 0; i < len3xLp20; i++ ) - { - *fxptr1++ = negate( extract_h( L_shl_sat( *fx32ptr1--, sub( 15, q_sig32 ) ) ) ); /*Q-1*/ - move16(); /*convert to Word16 Q-1 with saturation (saturation not a problem here) */ - } - FOR( i = 0; i < L_shr( framelength, 1 ); i++ ) - { - *fxptr1++ = negate( extract_h( L_shl_sat( wtda_audio_fx[i], sub( 15, q_sig32 ) ) ) ); /*Q-1*/ - move16(); /*convert to Word16 Q-1 with saturation (saturation not a problem here) */ - } -#endif /* OPT_STEREO_32KBPS_V1 */ qmemp1 = 0; /*already in q-1*/ move16(); @@ -408,7 +392,6 @@ void preecho_sb_fx( move16(); FOR( i = 1; i <= NUMSF; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 max_es_hb_fx = L_max( max_es_hb_fx, es_mdct_hb_fx[i] ); /* max energy low band, 8 present and 1 future subframes */ max_es_fx = L_max( max_es_fx, es_mdct_fx[i] ); /* max energy low band, 8 present and 1 future subframes */ @@ -418,19 +401,6 @@ void preecho_sb_fx( maxind = i; move16(); } -#else /* OPT_STEREO_32KBPS_V1 */ - IF( GE_32( es_mdct_hb_fx[i], max_es_hb_fx ) ) /* '=' to handle the first window*/ - { - max_es_hb_fx = L_add( es_mdct_hb_fx[i], 0 ); /* max energy low band, 8 present and 1 future subframes */ - } - - IF( GE_32( es_mdct_fx[i], max_es_fx ) ) /* '=' to handle the first window*/ - { - max_es_fx = L_add( es_mdct_fx[i], 0 ); /* max energy low band, 8 present and 1 future subframes */ - maxind = i; - move16(); - } -#endif /* OPT_STEREO_32KBPS_V1 */ } cnt2 = cnt5 = 0; @@ -515,11 +485,7 @@ void preecho_sb_fx( tmp_fx1 = norm_l( es_mdct_hb_fx[i] ); tmp_fxL1 = L_shl( es_mdct_hb_fx[i], tmp_fx1 ); tmp_fxL2 = L_shl( mean_prev_hb_fx_loc, tmp_fx1 ); -#ifdef FIX_1013_CRASH_HQ_CORE_DEC tmp_fx1 = round_fx_sat( tmp_fxL1 ); -#else - tmp_fx1 = round_fx( tmp_fxL1 ); -#endif tmp_fx2 = round_fx( tmp_fxL2 ); tmp_fx3 = div_s( tmp_fx2, tmp_fx1 ); min_g_hb_fx[i] = Frac_sqrt( tmp_fx3 ); @@ -996,9 +962,7 @@ void Inverse_Transform( Word16 segment_length_div2, segment_length_div4; Word16 tmp, q_out; Word32 L_temp; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) ( element_mode ); -#endif /* This value is used to right shift all vectors returned by 'iedct_short_fx()' */ /* to bring them to a scaling that is equal to the 1st 'Q' returned by the 1st */ /* call to 'iedct_short_fx()' minus these guard bits. */ diff --git a/lib_com/vlpc_2st_com_fx.c b/lib_com/vlpc_2st_com_fx.c index 3fcdf144d6b599ec643c6156e59d1475175697f9..6f930f08f8aeeb7a8a7937360d1b32022f9969e4 100644 --- a/lib_com/vlpc_2st_com_fx.c +++ b/lib_com/vlpc_2st_com_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -10,8 +10,8 @@ void lsf_weight_2st( - const Word16 *lsfq, /* input: quantized lsf coefficients (14Q1*1.28) */ - Word16 *w, /* output: weighting function (0Q15*1.28) */ + const Word16 *lsfq, /* input: quantized lsf coefficients (14Q1*1.28) */ + Word16 *w, /* output: weighting function (0Q15*1.28) */ const Word16 mode /* input: operational mode Q0 */ ) { diff --git a/lib_com/weight_a_fx.c b/lib_com/weight_a_fx.c index 7bea66ea0b0f2194210a0a06fdcc932f7660841c..cb537a7d6ffed300a3f4d0b7fed2039150224a4c 100644 --- a/lib_com/weight_a_fx.c +++ b/lib_com/weight_a_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -35,21 +35,21 @@ void weight_a_subfr_fx( } /*==============================================================================*/ -/* FUNCTION : void weight_a_lc_fx ( ) */ +/* FUNCTION : void weight_a_lc_fx ( ) */ /*------------------------------------------------------------------------------*/ /* PURPOSE : Weighting of LP filter coefficients, ap[i] = a[i] * (gamma^i)*/ /*------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* const Word16 a[], i: LP filter coefficients Q12 */ -/* const Word16 *gammatbl, i: weighting factor Q15 */ -/* const Word16 m i: order of LP filter Q0 */ +/* INPUT ARGUMENTS : */ +/* const Word16 a[], i: LP filter coefficients Q12 */ +/* const Word16 *gammatbl, i: weighting factor Q15 */ +/* const Word16 m i: order of LP filter Q0 */ /*------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* Word16 ap[], o: weighted LP filter coefficients Q12 */ +/* OUTPUT ARGUMENTS : */ +/* Word16 ap[], o: weighted LP filter coefficients Q12 */ /*------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ +/* RETURN ARGUMENTS : */ /*------------------------------------------------------------------------------*/ -/* CALLED FROM : TX/RX */ +/* CALLED FROM : TX/RX */ /*==============================================================================*/ void weight_a_lc_fx( const Word16 a[], /* i: LP filter coefficients Q12 */ @@ -100,11 +100,6 @@ void weight_a_fx( Word16 i, fac; Word32 Amax; Word16 shift; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow; - Overflow = 0; - move32(); -#endif fac = gamma; /* Q15 */ move16(); @@ -122,7 +117,7 @@ void weight_a_fx( move16(); FOR( i = 1; i < m; i++ ) { - ap[i] = round_fx_o( L_shl( L_mult0( a[i], fac ), shift ), &Overflow ); /* Q11 + shift */ + ap[i] = round_fx_sat( L_shl( L_mult0( a[i], fac ), shift ) ); /* Q11 + shift */ move16(); fac = mult_r( fac, gamma ); /* Q15 */ } @@ -136,9 +131,9 @@ void weight_a_fx( * E_LPC_a_weight_inv * * Parameters: - * a I: LP filter coefficients Q12 + * a I: LP filter coefficients Q12 * ap O: weighted LP filter coefficients Q12 - * inv_gamma I: inverse weighting factor Q14 + * inv_gamma I: inverse weighting factor Q14 * m I: order of LP filter * * Function: diff --git a/lib_com/weight_fx.c b/lib_com/weight_fx.c index eb3f19bf75acbf822d1eae8eda0eada67887cd71..87335d88d2b397603cca51110d616bd485c08f04 100644 --- a/lib_com/weight_fx.c +++ b/lib_com/weight_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -15,9 +15,9 @@ *--------------------------------------------------------------------------*/ static void sfm2mqb_fx( - Word16 spe[], /* i : sub-vectors Q0*/ - Word16 spe2q[], /* o : pbands Q0*/ - const Word16 nb_sfm /* i : number of norms Q0*/ + Word16 spe[], /* i : sub-vectors Q0*/ + Word16 spe2q[], /* o : pbands Q0*/ + const Word16 nb_sfm /* i : number of norms Q0*/ ) { Word16 tmp, i; @@ -117,9 +117,9 @@ static void sfm2mqb_fx( *--------------------------------------------------------------------------*/ static void mqb2sfm_fx( - Word16 spe2q[], /* i : pbands Q0*/ - Word16 spe[], /* o : sub-vectors Q0*/ - const Word16 lnb_sfm /* i : number of norms Q0*/ + Word16 spe2q[], /* i : pbands Q0*/ + Word16 spe[], /* o : sub-vectors Q0*/ + const Word16 lnb_sfm /* i : number of norms Q0*/ ) { Word16 i; diff --git a/lib_com/wi_fx.c b/lib_com/wi_fx.c index 7df4cb3f04098dfa42ec0d36e8885daab0e2326c..189a48e3b0ecc039668a17bd7cd9717f44f539f3 100644 --- a/lib_com/wi_fx.c +++ b/lib_com/wi_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -45,7 +45,6 @@ ivas_error DTFS_new_fx( DTFS_STRUCTURE *dtfs_fx = NULL; dtfs_fx = (DTFS_STRUCTURE *) calloc( 1, sizeof( DTFS_STRUCTURE ) ); - // PMT("verif mem alloc") IF( dtfs_fx == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTFS (SC-VBR) structure\n" ) ); @@ -264,10 +263,6 @@ static Word16 DTFS_alignment_weight_fx( Word16 tmplpc_fx[M + 1]; Word16 exp, tmp; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif diff_fx = 0; /* to avoid compilation warnings */ move16(); @@ -320,8 +315,8 @@ static Word16 DTFS_alignment_weight_fx( FOR( k = 0; k <= HalfLag; k++ ) { - ab1[k] = round_fx_o( L_mac0_o( L_mult0( X1.a_fx[k], X2.a_fx[k] ), X1.b_fx[k], X2.b_fx[k], &Overflow ), &Overflow ); /* Q(-15) */ - ab2[k] = round_fx_o( L_msu0_o( L_mult0( X1.a_fx[k], X2.b_fx[k] ), X1.b_fx[k], X2.a_fx[k], &Overflow ), &Overflow ); /* Q(-15) */ + ab1[k] = round_fx_sat( L_mac0_sat( L_mult0( X1.a_fx[k], X2.a_fx[k] ), X1.b_fx[k], X2.b_fx[k] ) ); /* Q(-15) */ + ab2[k] = round_fx_sat( L_msu0_sat( L_mult0( X1.a_fx[k], X2.b_fx[k] ), X1.b_fx[k], X2.a_fx[k] ) ); /* Q(-15) */ move16(); move16(); } @@ -344,8 +339,8 @@ static Word16 DTFS_alignment_weight_fx( FOR( k = 0; k <= HalfLag; k++ ) { - corr_fx = L_mac0_o( corr_fx, ab1[k], cos_table[s_and( temp, 511 )], &Overflow ); - corr_fx = L_mac0_o( corr_fx, ab2[k], cos_table[s_and( add( temp, 128 ), 511 )], &Overflow ); + corr_fx = L_mac0_sat( corr_fx, ab1[k], cos_table[s_and( temp, 511 )] ); + corr_fx = L_mac0_sat( corr_fx, ab2[k], cos_table[s_and( add( temp, 128 ), 511 )] ); move32(); move32(); temp = add( temp, temp1 ); @@ -358,15 +353,15 @@ static Word16 DTFS_alignment_weight_fx( move16(); } - temp1 = round_fx_o( (Word32) L_shl_o( corr_fx, Qcorr, &Overflow ), &Overflow ); /* Q(Qcorr-16) */ - wcorr_fx = L_mult_o( temp1, shl_o( temp, 2, &Overflow ), &Overflow ); /* Q(Qcorr-16+13+2+1)=Q(Qcorr) */ + temp1 = round_fx_sat( (Word32) L_shl_sat( corr_fx, Qcorr ) ); /* Q(Qcorr-16) */ + wcorr_fx = L_mult_sat( temp1, shl_sat( temp, 2 ) ); /* Q(Qcorr-16+13+2+1)=Q(Qcorr) */ //!!sat IF( GE_16( Qmaxcorr, Qcorr ) ) { - diff_corr = L_sub_o( wcorr_fx, L_shl_o( maxcorr_fx, sub( Qcorr, Qmaxcorr ), &Overflow ), &Overflow ); /* Qcorr */ + diff_corr = L_sub_sat( wcorr_fx, L_shl_sat( maxcorr_fx, sub( Qcorr, Qmaxcorr ) ) ); /* Qcorr */ } ELSE { - diff_corr = L_sub_o( L_shl_o( wcorr_fx, sub( Qmaxcorr, Qcorr ), &Overflow ), maxcorr_fx, &Overflow ); /* Qmaxcorr */ + diff_corr = L_sub_sat( L_shl_sat( wcorr_fx, sub( Qmaxcorr, Qcorr ) ), maxcorr_fx ); /* Qmaxcorr */ } IF( diff_corr > 0 ) @@ -417,10 +412,6 @@ Word16 DTFS_alignment_full_fx( Word16 n, fshift_fx; Word32 corr_fx, maxcorr_fx; Word16 Eshift, Adiff_fx; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* Calculating the expected alignment shift */ Eshift = mult_r( ph_offset_fx, shl( X2_DTFS_fx.lag_fx, 7 ) ); /* confirmed I<2 by smv12.org, Q7 */ @@ -453,8 +444,8 @@ Word16 DTFS_alignment_full_fx( FOR( k = 0; k <= HalfLag; k++ ) { - ab1[k] = round_fx_o( L_mac_o( L_mult_o( X1_DTFS_fx.a_fx[k], X2_DTFS_fx.a_fx[k], &Overflow ), X1_DTFS_fx.b_fx[k], X2_DTFS_fx.b_fx[k], &Overflow ), &Overflow ); /* Q(-15); */ - ab2[k] = round_fx_o( L_msu_o( L_mult_o( X1_DTFS_fx.b_fx[k], X2_DTFS_fx.a_fx[k], &Overflow ), X1_DTFS_fx.a_fx[k], X2_DTFS_fx.b_fx[k], &Overflow ), &Overflow ); /* Q(-15); */ + ab1[k] = round_fx_sat( L_mac_sat( L_mult_sat( X1_DTFS_fx.a_fx[k], X2_DTFS_fx.a_fx[k] ), X1_DTFS_fx.b_fx[k], X2_DTFS_fx.b_fx[k] ) ); /* Q(-15); */ + ab2[k] = round_fx_sat( L_msu_sat( L_mult_sat( X1_DTFS_fx.b_fx[k], X2_DTFS_fx.a_fx[k] ), X1_DTFS_fx.a_fx[k], X2_DTFS_fx.b_fx[k] ) ); /* Q(-15); */ } IF( FR_flag == 0 ) { @@ -484,9 +475,9 @@ Word16 DTFS_alignment_full_fx( temp1 = add( n, shl( X2_DTFS_fx.lag_fx, 1 ) ); /* add lag_fx in Q1to make positive */ FOR( k = 0; k <= HalfLag; k++ ) { - corr_fx = L_mac_o( corr_fx, ab1[k], C_fx[( 2 * temp ) % ( 4 * X2_DTFS_fx.lag_fx )], &Overflow ); - corr_fx = L_mac_o( corr_fx, ab2[k], S_fx[( 2 * temp ) % ( 4 * X2_DTFS_fx.lag_fx )], &Overflow ); - temp = add_o( temp, temp1, &Overflow ); + corr_fx = L_mac_sat( corr_fx, ab1[k], C_fx[( 2 * temp ) % ( 4 * X2_DTFS_fx.lag_fx )] ); + corr_fx = L_mac_sat( corr_fx, ab2[k], S_fx[( 2 * temp ) % ( 4 * X2_DTFS_fx.lag_fx )] ); + temp = add_sat( temp, temp1 ); } IF( GT_32( corr_fx, maxcorr_fx ) ) @@ -592,10 +583,6 @@ void Q2phaseShift_fx( Word16 k; Word16 temp, HalfLag; Word32 temp2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif temp2 = L_deposit_l( 0 ); HalfLag = s_min( shr( X_fx->lag_fx, 1 ), X_fx->nH_fx ); @@ -606,9 +593,9 @@ void Q2phaseShift_fx( FOR( k = 0; k <= HalfLag; k++ ) { temp = X_fx->a_fx[k]; - X_fx->a_fx[k] = round_fx_o( L_msu_o( L_mult_o( temp, C_fx[temp2 % ( 4 * Lag )], &Overflow ), X_fx->b_fx[k], S_fx[temp2 % ( 4 * Lag )], &Overflow ), &Overflow ); /* X.Q */ - X_fx->b_fx[k] = round_fx_o( L_mac_o( L_mult_o( X_fx->b_fx[k], C_fx[temp2 % ( 4 * Lag )], &Overflow ), temp, S_fx[temp2 % ( 4 * Lag )], &Overflow ), &Overflow ); - temp2 = L_add_o( temp2, (Word32) ph, &Overflow ); + X_fx->a_fx[k] = round_fx_sat( L_msu_sat( L_mult_sat( temp, C_fx[temp2 % ( 4 * Lag )] ), X_fx->b_fx[k], S_fx[temp2 % ( 4 * Lag )] ) ); /* X.Q */ + X_fx->b_fx[k] = round_fx_sat( L_mac_sat( L_mult_sat( X_fx->b_fx[k], C_fx[temp2 % ( 4 * Lag )] ), temp, S_fx[temp2 % ( 4 * Lag )] ) ); + temp2 = L_add_sat( temp2, (Word32) ph ); move16(); move16(); } @@ -620,9 +607,9 @@ void Q2phaseShift_fx( FOR( k = 0; k <= HalfLag; k++ ) { temp = X_fx->a_fx[k]; - X_fx->a_fx[k] = round_fx_o( L_mac_o( L_mult_o( temp, C_fx[temp2 % ( 4 * Lag )], &Overflow ), X_fx->b_fx[k], S_fx[temp2 % ( 4 * Lag )], &Overflow ), &Overflow ); /* X.Q */ - X_fx->b_fx[k] = round_fx_o( L_msu_o( L_mult_o( X_fx->b_fx[k], C_fx[temp2 % ( 4 * Lag )], &Overflow ), temp, S_fx[temp2 % ( 4 * Lag )], &Overflow ), &Overflow ); - temp2 = add_o( (Word16) temp2, negate( ph ), &Overflow ); + X_fx->a_fx[k] = round_fx_sat( L_mac_sat( L_mult_sat( temp, C_fx[temp2 % ( 4 * Lag )] ), X_fx->b_fx[k], S_fx[temp2 % ( 4 * Lag )] ) ); /* X.Q */ + X_fx->b_fx[k] = round_fx_sat( L_msu_sat( L_mult_sat( X_fx->b_fx[k], C_fx[temp2 % ( 4 * Lag )] ), temp, S_fx[temp2 % ( 4 * Lag )] ) ); + temp2 = add_sat( (Word16) temp2, negate( ph ) ); move16(); move16(); } @@ -726,10 +713,6 @@ void DTFS_to_fs_fx( Word32 La[MAXLAG_WI], Lb[MAXLAG_WI], Labmax; Word16 exp, tmp; Word32 L_tmp1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif IF( !FR_flag ) { @@ -765,15 +748,15 @@ void DTFS_to_fs_fx( move16(); exp = norm_s( X_fx->lag_fx ); - tmp = div_s( shl( 1, sub( 14, exp ) ), X_fx->lag_fx ); /* Q29-exp */ - L_tmp1 = L_mult_o( 12800, tmp, &Overflow ); /* Q(30-exp) */ - diff_fx = extract_h( L_shl_o( L_tmp1, sub( exp, 14 ), &Overflow ) ); /* Q0 */ + tmp = div_s( shl( 1, sub( 14, exp ) ), X_fx->lag_fx ); /* Q29-exp */ + L_tmp1 = L_mult( 12800, tmp ); /* Q(30-exp) */ + diff_fx = extract_h( L_shl_sat( L_tmp1, sub( exp, 14 ) ) ); /* Q0 */ exp = norm_s( diff_fx ); - tmp = div_s( shl( 1, sub( 14, exp ) ), diff_fx ); /* Q29-exp */ - L_tmp1 = L_mult_o( X_fx->upper_cut_off_freq_fx, tmp, &Overflow ); /* Q(30-exp) */ - nH_band = extract_h( L_shl_o( L_tmp1, sub( exp, 14 ), &Overflow ) ); /* Q0 */ - nH_4kHz = mult( 10240, ( X_fx->lag_fx ) ); /* 4000/12800 in Q15 */ + tmp = div_s( shl( 1, sub( 14, exp ) ), diff_fx ); /* Q29-exp */ + L_tmp1 = L_mult_sat( X_fx->upper_cut_off_freq_fx, tmp ); /* Q(30-exp) */ + nH_band = extract_h( L_shl_sat( L_tmp1, sub( exp, 14 ) ) ); /* Q0 */ + nH_4kHz = mult( 10240, ( X_fx->lag_fx ) ); /* 4000/12800 in Q15 */ if ( GE_16( sub( X_fx->upper_cut_off_freq_fx, shr( (Word16) L_mult( diff_fx, nH_band ), 1 ) ), diff_fx ) ) { @@ -796,8 +779,8 @@ void DTFS_to_fs_fx( exp = norm_s( N ); tmp = div_s( shl( 1, ( sub( 14, exp ) ) ), N ); - L_tmp = L_shl_o( tmp, add( exp, 6 ), &Overflow ); - inv_lag = round_fx_o( L_tmp, &Overflow ); + L_tmp = L_shl_sat( tmp, add( exp, 6 ) ); + inv_lag = round_fx_sat( L_tmp ); Lx0 = L_deposit_h( x[0] ); Labmax = L_deposit_l( 0 ); FOR( k = 1; k <= nH; k++ ) @@ -811,8 +794,8 @@ void DTFS_to_fs_fx( move16(); FOR( n = 1; n < N; n++ ) { - L_a = L_mac0_o( L_a, x[n], C_fx[( 4 * sum ) % ( 4 * N )], &Overflow ); /* Q16 of x[n]*cos(sum) */ - L_b = L_mac0_o( L_b, x[n], S_fx[( 4 * sum ) % ( 4 * N )], &Overflow ); /* Q16 of x[n]*sin(sum) */ + L_a = L_mac0_sat( L_a, x[n], C_fx[( 4 * sum ) % ( 4 * N )] ); /* Q16 of x[n]*cos(sum) */ + L_b = L_mac0_sat( L_b, x[n], S_fx[( 4 * sum ) % ( 4 * N )] ); /* Q16 of x[n]*sin(sum) */ sum = add( sum, temp ); } La[k] = L_shr( L_a, 6 ); /* Q8 of a[k]*2.0 */ @@ -849,13 +832,13 @@ void DTFS_to_fs_fx( temp_neg = negate( temp ); FOR( n = 0; n < N - 1; n += 2 ) { - L_a = L_mac_o( L_a, x[n], temp, &Overflow ); /* Q1 */ - L_a = L_mac_o( L_a, x[n + 1], temp_neg, &Overflow ); + L_a = L_mac_sat( L_a, x[n], temp ); /* Q1 */ + L_a = L_mac_sat( L_a, x[n + 1], temp_neg ); /*temp= negate(temp); */ } if ( s_and( N, 1 ) ) /*if N is odd we need to calculate last */ { - L_a = L_mac_o( L_a, x[n], temp, &Overflow ); /* Q1 */ + L_a = L_mac_sat( L_a, x[n], temp ); /* Q1 */ } La[k] = L_shl( L_a, 7 ); @@ -882,21 +865,21 @@ void DTFS_to_fs_fx( FOR( k = 1; k <= nH; k++ ) { - X_fx->a_fx[k] = round_fx_o( L_shl_o( La[k], temp, &Overflow ), &Overflow ); /* Q(8+temp-16)=Q(temp-8) */ + X_fx->a_fx[k] = round_fx_sat( L_shl_sat( La[k], temp ) ); /* Q(8+temp-16)=Q(temp-8) */ move16(); - X_fx->a_fx[k] = mult_ro( X_fx->a_fx[k], inv_lag, &Overflow ); - move16(); /* Q(temp-8+19+1-16)=Q(temp-4) of a[k]*2.0/N */ - X_fx->b_fx[k] = round_fx_o( L_shl_o( Lb[k], temp, &Overflow ), &Overflow ); /* Q(8+temp-16)=Q(temp-8) */ + X_fx->a_fx[k] = mult_r_sat( X_fx->a_fx[k], inv_lag ); + move16(); /* Q(temp-8+19+1-16)=Q(temp-4) of a[k]*2.0/N */ + X_fx->b_fx[k] = round_fx_sat( L_shl_sat( Lb[k], temp ) ); /* Q(8+temp-16)=Q(temp-8) */ move16(); - X_fx->b_fx[k] = mult_ro( X_fx->b_fx[k], inv_lag, &Overflow ); + X_fx->b_fx[k] = mult_r_sat( X_fx->b_fx[k], inv_lag ); move16(); /* Q(temp-8+19+1-16)=Q(temp-4) of b[k]*2.0/N */ } /* IF ( N%2 == 0 ) */ IF( s_and( N, 1 ) == 0 ) { - X_fx->a_fx[k] = round_fx_o( L_shl_o( La[k], temp, &Overflow ), &Overflow ); /* Q(8+temp-16)=Q(temp-8) */ - X_fx->a_fx[k] = mult_ro( X_fx->a_fx[k], inv_lag, &Overflow ); + X_fx->a_fx[k] = round_fx_sat( L_shl_sat( La[k], temp ) ); /* Q(8+temp-16)=Q(temp-8) */ + X_fx->a_fx[k] = mult_r_sat( X_fx->a_fx[k], inv_lag ); move16(); move16(); /* Q(temp-8+19+1-16)=Q(temp-4) of a[k]*1.0/N */ X_fx->b_fx[k] = 0; @@ -1197,10 +1180,6 @@ void DTFS_zeroFilter_fx( Word16 temp, temp1, temp2; Word32 L_temp1, L_temp2; Word16 Qmin, Qab[MAXLAG_WI], na, nb; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif Qmin = 32767; move16(); HalfLag = s_min( shr( X_fx->lag_fx, 1 ), X_fx->nH_fx ); @@ -1217,19 +1196,20 @@ void DTFS_zeroFilter_fx( FOR( n = 0; n < N; n++ ) { - sum1_fx = L_mac_o( sum1_fx, LPC[n], C_fx[( 4 * temp2 ) % ( 4 * X_fx->lag_fx )], &Overflow ); /* Q(12+15+1) */ - sum2_fx = L_mac_o( sum2_fx, LPC[n], S_fx[( 4 * temp2 ) % ( 4 * X_fx->lag_fx )], &Overflow ); + sum1_fx = L_mac_sat( sum1_fx, LPC[n], C_fx[( 4 * temp2 ) % ( 4 * X_fx->lag_fx )] ); /* Q(12+15+1) */ + sum2_fx = L_mac_sat( sum2_fx, LPC[n], S_fx[( 4 * temp2 ) % ( 4 * X_fx->lag_fx )] ); temp2 = add( temp2, temp ); } - temp1 = round_fx_o( sum1_fx, &Overflow ); /* Q(12+15+1-16)=Q(12) */ - temp2 = round_fx_o( sum2_fx, &Overflow ); /* Q(12) */ + temp1 = round_fx_sat( sum1_fx ); /* Q(12+15+1-16)=Q(12) */ + temp2 = round_fx_sat( sum2_fx ); /* Q(12) */ /* Calculate the circular convolution */ - L_temp1 = L_mult_o( temp1, X_fx->a_fx[k], &Overflow ); - L_temp1 = L_msu_o( L_temp1, temp2, X_fx->b_fx[k], &Overflow ); /* Q(12+Q+1) */ - L_temp2 = L_mult_o( temp1, X_fx->b_fx[k], &Overflow ); - L_temp2 = L_mac_o( L_temp2, temp2, X_fx->a_fx[k], &Overflow ); /* Q(12+Q+1) */ + L_temp1 = L_mult( temp1, X_fx->a_fx[k] ); + L_temp1 = L_msu_sat( L_temp1, temp2, X_fx->b_fx[k] ); /* Q(12+Q+1) */ + L_temp2 = L_mult( temp1, X_fx->b_fx[k] ); + + L_temp2 = L_mac_sat( L_temp2, temp2, X_fx->a_fx[k] ); /* Q(12+Q+1) */ /* normalization */ na = norm_l( L_temp1 ); if ( L_temp1 == 0 ) @@ -1249,8 +1229,8 @@ void DTFS_zeroFilter_fx( nb = na; move16(); } - X_fx->a_fx[k] = round_fx_o( (Word32) L_shl_o( L_temp1, nb, &Overflow ), &Overflow ); /* Q(13+Q+nb-16)=Q(Q+nb-3) */ - X_fx->b_fx[k] = round_fx_o( (Word32) L_shl_o( L_temp2, nb, &Overflow ), &Overflow ); /* Q(Q+nb-3) */ + X_fx->a_fx[k] = round_fx_sat( (Word32) L_shl_sat( L_temp1, nb ) ); /* Q(13+Q+nb-16)=Q(Q+nb-3) */ + X_fx->b_fx[k] = round_fx_sat( (Word32) L_shl_sat( L_temp2, nb ) ); /* Q(Q+nb-3) */ move32(); move32(); @@ -1266,9 +1246,9 @@ void DTFS_zeroFilter_fx( /* bring to the same Q */ FOR( k = 0; k <= HalfLag; k++ ) { - X_fx->a_fx[k] = shl_o( X_fx->a_fx[k], sub( Qmin, Qab[k] ), &Overflow ); + X_fx->a_fx[k] = shl_sat( X_fx->a_fx[k], sub( Qmin, Qab[k] ) ); move16(); /* Q(Q+Qab[k]+Qmin-Qab[k]=Q(Q+Qmin) */ - X_fx->b_fx[k] = shl_o( X_fx->b_fx[k], sub( Qmin, Qab[k] ), &Overflow ); + X_fx->b_fx[k] = shl_sat( X_fx->b_fx[k], sub( Qmin, Qab[k] ) ); move16(); /* Q(Q+Qmin) */ } @@ -1513,10 +1493,6 @@ Word32 DTFS_getEngy_fx( Word32 en_fx = 0; move32(); Word16 temp_a_fx, temp_b_fx; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif HalfLag_fx = shr( sub( X_fx->lag_fx, 1 ), 1 ); HalfLag_fx = s_min( HalfLag_fx, X_fx->nH_fx ); FOR( k = 1; k <= HalfLag_fx; k++ ) @@ -1525,15 +1501,14 @@ Word32 DTFS_getEngy_fx( move16(); temp_b_fx = X_fx->b_fx[k]; move16(); - - en_fx = L_mac0_o( en_fx, temp_a_fx, temp_a_fx, &Overflow ); - en_fx = L_mac0_o( en_fx, temp_b_fx, temp_b_fx, &Overflow ); + en_fx = L_mac0_sat( en_fx, temp_a_fx, temp_a_fx ); + en_fx = L_mac0_sat( en_fx, temp_b_fx, temp_b_fx ); } en_fx = L_shr( en_fx, 1 ); temp_a_fx = X_fx->a_fx[0]; move16(); - en_fx = L_mac0_o( en_fx, temp_a_fx, temp_a_fx, &Overflow ); + en_fx = L_mac0_sat( en_fx, temp_a_fx, temp_a_fx ); /* IF (X_fx->lag_fx%2 == 0) */ IF( s_and( X_fx->lag_fx, 1 ) == 0 ) { @@ -1541,9 +1516,8 @@ Word32 DTFS_getEngy_fx( move16(); temp_b_fx = X_fx->b_fx[k]; move16(); - - en_fx = L_mac0_o( en_fx, temp_a_fx, temp_a_fx, &Overflow ); - en_fx = L_mac0_o( en_fx, temp_b_fx, temp_b_fx, &Overflow ); + en_fx = L_mac0_sat( en_fx, temp_a_fx, temp_a_fx ); + en_fx = L_mac0_sat( en_fx, temp_b_fx, temp_b_fx ); } return en_fx; /* 2*X1.Q+1=Q13 */ @@ -1574,26 +1548,21 @@ Word32 DTFS_getEngy_P2A_fx( Word16 k, HalfLag_fx; Word32 en_fx = 0; move32(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif HalfLag_fx = shr( sub( X_fx->lag_fx, 1 ), 1 ); HalfLag_fx = s_min( HalfLag_fx, X_fx->nH_fx ); FOR( k = 1; k <= HalfLag_fx; k++ ) { - en_fx = L_mac0_o( en_fx, X_fx->a_fx[k], X_fx->a_fx[k], &Overflow ); - en_fx = L_mac0_o( en_fx, X_fx->b_fx[k], X_fx->b_fx[k], &Overflow ); + en_fx = L_mac0_sat( en_fx, X_fx->a_fx[k], X_fx->a_fx[k] ); + en_fx = L_mac0_sat( en_fx, X_fx->b_fx[k], X_fx->b_fx[k] ); } en_fx = L_shr( en_fx, 1 ); - en_fx = L_mac0_o( en_fx, X_fx->a_fx[0], X_fx->a_fx[0], &Overflow ); + en_fx = L_mac0_sat( en_fx, X_fx->a_fx[0], X_fx->a_fx[0] ); /* IF (X_fx->lag_fx%2 == 0) */ IF( s_and( X_fx->lag_fx, 1 ) == 0 ) { - en_fx = L_mac0_o( en_fx, X_fx->a_fx[k], X_fx->a_fx[k], &Overflow ); - en_fx = L_mac0_o( en_fx, X_fx->b_fx[k], X_fx->b_fx[k], &Overflow ); + en_fx = L_mac0_sat( en_fx, X_fx->a_fx[k], X_fx->a_fx[k] ); + en_fx = L_mac0_sat( en_fx, X_fx->b_fx[k], X_fx->b_fx[k] ); } - return en_fx; /* 2*X1.Q */ } @@ -1720,17 +1689,13 @@ void DTFS_car2pol_fx( Word32 Ltemp_fx; Word32 Lacc_fx; Word16 exp, tmp, frac; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif HalfLag_fx = s_min( shr( sub( X_fx->lag_fx, 1 ), 1 ), X_fx->nH_fx ); FOR( k = 1; k <= HalfLag_fx; k++ ) { - Lacc_fx = L_mult( X_fx->a_fx[k], X_fx->a_fx[k] ); /* a[k]^2, 2Q+1 */ - Lacc_fx = L_mac_o( Lacc_fx, X_fx->b_fx[k], X_fx->b_fx[k], &Overflow ); /* a[k]^2+b[k]^2, 2Q+1 */ - Lacc_fx = L_shr( Lacc_fx, 3 ); /* Lacc=(a[k]^2+b[k]^2)/4, 2Q */ + Lacc_fx = L_mult( X_fx->a_fx[k], X_fx->a_fx[k] ); /* a[k]^2, 2Q+1 */ + Lacc_fx = L_mac_sat( Lacc_fx, X_fx->b_fx[k], X_fx->b_fx[k] ); /* a[k]^2+b[k]^2, 2Q+1 */ + Lacc_fx = L_shr( Lacc_fx, 3 ); /* Lacc=(a[k]^2+b[k]^2)/4, 2Q */ IF( Lacc_fx ) { @@ -1837,10 +1802,6 @@ Word32 DTFS_setEngyHarm_fx( move32(); Word16 expp = 0; move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif f_low_fx = mult( f1_fx, X_fx->lag_fx ); /* Q0 */ @@ -1852,7 +1813,7 @@ Word32 DTFS_setEngyHarm_fx( Lacc = L_deposit_l( 0 ); FOR( k = f_low_fx + 1; k <= HalfLag_fx; k++ ) { - Lacc = L_mac0_o( Lacc, X_fx->a_fx[k], X_fx->a_fx[k], &Overflow ); /* 2*X1.Q */ + Lacc = L_mac0_sat( Lacc, X_fx->a_fx[k], X_fx->a_fx[k] ); /* 2*X1.Q */ Lacc_max = L_max( Lacc_max, Lacc ); count = add( count, 1 ); @@ -1867,8 +1828,8 @@ Word32 DTFS_setEngyHarm_fx( Lacc = L_deposit_l( 0 ); FOR( k = f_low_fx + 1; k <= HalfLag_fx; k++ ) { - L_tmp = L_mult_o( X_fx->a_fx[k], X_fx->a_fx[k], &Overflow ); - Lacc = L_add_o( Lacc, L_shr( L_tmp, expp ), &Overflow ); /* 2*X1.Q-expp */ + L_tmp = L_mult_sat( X_fx->a_fx[k], X_fx->a_fx[k] ); + Lacc = L_add_sat( Lacc, L_shr( L_tmp, expp ) ); /* 2*X1.Q-expp */ count = add( count, 1 ); } } @@ -1881,7 +1842,7 @@ Word32 DTFS_setEngyHarm_fx( exp = norm_s( count ); tmp = div_s( shl( 1, sub( 14, exp ) ), count ); /* 29 - exp */ - en1_fx = L_shl_o( Mult_32_16( Lacc, tmp ), sub( exp, 14 ), &Overflow ); + en1_fx = L_shl_sat( Mult_32_16( Lacc, tmp ), sub( exp, 14 ) ); test(); IF( en1_fx > 0 && en2_fx > 0 ) { @@ -1892,7 +1853,7 @@ Word32 DTFS_setEngyHarm_fx( expb = norm_l( en1_fx ); - fracb = round_fx_o( L_shl_o( en1_fx, expb, &Overflow ), &Overflow ); + fracb = round_fx_sat( L_shl( en1_fx, expb ) ); IF( GE_32( Lacc_max, 2147483647 /*1.Q31*/ ) ) { expb = sub( 30, add( expb, sub( shl( X_fx->Q, 1 ), expp ) ) ); @@ -1930,7 +1891,7 @@ Word32 DTFS_setEngyHarm_fx( { /*L_temp_fx =(Word32)Mpy_32_16(extract_h(factor_fx),extract_l(factor_fx), X_fx->a_fx[k]); move32(); */ /* Q(temp+X1.Q-15) */ L_temp_fx = Mult_32_16( factor_fx, X_fx->a_fx[k] ); /* Q(temp+X1.Q-15) */ - X_fx->a_fx[k] = round_fx_o( L_temp_fx, &Overflow ); /* Q(temp+X1.Q-15-16)=Q(temp+X1.Q-31); */ + X_fx->a_fx[k] = round_fx_sat( L_temp_fx ); /* Q(temp+X1.Q-15-16)=Q(temp+X1.Q-31); */ move16(); } @@ -1994,10 +1955,6 @@ static void cubicPhase_fx( Word16 num_flag, den_flag; Word32 N2; Word16 dbgshft; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif num_flag = 0; move16(); den_flag = 0; @@ -2065,8 +2022,7 @@ static void cubicPhase_fx( Ltemp3 = L_mult( N, c1 ); /* Q20 */ Ltemp3 = L_sub( Ltemp3, L_shl( Ltemp1, 1 ) ); /* Ltemp3=N*c1-2*Ltemp1, Q20 */ - - IF( GE_32( L_abs( Ltemp3 ), L_shl_o( Ltemp2, 8, &Overflow ) ) ) + IF( GE_32( L_abs( Ltemp3 ), L_shl_sat( Ltemp2, 8 ) ) ) { Lacc = L_add( MIN_32, 0 ); if ( Ltemp3 > 0 ) @@ -2079,7 +2035,7 @@ static void cubicPhase_fx( ELSE { expa = norm_l( Ltemp3 ); - fraca = extract_h( L_shl_o( Ltemp3, expa, &Overflow ) ); + fraca = extract_h( L_shl( Ltemp3, expa ) ); expa = sub( 30, add( expa, 20 ) ); if ( fraca < 0 ) { @@ -2088,7 +2044,7 @@ static void cubicPhase_fx( } expb = norm_l( Ltemp2 ); - fracb = extract_h( L_shl_o( Ltemp2, expb, &Overflow ) ); + fracb = extract_h( L_shl( Ltemp2, expb ) ); expb = sub( 30, expb ); if ( fracb < 0 ) { @@ -2105,7 +2061,7 @@ static void cubicPhase_fx( fracb = negate( fracb ); } scale = shr( sub( fracb, fraca ), 15 ); - fraca = shl_o( fraca, scale, &Overflow ); + fraca = shl_sat( fraca, scale ); expa = sub( expa, scale ); tmp = div_s( fraca, fracb ); /* 15-exp */ @@ -2121,8 +2077,8 @@ static void cubicPhase_fx( tmp = negate( tmp ); } - Lacc = L_shl_o( tmp, add( exp, 34 ), &Overflow ); - Lacc = L_add_o( Lacc, 0x08000, &Overflow ); + Lacc = L_shl_sat( tmp, add( exp, 34 ) ); + Lacc = L_add_sat( Lacc, 0x08000 ); c0 = extract_h( Lacc ); /* c0 in Q33 */ } @@ -2248,7 +2204,7 @@ static void cubicPhase_fx( Ltemp3 = L_add( Ltemp3, 1 ); } - Ltemp3 = L_shl_o( Mult_32_16( L_shl_o( Ltemp3, 7, &Overflow ), c0 ), 2, &Overflow ); /* Ltemp3=c0*n^3, Q27 */ + Ltemp3 = L_shl_sat( Mult_32_16( L_shl_sat( Ltemp3, 7 ), c0 ), 2 ); /* Ltemp3=c0*n^3, Q27 */ //?sat Ltemp2 = L_shl( Mult_32_16( N2, c1 ), 1 ); /* Ltemp2 = (Word32)L_mult_su(c1,(UNS_Word16)n2); : Ltemp2=c1*n^2, Q27 */ Ltemp1 = L_shl( L_mult( c2, n ), 7 ); /* Ltemp1=c2*n, Q27 */ @@ -2306,10 +2262,6 @@ void DTFS_to_erb_fx( Word32 sum_a_fx[NUM_ERB_WB], Ltemp_fx, L_tmp, L_temp; Word16 exp, tmp; Word16 expa, expb, fraca, fracb, scale; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif const Word16 *erb_fx = NULL; num_erb_fx = NUM_ERB_NB; move16(); @@ -2374,7 +2326,7 @@ void DTFS_to_erb_fx( FOR( i = 0; i < num_erb_fx; i++ ) { - out_fx[i] = round_fx_o( L_shl_o( sum_a_fx[i], n, &Overflow ), &Overflow ); /* Q13 */ + out_fx[i] = round_fx_sat( L_shl_sat( sum_a_fx[i], n ) ); /* Q13 */ //?�sat move16(); IF( GT_16( count[i], 1 ) ) { @@ -2446,10 +2398,6 @@ void erb_slot_fx( Word16 exp, tmp; Word32 L_tmp1, L_tmp; Word16 fraca, fracb, expa, expb, scale; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif const Word16 *erb_fx = NULL; /*move16(); */ upper_cut_off_freq_fx = 4000; @@ -2531,17 +2479,17 @@ void erb_slot_fx( } FOR( j = 0; j < num_erb_fx; j++ ) { - mfreq_fx[j] = round_fx_o( L_shl_o( mf_fx[j], 11, &Overflow ), &Overflow ); /* Q15 */ + mfreq_fx[j] = round_fx_sat( L_shl_sat( mf_fx[j], 11 ) ); /* Q15 */ move16(); IF( GT_16( out_fx[j], 1 ) ) { expb = norm_l( mf_fx[j] ); - fracb = round_fx_o( L_shl_o( mf_fx[j], expb, &Overflow ), &Overflow ); + fracb = round_fx_sat( L_shl_sat( mf_fx[j], expb ) ); expb = sub( 30, add( expb, 20 ) ); expa = norm_l( out_fx[j] ); - fraca = extract_h( L_shl_o( out_fx[j], expa, &Overflow ) ); + fraca = extract_h( L_shl( out_fx[j], expa ) ); expa = sub( 30, expa ); scale = shr( sub( fraca, fracb ), 15 ); @@ -2550,9 +2498,9 @@ void erb_slot_fx( tmp = div_s( fracb, fraca ); exp = sub( expb, expa ); - L_tmp = L_shl_o( tmp, add( exp, 16 ), &Overflow ); + L_tmp = L_shl_sat( tmp, add( exp, 16 ) ); - mfreq_fx[j] = round_fx_o( L_tmp, &Overflow ); + mfreq_fx[j] = round_fx_sat( L_tmp ); move16(); } } @@ -2604,10 +2552,6 @@ void DTFS_erb_inv_fx( move16(); move16(); move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif IF( EQ_16( num_erb_fx, NUM_ERB_NB ) ) { @@ -2692,7 +2636,7 @@ void DTFS_erb_inv_fx( d2h = 31; move16(); } - X_fx->a_fx[i] = round_fx_o( L_shl_o( Ltemp_fx, d2h, &Overflow ), &Overflow ); /* Q(28-n+d2h) */ + X_fx->a_fx[i] = round_fx_sat( L_shl_sat( Ltemp_fx, d2h ) ); /* Q(28-n+d2h) */ move16(); q[i] = add( sub( 28, n ), d2h ); move16(); @@ -2736,7 +2680,6 @@ void DTFS_erb_inv_fx( /*-------------------------------------------------------------------*/ /* CALLED FROM : TX/RX */ /*===================================================================*/ - void erb_add_fx( Word16 *curr_erb_fx, /* i/o: current ERB */ Word16 l_fx, /* i : current lag */ @@ -2901,11 +2844,11 @@ void quant_target_fx( DTFS_STRUCTURE *X_fx, const Word16 *curr_lpc, Word16 *w, W Ltemp1 = log10_fx( Ltemp1 ); /* subtract 10log10(2)*(2Q-13), Q23 */ - Ltemp1 = L_sub( Ltemp1, Ltemp3 ); + Ltemp1 = L_sub_sat( Ltemp1, Ltemp3 ); Ltemp1 = L_max( 0, Ltemp1 ); Ltemp2 = getSpEngyFromResAmp_fx( X_fx, 2828, X_fx->upper_cut_off_freq_fx, curr_lpc, sin_tab, cos_tab ); - Ltemp2 = log10_fx( Ltemp2 ); /* Ltemp1=10log10(eng_hb), Q23, need to adjust for Q factor of energy (2Q-13) */ - Ltemp2 = L_sub( Ltemp2, Ltemp3 ); /* Ltemp2 in Q23 */ + Ltemp2 = log10_fx( Ltemp2 ); /* Ltemp1=10log10(eng_hb), Q23, need to adjust for Q factor of energy (2Q-13) */ + Ltemp2 = L_sub_sat( Ltemp2, Ltemp3 ); /* Ltemp2 in Q23 */ Ltemp2 = L_max( 0, Ltemp2 ); @@ -2929,10 +2872,10 @@ void quant_target_fx( DTFS_STRUCTURE *X_fx, const Word16 *curr_lpc, Word16 *w, W tmp = round_fx( Ltemp ); /* tmp in Q(22-n) */ Ltemp1 = Mult_32_16( Ltemp1, tmp ); /* Q(30-n) */ n = sub( 8, exp ); - w[0] = round_fx( L_shl( Ltemp1, n ) ); /* w[0] in Q15 */ + w[0] = round_fx_sat( L_shl_sat( Ltemp1, n ) ); /* w[0] in Q15 */ move16(); Ltemp2 = Mult_32_16( Ltemp2, tmp ); - w[1] = round_fx( L_shl( Ltemp2, n ) ); /* w[1] in Q15 */ + w[1] = round_fx_sat( L_shl_sat( Ltemp2, n ) ); /* w[1] in Q15 */ move16(); logLag = log10_fx( X_fx->lag_fx ); /* logLag=10*log10(lag), Q23 */ @@ -3144,9 +3087,6 @@ ivas_error WIsyn_fx( /* Adjust the phase offset and wrap it between 0 and 2pi */ - // PMT("NEED a complete verification of mem flow and assignment") - - IF( EQ_16( flag, 2 ) ) { L_temp = L_shr( L_mult( tmp_fx, I ), 1 ); /* Q15 */ @@ -3434,10 +3374,6 @@ void DTFS_peaktoaverage_fx( DTFS_STRUCTURE X_fx, Word32 *pos_fx, Word16 *Qpos, W Word16 expa, expb, fraca, fracb, scale; Word16 exp, tmp; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif L_sum = DTFS_getEngy_P2A_fx( &X_fx ); /* 2Q */ DTFS_fast_fs_inv_fx( &X_fx, time_fx, 256, 8 ); @@ -3481,17 +3417,18 @@ void DTFS_peaktoaverage_fx( DTFS_STRUCTURE X_fx, Word32 *pos_fx, Word16 *Qpos, W ELSE { expa = norm_l( maxPosEn_fx ); - fraca = extract_h( L_shl_o( maxPosEn_fx, expa, &Overflow ) ); + fraca = extract_h( L_shl( maxPosEn_fx, expa ) ); expa = sub( 30, add( expa, 1 ) ); expb = norm_l( L_sum ); - fracb = round_fx_o( L_shl_o( L_sum, expb, &Overflow ), &Overflow ); + fracb = round_fx_sat( L_shl( L_sum, expb ) ); + expb = sub( 30, add( expb, shl( X_fx.Q, 1 ) ) ); scale = shr( sub( fraca, fracb ), 15 ); - fracb = shl_o( fracb, scale, &Overflow ); + fracb = shl_sat( fracb, scale ); expb = sub( expb, scale ); tmp = div_s( fracb, fraca ); @@ -3515,17 +3452,17 @@ void DTFS_peaktoaverage_fx( DTFS_STRUCTURE X_fx, Word32 *pos_fx, Word16 *Qpos, W { expa = norm_l( maxNegEn_fx ); - fraca = extract_h( L_shl_o( maxNegEn_fx, expa, &Overflow ) ); + fraca = extract_h( L_shl( maxNegEn_fx, expa ) ); expa = sub( Q29, expa ); // 30 - expa - 1; expb = norm_l( L_sum ); - fracb = round_fx_o( L_shl_o( L_sum, expb, &Overflow ), &Overflow ); + fracb = round_fx_sat( L_shl( L_sum, expb ) ); expb = sub( 30, add( expb, shl( X_fx.Q, 1 ) ) ); scale = shr( sub( fraca, fracb ), 15 ); - fracb = shl_o( fracb, scale, &Overflow ); + fracb = shl_sat( fracb, scale ); expb = sub( expb, scale ); tmp = div_s( fracb, fraca ); @@ -4005,10 +3942,6 @@ void copy_phase_fx( DTFS_STRUCTURE *X1_fx, DTFS_STRUCTURE X2_fx, DTFS_STRUCTURE Word32 Ltemp_fx, L_tmp; Word32 Lacc_fx; Word16 exp, tmp, exp1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif retX_fx->lag_fx = X1_fx->lag_fx; move16(); @@ -4018,8 +3951,8 @@ void copy_phase_fx( DTFS_STRUCTURE *X1_fx, DTFS_STRUCTURE X2_fx, DTFS_STRUCTURE FOR( k = 1; k <= HalfLag; k++ ) { - Lacc_fx = L_mult_o( X1_fx->a_fx[k], X1_fx->a_fx[k], &Overflow ); - Lacc_fx = L_mac_o( Lacc_fx, X1_fx->b_fx[k], X1_fx->b_fx[k], &Overflow ); /* 2*Q+1 */ + Lacc_fx = L_mult_sat( X1_fx->a_fx[k], X1_fx->a_fx[k] ); + Lacc_fx = L_mac_sat( Lacc_fx, X1_fx->b_fx[k], X1_fx->b_fx[k] ); /* 2*Q+1 */ exp = norm_l( Lacc_fx ); tmp = extract_h( L_shl( Lacc_fx, exp ) ); @@ -4061,15 +3994,15 @@ void copy_phase_fx( DTFS_STRUCTURE *X1_fx, DTFS_STRUCTURE X2_fx, DTFS_STRUCTURE d1h = extract_h( Ltemp_fx ); d1l = extract_l( Ltemp_fx ); Ltemp_fx = L_mult0( X1_fx->b_fx[k], d1l ); - Ltemp_fx = L_add_o( L_shr( Ltemp_fx, 15 ), L_mult_o( X1_fx->b_fx[k], d1h, &Overflow ), &Overflow ); /* sin(w) in Q(q+16+Q-15) */ - sn = round_fx_o( L_shl_o( Ltemp_fx, sub( 30, add( q, X1_fx->Q ) ), &Overflow ), &Overflow ); /* Q15 */ - retX_fx->b_fx[k] = mult_ro( X2_fx.a_fx[k], sn, &Overflow ); /* X2_fx.Q */ + Ltemp_fx = L_add_sat( L_shr( Ltemp_fx, 15 ), L_mult_sat( X1_fx->b_fx[k], d1h ) ); /* sin(w) in Q(q+16+Q-15) */ + sn = round_fx_sat( L_shl_sat( Ltemp_fx, sub( 30, add( q, X1_fx->Q ) ) ) ); /* Q15 */ + retX_fx->b_fx[k] = mult_r_sat( X2_fx.a_fx[k], sn ); /* X2_fx.Q */ move16(); Ltemp_fx = L_mult0( X1_fx->a_fx[k], d1l ); - Ltemp_fx = L_add_o( L_shr( Ltemp_fx, 15 ), L_mult_o( X1_fx->a_fx[k], d1h, &Overflow ), &Overflow ); /* cos(w) in Q(q+Q+1) */ - cn = round_fx_o( L_shl_o( Ltemp_fx, sub( 30, add( q, X1_fx->Q ) ), &Overflow ), &Overflow ); /* Q15 */ - retX_fx->a_fx[k] = mult_ro( X2_fx.a_fx[k], cn, &Overflow ); /* X2_fx.Q */ + Ltemp_fx = L_add_sat( L_shr( Ltemp_fx, 15 ), L_mult_sat( X1_fx->a_fx[k], d1h ) ); /* cos(w) in Q(q+Q+1) */ + cn = round_fx_sat( L_shl_sat( Ltemp_fx, sub( 30, add( q, X1_fx->Q ) ) ) ); /* Q15 */ + retX_fx->a_fx[k] = mult_r_sat( X2_fx.a_fx[k], cn ); /* X2_fx.Q */ move16(); } k = sub( k, 1 ); @@ -4123,10 +4056,6 @@ Word32 getSpEngyFromResAmp_fx( DTFS_STRUCTURE *X_fx, Word16 lband, Word16 hband, Word32 en; Word16 exp, tmp, expa, fraca, expb, fracb, scale; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif en = L_deposit_l( 0 ); if ( EQ_16( hband, X_fx->upper_cut_off_freq_fx ) ) @@ -4161,8 +4090,8 @@ Word32 getSpEngyFromResAmp_fx( DTFS_STRUCTURE *X_fx, Word16 lband, Word16 hband, FOR( i = 0; i < M + 1; i++ ) { /* Compute Re */ - Lacc = L_mac_o( Lacc, curr_lpc[i], cos_tab[n % M_fx], &Overflow ); /* Q28 */ - n = add( n, k4 ); /* n=4*i*k */ + Lacc = L_mac_sat( Lacc, curr_lpc[i], cos_tab[n % M_fx] ); /* Q28 */ + n = add( n, k4 ); /* n=4*i*k */ } Re = L_shr( Lacc, 1 ); /* Q27 */ @@ -4172,13 +4101,13 @@ Word32 getSpEngyFromResAmp_fx( DTFS_STRUCTURE *X_fx, Word16 lband, Word16 hband, FOR( i = 0; i < M + 1; i++ ) { /* Compute Im */ - Lacc = L_msu_o( Lacc, curr_lpc[i], sin_tab[n % M_fx], &Overflow ); /* Q28 */ - n = add( n, k4 ); /* n=4*i*k */ + Lacc = L_msu_sat( Lacc, curr_lpc[i], sin_tab[n % M_fx] ); /* Q28 */ + n = add( n, k4 ); /* n=4*i*k */ } - Im = L_shr( Lacc, 1 ); /* Q27 */ - /* Lacc=L_add(L_mult_ll(Re,Re),(Word32)L_mult_ll(Im,Im)); : Lacc=Re^2+Im^2 in Q23 */ - Lacc = L_add_o( Mult_32_32( Re, Re ), Mult_32_32( Im, Im ), &Overflow ); /* Lacc=Re^2+Im^2 in Q23 */ - Ltemp = L_mult0( X_fx->a_fx[k], X_fx->a_fx[k] ); /* 2*a[k]^2 in 2Q */ + Im = L_shr( Lacc, 1 ); /* Q27 */ + /* Lacc=L_add(L_mult_ll(Re,Re),(Word32)L_mult_ll(Im,Im)); : Lacc=Re^2+Im^2 in Q23 */ + Lacc = L_add_sat( Mult_32_32( Re, Re ), Mult_32_32( Im, Im ) ); /* Lacc=Re^2+Im^2 in Q23 */ + Ltemp = L_mult0( X_fx->a_fx[k], X_fx->a_fx[k] ); /* 2*a[k]^2 in 2Q */ /* Ltemp=(Word32)L_sat32_40(divide_dp(Ltemp,Lacc,-19,1)); : Ltemp in Q(2Q-13) */ if ( Lacc < 0 ) @@ -4204,7 +4133,7 @@ Word32 getSpEngyFromResAmp_fx( DTFS_STRUCTURE *X_fx, Word16 lband, Word16 hband, tmp = div_s( fracb, fraca ); /* 15-exp */ exp = sub( expb, expa ); - Ltemp = L_shl_o( tmp, sub( add( shl( X_fx->Q, 1 ), exp ), 27 ), &Overflow ); + Ltemp = L_shl_sat( tmp, sub( add( shl( X_fx->Q, 1 ), exp ), 27 ) ); } ELSE { @@ -4244,7 +4173,6 @@ Word32 getSpEngyFromResAmp_fx( DTFS_STRUCTURE *X_fx, Word16 lband, Word16 hband, /*-------------------------------------------------------------------*/ /* CALLED FROM : TX/RX */ /*===================================================================*/ - void DTFS_poleFilter_fx( DTFS_STRUCTURE *X_fx, Word16 *LPC, Word16 N, Word16 *S_fx, Word16 *C_fx ) { Word16 temp, temp1, temp2, HalfLag; @@ -4253,10 +4181,6 @@ void DTFS_poleFilter_fx( DTFS_STRUCTURE *X_fx, Word16 *LPC, Word16 N, Word16 *S_ Word16 k, n, na, nb; Word16 Qmin, Qab[MAXLAG_WI]; Word16 exp, tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif Qmin = 32767; move16(); HalfLag = s_min( shr( X_fx->lag_fx, 1 ), X_fx->nH_fx ); @@ -4270,21 +4194,20 @@ void DTFS_poleFilter_fx( DTFS_STRUCTURE *X_fx, Word16 *LPC, Word16 N, Word16 *S_ sum2_fx = L_deposit_l( 0 ); FOR( n = 0; n < N; n++ ) { - sum1_fx = L_mac_o( sum1_fx, LPC[n], C_fx[shl( temp2, 2 ) % shl( X_fx->lag_fx, 2 )], &Overflow ); /* Q(12+15+1) */ - sum2_fx = L_mac_o( sum2_fx, LPC[n], S_fx[shl( temp2, 2 ) % shl( X_fx->lag_fx, 2 )], &Overflow ); /* Q(12+15+1) */ + sum1_fx = L_mac_sat( sum1_fx, LPC[n], C_fx[shl( temp2, 2 ) % shl( X_fx->lag_fx, 2 )] ); /* Q(12+15+1) */ + sum2_fx = L_mac_sat( sum2_fx, LPC[n], S_fx[shl( temp2, 2 ) % shl( X_fx->lag_fx, 2 )] ); /* Q(12+15+1) */ temp2 = add( temp2, k ); } - - temp1 = round_fx_o( sum1_fx, &Overflow ); /* Q(12+15+1-16)=Q(12) */ - temp2 = round_fx_o( sum2_fx, &Overflow ); /* Q(12) */ + temp1 = round_fx_sat( sum1_fx ); /* Q(12+15+1-16)=Q(12) */ + temp2 = round_fx_sat( sum2_fx ); /* Q(12) */ /* Calculate the circular convolution */ - sum = L_mac_o( L_mult_o( temp1, temp1, &Overflow ), temp2, temp2, &Overflow ); /* Q(12+12+1)=Q(25) */ + sum = L_mac_sat( L_mult_sat( temp1, temp1 ), temp2, temp2 ); /* Q(12+12+1)=Q(25) */ L_temp1 = L_mult( temp1, X_fx->a_fx[k] ); - L_temp1 = L_mac_o( L_temp1, temp2, X_fx->b_fx[k], &Overflow ); /* Q(12+Q+1)=Q(13+Q) */ + L_temp1 = L_mac_sat( L_temp1, temp2, X_fx->b_fx[k] ); /* Q(12+Q+1)=Q(13+Q) */ L_temp2 = L_mult( temp1, X_fx->b_fx[k] ); - L_temp2 = L_msu_o( L_temp2, temp2, X_fx->a_fx[k], &Overflow ); /* Q(12+Q+1)=Q(13+Q) */ + L_temp2 = L_msu_sat( L_temp2, temp2, X_fx->a_fx[k] ); /* Q(12+Q+1)=Q(13+Q) */ IF( sum ) { exp = norm_l( sum ); @@ -4375,7 +4298,6 @@ void DTFS_poleFilter_fx( DTFS_STRUCTURE *X_fx, Word16 *LPC, Word16 N, Word16 *S_ /*-------------------------------------------------------------------*/ /* CALLED FROM : TX/RX */ /*===================================================================*/ - void poleFilter_setup_fx( const Word16 *LPC, Word16 N, DTFS_STRUCTURE X_fx, Word16 *S_fx, Word16 *C_fx, Word16 *pf_temp1, Word16 *pf_temp2, Word16 *pf_temp, Word16 *pf_n2_temp1 ) { Word16 temp1, temp2, HalfLag; @@ -4383,10 +4305,6 @@ void poleFilter_setup_fx( const Word16 *LPC, Word16 N, DTFS_STRUCTURE X_fx, Word Word32 sum; Word16 k, n, n1, n2; Word16 exp, tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif HalfLag = s_min( shr( X_fx.lag_fx, 1 ), X_fx.nH_fx ); FOR( k = 0; k <= HalfLag; k++ ) @@ -4399,8 +4317,8 @@ void poleFilter_setup_fx( const Word16 *LPC, Word16 N, DTFS_STRUCTURE X_fx, Word sum2_fx = L_deposit_l( 0 ); FOR( n = 0; n < N; n++ ) { - sum1_fx = L_mac_o( sum1_fx, LPC[n], C_fx[( 4 * temp2 ) % ( 4 * X_fx.lag_fx )], &Overflow ); /* Q(12+15+1) */ - sum2_fx = L_mac_o( sum2_fx, LPC[n], S_fx[( 4 * temp2 ) % ( 4 * X_fx.lag_fx )], &Overflow ); /* Q(12+15+1) */ + sum1_fx = L_mac_sat( sum1_fx, LPC[n], C_fx[( 4 * temp2 ) % ( 4 * X_fx.lag_fx )] ); /* Q(12+15+1) */ + sum2_fx = L_mac_sat( sum2_fx, LPC[n], S_fx[( 4 * temp2 ) % ( 4 * X_fx.lag_fx )] ); /* Q(12+15+1) */ temp2 = add( temp2, k ); } diff --git a/lib_com/window_fx.c b/lib_com/window_fx.c index a1ff625b08f2328fac98ec8066afed188f7e453d..df92abadeb50e9014c2cb14b27afb51a78c07458 100644 --- a/lib_com/window_fx.c +++ b/lib_com/window_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -20,7 +20,6 @@ #include "rom_basop_util.h" #include "prot_fx.h" - void ham_cos_window( Word16 *fh, /* o: 0Q15 */ const Word16 n1, /* i: */ @@ -29,14 +28,10 @@ void ham_cos_window( { Word16 i; Word32 cte, cc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif assert( n1 >= 102 ); /* if n1 is too low -> overflow in div_l */ - /* cte = PI2/(Float32)(2*n1 - 1); */ + /* cte = PI2/(Float32)(2*n1 - 1); */ BASOP_SATURATE_WARNING_OFF_EVS cte = L_deposit_l( div_l( PI2_10Q21, sub( shl( n1, 1 ), 1 ) ) ); /*0Q15*/ BASOP_SATURATE_WARNING_ON_EVS @@ -44,16 +39,16 @@ void ham_cos_window( move32(); FOR( i = 0; i < n1; i++ ) { - /* fh_f[i] = 0.54f - 0.46f * (Float32)cos(cc); */ + /* fh_f[i] = 0.54f - 0.46f * (Float32)cos(cc); */ BASOP_SATURATE_WARNING_OFF_EVS - fh[i] = sub_o( P54_0Q15, mult_r( getCosWord16( round_fx_o( L_shl_o( cc, 9, &Overflow ), &Overflow ) ), P92_0Q15 ), &Overflow ); /*0Q15*/ + fh[i] = sub_sat( P54_0Q15, mult_r( getCosWord16( round_fx_sat( L_shl_sat( cc, 9 ) ) ), P92_0Q15 ) ); /*0Q15*/ move16(); BASOP_SATURATE_WARNING_ON_EVS cc = L_add( cc, cte ); /*0Q15*/ } assert( n2 >= 26 ); /* if n2 is too low -> overflow in div_l */ - /* cte = PI2/(Float32)(4*n2 - 1); */ + /* cte = PI2/(Float32)(4*n2 - 1); */ cte = L_deposit_l( div_l( PI2_11Q20, sub( shl( n2, 2 ), 1 ) ) ); /*0Q15*/ cc = 0; move32(); @@ -62,8 +57,8 @@ void ham_cos_window( BASOP_SATURATE_WARNING_OFF_EVS FOR( i = n1; i < n1 + n2; i++ ) { - /* fh_f[i] = (Float32)cos(cc); */ - fh[i] = shl_o( getCosWord16( round_fx( L_shl( cc, 10 ) ) ), 1, &Overflow ); /*0Q15*/ + /* fh_f[i] = (Float32)cos(cc); */ + fh[i] = shl_sat( getCosWord16( round_fx( L_shl( cc, 10 ) ) ), 1 ); /*0Q15*/ move16(); cc = L_add( cc, cte ); } diff --git a/lib_com/window_ola_fx.c b/lib_com/window_ola_fx.c index 2948e725ecdb0ca7d1add2a05b91500c4b2b8aaa..1ca29f82ade4802ed92b381927d4fd3bd242d490 100644 --- a/lib_com/window_ola_fx.c +++ b/lib_com/window_ola_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include "options.h" /* Compilation switches */ diff --git a/lib_com/wtda.c b/lib_com/wtda.c deleted file mode 100644 index 3fb40813816c7b4462bdcc3ec82b8df2314fb845..0000000000000000000000000000000000000000 --- a/lib_com/wtda.c +++ /dev/null @@ -1,219 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include "cnst.h" -#include "prot_fx.h" -#include "rom_com.h" -#include -#include "wmc_auto.h" - - -void wtda_fx32( - const Word32 *new_audio, /* i : input audio Q11 */ - Word32 *wtda_audio, /* o : windowed audio Q11 */ - Word32 *old_wtda, /* i/o: windowed audio from previous frame */ - const Word16 left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */ - const Word16 right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ - const Word16 L /* i : length */ -) -{ - Word16 i, decimate, decay; - Word16 idx1, idx2, idx3, idx4; - Word16 n, windecay48, windecay16; - const Word32 *allsig_l, *allsig_r; - Word16 win_right[R2_48]; - Word16 win_int_left[R1_16]; - Word16 win_left[R1_48]; - Word16 win_int_right[R2_16]; - - tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L ); - - decimate = 1; /* L_FRAME 48k */ - move16(); - decay = 0; - move16(); - windecay48 = extract_l( WINDECAY48 ); // (int16_t)(2 * ((float)L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS)) + R1_48 - - test(); - IF( EQ_16( L, L_FRAME32k ) || EQ_16( L, L_FRAME16k ) ) - { - decimate = 3; - move16(); - decay = 1; - move16(); - } - ELSE IF( EQ_16( L, L_FRAME8k ) ) - { - decimate = 6; - move16(); - decay = 2; - move16(); - } - - SWITCH( L ) // (int16_t)((float)L * N_ZERO_MDCT_NS / FRAME_SIZE_NS) - { - case L_FRAME16k: - n = 90; - move16(); - BREAK; - case L_FRAME32k: - n = 180; - move16(); - BREAK; - case L_FRAME48k: - n = 270; - move16(); - BREAK; - default: - n = (Word16) ( ( L * N_ZERO_MDCT_NS ) / FRAME_SIZE_NS ); - move16(); - BREAK; - } - - windecay16 = extract_l( WINDECAY16 ); // (int16_t)(2 * ((float)L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS)) + R1_16; - - /* algorithmic delay reduction */ - i = 0; - move16(); - - IF( old_wtda == NULL ) - { - allsig_r = new_audio + n; - allsig_l = new_audio + n - L; - } - ELSE - { - allsig_r = new_audio + n; - allsig_l = old_wtda + n; - } - - IF( EQ_16( L, L_FRAME32k ) ) - { - FOR( i = 0; i < ( L / 2 - n ); i += 2 ) - { - idx1 = sub( sub( shr( L, 1 ), i ), 1 ); - idx2 = sub( sub( 3 * L_FRAME16k / 2 - 1, shr( i, 1 ) ), windecay16 ); - idx3 = add( shr( L, 1 ), i ); - idx4 = sub( add( 3 * L_FRAME16k / 2, shr( i, 1 ) ), windecay16 ); - wtda_audio[i] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_int_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_int_right[idx4] ) ); - move32(); - - idx1 = sub( sub( shr( L, 1 ), add( i, 1 ) ), 1 ); - idx2 = sub( add( i_mult( ( sub( sub( 3 * L_FRAME16k / 2, shr( i, 1 ) ), 1 ) ), decimate ), decay ), windecay48 ); - idx3 = add( add( shr( L, 1 ), i ), 1 ); - idx4 = sub( sub( sub( i_mult( ( add( 3 * L_FRAME16k / 2 + 1, shr( i, 1 ) ) ), decimate ), decay ), 1 ), windecay48 ); - wtda_audio[i + 1] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_right[idx4] ) ); - move32(); - } - - FOR( i = L / 2 - n; i < L / 2; i += 2 ) - { - wtda_audio[i] = L_negate( allsig_r[( ( ( L >> 1 ) - i ) - 1 )] ); - move32(); - wtda_audio[i + 1] = L_negate( allsig_r[( ( ( L >> 1 ) - ( i + 1 ) ) - 1 )] ); - move32(); - } - FOR( i = 0; i < n; i += 2 ) - { - wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[i], win_left[( ( ( i >> 1 ) * decimate ) + decay )] ), new_audio[( ( n - i ) - 1 )] ); - move32(); - wtda_audio[( ( i + ( L >> 1 ) ) + 1 )] = L_sub_sat( Mpy_32_16_1( allsig_l[i + 1], win_int_left[i / 2] ), new_audio[( ( n - ( i + 1 ) ) - 1 )] ); - move32(); - } - - FOR( i = n; i < L / 2; i += 2 ) - { - idx1 = i; - move16(); - idx2 = add( i_mult( shr( i, 1 ), decimate ), decay ); - idx3 = sub( sub( L, i ), 1 ); - idx4 = sub( sub( i_mult( sub( shr( L, 1 ), shr( i, 1 ) ), decimate ), 1 ), decay ); - wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_left[idx4] ) ); - move32(); - - idx1 = add( i, 1 ); - idx2 = shr( i, 1 ); - idx3 = sub( sub( L, add( i, 1 ) ), 1 ); - idx4 = sub( sub( shr( L, 1 ), shr( i, 1 ) ), 1 ); - wtda_audio[( ( i + ( L >> 1 ) ) + 1 )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_int_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_int_left[idx4] ) ); - move32(); - } - } - ELSE - { - FOR( i = 0; i < L / 2 - n; i++ ) - { - idx1 = sub( sub( shr( L, 1 ), i ), 1 ); - idx2 = sub( add( sub( i_mult( i_mult( 3, shr( L, 1 ) ), decimate ), i_mult( add( i, 1 ), decimate ) ), decay ), windecay48 ); - idx3 = add( shr( L, 1 ), i ); - idx4 = sub( sub( add( sub( i_mult( i_mult( 3, shr( L, 1 ) ), decimate ), 1 ), i_mult( add( i, 1 ), decimate ) ), decay ), windecay48 ); - wtda_audio[i] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_right[idx4] ) ); - move32(); - } - - FOR( i = L / 2 - n; i < L / 2; i++ ) - { - wtda_audio[i] = L_negate( allsig_r[( ( ( L >> 1 ) - i ) - 1 )] ); - move32(); - } - - FOR( i = 0; i < n; i++ ) - { - wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[i], win_left[( ( i * decimate ) + decay )] ), new_audio[( ( n - i ) - 1 )] ); - move32(); - } - - FOR( i = n; i < L / 2; i++ ) - { - idx1 = i; - move16(); - idx2 = add( i_mult( i, decimate ), decay ); - idx3 = sub( sub( L, i ), 1 ); - idx4 = sub( sub( sub( i_mult( L, decimate ), i_mult( i, decimate ) ), 1 ), decay ); - wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_left[idx4] ) ); - move32(); - } - } - - IF( old_wtda != NULL ) - { - Copy32( new_audio, old_wtda, L ); - } - - return; -} diff --git a/lib_com/wtda_fx.c b/lib_com/wtda_fx.c index e060984dff14eb316ed1d965e06830487eb1624b..c285d88839db98375e926999334b926e69f695ff 100644 --- a/lib_com/wtda_fx.c +++ b/lib_com/wtda_fx.c @@ -1,12 +1,15 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include +#include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* required by wmc_tool */ #include "stat_com.h" +#include "wmc_auto.h" + /*--------------------------------------------------------------------------* * mvr2r_inv() * @@ -412,21 +415,19 @@ void wtda_fx( return; } - -void wtda_ivas_fx( - Word16 *new_audio, /* i : input audio Q0 */ - Word16 *Q, /* i/o : Q of input/Output Audio */ - Word16 *wtda_audio, /* o : windowed audio Qout */ - Word16 *old_wtda, /* i/o: windowed audio from previous frame Qout */ - Word16 *Qold_wtda, +void wtda_fx32( + const Word32 *new_audio, /* i : input audio Q11 */ + Word32 *wtda_audio, /* o : windowed audio Q11 */ + Word32 *old_wtda, /* i/o: windowed audio from previous frame */ const Word16 left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */ const Word16 right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ const Word16 L /* i : length */ ) { Word16 i, decimate, decay; + Word16 idx1, idx2, idx3, idx4; Word16 n, windecay48, windecay16; - const Word16 *allsig_l, *allsig_r; + const Word32 *allsig_l, *allsig_r; Word16 win_right[R2_48]; Word16 win_int_left[R1_16]; Word16 win_left[R1_48]; @@ -434,12 +435,11 @@ void wtda_ivas_fx( tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L ); - decimate = 1; /* L_FRAME48k */ + decimate = 1; /* L_FRAME 48k */ move16(); decay = 0; move16(); - windecay48 = ( 2 * ( (Word64) L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_48; - move16(); + windecay48 = extract_l( WINDECAY48 ); // (int16_t)(2 * ((float)L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS)) + R1_48 test(); IF( EQ_16( L, L_FRAME32k ) || EQ_16( L, L_FRAME16k ) ) @@ -457,10 +457,27 @@ void wtda_ivas_fx( move16(); } - n = extract_l( Mpy_32_32( L, 603979776 /* N_ZERO_MDCT_NS / FRAME_SIZE_NS in Q31 */ ) ); + SWITCH( L ) // (int16_t)((float)L * N_ZERO_MDCT_NS / FRAME_SIZE_NS) + { + case L_FRAME16k: + n = 90; + move16(); + BREAK; + case L_FRAME32k: + n = 180; + move16(); + BREAK; + case L_FRAME48k: + n = 270; + move16(); + BREAK; + default: + n = (Word16) ( ( L * N_ZERO_MDCT_NS ) / FRAME_SIZE_NS ); + move16(); + BREAK; + } - windecay16 = ( 2 * ( L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_16; - move16(); + windecay16 = extract_l( WINDECAY16 ); // (int16_t)(2 * ((float)L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS)) + R1_16; /* algorithmic delay reduction */ i = 0; @@ -473,103 +490,106 @@ void wtda_ivas_fx( } ELSE { - /* Rescale signals if Q are not identical */ - IF( GT_16( *Qold_wtda, *Q ) ) - { - Copy_Scale_sig( old_wtda, old_wtda, L, sub( *Q, *Qold_wtda ) ); - *Qold_wtda = *Q; - move16(); - } - ELSE IF( LT_16( *Qold_wtda, *Q ) ) - { - Copy_Scale_sig( new_audio, new_audio, L, sub( *Qold_wtda, *Q ) ); - *Q = *Qold_wtda; - move16(); - } - allsig_r = new_audio + n; allsig_l = old_wtda + n; } IF( EQ_16( L, L_FRAME32k ) ) { - FOR( i = 0; i < L / 2 - n; i += 2 ) + FOR( i = 0; i < ( L / 2 - n ); i += 2 ) { - wtda_audio[i] = round_fx( L_msu0( L_mult0( negate( allsig_r[L / 2 - i - 1] ), win_int_right[3 * L_FRAME16k / 2 - i / 2 - 1 - windecay16] ), - allsig_r[L / 2 + i], win_int_right[3 * L_FRAME16k / 2 + i / 2 - windecay16] ) ); - move16(); - wtda_audio[i + 1] = round_fx( L_msu0( L_mult0( negate( allsig_r[L / 2 - ( i + 1 ) - 1] ), win_right[( 3 * L_FRAME16k / 2 - i / 2 - 1 ) * decimate + decay - windecay48] ), - allsig_r[L / 2 + i + 1], win_right[( 3 * L_FRAME16k / 2 + 1 + i / 2 ) * decimate - decay - 1 - windecay48] ) ); - move16(); + idx1 = sub( sub( shr( L, 1 ), i ), 1 ); + idx2 = sub( sub( 3 * L_FRAME16k / 2 - 1, shr( i, 1 ) ), windecay16 ); + idx3 = add( shr( L, 1 ), i ); + idx4 = sub( add( 3 * L_FRAME16k / 2, shr( i, 1 ) ), windecay16 ); + wtda_audio[i] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_int_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_int_right[idx4] ) ); + move32(); + + idx1 = sub( sub( shr( L, 1 ), add( i, 1 ) ), 1 ); + idx2 = sub( add( i_mult( ( sub( sub( 3 * L_FRAME16k / 2, shr( i, 1 ) ), 1 ) ), decimate ), decay ), windecay48 ); + idx3 = add( add( shr( L, 1 ), i ), 1 ); + idx4 = sub( sub( sub( i_mult( ( add( 3 * L_FRAME16k / 2 + 1, shr( i, 1 ) ) ), decimate ), decay ), 1 ), windecay48 ); + wtda_audio[i + 1] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_right[idx4] ) ); + move32(); } FOR( i = L / 2 - n; i < L / 2; i += 2 ) { - wtda_audio[i] = shr( negate( allsig_r[L / 2 - i - 1] ), 1 ); - move16(); - wtda_audio[i + 1] = shr( negate( allsig_r[L / 2 - ( i + 1 ) - 1] ), 1 ); - move16(); + wtda_audio[i] = L_negate( allsig_r[( ( ( L >> 1 ) - i ) - 1 )] ); + move32(); + wtda_audio[i + 1] = L_negate( allsig_r[( ( ( L >> 1 ) - ( i + 1 ) ) - 1 )] ); + move32(); } - FOR( i = 0; i < n; i += 2 ) { - wtda_audio[i + L / 2] = round_fx( L_msu0( L_mult0( allsig_l[i], win_left[( i / 2 ) * decimate + decay] ), - new_audio[n - i - 1], MAX16B ) ); - move16(); - wtda_audio[i + L / 2 + 1] = round_fx( L_msu0( L_mult0( allsig_l[i + 1], win_int_left[i / 2] ), - new_audio[n - ( i + 1 ) - 1], MAX16B ) ); - move16(); + wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[i], win_left[( ( ( i >> 1 ) * decimate ) + decay )] ), new_audio[( ( n - i ) - 1 )] ); + move32(); + wtda_audio[( ( i + ( L >> 1 ) ) + 1 )] = L_sub_sat( Mpy_32_16_1( allsig_l[i + 1], win_int_left[i / 2] ), new_audio[( ( n - ( i + 1 ) ) - 1 )] ); + move32(); } FOR( i = n; i < L / 2; i += 2 ) { - wtda_audio[i + L / 2] = round_fx( L_msu0( L_mult0( allsig_l[i], win_left[( i / 2 ) * decimate + decay] ), - allsig_l[L - i - 1], win_left[( L / 2 - i / 2 ) * decimate - 1 - decay] ) ); - move16(); - wtda_audio[i + L / 2 + 1] = round_fx( L_msu0( L_mult0( allsig_l[i + 1], win_int_left[i / 2] ), - allsig_l[L - ( i + 1 ) - 1], win_int_left[L / 2 - i / 2 - 1] ) ); + idx1 = i; move16(); + idx2 = add( i_mult( shr( i, 1 ), decimate ), decay ); + idx3 = sub( sub( L, i ), 1 ); + idx4 = sub( sub( i_mult( sub( shr( L, 1 ), shr( i, 1 ) ), decimate ), 1 ), decay ); + wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_left[idx4] ) ); + move32(); + + idx1 = add( i, 1 ); + idx2 = shr( i, 1 ); + idx3 = sub( sub( L, add( i, 1 ) ), 1 ); + idx4 = sub( sub( shr( L, 1 ), shr( i, 1 ) ), 1 ); + wtda_audio[( ( i + ( L >> 1 ) ) + 1 )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_int_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_int_left[idx4] ) ); + move32(); } } ELSE { FOR( i = 0; i < L / 2 - n; i++ ) { - wtda_audio[i] = round_fx( L_msu0( L_mult0( negate( allsig_r[L / 2 - i - 1] ), win_right[3 * L / 2 * decimate - ( i + 1 ) * decimate + decay - windecay48] ), - allsig_r[L / 2 + i], win_right[3 * L / 2 * decimate - 1 + ( i + 1 ) * decimate - decay - windecay48] ) ); - move16(); + idx1 = sub( sub( shr( L, 1 ), i ), 1 ); + idx2 = sub( add( sub( i_mult( i_mult( 3, shr( L, 1 ) ), decimate ), i_mult( add( i, 1 ), decimate ) ), decay ), windecay48 ); + idx3 = add( shr( L, 1 ), i ); + idx4 = sub( sub( add( sub( i_mult( i_mult( 3, shr( L, 1 ) ), decimate ), 1 ), i_mult( add( i, 1 ), decimate ) ), decay ), windecay48 ); + wtda_audio[i] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_right[idx4] ) ); + move32(); } FOR( i = L / 2 - n; i < L / 2; i++ ) { - wtda_audio[i] = shr( negate( allsig_r[L / 2 - i - 1] ), 1 ); - move16(); + wtda_audio[i] = L_negate( allsig_r[( ( ( L >> 1 ) - i ) - 1 )] ); + move32(); } FOR( i = 0; i < n; i++ ) { - wtda_audio[i + L / 2] = round_fx( L_msu0( L_mult0( allsig_l[i], win_left[i * decimate + decay] ), - new_audio[n - i - 1], MAX16B ) ); - move16(); + wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[i], win_left[( ( i * decimate ) + decay )] ), new_audio[( ( n - i ) - 1 )] ); + move32(); } FOR( i = n; i < L / 2; i++ ) { - wtda_audio[i + L / 2] = round_fx( L_msu0( L_mult0( allsig_l[i], win_left[i * decimate + decay] ), - allsig_l[L - i - 1], win_left[L * decimate - i * decimate - 1 - decay] ) ); + idx1 = i; move16(); + idx2 = add( i_mult( i, decimate ), decay ); + idx3 = sub( sub( L, i ), 1 ); + idx4 = sub( sub( sub( i_mult( L, decimate ), i_mult( i, decimate ) ), 1 ), decay ); + wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_left[idx4] ) ); + move32(); } } IF( old_wtda != NULL ) { - Copy( new_audio, old_wtda, L ); + Copy32( new_audio, old_wtda, L ); } return; } - void wtda_ext_fx( const Word16 *new_audio, /* i : input audio (Q_in) */ Word16 *wtda_audio, /* o : windowed audio (Q_in - 1) */ diff --git a/lib_debug/debug.c b/lib_debug/debug.c index aafc1b66332ef261ec444a0c2ca4cd269cb1a325..f9b0e34c3d44bbbfc4c40ae16464fc3dfa83caac 100644 --- a/lib_debug/debug.c +++ b/lib_debug/debug.c @@ -788,7 +788,7 @@ char *fname( #ifdef DEBUG_FORCE_DIR size_t len; len = strlen( tmp_fname ); - if (tmp_fname[len - 1] != '/' && tmp_fname[len - 1] != '\\' ) + if ( tmp_fname[len - 1] != '/' && tmp_fname[len - 1] != '\\' ) { /* add trailing '/' slash */ strcat( tmp_fname, "/" ); @@ -836,7 +836,7 @@ int16_t make_dirs( const char *const pathname ) if ( sep != 0 ) { - temp = calloc( 1, strlen( pathname ) + 1 ); + temp = calloc( strlen( pathname ) + 1, sizeof( char ) ); p = pathname; while ( ( p = strchr( p, sep ) ) != NULL ) { diff --git a/lib_debug/wmc_auto.c b/lib_debug/wmc_auto.c index d357c03dd7d09ed3721a2fd735b48c26978e6fec..5afd9de166568531c15df05978d588430d1cad77 100644 --- a/lib_debug/wmc_auto.c +++ b/lib_debug/wmc_auto.c @@ -1018,7 +1018,7 @@ int push_stack( const char *filename, const char *fctname ) } /* Check, if This is the New Worst-Case RAM (stack + heap) */ - current_stack_size = ( int32_t )( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); + current_stack_size = (int32_t) ( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); if ( current_stack_size < 0 ) { @@ -1226,7 +1226,7 @@ void *mem_alloc( current_heap_size += ptr_record->block_size; /* Check, if this is the new Worst-Case RAM (stack + heap) */ - current_stack_size = ( int32_t )( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); + current_stack_size = (int32_t) ( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); if ( current_stack_size + current_heap_size > wc_ram_size ) { wc_ram_size = current_stack_size + current_heap_size; @@ -2030,8 +2030,10 @@ void print_mem( ROM_Size_Lookup_Table Const_Data_PROM_Table[] ) { fprintf( stdout, "Error: Cannot retrieve or calculate Table ROM size of (%s)!\n", Const_Data_PROM_Table[i].file_spec ); } - - fprintf( stdout, "Table ROM (const data) size (%s): %d %s\n", Const_Data_PROM_Table[i].file_spec, Const_Data_PROM_Table[i].Get_Const_Data_Size_Func() >> Stat_Cnt_Size, Count_Unit[Stat_Cnt_Size] ); + else + { + fprintf( stdout, "Table ROM (const data) size (%s): %d %s\n", Const_Data_PROM_Table[i].file_spec, Const_Data_PROM_Table[i].Get_Const_Data_Size_Func() >> Stat_Cnt_Size, Count_Unit[Stat_Cnt_Size] ); + } } } else @@ -2416,7 +2418,7 @@ int EQ_64( long long int L64_var1, long long int L64_var2 ) #endif return F_ret; } -int NE_64( long long int L64_var1, long long int L64_var2 ) +int NE_64( long long int L64_var1, long long int L64_var2 ) { int F_ret = 0; @@ -2503,7 +2505,7 @@ void Reset_BASOP_WMOPS_counter( unsigned int counterId ) /* reset the current BASOP operation counter */ ptr = (unsigned int *) &multiCounter[counterId]; - for ( i = 0; i < (int) (sizeof(BASIC_OP) / sizeof(unsigned int)); i++ ) + for ( i = 0; i < (int) ( sizeof( BASIC_OP ) / sizeof( unsigned int ) ); i++ ) { *ptr++ = 0; } diff --git a/lib_debug/wmc_auto.h b/lib_debug/wmc_auto.h index 59bbc5bbf72f54a9ab64216be94d3c5f4ce57800..64e2c751a9261c0e8e02c147f194047f61b83786 100644 --- a/lib_debug/wmc_auto.h +++ b/lib_debug/wmc_auto.h @@ -34,7 +34,7 @@ #define ENH_64_BIT_OPERATOR #define ENH_U_32_BIT_OPERATOR #define COMPLEX_OPERATOR -#define CONTROL_CODE_OPS /* enable control code operators such as LT_16, GT_16, ... */ +#define CONTROL_CODE_OPS /* enable control code operators such as LT_16, GT_16, ... */ #define WMOPS_DISABLE_FCN_CALL_PENALIZATION /* do not count the complexity of function calls */ #ifdef WMOPS @@ -123,7 +123,7 @@ void update_mem( void ); ops_cnt += ( _MULT_C * ( x ) ); \ inst_cnt[_MULT] += ( x ); \ } -#define MAC( x ) \ +#define MAC_C( x ) \ { \ ops_cnt += ( _MAC_C * ( x ) ); \ inst_cnt[_MAC] += ( x ); \ @@ -258,7 +258,7 @@ void update_mem( void ); { \ ops_cnt += ( 2 * _TRANS_C * ( x ) ); \ inst_cnt[_TRANS] += ( x ); \ - } + } #else @@ -273,7 +273,7 @@ extern int cntr_push_pop; #define ADD( x ) #define ABS( x ) #define MULT( x ) -#define MAC( x ) +#define MAC_C( x ) #define MOVE( x ) #define STORE( x ) #define LOGIC( x ) @@ -335,29 +335,29 @@ extern int cntr_push_pop; #endif /* Define all Macros without '{' & '}' (None of these should be called externally!) */ -#define ABS_( x ) OP_COUNT_( _ABS, ( x ) ) -#define ADD_( x ) OP_COUNT_( _ADD, ( x ) ) -#define MULT_( x ) OP_COUNT_( _MULT, ( x ) ) -#define MAC_( x ) OP_COUNT_( _MAC, ( x ) ) -#define MOVE_( x ) OP_COUNT_( _MOVE, ( x ) ) -#define STORE_( x ) OP_COUNT_( _STORE, ( x ) ) -#define LOGIC_( x ) OP_COUNT_( _LOGIC, ( x ) ) -#define SHIFT_( x ) OP_COUNT_( _SHIFT, ( x ) ) -#define BRANCH_( x ) OP_COUNT_( _BRANCH, ( x ) ) -#define DIV_( x ) OP_COUNT_( _DIV, ( x ) ) -#define SQRT_( x ) OP_COUNT_( _SQRT, ( x ) ) -#define TRANS_( x ) OP_COUNT_( _TRANS, ( x ) ) +#define ABS_( x ) OP_COUNT_( _ABS, ( x ) ) +#define ADD_( x ) OP_COUNT_( _ADD, ( x ) ) +#define MULT_( x ) OP_COUNT_( _MULT, ( x ) ) +#define MAC_( x ) OP_COUNT_( _MAC, ( x ) ) +#define MOVE_( x ) OP_COUNT_( _MOVE, ( x ) ) +#define STORE_( x ) OP_COUNT_( _STORE, ( x ) ) +#define LOGIC_( x ) OP_COUNT_( _LOGIC, ( x ) ) +#define SHIFT_( x ) OP_COUNT_( _SHIFT, ( x ) ) +#define BRANCH_( x ) OP_COUNT_( _BRANCH, ( x ) ) +#define DIV_( x ) OP_COUNT_( _DIV, ( x ) ) +#define SQRT_( x ) OP_COUNT_( _SQRT, ( x ) ) +#define TRANS_( x ) OP_COUNT_( _TRANS, ( x ) ) #define POWER_( x ) TRANS_( x ) #define LOG_( x ) TRANS_( x ) -#define LOOP_( x ) OP_COUNT_( _LOOP, ( x ) ) -#define INDIRECT_( x ) OP_COUNT_( _INDIRECT, ( x ) ) -#define PTR_INIT_( x ) OP_COUNT_( _PTR_INIT, ( x ) ) +#define LOOP_( x ) OP_COUNT_( _LOOP, ( x ) ) +#define INDIRECT_( x ) OP_COUNT_( _INDIRECT, ( x ) ) +#define PTR_INIT_( x ) OP_COUNT_( _PTR_INIT, ( x ) ) #ifdef WMOPS_DISABLE_FCN_CALL_PENALIZATION -#define FUNC_( x ) ( x ) +#define FUNC_( x ) ( x ) #else -#define FUNC_( x ) ( OP_COUNT_( _MOVE, ( x ) ), OP_COUNT_( _FUNC, 1 ) ) +#define FUNC_( x ) ( OP_COUNT_( _MOVE, ( x ) ), OP_COUNT_( _FUNC, 1 ) ) #endif -#define MISC_( x ) ABS_( x ) +#define MISC_( x ) ABS_( x ) /* Math Operations */ #define abs_ OP_COUNT_WRAPPER1_( ABS_( 1 ), abs ) @@ -401,8 +401,8 @@ extern int cntr_push_pop; #define frexp_ OP_COUNT_WRAPPER1_( MISC_( 2 ), frexp ) #define frexpf_ OP_COUNT_WRAPPER1_( MISC_( 2 ), frexpf ) -/* the macros below are instrumented versions of user-defined macros that might be used in the source code - representing some well-known and recognized mathematical operations (that are not defined in math.h) +/* the macros below are instrumented versions of user-defined macros that might be used in the source code + representing some well-known and recognized mathematical operations (that are not defined in math.h) Note: the 'wmc_flag_=wmc_flag_' is used to avoid warning: left-hand operand of comma expression has no effect with gcc */ #define min_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), min( ( a ), ( b ) ) ) @@ -928,7 +928,7 @@ typedef struct unsigned int Madd_32_32_r; /* Complexity Weight of 1 */ unsigned int Msub_32_32; /* Complexity Weight of 1 */ unsigned int Msub_32_32_r; /* Complexity Weight of 1 */ -#endif /* #ifdef ENH_32_BIT_OPERATOR */ +#endif /* #ifdef ENH_32_BIT_OPERATOR */ #ifdef ENH_U_32_BIT_OPERATOR unsigned int UL_addNs; /* Complexity Weight of 1 */ @@ -938,7 +938,7 @@ typedef struct unsigned int Mpy_32_16_uu; /* Complexity Weight of 2 */ unsigned int norm_ul_float; /* Complexity Weight of 1 */ unsigned int UL_deposit_l; /* Complexity Weight of 1 */ -#endif /* #ifdef ENH_U_32_BIT_OPERATOR */ +#endif /* #ifdef ENH_U_32_BIT_OPERATOR */ #ifdef CONTROL_CODE_OPS unsigned int LT_16; /* Complexity Weight of 1 */ @@ -1095,7 +1095,9 @@ void incrIf( const char *func_name ); #ifndef WMOPS #define ELSE else #else /* ifndef WMOPS */ -#define ELSE else if ( incrElse( __func__ ), 0 ); else +#define ELSE \ + else if ( incrElse( __func__ ), 0 ); \ + else void incrElse( const char *func_name ); #endif /* ifndef WMOPS */ diff --git a/lib_dec/ACcontextMapping_dec_fx.c b/lib_dec/ACcontextMapping_dec_fx.c index 22e9fff0114f1f5c0d3b5057744a446f95a0a0bb..60269751b1da0ff3c090390a467677449519fc6d 100644 --- a/lib_dec/ACcontextMapping_dec_fx.c +++ b/lib_dec/ACcontextMapping_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -328,9 +328,6 @@ Word16 ACcontextMapping_decode2_no_mem_s17_LC( return resQBits; } -#define IVAS_CONTEXT_MAPPING -#ifdef IVAS_CONTEXT_MAPPING - /*-------------------------------------------------------------------* * RCcontextMapping_decode2_no_mem_s17_LCS() * @@ -737,6 +734,3 @@ Word16 RCcontextMapping_decode2_no_mem_s17_LCS_fx( return resQBits; } - -#endif -#undef IVAS_CONTEXT_MAPPING diff --git a/lib_dec/FEC_HQ_core_fx.c b/lib_dec/FEC_HQ_core_fx.c index cc03dcf525f424e500118ee9f8d2362c74ebedd3..43d1e26276cd38025a1f819bc580aa761ea3ec8d 100644 --- a/lib_dec/FEC_HQ_core_fx.c +++ b/lib_dec/FEC_HQ_core_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -43,10 +43,6 @@ static void Regression_Anal_fx( Word32 L_tmp1, L_tmp2; Word16 aindex_fx[MAX_PGF + 1]; // Q0 Word32 b_p_fx[MAX_PGF + 1]; // Q10 -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* Initialize */ FOR( i = 0; i < add( num_pgf, 1 ); i++ ) @@ -78,7 +74,7 @@ static void Regression_Anal_fx( { b_p_fx[0] = L_add( b_p_fx[0], L_shr( values_fx[i], 2 ) ); /*10 */ move32(); - b_p_fx[1] = L_add( b_p_fx[1], Mult_32_16( values_fx[i], shl_o( sub( num_pgf, i ), 13, &Overflow ) ) ); /*10 */ + b_p_fx[1] = L_add( b_p_fx[1], Mult_32_16( values_fx[i], shl_sat( sub( num_pgf, i ), 13 ) ) ); /*10 */ move32(); } @@ -162,10 +158,6 @@ void HQ_FEC_processing_fx( Word16 energy_diff_fx; // Q10 HQ_NBFEC_HANDLE hHQ_nbfec; HQ_DEC_HANDLE hHQ_core; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif hHQ_nbfec = st_fx->hHQ_nbfec; hHQ_core = st_fx->hHQ_core; @@ -382,7 +374,7 @@ void HQ_FEC_processing_fx( FOR( j = 0; j < Num_bands_p[i]; j++ ) { - hHQ_nbfec->Norm_gain_fx[k] = shl_o( tmp_fx, 1, &Overflow ); + hHQ_nbfec->Norm_gain_fx[k] = shl_sat( tmp_fx, 1 ); move16(); k = add( k, 1 ); } @@ -437,10 +429,6 @@ void ivas_HQ_FEC_Mem_update_fx( HQ_DEC_HANDLE hHQ_core; hHQ_nbfec = st_fx->hHQ_nbfec; hHQ_core = st_fx->hHQ_core; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif move32(); // for tmp_energy_fx IF( EQ_16( output_frame, L_FRAME8k ) ) { @@ -518,8 +506,8 @@ void ivas_HQ_FEC_Mem_update_fx( L_tmp = L_add( L_tmp, L_shr( normq_fx[k], 3 ) ); /*11*/ k = add( k, 1 ); } - tmp_fx = shl_o( inv_tbl_fx[Num_bands_p[i]], 1, &Overflow ); /*16*/ - norm_values_fx[0] = Mult_32_16( L_tmp, tmp_fx ); /*11 + 16 - 15*/ + tmp_fx = shl_sat( inv_tbl_fx[Num_bands_p[i]], 1 ); /*16*/ + norm_values_fx[0] = Mult_32_16( L_tmp, tmp_fx ); /*11 + 16 - 15*/ move32(); tmp_energy_fx = L_add( tmp_energy_fx, L_shr( L_tmp, 3 ) ); /*8*/ } @@ -638,7 +626,7 @@ void ivas_HQ_FEC_Mem_update_fx( exp2 = norm_l( hHQ_nbfec->ynrm_values_fx[i][0] ); tmp_fx = div_s( extract_h( L_shl( en_high_fx[i], exp1 ) ), extract_h( L_shl( hHQ_nbfec->ynrm_values_fx[i][0], exp2 ) ) ); exp = add( 15, sub( exp1, exp2 ) ); - *mean_en_high_fx = add_o( *mean_en_high_fx, shr_o( tmp_fx, sub( exp, 5 ), &Overflow ), &Overflow ); + *mean_en_high_fx = add_sat( *mean_en_high_fx, shr_sat( tmp_fx, sub( exp, 5 ) ) ); move16(); } *mean_en_high_fx = mult( *mean_en_high_fx, inv_tbl_fx[sub( num_Sb, k )] ); @@ -720,10 +708,6 @@ void HQ_FEC_Mem_update_fx( HQ_DEC_HANDLE hHQ_core; hHQ_nbfec = st_fx->hHQ_nbfec; hHQ_core = st_fx->hHQ_core; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif move32(); // tmp_energy_fx IF( EQ_16( output_frame, L_FRAME8k ) ) @@ -803,8 +787,8 @@ void HQ_FEC_Mem_update_fx( L_tmp = L_add( L_tmp, L_shr( normq_fx[k], 3 ) ); /*11*/ k = add( k, 1 ); } - tmp_fx = shl_o( inv_tbl_fx[Num_bands_p[i]], 1, &Overflow ); /*16*/ - norm_values_fx[0] = Mult_32_16( L_tmp, tmp_fx ); /*11 + 16 - 15*/ + tmp_fx = shl_sat( inv_tbl_fx[Num_bands_p[i]], 1 ); /*16*/ + norm_values_fx[0] = Mult_32_16( L_tmp, tmp_fx ); /*11 + 16 - 15*/ move32(); tmp_energy_fx = L_add( tmp_energy_fx, L_shr( L_tmp, 3 ) ); /*8*/ } @@ -924,7 +908,7 @@ void HQ_FEC_Mem_update_fx( exp2 = norm_l( hHQ_nbfec->ynrm_values_fx[i][0] ); tmp_fx = div_s( extract_h( L_shl( en_high_fx[i], exp1 ) ), extract_h( L_shl( hHQ_nbfec->ynrm_values_fx[i][0], exp2 ) ) ); exp = add( 15, sub( exp1, exp2 ) ); - *mean_en_high_fx = add_o( *mean_en_high_fx, shr_o( tmp_fx, sub( exp, 5 ), &Overflow ), &Overflow ); + *mean_en_high_fx = add_sat( *mean_en_high_fx, shr_sat( tmp_fx, sub( exp, 5 ) ) ); move16(); } *mean_en_high_fx = mult( *mean_en_high_fx, inv_tbl_fx[sub( num_Sb, k )] ); @@ -995,10 +979,6 @@ static Word16 find_best_delay_fx( Word32 min_sq_cross_fx, min_corr_fx; Word32 accA_fx, accB_fx; Word32 Rxy_fx[MAXDELAY_FEC], Ryy_fx[MAXDELAY_FEC]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif move16(); // d1m @@ -1063,8 +1043,8 @@ static Word16 find_best_delay_fx( exp2 = norm_l( min_corr_fx ); L_tmp1 = L_shl( min_sq_cross_fx, exp1 ); L_tmp2 = L_shl( min_corr_fx, exp2 ); - tmp = div_s( extract_h( L_tmp1 ), extract_h( L_tmp2 ) ); /*15 + exp1 - exp2 */ - tmp = shl_o( tmp, sub( exp2, add( exp1, 1 ) ), &Overflow ); /*14 */ + tmp = div_s( extract_h( L_tmp1 ), extract_h( L_tmp2 ) ); /*15 + exp1 - exp2 */ + tmp = shl_sat( tmp, sub( exp2, add( exp1, 1 ) ) ); /*14 */ } *false_flag = 0; diff --git a/lib_dec/FEC_HQ_phase_ecu_fx.c b/lib_dec/FEC_HQ_phase_ecu_fx.c index 34d01d7fe0ea41b37e77e9096bfc0ebedb3f5128..8e1cbb7b91c9f5c6a506ca099c40e750feb924f6 100644 --- a/lib_dec/FEC_HQ_phase_ecu_fx.c +++ b/lib_dec/FEC_HQ_phase_ecu_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -63,27 +63,12 @@ static Word16 sqrt2ndOrder( const Word16 ); static void windowing( const Word16 *, Word16 *, const Word16 *, const Word16, const Word16 ); static void windowing_ROM_optimized( const Word16 *, Word16 *, const Word16, const Word16, const Word16 ); static void fft_spec2_fx( const Word16[], Word32[], const Word16 ); -static void trans_ana_fx( const Word16 *, Word16 *, Word16 *, Word16 *, const Word16, const Word16, const Word16, const Word16, Word16 *, Word16 *, Word16 *, Word16 * ); -static void peakfinder_fx( const Word16 *, const Word16, Word16 *, Word16 *, const Word16 -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 endpoints /* i : Flag to include endpoints in peak search */ -#endif -); +static void trans_ana_fx( const Word16 *, Word16 *, Word16 *, Word16 *, const Word16, const Word16, const Word16, const Word16, const Word16, Word16 *, Word16 *, Word16 *, Word16 * ); +static void peakfinder_fx( const Word16 *, const Word16, Word16 *, Word16 *, const Word16 ); static Word16 imax_fx( const Word16 *, const Word16 ); -static void spec_ana_fx( const Word16 *prevsynth, Word16 *plocs, Word32 *plocsi, Word16 *num_plocs, Word16 *X_sav, const Word16 output_frame, const Word16 bwidth_fx, Word16 *Q -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 element_mode, - Word16 *noise_fac, - const Word16 pcorr -#endif -); +static void spec_ana_fx( const Word16 *prevsynth, Word16 *plocs, Word32 *plocsi, Word16 *num_plocs, Word16 *X_sav, const Word16 output_frame, const Word16 bwidth_fx, Word16 *Q ); static void subst_spec_fx( const Word16 *, const Word32 *, Word16 *, const Word16, Word16 *, const Word16 *, const Word16, const Word16 *, const Word16, Word16 *, const Word16 *, const Word16 *, Word16, const Word16 * ); static Word16 rand_phase_fx( const Word16 seed, Word16 *sin_F, Word16 *cos_F ); -#ifdef IVAS_FEC_ECU_TO_COMPLETE -static float imax2_jacobsen_mag( const float *y_re, const float *y_im ); -#endif /*------------------------------------------------------------------* * rand_phase() @@ -245,9 +230,10 @@ static void trans_ana_fx( const Word16 time_offs, /* i : Time offset (integral multiple of output_frame) */ const Word16 est_mus_content, /* i : 0.0=speech_like ... 1.0=Music (==st->env_stab ) */ const Word16 last_fec, /* i : signal that previous frame was concealed with fec_alg */ + const Word16 element_mode, /* i : element_mode req to handle EVS_MONO specific BE path */ Word16 *alpha, /* o : Magnitude modification factors for fade to average */ Word16 *beta, /* o : Magnitude modification factors for fade to average */ - Word16 *beta_mute, /* o : Factor for long-term mute Q15 */ + Word16 *beta_mute, /* o : Factor for long-term mute Q15 */ Word16 *Xavg /* o : Frequency group average gain to fade to */ ) { @@ -570,11 +556,23 @@ static void trans_ana_fx( mag_chg[k] = mult_r( mag_chg_1st[k], att_val ); /* Q15 */ move16(); - IF( GT_16( burst_len, BETA_MUTE_THR ) ) + IF( NE_16( element_mode, EVS_MONO ) ) { - *beta_mute = shr( *beta_mute, 1 ); - move16(); + IF( EQ_16( k, 0 ) && GT_16( burst_len, BETA_MUTE_THR ) ) /* beta_mute final long term attenuation adjusted only once per frame in the first sub-band, Ref Eq(184) in 26.447 */ + { + *beta_mute = shr( *beta_mute, 1 ); + move16(); + } + } + ELSE + { + IF( GT_16( burst_len, BETA_MUTE_THR ) ) /* legacy incorrect(too fast) EVS_MONO operation, still kept for BE. To be updated after EVS CR, ref Eq (184) in 26.447 */ + { + *beta_mute = shr( *beta_mute, 1 ); + move16(); + } } + alpha[k] = mag_chg[k]; move16(); /*beta[k] = sqrt(1.0f - SQR(alpha[k])) * *beta_mute;*/ @@ -666,9 +664,6 @@ static void ivas_peakfinder_fx( move16(); } len0Minus2 = sub( len0, 2 ); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - PMT( "\nlen0Minus2 = sub(len0, 2) is it still correct if IVAS_FEC_ECU_TO_COMPLETE is activated\n" ) -#endif FOR( i = 0; i < len0Minus2; i++ ) { @@ -755,7 +750,6 @@ static void ivas_peakfinder_fx( } ELSE { - // PMTE () ii = -1; /* First point is a peak */ move16(); IF( GE_16( len, 2 ) ) @@ -912,10 +906,6 @@ static void peakfinder_fx( Word16 *plocs, /* o : the indices of the identified peaks in x0 Q0 */ Word16 *cInd, /* o : number of identified peaks Q0 */ const Word16 sel /* i : The amount above surrounding data for a peak to be identified */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 endpoints /* i : Flag to include endpoints in peak search */ -#endif ) { const Word16 *pX0; @@ -951,11 +941,6 @@ static void peakfinder_fx( pInd = indarr; pDx01 = dx0; pDx0 = pDx01 + 1; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - len = 0; - move16(); - IF( endpoints ) -#endif { *pX++ = *pX0++; move16(); @@ -965,9 +950,6 @@ static void peakfinder_fx( move16(); } len0Minus2 = sub( len0, 2 ); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - PMT( "\nlen0Minus2 = sub(len0, 2) is it still correct if IVAS_FEC_ECU_TO_COMPLETE is activated\n" ) -#endif FOR( i = 0; i < len0Minus2; i++ ) { @@ -981,9 +963,6 @@ static void peakfinder_fx( } pX0++; } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( endpoints ) -#endif { *pInd = len0Minus1; move16(); @@ -994,13 +973,7 @@ static void peakfinder_fx( minimum_fx( x, len, &minMag ); pInd = indarr; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - test(); - test(); - IF( GT_16( len, 2 ) || ( !endpoints && ( len > 0 ) ) ) -#else IF( GT_16( len, 2 ) ) -#endif { /* Set initial parameters for loop */ tempMag = minMag; @@ -1011,9 +984,6 @@ static void peakfinder_fx( move16(); threshold = add( leftMin, sel ); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( len > 0 ) -#endif { /* Deal with first point a little differently since tacked it on Calculate the sign of the derivative since we took the first point @@ -1060,20 +1030,6 @@ static void peakfinder_fx( } pX--; /* After decrement, pX points to either x[-1] or x[0]. */ } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - PMTE() - ii = -1; /* First point is a peak */ - if ( len >= 2 ) - { - if ( x[1] >= x[0] ) - { - ii = 0; /* First point is a valley, skip it */ - } - } - } -#endif *cInd = 0; move16(); /*Loop through extrema which should be peaks and then valleys*/ @@ -1179,9 +1135,6 @@ static void peakfinder_fx( } ELSE /* This is a monotone function where an endpoint is the only peak */ { -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( endpoints ) -#endif { xInd = 1; move16(); @@ -1206,13 +1159,6 @@ static void peakfinder_fx( move16(); } } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { /* Input constant or all zeros -- no peaks found */ - *cInd = 0; - move16(); - } -#endif } } @@ -1230,10 +1176,6 @@ static Word16 imax_fx( /* o: The location, relative to the Word16 y1, y2, y3, man, expo, edge; const Word16 *pY; Word32 numer, denom, sign, acc, y3_y1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* Seek the extremum of the parabola P(x) defined by 3 consecutive points so that P([-1 0 1]) = [y1 y2 y3] */ pY = y; @@ -1266,9 +1208,9 @@ static Word16 imax_fx( /* o: The location, relative to the } /* Although the output of ratio() is in Q14, adding the missing factor of 2 (See above) * in the denominator, the output is now considered to be in Q15. */ - man = ratio( numer, denom, &expo ); /* The mantissa is considered in Q15 */ - posi = shr_o( man, expo, &Overflow ); /* in Q15 (Due to saturation, it is automatically bound inside [-1.0,1.0].) */ - if ( sign < 0 ) /* Restore the sign. */ + man = ratio( numer, denom, &expo ); /* The mantissa is considered in Q15 */ + posi = shr_sat( man, expo ); /* in Q15 (Due to saturation, it is automatically bound inside [-1.0,1.0].) */ + if ( sign < 0 ) /* Restore the sign. */ { posi = negate( posi ); } @@ -1416,7 +1358,6 @@ static void ivas_spec_ana_fx( } ELSE { - // PMTE() window_corr = w_hamm[0]; move16(); window_corr_step = idiv1616( w_hamm[0], hamm_len2 ); @@ -1441,7 +1382,6 @@ static void ivas_spec_ana_fx( } ELSE { - // PMTE() window_corr = w_hamm[0]; move16(); window_corr_step = idiv1616( w_hamm[0], hamm_len2 ); @@ -1500,7 +1440,7 @@ static void ivas_spec_ana_fx( man = mult_r( man, FEC_HQ_ECU_ROOT2 ); /* FEC_HQ_ECU_ROOT2 is sqrt(2) in Q14 */ expoBy2 = sub( expoBy2, 1 ); } - *pXfp++ = shr( man, expoBy2 ); + *pXfp++ = shr_sat( man, expoBy2 ); move16(); /* Denormalize the mantissa back to Q0. */ } } @@ -1590,11 +1530,7 @@ static void ivas_spec_ana_fx( test(); IF( n > 0 && *pPlocs == 0 ) /* Very 1st peak position possible to have a peak at 0/DC index position. */ { -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( &xfp[*pPlocs], xfp_32, 3, Q15 ); // Q + 15 -#else - Copy_Scale_sig_16_32_DEPREC( &xfp[*pPlocs], xfp_32, 3, Q16 ); // Q + 16 -#endif + Copy_Scale_sig_16_32_no_sat( &xfp[*pPlocs], xfp_32, 3, Q15 ); // Q + 15 acc = L_deposit_h( *pPlocs ); // Q16 *pPlocsi++ = L_add( acc, L_shl( imax_pos_fx( xfp_32 ) /* Q15 */, 1 ) ); // Q16 move32(); @@ -1605,11 +1541,7 @@ static void ivas_spec_ana_fx( test(); IF( n > 0 && EQ_16( *pPlocs, 1 ) ) /* Also 2nd peak position uses DC which makes jacobsen unsuitable. */ { -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( &xfp[*pPlocs - 1], xfp_32, 3, Q15 ); // Q + 15 -#else - Copy_Scale_sig_16_32_DEPREC( &xfp[*pPlocs - 1], xfp_32, 3, Q16 ); // Q + 16 -#endif + Copy_Scale_sig_16_32_no_sat( &xfp[*pPlocs - 1], xfp_32, 3, Q15 ); // Q + 15 acc = L_deposit_h( sub( *pPlocs, 1 ) ); // Q16 *pPlocsi++ = L_add( acc, L_shl( imax_pos_fx( xfp_32 ) /* Q15 */, 1 ) ); // Q16 move32(); @@ -1655,11 +1587,7 @@ static void ivas_spec_ana_fx( IF( EQ_16( currPlocs, ( sub( Lprot2_1, DELTA_CORR_F0_INT ) ) ) ) /* Also 2nd last peak position uses fs/2 which makes jacobsen less suitable. */ { -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( &xfp[currPlocs - 1], xfp_32, 3, Q15 ); // Q + 15 -#else - Copy_Scale_sig_16_32_DEPREC( &xfp[currPlocs - 1], xfp_32, 3, Q16 ); // Q + 16 -#endif + Copy_Scale_sig_16_32_no_sat( &xfp[currPlocs - 1], xfp_32, 3, Q15 ); // Q + 15 acc = L_deposit_h( sub( currPlocs, 1 ) ); // Q16 *pPlocsi++ = L_add( acc, L_shl( imax_pos_fx( xfp_32 ) /* Q15 */, 1 ) ); // Q16 move32(); @@ -1673,11 +1601,7 @@ static void ivas_spec_ana_fx( * whould point */ IF( n > 0 ) /* fs/2 which makes special case . */ { -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( &xfp[currPlocs - 2], xfp_32, 3, Q15 ); // Q + 15 -#else - Copy_Scale_sig_16_32_DEPREC( &xfp[currPlocs - 2], xfp_32, 3, Q16 ); // Q + 16 -#endif + Copy_Scale_sig_16_32_no_sat( &xfp[currPlocs - 2], xfp_32, 3, Q15 ); // Q + 15 acc = L_deposit_h( sub( currPlocs, 2 ) ); // Q16 *pPlocsi++ = L_add( acc, L_shl( imax_pos_fx( xfp_32 ) /* Q15 */, 1 ) ); // Q16 move32(); @@ -1725,12 +1649,6 @@ static void spec_ana_fx( const Word16 output_frame, /* i : Frame length Q0 */ const Word16 bwidth_fx, /* i : Encoded bandwidth index Q0 */ Word16 *Q /* o : Q value of the fft spectrum */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 element_mode, /* i : IVAS element mode */ - Word16 *noise_fac, /* o : for few peaks zeroing valleys decision making */ - const Word16 pcorr -#endif ) { Word16 Lprot, LprotLog2Minus1, hamm_len2, Lprot2, Lprot2_1, m, n; @@ -1798,52 +1716,18 @@ static void spec_ana_fx( IF( EQ_16( output_frame, L_FRAME48k ) ) { /* Apply hamming-rect window */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( EQ_16( element_mode, EVS_MONO ) ) -#endif { windowing( xfp, xfp, w_hamm_sana48k_2_fx, rectLength, hamm_len2 ); } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - PMTE() - // window_corr = w_hamm[0]; - // window_corr_step = w_hamm[0] / hamm_len2; - // for (i = 0; i < hamm_len2; i++) - //{ - // xfp[i] = prevsynth[i] * (w_hamm[i] - window_corr); - // xfp[Lprot - i - 1] = prevsynth[Lprot - i - 1] * (w_hamm[i] - window_corr); - // window_corr -= window_corr_step; - // } - } -#endif /* Spectrum */ fft3_fx( xfp, xfp, Lprot ); } ELSE { -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( EQ_16( element_mode, EVS_MONO ) ) -#endif { /* Apply hamming-rect window */ windowing_ROM_optimized( xfp, xfp, sinTblOffset, rectLength, hamm_len2 ); } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - PMTE() - // window_corr = w_hamm[0]; - // window_corr_step = w_hamm[0] / hamm_len2; - // for (i = 0; i < hamm_len2; i++) - //{ - // xfp[i] = prevsynth[i] * (w_hamm[i] - window_corr); - // xfp[Lprot - i - 1] = prevsynth[Lprot - i - 1] * (w_hamm[i] - window_corr); - // window_corr -= window_corr_step; - // } - } -#endif /* Spectrum */ r_fft_fx_lc( pFftTbl, Lprot, Lprot2, LprotLog2Minus1, xfp, xfp, 1 ); } @@ -1896,35 +1780,12 @@ static void spec_ana_fx( /* Find maximum and minimum. */ maximum_fx( xfp, Lprot2_1, &Xmax ); minimum_fx( xfp, Lprot2_1, &Xmin ); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( EQ_16( element_mode, EVS_MONO ) ) -#endif { sel = mult_r( sub( Xmax, Xmin ), CMPLMNT_PFIND_SENS_FX ); } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - sel = ( Xmax - Xmin ) * ( 1.0f - ST_PFIND_SENS ); - } -#endif - peakfinder_fx( xfp, Lprot2_1, plocs, num_plocs, sel -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - endpoints -#endif - ); + peakfinder_fx( xfp, Lprot2_1, plocs, num_plocs, sel ); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - /* Currently not the pitch correlation but some LF correlation */ - if ( element_mode != EVS_MONO && *num_plocs > 50 && pcorr < 0.6f ) - { - *num_plocs = 0; - } - - IF( EQ_16( element_mode, EVS_MONO ) ) -#endif { /* Refine peaks */ @@ -1971,105 +1832,6 @@ static void spec_ana_fx( move32(); /* in Q16. Append the fractional part to the integral part. */ } } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - Lprot2p1 = Lprot / 2 + 1; - - /* Refine peaks */ - pPlocsi = plocsi; - pPlocs = plocs; - n = *num_plocs; /* number of peaks to process */ - - /* Special case-- The very 1st peak if it is at 0 index position (DC) */ - /* With DELTA_CORR_F0_INT == 2 one needs to handle both *pPlocs==0 and *pPlocs==1 */ - if ( n > 0 && *pPlocs == 0 ) /* Very 1st peak position possible to have a peak at 0/DC index position. */ - { - *pPlocsi++ = *pPlocs + imax_pos( &xfp[*pPlocs] ); - pPlocs++; - n = n - 1; - } - - if ( n > 0 && *pPlocs == 1 ) /* Also 2nd peak position uses DC which makes jacobsen unsuitable. */ - { - *pPlocsi++ = *pPlocs - 1 + imax_pos( &xfp[*pPlocs - 1] ); - currPlocs = *pPlocs++; - n = n - 1; - } - - /* All remaining peaks except the very last two possible integer positions */ - currPlocs = *pPlocs++; - endPlocs = Lprot2p1 - DELTA_CORR_F0_INT; /* last *pPlocs position for Jacobsen */ - - /* precompute number of turns based on endpoint integer location and make into a proper for loop */ - if ( n > 0 ) - { - nJacob = n; - if ( sub( endPlocs, plocs[sub( *num_plocs, 1 )] ) <= 0 ) - { - nJacob = sub( nJacob, 1 ); - } - - for ( k = 0; k < nJacob; k++ ) - { - *pPlocsi++ = currPlocs + imax2_jacobsen_mag( &( X_sav[currPlocs - 1] ), &( X_sav[Lprot - 1 - currPlocs] ) ); - currPlocs = *pPlocs++; - } - n = n - nJacob; - } - - /* At this point there should at most two plocs left to process */ - /* the position before fs/2 and fs/2 both use the same magnitude points */ - if ( n > 0 ) - { - /* [ . . . . . . . ] Lprot/2+1 positions */ - /* | | | */ - /* 0 (Lprot/2-2) (Lprot/2) */ - - if ( currPlocs == ( Lprot2p1 - DELTA_CORR_F0_INT ) ) /* Also 2nd last peak position uses fs/2 which makes jacobsen less suitable. */ - { - *pPlocsi++ = currPlocs - 1 + imax_pos( &xfp[currPlocs - 1] ); - currPlocs = *pPlocs++; - n = n - 1; - } - - /* Here the only remaining point would be a fs/2 plocs */ - /* pXfp = xfp + sub(Lprot2,1); already set just a reminder where it - * whould point */ - if ( n > 0 ) /* fs/2 which makes special case . */ - { - *pPlocsi++ = currPlocs - 2 + imax_pos( &xfp[currPlocs - 2] ); - currPlocs = *pPlocs++; - n = n - 1; - } - } - - /* For few peaks decide noise floor attenuation */ - if ( *num_plocs < 3 && *num_plocs > 0 ) - { - sig = sum_f( xfp, Lprot2_1 ) + EPSILON; - - /*excluding peaks and neighboring bins*/ - for ( i = 0; i < *num_plocs; i++ ) - { - st_point = max( 0, plocs[i] - DELTA_CORR ); - end_point = min( Lprot2_1 - 1, plocs[i] + DELTA_CORR ); - set_f( &xfp[st_point], 0.0f, end_point - st_point + 1 ); - } - noise = sum_f( xfp, Lprot2_1 ) + EPSILON; - nsr = noise / sig; - - if ( nsr < 0.03f ) - { - *noise_fac = 0.5f; - } - else - { - *noise_fac = 1.0f; - } - } - } -#endif } /*-------------------------------------------------------------------* @@ -2376,8 +2138,8 @@ static void ivas_subst_spec_fx( move16(); im = *pImX; move16(); - tmp = sub( mult_r( re, cos_F ), mult_r( im, sin_F ) ); - im = add( mult_r( re, sin_F ), mult_r( im, cos_F ) ); + tmp = sub_sat( mult_r( re, cos_F ), mult_r( im, sin_F ) ); + im = add_sat( mult_r( re, sin_F ), mult_r( im, cos_F ) ); IF( LT_16( alpha[k], 32766 ) ) { alpha_local = mag_chg_local; @@ -2490,12 +2252,6 @@ static void subst_spec_fx( const Word16 *beta, /* i : Magnitude modification factors for fade to average Q15 */ Word16 beta_mute, /* i : Factor for long-term mute Q15 */ const Word16 *Xavg /* i : Frequency group averages to fade to Q0 */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 element_mode, /* i : IVAS element mode */ - const Word16 ph_ecu_lookahead, /* i : Phase ECU lookahead */ - const Word16 noise_fac /* i : noise factor */ -#endif ) { Word16 Xph_short; @@ -2516,11 +2272,6 @@ static void subst_spec_fx( Word16 alpha_local; Word16 beta_local; Word16 expo; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - Word16 one_peak_flag_mask; - Word16 alpha_local; - Word16 beta_local; -#endif Word16 mag_chg_local; /*for peak attenuation in burst */ Lprot = 512; @@ -2563,7 +2314,7 @@ static void subst_spec_fx( move16(); tmp = add( tmp, sub( Lecu, shr( sub( Lecu, Lprot ), 1 ) ) ); tmp = sub( tmp, shr( output_frame, 1 ) ); - tmp = add( tmp, time_offs ); + tmp = add_sat( tmp, time_offs ); tmp = round_fx( L_shl( L_mult0( tmp, Lprot_inv ), 4 ) ); /* 0+22+4-16=10 */ pPlocsi = plocsi; @@ -2576,21 +2327,6 @@ static void subst_spec_fx( move32(); } } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - one_peak_flag_mask = 1; /* all ones mask -> keep */ - IF( NE_16( element_mode, EVS_MONO ) ) - { - if ( ( *num_plocs > 0 ) && sub( *num_plocs, 3 ) < 0 ) - { - one_peak_flag_mask = noise_fac; /* all zeroes mask -> zero */ - } - if ( *num_plocs == 0 ) - { - X[0] = 0; /* reset DC if there are no peaks */ - X[shr( Lprot, 1 )] = 0; /* also reset fs/2 if there are no peaks */ - } - } -#endif lprotBy2Minus1 = sub( shr( Lprot, 1 ), 1 ); i = 1; move16(); @@ -2651,21 +2387,10 @@ static void subst_spec_fx( move16(); im = *pImX; move16(); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( EQ_16( element_mode, EVS_MONO ) ) -#endif { tmp = sub( mult_r( re, cos_F ), mult_r( im, sin_F ) ); im = add( mult_r( re, sin_F ), mult_r( im, cos_F ) ); } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - PMTE() - // tmp = one_peak_flag_mask * (X[i] * cos_F - X[im_ind] * sin_F); - // X[im_ind] = one_peak_flag_mask * (X[i] * sin_F + X[im_ind] * cos_F); - } -#endif IF( LT_16( alpha[k], 32766 ) ) { *seed = rand_phase_fx( *seed, &sin_F, &cos_F ); @@ -2782,21 +2507,10 @@ static void subst_spec_fx( move16(); im = *pImX; move16(); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( EQ_16( element_mode, EVS_MONO ) ) -#endif { tmp = sub_sat( mult_r( re, cos_F ), mult_r( im, sin_F ) ); im = add_sat( mult_r( re, sin_F ), mult_r( im, cos_F ) ); } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - PMTE() - // tmp = one_peak_flag_mask * (X[i] * cos_F - X[im_ind] * sin_F); - // X[im_ind] = one_peak_flag_mask * (X[i] * sin_F + X[im_ind] * cos_F); - } -#endif IF( LT_16( alpha[k], 32766 ) ) { alpha_local = mag_chg_local; @@ -2994,7 +2708,7 @@ static void ivas_rec_wtda_fx( tmp = div_s( 1, shl( ola_len, 1 ) ); // Q15 tmp = round_fx( L_shl( L_mult( tmp, EVS_PI_FX ), 2 ) ); // Q15 sinq_fx( tmp, 0, ola_len, xfwin ); - v_mult16_fixed( xfwin, xfwin, xfwin, ola_len ); /* xfwin = sin^2 of 0..pi/4 */ + v_mult16_fx( xfwin, xfwin, xfwin, ola_len ); /* xfwin = sin^2 of 0..pi/4 */ pOldW = xfwin + sub( ola_len, 1 ); pNewW = xfwin; FOR( i = 0; i < ola_len; i++ ) @@ -3048,98 +2762,7 @@ static void rec_wtda_fx( Word16 *p_ecu; Word16 g; Word16 tbl_delta; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - float xsubst_[2 * L_FRAME48k]; - const float *w_hamm; - float *pX_start, *pX_end; - float tmp; - int16_t hamm_len2; - float *pNew; - const float *pOldW, *pNewW; - float xfwin[NS2SA( L_FRAME48k * FRAMES_PER_SEC, N_ZERO_MDCT_NS - ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 )]; - const float *pOld; - int16_t copy_len; - int16_t ola_len; - - copy_len = NS2SA( output_frame * FRAMES_PER_SEC, ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* prototype fill on each side of xsubst to fill MDCT Frame */ - ola_len = NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS - ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* remaining lengt of LA_ZEROS to overlap add decoded with xsubst */ - - if ( output_frame == L_FRAME48k ) - { - w_hamm = w_hamm_sana48k_2; - hamm_len2 = L_PROT_HAMM_LEN2_48k; - } - else if ( output_frame == L_FRAME32k ) - { - w_hamm = w_hamm_sana32k_2; - hamm_len2 = L_PROT_HAMM_LEN2_32k; - } - else - { - w_hamm = w_hamm_sana16k_2; - hamm_len2 = L_PROT_HAMM_LEN2_16k; - } - - if ( element_mode != EVS_MONO && *num_p > 0 && plocs[0] > 3 ) - { - /* Perform inverse windowing of hammrect */ - pX_start = X; - pX_end = X + Lprot - 1; - for ( i = 0; i < hamm_len2; i++ ) - { - tmp = 1.0f / *w_hamm; - *pX_start *= tmp; - *pX_end *= tmp; - pX_start++; - pX_end--; - w_hamm++; - } - } - - /* extract reconstructed frame with aldo window */ - timesh = NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) - ( 2 * output_frame - Lprot ) / 2; - - set_f( xsubst_, 0.0f, 2 * output_frame - Lprot + timesh ); - mvr2r( X, xsubst_ + 2 * output_frame - Lprot + timesh, Lprot - timesh ); - - /* Copy and OLA look ahead zero part of MDCT window from decoded signal */ - if ( element_mode != EVS_MONO ) - { - mvr2r( old_dec, xsubst_ + NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ), copy_len ); /* also need to scale to Q0 ?? */ - pOld = old_dec + copy_len; - pNew = xsubst_ + copy_len + NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ); - sinq( EVS_PI / ( ola_len * 2 ), 0.0f, ola_len, xfwin ); - v_mult( xfwin, xfwin, xfwin, ola_len ); /* xfwin = sin^2 of 0..pi/4 */ - pOldW = xfwin + ola_len - 1; - pNewW = xfwin; - for ( i = 0; i < ola_len; i++ ) - { - *pNew = *pOld * *pOldW + *pNew * *pNewW; - pOld += 1; - pNew += 1; - pOldW -= 1; - pNewW += 1; - } - } - else - { - /* Smoothen onset of ECU frame */ - xf_len = (int16_t) ( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) - ( output_frame - Lprot / 2 ); - p_ecu = xsubst_ + 2 * output_frame - Lprot + timesh; - tbl_delta = 64.f / xf_len; /* 64 samples = 1/4 cycle in sincos_t */ - for ( i = 0; i < xf_len; i++, p_ecu++ ) - { - g = sincos_t[( (int16_t) ( i * tbl_delta ) )]; - g *= g; - *p_ecu = g * ( *p_ecu ); - } - } - - /* Apply TDA and windowing to ECU frame */ - wtda( xsubst_ + output_frame, ecu_rec, NULL, ALDO_WINDOW, ALDO_WINDOW, output_frame ); -#else - // PMTE() xsubst_ = rec_buf + output_frame; Lprot2 = shr( Lprot, 1 ); @@ -3191,7 +2814,6 @@ static void rec_wtda_fx( out_ptr = rec_buf + sub( shl( output_frame, 1 ), timesh ); wtda_fx( out_ptr, &Qin, ecu_rec, NULL, 0, ALDO_WINDOW, ALDO_WINDOW, /* window overlap of current frame (0: full, 2: none, or 3: half) */ output_frame ); -#endif return; } @@ -3255,15 +2877,7 @@ static void rec_frame_fx( Word16 *X, /* i : FFT spectrum */ Word32 *ecu_rec, /* o : Reconstructed frame in tda domain */ const Word16 output_frame, /* i : Frame length */ - const Word16 Q -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const float *old_dec, /* i : end of last decoded for OLA before tda and itda */ - const int16_t element_mode, /* i : IVAS element mode */ - const int16_t *num_p, /* i : Number of peaks */ - const int16_t *plocs /* i : Peak locations */ -#endif -) + const Word16 Q ) { const Word16 *pFftTbl; Word16 Lprot, lprotLog2Minus1; @@ -3311,13 +2925,9 @@ static Word32 mult_32_32_q( const Word32 a, const Word32 b, const Word16 q ) { Word32 hi; UWord32 lo; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif Mpy_32_32_ss( a, b, &hi, &lo ); - return L_or( L_shl_o( hi, sub( 32 - 1, q ), &Overflow ), L_lshr( (Word32) lo, add( q, 1 ) ) ); + return L_or( L_shl_sat( hi, sub( 32 - 1, q ) ), L_lshr( (Word32) lo, add( q, 1 ) ) ); } static void fir_dwn_fx( @@ -4005,11 +3615,7 @@ static void ivas_fec_ecu_dft_fx( tmp = Exp16Array( *Nfft, Tfr16 ); *exp = add( tmp, add( 2, norm_s( *Nfft ) ) ); move16(); -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( Tfr16, Tfr32, *Nfft, *exp ); /*Qin+exp; */ -#else - Copy_Scale_sig_16_32_DEPREC( Tfr16, Tfr32, *Nfft, *exp ); /*Qin+exp; */ -#endif *exp = s_min( *exp, 15 ); DoRTFTn_fx( Tfr32, Tfi32, *Nfft ); @@ -4054,28 +3660,11 @@ static void fec_ecu_dft_fx( Word16 *Tf_abs, /*Qout */ Word16 *Nfft, Word16 *exp /*Qout = Qin+exp */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const int16_t element_mode /* i : IVAS element mode */ -#endif ) { Word32 L_tmp, Tmp, Tfr32[512], Tfi32[512], fac, *Pt1, *Pt2; Word16 i, tmp, tmp_short, N_LP, target[2 * L_FRAME48k], Tfr16[FEC_FFT_MAX_SIZE], *pt1, *pt2, *pt3; Word16 tmp_loop; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - int16_t alignment_point; - - Lon20 = (int16_t) 160 / 20; - if ( element_mode == EVS_MONO ) - { - alignment_point = 2 * 160 - 3 * Lon20; - } - else - { - alignment_point = 2 * 160; - } -#endif tmp = sub( 296, N ); Copy( &prevsynth_LP[tmp], target, N ); @@ -4125,20 +3714,12 @@ static void fec_ecu_dft_fx( tmp = Exp16Array( *Nfft, Tfr16 ); *exp = add( tmp, add( 2, norm_s( *Nfft ) ) ); move16(); -#ifdef FIX_ISSUE_1237 { -#ifdef FIX_ISSUE_1237_KEEP_EVS_BE Word16 loctmp = *exp; move16(); loctmp = s_min( 15, loctmp ); Copy_Scale_sig_16_32_DEPREC( Tfr16, Tfr32, *Nfft, loctmp ); /*Qin+exp; */ /*Even with limiting loctmp, if Copy_Scale_sig_16_32_no_sat() is used, can lead to 1 difference */ -#else - Copy_Scale_sig_16_32_no_sat( Tfr16, Tfr32, *Nfft, *exp ); /*Qin+exp; */ -#endif } -#else - Copy_Scale_sig_16_32_DEPREC( Tfr16, Tfr32, *Nfft, *exp ); /*Qin+exp; */ -#endif DoRTFTn_fx( Tfr32, Tfi32, *Nfft ); N_LP = shr( *Nfft, 1 ); @@ -4480,7 +4061,6 @@ static void ivas_fec_noise_filling_fx( const Word16 *p_mdct_ola; Word16 alignment_point; - // PMTE() L20 = extract_h( L_mult( 1639, L ) ); /*L/20 */ IF( element_mode == EVS_MONO ) { @@ -4593,13 +4173,13 @@ static void ivas_fec_noise_filling_fx( pt6 = &p_mdct_ola[0]; FOR( k = 0; k < tmp_fx; k++ ) { - L_tmp = L_mult( *sinq_tab, *sinq_tab ); /*Q30 */ + L_tmp = L_mult( *sinq_tab, *sinq_tab ); /*Q31 */ sinq_tab++; - q2 = round_fx( L_sub( 2147483647, L_tmp ) ); /*Q15 */ - q1 = round_fx( L_tmp ); /*Q15 */ - L_tmp = L_mult( ( *pt1 ), q1 ); /*Qsynth+16 */ - L_tmp = L_add( L_tmp, L_shr( Mpy_32_16_1( L_deposit_h( *pt6++ ), q2 ), Q_old_out ) ); /*Qsynth+16 */ - ( *pt1++ ) = round_fx( L_tmp ); /*Qsynth */ + q2 = round_fx( L_sub( 2147483647, L_tmp ) ); /*Q15 */ + q1 = round_fx( L_tmp ); /*Q15 */ + L_tmp = L_mult( ( *pt1 ), q1 ); /*Qsynth+16 */ + L_tmp = L_add_sat( L_tmp, L_shr_sat( Mpy_32_16_1( L_deposit_h( *pt6++ ), q2 ), Q_old_out ) ); /*Qsynth+16 */ + ( *pt1++ ) = round_fx_sat( L_tmp ); /*Qsynth */ move16(); } @@ -4616,11 +4196,6 @@ static void fec_noise_filling_fx( const Word16 N, const Word16 HqVoicing, Word16 *gapsynth_fx /*Qsynth */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const int16_t element_mode, /* i : IVAS element mode */ - const float *old_out -#endif ) { @@ -4635,22 +4210,6 @@ static void fec_noise_filling_fx( Word32 L_tmp; const Word16 *sinq_tab; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - - const float *p_mdct_ola; - int16_t alignment_point; - PMTE() - if ( element_mode == EVS_MONO ) - { - alignment_point = 2 * L - 3 * L / 20; - } - else - { - alignment_point = 2 * L; - } - mvr2r( prevsynth + alignment_point - N, noisevect, N ); -#endif - IF( EQ_16( L, L_FRAME32k ) ) { sinq_tab = sinq_32k; @@ -4721,18 +4280,6 @@ static void fec_noise_filling_fx( tmp_fx = div_s( 1, Rnd_N_noise ); /*Q15 */ tmp_fx = round_fx_sat( L_shl_sat( L_mult( tmp_fx, 25736 ), 2 ) ); /*Q15 */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - if ( element_mode == EVS_MONO ) - { - kk = 7 * L / 20; - p_mdct_ola = prevsynth + 37 * L / 20; - } - else - { - kk = NS2SA( L * FRAMES_PER_SEC, N_ZERO_MDCT_NS ); - p_mdct_ola = old_out + kk; - } -#endif sinq_fx( shr( tmp_fx, 1 ), shr( tmp_fx, 2 ), Rnd_N_noise, SS_fx ); @@ -4840,11 +4387,6 @@ static void fec_alg_fx( const Word16 decimatefactor, const Word16 HqVoicing, Word16 *gapsynth /*Qin */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 element_mode, /* i : IVAS element mode */ - const Word16 *old_out -#endif ) { Word16 Nfft; @@ -4856,21 +4398,11 @@ static void fec_alg_fx( Word16 exp; Word16 n, Q; - fec_ecu_dft_fx( prevsynth_LP, N, Tfr, Tfi, &sum_Tf_abs, Tf_abs, &Nfft, &exp -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - element_mode -#endif - ); + fec_ecu_dft_fx( prevsynth_LP, N, Tfr, Tfi, &sum_Tf_abs, Tf_abs, &Nfft, &exp ); sinusoidal_synthesis_fx( Tfr, Tfi, Tf_abs, N, output_frame, decimatefactor, Nfft, sum_Tf_abs, synthesis, HqVoicing, exp ); - fec_noise_filling_fx( prevsynth, synthesis, ni_seed_forfec, output_frame, i_mult2( N, decimatefactor ), HqVoicing, gapsynth -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - element_mode, old_out -#endif - ); + fec_noise_filling_fx( prevsynth, synthesis, ni_seed_forfec, output_frame, i_mult2( N, decimatefactor ), HqVoicing, gapsynth ); n = R1_48 - R2_48; move16(); @@ -4975,23 +4507,23 @@ static void ivas_hq_phase_ecu_fx( { test(); test(); - // PMT("verify condition compared to float") if ( !( prev_bfi != 0 && *last_fec != 0 && element_mode == EVS_MONO ) ) { - *time_offs = 0; + *time_offs = 0; /* IVAS reset of offset time counter, timeoffset variable later also used to calculate burst length */ move16(); } offset = add( sub( sub( shl( output_frame, 1 ), lprot ), *time_offs ), ph_ecu_lookahead ); + trans_ana_fx( prevsynth + offset, mag_chg, &ph_dith, mag_chg_1st, output_frame, *time_offs, env_stab, - *last_fec, alpha, beta, beta_mute, Xavg ); + *last_fec, element_mode, alpha, beta, beta_mute, Xavg ); ivas_spec_ana_fx( prevsynth + offset, plocs, plocsi, num_p, X_sav, output_frame, bwidth_fx, Q_spec, element_mode, &noise_fac, pcorr ); test(); IF( prev_bfi != 0 && *last_fec != 0 ) { - *time_offs = add( *time_offs, output_frame ); + *time_offs = add_sat( *time_offs, output_frame ); /* when saturation is reached, this keeps the long term muting on */ move16(); } } @@ -5000,8 +4532,9 @@ static void ivas_hq_phase_ecu_fx( *time_offs = add_sat( *time_offs, output_frame ); move16(); offset = sub( shl( output_frame, 1 ), lprot ); + trans_ana_fx( prevsynth + offset, mag_chg, &ph_dith, mag_chg_1st, output_frame, *time_offs, env_stab, - 0, alpha, beta, beta_mute, Xavg ); + 0, element_mode, alpha, beta, beta_mute, Xavg ); } Copy( X_sav, X, lprot ); @@ -5046,11 +4579,6 @@ static void hq_phase_ecu_fx( Word16 *beta_mute, /* o : Factor for long-term mute Q15 */ const Word16 bwidth_fx, /* i : Encoded bandwidth */ const Word16 output_frame /* i : frame length */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 pcorr, - const Word16 element_mode /* i : IVAS element mode */ -#endif ) { Word16 lprot, offset; @@ -5058,22 +4586,6 @@ static void hq_phase_ecu_fx( Word16 seed; Word16 alpha[LGW_MAX], beta[LGW_MAX]; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - const float *old_dec; - float noise_fac; - int16_t ph_ecu_lookahead; - - noise_fac = 1.0f; - - if ( element_mode == EVS_MONO ) - { - ph_ecu_lookahead = NS2SA( output_frame * FRAMES_PER_SEC, PH_ECU_LOOKAHEAD_NS ); - } - else - { - ph_ecu_lookahead = 0; - } -#endif IF( EQ_16( output_frame, L_FRAME48k ) ) { lprot = L_PROT48k; /* 1536 = (2*output_frame)*1024/1280 */ @@ -5101,47 +4613,35 @@ static void hq_phase_ecu_fx( IF( prev_bfi == 0 || ( prev_bfi != 0 && *last_fec != 0 && ( EQ_16( *time_offs, output_frame ) ) ) ) { test(); - // PMT("verify condition compared to float") -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( !( prev_bfi != 0 && *last_fec != 0 ) && EQ_16( element_mode == EVS_MONO ) ) -#else if ( !( prev_bfi != 0 && *last_fec != 0 ) ) -#endif { *time_offs = 0; move16(); } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - offset = add( sub( sub( shl( output_frame, 1 ), lprot ), *time_offs ), ph_ecu_lookahead ); -#else offset = sub( sub( shl( output_frame, 1 ), lprot ), *time_offs ); -#endif + trans_ana_fx( prevsynth + offset, mag_chg, &ph_dith, mag_chg_1st, output_frame, *time_offs, env_stab, - *last_fec, alpha, beta, beta_mute, Xavg ); + *last_fec, EVS_MONO, alpha, beta, beta_mute, Xavg ); - spec_ana_fx( prevsynth + offset, plocs, plocsi, num_p, X_sav, output_frame, bwidth_fx, Q_spec -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - element_mode, noise_fac, pcorr -#endif - ); + spec_ana_fx( prevsynth + offset, plocs, plocsi, num_p, X_sav, output_frame, bwidth_fx, Q_spec ); test(); IF( prev_bfi != 0 && *last_fec != 0 ) { - *time_offs = add( *time_offs, output_frame ); + *time_offs = add_sat( *time_offs, output_frame ); move16(); } } ELSE { - *time_offs = add( *time_offs, output_frame ); + *time_offs = add_sat( *time_offs, output_frame ); move16(); offset = sub( shl( output_frame, 1 ), lprot ); + trans_ana_fx( prevsynth + offset, mag_chg, &ph_dith, mag_chg_1st, output_frame, *time_offs, env_stab, - 0, alpha, beta, beta_mute, Xavg ); + 0, EVS_MONO, alpha, beta, beta_mute, Xavg ); } Copy( X_sav, X, lprot ); @@ -5151,27 +4651,14 @@ static void hq_phase_ecu_fx( move16(); IF( *num_p > 0 ) { - seed = add( seed, plocs[*num_p - 1] ); + seed = add_sat( seed, plocs[*num_p - 1] ); } subst_spec_fx( plocs, plocsi, num_p, *time_offs, X, mag_chg, ph_dith, old_is_transient, output_frame, &seed, - alpha, beta, *beta_mute, Xavg -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - element_mode, ph_ecu_lookahead, noise_fac -#endif - ); + alpha, beta, *beta_mute, Xavg ); /* reconstructed frame in tda domain */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - old_dec = prevsynth + 2 * output_frame - NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ); -#endif - rec_frame_fx( X, ecu_rec, output_frame, *Q_spec -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - old_dec, element_mode, num_p, plocs -#endif - ); + rec_frame_fx( X, ecu_rec, output_frame, *Q_spec ); *last_fec = 0; move16(); @@ -5325,22 +4812,6 @@ void hq_ecu_fx( Word16 decimatefactor; Word16 corr; /*Q15 */ Word16 prevsynth_LP[2 * L_FRAME8k]; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - HQ_DEC_HANDLE hHQ_core; - const float *fec_alg_input; - int16_t evs_mode_selection; - int16_t ivas_mode_selection; - - hHQ_core = st->hHQ_core; - if ( st->element_mode == EVS_MONO ) - { - fec_alg_input = prevsynth + NS2SA( output_frame * FRAMES_PER_SEC, ACELP_LOOK_NS / 2 - PH_ECU_LOOKAHEAD_NS ); - } - else - { - fec_alg_input = prevsynth - NS2SA( output_frame * FRAMES_PER_SEC, PH_ECU_LOOKAHEAD_NS ); - } -#endif /* init (values ar changed after) */ decimatefactor = 4; move16(); @@ -5351,11 +4822,7 @@ void hq_ecu_fx( IF( !( LT_16( output_frame, L_FRAME16k ) ) ) { -#ifdef IVAS_FEC_ECU_TO_COMPLETE - fec_ecu_pitch_fx( fec_alg_input, prevsynth_LP, output_frame, &N, &corr, &decimatefactor, ph_ecu_HqVoicing ); -#else fec_ecu_pitch_fx( prevsynth + NS2SA_FX2( L_mult0( output_frame, 50 ), ACELP_LOOK_NS / 2 - PH_ECU_LOOKAHEAD_NS ), prevsynth_LP, output_frame, &N, &corr, &decimatefactor, ph_ecu_HqVoicing ); -#endif } ELSE { @@ -5378,32 +4845,6 @@ void hq_ecu_fx( test(); test(); test(); -#if defined IVAS_FEC_ECU_TO_COMPLETE - evs_mode_selection = ( st->total_brate >= 48000 && ( output_frame >= L_FRAME16k && !prev_bfi && ( !old_is_transient[0] || old_is_transient[1] ) && - ( ph_ecu_HqVoicing || ( ( ( hHQ_core->env_stab_plc > 0.5 ) && ( corr < 0.6 ) ) || ( hHQ_core->env_stab_plc < 0.5 && ( corr > 0.85 ) ) ) ) ) ) || - ( st->total_brate < 48000 && ( ( ph_ecu_HqVoicing || corr > 0.85 ) && !prev_bfi && ( !old_is_transient[0] || old_is_transient[1] ) ) ); - - ivas_mode_selection = ( N < PH_ECU_N_LIMIT ) || ( corr < PH_ECU_CORR_LIMIT ); - if ( ( ( st->element_mode == EVS_MONO ) && evs_mode_selection ) || - ( ( st->element_mode != EVS_MONO ) && evs_mode_selection && ivas_mode_selection ) ) - - { - fec_alg_fx( fec_alg_input, prevsynth_LP, ecu_rec, output_frame, N, decimatefactor, ph_ecu_HqVoicing, gapsynth, &hHQ_core->ni_seed_forfec, st->element_mode, st->hHQ_core->old_out ); - *last_fec = 1; - *ph_ecu_active = 0; - move16(); - *time_offs = output_frame; - move16(); - ; - } - else - { - hq_phase_ecu( prevsynth - NS2SA( output_frame * FRAMES_PER_SEC, PH_ECU_LOOKAHEAD_NS ), ecu_rec, time_offs, X_sav, num_p, plocs, plocsi, env_stab, last_fec, prev_bfi, old_is_transient, mag_chg_1st, Xavg, beta_mute, st->bwidth, output_frame, corr, st->element_mode ); - - *last_fec = 0; - *ph_ecu_active = 1; - } -#else IF( ( GE_32( st_fx->total_brate, 48000 ) && ( GE_16( output_frame, L_FRAME16k ) && !prev_bfi && ( !old_is_transient[0] || old_is_transient[1] ) && ( NE_16( ph_ecu_HqVoicing, 0 ) || ( ( ( NE_16( st_fx->hHQ_core->env_stab_plc_fx, 0 ) ) && ( LT_16( corr, 19661 ) ) ) || ( !( NE_16( st_fx->hHQ_core->env_stab_plc_fx, 0 ) ) && ( GT_16( corr, 27853 ) ) ) ) ) ) ) || ( LT_32( st_fx->total_brate, 48000 ) && ( ( ph_ecu_HqVoicing || GT_16( corr, 27853 ) ) && !prev_bfi && ( !old_is_transient[0] || old_is_transient[1] ) ) ) ) @@ -5423,7 +4864,6 @@ void hq_ecu_fx( env_stab, last_fec, ph_ecu_active, prev_bfi, old_is_transient, mag_chg_1st, Xavg, beta_mute, st_fx->bwidth, output_frame ); } -#endif return; } diff --git a/lib_dec/FEC_adapt_codebook_fx.c b/lib_dec/FEC_adapt_codebook_fx.c index fae55ab5b0aff3d63693e2829d9556c779d66b54..5428d057beff1ae7925cc2b19b65b12d76be8500 100644 --- a/lib_dec/FEC_adapt_codebook_fx.c +++ b/lib_dec/FEC_adapt_codebook_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include @@ -15,14 +15,12 @@ * Create an artificial onset when it is lost *---------------------------------------------------------------------*/ Word16 FEC_SinOnset_fx( - Word16 *exc, - /* i/o : exc vector to modify */ // Qin = Qold, Qout = Q_exc - Word16 puls_pos, /* i : last pulse position desired */ - const Word16 T0, /* i : Pitch information of the 1 subfr */ - Word32 enr_q, /* i : energy provide by the encoder */ - Word16 *Aq, /* i : A(z) filter Q12 */ - const Word16 L_frame /* i : frame length */ - , + Word16 *exc, /* i/o : exc vector to modify Qin = Qold, Qout = Q_exc */ + Word16 puls_pos, /* i : last pulse position desired */ + const Word16 T0, /* i : Pitch information of the 1 subfr */ + Word32 enr_q, /* i : energy provide by the encoder */ + Word16 *Aq, /* i : A(z) filter Q12 */ + const Word16 L_frame, /* i : frame length */ const Word16 Qold ) { Word16 P0, onset_len, sign, i, len, L_subfr, L_subfr2; diff --git a/lib_dec/FEC_clas_estim_fx.c b/lib_dec/FEC_clas_estim_fx.c index e56a77be12f49bf6522a1b129d91eaa0edbe4bb9..f968ccb9039e0b0e48468fdfa4c71cac64f846fa 100644 --- a/lib_dec/FEC_clas_estim_fx.c +++ b/lib_dec/FEC_clas_estim_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -285,7 +285,17 @@ void FEC_clas_estim_fx( Corre( &pt1[pos], &pt1[pos - T0], T0, &cor_max[0] ); - T0 = mult_r_sat( add_sat( pitch[2], pitch[3] ), 256 ); + IF( NE_16( st_fx->element_mode, EVS_MONO ) ) + { + IF( LT_16( sub( pos, T0 ), sub( L_frame, L_SUBFR ) ) ) + { + T0 = mult_r_sat( add_sat( pitch[2], pitch[3] ), 256 ); + } + } + ELSE + { + T0 = mult_r_sat( add_sat( pitch[2], pitch[3] ), 256 ); + } pos_limit = sub( L_frame, L_SUBFR ); j = s_min( 1, s_max( 0, sub( pos, pos_limit ) ) ); Ltmp = L_deposit_l( cor_max[0] ); @@ -725,8 +735,8 @@ void FEC_clas_estim_fx( } /* Do the classification only - - MODE1: when the class is not transmitted in the bitstream - - MODE2: on good frames (classifier is also called for bfi=1) */ + - MODE1: when the class is not transmitted in the bitstream + - MODE2: on good frames (classifier is also called for bfi=1) */ /* update the memory of synthesis for frame class estimation */ @@ -854,7 +864,7 @@ Word16 FEC_pos_dec_fx( bit_pos_pitch_index = add( bit_pos_pitch_index, 1 ); } /* retrieve the pitch index */ - pitch_index = (Word16) get_indice( st_fx, bit_pos_pitch_index, nBits ); + pitch_index = (Word16) get_indice_fx( st_fx, bit_pos_pitch_index, nBits ); /* decode pitch period */ T0_min = PIT_MIN; diff --git a/lib_dec/FEC_fx.c b/lib_dec/FEC_fx.c index 35bb254af835011d3ec461752e47c43ee3c7b2f3..fe2780a8600c7dc9457102ef016ee65929d384a1 100644 --- a/lib_dec/FEC_fx.c +++ b/lib_dec/FEC_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -95,10 +95,6 @@ void FEC_exc_estim_fx( Word32 cond3; Word32 predPitchLag; GSC_DEC_HANDLE hGSCDec; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif hGSCDec = st_fx->hGSCDec; AMRWB_IO_DEC_HANDLE hAmrwb_IO; @@ -126,7 +122,7 @@ void FEC_exc_estim_fx( gainCNG = round_fx( L_shl( L_tmp, sub( exp, 12 ) ) ); /* In Q3 */ } - tmp1 = shl_o( st_fx->lp_gainc_fx, 1, &Overflow ); + tmp1 = shl_sat( st_fx->lp_gainc_fx, 1 ); gainCNG = s_min( gainCNG, tmp1 ); set16_fx( exc_dct_in, 0, L_FRAME16k ); @@ -187,7 +183,7 @@ void FEC_exc_estim_fx( { test(); test(); - IF( ( LT_16( round_fx( L_shl( st_fx->old_pitch_buf_fx[2 * NB_SUBFR - 1], 6 ) ), shl_o( mult( 29491, st_fx->bfi_pitch_fx ), 1, &Overflow ) ) && + IF( ( LT_16( round_fx( L_shl( st_fx->old_pitch_buf_fx[2 * NB_SUBFR - 1], 6 ) ), shl_sat( mult( 29491, st_fx->bfi_pitch_fx ), 1 ) ) && GT_16( round_fx( L_shl( st_fx->old_pitch_buf_fx[2 * NB_SUBFR - 1], 6 ) ), mult( 19661, st_fx->bfi_pitch_fx ) ) ) || /* last pitch coherent with the past */ GE_16( st_fx->upd_cnt, MAX_UPD_CNT ) ) /* or last update too far in the past */ { @@ -200,9 +196,10 @@ void FEC_exc_estim_fx( { test(); test(); - IF( ( LT_16( round_fx( L_shl( st_fx->old_pitch_buf_fx[2 * NB_SUBFR16k - 1], 6 ) ), shl_o( mult( 29491, st_fx->bfi_pitch_fx ), 1, &Overflow ) ) && + IF( ( LT_16( round_fx( L_shl( st_fx->old_pitch_buf_fx[2 * NB_SUBFR16k - 1], 6 ) ), shl_sat( mult( 29491, st_fx->bfi_pitch_fx ), 1 ) ) && GT_16( round_fx( L_shl( st_fx->old_pitch_buf_fx[2 * NB_SUBFR16k - 1], 6 ) ), mult( 19661, st_fx->bfi_pitch_fx ) ) ) || /* last pitch coherent with the past */ GE_16( st_fx->upd_cnt, MAX_UPD_CNT ) ) /* or last update too far in the past */ + { /* take the pitch value of last subframe of the previous frame */ *tmp_tc = round_fx( L_shl( st_fx->old_pitch_buf_fx[2 * NB_SUBFR16k - 1], 6 ) ); @@ -296,7 +293,7 @@ void FEC_exc_estim_fx( IF( LE_16( st_fx->nbLostCmpt, 1 ) ) { /* if stable, do not decrease the energy, pitch_gain = 0 */ - alpha = mac_ro( ( 1L << 16 ) * 2 * _ALPHA_U_FX, st_fx->stab_fac_fx, 32768 - 2 * _ALPHA_U_FX, &Overflow ); /*st_fx->stab_fac_fx in Q15*/ + alpha = mac_r_sat( ( 1L << 16 ) * 2 * _ALPHA_U_FX, st_fx->stab_fac_fx, 32768 - 2 * _ALPHA_U_FX ); /*st_fx->stab_fac_fx in Q15*/ } ELSE IF( EQ_16( st_fx->nbLostCmpt, 2 ) ) { @@ -345,7 +342,7 @@ void FEC_exc_estim_fx( L_tmp = L_deposit_h( tmp ); L_tmp = Isqrt_lc( L_tmp, &exp ); - gain = extract_h( L_shl_o( L_tmp, exp, &Overflow ) ); + gain = extract_h( L_shl_sat( L_tmp, exp ) ); gain = s_min( gain, 32113 ); /*0.98 */ gain = s_max( gain, 27853 ); /*0.85 */ @@ -504,25 +501,16 @@ void FEC_exc_estim_fx( test(); test(); test(); -#ifdef NONBE_FIX_GSC_BSTR IF( EQ_16( st_fx->last_coder_type, AUDIO ) || ( EQ_16( st_fx->last_good, INACTIVE_CLAS ) && st_fx->inactive_coder_type_flag && !st_fx->Opt_AMR_WB ) ) -#else - IF( EQ_16( st_fx->last_coder_type, AUDIO ) || ( EQ_16( st_fx->last_good, INACTIVE_CLAS ) && LE_32( st_fx->total_brate, MAX_GSC_INACTIVE_BRATE ) && !st_fx->Opt_AMR_WB ) ) -#endif { st_fx->GSC_noisy_speech = st_fx->Last_GSC_noisy_speech_flag; move16(); /* st_fx->L_frame / L_SUBFR */ tmp = shr( st_fx->L_frame, 6 ); + /* Replication of the last spectrum, with a slight downscaling of its dynamic */ - IF( st_fx->element_mode == EVS_MONO ) - { - gsc_dec_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, st_fx->Q_exc ); - } - ELSE - { - gsc_dec_ivas_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, &st_fx->Q_exc ); - } + gsc_dec_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, &st_fx->Q_exc ); + *tmp_noise = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ move16(); /* Transform back to time domain */ @@ -670,11 +658,7 @@ void FEC_exc_estim_fx( test(); test(); test(); -#ifdef NONBE_FIX_GSC_BSTR IF( EQ_16( st_fx->last_coder_type, AUDIO ) || ( EQ_16( st_fx->last_good, INACTIVE_CLAS ) && st_fx->inactive_coder_type_flag && !st_fx->Opt_AMR_WB ) ) -#else - IF( ( EQ_16( st_fx->last_coder_type, AUDIO ) || EQ_16( st_fx->last_good, INACTIVE_CLAS ) ) && LE_32( st_fx->total_brate, MAX_GSC_INACTIVE_BRATE ) && !st_fx->Opt_AMR_WB ) -#endif { /* For GSC - the excitation is already computed */ Copy( exc, exc2, st_fx->L_frame ); @@ -764,10 +748,6 @@ static void pulseRes_preCalc( Word16 *cond1, Word16 *cond2, Word32 *cond3, Word1 { Word16 tmp_pit, tmp_pit_e, tmp_frame, tmp_frame_e; Word32 tmp_pit2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif tmp_pit = BASOP_Util_Divide1616_Scale( new_pit /*Q0*/, Tc /*Q0*/, &tmp_pit_e ) /*Q15*/; tmp_frame = add( extract_l( L_mult0( L_frame, 64 /*1.f/L_SUBFR Q12*/ ) /*Q12*/ ), 4096 /*1.f Q12*/ ); /*Q12*/ @@ -776,7 +756,7 @@ static void pulseRes_preCalc( Word16 *cond1, Word16 *cond2, Word32 *cond3, Word1 tmp_frame = sub( 32767 /*1.f Q15*/, tmp_frame ); /*Q15*/ BASOP_SATURATE_WARNING_OFF_EVS /*To calc Q15 threshold, overflow may happen - do negation and compare with negated value to check also highest possible value*/ - tmp_pit = shl_o( negate( tmp_pit ), tmp_pit_e, &Overflow ); + tmp_pit = shl_sat( negate( tmp_pit ), tmp_pit_e ); BASOP_SATURATE_WARNING_ON_EVS *cond1 = sub( tmp_pit, negate( tmp_frame ) ); move16(); diff --git a/lib_dec/FEC_lsf_estim_fx.c b/lib_dec/FEC_lsf_estim_fx.c index ba248598c260a255f0b466f861cd2d4538b58d58..ddf1f7df6fcde1af14d40dcb7448aba17bab9272 100644 --- a/lib_dec/FEC_lsf_estim_fx.c +++ b/lib_dec/FEC_lsf_estim_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -16,11 +16,11 @@ *-------------------------------------------------------------------*/ void FEC_lsf2lsp_interp( - Decoder_State *st, /* i/o: Decoder static memory */ - const Word16 L_frame, /* i : length of the frame */ - Word16 *Aq, /* o : calculated A(z) for 4 subframes Q12 */ + Decoder_State *st, /* i/o: Decoder static memory */ + const Word16 L_frame, /* i : length of the frame */ + Word16 *Aq, /* o : calculated A(z) for 4 subframes Q12 */ Word16 *lsf, /* o : estimated LSF vector Qlog2(2.56)*/ - Word16 *lsp /* o : estimated LSP vector Q15* */ + Word16 *lsp /* o : estimated LSP vector Q15* */ ) { diff --git a/lib_dec/FEC_pitch_estim_fx.c b/lib_dec/FEC_pitch_estim_fx.c index b7ad94f8931293ef25288170d9be242c4e0fabc8..066afccf9d46d7c2f8cd86f0febf8bd626e80c58 100644 --- a/lib_dec/FEC_pitch_estim_fx.c +++ b/lib_dec/FEC_pitch_estim_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -9,30 +9,30 @@ /*========================================================================*/ -/* FUNCTION : FEC_pitch_estim_fx() */ +/* FUNCTION : FEC_pitch_estim_fx() */ /*------------------------------------------------------------------------*/ -/* PURPOSE : Estimation of pitch for FEC */ -/* */ +/* PURPOSE : Estimation of pitch for FEC */ +/* */ /*------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) st_fx->Opt_AMR_WB: flag indicating AMR-WB IO mode */ -/* _ (Word16) st_fx->L_frame_fx: length of the frame */ -/* _ (Word16) st_fx->clas_dec: frame classification */ -/* _ (Word16) st_fx->last_good: last good clas information */ -/* _ (Word16[]) pitch : pitch values for each subframe Q6 */ -/* _ (Word16[]) old_pitch_buf:pitch values for each subframe Q6 */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) st_fx->Opt_AMR_WB: flag indicating AMR-WB IO mode */ +/* _ (Word16) st_fx->L_frame_fx: length of the frame */ +/* _ (Word16) st_fx->clas_dec: frame classification */ +/* _ (Word16) st_fx->last_good: last good clas information */ +/* _ (Word16[]) pitch : pitch values for each subframe Q6 */ +/* _ (Word16[]) old_pitch_buf:pitch values for each subframe Q6 */ /*------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /*------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /*------------------------------------------------------------------------*/ -/* _ (Word16[]) st_fx->bfi_pitch : initial synthesis filter states */ +/* _ (Word16[]) st_fx->bfi_pitch : initial synthesis filter states */ /* _ (Word16) st_fx->bfi_pitch_frame: LP filter E of last */ /* _ (Word16) st_fx->upd_cnt_fx: update counter */ /*------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*========================================================================*/ void FEC_pitch_estim_fx( const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ @@ -44,10 +44,9 @@ void FEC_pitch_estim_fx( const Word32 old_pitch_buf[], /* i : buffer of old subframe pitch values 15Q16 */ Word16 *bfi_pitch, /* i/o: update of the estimated pitch for FEC Q6*/ Word16 *bfi_pitch_frame, /* o : frame length when pitch was updated */ - Word16 *upd_cnt /* i/o: update counter */ - , - const Word16 coder_type, /* i : coder_type */ - Word16 element_mode /* i : element mode */ + Word16 *upd_cnt, /* i/o: update counter */ + const Word16 coder_type, /* i : coder_type */ + Word16 element_mode /* i : element mode */ ) { Word16 tmp, tmp1, tmp2, tmp3; diff --git a/lib_dec/FEC_scale_syn_fx.c b/lib_dec/FEC_scale_syn_fx.c index d664aa9fbb2ea39a35ea23477c0ec2e3517e40c9..a0e0b3981f01b78f7c96a4c19ca2867a4fe8242d 100644 --- a/lib_dec/FEC_scale_syn_fx.c +++ b/lib_dec/FEC_scale_syn_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -13,41 +13,41 @@ #define SCLSYN_LAMBDA ( 9830 /*0.3f Q15*/ ) /*========================================================================*/ -/* FUNCTION : FEC_scale_syn_fx() */ +/* FUNCTION : FEC_scale_syn_fx() */ /*------------------------------------------------------------------------*/ -/* PURPOSE : Smooth the speech energy evolution when */ -/* recovering after a BAD frame */ +/* PURPOSE : Smooth the speech energy evolution when */ +/* recovering after a BAD frame */ /*------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) L_frame : length of the frame */ -/* _ (Word16) *update_flg : indication about resynthesis */ -/* _ (Word16) st_fx->clas_dec: frame classification */ -/* _ (Word16) last_good : last good frame classification */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) L_frame : length of the frame */ +/* _ (Word16) *update_flg : indication about resynthesis */ +/* _ (Word16) st_fx->clas_dec: frame classification */ +/* _ (Word16) last_good : last good frame classification */ /* _ (Word16[]) synth : synthesized speech at Fs = 12k8 Hz Q_syn */ -/* _ (Word16[]) pitch : pitch values for each subframe Q0 */ -/* _ (Word32) L_enr_old :energy at the end of previous frame Q0 */ -/* _ (Word16) L_enr_q : transmitted energy for current frame Q0 */ -/* _ (Word16) coder_type : coder type */ +/* _ (Word16[]) pitch : pitch values for each subframe Q0 */ +/* _ (Word32) L_enr_old :energy at the end of previous frame Q0 */ +/* _ (Word16) L_enr_q : transmitted energy for current frame Q0 */ +/* _ (Word16) coder_type : coder type */ /* _ (Word16) st_fx->prev_bfi_fx: previous frame BFI */ /* _ (Word16) st_fx->last_core_brate_fx: previous frame core bitrate */ -/* _ (Word16[]) mem_tmp : temp. initial synthesis filter states Q_syn */ -/* _ (Word16) Q_exc : quantized LSPs from frame end */ -/* _ (Word16) Q_syn : quantized LSPs from frame end */ +/* _ (Word16[]) mem_tmp : temp. initial synthesis filter states Q_syn */ +/* _ (Word16) Q_exc : quantized LSPs from frame end */ +/* _ (Word16) Q_syn : quantized LSPs from frame end */ /*------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16[]) exc : excitation signal without enhancement Q_exc */ -/* _ (Word16[]) exc2 : excitation signal with enhancement Q_exc */ -/* _ (Word16[]) Aq : LP filter coefs (can be modified if BR) Q12 */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word16[]) exc : excitation signal without enhancement Q_exc */ +/* _ (Word16[]) exc2 : excitation signal with enhancement Q_exc */ +/* _ (Word16[]) Aq : LP filter coefs (can be modified if BR) Q12 */ /*------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /*------------------------------------------------------------------------*/ -/* _ (Word16[]) st_fx->mem_syn2 : initial synthesis filter states Q_syn */ +/* _ (Word16[]) st_fx->mem_syn2 : initial synthesis filter states Q_syn */ /* _ (Word16) st_fx->old_enr_LP : LP filter E of last Q5 */ -/* good voiced frame */ +/* good voiced frame */ /*------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*========================================================================*/ void FEC_scale_syn_fx( @@ -76,6 +76,7 @@ void FEC_scale_syn_fx( Word16 *mem_syn, /* o: initial synthesis filter states Q_syn*/ Word16 Q_exc, Word16 Q_syn, + const Word16 element_mode, /* i : element mode */ const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ const Word16 force_scaling /* i: force scaling */ ) @@ -171,572 +172,10 @@ void FEC_scale_syn_fx( * Find the energy/gain at the end of the frame *-----------------------------------------------------------------*/ - frame_ener_fx( L_frame, clas, synth, pitch[( L_frame >> 6 ) - 1], &L_enr2 /*Q0*/, 1, Q_syn, 3, 0 ); - - - test(); - test(); - IF( bfi || ( EQ_32( total_brate, ACELP_7k20 ) ) || ( EQ_32( total_brate, ACELP_8k00 ) ) ) - { - /* previous frame erased and no TC frame */ - IF( *scaling_flag > 0 ) - { - /*enr2 += 0.01f;*/ - L_enr2 = L_max( L_enr2, 1 ); /* L_enr2 is in Q0 */ - - IF( bfi ) /* In all bad frames, limit the gain to 1 */ - { - /* gain2 = (float)sqrt( enr_old / enr2 );*/ - L_tmp = Sqrt_Ratio32( L_enr_old, 0, L_enr2, 0, &exp2 ); - gain2 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - - /*if( gain2 > 1.0f )gain2 = 1.0f;*/ - gain2 = s_min( gain2, 16384 ); - - /* find the energy/gain at the beginning of the frame */ - frame_ener_fx( L_frame, clas, synth, pitch[0], &L_enr1 /*Q0*/, 1, Q_syn, 3, 0 ); - - /*enr1 += 0.1f;*/ - L_enr1 = L_max( L_enr1, 1 ); /* L_enr2 is in Q0 */ - - /*gain1 = (float)sqrt( enr_old / enr1 );*/ - L_tmp = Sqrt_Ratio32( L_enr_old, 0, L_enr1, 0, &exp2 ); - gain1 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - - /*if( gain1 > 1.0f )gain1 = 1.0f;*/ - gain1 = s_min( gain1, 16384 ); /*Q14*/ - } - ELSE /* good frame */ - { - IF( L_enr_q == 0 ) /* If E info (FEC protection bits) is not available in the bitstream */ - { - L_enr_q = L_enr2; /*Q0*/ - set16_fx( h1, 0, L_FRAME / 2 ); - h1[0] = 1024; /*1.0f in Q10*/ - move16(); - /*syn_filt( Aq+(3*(M+1)), M, h1, h1, L_FRAME/2, h1+(M+1), 0 );*/ - E_UTIL_synthesis( 1, Aq + ( 3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); - - /*Compute tilt */ - /*rr0 = dotp( h1, h1, L_FRAME/2-1 ) + 0.1f;*/ - /*rr1 = dotp( h1, h1+1, L_FRAME/2-1 );*/ - /*tilt = rr1 / rr0;*/ - tilt = extract_h( L_shl_sat( get_gain( h1 + 1, h1, L_FRAME / 2 - 1 ), 15 ) ); /*Q15*/ - pitch_dist = 0; - move16(); - L_mean_pitch = L_mult( pitch[0], 8192 /*1.0f in Q13*/ ); /*Q14*/ - FOR( k = 0; k < ( NB_SUBFR - 1 ); k++ ) - { - pitch_dist = add( pitch_dist, abs_s( sub( pitch[k + 1], pitch[k] ) ) ); /*Q0*/ - L_mean_pitch = L_mac( L_mean_pitch, pitch[k + 1], 8192 ); /*Q14*/ - } - /*pitch_dist /= (float)(NB_SUBFR-1); */ - pitch_dist = mult_r( shl( pitch_dist, 4 ), 10923 /*1/(float)(NB_SUBFR-1) in Q15*/ ); /*Q4*/ - /*mean_pitch /= (float)(NB_SUBFR);*/ - mean_pitch = extract_h( L_shl( L_mean_pitch, 4 ) ); /*Q4*/ - - - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( GT_16( tilt, 22938 ) ) && /* HF resonnant filter */ - ( ( GT_16( pitch_dist, 8 << 4 ) ) || ( LT_16( mean_pitch, PIT_MIN << 4 ) ) ) && /* pitch unstable or very short */ - ( ( prev_bfi ) || ( ( EQ_16( coder_type, GENERIC ) ) && ( EQ_16( LSF_Q_prediction, AUTO_REGRESSIVE ) ) ) ) ) - { - /*if( enr_q > scaling * enr_old ){enr_q = scaling * enr_old;}*/ - L_enr_q = L_min( L_enr_q, L_shl_sat( Mult_32_16( L_enr_old, scaling ), 1 ) ); /* scaling in Q14*/ - } - ELSE - { - ener_max = *lp_ener_FEC_max; /*Q0*/ - move32(); - test(); - if ( EQ_16( clas, VOICED_TRANSITION ) || ( GE_16( clas, INACTIVE_CLAS ) ) ) - { - ener_max = *lp_ener_FEC_av; /*Q0*/ - move32(); - } - /*if( enr_old > ener_max )ener_max = enr_old;*/ - ener_max = L_max( ener_max, L_enr_old ); - - /*if( enr_q > scaling * ener_max ){enr_q = scaling * ener_max;}*/ - L_enr_q = L_min( L_enr_q, L_shl_sat( Mult_32_16( ener_max, scaling ), 1 ) ); /* scaling in Q14*/ - } - } - /*gain2 = (float)sqrt( enr_q / enr2 );*/ - L_enr_q = L_max( L_enr_q, 1 ); /* L_enr2 is in Q0 */ - L_tmp = Sqrt_Ratio32( L_enr_q, 0, L_enr2, 0, &exp2 ); - gain2 = round_fx( L_shl( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - - /*-----------------------------------------------------------------* - * Find the energy/gain at the beginning of the frame to ensure smooth transition after erasure(s) - *-----------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && ( clas == UNVOICED_CLAS || EQ_16( clas, INACTIVE_CLAS ) ) ) || - EQ_32( last_core_brate, SID_1k75 ) || EQ_32( last_core_brate, SID_2k40 ) || last_core_brate == FRAME_NO_DATA ) && - prev_bfi ) - { - /* voiced -> unvoiced signal transition */ - /* CNG -> active signal transition */ - gain1 = gain2; /*Q14*/ - move16(); - } - ELSE - { - /* find the energy at the beginning of the frame */ - frame_ener_fx( L_frame, clas, synth, pitch[0], &L_enr1 /*Q0*/, 1, Q_syn, 3, 0 ); - - /*enr1 += 0.1f;*/ - L_enr1 = L_max( L_enr1, 1 ); /* L_enr1 is in Q0 */ - - /*gain1 = (float)sqrt( enr_old / enr1 );*/ - L_tmp = Sqrt_Ratio32( L_enr_old, 0, L_enr1, 0, &exp2 ); - gain1 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - - /*if( gain1 > 1.2f )gain1 = 1.2f;*/ - /* prevent clipping */ - gain1 = s_min( gain1, 19661 /*1.2f in Q14*/ ); - - /* prevent amplifying the unvoiced or inactive part of the frame in case an offset is followed by an onset */ - test(); - test(); - if ( EQ_16( clas, ONSET ) && GT_16( gain1, gain2 ) && prev_bfi ) - { - gain1 = gain2; /*Q14*/ - move16(); - } - } - - L_enr2 = L_enr_q; /*Q0*/ - move32(); /* Set the end frame energy to the scaled energy, to be used in the lp_ener_FEC */ - } - - /*------------------------------------------------------------------------------* - * Smooth the energy evolution by exponentially evolving from gain1 to gain2 - *------------------------------------------------------------------------------*/ - - /*gain2 *= ( 1.0f - AGC );*/ - L_tmp = L_mult( gain2, (Word16) ( 32768 /*Q15*/ - AGC_FX ) ); /*Q30*/ - FOR( i = 0; i < L_frame; i++ ) - { - /*gain1 = gain1 * AGC + gain2;*/ - gain1 = mac_r( L_tmp, gain1, AGC_FX ); /* in Q14 */ - /*exc[i] *= gain1;*/ - exc[i] = mac_r( L_mult( exc[i], gain1 ), exc[i], gain1 ); - move16(); - /*exc2[i] *= gain1;*/ - exc2[i] = mac_r_sat( L_mult( exc2[i], gain1 ), exc2[i], gain1 ); - move16(); - } - /* smoothing is done in excitation domain, so redo synthesis */ - Copy( mem_tmp, mem_syn, M ); /* Q_syn */ - syn_12k8_fx( L_frame, Aq, exc2, synth, mem_syn, 1, Q_exc, Q_syn ); - *update_flg = 1; - move16(); - } - } - ELSE - { - /* previous frame erased and no TC frame */ - test(); - IF( prev_bfi && NE_16( coder_type, TRANSITION ) ) - { - IF( L_enr_q == 0 ) - { - L_enr_q = L_max( 1, L_enr2 ); /* sets to 'L_enr2' in 1 clock */ - set16_fx( h1, 0, L_FRAME / 2 ); - h1[0] = 1024; /*1.0f in Q10*/ - move16(); - /*syn_filt( Aq+(3*(M+1)), M, h1, h1, L_FRAME/2, h1+(M+1), 0 );*/ - E_UTIL_synthesis( 1, Aq + ( 3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); - /*Compute tilt */ - /*rr0 = dotp( h1, h1, L_FRAME/2-1 ) + 0.1f;*/ - /*rr1 = dotp( h1, h1+1, L_FRAME/2-1 );*/ - /*tilt = rr1 / rr0;*/ - tilt = extract_h( L_shl_sat( get_gain( h1 + 1, h1, L_FRAME / 2 - 1 ), 15 ) ); /*Q15*/ - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( ( ( EQ_32( total_brate, ACELP_13k20 ) ) || ( EQ_32( total_brate, ACELP_12k85 ) ) || ( EQ_32( total_brate, ACELP_12k15 ) ) || ( EQ_32( total_brate, ACELP_11k60 ) ) || - ( EQ_32( total_brate, ACELP_9k60 ) ) ) && - ( GT_16( tilt, 22938 ) ) && /* HF resonnant filter */ - ( ( ( clas == UNVOICED_CLAS ) ) || ( EQ_16( clas, INACTIVE_CLAS ) ) ) ) ) /* unvoiced classification */ - { - /*if( enr_q > scaling * enr_old )enr_q = scaling * enr_old;*/ - L_enr_q = L_min( L_enr_q, L_shl_sat( Mult_32_16( L_enr_old, scaling ), 1 ) ); /* scaling in Q14*/ - } - ELSE IF( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) - { - /* Voiced-voiced recovery */ - test(); - IF( *old_enr_LP != 0 && GT_16( enr_LP, shl_sat( *old_enr_LP, 1 ) ) ) - { - /* enr_q /= enr_LP */ - exp = norm_l( L_enr_q ); - tmp = extract_h( L_shl( L_enr_q, exp ) ); - - exp2 = norm_s( enr_LP ); - tmp2 = shl( enr_LP, exp2 ); - - exp = sub( exp2, exp ); - - tmp3 = sub( tmp, tmp2 ); - IF( tmp3 > 0 ) - { - tmp = shr( tmp, 1 ); - exp = add( exp, 1 ); - } - tmp = div_s( tmp, tmp2 ); - - /* L_enr_q *= 2 * *old_enr_LP */ - L_enr_q = L_shl( L_mult( tmp, shl( *old_enr_LP, 1 ) ), exp ); - } - - ELSE - { - test(); - IF( avoid_lpc_burst_on_recovery && GT_16( enr_LP, 160 /*20.0f in Q3*/ ) ) - { - exp = norm_s( enr_LP ); - tmp = shl( enr_LP, exp ); - - exp2 = 7; - move16(); - tmp2 = 160 << 7; /* 160 = 20.0f in Q3 */ - move16(); - exp = sub( exp2, exp ); - - IF( GT_16( tmp, tmp2 ) ) - { - tmp = shr( tmp, 1 ); - exp = add( exp, 1 ); - } - tmp = div_s( tmp, tmp2 ); /* tmp*2^exp = enr_LP/20.0 */ - L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* L_tmp*2^exp = sqrt(20.0/enr_LP) */ - L_enr_q = L_shl( Mpy_32_32( L_enr_q, L_tmp ), exp ); - } - } - } - - test(); - test(); - test(); - test(); - IF( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) || force_scaling ) - { - - IF( GT_32( L_enr_q, L_enr_old ) ) /* Prevent energy to increase on voiced */ - { - L_enr_q = L_add( Mpy_32_16_1( L_enr_old, 32767 - SCLSYN_LAMBDA ), Mpy_32_16_1( L_enr_q, SCLSYN_LAMBDA ) ); /*Q0*/ - } - } - } - - L_enr_q = L_max( 1, L_enr_q ); - - /* gain2 = (float)sqrt( enr_q / enr2 );*/ - exp = norm_l( L_enr_q ); - tmp = extract_h( L_shl( L_enr_q, exp ) ); - - exp2 = norm_l( L_enr2 ); - tmp2 = extract_h( L_shl( L_enr2, exp2 ) ); - - exp2 = sub( exp, exp2 ); /* Denormalize and substract */ - - tmp3 = sub( tmp2, tmp ); - IF( tmp3 > 0 ) - { - tmp2 = shr( tmp2, 1 ); - exp2 = add( exp2, 1 ); - } - - tmp = div_s( tmp2, tmp ); - - L_tmp = L_deposit_h( tmp ); - L_tmp = Isqrt_lc( L_tmp, &exp2 ); - gain2 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - /*-----------------------------------------------------------------* - * Clipping of the smoothing gain at the frame end - *-----------------------------------------------------------------*/ - - gain2 = s_min( gain2, 19661 /*1.2f in Q14*/ ); /* Gain modification clipping */ - if ( LT_32( L_enr_q, 2 ) ) - { - gain2 = s_min( gain2, 16384 /*1.0f in Q14*/ ); /* Gain modification clipping */ - } - - /*-----------------------------------------------------------------* - * Find the energy/gain at the beginning of the frame to ensure smooth transition after erasure(s) - *-----------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( clas, SIN_ONSET ) ) /* slow increase */ - { - gain1 = shr( gain2, 1 ); /*0.5f * gain2*/ - } - /*------------------------------------------------------------* - * voiced->unvoiced transition recovery - *------------------------------------------------------------*/ - ELSE IF( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && ( clas == UNVOICED_CLAS || EQ_16( clas, INACTIVE_CLAS ) ) ) || /* voiced->unvoiced transition recovery */ - EQ_32( last_core_brate, SID_1k75 ) || EQ_32( last_core_brate, SID_2k40 ) || last_core_brate == FRAME_NO_DATA ) /* CNG -> active signal transition */ - { - gain1 = gain2; /*Q14*/ - move16(); - } - ELSE - { - /*--------------------------------------------------------* - * Find the energy at the beginning of the frame - *--------------------------------------------------------*/ - tmp = frame_ener_fx( L_frame, clas, synth, pitch[0], &L_enr1, 0, Q_syn, 3, 0 ); - - /*gain1 = (float)sqrt( enr_old / enr1 );*/ - exp = norm_l( L_enr_old ); - tmp = extract_h( L_shl( L_enr_old, exp ) ); - exp2 = norm_l( L_enr1 ); - tmp2 = extract_h( L_shl( L_enr1, exp2 ) ); - - exp2 = sub( exp, exp2 ); /* Denormalize and substract */ - - tmp3 = sub( tmp2, tmp ); - - IF( tmp3 > 0 ) - { - tmp2 = shr( tmp2, 1 ); - exp2 = add( exp2, 1 ); - } - - tmp = div_s( tmp2, tmp ); - - L_tmp = L_deposit_h( tmp ); - L_tmp = Isqrt_lc( L_tmp, &exp2 ); - gain1 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - /* exp2 is always <= 1 */ - - gain1 = s_min( gain1, 19661 /*1.2F in Q14*/ ); - - test(); - test(); - if ( avoid_lpc_burst_on_recovery && ( GT_16( enr_LP, 160 ) ) && ( LE_16( enr_LP, shl_sat( *old_enr_LP, 1 ) ) ) ) - { - gain1 = s_min( gain1, 16384 /*1.0f in Q14*/ ); - } - - /*--------------------------------------------------------* - * Prevent a catastrophy in case of offset followed by onset - *--------------------------------------------------------*/ - test(); - if ( ( EQ_16( clas, ONSET ) ) && ( GT_16( gain1, gain2 ) ) ) - { - gain1 = gain2; /*Q14*/ - move16(); - } - } - /*-----------------------------------------------------------------* - * Smooth the energy evolution by exponentially evolving from - * gain1 to gain2 - *-----------------------------------------------------------------*/ - - L_tmp = L_mult( gain2, (Word16) ( 32768 /*Q15*/ - AGC_FX ) ); - - FOR( i = 0; i < L_frame; i++ ) - { - gain1 = mac_r( L_tmp, gain1, AGC_FX ); /* in Q14 */ - exc[i] = mac_r_sat( L_mult_sat( exc[i], gain1 ), exc[i], gain1 ); - move16(); - exc2[i] = mac_r_sat( L_mult_sat( exc2[i], gain1 ), exc2[i], gain1 ); - move16(); - } - - Copy( mem_tmp, mem_syn, M ); /* Q_syn */ - syn_12k8_fx( L_frame, Aq, exc2, synth, mem_syn, 1, Q_exc, Q_syn ); - *update_flg = 1; - move16(); - } - } - /*-----------------------------------------------------------------* - * Update low-pass filtered energy for voiced frames - *-----------------------------------------------------------------*/ - - test(); - test(); - IF( !bfi && ( GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) ) - { - IF( EQ_16( clas, VOICED_TRANSITION ) ) - { - L_enr2_av = L_enr2; /*Q0*/ - move32(); - frame_ener_fx( L_frame, VOICED_CLAS, synth, pitch[sub( shr( L_frame, 6 ), 1 )], &L_ener2_max /*Q0*/, 1, Q_syn, 3, 0 ); - } - ELSE - { - L_ener2_max = L_enr2; /*Q0*/ - move32(); - frame_ener_fx( L_frame, UNVOICED_CLAS, synth, pitch[sub( shr( L_frame, 6 ), 1 )], &L_enr2_av /*Q0*/, 1, Q_syn, 3, 0 ); - } - - /**lp_ener_FEC_av = 0.2f * enr2_av + 0.8f * *lp_ener_FEC_av; move32();*/ - *lp_ener_FEC_av = Madd_32_16( Mult_32_16( *lp_ener_FEC_av, 31130 /*0.95f in Q15*/ ), L_enr2_av, 1638 /*0.05F Q15*/ ); /*Q0*/ - move32(); - /**lp_ener_FEC_max = 0.2f * enr2_max + 0.8f * *lp_ener_FEC_max; move32();*/ - *lp_ener_FEC_max = Madd_32_16( Mult_32_16( *lp_ener_FEC_max, 31130 /*0.95f in Q15*/ ), L_ener2_max, 1638 /*0.05F Q15*/ ); /*Q0*/ - move32(); - } - - /*-----------------------------------------------------------------* - * Update the LP filter energy for voiced frames - *-----------------------------------------------------------------*/ - test(); - if ( GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) - { - *old_enr_LP = enr_LP; /*Q3*/ - move16(); - } - - return; -} - -void FEC_scale_syn_ivas_fx( - const Word16 L_frame, /* i : length of the frame */ - Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ - Word16 clas, /* i/o: frame classification */ - const Word16 last_good, /* i: last good frame classification */ - Word16 *synth, /* i/o: synthesized speech at Fs = 12k8 Hz Q_syn*/ - const Word16 *pitch, /* i: pitch values for each subframe Q0*/ - Word32 L_enr_old, /* i: energy at the end of previous frame */ - Word32 L_enr_q, /* i: transmitted energy for current frame */ - const Word16 coder_type, /* i: coder type */ - const Word16 LSF_Q_prediction, /* i : LSF prediction mode */ - Word16 *scaling_flag, /* i/o: flag to indicate energy control of syn */ - Word32 *lp_ener_FEC_av, /* i/o: averaged voiced signal energy Q0*/ - Word32 *lp_ener_FEC_max, /* i/o: averaged voiced signal energy Q0*/ - const Word16 bfi, /* i: current frame BFI */ - const Word32 total_brate, /* i: total bitrate */ - const Word16 prev_bfi, /* i: previous frame BFI */ - const Word32 last_core_brate, /* i: previous frame core bitrate */ - Word16 *exc, /* i/o: excitation signal without enhancement */ - Word16 *exc2, /* i/o: excitation signal with enhancement */ - Word16 Aq[], /* i/o: LP filter coefs (can be modified if BR) Q12*/ - Word16 *old_enr_LP, /* i/o: LP filter E of last good voiced frame Q3*/ - const Word16 *mem_tmp, /* i: temp. initial synthesis filter states Q_syn*/ - Word16 *mem_syn, /* o: initial synthesis filter states Q_syn*/ - Word16 Q_exc, - Word16 Q_syn, - const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ - const Word16 force_scaling /* i: force scaling */ -) -{ - Word16 i; - Word32 L_enr1, L_enr2; - Word16 gain1, gain2, enr_LP; - Word16 tmp, tmp2, exp, exp2; - Word16 tmp3; - Word32 L_tmp; - Word16 scaling; - Word32 ener_max, L_enr2_av, L_ener2_max; - Word16 h1[L_FRAME / 2], tilt, pitch_dist, mean_pitch; - Word16 k; - Word32 L_mean_pitch; - - enr_LP = 0; - move16(); - gain2 = 0; - move16(); - gain1 = 0; - move16(); - *update_flg = 0; - move16(); - L_enr_old = L_max( 1, L_enr_old ); /* to avoid division by zero (*L_enr_old is always >= 0) */ - scaling = 16384; - move16(); /* Q14*/ + tmp = sub( 3, getScaleFactor16( synth, L_frame ) ); - /*-----------------------------------------------------------------* - * Find the synthesis filter impulse response on voiced - *-----------------------------------------------------------------*/ test(); - IF( GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - enr_LP = Enr_1_Az_fx( Aq + ( NB_SUBFR - 1 ) * ( M + 1 ), L_SUBFR ); - } - ELSE /* L_frame == L_FRAME16k */ - { - enr_LP = Enr_1_Az_fx( Aq + ( NB_SUBFR16k - 1 ) * ( M + 1 ), L_SUBFR ); /*Q3*/ - } - } - - /*-----------------------------------------------------------------* - * Define when to scale the synthesis - *-----------------------------------------------------------------*/ - - IF( bfi ) - { - *scaling_flag = 1; - move16(); /* Always check synthesis on bad frames */ - } - ELSE IF( prev_bfi ) - { - test(); - IF( ( EQ_16( LSF_Q_prediction, AUTO_REGRESSIVE ) ) || ( EQ_16( LSF_Q_prediction, MOVING_AVERAGE ) ) ) - { - *scaling_flag = 2; - move16(); /* Decoded LSFs affected */ - } - ELSE IF( NE_16( coder_type, TRANSITION ) ) - { - *scaling_flag = 1; - move16(); /* SN, but not TC mode - LSF still affected by the interpolation */ - } - ELSE - { - *scaling_flag = 0; - move16(); /* LSF still possibly affected due to interpolation */ - } - scaling = 24576; /*1.5 Q14*/ - move16(); - } - ELSE - { - test(); - IF( ( EQ_16( LSF_Q_prediction, AUTO_REGRESSIVE ) ) && ( EQ_16( *scaling_flag, 2 ) ) ) - { - *scaling_flag = 2; - move16(); /* Continue with energy control till the end of AR prediction */ - } - ELSE IF( *scaling_flag > 0 ) - { - ( *scaling_flag ) = sub( *scaling_flag, 1 ); /* If scaling flag was equal to 2, add one control frame to account for the LSF interpolation */ - move16(); - } - scaling = 32767; /*2.0 Q14*/ - move16(); - } - - /*-----------------------------------------------------------------* - * Find the energy/gain at the end of the frame - *-----------------------------------------------------------------*/ - tmp = sub( 3, getScaleFactor16( synth, L_frame ) ); - IF( tmp > 0 ) + IF( tmp > 0 && GT_16( element_mode, EVS_MONO ) ) { Word16 synth_tmp[L_FRAME16k]; Copy_Scale_sig( synth, synth_tmp, L_frame, -tmp ); // Q_synth - tmp @@ -803,7 +242,7 @@ void FEC_scale_syn_ivas_fx( pitch_dist = add( pitch_dist, abs_s( sub( pitch[k + 1], pitch[k] ) ) ); /*Q0*/ L_mean_pitch = L_mac( L_mean_pitch, pitch[k + 1], 8192 ); /*Q14*/ } - /*pitch_dist /= (float)(NB_SUBFR-1); */ + /*pitch_dist /= (float)(NB_SUBFR-1); */ pitch_dist = mult_r( shl( pitch_dist, 4 ), 10923 /*1/(float)(NB_SUBFR-1) in Q15*/ ); /*Q4*/ /*mean_pitch /= (float)(NB_SUBFR);*/ mean_pitch = extract_h( L_shl( L_mean_pitch, 4 ) ); /*Q4*/ diff --git a/lib_dec/LD_music_post_filter_fx.c b/lib_dec/LD_music_post_filter_fx.c index 5b48ab47225f7355d8f46111c86dd939b2fc7461..fe643376858fc44c1117d3175da2ba38ebf0738d 100644 --- a/lib_dec/LD_music_post_filter_fx.c +++ b/lib_dec/LD_music_post_filter_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -69,9 +69,6 @@ void LD_music_post_filter_fx( Word16 mant, exp1, s_ave, tmp16, old_tmp16; Word16 diff_sc; Word16 old_tmp16_1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif move16(); move16(); move16(); @@ -186,7 +183,7 @@ void LD_music_post_filter_fx( FOR( k = j; k < mfreq_bindiv_LD[i] + j; k++ ) { /*m_ave += lf_E[k];*/ - Ltmp = L_add_o( lf_E[k], Ltmp, &Overflow ); /*2*Qdct+10*/ + Ltmp = L_add_sat( lf_E[k], Ltmp ); /*2*Qdct+10*/ max_val = L_max( max_val, lf_E[k] ); } Ltmp_max = L_max( Ltmp_max, max_val ); /*2*Qdct+10*/ @@ -442,9 +439,6 @@ static void spectrum_mod_dct_fx( Word32 Lshift; Word32 dot5_scaled; const Word32 *Lpt2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif move16(); move32(); @@ -523,7 +517,7 @@ static void spectrum_mod_dct_fx( IF( music_flag != 0 ) /* prevent subtraction on clean speech */ { - IF( LE_32( maxNoise, L_shl_o( 10, scaling, &Overflow ) ) ) + IF( LE_32( maxNoise, L_shl_sat( 10, scaling ) ) ) { minE = 18432 / 2; /*Q14*/ move16(); @@ -599,12 +593,12 @@ static void spectrum_mod_dct_fx( Ltmp = L_mult( tmpN, m_binE ); /*2*Qdct+e_binE+9*/ e_binE = sub( add( e_tmp, e_binE ), 15 ); - Ltmp = L_shr_o( Ltmp, e_binE, &Overflow ); /*2*Qdct+9*/ - Lgain = L_add_o( Ltmp, Lshift, &Overflow ); /*Saturation can occure here result in Q30*/ + Ltmp = L_shr_sat( Ltmp, e_binE ); /*2*Qdct+9*/ + Lgain = L_add_sat( Ltmp, Lshift ); /*Saturation can occure here result in Q30*/ } Lpt2++; - gain = round_fx_o( Lgain, &Overflow ); /*gain in Q30-16 = Q14*/ + gain = round_fx_sat( Lgain ); /*gain in Q30-16 = Q14*/ /*if (gain < minE)gain = minE;*/ gain = s_max( gain, minE ); /*Q14*/ /*if (gain > 1.0f+MAX_GN)gain = 1.0f+MAX_GN;*/ @@ -832,7 +826,14 @@ void Prep_music_postP_fx( * Extrapolation of the last future part and windowing *------------------------------------------------------------*/ pt1 = exc_buffer_in + DCT_L_POST - OFFSET2; /*Q_exc*/ - pred_lt4( pt1, pt1, s_pit, fr_pit, OFFSET2, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( pt1, pt1, s_pit, fr_pit, OFFSET2, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( pt1, pt1, s_pit, fr_pit, OFFSET2, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } /*------------------------------------------------------------* * windowing right side *------------------------------------------------------------*/ @@ -894,9 +895,6 @@ static Word16 norm_lfe( { Word32 Ltmp; Word16 exp2, tmp16, exp3; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif move32(); @@ -916,7 +914,7 @@ static Word16 norm_lfe( exp3 = sub( exp2, 12 + 16 - 3 ); /* if exp2 < 31, means that tmp >= 1.0 */ /* Need to shl by 3 to take into account the 3 multiplications */ } - tmp16 = shl_o( tmp16, exp3, &Overflow ); /* Result in Q12 */ + tmp16 = shl_sat( tmp16, exp3 ); /* Result in Q12 */ return tmp16; } @@ -943,11 +941,10 @@ void Post_music_postP_fx( Word16 *mem_deemph, /* i/o: speech deemph filter memory Q_syn*/ Word16 *st_pst_old_syn_fx, /* i/o: psfiler Q_syn*/ Word16 *st_pst_mem_deemp_err_fx, /* i/o: psfiler Q_syn*/ - Word16 *mem_agc, /*Q_syn*/ + Word16 *mem_agc, /* Q_syn */ PFSTAT *pf_stat, /* i/o: All memories related to NB post filter */ - const Word16 *tmp_buffer /* tmp_buffer in Q-1 */ - , - Word16 *mem_tmp2 /* Temporary memory used with scale_syn Q_syn*/ + const Word16 *tmp_buffer, /* tmp_buffer in Q-1 */ + Word16 *mem_tmp2 /* Temporary memory used with scale_syn Q_syn*/ ) { Word16 exc16[DCT_L_POST]; diff --git a/lib_dec/TonalComponentDetection_fx.c b/lib_dec/TonalComponentDetection_fx.c index e50abddd6e25c43a74c5daa081dff5c2292dd242..b1ffd7580f7e80d40bb92bf3996b08c2f454f696 100644 --- a/lib_dec/TonalComponentDetection_fx.c +++ b/lib_dec/TonalComponentDetection_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #define _USE_MATH_DEFINES @@ -76,30 +76,21 @@ void ivas_DetectTonalComponents_fx( pScaledMdctSpectrum[i] = L_shl( lastMDCTSpectrum[i], 16 ); /*15-lastMDCTSpectrum_exp+16 -> 31 - lastMDCTSpectrum_exp*/ move32(); } -#ifdef MSAN_FIX FOR( Word16 i = 0; i < FDNS_NPTS; i++ ) { sns_int_scf_fx[i] = L_shl_sat( scaleFactors[i], add( 1, scaleFactors_exp[i] ) ); // Q16 move32(); } -#endif IF( psychParamsCurrent == NULL ) { nBands = FDNS_NPTS; move16(); - // PMT("add nBands argument to mdct_shaping_16") mdct_shaping_16( lastMDCTSpectrum, nSamplesCore, nSamples, scaleFactors, scaleFactors_exp, scaleFactors_max_e, pScaledMdctSpectrum ); lastMDCTSpect_exp = add( lastMDCTSpectrum_exp, scaleFactors_max_e ); } ELSE { -#ifndef MSAN_FIX - FOR( Word16 i = 0; i < FDNS_NPTS; i++ ) - { - sns_int_scf_fx[i] = L_shl( scaleFactors[i], add( 1, scaleFactors_exp[i] ) ); // Q16 - } -#endif q_pScaledMdctSpectrum = sub( 31, lastMDCTSpectrum_exp ); sns_shape_spectrum_fx( pScaledMdctSpectrum, &q_pScaledMdctSpectrum, psychParamsCurrent, sns_int_scf_fx, 16, nSamplesCore, NULL ); q_pScaledMdctSpectrum = add( q_pScaledMdctSpectrum, 1 ); @@ -148,33 +139,13 @@ void DetectTonalComponents( const Word16 nSamples, const Word16 nSamplesCore, Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins Q0*/ - Word16 element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif -) + Word16 element_mode ) { Word16 F0; Word16 thresholdModification[L_FRAME_MAX], lastMDCTSpect_exp; Word32 pScaledMdctSpectrum[L_FRAME_MAX]; -#ifdef IVAS_CODE_MDCT_GSHAPE - Word16 nBands; - IF( psychParamsCurrent == NULL ) - { - nBands = FDNS_NPTS; - PMT( "add nBands argument to mdct_shaping_16" ) -#endif - mdct_shaping_16( lastMDCTSpectrum, nSamplesCore, nSamples, scaleFactors, scaleFactors_exp, scaleFactors_max_e, pScaledMdctSpectrum ); -#ifdef IVAS_CODE_MDCT_GSHAPE - } - ELSE - { - sns_shape_spectrum( pScaledMdctSpectrum, psychParamsCurrent, scaleFactors, nSamplesCore ); - nBands = psychParamsCurrent->nBands; - } -#endif + mdct_shaping_16( lastMDCTSpectrum, nSamplesCore, nSamples, scaleFactors, scaleFactors_exp, scaleFactors_max_e, pScaledMdctSpectrum ); lastMDCTSpect_exp = add( lastMDCTSpectrum_exp, scaleFactors_max_e ); @@ -216,12 +187,7 @@ void RefineTonalComponents( const Word16 nSamples, const Word16 nSamplesCore, const Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins Q0*/ - Word16 element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif -) + Word16 element_mode ) { Word16 newIndexOfTonalPeak[MAX_NUMBER_OF_IDX]; /*Q0*/ Word16 newLowerIndex[MAX_NUMBER_OF_IDX]; /*Q0*/ @@ -232,12 +198,7 @@ void RefineTonalComponents( DetectTonalComponents( newIndexOfTonalPeak, newLowerIndex, newUpperIndex, &newNumIndexes, lastPitchLag, currentPitchLag, lastMDCTSpectrum, - lastMDCTSpectrum_exp, scaleFactors, scaleFactors_exp, scaleFactors_max_e, secondLastPowerSpectrum, nSamples, nSamplesCore, floorPowerSpectrum, element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - psychParamsCurrent -#endif - ); + lastMDCTSpectrum_exp, scaleFactors, scaleFactors_exp, scaleFactors_max_e, secondLastPowerSpectrum, nSamples, nSamplesCore, floorPowerSpectrum, element_mode ); nPreservedPeaks = 0; move16(); @@ -492,7 +453,7 @@ static void getEnvelope( FOR( i = 0; i < n2; i++ ) { - sum = L_add( sum, powerSpec[i] ); /*powerSpec_exp*/ + sum = L_add_sat( sum, powerSpec[i] ); /*powerSpec_exp*/ } /* No need for PTR_INIT for powerSpec[i+n2] as we continue from the previous loop */ FOR( i = 0; i < n1; i++ ) @@ -748,15 +709,6 @@ static void CorrectF0( Word16 tmp; -#ifdef IVAS_CODE - FOR( i = 0; i < MAX_PEAKS_FROM_PITCH - 1; i++ ) - { - diff[i] = 0; - sortedDiff[i] = 0; - move16)); - move16)); - } -#endif F0 = *pF0; /*Q10*/ test(); diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 0f94a755880de6be2a664858de5c6671b0ab543f..958b8064dd6e701622ce10fa131cf5c17c18d638 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -1,55 +1,71 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ - #include #include -#include "options.h" /* Compilation switches */ -#include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot_fx.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_cnst.h" /* Common constants */ -#include "cnst.h" /* Common constants */ -/*==========================================================================*/ -/* FUNCTION : void acelp_core_dec_fx () */ -/*--------------------------------------------------------------------------*/ -/* PURPOSE : ACELP core decoder */ -/*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ Word16 coder_type i : coder type */ - -/*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ Word16 *voice_factors o : voicing factors Q15 */ -/* _ Word16 old_syn_12k8_16k[] o : intermediate ACELP Q_syn2-1 */ -/* synthesis at 12.8kHz or 16kHz to be used by SWB BWE */ -/* _ Word16 synth_out[] o : synthesis Q_syn2-1 */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ Decoder_State_fx *st_fx: */ -/* _ Word16 bwe_exc_extended[] i/o: bandwidth extended excitation Q0*/ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*--------------------------------------------------------------------------*/ -/* CALLED FROM : RX */ -/*==========================================================================*/ + + +/*-------------------------------------------------------------------* + * acelp_core_dec_fx() + * + * ACELP core decoder + *-------------------------------------------------------------------*/ ivas_error acelp_core_dec_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 output[], /* o : synthesis @internal Fs */ - Word16 synth_out[], /* o : synthesis Q_syn2-1*/ - Word16 save_hb_synth[], /* o : HB synthesis */ - Word32 bwe_exc_extended[], /* i/o: bandwidth extended excitation Q0*/ - Word16 *voice_factors, /* o : voicing factors Q15 */ - Word16 old_syn_12k8_16k[], /* o : intermediate ACELP synthesis for SWB BWE Q_syn2-1*/ - Word16 sharpFlag, - Word16 pitch_buf_fx[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ + Decoder_State *st, /* i/o: decoder state structure */ + Word16 output_fx[], /* o : synthesis @internal Fs Q_syn*/ + Word16 synth_fx16[], /* o : synthesis Q_syn2*/ + Word16 save_hb_synth_fx16[], /* o : HB synthesis Q0*/ + Word32 bwe_exc_extended_fx[], /* i/o: bandwidth extended excitation 2*Q_exc*/ + Word16 *voice_factors_fx, /* o : voicing factors Q15*/ + Word16 old_syn_12k8_16k_fx[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE Q_syn2-1*/ + const Word16 sharpFlag, /* i : formant sharpening flag */ + Word16 pitch_buf_fx[NB_SUBFR16k], /* o : Word16 pitch for each subframe Q6*/ Word16 *unbits, /* o : number of unused bits */ Word16 *sid_bw, /* o : 0-NB/WB, 1-SWB SID */ - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const Word16 tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ - const Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle Qlog2(2.56)*/ + const Word16 tdm_lsfQ_PCh_fx[M], /* i : Q LSFs for primary channel */ const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ const Word16 last_element_mode, /* i : last element mode */ const Word32 last_element_brate, /* i : last element bitrate */ @@ -59,98 +75,158 @@ ivas_error acelp_core_dec_fx( const Word16 read_sid_info /* i : read SID info flag */ ) { - Word16 old_exc_fx[L_EXC_DEC] = { 0 }, *exc_fx; /* excitation signal buffer (Q0) */ - Word16 syn_fx_tmp[L_FRAME_16k + L_SUBFR], *syn_fx; /* synthesis signal buffer */ - Word16 temp_buf[L_FRAME16k + L_SYN_MEM]; - Word16 output_frame; /* frame length at output sampling freq. */ - Word16 mem_tmp_fx[M]; /* temporary synthesis filter memory */ - Word32 enr_q_fx; /* E information for FER protection */ - Word16 tmp_noise_fx; /* Long term temporary noise energy */ - Word16 i, int_fs; - Word16 tc_subfr_fx; - Word16 allow_cn_step_fx; + Word32 synth_fx[960], save_hb_synth_fx[960] /*, bwe_exc_extended_fx[L_FRAME32k + NL_BUFF_OFFSET]*/; + Word16 old_exc_fx[L_EXC_DEC], *exc_fx; /* excitation signal buffer */ + Word16 syn_tmp_fx[L_FRAME16k + L_SUBFR], *psyn_fx; /* synthesis signal buffer */ + Word16 output_frame; /* frame length at output sampling freq. */ + Word16 lsf_new_fx[M]; /* LSFs at the end of the frame Qlog2(2.56) */ + Word16 lsp_new_fx[M]; /* LSPs at the end of the frame Q15 */ + Word16 lsp_mid_fx[M]; /* LSPs in the middle of the frame */ + Word16 Aq_fx[NB_SUBFR16k * ( M + 1 )]; /* A(q) quantized for the 4 subframes */ + Word16 old_exc2_fx[L_FRAME16k + L_EXC_MEM], *exc2_fx; /* total excitation buffer */ + Word16 mem_tmp_fx[M]; /* temporary synthesis filter memory */ + Word32 enr_q_fx; /* E information for FER protection */ + Word16 tmp_noise_fx; /* Long term temporary noise energy */ + Word16 Es_pred_fx; /* predicted scaled innov. energy Q8 */ + Word16 FEC_pitch_fx; /* FEC pitch */ + Word16 old_bwe_exc_fx[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; /* excitation buffer */ + Word16 *bwe_exc_fx; /* Excitation for SWB TBE */ + Word16 i, j, int_fs; + Word16 tc_subfr; + Word16 allow_cn_step; Word16 temp_buf_fx[L_FRAME16k + L_SYN_MEM]; - - Word16 Aq_fx[NB_SUBFR16k * ( M + 1 )] = { 0 }; /*Q12*/ - Word16 Es_pred_fx; /*Q8*/ - Word16 old_bwe_exc_fx[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )] = { 0 }; /* excitation buffer Q_exc*/ - Word16 old_exc2_fx[L_FRAME16k + L_EXC_MEM], *exc2_fx; /* total excitation buffer */ - Word16 *bwe_exc_fx; - Word16 lsf_new_fx[M]; /* LSFs at the end of the frame */ - Word16 lsp_new_fx[M]; /* LSPs at the end of the frame */ - Word16 lsp_mid_fx[M]; /* LSPs in the middle of the frame */ - Word16 FEC_pitch_fx; /*Q6*/ Word16 last_pulse_pos; Word16 T0_tmp; - Word16 do_WI_fx; + Word16 do_WI; Word16 dct_buffer_fx[DCT_L_POST]; Word16 exc_buffer_fx[DCT_L_POST]; - Word16 dct_exc_tmp[L_FRAME16k]; - Word16 qdct; - Word16 delta_mem_scale; - Word16 bpf_error_signal[L_FRAME16k]; - CLDFB_SCALE_FACTOR scaleFactor; - Word32 workBuffer[128 * 3]; - Word32 q_env[20]; - Word16 exc3_fx[L_FRAME16k]; - Word16 syn1_fx_tmp[L_FRAME16k + 2], *syn1_fx; - Word32 *realBuffer[CLDFB_NO_COL_MAX], *imagBuffer[CLDFB_NO_COL_MAX]; - Word16 gain_buf[NB_SUBFR16k]; /*Q14*/ + Word16 dct_exc_tmp_fx[L_FRAME16k]; + Word16 nb_bits; /* number of bits */ + Word16 indice; /* parameter indices to write */ + Word16 gain_buf_fx[NB_SUBFR16k]; Word16 syn_fx_tmp2[L_FRAME_16k]; Word16 pitch_buf_tmp[NB_SUBFR16k]; - Word16 k; Word16 update_flg; - Word32 realBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word32 imagBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word16 LSF_Q_prediction; /* o : LSF prediction mode */ + Word32 q_env_fx[20]; + Word16 exc3_fx[L_FRAME16k]; + Word16 syn1_tmp_fx[L_FRAME16k + 2], *syn1_fx; + Word32 *realBuffer_fx[CLDFB_NO_COL_MAX], *imagBuffer_fx[CLDFB_NO_COL_MAX]; + Word32 realBufferTmp_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 imagBufferTmp_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 LSF_Q_prediction; /* LSF prediction mode */ Word16 avoid_lpc_burst_on_recovery; - Word16 uc_two_stage_flag, dec; - Word16 nb_bits, indice; + Word16 tmpF_fx; + Word16 uc_two_stage_flag; Word16 tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag; - MUSIC_POSTFILT_HANDLE hMusicPF; - BPF_DEC_HANDLE hBPF; - TD_BWE_DEC_HANDLE hBWE_TD; - FD_BWE_DEC_HANDLE hBWE_FD; - TCX_DEC_HANDLE hTcxDec; + Word16 *old_exc_s_fx; /* Start of last excitation frame */ + Word16 *p_tdm_Pri_pitch_buf_fx; + Word16 tmp, exp, local_element_mode; ivas_error error; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING - (void) ( tdm_lspQ_PCh ); - (void) ( tdm_lsfQ_PCh ); - (void) ( use_cldfb_for_dft ); - (void) ( last_element_mode ); - (void) ( last_element_brate ); - (void) ( flag_sec_CNA ); - (void) ( nchan_out ); - (void) ( save_hb_synth ); - (void) ( output ); - (void) ( read_sid_info ); - (void) hStereoCng; -#endif - hMusicPF = st_fx->hMusicPF; - hBPF = st_fx->hBPF; - hBWE_TD = st_fx->hBWE_TD; - hBWE_FD = st_fx->hBWE_FD; - hTcxDec = st_fx->hTcxDec; + Word32 bpf_error_signal_fx[L_FRAME16k]; + Word16 bpf_error_signal_16fx[L_FRAME16k]; + Word16 Q_real, scf; + Word32 max_real, max_imag, max_val; + + set32_fx( bpf_error_signal_fx, 0, L_FRAME16k ); + set16_fx( bpf_error_signal_16fx, 0, L_FRAME16k ); + set16_fx( Aq_fx, 0, NB_SUBFR16k * ( M + 1 ) ); + set16_fx( old_bwe_exc_fx, 0, ( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 ) ); + error = IVAS_ERR_OK; move32(); - // IF ( EQ_16(st_fx->element_mode, IVAS_CPE_MDCT) && EQ_16(nchan_out, 1) && EQ_16(st_fx->idchan, 1) && LE_32(last_element_brate, IVAS_SID_4k4) ) + test(); test(); test(); - IF( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && EQ_16( nchan_out, 1 ) && EQ_16( st_fx->idchan, 1 ) && LE_32( last_element_brate, IVAS_SID_5k2 ) ) + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( nchan_out, 1 ) && EQ_16( st->idchan, 1 ) && LE_32( last_element_brate, IVAS_SID_5k2 ) ) { /* In MDCT-Stereo DTX with mono output, we can skip CNG for the second channel, except for the first inactive frame following an active period */ return error; } + push_wmops( "acelp_core_dec" ); + + /* output_frame = (int16_t) ( st->output_Fs / FRAMES_PER_SEC ); */ + output_frame = extract_l( Mpy_32_32( st->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + + /*----------------------------------------------------------------* + * stereo SID and CNG frames processing + *----------------------------------------------------------------*/ + + test(); + test(); + IF( LE_32( st->core_brate, SID_2k40 ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) && EQ_16( nchan_out, 2 ) ) + { + IF( EQ_16( st->cng_type, FD_CNG ) ) + { + configureFdCngDec_fx( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); + + Word16 old_NoiseEstExp; + old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; + move16(); + + /* Only run parameter decoding in SID frames */ + IF( EQ_32( st->core_brate, SID_2k40 ) ) + { + FdCng_decodeSID_ivas_fx( st ); + + Word16 n1, n2; + n1 = L_norm_arr( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART ); + n2 = L_norm_arr( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART ); + + Word16 common_e = s_max( sub( old_NoiseEstExp, n2 ), sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, n1 ) ); + scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, common_e ) ); + scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( old_NoiseEstExp, common_e ) ); + st->hFdCngDec->hFdCngCom->sidNoiseEstExp = common_e; + move16(); + } + + FOR( i = 0; i < NPART; i++ ) + { + st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = Madd_32_32( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), + STEREO_DFT_FD_FILT_COMP_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEst[i] ); + move32(); + } + + ApplyFdCng_fx( NULL, 0, NULL, 0, NULL, NULL, NULL, st, 0, 0 ); + } + ELSE + { + configureFdCngDec_fx( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); + + /* decode CNG parameters */ + CNG_dec_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); + + /* comfort noise generation */ + CNG_exc_fx( st->core_brate, st->L_frame, &st->hTdCngDec->Enew_fx, &st->hTdCngDec->cng_seed, NULL, NULL, &st->lp_ener_fx, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), NULL, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->prev_Q_exc, st->Q_exc, st->hTdCngDec->num_ho, q_env_fx, st->hTdCngDec->lp_env_fx, st->hTdCngDec->old_env_fx, st->hTdCngDec->exc_mem_fx, st->hTdCngDec->exc_mem1_fx, sid_bw, &st->hTdCngDec->cng_ener_seed1, NULL, st->Opt_AMR_WB, st->element_mode ); + + Copy( Aq_fx, st->Aq_cng, M + 1 ); /*Q12*/ + + /* update old LSP and LSF vector */ + Copy( lsf_new_fx, st->lsf_old_fx, M ); /*Qlog2(2.56)*/ + Copy( lsp_new_fx, st->lsp_old_fx, M ); /*Q15*/ + } + + set16_fx( output_fx, 0, output_frame ); /* output and synth are not used in DFT domain CNG generation and the decoder output is unaffected if they are left uninitalized */ + set16_fx( synth_fx16, 0, output_frame ); /* They are however read in a few places which causes errors in the valgrind tests. Simplest solution from a code perspective was to set them to zero. */ + + /* CN generation done in DFT domain */ + pop_wmops(); + + return error; + } + + /*----------------------------------------------------------------* + * Active frames processing + *----------------------------------------------------------------*/ + + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) { - set32_fx( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); - realBuffer[i] = realBufferTmp[i]; - move32(); - imagBuffer[i] = imagBufferTmp[i]; - move32(); + set32_fx( realBufferTmp_fx[i], 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( imagBufferTmp_fx[i], 0, CLDFB_NO_CHANNELS_MAX ); + realBuffer_fx[i] = realBufferTmp_fx[i]; + imagBuffer_fx[i] = imagBufferTmp_fx[i]; } /*----------------------------------------------------------------* @@ -159,54 +235,61 @@ ivas_error acelp_core_dec_fx( LSF_Q_prediction = -1; move16(); - set16_fx( syn_fx_tmp, 0, L_SUBFR ); - syn_fx = syn_fx_tmp + L_SUBFR; - syn1_fx_tmp[0] = 0; + set16_fx( syn_tmp_fx, 0, L_SUBFR ); + psyn_fx = syn_tmp_fx + L_SUBFR; + syn1_tmp_fx[0] = 0; move16(); - syn1_fx_tmp[1] = 0; + syn1_tmp_fx[1] = 0; move16(); - syn1_fx = syn1_fx_tmp + 2; - /*output_frame = (Word16)(st_fx->output_Fs_fx / 50); move16();*/ - output_frame = st_fx->output_frame_fx; - move16(); - st_fx->bpf_off = 0; + syn1_fx = syn1_tmp_fx + 2; + st->bpf_off = 0; move16(); + test(); test(); test(); test(); test(); test(); - IF( EQ_16( st_fx->last_core, HQ_CORE ) || EQ_16( st_fx->last_core, TCX_20_CORE ) || EQ_16( st_fx->last_core, TCX_10_CORE ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) && LE_32( st_fx->last_core_brate, SID_2k40 ) ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && LE_32( st_fx->last_core_brate, SID_2k40 ) ) ) + IF( EQ_16( st->last_core, HQ_CORE ) || EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && LE_32( st->last_core_brate, SID_2k40 ) ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && LE_32( st->last_core_brate, SID_2k40 ) ) ) { /* in case of HQ->ACELP switching, do not apply BPF */ - st_fx->bpf_off = 1; + st->bpf_off = 1; move16(); - /* in case of core switching, reset post-filter memories */ - if ( st_fx->hPFstat != NULL ) + if ( st->hPFstat != NULL ) { - st_fx->hPFstat->on = 0; + /* in case of core switching, reset post-filter memories */ + st->hPFstat->on = 0; move16(); } - /* reset the GSC pre echo energy threshold in case of switching */ - if ( st_fx->hGSCDec != NULL ) + if ( st->hGSCDec != NULL ) { - st_fx->hGSCDec->Last_frame_ener_fx = MAX_32; + /* reset the GSC pre echo energy threshold in case of switching */ + st->hGSCDec->Last_frame_ener_fx = MAX_32; move32(); } } - IF( st_fx->prev_bfi > 0 ) + + test(); + if ( st->hGSCDec != NULL && ( st->prev_bfi > 0 ) ) { /* reset the GSC pre echo energy threshold in case of FEC */ - if ( st_fx->hGSCDec != NULL ) - { - st_fx->hGSCDec->Last_frame_ener_fx = MAX_32; - move32(); - } + st->hGSCDec->Last_frame_ener_fx = MAX_32; + move32(); + } + + test(); + test(); + test(); + test(); + IF( st->hFdCngDec != NULL && ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && ( EQ_32( st->last_core_brate, SID_2k40 ) || st->last_core_brate == FRAME_NO_DATA ) ) + { + set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, FFTLEN ); + set16_fx( hStereoCng->olapBufferSynth22_fx, 0, FFTLEN ); } - st_fx->clas_dec = st_fx->last_good; + st->clas_dec = st->last_good; move16(); enr_q_fx = 0; move32(); @@ -214,21 +297,22 @@ ivas_error acelp_core_dec_fx( move16(); tmp_noise_fx = 0; move16(); - Copy( st_fx->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); // Q_exc + Copy( st->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); /*Q_exc*/ exc_fx = old_exc_fx + L_EXC_MEM_DEC; - IF( st_fx->hWIDec != NULL ) + IF( st->hWIDec != NULL ) { - Copy( st_fx->hWIDec->old_exc2_fx, old_exc2_fx, L_EXC_MEM ); + Copy( st->hWIDec->old_exc2_fx, old_exc2_fx, L_EXC_MEM ); } ELSE { set16_fx( old_exc2_fx, 0, L_EXC_MEM ); } exc2_fx = old_exc2_fx + L_EXC_MEM; - IF( st_fx->hBWE_TD != NULL ) + + IF( st->hBWE_TD != NULL ) { - Copy( hBWE_TD->old_bwe_exc_fx, old_bwe_exc_fx, PIT16k_MAX * 2 ); // Q_exc + Copy( st->hBWE_TD->old_bwe_exc_fx, old_bwe_exc_fx, PIT16k_MAX * 2 ); /*Q_exc*/ bwe_exc_fx = old_bwe_exc_fx + PIT16k_MAX * 2; } ELSE @@ -238,271 +322,270 @@ ivas_error acelp_core_dec_fx( last_pulse_pos = 0; move16(); - do_WI_fx = 0; + do_WI = 0; move16(); - st_fx->GSC_noisy_speech = 0; + st->GSC_noisy_speech = 0; move16(); - st_fx->relax_prev_lsf_interp = 0; + st->relax_prev_lsf_interp = 0; move16(); + set16_fx( gain_buf_fx, 0, NB_SUBFR16k ); - set16_fx( gain_buf, 0, NB_SUBFR16k ); - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) + IF( EQ_16( st->L_frame, L_FRAME ) ) { - st_fx->gamma = GAMMA1; + st->gamma = GAMMA1; move16(); - st_fx->preemph_fac = PREEMPH_FAC; + st->inv_gamma = GAMMA1_INV; move16(); - int_fs = INT_FS_FX; + st->preemph_fac = PREEMPH_FAC; + move16(); + int_fs = INT_FS_12k8; move16(); } ELSE { - st_fx->gamma = GAMMA16k; + st->gamma = GAMMA16k; + move16(); + st->inv_gamma = GAMMA16k_INV; move16(); - st_fx->preemph_fac = PREEMPH_FAC_16k; + st->preemph_fac = PREEMPH_FAC_16k; move16(); int_fs = INT_FS_16k; move16(); } - /* reset post-filter in case post-filtering was off in previous frame */ - IF( st_fx->hPFstat != NULL ) + test(); + /* reset post-filter in case of switching */ + if ( st->hPFstat != NULL && ( st->hPFstat->on == 0 ) ) { - if ( st_fx->hPFstat->on == 0 ) - { - st_fx->hPFstat->reset = 1; - move16(); - } + st->hPFstat->reset = 1; + move16(); } + avoid_lpc_burst_on_recovery = 0; move16(); test(); test(); - if ( st_fx->last_con_tcx && NE_16( st_fx->L_frameTCX_past, st_fx->L_frame ) && st_fx->last_core != 0 ) + if ( st->last_con_tcx && NE_16( st->L_frameTCX_past, st->L_frame ) && ( st->last_core != 0 ) ) { avoid_lpc_burst_on_recovery = 1; move16(); } - /* TD stereo parameters */ test(); - IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && st_fx->idchan == 1 ) + + /* TD stereo parameters */ + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( st->idchan, 1 ) ) { tdm_lp_reuse_flag = hStereoTD->tdm_lp_reuse_flag; - tdm_low_rate_mode = hStereoTD->tdm_low_rate_mode; - tdm_Pitch_reuse_flag = hStereoTD->tdm_Pitch_reuse_flag; - move16(); move16(); + tdm_low_rate_mode = hStereoTD->tdm_low_rate_mode; move16(); + tdm_Pitch_reuse_flag = hStereoTD->tdm_Pitch_reuse_flag; move16(); + p_tdm_Pri_pitch_buf_fx = hStereoTD->tdm_Pri_pitch_buf_fx; } ELSE { tdm_lp_reuse_flag = 0; - tdm_low_rate_mode = 0; move16(); + tdm_low_rate_mode = 0; move16(); test(); - if ( EQ_16( st_fx->element_mode, IVAS_SCE ) && st_fx->low_rate_mode ) + if ( EQ_16( st->element_mode, IVAS_SCE ) && st->low_rate_mode ) { tdm_low_rate_mode = 1; move16(); } tdm_Pitch_reuse_flag = 0; move16(); + p_tdm_Pri_pitch_buf_fx = NULL; } + /*----------------------------------------------------------------* * Updates in case of internal sampling rate switching *----------------------------------------------------------------*/ + test(); test(); - IF( NE_16( st_fx->last_L_frame, st_fx->L_frame ) && ( st_fx->last_core == ACELP_CORE || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) ) + IF( NE_16( st->last_L_frame, st->L_frame ) && ( st->last_core == ACELP_CORE || EQ_16( st->last_core, AMR_WB_CORE ) ) ) { - IF( st_fx->hPFstat->on != 0 ) + Word16 dec; + + IF( ( st->hPFstat->on != 0 ) ) { Word16 mem_syn_r_size_old, mem_syn_r_size_new; - - mem_syn_r_size_old = shr( st_fx->last_L_frame, 4 ); - mem_syn_r_size_new = shr( st_fx->L_frame, 4 ); - lerp( st_fx->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st_fx->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); - lerp( st_fx->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st_fx->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + mem_syn_r_size_old = mult_r( 2048, st->last_L_frame ); /* 1.25/20.f = 2048 (Q15)*/ + mem_syn_r_size_new = mult_r( 2048, st->L_frame ); /* 1.25/20.f = 2048 (Q15)*/ + lerp( st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); } + /* convert quantized LSP vector */ - st_fx->rate_switching_reset = lsp_convert_poly_fx( st_fx->lsp_old_fx, st_fx->L_frame, 0 ); + st->rate_switching_reset = lsp_convert_poly_fx( st->lsp_old_fx, st->L_frame, 0 ); move16(); + /* convert old quantized LSF vector */ - lsp2lsf_fx( st_fx->lsp_old_fx, st_fx->lsf_old_fx, M, int_fs ); + lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, int_fs ); /* FEC - update adaptive LSF mean vector */ - Copy( st_fx->lsf_old_fx, st_fx->lsfoldbfi1_fx, M ); // Qlog2(2.56) - Copy( st_fx->lsf_old_fx, st_fx->lsfoldbfi0_fx, M ); // Qlog2(2.56) - Copy( st_fx->lsf_old_fx, st_fx->lsf_adaptive_mean_fx, M ); // Qlog2(2.56) + Copy( st->lsf_old_fx, st->lsfoldbfi1_fx, M ); /*Qlog2(2.56)*/ + Copy( st->lsf_old_fx, st->lsfoldbfi0_fx, M ); /*Qlog2(2.56)*/ + Copy( st->lsf_old_fx, st->lsf_adaptive_mean_fx, M ); /*Qlog2(2.56)*/ /* Reset LPC mem */ - IF( EQ_32( st_fx->sr_core, INT_FS_16k ) ) + IF( EQ_32( st->sr_core, INT_FS_16k ) ) { - Copy( GEWB2_Ave_fx, st_fx->mem_AR_fx, M ); // Qlog2(2.56) + Copy( GEWB2_Ave_fx, st->mem_AR_fx, M ); /*Qlog2(2.56)*/ } ELSE { - Copy( GEWB_Ave_fx, st_fx->mem_AR_fx, M ); // Qlog2(2.56) + Copy( GEWB_Ave_fx, st->mem_AR_fx, M ); /*Qlog2(2.56)*/ } - set16_fx( st_fx->mem_MA_fx, 0, M ); + set16_fx( st->mem_MA_fx, 0, M ); + /* update synthesis filter memories */ dec = DEC; move16(); - IF( NE_16( st_fx->element_mode, EVS_MONO ) ) + if ( st->element_mode != EVS_MONO ) { dec = DEC_IVAS; move16(); } - - /* update synthesis filter memories */ - synth_mem_updt2( st_fx->L_frame, st_fx->last_L_frame, st_fx->old_exc_fx, st_fx->mem_syn_r, st_fx->mem_syn2_fx, NULL, dec ); - - Copy( st_fx->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); // Q_exc - Copy_Scale_sig( st_fx->mem_syn2_fx, st_fx->mem_syn1_fx, M, sub( -1, st_fx->Q_syn ) ); /*Q-1*/ - - Copy( st_fx->mem_syn2_fx, st_fx->mem_syn3_fx, M ); + ivas_synth_mem_updt2_fx( st->L_frame, st->last_L_frame, st->old_exc_fx, st->mem_syn_r, st->mem_syn2_fx, NULL, dec ); + Copy( st->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); /*Q_exc*/ + Copy_Scale_sig( st->mem_syn2_fx, st->mem_syn1_fx, M, sub( -1, st->Q_syn ) ); /*Q-1*/ + Copy( st->mem_syn2_fx, st->mem_syn3_fx, M ); /*Q_syn*/ } - IF( NE_16( st_fx->last_L_frame, st_fx->L_frame ) ) + /* update buffer of old subframe pitch values */ + IF( NE_16( st->last_L_frame, st->L_frame ) ) { - /* update buffer of old subframe pitch values */ - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) + IF( EQ_16( st->L_frame, L_FRAME ) ) { - - IF( EQ_16( st_fx->last_L_frame, L_FRAME32k ) ) + IF( EQ_16( st->last_L_frame, L_FRAME32k ) ) { - /* (float)12800/(float)32000; */ - k = 13107; // Q15 + tmpF_fx = 13107; // Q15 move16(); } - ELSE IF( EQ_16( st_fx->last_L_frame, 512 ) ) + ELSE IF( EQ_16( st->last_L_frame, 512 ) ) { - /* (float)12800/(float)25600; */ - k = 16384; // Q15 + tmpF_fx = 16384; // Q15 move16(); } ELSE /* st->last_L_frame == L_FRAME16k */ { - /* (float)12800/(float)16000; */ - k = 26214; // Q15 + tmpF_fx = 26214; // Q15 move16(); } FOR( i = NB_SUBFR16k - NB_SUBFR; i < NB_SUBFR16k; i++ ) { - st_fx->old_pitch_buf_fx[i - 1] = Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], k ); // Q(15+15+1-16) + st->old_pitch_buf_fx[i - 1] = Mpy_32_16_1( st->old_pitch_buf_fx[i], tmpF_fx ); // Q16 move32(); } FOR( i = 2 * NB_SUBFR16k - NB_SUBFR; i < 2 * NB_SUBFR16k; i++ ) { - st_fx->old_pitch_buf_fx[i - 2] = Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], k ); // Q15 + st->old_pitch_buf_fx[i - 2] = Mpy_32_16_1( st->old_pitch_buf_fx[i], tmpF_fx ); // Q16 move32(); } } ELSE { - - IF( EQ_16( st_fx->last_L_frame, L_FRAME32k ) ) + exp = 0; + move16(); + IF( EQ_16( st->last_L_frame, L_FRAME32k ) ) { - /* (float)16000/(float)32000; */ - k = -16384; // -0.5 in Q15 + tmpF_fx = 16384; // Q15 move16(); } - ELSE IF( EQ_16( st_fx->last_L_frame, 512 ) ) + ELSE IF( EQ_16( st->last_L_frame, 512 ) ) { - /* tmpF = (float)16000/(float)25600; */ - k = -12288; //-0.375 in Q15 + tmpF_fx = 20480; // Q15 move16(); } ELSE /* st->last_L_frame == L_FRAME12k8 */ { - /* tmpF = (float)16000/(float)12800; */ - k = 8192; //.25 in Q15 + tmpF_fx = 20480; // Q14 + move16(); + exp = 1; move16(); } - FOR( i = 2 * NB_SUBFR - 1; i >= NB_SUBFR; i-- ) { - st_fx->old_pitch_buf_fx[i + 2] = L_add( st_fx->old_pitch_buf_fx[i], Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], k ) ); // Q15 + st->old_pitch_buf_fx[i + 2] = Mpy_32_16_1( L_shl( st->old_pitch_buf_fx[i], exp ), tmpF_fx ); // Q15 move32(); } - st_fx->old_pitch_buf_fx[NB_SUBFR + 1] = st_fx->old_pitch_buf_fx[NB_SUBFR + 2]; + st->old_pitch_buf_fx[NB_SUBFR + 1] = st->old_pitch_buf_fx[NB_SUBFR + 2]; move32(); FOR( i = NB_SUBFR - 1; i >= 0; i-- ) { - st_fx->old_pitch_buf_fx[i + 1] = L_add( st_fx->old_pitch_buf_fx[i], Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], k ) ); // Q15 + st->old_pitch_buf_fx[i + 1] = Mpy_32_16_1( L_shl( st->old_pitch_buf_fx[i], exp ), tmpF_fx ); // Q15 move32(); } - st_fx->old_pitch_buf_fx[0] = st_fx->old_pitch_buf_fx[1]; + st->old_pitch_buf_fx[0] = st->old_pitch_buf_fx[1]; move32(); } } - IF( NE_16( st_fx->bfi_pitch_frame, st_fx->L_frame ) ) + IF( NE_16( st->bfi_pitch_frame, st->L_frame ) ) { - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) + IF( EQ_16( st->L_frame, L_FRAME ) ) { - - IF( EQ_16( st_fx->bfi_pitch_frame, L_FRAME32k ) ) + IF( EQ_16( st->bfi_pitch_frame, L_FRAME32k ) ) { - /* (float)12800/(float)32000; */ - k = 13107; // Q15 + tmpF_fx = 13107; // Q15 move16(); } - ELSE IF( EQ_16( st_fx->bfi_pitch_frame, 512 ) ) + ELSE IF( EQ_16( st->bfi_pitch_frame, 512 ) ) { - /* (float)12800/(float)25600; */ - k = 16384; // Q15 + tmpF_fx = 16384; // Q15 move16(); } ELSE /* st->bfi_pitch_frame == L_FRAME16k */ { - /* (float)12800/(float)16000; */ - k = 26214; // Q15 + tmpF_fx = 26214; // Q15 move16(); } - st_fx->bfi_pitch_fx = mult_r( k, st_fx->bfi_pitch_fx ); + st->bfi_pitch_fx = mult_r( st->bfi_pitch_fx, tmpF_fx ); move16(); - st_fx->bfi_pitch_frame = L_FRAME; + st->bfi_pitch_frame = L_FRAME; move16(); } ELSE { - - IF( EQ_16( st_fx->bfi_pitch_frame, L_FRAME32k ) ) + exp = 0; + move16(); + IF( EQ_16( st->bfi_pitch_frame, L_FRAME32k ) ) { - /* (float)16000/(float)32000; */ - k = -16384; //-0.5 in Q15 + tmpF_fx = 16384; // Q15 move16(); } - ELSE IF( EQ_16( st_fx->bfi_pitch_frame, 512 ) ) + ELSE IF( EQ_16( st->bfi_pitch_frame, 512 ) ) { - /* tmpF = (float)16000/(float)25600; */ - k = -12288; // -0.375 in Q15 + tmpF_fx = 20480; // Q15 move16(); } ELSE /* st->bfi_pitch_frame == L_FRAME12k8 */ { - /* tmpF = (float)16000/(float)12800; */ - k = 8192; // .25 in Q15 + tmpF_fx = 20480; // Q14 + move16(); + exp = 1; move16(); } - st_fx->bfi_pitch_fx = add( st_fx->bfi_pitch_fx, mult_r( st_fx->bfi_pitch_fx, k ) ); + + st->bfi_pitch_fx = mult_r( shl_sat( st->bfi_pitch_fx, exp ), tmpF_fx ); move16(); - st_fx->bfi_pitch_frame = L_FRAME16k; + st->bfi_pitch_frame = L_FRAME16k; move16(); } } test(); test(); - if ( EQ_16( st_fx->last_bwidth, NB ) && NE_16( st_fx->bwidth, NB ) && st_fx->ini_frame != 0 ) + if ( EQ_16( st->last_bwidth, NB ) && NE_16( st->bwidth, NB ) && ( st->ini_frame != 0 ) ) { - st_fx->rate_switching_reset = 1; + st->rate_switching_reset = 1; move16(); } @@ -510,36 +593,35 @@ ivas_error acelp_core_dec_fx( * GOOD frame *----------------------------------------------------------------------*/ - IF( !st_fx->bfi ) + IF( !st->bfi ) { /*----------------------------------------------------------------* * Decoding of TC subframe classification *----------------------------------------------------------------*/ - tc_subfr_fx = -1; + tc_subfr = -1; move16(); - IF( EQ_16( st_fx->coder_type, TRANSITION ) ) + IF( EQ_16( st->coder_type, TRANSITION ) ) { - tc_subfr_fx = tc_classif_fx( st_fx, st_fx->L_frame ); + tc_subfr = tc_classif_fx( st, st->L_frame ); } /*----------------------------------------------------------------* * Decoding of GSC IVAS mode *----------------------------------------------------------------*/ - st_fx->GSC_IVAS_mode = 0; - move16(); + test(); test(); test(); test(); - IF( ( st_fx->element_mode > EVS_MONO ) && st_fx->idchan == 0 && !( ( st_fx->core_brate == FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) && !tdm_low_rate_mode ) + IF( st->element_mode > EVS_MONO && st->idchan == 0 && !( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) && !tdm_low_rate_mode ) { test(); test(); - IF( EQ_16( st_fx->coder_type, AUDIO ) || ( ( st_fx->coder_type == INACTIVE ) && LE_32( st_fx->total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) + IF( EQ_16( st->coder_type, AUDIO ) || ( EQ_16( st->coder_type, INACTIVE ) && EQ_16( st->inactive_coder_type_flag, 1 ) ) ) { - st_fx->GSC_IVAS_mode = get_next_indice( st_fx, 2 ); + st->GSC_IVAS_mode = get_next_indice_fx( st, 2 ); move16(); } } @@ -547,88 +629,215 @@ ivas_error acelp_core_dec_fx( /*----------------------------------------------------------------* * Decoding of inactive CNG frames *----------------------------------------------------------------*/ + test(); - IF( st_fx->core_brate == FRAME_NO_DATA || EQ_32( st_fx->core_brate, SID_2k40 ) ) + IF( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) { /* decode CNG parameters */ - IF( st_fx->cng_type == LP_CNG ) + IF( st->cng_type == LP_CNG ) { - - CNG_dec_fx( st_fx, EVS_MONO, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step_fx, sid_bw, q_env ); + CNG_dec_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); + Copy( Aq_fx, st->Aq_cng, add( M, 1 ) ); /* comfort noise generation */ - CNG_exc_fx( st_fx->core_brate, st_fx->L_frame, &st_fx->hTdCngDec->Enew_fx, &st_fx->hTdCngDec->cng_seed, exc_fx, exc2_fx, &st_fx->lp_ener_fx, st_fx->last_core_brate, - &st_fx->first_CNG, &( st_fx->hTdCngDec->cng_ener_seed ), bwe_exc_fx, allow_cn_step_fx, &st_fx->hTdCngDec->last_allow_cn_step, st_fx->prev_Q_exc, st_fx->Q_exc, st_fx->hTdCngDec->num_ho, - q_env, st_fx->hTdCngDec->lp_env_fx, st_fx->hTdCngDec->old_env_fx, st_fx->hTdCngDec->exc_mem_fx, st_fx->hTdCngDec->exc_mem1_fx, sid_bw, &st_fx->hTdCngDec->cng_ener_seed1, exc3_fx, st_fx->Opt_AMR_WB, st_fx->element_mode ); + local_element_mode = st->element_mode; + move16(); - Copy( Aq_fx, st_fx->Aq_cng, M + 1 ); // Q12 + test(); + test(); + if ( ( EQ_16( nchan_out, 1 ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) ) || EQ_16( st->masa_sid_format, 1 ) ) + { + local_element_mode = IVAS_SCE; /* For DFT Stereo mono decoding, run CNG_exc as in SCE */ + move16(); + } + CNG_exc_fx( st->core_brate, st->L_frame, &st->hTdCngDec->Enew_fx, &st->hTdCngDec->cng_seed, exc_fx, exc2_fx, &st->lp_ener_fx, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), bwe_exc_fx, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->prev_Q_exc, st->Q_exc, st->hTdCngDec->num_ho, q_env_fx, st->hTdCngDec->lp_env_fx, st->hTdCngDec->old_env_fx, st->hTdCngDec->exc_mem_fx, st->hTdCngDec->exc_mem1_fx, sid_bw, &st->hTdCngDec->cng_ener_seed1, exc3_fx, st->Opt_AMR_WB, local_element_mode ); } ELSE { test(); - IF( EQ_32( st_fx->core_brate, SID_2k40 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( EQ_32( st->core_brate, SID_2k40 ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - FdCng_decodeSID_fx( st_fx->hFdCngDec->hFdCngCom, st_fx ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + FdCng_decodeSID_fx( st->hFdCngDec->hFdCngCom, st ); + } + ELSE + { + Word16 old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; + move16(); + + FdCng_decodeSID_ivas_fx( st ); + + Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( old_NoiseEstExp, st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ); + Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, M + 1, sub( norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] ), Q2 ) ); // Qx + } + *sid_bw = 0; move16(); } - generate_comfort_noise_dec_fx( NULL, NULL, NULL, st_fx, &( st_fx->Q_exc ), 2, -1 ); + IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) + { + assert( nchan_out == 1 ); + + FOR( i = 0; i < NPART; i++ ) + { + st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = Madd_32_32( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), + STEREO_DFT_FD_FILT_COMP_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEst[i] ); + move32(); + } + + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + + Word16 new_sidNoiseEstExp = 31 - Q4; + move16(); + Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, new_sidNoiseEstExp ) ); // Q(31-sidNoiseEstExp) + Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, new_sidNoiseEstExp ) ); // Q(31-sidNoiseEstExp) + st->hFdCngDec->hFdCngCom->sidNoiseEstExp = new_sidNoiseEstExp; + move16(); + Word16 new_cngNoiseLevelExp = 31 - Q4; + move16(); + Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, sub( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, new_cngNoiseLevelExp ) ); // Q(31-cngNoiseLevelExp) + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = new_cngNoiseLevelExp; + move16(); + + test(); + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) ); + + IF( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0 ) + { + Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ); // Q(31-cngNoiseLevelExp) + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; + move16(); + } + } + + IF( !read_sid_info ) + { + Word32 noise_lvl_highest_fx; + + noise_lvl_highest_fx = st->hFdCngDec->hFdCngCom->cngNoiseLevel[( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ) - 1]; + move32(); + + FOR( Word16 b = ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); b < st->hFdCngDec->hFdCngCom->stopBand; b++ ) + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel[b] = noise_lvl_highest_fx; + move32(); + } + } + + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + generate_comfort_noise_dec_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 2, -1 ); + } + ELSE + { + generate_comfort_noise_dec_ivas_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 1, nchan_out ); + } - FdCng_exc( st_fx->hFdCngDec->hFdCngCom, &st_fx->CNG_mode, st_fx->L_frame, st_fx->lsp_old_fx, st_fx->first_CNG, st_fx->lspCNG_fx, Aq_fx, lsp_new_fx, lsf_new_fx, exc_fx, exc2_fx, bwe_exc_fx ); + FdCng_exc( st->hFdCngDec->hFdCngCom, &st->CNG_mode, st->L_frame, st->lsp_old_fx, st->first_CNG, st->lspCNG_fx, Aq_fx, lsp_new_fx, lsf_new_fx, exc_fx, exc2_fx, bwe_exc_fx ); - Copy( exc2_fx, exc3_fx, st_fx->L_frame ); + Copy( exc2_fx, exc3_fx, st->L_frame ); } - delta_mem_scale = 3; + Word16 delta_mem_scale = 3; move16(); test(); - if ( LT_32( st_fx->lp_ener_fx, 40 ) && ( st_fx->cng_type == LP_CNG ) ) /* very low energy frames, less than 0.3125 */ + if ( LT_32( st->lp_ener_fx, 40 ) && st->cng_type == LP_CNG ) /* very low energy frames, less than 0.3125 */ { delta_mem_scale = 0; move16(); } - i = st_fx->Q_exc; + i = st->Q_exc; move16(); - Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, - st_fx->L_frame * HIBND_ACB_L_FAC, 0, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, 0, INACTIVE ); - Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, delta_mem_scale, - &st_fx->mem_deemph_fx, hBPF->pst_old_syn_fx, &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, 0, 0, NULL ); - Copy_Scale_sig( exc2_fx, exc2_fx, st_fx->L_frame, sub( st_fx->Q_exc, i ) ); // Q_exc + + test(); + IF( st->hMusicPF && st->hGSCDec ) + { + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + // VE: TBV: should 'st_fx->L_frame * HIBND_ACB_L_FAC' be corrected in EVS? + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, + st->L_frame * HIBND_ACB_L_FAC, 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); + } + ELSE + { + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, + L_FRAME32k, 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); + } + } + + IF( st->hPFstat != NULL ) + { + Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, delta_mem_scale, + &st->mem_deemph_fx, st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, 0, 0, NULL ); + } + ELSE + { + Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, delta_mem_scale, + &st->mem_deemph_fx, NULL, NULL, &st->agc_mem_fx[1], NULL, 0, 0, NULL ); + } + + Copy_Scale_sig( exc2_fx, exc2_fx, st->L_frame, sub( st->Q_exc, i ) ); // Q_exc /* update past excitation signals for LD music post-filter */ - IF( hMusicPF != NULL ) + IF( st->hMusicPF != NULL ) { - Copy( hMusicPF->dct_post_old_exc_fx + L_FRAME, hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); + Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + /* Update music post processing values */ /* Filter energies update */ - FOR( i = 0; i < DCT_L_POST; i++ ) + IF( EQ_16( st->element_mode, EVS_MONO ) ) { - /*st_fx->filt_lfE_fx[i] = 0.3f + 0.7f * st_fx->filt_lfE_fx[i];*/ - hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, hMusicPF->filt_lfE_fx[i] ) ); - move16(); + FOR( i = 0; i < DCT_L_POST; i++ ) + { + st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, st->hMusicPF->filt_lfE_fx[i] ) ); + move16(); + } + } + ELSE + { + FOR( i = 0; i < DCT_L_POST; i++ ) + { + st->hMusicPF->filt_lfE_fx[i] = add( 9830, mult_r( 22937, st->hMusicPF->filt_lfE_fx[i] ) ); // Q15, 9830 =.3f in Q15, 22937=.7f in Q15 + move16(); + } } } + /* synthesis at 12.8kHz sampling rate */ - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc2_fx, syn_fx, st_fx->mem_syn2_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc3_fx, syn1_fx, st_fx->mem_syn3_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); + move16(); + syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); + syn_12k8_fx( st->L_frame, Aq_fx, exc3_fx, syn1_fx, st->mem_syn3_fx, 1, st->Q_exc, st->Q_syn ); /* reset the decoder */ - CNG_reset_dec_fx( st_fx, pitch_buf_fx, voice_factors ); + CNG_reset_dec_fx( st, pitch_buf_fx, voice_factors_fx ); + + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + /* update st_fx->mem_syn1 for ACELP core switching */ + Copy( st->mem_syn3_fx, st->mem_syn1_fx, M ); + } + ELSE + { + st->Q_syn_cng = st->Q_syn; + move16(); + st->Q_exc_cng = st->Q_exc; + move16(); - /* update st_fx->mem_syn1 for ACELP core switching */ - Copy( st_fx->mem_syn3_fx, st_fx->mem_syn1_fx, M ); + /* update st->mem_syn1 for ACELP core switching */ + Copy_Scale_sig( st->mem_syn3_fx, st->mem_syn1_fx, M, sub( -1, st->Q_syn ) ); // Q(-1) + } /* update old synthesis for classification */ - Copy( syn1_fx + st_fx->L_frame - L_SYN_MEM_CLAS_ESTIM, st_fx->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); - + Copy( syn1_fx + st->L_frame - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); /* save and delay synthesis to be used by SWB BWE */ - Copy_Scale_sig( syn1_fx, temp_buf_fx, st_fx->L_frame, sub( -1, st_fx->Q_syn ) ); // Q_syn -> Q(-1) - IF( hBWE_FD != NULL ) + Copy_Scale_sig( syn1_fx, temp_buf_fx, st->L_frame, sub( -1, st->Q_syn ) ); // Q_syn -> Q(-1) + IF( st->hBWE_FD != NULL ) { - save_old_syn_fx( st_fx->L_frame, temp_buf_fx, old_syn_12k8_16k, hBWE_FD->old_syn_12k8_16k_fx, st_fx->preemph_fac, &hBWE_FD->mem_deemph_old_syn_fx ); + save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); } } @@ -638,21 +847,24 @@ ivas_error acelp_core_dec_fx( ELSE { + /*-----------------------------------------------------------------* * Configure ACELP bit allocation *-----------------------------------------------------------------*/ + nb_bits = 0; - st_fx->acelp_cfg.FEC_mode = 0; - uc_two_stage_flag = 0; move16(); + st->acelp_cfg.FEC_mode = 0; move16(); + uc_two_stage_flag = 0; move16(); + test(); - IF( !st_fx->nelp_mode_dec && !st_fx->ppp_mode_dec ) + IF( !st->nelp_mode_dec && !st->ppp_mode_dec ) { Word16 tc_subfr_tmp; - tc_subfr_tmp = tc_subfr_fx; + tc_subfr_tmp = tc_subfr; move16(); if ( LT_16( tc_subfr_tmp, L_SUBFR ) ) { @@ -660,27 +872,19 @@ ivas_error acelp_core_dec_fx( move16(); } - if ( EQ_16( tc_subfr_fx, TC_0_192 ) ) + if ( EQ_16( tc_subfr, TC_0_192 ) ) { nb_bits = -1; move16(); } -#ifdef NONBE_FIX_GSC_BSTR - config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, tc_subfr_tmp, 1, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#else - config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#endif + config_acelp1_fx( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, st->inactive_coder_type_flag, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); test(); test(); - IF( EQ_16( st_fx->coder_type, TRANSITION ) && LT_16( tc_subfr_fx, L_SUBFR ) && EQ_16( st_fx->L_frame, L_FRAME ) ) + IF( EQ_16( st->coder_type, TRANSITION ) && LT_16( tc_subfr, L_SUBFR ) && EQ_16( st->L_frame, L_FRAME ) ) { -#ifdef NONBE_FIX_GSC_BSTR - config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, TRANSITION, -1, tc_subfr_fx, 2, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#else - config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, tc_subfr_fx, 2, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#endif + config_acelp1_fx( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, TRANSITION, -1, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); } } @@ -690,51 +894,117 @@ ivas_error acelp_core_dec_fx( test(); test(); - IF( st_fx->hTdCngDec != NULL && ( st_fx->last_core_brate == FRAME_NO_DATA || EQ_32( st_fx->last_core_brate, SID_2k40 ) ) ) + IF( st->hTdCngDec != NULL && ( st->last_core_brate == FRAME_NO_DATA || EQ_32( st->last_core_brate, SID_2k40 ) ) ) { - Copy( st_fx->lspCNG_fx, st_fx->lsp_old_fx, M ); // Q15 - - lsp2lsf_fx( st_fx->lspCNG_fx, st_fx->lsf_old_fx, M, int_fs ); + Copy( st->lspCNG_fx, st->lsp_old_fx, M ); /*Q15*/ + lsp2lsf_fx( st->lspCNG_fx, st->lsf_old_fx, M, int_fs ); } /*-----------------------------------------------------------------* * Reset higher ACELP pre-quantizer in case of switching *-----------------------------------------------------------------*/ - IF( !st_fx->use_acelp_preq ) + IF( !st->use_acelp_preq ) { - st_fx->mem_preemp_preQ_fx = 0; + st->mem_preemp_preQ_fx = 0; move16(); - st_fx->last_nq_preQ = 0; + st->last_nq_preQ = 0; + move16(); + st->last_code_preq = 0; move16(); } - st_fx->use_acelp_preq = 0; + st->use_acelp_preq = 0; move16(); /*-----------------------------------------------------------------* * LSF de-quantization and interpolation *-----------------------------------------------------------------*/ - lsf_dec_fx( st_fx, tc_subfr_fx, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode, - tdm_lsfQ_PCh ); + IF( !tdm_lp_reuse_flag ) + { + lsf_dec_fx( st, tc_subfr, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode, tdm_lsfQ_PCh_fx ); + } + ELSE + { + const Word16 *pt_interp_2_fx; + Word16 beta_index; + + beta_index = get_next_indice_fx( st, TDM_IC_LSF_PRED_BITS ); + tdm_SCh_lsf_reuse_fx( DEC, st->element_brate, lsf_new_fx, lsp_new_fx, tdm_lsfQ_PCh_fx, NULL, &beta_index ); + + IF( st->rate_switching_reset ) + { + /* extrapolation in case of unstable LSF convert */ + Copy( lsp_new_fx, st->lsp_old_fx, M ); + Copy( lsf_new_fx, st->lsf_old_fx, M ); + } + + pt_interp_2_fx = interpol_frac_fx; + test(); + if ( EQ_16( tdm_low_rate_mode, 1 ) && GT_16( st->coder_type, UNVOICED ) ) + { + pt_interp_2_fx = interpol_frac2_fx; + } + + IF( EQ_16( st->active_cnt, 1 ) ) + { + Copy( lsp_new_fx, st->lsp_old_fx, M ); + lsp2lsf_fx( lsp_new_fx, st->lsf_old_fx, M, st->sr_core ); + } + + /* LSP interpolation and conversion of LSPs to A(z) */ + int_lsp_fx( st->L_frame, st->lsp_old_fx, lsp_new_fx, Aq_fx, M, pt_interp_2_fx, 0 ); + + /* Check LSF stability (distance between old LSFs and current LSFs) */ + st->stab_fac_fx = lsf_stab_ivas_fx( lsf_new_fx, st->lsf_old_fx, 0, st->L_frame ); + move16(); + } + + test(); + IF( EQ_16( st->last_core, HQ_CORE ) && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory from last HQ frame */ + old_exc_s_fx = st->old_exc_fx + sub( L_EXC_MEM_DEC, st->L_frame ); + tmpF_fx = *old_exc_s_fx; + st->mem_deemph_fx = shl_sat( old_exc_s_fx[st->L_frame - 1], st->Q_syn ); /* Q0 -> Q_syn */ + move16(); + PREEMPH_FX( old_exc_s_fx, st->preemph_fac, st->L_frame, &tmpF_fx ); + Copy( old_exc_s_fx + sub( st->L_frame, M ), st->mem_syn2_fx, M ); + Scale_sig( st->mem_syn2_fx, M, st->Q_syn ); /* Q0 -> Q_syn */ + Residu3_fx( Aq_fx, old_exc_s_fx, old_exc_fx + sub( L_EXC_MEM_DEC, st->L_frame ), st->L_frame, 0 ); + Scale_sig( old_exc_fx + sub( L_EXC_MEM_DEC, st->L_frame ), st->L_frame, st->Q_exc ); /* Q0 -> Q_exc */ + } + + test(); + IF( st->last_core != ACELP_CORE && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory of old_bwe_exc */ + IF( EQ_16( st->L_frame, L_FRAME ) ) + { + lerp( old_exc_fx, old_bwe_exc_fx, L_EXC_MEM_DEC * HIBND_ACB_L_FAC, L_EXC_MEM_DEC ); + } + ELSE + { + lerp( old_exc_fx, old_bwe_exc_fx, L_EXC_MEM_DEC << 1, L_EXC_MEM_DEC ); + } + } /*-----------------------------------------------------------------* * FEC - first good frame after lost frame(s) (possibility to correct the ACB) *-----------------------------------------------------------------*/ - IF( st_fx->acelp_cfg.FEC_mode > 0 ) + IF( st->acelp_cfg.FEC_mode > 0 ) { last_pulse_pos = 0; move16(); /* decode the last glottal pulse position */ - T0_tmp = FEC_pos_dec_fx( st_fx, &last_pulse_pos, &enr_q_fx, nb_bits ); - + T0_tmp = FEC_pos_dec_fx( st, &last_pulse_pos, &enr_q_fx, nb_bits ); test(); test(); - IF( NE_16( st_fx->last_core, HQ_CORE ) || ( EQ_16( st_fx->last_core, HQ_CORE ) && st_fx->last_con_tcx ) ) + IF( NE_16( st->last_core, HQ_CORE ) || ( EQ_16( st->last_core, HQ_CORE ) && st->last_con_tcx ) ) { test(); test(); @@ -742,16 +1012,13 @@ ivas_error acelp_core_dec_fx( test(); test(); test(); - test(); - IF( EQ_16( st_fx->clas_dec, SIN_ONSET ) && last_pulse_pos != 0 && EQ_16( st_fx->prev_bfi, 1 ) ) + IF( EQ_16( st->clas_dec, SIN_ONSET ) && last_pulse_pos != 0 && EQ_16( st->prev_bfi, 1 ) ) { - st_fx->Q_exc = - FEC_SinOnset_fx( old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, last_pulse_pos, T0_tmp, enr_q_fx, Aq_fx, st_fx->L_frame, st_fx->Q_exc ); - move16(); + FEC_SinOnset_fx( old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, last_pulse_pos, T0_tmp, enr_q_fx, Aq_fx, st->L_frame, st->Q_exc ); } - ELSE IF( ( EQ_16( st_fx->coder_type, GENERIC ) || EQ_16( st_fx->coder_type, VOICED ) ) && last_pulse_pos != 0 && EQ_16( st_fx->old_bfi_cnt, 1 ) && EQ_16( output_frame, L_FRAME16k ) && st_fx->hWIDec != NULL ) + ELSE IF( ( EQ_16( st->coder_type, GENERIC ) || EQ_16( st->coder_type, VOICED ) ) && last_pulse_pos != 0 && EQ_16( st->old_bfi_cnt, 1 ) && st->hWIDec != NULL ) { - do_WI_fx = FEC_enhACB_fx( st_fx->L_frame, st_fx->last_L_frame, old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, T0_tmp, last_pulse_pos, st_fx->bfi_pitch_fx ); + do_WI = FEC_enhACB_fx( st->L_frame, st->last_L_frame, old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, T0_tmp, last_pulse_pos, st->bfi_pitch_fx ); } } } @@ -760,16 +1027,16 @@ ivas_error acelp_core_dec_fx( * In case of first frame after an erasure and transition from voiced to unvoiced or inactive * redo the LPC interpolation *------------------------------------------------------------*/ + test(); test(); test(); test(); test(); test(); - IF( st_fx->stab_fac_fx == 0 && st_fx->old_bfi_cnt > 0 && NE_16( st_fx->clas_dec, VOICED_CLAS ) && NE_16( st_fx->clas_dec, ONSET ) && - st_fx->relax_prev_lsf_interp == 0 && !( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && EQ_16( st_fx->idchan, 1 ) ) ) + IF( ( st->stab_fac_fx == 0 ) && ( st->old_bfi_cnt > 0 ) && NE_16( st->clas_dec, VOICED_CLAS ) && NE_16( st->clas_dec, ONSET ) && ( st->relax_prev_lsf_interp == 0 ) && !( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( st->idchan, 1 ) ) ) { - int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); + int_lsp4_ivas_fx( st->L_frame, st->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); } /*---------------------------------------------------------------* @@ -778,7 +1045,7 @@ ivas_error acelp_core_dec_fx( IF( nb_bits > 0 ) { - indice = get_next_indice( st_fx, nb_bits ); + indice = get_next_indice_fx( st, nb_bits ); Es_pred_dec_fx( &Es_pred_fx, indice, nb_bits, uc_two_stage_flag ); } @@ -788,79 +1055,113 @@ ivas_error acelp_core_dec_fx( test(); test(); - IF( EQ_16( st_fx->nelp_mode_dec, 1 ) ) + IF( tdm_low_rate_mode ) /* tdm stereo low rate mode */ { - /* SC-VBR - NELP frames */ - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st_fx->Q_exc ) ); // Q0 - st_fx->Q_exc = 0; + IF( LE_16( st->coder_type, UNVOICED ) ) + { + tdm_low_rate_dec_fx( st, dct_exc_tmp_fx /*, &tmp_noise*/, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx ); + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ + } + ELSE /* GENERIC */ + { + decod_gen_2sbfr_fx( st, sharpFlag, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); + + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + { + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ + } + } + } + ELSE IF( st->nelp_mode_dec ) + { + Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); // Q0 + st->Q_exc = 0; move16(); - decod_nelp_fx( st_fx, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors, bwe_exc_fx, &st_fx->Q_exc, st_fx->bfi, gain_buf ); - Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st_fx->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, L_FRAME, st_fx->coder_type ); + /* SC-VBR - NELP frames */ + decod_nelp_fx( st, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors_fx, bwe_exc_fx, &st->Q_exc, st->bfi, gain_buf_fx ); + + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); } - ELSE IF( EQ_16( st_fx->coder_type, UNVOICED ) ) + ELSE IF( EQ_16( st->coder_type, UNVOICED ) ) { /* UNVOICED frames */ - decod_unvoiced_fx( st_fx, Aq_fx, st_fx->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, gain_buf ); + decod_unvoiced_fx( st, Aq_fx, Es_pred_fx, uc_two_stage_flag, st->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx ); + + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ } - ELSE IF( EQ_16( st_fx->ppp_mode_dec, 1 ) ) + ELSE IF( st->ppp_mode_dec ) { - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st_fx->Q_exc ) ); // Q0 - st_fx->Q_exc = 0; + Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); // Q0 + st->Q_exc = 0; move16(); + /* SC-VBR - PPP frames */ - IF( NE_32( ( error = decod_ppp_fx( st_fx, Aq_fx, pitch_buf_fx, exc_fx, exc2_fx, st_fx->bfi, gain_buf, voice_factors, bwe_exc_fx ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = decod_ppp_fx( st, Aq_fx, pitch_buf_fx, exc_fx, exc2_fx, st->bfi, gain_buf_fx, voice_factors_fx, bwe_exc_fx ) ), IVAS_ERR_OK ) ) { return error; } - Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st_fx->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, L_FRAME, st_fx->coder_type ); + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); } - ELSE IF( EQ_16( st_fx->coder_type, TRANSITION ) ) + ELSE IF( EQ_16( st->coder_type, TRANSITION ) ) { - decod_tran_fx( st_fx, st_fx->L_frame, tc_subfr_fx, Aq_fx, Es_pred_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, sharpFlag, gain_buf ); + decod_tran_fx( st, st->L_frame, tc_subfr, Aq_fx, Es_pred_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, sharpFlag, gain_buf_fx ); } - ELSE IF( EQ_16( st_fx->coder_type, AUDIO ) || ( ( st_fx->coder_type == INACTIVE ) && LE_32( st_fx->core_brate, MAX_GSC_INACTIVE_BRATE ) ) ) + ELSE IF( EQ_16( st->coder_type, AUDIO ) || ( ( st->coder_type == INACTIVE ) && st->inactive_coder_type_flag ) ) { - decod_audio_fx( st_fx, dct_exc_tmp, Aq_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf ); - tmp_noise_fx = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ + /* AUDIO and INACTIVE frames (coded by GSC technology) */ + decod_audio_fx( st, dct_exc_tmp_fx, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf_fx, + tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); + + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ } ELSE { - IF( NE_32( ( error = decod_gen_voic_fx( st_fx, st_fx->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf /*, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf*/ ) ), IVAS_ERR_OK ) ) + /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ + IF( NE_32( ( error = decod_gen_voic_fx( st, st->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ) ), IVAS_ERR_OK ) ) { return error; } - IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) { - tmp_noise_fx = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ } } /* synthesis for ACELP core switching and SWB BWE */ - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc_fx, temp_buf_fx, st_fx->mem_syn1_fx, 1, st_fx->Q_exc, -1 ); + syn_12k8_fx( st->L_frame, Aq_fx, exc_fx, temp_buf_fx, st->mem_syn1_fx, 1, st->Q_exc, -1 ); + /* save and delay synthesis to be used by SWB BWE */ - IF( hBWE_FD != NULL ) + IF( st->hBWE_FD != NULL ) { - save_old_syn_fx( st_fx->L_frame, temp_buf_fx, old_syn_12k8_16k, hBWE_FD->old_syn_12k8_16k_fx, st_fx->preemph_fac, &hBWE_FD->mem_deemph_old_syn_fx ); + save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); } /*-----------------------------------------------------------------* * Apply energy matching when switching to inactive frames *-----------------------------------------------------------------*/ - Inac_swtch_ematch_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode ); + Inac_switch_ematch_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); + /*------------------------------------------------------------* * Decode information and modify the excitation signal of stationary unvoiced frames *------------------------------------------------------------*/ + test(); test(); test(); test(); - IF( !( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) && NE_16( st_fx->nelp_mode_dec, 1 ) && !( EQ_16( st_fx->element_mode, IVAS_SCE ) && tdm_low_rate_mode ) ) + IF( !( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) ) && NE_16( st->nelp_mode_dec, 1 ) && !( EQ_16( st->element_mode, IVAS_SCE ) && tdm_low_rate_mode ) ) { - stat_noise_uv_dec_fx( st_fx, lsp_new_fx, lsp_mid_fx, Aq_fx, exc2_fx, uc_two_stage_flag ); + Word16 temp_q_exc = st->Q_exc; + move16(); + stat_noise_uv_dec_fx( st, lsp_new_fx, lsp_mid_fx, Aq_fx, exc2_fx, uc_two_stage_flag ); + IF( NE_16( temp_q_exc, st->Q_exc ) ) + { + scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM + st->L_frame, sub( st->Q_exc, temp_q_exc ) ); + } } /*------------------------------------------------------------* @@ -869,80 +1170,92 @@ ivas_error acelp_core_dec_fx( *------------------------------------------------------------*/ /* update past excitation signals for LD music post-filter */ - IF( hMusicPF != NULL ) + IF( st->hMusicPF != NULL ) { - Copy( hMusicPF->dct_post_old_exc_fx + L_FRAME, hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - Copy( hMusicPF->dct_post_old_exc_fx, exc_buffer_fx, DCT_L_POST - OFFSET2 ); + Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); + Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + Copy( st->hMusicPF->dct_post_old_exc_fx, exc_buffer_fx, DCT_L_POST - OFFSET2 ); } + test(); test(); test(); - test(); - IF( hMusicPF != NULL && ( ( EQ_16( st_fx->coder_type, AUDIO ) && st_fx->GSC_noisy_speech == 0 ) || ( GE_16( st_fx->GSC_IVAS_mode, 1 ) && EQ_16( st_fx->L_frame, L_FRAME ) ) ) ) + IF( ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) || ( GE_16( st->GSC_IVAS_mode, 1 ) && EQ_16( st->L_frame, L_FRAME ) ) ) { - - Word16 last_coder_type = st_fx->last_coder_type; + Word16 last_coder_type = st->last_coder_type; move16(); + test(); test(); test(); - if ( ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) || ( GE_16( st_fx->GSC_IVAS_mode, 1 ) && st_fx->GSC_noisy_speech == 0 ) ) + if ( ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) ) || ( GE_16( st->GSC_IVAS_mode, 1 ) && ( st->GSC_noisy_speech == 0 ) ) ) { last_coder_type = AUDIO; move16(); } - /* Extrapolation of the last future part, windowing and high resolution DCT transform */ - qdct = 0; + + Word16 qdct = 0; move16(); -#ifdef _DIFF_FLOAT_FIX_ /* FLoat point using last_core which fits with the inner part of the function */ - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, hMusicPF->filt_lfE_fx, st_fx->last_core, st_fx->element_mode, pitch_buf_fx, - hMusicPF->LDm_enh_lp_gbin_fx, st_fx->Q_exc, &qdct ); -#else - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, hMusicPF->filt_lfE_fx, st_fx->last_coder_type, st_fx->element_mode, pitch_buf_fx, - hMusicPF->LDm_enh_lp_gbin_fx, st_fx->Q_exc, &qdct ); -#endif + + /* Extrapolation of the last future part, windowing and high resolution DCT transform */ + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + // VE: TBV: this is likely a bug in EVS - 'st->last_coder_type' should be replaced by 'st->core_brate' + Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_coder_type, st->element_mode, pitch_buf_fx, + st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); + } + ELSE + { + Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_core, st->element_mode, pitch_buf_fx, st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); + } + /* LD music post-filter */ - LD_music_post_filter_fx( hMusicPF, dct_buffer_fx, dct_buffer_fx, st_fx->core_brate, - &hMusicPF->Old_ener_Q, AUDIO, last_coder_type, qdct ); + LD_music_post_filter_fx( st->hMusicPF, dct_buffer_fx, dct_buffer_fx, st->core_brate, &st->hMusicPF->Old_ener_Q, AUDIO, last_coder_type, qdct ); /* Inverse DCT transform, retrieval of the aligned excitation, re-synthesis */ - Post_music_postP_fx( dct_buffer_fx, exc2_fx, st_fx->mem_syn2_fx, st_fx->mem_syn2_fx, Aq_fx, syn_fx, &st_fx->Q_exc, &st_fx->prev_Q_syn, - &st_fx->Q_syn, st_fx->mem_syn_clas_estim_fx, 0, &st_fx->mem_deemph_fx, hBPF->pst_old_syn_fx, - &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, temp_buf_fx, mem_tmp_fx ); + IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBC whether needed in IVAS + { + Copy( st->mem_syn2_fx, mem_tmp_fx, M ); /*Q_syn*/ + } + + Post_music_postP_fx( dct_buffer_fx, exc2_fx, st->mem_syn2_fx, st->mem_syn2_fx, Aq_fx, psyn_fx, &st->Q_exc, &st->prev_Q_syn, + &st->Q_syn, st->mem_syn_clas_estim_fx, 0, &st->mem_deemph_fx, st->hBPF->pst_old_syn_fx, + &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, temp_buf_fx, mem_tmp_fx ); } ELSE { /* Core synthesis at 12.8kHz or 16kHz */ i = 1; move16(); - if ( st_fx->coder_type == INACTIVE ) + test(); + if ( st->coder_type == INACTIVE && st->element_mode == EVS_MONO ) { i = 0; move16(); } + /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ - k = 0; + Word16 k = 0; move16(); test(); test(); - if ( ( st_fx->coder_type == INACTIVE ) && st_fx->flag_cna && GE_16( round_fx( L_shl( st_fx->lp_noise, 1 ) ), 15 << 7 ) ) + if ( st->coder_type == INACTIVE && st->flag_cna && GE_16( round_fx( L_shl( st->lp_noise, 1 ) ), 15 << 7 ) ) { k = 1; move16(); } - Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, 4, &st_fx->mem_deemph_fx, - hBPF->pst_old_syn_fx, &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, i, k, temp_buf_fx ); - Copy( st_fx->mem_syn2_fx, mem_tmp_fx, M ); // Q_syn + Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, 4, &st->mem_deemph_fx, + st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, i, k, temp_buf_fx ); - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc2_fx, syn_fx, st_fx->mem_syn2_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); - IF( hMusicPF != NULL ) + Copy( st->mem_syn2_fx, mem_tmp_fx, M ); /*Q_syn*/ + syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); + + IF( st->hMusicPF != NULL ) { FOR( i = 0; i < DCT_L_POST; i++ ) { - /*st_fx->filt_lfE_fx[i] = 0.3f + 0.7f * st_fx->filt_lfE_fx[i];*/ - hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, hMusicPF->filt_lfE_fx[i] ) ); + st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, st->hMusicPF->filt_lfE_fx[i] ) ); move16(); } } @@ -952,43 +1265,35 @@ ivas_error acelp_core_dec_fx( * FEC - Estimate the classification information *------------------------------------------------------------*/ - FEC_clas_estim_fx( st_fx, st_fx->Opt_AMR_WB, st_fx->L_frame, &st_fx->clas_dec, st_fx->coder_type, pitch_buf_fx, - syn_fx, &st_fx->lp_ener_FER_fx, &st_fx->decision_hyst, - NULL, NULL, NULL, NULL, 0, NULL, st_fx->Q_syn, temp_buf_fx, - st_fx->mem_syn_clas_estim_fx, &st_fx->classifier_Q_mem_syn, - 0, 0, 0, st_fx->last_core_brate, st_fx->acelp_cfg.FEC_mode ); + FEC_clas_estim_fx( st, st->Opt_AMR_WB, st->L_frame, &st->clas_dec, st->coder_type, pitch_buf_fx, psyn_fx, &st->lp_ener_FER_fx, &st->decision_hyst, + NULL, NULL, NULL, NULL, 0, NULL, st->Q_syn, temp_buf_fx, st->mem_syn_clas_estim_fx, &st->classifier_Q_mem_syn, 0, 0, 0, st->last_core_brate, st->acelp_cfg.FEC_mode ); + /*------------------------------------------------------------* * FEC - Estimate pitch *------------------------------------------------------------*/ - FEC_pitch_estim_fx( st_fx->Opt_AMR_WB, st_fx->last_core, st_fx->L_frame, st_fx->clas_dec, st_fx->last_good, pitch_buf_fx, st_fx->old_pitch_buf_fx, - &st_fx->bfi_pitch_fx, &st_fx->bfi_pitch_frame, &st_fx->upd_cnt, st_fx->coder_type, st_fx->element_mode ); + FEC_pitch_estim_fx( st->Opt_AMR_WB, st->last_core, st->L_frame, st->clas_dec, st->last_good, pitch_buf_fx, st->old_pitch_buf_fx, + &st->bfi_pitch_fx, &st->bfi_pitch_frame, &st->upd_cnt, st->coder_type, st->element_mode ); /*------------------------------------------------------------* * FEC - Smooth the speech energy evolution when recovering after a BAD frame * (smoothing is performed in the excitation domain and signal is resynthesized after) *------------------------------------------------------------*/ - k = 0; - move16(); - FOR( i = 0; i < st_fx->L_frame; i += L_SUBFR ) - { - pitch_buf_tmp[k] = mult_r( pitch_buf_fx[k], 512 ); // Q0(6+9-15) , (512 = 1.0f in Q9) - move16(); - k = add( k, 1 ); - } + Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - FEC_scale_syn_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, - &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); + FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, + &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); test(); test(); test(); test(); - IF( ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && LE_32( st_fx->total_brate, ACELP_7k20 ) ) || ( EQ_32( st_fx->total_brate, ACELP_7k20 ) ) || ( EQ_32( st_fx->total_brate, ACELP_8k00 ) ) ) + /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ + IF( ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && LE_32( st->total_brate, ACELP_7k20 ) ) || EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) { - frame_ener_fx( st_fx->L_frame, st_fx->clas_dec, syn_fx, pitch_buf_tmp[sub( shr( st_fx->L_frame, 6 ), 1 )], &st_fx->enr_old_fx, st_fx->L_frame, st_fx->Q_syn, 3, 0 ); + frame_ener_fx( st->L_frame, st->clas_dec, psyn_fx, pitch_buf_tmp[( ( st->L_frame ) >> 6 ) - 1], &st->enr_old_fx, st->L_frame, st->Q_syn, 3, 0 ); } } @@ -997,206 +1302,188 @@ ivas_error acelp_core_dec_fx( /*----------------------------------------------------------------* * BAD frame *----------------------------------------------------------------*/ + ELSE { /* SC-VBR */ - if ( EQ_16( st_fx->last_nelp_mode_dec, 1 ) ) + if ( EQ_16( st->last_nelp_mode_dec, 1 ) ) { - st_fx->nelp_mode_dec = 1; + st->nelp_mode_dec = 1; move16(); } - /* long burst frame erasures */ test(); test(); - if ( GT_16( st_fx->nbLostCmpt, 5 ) && GE_16( st_fx->clas_dec, VOICED_CLAS ) && LT_16( st_fx->clas_dec, INACTIVE_CLAS ) ) + /* long burst frame erasures */ + if ( GT_16( st->nbLostCmpt, 5 ) && GE_16( st->clas_dec, VOICED_CLAS ) && LT_16( st->clas_dec, INACTIVE_CLAS ) ) { - st_fx->last_good = VOICED_TRANSITION; + st->last_good = VOICED_TRANSITION; move16(); } /* LSF estimation and A(z) calculation */ - lsf_dec_bfi( MODE1, lsf_new_fx, st_fx->lsf_old_fx, st_fx->lsf_adaptive_mean_fx, NULL, st_fx->mem_MA_fx, st_fx->mem_AR_fx, - st_fx->stab_fac_fx, st_fx->last_coder_type, st_fx->L_frame, st_fx->last_good, - st_fx->nbLostCmpt, 0, NULL, NULL, NULL, st_fx->hGSCDec->Last_GSC_pit_band_idx, st_fx->Opt_AMR_WB, 0, st_fx->bwidth ); + lsf_dec_bfi( MODE1, lsf_new_fx, st->lsf_old_fx, st->lsf_adaptive_mean_fx, NULL, st->mem_MA_fx, st->mem_AR_fx, st->stab_fac_fx, st->last_coder_type, st->L_frame, st->last_good, st->nbLostCmpt, 0, NULL, NULL, NULL, st->hGSCDec->Last_GSC_pit_band_idx, st->Opt_AMR_WB, 0, st->bwidth ); - FEC_lsf2lsp_interp( st_fx, st_fx->L_frame, Aq_fx, lsf_new_fx, lsp_new_fx ); - - IF( EQ_16( st_fx->nelp_mode_dec, 1 ) ) + FEC_lsf2lsp_interp( st, st->L_frame, Aq_fx, lsf_new_fx, lsp_new_fx ); + IF( EQ_16( st->nelp_mode_dec, 1 ) ) { /* SC-VBR */ - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st_fx->Q_exc ) ); // Q0 - st_fx->Q_exc = 0; + Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); // Q0 + st->Q_exc = 0; move16(); - decod_nelp_fx( st_fx, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors, bwe_exc_fx, &st_fx->Q_exc, st_fx->bfi, gain_buf ); + decod_nelp_fx( st, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors_fx, bwe_exc_fx, &st->Q_exc, st->bfi, gain_buf_fx ); FEC_pitch_fx = pitch_buf_fx[3]; move16(); - - Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st_fx->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, L_FRAME, st_fx->coder_type ); + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); } ELSE { /* calculation of excitation signal */ + FEC_exc_estim_fx( st, st->L_frame, exc_fx, exc2_fx, dct_exc_tmp_fx, pitch_buf_fx, voice_factors_fx, &FEC_pitch_fx, bwe_exc_fx, lsf_new_fx, &st->Q_exc, &tmp_noise_fx ); - FEC_exc_estim_fx( st_fx, st_fx->L_frame, exc_fx, exc2_fx, dct_exc_tmp, pitch_buf_fx, voice_factors, &FEC_pitch_fx, bwe_exc_fx, lsf_new_fx, &st_fx->Q_exc, &tmp_noise_fx ); - - Rescale_exc( NULL, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, L_FRAME32k, (Word32) 0, - &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, st_fx->L_frame, st_fx->last_coder_type ); + Rescale_exc( NULL, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, L_FRAME32k, (Word32) 0, + &( st->Q_exc ), st->Q_subfr, exc2_fx, st->L_frame, st->last_coder_type ); - tmp_noise_fx = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ /* SC-VBR */ - st_fx->prev_gain_pit_dec_fx = st_fx->lp_gainp_fx; - move16(); /*Q14*/ + st->prev_gain_pit_dec_fx = st->lp_gainp_fx; + move16(); } /* synthesis for ACELP core switching and SWB BWE */ - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc_fx, temp_buf_fx, st_fx->mem_syn1_fx, 1, st_fx->Q_exc, -1 ); /*old_syn_12k8_16k directly in q-1*/ + syn_12k8_fx( st->L_frame, Aq_fx, exc_fx, temp_buf_fx, st->mem_syn1_fx, 1, st->Q_exc, -1 ); /* save and delay synthesis to be used by SWB BWE */ - IF( hBWE_FD != NULL ) + IF( st->hBWE_FD != NULL ) { - save_old_syn_fx( st_fx->L_frame, temp_buf_fx, old_syn_12k8_16k, hBWE_FD->old_syn_12k8_16k_fx, st_fx->preemph_fac, &hBWE_FD->mem_deemph_old_syn_fx ); + save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); } + /* Apply energy matching when switching to inactive frames */ - Inac_swtch_ematch_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode ); + Inac_switch_ematch_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); - /* udate past excitation signals for LD music post-filter */ - IF( hMusicPF != NULL ) + /* update past excitation signals for LD music post-filter */ + IF( st->hMusicPF != NULL ) { - Copy( hMusicPF->dct_post_old_exc_fx + L_FRAME, hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); + Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + /* Update music post processing values */ /* Filter energies update */ FOR( i = 0; i < DCT_L_POST; i++ ) { - /*st_fx->filt_lfE_fx[i] = 0.3f + 0.7f * st_fx->filt_lfE_fx[i];*/ - hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, hMusicPF->filt_lfE_fx[i] ) ); + st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( 1228 << 16, 22938, st->hMusicPF->filt_lfE_fx[i] ) ); move16(); } + /* Update circular buffer, keep last energy difference unchanged */ FOR( i = 1; i < MAX_LT; i++ ) { - hMusicPF->LDm_lt_diff_etot_fx[i - 1] = hMusicPF->LDm_lt_diff_etot_fx[i]; + st->hMusicPF->LDm_lt_diff_etot_fx[i - 1] = st->hMusicPF->LDm_lt_diff_etot_fx[i]; move16(); } } + /* synthesis at 12k8 Hz sampling rate */ /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ - k = 0; + Word16 k = 0; move16(); test(); test(); - if ( ( st_fx->coder_type == INACTIVE ) && st_fx->flag_cna && GE_16( round_fx( L_shl( st_fx->lp_noise, 1 ) ), 15 << 7 ) ) + if ( st->coder_type == INACTIVE && st->flag_cna && GE_16( round_fx( L_shl( st->lp_noise, 1 ) ), 15 << 7 ) ) { k = 1; move16(); } - Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, 4, &st_fx->mem_deemph_fx, - hBPF->pst_old_syn_fx, &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, 1, k, temp_buf_fx ); + Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, 4, &st->mem_deemph_fx, + st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, 1, k, temp_buf_fx ); test(); - IF( ( EQ_32( st_fx->total_brate, ACELP_7k20 ) ) || ( EQ_32( st_fx->total_brate, ACELP_8k00 ) ) ) + IF( EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) { - Copy( st_fx->mem_syn2_fx, mem_tmp_fx, M ); // Q_syn + Copy( st->mem_syn2_fx, mem_tmp_fx, M ); } - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc2_fx, syn_fx, st_fx->mem_syn2_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); + syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); /* update buffer for classifier */ - IF( st_fx->hWIDec != NULL ) + IF( st->hWIDec != NULL ) { - Copy( exc2_fx + st_fx->L_frame - L_EXC_MEM, st_fx->hWIDec->old_exc2_fx, L_EXC_MEM ); - Copy( syn_fx + st_fx->L_frame - L_EXC_MEM, st_fx->hWIDec->old_syn2_fx, L_EXC_MEM ); + Copy( exc2_fx + sub( st->L_frame, L_EXC_MEM ), st->hWIDec->old_exc2_fx, L_EXC_MEM ); + Copy( psyn_fx + sub( st->L_frame, L_EXC_MEM ), st->hWIDec->old_syn2_fx, L_EXC_MEM ); } - st_fx->prev_Q_exc_fr = st_fx->Q_exc; + st->prev_Q_exc_fr = st->Q_exc; move16(); - st_fx->prev_Q_syn_fr = st_fx->Q_syn; + st->prev_Q_syn_fr = st->Q_syn; move16(); + Copy( psyn_fx + sub( st->L_frame, L_SYN_MEM_CLAS_ESTIM ), st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); - Copy( syn_fx + st_fx->L_frame - L_SYN_MEM_CLAS_ESTIM, st_fx->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); + /*------------------------------------------------------------* + * FEC - Smooth the speech energy evolution when recovering after a BAD frame + * (smoothing is performed in the excitation domain and signal is resynthesized after) + *------------------------------------------------------------*/ test(); - IF( ( EQ_32( st_fx->total_brate, ACELP_7k20 ) ) || ( EQ_32( st_fx->total_brate, ACELP_8k00 ) ) ) + IF( EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) { - k = 0; - move16(); - FOR( i = 0; i < st_fx->L_frame; i += L_SUBFR ) - { - pitch_buf_tmp[k] = mult_r( pitch_buf_fx[k], 512 ); // Q0(6+9-15) , (512 = 1.0f in Q9) - move16(); - k = add( k, 1 ); - } + Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - /*------------------------------------------------------------* - * FEC - Smooth the speech energy evolution when recovering after a BAD frame - * (smoothing is performed in the excitation domain and signal is resynthesized after) - *------------------------------------------------------------*/ - - FEC_scale_syn_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, - &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); + FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, + &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); } /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ - /* fer_energy( st_fx->L_frame, st_fx->last_good, syn_fx, FEC_pitch_fx, &st_fx->enr_old_fx, st_fx->L_frame ); */ - frame_ener_fx( st_fx->L_frame, st_fx->last_good, syn_fx, shr( add( FEC_pitch_fx, 32 ), 6 ), &st_fx->enr_old_fx, st_fx->L_frame, st_fx->Q_syn, 3, 0 ); + frame_ener_fx( st->L_frame, st->last_good, psyn_fx, shr( add( FEC_pitch_fx, 32 ), 6 ), &st->enr_old_fx, st->L_frame, st->Q_syn, 3, 0 ); - IF( st_fx->nelp_mode_dec != 1 ) + IF( NE_16( st->nelp_mode_dec, 1 ) ) { /* modify the excitation signal of stationary unvoiced frames */ - stat_noise_uv_mod_fx( st_fx->coder_type, 0, st_fx->lsp_old_fx, lsp_new_fx, lsp_new_fx, Aq_fx, exc2_fx, st_fx->Q_exc, 1, &st_fx->ge_sm_fx, - &st_fx->uv_count, &st_fx->act_count, st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, - &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); + stat_noise_uv_mod_fx( st->coder_type, 0, st->lsp_old_fx, lsp_new_fx, lsp_new_fx, Aq_fx, exc2_fx, st->Q_exc, 1, &st->ge_sm_fx, + &st->uv_count, &st->act_count, st->lspold_s_fx, &st->noimix_seed, &st->min_alpha_fx, + &st->exc_pe_fx, st->core_brate, st->bwidth, &st->Q_stat_noise, &st->Q_stat_noise_ge ); } - - /* SC-VBR */ - st_fx->hSC_VBR->FadeScale_fx = mult( st_fx->hSC_VBR->FadeScale_fx, 24576 ); /*24576 in Q15*/ - move16(); } - IF( hBWE_TD != NULL ) + + IF( st->hBWE_TD != NULL ) { - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) + IF( EQ_16( st->L_frame, L_FRAME ) ) { - Copy( Aq_fx + 2 * ( M + 1 ), hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); // Q12 + Copy( Aq_fx + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); } ELSE { - Copy( Aq_fx + 3 * ( M + 1 ), hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); // Q12 + Copy( Aq_fx + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); } } + /*--------------------------------------------------------* * Apply NB postfilter in case of 8kHz output *--------------------------------------------------------*/ + test(); - IF( EQ_16( st_fx->last_bwidth, NB ) && st_fx->hPFstat != NULL ) + IF( st->last_bwidth == NB && st->hPFstat != NULL ) { - k = 0; - move16(); - FOR( i = 0; i < st_fx->L_frame; i += L_SUBFR ) - { - pitch_buf_tmp[k] = mult_r( pitch_buf_fx[k], 512 ); // Q0(6+9-15) , (512 = 1.0f in Q9) - move16(); - k = add( k, 1 ); - } + Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - IF( EQ_16( st_fx->bwidth, NB ) ) + IF( st->bwidth == NB ) { - st_fx->hPFstat->on = 1; + st->hPFstat->on = 1; move16(); - nb_post_filt_fx( st_fx->L_frame, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, st_fx->coder_type, st_fx->BER_detect, 0 ); + nb_post_filt_fx( st->L_frame, st->hPFstat, &st->psf_lp_noise_fx, tmp_noise_fx, psyn_fx, Aq_fx, pitch_buf_tmp, st->coder_type, st->BER_detect, 0 ); } ELSE { - st_fx->hPFstat->on = 0; + st->hPFstat->on = 0; move16(); - nb_post_filt_fx( st_fx->L_frame, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, AUDIO, st_fx->BER_detect, 0 ); + nb_post_filt_fx( st->L_frame, st->hPFstat, &st->psf_lp_noise_fx, tmp_noise_fx, psyn_fx, Aq_fx, pitch_buf_tmp, AUDIO, st->BER_detect, 0 ); } } ELSE { - st_fx->psf_lp_noise_fx = round_fx( L_shl( st_fx->lp_noise, 1 ) ); + st->psf_lp_noise_fx = round_fx( L_shl( st->lp_noise, 1 ) ); move16(); } @@ -1204,142 +1491,255 @@ ivas_error acelp_core_dec_fx( * Perform fixed deemphasis through 1/(1 - g*z^-1) *-----------------------------------------------------------------*/ - /* Update old synthesis buffer - needed for ACELP internal sampling rate switching */ - Copy( syn_fx + st_fx->L_frame - L_SYN_MEM, st_fx->mem_syn_r, L_SYN_MEM ); - deemph_fx( syn_fx, st_fx->preemph_fac, st_fx->L_frame, &( st_fx->mem_deemph_fx ) ); - unscale_AGC( syn_fx, st_fx->Q_syn, syn_fx_tmp2, st_fx->agc_mem_fx, st_fx->L_frame ); - Copy( syn_fx_tmp2, syn_fx, st_fx->L_frame ); - - /* Update MODE2 memories*/ - IF( hTcxDec != NULL ) + /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ + Copy( psyn_fx + sub( st->L_frame, L_SYN_MEM ), st->mem_syn_r, L_SYN_MEM ); + deemph_fx( psyn_fx, st->preemph_fac, st->L_frame, &( st->mem_deemph_fx ) ); + unscale_AGC( psyn_fx, st->Q_syn, syn_fx_tmp2, st->agc_mem_fx, st->L_frame ); + Copy( syn_fx_tmp2, psyn_fx, st->L_frame ); + IF( st->hTcxDec != NULL ) { - Copy_Scale_sig( syn_fx + shr( st_fx->L_frame, 1 ), hTcxDec->old_syn_Overl, shr( st_fx->L_frame, 1 ), sub( -1, st_fx->Q_syn ) ); /*Q-1*/ + Copy_Scale_sig( psyn_fx + shr( st->L_frame, 1 ), st->hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, st->Q_syn ) ); /*Q-1*/ + st->hTcxDec->Q_old_syn_Overl = -1; } - Copy_Scale_sig( syn_fx + st_fx->L_frame - M - 1, st_fx->syn, M + 1, sub( 0, st_fx->Q_syn ) ); /*Q0*/ + Copy_Scale_sig( psyn_fx + sub( st->L_frame, M + 1 ), st->syn, M + 1, sub( 0, st->Q_syn ) ); /*Q0*/ /*------------------------------------------------------------------* * Formant post-filter *-----------------------------------------------------------------*/ - IF( st_fx->hPFstat != NULL ) + test(); + test(); + test(); + test(); + IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) && ( GT_32( st->core_brate, ACELP_24k40 ) || st->element_mode > EVS_MONO ) && LE_32( st->core_brate, ACELP_32k ) ) { - test(); - test(); - test(); - IF( GE_16( st_fx->last_bwidth, WB ) && ( GT_32( st_fx->core_brate, ACELP_24k40 ) || ( st_fx->element_mode > EVS_MONO ) ) && LE_32( st_fx->core_brate, ACELP_32k ) ) - { - Copy( syn_fx, temp_buf + L_SYN_MEM, L_FRAME16k ); - st_fx->hPFstat->on = 1; - move16(); - formant_post_filt_fx( st_fx->hPFstat, temp_buf + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME16k, st_fx->lp_noise, st_fx->total_brate, 0 ); - } - ELSE IF( GE_16( st_fx->last_bwidth, WB ) ) + st->hPFstat->on = 1; + move16(); + Copy( psyn_fx, temp_buf_fx + L_SYN_MEM, L_FRAME16k ); + set16_fx( st->hPFstat->mem_zero, 0, M ); + + formant_post_filt_fx( st->hPFstat, temp_buf_fx + L_SYN_MEM, Aq_fx, psyn_fx, st->L_frame, st->lp_noise, st->total_brate, 0 ); + } + ELSE IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) ) + { + IF( st->hPFstat->on ) { - IF( st_fx->hPFstat->on ) - { - Copy( st_fx->hPFstat->mem_pf_in + L_SYN_MEM - M, temp_buf, M ); - Copy( syn_fx, temp_buf + M, L_SUBFR ); - Residu3_fx( Aq_fx, temp_buf + M, temp_buf + M + L_SUBFR, L_SUBFR, 1 ); - E_UTIL_synthesis( 1, Aq_fx, temp_buf + M + L_SUBFR, temp_buf, L_SUBFR, st_fx->hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); - scale_st_fx( syn_fx, temp_buf, &st_fx->hPFstat->gain_prec, L_SUBFR ); - Copy( temp_buf, syn_fx, L_SUBFR / 2 ); - blend_subfr2_fx( temp_buf + L_SUBFR / 2, syn_fx + L_SUBFR / 2, syn_fx + L_SUBFR / 2 ); - } - st_fx->hPFstat->on = 0; - move16(); + Copy( st->hPFstat->mem_pf_in + L_SYN_MEM - M, temp_buf_fx, M ); + Copy( psyn_fx, temp_buf_fx + M, L_SUBFR ); + + Residu3_fx( Aq_fx, temp_buf_fx + M, temp_buf_fx + M + L_SUBFR, L_SUBFR, 1 ); + E_UTIL_synthesis( 1, Aq_fx, temp_buf_fx + M + L_SUBFR, temp_buf_fx, L_SUBFR, st->hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); + scale_st_fx( psyn_fx, temp_buf_fx, &st->hPFstat->gain_prec, L_SUBFR ); + Copy( temp_buf_fx, psyn_fx, ( L_SUBFR >> 1 ) ); + blend_subfr2_fx( temp_buf_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2 ); } + st->hPFstat->on = 0; + move16(); } + /*----------------------------------------------------------------* * Comfort noise addition *----------------------------------------------------------------*/ test(); test(); - IF( ( st_fx->hFdCngDec != NULL || EQ_16( st_fx->idchan, 1 ) ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( ( st->hFdCngDec != NULL || EQ_16( st->idchan, 1 ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { test(); test(); test(); test(); test(); - IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) || st_fx->flag_cna || ( EQ_16( st_fx->cng_type, FD_CNG ) && LE_32( st_fx->total_brate, ACELP_32k ) ) || ( ( st_fx->cng_type == LP_CNG ) && LE_32( st_fx->total_brate, SID_2k40 ) ) ) + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) || st->flag_cna || ( EQ_16( st->cng_type, FD_CNG ) && LE_32( st->total_brate, ACELP_32k ) ) || ( st->cng_type == LP_CNG && LE_32( st->core_brate, SID_2k40 ) ) ) { /*VAD only for non inactive frame*/ test(); - st_fx->VAD = st_fx->VAD && ( st_fx->coder_type != INACTIVE ); + st->VAD = st->VAD && st->coder_type != INACTIVE; move16(); test(); test(); test(); test(); test(); - IF( st_fx->idchan == 0 && ( st_fx->flag_cna || ( EQ_16( st_fx->cng_type, FD_CNG ) && LE_32( st_fx->total_brate, ACELP_32k ) ) || - ( EQ_16( st_fx->cng_type, LP_CNG ) && LE_32( st_fx->total_brate, SID_2k40 ) ) ) ) + IF( st->idchan == 0 && ( st->flag_cna || ( EQ_16( st->cng_type, FD_CNG ) && LE_32( st->total_brate, ACELP_32k ) ) || ( st->cng_type == LP_CNG && LE_32( st->core_brate, SID_2k40 ) ) ) ) { /*Noisy speech detector*/ - noisy_speech_detection_fx( st_fx->hFdCngDec, st_fx->VAD, syn_fx, st_fx->Q_syn ); + noisy_speech_detection_fx( st->hFdCngDec, st->VAD, psyn_fx, st->Q_syn ); - st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech = mult_r( st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 32440 /*0.99 Q15*/ ); + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = mult_r( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 32440 /*0.99 Q15*/ ); move16(); - IF( st_fx->hFdCngDec->hFdCngCom->flag_noisy_speech != 0 ) + IF( st->hFdCngDec->hFdCngCom->flag_noisy_speech != 0 ) { - st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech = add( st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 328 /*0.01 Q15*/ ); + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = add( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 328 /*0.01 Q15*/ ); move16(); } + move32(); } - if ( st_fx->idchan == 0 ) + + if ( st->idchan == 0 ) { - st_fx->lp_noise = st_fx->hFdCngDec->lp_noise; + st->lp_noise = st->hFdCngDec->lp_noise; move32(); } - /*Noise estimate*/ - IF( NE_16( st_fx->element_mode, IVAS_CPE_TD ) /* && !st->cng_ism_flag IVAS_CODE */ ) + + test(); + IF( NE_16( st->element_mode, IVAS_CPE_TD ) && !st->cng_ism_flag ) { -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - PMT( "Code for IVAS_CODE_CNG_FIX185_PLC_FADEOUT not done" ) - ApplyFdCng_fx( syn, st_fx->Q_syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); -#else - ApplyFdCng_fx( syn_fx, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st_fx, 0, ( EQ_16( st_fx->coder_type, AUDIO ) && st_fx->GSC_noisy_speech == 0 ) ); -#endif + /* Noise estimate */ + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); } - /* CNA: Generate additional comfort noise to mask potential coding artefacts */ - } - test(); - test(); - test(); - test(); - IF( st_fx->flag_cna && NE_16( st_fx->coder_type, AUDIO ) ) - { - generate_masking_noise_fx( syn_fx, st_fx->Q_syn, st_fx->hFdCngDec->hFdCngCom, st_fx->hFdCngDec->hFdCngCom->frameSize, 0 ); - } - ELSE IF( st_fx->flag_cna && EQ_16( st_fx->coder_type, AUDIO ) && st_fx->last_core == ACELP_CORE && NE_16( st_fx->last_coder_type, AUDIO ) ) - { - FOR( i = 0; i < st_fx->hFdCngDec->hFdCngCom->frameSize / 2; i++ ) + IF( !st->cna_dirac_flag ) { - syn_fx[i] = add( syn_fx[i], shr_r( mult_r( st_fx->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * st_fx->hFdCngDec->hFdCngCom->frameSize / 4], st_fx->hFdCngDec->hFdCngCom->fftlenFac ), -st_fx->Q_syn ) ); - move16(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + /* CNA: Generate additional comfort noise to mask potential coding artefacts */ + IF( st->flag_cna && !( EQ_16( st->coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->GSC_noisy_speech ) ) ) + { + test(); + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( nchan_out, 2 ) ) + { + IF( hStereoCng->flag_cna_fade ) + { + generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); + hStereoCng->flag_cna_fade = 0; + move16(); + } + ELSE + { + test(); + IF( NE_16( st->element_mode, last_element_mode ) && ( st->idchan == 0 ) ) + { + /* Clear memory for secondary channel CNA */ + set16_fx( hStereoCng->olapBufferSynth22_fx, 0, shr( st->hFdCngDec->hFdCngCom->frameSize, 1 ) ); + } + + generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out ); + } + } + ELSE IF( NE_16( st->element_mode, IVAS_CPE_DFT ) ) + { + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + generate_masking_noise_fx( psyn_fx, st->Q_syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0 ); + } + ELSE + { + IF( st->idchan == 0 ) + { + IF( NE_16( st->element_mode, last_element_mode ) ) + { + set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); + set32_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, 0, st->hFdCngDec->hFdCngCom->fftlen ); + } + + Word32 psyn_32_fx[L_FRAME16k]; + Copy_Scale_sig_16_32_no_sat( psyn_fx, psyn_32_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( Q6, st->Q_syn ) ); // Q6 + generate_masking_noise_ivas_fx( psyn_32_fx, &exp, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); + + Copy_Scale_sig_32_16( psyn_32_fx, psyn_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( st->Q_syn, exp ) ); // Q = st->Q_syn + Copy_Scale_sig_32_16( st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), -Q15 ); // Q0 + } + } + } + } + ELSE IF( st->flag_cna && EQ_16( st->coder_type, AUDIO ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, TCX_20_CORE ) ) ) + { + test(); + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( nchan_out, 2 ) ) + { + generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); + hStereoCng->flag_cna_fade = 1; + move16(); + } + ELSE + { + FOR( i = 0; i < ( st->hFdCngDec->hFdCngCom->frameSize ) / 2; i++ ) + { + psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * ( st->hFdCngDec->hFdCngCom->frameSize / 4 )], st->hFdCngDec->hFdCngCom->fftlenFac ), negate( st->Q_syn ) ) ); + move16(); + } + } + } + ELSE + { + IF( hStereoCng != NULL ) + { + hStereoCng->flag_cna_fade = 1; + move16(); + hStereoCng->enableSecCNA = 0; + move16(); + } + } + + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + { + test(); + test(); + test(); + /*Noise estimate*/ + IF( ( st->idchan == 0 ) && ( EQ_16( nchan_out, 2 ) || ( st->core_brate != FRAME_NO_DATA && NE_32( st->core_brate, SID_2k40 ) ) ) ) + { + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + } + } } } - test(); - test(); - test(); - test(); - test(); - IF( st_fx->flag_cna == 0 && EQ_16( st_fx->L_frame, L_FRAME16k ) && EQ_16( st_fx->last_flag_cna, 1 ) && ( ( st_fx->last_core == ACELP_CORE && NE_16( st_fx->last_coder_type, AUDIO ) ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) ) + IF( !st->cna_dirac_flag ) { - FOR( i = 0; i < st_fx->L_frame / 2; i++ ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( st->flag_cna == 0 ) && EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->last_flag_cna, 1 ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, AMR_WB_CORE ) ) ) { - syn_fx[i] = add( syn_fx[i], shr_r( st_fx->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * st_fx->L_frame / 4], negate( st_fx->Q_syn ) ) ); - move16(); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + // VE: TBV - is it correct in EVS? in FLP, it is: + // v_multc( st->hFdCngDec->hFdCngCom->olapBufferSynth2 + 5 * st->L_frame / 4, 256.f, temp_buf, st->L_frame / 2 ); + // v_add( temp_buf, syn, syn, st->L_frame / 2 ); + FOR( i = 0; i < st->L_frame / 2; i++ ) + { + psyn_fx[i] = add( psyn_fx[i], shr_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * st->L_frame / 4], negate( st->Q_syn ) ) ); + move16(); + } + } + ELSE + { + FOR( i = 0; i < ( st->hFdCngDec->hFdCngCom->frameSize ) / 2; i++ ) + { + psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * ( st->hFdCngDec->hFdCngCom->frameSize / 4 )], st->hFdCngDec->hFdCngCom->fftlenFac ), -st->Q_syn ) ); + move16(); + } + } } - } - test(); - IF( st_fx->flag_cna == 0 || EQ_16( st_fx->coder_type, AUDIO ) ) - { - set16_fx( st_fx->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st_fx->hFdCngDec->hFdCngCom->fftlen ); + test(); + test(); + test(); + IF( ( st->flag_cna == 0 ) || ( EQ_16( st->coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->GSC_noisy_speech ) ) ) + { + IF( st->idchan == 0 ) + { + set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); + set32_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, 0, st->hFdCngDec->hFdCngCom->fftlen ); + } + IF( hStereoCng != NULL && ( st->idchan == 0 ) ) + { + set16_fx( hStereoCng->olapBufferSynth22_fx, 0, st->hFdCngDec->hFdCngCom->fftlen ); + } + } } } @@ -1348,45 +1748,43 @@ ivas_error acelp_core_dec_fx( * Bass post-filter *----------------------------------------------------------------*/ - /* check if the CLDFB works on the right sample rate */ - IF( ( st_fx->cldfbAna->usb * st_fx->cldfbAna->no_col ) != st_fx->L_frame ) + IF( EQ_16( st->element_mode, EVS_MONO ) ) { - /* resample to ACELP internal sampling rate */ - Word16 newCldfbBands = CLDFB_getNumChannels( L_mult0( st_fx->L_frame, FRAMES_PER_SEC ) ); - resampleCldfb( st_fx->cldfbAna, newCldfbBands, st_fx->L_frame, 0 ); - resampleCldfb( st_fx->cldfbBPF, newCldfbBands, st_fx->L_frame, 0 ); + CLDFB_SCALE_FACTOR scaleFactor; + Word32 workBuffer[128 * 3]; - IF( st_fx->ini_frame > 0 ) + /* check if the CLDFB works on the right sample rate */ + IF( ( st->cldfbAna->usb * st->cldfbAna->no_col ) != st->L_frame ) { - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ); - move16(); + /* resample to ACELP internal sampling rate */ + resampleCldfb( st->cldfbAna, L_mult0( st->L_frame, FRAMES_PER_SEC ), st->L_frame, 0 ); + resampleCldfb( st->cldfbBPF, L_mult0( st->L_frame, FRAMES_PER_SEC ), st->L_frame, 0 ); + + IF( st->ini_frame > 0 ) + { + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); + move16(); + } } - } - test(); - IF( !( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && st_fx->bpf_off ) ) - { test(); - IF( NE_16( st_fx->L_frame, st_fx->last_L_frame ) && NE_16( st_fx->last_codec_mode, MODE2 ) ) + IF( NE_16( st->L_frame, st->last_L_frame ) && NE_16( st->last_codec_mode, MODE2 ) ) { - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) + IF( EQ_16( st->L_frame, L_FRAME ) ) { - retro_interp5_4_fx( hBPF->pst_old_syn_fx ); + retro_interp5_4_fx( st->hBPF->pst_old_syn_fx ); } - ELSE IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) + ELSE IF( EQ_16( st->L_frame, L_FRAME16k ) ) { - retro_interp4_5_fx( syn_fx, hBPF->pst_old_syn_fx ); + retro_interp4_5_fx( psyn_fx, st->hBPF->pst_old_syn_fx ); } } - bass_psfilter_fx( st_fx->hBPF, st_fx->Opt_AMR_WB, syn_fx, st_fx->L_frame, pitch_buf_fx, st_fx->bpf_off, - st_fx->stab_fac_fx, &st_fx->stab_fac_smooth_fx, st_fx->coder_type, st_fx->Q_syn, bpf_error_signal ); - } - test(); - IF( NE_16( st_fx->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft ) - { + bass_psfilter_fx( st->hBPF, st->Opt_AMR_WB, psyn_fx, st->L_frame, pitch_buf_fx, st->bpf_off, + st->stab_fac_fx, &st->stab_fac_smooth_fx, st->coder_type, st->Q_syn, bpf_error_signal_16fx ); + /* analysis of the synthesis at internal sampling rate */ - cldfbAnalysis_fx( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, syn_fx, negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX, workBuffer ); + cldfbAnalysis_fx( st->cldfbAna, realBuffer_fx, imagBuffer_fx, &scaleFactor, psyn_fx, negate( st->Q_syn ), CLDFB_NO_COL_MAX, workBuffer ); scaleFactor.hb_scale = scaleFactor.lb_scale; move16(); @@ -1394,25 +1792,26 @@ ivas_error acelp_core_dec_fx( /* analysis and add the BPF error signal */ i = 0; move16(); - if ( st_fx->bpf_off == 0 ) + if ( st->bpf_off == 0 ) { i = CLDFB_NO_COL_MAX; move16(); } - addBassPostFilter_fx( bpf_error_signal, realBuffer, imagBuffer, st_fx->cldfbBPF, workBuffer, negate( st_fx->Q_syn ), - i, st_fx->cldfbAna->no_col, st_fx->cldfbAna->no_channels, &scaleFactor ); + + addBassPostFilter_fx( bpf_error_signal_16fx, realBuffer_fx, imagBuffer_fx, st->cldfbBPF, workBuffer, negate( st->Q_syn ), + i, st->cldfbAna->no_col, st->cldfbAna->no_channels, &scaleFactor ); /* set output mask for upsampling */ - IF( EQ_16( st_fx->bwidth, NB ) ) + IF( EQ_16( st->bwidth, NB ) ) { /* set NB mask for upsampling */ - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, 10 ); + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, 10 ); move16(); } - ELSE IF( NE_16( st_fx->cldfbSyn->bandsToZero, sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ) ) ) + ELSE IF( NE_16( st->cldfbSyn->bandsToZero, sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ) ) ) { /* in case of BW switching, re-init to default */ - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ); + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); move16(); } @@ -1420,47 +1819,394 @@ ivas_error acelp_core_dec_fx( scaleFactor.hb_scale = scaleFactor.lb_scale; move16(); + test(); + test(); + test(); + IF( ( ( st->core_brate == FRAME_NO_DATA ) || EQ_32( st->core_brate, SID_2k40 ) ) && ( EQ_16( st->cng_type, FD_CNG ) ) && ( LT_16( st->hFdCngDec->hFdCngCom->numCoreBands, st->cldfbSyn->no_channels ) ) ) + { + generate_comfort_noise_dec_hf_fx( realBuffer_fx, imagBuffer_fx, &scaleFactor.hb_scale, st ); + + st->cldfbSyn->bandsToZero = 0; + move16(); + IF( LT_16( st->hFdCngDec->hFdCngCom->regularStopBand, st->cldfbSyn->no_channels ) ) + { + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->hFdCngDec->hFdCngCom->regularStopBand ); + move16(); + } + st->cldfbSyn->lsb = st->cldfbAna->no_channels; + move16(); + } + + /* synthesis of the combined signal */ + st->Q_syn2 = st->Q_syn; + move16(); + cldfbSynthesis_fx( st->cldfbSyn, realBuffer_fx, imagBuffer_fx, &scaleFactor, synth_fx16, negate( st->Q_syn2 ), CLDFB_NO_COL_MAX, workBuffer ); + + /* Bring CLDFB output to Q0 */ + Scale_sig( synth_fx16, output_frame, negate( st->Q_syn2 ) ); + st->Q_syn2 = 0; + move16(); + + /* save synthesis - needed in case of core switching */ + Copy( synth_fx16, st->previoussynth_fx, output_frame ); + } + ELSE + { + /* check if the CLDFB works on the right sample rate */ + IF( NE_16( imult1616( st->cldfbAna->no_channels, st->cldfbAna->no_col ), st->L_frame ) ) + { + resampleCldfb_ivas_fx( st->cldfbAna, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); + resampleCldfb_ivas_fx( st->cldfbBPF, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); + + IF( st->ini_frame > 0 ) + { + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); + move16(); + } + } + + /* analyze pitch coherence for bass post-filter */ + Word32 pitch_buf_fx_q20[12]; + Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, Q4 ); // Q(x+4) + Word16 lim = shr( st->L_frame, 6 ); + FOR( Word16 lp = 0; lp < lim; lp++ ) + { + pitch_buf_fx_q20[lp] = L_shl( pitch_buf_fx[lp], Q14 ); + move32(); + } + bpf_pitch_coherence_ivas_fx( st, pitch_buf_fx_q20 ); + Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, -Q4 ); // Qx test(); - IF( !st_fx->cng_sba_flag || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( !( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->bpf_off ) ) { test(); - test(); - test(); - IF( ( ( st_fx->core_brate == FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) && ( EQ_16( st_fx->cng_type, FD_CNG ) ) && ( LT_16( st_fx->hFdCngDec->hFdCngCom->numCoreBands, st_fx->cldfbSyn->no_channels ) ) ) + IF( NE_16( st->L_frame, st->last_L_frame ) && NE_16( st->last_codec_mode, MODE2 ) ) { - generate_comfort_noise_dec_hf_fx( realBuffer, imagBuffer, &scaleFactor.hb_scale, st_fx ); + IF( EQ_16( st->L_frame, L_FRAME ) ) + { + retro_interp5_4_fx( st->hBPF->pst_old_syn_fx ); + } + ELSE IF( EQ_16( st->L_frame, L_FRAME16k ) ) + { + retro_interp4_5_fx( psyn_fx, st->hBPF->pst_old_syn_fx ); + } + } + + bass_psfilter_fx( st->hBPF, st->Opt_AMR_WB, psyn_fx, st->L_frame, pitch_buf_fx, st->bpf_off, + st->stab_fac_fx, &st->stab_fac_smooth_fx, st->coder_type, st->Q_syn, bpf_error_signal_16fx ); + } + + Word32 syn_tmp_32_fx[L_FRAME16k + L_SUBFR], *syn_32_fx; + set32_fx( syn_tmp_32_fx, 0, L_FRAME16k + L_SUBFR ); + syn_32_fx = syn_tmp_32_fx + L_SUBFR; + test(); + IF( NE_16( st->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft ) + { + /* analysis of the synthesis at internal sampling rate */ + Word32 realBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 imagBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 *pRealSave_fx[CLDFB_NO_COL_MAX], *pImagSave_fx[CLDFB_NO_COL_MAX]; + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + pRealSave_fx[i] = realBufferSave_fx[i]; + pImagSave_fx[i] = imagBufferSave_fx[i]; + } + IF( st->p_bpf_noise_buf_32 ) + { + Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 + Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); + Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11 + } - st_fx->cldfbSyn->bandsToZero = 0; + FOR( i = 0; i < st->L_frame; i++ ) + { + syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); // Q12 + move32(); + } + + Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 + st->cldfbAna->Q_cldfb_state = Q12; + move16(); + + cldfbAnalysis_ivas_fx( syn_32_fx, realBuffer_fx, imagBuffer_fx, -1, st->cldfbAna ); + + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 + st->cldfbAna->Q_cldfb_state = Q11; + move16(); + /* analysis and add the BPF error signal */ + Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; + Word16 q_bpf_error_signal; + Word16 cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); + + q_bpf_error_signal = Q6; + move16(); + Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + } + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) + st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; + move16(); + tmp = -1; + move16(); + if ( st->bpf_off ) + { + tmp = 0; + move16(); + } + + addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( ( sub( q_bpf_error_signal, Q10 ) ) ) ); // Q10 + st->cldfbBPF->Q_cldfb_state = Q10; + move16(); + /* set output mask for upsampling */ + IF( EQ_16( st->bwidth, NB ) ) + { + /* set NB mask for upsampling */ + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, 10 ); + move16(); + } + ELSE IF( NE_16( st->cldfbSyn->bandsToZero, sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ) ) ) + { + /* in case of BW switching, re-init to default */ + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); move16(); - IF( LT_16( st_fx->hFdCngDec->hFdCngCom->regularStopBand, st_fx->cldfbSyn->no_channels ) ) + } + test(); + IF( !st->cng_sba_flag || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) + { + test(); + test(); + test(); + /*WB/SWB-FD_CNG*/ + IF( ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) && ( EQ_16( st->cng_type, FD_CNG ) ) && ( LT_16( st->hFdCngDec->hFdCngCom->numCoreBands, st->cldfbSyn->no_channels ) ) ) { - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->hFdCngDec->hFdCngCom->regularStopBand ); + Word16 tmpBufferScale = 0; move16(); + generate_comfort_noise_dec_hf_ivas_fx( realBuffer_fx, imagBuffer_fx, /*realBuffer, imagBuffer,*/ &tmpBufferScale, st->hFdCngDec->hFdCngCom, st->cng_ism_flag ); + + FOR( i = 0; i < st->hFdCngDec->hFdCngCom->numSlots; i++ ) + { + Scale_sig32( realBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 + Scale_sig32( imagBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 + } + + IF( LT_16( st->hFdCngDec->hFdCngCom->regularStopBand, st->cldfbSyn->no_channels ) ) + { + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->hFdCngDec->hFdCngCom->regularStopBand ); + move16(); + } + ELSE + { + st->cldfbSyn->bandsToZero = 0; + move16(); + } + } + } + + IF( save_hb_synth_fx16 != NULL ) + { + /* save and then zero-out lowband */ + max_real = 0; + max_imag = 0; + move32(); + move32(); + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); + max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); + } + } + max_val = L_max( max_real, max_imag ); + Q_real = sub( norm_l( max_val ), 3 ) /* Guard bits */; + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + } + + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + realBufferSave_fx[i][j] = realBuffer_fx[i][j]; + imagBufferSave_fx[i][j] = imagBuffer_fx[i][j]; + move32(); + move32(); + IF( LT_16( j, st->hFdCngDec->hFdCngCom->numCoreBands ) && LT_16( i, st->hFdCngDec->hFdCngCom->numSlots ) ) + { + realBuffer_fx[i][j] = 0; + imagBuffer_fx[i][j] = 0; + move32(); + move32(); + } + } + } + + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, sub( Q11, Q_real ), -10, st->cldfbSynHB ); + + /* restore lowband */ + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + realBuffer_fx[i][j] = realBufferSave_fx[i][j]; + imagBuffer_fx[i][j] = imagBufferSave_fx[i][j]; + move32(); + move32(); + } + } + + cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, sub( Q11, Q_real ), -10, st->cldfbSyn ); + } + ELSE + { + /* synthesis of the combined signal */ + max_real = 0; + max_imag = 0; + move32(); + move32(); + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); + max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); + } + } + max_val = L_max( max_real, max_imag ); + Q_real = sub( norm_l( max_val ), 3 ) /* Guard bits */; + scf = L_norm_arr( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length ); + scf = s_min( scf, sub( Q_real, Q11 ) ); + Q_real = add( scf, Q11 ); + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real } - st_fx->cldfbSyn->lsb = st_fx->cldfbAna->no_channels; + + scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, scf ); // Q10 - > (Q_real-1) + st->cldfbSyn->Q_cldfb_state = sub( Q_real, 1 ); + move16(); + + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, 0, 0, st->cldfbSyn ); + scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 + scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 + st->cldfbSyn->Q_cldfb_state = Q10; move16(); } + + /* save synthesis - needed in case of core switching */ + Copy32( synth_fx, st->previoussynth_fx_32, output_frame ); // Q0 } - /* synthesis of the combined signal */ - st_fx->Q_syn2 = st_fx->Q_syn; - move16(); + ELSE { - cldfbSynthesis_fx( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out, negate( st_fx->Q_syn2 ), CLDFB_NO_COL_MAX, workBuffer ); + Word16 nSamples = NS2SA_FX2( i_mult( st->L_frame, FRAMES_PER_SEC ), FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ); /* IVAS-64: optimization is likely possible here (don't resample the whole frame) */ + + /* analysis of the synthesis at internal sampling rate - needed for DFT stereo -> TD stereo switching */ + FOR( i = 0; i < st->L_frame; i++ ) + { + syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); + move32(); + } + + Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 + st->cldfbAna->Q_cldfb_state = Q12; + move16(); + + cldfbAnalysis_ivas_fx( syn_32_fx + sub( st->L_frame, nSamples ), realBuffer_fx, imagBuffer_fx, nSamples, st->cldfbAna ); + + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 + st->cldfbAna->Q_cldfb_state = Q11; + move16(); /* analysis and add the BPF error signal - needed for DFT stereo -> TD stereo switching */ + Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; + Word16 q_bpf_error_signal; + Word16 cldfb_state_offset; + cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); + + // Get Q-factor + q_bpf_error_signal = Q6; + move16(); + Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + } + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) + st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; + move16(); + tmp = 0; + move16(); + if ( !st->bpf_off ) + { + tmp = nSamples; + move16(); + } + + addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx + sub( st->L_frame, nSamples ), tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( sub( q_bpf_error_signal, Q10 ) ) ); // Q10 + st->cldfbBPF->Q_cldfb_state = Q10; + move16(); + /* synthesis of the combined signal - needed for DFT stereo -> TD stereo switching */ + max_real = 0; + max_imag = 0; + move32(); + move32(); + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); + max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); + } + } + max_val = L_max( max_real, max_imag ); + Q_real = sub( norm_l( max_val ), 3 ) /* Guard bits */; + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + } + + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), sub( Q10, sub( Q_real, 1 ) ), -10, st->cldfbSyn ); + + IF( st->p_bpf_noise_buf_32 ) + { + Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 + Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); + + Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11 + } + + set32_fx( synth_fx, 0, output_frame ); } - /* Bring CLDFB output to Q0 */ - Scale_sig( synth_out, output_frame, negate( st_fx->Q_syn2 ) ); - st_fx->Q_syn2 = 0; - move16(); - /* save synthesis - needed in case of core switching */ - Copy( synth_out, st_fx->previoussynth_fx, output_frame ); + /* Copy output signal */ + Scale_sig( syn_tmp_fx, add( st->L_frame, L_SUBFR ), negate( st->Q_syn ) ); // Q0 + IF( st->element_mode > EVS_MONO ) + { + Copy( psyn_fx, output_fx, st->L_frame ); /*Q_syn*/ + } + + st->Q_syn2 = 0; + move16(); } /*-----------------------------------------------------------------* * Bandwidth extension 6kHz-7kHz *-----------------------------------------------------------------*/ - IF( st_fx->hBWE_zero != NULL ) + + IF( st->hBWE_zero != NULL ) { test(); test(); @@ -1469,14 +2215,27 @@ ivas_error acelp_core_dec_fx( test(); test(); test(); - IF( ( EQ_16( st_fx->L_frame, L_FRAME ) && NE_16( st_fx->bwidth, NB ) && GE_16( output_frame, L_FRAME16k ) && - ( EQ_16( st_fx->extl, -1 ) || EQ_16( st_fx->extl, SWB_CNG ) || ( EQ_16( st_fx->extl, WB_BWE ) && st_fx->extl_brate == 0 && NE_16( st_fx->coder_type, AUDIO ) ) ) ) ) + IF( ( EQ_16( st->L_frame, L_FRAME ) && ( st->bwidth != NB ) && GE_16( output_frame, L_FRAME16k ) && + ( EQ_16( st->extl, -1 ) || EQ_16( st->extl, SWB_CNG ) || ( EQ_16( st->extl, WB_BWE ) && st->extl_brate == 0 && NE_16( st->coder_type, AUDIO ) ) ) ) ) { - hf_synth_fx( st_fx->hBWE_zero, st_fx->core_brate, output_frame, Aq_fx, exc2_fx, syn_fx, synth_out, st_fx->Q_exc, st_fx->Q_syn2 ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); + } + ELSE + { + Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q0 + hf_synth_ivas_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); + Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, output_frame, 0 ); + } } ELSE { - hf_synth_reset_fx( st_fx->hBWE_zero ); + hf_synth_reset_fx( st->hBWE_zero ); + IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBV: tmp hack - it is a bug in EVS but condition is here to keep EVS bit-exact for the moment + { + set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); + } } } @@ -1484,8 +2243,7 @@ ivas_error acelp_core_dec_fx( * Populate parameters for SWB TBE *-----------------------------------------------------------------*/ - /* Apply a non linearity to the SHB excitation */ - IF( hBWE_TD != NULL ) + IF( st->hBWE_TD != NULL ) { test(); test(); @@ -1499,11 +2257,16 @@ ivas_error acelp_core_dec_fx( test(); test(); test(); - IF( ( !st_fx->bfi && ( st_fx->prev_bfi ) ) || ( ( EQ_16( st_fx->last_vbr_hw_BWE_disable_dec, 1 ) ) && ( st_fx->vbr_hw_BWE_disable_dec == 0 ) ) || ( ( EQ_16( st_fx->extl, SWB_TBE ) || EQ_16( st_fx->extl, WB_TBE ) || EQ_16( st_fx->extl, FB_TBE ) ) && NE_16( st_fx->last_extl, SWB_TBE ) && NE_16( st_fx->last_extl, WB_TBE ) && NE_16( st_fx->last_extl, FB_TBE ) ) || ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && !st_fx->tdm_LRTD_flag ) ) + IF( ( !st->bfi && st->prev_bfi ) || ( EQ_16( st->last_vbr_hw_BWE_disable_dec, 1 ) && ( st->vbr_hw_BWE_disable_dec == 0 ) ) || ( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, WB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && NE_16( st->last_extl, SWB_TBE ) && NE_16( st->last_extl, WB_TBE ) && NE_16( st->last_extl, FB_TBE ) ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && !st->tdm_LRTD_flag ) ) { - hBWE_TD->bwe_non_lin_prev_scale_fx = L_deposit_l( 0 ); + st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; move32(); - set16_fx( hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); + set16_fx( st->hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); + if ( NE_16( st->element_mode, EVS_MONO ) ) + { + st->hBWE_TD->q_old_bwe_exc_extended_fx = Q15; + move16(); + } } test(); @@ -1511,41 +2274,73 @@ ivas_error acelp_core_dec_fx( test(); test(); test(); - IF( !st_fx->ppp_mode_dec && ( st_fx->idchan == 0 || NE_16( st_fx->element_mode, IVAS_CPE_TD ) || ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && st_fx->tdm_LRTD_flag ) ) ) + IF( !st->ppp_mode_dec && ( st->idchan == 0 || NE_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && st->tdm_LRTD_flag ) ) ) { - non_linearity_fx( bwe_exc_fx, bwe_exc_extended, L_FRAME32k, &hBWE_TD->bwe_non_lin_prev_scale_fx, st_fx->Q_exc, - st_fx->coder_type, voice_factors, st_fx->L_frame ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + non_linearity_fx( bwe_exc_fx, bwe_exc_extended_fx, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); + } + ELSE + { + Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), st->hBWE_TD->q_old_bwe_exc_extended_fx ) ) ); /* Q(q_old_bwe_exc_extended_fx) -> Q(2 * Q_exc) */ + non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); + exp = sub( L_norm_arr( bwe_exc_extended_fx + L_FRAME32k, NL_BUFF_OFFSET ), 16 ); + Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, exp ); /* Q(2 * Q_exc) -> Q(q_old_bwe_exc_extended_fx) */ + st->hBWE_TD->q_old_bwe_exc_extended_fx = add( shl( st->Q_exc, 1 ), exp ); + move16(); + } } test(); - IF( ( st_fx->core_brate == FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) + if ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) { - hBWE_TD->bwe_non_lin_prev_scale_fx = L_deposit_l( 0 ); + st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; move32(); } } + /*----------------------------------------------------------------------* * Updates *----------------------------------------------------------------------*/ - updt_dec_fx( st_fx, old_exc_fx, pitch_buf_fx, Es_pred_fx, Aq_fx, lsf_new_fx, lsp_new_fx, voice_factors, old_bwe_exc_fx, gain_buf ); + updt_dec_fx( st, old_exc_fx, pitch_buf_fx, Es_pred_fx, Aq_fx, lsf_new_fx, lsp_new_fx, voice_factors_fx, old_bwe_exc_fx, gain_buf_fx ); test(); test(); - IF( GT_32( st_fx->core_brate, SID_2k40 ) && st_fx->hTdCngDec != NULL && st_fx->hFdCngDec != NULL ) + IF( GT_32( st->core_brate, SID_2k40 ) && st->hTdCngDec != NULL && st->hFdCngDec != NULL ) { /* update CNG parameters in active frames */ - cng_params_upd_fx( lsp_new_fx, exc_fx, st_fx->L_frame, &st_fx->hTdCngDec->ho_circ_ptr, st_fx->hTdCngDec->ho_ener_circ_fx, &st_fx->hTdCngDec->ho_circ_size, st_fx->hTdCngDec->ho_lsp_circ_fx, - st_fx->Q_exc, DEC, st_fx->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st_fx->last_active_brate ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + cng_params_upd_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ_fx, + st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate ); + } + ELSE + { + cng_params_upd_ivas_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, + st->hTdCngDec->ho_lsp_circ_fx, st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate, st->element_mode, + st->hFdCngDec->hFdCngCom->CngBandwidth ); + } + /* Set 16k LSP flag for CNG buffer */ - st_fx->hTdCngDec->ho_16k_lsp[st_fx->hTdCngDec->ho_circ_ptr] = 0; + st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 0; move16(); - if ( NE_16( st_fx->L_frame, L_FRAME ) ) + if ( NE_16( st->L_frame, L_FRAME ) ) { - st_fx->hTdCngDec->ho_16k_lsp[st_fx->hTdCngDec->ho_circ_ptr] = 1; + st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 1; move16(); } } - return IVAS_ERR_OK; + IF( NE_16( st->element_mode, EVS_MONO ) ) + { + IF( save_hb_synth_fx16 ) + { + Copy_Scale_sig_32_16( save_hb_synth_fx, save_hb_synth_fx16, L_FRAME48k, 0 ); // Q0 + } + Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q_syn2 + } + + pop_wmops(); + return error; } diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c deleted file mode 100644 index 2ca524bb0f94e076b37665ba671474a2a87ab0a9..0000000000000000000000000000000000000000 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ /dev/null @@ -1,2295 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ -#include -#include -#include -#include "options.h" -#include "cnst.h" -#include "rom_com.h" -#include "prot_fx.h" -#include "ivas_cnst.h" -#include "ivas_rom_com.h" -#include "wmc_auto.h" -#include "ivas_prot_fx.h" - -/*-------------------------------------------------------------------* - * acelp_core_dec_ivas_fx() - * - * ACELP core decoder - *-------------------------------------------------------------------*/ -static void rescale_fdCngDec( HANDLE_FD_CNG_DEC hFdCngDec, Word16 old_NoiseExp ); -ivas_error acelp_core_dec_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ - Word16 output_fx[], /* o : synthesis @internal Fs Q_syn*/ - Word16 synth_fx16[], /* o : synthesis Q_syn2*/ - Word16 save_hb_synth_fx16[], /* o : HB synthesis Q0*/ - Word32 bwe_exc_extended_fx[], /* i/o: bandwidth extended excitation 2*Q_exc*/ - Word16 *voice_factors_fx, /* o : voicing factors Q15*/ - Word16 old_syn_12k8_16k_fx[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE Q_syn2-1*/ - const Word16 sharpFlag, /* i : formant sharpening flag */ - Word16 pitch_buf_fx[NB_SUBFR16k], /* o : Word16 pitch for each subframe Q6*/ - Word16 *unbits, /* o : number of unused bits */ - Word16 *sid_bw, /* o : 0-NB/WB, 1-SWB SID */ - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle Qlog2(2.56)*/ - const Word16 tdm_lspQ_PCh_fx[M], /* i : Q LSPs for primary channel Q15*/ - const Word16 tdm_lsfQ_PCh_fx[M], /* i : Q LSFs for primary channel */ - const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ - const Word16 last_element_mode, /* i : last element mode */ - const Word32 last_element_brate, /* i : last element bitrate */ - const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel */ - const Word16 nchan_out, /* i : number of output channels */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ - const Word16 read_sid_info /* i : read SID info flag */ -) -{ - Word32 synth_fx[960], save_hb_synth_fx[960] /*, bwe_exc_extended_fx[L_FRAME32k + NL_BUFF_OFFSET]*/; - - Word16 old_exc_fx[L_EXC_DEC], *exc_fx; /* excitation signal buffer */ - Word16 syn_tmp_fx[L_FRAME16k + L_SUBFR], *psyn_fx; /* synthesis signal buffer */ - Word16 output_frame; /* frame length at output sampling freq. */ - Word16 lsf_new_fx[M]; /* LSFs at the end of the frame Qlog2(2.56) */ - Word16 lsp_new_fx[M]; /* LSPs at the end of the frame Q15 */ - Word16 lsp_mid_fx[M]; /* LSPs in the middle of the frame */ -#ifdef MSAN_FIX - Word16 Aq_fx[NB_SUBFR16k * ( M + 1 )]; /* A(q) quantized for the 4 subframes */ -#else - Word16 Aq_fx[NB_SUBFR16k * ( M + 1 )]; /* A(q) quantized for the 4 subframes */ -#endif - Word16 old_exc2_fx[L_FRAME16k + L_EXC_MEM], *exc2_fx; /* total excitation buffer */ - Word16 mem_tmp_fx[M]; /* temporary synthesis filter memory */ - Word32 enr_q_fx; /* E information for FER protection */ - Word16 tmp_noise_fx; /* Long term temporary noise energy */ - Word16 Es_pred_fx; /* predicted scaled innov. energy Q8 */ - Word16 FEC_pitch_fx; /* FEC pitch */ -#ifdef MSAN_FIX - Word16 old_bwe_exc_fx[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; /* excitation buffer */ -#else - Word16 old_bwe_exc_fx[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; /* excitation buffer */ -#endif - Word16 *bwe_exc_fx; /* Excitation for SWB TBE */ - Word16 i, j, int_fs; - Word16 tc_subfr; - Word16 allow_cn_step; - Word16 temp_buf_fx[L_FRAME16k + L_SYN_MEM]; - Word16 last_pulse_pos; - Word16 T0_tmp; - Word16 do_WI; - Word16 dct_buffer_fx[DCT_L_POST]; - Word16 exc_buffer_fx[DCT_L_POST]; - Word16 dct_exc_tmp_fx[L_FRAME16k]; - Word16 nb_bits; /* number of bits */ - Word16 indice; /* parameter indices to write */ - Word16 gain_buf_fx[NB_SUBFR16k]; - Word16 syn_fx_tmp2[L_FRAME_16k]; - Word16 pitch_buf_tmp[NB_SUBFR16k]; - Word16 update_flg; - Word32 q_env_fx[20]; - Word16 exc3_fx[L_FRAME16k]; - Word16 syn1_tmp_fx[L_FRAME16k + 2], *syn1_fx; - Word32 *realBuffer_fx[CLDFB_NO_COL_MAX], *imagBuffer_fx[CLDFB_NO_COL_MAX]; - Word32 realBufferTmp_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word32 imagBufferTmp_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word16 LSF_Q_prediction; /* LSF prediction mode */ - Word16 avoid_lpc_burst_on_recovery; - Word16 tmpF_fx; - Word16 uc_two_stage_flag; - Word16 tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag; - Word16 *old_exc_s_fx; /* Start of last excitation frame */ - Word16 *p_tdm_Pri_pitch_buf_fx; - Word16 local_element_mode; - ivas_error error; - - Word32 bpf_error_signal_fx[L_FRAME16k]; -#ifdef MSAN_FIX - set32_fx( bpf_error_signal_fx, 0, L_FRAME16k ); -#endif - Word16 bpf_error_signal_16fx[L_FRAME16k]; -#ifdef MSAN_FIX - set16_fx( bpf_error_signal_16fx, 0, L_FRAME16k ); -#endif - set16_fx( Aq_fx, 0, NB_SUBFR16k * ( M + 1 ) ); - set16_fx( old_bwe_exc_fx, 0, ( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 ) ); - Word16 tmp; - - error = IVAS_ERR_OK; - move32(); - - test(); - test(); - test(); - IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( nchan_out, 1 ) && EQ_16( st->idchan, 1 ) && LE_32( last_element_brate, IVAS_SID_5k2 ) ) - { - /* In MDCT-Stereo DTX with mono output, we can skip CNG for the second channel, except for the first inactive frame following an active period */ - return error; - } - - push_wmops( "acelp_core_dec" ); - - /* output_frame = (int16_t) ( st->output_Fs / FRAMES_PER_SEC ); */ - output_frame = extract_l( Mpy_32_32( st->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); - - /*----------------------------------------------------------------* - * stereo SID and CNG frames processing - *----------------------------------------------------------------*/ - test(); - test(); - IF( LE_32( st->core_brate, SID_2k40 ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) && EQ_16( nchan_out, 2 ) ) - { - IF( EQ_16( st->cng_type, FD_CNG ) ) - { - configureFdCngDec_fx( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); - Word16 old_NoiseEstExp; - old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; - move16(); - /* Only run parameter decoding in SID frames */ - IF( EQ_32( st->core_brate, SID_2k40 ) ) - { - FdCng_decodeSID_ivas_fx( st ); -#ifdef FIX_ISSUE_1218 - Word16 n1, n2; - n1 = L_norm_arr( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART ); - n2 = L_norm_arr( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART ); - - Word16 common_e = s_max( sub( old_NoiseEstExp, n2 ), sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, n1 ) ); - scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, common_e ) ); - scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( old_NoiseEstExp, common_e ) ); - st->hFdCngDec->hFdCngCom->sidNoiseEstExp = common_e; - move16(); -#else - rescale_fdCngDec( st->hFdCngDec, sub( old_NoiseEstExp, st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ); -#endif - } - FOR( i = 0; i < NPART; i++ ) - { - st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = Madd_32_32( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), - STEREO_DFT_FD_FILT_COMP_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEst[i] ); - move32(); - } - ApplyFdCng_ivas_fx( NULL, 0, NULL, 0, NULL, NULL, NULL, st, 0, 0 ); - } - ELSE - { - configureFdCngDec_fx( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); - - /* decode CNG parameters */ - CNG_dec_ivas_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); - - /* comfort noise generation */ - CNG_exc_fx( st->core_brate, st->L_frame, &st->hTdCngDec->Enew_fx, &st->hTdCngDec->cng_seed, NULL, NULL, &st->lp_ener_fx, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), NULL, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->prev_Q_exc, st->Q_exc, st->hTdCngDec->num_ho, q_env_fx, st->hTdCngDec->lp_env_fx, st->hTdCngDec->old_env_fx, st->hTdCngDec->exc_mem_fx, st->hTdCngDec->exc_mem1_fx, sid_bw, &st->hTdCngDec->cng_ener_seed1, NULL, st->Opt_AMR_WB, st->element_mode ); - - Copy( Aq_fx, st->Aq_cng, M + 1 ); /*Q12*/ - - /* update old LSP and LSF vector */ - Copy( lsf_new_fx, st->lsf_old_fx, M ); /*Qlog2(2.56)*/ - Copy( lsp_new_fx, st->lsp_old_fx, M ); /*Q15*/ - } - - set16_fx( output_fx, 0, output_frame ); /* output and synth are not used in DFT domain CNG generation and the decoder output is unaffected if they are left uninitalized */ - set16_fx( synth_fx16, 0, output_frame ); /* They are however read in a few places which causes errors in the valgrind tests. Simplest solution from a code perspective was to set them to zero. */ - - /* CN generation done in DFT domain */ - pop_wmops(); - - return error; - } - - /*----------------------------------------------------------------* - * Active frames processing - *----------------------------------------------------------------*/ - - /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - set32_fx( realBufferTmp_fx[i], 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( imagBufferTmp_fx[i], 0, CLDFB_NO_CHANNELS_MAX ); - realBuffer_fx[i] = realBufferTmp_fx[i]; - imagBuffer_fx[i] = imagBufferTmp_fx[i]; - } - /*----------------------------------------------------------------* - * Initialization - *----------------------------------------------------------------*/ - - LSF_Q_prediction = -1; - move16(); - set16_fx( syn_tmp_fx, 0, L_SUBFR ); - psyn_fx = syn_tmp_fx + L_SUBFR; - syn1_tmp_fx[0] = 0; - move16(); - syn1_tmp_fx[1] = 0; - move16(); - syn1_fx = syn1_tmp_fx + 2; - - st->bpf_off = 0; - move16(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( st->last_core, HQ_CORE ) || EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && LE_32( st->last_core_brate, SID_2k40 ) ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && LE_32( st->last_core_brate, SID_2k40 ) ) ) - { - /* in case of HQ->ACELP switching, do not apply BPF */ - st->bpf_off = 1; - move16(); - if ( st->hPFstat != NULL ) - { - /* in case of core switching, reset post-filter memories */ - st->hPFstat->on = 0; - move16(); - } - - if ( st->hGSCDec != NULL ) - { - /* reset the GSC pre echo energy threshold in case of switching */ - st->hGSCDec->Last_frame_ener_fx = MAX_32; - move32(); - } - } - - test(); - if ( st->hGSCDec != NULL && ( st->prev_bfi > 0 ) ) - { - /* reset the GSC pre echo energy threshold in case of FEC */ - st->hGSCDec->Last_frame_ener_fx = MAX_32; - move32(); - } - test(); - test(); - test(); - test(); - IF( st->hFdCngDec != NULL && ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && ( EQ_32( st->last_core_brate, SID_2k40 ) || st->last_core_brate == FRAME_NO_DATA ) ) - { - set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, FFTLEN ); - set16_fx( hStereoCng->olapBufferSynth22_fx, 0, FFTLEN ); - } - - st->clas_dec = st->last_good; - move16(); - enr_q_fx = 0; - move32(); - Es_pred_fx = 0; - move16(); - tmp_noise_fx = 0; - move16(); - Copy( st->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); /*Q_exc*/ - exc_fx = old_exc_fx + L_EXC_MEM_DEC; - - IF( st->hWIDec != NULL ) - { - Copy( st->hWIDec->old_exc2_fx, old_exc2_fx, L_EXC_MEM ); - } - ELSE - { - set16_fx( old_exc2_fx, 0, L_EXC_MEM ); - } - exc2_fx = old_exc2_fx + L_EXC_MEM; - - IF( st->hBWE_TD != NULL ) - { - Copy( st->hBWE_TD->old_bwe_exc_fx, old_bwe_exc_fx, PIT16k_MAX * 2 ); /*Q_exc*/ - bwe_exc_fx = old_bwe_exc_fx + PIT16k_MAX * 2; - } - ELSE - { - bwe_exc_fx = NULL; - } - - last_pulse_pos = 0; - move16(); - do_WI = 0; - move16(); - st->GSC_noisy_speech = 0; - move16(); - st->relax_prev_lsf_interp = 0; - move16(); - set16_fx( gain_buf_fx, 0, NB_SUBFR16k ); - - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - st->gamma = GAMMA1; - move16(); - st->inv_gamma = GAMMA1_INV; - move16(); - st->preemph_fac = PREEMPH_FAC; - move16(); - int_fs = INT_FS_12k8; - move16(); - } - ELSE - { - st->gamma = GAMMA16k; - move16(); - st->inv_gamma = GAMMA16k_INV; - move16(); - st->preemph_fac = PREEMPH_FAC_16k; - move16(); - int_fs = INT_FS_16k; - move16(); - } - test(); - /* reset post-filter in case of switching */ - if ( st->hPFstat != NULL && ( st->hPFstat->on == 0 ) ) - { - st->hPFstat->reset = 1; - move16(); - } - - avoid_lpc_burst_on_recovery = 0; - move16(); - test(); - test(); - if ( st->last_con_tcx && NE_16( st->L_frameTCX_past, st->L_frame ) && ( st->last_core != 0 ) ) - { - avoid_lpc_burst_on_recovery = 1; - move16(); - } - test(); - /* TD stereo parameters */ - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( st->idchan, 1 ) ) - { - tdm_lp_reuse_flag = hStereoTD->tdm_lp_reuse_flag; - move16(); - tdm_low_rate_mode = hStereoTD->tdm_low_rate_mode; - move16(); - tdm_Pitch_reuse_flag = hStereoTD->tdm_Pitch_reuse_flag; - move16(); - p_tdm_Pri_pitch_buf_fx = hStereoTD->tdm_Pri_pitch_buf_fx; - } - ELSE - { - tdm_lp_reuse_flag = 0; - move16(); - tdm_low_rate_mode = 0; - move16(); - test(); - if ( EQ_16( st->element_mode, IVAS_SCE ) && st->low_rate_mode ) - { - tdm_low_rate_mode = 1; - move16(); - } - tdm_Pitch_reuse_flag = 0; - move16(); - p_tdm_Pri_pitch_buf_fx = NULL; - } - - /*----------------------------------------------------------------* - * Updates in case of internal sampling rate switching - *----------------------------------------------------------------*/ - test(); - test(); - IF( NE_16( st->last_L_frame, st->L_frame ) && ( st->last_core == ACELP_CORE || EQ_16( st->last_core, AMR_WB_CORE ) ) ) - { - Word16 dec; - - IF( ( st->hPFstat->on != 0 ) ) - { - Word16 mem_syn_r_size_old, mem_syn_r_size_new; - mem_syn_r_size_old = mult_r( 2048, st->last_L_frame ); /* 1.25/20.f = 2048 (Q15)*/ - mem_syn_r_size_new = mult_r( 2048, st->L_frame ); /* 1.25/20.f = 2048 (Q15)*/ - lerp( st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); - lerp( st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); - } - - /* convert quantized LSP vector */ - st->rate_switching_reset = lsp_convert_poly_fx( st->lsp_old_fx, st->L_frame, 0 ); - move16(); - - /* convert old quantized LSF vector */ - lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, int_fs ); - - /* FEC - update adaptive LSF mean vector */ - Copy( st->lsf_old_fx, st->lsfoldbfi1_fx, M ); /*Qlog2(2.56)*/ - Copy( st->lsf_old_fx, st->lsfoldbfi0_fx, M ); /*Qlog2(2.56)*/ - Copy( st->lsf_old_fx, st->lsf_adaptive_mean_fx, M ); /*Qlog2(2.56)*/ - - /* Reset LPC mem */ - IF( EQ_32( st->sr_core, INT_FS_16k ) ) - { - Copy( GEWB2_Ave_fx, st->mem_AR_fx, M ); /*Qlog2(2.56)*/ - } - ELSE - { - Copy( GEWB_Ave_fx, st->mem_AR_fx, M ); /*Qlog2(2.56)*/ - } - set16_fx( st->mem_MA_fx, 0, M ); - - /* update synthesis filter memories */ - dec = DEC; - move16(); - if ( st->element_mode != EVS_MONO ) - { - dec = DEC_IVAS; - move16(); - } - ivas_synth_mem_updt2_fx( st->L_frame, st->last_L_frame, st->old_exc_fx, st->mem_syn_r, st->mem_syn2_fx, NULL, dec ); - Copy( st->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); /*Q_exc*/ - Copy_Scale_sig( st->mem_syn2_fx, st->mem_syn1_fx, M, sub( -1, st->Q_syn ) ); /*Q-1*/ - Copy( st->mem_syn2_fx, st->mem_syn3_fx, M ); /*Q_syn*/ - } - - /* update buffer of old subframe pitch values */ - IF( NE_16( st->last_L_frame, st->L_frame ) ) - { - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - IF( EQ_16( st->last_L_frame, L_FRAME32k ) ) - { - tmpF_fx = 13107; // Q15 - move16(); - } - ELSE IF( EQ_16( st->last_L_frame, 512 ) ) - { - tmpF_fx = 16384; // Q15 - move16(); - } - ELSE /* st->last_L_frame == L_FRAME16k */ - { - tmpF_fx = 26214; // Q15 - move16(); - } - - FOR( i = NB_SUBFR16k - NB_SUBFR; i < NB_SUBFR16k; i++ ) - { - st->old_pitch_buf_fx[i - 1] = Mpy_32_16_1( st->old_pitch_buf_fx[i], tmpF_fx ); // Q16 - move32(); - } - - FOR( i = 2 * NB_SUBFR16k - NB_SUBFR; i < 2 * NB_SUBFR16k; i++ ) - { - st->old_pitch_buf_fx[i - 2] = Mpy_32_16_1( st->old_pitch_buf_fx[i], tmpF_fx ); // Q16 - move32(); - } - } - ELSE - { - Word16 exp = 0; - move16(); - IF( EQ_16( st->last_L_frame, L_FRAME32k ) ) - { - tmpF_fx = 16384; // Q15 - move16(); - } - ELSE IF( EQ_16( st->last_L_frame, 512 ) ) - { - tmpF_fx = 20480; // Q15 - move16(); - } - ELSE /* st->last_L_frame == L_FRAME12k8 */ - { - tmpF_fx = 20480; // Q14 - move16(); - exp = 1; - move16(); - } - FOR( i = 2 * NB_SUBFR - 1; i >= NB_SUBFR; i-- ) - { - st->old_pitch_buf_fx[i + 2] = Mpy_32_16_1( L_shl( st->old_pitch_buf_fx[i], exp ), tmpF_fx ); // Q15 - move32(); - } - st->old_pitch_buf_fx[NB_SUBFR + 1] = st->old_pitch_buf_fx[NB_SUBFR + 2]; - move32(); - - FOR( i = NB_SUBFR - 1; i >= 0; i-- ) - { - st->old_pitch_buf_fx[i + 1] = Mpy_32_16_1( L_shl( st->old_pitch_buf_fx[i], exp ), tmpF_fx ); // Q15 - move32(); - } - st->old_pitch_buf_fx[0] = st->old_pitch_buf_fx[1]; - move32(); - } - } - - IF( NE_16( st->bfi_pitch_frame, st->L_frame ) ) - { - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - IF( EQ_16( st->bfi_pitch_frame, L_FRAME32k ) ) - { - tmpF_fx = 13107; // Q15 - move16(); - } - ELSE IF( EQ_16( st->bfi_pitch_frame, 512 ) ) - { - tmpF_fx = 16384; // Q15 - move16(); - } - ELSE /* st->bfi_pitch_frame == L_FRAME16k */ - { - tmpF_fx = 26214; // Q15 - move16(); - } - st->bfi_pitch_fx = mult_r( st->bfi_pitch_fx, tmpF_fx ); - move16(); - st->bfi_pitch_frame = L_FRAME; - move16(); - } - ELSE - { - Word16 exp = 0; - move16(); - IF( EQ_16( st->bfi_pitch_frame, L_FRAME32k ) ) - { - tmpF_fx = 16384; // Q15 - move16(); - } - ELSE IF( EQ_16( st->bfi_pitch_frame, 512 ) ) - { - tmpF_fx = 20480; // Q15 - move16(); - } - ELSE /* st->bfi_pitch_frame == L_FRAME12k8 */ - { - tmpF_fx = 20480; // Q14 - move16(); - exp = 1; - move16(); - } - st->bfi_pitch_fx = mult_r( shl_sat( st->bfi_pitch_fx, exp ), tmpF_fx ); - move16(); - st->bfi_pitch_frame = L_FRAME16k; - move16(); - } - } - test(); - test(); - if ( EQ_16( st->last_bwidth, NB ) && NE_16( st->bwidth, NB ) && ( st->ini_frame != 0 ) ) - { - st->rate_switching_reset = 1; - move16(); - } - - /*----------------------------------------------------------------------* - * GOOD frame - *----------------------------------------------------------------------*/ - - IF( !st->bfi ) - { - - /*----------------------------------------------------------------* - * Decoding of TC subframe classification - *----------------------------------------------------------------*/ - - tc_subfr = -1; - move16(); - IF( EQ_16( st->coder_type, TRANSITION ) ) - { - tc_subfr = tc_classif_fx( st, st->L_frame ); - } - - /*----------------------------------------------------------------* - * Decoding of GSC IVAS mode - *----------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - IF( st->element_mode > EVS_MONO && st->idchan == 0 && !( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) && !tdm_low_rate_mode ) - { - test(); - test(); -#ifdef FIX_1189_GSC_IVAS_OMASA - IF( EQ_16( st->coder_type, AUDIO ) || ( EQ_16( st->coder_type, INACTIVE ) && EQ_16( st->inactive_coder_type_flag, 1 ) ) ) -#else - IF( EQ_16( st->coder_type, AUDIO ) || ( st->coder_type == INACTIVE && LE_32( st->total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) -#endif - { - st->GSC_IVAS_mode = get_next_indice_fx( st, 2 ); - move16(); - } - } - - /*----------------------------------------------------------------* - * Decoding of inactive CNG frames - *----------------------------------------------------------------*/ - test(); - IF( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) - { - /* decode CNG parameters */ - IF( st->cng_type == LP_CNG ) - { - CNG_dec_ivas_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); -#ifndef FIX_1100_REMOVE_LPC_RESCALING - FOR( Word32 nsf = 0; nsf < NB_SUBFR16k; nsf++ ) - { - Scale_sig( Aq_fx + imult3216( nsf, ( M + 1 ) ), M + 1, sub( norm_s( Aq_fx[nsf * ( M + 1 )] ), Q2 ) ); - Aq_fx[nsf * ( M + 1 )] = ONE_IN_Q12; - move16(); - } -#endif - Copy( Aq_fx, st->Aq_cng, add( M, 1 ) ); - - /* comfort noise generation */ - local_element_mode = st->element_mode; - move16(); - test(); - test(); - if ( ( EQ_16( nchan_out, 1 ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) ) || EQ_16( st->masa_sid_format, 1 ) ) - { - local_element_mode = IVAS_SCE; /* For DFT Stereo mono decoding, run CNG_exc as in SCE */ - move16(); - } - CNG_exc_fx( st->core_brate, st->L_frame, &st->hTdCngDec->Enew_fx, &st->hTdCngDec->cng_seed, exc_fx, exc2_fx, &st->lp_ener_fx, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), bwe_exc_fx, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->prev_Q_exc, st->Q_exc, st->hTdCngDec->num_ho, q_env_fx, st->hTdCngDec->lp_env_fx, st->hTdCngDec->old_env_fx, st->hTdCngDec->exc_mem_fx, st->hTdCngDec->exc_mem1_fx, sid_bw, &st->hTdCngDec->cng_ener_seed1, exc3_fx, st->Opt_AMR_WB, local_element_mode ); - } - ELSE - { - test(); - IF( EQ_32( st->core_brate, SID_2k40 ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) - { - Word16 old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; - move16(); - FdCng_decodeSID_ivas_fx( st ); - rescale_fdCngDec( st->hFdCngDec, sub( old_NoiseEstExp, st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ); - Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, M + 1, sub( norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] ), Q2 ) ); // Qx - *sid_bw = 0; - move16(); - } - - IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) - { - assert( nchan_out == 1 ); - - FOR( i = 0; i < NPART; i++ ) - { - st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = Madd_32_32( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), - STEREO_DFT_FD_FILT_COMP_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEst[i] ); - move32(); - } - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); - Word16 new_sidNoiseEstExp = 31 - Q4; - move16(); - Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, new_sidNoiseEstExp ) ); // Q(31-sidNoiseEstExp) - Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, new_sidNoiseEstExp ) ); // Q(31-sidNoiseEstExp) - st->hFdCngDec->hFdCngCom->sidNoiseEstExp = new_sidNoiseEstExp; - move16(); - Word16 new_cngNoiseLevelExp = 31 - Q4; - move16(); - Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, sub( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, new_cngNoiseLevelExp ) ); // Q(31-cngNoiseLevelExp) - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = new_cngNoiseLevelExp; - move16(); - - test(); - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) ); - - IF( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0 ) - { - Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ); // Q(31-cngNoiseLevelExp) - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; - move16(); - } - } - - IF( !read_sid_info ) - { - Word32 noise_lvl_highest_fx; - - noise_lvl_highest_fx = st->hFdCngDec->hFdCngCom->cngNoiseLevel[( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ) - 1]; - move32(); - FOR( Word16 b = ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); b < st->hFdCngDec->hFdCngCom->stopBand; b++ ) - { - st->hFdCngDec->hFdCngCom->cngNoiseLevel[b] = noise_lvl_highest_fx; - move32(); - } - } - - generate_comfort_noise_dec_ivas_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 1, nchan_out ); - - FdCng_exc( st->hFdCngDec->hFdCngCom, &st->CNG_mode, st->L_frame, st->lsp_old_fx, st->first_CNG, st->lspCNG_fx, Aq_fx, lsp_new_fx, lsf_new_fx, exc_fx, exc2_fx, bwe_exc_fx ); - - Copy( exc2_fx, exc3_fx, st->L_frame ); - } - - Word16 delta_mem_scale = 3; - move16(); - test(); - if ( LT_32( st->lp_ener_fx, 40 ) && st->cng_type == LP_CNG ) /* very low energy frames, less than 0.3125 */ - { - delta_mem_scale = 0; - move16(); - } - i = st->Q_exc; - move16(); - test(); - IF( st->hMusicPF && st->hGSCDec ) - { - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, -#ifdef FIX_ISSUE_1291 - L_FRAME32k, 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); -#else - imult1616( st->L_frame, HIBND_ACB_L_FAC ), 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); -#endif - } - IF( st->hPFstat != NULL ) - { - Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, delta_mem_scale, - &st->mem_deemph_fx, st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, 0, 0, NULL ); - } - ELSE - { - Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, delta_mem_scale, - &st->mem_deemph_fx, NULL, NULL, &st->agc_mem_fx[1], NULL, 0, 0, NULL ); - } - Copy_Scale_sig( exc2_fx, exc2_fx, st->L_frame, sub( st->Q_exc, i ) ); // Q_exc - - /* update past excitation signals for LD music post-filter */ - IF( st->hMusicPF != NULL ) - { - Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - - /* Update music post processing values */ - /* Filter energies update */ - FOR( i = 0; i < DCT_L_POST; i++ ) - { - st->hMusicPF->filt_lfE_fx[i] = add( 9830, mult_r( 22937, st->hMusicPF->filt_lfE_fx[i] ) ); // Q15, 9830 =.3f in Q15, 22937=.7f in Q15 - move16(); - } - } - - - /* synthesis at 12.8kHz sampling rate */ -#ifndef FIX_1100_REMOVE_LPC_RESCALING - Aq_fx[0] = ONE_IN_Q12; -#endif - move16(); - syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); - syn_12k8_fx( st->L_frame, Aq_fx, exc3_fx, syn1_fx, st->mem_syn3_fx, 1, st->Q_exc, st->Q_syn ); - st->Q_syn_cng = st->Q_syn; - move16(); - st->Q_exc_cng = st->Q_exc; - move16(); - /* reset the decoder */ - CNG_reset_dec_fx( st, pitch_buf_fx, voice_factors_fx ); - - /* update st->mem_syn1 for ACELP core switching */ - Copy_Scale_sig( st->mem_syn3_fx, st->mem_syn1_fx, M, sub( -1, st->Q_syn ) ); // Q(-1) - - /* update old synthesis for classification */ - Copy( syn1_fx + st->L_frame - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); - - /* save and delay synthesis to be used by SWB BWE */ - Copy_Scale_sig( syn1_fx, temp_buf_fx, st->L_frame, sub( -1, st->Q_syn ) ); // Q_syn -> Q(-1) - IF( st->hBWE_FD != NULL ) - { -#ifdef FIX_ISSUE_1290 - save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); -#else - save_old_syn_fx( st->L_frame, syn1_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); -#endif - } - } - - /*----------------------------------------------------------------* - * Decoding of all other frames - *----------------------------------------------------------------*/ - - ELSE - { - - /*-----------------------------------------------------------------* - * Configure ACELP bit allocation - *-----------------------------------------------------------------*/ - - nb_bits = 0; - move16(); - st->acelp_cfg.FEC_mode = 0; - move16(); - uc_two_stage_flag = 0; - move16(); - test(); - IF( !st->nelp_mode_dec && !st->ppp_mode_dec ) - { - Word16 tc_subfr_tmp; - - tc_subfr_tmp = tc_subfr; - move16(); - if ( LT_16( tc_subfr_tmp, L_SUBFR ) ) - { - tc_subfr_tmp = 0; - move16(); - } - - if ( EQ_16( tc_subfr, TC_0_192 ) ) - { - nb_bits = -1; - move16(); - } - -#ifdef NONBE_FIX_GSC_BSTR - config_acelp1_IVAS( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, st->inactive_coder_type_flag, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#else - config_acelp1_IVAS( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#endif - - test(); - test(); - IF( EQ_16( st->coder_type, TRANSITION ) && LT_16( tc_subfr, L_SUBFR ) && EQ_16( st->L_frame, L_FRAME ) ) - { -#ifdef NONBE_FIX_GSC_BSTR - config_acelp1_IVAS( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, TRANSITION, -1, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#else - config_acelp1_IVAS( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#endif - } - } - - /*-----------------------------------------------------------------* - * After CNG period, use the most up-to-date LSPs - *-----------------------------------------------------------------*/ - - test(); - test(); - IF( st->hTdCngDec != NULL && ( st->last_core_brate == FRAME_NO_DATA || EQ_32( st->last_core_brate, SID_2k40 ) ) ) - { - Copy( st->lspCNG_fx, st->lsp_old_fx, M ); /*Q15*/ - lsp2lsf_fx( st->lspCNG_fx, st->lsf_old_fx, M, int_fs ); - } - - /*-----------------------------------------------------------------* - * Reset higher ACELP pre-quantizer in case of switching - *-----------------------------------------------------------------*/ - - IF( !st->use_acelp_preq ) - { - st->mem_preemp_preQ_fx = 0; - move16(); - st->last_nq_preQ = 0; - move16(); - st->last_code_preq = 0; - move16(); - } - st->use_acelp_preq = 0; - move16(); - /*-----------------------------------------------------------------* - * LSF de-quantization and interpolation - *-----------------------------------------------------------------*/ - - IF( !tdm_lp_reuse_flag ) - { - lsf_dec_ivas_fx( st, tc_subfr, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode, tdm_lsfQ_PCh_fx ); - } - ELSE - { - const Word16 *pt_interp_2_fx; - - IF( NE_16( st->active_cnt, 1 ) ) - { - Word16 beta_index; - - beta_index = get_next_indice_fx( st, TDM_IC_LSF_PRED_BITS ); - tdm_SCh_lsf_reuse_fx( DEC, st->element_brate, lsf_new_fx, lsp_new_fx, tdm_lsfQ_PCh_fx, NULL, &beta_index ); - } - ELSE - { - Copy( tdm_lspQ_PCh_fx, lsp_new_fx, M ); - Copy( tdm_lsfQ_PCh_fx, lsf_new_fx, M ); - } - - IF( st->rate_switching_reset ) - { - /* extrapolation in case of unstable LSF convert */ - Copy( lsp_new_fx, st->lsp_old_fx, M ); - Copy( lsf_new_fx, st->lsf_old_fx, M ); - } - - pt_interp_2_fx = interpol_frac_fx; - test(); - if ( EQ_16( tdm_low_rate_mode, 1 ) && GT_16( st->coder_type, UNVOICED ) ) - { - pt_interp_2_fx = interpol_frac2_fx; - } - - IF( EQ_16( st->active_cnt, 1 ) ) - { - Copy( lsp_new_fx, st->lsp_old_fx, M ); - lsp2lsf_fx( lsp_new_fx, st->lsf_old_fx, M, st->sr_core ); - } - - /* LSP interpolation and conversion of LSPs to A(z) */ - int_lsp_fx( st->L_frame, st->lsp_old_fx, lsp_new_fx, Aq_fx, M, pt_interp_2_fx, 0 ); - /* Check LSF stability (distance between old LSFs and current LSFs) */ - st->stab_fac_fx = lsf_stab_ivas_fx( lsf_new_fx, st->lsf_old_fx, 0, st->L_frame ); - move16(); - } -#ifndef FIX_1100_REMOVE_LPC_RESCALING -#ifndef MSAN_FIX - for ( int nsf = 0; nsf < NB_SUBFR16k; nsf++ ) -#else - FOR( Word32 nsf = 0; nsf < st->nb_subfr; nsf++ ) -#endif - { - Scale_sig( Aq_fx + imult3216( nsf, ( M + 1 ) ), M + 1, sub( norm_s( Aq_fx[nsf * ( M + 1 )] ), Q2 ) ); // Q(x-2) - Aq_fx[nsf * ( M + 1 )] = ONE_IN_Q12; - move16(); - } -#endif - test(); - IF( EQ_16( st->last_core, HQ_CORE ) && st->element_mode > EVS_MONO ) - { - /* Prepare ACB memory from last HQ frame */ - old_exc_s_fx = st->old_exc_fx + sub( L_EXC_MEM_DEC, st->L_frame ); - tmpF_fx = *old_exc_s_fx; - st->mem_deemph_fx = shl_sat( old_exc_s_fx[st->L_frame - 1], st->Q_syn ); /* Q0 -> Q_syn */ - move16(); - PREEMPH_FX( old_exc_s_fx, st->preemph_fac, L_FRAME16k, &tmpF_fx ); - Copy( old_exc_s_fx + sub( st->L_frame, M ), st->mem_syn2_fx, M ); - Scale_sig( st->mem_syn2_fx, M, st->Q_syn ); /* Q0 -> Q_syn */ - Residu3_fx( Aq_fx, old_exc_s_fx, old_exc_fx + sub( L_EXC_MEM_DEC, st->L_frame ), st->L_frame, 0 ); - Scale_sig( old_exc_fx + sub( L_EXC_MEM_DEC, st->L_frame ), st->L_frame, st->Q_exc ); /* Q0 -> Q_exc */ - } - test(); - IF( st->last_core != ACELP_CORE && st->element_mode > EVS_MONO ) - { - /* Prepare ACB memory of old_bwe_exc */ - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - lerp( old_exc_fx, old_bwe_exc_fx, L_EXC_MEM_DEC * HIBND_ACB_L_FAC, L_EXC_MEM_DEC ); - } - ELSE - { - lerp( old_exc_fx, old_bwe_exc_fx, L_EXC_MEM_DEC << 1, L_EXC_MEM_DEC ); - } - } - - /*-----------------------------------------------------------------* - * FEC - first good frame after lost frame(s) (possibility to correct the ACB) - *-----------------------------------------------------------------*/ - - IF( st->acelp_cfg.FEC_mode > 0 ) - { - last_pulse_pos = 0; - move16(); - /* decode the last glottal pulse position */ - T0_tmp = FEC_pos_dec_fx( st, &last_pulse_pos, &enr_q_fx, nb_bits ); - test(); - test(); - IF( NE_16( st->last_core, HQ_CORE ) || ( EQ_16( st->last_core, HQ_CORE ) && st->last_con_tcx ) ) - { - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( st->clas_dec, SIN_ONSET ) && last_pulse_pos != 0 && EQ_16( st->prev_bfi, 1 ) ) - { - FEC_SinOnset_fx( old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, last_pulse_pos, T0_tmp, enr_q_fx, Aq_fx, st->L_frame, st->Q_exc ); - } - ELSE IF( ( EQ_16( st->coder_type, GENERIC ) || EQ_16( st->coder_type, VOICED ) ) && last_pulse_pos != 0 && EQ_16( st->old_bfi_cnt, 1 ) && st->hWIDec != NULL ) - { - do_WI = FEC_enhACB_fx( st->L_frame, st->last_L_frame, old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, T0_tmp, last_pulse_pos, st->bfi_pitch_fx ); - } - } - } - - /*------------------------------------------------------------* - * In case of first frame after an erasure and transition from voiced to unvoiced or inactive - * redo the LPC interpolation - *------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( st->stab_fac_fx == 0 ) && ( st->old_bfi_cnt > 0 ) && NE_16( st->clas_dec, VOICED_CLAS ) && NE_16( st->clas_dec, ONSET ) && ( st->relax_prev_lsf_interp == 0 ) && !( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( st->idchan, 1 ) ) ) - { - int_lsp4_ivas_fx( st->L_frame, st->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); - } - - /*---------------------------------------------------------------* - * Decoding of the scaled predicted innovation energy - *---------------------------------------------------------------*/ - - IF( nb_bits > 0 ) - { - indice = get_next_indice_fx( st, nb_bits ); - Es_pred_dec_fx( &Es_pred_fx, indice, nb_bits, uc_two_stage_flag ); - } - - /*------------------------------------------------------------* - * Decode excitation according to coding type - *------------------------------------------------------------*/ - test(); - test(); - IF( tdm_low_rate_mode ) /* tdm stereo low rate mode */ - { - IF( LE_16( st->coder_type, UNVOICED ) ) - { - tdm_low_rate_dec_fx( st, dct_exc_tmp_fx /*, &tmp_noise*/, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx ); - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - } - ELSE /* GENERIC */ - { - decod_gen_2sbfr_ivas_fx( st, sharpFlag, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); - - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - } - } - } - ELSE IF( st->nelp_mode_dec ) - { - /* SC-VBR - NELP frames */ - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); // Q0 - st->Q_exc = 0; - move16(); - /* SC-VBR - NELP frames */ - decod_nelp_fx( st, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors_fx, bwe_exc_fx, &st->Q_exc, st->bfi, gain_buf_fx ); - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); - } - ELSE IF( EQ_16( st->coder_type, UNVOICED ) ) - { - /* UNVOICED frames */ - decod_unvoiced_ivas_fx( st, Aq_fx, Es_pred_fx, uc_two_stage_flag, st->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx ); - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - } - ELSE IF( st->ppp_mode_dec ) - { - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); // Q0 - st->Q_exc = 0; - move16(); - /* SC-VBR - PPP frames */ - IF( NE_32( ( error = decod_ppp_fx( st, Aq_fx, pitch_buf_fx, exc_fx, exc2_fx, st->bfi, gain_buf_fx, voice_factors_fx, bwe_exc_fx ) ), IVAS_ERR_OK ) ) - { - return error; - } - - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); - } - ELSE IF( EQ_16( st->coder_type, TRANSITION ) ) - { - decod_tran_fx( st, st->L_frame, tc_subfr, Aq_fx, Es_pred_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, sharpFlag, gain_buf_fx ); - } - ELSE IF( EQ_16( st->coder_type, AUDIO ) || ( ( st->coder_type == INACTIVE ) && st->inactive_coder_type_flag ) ) - { - /* AUDIO and INACTIVE frames (coded by GSC technology) */ - decod_audio_ivas_fx( st, dct_exc_tmp_fx, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf_fx, - tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - } - ELSE - { - /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ - IF( NE_32( ( error = decod_gen_voic_ivas_fx( st, st->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - } - } - - /* synthesis for ACELP core switching and SWB BWE */ - syn_12k8_fx( st->L_frame, Aq_fx, exc_fx, temp_buf_fx, st->mem_syn1_fx, 1, st->Q_exc, -1 ); - - /* save and delay synthesis to be used by SWB BWE */ - IF( st->hBWE_FD != NULL ) - { - save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); - } - - /*-----------------------------------------------------------------* - * Apply energy matching when switching to inactive frames - *-----------------------------------------------------------------*/ - -#ifdef NONBE_FIX_GSC_BSTR - Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); -#else - Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->L_frame, st->total_brate, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); -#endif - - /*------------------------------------------------------------* - * Decode information and modify the excitation signal of stationary unvoiced frames - *------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - IF( !( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) ) && NE_16( st->nelp_mode_dec, 1 ) && !( EQ_16( st->element_mode, IVAS_SCE ) && tdm_low_rate_mode ) ) - { - stat_noise_uv_dec_fx( st, lsp_new_fx, lsp_mid_fx, Aq_fx, exc2_fx, uc_two_stage_flag ); - } - - /*------------------------------------------------------------* - * Save filter memory in case the synthesis is redone after scaling - * Synthesis at 12k8 Hz sampling rate - *------------------------------------------------------------*/ - - /* update past excitation signals for LD music post-filter */ - IF( st->hMusicPF != NULL ) - { - Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - Copy( st->hMusicPF->dct_post_old_exc_fx, exc_buffer_fx, DCT_L_POST - OFFSET2 ); - } - - test(); - test(); - test(); - IF( ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) || ( GE_16( st->GSC_IVAS_mode, 1 ) && EQ_16( st->L_frame, L_FRAME ) ) ) - { - Word16 last_coder_type = st->last_coder_type; - move16(); - test(); - test(); - test(); - if ( ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) ) || ( GE_16( st->GSC_IVAS_mode, 1 ) && ( st->GSC_noisy_speech == 0 ) ) ) - { - last_coder_type = AUDIO; - move16(); - } - - Word16 qdct = 0; - move16(); - /* Extrapolation of the last future part, windowing and high resolution DCT transform */ - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_core, st->element_mode, pitch_buf_fx, st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); - - /* LD music post-filter */ - LD_music_post_filter_fx( st->hMusicPF, dct_buffer_fx, dct_buffer_fx, st->core_brate, &st->hMusicPF->Old_ener_Q, AUDIO, last_coder_type, qdct ); - - /* Inverse DCT transform, retrieval of the aligned excitation, re-synthesis */ - Copy( st->mem_syn2_fx, mem_tmp_fx, M ); /*Q_syn*/ - Post_music_postP_fx( dct_buffer_fx, exc2_fx, st->mem_syn2_fx, st->mem_syn2_fx, Aq_fx, psyn_fx, &st->Q_exc, &st->prev_Q_syn, - &st->Q_syn, st->mem_syn_clas_estim_fx, 0, &st->mem_deemph_fx, st->hBPF->pst_old_syn_fx, - &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, temp_buf_fx, mem_tmp_fx ); - } - ELSE - { - /* Core synthesis at 12.8kHz or 16kHz */ - i = 1; - move16(); - test(); - if ( st->coder_type == INACTIVE && st->element_mode == EVS_MONO ) - { - i = 0; - move16(); - } - /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ - Word16 k = 0; - move16(); - test(); - test(); - if ( st->coder_type == INACTIVE && st->flag_cna && GE_16( round_fx( L_shl( st->lp_noise, 1 ) ), 15 << 7 ) ) - { - k = 1; - move16(); - } - - Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, 4, &st->mem_deemph_fx, - st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, i, k, temp_buf_fx ); - - Copy( st->mem_syn2_fx, mem_tmp_fx, M ); /*Q_syn*/ - syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); - - IF( st->hMusicPF != NULL ) - { - FOR( i = 0; i < DCT_L_POST; i++ ) - { - st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, st->hMusicPF->filt_lfE_fx[i] ) ); - move16(); - } - } - } - - /*------------------------------------------------------------* - * FEC - Estimate the classification information - *------------------------------------------------------------*/ - FEC_clas_estim_fx( st, st->Opt_AMR_WB, st->L_frame, &st->clas_dec, st->coder_type, pitch_buf_fx, - psyn_fx, &st->lp_ener_FER_fx, &st->decision_hyst, - NULL, NULL, NULL, NULL, 0, NULL, st->Q_syn, temp_buf_fx, - st->mem_syn_clas_estim_fx, &st->classifier_Q_mem_syn, - 0, 0, 0, st->last_core_brate, st->acelp_cfg.FEC_mode ); - /*------------------------------------------------------------* - * FEC - Estimate pitch - *------------------------------------------------------------*/ - - FEC_pitch_estim_fx( st->Opt_AMR_WB, st->last_core, st->L_frame, st->clas_dec, st->last_good, pitch_buf_fx, st->old_pitch_buf_fx, - &st->bfi_pitch_fx, &st->bfi_pitch_frame, &st->upd_cnt, st->coder_type, st->element_mode ); - - /*------------------------------------------------------------* - * FEC - Smooth the speech energy evolution when recovering after a BAD frame - * (smoothing is performed in the excitation domain and signal is resynthesized after) - *------------------------------------------------------------*/ - - - Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - FEC_scale_syn_ivas_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, - &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, 0 ); - test(); - test(); - test(); - test(); - /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ - IF( ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && LE_32( st->total_brate, ACELP_7k20 ) ) || EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) - { - frame_ener_fx( st->L_frame, st->clas_dec, psyn_fx, pitch_buf_tmp[( ( st->L_frame ) >> 6 ) - 1], &st->enr_old_fx, st->L_frame, st->Q_syn, 3, 0 ); - } - } - - } /* End of GOOD FRAME */ - - /*----------------------------------------------------------------* - * BAD frame - *----------------------------------------------------------------*/ - - ELSE - { - /* SC-VBR */ - if ( EQ_16( st->last_nelp_mode_dec, 1 ) ) - { - st->nelp_mode_dec = 1; - move16(); - } - test(); - test(); - /* long burst frame erasures */ - if ( GT_16( st->nbLostCmpt, 5 ) && GE_16( st->clas_dec, VOICED_CLAS ) && LT_16( st->clas_dec, INACTIVE_CLAS ) ) - { - st->last_good = VOICED_TRANSITION; - move16(); - } - - /* LSF estimation and A(z) calculation */ - lsf_dec_bfi( MODE1, lsf_new_fx, st->lsf_old_fx, st->lsf_adaptive_mean_fx, NULL, st->mem_MA_fx, st->mem_AR_fx, st->stab_fac_fx, st->last_coder_type, st->L_frame, st->last_good, st->nbLostCmpt, 0, NULL, NULL, NULL, st->hGSCDec->Last_GSC_pit_band_idx, st->Opt_AMR_WB, 0, st->bwidth ); - - FEC_lsf2lsp_interp( st, st->L_frame, Aq_fx, lsf_new_fx, lsp_new_fx ); -#ifndef FIX_1100_REMOVE_LPC_RESCALING -#ifndef MSAN_FIX - for ( int nsf = 0; nsf < NB_SUBFR16k; nsf++ ) -#else - FOR( Word32 nsf = 0; nsf < st->nb_subfr; nsf++ ) -#endif - { - Scale_sig( Aq_fx + imult3216( nsf, ( M + 1 ) ), M + 1, sub( norm_s( Aq_fx[nsf * ( M + 1 )] ), Q2 ) ); // Qx->Q(x-2) - Aq_fx[nsf * ( M + 1 )] = ONE_IN_Q12; - move16(); - } -#endif - IF( EQ_16( st->nelp_mode_dec, 1 ) ) - { - /* SC-VBR */ - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); // Q0 - st->Q_exc = 0; - move16(); - - decod_nelp_fx( st, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors_fx, bwe_exc_fx, &st->Q_exc, st->bfi, gain_buf_fx ); - FEC_pitch_fx = pitch_buf_fx[3]; - move16(); - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); - } - ELSE - { - /* calculation of excitation signal */ - FEC_exc_estim_fx( st, st->L_frame, exc_fx, exc2_fx, dct_exc_tmp_fx, pitch_buf_fx, voice_factors_fx, &FEC_pitch_fx, bwe_exc_fx, lsf_new_fx, &st->Q_exc, &tmp_noise_fx ); - - Rescale_exc( NULL, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, L_FRAME32k, (Word32) 0, - &( st->Q_exc ), st->Q_subfr, exc2_fx, st->L_frame, st->last_coder_type ); - - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - - /* SC-VBR */ - st->prev_gain_pit_dec_fx = st->lp_gainp_fx; - move16(); - } - - /* synthesis for ACELP core switching and SWB BWE */ - syn_12k8_fx( st->L_frame, Aq_fx, exc_fx, temp_buf_fx, st->mem_syn1_fx, 1, st->Q_exc, -1 ); - - /* save and delay synthesis to be used by SWB BWE */ - IF( st->hBWE_FD != NULL ) - { - save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); - } - - /* Apply energy matching when switching to inactive frames */ -#ifdef NONBE_FIX_GSC_BSTR - Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); -#else - Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->L_frame, st->total_brate, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); -#endif - - /* update past excitation signals for LD music post-filter */ - IF( st->hMusicPF != NULL ) - { - Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - - /* Update music post processing values */ - /* Filter energies update */ - FOR( i = 0; i < DCT_L_POST; i++ ) - { - st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( 1228 << 16, 22938, st->hMusicPF->filt_lfE_fx[i] ) ); - move16(); - } - /* Update circular buffer, keep last energy difference unchanged */ - FOR( i = 1; i < MAX_LT; i++ ) - { - st->hMusicPF->LDm_lt_diff_etot_fx[i - 1] = st->hMusicPF->LDm_lt_diff_etot_fx[i]; - move16(); - } - } - - /* synthesis at 12k8 Hz sampling rate */ - /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ - Word16 k = 0; - move16(); - test(); - test(); - if ( st->coder_type == INACTIVE && st->flag_cna && GE_16( round_fx( L_shl( st->lp_noise, 1 ) ), 15 << 7 ) ) - { - k = 1; - move16(); - } - - Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, 4, &st->mem_deemph_fx, - st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, 1, k, temp_buf_fx ); - test(); - IF( EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) - { - Copy( st->mem_syn2_fx, mem_tmp_fx, M ); - } - syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); - - /* update buffer for classifier */ - IF( st->hWIDec != NULL ) - { - Copy( exc2_fx + sub( st->L_frame, L_EXC_MEM ), st->hWIDec->old_exc2_fx, L_EXC_MEM ); - Copy( psyn_fx + sub( st->L_frame, L_EXC_MEM ), st->hWIDec->old_syn2_fx, L_EXC_MEM ); - } - st->prev_Q_exc_fr = st->Q_exc; - move16(); - st->prev_Q_syn_fr = st->Q_syn; - move16(); - Copy( psyn_fx + sub( st->L_frame, L_SYN_MEM_CLAS_ESTIM ), st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); - - /*------------------------------------------------------------* - * FEC - Smooth the speech energy evolution when recovering after a BAD frame - * (smoothing is performed in the excitation domain and signal is resynthesized after) - *------------------------------------------------------------*/ - test(); - IF( EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) - { - Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - - FEC_scale_syn_ivas_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, - &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, 0 ); - } - - /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ - frame_ener_fx( st->L_frame, st->last_good, psyn_fx, shr( add( FEC_pitch_fx, 32 ), 6 ), &st->enr_old_fx, st->L_frame, st->Q_syn, 3, 0 ); - - IF( NE_16( st->nelp_mode_dec, 1 ) ) - { - /* modify the excitation signal of stationary unvoiced frames */ - stat_noise_uv_mod_fx( st->coder_type, 0, st->lsp_old_fx, lsp_new_fx, lsp_new_fx, Aq_fx, exc2_fx, st->Q_exc, 1, &st->ge_sm_fx, - &st->uv_count, &st->act_count, st->lspold_s_fx, &st->noimix_seed, &st->min_alpha_fx, - &st->exc_pe_fx, st->core_brate, st->bwidth, &st->Q_stat_noise, &st->Q_stat_noise_ge ); - } - } - - IF( st->hBWE_TD != NULL ) - { - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - Copy( Aq_fx + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); - } - ELSE - { - Copy( Aq_fx + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); - } - } - - /*--------------------------------------------------------* - * Apply NB postfilter in case of 8kHz output - *--------------------------------------------------------*/ - test(); - IF( st->last_bwidth == NB && st->hPFstat != NULL ) - { - Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - IF( st->bwidth == NB ) - { - st->hPFstat->on = 1; - move16(); - nb_post_filt_fx( st->L_frame, st->hPFstat, &st->psf_lp_noise_fx, tmp_noise_fx, psyn_fx, Aq_fx, pitch_buf_tmp, st->coder_type, st->BER_detect, 0 ); - } - ELSE - { - st->hPFstat->on = 0; - move16(); - nb_post_filt_fx( st->L_frame, st->hPFstat, &st->psf_lp_noise_fx, tmp_noise_fx, psyn_fx, Aq_fx, pitch_buf_tmp, AUDIO, st->BER_detect, 0 ); - } - } - ELSE - { - st->psf_lp_noise_fx = round_fx( L_shl( st->lp_noise, 1 ) ); - move16(); - } - - /*------------------------------------------------------------------* - * Perform fixed deemphasis through 1/(1 - g*z^-1) - *-----------------------------------------------------------------*/ - - /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ - Copy( psyn_fx + sub( st->L_frame, L_SYN_MEM ), st->mem_syn_r, L_SYN_MEM ); - deemph_fx( psyn_fx, st->preemph_fac, st->L_frame, &( st->mem_deemph_fx ) ); - unscale_AGC( psyn_fx, st->Q_syn, syn_fx_tmp2, st->agc_mem_fx, st->L_frame ); - Copy( syn_fx_tmp2, psyn_fx, st->L_frame ); - IF( st->hTcxDec != NULL ) - { - Copy_Scale_sig( psyn_fx + shr( st->L_frame, 1 ), st->hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, st->Q_syn ) ); /*Q-1*/ - st->hTcxDec->Q_old_syn_Overl = -1; - } - Copy_Scale_sig( psyn_fx + sub( st->L_frame, M + 1 ), st->syn, M + 1, sub( 0, st->Q_syn ) ); /*Q0*/ - - /*------------------------------------------------------------------* - * Formant post-filter - *-----------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) && ( GT_32( st->core_brate, ACELP_24k40 ) || st->element_mode > EVS_MONO ) && LE_32( st->core_brate, ACELP_32k ) ) - { - st->hPFstat->on = 1; - move16(); - /*----ftf conversions---*/ - Copy( psyn_fx, temp_buf_fx + L_SYN_MEM, L_FRAME16k ); - - set16_fx( st->hPFstat->mem_zero, 0, M ); - - formant_post_filt_ivas_fx( st->hPFstat, temp_buf_fx + L_SYN_MEM, Aq_fx, psyn_fx, st->L_frame, st->lp_noise, st->total_brate, 0 ); - } - ELSE IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) ) - { - IF( st->hPFstat->on ) - { - Copy( st->hPFstat->mem_pf_in + L_SYN_MEM - M, temp_buf_fx, M ); - Copy( psyn_fx, temp_buf_fx + M, L_SUBFR ); - - Residu3_fx( Aq_fx, temp_buf_fx + M, temp_buf_fx + M + L_SUBFR, L_SUBFR, 1 ); - E_UTIL_synthesis( 1, Aq_fx, temp_buf_fx + M + L_SUBFR, temp_buf_fx, L_SUBFR, st->hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); - scale_st_fx( psyn_fx, temp_buf_fx, &st->hPFstat->gain_prec, L_SUBFR ); - Copy( temp_buf_fx, psyn_fx, ( L_SUBFR >> 1 ) ); - blend_subfr2_fx( temp_buf_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2 ); - } - st->hPFstat->on = 0; - move16(); - } - - /*----------------------------------------------------------------* - * Comfort noise addition - *----------------------------------------------------------------*/ - test(); - test(); - IF( ( st->hFdCngDec != NULL || EQ_16( st->idchan, 1 ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) - { - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) || st->flag_cna || ( EQ_16( st->cng_type, FD_CNG ) && LE_32( st->total_brate, ACELP_32k ) ) || ( st->cng_type == LP_CNG && LE_32( st->core_brate, SID_2k40 ) ) ) - { - /*VAD only for non inactive frame*/ - test(); - st->VAD = st->VAD && st->coder_type != INACTIVE; - move16(); - test(); - test(); - test(); - test(); - test(); - IF( st->idchan == 0 && ( st->flag_cna || ( EQ_16( st->cng_type, FD_CNG ) && LE_32( st->total_brate, ACELP_32k ) ) || ( st->cng_type == LP_CNG && LE_32( st->core_brate, SID_2k40 ) ) ) ) - { - /*Noisy speech detector*/ - noisy_speech_detection_fx( st->hFdCngDec, st->VAD, psyn_fx, st->Q_syn ); - - st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = mult_r( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 32440 /*0.99 Q15*/ ); - move16(); - IF( st->hFdCngDec->hFdCngCom->flag_noisy_speech != 0 ) - { - st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = add( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 328 /*0.01 Q15*/ ); - move16(); - } - move32(); - } - - if ( st->idchan == 0 ) - { - st->lp_noise = st->hFdCngDec->lp_noise; - move32(); - } - test(); - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && !st->cng_ism_flag ) - { - /*Noise estimate*/ - /*==========================================================*/ - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); - /*==========================================================*/ - } - - IF( !st->cna_dirac_flag ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - /* CNA: Generate additional comfort noise to mask potential coding artefacts */ - IF( st->flag_cna && !( EQ_16( st->coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->GSC_noisy_speech ) ) ) - { - test(); - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( nchan_out, 2 ) ) - { - IF( hStereoCng->flag_cna_fade ) - { - generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); - hStereoCng->flag_cna_fade = 0; - move16(); - } - ELSE - { - test(); - IF( NE_16( st->element_mode, last_element_mode ) && ( st->idchan == 0 ) ) - { - /* Clear memory for secondary channel CNA */ - set16_fx( hStereoCng->olapBufferSynth22_fx, 0, shr( st->hFdCngDec->hFdCngCom->frameSize, 1 ) ); - } - - generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out ); - } - } - ELSE IF( NE_16( st->element_mode, IVAS_CPE_DFT ) ) - { - IF( st->idchan == 0 ) - { - IF( NE_16( st->element_mode, last_element_mode ) ) - { - set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); - } - Word32 psyn_32_fx[L_FRAME16k]; - Word16 exp; - Copy_Scale_sig_16_32_no_sat( psyn_fx, psyn_32_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( Q6, st->Q_syn ) ); // Q6 - Copy_Scale_sig_16_32_no_sat( st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), Q15 ); // Q15 - generate_masking_noise_ivas_fx( psyn_32_fx, &exp, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); - Copy_Scale_sig_32_16( psyn_32_fx, psyn_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( st->Q_syn, exp ) ); // Q = st->Q_syn - Copy_Scale_sig_32_16( st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), -Q15 ); // Q0 - } - } - } - ELSE IF( st->flag_cna && EQ_16( st->coder_type, AUDIO ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, TCX_20_CORE ) ) ) - { - test(); - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( nchan_out, 2 ) ) - { - generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); - hStereoCng->flag_cna_fade = 1; - move16(); - } - ELSE - { - FOR( i = 0; i < ( st->hFdCngDec->hFdCngCom->frameSize ) / 2; i++ ) - { - psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * ( st->hFdCngDec->hFdCngCom->frameSize / 4 )], st->hFdCngDec->hFdCngCom->fftlenFac ), negate( st->Q_syn ) ) ); - move16(); - } - } - } - ELSE - { - IF( hStereoCng != NULL ) - { - hStereoCng->flag_cna_fade = 1; - move16(); - hStereoCng->enableSecCNA = 0; - move16(); - } - } - - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - test(); - test(); - test(); - /*Noise estimate*/ - IF( ( st->idchan == 0 ) && ( EQ_16( nchan_out, 2 ) || ( st->core_brate != FRAME_NO_DATA && NE_32( st->core_brate, SID_2k40 ) ) ) ) - { - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); - } - } - } - } - - IF( !st->cna_dirac_flag ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( st->flag_cna == 0 ) && EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->last_flag_cna, 1 ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, AMR_WB_CORE ) ) ) - { - FOR( i = 0; i < ( st->hFdCngDec->hFdCngCom->frameSize ) / 2; i++ ) - { - psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * ( st->hFdCngDec->hFdCngCom->frameSize / 4 )], st->hFdCngDec->hFdCngCom->fftlenFac ), -st->Q_syn ) ); - move16(); - } - } - - test(); - test(); - test(); - IF( ( st->flag_cna == 0 ) || ( EQ_16( st->coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->GSC_noisy_speech ) ) ) - { - IF( st->idchan == 0 ) - { - set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); - } - IF( hStereoCng != NULL && ( st->idchan == 0 ) ) - { - set16_fx( hStereoCng->olapBufferSynth22_fx, 0, st->hFdCngDec->hFdCngCom->fftlen ); - } - } - } - } - - /*----------------------------------------------------------------* - * Resample to the output sampling rate (8/16/32/48 kHz) - * Bass post-filter - *----------------------------------------------------------------*/ - - /* check if the CLDFB works on the right sample rate */ - IF( NE_16( imult1616( st->cldfbAna->no_channels, st->cldfbAna->no_col ), st->L_frame ) ) - { - resampleCldfb_ivas_fx( st->cldfbAna, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); - resampleCldfb_ivas_fx( st->cldfbBPF, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); - - IF( st->ini_frame > 0 ) - { - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); - move16(); - } - } - - /* analyze pitch coherence for bass post-filter */ - - Word32 pitch_buf_fx_q20[12]; - - Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, Q4 ); // Q(x+4) - Word16 lim = shr( st->L_frame, 6 ); - FOR( Word16 lp = 0; lp < lim; lp++ ) - { - pitch_buf_fx_q20[lp] = L_shl( pitch_buf_fx[lp], Q14 ); - move32(); - } - bpf_pitch_coherence_ivas_fx( st, pitch_buf_fx_q20 ); - Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, -Q4 ); // Qx - - test(); - IF( !( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->bpf_off ) ) - { - test(); - IF( NE_16( st->L_frame, st->last_L_frame ) && NE_16( st->last_codec_mode, MODE2 ) ) - { - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - retro_interp5_4_fx( st->hBPF->pst_old_syn_fx ); - } - ELSE IF( EQ_16( st->L_frame, L_FRAME16k ) ) - { - retro_interp4_5_fx( psyn_fx, st->hBPF->pst_old_syn_fx ); - } - } - - bass_psfilter_fx( st->hBPF, st->Opt_AMR_WB, psyn_fx, st->L_frame, pitch_buf_fx, st->bpf_off, - st->stab_fac_fx, &st->stab_fac_smooth_fx, st->coder_type, st->Q_syn, bpf_error_signal_16fx ); - } - - Word32 syn_tmp_32_fx[L_FRAME16k + L_SUBFR], *syn_32_fx; - set32_fx( syn_tmp_32_fx, 0, L_FRAME16k + L_SUBFR ); - syn_32_fx = syn_tmp_32_fx + L_SUBFR; - test(); - IF( NE_16( st->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft ) - { - /* analysis of the synthesis at internal sampling rate */ - Word32 realBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word32 imagBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word32 *pRealSave_fx[CLDFB_NO_COL_MAX], *pImagSave_fx[CLDFB_NO_COL_MAX]; - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - pRealSave_fx[i] = realBufferSave_fx[i]; - pImagSave_fx[i] = imagBufferSave_fx[i]; - } -#ifndef MSAN_FIX - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 -#endif - IF( st->p_bpf_noise_buf_32 ) - { -#ifdef MSAN_FIX - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 -#endif - Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); - Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11 - } - -#ifdef MSAN_FIX - FOR( i = 0; i < st->L_frame; i++ ) -#else - for ( i = 0; i < L_FRAME16k; i++ ) -#endif - { - syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); // Q12 - move32(); - } - - Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 - st->cldfbAna->Q_cldfb_state = Q12; - move16(); - cldfbAnalysis_ivas_fx( syn_32_fx, realBuffer_fx, imagBuffer_fx, -1, st->cldfbAna ); - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 - st->cldfbAna->Q_cldfb_state = Q11; - move16(); - /* analysis and add the BPF error signal */ - Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; - Word16 q_bpf_error_signal; - Word16 cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); - - q_bpf_error_signal = Q6; - move16(); -#ifdef MSAN_FIX -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 -#else - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 -#endif -#else - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, q_bpf_error_signal - st->Q_syn ); // Q6 -#endif - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - } - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) - st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; - move16(); - tmp = -1; - move16(); - if ( st->bpf_off ) - { - tmp = 0; - move16(); - } - - addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( ( sub( q_bpf_error_signal, Q10 ) ) ) ); // Q10 - st->cldfbBPF->Q_cldfb_state = Q10; - move16(); - /* set output mask for upsampling */ - IF( EQ_16( st->bwidth, NB ) ) - { - /* set NB mask for upsampling */ - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, 10 ); - move16(); - } - ELSE IF( NE_16( st->cldfbSyn->bandsToZero, sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ) ) ) - { - /* in case of BW switching, re-init to default */ - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); - move16(); - } - test(); - IF( !st->cng_sba_flag || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) - { - test(); - test(); - test(); - /*WB/SWB-FD_CNG*/ - IF( ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) && ( EQ_16( st->cng_type, FD_CNG ) ) && ( LT_16( st->hFdCngDec->hFdCngCom->numCoreBands, st->cldfbSyn->no_channels ) ) ) - { - Word16 tmpBufferScale = 0; - move16(); - generate_comfort_noise_dec_hf_ivas_fx( realBuffer_fx, imagBuffer_fx, /*realBuffer, imagBuffer,*/ &tmpBufferScale, st->hFdCngDec->hFdCngCom, st->cng_ism_flag ); - - FOR( i = 0; i < st->hFdCngDec->hFdCngCom->numSlots; i++ ) - { - Scale_sig32( realBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 - Scale_sig32( imagBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 - } - - IF( LT_16( st->hFdCngDec->hFdCngCom->regularStopBand, st->cldfbSyn->no_channels ) ) - { - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->hFdCngDec->hFdCngCom->regularStopBand ); - move16(); - } - ELSE - { - st->cldfbSyn->bandsToZero = 0; - move16(); - } - } - } - - IF( save_hb_synth_fx16 != NULL ) - { - /* save and then zero-out lowband */ - Word16 Q_real = 0, Q_imag = 0; - Word32 max_real = 0, max_imag = 0; - move16(); - move16(); - move32(); - move32(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); - max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); - } - } - Word32 max_val = L_max( max_real, max_imag ); - Q_imag = sub( norm_l( max_val ), 3 ) /* Guard bits */; - Q_real = Q_imag; - move16(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_imag ); // Q_imag - } -#ifdef OPT_STEREO_32KBPS_V1 - scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1) -#else /* OPT_STEREO_32KBPS_V1 */ - scale_sig32_r( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // (Q_real-1) -#endif /* OPT_STEREO_32KBPS_V1 */ - st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); - move16(); -#ifndef MSAN_FIX - Scale_sig32( save_hb_synth_fx, L_FRAME48k, sub( Q_real, 1 ) ); // Q_real-1 -#endif - - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - realBufferSave_fx[i][j] = realBuffer_fx[i][j]; - imagBufferSave_fx[i][j] = imagBuffer_fx[i][j]; - move32(); - move32(); - IF( LT_16( j, st->hFdCngDec->hFdCngCom->numCoreBands ) && LT_16( i, st->hFdCngDec->hFdCngCom->numSlots ) ) - { - realBuffer_fx[i][j] = 0; - imagBuffer_fx[i][j] = 0; - move32(); - move32(); - } - } - } - -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, 0, st->cldfbSynHB ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, st->cldfbSynHB ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ - - Scale_sig32( save_hb_synth_fx, L_FRAME48k, negate( ( sub( Q_real, 1 ) ) ) ); // Q0 - Scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSynHB->Q_cldfb_state = Q10; - move16(); - /* restore lowband */ - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - realBuffer_fx[i][j] = realBufferSave_fx[i][j]; - imagBuffer_fx[i][j] = imagBufferSave_fx[i][j]; - move32(); - move32(); - } - } - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // Q_real-1 - st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); - move16(); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, 0, st->cldfbSyn ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, st->cldfbSyn ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ - Scale_sig32( synth_fx, L_FRAME48k, negate( sub( Q_real, 1 ) ) ); // Q0 - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSynHB->Q_cldfb_state = Q10; - move16(); - } - ELSE - { - /* synthesis of the combined signal */ - Word16 Q_real, Q_imag; - Word32 max_real, max_imag; - Q_real = 0; - Q_imag = 0; - max_real = 0; - max_imag = 0; - move16(); - move16(); - move32(); - move32(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); - max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); - } - } - Word32 max_val = L_max( max_real, max_imag ); - Q_imag = sub( norm_l( max_val ), 3 ) /* Guard bits */; - Q_real = Q_imag; - move16(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - } -#ifdef OPT_STEREO_32KBPS_V1 - scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1) -#else /* OPT_STEREO_32KBPS_V1 */ - scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) -#endif /* OPT_STEREO_32KBPS_V1 */ - st->cldfbSyn->Q_cldfb_state = sub( Q_real, 1 ); - move16(); -#ifndef MSAN_FIX - Scale_sig32( synth_fx, L_FRAME48k, Q_real - 1 ); -#endif - -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, 0, st->cldfbSyn ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, st->cldfbSyn ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ -#ifdef MSAN_FIX - scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 -#else - Scale_sig32( synth_fx, L_FRAME48k, -( Q_real - 1 ) ); -#endif - scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSyn->Q_cldfb_state = Q10; - move16(); - } - - /* save synthesis - needed in case of core switching */ - Copy32( synth_fx, st->previoussynth_fx_32, output_frame ); // Q0 - } - ELSE - { - Word16 nSamples = NS2SA_FX2( i_mult( st->L_frame, FRAMES_PER_SEC ), FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ); /* IVAS-64: optimization is likely possible here (don't resample the whole frame) */ - - /* analysis of the synthesis at internal sampling rate - needed for DFT stereo -> TD stereo switching */ -#ifndef MSAN_FIX - for ( i = 0; i < L_FRAME16k; i++ ) -#else - FOR( i = 0; i < st->L_frame; i++ ) -#endif - { - syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); - move32(); - } - - Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 - st->cldfbAna->Q_cldfb_state = Q12; - move16(); - cldfbAnalysis_ivas_fx( syn_32_fx + sub( st->L_frame, nSamples ), realBuffer_fx, imagBuffer_fx, nSamples, st->cldfbAna ); - - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 - st->cldfbAna->Q_cldfb_state = Q11; - move16(); /* analysis and add the BPF error signal - needed for DFT stereo -> TD stereo switching */ - Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; - Word16 q_bpf_error_signal; - Word16 cldfb_state_offset; - cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); - - // Get Q-factor - q_bpf_error_signal = Q6; - move16(); -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 -#else - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 -#endif - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - } - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) - st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; - move16(); - tmp = 0; - move16(); - if ( !st->bpf_off ) - { - tmp = nSamples; - move16(); - } - addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx + sub( st->L_frame, nSamples ), tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); - - - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( sub( q_bpf_error_signal, Q10 ) ) ); // Q10 - st->cldfbBPF->Q_cldfb_state = Q10; - move16(); - /* synthesis of the combined signal - needed for DFT stereo -> TD stereo switching */ - Word16 Q_real, Q_imag; - Word32 max_real, max_imag; - Q_real = 0; - Q_imag = 0; - max_real = 0; - max_imag = 0; - move16(); - move16(); - move32(); - move32(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); - max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); - } - } - Word32 max_val = L_max( max_real, max_imag ); - Q_imag = sub( norm_l( max_val ), 3 ) /* Guard bits */; - Q_real = Q_imag; - move16(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - } -#ifdef OPT_STEREO_32KBPS_V1 - scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1) -#else /* OPT_STEREO_32KBPS_V1 */ - scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) -#endif /* OPT_STEREO_32KBPS_V1 */ -#ifndef MSAN_FIX - Scale_sig32( synth_fx, L_FRAME48k, Q_real - 1 ); -#endif - -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), 0, st->cldfbSyn ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), st->cldfbSyn ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ - -#ifdef MSAN_FIX - Scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 -#else - Scale_sig32( synth_fx, L_FRAME48k, -( Q_real - 1 ) ); -#endif - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSyn->Q_cldfb_state = Q10; - move16(); - IF( st->p_bpf_noise_buf_32 ) - { - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 - Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); - - Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11 - } - - set32_fx( synth_fx, 0, output_frame ); - } - - /* Copy output signal */ -#ifndef MSAN_FIX - Scale_sig( syn_tmp_fx, L_FRAME16k + L_SUBFR, -st->Q_syn ); -#else - Scale_sig( syn_tmp_fx, add( st->L_frame, L_SUBFR ), negate( st->Q_syn ) ); // Q0 -#endif - IF( st->element_mode > EVS_MONO ) - { - Copy( psyn_fx, output_fx, st->L_frame ); /*Q_syn*/ - } - - st->Q_syn2 = 0; - move16(); - /*-----------------------------------------------------------------* - * Bandwidth extension 6kHz-7kHz - *-----------------------------------------------------------------*/ - IF( st->hBWE_zero != NULL ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( EQ_16( st->L_frame, L_FRAME ) && ( st->bwidth != NB ) && GE_16( output_frame, L_FRAME16k ) && - ( EQ_16( st->extl, -1 ) || EQ_16( st->extl, SWB_CNG ) || ( EQ_16( st->extl, WB_BWE ) && st->extl_brate == 0 && NE_16( st->coder_type, AUDIO ) ) ) ) ) - { -#ifdef MSAN_FIX - Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q0 -#else - Copy_Scale_sig_32_16( synth_fx, synth_fx16, L_FRAME48k, 0 ); -#endif - hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); -#ifdef MSAN_FIX - Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, output_frame, 0 ); -#else - Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, L_FRAME48k, 0 ); -#endif - } - ELSE - { - hf_synth_reset_fx( st->hBWE_zero ); -#ifdef MSAN_FIX - set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); -#endif - } - } - - /*-----------------------------------------------------------------* - * Populate parameters for SWB TBE - *-----------------------------------------------------------------*/ - - IF( st->hBWE_TD != NULL ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( !st->bfi && st->prev_bfi ) || ( EQ_16( st->last_vbr_hw_BWE_disable_dec, 1 ) && ( st->vbr_hw_BWE_disable_dec == 0 ) ) || ( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, WB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && NE_16( st->last_extl, SWB_TBE ) && NE_16( st->last_extl, WB_TBE ) && NE_16( st->last_extl, FB_TBE ) ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && !st->tdm_LRTD_flag ) ) - { - st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; - move32(); - set16_fx( st->hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); - } - test(); - test(); - test(); - test(); - test(); - IF( !st->ppp_mode_dec && ( st->idchan == 0 || NE_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && st->tdm_LRTD_flag ) ) ) - { -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc -#else - Copy_Scale_sig_16_32_DEPREC( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc -#endif - non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); - Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, negate( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc - } - test(); - if ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) - { - st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; - move32(); - } - } - /*----------------------------------------------------------------------* - * Updates - *----------------------------------------------------------------------*/ - - updt_dec_fx( st, old_exc_fx, pitch_buf_fx, Es_pred_fx, Aq_fx, lsf_new_fx, lsp_new_fx, voice_factors_fx, old_bwe_exc_fx, gain_buf_fx ); - test(); - test(); - IF( GT_32( st->core_brate, SID_2k40 ) && st->hTdCngDec != NULL && st->hFdCngDec != NULL ) - { - /* update CNG parameters in active frames */ - cng_params_upd_ivas_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, - st->hTdCngDec->ho_lsp_circ_fx, st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate, st->element_mode, - st->hFdCngDec->hFdCngCom->CngBandwidth ); - - - /* Set 16k LSP flag for CNG buffer */ - st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 0; - move16(); - if ( NE_16( st->L_frame, L_FRAME ) ) - { - st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 1; - move16(); - } - } - - { - IF( save_hb_synth_fx16 ) - { - Copy_Scale_sig_32_16( save_hb_synth_fx, save_hb_synth_fx16, L_FRAME48k, 0 ); // Q0 - } -#ifdef MSAN_FIX - Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q_syn2 -#else - Copy_Scale_sig_32_16( synth_fx, synth_fx16, L_FRAME48k, 0 ); -#endif -#ifndef FIX_1100_REMOVE_LPC_RESCALING - if ( st->hFdCngDec ) - { - st->hFdCngDec->hFdCngCom->A_cng[0] = ONE_IN_Q12; - move16(); - } -#endif - } - - pop_wmops(); - return error; -} - - -static void rescale_fdCngDec( HANDLE_FD_CNG_DEC hFdCngDec, Word16 Exp_diff ) -{ - Scale_sig32( hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, Exp_diff ); -} diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index 6a1e60b06dac404bef32af8e4fbf91f2f690fb9c..2df489cc115889a8c470e271a0024175d44b0235 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -128,11 +128,7 @@ ivas_error acelp_core_switch_dec_fx( * Excitation decoding *----------------------------------------------------------------*/ -#ifdef NONBE_FIX_GSC_BSTR - config_acelp1( DEC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &decode_bwe /* dummy */, &i, st_fx->element_mode, &i /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, 0, 0 ); -#else - config_acelp1( DEC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, GENERIC, -1, -1, &decode_bwe /* dummy */, &i, st_fx->element_mode, &i /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, 0, 0 ); -#endif + config_acelp1_fx( DEC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &decode_bwe /* dummy */, &i, st_fx->element_mode, &i /*dummy*/, 0, 0, st_fx->idchan, 0, 0, 0 ); decod_gen_voic_core_switch_fx( st_fx, L_frame_for_cs, 0, Aq, exc, cbrate, &st_fx->Q_exc ); @@ -819,11 +815,7 @@ ivas_error acelp_core_switch_dec_bfi_ivas_fx( *----------------------------------------------------------------*/ /* CLDFB analysis of the synthesis at internal sampling rate */ Qtmp = sub( 11, st_fx->Q_syn ); -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( syn, syn32, L_FRAME16k, Qtmp ); // Q(11) -#else - Copy_Scale_sig_16_32_DEPREC( syn, syn32, L_FRAME16k, Qtmp ); // Q(11) -#endif IF( NE_32( ( error = cldfb_save_memory_ivas_fx( st_fx->cldfbAna ) ), IVAS_ERR_OK ) ) { return error; @@ -840,20 +832,10 @@ ivas_error acelp_core_switch_dec_bfi_ivas_fx( } /*cldfbSynthesis_fx( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out, negate(st_fx->Q_syn), CLDFB_NO_COL_MAX_SWITCH_BFI, workBuffer );*/ - Scale_sig32( st_fx->cldfbSyn->cldfb_state_fx, st_fx->cldfbSyn->cldfb_state_length, 1 ); // Q_cldfb_state+1 - st_fx->cldfbSyn->Q_cldfb_state = add( st_fx->cldfbSyn->Q_cldfb_state, 1 ); - move16(); - Copy_Scale_sig_16_32_DEPREC( synth_out, synth32, L_FRAME48k, 5 ); /*11-5-1*/ - -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( realBuffer, imagBuffer, synth32, extract_l( Mpy_32_16_1( st_fx->output_Fs, 328 ) ), 0, st_fx->cldfbSyn ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer, imagBuffer, synth32, extract_l( Mpy_32_16_1( st_fx->output_Fs, 328 ) ), st_fx->cldfbSyn ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ - Scale_sig32( st_fx->cldfbSyn->cldfb_state_fx, st_fx->cldfbSyn->cldfb_state_length, -1 ); // Q_cldfb_state-1 - st_fx->cldfbSyn->Q_cldfb_state = sub( st_fx->cldfbSyn->Q_cldfb_state, 1 ); - move16(); - Copy_Scale_sig_32_16( synth32, synth_out, L_FRAME48k, -5 ); // 11-5-1 -> 11 + Word16 out_len = extract_l( Mpy_32_16_1( st_fx->output_Fs, 328 ) ); + cldfbSynthesis_ivas_fx( realBuffer, imagBuffer, synth32, out_len, -1, 0, st_fx->cldfbSyn ); + Copy_Scale_sig_32_16( synth32, synth_out, out_len, -4 ); + // Scale_sig( synth_out, L_FRAME48k, negate( st_fx->Q_syn ) ); @@ -890,10 +872,6 @@ static void decod_gen_voic_core_switch_fx( Word16 *pt1; GSC_DEC_HANDLE hGSCDec; hGSCDec = st_fx->hGSCDec; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif /*----------------------------------------------------------------------* @@ -919,14 +897,19 @@ static void decod_gen_voic_core_switch_fx( * Decode pitch lag *----------------------------------------------------------------------*/ - pitch = pit_decode_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR ); /*Q6*/ + pitch = pit_decode_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); /*Q6*/ /*--------------------------------------------------------------* * Find the adaptive codebook vector. *--------------------------------------------------------------*/ - - pred_lt4( &exc[0], &exc[0], T0, T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); - + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[0], &exc[0], T0, T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[0], &exc[0], T0, T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } /*--------------------------------------------------------------* * LP filtering of the adaptive excitation *--------------------------------------------------------------*/ @@ -953,10 +936,10 @@ static void decod_gen_voic_core_switch_fx( gain_dec_mless_fx( st_fx, L_frame, GENERIC, 0, -1, code, st_fx->old_Es_pred_fx, &gain_pit, &gain_code, &gain_inov, &norm_gain_code ); } - /* _ (Word16*) gain_pit : quantized pitch gain (Q14) */ - /* _ (Word32*) gain_code : quantized codebook gain (Q16) */ - /* _ (Word16*) gain_inov : gain of the innovation (used for normalization) (Q12) */ - /* _ (Word32*) norm_gain_code : norm. gain of the codebook excitation (Q16) */ + /* _ (Word16*) gain_pit : quantized pitch gain (Q14) */ + /* _ (Word32*) gain_code : quantized codebook gain (Q16) */ + /* _ (Word16*) gain_inov : gain of the innovation (used for normalization) (Q12) */ + /* _ (Word32*) norm_gain_code : norm. gain of the codebook excitation (Q16) */ st_fx->tilt_code_fx = est_tilt_fx( exc, gain_pit, code, gain_code, &voice_fac, *Q_exc ); /*Q15*/ move16(); @@ -979,7 +962,7 @@ static void decod_gen_voic_core_switch_fx( IF( st_fx->prev_bfi ) { /*gain_code = min(gain_code, 0.5f*gain_code+0.5f*st->lp_gainc);*/ - gain_code16 = s_min( gain_code16, mac_r( L_mult( 16384, gain_code16 ), shl_o( 16384 >> 3, st_fx->Q_exc, &Overflow ), st_fx->lp_gainc_fx ) ); /* st_fx->lp_gainc_fx in Q3 >>3 to bring it to Q0 as gain_code16 */ + gain_code16 = s_min( gain_code16, mac_r( L_mult( 16384, gain_code16 ), shl_sat( 16384 >> 3, st_fx->Q_exc ), st_fx->lp_gainc_fx ) ); /* st_fx->lp_gainc_fx in Q3 >>3 to bring it to Q0 as gain_code16 */ } FOR( i = 0; i < L_SUBFR; i++ ) @@ -994,8 +977,14 @@ static void decod_gen_voic_core_switch_fx( /*-----------------------------------------------------------------* * long term prediction on the 2nd sub frame *-----------------------------------------------------------------*/ - - pred_lt4( &exc[L_SUBFR], &exc[L_SUBFR], T0, T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[L_SUBFR], &exc[L_SUBFR], T0, T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[L_SUBFR], &exc[L_SUBFR], T0, T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } pt1 = exc + L_SUBFR; FOR( i = 0; i < L_SUBFR; i++ ) diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c index db4ad2bb021122533aba2ec98cb77b9455a90804..d7dcf5b0315eb9da72405cfd072d546c53d8887d 100644 --- a/lib_dec/amr_wb_dec_fx.c +++ b/lib_dec/amr_wb_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -339,9 +339,7 @@ ivas_error amr_wb_dec_fx( st_fx->bfi_pitch_frame = L_FRAME; move16(); } -#ifdef _DIFF_FLOAT_FIX_ - PMT( "the code below has been removed in IVAS float (or moved somewhere else), is it ok?" ) -#endif + IF( NE_16( st_fx->last_core, AMR_WB_CORE ) ) { /* reset the unvoiced/audio signal improvement memories */ @@ -350,7 +348,7 @@ ivas_error amr_wb_dec_fx( Copy( st_fx->hAmrwb_IO->old_Aq_fx, st_fx->hAmrwb_IO->old_Aq_fx + i_mult( 2, M + 1 ), M + 1 ); /*Q12*/ Copy( st_fx->hAmrwb_IO->old_Aq_fx, st_fx->hAmrwb_IO->old_Aq_fx + i_mult( 3, M + 1 ), M + 1 ); /*Q12*/ } - /*End of _DIFF_FLOAT_FIX_*/ + test(); if ( EQ_16( st_fx->last_bwidth, NB ) && st_fx->ini_frame != 0 ) { @@ -463,7 +461,7 @@ ivas_error amr_wb_dec_fx( * Extracts VAD information from the bitstream in AMR-WB IO mode *------------------------------------------------------------*/ - vad_flag = (Word16) get_next_indice( st_fx, 1 ); + vad_flag = (Word16) get_next_indice_fx( st_fx, 1 ); move16(); st_fx->coder_type = GENERIC; @@ -628,7 +626,7 @@ ivas_error amr_wb_dec_fx( FEC_scale_syn_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, MOVING_AVERAGE, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); + exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, 0 ); frame_ener_fx( L_FRAME, st_fx->clas_dec, syn_fx, pitch_buf_tmp[3], &st_fx->enr_old_fx, L_FRAME, st_fx->Q_syn, 3, 0 ); } @@ -710,7 +708,7 @@ ivas_error amr_wb_dec_fx( FEC_scale_syn_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, MOVING_AVERAGE, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, - st_fx->Q_exc, st_fx->Q_syn, 0, 0 ); + st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, 0, 0 ); /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ frame_ener_fx( L_FRAME, st_fx->last_good, syn_fx, shr( FEC_pitch_fx, 6 ), &st_fx->enr_old_fx, L_FRAME, st_fx->Q_syn, 3, 0 ); @@ -792,12 +790,9 @@ ivas_error amr_wb_dec_fx( st_fx->VAD = 0; move16(); } -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - PMT( "Fixed point not done here " ) - ApplyFdCng_fx( syn, NULL, NULL, NULL, st, 0, 0 ); -#else - ApplyFdCng_fx( syn_fx, st_fx->Q_syn, NULL, NULL, NULL, st_fx, 0, 0 ); -#endif + + ApplyFdCng_fx( syn_fx, st_fx->Q_syn, NULL, 0, NULL, NULL, NULL, st_fx, 0, 0 ); + st_fx->hFdCngDec->hFdCngCom->frame_type_previous = st_fx->m_frame_type; move16(); @@ -857,10 +852,8 @@ ivas_error amr_wb_dec_fx( IF( NE_16( i_mult( st_fx->cldfbAna->usb, st_fx->cldfbAna->no_col ), L_FRAME ) ) { /* resample to ACELP internal sampling rate */ - Word16 newCldfbBands = CLDFB_getNumChannels( INT_FS_FX ); - - resampleCldfb( st_fx->cldfbAna, newCldfbBands, L_FRAME, 0 ); - resampleCldfb( st_fx->cldfbBPF, newCldfbBands, L_FRAME, 0 ); + resampleCldfb( st_fx->cldfbAna, INT_FS_FX, L_FRAME, 0 ); + resampleCldfb( st_fx->cldfbBPF, INT_FS_FX, L_FRAME, 0 ); IF( st_fx->ini_frame > 0 ) { diff --git a/lib_dec/ari_dec_fx.c b/lib_dec/ari_dec_fx.c index 3aabbdaa58cbcdda0a7c83d962eb9297c8a8608f..c9912eba88aba8924e815edf22b4cdb5a65cd286 100644 --- a/lib_dec/ari_dec_fx.c +++ b/lib_dec/ari_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -19,7 +19,7 @@ Word32 ari_decode_overflow_fx( Tastat *s ) } /** - * \brief Start ArCo decoding + * \brief Start ArCo decoding * * \param[i/o] st * \param[o] s diff --git a/lib_dec/ari_hm_dec.c b/lib_dec/ari_hm_dec_fx.c similarity index 98% rename from lib_dec/ari_hm_dec.c rename to lib_dec/ari_hm_dec_fx.c index ef4fb62d5579e0f89500a76227fbe459a7f1719e..ecbf0b6b7fe405df68c12f6e652b08311718f549 100644 --- a/lib_dec/ari_hm_dec.c +++ b/lib_dec/ari_hm_dec_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_dec/arith_coder_dec_fx.c b/lib_dec/arith_coder_dec_fx.c index 60a59c4da469f113f7195179ed0521d2c343bc2d..e91ac4ed0201b33814a3989abcd89222a50a3e8e 100644 --- a/lib_dec/arith_coder_dec_fx.c +++ b/lib_dec/arith_coder_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -27,19 +27,15 @@ static Word16 tcx_arith_decode_fx( Tastat as; Word16 exp_k; Word16 tmp; - Word32 L_tmp, Q; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; + Word32 Q; + Word64 W_tmp; move32(); - Flag Carry = 0; - move32(); -#endif - bp = ari_start_decoding_14bits_prm_fx( prm, 0, &as ); tmp = sub( envelope_e, 1 + 15 ); - L_tmp = L_deposit_l( 0 ); + W_tmp = 0; + FOR( k = 0; k < L_frame; k++ ) { IF( envelope[k] == 0 ) /* safety check in case of bit errors */ @@ -63,7 +59,7 @@ static Word16 tcx_arith_decode_fx( { bp = ari_decode_14bits_sign_fx( prm, bp, target_bits, &s, &as ); - L_tmp = L_macNs_co( L_tmp, q, k, &Carry, &Overflow ); + W_tmp = W_mac_16_16( W_tmp, q, k ); Q = L_mult( q, negate( shl( 1, sub( 30, SPEC_EXP_DEC ) ) ) ); IF( EQ_16( s, 0 ) ) @@ -88,7 +84,7 @@ static Word16 tcx_arith_decode_fx( set32_fx( q_spectrum + k, 0, sub( L_frame, k ) ); /* noise filling seed */ - *nf_seed = extract_l( L_tmp ); + *nf_seed = extract_l( W_extract_l( W_tmp ) ); move16(); return bp; @@ -108,9 +104,8 @@ void tcx_arith_decode_envelope_fx( Word16 tcxltp_pitch, /* i: TCX LTP pitch in FD, -1 if n/a Q0*/ Word16 *arith_bits, /* o: bits used for ari. coding Q0 */ Word16 *signaling_bits, /* o: bits used for signaling Q0 */ - Word16 *nf_seed /* o: noise filling seed Q0 */ - , - Word16 low_complexity /* i: low-complexity flag Q0 */ + Word16 *nf_seed, /* o: noise filling seed Q0 */ + Word16 low_complexity /* i: low-complexity flag Q0 */ ) { Word32 env[N_MAX_ARI]; /* unscaled envelope */ @@ -148,7 +143,6 @@ void tcx_arith_decode_envelope_fx( return; } - *signaling_bits = 0; move16(); assert( st->hTcxDec->enableTcxLpc ); diff --git a/lib_dec/avq_dec_fx.c b/lib_dec/avq_dec_fx.c index a8ba2bfc3612253b30e153d2cb22f863afe3d4a4..4e4735b8336dfb321e7cfa1345ac72ed332711d8 100644 --- a/lib_dec/avq_dec_fx.c +++ b/lib_dec/avq_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -23,13 +23,13 @@ static void read_cv_fx( Decoder_State *st, UWord16 *I, Word16 *kv, Word16 nq, Wo *-----------------------------------------------------------------*/ void AVQ_demuxdec_fx( - Decoder_State *st, /* i/o: decoder state structure */ - Word16 xriq[], /* o : decoded subvectors [0..8*Nsv-1] Q0*/ - Word16 *nb_bits, /* i/o: number of allocated bits Q0*/ - const Word16 Nsv, /* i : number of subvectors Q0*/ - Word16 nq[], /* i/o: AVQ nq index Q0*/ - Word16 avq_bit_sFlag, /* i : flag for AVQ bit saving solution Q0*/ - Word16 trgtSvPos /* i : target SV for AVQ bit savings Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + Word16 xriq[], /* o : decoded subvectors [0..8*Nsv-1] Q0*/ + Word16 *nb_bits, /* i/o: number of allocated bits Q0*/ + const Word16 Nsv, /* i : number of subvectors Q0*/ + Word16 nq[], /* i/o: AVQ nq index Q0*/ + Word16 avq_bit_sFlag, /* i : flag for AVQ bit saving solution Q0*/ + Word16 trgtSvPos /* i : target SV for AVQ bit savings Q0*/ ) { Word16 i, j, bits, tmp; @@ -329,9 +329,9 @@ void AVQ_demuxdec_fx( *-----------------------------------------------------------------*/ void AVQ_dec_lpc( - Word16 *indx, /* input: index[] (4 bits per words) Q0*/ - Word16 *nvecq, /* output: vector quantized Q0*/ - Word16 Nsv /* input: number of subvectors (lg=Nsv*8) Q0*/ + Word16 *indx, /* input: index[] (4 bits per words) Q0*/ + Word16 *nvecq, /* output: vector quantized Q0*/ + Word16 Nsv /* input: number of subvectors (lg=Nsv*8) Q0*/ ) { Word16 i, l, n, nq, nk, pos, ival, c[8], kv[8]; diff --git a/lib_dec/bass_psfilter_fx.c b/lib_dec/bass_psfilter_fx.c index 14f8008ffa36a7629cddb3668a8eccdd51637842..76d80eb89042af2054c6bf4dd975ba1e7679ffdf 100644 --- a/lib_dec/bass_psfilter_fx.c +++ b/lib_dec/bass_psfilter_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -40,12 +40,12 @@ void bass_psfilter_init_fx( hBPF->pst_mem_deemp_err_fx = 0; /* 0 in Q_syn2-1 */ move16(); hBPF->pst_lp_ener_fx = 0; - move16(); /*0 in Q8 */ + move16(); /*0 in Q8 */ set16_fx( hBPF->pst_old_syn_fx, 0, NBPSF_PIT_MAX ); set16_fx( hBPF->Track_on_hist, 0, L_TRACK_HIST ); set16_fx( hBPF->vibrato_hist, 0, L_TRACK_HIST ); - set16_fx( hBPF->mem_mean_pit_fx, 1280, L_TRACK_HIST ); /* 80 in Q4 */ - hBPF->psf_att_fx = 32767; /* 1.0 in Q15 */ + set16_fx( hBPF->mem_mean_pit_fx, 1280, L_TRACK_HIST ); /* 80 in Q4 */ + hBPF->psf_att_fx = 32767; /* 1.0 in Q15 */ move16(); return; @@ -80,17 +80,17 @@ void bass_psfilter_init_fx( /*=========================================================================*/ void bass_psfilter_fx( - BPF_DEC_HANDLE hBPF, /* i/o: BPF data handle */ - const Word16 Opt_AMR_WB, /* i : AMR-WB IO flag Q0*/ - Word16 synth_in_fx[], /* i : input synthesis (at 16kHz) Q_syn2-1*/ - const Word16 L_frame, /* i : length of the last frame Q0*/ - Word16 pitch_buf_fx[], /* i : pitch for every subfr [0,1,2,3] Q6*/ - const Word16 bpf_off, /* i : do not use BPF when set to 1 Q0*/ - Word16 v_stab_fx, /* i : stability factor Q15*/ - Word16 *v_stab_smooth_fx, /* i/o: smoothed stability factor Q15*/ - const Word16 coder_type, /* i : coder_type Q0*/ + BPF_DEC_HANDLE hBPF, /* i/o: BPF data handle */ + const Word16 Opt_AMR_WB, /* i : AMR-WB IO flag Q0*/ + Word16 synth_in_fx[], /* i : input synthesis (at 16kHz) Q_syn2-1*/ + const Word16 L_frame, /* i : length of the last frame Q0*/ + Word16 pitch_buf_fx[], /* i : pitch for every subfr [0,1,2,3] Q6*/ + const Word16 bpf_off, /* i : do not use BPF when set to 1 Q0*/ + Word16 v_stab_fx, /* i : stability factor Q15*/ + Word16 *v_stab_smooth_fx, /* i/o: smoothed stability factor Q15*/ + const Word16 coder_type, /* i : coder_type Q0*/ Word16 Q_syn, - Word16 bpf_noise_buf[] /* o : BPF error signal (at int_fs) Qx*/ + Word16 bpf_noise_buf[] /* o : BPF error signal (at int_fs) Qx*/ ) { Word16 i, j, i_subfr, T, exp, exp2; @@ -555,7 +555,7 @@ void bass_psfilter_fx( FOR( i = 0; i < subfr_len; i++ ) { /* err[i] = syn_fx[i] - gain*syn2_fx[i] */ - err[i] = msu_r( L_shr( L_mult0( gain, syn2_fx[i] ), exp2 ), syn_fx[i], 16384 ); /* Q15 */ + err[i] = msu_r( L_shr_sat( L_mult0( gain, syn2_fx[i] ), exp2 ), syn_fx[i], 16384 ); /* Q15 */ move16(); /* the sign is inverted but it is not important because we calculate energy with 'err[i]' x 'err[i]' @@ -685,9 +685,9 @@ void bass_psfilter_fx( /* CALLED FROM : TX/RX */ /*==============================================================================*/ -static Word16 Pit_track_fx( /* o : Pitch */ - Word16 syn[], /* i : synthesis [-PIT_MAX..L_SUBFR] st_fx->Q_syn2 */ - Word16 T /* i : pitch period (>= PIT_MIN) Q0 */ +static Word16 Pit_track_fx( /* o : Pitch */ + Word16 syn[], /* i : synthesis [-PIT_MAX..L_SUBFR] st_fx->Q_syn2 */ + Word16 T /* i : pitch period (>= PIT_MIN) Q0 */ ) { Word16 T2; @@ -1128,110 +1128,3 @@ void bpf_pitch_coherence_ivas_fx( return; } - - -#ifdef ADD_BPF_ADAPT -/*---------------------------------------------------------------------* - * res_bpf_adapt() - * - * Analyze BPF output and decide if it should be applied on DFT stereo - * residual signal - *---------------------------------------------------------------------*/ - -/*! r: Decision to enable or disable BPF on DFT stereo residual */ -int16_t res_bpf_adapt( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo decoder handle */ - const float *bpf_error_signal_8k, /* i : BPF modification signal */ - float res_buf[STEREO_DFT_BUF_MAX] /* i : residual buffer */ -) -{ - float error_nrg; - float tmp; - float res_hb_nrg; - float bpf_error_ratio; - int16_t res_bpf_flag; - int16_t i; - int16_t i_start; - int16_t i_end; - float bw_inv; - - if ( hStereoDft->res_cod_band_max == 6 ) - { - i_start = 39; - i_end = 64; - bw_inv = 0.04f; /* 1/(64 - 39) */ - } - else - { - i_start = 28; - i_end = 40; - bw_inv = 0.083f; /* 1/(40 - 28) */ - } - - /* Measure energy of high frequency band in MDCT domain */ - res_hb_nrg = EPSILON; - for ( i = i_start; i < i_end; i++ ) - { - res_hb_nrg += res_buf[i] * res_buf[i]; - } - res_hb_nrg *= bw_inv; - res_hb_nrg = STEREO_DFT_BPF_ADAPT_ALPHA * res_hb_nrg + ( 1 - STEREO_DFT_BPF_ADAPT_ALPHA ) * hStereoDft->res_hb_nrg_mem; - hStereoDft->res_hb_nrg_mem = res_hb_nrg; - - /* Measure energy of discontinuities at subframe boundaries */ - error_nrg = 0; - for ( i = 0; i < L_FRAME8k; i += STEREO_DFT_L_SUBFR_8k ) - { - tmp = bpf_error_signal_8k[i] - hStereoDft->bpf_error_signal_last; - error_nrg += tmp * tmp; - hStereoDft->bpf_error_signal_last = bpf_error_signal_8k[i + STEREO_DFT_L_SUBFR_8k - 1]; - } - error_nrg *= 0.2f; /* Division by 5 for average value */ - bpf_error_ratio = min( 2, error_nrg / res_hb_nrg ); /* Form decision variable and apply limit */ - bpf_error_ratio = STEREO_DFT_BPF_ADAPT_BETA * bpf_error_ratio + ( 1 - STEREO_DFT_BPF_ADAPT_BETA ) * hStereoDft->bpf_error_ratio_mem; - hStereoDft->bpf_error_ratio_mem = bpf_error_ratio; - - res_bpf_flag = bpf_error_ratio < 1; - - return res_bpf_flag; -} - -/*---------------------------------------------------------------------* - * bpf_pitch_coherence() - * - * Analyse pitch coherence - *---------------------------------------------------------------------*/ -void bpf_pitch_coherence( - Decoder_State *st, /* i/o: decoder state structure */ - const float pitch_buf[] /* i : pitch for every subfr [0,1,2,3] */ -) -{ - int16_t nb_subfr; - float pc, pcn1, pcn2, pcn3; - - nb_subfr = st->L_frame / L_SUBFR; - - if ( st->clas_dec > UNVOICED_CLAS && st->element_mode != EVS_MONO ) - { - pc = (float) fabs( st->old_pitch_buf[nb_subfr + 3] + st->old_pitch_buf[nb_subfr + 2] - st->old_pitch_buf[nb_subfr] - st->old_pitch_buf[nb_subfr + 1] ) * 256.0f / (float) st->L_frame; - pcn1 = K_PC_DEC * pc + C_PC_DEC; - pcn1 = max( min( pcn1, 1.0f ), 0.0f ); - - pc = (float) fabs( pitch_buf[nb_subfr - 1] + pitch_buf[nb_subfr - 2] - pitch_buf[1] - pitch_buf[0] ) * 256.0f / (float) st->L_frame; - pcn2 = K_PC_DEC * pc + C_PC_DEC; - pcn2 = max( min( pcn2, 1.0f ), 0.0f ); - - pc = (float) fabs( st->old_pitch_buf[nb_subfr + 3] + st->old_pitch_buf[nb_subfr + 2] - pitch_buf[1] - pitch_buf[0] ) * 256.0f / (float) st->L_frame; - pcn3 = K_PC_DEC * pc + C_PC_DEC; - pcn3 = max( min( pcn3, 1.0f ), 0.0f ); - - if ( pcn1 + pcn2 + pcn3 < 2.5f ) - { - st->hBPF->psf_att = 0.4f; - set_s( &st->hBPF->Track_on_hist[L_TRACK_HIST - nb_subfr], 1, nb_subfr ); - } - } - - return; -} -#endif diff --git a/lib_dec/cng_dec_fx.c b/lib_dec/cng_dec_fx.c index 945f0ca758ed89671ff73a19fe0ba7ff25ab0357..0006bacbbd2e6354d3e976b80a362a608103ee88 100644 --- a/lib_dec/cng_dec_fx.c +++ b/lib_dec/cng_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -22,689 +22,19 @@ static void shb_CNG_decod_fx( Decoder_State *st_fx, const Word16 *synth_fx, Word static void shb_CNG_decod_ivas_fx( Decoder_State *st_fx, const Word16 *synth_fx, Word16 *shb_synth_fx, const Word16 sid_bw, const Word16 Qsyn ); /*-----------------------------------------------------------------* - * Decode residual signal energy - *-----------------------------------------------------------------*/ - -void CNG_dec_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 last_element_mode, /* i : last element mode Q0 */ - Word16 Aq[], /* o : LP coefficients Q12 */ - Word16 *lsp_new, /* i/o: current frame LSPs Q15 */ - Word16 *lsf_new, /* i/o: current frame LSFs Qlog2(2.56) */ - Word16 *allow_cn_step, /* o : allow CN step Q0 */ - Word16 *sid_bw /* i : 0-NB/WB, 1-SWB SID Q0 */ - , - Word32 *q_env ) -{ - Word16 istep; - Word16 i, L_enr_index; - Word32 L_ener; - Word16 ener_fra, ener_int; - Word16 num_bits; - Word16 weights, ptr, j, k; - Word16 m1; - Word16 m = 0; - move16(); - Word16 tmp[HO_HIST_SIZE * M]; - Word16 burst_ho_cnt = 0; - move16(); - Word16 ll, s_ptr; - Word32 L_enr, L_tmp1; - Word16 tmp1, exp; - Word16 lsf_tmp[M]; - Word32 C[M]; - Word32 max_val[2]; - Word16 max_idx[2]; - Word16 ftmp_fx; - Word16 lsp_tmp[M]; - Word16 dev; - Word16 max_dev; - Word16 dist; - Word16 tmpv; - Word16 env_idx[2]; - Word32 enr1; - Word32 env[NUM_ENV_CNG]; - Word32 tmp_env[HO_HIST_SIZE * NUM_ENV_CNG]; - Word32 L_tmp; - Word16 fra; - Word16 temp_lo_fx, temp_hi_fx; - Word16 exp_pow; - Word16 tmp_loop; - Word16 enr_new, Aq_tmp[M + 1]; - - Word16 LSF_Q_prediction; /* o : LSF prediction mode - just temporary variable in CNG */ - TD_CNG_DEC_HANDLE hTdCngDec; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - hTdCngDec = st_fx->hTdCngDec; - - m = 0; - move16(); - /*-----------------------------------------------------------------* - * Decode CNG spectral envelope (only in SID frame) - *-----------------------------------------------------------------*/ - test(); - IF( EQ_32( st_fx->core_brate, SID_1k75 ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - /* de-quantize the LSF vector */ - IF( st_fx->Opt_AMR_WB != 0 ) - { - /* Flt function */ - isf_dec_amr_wb_fx( st_fx, Aq, lsf_new, lsp_new ); - /* check IF ISPs may trigger too much synthesis energy */ - - E_LPC_f_isp_a_conversion( lsp_new, Aq_tmp, M ); - enr_new = Enr_1_Az_fx( Aq_tmp, 2 * L_SUBFR ); - - IF( ( shr( enr_new, 14 ) > 0 ) ) - { - /* Use old LSP vector */ - Copy( st_fx->lsp_old_fx, lsp_new, M ); /* Q15 */ - Copy( st_fx->lsf_old_fx, lsf_new, M ); /* Q2.56 */ - } - } - ELSE - { - lsf_dec_fx( st_fx, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0, - NULL ); - /* check IF LSPs may trigger too much synthesis energy */ - - E_LPC_f_lsp_a_conversion( lsp_new, Aq_tmp, M ); - enr_new = Enr_1_Az_fx( Aq_tmp, 2 * L_SUBFR ); - - IF( shr( enr_new, 14 ) > 0 ) - { - /* Use old LSP vector */ - Copy( st_fx->lsp_old_fx, lsp_new, M ); /* Q15 */ - Copy( st_fx->lsf_old_fx, lsf_new, M ); /* Q2.56 */ - } - } - } - ELSE - { - /* Use old LSP vector */ - Copy( st_fx->lsp_old_fx, lsp_new, M ); /* Q15 */ - Copy( st_fx->lsf_old_fx, lsf_new, M ); /* Q2.56 */ - } - - /* Initialize the CNG spectral envelope in case of the very first CNG frame */ - IF( st_fx->first_CNG == 0 ) - { - Copy( st_fx->lsp_old_fx, st_fx->lspCNG_fx, M ); /* Q15 */ - } - - /*-----------------------------------------------------------------* - * Decode residual signal energy - *-----------------------------------------------------------------*/ - - *allow_cn_step = 0; - move16(); - test(); - IF( EQ_32( st_fx->core_brate, SID_1k75 ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - istep = ISTEP_AMR_WB_SID_FX; /* Q15 */ - move16(); - if ( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - istep = ISTEP_SID_FX; /* Q15 */ - move16(); - } - - /* initialize the energy quantization parameters */ - num_bits = 6; - move16(); - if ( st_fx->Opt_AMR_WB == 0 ) - { - num_bits = 7; - move16(); - } - - /* decode the energy index */ - L_enr_index = get_next_indice_fx( st_fx, num_bits ); - - IF( LE_32( st_fx->last_core_brate, SID_2k40 ) || EQ_16( st_fx->prev_bfi, 1 ) ) - { - tmp1 = add( hTdCngDec->old_enr_index, 20 ); - } - ELSE - { - tmp1 = add( hTdCngDec->old_enr_index, 40 ); - } - IF( GT_16( L_enr_index, tmp1 ) && hTdCngDec->old_enr_index >= 0 ) /* Likely bit error and not startup */ - { - L_enr_index = tmp1; - move16(); - L_enr_index = s_min( L_enr_index, 127 ); /* Q0 */ - IF( st_fx->Opt_AMR_WB ) - { - L_enr_index = s_min( L_enr_index, 63 ); /* Q0 */ - } - } - - test(); - test(); - test(); - IF( GT_32( st_fx->last_core_brate, SID_1k75 ) && - NE_16( st_fx->first_CNG, 0 ) && - GE_16( hTdCngDec->old_enr_index, 0 ) && - GT_16( L_enr_index, add( hTdCngDec->old_enr_index, 1 ) ) ) - { - *allow_cn_step = 1; - move16(); - } - - hTdCngDec->old_enr_index = L_enr_index; - move16(); - if ( !L_enr_index ) - { - L_enr_index = -5; - move16(); - } - /* st_fx->Enew = L_enr_index / step - 2.0f;*/ - L_ener = L_mult( L_enr_index, istep ); /* Q16 (0+15) */ - /* subtract by 2 not done to leave Energy in Q2 */ - - /* extract integral and fractional parts */ - ener_fra = L_Extract_lc( L_ener, &ener_int ); - ener_int = add( ener_int, 4 ); /* Q2 to Q6 */ - - /* find the new energy value */ - hTdCngDec->Enew_fx = Pow2( ener_int, ener_fra ); - move32(); - - IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - burst_ho_cnt = get_next_indice_fx( st_fx, 3 ); /* 3bit */ - - *sid_bw = get_next_indice_fx( st_fx, 1 ); - move16(); - IF( *sid_bw == 0 ) - { - env_idx[0] = get_next_indice_fx( st_fx, 6 ); - move16(); - - /* get quantized res_env_details */ - FOR( i = 0; i < NUM_ENV_CNG; i++ ) - { - q_env[i] = L_deposit_l( CNG_details_codebook_fx[env_idx[0]][i] ); - move32(); - } - } - } - /* Reset CNG history IF CNG frame length is changed */ - test(); - test(); - IF( EQ_16( st_fx->bwidth, WB ) && NE_16( st_fx->first_CNG, 0 ) && NE_16( st_fx->L_frame, st_fx->last_CNG_L_frame ) ) - { - hTdCngDec->ho_hist_size = 0; - move16(); - } - } - - /*---------------------------------------------------------------------* - * CNG spectral envelope update - * Find A(z) coefficients - *---------------------------------------------------------------------*/ - test(); - test(); - test(); - IF( LE_32( st_fx->last_core_brate, SID_2k40 ) ) - { - /* Reset hangover counter if not first SID period */ - if ( GT_32( st_fx->core_brate, FRAME_NO_DATA ) ) - { - hTdCngDec->num_ho = 0; - move16(); - } - /* Update LSPs IF last SID energy not outliers or insufficient number of hangover frames */ - test(); - IF( LT_16( hTdCngDec->num_ho, 3 ) || LT_32( Mult_32_16( hTdCngDec->Enew_fx, 21845 /*1/1.5f, Q15*/ ), st_fx->lp_ener_fx ) ) - { - FOR( i = 0; i < M; i++ ) - { - /* AR low-pass filter */ - st_fx->lspCNG_fx[i] = mac_r( L_mult( CNG_ISF_FACT_FX, st_fx->lspCNG_fx[i] ), 32768 - CNG_ISF_FACT_FX, lsp_new[i] ); - move16(); /* Q15 (15+15+1-16) */ - } - } - } - ELSE - { - /* Update CNG_mode IF allowed */ - test(); - test(); - test(); - IF( ( st_fx->Opt_AMR_WB || EQ_16( st_fx->bwidth, WB ) ) && ( !st_fx->first_CNG || GE_16( hTdCngDec->act_cnt2, MIN_ACT_CNG_UPD ) ) ) - { - IF( GT_32( st_fx->last_active_brate, ACELP_16k40 ) ) - { - st_fx->CNG_mode = -1; - move16(); - } - ELSE - { - st_fx->CNG_mode = get_cng_mode( st_fx->last_active_brate ); - move16(); - } - } - - /* If first sid after active burst update LSF history from circ buffer */ - burst_ho_cnt = s_min( burst_ho_cnt, hTdCngDec->ho_circ_size ); /* MODE1_DTX_IN_CODEC_B_FIX Q0*/ - hTdCngDec->act_cnt = 0; - move16(); - s_ptr = add( sub( hTdCngDec->ho_circ_ptr, burst_ho_cnt ), 1 ); - IF( s_ptr < 0 ) - { - s_ptr = add( s_ptr, hTdCngDec->ho_circ_size ); - } - - FOR( ll = burst_ho_cnt; ll > 0; ll-- ) - { - hTdCngDec->ho_hist_ptr = add( hTdCngDec->ho_hist_ptr, 1 ); /* Q0 */ - move16(); - if ( EQ_16( hTdCngDec->ho_hist_ptr, HO_HIST_SIZE ) ) - { - hTdCngDec->ho_hist_ptr = 0; - move16(); - } - - /* Conversion between 12.8k and 16k LSPs */ - test(); - test(); - test(); - IF( ( EQ_16( st_fx->L_frame, L_FRAME16k ) && hTdCngDec->ho_16k_lsp[s_ptr] == 0 ) || ( EQ_16( st_fx->L_frame, L_FRAME ) && EQ_16( hTdCngDec->ho_16k_lsp[s_ptr], 1 ) ) ) - { - /* Conversion from 16k LPSs to 12k8 */ - lsp_convert_poly_fx( &( hTdCngDec->ho_lsp_circ_fx[s_ptr * M] ), st_fx->L_frame, 0 ); - } - /* update the circular buffers */ - Copy( &( hTdCngDec->ho_lsp_circ_fx[s_ptr * M] ), &( hTdCngDec->ho_lsp_hist_fx[hTdCngDec->ho_hist_ptr * M] ), M ); /* Qx */ - Copy32( &( hTdCngDec->ho_ener_circ_fx[s_ptr] ), &( hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr] ), 1 ); /* Q6 */ - hTdCngDec->ho_sid_bw = L_shl( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); - move32(); - Copy32( &( hTdCngDec->ho_env_circ_fx[s_ptr * NUM_ENV_CNG] ), &( hTdCngDec->ho_env_hist_fx[hTdCngDec->ho_hist_ptr * NUM_ENV_CNG] ), NUM_ENV_CNG ); /* Qx */ - - hTdCngDec->ho_hist_size = add( hTdCngDec->ho_hist_size, 1 ); - move16(); - - if ( GT_16( hTdCngDec->ho_hist_size, HO_HIST_SIZE ) ) - { - hTdCngDec->ho_hist_size = HO_HIST_SIZE; - move16(); - } - - s_ptr = add( s_ptr, 1 ); - if ( EQ_16( s_ptr, hTdCngDec->ho_circ_size ) ) - { - s_ptr = 0; - move16(); - } - } - - IF( hTdCngDec->ho_hist_size > 0 ) /* can be -1 at init MODE1_DTX_IN_CODEC_B_FIX */ - { - /* *allow_cn_step |= ( st_fx->ho_ener_hist[st_fx->ho_hist_ptr] > 4.0f * st_fx->lp_ener );*/ - L_tmp1 = L_shr( hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr], 2 ); - L_tmp1 = L_sub( L_tmp1, st_fx->lp_ener_fx ); - - test(); - test(); - IF( ( L_tmp1 > 0 && ( st_fx->first_CNG || st_fx->element_mode == EVS_MONO ) ) ) - { - *allow_cn_step = s_or( *allow_cn_step, 1 ); - move16(); - } - } - IF( EQ_16( last_element_mode, IVAS_CPE_TD ) ) - { - *allow_cn_step = 1; - move16(); - } - test(); - IF( EQ_16( *allow_cn_step, 0 ) && GT_16( hTdCngDec->ho_hist_size, 0 ) ) - { - /* Use average of energies below last energy */ - ptr = hTdCngDec->ho_hist_ptr; - move16(); - Copy( &( hTdCngDec->ho_lsp_hist_fx[ptr * M] ), tmp, M ); /* Qx */ - m1 = 0; - move16(); - IF( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x1 ) == 0 ) - { - Copy32( &hTdCngDec->ho_env_hist_fx[ptr * NUM_ENV_CNG], tmp_env, NUM_ENV_CNG ); - m1 = 1; - move16(); - } - L_enr = Mult_32_16( hTdCngDec->ho_ener_hist_fx[ptr], W_DTX_HO_FX[0] ); /* Q6+15-15->Q6 */ - - weights = W_DTX_HO_FX[0]; /* Q15 */ - move16(); - - m = 1; - move16(); - FOR( k = 1; k < hTdCngDec->ho_hist_size; k++ ) - { - ptr--; - if ( ptr < 0 ) - { - ptr = HO_HIST_SIZE - 1; - move16(); - } - - test(); - IF( LT_32( Mult_32_16( hTdCngDec->ho_ener_hist_fx[ptr], ONE_OVER_BUF_H_NRG_FX ), hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr] ) && - GT_32( hTdCngDec->ho_ener_hist_fx[ptr], Mult_32_16( hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr], BUF_L_NRG_FX ) ) ) - { - /*enr += W_DTX_HO[k] * st_fx->ho_ener_hist[ptr];*/ - L_tmp1 = Mult_32_16( hTdCngDec->ho_ener_hist_fx[ptr], W_DTX_HO_FX[k] ); /* Q6+15-15->Q6 */ - L_enr = L_add( L_enr, L_tmp1 ); /* Q6 */ - - /*weights += W_DTX_HO[k];*/ - weights = add( weights, W_DTX_HO_FX[k] ); /* Q15 */ - - Copy( &hTdCngDec->ho_lsp_hist_fx[ptr * M], &tmp[m * M], M ); /* Qx */ - IF( EQ_32( L_and( hTdCngDec->ho_sid_bw, L_shl( (Word32) 0x1, k ) ), 0 ) ) - { - Copy32( &hTdCngDec->ho_env_hist_fx[ptr * NUM_ENV_CNG], &tmp_env[m1 * NUM_ENV_CNG], NUM_ENV_CNG ); /* Qx */ - m1++; - } - m++; - } - } - - /*enr /= weights;*/ - exp = norm_s( weights ); - tmp1 = div_s( shl( 1, sub( 14, exp ) ), weights ); /* Q(15+14-exp-15) */ - L_tmp1 = Mult_32_16( L_enr, tmp1 ); /* Q(14-exp+6-15)->Q(5-exp) */ - L_enr = L_shl( L_tmp1, add( exp, 1 ) ); /* Q6 */ - - st_fx->lp_ener_fx = L_enr; /* Q6 */ - move32(); - set32_fx( max_val, 0, 2 ); - set16_fx( max_idx, 0, 2 ); - - FOR( i = 0; i < m; i++ ) - { - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) - { - lsp2lsf_fx( &tmp[i * M], lsf_tmp, M, INT_FS_FX ); - ftmp_fx = 964; - move16(); /*X2.56 */ - tmpv = sub( 16384, add( lsf_tmp[M - 1], ftmp_fx ) ); /*QX2.56*/ - L_tmp = L_mult0( tmpv, tmpv ); /*QX6.5536*/ - } - ELSE - { - lsp2lsf_fx( &tmp[i * M], lsf_tmp, M, INT_FS_16k_FX ); - ftmp_fx = 1205; - move16(); /*QX2.56*/ - tmpv = sub( 20480, add( lsf_tmp[M - 1], ftmp_fx ) ); /*QX2.56*/ - L_tmp = L_mult0( tmpv, tmpv ); /*QX6.5536*/ - } - - tmpv = sub( lsf_tmp[0], ftmp_fx ); /*QX2.56*/ - L_tmp = L_mac0( L_tmp, tmpv, tmpv ); /*QX6.5536*/ - FOR( j = 0; j < M - 1; j++ ) - { - tmpv = sub( sub( lsf_tmp[j + 1], lsf_tmp[j] ), ftmp_fx ); /*QX2.56*/ - L_tmp = L_mac0( L_tmp, tmpv, tmpv ); /*QX6.5536*/ - } - - C[i] = Mpy_32_16_1( L_tmp, 1928 ); /*QX6.5536*/ - move32(); - - IF( GT_32( C[i], max_val[0] ) ) - { - max_val[1] = max_val[0]; - move32(); - max_idx[1] = max_idx[0]; - move16(); - max_val[0] = C[i]; - move32(); - max_idx[0] = i; - move16(); - } - ELSE IF( GT_32( C[i], max_val[1] ) ) - { - max_val[1] = C[i]; - move32(); - max_idx[1] = i; - move16(); - } - } - - IF( EQ_16( m, 1 ) ) - { - Copy( tmp, lsp_tmp, M ); /* Qx */ - } - ELSE IF( LT_16( m, 4 ) ) - { - FOR( i = 0; i < M; i++ ) - { - L_tmp1 = 0; - move32(); - FOR( j = 0; j < m; j++ ) - { - L_tmp1 = L_add( L_tmp1, L_deposit_l( tmp[j * M + i] ) ); - } - - L_tmp1 = L_sub( L_tmp1, L_deposit_l( tmp[max_idx[0] * M + i] ) ); - tmpv = div_s( 1, sub( m, 1 ) ); /*Q15*/ - L_tmp1 = Mpy_32_16_1( L_tmp1, tmpv ); /*Q15*/ - lsp_tmp[i] = extract_l( L_tmp1 ); /*Q15*/ - move16(); - } - } - ELSE - { - FOR( i = 0; i < M; i++ ) - { - L_tmp1 = 0; - move32(); - FOR( j = 0; j < m; j++ ) - { - L_tmp1 = L_add( L_tmp1, L_deposit_l( tmp[j * M + i] ) ); - } - - L_tmp1 = L_sub( L_tmp1, L_add( L_deposit_l( tmp[max_idx[0] * M + i] ), L_deposit_l( tmp[max_idx[1] * M + i] ) ) ); /*Q15*/ - tmpv = div_s( 1, sub( m, 2 ) ); /*Q15*/ - L_tmp1 = Mpy_32_16_1( L_tmp1, tmpv ); /*Q15*/ - lsp_tmp[i] = extract_l( L_tmp1 ); /*Q15*/ - move16(); - } - } - - dist = 0; - move16(); /*Q15*/ - max_dev = 0; - move16(); /*Q15*/ - FOR( i = 0; i < M; i++ ) - { - dev = abs_s( sub( lsp_tmp[i], lsp_new[i] ) ); /*Q15*/ - dist = add_o( dist, dev, &Overflow ); /*Q15*/ - if ( GT_16( dev, max_dev ) ) - { - max_dev = dev; - move16(); - } - } - - test(); - IF( GT_16( dist, 13107 ) || GT_16( max_dev, 3277 ) ) /* 0.4 and 0.1 in Q15 */ - { - FOR( i = 0; i < M; i++ ) - { - st_fx->lspCNG_fx[i] = lsp_tmp[i]; - move16(); /*Q15*/ - } - } - ELSE - { - FOR( i = 0; i < M; i++ ) - { - /* AR low-pass filter */ - st_fx->lspCNG_fx[i] = add( mult_r( 26214, lsp_tmp[i] ), mult_r( 6554, lsp_new[i] ) ); /* Q15 */ - move16(); - } - } - IF( m1 > 0 ) - { - FOR( i = 0; i < NUM_ENV_CNG; i++ ) - { - L_tmp = L_deposit_l( 0 ); - FOR( j = 0; j < m1; j++ ) - { - /* env[i] += tmp_env[j*NUM_ENV_CNG+i];*/ - L_tmp = L_add_sat( L_tmp, tmp_env[j * NUM_ENV_CNG + i] ); - } - /* env[i] /= (float)m1; */ - /* env[i] = env[i] - 2*st_fx->lp_ener_fx; */ - IF( EQ_16( m1, 1 ) ) - { - L_tmp = L_sub_sat( L_tmp, L_add_sat( st_fx->lp_ener_fx, st_fx->lp_ener_fx ) ); /* Q6 */ - } - ELSE - { - tmp1 = div_s( 1, m1 ); - L_tmp = Mult_32_16( L_tmp, tmp1 ); /* Q6 */ - L_tmp = L_sub_sat( L_tmp, L_add_sat( st_fx->lp_ener_fx, st_fx->lp_ener_fx ) ); /* Q6 */ - } - env[i] = L_tmp; /* Q6 */ - move32(); - } - - Copy32( env, hTdCngDec->lp_env_fx, NUM_ENV_CNG ); /* Q6 */ - } - } - ELSE - { - Copy( lsp_new, st_fx->lspCNG_fx, M ); /* use newly analyzed ISFs */ /* Q15 */ - } - } - - test(); - IF( EQ_32( st_fx->core_brate, SID_1k75 ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - /* Update hangover memory during CNG */ - test(); - IF( ( *allow_cn_step == 0 ) && LT_32( hTdCngDec->Enew_fx, L_add_sat( st_fx->lp_ener_fx, L_shr( st_fx->lp_ener_fx, 1 ) ) ) ) - { - /* update the pointer to circular buffer of old LSP vectors */ - hTdCngDec->ho_hist_ptr++; - move16(); - if ( EQ_16( hTdCngDec->ho_hist_ptr, HO_HIST_SIZE ) ) - { - hTdCngDec->ho_hist_ptr = 0; - move16(); - } - - /* update the circular buffer of old LSP vectors with the new LSP vector */ - Copy( lsp_new, &( hTdCngDec->ho_lsp_hist_fx[( hTdCngDec->ho_hist_ptr ) * M] ), M ); /* Q15 */ - - /* update the hangover energy buffer */ - hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr] = hTdCngDec->Enew_fx; /* Q6 */ - move32(); - test(); - IF( EQ_32( st_fx->core_brate, SID_2k40 ) && ( *sid_bw == 0 ) ) - { - /* enr1 = (float)log10( st->Enew*L_frame + 0.1f ) / (float)log10( 2.0f );*/ - exp = norm_l( hTdCngDec->Enew_fx ); - L_tmp = L_shl( hTdCngDec->Enew_fx, exp ); /*Q(exp+6)*/ - L_tmp = Mult_32_16( L_tmp, shl( st_fx->L_frame, 5 ) ); /*Q(exp+6+5-15=exp-4)*/ - L_tmp = L_shr_sat( L_tmp, sub( exp, 10 ) ); /*Q6*/ - exp = norm_l( L_tmp ); - fra = Log2_norm_lc( L_shl( L_tmp, exp ) ); - exp = sub( sub( 30, exp ), 6 ); - L_tmp = L_Comp( exp, fra ); - enr1 = L_shr( L_tmp, 10 ); /* Q6 */ - - FOR( i = 0; i < NUM_ENV_CNG; i++ ) - { - /* get quantized envelope */ - /* env[i] = pow(2.0f,(enr1 - q_env[i])) + 2*st->Enew;*/ - L_tmp = L_sub( enr1, q_env[i] ); /* Q6 */ - L_tmp = L_shl( L_tmp, 10 ); /* 16 */ - temp_lo_fx = L_Extract_lc( L_tmp, &temp_hi_fx ); - - exp_pow = sub( 14, temp_hi_fx ); - L_tmp = Pow2( 14, temp_lo_fx ); /* Qexp_pow */ - env[i] = L_shl( L_tmp, sub( 6, exp_pow ) ); /* Q6 */ - move32(); - L_tmp = L_add( hTdCngDec->Enew_fx, hTdCngDec->Enew_fx ); - env[i] = L_add( env[i], L_tmp ); /* Q6 */ - move32(); - } - hTdCngDec->ho_sid_bw = L_shl( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); /* Q0 */ - move32(); - Copy32( env, &( hTdCngDec->ho_env_hist_fx[hTdCngDec->ho_hist_ptr * NUM_ENV_CNG] ), NUM_ENV_CNG ); /* Q6 */ - } - ELSE IF( ( *sid_bw != 0 ) ) - { - hTdCngDec->ho_sid_bw = L_shl( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); /* Q0 */ - move32(); - hTdCngDec->ho_sid_bw = L_or( hTdCngDec->ho_sid_bw, 0x1L ); /* Q0 */ - move32(); - } - - hTdCngDec->ho_hist_size = add( hTdCngDec->ho_hist_size, 1 ); - move16(); - if ( GT_16( hTdCngDec->ho_hist_size, HO_HIST_SIZE ) ) - { - hTdCngDec->ho_hist_size = HO_HIST_SIZE; - move16(); - } - } - /* Update the frame length memory */ - st_fx->last_CNG_L_frame = st_fx->L_frame; - move16(); - - if ( NE_32( st_fx->core_brate, SID_1k75 ) ) - { - hTdCngDec->num_ho = m; - move16(); - } - } - - IF( st_fx->element_mode == EVS_MONO ) - { - st_fx->last_CNG_L_frame = st_fx->L_frame; - move16(); - - IF( NE_32( st_fx->core_brate, SID_1k75 ) ) - { - hTdCngDec->num_ho = m; - move16(); - } - } - IF( st_fx->Opt_AMR_WB ) - { - E_LPC_f_isp_a_conversion( st_fx->lspCNG_fx, Aq, M ); - } - ELSE - { - E_LPC_f_lsp_a_conversion( st_fx->lspCNG_fx, Aq, M ); - } - - tmp_loop = shr( st_fx->L_frame, 6 ); - FOR( i = 1; i < tmp_loop; i++ ) /* L_frame/L_SUBFR */ - { - Copy( Aq, &Aq[i * ( M + 1 )], add( M, 1 ) ); /* Q12 */ - } - - return; -} + * CNG_dec_fx() + * + * Decode residual signal energy + *-----------------------------------------------------------------*/ -void CNG_dec_ivas_fx( +void CNG_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ - const Word16 last_element_mode, /* i : last element mode Q0 */ + const Word16 last_element_mode, /* i : last element mode Q0 */ Word16 Aq[], /* o : LP coefficients Q12 */ Word16 *lsp_new, /* i/o: current frame LSPs Q15 */ Word16 *lsf_new, /* i/o: current frame LSFs Qlog2(2.56) */ Word16 *allow_cn_step, /* o : allow CN step Q0 */ - Word16 *sid_bw /* i : 0-NB/WB, 1-SWB SID Q0 */ - , + Word16 *sid_bw, /* i : 0-NB/WB, 1-SWB SID Q0 */ Word32 *q_env ) { Word16 istep; @@ -742,13 +72,8 @@ void CNG_dec_ivas_fx( Word16 exp_pow; Word16 tmp_loop; Word16 enr_new, Aq_tmp[M + 1]; - Word16 LSF_Q_prediction; /* o : LSF prediction mode - just temporary variable in CNG */ TD_CNG_DEC_HANDLE hTdCngDec; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif hTdCngDec = st_fx->hTdCngDec; m = 0; @@ -778,10 +103,9 @@ void CNG_dec_ivas_fx( } ELSE { - lsf_dec_ivas_fx( st_fx, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0, - NULL ); - /* check IF LSPs may trigger too much synthesis energy */ + lsf_dec_fx( st_fx, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0, NULL ); + /* check IF LSPs may trigger too much synthesis energy */ E_LPC_f_lsp_a_conversion( lsp_new, Aq_tmp, M ); enr_new = Enr_1_Az_fx( Aq_tmp, 2 * L_SUBFR ); @@ -1194,7 +518,7 @@ void CNG_dec_ivas_fx( FOR( i = 0; i < M; i++ ) { dev = abs_s( sub( lsp_tmp[i], lsp_new[i] ) ); /*Q15*/ - dist = add_o( dist, dev, &Overflow ); /*Q15*/ + dist = add_sat( dist, dev ); /*Q15*/ if ( GT_16( dev, max_dev ) ) { max_dev = dev; @@ -1375,7 +699,7 @@ void CNG_dec_ivas_fx( void swb_CNG_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ - const Word16 *synth_fx, /* i : ACELP core synthesis at 32kHz Qsyn*/ + const Word16 *synth_fx, /* i : ACELP core synthesis at 32kHz Qsyn*/ Word16 *shb_synth_fx, /* o : high-band CNG synthesis Qx*/ const Word16 sid_bw, /* i : 0-NB/WB, 1-SWB SID Q0*/ const Word16 Qsyn /* i : Q value of ACELP core synthesis */ @@ -1458,7 +782,7 @@ void swb_CNG_dec_ivas_fx( static void shb_CNG_decod_fx( Decoder_State *st_fx, /* i/o: State structure */ const Word16 *synth_fx, /* i : ACELP core synthesis at 32kHz Qsyn*/ - Word16 *shb_synth_fx, /* o : high-band CNG synthesis Qx*/ + Word16 *shb_synth_fx, /* o : high-band CNG synthesis Qx*/ const Word16 sid_bw, /* i : 0-NB/WB, 1-SWB SID Q0*/ const Word16 Qsyn /* i : Q value of ACELP core synthesis */ ) @@ -1723,9 +1047,9 @@ static void shb_CNG_decod_fx( } static void shb_CNG_decod_ivas_fx( - Decoder_State *st, /* i/o: State structure */ + Decoder_State *st, /* i/o: State structure */ const Word16 *synth_fx, /* i : ACELP core synthesis at 32kHz Qsyn*/ - Word16 *shb_synth_fx, /* o : high-band CNG synthesis Qx*/ + Word16 *shb_synth_fx, /* o : high-band CNG synthesis Qx*/ const Word16 sid_bw, /* i : 0-NB/WB, 1-SWB SID Q0*/ const Word16 Qsyn ) { diff --git a/lib_dec/core_dec_init_fx.c b/lib_dec/core_dec_init_fx.c index 967a93bfbb1a0f63da3846387ed0f3b0ccfb998e..22fed24cb2640ca07b98af6f1d0d7e2741e9924e 100644 --- a/lib_dec/core_dec_init_fx.c +++ b/lib_dec/core_dec_init_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -20,18 +20,7 @@ void open_decoder_LPD_fx( Decoder_State *st, const Word32 total_brate, /* Q0 */ -#ifdef NEW_IVAS_OPEN_DEC - const Word32 last_total_brate, -#endif - const Word16 bwidth /* Q0 */ -#ifdef NEW_IVAS_OPEN_DEC - , - const Word16 is_mct, /* i : MCT mode flag */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - const Word16 last_element_mode, -#endif - const Word16 is_init /* i : indicate call from init_decoder() to avoid double TC initialization */ -#endif + const Word16 bwidth /* Q0 */ ) { Word16 i; @@ -50,10 +39,8 @@ void open_decoder_LPD_fx( hTcxLtpDec = st->hTcxLtpDec; hTcxDec = st->hTcxDec; -#ifndef NEW_IVAS_OPEN_DEC st->total_brate = total_brate; move32(); -#endif if ( NE_16( st->codec_mode, MODE1 ) ) /*already updated in MODE1*/ { @@ -68,42 +55,20 @@ void open_decoder_LPD_fx( fscaleFB = sr2fscale_fx( st->output_Fs ); /* initializing variables for frame lengths etc. right in the beginning */ - st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 ) ); + st->L_frame = extract_l( Mult_32_16( st->sr_core, INV_FRAME_PER_SEC_Q15 ) ); move16(); -#ifndef NEW_IVAS_OPEN_DEC - hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); + hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, INV_FRAME_PER_SEC_Q15 ) ); move16(); -#endif IF( st->ini_frame == 0 ) { st->last_L_frame = st->L_frame_past = st->L_frame; move16(); move16(); -#ifndef NEW_IVAS_OPEN_DEC st->L_frameTCX_past = hTcxDec->L_frameTCX; -#endif move16(); } -#ifdef NEW_IVAS_OPEN_DEC - IF( st->hTcxDec != NULL ) - { - hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); - IF( st->ini_frame == 0 ) - { - st->L_frameTCX_past = st->hTcxDec->L_frameTCX; - move16(); - } - } -#endif st->tcxonly = getTcxonly( -#ifdef IVAS_CODE_SWITCHING - st->element_mode, -#endif st->total_brate -#ifdef IVAS_CODE_SWITCHING - , - is_mct -#endif /*, st->is_ism_format Needed in the last version of float IVAS */ ); move16(); @@ -155,9 +120,6 @@ void open_decoder_LPD_fx( // st->pit_res_max = initPitchLagParameters(12800, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max); // hTcxDec->pit_max_TCX = (int16_t)(st->pit_max * st->output_Fs / 12800); // hTcxDec->pit_min_TCX = (int16_t)(st->pit_min * st->output_Fs / 12800); -#if 0 - PMT("Fixed point to be verified here") -#endif i = mult_r( hTcxDec->L_frameTCX, getInvFrameLen( L_FRAME ) ); /* Q6 */ hTcxDec->pit_max_TCX = extract_l( L_shr( L_mult( st->pit_max, i ), 7 ) ); /* Q0 */ move16(); @@ -243,7 +205,6 @@ void open_decoder_LPD_fx( } /*TCX config*/ -#ifndef NEW_IVAS_OPEN_DEC st->hTcxCfg->preemph_fac = st->preemph_fac; move16(); st->hTcxCfg->tcx_mdct_window_length_old = st->hTcxCfg->tcx_mdct_window_length; @@ -304,34 +265,6 @@ void open_decoder_LPD_fx( } resetTecDec_Fx( st->hTECDec ); - -#else - if ( st->hIGFDec != NULL ) - { - PMT( "To be done" ) - // IF (!is_init || st->element_mode != IVAS_CPE_MDCT) - //{ - // init_tcx_cfg(st->hTcxCfg, total_brate, st->sr_core, st->output_Fs, st->L_frame, st->bwidth, st->hTcxDec->L_frameTCX, st->fscale, encoderLookahead, encoderLookaheadFB, st->preemph_fac, st->tcxonly, st->rf_flag, st->igf, st->hIGFDec->infoIGFStopFreq, st->element_mode, st->ini_frame, MCT_flag); - // } - // else - //{ - // st->hTcxCfg->tcx_curr_overlap_mode = st->hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; - // st->hTcxCfg->last_aldo = 1; - // } - } - /*Constraint for adaptive BPF, otherwise parameter estimation and post-processing not time aligned*/ - IF( st->tcxonly == 0 ) - { - assert( 0 == ( st->hTcxCfg->lfacNext > 0 ? st->hTcxCfg->lfacNext : 0 ) ); - } - // IF (st->tecDec_fx != NULL) - { - resetTecDec_Fx( &( st->tecDec_fx ) ); - } - -#endif - - /* Initialize decoder delay */ @@ -424,7 +357,7 @@ void open_decoder_LPD_fx( test(); IF( EQ_16( st->last_codec_mode, MODE1 ) && st->element_mode == EVS_MONO ) { - Copy( st->lsp_old_fx, st->lspold_uw, M ); /* Q15 */ + Copy( st->lsp_old_fx, st->lspold_uw, M ); /* Q15 */ Copy( st->lsf_old_fx, st->lsfold_uw, M ); /* Q2.56 */ set16_fx( st->syn, 0, M ); /* Q_syn */ } @@ -447,7 +380,6 @@ void open_decoder_LPD_fx( move16(); /*PLC*/ -#ifndef NEW_IVAS_OPEN_DEC IF( st->prev_bfi != 0 ) { PWord16 const *w; @@ -464,8 +396,11 @@ void open_decoder_LPD_fx( move16(); Copy( hHQ_core->fer_samples_fx + delay_comp, hTcxDec->syn_OverlFB, shr( hTcxDec->L_frameTCX, 1 ) ); /* hHQ_core->Q_fer_samples*/ - + hTcxDec->Q_syn_OverlFB = hHQ_core->Q_fer_samples; + move16(); lerp( hHQ_core->fer_samples_fx + delay_comp, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( hTcxDec->L_frameTCX, 1 ) ); /*Q0: ACELP(bfi)->TCX(rect)*/ + hTcxDec->Q_syn_Overl = hHQ_core->Q_fer_samples; + move16(); /*old_out needed for MODE1 routine and syn_Overl_TDAC for MODE2 routine*/ hHQ_core->Q_old_wtda = -1; @@ -498,10 +433,6 @@ void open_decoder_LPD_fx( hTcxDec->Q_syn_Overl_TDAC = hHQ_core->Q_old_wtda_LB; move16(); } -#else - PMT( "acelp_plc_mdct_transition is missing" ) - // acelp_plc_mdct_transition(st); -#endif } test(); @@ -545,9 +476,6 @@ void open_decoder_LPD_fx( set16_fx( hTcxDec->syn_Overl_TDAC, 0, L_FRAME32k / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ /* Q_syn_Overl_TDAC */ set16_fx( hTcxDec->syn_Overl_TDACFB, 0, L_FRAME_MAX / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ /* Q_syn_Overl_TDACFB */ set16_fx( hTcxDec->syn_Overl, 0, L_FRAME32k / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ /* Q_syn_Overl */ -#if 0 - PMT("to be moved to reset_tcx_overl_buf") -#endif } IF( st->hTcxCfg != NULL ) { @@ -575,15 +503,6 @@ void open_decoder_LPD_fx( cldfb_reset_memory( st->cldfbAna ); cldfb_reset_memory( st->cldfbBPF ); cldfb_reset_memory( st->cldfbSyn ); -#ifndef NEW_IVAS_OPEN_DEC -#if 0 - PMT("cldfbSynHB is missing ") -#endif - // IF (st->cldfbSynHB != NULL) - //{ - // cldfb_reset_memory(st->cldfbSynHB); - // } -#endif } ELSE IF( ( NE_16( st->L_frame, st->last_L_frame ) ) && ( LE_16( st->L_frame, L_FRAME16k ) ) && ( LE_16( st->last_L_frame, L_FRAME16k ) ) ) /* Rate switching between 12.8 and 16 kHz*/ { @@ -817,10 +736,6 @@ void open_decoder_LPD_fx( test(); IF( EQ_16( st->core, ACELP_CORE ) && EQ_16( st->last_core, HQ_CORE ) ) { - /*_DIFF_FLOAT_FIX_*/ -#if 0 - PMT("floating point is using L_frameTCX instead of output_frame, is it ok?") -#endif frame_ener_fx( st->output_frame_fx, UNVOICED_CLAS, st->previoussynth_fx, -1, &st->enr_old_fx, 1, 0, 0, 0 ); } } @@ -840,20 +755,6 @@ void open_decoder_LPD_fx( move16(); if ( st->hTcxDec != NULL ) { -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - /* Todo: should be considered for other stereo modes as well */ - IF( is_init || MCT_flag || !( st->element_mode == IVAS_CPE_MDCT && st->element_mode == last_element_mode ) ) - { - PMT( "Fixed point to be done" ) - st->hTcxDec->CngLevelBackgroundTrace_bfi = PLC_MIN_CNG_LEV; - st->hTcxDec->NoiseLevelIndex_bfi = PLC_MIN_STAT_BUFF_SIZE - 1; - st->hTcxDec->CurrLevelIndex_bfi = 0; - st->hTcxDec->LastFrameLevel_bfi = PLC_MIN_CNG_LEV; - set_f( st->hTcxDec->NoiseLevelMemory_bfi, PLC_MIN_CNG_LEV, PLC_MIN_STAT_BUFF_SIZE ); - - st->hTcxDec->cummulative_damping_tcx = 1.0f; - } -#else hTcxDec->conCngLevelBackgroundTrace = PLC_MIN_CNG_LEV_Q21; /*Q21*/ move16(); hTcxDec->conNoiseLevelIndex = PLC_MIN_STAT_BUFF_SIZE - 1; /* Q0 */ @@ -871,7 +772,6 @@ void open_decoder_LPD_fx( hTcxDec->cummulative_damping_tcx = 32767 /*1.0f Q15*/; move16(); -#endif } st->cummulative_damping = 32767 /*1.0f Q15*/; move16(); @@ -891,10 +791,8 @@ void open_decoder_LPD_fx( st->old_fpitch = L_deposit_h( st->pit_min ); move32(); -#ifndef NEW_IVAS_OPEN_DEC st->old_fpitchFB = L_deposit_h( hTcxDec->pit_min_TCX ); move32(); -#endif st->rate_switching_init = 1; move16(); @@ -924,9 +822,6 @@ void open_decoder_LPD_fx( test(); IF( hTcxLtpDec != NULL && ( EQ_16( st->ini_frame, 0 ) || ( EQ_16( st->last_codec_mode, MODE1 ) && st->element_mode == EVS_MONO ) ) ) { -#if 0 - PMT("TO be verify, update seems to differ from float") -#endif hTcxLtpDec->tcxltp_pitch_int = st->pit_max; /* Q0 */ move16(); hTcxLtpDec->tcxltp_pitch_fr = 0; /* Q0 */ @@ -1059,12 +954,6 @@ void open_decoder_LPD_fx( move16(); st->second_last_core = -1; move16(); -#ifdef NEW_IVAS_OPEN_DEC - IF( st->hTcxCfg != NULL && st->element_mode != EVS_MONO ) - { - st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( is_init ? total_brate : st->bits_frame_nominal * FRAMES_PER_SEC, st->igf ); - } -#endif IF( hTcxDec != NULL ) { hTcxDec->tcxltp_second_last_pitch = st->old_fpitch; /*15Q16*/ @@ -1105,10 +994,8 @@ void open_decoder_LPD_fx( hTcxDec->tcx_hm_LtpPitchLag = -1; move16(); } -#ifndef NEW_IVAS_OPEN_DEC st->hTcxCfg->na_scale = 32767 /*1.0f Q15*/; move16(); -#endif if ( hTcxLtpDec != NULL ) { hTcxLtpDec->tcxltp_gain = 0; /* Q15 */ @@ -1185,8 +1072,12 @@ void acelp_plc_mdct_transition_fx( delay_comp = NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ); move16(); /*CLDFB delay*/ - Copy( st->hHQ_core->fer_samples_fx + delay_comp, st->hTcxDec->syn_OverlFB, shr( st->hTcxDec->L_frameTCX, 1 ) ); /* Q_fer_samples */ + Copy( st->hHQ_core->fer_samples_fx + delay_comp, st->hTcxDec->syn_OverlFB, shr( st->hTcxDec->L_frameTCX, 1 ) ); /* Q_fer_samples */ + st->hTcxDec->Q_syn_OverlFB = st->hHQ_core->Q_fer_samples; + move16(); lerp( st->hHQ_core->fer_samples_fx + delay_comp, st->hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( st->hTcxDec->L_frameTCX, 1 ) ); /*ACELP(bfi)->TCX(rect)*/ + st->hTcxDec->Q_syn_Overl = st->hHQ_core->Q_fer_samples; + move16(); /*old_out needed for MODE1 routine and syn_Overl_TDAC for MODE2 routine*/ st->hHQ_core->Q_old_wtda = -1; move16(); @@ -1222,10 +1113,10 @@ void acelp_plc_mdct_transition_fx( } void open_decoder_LPD_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word32 total_brate, /* i : total bitrate Q0*/ - const Word32 last_total_brate, /* i : last total bitrate Q0*/ - const Word16 bwidth, /* i : audio bandwidth Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + const Word32 total_brate, /* i : total bitrate Q0*/ + const Word32 last_total_brate, /* i : last total bitrate Q0*/ + const Word16 bwidth, /* i : audio bandwidth Q0*/ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ const Word16 last_element_mode, /* i : last element mode Q0*/ const Word16 is_init, /* i : indicate call from init_decoder() to avoid double TC initialization Q0*/ @@ -1268,7 +1159,7 @@ void open_decoder_LPD_ivas_fx( move16(); /* initializing variables for frame lengths etc. right in the beginning */ - st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 ) ); /* 0.02 in Q15 */ + st->L_frame = extract_l( Mult_32_16( st->sr_core, INV_FRAME_PER_SEC_Q15 ) ); move16(); if ( st->ini_frame == 0 ) { @@ -1278,7 +1169,7 @@ void open_decoder_LPD_ivas_fx( } IF( st->hTcxDec != NULL ) { - st->hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); /* 0.02 in Q15 */ + st->hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, INV_FRAME_PER_SEC_Q15 ) ); move16(); st->output_frame_fx = st->hTcxDec->L_frameTCX; /* Q0 */ move16(); @@ -1388,7 +1279,7 @@ void open_decoder_LPD_ivas_fx( st->inv_gamma = GAMMA16k_INV; move16(); } - ELSE IF( GT_32( st->sr_core, INT_FS_16k ) && EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) + ELSE IF( GT_16( st->element_mode, EVS_MONO ) && GT_32( st->sr_core, INT_FS_16k ) ) { st->gamma = GAMMA16k; move16(); @@ -2206,6 +2097,9 @@ void reset_tcx_overl_buf_fx( set16_fx( hTcxDec->syn_Overl, 0, L_FRAME32k / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ hTcxDec->Q_syn_Overl = 0; move16(); + set16_fx( hTcxDec->syn_OverlFB, 0, L_FRAME48k / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ + hTcxDec->Q_syn_OverlFB = 0; + move16(); set16_fx( hTcxDec->syn_Overl_TDACFB, 0, L_FRAME_MAX / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ hTcxDec->Q_syn_Overl_TDACFB = 0; move16(); diff --git a/lib_dec/core_dec_reconf_fx.c b/lib_dec/core_dec_reconf_fx.c index 2eee8cd9f23e005d13c210b15d5cbfaad80865ef..d844e666b1b6bcec91a7bc17b6496825a0867360 100644 --- a/lib_dec/core_dec_reconf_fx.c +++ b/lib_dec/core_dec_reconf_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -11,7 +11,7 @@ void reconfig_decoder_LPD_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ + Decoder_State *st, /* i/o: decoder state structure */ const Word16 bits_frame, /* i : bit budget Q0*/ const Word16 bwidth, /* i : audio bandwidth Q0*/ const Word32 total_brate, /* i : total bitrate Q0*/ diff --git a/lib_dec/core_dec_switch_fx.c b/lib_dec/core_dec_switch_fx.c index 63c35f876e3da1d41836c8b99f588463a42c8502..b22a48b43cf685fa4255336d593e0698cfaa7ba9 100644 --- a/lib_dec/core_dec_switch_fx.c +++ b/lib_dec/core_dec_switch_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -10,21 +10,10 @@ #include "rom_com.h" void mode_switch_decoder_LPD_fx( - Decoder_State *st, /* i/o: decoder state structure */ - Word16 bwidth, /* i : audio bandwidth Q0*/ - Word32 total_brate, /* i : total bitrate Q0*/ -#ifdef IVAS_CODE_SWITCHING - const Word32 last_total_brate, /* i : last frame total bitrate */ -#endif + Decoder_State *st, /* i/o: decoder state structure */ + Word16 bwidth, /* i : audio bandwidth Q0*/ + Word32 total_brate, /* i : total bitrate Q0*/ Word16 frame_size_index /* i : index determining the frame size Q0*/ -#ifdef IVAS_CODE_SWITCHING - , - const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - , - const Word16 last_element_mode -#endif -#endif ) { Word16 fscale, switchWB; @@ -100,15 +89,7 @@ void mode_switch_decoder_LPD_fx( test(); IF( NE_16( fscale, st->fscale ) || ( switchWB != 0 ) || ( bSwitchFromAmrwbIO != 0 ) || EQ_16( st->last_codec_mode, MODE1 ) || st->force_lpd_reset ) { -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - open_decoder_LPD_fx( st, total_brate, last_total_brate, bwidth, MCT_flag, last_element_mode, 0 ); -#else -#ifdef IVAS_CODE - open_decoder_LPD_fx( st, total_brate, last_total_brate, bwidth, is_mct, 0 ); -#else open_decoder_LPD_fx( st, total_brate, bwidth ); -#endif -#endif } ELSE { @@ -118,10 +99,10 @@ void mode_switch_decoder_LPD_fx( move16(); st->fscale = fscale; move16(); - st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 ) ); /* Q0 */ + st->L_frame = extract_l( Mult_32_16( st->sr_core, INV_FRAME_PER_SEC_Q15 ) ); /* Q0 */ IF( hTcxDec != NULL ) { - hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); /* Q0 */ + hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, INV_FRAME_PER_SEC_Q15 ) ); /* Q0 */ move16(); } IF( st->hTcxCfg != NULL ) @@ -153,9 +134,6 @@ void mode_switch_decoder_LPD_fx( IF( ( st->hTcxCfg->fIsTNSAllowed != 0 ) && st->hIGFDec != NULL ) { InitTnsConfigs( bwidth, st->hTcxCfg->tcx_coded_lines, st->hTcxCfg->tnsConfig, st->hIGFDec->infoIGFStopFreq, total_brate, st->element_mode, 0 /* 0 should be replaced with MCT_flag*/ ); -#ifdef IVAS_CODE - SetAllowTnsOnWhite( st->hTcxCfg->tnsConfig, st->element_mode == IVAS_CPE_MDCT ); -#endif } } } @@ -258,13 +236,13 @@ void mode_switch_decoder_LPD_fx( } void mode_switch_decoder_LPD_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word16 bwidth, /* i : audio bandwidth Q0*/ - const Word32 total_brate, /* i : total bitrate Q0*/ - const Word32 last_total_brate, /* i : last frame total bitrate Q0*/ - const Word16 frame_size_index, /* i : index determining the frame size Q0*/ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ - const Word16 last_element_mode, /* i : last element mode Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 bwidth, /* i : audio bandwidth Q0*/ + const Word32 total_brate, /* i : total bitrate Q0*/ + const Word32 last_total_brate, /* i : last frame total bitrate Q0*/ + const Word16 frame_size_index, /* i : index determining the frame size Q0*/ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ + const Word16 last_element_mode, /* i : last element mode Q0*/ Word16 *Q_syn_Overl_TDAC, Word16 *Q_fer_samples, Word16 *Q_syn_Overl, @@ -342,7 +320,7 @@ void mode_switch_decoder_LPD_ivas_fx( test(); test(); - assert( (Word16) ( st->sr_core / FRAMES_PER_SEC ) == extract_l( Mult_32_16( st->sr_core, 0x0290 ) ) ); + assert( (Word16) ( st->sr_core / FRAMES_PER_SEC ) == extract_l( Mult_32_16( st->sr_core, INV_FRAME_PER_SEC_Q15 ) ) ); IF( NE_16( fscale, st->fscale ) || switchWB || bSwitchFromAmrwbIO || EQ_16( st->last_codec_mode, MODE1 ) || st->force_lpd_reset ) { open_decoder_LPD_ivas_fx( st, total_brate, last_total_brate, bwidth, MCT_flag, last_element_mode, 0, Q_syn_Overl_TDAC, Q_fer_samples, Q_syn_Overl, Q_syn_Overl_TDACFB, Q_syn_OverlFB, Q_old_out, Q_old_outLB, Q_old_Aq_12_8 ); @@ -354,11 +332,11 @@ void mode_switch_decoder_LPD_ivas_fx( move16(); st->fscale = fscale; move16(); - st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 ) ); + st->L_frame = extract_l( Mult_32_16( st->sr_core, INV_FRAME_PER_SEC_Q15 ) ); move16(); IF( st->hTcxDec != NULL ) { - st->hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); /* Q0 */ + st->hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, INV_FRAME_PER_SEC_Q15 ) ); /* Q0 */ move16(); st->output_frame_fx = st->hTcxDec->L_frameTCX; /* Q0 */ move16(); diff --git a/lib_dec/core_switching_dec_fx.c b/lib_dec/core_switching_dec_fx.c index 1f6b0dd5178407824010789fac18653a76897de7..8bab0d0615082173235cbc1d82893dd6957d809d 100644 --- a/lib_dec/core_switching_dec_fx.c +++ b/lib_dec/core_switching_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -174,17 +174,13 @@ static Word32 Calc_freq_ener_fx( *---------------------------------------------------------------------*/ void bw_switching_pre_proc_fx( - const Word16 *old_syn_12k8_16k_fx, /* i : ACELP core synthesis at 12.8kHz or 16kHz Qx*/ + const Word16 *old_syn_12k8_16k_fx, /* i : ACELP core synthesis at 12.8kHz or 16kHz Qx*/ Decoder_State *st_fx /* i/o: decoder state structure */ ) { Word16 i; Word16 syn_dct_fx[L_FRAME]; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif IF( st_fx->element_mode > EVS_MONO ) { @@ -198,7 +194,7 @@ void bw_switching_pre_proc_fx( * Calculate tilt of the ACELP core synthesis *----------------------------------------------------------------------*/ - st_fx->tilt_wb_fx = round_fx_o( L_shl_o( calc_tilt_bwe_fx( old_syn_12k8_16k_fx, -1, st_fx->L_frame ), 3, &Overflow ), &Overflow ); /* Q11 */ + st_fx->tilt_wb_fx = round_fx_sat( L_shl_sat( calc_tilt_bwe_fx( old_syn_12k8_16k_fx, -1, st_fx->L_frame ), 3 ) ); /* Q11 */ move16(); /*-------------------------------------------------------------------------------* * Calculate frequency energy of 0~3.2kHz and 3.2~6.4kHz the ACELP core synthesis @@ -209,7 +205,7 @@ void bw_switching_pre_proc_fx( L_tmp = L_deposit_l( 0 ); FOR( i = 0; i < L_FRAME / 2; i++ ) { - L_tmp = L_mac0_o( L_tmp, syn_dct_fx[i], syn_dct_fx[i], &Overflow ); /* (2 * Q_syn2) */ + L_tmp = L_mac0_sat( L_tmp, syn_dct_fx[i], syn_dct_fx[i] ); /* (2 * Q_syn2) */ } L_tmp = L_shr( L_tmp, 7 ); /* 2 * Q_syn2 */ st_fx->enerLL_fx = Calc_freq_ener_fx( L_tmp, shl( st_fx->Q_syn2, 1 ) ); /* Q_syn2 */ @@ -217,7 +213,7 @@ void bw_switching_pre_proc_fx( L_tmp = L_deposit_l( 0 ); FOR( ; i < L_FRAME; i++ ) { - L_tmp = L_mac0_o( L_tmp, syn_dct_fx[i], syn_dct_fx[i], &Overflow ); + L_tmp = L_mac0_sat( L_tmp, syn_dct_fx[i], syn_dct_fx[i] ); } L_tmp = L_shr( L_tmp, 7 ); /* 2 * Q_syn2 */ st_fx->enerLH_fx = Calc_freq_ener_fx( L_tmp, shl( st_fx->Q_syn2, 1 ) ); /* Q_syn2 */ @@ -230,7 +226,7 @@ void bw_switching_pre_proc_fx( L_tmp = L_deposit_l( 0 ); FOR( i = 0; i < 32; i++ ) { - L_tmp = L_mac0_o( L_tmp, st_fx->t_audio_q_fx[i], st_fx->t_audio_q_fx[i], &Overflow ); /* 2 * Q_syn2 */ + L_tmp = L_mac0_sat( L_tmp, st_fx->t_audio_q_fx[i], st_fx->t_audio_q_fx[i] ); /* 2 * Q_syn2 */ } L_tmp = L_shr( L_tmp, 5 ); /* 2 * Q_syn2 */ st_fx->enerLL_fx = Calc_freq_ener_fx( L_tmp, shl( st_fx->Q_syn2, 1 ) ); /* Q_syn2 */ @@ -238,7 +234,7 @@ void bw_switching_pre_proc_fx( L_tmp = L_deposit_l( 0 ); FOR( ; i < 64; i++ ) { - L_tmp = L_mac0_o( L_tmp, st_fx->t_audio_q_fx[i], st_fx->t_audio_q_fx[i], &Overflow ); /* 2 * Q_syn2 */ + L_tmp = L_mac0_sat( L_tmp, st_fx->t_audio_q_fx[i], st_fx->t_audio_q_fx[i] ); /* 2 * Q_syn2 */ } L_tmp = L_shr( L_tmp, 5 ); /* 2 * Q_syn2 */ st_fx->enerLH_fx = Calc_freq_ener_fx( L_tmp, shl( st_fx->Q_syn2, 1 ) ); /* Q_syn2 */ @@ -249,7 +245,7 @@ void bw_switching_pre_proc_fx( L_tmp = L_deposit_l( 0 ); FOR( i = 0; i < L_FRAME / 2; i++ ) { - L_tmp = L_mac0_o( L_tmp, st_fx->t_audio_q_fx[i], st_fx->t_audio_q_fx[i], &Overflow ); /* 2 * Q_syn2 */ + L_tmp = L_mac0_sat( L_tmp, st_fx->t_audio_q_fx[i], st_fx->t_audio_q_fx[i] ); /* 2 * Q_syn2 */ } L_tmp = L_shr( L_tmp, 7 ); /* 2 * Q_syn2 */ st_fx->enerLL_fx = Calc_freq_ener_fx( L_tmp, shl( st_fx->Q_syn2, 1 ) ); /* Q_syn2 */ @@ -257,7 +253,7 @@ void bw_switching_pre_proc_fx( L_tmp = L_deposit_l( 0 ); FOR( ; i < L_FRAME; i++ ) { - L_tmp = L_mac0_o( L_tmp, st_fx->t_audio_q_fx[i], st_fx->t_audio_q_fx[i], &Overflow ); /* 2 * Q_syn2 */ + L_tmp = L_mac0_sat( L_tmp, st_fx->t_audio_q_fx[i], st_fx->t_audio_q_fx[i] ); /* 2 * Q_syn2 */ } L_tmp = L_shr( L_tmp, 7 ); /* 2 * Q_syn2 */ st_fx->enerLH_fx = Calc_freq_ener_fx( L_tmp, shl( st_fx->Q_syn2, 1 ) ); /* Q_syn2 */ @@ -879,7 +875,7 @@ ivas_error core_switching_pre_dec_fx( ivas_error core_switching_post_dec_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 *synth, /* i/o: output synthesis Qsynth*/ + Word16 *synth, /* i/o: output synthesis Qsynth*/ const Word16 output_frame, /* i : frame length Q0*/ const Word16 core_switching_flag, /* i : ACELP->HQ switching flag Q0*/ const Word16 last_element_mode, /* i : element mode of previous frame Q0*/ @@ -898,9 +894,7 @@ ivas_error core_switching_post_dec_fx( HQ_DEC_HANDLE hHQ_core; ivas_error error; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) ( last_element_mode ); -#endif hBWE_TD = st_fx->hBWE_TD; hBWE_FD = st_fx->hBWE_FD; hHQ_core = st_fx->hHQ_core; @@ -1069,7 +1063,7 @@ ivas_error core_switching_post_dec_fx( hHQ_core->Q_old_wtda = Qtmp; move16(); - Copy( st_fx->delay_buf_out_fx, synth, delay_comp ); /* copy the HQ/ACELP delay synchroniation buffer at the beginning of ACELP frame Q0*/ + Copy( st_fx->delay_buf_out_fx, synth, delay_comp ); /* copy the HQ/ACELP delay synchroniation buffer at the beginning of ACELP frame Q0*/ tmp = i_mult2( delta, N_ZERO_8 ); shift = i_mult2( Fs_kHz, 3 ); @@ -1264,7 +1258,7 @@ ivas_error core_switching_post_dec_fx( ivas_error core_switching_post_dec_ivas_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 *synth, /* i/o: output synthesis Qsynth*/ - Word32 *output_fx, /* i/o: LB synth/upsampled LB synth Q4*/ + Word32 *output_fx, /* i/o: LB synth/upsampled LB synth Q4*/ Word16 output_mem_fx[], /* i : OLA memory from last TCX/HQ frame Qx*/ const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo Q0*/ const Word16 output_frame, /* i : frame length Q0*/ @@ -1636,14 +1630,18 @@ ivas_error core_switching_post_dec_ivas_fx( test(); IF( EQ_16( st_fx->last_core, HQ_CORE ) || st_fx->last_core == TCX_20_CORE || st_fx->last_core == TCX_10_CORE ) /* MDCT to ACELP transition */ { + Word16 Q_old_postdec = 0; + move16(); Qtmp = s_min( *Qsynth, 0 ); IF( hHQ_core != NULL ) { Qtmp = s_min( s_min( *Qsynth, hHQ_core->Q_old_postdec ), hHQ_core->Q_old_wtda ); + Q_old_postdec = hHQ_core->Q_old_postdec; + move16(); } - Scale_sig( synth, output_frame, sub( Qtmp, *Qsynth ) ); /* Qtmp */ - Scale_sig( st_fx->delay_buf_out_fx, delay_comp, Qtmp ); /*delay buff_out_fx is Q0*/ + Scale_sig( synth, output_frame, sub( Qtmp, *Qsynth ) ); /* Qtmp */ + Scale_sig( st_fx->delay_buf_out_fx, delay_comp, sub( Qtmp, Q_old_postdec ) ); /* delay buff_out_fx is Qtmp */ IF( hHQ_core != NULL ) { Scale_sig( hHQ_core->old_out_fx, L_FRAME48k, sub( Qtmp, hHQ_core->Q_old_wtda ) ); /* Qtmp */ @@ -1701,6 +1699,7 @@ ivas_error core_switching_post_dec_ivas_fx( move16(); ptmp1++; ptmp2++; + tmpF = add( tmpF, tmp ); /* Q15 */ } } ELSE @@ -2058,11 +2057,7 @@ static void core_switch_lb_upsamp_fx( } /* synthesis of the combined signal */ -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, output, i_mult( CLDFB_OVRLP_MIN_SLOTS, st->cldfbSyn->no_channels ), 0, st->cldfbSyn ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, output, i_mult( CLDFB_OVRLP_MIN_SLOTS, st->cldfbSyn->no_channels ), st->cldfbSyn ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, output, i_mult( CLDFB_OVRLP_MIN_SLOTS, st->cldfbSyn->no_channels ), 0, 0, st->cldfbSyn ); /*rescaling whole buffer to a common Q*/ no_col = st->cldfbSyn->no_col; @@ -2100,13 +2095,8 @@ static void smoothTransitionDtxToTcx_fx( Word16 i, filter_len; Word16 w, step, fade_in; Word32 mem; -#ifdef MSAN_FIX - Word16 smoothing_input_buffer[2 * NS2SA( 48000, DELAY_CLDFB_NS ) + TRANSITION_SMOOTHING_LEN_48k]; - Word16 smoothing_out_buffer[2 * NS2SA( 48000, DELAY_CLDFB_NS ) + TRANSITION_SMOOTHING_LEN_48k]; -#else Word16 smoothing_input_buffer[2 * NS2SA( 48000, DELAY_CLDFB_NS ) + TRANSITION_SMOOTHING_LEN_48k]; Word16 smoothing_out_buffer[2 * NS2SA( 48000, DELAY_CLDFB_NS ) + TRANSITION_SMOOTHING_LEN_48k]; -#endif set16_fx( smoothing_input_buffer, 0, 2 * NS2SA( 48000, DELAY_CLDFB_NS ) + TRANSITION_SMOOTHING_LEN_48k ); set16_fx( smoothing_out_buffer, 0, 2 * NS2SA( 48000, DELAY_CLDFB_NS ) + TRANSITION_SMOOTHING_LEN_48k ); @@ -2241,10 +2231,8 @@ ivas_error core_switching_pre_dec_ivas_fx( test(); IF( st->hBWE_TD != NULL && ( st->last_core != ACELP_CORE ) ) { -#ifdef MSAN_FIX st->hBWE_TD->prev_hb_synth_fx_exp = 31; move16(); -#endif // MSAN_FIX /* reset BWE memories */ set16_fx( st->hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 ); st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; @@ -2262,9 +2250,7 @@ ivas_error core_switching_pre_dec_ivas_fx( IF( GT_32( st->output_Fs, 16000 ) && st->hBWE_zero != NULL ) { hf_synth_reset_fx( st->hBWE_zero ); -#ifdef MSAN_FIX set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); -#endif } IF( st->hBWE_FD != NULL ) @@ -2379,11 +2365,7 @@ ivas_error core_switching_pre_dec_ivas_fx( return error; } -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, fer_samples_fx, delay_comp, 0, st->cldfbSyn ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, fer_samples_fx, delay_comp, st->cldfbSyn ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, fer_samples_fx, delay_comp, 0, 0, st->cldfbSyn ); cldfb_restore_memory_ivas_fx( st->cldfbSyn ); Copy_Scale_sig_32_16( syn_Overl_fx, st->hTcxDec->syn_Overl, 320, 15 ); Copy_Scale_sig_32_16( fer_samples_fx, st->hHQ_core->fer_samples_fx, 960, 9 ); @@ -2469,8 +2451,11 @@ ivas_error core_switching_pre_dec_ivas_fx( test(); test(); test(); - IF( ( ( ( st->core == ACELP_CORE ) || EQ_16( st->core, AMR_WB_CORE ) ) && EQ_16( st->last_core, HQ_CORE ) ) || ( ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( last_element_mode, IVAS_CPE_DFT ) ) ) && EQ_16( nchan_out, 2 ) && - NE_32( st->core_brate, SID_2k40 ) && ( st->core_brate != FRAME_NO_DATA ) && ( ( last_core_brate_st0 == FRAME_NO_DATA ) || EQ_32( last_core_brate_st0, SID_2k40 ) ) ) ) + test(); + test(); + IF( ( ( ( st->core == ACELP_CORE ) || EQ_16( st->core, AMR_WB_CORE ) ) && EQ_16( st->last_core, HQ_CORE ) ) || + ( ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( last_element_mode, IVAS_CPE_DFT ) ) ) && EQ_16( nchan_out, 2 ) && NE_32( st->core_brate, SID_2k40 ) && ( st->core_brate != FRAME_NO_DATA ) && ( ( last_core_brate_st0 == FRAME_NO_DATA ) || EQ_32( last_core_brate_st0, SID_2k40 ) ) ) || + ( st->core == ACELP_CORE && GT_16( st->last_L_frame, L_FRAME16k ) ) /* TCX @ 25.6/32 kHz -> ACELP */ ) { test(); if ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) @@ -2587,9 +2572,7 @@ ivas_error core_switching_pre_dec_ivas_fx( IF( GT_32( st->output_Fs, 16000 ) && st->hBWE_zero != NULL ) { hf_synth_reset_fx( st->hBWE_zero ); -#ifdef MSAN_FIX set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); -#endif } IF( st->hBWE_FD != NULL ) @@ -2639,9 +2622,7 @@ ivas_error core_switching_pre_dec_ivas_fx( IF( GT_32( st->output_Fs, 16000 ) && st->hBWE_zero != NULL ) { hf_synth_reset_fx( st->hBWE_zero ); -#ifdef MSAN_FIX set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); -#endif } IF( st->hBWE_FD != NULL ) @@ -2662,11 +2643,7 @@ ivas_error core_switching_pre_dec_ivas_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for old_synth_lenFB (32 bit) \n" ) ); } -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( st->hTcxDec->old_synthFB_fx, old_synthFB_fx, st->hTcxDec->old_synth_lenFB, sub( Q10, Q_old_synthFB ) ); // Q10 -#else - Copy_Scale_sig_16_32_DEPREC( st->hTcxDec->old_synthFB_fx, old_synthFB_fx, st->hTcxDec->old_synth_lenFB, sub( Q10, Q_old_synthFB ) ); // Q10 -#endif Copy32( old_synthFB_fx + st->hTcxDec->old_synth_lenFB - offset, st->cldfbAna->cldfb_state_fx, offset ); st->cldfbAna->Q_cldfb_state = Q10; move16(); @@ -3008,9 +2985,6 @@ void ivas_bw_switching_pre_proc_fx( Word32 syn_dct_fx[L_FRAME]; - Flag Overflow = 0; - move32(); - IF( st->element_mode > EVS_MONO ) { test(); @@ -3092,7 +3066,7 @@ void ivas_bw_switching_pre_proc_fx( move32(); FOR( i = 0; i < 32; i++ ) { - L_tmp = L_mac0_o( L_tmp, st->t_audio_q_fx[i], st->t_audio_q_fx[i], &Overflow ); + L_tmp = L_mac0_sat( L_tmp, st->t_audio_q_fx[i], st->t_audio_q_fx[i] ); } tmp = L_shr( L_tmp, 5 ); // divide by 32 tmp = getSqrtWord32( tmp ); @@ -3105,7 +3079,7 @@ void ivas_bw_switching_pre_proc_fx( move32(); FOR( ; i < 64; i++ ) { - L_tmp = L_mac0_o( L_tmp, st->t_audio_q_fx[i], st->t_audio_q_fx[i], &Overflow ); + L_tmp = L_mac0_sat( L_tmp, st->t_audio_q_fx[i], st->t_audio_q_fx[i] ); } tmp = L_shr( L_tmp, 5 ); // divide by 32 @@ -3121,7 +3095,7 @@ void ivas_bw_switching_pre_proc_fx( move32(); FOR( i = 0; i < L_FRAME / 2; i++ ) { - L_tmp = L_mac0_o( L_tmp, st->t_audio_q_fx[i], st->t_audio_q_fx[i], &Overflow ); + L_tmp = L_mac0_sat( L_tmp, st->t_audio_q_fx[i], st->t_audio_q_fx[i] ); } tmp = L_shr( L_tmp, 5 ); // divide by 32 tmp = getSqrtWord32( tmp ); @@ -3134,7 +3108,7 @@ void ivas_bw_switching_pre_proc_fx( move32(); FOR( ; i < L_FRAME; i++ ) { - L_tmp = L_mac0_o( L_tmp, st->t_audio_q_fx[i], st->t_audio_q_fx[i], &Overflow ); + L_tmp = L_mac0_sat( L_tmp, st->t_audio_q_fx[i], st->t_audio_q_fx[i] ); } tmp = L_shr( L_tmp, 5 ); // divide by 32 tmp = getSqrtWord32( tmp ); diff --git a/lib_dec/d_gain2p_fx.c b/lib_dec/d_gain2p_fx.c index 4d1c101c05441b731f8d866b3d1b8e5cc92c40e3..c9a35c181692332fca1e9078f4f584dc7a0a28d4 100644 --- a/lib_dec/d_gain2p_fx.c +++ b/lib_dec/d_gain2p_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_dec/dec2t32_fx.c b/lib_dec/dec2t32_fx.c index 71b284562a16e1b7ab05e9547303093f111cb285..77ded3a34da5976e506f7e771c248f70def3edf2 100644 --- a/lib_dec/dec2t32_fx.c +++ b/lib_dec/dec2t32_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -8,28 +8,28 @@ /*==========================================================================*/ -/* FUNCTION : void dec_acelp_2t32_fx () */ +/* FUNCTION : void dec_acelp_2t32_fx () */ /*--------------------------------------------------------------------------*/ -/* PURPOSE : */ -/* * 12 bits algebraic codebook decoder. */ -/* * 2 track x 32 positions per track = 64 samples. */ -/* * 12 bits --> 2 pulses in a frame of 64 samples. */ -/* * All pulses can have two (2) possible amplitudes: +1 or -1. */ -/* * Each pulse can have 32 possible positions. */ -/* * See cod2t32.c for more details of the algebraic code. */ +/* PURPOSE : */ +/* * 12 bits algebraic codebook decoder. */ +/* * 2 track x 32 positions per track = 64 samples. */ +/* * 12 bits --> 2 pulses in a frame of 64 samples. */ +/* * All pulses can have two (2) possible amplitudes: +1 or -1. */ +/* * Each pulse can have 32 possible positions. */ +/* * See cod2t32.c for more details of the algebraic code. */ /*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _Word16 i_subfr, i : subframe index */ /*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /* _Word16 code[] o : algebraic (fixed) codebook excitation Q12 */ /*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*--------------------------------------------------------------------------*/ -/* CALLED FROM : */ +/* CALLED FROM : */ /*==========================================================================*/ void dec_acelp_2t32_fx( @@ -72,24 +72,24 @@ void dec_acelp_2t32_fx( } /*==========================================================================*/ -/* FUNCTION : void dec_acelp_1t64_fx () */ +/* FUNCTION : void dec_acelp_1t64_fx () */ /*--------------------------------------------------------------------------*/ -/* PURPOSE : * 7 bits algebraic codebook. */ -/* * 1 track x 64 positions per track = 64 samples. */ +/* PURPOSE : * 7 bits algebraic codebook. */ +/* * 1 track x 64 positions per track = 64 samples. */ /* * The pulse can have 64 possible positions and two (2) possible amplitudes: +1 or -1.*/ /*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _Word16 i_subfr, i : subframe index */ /*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /* _Word16 code[] o : algebraic (fixed) codebook excitation Q12 */ /*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*--------------------------------------------------------------------------*/ -/* CALLED FROM : */ +/* CALLED FROM : */ /*==========================================================================*/ void dec_acelp_1t64_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ diff --git a/lib_dec/dec4t64_fx.c b/lib_dec/dec4t64_fx.c index ee6ef65a6ce3aa2b91e1020f51ad5f12405baa84..23313262ce1b2ac1f9c9e08a59df85e9114a1686 100644 --- a/lib_dec/dec4t64_fx.c +++ b/lib_dec/dec4t64_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -22,32 +22,32 @@ static void fcb_decode_PI_fx( Word32 code_index, Word16 sector_6p[], Word16 puls /*==========================================================================*/ -/* FUNCTION : void dec_acelp_4t64_fx () */ +/* FUNCTION : void dec_acelp_4t64_fx () */ /*--------------------------------------------------------------------------*/ -/* PURPOSE : */ -/* * 20, 36 bits algebraic codebook decoder. */ -/* * 4 tracks x 16 positions per track = 64 samples. */ -/* * 20 bits --> 4 pulses in a frame of 64 samples. */ -/* * 36 bits --> 8 pulses in a frame of 64 samples. */ -/* * All pulses can have two (2) possible amplitudes: +1 or -1. */ -/* * Each pulse can have sixteen (16) possible positions. */ -/* * See cod4t64.c for more details of the algebraic code. */ +/* PURPOSE : */ +/* * 20, 36 bits algebraic codebook decoder. */ +/* * 4 tracks x 16 positions per track = 64 samples. */ +/* * 20 bits --> 4 pulses in a frame of 64 samples. */ +/* * 36 bits --> 8 pulses in a frame of 64 samples. */ +/* * All pulses can have two (2) possible amplitudes: +1 or -1. */ +/* * Each pulse can have sixteen (16) possible positions. */ +/* * See cod4t64.c for more details of the algebraic code. */ /*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _Word16 i_subfr i : subframe index */ /* _Word16 nbbits i : number of bits per codebook */ /* _Word16 FCB_5Sx4T_fla i : 5Sx4Track flag for PI */ /*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _Word16 code[] o : algebraic (fixed) codebook excitation Q12 */ +/* OUTPUT ARGUMENTS : */ +/* _Word16 code[] o : algebraic (fixed) codebook excitation Q12 */ /* _Word16 index_buf_4T[] o : 5Sx4Track buffer for PI */ /*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*--------------------------------------------------------------------------*/ -/* CALLED FROM : */ +/* CALLED FROM : */ /*==========================================================================*/ void dec_acelp_4t64_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ @@ -871,8 +871,6 @@ void dec_acelp_fast_fx( move16(); set16_fx( code, 0, L_subfr ); - st->total_num_bits = extract_l( st->total_brate / FRAMES_PER_SEC ); - IF( EQ_16( L_subfr, L_SUBFR ) ) { config = PulseConfTable[cdk_index]; diff --git a/lib_dec/dec_LPD_fx.c b/lib_dec/dec_LPD_fx.c index d5294eb7a0a9eed009f3475c4f24be9270a76377..9515aefe898464d21f318f419e654ab748d92957 100644 --- a/lib_dec/dec_LPD_fx.c +++ b/lib_dec/dec_LPD_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -36,7 +36,7 @@ void decoder_LPD_fx( ) { Word16 *param_lpc; - Word16 synth_buf[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M]; + Word16 synth_buf[OLD_SYNTH_INTERNAL_DEC + L_FRAME_PLUS_INTERNAL + M]; Word16 *synth; Word16 synth_bufFB[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M]; Word16 *synthFB; @@ -114,7 +114,7 @@ void decoder_LPD_fx( synth = synth_buf + hTcxDec->old_synth_len; /*st->old_synth: Q_0*/ Copy( hTcxDec->old_synth, synth_buf, hTcxDec->old_synth_len ); - set16_fx( synth, 0, L_FRAME_PLUS + M ); + set16_fx( synth, 0, L_FRAME_PLUS_INTERNAL + M ); synthFB = synth_bufFB + hTcxDec->old_synth_lenFB; Copy( hTcxDec->old_synthFB_fx, synth_bufFB, hTcxDec->old_synth_lenFB ); @@ -555,7 +555,8 @@ void decoder_LPD_fx( st->relax_prev_lsf_interp = 2; move16(); } - int_lsp4_fx( L_frame, &lsp[0], lspmid, &lsp[M], Aq, M, st->relax_prev_lsf_interp ); + + int_lsp4_ivas_fx( L_frame, &lsp[0], lspmid, &lsp[M], Aq, M, st->relax_prev_lsf_interp ); } ELSE { @@ -569,11 +570,7 @@ void decoder_LPD_fx( IF( bfi != 0 && ( st->last_core != ACELP_CORE ) ) { /* PLC: [TCX: TD PLC] */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - con_tcx_fx( st, &synthFB[0], -1.f, NULL, 0, NULL ); -#else con_tcx_fx( st, &synthFB[0] ); -#endif lerp( synthFB, synth, st->L_frame, hTcxDec->L_frameTCX ); st->con_tcx = 1; move16(); @@ -721,12 +718,12 @@ void decoder_LPD_fx( FOR( k = 0; k < 2; k++ ) { - /* Set pointer to parameters */ - prm = param + ( k * DEC_NPRM_DIV ); - - /* Stability Factor */ IF( bfi == 0 ) { + /* Set pointer to parameters */ + prm = param + ( k * DEC_NPRM_DIV ); + + /* Stability Factor */ st->stab_fac_fx = lsf_stab_fx( &lsf[( ( k + 1 ) ) * M], &lsf[k * M], 0, L_FRAME ); move16(); } @@ -773,11 +770,7 @@ void decoder_LPD_fx( { TonalMDCTConceal_SaveTimeSignal( st->hTonalMDCTConc, synthFB, L_frameTCX ); } -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - decoder_tcx_post_fx( st, synth, synthFB, Aq, bfi, 0 ); -#else decoder_tcx_post_fx( st, synth, synthFB, Aq, bfi ); -#endif IF( EQ_16( st->core, TCX_20_CORE ) ) { /* LPC Interpolation for BWE/post-processing */ diff --git a/lib_dec/dec_ace_fx.c b/lib_dec/dec_ace_fx.c index e327d4cfb958cacf783da1add249812e3336ceab..0d867fd6f0708fc01193345fa209e6302c4eabc9 100644 --- a/lib_dec/dec_ace_fx.c +++ b/lib_dec/dec_ace_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /*BASOp version info: This file is up to date with trunk rev. 39929 */ @@ -526,36 +526,31 @@ void decoder_acelp_fx( /*-----------------------------------------------------------------* * Prepare TBE excitation *-----------------------------------------------------------------*/ + gain_code = gain_code_tmp; move32(); gain_pit = gain_pit_tmp; move16(); IF( st->igf != 0 ) { - prep_tbe_exc_fx( st->L_frame, -#ifdef ADD_IVAS_TBE_CODE - L_SUBFR, -#endif - i_subfr, gain_pit, gain_code, code, st->voice_fac, &voice_factors[idx], bwe_exc, - gain_preQ, code_preQ, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate -#ifdef ADD_IVAS_TBE_CODE - , - st->element_mode, st->idchan, st->hBWE_TD != NULL, 0 -#endif - ); + prep_tbe_exc_fx( st->L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, st->voice_fac, &voice_factors[idx], bwe_exc, + gain_preQ, code_preQ, Q10, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, 0 ); } /*---------------------------------------------------------* * Enhance the excitation * *---------------------------------------------------------*/ + E_UTIL_enhancer( st->voice_fac, stab_fac, st->past_gcode, gain_inov, &( st->gc_threshold_fx ), code, &exc2[i_subfr], gain_pit, &st->dm_fx.prev_gain_code, st->dm_fx.prev_gain_pit, &st->dm_fx.prev_state, st->coder_type, acelp_cfg.fixed_cdk_index[idx], L_SUBFR, st->L_frame, st->Q_exc ); } /* !RF_NELP frame partial copy */ + /*----------------------------------------------------------* * - compute the synthesis speech * *----------------------------------------------------------*/ + rescale_mem( &st->Q_exc, &prev_Q_syn, &st->Q_syn, mem_syn, syn, M, i_subfr ); E_UTIL_synthesis( sub( st->Q_exc, st->Q_syn ), p_A, &exc2[i_subfr], &syn[i_subfr], L_SUBFR, mem_syn, 1, M ); @@ -683,8 +678,9 @@ void decoder_acelp_fx( FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, syn, pBuf_scaleSyn, st->enr_old_fx, 0, st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, - exc, exc2, A, &( st->old_enr_LP ), mem_back, mem_syn, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, force_scale_syn ); + exc, exc2, A, &( st->old_enr_LP ), mem_back, mem_syn, st->Q_exc, st->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, force_scale_syn ); } + /* update ACELP synthesis memory */ Copy( mem_syn, st->mem_syn2_fx, M ); Copy( syn + st->L_frame - L_SYN_MEM, st->mem_syn_r, L_SYN_MEM ); @@ -695,6 +691,8 @@ void decoder_acelp_fx( E_UTIL_deemph2( st->Q_syn, syn, st->preemph_fac, st->L_frame, &tmp_deemph ); /* tmp_deemph and syn in Q0 starting from here*/ bufferCopyFx( syn + shr( st->L_frame, 1 ), hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), 0 /*Qf_syn*/, -1 /*Qf_old_xnq*/, 0, 0 /*Q_old_xnq*/ ); + st->hTcxDec->Q_old_syn_Overl = sub( st->Q_syn, 1 ); + move16(); Copy( syn + sub( st->L_frame, M + 1 ), st->syn, 1 + M ); /*Q0*/ diff --git a/lib_dec/dec_acelp_fx.c b/lib_dec/dec_acelp_fx.c index 07750469f1515adef0f16688151631db8c2fef4b..c07ba25a64db73f54e71cdf00458f31cd56c889e 100644 --- a/lib_dec/dec_acelp_fx.c +++ b/lib_dec/dec_acelp_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -169,17 +169,17 @@ void D_ACELP_indexing_fx( pulses = pulsestrack[0]; move16(); - /* safety check in case of bit errors */ - IF( GE_64( s, pulsestostates[16][pulses - 1] ) ) - { - set16_fx( code, 0, L_SUBFR ); - *BER_detect = 1; - move16(); - return; - } IF( pulses ) { + /* safety check in case of bit errors */ + IF( GE_64( s, pulsestostates[16][pulses - 1] ) ) + { + set16_fx( code, 0, L_SUBFR ); + *BER_detect = 1; + move16(); + return; + } D_ACELP_decode_arithtrack_fx( code, s, pulses, num_tracks, 16 ); } ELSE diff --git a/lib_dec/dec_acelp_tcx_main_fx.c b/lib_dec/dec_acelp_tcx_main_fx.c index 04a41ed46c9a3ca1b4f0110d3eb3b60872886ffa..94d4486b1692b4bb9c0d9d76ae127ae2d526748a 100644 --- a/lib_dec/dec_acelp_tcx_main_fx.c +++ b/lib_dec/dec_acelp_tcx_main_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -61,7 +61,7 @@ static void decode_frame_type_fx( Decoder_State *st ) /* SID frame */ ELSE IF( EQ_32( st->total_brate, SID_2k40 ) ) { - st->cng_type = get_next_indice( st, 1 ); + st->cng_type = get_next_indice_fx( st, 1 ); move16(); if ( NE_16( st->cng_type, FD_CNG ) ) { @@ -72,10 +72,10 @@ static void decode_frame_type_fx( Decoder_State *st ) move16(); frame_size_index = 1; move16(); - st->bwidth = get_next_indice( st, 2 ); + st->bwidth = get_next_indice_fx( st, 2 ); move16(); - frame_len_indicator = get_next_indice( st, 1 ); + frame_len_indicator = get_next_indice_fx( st, 1 ); IF( EQ_16( st->bwidth, NB ) ) { if ( frame_len_indicator ) @@ -146,7 +146,7 @@ static void decode_frame_type_fx( Decoder_State *st ) { /* Get bandwidth mode */ - st->bwidth = get_next_indice( st, FrameSizeConfig[frame_size_index].bandwidth_bits ); + st->bwidth = get_next_indice_fx( st, FrameSizeConfig[frame_size_index].bandwidth_bits ); move16(); st->bwidth = add( st->bwidth, FrameSizeConfig[frame_size_index].bandwidth_min ); @@ -180,7 +180,7 @@ static void decode_frame_type_fx( Decoder_State *st ) IF( FrameSizeConfig[frame_size_index].reserved_bits && st->rf_flag == 0 ) { Word16 dummyBit; - dummyBit = (Word8) get_next_indice( st, 1 ); + dummyBit = (Word8) get_next_indice_fx( st, 1 ); move16(); if ( dummyBit != 0 ) { @@ -208,20 +208,15 @@ static void decode_frame_type_fx( Decoder_State *st ) move16(); /* Reconf Core */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - mode_switch_decoder_LPD_fx( st, st->bwidth, st->total_brate, st->last_total_brate, frame_size_index, 0, st->element_mode ); -#else mode_switch_decoder_LPD_fx( st, st->bwidth, st->total_brate, frame_size_index ); -#endif + /* Reconf CLDFB */ IF( NE_16( i_mult( st->cldfbAna->no_channels, st->cldfbAna->no_col ), st->L_frame ) ) { - Word16 newCldfbBands = CLDFB_getNumChannels( L_mult0( st->L_frame, 50 ) ); - - resampleCldfb( st->cldfbAna, newCldfbBands, st->L_frame, 0 ); + resampleCldfb( st->cldfbAna, L_mult0( st->L_frame, FRAMES_PER_SEC ), st->L_frame, 0 ); IF( LE_16( st->L_frame, L_FRAME16k ) ) { - resampleCldfb( st->cldfbBPF, newCldfbBands, st->L_frame, 0 ); + resampleCldfb( st->cldfbBPF, L_mult0( st->L_frame, FRAMES_PER_SEC ), st->L_frame, 0 ); } } IF( EQ_16( st->bwidth, NB ) ) @@ -368,7 +363,7 @@ Word16 dec_acelp_tcx_frame_fx( { /* Copy back parameters from previous frame, because there is a high risk they are corrupt * DO concealment with configuration used in previous frame */ - st->m_frame_type = (uint8_t) m_frame_type; + st->m_frame_type = (UWord8) m_frame_type; move16(); st->bwidth = bwidth; move16(); diff --git a/lib_dec/dec_amr_wb_fx.c b/lib_dec/dec_amr_wb_fx.c index 415b4584e53c884068ce8f194e63305bc2ed8dd9..c65162afcdb24dac8a49a954240e671cfc1272eb 100644 --- a/lib_dec/dec_amr_wb_fx.c +++ b/lib_dec/dec_amr_wb_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -71,7 +71,7 @@ void decod_amr_wb_fx( * Decode pitch lag *----------------------------------------------------------------------*/ - *pt_pitch_fx = pit_decode_fx( st_fx, st_fx->core_brate, 1, L_FRAME, i_subfr, -1, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR ); + *pt_pitch_fx = pit_decode_fx( st_fx, st_fx->core_brate, 1, L_FRAME, i_subfr, -1, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); /*--------------------------------------------------------------* * Find the adaptive codebook vector @@ -127,7 +127,7 @@ void decod_amr_wb_fx( IF( EQ_32( st_fx->core_brate, ACELP_23k85 ) ) { - hf_gain_fx[i_subfr / 64] = (Word16) get_next_indice( st_fx, 4 ); + hf_gain_fx[i_subfr / 64] = (Word16) get_next_indice_fx( st_fx, 4 ); move16(); } diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index bdfac224f45b0efbfee46ebfe92a8acf010a9f0f..f7640abe7f632fc12eede8fbd214f933d651677c 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -18,8 +18,7 @@ /*----------------------------------------------------------------------*/ /* GLOBAL INPUT ARGUMENTS : */ /* _ (Struct) st_fx : decoder static memory */ -/* _ (Word16) L_frame : length of the frame */ - +/* _ (Word16) L_frame : length of the frame */ /* _ (Word16[]) Aq_fx : LP filter coefficient Q12 */ /* _ (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ /* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ @@ -29,502 +28,30 @@ /* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ /* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ /*----------------------------------------------------------------------*/ - - /*----------------------------------------------------------------------*/ /* RETURN ARGUMENTS : */ /* _ None */ /*======================================================================*/ ivas_error decod_gen_voic_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 sharpFlag_fx, /* i : formant sharpening flag */ - const Word16 *Aq_fx, /* i : LP filter coefficient Q12 */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy Q8 */ - const Word16 do_WI_fx, /* i : do interpolation after a FER */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6 */ - Word16 *voice_factors_fx, /* o : voicing factors Q15 */ - Word16 *exc_fx, /* i/o: adapt. excitation exc Q_exc */ - Word16 *exc2_fx, /* i/o: adapt. excitation/total exc Q_exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_exc */ - Word16 *unbits, /* number of unused bits */ - Word16 *gain_buf /*Q14*/ -) -{ - - - Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ - Word16 gain_pit_fx = 0; /* pitch gain Q14 */ - move16(); - Word32 gain_code_fx = 0; /* gain/normalized gain of the algebraic excitation Q16 */ - move32(); - Word32 norm_gain_code_fx = 0; /* normalized gain of the algebraic excitation Q16 */ - move32(); - Word16 gain_inov_fx = 0; /* Innovation gain Q12 */ - move16(); - Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ - Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes */ - Word16 voice_fac_fx; /* voicing factor Q15 */ - Word16 code_fx[L_SUBFR]; /* algebraic codevector Q12 */ - - const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ - Word16 *pt_pitch_fx; /* pointer to floating pitch Q6 */ - Word16 i_subfr_fx, i; /* tmp variables */ - Word16 error_fx = 0; - move16(); - Word16 gain_preQ_fx = 0; /* Gain of prequantizer excitation */ - move16(); - Word16 code_preQ_fx[L_SUBFR]; /* Prequantizer excitation */ - Word32 norm_gain_preQ_fx; - Word16 pitch_limit_flag_fx; - - Word16 tmp1_fx, gain_code16; - Word32 L_tmp_GC; - Word32 L_tmp; - - Word16 harm_flag_acelp; - - Word16 shft_prev, ph_offset_fx; - Word32 prev_res_nrg; - Word32 prev_spch_nrg; - Word32 curr_res_nrg; - Word32 curr_spch_nrg; - Word16 rint_bfi_pitch, rint_pitch; - Word16 fraca, fracb, expa, expb, scale, exp1; - Word16 *p_exc; - Word16 mem_tmp_fx[M]; - Word16 syn_tmp_fx[L_FRAME16k]; - Word16 shft_curr; - Word16 *p_syn; - Word16 sp_enratio, Qsp_enratio; - Word16 enratio, Qenratio; - DTFS_STRUCTURE *PREVP, *CURRP; - Word16 S_fx[PIT_MAX * 4 + 1], C_fx[PIT_MAX * 4 + 1]; - Word16 dummy2[2]; - Word16 out_fx[L_FRAME16k]; - - Word16 pf_temp1[MAXLAG_WI]; /*may not need more than MAXLAG_WI/2+1 */ - Word16 pf_temp2[MAXLAG_WI]; - Word16 pf_temp[MAXLAG_WI]; - Word16 pf_n2[MAXLAG_WI]; - MUSIC_POSTFILT_HANDLE hMusicPF; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - hMusicPF = st_fx->hMusicPF; - - GSC_DEC_HANDLE hGSCDec; - hGSCDec = st_fx->hGSCDec; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - T0_fx = PIT_MIN; - move16(); - T0_frac_fx = 0; - move16(); - - /* read harmonicity flag */ - harm_flag_acelp = 0; - move16(); - test(); - test(); - IF( ( GE_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) && LE_32( st_fx->core_brate, MAX_BRATE_AVQ_EXC_TD ) ) && EQ_16( st_fx->coder_type, GENERIC ) ) - { - harm_flag_acelp = (Word16) get_next_indice( st_fx, 1 ); - } - - /*------------------------------------------------------------------* - * ACELP subframe loop - *------------------------------------------------------------------*/ - - p_Aq_fx = Aq_fx; /* pointer to interpolated LPC parameters */ - pt_pitch_fx = pitch_buf_fx; /* pointer to the pitch buffer */ - norm_gain_preQ_fx = 0; - move32(); - gain_preQ_fx = 0; - move16(); - set16_fx( code_preQ_fx, 0, L_SUBFR ); - - FOR( i_subfr_fx = 0; i_subfr_fx < L_frame; i_subfr_fx += L_SUBFR ) - { - /*----------------------------------------------------------------------* - * Decode pitch lag - *----------------------------------------------------------------------*/ - - *pt_pitch_fx = pit_decode_fx( st_fx, st_fx->core_brate, 0, L_frame, i_subfr_fx, st_fx->coder_type, &pitch_limit_flag_fx, - &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_SUBFR ); - move16(); /*Q6*/ - - /*--------------------------------------------------------------* - * Find the adaptive codebook vector - *--------------------------------------------------------------*/ - - pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); - - tbe_celp_exc( L_frame, i_subfr_fx, T0_fx, T0_frac_fx, &error_fx, bwe_exc_fx ); - - /*--------------------------------------------------------------* - * LP filtering of the adaptive excitation - *--------------------------------------------------------------*/ - lp_filt_exc_dec_fx( st_fx, MODE1, i_subfr_fx, L_SUBFR, L_frame, st_fx->acelp_cfg.ltf_mode, exc_fx ); - /*-----------------------------------------------------------------* - * Transform-domain contribution decoding (active frames) - *-----------------------------------------------------------------*/ - - test(); - IF( GE_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) && ( st_fx->coder_type != INACTIVE ) ) - { - gain_code_fx = 0; - move16(); - transf_cdbk_dec_fx( st_fx, harm_flag_acelp, i_subfr_fx, Es_pred_fx, gain_code_fx, &gain_preQ_fx, &norm_gain_preQ_fx, code_preQ_fx, unbits ); - } - - /*--------------------------------------------------------------* - * Innovation decoding - *--------------------------------------------------------------*/ - - inov_decode_fx( st_fx, st_fx->core_brate, 0, L_frame, sharpFlag_fx, i_subfr_fx, p_Aq_fx, st_fx->tilt_code_fx, *pt_pitch_fx, code_fx, L_SUBFR ); - - /*--------------------------------------------------------------* - * Gain decoding - * Estimate spectrum tilt and voicing - *--------------------------------------------------------------*/ - - IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) - { - gain_dec_lbr_fx( st_fx, st_fx->coder_type, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_SUBFR ); - } - ELSE IF( GT_32( st_fx->core_brate, ACELP_32k ) ) - { - gain_dec_SQ_fx( st_fx, i_subfr_fx, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx ); - } - ELSE - { - gain_dec_mless_fx( st_fx, L_frame, st_fx->coder_type, i_subfr_fx, -1, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx ); - } - st_fx->tilt_code_fx = est_tilt_fx( exc_fx + i_subfr_fx, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, st_fx->Q_exc ); // Q15 - move16(); - - /*-----------------------------------------------------------------* - * Transform domain contribution decoding - *-----------------------------------------------------------------*/ - test(); - IF( GE_32( st_fx->core_brate, MAX_GSC_INACTIVE_BRATE ) && ( st_fx->coder_type == INACTIVE ) ) - { - transf_cdbk_dec_fx( st_fx, harm_flag_acelp, i_subfr_fx, Es_pred_fx, gain_code_fx, &gain_preQ_fx, &norm_gain_preQ_fx, code_preQ_fx, unbits ); - } - - /* update LP filtered gains for the case of frame erasures */ - lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); - - /*----------------------------------------------------------------------* - * Find the total excitation - *----------------------------------------------------------------------*/ - - IF( EQ_16( L_frame, L_FRAME ) ) /* Rescaling for 12.8k core */ - { - Rescale_exc( hMusicPF->dct_post_old_exc_fx, &exc_fx[i_subfr_fx], &bwe_exc_fx[i_subfr_fx * HIBND_ACB_L_FAC], hGSCDec->last_exc_dct_in_fx, - L_SUBFR, L_SUBFR * HIBND_ACB_L_FAC, gain_code_fx, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, i_subfr_fx, st_fx->coder_type ); - } - ELSE /* Rescaling for 16k core */ - { - - L_tmp_GC = L_max( gain_code_fx, L_shl( gain_preQ_fx, 16 ) ); /* Chose the maximum of gain_code or the prequantizer excitation x4 to keep some room*/ - Rescale_exc( hMusicPF->dct_post_old_exc_fx, &exc_fx[i_subfr_fx], &bwe_exc_fx[i_subfr_fx * 2], hGSCDec->last_exc_dct_in_fx, - L_SUBFR, L_SUBFR * 2, L_tmp_GC, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, i_subfr_fx, st_fx->coder_type ); - } - - gain_code16 = round_fx( L_shl( gain_code_fx, st_fx->Q_exc ) ); /*Q_exc*/ - - /*-----------------------------------------------------------------* - * Add the ACELP pre-quantizer contribution - *-----------------------------------------------------------------*/ - - IF( gain_preQ_fx != 0 ) - { - IF( st_fx->element_mode == EVS_MONO ) - { - tmp1_fx = add( 15 - Q_AVQ_OUT_DEC - 2, st_fx->Q_exc ); - } - ELSE - { - tmp1_fx = add( 15 - Q_AVQ_OUT - 2, st_fx->Q_exc ); - } - FOR( i = 0; i < L_SUBFR; i++ ) - { - Word32 Ltmp1; - /* Contribution from AVQ layer */ - Ltmp1 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /* Q2 + Q6 -> Q9*/ - Ltmp1 = L_shl_sat( Ltmp1, tmp1_fx ); /* Q16 + Q_exc */ - - /* Compute exc2 */ - L_tmp = L_shl_sat( L_mult( gain_pit_fx, exc_fx[i + i_subfr_fx] ), 1 ); // Q_exc+Q14+1+1 - exc2_fx[i + i_subfr_fx] = round_fx_sat( L_add_sat( L_tmp, Ltmp1 ) ); // Q_exc - move16(); - /* gain_pit in Q14 */ - L_tmp = L_mult( gain_code16, code_fx[i] ); // Q_exc+Q9+1 - L_tmp = L_shl_sat( L_tmp, 5 ); // Q_exc+Q9+1+5 - L_tmp = L_mac_sat( L_tmp, exc_fx[i + i_subfr_fx], gain_pit_fx ); // Q_exc+Q15 +1 - L_tmp = L_shl_sat( L_tmp, 1 ); /* saturation can occur here */ - - exc_fx[i + i_subfr_fx] = round_fx_sat( L_add_sat( L_tmp, Ltmp1 ) ); // Q_exc - move16(); - } - } - ELSE - { - Acelp_dec_total_exc( exc_fx, exc2_fx, gain_code16, gain_pit_fx, i_subfr_fx, code_fx, L_SUBFR ); - } - - /*-----------------------------------------------------------------* - * Prepare TBE excitation - *-----------------------------------------------------------------*/ - - Word16 idx = 0; - move16(); - IF( i_subfr_fx != 0 ) - { - idx = idiv1616( i_subfr_fx, L_SUBFR ); - } - - prep_tbe_exc_fx( L_frame, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[idx], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate ); - - - /*----------------------------------------------------------------* - * Excitation enhancements (update of total excitation signal) - *----------------------------------------------------------------*/ - - test(); - IF( GT_32( st_fx->core_brate, ACELP_32k ) || ( st_fx->coder_type == INACTIVE ) ) - { - Copy( exc_fx + i_subfr_fx, exc2_fx + i_subfr_fx, L_SUBFR ); - } - ELSE - { - enhancer_fx( st_fx->core_brate, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, - norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); - } - - p_Aq_fx += ( M + 1 ); - pt_pitch_fx++; - gain_buf[idx] = gain_pit_fx; // Q14 - move16(); - } - - /* FEC fast recovery */ - - IF( do_WI_fx ) - { - /* shft_prev = L_EXC_MEM - rint_new_fx(st_fx->bfi_pitch_fx);*/ - L_tmp = L_shl( L_deposit_l( st_fx->bfi_pitch_fx ), 10 ); /*Q16*/ - rint_bfi_pitch = rint_new_fx( L_tmp ); /*Q0*/ - shft_prev = sub( L_EXC_MEM, rint_bfi_pitch ); /*Q0*/ - - p_exc = st_fx->hWIDec->old_exc2_fx + shft_prev; - p_syn = st_fx->hWIDec->old_syn2_fx + shft_prev; - move16(); - move16(); - - prev_res_nrg = L_deposit_l( 1 ); - prev_spch_nrg = L_deposit_l( 1 ); - FOR( i = 0; i < rint_bfi_pitch; i++ ) - { - prev_res_nrg = L_mac0_sat( prev_res_nrg, *p_exc, *p_exc ); /* 2*st_fx->prev_Q_exc_fr */ - prev_spch_nrg = L_mac0_sat( prev_spch_nrg, *p_syn, *p_syn ); /* 2*st_fx->prev_Q_syn_fr */ - p_exc++; - p_syn++; - } - - Copy( st_fx->mem_syn2_fx, mem_tmp_fx, M ); - - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc2_fx, syn_tmp_fx, mem_tmp_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); - - L_tmp = L_shl( L_deposit_l( pitch_buf_fx[NB_SUBFR16k - 1] ), 10 ); /*Q16*/ - rint_pitch = rint_new_fx( L_tmp ); /*Q0*/ - shft_curr = sub( st_fx->L_frame, rint_pitch ); /*Q0*/ - - p_exc = exc2_fx + shft_curr; - p_syn = syn_tmp_fx + shft_curr; - - curr_res_nrg = L_deposit_l( 1 ); - curr_spch_nrg = L_deposit_l( 1 ); - FOR( i = 0; i < rint_pitch; i++ ) - { - curr_res_nrg = L_mac0_sat( curr_res_nrg, *p_exc, *p_exc ); /* 2*st_fx->Q_exc */ - curr_spch_nrg = L_mac0_sat( curr_spch_nrg, *p_syn, *p_syn ); /* 2*st_fx->Q_syn */ - p_exc++; - p_syn++; - } - - /* enratio = (curr_res_nrg / prev_res_nrg); */ - IF( prev_res_nrg > 0 ) - { - expa = norm_l( prev_res_nrg ); - fraca = extract_h( L_shl( prev_res_nrg, expa ) ); /* 2*st_fx->prev_Q_exc_fr -16+expa +1*/ - expa = sub( 30, add( expa, ( shl( st_fx->prev_Q_exc_fr, 1 ) ) ) ); - - expb = norm_l( curr_res_nrg ); - fracb = round_fx_sat( L_shl_sat( curr_res_nrg, expb ) ); /* 2*st_fx->Q_exc +expb+1 -16*/ - expb = sub( 30, add( expb, shl( st_fx->Q_exc, 1 ) ) ); - - scale = shr( sub( fraca, fracb ), 15 ); - fracb = shl( fracb, scale ); // Q(15-expb)+scale - expb = sub( expb, scale ); - - enratio = div_s( fracb, fraca ); // Q(15-(expb-expa)) - exp1 = sub( expb, expa ); - Qenratio = sub( 15, exp1 ); - } - ELSE - { - enratio = 0; - move16(); - Qenratio = 0; - move16(); - } - - /* sp_enratio = curr_spch_nrg/prev_spch_nrg */ - IF( prev_spch_nrg > 0 ) - { - expa = norm_l( prev_spch_nrg ); - fraca = extract_h( L_shl( prev_spch_nrg, expa ) ); /* 2*st_fx->prev_Q_syn_fr +expa+1-16*/ - expa = sub( 30, add( expa, shl( st_fx->prev_Q_syn_fr, 1 ) ) ); - - expb = norm_l( curr_spch_nrg ); - fracb = round_fx_sat( L_shl_sat( curr_spch_nrg, expb ) ); /* 2*st_fx->Q_syn +expb-16 */ - expb = sub( 30, add( expb, shl( st_fx->Q_syn, 1 ) ) ); - - scale = shr( sub( fraca, fracb ), 15 ); - fracb = shl( fracb, scale ); // Q(15-expb) +scale - expb = sub( expb, scale ); - - sp_enratio = div_s( fracb, fraca ); // Q(15-(expb-expa)) - exp1 = sub( expb, expa ); - Qsp_enratio = sub( 15, exp1 ); - } - ELSE - { - sp_enratio = 0; - move16(); - Qsp_enratio = 0; - move16(); - } - - test(); - test(); - test(); - test(); - IF( GT_16( shl_ro( enratio, sub( 15, Qenratio ), &Overflow ), 8192 ) && /*compare with 0.25 in Q15*/ - LT_16( shl_ro( enratio, sub( 10, Qenratio ), &Overflow ), 15360 ) && /*compare with 15.0 in Q10*/ - GT_16( shl_ro( sp_enratio, sub( 15, Qsp_enratio ), &Overflow ), 4915 ) && /*compare with 0.15 in Q15*/ - LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ - LT_16( pitch_buf_fx[NB_SUBFR16k - 1], 9600 ) ) /*Q6*/ - { - IF( NE_32( ( error = DTFS_new_fx( &PREVP ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = DTFS_new_fx( &CURRP ) ), IVAS_ERR_OK ) ) - { - return error; - } - - GetSinCosTab_fx( rint_bfi_pitch, S_fx, C_fx ); - DTFS_to_fs_fx( st_fx->hWIDec->old_exc2_fx + shft_prev, rint_bfi_pitch, PREVP, (Word16) st_fx->output_Fs, do_WI_fx, S_fx, C_fx ); - PREVP->Q = add( PREVP->Q, st_fx->prev_Q_exc_fr ); - move16(); - - GetSinCosTab_fx( rint_pitch, S_fx, C_fx ); - DTFS_to_fs_fx( exc2_fx + shft_curr, rint_pitch, CURRP, (Word16) st_fx->output_Fs, do_WI_fx, S_fx, C_fx ); - CURRP->Q = add( CURRP->Q, st_fx->Q_exc ); - move16(); - - ph_offset_fx = 0; - move16(); - IF( NE_32( ( error = WIsyn_fx( *PREVP, CURRP, dummy2, &( ph_offset_fx ), out_fx, (Word16) st_fx->L_frame, 1, S_fx, C_fx, pf_temp1, pf_temp2, pf_temp, pf_n2 ) ), IVAS_ERR_OK ) ) - { - return error; - } - - - Copy_Scale_sig( out_fx, exc2_fx, st_fx->L_frame, st_fx->Q_exc ); // Q_exc - Copy_Scale_sig( out_fx, exc_fx, st_fx->L_frame, st_fx->Q_exc ); // Q_exc - - /* update bwe_exc for SWB-TBE */ - FOR( i_subfr_fx = 0; i_subfr_fx < L_frame; i_subfr_fx += L_SUBFR ) - { - interp_code_4over2_fx( exc_fx + i_subfr_fx, bwe_exc_fx + shl( i_subfr_fx, 1 ), L_SUBFR ); - } - - free( PREVP ); - free( CURRP ); - } - } - - /* SC-VBR */ - st_fx->prev_gain_pit_dec_fx = gain_pit_fx; - move16(); /*Q14*/ - st_fx->prev_tilt_code_dec_fx = st_fx->tilt_code_fx; - move16(); /*Q15*/ - - return error; -} - -/*======================================================================*/ -/* FUNCTION : decod_gen_voic_ivas_fx() */ -/*----------------------------------------------------------------------*/ -/* PURPOSE : Decode generic (GC), voiced (VC) and AMR-WB IO frames */ -/* */ -/*----------------------------------------------------------------------*/ -/* GLOBAL INPUT ARGUMENTS : */ -/* _ (Struct) st_fx : decoder static memory */ -/* _ (Word16) L_frame : length of the frame */ - -/* _ (Word16[]) Aq_fx : LP filter coefficient Q12 */ -/* _ (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ -/* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ -/* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ -/*----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ -/*----------------------------------------------------------------------*/ - - -/*----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*======================================================================*/ - -ivas_error decod_gen_voic_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 sharpFlag_fx, /* i : formant sharpening flag */ - const Word16 *Aq_fx, /* i : LP filter coefficient Q12*/ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy Q8 */ - const Word16 do_WI_fx, /* i : do interpolation after a FER */ - Word16 *pitch_buf_fx, /* o : Word16 pitch values for each subframe Q6*/ - Word16 *voice_factors_fx, /* o : voicing factors Q15 */ - Word16 *exc_fx, /* i/o: adapt. excitation exc Q_exc */ - Word16 *exc2_fx, /* i/o: adapt. excitation/total exc Q_exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_exc */ - Word16 *unbits, /* number of unused bits */ - Word16 *gain_buf, - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6 */ + Decoder_State *st_fx, /* i/o: decoder static memory */ + const Word16 L_frame, /* i : length of the frame */ + const Word16 sharpFlag_fx, /* i : formant sharpening flag */ + const Word16 *Aq_fx, /* i : LP filter coefficient Q12 */ + const Word16 Es_pred_fx, /* i : predicted scaled innov. energy Q8 */ + const Word16 do_WI_fx, /* i : do interpolation after a FER */ + Word16 *pitch_buf_fx, /* o : Word16 pitch values for each subframe Q6 */ + Word16 *voice_factors_fx, /* o : voicing factors Q15 */ + Word16 *exc_fx, /* i/o: adapt. excitation exc Q_exc */ + Word16 *exc2_fx, /* i/o: adapt. excitation/total exc Q_exc */ + Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_exc */ + Word16 *unbits, /* number of unused bits */ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14 */ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6 */ ) { - - - Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ + Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ Word16 gain_pit_fx; /* pitch gain Q14 */ Word32 gain_code_fx; /* gain/normalized gain of the algebraic excitation Q16 */ Word32 norm_gain_code_fx; /* normalized gain of the algebraic excitation Q16 */ @@ -535,7 +62,7 @@ ivas_error decod_gen_voic_ivas_fx( Word16 code_fx[L_SUBFR]; /* algebraic codevector Q12 */ const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ - Word16 *pt_pitch_fx; /* pointer to Word16 pitch Q6 */ + Word16 *pt_pitch_fx; /* pointer to Word16 pitch Q6 */ Word16 i_subfr_fx, i; /* tmp variables */ Word16 error_fx; Word16 gain_preQ_fx; /* Gain of prequantizer excitation */ @@ -573,16 +100,14 @@ ivas_error decod_gen_voic_ivas_fx( Word16 pf_temp[MAXLAG_WI]; Word16 pf_n2[MAXLAG_WI]; MUSIC_POSTFILT_HANDLE hMusicPF; + Word16 Q_code_preQ; + gain_pit_fx = 0; gain_code_fx = 0; norm_gain_code_fx = 0; gain_inov_fx = 0; error_fx = 0; gain_preQ_fx = 0; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif move16(); move32(); move32(); @@ -632,17 +157,21 @@ ivas_error decod_gen_voic_ivas_fx( * Decode pitch lag *----------------------------------------------------------------------*/ - /**pt_pitch_fx = pit_decode_fx(st_fx, st_fx->core_brate, 0, L_frame, i_subfr_fx, st_fx->coder_type, &pitch_limit_flag_fx, - &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_SUBFR);*/ - *pt_pitch_fx = pit_decode_ivas_fx( st_fx, st_fx->core_brate, 0, L_frame, i_subfr_fx, st_fx->coder_type, &pitch_limit_flag_fx, - &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + *pt_pitch_fx = pit_decode_fx( st_fx, st_fx->core_brate, 0, L_frame, i_subfr_fx, st_fx->coder_type, &pitch_limit_flag_fx, + &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); move16(); /*Q6*/ /*--------------------------------------------------------------* * Find the adaptive codebook vector *--------------------------------------------------------------*/ - - pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } // tbe_celp_exc(L_frame, i_subfr_fx, T0_fx, T0_frac_fx, &error_fx, bwe_exc_fx); tbe_celp_exc_ivas( st_fx->element_mode, st_fx->idchan, L_frame, L_SUBFR, i_subfr_fx, T0_fx, T0_frac_fx, &error_fx, bwe_exc_fx, st_fx->tdm_LRTD_flag ); @@ -676,7 +205,7 @@ ivas_error decod_gen_voic_ivas_fx( IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) { - gain_dec_lbr_ivas_fx( st_fx, st_fx->coder_type, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_SUBFR ); + gain_dec_lbr_fx( st_fx, st_fx->coder_type, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_SUBFR ); } ELSE IF( GT_32( st_fx->core_brate, ACELP_32k ) ) { @@ -693,17 +222,20 @@ ivas_error decod_gen_voic_ivas_fx( * Transform domain contribution decoding *-----------------------------------------------------------------*/ test(); -#ifdef NONBE_FIX_GSC_BSTR IF( !st_fx->inactive_coder_type_flag && st_fx->coder_type == INACTIVE ) -#else - IF( GE_32( st_fx->total_brate, MAX_GSC_INACTIVE_BRATE ) && ( st_fx->coder_type == INACTIVE ) ) -#endif { transf_cdbk_dec_fx( st_fx, harm_flag_acelp, i_subfr_fx, Es_pred_fx, gain_code_fx, &gain_preQ_fx, &norm_gain_preQ_fx, code_preQ_fx, unbits ); } /* update LP filtered gains for the case of frame erasures */ - lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); + } + ELSE + { + lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); + } /*----------------------------------------------------------------------* * Find the total excitation @@ -784,10 +316,6 @@ ivas_error decod_gen_voic_ivas_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ - /*prep_tbe_exc_fx(L_frame, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate);*/ - Word16 idx; idx = 0; move16(); @@ -796,11 +324,18 @@ ivas_error decod_gen_voic_ivas_fx( idx = idiv1616( i_subfr_fx, L_SUBFR ); } - prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[idx], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, - st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); + Q_code_preQ = Q6; + move16(); + if ( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + Q_code_preQ = Q10; + move16(); + } + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + &voice_factors_fx[idx], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_code_preQ, + st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*----------------------------------------------------------------* * Excitation enhancements (update of total excitation signal) @@ -813,8 +348,16 @@ ivas_error decod_gen_voic_ivas_fx( } ELSE { - enhancer_ivas_fx2( st_fx->core_brate, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, - norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + enhancer_fx( st_fx->core_brate, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, + norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); + } + ELSE + { + enhancer_ivas_fx( MODE1, st_fx->core_brate, -1, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, + norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); + } } p_Aq_fx += ( M + 1 ); @@ -929,11 +472,11 @@ ivas_error decod_gen_voic_ivas_fx( test(); test(); test(); - IF( GT_16( shl_ro( enratio, sub( 15, Qenratio ), &Overflow ), 8192 ) && /*compare with 0.25 in Q15*/ - LT_16( shl_ro( enratio, sub( 10, Qenratio ), &Overflow ), 15360 ) && /*compare with 15.0 in Q10*/ - GT_16( shl_ro( sp_enratio, sub( 15, Qsp_enratio ), &Overflow ), 4915 ) && /*compare with 0.15 in Q15*/ - LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ - LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ + IF( GT_16( shr_r_sat( enratio, sub( Qenratio, 15 ) ), 8192 ) && /*compare with 0.25 in Q15*/ + LT_16( shr_r_sat( enratio, sub( Qenratio, 10 ) ), 15360 ) && /*compare with 15.0 in Q10*/ + GT_16( shr_r_sat( sp_enratio, sub( Qsp_enratio, 15 ) ), 4915 ) && /*compare with 0.15 in Q15*/ + LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ + LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ { IF( NE_32( ( error = DTFS_new_fx( &PREVP ) ), IVAS_ERR_OK ) ) { diff --git a/lib_dec/dec_higher_acelp_fx.c b/lib_dec/dec_higher_acelp_fx.c index aff7e56564e134e0492ba56f92bed3e6882af87b..85f83ca61a68c8f4dda8181f9c6093b4fbf1cd28 100644 --- a/lib_dec/dec_higher_acelp_fx.c +++ b/lib_dec/dec_higher_acelp_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -8,7 +8,6 @@ #include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ -#define IVAS_CODE_AVQ /*-----------------------------------------------------------------* * transf_cdbk_dec() * Transform domain contribution decoding @@ -31,10 +30,6 @@ void transf_cdbk_dec_fx( Word32 L_tmp; Word32 dct_code32[L_SUBFR]; Word16 qdct; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif Word16 avq_bit_sFlag; Word16 trgtSvPos; Word16 Nsv; @@ -129,7 +124,6 @@ void transf_cdbk_dec_fx( * Demultiplex and decode subvectors from bit-stream *--------------------------------------------------------------*/ -#ifdef IVAS_CODE_AVQ AVQ_demuxdec_fx( st_fx, code_preQ, &nBits, 8, nq, avq_bit_sFlag, trgtSvPos ); Word16 q_Code_preQ; IF( ( st_fx->element_mode == EVS_MONO ) ) @@ -142,12 +136,9 @@ void transf_cdbk_dec_fx( q_Code_preQ = Q_AVQ_OUT; move16(); } -#else - AVQ_demuxdec_fx( st_fx, code_preQ, &nBits, 8, nq ); -#endif FOR( i = 0; i < L_SUBFR; i++ ) { - code_preQ[i] = shl_o( code_preQ[i], q_Code_preQ, &Overflow ); + code_preQ[i] = shl_sat( code_preQ[i], q_Code_preQ ); move16(); /* code_preQ in Q6*/ } @@ -185,7 +176,6 @@ void transf_cdbk_dec_fx( st_fx->last_nq_preQ = nq[7]; move16(); -#ifdef IVAS_CODE_AVQ /* TD pre-quantizer: in extreme cases at subframe boundaries, lower the preemphasis memory to avoid a saturation */ test(); test(); @@ -194,7 +184,6 @@ void transf_cdbk_dec_fx( test(); IF( st_fx->element_mode > EVS_MONO && ( st_fx->coder_type != INACTIVE ) && GE_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) && LE_32( st_fx->core_brate, MAX_BRATE_AVQ_EXC_TD ) && !harm_flag_acelp && code_preQ[0] != 0 ) { - // PMT("Fixed point taking accound of the scaling needs to be done here ") IF( GT_16( abs_s( st_fx->last_code_preq ), shl_sat( abs_s( code_preQ[0] ), 4 ) ) ) { st_fx->mem_preemp_preQ_fx = shr( st_fx->mem_preemp_preQ_fx, 4 ); @@ -209,7 +198,6 @@ void transf_cdbk_dec_fx( st_fx->last_code_preq = code_preQ[L_SUBFR - 1]; // q_Code_preQ move16(); -#endif PREEMPH_FX( code_preQ, FAC_PRE_AVQ_FX, L_SUBFR, &st_fx->mem_preemp_preQ_fx ); /*--------------------------------------------------------------* * Compute normalized prequantizer excitation gain for FEC @@ -250,27 +238,27 @@ void transf_cdbk_dec_fx( } /*==========================================================================*/ -/* FUNCTION : Word16 gain_dequant_fx () */ +/* FUNCTION : Word16 gain_dequant_fx () */ /*--------------------------------------------------------------------------*/ -/* PURPOSE : */ -/* * Returns decoded gain quantized between the specified */ -/* * range using the specified number of levels. */ +/* PURPOSE : */ +/* * Returns decoded gain quantized between the specified */ +/* * range using the specified number of levels. */ /*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* Word16 index i: quantization index */ -/* Word16 min_val i : value of lower limit */ -/* Word16 max_val i : value of upper limit */ -/* Word16 bits i : number of bits to dequantize */ +/* INPUT ARGUMENTS : */ +/* Word16 index i: quantization index */ +/* Word16 min_val i : value of lower limit */ +/* Word16 max_val i : value of upper limit */ +/* Word16 bits i : number of bits to dequantize */ /*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _Word16 *expg o : */ +/* OUTPUT ARGUMENTS : */ +/* _Word16 *expg o : */ /*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* Word16 gain Q0 */ +/* RETURN ARGUMENTS : */ +/* Word16 gain Q0 */ /*--------------------------------------------------------------------------*/ -/* CALLED FROM : */ +/* CALLED FROM : */ /*==========================================================================*/ Word16 gain_dequant_fx( /* o: decoded gain */ Word16 index, /* i: quantization index */ diff --git a/lib_dec/dec_nelp_fx.c b/lib_dec/dec_nelp_fx.c index fe882ffbc223da0e8ad788eaa2f5603090219d89..130b486ac70addbec3b8f18b9c6d35b67791e210 100644 --- a/lib_dec/dec_nelp_fx.c +++ b/lib_dec/dec_nelp_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -17,8 +17,8 @@ /* _ (Word16[]) tmp_noise_fx : long term temporary noise energy */ /* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe(Q6) */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ +/* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ +/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ /* _ (Word16) bfi : frame error rate */ /*-----------------------------------------------------------------------*/ /* OUTPUT ARGUMENTS : */ @@ -29,11 +29,11 @@ /* _ (Word16[]) tmp_noise_fx : long term temporary noise energy (Q0) */ /* _ (Word16[]) pitch_buf_fx : floating pitch values for each - subframe (Q6) */ + subframe (Q6) */ /* _ (Word16[]) st_fx->dispMem : Noise enhancer - phase dispersion - algorithm memory (Q14) */ -/* _ (Word16) st_fx->tilt_code : tilt of code (Q15) */ -/* _ (Word16) st_fx->prev_gain_pit_dec */ + algorithm memory (Q14) */ +/* _ (Word16) st_fx->tilt_code : tilt of code (Q15) */ +/* _ (Word16) st_fx->prev_gain_pit_dec */ /*-----------------------------------------------------------------------*/ /* RETURN ARGUMENTS : */ /* _ None */ diff --git a/lib_dec/dec_pit_exc_fx.c b/lib_dec/dec_pit_exc_fx.c index 746b668198d4c2d0a3ff030739b0d40d82b23952..645444e7da153aae1e206c04a23616839199f2c9 100644 --- a/lib_dec/dec_pit_exc_fx.c +++ b/lib_dec/dec_pit_exc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -8,457 +8,51 @@ #include "prot_fx.h" /* Function prototypes */ /*==========================================================================*/ -/* FUNCTION : void dec_pit_exc_fx() */ +/* FUNCTION : void dec_pit_exc_fx() */ /*--------------------------------------------------------------------------*/ -/* PURPOSE : Decode pitch only contribution */ +/* PURPOSE : Decode pitch only contribution */ /*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16*) Aq_fx : LP filter coefficient Q12 */ -/* _ (Word16) coder_type : coding type Q0 */ +/* INPUT ARGUMENTS : */ +/* _ (Word16*) Aq_fx : LP filter coefficient Q12 */ +/* _ (Word16) coder_type : coding type Q0 */ /* _ (Word16) nb_subfr_fx :Number of subframe considered */ /* _ (Word16) Es_pred_fx :predicted scaled innov. energy */ /*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) pitch_buf_fx : floating pitch values for each subframe Q6 */ -/* _ (Word16*) code_fx : innovation Q12 */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) pitch_buf_fx : floating pitch values for each subframe Q6 */ +/* _ (Word16*) code_fx : innovation Q12 */ /*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /* Decoder_State_fx *st_fx : decoder state structure */ -/* _ (Word16*) exc_fx : adapt. excitation exc */ +/* _ (Word16*) exc_fx : adapt. excitation exc */ /*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*==========================================================================*/ -void dec_pit_exc_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* i : LP filter coefficient */ - const Word16 coder_type, /* i : coding type */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ - Word16 *code_fx, /* o : innovation */ - Word16 *exc_fx, /* i/o: adapt. excitation exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ - const Word16 nb_subfr_fx /* i : Number of subframe considered */ - , - Word16 *gain_buf /*Q14*/ -) -{ - Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ - Word16 gain_pit_fx; /* pitch gain Q14 */ - Word32 gain_code_fx; /* gain/normalized gain of the algebraic excitation Q16 */ - Word32 norm_gain_code_fx; /* normalized gain of the algebraic excitation Q16 */ - Word16 gain_inov_fx; /* Innovation gain Q12 */ - Word16 voice_fac_fx; /* voicing factor Q15 */ - Word16 L_subfr_fx, pit_idx_fx; - const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ - Word16 *pt_pitch_fx; /* pointer to floating pitch Q6 */ - Word16 i_subfr_fx, i; /* tmp variables */ - Word32 Local_BR_fx, Pitch_BR_fx; - Word16 pitch_limit_flag, Pitch_CT_fx; - Word16 exc2_bidon[L_SUBFR]; - Word16 *pt_gain; /* Pointer to floating gain values for each subframe */ - - Word16 gain_code16, gain_pitx2; - Word32 L_tmp; - Word16 nbits; - GSC_DEC_HANDLE hGSCDec; - gain_pit_fx = 0; - move16(); - hGSCDec = st_fx->hGSCDec; - - MUSIC_POSTFILT_HANDLE hMusicPF; - hMusicPF = st_fx->hMusicPF; - - Word16 use_fcb; - Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ - Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes */ -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif - - use_fcb = 0; - move16(); - test(); - test(); - IF( ( st_fx->GSC_IVAS_mode > 0 ) && ( EQ_16( st_fx->GSC_noisy_speech, 1 ) || GT_32( st_fx->core_brate, GSC_H_RATE_STG ) ) ) - { - Local_BR_fx = ACELP_8k00; - Pitch_CT_fx = GENERIC; - Pitch_BR_fx = ACELP_8k00; - move32(); - move32(); - move16(); - IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - Local_BR_fx = ACELP_14k80; - move32(); - if ( st_fx->GSC_IVAS_mode > 0 ) - { - Local_BR_fx = ACELP_9k60; - move32(); - } - Pitch_BR_fx = st_fx->core_brate; - move32(); - } - } - ELSE IF( EQ_16( st_fx->GSC_noisy_speech, 1 ) ) - { - Local_BR_fx = ACELP_7k20; - move32(); - Pitch_CT_fx = GENERIC; - move16(); - Pitch_BR_fx = ACELP_7k20; - move32(); - if ( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - Pitch_BR_fx = st_fx->core_brate; - move32(); - } - } - ELSE - { - Local_BR_fx = ACELP_7k20; - move32(); - Pitch_CT_fx = AUDIO; - move16(); - Pitch_BR_fx = st_fx->core_brate; - move32(); - IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - Pitch_BR_fx = ACELP_13k20; - move32(); - Pitch_CT_fx = GENERIC; - move16(); - } - } - L_subfr_fx = mult_r( st_fx->L_frame, div_s( 1, nb_subfr_fx ) ); /* TV2Opt : this could be less complex with 2 ifs*/ - - - gain_code_fx = 0; - move16(); - pitch_limit_flag = 1; - move16(); /* always extended pitch Q range */ - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || ( EQ_16( st_fx->GSC_noisy_speech, 1 ) && ( ( EQ_16( st_fx->L_frame, L_FRAME ) && GE_32( st_fx->core_brate, ACELP_13k20 ) ) || ( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, GSC_H_RATE_STG ) ) || st_fx->GSC_IVAS_mode == 0 ) ) ) && EQ_16( L_subfr_fx, L_SUBFR ) ) ) - { - use_fcb = 1; - move16(); - } - ELSE IF( ( st_fx->GSC_IVAS_mode > 0 ) && EQ_16( L_subfr_fx, 2 * L_SUBFR ) && LT_16( st_fx->GSC_IVAS_mode, 3 ) ) - { - use_fcb = 2; - st_fx->acelp_cfg.fcb_mode = 1; - move16(); - move16(); - set16_fx( st_fx->acelp_cfg.gains_mode, 6, 4 ); - set16_fx( st_fx->acelp_cfg.pitch_bits, 9, 4 ); - set16_fx( st_fx->acelp_cfg.fixed_cdk_index, 14, 5 ); - } - /*------------------------------------------------------------------* - * ACELP subframe loop - *------------------------------------------------------------------*/ - p_Aq_fx = Aq_fx; /* pointer to interpolated LPC parameters */ - pt_pitch_fx = pitch_buf_fx; /* pointer to the pitch buffer */ - pt_gain = gain_buf; /* pointer to the gain buffer */ - FOR( i_subfr_fx = 0; i_subfr_fx < st_fx->L_frame; i_subfr_fx += L_subfr_fx ) - { - /*----------------------------------------------------------------------* - * Decode pitch lag - *----------------------------------------------------------------------*/ - *pt_pitch_fx = pit_decode_fx( st_fx, Pitch_BR_fx, 0, st_fx->L_frame, i_subfr_fx, Pitch_CT_fx, &pitch_limit_flag, &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_subfr_fx ); - move16(); - - /*--------------------------------------------------------------* - * Find the adaptive codebook vector. - *--------------------------------------------------------------*/ - - pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_subfr_fx + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); - - /*--------------------------------------------------------------* - * Innovation decoding - *--------------------------------------------------------------*/ - - IF( EQ_16( use_fcb, 1 ) ) - { - inov_decode_fx( st_fx, Local_BR_fx, 0, st_fx->L_frame, 1, i_subfr_fx, p_Aq_fx, st_fx->tilt_code_fx, *pt_pitch_fx, code_fx, L_subfr_fx ); - /*--------------------------------------------------------------* - * Gain decoding - * Estimate spectrum tilt and voicing - *--------------------------------------------------------------*/ - - gain_dec_mless_fx( st_fx, st_fx->L_frame, LOCAL_CT, i_subfr_fx, -1, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx ); - - st_fx->tilt_code_fx = est_tilt_fx( exc_fx + i_subfr_fx, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, 0 ); - move16(); - } - ELSE IF( EQ_16( use_fcb, 2 ) ) /* IVAS only */ - { - inov_decode_fx( st_fx, Local_BR_fx, 0, st_fx->L_frame, 1, i_subfr_fx, p_Aq_fx, st_fx->tilt_code_fx, *pt_pitch_fx, code_fx, L_subfr_fx ); - /*--------------------------------------------------------------* - * Gain decoding - * Estimate spectrum tilt and voicing - *--------------------------------------------------------------*/ - - gain_dec_lbr_fx( st_fx, GENERIC, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_subfr_fx ); - - st_fx->tilt_code_fx = est_tilt_fx( exc_fx + i_subfr_fx, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, 0 ); - move16(); - } - ELSE - { - nbits = 5; - move16(); - if ( LT_32( st_fx->core_brate, MIN_RATE_FCB ) ) - { - nbits = 4; - move16(); - } - - set16_fx( code_fx, 0, L_SUBFR ); - gain_code_fx = L_deposit_l( 0 ); - st_fx->tilt_code_fx = 0; - move16(); - pit_idx_fx = (Word16) get_next_indice( st_fx, nbits ); - move16(); - gain_pit_fx = add( 9590, dic_gp_fx[pit_idx_fx] ); - move16(); /*Q14 0.5853 in Q14 9590*/ - - if ( st_fx->BER_detect ) /* Bitstream is corrupted, use the past pitch gain */ - { - gain_pit_fx = st_fx->lp_gainp_fx; - move16(); - } - gain_code_fx = L_mult0( s_max( sub( 32767, shl_o( gain_pit_fx, 1, &Overflow ) ), 16384 ), st_fx->lp_gainc_fx ); /* Use gain pitch and past gain code as an indicator to help finding the best scaling value. gain_code_fx used a temp var*/ - } - - /*----------------------------------------------------------------------* - * Find the total excitation - *----------------------------------------------------------------------*/ - - Rescale_exc( hMusicPF->dct_post_old_exc_fx, &exc_fx[i_subfr_fx], &bwe_exc_fx[( i_subfr_fx * ( 2 * HIBND_ACB_L_FAC ) ) / 2], hGSCDec->last_exc_dct_in_fx, - L_subfr_fx, shr( imult1616( L_subfr_fx, 2 * HIBND_ACB_L_FAC ), 1 ), gain_code_fx, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, i_subfr_fx, coder_type ); - - gain_code16 = round_fx( L_shl( gain_code_fx, st_fx->Q_exc ) ); /*Q_exc*/ - - IF( use_fcb != 0 ) - { - Acelp_dec_total_exc( exc_fx, exc2_bidon - i_subfr_fx, gain_code16, gain_pit_fx, i_subfr_fx, code_fx, L_subfr_fx ); - } - ELSE - { - IF( norm_s( s_or( gain_pit_fx, 1 ) ) == 0 ) - { - FOR( i = 0; i < L_subfr_fx; i++ ) - { - L_tmp = L_shl_sat( L_mult( gain_pit_fx, exc_fx[i + i_subfr_fx] ), 1 ); /*Q16+Q_exc*/ - exc_fx[i + i_subfr_fx] = round_fx_sat( L_tmp ); /*Q_exc*/ - move16(); - } - } - ELSE - { - gain_pitx2 = shl( gain_pit_fx, 1 ); /*Q15*/ - - FOR( i = 0; i < L_subfr_fx; i++ ) - { - L_tmp = L_mult( gain_pitx2, exc_fx[i + i_subfr_fx] ); /*Q16+Q_exc*/ - exc_fx[i + i_subfr_fx] = round_fx_sat( L_tmp ); /*Q_exc*/ - move16(); - } - } - } - - IF( EQ_16( L_subfr_fx, L_FRAME16k ) ) - { - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = gain_pit_fx; - move16(); - st_fx->lp_gainc_fx = 0; - move32(); - - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - move16(); - move16(); - move16(); - move16(); - p_Aq_fx += 5 * ( M + 1 ); - } - ELSE IF( EQ_16( L_subfr_fx, L_FRAME16k / 2 ) ) - { - IF( i_subfr_fx == 0 ) - { - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - p_Aq_fx += 2 * ( M + 1 ); - move16(); - - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = extract_h( L_mult( 6554, gain_pit_fx ) ); /*Q14 (3/15 in Q15 9830)*/ - st_fx->lp_gainc_fx = 0; - move16(); - move16(); - } - ELSE - { - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - p_Aq_fx += 3 * ( M + 1 ); - move16(); - move16(); - - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = extract_h( L_mult( 26214, gain_pit_fx ) ); /*Q14 (12/15 in Q15 9830)*/ - st_fx->lp_gainc_fx = 0; - move16(); - move16(); - } - } - ELSE IF( EQ_16( L_subfr_fx, 128 ) ) /*2*L_SUBFR*/ - { - p_Aq_fx += 2 * ( M + 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - move16(); - pt_pitch_fx++; - *pt_gain = gain_pit_fx; - move16(); - pt_gain++; - *pt_gain = *( pt_gain - 1 ); - move16(); - pt_gain++; - IF( i_subfr_fx == 0 ) - { - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = extract_h( L_mult( 9830, gain_pit_fx ) ); /*Q14 (3/10 in Q15 9830)*/ - st_fx->lp_gainc_fx = 0; - move16(); - move16(); - } - ELSE - { - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = extract_h( L_mult( 22938, gain_pit_fx ) ); /*Q14 (7/10 in Q15 22938)*/ - st_fx->lp_gainc_fx = 0; - move16(); - move16(); - } - } - ELSE IF( EQ_16( L_subfr_fx, 256 ) ) /*4*L_SUBFR*/ - { - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - move16(); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - move16(); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - move16(); - pt_pitch_fx++; - *pt_gain = gain_pit_fx; - move16(); - pt_gain++; - *pt_gain = *( pt_gain - 1 ); - move16(); - pt_gain++; - *pt_gain = *( pt_gain - 1 ); - move16(); - pt_gain++; - *pt_gain = *( pt_gain - 1 ); - move16(); - pt_gain++; - p_Aq_fx += 4 * ( M + 1 ); - - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = gain_pit_fx; - move16(); - st_fx->lp_gainc_fx = 0; - move16(); - } - ELSE - { - p_Aq_fx += ( M + 1 ); - move16(); - pt_pitch_fx++; - move16(); - *pt_gain = gain_pit_fx; - move16(); - pt_gain++; - - lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, 0, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, st_fx->L_frame ); - } - } - - return; -} - -/*==========================================================================*/ -/* FUNCTION : void dec_pit_exc_ivas_fx() */ -/*--------------------------------------------------------------------------*/ -/* PURPOSE : Decode pitch only contribution */ -/*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16*) Aq_fx : LP filter coefficient Q12 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) nb_subfr_fx :Number of subframe considered */ -/* _ (Word16) Es_pred_fx :predicted scaled innov. energy */ -/*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) pitch_buf_fx : Word16 pitch values for each subframe Q6 */ -/* _ (Word16*) code_fx : innovation */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Decoder_State_fx *st_fx : decoder state structure */ -/* _ (Word16*) exc_fx : adapt. excitation exc */ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*==========================================================================*/ -void dec_pit_exc_ivas_fx( +void dec_pit_exc_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* i : LP filter coefficient */ const Word16 coder_type, /* i : coding type */ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - Word16 *pitch_buf_fx, /* o : Word16 pitch values for each subframe */ + Word16 *pitch_buf_fx, /* o : Word16 pitch values for each subframe */ Word16 *code_fx, /* o : innovation */ Word16 *exc_fx, /* i/o: adapt. excitation exc */ Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ const Word16 nb_subfr_fx, /* i : Number of subframe considered */ - Word16 *gain_buf, /*Q14*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ ) { - Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ - Word16 gain_pit_fx; /* pitch gain Q14 */ - Word32 gain_code_fx; /* gain/normalized gain of the algebraic excitation Q16 */ + Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ + Word16 gain_pit_fx; /* pitch gain Q14 */ + Word32 gain_code_fx; /* gain/normalized gain of the algebraic excitation Q16 */ Word32 norm_gain_code_fx; /* normalized gain of the algebraic excitation Q16 */ - Word16 gain_inov_fx; /* Innovation gain Q12 */ + Word16 gain_inov_fx; /* Innovation gain Q12 */ Word16 voice_fac_fx; /* voicing factor Q15 */ Word16 L_subfr_fx, pit_idx_fx; - const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ + const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ Word16 *pt_pitch_fx; /* pointer to Word16 pitch Q6 */ Word16 i_subfr_fx, i; /* tmp variables */ Word32 Local_BR_fx, Pitch_BR_fx; @@ -479,10 +73,6 @@ void dec_pit_exc_ivas_fx( Word16 use_fcb; Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes */ -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif use_fcb = 0; move16(); @@ -575,20 +165,27 @@ void dec_pit_exc_ivas_fx( p_Aq_fx = Aq_fx; /* pointer to interpolated LPC parameters */ pt_pitch_fx = pitch_buf_fx; /* pointer to the pitch buffer */ pt_gain = gain_buf; /* pointer to the gain buffer */ + FOR( i_subfr_fx = 0; i_subfr_fx < st_fx->L_frame; i_subfr_fx += L_subfr_fx ) { /*----------------------------------------------------------------------* * Decode pitch lag *----------------------------------------------------------------------*/ - *pt_pitch_fx = pit_decode_ivas_fx( st_fx, Pitch_BR_fx, 0, st_fx->L_frame, i_subfr_fx, Pitch_CT_fx, &pitch_limit_flag, &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_subfr_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + *pt_pitch_fx = pit_decode_fx( st_fx, Pitch_BR_fx, 0, st_fx->L_frame, i_subfr_fx, Pitch_CT_fx, &pitch_limit_flag, &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_subfr_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); move16(); /*--------------------------------------------------------------* * Find the adaptive codebook vector. *--------------------------------------------------------------*/ - - pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_subfr_fx + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_subfr_fx + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_subfr_fx + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } /*--------------------------------------------------------------* * Innovation decoding @@ -618,7 +215,7 @@ void dec_pit_exc_ivas_fx( * Estimate spectrum tilt and voicing *--------------------------------------------------------------*/ - gain_dec_lbr_ivas_fx( st_fx, GENERIC, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_subfr_fx ); + gain_dec_lbr_fx( st_fx, GENERIC, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_subfr_fx ); st_fx->tilt_code_fx = est_tilt_ivas_fx( exc_fx + i_subfr_fx, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, 0, L_subfr_fx, 0 ); move16(); @@ -647,7 +244,7 @@ void dec_pit_exc_ivas_fx( gain_pit_fx = st_fx->lp_gainp_fx; move16(); } - gain_code_fx = L_mult0( s_max( sub( 32767, shl_o( gain_pit_fx, 1, &Overflow ) ), 16384 /*0.5.Q15*/ ), st_fx->lp_gainc_fx ); /* Use gain pitch and past gain code as an indicator to help finding the best scaling value. gain_code_fx used a temp var*/ + gain_code_fx = L_mult0( s_max( sub( 32767, shl_sat( gain_pit_fx, 1 ) ), 16384 /*0.5.Q15*/ ), st_fx->lp_gainc_fx ); /* Use gain pitch and past gain code as an indicator to help finding the best scaling value. gain_code_fx used a temp var*/ } /*----------------------------------------------------------------------* diff --git a/lib_dec/dec_post_fx.c b/lib_dec/dec_post_fx.c index a4f618a3fd751dec1eeea852d8e26230a86f39c8..bb24978b22dbfac33cece7743f571b7b12242d9a 100644 --- a/lib_dec/dec_post_fx.c +++ b/lib_dec/dec_post_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" @@ -35,8 +35,6 @@ static void modify_pst_param_fx( const Word16 lp_noise, Word16 *g1, Word16 *g2, static void Dec_formant_postfilt_fx( PFSTAT_HANDLE hPFstat, Word16 *signal_ptr, Word16 *coeff, Word16 *sig_out, Word16 gamma1, Word16 gamma2 ); -static void Dec_formant_postfilt_ivas_fx( PFSTAT_HANDLE hPFstat, Word16 *signal_ptr, Word16 *coeff, Word16 *sig_out, Word16 gamma1, Word16 gamma2 ); - static void calc_st_filt_ivas_fx( Word16 *apond2, Word16 *apond1, Word16 *parcor0, Word16 *sig_ltp_ptr, Word16 *mem_zero, const Word16 extl ); @@ -81,7 +79,7 @@ void Init_post_filter_fx( *--------------------------------------------------------------------------*/ void nb_post_filt_fx( const Word16 L_frame, /* i : frame length */ - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *psf_lp_noise, /* i : Long term noise Q8 */ const Word16 tmp_noise, /* i : noise energy Q0 */ Word16 *Synth, /* i : 12k8 synthesis Qsyn */ @@ -255,21 +253,21 @@ static void Dec_postfilt_fx( * * Main routine to perform formant post filtering *--------------------------------------------------------------------------*/ + void formant_post_filt_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ - Word16 *Aq, /* i : LP filter coefficient Q12 */ + Word16 *Aq, /* i : LP filter coefficient Q12 */ Word16 *synth_out, /* i/o: input signal */ - Word16 L_frame, - Word32 lp_noise, /* (i) : background noise energy (15Q16) */ - Word32 brate, /* (i) : bit-rate */ - const Word16 off_flag /* i : off flag */ + const Word16 L_frame, /* i : frame length */ + const Word32 lp_noise, /* (i) : background noise energy (15Q16) */ + const Word32 brate, /* (i) : bit-rate */ + const Word16 off_flag /* i : off flag */ ) { Word16 i_subfr; Word16 *p_Aq; - Word16 post_G1, post_G2; // Q15 - + Word16 post_G1, post_G2; /*default parameter for noisy speech and high bit-rates*/ IF( EQ_16( L_frame, L_FRAME ) ) @@ -378,134 +376,13 @@ void formant_post_filt_fx( Dec_formant_postfilt_fx( hPFstat, &synth_in[i_subfr], p_Aq, &synth_out[i_subfr], post_G1, post_G2 ); p_Aq += ( M + 1 ); } -} - -void formant_post_filt_ivas_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ - Word16 *synth_in, /* i : 12k8 synthesis */ - Word16 *Aq, /* i : LP filter coefficient Q12 */ - Word16 *synth_out, /* i/o: input signal */ - Word16 L_frame, - Word32 lp_noise, /* (i) : background noise energy (15Q16) */ - Word32 brate, /* (i) : bit-rate */ - const Word16 off_flag /* i : off flag */ -) -{ - Word16 i_subfr; - Word16 *p_Aq; - Word16 post_G1, post_G2; - - - /*default parameter for noisy speech and high bit-rates*/ - IF( EQ_16( L_frame, L_FRAME ) ) - { - post_G2 = 22938 /*0.7f Q15*/; - move16(); - IF( LT_32( lp_noise, LP_NOISE_THRESH ) ) - { - /*Clean speech*/ - IF( LT_32( brate, ACELP_13k20 ) ) - { - /*Low rates*/ - post_G1 = 26214 /*0.8f Q15*/; - move16(); - } - ELSE IF( LT_32( brate, ACELP_24k40 ) ) - { - /*Low rates*/ - - post_G1 = 24576 /*0.75f Q15*/; - move16(); - } - ELSE - { - post_G1 = 23593 /*0.72f Q15*/; - move16(); - } - } - ELSE /*Noisy speech*/ - { - post_G1 = 22938 /*0.7f Q15*/; - move16(); - if ( LT_32( brate, ACELP_15k85 ) ) - { - /*Low rates*/ - post_G1 = 24576 /*0.75f Q15*/; - move16(); - } - } - } - ELSE - { - post_G2 = 24904 /*0.76f Q15*/; - move16(); - test(); - IF( GE_32( lp_noise, LP_NOISE_THRESH ) ) - { - post_G1 = 24904 /*0.76f Q15*/; - } - ELSE IF( EQ_32( brate, ACELP_13k20 ) ) - { - post_G1 = 26870 /*0.82f Q15*/; - move16(); - } - ELSE IF( EQ_32( brate, ACELP_16k40 ) ) - { - post_G1 = 26214 /*0.80f Q15*/; - move16(); - } - ELSE IF( EQ_32( brate, ACELP_24k40 ) || EQ_32( brate, ACELP_32k ) ) - { - post_G1 = 25559 /*0.78f Q15*/; - move16(); - } - ELSE - { - post_G1 = 24904 /*0.76f Q15*/; - move16(); - } - } - - /* Switch off post-filter */ - if ( off_flag != 0 ) - { - post_G1 = post_G2; - move16(); - } - - /* Reset post filter */ - IF( hPFstat->reset != 0 ) - { - post_G1 = MAX16B; - move16(); - post_G2 = MAX16B; - move16(); - hPFstat->reset = 0; - move16(); - Copy( &synth_in[L_frame - L_SYN_MEM], hPFstat->mem_pf_in, L_SYN_MEM ); - Copy( &synth_in[L_frame - L_SYN_MEM], hPFstat->mem_stp, L_SYN_MEM ); - hPFstat->gain_prec = 16384; // 1.Q14 - move16(); - Copy( synth_in, synth_out, L_frame ); + return; +} - return; - } - /* input memory*/ - Copy( hPFstat->mem_pf_in, synth_in - L_SYN_MEM, L_SYN_MEM ); - Copy( &synth_in[L_frame - L_SYN_MEM], hPFstat->mem_pf_in, L_SYN_MEM ); - - move16(); - p_Aq = Aq; // Q12 - FOR( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) - { - Dec_formant_postfilt_ivas_fx( hPFstat, &synth_in[i_subfr], p_Aq, &synth_out[i_subfr], post_G1, post_G2 ); - p_Aq += ( M + 1 ); - } -} /*---------------------------------------------------------------------------- - * Dec_formant_postfilt_fx + * Dec_formant_postfilt_fx() * * Post - adaptive postfilter main function * Short term postfilter : @@ -519,92 +396,14 @@ void formant_post_filt_ivas_fx( * k1 = 1st parcor calculated on {hi} * gamma3 = gamma3_minus if k1<0, gamma3_plus if k1>0 *----------------------------------------------------------------------------*/ -static void Dec_formant_postfilt_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ - Word16 *signal_ptr, /* i : input signal (pointer to current subframe Q14*/ - Word16 *coeff, /* i : LPC coefficients for current subframe Q12 */ - Word16 *sig_out, /* o : postfiltered output */ - Word16 gamma1, /* i : short term postfilt. den. weighting factor Q15*/ - Word16 gamma2 /* i : short term postfilt. num. weighting factor Q15*/ -) -{ - /* Local variables and arrays */ - Word16 apond1[M + 1]; /* s.t. denominator coeff. Q12*/ - Word16 apond2[LONG_H_ST]; // Q12 - Word16 res2[L_SUBFR]; // Q14 - Word16 resynth[L_SUBFR + 1]; // Qy - Word16 parcor0; // Q15 - Word16 i, max; - Word16 scale_down; - - /* Compute weighted LPC coefficients */ - weight_a_fx( coeff, apond1, gamma1, M ); - weight_a_fx( coeff, apond2, gamma2, M ); - set16_fx( &apond2[M + 1], 0, LONG_H_ST - ( M + 1 ) ); - - max = abs_s( signal_ptr[0] ); // Q14 - FOR( i = 1; i < L_SUBFR; i++ ) - { - max = s_max( max, abs_s( signal_ptr[i] ) ); - } - scale_down = 0; - move16(); - if ( GT_16( max, 16384 /*1.Q14*/ ) ) - { - scale_down = 1; - move16(); - } - - /* Compute A(gamma2) residual */ - IF( !scale_down ) - { - Residu3_fx( apond2, signal_ptr, res2, L_SUBFR, 1 ); - } - ELSE - { - Residu3_fx( apond2, signal_ptr, res2, L_SUBFR, 0 ); - Scale_sig( hPFstat->mem_stp, L_SYN_MEM, -1 ); - } - /* Controls short term pst filter gain and compute parcor0 */ - calc_st_filt_local_fx( apond2, apond1, &parcor0, res2, hPFstat->mem_zero ); - - /* 1/A(gamma1) filtering, mem_stp is updated */ - resynth[0] = *( hPFstat->mem_stp + sub( L_SYN_MEM, 1 ) ); - move16(); - - E_UTIL_synthesis( 1, apond1, res2, &( resynth[1] ), L_SUBFR, hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); - - IF( !scale_down ) - { - Copy( &( resynth[1] ) + L_SUBFR - L_SYN_MEM, hPFstat->mem_stp, L_SYN_MEM ); - } - ELSE - { - Copy_Scale_sig( &( resynth[1] ) + L_SUBFR - L_SYN_MEM, hPFstat->mem_stp, L_SYN_MEM, 1 ); - } - - /* Tilt filtering */ - Filt_mu_fx( resynth, sig_out, parcor0, L_SUBFR ); - IF( scale_down ) - { - Scale_sig( sig_out, L_SUBFR, 1 ); - } - - /* Gain control */ - scale_st_fx( signal_ptr, sig_out, &hPFstat->gain_prec, L_SUBFR ); - - - return; -} - -static void Dec_formant_postfilt_ivas_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ - Word16 *signal_ptr, /* i : input signal (pointer to current subframe Q14*/ - Word16 *coeff, /* i : LPC coefficients for current subframe Q12 */ - Word16 *sig_out, /* o : postfiltered output */ - Word16 gamma1, /* i : short term postfilt. den. weighting factor Q15*/ - Word16 gamma2 /* i : short term postfilt. num. weighting factor Q15*/ +static void Dec_formant_postfilt_fx( + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + Word16 *signal_ptr, /* i : input signal (pointer to current subframe Q14*/ + Word16 *coeff, /* i : LPC coefficients for current subframe Q12 */ + Word16 *sig_out, /* o : postfiltered output */ + Word16 gamma1, /* i : short term postfilt. den. weighting factor Q15*/ + Word16 gamma2 /* i : short term postfilt. num. weighting factor Q15*/ ) { /* Local variables and arrays */ @@ -694,16 +493,12 @@ static void modify_pst_param_fx( Word16 tmp; Word16 lp_noiseQ12; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif test(); IF( NE_16( coder_type, INACTIVE ) && LT_16( lp_noise, LP_NOISE_THR_FX ) ) { - lp_noiseQ12 = shl_o( lp_noise, 4, &Overflow ); /* to go from Q8 to Q12 */ + lp_noiseQ12 = shl_sat( lp_noise, 4 ); /* to go from Q8 to Q12 */ /* ftmp = lp_noise*BG1_FX + CG1_FX */ tmp = mac_r( CG1_FX * 65536L, lp_noiseQ12, BG1_FX * 8 ); /* x8 to go from Q12 to Q15 */ @@ -774,10 +569,6 @@ static void pst_ltp_fx( Word16 gain_plt; Word16 off_yup; Word16 nb_sh_sig; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif /* i signal justified on 13 bits */ @@ -876,7 +667,7 @@ static void pst_ltp_fx( /* decrease gain in noisy condition */ /* gain_plt += (1.0f-gain_plt) * gain_factor */ /* gain_plt = gain_plt + gain_factor - gain_plt*gain_factor */ - gain_plt = msu_ro( L_msu( L_deposit_h( gain_plt ), gain_plt, gain_factor ), -32768, gain_factor, &Overflow ); // Q15 + gain_plt = msu_r_sat( L_msu( L_deposit_h( gain_plt ), gain_plt, gain_factor ), -32768, gain_factor ); // Q15 /** filtering by H0(z) = harmonic filter **/ filt_plt_fx( ptr_sig_in, ptr_y_up, ptr_sig_pst0, gain_plt ); @@ -1620,10 +1411,6 @@ void Filt_mu_fx( Word16 n; Word16 mu, mu2, ga, temp; Word16 fact, sh_fact; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif IF( parcor0 > 0 ) @@ -1649,7 +1436,7 @@ void Filt_mu_fx( temp = sub( 1, abs_s( mu ) ); BASOP_SATURATE_WARNING_OFF_EVS; - mu2 = add_o( 32767, temp, &Overflow ); /* Q15 (1 - |mu|) */ + mu2 = add_sat( 32767, temp ); /* Q15 (1 - |mu|) */ BASOP_SATURATE_WARNING_ON_EVS; ga = div_s( fact, mu2 ); /* Q(sh_fact) / (1 - |mu|) */ @@ -1689,10 +1476,6 @@ void Filt_mu_ivas_fx( Word16 n; Word16 mu, mu2, ga, temp; Word16 fact, sh_fact; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif IF( EQ_16( extl, SWB_TBE ) ) { @@ -1743,7 +1526,7 @@ void Filt_mu_ivas_fx( temp = sub( 1, abs_s( mu ) ); BASOP_SATURATE_WARNING_OFF_EVS; - mu2 = add_o( 32767, temp, &Overflow ); /* Q15 (1 - |mu|) */ + mu2 = add_sat( 32767, temp ); /* Q15 (1 - |mu|) */ BASOP_SATURATE_WARNING_ON_EVS; ga = div_s( fact, mu2 ); /* Q(sh_fact) / (1 - |mu|) */ @@ -1885,18 +1668,14 @@ void blend_subfr2_fx( Word16 fac2 = 0 + 512; // 0.Q15 + ( 1.Q15 / L_SUBFR ); Word16 step = 1024; // 1.Q15 / ( L_SUBFR / 2 ); Word16 i; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif move16(); move16(); move16(); FOR( i = 0; i < L_SUBFR / 2; i++ ) { - sigOut[i] = mac_ro( L_mult_o( fac1, sigIn1[i], &Overflow ), fac2, sigIn2[i], &Overflow ); // Qx - fac1 = sub_o( fac1, step, &Overflow ); - fac2 = add_o( fac2, step, &Overflow ); + sigOut[i] = mac_r_sat( L_mult_sat( fac1, sigIn1[i] ), fac2, sigIn2[i] ); // Qx + fac1 = sub_sat( fac1, step ); + fac2 = add_sat( fac2, step ); move16(); } diff --git a/lib_dec/dec_ppp_fx.c b/lib_dec/dec_ppp_fx.c index 4849e147a04c9f10f351aa1c9ae5d89750637be4..37277b06fce12d2060d84f1abbe99342cdb8e94b 100644 --- a/lib_dec/dec_ppp_fx.c +++ b/lib_dec/dec_ppp_fx.c @@ -1,64 +1,65 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include #include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ + /*===================================================================*/ -/* FUNCTION : void decod_ppp_fx () */ +/* FUNCTION : void decod_ppp_fx () */ /*-------------------------------------------------------------------*/ -/* PURPOSE : decode highly voiced frames using PPP */ +/* PURPOSE : decode highly voiced frames using PPP */ /*-------------------------------------------------------------------*/ /* INPUT ARGUMENTS : */ -/* _ const Word16 Aq_fx[] - Q12 12k8 Lp coefficient */ -/* _ Word16 bfi_fx - Q0 bad frame indicator */ +/* _ const Word16 Aq_fx[] - Q12 12k8 Lp coefficient */ +/* _ Word16 bfi_fx - Q0 bad frame indicator */ /*-------------------------------------------------------------------*/ /* OUTPUT ARGUMENTS : */ -/* _ Decoder_State_fx *st_fx: */ +/* _ Decoder_State_fx *st_fx: */ /* _ lastLgainD_fx - Q11 */ /* _ lastHgainD_fx - Q11 */ /* _ lasterbD_fx - Q13 */ /*-------------------------------------------------------------------*/ /* INPUT/OUTPUT ARGUMENTS : */ -/* _ Decoder_State_fx *st_fx: */ -/* _ lsp_old_fx - Q15 */ -/* _ st_fx->dtfs_dec_xxxx */ -/* _ a nd b in st_fx->dtfs_dec_Q */ -/* rest all in Q0 */ +/* _ Decoder_State_fx *st_fx: */ +/* _ lsp_old_fx - Q15 */ +/* _ st_fx->dtfs_dec_xxxx */ +/* _ a nd b in st_fx->dtfs_dec_Q */ +/* rest all in Q0 */ /* _ gainp_ppp Q14 */ /* _ FadeScale_fx - Q15 */ /* _ tilt_code_fx - Q15 */ -/* _ prev_tilt_code_dec_fx - Q15 */ +/* _ prev_tilt_code_dec_fx - Q15 */ /* _ prev_gain_pit_dec_fx - Q14 */ /* _ dm_fx.prev_state - Q0 */ /* _ dm_fx.prev_gain_code - Q16 */ /* _ .dm_fx.prev_gain_pit - Q14 */ -/* _ prev_gain_pit_dec - Q14 */ -/* _ Word16 *pitch_buf_fx - Q6 fixed pitch values for each subframe */ -/* _ Word16 *exc_fx - Q_exc current non-enhanced excitation */ -/* _ Word16 *exc2_fx - Q_exc current enhanced excitation */ +/* _ prev_gain_pit_dec - Q14 */ +/* _ Word16 *pitch_buf_fx - Q6 fixed pitch values for each subframe */ +/* _ Word16 *exc_fx - Q_exc current non-enhanced excitation */ +/* _ Word16 *exc2_fx - Q_exc current enhanced excitation */ /*-------------------------------------------------------------------*/ /* RETURN ARGUMENTS : */ -/* _ None */ +/* _ None */ /*-------------------------------------------------------------------*/ -/* CALLED FROM : RX */ +/* CALLED FROM : RX */ /*===================================================================*/ + ivas_error decod_ppp_fx( - Decoder_State *st_fx, /* i/o: state structure */ - const Word16 Aq_fx[], /* i : 12k8 Lp coefficient */ - Word16 *pitch_buf_fx, /* i/o: fixed pitch values for each subframe */ - Word16 *exc_fx, /* i/o: current non-enhanced excitation */ - Word16 *exc2_fx, /* i/o: current enhanced excitation */ - Word16 bfi, /* i : bad frame indicator */ - Word16 *gain_buf, + Decoder_State *st_fx, /* i/o: state structure */ + const Word16 Aq_fx[], /* i : 12k8 Lp coefficient */ + Word16 *pitch_buf_fx, /* i/o: fixed pitch values for each subframe */ + Word16 *exc_fx, /* i/o: current non-enhanced excitation */ + Word16 *exc2_fx, /* i/o: current enhanced excitation */ + Word16 bfi, /* i : bad frame indicator */ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ Word16 *voice_factors, /* o : voicing factors */ Word16 *bwe_exc_fx /* o : excitation for SWB TBE */ ) { Word16 k; - Word16 LPC_de_curr_fx[M + 1], p_Aq_curr_fx[M], p_Aq_old_fx[M + 1]; Word16 excQ_ppp_fx[L_FRAME], pitch_fx[NB_SUBFR], LPC_de_old_fx[M + 1]; ivas_error error; diff --git a/lib_dec/dec_prm_fx.c b/lib_dec/dec_prm_fx.c index 3d277807d2fed95764ba8e3c4992662fd26eac4b..6b6748b803ff1933f7b06c897de86590e86258e7 100644 --- a/lib_dec/dec_prm_fx.c +++ b/lib_dec/dec_prm_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -1003,12 +1003,7 @@ void dec_prm_fx( { IF( st->lpcQuantization == 0 ) { - decode_lpc_avq_fx( st, st->numlpc, param_lpc -#ifdef IVAS_CODE_AVQ_LPC - , - , , -#endif - ); + decode_lpc_avq_fx( st, st->numlpc, param_lpc ); move16(); } ELSE IF( EQ_16( st->lpcQuantization, 1 ) ) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 8ff50f8a521a84f1561dcd9fd3ed0d64be9eadae..f9377d53f0c13846986a9bdc12fea6940b908d60 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -1,26 +1,28 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include #include #include "prot_fx.h" +#include "options.h" #include "basop_util.h" #include "stl.h" -#include "options.h" #include "math.h" #include "ivas_prot_fx.h" #include "rom_com.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" + + extern const Word16 T_DIV_L_Frame[]; /*0Q15 * 2^-7 */ -static Word32 CalculateAbsEnergy_fx( /* o : normalized result Q31 */ - const Word32 L_off, /* i : initial sum value Qn */ - const Word16 x[], /* i : x vector Qn */ - const Word16 lg, /* i : vector length, range [0..7FFF] Q0 */ - Word16 *exp /* o : exponent of result in [-32,31] Q0 */ +/* o : normalized result Q31 */ +static Word32 CalculateAbsEnergy_fx( + const Word32 L_off, /* i : initial sum value Qn */ + const Word16 x[], /* i : x vector Qn */ + const Word16 lg, /* i : vector length, range [0..7FFF] Q0 */ + Word16 *exp /* o : exponent of result in [-32,31] Q0 */ ); void decoder_tcx_fx( @@ -80,12 +82,10 @@ void decoder_tcx_fx( Word16 L_spec_con; TCX_LTP_DEC_HANDLE hTcxLtpDec; TCX_DEC_HANDLE hTcxDec; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; Flag Carry = 0; move32(); move32(); -#endif temp_concealment_method = 0; move16(); @@ -547,7 +547,7 @@ void decoder_tcx_fx( st->last_gain_syn_deemph_e = add( st->last_gain_syn_deemph_e, 10 /*scaling of h1[0] and E_UTIL_synthesis * 2*/ ); move16(); tmp32 = Sqrt32( tmp32, &st->last_gain_syn_deemph_e ); - st->last_gain_syn_deemph = round_fx_o( tmp32, &Overflow ); + st->last_gain_syn_deemph = round_fx_sat( tmp32 ); move16(); /*for avoiding compiler warnings*/ hTcxDec->gainHelper = 32768 / 2; @@ -620,14 +620,11 @@ void decoder_tcx_fx( test(); IF( ( bfi == 0 ) && ( hTcxCfg->resq != 0 ) ) { - IF( hTcxDec->tcx_lpc_shaped_ari != 0 ) /* new arithmetic coder */ { - Word16 *prm_resq; - prm_resq = prm_sqQ + sub( *prm_target /* = targetBits */ - , + prm_resq = prm_sqQ + sub( *prm_target, /* = targetBits */ hTcxDec->resQBits[frame_cnt] ); i = tcx_ari_res_invQ_spec( x, x_e, L_spec, @@ -661,7 +658,6 @@ void decoder_tcx_fx( } /* for FAC */ - test(); IF( bfi == 0 && st->tcxonly == 0 ) { @@ -731,7 +727,6 @@ void decoder_tcx_fx( } } - IF( hTcxDec->tcx_lpc_shaped_ari == 0 ) /* old arithmetic coder */ { /* noise filling seed */ @@ -893,9 +888,6 @@ void decoder_tcx_fx( TonalMDCTConceal_InsertNoise( st->hTonalMDCTConc, x, &x_e, st->tonal_mdct_plc_active, &st->seed_tcx_plc, noiseTiltFactor, f, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - concealment_noise, -#endif infoIGFStartLine ); } } @@ -1279,10 +1271,6 @@ void decoder_tcx_post_fx( Decoder_State *st_fx, Word32 tmp32; Word32 tmp32_1, tmp32_2; TCX_DEC_HANDLE hTcxDec; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif hTcxDec = st_fx->hTcxDec; @@ -1354,7 +1342,7 @@ void decoder_tcx_post_fx( Decoder_State *st_fx, } tmp32 = Mpy_32_16_1( tmp32, getInvFrameLen( hTcxDec->L_frameTCX ) ); tmp2 = norm_l( tmp32 ); - tmp1 = round_fx_o( L_shl( tmp32, tmp2 ), &Overflow ); + tmp1 = round_fx_sat( L_shl( tmp32, tmp2 ) ); s = sub( sub( sub( 1, shl( s, 1 ) ), 6 /*table lookup for inverse framelength*/ ), tmp2 ); tmp1 = Sqrt16( tmp1, &s ); move16(); @@ -1447,18 +1435,18 @@ void decoder_tcx_post_fx( Decoder_State *st_fx, &tmp1 ); tmp2 = BASOP_Util_Add_MantExp( hTcxDec->conceal_eof_gain, 15 - 14, negate( tmp1 ), tmp2, &tmp1 ); - step = L_shl_o( L_mult( tmp1, getInvFrameLen( st_fx->L_frame ) ), sub( tmp2, 6 /*scaling from table lookup*/ + 1 /*go to Q30*/ ), &Overflow ); /*Q30*/ + step = L_shl_sat( L_mult( tmp1, getInvFrameLen( st_fx->L_frame ) ), sub( tmp2, 6 /*scaling from table lookup*/ + 1 /*go to Q30*/ ) ); /*Q30*/ { Word32 stepFB; UWord32 dmy; conceal_eof_gainFB = L_deposit_h( hTcxDec->conceal_eof_gain ); /*Q30*/ Mpy_32_32_ss( step, L_shl( L_mult0( st_fx->L_frame, getInvFrameLen( hTcxDec->L_frameTCX ) ), 8 ), &stepFB, &dmy ); - stepFB = L_shl_o( stepFB, 3 - 1, &Overflow ); /*Q30*/ + stepFB = L_shl_sat( stepFB, 3 - 1 ); /*Q30*/ FOR( i = 0; i < hTcxDec->L_frameTCX; i++ ) { synthFB[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( conceal_eof_gainFB, synthFB[i] ), 1 ) ); move16(); - conceal_eof_gainFB = L_sub_o( conceal_eof_gainFB, stepFB, &Overflow ); + conceal_eof_gainFB = L_sub_sat( conceal_eof_gainFB, stepFB ); } } conceal_eof_gain32 = L_deposit_h( hTcxDec->conceal_eof_gain ); /*Q30*/ @@ -1466,17 +1454,18 @@ void decoder_tcx_post_fx( Decoder_State *st_fx, { xn_buf[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( conceal_eof_gain32 /*Q30*/, xn_buf[i] ), 1 ) ); move16(); - conceal_eof_gain32 = L_sub_o( conceal_eof_gain32, step, &Overflow ); + conceal_eof_gain32 = L_sub_sat( conceal_eof_gain32, step ); } - hTcxDec->conceal_eof_gain = round_fx_o( conceal_eof_gain32, &Overflow ); /*Q14*/ + hTcxDec->conceal_eof_gain = round_fx_sat( conceal_eof_gain32 ); /*Q14*/ move16(); /* run lpc gain compensation not for waveform adjustment */ test(); IF( 0 == st_fx->enablePlcWaveadjust || EQ_16( st_fx->hPlcInfo->concealment_method, TCX_TONAL ) ) { - st_fx->hPlcInfo->recovery_gain = extract_h( L_shl_o( Mpy_32_16_1( conceal_eof_gainFB, - st_fx->last_concealed_gain_syn_deemph ), - st_fx->last_concealed_gain_syn_deemph_e, &Overflow ) ); /*Q30->Q14*/ + st_fx->hPlcInfo->recovery_gain = extract_h( L_shl_sat( Mpy_32_16_1( conceal_eof_gainFB, + st_fx->last_concealed_gain_syn_deemph ), + st_fx->last_concealed_gain_syn_deemph_e ) ); + /*Q30->Q14*/ move16(); } ELSE @@ -1546,10 +1535,6 @@ void decoder_tcx_post_ivas_fx( Decoder_State *st_fx, Word32 tmp32; Word32 tmp32_1, tmp32_2; TCX_DEC_HANDLE hTcxDec; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif hTcxDec = st_fx->hTcxDec; @@ -1632,7 +1617,7 @@ void decoder_tcx_post_ivas_fx( Decoder_State *st_fx, } tmp32 = Mpy_32_16_1( tmp32, getInvFrameLen( hTcxDec->L_frameTCX ) ); tmp2 = norm_l( tmp32 ); - tmp1 = round_fx_o( L_shl( tmp32, tmp2 ), &Overflow ); + tmp1 = round_fx_sat( L_shl( tmp32, tmp2 ) ); // s = sub(sub(sub(1, shl(s, 1)), 6/*table lookup for inverse framelength*/), tmp2); s = sub( 25, add( shl( add( Q_syn, s ), 1 ), tmp2 ) ); tmp1 = Sqrt16( tmp1, &s ); @@ -1805,7 +1790,7 @@ void decoder_tcx_post_ivas_fx( Decoder_State *st_fx, test(); IF( 0 == st_fx->enablePlcWaveadjust || EQ_16( st_fx->hPlcInfo->concealment_method, TCX_TONAL ) ) { - st_fx->hPlcInfo->recovery_gain = extract_h( L_shl_o( Mpy_32_16_1( conceal_eof_gainFB, st_fx->last_concealed_gain_syn_deemph ), st_fx->last_concealed_gain_syn_deemph_e, &Overflow ) ); /*Q30->Q14*/ + st_fx->hPlcInfo->recovery_gain = extract_h( L_shl_sat( Mpy_32_16_1( conceal_eof_gainFB, st_fx->last_concealed_gain_syn_deemph ), st_fx->last_concealed_gain_syn_deemph_e ) ); /*Q30->Q14*/ move16(); } ELSE @@ -1864,42 +1849,19 @@ static Word32 CalculateAbsEnergy_fx( /* o : normalized resul ) { Word16 i; - Word32 L_sum, L_c; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry; - move32(); -#endif - /* Clear carry flag and init sum */ - Carry = 0; - move32(); - L_c = 0; - move32(); - L_sum = L_macNs_co( L_off, 0, 0, &Carry, &Overflow ); - IF( L_sum > 0 ) - { - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); - } - IF( L_sum < 0 ) - { - L_c = L_msuNs_co( L_c, 0, 0, &Carry, &Overflow ); - } + Word32 L_sum; + Word64 L_sum64; + + L_sum64 = W_deposit32_l( L_off ); + FOR( i = 0; i < lg; i += 2 ) { - Carry = 0; - move32(); - BASOP_SATURATE_WARNING_OFF_EVS /*multiplication of -32768 * -32768 throws an overflow, but is not critical*/ - L_sum = L_macNs_co( L_sum, x[i], x[i], &Carry, &Overflow ); - BASOP_SATURATE_WARNING_ON_EVS - Overflow = 0; /* to avoid useless warning in L_macNs calling L_mult */ - move32(); - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); + L_sum64 = W_mac_16_16( L_sum64, x[i], x[i] ); } - L_sum = norm_llQ31( L_c, L_sum, exp ); + L_sum = w_norm_llQ31( L_sum64, exp ); /*Q31 - *exp */ return L_sum; } - void IMDCT_fx( Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_TDAC, Word16 *xn_buf, const Word16 *tcx_aldo_window_1, const PWord16 *tcx_aldo_window_1_trunc, const PWord16 *tcx_aldo_window_2, const PWord16 *tcx_mdct_window_half, const PWord16 *tcx_mdct_window_minimum, const PWord16 *tcx_mdct_window_trans, Word16 tcx_mdct_window_half_length, Word16 tcx_mdct_window_min_length, Word16 index, Word16 left_rect, Word16 tcx_offset, Word16 overlap, Word16 L_frame, Word16 L_frameTCX, Word16 L_spec_TCX5, Word16 L_frame_glob, Word16 frame_cnt, Word16 bfi, Word16 *old_out, Word16 *Q_old_wtda, Decoder_State *st, Word16 fullbandScale, Word16 *acelp_zir ) { const TCX_CONFIG_HANDLE tcx_cfg = st->hTcxCfg; @@ -2575,12 +2537,385 @@ void IMDCT_fx( Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_T } } + +static Word16 IMDCT_ivas_fx_calc_qwin( + Decoder_State *st, + Word16 *syn_Overl_TDAC, + Word16 Q_syn_Overl_TDAC, + Word16 *syn_Overl, + Word16 Q_syn_Overl, + Word16 *old_syn_Overl, + Word16 Q_old_syn_Overl, + Word16 *old_out_fx, + Word16 Q_old_out_fx, + Word16 q_win, + const Word16 FB_flag ) +{ + Word16 t, old_syn_Overl_len, syn_Overl_TDAC_len; + + t = L_FRAME32k; + move16(); + if ( FB_flag ) + { + t = L_FRAME48k; + move16(); + } + + old_syn_Overl_len = st->hTcxCfg->tcx_mdct_window_length; + syn_Overl_TDAC_len = s_max( st->hTcxCfg->tcx_mdct_window_length_old, 0 ); + + IF( ( st->prev_bfi && EQ_16( st->last_core_bfi, ACELP_CORE ) ) || EQ_16( st->last_core, ACELP_CORE ) ) + { + old_syn_Overl_len = shr( st->L_frame, 1 ); + syn_Overl_TDAC_len = shr( st->last_L_frame, 1 ); + } + + IF( st->prev_bfi && ( st->last_core_bfi == ACELP_CORE ) ) + { + syn_Overl_TDAC_len = old_syn_Overl_len; + } + + q_win = 6; + move16(); + + // q_win == norm + Q_syn_Overl_TDAC + q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, syn_Overl_TDAC_len ) + Q_syn_Overl_TDAC ); + + // q_win = s_min( q_win, norm_arr( syn_Overl, oldLength / 2 ) + Q_syn_Overl ); + q_win = s_min( q_win, norm_arr( syn_Overl, old_syn_Overl_len ) + Q_syn_Overl ); + + q_win = s_min( q_win, norm_arr( old_syn_Overl, old_syn_Overl_len ) + Q_old_syn_Overl ); + + // q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); + q_win = s_min( q_win, norm_arr( old_out_fx, t ) + Q_old_out_fx ); + +#if 0 + set16_zero_fx(syn_Overl_TDAC + oldLength / 2, (t-oldLength)/2 ); + //set16_zero_fx(syn_Overl + oldLength / 2, (t-oldLength)/2 ); + set16_zero_fx(old_syn_Overl + oldLength / 2, (t-oldLength)/2 ); + //set16_zero_fx(old_out_fx + oldLength, (t-oldLength) ); +#endif + q_win = s_max( -3, sub( q_win, 2 ) ); + + return q_win; +} + +static void IMDCT_ivas_fx_rescale( + Word16 *xn_buf_fx, + Word16 *q_xn_buf_fx, + Word16 *syn_Overl_TDAC, + Word16 *Q_syn_Overl_TDAC, + Word16 *syn_Overl, + Word16 *Q_syn_Overl, + Word16 *old_syn_Overl, + Word16 *Q_old_syn_Overl, + Word16 *old_out_fx, + Word16 *Q_old_out_fx, + Word16 q_win, + const Word16 FB_flag ) +{ + Word16 oldLength; + + oldLength = L_FRAME32k; + move16(); + if ( FB_flag ) + { + oldLength = L_FRAME48k; + move16(); + } + +#if 1 + IF( xn_buf_fx != NULL ) + { + Scale_sig( xn_buf_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX, sub( q_win, *q_xn_buf_fx ) ); + *q_xn_buf_fx = q_win; + move16(); + } + Scale_sig( syn_Overl_TDAC, oldLength / 2, sub( q_win, *Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win + *Q_syn_Overl_TDAC = q_win; + move16(); + Scale_sig( syn_Overl, oldLength / 2, sub( q_win, *Q_syn_Overl ) ); // st->hTcxDec->Q_syn_Overl -> q_win + *Q_syn_Overl = q_win; + move16(); + if ( FB_flag == 0 ) + { + Scale_sig( old_syn_Overl, oldLength / 2, sub( q_win, *Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win + *Q_old_syn_Overl = q_win; + move16(); + } + Scale_sig( old_out_fx, oldLength, sub( q_win, *Q_old_out_fx ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win + *Q_old_out_fx = q_win; + move16(); +#endif +} + +static Word16 TCX_MDCT_Inverse_GetScaleFactor( + const Word16 L, /* Q0 */ + Word16 *factor_e /* Q0 */ +) +{ + + Word16 factor; + + IF( EQ_16( L, NORM_MDCT_FACTOR ) ) + { + factor = 32767; + move16(); + *factor_e = 0; + move16(); + } + ELSE IF( EQ_16( L, 2 * NORM_MDCT_FACTOR ) ) + { + factor = 23170; + move16(); + *factor_e = 1; + move16(); + } + ELSE IF( EQ_16( L, 4 * NORM_MDCT_FACTOR ) ) + { + factor = 32767; + move16(); + *factor_e = 1; + move16(); + } + ELSE + { + factor = mult_r( shl( L, 4 ), 26214 /*128.f / NORM_MDCT_FACTOR*/ ); /* 4Q11 */ + *factor_e = 4; + move16(); + + factor = Sqrt16( factor, factor_e ); + } + + return factor; +} + +static void TCX_MDCT_Inverse_qwin_fx( + Word32 *x, // Q( 31 - x_e ) + Word16 x_e, + Word16 *y, /* Qy */ + const Word16 l, /* Q0 */ + const Word16 m, /* Q0 */ + const Word16 r, /* Q0 */ + const Word16 element_mode, /* Q0 */ + Word16 *q_win, + Word16 allow_qwin_change ) +{ + + Word16 i, fac, negfac, s; + Word16 L2 = l, R2 = r; + Word32 tmp_buf[N_MAX + L_MDCT_OVLP_MAX / 2]; + Word16 fac_e; + (void) element_mode; + L2 = shr( l, 1 ); + R2 = shr( r, 1 ); + + x_e = sub( 15, x_e ); + edct_fx( x, tmp_buf + L2, add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &x_e ); + x_e = sub( 15, x_e ); + + fac = TCX_MDCT_Inverse_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &fac_e ); /* exp(fac_e) */ + x_e = add( x_e, fac_e ); + + negfac = negate( fac ); + + IF( allow_qwin_change ) + { + // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); + // q_win = L_norm_arr(tmp_buf, , *q_win ) - x_e; + s = L_norm_arr( tmp_buf + L2, m + R2 + L2 ); + *q_win = s_min( sub( s, x_e ), *q_win ); + } + + s = add( x_e, *q_win ); + move16(); + + FOR( i = 0; i < R2; i++ ) + { + y[l + m + R2 + i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); /* fold out right end of DCT exp(fac_e)*/ + + move16(); + } + + FOR( i = 0; i < L2; i++ ) + { + y[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], fac ), s ) ); /* negate, fold out left end of DCT exp(fac_e)*/ + move16(); + } + + FOR( i = 0; i < ( ( L2 + m + R2 ) >> 1 ); i++ ) + { + Word16 f; + + f = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); + y[L2 + i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT exp(fac_e)*/ + move16(); + y[l + m + R2 - 1 - i] = f; + move16(); + } +} + +static void TCX_MDST_Inverse_qwin_fx( + Word32 *x, /* exp(x_e) */ + Word16 x_e, + Word16 *y, /* Qx */ + const Word16 l, /* Q0 */ + const Word16 m, /* Q0 */ + const Word16 r, /* Q0 */ + Word16 *q_win, + Word16 allow_qwin_change ) +{ + + Word16 i, fac, negfac, s; + Word16 L2 = l, R2 = r; + move16(); + move16(); + Word32 tmp_buf[N_MAX + L_MDCT_OVLP_MAX / 2]; + Word16 fac_e; + + L2 = shr( l, 1 ); + R2 = shr( r, 1 ); + + x_e = sub( 15, x_e ); + edst_fx( x, tmp_buf + L2, add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &x_e ); + x_e = sub( 15, x_e ); + + fac = TCX_MDCT_Inverse_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &fac_e ); + x_e = add( x_e, fac_e ); + + negfac = negate( fac ); + + IF( allow_qwin_change ) + { + // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); + // q_win = L_norm_arr(tmp_buf, , *q_win ) - x_e; + s = L_norm_arr( tmp_buf + L2, m + R2 + L2 ); + *q_win = s_min( sub( s, x_e ), *q_win ); + } + + s = add( x_e, *q_win ); + move16(); + + FOR( i = 0; i < R2; i++ ) + { + y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], fac ), s ) ); /* fold out right end of DCT exp(fac_e)*/ + move16(); + } + + FOR( i = 0; i < L2; i++ ) + { + y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], negfac ), s ) ); /* negate, fold out left end of DCT exp(fac_e)*/ + move16(); + } + + FOR( i = 0; i < ( ( L2 + m + R2 ) >> 1 ); i++ ) + { + Word16 f; + f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], fac ), s ) ); + + y[L2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT exp(fac_e)*/ + move16(); + + y[l + m + R2 - 1 - i] = negate( f ); + move16(); + } +} + +/*-------------------------------------------------------------------* + * TCX_MDXT_Inverse_fx() + * + * + *-------------------------------------------------------------------*/ +static void TCX_MDXT_Inverse_qwin_fx( + const Word32 *x, /* exp(x_e) */ + Word16 x_e, + Word16 *y, /* Qx */ + const Word16 l, /* Q0 */ + const Word16 m, /* Q0 */ + const Word16 r, /* Q0 */ + const UWord16 kernel_type, /* Q0 */ + Word16 *q_win, + Word16 allow_qwin_change ) +{ + Word16 signLeft; + Word16 signRight; + Word16 i, fac, negfac, s, fac_e; + const Word16 L2 = shr( l, 1 ), R2 = shr( r, 1 ); + Word32 tmp_buf[N_MAX + L_MDCT_OVLP_MAX / 2]; + Word16 f; + + set32_fx( tmp_buf, 0, N_MAX + L_MDCT_OVLP_MAX / 2 ); + + edxt_fx( x, tmp_buf + L2, add( add( L2, m ), R2 ), kernel_type, TRUE ); + + fac = TCX_MDCT_Inverse_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &fac_e ); + x_e = add( x_e, fac_e ); + + negfac = negate( fac ); + IF( GE_16( kernel_type, MDCT_II ) ) + { + signLeft = negfac; + } + ELSE + { + signLeft = fac; + } + // signRight = ( kernel_type & 1 ? fac : negfac ); + IF( L_and( kernel_type, 1 ) ) + { + signRight = fac; + } + ELSE + { + signRight = negfac; + } + + IF( allow_qwin_change ) + { + // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); + // q_win = L_norm_arr(tmp_buf, , *q_win ) - x_e; + s = L_norm_arr( tmp_buf + L2, m + R2 + L2 ); + *q_win = s_min( sub( s, x_e ), *q_win ); + } + + s = add( x_e, *q_win ); + move16(); + + FOR( i = 0; i < L2; i++ ) + { + y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], signLeft ), s ) ); /* fold out the left end exp(fac_e)*/ + } + + FOR( i = 0; i < R2; i++ ) + { + y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], signRight ), s ) ); /* ...and right end exp(fac_e)*/ + move16(); + } + + FOR( i = 0; i < ( ( L2 + m + R2 ) >> 1 ); i++ ) + { + + f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); + + y[L2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT exp(fac_e)*/ + move16(); + + y[l + m + R2 - 1 - i] = f; + move16(); + } + + return; +} + void IMDCT_ivas_fx( Word32 *x_fx, // Q(q_x) Word16 q_x, - Word16 *old_syn_overl_fx, // Q(-2) - Word16 *syn_Overl_TDAC_fx, // Q(-2) - Word16 *xn_buf_fx, // Q(-2) + Word16 *old_syn_overl_fx, // *Q_old_syn_overl_fx + Word16 *Q_old_syn_overl_fx, + Word16 *syn_Overl_TDAC_fx, // *Q_syn_Overl_TDAC_fx + Word16 *Q_syn_Overl_TDAC_fx, + Word16 *xn_buf_fx, // Q(-2) + Word16 q_xn_buf_fx, const Word16 *tcx_aldo_window_1_fx, // Q(15) const PWord16 *tcx_aldo_window_1_trunc_fx, // Q(15) const PWord16 *tcx_aldo_window_2_fx, // Q(15) @@ -2601,11 +2936,13 @@ void IMDCT_ivas_fx( const Word16 frame_cnt, const Word16 bfi, Word16 *old_out_fx, // Q(-2) + Word16 *q_old_out_fx, const Word16 FB_flag, Decoder_State *st, const Word16 fullbandScale, Word16 *acelp_zir_fx, - Word16 q_win ) // Q(-2) + Word16 *q_acelp_zir_fx, + Word16 *pq_win ) { Word16 i, nz, aldo, w, L_win, L_ola; Word16 win_fx[( L_FRAME_PLUS + L_MDCT_OVLP_MAX ) / 2]; @@ -2614,7 +2951,23 @@ void IMDCT_ivas_fx( Word16 x_e_hdrm; Word32 c; Word16 exp; - x_e_hdrm = add( q_win, sub( Q16, q_x ) ); + Word16 q_win = *pq_win; + Word16 allow_qwin_change = 1; + move16(); + move16(); + x_e_hdrm = sub( Q16, q_x ); +#if 0 + IF( *pq_win == 0 ) + { + allow_qwin_change = 0; + } +#endif + IF( allow_qwin_change ) + { + // q_win = IMDCT_ivas_fx_adjust_qwin( *Q_syn_Overl_TDAC_fx, *Q_old_syn_overl_fx, hTcxDec->Q_old_syn_Overl, *q_old_out_fx, q_win ); + q_win = IMDCT_ivas_fx_calc_qwin( st, syn_Overl_TDAC_fx, *Q_syn_Overl_TDAC_fx, old_syn_overl_fx, *Q_old_syn_overl_fx, + hTcxDec->old_syn_Overl, hTcxDec->Q_old_syn_Overl, old_out_fx, *q_old_out_fx, q_win, FB_flag ); + } aldo = 0; move16(); @@ -2636,10 +2989,11 @@ void IMDCT_ivas_fx( { Word32 fac; // fac = shl_sat( mult_r( extract_h( L_shr_sat( hTcxDec->conceal_eof_gain32, sub( 1, hTcxDec->conceal_eof_gain_e ) ) ), st->last_concealed_gain_syn_deemph ), 1 ); - fac = Mpy_32_16_1( hTcxDec->conceal_eof_gain32, st->last_concealed_gain_syn_deemph ); // q = 31 - hTcxDec->conceal_eof_gain_e + fac = Mpy_32_16_1( hTcxDec->conceal_eof_gain32, st->last_concealed_gain_syn_deemph ); // q = 31 - hTcxDec->conceal_eof_gain_e - last_concealed_gain_syn_deemph_e + Word16 eff_e = add( hTcxDec->conceal_eof_gain_e, st->last_concealed_gain_syn_deemph_e ); FOR( Word16 ind = 0; ind < overlap; ind++ ) { - old_syn_overl_fx[ind] = extract_l( L_shl_sat( Mpy_32_32( old_syn_overl_fx[ind], fac ), hTcxDec->conceal_eof_gain_e ) ); // Q(-2) + old_syn_overl_fx[ind] = extract_h( L_shl_sat( Mpy_32_16_1( fac, old_syn_overl_fx[ind] ), eff_e ) ); // Q(-2) move16(); } } @@ -2682,34 +3036,44 @@ void IMDCT_ivas_fx( } move16(); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE set16_fx( win_fx, 0, ( L_FRAME_PLUS + L_MDCT_OVLP_MAX ) >> 1 ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - set16_fx( win_fx, 0, shr( add( L_FRAME_PLUS, L_MDCT_OVLP_MAX ), 1 ) ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ Word16 tcx_offset_tmp = add( tcx_offset, shr( L_ola, 1 ) ); set16_fx( xn_buf_fx, 0, tcx_offset_tmp ); /* zero left end of buffer */ Word16 L_spec_TCX5_tmp = 0; move16(); + IF( allow_qwin_change ) + { + /* Use fixed q_win to avoid the need to adapt scaling of two TCX5 blocks (less effort with maybe not ideal scaling) */ + q_win = -2; + move16(); + allow_qwin_change = 0; + move16(); + } + FOR( w = 0; w < 2; w++ ) { test(); test(); L_spec_TCX5_tmp = imult1616( w, L_spec_TCX5 ); + // Assume that xn_buf_fx has no headroom. + q_win = s_min( q_xn_buf_fx, q_win ); + IF( EQ_16( kernel_type, MDST_IV ) || s_and( kernel_type, w ) ) { - TCX_MDST_Inverse_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola ); + TCX_MDST_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, &q_win, allow_qwin_change ); } ELSE IF( ( kernel_type != 0 ) && ( w == 0 ) ) /* type 1 or 2 */ { - TCX_MDXT_Inverse_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, kernel_type ); + TCX_MDXT_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, kernel_type, &q_win, allow_qwin_change ); } ELSE { - TCX_MDCT_Inverse( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode ); + TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win, allow_qwin_change ); } + IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + tcx_windowing_synthesis_current_frame( win_fx, tcx_aldo_window_2_fx, tcx_mdct_window_half_fx, tcx_mdct_window_minimum_fx, L_ola, tcx_mdct_window_half_length, tcx_mdct_window_min_length, ( w > 0 ) ? 0 : left_rect, ( w > 0 ) || ( w == 0 && index == 2 ) ? MIN_OVERLAP : hTcxCfg->tcx_last_overlap_mode, acelp_zir_fx, hTcxDec->old_syn_Overl, syn_Overl_TDAC_fx, st->old_Aq_12_8_fx, tcx_mdct_window_trans_fx, L_win, tcx_offset < 0 ? -tcx_offset : 0, ( w > 0 ) || ( frame_cnt > 0 ) ? 1 : st->last_core, ( w > 0 ) || ( frame_cnt > 0 ) ? 0 : (Word8) st->last_is_cng, fullbandScale ); IF( w > 0 ) @@ -2747,34 +3111,57 @@ void IMDCT_ivas_fx( set16_fx( win_fx, 0, shr( add( L_FRAME_PLUS, L_MDCT_OVLP_MAX ), 1 ) ); /* 1st TCX-5 window, special MDCT with minimum overlap on right side */ + Word16 q_win_prev; + +#if 0 + // Assume that xn_buf_fx has no headroom. + q_win = s_min( q_xn_buf_fx, q_win ); +#endif + IF( allow_qwin_change ) + { + /* Use fixed q_win to avoid the need to adapt scaling of two TCX5 blocks (less effort with maybe not ideal scaling) */ + q_win = -2; + move16(); + allow_qwin_change = 0; + move16(); + } + IF( EQ_16( kernel_type, MDST_IV ) ) { - TCX_MDST_Inverse_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola ); + TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, &q_win, allow_qwin_change ); } ELSE IF( NE_16( kernel_type, MDCT_IV ) ) /* type 1 or 2 */ { - TCX_MDXT_Inverse_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, kernel_type ); + TCX_MDXT_Inverse_qwin_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, kernel_type, &q_win, allow_qwin_change ); } ELSE { - TCX_MDCT_Inverse( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, st->element_mode ); + TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, st->element_mode, &q_win, allow_qwin_change ); } + q_win_prev = q_win; set16_fx( xn_buf_fx, 0, shr( overlap, 1 ) ); /* copy new sub-window region not overlapping with previous window */ Copy( win_fx + L_win, xn_buf_fx + shr( overlap, 1 ), add( L_win, shr( L_ola, 1 ) ) ); + q_xn_buf_fx = q_win; + move16(); + /* 2nd TCX-5 window, regular MDCT with minimum overlap on both sides */ IF( s_and( kernel_type, 1 ) ) { - TCX_MDST_Inverse_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola ); + TCX_MDST_Inverse_qwin_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, &q_win, allow_qwin_change ); } ELSE { - TCX_MDCT_Inverse( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode ); + TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win, allow_qwin_change ); } + assert( q_win_prev == q_win ); + + IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + tcx_windowing_synthesis_current_frame( win_fx, tcx_aldo_window_2_fx, tcx_mdct_window_half_fx, tcx_mdct_window_minimum_fx, L_ola, tcx_mdct_window_half_length, tcx_mdct_window_min_length, 0, /* left_rect */ MIN_OVERLAP, /* left_mode */ acelp_zir_fx, hTcxDec->old_syn_Overl, syn_Overl_TDAC_fx, st->old_Aq_12_8_fx, tcx_mdct_window_trans_fx, L_win, ( tcx_offset < 0 ) ? -tcx_offset : 0, 1, /* st->last_mode_bfi */ 0, /* st->last_is_cng */ fullbandScale ); @@ -2808,19 +3195,37 @@ void IMDCT_ivas_fx( ELSE { /* default, i.e. maximum overlap, single transform, no grouping */ + IF( allow_qwin_change && fullbandScale ) + { + q_win = s_min( q_win, norm_arr( acelp_zir_fx, shr( L_frame_glob, 1 ) ) + *q_acelp_zir_fx ); + } + IF( EQ_16( kernel_type, MDST_IV ) ) { - TCX_MDST_Inverse_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap ); + TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, &q_win, allow_qwin_change ); } ELSE IF( NE_16( kernel_type, MDCT_IV ) ) /* type 1 or 2 */ { - TCX_MDXT_Inverse_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, kernel_type ); + TCX_MDXT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, kernel_type, &q_win, allow_qwin_change ); } ELSE { - TCX_MDCT_Inverse( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, st->element_mode ); + TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, st->element_mode, &q_win, allow_qwin_change ); } + // Because xn_buf_fx is overwritten above. + q_xn_buf_fx = q_win; + move16(); + IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + + IF( !fullbandScale ) + { + *q_acelp_zir_fx = q_xn_buf_fx; + } + ELSE + { + scale_sig( acelp_zir_fx, shr( L_frame_glob, 1 ), sub( q_xn_buf_fx, *q_acelp_zir_fx ) ); + } tcx_windowing_synthesis_current_frame( xn_buf_fx, tcx_aldo_window_2_fx, tcx_mdct_window_half_fx, tcx_mdct_window_minimum_fx, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, left_rect, !bfi && ( frame_cnt > 0 ) && ( index == 0 ) && NE_16( st->last_core, ACELP_CORE ) ? MIN_OVERLAP : index, acelp_zir_fx, hTcxDec->old_syn_Overl, syn_Overl_TDAC_fx, st->old_Aq_12_8_fx, tcx_mdct_window_trans_fx, shr( L_frame_glob, 1 ), ( tcx_offset < 0 ) ? -tcx_offset : 0, ( frame_cnt > 0 /*|| (st->last_con_tcx )*/ ) ? 1 : st->last_core_bfi, ( frame_cnt > 0 ) ? 0 : (Word8) st->last_is_cng, fullbandScale ); } /* tcx_last_overlap_mode != FULL_OVERLAP */ @@ -2865,16 +3270,22 @@ void IMDCT_ivas_fx( q_tmp_fx_32 = q_xn_buf_fx_32; move16(); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE + // q_win < norm + q_tmp_fx_32 - 16 + q_win = s_min( q_win, L_norm_arr( tmp_fx_32, L_frame ) + q_tmp_fx_32 - 16 ); + IMDCT_ivas_fx_rescale( NULL, NULL, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + Word16 diff = sub( q_tmp_fx_32, q_win ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + Word16 q_old_out_diff = sub( q_tmp_fx_32, *q_old_out_fx ); + IF( q_old_out_diff < 0 ) + { + Scale_sig( old_out_fx, L_frame, q_old_out_diff ); + *q_old_out_fx = add( *q_old_out_fx, q_old_out_diff ); + q_old_out_diff = 0; + } FOR( Word16 ind = 0; ind < L_frame; ind++ ) { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - old_out_fx_32[ind] = L_shl( old_out_fx[ind], diff ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - old_out_fx_32[ind] = L_shl( old_out_fx[ind], sub( q_tmp_fx_32, q_win ) ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + assert( L_shr( L_shl( old_out_fx[ind], q_old_out_diff ), q_old_out_diff ) == old_out_fx[ind] ); + old_out_fx_32[ind] = L_shl( L_deposit_l( old_out_fx[ind] ), q_old_out_diff ); move32(); } @@ -2882,22 +3293,17 @@ void IMDCT_ivas_fx( FOR( Word16 ind = 0; ind < L_frame; ind++ ) { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], diff ) ); + assert( extract_h( L_shr( old_out_fx_32[ind], q_old_out_diff ) ) == 0 || extract_h( L_shr( old_out_fx_32[ind], q_old_out_diff ) ) == -1 ); + old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], q_old_out_diff ) ); + assert( extract_h( L_shr( xn_buf_fx_32[ind], diff ) ) == 0 || extract_h( L_shr( xn_buf_fx_32[ind], diff ) ) == -1 ); xn_buf_fx[ind] = extract_l( L_shr( xn_buf_fx_32[ind], diff ) ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - old_out_fx[ind] = (Word16) L_shr( old_out_fx_32[ind], sub( q_tmp_fx_32, q_win ) ); - xn_buf_fx[ind] = (Word16) L_shr( xn_buf_fx_32[ind], sub( q_tmp_fx_32, q_win ) ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ move16(); move16(); } } ELSE { - Word16 q_old_out = q_win; - move16(); - edct_fx( x_fx, xn_buf_fx_32 + add( shr( overlap, 1 ), nz ), L_frame, &q_xn_buf_fx_32 ); + edct_ivas_fx( x_fx, xn_buf_fx_32 + add( shr( overlap, 1 ), nz ), L_frame, &q_xn_buf_fx_32 ); Word16 res_m, res_e; res_e = 0; move16(); @@ -2910,41 +3316,38 @@ void IMDCT_ivas_fx( move32(); } q_tmp_fx_32 = sub( q_xn_buf_fx_32, res_e ); - // v_multc_fixed( xn_buf_fx_32 + overlap / 2 + nz, (float) sqrt( (float) L_frame / NORM_MDCT_FACTOR ), tmp_fx_32, L_frame ); + // v_multc_fx( xn_buf_fx_32 + overlap / 2 + nz, (float) sqrt( (float) L_frame / NORM_MDCT_FACTOR ), tmp_fx_32, L_frame ); + + if ( allow_qwin_change ) + { + // sub( q_xn_buf_fx_32, q_win ) == 16 - L_norm_arr( xn_buf_fx_32, L_frame ) + // q_xn_buf_fx_32 - q_win == 16 - L_norm_arr( xn_buf_fx_32, L_frame ) + // q_win == - 16 + L_norm_arr( xn_buf_fx_32, L_frame ) + q_xn_buf_fx_32 + q_win = s_min( q_win, add( sub( q_xn_buf_fx_32, 16 ), sub( L_norm_arr( xn_buf_fx_32 + ( overlap / 2 ) + nz, L_frame ), 2 ) ) ); + } + IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE Word16 q_diff = sub( q_xn_buf_fx_32, q_win ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ FOR( Word16 ind = 0; ind < L_frame; ind++ ) { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE + assert( extract_h( L_shr( xn_buf_fx_32[( ind + ( overlap / 2 ) ) + nz], q_diff ) ) == 0 || extract_h( L_shr( xn_buf_fx_32[( ind + ( overlap / 2 ) ) + nz], q_diff ) ) == -1 ); xn_buf_fx[( ind + ( overlap / 2 ) ) + nz] = extract_l( L_shr( xn_buf_fx_32[( ind + ( overlap / 2 ) ) + nz], q_diff ) ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - xn_buf_fx[( ind + ( overlap / 2 ) ) + nz] = (Word16) L_shr( xn_buf_fx_32[( ind + ( overlap / 2 ) ) + nz], sub( q_xn_buf_fx_32, q_win ) ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ move16(); } - window_ola_fx( tmp_fx_32, xn_buf_fx, &q_tmp_fx_32, old_out_fx, &q_old_out, L_frame, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL ); - -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - q_diff = sub( q_old_out, q_win ); - + window_ola_fx( tmp_fx_32, xn_buf_fx, &q_tmp_fx_32, old_out_fx, q_old_out_fx, L_frame, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL ); + if ( allow_qwin_change ) + { + // sub( q_tmp_fx_32, q_win ) == -norm_arr( xn_buf_fx, L_frame ) + // q_tmp_fx_32 - q_win == -norm_arr( xn_buf_fx, L_frame ) + // q_win == q_tmp_fx_32 + norm_arr( xn_buf_fx, L_frame ) + q_win = s_min( q_win, add( q_tmp_fx_32, norm_arr( xn_buf_fx, L_frame ) ) ); + } Word16 diff = sub( q_tmp_fx_32, q_win ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ FOR( Word16 ind = 0; ind < L_frame; ind++ ) { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - old_out_fx[ind] = shr_sat( old_out_fx[ind], q_diff ); - move16(); xn_buf_fx[ind] = shr_sat( xn_buf_fx[ind], diff ); move16(); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - old_out_fx[ind] = shr_sat( old_out_fx[ind], sub( q_old_out, q_win ) ); - move16(); - xn_buf_fx[ind] = shr_sat( xn_buf_fx[ind], sub( q_tmp_fx_32, q_win ) ); - move16(); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ } } aldo = 1; @@ -2965,19 +3368,38 @@ void IMDCT_ivas_fx( move16(); } + IF( allow_qwin_change && fullbandScale ) + { + q_win = s_min( q_win, norm_arr( acelp_zir_fx, shr( L_frame_glob, 1 ) ) + *q_acelp_zir_fx ); + } + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && ( LE_32( st->last_core_brate, SID_2k40 ) || st->last_core == ACELP_CORE ) && ( fullbandScale == 0 ) ) + { + /* Increase headroom because if the ACELP ZIR is used below, the synthesis filter gain is unknown. */ + IF( allow_qwin_change ) + { + allow_qwin_change = 0; + move16(); + q_win = s_max( -2, sub( q_win, 1 ) ); + } + } + IF( EQ_16( kernel_type, MDST_IV ) ) { - TCX_MDST_Inverse_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap ); + TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, &q_win, allow_qwin_change ); } ELSE IF( NE_16( kernel_type, MDCT_IV ) ) /* type 1 or 2 */ { - TCX_MDXT_Inverse_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, kernel_type ); + TCX_MDXT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, kernel_type, &q_win, allow_qwin_change ); } ELSE { - TCX_MDCT_Inverse( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, st->element_mode ); + TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, st->element_mode, &q_win, allow_qwin_change ); } + // Because xn_buf_fx is overwritten above. + q_xn_buf_fx = q_win; + move16(); + IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); /*-----------------------------------------------------------* * Windowing, overlap and add * *-----------------------------------------------------------*/ @@ -3009,7 +3431,14 @@ void IMDCT_ivas_fx( move16(); } } - + IF( !fullbandScale ) + { + *q_acelp_zir_fx = q_xn_buf_fx; + } + ELSE + { + scale_sig( acelp_zir_fx, shr( L_frame_glob, 1 ), sub( q_xn_buf_fx, *q_acelp_zir_fx ) ); + } /* Window current frame */ tcx_windowing_synthesis_current_frame( xn_buf_fx, tcx_aldo_window_2_fx, tcx_mdct_window_half_fx, tcx_mdct_window_minimum_fx, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, left_rect, hTcxCfg->tcx_last_overlap_mode, acelp_zir_fx, hTcxDec->old_syn_Overl, syn_Overl_TDAC_fx, st->old_Aq_12_8_fx, tcx_mdct_window_trans_fx, shr( L_frame_glob, 1 ), acelp_mem_len, st->last_core_bfi, (Word8) st->last_is_cng, fullbandScale ); } @@ -3049,17 +3478,17 @@ void IMDCT_ivas_fx( // tested FOR( ; i < overlap; i++ ) /* perfectly reconstructing ALDO shortening */ { - xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], old_out_fx[( i + nz )] ); // Q(-2) + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], old_out_fx[( i + nz )] ); // q_win move16(); } FOR( i = 0; i < ( tcx_mdct_window_min_length / 2 ); i++ ) { - xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( old_out_fx[( ( i + nz ) + overlap )], tcx_mdct_window_minimum_fx[i].v.re ) ); // Q(-2) + xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( old_out_fx[( ( i + nz ) + overlap )], tcx_mdct_window_minimum_fx[i].v.re ) ); // q_win move16(); } FOR( ; i < tcx_mdct_window_min_length; i++ ) { - xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( old_out_fx[( ( i + nz ) + overlap )], tcx_mdct_window_minimum_fx[( tcx_mdct_window_min_length - ( 1 + i ) )].v.im ) ); // Q(-2) + xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( old_out_fx[( ( i + nz ) + overlap )], tcx_mdct_window_minimum_fx[( tcx_mdct_window_min_length - ( 1 + i ) )].v.im ) ); // q_win move16(); } } @@ -3121,7 +3550,7 @@ void IMDCT_ivas_fx( /* Compute windowed synthesis in case of switching to ALDO windows in next frame */ Copy( xn_buf_fx + sub( L_frame, nz ), old_out_fx, add( nz, overlap ) ); set16_fx( old_out_fx + add( nz, overlap ), 0, nz ); - + *q_old_out_fx = q_win; tcx_windowing_synthesis_past_frame( old_out_fx + nz, tcx_aldo_window_1_trunc_fx, tcx_mdct_window_half_fx, tcx_mdct_window_minimum_fx, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, hTcxCfg->tcx_curr_overlap_mode ); /* If current overlap mode = FULL_OVERLAP -> ALDO_WINDOW */ @@ -3158,45 +3587,44 @@ void IMDCT_ivas_fx( test(); test(); test(); - IF( ( left_rect != 0 ) && ( frame_cnt == 0 ) && st->last_core_bfi == ACELP_CORE && ( st->prev_bfi != 0 ) ) + IF( ( left_rect != 0 ) && ( frame_cnt == 0 ) && st->last_core_bfi == ACELP_CORE && ( st->prev_bfi != 0 ) ){ + IF( FB_flag != 0 ){ + FOR( i = 0; i < ( tcx_mdct_window_half_length / 2 ); i++ ){ + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = mult_r( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tcx_mdct_window_half_fx[i].v.im ); // Q(-2) + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( mult_r( hTcxDec->syn_OverlFB[i], tcx_mdct_window_half_fx[i].v.re ), tcx_mdct_window_half_fx[i].v.re ) ); // Q(-2) + move16(); + move16(); +} +FOR( ; i < tcx_mdct_window_half_length; i++ ) +{ + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = mult_r( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tcx_mdct_window_half_fx[( tcx_mdct_window_half_length - ( 1 + i ) )].v.re ); // Q(-2) + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( mult_r( hTcxDec->syn_OverlFB[i], tcx_mdct_window_half_fx[( tcx_mdct_window_half_length - ( 1 + i ) )].v.im ), tcx_mdct_window_half_fx[( tcx_mdct_window_half_length - ( 1 + i ) )].v.im ) ); // Q(-2) + move16(); + move16(); +} +} +ELSE +{ + FOR( i = 0; i < ( tcx_mdct_window_half_length / 2 ); i++ ) { - IF( FB_flag != 0 ) - { - FOR( i = 0; i < ( tcx_mdct_window_half_length / 2 ); i++ ) - { - xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = mult_r( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tcx_mdct_window_half_fx[i].v.im ); // Q(-2) - xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( mult_r( hTcxDec->syn_OverlFB[i], tcx_mdct_window_half_fx[i].v.re ), tcx_mdct_window_half_fx[i].v.re ) ); // Q(-2) - move16(); - move16(); - } - FOR( ; i < tcx_mdct_window_half_length; i++ ) - { - xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = mult_r( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tcx_mdct_window_half_fx[( tcx_mdct_window_half_length - ( 1 + i ) )].v.re ); // Q(-2) - xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( mult_r( hTcxDec->syn_OverlFB[i], tcx_mdct_window_half_fx[( tcx_mdct_window_half_length - ( 1 + i ) )].v.im ), tcx_mdct_window_half_fx[( tcx_mdct_window_half_length - ( 1 + i ) )].v.im ) ); // Q(-2) - move16(); - move16(); - } - } - ELSE - { - FOR( i = 0; i < ( tcx_mdct_window_half_length / 2 ); i++ ) - { - xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = mult_r( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tcx_mdct_window_half_fx[i].v.im ); - xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( mult_r( hTcxDec->syn_Overl[i], tcx_mdct_window_half_fx[i].v.re ), tcx_mdct_window_half_fx[i].v.re ) ); // Q(-2) - move16(); - move16(); - } - FOR( ; i < tcx_mdct_window_half_length; i++ ) - { - xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = mult_r( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tcx_mdct_window_half_fx[( tcx_mdct_window_half_length - ( 1 + i ) )].v.re ); - xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( mult_r( hTcxDec->syn_Overl[i], tcx_mdct_window_half_fx[( tcx_mdct_window_half_length - ( 1 + i ) )].v.im ), tcx_mdct_window_half_fx[( tcx_mdct_window_half_length - ( 1 + i ) )].v.im ) ); // Q(-2) - move16(); - move16(); - } - } + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = mult_r( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tcx_mdct_window_half_fx[i].v.im ); + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( mult_r( hTcxDec->syn_Overl[i], tcx_mdct_window_half_fx[i].v.re ), tcx_mdct_window_half_fx[i].v.re ) ); // Q(-2) + move16(); + move16(); + } + FOR( ; i < tcx_mdct_window_half_length; i++ ) + { + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = mult_r( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tcx_mdct_window_half_fx[( tcx_mdct_window_half_length - ( 1 + i ) )].v.re ); + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( mult_r( hTcxDec->syn_Overl[i], tcx_mdct_window_half_fx[( tcx_mdct_window_half_length - ( 1 + i ) )].v.im ), tcx_mdct_window_half_fx[( tcx_mdct_window_half_length - ( 1 + i ) )].v.im ) ); // Q(-2) + move16(); + move16(); } +} +} +*pq_win = q_win; +move16(); - return; +return; } void init_tcx_info_fx( @@ -3540,10 +3968,11 @@ void decoder_tcx_IGF_stereo_fx( void decoder_tcx_ivas_fx( Decoder_State *st, Word16 prm[], - Word16 A_fx[], // Q: 14 - norm_s(A_fx[0]) - Word16 Aind[], // Q: 14 - norm_s(Aind[0]) - Word16 synth_fx[], // Q_syn - Word16 synthFB_fx[], // Q_syn + Word16 A_fx[], // Q: 14 - norm_s(A_fx[0]) + Word16 Aind[], // Q: 14 - norm_s(Aind[0]) + Word16 synth_fx[], + Word16 synthFB_fx[], + Word16 *synth_q, const Word16 bfi, const Word16 frame_cnt, const Word16 sba_dirac_stereo_flag ) @@ -3625,38 +4054,31 @@ void decoder_tcx_ivas_fx( move16(); } - /* Scaling down buffers for decoder_tcx_imdct_fx*/ - Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // Scaling to Q_syn - st->hTcxDec->Q_syn_Overl_TDACFB = st->Q_syn; - move16(); - Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl_TDAC ) ); // Scaling to Q_syn - st->hTcxDec->Q_syn_Overl_TDAC = st->Q_syn; - move16(); - Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, negate( st->hHQ_core->Q_old_wtda ) ); // Scaling to Q_syn - Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, negate( st->hHQ_core->Q_old_wtda_LB ) ); // Scaling to Q_syn - st->hHQ_core->Q_old_wtda = 0; + Copy_Scale_sig_16_32_no_sat( st->old_Aq_12_8_fx, st->old_Aq_12_8_fx_32, M + 1, ( sub( 28, ( sub( 15, norm_s( sub( st->old_Aq_12_8_fx[0], 1 ) ) ) ) ) ) ); + + Word16 q_win, q_winFB; + + q_win = st->Q_syn; move16(); - st->hHQ_core->Q_old_wtda_LB = 0; + q_winFB = st->Q_syn; move16(); - Scale_sig( st->hTcxDec->old_syn_Overl, 320, st->Q_syn - st->hTcxDec->Q_old_syn_Overl ); // Scaling to Q_syn - st->hTcxDec->Q_old_syn_Overl = st->Q_syn; - Copy_Scale_sig_16_32_no_sat( st->old_Aq_12_8_fx, st->old_Aq_12_8_fx_32, M + 1, ( sub( 28, ( sub( 15, norm_s( sub( st->old_Aq_12_8_fx[0], 1 ) ) ) ) ) ) ); - - Scale_sig( synth_fx, L_frame_glob, st->Q_syn ); // Scaling to Q_syn - Scale_sig( synthFB_fx, L_frameTCX_glob, st->Q_syn ); // Scaling to Q_syn + Scale_sig( synth_fx, L_frame_glob, sub( q_win, st->Q_syn ) ); // Scaling to Q_syn + Scale_sig( synthFB_fx, L_frameTCX_glob, sub( q_winFB, st->Q_syn ) ); // Scaling to Q_syn - decoder_tcx_imdct_fx( st, L_frame_glob, L_frameTCX_glob, L_spec, tcx_offset, tcx_offsetFB, L_frame, L_frameTCX, left_rect, &x_fx[0], q_x, xn_buf_fx, st->Q_syn, MDCT_IV, + decoder_tcx_imdct_fx( st, L_frame_glob, L_frameTCX_glob, L_spec, tcx_offset, tcx_offsetFB, L_frame, L_frameTCX, left_rect, &x_fx[0], q_x, xn_buf_fx, &q_win, &q_winFB, MDCT_IV, fUseTns, &synth_fx[0], &synthFB_fx[0], bfi, frame_cnt, sba_dirac_stereo_flag ); /* Scaling up again */ - Scale_sig( synth_fx, L_frame_glob, negate( st->Q_syn ) ); - Scale_sig( synthFB_fx, L_frameTCX_glob, negate( st->Q_syn ) ); + Word16 q_min = s_min( add( q_win, getScaleFactor16( synth_fx, L_frame_glob ) ), + add( q_winFB, getScaleFactor16( synthFB_fx, L_frameTCX_glob ) ) ); + q_min = s_min( q_min, st->Q_syn ); + Scale_sig( synth_fx, L_frame_glob, sub( q_min, q_win ) ); + Scale_sig( synthFB_fx, L_frameTCX_glob, sub( q_min, q_winFB ) ); + *synth_q = q_min; + // Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, 1 ); - st->hHQ_core->Q_old_wtda = st->Q_syn; - // Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, ( sub( st->hHQ_core->Q_old_wtda, st->Q_syn ) ) ); - st->hHQ_core->Q_old_wtda_LB = st->Q_syn; - // Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, ( sub( st->hHQ_core->Q_old_wtda, st->Q_syn ) ) ); + Scale_sig( st->hTcxDec->old_syn_Overl, 320, ( -2 - st->hTcxDec->Q_old_syn_Overl ) ); // Scaling to Q-2 st->hTcxDec->Q_old_syn_Overl = -2; } @@ -3668,7 +4090,7 @@ void decoder_tcx_ivas_fx( *-------------------------------------------------------------------*/ void decoder_tcx_invQ_fx( Decoder_State *st, /* i/o: coder memory state */ - int16_t prm[], /* i : parameters */ + Word16 prm[], /* i : parameters */ Word16 A[], /* i : coefficients NxAz[M+1] */ Word16 Aind[], /* i : frame-independent coefficients Az[M+1] */ const Word16 L_spec, @@ -3716,14 +4138,14 @@ void decoder_tcx_invQ_fx( move16(); move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif tnsSize = 0; move16(); - prm_target = NULL; /* just to suppress MSVC warnigs */ + /* just to suppress MSVC warnigs */ + prm_target = NULL; + prm_ltp = NULL; + prm_tns = NULL; + prm_sqQ = NULL; /*-----------------------------------------------------------------* * Initializations @@ -3747,8 +4169,6 @@ void decoder_tcx_invQ_fx( move16(); } - prm_ltp = &prm[1 + NOISE_FILL_RANGES]; - prm_tns = prm_ltp + LTPSIZE; gainCompensate = ONE_IN_Q14; move16(); @@ -3764,6 +4184,8 @@ void decoder_tcx_invQ_fx( IF( !bfi ) { + prm_ltp = &prm[1 + NOISE_FILL_RANGES]; + prm_tns = prm_ltp + LTPSIZE; index = prm[0]; move16(); @@ -3785,9 +4207,6 @@ void decoder_tcx_invQ_fx( move16(); } - prm_hm = prm_tns + tnsSize; - prm_sqQ = prm_hm + NPRM_CTX_HM; - *prm_sqQ1 = prm_sqQ; /*-----------------------------------------------------------* * Spectrum data * @@ -3795,6 +4214,9 @@ void decoder_tcx_invQ_fx( IF( !bfi ) { + prm_hm = prm_tns + tnsSize; + prm_sqQ = prm_hm + NPRM_CTX_HM; + *prm_sqQ1 = prm_sqQ; /*-----------------------------------------------------------* * Context HM * *-----------------------------------------------------------*/ @@ -3839,7 +4261,7 @@ void decoder_tcx_invQ_fx( FOR( i = 0; i < noiseFillingSize; ++i ) { tmp32 = L_shr( x[i], sub( 31, *x_e ) ); - *nf_seed = add_o( *nf_seed, extract_l( L_shl( i_mult( (Word16) L_abs( tmp32 ), i ), 1 ) ), &Overflow ); // abs( tmp32 ) * i * 2 + *nf_seed = add_sat( *nf_seed, extract_l( L_shl( i_mult( (Word16) L_abs( tmp32 ), i ), 1 ) ) ); // abs( tmp32 ) * i * 2 move16(); } } @@ -4079,7 +4501,7 @@ void decoder_tcx_invQ_fx( st->last_gain_syn_deemph_e = add( st->last_gain_syn_deemph_e, 10 /*scaling of h1[0] and E_UTIL_synthesis * 2*/ ); move16(); tmp32 = Sqrt32( tmp32, &st->last_gain_syn_deemph_e ); - st->last_gain_syn_deemph = round_fx_o( tmp32, &Overflow ); // Q15 + st->last_gain_syn_deemph = round_fx_sat( tmp32 ); // Q15 move16(); } @@ -4290,12 +4712,10 @@ void decoder_tcx_noisefilling_fx( Word32 total_brate; Word32 tmp32; Word16 *pInfoTCXNoise; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); Flag Carry = 0; move32(); -#endif total_brate = ( (Word16) EQ_16( st->element_mode, IVAS_CPE_MDCT ) ? st->element_brate : st->total_brate ); move32(); /*-----------------------------------------------------------------* @@ -4303,7 +4723,7 @@ void decoder_tcx_noisefilling_fx( *-----------------------------------------------------------------*/ /* Init lengths */ - infoIGFStartLine = get_igf_startline( st, L_frame, L_frameTCX ); + infoIGFStartLine = get_igf_startline_fx( st, L_frame, L_frameTCX ); noiseFillingSize = L_spec; move16(); @@ -4441,11 +4861,7 @@ void decoder_tcx_noisefilling_fx( /* get the starting location of the subframe in the frame */ IF( EQ_16( st->core, TCX_10_CORE ) ) { -#ifdef NONBE_FIX_1402_WAVEADJUST st->hPlcInfo->subframe_fx = extract_l( L_mult0( frame_cnt, L_frameTCX_glob ) ); -#else - st->hPlcInfo->subframe = extract_l( L_mult0( frame_cnt, L_frameTCX_glob ) ); -#endif move16(); } } @@ -4750,9 +5166,10 @@ void decoder_tcx_noiseshaping_igf_fx( { /* If the exponent on the spec side (i>L_frame) is lesser, then shift all the values in the spec side by the difference to make both sides have the same exponent. */ + Word16 diff_e = sub( frame_side_x_e, spec_side_x_e ); FOR( i = L_frame; i < L_spec; i++ ) { - x_fx[i] = L_shr( x_fx[i], sub( frame_side_x_e, spec_side_x_e ) ); + x_fx[i] = L_shr( x_fx[i], diff_e ); move32(); } } @@ -4760,9 +5177,10 @@ void decoder_tcx_noiseshaping_igf_fx( { /* If the exponent on the spec side (i>L_frame) is greater, then shift all the values in the frame side (itonal_mdct_plc_active && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - Word16 tmp_x_fx_exp[L_FRAME48k], temp; - temp = -MAX_16; - move16(); - - set16_fx( tmp_x_fx_exp, *x_e, L_frameTCX ); - TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx, tmp_x_fx_exp, st->hTcxCfg->psychParamsCurrent ); + TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx, *x_e, st->hTcxCfg->psychParamsCurrent ); /* If exponent has been updated after TonalMDCTConceal_Apply, then shift the spectrum to common exponent. */ - FOR( i = 0; i < L_frameTCX; i++ ) - { - temp = s_max( temp, tmp_x_fx_exp[i] ); - } - - { - *x_e = temp; - move16(); - FOR( i = 0; i < L_frameTCX; i++ ) - { - x_fx[i] = L_shr( x_fx[i], sub( temp, tmp_x_fx_exp[i] ) ); - move32(); - } - } } test(); @@ -4942,7 +5341,8 @@ void decoder_tcx_tns_fx( test(); test(); test(); - IF( ( NE_16( hTcxCfg->fIsTNSAllowed, 0 ) && NE_16( fUseTns, 0 ) && NE_16( bfi, 1 ) ) || GT_16( L_spec, L_frameTCX ) ) + test(); + IF( ( NE_16( hTcxCfg->fIsTNSAllowed, 0 ) && NE_16( fUseTns, 0 ) && NE_16( bfi, 1 ) && whitenedDomain ) || GT_16( L_spec, L_frameTCX ) ) { L = L_spec; move16(); @@ -4996,7 +5396,8 @@ void decoder_tcx_tns_fx( IF( EQ_16( L_frame, shr( st->L_frame, 1 ) ) && st->tcxonly != 0 && isTCX5 != 0 ) { test(); - IF( st->element_mode == EVS_MONO || LT_16( L_spec, L_frameTCX ) ) /* todo: this is temporary to maintain EVS BE, this is a bug and should be fixed also for EVS (see issue 13) */ + test(); + IF( st->element_mode == EVS_MONO || ( LT_16( L_spec, L_frameTCX ) && !whitenedDomain ) ) /* todo: this is temporary to maintain EVS BE, this is a bug and should be fixed also for EVS (see issue 13) */ { tcx5TnsUngrouping_fx( shr( L_frameTCX, 1 ), shr( hTcxCfg->tnsConfig[0][0].iFilterBorders[0], 1 ), x_fx, DEC ); tmp = L_frameTCX; @@ -5049,7 +5450,8 @@ void decoder_tcx_imdct_fx( Word32 x_fx[N_MAX], // Q(11) Word16 q_x, Word16 xn_buf_fx[], // Q(-2) - Word16 q_win, + Word16 *q_win, + Word16 *q_winFB, const UWord16 kernelType, /* i : TCX transform kernel type */ const Word16 fUseTns, /* i : flag that is set if TNS data is present */ Word16 synth_fx[], // Q(-2) /* i/o: synth[-M..L_frame] */ @@ -5075,7 +5477,8 @@ void decoder_tcx_imdct_fx( Word16 q_a_itf = 15; Word16 x_e = sub( 31, q_x ); move16(); - Word16 shift_q = sub( q_x, q_win ); + Word16 q_acelp_zir_fx = 0; + set16_fx( acelp_zir_fx, 0, L_FRAME_MAX / 2 ); /*-----------------------------------------------------------------* * Initializations @@ -5174,7 +5577,7 @@ void decoder_tcx_imdct_fx( } } - ITF_Detect_fx( x_fx + IGF_START_MN, startLine, endLine, 8 /*maxOrder*/, A_itf_fx, &q_a_itf, &predictionGain_fx, &curr_order, shl( x_e, 1 ) ); + ITF_Detect_ivas_fx( x_fx + IGF_START_MN, startLine, endLine, 8 /*maxOrder*/, A_itf_fx, &q_a_itf, &predictionGain_fx, &curr_order, q_x ); ITF_Apply_fx( x_fx, startLine, endLine, A_itf_fx, q_a_itf, curr_order ); @@ -5228,9 +5631,9 @@ void decoder_tcx_imdct_fx( IF( NE_16( st->element_mode, IVAS_CPE_DFT ) && !sba_dirac_stereo_flag ) { - IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, + IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, &hTcxDec->Q_syn_Overl, hTcxDec->syn_Overl_TDAC, &hTcxDec->Q_syn_Overl_TDAC, xn_buf_fx, *q_win, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, - kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); + kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->Q_old_wtda_LB, 0, st, 0, acelp_zir_fx, &q_acelp_zir_fx, q_win ); } /* Generate additional comfort noise to mask potential coding artefacts */ @@ -5250,14 +5653,20 @@ void decoder_tcx_imdct_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) || ( sba_dirac_stereo_flag != 0 ) ) { Copy32( x_fx, xn_bufFB_fx, s_max( L_spec, s_max( L_frame, L_frameTCX ) ) ); // q_x - - IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, - kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); + IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, &hTcxDec->Q_syn_Overl, hTcxDec->syn_Overl_TDAC, &hTcxDec->Q_syn_Overl_TDAC, xn_buf_fx, *q_win, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, + kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->Q_old_wtda_LB, 0, st, 0, acelp_zir_fx, &q_acelp_zir_fx, q_win ); } + Word16 shift_q, q_x16; + + shift_q = L_norm_arr( xn_bufFB_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX ); + shift_q = sub( 16, shift_q ); + q_x16 = sub( q_x, shift_q ); + FOR( Word16 ind = 0; ind < L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX; ind++ ) { - xn_bufFB_fx_16[ind] = extract_l( L_shr( xn_bufFB_fx[ind], shift_q ) ); // q_x + assert( extract_h( L_shr( xn_bufFB_fx[ind], shift_q ) ) == 0 || extract_h( L_shr( xn_bufFB_fx[ind], shift_q ) ) == -1 ); + xn_bufFB_fx_16[ind] = extract_l( L_shr( xn_bufFB_fx[ind], shift_q ) ); // q_x16 move16(); } @@ -5267,19 +5676,22 @@ void decoder_tcx_imdct_fx( IF( st->element_mode != EVS_MONO ) { - IMDCT_ivas_fx( x_tmp_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, + IMDCT_ivas_fx( x_tmp_fx, q_x, hTcxDec->syn_OverlFB, &hTcxDec->Q_syn_OverlFB, hTcxDec->syn_Overl_TDACFB, &hTcxDec->Q_syn_Overl_TDACFB, xn_bufFB_fx_16, q_x16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, - kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); + kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, &q_acelp_zir_fx, q_winFB ); } ELSE { - - IMDCT_ivas_fx( x_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, - kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); + IMDCT_ivas_fx( x_fx, q_x, hTcxDec->syn_OverlFB, &hTcxDec->Q_syn_OverlFB, hTcxDec->syn_Overl_TDACFB, &hTcxDec->Q_syn_Overl_TDACFB, xn_bufFB_fx_16, q_x16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, + kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, &q_acelp_zir_fx, q_winFB ); } + + shift_q = 16; + move16(); + FOR( Word16 ind = 0; ind < L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX; ind++ ) { - xn_bufFB_fx[ind] = L_shl( L_deposit_l( xn_bufFB_fx_16[ind] ), shift_q ); // Q_x + xn_bufFB_fx[ind] = L_shl( L_deposit_l( xn_bufFB_fx_16[ind] ), shift_q ); // q_winFB } IF( ( bfi == 0 ) ) @@ -5321,18 +5733,21 @@ void decoder_tcx_imdct_fx( /* Update old_syn_overl */ IF( hTcxCfg->last_aldo == 0 ) { - Copy( xn_buf_fx + L_frame, hTcxDec->syn_Overl, overlap ); // Q(-2) + Copy( xn_buf_fx + L_frame, hTcxDec->syn_Overl, overlap ); // q_win FOR( Word16 ind = 0; ind < overlapFB; ind++ ) { - hTcxDec->syn_OverlFB[ind] = extract_l( L_shr( xn_bufFB_fx[( ind + L_frameTCX )], shift_q ) ); // q_x + assert( extract_h( L_shr( xn_bufFB_fx[( ind + L_frameTCX )], shift_q ) ) == 0 || extract_h( L_shr( xn_bufFB_fx[( ind + L_frameTCX )], shift_q ) ) == -1 ); + hTcxDec->syn_OverlFB[ind] = extract_l( L_shr( xn_bufFB_fx[( ind + L_frameTCX )], shift_q ) ); // q_winFB } } /* Output */ - Copy( xn_buf_fx + sub( shr( overlap, 1 ), tcx_offset ), synth_fx, L_frame_glob ); // Q(-2) + Copy( xn_buf_fx + sub( shr( overlap, 1 ), tcx_offset ), synth_fx, L_frame_glob ); // q_win FOR( Word16 ind = 0; ind < L_frameTCX_glob; ind++ ) { - synthFB_fx[ind] = extract_l( L_shr( xn_bufFB_fx[( ind + ( ( overlapFB >> 1 ) - tcx_offsetFB ) )], shift_q ) ); // q_x + assert( extract_h( L_shr( xn_bufFB_fx[( ind + ( ( overlapFB >> 1 ) - tcx_offsetFB ) )], shift_q ) ) == 0 || + extract_h( L_shr( xn_bufFB_fx[( ind + ( ( overlapFB >> 1 ) - tcx_offsetFB ) )], shift_q ) ) == -1 ); + synthFB_fx[ind] = extract_l( L_shr( xn_bufFB_fx[( ind + ( ( overlapFB >> 1 ) - tcx_offsetFB ) )], shift_q ) ); // q_winFB } diff --git a/lib_dec/dec_tran_fx.c b/lib_dec/dec_tran_fx.c index e886fd33770a60b034c992b92348e9fdc33bb9e6..b00b445d791133d719b9027e7956584ccc86388f 100644 --- a/lib_dec/dec_tran_fx.c +++ b/lib_dec/dec_tran_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -12,29 +12,27 @@ #define Q16_30 ( 30 << Q16 ) /*======================================================================*/ -/* FUNCTION : decod_tran_fx() */ +/* FUNCTION : decod_tran_fx() */ /*----------------------------------------------------------------------*/ -/* PURPOSE : Decode transition (TC) frames */ -/* */ +/* PURPOSE : Decode transition (TC) frames */ +/* */ /*----------------------------------------------------------------------*/ -/* GLOBAL INPUT ARGUMENTS : */ -/* _ (Struct) st_fx : decoder static memory */ -/* _ (Word16) L_frame_fx : length of the frame Q0 */ -/* _ (Word16[]) Aq_fx : LP filter coefficient Q12 */ -/* _ (Word16) coder_type : coding type Q12 */ -/* _ (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ -/* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ -/* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ +/* GLOBAL INPUT ARGUMENTS : */ +/* _ (Struct) st_fx : decoder static memory */ +/* _ (Word16) L_frame_fx : length of the frame Q0 */ +/* _ (Word16[]) Aq_fx : LP filter coefficient Q12 */ +/* _ (Word16) coder_type : coding type Q12 */ +/* _ (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ +/* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ +/* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ /*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ +/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ /*-----------------------------------------------------------------------*/ - - /*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*=======================================================================*/ void decod_tran_fx( @@ -71,12 +69,12 @@ void decod_tran_fx( Word16 gain_code16; Word32 L_tmp; Word16 tmp16, tmp1_fx, tmp_fx; + Word16 Q_code_preQ; GSC_DEC_HANDLE hGSCDec; hGSCDec = st_fx->hGSCDec; MUSIC_POSTFILT_HANDLE hMusicPF; hMusicPF = st_fx->hMusicPF; - gain_code_fx = 0; /* Quantized algebraic codeebook gain */ move32(); norm_gain_code_fx = 0; /* normalized algebraic codeebook gain Q16 */ @@ -253,9 +251,19 @@ void decod_tran_fx( { tmp_idx_2 = idiv1616( i_subfr, L_SUBFR ); } - prep_tbe_exc_fx( L_frame_fx, i_subfr, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[tmp_idx_2], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0, T0_frac, st_fx->coder_type, st_fx->core_brate ); + + Q_code_preQ = Q6; + move16(); + if ( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + Q_code_preQ = Q10; + move16(); + } + + prep_tbe_exc_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + &voice_factors_fx[tmp_idx_2], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_code_preQ, + st_fx->Q_exc, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*----------------------------------------------------------------* * Excitation enhancements (update of total excitation signal) diff --git a/lib_dec/dec_uv_fx.c b/lib_dec/dec_uv_fx.c index 42f3250fb4595c517537e9e69c54924266a89711..b5c10232c4034725f0ef48a73c45102630738d31 100644 --- a/lib_dec/dec_uv_fx.c +++ b/lib_dec/dec_uv_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -26,105 +26,17 @@ static void gain_dec_gacelp_uv_fx( *-------------------------------------------------------------------*/ void decod_unvoiced_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ - const Word16 coder_type, /* Q0 i : coding type */ - Word16 *tmp_noise_fx, /* Q0 o : long term temporary noise energy */ - Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe*/ - Word16 *voice_factors_fx, /* Q15 o : voicing factors */ - Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ - Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ - Word16 *gain_buf ) -{ - Word16 gain_pit_fx; /* Quantized pitch gain */ - Word32 gain_code_fx; /* Quantized algebraic codeebook gain */ - Word16 gain_inov_fx; /* inovation gain */ - Word32 norm_gain_code_fx; /* normalized algebraic codeebook gain */ - Word16 voice_fac_fx; /* Voicing factor */ - Word16 code_fx[L_SUBFR]; /* algebraic codevector */ - Word16 i_subfr_fx; - const Word16 *p_Aq_fx; - Word16 *pt_pitch_fx; - - gain_pit_fx = 0; - move16(); - - test(); - IF( EQ_16( st_fx->last_ppp_mode_dec, 1 ) || EQ_16( st_fx->last_nelp_mode_dec, 1 ) ) - { - /* SC_VBR - reset the decoder, to avoid memory not updated issue for this unrealistic case */ - CNG_reset_dec_fx( st_fx, pitch_buf_fx, voice_factors_fx ); - } - - p_Aq_fx = Aq_fx; - move16(); /*Q12*/ /* pointer to interpolated LPC parameters */ - pt_pitch_fx = pitch_buf_fx; - move16(); /* pointer to the pitch buffer */ - - FOR( i_subfr_fx = 0; i_subfr_fx < L_FRAME; i_subfr_fx += L_SUBFR ) - { - /*----------------------------------------------------------------* - * Unvoiced subframe processing - *----------------------------------------------------------------*/ - - gaus_dec_fx( st_fx, i_subfr_fx, code_fx, &norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, &gain_inov_fx, &st_fx->tilt_code_fx, - &voice_fac_fx, &gain_pit_fx, pt_pitch_fx, exc_fx, &gain_code_fx, exc2_fx, bwe_exc_fx, &( st_fx->Q_exc ), st_fx->Q_subfr ); - - *tmp_noise_fx = extract_h( norm_gain_code_fx ); /*Q16*/ - move16(); - - /*----------------------------------------------------------------* - * Excitation enhancements (update of total excitation signal) - *----------------------------------------------------------------*/ - - enhancer_fx( st_fx->core_brate, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, - norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); - - Word16 tmp_idx = 0; - move16(); - IF( i_subfr_fx != 0 ) - { - tmp_idx = idiv1616( i_subfr_fx, L_SUBFR ); - } - voice_factors_fx[tmp_idx] = 0; - move16(); - - interp_code_5over2_fx( &exc_fx[i_subfr_fx], &bwe_exc_fx[( ( i_subfr_fx * 2 * HIBND_ACB_L_FAC ) >> 1 )], L_SUBFR ); - - p_Aq_fx += ( M + 1 ); - pt_pitch_fx++; - st_fx->tilt_code_dec_fx[tmp_idx] = st_fx->tilt_code_fx; - move16(); - } - - /* SC-VBR */ - st_fx->prev_gain_pit_dec_fx = gain_pit_fx; - move16(); - - set16_fx( gain_buf, 0, NB_SUBFR ); - - return; -} - -/*-------------------------------------------------------------------* - * decod_unvoiced() - * - * Decode unvoiced (UC) frames - *-------------------------------------------------------------------*/ - -void decod_unvoiced_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ + Decoder_State *st_fx, /* i/o: decoder static memory */ + const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ const Word16 uc_two_stage_flag, /* i : flag indicating two-stage UC */ - const Word16 coder_type, /* Q0 i : coding type */ - Word16 *tmp_noise_fx, /* Q0 o : long term temporary noise energy */ - Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe*/ - Word16 *voice_factors_fx, /* Q15 o : voicing factors */ - Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ - Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ + const Word16 coder_type, /* Q0 i : coding type */ + Word16 *tmp_noise_fx, /* Q0 o : long term temporary noise energy */ + Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe*/ + Word16 *voice_factors_fx, /* Q15 o : voicing factors */ + Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ + Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ + Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ Word16 *gain_buf ) { Word16 gain_pit_fx; /* Quantized pitch gain */ @@ -207,7 +119,14 @@ void decod_unvoiced_ivas_fx( move16(); /* update LP filtered gains for the case of frame erasures */ - lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_FRAME ); + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_FRAME ); + } + ELSE + { + lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_FRAME ); + } /*-------------------------------------------------------* * - Find the total excitation. * @@ -240,6 +159,7 @@ void decod_unvoiced_ivas_fx( } // Scale_sig(code_fx, L_SUBFR, 3); //Q12 } + *tmp_noise_fx = extract_h( norm_gain_code_fx ); /*Q16*/ move16(); @@ -247,10 +167,16 @@ void decod_unvoiced_ivas_fx( * Excitation enhancements (update of total excitation signal) *----------------------------------------------------------------*/ - /*enhancer_fx(st_fx->core_brate, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, - norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &(st_fx->dm_fx), st_fx->Q_exc);*/ - enhancer_ivas_fx( MODE1, st_fx->core_brate, uc_two_stage_flag, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, - norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx /*Q9/Q12?*/, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + enhancer_fx( st_fx->core_brate, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, + norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); + } + ELSE + { + enhancer_ivas_fx( MODE1, st_fx->core_brate, uc_two_stage_flag, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, + norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx /*Q9/Q12?*/, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); + } Word16 tmp_idx; tmp_idx = 0; @@ -261,6 +187,7 @@ void decod_unvoiced_ivas_fx( } voice_factors_fx[tmp_idx] = 0; move16(); + interp_code_5over2_fx( &exc_fx[i_subfr_fx], &bwe_exc_fx[( ( i_subfr_fx * 2 * HIBND_ACB_L_FAC ) >> 1 )], L_SUBFR ); p_Aq_fx += ( M + 1 ); diff --git a/lib_dec/decision_matrix_dec_fx.c b/lib_dec/decision_matrix_dec_fx.c index f9833e80a85cc38309828ee2b6f2d0764df82741..1bd406e7a78568ba835ccb8a98d87b0a998fddfd 100644 --- a/lib_dec/decision_matrix_dec_fx.c +++ b/lib_dec/decision_matrix_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -713,7 +713,6 @@ void decision_matrix_dec_fx( move16(); } -#ifdef NONBE_FIX_GSC_BSTR /*-----------------------------------------------------------------* * set inactive coder_type flag in ACELP core *-----------------------------------------------------------------*/ @@ -727,6 +726,5 @@ void decision_matrix_dec_fx( move16(); } -#endif return; } diff --git a/lib_dec/dlpc_avq_fx.c b/lib_dec/dlpc_avq_fx.c index 3d9a00b7f1bbbb7be3c76f639125fe0913d033f3..97b41d98ba05840ab02db7f9be0a44e2a443cb68 100644 --- a/lib_dec/dlpc_avq_fx.c +++ b/lib_dec/dlpc_avq_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -149,20 +149,11 @@ Word16 decode_lpc_avq_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word16 numlpc, /* i : Number of sets of lpc */ Word16 *param_lpc /* o : lpc parameters */ -#ifdef IVAS_CODE_AVQ_LPC - , - const Word16 ch, /* i : channel */ - const Word16 element_mode, /* i : element mode */ - const Word16 sns_low_br_mode /* i : SNS low-bitrate mode */ -#endif ) { Word16 k, j; Word16 nb, qn1, qn2, avqBits, q_type; Word16 start_bit_pos; -#ifdef IVAS_CODE_AVQ_LPC - Word16 stereo_mode = 0; -#endif move16(); move16(); move16(); @@ -189,41 +180,11 @@ Word16 decode_lpc_avq_fx( param_lpc[j] = q_type; j = add( j, 1 ); } -#ifdef IVAS_CODE_AVQ_LPC - test(); - IF( EQ_16( element_mode, IVAS_CPE_MDCT ) && k == 0 ) - { - stereo_mode = ch; - move16(); - if ( ch == 0 ) - { - stereo_mode = param_lpc[j]; - move16(); - } - param_lpc[j++] = stereo_mode; - move16(); - } -#endif /* Decode quantization indices */ IF( q_type == 0 ) { /* Absolute quantizer with 1st stage stochastic codebook */ -#ifdef IVAS_CODE_AVQ_LPC - IF( EQ_16( element_mode, IVAS_CPE_MDCT ) ) - { - IF( NE_16( stereo_mode, 3 ) ) - { - param_lpc[j] = get_next_indice_fx( st, SNS_ABS_QUANT_BITS ); - } - ELSE - { - param_lpc[j] = sub( get_next_indice_fx( st, 1 ), 2 ); - } - move16(); - } - ELSE -#endif { move16(); param_lpc[j] = get_next_indice_fx( st, 8 ); @@ -235,9 +196,6 @@ Word16 decode_lpc_avq_fx( * - we are in low bitrate mode and no joint SNS coding is used * - OR the side-SNS-is-zero flag is set for joint SNS */ -#ifdef IVAS_CODE_AVQ_LPC - IF( NE_16( element_mode, IVAS_CPE_MDCT ) || ( !( sns_low_br_mode && ( EQ_16( stereo_mode, 0 ) || EQ_16( stereo_mode, 1 ) ) && !( EQ_16( q_type, 0 ) && EQ_16( param_lpc[j - 1], -2 ) ) ) ) ) -#endif { /* 2 bits to specify Q2,Q3,Q4,ext */ qn1 = add( 2, get_next_indice_fx( st, 2 ) ); @@ -321,26 +279,15 @@ Word16 decode_lpc_avq_fx( pack4bits_fx( avqBits, st, ¶m_lpc[j] ); j = add( j, qn2 ); } -#ifdef IVAS_CODE_AVQ_LPC - ELSE - { - param_lpc[j] = 0; - j = add( j, 1 ); - param_lpc[j] = 0; - j = add( j, 1 ); - move16(); - move16(); - } -#endif } return sub( st->next_bit_pos, start_bit_pos ); } + Word16 decode_lpc_avq_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word16 numlpc, /* i : Number of sets of lpc */ - Word16 *param_lpc /* o : lpc parameters */ - , + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 numlpc, /* i : Number of sets of lpc */ + Word16 *param_lpc, /* o : lpc parameters */ const Word16 ch, /* i : channel */ const Word16 element_mode, /* i : element mode */ const Word16 sns_low_br_mode /* i : SNS low-bitrate mode */ diff --git a/lib_dec/dlpc_stoch_fx.c b/lib_dec/dlpc_stoch_fx.c index d4f3daeb8f4e5c60cb1a2ca4656029f3d3471c54..7a5175fb857c49f66b166f2a4c6d1e3f567fd65e 100644 --- a/lib_dec/dlpc_stoch_fx.c +++ b/lib_dec/dlpc_stoch_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ diff --git a/lib_dec/er_dec_acelp_fx.c b/lib_dec/er_dec_acelp_fx.c index e30553d388e32c0a53b2b903aa763b120af22ab0..06e14650431b03a5e7fbc3e133b918e4a3119d9b 100644 --- a/lib_dec/er_dec_acelp_fx.c +++ b/lib_dec/er_dec_acelp_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /*VERSIONINFO: File up to date with trunk rev. 39929*/ @@ -557,7 +557,7 @@ void con_acelp_fx( tmp_32 = Mpy_32_16_1( st->Mode2_lp_gainc /*Q16*/, alpha /*Q14*/ ); /*Q31-16 = Q15*/ s_32 = norm_l( tmp_32 ); tmp_32 = L_shl( tmp_32, s_32 ); - tmp_16 = round_fx( tmp_32 ); + tmp_16 = round_fx_sat( tmp_32 ); s_16 = negate( s_32 ); s_16 = sub( s_16, -1 - 15 ); /*->Q15*/ @@ -1018,6 +1018,8 @@ void con_acelp_fx( Copy( syn, synth, st->L_frame ); bufferCopyFx( syn + sub( st->L_frame, shr( st->L_frame, 1 ) ), hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), 0 /*Qf_syn*/, -1 /*Qf_old_xnq*/, 0, 0 /*Q_old_xnq*/ ); + st->hTcxDec->Q_old_syn_Overl = sub( Qf_syn, 1 ); + move16(); /* save last half frame if next frame is TCX */ bufferCopyFx( syn + st->L_frame, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ), 0 /*Qf_syn*/, -1 /*Qf_old_xnq*/, 0, 0 /*Q_old_xnq*/ ); @@ -1057,11 +1059,9 @@ void con_acelp_fx( move16(); } set16_fx( &hHQ_core->old_out_LB_fx[( W1 + n )], 0, n ); - hHQ_core->Q_old_wtda = hHQ_core->Q_old_wtda_LB; move16(); - FOR( i = 0; i < W2; i++ ) { buf[i] = mult_r( hTcxDec->syn_Overl_TDAC[i], w[i].v.re ); /*hTcxDec->Q_syn_Overl_TDAC*/ @@ -1104,7 +1104,11 @@ void con_acelp_fx( st->hTcxDec->Q_syn_Overl_TDACFB = st->hTcxDec->Q_syn_Overl_TDAC; move16(); lerp( hTcxDec->syn_Overl, hTcxDec->syn_OverlFB, shr( hTcxDec->L_frameTCX, 1 ), shr( st->L_frame, 1 ) ); + hTcxDec->Q_syn_OverlFB = hTcxDec->Q_syn_Overl; + move16(); lerp( hHQ_core->old_out_LB_fx, hHQ_core->old_out_fx, hTcxDec->L_frameTCX, st->L_frame ); + hHQ_core->Q_old_wtda = hHQ_core->Q_old_wtda_LB; + move16(); /* copy total excitation exc2 as 16kHz for acelp mode1 decoding */ IF( st->hWIDec != NULL ) diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index e804d200927334135725f05bc7294f3e4da06dce..e59e3c0e33dbb9471ee9b116d7017246434c9640 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -15,43 +15,28 @@ ******************************************************/ static void calcGainc_fx( Word16 *exc, Word16 Q_exc, Word32 old_fpitch /*Q16*/, Word16 L_subfr /*Q0*/, Word32 lp_gainp /*Q16*/, Word32 *lp_gainc /*Q16*/ ) { - Word32 L_c; Word16 tmp16, tmp16_2, tmp16_3, tmp_e, tmp2_e, tmp_loop, i; - Word32 L_acc, L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; + Word64 W_acc; + Word32 L_tmp; move32(); move32(); -#endif - - L_acc = L_deposit_l( 0 ); - L_c = L_deposit_l( 0 ); - Overflow = 0; - move16(); - Carry = 0; - move16(); + W_acc = 0; tmp16 = round_fx( old_fpitch ); /*Q0*/ tmp_loop = shl( L_subfr, 1 ); BASOP_SATURATE_WARNING_OFF_EVS - tmp16_2 = round_fx_o( L_shl_o( lp_gainp, 2, &Overflow ), &Overflow ); /*Q31->Q15, no severe saturation, because st->lp_gainp here is [0,1]*/ + tmp16_2 = round_fx_sat( L_shl_sat( lp_gainp, 2 ) ); /*Q31->Q15, no severe saturation, because st->lp_gainp here is [0,1]*/ BASOP_SATURATE_WARNING_ON_EVS FOR( i = 0; i < tmp_loop; i++ ) { /*st->lp_gainc += ( exc[i-2*L_subfr] - st->Mode2_lp_gainp * exc[i-2*L_subfr-(int)(st->old_fpitch+0.5f)] ) * ( exc[i-2*L_subfr] - st->Mode2_lp_gainp * exc[i-2*L_subfr-(int)(st->old_fpitch+0.5f)] );*/ - tmp16_3 = sub_o( exc[( i - ( L_subfr * 2 ) )] /*Q1*/, mult_r( tmp16_2 /*Q15*/, exc[( ( i - ( L_subfr * 2 ) ) - tmp16 )] /*Q1*/ ) /*Q1*/, &Overflow ); - L_acc = L_macNs_co( L_acc, tmp16_3, tmp16_3, &Carry, &Overflow ); /*Q3*/ - Overflow = 0; - move16(); - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Accumulate Carrys Q-1*/ - Carry = 0; - move16(); + tmp16_3 = sub_sat( exc[( i - ( L_subfr * 2 ) )] /*Q1*/, mult_r( tmp16_2 /*Q15*/, exc[( ( i - ( L_subfr * 2 ) ) - tmp16 )] /*Q1*/ ) /*Q1*/ ); + W_acc = W_mac_16_16( W_acc, tmp16_3, tmp16_3 ); /*Q3*/ } - L_tmp = norm_llQ31( L_c, L_acc, &tmp_e ); /*Q3,norm,tmp_e*/ + L_tmp = w_norm_llQ31( W_acc, &tmp_e ); /*Q3,norm,tmp_e*/ tmp_e = add( tmp_e, 31 - ( add( shl( Q_exc, 1 ), 1 ) ) ); /*L_tmp is Q31, now*/ tmp16 = BASOP_Util_Divide3216_Scale( L_tmp /*Q31,norm,tmp_e*/, shl( L_subfr, 1 ) /*Q15,15*/, &tmp2_e ) /*Q15,tmp2_e+tmp_e-15*/; tmp_e = sub( add( tmp2_e, tmp_e ), 15 ); @@ -67,37 +52,22 @@ static void calcGainc_fx( Word16 *exc, Word16 Q_exc, Word32 old_fpitch /*Q16*/, static void calcGainc2_fx( Word16 *exc, Word16 Q_exc, Word16 L_subfr /*Q0*/, Word32 *lp_gainc /*Q16*/ ) { Word16 i, cnt, tmp16, tmp_e, tmp2_e; - Word32 L_c, L_acc, L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; -#endif + Word64 W_acc; + Word32 L_tmp; move16(); move16(); - - Carry = 0; - move16(); - Overflow = 0; - move16(); - - L_c = L_deposit_l( 0 ); - L_acc = L_deposit_l( 0 ); + W_acc = 0; cnt = shl( L_subfr, 1 ); FOR( i = 0; i < cnt; i++ ) { /* *gainc += ( exc[i-2*L_subfr] ) * ( exc[i-2*L_subfr]); */ - L_acc = L_macNs_co( L_acc, exc[( i - ( L_subfr * 2 ) )] /*Q1*/, exc[( i - ( L_subfr * 2 ) )] /*Q1*/, &Carry, &Overflow ); /*Q3*/ - Overflow = 0; - move16(); - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /* Accumulate Carrys Q-1*/ - Carry = 0; - move16(); + W_acc = W_mac_16_16( W_acc, exc[( i - ( L_subfr * 2 ) )] /*Q1*/, exc[( i - ( L_subfr * 2 ) )] /*Q1*/ ); /*Q3*/ } - L_tmp = norm_llQ31( L_c, L_acc, &tmp_e ); /*Q3,norm,tmp_e*/ + L_tmp = w_norm_llQ31( W_acc, &tmp_e ); /*Q3,norm,tmp_e*/ tmp_e = add( tmp_e, sub( 31, ( add( shl( Q_exc, 1 ), 1 ) ) ) ); /*L_tmp is Q31, now*/ tmp16 = BASOP_Util_Divide3216_Scale( L_tmp /*Q31,norm,tmp_e*/, shl( L_subfr, 1 ) /*Q15,15*/, &tmp2_e ) /*Q15,tmp2_e+tmp_e-15*/; tmp_e = sub( add( tmp2_e, tmp_e ), 15 ); @@ -121,17 +91,6 @@ con_tcx void con_tcx_fx( Decoder_State *st, /* i/o: coder memory state */ Word16 synth[] /* i/o: synth[] Q0*/ -#ifdef IVAS_CODE_CON_TCX - , - const Word16 coh, /* i : coherence of stereo signal Q14*/ - Word16 *noise_seed, /* i/o: noise seed for stereo Q0*/ - const Word16 only_left /* i : TD-PLC only in left channel Q0*/ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - , - const float *A_cng /* i : CNG LP filter coefficients Q14*/ -#endif -#endif - ) { Word16 i, s, c, L_frame, L_subfr, fLowPassFilter, T0; @@ -142,7 +101,7 @@ void con_tcx_fx( Word16 pre_emph_buf; Word16 hp_filt[L_FIR_FER2]; Word16 alpha; - Word16 tmp_deemph, gain, gainCNG, gain_inov; + Word16 tmp_deemph, gain, gainCNG, gain_inov, scf; Word16 *pt_exc, *pt1_exc; Word16 Tc, tmpSeed; Word16 fUseExtrapolatedPitch; @@ -227,9 +186,10 @@ void con_tcx_fx( IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || hTcxDec->tcxConceal_recalc_exc ) { /* apply pre-emphasis to the signal */ - mem = synth[( -( ( ( ( L_frame / 2 ) + hTcxDec->pit_max_TCX ) + M + M ) ) - 1 )]; /*Q0*/ + mem = shl( synth[( -( ( ( shr( L_frame, 1 ) + hTcxDec->pit_max_TCX ) + M + M ) ) - 1 )], st->Q_syn_factor ); /*Q0*/ move16(); Q_exc = E_UTIL_f_preemph3( &( synth[-( ( ( L_frame / 2 ) + hTcxDec->pit_max_TCX ) + 2 * M )] ), st->preemph_fac, add( add( shr( L_frame, 1 ), hTcxDec->pit_max_TCX ), shl( M, 1 ) ), &mem, 1 ); + Scale_sig( &( synth[-( ( shr( L_frame, 1 ) + hTcxDec->pit_max_TCX ) + 2 * M )] ), add( add( shr( L_frame, 1 ), hTcxDec->pit_max_TCX ), shl( M, 1 ) ), negate( st->Q_syn_factor ) ); /*Q0, Setting back to Q0, as the following calculations are implemented assuming synth is in Q0 */ st->Mode2_lp_gainc = L_deposit_l( 0 ); st->Mode2_lp_gainp = get_gain2( synth - shl( L_subfr, 1 ), synth - add( shl( L_subfr, 1 ), Tc ), shl( L_subfr, 1 ) ); /*Q16*/ @@ -268,10 +228,11 @@ void con_tcx_fx( ELSE { /* apply pre-emphasis to the signal */ - mem = synth[( -L_frame - 1 )]; /*Q0*/ + mem = shl( synth[( -L_frame - 1 )], st->Q_syn_factor ); /*Q0*/ move16(); Q_exc = E_UTIL_f_preemph3( &( synth[-L_frame] ), st->preemph_fac, L_frame, &mem, 1 ); - Copy( st->old_Aq_12_8_fx, A_local, M + 1 ); /*Q12*/ + Scale_sig( &synth[-L_frame], L_frame, negate( st->Q_syn_factor ) ); /*Q0, Setting back to Q0, as the following calculations are implemented assuming synth is in Q0 */ + Copy( st->old_Aq_12_8_fx, A_local, M + 1 ); /*Q12*/ offset = shr( L_frame, 1 ); IF( GE_16( st->last_good, UNVOICED_TRANSITION ) ) @@ -489,19 +450,7 @@ void con_tcx_fx( move16(); /* PLC: calculate damping factor */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - alpha = 1.0f; - if ( st->element_mode == IVAS_CPE_MDCT && st->nbLostCmpt >= MDCT_ST_PLC_FADEOUT_START_FRAME ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } - else if ( st->element_mode != IVAS_CPE_MDCT ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } -#else alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/ -#endif IF( EQ_16( st->nbLostCmpt, 1 ) ) { st->cummulative_damping = 32767 /*1.f Q15*/; @@ -566,63 +515,15 @@ void con_tcx_fx( { calcGainc2_fx( &exc[0], Q_exc, L_subfr, &( st->Mode2_lp_gainc ) ); } - set32_fx( pitch_buf, L_deposit_h( L_SUBFR ), st->nb_subfr ); /*Q16*/ - /* PLC: calculate damping factor */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - alpha = 1.0f; - if ( st->element_mode == IVAS_CPE_MDCT && st->nbLostCmpt >= MDCT_ST_PLC_FADEOUT_START_FRAME ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } - else if ( st->element_mode != IVAS_CPE_MDCT ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } -#else + set32_fx( pitch_buf, L_deposit_h( L_SUBFR ), st->nb_subfr ); /*Q16*/ + /* PLC: calculate damping factor */ alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/ -#endif } /*-----------------------------------------------------------------* * Construct the random part of excitation *-----------------------------------------------------------------*/ -#ifdef IVAS_CODE_CON_TCX - if ( coh != -1.f ) - { - int16_t tmpSeed1; - float alpha_coh; - float random1, random2; - - tmpSeed1 = *noise_seed; - noise = buf; - - alpha_coh = sqrtf( ( 1 - coh ) / ( 1 + coh ) ); - if ( st->idchan == 1 ) - { - alpha_coh = -alpha_coh; - } - - for ( i = 0; i < L_frame + L_FIR_FER2 - 1; i++ ) - { - random1 = (float) own_random( &tmpSeed1 ); - random2 = (float) own_random( &tmpSeed1 ); - noise[i] = random1 + alpha_coh * random2; - } - if ( st->idchan == 1 || only_left ) - { - *noise_seed = tmpSeed1; - } - - for ( ; i < L_frame + ( L_frame / 2 ) + 2 * L_FIR_FER2; i++ ) - { - random1 = (float) own_random( &tmpSeed1 ); - random2 = (float) own_random( &tmpSeed1 ); - noise[i] = random1 + alpha_coh * random2; - } - } - else -#endif /*IVAS_CODE_CON_TCX*/ { tmpSeed = st->seed_acelp; move16(); @@ -707,20 +608,9 @@ void con_tcx_fx( } /* PLC: [TCX: Fade-out] retrieve background level */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - if ( A_cng != NULL ) - { - gainSynthDeemph = getLevelSynDeemph_fx( &( tmp ), A_cng, L_frame / 4, st->preemph_fac, 1 ) / 4.f; - } - else - { - gainSynthDeemph = getLevelSynDeemph_fx( &( tmp ), A_local, L_frame / 4, st->preemph_fac, 1 ); - } -#else tmp16 = 32767; move16(); - gainSynthDeemph = getLevelSynDeemph_fx( &( tmp16 ), A_local, M, shr( L_frame, 2 ), st->preemph_fac, 1, &gainSynthDeemph_e ); /*Q5*/ -#endif + gainSynthDeemph = getLevelSynDeemph_fx( &( tmp16 ), A_local, M, shr( L_frame, 2 ), st->preemph_fac, 1, &gainSynthDeemph_e ); /*Q5*/ IF( st->tcxonly != 0 ) { /* gainCNG = st->conCngLevelBackgroundTrace/gainSynthDeemph; */ @@ -728,19 +618,6 @@ void con_tcx_fx( hTcxDec->conCngLevelBackgroundTrace_e, gainSynthDeemph, gainSynthDeemph_e, &gainCNG, &gainCNG_e ); -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - if ( st->element_mode == IVAS_CPE_MDCT && A_cng != NULL ) - { - if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME + MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN ) - { - gainCNG = 0.f; - } - else if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) - { - gainCNG *= 1.f - (float) ( st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) / MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN; - } - } -#endif } ELSE { @@ -885,11 +762,23 @@ void con_tcx_fx( * - compute the synthesis speech * *----------------------------------------------------------*/ - syn = buf + M; /*Q_syn*/ - Copy( synth - M, buf, M ); /*Q_syn*/ + syn = buf + M; /*Q_syn*/ + Copy( synth - M, buf, M ); /*Q_syn*/ + IF( NE_32( st->element_mode, EVS_MONO ) ) // to keep evs bit-exactness + { + scf = norm_s( tmp_deemph ); + new_Q = sub( Q_exc, 4 ); + new_Q = s_max( new_Q, -1 ); + new_Q = s_min( new_Q, scf ); + } + ELSE + { + new_Q = sub( Q_exc, 3 ); + new_Q = s_max( new_Q, -1 ); - new_Q = sub( Q_exc, 3 ); - new_Q = s_max( new_Q, -1 ); + scf = 0; + move16(); + } tmp16 = s_min( new_Q, st->prev_Q_syn ); st->prev_Q_syn = new_Q; @@ -900,41 +789,25 @@ void con_tcx_fx( move16(); Copy_Scale_sig( buf, mem_syn, M, exp_scale ); /*Q: tmp16*/ - - tmp_deemph = shl_sat( tmp_deemph, Q_syn ); /*Q_syn*/ + IF( NE_32( st->element_mode, EVS_MONO ) ) // to keep evs bit-exactness + { + if ( GT_16( sub( Q_syn, st->Q_syn_factor ), scf ) ) + { + Q_syn = add( scf, st->Q_syn_factor ); // so that (Q_syn - st->Q_syn_factor) = scf; + } + tmp_deemph = shl( tmp_deemph, sub( Q_syn, st->Q_syn_factor ) ); + } + ELSE + { + tmp_deemph = shl_sat( tmp_deemph, Q_syn ); /*Q_syn*/ + } + st->Q_syn_factor = 0; + move16(); st->Q_syn = Q_syn; move16(); /*buf[OLD_EXC_SIZE_DEC;3/2 L_frame] Q1: exc*/ /*buf[0;M] Q0: mem_syn*/ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - if ( A_cng != NULL ) - { - float alpha_delayed; - - alpha_delayed = 1.0f; - if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE ) - { - alpha_delayed = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE, st->last_good, st->stab_fac, &( st->lp_gainp ), ACELP_CORE ); - } - - if ( st->plcBackgroundNoiseUpdated && alpha_delayed != 1.0f ) - { - float lsp_local[M], lsp_fade[M], alpha_inv; - - alpha_inv = 1.0f - alpha_delayed; - - a2lsp_stab( A_local, lsp_local, lsp_local ); - - for ( i = 0; i < M; i++ ) - { - lsp_fade[i] = alpha_delayed * lsp_local[i] + alpha_inv * st->lspold_cng[i]; - } - - lsp2a_stab( lsp_fade, A_local, M ); - } - } -#endif E_UTIL_synthesis( sub( Q_exc, Q_syn ), A_local, @@ -966,6 +839,8 @@ void con_tcx_fx( lerp( syn + sub( L_frame, shr( L_frame, 1 ) ), hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); + st->hTcxDec->Q_old_syn_Overl = Q_syn; + move16(); Copy( syn + sub( L_frame, n ), hHQ_core->old_out_fx, sub( L_frame, n ) ); /*Q_syn*/ FOR( i = 0; i < W12; i++ ) @@ -990,7 +865,9 @@ void con_tcx_fx( bufferCopyFx( syn, synth, L_frame, Q_syn, 0, 0, 0 ); /*Q_syn*/ BASOP_SATURATE_WARNING_ON_EVS - Copy_Scale_sig( syn + L_frame, hTcxDec->syn_OverlFB, shr( L_frame, 1 ), negate( Q_syn ) ); /*Q0*/ + Copy_Scale_sig( syn + L_frame, hTcxDec->syn_OverlFB, shr( L_frame, 1 ), sub( 0, Q_syn ) ); /*Q0*/ + hTcxDec->Q_syn_OverlFB = 0; + move16(); /* copy total excitation exc2 as 16kHz for acelp mode1 decoding */ IF( st->hWIDec != NULL ) @@ -1052,7 +929,11 @@ void con_tcx_fx( /* update memory for low band */ Scale_sig( hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, Q_syn ) ); /*Q_syn*/ + hTcxDec->Q_old_syn_Overl = -1; + move16(); lerp( hTcxDec->syn_OverlFB, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); + hTcxDec->Q_syn_Overl = hTcxDec->Q_syn_OverlFB; + move16(); lerp( hTcxDec->syn_Overl_TDACFB, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB; move16(); @@ -1065,13 +946,12 @@ void con_tcx_fx( } void con_tcx_ivas_fx( - Decoder_State *st, /* i/o: coder memory state */ - Word16 synth[], - /* i/o: synth[] */ /*Q0 */ - const Word16 coh, /* i : coherence of stereo signal Q14*/ - Word16 *noise_seed, /* i/o: noise seed for stereo Q0*/ - const Word16 only_left, /* i : TD-PLC only in left channel Q0*/ - const Word16 *A_cng /* i : CNG LP filter coefficients Q14*/ + Decoder_State *st, /* i/o: coder memory state */ + Word16 synth[], /* i/o: synth[] Q0 */ + const Word16 coh, /* i : coherence of stereo signal Q14*/ + Word16 *noise_seed, /* i/o: noise seed for stereo Q0 */ + const Word16 only_left, /* i : TD-PLC only in left channel Q0 */ + const Word16 *A_cng /* i : CNG LP filter coefficients Q14*/ ) { Word16 i, s, c, L_frame, L_subfr, fLowPassFilter, T0; @@ -1082,7 +962,7 @@ void con_tcx_ivas_fx( Word16 pre_emph_buf; Word16 hp_filt[L_FIR_FER2]; Word16 alpha; - Word16 tmp_deemph, gain, gainCNG, gain_inov; + Word16 tmp_deemph, gain, gainCNG, gain_inov, scf; Word16 *pt_exc, *pt1_exc; Word16 Tc, tmpSeed; Word16 fUseExtrapolatedPitch; @@ -1157,18 +1037,21 @@ void con_tcx_ivas_fx( /* set excitation memory*/ exc = buf + OLD_EXC_SIZE_DEC; - tmp_deemph = synth[-1]; /*Q0*/ + tmp_deemph = synth[-1]; /*st->Q_syn_factor*/ move16(); - pre_emph_buf = synth[-1]; /*Q0*/ + pre_emph_buf = synth[-1]; /*st->Q_syn_factor*/ move16(); test(); IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || hTcxDec->tcxConceal_recalc_exc ) { /* apply pre-emphasis to the signal */ - mem = synth[( -( ( ( L_frame / 2 ) + hTcxDec->pit_max_TCX ) + M + M ) - 1 )]; /*Q0*/ + mem = shl( synth[( -( ( ( L_frame / 2 ) + hTcxDec->pit_max_TCX ) + M + M ) - 1 )], st->Q_syn_factor ); move16(); Q_exc = E_UTIL_f_preemph3_ivas_fx( &( synth[-( ( ( L_frame / 2 ) + hTcxDec->pit_max_TCX ) + 2 * M )] ), st->preemph_fac, add( add( shr( L_frame, 1 ), hTcxDec->pit_max_TCX ), shl( M, 1 ) ), &mem, 1 ); + + scale_sig( &( synth[-( ( ( L_frame / 2 ) + hTcxDec->pit_max_TCX ) + 2 * M )] ), add( add( shr( L_frame, 1 ), hTcxDec->pit_max_TCX ), shl( M, 1 ) ), negate( st->Q_syn_factor ) ); /*Q0, Setting back to Q0, as the following calculations are implemented assuming synth is in Q0 */ + st->Mode2_lp_gainc = L_deposit_l( 0 ); st->Mode2_lp_gainp = get_gain2( synth - shl( L_subfr, 1 ), synth - add( shl( L_subfr, 1 ), Tc ), shl( L_subfr, 1 ) ); @@ -1211,10 +1094,11 @@ void con_tcx_ivas_fx( ELSE { /* apply pre-emphasis to the signal */ - mem = synth[( -L_frame - 1 )]; /*Q0*/ + mem = shl( synth[( -L_frame - 1 )], st->Q_syn_factor ); /*hTcxDec->Q_synth_factor_old*/ move16(); Q_exc = E_UTIL_f_preemph3_ivas_fx( &( synth[-L_frame] ), st->preemph_fac, L_frame, &mem, 1 ); - Copy( st->old_Aq_12_8_fx, A_local, M + 1 ); /*Q14*/ + scale_sig( &synth[-L_frame], L_frame, negate( st->Q_syn_factor ) ); /*Q0, Setting back to Q0, as the following calculations are implemented assuming synth is in Q0 */ + Copy( st->old_Aq_12_8_fx, A_local, M + 1 ); /*Q14*/ offset = shr( L_frame, 1 ); IF( GE_16( st->last_good, UNVOICED_TRANSITION ) ) @@ -1434,19 +1318,7 @@ void con_tcx_ivas_fx( move16(); /* PLC: calculate damping factor */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - alpha = 1.0f; - if ( st->element_mode == IVAS_CPE_MDCT && st->nbLostCmpt >= MDCT_ST_PLC_FADEOUT_START_FRAME ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } - else if ( st->element_mode != IVAS_CPE_MDCT ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } -#else alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/ -#endif IF( EQ_16( st->nbLostCmpt, 1 ) ) { st->cummulative_damping = 32767 /*1.f Q15*/; @@ -1511,27 +1383,15 @@ void con_tcx_ivas_fx( { calcGainc2_fx( &exc[0], Q_exc, L_subfr, &( st->Mode2_lp_gainc ) ); } - set32_fx( pitch_buf, L_deposit_h( L_SUBFR ), st->nb_subfr ); /*Q16*/ - /* PLC: calculate damping factor */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - alpha = 1.0f; - if ( st->element_mode == IVAS_CPE_MDCT && st->nbLostCmpt >= MDCT_ST_PLC_FADEOUT_START_FRAME ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } - else if ( st->element_mode != IVAS_CPE_MDCT ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } -#else + set32_fx( pitch_buf, L_deposit_h( L_SUBFR ), st->nb_subfr ); /*Q16*/ + /* PLC: calculate damping factor */ alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/ -#endif } /*-----------------------------------------------------------------* * Construct the random part of excitation *-----------------------------------------------------------------*/ -#ifndef IVAS_CODE_CON_TCX + IF( NE_16( coh, -16384 ) ) { Word16 tmpSeed1; @@ -1581,7 +1441,6 @@ void con_tcx_ivas_fx( } } ELSE -#endif /*IVAS_CODE_CON_TCX*/ { tmpSeed = st->seed_acelp; /*Q0*/ move16(); @@ -1666,7 +1525,6 @@ void con_tcx_ivas_fx( } /* PLC: [TCX: Fade-out] retrieve background level */ -#ifndef IVAS_CODE_CNG_FIX185_PLC_FADEOUT tmp16 = 32767; move16(); IF( A_cng != NULL ) @@ -1677,11 +1535,6 @@ void con_tcx_ivas_fx( { gainSynthDeemph = getLevelSynDeemph_fx( &( tmp16 ), A_local, M, shr( L_frame, 2 ), st->preemph_fac, 1, &gainSynthDeemph_e ); /*Q13*/ } -#else - tmp16 = 32767; - move16(); - gainSynthDeemph = getLevelSynDeemph_fx( &( tmp16 ), A_local, M, shr( L_frame, 2 ), st->preemph_fac, 1, &gainSynthDeemph_e ); -#endif IF( st->tcxonly != 0 ) { /* gainCNG = st->conCngLevelBackgroundTrace/gainSynthDeemph; */ @@ -1689,7 +1542,6 @@ void con_tcx_ivas_fx( hTcxDec->conCngLevelBackgroundTrace_e, gainSynthDeemph, gainSynthDeemph_e, &gainCNG, &gainCNG_e ); -#ifndef IVAS_CODE_CNG_FIX185_PLC_FADEOUT test(); IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && A_cng != NULL ) { @@ -1705,7 +1557,6 @@ void con_tcx_ivas_fx( gainCNG = extract_l( Mpy_32_32( gainCNG, L_tmp ) ); /*Q15-gainCNG_e*/ } } -#endif } ELSE { @@ -1862,9 +1713,10 @@ void con_tcx_ivas_fx( syn = buf + M; /*Q_syn*/ Copy( synth - M, buf, M ); /*Q_syn*/ - new_Q = sub( Q_exc, 3 ); + scf = norm_s( tmp_deemph ); + new_Q = sub( Q_exc, 4 ); // deemph_fx filter gain can be up to 10 (~2^3.32), so 4 bits of headroom are needed to avoid overflow new_Q = s_max( new_Q, -1 ); - new_Q = s_min( new_Q, norm_s( tmp_deemph ) ); + new_Q = s_min( new_Q, scf ); tmp16 = s_min( new_Q, st->prev_Q_syn ); st->prev_Q_syn = new_Q; @@ -1875,14 +1727,16 @@ void con_tcx_ivas_fx( move16(); Copy_Scale_sig( buf, mem_syn, M, exp_scale ); /* Q: tmp16 */ - - tmp_deemph = shl_sat( tmp_deemph, Q_syn ); + if ( GT_16( sub( Q_syn, st->Q_syn_factor ), scf ) ) + { + Q_syn = add( scf, st->Q_syn_factor ); // so that (Q_syn - st->Q_syn_factor) = scf; + } + tmp_deemph = shl( tmp_deemph, sub( Q_syn, st->Q_syn_factor ) ); st->Q_syn = Q_syn; move16(); /*buf[OLD_EXC_SIZE_DEC;3/2 L_frame] Q1: exc*/ /*buf[0;M] Q0: mem_syn*/ -#ifndef IVAS_CODE_CNG_FIX185_PLC_FADEOUT IF( A_cng != NULL ) { Word16 alpha_delayed; @@ -1901,7 +1755,7 @@ void con_tcx_ivas_fx( alpha_inv = sub( 16384 /*Q.0f in Q14*/, alpha_delayed ); /*Q14*/ - E_LPC_a_lsp_conversion( A_local, lsp_local, lsp_local, M ); + E_LPC_a_lsp_conversion( A_local, lsp_local, st->lspold_cng, M ); FOR( i = 0; i < M; i++ ) { @@ -1914,7 +1768,6 @@ void con_tcx_ivas_fx( E_LPC_f_lsp_a_conversion( lsp_fade, A_local, M ); } } -#endif E_UTIL_synthesis( sub( Q_exc, Q_syn ), @@ -1943,10 +1796,10 @@ void con_tcx_ivas_fx( /* Deemphasis and output synth and ZIR */ deemph_fx( syn, st->preemph_fac, add( L_frame, shr( L_frame, 1 ) ), &tmp_deemph ); - bufferCopyFx( syn + sub( L_frame, M + 1 ), st->syn, 1 + M, Q_syn, 0, 0, 0 ); /*Q_syn*/ - lerp( syn + sub( L_frame, shr( L_frame, 1 ) ), hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); + hTcxDec->Q_old_syn_Overl = Q_syn; + move16(); Copy( syn + sub( L_frame, n ), hHQ_core->old_out_fx, sub( L_frame, n ) ); /*Q_syn*/ FOR( i = 0; i < W12; i++ ) @@ -1965,13 +1818,22 @@ void con_tcx_ivas_fx( hHQ_core->Q_old_wtda = Q_syn; move16(); - /* As long as there is no synth scaling factor introduced, which - is given to the outside, there might occur overflows here */ - BASOP_SATURATE_WARNING_OFF_EVS - bufferCopyFx( syn, synth, L_frame, Q_syn, 0, 0, 0 ); /*Q_syn*/ - BASOP_SATURATE_WARNING_ON_EVS + scf = add( getScaleFactor16( syn, L_frame ), Q_syn ); + IF( LT_16( scf, 0 ) ) // Only avoid left shift in bufferCopyFX when overflow could occur + { + st->Q_syn_factor = scf; + } + ELSE + { + st->Q_syn_factor = 0; + move16(); + } + bufferCopyFx( syn, synth, L_frame, Q_syn, st->Q_syn_factor, 0, 0 ); - Copy_Scale_sig( syn + L_frame, hTcxDec->syn_OverlFB, shr( L_frame, 1 ), negate( Q_syn ) ); /*Q0*/ + bufferCopyFx( syn + sub( L_frame, M + 1 ), st->syn, 1 + M, Q_syn, st->Q_syn_factor, 0, 0 ); + + Copy_Scale_sig( syn + L_frame, hTcxDec->syn_OverlFB, shr( L_frame, 1 ), sub( st->Q_syn_factor, Q_syn ) ); + hTcxDec->Q_syn_OverlFB = st->Q_syn_factor; /* copy total excitation exc2 as 16kHz for acelp mode1 decoding */ IF( st->hWIDec != NULL ) @@ -1986,9 +1848,8 @@ void con_tcx_ivas_fx( move16(); /* create aliasing and windowing need for transition to TCX10/5 */ - // bufferCopyFx( syn + L_frame, hTcxDec->syn_Overl_TDACFB, shr( L_frame, 1 ), Q_syn, 0, -1, 0 ); - Copy_Scale_sig( syn + L_frame, hTcxDec->syn_Overl_TDACFB, shr( L_frame, 1 ), sub( Q_syn, 1 ) ); - hTcxDec->Q_syn_Overl_TDACFB = sub( Q_syn, 1 ); + Copy( syn + L_frame, hTcxDec->syn_Overl_TDACFB, shr( L_frame, 1 ) ); + hTcxDec->Q_syn_Overl_TDACFB = Q_syn; move16(); FOR( i = 0; i < W12; i++ ) @@ -2035,14 +1896,14 @@ void con_tcx_ivas_fx( /* update memory for low band */ st->Q_syn = Q_syn; move16(); - Scale_sig( hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, Q_syn ) ); /*Q_syn*/ - st->hTcxDec->Q_old_syn_Overl = -1; lerp( hTcxDec->syn_OverlFB, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); + hTcxDec->Q_syn_Overl = hTcxDec->Q_syn_OverlFB; + move16(); lerp( hTcxDec->syn_Overl_TDACFB, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB; move16(); lerp( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_LB_fx, st->L_frame, L_frame ); - st->hHQ_core->Q_old_wtda_LB = Q_syn; + st->hHQ_core->Q_old_wtda_LB = Q_syn; // st->hHQ_core->Q_old_wtda st->old_enr_LP = Enr_1_Az_fx( A_local, L_SUBFR ); /*Q3*/ move16(); diff --git a/lib_dec/er_scale_syn_fx.c b/lib_dec/er_scale_syn_fx.c index 35ad826486d758fbbaa190df3afa1374320fc238..efe8aa965db7cba30a334469326fa52d453b8cc2 100644 --- a/lib_dec/er_scale_syn_fx.c +++ b/lib_dec/er_scale_syn_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /*This file is up to date with trunk rev 36531*/ @@ -33,10 +33,6 @@ Word16 Damping_fact_fx( /* o : damping factor Word32 lp_tmp; Word16 s_gainp; Word32 gain32; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif IF( core == ACELP_CORE ) @@ -97,10 +93,10 @@ Word16 Damping_fact_fx( /* o : damping factor move16(); gain32 = Sqrt32( lp_tmp, &s_gainp ); /*Q31-s_gainp*/ - gain = round_fx_o( L_shl_o( gain32, s_gainp, &Overflow ), &Overflow ); /* Q15*/ - gain = s_min( gain, 32113 /*0.98f Q15*/ ); /*Q15*/ - gain = s_max( gain, 27853 /*0.85f Q15*/ ); /*Q15*/ - alpha = mult_r( alpha, gain ); /*Q14*/ + gain = round_fx_sat( L_shl_sat( gain32, s_gainp ) ); /* Q15*/ + gain = s_min( gain, 32113 /*0.98f Q15*/ ); /*Q15*/ + gain = s_max( gain, 27853 /*0.85f Q15*/ ); /*Q15*/ + alpha = mult_r( alpha, gain ); /*Q14*/ } ELSE IF( EQ_16( nbLostCmpt, 2 ) ) { diff --git a/lib_dec/er_sync_exc_fx.c b/lib_dec/er_sync_exc_fx.c index 48be80d43cecd12d70b57d6f2d4d8a47c93cbe3a..22224f35e2971f2f6f73905f26500b318529b930 100644 --- a/lib_dec/er_sync_exc_fx.c +++ b/lib_dec/er_sync_exc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /*This BASOP port is up to date with trunk rev. 36554*/ @@ -30,10 +30,6 @@ static Word16 GetMinimumPosition_fx( Word16 iMinEnergyPos, center, i; Word16 cnt, tmp_e, tmp16; Word32 energy, energy_old, tmptest; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif filterLength = s_min( filterLength, length ); /*Q0*/ center = shr( filterLength, 1 ); /*Q0*/ @@ -60,8 +56,9 @@ static Word16 GetMinimumPosition_fx( BASOP_SATURATE_WARNING_ON_EVS /*if (energy == MAXVAL_WORD32)*/ - BASOP_SATURATE_WARNING_OFF_EVS /*saturates if energy < 0*/ - tmptest = L_sub_o( energy, MAXVAL_WORD32, &Overflow ); /*Q31*/ + BASOP_SATURATE_WARNING_OFF_EVS /*saturates if energy < 0*/ + tmptest = L_sub_sat( energy, MAXVAL_WORD32 ); + /*Q31*/ BASOP_SATURATE_WARNING_ON_EVS IF( tmptest == 0 ) { @@ -227,10 +224,6 @@ void PulseResynchronization_fx( Word16 /*int*/ roundedPitchStart, nSamplesDelta, nSamplesDeltaRemain, iMinPos1, iMinPos[NB_PULSES_MAX + 1], iDeltaSamples[NB_PULSES_MAX + 1], maxDeltaSamples, roundedCycleDelta; Word16 tmp16, tmp16_a, freqStart_e /*exponent of freqStart*/, tmp_e, samplesDelta_e, perCycleDeltaDelta_e, cycleDelta_e, tmp2_e, tmp3_e; Word32 /* pitchDelta, */ tmp32, tmp32_a, tmp32_b, samplesDelta, absPitchDiff, cycleDelta32; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif test(); @@ -295,7 +288,7 @@ void PulseResynchronization_fx( tmp3_e = tmp2_e; move16(); tmp32_a = L_negate( tmp32_a ); - tmp32_a = L_add( L_shl_o( 1, sub( 31, tmp3_e ), &Overflow ), tmp32_a ); /*Q31,tmp3_e*/ /*tmp32_a= 1.0f-pitchStart*freqStart*/ + tmp32_a = L_add( L_shl_sat( 1, sub( 31, tmp3_e ) ), tmp32_a ); /*Q31,tmp3_e*/ /*tmp32_a= 1.0f-pitchStart*freqStart*/ tmp2_e = norm_s( nFrameLength ); tmp16_a = shl( nFrameLength, tmp2_e ); /*Q0+tmp2_e*/ tmp32_a = Mpy_32_16_1( tmp32_a /*Q31,tmp3_e*/, tmp16_a /*Q0,-tmp2_e*/ ); /*Q16,tmp3_e-tmp2_e*/ /*tmp32_a= nFrameLength*(1.0f-pitchStart*freqStart)*/ @@ -360,8 +353,8 @@ void PulseResynchronization_fx( fractionalLeft = lshr( extract_l( tmp32_a ), 1 ); /*Q15*/ tmp_e = sub( 15, norm_l( tmp32 ) ); cycleDelta_e = add( cycleDelta_e, tmp_e ); - tmp32 = L_shr( tmp32, sub( tmp_e, 15 ) ); /*Q31 frac, cycleDelta_e*/ - cycleDelta = round_fx_o( tmp32, &Overflow ); /*Q15, cycleDelta_e*/ + tmp32 = L_shr( tmp32, sub( tmp_e, 15 ) ); /*Q31 frac, cycleDelta_e*/ + cycleDelta = round_fx_sat( tmp32 ); /*Q15, cycleDelta_e*/ if ( cycleDelta == 0 ) { cycleDelta_e = 0; diff --git a/lib_dec/er_util_fx.c b/lib_dec/er_util_fx.c index 9735129ec14bc56a1aed50c894ac3cf27a087b6a..8e28dc546dec062e6312996c594534b9c502bd0f 100644 --- a/lib_dec/er_util_fx.c +++ b/lib_dec/er_util_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -44,16 +44,12 @@ void minimumStatistics_fx( Word16 f, p, i; Word16 tmp, tmp2, tmp_e; Word32 tmp32; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif aOpt_e = 0; move16(); BASOP_SATURATE_WARNING_OFF_EVS - IF( LT_16( shl_o( currentFrameLevel, currentFrameLevel_e, &Overflow ), PLC_MIN_CNG_LEV ) ) + IF( LT_16( shl_sat( currentFrameLevel, currentFrameLevel_e ), PLC_MIN_CNG_LEV ) ) { BASOP_SATURATE_WARNING_ON_EVS currentFrameLevel = PLC_MIN_CNG_LEV; /*Q15*/ @@ -579,12 +575,7 @@ Word16 GetPLCModeDecision_fx( pitch = L_add( st->old_fpitch, 0 ); /*Q16*/ } - TonalMDCTConceal_Detect( st->hTonalMDCTConc, pitch, &numIndices, st->element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - ( st->element_mode == IVAS_CPE_MDCT ? &( st->hTcxCfg->psychParamsTCX20 ) : st->hTcxCfg->psychParamsCurrent ) -#endif - ); + TonalMDCTConceal_Detect( st->hTonalMDCTConc, pitch, &numIndices, st->element_mode ); test(); test(); diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index 74340b530f6fe9cc1c2733664b854cc317f057cf..a358cbe8ad5929f44104d7a45e7e9b53bb57dc5a 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include /* Debug prototypes */ @@ -62,10 +62,6 @@ ivas_error evs_dec_fx( push_wmops( "evs_dec_fx" ); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif hBWE_TD = st_fx->hBWE_TD; hHQ_core = st_fx->hHQ_core; hTcxLtpDec = st_fx->hTcxLtpDec; @@ -167,7 +163,7 @@ ivas_error evs_dec_fx( tmp1 = extract_l( L_shr_r( f, s ) ); /*Q14 - s*/ FOR( i = 0; i < st_fx->hTcxCfg->tcx_mdct_window_lengthFB; i++ ) { - hTcxDec->syn_OverlFB[i] = shl_sat( mult_sat( tmp1, hTcxDec->syn_OverlFB[i] ), add( s, 1 ) ); /*hTcxDec->Q_syn_Overl*/ + hTcxDec->syn_OverlFB[i] = shl_sat( mult_sat( tmp1, hTcxDec->syn_OverlFB[i] ), add( s, 1 ) ); /*hTcxDec->Q_syn_OverlFB*/ move16(); } s = norm_l( f ); @@ -332,7 +328,7 @@ ivas_error evs_dec_fx( IF( EQ_16( st_fx->core, ACELP_CORE ) ) { /* ACELP core decoder */ - IF( ( error = acelp_core_dec_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) + IF( ( error = acelp_core_dec_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) { return error; } @@ -450,7 +446,7 @@ ivas_error evs_dec_fx( /*hb_synth[i] *= (i*tmp);*/ hb_synth_fx[i] = mult_r( hb_synth_fx[i], tmp16_2 ); /*hb_synth_fx_exp*/ move16(); - tmp16_2 = add_o( tmp16_2, tmp16, &Overflow ); + tmp16_2 = add_sat( tmp16_2, tmp16 ); } } @@ -953,11 +949,9 @@ ivas_error evs_dec_fx( } st_fx->lp_noise = hFdCngDec->lp_noise; /*Q9.23*/ move32(); -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - ApplyFdCng_fx( output, NULL, realBuffer, imagBuffer, st, concealWholeFrame, 0 ); -#else - ApplyFdCng_fx( output_sp, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); -#endif + + ApplyFdCng_fx( output_sp, 0, NULL, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); + /* Generate additional comfort noise to mask potential coding artefacts */ test(); IF( EQ_16( st_fx->m_frame_type, ACTIVE_FRAME ) && st_fx->flag_cna ) @@ -1026,10 +1020,8 @@ ivas_error evs_dec_fx( /* check if the CLDFB works on the right sample rate */ IF( NE_16( i_mult( st_fx->cldfbAna->no_channels, st_fx->cldfbAna->no_col ), st_fx->L_frame ) ) { - Word16 newCldfbBands = CLDFB_getNumChannels( L_mult0( st_fx->L_frame, 50 ) ); - - resampleCldfb( st_fx->cldfbAna, newCldfbBands, st_fx->L_frame, 0 ); - resampleCldfb( st_fx->cldfbBPF, newCldfbBands, st_fx->L_frame, 0 ); + resampleCldfb( st_fx->cldfbAna, L_mult0( st_fx->L_frame, FRAMES_PER_SEC ), st_fx->L_frame, 0 ); + resampleCldfb( st_fx->cldfbBPF, L_mult0( st_fx->L_frame, FRAMES_PER_SEC ), st_fx->L_frame, 0 ); } st_fx->cldfbSyn->bandsToZero = 0; @@ -1147,7 +1139,7 @@ ivas_error evs_dec_fx( FOR( i = 0; i < tmps; i++ ) { - output_sp[i + delay_comp] = msu_r_sat( L_mult_sat( output_sp[i + delay_comp], alpha ), shr( hHQ_core->old_out_fx[i + nz], timeIn_e ), add( alpha, -32768 ) ); /*timeIn_e*/ + output_sp[i + delay_comp] = msu_r_sat( L_mult_sat( output_sp[i + delay_comp], alpha ), shr_sat( hHQ_core->old_out_fx[i + nz], timeIn_e ), add( alpha, -32768 ) ); /*timeIn_e*/ move16(); alpha = add( alpha, step ); } diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index c509d5d1028b46af70fc21b31ddc1953b2e8fd10..0f8cec8e0f4c50a5b8295b2deb83c5fb930c21cd 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1,8 +1,15 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ +#include "basop32.h" +#include "cnst.h" +#include "enh1632.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "move.h" +#include "wmc_auto.h" #include #include "typedef.h" #include @@ -88,6 +95,7 @@ void initFdCngDec_ivas_fx( hFdCngDec->hFdCngCom->olapBufferAna = hFdCngDec->olapBufferAna; set16_fx( hFdCngDec->olapBufferSynth2, 0, FFTLEN ); hFdCngDec->hFdCngCom->olapBufferSynth2 = hFdCngDec->olapBufferSynth2; + set32_fx( hFdCngDec->hFdCngCom->olapBufferSynth2_fx, 0, FFTLEN ); /* Set some counters and flags */ @@ -117,7 +125,7 @@ void initFdCngDec_ivas_fx( set16_fx( hFdCngDec->msPsd, 0, NPART_SHAPING ); set32_fx( hFdCngDec->msPsd_fx, 0, NPART_SHAPING ); - set16_fx( hFdCngDec->msNoiseFloor, 0, NPART_SHAPING ); + set32_fx( hFdCngDec->msNoiseFloor_32fx, 0, NPART_SHAPING ); set32_fx( hFdCngDec->msNoiseEst, 0, NPART_SHAPING ); set16_fx( &hFdCngDec->msNoiseEst_exp, 0, 1 ); @@ -142,7 +150,7 @@ void initFdCngDec_ivas_fx( move16(); set16_fx( hFdCngDec->msLogPeriodog, 0, NPART_SHAPING ); - set16_fx( hFdCngDec->msLogNoiseEst, 0, NPART_SHAPING ); + set32_fx( hFdCngDec->msLogNoiseEst_32fx, 0, NPART_SHAPING ); set16_fx( hFdCngDec->psize_shaping, 0, NPART_SHAPING ); hFdCngDec->nFFTpart_shaping = 0; @@ -187,15 +195,13 @@ void initFdCngDec_ivas_fx( st->CNG_mode = -1; move16(); Copy( st->lsp_old_fx, st->lspCNG_fx, M ); /*Q15*/ -#ifdef MSAN_FIX hFdCngDec->hFdCngCom->sid_frame_counter = 0; -#endif return; } void initFdCngDec_fx( DEC_CORE_HANDLE st, /* i/o: decoder state structure */ - Word16 scale /*Q15*/ ) + const Word16 scale /*Q15*/ ) { /* Initialize common */ HANDLE_FD_CNG_DEC hFdCngDec; @@ -556,571 +562,8 @@ void deleteFdCngDec_fx( HANDLE_FD_CNG_DEC *hFdCngDec ) Returns: error */ -Word16 ApplyFdCng_fx( - Word16 *timeDomainInput, /* i : pointer to time domain input Q*/ - Word16 Q, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - Word16 *powerSpectrum, -#endif - Word32 **cldfbBufferReal, /* i/o: real part of the CLDFB buffer cldfbBufferScale*/ - Word32 **cldfbBufferImag, /* i/o: imaginary part of the CLDFB buffer cldfbBufferScale*/ - Word16 *cldfbBufferScale, /* o : pointer to the scalefactor for real and imaginary part of the CLDFB buffer */ - Decoder_State *st, - const Word16 concealWholeFrame, /* i : binary flag indicating frame loss Q0*/ - Word16 is_music /*Q0*/ ) -{ - Word16 j, k, nBins; - Word16 s, s1, s2, num, denom; - Word32 *cngNoiseLevel; - Word16 *cngNoiseLevel_exp; - Word32 L_tmp; - Word16 L_tmp_exp; - Word16 facTab[NPART]; - Word16 facTabExp[NPART]; - Word16 tmp_loop; - Word32 L_c; - Word16 lsp_cng[M]; - HANDLE_FD_CNG_DEC hFdCngDec; - HANDLE_FD_CNG_COM hFdCngCom; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; - move16(); - move16(); -#endif -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - int16_t L_frame, last_L_frame; - int32_t sr_core; - - PMT( "Fix point code missing for IVAS_CODE_CNG_FIX185_PLC_FADEOUT" ) - /* limit L_frame and core fs values for MDCT-Stereo modes which can have higher core sampling than 16kHz, but use a downsampled buffer */ - L_frame = min( st->L_frame, L_FRAME16k ); - last_L_frame = min( st->last_L_frame, L_FRAME16k ); - sr_core = min( st->sr_core, INT_FS_16k ); -#endif - - hFdCngDec = st->hFdCngDec; - hFdCngCom = hFdCngDec->hFdCngCom; - - - if ( EQ_16( hFdCngCom->frame_type_previous, ACTIVE_FRAME ) ) - { - hFdCngCom->inactive_frame_counter = 0; - move16(); - } - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - hFdCngDec->flag_dtx_mode = hFdCngDec->flag_dtx_mode || st->first_CNG; - test(); - move16(); - } - cngNoiseLevel = hFdCngCom->cngNoiseLevel; /*Q31 - hFdCngCom->cngNoiseLevelExp*/ - move32(); - cngNoiseLevel_exp = &hFdCngCom->cngNoiseLevelExp; - move16(); - nBins = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - - SWITCH( st->m_frame_type ) - { - case ACTIVE_FRAME: - - /************************** - * ACTIVE_FRAME at DECODER * - **************************/ - - hFdCngCom->inactive_frame_counter = 0; - move16(); - hFdCngCom->sid_frame_counter = 0; - move16(); - - /* set noise estimation inactive during concealment, as no update with noise generated by concealment should be performed. */ - /* set noise estimation inactive during concealment, no update with noise generated by concealment should be performed. */ - -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - if ( concealWholeFrame == 0 && - ( timeDomainInput == NULL || - ( *timeDomainInput( -FLT_MAX ) && - *( timeDomainInput + hFdCngCom->frameSize - 1 ) < FLT_MAX && - *( timeDomainInput + hFdCngCom->frameSize - 1 ) > ( -FLT_MAX ) ) ) && - ( ( ( ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT && hFdCngDec->flag_dtx_mode ) || !st->VAD ) && - !( st->cng_type == LP_CNG && hFdCngDec->flag_dtx_mode ) && ( is_music == 0 ) ) || - ( st->element_mode == IVAS_CPE_TD ) ) && - ( !st->BER_detect ) ) -#else - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( - ( concealWholeFrame == 0 ) && - ( LT_16( *timeDomainInput, MAXVAL_WORD16 ) ) && GT_16( *timeDomainInput, MINVAL_WORD16 ) && ( LT_16( *( timeDomainInput + sub( hFdCngCom->frameSize, 1 ) ), MAXVAL_WORD16 ) ) && GT_16( *( timeDomainInput + sub( hFdCngCom->frameSize, 1 ) ), MINVAL_WORD16 ) && ( ( ( hFdCngDec->flag_dtx_mode == 0 ) && ( st->VAD != 0 ) ) == 0 ) && ( ( ( st->cng_type == LP_CNG ) && ( hFdCngDec->flag_dtx_mode != 0 ) ) == 0 ) && ( is_music == 0 ) && ( st->BER_detect == 0 ) ) -#endif - { - /* Perform noise estimation at the decoder */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - perform_noise_estimation_dec_fx( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); -#else - perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); -#endif - - /* Update the shaping parameters */ - test(); - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) - { - scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); - } - hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; - move16(); - - - /* Update CNG levels */ - test(); - IF( hFdCngDec->flag_dtx_mode != 0 && EQ_16( st->cng_type, FD_CNG ) ) - { - /* This needs to be done only once per inactive phase */ - bandcombinepow( - hFdCngDec->bandNoiseShape, - hFdCngDec->bandNoiseShape_exp, - nBins, - hFdCngCom->part, - hFdCngCom->nFFTpart, - hFdCngCom->psize_inv, - hFdCngDec->partNoiseShape, - &hFdCngDec->partNoiseShape_exp ); - - - j = 0; - move16(); - s2 = -( WORD32_BITS - 1 ); - move16(); - FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) - { - assert( hFdCngDec->partNoiseShape[k] >= 0 ); - assert( hFdCngCom->sidNoiseEst[k] >= 0 ); - - /* add DELTA as it is done in FLC version, in order to avoid num > denom */ - facTab[k] = 0; - move16(); - IF( hFdCngDec->partNoiseShape[k] != 0 ) - { - s1 = norm_l( hFdCngCom->sidNoiseEst[k] ); - L_tmp = L_shl( hFdCngCom->sidNoiseEst[k], s1 ); /*Q31 - hFdCngCom->sidNoiseEstExp + s1*/ - L_tmp_exp = sub( hFdCngCom->sidNoiseEstExp, s1 ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_exp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); - L_tmp = L_shr( L_tmp, 1 ); - s = add( L_tmp_exp, 1 ); - num = extract_h( L_tmp ); /*Q15 - L_tmp_exp*/ - - s1 = norm_l( hFdCngDec->partNoiseShape[k] ); - L_tmp = L_shl( hFdCngDec->partNoiseShape[k], s1 ); /*Q31 - hFdCngDec->partNoiseShape_exp + s1*/ - L_tmp_exp = sub( hFdCngDec->partNoiseShape_exp, s1 ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_exp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); - s = sub( s, L_tmp_exp ); - denom = extract_h( L_tmp ); /*Q15 - L_tmp_exp*/ - - facTab[k] = div_s( num, denom ); /*Q15 - s*/ - move16(); - facTabExp[k] = s; - move16(); - } - /* Set unique exponent, if mantissa is equal to zero */ - if ( facTab[k] == 0 ) - { - facTabExp[k] = -( WORD32_BITS - 1 ); - move16(); - } - s2 = s_max( s2, facTabExp[k] ); - } - - FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) - { - s = sub( facTabExp[k], s2 ); - s = s_max( s_min( s, WORD32_BITS - 1 ), -( WORD32_BITS - 1 ) ); - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { - cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ - move32(); - } - } - - /* adapt scaling for rest of the buffer */ - IF( NE_16( s2, -( WORD32_BITS - 1 ) ) ) - { - s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) ); - FOR( ; k < hFdCngCom->npart; k++ ) - { - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { - cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], s ); /*Q31 - hFdCngDec->bandNoiseShape_exp + s*/ - move32(); - } - } - - *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 ); - move16(); - } - } - ELSE - { - /* This sets the new CNG levels until a SID update overwrites it */ - test(); - test(); - test(); - IF( !( EQ_16( st->element_mode, IVAS_CPE_TD ) ) || ( EQ_16( st->element_mode, IVAS_CPE_TD ) && !hFdCngDec->flag_dtx_mode && !st->VAD ) ) - { - Copy32( hFdCngDec->bandNoiseShape, cngNoiseLevel, nBins ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ - *cngNoiseLevel_exp = hFdCngDec->bandNoiseShape_exp; - move16(); - } - } -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - if ( st->element_mode == IVAS_CPE_MDCT && timeDomainInput == NULL ) - { - st->hTcxDec->CngLevelBackgroundTrace_bfi = sqrtf( sum_f( cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / NORM_MDCT_FACTOR ); - } - else - { - st->hTcxDec->CngLevelBackgroundTrace_bfi = (float) sqrt( ( sum_f( cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2 * hFdCngCom->fftlen ) / L_frame ); - } -#endif - /*st->cngTDLevel = (float)sqrt( (sumFLOAT(cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand) / 2 * hFdCngCom->fftlen) / st->Mode2_L_frame);*/ - tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - L_tmp = L_deposit_h( 0 ); - L_c = L_deposit_h( 0 ); - FOR( j = 0; j < tmp_loop; j++ ) - { - - Carry = 0; - move16(); - L_tmp = L_add_co( L_tmp, *( cngNoiseLevel + j ), &Carry, &Overflow ); /*Q31*/ - Overflow = 0; - move16(); - - IF( *( cngNoiseLevel + j ) < 0 ) - { - L_c = L_msuNs( L_c, 0, 0 ); /*Q-1*/ - } - IF( *( cngNoiseLevel + j ) >= 0 ) - { - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } - } - L_tmp = norm_llQ31( L_c, L_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/ - L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 ); - - L_tmp = Mpy_32_16_1( L_tmp, hFdCngCom->fftlen ); /*Q16 - L_tmp_exp*/ - - L_tmp = Mpy_32_16_1( L_tmp, T_DIV_L_Frame[L_shl( L_mac( -28000, st->L_frame, 95 ), 1 - 15 )] ); /*Q16,exp -7*/ - L_tmp_exp = add( L_tmp_exp, -7 ); /*->Q16, L_tmp_exp */ - L_tmp_exp = add( L_tmp_exp, 31 - 16 ); /*->Q31, L_tmp_exp*/ - - st->cngTDLevel = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/ - st->cngTDLevel_e = L_tmp_exp; - move16(); - } - ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) || EQ_16( st->element_mode, IVAS_CPE_DFT ) ) - { - IF( hFdCngCom->active_frame_counter > 0 ) - { - /* Perform noise estimation in active frames in the decoder for downward updates */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - perform_noise_estimation_dec_fx( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); -#else - perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); -#endif - } - } - test(); - test(); - L_tmp = 0; - FOR( j = hFdCngCom->startBand; j < hFdCngCom->stopFFTbin; j++ ) - { - L_tmp = L_add( L_tmp, L_shr( cngNoiseLevel[j], 16 ) ); - } - L_tmp_exp = add( *cngNoiseLevel_exp, 16 ); - test(); - test(); - IF( EQ_16( concealWholeFrame, 1 ) && EQ_16( st->nbLostCmpt, 1 ) && ( GT_32( L_shl_o( L_tmp, L_tmp_exp, &Overflow ), 21474836 ) /*0.01f Q31*/ ) ) - { - /* update isf cng estimate for concealment. Do that during concealment, in order to avoid addition clean channel complexity*/ -#ifndef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, 0 ); - E_LPC_a_lsp_conversion( hFdCngCom->A_cng, lsp_cng, st->lspold_cng, M ); - Copy( lsp_cng, st->lspold_cng, M ); /*Q15*/ - - lsp2lsf_fx( lsp_cng, st->lsf_cng, M, st->sr_core ); -#else - if ( st->element_mode == IVAS_CPE_MDCT && st->core != ACELP_CORE ) - { - float scf[SNS_NPTS]; - float scf_int[FDNS_NPTS]; - float whitenend_noise_shape[L_FRAME16k]; - int16_t inc, start_idx, stop_idx; - float *noiseLevelPtr; - - - inc = ( st->core > TCX_20 ) ? 2 : 1; - start_idx = hFdCngCom->startBand / inc; - stop_idx = L_frame / inc; - noiseLevelPtr = cngNoiseLevel; - - set_zero( whitenend_noise_shape, start_idx ); - for ( j = start_idx; j < stop_idx; j++, noiseLevelPtr += inc ) - { - whitenend_noise_shape[j] = *noiseLevelPtr; - } - if ( st->core == TCX_20_CORE ) - { - st->hTonalMDCTConc->psychParams = &st->hTonalMDCTConc->psychParamsTCX20; - } - else - { - st->hTonalMDCTConc->psychParams = &st->hTonalMDCTConc->psychParamsTCX10; - } - - sns_compute_scf( whitenend_noise_shape, st->hTonalMDCTConc->psychParams, L_frame, scf ); - sns_interpolate_scalefactors( scf_int, scf, ENC ); - sns_interpolate_scalefactors( st->hTonalMDCTConc->scaleFactorsBackground_flt, scf, DEC ); - sns_shape_spectrum( whitenend_noise_shape, st->hTonalMDCTConc->psychParams, scf_int, L_frame ); - - mvr2r( whitenend_noise_shape + start_idx, cngNoiseLevel, stop_idx - start_idx ); - wmops_sub_end(); - } - else if ( st->element_mode != IVAS_CPE_MDCT ) - { - lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, 0.f ); - a2lsp_stab( hFdCngCom->A_cng, lsp_cng, st->lspold_cng ); - mvr2r( lsp_cng, st->lspold_cng, M ); - lsp2lsf( lsp_cng, st->lsf_cng, M, sr_core ); - } - -#endif - st->plcBackgroundNoiseUpdated = 1; - move16(); - } - BREAK; - - case SID_FRAME: - - hFdCngDec->flag_dtx_mode = 1; - move16(); - /* no break */ - - case ZERO_FRAME: - - test(); - IF( st != NULL && st->cng_type == LP_CNG ) - { - /* Perform noise estimation on inactive phase at the decoder */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - perform_noise_estimation_dec_fx( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); -#else - perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); -#endif - /* Update the shaping parameters */ - - test(); - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) - { - scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); - } - hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; - move16(); - /* This sets the new CNG levels until a SID update overwrites it */ - Copy32( hFdCngDec->bandNoiseShape, cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); /* This sets the new CNG levels until a SID update overwrites it Q31 - hFdCngDec->bandNoiseShape_exp*/ - *cngNoiseLevel_exp = hFdCngDec->bandNoiseShape_exp; - move16(); -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - st->cngTDLevel = (float) sqrt( ( sum_f( cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2 * hFdCngCom->fftlen ) / L_frame ); -#else - /*st->cngTDLevel = (float)sqrt( (sumFLOAT(cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand) / 2 * hFdCngCom->fftlen) / st->Mode2_L_frame);*/ - tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - L_tmp = L_deposit_h( 0 ); - L_c = L_deposit_h( 0 ); - FOR( j = 0; j < tmp_loop; j++ ) - { - - Carry = 0; - move16(); - L_tmp = L_add_co( L_tmp, *( cngNoiseLevel + j ), &Carry, &Overflow ); /*Q31*/ - Overflow = 0; - move16(); - - IF( *( cngNoiseLevel + j ) < 0 ) - { - L_c = L_msuNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } - IF( *( cngNoiseLevel + j ) >= 0 ) - { - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } - } - L_tmp = norm_llQ31( L_c, L_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/ - L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 ); - - L_tmp = Mpy_32_16_1( L_tmp, hFdCngCom->fftlen ); /*Q16 - L_tmp_exp*/ - - L_tmp = Mpy_32_16_1( L_tmp, T_DIV_L_Frame[L_shl( L_mac( -28000, st->L_frame, 95 ), 1 - 15 )] ); /*Q16,exp -7*/ - L_tmp_exp = add( L_tmp_exp, -7 ); /*->Q16, L_tmp_exp */ - L_tmp_exp = add( L_tmp_exp, 31 - 16 ); /*->Q31, L_tmp_exp*/ - - st->cngTDLevel = round_fx_o( Sqrt32( L_tmp, &L_tmp_exp ), &Overflow ); /*Q15 - L_tmp_exp*/ - move16(); - st->cngTDLevel_e = L_tmp_exp; - move16(); -#endif - BREAK; - } - hFdCngCom->inactive_frame_counter = add( hFdCngCom->inactive_frame_counter, 1 ); - move16(); - - /************************************* - * SID_FRAME or ZERO_FRAME at DECODER * - *************************************/ - - /* Detect first non-active frame */ - IF( EQ_16( hFdCngCom->inactive_frame_counter, 1 ) ) - { - /* Compute the fine spectral structure of the comfort noise shape using the decoder-side noise estimates */ - bandcombinepow( - hFdCngDec->bandNoiseShape, - hFdCngDec->bandNoiseShape_exp, - nBins, - hFdCngCom->part, - hFdCngCom->nFFTpart, - hFdCngCom->psize_inv, - hFdCngDec->partNoiseShape, - &hFdCngDec->partNoiseShape_exp ); - } - - IF( EQ_16( st->m_frame_type, SID_FRAME ) ) - { - IF( LT_32( hFdCngCom->msFrCnt_init_counter, L_deposit_l( hFdCngCom->msFrCnt_init_thresh ) ) ) - { - /* At initialization, interpolate the bin/band-wise levels from the partition levels */ - scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, - hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); - *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; - move16(); - } - ELSE - { - if ( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) - { - } - - /* Interpolate the CLDFB band levels from the SID (partition) levels */ - IF( GT_16( hFdCngCom->regularStopBand, hFdCngCom->numCoreBands ) ) - { - scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, - hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); - - *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; - move16(); - } - - s2 = -( WORD32_BITS - 1 ); - move16(); - /* Shape the SID noise levels in each FFT bin */ - j = 0; - move16(); - FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) - { - assert( hFdCngDec->partNoiseShape[k] >= 0 ); - - /* add DELTA as it is done in FLC version, in order to avoid num > denom */ - facTab[k] = 0; - move16(); - IF( hFdCngDec->partNoiseShape[k] != 0 ) - { - s1 = norm_l( hFdCngCom->sidNoiseEst[k] ); - L_tmp = L_shl( hFdCngCom->sidNoiseEst[k], s1 ); /*Q31 - hFdCngCom->sidNoiseEstExp + s1*/ - L_tmp_exp = sub( hFdCngCom->sidNoiseEstExp, s1 ); - L_tmp = BASOP_Util_Add_Mant32Exp( hFdCngCom->sidNoiseEst[k], hFdCngCom->sidNoiseEstExp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); - L_tmp = L_shr( L_tmp, 1 ); - s = add( L_tmp_exp, 1 ); - num = extract_h( L_tmp ); /*Q15 - L_tmp_exp*/ - - s1 = norm_l( hFdCngDec->partNoiseShape[k] ); - L_tmp = L_shl( hFdCngDec->partNoiseShape[k], s1 ); /*Q31 - hFdCngDec->partNoiseShape_exp + s1*/ - L_tmp_exp = sub( hFdCngDec->partNoiseShape_exp, s1 ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_exp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); - s = sub( s, L_tmp_exp ); - denom = extract_h( L_tmp ); /*Q15 - L_tmp_exp*/ - - facTab[k] = div_s( num, denom ); /*Q15 - s*/ - move16(); - facTabExp[k] = s; - move16(); - } - /* Set unique exponent, if mantissa is equal to zero */ - if ( facTab[k] == 0 ) - { - facTabExp[k] = -( WORD32_BITS - 1 ); - move16(); - } - s2 = s_max( s2, facTabExp[k] ); - } - FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) - { - s = sub( facTabExp[k], s2 ); - s = s_max( s_min( s, WORD32_BITS - 1 ), -( WORD32_BITS - 1 ) ); - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { - cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ - move32(); - } - } - /* adapt scaling for rest of the buffer */ - s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) ); - FOR( ; k < hFdCngCom->npart; k++ ) - { - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { - cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], s ); /*Q31 - hFdCngDec->bandNoiseShape_exp + s*/ - move32(); - } - } - *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 ); - move16(); - } - } - - IF( EQ_16( st->codec_mode, MODE2 ) ) - { - /* Generate comfort noise during SID or zero frames */ - generate_comfort_noise_dec_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); - } - - BREAK; - - default: - return -1; - } - - - return 0; -} - -Word16 ApplyFdCng_ivas_fx( +Word16 ApplyFdCng_fx( Word16 *timeDomainInput, /* i : pointer to time domain input Q*/ Word16 Q, Word32 *powerSpectrum, /*Q_power_spectrum*/ @@ -1141,16 +584,11 @@ Word16 ApplyFdCng_ivas_fx( Word16 facTab[NPART]; Word16 facTabExp[NPART]; Word16 tmp_loop; - Word32 L_c; Word16 lsp_cng[M]; HANDLE_FD_CNG_DEC hFdCngDec; HANDLE_FD_CNG_COM hFdCngCom; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; move16(); move16(); -#endif Word16 L_frame, last_L_frame; hFdCngDec = st->hFdCngDec; @@ -1222,11 +660,22 @@ Word16 ApplyFdCng_ivas_fx( ( !st->BER_detect ) ) { /* Perform noise estimation at the decoder */ - perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); + } + ELSE + { + perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + } /* Update the shaping parameters */ test(); - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); + } + ELSE IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); } @@ -1320,13 +769,10 @@ Word16 ApplyFdCng_ivas_fx( e_shift = sub( s, q_norm ); } } - FOR( ; k < hFdCngCom->npart; k++ ) + FOR( ; j < FFTCLDFBLEN; j++ ) { - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { - cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], sub( s, e_shift ) ); /*Q: s*/ - move32(); - } + cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], sub( s, e_shift ) ); /*Q: s*/ + move32(); } *cngNoiseLevel_exp = add( add( hFdCngDec->bandNoiseShape_exp, s2 ), e_shift ); @@ -1351,34 +797,13 @@ Word16 ApplyFdCng_ivas_fx( { tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - L_tmp = L_deposit_h( 0 ); - L_c = L_deposit_h( 0 ); - FOR( j = 0; j < tmp_loop; j++ ) - { - - Carry = 0; - move16(); - L_tmp = L_add_co( L_tmp, *( cngNoiseLevel + j ), &Carry, &Overflow ); /*Q31*/ - Overflow = 0; - move16(); - - IF( *( cngNoiseLevel + j ) < 0 ) - { - L_c = L_msuNs( L_c, 0, 0 ); /*Q-1*/ - } - IF( *( cngNoiseLevel + j ) >= 0 ) - { - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } - } - L_tmp = norm_llQ31( L_c, L_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/ + L_tmp = sum_array_norm( cngNoiseLevel, tmp_loop, &L_tmp_exp ); /*Q31 - L_tmp_exp*/ L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 ); - L_tmp = Mpy_32_16_1( L_tmp, 1 ); /*Q16 - L_tmp_exp*/ + L_tmp = L_shr( L_tmp, 15 ); /*Q16 - L_tmp_exp*/ L_tmp = Mpy_32_16_1( L_tmp, shr( T_DIV_L_Frame[L_shl( L_mac( -28000, NORM_MDCT_FACTOR, 95 ), 1 - 15 )], 1 ) ); /*Q16,exp -7*/ - L_tmp_exp = add( L_tmp_exp, -7 ); /*->Q16, L_tmp_exp */ - L_tmp_exp = add( L_tmp_exp, 31 - 16 ); /*->Q31, L_tmp_exp*/ + L_tmp_exp = add( L_tmp_exp, -7 + ( 31 - 16 ) ); /*->Q31, L_tmp_exp*/ st->hTcxDec->conCngLevelBackgroundTrace = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/ move16(); @@ -1387,37 +812,17 @@ Word16 ApplyFdCng_ivas_fx( move16(); } ELSE - { - - tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - L_tmp = L_deposit_h( 0 ); - L_c = L_deposit_h( 0 ); - FOR( j = 0; j < tmp_loop; j++ ) - { - - Carry = 0; - move16(); - L_tmp = L_add_co( L_tmp, *( cngNoiseLevel + j ), &Carry, &Overflow ); /*Q31 - L_tmp_exp*/ - Overflow = 0; - move16(); - - IF( *( cngNoiseLevel + j ) < 0 ) - { - L_c = L_msuNs( L_c, 0, 0 ); /*Q-1*/ - } - IF( *( cngNoiseLevel + j ) >= 0 ) - { - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } - } - L_tmp = norm_llQ31( L_c, L_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/ + { + + tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); + L_tmp = sum_array_norm( cngNoiseLevel, tmp_loop, &L_tmp_exp ); L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 ); L_tmp = Mpy_32_16_1( L_tmp, hFdCngCom->fftlen ); /*Q16 - L_tmp_exp*/ L_tmp = Mpy_32_16_1( L_tmp, T_DIV_L_Frame[L_shl( L_mac( -28000, st->L_frame, 95 ), 1 - 15 )] ); /*Q16,exp -7*/ - L_tmp_exp = add( L_tmp_exp, -7 ); /*->Q16, L_tmp_exp */ - L_tmp_exp = add( L_tmp_exp, 31 - 16 ); /*->Q31, L_tmp_exp*/ + L_tmp_exp = add( L_tmp_exp, -7 + ( 31 - 16 ) ); /*->Q31, L_tmp_exp*/ + st->hTcxDec->conCngLevelBackgroundTrace = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/ move16(); @@ -1426,37 +831,17 @@ Word16 ApplyFdCng_ivas_fx( } tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - L_tmp = L_deposit_h( 0 ); - L_c = L_deposit_h( 0 ); - FOR( j = 0; j < tmp_loop; j++ ) - { - - Carry = 0; - move16(); - L_tmp = L_add_co( L_tmp, *( cngNoiseLevel + j ), &Carry, &Overflow ); /*Q31 - L_tmp_exp*/ - Overflow = 0; - move16(); - - IF( *( cngNoiseLevel + j ) < 0 ) - { - L_c = L_msuNs( L_c, 0, 0 ); /*Q-1*/ - } - IF( *( cngNoiseLevel + j ) >= 0 ) - { - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } - } - L_tmp = norm_llQ31( L_c, L_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/ + L_tmp = sum_array_norm( cngNoiseLevel, tmp_loop, &L_tmp_exp ); /*Q31 - L_tmp_exp*/ L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 ); L_tmp = Mpy_32_16_1( L_tmp, hFdCngCom->fftlen ); /*Q16 - L_tmp_exp*/ - L_tmp = Mpy_32_16_1( L_tmp, T_DIV_L_Frame[L_shl( L_mac( -28000, st->L_frame, 95 ), 1 - 15 )] ); /*Q16,exp -7*/ - L_tmp_exp = add( L_tmp_exp, -7 ); /*->Q16, L_tmp_exp */ - L_tmp_exp = add( L_tmp_exp, 31 - 16 ); /*->Q31, L_tmp_exp*/ + L_tmp = Mpy_32_16_1( L_tmp, T_DIV_L_Frame[L_shr( L_mac( -28000, st->L_frame, 95 ), 15 - 1 )] ); /*Q16,exp -7*/ + L_tmp_exp = add( L_tmp_exp, -7 + ( 31 - 16 ) ); /*->Q31, L_tmp_exp */ st->cngTDLevel = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/ move16(); + st->cngTDLevel_e = L_tmp_exp; move16(); } @@ -1465,7 +850,14 @@ Word16 ApplyFdCng_ivas_fx( IF( hFdCngCom->active_frame_counter > 0 ) { /* Perform noise estimation in active frames in the decoder for downward updates */ - perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); + } + ELSE + { + perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + } } } @@ -1488,7 +880,7 @@ Word16 ApplyFdCng_ivas_fx( } L_tmp_exp = 0; move16(); - IF( GT_32( L_shl_o( L_tmp, L_tmp_exp, &Overflow ), 21474836 ) /*0.01f Q31*/ ) + IF( GT_32( L_tmp, 21474836 ) /*0.01f Q31*/ ) { test(); test(); @@ -1523,54 +915,60 @@ Word16 ApplyFdCng_ivas_fx( IF( st != NULL && EQ_16( st->cng_type, LP_CNG ) ) { /* Perform noise estimation on inactive phase at the decoder */ - perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); + } + ELSE + { + perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + } /* Update the shaping parameters */ - test(); - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); + } + ELSE IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); } hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; move16(); + /* This sets the new CNG levels until a SID update overwrites it */ Copy32( hFdCngDec->bandNoiseShape, cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); /* This sets the new CNG levels until a SID update overwrites it */ /*Q31 - hFdCngDec->bandNoiseShape_exp*/ - *cngNoiseLevel_exp = hFdCngDec->bandNoiseShape_exp; - move16(); - /*st->cngTDLevel = (float)sqrt( (sumFLOAT(cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand) / 2 * hFdCngCom->fftlen) / st->Mode2_L_frame);*/ - tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - L_tmp = L_deposit_h( 0 ); - L_c = L_deposit_h( 0 ); - FOR( j = 0; j < tmp_loop; j++ ) + IF( EQ_16( st->element_mode, EVS_MONO ) ) { - - Carry = 0; - move16(); - L_tmp = L_add_co( L_tmp, *( cngNoiseLevel + j ), &Carry, &Overflow ); /*Q31 - L_tmp_exp*/ - Overflow = 0; + *cngNoiseLevel_exp = hFdCngDec->bandNoiseShape_exp; move16(); + } + ELSE + { + Word16 shift1 = L_norm_arr( cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); + Word16 shift2 = L_norm_arr( cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ) ); + Word16 shift = s_max( sub( hFdCngDec->bandNoiseShape_exp, shift1 ), sub( *cngNoiseLevel_exp, shift2 ) ); - IF( *( cngNoiseLevel + j ) < 0 ) - { - L_c = L_msuNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } - IF( *( cngNoiseLevel + j ) >= 0 ) - { - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } + scale_sig32( cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( hFdCngDec->bandNoiseShape_exp, shift ) ); + scale_sig32( cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ), sub( *cngNoiseLevel_exp, shift ) ); + + *cngNoiseLevel_exp = shift; + move16(); } - L_tmp = norm_llQ31( L_c, L_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/ + + /*st->cngTDLevel = (float)sqrt( (sumFLOAT(cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand) / 2 * hFdCngCom->fftlen) / st->Mode2_L_frame);*/ + tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); + L_tmp = sum_array_norm( cngNoiseLevel, tmp_loop, &L_tmp_exp ); /*Q31 - L_tmp_exp*/ L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 ); L_tmp = Mpy_32_16_1( L_tmp, hFdCngCom->fftlen ); /*Q16 - L_tmp_exp*/ L_tmp = Mpy_32_16_1( L_tmp, T_DIV_L_Frame[L_shl( L_mac( -28000, st->L_frame, 95 ), 1 - 15 )] ); /*Q16,exp -7*/ - L_tmp_exp = add( L_tmp_exp, -7 ); /*->Q16, L_tmp_exp */ - L_tmp_exp = add( L_tmp_exp, 31 - 16 ); /*->Q31, L_tmp_exp*/ + L_tmp_exp = add( L_tmp_exp, -7 + ( 31 - 16 ) ); /*->Q31, L_tmp_exp*/ - st->cngTDLevel = round_fx_o( Sqrt32( L_tmp, &L_tmp_exp ), &Overflow ); /*Q15 - L_tmp_exp*/ + st->cngTDLevel = round_fx( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/ move16(); st->cngTDLevel_e = L_tmp_exp; move16(); @@ -1607,8 +1005,15 @@ Word16 ApplyFdCng_ivas_fx( IF( LT_32( hFdCngCom->msFrCnt_init_counter, L_deposit_l( hFdCngCom->msFrCnt_init_thresh ) ) ) { /* At initialization, interpolate the bin/band-wise levels from the partition levels */ - scalebands_fx( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, - hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); + } + ELSE + { + scalebands_fx( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); + } + *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); } @@ -1621,8 +1026,14 @@ Word16 ApplyFdCng_ivas_fx( /* Interpolate the CLDFB band levels from the SID (partition) levels */ IF( GT_16( hFdCngCom->regularStopBand, hFdCngCom->numCoreBands ) ) { - scalebands_fx( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, - hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + scalebands( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); + } + ELSE + { + scalebands_fx( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); + } *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); @@ -1685,18 +1096,34 @@ Word16 ApplyFdCng_ivas_fx( move32(); } } - /* adapt scaling for rest of the buffer */ - s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) ); - FOR( ; k < hFdCngCom->npart; k++ ) + + IF( EQ_16( st->element_mode, EVS_MONO ) ) { - FOR( ; j <= hFdCngCom->part[k]; j++ ) + /* adapt scaling for rest of the buffer */ + s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) ); + FOR( ; k < hFdCngCom->npart; k++ ) { - cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], s ); /*Q31 - hFdCngDec->bandNoiseShape_exp + s*/ - move32(); + FOR( ; j <= hFdCngCom->part[k]; j++ ) + { + cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], s ); /*Q31 - hFdCngDec->bandNoiseShape_exp + s*/ + move32(); + } } + *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 ); + move16(); + } + ELSE + { + Word16 shift1 = L_norm_arr( cngNoiseLevel, j ); + Word16 shift2 = L_norm_arr( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ) ); + Word16 shift = s_max( sub( add( hFdCngDec->bandNoiseShape_exp, s2 ), shift1 ), sub( *cngNoiseLevel_exp, shift2 ) ); + + scale_sig32( cngNoiseLevel, j, sub( add( hFdCngDec->bandNoiseShape_exp, s2 ), shift ) ); + scale_sig32( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ), sub( *cngNoiseLevel_exp, shift ) ); + + *cngNoiseLevel_exp = shift; + move16(); } - *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 ); - move16(); } } ELSE IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) @@ -1759,29 +1186,29 @@ Word16 ApplyFdCng_ivas_fx( move32(); } } - /* adapt scaling for rest of the buffer */ - s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) ); - FOR( ; k < hFdCngCom->npart; k++ ) - { - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { -#ifdef FIX_ISSUE_1218 - /* NOTE: saturation is added here as part of issue 1218 fix. after rescaling the fdcng noise estimation buffers, due to slight precision loss, values may slightly overflow */ - cngNoiseLevel[j] = L_shl_sat( cngNoiseLevel[j], s ); /*Q31 - hFdCngDec->bandNoiseShape_exp + s*/ -#else - cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], s ); /*Q31 - hFdCngDec->bandNoiseShape_exp + s*/ -#endif - move32(); - } - } - *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 ); + + Word16 shift1 = L_norm_arr( cngNoiseLevel, j ); + Word16 shift2 = L_norm_arr( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ) ); + Word16 shift = s_max( sub( add( hFdCngDec->bandNoiseShape_exp, s2 ), shift1 ), sub( *cngNoiseLevel_exp, shift2 ) ); + + scale_sig32( cngNoiseLevel, j, sub( add( hFdCngDec->bandNoiseShape_exp, s2 ), shift ) ); + scale_sig32( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ), sub( *cngNoiseLevel_exp, shift ) ); + + *cngNoiseLevel_exp = shift; move16(); } } IF( EQ_16( st->codec_mode, MODE2 ) ) { /* Generate comfort noise during SID or zero frames */ - generate_comfort_noise_dec_ivas_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + generate_comfort_noise_dec_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); + } + ELSE + { + generate_comfort_noise_dec_ivas_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); + } } BREAK; @@ -1812,9 +1239,6 @@ Word16 ApplyFdCng_ivas_fx( void perform_noise_estimation_dec_fx( const Word16 *timeDomainInput, /* i: pointer to time domain input Q*/ const Word16 Q, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - float *power_spectrum, -#endif HANDLE_FD_CNG_DEC hFdCngDec /* i/o: FD_CNG structure containing all buffers and variables */ ) { @@ -1845,53 +1269,11 @@ void perform_noise_estimation_dec_fx( move16(); /* Perform STFT analysis */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - IF( !( EQ_16( element_mode, IVAS_CPE_MDCT ) && power_spectrum != NULL ) ) - { - /* Perform STFT analysis */ - AnalysisSTFT( timeDomainInput, Q, fftBuffer, &fftBuffer_exp, hFdCngDec->hFdCngCom ); - } -#else /* Perform STFT analysis */ AnalysisSTFT( timeDomainInput, Q, fftBuffer, &fftBuffer_exp, hFdCngDec->hFdCngCom ); -#endif fftBuffer_exp = add( fftBuffer_exp, WORD16_BITS - 1 ); { -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - if ( element_mode == IVAS_CPE_MDCT && power_spectrum != NULL ) - { - /* use power spectrum calculated in the MDCT-domain instead of calculating new power spectrum */ - periodog = power_spectrum; - } - else - { - /* Compute the squared magnitude in each FFT bin */ - if ( startBand == 0 ) - { - ( *ptr_per ) = fftBuffer[0] * fftBuffer[0]; /* DC component */ - ptr_per++; - ptr_r = fftBuffer + 2; - } - else - { - ptr_r = fftBuffer + 2 * startBand; - } - - ptr_i = ptr_r + 1; - - for ( ; ptr_per < periodog + stopFFTbin - startBand; ptr_per++ ) - { - ( *ptr_per ) = ( *ptr_r ) * ( *ptr_r ) + ( *ptr_i ) * ( *ptr_i ); - ptr_r += 2; - ptr_i += 2; - } - /* Nyquist frequency is discarded */ - - /* Rescale to get energy/sample: it should be 2*(1/N)*(2/N), parseval relation with 1/N,*2 for nrg computed till Nyquist only, 2/N as windowed samples correspond to half a frame*/ - v_multc( periodog, 4.f / (float) ( hFdCngDec->hFdCngCom->fftlen * hFdCngDec->hFdCngCom->fftlen ), periodog, stopFFTbin - startBand ); - } -#else assert( startBand != 0 ); len = sub( stopFFTbin, startBand ); @@ -1971,7 +1353,6 @@ void perform_noise_estimation_dec_fx( } hFdCngDec->hFdCngCom->periodog_exp = add( hFdCngDec->hFdCngCom->periodog_exp, sub( 2, s ) ); move16(); -#endif /* Adjust to the desired frequency resolution by averaging over spectral partitions for SID transmission */ bandcombinepow( periodog, hFdCngDec->hFdCngCom->periodog_exp, sub( stopFFTbin, startBand ), part, npart, psize_inv, hFdCngDec->msPeriodog, &hFdCngDec->msPeriodog_exp ); @@ -2040,6 +1421,7 @@ void perform_noise_estimation_dec_ivas_fx( Word32 enr, enr_tot, enr_tot0; Word16 enr_e, enr_ratio, alpha; Word32 *msPeriodog; + Word32 msPeriodog_floor; Word32 *msNoiseEst; Word32 *reIter; Word32 rescale_fac = 0; @@ -2048,6 +1430,8 @@ void perform_noise_estimation_dec_ivas_fx( Word16 q_shift; Word32 max_l; Word16 norm_shift; + Word16 check = 0; + move16(); /* pointer initialization */ periodog = hFdCngDec->hFdCngCom->periodog; /*Q31 - hFdCngDec->hFdCngCom->periodog_exp*/ @@ -2246,12 +1630,27 @@ void perform_noise_estimation_dec_ivas_fx( msPeriodog[p] = L_add( msPeriodog[p], L_tmp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ move32(); - IF( LT_32( msPeriodog[p], L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ) ) + msPeriodog_floor = L_max( 1, L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ); /*Q31 - hFdCngDec->msPeriodog_exp*/ + IF( LT_32( msPeriodog[p], msPeriodog_floor ) ) { - msPeriodog[p] = L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ + msPeriodog[p] = msPeriodog_floor; move32(); } } + FOR( p = 0; p < npart; p++ ) + { + IF( GT_32( msPeriodog[p], 1 ) ) + { + check = 1; + move16(); + BREAK; + } + } + IF( check == 0 ) + { + hFdCngDec->msPeriodog_exp = 14; /* msPeriodog buffer will have minimum value as 1e-5f */ + move16(); + } } /* calculate total energy (short-term and long-term) */ @@ -2401,8 +1800,15 @@ void perform_noise_estimation_dec_ivas_fx( ELSE { Copy32( msPeriodog, msNoiseEst, npart ); - scale_sig32( &msNoiseEst[npart], sub( NPART_SHAPING, npart ), sub( hFdCngDec->msNoiseEst_exp, hFdCngDec->msPeriodog_exp ) ); - hFdCngDec->msNoiseEst_exp = hFdCngDec->msPeriodog_exp; + + Word16 shift1 = L_norm_arr( msNoiseEst, npart ); + Word16 shift2 = L_norm_arr( &msNoiseEst[npart], sub( NPART_SHAPING, npart ) ); + Word16 shift = s_max( sub( hFdCngDec->msPeriodog_exp, shift1 ), sub( hFdCngDec->msNoiseEst_exp, shift2 ) ); + + scale_sig32( msNoiseEst, npart, sub( hFdCngDec->msPeriodog_exp, shift ) ); + scale_sig32( &msNoiseEst[npart], sub( NPART_SHAPING, npart ), sub( hFdCngDec->msNoiseEst_exp, shift ) ); + + hFdCngDec->msNoiseEst_exp = shift; move16(); } @@ -2764,8 +2170,8 @@ void perform_noise_estimation_dec_ivas_fx( nFFTpart, psize_norm, hFdCngDec->msLogPeriodog, - hFdCngDec->msNoiseFloor, - hFdCngDec->msLogNoiseEst, + hFdCngDec->msNoiseFloor_32fx, + hFdCngDec->msLogNoiseEst_32fx, hFdCngDec->msAlpha, hFdCngDec->msPsd, hFdCngDec->msPsdFirstMoment, @@ -2792,7 +2198,7 @@ void perform_noise_estimation_dec_ivas_fx( move16(); /* Expand MS outputs */ - expand_range( hFdCngDec->msLogNoiseEst, hFdCngDec->msNoiseEst, &hFdCngDec->msNoiseEst_exp, npart ); + expand_range_fx( hFdCngDec->msLogNoiseEst_32fx, hFdCngDec->msNoiseEst, &hFdCngDec->msNoiseEst_exp, npart ); } } @@ -3102,7 +2508,6 @@ void generate_comfort_noise_dec_fx( /* Warning fix */ s = 0; move16(); - // PMTE(); /*IVAS CODE need to be added */ /* pointer initialization */ @@ -3457,8 +2862,8 @@ void generate_comfort_noise_dec_fx( E_UTIL_deemph2( NOISE_HEADROOM, - noise, /* I/O: signal Qx */ - preemph_fac, /* I: deemphasis factor Qx */ + noise, /* I/O: signal Qx */ + preemph_fac, /* I: deemphasis factor Qx */ N, /* I: vector size */ &tmp /* I/O: memory (signal[-1]) Qx */ ); @@ -3501,7 +2906,9 @@ void generate_comfort_noise_dec_ivas_fx( Word32 tmp1, tmp2; Word16 scaleCldfb; Word32 *fftBuffer = hFdCngCom->fftBuffer; /*hFdCngCom->fftBuffer_exp*/ - Word16 fftBuffer_exp = hFdCngCom->fftBuffer_exp; + Word16 fftBuffer_exp, fftBuffer_exp2; + fftBuffer_exp = hFdCngCom->fftBuffer_exp; + move16(); Word16 fftBuffer_temp_exp[FFTLEN]; Word16 *timeDomainOutput = hFdCngCom->timeDomainBuffer; Word16 temp; @@ -3521,12 +2928,12 @@ void generate_comfort_noise_dec_ivas_fx( temp = 0; move16(); - c1 = Sqrt16( hFdCngCom->coherence_fx, &temp ); /*Q15 - temp*/ - c1 = shl( c1, temp ); /*Q15*/ + c1 = Sqrt16( hFdCngCom->coherence_fx[0], &temp ); /*Q15 - temp*/ + c1 = shl( c1, temp ); /*Q15*/ temp = 0; move16(); - c2 = Sqrt16( sub( MAX_16, hFdCngCom->coherence_fx ), &temp ); /*Q15 - temp*/ - c2 = shl( c2, temp ); /*Q15*/ + c2 = Sqrt16( sub( MAX_16, hFdCngCom->coherence_fx[0] ), &temp ); /*Q15 - temp*/ + c2 = shl( c2, temp ); /*Q15*/ temp = getScaleFactor32( fftBuffer, FFTLEN ); scale_sig32( fftBuffer, FFTLEN, temp ); /*Q31 - hFdCngCom->fftBuffer_exp + temp*/ @@ -3534,6 +2941,8 @@ void generate_comfort_noise_dec_ivas_fx( hFdCngCom->fftBuffer_exp = fftBuffer_exp; move16(); set16_fx( fftBuffer_temp_exp, fftBuffer_exp, FFTLEN ); + fftBuffer_exp2 = fftBuffer_exp; + move16(); fftBuffer_exp = 0; move16(); @@ -3551,7 +2960,8 @@ void generate_comfort_noise_dec_ivas_fx( { test(); test(); - IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) || ( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) ) + test(); + IF( ( EQ_16( st->element_mode, IVAS_CPE_MDCT && NE_16( nchan_out, 1 ) ) ) || ( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) ) { rand_gauss_fx( &tmp1, seed, Q15 ); rand_gauss_fx( &tmp2, seed2, Q15 ); @@ -3587,64 +2997,143 @@ void generate_comfort_noise_dec_ivas_fx( } ptr_i = ptr_r + 1; /*Q31 - fftBuffer_exp*/ - FOR( ; ptr_level < cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); ptr_level++ ) + test(); + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && NE_16( nchan_out, 1 ) ) { - /* Real part in FFT bins */ - test(); - test(); - IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) || ( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) ) + Word16 band_len_accu, b; + + band_len_accu = 0; + move16(); + i = 0; + move16(); + + FOR( b = 0; b < MDCT_ST_DTX_NUM_COHERENCE_BANDS; b++ ) { - rand_gauss_fx( &tmp1, seed, Q15 ); /*Q15*/ - rand_gauss_fx( &tmp2, seed2, Q15 ); /*Q15*/ - *ptr_r = L_add( Mpy_32_16_1( tmp1, c1 ), Mpy_32_16_1( tmp2, c2 ) ); /*Q15*/ - move32(); - fftBuffer_temp_exp[idx] = Q16; + band_len_accu = add( band_len_accu, mdct_stereo_dtx_coherence_bandlengths[b] ); + + /* First band needs to be shortened. The offset from encoder-side estimation is already in, so add it back here */ + IF( EQ_16( b, 0 ) ) + { + band_len_accu = add( band_len_accu, sub( MDCT_ST_DTX_FIRST_BAND_OFFSET, hFdCngCom->startBand ) ); + } + + /* + * for last band, we need to keep going until the end of the fft section - if there is still any + * this way, the coherence value of the last band is used for eveyrthing above as well + */ + IF( EQ_16( b, sub( MDCT_ST_DTX_NUM_COHERENCE_BANDS, 1 ) ) ) + { + band_len_accu = s_max( band_len_accu, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); + } + + /* mixing values for coherence is now frequency-dependent */ + temp = 0; move16(); - } - ELSE - { - rand_gauss_fx( ptr_r, seed, Q15 ); /*Q15*/ - fftBuffer_temp_exp[idx] = Q16; + c1 = Sqrt16( hFdCngCom->coherence_fx[b], &temp ); /*Q15 - temp*/ + c1 = shl( c1, temp ); /*Q15*/ + temp = 0; move16(); - } + c2 = Sqrt16( sub( MAX_16, hFdCngCom->coherence_fx[b] ), &temp ); /*Q15 - temp*/ + c2 = shl( c2, temp ); /*Q15*/ - sqrtNoiseLevel_exp = sub( cngNoiseLevel_exp, 1 ); - sqrtNoiseLevel = Sqrt32( *ptr_level, &sqrtNoiseLevel_exp ); /*Q31 - sqrtNoiseLevel_exp*/ - ( *ptr_r ) = Mpy_32_32( ( *ptr_r ), sqrtNoiseLevel ); /*Q15 - sqrtNoiseLevel_exp*/ - move32(); - fftBuffer_temp_exp[idx] = add( fftBuffer_temp_exp[idx], sqrtNoiseLevel_exp ); - move16(); - idx = add( idx, 1 ); - ptr_r += 2; + FOR( ; i < band_len_accu; i++ ) + { + sqrtNoiseLevel_exp = sub( cngNoiseLevel_exp, 1 ); + sqrtNoiseLevel = Sqrt32( *ptr_level, &sqrtNoiseLevel_exp ); /*Q31 - sqrtNoiseLevel_exp*/ - /* Imaginary part in FFT bins */ - test(); - test(); - IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) || ( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) ) + /* Real part in FFT bins */ + rand_gauss_fx( &tmp1, seed, Q15 ); + rand_gauss_fx( &tmp2, seed2, Q15 ); + *ptr_r = L_add( Mpy_32_16_1( tmp1, c1 ), Mpy_32_16_1( tmp2, c2 ) ); /*Q15*/ + move32(); + fftBuffer_temp_exp[idx] = Q16; + move16(); + ( *ptr_r ) = Mpy_32_32( ( *ptr_r ), sqrtNoiseLevel ); /*Q15 - sqrtNoiseLevel_exp*/ + move32(); + fftBuffer_temp_exp[idx] = add( fftBuffer_temp_exp[idx], sqrtNoiseLevel_exp ); + move16(); + idx = add( idx, 1 ); + + /* Imaginary part in FFT bins */ + rand_gauss_fx( &tmp1, seed, Q15 ); /*Q15*/ + rand_gauss_fx( &tmp2, seed2, Q15 ); /*Q15*/ + *ptr_i = L_add( Mpy_32_16_1( tmp1, c1 ), Mpy_32_16_1( tmp2, c2 ) ); /*Q15*/ + move32(); + fftBuffer_temp_exp[idx] = Q16; + move16(); + ( *ptr_i ) = Mpy_32_32( ( *ptr_i ), sqrtNoiseLevel ); /*Q15 - sqrtNoiseLevel_exp*/ + move32(); + fftBuffer_temp_exp[idx] = add( fftBuffer_temp_exp[idx], sqrtNoiseLevel_exp ); + move16(); + idx = add( idx, 1 ); + + /* advance all pointers together here */ + ptr_r += 2; + ptr_i += 2; + ptr_level++; + } + } + } + ELSE + { + FOR( ; ptr_level < cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); ptr_level++ ) { - rand_gauss_fx( &tmp1, seed, Q15 ); /*Q15*/ - rand_gauss_fx( &tmp2, seed2, Q15 ); /*Q15*/ - *ptr_i = L_add( Mpy_32_16_1( tmp1, c1 ), Mpy_32_16_1( tmp2, c2 ) ); /*Q15*/ + /* Real part in FFT bins */ + test(); + IF( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) + { + rand_gauss_fx( &tmp1, seed, Q15 ); /*Q15*/ + rand_gauss_fx( &tmp2, seed2, Q15 ); /*Q15*/ + *ptr_r = L_add( Mpy_32_16_1( tmp1, c1 ), Mpy_32_16_1( tmp2, c2 ) ); /*Q15*/ + move32(); + fftBuffer_temp_exp[idx] = Q16; + move16(); + } + ELSE + { + rand_gauss_fx( ptr_r, seed, Q15 ); /*Q15*/ + fftBuffer_temp_exp[idx] = Q16; + move16(); + } + + sqrtNoiseLevel_exp = sub( cngNoiseLevel_exp, 1 ); + sqrtNoiseLevel = Sqrt32( *ptr_level, &sqrtNoiseLevel_exp ); /*Q31 - sqrtNoiseLevel_exp*/ + ( *ptr_r ) = Mpy_32_32( ( *ptr_r ), sqrtNoiseLevel ); /*Q15 - sqrtNoiseLevel_exp*/ move32(); - fftBuffer_temp_exp[idx] = Q16; + fftBuffer_temp_exp[idx] = add( fftBuffer_temp_exp[idx], sqrtNoiseLevel_exp ); move16(); - } - ELSE - { - rand_gauss_fx( ptr_i, seed, Q15 ); /*Q15*/ - fftBuffer_temp_exp[idx] = Q16; + idx = add( idx, 1 ); + ptr_r += 2; + + /* Imaginary part in FFT bins */ + test(); + IF( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) + { + rand_gauss_fx( &tmp1, seed, Q15 ); /*Q15*/ + rand_gauss_fx( &tmp2, seed2, Q15 ); /*Q15*/ + *ptr_i = L_add( Mpy_32_16_1( tmp1, c1 ), Mpy_32_16_1( tmp2, c2 ) ); /*Q15*/ + move32(); + fftBuffer_temp_exp[idx] = Q16; + move16(); + } + ELSE + { + rand_gauss_fx( ptr_i, seed, Q15 ); /*Q15*/ + fftBuffer_temp_exp[idx] = Q16; + move16(); + } + sqrtNoiseLevel_exp = sub( cngNoiseLevel_exp, 1 ); + sqrtNoiseLevel = Sqrt32( *ptr_level, &sqrtNoiseLevel_exp ); /*Q31 - sqrtNoiseLevel_exp*/ + ( *ptr_i ) = Mpy_32_32( ( *ptr_i ), sqrtNoiseLevel ); /*Q15 - sqrtNoiseLevel_exp*/ + move32(); + fftBuffer_temp_exp[idx] = add( fftBuffer_temp_exp[idx], sqrtNoiseLevel_exp ); move16(); + idx = add( idx, 1 ); + ptr_i += 2; } - sqrtNoiseLevel_exp = sub( cngNoiseLevel_exp, 1 ); - sqrtNoiseLevel = Sqrt32( *ptr_level, &sqrtNoiseLevel_exp ); /*Q31 - sqrtNoiseLevel_exp*/ - ( *ptr_i ) = Mpy_32_32( ( *ptr_i ), sqrtNoiseLevel ); /*Q15 - sqrtNoiseLevel_exp*/ - move32(); - fftBuffer_temp_exp[idx] = add( fftBuffer_temp_exp[idx], sqrtNoiseLevel_exp ); - move16(); - idx = add( idx, 1 ); - ptr_i += 2; } + /* Remaining FFT bins are set to zero */ set32_fx( fftBuffer + shl( hFdCngCom->stopFFTbin, 1 ), 0, sub( hFdCngCom->fftlen, shl( hFdCngCom->stopFFTbin, 1 ) ) ); set16_fx( fftBuffer_temp_exp + shl( hFdCngCom->stopFFTbin, 1 ), 0, sub( hFdCngCom->fftlen, shl( hFdCngCom->stopFFTbin, 1 ) ) ); @@ -3691,9 +3180,16 @@ void generate_comfort_noise_dec_ivas_fx( /* Perform STFT synthesis */ SynthesisSTFT_ivas_fx( fftBuffer, fftBuffer_exp, timeDomainOutput, hFdCngCom->olapBufferSynth, hFdCngCom->olapWinSyn, - tcx_transition, hFdCngCom, gen_exc, Q_new, st->element_mode, nchan_out ); - scale_sig32( fftBuffer + hFdCngCom->fftlen, sub( FFTLEN, hFdCngCom->fftlen ), sub( fftBuffer_exp, hFdCngCom->fftBuffer_exp ) ); /*Q31 - fftBuffer_exp*/ - + tcx_transition, hFdCngCom, gen_exc, Q_new, st->element_mode, nchan_out ); /* fftBuffer in hfDCngCom->fftBuffer_exp */ + /* fftBuffer now in different Qs [0 to fftlen - 1] = hfDCngCom->fftBuffer_exp and [fftlen to FFTLEN(640)] = fftBuffer_exp2, bringing it in common exponent */ + Word16 shift1 = L_norm_arr( fftBuffer, hFdCngCom->fftlen ); + Word16 shift2 = L_norm_arr( fftBuffer + hFdCngCom->fftlen, sub( FFTLEN, hFdCngCom->fftlen ) ); + Word16 shift = s_max( sub( hFdCngCom->fftBuffer_exp, shift1 ), sub( fftBuffer_exp2, shift2 ) ); + + scale_sig32( fftBuffer, hFdCngCom->fftlen, sub( hFdCngCom->fftBuffer_exp, shift ) ); + scale_sig32( fftBuffer + hFdCngCom->fftlen, sub( FFTLEN, hFdCngCom->fftlen ), sub( fftBuffer_exp2, shift ) ); + hFdCngCom->fftBuffer_exp = shift; + move16(); { Word32 Lener, att; Word16 exp; @@ -3747,6 +3243,11 @@ void generate_comfort_noise_dec_ivas_fx( /* Generate Gaussian random noise in real and imaginary parts of the CLDFB bands Amplitudes are adjusted to the estimated noise level cngNoiseLevel_flt in each band */ + /* + * Note: for the stereo DTX noise mixing, c1 and c2 at this point are set to the value calculated for the last band + * as all the coherence bands are in the FFT region, we do not need the special handling here + */ + test(); IF( bufferReal != NULL && ( LT_16( hFdCngCom->numCoreBands, hFdCngCom->regularStopBand ) ) ) { @@ -3762,7 +3263,8 @@ void generate_comfort_noise_dec_ivas_fx( FOR( i = 0; i < hFdCngCom->numSlots; i++ ) { /* Real part in CLDFB band */ - IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) || ( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) ) + test(); + IF( ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && NE_16( nchan_out, 1 ) ) || ( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) ) { rand_gauss_fx( &tmp1, seed, Q15 ); /*Q15*/ rand_gauss_fx( &tmp2, seed2, Q15 ); /*Q15*/ @@ -3785,7 +3287,8 @@ void generate_comfort_noise_dec_ivas_fx( move16(); /* Imaginary part in CLDFB band */ - IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) || ( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) ) + test(); + IF( ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && NE_16( nchan_out, 1 ) ) || ( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) ) { rand_gauss_fx( &tmp1, seed, Q15 ); /*Q15*/ rand_gauss_fx( &tmp2, seed2, Q15 ); /*Q15*/ @@ -3996,8 +3499,8 @@ void generate_comfort_noise_dec_ivas_fx( E_UTIL_deemph2( NOISE_HEADROOM, - noise, /* I/O: signal Qx */ - preemph_fac, /* I: deemphasis factor Qx */ + noise, /* I/O: signal Qx */ + preemph_fac, /* I: deemphasis factor Qx */ N, /* I: vector size */ &tmp /* I/O: memory (signal[-1]) Qx */ ); @@ -4132,13 +3635,13 @@ void generate_comfort_noise_dec_hf_ivas_fx( s = 0; move16(); - c1 = Sqrt16( hFdCngCom->coherence_fx, &s ); /*Q15 - s*/ - c1 = shl( c1, s ); // Q15 + c1 = Sqrt16( hFdCngCom->coherence_fx[sub( MDCT_ST_DTX_NUM_COHERENCE_BANDS, 1 )], &s ); /*Q15 - s*/ + c1 = shl( c1, s ); // Q15 s = 0; move16(); - c2 = Sqrt16( sub( MAX16B, hFdCngCom->coherence_fx ), &s ); /*Q15 - s*/ - c2 = shl( c2, s ); // Q15 + c2 = Sqrt16( sub( MAX16B, hFdCngCom->coherence_fx[sub( MDCT_ST_DTX_NUM_COHERENCE_BANDS, 1 )] ), &s ); /*Q15 - s*/ + c2 = shl( c2, s ); // Q15 } sn = 0; @@ -4230,9 +3733,8 @@ void generate_comfort_noise_dec_hf_ivas_fx( void generate_masking_noise_fx( Word16 *timeDomainBuffer, /* i/o : pointer to time domain output buffer 15Q0 */ Word16 Q, - HANDLE_FD_CNG_COM hFdCngCom /* i/o : pointer to FD_CNG_COM structure */ - , - Word16 length, /*Q0*/ + HANDLE_FD_CNG_COM hFdCngCom, /* i/o : pointer to FD_CNG_COM structure */ + Word16 length, /*Q0*/ Word16 core /*Q0*/ ) { Word16 i, s, s1, s2, sq, cnt, startBand2, stopFFTbin2; @@ -4244,8 +3746,6 @@ void generate_masking_noise_fx( Word32 *fftBuffer; Word16 *seed; - // PMTE(); /*IVAS CODE need to be added */ - /* pointer initializations */ cngNoiseLevel = hFdCngCom->cngNoiseLevel; /*Q31 - hFdCngCom->cngNoiseLevelExp*/ fftBuffer = hFdCngCom->fftBuffer; /*Q31 - hFdCngCom->fftBuffer_exp*/ @@ -4382,8 +3882,6 @@ void generate_masking_noise_fx( assert( hFdCngCom->olapBufferSynth2 != NULL ); SynthesisSTFT( hFdCngCom->fftBuffer, fftBufferExp, maskingNoise, hFdCngCom->olapBufferSynth2, hFdCngCom->olapWinSyn, 0, hFdCngCom, 0, NULL, -1 /*st->element_mode*/, -1 /*nchan_out*/ ); - // PMT("parameters need update") - /* add some comfort noise on top of decoded signal */ IF( hFdCngCom->frameSize > length ) @@ -4444,10 +3942,9 @@ void generate_masking_noise_update_seed_fx( * Generate additional comfort noise (kind of noise filling) * ************************************************************/ void generate_masking_noise_mdct_fx( - Word32 *mdctBuffer, /* i/o: time-domain signal Q31 - mdctBuffer_e*/ - Word16 *mdctBuffer_e, /* i/o: exponent time-domain signal */ - HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ - , + Word32 *mdctBuffer, /* i/o: time-domain signal Q31 - mdctBuffer_e*/ + Word16 *mdctBuffer_e, /* i/o: exponent time-domain signal */ + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ Word16 L_frame ) { Word16 i, s, s1, s2, sq, cnt; @@ -4460,7 +3957,6 @@ void generate_masking_noise_mdct_fx( Word32 *cngNoiseLevel; Word16 *seed; - // PMTE(); /*IVAS CODE need to be added */ /* pointer initializations */ cngNoiseLevel = hFdCngCom->cngNoiseLevel; /*Q31 - hFdCngCom->cngNoiseLevelExp*/ seed = &( hFdCngCom->seed ); @@ -4621,7 +4117,6 @@ void generate_masking_noise_mdct_ivas_fx( Word32 *cngNoiseLevel; Word16 *seed; - // PMTE(); /*IVAS CODE need to be added */ /* pointer initializations */ cngNoiseLevel = hFdCngCom->cngNoiseLevel; /*Q31 - hFdCngCom->cngNoiseLevelExp*/ seed = &( hFdCngCom->seed ); @@ -4701,12 +4196,12 @@ void generate_masking_noise_mdct_ivas_fx( } /*re-normalization of energy level: M/sqrt(2)*/ - v_multc_fixed( maskingNoise, SQRT_NORM_MDCT_FACTOR_Q27, maskingNoise, hFdCngCom->stopFFTbin ); // Q11 + v_multc_fx( maskingNoise, SQRT_NORM_MDCT_FACTOR_Q27, maskingNoise, hFdCngCom->stopFFTbin ); // Q11 scale_sig32( maskingNoise, hFdCngCom->stopFFTbin, sub( 20, *mdctBuffer_e ) ); // exp = *mdctBuffer_e /* Add some comfort noise on top of decoded signal */ - v_add_fixed( maskingNoise, mdctBuffer, mdctBuffer, hFdCngCom->stopFFTbin, 1 ); + v_add_fx_hdrm( maskingNoise, mdctBuffer, mdctBuffer, hFdCngCom->stopFFTbin, 1 ); *mdctBuffer_e = sub( *mdctBuffer_e, 1 ); move16(); } @@ -5069,7 +4564,14 @@ void FdCng_decodeSID_ivas_fx( } scalebands( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), hFdCngCom->cngNoiseLevel, 1 ); - hFdCngCom->cngNoiseLevelExp = hFdCngCom->sidNoiseEstExp; + Word16 shift1 = L_norm_arr( hFdCngCom->cngNoiseLevel, sub( hFdCngCom->stopBand, hFdCngCom->startBand ) ); + Word16 shift2 = L_norm_arr( hFdCngCom->cngNoiseLevel + sub( hFdCngCom->stopBand, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopBand, hFdCngCom->startBand ) ) ); + Word16 shift = s_max( sub( hFdCngCom->sidNoiseEstExp, shift1 ), sub( hFdCngCom->cngNoiseLevelExp, shift2 ) ); + + scale_sig32( hFdCngCom->cngNoiseLevel, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), sub( hFdCngCom->sidNoiseEstExp, shift ) ); + scale_sig32( hFdCngCom->cngNoiseLevel + sub( hFdCngCom->stopBand, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopBand, hFdCngCom->startBand ) ), sub( hFdCngCom->cngNoiseLevelExp, shift ) ); + + hFdCngCom->cngNoiseLevelExp = shift; move16(); lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, st->preemph_fac ); @@ -5240,7 +4742,7 @@ void generate_masking_noise_ivas_fx( } ELSE { - v_add_fixed( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ), 0 ); /*Q31 - *exp_out*/ + v_add_fx_no_hdrm( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ) ); /*Q31 - *exp_out*/ } return; @@ -5275,24 +4777,16 @@ void generate_stereo_masking_noise_fx( IF( st->idchan == 0 ) { hFdCngCom = st->hFdCngDec->hFdCngCom; -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hStereoCng->olapBufferSynth22_fx, Ns_fx, shr( hFdCngCom->frameSize, 1 ), sub( Q6, st->Q_syn ) ); /*Q6*/ -#else - Copy_Scale_sig_16_32_DEPREC( hStereoCng->olapBufferSynth22_fx, Ns_fx, shr( hFdCngCom->frameSize, 1 ), sub( Q6, st->Q_syn ) ); /*Q6*/ -#endif - Copy32( hFdCngCom->olapBufferSynth2_fx, Np_fx, shr( hFdCngCom->frameSize, 1 ) ); /*st->Q_syn*/ + Copy32( hFdCngCom->olapBufferSynth2_fx, Np_fx, shr( hFdCngCom->frameSize, 1 ) ); /*st->Q_syn*/ set32_fx( &Np_fx[( hFdCngCom->frameSize / 2 )], 0, shr( hFdCngCom->frameSize, 1 ) ); set32_fx( &Ns_fx[( hFdCngCom->frameSize / 2 )], 0, shr( hFdCngCom->frameSize, 1 ) ); IF( !fadeOut ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hStereoCng->olapBufferSynth22_fx, hStereoCng->olapBufferSynth22_32fx, hFdCngCom->fftlen, sub( Q15, st->Q_syn ) ); /*Q15*/ -#else - Copy_Scale_sig_16_32_DEPREC( hStereoCng->olapBufferSynth22_fx, hStereoCng->olapBufferSynth22_32fx, hFdCngCom->fftlen, sub( Q15, st->Q_syn ) ); /*Q15*/ -#endif - generate_masking_noise_ivas_fx( N1_fx, &N1_fx_exp, hFdCngCom, hFdCngCom->frameSize, 0, 1, 0, st->element_mode, hStereoCng, nchan_out ); // N1_fx Q6 + generate_masking_noise_ivas_fx( N1_fx, &N1_fx_exp, hFdCngCom, hFdCngCom->frameSize, 0, 1, 0, st->element_mode, hStereoCng, nchan_out ); // N1_fx Q6 /* Generate masking noise for secondary channel */ IF( flag_sec_CNA ) { @@ -5447,10 +4941,11 @@ void generate_stereo_masking_noise_fx( return; } void generate_masking_noise_lb_dirac_fx( - HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ - Word32 *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA Q11*/ - const Word16 nCldfbTs, /* i : number of CLDFB slots that will be rendered Q0*/ - const Word16 cna_flag /* i : CNA flag for LB and HB Q0*/ + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + Word32 *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA Q11*/ + const Word16 nCldfbTs, /* i : number of CLDFB slots that will be rendered Q0*/ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i : common spatial rendering parameters handle */ + const Word16 cna_flag /* i : CNA flag for LB and HB Q0*/ ) { Word16 i; @@ -5468,7 +4963,7 @@ void generate_masking_noise_lb_dirac_fx( /* Init */ scale = 0; move32(); - n_samples_out = i_mult( shr( hFdCngCom->frameSize, 4 ), nCldfbTs ); + n_samples_out = i_mult( shr( hFdCngCom->frameSize, 4 /* DEFAULT_JBM_CLDFB_TIMESLOTS */ ), nCldfbTs ); n_samples_start = 0; move16(); Word16 exp_out = Q11; @@ -5501,6 +4996,11 @@ void generate_masking_noise_lb_dirac_fx( test(); IF( cna_flag && tdBuffer != NULL ) { + Word16 cur_subframe; + Word16 cur_subframe_start_outfs; + Word16 cur_subframe_start_cngfs; + Word16 slot_size_cng; + WHILE( n_samples_out > 0 ) { n_samples_out_loop = s_min( hFdCngCom->frameSize, n_samples_out ); @@ -5572,6 +5072,29 @@ void generate_masking_noise_lb_dirac_fx( n_samples_out = sub( n_samples_out, hFdCngCom->frameSize ); n_samples_start = add( n_samples_start, hFdCngCom->frameSize ); } + + /* move generated noise to the 5ms subframe starts in the tc buffer according to the output sampling frequency to avoid + overwriting it with the synthesis in case of shared tc and synth channel memory, i.e. non-TSM mode */ + slot_size_cng = shr( hFdCngCom->frameSize, 4 /* DEFAULT_JBM_CLDFB_TIMESLOTS */ ); + /* move start indices forward to the end of the last subframe */ + cur_subframe_start_outfs = i_mult( nCldfbTs, hSpatParamRendCom->slot_size ); + cur_subframe_start_cngfs = i_mult( nCldfbTs, slot_size_cng ); + + /* go from the last subframe back and move the LB noise */ + FOR( cur_subframe = sub( hSpatParamRendCom->nb_subframes, 1 ); cur_subframe >= 0; cur_subframe-- ) + { + Word16 move_size, subframe_size_outfs; + move_size = i_mult( slot_size_cng, hSpatParamRendCom->subframe_nbslots[cur_subframe] ); + subframe_size_outfs = i_mult( hSpatParamRendCom->subframe_nbslots[cur_subframe], hSpatParamRendCom->slot_size ); + cur_subframe_start_outfs = sub( cur_subframe_start_outfs, i_mult( hSpatParamRendCom->subframe_nbslots[cur_subframe], hSpatParamRendCom->slot_size ) ); + cur_subframe_start_cngfs = sub( cur_subframe_start_cngfs, i_mult( hSpatParamRendCom->subframe_nbslots[cur_subframe], slot_size_cng ) ); + + /* move cna */ + Copy32( tdBuffer + cur_subframe_start_cngfs, tdBuffer + cur_subframe_start_outfs, move_size ); + + /* set everything else to zero */ + set_zero_fx( tdBuffer + cur_subframe_start_outfs + move_size, sub( subframe_size_outfs, move_size ) ); + } } pop_wmops(); @@ -5664,7 +5187,7 @@ void generate_masking_noise_dirac_ivas_fx( scale_fx = L_shl( scale_fx, q_shift ); /*q_scale+q_shift*/ q_scale = add( q_scale, q_shift ); scale_fx = Mpy_32_32( scale_fx, Mpy_32_16_1( L_mult( h_cldfb->scale, h_cldfb->scale ), CLDFB_SCALING ) ); // Q = q_scale + 2 * Q8 - 34 - q_scale = sub( add( q_scale, 2 * Q8 ), 31 ); + q_scale = sub( add( q_scale, 2 * Q8 ), 31 + 3 ); ptr_level_fx = hFdCngCom->cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); /*Q31 - hFdCngCom->cngNoiseLevelExp*/ q_ptr_level = sub( 31, hFdCngCom->cngNoiseLevelExp ); @@ -5675,8 +5198,8 @@ void generate_masking_noise_dirac_ivas_fx( q_shift = norm_l( scale_fx ); scale_fx = L_shl( scale_fx, q_shift ); /*q_scale+q_shift*/ q_scale = add( q_scale, q_shift ); - num = Mpy_32_32( scale_fx, *ptr_level_fx ); /*q_num*/ - q_num = sub( add( q_scale, q_ptr_level ), 31 ); + num = Mpy_32_32( scale_fx, *ptr_level_fx ); /*q_num*/ + q_num = sub( add( q_scale, q_ptr_level ), 31 - 1 ); // num = ( scale * *ptr_level ) * 0.5f exp = sub( 31, q_num ); num = Sqrt32( num, &exp ); /*Q31 - exp*/ /* Real part in CLDFB band */ @@ -5784,7 +5307,18 @@ void FdCngDecodeMDCTStereoSID_fx( Scale_sig32( ms_ptr_fx[ch], N, shift ); // Q20 } - dtx_read_padding_bits_fx( sts[1], mult( sub( IVAS_SID_5k2, 4400 ), ONE_BY_FRAMES_PER_SEC_Q15 ) ); + tmp32 = sts[1]->total_brate; + sts[1]->total_brate = L_add( sts[1]->total_brate, 800 /* 16 * FRAMES_PER_SEC */ ); + /* read the four additional coherence values */ + FOR( Word16 b = 1; b < MDCT_ST_DTX_NUM_COHERENCE_BANDS; b++ ) + { + UWord16 idx; + + idx = get_next_indice_fx( sts[1], 4 ); + sts[0]->hFdCngDec->hFdCngCom->coherence_fx[b] = get_next_index_4_by_15[idx]; + sts[1]->hFdCngDec->hFdCngCom->coherence_fx[b] = sts[0]->hFdCngDec->hFdCngCom->coherence_fx[b]; + } + sts[1]->total_brate = tmp32; IF( sts[0]->hFdCngDec->hFdCngCom->no_side_flag ) { @@ -5969,10 +5503,14 @@ void FdCngDecodeDiracMDCTStereoSID_fx( lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, sts[ch]->preemph_fac ); } - sts[0]->hFdCngDec->hFdCngCom->coherence_fx = 0; - move16(); - sts[1]->hFdCngDec->hFdCngCom->coherence_fx = 0; - move16(); + FOR( i = 0; i < MDCT_ST_DTX_NUM_COHERENCE_BANDS; i++ ) + { + sts[0]->hFdCngDec->hFdCngCom->coherence_fx[i] = 0; + move16(); + sts[1]->hFdCngDec->hFdCngCom->coherence_fx[i] = 0; + move16(); + } + IF( EQ_16( hCPE->nchan_out, 1 ) ) { diff --git a/lib_dec/gain_dec_fx.c b/lib_dec/gain_dec_fx.c index 5e17122311bc97e7495aa9840fa7036d069b3c24..0848104afa84f0eb798d41eb438c02502ccc57de 100644 --- a/lib_dec/gain_dec_fx.c +++ b/lib_dec/gain_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -9,24 +9,24 @@ /*===========================================================================*/ -/* FUNCTION : Es_pred_dec_fx() */ +/* FUNCTION : Es_pred_dec_fx() */ /*---------------------------------------------------------------------------*/ -/* PURPOSE : Decoding of scaled predicted innovation energy to be */ -/* used in all subframes */ +/* PURPOSE : Decoding of scaled predicted innovation energy to be */ +/* used in all subframes */ /*---------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) coder_type : coder type */ -/* _ (Word32) core_brate : core bitrate */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) coder_type : coder type */ +/* _ (Word32) core_brate : core bitrate */ /* _ (Word16*) Es_pred_qua_nb_fx : Gain quantization - quantization table */ -/* for scaled innovation energy prediciton Q8*/ +/* for scaled innovation energy prediciton Q8*/ /*---------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) Es_pred : predicited scaled innovation energy Q8 */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) Es_pred : predicited scaled innovation energy Q8 */ /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*===========================================================================*/ void Es_pred_dec_fx( Word16 *Es_pred, /* o : predicited scaled innovation energy Q8*/ @@ -35,9 +35,6 @@ void Es_pred_dec_fx( const Word16 no_ltp /* i : no LTP flag */ ) { -#ifdef IVAS_GAIN_MOD - PMT( "Verify if Es_pred_dec_fx should use noltp parameters" ) -#endif IF( no_ltp == 0 ) { SWITCH( nb_bits ) @@ -66,30 +63,30 @@ void Es_pred_dec_fx( } } /*======================================================================================*/ -/* FUNCTION : void gain_dec_tc_fx () */ +/* FUNCTION : void gain_dec_tc_fx () */ /*--------------------------------------------------------------------------------------*/ /* PURPOSE : Decoding of pitch and codebook gains and updating long term energies */ /*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* Word32 core_brate_fx i : core bitrate */ -/* Word16 *code_fx i : algebraic code excitation */ -/* Word16 L_frame_fx i : length of the frame */ -/* Word16 i_subfr_fx i : subframe number */ -/* Word16 tc_subfr_fx i : TC subframe index */ -/* Word16 Es_pred_fx i : predicted scaled innov. energy Q8 */ +/* INPUT ARGUMENTS : */ +/* Word32 core_brate_fx i : core bitrate */ +/* Word16 *code_fx i : algebraic code excitation */ +/* Word16 L_frame_fx i : length of the frame */ +/* Word16 i_subfr_fx i : subframe number */ +/* Word16 tc_subfr_fx i : TC subframe index */ +/* Word16 Es_pred_fx i : predicted scaled innov. energy Q8 */ /*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* Word16 *gain_pit_fx o : pitch gain Q14 */ -/* Word32 *gain_code_fx o : Quantized codeebook gain Q16 */ -/* Word16 *gain_inov_fx o : unscaled innovation gain Q12 */ -/* Word32 *norm_gain_code_fx o : norm. gain of the codebook excit. Q16 */ +/* OUTPUT ARGUMENTS : */ +/* Word16 *gain_pit_fx o : pitch gain Q14 */ +/* Word32 *gain_code_fx o : Quantized codeebook gain Q16 */ +/* Word16 *gain_inov_fx o : unscaled innovation gain Q12 */ +/* Word32 *norm_gain_code_fx o : norm. gain of the codebook excit. Q16 */ /*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*--------------------------------------------------------------------------------------*/ -/* CALLED FROM : */ +/* CALLED FROM : */ /*======================================================================================*/ void gain_dec_tc_fx( @@ -198,30 +195,30 @@ void gain_dec_tc_fx( } /*======================================================================================*/ -/* FUNCTION : void gain_dec_tc_ivas_fx () */ +/* FUNCTION : void gain_dec_tc_ivas_fx () */ /*--------------------------------------------------------------------------------------*/ /* PURPOSE : Decoding of pitch and codebook gains and updating long term energies */ /*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* Word32 core_brate_fx i : core bitrate */ -/* Word16 *code_fx i : algebraic code excitation */ -/* Word16 L_frame_fx i : length of the frame */ -/* Word16 i_subfr_fx i : subframe number */ -/* Word16 tc_subfr_fx i : TC subframe index */ -/* Word16 Es_pred_fx i : predicted scaled innov. energy Q8 */ +/* INPUT ARGUMENTS : */ +/* Word32 core_brate_fx i : core bitrate */ +/* Word16 *code_fx i : algebraic code excitation */ +/* Word16 L_frame_fx i : length of the frame */ +/* Word16 i_subfr_fx i : subframe number */ +/* Word16 tc_subfr_fx i : TC subframe index */ +/* Word16 Es_pred_fx i : predicted scaled innov. energy Q8 */ /*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* Word16 *gain_pit_fx o : pitch gain Q14 */ -/* Word32 *gain_code_fx o : Quantized codeebook gain Q16 */ -/* Word16 *gain_inov_fx o : unscaled innovation gain Q12 */ -/* Word32 *norm_gain_code_fx o : norm. gain of the codebook excit. Q16 */ +/* OUTPUT ARGUMENTS : */ +/* Word16 *gain_pit_fx o : pitch gain Q14 */ +/* Word32 *gain_code_fx o : Quantized codeebook gain Q16 */ +/* Word16 *gain_inov_fx o : unscaled innovation gain Q12 */ +/* Word32 *norm_gain_code_fx o : norm. gain of the codebook excit. Q16 */ /*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*--------------------------------------------------------------------------------------*/ -/* CALLED FROM : */ +/* CALLED FROM : */ /*======================================================================================*/ void gain_dec_tc_ivas_fx( @@ -329,40 +326,39 @@ void gain_dec_tc_ivas_fx( } /*======================================================================================*/ -/* FUNCTION : gain_dec_mless_fx() */ +/* FUNCTION : gain_dec_mless_fx() */ /*--------------------------------------------------------------------------------------*/ -/* PURPOSE : Decoding of pitch and codebook gains without updating long term energies */ +/* PURPOSE : Decoding of pitch and codebook gains without updating long term energies */ /*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word32) core_brate_fx : core bitrate */ -/* _ (Word16) L_frame_fx : length of the frame */ -/* _ (Word16) coder_type : coding type */ -/* _ (Word16) i_subfr_fx : subframe index */ -/* _ (Word16) tc_subfr_fx : TC subframe index */ -/* _ (Word16*[]) code_fx : algebraic code excitation (Q12) */ -/* _ (Word16) Es_pred_fx : predicted scaled innov. energy (Q8) */ +/* INPUT ARGUMENTS : */ +/* _ (Word32) core_brate_fx : core bitrate */ +/* _ (Word16) L_frame_fx : length of the frame */ +/* _ (Word16) coder_type : coding type */ +/* _ (Word16) i_subfr_fx : subframe index */ +/* _ (Word16) tc_subfr_fx : TC subframe index */ +/* _ (Word16*[]) code_fx : algebraic code excitation (Q12) */ +/* _ (Word16) Es_pred_fx : predicted scaled innov. energy (Q8) */ /*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) gain_pit_fx : quantized pitch gain (Q14) */ -/* _ (Word32*) gain_code_fx : quantized codebook gain (Q16) */ -/* _ (Word16*) gain_inov_fx : gain of the innovation (used for normalization) (Q12) */ -/* _ (Word32*) norm_gain_code_fx : norm. gain of the codebook excitation (Q16) */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) gain_pit_fx : quantized pitch gain (Q14) */ +/* _ (Word32*) gain_code_fx : quantized codebook gain (Q16) */ +/* _ (Word16*) gain_inov_fx : gain of the innovation (used for normalization) (Q12) */ +/* _ (Word32*) norm_gain_code_fx : norm. gain of the codebook excitation (Q16) */ /*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ None */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ None */ /*--------------------------------------------------------------------------------------*/ - -/* _ None */ +/* _ None */ /*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*======================================================================================*/ void gain_dec_mless_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 L_frame_fx, /* i : length of the frame */ - const Word16 coder_type, /* i : coding type */ - const Word16 i_subfr_fx, /* i : subframe number */ - const Word16 tc_subfr_fx, /* i : TC subframe index */ + const Word16 L_frame_fx, /* i : length of the frame */ + const Word16 coder_type, /* i : coding type */ + const Word16 i_subfr_fx, /* i : subframe number */ + const Word16 tc_subfr_fx, /* i : TC subframe index */ const Word16 *code_fx, /* i : algebraic code excitation */ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ Word16 *gain_pit_fx, /* o : Quantized pitch gain Q14*/ @@ -471,7 +467,6 @@ void gain_dec_mless_fx( qua_table_fx = gain_qua_mless_6b_fx; /*Q14*/ if ( st_fx->element_mode > EVS_MONO ) { - // PMT("gain_qua_mless_6b_stereo to fixed point") qua_table_fx = gain_qua_mless_6b_stereo_fx; /*Q14*/ } BREAK; @@ -576,401 +571,32 @@ void gain_dec_mless_fx( } /*==================================================================================*/ -/* FUNCTION : gain_dec_lbr_fx() */ +/* FUNCTION : gain_dec_lbr_fx() */ /*----------------------------------------------------------------------------------*/ -/* PURPOSE : Decoding of pitch and codebook gains in ACELP at 6.6 and 7.5 kbps */ +/* PURPOSE : Decoding of pitch and codebook gains in ACELP at 6.6 and 7.5 kbps */ /*----------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word32) core_brate : core bitrate */ -/* _ (Word16) coder_type : coding type */ -/* _ (Word16) i_subfr : subframe index */ -/* _ (Word16*[]) code_fx : algebraic excitation (Q12) */ +/* INPUT ARGUMENTS : */ +/* _ (Word32) core_brate : core bitrate */ +/* _ (Word16) coder_type : coding type */ +/* _ (Word16) i_subfr : subframe index */ +/* _ (Word16*[]) code_fx : algebraic excitation (Q12) */ /*----------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) gain_pit_fx : quantized pitch gain (Q14) */ -/* _ (Word32*) gain_code_fx : quantized codebook gain (Q16) */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) gain_pit_fx : quantized pitch gain (Q14) */ +/* _ (Word32*) gain_code_fx : quantized codebook gain (Q16) */ /* _ (Word16*) gain_inov_fx : gain of the innovation (used for normalization) (Q12) */ -/* _ (Word32*) norm_gain_code_fx : norm. gain of the codebook excitation (Q12) */ +/* _ (Word32*) norm_gain_code_fx : norm. gain of the codebook excitation (Q12) */ /*----------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ None */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ None */ /*----------------------------------------------------------------------------------*/ - -/* _ None */ +/* _ None */ /*----------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*==================================================================================*/ -void gain_dec_lbr_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 coder_type, /* i : coding type */ - const Word16 i_subfr, /* i : subframe index */ - const Word16 *code_fx, /* i : algebraic excitation Q9 */ - Word16 *gain_pit_fx, /* o : quantized pitch gain Q14*/ - Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov_fx, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ - Word32 gc_mem[], /* i/o: gain_code from previous subframes Q16*/ - Word16 gp_mem[], /* i/o: gain_pitch from previous subframes Q14*/ - const Word16 L_subfr /* i : subfr lenght */ -) -{ - Word16 index, nBits, n_pred, ctype; - Word16 gcode0_fx, aux_fx[10]; - Word32 L_tmp, L_tmp1, L_tmp2; - Word16 expg, expg2, e_tmp, exp_gcode0, f_tmp, frac, tmp_fx; - const Word16 *b_fx, *cdbk_fx = 0; - /* Ecode = ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR; - *gain_inov = 1.0f / (float)sqrt(Ecode); */ - Word16 shift_L_subfr; - shift_L_subfr = 6; - move16(); // for *cdbk_fx - move16(); - if ( GT_16( L_subfr, L_SUBFR ) ) - { - shift_L_subfr = add( shift_L_subfr, 1 ); - } - L_tmp = Dot_product12( code_fx, code_fx, L_subfr, &expg ); /*Q31 - expg*/ - expg = sub( expg, add( 18, shift_L_subfr ) ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ - - expg2 = expg; - move16(); - L_tmp2 = L_tmp; /* sets to 'L_tmp' in 1 clock */ - move32(); - L_tmp = Isqrt_lc( L_tmp, &expg ); /*Q31 - expg*/ - - *gain_inov_fx = extract_h( L_shl_sat( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ - move16(); - - /*-----------------------------------------------------------------* - * select the codebook, size and number of bits - * set the gains searching range - *-----------------------------------------------------------------*/ - nBits = st_fx->acelp_cfg.gains_mode[shr( i_subfr, shift_L_subfr )]; - move16(); - - ctype = shl( sub( coder_type, 1 ), 1 ); - - /*-----------------------------------------------------------------* - * calculate prediction of gcode - * search for the best codeword - *-----------------------------------------------------------------*/ - IF( i_subfr == 0 ) - { - b_fx = b_1sfr_fx; - move16(); - n_pred = 2; - move16(); - cdbk_fx = gp_gamma_1sfr_6b_fx; - SWITCH( nBits ) - { - case 8: - { - cdbk_fx = gp_gamma_1sfr_8b_fx; /* Q14/Q9*/ - BREAK; - } - case 7: - { - cdbk_fx = gp_gamma_1sfr_7b_fx; /* Q14/Q9*/ - BREAK; - } - case 6: - { - cdbk_fx = gp_gamma_1sfr_6b_fx; /* Q14/Q9*/ - BREAK; - } - } - /* calculate predicted gain */ - aux_fx[0] = 4096; /*Q12*/ - move16(); - aux_fx[1] = shl( ctype, 12 ); /*Q12*/ - move16(); - - /* gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.5f * (float)log10(Ecode)); - gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.05f * 10 * (float)log10(Ecode)); - gcode0 = (float)pow(10, 0.05(20 * dotp(b, aux, n_pred) - 10 * (float)log10(Ecode))); */ - - e_tmp = norm_l( L_tmp2 ); - f_tmp = Log2_norm_lc( L_shl( L_tmp2, e_tmp ) ); /*Q15*/ - e_tmp = sub( expg2, add( 1, e_tmp ) ); - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 12330 ); /* Q13 */ /* 10*log10(2) in Q12*/ - - L_tmp = Dot_product( b_fx, aux_fx, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 160 ); /*Q13, 20 in Q3*/ - L_tmp = L_sub( L_tmp, L_tmp1 ); /*Q13*/ - - gcode0_fx = round_fx( L_shl( L_tmp, 11 ) ); /* Q8 */ - - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, gcode0/20) - * = pow(2, 3.321928*gcode0/20) - * = pow(2, 0.166096*gcode0) - *-----------------------------------------------------------------*/ - - L_tmp = L_mult( gcode0_fx, 21771 ); /* *0.166096 in Q17 -> Q26 */ - L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - /* retrieve the codebook index and calculate both gains */ - /*index = (Word16)get_indice( st_fx,"gain", i_subfr, ACELP_CORE);move16();*/ - index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ - move16(); - - *gain_pit_fx = cdbk_fx[index * 2]; /*Q14*/ - move16(); - - L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /* Q10 -> Q16*/ - move16(); - - gc_mem[0] = *gain_code_fx; /*Q16*/ - move32(); - gp_mem[0] = *gain_pit_fx; /*Q14*/ - move16(); - } - ELSE IF( EQ_16( i_subfr, L_SUBFR ) || EQ_16( L_subfr, 2 * L_SUBFR ) ) - { - b_fx = b_2sfr_fx; /*Q12*/ - move16(); - n_pred = 4; - move16(); - - cdbk_fx = gp_gamma_1sfr_6b_fx; /*Q14/Q9 */ - SWITCH( nBits ) - { - case 7: - { - cdbk_fx = gp_gamma_2sfr_7b_fx; /* Q14/Q9*/ - BREAK; - } - case 6: - { - cdbk_fx = gp_gamma_2sfr_6b_fx; /* Q14/Q9*/ - BREAK; - } - } - - /* calculate predicted gain */ - aux_fx[0] = 4096; /*Q12*/ - move16(); - aux_fx[1] = shl( ctype, 12 ); /*Q12*/ - move16(); - - /*aux_fx[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ - e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - aux_fx[3] = shr( gp_mem[0], 2 ); /*Q12*/ - move16(); - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, dotp(b, aux, n_pred) - * = pow(2, 3.321928*dotp(b, aux, n_pred) - *-----------------------------------------------------------------*/ - L_tmp = Dot_product( b_fx, aux_fx, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 27213 ); /* *3.321928 in Q13 -> Q23 */ - L_tmp = L_shr( L_tmp, 7 ); /* From Q23 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - /* retrieve the codebook index and calculate both gains */ - index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ - move16(); - - *gain_pit_fx = cdbk_fx[index * 2]; /*Q14*/ - move16(); - - L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /*Q16*/ - move16(); - - gc_mem[1] = *gain_code_fx; /*Q16*/ - move32(); - gp_mem[1] = *gain_pit_fx; /*Q14*/ - move16(); - } - ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - b_fx = b_3sfr_fx; - move16(); - n_pred = 6; - move16(); - - cdbk_fx = gp_gamma_3sfr_6b_fx; /*Q14/Q9 */ - - if ( EQ_16( nBits, 7 ) ) - { - cdbk_fx = gp_gamma_3sfr_7b_fx; /*Q14*/ - // PMT("verify if gp_gamma_3sfr_7b_fx is correct") - } - - /* calculate predicted gain */ - aux_fx[0] = 4096; /*Q12*/ - move16(); - aux_fx[1] = shl( ctype, 12 ); /*Q12*/ - move16(); - - /*aux_fx[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ - e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - /*aux[3] = (float)log10(gc_mem[1]); - = log2(gc_mem[1])*log10(2);*/ - e_tmp = norm_l( gc_mem[1] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - aux_fx[4] = shr( gp_mem[0], 2 ); /*Q12*/ - move16(); - aux_fx[5] = shr( gp_mem[1], 2 ); /*Q12*/ - move16(); - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, dotp(b, aux, n_pred) - * = pow(2, 3.321928*dotp(b, aux, n_pred) - *-----------------------------------------------------------------*/ - L_tmp = Dot_product( b_fx, aux_fx, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 27213 ); /* *3.321928 in Q13 -> Q23 */ - L_tmp = L_shr( L_tmp, 7 ); /* From Q23 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - /* retrieve the codebook index and calculate both gains */ - index = (Word16) get_next_indice_fx( st_fx, nBits ); - move16(); - - *gain_pit_fx = cdbk_fx[( index * 2 )]; /*Q14*/ - move16(); - - L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /* Q10 -> Q16*/ - move32(); - gc_mem[2] = *gain_code_fx; /*Q16*/ - move32(); - gp_mem[2] = *gain_pit_fx; /*Q14*/ - move16(); - } - ELSE IF( EQ_16( i_subfr, 3 * L_SUBFR ) ) - { - b_fx = b_4sfr_fx; /*Q12*/ - n_pred = 8; - move16(); - - - cdbk_fx = gp_gamma_4sfr_6b_fx; /*Q14*/ -#ifdef IVAS_GAIN_MOD - IF( EQ_16( nBits, 7 ) ) - { - cdbk_fx = gp_gamma_4sfr_7b_fx; - PMT( "verify if gp_gamma_4sfr_7b_fx is correct" ) - } -#endif - - /* calculate predicted gain */ - aux_fx[0] = 4096; /*Q12*/ - move16(); - aux_fx[1] = shl( ctype, 12 ); /*Q12*/ - move16(); - - /*aux[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ - e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - /*aux[3] = (float)log10(gc_mem[1]); - = log2(gc_mem[1])*log10(2);*/ - e_tmp = norm_l( gc_mem[1] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - /*aux[4] = (float)log10(gc_mem[2]); - = log2(gc_mem[2])*log10(2);*/ - e_tmp = norm_l( gc_mem[2] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[2], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[2])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[4] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - aux_fx[5] = shr( gp_mem[0], 2 ); /*Q12*/ - move16(); - aux_fx[6] = shr( gp_mem[1], 2 ); /*Q12*/ - move16(); - aux_fx[7] = shr( gp_mem[2], 2 ); /*Q12*/ - move16(); - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, dotp(b, aux, n_pred) - * = pow(2, 3.321928*dotp(b, aux, n_pred) - *-----------------------------------------------------------------*/ - L_tmp = Dot_product( b_fx, aux_fx, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 27213 ); /* *3.321928 in Q13 -> Q23 */ - L_tmp = L_shr( L_tmp, 7 ); /* From Q23 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - /* retrieve the codebook index and calculate both gains */ - index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ - move16(); - *gain_pit_fx = cdbk_fx[( index * 2 )]; /*Q14*/ - move16(); - - L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /*Q16*/ - move32(); - } - - /* *norm_gain_code = *gain_code / *gain_inov; */ - expg = sub( norm_s( *gain_inov_fx ), 1 ); - expg = s_max( expg, 0 ); - - tmp_fx = div_s( shr( 8192, expg ), *gain_inov_fx ); /*Q15*/ - *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); /*Q16*/ - move32(); - - return; -} - -void gain_dec_lbr_ivas_fx( +void gain_dec_lbr_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 coder_type, /* i : coding type */ const Word16 i_subfr, /* i : subframe index */ @@ -990,7 +616,7 @@ void gain_dec_lbr_ivas_fx( Word16 expg, expg2, e_tmp, exp_gcode0, f_tmp, frac, tmp_fx; const Word16 *b_fx, *cdbk_fx = 0; /* Ecode = ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR; - *gain_inov = 1.0f / (float)sqrt(Ecode); */ + *gain_inov = 1.0f / (float)sqrt(Ecode); */ Word16 shift_L_subfr; shift_L_subfr = 6; move16(); // for *cdbk_fx @@ -1187,7 +813,6 @@ void gain_dec_lbr_ivas_fx( if ( EQ_16( nBits, 7 ) ) { cdbk_fx = gp_gamma_3sfr_7b_fx; /*Q14*/ - // PMT("verify if gp_gamma_3sfr_7b_fx is correct") } /* calculate predicted gain */ @@ -1260,7 +885,6 @@ void gain_dec_lbr_ivas_fx( IF( EQ_16( nBits, 7 ) ) { cdbk_fx = gp_gamma_4sfr_7b_fx; /*Q14*/ - // PMT( "verify if gp_gamma_4sfr_7b_fx is correct" ) } /* calculate predicted gain */ @@ -1345,7 +969,7 @@ void gain_dec_lbr_ivas_fx( /* PURPOSE : Update of LP pitch and code gains (FEC) */ /* */ /*-----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _ (Word16) i_subfr : subframe number Q0 */ /* _ (Word16) gain_pit : Decoded gain pitch Q14 */ /* _ (Word32) norm_gain_code : Normalised gain code Q16 */ @@ -1457,7 +1081,7 @@ void lp_gain_updt_fx( /* PURPOSE : Update of LP pitch and code gains (FEC) */ /* */ /*-----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _ (Word16) i_subfr : subframe number Q0 */ /* _ (Word16) gain_pit : Decoded gain pitch Q14 */ /* _ (Word32) norm_gain_code : Normalised gain code Q16 */ @@ -1581,24 +1205,28 @@ void lp_gain_updt_ivas_fx( } /*-------------------------------------------------* - * Gain_dec_gaus_vbr + * gain_dec_gaus_fx() * * Decode gains of purely unvoiced sounds *-------------------------------------------------*/ -Word32 gain_dec_gaus_fx( /* o : quantized codebook gain Q16 */ - Word16 index, /* i : quantization index */ - const Word16 bits, /* i : number of bits to quantize */ - const Word16 lowBound, /* i : lower bound of quantizer (dB) */ - const Word16 topBound, /* i : upper bound of quantizer (dB) */ - const Word16 inv_gain_inov, /* o : unscaled innovation gain Q12 */ - Word32 *L_norm_gain_code /* o : gain of normalized gaussian excitation Q16 */ + +/*! r: quantized codebook gain Q16 */ +Word32 gain_dec_gaus_fx( + Word16 index, /* i : quantization index */ + const Word16 bits, /* i : number of bits to quantize */ + const Word16 lowBound, /* i : lower bound of quantizer (dB) */ + const Word16 topBound, /* i : upper bound of quantizer (dB) */ + const Word16 inv_gain_inov, /* o : unscaled innovation gain Q12 */ + Word32 *L_norm_gain_code /* o : gain of normalized gaussian excitation Q16 */ ) { Word16 stepSize, gain, expg, frac, expi, tmp_igi; Word32 L_tmp, L_enr_q, L_gain; Word16 stepSize_Exp; + stepSize_Exp = 14; move16(); + /*------------------------------------------------------------------------------------------* * Quantize linearly the log E *------------------------------------------------------------------------------------------*/ @@ -1773,10 +1401,6 @@ void gain_dec_amr_wb_fx( Word16 tmp; Word32 L_tmp; Word16 expg, exp_gcode0, fracg; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /**gain_inov = 1.0f/ (float)sqrt( ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR );*/ @@ -1860,7 +1484,7 @@ void gain_dec_amr_wb_fx( /* adjust gain according to energy of code */ L_tmp = Mult_32_16( *gain_code, *gain_inov ); - *gain_code = L_shl_o( L_tmp, 3, &Overflow ); /* gcode_inov in Q12*/ + *gain_code = L_shl_sat( L_tmp, 3 ); /* gcode_inov in Q12*/ move32(); /*-----------------------------------------------------------------* diff --git a/lib_dec/gaus_dec_fx.c b/lib_dec/gaus_dec_fx.c index 802cc3b41038f32049ae632f56b2f476905625ba..d49ecb5b7a90acfa8ff9ef6503a90004bfe22adc 100644 --- a/lib_dec/gaus_dec_fx.c +++ b/lib_dec/gaus_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -23,23 +23,23 @@ static void dec_2pos_fx( Word16 index, Word16 *ind1, Word16 *ind2, Word16 *sign1 * - find the excitation *---------------------------------------------------------------------*/ void gaus_dec_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 i_subfr, /* i : subframe index */ - Word16 *code, /* o : unvoiced excitation Q12 */ - Word32 *L_norm_gain_code, /* o : gain of normalized gaussian excitation Q16 */ - Word16 *lp_gainp, /* i/o : lp filtered pitch gain(FER) Q14 */ - Word16 *lp_gainc, /* i/o : lp filtered code gain (FER) Q3 */ - Word16 *inv_gain_inov, /* o : unscaled innovation gain Q12 */ - Word16 *tilt_code, /* o : synthesis excitation spectrum tilt Q15 */ - Word16 *voice_fac, /* o : estimated voicing factor Q15 */ - Word16 *gain_pit, /* o : pitch gain Q14 */ - Word16 *pt_pitch_1, /* o : floating pitch buffer Q6 */ - Word16 *exc, /* o : excitation signal frame */ - Word32 *L_gain_code, /* o : gain of the gaussian excitation Q16 */ - Word16 *exc2, /* o : Scaled excitation signal frame */ + Decoder_State *st_fx, /* i/o: decoder static memory */ + const Word16 i_subfr, /* i : subframe index */ + Word16 *code, /* o : unvoiced excitation Q12 */ + Word32 *L_norm_gain_code, /* o : gain of normalized gaussian excitation Q16 */ + Word16 *lp_gainp, /* i/o : lp filtered pitch gain(FER) Q14 */ + Word16 *lp_gainc, /* i/o : lp filtered code gain (FER) Q3 */ + Word16 *inv_gain_inov, /* o : unscaled innovation gain Q12 */ + Word16 *tilt_code, /* o : synthesis excitation spectrum tilt Q15 */ + Word16 *voice_fac, /* o : estimated voicing factor Q15 */ + Word16 *gain_pit, /* o : pitch gain Q14 */ + Word16 *pt_pitch_1, /* o : floating pitch buffer Q6 */ + Word16 *exc, /* o : excitation signal frame */ + Word32 *L_gain_code, /* o : gain of the gaussian excitation Q16 */ + Word16 *exc2, /* o : Scaled excitation signal frame */ Word16 *bwe_exc_fx, - Word16 *sQ_exc, /* i/o : Excitation scaling factor (Decoder state) */ - Word16 *sQsubfr /* i/o : Past excitation scaling factors (Decoder State) */ + Word16 *sQ_exc, /* i/o : Excitation scaling factor (Decoder state) */ + Word16 *sQsubfr /* i/o : Past excitation scaling factors (Decoder State) */ ) { Word16 i, exp, gain_code; diff --git a/lib_dec/gs_dec_amr_wb_fx.c b/lib_dec/gs_dec_amr_wb_fx.c index 65e9eaa87c777a89fa575441dfc820f571d521d5..326c2f91976fd0087b8b6bdc60edd852091dd4d1 100644 --- a/lib_dec/gs_dec_amr_wb_fx.c +++ b/lib_dec/gs_dec_amr_wb_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -24,9 +24,6 @@ #define NORMALIZE_SPECS_Q_OUT 6 #define ENER_FX_Q_GUARD 1 -#ifdef ADD_IVAS_GS_DEC_IMPR -#define CONTR_LIMIT 3012 to be verified for fixed point /* Threshold to allow an increase in the contribution length */ -#endif /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ @@ -34,12 +31,7 @@ static void NoiseFill_fx( Word16 *exc_diffQ_fx, Word16 *seed_tcx, const Word16 M static void Ener_per_band_fx( const Word16 exc_diff_fx[], const Word16 exc_diff_exp, Word32 y_gain4_fx[] ); static void Apply_gain_fx( Word16 exc_diffQ_fx[], Word32 L_Ener_per_bd_iQ[], Word32 L_Ener_per_bd_yQ[], const Word16 Q_out ); static void normalize_spec_fx( Word16 fac_up_fx, Word16 fy_norm_fx[], const Word16 L_frame, const Word16 Q_out ); -static void gs_dec_amr_wb_fx( const long core_brate, Word16 *seed_tcx, const Word16 dct_in_fx[], const Word16 Q_dct_in, Word16 dct_out_fx[], Word16 Q_dct_out, const Word16 pitch_fx[], const Word16 voice_fac, const Word16 clas, const Word16 coder_type -#ifdef ADD_IVAS_GS_DEC_IMPR - , - const Word16 VeryLowRateSTflag -#endif -); +static void gs_dec_amr_wb_fx( const long core_brate, Word16 *seed_tcx, const Word16 dct_in_fx[], const Word16 Q_dct_in, Word16 dct_out_fx[], Word16 Q_dct_out, const Word16 pitch_fx[], const Word16 voice_fac, const Word16 clas, const Word16 coder_type ); /*-------------------------------------------------------------------* * NoiseFill_fx() @@ -84,8 +76,8 @@ static void NoiseFill_fx( static void Ener_per_band_fx( const Word16 exc_diff_fx[], /* i : target signal exp(exc_diff_exp)*/ - const Word16 exc_diff_exp, /* i : Exponent of exc_diff_fx */ - Word32 y_gain4_fx[] /* o : Energy per band to quantize Q16*/ + const Word16 exc_diff_exp, /* i : Exponent of exc_diff_fx */ + Word32 y_gain4_fx[] /* o : Energy per band to quantize Q16*/ ) { const Word16 *ptr16; @@ -130,8 +122,7 @@ static void Ener_per_band_fx( static void Apply_gain_fx( Word16 exc_diffQ_fx[], /* i/o: Quantized excitation Qx*/ Word32 L_Ener_per_bd_iQ[], /* i : Target ener per band Q16*/ - Word32 L_Ener_per_bd_yQ[] /* i : Ener per band for norm vector Qx*/ - , + Word32 L_Ener_per_bd_yQ[], /* i : Ener per band for norm vector Qx*/ const Word16 Q_out ) { Word16 i_band; @@ -181,10 +172,10 @@ static void Apply_gain_fx( *-------------------------------------------------------------------*/ static void normalize_spec_fx( - Word16 fac_up_fx, /* i : Core bitrate (Q8)*/ - Word16 fy_norm_fx[], /* i/o: Frequency quantized parameter (Q8)*/ - const Word16 L_frame, /* i : Section lenght Q0*/ - const Word16 Q_out /* i : Q of fy_norm_fx[] */ + Word16 fac_up_fx, /* i : Core bitrate (Q8)*/ + Word16 fy_norm_fx[], /* i/o: Frequency quantized parameter (Q8)*/ + const Word16 L_frame, /* i : Section lenght Q0*/ + const Word16 Q_out /* i : Q of fy_norm_fx[] */ ) { Word16 idx, j; @@ -220,13 +211,9 @@ static void gs_dec_amr_wb_fx( Word16 dct_out_fx[], /* o : dct of pitch only excitation Q_dct_out*/ Word16 Q_dct_out, /* o : Exponent of dct_out_fx */ const Word16 pitch_fx[], /* i : pitch buffer Q6*/ - const Word16 voice_fac, /* i : gain pitch Q15*/ + const Word16 voice_fac, /* i : gain pitch Q15*/ const Word16 clas, /* i : signal frame class Q0*/ const Word16 coder_type /* i : coder type Q0*/ -#ifdef ADD_IVAS_GS_DEC_IMPR - , - const Word16 VeryLowRateSTflag /* i : Enable the noise enhancement for very low rate stereo generic mode */ -#endif ) { Word16 i, mDiff_len; @@ -280,13 +267,7 @@ static void gs_dec_amr_wb_fx( temp = Invert16( temp, &exp ); /* Q15 */ L_temp = L_mult( temp, 12800 ); /* Q15 */ L_temp = L_shl( L_temp, sub( 3, exp ) ); /* *8.0f */ /* Q15 */ -#ifdef ADD_IVAS_GS_DEC_IMPR - test(); - test(); - IF( L_temp <= CONTR_LIMIT && ( VeryLowRateSTflag || GE_32( core_brate, ACELP_12k65 ) ) ) -#else if ( GE_32( core_brate, ACELP_12k65 ) ) -#endif { L_temp = L_shl( L_temp, 1 ); /* Q16 */ } @@ -311,16 +292,6 @@ static void gs_dec_amr_wb_fx( mDiff_len = s_max( round_fx( L_temp ), BIN_1k2 ); /* Q0 */ -#ifdef ADD_IVAS_GS_DEC_IMPR - IF( ( VeryLowRateSTflag && ( EQ_16( clas, VOICED_CLAS ) || EQ_16( clas, AUDIO_CLAS ) ) ) ) /* Do not apply normalization on VOICED signal in case of stereo */ - { - Copy( dct_in_fx, exc_diffQ, L_FRAME ); - - /* normalization of the spectrum and noise fill */ - normalize_spec_fx( 1 * 256, exc_diffQ + mDiff_len, sub( L_FRAME, mDiff_len ), NORMALIZE_SPECS_Q_OUT ); - } - ELSE -#endif { Copy( dct_in_fx, exc_diffQ_fx, mDiff_len ); /* Q_dct_in */ set16_fx( exc_diffQ_fx + mDiff_len, 0, sub( L_FRAME, mDiff_len ) ); @@ -369,37 +340,31 @@ static void gs_dec_amr_wb_fx( * unvoiced and audio signals (used only in AMR-WB IO mode) *-------------------------------------------------------------------*/ void improv_amr_wb_gs_fx( - const Word16 clas, /* i : signal frame class Q0*/ - const Word16 coder_type, /* i : coder type Q0*/ - const Word32 core_brate, /* i : bitrate allocated to the core Q0*/ - Word16 *seed_tcx, /* i/o: Seed used for noise generation Q0*/ - Word16 *old_Aq_fx, /* i/o: old LPC filter coefficient q_old_Aq*/ + const Word16 clas, /* i : signal frame class Q0*/ + const Word16 coder_type, /* i : coder type Q0*/ + const Word32 core_brate, /* i : bitrate allocated to the core Q0*/ + Word16 *seed_tcx, /* i/o: Seed used for noise generation Q0*/ + Word16 *old_Aq_fx, /* i/o: old LPC filter coefficient q_old_Aq*/ Word16 *mem_syn2_fx, /* i/o: synthesis memory Q_syn*/ - const Word16 lt_voice_fac_fx, /* i/o: long term voice factor Q14*/ + const Word16 lt_voice_fac_fx, /* i/o: long term voice factor Q14*/ const Word16 locattack, /* i : Flag for a detected attack Q0*/ Word16 *Aq_fx, /* i/o: Decoded LP filter coefficient q_Aq*/ Word16 *exc2_fx, /* i/o: Decoded complete excitation Q_exc2*/ - const Word16 Q_exc2, /* i : Exponent of Exc2 */ - Word16 *mem_tmp_fx, /* i/o: synthesis temporary memory Q_syn*/ + const Word16 Q_exc2, /* i : Exponent of Exc2 */ + Word16 *mem_tmp_fx, /* i/o: synthesis temporary memory Q_syn*/ Word16 *syn_fx, /* o: Decoded synthesis to be updated Q_syn*/ - const Word16 Q_syn, /* i : Synthesis scaling */ - const Word16 *pitch_buf_fx, /* i : Decoded pitch buffer Q6*/ - const Word16 Last_ener_fx, /* i : Last energy (Q8) Q0*/ - const Word16 rate_switching_reset, /* i : rate switching reset flag Q0*/ - const Word16 last_coder_type /* i : Last coder_type Q0*/ -#ifdef ADD_IVAS_GS_DEC_IMPR - , - const Word16 VeryLowRateSTflag /* i : Enable the noise enhancement for very low rate stereo generic mode */ -#endif + const Word16 Q_syn, /* i : Synthesis scaling */ + const Word16 *pitch_buf_fx, /* i : Decoded pitch buffer Q6*/ + const Word16 Last_ener_fx, /* i : Last energy (Q8) Q0*/ + const Word16 rate_switching_reset, /* i : rate switching reset flag Q0*/ + const Word16 last_coder_type /* i : Last coder_type Q0*/ ) { Word16 i, exp_a, exp_b, exp_diff, j; Word16 dct_exc_in_fx[L_FRAME], dct_exc_out_fx[L_FRAME]; Word16 Aq_orig[NB_SUBFR * ( M + 1 )], enr_LP_old, enr_LP_new; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif /*------------------------------------------------------------* * Condition to enter the section on excitation modification @@ -413,18 +378,10 @@ void improv_amr_wb_gs_fx( test(); test(); test(); -#ifdef ADD_IVAS_GS_DEC_IMPR - IF( VeryLowRateSTflag || - ( ( locattack == 0 && LE_32( core_brate, ACELP_12k65 ) ) && - ( ( LT_32( core_brate, ACELP_8k85 ) && NE_16( clas, AUDIO_CLAS ) && - ( EQ_16( clas, UNVOICED_CLAS ) || EQ_16( clas, VOICED_TRANSITION ) ) ) || - EQ_16( coder_type, INACTIVE ) ) ) ) -#else IF( ( locattack == 0 && LE_32( core_brate, ACELP_12k65 ) ) && ( ( LT_32( core_brate, ACELP_8k85 ) && NE_16( clas, AUDIO_CLAS ) && ( ( clas == UNVOICED_CLAS ) || EQ_16( clas, VOICED_TRANSITION ) ) ) || ( EQ_16( coder_type, INACTIVE ) ) ) ) -#endif { /*------------------------------------------------------------* * two differents paths: @@ -494,12 +451,7 @@ void improv_amr_wb_gs_fx( * Go back to time domain -> Overwrite exctiation *------------------------------------------------------------*/ edct_16fx( exc2_fx, dct_exc_in_fx, L_FRAME, 6, EVS_MONO ); - gs_dec_amr_wb_fx( core_brate, seed_tcx, dct_exc_in_fx, Q_exc2, dct_exc_out_fx, Q_exc2, pitch_buf_fx, lt_voice_fac_fx, clas, coder_type -#ifdef ADD_IVAS_GS_DEC_IMPR - , - VeryLowRateSTflag -#endif - ); + gs_dec_amr_wb_fx( core_brate, seed_tcx, dct_exc_in_fx, Q_exc2, dct_exc_out_fx, Q_exc2, pitch_buf_fx, lt_voice_fac_fx, clas, coder_type ); edct_16fx( dct_exc_out_fx, exc2_fx, L_FRAME, 6, EVS_MONO ); /*------------------------------------------------------------* diff --git a/lib_dec/gs_dec_fx.c b/lib_dec/gs_dec_fx.c index 6c63377fd4798954750060a7477bcf5bf9ad161e..5564dc1b8176c177c0076abf7362b40c43a02a26 100644 --- a/lib_dec/gs_dec_fx.c +++ b/lib_dec/gs_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -9,458 +9,39 @@ #include "prot_fx.h" #include "ivas_cnst.h" /*=========================================================================*/ -/* FUNCTION : void decod_audio_fx(); */ +/* FUNCTION : void decod_audio_fx(); */ /*-------------------------------------------------------------------------*/ -/* PURPOSE : Decode audio (AC) frames */ +/* PURPOSE : Decode audio (AC) frames */ /*-------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16[]) Aq : LP filter coefficient Q12 */ -/* _ (Word16) coder_type : coding type Q0 */ +/* INPUT ARGUMENTS : */ +/* _ (Word16[]) Aq : LP filter coefficient Q12 */ +/* _ (Word16) coder_type : coding type Q0 */ /* _(Word16) Q_exc :Q format of excitation */ /*-------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ -/* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Decoder_State *st_fx : decoder memory structure */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*==========================================================================*/ -void decod_audio_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : floating pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *lsf_new /* i : ISFs at the end of the frame Qx*/ - , - Word16 *gain_buf /*Q14*/ -) -{ - Word16 tmp_nb_bits_tot, pit_band_idx; - Word16 code[4 * L_SUBFR]; - Word16 Diff_len, nb_subfr, i; - Word16 nb_frame_flg; - Word16 Es_pred = 0; - Word16 Len, max_len; - Word16 gsc_attack_flag; - - Word16 low_pit; - Word16 last_bin; - Word16 nbits; - - Word16 exc_wo_nf[L_FRAME16k]; - GSC_DEC_HANDLE hGSCDec; - hGSCDec = st_fx->hGSCDec; - - - /*---------------------------------------------------------------* - * Initialization - *---------------------------------------------------------------*/ - move16(); // corresponding to initialization of Es_pred - Diff_len = 0; - move16(); - - /* decode GSC attack flag (used to reduce possible pre-echo) */ - gsc_attack_flag = (Word16) get_next_indice_fx( st_fx, 1 ); /* Q0 */ - move16(); - - /* decode GSC SWB speech flag */ - test(); - IF( st_fx->coder_type != INACTIVE && GE_32( st_fx->total_brate, ACELP_13k20 ) ) - { - st_fx->GSC_noisy_speech = (Word16) get_next_indice_fx( st_fx, 1 ); /* Q0 */ - move16(); - } - - /* safety check in case of bit errors */ - test(); - test(); - IF( st_fx->GSC_noisy_speech && LT_16( st_fx->bwidth, SWB ) && st_fx->GSC_IVAS_mode == 0 ) - { - st_fx->BER_detect = 1; /* Q0 */ - move16(); - st_fx->GSC_noisy_speech = 0; /* Q0 */ - move16(); - } - - /* set bit-allocation */ -#ifdef NONBE_FIX_GSC_BSTR - config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#else - config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#endif - - /*---------------------------------------------------------------* - * Decode energy dynamics - *---------------------------------------------------------------*/ - - IF( EQ_16( st_fx->GSC_noisy_speech, 1 ) ) - { - nb_subfr = NB_SUBFR; /* Q0 */ - move16(); - hGSCDec->cor_strong_limit = 0; - move16(); - hGSCDec->noise_lev = NOISE_LEVEL_SP3; /* Q0 */ - move16(); - } - ELSE - { - IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) - { - hGSCDec->noise_lev = add( (Word16) get_next_indice_fx( st_fx, 2 ), NOISE_LEVEL_SP2 ); /* Q0 */ - move16(); - } - ELSE - { - hGSCDec->noise_lev = add( (Word16) get_next_indice_fx( st_fx, 3 ), NOISE_LEVEL_SP0 ); /* Q0 */ - move16(); - } - - /*---------------------------------------------------------------* - * Decode number of subframes - *---------------------------------------------------------------*/ - - - hGSCDec->cor_strong_limit = 1; /* Q0 */ - move16(); - nb_subfr = SWNB_SUBFR; - move16(); - - IF( GE_32( st_fx->core_brate, ACELP_9k60 ) ) - { - nbits = 1; - move16(); - nb_frame_flg = (Word16) get_next_indice_fx( st_fx, nbits ); /* Q0 */ - move16(); - - IF( s_and( nb_frame_flg, 0x1 ) == 0 ) - { - nb_subfr = 2 * SWNB_SUBFR; /* Q0 */ - move16(); - hGSCDec->cor_strong_limit = 0; - move16(); - } - } - } - - /*---------------------------------------------------------------* - * Decode the last band where the adaptive (pitch) contribution is significant - *---------------------------------------------------------------*/ - - IF( LT_32( st_fx->core_brate, CFREQ_BITRATE ) ) - { - nbits = 3; /* Q0 */ - move16(); - test(); - if ( LT_32( st_fx->core_brate, ACELP_9k60 ) && st_fx->coder_type == INACTIVE ) - { - nbits = 1; /* Q0 */ - move16(); - } - } - ELSE - { - nbits = 4; /* Q0 */ - move16(); - } - test(); - IF( LT_32( st_fx->core_brate, ACELP_9k60 ) && st_fx->coder_type != INACTIVE ) - { - pit_band_idx = 1; /* Q0 */ - move16(); - } - ELSE - { - pit_band_idx = (Word16) get_next_indice_fx( st_fx, nbits ); /* Q0 */ - move16(); - } - - IF( pit_band_idx != 0 ) - { - IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) - { - pit_band_idx = 7 + BAND1k2; /* Q0 */ - move16(); /* At low rate, if pitch model is chosen, then for to be use on extented and constant frequency range */ - } - ELSE - { - pit_band_idx = add( pit_band_idx, BAND1k2 ); /* Q0 */ - } - - /* detect bit errors in the bitstream */ - IF( GT_16( pit_band_idx, 13 ) ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ - { - pit_band_idx = 13; /* Q0 */ - move16(); - st_fx->BER_detect = 1; /* Q0 */ - move16(); - } - Diff_len = mfreq_loc_div_25[pit_band_idx]; /* Q0 */ - move16(); - } - hGSCDec->Last_GSC_pit_band_idx = pit_band_idx; /* Q0 */ - move16(); - - - /*--------------------------------------------------------------------------------------* - * Decode adaptive (pitch) excitation contribution - * Reset unvaluable part of the adaptive (pitch) excitation contribution - *--------------------------------------------------------------------------------------*/ - IF( GT_16( pit_band_idx, BAND1k2 ) ) - { - /*---------------------------------------------------------------* - * Decode adaptive (pitch) excitation contribution - *---------------------------------------------------------------*/ - test(); - IF( EQ_16( st_fx->GSC_noisy_speech, 1 ) && EQ_16( nb_subfr, NB_SUBFR ) ) - { - Word16 indice; - nbits = Es_pred_bits_tbl[BIT_ALLOC_IDX_fx( st_fx->core_brate, GENERIC, -1, -1 )]; /* Q0 */ - move16(); - if ( st_fx->element_mode > EVS_MONO ) - { - nbits = 5; - move16(); - } - - indice = get_next_indice_fx( st_fx, nbits ); /* Q0 */ - - Es_pred_dec_fx( &Es_pred, indice, nbits, 0 ); - } - - dec_pit_exc_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf ); - - IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) - { - minimum_fx( pitch_buf, shr( st_fx->L_frame, 6 ), &low_pit ); - low_pit = shr( low_pit, 6 ); /*Q6 -> Q0 */ - - IF( LT_16( low_pit, 64 ) ) - { - pit_band_idx = 9 + BAND1k2; /* Q0 */ - move16(); - if ( st_fx->bwidth == NB ) - { - pit_band_idx = 7 + BAND1k2; /* Q0 */ - move16(); - } - } - ELSE IF( LT_16( low_pit, 128 ) ) - { - pit_band_idx = 5 + BAND1k2; /* Q0 */ - move16(); - } - ELSE - { - pit_band_idx = 3 + BAND1k2; /* Q0 */ - move16(); - } - - Diff_len = mfreq_loc_div_25[pit_band_idx]; /* Q0 */ - move16(); - hGSCDec->Last_GSC_pit_band_idx = pit_band_idx; /* Q0 */ - move16(); - } - - /*---------------------------------------------------------------* - * DCT transform - *---------------------------------------------------------------*/ - edct_16fx( exc, dct_epit, st_fx->L_frame, 7, st_fx->element_mode ); - - /*---------------------------------------------------------------* - * Reset unvaluable part of the adaptive (pitch) excitation contribution - *---------------------------------------------------------------*/ - - max_len = sub( st_fx->L_frame, Diff_len ); /* Q0 */ - - if ( st_fx->bwidth == NB ) - { - max_len = sub( 160, Diff_len ); /* Q0 */ - } - - Len = 80; - move16(); - if ( LT_16( max_len, 80 ) ) - { - Len = max_len; /* Q0 */ - move16(); - } - - test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && NE_16( st_fx->bwidth, NB ) ) - { - FOR( i = 0; i < max_len; i++ ) - { - dct_epit[i + Diff_len] = 0; - move16(); - } - } - ELSE - { - FOR( i = 0; i < Len; i++ ) - { - dct_epit[i + Diff_len] = mult_r( dct_epit[i + Diff_len], sm_table_fx[i] ); /* Qx */ - move16(); - } - - FOR( ; i < max_len; i++ ) - { - dct_epit[i + Diff_len] = 0; - move16(); - } - } - // PMT("in the rare case of 4 subfr, bfi_pitch_fx might be wrong") - st_fx->bfi_pitch_fx = mean_fx( pitch_buf, nb_subfr ); /* Q6 */ - move16(); - st_fx->bfi_pitch_frame = st_fx->L_frame; /* Q0 */ - move16(); - - Diff_len = add( Diff_len, 1 ); /* Q0 */ - st_fx->bpf_off = 0; - move16(); - } - ELSE - { - /* No adaptive (pitch) excitation contribution */ - st_fx->bpf_off = 1; /* Q0 */ - move16(); - set16_fx( dct_epit, 0, st_fx->L_frame ); - - IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - set16_fx( pitch_buf, L_SUBFR16k * 64, NB_SUBFR16k ); - } - ELSE - { - set16_fx( pitch_buf, L_SUBFR * 64, NB_SUBFR ); - } - - set16_fx( gain_buf, 0, NB_SUBFR16k ); - - st_fx->bfi_pitch_fx = L_SUBFR * 64; - move16(); - st_fx->bfi_pitch_frame = st_fx->L_frame; /* Q0 */ - move16(); - st_fx->lp_gainp_fx = 0; - move16(); - st_fx->lp_gainc_fx = 0; - move16(); - st_fx->tilt_code_fx = 0; - move16(); - pit_band_idx = 0; - move16(); - Diff_len = 0; - move16(); - } - - /*--------------------------------------------------------------------------------------* - * GSC decoder - *--------------------------------------------------------------------------------------*/ - - /* find the current total number of bits used */ - - tmp_nb_bits_tot = st_fx->next_bit_pos; /* Q0 */ - move16(); - - if ( st_fx->extl_brate > 0 ) - { - /* subtract 1 bit for TBE/BWE BWE flag (bit counted in extl_brate) */ - tmp_nb_bits_tot = sub( tmp_nb_bits_tot, 1 ); /* Q0 */ - } - - test(); - if ( st_fx->coder_type == INACTIVE && LE_32( st_fx->core_brate, ACELP_9k60 ) ) - { - tmp_nb_bits_tot = add( tmp_nb_bits_tot, 5 ); /* Q0 */ - } - - gsc_dec_fx( st_fx, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st_fx->coder_type, &last_bin, lsf_new, exc_wo_nf, st_fx->Q_exc ); - /*--------------------------------------------------------------------------------------* - * iDCT transform - *--------------------------------------------------------------------------------------*/ - - edct_16fx( dct_epit, exc, st_fx->L_frame, 7, st_fx->element_mode ); - edct_16fx( exc_wo_nf, exc_wo_nf, st_fx->L_frame, 7, st_fx->element_mode ); - /*----------------------------------------------------------------------* - * Remove potential pre-echo in case an onset has been detected - *----------------------------------------------------------------------*/ - - pre_echo_att_fx( &hGSCDec->Last_frame_ener_fx, exc, gsc_attack_flag, st_fx->Q_exc, st_fx->last_coder_type, st_fx->L_frame ); - - /*--------------------------------------------------------------------------------------* - * Update BWE excitation - *--------------------------------------------------------------------------------------*/ - - IF( st_fx->hBWE_TD != NULL ) - { - set16_fx( voice_factors, 0, NB_SUBFR16k ); - IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - interp_code_4over2_fx( exc, bwe_exc, st_fx->L_frame ); - } - ELSE - { - interp_code_5over2_fx( exc, bwe_exc, L_FRAME ); - } - } - /*--------------------------------------------------------------------------------------* - * Updates - *--------------------------------------------------------------------------------------*/ - - Copy( exc, exc2, st_fx->L_frame ); /* Q_exc */ - Copy( exc_wo_nf, exc, st_fx->L_frame ); /* Q_exc */ - - /*--------------------------------------------------------------------------------------* - * Channel aware mode parameters - *--------------------------------------------------------------------------------------*/ - - set16_fx( st_fx->tilt_code_dec_fx, 0, NB_SUBFR16k ); - - return; -} - -/*=========================================================================*/ -/* FUNCTION : void decod_audio_ivas_fx(); */ -/*-------------------------------------------------------------------------*/ -/* PURPOSE : Decode audio (AC) frames */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ +/* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ /*-------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16[]) Aq : LP filter coefficient Q12 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _(Word16) Q_exc :Q format of excitation */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* Decoder_State *st_fx : decoder memory structure */ +/* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ +/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ /*-------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) pitch_buf_fx : Word16 pitch values for each subframe Q6*/ -/* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Decoder_State *st_fx : decoder memory structure */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*==========================================================================*/ -void decod_audio_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *lsf_new /* i : ISFs at the end of the frame Qx*/ - , - Word16 *gain_buf, /*Q14*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*=========================================================================*/ + +void decod_audio_fx( + Decoder_State *st_fx, /* i/o: decoder static memory */ + Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ + const Word16 *Aq, /* i : LP filter coefficient Q12*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag Q0*/ const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag Q0*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ @@ -488,6 +69,7 @@ void decod_audio_ivas_fx( /*---------------------------------------------------------------* * Initialization *---------------------------------------------------------------*/ + Diff_len = 0; move16(); @@ -522,11 +104,7 @@ void decod_audio_ivas_fx( } /* set bit-allocation */ -#ifdef NONBE_FIX_GSC_BSTR - config_acelp1_IVAS( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#else - config_acelp1_IVAS( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#endif + config_acelp1_fx( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); /*---------------------------------------------------------------* * Decode energy dynamics @@ -736,7 +314,7 @@ void decod_audio_ivas_fx( Es_pred_dec_fx( &Es_pred, indice, nbits, 0 ); } - dec_pit_exc_ivas_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + dec_pit_exc_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) { @@ -817,7 +395,6 @@ void decod_audio_ivas_fx( move16(); } } - // PMT("in the rare case of 4 subfr, bfi_pitch_fx might be wrong") st_fx->bfi_pitch_fx = mean_fx( pitch_buf, nb_subfr ); /* Q6 */ move16(); st_fx->bfi_pitch_frame = st_fx->L_frame; /* Q0 */ @@ -892,9 +469,11 @@ void decod_audio_ivas_fx( } } + Word16 Q_exc_old = st_fx->Q_exc; move16(); - gsc_dec_ivas_fx( st_fx, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st_fx->coder_type, &last_bin, lsf_new, exc_wo_nf, &st_fx->Q_exc ); + gsc_dec_fx( st_fx, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st_fx->coder_type, &last_bin, lsf_new, exc_wo_nf, &st_fx->Q_exc ); + IF( NE_16( Q_exc_old, st_fx->Q_exc ) ) { Q_exc_old = sub( Q_exc_old, st_fx->Q_exc ); @@ -952,270 +531,40 @@ void decod_audio_ivas_fx( } /*==========================================================================*/ -/* FUNCTION : void gsc_dec_fx () */ +/* FUNCTION : void gsc_dec_fx () */ /*--------------------------------------------------------------------------*/ /* PURPOSE : Generic audio signal decoder */ /*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _ (Word16) pit_band_idx : bin position of the cut-off frequency Q0 */ -/* _ (Word16) Diff_len : Lenght of the difference signal Q0 */ -/* _ (Word16) coder_type : coding type Q0 */ +/* _ (Word16) Diff_len : Lenght of the difference signal Q0 */ +/* _ (Word16) coder_type : coding type Q0 */ /* _ (Word16) bits_used : Number of bit used before frequency Q Q0 */ /* _ (Word16) nb_subfr : Number of subframe considered Q0 */ -/* _ (Word16) Qexc : Q format of exc_dct_in */ +/* _ (Word16) Qexc : Q format of exc_dct_in */ /*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /* _ None */ /*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Decoder_State *st_fx:Decoder State Structure */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* Decoder_State *st_fx:Decoder State Structure */ /* _ (Word16[]) exc_dct_in : dctof pitch-only excitation / total excitation Qexc*/ /*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _None */ +/* RETURN ARGUMENTS : */ +/* _None */ /*==========================================================================*/ -void gsc_dec_fx( - Decoder_State *st_fx, /* i/o: State structure */ - Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ - const Word16 pit_band_idx, /* i : bin position of the cut-off frequency Q0*/ - const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ - const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ - const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ - const Word16 coder_type, /* i : coding type Q0*/ - Word16 *last_bin, /* i : last bin of bit allocation Q0*/ - const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ - Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ - Word16 Q_exc ) -{ - Word16 i, j, bit, nb_subbands, pvq_len; - Word16 bitallocation_band[MBANDS_GN_BITALLOC16k]; - Word16 bitallocation_exc[2]; - Word16 Ener_per_bd_iQ[MBANDS_GN_BITALLOC16k]; - Word16 max_ener_band[MBANDS_GN_BITALLOC16k]; - Word16 exc_diffQ[L_FRAME16k]; - Word16 bits_per_bands[MBANDS_GN_BITALLOC16k]; - Word16 concat_out[L_FRAME16k]; - Word16 inpulses_fx[NB_SFM]; - Word16 imaxpulse_fx[NB_SFM]; - Word16 mean_gain; - Word16 Mbands_gn = 16; - Word16 Qexc_diffQ = Q_PVQ_OUT; - Word32 L_tmp; - Word16 Q_tmp; - Word16 seed_init; - GSC_DEC_HANDLE hGSCDec; - hGSCDec = st_fx->hGSCDec; - move16(); - move16(); - - move16(); // for Mbands_gn - move16(); // for Qexc_diffQ - set16_fx( inpulses_fx, 0, NB_SFM ); - set16_fx( imaxpulse_fx, 0, NB_SFM ); - - /*--------------------------------------------------------------------------------------* - * Initialization - *--------------------------------------------------------------------------------------*/ - bit = bits_used; - move16(); - - set16_fx( exc_diffQ, 0, st_fx->L_frame ); - - /*--------------------------------------------------------------------------------------* - * Gain decoding - *--------------------------------------------------------------------------------------*/ - - test(); - IF( st_fx->bfi || st_fx->BER_detect ) - { - /* copy old gain */ - Copy( hGSCDec->old_y_gain_fx, Ener_per_bd_iQ, Mbands_gn ); /* Q_old_gain */ - mean_gain = mult_r( st_fx->lp_gainc_fx, 3277 ); /*Q3*/ - FOR( i = 0; i < Mbands_gn; i++ ) - { - Ener_per_bd_iQ[i] = add( Ener_per_bd_iQ[i], shl( mean_gain, 9 ) ); /*Q12*/ - move16(); - } - - st_fx->lp_gainc_fx = mult_r( st_fx->lp_gainc_fx, 32112 ); /*Q3*/ - move16(); - } - ELSE - { - mean_gain = gsc_gaindec_fx( st_fx, Ener_per_bd_iQ, st_fx->core_brate, hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); /* Q12 */ - - st_fx->lp_gainc_fx = mult_r( 640, mean_gain ); /*10 in Q6 x Q12 -> lp_gainc in Q3 */ - move16(); - } - - *last_bin = 0; - move16(); - test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && st_fx->bwidth != NB ) - { - bitallocation_exc[0] = 0; - move16(); - bitallocation_exc[1] = 0; - move16(); - } - - set16_fx( bitallocation_band, 0, MBANDS_GN ); - - test(); - IF( ( EQ_16( st_fx->bfi, 1 ) ) || st_fx->BER_detect ) - { - /*--------------------------------------------------------------------------------------* - * Copy old spectrum - * reduce spectral dynamic - * save spectrum - *--------------------------------------------------------------------------------------*/ - - test(); - IF( EQ_16( st_fx->last_good, INACTIVE_CLAS ) || EQ_16( st_fx->Last_GSC_noisy_speech_flag, 1 ) ) - { - FOR( i = 0; i < st_fx->L_frame; i++ ) - { - L_tmp = L_shr( L_mult( Random( &hGSCDec->seed_tcx ), 26214 ), 5 ); /*Q10*/ - L_tmp = L_mac( L_tmp, hGSCDec->Last_GSC_spectrum_fx[i], 6554 ); /* Q10 */ - hGSCDec->Last_GSC_spectrum_fx[i] = round_fx( L_tmp ); /*Q10*/ - move16(); - } - } - - Copy( hGSCDec->Last_GSC_spectrum_fx, exc_diffQ, st_fx->L_frame ); /* Q10 */ - - FOR( i = 0; i < st_fx->L_frame; i++ ) - { - hGSCDec->Last_GSC_spectrum_fx[i] = mult_r( hGSCDec->Last_GSC_spectrum_fx[i], 24576 ); /*Q10*/ - move16(); - } - } - ELSE - { - /*--------------------------------------------------------------------------------------* - * PVQ decoder - *--------------------------------------------------------------------------------------*/ - - bands_and_bit_alloc_fx( hGSCDec->cor_strong_limit, hGSCDec->noise_lev, st_fx->core_brate, Diff_len, bit, &bit, Ener_per_bd_iQ, - max_ener_band, bits_per_bands, &nb_subbands, NULL, NULL, &pvq_len, coder_type, st_fx->bwidth, st_fx->GSC_noisy_speech, - st_fx->L_frame, st_fx->element_mode, st_fx->GSC_IVAS_mode ); - - { - pvq_core_dec_fx( st_fx, gsc_sfm_start, gsc_sfm_end, gsc_sfm_size, concat_out, &Q_tmp, bit, nb_subbands, bits_per_bands, NULL, inpulses_fx, imaxpulse_fx, ACELP_CORE ); - Scale_sig( concat_out, gsc_sfm_end[nb_subbands - 1], sub( Q_PVQ_OUT, Q_tmp ) ); /* Q_PVQ_OUT */ - } - seed_init = 0; - move16(); - - /* Reorder Q bands */ - FOR( j = 0; j < nb_subbands; j++ ) - { - Copy( concat_out + shl( j, 4 ), exc_diffQ + shl( max_ener_band[j], 4 ), 16 ); /* Q_PVQ_OUT */ - - *last_bin = s_max( *last_bin, max_ener_band[j] ); /* Q0 */ - move16(); - - bitallocation_band[max_ener_band[j]] = 1; /* Q0 */ - move16(); - - seed_init = add( seed_init, inpulses_fx[j] ); /* Q0 */ - } - test(); - IF( NE_16( st_fx->last_coder_type, AUDIO ) /* First audio frame */ - && NE_16( st_fx->last_coder_type, UNVOICED ) ) /* last_coder_type == INACTIVE is overwritten in update_dec to UNVOICED */ - { - FOR( j = 0; j < nb_subbands * 16; j++ ) - { - IF( concat_out[j] > 0 ) - { - seed_init = extract_l( L_shl( seed_init, 3 ) ); /* Q0 */ - } - if ( concat_out[j] < 0 ) - { - seed_init = add( seed_init, 3 ); /* Q0 */ - move16(); - } - } - - hGSCDec->seed_tcx = seed_init; /* Q0 */ - move16(); - } - test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && st_fx->bwidth != NB ) - { - if ( exc_diffQ[L_FRAME8k - 2] != 0 ) - { - bitallocation_exc[0] = 1; /* Q0 */ - move16(); - } - - if ( exc_diffQ[L_FRAME8k - 1] != 0 ) - { - bitallocation_exc[1] = 1; /* Q0 */ - move16(); - } - } - - Copy( exc_diffQ, hGSCDec->Last_GSC_spectrum_fx, st_fx->L_frame ); /* Q_PVQ_OUT */ - /*--------------------------------------------------------------------------------------* - * Skip adaptive (pitch) contribution frequency band (no noise added over the time contribution) - * Find x pulses between 1.6-3.2kHz to code in the spectrum of the residual signal - * Gain is based on the inter-correlation gain between the pulses found and residual signal - *--------------------------------------------------------------------------------------*/ - - freq_dnw_scaling_fx( hGSCDec->cor_strong_limit, st_fx->coder_type, hGSCDec->noise_lev, st_fx->core_brate, exc_diffQ, Qexc_diffQ, st_fx->L_frame ); - } - - /*--------------------------------------------------------------------------------------* - * Estimate noise level - *--------------------------------------------------------------------------------------*/ - - highband_exc_dct_in_fx( st_fx->core_brate, mfreq_bindiv_loc, *last_bin, Diff_len, hGSCDec->noise_lev, pit_band_idx, exc_diffQ, - &hGSCDec->seed_tcx, Ener_per_bd_iQ, nb_subfr, exc_dct_in, st_fx->last_coder_type, bitallocation_band, lsf_new, - hGSCDec->last_exc_dct_in_fx, &hGSCDec->last_ener_fx, hGSCDec->last_bitallocation_band, bitallocation_exc, st_fx->bfi, coder_type, - st_fx->bwidth, exc_wo_nf, Qexc_diffQ, Q_exc, st_fx->GSC_noisy_speech, hGSCDec->lt_ener_per_band_fx, st_fx->L_frame, st_fx->element_mode, st_fx->GSC_IVAS_mode ); - - exc_dct_in[0] = 0; - move16(); - - return; -} - -/*==========================================================================*/ -/* FUNCTION : void gsc_dec_ivas_fx () */ -/*--------------------------------------------------------------------------*/ -/* PURPOSE : Generic audio signal decoder */ -/*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) pit_band_idx : bin position of the cut-off frequency Q0 */ -/* _ (Word16) Diff_len : Lenght of the difference signal Q0 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) bits_used : Number of bit used before frequency Q Q0 */ -/* _ (Word16) nb_subfr : Number of subframe considered Q0 */ -/* _ (Word16) Qexc : Q format of exc_dct_in */ -/*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ None */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Decoder_State *st_fx:Decoder State Structure */ -/* _ (Word16[]) exc_dct_in : dctof pitch-only excitation / total excitation Qexc*/ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _None */ -/*==========================================================================*/ -void gsc_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ - const Word16 pit_band_idx, /* i : bin position of the cut-off frequency ` Q0*/ - const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ - const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ - const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ - const Word16 coder_type, /* i : coding type Q0*/ - Word16 *last_bin, /* i : last bin of bit allocation Q0*/ - const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ - Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ +void gsc_dec_fx( + Decoder_State *st_fx, /* i/o: State structure */ + Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ + const Word16 pit_band_idx, /* i : bin position of the cut-off frequency ` Q0*/ + const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ + const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ + const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ + const Word16 coder_type, /* i : coding type Q0*/ + Word16 *last_bin, /* i : last bin of bit allocation Q0*/ + const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ + Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ Word16 *Q_exc ) { Word16 i, j, bit, nb_subbands, pvq_len; @@ -1305,7 +654,15 @@ void gsc_dec_ivas_fx( { i--; } - mean_gain = gsc_gaindec_ivas_fx( st_fx, Ener_per_bd_iQ, brate_intermed_tbl[i], hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); /* Q3 */ + + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + mean_gain = gsc_gaindec_fx( st_fx, Ener_per_bd_iQ, brate_intermed_tbl[i], hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); /* Q3 */ + } + ELSE + { + mean_gain = gsc_gaindec_ivas_fx( st_fx, Ener_per_bd_iQ, brate_intermed_tbl[i], hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); /* Q3 */ + } st_fx->lp_gainc_fx = mult_r( 640, mean_gain ); /*10 in Q6 x Q12 -> lp_gainc in Q3 */ move16(); @@ -1372,14 +729,10 @@ void gsc_dec_ivas_fx( } pvq_core_dec_fx( st_fx, gsc_sfm_start, gsc_sfm_end, gsc_sfm_size, concat_out, &Q_tmp, bit, nb_subbands, bits_per_bands, NULL, inpulses_fx, imaxpulse_fx, ACELP_CORE ); -#ifdef MSAN_FIX IF( nb_subbands > 0 ) { Scale_sig( concat_out, gsc_sfm_end[nb_subbands - 1], sub( Q_PVQ_OUT, Q_tmp ) ); /* Q_PVQ_OUT */ } -#else - Scale_sig( concat_out, gsc_sfm_end[nb_subbands - 1], sub( Q_PVQ_OUT, Q_tmp ) ); /* Q_PVQ_OUT */ -#endif seed_init = 0; move16(); @@ -1435,11 +788,7 @@ void gsc_dec_ivas_fx( } if ( concat_out[j] < 0 ) { -#ifdef BASOP_NOGLOB_TMP_715 seed_init = add_sat( seed_init, 3 ); /* Q0 */ -#else - seed_init = add( seed_init, 3 ); -#endif } } @@ -1517,7 +866,7 @@ void gsc_dec_ivas_fx( * Initialize GSC decoder state structure *-------------------------------------------------------------------*/ -void GSC_dec_init( +void GSC_dec_init_fx( GSC_DEC_HANDLE hGSCDec /* i/o: GSC data handle */ ) { @@ -1531,43 +880,16 @@ void GSC_dec_init( move16(); move16(); - set16_fx( hGSCDec->Last_GSC_spectrum_fx, 0, L_FRAME ); - set16_fx( hGSCDec->last_exc_dct_in_fx, 0, L_FRAME ); - set16_fx( hGSCDec->old_y_gain_fx, 0, MBANDS_GN ); - set16_fx( hGSCDec->lt_ener_per_band_fx, 4096, MBANDS_GN ); /*Q12*/ - - hGSCDec->last_ener_fx = 0; - move16(); - set16_fx( hGSCDec->last_bitallocation_band, 0, 6 ); - - hGSCDec->Last_frame_ener_fx = MAX_32; - move32(); - return; -} - -void GSC_dec_init_ivas_fx( - GSC_DEC_HANDLE hGSCDec /* i/o: GSC data handle */ -) -{ - hGSCDec->seed_tcx = 15687; /* Q0 */ - move16(); - hGSCDec->cor_strong_limit = 1; - move16(); - set16_fx( hGSCDec->old_y_gain_fx, 0, MBANDS_GN ); - hGSCDec->noise_lev = NOISE_LEVEL_SP0; - move16(); set16_fx( hGSCDec->Last_GSC_spectrum_fx, 0, L_FRAME16k ); - hGSCDec->Last_GSC_pit_band_idx = 0; - move16(); - - set16_fx( hGSCDec->lt_ener_per_band_fx, 4096, MBANDS_GN16k ); /*Q12*/ set16_fx( hGSCDec->last_exc_dct_in_fx, 0, L_FRAME16k ); + set16_fx( hGSCDec->old_y_gain_fx, 0, MBANDS_GN16k ); + set16_fx( hGSCDec->lt_ener_per_band_fx, 4096, MBANDS_GN16k ); /*Q12*/ + hGSCDec->last_ener_fx = 0; move16(); set16_fx( hGSCDec->last_bitallocation_band, 0, 6 ); hGSCDec->Last_frame_ener_fx = MAX_32; move32(); - return; } diff --git a/lib_dec/hdecnrm_fx.c b/lib_dec/hdecnrm_fx.c index aa6c041cc8a32bd60ca02d6a60903c588a6d19f0..2efea77b0c58de186f43de7ca73af3df8a88e3b7 100644 --- a/lib_dec/hdecnrm_fx.c +++ b/lib_dec/hdecnrm_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -12,9 +12,9 @@ /* Huffman decoding for indices of quantized norms */ /*--------------------------------------------------------------------------*/ void hdecnrm_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 numNorms, /* i : number of norms Q0*/ - Word16 *index ) /* o : indices of quantized norms Q0*/ + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word16 numNorms, /* i : number of norms Q0*/ + Word16 *index ) /* o : indices of quantized norms Q0*/ { Word16 i, j, k, n, m; Word16 temp; @@ -169,8 +169,8 @@ void hdecnrm_context_fx( void hdecnrm_resize_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 N, /* (i) number of SFMs Q0*/ - Word16 *index /* (o) norm quantization index vector Q0*/ + const Word16 N, /* (i) number of SFMs Q0*/ + Word16 *index /* (o) norm quantization index vector Q0*/ ) { Word16 i, j, k, m; @@ -294,9 +294,9 @@ void huff_dec_fx( *--------------------------------------------------------------------------*/ void hdecnrm_tran_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 N, /* i : number of norms Q0*/ - Word16 *index /* o : indices of quantized norms Q0*/ + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word16 N, /* i : number of norms Q0*/ + Word16 *index /* o : indices of quantized norms Q0*/ ) { Word16 i, j, k, n, m; diff --git a/lib_dec/hf_synth_fx.c b/lib_dec/hf_synth_fx.c index 94c7d4c6282edf47fa8278add6362ece82625d00..87e8b1fd7b813b8716bb15d9306a870631495ebf 100644 --- a/lib_dec/hf_synth_fx.c +++ b/lib_dec/hf_synth_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -21,6 +21,7 @@ static void filt_6k_7k_scale_fx( Word16 signal[], Word16 lg, Word16 mem[], Word16 fact, Word16 exp ); static void hf_synthesis_fx( ZERO_BWE_DEC_HANDLE hBWE_zero, const Word32 core_brate, const Word16 output_subfr, const Word16 Aq[], const Word16 exc[], const Word16 Q_exc, Word16 synth[], Word16 synth16k[], const Word16 Q_syn ); +static void hf_synthesis_ivas_fx( ZERO_BWE_DEC_HANDLE hBWE_zero, const Word32 core_brate, const Word16 output_subfr, const Word16 Aq[], const Word16 exc[], const Word16 Q_exc, Word16 synth[], Word16 synth16k[], const Word16 Q_syn ); static void hf_synthesis_amr_wb_fx( const Word32 core_brate, const Word16 output_subfr, const Word16 Ap[], Word16 exc16k[], Word16 synth_out[], Word16 *mem_syn_hf, Word16 *delay_syn_hf, Word16 *mem_hp_interp, Word16 p_r, Word16 HF_corr_gain, Word16 til, Word16 voice_factors, const Word16 exc[], const Word16 Q_exc, const Word16 Q_out, Word16 qhf ); static void envelope_fx( AMRWB_IO_DEC_HANDLE hAmrwb_IO, const Word32 core_brate, const Word16 Aq[], Word16 Ap[], Word16 *r, Word16 tilt0, Word16 tilt, Word16 voice_factor ); static void AdaptiveStartBand_fx( Word16 *start_band, const Word32 rate, const Word16 *lsf, const Word16 voicing_fac, const Word16 clas, Word16 *voicing_flag, Word16 *start_band_old, Word32 *OptCrit_old ); @@ -78,12 +79,12 @@ void hf_synth_reset_fx( *---------------------------------------------------------------------*/ void hf_synth_fx( - ZERO_BWE_DEC_HANDLE hBWE_zero, /* i/o: handle to 0 bit BWE parameters */ - const Word32 core_brate, /* i : core bitrate Q0*/ + ZERO_BWE_DEC_HANDLE hBWE_zero, /* i/o: handle to 0 bit BWE parameters */ + const Word32 core_brate, /* i : core bitrate Q0*/ const Word16 output_frame, /* i : output frame length Q0*/ - const Word16 *Aq, /* i : quantized Az Q12*/ - const Word16 *exc, /* i : excitation at 12.8 kHz Q_exc*/ - Word16 *synth, /* i : 12.8kHz synthesis signal Q_syn2*/ + const Word16 *Aq, /* i : quantized Az Q12*/ + const Word16 *exc, /* i : excitation at 12.8 kHz Q_exc*/ + Word16 *synth, /* i : 12.8kHz synthesis signal Q_syn2*/ Word16 *synth16k, /* o : 16kHz synthesis signal Q_syn2*/ const Word16 Q_exc, /* i : excitation scaling */ const Word16 Q_syn2 /* i : synthesis scaling */ @@ -121,12 +122,12 @@ static void hf_synthesis_fx( ZERO_BWE_DEC_HANDLE hBWE_zero, const Word32 core_brate, /* i : core bitrate Q0*/ const Word16 output_subfr, /* i : output sub-frame length Q0*/ - const Word16 Aq[], /* i : quantized Az Q12*/ - const Word16 exc[], /* i : excitation at 12.8 kHz Q_exc*/ - const Word16 Q_exc, /* i : excitation scaling */ - Word16 synth[], /* i : 12.8kHz synthesis signal Q_syn*/ - Word16 synth16k[], /* i/o: 16kHz synthesis signal Q_syn*/ - const Word16 Q_syn /* i : synthesis scaling */ + const Word16 Aq[], /* i : quantized Az Q12*/ + const Word16 exc[], /* i : excitation at 12.8 kHz Q_exc*/ + const Word16 Q_exc, /* i : excitation scaling */ + Word16 synth[], /* i : 12.8kHz synthesis signal Q_syn*/ + Word16 synth16k[], /* i/o: 16kHz synthesis signal Q_syn*/ + const Word16 Q_syn /* i : synthesis scaling */ ) { Word16 i, s; @@ -135,10 +136,6 @@ static void hf_synthesis_fx( Word16 tmp, ener, exp1, exp2, scale; Word32 L_tmp; Word16 Ap[M16k + 1]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*-----------------------------------------------------------------* * generate white noise vector @@ -182,11 +179,7 @@ static void hf_synthesis_fx( * calculate energy scaling factor to respect tilt of synth12k8 * (tilt: 1=voiced, -1=unvoiced) *-----------------------------------------------------------------*/ -#ifdef EVS_MONO hp400_12k8_fx( synth, L_SUBFR, hBWE_zero->mem_hp400_fx ); -#else - hp400_12k8_ivas_fx( synth, L_SUBFR, hBWE_zero->mem_hp400_fx ); -#endif /* i: mem_hp400 in Q_syn */ /* i: synth in Q_syn */ /* o: synth in Q_syn-3 */ @@ -220,15 +213,14 @@ static void hf_synthesis_fx( /*-----------------------------------------------------------------* * modify energy of white noise according to synthesis tilt *-----------------------------------------------------------------*/ - /* tmp = 1.0 - fac */ - tmp = add_o( 1, sub( 32767 /* 1 in Q15 */, tmp ), &Overflow ); + tmp = add_sat( 1, sub( 32767 /* 1 in Q15 */, tmp ) ); test(); if ( core_brate == FRAME_NO_DATA || EQ_32( core_brate, SID_2k40 ) ) { /* emphasize HF noise in CNG */ /*fac *= 2.0f;*/ - tmp = add_o( tmp, tmp, &Overflow ); /* Q15 */ + tmp = add_sat( tmp, tmp ); /* Q15 */ } tmp = s_max( tmp, 3277 ); /* 0.1 in Q15 */ @@ -295,7 +287,213 @@ static void hf_synthesis_fx( { Copy( HF_syn, upsampled_HF_syn, L_SUBFR16k ); /* Q_syn */ } + Vr_add( synth16k, upsampled_HF_syn, synth16k, output_subfr ); + + return; +} + +void hf_synth_ivas_fx( + ZERO_BWE_DEC_HANDLE hBWE_zero, /* i/o: handle to 0 bit BWE parameters */ + const Word32 core_brate, /* i : core bitrate Q0*/ + const Word16 output_frame, /* i : output frame length Q0*/ + const Word16 *Aq, /* i : quantized Az Q12*/ + const Word16 *exc, /* i : excitation at 12.8 kHz Q_exc*/ + Word16 *synth, /* i : 12.8kHz synthesis signal Q_syn2*/ + Word16 *synth16k, /* o : 16kHz synthesis signal Q_syn2*/ + const Word16 Q_exc, /* i : excitation scaling */ + const Word16 Q_syn2 /* i : synthesis scaling */ +) +{ + const Word16 *p_Aq; + Word16 i_subfr, output_subfr; + + output_subfr = shr( output_frame, 2 ); + p_Aq = Aq; /* Q12 */ + FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) + { + hf_synthesis_ivas_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[i_subfr * output_subfr / L_SUBFR], Q_syn2 ); + + p_Aq += ( M + 1 ); /* Q12 */ + } + + return; +} + +static void hf_synthesis_ivas_fx( + ZERO_BWE_DEC_HANDLE hBWE_zero, + const Word32 core_brate, /* i : core bitrate Q0*/ + const Word16 output_subfr, /* i : output sub-frame length Q0*/ + const Word16 Aq[], /* i : quantized Az Q12*/ + const Word16 exc[], /* i : excitation at 12.8 kHz Q_exc*/ + const Word16 Q_exc, /* i : excitation scaling */ + Word16 synth[], /* i : 12.8kHz synthesis signal Q_syn*/ + Word16 synth16k[], /* i/o: 16kHz synthesis signal Q_syn*/ + const Word16 Q_syn /* i : synthesis scaling */ +) +{ + Word16 i, s; + Word16 HF_syn[L_SUBFR16k], upsampled_HF_syn[L_FRAME48k / NB_SUBFR]; + Word16 HF_exc[L_SUBFR16k]; + Word16 exp1, exp2, scale, tmp, ener, Q_tmp, Q_ener, sft; + Word32 L_tmp, ONE, P_ONE; + Word16 Ap[M16k + 1]; + Word64 prod; + + /*-----------------------------------------------------------------* + * generate white noise vector + *-----------------------------------------------------------------*/ + + Random_Fill( &hBWE_zero->seed2, L_SUBFR16k, HF_exc, 3 ); /* 3 = Shift Right by 3 */ + + /* o: HF_exc in Q(-3) */ + + /*-----------------------------------------------------------------* + * calculate energy scaling factor so that white noise would have the + * same energy as exc12k8 + *-----------------------------------------------------------------*/ + + /*ener = sum2_f( exc, L_SUBFR ) + 0.01f*/ + ener = extract_h( Dot_product12( exc, exc, L_SUBFR, &exp2 ) ); + exp2 = sub( exp2, add( Q_exc, Q_exc ) ); // ener exponent + + /*tmp = round_fx(Dot_product12(HF_exc, HF_exc, output_subfr, &exp1)); */ + L_tmp = Dot_product12( HF_exc, HF_exc, L_SUBFR16k, &exp1 ); + tmp = round_fx( L_tmp ); + exp1 = add( exp1, 6 ); /* tmp exponent */ + + ener = shr( ener, 1 ); /* to avoid the assertion in div_s() further*/ + exp2 = add( exp2, 1 ); + + tmp = div_s( ener, tmp ); + exp1 = sub( exp2, exp1 ); + + scale = Sqrt16( tmp, &exp1 ); /* scale exponent = exp1 */ + + /*-----------------------------------------------------------------* + * calculate energy scaling factor to respect tilt of synth12k8 + * (tilt: 1=voiced, -1=unvoiced) + *-----------------------------------------------------------------*/ + + hp400_12k8_ivas_fx( synth, L_SUBFR, hBWE_zero->mem_hp400_fx ); + + /* i: mem_hp400 in Q_syn */ + /* i: synth in Q_syn */ + /* o: synth in Q_syn-3 */ + prod = W_mac0_16_16( 1L, synth[0], synth[0] ); /* 2*(Q_syn-3) */ + FOR( i = 1; i < L_SUBFR; i++ ) + { + prod = W_mac0_16_16( prod, synth[i], synth[i] ); /* 2*(Q_syn-3) */ + } + sft = W_norm( prod ); + ener = extract_h( W_extract_h( W_shl( prod, sft ) ) ); + Q_ener = sub( add( shl( sub( Q_syn, 3 ), 1 ), sft ), 48 ); + + prod = W_mac0_16_16( 1L, synth[1], synth[0] ); /* 2*(Q_syn-3) */ + FOR( i = 2; i < L_SUBFR; i++ ) + { + prod = W_mac0_16_16( prod, synth[i], synth[i - 1] ); /* 2*(Q_syn-3) */ + } + sft = sub( W_norm( prod ), 1 ); + tmp = extract_h( W_extract_h( W_shl( prod, sft ) ) ); + Q_tmp = sub( add( shl( sub( Q_syn, 3 ), 1 ), sft ), 48 ); + + tmp = s_max( 0, tmp ); + IF( tmp > 0 ) + { + tmp = div_s( tmp, ener ); + Q_tmp = add( 15, sub( Q_tmp, Q_ener ) ); + } + + /*-----------------------------------------------------------------* + * modify energy of white noise according to synthesis tilt + *-----------------------------------------------------------------*/ + /* tmp = 1.0 - fac */ + ONE = L_shl( 1, Q_tmp ); + P_ONE = L_shl( 3277 /* 0.1 in Q15 */, sub( Q_tmp, 15 ) ); + L_tmp = L_msu0( ONE, tmp, 1 ); + test(); + if ( core_brate == FRAME_NO_DATA || EQ_32( core_brate, SID_2k40 ) ) + { + /* emphasize HF noise in CNG */ + /*fac *= 2.0f;*/ + L_tmp = L_add( L_tmp, L_tmp ); + } + L_tmp = L_max( L_tmp, P_ONE ); + L_tmp = L_min( L_tmp, ONE ); + + sft = norm_l( L_tmp ); + L_tmp = L_shl( L_tmp, sft ); + + tmp = round_fx( L_tmp ); + Q_tmp = sub( add( Q_tmp, sft ), 16 ); + + /*scale *= fac;*/ + tmp = mult_r( scale, tmp ); /* Q = (15 - exp1) + Q_tmp - 15 */ + Q_tmp = sub( Q_tmp, exp1 ); + /*-----------------------------------------------------------------* + * modify HF excitation according to both calculated scaling factors + * high pass filtering (0.94ms of delay) + *-----------------------------------------------------------------*/ + + exp2 = sub( hBWE_zero->memExp1, exp1 ); + hBWE_zero->memExp1 = exp1; + move16(); + + filt_6k_7k_scale_fx( HF_exc, L_SUBFR16k, hBWE_zero->mem_hf_fx, tmp, exp2 ); + /* i: HF_exc in Q(-3) */ + /* o: HF_exc in ((-3) + Q_tmp - 17) */ + /* o: hBWE_zero->mem_hf_fx in Q(HF_exc)-2 */ + + /*-----------------------------------------------------------------* + * synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz + *-----------------------------------------------------------------*/ + + /*weight_a( Aq, Ap, 0.6f, M );*/ + weight_a_lc_fx( Aq, Ap, Gamma_19661_Tbl_fx, M ); + /* o: Ap in Q14 */ + + Syn_filt_s( 0, Ap, M, HF_exc, HF_syn, L_SUBFR16k, hBWE_zero->mem_syn_hf_fx, 1 ); + /* o: HF_syn in same Q as HF_exc */ + /* o: mem_syn_hf_fx same Q as HF_syn */ + + Scale_sig( HF_syn, L_SUBFR16k, ( add( Q_syn, exp1 ) ) ); /* bring HF_syn to (Q_syn+exp1) */ + + /*-----------------------------------------------------------------* + * add filtered HF noise to speech synthesis + *-----------------------------------------------------------------*/ + + /* delay by 5 samples @16kHz to compensate CLDFB resampling delay (20samples) and HP filtering delay (roughly 15 samples) */ + delay_signal_fx( HF_syn, L_SUBFR16k, hBWE_zero->delay_syn_hf_fx, NS2SA_FX2( 16000, DELAY_CLDFB_NS ) - 15 ); + + /* interpolate the HF synthesis */ + IF( EQ_16( output_subfr, L_SUBFR48k ) ) /* 48kHz sampled output */ + { + s = s_max( s_min( sub( s_min( Find_Max_Norm16( HF_syn, L_SUBFR16k ), Find_Max_Norm16( hBWE_zero->mem_hp_interp_fx, INTERP_3_1_MEM_LEN - 3 ) ), 3 ), + sub( Find_Max_Norm16( hBWE_zero->mem_hp_interp_fx + INTERP_3_1_MEM_LEN - 3, 3 ), 1 ) ), + 0 ); + Scale_sig( HF_syn, L_SUBFR16k, s ); /* Q_syn+exp1+s */ + Scale_sig( hBWE_zero->mem_hp_interp_fx, INTERP_3_1_MEM_LEN, s ); /* Qx + s */ + interpolate_3_over_1_allpass_fx( HF_syn, L_SUBFR16k, upsampled_HF_syn, hBWE_zero->mem_hp_interp_fx ); + Scale_sig( upsampled_HF_syn, 3 * L_SUBFR16k, -s ); /* Q_syn + exp1 + s */ + Scale_sig( hBWE_zero->mem_hp_interp_fx, INTERP_3_1_MEM_LEN, -s ); /* Qx */ + Scale_sig( HF_syn, L_SUBFR16k, -s ); /* Q_syn+exp1 */ + Scale_sig( upsampled_HF_syn, L_SUBFR48k, -1 ); + } + ELSE IF( EQ_16( output_subfr, L_SUBFR32k ) ) /* 32kHz sampled output */ + { + s = s_max( sub( s_min( Find_Max_Norm16( HF_syn, L_SUBFR16k ), Find_Max_Norm16( hBWE_zero->mem_hp_interp_fx, 2 * ALLPASSSECTIONS_STEEP ) ), 2 ), 0 ); + Scale_sig( HF_syn, L_SUBFR16k, s ); /* Q_syn+exp1+s */ + Scale_sig( hBWE_zero->mem_hp_interp_fx, 2 * ALLPASSSECTIONS_STEEP, s ); /* Qx + s */ + Interpolate_allpass_steep_fx( HF_syn, hBWE_zero->mem_hp_interp_fx, L_SUBFR16k, upsampled_HF_syn ); + Scale_sig( upsampled_HF_syn, 2 * L_SUBFR16k, -s ); /* Q_syn + exp1 */ + Scale_sig( hBWE_zero->mem_hp_interp_fx, 2 * ALLPASSSECTIONS_STEEP, -s ); /* Qx */ + Scale_sig( HF_syn, L_SUBFR16k, -s ); /* Q_syn+exp1 */ + } + ELSE /* 16kHz sampled output */ + { + Copy( HF_syn, upsampled_HF_syn, L_SUBFR16k ); /* Q_syn */ + } Vr_add( synth16k, upsampled_HF_syn, synth16k, output_subfr ); return; @@ -311,19 +509,15 @@ static void hf_synthesis_fx( * (gain=4.0) *-------------------------------------------------------------------*/ static void filt_6k_7k_scale_fx( - Word16 signal[], /* i/o: signal Qx*/ - Word16 lg, /* i : length of input Q0*/ - Word16 mem[], /* i/o: memory (size=30) exp*/ - Word16 fact, /* i : multiply factor Q0*/ - Word16 exp /* i : Mem Exponent */ + Word16 signal[], /* i/o: signal Qx*/ + Word16 lg, /* i : length of input Q0*/ + Word16 mem[], /* i/o: memory (size=30) exp*/ + Word16 fact, /* i : multiply factor Q0*/ + Word16 exp /* i : Mem Exponent */ ) { Word16 i, x[L_FRAME48k / NB_SUBFR + ( L_FIR - 1 )]; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif Copy_Scale_sig( mem, x, L_FIR - 1, exp ); FOR( i = 0; i < lg; i++ ) @@ -339,10 +533,10 @@ static void filt_6k_7k_scale_fx( move32(); FOR( j = 0; j < 31; j++ ) { - L_tmp = L_mac_o( L_tmp, x[i + j], fir_6k_7k_fx[j], &Overflow ); /* Q16 */ + L_tmp = L_mac_sat( L_tmp, x[i + j], fir_6k_7k_fx[j] ); /* Q16 */ } - signal[i] = round_fx_o( L_tmp, &Overflow ); /* Q0 */ + signal[i] = round_fx_sat( L_tmp ); /* Q0 */ move16(); } Copy( x + lg, mem, L_FIR - 1 ); /* Qx - 2 */ @@ -451,17 +645,17 @@ void hf_synth_amr_wb_fx( ZERO_BWE_DEC_HANDLE hBWE_zero, /* o : zero BWE decoder handle */ const Word32 core_brate, /* i : core bitrate Q0*/ const Word16 output_frame, /* i : output frame length Q0*/ - const Word16 *Aq, /* i : quantized Az : Q12*/ - const Word16 *exc, /* i : excitation at 12.8 kHz : Q_exc*/ - Word16 *synth, /* i/o: synthesis signal at 12.8k : Q_syn*/ + const Word16 *Aq, /* i : quantized Az : Q12*/ + const Word16 *exc, /* i : excitation at 12.8 kHz : Q_exc*/ + Word16 *synth, /* i/o: synthesis signal at 12.8k : Q_syn*/ Word16 *amr_io_class, /* i : signal class (determined by FEC algorithm) Q0*/ - Word16 *synth_out, /* i/o: output signal at output Fs : Q_out*/ - Word16 fmerit, /* i : classify parameter from FEC : Q14*/ + Word16 *synth_out, /* i/o: output signal at output Fs : Q_out*/ + Word16 fmerit, /* i : classify parameter from FEC : Q14*/ const Word16 *hf_gain, /* i : decoded HF gain Q0*/ - const Word16 *voice_factors, /* i : voicing factors : Q15*/ - const Word16 pitch_buf[], /* i : pitch buffer : Q5*/ - const Word16 ng_ener_ST, /* i : Noise gate - short-term energy : Q8*/ - const Word16 *lsf_new, /* i : ISF vector : Q2*/ + const Word16 *voice_factors, /* i : voicing factors : Q15*/ + const Word16 pitch_buf[], /* i : pitch buffer : Q5*/ + const Word16 ng_ener_ST, /* i : Noise gate - short-term energy : Q8*/ + const Word16 *lsf_new, /* i : ISF vector : Q2*/ const Word16 Q_exc, /* i : exc scaling */ const Word16 Q_out /* i : Q_syn2-1 */ ) @@ -1008,19 +1202,19 @@ void hf_synth_amr_wb_fx( return; } static void hf_synthesis_amr_wb_fx( - const Word32 core_brate, /* i : core bitrate : Q0*/ - const Word16 output_subfr, /* i : output sub-frame length : Q0*/ - const Word16 Ap[], /* i : quantized Aq : Q12*/ - Word16 exc16k[], /* i : excitation at 16 kHz : qhf*/ + const Word32 core_brate, /* i : core bitrate : Q0*/ + const Word16 output_subfr, /* i : output sub-frame length : Q0*/ + const Word16 Ap[], /* i : quantized Aq : Q12*/ + Word16 exc16k[], /* i : excitation at 16 kHz : qhf*/ Word16 synth_out[], /* i/o: synthesis signal at output Fs : Q_out*/ - Word16 *mem_syn_hf, /* i/o: HF synthesis memory : Q_out*/ - Word16 *delay_syn_hf, /* i/o: HF synthesis memory : Q_out*/ - Word16 *mem_hp_interp, /* i/o: interpol. memory : Q_out*/ - Word16 p_r, /* i : sub-frame gain : Q12*/ - Word16 HF_corr_gain, /* i : HF gain index : Q14*/ + Word16 *mem_syn_hf, /* i/o: HF synthesis memory : Q_out*/ + Word16 *delay_syn_hf, /* i/o: HF synthesis memory : Q_out*/ + Word16 *mem_hp_interp, /* i/o: interpol. memory : Q_out*/ + Word16 p_r, /* i : sub-frame gain : Q12*/ + Word16 HF_corr_gain, /* i : HF gain index : Q14*/ Word16 til, /* Q14 */ Word16 voice_factors, /* Q14 */ - const Word16 exc[], /* i : excitation at 12.8 kHz : Qexc*/ + const Word16 exc[], /* i : excitation at 12.8 kHz : Qexc*/ const Word16 Q_exc, /*exc scaling*/ const Word16 Q_out, /*synth_out scaling*/ Word16 qhf /*exc16k scaling*/ @@ -1182,8 +1376,6 @@ static Word16 EnhanceClass_fx( Word16 unvoicing_tmp_fx; Word16 tmp, tmp1; Word32 L_tmp; - Flag Overflow; - /* Decide (*unvoicing_flag) to allow BWE enhancement when qq>pp */ /**voice_fac_fx = add(mult_r(*voice_fac_fx, 24576), mult_r(voice_factor_fx, 8192)); //Q15 */ @@ -1220,13 +1412,13 @@ static Word16 EnhanceClass_fx( move16(); } - if ( GT_16( sub_o( *unvoicing_fx, *unvoicing_sm_fx, &Overflow ), 3277 /* 0.1 in Q15 */ ) ) + if ( GT_16( sub_sat( *unvoicing_fx, *unvoicing_sm_fx ), 3277 /* 0.1 in Q15 */ ) ) { *unvoicing_flag = 1; move16(); } - if ( LT_16( sub_o( *unvoicing_fx, *unvoicing_sm_fx, &Overflow ), 1638 /* 0.05 in Q15 */ ) ) + if ( LT_16( sub_sat( *unvoicing_fx, *unvoicing_sm_fx ), 1638 /* 0.05 in Q15 */ ) ) { *unvoicing_flag = 0; move16(); @@ -1237,13 +1429,13 @@ static Word16 EnhanceClass_fx( static void envelope_fx( AMRWB_IO_DEC_HANDLE hAmrwb_IO, - const Word32 core_brate, /* i : core bitrate Q0*/ - const Word16 Aq_dyn_scal[], /* i : de-quant. LPC coefficents, dynamic scaling Q12*/ - Word16 Ap[], /* o : extended LPC coefficents, Q12*/ - Word16 *sub_gain, /* o : sub-frame gain, Q12*/ - Word16 tilt0, /* i : spectrum tilt, Q14*/ - Word16 tilt, /* i : spectrum tilt, Q13*/ - Word16 voice_factor /* i : voice factor, Q15*/ + const Word32 core_brate, /* i : core bitrate Q0*/ + const Word16 Aq_dyn_scal[], /* i : de-quant. LPC coefficents, dynamic scaling Q12*/ + Word16 Ap[], /* o : extended LPC coefficents, Q12*/ + Word16 *sub_gain, /* o : sub-frame gain, Q12*/ + Word16 tilt0, /* i : spectrum tilt, Q14*/ + Word16 tilt, /* i : spectrum tilt, Q13*/ + Word16 voice_factor /* i : voice factor, Q15*/ ) { diff --git a/lib_dec/hq_classifier_dec_fx.c b/lib_dec/hq_classifier_dec_fx.c index 5ff5dec58465b055c583514bb15712e079cbb800..d6df6e4f50103475295230f4c8012e7dabdc61ec 100644 --- a/lib_dec/hq_classifier_dec_fx.c +++ b/lib_dec/hq_classifier_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -99,19 +99,13 @@ Word16 hq_classifier_dec_fx( /* o : Consumed bits max_brate = HQ_48k; /* Q0 */ move32(); } -#ifndef SOLVED_COMP_ENC_DEC test(); test(); test(); test(); IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_FRAME48k ) ) && LE_32( core_brate, max_brate ) ) -#else - /*_DIFF_FLOAT_FIX_ -> could this modification break the interoperability with EVS ?? */ - test(); - IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_SPEC48k ) ) && LE_32( core_brate, max_brate ) ) -#endif { - *hqswb_clas = get_next_indice( st_fx, 2 ); /* Q0 */ + *hqswb_clas = get_next_indice_fx( st_fx, 2 ); /* Q0 */ move16(); bits = 2; move16(); @@ -125,7 +119,7 @@ Word16 hq_classifier_dec_fx( /* o : Consumed bits } ELSE { - *hqswb_clas = get_next_indice( st_fx, 1 ); /* Q0 */ + *hqswb_clas = get_next_indice_fx( st_fx, 1 ); /* Q0 */ move16(); bits = 1; move16(); @@ -147,11 +141,7 @@ Word16 hq_classifier_dec_fx( /* o : Consumed bits *hqswb_clas = HQ_GEN_SWB; /* Q0 */ move16(); } -#ifndef SOLVED_COMP_ENC_DEC ELSE IF( EQ_16( length, L_FRAME48k ) ) -#else - ELSE IF( EQ_16( length, L_SPEC48k ) ) -#endif { *hqswb_clas = HQ_GEN_FB; /* Q0 */ move16(); diff --git a/lib_dec/hq_conf_fec_fx.c b/lib_dec/hq_conf_fec_fx.c index 06bf8289760e2f3d5f64f8d1a70f7be084b1844e..55c8bb8a0fe2fb4eaa0725531ba05bb89248dfdd 100644 --- a/lib_dec/hq_conf_fec_fx.c +++ b/lib_dec/hq_conf_fec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c index 714245514e4e3987f3e51f53e8e8aa2a4ca99834..6be36bd1ac5cd96048cfda606148eb5f02ac6e29 100644 --- a/lib_dec/hq_core_dec_fx.c +++ b/lib_dec/hq_core_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -78,22 +78,10 @@ void hq_core_dec_fx( /*num_bits = (short)(st->total_brate / 50); */ Mpy_32_16_ss( st_fx->total_brate, 5243, &L_tmp, &lsb ); /* 5243 is 1/50 in Q18. (0+18-15=3) */ num_bits = extract_l( L_shr( L_tmp, 3 ) ); /*Q0 */ - -#ifdef ADD_IVAS_HQ_CODE_L_SPEC - /* Set default spectrum length */ - L_spec = l_spec_tbl[st_fx->bwidth]; -#endif IF( !st_fx->bfi ) { IF( EQ_16( core_switching_flag, 1 ) ) { -#ifdef ADD_IVAS_HQ_CODE_L_SPEC - IF( NE_16( st_fx->element_mode, EVS_MONO ) ) - { - L_spec = l_spec_ext_tbl[st_fx->bwidth]; - } - ELSE -#endif { core_switching_hq_prepare_dec_fx( st_fx, &num_bits, output_frame ); @@ -105,12 +93,6 @@ void hq_core_dec_fx( } } } -#ifdef ADD_IVAS_HQ_CODE - IF( hq_recovery_flag ) - { - acelp_plc_mdct_transition( st ); - } -#endif /* subtract signalling bits */ num_bits = sub( num_bits, st_fx->next_bit_pos ); /* Q0 */ @@ -121,7 +103,7 @@ void hq_core_dec_fx( test(); IF( !( core_switching_flag ) && GT_32( st_fx->core_brate, MINIMUM_RATE_TO_ENCODE_VOICING_FLAG ) ) { - hHQ_core->HqVoicing = get_next_indice( st_fx, 1 ); /* Q0 */ + hHQ_core->HqVoicing = get_next_indice_fx( st_fx, 1 ); /* Q0 */ move16(); num_bits = sub( num_bits, 1 ); /* Q0 */ } @@ -145,9 +127,7 @@ void hq_core_dec_fx( /* set inner frame (== coded bandwidth) length */ inner_frame = inner_frame_tbl[st_fx->bwidth]; /* Q0 */ move16(); -#ifndef ADD_IVAS_HQ_CODE_L_SPEC L_spec = inner_frame; /* Q0 */ -#endif move16(); IF( st_fx->bfi == 0 ) @@ -233,12 +213,6 @@ void hq_core_dec_fx( move16(); } -#ifdef ADD_IVAS_HQ_CODE - test(); - test(); - test(); - IF( EQ_16( st_fx->element_mode, EVS_MONO ) || ( !core_switching_flag && !hq_recovery_flag ) ) -#endif { /* scaling (coefficients are in nominal level) */ IF( NE_16( output_frame, NORM_MDCT_FACTOR ) ) @@ -322,59 +296,6 @@ void hq_core_dec_fx( * Overlap-add * Pre-echo reduction *--------------------------------------------------------------------------*/ -#ifdef ADD_IVAS_HQ_CODE - if ( st->element_mode > EVS_MONO && ( core_switching_flag || hq_recovery_flag ) ) - { - /* Initializations for TCX MDCT framework, to be used for switching frame */ - tcx_cfg = st->hTcxCfg; - L_frameTCX_glob = hTcxDec->L_frameTCX; - L_frame_glob = st->L_frame; - L_spec = hTcxDec->L_frameTCX; - st->fscale = sr2fscale( st->sr_core ); - fscaleFB = sr2fscale( st->output_Fs ); - encoderLookahead = ( L_LOOK_12k8 * st->fscale ) / FSCALE_DENOM; - encoderLookaheadFB = ( L_LOOK_12k8 * fscaleFB ) / FSCALE_DENOM; - mdctWindowLength = getMdctWindowLength( st->fscale ); - mdctWindowLengthFB = (int16_t) ( mdctWindowLength * st->output_Fs / st->sr_core ); - if ( core_switching_flag ) - { - tcx_cfg->tcx_last_overlap_mode = TRANSITION_OVERLAP; - tcx_cfg->tcx_curr_overlap_mode = FULL_OVERLAP; - } - else - { - tcx_cfg->tcx_last_overlap_mode = ALDO_WINDOW; - tcx_cfg->tcx_curr_overlap_mode = ALDO_WINDOW; - st->last_core = HQ_CORE; /* Needed to decode non-transition frame */ - } - - init_tcx_window_cfg( tcx_cfg, st->sr_core, st->output_Fs, st->L_frame, hTcxDec->L_frameTCX, encoderLookahead, encoderLookaheadFB, mdctWindowLength, mdctWindowLengthFB, st->element_mode ); - - init_tcx_info( st, L_frame_glob, L_frameTCX_glob, 0, st->bfi, &tcx_offset, &tcx_offsetFB, &L_frame, &L_frameTCX, &left_rect, &L_spec ); - - overlap = tcx_cfg->tcx_mdct_window_length; - overlapFB = tcx_cfg->tcx_mdct_window_lengthFB; - index = tcx_cfg->tcx_last_overlap_mode; - - /* LB synthesis */ - IMDCT_fx( t_audio_q, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, wtda_audio, tcx_cfg->tcx_aldo_window_1_trunc, tcx_cfg->tcx_aldo_window_2, tcx_cfg->tcx_mdct_window_half, tcx_cfg->tcx_mdct_window_minimum, tcx_cfg->tcx_mdct_window_trans, tcx_cfg->tcx_mdct_window_half_length, tcx_cfg->tcx_mdct_window_min_length, index, - MDCT_IV, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frame_glob, 0, st->bfi, hHQ_core->old_outLB, 0, st, 0, acelp_zir ); - - mvr2r( wtda_audio + ( overlap >> 1 ) - tcx_offset, output, L_frame_glob ); - - /* FB synthesis */ - IMDCT_fx( t_audio_q, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, wtda_audio, tcx_cfg->tcx_aldo_window_1_FB_trunc, tcx_cfg->tcx_aldo_window_2_FB, tcx_cfg->tcx_mdct_window_halfFB, tcx_cfg->tcx_mdct_window_minimumFB, tcx_cfg->tcx_mdct_window_transFB, tcx_cfg->tcx_mdct_window_half_lengthFB, tcx_cfg->tcx_mdct_window_min_lengthFB, index, - MDCT_IV, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frameTCX_glob, 0, st->bfi, hHQ_core->old_out, 1, st, FSCALE_DENOM * L_frameTCX_glob / L_frame_glob, acelp_zir ); - - mvr2r( wtda_audio + ( overlapFB >> 1 ) - tcx_offsetFB, synth, L_frameTCX_glob ); - - if ( !core_switching_flag ) - { - st->last_core = ACELP_CORE; /* Restore last core */ - } - } - else -#endif { test(); IF( EQ_16( output_frame, L_FRAME8k ) || st_fx->bfi == 0 ) @@ -392,24 +313,6 @@ void hq_core_dec_fx( move16(); } } -#ifdef ADD_IVAS_HQ_CODE - if ( st->element_mode > EVS_MONO ) - { - if ( st->bfi ) - { - /* Rough resampling, but reduces energy loss in case of switch to ACELP in first good frame */ - lerp( t_audio_q, wtda_audio_LB, st->L_frame, inner_frame ); - v_multc( t_audio_q, 0.5f, wtda_audio_LB, st->L_frame ); - } - else - { - /* LB synthesis for potential switch to ACELP */ - ener_match = (float) sqrt( (float) st->L_frame / (float) output_frame ); - v_multc( t_audio_q, ener_match, t_audio_q, inner_frame ); - inverse_transform( t_audio_q, wtda_audio_LB, is_transient, st->L_frame, inner_frame, st->element_mode ); - } - } -#endif IF( EQ_16( output_frame, L_FRAME8k ) ) { test(); @@ -465,13 +368,6 @@ void hq_core_dec_fx( window_ola_fx( wtda_audio, synth, Q_synth, hHQ_core->old_out_fx, &hHQ_core->Q_old_wtda, output_frame, st_fx->hTcxCfg->tcx_last_overlap_mode, st_fx->hTcxCfg->tcx_curr_overlap_mode, st_fx->prev_bfi && !hHQ_core->ph_ecu_active, hHQ_core->oldHqVoicing, hHQ_core->oldgapsynth_fx ); } -#ifdef ADD_IVAS_HQ_CODE - if ( st->element_mode > EVS_MONO ) - { - /* LB synthesis for potential switch to ACELP */ - window_ola( wtda_audio_LB, output, hHQ_core->old_outLB, L_FRAME16k, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, st->prev_bfi && !hHQ_core->ph_ecu_active, hHQ_core->oldHqVoicing, hHQ_core->oldgapsynth ); - } -#endif test(); test(); IF( ( st_fx->bfi == 0 && st_fx->prev_bfi == 0 ) || !( GE_16( output_frame, L_FRAME16k ) ) ) @@ -561,13 +457,6 @@ void hq_core_dec_fx( Copy( &st_fx->mem_pitch_gain[2], &st_fx->mem_pitch_gain[nbsubfr + 2], nbsubfr ); /* Q14 */ set16_fx( &st_fx->mem_pitch_gain[2], 0, nbsubfr ); } -#ifdef ADD_IVAS_HQ_CODE - /* Move LB excitation to old_exc memory in case of switch HQ->ACELP */ - if ( st->element_mode > EVS_MONO ) - { - mvr2r( output, st->old_exc + L_EXC_MEM_DEC - st->L_frame, st->L_frame ); - } -#endif return; } @@ -627,9 +516,7 @@ void ivas_hq_core_dec_fx( set16_fx( gapsynth_fx, 0, L_FRAME48k ); set16_fx( num_bands_p, 0, MAX_SB_NB ); set16_fx( ynrm, 39, NB_SFM ); /* Initialize to the smallest value */ -#ifdef MSAN_FIX set16_fx( wtda_audio_16, 0, 2 * L_FRAME48k ); -#endif mean_en_high_fx = 0; move16(); Q_audio = 12; @@ -951,9 +838,6 @@ void ivas_hq_core_dec_fx( index = tcx_cfg->tcx_last_overlap_mode; /* Q0 */ move16(); -#ifndef MSAN_FIX - Copy_Scale_sig_32_16( wtda_audio, wtda_audio_16, 2 * L_FRAME48k, -13 ); -#endif /* LB synthesis */ E_audio = sub( 31, Q_audio ); @@ -978,7 +862,7 @@ void ivas_hq_core_dec_fx( Copy_Scale_sig_16_32_DEPREC( wtda_audio_16, wtda_audio, 2 * L_FRAME48k, 12 ); /* q_wtda + 12 */ IF( !core_switching_flag ) { - st_fx->last_core = ACELP_CORE; /* Restore last core Q0*/ + st_fx->last_core = ACELP_CORE; /* Restore last core Q0*/ move16(); } } @@ -1008,7 +892,7 @@ void ivas_hq_core_dec_fx( { /* Rough resampling, but reduces energy loss in case of switch to ACELP in first good frame */ L_lerp_fx_q11( t_audio_q, wtda_audio_LB, st_fx->L_frame, inner_frame ); - v_multc_fixed_16( t_audio_q, ONE_IN_Q14, wtda_audio_LB, st_fx->L_frame ); + v_multc_fx_16( t_audio_q, ONE_IN_Q14, wtda_audio_LB, st_fx->L_frame ); Q_audio = 15; move16(); } @@ -1019,7 +903,7 @@ void ivas_hq_core_dec_fx( tmp = Sqrt16( tmp, &tmp_e ); ener_match = shr( tmp, sub( 2, tmp_e ) ); // Q13 - v_multc_fixed_16( t_audio_q, ener_match, t_audio_q, inner_frame ); // Q10 + v_multc_fx_16( t_audio_q, ener_match, t_audio_q, inner_frame ); // Q10 Scale_sig32( t_audio_q, inner_frame, Q2 ); // Q10 + Q2 Q_audio = Q_G_audio; @@ -1210,6 +1094,8 @@ void HQ_core_dec_init_fx( move16(); move16(); move16(); + hHQ_core->Q_old_out_fx32 = Q11; + move16(); hHQ_core->last_hq_core_type = -1; /* Q0 */ move16(); diff --git a/lib_dec/hq_env_dec_fx.c b/lib_dec/hq_env_dec_fx.c index 7c5af1b2aa8d796a21141a34e20bdce3601d41d0..c00b7711d744a181a67d8f39de9df61b7badf672 100644 --- a/lib_dec/hq_env_dec_fx.c +++ b/lib_dec/hq_env_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -13,15 +13,15 @@ * Decode envelope indices *------------------------------------------------------------------------*/ -Word16 decode_envelope_indices_fx( /* o : Number of bits Q0*/ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 start_norm, /* i : starting band index Q0*/ - const Word16 num_sfm, /* i : Number of subbands Q0*/ - const Word16 numnrmibits, /* i : Bitrate of fall-back coding mode Q0*/ - Word16 *difidx, /* o : Diff indices/encoded diff indices Q0*/ - const Word16 flag_HQ2 /* i : indicator of HQ2 core Q0*/ - , - const Word16 is_transient /* i : indicator of HQ_TRANSIENT Q0*/ +/* o : Number of bits Q0*/ +Word16 decode_envelope_indices_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word16 start_norm, /* i : starting band index Q0*/ + const Word16 num_sfm, /* i : Number of subbands Q0*/ + const Word16 numnrmibits, /* i : Bitrate of fall-back coding mode Q0*/ + Word16 *difidx, /* o : Diff indices/encoded diff indices Q0*/ + const Word16 flag_HQ2, /* i : indicator of HQ2 core Q0*/ + const Word16 is_transient /* i : indicator of HQ_TRANSIENT Q0*/ ) { Word16 hcode_l; diff --git a/lib_dec/hq_hr_dec_fx.c b/lib_dec/hq_hr_dec_fx.c index d72f0ec452223ac8c1d4ae9b65ea060f164b043a..0d342ba2dca4b8d6c76ba11a26494c5d88a9d067 100644 --- a/lib_dec/hq_hr_dec_fx.c +++ b/lib_dec/hq_hr_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -18,7 +18,7 @@ void ivas_hq_pred_hb_bws_fx( const Word16 *ynrm, /* i : norm quantization index vector Q0*/ const Word16 length, /* i : frame length Q0*/ const Word16 hqswb_clas, /* i : HQ SWB class Q0*/ - const Word16 *SWB_fenv /* i : SWB frequency envelopes Q1*/ + const Word16 *SWB_fenv /* i : SWB frequency envelopes Q1*/ ) { Word16 i; @@ -46,7 +46,6 @@ void ivas_hq_pred_hb_bws_fx( } ELSE { - // EVS_FUNC_MODIFIED st_fx->prev_ener_shb_fx = 0; move16(); L_tmp = L_deposit_l( 0 ); @@ -72,7 +71,7 @@ void hq_pred_hb_bws_fx( const Word16 *ynrm, /* i : norm quantization index vector Q0*/ const Word16 length, /* i : frame length Q0*/ const Word16 hqswb_clas, /* i : HQ SWB class Q0*/ - const Word16 *SWB_fenv /* i : SWB frequency envelopes Q1*/ + const Word16 *SWB_fenv /* i : SWB frequency envelopes Q1*/ ) { Word16 i; @@ -100,7 +99,6 @@ void hq_pred_hb_bws_fx( } ELSE { -#ifdef EVS_FUNC_MODIFIED st_fx->prev_ener_shb_fx = 0; move16(); L_tmp = L_deposit_l( 0 ); @@ -111,15 +109,6 @@ void hq_pred_hb_bws_fx( L_tmp = Mpy_32_16_1( L_tmp, 2979 ); // Q1 st_fx->prev_ener_shb_fx = extract_l( L_tmp ); /*Q1*/ move16(); -#else - st_fx->prev_ener_shb_fx = 0; - move16(); - FOR( i = 0; i < SWB_FENV - 3; i++ ) - { - st_fx->prev_ener_shb_fx = add( st_fx->prev_ener_shb_fx, SWB_fenv[i] ); /*Q1*/ - } - st_fx->prev_ener_shb_fx = mult( st_fx->prev_ener_shb_fx, 2979 ); /*Q1*/ -#endif } } @@ -144,7 +133,7 @@ void ivas_hq_hr_dec_fx( Word16 *is_transient, /* o : transient flag Q0 */ Word16 *hqswb_clas, /* o : HQ SWB class Q0 */ Word16 *SWB_fenv, /* o : SWB frequency envelopes Q1 */ - const Word16 core_switching_flag /* i : Core switching flag Q0 */ + const Word16 core_switching_flag /* i : Core switching flag Q0 */ ) { Word16 nb_sfm; @@ -240,7 +229,7 @@ void ivas_hq_hr_dec_fx( hq_generic_exc_clas = swb_bwe_gain_deq_fx( st_fx, HQ_CORE, NULL, SWB_fenv, st_fx->core_brate >= HQ_32k, *hqswb_clas ); /* Use (st->core_brate >= HQ_32k) to be consistent with hq_configure */ IF( EQ_16( hq_generic_exc_clas, HQ_GENERIC_SP_EXC ) ) { - bits_left = add( bits_left, 1 ); /* conditional 1 bit saving for representing HQ GENERIC excitation class Q0*/ + bits_left = add( bits_left, 1 ); /* conditional 1 bit saving for representing HQ GENERIC excitation class Q0*/ } map_hq_generic_fenv_norm_fx( *hqswb_clas, SWB_fenv, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset ); } @@ -410,7 +399,7 @@ void hq_hr_dec_fx( Word16 *is_transient, /* o : transient flag Q0 */ Word16 *hqswb_clas, /* o : HQ SWB class Q0 */ Word16 *SWB_fenv, /* o : SWB frequency envelopes Q1 */ - const Word16 core_switching_flag /* i : Core switching flag Q0 */ + const Word16 core_switching_flag /* i : Core switching flag Q0 */ ) { Word16 nb_sfm; @@ -488,7 +477,7 @@ void hq_hr_dec_fx( test(); IF( !*is_transient && NE_16( *hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && LE_32( st_fx->core_brate, HQ_32k ) ) ) { - nf_idx = get_next_indice( st_fx, 2 ); /* Q0 */ + nf_idx = get_next_indice_fx( st_fx, 2 ); /* Q0 */ } /*------------------------------------------------------------------* @@ -503,10 +492,10 @@ void hq_hr_dec_fx( test(); IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) || EQ_16( *hqswb_clas, HQ_GEN_FB ) ) { - hq_generic_exc_clas = swb_bwe_gain_deq_fx( st_fx, HQ_CORE, NULL, SWB_fenv, st_fx->core_brate >= HQ_32k, *hqswb_clas ); /* Use (st->core_brate >= HQ_32k) to be consistent with hq_configure Q0*/ + hq_generic_exc_clas = swb_bwe_gain_deq_fx( st_fx, HQ_CORE, NULL, SWB_fenv, st_fx->core_brate >= HQ_32k, *hqswb_clas ); /* Use (st->core_brate >= HQ_32k) to be consistent with hq_configure Q0*/ if ( EQ_16( hq_generic_exc_clas, HQ_GENERIC_SP_EXC ) ) { - bits_left = add( bits_left, 1 ); /* conditional 1 bit saving for representing HQ GENERIC excitation class Q0*/ + bits_left = add( bits_left, 1 ); /* conditional 1 bit saving for representing HQ GENERIC excitation class Q0*/ } map_hq_generic_fenv_norm_fx( *hqswb_clas, SWB_fenv, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset ); } diff --git a/lib_dec/hq_lr_dec_fx.c b/lib_dec/hq_lr_dec_fx.c index 7d5d6a34b907255f65e9d83ee0e0224c686ba7aa..3fe586a26d3bf9fc7a11127f7413c3ab695e4818 100644 --- a/lib_dec/hq_lr_dec_fx.c +++ b/lib_dec/hq_lr_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -287,7 +287,7 @@ void hq_lr_dec_fx( exp_norm = norm_s( gqlevs_fx ); gqbits_fx = sub( 14, exp_norm ); /* Q0 */ - bit_budget_fx = sub( sub( num_bits, ebits_fx ), round_fx( L_shl( L_mult( Ngq_fx, gqbits_fx ), 15 ) ) ); /* (*num_bits) - (short) ceil (ebits) - Ngq * gqbits; Q0*/ + bit_budget_fx = sub( sub( num_bits, ebits_fx ), round_fx( L_shl( L_mult( Ngq_fx, gqbits_fx ), 15 ) ) ); /* (*num_bits) - (short) ceil (ebits) - Ngq * gqbits; Q0*/ pbits_fx = 0; @@ -583,7 +583,7 @@ void hq_lr_dec_fx( } ELSE IF( *is_transient_fx == 0 && EQ_16( inner_frame, L_FRAME16k ) ) { - bit_budget_fx = sub( bit_budget_fx, 2 ); /* bits in high bands to indicate the last 2 subbands is allocated bits or not Q0*/ + bit_budget_fx = sub( bit_budget_fx, 2 ); /* bits in high bands to indicate the last 2 subbands is allocated bits or not Q0*/ FOR( i = 0; i < 2; i++ ) { @@ -629,10 +629,29 @@ void hq_lr_dec_fx( IF( GE_16( i, highband ) ) { + + /* safety check in case of bit errors */ + IF( GT_32( Ep_fx[i], 536788991 /* max(Q30) */ ) ) + { + st_fx->BER_detect = 1; + move16(); + set32_fx( L_yout, 0, inner_frame ); + return; + } + enerH_fx = L_add_sat( enerH_fx, L_shl_sat( Ep_fx[i], 2 ) ); /*Q0 */ } ELSE IF( GE_16( i, lowband ) ) { + /* safety check in case of bit errors */ + IF( GT_32( Ep_fx[i], 536788991 /* max(Q30) */ ) ) + { + st_fx->BER_detect = 1; + move16(); + set32_fx( L_yout, 0, inner_frame ); + return; + } + enerL_fx = L_add_sat( enerL_fx, L_shl_sat( Ep_fx[i], 2 ) ); /*Q0 */ } } @@ -865,12 +884,12 @@ void hq_lr_dec_fx( } ELSE { - Copy32( L_y2_ni, L_y2, add( band_end[bands_fx - 1], 1 ) ); /* HQ_TRANSIENT Q12*/ + Copy32( L_y2_ni, L_y2, add( band_end[bands_fx - 1], 1 ) ); /* HQ_TRANSIENT Q12*/ } } ELSE { - Copy32( L_y2_ni, L_y2, add( band_end[bands_fx - 1], 1 ) ); /* NB, WB Q12*/ + Copy32( L_y2_ni, L_y2, add( band_end[bands_fx - 1], 1 ) ); /* NB, WB Q12*/ } test(); @@ -909,10 +928,10 @@ void hq_lr_dec_fx( *--------------------------------------------------------------------------------------*/ static Word16 small_symbol_dec_tran_fx( - Decoder_State *st_fx, /* i/o: decoder state structure Q0*/ - Word16 *qbidx, /* o : output of dequantized differential energy Q0*/ - const Word16 bands, /* i : number of bands Q0*/ - const Word16 is_transient /* i : transient flag Q0*/ + Decoder_State *st_fx, /* i/o: decoder state structure Q0*/ + Word16 *qbidx, /* o : output of dequantized differential energy Q0*/ + const Word16 bands, /* i : number of bands Q0*/ + const Word16 is_transient /* i : transient flag Q0*/ ) { Word16 i, bits; @@ -1221,9 +1240,9 @@ static Word16 band_energy_dequant_fx( static Word16 p2a_threshold_dequant_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 *p2a_flags, /* o : tonaly indicator Q0*/ - const Word16 bands, /* i : number of subbands Q0*/ - const Word16 p2a_bands /* i : number of subbnads for computing tonality Q0*/ + Word16 *p2a_flags, /* o : tonaly indicator Q0*/ + const Word16 bands, /* i : number of subbands Q0*/ + const Word16 p2a_bands /* i : number of subbnads for computing tonality Q0*/ ) { Word16 j, k; diff --git a/lib_dec/igf_dec_fx.c b/lib_dec/igf_dec_fx.c index 5bfa7476a76b4d3f951d270290412d12d6a2eccf..b08a0cb64c9e472df4c0282f4a76a5e98382106d 100644 --- a/lib_dec/igf_dec_fx.c +++ b/lib_dec/igf_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -123,8 +123,8 @@ return noise; } static Word16 ivas_IGF_replaceTCXNoise_1_fx( /**< out: Q0 | number of noise bands */ - const Word32 *in, /**< in: Q31 | MDCT spectrum */ - Word16 s_l, /**< in: Q0 | noise headroom */ + const Word32 *in, /**< in: in_exp | MDCT spectrum */ + Word16 in_exp, /**< in: Q0 | noise headroom */ const Word16 *TCXNoise, /**< in: Q0 | tcx noise indicator vector */ const Word16 start, /**< in: Q0 | start MDCT subband index */ const Word16 stop, /**< in: Q0 | stop MDCT subband index */ @@ -132,41 +132,44 @@ static Word16 ivas_IGF_replaceTCXNoise_1_fx( /**< out: Q Word16 *totalNoiseNrg_exp ) { Word16 sb; - Word16 tmp16; + Word16 tmp16, shift; Word16 noise; + Word32 tmp32; Word64 nE; - tmp16 = 0; + shift = 2; move16(); noise = 0; move16(); - s_l = sub( s_l, 5 ); nE = 0; move64(); + *totalNoiseNrg = 0; + move32(); + *totalNoiseNrg_exp = 0; + move16(); + FOR( sb = start; sb < stop; sb++ ) { IF( TCXNoise[sb] ) { - tmp16 = extract_h( L_shl( in[sb], s_l ) ); // Q31 + s_l - } - IF( TCXNoise[sb] ) - { - nE = W_mac_16_16( nE, tmp16, tmp16 ); // Q31 + s_l - } - IF( TCXNoise[sb] ) - { - noise = add( noise, 1 ); // Q0 + tmp32 = L_shr( in[sb], shift ); + nE = W_mac_32_32( nE, tmp32, tmp32 ); // 62 - (in_exp + shift + in_exp + shift + 1) + noise = add( noise, 1 ); } } - tmp16 = W_norm( nE ); - nE = W_shl( nE, tmp16 ); - *totalNoiseNrg = W_extract_h( nE ); - move32(); - *totalNoiseNrg_exp = sub( tmp16, 32 ); - move16(); + IF( nE ) + { + tmp16 = W_norm( nE ); + nE = W_shl( nE, tmp16 ); + *totalNoiseNrg = W_extract_h( nE ); + move32(); + *totalNoiseNrg_exp = sub( add( shl( shift, 1 ), shl( in_exp, 1 ) ), tmp16 ); + move16(); + } + return noise; } @@ -241,7 +244,7 @@ static void IGF_replaceTCXNoise_2( Word32 *in, /**< in g = getSqrtWord32( L_mult( divide3232( totalNoiseNrg, rE ), 8192 /*1.0f / 4.0f Q15*/ ) ); // ((Q15 + Q15 + Q1) / 2) -> Q15 - g = shl( g, 1 ); // Q16 + g = shl_sat( g, 1 ); // Q16 FOR( sb = start; sb < stop; sb++ ) { @@ -895,9 +898,9 @@ static void IGF_prepStereo( Word16 *igf_specL_e_arr, /* i/o: prepared left IGF spectrum exponents for each index */ Word32 *igf_specR_fx, /* i/o: prepared right IGF spectrum */ Word16 *igf_specR_e_arr, /* i/o: prepared right IGF spectrum exponents for each index */ - const Word32 *src_specL_fx, /* i : left source spectrum */ + Word32 *src_specL_fx, /* i : left source spectrum */ const Word16 src_specL_e, /* i : left source spectrum exp */ - const Word32 *src_specR_fx, /* i : right source spectrum */ + Word32 *src_specR_fx, /* i : right source spectrum */ const Word16 src_specR_e, /* i : right source spectrum exp */ const Word16 *coreMsMask /* i : line wise ms Mask Q0 */ ) @@ -906,9 +909,9 @@ static void IGF_prepStereo( H_IGF_INFO hInfoL, hInfoR; Word16 tb, sfb, strt_cpy, tile_idx; Word16 *swb_offset; - const Word32 c_fx = SQRT2_OVER_2_FIXED; // Q31 - Word16 selectionL = 0; // 0 -> IGF, 1 -> pSpecFlat - Word16 selectionR = 0; // 0 -> IGF, 1 -> pSpecFlat + const Word32 c_fx = SQRT2_OVER_2_FX; // Q31 + Word16 selectionL = 0; // 0 -> IGF, 1 -> pSpecFlat + Word16 selectionR = 0; // 0 -> IGF, 1 -> pSpecFlat move32(); move16(); move16(); @@ -964,15 +967,15 @@ static void IGF_prepStereo( { IF( hPrivateDataL->n_noise_bands_off ) { - IGF_replaceTCXNoise_2_new_ivas_with_var_shift( igf_specL_fx, - igf_specL_e_arr, - TCXNoiseL, - strt_cpy, - stop, - hPrivateDataL->totalNoiseNrg_off, - hPrivateDataL->totalNoiseNrg_off_exp, - hPrivateDataL->n_noise_bands_off, - hInfoL->nfSeed ); + IGF_replaceTCXNoise_2_new_ivas( src_specL_fx, + src_specL_e, + TCXNoiseL, + strt_cpy, + stop, + hPrivateDataL->totalNoiseNrg_off, + hPrivateDataL->totalNoiseNrg_off_exp, + hPrivateDataL->n_noise_bands_off, + hInfoL->nfSeed ); } selectionL = 1; move16(); @@ -999,15 +1002,15 @@ static void IGF_prepStereo( { IF( hPrivateDataR->n_noise_bands_off ) { - IGF_replaceTCXNoise_2_new_ivas_with_var_shift( igf_specR_fx, - igf_specR_e_arr, - TCXNoiseR, - strt_cpy, - stop, - hPrivateDataR->totalNoiseNrg_off, - hPrivateDataR->totalNoiseNrg_off_exp, - hPrivateDataR->n_noise_bands_off, - hInfoR->nfSeed ); + IGF_replaceTCXNoise_2_new_ivas( src_specR_fx, + src_specR_e, + TCXNoiseR, + strt_cpy, + stop, + hPrivateDataR->totalNoiseNrg_off, + hPrivateDataR->totalNoiseNrg_off_exp, + hPrivateDataR->n_noise_bands_off, + hInfoR->nfSeed ); } selectionR = 1; move16(); @@ -1129,15 +1132,15 @@ static void IGF_prepStereo( { IF( hPrivateDataL->n_noise_bands_off ) { - IGF_replaceTCXNoise_2_new_ivas_with_var_shift( igf_specL_fx, - igf_specL_e_arr, - TCXNoiseL, - strt_cpy, - stop, - hPrivateDataL->totalNoiseNrg_off, - hPrivateDataL->totalNoiseNrg_off_exp, - hPrivateDataL->n_noise_bands_off, - hInfoL->nfSeed ); + IGF_replaceTCXNoise_2_new_ivas( src_specL_fx, + src_specL_e, + TCXNoiseL, + strt_cpy, + stop, + hPrivateDataL->totalNoiseNrg_off, + hPrivateDataL->totalNoiseNrg_off_exp, + hPrivateDataL->n_noise_bands_off, + hInfoL->nfSeed ); } selectionL = 1; move16(); @@ -1164,15 +1167,15 @@ static void IGF_prepStereo( { IF( hPrivateDataR->n_noise_bands_off ) { - IGF_replaceTCXNoise_2_new_ivas_with_var_shift( igf_specR_fx, - igf_specR_e_arr, - TCXNoiseR, - strt_cpy, - stop, - hPrivateDataR->totalNoiseNrg_off, - hPrivateDataR->totalNoiseNrg_off_exp, - hPrivateDataR->n_noise_bands_off, - hInfoR->nfSeed ); + IGF_replaceTCXNoise_2_new_ivas( src_specR_fx, + src_specR_e, + TCXNoiseR, + strt_cpy, + stop, + hPrivateDataR->totalNoiseNrg_off, + hPrivateDataR->totalNoiseNrg_off_exp, + hPrivateDataR->n_noise_bands_off, + hInfoR->nfSeed ); } selectionR = 1; move16(); @@ -1479,14 +1482,9 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in Word16 dS[IGF_MAX_SFB]; Word16 dS_e[IGF_MAX_SFB]; Word32 energyTmp[24]; - Word32 L_c; Word16 Hr; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; move16(); move16(); -#endif /* initialize variables */ @@ -1562,18 +1560,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in &dE_e, negate( tmp ) ); - L_c = 0; - move32(); - FOR( tb = 0; tb < 24; tb++ ) - { - Carry = 0; - move16(); - L_tmp = L_add_co( L_tmp, energyTmp[tb], &Carry, &Overflow ); // Q31 - dE_e - Overflow = 0; - move16(); - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); - } - L_tmp = norm_llQ31( L_c, L_tmp, &shift ); // Q31 + L_tmp = sum_array_norm( energyTmp, 24, &shift ); /* float: dE = (float)sqrt(dE / 24.f); basop: */ shift = add( sub( shift, 4 ), dE_e ); /* x/24 = (x >> 4) * 1/1.5 */ dE = Sqrt16norm( extract_h( L_tmp ), &shift ); @@ -1881,8 +1868,8 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in sum = shl( sum, shift ); /* exponent of sum: sub(15, shift) */ /* divide E by sum */ - tmp = div_s( shr( round_fx_o( E, &Overflow ), 1 ), sum ); /* shift E 1 bit to the right in order to make it smaller than sum */ - tmp_e = sub( add( E_e, 1 ), sub( 15, shift ) ); /* 15Q0 | sum is 15Q0 */ + tmp = div_s( shr( round_fx_sat( E ), 1 ), sum ); /* shift E 1 bit to the right in order to make it smaller than sum */ + tmp_e = sub( add( E_e, 1 ), sub( 15, shift ) ); /* 15Q0 | sum is 15Q0 */ /* multiply the result by the hopsize */ L_tmp = L_mult( tmp, hopsize ); @@ -2165,16 +2152,8 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in Word16 dS[IGF_MAX_SFB]; Word16 dS_e[IGF_MAX_SFB]; Word32 energyTmp[24]; - Word32 L_c; Word16 spec_e_arr[N_MAX]; Word16 vspec_e_arr[N_MAX_TCX - IGF_START_MN]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); - Flag Carry = 0; - move16(); -#endif - /* initialize variables */ w0 = 6586; // Q15 @@ -2251,17 +2230,7 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in &dE_e, negate( tmp ) ); - L_c = 0; - move32(); - FOR( tb = 0; tb < 24; tb++ ) - { - Carry = 0; - move16(); - L_tmp = L_add_co( L_tmp, energyTmp[tb], &Carry, &Overflow ); // Q31 - dE_e - Overflow = 0; - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); - } - L_tmp = norm_llQ31( L_c, L_tmp, &shift ); // Q31 + L_tmp = sum_array_norm( energyTmp, 24, &shift ); /* float: dE = (float)sqrt(dE / 24.f); basop: */ shift = add( sub( shift, 4 ), dE_e ); /* x/24 = (x >> 4) * 1/1.5 */ dE = Sqrt16norm( extract_h( L_tmp ), &shift ); @@ -2568,8 +2537,8 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in sum = shl( sum, shift ); /* exponent of sum: sub(15, shift) */ /* divide E by sum */ - tmp = div_s( shr( round_fx_o( E, &Overflow ), 1 ), sum ); /* shift E 1 bit to the right in order to make it smaller than sum */ - tmp_e = sub( add( E_e, 1 ), sub( 15, shift ) ); /* 15Q0 | sum is 15Q0 */ + tmp = div_s( shr( round_fx_sat( E ), 1 ), sum ); /* shift E 1 bit to the right in order to make it smaller than sum */ + tmp_e = sub( add( E_e, 1 ), sub( 15, shift ) ); /* 15Q0 | sum is 15Q0 */ /* multiply the result by the hopsize */ L_tmp = L_mult( tmp, hopsize ); @@ -2883,12 +2852,10 @@ static void IGF_getWhiteSpectralData_ivas( Word16 j; Word32 ak; Word16 ak_e; -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - Word16 tmp_16; -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ Word16 tmp_e; Word16 out_e_arr[IGF_START_MX + MAX_IGF_SFB_LEN]; Word16 max_out_e; + Word64 window_sum; assert( LT_16( stop, IGF_START_MX + MAX_IGF_SFB_LEN ) ); /* inits */ @@ -2904,94 +2871,48 @@ static void IGF_getWhiteSpectralData_ivas( Word16 guard_bits = add( find_guarded_bits_fx( add( i_mult( 2, level ), 1 ) ), 1 ) / 2; s_l = sub( s_l, guard_bits ); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE Word16 shift = sub( shl( s_l, 1 ), 32 ); Word16 eff_e = sub( shl( sub( in_e, s_l ), 1 ), 15 ); Word16 diff = add( 21, in_e ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ Word16 quo = BASOP_Util_Divide3216_Scale( ONE_IN_Q30, add( shl( level, 1 ), 1 ), &tmp_e ); tmp_e = add( tmp_e, 1 ); ak_e = add( tmp_e, sub( shl( sub( in_e, s_l ), 1 ), 15 ) ); // tmp_e + 2 * (in_e - s_l) - 15 -#ifdef OPT_SBA_AVOID_SPAR_RESCALE ak_e = sub( ak_e, 1 ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ - FOR( i = start; i < stop - level; i++ ) + window_sum = 0; + move64(); + FOR( j = start - level; j < start + level; j++ ) { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - Word64 temp = 0; - move64(); - FOR( j = i - level; j < i + level + 1; j++ ) - { - temp = W_mac_32_32( temp, in[j], in[j] ); - } - ak = Mult_32_16( W_shl_sat_l( temp, shift ), quo ); // add( shl( level, 1 ), 1 ), &tmp_e ) ); + window_sum = W_mac_32_32( window_sum, in[j], in[j] ); + } + FOR( i = start; i < stop - level; i++ ) + { + window_sum = W_mac_32_32( window_sum, in[i + level], in[i + level] ); /* add the right one */ + ak = Mult_32_16( W_shl_sat_l( window_sum, shift ), quo ); // add( shl( level, 1 ), 1 ), &tmp_e ) ); + window_sum = W_sub( window_sum, W_mult_32_32( in[i - level], in[i - level] ) ); /* subtract the left one */ n = sub( ak_e, norm_l( ak ) ); n = shr( n, 1 ); out_e_arr[i] = sub( diff, n ); move16(); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - ak = 0; - move32(); - move32(); - FOR( j = i - level; j < i + level + 1; j++ ) - { - tmp_16 = extract_h( L_shl( in[j], s_l ) ); // e: in_e - s_l - ak = L_mac( ak, tmp_16, tmp_16 ); // e: 2 * (in_e - s_l) - } - ak = Mult_32_16( ak, quo ); // add( shl( level, 1 ), 1 ), &tmp_e ) ); - - - n = sub( 30, add( norm_l( ak ), sub( 31, ak_e ) ) ); - n = shr( n, 1 ); - - out_e_arr[i] = add( sub( 21, n ), in_e ); - move16(); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ max_out_e = s_max( max_out_e, out_e_arr[i] ); } FOR( ; i < stop; i++ ) { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - Word64 temp = 0; - move64(); + ak = L_deposit_h( BASOP_Util_Divide3216_Scale( W_shl_sat_l( window_sum, shift ), sub( stop, sub( i, level ) ), &tmp_e ) ); + window_sum = W_sub( window_sum, W_mult_32_32( in[i - level], in[i - level] ) ); /* subtract the left one */ + ak_e = add( tmp_e, eff_e ); // tmp_e + 2 * (in_e - s_l) - 15 - FOR( j = i - level; j < stop; j++ ) - { - temp = W_mac_32_32( temp, in[j], in[j] ); - } - - ak = L_deposit_h( BASOP_Util_Divide3216_Scale( W_shl_sat_l( temp, shift ), sub( stop, sub( i, level ) ), &tmp_e ) ); - ak_e = add( tmp_e, eff_e ); // tmp_e + 2 * (in_e - s_l) - 15 n = sub( ak_e, add( norm_l( ak ), 1 ) ); n = shr( n, 1 ); out_e_arr[i] = sub( diff, n ); move16(); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - ak = 0; - move32(); - - FOR( j = i - level; j < stop; j++ ) - { - tmp_16 = extract_h( L_shl( in[j], s_l ) ); // e: in_e - s_l - ak = L_mac( ak, tmp_16, tmp_16 ); // e: 2 * (in_e - s_l) - } - ak = L_deposit_h( BASOP_Util_Divide3216_Scale( ak, sub( stop, sub( i, level ) ), &tmp_e ) ); - ak_e = add( tmp_e, sub( shl( sub( in_e, s_l ), 1 ), 15 ) ); // tmp_e + 2 * (in_e - s_l) - 15 - - n = sub( 30, add( norm_l( ak ), sub( 31, ak_e ) ) ); - n = shr( n, 1 ); - - out_e_arr[i] = add( sub( 21, n ), in_e ); - move16(); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ max_out_e = s_max( max_out_e, out_e_arr[i] ); } @@ -3017,10 +2938,6 @@ static void IGF_RefineGrid( H_IGF_GRID hGrid /**< in Word16 sfb; Word16 tmp; Word16 delta; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif set16_fx( a, 0, IGF_MAX_SFB + 1 ); @@ -3034,7 +2951,7 @@ static void IGF_RefineGrid( H_IGF_GRID hGrid /**< in move16(); tmp = add( tmp, 1 ); delta = sub( hGrid->swb_offset[sfb + 1], hGrid->swb_offset[sfb] ); - delta = mac_r( 0x00195000, 29491 /*0.45f Q16*/, shl_o( delta, 5, &Overflow ) ); + delta = mac_r( 0x00195000, 29491 /*0.45f Q16*/, shl_sat( delta, 5 ) ); a[tmp] = add( hGrid->swb_offset[sfb], shr( delta, 6 ) ); move16(); IF( s_and( a[tmp], 1 ) != 0 ) @@ -3065,10 +2982,6 @@ static void IGF_RefineGrid_ivas_fx( H_IGF_GRID hGrid /**< in/out: | IGF grid han Word16 sfb; Word16 tmp; Word16 delta; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif set16_fx( a, 0, IGF_MAX_SFB + 1 ); @@ -3082,7 +2995,7 @@ static void IGF_RefineGrid_ivas_fx( H_IGF_GRID hGrid /**< in/out: | IGF grid han move16(); tmp = add( tmp, 1 ); delta = sub( hGrid->swb_offset[sfb + 1], hGrid->swb_offset[sfb] ); - delta = mac_r( 0x00195000, 29491 /*0.45f Q16*/, shl_o( delta, 5, &Overflow ) ); + delta = mac_r( 0x00195000, 29491 /*0.45f Q16*/, shl_sat( delta, 5 ) ); a[tmp] = add( hGrid->swb_offset[sfb], shr( delta, 6 ) ); move16(); // Rounding off delta values >=t+0.5 to t+1 @@ -3578,14 +3491,8 @@ void IGFDecApplyMono_ivas( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in specMed_e = igf_spec_e[i]; move16(); - /*14 seems to be precise enough*/ - hPrivateData->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( - hInstance->infoTCXNoise_ptr, - igf_spec + hGrid->minSrcSubband, - sub( hGrid->startLine, hGrid->minSrcSubband ) ); - move16(); hPrivateData->n_noise_bands = ivas_IGF_replaceTCXNoise_1_fx( igf_spec, - hPrivateData->headroom_TCX_noise_white, + igf_spec_e[i], hInstance->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, @@ -3593,9 +3500,6 @@ void IGFDecApplyMono_ivas( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in &hPrivateData->totalNoiseNrg_exp ); move16(); - hPrivateData->totalNoiseNrg_exp = sub( shl( sub( igf_spec_e[i], sub( hPrivateData->headroom_TCX_noise_white, 5 ) ), 1 ), hPrivateData->totalNoiseNrg_exp ); - move16(); - BREAK; } } @@ -3605,22 +3509,15 @@ void IGFDecApplyMono_ivas( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in { IF( EQ_16( hPrivateData->currWhiteningLevel[i], IGF_WHITENING_OFF ) ) { - hPrivateData->headroom_TCX_noise = IGF_getScaleFactor32Cond( - hInstance->infoTCXNoise_ptr, - hPrivateData->pSpecFlat + hGrid->minSrcSubband, - sub( hGrid->startLine, hGrid->minSrcSubband ) ); - move16(); hPrivateData->n_noise_bands_off = ivas_IGF_replaceTCXNoise_1_fx( hPrivateData->pSpecFlat, - hPrivateData->headroom_TCX_noise, + hPrivateData->pSpecFlat_exp, hInstance->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateData->totalNoiseNrg_off, &hPrivateData->totalNoiseNrg_off_exp ); move16(); - hPrivateData->totalNoiseNrg_off_exp = sub( shl( sub( hPrivateData->pSpecFlat_exp, sub( hPrivateData->headroom_TCX_noise, 5 ) ), 1 ), hPrivateData->totalNoiseNrg_off_exp ); - move16(); BREAK; } } @@ -3805,12 +3702,9 @@ void IGFDecApplyStereo( move16(); } - hPrivateDataL->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( hIGFDecL->infoTCXNoise_ptr + hGrid->minSrcSubband, - igf_specL_fx + hGrid->minSrcSubband, - sub( hGrid->startLine, hGrid->minSrcSubband ) ); - move16(); + hPrivateDataL->n_noise_bands = ivas_IGF_replaceTCXNoise_1_fx( igf_specL_fx, - hPrivateDataL->headroom_TCX_noise_white, + specMedL_e, hIGFDecL->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, @@ -3818,9 +3712,6 @@ void IGFDecApplyStereo( &hPrivateDataL->totalNoiseNrg_exp ); move16(); - hPrivateDataL->totalNoiseNrg_exp = sub( shl( sub( specMedL_e, sub( hPrivateDataL->headroom_TCX_noise_white, 5 ) ), 1 ), hPrivateDataL->totalNoiseNrg_exp ); - move16(); - IF( !bfi ) { s_l = getScaleFactor32( hPrivateDataR->pSpecFlat + hGrid->minSrcSubband - whiteningLevel, @@ -3841,21 +3732,14 @@ void IGFDecApplyStereo( move16(); } - hPrivateDataR->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( hIGFDecR->infoTCXNoise_ptr, - igf_specR_fx + hGrid->minSrcSubband, - sub( hGrid->startLine, hGrid->minSrcSubband ) ); - move16(); hPrivateDataR->n_noise_bands = ivas_IGF_replaceTCXNoise_1_fx( igf_specR_fx, - hPrivateDataR->headroom_TCX_noise_white, + specMedR_e, hIGFDecR->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataR->totalNoiseNrg, &hPrivateDataR->totalNoiseNrg_exp ); move16(); - hPrivateDataR->totalNoiseNrg_exp = sub( shl( sub( specMedR_e, sub( hPrivateDataR->headroom_TCX_noise_white, 5 ) ), 1 ), hPrivateDataR->totalNoiseNrg_exp ); - move16(); - BREAK; } } @@ -3865,37 +3749,23 @@ void IGFDecApplyStereo( test(); IF( EQ_16( hPrivateDataL->currWhiteningLevel[i], IGF_WHITENING_OFF ) || EQ_16( hPrivateDataR->currWhiteningLevel[i], IGF_WHITENING_OFF ) ) { - hPrivateDataL->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( hIGFDecL->infoTCXNoise_ptr + hGrid->minSrcSubband, - hPrivateDataL->pSpecFlat + hGrid->minSrcSubband, - sub( hGrid->startLine, hGrid->minSrcSubband ) ); hPrivateDataL->n_noise_bands_off = ivas_IGF_replaceTCXNoise_1_fx( hPrivateDataL->pSpecFlat, - hPrivateDataL->headroom_TCX_noise_white, + hPrivateDataL->pSpecFlat_exp, hIGFDecL->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataL->totalNoiseNrg_off, &hPrivateDataL->totalNoiseNrg_off_exp ); - hPrivateDataL->totalNoiseNrg_off_exp = sub( shl( sub( hPrivateDataL->pSpecFlat_exp, sub( hPrivateDataL->headroom_TCX_noise_white, 5 ) ), 1 ), hPrivateDataL->totalNoiseNrg_off_exp ); - move16(); - move16(); move16(); - hPrivateDataR->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( hIGFDecR->infoTCXNoise_ptr, - hPrivateDataR->pSpecFlat + hGrid->minSrcSubband, - sub( hGrid->startLine, hGrid->minSrcSubband ) ); hPrivateDataR->n_noise_bands_off = ivas_IGF_replaceTCXNoise_1_fx( hPrivateDataR->pSpecFlat, - hPrivateDataR->headroom_TCX_noise_white, + hPrivateDataR->pSpecFlat_exp, hIGFDecR->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataR->totalNoiseNrg_off, &hPrivateDataR->totalNoiseNrg_off_exp ); - hPrivateDataR->totalNoiseNrg_off_exp = sub( shl( sub( hPrivateDataR->pSpecFlat_exp, sub( hPrivateDataR->headroom_TCX_noise_white, 5 ) ), 1 ), hPrivateDataR->totalNoiseNrg_off_exp ); - move16(); move16(); - move16(); - - BREAK; } } @@ -4199,16 +4069,17 @@ void IGFDecReplicateTCX10State_fx( /**********************************************************************/ /* copy the LPC flat spectrum to IGF buffer **************************************************************************/ -void IGFDecCopyLPCFlatSpectrum( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ - const Word32 *pSpectrumFlat, /**< in: Q31 | LPC flattend spectrum from TCX dec */ - const Word16 pSpectrumFlat_exp, /**< in: | exponent of pSpectrumFlat */ - const Word16 igfGridIdx /**< in: Q0 | IGF grid index */ + +void IGFDecCopyLPCFlatSpectrum( + const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ + const Word32 *pSpectrumFlat, /**< in: Q31 | LPC flattend spectrum from TCX dec */ + const Word16 pSpectrumFlat_exp, /**< in: | exponent of pSpectrumFlat */ + const Word16 igfGridIdx /**< in: Q0 | IGF grid index */ ) { IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData; H_IGF_GRID hGrid; - IF( hInstance ) { hPrivateData = &hInstance->igfData; @@ -4221,6 +4092,8 @@ void IGFDecCopyLPCFlatSpectrum( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in Copy32( pSpectrumFlat, hPrivateData->pSpecFlat, hGrid->startLine ); } + + return; } void IGFDecCopyLPCFlatSpectrum_fx( @@ -4245,13 +4118,18 @@ void IGFDecCopyLPCFlatSpectrum_fx( Copy_Scale_sig32( pSpectrumFlat, hPrivateData->pSpecFlat, hGrid->startLine, sub( pSpectrumFlat_exp, 20 ) ); // Q11 } + + return; } -/**********************************************************************/ /* - store the IGF bitstream information for TCX10 subframes - **************************************************************************/ -void IGFDecStoreTCX10SubFrameData( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ - const Word16 subFrameIdx /**< in: Q0 | index of subframe */ + +/**********************************************************************/ /* +store the IGF bitstream information for TCX10 subframes +**************************************************************************/ + +void IGFDecStoreTCX10SubFrameData( + const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ + const Word16 subFrameIdx /**< in: Q0 | index of subframe */ ) { IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData; @@ -4269,13 +4147,18 @@ void IGFDecStoreTCX10SubFrameData( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< /* store flattening trigger for current subframe */ hPrivateData->igf_flatteningTrigger_subframe[subFrameIdx] = hInstance->flatteningTrigger; move16(); + + return; } -/**********************************************************************/ /* - restore the IGF bitstream information for TCX10 subframes - **************************************************************************/ -void IGFDecRestoreTCX10SubFrameData( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ - const Word16 subFrameIdx /**< in: Q0 | index of subframe */ + +/**********************************************************************/ /* +restore the IGF bitstream information for TCX10 subframes +**************************************************************************/ + +void IGFDecRestoreTCX10SubFrameData( + const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Decoder */ + const Word16 subFrameIdx /**< in: Q0 | index of subframe */ ) { IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData; @@ -4326,11 +4209,13 @@ void IGFDecRestoreTCX10SubFrameData_fx( return; } + /*-----------------------------------------------------------------------* * init_igf_dec() * * Initialize IGF decoder parameters *-----------------------------------------------------------------------*/ + void init_igf_dec( IGF_DEC_INSTANCE_HANDLE hIGFDec /* i/o: IGF decoder handle */ ) @@ -4369,11 +4254,20 @@ void init_igf_dec( hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0]; hIGFDec->infoTCXNoise_ptr = &hIGFDec->infoTCXNoise_evs[0]; hIGFDec->virtualSpec_fx = &hIGFDec->virtualSpec[0]; + hIGFDec->infoIGFStopFreq = 0; + move16(); return; } -Word16 get_igf_startline( + +/*-----------------------------------------------------------------------* + * init_igget_igf_startline() + * + * + *-----------------------------------------------------------------------*/ + +Word16 get_igf_startline_fx( Decoder_State *st, /* i : decoder state */ const Word16 L_frame, /* i : length of the frame */ const Word16 L_frameTCX /* i : full band frame length */ diff --git a/lib_dec/igf_scf_dec_fx.c b/lib_dec/igf_scf_dec_fx.c index 1ddb9950aae54c498fd2f79c32e2ccfbd0ee8073..a8aa13e73dbb8f46754bc72183918a2cc77c489f 100644 --- a/lib_dec/igf_scf_dec_fx.c +++ b/lib_dec/igf_scf_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -189,6 +189,7 @@ static void decode_sfe_vector_fx( { /* (t == 0) && (f == 0) */ /* decode one of the IGF_SYMBOLS_IN_TABLE == 27 alphabet symbols using the new raw AC function */ + /* NOTE: the float equivalent uses a tmp variable + explicit cast here to avoid undefined behaviour here. This BASOP version does not need it as it already uses signed Word16 return value here. */ res = ari_decode_14bits_s27_ext_fx( st, &hPrivateData->acState, (const UWord16 *) hPrivateData->cf_se00 ); pred = arith_decode_bits_fx( hPrivateData, st, 2 ); /* LSBs as 2 bit raw */ diff --git a/lib_dec/init_dec_fx.c b/lib_dec/init_dec_fx.c index 934433132a702fb29af374d0d171bda50ca6c123..ec2c0ce0bf2a289c6f395fd43c5d54feeff6ce7d 100644 --- a/lib_dec/init_dec_fx.c +++ b/lib_dec/init_dec_fx.c @@ -1,847 +1,58 @@ -/*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 - ====================================================================================*/ - -#include "options.h" /* Compilation switches */ -#include "prot_fx.h" -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ -#include "stl.h" /* required for wmc_tool */ -#include "basop_util.h" -#include "ivas_prot_fx.h" - -/*----------------------------------------------------------------------* - * init_decoder() - * - * Initialization of static variables for the decoder - *----------------------------------------------------------------------*/ - -ivas_error init_decoder_fx( - Decoder_State *st_fx, /* o: Decoder static variables structure */ - const Word16 idchan /* i : channel ID */ -) -{ - Word16 i; - ivas_error error; - - error = IVAS_ERR_OK; - move16(); - Word16 newCldfbBands; - st_fx->total_num_bits = -1; - move16(); - - /*-----------------------------------------------------------------* - * ACELP core parameters - *-----------------------------------------------------------------*/ - - st_fx->codec_mode = MODE1; - move16(); - st_fx->last_codec_mode = MODE1; - move16(); - st_fx->core = ACELP_CORE; - move16(); - st_fx->L_frame = L_FRAME; - move16(); - st_fx->extl = -1; - move16(); - st_fx->total_brate = 8000; - move16(); - st_fx->last_total_brate = -1; - move16(); - st_fx->last_total_brate_ber = -1; - move32(); - st_fx->core_brate = 8000; - move16(); - st_fx->ini_frame = 0; - move16(); - st_fx->bwidth = NB; - move16(); - st_fx->extl_brate = 0; - move16(); - - - st_fx->last_coder_type = GENERIC; - move16(); - st_fx->last_L_frame = st_fx->L_frame; - move16(); - st_fx->last_core_brate = st_fx->core_brate; - move16(); - - st_fx->last_core = -1; - move16(); - st_fx->last_extl = st_fx->extl; - move16(); - - - /* LSF initilaizations */ - Copy( GEWB_Ave_fx, st_fx->mem_AR_fx, M ); - - init_lvq_fx( st_fx->offset_scale1_fx, st_fx->offset_scale2_fx, st_fx->offset_scale1_p_fx, st_fx->offset_scale2_p_fx, st_fx->no_scales_fx, st_fx->no_scales_p_fx ); - - set16_fx( st_fx->mem_MA_fx, 0, M ); - - st_fx->dm_fx.prev_state = 0; // Q0 - move16(); /* This corresponds to st_fx->dispMem in FLP */ - st_fx->dm_fx.prev_gain_code = L_deposit_l( 0 ); // Q16 - FOR( i = 2; i < 8; i++ ) - { - st_fx->dm_fx.prev_gain_pit[i - 2] = 0; // Q14 - move16(); - } - - st_fx->tilt_code_fx = 0; // Q15 - move16(); - st_fx->gc_threshold_fx = L_deposit_l( 0 ); // Q16 - st_fx->last_good = UNVOICED_CLAS; - move16(); - st_fx->clas_dec = UNVOICED_CLAS; - move16(); - - st_fx->lp_gainp_fx = 0; // Q14 - move16(); - st_fx->lp_gainc_fx = 0; // Q3 - move16(); - - set16_fx( st_fx->old_exc_fx, 0, L_EXC_MEM_DEC ); // Q_exc - - /* AVQ pre-quantizer memory */ - st_fx->mem_preemp_preQ_fx = 0; - move16(); - st_fx->last_nq_preQ = 0; - move16(); - st_fx->use_acelp_preq = 0; - move16(); - - st_fx->mem_deemph_fx = 0; // Q_syn - move16(); - /*-----------------------------------------------------------------* - * SWB BWE parameters - *-----------------------------------------------------------------*/ - - test(); - IF( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) - { - IF( ( st_fx->hBWE_FD = (FD_BWE_DEC_HANDLE) malloc( sizeof( FD_BWE_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FD BWE\n" ) ); - } - - fd_bwe_dec_init_fx( st_fx->hBWE_FD ); - } - ELSE - { - st_fx->hBWE_FD = NULL; - } - - /*-----------------------------------------------------------------* - * IGF - *-----------------------------------------------------------------*/ - - test(); - IF( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) - { - IF( ( st_fx->hIGFDec = (IGF_DEC_INSTANCE_HANDLE) malloc( sizeof( IGFDEC_INSTANCE ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for IGF\n" ) ); - } - - st_fx->igf = 0; - move16(); - init_igf_dec( st_fx->hIGFDec ); - } - ELSE - { - st_fx->hIGFDec = NULL; - } - - /*-----------------------------------------------------------------* - * HR SWB BWE parameters - *-----------------------------------------------------------------*/ - - IF( st_fx->element_mode == EVS_MONO ) - { - IF( ( st_fx->hBWE_FD_HR = (HR_BWE_DEC_HANDLE) malloc( sizeof( HR_BWE_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HR BWE\n" ) ); - } - - hr_bwe_dec_init( st_fx->hBWE_FD_HR ); - } - ELSE - { - st_fx->hBWE_FD_HR = NULL; - } - set16_fx( st_fx->mem_syn1_fx, 0, M ); - set16_fx( st_fx->mem_syn2_fx, 0, M ); - st_fx->stab_fac_fx = 0; // Q15 - move16(); - st_fx->stab_fac_smooth_fx = 0; // Q15 - move16(); - set16_fx( st_fx->agc_mem_fx, 0, 2 ); // Q0 - set32_fx( st_fx->L_mem_hp_out_fx, 0, 5 ); - set16_fx( st_fx->mem_syn3_fx, 0, M ); - - - Copy( GEWB_Ave_fx, st_fx->lsf_old_fx, M ); - lsf2lsp_fx( st_fx->lsf_old_fx, st_fx->lsp_old_fx, M, INT_FS_FX ); - st_fx->mid_lsf_int = 0; - move16(); - st_fx->safety_net = 0; - move16(); - st_fx->GSC_noisy_speech = 0; - move16(); - st_fx->last_voice_factor_fx = 0; // Q6 - move16(); - - - test(); - test(); - IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) - { - IF( ( st_fx->hGSCDec = (GSC_DEC_HANDLE) malloc( sizeof( GSC_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for GSC\n" ) ); - } - - GSC_dec_init( st_fx->hGSCDec ); - } - ELSE - { - st_fx->hGSCDec = NULL; - } - - /*-----------------------------------------------------------------* - * parameters for fast recovery (WI) - *-----------------------------------------------------------------*/ - test(); - IF( EQ_32( st_fx->output_Fs, 16000 ) && ( st_fx->element_mode == EVS_MONO ) ) - { - IF( ( st_fx->hWIDec = (WI_DEC_HANDLE) malloc( sizeof( WI_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FEC WI\n" ) ); - } - - set16_fx( st_fx->hWIDec->old_exc2_fx, 0, L_EXC_MEM ); - set16_fx( st_fx->hWIDec->old_syn2_fx, 0, L_EXC_MEM ); - } - ELSE - { - st_fx->hWIDec = NULL; - } - - /* NB post-filter */ - /*-----------------------------------------------------------------* - * NB/formant post-filter - *-----------------------------------------------------------------*/ - test(); - test(); - IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) - { - IF( ( st_fx->hPFstat = (PFSTAT_HANDLE) malloc( sizeof( PFSTAT ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for NB/formant postflter\n" ) ); - } - - Init_post_filter_fx( st_fx->hPFstat ); - st_fx->psf_lp_noise_fx = 0; // Q8 - move16(); - } - ELSE - { - st_fx->hPFstat = NULL; - } - st_fx->psf_lp_noise_fx = 0; // Q8 - move16(); - - /* FEC */ - st_fx->scaling_flag = 0; - move16(); - st_fx->lp_ener_FEC_av = 500000; // Q0 - move32(); - st_fx->lp_ener_FEC_max = 500000; // Q0 - move32(); - st_fx->prev_bfi = 0; - move16(); - st_fx->lp_ener_FER_fx = 15360; // Q8 - move16(); /*60 in Q8*/ - st_fx->old_enr_LP = 0; // Q5 - move16(); - st_fx->lp_ener_fx = L_deposit_l( 0 ); // Q6 - st_fx->enr_old_fx = L_deposit_l( 0 ); // Q0 - st_fx->bfi_pitch_fx = L_SUBFR_Q6; - move16(); - st_fx->bfi_pitch_frame = L_SUBFR; - move16(); - set16_fx( st_fx->mem_syn_clas_estim_fx, 0, L_SYN_MEM_CLAS_ESTIM ); - st_fx->classifier_Q_mem_syn = 0; - move16(); - st_fx->last_con_tcx = 0; - move16(); - - FOR( i = 0; i < 2 * NB_SUBFR16k; i++ ) - { - st_fx->old_pitch_buf_fx[i] = L_SUBFR << 16; // Q16 - move32(); /*15Q16*/ - } - - st_fx->upd_cnt = MAX_UPD_CNT; - move16(); - Copy( GEWB_Ave_fx, st_fx->lsfoldbfi0_fx, M ); - Copy( GEWB_Ave_fx, st_fx->lsfoldbfi1_fx, M ); - Copy( GEWB_Ave_fx, st_fx->lsf_adaptive_mean_fx, M ); - - st_fx->seed_acelp = RANDOM_INITSEED; - move16(); - st_fx->seed = RANDOM_INITSEED; - move16(); - st_fx->nbLostCmpt = 0; - move16(); - st_fx->decision_hyst = 0; - move16(); - - - /* Stationary noise UV modification */ - st_fx->unv_cnt = 0; - move16(); - st_fx->ge_sm_fx = L_deposit_l( 640 ); /*Q(GE_SHIFT)*/ - st_fx->uv_count = 0; - move16(); - st_fx->act_count = 3; - move16(); - Copy( st_fx->lsp_old_fx, st_fx->lspold_s_fx, M ); // Q15 - st_fx->noimix_seed = RANDOM_INITSEED; - move16(); - st_fx->min_alpha_fx = 32767; // Q15 - move16(); /*1; Q15*/ - st_fx->exc_pe_fx = 0; // Q_stat_noise - move16(); -#ifdef MSAN_FIX - st_fx->Q_stat_noise = 31; - move16(); -#endif // MSAN_FIX - /*-----------------------------------------------------------------* - * LD music post-filter - *-----------------------------------------------------------------*/ - test(); - test(); - IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) - { - IF( ( st_fx->hMusicPF = (MUSIC_POSTFILT_HANDLE) malloc( sizeof( MUSIC_POSTFILT_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LD music postflter\n" ) ); - } - - music_postfilt_init( st_fx->hMusicPF ); - } - ELSE - { - st_fx->hMusicPF = NULL; - } - - /* CNG and DTX */ - test(); - test(); - test(); - IF( idchan == 0 && ( ( st_fx->element_mode == EVS_MONO ) || EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) ) - { - IF( ( st_fx->hTdCngDec = (TD_CNG_DEC_HANDLE) malloc( sizeof( TD_CNG_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) ); - } - - td_cng_dec_init_fx( st_fx ); - } - ELSE - { - st_fx->hTdCngDec = NULL; - } - st_fx->cng_type = -1; - move16(); - st_fx->first_CNG = 0; - move16(); - Copy( st_fx->lsp_old_fx, st_fx->lspCNG_fx, M ); // Q15 - - st_fx->CNG_mode = -1; - move16(); - st_fx->last_active_brate = ACELP_7k20; - move32(); - st_fx->last_CNG_L_frame = L_FRAME; - move16(); - - - st_fx->last_vad_fx = 0; - move16(); - - /* HF (6-7kHz) BWE */ - move16(); - st_fx->Q_stat_noise_ge = GE_SHIFT; // Q of ge_sm_fx - move16(); - st_fx->cngTDLevel = 0; - move16(); - st_fx->cngTDLevel_e = 0; - move16(); - - - /*-----------------------------------------------------------------* - * HQ core parameters - *-----------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || EQ_16( st_fx->element_mode, IVAS_SCE ) || ( st_fx->element_mode == EVS_MONO ) ) ) - { - IF( ( st_fx->hHQ_core = (HQ_DEC_HANDLE) malloc( sizeof( HQ_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ core\n" ) ); - } - - /* HQ core initialization */ - HQ_core_dec_init_fx( st_fx->hHQ_core ); - - IF( st_fx->element_mode == EVS_MONO ) - { - /* HQ NB FEC initialization */ - IF( ( st_fx->hHQ_nbfec = (HQ_NBFEC_HANDLE) malloc( sizeof( HQ_NBFEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ NB FEC\n" ) ); - } - HQ_nbfec_init_fx( st_fx->hHQ_nbfec ); - } - ELSE - { - st_fx->hHQ_nbfec = NULL; - } - } - ELSE - { - st_fx->hHQ_core = NULL; - st_fx->hHQ_nbfec = NULL; - } - st_fx->Qprev_synth_buffer_fx = 15; - move16(); - st_fx->old_bfi_cnt = 0; - move16(); - st_fx->prev_old_bfi = 0; - move16(); - set16_fx( st_fx->delay_buf_out_fx, 0, HQ_DELTA_MAX * HQ_DELAY_COMP ); - set16_fx( st_fx->previoussynth_fx, 0, L_FRAME48k ); - IF( st_fx->element_mode == EVS_MONO ) - { - set16_fx( st_fx->old_synth_sw_fx, 0, NS2SA( 48000, FRAME_SIZE_NS - ACELP_LOOK_NS - DELAY_BWE_TOTAL_NS ) ); - } - /*-----------------------------------------------------------------* - * TCX core - *-----------------------------------------------------------------*/ - - /* TCX-LTP */ - IF( ( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) - { - IF( ( st_fx->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) ); - } - } - ELSE - { - st_fx->hTcxLtpDec = NULL; - } - - /* TCX core */ - // VE: reduction possible for MCT_CHAN_MODE_LFE channel - see I1-172 - IF( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) - { - IF( ( st_fx->hTcxDec = (TCX_DEC_HANDLE) malloc( sizeof( TCX_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxDec\n" ) ); - } - - set16_fx( st_fx->hTcxDec->FBTCXdelayBuf, 0, 111 ); - - st_fx->hTcxDec->old_synthFB_fx = st_fx->hTcxDec->synth_history_fx + NS2SA_FX2( st_fx->output_Fs, PH_ECU_MEM_NS ); - st_fx->hTcxDec->prev_good_synth_fx = st_fx->hTcxDec->old_synthFB_fx + NS2SA_FX2( st_fx->output_Fs, PH_ECU_LOOKAHEAD_NS ); - } - ELSE - { - st_fx->hTcxDec = NULL; - } - /* TCX config. data structure */ - IF( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) - { - IF( ( st_fx->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxCfg\n" ) ); - } - } - ELSE - { - st_fx->hTcxCfg = NULL; - } - - /* Tonal MDCT concealment data structure */ - - if ( ( st_fx->hTonalMDCTConc = (TonalMDCTConcealPtr) malloc( sizeof( TonalMDCTConceal_INSTANCE ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TonalMDCTConcealment\n" ) ); - } - - st_fx->prev_coder_type = GENERIC; - move16(); - - move16(); - st_fx->tilt_wb_fx = 0; // Q11 - move16(); - - set16_fx( st_fx->prev_synth_buffer_fx, 0, NS2SA_FX2( 48000, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); - set16_fx( st_fx->hb_prev_synth_buffer_fx, 0, NS2SA_FX2( 48000, DELAY_BWE_TOTAL_NS ) ); - st_fx->old_bwe_delay = -1; /*Q0*/ - move16(); - - /*-----------------------------------------------------------------* - * TBE parameters - *-----------------------------------------------------------------*/ - - test(); - IF( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) - { - IF( ( st_fx->hBWE_TD = (TD_BWE_DEC_HANDLE) malloc( sizeof( TD_BWE_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); - } - - td_bwe_dec_init_fx( st_fx->hBWE_TD, st_fx->extl, st_fx->output_Fs ); - - st_fx->prev_Q_bwe_exc = 31; - move16(); - } - ELSE - { - st_fx->hBWE_TD = NULL; - } - - st_fx->tilt_swb_fx = 0; // Q24 - move16(); - st_fx->tilt_wb_fx = 0; // Q11 - move16(); - - st_fx->prev_ener_shb_fx = 0; // Q1 - move16(); - st_fx->prev_enerLH_fx = 0; // Q1 - move16(); - st_fx->enerLH_fx = L_deposit_l( 0 ); - st_fx->enerLL_fx = L_deposit_l( 0 ); - st_fx->prev_enerLL_fx = 0; - move16(); - st_fx->prev_fractive = 0; - move16(); - st_fx->prev_bws_cnt = 0; - move16(); - st_fx->bws_cnt = N_WS2N_FRAMES; - move16(); - st_fx->bws_cnt1 = N_NS2W_FRAMES; - move16(); - st_fx->attenu_fx = 3277; // Q15 - move16(); - st_fx->last_inner_frame = L_FRAME8k; - move16(); - st_fx->last_bwidth = 0; - move16(); - - /*-----------------------------------------------------------------* - * channel-aware mode parameters - *-----------------------------------------------------------------*/ - - set16_fx( st_fx->tilt_code_dec_fx, 0, NB_SUBFR16k ); - - st_fx->use_partial_copy = 0; - move16(); - st_fx->prev_use_partial_copy = 0; - move16(); - st_fx->rf_flag = 0; - move16(); - st_fx->rf_flag_last = 0; - st_fx->prev_rf_frame_type = 0; - move16(); - st_fx->next_coder_type = 0; - move16(); - - st_fx->rf_target_bits = 0; - move16(); - - st_fx->rf_indx_nelp_fid = 0; - move16(); - st_fx->rf_indx_nelp_iG1 = 0; - move16(); - st_fx->rf_indx_nelp_iG2[0] = 0; - move16(); - st_fx->rf_indx_nelp_iG2[1] = 0; - move16(); - st_fx->rf_indx_tbeGainFr = 0; - move16(); - - /*----------------------------------------------------------------------------------* - * AMR-WB IO mode parameters - *----------------------------------------------------------------------------------*/ - test(); - IF( st_fx->Opt_AMR_WB || ( st_fx->element_mode == EVS_MONO ) ) - { - IF( ( st_fx->hAmrwb_IO = (AMRWB_IO_DEC_HANDLE) malloc( sizeof( AMRWB_IO_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for AMR-WB IO\n" ) ); - } - - /* AMR-WB IO init */ - amr_wb_dec_init_fx( st_fx->hAmrwb_IO ); - - /* AMR-WB IO HF synth init */ - hf_synth_amr_wb_init_fx( st_fx->hAmrwb_IO ); - } - ELSE - { - st_fx->hAmrwb_IO = NULL; - } - /*-----------------------------------------------------------------* - * HF (6-7kHz) (zero) BWE parameters - *-----------------------------------------------------------------*/ - test(); - test(); - IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) - { - IF( ( st_fx->hBWE_zero = (ZERO_BWE_DEC_HANDLE) malloc( sizeof( ZERO_BWE_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for zero BWE\n" ) ); - } - - hf_synth_init_fx( st_fx->hBWE_zero ); - /* TBV Hack for bit exactness with 26.452, Issue should be corrected there as the the reset is not perform on all values of mem_hp400_fx*/ - set16_fx( st_fx->hBWE_zero->mem_hp400_fx, 0, 6 ); - } - ELSE - { - st_fx->hBWE_zero = NULL; - } - - /* HF synth init */ - hf_synth_amr_wb_init_fx( st_fx->hAmrwb_IO ); - - - st_fx->bpf_off = 0; - move16(); - /*-----------------------------------------------------------------* - * Bass post-filter parameters - *-----------------------------------------------------------------*/ - test(); - test(); - IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) - { - IF( ( st_fx->hBPF = (BPF_DEC_HANDLE) malloc( sizeof( BPF_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for BPF\n" ) ); - } - - bass_psfilter_init_fx( st_fx->hBPF ); - } - ELSE - { - st_fx->hBPF = NULL; - } - /*-----------------------------------------------------------------* - * FD BPF & resampling tools parameters - *-----------------------------------------------------------------*/ - /* open analysis for max. SR 48kHz */ - IF( NE_32( ( error = openCldfb( &st_fx->cldfbAna, CLDFB_ANALYSIS, CLDFB_getNumChannels( 48000 ), 320 ) ), IVAS_ERR_OK ) ) - { - return error; - } - - /* open analysis BPF for max. SR 16kHz */ - IF( NE_32( ( error = openCldfb( &st_fx->cldfbBPF, CLDFB_ANALYSIS, CLDFB_getNumChannels( 16000 ), 320 ) ), IVAS_ERR_OK ) ) - { - return error; - } - /* open synthesis for output SR */ - IF( NE_32( ( error = openCldfb( &st_fx->cldfbSyn, CLDFB_SYNTHESIS, CLDFB_getNumChannels( st_fx->output_Fs ), st_fx->output_frame_fx ) ), IVAS_ERR_OK ) ) - { - return error; - } - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move32(); - st_fx->last_active_bandsToZero_bwdec = 0; - st_fx->perc_bwddec = 0; - st_fx->last_flag_filter_NB = 0; - st_fx->active_frame_cnt_bwddec = 0; - st_fx->total_frame_cnt_bwddec = 0; - set16_fx( st_fx->flag_buffer, 0, 20 ); - st_fx->avg_nrg_LT = 0; - - st_fx->Ng_ener_ST_fx = -13056; - move16(); /*-51 IN Q8*/ - st_fx->old_Es_pred_fx = 0; - move16(); - set16_fx( st_fx->old_Aq_12_8_fx + 1, 0, M ); - st_fx->old_Aq_12_8_fx[0] = 4096; - move16(); /*1 in Q12*/ - - /*-----------------------------------------------------------------* - * SC-VBR parameters - *-----------------------------------------------------------------*/ - - IF( st_fx->element_mode == EVS_MONO ) - { - IF( ( st_fx->hSC_VBR = (SC_VBR_DEC_HANDLE) malloc( sizeof( SC_VBR_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SC-VBR\n" ) ); - } - - sc_vbr_dec_init( st_fx->hSC_VBR ); - } - ELSE - { - st_fx->hSC_VBR = NULL; - } - - st_fx->last_ppp_mode_dec = 0; - move16(); - st_fx->old_ppp_mode = 0; - move16(); - st_fx->ppp_mode_dec = 0; - move16(); - st_fx->last_nelp_mode_dec = 0; - move16(); - st_fx->nelp_mode_dec = 0; - move16(); - st_fx->prev_gain_pit_dec_fx = 0; - move16(); - st_fx->prev_tilt_code_dec_fx = 0; - move16(); - st_fx->vbr_hw_BWE_disable_dec = 0; - move16(); - st_fx->last_vbr_hw_BWE_disable_dec = 0; - move16(); - - /*-----------------------------------------------------------------* - * Mode 2 initialization - *-----------------------------------------------------------------*/ - - IF( ( st_fx->hPlcInfo = (T_PLCInfo_HANDLE) malloc( sizeof( T_PLCInfo ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for PLC handle\n" ) ); - } - - st_fx->enablePlcWaveadjust = 0; - move16(); - - /* Init Decoder */ - open_decoder_LPD_fx( st_fx, st_fx->total_brate, st_fx->bwidth ); - - st_fx->m_decodeMode = DEC_NO_FRAM_LOSS; - move16(); - st_fx->m_frame_type = ACTIVE_FRAME; - move16(); - st_fx->m_old_frame_type = ACTIVE_FRAME; - move16(); - - - newCldfbBands = CLDFB_getNumChannels( L_mult0( st_fx->L_frame, 50 ) ); - - resampleCldfb( st_fx->cldfbAna, newCldfbBands, st_fx->L_frame, 1 ); - resampleCldfb( st_fx->cldfbBPF, newCldfbBands, st_fx->L_frame, 1 ); - - test(); - IF( ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || idchan == 0 ) /*&& mc_mode != MC_MODE_MCT && mc_mode != MC_MODE_PARAMUPMIX*/ ) - { - /* Create FD_CNG instance */ - - IF( NE_32( ( error = createFdCngDec_fx( &st_fx->hFdCngDec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - /* Init FD-CNG */ - initFdCngDec_fx( st_fx, st_fx->cldfbSyn->scale ); - } - ELSE - { - st_fx->hFdCngDec = NULL; - } - - st_fx->lp_noise = -167772160l /*-20.f Q23*/; - move32(); - st_fx->force_lpd_reset = 0; - move16(); - - /*-----------------------------------------------------------------* - * initialzie Q values - *-----------------------------------------------------------------*/ - - st_fx->Q_syn2 = 0; - move16(); - st_fx->Q_exc = 8; - st_fx->prev_Q_exc = 0; - move16(); - st_fx->Q_syn = 0; - move16(); - st_fx->prev_Q_syn = 0; - move16(); - - FOR( i = 0; i < L_Q_MEM; i++ ) - { - st_fx->Q_subfr[i] = 8; - move16(); - } - - st_fx->prev_Q_exc_fr = 0; - move16(); - st_fx->prev_Q_syn_fr = 0; - move16(); - - /*----------------------------------------------------------------------------------* - * Stereo/IVAS parameters - *----------------------------------------------------------------------------------*/ - st_fx->tdm_LRTD_flag = 0; /* LRTD stereo mode flag */ - move16(); - st_fx->cna_dirac_flag = 0; /* CNA in DirAC flag */ - move16(); - st_fx->cng_sba_flag = 0; /* CNG in SBA flag */ - move16(); - st_fx->element_mode = EVS_MONO; /* element mode */ - move16(); - st_fx->element_brate = -1; /* element bitrate */ - move16(); - st_fx->low_rate_mode = 0; /* low-rate mode flag */ - move16(); - st_fx->last_low_rate_mode = 0; /* low-rate mode flag */ - move16(); +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ -#ifdef DEBUGGING - st_fx->id_element = -1; /* element ID */ -#endif - st_fx->extl_orig = -1; /* extension layer */ - move16(); - st_fx->extl_brate_orig = 0; /* extension layer bitrate */ - move16(); +/*==================================================================================== + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 + ====================================================================================*/ - return error; -} +#include "options.h" /* Compilation switches */ +#include "prot_fx.h" +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ +#include "stl.h" /* required for wmc_tool */ +#include "basop_util.h" +#include "ivas_prot_fx.h" /*----------------------------------------------------------------------* - * init_decoder_ivas_fx() + * init_decoder() * - * Initialization of static variables for the IVAS decoder + * Initialization of static variables for the decoder *----------------------------------------------------------------------*/ -ivas_error init_decoder_ivas_fx( - Decoder_State *st_fx, /* o: Decoder static variables structure */ - const Word16 idchan, /* i : channel ID */ - const MC_MODE mc_mode /* i : MC mode */ +ivas_error init_decoder_fx( + Decoder_State *st_fx, /* o : Decoder static variables structure */ + const Word16 idchan, /* i : channel ID */ + const MC_MODE mc_mode /* i : MC mode */ ) { Word16 i; @@ -1036,10 +247,8 @@ ivas_error init_decoder_ivas_fx( move16(); st_fx->exc_pe_fx = 0; move16(); -#ifdef MSAN_FIX st_fx->Q_stat_noise = 31; move16(); -#endif st_fx->prev_coder_type = GENERIC; move16(); @@ -1077,7 +286,7 @@ ivas_error init_decoder_ivas_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for GSC\n" ) ); } - GSC_dec_init_ivas_fx( st_fx->hGSCDec ); + GSC_dec_init_fx( st_fx->hGSCDec ); } ELSE { @@ -1103,10 +312,10 @@ ivas_error init_decoder_ivas_fx( st_fx->hWIDec = NULL; } - /* NB post-filter */ /*-----------------------------------------------------------------* * NB/formant post-filter *-----------------------------------------------------------------*/ + test(); test(); IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) @@ -1139,9 +348,7 @@ ivas_error init_decoder_ivas_fx( } hf_synth_init_fx( st_fx->hBWE_zero ); -#ifdef MSAN_FIX set16_fx( st_fx->hBWE_zero->mem_hp400_fx, 0, 6 ); -#endif } ELSE { @@ -1151,6 +358,7 @@ ivas_error init_decoder_ivas_fx( /*-----------------------------------------------------------------* * LD music post-filter *-----------------------------------------------------------------*/ + test(); test(); IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) @@ -1181,7 +389,7 @@ ivas_error init_decoder_ivas_fx( move16(); st_fx->last_vad_fx = 0; move16(); - st_fx->active_cnt = 20; + st_fx->active_cnt = CNG_TYPE_HO; move16(); test(); @@ -1425,32 +633,56 @@ ivas_error init_decoder_ivas_fx( /*-----------------------------------------------------------------* * FD BPF & resampling tools parameters *-----------------------------------------------------------------*/ - test(); - test(); - IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) + + IF( st_fx->element_mode == EVS_MONO ) { /* open analysis for max. SR 48kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb( &st_fx->cldfbAna, CLDFB_ANALYSIS, 48000 ) ), IVAS_ERR_OK ) ) { return error; } /* open analysis BPF for max. SR 16kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb( &st_fx->cldfbBPF, CLDFB_ANALYSIS, 16000 ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* open synthesis for output SR */ + IF( NE_32( ( error = openCldfb( &st_fx->cldfbSyn, CLDFB_SYNTHESIS, st_fx->output_Fs ) ), IVAS_ERR_OK ) ) { return error; } } ELSE { - st_fx->cldfbAna = NULL; - st_fx->cldfbBPF = NULL; - } + test(); + test(); + IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) + { + /* open analysis for max. SR 48kHz */ + IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) + { + return error; + } - /* open synthesis for output SR */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbSyn, CLDFB_SYNTHESIS, st_fx->output_Fs, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) - { - return error; + /* open analysis BPF for max. SR 16kHz */ + IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + st_fx->cldfbAna = NULL; + st_fx->cldfbBPF = NULL; + } + + /* open synthesis for output SR */ + IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbSyn, CLDFB_SYNTHESIS, st_fx->output_Fs, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) + { + return error; + } } st_fx->cldfbSynHB = NULL; @@ -1565,6 +797,8 @@ ivas_error init_decoder_ivas_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxCfg\n" ) ); } + st_fx->hTcxCfg->tcx_mdct_window_length = L_FRAME32k / 2; + move16(); } ELSE { @@ -1609,6 +843,7 @@ ivas_error init_decoder_ivas_fx( /*-----------------------------------------------------------------* * Mode 2 initialization *-----------------------------------------------------------------*/ + IF( ( st_fx->element_mode == EVS_MONO ) ) { IF( ( st_fx->hPlcInfo = (T_PLCInfo_HANDLE) malloc( sizeof( T_PLCInfo ) ) ) == NULL ) @@ -1633,18 +868,24 @@ ivas_error init_decoder_ivas_fx( st_fx->hTECDec = NULL; } - /* Init Decoder */ - Word16 Q_syn_Overl_TDAC = 0, Q_fer_samples = 0, Q_syn_Overl = 0, Q_syn_Overl_TDACFB = 0, Q_syn_OverlFB = 0, Q_old_out = 0, Q_old_outLB = 0, Q_old_Aq_12_8 = 0; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - open_decoder_LPD_ivas_fx( st_fx, st_fx->total_brate, st_fx->last_total_brate, st_fx->bwidth, 0, st_fx->element_mode, 1, &Q_syn_Overl_TDAC, &Q_fer_samples, &Q_syn_Overl, &Q_syn_Overl_TDACFB, &Q_syn_OverlFB, &Q_old_out, &Q_old_outLB, &Q_old_Aq_12_8 ); + IF( st_fx->element_mode == EVS_MONO ) + { + open_decoder_LPD_fx( st_fx, st_fx->total_brate, st_fx->bwidth ); + } + ELSE + { + Word16 Q_syn_Overl_TDAC = 0, Q_fer_samples = 0, Q_syn_Overl = 0, Q_syn_Overl_TDACFB = 0, Q_syn_OverlFB = 0, Q_old_out = 0, Q_old_outLB = 0, Q_old_Aq_12_8 = 0; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + open_decoder_LPD_ivas_fx( st_fx, st_fx->total_brate, st_fx->last_total_brate, st_fx->bwidth, 0, st_fx->element_mode, 1, &Q_syn_Overl_TDAC, &Q_fer_samples, &Q_syn_Overl, &Q_syn_Overl_TDACFB, &Q_syn_OverlFB, &Q_old_out, &Q_old_outLB, &Q_old_Aq_12_8 ); + } /* PLC mode initialization */ st_fx->m_decodeMode = DEC_NO_FRAM_LOSS; @@ -1656,11 +897,19 @@ ivas_error init_decoder_ivas_fx( st_fx->m_old_frame_type = ACTIVE_FRAME; move16(); - test(); - IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) + IF( st_fx->element_mode == EVS_MONO ) + { + resampleCldfb( st_fx->cldfbAna, L_mult0( st_fx->L_frame, FRAMES_PER_SEC ), st_fx->L_frame, 1 ); + resampleCldfb( st_fx->cldfbBPF, L_mult0( st_fx->L_frame, FRAMES_PER_SEC ), st_fx->L_frame, 1 ); + } + ELSE { - resampleCldfb_ivas_fx( st_fx->cldfbAna, L_mult0( st_fx->L_frame, FRAMES_PER_SEC ) ); - resampleCldfb_ivas_fx( st_fx->cldfbBPF, L_mult0( st_fx->L_frame, FRAMES_PER_SEC ) ); + test(); + IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) + { + resampleCldfb_ivas_fx( st_fx->cldfbAna, L_mult0( st_fx->L_frame, FRAMES_PER_SEC ) ); + resampleCldfb_ivas_fx( st_fx->cldfbBPF, L_mult0( st_fx->L_frame, FRAMES_PER_SEC ) ); + } } /*-----------------------------------------------------------------* @@ -1673,7 +922,6 @@ ivas_error init_decoder_ivas_fx( IF( ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || idchan == 0 ) && NE_16( mc_mode, MC_MODE_MCT ) && NE_16( mc_mode, MC_MODE_PARAMUPMIX ) ) { /* Create FD_CNG instance */ - IF( NE_32( ( error = createFdCngDec_fx( &st_fx->hFdCngDec ) ), IVAS_ERR_OK ) ) { return error; @@ -1745,6 +993,7 @@ ivas_error init_decoder_ivas_fx( * * Initialization of static variables for pre-echo *----------------------------------------------------------------------*/ + void reset_preecho_dec_fx( HQ_DEC_HANDLE hHQ_core /* i/o: HQ core data handle */ ) @@ -1776,34 +1025,13 @@ void destroy_cldfb_decoder_fx( Decoder_State *st_fx /* o: Decoder static variables structure */ ) { - /* CLDFB BPF & resampling tools */ - - /* delete analysis for max. SR 16kHz */ - deleteCldfb( &st_fx->cldfbAna ); - - /* delete analysis BPF for max. SR 16kHz */ - deleteCldfb( &st_fx->cldfbBPF ); - - /* delete synthesis for output SR */ - deleteCldfb( &st_fx->cldfbSyn ); + deleteCldfb_fx( &st_fx->cldfbAna ); /* delete analysis for max. SR 16kHz */ + deleteCldfb_fx( &st_fx->cldfbBPF ); /* delete analysis BPF for max. SR 16kHz */ + deleteCldfb_fx( &st_fx->cldfbSyn ); /* delete synthesis for output SR */ + deleteCldfb_fx( &st_fx->cldfbSynHB ); deleteFdCngDec_fx( &st_fx->hFdCngDec ); return; } - -void destroy_cldfb_decoder_ivas_fx( - Decoder_State *st /* o : Decoder static variables structure */ -) -{ - /* CLDFB BPF & resampling tools */ - deleteCldfb_ivas_fx( &st->cldfbAna ); /* delete analysis at max. sampling rate 48kHz */ - deleteCldfb_ivas_fx( &st->cldfbBPF ); /* delete analysis BPF at max. internal sampling rate 16kHz */ - deleteCldfb_ivas_fx( &st->cldfbSyn ); /* delete synthesis at output sampling rate */ - deleteCldfb_ivas_fx( &st->cldfbSynHB ); - - deleteFdCngDec_fx( &st->hFdCngDec ); - - return; -} diff --git a/lib_dec/inov_dec_fx.c b/lib_dec/inov_dec_fx.c index 1ab1efe8fa8c587a2494997818d9694b6cc63a71..4d44e5b5b421cffb7f2d5faa669a5fbfd39ad139 100644 --- a/lib_dec/inov_dec_fx.c +++ b/lib_dec/inov_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -13,7 +13,7 @@ /* PURPOSE : Decode the algebraic innovation and do pitch sharpening */ /* */ /*-----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _ (Word32) core_brate : Core bitrate Q0 */ /* _ (Word16) Opt_AMR_WB : flag indicating AMR-WB IO mode Q0 */ /* _ (Word16) L_frame : length of the frame Q0 */ @@ -198,7 +198,7 @@ void inov_decode_fx( /* PURPOSE : Decode the algebraic innovation and do pitch sharpening */ /* */ /*-----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _ (Word32) core_brate : Core bitrate Q0 */ /* _ (Word16) Opt_AMR_WB : flag indicating AMR-WB IO mode Q0 */ /* _ (Word16) L_frame : length of the frame Q0 */ diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index 85fefadbccd4b5ac1da9e0ad24498b88b07e4c29..3ed7f6d88b1fac9aec549423c74a0999115fcb0f 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -43,12 +43,33 @@ #include "ivas_rom_binauralRenderer.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" #include "debug.h" + + +/*----------------------------------------------------------------------------------* + * Local constants + *----------------------------------------------------------------------------------*/ + #define NUM_TAPS_F0_6 ( Word16 )( 58 ) // (Word16) ceil( 0.6f * hBinRenConvModule->numTaps ) #define NUM_TAPS_F0_5 ( Word16 )( 48 ) // (Word16) ceil( 0.5f * hBinRenConvModule->numTaps ) #define NUM_TAPS_F0_4 ( Word16 )( 39 ) // (Word16) ceil( 0.4f * hBinRenConvModule->numTaps ) #define NUM_TAPS_F0_3 ( Word16 )( 29 ) // (Word16) ceil( 0.3f * hBinRenConvModule->numTaps ) + +#define REVERB_INPUT_DOWNMIX_CHANNELS ( 11 ) + +#define NUM_TAPS_F0_6 ( Word16 )( 58 ) // (Word16) ceil( 0.6f * hBinRenConvModule->numTaps ) +#define NUM_TAPS_F0_5 ( Word16 )( 48 ) // (Word16) ceil( 0.5f * hBinRenConvModule->numTaps ) +#define NUM_TAPS_F0_4 ( Word16 )( 39 ) // (Word16) ceil( 0.4f * hBinRenConvModule->numTaps ) +#define NUM_TAPS_F0_3 ( Word16 )( 29 ) // (Word16) ceil( 0.3f * hBinRenConvModule->numTaps ) + +/* Downmix table for sparse frequency domain reverberator*/ +static const Word32 dmxmtx_table_fx[BINAURAL_CHANNELS][REVERB_INPUT_DOWNMIX_CHANNELS] = { + // Q31 + { 0x7fffffff, 0, 1518485623, 0x7fffffff, 0, 0x7fffffff, 0, 0x7fffffff, 0, 0x7fffffff, 0 }, + { 0, 0x7fffffff, 1518485623, 0, 0x7fffffff, 0, 0x7fffffff, 0, 0x7fffffff, 0, 0x7fffffff }, +}; + + /*------------------------------------------------------------------------- * ivas_binRenderer_filterModule_fx() * @@ -56,50 +77,51 @@ *-------------------------------------------------------------------------*/ static void ivas_binRenderer_filterModule_fx( - Word64 out_Conv_CLDFB_real[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : real part of Binaural signals Q29 */ - Word64 out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals Q29 */ + Word32 out_Conv_CLDFB_real[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : real part of Binaural signals Q6 */ + Word32 out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals Q6 */ Word32 CLDFB_real[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : real part of LS signals Q_curr*/ Word32 CLDFB_imag[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : imag part of LS signals Q_curr*/ const Word16 numTimeSlots, /* i : number of time slots to process */ BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ + const Word16 pos_idx, /* i : pose index */ Word16 Q_curr ) { Word16 bandIdx, k, chIdx, tapIdx; Word32 *filterStatesLeftRealPtr_fx, *filterStatesLeftImagPtr_fx; -#ifdef OPT_BASOP_ADD_v1 Word16 Q_filterStates; -#else /* OPT_BASOP_ADD_v1 */ - Word16 *Q_filterStates; -#endif /* OPT_BASOP_ADD_v1 */ const Word32 *filterTapsLeftRealPtr_fx, *filterTapsLeftImagPtr_fx, *filterTapsRightRealPtr_fx, *filterTapsRightImagPtr_fx; Word16 shift_q; -#ifdef OPT_BASOP_ADD_v1 - Q_filterStates = hBinRenderer->hBinRenConvModule->Q_filterStatesLeft; + Word16 shift_q6 = sub( -29 + 6, Q_curr ); + Q_filterStates = hBinRenderer->hBinRenConvModule->Q_filterStates[pos_idx]; move16(); -#endif /* OPT_BASOP_ADD_v1 */ + + shift_q = add( sub( Q_filterStates, Q_curr ), 1 ); + hBinRenderer->hBinRenConvModule->Q_filterStates[pos_idx] = Q_curr; FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + FOR( k = 0; k < numTimeSlots; k++ ) { - filterStatesLeftRealPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx][0] ); - filterStatesLeftImagPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx][0] ); -#ifndef OPT_BASOP_ADD_v1 - Q_filterStates = (Word16 *) &( hBinRenderer->hBinRenConvModule->Q_filterStatesLeft[bandIdx][chIdx][0] ); -#endif /* OPT_BASOP_ADD_v1 */ - - filterTapsLeftRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx]; // Q29 - filterTapsLeftImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx]; // Q29 - filterTapsRightRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx]; // Q29 - filterTapsRightImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx]; // Q29 + Word64 outRealLeft_fx = 0, outRealRight_fx = 0, outImagLeft_fx = 0, outImagRight_fx = 0; + move64(); + move64(); + move64(); + move64(); + Word64 outRealLeft = 0, outRealRight = 0, outImagLeft = 0, outImagRight = 0; + move64(); + move64(); + move64(); + move64(); - FOR( k = 0; k < numTimeSlots; k++ ) + FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { - Word64 outRealLeft_fx = 0, outRealRight_fx = 0, outImagLeft_fx = 0, outImagRight_fx = 0; - move64(); - move64(); - move64(); - move64(); + filterStatesLeftRealPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftReal_fx[pos_idx][bandIdx][chIdx][0] ); + filterStatesLeftImagPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftImag_fx[pos_idx][bandIdx][chIdx][0] ); + + filterTapsLeftRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx]; // Q29 + filterTapsLeftImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx]; // Q29 + filterTapsRightRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx]; // Q29 + filterTapsRightImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx]; // Q29 FOR( tapIdx = hBinRenderer->hBinRenConvModule->numTapsArray[bandIdx] - 1; tapIdx > 0; tapIdx-- ) { @@ -107,109 +129,69 @@ static void ivas_binRenderer_filterModule_fx( move32(); filterStatesLeftImagPtr_fx[tapIdx] = filterStatesLeftImagPtr_fx[tapIdx - 1]; move32(); + Word32 neg_filterStatesLeftImagPtr_fx = L_negate( filterStatesLeftImagPtr_fx[tapIdx] ); -#ifndef OPT_BASOP_ADD_v1 - shift_q = sub( Q_filterStates[tapIdx], Q_filterStates[tapIdx - 1] ); - outRealLeft_fx = W_shr( outRealLeft_fx, shift_q ); - outImagLeft_fx = W_shr( outImagLeft_fx, shift_q ); - outRealRight_fx = W_shr( outRealRight_fx, shift_q ); - outImagRight_fx = W_shr( outImagRight_fx, shift_q ); -#endif /* OPT_BASOP_ADD_v1 */ - outRealLeft_fx = W_mac_32_32( outRealLeft_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsLeftRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates - outRealLeft_fx = W_mac_32_32( outRealLeft_fx, L_negate( filterStatesLeftImagPtr_fx[tapIdx] ), filterTapsLeftImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outRealLeft_fx = W_mac_32_32( outRealLeft_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsLeftRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outRealLeft_fx = W_mac_32_32( outRealLeft_fx, neg_filterStatesLeftImagPtr_fx, filterTapsLeftImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates outImagLeft_fx = W_mac_32_32( outImagLeft_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsLeftImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates outImagLeft_fx = W_mac_32_32( outImagLeft_fx, filterStatesLeftImagPtr_fx[tapIdx], filterTapsLeftRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates - outRealRight_fx = W_mac_32_32( outRealRight_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsRightRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates - outRealRight_fx = W_mac_32_32( outRealRight_fx, L_negate( filterStatesLeftImagPtr_fx[tapIdx] ), filterTapsRightImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outRealRight_fx = W_mac_32_32( outRealRight_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsRightRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outRealRight_fx = W_mac_32_32( outRealRight_fx, neg_filterStatesLeftImagPtr_fx, filterTapsRightImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates outImagRight_fx = W_mac_32_32( outImagRight_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsRightImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates outImagRight_fx = W_mac_32_32( outImagRight_fx, filterStatesLeftImagPtr_fx[tapIdx], filterTapsRightRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates -#ifndef OPT_BASOP_ADD_v1 - Q_filterStates[tapIdx] = Q_filterStates[tapIdx - 1]; - move16(); -#endif /* OPT_BASOP_ADD_v1 */ - } - -#ifdef OPT_BASOP_ADD_v1 - shift_q = add( sub( Q_filterStates, Q_curr ), 1 ); -#else /* OPT_BASOP_ADD_v1 */ - shift_q = add( sub( Q_filterStates[1], Q_curr ), 1 ); -#endif /* OPT_BASOP_ADD_v1 */ - -#ifdef OPT_BASOP_ADD_v1 - IF( shift_q != 0 ) - { -#endif /* OPT_BASOP_ADD_v1 */ - outRealLeft_fx = W_shr( outRealLeft_fx, shift_q ); // Q_curr - outImagLeft_fx = W_shr( outImagLeft_fx, shift_q ); // Q_curr - outRealRight_fx = W_shr( outRealRight_fx, shift_q ); // Q_curr - outImagRight_fx = W_shr( outImagRight_fx, shift_q ); // Q_curr -#ifdef OPT_BASOP_ADD_v1 - hBinRenderer->hBinRenConvModule->Q_filterStatesLeft = Q_curr; - move16(); } -#endif /* OPT_BASOP_ADD_v1 */ filterStatesLeftRealPtr_fx[0] = CLDFB_real[chIdx][k][bandIdx]; move32(); filterStatesLeftImagPtr_fx[0] = CLDFB_imag[chIdx][k][bandIdx]; move32(); -#ifndef OPT_BASOP_ADD_v1 - Q_filterStates[0] = Q_curr; - move16(); -#endif /* OPT_BASOP_ADD_v1 */ - /* Left Real and Imag */ - // Q29 + Q_curr - - Word32 temp1 = L_shr( filterStatesLeftRealPtr_fx[0], 1 ); - Word32 temp2 = L_shr( filterStatesLeftImagPtr_fx[0], 1 ); + Word32 neg_temp2 = L_negate( filterStatesLeftImagPtr_fx[0] ); // Q_curr - - outRealLeft_fx = W_mac_32_32( outRealLeft_fx, temp1, filterTapsLeftRealPtr_fx[0] ); - outRealLeft_fx = W_mac_32_32( outRealLeft_fx, L_negate( temp2 ), filterTapsLeftImagPtr_fx[0] ); - out_Conv_CLDFB_real[0][k][bandIdx] = W_add( out_Conv_CLDFB_real[0][k][bandIdx], outRealLeft_fx ); // Q29 - move64(); - - outImagLeft_fx = W_mac_32_32( outImagLeft_fx, temp1, filterTapsLeftImagPtr_fx[0] ); - outImagLeft_fx = W_mac_32_32( outImagLeft_fx, temp2, filterTapsLeftRealPtr_fx[0] ); - out_Conv_CLDFB_imag[0][k][bandIdx] = W_add( out_Conv_CLDFB_imag[0][k][bandIdx], outImagLeft_fx ); // Q29 - move64(); + outRealLeft = W_mac_32_32( W_mac_32_32( outRealLeft, filterStatesLeftRealPtr_fx[0], filterTapsLeftRealPtr_fx[0] ), neg_temp2, filterTapsLeftImagPtr_fx[0] ); + outImagLeft = W_mac_32_32( W_mac_32_32( outImagLeft, filterStatesLeftImagPtr_fx[0], filterTapsLeftRealPtr_fx[0] ), filterStatesLeftRealPtr_fx[0], filterTapsLeftImagPtr_fx[0] ); /* Right Real and Imag */ - outRealRight_fx = W_mac_32_32( outRealRight_fx, temp1, filterTapsRightRealPtr_fx[0] ); - outRealRight_fx = W_mac_32_32( outRealRight_fx, L_negate( temp2 ), filterTapsRightImagPtr_fx[0] ); - out_Conv_CLDFB_real[1][k][bandIdx] = W_add( out_Conv_CLDFB_real[1][k][bandIdx], outRealRight_fx ); // Q29 - move64(); - - outImagRight_fx = W_mac_32_32( outImagRight_fx, temp1, filterTapsRightImagPtr_fx[0] ); - outImagRight_fx = W_mac_32_32( outImagRight_fx, temp2, filterTapsRightRealPtr_fx[0] ); - out_Conv_CLDFB_imag[1][k][bandIdx] = W_add( out_Conv_CLDFB_imag[1][k][bandIdx], outImagRight_fx ); // Q29 - move64(); + outRealRight = W_mac_32_32( W_mac_32_32( outRealRight, neg_temp2, filterTapsRightImagPtr_fx[0] ), filterStatesLeftRealPtr_fx[0], filterTapsRightRealPtr_fx[0] ); + outImagRight = W_mac_32_32( W_mac_32_32( outImagRight, filterStatesLeftImagPtr_fx[0], filterTapsRightRealPtr_fx[0] ), filterStatesLeftRealPtr_fx[0], filterTapsRightImagPtr_fx[0] ); } + out_Conv_CLDFB_real[0][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outRealLeft_fx, shift_q ), W_shr( outRealLeft, 1 ) ), shift_q6 ); + out_Conv_CLDFB_real[1][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outRealRight_fx, shift_q ), W_shr( outRealRight, 1 ) ), shift_q6 ); + out_Conv_CLDFB_imag[0][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outImagLeft_fx, shift_q ), W_shr( outImagLeft, 1 ) ), shift_q6 ); + out_Conv_CLDFB_imag[1][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outImagRight_fx, shift_q ), W_shr( outImagRight, 1 ) ), shift_q6 ); + move32(); + move32(); + move32(); + move32(); } } + return; } + /*------------------------------------------------------------------------- * ivas_binRenderer_convModuleOpen() * * Open convolution module handle of fastconv binaural renderer *-------------------------------------------------------------------------*/ + static ivas_error ivas_binRenderer_convModuleOpen( BINAURAL_RENDERER_HANDLE hBinRenderer, const Word16 renderer_type, const Word16 isLoudspeaker, const AUDIO_CONFIG input_config, - const HRTFS_FASTCONV_HANDLE hHrtf ) + const HRTFS_FASTCONV_HANDLE hHrtf, + const Word16 num_poses ) { Word16 bandIdx, chIdx; + Word16 pos_idx; BINRENDERER_CONV_MODULE_HANDLE_FX hBinRenConvModule; @@ -234,11 +216,11 @@ static ivas_error ivas_binRenderer_convModuleOpen( move16(); } + hBinRenConvModule->numTaps = hHrtf->ntaps; + move16(); + IF( EQ_16( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { - hBinRenConvModule->numTaps = BINAURAL_NTAPS_MAX; - move16(); - /* Use variable order filtering */ bandIdx = 0; move16(); @@ -270,17 +252,6 @@ static ivas_error ivas_binRenderer_convModuleOpen( } ELSE { - IF( EQ_16( hBinRenderer->ivas_format, SBA_FORMAT ) ) - { - hBinRenConvModule->numTaps = BINAURAL_NTAPS_SBA; - move16(); - } - ELSE - { - hBinRenConvModule->numTaps = BINAURAL_NTAPS; - move16(); - } - /* Use fixed order filtering */ bandIdx = 0; move16(); @@ -335,69 +306,68 @@ static ivas_error ivas_binRenderer_convModuleOpen( } } - - IF( ( hBinRenConvModule->filterStatesLeftReal_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) + IF( ( hBinRenConvModule->filterStatesLeftReal_fx = (Word32 ****) malloc( num_poses * sizeof( Word32 *** ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } - IF( ( hBinRenConvModule->filterStatesLeftImag_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) + IF( ( hBinRenConvModule->filterStatesLeftImag_fx = (Word32 ****) malloc( num_poses * sizeof( Word32 *** ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } -#ifndef OPT_BASOP_ADD_v1 - IF( ( hBinRenConvModule->Q_filterStatesLeft = (Word16 ***) malloc( hBinRenderer->conv_band * sizeof( Word16 ** ) ) ) == NULL ) + IF( ( hBinRenConvModule->Q_filterStates = (Word16 *) malloc( num_poses * sizeof( Word16 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } -#endif /* OPT_BASOP_ADD_v1 */ - FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) { - IF( ( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hBinRenConvModule->filterStatesLeftReal_fx[pos_idx] = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } - IF( ( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hBinRenConvModule->filterStatesLeftImag_fx[pos_idx] = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } -#ifndef OPT_BASOP_ADD_v1 - IF( ( hBinRenConvModule->Q_filterStatesLeft[bandIdx] = (Word16 **) malloc( hBinRenderer->nInChannels * sizeof( Word16 * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); - } -#endif /* OPT_BASOP_ADD_v1 */ - - FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - IF( ( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx] = (Word32 *) malloc( hBinRenConvModule->numTapsArray[bandIdx] * sizeof( Word32 ) ) ) == NULL ) + IF( ( hBinRenConvModule->filterStatesLeftReal_fx[pos_idx][bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } - IF( ( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx] = (Word32 *) malloc( hBinRenConvModule->numTapsArray[bandIdx] * sizeof( Word32 ) ) ) == NULL ) + IF( ( hBinRenConvModule->filterStatesLeftImag_fx[pos_idx][bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } -#ifndef OPT_BASOP_ADD_v1 - IF( ( hBinRenConvModule->Q_filterStatesLeft[bandIdx][chIdx] = (Word16 *) malloc( hBinRenConvModule->numTapsArray[bandIdx] * sizeof( Word16 ) ) ) == NULL ) + + FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + IF( ( hBinRenConvModule->filterStatesLeftReal_fx[pos_idx][bandIdx][chIdx] = (Word32 *) malloc( hBinRenConvModule->numTapsArray[bandIdx] * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + + IF( ( hBinRenConvModule->filterStatesLeftImag_fx[pos_idx][bandIdx][chIdx] = (Word32 *) malloc( hBinRenConvModule->numTapsArray[bandIdx] * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } } -#endif /* OPT_BASOP_ADD_v1 */ } } + /* set memories */ FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { - Word16 tmp = 0; + Word16 tmp; + tmp = chIdx; move16(); IF( isLoudspeaker ) @@ -429,132 +399,86 @@ static ivas_error ivas_binRenderer_convModuleOpen( } } - IF( EQ_16( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftReal_fx[bandIdx][tmp]; + hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftImag_fx[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightReal_fx[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightImag_fx[bandIdx][tmp]; + } + } + + IF( EQ_16( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) + { + hBinRenConvModule->Q_filterStates[pos_idx] = 31; + move16(); + FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - /* set the memories to zero */ - set32_fx( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTapsArray[bandIdx] ); - set32_fx( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTapsArray[bandIdx] ); -#ifdef OPT_BASOP_ADD_v1 - hBinRenConvModule->Q_filterStatesLeft = 31; - move16(); -#else /* OPT_BASOP_ADD_v1 */ - set16_fx( hBinRenConvModule->Q_filterStatesLeft[bandIdx][chIdx], 31, hBinRenConvModule->numTapsArray[bandIdx] ); -#endif /* OPT_BASOP_ADD_v1 */ - IF( isLoudspeaker ) + FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { - hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftBRIRReal_fx[bandIdx][tmp]; - hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftBRIRImag_fx[bandIdx][tmp]; - hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightBRIRReal_fx[bandIdx][tmp]; - hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightBRIRImag_fx[bandIdx][tmp]; + /* set the memories to zero */ + set32_fx( hBinRenConvModule->filterStatesLeftReal_fx[pos_idx][bandIdx][chIdx], 0, hBinRenConvModule->numTapsArray[bandIdx] ); + set32_fx( hBinRenConvModule->filterStatesLeftImag_fx[pos_idx][bandIdx][chIdx], 0, hBinRenConvModule->numTapsArray[bandIdx] ); } } - ELSE + } + } + ELSE + { + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) + { + hBinRenConvModule->Q_filterStates[pos_idx] = 31; + move16(); + FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - /* set the memories to zero */ - set32_fx( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTaps ); - set32_fx( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTaps ); -#ifdef OPT_BASOP_ADD_v1 - hBinRenConvModule->Q_filterStatesLeft = 31; - move16(); -#else /* OPT_BASOP_ADD_v1 */ - set16_fx( hBinRenConvModule->Q_filterStatesLeft[bandIdx][chIdx], 31, hBinRenConvModule->numTaps ); -#endif /* OPT_BASOP_ADD_v1 */ - IF( isLoudspeaker ) - { - hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftHRIRReal_fx[bandIdx][tmp]; - hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftHRIRImag_fx[bandIdx][tmp]; - hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightHRIRReal_fx[bandIdx][tmp]; - hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightHRIRImag_fx[bandIdx][tmp]; - } - ELSE + FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { - IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_HOA3 ) ) - { - /* HOA3 filter coefficients */ - hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3_fx[bandIdx][chIdx]; - } - ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_HOA2 ) ) - { - /* HOA2 filter coefficients */ - hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA2_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA2_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA2_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA2_fx[bandIdx][chIdx]; - } - ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_FOA ) ) - { - /* FOA filter coefficients */ - hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftHRIRReal_FOA_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftHRIRImag_FOA_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightHRIRReal_FOA_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightHRIRImag_FOA_fx[bandIdx][chIdx]; - } - ELSE - { - return IVAS_ERR_INVALID_INPUT_FORMAT; - } + /* set the memories to zero */ + set32_fx( hBinRenConvModule->filterStatesLeftReal_fx[pos_idx][bandIdx][chIdx], 0, hBinRenConvModule->numTaps ); + set32_fx( hBinRenConvModule->filterStatesLeftImag_fx[pos_idx][bandIdx][chIdx], 0, hBinRenConvModule->numTaps ); } } } } - hBinRenderer->hBinRenConvModule = hBinRenConvModule; return IVAS_ERR_OK; } + /*-------------------------------------------------------------------------* * ivas_init_binaural_hrtf() * * initialize memory for HrtfFastConv structure elements *-------------------------------------------------------------------------*/ + void ivas_init_binaural_hrtf_fx( HRTFS_FASTCONV *HrtfFastConv /* i/o: FASTCONV HRTF structure */ ) { Word16 i; - HrtfFastConv->leftHRIRReal_HOA3_fx = NULL; - HrtfFastConv->leftHRIRImag_HOA3_fx = NULL; - HrtfFastConv->rightHRIRReal_HOA3_fx = NULL; - HrtfFastConv->rightHRIRImag_HOA3_fx = NULL; - HrtfFastConv->FASTCONV_HOA3_latency_s_fx = 0; + HrtfFastConv->leftReal_fx = NULL; + HrtfFastConv->leftImag_fx = NULL; + HrtfFastConv->rightReal_fx = NULL; + HrtfFastConv->rightImag_fx = NULL; + HrtfFastConv->FASTCONV_latency_s_fx = 0x00; move32(); - - HrtfFastConv->leftHRIRReal_fx = NULL; - HrtfFastConv->leftHRIRImag_fx = NULL; - HrtfFastConv->rightHRIRReal_fx = NULL; - HrtfFastConv->rightHRIRImag_fx = NULL; - HrtfFastConv->FASTCONV_HRIR_latency_s_fx = 0; - move32(); - - HrtfFastConv->leftBRIRReal_fx = NULL; - HrtfFastConv->leftBRIRImag_fx = NULL; - HrtfFastConv->rightBRIRReal_fx = NULL; - HrtfFastConv->rightBRIRImag_fx = NULL; - HrtfFastConv->FASTCONV_BRIR_latency_s_fx = 0; - move32(); - - HrtfFastConv->leftHRIRReal_HOA2_fx = NULL; - HrtfFastConv->leftHRIRImag_HOA2_fx = NULL; - HrtfFastConv->rightHRIRReal_HOA2_fx = NULL; - HrtfFastConv->rightHRIRImag_HOA2_fx = NULL; - HrtfFastConv->FASTCONV_HOA2_latency_s_fx = 0; - move32(); - - HrtfFastConv->leftHRIRReal_FOA_fx = NULL; - HrtfFastConv->leftHRIRImag_FOA_fx = NULL; - HrtfFastConv->rightHRIRReal_FOA_fx = NULL; - HrtfFastConv->rightHRIRImag_FOA_fx = NULL; - HrtfFastConv->FASTCONV_FOA_latency_s_fx = 0; - move32(); - + HrtfFastConv->n_channels = 0; + move16(); HrtfFastConv->allocate_init_flag = 0; move16(); + HrtfFastConv->ntaps = 0; + move16(); + HrtfFastConv->FASTCONV_latency_s_Q_fx = 0; + move16(); + HrtfFastConv->FASTCONV_taps_s_Q_fx = 0; + move16(); + HrtfFastConv->FASTCONV_reverbTime_s_Q_fx = 0; + move16(); + HrtfFastConv->FASTCONV_reverbEne_s_Q_fx = 0; + move16(); FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) { @@ -567,11 +491,13 @@ void ivas_init_binaural_hrtf_fx( return; } + /*-------------------------------------------------------------------------* * ivas_alloc_pppMem() * * Allocate memory for tripple pointer elements *-------------------------------------------------------------------------*/ + static ivas_error ivas_alloc_pppMem_fx( Word32 ****pppMem, /*Qx*/ const Word16 dim1, @@ -608,182 +534,59 @@ IF( allocate_init_flag == 0 ) return IVAS_ERR_OK; } + /*-------------------------------------------------------------------------* * ivas_allocate_binaural_hrtf() * * Allocate memory for HrtfFastConv structure elements *-------------------------------------------------------------------------*/ + ivas_error ivas_allocate_binaural_hrtf_fx( - HRTFS_FASTCONV *HrtfFastConv, /* i/o: FASTCONV HRTF structure */ - const AUDIO_CONFIG input_config, /* i : input audio configuration */ - const BINAURAL_INPUT_AUDIO_CONFIG bin_input_config, /* i : binaural input audio config */ - const RENDERER_TYPE renderer_type, /* i : renderer type */ - const Word16 allocate_init_flag /* i : Memory allocation flag */ + HRTFS_FASTCONV *HrtfFastConv, /* i/o: FASTCONV HRTF structure */ + const Word16 n_channels, /* i : number of input channels */ + const Word16 allocate_init_flag /* i : Memory allocation flag */ ) { - test(); - IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_HOA3 ) || EQ_32( bin_input_config, BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) ) - { - test(); - test(); - test(); - IF( ( HrtfFastConv->leftHRIRReal_HOA3_fx != NULL ) && ( HrtfFastConv->leftHRIRImag_HOA3_fx != NULL ) && ( HrtfFastConv->rightHRIRReal_HOA3_fx != NULL ) && ( HrtfFastConv->rightHRIRImag_HOA3_fx != NULL ) ) - { - return IVAS_ERR_OK; - } - ELSE - { - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->leftHRIRReal_HOA3_fx, BINAURAL_CONVBANDS, HOA3_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRReal_HOA3" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->leftHRIRImag_HOA3_fx, BINAURAL_CONVBANDS, HOA3_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRImag_HOA3" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->rightHRIRReal_HOA3_fx, BINAURAL_CONVBANDS, HOA3_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRReal_HOA3" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->rightHRIRImag_HOA3_fx, BINAURAL_CONVBANDS, HOA3_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRImag_HOA3" ); - } - } - } + HrtfFastConv->n_channels = n_channels; + move16(); test(); - IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_32( bin_input_config, BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) ) - { - test(); - test(); - test(); - IF( ( HrtfFastConv->leftHRIRReal_HOA2_fx != NULL ) && ( HrtfFastConv->leftHRIRImag_HOA2_fx != NULL ) && ( HrtfFastConv->rightHRIRReal_HOA2_fx != NULL ) && ( HrtfFastConv->rightHRIRImag_HOA2_fx != NULL ) ) - { - return IVAS_ERR_OK; - } - ELSE - { - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->leftHRIRReal_HOA2_fx, BINAURAL_CONVBANDS, HOA2_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRReal_HOA2" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->leftHRIRImag_HOA2_fx, BINAURAL_CONVBANDS, HOA2_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRImag_HOA2" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->rightHRIRReal_HOA2_fx, BINAURAL_CONVBANDS, HOA2_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRReal_HOA2" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->rightHRIRImag_HOA2_fx, BINAURAL_CONVBANDS, HOA2_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRImag_HOA2" ); - } - } - } - test(); - IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_FOA ) || EQ_32( bin_input_config, BINAURAL_INPUT_AUDIO_CONFIG_FOA ) ) + test(); + IF( ( HrtfFastConv->leftReal_fx != NULL ) && ( HrtfFastConv->leftImag_fx != NULL ) && ( HrtfFastConv->rightReal_fx != NULL ) && ( HrtfFastConv->rightImag_fx != NULL ) ) { - test(); - test(); - test(); - IF( ( HrtfFastConv->leftHRIRReal_FOA_fx != NULL ) && ( HrtfFastConv->leftHRIRImag_FOA_fx != NULL ) && ( HrtfFastConv->rightHRIRReal_FOA_fx != NULL ) && ( HrtfFastConv->rightHRIRImag_FOA_fx != NULL ) ) - { - return IVAS_ERR_OK; - } - ELSE - { - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->leftHRIRReal_FOA_fx, BINAURAL_CONVBANDS, FOA_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRReal_FOA" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->leftHRIRImag_FOA_fx, BINAURAL_CONVBANDS, FOA_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRImag_FOA" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->rightHRIRReal_FOA_fx, BINAURAL_CONVBANDS, FOA_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRReal_FOA" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->rightHRIRImag_FOA_fx, BINAURAL_CONVBANDS, FOA_CHANNELS, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRImag_FOA" ); - } - } + return IVAS_ERR_OK; } - - test(); - IF( EQ_32( renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( bin_input_config, BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) ) + ELSE { - test(); - test(); - test(); - IF( ( HrtfFastConv->leftHRIRReal_fx != NULL ) && ( HrtfFastConv->leftHRIRImag_fx != NULL ) && ( HrtfFastConv->rightHRIRReal_fx != NULL ) && ( HrtfFastConv->rightHRIRImag_fx != NULL ) ) + IF( IVAS_ERR_OK != ivas_alloc_pppMem_fx( &HrtfFastConv->leftReal_fx, BINAURAL_CONVBANDS, n_channels, HrtfFastConv->ntaps, allocate_init_flag ) ) { - return IVAS_ERR_OK; + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HrtfFastConv->leftReal" ); } - ELSE + IF( IVAS_ERR_OK != ivas_alloc_pppMem_fx( &HrtfFastConv->leftImag_fx, BINAURAL_CONVBANDS, n_channels, HrtfFastConv->ntaps, allocate_init_flag ) ) { - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->leftHRIRReal_fx, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRReal" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->leftHRIRImag_fx, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRImag" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->rightHRIRReal_fx, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRReal" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->rightHRIRImag_fx, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRImag" ); - } + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HrtfFastConv->leftImag" ); } - } - - test(); - IF( EQ_32( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_32( bin_input_config, BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) ) - { - test(); - test(); - test(); - IF( ( HrtfFastConv->leftBRIRReal_fx != NULL ) && ( HrtfFastConv->leftBRIRImag_fx != NULL ) && ( HrtfFastConv->rightBRIRReal_fx != NULL ) && ( HrtfFastConv->rightBRIRImag_fx != NULL ) ) + IF( IVAS_ERR_OK != ivas_alloc_pppMem_fx( &HrtfFastConv->rightReal_fx, BINAURAL_CONVBANDS, n_channels, HrtfFastConv->ntaps, allocate_init_flag ) ) { - return IVAS_ERR_OK; + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HrtfFastConv->rightReal" ); } - ELSE + IF( IVAS_ERR_OK != ivas_alloc_pppMem_fx( &HrtfFastConv->rightImag_fx, BINAURAL_CONVBANDS, n_channels, HrtfFastConv->ntaps, allocate_init_flag ) ) { - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->leftBRIRReal_fx, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS_MAX, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftBRIRReal" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->leftBRIRImag_fx, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS_MAX, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftBRIRImag" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->rightBRIRReal_fx, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS_MAX, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightBRIRReal" ); - } - IF( NE_32( IVAS_ERR_OK, ivas_alloc_pppMem_fx( &HrtfFastConv->rightBRIRImag_fx, BINAURAL_CONVBANDS, HRTF_LS_CHANNELS, BINAURAL_NTAPS_MAX, allocate_init_flag ) ) ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightBRIRImag" ); - } + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HrtfFastConv->rightImag" ); } } return IVAS_ERR_OK; } + /*-------------------------------------------------------------------------* - * ivas_binaural_HRTF_open() + * ivas_binaural_hrtf_open() * * *-------------------------------------------------------------------------*/ + static ivas_error ivas_binaural_hrtf_open_fx( HRTFS_FASTCONV_HANDLE *hHrtfFastConv, /* i : fastconv HRTF handle */ const AUDIO_CONFIG input_config, /* i : output configuration */ @@ -792,6 +595,7 @@ static ivas_error ivas_binaural_hrtf_open_fx( { Word16 i, j; ivas_error error; + Word16 n_channels; test(); IF( hHrtfFastConv != NULL && *hHrtfFastConv != NULL ) @@ -814,112 +618,193 @@ static ivas_error ivas_binaural_hrtf_open_fx( test(); IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( renderer_type, RENDERER_BINAURAL_FASTCONV ) ) { - HrtfFastConv->FASTCONV_HRIR_latency_s_fx = FASTCONV_HRIR_latency_s_fx; + HrtfFastConv->FASTCONV_latency_s_fx = FASTCONV_HRIR_latency_s_fx; move32(); + HrtfFastConv->FASTCONV_latency_s_Q_fx = Q31 - FASTCONV_factor_Q_HRIR_latency_s_fx; + move16(); + HrtfFastConv->FASTCONV_taps_s_Q_fx = Q15 - FASTCONV_factor_Q_HRIR_fx; + move16(); + HrtfFastConv->ntaps = BINAURAL_NTAPS; + move16(); } - if ( EQ_32( input_config, IVAS_AUDIO_CONFIG_HOA2 ) ) + + IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_HOA2 ) ) { - HrtfFastConv->FASTCONV_HOA2_latency_s_fx = FASTCONV_HOA2_latency_s_fx; + HrtfFastConv->FASTCONV_latency_s_fx = FASTCONV_HOA2_latency_s_fx; move32(); + HrtfFastConv->FASTCONV_latency_s_Q_fx = Q31 - FASTCONV_factor_Q_HOA2_latency_s_fx; + move16(); + HrtfFastConv->FASTCONV_taps_s_Q_fx = Q15 - FASTCONV_factor_Q_HOA2_fx; + move16(); + HrtfFastConv->ntaps = BINAURAL_NTAPS_SBA; + move16(); } - if ( EQ_32( input_config, IVAS_AUDIO_CONFIG_HOA3 ) ) + IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_HOA3 ) ) { - HrtfFastConv->FASTCONV_HOA3_latency_s_fx = FASTCONV_HOA3_latency_s_fx; + HrtfFastConv->FASTCONV_latency_s_fx = FASTCONV_HOA3_latency_s_fx; move32(); + HrtfFastConv->FASTCONV_latency_s_Q_fx = Q31 - FASTCONV_factor_Q_HOA3_latency_s_fx; + move16(); + HrtfFastConv->FASTCONV_taps_s_Q_fx = Q15 - FASTCONV_factor_Q_HOA3_fx; + move16(); + HrtfFastConv->ntaps = BINAURAL_NTAPS_SBA; + move16(); } - if ( EQ_32( input_config, IVAS_AUDIO_CONFIG_FOA ) ) + IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_FOA ) ) { - HrtfFastConv->FASTCONV_FOA_latency_s_fx = FASTCONV_FOA_latency_s_fx; + HrtfFastConv->FASTCONV_latency_s_fx = FASTCONV_FOA_latency_s_fx; move32(); + HrtfFastConv->FASTCONV_latency_s_Q_fx = Q31 - FASTCONV_factor_Q_FOA_latency_s_fx; + move16(); + HrtfFastConv->FASTCONV_taps_s_Q_fx = Q15 - FASTCONV_factor_Q_FOA_fx; + move16(); + HrtfFastConv->ntaps = BINAURAL_NTAPS_SBA; + move16(); } + test(); IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { - HrtfFastConv->FASTCONV_BRIR_latency_s_fx = FASTCONV_BRIR_latency_s_fx; + HrtfFastConv->FASTCONV_latency_s_fx = FASTCONV_BRIR_latency_s_fx; move32(); + HrtfFastConv->FASTCONV_latency_s_Q_fx = Q31 - FASTCONV_factor_Q_BRIR_latency_s_fx; + move16(); + HrtfFastConv->FASTCONV_taps_s_Q_fx = Q15 - FASTCONV_factor_Q_BRIR_fx; + move16(); + HrtfFastConv->FASTCONV_reverbTime_s_Q_fx = Q15 - FASTCONV_factor_Q_reverberationTimes_fx; + move16(); + HrtfFastConv->FASTCONV_reverbEne_s_Q_fx = Q15 - FASTCONV_factor_Q_reverberationEneCorrections_fx; + move16(); + HrtfFastConv->ntaps = BINAURAL_NTAPS_MAX; + move16(); } - HrtfFastConv->allocate_init_flag = 1; + HrtfFastConv->allocate_init_flag = 0; + move16(); + + n_channels = 0; move16(); - IF( NE_32( ( error = ivas_allocate_binaural_hrtf_fx( HrtfFastConv, input_config, BINAURAL_INPUT_AUDIO_CONFIG_INVALID, renderer_type, HrtfFastConv->allocate_init_flag ) ), IVAS_ERR_OK ) ) + test(); + test(); + IF( ( EQ_32( renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) && NE_32( input_config, IVAS_AUDIO_CONFIG_INVALID ) ) + { + n_channels = HRTF_LS_CHANNELS; + move16(); + } + + IF( EQ_32( renderer_type, RENDERER_BINAURAL_FASTCONV ) ) + { + IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_HOA3 ) ) + { + n_channels = HOA3_CHANNELS; + move16(); + } + ELSE IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_HOA2 ) ) + { + n_channels = HOA2_CHANNELS; + move16(); + } + ELSE IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_FOA ) ) + { + n_channels = FOA_CHANNELS; + move16(); + } + } + + IF( NE_32( ( error = ivas_allocate_binaural_hrtf_fx( HrtfFastConv, n_channels, HrtfFastConv->allocate_init_flag ) ), IVAS_ERR_OK ) ) { return error; } + FOR( i = 0; i < BINAURAL_CONVBANDS; i++ ) { - IF( EQ_32( renderer_type, RENDERER_BINAURAL_FASTCONV ) ) + test(); + test(); + IF( EQ_32( renderer_type, RENDERER_BINAURAL_FASTCONV ) && EQ_32( HrtfFastConv->n_channels, HRTF_LS_CHANNELS ) ) { FOR( j = 0; j < HRTF_LS_CHANNELS; j++ ) { - HrtfFastConv->leftHRIRReal_fx[i][j] = leftHRIRReal_fx[i][j]; - HrtfFastConv->leftHRIRImag_fx[i][j] = leftHRIRImag_fx[i][j]; - HrtfFastConv->rightHRIRReal_fx[i][j] = rightHRIRReal_fx[i][j]; - HrtfFastConv->rightHRIRImag_fx[i][j] = rightHRIRImag_fx[i][j]; + Copy_Scale_sig_16_32_r( leftHRIRReal_fx[i][j], HrtfFastConv->leftReal_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_HRIR_fx ); + Copy_Scale_sig_16_32_r( leftHRIRImag_fx[i][j], HrtfFastConv->leftImag_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_HRIR_fx ); + Copy_Scale_sig_16_32_r( rightHRIRReal_fx[i][j], HrtfFastConv->rightReal_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_HRIR_fx ); + Copy_Scale_sig_16_32_r( rightHRIRImag_fx[i][j], HrtfFastConv->rightImag_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_HRIR_fx ); } } - ELSE IF( EQ_32( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + ELSE IF( EQ_32( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) && EQ_32( HrtfFastConv->n_channels, HRTF_LS_CHANNELS ) ) { FOR( j = 0; j < HRTF_LS_CHANNELS; j++ ) { - HrtfFastConv->leftBRIRReal_fx[i][j] = leftBRIRReal_fx[i][j]; - HrtfFastConv->leftBRIRImag_fx[i][j] = leftBRIRImag_fx[i][j]; - HrtfFastConv->rightBRIRReal_fx[i][j] = rightBRIRReal_fx[i][j]; - HrtfFastConv->rightBRIRImag_fx[i][j] = rightBRIRImag_fx[i][j]; + Copy_Scale_sig_16_32_r( leftBRIRReal_fx[i][j], HrtfFastConv->leftReal_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_BRIR_fx ); + Copy_Scale_sig_16_32_r( leftBRIRImag_fx[i][j], HrtfFastConv->leftImag_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_BRIR_fx ); + Copy_Scale_sig_16_32_r( rightBRIRReal_fx[i][j], HrtfFastConv->rightReal_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_BRIR_fx ); + Copy_Scale_sig_16_32_r( rightBRIRImag_fx[i][j], HrtfFastConv->rightImag_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_BRIR_fx ); } } - IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_HOA3 ) ) + + test(); + IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_HOA3 ) && EQ_32( HrtfFastConv->n_channels, HOA3_CHANNELS ) ) { FOR( j = 0; j < HOA3_CHANNELS; j++ ) { - HrtfFastConv->leftHRIRReal_HOA3_fx[i][j] = leftHRIRReal_HOA3_fx[i][j]; - HrtfFastConv->leftHRIRImag_HOA3_fx[i][j] = leftHRIRImag_HOA3_fx[i][j]; - HrtfFastConv->rightHRIRReal_HOA3_fx[i][j] = rightHRIRReal_HOA3_fx[i][j]; - HrtfFastConv->rightHRIRImag_HOA3_fx[i][j] = rightHRIRImag_HOA3_fx[i][j]; + Copy_Scale_sig_16_32_r( leftHRIRReal_HOA3_fx[i][j], HrtfFastConv->leftReal_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_HOA3_fx ); + Copy_Scale_sig_16_32_r( leftHRIRImag_HOA3_fx[i][j], HrtfFastConv->leftImag_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_HOA3_fx ); + Copy_Scale_sig_16_32_r( rightHRIRReal_HOA3_fx[i][j], HrtfFastConv->rightReal_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_HOA3_fx ); + Copy_Scale_sig_16_32_r( rightHRIRImag_HOA3_fx[i][j], HrtfFastConv->rightImag_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_HOA3_fx ); } } - IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_HOA2 ) ) + + /* Note: IVAS_AUDIO_CONFIG_HOA2 and IVAS_AUDIO_CONFIG_FOA input configs. are not relevant in internal renderer + as SBA to binaural always synthesizes HOA3 output for binauralization. However, the external renderer can use them. */ + test(); + IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_HOA2 ) && EQ_32( HrtfFastConv->n_channels, HOA2_CHANNELS ) ) { FOR( j = 0; j < HOA2_CHANNELS; j++ ) { - HrtfFastConv->leftHRIRReal_HOA2_fx[i][j] = leftHRIRReal_HOA2_fx[i][j]; - HrtfFastConv->leftHRIRImag_HOA2_fx[i][j] = leftHRIRImag_HOA2_fx[i][j]; - HrtfFastConv->rightHRIRReal_HOA2_fx[i][j] = rightHRIRReal_HOA2_fx[i][j]; - HrtfFastConv->rightHRIRImag_HOA2_fx[i][j] = rightHRIRImag_HOA2_fx[i][j]; + Copy_Scale_sig_16_32_r( leftHRIRReal_HOA2_fx[i][j], HrtfFastConv->leftReal_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_HOA2_fx ); + Copy_Scale_sig_16_32_r( leftHRIRImag_HOA2_fx[i][j], HrtfFastConv->leftImag_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_HOA2_fx ); + Copy_Scale_sig_16_32_r( rightHRIRReal_HOA2_fx[i][j], HrtfFastConv->rightReal_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_HOA2_fx ); + Copy_Scale_sig_16_32_r( rightHRIRImag_HOA2_fx[i][j], HrtfFastConv->rightImag_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_HOA2_fx ); } } - IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_FOA ) ) + + test(); + IF( EQ_32( input_config, IVAS_AUDIO_CONFIG_FOA ) && EQ_32( HrtfFastConv->n_channels, FOA_CHANNELS ) ) { FOR( j = 0; j < FOA_CHANNELS; j++ ) { - HrtfFastConv->leftHRIRReal_FOA_fx[i][j] = leftHRIRReal_FOA_fx[i][j]; - HrtfFastConv->leftHRIRImag_FOA_fx[i][j] = leftHRIRImag_FOA_fx[i][j]; - HrtfFastConv->rightHRIRReal_FOA_fx[i][j] = rightHRIRReal_FOA_fx[i][j]; - HrtfFastConv->rightHRIRImag_FOA_fx[i][j] = rightHRIRImag_FOA_fx[i][j]; + Copy_Scale_sig_16_32_r( leftHRIRReal_FOA_fx[i][j], HrtfFastConv->leftReal_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_FOA_fx ); + Copy_Scale_sig_16_32_r( leftHRIRImag_FOA_fx[i][j], HrtfFastConv->leftImag_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_FOA_fx ); + Copy_Scale_sig_16_32_r( rightHRIRReal_FOA_fx[i][j], HrtfFastConv->rightReal_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_FOA_fx ); + Copy_Scale_sig_16_32_r( rightHRIRImag_FOA_fx[i][j], HrtfFastConv->rightImag_fx[i][j], HrtfFastConv->ntaps, Q29 - FASTCONV_factor_Q_FOA_fx ); } } } - Copy32( fastconvReverberationTimes_fx, HrtfFastConv->fastconvReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX ); - Copy32( fastconvReverberationEneCorrections_fx, HrtfFastConv->fastconvReverberationEneCorrections_fx, CLDFB_NO_CHANNELS_MAX ); + + Copy_Scale_sig_16_32_r( fastconvReverberationTimes_fx, HrtfFastConv->fastconvReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX, Q26 - FASTCONV_factor_Q_reverberationTimes_fx ); + Copy_Scale_sig_16_32_r( fastconvReverberationEneCorrections_fx, HrtfFastConv->fastconvReverberationEneCorrections_fx, CLDFB_NO_CHANNELS_MAX, Q31 - FASTCONV_factor_Q_reverberationTimes_fx ); *hHrtfFastConv = HrtfFastConv; - } - return IVAS_ERR_OK; + return IVAS_ERR_OK; + } } + + /*-------------------------------------------------------------------------* - * ivas_binaural_obtain_DMX_fx() + * ivas_binaural_obtain_DMX() * * *-------------------------------------------------------------------------*/ static void ivas_binaural_obtain_DMX_fx( const Word16 numTimeSlots, - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ - Word32 RealBuffer[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals Q_in */ - Word32 ImagBuffer[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals Q_in */ - Word32 realDMX[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /*Q_in-1*/ - Word32 imagDMX[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] ) /*Q_in-1*/ + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ + Word32 RealBuffer[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals Q_in_out */ + Word32 ImagBuffer[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals Q_in_out */ + Word32 realDMX[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* Q_in_out */ + Word32 imagDMX[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* Q_in_out */ + Word16 *Q_in_out ) /* i/o: input and output Q */ { Word16 chIdx, bandIdx, k; @@ -947,126 +832,260 @@ static void ivas_binaural_obtain_DMX_fx( FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { - Word32 dmxConst = hBinRenderer->hReverb->dmxmtx_fx[chOutIdx][chIdx]; - move32(); + Word32 dmxConst = dmxmtx_table_fx[chOutIdx][chIdx]; FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { FOR( k = 0; k < numTimeSlots; k++ ) { - temp1_fx = Mpy_32_32( RealBuffer[chIdx][k][bandIdx], dmxConst ); // Q_in - temp2_fx = Mpy_32_32( ImagBuffer[chIdx][k][bandIdx], dmxConst ); // Q_in - realDMX[chOutIdx][k][bandIdx] = L_add( realDMX[chOutIdx][k][bandIdx], temp1_fx ); // Q_in + temp1_fx = Mpy_32_32( RealBuffer[chIdx][k][bandIdx], dmxConst ); // Q_in_out + temp2_fx = Mpy_32_32( ImagBuffer[chIdx][k][bandIdx], dmxConst ); // Q_in_out + realDMX[chOutIdx][k][bandIdx] = L_add( realDMX[chOutIdx][k][bandIdx], temp1_fx ); // Q_in_out + move32(); + imagDMX[chOutIdx][k][bandIdx] = L_add( imagDMX[chOutIdx][k][bandIdx], temp2_fx ); // Q_in_out move32(); - imagDMX[chOutIdx][k][bandIdx] = L_add( imagDMX[chOutIdx][k][bandIdx], temp2_fx ); // Q_in + P_in_fx[bandIdx] = L_add( P_in_fx[bandIdx], L_add( Mpy_32_32( temp1_fx, temp1_fx ), Mpy_32_32( temp2_fx, temp2_fx ) ) ); // Q31-2*Q_in_out move32(); + } + } + } + + FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + P_out_fx = 0; + move32(); + FOR( k = 0; k < numTimeSlots; k++ ) + { + temp1_fx = realDMX[chOutIdx][k][bandIdx]; + move32(); + temp2_fx = imagDMX[chOutIdx][k][bandIdx]; + move32(); + P_out_fx = L_add( P_out_fx, L_add( Mpy_32_32( temp1_fx, temp1_fx ), Mpy_32_32( temp2_fx, temp2_fx ) ) ); // Q31-2*Q_in_out + } + test(); + IF( ( P_in_fx[bandIdx] <= 0 ) || ( P_out_fx <= 0 ) ) + { + factEQ_fx = 0x40000000; // 1.0f in Q30 + move32(); + } + ELSE + { + Word16 div = divide3232( P_in_fx[bandIdx], P_out_fx ); + Word16 exp = 16; // divide3232 returns Q15 + factEQ_fx = Sqrt32( div, &exp ); + factEQ_fx = L_shl( factEQ_fx, sub( exp, 1 ) ); // Q30 + } + if ( factEQ_fx <= 0 ) + { + factEQ_fx = 0x40000000; // 1.0f in Q30 + move32(); + } + + factEQ_fx = L_max( L_min( factEQ_fx, 0x7fffffff ), 0x20000000 ); // Q30 , 0x7fffffff -> (1.0f in Q31)-1, 0x20000000 ->1.0f in Q29 + FOR( k = 0; k < numTimeSlots; k++ ) + { + realDMX[chOutIdx][k][bandIdx] = Mpy_32_32( realDMX[chOutIdx][k][bandIdx], factEQ_fx ); // Q_in_out - 1 + move32(); + imagDMX[chOutIdx][k][bandIdx] = Mpy_32_32( imagDMX[chOutIdx][k][bandIdx], factEQ_fx ); // Q_in_out - 1 + move32(); + } + } + } + *Q_in_out = sub( *Q_in_out, 1 ); + } + ELSE IF( EQ_32( hBinRenderer->ivas_format, SBA_FORMAT ) || EQ_32( hBinRenderer->ivas_format, MASA_FORMAT ) ) + { + Word32 *outRealLeftPtr_fx, *outImagLeftPtr_fx, *outRealRightPtr_fx, *outImagRightPtr_fx; + Word32 *inRealPtr_fx, *inImagPtr_fx; + + /*compute DMX */ + FOR( k = 0; k < numTimeSlots; k++ ) + { + outRealLeftPtr_fx = realDMX[0][k]; + outImagLeftPtr_fx = imagDMX[0][k]; + outRealRightPtr_fx = realDMX[1][k]; + outImagRightPtr_fx = imagDMX[1][k]; + set32_fx( outRealLeftPtr_fx, 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( outImagLeftPtr_fx, 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( outRealRightPtr_fx, 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( outImagRightPtr_fx, 0, CLDFB_NO_CHANNELS_MAX ); + + /*Ambisonics input requires different processing*/ + IF( EQ_16( hBinRenderer->nInChannels, HOA3_CHANNELS ) ) + { + Word32 *inRealPtr_W, *inImagPtr_W; + Word32 *inRealPtr_Y, *inImagPtr_Y; + + inRealPtr_W = (Word32 *) &( RealBuffer[0][k][0] ); + inImagPtr_W = (Word32 *) &( ImagBuffer[0][k][0] ); + + inRealPtr_Y = (Word32 *) &( RealBuffer[1][k][0] ); + inImagPtr_Y = (Word32 *) &( ImagBuffer[1][k][0] ); + + FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + outRealLeftPtr_fx[bandIdx] = L_add( inRealPtr_W[bandIdx], inRealPtr_Y[bandIdx] ); + outImagLeftPtr_fx[bandIdx] = L_add( inImagPtr_W[bandIdx], inImagPtr_Y[bandIdx] ); + + outRealRightPtr_fx[bandIdx] = L_sub( inRealPtr_W[bandIdx], inRealPtr_Y[bandIdx] ); + outImagRightPtr_fx[bandIdx] = L_sub( inImagPtr_W[bandIdx], inImagPtr_Y[bandIdx] ); + } + } + ELSE + { + FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + { + Word32 foa_const_fx = L_shl( hBinRenderer->hReverb->foa_enc_fx[chIdx][1], 1 ); // Q30 + Word32 one_add_foa_const, one_sub_foa_const; + + one_add_foa_const = L_add( ONE_IN_Q30, foa_const_fx ); // Q30 + one_sub_foa_const = L_sub_sat( ONE_IN_Q30, foa_const_fx ); // Q30 + + inRealPtr_fx = (Word32 *) &( RealBuffer[chIdx][k][0] ); + inImagPtr_fx = (Word32 *) &( ImagBuffer[chIdx][k][0] ); + + FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + outRealLeftPtr_fx[bandIdx] = L_add( outRealLeftPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], one_add_foa_const ) ); // Q_in - 1 + move32(); + outImagLeftPtr_fx[bandIdx] = L_add( outImagLeftPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], one_add_foa_const ) ); // Q_in - 1 + move32(); + + outRealRightPtr_fx[bandIdx] = L_add( outRealRightPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], one_sub_foa_const ) ); // Q_in - 1 + move32(); + outImagRightPtr_fx[bandIdx] = L_add( outImagRightPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], one_sub_foa_const ) ); // Q_in - 1 + move32(); + } + } + } + } + + IF( NE_16( hBinRenderer->nInChannels, HOA3_CHANNELS ) ) + { + *Q_in_out = sub( *Q_in_out, 1 ); + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_rend_openCldfbRend() + * + * Allocate and initialize CLDFB fast conv renderer handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_rend_openCldfbRend( + CLDFB_REND_WRAPPER *pCldfbRend, + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig, + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const Word32 output_Fs ) +{ + BINAURAL_RENDERER_HANDLE hBinRenderer; + Word16 convBand; + ivas_error error; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + IF( ( hBinRenderer = (BINAURAL_RENDERER_HANDLE) malloc( sizeof( BINAURAL_RENDERER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Renderer\n" ) ); + } + + IF( ( hBinRenderer->hInputSetup = (IVAS_OUTPUT_SETUP_HANDLE) malloc( sizeof( IVAS_OUTPUT_SETUP ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for output setup Binaural Renderer\n" ) ); + } + + hBinRenderer->rotInCldfb = 1; + hBinRenderer->ivas_format = SBA_FORMAT; + + hBinRenderer->max_band = extract_l( Mpy_32_32( Mpy_32_32( BINAURAL_MAXBANDS_Q25, L_shl( output_Fs, Q6 ) ), ONE_BY_48000_Q31 ) ); + move16(); + + convBand = hBinRenderer->max_band; + move16(); + + hBinRenderer->timeSlots = MAX_PARAM_SPATIAL_SUBFRAMES; /* Corresponds to 5 msec sound to motion latency */ + move16(); + + IF( GT_16( convBand, BINAURAL_CONVBANDS ) ) + { + hBinRenderer->conv_band = BINAURAL_CONVBANDS; + move16(); + } + ELSE + { + hBinRenderer->conv_band = convBand; + move16(); + } - P_in_fx[bandIdx] = L_add( P_in_fx[bandIdx], L_add( Mpy_32_32( temp1_fx, temp1_fx ), Mpy_32_32( temp2_fx, temp2_fx ) ) ); // Q31-2*Q_in - move32(); - } - } - } + ivas_output_init( hBinRenderer->hInputSetup, inConfig ); - FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) - { - P_out_fx = 0; - move32(); - FOR( k = 0; k < numTimeSlots; k++ ) - { - temp1_fx = realDMX[chOutIdx][k][bandIdx]; - move32(); - temp2_fx = imagDMX[chOutIdx][k][bandIdx]; - move32(); - P_out_fx = L_add( P_out_fx, L_add( Mpy_32_32( temp1_fx, temp1_fx ), Mpy_32_32( temp2_fx, temp2_fx ) ) ); // Q31-2*Q_in - } - test(); - IF( ( P_in_fx[bandIdx] <= 0 ) || ( P_out_fx <= 0 ) ) - { - factEQ_fx = 0x40000000; // 1.0f in Q30 - move32(); - } - ELSE - { - Word16 div = divide3232( P_in_fx[bandIdx], P_out_fx ); - Word16 exp = norm_l( div ); - factEQ_fx = Sqrt32( L_shl( div, Q16 ), &exp ); - factEQ_fx = L_shl( factEQ_fx, sub( exp, 1 ) ); // Q30 - } - if ( factEQ_fx <= 0 ) - { - factEQ_fx = 0x40000000; // 1.0f in Q30 - move32(); - } + IF( ( error = getAudioConfigNumChannels( inConfig, &hBinRenderer->hInputSetup->nchan_out_woLFE ) ) != IVAS_ERR_OK ) + { + return error; + } - factEQ_fx = L_max( L_min( factEQ_fx, 0x7fffffff ), 0x20000000 ); // Q30 , 0x7fffffff -> (1.0f in Q31)-1, 0x20000000 ->1.0f in Q29 - FOR( k = 0; k < numTimeSlots; k++ ) - { - realDMX[chOutIdx][k][bandIdx] = Mpy_32_32( realDMX[chOutIdx][k][bandIdx], factEQ_fx ); // Q_in - 1 - move32(); - imagDMX[chOutIdx][k][bandIdx] = Mpy_32_32( imagDMX[chOutIdx][k][bandIdx], factEQ_fx ); // Q_in - 1 - move32(); - } - } - } + IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + hBinRenderer->numPoses = pMultiBinPoseData->num_poses; + move16(); } - ELSE IF( EQ_32( hBinRenderer->ivas_format, SBA_FORMAT ) || EQ_32( hBinRenderer->ivas_format, MASA_FORMAT ) ) + ELSE { - Word32 *outRealLeftPtr_fx, *outImagLeftPtr_fx, *outRealRightPtr_fx, *outImagRightPtr_fx; - Word32 *inRealPtr_fx, *inImagPtr_fx; - - /*compute DMX */ - FOR( k = 0; k < numTimeSlots; k++ ) - { - outRealLeftPtr_fx = realDMX[0][k]; - outImagLeftPtr_fx = imagDMX[0][k]; - outRealRightPtr_fx = realDMX[1][k]; - outImagRightPtr_fx = imagDMX[1][k]; - set32_fx( outRealLeftPtr_fx, 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( outImagLeftPtr_fx, 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( outRealRightPtr_fx, 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( outImagRightPtr_fx, 0, CLDFB_NO_CHANNELS_MAX ); + hBinRenderer->numPoses = 1; + move16(); + } - FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) - { - Word32 foa_const_fx = L_shl( hBinRenderer->hReverb->foa_enc_fx[chIdx][1], 1 ); // Q30 + /*LFE rendering switched off by default*/ + hBinRenderer->render_lfe = 0; + move16(); - inRealPtr_fx = (Word32 *) &( RealBuffer[chIdx][k][0] ); - inImagPtr_fx = (Word32 *) &( ImagBuffer[chIdx][k][0] ); - FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) - { - outRealLeftPtr_fx[bandIdx] = L_add( outRealLeftPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], L_add( ONE_IN_Q30, foa_const_fx ) ) ); // Q_in - 1 - move32(); - outImagLeftPtr_fx[bandIdx] = L_add( outImagLeftPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], L_add( ONE_IN_Q30, foa_const_fx ) ) ); // Q_in - 1 - move32(); + /* Load HRTF tables */ + IF( NE_32( ( error = ivas_binaural_hrtf_open_fx( &pCldfbRend->hHrtfFastConv, hBinRenderer->hInputSetup->output_config, RENDERER_BINAURAL_FASTCONV ) ), IVAS_ERR_OK ) ) + { + return error; + } - outRealRightPtr_fx[bandIdx] = L_add( outRealRightPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], L_sub( ONE_IN_Q30, foa_const_fx ) ) ); // Q_in - 1 - move32(); - outImagRightPtr_fx[bandIdx] = L_add( outImagRightPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], L_sub( ONE_IN_Q30, foa_const_fx ) ) ); // Q_in - 1 - move32(); - } - } - } + /* Allocate memories and buffers needed for convolutional module in CICP19 */ + IF( NE_32( ( error = ivas_binRenderer_convModuleOpen( hBinRenderer, RENDERER_BINAURAL_FASTCONV, hBinRenderer->hInputSetup->is_loudspeaker_setup, inConfig, pCldfbRend->hHrtfFastConv, hBinRenderer->numPoses ) ), IVAS_ERR_OK ) ) + { + return error; } - return; + pCldfbRend->binaural_latency_ns = L_shr_r( Mpy_32_32_r( pCldfbRend->hHrtfFastConv->FASTCONV_latency_s_fx, (Word32) 1000000000 ), pCldfbRend->hHrtfFastConv->FASTCONV_latency_s_Q_fx ); + move32(); + hBinRenderer->hReverb = NULL; + move32(); + hBinRenderer->hEFAPdata = NULL; + move32(); + pCldfbRend->hCldfbRend = hBinRenderer; + move32(); + + return IVAS_ERR_OK; } + /*------------------------------------------------------------------------- * ivas_binRenderer_open() * * Open fastconv binaural renderer handle *-------------------------------------------------------------------------*/ + ivas_error ivas_binRenderer_open_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { BINAURAL_RENDERER_HANDLE hBinRenderer; - Word16 convBand, chIdx, k; + Word16 convBand, k; ivas_error error; - - error = IVAS_ERR_OK; - move32(); + const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pRoomAcoustics; /*-----------------------------------------------------------------* * prepare library opening @@ -1082,13 +1101,25 @@ ivas_error ivas_binRenderer_open_fx( /* Define of head rotation has to be done in binRendeder in CLDFB*/ hBinRenderer->rotInCldfb = 0; move16(); + + test(); test(); - if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) + IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { hBinRenderer->rotInCldfb = 1; move16(); } + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + hBinRenderer->numPoses = st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; + move16(); + } + ELSE + { + hBinRenderer->numPoses = 1; + move16(); + } /* Declare some common variables needed for renderer */ /* Which format used for binaural rendering (needed for late reverb) ? MC or SBA */ @@ -1133,6 +1164,12 @@ ivas_error ivas_binRenderer_open_fx( move16(); } + test(); + IF( st_ivas->hHrtfFastConv == NULL && st_ivas->hDecoderConfig->Opt_HRTF_binary ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "HRTF binary file present but not used in FastConv renderer" ); + } + /* Load HRTF tables */ IF( NE_32( ( error = ivas_binaural_hrtf_open_fx( &st_ivas->hHrtfFastConv, st_ivas->hIntSetup.output_config, st_ivas->renderer_type ) ), IVAS_ERR_OK ) ) { @@ -1145,11 +1182,10 @@ ivas_error ivas_binRenderer_open_fx( IVAS_OUTPUT_SETUP out_setup; /* Allocate memories and buffers needed for convolutional module in CICP19 */ - IF( NE_32( ( error = ivas_binRenderer_convModuleOpen( hBinRenderer, st_ivas->renderer_type, 1, IVAS_AUDIO_CONFIG_7_1_4, st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_binRenderer_convModuleOpen( hBinRenderer, st_ivas->renderer_type, 1, IVAS_AUDIO_CONFIG_7_1_4, st_ivas->hHrtfFastConv, hBinRenderer->numPoses ) ), IVAS_ERR_OK ) ) { return error; } - ivas_output_init( &out_setup, IVAS_AUDIO_CONFIG_7_1_4 ); IF( st_ivas->hoa_dec_mtx == NULL ) @@ -1161,72 +1197,33 @@ ivas_error ivas_binRenderer_open_fx( } hBinRenderer->hoa_dec_mtx = st_ivas->hoa_dec_mtx; - st_ivas->binaural_latency_ns = st_ivas->hHrtfFastConv->FASTCONV_BRIR_latency_s_fx; move32(); + st_ivas->binaural_latency_ns = L_shr_r( Mpy_32_32_r( st_ivas->hHrtfFastConv->FASTCONV_latency_s_fx, (Word32) 1000000000 ), st_ivas->hHrtfFastConv->FASTCONV_latency_s_Q_fx ); } ELSE { /* Allocate memories and buffers needed for convolutional module */ - IF( NE_32( ( error = ivas_binRenderer_convModuleOpen( hBinRenderer, st_ivas->renderer_type, st_ivas->hIntSetup.is_loudspeaker_setup, st_ivas->hIntSetup.output_config, st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_binRenderer_convModuleOpen( hBinRenderer, st_ivas->renderer_type, st_ivas->hIntSetup.is_loudspeaker_setup, st_ivas->hIntSetup.output_config, st_ivas->hHrtfFastConv, hBinRenderer->numPoses ) ), IVAS_ERR_OK ) ) { return error; } - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) - { - IF( EQ_32( hBinRenderer->ivas_format, MC_FORMAT ) ) - { - st_ivas->binaural_latency_ns = st_ivas->hHrtfFastConv->FASTCONV_HRIR_latency_s_fx; - move32(); - } - ELSE - { - IF( EQ_16( hBinRenderer->nInChannels, 16 ) ) - { - st_ivas->binaural_latency_ns = st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s_fx; - move32(); - } - ELSE IF( EQ_16( hBinRenderer->nInChannels, 9 ) ) - { - st_ivas->binaural_latency_ns = st_ivas->hHrtfFastConv->FASTCONV_HOA2_latency_s_fx; - move32(); - } - ELSE IF( EQ_16( hBinRenderer->nInChannels, 4 ) ) - { - st_ivas->binaural_latency_ns = st_ivas->hHrtfFastConv->FASTCONV_FOA_latency_s_fx; - move32(); - } - ELSE - { - return IVAS_ERR_INVALID_INPUT_FORMAT; - } - } - } - ELSE - { - /* same value for MC or HOA both use MC BRIR*/ - st_ivas->binaural_latency_ns = st_ivas->hHrtfFastConv->FASTCONV_BRIR_latency_s_fx; - move32(); - } + st_ivas->binaural_latency_ns = L_shr_r( Mpy_32_32_r( st_ivas->hHrtfFastConv->FASTCONV_latency_s_fx, (Word32) 1000000000 ), st_ivas->hHrtfFastConv->FASTCONV_latency_s_Q_fx ); } /* Allocate memories needed for reverb module */ test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) && EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) { - IF( NE_32( ( error = ivas_binaural_reverb_open_fastconv_fx( &( hBinRenderer->hReverb ), hBinRenderer->conv_band, hBinRenderer->timeSlots, &( st_ivas->hRenderConfig->roomAcoustics ), st_ivas->hIntSetup.output_config, st_ivas->hDecoderConfig->output_Fs, st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) + pRoomAcoustics = NULL; + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { - return error; + pRoomAcoustics = &( st_ivas->hRenderConfig->roomAcoustics ); } - /* initialize the dmx matrix */ - FOR( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + IF( NE_32( ( error = ivas_binaural_reverb_init_fx( &( hBinRenderer->hReverb ), st_ivas->hHrtfStatistics, hBinRenderer->conv_band, hBinRenderer->timeSlots, pRoomAcoustics, st_ivas->hDecoderConfig->output_Fs, st_ivas->hHrtfFastConv->fastconvReverberationTimes_fx, st_ivas->hHrtfFastConv->fastconvReverberationEneCorrections_fx, NULL ) ), IVAS_ERR_OK ) ) { - FOR( k = 0; k < hBinRenderer->nInChannels; k++ ) - { - hBinRenderer->hReverb->dmxmtx_fx[chIdx][k] = dmxmtx_table_fx[chIdx][k]; - move32(); - } + return error; } } ELSE @@ -1236,8 +1233,9 @@ ivas_error ivas_binRenderer_open_fx( hBinRenderer->hEFAPdata = NULL; - IF( hBinRenderer->hReverb != NULL ) + IF( hBinRenderer->hReverb != NULL && NE_16( hBinRenderer->nInChannels, HOA3_CHANNELS ) ) { + test(); test(); test(); IF( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) @@ -1248,7 +1246,7 @@ ivas_error ivas_binRenderer_open_fx( // Q29: hBinRenderer->hReverb->foa_enc_fx[k] } } - ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation || st_ivas->hCombinedOrientationData ) ) { IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth_fx, st_ivas->hIntSetup.ls_elevation_fx, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) { @@ -1263,19 +1261,23 @@ ivas_error ivas_binRenderer_open_fx( /* Copy the handles to main handle */ st_ivas->hBinRenderer = hBinRenderer; - return error; + return IVAS_ERR_OK; } + /*------------------------------------------------------------------------- * ivas_binRenderer_convModuleClose() * * Close convolution module handle of fastconv binaural renderer *------------------------------------------------------------------------*/ + static void ivas_binRenderer_convModuleClose_fx( - BINAURAL_RENDERER_HANDLE *hBinRenderer /* i/o: fastconv binaural renderer handle */ + BINAURAL_RENDERER_HANDLE *hBinRenderer, /* i/o: fastconv binaural renderer handle */ + const Word16 num_poses /* i : number of poses */ ) { Word16 bandIdx, chIdx; + Word16 posIdx; BINRENDERER_CONV_MODULE_HANDLE_FX hBinRenConvModule; @@ -1313,44 +1315,39 @@ static void ivas_binRenderer_convModuleClose_fx( free( hBinRenConvModule->filterTapsRightImag_fx ); hBinRenConvModule->filterTapsRightImag_fx = NULL; - FOR( bandIdx = 0; bandIdx < ( *hBinRenderer )->conv_band; bandIdx++ ) + FOR( posIdx = 0; posIdx < num_poses; posIdx++ ) { - FOR( chIdx = 0; chIdx < ( *hBinRenderer )->nInChannels; chIdx++ ) + FOR( bandIdx = 0; bandIdx < ( *hBinRenderer )->conv_band; bandIdx++ ) { - free( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx] ); - hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx] = NULL; - - free( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx] ); - hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx] = NULL; + FOR( chIdx = 0; chIdx < ( *hBinRenderer )->nInChannels; chIdx++ ) + { + free( hBinRenConvModule->filterStatesLeftReal_fx[posIdx][bandIdx][chIdx] ); + hBinRenConvModule->filterStatesLeftReal_fx[posIdx][bandIdx][chIdx] = NULL; -#ifndef OPT_BASOP_ADD_v1 - free( hBinRenConvModule->Q_filterStatesLeft[bandIdx][chIdx] ); - hBinRenConvModule->Q_filterStatesLeft[bandIdx][chIdx] = NULL; -#endif /* OPT_BASOP_ADD_v1 */ - } + free( hBinRenConvModule->filterStatesLeftImag_fx[posIdx][bandIdx][chIdx] ); + hBinRenConvModule->filterStatesLeftImag_fx[posIdx][bandIdx][chIdx] = NULL; + } - free( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx] ); - hBinRenConvModule->filterStatesLeftReal_fx[bandIdx] = NULL; + free( hBinRenConvModule->filterStatesLeftReal_fx[posIdx][bandIdx] ); + hBinRenConvModule->filterStatesLeftReal_fx[posIdx][bandIdx] = NULL; - free( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx] ); - hBinRenConvModule->filterStatesLeftImag_fx[bandIdx] = NULL; + free( hBinRenConvModule->filterStatesLeftImag_fx[posIdx][bandIdx] ); + hBinRenConvModule->filterStatesLeftImag_fx[posIdx][bandIdx] = NULL; + } + free( hBinRenConvModule->filterStatesLeftReal_fx[posIdx] ); + hBinRenConvModule->filterStatesLeftReal_fx[posIdx] = NULL; -#ifndef OPT_BASOP_ADD_v1 - free( hBinRenConvModule->Q_filterStatesLeft[bandIdx] ); - hBinRenConvModule->Q_filterStatesLeft[bandIdx] = NULL; -#endif /* OPT_BASOP_ADD_v1 */ + free( hBinRenConvModule->filterStatesLeftImag_fx[posIdx] ); + hBinRenConvModule->filterStatesLeftImag_fx[posIdx] = NULL; } - free( hBinRenConvModule->filterStatesLeftReal_fx ); hBinRenConvModule->filterStatesLeftReal_fx = NULL; free( hBinRenConvModule->filterStatesLeftImag_fx ); hBinRenConvModule->filterStatesLeftImag_fx = NULL; -#ifndef OPT_BASOP_ADD_v1 - free( hBinRenConvModule->Q_filterStatesLeft ); - hBinRenConvModule->Q_filterStatesLeft = NULL; -#endif /* OPT_BASOP_ADD_v1 */ + free( hBinRenConvModule->Q_filterStates ); + hBinRenConvModule->Q_filterStates = NULL; free( ( *hBinRenderer )->hBinRenConvModule ); ( *hBinRenderer )->hBinRenConvModule = NULL; @@ -1358,11 +1355,13 @@ static void ivas_binRenderer_convModuleClose_fx( return; } + /*------------------------------------------------------------------------- * ivas_binRenderer_close() * * Close fastconv binaural renderer memories *------------------------------------------------------------------------*/ + void ivas_binRenderer_close_fx( BINAURAL_RENDERER_HANDLE *hBinRenderer /* i/o: fastconv binaural renderer handle */ ) @@ -1375,7 +1374,7 @@ void ivas_binRenderer_close_fx( IF( ( *hBinRenderer )->hBinRenConvModule != NULL ) { - ivas_binRenderer_convModuleClose_fx( hBinRenderer ); + ivas_binRenderer_convModuleClose_fx( hBinRenderer, ( *hBinRenderer )->numPoses ); } IF( ( *hBinRenderer )->hReverb != NULL ) @@ -1389,11 +1388,13 @@ void ivas_binRenderer_close_fx( return; } + /*------------------------------------------------------------------------- * ivas_free_pppHrtfMem() * * Free fastconv binaural renderer hrtf memories *------------------------------------------------------------------------*/ + static void ivas_free_pppHrtfMem_fx( Word32 ****ppppHRIR, /*Qx*/ const Word16 dim, @@ -1423,16 +1424,19 @@ static void ivas_free_pppHrtfMem_fx( return; } + /*------------------------------------------------------------------------- * ivas_binaural_hrtf_close() * * Close fastconv binaural renderer hrtf memories *------------------------------------------------------------------------*/ -void ivas_binaural_hrtf_close( + +void ivas_binaural_hrtf_close_fx( HRTFS_FASTCONV_HANDLE *hHrtfFastConv /* i : fastconv HRTF handle */ ) { Word16 allocate_init_flag; + Word16 n_channels; test(); IF( hHrtfFastConv == NULL || *hHrtfFastConv == NULL ) @@ -1443,39 +1447,24 @@ void ivas_binaural_hrtf_close( allocate_init_flag = ( *hHrtfFastConv )->allocate_init_flag; move16(); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->leftHRIRReal_fx, HRTF_LS_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->leftHRIRImag_fx, HRTF_LS_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->rightHRIRReal_fx, HRTF_LS_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->rightHRIRImag_fx, HRTF_LS_CHANNELS, allocate_init_flag ); - - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->leftBRIRReal_fx, HRTF_LS_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->leftBRIRImag_fx, HRTF_LS_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->rightBRIRReal_fx, HRTF_LS_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->rightBRIRImag_fx, HRTF_LS_CHANNELS, allocate_init_flag ); - - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->leftHRIRReal_HOA3_fx, HOA3_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->leftHRIRImag_HOA3_fx, HOA3_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->rightHRIRReal_HOA3_fx, HOA3_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->rightHRIRImag_HOA3_fx, HOA3_CHANNELS, allocate_init_flag ); - - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->leftHRIRReal_HOA2_fx, HOA2_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->leftHRIRImag_HOA2_fx, HOA2_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->rightHRIRReal_HOA2_fx, HOA2_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->rightHRIRImag_HOA2_fx, HOA2_CHANNELS, allocate_init_flag ); + n_channels = ( *hHrtfFastConv )->n_channels; + move16(); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->leftHRIRReal_FOA_fx, FOA_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->leftHRIRImag_FOA_fx, FOA_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->rightHRIRReal_FOA_fx, FOA_CHANNELS, allocate_init_flag ); - ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->rightHRIRImag_FOA_fx, FOA_CHANNELS, allocate_init_flag ); + ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->leftReal_fx, n_channels, allocate_init_flag ); + ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->leftImag_fx, n_channels, allocate_init_flag ); + ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->rightReal_fx, n_channels, allocate_init_flag ); + ivas_free_pppHrtfMem_fx( &( *hHrtfFastConv )->rightImag_fx, n_channels, allocate_init_flag ); return; } + /*-------------------------------------------------------------------------* * ivas_binaural_add_LFE() * * The functions adds the LFE to the left and right channels after binaural rendering *-------------------------------------------------------------------------*/ + void ivas_binaural_add_LFE_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ Word16 output_frame, /* i : length of input frame */ @@ -1484,6 +1473,7 @@ void ivas_binaural_add_LFE_fx( ) { Word16 render_lfe, idx_lfe, gain_fx, idx; + Word32 lfe_tc[L_FRAME48k]; IF( st_ivas->hBinRenderer != NULL ) { @@ -1520,15 +1510,16 @@ void ivas_binaural_add_LFE_fx( } FOR( idx_lfe = 0; idx_lfe < st_ivas->hIntSetup.num_lfe; idx_lfe++ ) { - v_multc_fixed_16( input_fx[st_ivas->hIntSetup.index_lfe[idx_lfe]], gain_fx, input_fx[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_frame ); // q_input_fx - 1 + v_multc_fx_16( input_fx[st_ivas->hIntSetup.index_lfe[idx_lfe]], gain_fx, lfe_tc, output_frame ); // q_input_fx - 1 + /* copy LFE to left and right channels */ FOR( idx = 0; idx < output_frame; idx++ ) { - input_fx[st_ivas->hIntSetup.index_lfe[idx_lfe]][idx] = L_shl_sat( input_fx[st_ivas->hIntSetup.index_lfe[idx_lfe]][idx], 1 ); // saturating to keep same q + lfe_tc[idx] = L_shl_sat( lfe_tc[idx], 1 ); // saturating to keep same q move32(); - output_fx[0][idx] = L_add_sat( output_fx[0][idx], input_fx[st_ivas->hIntSetup.index_lfe[idx_lfe]][idx] ); + output_fx[0][idx] = L_add_sat( output_fx[0][idx], lfe_tc[idx] ); move32(); - output_fx[1][idx] = L_add_sat( output_fx[1][idx], input_fx[st_ivas->hIntSetup.index_lfe[idx_lfe]][idx] ); + output_fx[1][idx] = L_add_sat( output_fx[1][idx], lfe_tc[idx] ); move32(); } } @@ -1537,39 +1528,45 @@ void ivas_binaural_add_LFE_fx( return; } + /*------------------------------------------------------------------------- - * ivas_binRenderer() + * ivas_binRenderer_fx() * * Fastconv binaural renderer main function *-------------------------------------------------------------------------*/ void ivas_binRenderer_fx( - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle*/ - const Word16 numTimeSlots, /* i : number of time slots to render */ - Word32 Cldfb_RealBuffer_Binaural_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals Q_in*/ - Word32 Cldfb_ImagBuffer_Binaural_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals Q_in*/ - Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals Q_in*/ - Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals Q_in*/ - Word16 *Q_in /* i : LS signals exp */ + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle*/ + const Word16 numTimeSlots, /* i : number of time slots to render */ + Word32 Cldfb_RealBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ + Word32 Cldfb_ImagBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ + Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals Q_in*/ + Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals Q_in*/ + Word16 *Q_in /* i : LS signals exp */ ) { Word16 chIdx, i, j, k; - // to be checked: feasibility with 32 bit buffers - Word64 Cldfb_RealBuffer_Binaural_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word64 Cldfb_ImagBuffer_Binaural_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word16 pos_idx, num_poses; + Word32 RealBuffer_local[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 ImagBuffer_local[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + push_wmops( "fastconv_binaural_rendering" ); + num_poses = hBinRenderer->numPoses; + /* Compute Convolution */ /* memory reset for the binaural output */ - FOR( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + + /* Note: on main, this nested for loop was removed under a "bit-exact optimization" under switch OPT_SBA_DEC_V2_BE */ + /* this was found to clash with split rendering, so kept here. WMOPS impact should be assessed */ + FOR( chIdx = 0; chIdx < hBinRenderer->hInputSetup->nchan_out_woLFE; chIdx++ ) { FOR( k = 0; k < numTimeSlots; k++ ) { - set32_fx( Cldfb_RealBuffer_Binaural_fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( Cldfb_ImagBuffer_Binaural_fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); - set64_fx( Cldfb_RealBuffer_Binaural_64fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); - set64_fx( Cldfb_ImagBuffer_Binaural_64fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); + Copy32( RealBuffer_fx[chIdx][k], RealBuffer_local[chIdx][k], CLDFB_NO_CHANNELS_MAX ); + Copy32( ImagBuffer_fx[chIdx][k], ImagBuffer_local[chIdx][k], CLDFB_NO_CHANNELS_MAX ); } } @@ -1583,13 +1580,13 @@ void ivas_binRenderer_fx( /* Rotation in SHD (HOA3) */ IF( EQ_16( hCombinedOrientationData->shd_rot_max_order, -1 ) ) { - rotateFrame_shd_cldfb( RealBuffer_fx, ImagBuffer_fx, hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3 ); + rotateFrame_shd_cldfb_fx( RealBuffer_fx, ImagBuffer_fx, hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3 ); *Q_in = sub( *Q_in, 1 ); //( Q_in + 14 - 15 ) move16(); } ELSE IF( hCombinedOrientationData->shd_rot_max_order > 0 ) { - rotateFrame_shd_cldfb( RealBuffer_fx, ImagBuffer_fx, hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hCombinedOrientationData->shd_rot_max_order ); + rotateFrame_shd_cldfb_fx( RealBuffer_fx, ImagBuffer_fx, hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hCombinedOrientationData->shd_rot_max_order ); *Q_in = sub( *Q_in, 1 ); //( Q_in + 14 - 15 ) move16(); } @@ -1597,33 +1594,93 @@ void ivas_binRenderer_fx( ELSE { /* Rotation in SD (CICPx) */ - rotateFrame_sd_cldfb_fixed( hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx], RealBuffer_fx, ImagBuffer_fx, - hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, numTimeSlots, hBinRenderer->conv_band ); + rotateFrame_sd_cldfb_fx( hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx], RealBuffer_fx, ImagBuffer_fx, + hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, numTimeSlots, hBinRenderer->conv_band ); } } /* HOA decoding to CICP19 if needed*/ test(); - IF( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && NE_16( hBinRenderer->nInChannels, 16 ) ) + test(); + test(); + IF( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && + ( NE_16( hBinRenderer->nInChannels, HOA3_CHANNELS ) && NE_16( hBinRenderer->nInChannels, HOA2_CHANNELS ) && NE_16( hBinRenderer->nInChannels, FOA_CHANNELS ) ) ) { - ivas_sba2mc_cldfb_fixed( *( hBinRenderer->hInputSetup ), RealBuffer_fx, ImagBuffer_fx, - hBinRenderer->nInChannels, hBinRenderer->conv_band, numTimeSlots, hBinRenderer->hoa_dec_mtx ); + ivas_sba2mc_cldfb_fx( *( hBinRenderer->hInputSetup ), RealBuffer_fx, ImagBuffer_fx, + hBinRenderer->nInChannels, hBinRenderer->conv_band, numTimeSlots, hBinRenderer->hoa_dec_mtx ); } - ivas_binRenderer_filterModule_fx( Cldfb_RealBuffer_Binaural_64fx, Cldfb_ImagBuffer_Binaural_64fx, RealBuffer_fx, ImagBuffer_fx, numTimeSlots, hBinRenderer, *Q_in ); - FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + ivas_binRenderer_filterModule_fx( Cldfb_RealBuffer_Binaural_fx[0], Cldfb_ImagBuffer_Binaural_fx[0], RealBuffer_fx, ImagBuffer_fx, numTimeSlots, hBinRenderer, 0, *Q_in ); + + IF( pMultiBinPoseData != NULL ) { - FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + IF( GT_16( pMultiBinPoseData->num_poses, 1 ) ) { - FOR( k = 0; k < CLDFB_NO_CHANNELS_MAX; k++ ) + IVAS_QUATERNION Quaternions_abs, Quaternions_ref, Quaternions_ref2; + Word32 Rmat_local[3][3]; + Word16 q_fact_orig; + + IF( hCombinedOrientationData && hBinRenderer->rotInCldfb ) { - Cldfb_RealBuffer_Binaural_fx[i][j][k] = W_extract_l( W_shr( Cldfb_RealBuffer_Binaural_64fx[i][j][k], 29 ) ); //(*Q_in + 29) - 29 - move32(); - Cldfb_ImagBuffer_Binaural_fx[i][j][k] = W_extract_l( W_shr( Cldfb_ImagBuffer_Binaural_64fx[i][j][k], 29 ) ); //(*Q_in + 29) - 29 - move32(); + Quaternions_ref = hCombinedOrientationData->Quaternions[0]; + q_fact_orig = Quaternions_ref.q_fact; + + modify_Quat_q_fx( &Quaternions_ref, &Quaternions_ref, Q22 ); + + Quaternions_ref2.w_fx = L_negate( 12582912 ); // Q22 + IF( EQ_16( hCombinedOrientationData->shd_rot_max_order, 0 ) ) + { + /*HOA signal already rotated by DirAC*/ + Quaternions_ref2.x_fx = 0; + Quaternions_ref2.y_fx = 0; + Quaternions_ref2.z_fx = 0; + *Q_in = sub( *Q_in, 1 ); + } + ELSE + { + /*euler*/ + Quat2EulerDegree_fx( Quaternions_ref, &Quaternions_ref2.z_fx, &Quaternions_ref2.y_fx, &Quaternions_ref2.x_fx ); /*order in Quat2Euler seems to be reversed ?*/ + } + + FOR( pos_idx = 1; pos_idx < pMultiBinPoseData->num_poses; pos_idx++ ) + { + FOR( chIdx = 0; chIdx < hBinRenderer->hInputSetup->nchan_out_woLFE; chIdx++ ) + { + FOR( k = 0; k < numTimeSlots; k++ ) + { + Copy32( RealBuffer_local[chIdx][k], RealBuffer_fx[chIdx][k], CLDFB_NO_CHANNELS_MAX ); + Copy32( ImagBuffer_local[chIdx][k], ImagBuffer_fx[chIdx][k], CLDFB_NO_CHANNELS_MAX ); + } + } + + Quaternions_abs.x_fx = L_add( Quaternions_ref2.x_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][0] ); + Quaternions_abs.y_fx = L_add( Quaternions_ref2.y_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][1] ); + Quaternions_abs.z_fx = L_add( Quaternions_ref2.z_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][2] ); + Quaternions_abs.w_fx = L_negate( 12582912 ); // Q22 + + Euler2Quat_fx( deg2rad_fx( Quaternions_abs.x_fx ), deg2rad_fx( Quaternions_abs.y_fx ), deg2rad_fx( Quaternions_abs.z_fx ), &Quaternions_abs ); + + modify_Quat_q_fx( &Quaternions_abs, &Quaternions_abs, q_fact_orig ); + + QuatToRotMat_fx( Quaternions_abs, Rmat_local ); + + modify_Rmat_q_fx( Rmat_local, Rmat_local, sub( shl( q_fact_orig, 1 ), 32 ), Q30 ); + + IF( hBinRenderer->hInputSetup->is_loudspeaker_setup ) + { + rotateFrame_sd_cldfb_fx( Rmat_local, RealBuffer_fx, ImagBuffer_fx, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, numTimeSlots, hBinRenderer->conv_band ); + } + ELSE + { + rotateFrame_shd_cldfb_fx( RealBuffer_fx, ImagBuffer_fx, Rmat_local, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hBinRenderer->hInputSetup->ambisonics_order ); + } + + ivas_binRenderer_filterModule_fx( Cldfb_RealBuffer_Binaural_fx[pos_idx], Cldfb_ImagBuffer_Binaural_fx[pos_idx], RealBuffer_fx, ImagBuffer_fx, numTimeSlots, hBinRenderer, pos_idx, *Q_in ); + } } } } + /* Obtain the binaural dmx and compute the reverb */ IF( hBinRenderer->hReverb != NULL ) { @@ -1631,8 +1688,11 @@ void ivas_binRenderer_fx( Word32 reverbIm_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; Word32 inRe_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; Word32 inIm_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word16 shift_q; + Word16 q_in_out; + q_in_out = *Q_in; - ivas_binaural_obtain_DMX_fx( numTimeSlots, hBinRenderer, RealBuffer_fx, ImagBuffer_fx, inRe_fx, inIm_fx ); + ivas_binaural_obtain_DMX_fx( numTimeSlots, hBinRenderer, RealBuffer_fx, ImagBuffer_fx, inRe_fx, inIm_fx, &q_in_out ); FOR( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) { @@ -1644,16 +1704,16 @@ void ivas_binRenderer_fx( } ivas_binaural_reverb_processSubframe_fx( hBinRenderer->hReverb, BINAURAL_CHANNELS, numTimeSlots, inRe_fx, inIm_fx, reverbRe_fx, reverbIm_fx ); - + shift_q = sub( Q6, q_in_out ); FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) { FOR( j = 0; j < numTimeSlots; j++ ) { FOR( k = 0; k < hBinRenderer->hReverb->numBins; k++ ) { - reverbRe_fx[i][j][k] = L_shl( reverbRe_fx[i][j][k], 1 ); //*Q_in + reverbRe_fx[i][j][k] = L_shl( reverbRe_fx[i][j][k], shift_q ); // Q6 move32(); - reverbIm_fx[i][j][k] = L_shl( reverbIm_fx[i][j][k], 1 ); //*Q_in + reverbIm_fx[i][j][k] = L_shl( reverbIm_fx[i][j][k], shift_q ); // Q6 move32(); } } @@ -1664,12 +1724,112 @@ void ivas_binRenderer_fx( { FOR( k = 0; k < numTimeSlots; k++ ) { - /* Combine first and second parts to generate binaural output signal with room effect */ - v_add_32( Cldfb_RealBuffer_Binaural_fx[chIdx][k], reverbRe_fx[chIdx][k], Cldfb_RealBuffer_Binaural_fx[chIdx][k], hBinRenderer->conv_band ); // Q_in - v_add_32( Cldfb_ImagBuffer_Binaural_fx[chIdx][k], reverbIm_fx[chIdx][k], Cldfb_ImagBuffer_Binaural_fx[chIdx][k], hBinRenderer->conv_band ); // Q_in + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) + { + /* Combine first and second parts to generate binaural output signal with room effect */ + v_add_32( Cldfb_RealBuffer_Binaural_fx[pos_idx][chIdx][k], reverbRe_fx[chIdx][k], Cldfb_RealBuffer_Binaural_fx[pos_idx][chIdx][k], hBinRenderer->conv_band ); // Q6 + v_add_32( Cldfb_ImagBuffer_Binaural_fx[pos_idx][chIdx][k], reverbIm_fx[chIdx][k], Cldfb_ImagBuffer_Binaural_fx[pos_idx][chIdx][k], hBinRenderer->conv_band ); // Q6 + } } } } + + Word16 len = sub( CLDFB_NO_CHANNELS_MAX, hBinRenderer->conv_band ); + + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) + { + FOR( k = 0; k < numTimeSlots; k++ ) + { + set32_fx( &Cldfb_RealBuffer_Binaural_fx[pos_idx][0][k][hBinRenderer->conv_band], 0, len ); + set32_fx( &Cldfb_RealBuffer_Binaural_fx[pos_idx][1][k][hBinRenderer->conv_band], 0, len ); + set32_fx( &Cldfb_ImagBuffer_Binaural_fx[pos_idx][0][k][hBinRenderer->conv_band], 0, len ); + set32_fx( &Cldfb_ImagBuffer_Binaural_fx[pos_idx][1][k][hBinRenderer->conv_band], 0, len ); + } + } + pop_wmops(); return; } + + +/*------------------------------------------------------------------------- + * ivas_rend_CldfbMultiBinRendProcess() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_rend_CldfbMultiBinRendProcess( + const BINAURAL_RENDERER_HANDLE hCldfbRend, + const COMBINED_ORIENTATION_HANDLE *pCombinedOrientationData, + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + Word32 Cldfb_In_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_In_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_Out_Real[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ + Word32 Cldfb_Out_Imag[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const Word16 low_res_pre_rend_rot, + const Word16 num_subframes, + const Word16 Q_in /* i : LS signals exp */ +) +{ + Word16 slot_idx, ch_idx, idx, pose_idx, i, j; + Word16 sf_idx; + Word32 Cldfb_RealBuffer_sfIn[MAX_INPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_sfIn[MAX_INPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word16 Q_in_orig; + + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + Q_in_orig = Q_in; + move16(); + FOR( slot_idx = 0; slot_idx < MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + idx = sf_idx * MAX_PARAM_SPATIAL_SUBFRAMES + slot_idx; + FOR( ch_idx = 0; ch_idx < hCldfbRend->nInChannels; ch_idx++ ) + { + Copy32( &Cldfb_In_Real[ch_idx][idx][0], &Cldfb_RealBuffer_sfIn[ch_idx][slot_idx][0], hCldfbRend->max_band ); + Copy32( &Cldfb_In_Imag[ch_idx][idx][0], &Cldfb_ImagBuffer_sfIn[ch_idx][slot_idx][0], hCldfbRend->max_band ); + } + } + + IF( ( *pCombinedOrientationData ) != NULL ) + { + IF( ( low_res_pre_rend_rot ) && ( EQ_32( pMultiBinPoseData->poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) ) ) + { + Copy_Quat_fx( &( *pCombinedOrientationData )->Quaternions[0], &( *pCombinedOrientationData )->Quaternions[sf_idx] ); + + FOR( i = 0; i < 3; i++ ) + { + FOR( j = 0; j < 3; j++ ) + { + ( *pCombinedOrientationData )->Rmat_fx[sf_idx][i][j] = ( *pCombinedOrientationData )->Rmat_fx[0][i][j]; + move32(); + } + } + } + ( *pCombinedOrientationData )->shd_rot_max_order = -1; + move16(); + } + + ivas_binRenderer_fx( hCldfbRend, pMultiBinPoseData, *pCombinedOrientationData, MAX_PARAM_SPATIAL_SUBFRAMES, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer_sfIn, Cldfb_ImagBuffer_sfIn, &Q_in_orig ); + + FOR( pose_idx = 0; pose_idx < hCldfbRend->numPoses; pose_idx++ ) + { + FOR( slot_idx = 0; slot_idx < MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + idx = sf_idx * MAX_PARAM_SPATIAL_SUBFRAMES + slot_idx; + FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) + { + Copy32( &Cldfb_RealBuffer_Binaural[pose_idx][ch_idx][slot_idx][0], &Cldfb_Out_Real[( pose_idx * BINAURAL_CHANNELS ) + ch_idx][idx][0], hCldfbRend->max_band ); + Copy32( &Cldfb_ImagBuffer_Binaural[pose_idx][ch_idx][slot_idx][0], &Cldfb_Out_Imag[( pose_idx * BINAURAL_CHANNELS ) + ch_idx][idx][0], hCldfbRend->max_band ); + + Scale_sig32( &Cldfb_Out_Real[( pose_idx * BINAURAL_CHANNELS ) + ch_idx][idx][0], hCldfbRend->max_band, sub( Q_in, Q6 ) ); // Q_in + Scale_sig32( &Cldfb_Out_Imag[( pose_idx * BINAURAL_CHANNELS ) + ch_idx][idx][0], hCldfbRend->max_band, sub( Q_in, Q6 ) ); // Q_in + } + } + } + } + + return; +} diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index 37c32a8b1b48043bd560da49d386c2a3321ff54f..37aa3747fc9d96f7d6300e0ec52cb1f1fe3fd72f 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -73,8 +73,11 @@ ivas_error ivas_core_dec_fx( Word16 tmp16, tmp16_2, j; Word16 Q_white_exc; + set16_fx( tmp_buffer_fx, 0, L_FRAME48k ); + Word16 tmps, incr; - Word32 bwe_exc_extended_fx[CPE_CHANNELS][L_FRAME32k + NL_BUFF_OFFSET]; + Word16 flag_bwe_bws, flaf_swb_tbe; + Word32 *bwe_exc_extended_fx[CPE_CHANNELS] = { NULL, NULL }; Word16 voice_factors_fx[CPE_CHANNELS][NB_SUBFR16k]; // Q15 Word16 core_switching_flag[CPE_CHANNELS]; @@ -108,9 +111,8 @@ ivas_error ivas_core_dec_fx( move16(); move16(); - Word16 tdm_lsfQ_PCh_fx[M], tdm_lspQ_PCh_fx[M]; + Word16 tdm_lsfQ_PCh_fx[M]; Word32 conceal_eof_gain32; - Flag Overflow; error = IVAS_ERR_OK; move32(); @@ -264,11 +266,7 @@ ivas_error ivas_core_dec_fx( test(); test(); test(); -#ifdef NONBE_MDCT_ST_PLC_DO_NOT_SCALE_OLD_OUT_IF_FIRST_GOOD_IS_SID IF( !st->bfi && st->prev_bfi && GT_32( st->total_brate, SID_2k40 ) && ( EQ_16( st->last_core_bfi, TCX_20_CORE ) || EQ_16( st->last_core_bfi, TCX_10_CORE ) ) && st->hTcxDec != NULL ) -#else - IF( !st->bfi && st->prev_bfi && ( EQ_16( st->last_core_bfi, TCX_20_CORE ) || EQ_16( st->last_core_bfi, TCX_10_CORE ) ) && st->hTcxDec != NULL ) -#endif { conceal_eof_gain32 = L_shr_sat( st->hTcxDec->conceal_eof_gain32, sub( 16, st->hTcxDec->conceal_eof_gain_e ) ); // e = 31 - Q , 16 - e => 16 - (31 - Q) => Q - 15, // shr(16 -e ) = shr(Q -15) => 15 - Q ==> Q15 @@ -294,6 +292,7 @@ ivas_error ivas_core_dec_fx( set16_fx( voice_factors_fx[n], 0, NB_SUBFR16k ); set32_fx( hb_synth_32_fx[n], 0, L_FRAME48k ); set16_fx( hb_synth_16_fx[n], 0, L_FRAME48k ); + bwe_exc_extended_fx[n] = hb_synth_32_fx[n]; /* note: reuse the buffer */ /*------------------------------------------------------------------* * Decision matrix (selection of technologies) @@ -336,13 +335,11 @@ ivas_error ivas_core_dec_fx( Word16 ovl, fade_len; IF( NE_16( sts[0]->L_frame, sts[0]->last_L_frame ) ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( sts[0]->hHQ_core->old_out_LB_fx, sts[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, sts[0]->hHQ_core->Q_old_wtda_LB ) ); // Q11 -#else - Copy_Scale_sig_16_32_DEPREC( sts[0]->hHQ_core->old_out_LB_fx, sts[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, sts[0]->hHQ_core->Q_old_wtda_LB ) ); // Q11 -#endif L_lerp_fx_q11( sts[0]->hHQ_core->old_out_LB_fx32, sts[0]->hHQ_core->old_out_LB_fx32, sts[0]->L_frame, sts[0]->last_L_frame ); Copy_Scale_sig_32_16( sts[0]->hHQ_core->old_out_LB_fx32, sts[0]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( sts[0]->hHQ_core->Q_old_wtda_LB, Q11 ) ); // Q_old_wtda_LB + sts[0]->hHQ_core->Q_old_out_fx32 = Q11; + move16(); } IF( NE_16( sts[0]->L_frame, L_FRAME16k ) ) { @@ -361,17 +358,14 @@ ivas_error ivas_core_dec_fx( move16(); } + save_hb_synth_32_fx = NULL; test(); test(); test(); - IF( sba_dirac_stereo_flag && hSCE && LE_32( sts[0]->total_brate, SID_2k40 ) && EQ_16( sts[0]->cng_type, FD_CNG ) ) + if ( sba_dirac_stereo_flag && hSCE && LE_32( sts[0]->total_brate, SID_2k40 ) && EQ_16( sts[0]->cng_type, FD_CNG ) ) { save_hb_synth_32_fx = hSCE->save_hb_synth_fx; } - ELSE - { - save_hb_synth_32_fx = NULL; - } /*------------------------------------------------------------------* * Decode SID for MDCT-Stereo DTX mode @@ -522,17 +516,21 @@ ivas_error ivas_core_dec_fx( Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, add( M, 1 ), sub( norm_s( sub( st->hFdCngDec->hFdCngCom->A_cng[0], 1 ) ), 3 ) ); // Qx } - IF( NE_32( ( error = acelp_core_dec_ivas_fx( st, output_16_fx[n], synth_16_fx[n], save_hb_synth_16_fx, bwe_exc_extended_fx[n], voice_factors_fx[n], old_syn_12k8_16k_fx_16, sharpFlag[n], pitch_buf_fx[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hStereoCng, read_sid_info ) ), IVAS_ERR_OK ) ) + IF( ( EQ_32( st->last_core, TCX_10_CORE ) || EQ_32( st->last_core, TCX_20_CORE ) ) || // st->Q_syn_factor is set in TCX mode; otherwise, it may be uninitialized + ( hCPE != NULL && ( GT_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && ( ( EQ_32( sts[0]->last_core, TCX_10_CORE ) || EQ_32( sts[0]->last_core, TCX_20_CORE ) ) ) ) ) ) // In this case, sts[1] gets its value from sts[0]. + { + Scale_sig( st->old_exc_fx, L_EXC_MEM_DEC, negate( st->Q_syn_factor ) ); + st->Q_syn = add( st->Q_syn, st->Q_syn_factor ); + } + st->Q_syn_factor = 0; + move16(); + IF( NE_32( ( error = acelp_core_dec_fx( st, output_16_fx[n], synth_16_fx[n], save_hb_synth_16_fx, bwe_exc_extended_fx[n], voice_factors_fx[n], old_syn_12k8_16k_fx_16, sharpFlag[n], pitch_buf_fx[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lsfQ_PCh_fx, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hStereoCng, read_sid_info ) ), IVAS_ERR_OK ) ) { return error; } -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, st->Q_syn2 ) ); // Q_syn2->Q11 -#else - Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, st->Q_syn2 ) ); // Q_syn2->Q11 -#endif - Scale_sig( output_16_fx[n], L_FRAME48k, negate( st->Q_syn2 ) ); // Q0 + Scale_sig( output_16_fx[n], L_FRAME48k, negate( st->Q_syn2 ) ); // Q0 IF( st->cldfbAna ) { scale_sig32( st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_size, Q10 - Q11 ); /* 9 * (Word16)(st->L_frame * FRAMES_PER_SEC * INV_CLDFB_BANDWIDTH + 0.5f) , Q10 */ @@ -551,9 +549,6 @@ ivas_error ivas_core_dec_fx( st->cldfbSyn->Q_cldfb_state = Q11; move16(); } -#ifndef FIX_ISSUE_1279 /* the update of prev_Q_syn is already done inside rescale_mem( ) */ - st->prev_Q_syn = st->Q_syn; -#endif move16(); IF( save_hb_synth_32_fx ) @@ -589,14 +584,8 @@ ivas_error ivas_core_dec_fx( move32(); /* TCX decoder */ - Scale_sig( st->hPFstat->mem_stp, L_SUBFR, -Qsyn_temp ); // Q0 - Scale_sig( st->hPFstat->mem_pf_in, L_SUBFR, -Qsyn_temp ); // Q0 - Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, -st->hHQ_core->Q_old_wtda_LB ); // Q0 - Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, -st->hHQ_core->Q_old_wtda ); // Q0 - st->hHQ_core->Q_old_wtda_LB = 0; - move16(); - st->hHQ_core->Q_old_wtda = 0; - move16(); + Scale_sig( st->hPFstat->mem_stp, L_SUBFR, -Qsyn_temp ); // Q0 + Scale_sig( st->hPFstat->mem_pf_in, L_SUBFR, -Qsyn_temp ); // Q0 IF( st_ivas == NULL ) { @@ -610,10 +599,7 @@ ivas_error ivas_core_dec_fx( } stereo_tcx_core_dec_fx( st, frameMode[n], output_16_fx[n], synth_16_fx[n], pitch_buf_fx[n], sba_dirac_stereo_flag, hStereoTD, last_element_mode, flag_sec_CNA, hStereoCng, nchan_out, ivas_format ); - - st->hHQ_core->Q_old_wtda_LB = st->hHQ_core->Q_old_wtda; - move16(); - Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, Q11 ); // Q11 + Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], output_frame, sub( Q11, st->Q_syn_factor ) ); // Q11 IF( st->hTcxDec ) { @@ -637,16 +623,15 @@ ivas_error ivas_core_dec_fx( move16(); Q_synth = 0; move16(); + st->Q_syn_factor = 0; + move16(); ivas_hq_core_dec_fx( st, synth_16_fx[n], &Q_synth, output_frame, NORMAL_HQ_CORE, core_switching_flag[n], output_16_fx[n], &Q_output ); Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_output ) ); // Q11 -#ifdef MSAN_FIX - Scale_sig( synth_16_fx[n], output_frame, negate( Q_synth ) ); // Q0 -#else - Scale_sig( synth_16_fx[n], L_FRAME48k, negate( Q_synth ) ); -#endif - Scale_sig( output_16_fx[n], L_FRAME48k, negate( Q_output ) ); // Q0 + st->Q_syn_factor = s_min( 0, s_min( Q_synth, Q_output ) ); + Scale_sig( synth_16_fx[n], output_frame, sub( st->Q_syn_factor, Q_synth ) ); // st->Q_syn_factor + Scale_sig( output_16_fx[n], L_FRAME48k, sub( st->Q_syn_factor, Q_output ) ); // st->Q_syn_factor } /*---------------------------------------------------------------------* @@ -658,13 +643,8 @@ ivas_error ivas_core_dec_fx( { Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->old_pitch_buf_fx, hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, add( imult1616( 2, NB_SUBFR16k ), 2 ), -Q10 ); // Q6 - td_stereo_param_updt_fx( st->lsp_old_fx, st->lsf_old_fx, st->old_pitch_buf_16_fx + st->nb_subfr, - tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, hStereoTD->tdm_Pri_pitch_buf_fx, st->flag_ACELP16k, hStereoTD->tdm_use_IAWB_Ave_lpc ); -#ifdef FIX_ISSUE_1237 + td_stereo_param_updt_fx( st->lsp_old_fx, st->lsf_old_fx, st->old_pitch_buf_16_fx + st->nb_subfr, tdm_lsfQ_PCh_fx, hStereoTD->tdm_Pri_pitch_buf_fx, st->flag_ACELP16k, hStereoTD->tdm_use_IAWB_Ave_lpc ); Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, hCPE->hCoreCoder[0]->old_pitch_buf_fx, add( imult1616( 2, NB_SUBFR16k ), 2 ), Q10 ); // Q16 -#else - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, hCPE->hCoreCoder[0]->old_pitch_buf_fx, add( imult1616( 2, NB_SUBFR16k ), 2 ), Q10 ); // Q16 -#endif } } /* n_channels loop */ @@ -722,16 +702,6 @@ ivas_error ivas_core_dec_fx( st->hHQ_core->Q_fer_samples = 0; move16(); } - IF( NE_16( st->core, st->last_core ) ) - { - IF( st->hTcxDec ) - { - Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, negate( st->Q_syn ) ); // Q0 - } - st->Q_syn = 0; - move16(); - } - st->prev_Q_syn = st->Q_syn; move16(); @@ -774,9 +744,8 @@ ivas_error ivas_core_dec_fx( move16(); sts[1]->hHQ_core->Q_old_wtda = sub( 15, sts[1]->hHQ_core->exp_old_out ); move16(); - - shift1 = norm_arr( sts[0]->hHQ_core->old_out_fx, L_FRAME48k ); - shift2 = norm_arr( sts[1]->hHQ_core->old_out_fx, L_FRAME48k ); + shift1 = getScaleFactor16( sts[0]->hHQ_core->old_out_fx, L_FRAME48k ); + shift2 = getScaleFactor16( sts[1]->hHQ_core->old_out_fx, L_FRAME48k ); scale_sig( sts[0]->hHQ_core->old_out_fx, L_FRAME48k, shift1 ); scale_sig( sts[1]->hHQ_core->old_out_fx, L_FRAME48k, shift2 ); sts[0]->hHQ_core->Q_old_wtda = add( sts[0]->hHQ_core->Q_old_wtda, shift1 ); @@ -788,13 +757,8 @@ ivas_error ivas_core_dec_fx( test(); test(); -#ifdef NONBE_MDCT_ST_DTX_SKIP_DEWHITENING_OF_NOISE_SHAPES_ON_SID_FRAMES /* On first good active frame after frameloss undo the whitening of the bg noise shape */ IF( GT_32( sts[0]->core_brate, SID_2k40 ) && sts[0]->bfi == 0 && EQ_16( sts[0]->prev_bfi, 1 ) ) -#else - IF( sts[0]->bfi == 0 && EQ_16( sts[0]->prev_bfi, 1 ) ) - /* On first good frame after frameloss undo the whitening of the bg noise shape */ -#endif { FOR( n = 0; n < n_channels; ++n ) { @@ -845,7 +809,7 @@ ivas_error ivas_core_dec_fx( *---------------------------------------------------------------------*/ /*core_switching_post_dec*/ - Q_synth = sub( 15, e_sig[0] ); + Q_synth = add( sub( 15, e_sig[0] ), st->Q_syn_factor ); /*------------------fix-to-fix-end-----------------------*/ @@ -910,19 +874,11 @@ ivas_error ivas_core_dec_fx( /* Memories Re-Scaling */ IF( hBWE_TD != NULL ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, hBWE_TD->prev_Q_bwe_syn2 ) ); // Q11 Copy_Scale_sig_16_32_no_sat( hBWE_TD->old_tbe_synth_fx, hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11 Copy_Scale_sig_16_32_no_sat( hBWE_TD->state_lsyn_filt_dwn_shb_fx, hBWE_TD->state_lsyn_filt_dwn_shb_fx_32, ALLPASSSECTIONS_STEEP * 2, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11 Copy_Scale_sig_16_32_no_sat( hBWE_TD->state_lsyn_filt_shb_fx, hBWE_TD->state_lsyn_filt_shb_fx_32, ALLPASSSECTIONS_STEEP * 2, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11 Copy_Scale_sig_16_32_no_sat( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11 -#else - Copy_Scale_sig_16_32_DEPREC( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, st->prev_Q_bwe_syn2 ) ); // Q11 - Copy_Scale_sig_16_32_DEPREC( hBWE_TD->old_tbe_synth_fx, hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH, sub( Q11, st->prev_Qx ) ); // Q11 - Copy_Scale_sig_16_32_DEPREC( hBWE_TD->state_lsyn_filt_dwn_shb_fx, hBWE_TD->state_lsyn_filt_dwn_shb_fx_32, ALLPASSSECTIONS_STEEP * 2, sub( Q11, st->prev_Qx ) ); // Q11 - Copy_Scale_sig_16_32_DEPREC( hBWE_TD->state_lsyn_filt_shb_fx, hBWE_TD->state_lsyn_filt_shb_fx_32, ALLPASSSECTIONS_STEEP * 2, sub( Q11, st->prev_Qx ) ); // Q11 - Copy_Scale_sig_16_32_DEPREC( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, st->prev_Qx ) ); // Q11 -#endif Copy( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->state_32and48k_WB_upsample_fx, ( 2 * ALLPASSSECTIONS_STEEP ) ); } @@ -936,11 +892,7 @@ ivas_error ivas_core_dec_fx( test(); IF( sba_dirac_stereo_flag && NE_16( st->element_mode, IVAS_CPE_MDCT ) && !( EQ_32( st->core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) ) ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( synth_16_fx[n], hSCE->save_synth_fx, output_frame, sub( hSCE->q_save_synth_fx, Q_synth ) ); // q_save_synth_fx -#else - Copy_Scale_sig_16_32_DEPREC( synth_16_fx[n], hSCE->save_synth_fx, output_frame, sub( hSCE->q_save_synth_fx, Q_synth ) ); // q_save_synth_fx -#endif } IF( NE_32( ( error = core_switching_post_dec_ivas_fx( st, synth_16_fx[n], output_32_fx[n], p_output_mem_16, use_cldfb_for_dft, output_frame, 0 /*core_switching_flag*/, sba_dirac_stereo_flag, nchan_out, last_element_mode, &Q_synth ) ), IVAS_ERR_OK ) ) @@ -954,11 +906,7 @@ ivas_error ivas_core_dec_fx( test(); IF( sba_dirac_stereo_flag && hSCE && EQ_32( st->core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( synth_16_fx[n], hSCE->save_synth_fx, output_frame, sub( hSCE->q_save_synth_fx, Q_synth ) ); // q_save_synth_fx -#else - Copy_Scale_sig_16_32_DEPREC( synth_16_fx[n], hSCE->save_synth_fx, output_frame, sub( hSCE->q_save_synth_fx, Q_synth ) ); // q_save_synth_fx -#endif } /* if we transition from inactive to active coding in MDCT-Stereo DTX and the output format is mono DMX, we need to sync the upsampled buffer between channels here */ @@ -985,11 +933,7 @@ ivas_error ivas_core_dec_fx( } ELSE { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( st->delay_buf_out_fx, st->delay_buf_out32_fx, ( HQ_DELTA_MAX * HQ_DELAY_COMP ), sub( Q11, st->hHQ_core->Q_old_postdec ) ); // Q11 -#else - Copy_Scale_sig_16_32_DEPREC( st->delay_buf_out_fx, st->delay_buf_out32_fx, ( HQ_DELTA_MAX * HQ_DELAY_COMP ), sub( Q11, st->hHQ_core->Q_old_postdec ) ); // Q11 -#endif } Scale_sig32( output_32_fx[n], L_FRAME48k, ( Q11 - Q4 ) ); // Q11 @@ -1003,16 +947,12 @@ ivas_error ivas_core_dec_fx( move16(); } -#ifdef MSAN_FIX IF( Q_synth > 0 ) { Scale_sig( synth_16_fx[n], output_frame, negate( Q_synth ) ); // Q0 Q_synth = 0; move16(); } -#else - Scale_sig( synth_16_fx[n], L_FRAME48k, negate( Q_synth ) ); -#endif /*------------------reset-code-start---------------------*/ @@ -1040,6 +980,22 @@ ivas_error ivas_core_dec_fx( Word16 Q_input, Q_hb_synth_fx, Q_synth_fx; Word16 Q_syn_hb, sf; + flaf_swb_tbe = 0; + move16(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + if ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) || ( NE_16( st->coder_type, AUDIO ) && NE_16( st->coder_type, INACTIVE ) && GE_32( st->core_brate, SID_2k40 ) && EQ_16( st->core, ACELP_CORE ) && !st->con_tcx && GE_32( output_Fs, 32000 ) && GT_16( st->bwidth, NB ) && st->bws_cnt > 0 ) ) + { + flaf_swb_tbe = 1; + move16(); + } + sf = getScaleFactor32( output_32_fx[n], L_FRAME48k ); Q_input = 0; @@ -1064,7 +1020,6 @@ ivas_error ivas_core_dec_fx( IF( EQ_16( st->extl, WB_TBE ) ) { /* WB TBE decoder */ - ivas_wb_tbe_dec_fx( st, st->coder_type, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], hb_synth_16_fx[n], &Q_hb_synth_fx ); } ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( n, 1 ) && !tdm_LRTD_flag && NE_16( st->extl, -1 ) && st->bws_cnt == 0 && st->extl_brate == 0 ) @@ -1078,31 +1033,20 @@ ivas_error ivas_core_dec_fx( } /* Memories Re-Scaling */ -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( hb_synth_16_fx[n], hb_synth_32_fx[n], L_FRAME48k, sub( Q11, Q_hb_synth_fx ) ); // Q11 - Copy_Scale_sig_16_32_no_sat( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_input ) ); // Q11 // Q_input can get value <= -5 - Copy_Scale_sig_16_32_no_sat( synth_16_fx[n], synth_32_fx[n], L_FRAME48k, sub( Q11, Q_synth_fx ) ); // Q11 -#else - Copy_Scale_sig_16_32_DEPREC( hb_synth_16_fx[n], hb_synth_32_fx[n], L_FRAME48k, sub( Q11, Q_hb_synth_fx ) ); // Q11 - Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_input ) ); // Q11 - Copy_Scale_sig_16_32_DEPREC( synth_16_fx[n], synth_32_fx[n], L_FRAME48k, sub( Q11, Q_synth_fx ) ); // Q11 -#endif + IF( !flaf_swb_tbe ) + { + Copy_Scale_sig_16_32_no_sat( hb_synth_16_fx[n], hb_synth_32_fx[n], L_FRAME48k, sub( Q11, Q_hb_synth_fx ) ); // Q11 + } + Copy_Scale_sig_16_32_no_sat( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_input ) ); // Q11 // Q_input can get value <= -5 + Copy_Scale_sig_16_32_no_sat( synth_16_fx[n], synth_32_fx[n], output_frame, sub( Q11, Q_synth_fx ) ); // Q11 IF( hBWE_FD != NULL ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hBWE_FD->L_old_wtda_swb_fx, hBWE_FD->L_old_wtda_swb_fx32, L_FRAME48k, sub( Q11, hBWE_FD->old_wtda_swb_fx_exp ) ); // Q11 -#else - Copy_Scale_sig_16_32_DEPREC( hBWE_FD->L_old_wtda_swb_fx, hBWE_FD->L_old_wtda_swb_fx32, L_FRAME48k, sub( Q11, hBWE_FD->old_wtda_swb_fx_exp ) ); // Q11 -#endif } IF( hBWE_TD != NULL ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hBWE_TD->old_tbe_synth_fx, hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11 -#else - Copy_Scale_sig_16_32_DEPREC( hBWE_TD->old_tbe_synth_fx, hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11 -#endif } /*---------------------------------------------------------------------* @@ -1110,27 +1054,19 @@ ivas_error ivas_core_dec_fx( * SWB(FB) BWE decoding *---------------------------------------------------------------------*/ - Q_white_exc = 0; - move16(); - - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); test(); test(); test(); test(); + flag_bwe_bws = ( GE_32( output_Fs, 32000 ) && st->core == ACELP_CORE && st->bwidth > NB && st->bws_cnt > 0 && st->bfi == 0 ); + move16(); + + Q_white_exc = 0; + move16(); + test(); test(); - IF( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) || ( NE_16( st->coder_type, AUDIO ) && NE_16( st->coder_type, INACTIVE ) && GE_32( st->core_brate, SID_2k40 ) && EQ_16( st->core, ACELP_CORE ) && !st->con_tcx && GE_32( output_Fs, 32000 ) && GT_16( st->bwidth, NB ) && st->bws_cnt > 0 ) ) + IF( flaf_swb_tbe ) { /* SWB TBE decoder */ ivas_swb_tbe_dec_fx( st, hStereoICBWE, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], old_syn_12k8_16k_fx[n], tmp_buffer_fx /*fb_exc*/, hb_synth_32_fx[n], pitch_buf_fx[n], &Q_white_exc ); @@ -1151,7 +1087,7 @@ ivas_error ivas_core_dec_fx( fb_tbe_dec_ivas_fx( st, tmp_buffer_fx /*fb_exc*/, Q_white_exc, hb_synth_32_fx[n], 0, tmp_buffer_fx /*fb_synth_ref*/, Q_white_exc, output_frame ); } } - ELSE IF( EQ_16( st->extl, SWB_BWE ) || EQ_16( st->extl, FB_BWE ) || ( GE_32( output_Fs, 32000 ) && st->core == ACELP_CORE && st->bwidth > NB && st->bws_cnt > 0 && !st->ppp_mode_dec && !( EQ_16( st->nelp_mode_dec, 1 ) && EQ_16( st->bfi, 1 ) ) ) ) + ELSE IF( EQ_16( st->extl, SWB_BWE ) || EQ_16( st->extl, FB_BWE ) || flag_bwe_bws ) { /* SWB BWE decoder */ Q_syn_hb = swb_bwe_dec_fx32( st, output_32_fx[n], synth_32_fx[n], hb_synth_32_fx[n], use_cldfb_for_dft, output_frame ); @@ -1161,6 +1097,14 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_32_16( hBWE_FD->L_old_wtda_swb_fx32, hBWE_FD->L_old_wtda_swb_fx, output_frame, sub( hBWE_FD->old_wtda_swb_fx_exp, Q11 ) ); // old_wtda_swb_fx_exp } + test(); + test(); + test(); + IF( ( st->core == ACELP_CORE && ( EQ_16( st->extl, -1 ) || EQ_16( st->extl, SWB_CNG ) ) ) && flag_bwe_bws == 0 ) + { + set32_fx( hb_synth_32_fx[n], 0, L_FRAME48k ); + } + /*---------------------------------------------------------------------* * FEC - recovery after lost HQ core (smoothing of the BWE component) *---------------------------------------------------------------------*/ @@ -1184,7 +1128,7 @@ ivas_error ivas_core_dec_fx( { hb_synth_32_fx[n][i] = Mpy_32_16_1( hb_synth_32_fx[n][i], tmp16_2 ); /* Q11 */ move32(); - tmp16_2 = add_o( tmp16_2, tmp16, &Overflow ); /* Q15 */ + tmp16_2 = add_sat( tmp16_2, tmp16 ); /* Q15 */ } } @@ -1204,12 +1148,8 @@ ivas_error ivas_core_dec_fx( q = 2; move16(); - Copy_Scale_sig_32_16( hb_synth_32_fx[n], hb_synth_16_fx[n], L_FRAME48k, -( Q11 ) ); // Q0 -#ifdef MSAN_FIX - Copy_Scale_sig_32_16( synth_32_fx[n], synth_fxl, output_frame, negate( add( Q11, q ) ) ); // Q0 -#else - Copy_Scale_sig_32_16( synth_32_fx[n], synth_fxl, L_FRAME48k, negate( add( Q11, q ) ) ); -#endif + Copy_Scale_sig_32_16( hb_synth_32_fx[n], hb_synth_16_fx[n], L_FRAME48k, -( Q11 ) ); // Q0 + Copy_Scale_sig_32_16( synth_32_fx[n], synth_fxl, output_frame, negate( add( Q11, q ) ) ); // Q0 Scale_sig( hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, sub( Q8, hBWE_TD->prev_Q_bwe_syn ) ); // Q8 Copy_Scale_sig_32_16( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, ( 2 * ALLPASSSECTIONS_STEEP ), sub( hBWE_TD->prev_Q_bwe_syn2, Q11 ) ); // prev_Q_bew_syn2 @@ -1242,7 +1182,6 @@ ivas_error ivas_core_dec_fx( move32(); } stereo_icBWE_dec_fx( hCPE, hb_synth_32_fx[0], hb_synth_32_fx[1], tmp_buffer_fx /*fb_synth_ref*/, voice_factors_fx[0], output_frame, &q, Q_white_exc ); -#ifdef MSAN_FIX test(); test(); test(); @@ -1254,45 +1193,6 @@ ivas_error ivas_core_dec_fx( Scale_sig32( hb_synth_32_fx[0], output_frame, sub( Q11, q ) ); // Q11 Scale_sig32( hb_synth_32_fx[1], output_frame, sub( Q11, q ) ); // Q11 } -#else - Scale_sig32( hb_synth_32_fx[0], L_FRAME48k, sub( Q11, q ) ); - Scale_sig32( hb_synth_32_fx[1], L_FRAME48k, sub( Q11, q ) ); -#endif - } - - IF( EQ_16( st->element_mode, EVS_MONO ) ) - { - /*----------------------------------------------------------------* - * BFI waveform adjustment - *----------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( st->core, ACELP_CORE ) && !st->bfi && st->prev_bfi && GE_32( st->last_total_brate, HQ_48k ) && EQ_16( st->last_codec_mode, MODE2 ) && ( EQ_16( st->last_core_bfi, TCX_20_CORE ) || EQ_16( st->last_core_bfi, TCX_10_CORE ) ) && EQ_16( st->hPlcInfo->concealment_method, TCX_NONTONAL ) && LT_16( st->hPlcInfo->nbLostCmpt, 4 ) ) - { - tmps = NS2SA_FX2( output_Fs, DELAY_CLDFB_NS ); - IF( st->hTonalMDCTConc->q_lastPcmOut != 0 ) - { - Scale_sig( st->hTonalMDCTConc->secondLastPcmOut, shr( st->hPlcInfo->L_frameTCX, 1 ), negate( st->hTonalMDCTConc->q_lastPcmOut ) ); - Scale_sig( st->hTonalMDCTConc->lastPcmOut, st->hPlcInfo->L_frameTCX, negate( st->hTonalMDCTConc->q_lastPcmOut ) ); - st->hTonalMDCTConc->q_lastPcmOut = 0; - move16(); - } - waveform_adj2_fix( st->hPlcInfo, st->hTonalMDCTConc->secondLastPcmOut, synth_16_fx[n] + tmps, tmps, add( st->hPlcInfo->nbLostCmpt, 1 ), st->bfi ); - -#ifdef NONBE_FIX_1402_WAVEADJUST - st->hPlcInfo->Pitch_fx = 0; -#else - st->hPlcInfo->Pitch = 0; -#endif - move16(); - } } /*----------------------------------------------------------------* @@ -1313,17 +1213,8 @@ ivas_error ivas_core_dec_fx( } ELSE { - test(); - IF( EQ_16( st->extl, SWB_BWE_HIGHRATE ) || EQ_16( st->extl, FB_BWE_HIGHRATE ) ) - { - /* HR SWB BWE on top of ACELP@16kHz */ - tmps = NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS ); - } - ELSE - { - /* TBE on top of ACELP@16kHz */ - tmps = NS2SA_FX2( output_Fs, MAX_DELAY_TBE_NS - DELAY_SWB_TBE_16k_NS ); - } + /* TBE on top of ACELP@16kHz */ + tmps = NS2SA_FX2( output_Fs, MAX_DELAY_TBE_NS - DELAY_SWB_TBE_16k_NS ); } /* Smooth transitions when switching between different technologies */ @@ -1476,13 +1367,10 @@ ivas_error ivas_core_dec_fx( IF( st->hHQ_core != NULL ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( st->hHQ_core->old_out_LB_fx, st->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, st->hHQ_core->Q_old_wtda_LB ) ); // Q11 Copy_Scale_sig_16_32_no_sat( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_fx32, L_FRAME48k, sub( Q11, st->hHQ_core->Q_old_wtda ) ); // Q11 -#else - Copy_Scale_sig_16_32_DEPREC( st->hHQ_core->old_out_LB_fx, st->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, st->hHQ_core->Q_old_wtda_LB ) ); // Q11 - Copy_Scale_sig_16_32_DEPREC( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_fx32, L_FRAME48k, sub( Q11, st->hHQ_core->Q_old_wtda ) ); // Q11 -#endif + st->hHQ_core->Q_old_out_fx32 = Q11; + move16(); } IF( NE_16( st->element_mode, IVAS_CPE_DFT ) ) @@ -1541,7 +1429,7 @@ ivas_error ivas_core_dec_fx( *--------------------------------------------------------*/ Word16 exp_max; - Word32 output_fx_loc[L_FRAME48k]; + Word32 *output_fx_loc = synth_32_fx[0]; exp_max = 0; move16(); @@ -1551,8 +1439,7 @@ ivas_error ivas_core_dec_fx( test(); test(); test(); - test(); - IF( ( EQ_16( st->codec_mode, MODE1 ) && st->hTcxDec != NULL ) && ( ( ( st->core == ACELP_CORE ) && !( EQ_16( st->bfi, 1 ) && EQ_16( st->con_tcx, 1 ) ) ) || EQ_16( st->core, HQ_CORE ) ) ) + IF( st->hTcxDec != NULL && ( ( ( st->core == ACELP_CORE ) && !( EQ_16( st->bfi, 1 ) && EQ_16( st->con_tcx, 1 ) ) ) || EQ_16( st->core, HQ_CORE ) ) ) { Word16 exp_prev_synth_buffer = 0, exp_old_out = 0, exp_delay_buf_out = 0, exp_ouput = 0, exp_synth_history = 0; move16(); @@ -1597,24 +1484,20 @@ ivas_error ivas_core_dec_fx( Scale_sig( st->delay_buf_out_fx, NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ), negate( exp_max ) ); // Q0 - } /* n_channels loop */ - - FOR( n = 0; n < n_channels; n++ ) - { - st = sts[n]; - IF( st->cldfbAna ) + IF( st->cldfbAna != NULL ) { scale_sig32( st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_size, ( Q11 - Q10 ) ); // Q11 st->cldfbAna->Q_cldfb_state = Q11; move16(); } - IF( st->cldfbSynHB ) + IF( st->cldfbSynHB != NULL ) { scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->cldfb_size, ( Q11 - Q10 ) ); // Q11 st->cldfbSynHB->Q_cldfb_state = Q11; move16(); } - } + + } /* n_channels loop */ pop_wmops(); return error; diff --git a/lib_dec/ivas_corecoder_dec_reconfig_fx.c b/lib_dec/ivas_corecoder_dec_reconfig_fx.c index 8333f146f594a61de657bee9e9b066119b14e694..288cd9a0373fe7247a3cb4c3f8dbc5ea3c6df7ef 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig_fx.c +++ b/lib_dec/ivas_corecoder_dec_reconfig_fx.c @@ -342,7 +342,7 @@ ivas_error ivas_corecoder_dec_reconfig_fx( } ELSE IF( st_ivas->hMCT != NULL && GT_16( st_ivas->nCPE, 1 ) ) { - IF( NE_32( ( error = mct_dec_reconfigure_fx( st_ivas, (UWord16) NE_16( st_ivas->nchan_transport, nchan_transport_old ) ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = mct_dec_reconfigure_fx( st_ivas, (UWord16) NE_16( nchan_transport_real, nchan_transport_old ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -444,7 +444,9 @@ ivas_error ivas_corecoder_dec_reconfig_fx( *-----------------------------------------------------------------*/ test(); - IF( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) || EQ_16( st_ivas->ivas_format, MASA_FORMAT ) ) + test(); + test(); + IF( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) || EQ_16( st_ivas->ivas_format, MASA_FORMAT ) || EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { ivas_sba_set_cna_cng_flag( st_ivas ); } @@ -567,7 +569,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( hDecoderConfig = st_ivas->hDecoderConfig; - ivas_init_dec_get_num_cldfb_instances_ivas_fx( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); + ivas_init_dec_get_num_cldfb_instances_fx( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); /* special case, if there was one transport channel in the previous frame and more than one in the current frame, remove the second CLDFB here, it was for CNA/CNG */ @@ -576,7 +578,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( test(); IF( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) && EQ_16( nchan_transport_old, 1 ) && EQ_16( numCldfbAnalyses_old, 2 ) && GT_16( st_ivas->nchan_transport, 1 ) ) { - deleteCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[1] ) ); + deleteCldfb_fx( &( st_ivas->cldfbAnaDec[1] ) ); numCldfbAnalyses_old = sub( numCldfbAnalyses_old, 1 ); } /* resample CLDFB analysis instances */ @@ -594,7 +596,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( /* delete superfluous CLDFB synthesis instances */ FOR( i = numCldfbAnalyses; i < numCldfbAnalyses_old; i++ ) { - deleteCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ) ); + deleteCldfb_fx( &( st_ivas->cldfbAnaDec[i] ) ); } } ELSE IF( LT_16( numCldfbAnalyses_old, numCldfbAnalyses ) ) @@ -614,7 +616,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( /* delete superfluous CLDFB synthesis instances */ FOR( i = numCldfbSyntheses; i < numCldfbSyntheses_old; i++ ) { - deleteCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ) ); + deleteCldfb_fx( &( st_ivas->cldfbSynDec[i] ) ); } } ELSE IF( LT_16( numCldfbSyntheses_old, numCldfbSyntheses ) ) diff --git a/lib_dec/ivas_cpe_dec_fx.c b/lib_dec/ivas_cpe_dec_fx.c index 05fec7736b263716311dfd87dec696ec4fa5aae0..7a134d59bed246fc942c44990d849f1ae34fed71 100644 --- a/lib_dec/ivas_cpe_dec_fx.c +++ b/lib_dec/ivas_cpe_dec_fx.c @@ -51,6 +51,8 @@ static void read_stereo_mode_and_bwidth_fx( CPE_DEC_HANDLE hCPE, const Decoder_S static void stereo_mode_combined_format_dec_fx( const Decoder_Struct *st_ivas, CPE_DEC_HANDLE hCPE ); +static ivas_error stereo_dft_dec_main( CPE_DEC_HANDLE hCPE, const Word32 ivas_total_brate, const Word16 n_channels, Word32 *p_res_buf_fx, Word32 *output[], Word32 outputHB[][L_FRAME48k], const Word16 output_frame, const Word32 output_Fs ); + /*--------------------------------------------------------------------------* * ivas_cpe_dec_fx() @@ -71,20 +73,17 @@ ivas_error ivas_cpe_dec_fx( Word16 last_bwidth; Word16 tdm_ratio_idx; Word32 outputHB_fx[CPE_CHANNELS][L_FRAME48k]; /* buffer for output HB synthesis, both channels */ /* Q11 */ - Word16 q_res_buf; - Word32 res_buf_fx[STEREO_DFT_N_8k]; /* Q(q_res_buf) */ + Word32 *res_buf_fx = NULL; /* Q8 */ CPE_DEC_HANDLE hCPE; + STEREO_DFT_CONFIG_DATA_HANDLE hConfigDft; Decoder_State **sts; Word32 ivas_total_brate; ivas_error error; Word32 cpe_brate; Word32 element_brate_ref; - Word32 quo, rem; error = IVAS_ERR_OK; move32(); - q_res_buf = Q8; - move16(); push_wmops( "ivas_cpe_dec" ); @@ -124,23 +123,15 @@ ivas_error ivas_cpe_dec_fx( test(); IF( hCPE->hCoreCoder[ind1] && hCPE->hCoreCoder[ind1]->hHQ_core ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_fx32, L_FRAME48k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda ) ); // Q11 -#else - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_fx32, L_FRAME48k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda ) ); // Q11 -#endif } } FOR( Word16 ind1 = 0; ind1 < 2; ind1++ ) { IF( hCPE->hCoreCoder[ind1]->hHQ_core ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB ) ); // Q11 -#else - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB ) ); // Q11 -#endif - hCPE->hCoreCoder[ind1]->hHQ_core->q_old_outLB_fx = Q11; + hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_out_fx32 = Q11; move16(); } } @@ -163,10 +154,16 @@ ivas_error ivas_cpe_dec_fx( test(); IF( hCPE->hCoreCoder[ind1] && hCPE->hCoreCoder[ind1]->hHQ_core ) { - Copy_Scale_sig_32_16( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB, Q11 ) ); // Q_old_wtda + Copy_Scale_sig_32_16( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB, Q11 ) ); // Q_old_wtda_LB } } + hConfigDft = NULL; + if ( hCPE->hStereoDft != NULL ) + { + hConfigDft = hCPE->hStereoDft->hConfig; + } + /*------------------------------------------------------------------* * Initialization *-----------------------------------------------------------------*/ @@ -230,25 +227,16 @@ ivas_error ivas_cpe_dec_fx( test(); IF( NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) && ( NE_32( hCPE->element_brate, hCPE->last_element_brate ) || NE_16( hCPE->last_element_mode, hCPE->element_mode ) || sts[0]->ini_frame == 0 || ( NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) ) ) { - STEREO_DFT_CONFIG_DATA_HANDLE hConfig; - IF( hCPE->hStereoDft == NULL ) - { - hConfig = NULL; - } - ELSE - { - hConfig = hCPE->hStereoDft->hConfig; - } test(); IF( st_ivas->hQMetaData != NULL && GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) { IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - stereo_dft_config_fx( hConfig, L_mult0( st_ivas->hQMetaData->bits_frame_nominal, 35 /* 0.7f * FRAMES_PER_SEC */ ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + stereo_dft_config_fx( hConfigDft, L_mult0( st_ivas->hQMetaData->bits_frame_nominal, 35 /* 0.7f * FRAMES_PER_SEC */ ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } ELSE { - stereo_dft_config_fx( hConfig, L_mult0( st_ivas->hQMetaData->bits_frame_nominal, FRAMES_PER_SEC ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + stereo_dft_config_fx( hConfigDft, L_mult0( st_ivas->hQMetaData->bits_frame_nominal, FRAMES_PER_SEC ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } } ELSE @@ -256,11 +244,11 @@ ivas_error ivas_cpe_dec_fx( /* Note: This only works for stereo operation. If DTX would be applied for multiple CPEs a different bitrate signaling is needed */ IF( LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) { - stereo_dft_config_fx( hConfig, ivas_total_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + stereo_dft_config_fx( hConfigDft, ivas_total_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } ELSE { - stereo_dft_config_fx( hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + stereo_dft_config_fx( hConfigDft, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } } } @@ -269,9 +257,9 @@ ivas_error ivas_cpe_dec_fx( { IF( hCPE->hStereoTD->tdm_LRTD_flag ) { - iDiv_and_mod_32( L_shr( hCPE->element_brate, 1 ), FRAMES_PER_SEC, &quo, &rem, 0 ); - sts[0]->bits_frame_nominal = extract_l( quo ); - sts[1]->bits_frame_nominal = extract_l( quo ); + i = extract_l( Mpy_32_32_r( L_shr( hCPE->element_brate, 1 ), ONE_BY_FRAMES_PER_SEC_Q31 ) ); + sts[0]->bits_frame_nominal = i; + sts[1]->bits_frame_nominal = i; move16(); move16(); } @@ -316,23 +304,22 @@ ivas_error ivas_cpe_dec_fx( move32(); IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - iDiv_and_mod_32( cpe_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); - sts[1]->bit_stream = sts[0]->bit_stream + sub( sub( extract_l( quo ), 1 ), nb_bits_metadata ); + i = extract_l( Mpy_32_32_r( cpe_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + sts[1]->bit_stream = sts[0]->bit_stream + sub( sub( i, 1 ), nb_bits_metadata ); IF( hCPE->brate_surplus < 0 ) { - iDiv_and_mod_32( L_abs( hCPE->brate_surplus ), FRAMES_PER_SEC, &quo, &rem, 0 ); - quo = L_negate( quo ); + i = negate( extract_l( Mpy_32_32_r( L_abs( hCPE->brate_surplus ), ONE_BY_FRAMES_PER_SEC_Q31 ) ) ); } ELSE { - iDiv_and_mod_32( hCPE->brate_surplus, FRAMES_PER_SEC, &quo, &rem, 0 ); + i = extract_l( Mpy_32_32_r( hCPE->brate_surplus, ONE_BY_FRAMES_PER_SEC_Q31 ) ); } - sts[1]->bit_stream = sts[1]->bit_stream + extract_l( quo ); + sts[1]->bit_stream = sts[1]->bit_stream + i; } ELSE { - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); - sts[1]->bit_stream = sts[0]->bit_stream + sub( sub( extract_l( quo ), 1 ), nb_bits_metadata ); + i = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + sts[1]->bit_stream = sts[0]->bit_stream + sub( sub( i, 1 ), nb_bits_metadata ); } IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) @@ -355,15 +342,16 @@ ivas_error ivas_cpe_dec_fx( } ELSE { + res_buf_fx = outputHB_fx[0]; /* note: temporarily reused buffer */ + test(); IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { nb_bits = sub( nb_bits, nb_bits_metadata ); IF( hCPE->brate_surplus < 0 ) { - iDiv_and_mod_32( L_abs( hCPE->brate_surplus ), FRAMES_PER_SEC, &quo, &rem, 0 ); - quo = L_negate( quo ); - nb_bits = add( nb_bits, extract_l( quo ) ); + i = negate( extract_l( Mpy_32_32_r( L_abs( hCPE->brate_surplus ), ONE_BY_FRAMES_PER_SEC_Q31 ) ) ); + nb_bits = add( nb_bits, i ); } } @@ -395,19 +383,17 @@ ivas_error ivas_cpe_dec_fx( /* signal bitrate for BW selection in the SCh */ sts[0]->bits_frame_channel = 0; move16(); - iDiv_and_mod_32( hCPE->element_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); - sts[1]->bits_frame_channel = extract_l( quo ); + sts[1]->bits_frame_channel = extract_l( Mpy_32_32_r( hCPE->element_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); move16(); IF( hCPE->brate_surplus < 0 ) { - iDiv_and_mod_32( L_abs( hCPE->brate_surplus ), FRAMES_PER_SEC, &quo, &rem, 0 ); - quo = L_negate( quo ); + i = negate( extract_l( Mpy_32_32_r( L_abs( hCPE->brate_surplus ), ONE_BY_FRAMES_PER_SEC_Q31 ) ) ); } ELSE { - iDiv_and_mod_32( hCPE->brate_surplus, FRAMES_PER_SEC, &quo, &rem, 0 ); + i = extract_l( Mpy_32_32_r( hCPE->brate_surplus, ONE_BY_FRAMES_PER_SEC_Q31 ) ); } - sts[1]->bits_frame_channel = add( sts[1]->bits_frame_channel, extract_l( quo ) ); + sts[1]->bits_frame_channel = add( sts[1]->bits_frame_channel, i ); move16(); IF( st_ivas->hQMetaData != NULL ) { @@ -425,14 +411,13 @@ ivas_error ivas_cpe_dec_fx( { IF( hCPE->brate_surplus < 0 ) { - iDiv_and_mod_32( L_abs( hCPE->brate_surplus ), FRAMES_PER_SEC, &quo, &rem, 0 ); - quo = L_negate( quo ); + i = negate( extract_l( Mpy_32_32_r( L_abs( hCPE->brate_surplus ), ONE_BY_FRAMES_PER_SEC_Q31 ) ) ); } ELSE { - iDiv_and_mod_32( hCPE->brate_surplus, FRAMES_PER_SEC, &quo, &rem, 0 ); + i = extract_l( Mpy_32_32_r( hCPE->brate_surplus, ONE_BY_FRAMES_PER_SEC_Q31 ) ); } - brate_surplus[0] = L_shr( L_mult( extract_l( L_shr( quo, 1 ) ), FRAMES_PER_SEC ), 1 ); + brate_surplus[0] = L_shr( L_mult( shr( i, 1 ), FRAMES_PER_SEC ), 1 ); move32(); brate_surplus[1] = L_sub( hCPE->brate_surplus, brate_surplus[0] ); move32(); @@ -463,10 +448,9 @@ ivas_error ivas_cpe_dec_fx( sts[n]->total_brate = hCPE->element_brate; move32(); } - iDiv_and_mod_32( sts[n]->total_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); - sts[n]->bits_frame_nominal = extract_l( quo ); - iDiv_and_mod_32( hCPE->element_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); - sts[n]->bits_frame_channel = extract_l( L_shr( quo, sub( n_channels, 1 ) ) ); + sts[n]->bits_frame_nominal = extract_l( Mpy_32_32_r( sts[n]->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + i = extract_l( Mpy_32_32_r( hCPE->element_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + sts[n]->bits_frame_channel = shr( i, sub( n_channels, 1 ) ); move16(); move16(); @@ -477,14 +461,13 @@ ivas_error ivas_cpe_dec_fx( { IF( brate_surplus[n] < 0 ) { - iDiv_and_mod_32( L_abs( brate_surplus[n] ), FRAMES_PER_SEC, &quo, &rem, 0 ); - quo = L_negate( quo ); + i = negate( extract_l( Mpy_32_32_r( L_abs( brate_surplus[n] ), ONE_BY_FRAMES_PER_SEC_Q31 ) ) ); } ELSE { - iDiv_and_mod_32( brate_surplus[n], FRAMES_PER_SEC, &quo, &rem, 0 ); + i = extract_l( Mpy_32_32_r( brate_surplus[n], ONE_BY_FRAMES_PER_SEC_Q31 ) ); } - sts[n]->bits_frame_channel = add( sts[n]->bits_frame_channel, extract_l( quo ) ); + sts[n]->bits_frame_channel = add( sts[n]->bits_frame_channel, i ); sts[n]->total_brate = L_add( sts[n]->total_brate, brate_surplus[n] ); move16(); move32(); @@ -539,10 +522,15 @@ ivas_error ivas_cpe_dec_fx( move16(); sts[n]->active_cnt = 0; move16(); - if ( sts[1] != NULL ) + IF( sts[1] != NULL ) { sts[1]->active_cnt = 0; move16(); + if ( sts[1]->ini_frame == 0 ) + { + sts[1]->active_cnt = CNG_TYPE_HO; + move16(); + } } } ELSE @@ -550,7 +538,7 @@ ivas_error ivas_cpe_dec_fx( sts[n]->VAD = 1; move16(); sts[n]->active_cnt = add( sts[n]->active_cnt, 1 ); - sts[n]->active_cnt = s_min( sts[n]->active_cnt, 100 ); + sts[n]->active_cnt = s_min( sts[n]->active_cnt, 200 ); move16(); move16(); } @@ -577,8 +565,8 @@ ivas_error ivas_cpe_dec_fx( { tdm_configure_dec_fx( st_ivas->ivas_format, st_ivas->ism_mode, hCPE, &tdm_ratio_idx, nb_bits_metadata ); - iDiv_and_mod_32( sts[0]->total_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); - sts[1]->bit_stream = sts[0]->bit_stream + extract_l( quo ); + i = extract_l( Mpy_32_32_r( sts[0]->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + sts[1]->bit_stream = sts[0]->bit_stream + i; } ELSE { @@ -595,7 +583,7 @@ ivas_error ivas_cpe_dec_fx( test(); test(); - IF( NE_16( hCPE->element_mode, IVAS_CPE_DFT ) || ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) ) + IF( NE_16( hCPE->element_mode, IVAS_CPE_DFT ) || ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hConfigDft->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) ) { IF( NE_32( ( error = ivas_core_dec_fx( st_ivas, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB_fx, NULL, st_ivas->sba_dirac_stereo_flag ) ), IVAS_ERR_OK ) ) { @@ -613,174 +601,15 @@ ivas_error ivas_cpe_dec_fx( /*----------------------------------------------------------------* * Stereo decoder & upmixing *----------------------------------------------------------------*/ + test(); test(); - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && !( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) ) + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && !( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hConfigDft->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) ) { - Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX]; // q_dft - set32_fx( DFT_fx[0], 0, STEREO_DFT_BUF_MAX ); - set32_fx( DFT_fx[1], 0, STEREO_DFT_BUF_MAX ); - - /* core decoder */ - IF( NE_32( ( error = ivas_core_dec_fx( NULL, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB_fx, DFT_fx, 0 ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = stereo_dft_dec_main( hCPE, ivas_total_brate, n_channels, res_buf_fx, output, outputHB_fx, output_frame, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) { return error; } - - // Scaling of DFT's - Word16 shift; - Word32 tmp1, tmp2; - Word16 shift1, shift2; - maximum_abs_32_fx( DFT_fx[0], STEREO_DFT_BUF_MAX, &tmp1 ); - maximum_abs_32_fx( DFT_fx[1], STEREO_DFT_BUF_MAX, &tmp2 ); - - IF( tmp1 == 0 ) - { - shift1 = Q31; - move16(); - } - ELSE - { - shift1 = norm_l( tmp1 ); - } - IF( tmp2 == 0 ) - { - shift2 = Q31; - move16(); - } - ELSE - { - shift2 = norm_l( tmp2 ); - } - shift = s_min( shift1, shift2 ); - - IF( NE_16( shift, 31 ) ) - { - shift = sub( add( hCPE->hStereoDft->q_dft, shift ), Q15 ); /* Q15 for guard bits */ - - IF( GT_16( shift, hCPE->hStereoDft->q_dft ) ) - { - Scale_sig32( DFT_fx[0], STEREO_DFT_BUF_MAX, sub( shift, hCPE->hStereoDft->q_dft ) ); // shift - Scale_sig32( DFT_fx[1], STEREO_DFT_BUF_MAX, sub( shift, hCPE->hStereoDft->q_dft ) ); // shift - hCPE->hStereoDft->q_dft = shift; - move16(); - } - } - ELSE - { - hCPE->hStereoDft->q_dft = Q8; - move16(); - } - - /* DFT Stereo residual decoding */ - test(); - IF( hCPE->hStereoDft->res_cod_band_max > 0 && !st_ivas->bfi ) - { - Word16 q; - Word16 q_out_DFT[2]; - - q = Q11; - move16(); - - Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->old_pitch_buf_fx, hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, ( ( 2 * NB_SUBFR16k ) + 2 ), -( Q10 ) ); // Q16->Q6 - - stereo_dft_dec_res_fx( hCPE, res_buf_fx, q_res_buf, output[1] ); - - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, hCPE->hCoreCoder[0]->old_pitch_buf_fx, ( ( 2 * NB_SUBFR16k ) + 2 ), 10 ); // Q6->Q16 - - Scale_sig32( output[1], L_FRAME8k, ( Q11 - Q15 ) ); // Q15 -> Q11 - - q_out_DFT[0] = q_out_DFT[1] = hCPE->hStereoDft->q_dft; - move16(); - move16(); - - stereo_dft_dec_analyze_fx( hCPE, output[1], DFT_fx, 1, L_FRAME8k, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0, &q, q_out_DFT ); - - Scale_sig32( DFT_fx[1], STEREO_DFT_BUF_MAX, sub( hCPE->hStereoDft->q_dft, q_out_DFT[1] ) ); // q_dft - } - - /* DFT stereo CNG */ - { - Word16 q_dft; - - q_dft = hCPE->hStereoDft->q_dft; - move16(); - - stereo_dtf_cng_fx( hCPE, ivas_total_brate, DFT_fx, output_frame, q_dft ); - } - - /* decoding */ - IF( EQ_16( hCPE->nchan_out, 1 ) ) - { - IF( EQ_16( hCPE->hStereoDft->first_frame, 1 ) ) - { - hCPE->hStereoDft->q_smoothed_nrg = hCPE->hStereoDft->q_dft; - move16(); - FOR( Word16 ii = 0; ii < (Word16) ( sizeof( hCPE->hStereoDft->q_DFT_past_DMX_fx ) / sizeof( hCPE->hStereoDft->q_DFT_past_DMX_fx[0] ) ); ii++ ) - { - hCPE->hStereoDft->q_DFT_past_DMX_fx[ii] = hCPE->hStereoDft->q_dft; - move16(); - } - hCPE->hStereoDft->first_frame = 0; - move16(); - } - - scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( hCPE->hStereoDft->q_dft, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // q_dft - hCPE->hStereoDft->q_res_cod_mem_fx = hCPE->hStereoDft->q_dft; - move16(); - stereo_dft_unify_dmx_fx( hCPE->hStereoDft, sts[0], DFT_fx, hCPE->input_mem_fx[1], hCPE->hStereoCng->prev_sid_nodata ); - scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q15, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q15 - hCPE->hStereoDft->q_res_cod_mem_fx = Q15; - move16(); - } - ELSE - { - { - IF( EQ_16( hCPE->hStereoDft->first_frame, 1 ) ) - { - hCPE->hStereoDft->q_smoothed_nrg = hCPE->hStereoDft->q_dft; - move16(); - FOR( Word16 ii = 0; ii < (Word16) ( sizeof( hCPE->hStereoDft->q_DFT_past_DMX_fx ) / sizeof( hCPE->hStereoDft->q_DFT_past_DMX_fx[0] ) ); ii++ ) - { - hCPE->hStereoDft->q_DFT_past_DMX_fx[ii] = hCPE->hStereoDft->q_dft; - move16(); - } - hCPE->hStereoDft->first_frame = 0; - move16(); - } - - scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( hCPE->hStereoDft->q_dft, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // q_dft - hCPE->hStereoDft->q_res_cod_mem_fx = hCPE->hStereoDft->q_dft; - move16(); - } - stereo_dft_dec_fx( hCPE->hStereoDft, sts[0], DFT_fx, hCPE->input_mem_fx[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); - scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q15, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q15 - hCPE->hStereoDft->q_res_cod_mem_fx = Q15; - move16(); - } - - FOR( n = 0; n < hCPE->nchan_out; n++ ) - { - Scale_sig32( output[n], L_FRAME48k, sub( hCPE->hStereoDft->q_dft, Q11 ) ); // q_dft - scale_sig32( hCPE->output_mem_fx[n], NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( hCPE->hStereoDft->q_dft, Q11 ) ); // q_dft - hCPE->q_output_mem_fx[n] = hCPE->hStereoDft->q_dft; - move16(); - } - - /* synthesis iFFT */ - FOR( n = 0; n < hCPE->nchan_out; n++ ) - { - stereo_dft_dec_synthesize_fx( hCPE, DFT_fx, n, output[n], output_frame ); - } - - // delete below - FOR( n = 0; n < hCPE->nchan_out; n++ ) - { - Scale_sig32( output[n], L_FRAME48k, sub( Q11, hCPE->hStereoDft->q_dft ) ); // Q11 - scale_sig32( hCPE->output_mem_fx[n], NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); // Q11 - hCPE->q_output_mem_fx[n] = Q11; - move16(); - } } ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) { @@ -820,7 +649,6 @@ ivas_error ivas_cpe_dec_fx( * Update parameters for stereo CNA *----------------------------------------------------------------*/ - // stereo_cna_update_params( hCPE, output_flt, output_frame, tdm_ratio_idx ); stereo_cna_update_params_fx( hCPE, output, output_frame, tdm_ratio_idx ); /*----------------------------------------------------------------* @@ -854,7 +682,6 @@ ivas_error ivas_cpe_dec_fx( stereo_tca_dec_fx( hCPE, output, output_frame ); - /*----------------------------------------------------------------* * Common Stereo updates *----------------------------------------------------------------*/ @@ -887,6 +714,203 @@ ivas_error ivas_cpe_dec_fx( } +/*------------------------------------------------------------------------- + * stereo_dft_dec_main() + * + * DFT decoder main function + *-------------------------------------------------------------------------*/ + +static ivas_error stereo_dft_dec_main( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 n_channels, /* i : number of channels to be decoded */ + Word32 *p_res_buf_fx, /* i : DFT stereo residual S signal */ + Word32 *output[], /* o : output synthesis signal */ + Word32 outputHB_fx[][L_FRAME48k], /* o : output HB synthesis signal */ + const Word16 output_frame, /* i : output frame length per channel */ + const Word32 output_Fs /* i : output sampling rate */ +) +{ + Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX]; + Word32 res_buf_fx[STEREO_DFT_N_8k]; /* Q(q_res_buf) */ + Word16 n; + Word16 q_res_buf, q_dft; + Decoder_State *st0; + ivas_error error; + Word16 shift; + Word32 tmp1, tmp2; + Word16 shift1, shift2; + + st0 = hCPE->hCoreCoder[0]; + + q_res_buf = Q8; + move16(); + + set32_fx( DFT_fx[0], 0, STEREO_DFT_BUF_MAX ); + set32_fx( DFT_fx[1], 0, STEREO_DFT_BUF_MAX ); + + /* copy from temporary buffer */ + test(); + IF( hCPE->hStereoDft->res_cod_band_max > 0 && !st0->bfi ) + { + Copy32( p_res_buf_fx, res_buf_fx, STEREO_DFT_N_8k ); + } + + /* core decoder */ + IF( NE_32( ( error = ivas_core_dec_fx( NULL, NULL, hCPE, NULL, n_channels, output, outputHB_fx, DFT_fx, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* Scaling of DFT's */ + maximum_abs_32_fx( DFT_fx[0], STEREO_DFT_BUF_MAX, &tmp1 ); + maximum_abs_32_fx( DFT_fx[1], STEREO_DFT_BUF_MAX, &tmp2 ); + + IF( tmp1 == 0 ) + { + shift1 = Q31; + move16(); + } + ELSE + { + shift1 = norm_l( tmp1 ); + } + IF( tmp2 == 0 ) + { + shift2 = Q31; + move16(); + } + ELSE + { + shift2 = norm_l( tmp2 ); + } + shift = s_min( shift1, shift2 ); + + IF( NE_16( shift, 31 ) ) + { + shift = sub( add( hCPE->hStereoDft->q_dft, shift ), Q17 ); /* Q17 for guard bits */ + + IF( GT_16( shift, hCPE->hStereoDft->q_dft ) ) + { + Scale_sig32( DFT_fx[0], STEREO_DFT_BUF_MAX, sub( shift, hCPE->hStereoDft->q_dft ) ); // shift + Scale_sig32( DFT_fx[1], STEREO_DFT_BUF_MAX, sub( shift, hCPE->hStereoDft->q_dft ) ); // shift + hCPE->hStereoDft->q_dft = shift; + move16(); + } + } + ELSE + { + hCPE->hStereoDft->q_dft = Q8; + move16(); + } + + /* DFT Stereo residual decoding */ + test(); + IF( hCPE->hStereoDft->res_cod_band_max > 0 && !st0->bfi ) + { + Word16 q; + Word16 q_out_DFT[2]; + + q = Q11; + move16(); + + Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->old_pitch_buf_fx, hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, ( ( 2 * NB_SUBFR16k ) + 2 ), -( Q10 ) ); // Q16->Q6 + + stereo_dft_dec_res_fx( hCPE, res_buf_fx, q_res_buf, output[1] ); + + Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, hCPE->hCoreCoder[0]->old_pitch_buf_fx, ( ( 2 * NB_SUBFR16k ) + 2 ), 10 ); // Q6->Q16 + + Scale_sig32( output[1], L_FRAME8k, ( Q11 - Q15 ) ); // Q15 -> Q11 + + q_out_DFT[0] = q_out_DFT[1] = hCPE->hStereoDft->q_dft; + move16(); + move16(); + + stereo_dft_dec_analyze_fx( hCPE, output[1], DFT_fx, 1, L_FRAME8k, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0, &q, q_out_DFT ); + + Scale_sig32( DFT_fx[1], STEREO_DFT_BUF_MAX, sub( hCPE->hStereoDft->q_dft, q_out_DFT[1] ) ); // q_dft + } + + /* DFT stereo CNG */ + q_dft = hCPE->hStereoDft->q_dft; + move16(); + stereo_dtf_cng_fx( hCPE, ivas_total_brate, DFT_fx, output_frame, q_dft ); + + /* decoding */ + IF( EQ_16( hCPE->nchan_out, 1 ) ) + { + IF( EQ_16( hCPE->hStereoDft->first_frame, 1 ) ) + { + hCPE->hStereoDft->q_smoothed_nrg = hCPE->hStereoDft->q_dft; + move16(); + FOR( Word16 ii = 0; ii < (Word16) ( sizeof( hCPE->hStereoDft->q_DFT_past_DMX_fx ) / sizeof( hCPE->hStereoDft->q_DFT_past_DMX_fx[0] ) ); ii++ ) + { + hCPE->hStereoDft->q_DFT_past_DMX_fx[ii] = hCPE->hStereoDft->q_dft; + move16(); + } + hCPE->hStereoDft->first_frame = 0; + move16(); + } + + scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( hCPE->hStereoDft->q_dft, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // q_dft + hCPE->hStereoDft->q_res_cod_mem_fx = hCPE->hStereoDft->q_dft; + move16(); + stereo_dft_unify_dmx_fx( hCPE->hStereoDft, st0, DFT_fx, hCPE->input_mem_fx[1], hCPE->hStereoCng->prev_sid_nodata ); + scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q15, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q15 + hCPE->hStereoDft->q_res_cod_mem_fx = Q15; + move16(); + } + ELSE + { + IF( EQ_16( hCPE->hStereoDft->first_frame, 1 ) ) + { + hCPE->hStereoDft->q_smoothed_nrg = hCPE->hStereoDft->q_dft; + move16(); + FOR( Word16 ii = 0; ii < (Word16) ( sizeof( hCPE->hStereoDft->q_DFT_past_DMX_fx ) / sizeof( hCPE->hStereoDft->q_DFT_past_DMX_fx[0] ) ); ii++ ) + { + hCPE->hStereoDft->q_DFT_past_DMX_fx[ii] = hCPE->hStereoDft->q_dft; + move16(); + } + hCPE->hStereoDft->first_frame = 0; + move16(); + } + + scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( hCPE->hStereoDft->q_dft, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // q_dft + hCPE->hStereoDft->q_res_cod_mem_fx = hCPE->hStereoDft->q_dft; + move16(); + + stereo_dft_dec_fx( hCPE->hStereoDft, st0, DFT_fx, hCPE->input_mem_fx[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); + scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q15, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q15 + hCPE->hStereoDft->q_res_cod_mem_fx = Q15; + move16(); + } + + FOR( n = 0; n < hCPE->nchan_out; n++ ) + { + Scale_sig32( output[n], output_frame, sub( hCPE->hStereoDft->q_dft, Q11 ) ); // q_dft + scale_sig32( hCPE->output_mem_fx[n], NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ), sub( hCPE->hStereoDft->q_dft, Q11 ) ); // q_dft + hCPE->q_output_mem_fx[n] = hCPE->hStereoDft->q_dft; + move16(); + } + + /* synthesis iFFT */ + FOR( n = 0; n < hCPE->nchan_out; n++ ) + { + stereo_dft_dec_synthesize_fx( hCPE, DFT_fx, n, output[n], output_frame ); + } + + FOR( n = 0; n < hCPE->nchan_out; n++ ) + { + Scale_sig32( output[n], output_frame, sub( Q11, hCPE->hStereoDft->q_dft ) ); // Q11 + scale_sig32( hCPE->output_mem_fx[n], NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); // Q11 + hCPE->q_output_mem_fx[n] = Q11; + move16(); + } + + return IVAS_ERR_OK; +} + + /*------------------------------------------------------------------------- * create_cpe_dec_fx() * @@ -1098,7 +1122,7 @@ ivas_error create_cpe_dec( st->is_ism_format = 0; move16(); - IF( NE_32( ( error = init_decoder_ivas_fx( st, n, st_ivas->mc_mode ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = init_decoder_fx( st, n, st_ivas->mc_mode ) ), IVAS_ERR_OK ) ) { return error; } @@ -1272,7 +1296,7 @@ void destroy_cpe_dec( IF( hCPE->hStereoDft != NULL ) { - stereo_dft_dec_destroy( &( hCPE->hStereoDft ) ); + stereo_dft_dec_destroy_fx( &( hCPE->hStereoDft ) ); hCPE->hStereoDft = NULL; } diff --git a/lib_dec/ivas_decision_matrix_dec_fx.c b/lib_dec/ivas_decision_matrix_dec_fx.c index 717bb3b93512bdd8818088c6a585e9a2376d71b6..e0d9c6ac6f8a83b5e57d060b53bd16788534d8e4 100644 --- a/lib_dec/ivas_decision_matrix_dec_fx.c +++ b/lib_dec/ivas_decision_matrix_dec_fx.c @@ -33,7 +33,7 @@ #include #include "options.h" #include "stat_dec.h" -#include "rom_com.h" +#include "ivas_rom_com.h" #include "prot_fx.h" #include "ivas_cnst.h" #include "wmc_auto.h" @@ -46,9 +46,6 @@ * Read ACELP signaling bits from the bitstream * Set extension layers *-----------------------------------------------------------------*/ -static Word16 get_next_index_4_by_15[16] = { - 0, 2184, 4369, 6553, 8738, 10922, 13107, 15291, 17476, 19660, 21845, 24029, 26214, 28398, 30583, 32767 -}; void ivas_decision_matrix_dec_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 *sharpFlag, /* o : formant sharpening flag */ @@ -129,10 +126,9 @@ void ivas_decision_matrix_dec_fx( /* read channel coherence */ Word16 index; index = get_next_indice_fx( st, 4 ); - st->hFdCngDec->hFdCngCom->coherence_fx = get_next_index_4_by_15[index]; + st->hFdCngDec->hFdCngCom->coherence_fx[0] = get_next_index_4_by_15[index]; move16(); - /* read flag for no side noise shape */ st->hFdCngDec->hFdCngCom->no_side_flag = get_next_indice_fx( st, 1 ); move16(); diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index ae4098f19c240b7af12eb7ed5b0e1b42c3ccd875..9ddcfe4e564a8edac2744eb5b095e1ac07dc2a4e 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -42,12 +42,13 @@ #include "ivas_rom_dec.h" #include "ivas_rom_rend.h" #include "wmc_auto.h" -#include "ivas_rom_com_fx.h" #include "ivas_prot_fx.h" + /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ + static ivas_error ivas_dirac_dec_config_internal_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const DIRAC_CONFIG_FLAG flag_config_inp /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ @@ -798,8 +799,10 @@ static ivas_error ivas_dirac_rend_config_fx( nchan_transport_tmp = nchan_transport; move16(); } + /* close and reopen the decorrelator */ ivas_dirac_dec_decorr_close_fx( &hDirACRend->h_freq_domain_decorr_ap_params, &hDirACRend->h_freq_domain_decorr_ap_state ); + IF( NE_32( ( error = ivas_dirac_dec_decorr_open_fx( &( hDirACRend->h_freq_domain_decorr_ap_params ), &( hDirACRend->h_freq_domain_decorr_ap_state ), hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_diff, hDirACRend->num_protos_diff, hDirACRend->synthesisConf, hDirACRend->frequency_axis_fx, nchan_transport_tmp, output_Fs ) ), IVAS_ERR_OK ) ) @@ -957,11 +960,14 @@ static ivas_error ivas_dirac_rend_config_fx( return error; } + + /*------------------------------------------------------------------------- * ivas_dirac_dec_config() * * Open or reconfigure decoder DirAC/MASA handle *-------------------------------------------------------------------------*/ + ivas_error ivas_dirac_dec_config_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const DIRAC_CONFIG_FLAG flag_config_inp /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ @@ -978,6 +984,7 @@ ivas_error ivas_dirac_dec_config_fx( Word16 need_parambin; Word16 dec_param_estim_old; Word16 dec_param_estim_new; + Word16 num_poses, pos_idx; error = IVAS_ERR_OK; move32(); @@ -1008,6 +1015,14 @@ ivas_error ivas_dirac_dec_config_fx( move16(); } + num_poses = 1; + move16(); + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + num_poses = st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; + move16(); + } + sparfoa_flag = 0; move16(); test(); @@ -1054,7 +1069,7 @@ ivas_error ivas_dirac_dec_config_fx( IF( !need_parambin ) { - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); + ivas_dirac_dec_close_binaural_data_fx( st_ivas->hDiracDecBin ); } need_dirac_rend = 0; @@ -1093,12 +1108,14 @@ ivas_error ivas_dirac_dec_config_fx( common_rend_config_flag = flag_config_inp; move32(); } + IF( NE_32( ( error = ivas_spat_hSpatParamRendCom_config_fx( &st_ivas->hSpatParamRendCom, common_rend_config_flag, dec_param_estim_new, st_ivas->ivas_format, st_ivas->mc_mode, output_Fs, hodirac_flag, 0 ) ), IVAS_ERR_OK ) ) { return error; } + IF( need_dirac_rend ) { IF( st_ivas->hDirACRend == NULL ) @@ -1127,9 +1144,9 @@ ivas_error ivas_dirac_dec_config_fx( } } - IF( st_ivas->hDiracDecBin == NULL ) + IF( st_ivas->hDiracDecBin[0] == NULL ) { - IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, &( st_ivas->hHrtfParambin ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -1139,25 +1156,31 @@ ivas_error ivas_dirac_dec_config_fx( /* This is required to keep BE in rate switching. This probably means that 1TC and 2TC MASA perform differently. */ test(); test(); - IF( st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_params != NULL && !( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && st_ivas->nSCE > 0 ) ) + IF( st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_params != NULL && !( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && st_ivas->nSCE > 0 ) ) { - ivas_dirac_dec_decorr_close_fx( &st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_params, &st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_state ); // done + ivas_dirac_dec_decorr_close_fx( &st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_params, &st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_state ); // done } - IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin[0]->hTdDecorr ), &( st_ivas->hDiracDecBin[0]->useTdDecorr ) ) ), IVAS_ERR_OK ) ) { return error; } - IF( !st_ivas->hDiracDecBin->useTdDecorr ) + /* copy td-decorr flag to split renderer side rendereres */ + FOR( pos_idx = 1; pos_idx < num_poses; pos_idx++ ) + { + st_ivas->hDiracDecBin[pos_idx]->useTdDecorr = st_ivas->hDiracDecBin[0]->useTdDecorr; + } + IF( !st_ivas->hDiracDecBin[0]->useTdDecorr ) { - IF( st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_params == NULL ) + IF( st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_params == NULL ) { Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; + ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSpatParamRendCom->num_freq_bands ); - IF( NE_32( ( error = ivas_dirac_dec_decorr_open_fx( &( st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_params ), &( st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_state ), st_ivas->hSpatParamRendCom->num_freq_bands, BINAURAL_CHANNELS, BINAURAL_CHANNELS, + IF( NE_32( ( error = ivas_dirac_dec_decorr_open_fx( &( st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_params ), &( st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_state ), st_ivas->hSpatParamRendCom->num_freq_bands, BINAURAL_CHANNELS, BINAURAL_CHANNELS, DIRAC_SYNTHESIS_PSD_LS, frequency_axis_fx, BINAURAL_CHANNELS, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) { @@ -1165,21 +1188,26 @@ ivas_error ivas_dirac_dec_config_fx( } } } - st_ivas->hDiracDecBin->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); - move16(); + + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) + { + st_ivas->hDiracDecBin[pos_idx]->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); + move16(); + } } } } - return error; } + /*------------------------------------------------------------------------- * ivas_dirac_dec_close() * * Close DirAC memories *------------------------------------------------------------------------*/ + void ivas_dirac_dec_close_fx( DIRAC_DEC_HANDLE *hDirAC_out ) { @@ -1205,11 +1233,14 @@ void ivas_dirac_dec_close_fx( return; } + + /*------------------------------------------------------------------------- * ivas_dirac_dec_read_BS_fx() * * Read DirAC parameters from the bitstream *------------------------------------------------------------------------*/ + void ivas_dirac_dec_read_BS_fx( const Word32 ivas_total_brate, /* i : IVAS total bitrate */ Decoder_State *st, /* i/o: decoder state structure */ @@ -1219,12 +1250,12 @@ void ivas_dirac_dec_read_BS_fx( Word16 *nb_bits, /* o : number of bits read */ const Word16 last_bit_pos, /* i : last read bitstream position */ const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + const Word16 nchan_transport, /* i : number of transport channels */ Word16 *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { Word16 i, j, b, dir, orig_dirac_bands; Word16 next_bit_pos_orig; - Word32 quo, rem; test(); test(); @@ -1232,8 +1263,7 @@ void ivas_dirac_dec_read_BS_fx( { next_bit_pos_orig = st->next_bit_pos; move16(); - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); - st->next_bit_pos = extract_l( L_sub( quo, 1 ) ); + st->next_bit_pos = sub( extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ), 1 ); move16(); if ( last_bit_pos > 0 ) { @@ -1262,7 +1292,8 @@ void ivas_dirac_dec_read_BS_fx( set32_fx( hQMetaData->q_direction[0].band_data[b].elevation_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); } } - *nb_bits = add( *nb_bits, ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ) ); + + *nb_bits = add( *nb_bits, ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), nchan_transport, NULL, SBA_FORMAT ) ); move16(); FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) @@ -1323,8 +1354,9 @@ void ivas_dirac_dec_read_BS_fx( move16(); /* subtract mode signaling bits, since bitstream was moved after mode reading */ - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); - st->next_bit_pos = extract_l( L_sub( L_sub( quo, 1 ), SID_FORMAT_NBITS ) ); + i = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + st->next_bit_pos = sub( sub( i, 1 ), SID_FORMAT_NBITS + SBA_PLANAR_BITS + SBA_ORDER_BITS ); + move16(); /* 1 bit flag for signaling metadata to read */ b = st->bit_stream[( st->next_bit_pos )--]; @@ -1347,8 +1379,9 @@ void ivas_dirac_dec_read_BS_fx( } } } - *nb_bits = add( *nb_bits, ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ) ); + *nb_bits = add( *nb_bits, ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), nchan_transport, NULL, SBA_FORMAT ) ); move16(); + FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth_fx[i] = hQMetaData->q_direction[0].band_data[1].azimuth_fx[0]; @@ -1390,11 +1423,14 @@ void ivas_dirac_dec_read_BS_fx( return; } + + /*-----------------------------------------------------------------------* * ivas_qmetadata_to_dirac() * * Copy qmetedata to DirAC parameters for rendering *-----------------------------------------------------------------------*/ + void ivas_qmetadata_to_dirac_fx( const IVAS_QMETADATA_HANDLE hQMetaData, /* i : frame of MASA q_metadata */ DIRAC_DEC_HANDLE hDirAC, /* i : DirAC decoder structure */ @@ -1446,10 +1482,27 @@ void ivas_qmetadata_to_dirac_fx( { FOR( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) { - hSpatParamRendCom->azimuth[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); + /* Right shifting -1 -> -1, Hence this change is done */ + Word32 L_tmp = L_abs( q_direction->band_data[band].azimuth_fx[block] ); + hSpatParamRendCom->azimuth[meta_write_index][b] = extract_h( L_shr( L_tmp, 6 ) ); move16(); - hSpatParamRendCom->elevation[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); + + IF( q_direction->band_data[band].azimuth_fx[block] < 0 ) + { + hSpatParamRendCom->azimuth[meta_write_index][b] = negate( hSpatParamRendCom->azimuth[meta_write_index][b] ); + move16(); + } + + L_tmp = L_abs( q_direction->band_data[band].elevation_fx[block] ); + hSpatParamRendCom->elevation[meta_write_index][b] = extract_h( L_shr( L_tmp, 6 ) ); move16(); + + IF( q_direction->band_data[band].elevation_fx[block] < 0 ) + { + hSpatParamRendCom->elevation[meta_write_index][b] = negate( hSpatParamRendCom->elevation[meta_write_index][b] ); + move16(); + } + hSpatParamRendCom->energy_ratio1_fx[meta_write_index][b] = q_direction->band_data[band].energy_ratio_fx[block]; move32(); hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][b] = L_sub( ONE_IN_Q30, q_direction->band_data[band].energy_ratio_fx[block] ); @@ -1494,10 +1547,25 @@ void ivas_qmetadata_to_dirac_fx( { FOR( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) { - hSpatParamRendCom->azimuth2[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); + /* Right shifting -1 -> -1, Hence this change is done */ + Word32 L_tmp = L_abs( q_direction->band_data[band].azimuth_fx[block] ); + hSpatParamRendCom->azimuth2[meta_write_index][b] = extract_h( L_shr( L_tmp, 6 ) ); move16(); - hSpatParamRendCom->elevation2[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); + IF( q_direction->band_data[band].azimuth_fx[block] < 0 ) + { + hSpatParamRendCom->azimuth2[meta_write_index][b] = negate( hSpatParamRendCom->azimuth2[meta_write_index][b] ); + move16(); + } + + L_tmp = L_abs( q_direction->band_data[band].elevation_fx[block] ); + hSpatParamRendCom->elevation2[meta_write_index][b] = extract_h( L_shr( L_tmp, 6 ) ); move16(); + IF( q_direction->band_data[band].elevation_fx[block] < 0 ) + { + hSpatParamRendCom->elevation2[meta_write_index][b] = negate( hSpatParamRendCom->elevation2[meta_write_index][b] ); + move16(); + } + hSpatParamRendCom->energy_ratio2_fx[meta_write_index][b] = q_direction->band_data[band].energy_ratio_fx[block]; move32(); hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][b] = L_sub( hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][b], q_direction->band_data[band].energy_ratio_fx[block] ); @@ -1562,7 +1630,9 @@ void ivas_qmetadata_to_dirac_fx( move16(); hDirAC->hConfig->nbands = 5; move16(); - ivas_dirac_config_bands_fx( hDirAC->band_grouping, hDirAC->hConfig->nbands, nbands, NULL, 0, 0, NULL ); + + ivas_dirac_config_bands_fx( hDirAC->band_grouping, hDirAC->hConfig->nbands, nbands, NULL, 0, 0, NULL, 1 ); + nbands = 5; move16(); } @@ -1581,7 +1651,7 @@ void ivas_qmetadata_to_dirac_fx( move16(); } - ivas_dirac_config_bands_fx( hDirAC->band_grouping, hDirAC->hConfig->nbands, nbands, dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hDirAC->hConfig->enc_param_start_band, hDirAC->hFbMdft ); + ivas_dirac_config_bands_fx( hDirAC->band_grouping, hDirAC->hConfig->nbands, nbands, dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hDirAC->hConfig->enc_param_start_band, hDirAC->hFbMdft, 0 ); nbands = hDirAC->hConfig->nbands; move16(); @@ -1718,31 +1788,37 @@ void ivas_qmetadata_to_dirac_fx( } ELSE { - Word16 tmp1, tmp4; Word16 a, b_tmp; Word16 exp_factor = 0; move16(); a = rand_triangular_signed_fx( seed_ptr, &exp_factor ); // q = exp_factor - tmp1 = mult( a, dirac_dithering_azi_scale_fx[diff_idx] ); // exp_factor + 5 - - Word32 tmp1_32 = L_deposit_h( tmp1 ); + Word32 tmp1_32 = L_mult( a, dirac_dithering_azi_scale_fx[diff_idx] ); // exp_factor + 5 Word16 final_1_exp; - Word32 final_1_32 = BASOP_Util_Add_Mant32Exp( azimuth_fx, 9, tmp1_32, exp_factor + 5, &final_1_exp ); - b_tmp = rand_triangular_signed_fx( seed_ptr, &exp_factor ); // q = exp_factor - tmp4 = mult( b_tmp, dirac_dithering_ele_scale_fx[diff_idx] ); // exp_factor + 4 + Word32 final_1_32; + Word16 norm_op1 = norm_l( azimuth_fx ); + Word16 norm_op2 = norm_l( tmp1_32 ); + Word16 op2_e = add( exp_factor, 5 ); + final_1_exp = add( s_max( s_max( sub( 9, norm_op1 ), sub( op2_e, norm_op2 ) ), 0 ), 2 ); // 2 for headroom + final_1_32 = L_add( L_shr( azimuth_fx, sub( final_1_exp, 9 ) ), L_shr( tmp1_32, sub( final_1_exp, op2_e ) ) ); - Word32 tmp4_32 = L_deposit_h( tmp4 ); - Word16 final_2_exp; - Word32 final_2_32 = BASOP_Util_Add_Mant32Exp( elevation_fx, 9, tmp4_32, exp_factor + 4, &final_2_exp ); + b_tmp = rand_triangular_signed_fx( seed_ptr, &exp_factor ); // q = exp_factor + Word32 tmp4_32 = L_mult( b_tmp, dirac_dithering_ele_scale_fx[diff_idx] ); // exp_factor + 4 + Word16 final_2_exp; + Word32 final_2_32; + norm_op1 = norm_l( elevation_fx ); + norm_op2 = norm_l( tmp4_32 ); + op2_e = add( exp_factor, 4 ); + final_2_exp = add( s_max( s_max( sub( 9, norm_op1 ), sub( op2_e, norm_op2 ) ), 0 ), 2 ); // 2 for headroom + final_2_32 = L_add( L_shr( elevation_fx, sub( final_2_exp, 9 ) ), L_shr( tmp4_32, sub( final_2_exp, op2_e ) ) ); - final_1_32 = BASOP_Util_Add_Mant32Exp( final_1_32, final_1_exp, ONE_IN_Q30, 0, &final_1_exp ); /*0.5 in q31*/ - final_2_32 = BASOP_Util_Add_Mant32Exp( final_2_32, final_2_exp, ONE_IN_Q30, 0, &final_2_exp ); + final_1_32 = L_add( final_1_32, L_shl( 1, sub( 30, final_1_exp ) ) ); /*0.5 in q31*/ + final_2_32 = L_add( final_2_32, L_shl( 1, sub( 30, final_2_exp ) ) ); + azi = extract_h( L_shr( final_1_32, sub( 15, final_1_exp ) ) ); + ele = extract_h( L_shr( final_2_32, sub( 15, final_2_exp ) ) ); - azi = extract_h( L_shr( final_1_32, sub( sub( 31, final_1_exp ), 16 ) ) ); - ele = extract_h( L_shr( final_2_32, sub( sub( 31, final_2_exp ), 16 ) ) ); /*addition of one to compensate precision loss*/ if ( azi < 0 ) @@ -1782,7 +1858,6 @@ void ivas_qmetadata_to_dirac_fx( move16(); } - hSpatParamRendCom->energy_ratio1_fx[tmp_write_idx_band][b] = q_direction->band_data[qBand_idx].energy_ratio_fx[0]; move32(); hSpatParamRendCom->diffuseness_vector_fx[tmp_write_idx_band][b] = diffuseness_fx; @@ -1859,97 +1934,16 @@ void ivas_qmetadata_to_dirac_fx( /* update buffer write index */ hSpatParamRendCom->dirac_bs_md_write_idx = add( hSpatParamRendCom->dirac_bs_md_write_idx, MAX_PARAM_SPATIAL_SUBFRAMES ) % hSpatParamRendCom->dirac_md_buffer_length; move16(); + return; } + + /*------------------------------------------------------------------------- * ivas_dirac_dec_set_md_map() * * Set metadata index mapping for DirAC *------------------------------------------------------------------------*/ -void ivas_dirac_dec_set_md_map( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 nCldfbTs /* i : number of CLDFB time slots */ -) -{ - Word16 num_slots_in_subfr; - DIRAC_DEC_HANDLE hDirAC; - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; - - hDirAC = st_ivas->hDirAC; - hSpatParamRendCom = st_ivas->hSpatParamRendCom; - - /* adapt subframes */ - hSpatParamRendCom->num_slots = nCldfbTs; - move16(); - hSpatParamRendCom->slots_rendered = 0; - move16(); - num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; - move16(); - hSpatParamRendCom->subframes_rendered = 0; - move16(); - - ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hSpatParamRendCom->subframe_nbslots, &hSpatParamRendCom->nb_subframes ); - - /* copy also to tc buffer */ - /* only for non-combined formats and combinded formats w/o discrete objects */ - test(); - test(); - test(); - IF( ( NE_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) || NE_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) && !( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) ) - { - st_ivas->hTcBuffer->nb_subframes = hSpatParamRendCom->nb_subframes; - move16(); - Copy( hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, hSpatParamRendCom->nb_subframes ); - } - - /* set mapping according to dirac_read_idx */ - - set16_fx( hSpatParamRendCom->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); - - test(); - test(); - IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) - { - ivas_jbm_dec_get_md_map_even_spacing( nCldfbTs, num_slots_in_subfr, 0, hSpatParamRendCom->dirac_md_buffer_length, hSpatParamRendCom->render_to_md_map ); - } - ELSE IF( hDirAC == NULL || hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 ) - { - ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, 0, hSpatParamRendCom->dirac_md_buffer_length, hSpatParamRendCom->render_to_md_map ); - } - ELSE - { - ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, hSpatParamRendCom->dirac_read_idx, hSpatParamRendCom->dirac_md_buffer_length, hSpatParamRendCom->render_to_md_map ); - } - - test(); - test(); - IF( hDirAC == NULL || hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 ) - { - Word64 tmp_fx; - Word16 sf_idx, slot_idx, slot_idx_abs; - Word32 quo, rem; - - slot_idx_abs = 0; - move16(); - FOR( sf_idx = 0; sf_idx < hSpatParamRendCom->nb_subframes; sf_idx++ ) - { - tmp_fx = 0; - move64(); - FOR( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[sf_idx]; slot_idx++ ) - { - tmp_fx = W_add_nosat( tmp_fx, W_deposit32_l( L_deposit_l( hSpatParamRendCom->render_to_md_map[slot_idx_abs] ) ) ); - slot_idx_abs = add( slot_idx_abs, 1 ); - } - iDiv_and_mod_32( W_extract_l( W_shl_nosat( tmp_fx, 16 ) ), hSpatParamRendCom->subframe_nbslots[sf_idx], &quo, &rem, 0 ); - hSpatParamRendCom->render_to_md_map[sf_idx] = add( round_fx( quo ), hSpatParamRendCom->dirac_read_idx ) % hSpatParamRendCom->dirac_md_buffer_length; - move16(); - } - - set16_fx( &hSpatParamRendCom->render_to_md_map[hSpatParamRendCom->nb_subframes], 0, sub( MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME, hSpatParamRendCom->nb_subframes ) ); - } - - return; -} void ivas_dirac_dec_set_md_map_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -1988,7 +1982,6 @@ void ivas_dirac_dec_set_md_map_fx( } /* set mapping according to dirac_read_idx */ - set16_fx( hSpatParamRendCom->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); test(); @@ -2060,6 +2053,8 @@ void ivas_dirac_dec_set_md_map_fx( return; } + + /*------------------------------------------------------------------------- * ivas_dirac_dec_render_fx() * @@ -2080,20 +2075,20 @@ void ivas_dirac_dec_render_fx( Word16 temp = 0; move16(); SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; - Word32 *output_f_local_fx[MAX_OUTPUT_CHANNELS]; - Word32 output_f_local_buff_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k] = { 0 }; // VE2SB: TBV + Word32 *output_fx_local[MAX_OUTPUT_CHANNELS]; + Word32 *p_output_fx[MAX_OUTPUT_CHANNELS]; + Word32 output_fx_local_buff[MAX_OUTPUT_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; hSpatParamRendCom = st_ivas->hSpatParamRendCom; nchan_intern = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); FOR( ch = 0; ch < nchan_intern; ch++ ) { - output_f_local_fx[ch] = output_f_local_buff_fx[ch]; - set_zero_fx( output_f_local_fx[ch], nSamplesAsked ); + output_fx_local[ch] = output_fx_local_buff[ch]; + p_output_fx[ch] = output_fx[ch]; } slot_size = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); // cL - /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ slots_to_render = s_min( sub( hSpatParamRendCom->num_slots, hSpatParamRendCom->slots_rendered ), idiv1616( nSamplesAsked, slot_size ) ); @@ -2113,51 +2108,134 @@ void ivas_dirac_dec_render_fx( FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { -#ifdef MSAN_FIX - ivas_dirac_dec_render_sf_fx( st_ivas, output_f_local_fx, nchan_transport, NULL, NULL ); -#else - ivas_dirac_dec_render_sf_fx( st_ivas, output_f_local, nchan_transport, NULL, NULL ); -#endif // MSAN_FIX + ivas_dirac_dec_render_sf_fx( st_ivas, output_fx_local, nchan_transport, NULL, NULL ); n_samples_sf = i_mult( hSpatParamRendCom->subframe_nbslots[subframe_idx], hSpatParamRendCom->slot_size ); FOR( ch = 0; ch < nchan_intern; ch++ ) { - output_f_local_fx[ch] += n_samples_sf; + /* move to output */ + test(); + test(); + IF( !( ( st_ivas->hDirACRend->hOutSetup.separateChannelEnabled ) && ( EQ_16( st_ivas->hDirACRend->hOutSetup.separateChannelIndex, ch ) || EQ_16( add( st_ivas->hDirACRend->hOutSetup.separateChannelIndex, 1 ), ch ) ) ) ) + { + Copy32( output_fx_local_buff[ch], p_output_fx[ch], n_samples_sf ); + } + + p_output_fx[ch] += n_samples_sf; } /* update combined orientation access index */ ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_sf ); } - FOR( ch = 0; ch < nchan_intern; ch++ ) + /* clang-format off */ + IF( EQ_16( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->num_slots ) ) { - test(); - test(); - IF( !( ( st_ivas->hDirACRend->hOutSetup.separateChannelEnabled ) && ( ( EQ_16( st_ivas->hDirACRend->hOutSetup.separateChannelIndex, ch ) || EQ_16( add( st_ivas->hDirACRend->hOutSetup.separateChannelIndex, 1 ), ch ) ) ) ) ) + IF( EQ_16( st_ivas->hDirAC->hConfig->dec_param_estim, 1 ) ) + { + temp = add( hSpatParamRendCom->dirac_read_idx, DEFAULT_JBM_CLDFB_TIMESLOTS ); + hSpatParamRendCom->dirac_read_idx = sub( temp, i_mult( idiv1616( temp, hSpatParamRendCom->dirac_md_buffer_length ), hSpatParamRendCom->dirac_md_buffer_length ) ); // Q0 + } + ELSE { - Copy32( output_f_local_buff_fx[ch], output_fx[ch], *nSamplesRendered ); + temp = add( hSpatParamRendCom->dirac_read_idx, DEFAULT_JBM_SUBFRAMES_5MS ); + hSpatParamRendCom->dirac_read_idx = sub( temp, i_mult( idiv1616( temp, hSpatParamRendCom->dirac_md_buffer_length ), hSpatParamRendCom->dirac_md_buffer_length ) ); // Q0 } } - IF( EQ_16( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->num_slots ) ){ - IF( EQ_16( st_ivas->hDirAC->hConfig->dec_param_estim, 1 ) ){ - temp = add( hSpatParamRendCom->dirac_read_idx, DEFAULT_JBM_CLDFB_TIMESLOTS ); - hSpatParamRendCom->dirac_read_idx = sub( temp, i_mult( idiv1616( temp, hSpatParamRendCom->dirac_md_buffer_length ), hSpatParamRendCom->dirac_md_buffer_length ) ); // Q0 + *nSamplesAvailableNext = i_mult( sub( hSpatParamRendCom->num_slots, hSpatParamRendCom->slots_rendered ), slot_size ); // Q0 + move16(); + + return; } -ELSE +/* clang-format on */ + + +/*------------------------------------------------------------------------- + * Local functions to perform binaural rendering with optimized stack + *------------------------------------------------------------------------*/ + +static void binRenderer_split_fx( + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ + ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend, /* i/o: ISAR split binaural rendering handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ + const Word16 numTimeSlots, /* i : number of time slots to render */ + Word32 Cldfb_RealBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ + Word32 Cldfb_ImagBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ + Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + const Word16 num_freq_bands, + const Word16 nchan_out ) { - temp = add( hSpatParamRendCom->dirac_read_idx, DEFAULT_JBM_SUBFRAMES_5MS ); - hSpatParamRendCom->dirac_read_idx = sub( temp, i_mult( idiv1616( temp, hSpatParamRendCom->dirac_md_buffer_length ), hSpatParamRendCom->dirac_md_buffer_length ) ); // Q0 -} + Word16 pos_idx, slot_idx, ch, input_q; + Word32 Cldfb_RealBuffer_Binaural_loc[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_Binaural_loc[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + + input_q = Q6; + move16(); + + /* Perform binaural rendering */ + ivas_binRenderer_fx( hBinRenderer, &hSplitBinRend->splitrend.multiBinPoseData, hCombinedOrientationData, numTimeSlots, +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + NULL, +#endif + Cldfb_RealBuffer_Binaural_loc, Cldfb_ImagBuffer_Binaural_loc, RealBuffer_fx, ImagBuffer_fx, &input_q ); + + FOR( slot_idx = 0; slot_idx < numTimeSlots; slot_idx++ ) + { + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + Copy32( Cldfb_RealBuffer_Binaural_loc[0][ch][slot_idx], Cldfb_RealBuffer_Binaural_fx[0][ch][slot_idx], num_freq_bands ); + Copy32( Cldfb_ImagBuffer_Binaural_loc[0][ch][slot_idx], Cldfb_ImagBuffer_Binaural_fx[0][ch][slot_idx], num_freq_bands ); + } + } + + FOR( pos_idx = 0; pos_idx < hBinRenderer->numPoses; pos_idx++ ) + { + FOR( slot_idx = 0; slot_idx < numTimeSlots; slot_idx++ ) + { + FOR( ch = 0; ch < nchan_out; ch++ ) + { + ivas_CLDFB_RINGBUF_Push( + hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], + Cldfb_RealBuffer_Binaural_loc[pos_idx][ch][slot_idx], + Cldfb_ImagBuffer_Binaural_loc[pos_idx][ch][slot_idx], + num_freq_bands ); + } + } + } + + return; } -*nSamplesAvailableNext = i_mult( sub( hSpatParamRendCom->num_slots, hSpatParamRendCom->slots_rendered ), slot_size ); // Q0 -move16(); -return; +static void binRenderer_fx( + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ + const Word16 numTimeSlots, /* i : number of time slots to render */ + Word32 Cldfb_RealBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ + Word32 Cldfb_ImagBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ + Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] /* i : LS signals */ +) +{ + Word16 input_q; + + input_q = Q6; + move16(); + + /* Perform binaural rendering */ + ivas_binRenderer_fx( hBinRenderer, NULL, hCombinedOrientationData, numTimeSlots, +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + NULL, +#endif + Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, RealBuffer_fx, ImagBuffer_fx, &input_q ); + + return; } + /*------------------------------------------------------------------------- * ivas_dirac_dec_render_sf_fx() * @@ -2165,12 +2243,11 @@ return; *------------------------------------------------------------------------*/ void ivas_dirac_dec_render_sf_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_buf_fx[], /* i/o: synthesized core-coder transport channels/DirAC output Q(6-1)*/ - const Word16 nchan_transport, /* i : number of transport channels */ - Word32 *pppQMfFrame_ts_re_fx[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], /*Q6*/ - Word32 *pppQMfFrame_ts_im_fx[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] /*Q6*/ -) + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word32 *output_buf_fx[], /* i/o: synthesized core-coder transport channels/DirAC output Q(6-1)*/ + const Word16 nchan_transport, /* i : number of transport channels */ + Word32 *pppQMfFrame_ts_re_fx[HOA3_CHANNELS][CLDFB_NO_COL_MAX], + Word32 *pppQMfFrame_ts_im_fx[HOA3_CHANNELS][CLDFB_NO_COL_MAX] ) { Word16 i, ch, idx_in, idx_lfe; DIRAC_DEC_HANDLE hDirAC; @@ -2181,10 +2258,10 @@ void ivas_dirac_dec_render_sf_fx( Word16 slot_idx_start, slot_idx_start_cldfb_synth, md_idx; /*CLDFB: last output channels reserved to LFT for CICPx*/ - Word32 Cldfb_RealBuffer_fx[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_fx[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_RealBuffer_fx[MAX_OUTPUT_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_fx[MAX_OUTPUT_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_RealBuffer_Binaural_fx[1][BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_Binaural_fx[1][BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; Word16 index = 0, num_freq_bands = 0; move16(); move16(); @@ -2201,9 +2278,6 @@ void ivas_dirac_dec_render_sf_fx( Word16 surCohRatio_q_fx = 0, temp_q = 0; move16(); move16(); - Word32 Cldfb_RealBuffer_Temp_fx[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_Temp_fx[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - Word16 cldfb_buf_q; Word16 offset = 0, buff_len = 0; move16(); move16(); @@ -2224,7 +2298,8 @@ void ivas_dirac_dec_render_sf_fx( DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; Word16 num_channels_dir, exp; - Word16 q_diffuseness_vector = Q31, q_reference_power_smooth = Q31; + Word16 q_diffuseness_vector = Q31, q_reference_power_smooth[2] = { Q31, Q31 }; + move16(); move16(); move16(); Word16 proto_power_smooth_len = 0; @@ -2234,6 +2309,15 @@ void ivas_dirac_dec_render_sf_fx( push_wmops( "ivas_dirac_dec_render" ); /* Initialize aux buffers */ + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + set32_fx( Cldfb_RealBuffer_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( Cldfb_ImagBuffer_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); + } + } + hDirAC = st_ivas->hDirAC; hDirACRend = st_ivas->hDirACRend; hSpatParamRendCom = st_ivas->hSpatParamRendCom; @@ -2328,7 +2412,6 @@ void ivas_dirac_dec_render_sf_fx( move16(); } - test(); test(); IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) @@ -2464,9 +2547,29 @@ void ivas_dirac_dec_render_sf_fx( scale_sig32( hDirACRend->h_output_synthesis_psd_state.cy_auto_diff_smooth_prev_fx, imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->hOutSetup.nchan_out_woLFE ), tmp1 ); // Q(hDirACRend->h_output_synthesis_psd_state.q_cy_auto_diff_smooth_prev+ tmp1) hDirACRend->h_output_synthesis_psd_state.q_cy_auto_diff_smooth_prev = add( hDirACRend->h_output_synthesis_psd_state.q_cy_auto_diff_smooth_prev, tmp1 ); move16(); - tmp1 = L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx, imult1616( hDirACRend->num_protos_dir, hSpatParamRendCom->num_freq_bands ) ); - scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx, imult1616( hDirACRend->num_protos_dir, hSpatParamRendCom->num_freq_bands ), tmp1 ); // Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q tmp1) - hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q = add( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q, tmp1 ); + tmp1 = 31; + move16(); + FOR( i = 0; i < i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_protos_dir ); i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + tmp1 = s_min( tmp1, L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + i, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ); + } + FOR( i = 0; i < i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_protos_dir ); i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + i, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), tmp1 ); // Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q tmp1) + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] = add( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0], tmp1 ); + move16(); + tmp1 = 31; + move16(); + FOR( i = 0; i < i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_protos_dir ); i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + tmp1 = s_min( tmp1, L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ) ); + } + FOR( i = 0; i < i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_protos_dir ); i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), tmp1 ); // Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q tmp1) + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] = add( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1], tmp1 ); move16(); IF( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_fx != 0 ) { @@ -2586,7 +2689,7 @@ void ivas_dirac_dec_render_sf_fx( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i] = L_add( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i], surCohEner_fx ); // Q29 move32(); - surCohRatio_fx[i] = BASOP_Util_Divide3232_Scale_cadence( surCohEner_fx, ( L_add( EPSILLON_FX, L_add( dirEne_fx, surCohEner_fx ) ) ), &temp_q ); + surCohRatio_fx[i] = BASOP_Util_Divide3232_Scale_newton( surCohEner_fx, ( L_add( EPSILLON_FX, L_add( dirEne_fx, surCohEner_fx ) ) ), &temp_q ); move32(); surCohRatio_fx[i] = L_shl( surCohRatio_fx[i], sub( temp_q, 16 ) ); // Q15 move32(); @@ -2641,40 +2744,17 @@ void ivas_dirac_dec_render_sf_fx( { masa_band_mapping = st_ivas->hMasa->data.band_mapping; } - test(); - test(); - IF( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && EQ_16( st_ivas->hCombinedOrientationData->shd_rot_max_order, 1 ) ) - { - ivas_dirac_dec_compute_directional_responses_fx( hSpatParamRendCom, - hDirACRend, - st_ivas->hVBAPdata, - masa_band_mapping, - st_ivas->hMasaIsmData, - azimuth, - elevation, - md_idx, - surCohRatio_fx, - surCohRatio_q_fx, - st_ivas->hCombinedOrientationData->shd_rot_max_order, - p_Rmat_fx, - hodirac_flag ); - } - ELSE - { - ivas_dirac_dec_compute_directional_responses_fx( hSpatParamRendCom, - hDirACRend, - st_ivas->hVBAPdata, - masa_band_mapping, - st_ivas->hMasaIsmData, - azimuth, - elevation, - md_idx, - surCohRatio_fx, - surCohRatio_q_fx, - 0, - NULL, - hodirac_flag ); - } + ivas_dirac_dec_compute_directional_responses_fx( hSpatParamRendCom, + hDirACRend, + st_ivas->hVBAPdata, + masa_band_mapping, + st_ivas->hMasaIsmData, + azimuth, + elevation, + md_idx, + surCohRatio_fx, + surCohRatio_q_fx, + hodirac_flag ); } test(); @@ -2689,9 +2769,9 @@ void ivas_dirac_dec_render_sf_fx( { q_temp_cldfb = Q11; move16(); - cldfbAnalysis_ts_fx_fixed_q( &st_ivas->hTcBuffer->tc_fx[hDirACRend->sba_map_tc[ch]][offset], - Cldfb_RealBuffer_Temp_fx[ch][slot_idx], - Cldfb_ImagBuffer_Temp_fx[ch][slot_idx], + cldfbAnalysis_ts_fx_fixed_q( &( st_ivas->hTcBuffer->tc_fx[hDirACRend->sba_map_tc[ch]][hSpatParamRendCom->num_freq_bands * index_slot] ), + Cldfb_RealBuffer_Binaural_fx[0][ch][slot_idx], /* note: it is a tmp. buffer at this point */ + Cldfb_ImagBuffer_Binaural_fx[0][ch][slot_idx], /* note: it is a tmp. buffer at this point */ hSpatParamRendCom->num_freq_bands, st_ivas->cldfbAnaDec[ch], &q_temp_cldfb ); } @@ -2699,10 +2779,9 @@ void ivas_dirac_dec_render_sf_fx( move16(); } - test(); - IF( ( NE_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && NE_16( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) ) + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { - ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( st_ivas, Cldfb_RealBuffer_Temp_fx, Cldfb_ImagBuffer_Temp_fx, &cldfb_buf_q, hSpatParamRendCom->num_freq_bands, subframe_idx ); + ivas_omasa_preProcessStereoTransportsForEditedObjects_fx( st_ivas, Cldfb_RealBuffer_Binaural_fx[0], Cldfb_ImagBuffer_Binaural_fx[0], &q_cldfb, hSpatParamRendCom->num_freq_bands, subframe_idx ); } } @@ -2735,8 +2814,8 @@ void ivas_dirac_dec_render_sf_fx( { FOR( ch = 0; ch < nchan_transport; ch++ ) { - Copy32( Cldfb_RealBuffer_Temp_fx[ch][slot_idx], Cldfb_RealBuffer_fx[ch][0], hSpatParamRendCom->num_freq_bands ); - Copy32( Cldfb_ImagBuffer_Temp_fx[ch][slot_idx], Cldfb_ImagBuffer_fx[ch][0], hSpatParamRendCom->num_freq_bands ); + Copy32( Cldfb_RealBuffer_Binaural_fx[0][ch][slot_idx], Cldfb_RealBuffer_fx[ch][0], hSpatParamRendCom->num_freq_bands ); + Copy32( Cldfb_ImagBuffer_Binaural_fx[0][ch][slot_idx], Cldfb_ImagBuffer_fx[ch][0], hSpatParamRendCom->num_freq_bands ); } } ELSE @@ -2774,10 +2853,10 @@ void ivas_dirac_dec_render_sf_fx( test(); generate_masking_noise_dirac_ivas_fx( st->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], - st_ivas->hTcBuffer->tc_fx[1], + &st_ivas->hTcBuffer->tc_fx[1][hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->slots_rendered], Cldfb_RealBuffer_fx[1][0], Cldfb_ImagBuffer_fx[1][0], - index_slot, + slot_idx, st->cna_dirac_flag && st->flag_cna, ( ( ( st->core_brate == FRAME_NO_DATA ) || EQ_32( st->core_brate, SID_2k40 ) ) ) && EQ_16( st->cng_type, FD_CNG ) && st->cng_sba_flag, Q_input, &q_temp_cldfb ); Scale_sig32( Cldfb_RealBuffer_fx[1][0], CLDFB_NO_CHANNELS_MAX, sub( Q6, q_temp_cldfb ) ); // Q6 @@ -2812,7 +2891,7 @@ void ivas_dirac_dec_render_sf_fx( &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q, - reference_power_fx, &DirAC_mem.reference_power_q, + reference_power_fx, DirAC_mem.reference_power_q, slot_idx, nchan_transport, hDirACRend->num_outputs_diff, hSpatParamRendCom->num_freq_bands, @@ -2825,7 +2904,7 @@ void ivas_dirac_dec_render_sf_fx( &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q, - reference_power_fx, &DirAC_mem.reference_power_q, + reference_power_fx, DirAC_mem.reference_power_q, slot_idx, nchan_transport, hDirACRend->num_outputs_diff, hSpatParamRendCom->num_freq_bands, @@ -2844,9 +2923,9 @@ void ivas_dirac_dec_render_sf_fx( hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, reference_power_fx, - &DirAC_mem.reference_power_q, + DirAC_mem.reference_power_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, - &hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, 0, slot_idx, hSpatParamRendCom->num_freq_bands, hDirACRend->masa_stereo_type_detect, q_cldfb ); @@ -2870,9 +2949,9 @@ void ivas_dirac_dec_render_sf_fx( hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, reference_power_fx, - &DirAC_mem.reference_power_q, + DirAC_mem.reference_power_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, - &hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, slot_idx, hDirACRend->num_outputs_diff, hSpatParamRendCom->num_freq_bands, hDirACRend->hoa_decoder, @@ -2887,9 +2966,9 @@ void ivas_dirac_dec_render_sf_fx( hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, reference_power_fx, - &DirAC_mem.reference_power_q, + DirAC_mem.reference_power_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, - &hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->hOutSetup.is_loudspeaker_setup, slot_idx, hSpatParamRendCom->num_freq_bands, @@ -2912,9 +2991,9 @@ void ivas_dirac_dec_render_sf_fx( hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, reference_power_fx, - &DirAC_mem.reference_power_q, + DirAC_mem.reference_power_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, - &hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, slot_idx, hDirACRend->num_protos_diff, hSpatParamRendCom->num_freq_bands, q_cldfb ); @@ -2939,7 +3018,8 @@ void ivas_dirac_dec_render_sf_fx( test(); test(); - IF( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) + test(); + IF( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation || st_ivas->hCombinedOrientationData ) && st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) { num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; move16(); @@ -2954,7 +3034,7 @@ void ivas_dirac_dec_render_sf_fx( } ELSE { - hDirACRend->index_buffer_intensity = add( sub( hDirACRend->index_buffer_intensity, i_mult( idiv1616( hDirACRend->index_buffer_intensity, DIRAC_NO_COL_AVG_DIFF ), DIRAC_NO_COL_AVG_DIFF ) ), 1 ); /* averaging_length = 32 */ + hDirACRend->index_buffer_intensity = add( sub( hDirACRend->index_buffer_intensity, i_mult( shr( hDirACRend->index_buffer_intensity, DIRAC_NO_COL_AVG_DIFF_LOG2 ), DIRAC_NO_COL_AVG_DIFF ) ), 1 ); /* averaging_length = 32 */ move16(); } @@ -2977,15 +3057,17 @@ void ivas_dirac_dec_render_sf_fx( num_freq_bands, azimuth, elevation ); Copy32( reference_power_fx, &( hDirACRend->buffer_energy_fx[i_mult( sub( index, 1 ), num_freq_bands )] ), num_freq_bands ); - hDirACRend->q_buffer_energy[index - 1] = DirAC_mem.reference_power_q; + Scale_sig32( &( hDirACRend->buffer_energy_fx[add( i_mult( sub( index, 1 ), num_freq_bands ), CLDFB_NO_CHANNELS_HALF )] ), s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[0], DirAC_mem.reference_power_q[1] ) ); + hDirACRend->q_buffer_energy[index - 1] = DirAC_mem.reference_power_q[0]; move16(); - computeDiffuseness_fixed( hDirACRend->buffer_intensity_real_fx, hDirACRend->buffer_energy_fx, num_freq_bands, hSpatParamRendCom->diffuseness_vector_fx[md_idx], hDirACRend->q_buffer_intensity_real, hDirACRend->q_buffer_energy, &hSpatParamRendCom->q_diffuseness_vector ); + computeDiffuseness_fx( hDirACRend->buffer_intensity_real_fx, hDirACRend->buffer_energy_fx, num_freq_bands, hSpatParamRendCom->diffuseness_vector_fx[md_idx], hDirACRend->q_buffer_intensity_real, hDirACRend->q_buffer_energy, &hSpatParamRendCom->q_diffuseness_vector ); } /*-----------------------------------------------------------------* * frequency domain decorrelation *-----------------------------------------------------------------*/ + IF( EQ_16( hDirACRend->proto_signal_decorr_on, 1 ) ) { /* decorrelate prototype frame */ @@ -3006,9 +3088,9 @@ void ivas_dirac_dec_render_sf_fx( hDirACRend->h_freq_domain_decorr_ap_params, hDirACRend->h_freq_domain_decorr_ap_state ); - v_multc_fixed( onset_filter_fx, 536870912 /* 0.25f in Q31 */, onset_filter_fx, hSpatParamRendCom->num_freq_bands ); + v_multc_fx( onset_filter_fx, 536870912 /* 0.25f in Q31 */, onset_filter_fx, hSpatParamRendCom->num_freq_bands ); - v_add_fixed( onset_filter_fx, onset_filter_subframe_fx, onset_filter_subframe_fx, hSpatParamRendCom->num_freq_bands, 0 ); /* Q31 */ + v_add_fx_no_hdrm( onset_filter_fx, onset_filter_subframe_fx, onset_filter_subframe_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ p_onset_filter_fx = onset_filter_subframe_fx; } ELSE @@ -3062,6 +3144,7 @@ void ivas_dirac_dec_render_sf_fx( /*-----------------------------------------------------------------* * output synthesis *-----------------------------------------------------------------*/ + test(); IF( ( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_LS ) || EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_SHD ) ) ) { @@ -3141,56 +3224,28 @@ void ivas_dirac_dec_render_sf_fx( move16(); } - test(); - test(); - IF( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order > 0 ) - { - ivas_dirac_dec_output_synthesis_process_slot_fx( reference_power_fx, - DirAC_mem.reference_power_q, - p_onset_filter_fx, - azimuth, - elevation, - hSpatParamRendCom->diffuseness_vector_fx[md_idx], - hSpatParamRendCom->q_diffuseness_vector, - hSpatParamRendCom, - hDirACRend, - st_ivas->hCombinedOrientationData->shd_rot_max_order, - p_Rmat_fx, - st_ivas->hVBAPdata, - hDirACRend->hOutSetup, - nchan_transport, - md_idx, - hodirac_flag, - hDirAC->hConfig->dec_param_estim ); - } - ELSE - { - ivas_dirac_dec_output_synthesis_process_slot_fx( reference_power_fx, - DirAC_mem.reference_power_q, - p_onset_filter_fx, - azimuth, - elevation, - hSpatParamRendCom->diffuseness_vector_fx[md_idx], - hSpatParamRendCom->q_diffuseness_vector, - hSpatParamRendCom, - hDirACRend, - 0, - 0, - st_ivas->hVBAPdata, - hDirACRend->hOutSetup, - nchan_transport, - md_idx, - hodirac_flag, - hDirAC->hConfig->dec_param_estim ); - } + ivas_dirac_dec_output_synthesis_process_slot_fx( reference_power_fx, + DirAC_mem.reference_power_q, + p_onset_filter_fx, + azimuth, + elevation, + hSpatParamRendCom->diffuseness_vector_fx[md_idx], + hSpatParamRendCom->q_diffuseness_vector, + hSpatParamRendCom, + hDirACRend, + st_ivas->hVBAPdata, + hDirACRend->hOutSetup, + nchan_transport, + md_idx, + hodirac_flag, + hDirAC->hConfig->dec_param_estim ); + IF( hDirAC->hConfig->dec_param_estim ) { Word16 fac; - Flag flag = 0; - move32(); fac = BASOP_Util_Divide3232_Scale( 1, hSpatParamRendCom->subframe_nbslots[subframe_idx], &exp ); - fac = shl_o( fac, exp, &flag ); + fac = shl_sat( fac, exp ); IF( LT_16( q_diffuseness_vector, hSpatParamRendCom->q_diffuseness_vector ) ) { @@ -3209,48 +3264,16 @@ void ivas_dirac_dec_render_sf_fx( IF( NE_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { - IF( LT_16( q_reference_power_smooth, DirAC_mem.reference_power_q ) ) - { - Word32 temp; - FOR( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) - { - temp = L_shl( reference_power_fx[i], sub( q_reference_power_smooth, DirAC_mem.reference_power_q ) ); - test(); - IF( temp == 0 && ( reference_power_fx[i] != 0 ) ) - { - reference_power_fx[i] = 1; - } - ELSE - { - reference_power_fx[i] = temp; - } - move32(); - } - DirAC_mem.reference_power_q = q_reference_power_smooth; - move16(); - } - ELSE - { - Word32 temp; - FOR( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) - { - temp = L_shl( reference_power_smooth_fx[i], sub( DirAC_mem.reference_power_q, q_reference_power_smooth ) ); - test(); - IF( temp == 0 && ( reference_power_smooth_fx[i] != 0 ) ) - { - reference_power_smooth_fx[i] = 1; - } - ELSE - { - reference_power_smooth_fx[i] = temp; - } - move32(); - } - q_reference_power_smooth = DirAC_mem.reference_power_q; - move16(); - } - v_add_fixed( reference_power_fx, reference_power_smooth_fx, reference_power_smooth_fx, hSpatParamRendCom->num_freq_bands, 1 ); - q_reference_power_smooth = sub( q_reference_power_smooth, 1 ); + v_add_fx_me( reference_power_fx, sub( 31, DirAC_mem.reference_power_q[0] ), + reference_power_smooth_fx, sub( 31, q_reference_power_smooth[0] ), + reference_power_smooth_fx, &temp_q, + s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), 1 ); + q_reference_power_smooth[0] = sub( 31, temp_q ); + v_add_fx_me( reference_power_fx + CLDFB_NO_CHANNELS_HALF, sub( 31, DirAC_mem.reference_power_q[1] ), + reference_power_smooth_fx + CLDFB_NO_CHANNELS_HALF, sub( 31, q_reference_power_smooth[1] ), + reference_power_smooth_fx + CLDFB_NO_CHANNELS_HALF, &temp_q, + s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), 1 ); + q_reference_power_smooth[1] = sub( 31, temp_q ); } } @@ -3449,34 +3472,47 @@ void ivas_dirac_dec_render_sf_fx( Scale_sig32( hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx, i_mult( hDirACRend->num_outputs_dir, hSpatParamRendCom->num_freq_bands ), sub( Q31, hDirACRend->h_output_synthesis_psd_state.direct_responses_square_q ) ); // Q31 } - exp = L_norm_arr( reference_power_smooth_fx, hSpatParamRendCom->num_freq_bands ); - scale_sig32( reference_power_smooth_fx, hSpatParamRendCom->num_freq_bands, exp ); // q_reference_power_smooth + exp - q_reference_power_smooth = add( q_reference_power_smooth, exp ); - IF( LT_16( q_reference_power_smooth, hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q ) ) + exp = L_norm_arr( reference_power_smooth_fx, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ); + scale_sig32( reference_power_smooth_fx, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), exp ); // q_reference_power_smooth[0] + exp + q_reference_power_smooth[0] = add( q_reference_power_smooth[0], exp ); + IF( LT_16( q_reference_power_smooth[0], hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0] ) ) { - scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx, hSpatParamRendCom->num_freq_bands, sub( q_reference_power_smooth, hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q ) ); // q_reference_power_smooth - hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q = q_reference_power_smooth; + scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( q_reference_power_smooth[0], hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0] ) ); // q_reference_power_smooth[0] + hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0] = q_reference_power_smooth[0]; move16(); } ELSE { Word32 temp; - FOR( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) + FOR( i = 0; i < s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ); i++ ) { - temp = L_shl( reference_power_smooth_fx[i], sub( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, q_reference_power_smooth ) ); - test(); - IF( temp == 0 && ( reference_power_smooth_fx[i] != 0 ) ) - { - reference_power_smooth_fx[i] = 1; - } - ELSE - { - reference_power_smooth_fx[i] = temp; - } + temp = L_shl( reference_power_smooth_fx[i], sub( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], q_reference_power_smooth[0] ) ); + reference_power_smooth_fx[i] = L_max( temp, L_min( reference_power_smooth_fx[i], 1 ) ); move32(); } + q_reference_power_smooth[0] = hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0]; + move16(); + } - q_reference_power_smooth = hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q; + exp = L_norm_arr( reference_power_smooth_fx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ); + scale_sig32( reference_power_smooth_fx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), exp ); // q_reference_power_smooth + exp + q_reference_power_smooth[1] = add( q_reference_power_smooth[1], exp ); + IF( LT_16( q_reference_power_smooth[1], hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1] ) ) + { + scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( q_reference_power_smooth[1], hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1] ) ); // q_reference_power_smooth + hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1] = q_reference_power_smooth[1]; + move16(); + } + ELSE + { + Word32 temp; + FOR( i = CLDFB_NO_CHANNELS_HALF; i < hSpatParamRendCom->num_freq_bands; i++ ) + { + temp = L_shl( reference_power_smooth_fx[i], sub( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], q_reference_power_smooth[1] ) ); + reference_power_smooth_fx[i] = L_max( temp, L_min( reference_power_smooth_fx[i], 1 ) ); + move32(); + } + q_reference_power_smooth[1] = hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1]; move16(); } @@ -3498,20 +3534,65 @@ void ivas_dirac_dec_render_sf_fx( } } - exp = getScaleFactor32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, proto_power_smooth_len ); - scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, proto_power_smooth_len, exp ); // Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q + exp) - hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q = add( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, exp ); + exp = 31; move16(); - IF( LT_16( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) ) + FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + exp = s_min( exp, L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + i, s_min( CLDFB_NO_CHANNELS_HALF, hSpatParamRendCom->num_freq_bands ) ) ); + } + FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { - scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx, i_mult( hDirACRend->num_protos_dir, hSpatParamRendCom->num_freq_bands ), sub( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) ); // proto_power_smooth_q - hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q = hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q; + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + i, s_min( CLDFB_NO_CHANNELS_HALF, hSpatParamRendCom->num_freq_bands ), exp ); // Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q + exp) + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0] = add( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0], exp ); + move16(); + exp = 31; + move16(); + FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + exp = s_min( exp, L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ) ); + } + FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), exp ); // Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q + exp) + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] = add( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], exp ); + move16(); + + IF( LT_16( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] ) ) + { + FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + i, s_min( CLDFB_NO_CHANNELS_HALF, hSpatParamRendCom->num_freq_bands ), sub( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] ) ); // proto_power_smooth_q + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] = hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0]; + move16(); + } + ELSE + { + FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + i, s_min( CLDFB_NO_CHANNELS_HALF, hSpatParamRendCom->num_freq_bands ), sub( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0] ) ); // proto_power_smooth_prev_q + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0] = hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0]; + move16(); + } + IF( LT_16( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ) ) + { + FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ) ); // proto_power_smooth_q + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] = hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1]; move16(); } ELSE { - scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, i_mult( hDirACRend->num_protos_dir, hSpatParamRendCom->num_freq_bands ), sub( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ) ); // proto_power_smooth_prev_q - hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q = hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q; + FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ) ); // proto_power_smooth_prev_q + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] = hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1]; move16(); } @@ -3557,23 +3638,31 @@ void ivas_dirac_dec_render_sf_fx( hSpatParamRendCom->subframe_nbslots[subframe_idx], diffuseness_vector_fx, reference_power_smooth_fx, - &q_reference_power_smooth, + q_reference_power_smooth, qualityBasedSmFactor_fx, hDirAC->hConfig->enc_param_start_band, &q_Cldfb ); - Word16 sh = hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q; - move16(); - hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q = 31; + Word16 allZero = 1; move16(); FOR( i = 0; i < proto_power_smooth_len; i++ ) { - IF( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx[i] != 0 ) + if ( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx[i] != 0 ) { - hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q = sh; + allZero = 0; move16(); } } + if ( allZero ) + { + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0] = 31; + move16(); + } + if ( allZero ) + { + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] = 31; + move16(); + } FOR( ch = 0; ch < hDirACRend->hOutSetup.nchan_out_woLFE; ch++ ) { @@ -3601,145 +3690,140 @@ void ivas_dirac_dec_render_sf_fx( test(); IF( ( ( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) && EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) ) { - Word16 in_ch; - FOR( in_ch = 0; in_ch < st_ivas->nchan_ism; in_ch++ ) - { - Word16 j, k, j2, l; - Word16 num_objects, nchan_out_woLFE, lfe_index; - Word16 az1, el1; - Word16 n_slots_to_render; - Word16 n_samples_to_render; - Word16 interp_offset; + Word16 j, k, l; + Word16 num_objects, nchan_out_woLFE; + Word16 n_slots_to_render; + Word16 n_samples_to_render; + Word32 gain_fx, prev_gain_fx; - Word32 gain_fx, prev_gain_fx; + num_objects = st_ivas->nchan_ism; + move16(); + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + move16(); + n_slots_to_render = st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->subframes_rendered]; + move16(); + n_samples_to_render = imult1616( hSpatParamRendCom->num_freq_bands, n_slots_to_render ); - num_objects = st_ivas->nchan_ism; - move16(); - nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; - move16(); - n_slots_to_render = st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->subframes_rendered]; - move16(); - n_samples_to_render = imult1616( hSpatParamRendCom->num_freq_bands, n_slots_to_render ); - interp_offset = st_ivas->hTcBuffer->n_samples_rendered; + test(); + IF( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] ) + { + ivas_jbm_dec_get_adapted_linear_interpolator_fx( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator_fx ); + st_ivas->hIsmRendererData->interp_offset_fx = 0; move16(); + } + FOR( i = 0; i < num_objects; i++ ) + { + /* Combined rotation: rotate the object positions depending the head and external orientations */ test(); - IF( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] ) + IF( st_ivas->hCombinedOrientationData != NULL && EQ_16( st_ivas->hCombinedOrientationData->enableCombinedOrientation[0], 1 ) ) { - ivas_jbm_dec_get_adapted_linear_interpolator_fx( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator_fx ); - interp_offset = 0; - move16(); - } - FOR( i = 0; i < num_objects; i++ ) - { - /* Combined rotation: rotate the object positions depending the head and external orientations */ - test(); - IF( st_ivas->hCombinedOrientationData != NULL && EQ_16( st_ivas->hCombinedOrientationData->enableCombinedOrientation[0], 1 ) ) + Word16 az_q0 = extract_l( L_shr( st_ivas->hIsmMetaData[i]->azimuth_fx, Q22 ) ); + Word16 el_q0 = extract_l( L_shr( st_ivas->hIsmMetaData[i]->elevation_fx, Q22 ) ); + Word32 az1_32, el1_32; + + rotateAziEle_fx32( az_q0, el_q0, &az1_32, &el1_32, st_ivas->hCombinedOrientationData->Rmat_fx[0], st_ivas->hIntSetup.is_planar_setup ); + + IF( st_ivas->hEFAPdata != NULL ) { - Word16 az_q0 = extract_l( L_shr( st_ivas->hIsmMetaData[i]->azimuth_fx, Q22 ) ); - Word16 el_q0 = extract_l( L_shr( st_ivas->hIsmMetaData[i]->elevation_fx, Q22 ) ); - Word32 az1_32, el1_32; - rotateAziEle_fixed( az_q0, el_q0, &az1_32, &el1_32, st_ivas->hCombinedOrientationData->Rmat_fx[0], st_ivas->hIntSetup.is_planar_setup ); - az1 = extract_h( az1_32 ); - el1 = extract_h( el1_32 ); - - IF( st_ivas->hEFAPdata != NULL ) + const Word32 azi_fx = L_shl( az1_32, Q22 - Q16 ); // Q16 -> Q22 + const Word32 ele_fx = L_shl( el1_32, Q22 - Q16 ); // Q16 -> Q22 + efap_determine_gains_fx( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], azi_fx, ele_fx, EFAP_MODE_EFAP ); + // TODO: Align Q-values + IF( NE_32( st_ivas->hIsmMetaData[i]->edited_gain_fx, ONE_IN_Q29 ) ) { - const Word32 azi_fx = L_shl( az1, Q22 ); // Q0 -> Q22 - const Word32 ele_fx = L_shl( el1, Q22 ); // Q0 -> Q22 - efap_determine_gains_fx( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], azi_fx, ele_fx, EFAP_MODE_EFAP ); + v_multc_fx( st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hIsmMetaData[i]->edited_gain_fx, st_ivas->hIsmRendererData->gains_fx[i], nchan_out_woLFE ); // Q30, Q29 --> Q28 + Scale_sig32( st_ivas->hIsmRendererData->gains_fx[i], nchan_out_woLFE, Q2 ); // Q28 --> Q30 } } + } - lfe_index = 0; - move16(); - for ( j = 0, j2 = 0; j < nchan_out_woLFE; j++, j2++ ) + FOR( j = 0; j < nchan_out_woLFE; j++ ) + { + gain_fx = st_ivas->hIsmRendererData->gains_fx[i][j]; + move32(); + prev_gain_fx = st_ivas->hIsmRendererData->prev_gains_fx[i][j]; + move32(); + test(); + IF( ( L_abs( gain_fx ) > 0 || L_abs( prev_gain_fx ) > 0 ) ) { - test(); - IF( ( st_ivas->hIntSetup.num_lfe > 0 && ( EQ_16( st_ivas->hIntSetup.index_lfe[lfe_index], j ) ) ) ) - { - IF( LT_16( lfe_index, sub( st_ivas->hIntSetup.num_lfe, 1 ) ) ) - { - lfe_index = add( lfe_index, 1 ); - j2 = add( j2, 1 ); - } - ELSE - { - j2 = add( j2, 1 ); - } - } - gain_fx = st_ivas->hIsmRendererData->gains_fx[i][j]; + Word32 *tc_re_fx, *tc_im_fx; + Word16 *w1_fx, w2_fx; + + w1_fx = &st_ivas->hIsmRendererData->interpolator_fx[st_ivas->hIsmRendererData->interp_offset_fx]; + tc_re_fx = pppQMfFrame_ts_re_fx[nchan_transport + i][0]; move32(); - prev_gain_fx = st_ivas->hIsmRendererData->prev_gains_fx[i][j]; + tc_im_fx = pppQMfFrame_ts_im_fx[nchan_transport + i][0]; move32(); - test(); - IF( ( L_abs( gain_fx ) > 0 || L_abs( prev_gain_fx ) > 0 ) ) + FOR( k = 0; k < n_slots_to_render; k++ ) { - Word32 *tc_re_fx, *tc_im_fx; - Word16 *w1_fx, w2_fx; - w1_fx = &st_ivas->hIsmRendererData->interpolator_fx[interp_offset]; - tc_re_fx = pppQMfFrame_ts_re_fx[nchan_transport + i][0]; - move32(); - tc_im_fx = pppQMfFrame_ts_im_fx[nchan_transport + i][0]; - move32(); - FOR( k = 0; k < n_slots_to_render; k++ ) + Word32 g_fx; + w2_fx = sub( MAX16B, *w1_fx ); + g_fx = Madd_32_16( Mpy_32_16_1( gain_fx, *w1_fx ), prev_gain_fx, w2_fx ); // Q15 + FOR( l = 0; l < hSpatParamRendCom->num_freq_bands; l++ ) { - Word32 g_fx; - w2_fx = sub( MAX16B, *w1_fx ); - g_fx = L_add( Mpy_32_16_1( gain_fx, *w1_fx ), Mpy_32_16_1( prev_gain_fx, w2_fx ) ); // Q15 - FOR( l = 0; l < hSpatParamRendCom->num_freq_bands; l++ ) - { - Word32 tmp; - tmp = Mpy_32_32( g_fx, *tc_re_fx ); - Cldfb_RealBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l] = L_add( Cldfb_RealBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l], tmp ); - move32(); - tc_re_fx++; - tmp = Mpy_32_32( g_fx, *tc_im_fx ); - Cldfb_ImagBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l] = L_add( Cldfb_ImagBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l], tmp ); - move32(); - tc_re_fx++; - } - w1_fx += hSpatParamRendCom->num_freq_bands; + Cldfb_RealBuffer_fx[j][k][l] = Madd_32_32( Cldfb_RealBuffer_fx[j][k][l], g_fx, L_shl( *tc_re_fx, 1 ) ); + move32(); + tc_re_fx++; + Cldfb_ImagBuffer_fx[j][k][l] = Madd_32_32( Cldfb_ImagBuffer_fx[j][k][l], g_fx, L_shl( *tc_im_fx, 1 ) ); + move32(); + tc_im_fx++; } + w1_fx += hSpatParamRendCom->num_freq_bands; } - /* update here only in case of head rotation */ - test(); - IF( st_ivas->hCombinedOrientationData != NULL && EQ_16( st_ivas->hCombinedOrientationData->enableCombinedOrientation[0], 1 ) ) - { - st_ivas->hIsmRendererData->prev_gains_fx[i][j] = gain_fx; - move32(); - } + } + /* update here only in case of head rotation */ + test(); + IF( st_ivas->hCombinedOrientationData != NULL && EQ_16( st_ivas->hCombinedOrientationData->enableCombinedOrientation[0], 1 ) ) + { + st_ivas->hIsmRendererData->prev_gains_fx[i][j] = gain_fx; + move32(); } } } + st_ivas->hIsmRendererData->interp_offset_fx = add( st_ivas->hIsmRendererData->interp_offset_fx, i_mult( hSpatParamRendCom->num_freq_bands, st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->subframes_rendered] ) ); } - /* Perform binaural rendering */ - Word16 input_q; - input_q = Q6; - move16(); - - ivas_binRenderer_fx( st_ivas->hBinRenderer, - st_ivas->hCombinedOrientationData, - hSpatParamRendCom->subframe_nbslots[subframe_idx], - Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, - Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, &input_q ); + /* Perform binaural rendering, output in Q6 format */ + test(); + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + IF( st_ivas->hSplitBinRend->hCldfbDataOut != NULL ) + { + FOR( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + FOR( ch = 0; ch < st_ivas->hBinRenderer->nInChannels; ch++ ) + { + Copy32( Cldfb_RealBuffer_fx[ch][slot_idx], st_ivas->hSplitBinRend->hCldfbDataOut->Cldfb_RealBuffer_fx[ch][add( slot_idx_start, slot_idx )], hSpatParamRendCom->num_freq_bands ); + Copy32( Cldfb_ImagBuffer_fx[ch][slot_idx], st_ivas->hSplitBinRend->hCldfbDataOut->Cldfb_ImagBuffer_fx[ch][add( slot_idx_start, slot_idx )], hSpatParamRendCom->num_freq_bands ); + } + } + st_ivas->hSplitBinRend->hCldfbDataOut->config = st_ivas->hIntSetup.output_config; + move16(); + } - Scale_sig32( Cldfb_RealBuffer_Binaural_fx[0][0], i_mult( BINAURAL_CHANNELS, i_mult( MAX_PARAM_SPATIAL_SUBFRAMES, CLDFB_NO_CHANNELS_MAX ) ), sub( Q6, input_q ) ); // Q6 - Scale_sig32( Cldfb_ImagBuffer_Binaural_fx[0][0], i_mult( BINAURAL_CHANNELS, i_mult( MAX_PARAM_SPATIAL_SUBFRAMES, CLDFB_NO_CHANNELS_MAX ) ), sub( Q6, input_q ) ); // Q6 + binRenderer_split_fx( st_ivas->hBinRenderer, st_ivas->hSplitBinRend, st_ivas->hCombinedOrientationData, hSpatParamRendCom->subframe_nbslots[subframe_idx], + Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, + hSpatParamRendCom->num_freq_bands, st_ivas->hDecoderConfig->nchan_out ); + } + ELSE + { + binRenderer_fx( st_ivas->hBinRenderer, st_ivas->hCombinedOrientationData, hSpatParamRendCom->subframe_nbslots[subframe_idx], + Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx ); + } /* Inverse CLDFB*/ FOR( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) { /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ Word32 *synth_fx = &output_buf_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands]; - Word32 *RealBuffer_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; - Word32 *ImagBuffer_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 *RealBuffer_fx[CLDFB_SLOTS_PER_SUBFRAME]; + Word32 *ImagBuffer_fx[CLDFB_SLOTS_PER_SUBFRAME]; FOR( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) { - RealBuffer_fx[i] = Cldfb_RealBuffer_Binaural_fx[ch][i]; + RealBuffer_fx[i] = Cldfb_RealBuffer_Binaural_fx[0][ch][i]; move32(); - ImagBuffer_fx[i] = Cldfb_ImagBuffer_Binaural_fx[ch][i]; + ImagBuffer_fx[i] = Cldfb_ImagBuffer_Binaural_fx[0][ch][i]; move32(); } @@ -3747,11 +3831,7 @@ void ivas_dirac_dec_render_sf_fx( st_ivas->cldfbSynDec[ch]->Q_cldfb_state = ( Q6 - 1 ); move16(); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, synth_fx, i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), 0, st_ivas->cldfbSynDec[ch] ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, synth_fx, i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), st_ivas->cldfbSynDec[ch] ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, synth_fx, i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), 0, 0, st_ivas->cldfbSynDec[ch] ); Word16 no_col = st_ivas->cldfbSynDec[ch]->no_col; move16(); @@ -3784,8 +3864,8 @@ void ivas_dirac_dec_render_sf_fx( } ELSE { - Word32 *RealBuffer_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; - Word32 *ImagBuffer_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 *RealBuffer_fx[CLDFB_SLOTS_PER_SUBFRAME]; + Word32 *ImagBuffer_fx[CLDFB_SLOTS_PER_SUBFRAME]; Word16 outchannels; idx_in = 0; @@ -3822,7 +3902,11 @@ void ivas_dirac_dec_render_sf_fx( /* Move the separated and the LFE channels to temporary variables as spatial synthesis may overwrite current channels */ Copy32( &( output_buf_fx[st_ivas->hOutSetup.separateChannelIndex][subframe_start_sample] ), tmp_separated_fx, num_samples_subframe ); - Copy32( &( output_buf_fx[LFE_CHANNEL][subframe_start_sample] ), tmp_lfe_fx, num_samples_subframe ); + if ( hDirACRend->hOutSetup.num_lfe > 0 ) + { + Copy32( &( output_buf_fx[LFE_CHANNEL][subframe_start_sample] ), tmp_lfe_fx, num_samples_subframe ); + } + FOR( ch = 0; ch < outchannels; ch++ ) { @@ -3854,11 +3938,7 @@ void ivas_dirac_dec_render_sf_fx( ImagBuffer_fx[i] = Cldfb_ImagBuffer_fx[idx_in][i]; move32(); } -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_buf_fx[ch][subframe_start_sample] ), num_samples_subframe, 0, st_ivas->cldfbSynDec[idx_in] ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_buf_fx[ch][subframe_start_sample] ), num_samples_subframe, st_ivas->cldfbSynDec[idx_in] ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_buf_fx[ch][subframe_start_sample] ), num_samples_subframe, 0, 0, st_ivas->cldfbSynDec[idx_in] ); IF( !st_ivas->hLsSetupCustom->separate_ch_found ) { @@ -3875,7 +3955,6 @@ void ivas_dirac_dec_render_sf_fx( { FOR( ch = 0; ch < outchannels; ch++ ) { - test(); test(); IF( ( hDirACRend->hOutSetup.num_lfe > 0 && ( EQ_16( hDirACRend->hOutSetup.index_lfe[idx_lfe], ch ) ) ) ) @@ -3898,11 +3977,7 @@ void ivas_dirac_dec_render_sf_fx( scale_sig32( st_ivas->cldfbSynDec[cldfbSynIdx]->cldfb_state_fx, st_ivas->cldfbSynDec[cldfbSynIdx]->p_filter_length, sub( ( Q6 - 1 ), st_ivas->cldfbSynDec[cldfbSynIdx]->Q_cldfb_state ) ); // Q6-1 st_ivas->cldfbSynDec[cldfbSynIdx]->Q_cldfb_state = ( Q6 - 1 ); move16(); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, 0, st_ivas->cldfbSynDec[cldfbSynIdx] ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, st_ivas->cldfbSynDec[cldfbSynIdx] ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, 0, 0, st_ivas->cldfbSynDec[cldfbSynIdx] ); // Calculating length of output Word16 no_col = st_ivas->cldfbSynDec[cldfbSynIdx]->no_col; @@ -3970,12 +4045,7 @@ void ivas_dirac_dec_render_sf_fx( scale_sig32( st_ivas->cldfbSynDec[idx_in]->cldfb_state_fx, st_ivas->cldfbSynDec[idx_in]->p_filter_length, sub( ( Q6 - 1 ), st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state ) ); st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state = ( Q6 - 1 ); move16(); - -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, 0, st_ivas->cldfbSynDec[idx_in] ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, st_ivas->cldfbSynDec[idx_in] ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, 0, 0, st_ivas->cldfbSynDec[idx_in] ); // Scaling output from Q6-1 to Q11 Scale_sig32( p_out, out_len, ( Q11 - ( Q6 - 1 ) ) ); @@ -3991,7 +4061,6 @@ void ivas_dirac_dec_render_sf_fx( hSpatParamRendCom->subframes_rendered = add( hSpatParamRendCom->subframes_rendered, 1 ); move16(); - IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { hDirACRend->h_output_synthesis_psd_state.gains_dir_prev_q = hDirACRend->h_output_synthesis_psd_state.q_cy_cross_dir_smooth_prev; diff --git a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c index b247fd6531c63eec9e3d7291599349bc28feed98..c53f66138f70e7fa4e7d1786cdeb82a25652a8e9 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c @@ -30,6 +30,8 @@ *******************************************************************************************************/ +#include "basop_util.h" +#include "enh32.h" #include #include #include @@ -49,6 +51,11 @@ #include "rom_dec.h" #include "ivas_prot_fx.h" +/*-----------------------------------------------------------------------* + * Local constants + *-----------------------------------------------------------------------*/ + +#define SQRT_EPSILON_FX 68 /* Q31 square root of EPSILON */ /*-------------------------------------------------------------------* * ivas_dirac_dec_output_synthesis_cov_open() @@ -462,9 +469,9 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot_fx( scale_sig32( imag_in_buffer_fx, buf_len, sub( ImagBuffer_e, output_e ) ); cmplx_matrix_square_fx( real_in_buffer_fx, imag_in_buffer_fx, num_bands, nchan_in, real_buffer_fx, imag_buffer_fx, output_e, &output_e ); - v_add_fixed_me( cx_fx, *cx_e, real_buffer_fx, output_e, cx_fx, &tmp1_e, imult1616( nchan_in, nchan_in ), 1 ); + v_add_fx_me( cx_fx, *cx_e, real_buffer_fx, output_e, cx_fx, &tmp1_e, imult1616( nchan_in, nchan_in ), 1 ); - v_add_fixed_me( cx_imag_fx, *cx_imag_e, imag_buffer_fx, output_e, cx_imag_fx, &tmp2_e, imult1616( nchan_in, nchan_in ), 1 ); + v_add_fx_me( cx_imag_fx, *cx_imag_e, imag_buffer_fx, output_e, cx_imag_fx, &tmp2_e, imult1616( nchan_in, nchan_in ), 1 ); cx_fx_norm = L_norm_arr( cx_fx, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); cx_imag_fx_norm = L_norm_arr( cx_imag_fx, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); @@ -507,30 +514,26 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( Word16 have_residual; Word16 brange[2]; DIRAC_OUTPUT_SYNTHESIS_COV_STATE h_synthesis_state; - Word32 mixing_matrix_smooth_fx[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + Word32 mixing_matrix_smooth_fx[MAX_LS_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; Word16 mixing_matrix_smooth_e; - Word32 mixing_matrix_res_smooth_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word32 mixing_matrix_res_smooth_fx[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; Word16 mixing_matrix_res_smooth_e = 0; move16(); - Word32 mixing_matrix_buffer_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word32 mixing_matrix_buffer_fx[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; Word16 mixing_matrix_buffer_e; Word32 input_f_real_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; Word32 input_f_imag_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; - Word32 output_f_real_fx[MAX_CICP_CHANNELS]; - Word32 output_f_imag_fx[MAX_CICP_CHANNELS]; - Word16 output_f_real_e; - Word16 output_f_imag_e; - Word32 diff_f_real_fx[MAX_CICP_CHANNELS]; - Word32 diff_f_imag_fx[MAX_CICP_CHANNELS]; + + Word32 diff_f_real_fx[MAX_LS_CHANNELS]; + Word32 diff_f_imag_fx[MAX_LS_CHANNELS]; h_synthesis_state = hParamMC->h_output_synthesis_cov_state; set_zero_fx( input_f_real_fx, PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero_fx( input_f_imag_fx, PARAM_MC_MAX_TRANSPORT_CHANS ); - set_zero_fx( output_f_real_fx, MAX_CICP_CHANNELS ); - set_zero_fx( output_f_imag_fx, MAX_CICP_CHANNELS ); - set_zero_fx( diff_f_real_fx, MAX_CICP_CHANNELS ); - set_zero_fx( diff_f_imag_fx, MAX_CICP_CHANNELS ); + + set_zero_fx( diff_f_real_fx, MAX_LS_CHANNELS ); + set_zero_fx( diff_f_imag_fx, MAX_LS_CHANNELS ); FOR( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) { @@ -548,33 +551,32 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( move16(); } - v_multc_fixed( mixing_matrix_fx[param_band_idx], L_deposit_h( hParamMC->h_output_synthesis_params.interpolator_fx[slot_idx_tot] ), mixing_matrix_smooth_fx, imult1616( nY, nX ) ); + v_multc_fx( mixing_matrix_fx[param_band_idx], L_deposit_h( hParamMC->h_output_synthesis_params.interpolator_fx[slot_idx_tot] ), mixing_matrix_smooth_fx, imult1616( nY, nX ) ); mixing_matrix_smooth_e = mixing_matrix_e[param_band_idx]; // interpolator is W16 move16(); - v_multc_fixed( h_synthesis_state.mixing_matrix_old_fx[param_band_idx], L_sub( ONE_IN_Q31, L_deposit_h( hParamMC->h_output_synthesis_params.interpolator_fx[slot_idx_tot] ) ), mixing_matrix_buffer_fx, imult1616( nY, nX ) ); + v_multc_fx( h_synthesis_state.mixing_matrix_old_fx[param_band_idx], L_sub( ONE_IN_Q31, L_deposit_h( hParamMC->h_output_synthesis_params.interpolator_fx[slot_idx_tot] ) ), mixing_matrix_buffer_fx, imult1616( nY, nX ) ); mixing_matrix_buffer_e = h_synthesis_state.mixing_matrix_old_exp[param_band_idx]; // interpolator is W16 move16(); - v_add_fixed_me( mixing_matrix_smooth_fx, mixing_matrix_smooth_e, mixing_matrix_buffer_fx, mixing_matrix_buffer_e, mixing_matrix_smooth_fx, &mixing_matrix_smooth_e, imult1616( nY, nX ), 0 ); + v_add_fx_me( mixing_matrix_smooth_fx, mixing_matrix_smooth_e, mixing_matrix_buffer_fx, mixing_matrix_buffer_e, mixing_matrix_smooth_fx, &mixing_matrix_smooth_e, imult1616( nY, nX ), 0 ); IF( have_residual ) { /* residual mixing matrix interpolation*/ - v_multc_fixed( mixing_matrix_res_fx[param_band_idx], L_deposit_h( hParamMC->h_output_synthesis_params.interpolator_fx[slot_idx_tot] ), mixing_matrix_res_smooth_fx, imult1616( nY, nY ) ); + v_multc_fx( mixing_matrix_res_fx[param_band_idx], L_deposit_h( hParamMC->h_output_synthesis_params.interpolator_fx[slot_idx_tot] ), mixing_matrix_res_smooth_fx, imult1616( nY, nY ) ); mixing_matrix_res_smooth_e = mixing_matrix_res_e[param_band_idx]; // interpolator is W16 move16(); set_zero_fx( mixing_matrix_buffer_fx, imult1616( nY, nY ) ); - v_multc_fixed( h_synthesis_state.mixing_matrix_res_old_fx[param_band_idx], L_sub( ONE_IN_Q31, L_deposit_h( hParamMC->h_output_synthesis_params.interpolator_fx[slot_idx_tot] ) ), mixing_matrix_buffer_fx, imult1616( nY, nY ) ); + v_multc_fx( h_synthesis_state.mixing_matrix_res_old_fx[param_band_idx], L_sub( ONE_IN_Q31, L_deposit_h( hParamMC->h_output_synthesis_params.interpolator_fx[slot_idx_tot] ) ), mixing_matrix_buffer_fx, imult1616( nY, nY ) ); mixing_matrix_buffer_e = h_synthesis_state.mixing_matrix_res_old_exp[param_band_idx]; // interpolator is W16 move16(); - v_add_fixed_me( mixing_matrix_res_smooth_fx, mixing_matrix_res_smooth_e, mixing_matrix_buffer_fx, mixing_matrix_buffer_e, mixing_matrix_res_smooth_fx, &mixing_matrix_res_smooth_e, imult1616( nY, nY ), 0 ); + v_add_fx_me( mixing_matrix_res_smooth_fx, mixing_matrix_res_smooth_e, mixing_matrix_buffer_fx, mixing_matrix_buffer_e, mixing_matrix_res_smooth_fx, &mixing_matrix_res_smooth_e, imult1616( nY, nY ), 0 ); } - FOR( band = brange[0]; band < brange[1]; band++ ) { assert( band >= 0 ); @@ -592,20 +594,29 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( } /* apply residual mixing */ - - matrix_product_mant_exp_fx( mixing_matrix_res_smooth_fx, mixing_matrix_res_smooth_e, nY, nY, 0, diff_f_real_fx, 25, nY, 1, 0, output_f_real_fx, &output_f_real_e ); - scale_sig32( output_f_real_fx, nY, sub( Q6, sub( Q31, output_f_real_e ) ) ); // Q6 - - - matrix_product_mant_exp_fx( mixing_matrix_res_smooth_fx, mixing_matrix_res_smooth_e, nY, nY, 0, diff_f_imag_fx, 25, nY, 1, 0, output_f_imag_fx, &output_f_imag_e ); - scale_sig32( output_f_imag_fx, nY, sub( Q6, sub( Q31, output_f_imag_e ) ) ); // Q6 - - FOR( ch_idx = 0; ch_idx < nY; ch_idx++ ) { - Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = output_f_real_fx[ch_idx]; // Q6 - move32(); - Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = output_f_imag_fx[ch_idx]; // Q6 - move32(); + Word16 shifter; + shifter = sub( mixing_matrix_res_smooth_e, 32 ); + FOR( ch_idx = 0; ch_idx < nY; ch_idx++ ) + { + Word16 i; + Word16 idx; + Word64 temp_real, temp_imag; + + idx = ch_idx; + temp_real = 0; + temp_imag = 0; + move64(); + move64(); + FOR( i = 0; i < nY; i++ ) + { + temp_real = W_mac_32_32( temp_real, mixing_matrix_res_smooth_fx[idx], diff_f_real_fx[i] ); + temp_imag = W_mac_32_32( temp_imag, mixing_matrix_res_smooth_fx[idx], diff_f_imag_fx[i] ); + idx += nY; + } + Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = W_shl_sat_l( temp_real, shifter ); + Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = W_shl_sat_l( temp_imag, shifter ); + } } } ELSE @@ -630,21 +641,32 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( } /* apply mixing matrix */ - - matrix_product_mant_exp_fx( mixing_matrix_smooth_fx, mixing_matrix_smooth_e, nY, nX, 0, input_f_real_fx, 25, nX, 1, 0, output_f_real_fx, &output_f_real_e ); - scale_sig32( output_f_real_fx, MAX_CICP_CHANNELS, sub( 6, sub( 31, output_f_real_e ) ) ); // Q6 - - - matrix_product_mant_exp_fx( mixing_matrix_smooth_fx, mixing_matrix_smooth_e, nY, nX, 0, input_f_imag_fx, 25, nX, 1, 0, output_f_imag_fx, &output_f_imag_e ); - scale_sig32( output_f_imag_fx, MAX_CICP_CHANNELS, sub( 6, sub( 31, output_f_imag_e ) ) ); // Q6 - - /* collect output */ - FOR( ch_idx = 0; ch_idx < nY; ch_idx++ ) { - Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add( Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band], output_f_real_fx[ch_idx] ); - move32(); - Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add( Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band], output_f_imag_fx[ch_idx] ); - move32(); + Word16 shifter; + shifter = 31 - mixing_matrix_smooth_e; + + FOR( ch_idx = 0; ch_idx < nY; ch_idx++ ) + { + Word16 i; + Word16 idx; + Word64 temp_real, temp_imag; + + idx = ch_idx; + temp_real = 0; + temp_imag = 0; + move64(); + move64(); + for ( i = 0; i < nX; i++ ) + { + temp_real = W_add( temp_real, W_mult0_32_32( mixing_matrix_smooth_fx[idx], input_f_real_fx[i] ) ); + temp_imag = W_add( temp_imag, W_mult0_32_32( mixing_matrix_smooth_fx[idx], input_f_imag_fx[i] ) ); + idx += nY; + } + Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add( Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band], W_extract_l( W_shr( temp_real, shifter ) ) ); + move32(); + Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add( Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band], W_extract_l( W_shr( temp_imag, shifter ) ) ); + move32(); + } } } } @@ -686,7 +708,7 @@ Word16 computeMixingMatrices_fx( Word32 mat_mult_buffer1_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; Word32 mat_mult_buffer2_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; Word32 Cx_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - Word32 Cy_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word32 Cy_fx[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; // Q31 out Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; // Q31 out Word16 Cx_fx_e; @@ -695,7 +717,6 @@ Word16 computeMixingMatrices_fx( Word32 svd_s_buffer_fx[MAX_OUTPUT_CHANNELS]; Word16 svd_s_buffer_e[MAX_OUTPUT_CHANNELS]; - Word32 limit_fx; Word16 limit_e; @@ -711,7 +732,7 @@ Word16 computeMixingMatrices_fx( Word32 Kx_reg_inv_fx[MAX_TRANSPORT_CHANNELS * MAX_TRANSPORT_CHANNELS]; Word16 Kx_reg_inv_e[MAX_TRANSPORT_CHANNELS * MAX_TRANSPORT_CHANNELS]; - Word32 Q_fx[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS]; + Word32 Q_fx[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_LS_CHANNELS]; Word16 Q_e; Word32 Q_Cx_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; @@ -723,11 +744,7 @@ Word16 computeMixingMatrices_fx( Word32 G_hat_fx[MAX_OUTPUT_CHANNELS]; Word16 G_hat_buff_e[MAX_OUTPUT_CHANNELS]; -#ifdef OPT_BASOP_ADD_v1 Word16 mat_mult_buffer2_e, mat_mult_buffer3_e; -#else /* OPT_BASOP_ADD_v1 */ - Word16 mat_mult_buffer1_e, mat_mult_buffer2_e, mat_mult_buffer3_e; -#endif /* OPT_BASOP_ADD_v1 */ Word32 mat_mult_buffer3_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; @@ -767,7 +784,6 @@ Word16 computeMixingMatrices_fx( Cy_fx_e = Cy_e; move16(); - /*-----------------------------------------------------------------* * Decomposition of Cy *-----------------------------------------------------------------*/ @@ -777,9 +793,7 @@ Word16 computeMixingMatrices_fx( mat2svdMat_fx( Cy_fx, svd_in_buffer_fx, lengthCy, lengthCy, 0 ); svd_fx( svd_in_buffer_fx, Cy_fx_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, svd_s_buffer_e, lengthCy, lengthCy ); -#ifdef OPT_BASOP_ADD_v1 Word16 max_e = -32; -#endif /* OPT_BASOP_ADD_v1 */ /* Computing Ky */ FOR( i = 0; i < lengthCy; ++i ) { @@ -792,12 +806,9 @@ Word16 computeMixingMatrices_fx( move32(); Ky_fx_e[i + ( j * lengthCy )] = tmp_e; move16(); -#ifdef OPT_BASOP_ADD_v1 max_e = s_max( max_e, tmp_e ); -#endif /* OPT_BASOP_ADD_v1 */ } } -#ifdef OPT_BASOP_ADD_v1 FOR( i = 0; i < lengthCy * lengthCy; ++i ) { Ky_fx[i] = L_shr( Ky_fx[i], sub( max_e, Ky_fx_e[i] ) ); @@ -805,7 +816,6 @@ Word16 computeMixingMatrices_fx( Ky_fx_e[i] = max_e; move16(); } -#endif /* OPT_BASOP_ADD_v1 */ /*-----------------------------------------------------------------* * Decomposition of Cx @@ -816,9 +826,7 @@ Word16 computeMixingMatrices_fx( mat2svdMat_fx( Cx_fx, svd_in_buffer_fx, lengthCx, lengthCx, 0 ); svd_fx( svd_in_buffer_fx, Cx_fx_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, svd_s_buffer_e, lengthCx, lengthCx ); -#ifdef OPT_BASOP_ADD_v1 max_e = -32; -#endif /* OPT_BASOP_ADD_v1 */ FOR( i = 0; i < lengthCx; ++i ) { FOR( j = 0; j < lengthCx; ++j ) @@ -830,12 +838,9 @@ Word16 computeMixingMatrices_fx( move32(); Kx_fx_e[( i + ( j * lengthCx ) )] = tmp_e; move16(); -#ifdef OPT_BASOP_ADD_v1 max_e = s_max( max_e, tmp_e ); -#endif /* OPT_BASOP_ADD_v1 */ } } -#ifdef OPT_BASOP_ADD_v1 FOR( i = 0; i < lengthCx * lengthCx; ++i ) { Kx_fx[i] = L_shr( Kx_fx[i], sub( max_e, Kx_fx_e[i] ) ); @@ -843,7 +848,6 @@ Word16 computeMixingMatrices_fx( Kx_fx_e[i] = max_e; move16(); } -#endif /* OPT_BASOP_ADD_v1 */ FOR( i = 0; i < lengthCx; ++i ) { @@ -865,7 +869,7 @@ Word16 computeMixingMatrices_fx( move16(); FOR( i = 1; i < lengthCx; i++ ) { - IF( BASOP_Util_Cmp_Mant32Exp( svd_s_buffer_fx[i], svd_s_buffer_e[i], limit_fx, limit_e ) > 0 ) + IF( GT_32( svd_s_buffer_fx[i], L_shl_sat( limit_fx, sub( limit_e, svd_s_buffer_e[i] ) ) ) ) { limit_fx = svd_s_buffer_fx[i]; move32(); @@ -874,13 +878,19 @@ Word16 computeMixingMatrices_fx( } } - L_tmp = Mpy_32_32( limit_fx, reg_Sx_fx ); limit_e = add( limit_e, reg_Sx_e ); - limit_fx = L_add( L_tmp, EPSILON_FX ); + limit_fx = Mpy_32_32( limit_fx, reg_Sx_fx ); + IF( BASOP_Util_Cmp_Mant32Exp( limit_fx, limit_e, SQRT_EPSILON_FX /* Q31 */, 0 ) < 0 ) + { + limit_fx = SQRT_EPSILON_FX; + move32(); + limit_e = 0; + move16(); + } FOR( i = 0; i < lengthCx; ++i ) { - IF( BASOP_Util_Cmp_Mant32Exp( svd_s_buffer_fx[i], svd_s_buffer_e[i], limit_fx, limit_e ) < 0 ) + IF( LT_32( L_shl_sat( svd_s_buffer_fx[i], sub( svd_s_buffer_e[i], limit_e ) ), limit_fx ) ) { svd_s_buffer_fx[i] = limit_fx; move32(); @@ -889,13 +899,11 @@ Word16 computeMixingMatrices_fx( } } - limit_fx = 0; move32(); limit_e = 0; move16(); - /*-----------------------------------------------------------------* * regularized Kx-1 *-----------------------------------------------------------------*/ @@ -919,15 +927,14 @@ Word16 computeMixingMatrices_fx( *-----------------------------------------------------------------*/ /* Computing Q*Cx*Q' */ - matrix_product_mant_exp_fx( Q_fx, Q_e, lengthCy, lengthCx, 0, Cx_fx, Cx_fx_e, lengthCx, lengthCx, 0, Q_Cx_fx, &Q_Cx_e ); matrix_product_diag_fx( Q_Cx_fx, Q_Cx_e, lengthCy, lengthCx, 0, Q_fx, Q_e, lengthCy, lengthCx, 1, Cy_hat_diag_fx, &Cy_hat_diag_e ); - + Word16 com_e = sub( limit_e, Cy_hat_diag_e ); FOR( i = 0; i < lengthCy; ++i ) { - IF( BASOP_Util_Cmp_Mant32Exp( Cy_hat_diag_fx[i], Cy_hat_diag_e, limit_fx, limit_e ) > 0 ) + IF( GT_32( Cy_hat_diag_fx[i], L_shl_sat( limit_fx, com_e ) ) ) { limit_fx = Cy_hat_diag_fx[i]; move32(); @@ -935,15 +942,16 @@ Word16 computeMixingMatrices_fx( move16(); } } - L_tmp = Mpy_32_32( limit_fx, reg_ghat_fx ); // limit_e+ reg_ghat_e - limit_fx = L_add( L_tmp, EPSILON_FX ); + limit_fx = Madd_32_32( EPSILON_FX, limit_fx, reg_ghat_fx ); // limit_e+ reg_ghat_e limit_e = add( limit_e, reg_ghat_e ); + com_e = sub( Cy_hat_diag_e, limit_e ); FOR( i = 0; i < lengthCy; ++i ) { Cy_hat_diag_buff_e[i] = Cy_hat_diag_e; move16(); - IF( BASOP_Util_Cmp_Mant32Exp( limit_fx, limit_e, Cy_hat_diag_fx[i], Cy_hat_diag_buff_e[i] ) > 0 ) /* Computing Cy_hat_diag = max(Cy_hat_diag,limit) */ + + IF( GT_32( limit_fx, L_shl_sat( Cy_hat_diag_fx[i], com_e ) ) ) { Cy_hat_diag_fx[i] = limit_fx; move32(); @@ -960,56 +968,20 @@ Word16 computeMixingMatrices_fx( move16(); } - /*-----------------------------------------------------------------* * Formulate optimal P *-----------------------------------------------------------------*/ /* Computing the input matrix Kx'*Q'*G_hat'*Ky */ - -#ifdef OPT_BASOP_ADD_v1 Word16 mat_mult_buffer1_fx_e; -#else /* OPT_BASOP_ADD_v1 */ - Word16 mat_mult_buffer1_fx_e[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - Word16 Q_e_arr[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS]; - set16_fx( Q_e_arr, Q_e, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS ); - - matrix_product_mant_exp( Kx_fx, Kx_fx_e, lengthCx, lengthCx, 1, Q_fx, Q_e_arr, lengthCy, lengthCx, 1, mat_mult_buffer1_fx, mat_mult_buffer1_fx_e ); -#endif /* OPT_BASOP_ADD_v1 */ Word16 mat_mult_buffer2_fx_e[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; -#ifdef OPT_BASOP_ADD_v1 matrix_product_mant_exp_fx( Kx_fx, Kx_fx_e[0], lengthCx, lengthCx, 1, Q_fx, Q_e, lengthCy, lengthCx, 1, mat_mult_buffer1_fx, &mat_mult_buffer1_fx_e ); matrix_diag_product_fx_2( mat_mult_buffer1_fx, mat_mult_buffer1_fx_e, lengthCx, lengthCy, 0, G_hat_fx, G_hat_buff_e, lengthCy, mat_mult_buffer2_fx, mat_mult_buffer2_fx_e ); matrix_product_mant_exp_fx( mat_mult_buffer2_fx, mat_mult_buffer2_fx_e[0], lengthCx, lengthCy, 0, Ky_fx, Ky_fx_e[0], lengthCy, lengthCy, 0, mat_mult_buffer1_fx, &mat_mult_buffer1_fx_e ); -#else /* OPT_BASOP_ADD_v1 */ - matrix_diag_product_fx_1( mat_mult_buffer1_fx, mat_mult_buffer1_fx_e, lengthCx, lengthCy, 0, G_hat_fx, G_hat_buff_e, lengthCy, mat_mult_buffer2_fx, mat_mult_buffer2_fx_e ); - - matrix_product_mant_exp( mat_mult_buffer2_fx, mat_mult_buffer2_fx_e, lengthCx, lengthCy, 0, Ky_fx, Ky_fx_e, lengthCy, lengthCy, 0, mat_mult_buffer1_fx, mat_mult_buffer1_fx_e ); - - exp = mat_mult_buffer1_fx_e[0]; - move16(); - FOR( i = 1; i < lengthCy * lengthCx; i++ ) - { - if ( LT_16( exp, mat_mult_buffer1_fx_e[i] ) ) - { - exp = mat_mult_buffer1_fx_e[i]; - move16(); - } - } - - FOR( i = 0; i < lengthCy * lengthCx; i++ ) - { - mat_mult_buffer1_fx[i] = L_shr( mat_mult_buffer1_fx[i], sub( exp, mat_mult_buffer1_fx_e[i] ) ); // Q(31-exp) - move32(); - } - - mat_mult_buffer1_e = exp; - move16(); -#endif /* OPT_BASOP_ADD_v1 */ IF( LT_16( lengthCx, lengthCy ) ) { @@ -1018,11 +990,7 @@ Word16 computeMixingMatrices_fx( move16(); nC = lengthCx; move16(); -#ifdef OPT_BASOP_ADD_v1 svd_fx( svd_in_buffer_fx, mat_mult_buffer1_fx_e, svd_v_buffer_fx, svd_s_buffer_fx, svd_u_buffer_fx, svd_s_buffer_e, nL, nC ); -#else /* OPT_BASOP_ADD_v1 */ - svd_fx( svd_in_buffer_fx, mat_mult_buffer1_e, svd_v_buffer_fx, svd_s_buffer_fx, svd_u_buffer_fx, svd_s_buffer_e, nL, nC ); -#endif /* OPT_BASOP_ADD_v1 */ } ELSE { @@ -1031,11 +999,7 @@ Word16 computeMixingMatrices_fx( move16(); nC = lengthCy; move16(); -#ifdef OPT_BASOP_ADD_v1 svd_fx( svd_in_buffer_fx, mat_mult_buffer1_fx_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, svd_s_buffer_e, nL, nC ); -#else /* OPT_BASOP_ADD_v1 */ - svd_fx( svd_in_buffer_fx, mat_mult_buffer1_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, svd_s_buffer_e, nL, nC ); -#endif /* OPT_BASOP_ADD_v1 */ } /* Actually Processing P */ @@ -1046,65 +1010,36 @@ Word16 computeMixingMatrices_fx( svdMat2mat_fx( svd_v_buffer_fx, mat_mult_buffer1_fx, lengthCy, lengthCx ); svdMat2mat_fx( svd_u_buffer_fx, mat_mult_buffer2_fx, lengthCx, lengthCx ); -#ifdef OPT_BASOP_ADD_v1 mat_mult_buffer1_fx_e = 0; -#else /* OPT_BASOP_ADD_v1 */ - mat_mult_buffer1_e = 0; -#endif /* OPT_BASOP_ADD_v1 */ move16(); mat_mult_buffer2_e = 0; move16(); -#ifdef OPT_BASOP_ADD_v1 matrix_product_mant_exp_fx( mat_mult_buffer1_fx, mat_mult_buffer1_fx_e, lengthCy, lengthCx, 0, mat_mult_buffer2_fx, mat_mult_buffer2_e, lengthCx, lengthCx, 1, mat_mult_buffer3_fx, &mat_mult_buffer3_e ); -#else /* OPT_BASOP_ADD_v1 */ - matrix_product_mant_exp_fx( mat_mult_buffer1_fx, mat_mult_buffer1_e, lengthCy, lengthCx, 0, - mat_mult_buffer2_fx, mat_mult_buffer2_e, lengthCx, lengthCx, 1, - mat_mult_buffer3_fx, &mat_mult_buffer3_e ); -#endif /* OPT_BASOP_ADD_v1 */ /************************ Formulate M **********************/ -#ifdef OPT_BASOP_ADD_v1 matrix_product_mant_exp_fx( Ky_fx, Ky_fx_e[0], lengthCy, lengthCy, 0, mat_mult_buffer3_fx, mat_mult_buffer3_e, lengthCy, lengthCx, 0, mat_mult_buffer1_fx, &mat_mult_buffer1_fx_e ); -#else /* OPT_BASOP_ADD_v1 */ - Word16 mat_mult_buffer3_fx_e[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - set16_fx( mat_mult_buffer3_fx_e, mat_mult_buffer3_e, MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS ); - matrix_product_mant_exp( Ky_fx, Ky_fx_e, lengthCy, lengthCy, 0, mat_mult_buffer3_fx, mat_mult_buffer3_fx_e, lengthCy, lengthCx, 0, mat_mult_buffer1_fx, mat_mult_buffer1_fx_e ); -#endif /* OPT_BASOP_ADD_v1 */ + Word16 mixing_matrix_fx_e[MAX_LS_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; - Word16 mixing_matrix_fx_e[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; - -#ifdef OPT_BASOP_ADD_v1 Word16 mat_mult_buffer1_fx_e1[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; set16_fx( mat_mult_buffer1_fx_e1, mat_mult_buffer1_fx_e, MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS ); matrix_product_mant_exp( mat_mult_buffer1_fx, mat_mult_buffer1_fx_e1, lengthCy, lengthCx, 0, Kx_reg_inv_fx, Kx_reg_inv_e, lengthCx, lengthCx, 0, mixing_matrix_fx, mixing_matrix_fx_e ); -#else /* OPT_BASOP_ADD_v1 */ - matrix_product_mant_exp( mat_mult_buffer1_fx, mat_mult_buffer1_fx_e, lengthCy, lengthCx, 0, Kx_reg_inv_fx, Kx_reg_inv_e, lengthCx, lengthCx, 0, mixing_matrix_fx, mixing_matrix_fx_e ); -#endif /* OPT_BASOP_ADD_v1 */ /*-----------------------------------------------------------------* * Formulate Cr *-----------------------------------------------------------------*/ /* Compute Cy_tilde = M*Cx*M' */ - - Word16 Cx_e_arr[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; set16_fx( Cx_e_arr, Cx_fx_e, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); -#ifdef OPT_BASOP_ADD_v1 matrix_product_mant_exp( mixing_matrix_fx, mixing_matrix_fx_e, lengthCy, lengthCx, 0, Cx_fx, Cx_e_arr, lengthCx, lengthCx, 0, mat_mult_buffer1_fx, mat_mult_buffer1_fx_e1 ); matrix_product_mant_exp( mat_mult_buffer1_fx, mat_mult_buffer1_fx_e1, lengthCy, lengthCx, 0, mixing_matrix_fx, mixing_matrix_fx_e, lengthCy, lengthCx, 1, mat_mult_buffer2_fx, mat_mult_buffer2_fx_e ); -#else /* OPT_BASOP_ADD_v1 */ - matrix_product_mant_exp( mixing_matrix_fx, mixing_matrix_fx_e, lengthCy, lengthCx, 0, Cx_fx, Cx_e_arr, lengthCx, lengthCx, 0, mat_mult_buffer1_fx, mat_mult_buffer1_fx_e ); - - matrix_product_mant_exp( mat_mult_buffer1_fx, mat_mult_buffer1_fx_e, lengthCy, lengthCx, 0, mixing_matrix_fx, mixing_matrix_fx_e, lengthCy, lengthCx, 1, mat_mult_buffer2_fx, mat_mult_buffer2_fx_e ); -#endif /* OPT_BASOP_ADD_v1 */ exp = mixing_matrix_fx_e[0]; move16(); @@ -1129,7 +1064,7 @@ Word16 computeMixingMatrices_fx( Cr_p_fx = Cr_fx; Cy_p_fx = Cy_fx; Cy_tilde_p_fx = mat_mult_buffer2_fx; - Word16 Cr_e_arr[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word16 Cr_e_arr[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; FOR( i = 0; i < lengthCy; ++i ) { FOR( j = 0; j < lengthCy; ++j ) @@ -1143,11 +1078,7 @@ Word16 computeMixingMatrices_fx( } /* Avoid Meaningless negative main diagonal elements */ -#ifdef OPT_BASOP_ADD_v1 IF( Cr_fx[i + ( i * lengthCy )] < 0 ) -#else /* OPT_BASOP_ADD_v1 */ - IF( BASOP_Util_Cmp_Mant32Exp( Cr_fx[i + ( i * lengthCy )], exp, 0, 0 ) < 0 ) -#endif /* OPT_BASOP_ADD_v1 */ { Cr_fx[i + ( i * lengthCy )] = 0; move32(); @@ -1209,11 +1140,7 @@ Word16 computeMixingMatrices_fx( { /* Avoid correction for very small energies, main diagonal elements of Cy_tilde_p may be negative */ -#ifdef OPT_BASOP_ADD_v1 IF( Cy_tilde_p_fx[i + ( i * lengthCy )] < 0 ) -#else /* OPT_BASOP_ADD_v1 */ - IF( BASOP_Util_Cmp_Mant32Exp( Cy_tilde_p_fx[i + ( i * lengthCy )], mat_mult_buffer2_e, 0, 0 ) < 0 ) -#endif /* OPT_BASOP_ADD_v1 */ { adj_fx_p[i] = 1073741824; // 1.0f in Q30 move32(); @@ -1232,12 +1159,8 @@ Word16 computeMixingMatrices_fx( move16(); } -#ifdef OPT_BASOP_ADD_v1 Word32 temp = W_shl_sat_l( W_deposit32_l( 4 ), sub( 31, adj_e[i] ) ); IF( GT_32( adj_fx_p[i], temp ) ) -#else /* OPT_BASOP_ADD_v1 */ - IF( BASOP_Util_Cmp_Mant32Exp( adj_fx_p[i], adj_e[i], 1073741824, 3 ) > 0 ) -#endif /* OPT_BASOP_ADD_v1 */ { adj_fx_p[i] = 1073741824; // 1.0f in Q30 move32(); @@ -1281,6 +1204,7 @@ Word16 computeMixingMatrices_fx( return out; } + /*-------------------------------------------------------------------* * computeMixingMatricesResidual() * @@ -1322,11 +1246,7 @@ Word16 computeMixingMatricesResidual_fx( Word16 mixing_matrix_e = 0, mat_mult_buffer1_e, adj_e, mat_mult_buffer3_e, mat_mult_buffer2_e; move16(); -#ifdef MSAN_FIX Word32 svd_s_buffer_fx[MAX_OUTPUT_CHANNELS] = { 0 }; -#else - Word32 svd_s_buffer_fx[MAX_OUTPUT_CHANNELS]; -#endif Word16 svd_s_buffer_e[MAX_OUTPUT_CHANNELS]; Word32 L_tmp; Word16 tmp_e; @@ -1370,9 +1290,7 @@ Word16 computeMixingMatricesResidual_fx( svd_fx( svd_in_buffer_fx, Cy_fx_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, svd_s_buffer_e, lengthCy, lengthCy ); /* Computing Ky */ -#ifdef OPT_BASOP_ADD_v1 Word16 max_e = -32; -#endif /* OPT_BASOP_ADD_v1 */ FOR( i = 0; i < lengthCy; ++i ) { FOR( j = 0; j < lengthCy; ++j ) @@ -1384,13 +1302,10 @@ Word16 computeMixingMatricesResidual_fx( move32(); Ky_fx_e[i + j * lengthCy] = tmp_e; move16(); -#ifdef OPT_BASOP_ADD_v1 max_e = s_max( max_e, tmp_e ); -#endif /* OPT_BASOP_ADD_v1 */ } } -#ifdef OPT_BASOP_ADD_v1 FOR( i = 0; i < lengthCy * lengthCy; ++i ) { Ky_fx[i] = L_shr( Ky_fx[i], sub( max_e, Ky_fx_e[i] ) ); @@ -1398,7 +1313,6 @@ Word16 computeMixingMatricesResidual_fx( Ky_fx_e[i] = max_e; move16(); } -#endif /* OPT_BASOP_ADD_v1 */ /*-----------------------------------------------------------------* * Decomposition of Cx @@ -1410,9 +1324,7 @@ Word16 computeMixingMatricesResidual_fx( * square root of the diagonal of Cx */ /* Computing Kx */ -#ifdef OPT_BASOP_ADD_v1 max_e = -32; -#endif /* OPT_BASOP_ADD_v1 */ FOR( i = 0; i < lengthCx; ++i ) { exp = Cx_e; @@ -1421,12 +1333,9 @@ Word16 computeMixingMatricesResidual_fx( move32(); Kx_fx_e[i] = exp; move16(); -#ifdef OPT_BASOP_ADD_v1 max_e = s_max( max_e, exp ); -#endif /* OPT_BASOP_ADD_v1 */ } -#ifdef OPT_BASOP_ADD_v1 FOR( i = 0; i < lengthCx; ++i ) { Kx_fx[i] = L_shr( Kx_fx[i], sub( max_e, Kx_fx_e[i] ) ); @@ -1434,7 +1343,6 @@ Word16 computeMixingMatricesResidual_fx( Kx_fx_e[i] = max_e; move16(); } -#endif /* OPT_BASOP_ADD_v1 */ /*-----------------------------------------------------------------* * Regularization of Sx @@ -1442,25 +1350,13 @@ Word16 computeMixingMatricesResidual_fx( limit_fx = Kx_fx[0]; move32(); -#ifndef OPT_BASOP_ADD_v1 - limit_e = Kx_fx_e[0]; - move16(); -#endif /* OPT_BASOP_ADD_v1 */ FOR( i = 1; i < lengthCx; i++ ) { -#ifdef OPT_BASOP_ADD_v1 IF( GT_32( Kx_fx[i], limit_fx ) ) -#else /* OPT_BASOP_ADD_v1 */ - IF( BASOP_Util_Cmp_Mant32Exp( Kx_fx[i], Kx_fx_e[i], limit_fx, limit_e ) > 0 ) -#endif /* OPT_BASOP_ADD_v1 */ { limit_fx = Kx_fx[i]; move32(); -#ifndef OPT_BASOP_ADD_v1 - limit_e = Kx_fx_e[i]; - move16(); -#endif /* OPT_BASOP_ADD_v1 */ } } @@ -1468,15 +1364,11 @@ Word16 computeMixingMatricesResidual_fx( L_tmp = L_add( L_tmp, EPSILLON_FX ); limit_fx = L_tmp; move16(); -#ifdef OPT_BASOP_ADD_v1 limit_e = add( Kx_fx_e[0], reg_Sx_e ); -#else /* OPT_BASOP_ADD_v1 */ - limit_e = add( limit_e, reg_Sx_e ); -#endif /* OPT_BASOP_ADD_v1 */ FOR( i = 0; i < lengthCx; ++i ) { - IF( BASOP_Util_Cmp_Mant32Exp( Kx_fx[i], Kx_fx_e[i], limit_fx, limit_e ) > 0 ) + IF( GT_32( Kx_fx[i], L_shl_sat( limit_fx, sub( limit_e, Kx_fx_e[i] ) ) ) ) { div_tmp = Kx_fx[i]; move32(); @@ -1517,9 +1409,10 @@ Word16 computeMixingMatricesResidual_fx( Cy_hat_diag_e = Cx_e; move16(); + Word16 com_e = sub( limit_e, Cy_hat_diag_e ); FOR( i = 0; i < lengthCy; ++i ) { - IF( BASOP_Util_Cmp_Mant32Exp( Cy_hat_diag_fx[i], Cy_hat_diag_e, limit_fx, limit_e ) > 0 ) + IF( GT_32( Cy_hat_diag_fx[i], L_shl_sat( limit_fx, com_e ) ) ) { limit_fx = Cy_hat_diag_fx[i]; move32(); @@ -1528,16 +1421,17 @@ Word16 computeMixingMatricesResidual_fx( } } - L_tmp = Mpy_32_32( limit_fx, reg_ghat_fx ); // Q(limit_e+reg_ghat_e) - limit_fx = L_add( L_tmp, EPSILON_FX ); + limit_fx = Madd_32_32( EPSILON_FX, limit_fx, reg_ghat_fx ); // Q(limit_e+reg_ghat_e) limit_e = add( limit_e, reg_ghat_e ); /* Computing G_hat */ + + com_e = sub( Cy_hat_diag_e, limit_e ); FOR( i = 0; i < lengthCy; ++i ) { Cy_hat_diag_fx_e[i] = Cy_hat_diag_e; move16(); - IF( BASOP_Util_Cmp_Mant32Exp( limit_fx, limit_e, Cy_hat_diag_fx[i], Cy_hat_diag_e ) > 0 ) /* Computing Cy_hat_diag = max(Cy_hat_diag,limit) */ + IF( GT_32( limit_fx, L_shl_sat( Cy_hat_diag_fx[i], com_e ) ) ) /* Computing Cy_hat_diag = max(Cy_hat_diag,limit) */ { Cy_hat_diag_fx[i] = limit_fx; move32(); @@ -1560,8 +1454,7 @@ Word16 computeMixingMatricesResidual_fx( FOR( i = 0; i < num_outputs; i++ ) { - L_tmp = Mpy_32_32( Kx_fx[i], G_hat_fx[i] ); // Q(31-(Kx_fx_e+G_hag_e)) - Kx_fx[i] = L_tmp; + Kx_fx[i] = Mpy_32_32( Kx_fx[i], G_hat_fx[i] ); // Q(31-(Kx_fx_e+G_hag_e)) move32(); Kx_fx_e[i] = add( Kx_fx_e[i], G_hat_e[i] ); move16(); @@ -1575,10 +1468,9 @@ Word16 computeMixingMatricesResidual_fx( FOR( j = 0; j < num_outputs; j++ ) { - L_tmp = Mpy_32_32( Ky_fx[i + j * num_outputs], fac_fx ); // Q(31-(Ky_fx_e+Kx_fx_e)) - mat_mult_buffer1_fx[i + j * num_outputs] = L_tmp; + mat_mult_buffer1_fx[i + j * num_outputs] = Mpy_32_32( Ky_fx[i + j * num_outputs], fac_fx ); // Q(31-(Ky_fx_e+Kx_fx_e)); move32(); - mat_mult_buffer1_buff_e[i + j * num_outputs] = extract_l( L_add( Ky_fx_e[i + j * num_outputs], Kx_fx_e[i] ) ); + mat_mult_buffer1_buff_e[i + j * num_outputs] = add( Ky_fx_e[i + j * num_outputs], Kx_fx_e[i] ); move16(); } } @@ -1622,17 +1514,10 @@ Word16 computeMixingMatricesResidual_fx( *-----------------------------------------------------------------*/ -#ifdef OPT_BASOP_ADD_v1 matrix_product_mant_exp_fx( Ky_fx, Ky_fx_e[0], lengthCy, lengthCy, 0, mat_mult_buffer3_fx, mat_mult_buffer3_e, lengthCy, lengthCx, 0, mat_mult_buffer1_fx, mat_mult_buffer1_buff_e ); set16_fx( mat_mult_buffer1_buff_e, mat_mult_buffer1_buff_e[0], MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS ); -#else /* OPT_BASOP_ADD_v1 */ - Word16 mat_mult_buffer3_fx_e[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - set16_fx( mat_mult_buffer3_fx_e, mat_mult_buffer3_e, MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS ); - - matrix_product_mant_exp( Ky_fx, Ky_fx_e, lengthCy, lengthCy, 0, mat_mult_buffer3_fx, mat_mult_buffer3_fx_e, lengthCy, lengthCx, 0, mat_mult_buffer1_fx, mat_mult_buffer1_buff_e ); -#endif /* OPT_BASOP_ADD_v1 */ - Word16 mixing_matrix_fx_e[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word16 mixing_matrix_fx_e[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; FOR( i = 0; i < num_outputs; i++ ) { @@ -1642,8 +1527,7 @@ Word16 computeMixingMatricesResidual_fx( FOR( j = 0; j < num_outputs; j++ ) { - L_tmp = Mpy_32_32( mat_mult_buffer1_fx[j + i * num_outputs], fac_fx ); // Q(31-mat_mult_buffer1_e+Kx_reg_inv_e) - mixing_matrix_fx[j + i * num_outputs] = L_tmp; + mixing_matrix_fx[j + i * num_outputs] = Mpy_32_32( mat_mult_buffer1_fx[j + i * num_outputs], fac_fx ); // Q(31-mat_mult_buffer1_e+Kx_reg_inv_e); move32(); mixing_matrix_fx_e[j + i * num_outputs] = add( mat_mult_buffer1_buff_e[j + i * num_outputs], Kx_reg_inv_e[i] ); move16(); @@ -1656,8 +1540,8 @@ Word16 computeMixingMatricesResidual_fx( /* Compute Cy_tilde = M*Cx*M' */ - Word16 Cx_e_arr[MAX_CICP_CHANNELS]; - set16_fx( Cx_e_arr, Cx_e, MAX_CICP_CHANNELS ); + Word16 Cx_e_arr[MAX_LS_CHANNELS]; + set16_fx( Cx_e_arr, Cx_e, MAX_LS_CHANNELS ); matrix_diag_product_fx_1( mixing_matrix_fx, mixing_matrix_fx_e, lengthCy, lengthCx, 0, Cx_fx, Cx_e_arr, lengthCx, mat_mult_buffer1_fx, mat_mult_buffer1_buff_e ); @@ -1715,12 +1599,8 @@ Word16 computeMixingMatricesResidual_fx( move32(); adj_buff_e[i] = scale; move16(); -#ifdef OPT_BASOP_ADD_v1 Word32 temp = W_shl_sat_l( W_deposit32_l( 4 ), sub( 31, scale ) ); IF( GT_32( adj_fx_p[i], temp ) ) // 1073741824 -> 1.0f in Q30 -#else /* OPT_BASOP_ADD_v1 */ - IF( BASOP_Util_Cmp_Mant32Exp( adj_fx_p[i], scale, 1073741824, 3 ) > 0 ) // 1073741824 -> 1.0f in Q30 -#endif /* OPT_BASOP_ADD_v1 */ { adj_fx_p[i] = 1073741824; // 1.0f in Q30 move32(); @@ -1891,7 +1771,7 @@ Word16 computeMixingMatricesISM_fx( IF( svd_s_buffer_fx[i] ) { Word32 reg_fac; - reg_fac = BASOP_Util_Divide3232_Scale_cadence( MAX_32, svd_s_buffer_fx[i], &temp_e[i] ); + reg_fac = BASOP_Util_Divide3232_Scale_newton( MAX_32, svd_s_buffer_fx[i], &temp_e[i] ); Kx_reg_inv_fx[i] = reg_fac; move32(); temp_e[i] = sub( temp_e[i], svd_s_buffer_fx_e ); @@ -1900,7 +1780,7 @@ Word16 computeMixingMatricesISM_fx( ELSE { Word32 reg_fac; - reg_fac = BASOP_Util_Divide3232_Scale_cadence( MAX_32, EPSILON_FX_M, &temp_e[i] ); + reg_fac = BASOP_Util_Divide3232_Scale_newton( MAX_32, EPSILON_FX_M, &temp_e[i] ); Kx_reg_inv_fx[i] = reg_fac; move32(); temp_e[i] = sub( temp_e[i], EPSILON_FX_E ); @@ -1977,7 +1857,7 @@ Word16 computeMixingMatricesISM_fx( { IF( Cy_hat_diag_fx[i] ) { - G_hat_fx[i] = BASOP_Util_Divide3232_Scale_cadence( Cy_diag_fx[i], Cy_hat_diag_fx[i], &temp_e[i] ); + G_hat_fx[i] = BASOP_Util_Divide3232_Scale_newton( Cy_diag_fx[i], Cy_hat_diag_fx[i], &temp_e[i] ); move32(); temp_e[i] = add( temp_e[i], sub( Cy_diag_e, Cy_hat_diag_e ) ); move16(); @@ -1986,7 +1866,7 @@ Word16 computeMixingMatricesISM_fx( } ELSE { - G_hat_fx[i] = BASOP_Util_Divide3232_Scale_cadence( Cy_diag_fx[i], EPSILON_FX_M, &temp_e[i] ); + G_hat_fx[i] = BASOP_Util_Divide3232_Scale_newton( Cy_diag_fx[i], EPSILON_FX_M, &temp_e[i] ); move32(); temp_e[i] = add( temp_e[i], sub( Cy_diag_e, EPSILON_FX_E ) ); move16(); @@ -2089,7 +1969,7 @@ Word16 computeMixingMatricesISM_fx( { IF( Cy_tilde_p_fx[i + ( i * lengthCy )] ) { - adj_fx[i] = BASOP_Util_Divide3232_Scale_cadence( Cy_diag_fx[i], Cy_tilde_p_fx[i + ( i * lengthCy )], &temp_e[i] ); + adj_fx[i] = BASOP_Util_Divide3232_Scale_newton( Cy_diag_fx[i], Cy_tilde_p_fx[i + ( i * lengthCy )], &temp_e[i] ); move32(); temp_e[i] = add( temp_e[i], sub( Cy_diag_e, mat_mult_buffer2_e ) ); move16(); @@ -2098,7 +1978,7 @@ Word16 computeMixingMatricesISM_fx( } ELSE { - adj_fx[i] = BASOP_Util_Divide3232_Scale_cadence( Cy_diag_fx[i], EPSILON_FX_M, &temp_e[i] ); + adj_fx[i] = BASOP_Util_Divide3232_Scale_newton( Cy_diag_fx[i], EPSILON_FX_M, &temp_e[i] ); move32(); temp_e[i] = add( temp_e[i], sub( Cy_diag_e, EPSILON_FX_E ) ); move16(); @@ -2115,12 +1995,8 @@ Word16 computeMixingMatricesISM_fx( } } -#ifdef OPT_BASOP_ADD_v1 Word32 temp = W_shl_sat_l( W_deposit32_l( 4 ), sub( 31, temp_e[i] ) ); IF( GT_32( adj_fx[i], temp ) ) -#else /* OPT_BASOP_ADD_v1 */ - IF( BASOP_Util_Cmp_Mant32Exp( adj_fx[i], temp_e[i], MAX_32, 2 ) > 0 ) -#endif /* OPT_BASOP_ADD_v1 */ { adj_fx[i] = MAX_32; move32(); diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c deleted file mode 100644 index 2927217234724b4b28b3486eb4aa5604dcbac219..0000000000000000000000000000000000000000 --- a/lib_dec/ivas_init_dec.c +++ /dev/null @@ -1,3257 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#include -#include -#include -#include "options.h" -#include "ivas_cnst.h" -#include "ivas_prot_rend_fx.h" -#include "rom_com.h" -#include "ivas_rom_com.h" -#include "ivas_stat_enc.h" -#include "prot_fx.h" -#include "wmc_auto.h" -#include "ivas_prot_fx.h" - - -/*-------------------------------------------------------------------* - * Local function prototypes - *-------------------------------------------------------------------*/ - -static ivas_error ivas_read_format( Decoder_Struct *st_ivas, Word16 *num_bits_read ); - -static ivas_error doSanityChecks_IVAS( Decoder_Struct *st_ivas ); - - -/*-------------------------------------------------------------------* - * ivas_dec_setup() - * - * IVAS decoder setup - *-------------------------------------------------------------------*/ - -ivas_error ivas_dec_setup( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - UWord16 *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ - Word16 *data /* o : output synthesis signal */ -) -{ - Word16 k, idx, num_bits_read; - Word16 nchan_ism, element_mode_flag; - Decoder_State *st; - Word32 ivas_total_brate; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - num_bits_read = 0; - move16(); - element_mode_flag = 0; - move16(); - - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - move32(); - - /*-------------------------------------------------------------------* - * Read IVAS format - *-------------------------------------------------------------------*/ - - ivas_read_format( st_ivas, &num_bits_read ); - - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src = 0; - move16(); - - /*-------------------------------------------------------------------* - * Read other signling (ISM/MC mode, number of channels, etc.) - *-------------------------------------------------------------------*/ - - IF( is_DTXrate( ivas_total_brate ) == 0 ) - { - /*-------------------------------------------------------------------* - * Read IVAS format related signaling: - * - in ISM : read number of objects - * - in SBA : read SBA planar flag and SBA order - * - in MASA : read number of TC - * - in MC : read LS setup - *-------------------------------------------------------------------*/ - - IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) - { - element_mode_flag = 1; - move16(); - } - ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) - { - /* read the number of objects */ - st_ivas->nchan_transport = 1; - move16(); - nchan_ism = 1; - move16(); - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - k = extract_l( L_sub( res_dec, 1 ) ); - - WHILE( st_ivas->bit_stream[k] && ( nchan_ism < MAX_NUM_OBJECTS ) ) - { - nchan_ism = add( nchan_ism, 1 ); - k = sub( k, 1 ); - } - - st_ivas->nchan_ism = nchan_ism; - move16(); - - IF( NE_32( ( error = ivas_ism_dec_config_fx( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) - { - /* read Ambisonic (SBA) planar flag */ - st_ivas->sba_planar = st_ivas->bit_stream[num_bits_read]; - move16(); - num_bits_read = add( num_bits_read, SBA_PLANAR_BITS ); - - /* read Ambisonic (SBA) order */ - st_ivas->sba_order = st_ivas->bit_stream[num_bits_read + 1]; - move16(); - st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); - move16(); - num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); - test(); - test(); - IF( st_ivas->ini_frame > 0 && NE_32( ivas_total_brate, st_ivas->last_active_ivas_total_brate ) && GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) - { - IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE - { - /* set Ambisonic (SBA) order used for analysis and coding */ - st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->sba_order ); - move16(); - ivas_sba_config_fx( ivas_total_brate, st_ivas->sba_analysis_order, -1, &( st_ivas->nchan_transport ), st_ivas->sba_planar, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) - { - /* read number of MASA transport channels */ - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - IF( st_ivas->bit_stream[res_dec - 1] ) - { - st_ivas->nchan_transport = 2; - move16(); - element_mode_flag = 1; - move16(); - } - ELSE - { - st_ivas->nchan_transport = 1; - move16(); - } - - IF( st_ivas->ini_frame > 0 ) - { - /* reconfigure in case a change of operation mode is detected */ - test(); - test(); - IF( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) || ( st_ivas->ini_active_frame == 0 ) ) - { - IF( EQ_32( st_ivas->last_ivas_format, MASA_FORMAT ) ) - { - test(); - test(); - test(); - IF( ( st_ivas->ini_active_frame == 0 ) && NE_32( ivas_total_brate, FRAME_NO_DATA ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) && EQ_16( st_ivas->nCPE, 1 ) ) - { - st_ivas->hCPE[0]->nchan_out = 1; - move16(); - } - ELSE - { - IF( NE_32( ( error = ivas_masa_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - ELSE - { - IF( NE_32( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, &num_src, SrcInd, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) - { - st_ivas->nchan_transport = 2; /* always 2 MASA transport channels */ - move16(); - /* for the DISC mode the number of objects are written at the end of the bitstream, in the MASA metadata */ - - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - st_ivas->nchan_ism = add( add( shl( st_ivas->bit_stream[res_dec - 1], 1 ), st_ivas->bit_stream[res_dec - 2] ), 1 ); - move16(); - st_ivas->ism_mode = ivas_omasa_ism_mode_select_fx( ivas_total_brate, st_ivas->nchan_ism ); - move16(); - IF( st_ivas->ini_frame > 0 ) - { - /* reconfigure in case a change of operation mode is detected */ - test(); - test(); - IF( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) || ( st_ivas->ini_active_frame == 0 ) ) - { - IF( NE_32( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, &num_src, SrcInd, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - /* the number of objects is written at the end of the bitstream, in the SBA metadata */ - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - st_ivas->nchan_ism = add( add( shl( st_ivas->bit_stream[res_dec - 1], 1 ), st_ivas->bit_stream[res_dec - 2] ), 1 ); - move16(); - - test(); - IF( LT_32( ivas_total_brate, IVAS_24k4 ) || GE_32( ivas_total_brate, IVAS_256k ) ) - { - /* read Ambisonic (SBA) planar flag */ - st_ivas->sba_planar = st_ivas->bit_stream[num_bits_read]; - move16(); - num_bits_read = add( num_bits_read, SBA_PLANAR_BITS ); - } - - st_ivas->sba_order = st_ivas->bit_stream[num_bits_read + 1]; - move16(); - st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); - move16(); - num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); - - /* read Ambisonic (SBA) order */ - if ( LT_32( ivas_total_brate, IVAS_256k ) ) - { - st_ivas->sba_order = 3; - move16(); - } - - test(); - IF( st_ivas->ini_frame > 0 && NE_32( ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ) - { - IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE - { - /* set Ambisonic (SBA) order used for analysis and coding */ - st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->sba_order ); - move16(); - - ivas_sba_config_fx( ivas_total_brate, st_ivas->sba_analysis_order, -1, &( st_ivas->nchan_transport ), st_ivas->sba_planar, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init ); - - /*correct number of CPEs for discrete ISM coding*/ - test(); - IF( st_ivas->ini_frame > 0 && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->nchan_ism, 1 ), 1 ) ); - move16(); - } - } - - IF( GE_32( ivas_total_brate, IVAS_256k ) ) - { - st_ivas->ism_mode = ISM_SBA_MODE_DISC; - move32(); - } - ELSE - { - st_ivas->ism_mode = ISM_MODE_NONE; - move32(); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) - { - /* read MC configuration */ - idx = 0; - move16(); - FOR( k = 0; k < MC_LS_SETUP_BITS; k++ ) - { - IF( st_ivas->bit_stream[num_bits_read + k] ) - { - idx = add( idx, shl( 1, sub( ( MC_LS_SETUP_BITS - 1 ), k ) ) ); - } - } - num_bits_read = add( num_bits_read, MC_LS_SETUP_BITS ); - - /* select MC format mode; reconfigure the MC format decoder */ - IF( NE_32( ( error = ivas_mc_dec_config_fx( st_ivas, idx, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /*-------------------------------------------------------------------* - * Read element mode - *-------------------------------------------------------------------*/ - - IF( st_ivas->ini_frame == 0 && element_mode_flag ) - { - /* read stereo technology info */ - IF( LT_32( ivas_total_brate, MIN_BRATE_MDCT_STEREO ) ) - { - /* 1 bit */ - IF( st_ivas->bit_stream[num_bits_read] ) - { - st_ivas->element_mode_init = add( 1, IVAS_CPE_DFT ); - move16(); - } - ELSE - { - st_ivas->element_mode_init = add( 0, IVAS_CPE_DFT ); - move16(); - } - } - ELSE - { - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - } - } - ELSE IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) - { - SWITCH( st_ivas->sid_format ) - { - case SID_DFT_STEREO: - st_ivas->element_mode_init = IVAS_CPE_DFT; - move16(); - BREAK; - case SID_MDCT_STEREO: - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - BREAK; - case SID_ISM: - st_ivas->element_mode_init = IVAS_SCE; - move16(); - BREAK; - case SID_MASA_1TC: - st_ivas->element_mode_init = IVAS_SCE; - move16(); - st_ivas->nchan_transport = 1; - move16(); - BREAK; - case SID_MASA_2TC:; // empyt statement for declaration - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - IF( EQ_16( st_ivas->bit_stream[( res_dec - 1 ) - SID_FORMAT_NBITS], 1 ) ) - { - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - ELSE - { - st_ivas->element_mode_init = IVAS_CPE_DFT; - move16(); - } - st_ivas->nchan_transport = 2; - move16(); - BREAK; - case SID_SBA_1TC: - st_ivas->element_mode_init = IVAS_SCE; - move16(); - BREAK; - case SID_SBA_2TC: - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - BREAK; - } - - test(); - IF( st_ivas->ini_frame > 0 && EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) - { - Word16 nchan_transport_old, nchan_transport; - nchan_transport_old = st_ivas->nchan_transport; - move16(); - IF( ( EQ_16( st_ivas->sid_format, SID_SBA_2TC ) ) ) - { - nchan_transport = 2; - } - ELSE - { - nchan_transport = 1; - } - move16(); - - IF( NE_16( nchan_transport_old, nchan_transport ) ) - { - /*Setting the default bitrate for the reconfig function*/ - IF( EQ_16( st_ivas->sid_format, SID_SBA_2TC ) ) - { - st_ivas->hDecoderConfig->ivas_total_brate = IVAS_48k; - move16(); - } - ELSE - { - st_ivas->hDecoderConfig->ivas_total_brate = IVAS_24k4; - move16(); - } - - IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->last_active_ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - move32(); - st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate; - move32(); - } - } - - IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) - { - ISM_MODE last_ism_mode = st_ivas->ism_mode; - move32(); - /* read the number of objects */ - st_ivas->nchan_transport = 1; - move16(); - nchan_ism = 1; - move16(); - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - k = extract_l( L_sub( L_sub( res_dec, 1 ), SID_FORMAT_NBITS ) ); - move16(); - - WHILE( st_ivas->bit_stream[k] && ( nchan_ism < MAX_NUM_OBJECTS ) ) - { - nchan_ism = add( nchan_ism, 1 ); - k = sub( k, 1 ); - } - k = sub( k, 1 ); - - test(); - IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); - } - - st_ivas->nchan_ism = nchan_ism; - move16(); - /* read ism_mode */ - st_ivas->ism_mode = ISM_MODE_DISC; - move32(); - IF( GT_16( nchan_ism, 2 ) ) - { - k = sub( k, nchan_ism ); /* SID metadata flags */ - idx = st_ivas->bit_stream[k]; - move16(); - st_ivas->ism_mode = (ISM_MODE) add( idx, 1 ); - move32(); - } - - if ( st_ivas->ini_frame == 0 ) - { - last_ism_mode = st_ivas->ism_mode; - move32(); - } - - IF( NE_32( ( error = ivas_ism_dec_config_fx( st_ivas, last_ism_mode, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - - /*-------------------------------------------------------------------* - * Initialize decoder in the first good frame based on IVAS format - * and number of transport channels - *-------------------------------------------------------------------*/ - test(); - IF( st_ivas->ini_frame == 0 && NE_32( st_ivas->ivas_format, UNDEFINED_FORMAT ) ) - { - IF( NE_32( ( error = doSanityChecks_IVAS( st_ivas ) ), IVAS_ERR_OK ) ) - { - return IVAS_ERROR( error, "Sanity checks failed" ); - } - - IF( NE_32( ( error = ivas_init_decoder_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - - /*----------------------------------------------------------------* - * Reset bitstream pointers - *----------------------------------------------------------------*/ - - ivas_set_bitstream_pointers( st_ivas ); - - reset_elements( st_ivas ); - - /* update bitstream buffer pointer -> take into account already read bits */ - test(); - IF( ( st_ivas->nSCE > 0 ) || ( st_ivas->nCPE > 0 ) ) - { - IF( st_ivas->nSCE > 0 ) - { - st = st_ivas->hSCE[0]->hCoreCoder[0]; - } - ELSE - { - st = st_ivas->hCPE[0]->hCoreCoder[0]; - } - st->next_bit_pos = num_bits_read; - move16(); - st->total_brate = ACELP_8k00; /* only temporary initialization - this is needed for get_next_indice() in the frame following NO_DATA frame */ - move32(); - } - - return error; -} - - -/*-------------------------------------------------------------------* - * ivas_read_format() - * - * Read IVAS format signaling - *-------------------------------------------------------------------*/ - -static ivas_error ivas_read_format( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word16 *num_bits_read /* o : number of IVAS signaling bits read from the bitstream */ -) -{ - Word16 k, idx; - Word32 ivas_total_brate; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - move32(); - - *num_bits_read = 0; - move16(); - test(); - test(); - IF( !st_ivas->bfi && is_DTXrate( ivas_total_brate ) == 0 ) - { - /* read IVAS format */ - k = 0; - move16(); - if ( st_ivas->bit_stream[*num_bits_read] ) - { - k = 1; - move16(); - } - k = shl( k, 1 ); - ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); - move16(); - if ( st_ivas->bit_stream[*num_bits_read] ) - { - k = add( k, 1 ); - } - ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); - move16(); - SWITCH( k ) - { - case 0: - st_ivas->ivas_format = STEREO_FORMAT; - move32(); - BREAK; - case 1: - st_ivas->ivas_format = MC_FORMAT; - move32(); - BREAK; - case 2: - st_ivas->ivas_format = ISM_FORMAT; - move32(); - - IF( GE_32( ivas_total_brate, IVAS_24k4 ) ) - { - IF( st_ivas->bit_stream[*num_bits_read] ) - { - ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); - move16(); - IF( st_ivas->bit_stream[*num_bits_read] ) - { - st_ivas->ivas_format = SBA_ISM_FORMAT; - move32(); - } - ELSE - { - st_ivas->ivas_format = MASA_ISM_FORMAT; - move32(); - } - } - - ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); - move16(); - } - BREAK; - case 3: - IF( st_ivas->bit_stream[*num_bits_read] ) - { - st_ivas->ivas_format = MASA_FORMAT; - move32(); - } - ELSE - { - st_ivas->ivas_format = SBA_FORMAT; - move32(); - /* read Ambisonic (SBA) planar flag */ - st_ivas->sba_planar = st_ivas->bit_stream[( *num_bits_read ) + 1]; - move16(); - - /* read Ambisonic (SBA) order */ - st_ivas->sba_order = st_ivas->bit_stream[( *num_bits_read ) + 2 + SBA_PLANAR_BITS]; - move16(); - st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[( *num_bits_read ) + 1 + SBA_PLANAR_BITS], 1 ) ); - move16(); - if ( st_ivas->sba_order == 0 ) - { - st_ivas->ivas_format = SBA_ISM_FORMAT; - move32(); - } - } - ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); - move16(); - - BREAK; - } - } - ELSE IF( ( st_ivas->bfi == 0 ) && EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) - { - /* read IVAS format in SID frame */ - idx = 0; - move16(); - FOR( k = 0; k < SID_FORMAT_NBITS; k++ ) - { - idx += st_ivas->bit_stream[k] << ( SID_FORMAT_NBITS - 1 - k ); - } - - ( *num_bits_read ) = add( *num_bits_read, SID_FORMAT_NBITS ); - move16(); - st_ivas->sid_format = idx; - move16(); - - SWITCH( idx ) - { - case SID_DFT_STEREO: - case SID_MDCT_STEREO: - st_ivas->ivas_format = STEREO_FORMAT; - move32(); - BREAK; - case SID_ISM: - st_ivas->ivas_format = ISM_FORMAT; - move32(); - BREAK; - case SID_MULTICHANNEL: - st_ivas->ivas_format = MC_FORMAT; - move32(); - BREAK; - case SID_SBA_1TC: - st_ivas->ivas_format = SBA_FORMAT; - move32(); - st_ivas->element_mode_init = IVAS_SCE; - move16(); - BREAK; - case SID_SBA_2TC: - st_ivas->ivas_format = SBA_FORMAT; - move32(); - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - BREAK; - case SID_MASA_1TC: - st_ivas->ivas_format = MASA_FORMAT; - move32(); - st_ivas->element_mode_init = IVAS_SCE; - move16(); - BREAK; - case SID_MASA_2TC: - st_ivas->ivas_format = MASA_FORMAT; - move32(); - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - IF( EQ_32( st_ivas->bit_stream[res_dec - 1], 1 ) ) - { - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - ELSE - { - st_ivas->element_mode_init = IVAS_CPE_DFT; - move16(); - } - BREAK; - default: - /* This should actually be impossible, since only 3 bits are read, so if this happens something is broken */ - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Invalid value %c found in SID format field.", st_ivas->sid_format ); - } - - IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) - { - if ( st_ivas->sba_analysis_order == 0 ) - { - st_ivas->sba_analysis_order = SBA_FOA_ORDER; - move16(); - } - } - - /* reset bitstream handle to avoid BER detection after reading the 2400 kbps for ch0 */ - st_ivas->bit_stream = st_ivas->bit_stream + ( *num_bits_read ); - ( *num_bits_read ) = 0; - move16(); - } - ELSE - { - /* In SID/NO_DATA frames, use the previous frame IVAS format */ - } - - return error; -} - - -/*-------------------------------------------------------------------* - * getNumChanSynthesis() - * - * get number of output channels used for synthesis/decoding - * (often different from number of output channels!) - *-------------------------------------------------------------------*/ - -/*! r: number of channels to be synthesised */ - -Word16 getNumChanSynthesis( - Decoder_Struct *st_ivas /* i : IVAS decoder structure */ -) -{ - Word16 n; - - n = add( st_ivas->nSCE, imult1616( CPE_CHANNELS, st_ivas->nCPE ) ); - test(); - test(); - IF( st_ivas->sba_dirac_stereo_flag ) - { - n = CPE_CHANNELS; - move16(); - } - ELSE IF( ( st_ivas->hMCT != NULL || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) && NE_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - n = st_ivas->nchan_transport; - move16(); - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - n = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); - } - ELSE - { - n = st_ivas->nchan_transport; - move16(); - } - } - - return n; -} - -/*-------------------------------------------------------------------* - * copy_decoder_config() - * - * Copy IVAS configuration structure to the CoreCoder state structure - *-------------------------------------------------------------------*/ - -void copy_decoder_config( - Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ - Decoder_State *st /* o : decoder state structure */ -) -{ - st->output_Fs = st_ivas->hDecoderConfig->output_Fs; - move32(); - st->Opt_AMR_WB = st_ivas->hDecoderConfig->Opt_AMR_WB; - move16(); - st->codec_mode = st_ivas->codec_mode; - move16(); - st->ini_frame = st_ivas->ini_frame; - move16(); - - st->bfi = st_ivas->bfi; - move16(); - - st->writeFECoffset = st_ivas->writeFECoffset; - move16(); - - st->element_mode = st_ivas->element_mode_init; - move16(); - - return; -} - -/*-------------------------------------------------------------------* - * ivas_init_decoder_front() - * - * Set decoder parameters to initial values - *-------------------------------------------------------------------*/ -ivas_error ivas_init_decoder_front( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - /*-----------------------------------------------------------------* - * Resets - *-----------------------------------------------------------------*/ - - st_ivas->nSCE = 0; - move16(); - st_ivas->nCPE = 0; - move16(); - st_ivas->nCPE_old = 0; - move16(); - st_ivas->nchan_transport = -1; - move16(); - st_ivas->ism_mode = ISM_MODE_NONE; - move32(); - st_ivas->mc_mode = MC_MODE_NONE; - move32(); - st_ivas->sba_dirac_stereo_flag = 0; - move16(); - - /* HRTF binauralization latency in ns */ - st_ivas->binaural_latency_ns = 0; - move32(); - - /*-------------------------------------------------------------------* - * Allocate and initialize Custom loudspeaker layout handle - *--------------------------------------------------------------------*/ - - IF( st_ivas->hDecoderConfig->Opt_LsCustom ) - { - IF( EQ_32( ( error = ivas_ls_custom_open_fx( &( st_ivas->hLsSetupCustom ) ) ), IVAS_ERR_OK ) ) - { - set_zero_fx( ( st_ivas->hLsSetupCustom )->ls_azimuth_fx, MAX_OUTPUT_CHANNELS ); - set_zero_fx( ( st_ivas->hLsSetupCustom )->ls_elevation_fx, MAX_OUTPUT_CHANNELS ); - } - ELSE - { - return error; - } - } - - /*-------------------------------------------------------------------* - * Allocate and initialize Head-Tracking handle - *--------------------------------------------------------------------*/ - - IF( st_ivas->hDecoderConfig->Opt_Headrotation ) - { - IF( NE_32( ( error = ivas_headTrack_open_fx( &( st_ivas->hHeadTrackData ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - error = ivas_orient_trk_SetTrackingType_fx( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ); - IF( NE_32( ( error ), IVAS_ERR_OK ) ) - { - return error; - } - } - /*-------------------------------------------------------------------* - * Allocate and initialize external orientation handle - *--------------------------------------------------------------------*/ - - IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) - { - IF( NE_32( ( error = ivas_external_orientation_open( &( st_ivas->hExtOrientationData ), st_ivas->hDecoderConfig->render_framesize ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /*-------------------------------------------------------------------* - * Allocate and initialize combined orientation handle - *--------------------------------------------------------------------*/ - test(); - IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) - { - IF( NE_32( ( error = ivas_combined_orientation_open( &( st_ivas->hCombinedOrientationData ), st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->render_framesize ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /*-------------------------------------------------------------------* - * Allocate HRTF binary handle - *--------------------------------------------------------------------*/ - - IF( st_ivas->hDecoderConfig->Opt_HRTF_binary ) - { - IF( NE_32( ( error = ivas_HRTF_binary_open_fx( &( st_ivas->hHrtfTD ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_HRTF_CRend_binary_open_fx( &( st_ivas->hSetOfHRTF ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_HRTF_fastconv_binary_open_fx( &st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_HRTF_parambin_binary_open_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /*-------------------------------------------------------------------* - * Allocate and initialize Binaural Renderer configuration handle - *--------------------------------------------------------------------*/ - test(); - test(); - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { - IF( NE_32( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_render_config_init_from_rom_fx( &st_ivas->hRenderConfig ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - return error; -} - - -/*-------------------------------------------------------------------* - * ivas_init_decoder() - * - * Initialize IVAS decoder state structure - *-------------------------------------------------------------------*/ -ivas_error ivas_init_decoder_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - Word16 i, n, k; - Word16 sce_id, cpe_id; - Word16 numCldfbAnalyses, numCldfbSyntheses; - Word16 granularity, n_channels_transport_jbm; - Word32 output_Fs, ivas_total_brate; - Word32 binauralization_delay_ns; - AUDIO_CONFIG output_config; - DECODER_CONFIG_HANDLE hDecoderConfig; - ivas_error error; - Word32 ism_total_brate; - - error = IVAS_ERR_OK; - move32(); - output_Fs = st_ivas->hDecoderConfig->output_Fs; - move32(); - hDecoderConfig = st_ivas->hDecoderConfig; - output_config = hDecoderConfig->output_config; - ivas_total_brate = hDecoderConfig->ivas_total_brate; - move32(); - hDecoderConfig->last_ivas_total_brate = ivas_total_brate; - move32(); - st_ivas->last_active_ivas_total_brate = ivas_total_brate; - move32(); - /*-----------------------------------------------------------------* - * Set number of output channels for EXTERNAL output config. - *-----------------------------------------------------------------*/ - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - hDecoderConfig->nchan_out = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); - move16(); - hDecoderConfig->nchan_out = add( hDecoderConfig->nchan_out, st_ivas->nchan_ism ); - move16(); - } - ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - hDecoderConfig->nchan_out = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); - move16(); - } - ELSE IF( !EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) - { - hDecoderConfig->nchan_out = st_ivas->nchan_transport; - move16(); - } - - st_ivas->hOutSetup.nchan_out_woLFE = hDecoderConfig->nchan_out; - move16(); - } - - /*-----------------------------------------------------------------* - * Set output and intern setup & renderer selection - *-----------------------------------------------------------------*/ - - st_ivas->intern_config = output_config; - move32(); - ivas_output_init( &( st_ivas->hOutSetup ), output_config ); - test(); - IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) - { - st_ivas->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; - move16(); - st_ivas->intern_config = IVAS_AUDIO_CONFIG_7_1_4; - move32(); - st_ivas->hOutSetup.output_config = st_ivas->intern_config; - move32(); - st_ivas->hOutSetup.nchan_out_woLFE = audioCfg2channels( st_ivas->intern_config ); - move16(); - } - test(); - IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - st_ivas->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; - move32(); - st_ivas->intern_config = IVAS_AUDIO_CONFIG_HOA3; - move32(); - st_ivas->hOutSetup.output_config = IVAS_AUDIO_CONFIG_HOA3; - move32(); - st_ivas->hOutSetup.nchan_out_woLFE = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); - move16(); - } - - /* Only initialize transport setup if it is used */ - IF( NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_INVALID ) ) - { - ivas_output_init( &( st_ivas->hTransSetup ), st_ivas->transport_config ); - } - - test(); - IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) - { - ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); - - ivas_mcmasa_set_separate_channel_mode_fx( &( st_ivas->hOutSetup.separateChannelEnabled ), &( st_ivas->hOutSetup.separateChannelIndex ), ivas_total_brate ); - } - - ivas_renderer_select( st_ivas ); - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - IF( EQ_16( ( error = ivas_ls_custom_output_init_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - st_ivas->hOutSetup.ls_azimuth_fx = st_ivas->hLsSetupCustom->ls_azimuth_fx; - move32(); - st_ivas->hOutSetup.ls_elevation_fx = st_ivas->hLsSetupCustom->ls_elevation_fx; - move32(); - st_ivas->hIntSetup.ls_azimuth_fx = st_ivas->hLsSetupCustom->ls_azimuth_fx; - move32(); - st_ivas->hIntSetup.ls_elevation_fx = st_ivas->hLsSetupCustom->ls_elevation_fx; - move32(); - } - ELSE - { - return error; - } - } - - ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); - - test(); - IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) - { - ivas_mcmasa_set_separate_channel_mode_fx( &( st_ivas->hIntSetup.separateChannelEnabled ), &( st_ivas->hIntSetup.separateChannelIndex ), ivas_total_brate ); - - test(); - IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.separateChannelEnabled ) - { - st_ivas->hLsSetupCustom->separate_ch_found = 0; - move16(); - IF( GE_16( st_ivas->hOutSetup.nchan_out_woLFE, MCMASA_MIN_SPEAKERS_SEPARATE_CENTER ) ) - { - /* check for a speaker at (0, 0) if minimum speaker count is available */ - FOR( i = 0; i < st_ivas->hOutSetup.nchan_out_woLFE; i++ ) - { - test(); - IF( ( L_shr( st_ivas->hOutSetup.ls_azimuth_fx[i], Q22 ) == 0 ) && ( L_shr( st_ivas->hOutSetup.ls_elevation_fx[i], Q22 ) == 0 ) ) - { - st_ivas->hIntSetup.separateChannelIndex = i; - move16(); - st_ivas->hLsSetupCustom->separate_ch_found = 1; - move16(); - BREAK; - } - } - } - } - } - - - /*-----------------------------------------------------------------* - * Allocate and initialize SCE/CPE and other handles - *-----------------------------------------------------------------*/ - - IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) - { - st_ivas->nSCE = 1; /* in mono, there is always only one SCE */ - move16(); - st_ivas->nCPE = 0; - move16(); - st_ivas->nCPE_old = 0; - move16(); - st_ivas->nchan_transport = 1; - move16(); - sce_id = 0; - move16(); - - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) - { - st_ivas->nchan_transport = CPE_CHANNELS; - move16(); - st_ivas->intern_config = IVAS_AUDIO_CONFIG_STEREO; - move32(); - - st_ivas->nSCE = 0; - move16(); - st_ivas->nCPE = 1; /* in stereo, there is always only one CPE */ - move16(); - st_ivas->nCPE_old = 0; - move16(); - cpe_id = 0; - move16(); - - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < st_ivas->nchan_transport; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - - /* init EFAP for custom LS output and set hTransSetup */ - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hOutSetup.ls_azimuth_fx, st_ivas->hOutSetup.ls_elevation_fx, st_ivas->hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) - { - return error; - } - - ivas_output_init( &( st_ivas->hTransSetup ), IVAS_AUDIO_CONFIG_STEREO ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) - { - Word32 element_brate_tmp[MAX_NUM_OBJECTS]; - - st_ivas->nSCE = st_ivas->nchan_transport; /* "st_ivas->nchan_transport" is known from ivas_dec_setup */ - move16(); - st_ivas->nCPE = 0; - move16(); - st_ivas->nCPE_old = 0; - move16(); - st_ivas->ism_extmeta_active = -1; - move16(); - st_ivas->ism_extmeta_cnt = 0; - move16(); - IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) - { - st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; - move16(); - st_ivas->nSCE = MAX_PARAM_ISM_WAVE; - move16(); - - IF( NE_32( ( error = ivas_param_ism_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nSCE, element_brate_tmp ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, element_brate_tmp[sce_id] ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - - st_ivas->hSCE[sce_id]->hCoreCoder[0]->is_ism_format = 1; - move16(); - } - - st_ivas->hISMDTX.sce_id_dtx = 0; - move16(); - - IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) - { - st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2 = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed3; - move16(); - } - ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) ) - { - FOR( sce_id = 0; sce_id < st_ivas->nSCE; ++sce_id ) - { - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2 = add( 2, sce_id ); - move16(); - } - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) - { - IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ), IVAS_ERR_OK ) ) - { - return error; - } -#ifdef MSAN_FIX - set16_fx( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, 0, CLDFB_NO_COL_MAX ); -#endif - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_DEC ) && st_ivas->hOutSetup.is_loudspeaker_setup ) - { - IF( NE_32( ( error = ivas_sba_get_hoa_dec_matrix_fx( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - Word16 hodirac_flag = ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ); - IF( hodirac_flag ) - { - IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, IVAS_MAX_NUM_BANDS, st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE - { - IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - - test(); - test(); - IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) ) - { - IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; - move16(); - } - ELSE - { - Word16 band_grouping[IVAS_MAX_NUM_BANDS + 1]; - - st_ivas->hSpar->enc_param_start_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); - move16(); - IF( ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ) - { - st_ivas->hSpar->enc_param_start_band = 0; - move16(); - set8_fx( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); - st_ivas->hQMetaData->numTwoDirBands = (UWord8) st_ivas->hQMetaData->q_direction[0].cfg.nbands; - move16(); - } - - ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); - } - st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); - move16(); - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, (res_dec) *CPE_CHANNELS ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - /* create CPE element for DFT Stereo like upmix */ - test(); - IF( st_ivas->sba_dirac_stereo_flag && ( st_ivas->nCPE == 0 ) ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); - - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ - st_ivas->hCPE[0]->hCoreCoder[1] = NULL; - } - - IF( GT_16( st_ivas->nCPE, 1 ) ) - { - IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /* set CNA/CNG flags */ - ivas_sba_set_cna_cng_flag( st_ivas ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) - { - /* if we start in ISM_MODE_NONE in MASA_ISM, that appears as normal MASA, but we may change to a mode with ISMs */ - st_ivas->ism_extmeta_active = -1; - move16(); - st_ivas->ism_extmeta_cnt = 0; - move16(); - IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - - test(); - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) - { - IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - /* set CNA/CNG flags */ - ivas_sba_set_cna_cng_flag( st_ivas ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - Word32 temp_brate[MAX_SCE]; - st_ivas->ism_extmeta_active = -1; - move16(); - st_ivas->ism_extmeta_cnt = 0; - move16(); - - st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); - move16(); - IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ), IVAS_ERR_OK ) ) - { - return error; - } - - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_DEC ) && st_ivas->hOutSetup.is_loudspeaker_setup ) - { - IF( NE_32( ( error = ivas_sba_get_hoa_dec_matrix_fx( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - Word16 hodirac_flag = ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ); - IF( hodirac_flag ) - { - IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, IVAS_MAX_NUM_BANDS, st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE - { - IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - - test(); - test(); - IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) ) - { - IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; - move16(); - } - ELSE - { - Word16 band_grouping[IVAS_MAX_NUM_BANDS + 1]; - - st_ivas->hSpar->enc_param_start_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); - move16(); - IF( ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ) - { - st_ivas->hSpar->enc_param_start_band = 0; - move16(); - set8_fx( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); - st_ivas->hQMetaData->numTwoDirBands = (UWord8) st_ivas->hQMetaData->q_direction[0].cfg.nbands; - move16(); - } - - ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); - } - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - } - - IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - st_ivas->nCPE_old = st_ivas->nCPE; - move16(); - st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->nchan_ism, 1 ), 1 ) ); - move16(); - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - /* create CPE element for DFT Stereo like upmix */ - test(); - IF( st_ivas->sba_dirac_stereo_flag && st_ivas->nCPE == 0 ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ - st_ivas->hCPE[0]->hCoreCoder[1] = NULL; - } - - IF( GT_16( st_ivas->nCPE, 1 ) ) - { - IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_osba_data_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /* set CNA/CNG flags */ - ivas_sba_set_cna_cng_flag( st_ivas ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) - { - st_ivas->ism_extmeta_active = -1; - move16(); - st_ivas->ism_extmeta_cnt = 0; - move16(); - - IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - k = 0; - move16(); - ism_total_brate = 0; - move32(); - - WHILE( ( k < SIZE_IVAS_BRATE_TBL ) && ( ivas_total_brate != ivas_brate_tbl[k] ) ) - { - k = add( k, 1 ); - } - test(); - IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) - { - /* one separated object */ - st_ivas->nSCE = 1; - move16(); - ism_total_brate = sep_object_brate[k - 2][0]; - move32(); - IF( NE_32( ( error = create_sce_dec( st_ivas, 0, ism_total_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[0]->hCoreCoder[0] ); - - IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, 1, NULL ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - Word32 temp_brate[MAX_SCE]; - st_ivas->nSCE = st_ivas->nchan_ism; /* number of objects */ - move16(); - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - temp_brate[sce_id] = sep_object_brate[k - 2][st_ivas->nSCE - 1]; - move32(); - ism_total_brate = L_add( ism_total_brate, temp_brate[sce_id] ); - - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, temp_brate[sce_id] ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - } - - IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_omasa_data_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - - test(); - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) - { - IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( NE_32( ( error = create_cpe_dec( st_ivas, 0, ivas_total_brate - ism_total_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[0]->hCoreCoder[n] ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) - { - IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) - { - /* init EFAP for custom LS setup */ - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels_fx( ivas_mc_map_output_config_to_mc_ls_setup_fx( st_ivas->transport_config ) ); - move16(); - st_ivas->nSCE = 0; - move16(); - st_ivas->nCPE = shr( st_ivas->nchan_transport, 1 ); - move16(); - st_ivas->nCPE_old = 0; - move16(); - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) - { - /* init EFAP for custom LS setup */ - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - st_ivas->nSCE = 0; - move16(); - st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS >> 1; - move16(); - st_ivas->nCPE_old = 0; - move16(); - st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; - move16(); - - IF( NE_32( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) - { - /* init EFAP for custom LS setup */ - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - IF( NE_32( ( error = ivas_param_mc_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->hParamMC->proto_matrix_int_e = 0; - move16(); - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); - - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - IF( GT_16( st_ivas->nCPE, 1 ) ) - { - IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) - { - Word32 brate_sce, brate_cpe; - - ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); - - IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - - { - return error; - } - - st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); - move16(); - test(); - IF( NE_32( st_ivas->renderer_type, RENDERER_DISABLE ) && NE_32( st_ivas->renderer_type, RENDERER_MCMASA_MONO_STEREO ) ) - { - IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - test(); - test(); - IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.separateChannelEnabled && !st_ivas->hLsSetupCustom->separate_ch_found ) - { - /* If no speaker matching the separated channel, compute panning gains for the separated channel. */ - IF( st_ivas->hVBAPdata == NULL ) - { - /* Distribute signal to all channels if VBAP is not properly initialized. */ - Word16 inv_sqr, sqr, exp = 15, exp_sqr; - move16(); - IF( EQ_16( st_ivas->hLsSetupCustom->num_spk, 1 ) ) - { - inv_sqr = 32767; // (1.0f in Q15)-1 - move16(); - } - ELSE - { - sqr = Sqrt16( st_ivas->hLsSetupCustom->num_spk, &exp ); - inv_sqr = BASOP_Util_Divide1616_Scale( 32767, sqr, &exp_sqr ); - exp_sqr = sub( exp_sqr, exp ); - IF( ( exp < 0 ) ) - { - inv_sqr = shr( inv_sqr, exp ); // exp_sqr - } - ELSE - { - inv_sqr = shl( inv_sqr, exp ); // exp_sqr - } - } - set16_fx( st_ivas->hLsSetupCustom->separate_ch_gains_fx, inv_sqr, st_ivas->hLsSetupCustom->num_spk ); - } - } - - - ivas_mcmasa_split_brate_fx( st_ivas->hOutSetup.separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, brate_sce ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - st_ivas->element_mode_init = IVAS_CPE_MDCT; /* element_mode_init was IVAS_SCE for SCE initialization */ - move16(); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, brate_cpe ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - /* create CPE element for DFT Stereo like upmix */ - IF( st_ivas->sba_dirac_stereo_flag ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ - st_ivas->hCPE[0]->hCoreCoder[1] = NULL; - } - - /* set CNA/CNG flags */ - test(); - test(); - IF( EQ_16( st_ivas->nchan_transport, 1 ) && ( ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) ) - { - st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; - move16(); - st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; - move16(); - } - } - } - - - /*-----------------------------------------------------------------* - * Allocate and initialize HP20 filter memories - *-----------------------------------------------------------------*/ - - /* set number of output channels used for synthesis/decoding */ - n = getNumChanSynthesis( st_ivas ); - - IF( n > 0 ) - { - IF( ( st_ivas->mem_hp20_out_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); - } - } - ELSE - { - st_ivas->mem_hp20_out_fx = NULL; - } - - FOR( i = 0; i < n; i++ ) - { - IF( ( st_ivas->mem_hp20_out_fx[i] = (Word32 *) malloc( ( L_HP20_MEM + 2 ) * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); - } - set32_fx( st_ivas->mem_hp20_out_fx[i], 0, L_HP20_MEM + 2 ); - } - - /*-------------------------------------------------------------------* - * Allocate and initialize rendering handles - *--------------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) - { - IF( NE_32( ( error = ivas_binRenderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - /* ParamISM is handled separately from other common config */ - ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) && ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) ) - { - IF( NE_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) - { - IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) - { - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src; - IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) - { - return error; - } - Word16 nchan_rend = num_src; - move16(); - test(); - IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ - } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; - if ( Src_p->SrcSpatial_p != NULL ) - { - Src_p->SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - - IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { - IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - granularity = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); - - n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); - - - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MC ) ) - { - IF( NE_32( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) - { - IF( NE_32( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) - { - test(); - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) && EQ_32( st_ivas->ivas_format, MC_FORMAT ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) - { - IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth_fx, st_ivas->hIntSetup.ls_elevation_fx, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, - st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), - IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; - move32(); - - test(); - IF( ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) && ( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) ) - { - granularity = NS2SA_FX2( output_Fs, CLDFB_SLOT_NS ); - - n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); - - - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, MC_PARAMUPMIX_MAX_INPUT_CHANS, MC_PARAMUPMIX_MAX_INPUT_CHANS, granularity ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE - { - granularity = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); - - n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); - - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - - IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) - { - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - /* Allocate TD renderer for the objects in DISC mode */ - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src; - IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) - { - return error; - } - Word16 nchan_rend = num_src; - move16(); - test(); - if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ - } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; - if ( Src_p->SrcSpatial_p != NULL ) - { - Src_p->SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - - /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ - IF( NE_32( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - test(); - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && ( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) ) - { - /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ - IF( NE_32( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && - ( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) && - ( EQ_32( st_ivas->renderer_type, RENDERER_TD_PANNING ) || - EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) || - EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || - EQ_32( st_ivas->renderer_type, RENDERER_OSBA_STEREO ) || - EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || - EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) || - EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || - EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || - EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) ) - { - IF( NE_32( ( error = ivas_ism_renderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - test(); - test(); - IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - /* Allocate TD renderer for the objects in DISC mode */ - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src; - IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) - { - return error; - } - Word16 nchan_rend = num_src; - move16(); - - test(); - if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ - } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; - if ( Src_p->SrcSpatial_p != NULL ) - { - Src_p->SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - } - } - - /*-----------------------------------------------------------------* - * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay - *-----------------------------------------------------------------*/ - test(); - IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) || EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) - { - binauralization_delay_ns = st_ivas->binaural_latency_ns; - move32(); - IF( st_ivas->hBinRenderer != NULL ) - { - IF( st_ivas->hBinRenderer->render_lfe ) - { - { - /* Account for filterbank delay */ - binauralization_delay_ns = L_add( binauralization_delay_ns, IVAS_FB_DEC_DELAY_NS ); - } - } - ELSE - { - binauralization_delay_ns = 0; - move32(); - } - } - - IF( NE_32( ( error = ivas_create_lfe_dec_fx( &st_ivas->hLFE, output_Fs, binauralization_delay_ns ) ), IVAS_ERR_OK ) ) - { - return error; - } - - set32_fx( st_ivas->hLFE->prevsynth_buf_fx, 0, LFE_PLC_BUFLEN ); - set32_fx( st_ivas->hLFE->prior_out_buffer_fx, 0, L_FRAME48k ); - } - - /*-----------------------------------------------------------------* - * CLDFB handles for rendering - *-----------------------------------------------------------------*/ - - ivas_init_dec_get_num_cldfb_instances_ivas_fx( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); - - FOR( i = 0; i < numCldfbAnalyses; i++ ) - { - IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - FOR( ; i < MAX_INTERN_CHANNELS; i++ ) - { - st_ivas->cldfbAnaDec[i] = NULL; - } - - FOR( i = 0; i < numCldfbSyntheses; i++ ) - { - IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - FOR( ; i < MAX_OUTPUT_CHANNELS; i++ ) - { - st_ivas->cldfbSynDec[i] = NULL; - } - - /* CLDFB Interpolation weights */ - test(); - test(); - test(); - IF( ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && !st_ivas->sba_dirac_stereo_flag && NE_16( st_ivas->hDecoderConfig->nchan_out, 1 ) ) - { - Word16 Q_cldfbSynDec = Q11; - move16(); - ivas_spar_get_cldfb_gains_fx( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); - - FOR( i = 0; i < st_ivas->cldfbAnaDec[0]->cldfb_state_length; i++ ) - { - st_ivas->cldfbAnaDec[0]->cldfb_state_fx[i] = L_shr( st_ivas->cldfbAnaDec[0]->cldfb_state_fx[i], 16 ); // Scaling down from 27 to 11 - move32(); - } - st_ivas->cldfbAnaDec[0]->Q_cldfb_state = Q11; - move16(); - FOR( i = 0; i < st_ivas->cldfbSynDec[0]->cldfb_state_length; i++ ) - { - st_ivas->cldfbSynDec[0]->cldfb_state_fx[i] = L_shr( st_ivas->cldfbSynDec[0]->cldfb_state_fx[i], sub( 21, Q_cldfbSynDec ) ); // Scaling down from 21 to Q_cldfbSynDec - move32(); - } - st_ivas->cldfbSynDec[0]->Q_cldfb_state = Q11; - move16(); - } - - /*-----------------------------------------------------------------* - * Allocate and initialize limiter struct - *-----------------------------------------------------------------*/ - - IF( NE_32( ( error = ivas_limiter_open_fx( &st_ivas->hLimiter, hDecoderConfig->nchan_out, output_Fs ) ), IVAS_ERR_OK ) ) - { - return error; - } - - /*-----------------------------------------------------------------* - * Allocate and initialize JBM struct + buffer - *-----------------------------------------------------------------*/ - - IF( st_ivas->hTcBuffer == NULL ) - - { - /* no module has yet open the TC buffer, open a default one */ - n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); - - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, ivas_jbm_dec_get_tc_buffer_mode( st_ivas ), n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( st_ivas->hTcBuffer == NULL ) - { - /* we need the handle anyway, but without the buffer*/ - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( st_ivas->hJbmMetadata == NULL ) - { - IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - IF( NE_32( ( error = ivas_jbm_dec_metadata_open( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - - /*-----------------------------------------------------------------* - * Allocate floating-point output audio buffers - *-----------------------------------------------------------------*/ - st_ivas->p_out_len = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - move16(); - FOR( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) - { - /* note: these are intra-frame heap memories */ - IF( ( st_ivas->p_output_fx[n] = (Word32 *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); - } - set32_fx( st_ivas->p_output_fx[n], 0, 48000 / FRAMES_PER_SEC ); - } - - FOR( ; n < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) - { - st_ivas->p_output_fx[n] = NULL; - } - return error; -} - -/*------------------------------------------------------------------------- - * destroy_core_dec() - * - * Close core decoder handles - *-------------------------------------------------------------------------*/ - -void destroy_core_dec_fx( - DEC_CORE_HANDLE hCoreCoder /* i/o: core decoder structure */ -) -{ - IF( EQ_16( hCoreCoder->element_mode, EVS_MONO ) ) - { - destroy_cldfb_decoder_fx( hCoreCoder ); - } - ELSE - { - destroy_cldfb_decoder_ivas_fx( hCoreCoder ); - } - - IF( hCoreCoder->hGSCDec != NULL ) - { - free( hCoreCoder->hGSCDec ); - hCoreCoder->hGSCDec = NULL; - } - - IF( hCoreCoder->hPFstat != NULL ) - { - free( hCoreCoder->hPFstat ); - hCoreCoder->hPFstat = NULL; - } - - IF( hCoreCoder->hMusicPF != NULL ) - { - free( hCoreCoder->hMusicPF ); - hCoreCoder->hMusicPF = NULL; - } - - IF( hCoreCoder->hBPF != NULL ) - { - free( hCoreCoder->hBPF ); - hCoreCoder->hBPF = NULL; - } - - IF( hCoreCoder->hBWE_zero != NULL ) - { - free( hCoreCoder->hBWE_zero ); - hCoreCoder->hBWE_zero = NULL; - } - - IF( hCoreCoder->hTdCngDec != NULL ) - { - free( hCoreCoder->hTdCngDec ); - hCoreCoder->hTdCngDec = NULL; - } - - IF( hCoreCoder->hSC_VBR != NULL ) - { - free( hCoreCoder->hSC_VBR ); - hCoreCoder->hSC_VBR = NULL; - } - - IF( hCoreCoder->hAmrwb_IO != NULL ) - { - free( hCoreCoder->hAmrwb_IO ); - hCoreCoder->hAmrwb_IO = NULL; - } - - IF( hCoreCoder->hBWE_TD != NULL ) - { - free( hCoreCoder->hBWE_TD ); - hCoreCoder->hBWE_TD = NULL; - } - - IF( hCoreCoder->hBWE_FD != NULL ) - { - free( hCoreCoder->hBWE_FD ); - hCoreCoder->hBWE_FD = NULL; - } - - IF( hCoreCoder->hBWE_FD_HR != NULL ) - { - free( hCoreCoder->hBWE_FD_HR ); - hCoreCoder->hBWE_FD_HR = NULL; - } - - IF( hCoreCoder->hWIDec != NULL ) - { - free( hCoreCoder->hWIDec ); - hCoreCoder->hWIDec = NULL; - } - - IF( hCoreCoder->hTECDec != NULL ) - { - free( hCoreCoder->hTECDec ); - hCoreCoder->hTECDec = NULL; - } - - IF( hCoreCoder->hTcxLtpDec != NULL ) - { - free( hCoreCoder->hTcxLtpDec ); - hCoreCoder->hTcxLtpDec = NULL; - } - - IF( hCoreCoder->hTcxDec != NULL ) - { - free( hCoreCoder->hTcxDec ); - hCoreCoder->hTcxDec = NULL; - } - - IF( hCoreCoder->hTcxCfg != NULL ) - { - free( hCoreCoder->hTcxCfg ); - hCoreCoder->hTcxCfg = NULL; - } - - IF( hCoreCoder->hTonalMDCTConc != NULL ) - { - free( hCoreCoder->hTonalMDCTConc ); - hCoreCoder->hTonalMDCTConc = NULL; - } - - IF( hCoreCoder->hIGFDec != NULL ) - { - free( hCoreCoder->hIGFDec ); - hCoreCoder->hIGFDec = NULL; - } - - IF( hCoreCoder->hPlcInfo != NULL ) - { - free( hCoreCoder->hPlcInfo ); - hCoreCoder->hPlcInfo = NULL; - } - - IF( hCoreCoder->hHQ_core != NULL ) - { - free( hCoreCoder->hHQ_core ); - hCoreCoder->hHQ_core = NULL; - } - - IF( hCoreCoder->hHQ_nbfec != NULL ) - { - free( hCoreCoder->hHQ_nbfec ); - hCoreCoder->hHQ_nbfec = NULL; - } - - return; -} - -/*------------------------------------------------------------------------- - * ivas_initialize_handles_dec() - * - * NULL initialization of handles - *-------------------------------------------------------------------------*/ - -void ivas_initialize_handles_dec( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - Word16 i; - - FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) - { - st_ivas->cldfbAnaDec[i] = NULL; - } - - FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - st_ivas->cldfbSynDec[i] = NULL; - } - - /* SCE handles */ - FOR( i = 0; i < MAX_SCE; i++ ) - { - st_ivas->hSCE[i] = NULL; - } - - /* CPE handles */ - FOR( i = 0; i < MAX_CPE; i++ ) - { - st_ivas->hCPE[i] = NULL; - } - - st_ivas->bit_stream = NULL; - st_ivas->mem_hp20_out_fx = NULL; - st_ivas->hLimiter = NULL; - - /* ISM metadata handles */ - FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) - { - st_ivas->hIsmMetaData[i] = NULL; - } - - /* spatial coding handles */ - st_ivas->hDirAC = NULL; - st_ivas->hParamIsmDec = NULL; - st_ivas->hSpar = NULL; - st_ivas->hMasa = NULL; - st_ivas->hQMetaData = NULL; - st_ivas->hMCT = NULL; - st_ivas->hMCParamUpmix = NULL; - st_ivas->hParamMC = NULL; - st_ivas->hLFE = NULL; - - /* rendering handles */ - st_ivas->hBinRenderer = NULL; - st_ivas->hDiracDecBin = NULL; - st_ivas->hDirACRend = NULL; - st_ivas->hSpatParamRendCom = NULL; - st_ivas->hLsSetUpConversion = NULL; - st_ivas->hEFAPdata = NULL; - st_ivas->hVBAPdata = NULL; - st_ivas->hIsmRendererData = NULL; - st_ivas->hBinRendererTd = NULL; - st_ivas->hMonoDmxRenderer = NULL; - st_ivas->hCrendWrapper = NULL; - st_ivas->hReverb = NULL; - st_ivas->hSetOfHRTF = NULL; - st_ivas->hHrtfFastConv = NULL; - st_ivas->hHrtfParambin = NULL; - st_ivas->hoa_dec_mtx = NULL; - st_ivas->hMasaIsmData = NULL; - st_ivas->hSbaIsmData = NULL; - - st_ivas->hHeadTrackData = NULL; - st_ivas->hHrtfTD = NULL; - st_ivas->hLsSetupCustom = NULL; - st_ivas->hRenderConfig = NULL; - st_ivas->hExtOrientationData = NULL; - st_ivas->hCombinedOrientationData = NULL; - - - /* JBM handles */ - st_ivas->hTcBuffer = NULL; - st_ivas->hJbmMetadata = NULL; - - /* floating-point output audio buffers */ - FOR( i = 0; i < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; i++ ) - { - st_ivas->p_output_fx[i] = NULL; - } - - return; -} - - -/*------------------------------------------------------------------------- - * ivas_destroy_dec() - * - * Close IVAS decoder handles - *-------------------------------------------------------------------------*/ - -void ivas_destroy_dec_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ -) -{ - Word16 i; - - /* CLDFB handles */ - FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) - { - IF( st_ivas->cldfbAnaDec[i] != NULL ) - { - deleteCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ) ); - } - } - - FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - IF( st_ivas->cldfbSynDec[i] != NULL ) - { - deleteCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ) ); - } - } - - /* SCE handles */ - FOR( i = 0; i < MAX_SCE; i++ ) - { - IF( st_ivas->hSCE[i] != NULL ) - { - destroy_sce_dec( st_ivas->hSCE[i] ); - st_ivas->hSCE[i] = NULL; - } - } - - /* CPE handles */ - FOR( i = 0; i < MAX_CPE; i++ ) - { - IF( st_ivas->hCPE[i] != NULL ) - { - /* set pointer to NULL as core coder already deallocated in destroy_sce_dec() */ - test(); - IF( st_ivas->sba_dirac_stereo_flag && EQ_16( st_ivas->nchan_transport, 1 ) ) - { - st_ivas->hCPE[i]->hCoreCoder[0] = NULL; - st_ivas->hCPE[i]->hCoreCoder[1] = NULL; - } - destroy_cpe_dec( st_ivas->hCPE[i] ); - st_ivas->hCPE[i] = NULL; - } - } - - /* HP20 filter handles */ - IF( st_ivas->mem_hp20_out_fx != NULL ) - { - FOR( i = 0; i < getNumChanSynthesis( st_ivas ); i++ ) - { - free( st_ivas->mem_hp20_out_fx[i] ); - st_ivas->mem_hp20_out_fx[i] = NULL; - } - free( st_ivas->mem_hp20_out_fx ); - st_ivas->mem_hp20_out_fx = NULL; - } - - /* ISM metadata handles */ - ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); - - /* ISM renderer handle */ - ivas_ism_renderer_close( &( st_ivas->hIsmRendererData ) ); - - /* DirAC handle */ - IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) - { - ivas_param_ism_dec_close_fx( &( st_ivas->hParamIsmDec ), &( st_ivas->hSpatParamRendCom ), st_ivas->hDecoderConfig->output_config ); - } - ELSE - { - ivas_dirac_rend_close_fx( &( st_ivas->hDirACRend ) ); - ivas_spat_hSpatParamRendCom_close_fx( &( st_ivas->hSpatParamRendCom ) ); - ivas_dirac_dec_close_fx( &( st_ivas->hDirAC ) ); - } - - /* SPAR handle */ - ivas_spar_dec_close_fx( &( st_ivas->hSpar ), st_ivas->hDecoderConfig->output_Fs, 0 ); - - /* HOA decoder matrix */ - IF( st_ivas->hoa_dec_mtx != NULL ) - { - free( st_ivas->hoa_dec_mtx ); - st_ivas->hoa_dec_mtx = NULL; - } - - /* MASA decoder structure */ - - ivas_masa_dec_close_fx( &( st_ivas->hMasa ) ); - /* Qmetadata handle */ - ivas_qmetadata_close_fx( &st_ivas->hQMetaData ); - - /* MCT handle */ - ivas_mct_dec_close( &st_ivas->hMCT ); - - /* LFE handle */ - ivas_lfe_dec_close_fx( &( st_ivas->hLFE ) ); - - /* Param-Upmix MC handle */ - ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); - - /* Parametric MC handle */ - ivas_param_mc_dec_close_fx( &st_ivas->hParamMC ); - - /* EFAP handle */ - efap_free_data_fx( &st_ivas->hEFAPdata ); - - /* VBAP handle */ - vbap_free_data_fx( &( st_ivas->hVBAPdata ) ); - /* Fastconv binaural renderer handle */ - ivas_binRenderer_close_fx( &st_ivas->hBinRenderer ); - - /* Parametric binaural renderer handle */ - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); - - /* Crend handle */ - - ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); - - /* Reverb handle */ - ivas_reverb_close( &st_ivas->hReverb ); - - /* LS config converter handle */ - - ivas_ls_setup_conversion_close_fx( &st_ivas->hLsSetUpConversion ); - /* Custom LS configuration handle */ - IF( st_ivas->hLsSetupCustom != NULL ) - { - free( st_ivas->hLsSetupCustom ); - st_ivas->hLsSetupCustom = NULL; - } - - /* Mono downmix structure */ - ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); - - /* OSBA structure */ - - ivas_osba_data_close_fx( &st_ivas->hSbaIsmData ); - - /* OMASA structure */ - ivas_omasa_data_close_fx( &st_ivas->hMasaIsmData ); - /* Head track data handle */ - ivas_headTrack_close_fx( &st_ivas->hHeadTrackData ); - - /* External orientation data handle */ - ivas_external_orientation_close_fx( &st_ivas->hExtOrientationData ); - - /* Combined orientation data handle */ - ivas_combined_orientation_close_fx( &st_ivas->hCombinedOrientationData ); - - /* Time Domain binaural renderer handle */ - IF( st_ivas->hBinRendererTd != NULL ) - { - ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); - } - ELSE IF( st_ivas->hHrtfTD != NULL ) - { - BSplineModelEvalDealloc_fx( &st_ivas->hHrtfTD->ModelParams, &st_ivas->hHrtfTD->ModelEval ); - ivas_HRTF_binary_close_fx( &st_ivas->hHrtfTD ); - } - - /* CRend binaural renderer handle */ - ivas_HRTF_CRend_binary_close_fx( &st_ivas->hSetOfHRTF ); - - /* Fastconv HRTF memories */ - ivas_binaural_hrtf_close( &st_ivas->hHrtfFastConv ); - - /* Fastconv HRTF filters */ - ivas_HRTF_fastconv_binary_close_fx( &st_ivas->hHrtfFastConv ); - - /* Parametric binauralizer HRTF filters */ - ivas_HRTF_parambin_binary_close_fx( &st_ivas->hHrtfParambin ); - - /* Config. Renderer */ - ivas_render_config_close( &( st_ivas->hRenderConfig ) ); - - /* Limiter struct */ - ivas_limiter_close_fx( &( st_ivas->hLimiter ) ); - - IF( st_ivas->hDecoderConfig != NULL ) - { - free( st_ivas->hDecoderConfig ); - st_ivas->hDecoderConfig = NULL; - } - - ivas_jbm_dec_tc_buffer_close( &st_ivas->hTcBuffer ); - - IF( st_ivas->hJbmMetadata != NULL ) - { - free( st_ivas->hJbmMetadata ); - st_ivas->hJbmMetadata = NULL; - } - - /* floating-point output audio buffers */ - FOR( i = 0; i < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; i++ ) - { - - IF( st_ivas->p_output_fx[i] != NULL ) - { - free( st_ivas->p_output_fx[i] ); - st_ivas->p_output_fx[i] = NULL; - } - } - - /* main IVAS handle */ - free( st_ivas ); - - return; -} - - -/*-------------------------------------------------------------------* - * ivas_init_dec_get_num_cldfb_instances() - * - * Return number of CLDFB analysis & synthesis instances - *-------------------------------------------------------------------*/ - -/*! r: number of cldfb instances */ -void ivas_init_dec_get_num_cldfb_instances( - Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ - Word16 *numCldfbAnalyses, /* o : number of needed CLDFB analysis instances */ - Word16 *numCldfbSyntheses /* o : number of needed CLDFB synthesis instances */ -) -{ - IVAS_FORMAT ivas_format; - *numCldfbAnalyses = st_ivas->nchan_transport; - move16(); - *numCldfbSyntheses = st_ivas->hDecoderConfig->nchan_out; - move16(); - - test(); - IF( ( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_NONE ) ) ) - { - ivas_format = SBA_FORMAT; - move32(); - } - ELSE - { - ivas_format = st_ivas->ivas_format; - move32(); - } - - SWITCH( st_ivas->renderer_type ) - { - case RENDERER_BINAURAL_PARAMETRIC: - case RENDERER_BINAURAL_PARAMETRIC_ROOM: - case RENDERER_STEREO_PARAMETRIC: - IF( EQ_16( st_ivas->nchan_transport, 1 ) ) - { - *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); - move16(); - } - - test(); - IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) && st_ivas->hOutSetup.separateChannelEnabled ) - { - *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); - move16(); - } - - IF( EQ_32( ivas_format, SBA_ISM_FORMAT ) ) - { - IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - *numCldfbAnalyses = add( *numCldfbAnalyses, st_ivas->nchan_ism ); - move16(); - } - } - - IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) ) - { - test(); - IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - *numCldfbAnalyses = add( *numCldfbAnalyses, st_ivas->nchan_ism ); - move16(); - } - ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) - { - *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); - move16(); - } - } - IF( st_ivas->hDiracDecBin->useTdDecorr ) - { - *numCldfbAnalyses = add( *numCldfbAnalyses, 2 ); - move16(); - } - BREAK; - case RENDERER_NON_DIEGETIC_DOWNMIX: - case RENDERER_MONO_DOWNMIX: - test(); - test(); - IF( EQ_32( ivas_format, ISM_FORMAT ) || EQ_32( ivas_format, MASA_ISM_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) - { - /* CLDFB not used in rendering */ - *numCldfbAnalyses = 0; - move16(); - *numCldfbSyntheses = 0; - move16(); - } - BREAK; - case RENDERER_DIRAC: - IF( EQ_32( ivas_format, SBA_FORMAT ) ) - { - *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; - move16(); - - test(); - IF( st_ivas->hOutSetup.is_loudspeaker_setup && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) - { - *numCldfbSyntheses = st_ivas->hOutSetup.nchan_out_woLFE; - move16(); - } - ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) - { - *numCldfbSyntheses = st_ivas->hSpar->hFbMixer->fb_cfg->num_out_chans; - move16(); - } - ELSE - { - *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; - move16(); - } - } - IF( NE_32( ivas_format, SBA_FORMAT ) ) - { - test(); - test(); - IF( GT_16( st_ivas->nchan_transport, 2 ) && ( st_ivas->sba_planar != 0 ) ) - { - *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); - move16(); - } - ELSE IF( EQ_16( st_ivas->nchan_transport, 1 ) && EQ_32( st_ivas->hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) - { - *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); - move16(); - } - } - BREAK; - case RENDERER_MC_PARAMMC: - IF( LE_16( st_ivas->hDecoderConfig->nchan_out, 2 ) ) - { - /* CLDFB not used in rendering */ - *numCldfbAnalyses = 0; - move16(); - *numCldfbSyntheses = 0; - move16(); - } - ELSE - { - *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_fx( st_ivas ); - move16(); - } - BREAK; - case RENDERER_PARAM_ISM: - /* Already correct with no exception */ - BREAK; - case RENDERER_DISABLE: - /* CLDFB not used */ - *numCldfbAnalyses = 0; - move16(); - *numCldfbSyntheses = 0; - move16(); - BREAK; - case RENDERER_MC: - case RENDERER_SBA_LINEAR_DEC: - case RENDERER_TD_PANNING: - case RENDERER_BINAURAL_OBJECTS_TD: - case RENDERER_MCMASA_MONO_STEREO: - case RENDERER_BINAURAL_MIXER_CONV: - case RENDERER_BINAURAL_MIXER_CONV_ROOM: - case RENDERER_BINAURAL_FASTCONV: - case RENDERER_BINAURAL_FASTCONV_ROOM: - case RENDERER_OSBA_STEREO: - case RENDERER_OSBA_AMBI: - case RENDERER_OSBA_LS: - test(); - IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) - { - IF( st_ivas->sba_dirac_stereo_flag != 0 ) - { - *numCldfbAnalyses = 0; - move16(); - *numCldfbSyntheses = 0; - move16(); - } - ELSE - { - *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; - move16(); - - test(); - IF( st_ivas->hOutSetup.is_loudspeaker_setup && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) - { - *numCldfbSyntheses = st_ivas->hOutSetup.nchan_out_woLFE; - move16(); - } - ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) - { - *numCldfbSyntheses = st_ivas->hSpar->hFbMixer->fb_cfg->num_out_chans; - move16(); - } - ELSE - { - *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; - move16(); - } - test(); - IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) - { - *numCldfbAnalyses = add( st_ivas->nchan_ism, st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans ); - move16(); - } - } - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) - { - /* do nothing for ParamMC */ - } - ELSE - { - /* CLDFB not used in rendering */ - *numCldfbAnalyses = 0; - move16(); - *numCldfbSyntheses = 0; - move16(); - } - BREAK; - case RENDERER_SBA_LINEAR_ENC: - IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) - { - *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_fx( st_ivas ); - move16(); - } - ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) - { - *numCldfbSyntheses = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); - move16(); - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) - { - *numCldfbAnalyses = st_ivas->nchan_transport; - move16(); - *numCldfbSyntheses = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); - move16(); - } - ELSE - { - /* CLDFB not used in rendering */ - *numCldfbAnalyses = 0; - move16(); - *numCldfbSyntheses = 0; - move16(); - } - BREAK; - default: - assert( 0 && "Renderer not handled for CLDFB reservation." ); - } - test(); - test(); - IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) - { - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) - { - *numCldfbAnalyses = s_max( MC_PARAMUPMIX_MAX_INPUT_CHANS, *numCldfbAnalyses ); - move16(); - } - ELSE - { - *numCldfbAnalyses = s_max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbAnalyses ); - move16(); - } - *numCldfbSyntheses = s_max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbSyntheses ); - move16(); - } - - return; -} - - -/*---------------------------------------------------------------------* - * doSanityChecks_IVAS() - * - * Sanity checks - verify if the decoder set-up parameters are - * not in conflict with the IVAS format - *---------------------------------------------------------------------*/ - -static ivas_error doSanityChecks_IVAS( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - Word32 output_Fs; - AUDIO_CONFIG output_config; - - output_Fs = st_ivas->hDecoderConfig->output_Fs; - move32(); - output_config = st_ivas->hDecoderConfig->output_config; - move32(); - /*-----------------------------------------------------------------* - * Sanity checks - *-----------------------------------------------------------------*/ - - IF( EQ_32( output_Fs, 8000 ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz output sampling rate is not supported in IVAS." ); - } - - assert( st_ivas->ivas_format != UNDEFINED_FORMAT && "\n IVAS format undefined" ); - assert( st_ivas->ivas_format != MONO_FORMAT && "\n Wrong IVAS format: MONO" ); - - /* Verify output configuration compatible with non-diegetic panning */ - test(); - test(); - IF( st_ivas->hDecoderConfig->Opt_non_diegetic_pan && NE_32( st_ivas->ivas_format, MONO_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_ISM1 ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Error: Non-diegetic panning not supported in this IVAS format" ); - } - - /* Verify stereo output configuration */ - IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( NE_32( output_config, IVAS_AUDIO_CONFIG_MONO ) && NE_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_7_1 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1_2 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1_4 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_7_1_4 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Wrong output configuration specified for Stereo!" ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) - { - /* Verify ISM output configuration */ - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for ISM" ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) - { - /* Verify SBA output coniguration */ - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for SBA" ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) - { - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for MASA!" ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) - { - /* Verify MC output configuration */ - test(); - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for Multi-channel" ); - } - } - - - IF( st_ivas->hDecoderConfig->Opt_Headrotation ) - { - test(); - test(); - IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) - { - return IVAS_ERROR( IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, "Wrong set-up: Head-rotation not supported in this configuration" ); - } - } - - IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) - { - test(); - test(); - IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) - { - return IVAS_ERROR( IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED, "Wrong set-up: External orientation not supported in this configuration" ); - } - } - - IF( st_ivas->hDecoderConfig->Opt_dpid_on ) - { - test(); - IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) - { - return IVAS_ERROR( IVAS_ERR_DIRECTIVITY_NOT_SUPPORTED, "Wrong set-up: Directivity is not supported in this output configuration." ); - } - } - - IF( st_ivas->hDecoderConfig->Opt_aeid_on ) - { - IF( NE_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { - return IVAS_ERROR( IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED, "Wrong set-up: Acoustic environment is not supported in this output configuration." ); - } - } - - IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) - { - test(); - IF( NE_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); - } - } - - - return IVAS_ERR_OK; -} diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index ecd38aabe5cf2884d5365bd9aa09da56f1671310..de5d9e4707eb619e10ff2e38fbdc54431f34d629 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -1,22 +1,3648 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot_rend_fx.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#include "ivas_stat_enc.h" +#include "prot_fx.h" +#include "wmc_auto.h" #include "ivas_prot_fx.h" -void ivas_init_dec_get_num_cldfb_instances_ivas_fx( + + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static ivas_error ivas_read_format( Decoder_Struct *st_ivas, Word16 *num_bits_read ); + +static ivas_error doSanityChecks_IVAS( Decoder_Struct *st_ivas ); + +static AUDIO_CONFIG ivas_set_audio_config_from_sba_order( const Word16 sba_order ); + + +/*-------------------------------------------------------------------* + * ivas_set_audio_config_from_sba_order() + * + * + *-------------------------------------------------------------------*/ + +/*! r: audio configuration */ +static AUDIO_CONFIG ivas_set_audio_config_from_sba_order( + const Word16 sba_order /* i : Ambisonic (SBA) order */ +) +{ + AUDIO_CONFIG output_config; + + output_config = IVAS_AUDIO_CONFIG_HOA3; + move32(); + + SWITCH( sba_order ) + { + case SBA_FOA_ORDER: + output_config = IVAS_AUDIO_CONFIG_FOA; + move32(); + BREAK; + case SBA_HOA2_ORDER: + output_config = IVAS_AUDIO_CONFIG_HOA2; + move32(); + BREAK; + case SBA_HOA3_ORDER: + output_config = IVAS_AUDIO_CONFIG_HOA3; + move32(); + BREAK; + default: + output_config = IVAS_AUDIO_CONFIG_INVALID; + move32(); + BREAK; + } + + return output_config; +} + + +/*---------------------------------------------------------------------* + * ivas_dec_get_format( ) + * + * Read main parameters from the bitstream to set-up the decoder: + * - IVAS format + * - IVAS format specific signaling + *---------------------------------------------------------------------*/ + +ivas_error ivas_dec_get_format_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 k, idx, num_bits_read; + Word16 nchan_ism, element_mode_flag; + Word16 sba_order, sba_planar, sba_analysis_order; + Word32 ivas_total_brate; + int16_t Opt_tsm; + + UWord16 *bit_stream_orig; + AUDIO_CONFIG signaled_config; + ivas_error error; + + num_bits_read = 0; + move16(); + element_mode_flag = 0; + move16(); + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + move32(); + Opt_tsm = st_ivas->hDecoderConfig->Opt_tsm; + move16(); + bit_stream_orig = st_ivas->bit_stream; + + /*-------------------------------------------------------------------* + * Read IVAS format + *-------------------------------------------------------------------*/ + + IF( ( error = ivas_read_format( st_ivas, &num_bits_read ) ) != IVAS_ERR_OK ) + { + return error; + } + + test(); + test(); + test(); + test(); + test(); + IF( st_ivas->ini_frame > 0 && NE_32( st_ivas->ivas_format, st_ivas->last_ivas_format ) && + !( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && EQ_32( st_ivas->last_ivas_format, MASA_ISM_FORMAT ) ) && + !( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->last_ivas_format, MASA_FORMAT ) ) ) + { + IF( Opt_tsm ) + { + st_ivas->restartNeeded = 1; + move16(); + + return IVAS_ERR_OK; + } + ELSE + { +#ifdef DEBUGGING + fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" ); +#endif + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" ); + } + } + + /*-------------------------------------------------------------------* + * Read other signaling (ISM/MC mode, number of channels, etc.) + *-------------------------------------------------------------------*/ + + IF( is_DTXrate( ivas_total_brate ) == 0 ) + { + /*-------------------------------------------------------------------* + * Read IVAS format related signaling: + * - in ISM : read number of objects + * - in SBA : read SBA planar flag and SBA order + * - in MASA : read number of TC + * - in MC : read LS setup + *-------------------------------------------------------------------*/ + + IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) + { + element_mode_flag = 1; + move16(); + } + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + /* read the number of objects */ + nchan_ism = 1; + move16(); + k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + k = sub( k, 1 ); + WHILE( st_ivas->bit_stream[k] && ( nchan_ism < MAX_NUM_OBJECTS ) ) + { + nchan_ism = add( nchan_ism, 1 ); + k = sub( k, 1 ); + } + + test(); + IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) ) + { + IF( Opt_tsm ) + { + st_ivas->restartNeeded = 1; + move16(); + + return IVAS_ERR_OK; + } + ELSE + { +#ifdef DEBUGGING + fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" ); +#endif + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" ); + } + } + + st_ivas->nchan_ism = nchan_ism; + move16(); + st_ivas->ism_mode = ivas_ism_mode_select( nchan_ism, ivas_total_brate ); + + st_ivas->nchan_transport = nchan_ism; + move16(); + if ( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; + move16(); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) + { + /* read Ambisonic (SBA) planar flag */ + sba_planar = st_ivas->bit_stream[num_bits_read]; + num_bits_read = add( num_bits_read, SBA_PLANAR_BITS ); + + test(); + IF( st_ivas->ini_frame > 0 && NE_16( sba_planar, st_ivas->sba_planar ) ) + { + IF( Opt_tsm ) + { + st_ivas->restartNeeded = 1; + move16(); + + return IVAS_ERR_OK; + } + ELSE + { +#ifdef DEBUGGING + fprintf( stderr, "\nError: Changing the SBA planar/3D layout is not supported!\n" ); +#endif + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong SBA planar flag signalled!" ); + } + } + + /* read Ambisonic (SBA) order */ + sba_order = st_ivas->bit_stream[num_bits_read + 1]; + move16(); + sba_order = add( sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); + + test(); + IF( st_ivas->ini_frame > 0 && NE_16( sba_order, st_ivas->sba_order ) ) + { + IF( Opt_tsm ) + { + st_ivas->restartNeeded = 1; + move16(); + + return IVAS_ERR_OK; + } + ELSE + { +#ifdef DEBUGGING + fprintf( stderr, "\nError: Changing the SBA order is not supported!\n" ); +#endif + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong SBA order signalled!" ); + } + } + + sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, sba_order ); + st_ivas->nchan_transport = ivas_get_sba_num_TCs_fx( ivas_total_brate, sba_analysis_order ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) + { + UWord8 masaRestartCandidate; + masaRestartCandidate = 0; + move16(); + /* read number of MASA transport channels */ + k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + IF( st_ivas->bit_stream[k - 1] ) + { + test(); + if ( st_ivas->nchan_transport == 1 && Opt_tsm ) + { + masaRestartCandidate = 1; + move16(); + } + st_ivas->nchan_transport = 2; + move16(); + element_mode_flag = 1; + move16(); + } + ELSE + { + test(); + if ( st_ivas->nchan_transport == 2 && Opt_tsm ) + { + masaRestartCandidate = 1; + move16(); + } + st_ivas->nchan_transport = 1; + move16(); + } + + /* this should be non-zero if original input format was MASA_ISM_FORMAT */ + st_ivas->ism_mode = ISM_MODE_NONE; + move16(); + nchan_ism = add( st_ivas->bit_stream[k - 3], shl( st_ivas->bit_stream[k - 2], 1 ) ); + + IF( nchan_ism > 0 ) + { + /* the input_ivas_format should be MASA_ISM_FORMAT, but we cannot initialize it now */ + /* info about the number of objects: + '00' - MASA format at the encoder + '01' - MASA_ISM_FORMAT at the encoder, with 4 objects + '10' - MASA_ISM_FORMAT at the encoder, with 3 objects + '11' - MASA_ISM_FORMAT at the encoder, with 1 or 2 objects + reading if 1 or 2 objects is performed later + */ + nchan_ism = sub( 5, nchan_ism ); + test(); + IF( EQ_16( st_ivas->nchan_transport, 1 ) && EQ_16( nchan_ism, 2 ) ) + { + nchan_ism = 1; + move16(); + } + + /* for MASA_ISM_FORMAT at input the number of MASA transport channels is always 2 and the corresponding bit is not used here*/ + st_ivas->nchan_transport = 2; + move16(); + element_mode_flag = 1; + move16(); + } + ELSE IF( masaRestartCandidate > 0 ) + { + st_ivas->restartNeeded = 1; + move16(); + + return IVAS_ERR_OK; + } + + test(); + IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) ) + { + IF( Opt_tsm ) + { + st_ivas->restartNeeded = 1; + move16(); + + return IVAS_ERR_OK; + } + ELSE + { +#ifdef DEBUGGING + fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" ); +#endif + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" ); + } + } + + st_ivas->nchan_ism = nchan_ism; + move16(); + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + st_ivas->nchan_transport = 2; /* always 2 MASA transport channels */ + move16(); + + /* the number of objects are written at the end of the bitstream */ + k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + nchan_ism = add( add( shl( st_ivas->bit_stream[k - 1], 1 ), st_ivas->bit_stream[k - 2] ), 1 ); + st_ivas->ism_mode = ivas_omasa_ism_mode_select_fx( ivas_total_brate, nchan_ism ); + + test(); + IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) ) + { + IF( Opt_tsm ) + { + st_ivas->restartNeeded = 1; + move16(); + + return IVAS_ERR_OK; + } + ELSE + { +#ifdef DEBUGGING + fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" ); +#endif + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" ); + } + } + + st_ivas->nchan_ism = nchan_ism; + move16(); + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + /* the number of objects is written at the end of the bitstream, in the SBA metadata */ + k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + nchan_ism = add( add( shl( st_ivas->bit_stream[k - 1], 1 ), st_ivas->bit_stream[k - 2] ), 1 ); + + test(); + IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) ) + { + IF( Opt_tsm ) + { + st_ivas->restartNeeded = 1; + move16(); + + return IVAS_ERR_OK; + } + ELSE + { +#ifdef DEBUGGING + fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" ); +#endif + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" ); + } + } + + st_ivas->nchan_ism = nchan_ism; + move16(); + + /* read Ambisonic (SBA) planar flag */ + /*sba_planar = st_ivas->bit_stream[num_bits_read];*/ + num_bits_read = add( num_bits_read, SBA_PLANAR_BITS ); + + /* read Ambisonic (SBA) order (0 for signaling OSBA format at low bitrates)*/ + sba_order = st_ivas->bit_stream[num_bits_read + 1]; + move16(); + sba_order = add( sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); + num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); + + /* read the real Ambisonic order when the above bits are used to signal OSBA format */ + IF( LT_32( ivas_total_brate, IVAS_24k4 ) ) + { + sba_order = st_ivas->bit_stream[num_bits_read + 1]; + move16(); + sba_order = add( sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); + num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); + } + + test(); + IF( st_ivas->ini_frame > 0 && NE_16( sba_order, st_ivas->sba_order ) ) + { + IF( Opt_tsm ) + { + st_ivas->restartNeeded = 1; + move16(); + + return IVAS_ERR_OK; + } + ELSE + { +#ifdef DEBUGGING + fprintf( stderr, "\nError: Changing the SBA order is not supported!\n" ); +#endif + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong SBA order signalled!" ); + } + } + + st_ivas->ism_mode = ivas_osba_ism_mode_select( ivas_total_brate, st_ivas->nchan_ism ); + + sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, sba_order ); + st_ivas->nchan_transport = ivas_get_sba_num_TCs_fx( ivas_total_brate, sba_analysis_order ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) + { + /* read MC configuration */ + idx = 0; + move16(); + FOR( k = 0; k < MC_LS_SETUP_BITS; k++ ) + { + IF( st_ivas->bit_stream[num_bits_read + k] ) + { + idx = add( idx, shl( 1, sub( ( MC_LS_SETUP_BITS - 1 ), k ) ) ); + } + } + num_bits_read = add( num_bits_read, MC_LS_SETUP_BITS ); + + signaled_config = ivas_mc_map_ls_setup_to_output_config_fx( idx ); + + test(); + IF( st_ivas->ini_frame > 0 && NE_32( st_ivas->transport_config, signaled_config ) ) + { + IF( Opt_tsm ) + { + st_ivas->restartNeeded = 1; + move16(); + + return IVAS_ERR_OK; + } + ELSE + { +#ifdef DEBUGGING + fprintf( stderr, "\nError: Switching of MC configurations is not supported!\n" ); +#endif + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong MC configuration signalled!" ); + } + } + + st_ivas->mc_mode = ivas_mc_mode_select_fx( ivas_mc_map_output_config_to_mc_ls_setup_fx( signaled_config ), ivas_total_brate ); + st_ivas->transport_config = signaled_config; + move16(); + } + + /*-------------------------------------------------------------------* + * Read element mode + *-------------------------------------------------------------------*/ + + test(); + IF( st_ivas->ini_frame == 0 && element_mode_flag ) + { + /* read stereo technology info */ + if ( LT_32( ivas_total_brate, MIN_BRATE_MDCT_STEREO ) ) + { + /* 1 bit */ + IF( st_ivas->bit_stream[num_bits_read] ) + { + st_ivas->element_mode_init = add( 1, IVAS_CPE_DFT ); + } + ELSE + { + st_ivas->element_mode_init = add( 0, IVAS_CPE_DFT ); + } + } + ELSE + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + } + } + } + ELSE IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) + { + SWITCH( st_ivas->sid_format ) + { + case SID_DFT_STEREO: + st_ivas->element_mode_init = IVAS_CPE_DFT; + move16(); + BREAK; + case SID_MDCT_STEREO: + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + BREAK; + case SID_ISM: + st_ivas->element_mode_init = IVAS_SCE; + move16(); + BREAK; + case SID_MASA_1TC: + st_ivas->element_mode_init = IVAS_SCE; + move16(); + st_ivas->nchan_transport = 1; + move16(); + BREAK; + case SID_MASA_2TC: + k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + IF( st_ivas->bit_stream[k - 1 - SID_FORMAT_NBITS] == 1 ) + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + } + ELSE + { + st_ivas->element_mode_init = IVAS_CPE_DFT; + move16(); + } + st_ivas->nchan_transport = 2; + move16(); + BREAK; + case SID_SBA_1TC: + st_ivas->element_mode_init = IVAS_SCE; + move16(); + BREAK; + case SID_SBA_2TC: + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + BREAK; + } + + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + /* read the number of objects */ + nchan_ism = 1; + move16(); + k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + k = sub( sub( k, 1 ), SID_FORMAT_NBITS ); + WHILE( st_ivas->bit_stream[k] && ( nchan_ism < MAX_NUM_OBJECTS ) ) + { + nchan_ism = add( nchan_ism, 1 ); + k = sub( k, 1 ); + } + k = sub( k, 1 ); + + test(); + IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) ) + { + IF( Opt_tsm ) + { + st_ivas->restartNeeded = 1; + move16(); + + return IVAS_ERR_OK; + } + ELSE + { +#ifdef DEBUGGING + fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" ); +#endif + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" ); + } + } + + st_ivas->nchan_ism = nchan_ism; + move16(); + + /* read ism_mode */ + st_ivas->ism_mode = ISM_MODE_DISC; + move32(); + IF( GT_16( nchan_ism, 2 ) ) + { + k = sub( k, nchan_ism ); /* SID metadata flags */ + idx = st_ivas->bit_stream[k]; + move16(); + st_ivas->ism_mode = (ISM_MODE) add( idx, 1 ); + move32(); + } + + st_ivas->nchan_transport = nchan_ism; + move16(); + if ( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; + move16(); + } + } + } + + st_ivas->bit_stream = bit_stream_orig; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_dec_setup() + * + * IVAS decoder setup + *-------------------------------------------------------------------*/ + +ivas_error ivas_dec_setup( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 k, idx, num_bits_read; + Word16 nchan_ism, element_mode_flag; + Decoder_State *st; + Word32 ivas_total_brate; + ivas_error error; + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + Word16 num_src = 0; + move16(); + + error = IVAS_ERR_OK; + move32(); + num_bits_read = 0; + move16(); + element_mode_flag = 0; + move16(); + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + move32(); + + /*-------------------------------------------------------------------* + * Read IVAS format + *-------------------------------------------------------------------*/ + + IF( ( error = ivas_read_format( st_ivas, &num_bits_read ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-------------------------------------------------------------------* + * Read other signaling (ISM/MC mode, number of channels, etc.) + *-------------------------------------------------------------------*/ + + IF( is_DTXrate( ivas_total_brate ) == 0 ) + { + /*-------------------------------------------------------------------* + * Read IVAS format related signaling: + * - in ISM : read number of objects + * - in SBA : read SBA planar flag and SBA order + * - in MASA : read number of TC + * - in MC : read LS setup + *-------------------------------------------------------------------*/ + + IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) + { + element_mode_flag = 1; + move16(); + } + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + /* read the number of objects */ + st_ivas->nchan_transport = 1; + move16(); + nchan_ism = 1; + move16(); + k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + k = sub( k, 1 ); + WHILE( st_ivas->bit_stream[k] && ( nchan_ism < MAX_NUM_OBJECTS ) ) + { + nchan_ism = add( nchan_ism, 1 ); + k = sub( k, 1 ); + } + + st_ivas->nchan_ism = nchan_ism; + move16(); + + IF( NE_32( ( error = ivas_ism_dec_config_fx( st_ivas, st_ivas->ism_mode ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) + { + /* read Ambisonic (SBA) planar flag */ + st_ivas->sba_planar = st_ivas->bit_stream[num_bits_read]; + move16(); + num_bits_read = add( num_bits_read, SBA_PLANAR_BITS ); + + /* read Ambisonic (SBA) order */ + st_ivas->sba_order = st_ivas->bit_stream[num_bits_read + 1]; + move16(); + st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); + move16(); + num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); + + test(); + test(); + IF( st_ivas->ini_frame > 0 && NE_32( ivas_total_brate, st_ivas->last_active_ivas_total_brate ) && GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) + { + IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + /* set Ambisonic (SBA) order used for analysis and coding */ + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->sba_order ); + move16(); + ivas_sba_config_fx( ivas_total_brate, st_ivas->sba_analysis_order, -1, &( st_ivas->nchan_transport ), st_ivas->sba_planar, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) + { + /* read number of MASA transport channels */ + k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + IF( st_ivas->bit_stream[k - 1] ) + { + st_ivas->nchan_transport = 2; + move16(); + element_mode_flag = 1; + move16(); + } + ELSE + { + st_ivas->nchan_transport = 1; + move16(); + } + + /* this should be non-zero if original input format was MASA_ISM_FORMAT */ + st_ivas->ism_mode = ISM_MODE_NONE; + move16(); + st_ivas->nchan_ism = add( st_ivas->bit_stream[sub( k, 3 )], shl( st_ivas->bit_stream[sub( k, 2 )], 1 ) ); + + IF( GT_16( st_ivas->nchan_ism, 0 ) ) + { + /* the input_ivas_format should be MASA_ISM_FORMAT, but we cannot initialize it now */ + /* info about the number of objects: + '00' - MASA format at the encoder + '01' - MASA_ISM_FORMAT at the encoder, with 4 objects + '10' - MASA_ISM_FORMAT at the encoder, with 3 objects + '11' - MASA_ISM_FORMAT at the encoder, with 1 or 2 objects + reading if 1 or 2 objects is performed later + */ + st_ivas->nchan_ism = sub( 5, st_ivas->nchan_ism ); + + test(); + IF( EQ_16( st_ivas->nchan_transport, 1 ) && EQ_16( st_ivas->nchan_ism, 2 ) ) + { + st_ivas->nchan_ism = 1; + move16(); + } + + /* for MASA_ISM_FORMAT at input the number of MASA transport channels is always 2 and the corresponding bit is not used here*/ + st_ivas->nchan_transport = 2; + element_mode_flag = 1; + move16(); + move16(); + } + + IF( st_ivas->ini_frame > 0 ) + { + /* reconfigure in case a change of operation mode is detected */ + test(); + test(); + IF( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) || ( st_ivas->ini_active_frame == 0 ) ) + { + IF( EQ_32( st_ivas->last_ivas_format, MASA_FORMAT ) ) + { + test(); + test(); + test(); + IF( ( st_ivas->ini_active_frame == 0 ) && NE_32( ivas_total_brate, FRAME_NO_DATA ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) && EQ_16( st_ivas->nCPE, 1 ) ) + { + st_ivas->hCPE[0]->nchan_out = 1; + move16(); + } + ELSE + { + IF( NE_32( ( error = ivas_masa_dec_reconfigure_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + ELSE + { + IF( NE_32( ( error = ivas_omasa_dec_config_fx( st_ivas, &num_src, SrcInd ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + st_ivas->nchan_transport = 2; /* always 2 MASA transport channels */ + move16(); + + /* for the DISC mode the number of objects are written at the end of the bitstream, in the MASA metadata */ + k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + st_ivas->nchan_ism = add( add( shl( st_ivas->bit_stream[k - 1], 1 ), st_ivas->bit_stream[k - 2] ), 1 ); + move16(); + st_ivas->ism_mode = ivas_omasa_ism_mode_select_fx( ivas_total_brate, st_ivas->nchan_ism ); + move16(); + IF( st_ivas->ini_frame > 0 ) + { + /* reconfigure in case a change of operation mode is detected */ + test(); + test(); + IF( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) || ( st_ivas->ini_active_frame == 0 ) ) + { + IF( NE_32( ( error = ivas_omasa_dec_config_fx( st_ivas, &num_src, SrcInd ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + /* the number of objects is written at the end of the bitstream, in the SBA metadata */ + k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + st_ivas->nchan_ism = add( add( shl( st_ivas->bit_stream[k - 1], 1 ), st_ivas->bit_stream[k - 2] ), 1 ); + move16(); + + /* read Ambisonic (SBA) planar flag */ + st_ivas->sba_planar = st_ivas->bit_stream[num_bits_read]; + move16(); + num_bits_read = add( num_bits_read, SBA_PLANAR_BITS ); + + /* read Ambisonic (SBA) order (0 for signaling OSBA format at low bitrates)*/ + st_ivas->sba_order = st_ivas->bit_stream[num_bits_read + 1]; + move16(); + st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); + move16(); + num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); + + /* read Ambisonic (SBA) order */ + /* read the real Ambisonic order when the above bits are used to signal OSBA format */ + IF( LT_32( ivas_total_brate, IVAS_24k4 ) ) + { + st_ivas->sba_order = st_ivas->bit_stream[num_bits_read + 1]; + move16(); + st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); + num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); + } + + test(); + IF( st_ivas->ini_frame > 0 && NE_32( ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ) + { + IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + /* set Ambisonic (SBA) order used for analysis and coding */ + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->sba_order ); + move16(); + + ivas_sba_config_fx( ivas_total_brate, st_ivas->sba_analysis_order, -1, &( st_ivas->nchan_transport ), st_ivas->sba_planar, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init ); + + /*correct number of CPEs for discrete ISM coding*/ + test(); + IF( st_ivas->ini_frame > 0 && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + Word16 n = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + st_ivas->nCPE = shr_r( n, 1 ); + } + } + + IF( EQ_16( ivas_osba_ism_mode_select( ivas_total_brate, st_ivas->nchan_ism ), ISM_SBA_MODE_DISC ) ) + { + st_ivas->ism_mode = ISM_SBA_MODE_DISC; + move32(); + } + ELSE + { + st_ivas->ism_mode = ISM_MODE_NONE; + move32(); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) + { + /* read MC configuration */ + idx = 0; + move16(); + FOR( k = 0; k < MC_LS_SETUP_BITS; k++ ) + { + IF( st_ivas->bit_stream[num_bits_read + k] ) + { + idx = add( idx, shl( 1, sub( ( MC_LS_SETUP_BITS - 1 ), k ) ) ); + } + } + num_bits_read = add( num_bits_read, MC_LS_SETUP_BITS ); + + /* select MC format mode; reconfigure the MC format decoder */ + IF( NE_32( ( error = ivas_mc_dec_config_fx( st_ivas, idx ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Read element mode + *-------------------------------------------------------------------*/ + + IF( st_ivas->ini_frame == 0 && element_mode_flag ) + { + /* read stereo technology info */ + IF( LT_32( ivas_total_brate, MIN_BRATE_MDCT_STEREO ) ) + { + /* 1 bit */ + IF( st_ivas->bit_stream[num_bits_read] ) + { + st_ivas->element_mode_init = add( 1, IVAS_CPE_DFT ); + move16(); + } + ELSE + { + st_ivas->element_mode_init = add( 0, IVAS_CPE_DFT ); + move16(); + } + } + ELSE + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + } + } + } + ELSE IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) + { + SWITCH( st_ivas->sid_format ) + { + case SID_DFT_STEREO: + st_ivas->element_mode_init = IVAS_CPE_DFT; + move16(); + BREAK; + case SID_MDCT_STEREO: + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + BREAK; + case SID_ISM: + st_ivas->element_mode_init = IVAS_SCE; + move16(); + BREAK; + case SID_MASA_1TC: + st_ivas->element_mode_init = IVAS_SCE; + move16(); + st_ivas->nchan_transport = 1; + move16(); + BREAK; + case SID_MASA_2TC: + k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + IF( EQ_16( st_ivas->bit_stream[( k - 1 ) - SID_FORMAT_NBITS], 1 ) ) + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + } + ELSE + { + st_ivas->element_mode_init = IVAS_CPE_DFT; + move16(); + } + st_ivas->nchan_transport = 2; + move16(); + BREAK; + case SID_SBA_1TC: + st_ivas->element_mode_init = IVAS_SCE; + move16(); + BREAK; + case SID_SBA_2TC: + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + BREAK; + } + + test(); + IF( st_ivas->ini_frame > 0 && EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) + { + Word16 nchan_transport_old, nchan_transport; + nchan_transport_old = st_ivas->nchan_transport; + move16(); + IF( ( EQ_16( st_ivas->sid_format, SID_SBA_2TC ) ) ) + { + nchan_transport = 2; + } + ELSE + { + nchan_transport = 1; + } + move16(); + + IF( NE_16( nchan_transport_old, nchan_transport ) ) + { + /*Setting the default bitrate for the reconfig function*/ + IF( EQ_16( st_ivas->sid_format, SID_SBA_2TC ) ) + { + st_ivas->hDecoderConfig->ivas_total_brate = IVAS_48k; + move16(); + } + ELSE + { + st_ivas->hDecoderConfig->ivas_total_brate = IVAS_24k4; + move16(); + } + + IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->last_active_ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + move32(); + st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate; + move32(); + } + } + + test(); + IF( GT_16( st_ivas->ini_frame, 0 ) && EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) + { + st_ivas->nchan_ism = 0; + move16(); + st_ivas->ism_mode = ISM_MODE_NONE; + move16(); + } + + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + ISM_MODE last_ism_mode = st_ivas->ism_mode; + move32(); + /* read the number of objects */ + st_ivas->nchan_transport = 1; + move16(); + nchan_ism = 1; + move16(); + k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + k = sub( sub( k, 1 ), SID_FORMAT_NBITS ); + WHILE( st_ivas->bit_stream[k] && ( nchan_ism < MAX_NUM_OBJECTS ) ) + { + nchan_ism = add( nchan_ism, 1 ); + k = sub( k, 1 ); + } + k = sub( k, 1 ); + + test(); + IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); + } + + st_ivas->nchan_ism = nchan_ism; + move16(); + + /* read ism_mode */ + st_ivas->ism_mode = ISM_MODE_DISC; + move32(); + IF( GT_16( nchan_ism, 2 ) ) + { + k = sub( k, nchan_ism ); /* SID metadata flags */ + idx = st_ivas->bit_stream[k]; + move16(); + st_ivas->ism_mode = (ISM_MODE) add( idx, 1 ); + move32(); + } + + if ( st_ivas->ini_frame == 0 ) + { + last_ism_mode = st_ivas->ism_mode; + move32(); + } + + IF( NE_32( ( error = ivas_ism_dec_config_fx( st_ivas, last_ism_mode ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + + /*-------------------------------------------------------------------* + * Initialize decoder in the first good frame based on IVAS format + * and number of transport channels + *-------------------------------------------------------------------*/ + test(); + IF( st_ivas->ini_frame == 0 && NE_32( st_ivas->ivas_format, UNDEFINED_FORMAT ) ) + { + IF( NE_32( ( error = doSanityChecks_IVAS( st_ivas ) ), IVAS_ERR_OK ) ) + { + return IVAS_ERROR( error, "Sanity checks failed" ); + } + + IF( NE_32( ( error = ivas_init_decoder_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /*----------------------------------------------------------------* + * Reset bitstream pointers + *----------------------------------------------------------------*/ + + ivas_set_bitstream_pointers( st_ivas ); + + reset_elements( st_ivas ); + + /* update bitstream buffer pointer -> take into account already read bits */ + test(); + IF( ( st_ivas->nSCE > 0 ) || ( st_ivas->nCPE > 0 ) ) + { + IF( st_ivas->nSCE > 0 ) + { + st = st_ivas->hSCE[0]->hCoreCoder[0]; + } + ELSE + { + st = st_ivas->hCPE[0]->hCoreCoder[0]; + } + st->next_bit_pos = num_bits_read; + move16(); + st->total_brate = ACELP_8k00; /* only temporary initialization - this is needed for get_next_indice() in the frame following NO_DATA frame */ + move32(); + } + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_read_format() + * + * Read IVAS format signaling + *-------------------------------------------------------------------*/ + +static ivas_error ivas_read_format( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word16 *num_bits_read /* o : number of IVAS signaling bits read from the bitstream */ +) +{ + Word16 k, idx; + Word32 ivas_total_brate; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + move32(); + + *num_bits_read = 0; + move16(); + test(); + test(); + IF( !st_ivas->bfi && is_DTXrate( ivas_total_brate ) == 0 ) + { + /* read IVAS format */ + k = 0; + move16(); + if ( st_ivas->bit_stream[*num_bits_read] ) + { + k = 1; + move16(); + } + k = shl( k, 1 ); + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); + if ( st_ivas->bit_stream[*num_bits_read] ) + { + k = add( k, 1 ); + } + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); + SWITCH( k ) + { + case 0: + st_ivas->ivas_format = STEREO_FORMAT; + move32(); + BREAK; + case 1: + st_ivas->ivas_format = MC_FORMAT; + move32(); + BREAK; + case 2: + st_ivas->ivas_format = ISM_FORMAT; + move32(); + + IF( GE_32( ivas_total_brate, IVAS_24k4 ) ) + { + IF( st_ivas->bit_stream[*num_bits_read] ) + { + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); + IF( st_ivas->bit_stream[*num_bits_read] ) + { + st_ivas->ivas_format = SBA_ISM_FORMAT; + move32(); + } + ELSE + { + st_ivas->ivas_format = MASA_ISM_FORMAT; + move32(); + } + } + + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); + } + BREAK; + case 3: + IF( st_ivas->bit_stream[*num_bits_read] ) + { + st_ivas->ivas_format = MASA_FORMAT; + move32(); + } + ELSE + { + st_ivas->ivas_format = SBA_FORMAT; + move32(); + /* read Ambisonic (SBA) planar flag */ + st_ivas->sba_planar = st_ivas->bit_stream[( *num_bits_read ) + 1]; + move16(); + + /* read Ambisonic (SBA) order */ + st_ivas->sba_order = st_ivas->bit_stream[( *num_bits_read ) + 2 + SBA_PLANAR_BITS]; + move16(); + st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[( *num_bits_read ) + 1 + SBA_PLANAR_BITS], 1 ) ); + move16(); + IF( st_ivas->sba_order == 0 ) + { + st_ivas->ivas_format = SBA_ISM_FORMAT; + move32(); + + /* read the real Ambisonic order when the above bits are used to signal OSBA format */ + IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) + { + st_ivas->sba_order = st_ivas->bit_stream[add( *num_bits_read, 2 + SBA_PLANAR_BITS + SBA_ORDER_BITS )]; + st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[add( *num_bits_read, 1 + SBA_PLANAR_BITS + SBA_ORDER_BITS )], 1 ) ); + } + } + } + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); + + BREAK; + } + } + ELSE IF( ( st_ivas->bfi == 0 ) && EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) + { + /* read IVAS format in SID frame */ + idx = 0; + move16(); + FOR( k = 0; k < SID_FORMAT_NBITS; k++ ) + { + idx += st_ivas->bit_stream[k] << ( SID_FORMAT_NBITS - 1 - k ); + } + + ( *num_bits_read ) = add( *num_bits_read, SID_FORMAT_NBITS ); + move16(); + st_ivas->sid_format = idx; + move16(); + + SWITCH( idx ) + { + case SID_DFT_STEREO: + case SID_MDCT_STEREO: + st_ivas->ivas_format = STEREO_FORMAT; + move32(); + BREAK; + case SID_ISM: + st_ivas->ivas_format = ISM_FORMAT; + move32(); + BREAK; + case SID_SBA_1TC: + st_ivas->ivas_format = SBA_FORMAT; + move32(); + st_ivas->element_mode_init = IVAS_SCE; + move16(); + BREAK; + case SID_SBA_2TC: + st_ivas->ivas_format = SBA_FORMAT; + move32(); + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + BREAK; + case SID_MASA_1TC: + st_ivas->ivas_format = MASA_FORMAT; + move32(); + st_ivas->element_mode_init = IVAS_SCE; + move16(); + BREAK; + case SID_MASA_2TC: + st_ivas->ivas_format = MASA_FORMAT; + move32(); + k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + IF( EQ_32( st_ivas->bit_stream[k - 1], 1 ) ) + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + } + ELSE + { + st_ivas->element_mode_init = IVAS_CPE_DFT; + move16(); + } + BREAK; + default: + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Invalid value %c found in SID format field.", st_ivas->sid_format ); + } + + IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) + { + /* read Ambisonic (SBA) planar flag */ + st_ivas->sba_planar = st_ivas->bit_stream[*num_bits_read]; + move16(); + *num_bits_read = add( *num_bits_read, SBA_PLANAR_BITS ); + move16(); + + /* read Ambisonic (SBA) order */ + st_ivas->sba_order = st_ivas->bit_stream[*num_bits_read + 1]; + move16(); + st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[*num_bits_read], 1 ) ); + move16(); + *num_bits_read = add( *num_bits_read, SBA_ORDER_BITS ); + move16(); + + if ( st_ivas->sba_analysis_order == 0 ) + { + st_ivas->sba_analysis_order = SBA_FOA_ORDER; + move16(); + } + } + + /* reset bitstream handle to avoid BER detection after reading the 2400 kbps for ch0 */ + st_ivas->bit_stream = st_ivas->bit_stream + ( *num_bits_read ); + ( *num_bits_read ) = 0; + move16(); + } + ELSE + { + /* In SID/NO_DATA frames, use the previous frame IVAS format */ + } + + return error; +} + + +/*-------------------------------------------------------------------* + * getNumChanSynthesis() + * + * get number of output channels used for synthesis/decoding + * (often different from number of output channels!) + *-------------------------------------------------------------------*/ + +/*! r: number of channels to be synthesised */ +Word16 getNumChanSynthesis( + Decoder_Struct *st_ivas /* i : IVAS decoder structure */ +) +{ + Word16 n; + + n = add( st_ivas->nSCE, imult1616( CPE_CHANNELS, st_ivas->nCPE ) ); + test(); + test(); + IF( st_ivas->sba_dirac_stereo_flag ) + { + n = CPE_CHANNELS; + move16(); + } + ELSE IF( ( st_ivas->hMCT != NULL || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) && NE_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + n = st_ivas->nchan_transport; + move16(); + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + n = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + } + ELSE + { + n = st_ivas->nchan_transport; + move16(); + } + } + + return n; +} + + +/*-------------------------------------------------------------------* + * copy_decoder_config() + * + * Copy IVAS configuration structure to the CoreCoder state structure + *-------------------------------------------------------------------*/ + +void copy_decoder_config( + Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + Decoder_State *st /* o : decoder state structure */ +) +{ + st->output_Fs = st_ivas->hDecoderConfig->output_Fs; + move32(); + st->Opt_AMR_WB = st_ivas->hDecoderConfig->Opt_AMR_WB; + move16(); + st->codec_mode = st_ivas->codec_mode; + move16(); + st->ini_frame = st_ivas->ini_frame; + move16(); + + st->bfi = st_ivas->bfi; + move16(); + + st->writeFECoffset = st_ivas->writeFECoffset; + move16(); + + st->element_mode = st_ivas->element_mode_init; + move16(); + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_init_decoder_front() + * + * Set decoder parameters to initial values + *-------------------------------------------------------------------*/ + +ivas_error ivas_init_decoder_front( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + /*-----------------------------------------------------------------* + * Resets + *-----------------------------------------------------------------*/ + + st_ivas->nSCE = 0; + move16(); + st_ivas->nCPE = 0; + move16(); + st_ivas->nchan_ism = 0; + move16(); + st_ivas->nCPE_old = 0; + move16(); + st_ivas->nchan_transport = -1; + move16(); + st_ivas->ism_mode = ISM_MODE_NONE; + move32(); + st_ivas->mc_mode = MC_MODE_NONE; + move32(); + st_ivas->sid_format = SID_FORMAT_NONE; + move16(); + st_ivas->sba_dirac_stereo_flag = 0; + move16(); + + /* HRTF binauralization latency in ns */ + st_ivas->binaural_latency_ns = 0; + move32(); + + /*-------------------------------------------------------------------* + * Allocate and initialize Custom loudspeaker layout handle + *--------------------------------------------------------------------*/ + + IF( st_ivas->hDecoderConfig->Opt_LsCustom ) + { + IF( EQ_32( ( error = ivas_ls_custom_open_fx( &( st_ivas->hLsSetupCustom ) ) ), IVAS_ERR_OK ) ) + { + set_zero_fx( ( st_ivas->hLsSetupCustom )->ls_azimuth_fx, MAX_OUTPUT_CHANNELS ); + set_zero_fx( ( st_ivas->hLsSetupCustom )->ls_elevation_fx, MAX_OUTPUT_CHANNELS ); + } + ELSE + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate and initialize Head-Tracking handle + *--------------------------------------------------------------------*/ + + IF( st_ivas->hDecoderConfig->Opt_Headrotation ) + { + IF( NE_32( ( error = ivas_headTrack_open_fx( &( st_ivas->hHeadTrackData ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_orient_trk_SetTrackingType_fx( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate and initialize external orientation handle + *--------------------------------------------------------------------*/ + + IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + IF( NE_32( ( error = ivas_external_orientation_open_fx( &( st_ivas->hExtOrientationData ), st_ivas->hDecoderConfig->render_framesize ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate and initialize combined orientation handle + *--------------------------------------------------------------------*/ + + test(); + IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + IF( NE_32( ( error = ivas_combined_orientation_open_fx( &( st_ivas->hCombinedOrientationData ), st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->render_framesize ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate and initialize Binaural Renderer configuration handle + *--------------------------------------------------------------------*/ + + + test(); + test(); + test(); + test(); + test(); + test(); + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || + ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) ) + { + IF( NE_32( ( error = ivas_render_config_open_fx( &( st_ivas->hRenderConfig ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_render_config_init_from_rom_fx( &st_ivas->hRenderConfig ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + +#ifdef TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR + st_ivas->flushing = 0; + move16(); +#endif + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_init_decoder() + * + * Initialize IVAS decoder state structure + *-------------------------------------------------------------------*/ + +ivas_error ivas_init_decoder_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 i, n, k; + Word16 sce_id, cpe_id; + Word16 numCldfbAnalyses, numCldfbSyntheses; + Word16 granularity, n_channels_transport_jbm; + Word16 nchan_out_buff; + Word32 output_Fs, ivas_total_brate, tmp_br, tmp32; + Word32 delay_ns; + AUDIO_CONFIG output_config; + DECODER_CONFIG_HANDLE hDecoderConfig; + ivas_error error; + Word32 ism_total_brate; + + error = IVAS_ERR_OK; + move32(); + output_Fs = st_ivas->hDecoderConfig->output_Fs; + move32(); + hDecoderConfig = st_ivas->hDecoderConfig; + output_config = hDecoderConfig->output_config; + ivas_total_brate = hDecoderConfig->ivas_total_brate; + move32(); + hDecoderConfig->last_ivas_total_brate = ivas_total_brate; + move32(); + st_ivas->last_active_ivas_total_brate = ivas_total_brate; + move32(); + + /*-----------------------------------------------------------------* + * Set number of output channels for EXTERNAL output config. + *-----------------------------------------------------------------*/ + + test(); + test(); + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + test(); + IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) + { + hDecoderConfig->nchan_out = 1; + move16(); + } + ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) + { + hDecoderConfig->nchan_out = CPE_CHANNELS; + } + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) + { + hDecoderConfig->nchan_out = audioCfg2channels( st_ivas->transport_config ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) + { + hDecoderConfig->nchan_out = audioCfg2channels( ivas_set_audio_config_from_sba_order( st_ivas->sba_order ) ); + move16(); + hDecoderConfig->nchan_out = add( hDecoderConfig->nchan_out, st_ivas->nchan_ism ); + move16(); + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) + { + hDecoderConfig->nchan_out = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + move16(); + } + ELSE IF( !EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + hDecoderConfig->nchan_out = st_ivas->nchan_transport; + move16(); + } + + st_ivas->hOutSetup.nchan_out_woLFE = hDecoderConfig->nchan_out; + move16(); + } + + /*-----------------------------------------------------------------* + * Set output and intern setup & renderer selection + *-----------------------------------------------------------------*/ + + st_ivas->intern_config = output_config; + move32(); + + test(); + test(); + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) + { + ivas_output_init( &( st_ivas->hOutSetup ), st_ivas->transport_config ); + st_ivas->intern_config = st_ivas->transport_config; + move32(); + } + ELSE IF( output_config == IVAS_AUDIO_CONFIG_EXTERNAL && ( st_ivas->ivas_format == SBA_ISM_FORMAT || st_ivas->ivas_format == SBA_FORMAT ) ) + { + st_ivas->intern_config = ivas_set_audio_config_from_sba_order( st_ivas->sba_order ); + ivas_output_init( &( st_ivas->hOutSetup ), st_ivas->intern_config ); + } + ELSE + { + ivas_output_init( &( st_ivas->hOutSetup ), output_config ); + } + + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) + { + st_ivas->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; + move16(); + st_ivas->intern_config = IVAS_AUDIO_CONFIG_7_1_4; + move32(); + st_ivas->hOutSetup.output_config = st_ivas->intern_config; + move32(); + st_ivas->hOutSetup.nchan_out_woLFE = audioCfg2channels( st_ivas->intern_config ); + move16(); + } + + test(); + IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) || EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) + { + st_ivas->transport_config = EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ? IVAS_AUDIO_CONFIG_MONO : IVAS_AUDIO_CONFIG_STEREO; + } + + /* Only initialize transport setup if it is used */ + IF( NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_INVALID ) ) + { + ivas_output_init( &( st_ivas->hTransSetup ), st_ivas->transport_config ); + } + + test(); + IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) + { + ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); + + ivas_mcmasa_set_separate_channel_mode_fx( &( st_ivas->hOutSetup.separateChannelEnabled ), &( st_ivas->hOutSetup.separateChannelIndex ), ivas_total_brate ); + } + + ivas_renderer_select( st_ivas ); + + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + IF( EQ_16( ( error = ivas_ls_custom_output_init_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + st_ivas->hOutSetup.ls_azimuth_fx = st_ivas->hLsSetupCustom->ls_azimuth_fx; + move32(); + st_ivas->hOutSetup.ls_elevation_fx = st_ivas->hLsSetupCustom->ls_elevation_fx; + move32(); + st_ivas->hIntSetup.ls_azimuth_fx = st_ivas->hLsSetupCustom->ls_azimuth_fx; + move32(); + st_ivas->hIntSetup.ls_elevation_fx = st_ivas->hLsSetupCustom->ls_elevation_fx; + move32(); + } + ELSE + { + return error; + } + } + + ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); + + test(); + IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) + { + ivas_mcmasa_set_separate_channel_mode_fx( &( st_ivas->hIntSetup.separateChannelEnabled ), &( st_ivas->hIntSetup.separateChannelIndex ), ivas_total_brate ); + + test(); + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.separateChannelEnabled ) + { + st_ivas->hLsSetupCustom->separate_ch_found = 0; + move16(); + IF( GE_16( st_ivas->hOutSetup.nchan_out_woLFE, MCMASA_MIN_SPEAKERS_SEPARATE_CENTER ) ) + { + /* check for a speaker at (0, 0) if minimum speaker count is available */ + FOR( i = 0; i < st_ivas->hOutSetup.nchan_out_woLFE; i++ ) + { + test(); + IF( ( L_shr( st_ivas->hOutSetup.ls_azimuth_fx[i], Q22 ) == 0 ) && ( L_shr( st_ivas->hOutSetup.ls_elevation_fx[i], Q22 ) == 0 ) ) + { + st_ivas->hIntSetup.separateChannelIndex = i; + move16(); + st_ivas->hLsSetupCustom->separate_ch_found = 1; + move16(); + BREAK; + } + } + } + } + } + + /*--------------------------------------------------------------------------* + * Allocate and initialize HRTF Statistics handle, get default reverb values + *--------------------------------------------------------------------------*/ + + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + /* Init HRTF statistics */ + IF( NE_32( ( error = ivas_HRTF_statistics_init_fx( &st_ivas->hHrtfStatistics, output_Fs ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* Get default reverb values based on format, if custom values were not given */ + IF( EQ_16( st_ivas->hDecoderConfig->Opt_RendConfigCustom, 0 ) ) + { + IVAS_DefaultReverbSize defaultReverbSize; + SWITCH( st_ivas->hDecoderConfig->Opt_RoomSize ) + { + case IVAS_ROOM_SIZE_AUTO: + SWITCH( st_ivas->ivas_format ) + { + case ISM_FORMAT: + defaultReverbSize = DEFAULT_REVERB_LARGE; + move32(); + BREAK; + case SBA_FORMAT: + defaultReverbSize = DEFAULT_REVERB_SMALL; + move32(); + BREAK; + case MASA_FORMAT: + defaultReverbSize = DEFAULT_REVERB_SMALL; + move32(); + BREAK; + case MC_FORMAT: + defaultReverbSize = DEFAULT_REVERB_MEDIUM; + move32(); + BREAK; + case MASA_ISM_FORMAT: + defaultReverbSize = DEFAULT_REVERB_MEDIUM; + move32(); + BREAK; + case SBA_ISM_FORMAT: + defaultReverbSize = DEFAULT_REVERB_MEDIUM; + move32(); + BREAK; + default: + defaultReverbSize = DEFAULT_REVERB_LARGE; + move32(); + } + BREAK; + case IVAS_ROOM_SIZE_SMALL: + defaultReverbSize = DEFAULT_REVERB_SMALL; + move32(); + BREAK; + case IVAS_ROOM_SIZE_MEDIUM: + defaultReverbSize = DEFAULT_REVERB_MEDIUM; + move32(); + BREAK; + case IVAS_ROOM_SIZE_LARGE: + default: + defaultReverbSize = DEFAULT_REVERB_LARGE; + move32(); + BREAK; + } + IF( NE_32( error = ivas_render_config_change_defaults( st_ivas->hRenderConfig, defaultReverbSize ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + + /*-----------------------------------------------------------------* + * Allocate and initialize SCE/CPE and other handles + *-----------------------------------------------------------------*/ + + IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) + { + st_ivas->nSCE = 1; /* in mono, there is always only one SCE */ + move16(); + st_ivas->nCPE = 0; + move16(); + st_ivas->nCPE_old = 0; + move16(); + st_ivas->nchan_transport = 1; + move16(); + sce_id = 0; + move16(); + + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) + { + st_ivas->nchan_transport = CPE_CHANNELS; + move16(); + + st_ivas->nSCE = 0; + move16(); + st_ivas->nCPE = 1; /* in stereo, there is always only one CPE */ + move16(); + st_ivas->nCPE_old = 0; + move16(); + cpe_id = 0; + move16(); + + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < st_ivas->nchan_transport; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + + /* init EFAP for custom LS output and set hTransSetup */ + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hOutSetup.ls_azimuth_fx, st_ivas->hOutSetup.ls_elevation_fx, st_ivas->hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) + { + return error; + } + + ivas_output_init( &( st_ivas->hTransSetup ), IVAS_AUDIO_CONFIG_STEREO ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + Word32 element_brate_tmp[MAX_NUM_OBJECTS]; + + st_ivas->nSCE = st_ivas->nchan_transport; /* "st_ivas->nchan_transport" is known from ivas_dec_setup */ + move16(); + st_ivas->nCPE = 0; + move16(); + st_ivas->nCPE_old = 0; + move16(); + st_ivas->ism_extmeta_active = -1; + move16(); + st_ivas->ism_extmeta_cnt = 0; + move16(); + IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; + move16(); + st_ivas->nSCE = MAX_PARAM_ISM_WAVE; + move16(); + + IF( NE_32( ( error = ivas_param_ism_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, element_brate_tmp ) ) != IVAS_ERR_OK ) + { + return error; + } + + FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, element_brate_tmp[sce_id] ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + + st_ivas->hSCE[sce_id]->hCoreCoder[0]->is_ism_format = 1; + move16(); + } + + st_ivas->hISMDTX.sce_id_dtx = 0; + move16(); + + IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2 = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed3; + move16(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + /* reusing OMASA function for allocating and initializing MASA_ISM rendering handle (even though not in OMASA) */ + IF( NE_32( ( error = ivas_omasa_data_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) ) + { + FOR( sce_id = 0; sce_id < st_ivas->nSCE; ++sce_id ) + { + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2 = add( 2, sce_id ); + move16(); + } + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) + { + IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } + set16_fx( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, 0, CLDFB_NO_COL_MAX ); + + Word16 hodirac_flag = ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ); + IF( hodirac_flag ) + { + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, IVAS_MAX_NUM_BANDS, st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + test(); + test(); + test(); + IF( NE_32( output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( output_config, IVAS_AUDIO_CONFIG_MONO ) && !( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && EQ_32( st_ivas->intern_config, IVAS_AUDIO_CONFIG_FOA ) ) ) + { + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + move16(); + } + ELSE + { + Word16 band_grouping[IVAS_MAX_NUM_BANDS + 1]; + + st_ivas->hSpar->enc_param_start_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + move16(); + IF( ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ) + { + st_ivas->hSpar->enc_param_start_band = 0; + move16(); + set8_fx( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); + st_ivas->hQMetaData->numTwoDirBands = (UWord8) st_ivas->hQMetaData->q_direction[0].cfg.nbands; + move16(); + } + + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0, 1 ); + } + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + move16(); + + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &tmp_br, &tmp32, 0 ); + FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, tmp_br ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &tmp_br, &tmp32, 0 ); + tmp_br = L_shl( tmp_br, CPE_CHANNELS_LOG2 ); + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, tmp_br ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* create CPE element for DFT Stereo like upmix */ + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &tmp_br, &tmp32, 0 ); + test(); + IF( st_ivas->sba_dirac_stereo_flag && ( st_ivas->nCPE == 0 ) ) + { + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, tmp_br ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + } + + IF( GT_16( st_ivas->nCPE, 1 ) ) + { + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /* set CNA/CNG flags */ + ivas_sba_set_cna_cng_flag( st_ivas ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) + { + /* if we start in ISM_MODE_NONE in MASA_ISM, that appears as normal MASA, but we may change to a mode with ISMs */ + st_ivas->ism_extmeta_active = -1; + move16(); + st_ivas->ism_extmeta_cnt = 0; + move16(); + IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &tmp_br, &tmp32, 0 ); + FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, tmp_br ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &tmp_br, &tmp32, 0 ); + tmp_br = L_shl( tmp_br, CPE_CHANNELS_LOG2 ); + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, tmp_br ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* set CNA/CNG flags */ + ivas_sba_set_cna_cng_flag( st_ivas ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + Word32 temp_brate[MAX_SCE]; + st_ivas->ism_extmeta_active = -1; + move16(); + st_ivas->ism_extmeta_cnt = 0; + move16(); + + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + move16(); + + IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } + + Word16 hodirac_flag = ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ); + IF( hodirac_flag ) + { + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, IVAS_MAX_NUM_BANDS, st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + test(); + test(); + IF( NE_32( output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( output_config, IVAS_AUDIO_CONFIG_MONO ) ) + { + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + move16(); + } + ELSE + { + Word16 band_grouping[IVAS_MAX_NUM_BANDS + 1]; + + st_ivas->hSpar->enc_param_start_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + move16(); + + IF( ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ) + { + st_ivas->hSpar->enc_param_start_band = 0; + move16(); + set8_fx( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); + st_ivas->hQMetaData->numTwoDirBands = (UWord8) st_ivas->hQMetaData->q_direction[0].cfg.nbands; + move16(); + } + + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0, 1 ); + } + + FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, res_dec ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + st_ivas->nCPE_old = st_ivas->nCPE; + move16(); + { + Word16 n_all = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + st_ivas->nCPE = shr( add( n_all, 1 ), 1 ); + } + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + } + + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &tmp_br, &tmp32, 0 ); + tmp_br = L_shl( tmp_br, CPE_CHANNELS_LOG2 ); + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, tmp_br ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* create CPE element for DFT Stereo like upmix */ + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &tmp_br, &tmp32, 0 ); + test(); + IF( st_ivas->sba_dirac_stereo_flag && st_ivas->nCPE == 0 ) + { + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, tmp_br ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + } + + IF( GT_16( st_ivas->nCPE, 1 ) ) + { + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_osba_data_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /* set CNA/CNG flags */ + ivas_sba_set_cna_cng_flag( st_ivas ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + st_ivas->ism_extmeta_active = -1; + move16(); + st_ivas->ism_extmeta_cnt = 0; + move16(); + + IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + k = 0; + move16(); + ism_total_brate = 0; + move32(); + + WHILE( ( k < SIZE_IVAS_BRATE_TBL ) && ( ivas_total_brate != ivas_brate_tbl[k] ) ) + { + k = add( k, 1 ); + } + + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + /* one separated object */ + st_ivas->nSCE = 1; + move16(); + ism_total_brate = sep_object_brate[k - 2][0]; + move32(); + + IF( NE_32( ( error = create_sce_dec( st_ivas, 0, ism_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[0]->hCoreCoder[0] ); + + IF( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + Word32 temp_brate[MAX_SCE]; + st_ivas->nSCE = st_ivas->nchan_ism; /* number of objects */ + move16(); + FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + temp_brate[sce_id] = sep_object_brate[k - 2][st_ivas->nSCE - 1]; + move32(); + ism_total_brate = L_add( ism_total_brate, temp_brate[sce_id] ); + + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, temp_brate[sce_id] ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_omasa_data_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( NE_32( ( error = create_cpe_dec( st_ivas, 0, ivas_total_brate - ism_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[0]->hCoreCoder[n] ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) + { + IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) + { + /* init EFAP for custom LS setup */ + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels_fx( ivas_mc_map_output_config_to_mc_ls_setup_fx( st_ivas->transport_config ) ); + move16(); + st_ivas->nSCE = 0; + move16(); + st_ivas->nCPE = shr( st_ivas->nchan_transport, 1 ); + move16(); + st_ivas->nCPE_old = 0; + move16(); + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + + iDiv_and_mod_32( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &tmp_br, &tmp32, 0 ); + tmp_br = L_shl( tmp_br, CPE_CHANNELS_LOG2 ); + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, tmp_br ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) + { + /* init EFAP for custom LS setup */ + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + st_ivas->nSCE = 0; + move16(); + st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS >> 1; + move16(); + st_ivas->nCPE_old = 0; + move16(); + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + move16(); + + IF( NE_32( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + + iDiv_and_mod_32( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &tmp_br, &tmp32, 0 ); + tmp_br = L_shl( tmp_br, CPE_CHANNELS_LOG2 ); + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, tmp_br ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) + { + /* init EFAP for custom LS setup */ + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + IF( NE_32( ( error = ivas_param_mc_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->hParamMC->proto_matrix_int_e = 0; + move16(); + + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &tmp_br, &tmp32, 0 ); + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, tmp_br ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + IF( GT_16( st_ivas->nCPE, 1 ) ) + { + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) + { + Word32 brate_sce, brate_cpe; + + ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); + + IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + move16(); + + test(); + IF( NE_32( st_ivas->renderer_type, RENDERER_DISABLE ) && NE_32( st_ivas->renderer_type, RENDERER_MCMASA_MONO_STEREO ) ) + { + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + test(); + test(); + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.separateChannelEnabled && !st_ivas->hLsSetupCustom->separate_ch_found ) + { + /* If no speaker matching the separated channel, compute panning gains for the separated channel. */ + IF( st_ivas->hVBAPdata == NULL ) + { + /* Distribute signal to all channels if VBAP is not properly initialized. */ + Word16 inv_sqr, sqr, exp = 15, exp_sqr; + move16(); + IF( EQ_16( st_ivas->hLsSetupCustom->num_spk, 1 ) ) + { + inv_sqr = 32767; // (1.0f in Q15)-1 + move16(); + } + ELSE + { + sqr = Sqrt16( st_ivas->hLsSetupCustom->num_spk, &exp ); + inv_sqr = BASOP_Util_Divide1616_Scale( 32767, sqr, &exp_sqr ); + exp_sqr = sub( exp_sqr, exp ); + IF( ( exp < 0 ) ) + { + inv_sqr = shr( inv_sqr, exp ); // exp_sqr + } + ELSE + { + inv_sqr = shl( inv_sqr, exp ); // exp_sqr + } + } + set16_fx( st_ivas->hLsSetupCustom->separate_ch_gains_fx, inv_sqr, st_ivas->hLsSetupCustom->num_spk ); + } + } + + ivas_mcmasa_split_brate_fx( st_ivas->hOutSetup.separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); + + FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, brate_sce ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; /* element_mode_init was IVAS_SCE for SCE initialization */ + move16(); + + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, brate_cpe ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* create CPE element for DFT Stereo like upmix */ + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &tmp_br, &tmp32, 0 ); + IF( st_ivas->sba_dirac_stereo_flag ) + { + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, tmp_br ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + } + + /* set CNA/CNG flags */ + test(); + test(); + IF( EQ_16( st_ivas->nchan_transport, 1 ) && ( ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) ) + { + st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; + move16(); + st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; + move16(); + } + } + } + + /*-----------------------------------------------------------------* + * Allocate and initialize HP20 filter memories + *-----------------------------------------------------------------*/ + + /* set number of output channels used for synthesis/decoding */ + n = getNumChanSynthesis( st_ivas ); + + IF( n > 0 ) + { + IF( ( st_ivas->mem_hp20_out_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + } + ELSE + { + st_ivas->mem_hp20_out_fx = NULL; + } + + FOR( i = 0; i < n; i++ ) + { + IF( ( st_ivas->mem_hp20_out_fx[i] = (Word32 *) malloc( ( L_HP20_MEM + 2 ) * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + set32_fx( st_ivas->mem_hp20_out_fx[i], 0, L_HP20_MEM + 2 ); + } + + /*-------------------------------------------------------------------* + * Allocate and initialize rendering handles + *--------------------------------------------------------------------*/ + + test(); + test(); + test(); + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + IF( NE_32( ( error = ivas_binRenderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + /* ParamISM is handled separately from other common config */ + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) && ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) ) + { + IF( NE_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) + { + IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, &( st_ivas->hHrtfParambin ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) + { + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + Word16 num_src; + IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + Word16 nchan_rend = num_src; + move16(); + test(); + IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; + if ( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + if ( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, output_Fs ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MC ) ) + { + IF( NE_32( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) + { + IF( NE_32( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) + { + test(); + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) && EQ_32( st_ivas->ivas_format, MC_FORMAT ) && ( hDecoderConfig->Opt_Headrotation || hDecoderConfig->Opt_ExternalOrientation || st_ivas->hCombinedOrientationData ) ) + { + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth_fx, st_ivas->hIntSetup.ls_elevation_fx, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + Word16 num_poses = 1; + move16(); + if ( st_ivas->hSplitBinRend != NULL ) + { + num_poses = st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; + move16(); + } + + IF( NE_32( ( error = ivas_rend_openCrend_fx( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, output_config, st_ivas->hRenderConfig, st_ivas->hHrtfCrend, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, 0, num_poses ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; + move32(); + } + + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + /* Allocate TD renderer for the objects in DISC mode */ + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + Word16 num_src; + + IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + + Word16 nchan_rend = num_src; + move16(); + test(); + if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; + if ( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, output_Fs ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /* Allocate memory for delay buffer within 'hMasaIsmData' */ + IF( NE_32( ( error = ivas_omasa_objects_delay_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && ( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) ) + { + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + IF( NE_32( ( error = ivas_omasa_objects_delay_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) + { + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + IF( NE_32( ( error = ivas_omasa_objects_delay_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( ( ( error = ivas_spat_hSpatParamRendCom_config_fx( &st_ivas->hSpatParamRendCom, DIRAC_OPEN, 0, st_ivas->ivas_format, st_ivas->mc_mode, output_Fs, 0, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_MIX_EXT ) ) + { + /* Allocate 'hIsmRendererData' handle */ + IF( ( ( error = ivas_omasa_combine_separate_ism_with_masa_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && + ( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) && + ( EQ_32( st_ivas->renderer_type, RENDERER_TD_PANNING ) || + EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) || + EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || + EQ_32( st_ivas->renderer_type, RENDERER_OSBA_STEREO ) || + EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || + EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) || + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) ) + { + IF( NE_32( ( error = ivas_ism_renderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + test(); + test(); + IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + /* Allocate TD renderer for the objects in DISC mode */ + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + Word16 num_src; + IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + Word16 nchan_rend = num_src; + move16(); + + test(); + if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; + if ( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, output_Fs ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + } + + /*-----------------------------------------------------------------* + * CLDFB handles for rendering + *-----------------------------------------------------------------*/ + + ivas_init_dec_get_num_cldfb_instances_fx( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); + + FOR( i = 0; i < numCldfbAnalyses; i++ ) + { + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + FOR( ; i < MAX_INTERN_CHANNELS; i++ ) + { + st_ivas->cldfbAnaDec[i] = NULL; + } + + FOR( i = 0; i < numCldfbSyntheses; i++ ) + { + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + FOR( ; i < MAX_OUTPUT_CHANNELS; i++ ) + { + st_ivas->cldfbSynDec[i] = NULL; + } + + /* CLDFB Interpolation weights */ + test(); + test(); + test(); + IF( ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && !st_ivas->sba_dirac_stereo_flag && NE_16( hDecoderConfig->nchan_out, 1 ) ) + { + Word16 Q_cldfbSynDec = Q11; + move16(); + ivas_spar_get_cldfb_gains_fx( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); + + FOR( i = 0; i < st_ivas->cldfbAnaDec[0]->cldfb_state_length; i++ ) + { + st_ivas->cldfbAnaDec[0]->cldfb_state_fx[i] = L_shr( st_ivas->cldfbAnaDec[0]->cldfb_state_fx[i], 16 ); // Scaling down from 27 to 11 + move32(); + } + st_ivas->cldfbAnaDec[0]->Q_cldfb_state = Q11; + move16(); + FOR( i = 0; i < st_ivas->cldfbSynDec[0]->cldfb_state_length; i++ ) + { + st_ivas->cldfbSynDec[0]->cldfb_state_fx[i] = L_shr( st_ivas->cldfbSynDec[0]->cldfb_state_fx[i], sub( 21, Q_cldfbSynDec ) ); // Scaling down from 21 to Q_cldfbSynDec + move32(); + } + st_ivas->cldfbSynDec[0]->Q_cldfb_state = Q11; + move16(); + } + + /*-----------------------------------------------------------------* + * LFE handles for rendering after rendering to adjust LFE delay to + * filter delay + *-----------------------------------------------------------------*/ + + test(); + IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) || EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) + { + IF( NE_16( st_ivas->hIntSetup.index_lfe[0], -1 ) ) + { + delay_ns = st_ivas->binaural_latency_ns; + } + ELSE + { + delay_ns = 0; + } + move32(); + IF( st_ivas->hBinRenderer != NULL ) + { + IF( st_ivas->hBinRenderer->render_lfe ) + { + IF( NE_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + /* Account for filterbank delay */ + delay_ns = L_add( delay_ns, IVAS_FB_DEC_DELAY_NS ); + } + } + ELSE + { + delay_ns = 0; + move32(); + } + } + ELSE + { + IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) && ( st_ivas->cldfbSynDec[0] != NULL ) ) + { + delay_ns = L_add( delay_ns, IVAS_FB_DEC_DELAY_NS ); + } + } + + IF( NE_32( ( error = ivas_create_lfe_dec_fx( &st_ivas->hLFE, output_Fs, delay_ns ) ), IVAS_ERR_OK ) ) + { + return error; + } + + set32_fx( st_ivas->hLFE->prevsynth_buf_fx, 0, LFE_PLC_BUFLEN ); + set32_fx( st_ivas->hLFE->prior_out_buffer_fx, 0, L_FRAME48k ); + } + + /*-----------------------------------------------------------------* + * Allocate and initialize limiter struct + *-----------------------------------------------------------------*/ + + IF( NE_32( ( error = ivas_limiter_open_fx( &st_ivas->hLimiter, hDecoderConfig->nchan_out, output_Fs ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /*-----------------------------------------------------------------* + * Allocate and initialize JBM struct + buffer + *-----------------------------------------------------------------*/ + + IF( st_ivas->hTcBuffer == NULL ) + { + /* no module has yet open the TC buffer, open a default one */ + granularity = ivas_jbm_dec_get_render_granularity_fx( st_ivas->renderer_type, ivas_renderer_secondary_select_fx( st_ivas ), output_Fs ); + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); + + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, ivas_jbm_dec_get_tc_buffer_mode_fx( st_ivas ), n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + test(); + test(); + IF( ( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) && hDecoderConfig->Opt_tsm ) + { + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + IF( NE_32( ( error = ivas_jbm_dec_metadata_open( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + + /*-----------------------------------------------------------------* + * Allocate output audio buffers + *-----------------------------------------------------------------*/ + + nchan_out_buff = ivas_get_nchan_buffers_dec_fx( st_ivas, st_ivas->sba_analysis_order, ivas_total_brate ); + IF( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff, hDecoderConfig->Opt_tsm, st_ivas->hTcBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + + return error; +} + + +/*------------------------------------------------------------------------- + * destroy_core_dec() + * + * Close core decoder handles + *-------------------------------------------------------------------------*/ + +void destroy_core_dec_fx( + DEC_CORE_HANDLE hCoreCoder /* i/o: core decoder structure */ +) +{ + destroy_cldfb_decoder_fx( hCoreCoder ); + + IF( hCoreCoder->hGSCDec != NULL ) + { + free( hCoreCoder->hGSCDec ); + hCoreCoder->hGSCDec = NULL; + } + + IF( hCoreCoder->hPFstat != NULL ) + { + free( hCoreCoder->hPFstat ); + hCoreCoder->hPFstat = NULL; + } + + IF( hCoreCoder->hMusicPF != NULL ) + { + free( hCoreCoder->hMusicPF ); + hCoreCoder->hMusicPF = NULL; + } + + IF( hCoreCoder->hBPF != NULL ) + { + free( hCoreCoder->hBPF ); + hCoreCoder->hBPF = NULL; + } + + IF( hCoreCoder->hBWE_zero != NULL ) + { + free( hCoreCoder->hBWE_zero ); + hCoreCoder->hBWE_zero = NULL; + } + + IF( hCoreCoder->hTdCngDec != NULL ) + { + free( hCoreCoder->hTdCngDec ); + hCoreCoder->hTdCngDec = NULL; + } + + IF( hCoreCoder->hSC_VBR != NULL ) + { + free( hCoreCoder->hSC_VBR ); + hCoreCoder->hSC_VBR = NULL; + } + + IF( hCoreCoder->hAmrwb_IO != NULL ) + { + free( hCoreCoder->hAmrwb_IO ); + hCoreCoder->hAmrwb_IO = NULL; + } + + IF( hCoreCoder->hBWE_TD != NULL ) + { + free( hCoreCoder->hBWE_TD ); + hCoreCoder->hBWE_TD = NULL; + } + + IF( hCoreCoder->hBWE_FD != NULL ) + { + free( hCoreCoder->hBWE_FD ); + hCoreCoder->hBWE_FD = NULL; + } + + IF( hCoreCoder->hBWE_FD_HR != NULL ) + { + free( hCoreCoder->hBWE_FD_HR ); + hCoreCoder->hBWE_FD_HR = NULL; + } + + IF( hCoreCoder->hWIDec != NULL ) + { + free( hCoreCoder->hWIDec ); + hCoreCoder->hWIDec = NULL; + } + + IF( hCoreCoder->hTECDec != NULL ) + { + free( hCoreCoder->hTECDec ); + hCoreCoder->hTECDec = NULL; + } + + IF( hCoreCoder->hTcxLtpDec != NULL ) + { + free( hCoreCoder->hTcxLtpDec ); + hCoreCoder->hTcxLtpDec = NULL; + } + + IF( hCoreCoder->hTcxDec != NULL ) + { + free( hCoreCoder->hTcxDec ); + hCoreCoder->hTcxDec = NULL; + } + + IF( hCoreCoder->hTcxCfg != NULL ) + { + free( hCoreCoder->hTcxCfg ); + hCoreCoder->hTcxCfg = NULL; + } + + IF( hCoreCoder->hTonalMDCTConc != NULL ) + { + free( hCoreCoder->hTonalMDCTConc ); + hCoreCoder->hTonalMDCTConc = NULL; + } + + IF( hCoreCoder->hIGFDec != NULL ) + { + free( hCoreCoder->hIGFDec ); + hCoreCoder->hIGFDec = NULL; + } + + IF( hCoreCoder->hPlcInfo != NULL ) + { + free( hCoreCoder->hPlcInfo ); + hCoreCoder->hPlcInfo = NULL; + } + + IF( hCoreCoder->hHQ_core != NULL ) + { + free( hCoreCoder->hHQ_core ); + hCoreCoder->hHQ_core = NULL; + } + + IF( hCoreCoder->hHQ_nbfec != NULL ) + { + free( hCoreCoder->hHQ_nbfec ); + hCoreCoder->hHQ_nbfec = NULL; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_initialize_handles_dec() + * + * NULL initialization of handles + *-------------------------------------------------------------------------*/ + +void ivas_initialize_handles_dec( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 i; + + FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + st_ivas->cldfbAnaDec[i] = NULL; + } + + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + st_ivas->cldfbSynDec[i] = NULL; + } + + /* SCE handles */ + FOR( i = 0; i < MAX_SCE; i++ ) + { + st_ivas->hSCE[i] = NULL; + } + + /* CPE handles */ + FOR( i = 0; i < MAX_CPE; i++ ) + { + st_ivas->hCPE[i] = NULL; + } + + st_ivas->bit_stream = NULL; + st_ivas->mem_hp20_out_fx = NULL; + st_ivas->hLimiter = NULL; + + /* ISM metadata handles */ + FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { + st_ivas->hIsmMetaData[i] = NULL; + } + + /* spatial coding handles */ + st_ivas->hDirAC = NULL; + st_ivas->hParamIsmDec = NULL; + st_ivas->hSpar = NULL; + st_ivas->hMasa = NULL; + st_ivas->hQMetaData = NULL; + st_ivas->hMCT = NULL; + st_ivas->hMCParamUpmix = NULL; + st_ivas->hParamMC = NULL; + st_ivas->hLFE = NULL; + + /* rendering handles */ + st_ivas->hBinRenderer = NULL; + for ( i = 0; i < MAX_HEAD_ROT_POSES; i++ ) + { + st_ivas->hDiracDecBin[i] = NULL; + } + st_ivas->hDirACRend = NULL; + st_ivas->hSpatParamRendCom = NULL; + st_ivas->hLsSetUpConversion = NULL; + st_ivas->hEFAPdata = NULL; + st_ivas->hVBAPdata = NULL; + st_ivas->hIsmRendererData = NULL; + st_ivas->hBinRendererTd = NULL; + st_ivas->hMonoDmxRenderer = NULL; + st_ivas->hCrendWrapper = NULL; + st_ivas->hReverb = NULL; + st_ivas->hHrtfCrend = NULL; + st_ivas->hHrtfFastConv = NULL; + st_ivas->hHrtfParambin = NULL; + st_ivas->hHrtfStatistics = NULL; + st_ivas->hoa_dec_mtx = NULL; + st_ivas->hMasaIsmData = NULL; + st_ivas->hSbaIsmData = NULL; + + st_ivas->hHeadTrackData = NULL; + st_ivas->hHrtfTD = NULL; + st_ivas->hLsSetupCustom = NULL; + st_ivas->hRenderConfig = NULL; + st_ivas->hExtOrientationData = NULL; + st_ivas->hCombinedOrientationData = NULL; + st_ivas->acousticEnvironmentsCount = 0; + move16(); + st_ivas->pAcousticEnvironments = NULL; + + st_ivas->hSplitBinRend = NULL; + for ( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + st_ivas->hTdRendHandles[i] = NULL; + } + /* JBM handles */ + st_ivas->hTcBuffer = NULL; + st_ivas->hJbmMetadata = NULL; + + /* output audio buffers */ + FOR( i = 0; i < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; i++ ) + { + st_ivas->p_output_fx[i] = NULL; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_destroy_dec() + * + * Close IVAS decoder handles + *-------------------------------------------------------------------------*/ + +void ivas_destroy_dec_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + Word16 i; + + /* CLDFB handles */ + FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + IF( st_ivas->cldfbAnaDec[i] != NULL ) + { + deleteCldfb_fx( &( st_ivas->cldfbAnaDec[i] ) ); + } + } + + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + IF( st_ivas->cldfbSynDec[i] != NULL ) + { + deleteCldfb_fx( &( st_ivas->cldfbSynDec[i] ) ); + } + } + + /* SCE handles */ + FOR( i = 0; i < MAX_SCE; i++ ) + { + IF( st_ivas->hSCE[i] != NULL ) + { + destroy_sce_dec( st_ivas->hSCE[i] ); + st_ivas->hSCE[i] = NULL; + } + } + + /* CPE handles */ + FOR( i = 0; i < MAX_CPE; i++ ) + { + IF( st_ivas->hCPE[i] != NULL ) + { + /* set pointer to NULL as core coder already deallocated in destroy_sce_dec() */ + test(); + IF( st_ivas->sba_dirac_stereo_flag && EQ_16( st_ivas->nchan_transport, 1 ) ) + { + st_ivas->hCPE[i]->hCoreCoder[0] = NULL; + st_ivas->hCPE[i]->hCoreCoder[1] = NULL; + } + destroy_cpe_dec( st_ivas->hCPE[i] ); + st_ivas->hCPE[i] = NULL; + } + } + + /* HP20 filter handles */ + IF( st_ivas->mem_hp20_out_fx != NULL ) + { + FOR( i = 0; i < getNumChanSynthesis( st_ivas ); i++ ) + { + free( st_ivas->mem_hp20_out_fx[i] ); + st_ivas->mem_hp20_out_fx[i] = NULL; + } + free( st_ivas->mem_hp20_out_fx ); + st_ivas->mem_hp20_out_fx = NULL; + } + + /* ISM metadata handles */ + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + + /* ISM renderer handle */ + ivas_ism_renderer_close( &( st_ivas->hIsmRendererData ) ); + + /* DirAC handle */ + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + ivas_param_ism_dec_close_fx( &( st_ivas->hParamIsmDec ), &( st_ivas->hSpatParamRendCom ), st_ivas->hDecoderConfig->output_config ); + } + ELSE + { + ivas_dirac_rend_close_fx( &( st_ivas->hDirACRend ) ); + ivas_spat_hSpatParamRendCom_close_fx( &( st_ivas->hSpatParamRendCom ) ); + ivas_dirac_dec_close_fx( &( st_ivas->hDirAC ) ); + } + + /* SPAR handle */ + ivas_spar_dec_close_fx( &( st_ivas->hSpar ), st_ivas->hDecoderConfig->output_Fs, 0 ); + + /* HOA decoder matrix */ + IF( st_ivas->hoa_dec_mtx != NULL ) + { + free( st_ivas->hoa_dec_mtx ); + st_ivas->hoa_dec_mtx = NULL; + } + + /* MASA decoder structure */ + ivas_masa_dec_close_fx( &( st_ivas->hMasa ) ); + + /* Qmetadata handle */ + ivas_qmetadata_close_fx( &st_ivas->hQMetaData ); + + /* MCT handle */ + ivas_mct_dec_close( &st_ivas->hMCT ); + + /* LFE handle */ + ivas_lfe_dec_close_fx( &( st_ivas->hLFE ) ); + + /* Param-Upmix MC handle */ + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); + + /* Parametric MC handle */ + ivas_param_mc_dec_close_fx( &st_ivas->hParamMC ); + + /* EFAP handle */ + efap_free_data_fx( &st_ivas->hEFAPdata ); + + /* VBAP handle */ + vbap_free_data_fx( &( st_ivas->hVBAPdata ) ); + + /* Fastconv binaural renderer handle */ + ivas_binRenderer_close_fx( &st_ivas->hBinRenderer ); + + /* TD binaural renderer handles */ + for ( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + if ( st_ivas->hTdRendHandles[i] != NULL ) + { + st_ivas->hTdRendHandles[i]->HrFiltSet_p = NULL; + ivas_td_binaural_close_fx( &st_ivas->hTdRendHandles[i] ); + } + } + + /* Parametric binaural renderer handle */ + ivas_dirac_dec_close_binaural_data_fx( st_ivas->hDiracDecBin ); + + /* Crend handle */ + ivas_rend_closeCrend_fx( &( st_ivas->hCrendWrapper ) ); + + /* Reverb handle */ + ivas_reverb_close_fx( &st_ivas->hReverb ); + + /* LS config converter handle */ + ivas_ls_setup_conversion_close_fx( &st_ivas->hLsSetUpConversion ); + + /* Custom LS configuration handle */ + IF( st_ivas->hLsSetupCustom != NULL ) + { + free( st_ivas->hLsSetupCustom ); + st_ivas->hLsSetupCustom = NULL; + } + + /* Mono downmix structure */ + ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); + + /* OSBA structure */ + ivas_osba_data_close_fx( &st_ivas->hSbaIsmData ); + + /* OMASA structure */ + ivas_omasa_data_close_fx( &st_ivas->hMasaIsmData ); + + /* Head track data handle */ + ivas_headTrack_close_fx( &st_ivas->hHeadTrackData ); + + /* External orientation data handle */ + ivas_external_orientation_close_fx( &st_ivas->hExtOrientationData ); + + /* Combined orientation data handle */ + ivas_combined_orientation_close_fx( &st_ivas->hCombinedOrientationData ); + + /* Time Domain binaural renderer handle */ + IF( st_ivas->hBinRendererTd != NULL ) + { + ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); + } + + IF( st_ivas->hHrtfTD != NULL ) + { + BSplineModelEvalDealloc_fx( &st_ivas->hHrtfTD->ModelParams, &st_ivas->hHrtfTD->ModelEval ); + + ivas_HRTF_binary_close_fx( &st_ivas->hHrtfTD ); + } + + /* CRend binaural renderer handle */ + ivas_HRTF_CRend_binary_close_fx( &st_ivas->hHrtfCrend ); + + /* Fastconv HRTF memories */ + ivas_binaural_hrtf_close_fx( &st_ivas->hHrtfFastConv ); + + /* Fastconv HRTF filters */ + ivas_HRTF_fastconv_binary_close_fx( &st_ivas->hHrtfFastConv ); + + /* Parametric binauralizer HRTF filters */ + ivas_HRTF_parambin_binary_close_fx( &st_ivas->hHrtfParambin ); + + /* HRTF statistics */ + ivas_HRTF_statistics_close_fx( &st_ivas->hHrtfStatistics ); + + /* Config. Renderer */ + ivas_render_config_close_fx( &( st_ivas->hRenderConfig ) ); + + /* Acoustic environments */ + IF( st_ivas->pAcousticEnvironments != NULL ) + { + free( st_ivas->pAcousticEnvironments ); + st_ivas->pAcousticEnvironments = NULL; + } + + /* Limiter struct */ + ivas_limiter_close_fx( &( st_ivas->hLimiter ) ); + + /* Decoder configuration structure */ + IF( st_ivas->hDecoderConfig != NULL ) + { + free( st_ivas->hDecoderConfig ); + st_ivas->hDecoderConfig = NULL; + } + + /* JBM TC buffer structure */ + ivas_jbm_dec_tc_buffer_close_fx( &st_ivas->hTcBuffer ); + + IF( st_ivas->hJbmMetadata != NULL ) + { + free( st_ivas->hJbmMetadata ); + st_ivas->hJbmMetadata = NULL; + } + + /* output audio buffers */ + FOR( i = 0; i < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; i++ ) + { + st_ivas->p_output_fx[i] = NULL; + } + + /* main IVAS handle */ + free( st_ivas ); + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_init_dec_get_num_cldfb_instances() + * + * Return number of CLDFB analysis & synthesis instances + *-------------------------------------------------------------------*/ + +/*! r: number of cldfb instances */ +void ivas_init_dec_get_num_cldfb_instances_fx( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ Word16 *numCldfbAnalyses, /* o : number of needed CLDFB analysis instances */ Word16 *numCldfbSyntheses /* o : number of needed CLDFB synthesis instances */ ) { IVAS_FORMAT ivas_format; + *numCldfbAnalyses = st_ivas->nchan_transport; move16(); *numCldfbSyntheses = st_ivas->hDecoderConfig->nchan_out; move16(); - ivas_format = st_ivas->ivas_format; - move32(); test(); - IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_MODE_NONE ) ) + IF( ( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_NONE ) ) ) + { + ivas_format = SBA_FORMAT; + move32(); + } + ELSE { - ivas_format = SBA_FORMAT; /* treat ISM_SBA_MODE_NONE just like SBA_FORMAT */ + ivas_format = st_ivas->ivas_format; move32(); } @@ -30,8 +3656,9 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); move16(); } + test(); - IF( EQ_16( st_ivas->mc_mode, MC_MODE_MCMASA ) && st_ivas->hOutSetup.separateChannelEnabled ) + IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) && st_ivas->hOutSetup.separateChannelEnabled ) { *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); move16(); @@ -60,7 +3687,7 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( move16(); } } - IF( st_ivas->hDiracDecBin->useTdDecorr ) + IF( st_ivas->hDiracDecBin[0]->useTdDecorr ) { *numCldfbAnalyses = add( *numCldfbAnalyses, 2 ); move16(); @@ -84,6 +3711,7 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( { *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; move16(); + test(); IF( st_ivas->hOutSetup.is_loudspeaker_setup && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) { @@ -185,7 +3813,6 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; move16(); } - test(); IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { @@ -234,6 +3861,17 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( move16(); } BREAK; + case RENDERER_OMASA_OBJECT_EXT: + *numCldfbAnalyses = st_ivas->nchan_transport; + *numCldfbSyntheses = st_ivas->hDecoderConfig->nchan_out; + move16(); + move16(); + BREAK; + case RENDERER_OMASA_MIX_EXT: + *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + *numCldfbSyntheses = 0; + move16(); + BREAK; default: assert( 0 && "Renderer not handled for CLDFB reservation." ); } @@ -260,3 +3898,134 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( return; } + + +/*---------------------------------------------------------------------* + * doSanityChecks_IVAS() + * + * Sanity checks - verify if the decoder set-up parameters are + * not in conflict with the IVAS format + *---------------------------------------------------------------------*/ + +static ivas_error doSanityChecks_IVAS( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word32 output_Fs; + AUDIO_CONFIG output_config; + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + move32(); + output_config = st_ivas->hDecoderConfig->output_config; + move32(); + + /*-----------------------------------------------------------------* + * Sanity checks + *-----------------------------------------------------------------*/ + + IF( EQ_32( output_Fs, 8000 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz output sampling rate is not supported in IVAS." ); + } + + assert( st_ivas->ivas_format != UNDEFINED_FORMAT && "\n IVAS format undefined" ); + assert( st_ivas->ivas_format != MONO_FORMAT && "\n Wrong IVAS format: MONO" ); + + /* Verify output configuration compatible with non-diegetic panning */ + test(); + test(); + IF( st_ivas->hDecoderConfig->Opt_non_diegetic_pan && NE_32( st_ivas->ivas_format, MONO_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_ISM1 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Error: Non-diegetic panning not supported in this IVAS format" ); + } + + test(); + test(); + test(); + test(); + test(); + test(); + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) || + EQ_32( output_config, IVAS_AUDIO_CONFIG_ISM1 ) || + EQ_32( output_config, IVAS_AUDIO_CONFIG_ISM2 ) || + EQ_32( output_config, IVAS_AUDIO_CONFIG_ISM3 ) || + EQ_32( output_config, IVAS_AUDIO_CONFIG_ISM4 ) || + EQ_32( output_config, IVAS_AUDIO_CONFIG_MASA1 ) || + EQ_32( output_config, IVAS_AUDIO_CONFIG_MASA2 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified!" ); + } + test(); + test(); + IF( ( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) || EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) && + ( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified!" ); + } + + + test(); + test(); + IF( ( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) && NE_32( output_Fs, 48000 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Error: Only 48kHz output sampling rate is supported for split rendering." ); + } + + IF( st_ivas->hDecoderConfig->Opt_Headrotation ) + { + test(); + test(); + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) + { + return IVAS_ERROR( IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, "Wrong set-up: Head-rotation not supported in this configuration" ); + } + } + + IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + test(); + test(); + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) + { + return IVAS_ERROR( IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED, "Wrong set-up: External orientation not supported in this configuration" ); + } + } + + IF( st_ivas->hDecoderConfig->Opt_dpid_on ) + { + test(); + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) + { + return IVAS_ERROR( IVAS_ERR_DIRECTIVITY_NOT_SUPPORTED, "Wrong set-up: Directivity is not supported in this output configuration." ); + } + } + + IF( st_ivas->hDecoderConfig->Opt_aeid_on ) + { + IF( NE_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + return IVAS_ERROR( IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED, "Wrong set-up: Acoustic environment is not supported in this output configuration." ); + } + } + + + IF( st_ivas->hDecoderConfig->Opt_ObjEdit_on ) + { + test(); + test(); + test(); + test(); + IF( !( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) || ( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && GT_16( st_ivas->nchan_ism, 0 ) ) ) ) + { + return IVAS_ERROR( IVAS_ERR_OBJECTS_EDITING_NOT_SUPPORTED, "Wrong set-up: Obect editing is not supported in this IVAS format." ); + } + } + + test(); + IF( st_ivas->hDecoderConfig->Opt_ObjEdit_on && st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) + { + return IVAS_ERROR( IVAS_ERR_OBJECTS_EDITING_AND_PANNING_NOT_SUPPORTED, "Wrong set-up: Only object editing or Non-diegetic panning can be used." ); + } + + return IVAS_ERR_OK; +} diff --git a/lib_dec/ivas_ism_dec_fx.c b/lib_dec/ivas_ism_dec_fx.c index 44b7a0bec5dfe408646524dee28080d6ea6c77c9..4537b384078329dd47d40a02b300be63b0232b09 100644 --- a/lib_dec/ivas_ism_dec_fx.c +++ b/lib_dec/ivas_ism_dec_fx.c @@ -48,9 +48,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word16 nchan_transport_old, /* i : last number of transport channels */ - const ISM_MODE last_ism_mode, /* i : last ISM mode */ - UWord16 *nSamplesRendered, /* o : number of samples rendered */ - Word16 *data /* o : output synthesis signal Q0*/ + const ISM_MODE last_ism_mode /* i : last ISM mode */ ) { ivas_error error; @@ -61,13 +59,8 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( Word16 tc_nchan_tc_new; Word16 tc_nchan_allocate_new; Word16 tc_granularity_new; - Word16 nchan_out_buff, nchan_out_buff_old; - AUDIO_CONFIG intern_config_old; - IVAS_OUTPUT_SETUP hIntSetupOld; - RENDERER_TYPE renderer_type_old; + Word16 nchan_out_buff; - error = IVAS_ERR_OK; - move32(); nCPE_old = st_ivas->nCPE; move16(); nSCE_old = st_ivas->nSCE; @@ -78,10 +71,9 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( move16(); st_ivas->ism_mode = last_ism_mode; move16(); - ivas_init_dec_get_num_cldfb_instances_ivas_fx( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); + ivas_init_dec_get_num_cldfb_instances_fx( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); st_ivas->ism_mode = ism_mode; move16(); - nchan_out_buff_old = ivas_get_nchan_buffers_dec_ivas_fx( st_ivas, -1, -1 ); IF( NE_32( ( error = ivas_ism_config_fx( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 0 ) ), IVAS_ERR_OK ) ) { @@ -109,21 +101,12 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( /*-----------------------------------------------------------------* * HP20 memories *-----------------------------------------------------------------*/ + IF( NE_32( ( error = ivas_hp20_dec_reconfig_fx( st_ivas, nchan_transport_old ) ), IVAS_ERR_OK ) ) { return error; } - /* save old IntSetup, might be needed for JBM flushing...*/ - intern_config_old = st_ivas->intern_config; - move32(); - hIntSetupOld = st_ivas->hIntSetup; - move32(); - tc_granularity_new = 1; - move16(); - renderer_type_old = st_ivas->renderer_type; - move32(); - /*-----------------------------------------------------------------* * Initialize the needed renderer struct and destroy the unnecessary renderer struct *-----------------------------------------------------------------*/ @@ -139,42 +122,37 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->hDecoderConfig->output_config ); } + test(); + test(); + /* transfer subframe info from DirAC or ParamMC to central tc buffer */ + /* only do this if we are not having done everything already in the TC decoding part and having only played out from the TC buffer */ + IF( EQ_32( last_ism_mode, ISM_MODE_PARAM ) && st_ivas->hSpatParamRendCom != NULL && NE_32( st_ivas->hTcBuffer->tc_buffer_mode, TC_BUFFER_MODE_BUFFER ) ) { - test(); - test(); - test(); - /* transfer subframe info from DirAC or ParamMC to central tc buffer */ - IF( EQ_32( last_ism_mode, ISM_MODE_PARAM ) && st_ivas->hSpatParamRendCom != NULL && ( NE_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) && NE_32( st_ivas->renderer_type, RENDERER_DISABLE ) ) ) - { - st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; - move16(); - st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; - move16(); - st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; - move16(); - st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; - move16(); - Copy( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); - } + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; + move16(); + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; + move16(); + st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; + move16(); + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; + move16(); + Copy( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } - /* JBM: when granularity goes down (e.g. Discrete ISM with TD Obj Renderer -> ParamISM with binaural fastconv - render what still fits in the new granularity */ - tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->hDecoderConfig->output_Fs ); + /* JBM: when granularity goes down (e.g. Discrete ISM with TD Obj Renderer -> ParamISM with binaural fastconv + render what still fits in the new granularity */ + tc_granularity_new = ivas_jbm_dec_get_render_granularity_fx( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs ); - IF( LT_16( tc_granularity_new, st_ivas->hTcBuffer->n_samples_granularity ) ) - { - IF( NE_32( ( error = ivas_jbm_dec_flush_renderer_fx( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, MC_MODE_NONE, last_ism_mode, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - /* JBM: when granularity goes up set samples to discard at the beginning of the frame */ - ELSE IF( GT_16( tc_granularity_new, st_ivas->hTcBuffer->n_samples_granularity ) ) + IF( LT_16( tc_granularity_new, st_ivas->hTcBuffer->n_samples_granularity ) ) + { + /* flush already done in IVAS_DEC_ReadFormat() */ + } + /* JBM: when granularity goes up set samples to discard at the beginning of the frame */ + ELSE IF( GT_16( tc_granularity_new, st_ivas->hTcBuffer->n_samples_granularity ) ) + { + IF( NE_32( ( error = ivas_jbm_dec_set_discard_samples_fx( st_ivas ) ), IVAS_ERR_OK ) ) { - IF( NE_32( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } + return error; } } @@ -196,10 +174,13 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( ivas_param_ism_dec_close_fx( &( st_ivas->hParamIsmDec ), &( st_ivas->hSpatParamRendCom ), st_ivas->hDecoderConfig->output_config ); test(); - IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { /* close the parametric binaural renderer */ - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); + ivas_dirac_dec_close_binaural_data_fx( st_ivas->hDiracDecBin ); + /* Close omasa data struct (used for object editing) */ + ivas_omasa_data_close_fx( &st_ivas->hMasaIsmData ); + /* Open the TD Binaural renderer */ test(); IF( st_ivas->hHrtfTD == NULL || st_ivas->hBinRendererTd == NULL ) @@ -210,9 +191,9 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( { return error; } - IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { - IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) { return error; } @@ -232,13 +213,14 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { /* close the parametric binaural renderer */ - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); + ivas_dirac_dec_close_binaural_data_fx( st_ivas->hDiracDecBin ); + + + /* Close omasa data struct (used for object editing) */ + ivas_omasa_data_close_fx( &st_ivas->hMasaIsmData ); /* Open Crend Binaural renderer */ - IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) - { - return error; - } + IF( NE_32( ( error = ivas_rend_openCrend_fx( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hHrtfCrend, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, 0, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; move32(); @@ -256,7 +238,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( } test(); - IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { /* open the parametric binaural renderer */ IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) @@ -264,21 +246,22 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( return error; } - IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, &( st_ivas->hHrtfParambin ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + /* Open omasa data struct (used for object editing) */ + IF( ( error = ivas_omasa_data_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { return error; } /* Close the TD Binaural renderer */ - IF( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) - { - ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); - st_ivas->hHrtfTD = NULL; + ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); - IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { - ivas_reverb_close( &st_ivas->hReverb ); - } + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + ivas_reverb_close_fx( &st_ivas->hReverb ); } } ELSE @@ -295,13 +278,18 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( return error; } - IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, &( st_ivas->hHrtfParambin ) ) ), IVAS_ERR_OK ) ) { return error; } + /* Open omasa data struct (used for object editing) */ + IF( ( error = ivas_omasa_data_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } /* close the crend binaural renderer */ - ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); + ivas_rend_closeCrend_fx( &( st_ivas->hCrendWrapper ) ); } } @@ -315,85 +303,72 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( } /*-----------------------------------------------------------------* - * floating-point output audio buffers + * JBM TC buffers *-----------------------------------------------------------------*/ + Word16 tc_nchan_full_new; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + + hTcBuffer = st_ivas->hTcBuffer; + tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode_fx( st_ivas ); + tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); + tc_nchan_allocate_new = tc_nchan_tc_new; + move16(); + tc_nchan_full_new = tc_nchan_tc_new; + move16(); + + test(); + test(); + test(); + test(); + if ( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) && ( NE_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) && NE_32( st_ivas->renderer_type, RENDERER_DISABLE ) && NE_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && NE_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) { - nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); + tc_nchan_full_new = 0; + move16(); + } - IF( NE_32( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff_old, nchan_out_buff ) ), IVAS_ERR_OK ) ) + /* reconfigure buffer */ + test(); + test(); + test(); + IF( NE_32( hTcBuffer->tc_buffer_mode, tc_buffer_mode_new ) || NE_16( hTcBuffer->nchan_transport_jbm, tc_nchan_tc_new ) || + NE_16( hTcBuffer->nchan_buffer_full, tc_nchan_full_new ) || NE_16( hTcBuffer->nchan_transport_internal, tc_nchan_allocate_new ) ) + { + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_reconfigure_fx( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ), IVAS_ERR_OK ) ) { return error; } } - /*-----------------------------------------------------------------* - * JBM TC buffers - *-----------------------------------------------------------------*/ + /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */ + IF( st_ivas->hSpatParamRendCom != NULL ) { - Word16 tc_nchan_full_new; - DECODER_TC_BUFFER_HANDLE hTcBuffer; - - hTcBuffer = st_ivas->hTcBuffer; - tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); - tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); - tc_nchan_allocate_new = tc_nchan_tc_new; + st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes; move16(); - tc_nchan_full_new = tc_nchan_tc_new; + st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + move16(); + st_ivas->hSpatParamRendCom->num_slots = st_ivas->hTcBuffer->num_slots; + move16(); + st_ivas->hSpatParamRendCom->slots_rendered = st_ivas->hTcBuffer->slots_rendered; move16(); - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) - { - tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; - move16(); - tc_nchan_full_new = tc_nchan_allocate_new; - move16(); - } - - test(); - test(); - test(); - test(); - if ( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) && ( NE_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) && NE_32( st_ivas->renderer_type, RENDERER_DISABLE ) && NE_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && NE_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) - { - tc_nchan_full_new = 0; - move16(); - } - - /* reconfigure buffer */ - test(); - test(); - test(); - IF( NE_32( hTcBuffer->tc_buffer_mode, tc_buffer_mode_new ) || NE_16( hTcBuffer->nchan_transport_jbm, tc_nchan_tc_new ) || - NE_16( hTcBuffer->nchan_buffer_full, tc_nchan_full_new ) || NE_16( hTcBuffer->nchan_transport_internal, tc_nchan_allocate_new ) ) - { - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_reconfigure_fx( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ), IVAS_ERR_OK ) ) - { - return error; - } - } + Copy( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } - /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */ - IF( st_ivas->hSpatParamRendCom != NULL ) - { - st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes; - move16(); - st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; - move16(); - st_ivas->hSpatParamRendCom->num_slots = st_ivas->hTcBuffer->num_slots; - move16(); - st_ivas->hSpatParamRendCom->slots_rendered = st_ivas->hTcBuffer->slots_rendered; - move16(); + /*-----------------------------------------------------------------* + * output audio buffers + *-----------------------------------------------------------------*/ - Copy( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); - } + nchan_out_buff = ivas_get_nchan_buffers_dec_fx( st_ivas, -1, -1 ); + IF( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff, st_ivas->hDecoderConfig->Opt_tsm, st_ivas->hTcBuffer ) ) != IVAS_ERR_OK ) + { + return error; } - return error; + return IVAS_ERR_OK; } + /*------------------------------------------------------------------------- * ivas_ism_dec_config() * @@ -402,18 +377,14 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( *-------------------------------------------------------------------------*/ ivas_error ivas_ism_dec_config_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const ISM_MODE last_ism_mode, /* i/o: last ISM mode */ - UWord16 *nSamplesRendered, /* o : number of samples flushed when the renderer granularity changes */ - Word16 *data /* o : output synthesis signal Q0*/ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const ISM_MODE last_ism_mode /* i/o: last ISM mode */ ) { Word32 ivas_total_brate; ivas_error error; Word16 nchan_transport_old; - error = IVAS_ERR_OK; - move32(); ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; move32(); /* Assumes that num of input objects are constant */ @@ -451,16 +422,12 @@ ivas_error ivas_ism_dec_config_fx( IF( st_ivas->ini_active_frame != 0 ) { /* ISM bit-rate switching */ + test(); + IF( ( NE_16( st_ivas->ism_mode, last_ism_mode ) ) || ( NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) ) { - test(); - IF( ( NE_16( st_ivas->ism_mode, last_ism_mode ) ) || ( NE_32( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) ) + IF( NE_16( ( error = ivas_ism_bitrate_switching_dec_fx( st_ivas, nchan_transport_old, last_ism_mode ) ), IVAS_ERR_OK ) ) { - IF( NE_16( ( error = ivas_ism_bitrate_switching_dec_fx( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, - data ) ), - IVAS_ERR_OK ) ) - { - return error; - } + return error; } } } @@ -483,9 +450,7 @@ ivas_error ivas_ism_dec_config_fx( /* ISM mode switching */ IF( NE_32( st_ivas->ism_mode, last_ism_mode ) ) { - IF( NE_16( ( error = ivas_ism_bitrate_switching_dec_fx( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, - data ) ), - IVAS_ERR_OK ) ) + IF( NE_16( ( error = ivas_ism_bitrate_switching_dec_fx( st_ivas, nchan_transport_old, last_ism_mode ) ), IVAS_ERR_OK ) ) { return error; } @@ -515,5 +480,6 @@ ivas_error ivas_ism_dec_config_fx( move32(); BREAK; } - return error; + + return IVAS_ERR_OK; } diff --git a/lib_dec/ivas_ism_dtx_dec_fx.c b/lib_dec/ivas_ism_dtx_dec_fx.c index 0f023a7efd080f499328b709895092c92b8c95fc..19d99a0bb1fe277e13efc6485f7230bb235ffcba 100644 --- a/lib_dec/ivas_ism_dtx_dec_fx.c +++ b/lib_dec/ivas_ism_dtx_dec_fx.c @@ -161,13 +161,15 @@ void ivas_ism_dtx_limit_noise_energy_for_near_silence_fx( ) { Word32 fac_fx, cng_noise_nrg_obj_fx, cng_noise_nrg_dominant_fx; - Word16 ch, cng_noise_level_len, Q_cng_noise_nrg_dominant, Q_fac; + Word16 ch, cng_noise_level_len, Q_cng_noise_nrg_dominant, exp; HANDLE_FD_CNG_COM hFdCngCom; + hFdCngCom = hSCE[sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom; cng_noise_level_len = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - Q_cng_noise_nrg_dominant = add( Q_cngNoiseLevel[sce_id_dtx], Q_cngNoiseLevel[sce_id_dtx] ); /*stores Q for cng_noise_nrg_dominant_fx*/ - cng_noise_nrg_dominant_fx = dotp_fixed_o( hFdCngCom->cngNoiseLevel, hFdCngCom->cngNoiseLevel, cng_noise_level_len, 9 /*log2(len(hFdCngCom->cngNoiseLevel))*/, &Q_cng_noise_nrg_dominant ); /*Resultant Q_cng_noise_nrg_dominant= (Q_cng_noise_nrg_dominant-x)<=31*/ - IF( LT_32( cng_noise_nrg_dominant_fx, L_shl_sat( 1, Q_cng_noise_nrg_dominant ) ) ) /*cng_noise_nrg_dominant<1.f*/ + Q_cng_noise_nrg_dominant = add( Q_cngNoiseLevel[sce_id_dtx], Q_cngNoiseLevel[sce_id_dtx] ); /*stores Q for cng_noise_nrg_dominant_fx*/ + cng_noise_nrg_dominant_fx = dotp_fx32_o( hFdCngCom->cngNoiseLevel, hFdCngCom->cngNoiseLevel, cng_noise_level_len, 9 /*log2(len(hFdCngCom->cngNoiseLevel))*/, &Q_cng_noise_nrg_dominant ); /*Resultant Q_cng_noise_nrg_dominant= (Q_cng_noise_nrg_dominant-x)<=31*/ + + IF( LT_32( cng_noise_nrg_dominant_fx, L_shl_sat( 1, Q_cng_noise_nrg_dominant ) ) ) /*cng_noise_nrg_dominant<1.f*/ { FOR( ch = 0; ch < nchan_transport; ch++ ) { @@ -177,21 +179,26 @@ void ivas_ism_dtx_limit_noise_energy_for_near_silence_fx( } hFdCngCom = hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom; cng_noise_level_len = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - Word16 Q_cng_noise_nrg_obj = add( Q_cngNoiseLevel[ch], Q_cngNoiseLevel[ch] ); /*Stores Q-factor of cng_noise_nrg_obj*/ - cng_noise_nrg_obj_fx = dotp_fixed_o( hFdCngCom->cngNoiseLevel, hFdCngCom->cngNoiseLevel, cng_noise_level_len, 9, &Q_cng_noise_nrg_obj ); /*Resultant Q_cng_noise_nrg_obj= (Q_cng_noise_nrg_obj-x)<=31*/ + Word16 Q_cng_noise_nrg_obj = add( Q_cngNoiseLevel[ch], Q_cngNoiseLevel[ch] ); /*Stores Q-factor of cng_noise_nrg_obj*/ + cng_noise_nrg_obj_fx = dotp_fx32_o( hFdCngCom->cngNoiseLevel, hFdCngCom->cngNoiseLevel, cng_noise_level_len, 9, &Q_cng_noise_nrg_obj ); /*Resultant Q_cng_noise_nrg_obj= (Q_cng_noise_nrg_obj-x)<=31*/ IF( GT_32( cng_noise_nrg_obj_fx, cng_noise_nrg_dominant_fx ) ) { - Word32 temp = divide3232( L_shr( cng_noise_nrg_dominant_fx, 1 ), cng_noise_nrg_obj_fx ); /*Stores value of cng_noise_nrg_dominant_fx/cng_noise_nrg_obj_fx*/ + Word32 temp = 0; + move32(); + IF( L_shr( cng_noise_nrg_dominant_fx, 1 ) ) + { + temp = divide3232( L_shr( cng_noise_nrg_dominant_fx, 1 ), cng_noise_nrg_obj_fx ); /*Stores value of cng_noise_nrg_dominant_fx/cng_noise_nrg_obj_fx*/ + } Word16 Q_temp = add( sub( sub( Q_cng_noise_nrg_dominant, 1 ), Q_cng_noise_nrg_obj ), 15 ); /*Stores resultant Q after divide3232 operation above*/ IF( EQ_16( Q_temp % 2, 1 ) ) /*Making Q_temp even for sqrt function*/ { Q_temp = sub( Q_temp, 1 ); temp = L_shr( temp, 1 ); } - fac_fx = getSqrtWord32( temp ); /*Resultant Q=Q_temp/2*/ - Q_fac = shr( Q_temp, 1 ); - v_multc_fixed( hFdCngCom->cngNoiseLevel, fac_fx, hFdCngCom->cngNoiseLevel, cng_noise_level_len ); /*Resultant Q of cngNoiseLevel is Q_cngNoiseLevel for ch*/ - scale_sig32( hFdCngCom->cngNoiseLevel, cng_noise_level_len, negate( sub( 31, Q_fac ) ) ); /*Restoring Q of hFdCngCom->cngNoiseLevel to Q_cngNoiseLevel */ + exp = sub( 31, Q_temp ); + fac_fx = Sqrt32( temp, &exp ); + v_multc_fx( hFdCngCom->cngNoiseLevel, fac_fx, hFdCngCom->cngNoiseLevel, cng_noise_level_len ); /*Resultant Q of cngNoiseLevel is Q_cngNoiseLevel for ch*/ + scale_sig32( hFdCngCom->cngNoiseLevel, cng_noise_level_len, exp ); /*Restoring Q of hFdCngCom->cngNoiseLevel to Q_cngNoiseLevel */ } } } diff --git a/lib_dec/ivas_ism_metadata_dec_fx.c b/lib_dec/ivas_ism_metadata_dec_fx.c index 3288903ab8f43b3b9cb00c03a44abb6b904cfbcc..a193cba2efce288879215194b4ab1c2b75272f97 100644 --- a/lib_dec/ivas_ism_metadata_dec_fx.c +++ b/lib_dec/ivas_ism_metadata_dec_fx.c @@ -30,12 +30,12 @@ *******************************************************************************************************/ +#include "move.h" #include #include "options.h" #include "ivas_cnst.h" #include "ivas_prot_fx.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" #include "prot_fx.h" #include "ivas_stat_enc.h" #include @@ -46,6 +46,7 @@ /*-----------------------------------------------------------------------* * Local functions *-----------------------------------------------------------------------*/ + static void decode_angle_indices_fx( DEC_CORE_HANDLE st0, ISM_METADATA_ANGLE_HANDLE angle, const Word16 non_diegetic_flag, Word16 *flag_abs_azimuth ); static Word16 decode_radius_fx( DEC_CORE_HANDLE st0, Word16 *last_radius_idx, Word16 *flag_abs_radius ); @@ -176,7 +177,7 @@ ivas_error ivas_ism_metadata_dec_fx( Word16 *ism_extmeta_cnt, /* i/o: Number of change frames observed */ DEC_CORE_HANDLE st0 ) /* i : core-coder handle */ { - Word16 ch, nb_bits_start = 0, last_bit_pos; + Word16 k, ch, nb_bits_start = 0, last_bit_pos; Word16 idx_radius; Word32 element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS]; Word16 ism_extmeta_bitstream; @@ -198,7 +199,6 @@ ivas_error ivas_ism_metadata_dec_fx( Word16 nbands, nblocks; Word16 md_diff_flag[MAX_NUM_OBJECTS]; ivas_error error; - Word32 res_dec, res_frac; move16(); push_wmops( "ism_meta_dec" ); @@ -208,8 +208,8 @@ ivas_error ivas_ism_metadata_dec_fx( move16(); nchan_transport_prev = *nchan_transport; move16(); - iDiv_and_mod_32( ism_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - last_bit_pos = extract_l( L_sub( res_dec, 1 ) ); + k = extract_l( Mpy_32_32_r( ism_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + last_bit_pos = sub( k, 1 ); bstr_orig = st0->bit_stream; next_bit_pos_orig = st0->next_bit_pos; move16(); @@ -781,6 +781,51 @@ ivas_error ivas_ism_metadata_dec_fx( } +/*-------------------------------------------------------------------* + * ivas_ism_reset_metadata_handle_dec() + * + * Reset ISM decoder metadata handle + *-------------------------------------------------------------------*/ + +void ivas_ism_reset_metadata_handle_dec_fx( + ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ +) +{ + hIsmMeta->last_ism_metadata_flag = 0; + move16(); + hIsmMeta->position_angle.last_angle1_idx = 0; + move16(); + hIsmMeta->position_angle.last_angle2_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); + move16(); + hIsmMeta->orientation_angle.last_angle1_idx = 0; + move16(); + hIsmMeta->orientation_angle.last_angle2_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); + move16(); + hIsmMeta->last_radius_idx = 8; /* Init to radius 1.0 */ + move16(); + + hIsmMeta->last_true_azimuth_fx = 0; + move32(); + hIsmMeta->last_true_elevation_fx = 0; + move32(); + hIsmMeta->last_azimuth_fx = 0; + move32(); + hIsmMeta->last_elevation_fx = 0; + move32(); + + hIsmMeta->ism_imp = -1; + move16(); + hIsmMeta->ism_md_null_flag = 0; + move16(); + hIsmMeta->ism_md_lowrate_flag = 0; + move16(); + + ivas_ism_reset_metadata( hIsmMeta ); + + return; +} + + /*------------------------------------------------------------------------- * ivas_ism_metadata_dec_create() * @@ -788,52 +833,36 @@ ivas_error ivas_ism_metadata_dec_fx( *-------------------------------------------------------------------------*/ ivas_error ivas_ism_metadata_dec_create_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 n_ISms, /* i : number of objects */ - Word32 element_brate_tmp[] /* o : element bitrate per object */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 n_ISms, /* i : number of separately coded objects */ + Word32 element_brate_tmp[] /* o : element bitrate per object */ ) { Word16 ch; ivas_error error; /* allocate ISM metadata handles */ - FOR( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) + FOR( ch = 0; ch < n_ISms; ch++ ) { - IF( ( st_ivas->hIsmMetaData[ch] = (ISM_METADATA_HANDLE) malloc( sizeof( ISM_METADATA_FRAME ) ) ) == NULL ) + IF( st_ivas->hIsmMetaData[ch] == NULL ) /* note: the handle can be allocated in OMASA bitrate switching from ISM_MASA_MODE_xxx_ONE_OBJ to ISM_MASA_MODE_DISC mode for 'ch==0' */ { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM MetaData\n" ) ); + IF( ( st_ivas->hIsmMetaData[ch] = (ISM_METADATA_HANDLE) malloc( sizeof( ISM_METADATA_FRAME ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM MetaData\n" ) ); + } } - st_ivas->hIsmMetaData[ch]->last_ism_metadata_flag = 0; - move16(); - st_ivas->hIsmMetaData[ch]->position_angle.last_angle1_idx = 0; - move16(); - st_ivas->hIsmMetaData[ch]->position_angle.last_angle2_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); - move16(); - st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle1_idx = 0; - move16(); - st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle2_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); - move16(); - st_ivas->hIsmMetaData[ch]->last_radius_idx = 8; /* Init to radius 1.0 */ - move16(); - - st_ivas->hIsmMetaData[ch]->last_true_azimuth_fx = 0; - move32(); - st_ivas->hIsmMetaData[ch]->last_true_elevation_fx = 0; - move32(); - st_ivas->hIsmMetaData[ch]->last_azimuth_fx = 0; - move32(); - st_ivas->hIsmMetaData[ch]->last_elevation_fx = 0; - move32(); - - st_ivas->hIsmMetaData[ch]->ism_imp = -1; - move16(); - st_ivas->hIsmMetaData[ch]->ism_md_null_flag = 0; - move16(); - st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = 0; - move16(); + ivas_ism_reset_metadata_handle_dec_fx( st_ivas->hIsmMetaData[ch] ); + } - ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); + /* sanity freeing - it can happen only in reconfiguration when a smaller number of handles than before is requested */ + FOR( ; ch < MAX_NUM_OBJECTS; ch++ ) + { + IF( st_ivas->hIsmMetaData[ch] != NULL ) + { + free( st_ivas->hIsmMetaData[ch] ); + st_ivas->hIsmMetaData[ch] = NULL; + } } IF( element_brate_tmp != NULL ) @@ -1219,21 +1248,32 @@ void ivas_ism_metadata_sid_dec_fx( { IF( EQ_16( ch, *sce_id_dtx ) ) { - hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx = 32767; // 1.0f in Q15 - move16(); + FOR( i = 0; i < MDCT_ST_DTX_NUM_COHERENCE_BANDS; i++ ) + { + hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx[i] = 32767; + } + CONTINUE; } idx = get_next_indice_fx( st0, nBits_coh ); - hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx = div_s( idx, sub( ( shl( 1, nBits_coh ) ), 1 ) ); // Q15 + hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx[0] = get_next_index_4_by_15[idx]; // Q15 move16(); + FOR( i = 1; i < MDCT_ST_DTX_NUM_COHERENCE_BANDS; i++ ) + { + hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx[i] = hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx[0]; + move16(); + } } } - if ( EQ_32( ism_mode, ISM_MODE_PARAM ) ) + IF( EQ_32( ism_mode, ISM_MODE_PARAM ) ) { - hSCE[*sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx = hSCE[!*sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx; - move16(); + FOR( i = 0; i < MDCT_ST_DTX_NUM_COHERENCE_BANDS; i++ ) + { + hSCE[*sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx[i] = hSCE[!*sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx[i]; + move16(); + } } /*----------------------------------------------------------------* @@ -1278,9 +1318,7 @@ void ivas_ism_metadata_sid_dec_fx( } /* take into account padding bits as metadata bits to keep later bitrate checks valid */ - Word32 res_dec, res_frac; - iDiv_and_mod_32( IVAS_SID_5k2 - SID_2k40, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - nb_bits_metadata[*sce_id_dtx] = (Word16) res_dec; + nb_bits_metadata[*sce_id_dtx] = extract_l( Mpy_32_32_r( IVAS_SID_5k2 - SID_2k40, ONE_BY_FRAMES_PER_SEC_Q31 ) ); move16(); /* set the bitstream pointer to its original position */ diff --git a/lib_dec/ivas_ism_param_dec_fx.c b/lib_dec/ivas_ism_param_dec_fx.c index c818af2378c9c4d4cde3f403614f4acfbac2ef7c..a342481a0ce8492aca79d7fe2bfdd4a66cfa32de 100644 --- a/lib_dec/ivas_ism_param_dec_fx.c +++ b/lib_dec/ivas_ism_param_dec_fx.c @@ -42,14 +42,21 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #include "debug.h" -#include "ivas_rom_com_fx.h" + + +/*-----------------------------------------------------------------------* + * Local function declarations + *-----------------------------------------------------------------------*/ + +static void ivas_ism_param_dec_tc_gain_adjust_fx( Decoder_Struct *st_ivas, const Word16 nSamples, const Word16 nFadeLength, Word32 *p_data_fx[], Word16 *q_data ); + /*-----------------------------------------------------------------------* * Local function definitions *-----------------------------------------------------------------------*/ static void ivas_param_ism_dec_dequant_DOA_fx( - PARAM_ISM_DEC_HANDLE hParamIsmDec, /* i/o: decoder ParamISM handle */ + PARAM_ISM_DEC_HANDLE hParamIsmDec, /* i/o: decoder ParamISM handle */ const Word16 nchan_ism /* i : number of ISM channels */ ) { @@ -72,6 +79,7 @@ static void ivas_param_ism_dec_dequant_DOA_fx( return; } + static void ivas_param_ism_dec_dequant_powrat_fx( PARAM_ISM_DEC_HANDLE hParamIsmDec /* i/o: decoder ParamISM handle */ ) @@ -167,6 +175,7 @@ static void ivas_ism_get_proto_matrix_fx( return; } + static void ivas_param_ism_collect_slot_fx( PARAM_ISM_DEC_HANDLE hParamIsmDec, /* i/o: decoder ParamISM handle */ Word32 *Cldfb_RealBuffer_in_fx, /*Q(31-exp_real)*/ @@ -183,7 +192,6 @@ static void ivas_param_ism_collect_slot_fx( Word16 exp_tmp; /* loop over parameter bands to collect transport channel energies */ - FOR( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) { brange[0] = hParamIsmDec->hParamIsm->band_grouping[band_idx]; @@ -210,6 +218,7 @@ static void ivas_param_ism_collect_slot_fx( move16(); } } + return; } @@ -391,6 +400,7 @@ static void ivas_param_ism_compute_mixing_matrix_fx( return; } + static void ivas_param_ism_render_slot_fx( PARAM_ISM_DEC_HANDLE hParamIsmDec, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, @@ -435,6 +445,7 @@ static void ivas_param_ism_render_slot_fx( } } } + FOR( bin_idx = 0; bin_idx < hSpatParamRendCom->num_freq_bands; bin_idx++ ) { /* smooth the mixing matrix */ @@ -511,9 +522,7 @@ static ivas_error ivas_param_ism_rendering_init_fx( { set32_fx( hParamIsmRendering->mixing_matrix_lin_old_fx[bin_idx], 0, PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX ); } -#ifdef MSAN_FIX set16_fx( hParamIsmRendering->exp_mixing_matrix_lin_old_fx, 0, CLDFB_NO_CHANNELS_MAX ); -#endif /* memory allocation for proto matrix and interpolator */ IF( ( hParamIsmRendering->proto_matrix_fx = (Word16 *) malloc( hOutSetup.nchan_out_woLFE * nchan_transport * sizeof( Word16 ) ) ) == NULL ) @@ -521,15 +530,15 @@ static ivas_error ivas_param_ism_rendering_init_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for proto matrix\n" ) ); } - IF( ( hParamIsmRendering->interpolator_fx = (Word16 *) malloc( subframe_nbslots * sizeof( Word16 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for interpolator\n" ) ); } + test(); test(); test(); - IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) { /* computation of proto matrix */ ivas_ism_get_proto_matrix_fx( hOutSetup, nchan_transport, hParamIsmRendering->proto_matrix_fx ); @@ -541,6 +550,7 @@ static ivas_error ivas_param_ism_rendering_init_fx( return IVAS_ERR_OK; } + static void ivas_param_ism_update_mixing_matrix_fx( PARAM_ISM_DEC_HANDLE hParamIsmDec, Word32 mixing_matrix_fx[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX], /*Q(31-mixing_matrix_exp)*/ @@ -582,11 +592,12 @@ static void ivas_param_ism_update_mixing_matrix_fx( * * Open Param ISM handle *-------------------------------------------------------------------------*/ + ivas_error ivas_param_ism_dec_open_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { - Word16 i; + Word16 i, granularity; PARAM_ISM_DEC_HANDLE hParamIsmDec; IVAS_OUTPUT_SETUP hOutSetup; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; @@ -627,6 +638,7 @@ ivas_error ivas_param_ism_dec_open_fx( move32(); output_config = st_ivas->hDecoderConfig->output_config; move32(); + ivas_param_ism_config_fx( hParamIsmDec->hParamIsm, st_ivas->nchan_ism ); // assuming Q14 for gains; /*-----------------------------------------------------------------* @@ -707,7 +719,7 @@ ivas_error ivas_param_ism_dec_open_fx( test(); test(); IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || - EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) + EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) { /* Initialize efap handle */ IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), hOutSetup.ls_azimuth_fx, hOutSetup.ls_elevation_fx, hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) @@ -730,7 +742,7 @@ ivas_error ivas_param_ism_dec_open_fx( test(); test(); - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { IF( NE_32( ( error = ivas_dirac_allocate_parameters_fx( hSpatParamRendCom, 1 ) ), IVAS_ERR_OK ) ) { @@ -749,6 +761,7 @@ ivas_error ivas_param_ism_dec_open_fx( st_ivas->hParamIsmDec = hParamIsmDec; st_ivas->hSpatParamRendCom = hSpatParamRendCom; + granularity = ivas_jbm_dec_get_render_granularity_fx( st_ivas->renderer_type, RENDERER_DISABLE, output_Fs ); test(); IF( NE_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) && NE_32( st_ivas->renderer_type, RENDERER_DISABLE ) ) @@ -795,8 +808,7 @@ ivas_error ivas_param_ism_dec_open_fx( IF( st_ivas->hTcBuffer == NULL ) { - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, nchan_full, NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ), IVAS_ERR_OK ) ) - + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, nchan_full, granularity ) ), IVAS_ERR_OK ) ) { return error; } @@ -809,8 +821,7 @@ ivas_error ivas_param_ism_dec_open_fx( IF( st_ivas->hTcBuffer == NULL ) { Word16 nchan_to_allocate = st_ivas->hDecoderConfig->nchan_out; - move16(); // NS2SA - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_BUFFER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_BUFFER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, granularity ) ), IVAS_ERR_OK ) ) { return error; } @@ -821,6 +832,7 @@ ivas_error ivas_param_ism_dec_open_fx( return error; } + /*-------------------------------------------------------------------------* * ivas_param_ism_dec_close() * @@ -905,6 +917,7 @@ void ivas_param_ism_dec_close_fx( * * *-------------------------------------------------------------------------*/ + void ivas_ism_dec_digest_tc_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) @@ -928,22 +941,24 @@ void ivas_ism_dec_digest_tc_fx( EQ_32( st_ivas->renderer_type, RENDERER_OSBA_STEREO ) || ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) && st_ivas->hDecoderConfig->Opt_Headrotation == 0 ) ) { - Word16 i, num_objects; - Word32 azimuth_fx, elevation_fx; + Word16 i; /* we have a full frame interpolator, adapt it */ /* for BE testing */ - Word32 res_dec, res_frac; - iDiv_and_mod_32( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - IF( EQ_32( extract_l( res_dec ), st_ivas->hTcBuffer->n_samples_available ) ) + i = extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + IF( EQ_16( i, st_ivas->hTcBuffer->n_samples_available ) ) { - Word16 interpolator_length = extract_l( res_dec ); + Word16 interpolator_length = i; + test(); + test(); + test(); test(); test(); IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || - EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || + ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) && EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) ) { st_ivas->hIsmRendererData->interpolator_fx[0] = 0; move16(); @@ -968,39 +983,49 @@ void ivas_ism_dec_digest_tc_fx( ivas_jbm_dec_get_adapted_linear_interpolator_fx( extract_l( Mpy_32_32( st_ivas->hDecoderConfig->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ), st_ivas->hTcBuffer->n_samples_available, st_ivas->hIsmRendererData->interpolator_fx ); move16(); } + st_ivas->hIsmRendererData->interp_offset_fx = 0; + move16(); /* also get the gains here */ - num_objects = st_ivas->nchan_transport; - move16(); - FOR( i = 0; i < num_objects; i++ ) + FOR( i = 0; i < st_ivas->nchan_ism; i++ ) { Copy32( st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hIsmRendererData->prev_gains_fx[i], MAX_OUTPUT_CHANNELS ); IF( EQ_32( st_ivas->intern_config, IVAS_AUDIO_CONFIG_STEREO ) ) { - Word16 gains_fx[2]; + Word16 gains_fx[CPE_CHANNELS]; + ivas_ism_get_stereo_gains_fx( (Word16) L_shr( st_ivas->hIsmMetaData[i]->azimuth_fx, 22 ), (Word16) L_shr( st_ivas->hIsmMetaData[i]->elevation_fx, 22 ), &gains_fx[0], &gains_fx[1] ); + st_ivas->hIsmRendererData->gains_fx[i][0] = L_shr( L_deposit_h( gains_fx[0] ), 1 ); // Q31 -> Q30 move32(); st_ivas->hIsmRendererData->gains_fx[i][1] = L_shr( L_deposit_h( gains_fx[1] ), 1 ); // Q31 -> Q30 move32(); + // TODO: Align Q values + IF( NE_32( st_ivas->hIsmMetaData[i]->edited_gain_fx, ONE_IN_Q29 ) ) + { + v_multc_fx( st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hIsmMetaData[i]->edited_gain_fx, st_ivas->hIsmRendererData->gains_fx[i], CPE_CHANNELS ); // Q30, Q29 --> Q28 + Scale_sig32( st_ivas->hIsmRendererData->gains_fx[i], CPE_CHANNELS, Q2 ); // Q28 --> Q30 + } } ELSE { - // TODO tmu review when #215 is resolved - azimuth_fx = L_shr( L_add( st_ivas->hIsmMetaData[i]->azimuth_fx, 2097152 ), Q22 ); // Q0 ,2097152 = .5f in Q22 - elevation_fx = L_shr( L_add( st_ivas->hIsmMetaData[i]->elevation_fx, 2097152 ), Q22 ); // Q0 ,2097152 = .5f in Q22 test(); test(); test(); test(); test(); + test(); + test(); + test(); IF( ( EQ_32( st_ivas->renderer_type, RENDERER_TD_PANNING ) || EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) || - EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) && + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) || + ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) && EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) ) && st_ivas->hCombinedOrientationData == NULL ) { + Word32 elevation_fx = st_ivas->hIsmMetaData[i]->edited_elevation_fx; if ( st_ivas->hIntSetup.is_planar_setup ) { /* If no elevation support in output format, then rendering should be done with zero elevation */ @@ -1010,9 +1035,15 @@ void ivas_ism_dec_digest_tc_fx( IF( st_ivas->hEFAPdata != NULL ) { - azimuth_fx = L_shl( azimuth_fx, Q22 ); // Q22 - elevation_fx = L_shl( elevation_fx, Q22 ); // Q22 - efap_determine_gains_fx( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], azimuth_fx, elevation_fx, EFAP_MODE_EFAP ); + + + efap_determine_gains_fx( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hIsmMetaData[i]->edited_azimuth_fx, elevation_fx, EFAP_MODE_EFAP ); + // TODO: align Q values properly + IF( NE_32( st_ivas->hIsmMetaData[i]->edited_gain_fx, ONE_IN_Q29 ) ) + { + v_multc_fx( st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hIsmMetaData[i]->edited_gain_fx, st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hEFAPdata->numSpk ); // Q30, Q29 --> Q28 + Scale_sig32( st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hEFAPdata->numSpk, Q2 ); // Q28 --> Q30 + } } } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || @@ -1020,9 +1051,17 @@ void ivas_ism_dec_digest_tc_fx( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) { /*get HOA gets for direction (ACN/SN3D)*/ - Word16 azi = shr( extract_h( st_ivas->hIsmMetaData[i]->azimuth_fx ), 22 - 16 ); // Q0 - Word16 ele = shr( extract_h( st_ivas->hIsmMetaData[i]->elevation_fx ), 22 - 16 ); // Q0 + Word16 azi = round_fx( L_shr( st_ivas->hIsmMetaData[i]->edited_azimuth_fx, Q22 - Q16 ) ); // Q0 + Word16 ele = round_fx( L_shr( st_ivas->hIsmMetaData[i]->edited_elevation_fx, Q22 - Q16 ) ); // Q0 + ivas_dirac_dec_get_response_fx( azi, ele, st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hIntSetup.ambisonics_order, Q30 ); + + // TODO: Align Q-values + IF( NE_32( st_ivas->hIsmMetaData[i]->edited_gain_fx, ONE_IN_Q29 ) ) + { + v_multc_fx( st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hIsmMetaData[i]->edited_gain_fx, st_ivas->hIsmRendererData->gains_fx[i], ivas_sba_get_nchan_fx( st_ivas->hIntSetup.ambisonics_order, 0 ) ); // Q30, Q29 --> Q28 + Scale_sig32( st_ivas->hIsmRendererData->gains_fx[i], ivas_sba_get_nchan_fx( st_ivas->hIntSetup.ambisonics_order, 0 ), Q2 ); // Q28 --> 30 + } } } } @@ -1031,54 +1070,146 @@ void ivas_ism_dec_digest_tc_fx( return; } + /*-------------------------------------------------------------------------* * ivas_param_ism_dec_digest_tc() * * *-------------------------------------------------------------------------*/ + void ivas_param_ism_dec_digest_tc_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ - Word32 *transport_channels[], /* i : synthesized core-coder transport channels/DirAC output q_tc_in*/ - Word16 q_tc_in ) + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nCldfbSlots, /* i : number of CLDFB slots in transport channels */ + Word32 *p_data_fx[], /* i/o: synthesized core-coder transport channels/DirAC output q_data_in */ + const Word16 q_data_in /* i : Q-factor of input signal for single channel */ +) { - Word16 exp_real_tmp = 0, exp_imag_tmp = 0; - move16(); - move16(); - move16(); + Word16 i, ch, slot_idx, output_frame; + Word16 num_freq_bands, cldfb_ch, n_ch_cldfb; + Word32 *cldfb_real_buffer, *cldfb_imag_buffer; + Word16 q_data = q_data_in; move16(); - Word32 cx_diag_fx[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; - Word16 exp_cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; - Word16 q_tc = q_tc_in; + /* Initialization */ + num_freq_bands = st_ivas->hSpatParamRendCom->num_freq_bands; move16(); + output_frame = imult1616( nCldfbSlots, st_ivas->hSpatParamRendCom->num_freq_bands ); + n_ch_cldfb = sub( st_ivas->hTcBuffer->nchan_transport_jbm, st_ivas->hTcBuffer->nchan_buffer_full ); + + cldfb_real_buffer = st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx; + cldfb_imag_buffer = st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx; + + ivas_ism_param_dec_tc_gain_adjust_fx( st_ivas, output_frame, shr( output_frame, 1 ), p_data_fx, &q_data ); + + IF( !st_ivas->hDecoderConfig->Opt_tsm ) + { + Scale_sig32( p_data_fx[0], output_frame, sub( Q11, q_data ) ); /*keepeing p_data_fx at Q11*/ + Scale_sig32( p_data_fx[1], output_frame, sub( Q11, q_data ) ); /*keepeing p_data_fx at Q11*/ + } + ELSE + { + IF( NE_16( q_data, q_data_in ) ) + { + FOR( i = 0; i < MAX_PARAM_ISM_WAVE; i++ ) + { + scale_sig32( p_data_fx[i], output_frame, sub( q_data_in, q_data ) ); // q_data_in + } + q_data = q_data_in; + move16(); + } + } + + /* CLDFB Analysis */ + FOR( ( ch = 0, cldfb_ch = 0 ); cldfb_ch < n_ch_cldfb; ( cldfb_ch++, ch++ ) ) + { + FOR( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) + { + q_data = q_data_in; + move16(); + + cldfbAnalysis_ts_fx_fixed_q( &( p_data_fx[ch][num_freq_bands * slot_idx] ), + &cldfb_real_buffer[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], + &cldfb_imag_buffer[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], + num_freq_bands, st_ivas->cldfbAnaDec[cldfb_ch], &q_data ); + + st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_exp = sub( 31, q_data ); + move16(); + st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_exp = sub( 31, q_data ); + move16(); + } + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_dec_dequant_md() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_param_ism_dec_dequant_md_fx( + Decoder_Struct *st_ivas ) +{ + /* De-quantization */ + test(); + IF( !( EQ_32( st_ivas->hDecoderConfig->ivas_total_brate, IVAS_SID_5k2 ) || EQ_32( st_ivas->hDecoderConfig->ivas_total_brate, FRAME_NO_DATA ) ) ) + { + ivas_param_ism_dec_dequant_DOA_fx( st_ivas->hParamIsmDec, st_ivas->nchan_ism ); + + ivas_param_ism_dec_dequant_powrat_fx( st_ivas->hParamIsmDec ); + + st_ivas->hISMDTX.dtx_flag = 0; + move16(); + } + ELSE + { + st_ivas->hISMDTX.dtx_flag = 1; + move16(); + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_dec_prepare_renderer_fx() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_param_ism_dec_prepare_renderer_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const Word16 nCldfbSlots /* i : number of CLDFB slots in transport channels */ +) +{ Word16 ch, nchan_transport, nchan_out, nchan_out_woLFE, i; Word16 slot_idx, bin_idx; + Word32 cx_diag_fx[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; + Word16 exp_cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; + Word16 exp_real_tmp = 0, exp_imag_tmp = 0; Word32 ivas_total_brate; - Word16 output_frame; /* Direct Response/EFAP Gains */ Word32 direct_response_fx[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; PARAM_ISM_DEC_HANDLE hParamIsmDec; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; - Word16 fade_len; /* Initialization */ - set32_fx( &direct_response_fx[0][0], 0, MAX_NUM_OBJECTS * PARAM_ISM_MAX_CHAN ); - hParamIsmDec = st_ivas->hParamIsmDec; - assert( hParamIsmDec ); hSpatParamRendCom = st_ivas->hSpatParamRendCom; assert( hSpatParamRendCom ); - output_frame = imult1616( nCldfbSlots, hSpatParamRendCom->num_freq_bands ); - fade_len = shr( output_frame, 1 ); - + move32(); + hParamIsmDec = st_ivas->hParamIsmDec; + assert( hParamIsmDec ); + move32(); nchan_transport = st_ivas->nchan_transport; move16(); ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - move32(); - hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_exp = 25; + /* Initialization */ + hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_exp = Q25; move16(); - hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_exp = 25; + hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_exp = Q25; move16(); IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { @@ -1096,8 +1227,6 @@ void ivas_param_ism_dec_digest_tc_fx( move16(); } - push_wmops( "ivas_param_ism_dec" ); - /* general setup */ ivas_jbm_dec_get_adapted_linear_interpolator_fx( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbSlots, hParamIsmDec->hParamIsmRendering->interpolator_fx ); @@ -1181,40 +1310,11 @@ void ivas_param_ism_dec_digest_tc_fx( } } - IF( st_ivas->hDecoderConfig->Opt_tsm ) - { - /*TODO : FhG to check*/ - ivas_ism_param_dec_tc_gain_ajust_fx( st_ivas, output_frame, fade_len, transport_channels, &q_tc ); - IF( NE_16( q_tc, q_tc_in ) ) - { - FOR( i = 0; i < 2; i++ ) - { - scale_sig32( transport_channels[i], output_frame, sub( q_tc_in, q_tc ) ); // q_tc_in - } - q_tc = q_tc_in; - move16(); - } - } - FOR( ch = 0; ch < nchan_transport; ch++ ) { /* CLDFB Analysis */ FOR( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) { - IF( st_ivas->hDecoderConfig->Opt_tsm ) - { - Word32 RealBuffer_fx[CLDFB_NO_CHANNELS_MAX]; - Word32 ImagBuffer_fx[CLDFB_NO_CHANNELS_MAX]; - q_tc = q_tc_in; - move16(); - cldfbAnalysis_ts_fx_fixed_q( &( transport_channels[ch][hSpatParamRendCom->num_freq_bands * slot_idx] ), RealBuffer_fx, ImagBuffer_fx, hSpatParamRendCom->num_freq_bands, st_ivas->cldfbAnaDec[ch], &q_tc ); - Copy32( RealBuffer_fx, &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); - Copy32( ImagBuffer_fx, &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); - hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_exp = sub( 31, q_tc ); - move16(); - hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_exp = sub( 31, q_tc ); - move16(); - } Word16 scale_factor_real, scale_factor_imag; Word16 current_idx; exp_real_tmp = hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_exp; @@ -1242,6 +1342,7 @@ void ivas_param_ism_dec_digest_tc_fx( scale_sig32( &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[current_idx], hSpatParamRendCom->num_freq_bands, -scale_factor_imag ); // Q(31-(exp_imag_tmp)) } } + /* Obtain Mixing Matrix on a frame-level */ FOR( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ ) { @@ -1252,33 +1353,28 @@ void ivas_param_ism_dec_digest_tc_fx( ivas_param_ism_compute_mixing_matrix_fx( st_ivas->nchan_ism, hParamIsmDec, st_ivas->hISMDTX, direct_response_fx, nchan_transport, nchan_out_woLFE, cx_diag_fx, exp_cx_diag, hParamIsmDec->hParamIsmRendering->mixing_matrix_lin_fx, hParamIsmDec->hParamIsmRendering->exp_mixing_matrix_lin_fx ); - pop_wmops(); - return; } /*-------------------------------------------------------------------------* - * ivas_ism_param_dec_tc_gain_ajust() + * ivas_ism_param_dec_tc_gain_adjust() * * *-------------------------------------------------------------------------*/ -void ivas_ism_param_dec_tc_gain_ajust_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nSamples, /* i : number of samples to be compensate */ - const UWord16 nFadeLength, /* i : length of the crossfade in samples */ - Word32 *transport_channels_f[], /* i : synthesized core-coder transport channels/DirAC output Q_tc*/ - Word16 *Q_tc /* i/o : Q of input tc buffer */ +static void ivas_ism_param_dec_tc_gain_adjust_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const Word16 nSamples, /* i : number of samples to be compensate */ + const Word16 nFadeLength, /* i : length of the crossfade in samples */ + Word32 *p_data_fx[], /* i : synthesized core-coder transport channels/DirAC output q_data */ + Word16 *q_data /* i/o : Q of input data buffer */ ) - { Word16 i, tmp_e1, tmp_e2, tmp, tmp2, invFade; Word32 L_tmp1, L_tmp2; - Word16 gain_fx, last_gain_fx; Word32 ene_tc_fx, ene_sum_fx; - Word16 ene_tc_e, ene_sum_e; ene_tc_fx = 0; @@ -1290,7 +1386,6 @@ void ivas_ism_param_dec_tc_gain_ajust_fx( ene_sum_e = 0; move16(); - last_gain_fx = st_ivas->hParamIsmDec->hParamIsm->last_dmx_gain_fx; move16(); @@ -1307,14 +1402,13 @@ void ivas_ism_param_dec_tc_gain_ajust_fx( move16(); ch1_e = 0; move16(); - ch0 = transport_channels_f[0][i]; + ch0 = p_data_fx[0][i]; move16(); - ch1 = transport_channels_f[1][i]; + ch1 = p_data_fx[1][i]; move16(); ch0 = BASOP_Util_Add_Mant32Exp( ch0, ch0_e, 0, 0, &ch0_e ); ch1 = BASOP_Util_Add_Mant32Exp( ch1, ch1_e, 0, 0, &ch1_e ); - L_tmp1 = Mpy_32_32( ch0, ch0 ); /*L*L*/ tmp_e1 = add( ch0_e, ch0_e ); L_tmp2 = Mpy_32_32( ch1, ch1 ); /*R*R*/ @@ -1323,7 +1417,6 @@ void ivas_ism_param_dec_tc_gain_ajust_fx( ene_tc_fx = BASOP_Util_Add_Mant32Exp( ene_tc_fx, ene_tc_e, L_tmp1, tmp_e1, &ene_tc_e ); ene_tc_fx = BASOP_Util_Add_Mant32Exp( ene_tc_fx, ene_tc_e, L_tmp2, tmp_e2, &ene_tc_e ); - L_tmp1 = BASOP_Util_Add_Mant32Exp( ch0, ch0_e, ch1, ch1_e, &tmp_e1 ); /*L + R*/ L_tmp1 = Mpy_32_32( L_tmp1, L_tmp1 ); // Q(31-(tmp_e1+tmp_e1 /*(L + R)*(L + R)*/ tmp_e1 = add( tmp_e1, tmp_e1 ); @@ -1341,14 +1434,14 @@ void ivas_ism_param_dec_tc_gain_ajust_fx( { gain_fx = 0; move16(); - tmp_e1 = 31; + tmp_e1 = 0; move16(); } - ELSE - { /*handling denominator equals to zero*/ - gain_fx = 1; + ELSE /*handling denominator equals to zero*/ + { + gain_fx = 32767; //(max value of Word16 in Q0) move16(); - tmp_e1 = -32767; //(-1.0f in Q15) + 1 + tmp_e1 = 15; move16(); } } @@ -1373,6 +1466,7 @@ void ivas_ism_param_dec_tc_gain_ajust_fx( { /* Smoothing */ gain_fx = add( mult_r( 24574, gain_fx ), mult_r( 8192, last_gain_fx ) ); // 24574 =.75f in Q15 , 8192=.25f in Q15 + /* 10ms ramp */ /* slope between two consecutive gains, 480 samples length */ invFade = div_s( 1, nFadeLength ); // Q15 @@ -1383,18 +1477,18 @@ void ivas_ism_param_dec_tc_gain_ajust_fx( /* tmp2 = ( last_gain_fx + i * grad_fx )*/ tmp2 = add( mult_r( sub( 32767, tmp ), last_gain_fx ), mult_r( tmp, gain_fx ) ); // 32767= 1.0f in Q15, - transport_channels_f[0][i] = Mpy_32_16_1( transport_channels_f[0][i], tmp2 ); // Q(Q_tc-tmp_e1) + p_data_fx[0][i] = Mpy_32_16_1( p_data_fx[0][i], tmp2 ); // Q(Q_tc-tmp_e1) move32(); - transport_channels_f[1][i] = Mpy_32_16_1( transport_channels_f[1][i], tmp2 ); // Q(Q_tc-tmp_e1) + p_data_fx[1][i] = Mpy_32_16_1( p_data_fx[1][i], tmp2 ); // Q(Q_tc-tmp_e1) move32(); tmp = add( tmp, invFade ); } FOR( ; i < nSamples; i++ ) { - transport_channels_f[0][i] = Mpy_32_16_1( transport_channels_f[0][i], gain_fx ); // Q(Q_tc-tmp_e1) + p_data_fx[0][i] = Mpy_32_16_1( p_data_fx[0][i], gain_fx ); // Q(Q_tc-tmp_e1) move32(); - transport_channels_f[1][i] = Mpy_32_16_1( transport_channels_f[1][i], gain_fx ); // Q(Q_tc-tmp_e1) + p_data_fx[1][i] = Mpy_32_16_1( p_data_fx[1][i], gain_fx ); // Q(Q_tc-tmp_e1) move32(); } } @@ -1402,9 +1496,9 @@ void ivas_ism_param_dec_tc_gain_ajust_fx( { FOR( i = 0; i < nSamples; i++ ) { - transport_channels_f[0][i] = Mpy_32_16_1( transport_channels_f[0][i], gain_fx ); // Q(Q_tc-tmp_e1) + p_data_fx[0][i] = Mpy_32_16_1( p_data_fx[0][i], gain_fx ); // Q(Q_tc-tmp_e1) move32(); - transport_channels_f[1][i] = Mpy_32_16_1( transport_channels_f[1][i], gain_fx ); // Q(Q_tc-tmp_e1) + p_data_fx[1][i] = Mpy_32_16_1( p_data_fx[1][i], gain_fx ); // Q(Q_tc-tmp_e1) move32(); } } @@ -1414,26 +1508,29 @@ void ivas_ism_param_dec_tc_gain_ajust_fx( st_ivas->hParamIsmDec->hParamIsm->last_dmx_gain_e = tmp_e1; move16(); - *Q_tc = sub( *Q_tc, tmp_e1 ); + *q_data = sub( *q_data, tmp_e1 ); move16(); + return; } + /*-------------------------------------------------------------------------* * ivas_ism_param_dec_render_sf() * * *-------------------------------------------------------------------------*/ + static void ivas_ism_param_dec_render_sf_fx( Decoder_Struct *st_ivas, IVAS_OUTPUT_SETUP hSetup, const Word16 nchan_transport, const Word16 nchan_out, const Word16 nchan_out_woLFE, - Word32 *output_f_fx[], /*Q_output*/ + Word32 *output_fx[], /*Q_output*/ Word16 Q_output[] ) { - Word16 ch, slot_idx, i, index_slot; + Word16 ch, slot_idx, i, index_slot, cldfb_idx; /* CLDFB Output Buffers */ Word32 Cldfb_RealBuffer_fx[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; // Q(31-real_exp) Word32 Cldfb_ImagBuffer_fx[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; // Q(31-imag_exp) @@ -1446,12 +1543,14 @@ static void ivas_ism_param_dec_render_sf_fx( Word16 idx_lfe; Word16 subframe_idx; Word16 samplesProcessed, no_col_cldfb, size_cldfb; + hParamIsmDec = st_ivas->hParamIsmDec; hSpatParamRendCom = st_ivas->hSpatParamRendCom; slot_idx_start = hSpatParamRendCom->slots_rendered; move16(); subframe_idx = hSpatParamRendCom->subframes_rendered; move16(); + /* Set some memories to zero */ FOR( ch = 0; ch < nchan_out_woLFE; ch++ ) { @@ -1462,17 +1561,15 @@ static void ivas_ism_param_dec_render_sf_fx( } } - Word16 real_exp[JBM_CLDFB_SLOTS_IN_SUBFRAME]; Word16 imag_exp[JBM_CLDFB_SLOTS_IN_SUBFRAME]; FOR( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) { index_slot = add( slot_idx_start, slot_idx ); - FOR( ch = 0; ch < nchan_transport; ch++ ) { - Word16 cldfb_idx = add( imult1616( imult1616( index_slot, hSpatParamRendCom->num_freq_bands ), nchan_transport ), imult1616( ch, hSpatParamRendCom->num_freq_bands ) ); + cldfb_idx = add( imult1616( imult1616( index_slot, hSpatParamRendCom->num_freq_bands ), nchan_transport ), imult1616( ch, hSpatParamRendCom->num_freq_bands ) ); Cldfb_RealBuffer_in_fx[ch] = &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[cldfb_idx]; // Q11 Cldfb_ImagBuffer_in_fx[ch] = &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[cldfb_idx]; // Q11 } @@ -1500,7 +1597,7 @@ static void ivas_ism_param_dec_render_sf_fx( test(); IF( ( hSetup.num_lfe > 0 ) && EQ_16( hSetup.index_lfe[idx_lfe], ch ) ) { - set32_fx( output_f_fx[ch], 0, i_mult( hSpatParamRendCom->subframe_nbslots[subframe_idx], hSpatParamRendCom->num_freq_bands ) ); + set32_fx( output_fx[ch], 0, i_mult( hSpatParamRendCom->subframe_nbslots[subframe_idx], hSpatParamRendCom->num_freq_bands ) ); if ( LT_16( idx_lfe, sub( hSetup.num_lfe, 1 ) ) ) { @@ -1509,7 +1606,6 @@ static void ivas_ism_param_dec_render_sf_fx( } ELSE { - Word32 *RealBuffer_fx[16]; Word32 *ImagBuffer_fx[16]; @@ -1535,11 +1631,7 @@ static void ivas_ism_param_dec_render_sf_fx( Scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->p_filter_length, sub( sub( Q_real, 1 ), Q11 ) ); // Q_real-1 st_ivas->cldfbSynDec[ch]->Q_cldfb_state = sub( Q_real, 1 ); move16(); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, output_f_fx[ch], i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), 0, st_ivas->cldfbSynDec[ch] ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, output_f_fx[ch], i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), st_ivas->cldfbSynDec[ch] ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, output_fx[ch], i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), 0, 0, st_ivas->cldfbSynDec[ch] ); Scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->p_filter_length, sub( Q11, sub( Q_real, 1 ) ) ); // Q11 st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11; move16(); @@ -1556,7 +1648,7 @@ static void ivas_ism_param_dec_render_sf_fx( } size_cldfb = imult1616( st_ivas->cldfbSynDec[ch]->no_channels, no_col_cldfb ); - Scale_sig32( output_f_fx[ch], size_cldfb, sub( Q11, sub( Q_real, 1 ) ) ); // Q11 + Scale_sig32( output_fx[ch], size_cldfb, sub( Q11, sub( Q_real, 1 ) ) ); // Q11 Q_output[ch] = 11; move16(); @@ -1578,22 +1670,22 @@ static void ivas_ism_param_dec_render_sf_fx( * * *-------------------------------------------------------------------------*/ + void ivas_param_ism_dec_render_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ - UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ - UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ - Word32 *output_f_fx[] /*Q11*/ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + Word32 *output_fx[] /* i/o: synthesized core-coder TCs / rendered signal Q11*/ ) { - Word16 ch, slots_to_render, first_sf, last_sf, subframe_idx; UWord16 slot_size, n_samples_sf; PARAM_ISM_DEC_HANDLE hParamIsmDec; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; IVAS_OUTPUT_SETUP hSetup; Word16 nchan_transport, nchan_out, nchan_out_woLFE; - Word32 *output_f_local_fx[MAX_OUTPUT_CHANNELS]; + Word32 *output_fx_local[MAX_OUTPUT_CHANNELS]; Word16 Q_output[MAX_OUTPUT_CHANNELS]; set16_fx( Q_output, 0, MAX_OUTPUT_CHANNELS ); @@ -1642,17 +1734,17 @@ void ivas_param_ism_dec_render_fx( FOR( ch = 0; ch < nchan_out; ch++ ) { - output_f_local_fx[ch] = &output_f_fx[ch][0]; + output_fx_local[ch] = &output_fx[ch][0]; } FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { - ivas_ism_param_dec_render_sf_fx( st_ivas, hSetup, nchan_transport, nchan_out, nchan_out_woLFE, output_f_local_fx, Q_output ); + ivas_ism_param_dec_render_sf_fx( st_ivas, hSetup, nchan_transport, nchan_out, nchan_out_woLFE, output_fx_local, Q_output ); n_samples_sf = i_mult( hSpatParamRendCom->subframe_nbslots[subframe_idx], hSpatParamRendCom->slot_size ); FOR( ch = 0; ch < nchan_out; ch++ ) { - output_f_local_fx[ch] += n_samples_sf; + output_fx_local[ch] += n_samples_sf; } } @@ -1667,14 +1759,16 @@ void ivas_param_ism_dec_render_fx( { IF( GT_32( st_ivas->hParamIsmDec->azimuth_values_fx[ch], 754974720 ) /*180.f in Q22*/ ) { - st_ivas->hIsmMetaData[ch]->azimuth_fx = L_sub( st_ivas->hParamIsmDec->azimuth_values_fx[ch], 1509949440 ) /*360.0F in Q22*/; + st_ivas->hIsmMetaData[ch]->azimuth_fx = L_sub( st_ivas->hParamIsmDec->edited_azimuth_values_fx[ch], 1509949440 ) /*360.0F in Q22*/; move32(); } ELSE { - st_ivas->hIsmMetaData[ch]->azimuth_fx = st_ivas->hParamIsmDec->azimuth_values_fx[ch]; + st_ivas->hIsmMetaData[ch]->azimuth_fx = st_ivas->hParamIsmDec->edited_azimuth_values_fx[ch]; move32(); } + st_ivas->hIsmMetaData[ch]->elevation_fx = st_ivas->hParamIsmDec->edited_elevation_values_fx[ch]; + move32(); st_ivas->hIsmMetaData[ch]->elevation_fx = st_ivas->hParamIsmDec->elevation_values_fx[ch]; move32(); @@ -1683,6 +1777,7 @@ void ivas_param_ism_dec_render_fx( *nSamplesAvailableNext = imult1616( sub( hSpatParamRendCom->num_slots, hSpatParamRendCom->slots_rendered ), (Word16) slot_size ); move16(); + return; } @@ -1692,6 +1787,7 @@ void ivas_param_ism_dec_render_fx( * * *-------------------------------------------------------------------------*/ + void ivas_param_ism_params_to_masa_param_mapping_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) @@ -1704,143 +1800,142 @@ void ivas_param_ism_params_to_masa_param_mapping_fx( Word16 azimuth[2]; Word16 elevation[2]; Word16 power_ratio_fx[2]; /* Q15 */ - Word32 ivas_total_brate; + MASA_ISM_DATA_HANDLE hMasaIsmData; + Word16 obj; + Word16 obj_idx; hParamIsmDec = st_ivas->hParamIsmDec; + move16(); hSpatParamRendCom = st_ivas->hSpatParamRendCom; + move16(); + hMasaIsmData = st_ivas->hMasaIsmData; nBins = hSpatParamRendCom->num_freq_bands; move16(); - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - move32(); - test(); - IF( !( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || ivas_total_brate == FRAME_NO_DATA ) ) + IF( st_ivas->hISMDTX.dtx_flag ) { - ivas_param_ism_dec_dequant_DOA_fx( hParamIsmDec, st_ivas->nchan_ism ); - ivas_param_ism_dec_dequant_powrat_fx( hParamIsmDec ); - st_ivas->hISMDTX.dtx_flag = 0; + Word32 energy_ratio_fx; /* Q30 */ + energy_ratio_fx = L_mult0( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx[0], st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx[0] ); /* Q15 + Q15 -> Q30 */ + + hSpatParamRendCom->numSimultaneousDirections = 1; + move16(); + azimuth[0] = extract_l( L_shr( L_add( hParamIsmDec->azimuth_values_fx[0], ONE_IN_Q21 ), 22 ) ); // Q0 move16(); + elevation[0] = extract_l( L_shr( L_add( hParamIsmDec->elevation_values_fx[0], ONE_IN_Q21 ), 22 ) ); // Q0 + move16(); + + FOR( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + FOR( bin_idx = 0; bin_idx < nBins; bin_idx++ ) + { + hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; + move16(); + hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; + move16(); + hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx] = energy_ratio_fx; + move16(); + hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx] = 0; + move16(); + hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx] = 0; + move16(); + } + } } ELSE { - st_ivas->hISMDTX.dtx_flag = 1; + hSpatParamRendCom->numSimultaneousDirections = 2; move16(); - } - - IF( GT_16( st_ivas->nchan_ism, 1 ) ) - { - IF( st_ivas->hISMDTX.dtx_flag ) + FOR( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) { - Word32 energy_ratio_fx; /* Q30 */ - energy_ratio_fx = L_mult0( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx, st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx ); /* Q15 + Q15 -> Q30 */ + brange[0] = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + move16(); + brange[1] = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; + move16(); - hSpatParamRendCom->numSimultaneousDirections = 1; + azimuth[0] = extract_l( L_shr( L_add( hParamIsmDec->edited_azimuth_values_fx[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][0]], ( 1 << 21 ) ), 22 ) ); // Q0 move16(); - azimuth[0] = extract_l( L_shr( L_add( hParamIsmDec->azimuth_values_fx[0], ONE_IN_Q21 ), 22 ) ); // Q0 + elevation[0] = extract_l( L_shr( L_add( hParamIsmDec->edited_elevation_values_fx[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][0]], ( 1 << 21 ) ), 22 ) ); // Q0 move16(); - elevation[0] = extract_l( L_shr( L_add( hParamIsmDec->elevation_values_fx[0], ONE_IN_Q21 ), 22 ) ); // Q0 + power_ratio_fx[0] = hParamIsmDec->power_ratios_fx[band_idx][0][0]; + move16(); + + azimuth[1] = extract_l( L_shr( L_add( hParamIsmDec->edited_azimuth_values_fx[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][1]], ( 1 << 21 ) ), 22 ) ); // Q0 + move16(); + elevation[1] = extract_l( L_shr( L_add( hParamIsmDec->edited_elevation_values_fx[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][1]], ( 1 << 21 ) ), 22 ) ); // Q0 + move16(); + power_ratio_fx[1] = hParamIsmDec->power_ratios_fx[band_idx][0][1]; move16(); FOR( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) { - FOR( bin_idx = 0; bin_idx < nBins; bin_idx++ ) + FOR( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) { hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; move16(); hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; move16(); - hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx] = energy_ratio_fx; - move16(); - hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx] = 0; + hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx] = L_shl( power_ratio_fx[0], Q15 ); // Q30 + move32(); + hSpatParamRendCom->azimuth2[sf_idx][bin_idx] = azimuth[1]; move16(); - hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx] = 0; + hSpatParamRendCom->elevation2[sf_idx][bin_idx] = elevation[1]; move16(); + hSpatParamRendCom->energy_ratio2_fx[sf_idx][bin_idx] = L_shl( power_ratio_fx[1], Q15 ); // Q30 + move32(); } } } - ELSE + + FOR( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) { - hSpatParamRendCom->numSimultaneousDirections = 2; - move16(); - FOR( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) + FOR( bin_idx = 0; bin_idx < nBins; bin_idx++ ) { - brange[0] = hParamIsmDec->hParamIsm->band_grouping[band_idx]; - move16(); - brange[1] = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; - move16(); - - azimuth[0] = extract_l( L_shr( L_add( hParamIsmDec->azimuth_values_fx[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][0]], ( 1 << 21 ) ), 22 ) ); // Q0 - move16(); - elevation[0] = extract_l( L_shr( L_add( hParamIsmDec->elevation_values_fx[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][0]], ( 1 << 21 ) ), 22 ) ); // Q0 - move16(); - power_ratio_fx[0] = hParamIsmDec->power_ratios_fx[band_idx][0][0]; - move16(); - azimuth[1] = extract_l( L_shr( L_add( hParamIsmDec->azimuth_values_fx[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][1]], ( 1 << 21 ) ), 22 ) ); // Q0 + hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx] = 0; move16(); - elevation[1] = extract_l( L_shr( L_add( hParamIsmDec->elevation_values_fx[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][1]], ( 1 << 21 ) ), 22 ) ); // Q0 + hSpatParamRendCom->spreadCoherence2_fx[sf_idx][bin_idx] = 0; move16(); - power_ratio_fx[1] = hParamIsmDec->power_ratios_fx[band_idx][0][1]; + hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx] = 0; move16(); + } + } - FOR( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) - { - FOR( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) - { - hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; - move16(); - hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; - move16(); - hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx] = L_shl( power_ratio_fx[0], Q15 ); // Q30 - move32(); - hSpatParamRendCom->azimuth2[sf_idx][bin_idx] = azimuth[1]; - move16(); - hSpatParamRendCom->elevation2[sf_idx][bin_idx] = elevation[1]; - move16(); - hSpatParamRendCom->energy_ratio2_fx[sf_idx][bin_idx] = L_shl( power_ratio_fx[1], Q15 ); // Q30 - move32(); - } - } + FOR( obj = 0; obj < st_ivas->nchan_ism; obj++ ) + { + FOR( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + hMasaIsmData->azimuth_ism_fx[obj][sf_idx] = extract_l( L_shr( ( L_add( hParamIsmDec->azimuth_values_fx[obj], ( 1 << 21 ) ) ), 22 ) ); // Q0 + hMasaIsmData->elevation_ism_fx[obj][sf_idx] = extract_l( L_shr_r( L_add( hParamIsmDec->elevation_values_fx[obj], ( 1 << 21 ) ), 22 ) ); // Scale to Q0 } + hMasaIsmData->azimuth_ism_edited_fx[obj] = extract_l( L_shr( ( L_add( hParamIsmDec->edited_azimuth_values_fx[obj], ( 1 << 21 ) ) ), 22 ) ); + hMasaIsmData->elevation_ism_edited_fx[obj] = extract_l( L_shr( ( L_add( hParamIsmDec->edited_azimuth_values_fx[obj], ( 1 << 21 ) ) ), 22 ) ); + FOR( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) { - FOR( bin_idx = 0; bin_idx < nBins; bin_idx++ ) - { - hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx] = 0; - move16(); - hSpatParamRendCom->spreadCoherence2_fx[sf_idx][bin_idx] = 0; - move16(); - hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx] = 0; - move16(); - } + set_zero_fx( hMasaIsmData->energy_ratio_ism_fx[obj][sf_idx], CLDFB_NO_CHANNELS_MAX ); } } - } - ELSE - { - hSpatParamRendCom->numSimultaneousDirections = 1; - move16(); - azimuth[0] = extract_l( L_shr( ( L_add( hParamIsmDec->azimuth_values_fx[0], ( 1 << 21 ) ) ), 22 ) ); // Q0 - move16(); - elevation[0] = extract_l( L_shr( L_add( hParamIsmDec->elevation_values_fx[0], ( 1 << 21 ) ), 22 ) ); // Q0 - move16(); - FOR( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + FOR( obj = 0; obj < MAX_PARAM_ISM_WAVE; obj++ ) { - FOR( bin_idx = 0; bin_idx < nBins; bin_idx++ ) + FOR( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) { - hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; - move16(); - hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; - move16(); - hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx] = ONE_IN_Q30; /* 1.0f in Q30 */ - move32(); - hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx] = 0; - move16(); - hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx] = 0; - move16(); + brange[0] = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + brange[1] = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; + + obj_idx = hParamIsmDec->hParamIsm->obj_indices[band_idx][0][obj]; + power_ratio_fx[obj] = hParamIsmDec->power_ratios_fx[band_idx][0][obj]; // Q15 + + FOR( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + FOR( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) + { + hMasaIsmData->energy_ratio_ism_fx[obj_idx][sf_idx][bin_idx] = L_shl( power_ratio_fx[obj], 15 ); // Q15 -> Q30 + } + } } } } + return; } diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index 888bfb060e9d3fe31c04eb5fcdf26b910bbd8007..2e2a257a11a96837fc296c79ea672c18ac0cc540 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -70,7 +70,11 @@ ivas_error ivas_ism_renderer_open_fx( test(); test(); test(); - IF( st_ivas->hIntSetup.is_loudspeaker_setup && st_ivas->hIntSetup.ls_azimuth_fx != NULL && st_ivas->hIntSetup.ls_elevation_fx != NULL && st_ivas->hEFAPdata == NULL ) + test(); + IF( st_ivas->hIntSetup.is_loudspeaker_setup && + NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && + st_ivas->hIntSetup.ls_azimuth_fx != NULL && st_ivas->hIntSetup.ls_elevation_fx != NULL && + st_ivas->hEFAPdata == NULL ) { IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth_fx, st_ivas->hIntSetup.ls_elevation_fx, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) { @@ -86,22 +90,19 @@ ivas_error ivas_ism_renderer_open_fx( IF( st_ivas->hDecoderConfig->Opt_tsm ) { - Word32 res_dec, res_frac; init_interpolator_length = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_CLDFB_TIMESLOTS * CLDFB_SLOT_NS ); move16(); - iDiv_and_mod_32( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - interpolator_length = (UWord16) ( res_dec ); + interpolator_length = (UWord16) extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); move16(); } ELSE { - Word32 res_dec, res_frac; - iDiv_and_mod_32( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - init_interpolator_length = (UWord16) ( res_dec ); + init_interpolator_length = (UWord16) extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); move16(); interpolator_length = init_interpolator_length; move16(); } + IF( ( st_ivas->hIsmRendererData->interpolator_fx = (Word16 *) malloc( sizeof( Word16 ) * init_interpolator_length ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM renderer interpolator\n" ) ); @@ -127,6 +128,7 @@ ivas_error ivas_ism_renderer_open_fx( * * Close struct for object rendering. *-------------------------------------------------------------------------*/ + void ivas_ism_renderer_close( ISM_RENDERER_HANDLE *hIsmRendererData /* i/o: ISM renderer handle */ ) @@ -149,15 +151,18 @@ void ivas_ism_renderer_close( return; } + /*-------------------------------------------------------------------------* * ivas_ism_render_sf() * * Object rendering process *-------------------------------------------------------------------------*/ + void ivas_ism_render_sf_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_fx[], /* i/o: core-coder transport channels/object output Q11*/ - const Word16 n_samples_to_render /* i : output frame length per channel */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const RENDERER_TYPE renderer_type, /* i : active renderer type */ + Word32 *output_fx[], /* i/o: core-coder transport channels/object output Q11*/ + const Word16 n_samples_to_render /* i : output frame length per channel */ ) { Word16 i, j, k, j2; @@ -170,15 +175,31 @@ void ivas_ism_render_sf_fx( Word32 gain_fx, prev_gain_fx; Word32 tc_local_fx[MAX_NUM_OBJECTS][L_FRAME48k]; Word32 *p_tc_fx[MAX_NUM_OBJECTS]; + Word16 ism_md_subframe_update_jbm, slots_to_render, first_sf, last_sf, subframe_idx; + Word16 n_samples_rendered_loop; - num_objects = st_ivas->nchan_transport; + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = s_min( sub( st_ivas->hTcBuffer->num_slots, st_ivas->hTcBuffer->slots_rendered ), n_samples_to_render / st_ivas->hTcBuffer->n_samples_granularity ); + first_sf = st_ivas->hTcBuffer->subframes_rendered; move16(); - if ( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + last_sf = first_sf; + move16(); + n_samples_rendered_loop = 0; + move16(); + +#ifdef DEBUGGING + assert( slots_to_render == 0 ); + assert( last_sf <= st_ivas->hTcBuffer->nb_subframes ); +#endif + + WHILE( slots_to_render > 0 ) { - num_objects = st_ivas->nchan_ism; - move16(); + slots_to_render = sub( slots_to_render, st_ivas->hTcBuffer->subframe_nbslots[last_sf] ); + last_sf = add( last_sf, 1 ); } + num_objects = st_ivas->nchan_ism; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; move16(); @@ -187,97 +208,128 @@ void ivas_ism_render_sf_fx( interp_offset = st_ivas->hTcBuffer->n_samples_rendered; move16(); - IF( st_ivas->hDecoderConfig->Opt_tsm ) + /* Number of subframes to delay metadata to sync with audio */ + IF( st_ivas->hDecoderConfig->Opt_delay_comp ) { - FOR( i = 0; i < num_objects; i++ ) - { - p_tc_fx[i] = &st_ivas->hTcBuffer->tc_fx[i][tc_offset]; // Q11 - } + ism_md_subframe_update_jbm = s_max( 0, sub( st_ivas->hTcBuffer->nb_subframes, 3 ) ); } ELSE { - FOR( i = 0; i < num_objects; i++ ) - { - Copy32( &output_fx[i][tc_offset], tc_local_fx[i], n_samples_to_render ); - p_tc_fx[i] = tc_local_fx[i]; - } + ism_md_subframe_update_jbm = sub( st_ivas->hTcBuffer->nb_subframes, 2 ); } - FOR( i = 0; i < nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) + FOR( i = 0; i < num_objects; i++ ) { - set32_fx( output_fx[i], 0, n_samples_to_render ); + Copy32( &output_fx[i][tc_offset], tc_local_fx[i], n_samples_to_render ); + p_tc_fx[i] = tc_local_fx[i]; } - test(); - IF( st_ivas->hCombinedOrientationData && EQ_16( st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx], 1 ) ) + FOR( i = 0; i < nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) { - ivas_jbm_dec_get_adapted_linear_interpolator_fx( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator_fx ); - interp_offset = 0; - move16(); + set32_fx( output_fx[i], 0, n_samples_to_render ); } - FOR( i = 0; i < num_objects; i++ ) + FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { - /* Combined rotation: rotate the object positions depending the head and external orientations */ + Word16 n_samples_in_subframe; + + n_samples_in_subframe = st_ivas->hTcBuffer->n_samples_granularity * st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; test(); - IF( st_ivas->hCombinedOrientationData != NULL && EQ_16( st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx], 1 ) ) + IF( st_ivas->hCombinedOrientationData && EQ_16( st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx], 1 ) ) { - rotateAziEle_fx( extract_l( L_shr( st_ivas->hIsmMetaData[i]->azimuth_fx, 22 ) ), extract_l( L_shr( st_ivas->hIsmMetaData[i]->elevation_fx, 22 ) ), &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat_fx[0], st_ivas->hIntSetup.is_planar_setup ); - - IF( st_ivas->hEFAPdata != NULL ) - { - efap_determine_gains_fx( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], L_shl( azimuth, 22 ), L_shl( elevation, 22 ), EFAP_MODE_EFAP ); - } + ivas_jbm_dec_get_adapted_linear_interpolator_fx( n_samples_in_subframe, n_samples_in_subframe, st_ivas->hIsmRendererData->interpolator_fx ); + interp_offset = 0; + move16(); } - lfe_index = 0; - move16(); - FOR( ( j = 0, j2 = 0 ); j < nchan_out_woLFE; ( j++, j2++ ) ) + FOR( i = 0; i < num_objects; i++ ) { + /* Combined rotation: rotate the object positions depending the head and external orientations */ test(); - IF( ( st_ivas->hIntSetup.num_lfe > 0 ) && EQ_16( st_ivas->hIntSetup.index_lfe[lfe_index], j ) ) + IF( st_ivas->hCombinedOrientationData != NULL && EQ_16( st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx], 1 ) ) { - IF( LT_16( lfe_index, sub( st_ivas->hIntSetup.num_lfe, 1 ) ) ) + if ( GE_16( subframe_idx, ism_md_subframe_update_jbm ) ) { - lfe_index = add( lfe_index, 1 ); - j2 = add( j2, 1 ); + rotateAziEle_fx( extract_l( L_shr( st_ivas->hIsmMetaData[i]->edited_azimuth_fx, 22 ) ), extract_l( L_shr( st_ivas->hIsmMetaData[i]->edited_elevation_fx, 22 ) ), &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat_fx[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); } - ELSE + else { - j2 = add( j2, 1 ); + rotateAziEle_fx( extract_l( L_shr( st_ivas->hIsmMetaData[i]->edited_azimuth_fx, 22 ) ), extract_l( L_shr( st_ivas->hIsmMetaData[i]->edited_elevation_fx, 22 ) ), &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat_fx[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); } - } - gain_fx = st_ivas->hIsmRendererData->gains_fx[i][j]; - move32(); - prev_gain_fx = st_ivas->hIsmRendererData->prev_gains_fx[i][j]; - move32(); - - test(); - IF( ( L_abs( gain_fx ) > 0 ) || ( L_abs( prev_gain_fx ) > 0 ) ) - { - g1_fx = &st_ivas->hIsmRendererData->interpolator_fx[interp_offset]; - tc_fx = p_tc_fx[i]; - FOR( k = 0; k < n_samples_to_render; k++ ) + IF( st_ivas->hEFAPdata != NULL ) { - g2_fx = sub( 32767, *g1_fx ); // 32767 = (1.0f in Q15) - 1 - output_fx[j2][k] = L_add( output_fx[j2][k], L_shl( Mpy_32_32( L_add( Mpy_32_16_1( gain_fx, *( g1_fx++ ) ), Mpy_32_16_1( prev_gain_fx, g2_fx ) ), *( tc_fx++ ) ), 1 ) ); // Q11( (30+15+1-16) + 11 -31 +1) - move16(); + efap_determine_gains_fx( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], L_shl( azimuth, 22 ), L_shl( elevation, 22 ), EFAP_MODE_EFAP ); + // TODO: Align Q-values + IF( NE_32( st_ivas->hIsmMetaData[i]->edited_gain_fx, ONE_IN_Q29 ) ) + { + v_multc_fx( st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hIsmMetaData[i]->edited_gain_fx, st_ivas->hIsmRendererData->gains_fx[i], nchan_out_woLFE ); // Q30, Q29 --> Q28 + Scale_sig32( st_ivas->hIsmRendererData->gains_fx[i], nchan_out_woLFE, Q2 ); // Q28 --> Q30 + } } } - /* update here only in case of head rotation */ - test(); - IF( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) + lfe_index = 0; + move16(); + FOR( ( j = 0, j2 = 0 ); j < nchan_out_woLFE; ( j++, j2++ ) ) { - st_ivas->hIsmRendererData->prev_gains_fx[i][j] = gain_fx; // Q30 + test(); + IF( ( st_ivas->hIntSetup.num_lfe > 0 ) && EQ_16( st_ivas->hIntSetup.index_lfe[lfe_index], j ) ) + { + IF( LT_16( lfe_index, sub( st_ivas->hIntSetup.num_lfe, 1 ) ) ) + { + lfe_index = add( lfe_index, 1 ); + j2 = add( j2, 1 ); + } + ELSE + { + j2 = add( j2, 1 ); + } + } + + gain_fx = st_ivas->hIsmRendererData->gains_fx[i][j]; move32(); + prev_gain_fx = st_ivas->hIsmRendererData->prev_gains_fx[i][j]; + move32(); + + test(); + IF( ( L_abs( gain_fx ) > 0 ) || ( L_abs( prev_gain_fx ) > 0 ) ) + { + g1_fx = &st_ivas->hIsmRendererData->interpolator_fx[interp_offset]; + tc_fx = p_tc_fx[i]; + FOR( k = 0; k < n_samples_in_subframe; k++ ) + { + g2_fx = sub( 32767, *g1_fx ); // 32767 = (1.0f in Q15) - 1 + output_fx[j2][k + n_samples_rendered_loop] = L_add( output_fx[j2][k + n_samples_rendered_loop], L_shl( Mpy_32_32( L_add( Mpy_32_16_1( gain_fx, *( g1_fx++ ) ), Mpy_32_16_1( prev_gain_fx, g2_fx ) ), *( tc_fx++ ) ), 1 ) ); // Q11( (30+15+1-16) + 11 -31 +1) + move16(); + } + } + + /* update here only in case of head rotation */ + test(); + IF( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) + { + st_ivas->hIsmRendererData->prev_gains_fx[i][j] = gain_fx; // Q30 + move32(); + } } + p_tc_fx[i] += n_samples_in_subframe; } - } - /* update combined orientation access index */ - ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_to_render ); + /* update combined orientation access index */ + ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_in_subframe ); + + n_samples_rendered_loop = add( n_samples_rendered_loop, n_samples_in_subframe ); + /* update rendered subframe and slots info for all cases apart from a following crend call, the update will + then happen in the crend call*/ + if ( NE_16( renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) + { + st_ivas->hTcBuffer->subframes_rendered = add( st_ivas->hTcBuffer->subframes_rendered, 1 ); + st_ivas->hTcBuffer->slots_rendered = add( st_ivas->hTcBuffer->slots_rendered, st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] ); + } + tc_offset = add( tc_offset, n_samples_in_subframe ); + interp_offset = add( interp_offset, n_samples_in_subframe ); + } return; } @@ -348,8 +400,9 @@ void ivas_ism_get_stereo_gains_fx( return; } + /*-------------------------------------------------------------------------* - * ivas_masa_oism_separate_object_renderer_open() + * ivas_omasa_separate_object_renderer_open() * * Open structures, reserve memory, and init values. *-------------------------------------------------------------------------*/ @@ -371,15 +424,17 @@ ivas_error ivas_omasa_separate_object_renderer_open( { set32_fx( st_ivas->hIsmRendererData->prev_gains_fx[i], 0, MAX_OUTPUT_CHANNELS ); } - Word32 res_dec1, res_frac1; - Word32 res_dec2, res_frac2; - iDiv_and_mod_32( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC, &res_dec1, &res_frac1, 0 ); - iDiv_and_mod_32( res_dec1, MAX_PARAM_SPATIAL_SUBFRAMES, &res_dec2, &res_frac2, 0 ); - init_interpolator_length = extract_l( res_dec2 ); + + i = extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + init_interpolator_length = shr( i, 2 ); // i / MAX_PARAM_SPATIAL_SUBFRAMES interpolator_length = init_interpolator_length; move16(); - st_ivas->hIsmRendererData->interpolator_fx = (Word16 *) malloc( sizeof( Word16 ) * init_interpolator_length ); + IF( ( st_ivas->hIsmRendererData->interpolator_fx = (Word16 *) malloc( sizeof( Word16 ) * init_interpolator_length ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM renderer interpolator \n" ) ); + } + st_ivas->hIsmRendererData->interpolator_len = init_interpolator_length; move16(); FOR( i = 0; i < interpolator_length; i++ ) @@ -390,34 +445,6 @@ ivas_error ivas_omasa_separate_object_renderer_open( st_ivas->hIsmRendererData->interpolator_len = interpolator_length; move16(); - st_ivas->hMasaIsmData->delayBuffer_size = extract_l( ( st_ivas->hDecoderConfig->output_Fs / 50 ) / MAX_PARAM_SPATIAL_SUBFRAMES ); - move16(); - - test(); - IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) - { - st_ivas->hMasaIsmData->delayBuffer_nchan = 1; - move16(); - } - ELSE - { - st_ivas->hMasaIsmData->delayBuffer_nchan = st_ivas->nchan_ism; - move16(); - } - - IF( ( st_ivas->hMasaIsmData->delayBuffer_fx = (Word32 **) malloc( st_ivas->hMasaIsmData->delayBuffer_nchan * sizeof( Word32 * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM delay buffer \n" ) ); - } - - FOR( i = 0; i < st_ivas->hMasaIsmData->delayBuffer_nchan; i++ ) - { - IF( ( st_ivas->hMasaIsmData->delayBuffer_fx[i] = (Word32 *) malloc( st_ivas->hMasaIsmData->delayBuffer_size * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM delay buffer \n" ) ); - } - set32_fx( st_ivas->hMasaIsmData->delayBuffer_fx[i], 0, st_ivas->hMasaIsmData->delayBuffer_size ); - } return IVAS_ERR_OK; } @@ -470,8 +497,7 @@ void ivas_omasa_separate_object_render_jbm_fx( const UWord16 nSamplesRendered, /* i : number of samples rendered */ Word32 input_fx_in[][L_FRAME48k], /* i : separated object signal Q11*/ Word32 *output_fx[], /* o : rendered time signal Q11*/ - const Word16 subframes_rendered, /* i : number of subframes rendered */ - const Word16 slots_rendered /* i : number of CLDFB slots rendered */ + const Word16 subframes_rendered /* i : number of subframes rendered */ ) { VBAP_HANDLE hVBAPdata; @@ -520,28 +546,15 @@ void ivas_omasa_separate_object_render_jbm_fx( move16(); } - offsetSamples = i_mult( slots_rendered, hSpatParamRendCom->slot_size ); - FOR( j = 0; j < nchan_out_woLFE + num_lfe; j++ ) { output_fx_local[j] = output_fx[j]; } - IF( st_ivas->hDecoderConfig->Opt_tsm ) - { - FOR( obj = 0; obj < num_objects; obj++ ) - { - input_fx[obj] = &st_ivas->hTcBuffer->tc_fx[obj + 2][offsetSamples]; - move32(); - } - } - ELSE + FOR( obj = 0; obj < num_objects; obj++ ) { - FOR( obj = 0; obj < num_objects; obj++ ) - { - input_fx[obj] = input_fx_in[obj]; - move32(); - } + input_fx[obj] = input_fx_in[obj]; + move32(); } slots_to_render = idiv1616( nSamplesRendered, hSpatParamRendCom->slot_size ); @@ -559,13 +572,6 @@ void ivas_omasa_separate_object_render_jbm_fx( FOR( obj = 0; obj < num_objects; obj++ ) { /* Delay the signal to match CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ - IF( slots_rendered == 0 ) - { - Word16 tcBufferSize; - - tcBufferSize = i_mult( hSpatParamRendCom->num_slots, hSpatParamRendCom->slot_size ); - delay_signal32_fx( input_fx[obj], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer_fx[obj], st_ivas->hMasaIsmData->delayBuffer_size ); - } offsetSamples = 0; move16(); @@ -588,17 +594,38 @@ void ivas_omasa_separate_object_render_jbm_fx( IF( single_separated ) { - azimuth = st_ivas->hMasaIsmData->azimuth_separated_ism[md_idx]; - move16(); - elevation = st_ivas->hMasaIsmData->elevation_separated_ism[md_idx]; - move16(); + test(); + IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) && st_ivas->hMasaIsmData->ism_dir_is_edited[st_ivas->hMasaIsmData->idx_separated_ism] ) + { + azimuth = st_ivas->hMasaIsmData->azimuth_ism_edited_fx[st_ivas->hMasaIsmData->idx_separated_ism]; + move16(); + elevation = st_ivas->hMasaIsmData->elevation_ism_edited_fx[st_ivas->hMasaIsmData->idx_separated_ism]; + move16(); + } + ELSE + { + azimuth = st_ivas->hMasaIsmData->azimuth_separated_ism_fx[md_idx]; + move16(); + elevation = st_ivas->hMasaIsmData->elevation_separated_ism_fx[md_idx]; + move16(); + } } ELSE { - azimuth = st_ivas->hMasaIsmData->azimuth_ism[obj][md_idx]; - move16(); - elevation = st_ivas->hMasaIsmData->elevation_ism[obj][md_idx]; - move16(); + IF( st_ivas->hMasaIsmData->ism_dir_is_edited[obj] ) + { + azimuth = st_ivas->hMasaIsmData->azimuth_ism_edited_fx[obj]; + move16(); + elevation = st_ivas->hMasaIsmData->elevation_ism_edited_fx[obj]; + move16(); + } + ELSE + { + azimuth = st_ivas->hMasaIsmData->azimuth_ism_fx[obj][md_idx]; + move16(); + elevation = st_ivas->hMasaIsmData->elevation_ism_fx[obj][md_idx]; + move16(); + } } if ( st_ivas->hOutSetup.is_planar_setup ) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 1918ce3f30fea189a73b96d56220e4622530008b..c968e81b843a93e29e9f04f4a6a2977b87e34a57 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -51,23 +51,23 @@ * Local function prototypes *-----------------------------------------------------------------------*/ -static void ivas_jbm_dec_copy_tc( Decoder_Struct *st_ivas, const Word16 nSamplesForRendering, Word16 *nSamplesResidual, Word32 *data, Word32 *tc_digest_f[], Word16 data_q ); - static void ivas_jbm_dec_tc_buffer_playout_fx( Decoder_Struct *st_ivas, const UWord16 nSamplesAsked, UWord16 *nSamplesRendered, Word32 *output_fx[] ); static void ivas_jbm_dec_copy_masa_meta_to_buffer( Decoder_Struct *st_ivas ); static void ivas_jbm_masa_sf_to_slot_map( Decoder_Struct *st_ivas, const Word16 nCldfbTs ); - -static Word16 ceil_fx16( Word16 inp, Word16 Q ); -static Word16 ceil_fx16( Word16 inp, Word16 Q ) +static Word16 ceil_fx16( + const Word16 inp, + const Word16 Q ) { Word16 ret = shr( inp, Q ); + IF( ( s_and( inp, sub( shl( 1, Q ), 1 ) ) ) > 0 ) { ret = add( ret, 1 ); } + return ret; } @@ -78,11 +78,10 @@ static Word16 ceil_fx16( Word16 inp, Word16 Q ) *--------------------------------------------------------------------------*/ ivas_error ivas_jbm_dec_tc_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *data_fx /*Q11*/ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { - Word16 n, output_frame, nchan_out, i, ii; + Word16 ch, n, output_frame, nchan_out, i, ii; Decoder_State *st; /* used for bitstream handling */ Word32 *p_output_fx[MAX_TRANSPORT_CHANNELS]; /* buffer for output synthesis */ Word16 nchan_remapped; @@ -112,6 +111,7 @@ ivas_error ivas_jbm_dec_tc_fx( output_frame = extract_l( Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) /* output_Fs / FRAMES_PER_SEC */; + /* set pointers to transport channels audio */ FOR( n = 0; n < MAX_TRANSPORT_CHANNELS; n++ ) { p_output_fx[n] = st_ivas->p_output_fx[n]; @@ -122,22 +122,6 @@ ivas_error ivas_jbm_dec_tc_fx( } } - IF( st_ivas->hDecoderConfig->Opt_tsm == 0 ) - { - FOR( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) - { - set_zero_fx( st_ivas->p_output_fx[n], L_FRAME48k ); - st_ivas->hTcBuffer->tc_fx[n] = st_ivas->p_output_fx[n]; - } -#ifdef MSAN_FIX - st_ivas->hTcBuffer->no_channels = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - move16(); -#endif - } - - Word16 ch; - - /*----------------------------------------------------------------* * Decoding + pre-rendering *----------------------------------------------------------------*/ @@ -175,24 +159,7 @@ ivas_error ivas_jbm_dec_tc_fx( /* HP filtering */ FOR( n = 0; n < s_min( nchan_out, st_ivas->nchan_transport ); n++ ) { - hp20_fx_32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); - } - - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_MC ) && EQ_16( st_ivas->hDecoderConfig->nchan_out, 1 ) ) - { - s = Q16 - Q11; - move16(); - s = sub( s, find_guarded_bits_fx( st_ivas->nchan_transport ) ); - FOR( i = 0; i < s_max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport ); ++i ) - { - Scale_sig32( p_output_fx[i], output_frame, s ); // Q(11+s) - } - ivas_ls_setup_conversion_fx( st_ivas, st_ivas->nchan_transport, output_frame, p_output_fx, p_output_fx ); - FOR( i = 0; i < s_max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport ); ++i ) - { - Scale_sig32( p_output_fx[i], output_frame, negate( s ) ); // Q11 - } + hp20_fx_32_opt( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); } } ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) @@ -226,7 +193,10 @@ ivas_error ivas_jbm_dec_tc_fx( move16(); } } + ivas_ism_dtx_limit_noise_energy_for_near_silence_fx( st_ivas->hSCE, st_ivas->hISMDTX.sce_id_dtx, st_ivas->nchan_transport, Q_cngNoiseLevel ); + + ivas_param_ism_dec_dequant_md_fx( st_ivas ); } ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) { @@ -234,6 +204,8 @@ ivas_error ivas_jbm_dec_tc_fx( { return error; } + + ivas_param_ism_dec_dequant_md_fx( st_ivas ); } ELSE /* ISM_MODE_DISC */ { @@ -259,7 +231,7 @@ ivas_error ivas_jbm_dec_tc_fx( } /* HP filtering */ - hp20_fx_32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); + hp20_fx_32_opt( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); } test(); @@ -267,7 +239,7 @@ ivas_error ivas_jbm_dec_tc_fx( test(); IF( EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) { - ivas_mono_downmix_render_passive_fx( st_ivas, p_output_fx, output_frame ); + ivas_ism_mono_dmx_fx( st_ivas, p_output_fx, output_frame ); Scale_sig32( p_output_fx[0], L_FRAME48k, 3 ); } @@ -306,11 +278,6 @@ ivas_error ivas_jbm_dec_tc_fx( { return error; } - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); - } } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) { @@ -434,19 +401,13 @@ ivas_error ivas_jbm_dec_tc_fx( } IF( hCPE->hCoreCoder[0] != NULL ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q -#else - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q -#endif - hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; + hCPE->hCoreCoder[0]->hHQ_core->Q_old_out_fx32 = q; move16(); } IF( hCPE->hStereoDft != NULL ) { -#ifdef MSAN_FIX IF( LE_16( st_ivas->nchan_transport, 1 ) ) { st = hCPE->hCoreCoder[0]; @@ -494,9 +455,6 @@ ivas_error ivas_jbm_dec_tc_fx( } } } -#else - scale_sig32( hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ), sub( hCPE->hStereoDft->q_dft, Q11 ) ); -#endif scale_sig32( hCPE->hStereoDft->ap_delay_mem_fx, NS2SA_FX2( 16000, DELAY_BWE_TOTAL_NS ), sub( hCPE->hStereoDft->q_dft, hCPE->hStereoDft->q_ap_fade_mem_fx ) ); // q_dft hCPE->hStereoDft->q_ap_fade_mem_fx = hCPE->hStereoDft->q_dft; move16(); @@ -517,14 +475,10 @@ ivas_error ivas_jbm_dec_tc_fx( hCPE->q_output_mem_fx[ii] = hCPE->hStereoDft->q_dft; move16(); } -#ifdef MSAN_FIX FOR( ii = 0; ii < CPE_CHANNELS; ii++ ) { Scale_sig32( &hCPE->prev_synth_fx[ii][0], NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ), sub( hCPE->q_prev_synth_fx, Q11 ) ); // q_prev_synth_fx } -#else - Scale_sig32( &hCPE->prev_synth_fx[0][0], sizeof( hCPE->prev_synth_fx ) / sizeof( hCPE->prev_synth_fx[0][0] ), hCPE->q_prev_synth_fx - 11 ); -#endif ivas_sba_dirac_stereo_dec_fx( st_ivas, p_output_fx, output_frame, st_ivas->ivas_format == MC_FORMAT ); @@ -532,14 +486,10 @@ ivas_error ivas_jbm_dec_tc_fx( { Scale_sig32( p_output_fx[i], L_FRAME48k, negate( s ) ); } -#ifdef MSAN_FIX FOR( ii = 0; ii < CPE_CHANNELS; ii++ ) { Scale_sig32( &hCPE->prev_synth_fx[ii][0], NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->q_prev_synth_fx ) ); // Q11 } -#else - Scale_sig32( &hCPE->prev_synth_fx[0][0], sizeof( hCPE->prev_synth_fx ) / sizeof( hCPE->prev_synth_fx[0][0] ), 11 - hCPE->q_prev_synth_fx ); -#endif scale_sig32( hCPE->input_mem_BPF_fx[0], STEREO_DFT32MS_OVL_16k, sub( Q11, hCPE->hStereoDft->q_dft ) ); FOR( i = 0; i < CPE_CHANNELS; ++i ) @@ -555,7 +505,6 @@ ivas_error ivas_jbm_dec_tc_fx( } IF( hCPE->hStereoDft != NULL ) { -#ifdef MSAN_FIX IF( LE_16( st_ivas->nchan_transport, 1 ) ) { st = hCPE->hCoreCoder[0]; @@ -603,9 +552,6 @@ ivas_error ivas_jbm_dec_tc_fx( } } } -#else - scale_sig32( hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); // Q11 -#endif scale_sig32( hCPE->hStereoDft->ap_delay_mem_fx, NS2SA_FX2( 16000, DELAY_BWE_TOTAL_NS ), sub( Q11, hCPE->hStereoDft->q_ap_fade_mem_fx ) ); // Q11 hCPE->hStereoDft->q_ap_fade_mem_fx = Q11; test(); @@ -630,7 +576,7 @@ ivas_error ivas_jbm_dec_tc_fx( /* HP filtering */ FOR( n = 0; n < nchan_remapped; n++ ) { - hp20_fx_32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); + hp20_fx_32_opt( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); } IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) @@ -653,7 +599,7 @@ ivas_error ivas_jbm_dec_tc_fx( move16(); FOR( ch = 0; ch < nchan_transport; ch++ ) { - temp_min = getScaleFactor32( p_output_fx[ch], output_frame ); + temp_min = L_norm_arr( p_output_fx[ch], output_frame ); Q_p_output = s_min( Q_p_output, temp_min ); } Q_p_output = sub( Q_p_output, 2 ); @@ -695,11 +641,24 @@ ivas_error ivas_jbm_dec_tc_fx( { Word16 q_shift = 0; move16(); + ivas_masa_prerender_fx( st_ivas, p_output_fx, &q_shift, output_frame, nchan_remapped ); FOR( i = 0; i < 2; i++ ) { Scale_sig32( p_output_fx[i], output_frame, negate( q_shift ) ); } + + test(); + /* external output */ + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && EQ_32( st_ivas->hMasa->config.input_ivas_format, MASA_ISM_FORMAT ) ) + { + FOR( n = 0; n < st_ivas->nchan_ism; n++ ) + { + set_zero_fx( p_output_fx[add( st_ivas->nchan_transport, n )], output_frame ); + } + + ivas_omasa_rearrange_channels_fx( p_output_fx, st_ivas->nchan_ism, output_frame ); + } } ELSE IF( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) && ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) { @@ -810,32 +769,34 @@ ivas_error ivas_jbm_dec_tc_fx( FOR( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) { - hp20_fx_32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); + hp20_fx_32_opt( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); } Word16 output_q = 11; move16(); IF( EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) { - ivas_mono_downmix_render_passive_fx( st_ivas, p_output_fx, output_frame ); + ivas_ism_mono_dmx_fx( st_ivas, p_output_fx, output_frame ); output_q = 8; move16(); } ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { - /* sanity check in case of bitrate switching */ - IF( NE_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); + ivas_omasa_rearrange_channels_fx( p_output_fx, nchan_transport_ism, output_frame ); + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + /* Convert separate object to MASA, combine with the original MASA, and output combined MASA + empty objects. */ + ivas_omasa_combine_separate_ism_with_masa_fx( st_ivas, p_output_fx, &output_q, st_ivas->nchan_ism, output_frame ); + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + /* Extract objects from MASA, output MASA + all objects (i.e., extracted and separated objects) */ + ivas_omasa_render_objects_from_mix_fx( st_ivas, p_output_fx, st_ivas->nchan_ism, output_frame, &output_q ); } - - ivas_omasa_rearrange_channels_fx( p_output_fx, nchan_transport_ism, output_frame ); - - output_q = 11; - move16(); - - ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); } IF( NE_16( output_q, Q11 ) ) { @@ -843,6 +804,8 @@ ivas_error ivas_jbm_dec_tc_fx( { Scale_sig32( p_output_fx[n], output_frame, sub( Q11, output_q ) ); // Q11 } + st_ivas->hCPE[0]->q_output_mem_fx[0] = output_q; + st_ivas->hCPE[0]->q_output_mem_fx[1] = output_q; } } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) @@ -971,14 +934,9 @@ ivas_error ivas_jbm_dec_tc_fx( } IF( hCPE->hCoreCoder[0] != NULL ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ) ); // q Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ) ); // q -#else - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ) ); // q - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ) ); // q -#endif - hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; + hCPE->hCoreCoder[0]->hHQ_core->Q_old_out_fx32 = q; move16(); } IF( hCPE->hStereoDft != NULL ) @@ -1004,24 +962,16 @@ ivas_error ivas_jbm_dec_tc_fx( hCPE->q_output_mem_fx[ii] = hCPE->hStereoDft->q_dft; move16(); } -#ifdef MSAN_FIX FOR( i = 0; i < CPE_CHANNELS; i++ ) Scale_sig32( hCPE->prev_synth_fx[i], NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ), sub( hCPE->q_prev_synth_fx, Q11 ) ); // q_prev_synth_fx -#else - Scale_sig32( &hCPE->prev_synth_fx[0][0], sizeof( hCPE->prev_synth_fx ) / sizeof( hCPE->prev_synth_fx[0][0] ), hCPE->q_prev_synth_fx - 11 ); -#endif ivas_sba_dirac_stereo_dec_fx( st_ivas, &p_output_fx[sba_ch_idx], output_frame, 0 ); FOR( i = 0; i < 2; i++ ) { Scale_sig32( p_output_fx[sba_ch_idx + i], L_FRAME48k, negate( s ) ); } -#ifdef MSAN_FIX FOR( i = 0; i < CPE_CHANNELS; i++ ) Scale_sig32( hCPE->prev_synth_fx[i], NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ), sub( 11, hCPE->q_prev_synth_fx ) ); // Q11 -#else - Scale_sig32( &hCPE->prev_synth_fx[0][0], sizeof( hCPE->prev_synth_fx ) / sizeof( hCPE->prev_synth_fx[0][0] ), 11 - hCPE->q_prev_synth_fx ); -#endif scale_sig32( hCPE->input_mem_BPF_fx[0], STEREO_DFT32MS_OVL_16k, sub( Q11, hCPE->hStereoDft->q_dft ) ); // Q11 FOR( i = 0; i < CPE_CHANNELS; ++i ) @@ -1032,7 +982,6 @@ ivas_error ivas_jbm_dec_tc_fx( IF( hCPE->hCoreCoder[0] != NULL ) { - Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB, q ) ); // Q_old_wtda_LB Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, L_FRAME48k, sub( hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda, q ) ); // Q_old_wtda } @@ -1056,7 +1005,7 @@ ivas_error ivas_jbm_dec_tc_fx( /* HP filtering */ FOR( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) { - hp20_fx_32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); + hp20_fx_32_opt( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); } nchan_remapped = ivas_sba_remapTCs_fx( &p_output_fx[sba_ch_idx], st_ivas, output_frame ); @@ -1067,18 +1016,30 @@ ivas_error ivas_jbm_dec_tc_fx( { num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; - Word16 Q_p_output = 14; - move16(); Word16 nchan_transport; // num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; move16(); nchan_out = nchan_transport; move16(); + Word16 Q_p_output; + Word16 min_norm = 31; + move16(); + + FOR( ch = 0; ch < nchan_transport; ++ch ) + { + Word16 norm = L_norm_arr( p_output_fx[sba_ch_idx + ch], output_frame ); // Normalize per channel + min_norm = s_min( norm, min_norm ); + } + + Q_p_output = s_max( 3, sub( min_norm, 1 ) ); + + Q_p_output = s_min( Q_p_output, 19 ); // to restrict Q-factor of p_ouptut to Q30 FOR( ch = 0; ch < nchan_transport; ch++ ) { - Scale_sig32( p_output_fx[sba_ch_idx + ch], output_frame, sub( Q_p_output, Q11 ) ); // Q_p_output + Scale_sig32( p_output_fx[sba_ch_idx + ch], output_frame, Q_p_output ); // Q_p_output + Q11 } + Q_p_output = add( Q11, Q_p_output ); hSpar->hMdDec->Q_mixer_mat = 31; move16(); @@ -1118,7 +1079,7 @@ ivas_error ivas_jbm_dec_tc_fx( } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - ivas_mono_downmix_render_passive_fx( st_ivas, p_output_fx, output_frame ); + ivas_ism_mono_dmx_fx( st_ivas, p_output_fx, output_frame ); Scale_sig32( p_output_fx[0], L_FRAME48k, Q11 - Q8 ); // Q11 @@ -1131,8 +1092,6 @@ ivas_error ivas_jbm_dec_tc_fx( } ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) { - - // st = (st_ivas->nSCE > 0) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; IF( st_ivas->nSCE > 0 ) { st = st_ivas->hSCE[0]->hCoreCoder[0]; @@ -1152,12 +1111,13 @@ ivas_error ivas_jbm_dec_tc_fx( { return error; } + /* HP filtering */ FOR( n = 0; n < st_ivas->nchan_transport; n++ ) { IF( NE_16( n, LFE_CHANNEL ) ) { - hp20_fx_32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); + hp20_fx_32_opt( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); } } @@ -1210,12 +1170,13 @@ ivas_error ivas_jbm_dec_tc_fx( { return error; } + /* HP filtering */ FOR( n = 0; n < st_ivas->nchan_transport; n++ ) { IF( NE_16( n, LFE_CHANNEL ) ) { - hp20_fx_32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); + hp20_fx_32_opt( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); } } @@ -1281,7 +1242,7 @@ ivas_error ivas_jbm_dec_tc_fx( /* HP filtering */ FOR( n = 0; n < st_ivas->nchan_transport; n++ ) { - hp20_fx_32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); + hp20_fx_32_opt( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); } /* Rendering */ @@ -1299,7 +1260,6 @@ ivas_error ivas_jbm_dec_tc_fx( } /* read McMASA parameters from the bitstream */ - IF( NE_32( ( error = ivas_masa_decode_fx( st_ivas, st, &nb_bits_metadata[0] ) ), IVAS_ERR_OK ) ) { return error; @@ -1326,13 +1286,12 @@ ivas_error ivas_jbm_dec_tc_fx( move16(); /* Decode the separated channel to output[n] to be combined with the synthesized channels */ - set32_fx( p_output_fx[n], 0, L_FRAME48k ); - IF( NE_32( ( error = ivas_sce_dec_fx( st_ivas, 0, &p_output_fx[n], output_frame, 0 ) ), IVAS_ERR_OK ) ) { return error; } + test(); test(); test(); @@ -1342,8 +1301,7 @@ ivas_error ivas_jbm_dec_tc_fx( test(); /* Delay the separated channel to sync with CLDFB delay of the DirAC synthesis, and synthesize the LFE signal. */ IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_5_1 ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_7_1 ) || - EQ_32( output_config, IVAS_AUDIO_CONFIG_5_1_4 ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_7_1_4 ) || - EQ_32( output_config, IVAS_AUDIO_CONFIG_5_1_2 ) || ( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.num_lfe > 0 ) ) + EQ_32( output_config, IVAS_AUDIO_CONFIG_5_1_4 ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_7_1_4 ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_5_1_2 ) || ( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.num_lfe > 0 ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { ivas_lfe_synth_with_filters_fx( st_ivas->hMasa->hMasaLfeSynth, p_output_fx, output_frame, n, LFE_CHANNEL ); } @@ -1368,7 +1326,6 @@ ivas_error ivas_jbm_dec_tc_fx( } ELSE IF( EQ_16( st_ivas->nCPE, 1 ) ) { - IF( NE_32( ( error = ivas_cpe_dec_fx( st_ivas, 0, &p_output_fx[0], output_frame, nb_bits_metadata[0] ) ), IVAS_ERR_OK ) ) { return error; @@ -1420,14 +1377,9 @@ ivas_error ivas_jbm_dec_tc_fx( IF( hCPE->hCoreCoder[0] != NULL ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q -#else - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q -#endif - hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; + hCPE->hCoreCoder[0]->hHQ_core->Q_old_out_fx32 = q; move16(); } IF( hCPE->hStereoDft != NULL ) @@ -1458,23 +1410,15 @@ ivas_error ivas_jbm_dec_tc_fx( hCPE->q_output_mem_fx[ii] = hCPE->hStereoDft->q_dft; move16(); } -#ifdef MSAN_FIX FOR( i = 0; i < CPE_CHANNELS; i++ ) Scale_sig32( hCPE->prev_synth_fx[i], NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ), sub( hCPE->q_prev_synth_fx, Q11 ) ); // q_prev_synth_fx -#else - Scale_sig32( &hCPE->prev_synth_fx[0][0], sizeof( hCPE->prev_synth_fx ) / sizeof( hCPE->prev_synth_fx[0][0] ), hCPE->q_prev_synth_fx - 11 ); -#endif ivas_sba_dirac_stereo_dec_fx( st_ivas, p_output_fx, output_frame, 1 ); FOR( i = 0; i < 2; i++ ) { Scale_sig32( p_output_fx[i], L_FRAME48k, negate( s ) ); } -#ifdef MSAN_FIX FOR( i = 0; i < CPE_CHANNELS; i++ ) Scale_sig32( hCPE->prev_synth_fx[i], NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->q_prev_synth_fx ) ); // Q11 -#else - Scale_sig32( &hCPE->prev_synth_fx[0][0], sizeof( hCPE->prev_synth_fx ) / sizeof( hCPE->prev_synth_fx[0][0] ), 11 - hCPE->q_prev_synth_fx ); -#endif // MSAN_FIX scale_sig32( hCPE->input_mem_BPF_fx[0], STEREO_DFT32MS_OVL_16k, sub( Q11, hCPE->hStereoDft->q_dft ) ); FOR( i = 0; i < CPE_CHANNELS; ++i ) @@ -1509,7 +1453,7 @@ ivas_error ivas_jbm_dec_tc_fx( /* HP filtering */ FOR( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) { - hp20_fx_32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); + hp20_fx_32_opt( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); } IF( EQ_32( st_ivas->renderer_type, RENDERER_MCMASA_MONO_STEREO ) ) @@ -1519,21 +1463,6 @@ ivas_error ivas_jbm_dec_tc_fx( } } - /*----------------------------------------------------------------* - * Write IVAS transport channels - *----------------------------------------------------------------*/ - - IF( EQ_16( st_ivas->hDecoderConfig->Opt_tsm, 1 ) ) - { - ivas_syn_output_f_fx( p_output_fx, output_frame, st_ivas->hTcBuffer->nchan_transport_jbm, data_fx ); - } - ELSE - { - /* directly copy to tc buffers */ - /*note : the q of cldfb buffers (imag/real) are needed to be Q_p_output - 5 here 6 is taken for that*/ - ivas_jbm_dec_copy_tc_no_tsm_fx( st_ivas, p_output_fx, output_frame ); - } - /*----------------------------------------------------------------* * Common updates *----------------------------------------------------------------*/ @@ -1579,280 +1508,142 @@ ivas_error ivas_jbm_dec_tc_fx( /*--------------------------------------------------------------------------* - * ivas_jbm_dec_feed_tc_to_renderer() + * ivas_dec_feed_tc_to_renderer() * - * Feed decoded transport channels and metadata to the IVAS JBM renderer routine + * Feed decoded transport channels to the IVAS renderer routine + * + digest TC channels in ParamISM and ParamMC *--------------------------------------------------------------------------*/ + void ivas_jbm_dec_feed_tc_to_renderer_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word16 nSamplesForRendering, /* i : number of TC samples available for rendering */ - Word16 *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ - Word32 *data_fx /* i : transport channels Q11*/ + Word16 *nSamplesResidual /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ ) { - Word32 data_f_fx[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k] = { 0 }; /* Word32 buffer for transport channels that will be directly converted with the CLDFB */ - Word32 *p_data_f_fx[MAX_CLDFB_DIGEST_CHANNELS]; - Word16 i; + Word32 tmp_buf_fx[MAX_JBM_L_FRAME48k]; + Word32 *p_data_fx[FOA_CHANNELS + MAX_NUM_OBJECTS]; + Word16 n, n_render_timeslots, n_ch_cldfb; + Word16 ch, offset, len_offset; + DECODER_TC_BUFFER_HANDLE hTcBuffer; - FOR( i = 0; i < MAX_CLDFB_DIGEST_CHANNELS; i++ ) - { - set_zero_fx( data_f_fx[i], MAX_JBM_L_FRAME48k ); - } - if ( st_ivas->hTcBuffer ) - { - st_ivas->hTcBuffer->q_tc_fx = 11; - move16(); - } - Word16 n, n_render_timeslots; + hTcBuffer = st_ivas->hTcBuffer; + n_ch_cldfb = sub( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); + move16(); - push_wmops( "ivas_jbm_dec_feed_tc_to_rendererer" ); - FOR( n = 0; n < MAX_CLDFB_DIGEST_CHANNELS; n++ ) - { - p_data_f_fx[n] = &data_f_fx[n][0]; - } + hTcBuffer->q_tc_fx = Q11; + move16(); IF( st_ivas->hDecoderConfig->Opt_tsm ) { - ivas_jbm_dec_copy_tc( st_ivas, nSamplesForRendering, nSamplesResidual, data_fx, p_data_f_fx, 11 ); - } - ELSE - { - *nSamplesResidual = 0; - move16(); - } - n_render_timeslots = idiv1616( st_ivas->hTcBuffer->n_samples_available, st_ivas->hTcBuffer->n_samples_granularity ); + Word16 n_samples_still_available; + Word16 n_ch_full_copy, n_ch_res_copy; - test(); - IF( EQ_16( st_ivas->hTcBuffer->tc_buffer_mode, TC_BUFFER_MODE_BUFFER ) ) - { - ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + n_samples_still_available = sub( hTcBuffer->n_samples_buffered, hTcBuffer->n_samples_rendered ); + hTcBuffer->n_samples_buffered = add( add( n_samples_still_available, nSamplesForRendering ), hTcBuffer->n_samples_discard ); + hTcBuffer->n_samples_available = i_mult( hTcBuffer->n_samples_granularity, idiv1616( hTcBuffer->n_samples_buffered, hTcBuffer->n_samples_granularity ) ); + *nSamplesResidual = sub( hTcBuffer->n_samples_buffered, hTcBuffer->n_samples_available ); + move16(); + move16(); + move16(); + n_ch_full_copy = s_min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); + n_ch_res_copy = sub( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); - test(); - test(); - IF( ( EQ_16( st_ivas->ivas_format, MASA_FORMAT ) || EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) && EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); - } - } - ELSE IF( EQ_16( st_ivas->ivas_format, STEREO_FORMAT ) ) - { - ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); - } - ELSE IF( EQ_16( st_ivas->ivas_format, ISM_FORMAT ) ) - { - /* Rendering */ - IF( EQ_16( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + /* buffers are shared between 'hTcBuffer->tc[]' and 'p_output_f[]': + in case of 'length(hTcBuffer->tc[]) < length(p_output_f[])', reset of TC buffers + pointers is needed after ivas_buffer_interleaved_to_deinterleaved() */ + len_offset = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ); + IF( LT_16( len_offset, L_FRAME48k ) ) { - test(); - test(); - test(); - IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) - { - ivas_dirac_dec_set_md_map_fx( st_ivas, n_render_timeslots ); - - ivas_param_ism_params_to_masa_param_mapping_fx( st_ivas ); - } - ELSE IF( EQ_16( st_ivas->renderer_type, RENDERER_PARAM_ISM ) || EQ_16( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) ) + offset = 0; + move16(); + FOR( ch = 0; ch < s_max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch++ ) { - - ivas_param_ism_dec_digest_tc_fx( st_ivas, n_render_timeslots, p_data_f_fx, Q11 ); + hTcBuffer->tc_fx[ch] = &hTcBuffer->tc_buffer_fx[offset]; + st_ivas->p_output_fx[ch] = hTcBuffer->tc_fx[ch]; + offset = add( offset, len_offset ); } } - ELSE /* ISM_MODE_DISC */ - { - ivas_ism_dec_digest_tc_fx( st_ivas ); - } - } - ELSE IF( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) || EQ_16( st_ivas->ivas_format, MASA_FORMAT ) ) - { - IF( st_ivas->hSCE[0] ) + + FOR( ch = 0; ch < n_ch_full_copy; ch++ ) { - Word16 shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); - IF( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) - { - shift = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 4 ); - } - scale_sig32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); // Q(31-cngNoiseLevelExp+shift) - st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ); + Copy32( hTcBuffer->tc_fx[ch], tmp_buf_fx, nSamplesForRendering ); + set_zero_fx( hTcBuffer->tc_fx[ch], hTcBuffer->n_samples_discard ); + Copy32( hTcBuffer->tc_buffer_old_fx[ch], hTcBuffer->tc_fx[ch] + hTcBuffer->n_samples_discard, n_samples_still_available ); + Copy32( tmp_buf_fx, hTcBuffer->tc_fx[ch] + n_samples_still_available + hTcBuffer->n_samples_discard, nSamplesForRendering - *nSamplesResidual ); + Copy32( tmp_buf_fx + nSamplesForRendering - *nSamplesResidual, hTcBuffer->tc_buffer_old_fx[ch], *nSamplesResidual ); } - ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); - } - ELSE IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + IF( n_ch_res_copy > 0 ) { - ivas_ism_dec_digest_tc_fx( st_ivas ); - - test(); - test(); - test(); - test(); - /* delay the objects here for all renderers where it is needed */ - IF( - EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || - EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || - EQ_16( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || - EQ_16( st_ivas->renderer_type, RENDERER_OSBA_LS ) || - EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - FOR( n = 0; n < st_ivas->nchan_ism; n++ ) - { - delay_signal32_fx( st_ivas->hTcBuffer->tc_fx[n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hSbaIsmData->delayBuffer_fx[n], st_ivas->hSbaIsmData->delayBuffer_size ); - } - } - - IF( !st_ivas->sba_dirac_stereo_flag ) + FOR( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) { - IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) - { - Word16 temp, temp_e; - temp = BASOP_Util_Divide1616_Scale( st_ivas->hTcBuffer->n_samples_granularity, st_ivas->hSpatParamRendCom->slot_size, &temp_e ); - n_render_timeslots = extract_l( L_shr( L_mult0( n_render_timeslots, temp ), sub( 15, temp_e ) ) ); - } - - IF( st_ivas->hSCE[0] ) - { - Word16 shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); - if ( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) - { - shift = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 4 ); - } - scale_sig32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); // Q(31-cngNoiseLevelExp+shift) - st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ); - } - ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + p_data_fx[ch] = hTcBuffer->tc_fx[ch]; + Copy32( hTcBuffer->tc_fx[ch], tmp_buf_fx, nSamplesForRendering ); + Copy32( hTcBuffer->tc_buffer_old_fx[ch], p_data_fx[ch], n_samples_still_available ); + Copy32( tmp_buf_fx, p_data_fx[ch] + n_samples_still_available, sub( nSamplesForRendering, *nSamplesResidual ) ); + Copy32( tmp_buf_fx + nSamplesForRendering - *nSamplesResidual, hTcBuffer->tc_buffer_old_fx[ch], *nSamplesResidual ); } } - ELSE - { - ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); - IF( st_ivas->hSCE[0] ) - { - Word16 shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); - if ( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) - { - shift = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 4 ); - } - scale_sig32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); // Q(31-cngNoiseLevelExp+shift) - st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ); - } - ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); - } + n_render_timeslots = idiv1616( st_ivas->hTcBuffer->n_samples_available, st_ivas->hTcBuffer->n_samples_granularity ); } - ELSE IF( EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + ELSE { - test(); - IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + FOR( n = 0; n < n_ch_cldfb; n++ ) { - n_render_timeslots = i_mult( n_render_timeslots, idiv1616( st_ivas->hTcBuffer->n_samples_granularity, st_ivas->hSpatParamRendCom->slot_size ) ); + p_data_fx[n] = &st_ivas->p_output_fx[n][0]; + move16(); } - IF( st_ivas->hSCE[0] ) + ch = s_max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); + FOR( n = 0; n < ch; n++ ) { - Word16 shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); - if ( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) - { - shift = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 4 ); - } - scale_sig32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); // Q(31- (st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp - shift) - st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ); + hTcBuffer->tc_fx[n] = st_ivas->p_output_fx[n]; /* note: buffers needed in the TD decorellator */ move16(); } - ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); - IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - ivas_ism_dec_digest_tc_fx( st_ivas ); - } + hTcBuffer->n_samples_buffered = nSamplesForRendering; + hTcBuffer->n_samples_available = hTcBuffer->n_samples_buffered; + *nSamplesResidual = 0; + move16(); + move16(); + move16(); + + n_render_timeslots = DEFAULT_JBM_CLDFB_TIMESLOTS; + move16(); } - ELSE IF( EQ_16( st_ivas->ivas_format, MC_FORMAT ) ) + + /* CLDFB analysis for ParamMC/ParamISM */ + test(); + test(); + test(); + test(); + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) && ( EQ_32( st_ivas->renderer_type, RENDERER_PARAM_ISM ) || EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) ) ) { - IF( EQ_16( st_ivas->mc_mode, MC_MODE_MCT ) ) - { - ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); - } - ELSE IF( EQ_16( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) - { - ivas_mc_paramupmix_dec_digest_tc( st_ivas, (UWord8) n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); - } - ELSE IF( EQ_16( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) - { + ivas_param_ism_dec_digest_tc_fx( st_ivas, n_render_timeslots, p_data_fx, Q11 ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) && EQ_32( hTcBuffer->tc_buffer_mode, TC_BUFFER_MODE_RENDERER ) ) + { + ivas_param_mc_dec_digest_tc_fx( st_ivas, (UWord8) n_render_timeslots, p_data_fx, Q11 ); + } - Word16 nchan_transport = st_ivas->nchan_transport; - move16(); - Word16 nchan_out_transport = add( st_ivas->hTransSetup.nchan_out_woLFE, st_ivas->hTransSetup.num_lfe ); - Word16 nchan_out_cov; - test(); - test(); - IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) - { - nchan_out_cov = add( st_ivas->hTransSetup.nchan_out_woLFE, st_ivas->hTransSetup.num_lfe ); - } - ELSE IF( EQ_16( st_ivas->hParamMC->synthesis_conf, PARAM_MC_SYNTH_LS_CONV_CLDFB ) ) - { - nchan_out_cov = nchan_out_transport; - move16(); - } - ELSE IF( EQ_16( st_ivas->hParamMC->synthesis_conf, PARAM_MC_SYNTH_LS_CONV_COV ) || EQ_16( st_ivas->hParamMC->synthesis_conf, PARAM_MC_SYNTH_MONO_STEREO ) ) - { - nchan_out_cov = add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ); - } - ELSE - { - nchan_out_cov = nchan_out_transport; - move16(); - } - - scale_sig32( st_ivas->hParamMC->proto_matrix_int_fx, st_ivas->hParamMC->proto_matrix_int_len, -1 ); // Q(31-1) - st_ivas->hParamMC->proto_matrix_int_e = 1; - move16(); - - ivas_param_mc_dec_digest_tc_fx( st_ivas, (UWord8) n_render_timeslots, (Word32 **) p_data_f_fx, Q11 ); - - scale_sig32( st_ivas->hParamMC->proto_matrix_int_fx, st_ivas->hParamMC->proto_matrix_int_len, 1 ); // Q(31-1+1) - - Word16 shift; - FOR( Word16 param_band_idx = 0; param_band_idx < st_ivas->hParamMC->num_param_bands_synth; param_band_idx++ ) - { - shift = getScaleFactor32( st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_fx[param_band_idx], s_min( st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_len, nchan_transport * nchan_transport ) ); - scale_sig32( st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_fx[param_band_idx], s_min( st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_len, i_mult( nchan_transport, nchan_transport ) ), shift ); // Q(31-cx_old_e+shift) - st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_e[param_band_idx] = sub( st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_e[param_band_idx], shift ); - move16(); - - shift = getScaleFactor32( st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old_fx[param_band_idx], nchan_out_cov * nchan_out_cov ); - scale_sig32( st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old_fx[param_band_idx], i_mult( nchan_out_cov, nchan_out_cov ), shift ); // Q(31-cy_old_e+shift) - st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old_e[param_band_idx] = sub( st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old_e[param_band_idx], shift ); - move16(); - } - } - ELSE IF( EQ_16( st_ivas->mc_mode, MC_MODE_MCMASA ) ) - { - IF( st_ivas->hSCE[0] ) - { - Word16 shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); - if ( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) - { - shift = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 4 ); - } - scale_sig32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); // Q(31-cngNoiseLevelExp+shift) - st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ); - move16(); - } - ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); - } - } + hTcBuffer->n_samples_rendered = 0; + move16(); + hTcBuffer->subframes_rendered = 0; + move16(); - pop_wmops(); return; } + /*--------------------------------------------------------------------------* * ivas_dec_render() * * Principal IVAS JBM rendering routine *--------------------------------------------------------------------------*/ + ivas_error ivas_jbm_dec_render_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const UWord16 nSamplesAsked, /* i : number of samples wanted */ @@ -1873,14 +1664,13 @@ ivas_error ivas_jbm_dec_render_fx( Word16 subframe_len, gd_bits, exp, nchan_in, i, j, ch; const Word16 output_q_factor = Q11; move16(); - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + Word16 nchan_out_syn_output; push_wmops( "ivas_dec_render" ); /*----------------------------------------------------------------* * Initialization of local vars after struct has been set *----------------------------------------------------------------*/ - hSpatParamRendCom = st_ivas->hSpatParamRendCom; output_Fs = st_ivas->hDecoderConfig->output_Fs; move32(); nchan_out = st_ivas->hDecoderConfig->nchan_out; @@ -1896,30 +1686,23 @@ ivas_error ivas_jbm_dec_render_fx( { p_output_fx[n] = st_ivas->p_output_fx[n]; } + IF( !st_ivas->hDecoderConfig->Opt_tsm ) { - FOR( n = 0; n < st_ivas->hTcBuffer->nchan_buffer_full; n++ ) - { - p_tc_fx[n] = p_output_fx[n]; - } - - FOR( n = 0; n < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + FOR( n = 0; n < MAX_INTERN_CHANNELS; n++ ) { st_ivas->hTcBuffer->tc_fx[n] = st_ivas->p_output_fx[n]; } } - ELSE + + FOR( n = 0; n < st_ivas->hTcBuffer->nchan_buffer_full; n++ ) { - FOR( n = 0; n < st_ivas->hTcBuffer->nchan_buffer_full; n++ ) - { - p_tc_fx[n] = &st_ivas->hTcBuffer->tc_fx[n][st_ivas->hTcBuffer->n_samples_rendered]; - } + p_tc_fx[n] = &st_ivas->hTcBuffer->tc_fx[n][st_ivas->hTcBuffer->n_samples_rendered]; } -#ifdef MSAN_FIX st_ivas->hTcBuffer->no_channels = st_ivas->hTcBuffer->nchan_buffer_full; move16(); -#endif // MSAN_FIX + /*----------------------------------------------------------------* * Update combined orientation access index *----------------------------------------------------------------*/ @@ -1954,16 +1737,35 @@ ivas_error ivas_jbm_dec_render_fx( ivas_jbm_dec_tc_buffer_playout_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output_fx ); } - ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) || EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) { + *nSamplesRendered = s_min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + move16(); + /* Rendering */ IF( EQ_32( st_ivas->renderer_type, RENDERER_MC ) ) { - *nSamplesRendered = s_min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); - move16(); ivas_ls_setup_conversion_fx( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc_fx, p_output_fx ); } + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) ) + { + IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) + { + /* routed to W */ + ivas_jbm_dec_tc_buffer_playout_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output_fx ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) + { + FOR( n = 0; n < *nSamplesRendered; n++ ) + { + Word32 tmp; + tmp = p_output_fx[0][n]; + p_output_fx[0][n] = L_shr( L_add( tmp, p_output_fx[1][n] ), 1 ); /* W = 0.5 * ( L + R ) */ + p_output_fx[1][n] = L_shr( L_sub( tmp, p_output_fx[1][n] ), 1 ); /* Y = 0.5 * ( L - R ) */ + } + } + } } ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { @@ -1977,12 +1779,6 @@ ivas_error ivas_jbm_dec_render_fx( { ivas_dirac_dec_binaural_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, st_ivas->nchan_transport, p_output_fx ); } - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) - { - *nSamplesRendered = s_min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); - move16(); - ivas_apply_non_diegetic_panning_fx( p_output_fx, st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); - } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_PARAM_ISM ) || EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) ) { ivas_param_ism_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx ); @@ -2005,19 +1801,22 @@ ivas_error ivas_jbm_dec_render_fx( IF( EQ_32( st_ivas->renderer_type, RENDERER_TD_PANNING ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) { /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ - ivas_ism_render_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ); + ivas_ism_render_sf_fx( st_ivas, st_ivas->renderer_type, p_output_fx, *nSamplesRendered ); } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) { - ivas_apply_non_diegetic_panning_fx( p_output_fx, st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); + ivas_apply_non_diegetic_panning_fx( p_tc_fx[0], p_output_fx, st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); } +#ifdef DEBUGGING ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) +#else + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) ) +#endif { - /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ -#ifdef MSAN_FIX + /* Convert to Ambisonics */ FOR( i = 0; i < st_ivas->nchan_transport; i++ ) { - FOR( j = 0; j < 16; j++ ) + FOR( j = 0; j < HOA3_CHANNELS; j++ ) { st_ivas->hIsmRendererData->gains_fx[i][j] = L_shr( st_ivas->hIsmRendererData->gains_fx[i][j], 1 ); // Q30 -> Q29 move32(); @@ -2025,25 +1824,15 @@ ivas_error ivas_jbm_dec_render_fx( move32(); } } -#else - FOR( i = 0; i < 15; i++ ) - { - FOR( j = 0; j < 16; j++ ) - { - st_ivas->hIsmRendererData->gains_fx[i][j] = L_shr( st_ivas->hIsmRendererData->gains_fx[i][j], 1 ); // Q30 -> Q29 - st_ivas->hIsmRendererData->prev_gains_fx[i][j] = L_shr( st_ivas->hIsmRendererData->prev_gains_fx[i][j], 1 ); // Q30 -> Q29 - } - } -#endif - ivas_ism2sba_sf_fx( st_ivas->hTcBuffer->tc_fx, p_output_fx, st_ivas->hIsmRendererData, st_ivas->nchan_transport, *nSamplesRendered, st_ivas->hTcBuffer->n_samples_rendered, st_ivas->hIntSetup.ambisonics_order ); + + ivas_ism2sba_sf_fx( p_tc_fx, p_output_fx, st_ivas->hIsmRendererData, st_ivas->nchan_transport, *nSamplesRendered, st_ivas->hTcBuffer->n_samples_rendered, st_ivas->hIntSetup.ambisonics_order ); + Word16 sba_num_chans = imult1616( add( st_ivas->hIntSetup.ambisonics_order, 1 ), add( st_ivas->hIntSetup.ambisonics_order, 1 ) ); FOR( j = 0; j < sba_num_chans; j++ ) { scale_sig32( p_output_fx[j], *nSamplesRendered, sub( Q11, sub( add( output_q_factor, 29 ), 31 ) ) ); // Q11 } - -#ifdef MSAN_FIX FOR( i = 0; i < st_ivas->nchan_transport; i++ ) { FOR( j = 0; j < 16; j++ ) @@ -2054,24 +1843,24 @@ ivas_error ivas_jbm_dec_render_fx( move32(); } } -#else - FOR( i = 0; i < 15; i++ ) - { - FOR( j = 0; j < 16; j++ ) - { - st_ivas->hIsmRendererData->gains_fx[i][j] = L_shl( st_ivas->hIsmRendererData->gains_fx[i][j], 1 ); // Q29 -> Q30 - st_ivas->hIsmRendererData->prev_gains_fx[i][j] = L_shl( st_ivas->hIsmRendererData->prev_gains_fx[i][j], 1 ); // Q29 -> Q30 - } - } -#endif } /* Binaural rendering */ IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) { - IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - return error; + IF( ( error = ivas_td_binaural_renderer_sf_splitBinaural( st_ivas, p_output_fx, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE + { + IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) + { + return error; + } } } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) @@ -2092,10 +1881,12 @@ ivas_error ivas_jbm_dec_render_fx( { scale_sig32( p_output_fx[i], *nSamplesRendered, negate( sub( 11, *st_ivas->hCrendWrapper->p_io_qfactor ) ) ); // Q11 } - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output_fx, p_output_fx, *nSamplesRendered, output_Fs ) ), IVAS_ERR_OK ) ) + + IF( NE_32( ( error = ivas_rend_crendProcessSubframe_fx( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output_fx, p_output_fx, *nSamplesRendered, output_Fs, 0 ) ), IVAS_ERR_OK ) ) { return error; } + FOR( i = 0; i < nchan_out; i++ ) { scale_sig32( p_output_fx[i], *nSamplesRendered, sub( 11, *st_ivas->hCrendWrapper->p_io_qfactor ) ); // Q11 @@ -2116,31 +1907,14 @@ ivas_error ivas_jbm_dec_render_fx( } ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { - IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_DEC ) ) - { - *nSamplesRendered = s_min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); - move16(); - FOR( n = 0; n < nchan_remapped; n++ ) - { - Copy32( st_ivas->hTcBuffer->tc_fx[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output_fx[n], *nSamplesRendered ); - } - IF( NE_32( ( error = ivas_sba_linear_renderer_fx( p_output_fx, *nSamplesRendered, nchan_remapped, 0, output_config, st_ivas->hOutSetup ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) + IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) { ivas_dirac_dec_render_fx( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx ); } } ELSE { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx ) ), IVAS_ERR_OK ) ) -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx, 960 ) ), IVAS_ERR_OK ) ) -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ { return error; } @@ -2152,6 +1926,7 @@ ivas_error ivas_jbm_dec_render_fx( move16(); test(); test(); + test(); IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { test(); @@ -2171,6 +1946,11 @@ ivas_error ivas_jbm_dec_render_fx( { ivas_omasa_dirac_rend_jbm_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output_fx ); } + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) || EQ_32( st_ivas->renderer_type, RENDERER_OMASA_MIX_EXT ) ) + { + ivas_jbm_dec_tc_buffer_playout_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output_fx ); + ivas_omasa_rearrange_channels_fx( p_output_fx, st_ivas->nchan_ism, *nSamplesRendered ); + } } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { @@ -2188,11 +1968,7 @@ ivas_error ivas_jbm_dec_render_fx( hSpar->hMdDec->Q_mixer_mat = 30; move16(); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE IF( NE_32( ( error = ivas_osba_dirac_td_binaural_jbm_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx ) ), IVAS_ERR_OK ) ) -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - IF( NE_32( ( error = ivas_osba_dirac_td_binaural_jbm_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx, 960 ) ), IVAS_ERR_OK ) ) -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ { return error; } @@ -2213,13 +1989,10 @@ ivas_error ivas_jbm_dec_render_fx( } /* render objects */ - ivas_ism_render_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ); + ivas_ism_render_sf_fx( st_ivas, st_ivas->renderer_type, p_output_fx, *nSamplesRendered ); /* add already rendered SBA part */ - FOR( n = 0; n < nchan_out; n++ ) - { - v_add_fixed( p_output_fx[n], p_tc_fx[n + st_ivas->nchan_ism], p_output_fx[n], *nSamplesRendered, 0 ); - } + ivas_osba_stereo_add_channels_fx( p_tc_fx, p_output_fx, st_ivas->hSbaIsmData->gain_bed_fx, nchan_out, st_ivas->nchan_ism, st_ivas->ism_mode, *nSamplesRendered ); } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { @@ -2228,29 +2001,21 @@ ivas_error ivas_jbm_dec_render_fx( return error; } } - ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) /*EXT output = individual objects + HOA3*/ + ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) /*EXT output = individual objects + HOA3*/ { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, &p_output_fx[st_ivas->nchan_ism] ) ), IVAS_ERR_OK ) ) -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, &p_output_fx[st_ivas->nchan_ism], 960 ) ), IVAS_ERR_OK ) ) -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ { return error; } FOR( n = 0; n < st_ivas->nchan_ism; n++ ) { - Copy32( st_ivas->hTcBuffer->tc_fx[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output_fx[n], *nSamplesRendered ); + Copy32( p_tc_fx[n], p_output_fx[n], *nSamplesRendered ); } } ELSE { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx ) ), IVAS_ERR_OK ) ) -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx, 960 ) ), IVAS_ERR_OK ) ) -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ { return error; } @@ -2259,19 +2024,20 @@ ivas_error ivas_jbm_dec_render_fx( ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { ivas_dirac_dec_binaural_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output_fx ); + + FOR( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ ) + { + scale_sig32( p_output_fx[n], *nSamplesRendered, 1 ); + } } ELSE { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx ) ), IVAS_ERR_OK ) ) -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx, 960 ) ), IVAS_ERR_OK ) ) -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ { return error; } - IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { FOR( n = st_ivas->hIntSetup.nchan_out_woLFE - 1; n >= 0; n-- ) { @@ -2282,6 +2048,10 @@ ivas_error ivas_jbm_dec_render_fx( set32_fx( p_output_fx[n], 0, *nSamplesRendered ); } } + FOR( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ ) + { + scale_sig32( p_output_fx[n], *nSamplesRendered, 1 ); + } } } ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) @@ -2328,30 +2098,60 @@ ivas_error ivas_jbm_dec_render_fx( *st_ivas->hCrendWrapper->p_io_qfactor = exp; move16(); - FOR( i = 0; i < nchan_in; i++ ) + IF( crendInPlaceRotation ) { - scale_sig32( p_output_fx[i], *nSamplesRendered, negate( sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ) ); // Q11 - IF( st_ivas->hDecoderConfig->Opt_tsm ) + FOR( i = 0; i < nchan_in; i++ ) { - scale_sig32( p_tc_fx[i], *nSamplesRendered, negate( sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ) ); // Q11 + scale_sig32( p_output_fx[i], *nSamplesRendered, negate( sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ) ); // Q = *st_ivas->hCrendWrapper->p_io_qfactor } } - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, - &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output_fx : p_tc_fx, p_output_fx, *nSamplesRendered, output_Fs ) ), - IVAS_ERR_OK ) ) + ELSE { - return error; + FOR( i = 0; i < nchan_in; i++ ) + { + scale_sig32( p_tc_fx[i], *nSamplesRendered, negate( sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ) ); // Q = *st_ivas->hCrendWrapper->p_io_qfactor + } } - ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_tc_fx, p_output_fx ); - - FOR( i = 0; i < nchan_in; i++ ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - scale_sig32( p_output_fx[i], *nSamplesRendered, sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ); // Q11 - IF( st_ivas->hDecoderConfig->Opt_tsm ) + IF( ( error = ivas_rend_crendProcessSubframesSplitBin( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, ( st_ivas->hSplitBinRend == NULL ) ? NULL : &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, + &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, p_output_fx, p_output_fx, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE + { + IF( NE_32( ( error = ivas_rend_crendProcessSubframe_fx( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, + &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, p_output_fx, p_output_fx, *nSamplesRendered, output_Fs, 0 ) ), + IVAS_ERR_OK ) ) { - scale_sig32( p_tc_fx[i], *nSamplesRendered, sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ); // Q11 + return error; } + + // Todo main-pc update: This might be needed also in the split rendering path + ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_tc_fx, p_output_fx ); + } + + IF( crendInPlaceRotation ) + { + n = nchan_in; + } + ELSE + { + n = nchan_out; + } + move16(); + + FOR( i = 0; i < n; i++ ) + { + scale_sig32( p_output_fx[i], *nSamplesRendered, sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ); // Q11 + } + + FOR( i = n; i < nchan_in; i++ ) + { + scale_sig32( p_tc_fx[i], *nSamplesRendered, sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ); // Q11 } } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MC ) ) @@ -2367,24 +2167,38 @@ ivas_error ivas_jbm_dec_render_fx( } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) { - IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - return error; + IF( NE_32( ( error = ivas_td_binaural_renderer_sf_splitBinaural( st_ivas, p_output_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) + { + return error; + } } + else + { + IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) + { + return error; + } - ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_tc_fx, p_output_fx ); + ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_tc_fx, p_output_fx ); + } } } ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) { - ivas_mc_paramupmix_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_tc_fx, p_output_fx ); + ivas_mc_paramupmix_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_tc_fx, p_output_fx ); test(); test(); /* Rendering */ IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) && !st_ivas->hDecoderConfig->Opt_Headrotation ) { - ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_output_fx, p_output_fx ); + /* handled in CLDFB domain already */ + IF( NE_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_output_fx, p_output_fx ); + } } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MC ) ) { @@ -2394,15 +2208,6 @@ ivas_error ivas_jbm_dec_render_fx( { ivas_mc2sba_fx( st_ivas->hIntSetup, p_output_fx, p_output_fx, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0 ); } - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) - { - IF( NE_32( ( error = ivas_td_binaural_renderer_fx( st_ivas, p_output_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) - { - return error; - } - - ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_output_fx, p_output_fx ); - } } ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) { @@ -2411,7 +2216,7 @@ ivas_error ivas_jbm_dec_render_fx( Word16 nchan_out_cldfb = 0; move16(); - set16_fx( channel_active_fx, 0, MAX_CICP_CHANNELS ); + set16_fx( channel_active_fx, 0, MAX_LS_CHANNELS ); Word16 nchan_transport_tmp = st_ivas->nchan_transport; move16(); output_Fs = st_ivas->hDecoderConfig->output_Fs; @@ -2511,7 +2316,6 @@ ivas_error ivas_jbm_dec_render_fx( } ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) { - Word16 offset = imult1616( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->slot_size ); nchan_remapped = st_ivas->nchan_transport; move16(); @@ -2534,7 +2338,7 @@ ivas_error ivas_jbm_dec_render_fx( /* we still need to copy the separate channel if available */ IF( st_ivas->hOutSetup.separateChannelEnabled ) { - Copy32( st_ivas->hTcBuffer->tc_fx[LFE_CHANNEL - 1] + offset, p_output_fx[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); + Copy32( p_tc_fx[LFE_CHANNEL - 1], p_output_fx[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); } ivas_mc2sba_fx( st_ivas->hIntSetup, p_output_fx, p_output_fx, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0 ); @@ -2562,13 +2366,12 @@ ivas_error ivas_jbm_dec_render_fx( EQ_32( output_config, IVAS_AUDIO_CONFIG_5_1_4 ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_7_1_4 ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_5_1_2 ) || ( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && GT_16( st_ivas->hOutSetup.num_lfe, 0 ) ) ) { - Copy32( st_ivas->hTcBuffer->tc_fx[LFE_CHANNEL] + offset, p_output_fx[LFE_CHANNEL], *nSamplesRendered ); - Copy32( st_ivas->hTcBuffer->tc_fx[LFE_CHANNEL - 1] + offset, p_output_fx[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); + Copy32( p_tc_fx[LFE_CHANNEL], p_output_fx[LFE_CHANNEL], *nSamplesRendered ); + Copy32( p_tc_fx[LFE_CHANNEL - 1], p_output_fx[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); } ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.num_lfe == 0 ) { - /* Delay the separated channel to sync with the DirAC rendering */ - Copy32( st_ivas->hTcBuffer->tc_fx[LFE_CHANNEL - 1] + offset, p_output_fx[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); + Copy32( p_tc_fx[LFE_CHANNEL - 1], p_output_fx[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); } } } @@ -2590,7 +2393,7 @@ ivas_error ivas_jbm_dec_render_fx( IF( st_ivas->hTcBuffer->n_samples_discard > 0 ) { - FOR( n = 0; n < s_min( MAX_OUTPUT_CHANNELS, ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); n++ ) + FOR( n = 0; n < s_min( MAX_OUTPUT_CHANNELS, ivas_get_nchan_buffers_dec_fx( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); n++ ) { p_output_fx[n] += st_ivas->hTcBuffer->n_samples_discard; } @@ -2600,6 +2403,39 @@ ivas_error ivas_jbm_dec_render_fx( move16(); } + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + const Word32 *p_output_fx_const[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; + + nchan_out_syn_output = i_mult( BINAURAL_CHANNELS, st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ); + + /* Save TD signals for pose correction if they are to be used. + * + * NOTE: Here BASOP differs from the float version. In float, we push samples to TD ring buffer in lib_dec.c function isar_render_poses. */ + IF( st_ivas->hSplitBinRend->hMultiBinTdData != NULL ) + { + FOR( i = 0; i < nchan_out_syn_output; i++ ) + { + p_output_fx_const[i] = p_output_fx[i]; + } + ivas_TD_RINGBUF_PushChannels( st_ivas->hSplitBinRend->hMultiBinTdData, p_output_fx_const, *nSamplesRendered ); + } + +#ifdef TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR + if ( st_ivas->flushing ) + { + nchan_out_syn_output = BINAURAL_CHANNELS; + move16(); + } +#endif + } + ELSE + { + nchan_out_syn_output = nchan_out; + move16(); + } + + IF( is_split_rendering_enabled( st_ivas->hDecoderConfig, st_ivas->hRenderConfig ) == 0 ) { IF( NE_32( st_ivas->ivas_format, MONO_FORMAT ) ) { @@ -2609,7 +2445,7 @@ ivas_error ivas_jbm_dec_render_fx( } } - ivas_syn_output_fx( p_output_fx, output_q_factor, *nSamplesRendered, nchan_out, data ); + ivas_syn_output_fx( p_output_fx, output_q_factor, *nSamplesRendered, nchan_out_syn_output, data ); *nSamplesAvailableNext = st_ivas->hTcBuffer->n_samples_available; move16(); @@ -2619,7 +2455,7 @@ ivas_error ivas_jbm_dec_render_fx( } /*--------------------------------------------------------------------------* - * ivas_jbm_dec_dec_flush_renderer() + * ivas_jbm_dec_flush_renderer() * * Flush samples if renderer granularity changes on a bitrate change *--------------------------------------------------------------------------*/ @@ -2641,9 +2477,9 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( Word16 n_slots_still_available; Word16 n_samples_to_render; DECODER_TC_BUFFER_HANDLE hTcBuffer; - Word32 output_fx[MAX_CICP_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; - Word32 *p_output_fx[MAX_CICP_CHANNELS]; + Word32 *p_output_fx[MAX_LS_CHANNELS + MAX_NUM_OBJECTS]; Word16 nchan_in, nchan_out; + IF( !st_ivas->hDecoderConfig->Opt_tsm ) { return IVAS_ERR_OK; @@ -2674,14 +2510,14 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( { Word16 ch_idx; - /* render what is still there with zero padding */ - FOR( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) + /* render available full slots (with new lower granularity) */ + FOR( ch_idx = 0; ch_idx < s_max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) { /* move it at the beginning of the TC buffer with zero padding */ - Copy32( hTcBuffer->tc_fx[ch_idx] + hTcBuffer->n_samples_rendered, hTcBuffer->tc_fx[ch_idx], n_samples_to_render ); - set_zero_fx( hTcBuffer->tc_fx[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render ); - Copy32( hTcBuffer->tc_fx[ch_idx] + hTcBuffer->n_samples_rendered + n_samples_to_render, hTcBuffer->tc_fx[ch_idx] + hTcBuffer->n_samples_granularity, n_samples_still_available ); + Copy32( hTcBuffer->tc_buffer_old_fx[ch_idx], hTcBuffer->tc_fx[ch_idx], n_samples_to_render ); + set_zero_fx( hTcBuffer->tc_fx[ch_idx] + n_samples_to_render, sub( hTcBuffer->n_samples_granularity, n_samples_to_render ) ); } + /* simple change of the slot info */ hTcBuffer->num_slots = 1; hTcBuffer->nb_subframes = 1; @@ -2691,11 +2527,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( hTcBuffer->n_samples_buffered = add( hTcBuffer->n_samples_granularity, n_samples_still_available ); hTcBuffer->n_samples_available = 0; hTcBuffer->n_samples_flushed = n_samples_to_render; -#ifdef CR_FIX_JBM_FLUSH_OFFSET hTcBuffer->n_samples_rendered = 0; -#else - hTcBuffer->n_samples_rendered = hTcBuffer->n_samples_granularity; -#endif move16(); move16(); move16(); @@ -2706,9 +2538,9 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( move16(); move16(); - FOR( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) + FOR( ch_idx = 0; ch_idx < ( MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS ); ch_idx++ ) { - p_output_fx[ch_idx] = output_fx[ch_idx]; + p_output_fx[ch_idx] = st_ivas->p_output_fx[ch_idx]; } test(); @@ -2726,17 +2558,17 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( } ELSE IF( EQ_16( renderer_type_old, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) { - /*TODO :To be tested : no stream entering---------------------------------------*/ /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ set16_fx( st_ivas->hIsmRendererData->interpolator_fx, 32767, hTcBuffer->n_samples_granularity ); // 32767=1.0f in Q15 - ivas_ism_render_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ); + ivas_ism_render_sf_fx( st_ivas, renderer_type_old, p_output_fx, hTcBuffer->n_samples_granularity ); st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; *st_ivas->hCrendWrapper->p_io_qfactor = 11; + move16(); - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, - NULL, NULL, st_ivas->hTcBuffer, p_output_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ), + IF( NE_32( ( error = ivas_rend_crendProcessSubframe_fx( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, + NULL, NULL, st_ivas->hTcBuffer, p_output_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs, 0 ) ), IVAS_ERR_OK ) ) { return error; @@ -2752,38 +2584,68 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( { IF( EQ_16( mc_mode_old, MC_MODE_MCT ) ) { + Word16 crendInPlaceRotation = FALSE; + + test(); + test(); + test(); + IF( NE_16( st_ivas->transport_config, intern_config_old ) && ( EQ_16( intern_config_old, IVAS_AUDIO_CONFIG_FOA ) || EQ_16( intern_config_old, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_16( intern_config_old, IVAS_AUDIO_CONFIG_HOA3 ) ) ) + { + IF( GT_16( sub( add( hIntSetupOld->nchan_out_woLFE, hIntSetupOld->num_lfe ), add( st_ivas->hTransSetup.nchan_out_woLFE, st_ivas->hTransSetup.num_lfe ) ), 0 ) ) + { + crendInPlaceRotation = TRUE; + move16(); + ivas_mc2sba_fx( st_ivas->hTransSetup, hTcBuffer->tc_fx, p_output_fx, hTcBuffer->n_samples_granularity, hIntSetupOld->ambisonics_order, GAIN_LFE_FX ); + } + } + test(); IF( EQ_16( renderer_type_old, RENDERER_BINAURAL_MIXER_CONV ) || EQ_16( renderer_type_old, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) { - /*TODO :To be tested : no stream entering*/ st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; IF( NE_32( ( error = getAudioConfigNumChannels( intern_config_old, &nchan_in ) ), IVAS_ERR_OK ) ) { return error; } + IF( NE_32( ( error = getAudioConfigNumChannels( st_ivas->hOutSetup.output_config, &nchan_out ) ), IVAS_ERR_OK ) ) { return error; } - *st_ivas->hCrendWrapper->p_io_qfactor = 11; - move16(); - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, - hIntSetupOld, st_ivas->hEFAPdata, st_ivas->hTcBuffer, hTcBuffer->tc_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ), + Word16 subframe_len, gd_bits; + subframe_len = imult1616( st_ivas->hTcBuffer->subframe_nbslots[0], st_ivas->hTcBuffer->n_samples_granularity ); + gd_bits = find_guarded_bits_fx( subframe_len ); + *st_ivas->hCrendWrapper->p_io_qfactor = sub( 13, gd_bits ); + FOR( Word16 i = 0; i < nchan_in; i++ ) + { + scale_sig32( p_output_fx[i], *nSamplesRendered, sub( *st_ivas->hCrendWrapper->p_io_qfactor, Q11 ) ); // Q = *st_ivas->hCrendWrapper->p_io_qfactor + } + IF( NE_32( error = ivas_rend_crendProcessSubframe_fx( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, + hIntSetupOld, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output_fx : st_ivas->hTcBuffer->tc_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs, 0 ), IVAS_ERR_OK ) ) { return error; } ivas_binaural_add_LFE_fx( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc_fx, p_output_fx ); + FOR( Word16 i = 0; i < nchan_in; i++ ) + { + scale_sig32( p_output_fx[i], *nSamplesRendered, sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ); // Q11 + } } - ELSE IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) + ELSE IF( EQ_16( renderer_type_old, RENDERER_BINAURAL_OBJECTS_TD ) ) { IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, hTcBuffer->n_samples_granularity ) ), IVAS_ERR_OK ) ) { return error; } + ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc_fx, p_output_fx ); } + ELSE + { + return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong renderer in MCT VoIP renderer flushing!" ); + } } ELSE { @@ -2794,8 +2656,14 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( { IF( EQ_16( ism_mode_old, ISM_MASA_MODE_DISC ) ) { - Word32 *tc_local_fx[MAX_TRANSPORT_CHANNELS]; + Word32 *tc_local_fx[MAX_NUM_OBJECTS]; + Word16 last_dirac_md_idx; + UWord16 nSamplesAvailableNext; + ISM_MODE ism_mode_orig; + RENDERER_TYPE renderer_type_orig; + Word32 ivas_total_brate; + /* copy from ISM delay buffer to the correct place in TCs */ move16(); FOR( ch_idx = 0; ch_idx < st_ivas->nchan_ism; ch_idx++ ) { @@ -2803,87 +2671,112 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( Copy32( st_ivas->hMasaIsmData->delayBuffer_fx[ch_idx], tc_local_fx[ch_idx], st_ivas->hMasaIsmData->delayBuffer_size ); /*Q11*/ } - IF( st_ivas->nchan_ism > 0 ) - { - IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, hTcBuffer->n_samples_granularity ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE + /* to render flushed samples, use configuration from the last received frame */ + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + renderer_type_orig = st_ivas->renderer_type; + ism_mode_orig = st_ivas->ism_mode; + st_ivas->ism_mode = ism_mode_old; + st_ivas->renderer_type = renderer_type_old; + st_ivas->hDecoderConfig->ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate; + last_dirac_md_idx = st_ivas->hSpatParamRendCom->render_to_md_map[st_ivas->hSpatParamRendCom->slots_rendered - 1]; + + /* transfer adapted sf info from hTcBuffer to DirAC */ + st_ivas->hSpatParamRendCom->nb_subframes = 1; + st_ivas->hSpatParamRendCom->subframes_rendered = 0; + st_ivas->hSpatParamRendCom->subframe_nbslots[0] = JBM_CLDFB_SLOTS_IN_SUBFRAME; + st_ivas->hSpatParamRendCom->slots_rendered = 0; + st_ivas->hSpatParamRendCom->num_slots = JBM_CLDFB_SLOTS_IN_SUBFRAME; + set16_fx( st_ivas->hSpatParamRendCom->render_to_md_map, last_dirac_md_idx, n_slots_still_available ); + + IF( ( error = ivas_omasa_dirac_td_binaural_jbm_fx( st_ivas, (UWord16) hTcBuffer->n_samples_granularity, nSamplesRendered, &nSamplesAvailableNext, CPE_CHANNELS, p_output_fx ) ) != IVAS_ERR_OK ) { - FOR( ch_idx = 0; ch_idx < st_ivas->hDecoderConfig->nchan_out; ch_idx++ ) - { - set_zero_fx( p_output_fx[ch_idx], (Word16) ( *nSamplesRendered ) ); - } - st_ivas->hTcBuffer->slots_rendered = add( st_ivas->hTcBuffer->slots_rendered, 1 ); - st_ivas->hTcBuffer->subframes_rendered = add( st_ivas->hTcBuffer->subframes_rendered, 1 ); - move16(); - move16(); + return error; } + + /* restore original configuration */ + st_ivas->ism_mode = ism_mode_orig; + st_ivas->renderer_type = renderer_type_orig; + st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate; } } ELSE IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - Word32 *tc_local_fx[MAX_TRANSPORT_CHANNELS]; - Word16 last_spar_md_idx; - Word16 last_dirac_md_idx; - UWord16 nSamplesAvailableNext; + IF( EQ_32( ism_mode_old, ISM_SBA_MODE_DISC ) ) + { + Word32 *tc_local_fx[MAX_TRANSPORT_CHANNELS]; + Word16 last_spar_md_idx; + Word16 last_dirac_md_idx; + UWord16 nSamplesAvailableNext; + ISM_MODE ism_mode_orig; + RENDERER_TYPE renderer_type_orig; + Word32 ivas_total_brate; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + renderer_type_orig = st_ivas->renderer_type; + ism_mode_orig = st_ivas->ism_mode; + + /* to render flushed samples, use configuration from the last received frame */ + move32(); + st_ivas->ism_mode = ism_mode_old; + st_ivas->renderer_type = renderer_type_old; + st_ivas->hDecoderConfig->ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate; - last_spar_md_idx = st_ivas->hSpar->render_to_md_map[st_ivas->hSpar->slots_rendered - 1]; - last_dirac_md_idx = st_ivas->hSpatParamRendCom->render_to_md_map[st_ivas->hSpatParamRendCom->slots_rendered - 1]; - move16(); - move16(); - /* copy from ISM delay buffer to the correct place in tcs */ - FOR( ch_idx = 0; ch_idx < st_ivas->nchan_ism; ch_idx++ ) - { - tc_local_fx[ch_idx] = &st_ivas->hTcBuffer->tc_fx[ch_idx + 2][hTcBuffer->n_samples_rendered]; - Copy32( st_ivas->hSbaIsmData->delayBuffer_fx[ch_idx], tc_local_fx[ch_idx], st_ivas->hSbaIsmData->delayBuffer_size ); - } - - /* transfer adapted sf info from hTcBuffer to SPAR and DirAC */ - st_ivas->hSpar->nb_subframes = 1; - st_ivas->hSpar->subframes_rendered = 0; - st_ivas->hSpar->subframe_nbslots[0] = JBM_CLDFB_SLOTS_IN_SUBFRAME; - st_ivas->hSpar->slots_rendered = 0; - st_ivas->hSpar->num_slots = JBM_CLDFB_SLOTS_IN_SUBFRAME; - st_ivas->hSpatParamRendCom->nb_subframes = 1; - st_ivas->hSpatParamRendCom->subframes_rendered = 0; - st_ivas->hSpatParamRendCom->subframe_nbslots[0] = JBM_CLDFB_SLOTS_IN_SUBFRAME; - st_ivas->hSpatParamRendCom->slots_rendered = 0; - st_ivas->hSpatParamRendCom->num_slots = JBM_CLDFB_SLOTS_IN_SUBFRAME; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); + last_spar_md_idx = st_ivas->hSpar->render_to_md_map[st_ivas->hSpar->slots_rendered - 1]; + last_dirac_md_idx = st_ivas->hSpatParamRendCom->render_to_md_map[st_ivas->hSpatParamRendCom->slots_rendered - 1]; + move16(); + move16(); - /* also adapt md maps, just use the last index */ - set16_fx( st_ivas->hSpar->render_to_md_map, last_spar_md_idx, n_slots_still_available ); - set16_fx( st_ivas->hSpatParamRendCom->render_to_md_map, last_dirac_md_idx, n_slots_still_available ); + /* copy from ISM delay buffer to the correct place in TCs */ + FOR( ch_idx = 0; ch_idx < st_ivas->nchan_ism; ch_idx++ ) + { + tc_local_fx[ch_idx] = &st_ivas->hTcBuffer->tc_fx[ch_idx][hTcBuffer->n_samples_rendered]; + Copy32( st_ivas->hSbaIsmData->delayBuffer_fx[ch_idx], tc_local_fx[ch_idx], st_ivas->hSbaIsmData->delayBuffer_size ); + } - /* render the last subframe */ -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - IF( NE_32( ( error = ivas_osba_dirac_td_binaural_jbm_fx( st_ivas, (UWord16) hTcBuffer->n_samples_granularity, nSamplesRendered, &nSamplesAvailableNext, p_output_fx ) ), IVAS_ERR_OK ) ) -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - IF( NE_32( ( error = ivas_osba_dirac_td_binaural_jbm_fx( st_ivas, (UWord16) hTcBuffer->n_samples_granularity, nSamplesRendered, &nSamplesAvailableNext, p_output_fx, L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES ) ), IVAS_ERR_OK ) ) -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ - { - return error; + /* transfer adapted sf info from hTcBuffer to SPAR and DirAC */ + st_ivas->hSpar->nb_subframes = 1; + st_ivas->hSpar->subframes_rendered = 0; + st_ivas->hSpar->subframe_nbslots[0] = JBM_CLDFB_SLOTS_IN_SUBFRAME; + st_ivas->hSpar->slots_rendered = 0; + st_ivas->hSpar->num_slots = JBM_CLDFB_SLOTS_IN_SUBFRAME; + st_ivas->hSpatParamRendCom->nb_subframes = 1; + st_ivas->hSpatParamRendCom->subframes_rendered = 0; + st_ivas->hSpatParamRendCom->subframe_nbslots[0] = JBM_CLDFB_SLOTS_IN_SUBFRAME; + st_ivas->hSpatParamRendCom->slots_rendered = 0; + st_ivas->hSpatParamRendCom->num_slots = JBM_CLDFB_SLOTS_IN_SUBFRAME; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + + /* also adapt md maps, just use the last index */ + set16_fx( st_ivas->hSpar->render_to_md_map, last_spar_md_idx, n_slots_still_available ); + set16_fx( st_ivas->hSpatParamRendCom->render_to_md_map, last_dirac_md_idx, n_slots_still_available ); + + /* render the last subframe */ + IF( NE_32( ( error = ivas_osba_dirac_td_binaural_jbm_fx( st_ivas, (UWord16) hTcBuffer->n_samples_granularity, nSamplesRendered, &nSamplesAvailableNext, p_output_fx ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* restore original configuration */ + st_ivas->ism_mode = ism_mode_orig; + st_ivas->renderer_type = renderer_type_orig; + st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate; } } ELSE { return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong IVAS format in VoIP renderer flushing!" ); } -#ifdef CR_FIX_JBM_FLUSH_OFFSET + hTcBuffer->n_samples_rendered = hTcBuffer->n_samples_granularity; -#endif } /* update global combined orientation start index */ @@ -2891,16 +2784,18 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( *nSamplesRendered = n_samples_to_render; move16(); + /* Only write out the valid data*/ + IF( is_split_rendering_enabled( st_ivas->hDecoderConfig, st_ivas->hRenderConfig ) == 0 ) { IF( NE_16( st_ivas->ivas_format, MONO_FORMAT ) ) { #ifndef DISABLE_LIMITER Word16 ch_idx, exp = 11; move16(); - FOR( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) + FOR( ch_idx = 0; ch_idx < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) { - p_output_fx[ch_idx] = output_fx[ch_idx]; + p_output_fx[ch_idx] = st_ivas->p_output_fx[ch_idx]; } ivas_limiter_dec_fx( st_ivas->hLimiter, p_output_fx, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect, exp ); #endif @@ -2908,6 +2803,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( } ivas_syn_output_fx( p_output_fx, Q11, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, data ); + return IVAS_ERR_OK; } @@ -2918,7 +2814,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( * Set number of samples to discard in the first subframe if the renderer granularity changes on a bitrate change *--------------------------------------------------------------------------*/ -ivas_error ivas_jbm_dec_set_discard_samples( +ivas_error ivas_jbm_dec_set_discard_samples_fx( Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */ ) { @@ -2984,12 +2880,13 @@ void ivas_jbm_dec_get_adapted_linear_interpolator_fx( } ELSE { - set16_fx( interpolator_fx, 0, idx + 1 ); + set16_fx( interpolator_fx, 0, add( idx, 1 ) ); } return; } + /*--------------------------------------------------------------------------* * ivas_jbm_dec_get_adapted_subframes() * @@ -3006,8 +2903,9 @@ void ivas_jbm_dec_get_adapted_subframes( UWord16 nCldfbSlotsLocal = nCldfbTs; move16(); Word16 temp, temp_e; + /* get last subframe size from previous frame, determine how many slots have to be processed - in the first subframe (i.e. potential leftover of a 5ms subframe) */ + in the first subframe (i.e. potential leftover of a 5ms subframe) */ nSlotsInFirstSubframe = ( sub( PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, subframe_nbslots[*nb_subframes - 1] ) ); *nb_subframes = 0; move16(); @@ -3041,6 +2939,8 @@ void ivas_jbm_dec_get_adapted_subframes( return; } + + /*--------------------------------------------------------------------------* * ivas_jbm_dec_get_adapted_linear_interpolator() * @@ -3072,7 +2972,7 @@ void ivas_jbm_dec_get_md_map( } /* changed part (first segment), interpolate index to parameters - (we do not want to interpolate and smooth acutal direction/diffuseness values even more) */ + (we do not want to interpolate and smooth acutal direction/diffuseness values even more) */ IF( src_idx >= 0 ) { dec_fx = BASOP_Util_Divide3232_Scale( L_shl( add( src_idx, 1 ), 16 ), jbm_segment_len, &temp_e ); @@ -3204,12 +3104,7 @@ Word16 ivas_jbm_dec_get_num_tc_channels_fx( test(); test(); test(); - IF( EQ_16( st_ivas->ivas_format, MONO_FORMAT ) ) - { - num_tc = st_ivas->hDecoderConfig->nchan_out; - move16(); - } - ELSE IF( EQ_16( st_ivas->ivas_format, STEREO_FORMAT ) && EQ_16( st_ivas->hDecoderConfig->nchan_out, 1 ) ) + IF( EQ_16( st_ivas->ivas_format, STEREO_FORMAT ) && EQ_16( st_ivas->hDecoderConfig->nchan_out, 1 ) ) { num_tc = 1; move16(); @@ -3283,9 +3178,7 @@ Word16 ivas_jbm_dec_get_num_tc_channels_fx( move16(); } - test(); - test(); - if ( ( st_ivas->sba_planar && GE_16( num_tc, 3 ) ) || EQ_16( num_tc, 3 ) ) + if ( EQ_16( num_tc, 3 ) ) { num_tc = add( num_tc, 1 ); } @@ -3362,119 +3255,181 @@ Word16 ivas_jbm_dec_get_num_tc_channels_fx( return num_tc; } + /*--------------------------------------------------------------------------* - * ivas_jbm_dec_copy_tc() + * ivas_jbm_dec_get_render_granularity() + * * - * Copy interleaved transport chnannels to the correct buffers, update the TC - * buffer handle *--------------------------------------------------------------------------*/ -static void ivas_jbm_dec_copy_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 nSamplesForRendering, /* i : number of samples to digest */ - Word16 *nSamplesResidual, /* o : number of samples that will be left for the next frame */ - Word32 *data, /* i : (interleaved) transport channel samples data_q*/ - Word32 *tc_digest_f[], /* o : samples that will be directly digested (e.g. by CLDFB) data_q*/ - Word16 data_q ) + +/*! r: render granularity */ +Word16 ivas_jbm_dec_get_render_granularity_fx( + const RENDERER_TYPE renderer_type, /* i : renderer type */ + const RENDERER_TYPE renderer_type_sec, /* i : secondary renderer type */ + const Word32 output_Fs /* i : sampling rate */ +) { - Word16 ch; - DECODER_TC_BUFFER_HANDLE hTcBuffer; - Word16 n_samples_still_available, m; - Word16 n_ch_full_copy; - Word16 n_ch_res_copy; + Word16 render_granularity; + + test(); + test(); + test(); + IF( EQ_32( renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) || /* TD renderer */ + EQ_32( renderer_type, RENDERER_BINAURAL_MIXER_CONV ) || EQ_32( renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) || /* Crend */ + EQ_32( renderer_type_sec, RENDERER_BINAURAL_OBJECTS_TD ) /* TD rend as a secondary renderer -> set the common granularity for both renderers */ + ) + { + /* 5 ms granularity */ + render_granularity = NS2SA_FX2( output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + move16(); + } + ELSE + { + /* 1.25 ms granularity */ + render_granularity = NS2SA_FX2( output_Fs, CLDFB_SLOT_NS ); + move16(); + } + + return render_granularity; +} - hTcBuffer = st_ivas->hTcBuffer; - n_samples_still_available = sub( hTcBuffer->n_samples_buffered, hTcBuffer->n_samples_rendered ); - hTcBuffer->n_samples_buffered = add( add( n_samples_still_available, nSamplesForRendering ), hTcBuffer->n_samples_discard ); - hTcBuffer->n_samples_available = i_mult( hTcBuffer->n_samples_granularity, idiv1616( hTcBuffer->n_samples_buffered, hTcBuffer->n_samples_granularity ) ); - *nSamplesResidual = sub( hTcBuffer->n_samples_buffered, hTcBuffer->n_samples_available ); - move16(); - move16(); - move16(); - n_ch_full_copy = s_min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); - n_ch_res_copy = sub( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); - FOR( ch = 0; ch < n_ch_full_copy; ch++ ) +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_audio_allocate() + * + * allocate and initialize TC audio buffer + *--------------------------------------------------------------------------*/ + +static ivas_error ivas_jbm_dec_tc_audio_allocate_fx( + DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM TSM buffer handle */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 Opt_tsm /* i : TSM option flag */ +) +{ + Word16 nsamp_to_allocate; + Word16 ch_idx, n_samp_full, n_samp_residual, offset; + + IF( Opt_tsm ) { - set32_fx( hTcBuffer->tc_fx[ch], 0, hTcBuffer->n_samples_discard ); - Copy32( hTcBuffer->tc_fx[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc_fx[ch] + hTcBuffer->n_samples_discard, n_samples_still_available ); - FOR( m = 0; m < nSamplesForRendering; m++ ) - { - hTcBuffer->tc_fx[ch][n_samples_still_available + hTcBuffer->n_samples_discard + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch]; - move32(); - } + n_samp_full = NS2SA_FX2( output_Fs, MAX_JBM_L_FRAME_NS ); + n_samp_full = s_max( n_samp_full, L_FRAME48k ); /* buffers are shared between 'hTcBuffer->tc[]' and 'p_output_f[]': ensure minimal length */ + n_samp_residual = sub( hTcBuffer->n_samples_granularity, 1 ); + } + ELSE + { + n_samp_full = extract_l( Mpy_32_32( output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + n_samp_residual = 0; + move16(); } - IF( n_ch_res_copy > 0 ) + nsamp_to_allocate = imult1616( s_max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ), n_samp_full ); + + IF( Opt_tsm ) { - FOR( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) + /* note: this is stack memory buffer for time-scale modified audio signals */ + IF( ( hTcBuffer->tc_buffer_fx = (Word32 *) malloc( nsamp_to_allocate * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); + } + set_zero_fx( hTcBuffer->tc_buffer_fx, nsamp_to_allocate ); + + offset = 0; + move16(); + FOR( ch_idx = 0; ch_idx < s_max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) + { + hTcBuffer->tc_fx[ch_idx] = &hTcBuffer->tc_buffer_fx[offset]; + offset = add( offset, n_samp_full ); + } + FOR( ; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ ) { - Copy32( hTcBuffer->tc_fx[ch], tc_digest_f[ch], n_samples_still_available ); - FOR( m = 0; m < nSamplesForRendering; m++ ) + hTcBuffer->tc_fx[ch_idx] = NULL; + } + + /* memory buffer for TC audio samples not rendered in the previous frame */ + FOR( ch_idx = 0; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) + { + IF( ( hTcBuffer->tc_buffer_old_fx[ch_idx] = (Word32 *) malloc( n_samp_residual * sizeof( Word32 ) ) ) == NULL ) { - tc_digest_f[ch][n_samples_still_available + m] = data[( m * st_ivas->hTcBuffer->nchan_transport_jbm ) + ch]; // data_q - move32(); + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); } - Copy32( tc_digest_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc_fx[ch], *nSamplesResidual ); + set_zero_fx( hTcBuffer->tc_buffer_old_fx[ch_idx], n_samp_residual ); + } + FOR( ; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc_buffer_old_fx[ch_idx] = NULL; } } - hTcBuffer->q_tc_fx = data_q; - move16(); - hTcBuffer->n_samples_rendered = 0; - move16(); - hTcBuffer->subframes_rendered = 0; - move16(); + else + { + hTcBuffer->tc_buffer_fx = NULL; - return; + FOR( ch_idx = 0; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc_fx[ch_idx] = NULL; + } + + FOR( ch_idx = 0; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc_buffer_old_fx[ch_idx] = NULL; + } + } + + hTcBuffer->tc_buffer2_fx = NULL; + + return IVAS_ERR_OK; } + /*--------------------------------------------------------------------------* - * ivas_jbm_dec_get_render_granularity() - * + * ivas_jbm_dec_tc_audio_deallocate() * + * deallocate TC audio buffer *--------------------------------------------------------------------------*/ -/*! r: render granularity */ - - -Word16 ivas_jbm_dec_get_render_granularity( - const RENDERER_TYPE rendererType, /* i : renderer type */ - const IVAS_FORMAT ivas_format, /* i : ivas format */ - const MC_MODE mc_mode, /* i : MC mode */ - const Word32 output_Fs /* i : sampling rate Q0*/ +static void ivas_jbm_dec_tc_audio_deallocate_fx( + DECODER_TC_BUFFER_HANDLE hTcBuffer /* i/o: JBM TSM buffer handle */ ) { - Word16 render_granularity; + Word16 ch_idx; - test(); - test(); - IF( EQ_32( rendererType, RENDERER_BINAURAL_OBJECTS_TD ) || EQ_32( rendererType, RENDERER_BINAURAL_MIXER_CONV ) || EQ_32( rendererType, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) + IF( hTcBuffer != NULL ) { - test(); - IF( ( EQ_32( ivas_format, MC_FORMAT ) ) && ( EQ_32( mc_mode, MC_MODE_PARAMUPMIX ) ) ) + IF( hTcBuffer->tc_buffer_fx != NULL ) + { + FOR( ch_idx = 0; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc_fx[ch_idx] = NULL; + } + + free( hTcBuffer->tc_buffer_fx ); + hTcBuffer->tc_buffer_fx = NULL; + } + + FOR( ch_idx = 0; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ ) { - render_granularity = NS2SA_FX2( output_Fs, CLDFB_SLOT_NS ); + IF( hTcBuffer->tc_buffer_old_fx[ch_idx] != NULL ) + { + free( hTcBuffer->tc_buffer_old_fx[ch_idx] ); + hTcBuffer->tc_buffer_old_fx[ch_idx] = NULL; + } } - ELSE + + IF( hTcBuffer->tc_buffer2_fx != NULL ) { - render_granularity = NS2SA_FX2( output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + free( hTcBuffer->tc_buffer2_fx ); + hTcBuffer->tc_buffer2_fx = NULL; } } - ELSE - { - render_granularity = NS2SA_FX2( output_Fs, CLDFB_SLOT_NS ); - } - return render_granularity; + return; } - /*--------------------------------------------------------------------------* * ivas_jbm_dec_tc_buffer_open() * * open and initialize JBM transport channel buffer *--------------------------------------------------------------------------*/ - ivas_error ivas_jbm_dec_tc_buffer_open_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ @@ -3484,11 +3439,9 @@ ivas_error ivas_jbm_dec_tc_buffer_open_fx( const Word16 n_samples_granularity /* i : granularity of the renderer/buffer */ ) { - Word16 nsamp_to_allocate; DECODER_TC_BUFFER_HANDLE hTcBuffer; Word16 nMaxSlotsPerSubframe; - Word16 nchan_residual; - Word16 ch_idx; + ivas_error error; Word16 tmp, tmp_e; Word32 tmp32; @@ -3509,7 +3462,6 @@ ivas_error ivas_jbm_dec_tc_buffer_open_fx( move16(); hTcBuffer->nchan_buffer_full = nchan_full; move16(); - nchan_residual = sub( nchan_transport_internal, nchan_full ); hTcBuffer->n_samples_granularity = n_samples_granularity; move16(); hTcBuffer->n_samples_available = 0; @@ -3528,8 +3480,6 @@ ivas_error ivas_jbm_dec_tc_buffer_open_fx( move16(); hTcBuffer->nb_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; move16(); - nsamp_to_allocate = 0; - move16(); tmp32 = L_mult0( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, hTcBuffer->n_samples_granularity ); // Q0 tmp = BASOP_Util_Divide3232_Scale( st_ivas->hDecoderConfig->output_Fs, tmp32, &tmp_e ); @@ -3541,76 +3491,9 @@ ivas_error ivas_jbm_dec_tc_buffer_open_fx( set16_fx( hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set16_fx( hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, MAX_PARAM_SPATIAL_SUBFRAMES ); - IF( EQ_16( hTcBuffer->tc_buffer_mode, TC_BUFFER_MODE_NONE ) ) - { - hTcBuffer->tc_buffer_fx = NULL; - - FOR( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) - { - hTcBuffer->tc_fx[ch_idx] = NULL; - } - } - ELSE + IF( ( error = ivas_jbm_dec_tc_audio_allocate_fx( hTcBuffer, st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->Opt_tsm ) ) != IVAS_ERR_OK ) { - Word16 n_samp_full, n_samp_residual; - Word32 offset; - IF( st_ivas->hDecoderConfig->Opt_tsm ) - { - n_samp_full = add( NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ), sub( hTcBuffer->n_samples_granularity, 1 ) ); - n_samp_residual = sub( hTcBuffer->n_samples_granularity, 1 ); - } - ELSE - { - /* n_samp_full = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); */ - n_samp_full = extract_l( Mpy_32_32( st_ivas->hDecoderConfig->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); - n_samp_residual = 0; - move16(); - } - - nsamp_to_allocate = mult0( hTcBuffer->nchan_buffer_full, n_samp_full ); - nsamp_to_allocate = add( nsamp_to_allocate, mult0( nchan_residual, n_samp_residual ) ); - - IF( nsamp_to_allocate == 0 ) - { - hTcBuffer->tc_buffer_fx = NULL; - - FOR( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) - { - hTcBuffer->tc_fx[ch_idx] = NULL; - } - } - ELSE - { - IF( st_ivas->hDecoderConfig->Opt_tsm ) - { - IF( ( hTcBuffer->tc_buffer_fx = (Word32 *) malloc( nsamp_to_allocate * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); - } - set32_fx( hTcBuffer->tc_buffer_fx, 0, nsamp_to_allocate ); - - offset = 0; - move16(); - FOR( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) - { - hTcBuffer->tc_fx[ch_idx] = &hTcBuffer->tc_buffer_fx[offset]; - offset = L_add( offset, n_samp_full ); - } - FOR( ; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) - { - hTcBuffer->tc_fx[ch_idx] = &hTcBuffer->tc_buffer_fx[offset]; - offset = L_add( offset, n_samp_residual ); - } - FOR( ; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) - { - hTcBuffer->tc_fx[ch_idx] = NULL; - } - } - ELSE - { - hTcBuffer->tc_buffer_fx = NULL; - } - } + return error; } st_ivas->hTcBuffer = hTcBuffer; @@ -3625,7 +3508,6 @@ ivas_error ivas_jbm_dec_tc_buffer_open_fx( * open and initialize JBM transport channel buffer *--------------------------------------------------------------------------*/ - ivas_error ivas_jbm_dec_tc_buffer_reconfigure_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */ @@ -3635,13 +3517,33 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure_fx( const Word16 n_samples_granularity /* i : new granularity of the renderer/buffer */ ) { - Word16 nsamp_to_allocate, n_samp_full, n_samp_residual, offset, nchan_residual; - Word16 ch_idx; + Word16 ch_idx, num_tc_buffer_mem, n_samples_still_available; + Word32 tc_buffer_mem[MAX_INTERN_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES - 1]; + ivas_error error; DECODER_TC_BUFFER_HANDLE hTcBuffer; hTcBuffer = st_ivas->hTcBuffer; move16(); + num_tc_buffer_mem = 0; + move16(); + n_samples_still_available = 0; + move16(); + + IF( st_ivas->hDecoderConfig->Opt_tsm ) + { + /* save samples of the TC buffer from the previous frame */ + num_tc_buffer_mem = s_min( hTcBuffer->nchan_transport_internal, nchan_transport_internal ); + n_samples_still_available = sub( hTcBuffer->n_samples_buffered, hTcBuffer->n_samples_rendered ); + + /* what is remaining from last frame needs always be smaller than the new granularity */ + assert( n_samples_still_available < n_samples_granularity ); + + FOR( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ ) + { + Copy32( hTcBuffer->tc_buffer_old_fx[ch_idx] + hTcBuffer->n_samples_flushed, tc_buffer_mem[ch_idx], n_samples_still_available ); + } + } /* if granularity changes, adapt subframe_nb_slots */ IF( NE_16( n_samples_granularity, hTcBuffer->n_samples_granularity ) ) @@ -3673,96 +3575,33 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure_fx( move16(); hTcBuffer->nchan_buffer_full = nchan_full; move16(); - nchan_residual = sub( nchan_transport_internal, nchan_full ); hTcBuffer->n_samples_granularity = n_samples_granularity; move16(); - /* realloc buffers */ - IF( hTcBuffer->tc_buffer_fx != NULL ) - { - free( hTcBuffer->tc_buffer_fx ); - hTcBuffer->tc_buffer_fx = NULL; - } + /* reallocate TC audio buffers */ - IF( st_ivas->hDecoderConfig->Opt_tsm ) - { - n_samp_full = ( add( NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ), sub( hTcBuffer->n_samples_granularity, 1 ) ) ); - n_samp_residual = sub( hTcBuffer->n_samples_granularity, 1 ); - } - ELSE + ivas_jbm_dec_tc_audio_deallocate_fx( hTcBuffer ); + + IF( ( error = ivas_jbm_dec_tc_audio_allocate_fx( hTcBuffer, st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->Opt_tsm ) ) != IVAS_ERR_OK ) { - n_samp_full = extract_l( Mult_32_16( st_ivas->hDecoderConfig->output_Fs, INV_FRAME_PER_SEC_Q15 ) ); - n_samp_residual = 0; - move16(); + return error; } - nsamp_to_allocate = imult1616( hTcBuffer->nchan_buffer_full, n_samp_full ); - nsamp_to_allocate = add( nsamp_to_allocate, imult1616( nchan_residual, n_samp_residual ) ); - IF( nsamp_to_allocate == 0 ) + /* propagate samples of the TC buffer from the previous frame */ + FOR( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ ) { - hTcBuffer->tc_buffer_fx = NULL; - FOR( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) - { - hTcBuffer->tc_fx[ch_idx] = NULL; - } + Copy32( tc_buffer_mem[ch_idx], hTcBuffer->tc_buffer_old_fx[ch_idx], n_samples_still_available ); } - ELSE - { - IF( st_ivas->hDecoderConfig->Opt_tsm ) - { - IF( ( hTcBuffer->tc_buffer_fx = (Word32 *) malloc( nsamp_to_allocate * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory FOR JBM TC Buffer\n" ) ); - } - set32_fx( hTcBuffer->tc_buffer_fx, 0, nsamp_to_allocate ); + return IVAS_ERR_OK; +} - offset = 0; - move16(); - FOR( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) - { - hTcBuffer->tc_fx[ch_idx] = &hTcBuffer->tc_buffer_fx[offset]; - offset = add( offset, n_samp_full ); - } - FOR( ; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) - { - hTcBuffer->tc_fx[ch_idx] = &hTcBuffer->tc_buffer_fx[offset]; - offset = add( offset, n_samp_residual ); - } - FOR( ; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) - { - hTcBuffer->tc_fx[ch_idx] = NULL; - } - hTcBuffer->tc_buff_len = nsamp_to_allocate; - move16(); - - offset = 0; - move16(); - FOR( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) - { - offset = add( offset, n_samp_full ); - } - FOR( ; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) - { - offset = add( offset, n_samp_residual ); - } - } - ELSE - { - hTcBuffer->tc_buffer_fx = NULL; - } - } - - return IVAS_ERR_OK; -} - - -/*--------------------------------------------------------------------------* - * ivas_jbm_dec_tc_buffer_playout() - * - * - *--------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_playout() + * + * + *--------------------------------------------------------------------------*/ static void ivas_jbm_dec_tc_buffer_playout_fx( Decoder_Struct *st_ivas, @@ -3794,10 +3633,14 @@ static void ivas_jbm_dec_tc_buffer_playout_fx( slots_to_render = sub( slots_to_render, st_ivas->hTcBuffer->subframe_nbslots[last_sf] ); last_sf = add( last_sf, 1 ); } +#ifdef DEBUGGING + assert( slots_to_render == 0 ); +#endif FOR( ch_idx = 0; ch_idx < st_ivas->hTcBuffer->nchan_transport_jbm; ch_idx++ ) { - Copy32( st_ivas->hTcBuffer->tc_fx[ch_idx] + st_ivas->hTcBuffer->n_samples_rendered, output_fx[ch_idx], *nSamplesRendered ); + output_fx[ch_idx] = st_ivas->hTcBuffer->tc_fx[ch_idx] + st_ivas->hTcBuffer->n_samples_rendered; + move32(); } st_ivas->hTcBuffer->subframes_rendered = last_sf; @@ -3813,24 +3656,13 @@ static void ivas_jbm_dec_tc_buffer_playout_fx( * Close JBM transport channel buffer *--------------------------------------------------------------------------*/ -void ivas_jbm_dec_tc_buffer_close( +void ivas_jbm_dec_tc_buffer_close_fx( DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ ) { - Word16 i; - IF( *phTcBuffer != NULL ) { - FOR( i = 0; i < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; i++ ) - { - ( *phTcBuffer )->tc_fx[i] = NULL; - } - - IF( ( *phTcBuffer )->tc_buffer_fx != NULL ) - { - free( ( *phTcBuffer )->tc_buffer_fx ); - ( *phTcBuffer )->tc_buffer_fx = NULL; - } + ivas_jbm_dec_tc_audio_deallocate_fx( *phTcBuffer ); free( *phTcBuffer ); *phTcBuffer = NULL; @@ -3839,11 +3671,13 @@ void ivas_jbm_dec_tc_buffer_close( return; } + /*--------------------------------------------------------------------------* * ivas_jbm_dec_td_renderers_adapt_subframes() * * Close JBM transport channel buffer *--------------------------------------------------------------------------*/ + void ivas_jbm_dec_td_renderers_adapt_subframes( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) @@ -3910,17 +3744,20 @@ void ivas_jbm_dec_td_renderers_adapt_subframes( return; } + + /*--------------------------------------------------------------------------* * ivas_jbm_dec_get_tc_buffer_mode() * * *--------------------------------------------------------------------------*/ -TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( +TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { TC_BUFFER_MODE buffer_mode; + buffer_mode = TC_BUFFER_MODE_BUFFER; move16(); @@ -3945,6 +3782,8 @@ TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( case RENDERER_PARAM_ISM: case RENDERER_BINAURAL_MIXER_CONV: case RENDERER_BINAURAL_MIXER_CONV_ROOM: + case RENDERER_OMASA_OBJECT_EXT: + case RENDERER_OMASA_MIX_EXT: case RENDERER_OSBA_AMBI: case RENDERER_OSBA_LS: buffer_mode = TC_BUFFER_MODE_RENDERER; @@ -4017,98 +3856,6 @@ TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( } -/*--------------------------------------------------------------------------* - * ivas_jbm_dec_copy_tc_no_tsm() - * - * - *--------------------------------------------------------------------------*/ - -void ivas_jbm_dec_copy_tc_no_tsm_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle Q0 */ - Word32 *tc_fx[], /* i : transport channels Q11 */ - const Word16 output_frame /* i : output frame size Q0 */ -) -{ - Word16 Q_tc; - Word16 n_ch_full_copy; - Word16 n_ch_cldfb; - Word16 ch_idx; - DECODER_TC_BUFFER_HANDLE hTcBuffer; - - hTcBuffer = st_ivas->hTcBuffer; - hTcBuffer->n_samples_buffered = output_frame; - hTcBuffer->n_samples_available = hTcBuffer->n_samples_buffered; - move16(); - move16(); - n_ch_full_copy = s_min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); - n_ch_cldfb = sub( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); - - Q_tc = 11; /*tc buffer is at Q11*/ - move16(); - /* copy full tcs*/ - IF( st_ivas->hDecoderConfig->Opt_tsm ) - { - FOR( ch_idx = 0; ch_idx < n_ch_full_copy; ch_idx++ ) - { - Copy32( tc_fx[ch_idx], st_ivas->hTcBuffer->tc_fx[ch_idx], hTcBuffer->n_samples_buffered ); // keeping tc_fx in Q11 - } - } - ch_idx = 0; - move16(); - - /* CLDFB ana for ParamMC/ParamISM */ - IF( n_ch_cldfb > 0 ) - { - Word32 *cldfb_real_buffer_fx; - Word32 *cldfb_imag_buffer_fx; - Word16 cldfb_ch, slot_idx, num_freq_bands; - - cldfb_real_buffer_fx = NULL; - cldfb_imag_buffer_fx = NULL; - num_freq_bands = 0; - move16(); - - IF( EQ_16( (Word16) st_ivas->ivas_format, (Word16) ISM_FORMAT ) ) - { - cldfb_real_buffer_fx = st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx; - cldfb_imag_buffer_fx = st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx; - num_freq_bands = st_ivas->hSpatParamRendCom->num_freq_bands; - move16(); - - ivas_ism_param_dec_tc_gain_ajust_fx( st_ivas, output_frame, output_frame / 2, tc_fx, &Q_tc ); - Scale_sig32( tc_fx[0], output_frame, sub( Q11, Q_tc ) ); /*keepeing tc_fx at Q11*/ - Scale_sig32( tc_fx[1], output_frame, sub( Q11, Q_tc ) ); /*keepeing tc_fx at Q11*/ - } - ELSE IF( EQ_16( (Word16) st_ivas->ivas_format, (Word16) MC_FORMAT ) ) - { - cldfb_real_buffer_fx = st_ivas->hParamMC->Cldfb_RealBuffer_tc_fx; - cldfb_imag_buffer_fx = st_ivas->hParamMC->Cldfb_ImagBuffer_tc_fx; - num_freq_bands = st_ivas->hParamMC->num_freq_bands; - move16(); - } - /* CLDFB Analysis*/ - - FOR( cldfb_ch = 0; cldfb_ch < n_ch_cldfb; ( cldfb_ch++, ch_idx++ ) ) - { - FOR( slot_idx = 0; slot_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; slot_idx++ ) - { - Q_tc = 11; - move16(); - cldfbAnalysis_ts_fx_fixed_q( &( tc_fx[ch_idx][num_freq_bands * slot_idx] ), - &cldfb_real_buffer_fx[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], - &cldfb_imag_buffer_fx[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], - num_freq_bands, st_ivas->cldfbAnaDec[cldfb_ch], &Q_tc ); - } - } - } - hTcBuffer->n_samples_rendered = 0; - move16(); - hTcBuffer->subframes_rendered = 0; - move16(); - - return; -} - /*--------------------------------------------------------------------------* * ivas_jbm_dec_metadata_open() * @@ -4119,10 +3866,12 @@ ivas_error ivas_jbm_dec_metadata_open( Decoder_Struct *st_ivas ) { JBM_METADATA_HANDLE hJbmMetadata; + IF( ( hJbmMetadata = (JBM_METADATA_HANDLE) malloc( sizeof( JBM_METADATA ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM metadata handle\n" ) ); } + hJbmMetadata->sf_write_idx = 0; move16(); hJbmMetadata->sf_md_buffer_length = MASA_JBM_RINGBUFFER_FRAMES * MAX_PARAM_SPATIAL_SUBFRAMES; @@ -4196,6 +3945,7 @@ static void ivas_jbm_dec_copy_masa_meta_to_buffer( * * Map input MASA metadata subframes to slots in JBM processing *--------------------------------------------------------------------------*/ + static void ivas_jbm_masa_sf_to_slot_map( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word16 nCldfbTs /* i : number of CLDFB time slots */ @@ -4207,6 +3957,8 @@ static void ivas_jbm_masa_sf_to_slot_map( Word16 slot_idx; Word16 write_idx, sf_index; + ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); + /* Set values */ hJbmMetadata = st_ivas->hJbmMetadata; num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; @@ -4316,3 +4068,357 @@ void ivas_jbm_masa_sf_to_sf_map( return; } + + +/*--------------------------------------------------------------------------* + * ivas_dec_prepare_renderer() + * + * prepare IVAS renderer routine + *--------------------------------------------------------------------------*/ + +void ivas_dec_prepare_renderer_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 n, n_render_timeslots, tmp, exp, shift; + + push_wmops( "ivas_dec_prepare_renderer" ); + + /* n_render_timeslots = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; */ + tmp = BASOP_Util_Divide1616_Scale( st_ivas->hTcBuffer->n_samples_available, st_ivas->hTcBuffer->n_samples_granularity, &exp ); + n_render_timeslots = shr( tmp, sub( 15, exp ) ); // Q0 + + test(); + IF( EQ_16( st_ivas->hTcBuffer->tc_buffer_mode, TC_BUFFER_MODE_BUFFER ) ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + + test(); + test(); + test(); + IF( ( EQ_16( st_ivas->ivas_format, MASA_FORMAT ) || EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) && EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && st_ivas->hDecoderConfig->Opt_tsm ) + { + ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); + } + /* MASA transport gaining for edited disc OMASA EXT. For ISMs, only metadata is modified */ + test(); + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && EQ_16( st_ivas->hMasaIsmData->masa_gain_is_edited, 1 ) ) + { + ivas_omasa_gain_masa_tc_fx( st_ivas->hTcBuffer->tc_fx, st_ivas->hMasaIsmData->gain_masa_edited_fx, st_ivas->nchan_ism, st_ivas->hTcBuffer->n_samples_available ); + } + } + ELSE IF( EQ_16( st_ivas->ivas_format, MONO_FORMAT ) || EQ_16( st_ivas->ivas_format, STEREO_FORMAT ) ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + ELSE IF( EQ_16( st_ivas->ivas_format, ISM_FORMAT ) ) + { + /* Rendering */ + IF( EQ_16( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + test(); + test(); + test(); + IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) + { + ivas_dirac_dec_set_md_map_fx( st_ivas, n_render_timeslots ); + + ivas_param_ism_params_to_masa_param_mapping_fx( st_ivas ); + } + ELSE IF( EQ_16( st_ivas->renderer_type, RENDERER_PARAM_ISM ) || EQ_16( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) ) + { + ivas_param_ism_dec_prepare_renderer_fx( st_ivas, n_render_timeslots ); + } + } + ELSE /* ISM_MODE_DISC */ + { + ivas_ism_dec_digest_tc_fx( st_ivas ); + } + } + ELSE IF( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) || EQ_16( st_ivas->ivas_format, MASA_FORMAT ) ) + { + IF( st_ivas->hSCE[0] ) + { + shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); + IF( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) + { + shift = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 4 ); + } + scale_sig32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); // Q(31-cngNoiseLevelExp+shift) + st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ); + } + + ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + ELSE IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + ivas_ism_dec_digest_tc_fx( st_ivas ); + + test(); + test(); + test(); + test(); + test(); + test(); + /* delay the objects here for all renderers where it is needed */ + IF( + ( + EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || + EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || + EQ_16( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || + EQ_16( st_ivas->renderer_type, RENDERER_OSBA_LS ) || + EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) && + ( NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) + { + FOR( n = 0; n < st_ivas->nchan_ism; n++ ) + { + delay_signal32_fx( st_ivas->hTcBuffer->tc_fx[n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hSbaIsmData->delayBuffer_fx[n], st_ivas->hSbaIsmData->delayBuffer_size ); + } + } + + IF( !st_ivas->sba_dirac_stereo_flag ) + { + IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) + { + Word16 temp, temp_e; + temp = BASOP_Util_Divide1616_Scale( st_ivas->hTcBuffer->n_samples_granularity, st_ivas->hSpatParamRendCom->slot_size, &temp_e ); + n_render_timeslots = extract_l( L_shr( L_mult0( n_render_timeslots, temp ), sub( 15, temp_e ) ) ); + } + + IF( st_ivas->hSCE[0] ) + { + shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); + if ( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) + { + shift = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 4 ); + } + scale_sig32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); // Q(31-cngNoiseLevelExp+shift) + st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ); + } + ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + } + ELSE + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + + IF( st_ivas->hSCE[0] ) + { + shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); + if ( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) + { + shift = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 4 ); + } + scale_sig32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); // Q(31-cngNoiseLevelExp+shift) + st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ); + } + + ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + } + ELSE IF( EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_MIX_EXT ) || EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + + IF( st_ivas->hDecoderConfig->Opt_tsm ) + { + ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); + } + /* MASA transport gaining for edited param_one OMASA EXT. For ISMs, only metadata is modified. */ + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) && EQ_16( st_ivas->hMasaIsmData->masa_gain_is_edited, 1 ) ) + { + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + v_multc_fx_16( st_ivas->hTcBuffer->tc_fx[n], st_ivas->hMasaIsmData->gain_masa_edited_fx, st_ivas->hTcBuffer->tc_fx[n], st_ivas->hTcBuffer->n_samples_available ); // Q8 + Scale_sig32( st_ivas->hTcBuffer->tc_fx[n], st_ivas->hTcBuffer->n_samples_available, Q3 ); // Q8 -> Q11 + } + } + } + ELSE + { + test(); + IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + n_render_timeslots = i_mult( n_render_timeslots, idiv1616( st_ivas->hTcBuffer->n_samples_granularity, st_ivas->hSpatParamRendCom->slot_size ) ); + } + + IF( st_ivas->hSCE[0] ) + { + shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); + if ( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) + { + shift = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 4 ); + } + scale_sig32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); // Q(31- (st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp - shift) + st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ); + move16(); + } + + ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + + IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + ivas_ism_dec_digest_tc_fx( st_ivas ); + } + } + + test(); + IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_DIRAC ) ) + { + Word16 nchan_transport_ism; + + /* Delay the signal to match CLDFB delay. Delay the whole buffer. */ + nchan_transport_ism = 0; + move16(); + + test(); + test(); + IF( ( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) && NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) ) + { + nchan_transport_ism = 1; + move16(); + } + ELSE IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + nchan_transport_ism = st_ivas->nchan_ism; + move16(); + } + + test(); + test(); + IF( st_ivas->hDecoderConfig->Opt_tsm && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) + { + /* Gain MASA part, if edited */ + IF( st_ivas->hMasaIsmData->masa_gain_is_edited ) + { + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + v_multc_fx_16( st_ivas->hTcBuffer->tc_fx[n], st_ivas->hMasaIsmData->gain_masa_edited_fx, st_ivas->hTcBuffer->tc_fx[n], st_ivas->hTcBuffer->n_samples_available ); + Scale_sig32( st_ivas->hTcBuffer->tc_fx[n], st_ivas->hTcBuffer->n_samples_available, Q3 ); // Q8 -> Q11 + } + } + } + + FOR( n = 0; n < nchan_transport_ism; n++ ) + { + test(); + IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) ) + { + v_multc_fx_16( st_ivas->hTcBuffer->tc_fx[CPE_CHANNELS + n], OMASA_TDREND_MATCHING_GAIN_FX, st_ivas->hTcBuffer->tc_fx[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available ); + + IF( st_ivas->hMasaIsmData->ism_gain_is_edited[n] ) + { + v_multc_fx_16( st_ivas->hTcBuffer->tc_fx[CPE_CHANNELS + n], st_ivas->hMasaIsmData->gain_ism_edited_fx[n], st_ivas->hTcBuffer->tc_fx[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available ); + Scale_sig32( st_ivas->hTcBuffer->tc_fx[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available, Q3 ); // Q8 -> Q11 + } + } + test(); + IF( NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + delay_signal32_fx( st_ivas->hTcBuffer->tc_fx[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hMasaIsmData->delayBuffer_fx[n], st_ivas->hMasaIsmData->delayBuffer_size ); + // TODO: check if tis is a bug in main already + } + } + + test(); + IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) ) + { + IF( st_ivas->hMasaIsmData->masa_gain_is_edited ) + { + FOR( n = 0; n < BINAURAL_CHANNELS; n++ ) + { + v_multc_fx_16( st_ivas->hTcBuffer->tc_fx[n], st_ivas->hMasaIsmData->gain_masa_edited_fx, st_ivas->hTcBuffer->tc_fx[n], st_ivas->hTcBuffer->n_samples_available ); // Q8 + Scale_sig32( st_ivas->hTcBuffer->tc_fx[n], st_ivas->hTcBuffer->n_samples_available, Q3 ); // Q8 -> Q11 + } + } + } + } + } + ELSE IF( EQ_16( st_ivas->ivas_format, MC_FORMAT ) ) + { + IF( EQ_16( st_ivas->mc_mode, MC_MODE_MCT ) ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + ELSE IF( EQ_16( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) + { + ivas_mc_paramupmix_dec_digest_tc_fx( st_ivas, (UWord8) n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + ELSE IF( EQ_16( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) + { + Word16 nchan_transport = st_ivas->nchan_transport; + move16(); + Word16 nchan_out_transport = add( st_ivas->hTransSetup.nchan_out_woLFE, st_ivas->hTransSetup.num_lfe ); + Word16 nchan_out_cov; + + test(); + test(); + IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + nchan_out_cov = add( st_ivas->hTransSetup.nchan_out_woLFE, st_ivas->hTransSetup.num_lfe ); + } + ELSE IF( EQ_16( st_ivas->hParamMC->synthesis_conf, PARAM_MC_SYNTH_LS_CONV_CLDFB ) ) + { + nchan_out_cov = nchan_out_transport; + move16(); + } + ELSE IF( EQ_16( st_ivas->hParamMC->synthesis_conf, PARAM_MC_SYNTH_LS_CONV_COV ) || EQ_16( st_ivas->hParamMC->synthesis_conf, PARAM_MC_SYNTH_MONO_STEREO ) ) + { + nchan_out_cov = add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ); + } + ELSE + { + nchan_out_cov = nchan_out_transport; + move16(); + } + + scale_sig32( st_ivas->hParamMC->proto_matrix_int_fx, st_ivas->hParamMC->proto_matrix_int_len, -1 ); // Q(31-1) + st_ivas->hParamMC->proto_matrix_int_e = 1; + move16(); + + ivas_param_mc_dec_prepare_renderer( st_ivas, (UWord8) n_render_timeslots ); + + scale_sig32( st_ivas->hParamMC->proto_matrix_int_fx, st_ivas->hParamMC->proto_matrix_int_len, 1 ); // Q(31-1+1) + + FOR( Word16 param_band_idx = 0; param_band_idx < st_ivas->hParamMC->num_param_bands_synth; param_band_idx++ ) + { + shift = getScaleFactor32( st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_fx[param_band_idx], s_min( st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_len, nchan_transport * nchan_transport ) ); + scale_sig32( st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_fx[param_band_idx], s_min( st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_len, i_mult( nchan_transport, nchan_transport ) ), shift ); // Q(31-cx_old_e+shift) + st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_e[param_band_idx] = sub( st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_e[param_band_idx], shift ); + move16(); + + shift = getScaleFactor32( st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old_fx[param_band_idx], nchan_out_cov * nchan_out_cov ); + scale_sig32( st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old_fx[param_band_idx], i_mult( nchan_out_cov, nchan_out_cov ), shift ); // Q(31-cy_old_e+shift) + st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old_e[param_band_idx] = sub( st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old_e[param_band_idx], shift ); + move16(); + } + } + ELSE IF( EQ_16( st_ivas->mc_mode, MC_MODE_MCMASA ) ) + { + IF( st_ivas->hSCE[0] ) + { + shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); + if ( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) + { + shift = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 4 ); + } + scale_sig32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); // Q(31-cngNoiseLevelExp+shift) + st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ); + move16(); + } + + ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + } + + pop_wmops(); + return; +} diff --git a/lib_dec/ivas_lfe_dec_fx.c b/lib_dec/ivas_lfe_dec_fx.c index d73030d56af4fa7ac8ba9213c879092c6bdc7ec4..74d8de662ea8aadd99c86363b514d42e8164fe1e 100644 --- a/lib_dec/ivas_lfe_dec_fx.c +++ b/lib_dec/ivas_lfe_dec_fx.c @@ -295,6 +295,27 @@ static Word16 ivas_lfe_dec_dequant_fx( } +/*------------------------------------------------------------------------- + * ivas_create_lfe_lpf_dec_fx() + * + * Create, allocate and initialize IVAS decoder LFE low pass filter state handle + *-------------------------------------------------------------------------*/ + +static void ivas_create_lfe_lpf_dec_fx( + ivas_filters_process_state_t *hLfeLpf, /* o : LFE LPF handle */ + const Word32 input_Fs /* i : input sampling rate */ +) +{ + const Word32 *filt_coeff; // 31 - filt_coeff_e + const Word16 *filt_coeff_e = NULL; + + ivas_lfe_lpf_select_filt_coeff_fx( input_Fs, IVAS_FILTER_ORDER_4, &filt_coeff, &filt_coeff_e ); + ivas_filters_init_fx( hLfeLpf, filt_coeff, filt_coeff_e, IVAS_FILTER_ORDER_4 ); + + return; +} + + /*-----------------------------------------------------------------------------------------* * Function ivas_lfe_dec_fx() * @@ -380,11 +401,12 @@ void ivas_lfe_dec_fx( move32(); j = add( j, shr( output_frame, 5 ) ); } + q_out = Q9; + move16(); } IF( hLFE->filter_state.order > 0 ) { - /* NOTE: this block is not getting hit by any stream present in pytest test suite */ /* Low Pass Filter */ ivas_filter_process_fx( &hLFE->filter_state, output_lfe_ch, output_frame, q_out ); } @@ -406,17 +428,18 @@ void ivas_lfe_dec_fx( *-------------------------------------------------------------------------*/ ivas_error ivas_create_lfe_dec_fx( - LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ - const Word32 output_Fs, /* i : output sampling rate Q0*/ - const Word32 binauralization_delay_ns /* i : additional LFE delay to sync with binaural renderer */ + LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ + const Word32 output_Fs, /* i : output sampling rate Q0*/ + const Word32 delay_ns /* i : additional LFE delay to sync other channel outputs */ ) { Word16 low_pass_delay_dec_out, block_offset_s; Word16 filt_order, output_frame; LFE_DEC_HANDLE hLFE; - Word16 lfe_addl_delay_s; Word16 i, j; - Word16 add_delay_sa; + Word16 lfe_block_delay_s_fx; + Word16 block_offset_samples, lfe_block_delay_samples; + Word16 lfe_addl_delay_samples; Word32 output_fs_fx; low_pass_delay_dec_out = 0; @@ -457,7 +480,7 @@ ivas_error ivas_create_lfe_dec_fx( hLFE->cum_freq_models[1][3] = &ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg4; /* delay calculation */ - hLFE->lfe_block_delay_s_fx = add( IVAS_LFE_FADE_S_Q15, ivas_lfe_lpf_delay_Q15[IVAS_FILTER_ORDER_4 - 3] ); // Q15 + lfe_block_delay_s_fx = add( IVAS_LFE_FADE_S_Q15, ivas_lfe_lpf_delay_Q15[IVAS_FILTER_ORDER_4 - 3] ); // Q15 move16(); block_offset_s = BLOCK_OFFSET_S_Q15; // Q15 @@ -466,11 +489,18 @@ ivas_error ivas_create_lfe_dec_fx( move16(); low_pass_delay_dec_out = 0; // Q15 move16(); + + IF( GT_32( delay_ns, ivas_lfe_lpf_delay_ns[IVAS_FILTER_ORDER_4 - 3] ) ) + { + filt_order = 4; + low_pass_delay_dec_out = ivas_lfe_lpf_delay_Q15[IVAS_FILTER_ORDER_4 - 3]; + ivas_create_lfe_lpf_dec_fx( &( hLFE->filter_state ), output_Fs ); + } + hLFE->filter_state.order = filt_order; move16(); - hLFE->lfe_block_delay_s_fx = add( hLFE->lfe_block_delay_s_fx, low_pass_delay_dec_out ); // Q15 - move16(); - hLFE->lfe_prior_buf_len = NS2SA_FX2( output_Fs, IVAS_LFE_FADE_NS ); // Q0 + lfe_block_delay_s_fx = add( lfe_block_delay_s_fx, low_pass_delay_dec_out ); // Q15 + hLFE->lfe_prior_buf_len = NS2SA_FX2( output_Fs, IVAS_LFE_FADE_NS ); // Q0 move16(); hLFE->bfi_count = 0; @@ -493,21 +523,15 @@ ivas_error ivas_create_lfe_dec_fx( } move32(); - lfe_addl_delay_s = sub( block_offset_s, hLFE->lfe_block_delay_s_fx ); // Q15 - lfe_addl_delay_s = s_max( 0, lfe_addl_delay_s ); - add_delay_sa = (Word16) W_round64_L( W_mult0_32_32( L_shl( binauralization_delay_ns, 1 ), output_fs_fx ) ); // Q0 - move16(); - hLFE->lfe_addl_delay = add( (Word16) L_shr( imult3216( output_Fs, lfe_addl_delay_s ), 15 ), add_delay_sa ); // Q0 - move16(); - IF( add_delay_sa == 0 ) - { - hLFE->lfe_block_delay_s_fx = add( hLFE->lfe_block_delay_s_fx, lfe_addl_delay_s ); - } - ELSE - { - hLFE->lfe_block_delay_s_fx = add( hLFE->lfe_block_delay_s_fx, add( lfe_addl_delay_s, idiv1616( add_delay_sa, extract_l( output_Fs ) ) ) ); - } + block_offset_samples = (Word16) L_shr( imult3216( output_Fs, block_offset_s ), 15 ); // Q0 + block_offset_samples = add( block_offset_samples, (Word16) W_round64_L( W_mult0_32_32( L_shl( delay_ns, 1 ), output_fs_fx ) ) ); // Q0 + lfe_block_delay_samples = (Word16) L_shr( imult3216( output_Fs, lfe_block_delay_s_fx ), 15 ); // Q0 + lfe_addl_delay_samples = sub( block_offset_samples, lfe_block_delay_samples ); + lfe_addl_delay_samples = s_max( 0, lfe_addl_delay_samples ); + hLFE->lfe_addl_delay = lfe_addl_delay_samples; move16(); + hLFE->delay_ns = delay_ns; + move32(); IF( hLFE->lfe_addl_delay > 0 ) { diff --git a/lib_dec/ivas_lfe_plc_fx.c b/lib_dec/ivas_lfe_plc_fx.c old mode 100644 new mode 100755 index d98603d2a567052962051810bce287bbb9e3cedb..ac6da67598a31774ff7531ede0ba5a9052886a02 --- a/lib_dec/ivas_lfe_plc_fx.c +++ b/lib_dec/ivas_lfe_plc_fx.c @@ -37,7 +37,6 @@ #include #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*------------------------------------------------------------------------------------------* * Local constants @@ -225,7 +224,7 @@ static Word16 lfeplc_lev_dur_fx( a_out_q_fx[0] = 30; move16(); - rc_fx[0] = BASOP_Util_Divide3232_Scale_cadence( -r_fx[1], r_fx[0], &temp_q2 ); + rc_fx[0] = BASOP_Util_Divide3232_Scale_newton( -r_fx[1], r_fx[0], &temp_q2 ); move32(); rc_q_fx[0] = add( sub( r_q_fx[1], r_q_fx[0] ), sub( 31, temp_q2 ) ); move16(); @@ -387,7 +386,7 @@ static Word16 lfeplc_lev_dur_fx( s = W_extract_h( W_shl( s_fx, exp1 ) ); s_q_fx = sub( add( s_q_fx, exp1 ), 32 ); - rc_fx[i - 1] = L_shr( BASOP_Util_Divide3232_Scale_cadence( L_negate( s ), err_fx, &temp_q2 ), 1 ); + rc_fx[i - 1] = L_shr( BASOP_Util_Divide3232_Scale_newton( L_negate( s ), err_fx, &temp_q2 ), 1 ); move32(); rc_q_fx[i - 1] = sub( add( sub( s_q_fx, err_q_fx ), sub( 31, temp_q2 ) ), 1 ); move16(); @@ -646,7 +645,7 @@ static void d_syn_filt_fx( } ELSE { - s_fx = W_sub( W_shr( s_fx, sub( s_q_fx, temp_q ) ), temp ); + s_fx = W_sub( W_shr( s_fx, s_min( 63, sub( s_q_fx, temp_q ) ) ), temp ); s_q_fx = temp_q; move16(); } diff --git a/lib_dec/ivas_masa_dec_fx.c b/lib_dec/ivas_masa_dec_fx.c index dec4d3465771077ed36773e1f56a2085d6eddbf3..b41036a5d6cfa4016b10116de0e2983b1ef7a529 100644 --- a/lib_dec/ivas_masa_dec_fx.c +++ b/lib_dec/ivas_masa_dec_fx.c @@ -42,7 +42,6 @@ #include "prot_fx.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*-----------------------------------------------------------------------* @@ -57,7 +56,7 @@ * Local function prototypes *-----------------------------------------------------------------------*/ -static Word16 rint_fx( Word32 num ); +static Word16 rint_fx( const Word32 num ); static void index_16bits_fx( IVAS_QMETADATA_HANDLE hQMetaData, SPHERICAL_GRID_DATA *Sph_Grid16 ); @@ -166,6 +165,14 @@ ivas_error ivas_masa_decode_fx( } move16(); + test(); + test(); + IF( EQ_32( ivas_format, MASA_FORMAT ) && ( EQ_32( masa_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) ) + { + hMasa->config.numberOfDirections = 1; + move16(); + } + test(); test(); test(); @@ -176,98 +183,127 @@ ivas_error ivas_masa_decode_fx( test(); IF( NE_32( ivas_format, MC_FORMAT ) || NE_16( st_ivas->mc_mode, MC_MODE_MCMASA ) ) { - IF( NE_32( ivas_format, MASA_ISM_FORMAT ) ) + Word16 bits_per_frame = extract_l( Mpy_32_32( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + + IF( EQ_32( ivas_format, MASA_FORMAT ) ) { - /* number of transport channels is always 2 for MASA_ISM format */ - /* the number of MASA transport channels was read in ivas_dec_setup() */ - st->next_bit_pos = sub( st->next_bit_pos, MASA_TRANSP_BITS ); - *nb_bits_read = add( *nb_bits_read, MASA_TRANSP_BITS ); + /* re-read the number of objects, needed in case of bad frame */ + ch = sub( 5, add( st_ivas->bit_stream[sub( bits_per_frame, 3 )], shl( st_ivas->bit_stream[sub( bits_per_frame, 2 )], 1 ) ) ); + + if ( EQ_16( ch, 5 ) ) + { + ch = 0; + move16(); + } + st_ivas->nchan_ism = ch; move16(); } test(); - IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) && NE_32( st_ivas->ism_mode, ISM_MODE_NONE ) ) + IF( EQ_32( ivas_format, MASA_FORMAT ) && GT_16( st_ivas->nchan_ism, 0 ) ) { - /* the number of objects was read */ - st->next_bit_pos = sub( st->next_bit_pos, NO_BITS_MASA_ISM_NO_OBJ ); - *nb_bits_read = add( *nb_bits_read, NO_BITS_MASA_ISM_NO_OBJ ); - move16(); - move16(); - - IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + /* there was OMASA in the input */ + hMasa->config.input_ivas_format = MASA_ISM_FORMAT; + move32(); + IF( LT_16( st_ivas->nchan_ism, 3 ) ) { - /* read index of separated object */ - /* nchan_ism should be > 1*/ + /* was read in ivas_init_dec() to distinguish between 1 and 2 objects */ + IF( EQ_16( st_ivas->bit_stream[bits_per_frame - 1], 0 ) ) + { + st_ivas->nchan_ism = 1; + move16(); + } + st->next_bit_pos = sub( st->next_bit_pos, MASA_TRANSP_BITS ); + *nb_bits_read = add( *nb_bits_read, MASA_TRANSP_BITS ); + + /* the two reserved bits were already read in ivas_init_dec()*/ + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; byteBuffer = st->bit_stream[( st->next_bit_pos )--]; move16(); - *nb_bits_read = add( *nb_bits_read, 1 ); move16(); - st_ivas->hMasaIsmData->idx_separated_ism = extract_l( L_add( L_shl( byteBuffer, 1 ), st->bit_stream[( st->next_bit_pos )--] ) ); + *nb_bits_read = add( *nb_bits_read, MASA_HEADER_BITS ); + + /* read number of directions */ + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; move16(); *nb_bits_read = add( *nb_bits_read, 1 ); - move16(); + hMasa->config.numberOfDirections = (UWord8) L_add( byteBuffer, 1 ); } ELSE { - st_ivas->hMasaIsmData->idx_separated_ism = -1; + /* if there are 3 or 4 objects the number of transport channels bit is given to MASA format + and used to read number of directions*/ + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + move16(); + *nb_bits_read = add( *nb_bits_read, 1 ); + hMasa->config.numberOfDirections = (UWord8) L_add( byteBuffer, 1 ); + + /* the two reserved bits were already read in ivas_init_dec()*/ + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + move16(); + move16(); + *nb_bits_read = add( *nb_bits_read, MASA_HEADER_BITS ); + } + } + ELSE + { + IF( NE_32( ivas_format, MASA_ISM_FORMAT ) ) + { + /* number of transport channels is always 2 for MASA_ISM format */ + /* the number of MASA transport channels was read in ivas_dec_setup() */ + st->next_bit_pos = sub( st->next_bit_pos, MASA_TRANSP_BITS ); + *nb_bits_read = add( *nb_bits_read, MASA_TRANSP_BITS ); move16(); } - /* read ISM importance flag (one per object) */ - IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + test(); + IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) && NE_32( st_ivas->ism_mode, ISM_MODE_NONE ) ) { - ism_imp = 0; + /* the number of objects was read */ + st->next_bit_pos = sub( st->next_bit_pos, NO_BITS_MASA_ISM_NO_OBJ ); + *nb_bits_read = add( *nb_bits_read, NO_BITS_MASA_ISM_NO_OBJ ); + move16(); move16(); - FOR( i = 0; i < ISM_METADATA_FLAG_BITS; i++ ) + IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { + /* read index of separated object */ + /* nchan_ism should be > 1*/ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; move16(); *nb_bits_read = add( *nb_bits_read, 1 ); move16(); - ism_imp = add( shl( ism_imp, 1 ), (Word16) byteBuffer ); - } - st_ivas->hIsmMetaData[0]->ism_imp = ism_imp; - move16(); - } - - IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) - { - ism_imp = 0; - move16(); - FOR( i = 0; i < ISM_METADATA_FLAG_BITS; i++ ) - { - byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + st_ivas->hMasaIsmData->idx_separated_ism = extract_l( L_add( L_shl( byteBuffer, 1 ), st->bit_stream[( st->next_bit_pos )--] ) ); move16(); *nb_bits_read = add( *nb_bits_read, 1 ); move16(); - ism_imp = add( shl( ism_imp, 1 ), (Word16) byteBuffer ); + } + ELSE + { + st_ivas->hMasaIsmData->idx_separated_ism = -1; move16(); } - st_ivas->hIsmMetaData[0]->ism_imp = ism_imp; - move16(); - /* reset */ - st_ivas->hIsmMetaData[0]->ism_md_null_flag = 0; - move16(); - st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = 0; - move16(); - IF( EQ_16( st_ivas->hIsmMetaData[0]->ism_imp, ISM_NO_META ) ) + /* read ISM importance flag (one per object) */ + IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { - /* read flags */ - st_ivas->hIsmMetaData[0]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--]; - move16(); - *nb_bits_read = add( *nb_bits_read, ISM_METADATA_MD_FLAG_BITS ); - move16(); - st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--]; + ism_imp = 0; move16(); - *nb_bits_read = add( *nb_bits_read, ISM_METADATA_INACTIVE_FLAG_BITS ); + + FOR( i = 0; i < ISM_METADATA_FLAG_BITS; i++ ) + { + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + move16(); + *nb_bits_read = add( *nb_bits_read, 1 ); + move16(); + ism_imp = add( shl( ism_imp, 1 ), (Word16) byteBuffer ); + } + st_ivas->hIsmMetaData[0]->ism_imp = ism_imp; move16(); } - } - ELSE IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - FOR( ch = 0; ch < st_ivas->nchan_ism; ch++ ) + + IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) { ism_imp = 0; move16(); @@ -278,66 +314,107 @@ ivas_error ivas_masa_decode_fx( *nb_bits_read = add( *nb_bits_read, 1 ); move16(); ism_imp = add( shl( ism_imp, 1 ), (Word16) byteBuffer ); + move16(); } - st_ivas->hIsmMetaData[ch]->ism_imp = ism_imp; + st_ivas->hIsmMetaData[0]->ism_imp = ism_imp; move16(); /* reset */ - st_ivas->hIsmMetaData[ch]->ism_md_null_flag = 0; + st_ivas->hIsmMetaData[0]->ism_md_null_flag = 0; move16(); - st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = 0; + st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = 0; move16(); - IF( EQ_16( st_ivas->hIsmMetaData[ch]->ism_imp, ISM_NO_META ) ) + + IF( EQ_16( st_ivas->hIsmMetaData[0]->ism_imp, ISM_NO_META ) ) { /* read flags */ - st_ivas->hIsmMetaData[ch]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--]; + st_ivas->hIsmMetaData[0]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--]; move16(); *nb_bits_read = add( *nb_bits_read, ISM_METADATA_MD_FLAG_BITS ); move16(); - st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--]; + st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--]; move16(); *nb_bits_read = add( *nb_bits_read, ISM_METADATA_INACTIVE_FLAG_BITS ); move16(); } } - st_ivas->flag_omasa_brate = 0; - move16(); - test(); - IF( GE_16( st_ivas->nchan_ism, 3 ) && EQ_32( ivas_total_brate, IVAS_128k ) ) + ELSE IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { - st_ivas->flag_omasa_brate = st->bit_stream[( st->next_bit_pos )--]; - move16(); - *nb_bits_read = add( *nb_bits_read, 1 ); + FOR( ch = 0; ch < st_ivas->nchan_ism; ch++ ) + { + ism_imp = 0; + move16(); + FOR( i = 0; i < ISM_METADATA_FLAG_BITS; i++ ) + { + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + move16(); + *nb_bits_read = add( *nb_bits_read, 1 ); + move16(); + ism_imp = add( shl( ism_imp, 1 ), (Word16) byteBuffer ); + } + st_ivas->hIsmMetaData[ch]->ism_imp = ism_imp; + move16(); + + /* reset */ + st_ivas->hIsmMetaData[ch]->ism_md_null_flag = 0; + move16(); + st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = 0; + move16(); + + IF( EQ_16( st_ivas->hIsmMetaData[ch]->ism_imp, ISM_NO_META ) ) + { + /* read flags */ + st_ivas->hIsmMetaData[ch]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--]; + move16(); + *nb_bits_read = add( *nb_bits_read, ISM_METADATA_MD_FLAG_BITS ); + move16(); + st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--]; + move16(); + *nb_bits_read = add( *nb_bits_read, ISM_METADATA_INACTIVE_FLAG_BITS ); + move16(); + } + } + + st_ivas->flag_omasa_brate = 0; move16(); + + test(); + IF( GE_16( st_ivas->nchan_ism, 3 ) && EQ_32( ivas_total_brate, IVAS_128k ) ) + { + st_ivas->flag_omasa_brate = st->bit_stream[( st->next_bit_pos )--]; + move16(); + *nb_bits_read = add( *nb_bits_read, 1 ); + move16(); + } } } - } - - /* read the MASA_ISM_FORMAT bit */ - byteBuffer = st->bit_stream[( st->next_bit_pos )--]; - move16(); - IF( EQ_32( byteBuffer, 1 ) ) - { - hMasa->config.input_ivas_format = MASA_ISM_FORMAT; - } - ELSE - { - hMasa->config.input_ivas_format = MASA_FORMAT; - } - move32(); + byteBuffer = st->bit_stream[st->next_bit_pos]; + move16(); + st->next_bit_pos = sub( st->next_bit_pos, 1 ); + byteBuffer = add( byteBuffer, shl( st->bit_stream[st->next_bit_pos], 1 ) ); + st->next_bit_pos = sub( st->next_bit_pos, 1 ); - /* reserved bit */ - byteBuffer = st->bit_stream[( st->next_bit_pos )--]; - move16(); - *nb_bits_read = add( *nb_bits_read, MASA_HEADER_BITS ); + test(); + IF( EQ_16( byteBuffer, 0 ) && EQ_32( ivas_format, MASA_FORMAT ) ) + { + hMasa->config.input_ivas_format = MASA_FORMAT; + move32(); + } + ELSE + { + hMasa->config.input_ivas_format = MASA_ISM_FORMAT; + move32(); + } + *nb_bits_read = add( *nb_bits_read, MASA_HEADER_BITS ); - /* read number of directions */ - byteBuffer = st->bit_stream[( st->next_bit_pos )--]; - move16(); - *nb_bits_read = add( *nb_bits_read, 1 ); - move16(); - hMasa->config.numberOfDirections = (UWord8) L_add( byteBuffer, 1 ); - move16(); + /* read number of directions */ + byteBuffer = st->bit_stream[( st->next_bit_pos )--]; + move16(); + *nb_bits_read = add( *nb_bits_read, 1 ); + move16(); + hMasa->config.numberOfDirections = (UWord8) L_add( byteBuffer, 1 ); + move16(); + } } ELSE { @@ -410,8 +487,9 @@ ivas_error ivas_masa_decode_fx( { IF( st_ivas->hDirAC != NULL ) { - *nb_bits_read = add( *nb_bits_read, ivas_decode_masaism_metadata_fx( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, - st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ) ); + *nb_bits_read = add( *nb_bits_read, + ivas_decode_masaism_metadata_fx( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, + st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ) ); move16(); FOR( obj = 0; obj <= st_ivas->nchan_ism; obj++ ) { @@ -423,14 +501,20 @@ ivas_error ivas_masa_decode_fx( FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { meta_write_index = add( st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, sf ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; - st_ivas->hMasaIsmData->azimuth_separated_ism[meta_write_index] = st_ivas->hMasaIsmData->azimuth_ism[obj][meta_write_index]; + st_ivas->hMasaIsmData->azimuth_separated_ism_fx[meta_write_index] = st_ivas->hMasaIsmData->azimuth_ism_fx[obj][meta_write_index]; move16(); - st_ivas->hMasaIsmData->elevation_separated_ism[meta_write_index] = st_ivas->hMasaIsmData->elevation_ism[obj][meta_write_index]; + st_ivas->hMasaIsmData->elevation_separated_ism_fx[meta_write_index] = st_ivas->hMasaIsmData->elevation_ism_fx[obj][meta_write_index]; move16(); } } } } + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) + { + *nb_bits_read = add( *nb_bits_read, ivas_decode_masaism_metadata_fx( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, + st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, + st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ) ); + } ELSE { *nb_bits_read = add( *nb_bits_read, ivas_decode_masaism_metadata_fx( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, @@ -488,7 +572,9 @@ ivas_error ivas_masa_decode_fx( hMasa->config.coherencePresent = !hQMetaData->all_coherence_zero; move16(); - IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + test(); + test(); + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && ( EQ_32( ivas_format, MASA_FORMAT ) || EQ_32( ivas_format, MASA_ISM_FORMAT ) ) ) { index_16bits_fx( hQMetaData, hMasa->data.sph_grid16 ); } @@ -579,12 +665,23 @@ ivas_error ivas_masa_decode_fx( ivas_qmetadata_to_dirac_fx( hQMetaData, st_ivas->hDirAC, hMasa, st_ivas->hSpatParamRendCom, ivas_total_brate, ivas_format, 0, 0 ); } + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) + { + Word16 index = add( st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, MAX_PARAM_SPATIAL_SUBFRAMES ); + IF( GE_16( index, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ) ) + { + index = sub( index, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ); + } + + st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx = index; + move16(); + } IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { IF( hQMetaData->q_direction == NULL ) { - if ( NE_32( ( error = ivas_masa_dec_config_fx( st_ivas ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_masa_dec_config_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -736,6 +833,15 @@ ivas_error ivas_masa_dec_open_fx( ism_total_brate = 0; move32(); + /* ISM metadata */ + + test(); + IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && st_ivas->hIsmMetaData[0] != NULL ) + { + /* these are not needed -> clean. EXT metafile writer in OMASA needs only the number of ISMs and writes default null-data */ + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + } + test(); test(); test(); @@ -758,7 +864,9 @@ ivas_error ivas_masa_dec_open_fx( move16(); /* Create spherical grid only for external output */ - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + test(); + test(); + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && ( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) ) { IF( ( hMasa->data.sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) { @@ -797,6 +905,7 @@ ivas_error ivas_masa_dec_open_fx( IF( st_ivas->hTcBuffer == NULL && NE_16( st_ivas->renderer_type, RENDERER_DISABLE ) && NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) && NE_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { Word16 nchan_to_allocate, nchan_transport; + Word16 granularity; TC_BUFFER_MODE buffer_mode; buffer_mode = TC_BUFFER_MODE_RENDERER; @@ -819,6 +928,8 @@ ivas_error ivas_masa_dec_open_fx( nchan_to_allocate = nchan_transport; move16(); + test(); + test(); test(); test(); IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) @@ -828,13 +939,20 @@ ivas_error ivas_masa_dec_open_fx( nchan_to_allocate = 1; move16(); } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && ( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_MIX_EXT ) || EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) ) + { + nchan_transport = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + nchan_to_allocate = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + } ELSE IF( EQ_16( st_ivas->nchan_transport, 1 ) && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) { /* addtl channel for CNG */ nchan_to_allocate = add( nchan_to_allocate, 1 ); } - IF( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, buffer_mode, nchan_transport, nchan_to_allocate, nchan_to_allocate, NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + granularity = ivas_jbm_dec_get_render_granularity_fx( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs ); + + IF( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, buffer_mode, nchan_transport, nchan_to_allocate, nchan_to_allocate, granularity ) ) != IVAS_ERR_OK ) { return error; } @@ -1003,7 +1121,7 @@ static ivas_error ivas_masa_dec_config_fx( } ELSE { - st_ivas->hQMetaData->q_direction[i].cfg.nblocks = 4; + st_ivas->hQMetaData->q_direction[i].cfg.nblocks = MAX_PARAM_SPATIAL_SUBFRAMES; } move16(); @@ -1076,8 +1194,8 @@ void ivas_masa_prerender_fx( test(); IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) || EQ_32( st_ivas->renderer_type, RENDERER_DISABLE ) ) { - v_multc_fixed( output_fx[0], SQRT2_FIXED, output_fx[0], output_frame ); /* q + 30 - 31 = q - 1*/ /* Gain transport signal when transmitting mono with cpe in order to match loudness */ - *q_shift = -1; /* Q has decreased by 1. */ + v_multc_fx( output_fx[0], SQRT2_FX, output_fx[0], output_frame ); /* q + 30 - 31 = q - 1*/ /* Gain transport signal when transmitting mono with cpe in order to match loudness */ + *q_shift = -1; /* Q has decreased by 1. */ move16(); } } @@ -1287,10 +1405,12 @@ static ivas_error init_lfe_synth_data_fx( test(); test(); test(); + test(); IF( st_ivas->hOutSetup.separateChannelEnabled && ( EQ_16( output_config, IVAS_AUDIO_CONFIG_5_1 ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_7_1 ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_5_1_2 ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_5_1_4 ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_7_1_4 ) || + EQ_16( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_FOA ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_HOA3 ) || ( EQ_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && ( st_ivas->hOutSetup.num_lfe > 0 ) ) ) ) @@ -1533,11 +1653,11 @@ static Word16 decode_lfe_to_total_energy_ratio_fx( } ELSE { - tmp16 = shr( McMASA_LFEGain_vectors_fx_q13[4 * lfeToTotalEnergyRatioIndices[2] + i], 1 ); /* Q12 */ - tmp16 = add( log2LFEaverage_fx, tmp16 ); /* Q12 */ - tmp32 = BASOP_util_Pow2( L_deposit_h( tmp16 ), 15 - Q12, &exp ); /* Q(31 - exp) */ - tmp16 = round_fx( tmp32 ); /* Q(31-exp) -> Q(15 - exp) */ - hMasaLfeSynth->lfeToTotalEnergyRatio_fx[i] = shr_sat( tmp16, sub( 1, exp ) ); /* should saturate. Q(15 - exp) - (1 - exp) -> Q14 */ + tmp16 = shr( extract_l( L_shr_r( McMASA_LFEGain_vectors_fx[4 * lfeToTotalEnergyRatioIndices[2] + i], Q12 ) ), 1 ); /* Q12 */ + tmp16 = add( log2LFEaverage_fx, tmp16 ); /* Q12 */ + tmp32 = BASOP_util_Pow2( L_deposit_h( tmp16 ), 15 - Q12, &exp ); /* Q(31 - exp) */ + tmp16 = round_fx( tmp32 ); /* Q(31-exp) -> Q(15 - exp) */ + hMasaLfeSynth->lfeToTotalEnergyRatio_fx[i] = shr_sat( tmp16, sub( 1, exp ) ); /* should saturate. Q(15 - exp) - (1 - exp) -> Q14 */ move16(); } @@ -1559,16 +1679,8 @@ static Word16 decode_lfe_to_total_energy_ratio_fx( * Reconfigure IVAS MASA decoder *-------------------------------------------------------------------*/ -/*-------------------------------------------------------------------* - * ivas_masa_dec_reconfigure_fx() - * - * Reconfigure IVAS MASA decoder - *-------------------------------------------------------------------*/ - ivas_error ivas_masa_dec_reconfigure_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - UWord16 *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ - Word16 *data /* o : output synthesis signal */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { Word16 n, tmp, num_bits; @@ -1577,11 +1689,10 @@ ivas_error ivas_masa_dec_reconfigure_fx( Decoder_State **sts; UWord32 ivas_total_brate, last_ivas_total_brate; Word16 numCldfbAnalyses_old, numCldfbSyntheses_old; + Word16 nchan_out_buff; ivas_error error; Word32 ism_total_brate; - - error = IVAS_ERR_OK; - move16(); + Word16 pos_idx; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; move32(); @@ -1589,7 +1700,9 @@ ivas_error ivas_masa_dec_reconfigure_fx( move32(); test(); - IF( st_ivas->hSpatParamRendCom != NULL && EQ_16( st_ivas->hSpatParamRendCom->slot_size, st_ivas->hTcBuffer->n_samples_granularity ) ) + test(); + /* Copy state to TC buffer if granularity matches and we are not in OMASA EXT rendering mode */ + IF( st_ivas->hSpatParamRendCom != NULL && EQ_16( st_ivas->hSpatParamRendCom->slot_size, st_ivas->hTcBuffer->n_samples_granularity ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { Copy( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; @@ -1598,7 +1711,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( move16(); } - ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); + ivas_init_dec_get_num_cldfb_instances_fx( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); /* renderer might have changed, reselect */ ivas_renderer_select( st_ivas ); @@ -1609,25 +1722,23 @@ ivas_error ivas_masa_dec_reconfigure_fx( test(); test(); test(); + test(); IF( ( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && st_ivas->hDirACRend == NULL ) || - ( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin == NULL ) ) + ( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin[0] == NULL ) ) { /* init a new DirAC dec */ - if ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) { return error; } } - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_DISABLE ) || EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_DISABLE ) || EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) || EQ_32( st_ivas->renderer_type, RENDERER_OMASA_MIX_EXT ) ) { - IF( st_ivas->hDirAC != NULL ) - { - /* close all unnecessary parametric decoding and rendering */ - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); - ivas_dirac_rend_close_fx( &( st_ivas->hDirACRend ) ); - ivas_spat_hSpatParamRendCom_close_fx( &( st_ivas->hSpatParamRendCom ) ); - ivas_dirac_dec_close_fx( &( st_ivas->hDirAC ) ); - } + /* close all unnecessary parametric decoding and rendering */ + ivas_dirac_dec_close_binaural_data_fx( st_ivas->hDiracDecBin ); + ivas_dirac_rend_close_fx( &( st_ivas->hDirACRend ) ); + ivas_spat_hSpatParamRendCom_close_fx( &( st_ivas->hSpatParamRendCom ) ); + ivas_dirac_dec_close_fx( &( st_ivas->hDirAC ) ); } /* possible reconfigure is done later */ @@ -1654,7 +1765,6 @@ ivas_error ivas_masa_dec_reconfigure_fx( FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { - // st_ivas->hSCE[sce_id]->element_brate = ivas_total_brate / st_ivas->nchan_transport; st_ivas->hSCE[sce_id]->element_brate = L_deposit_h( BASOP_Util_Divide3216_Scale( ivas_total_brate, st_ivas->nchan_transport, &tmp_e ) ); st_ivas->hSCE[sce_id]->element_brate = L_shr( st_ivas->hSCE[sce_id]->element_brate, sub( 15, tmp_e ) ); // Q0 @@ -1674,9 +1784,9 @@ ivas_error ivas_masa_dec_reconfigure_fx( test(); test(); test(); - IF( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin != NULL ) + IF( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin[0] != NULL ) { - if ( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ), IVAS_ERR_OK ) ) { return error; } @@ -1719,8 +1829,11 @@ ivas_error ivas_masa_dec_reconfigure_fx( test(); test(); test(); + test(); + test(); IF( ( LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) && GE_32( last_ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) || - ( LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) && EQ_32( last_ivas_total_brate, FRAME_NO_DATA ) ) ) + ( LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) && EQ_32( last_ivas_total_brate, FRAME_NO_DATA ) ) || + ( LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) && EQ_32( last_ivas_total_brate, IVAS_SID_5k2 ) ) ) { st_ivas->hCPE[cpe_id]->nchan_out = 1; move16(); @@ -1730,9 +1843,9 @@ ivas_error ivas_masa_dec_reconfigure_fx( test(); test(); test(); - IF( ( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && st_ivas->hDirACRend != NULL ) || ( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin != NULL ) ) + IF( ( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && st_ivas->hDirACRend != NULL ) || ( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin[0] != NULL ) ) { - if ( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ), IVAS_ERR_OK ) ) { return error; } @@ -1748,9 +1861,9 @@ ivas_error ivas_masa_dec_reconfigure_fx( test(); test(); test(); - IF( ( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && st_ivas->hDirACRend != NULL ) || ( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin != NULL ) ) + IF( ( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && st_ivas->hDirACRend != NULL ) || ( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin[0] != NULL ) ) { - if ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) { return error; } @@ -1758,11 +1871,14 @@ ivas_error ivas_masa_dec_reconfigure_fx( } } - IF( st_ivas->hDiracDecBin != NULL ) + FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) { - /* regularization factor is bitrate-dependent */ - st_ivas->hDiracDecBin->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); - move16(); + IF( st_ivas->hDiracDecBin[pos_idx] != NULL ) + { + /* regularization factor is bitrate-dependent */ + st_ivas->hDiracDecBin[pos_idx]->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); + move16(); + } } test(); @@ -1771,9 +1887,10 @@ ivas_error ivas_masa_dec_reconfigure_fx( /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ - IF( st_ivas->hDiracDecBin != NULL ) + + IF( st_ivas->hDiracDecBin[0] != NULL ) { - IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin[0]->hTdDecorr ), &( st_ivas->hDiracDecBin[0]->useTdDecorr ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -1782,6 +1899,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( /*-----------------------------------------------------------------* * CLDFB instances *-----------------------------------------------------------------*/ + IF( st_ivas->hSpar ) { Word16 Q_tmp = getScaleFactor16( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, 16 ); @@ -1789,7 +1907,8 @@ ivas_error ivas_masa_dec_reconfigure_fx( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q = Q_tmp; move16(); } - if ( NE_32( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, st_ivas->nchan_transport, numCldfbAnalyses_old, numCldfbSyntheses_old ) ), IVAS_ERR_OK ) ) + + IF( NE_32( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, st_ivas->nchan_transport, numCldfbAnalyses_old, numCldfbSyntheses_old ) ), IVAS_ERR_OK ) ) { return error; } @@ -1816,23 +1935,17 @@ ivas_error ivas_masa_dec_reconfigure_fx( ivas_masa_set_elements_fx( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &tmp, &tmp, &tmp, st_ivas->ivas_format, st_ivas->ism_mode, ism_total_brate ); - IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) - { - st_ivas->nchan_ism = 0; - move16(); - st_ivas->ism_mode = ISM_MODE_NONE; - move16(); - } - + /*-----------------------------------------------------------------* + * JBM TC buffers + *-----------------------------------------------------------------*/ { Word16 tc_nchan_to_allocate; Word16 tc_nchan_transport; TC_BUFFER_MODE buffer_mode_new; Word16 n_samples_granularity; - n_samples_granularity = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); - move16(); - buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); + n_samples_granularity = ivas_jbm_dec_get_render_granularity_fx( st_ivas->renderer_type, ivas_renderer_secondary_select_fx( st_ivas ), st_ivas->hDecoderConfig->output_Fs ); + buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode_fx( st_ivas ); tc_nchan_transport = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); tc_nchan_to_allocate = tc_nchan_transport; @@ -1842,25 +1955,34 @@ ivas_error ivas_masa_dec_reconfigure_fx( test(); test(); test(); + test(); + test(); IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - tc_nchan_to_allocate = add( shl( BINAURAL_CHANNELS, 1 ), 2 ); + tc_nchan_to_allocate = add( BINAURAL_CHANNELS, st_ivas->nchan_ism ); } ELSE { - tc_nchan_to_allocate = shl( BINAURAL_CHANNELS, 1 ); + tc_nchan_to_allocate = BINAURAL_CHANNELS; + move16(); + test(); + if ( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr ) + { + tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS; + move16(); + } } + test(); test(); test(); IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { - n_samples_granularity = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); /* Use the same granularity as tdrend */ IF( GT_16( n_samples_granularity, st_ivas->hTcBuffer->n_samples_granularity ) ) { - if ( NE_32( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_jbm_dec_set_discard_samples_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -1870,10 +1992,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( { IF( LT_16( n_samples_granularity, st_ivas->hTcBuffer->n_samples_granularity ) ) { - if ( NE_32( ( error = ivas_jbm_dec_flush_renderer_fx( st_ivas, n_samples_granularity, st_ivas->renderer_type, st_ivas->intern_config, &st_ivas->hIntSetup, MC_MODE_NONE, ISM_MASA_MODE_DISC, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } + /* flush already done in IVAS_DEC_ReadFormat() */ } } } @@ -1882,12 +2001,16 @@ ivas_error ivas_masa_dec_reconfigure_fx( /* addtl channel for CNG */ tc_nchan_to_allocate = add( tc_nchan_to_allocate, 1 ); } - + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && ( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_MIX_EXT ) || EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) ) + { + tc_nchan_transport = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + tc_nchan_to_allocate = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + } test(); test(); IF( NE_16( tc_nchan_transport, st_ivas->hTcBuffer->nchan_transport_jbm ) || NE_16( tc_nchan_to_allocate, st_ivas->hTcBuffer->nchan_transport_internal ) || NE_16( buffer_mode_new, st_ivas->hTcBuffer->tc_buffer_mode ) ) { - if ( NE_32( error = ivas_jbm_dec_tc_buffer_reconfigure_fx( st_ivas, buffer_mode_new, tc_nchan_transport, tc_nchan_to_allocate, tc_nchan_to_allocate, n_samples_granularity ), IVAS_ERR_OK ) ) + IF( NE_32( error = ivas_jbm_dec_tc_buffer_reconfigure_fx( st_ivas, buffer_mode_new, tc_nchan_transport, tc_nchan_to_allocate, tc_nchan_to_allocate, n_samples_granularity ), IVAS_ERR_OK ) ) { return error; } @@ -1916,7 +2039,21 @@ ivas_error ivas_masa_dec_reconfigure_fx( } } - return error; + /*-----------------------------------------------------------------* + * output audio buffers + *-----------------------------------------------------------------*/ + + test(); + IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && EQ_32( st_ivas->last_ivas_format, MASA_FORMAT ) ) /* note: switching with OMASA is addressed in ivas_omasa_dec_config() */ + { + nchan_out_buff = ivas_get_nchan_buffers_dec_fx( st_ivas, -1, -1 ); + IF( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff, st_ivas->hDecoderConfig->Opt_tsm, st_ivas->hTcBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; } @@ -2010,7 +2147,7 @@ void ivas_spar_param_to_masa_param_mapping_fx( move16(); hSpatParamRendCom->numSimultaneousDirections = 1; move16(); - hDiffuseDist = st_ivas->hDiracDecBin->hDiffuseDist; + hDiffuseDist = st_ivas->hDiracDecBin[0]->hDiffuseDist; nchan_transport = st_ivas->nchan_transport; move16(); band_grouping = hDirAC->band_grouping; @@ -2042,7 +2179,7 @@ void ivas_spar_param_to_masa_param_mapping_fx( } ELSE { - sf = idiv1616( hSpar->render_to_md_map[slot_idx + slot_idx_start], JBM_CLDFB_SLOTS_IN_SUBFRAME ); + sf = shr( hSpar->render_to_md_map[slot_idx + slot_idx_start], JBM_CLDFB_SLOTS_IN_SUBFRAME_LOG2 ); } IF( LT_16( sf, SPAR_META_DELAY_SUBFRAMES ) ) @@ -2504,21 +2641,12 @@ static void create_masa_ext_out_meta_fx( IVAS_QMETADATA_HANDLE hQMetaData, const Word16 nchan_transport ) { - const UWord8 ivasmasaFormatDescriptor[8] = { 0x49, 0x56, 0x41, 0x53, 0x4D, 0x41, 0x53, 0x41 }; /* "IVASMASA" */ Word16 i, sf, b_old, b_new, dir; MASA_DECRIPTIVE_META *descMeta; Word16 *bandMap; UWord8 numCodingBands; UWord8 numDirections; MASA_DECODER_EXT_OUT_META *extOutMeta; - move16(); /*ivasmasaFormatDescriptor*/ - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); numDirections = hMasa->config.numberOfDirections; move16(); @@ -2572,13 +2700,9 @@ static void create_masa_ext_out_meta_fx( { FOR( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ ) { - IF( EQ_32( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], ONE_IN_Q30 ) ) - { - hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf]--; - } - UWord8 tmp = (UWord8) L_shr( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], Q30 - 8 ); // Q8 + UWord8 tmp = (UWord8) W_extract_h( W_mult_32_16( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], UINT8_MAX << 1 ) ); // Q0 move16(); - extOutMeta->directToTotalRatio[dir][sf][b_new] = tmp; // Q8 + extOutMeta->directToTotalRatio[dir][sf][b_new] = tmp; // Q0 move16(); } } @@ -2637,12 +2761,8 @@ static void create_masa_ext_out_meta_fx( move16(); FOR( dir = 0; dir < numDirections; dir++ ) { - /* todo: not optimal, but less invasive */ - IF( EQ_32( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], ONE_IN_Q30 ) ) - { - hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf]--; - } - UWord8 tmp = (UWord8) L_shr( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], Q30 - 8 ); // Q8 + + UWord8 tmp = (UWord8) W_extract_h( W_mult_32_16( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], UINT8_MAX << 1 ) ); // Q0 move16(); extOutMeta->diffuseToTotalRatio[sf][b_new] = (UWord8) sub( extOutMeta->diffuseToTotalRatio[sf][b_new], tmp ); // Q8 move16(); @@ -3105,7 +3225,7 @@ static void decode_ism_ratios_fx( /* reconstructed values */ FOR( band = 0; band < nbands; band++ ) { - reconstruct_ism_ratios_fx( ratio_ism_idx[band], n_ism, STEP_PARAM_ISM_POW_RATIO_NBITS_Q15, ratio_ism[sf][band] ); + reconstruct_ism_ratios_fx( ratio_ism_idx[band], n_ism, STEP_PARAM_ISM_POW_RATIO_NBITS_Q31, ratio_ism[sf][band] ); } test(); @@ -3205,6 +3325,7 @@ static Word16 ivas_decode_masaism_metadata_fx( FOR( obj = 0; obj < nchan_ism; obj++ ) { + hMasaIsmData->bits_ism[obj] = bits_ism[obj]; index = 0; move16(); IF( LT_16( bits_ism[obj], 8 ) ) /* if low resolution, can look to the past */ @@ -3281,9 +3402,9 @@ static Word16 ivas_decode_masaism_metadata_fx( Word16 int_azi = rint_fx( L_shr( azimuth, Q22 - 16 ) ); // Q0, extra -16 is added as int_azi is W16 and azimuth is W32 Word16 int_ele = rint_fx( L_shr( elevation, Q22 - 16 ) ); // Q0 - hMasaIsmData->azimuth_ism[obj][meta_write_index] = int_azi; // Q0 + hMasaIsmData->azimuth_ism_fx[obj][meta_write_index] = int_azi; // Q0 move16(); - hMasaIsmData->elevation_ism[obj][meta_write_index] = int_ele; // Q0 + hMasaIsmData->elevation_ism_fx[obj][meta_write_index] = int_ele; // Q0 move16(); } } @@ -3328,6 +3449,13 @@ static Word16 ivas_decode_masaism_metadata_fx( hMasaIsmData->energy_ratio_ism_fx[dir][meta_write_index][b] = energy_ratio_ism_fx[i][band][dir]; move32(); } + + IF( hMasaIsmData->hExtData != NULL ) + { + hMasaIsmData->hExtData->masa_render_masa_to_total[meta_write_index][b] = + hMasaIsmData->masa_to_total_energy_ratio_fx[i][band]; + move32(); + } } } } @@ -3335,11 +3463,13 @@ static Word16 ivas_decode_masaism_metadata_fx( return sub( nb_bits_read, *next_bit_pos ); } + /* Fixed point implementation of rint(). */ -static Word16 rint_fx( /* returns in Q0 */ - Word32 num /* num in Q0 */ +/* returns in Q0 */ +static Word16 rint_fx( + const Word32 num /* num in Q0 */ ) { Word32 frac_part = L_and( L_abs( num ), 0x0000FFFF ); // Q15 diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index b2a8bd30bdb46557bab2db346c3659d2ad50d556..478a4d00d1579ae7e5504072b4bf5457c3af6db5 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -72,41 +72,29 @@ typedef struct parameter_band_mapping_struct static void ivas_param_mc_dec_init_fx( PARAM_MC_DEC_HANDLE hParamMC, const Word16 nchan_in, const Word16 nchan_out ); -static void ivas_param_mc_dec_copy_diffuse_proto( PARAM_MC_DEC_HANDLE hParamMC, Word32 Cldfb_buffer_real_fx[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_buffer_imag_fx[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const Word16 nY, const Word16 slot_idx ); +static void ivas_param_mc_dec_copy_diffuse_proto( PARAM_MC_DEC_HANDLE hParamMC, Word32 Cldfb_buffer_real_fx[MAX_LS_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_buffer_imag_fx[MAX_LS_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const Word16 nY, const Word16 slot_idx ); + static Word16 ivas_param_mc_range_decoder_LC_fx( UWord16 *bit_buffer, Word16 *x, Word16 *BER_detect, const Word16 sz_seq, const Word16 sz_alphabet, const UWord16 *cft, const UWord16 *sft, const Word16 tot_shift, const Word16 nbbits ); - -static void ivas_param_mc_get_mixing_matrices_fx( - PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ - IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, - Word32 Cx_in_fixed[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : input covariance for all parameter bands */ - Word16 Cx_in_e, - const Word16 param_band_idx, - Word32 *mixing_matrix_fx[], - Word16 *mixing_matrix_e, - Word32 *mixing_matrix_res_fx[], - Word16 *mixing_matrix_res_e, - const Word16 nY_intern, /* i : number of channels in the transported format */ - const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */ - const Word16 nX, /* i : number of transport channels */ - const Word16 nY_cov /* i : number of covariance synthesis output channels */ -); +static void ivas_param_mc_get_mixing_matrices_fx( PARAM_MC_DEC_HANDLE hParamMC, IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, Word32 Cx_in_fixed[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], Word16 Cx_in_e, const Word16 param_band_idx, Word32 *mixing_matrix_fx[], Word16 *mixing_matrix_e, Word32 *mixing_matrix_res_fx[], Word16 *mixing_matrix_res_e, const Word16 nY_intern, const PARAM_MC_SYNTHESIS_CONF synth_config, const Word16 nX, const Word16 nY_cov ); static Word16 ivas_param_mc_uniform_decoder_fx( Word16 *seq, const Word16 sz_seq, const Word16 *alphabet, const Word16 N, UWord16 bit_buffer[PARAM_MC_MAX_BITS] ); + static void ivas_param_mc_dec_compute_interpolator_fx( const UWord16 bAttackPresent, const UWord16 attackPos, const UWord16 interp_length, Word16 *interpolator ); static void param_mc_set_num_synth_bands( const Word32 output_Fs, PARAM_MC_DEC_HANDLE hParamMC ); static void ivas_param_mc_get_param_band_mapping( const Word16 n_target_bands, const Word16 *target_band_grouping, const Word16 n_source_bands, const Word16 *source_band_grouping, PARAM_MC_PARAMETER_BAND_MAPPING *parameter_band_mapping ); - static void ivas_param_mc_bs_decode_parameter_values_fx( UWord16 bit_buffer[], Word16 *bit_pos, const Word16 max_bits, Word16 *BER_detect, HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC, HANDLE_PARAM_MC_PARAMETER_CODING_INFO hParamCodingInfo, const Word16 map_size_wo_lfe, const Word16 map_size, const Word16 num_lfe_bands, const Word16 band_step, const Word16 num_param_bands, Word16 *value_buffer ); + static void ivas_param_mc_dequantize_cov_fx( PARAM_MC_DEC_HANDLE hParamMC, Word16 *ild_q_fx, Word16 *icc_q_fx, const Word16 param_band_index, const Word16 nY_cov, const PARAM_MC_SYNTHESIS_CONF synth_conf, const Word16 nY_int, const Word16 nX, Word32 *Cx_state_fx, Word16 Cx_state_e, Word32 *Cproto_fx, Word16 Cproto_e, Word32 *Cy_state_fx, Word16 *Cy_state_e ); + static ivas_error param_mc_get_diff_proto_info_fx( const Word32 *proto_mtx, const UWord16 nchan_transport, const UWord16 nchan_out_cov, PARAM_MC_DIFF_PROTO_INFO *p_diff_proto_info, Word16 Q_proto_mtx ); -static void param_mc_update_mixing_matrices_fx( PARAM_MC_DEC_HANDLE hParamMC, Word32 *mixing_matrix[], Word16 *mixing_matrix_fx, Word32 *mixing_matrix_res[], Word16 *mixing_matrix_res_exp, const UWord16 nX, const UWord16 nY ); +static void param_mc_update_mixing_matrices_fx( PARAM_MC_DEC_HANDLE hParamMC, Word32 *mixing_matrix[], Word16 *mixing_matrix_fx, Word32 *mixing_matrix_res[], Word16 *mixing_matrix_res_exp, const UWord16 nX, const UWord16 nY ); -static void param_mc_protoSignalComputation_fx( Word32 *RealBuffer_fx, Word32 *ImagBuffer_fx, Word32 *proto_frame_f_fx, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const Word16 num_freq_bands /*, Word16 RealBuffer_fx_e, Word16 ImagBuffer_fx_e, Word16 *common_e*/ ); +static void param_mc_protoSignalComputation_fx( Word32 *RealBuffer_fx, Word32 *ImagBuffer_fx, Word32 *proto_frame_f_fx, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const Word16 num_freq_bands, const Word16 Cldfb_Real_Imag_exp, Word16 *proto_frame_f_fx_q /* Word16 ImagBuffer_fx_e, Word16 *common_e*/ ); /*------------------------------------------------------------------------- * ivas_param_mc_dec_open() @@ -122,7 +110,7 @@ ivas_error ivas_param_mc_dec_open_fx( PARAM_MC_DEC_HANDLE hParamMC; Word16 nchan_out_transport; Word16 nchan_out_cov; - Word32 proto_matrix_fx[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + Word32 proto_matrix_fx[MAX_LS_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; Word32 proto_mtx_norm_fx, tmp32; Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; Word16 max_param_band_residual; @@ -165,7 +153,7 @@ ivas_error ivas_param_mc_dec_open_fx( test(); test(); test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) || EQ_32( st_ivas->transport_config, output_config ) ) + IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) || EQ_32( st_ivas->transport_config, output_config ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { hParamMC->synthesis_conf = PARAM_MC_SYNTH_DIRECT; move32(); @@ -248,12 +236,7 @@ ivas_error ivas_param_mc_dec_open_fx( *-----------------------------------------------------------------*/ // hParamMC->slot_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX; - Word16 temp_e; - Word16 temp = BASOP_Util_Divide3232_Scale( output_Fs, FRAMES_PER_SEC, &temp_e ); - temp = shr( temp, sub( 15, temp_e ) ); // Going back to Q0 - temp = BASOP_Util_Divide1616_Scale( temp, CLDFB_NO_COL_MAX, &temp_e ); - temp = shr( temp, sub( 15, temp_e ) ); // Going back to Q0 - hParamMC->slot_size = temp; + hParamMC->slot_size = shr( extract_l( Mpy_32_32_r( output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ), 4 ); move16(); set16_fx( hParamMC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set16_fx( hParamMC->subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); @@ -268,7 +251,6 @@ ivas_error ivas_param_mc_dec_open_fx( ivas_param_mc_metadata_open_fx( mc_ls_setup, ivas_total_brate, hParamMC->hMetadataPMC ); /* init arrays for quantized parameters */ - IF( ( hParamMC->icc_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( Word16 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); @@ -357,6 +339,7 @@ ivas_error ivas_param_mc_dec_open_fx( } } } + IF( ( hParamMC->proto_matrix_int_fx = (Word32 *) malloc( nchan_out_transport * nchan_transport * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); @@ -478,7 +461,8 @@ ivas_error ivas_param_mc_dec_open_fx( test(); test(); test(); - IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) + test(); + IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation || st_ivas->hCombinedOrientationData ) ) { IF( ( hParamMC->hoa_encoder_fx = (Word32 *) malloc( st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof( Word32 ) ) ) == NULL ) { @@ -513,6 +497,7 @@ ivas_error ivas_param_mc_dec_open_fx( IF( NE_32( hParamMC->synthesis_conf, PARAM_MC_SYNTH_MONO_STEREO ) ) { Word16 n_cldfb_slots; + Word16 granularity; n_cldfb_slots = DEFAULT_JBM_CLDFB_TIMESLOTS; move16(); @@ -528,18 +513,24 @@ ivas_error ivas_param_mc_dec_open_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); } set32_fx( hParamMC->Cldfb_RealBuffer_tc_fx, 0, cldfb_buf_size ); + hParamMC->Cldfb_RealBuffer_tc_e = 25; // Q6 , Initialised with Q6 to match non jbm and jbm cases + move16(); + IF( ( hParamMC->Cldfb_ImagBuffer_tc_fx = (Word32 *) malloc( cldfb_buf_size * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); } set32_fx( hParamMC->Cldfb_ImagBuffer_tc_fx, 0, cldfb_buf_size ); - + hParamMC->Cldfb_ImagBuffer_tc_e = 25; // Q6 , Initialised with Q6 to match non jbm and jbm cases + move16(); hParamMC->sz = imult1616( imult1616( n_cldfb_slots, nchan_transport ), hParamMC->num_freq_bands ); move16(); IF( st_ivas->hTcBuffer == NULL ) { - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ), IVAS_ERR_OK ) ) + granularity = ivas_jbm_dec_get_render_granularity_fx( st_ivas->renderer_type, RENDERER_DISABLE, output_Fs ); + + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, granularity ) ), IVAS_ERR_OK ) ) { return error; } @@ -557,6 +548,7 @@ ivas_error ivas_param_mc_dec_open_fx( move16(); st_ivas->hParamMC = hParamMC; + return error; } @@ -622,6 +614,7 @@ static void ivas_param_mc_get_param_band_mapping( parameter_band_mapping->n_source_bands[target_band_idx] = source_band_in_target_band_cnt; move16(); } + return; } @@ -640,7 +633,7 @@ ivas_error ivas_param_mc_dec_reconfig_fx( PARAM_MC_DEC_HANDLE hParamMC; Word16 nchan_out_transport; Word16 nchan_out_cov; - Word32 proto_matrix_fx[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + Word32 proto_matrix_fx[MAX_LS_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; Word32 proto_mtx_norm_fx; Word16 max_param_band_residual; UWord16 config_index; @@ -655,6 +648,7 @@ ivas_error ivas_param_mc_dec_reconfig_fx( hParamMC = st_ivas->hParamMC; error = IVAS_ERR_OK; move32(); + /* save important config information from the previous state */ nchan_transport_old = st_ivas->nchan_transport; move32(); @@ -714,6 +708,7 @@ ivas_error ivas_param_mc_dec_reconfig_fx( /*-----------------------------------------------------------------* * set input parameters *-----------------------------------------------------------------*/ + hParamMC->num_freq_bands = shr( add( (Word16) Mpy_32_32( output_Fs, INV_CLDFB_BANDWIDTH_Q31 << 1 ), 1 ), 1 ); // Q0 move16(); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; @@ -830,7 +825,6 @@ ivas_error ivas_param_mc_dec_reconfig_fx( *-----------------------------------------------------------------*/ /* prototype signal computation */ - IF( EQ_16( hParamMC->synthesis_conf, PARAM_MC_SYNTH_MONO_STEREO ) ) { IF( NE_16( nchan_transport_old, nchan_transport ) ) @@ -857,8 +851,8 @@ ivas_error ivas_param_mc_dec_reconfig_fx( Copy32( st_ivas->hLsSetUpConversion->dmxMtx_fx[k], &hParamMC->ls_conv_dmx_matrix_fx[k * nchan_out_cov], nchan_out_cov ); } } - /* convert ParamMC parameter bands to SFB */ + /* convert ParamMC parameter bands to SFB */ st_ivas->hLsSetUpConversion->sfbCnt = hParamMC->num_param_bands_synth; move16(); FOR( k = 0; k <= hParamMC->num_param_bands_synth; k++ ) @@ -1021,9 +1015,9 @@ ivas_error ivas_param_mc_dec_reconfig_fx( DIRAC_OUTPUT_SYNTHESIS_COV_STATE cov_state_old = hParamMC->h_output_synthesis_cov_state; DIRAC_OUTPUT_SYNTHESIS_PARAMS params_old = hParamMC->h_output_synthesis_params; - Word32 tmp_buf_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word32 tmp_buf_fx[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; - set_zero_fx( tmp_buf_fx, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + set_zero_fx( tmp_buf_fx, MAX_LS_CHANNELS * MAX_LS_CHANNELS ); /* output synthesis */ IF( NE_32( ( error = ivas_dirac_dec_output_synthesis_cov_open_fx( &( hParamMC->h_output_synthesis_params ), &( hParamMC->h_output_synthesis_cov_state ), hParamMC->max_band_decorr, PARAM_MC_MAX_NSLOTS, @@ -1048,14 +1042,14 @@ ivas_error ivas_param_mc_dec_reconfig_fx( FOR( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) { /* Cx */ - v_multc_fixed_16( cov_state_old.cx_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, imult1616( nchan_transport_old, nchan_transport_old ) ); // Q(31 - cov_state_old.cx_old_e) - v_add_fixed_me( tmp_buf_fx, cov_state_old.cx_old_e[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], hParamMC->h_output_synthesis_cov_state.cx_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cx_old_e[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cx_old_fx[new_param_band_idx], &hParamMC->h_output_synthesis_cov_state.cx_old_e[new_param_band_idx], imult1616( nchan_transport_old, nchan_transport_old ), 0 ); // Q(31 - hParamMC->h_output_synthesis_cov_state.cx_old_e[new_param_band_idx]) + v_multc_fx_16( cov_state_old.cx_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, imult1616( nchan_transport_old, nchan_transport_old ) ); // Q(31 - cov_state_old.cx_old_e) + v_add_fx_me( tmp_buf_fx, cov_state_old.cx_old_e[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], hParamMC->h_output_synthesis_cov_state.cx_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cx_old_e[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cx_old_fx[new_param_band_idx], &hParamMC->h_output_synthesis_cov_state.cx_old_e[new_param_band_idx], imult1616( nchan_transport_old, nchan_transport_old ), 0 ); // Q(31 - hParamMC->h_output_synthesis_cov_state.cx_old_e[new_param_band_idx]) /* Cy */ - v_multc_fixed_16( cov_state_old.cy_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, imult1616( nchan_out_cov, nchan_out_cov ) ); // Q(31 - cov_state_old.cy_old_e) - v_add_fixed_me( tmp_buf_fx, cov_state_old.cy_old_e[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], hParamMC->h_output_synthesis_cov_state.cy_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cy_old_e[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cy_old_fx[new_param_band_idx], &hParamMC->h_output_synthesis_cov_state.cy_old_e[new_param_band_idx], imult1616( nchan_out_cov, nchan_out_cov ), 0 ); // Q(31 - hParamMC->h_output_synthesis_cov_state.cy_old_e[new_param_band_idx]) + v_multc_fx_16( cov_state_old.cy_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, imult1616( nchan_out_cov, nchan_out_cov ) ); // Q(31 - cov_state_old.cy_old_e) + v_add_fx_me( tmp_buf_fx, cov_state_old.cy_old_e[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], hParamMC->h_output_synthesis_cov_state.cy_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cy_old_e[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cy_old_fx[new_param_band_idx], &hParamMC->h_output_synthesis_cov_state.cy_old_e[new_param_band_idx], imult1616( nchan_out_cov, nchan_out_cov ), 0 ); // Q(31 - hParamMC->h_output_synthesis_cov_state.cy_old_e[new_param_band_idx]) /* mixing matrix*/ - v_multc_fixed_16( cov_state_old.mixing_matrix_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, imult1616( nchan_transport_old, nchan_out_cov ) ); // Q(31 - mixing_matrix_old_exp) - v_add_fixed_me( tmp_buf_fx, cov_state_old.mixing_matrix_old_exp[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_exp[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_fx[new_param_band_idx], &hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_exp[new_param_band_idx], imult1616( nchan_transport_old, nchan_out_cov ), 0 ); // Q(31 - hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_exp[new_param_band_idx]) + v_multc_fx_16( cov_state_old.mixing_matrix_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, imult1616( nchan_transport_old, nchan_out_cov ) ); // Q(31 - mixing_matrix_old_exp) + v_add_fx_me( tmp_buf_fx, cov_state_old.mixing_matrix_old_exp[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_exp[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_fx[new_param_band_idx], &hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_exp[new_param_band_idx], imult1616( nchan_transport_old, nchan_out_cov ), 0 ); // Q(31 - hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_exp[new_param_band_idx]) } } FOR( new_param_band_idx = 0; new_param_band_idx < max_param_band_residual; new_param_band_idx++ ) @@ -1063,11 +1057,12 @@ ivas_error ivas_param_mc_dec_reconfig_fx( FOR( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) { /* residual mixing matrix*/ - v_multc_fixed_16( cov_state_old.mixing_matrix_res_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, imult1616( nchan_out_cov, nchan_out_cov ) ); // Q(31 - mixing_matrix_res_old_exp) - v_add_fixed_me( tmp_buf_fx, cov_state_old.mixing_matrix_res_old_exp[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_exp[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_fx[new_param_band_idx], &hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_exp[new_param_band_idx], imult1616( nchan_out_cov, nchan_out_cov ), 0 ); // Q(hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_exp[new_param_band_idx]) + v_multc_fx_16( cov_state_old.mixing_matrix_res_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, imult1616( nchan_out_cov, nchan_out_cov ) ); // Q(31 - mixing_matrix_res_old_exp) + v_add_fx_me( tmp_buf_fx, cov_state_old.mixing_matrix_res_old_exp[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_exp[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_fx[new_param_band_idx], &hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_exp[new_param_band_idx], imult1616( nchan_out_cov, nchan_out_cov ), 0 ); // Q(hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_exp[new_param_band_idx]) } } } + ivas_dirac_dec_output_synthesis_cov_close_fx( ¶ms_old, &cov_state_old ); } @@ -1086,7 +1081,6 @@ ivas_error ivas_param_mc_dec_reconfig_fx( set_zero_fx( hParamMC->proto_frame_f_fx, shl( imult1616( hParamMC->diff_proto_info->num_protos_diff, hParamMC->num_freq_bands ), 1 ) ); } - IF( NE_16( nchan_transport_old, nchan_transport ) ) { IF( NE_16( hParamMC->synthesis_conf, PARAM_MC_SYNTH_MONO_STEREO ) ) @@ -1137,6 +1131,7 @@ ivas_error ivas_param_mc_dec_reconfig_fx( } } } + return error; } @@ -1254,6 +1249,7 @@ void ivas_param_mc_dec_close_fx( free( hParamMC->diff_proto_info ); hParamMC->diff_proto_info = NULL; } + /* States */ /* free prototype signal buffers */ IF( hParamMC->proto_frame_f_fx != NULL ) @@ -1515,46 +1511,91 @@ void ivas_param_mc_dec_read_BS_fx( *------------------------------------------------------------------------*/ void ivas_param_mc_dec_digest_tc_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord8 nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ - Word32 *transport_channels_f_fx[], - Word16 transport_f_e ) + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord8 nCldfbSlots, /* i : number of CLDFB slots in transport channels */ + Word32 *p_data_fx[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const Word16 q_data /* i : Q-factor of input signal for single channel */ +) { - PARAM_MC_DEC_HANDLE hParamMC; - Word16 i, ch; + Word16 ch, num_freq_bands, slot_idx, cldfb_ch, n_ch_cldfb; + Word32 *cldfb_real_buffer, *cldfb_imag_buffer; + Word16 q_out = 0; + move16(); + + /* Initialization */ + num_freq_bands = st_ivas->hParamMC->num_freq_bands; + move16(); + n_ch_cldfb = sub( st_ivas->hTcBuffer->nchan_transport_jbm, st_ivas->hTcBuffer->nchan_buffer_full ); + + cldfb_real_buffer = st_ivas->hParamMC->Cldfb_RealBuffer_tc_fx; + cldfb_imag_buffer = st_ivas->hParamMC->Cldfb_ImagBuffer_tc_fx; + + /* CLDFB Analysis */ + FOR( ( ch = 0, cldfb_ch = 0 ); cldfb_ch < n_ch_cldfb; ( cldfb_ch++, ch++ ) ) + { + FOR( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) + { + q_out = q_data; + move16(); + + cldfbAnalysis_ts_fx_fixed_q( &( p_data_fx[ch][num_freq_bands * slot_idx] ), + &cldfb_real_buffer[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], + &cldfb_imag_buffer[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], + num_freq_bands, st_ivas->cldfbAnaDec[cldfb_ch], &q_out ); + } + + IF( st_ivas->hDecoderConfig->Opt_tsm ) + { + st_ivas->hParamMC->Cldfb_ImagBuffer_tc_e = q_out; + move16(); + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_prepare_renderer() + * + * + *------------------------------------------------------------------------*/ + +void ivas_param_mc_dec_prepare_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord8 nCldfbSlots /* i : number of CLDFB slots in transport channels */ +) +{ + Word16 i; Word16 is_next_band, skip_next_band; Word16 slot_idx, param_band_idx; Word16 nchan_transport, nchan_out_transport, nchan_out_cldfb; Word16 nchan_out_cov; + PARAM_MC_DEC_HANDLE hParamMC; /*CLDFB*/ - /* format converter */ - Word16 channel_active[MAX_OUTPUT_CHANNELS]; - IVAS_OUTPUT_SETUP *hSynthesisOutputSetup; - - hParamMC = st_ivas->hParamMC; - assert( hParamMC ); Word32 *pCx, *pCx_imag; Word32 cx_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; // Q(31 - cx_e) Word32 cx_imag_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; // Q(31 - cx_imag_e) Word32 cx_next_band_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; // Q(31 - cx_next_band_e) Word32 cx_imag_next_band_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; // Q(31 - cx_imag_next_band_e) - + Word32 real_part_fx, imag_part_fx, L_tmp1, L_tmp2; Word16 cx_buff_e[2][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; Word16 cx_e; Word16 cx_imag_e, tmp_e; Word16 cx_imag_next_band_e, cx_next_band_e; - Word16 qout = 0; - move16(); - - Word32 real_part_fx, imag_part_fx, L_tmp1, L_tmp2; - Word16 max_e; + /* format converter */ + Word16 channel_active[MAX_OUTPUT_CHANNELS]; + IVAS_OUTPUT_SETUP *hSynthesisOutputSetup; - push_wmops( "param_mc_dec_digest_tc" ); + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + + set16_fx( channel_active, 0, MAX_LS_CHANNELS ); - set16_fx( channel_active, 0, MAX_CICP_CHANNELS ); nchan_transport = st_ivas->nchan_transport; move16(); + nchan_out_transport = add( st_ivas->hTransSetup.nchan_out_woLFE, st_ivas->hTransSetup.num_lfe ); test(); @@ -1598,6 +1639,7 @@ void ivas_param_mc_dec_digest_tc_fx( hParamMC->hMetadataPMC->attackIndex = s_max( 0, add( hParamMC->hMetadataPMC->attackIndex, shr( sub( nCldfbSlots, DEFAULT_JBM_CLDFB_TIMESLOTS ), 1 ) ) ); move16(); } + /* adapt subframes */ hParamMC->num_slots = nCldfbSlots; move16(); @@ -1631,31 +1673,10 @@ void ivas_param_mc_dec_digest_tc_fx( move16(); cx_imag_next_band_e = 0; move16(); + /* slot loop for gathering the input data */ FOR( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) { - IF( st_ivas->hDecoderConfig->Opt_tsm ) - { - IF( param_band_idx == 0 ) /* only run cldfbAna once */ - { - Word32 RealBuffer_fx[CLDFB_NO_CHANNELS_MAX]; - Word32 ImagBuffer_fx[CLDFB_NO_CHANNELS_MAX]; - - /* CLDFB Analysis*/ - FOR( ch = 0; ch < nchan_transport; ch++ ) - { - qout = transport_f_e; - move16(); - cldfbAnalysis_ts_fx_fixed_q( &( transport_channels_f_fx[ch][hParamMC->num_freq_bands * slot_idx] ), RealBuffer_fx, ImagBuffer_fx, hParamMC->num_freq_bands, st_ivas->cldfbAnaDec[ch], &qout ); - - Copy32( RealBuffer_fx, &hParamMC->Cldfb_RealBuffer_tc_fx[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); - Copy32( ImagBuffer_fx, &hParamMC->Cldfb_ImagBuffer_tc_fx[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); - } - - hParamMC->Cldfb_ImagBuffer_tc_e = qout; - move16(); - } - } IF( GE_16( slot_idx, shl( hParamMC->hMetadataPMC->attackIndex, 1 ) ) ) { FOR( is_next_band = 0; is_next_band < 2; is_next_band++ ) @@ -1665,6 +1686,7 @@ void ivas_param_mc_dec_digest_tc_fx( { CONTINUE; } + IF( is_next_band ) { ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot_fx( &hParamMC->Cldfb_RealBuffer_tc_fx[slot_idx * hParamMC->num_freq_bands * nchan_transport], @@ -1766,6 +1788,7 @@ void ivas_param_mc_dec_digest_tc_fx( } } } + /* Cx for transport channels */ FOR( is_next_band = 0; is_next_band < 2; is_next_band++ ) { @@ -1785,15 +1808,22 @@ void ivas_param_mc_dec_digest_tc_fx( cx_e = max_e; move16(); - /* we have to do it similar to the encoder in case of attacks (i.e. accumulate two bands) to ensure correct DMX of the target covariance*/ - test(); test(); IF( hParamMC->hMetadataPMC->bAttackPresent && ( EQ_32( hParamMC->synthesis_conf, PARAM_MC_SYNTH_LS_CONV_COV ) || EQ_32( hParamMC->synthesis_conf, PARAM_MC_SYNTH_MONO_STEREO ) ) ) { - v_add_fx( cx_fx, cx_next_band_fx, cx_fx, imult1616( nchan_transport, nchan_transport ) ); - Copy32( cx_fx, cx_next_band_fx, imult1616( nchan_transport, nchan_transport ) ); + Word16 len = imult1616( nchan_transport, nchan_transport ); + Word16 sc = s_min( getScaleFactor32( cx_fx, len ), getScaleFactor32( cx_next_band_fx, len ) ); + IF( EQ_16( sc, 0 ) ) + { + Scale_sig32( cx_fx, len, -Q1 ); // add one bit head room + Scale_sig32( cx_next_band_fx, len, -Q1 ); // add one bit head room + cx_e = add( cx_e, Q1 ); + cx_next_band_e = add( cx_e, Q1 ); + } + v_add_fx( cx_fx, cx_next_band_fx, cx_fx, len ); + Copy32( cx_fx, cx_next_band_fx, len ); } FOR( is_next_band = 0; is_next_band < 2; is_next_band++ ) @@ -1819,16 +1849,15 @@ void ivas_param_mc_dec_digest_tc_fx( } } } - pop_wmops(); return; } /*------------------------------------------------------------------------- - * ivas_param_mc_dec() + * ivas_param_mc_dec_render() * - * Parametric MC decoding process + * Parametric MC rendering process *------------------------------------------------------------------------*/ void ivas_param_mc_dec_render_fx( @@ -1836,7 +1865,7 @@ void ivas_param_mc_dec_render_fx( const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ - Word32 *output_f_fx[], /* o : rendered time signal Q11*/ + Word32 *output_fx[], /* o : rendered time signal Q11*/ Word16 channel_active_fx[MAX_OUTPUT_CHANNELS] ) { PARAM_MC_DEC_HANDLE hParamMC; @@ -1845,26 +1874,21 @@ void ivas_param_mc_dec_render_fx( Word16 slot_idx, slot_idx_start, slot_idx_start_cldfb_synth, first_sf, last_sf, slots_to_render; Word16 nchan_transport, nchan_out_transport, nchan_out_cldfb; Word16 nchan_out_cov; - /*CLDFB*/ Word32 Cldfb_RealBuffer_fx[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; Word32 Cldfb_ImagBuffer_fx[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word32 *p_output_f_fx[MAX_OUTPUT_CHANNELS]; + Word32 Cldfb_RealBuffer_Binaural_fx[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_Binaural_fx[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 *p_output_fx[MAX_OUTPUT_CHANNELS]; FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { - p_output_f_fx[i] = output_f_fx[i]; // Q11 + p_output_fx[i] = output_fx[i]; // Q11 } /*Decorrelator*/ - Word32 onset_filter_fx[MAX_CICP_CHANNELS * CLDFB_NO_CHANNELS_MAX]; // Q31 - + Word32 onset_filter_fx[MAX_LS_CHANNELS * CLDFB_NO_CHANNELS_MAX]; // Q31 /* format converter */ Word16 channel_active[MAX_OUTPUT_CHANNELS]; UWord16 nband_synth; -#ifndef MSAN_FIX - UWord16 nchan_out_init, nbands_to_zero; -#endif UWord32 output_Fs; Word16 tmp_q = 0; move16(); @@ -1874,14 +1898,10 @@ void ivas_param_mc_dec_render_fx( push_wmops( "param_mc_dec_render" ); - set16_fx( channel_active, 0, MAX_CICP_CHANNELS ); + set16_fx( channel_active, 0, MAX_LS_CHANNELS ); nchan_transport = st_ivas->nchan_transport; move16(); nchan_out_transport = add( st_ivas->hTransSetup.nchan_out_woLFE, st_ivas->hTransSetup.num_lfe ); -#ifndef MSAN_FIX - nchan_out_init = nchan_out_transport; - move16(); -#endif output_Fs = st_ivas->hDecoderConfig->output_Fs; move32(); @@ -1891,12 +1911,6 @@ void ivas_param_mc_dec_render_fx( { nchan_out_cldfb = BINAURAL_CHANNELS; set16_fx( channel_active, 1, nchan_out_cldfb ); -#ifndef MSAN_FIX - IF( st_ivas->hCombinedOrientationData ) - { - nchan_out_init = MAX_INTERN_CHANNELS; - } -#endif nchan_out_cov = add( st_ivas->hTransSetup.nchan_out_woLFE, st_ivas->hTransSetup.num_lfe ); } ELSE IF( EQ_16( hParamMC->synthesis_conf, PARAM_MC_SYNTH_LS_CONV_CLDFB ) ) @@ -1924,21 +1938,12 @@ void ivas_param_mc_dec_render_fx( /* set everything to zero that will not be decoded */ nband_synth = hParamMC->band_grouping[hParamMC->num_param_bands_synth]; move16(); -#ifdef MSAN_FIX FOR( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) -#else - FOR( ch = 0; ch < nchan_out_init; ch++ ) -#endif { FOR( slot_idx = 0; slot_idx < JBM_CLDFB_SLOTS_IN_SUBFRAME; slot_idx++ ) { -#ifdef MSAN_FIX set32_fx( &( Cldfb_RealBuffer_fx[ch][slot_idx][0] ), 0, CLDFB_NO_CHANNELS_MAX ); set32_fx( &( Cldfb_ImagBuffer_fx[ch][slot_idx][0] ), 0, CLDFB_NO_CHANNELS_MAX ); -#else - set32_fx( &( Cldfb_RealBuffer_fx[ch][slot_idx][nband_synth] ), 0, nbands_to_zero ); - set32_fx( &( Cldfb_ImagBuffer_fx[ch][slot_idx][nband_synth] ), 0, nbands_to_zero ); -#endif } } @@ -1973,31 +1978,8 @@ void ivas_param_mc_dec_render_fx( slot_idx_start_cldfb_synth = 0; move16(); -#ifndef FIX_1009_OPT_PARAMMC_RENDER - Flag is_zero = 1; - move32(); -#endif FOR( j = 0; j < st_ivas->hParamMC->hMetadataPMC->nbands_coded; j++ ) { -#ifndef FIX_1009_OPT_PARAMMC_RENDER - is_zero = 1; - move16(); - FOR( i = 0; i < hParamMC->h_output_synthesis_cov_state.mixing_matrix_len; i++ ) - { - IF( hParamMC->h_output_synthesis_cov_state.mixing_matrix_fx[j][i] != 0 ) - { - is_zero = 0; - move16(); - } - } - IF( is_zero ) - { - hParamMC->h_output_synthesis_cov_state.mixing_matrix_exp[j] = 0; - move16(); - } - is_zero = 1; - move16(); -#else Flag is_zero = is_zero_arr( hParamMC->h_output_synthesis_cov_state.mixing_matrix_fx[j], hParamMC->h_output_synthesis_cov_state.mixing_matrix_len ); { if ( is_zero != 0 ) @@ -2006,23 +1988,10 @@ void ivas_param_mc_dec_render_fx( move16(); } } -#endif IF( LT_16( st_ivas->hParamMC->band_grouping[j], st_ivas->hParamMC->h_output_synthesis_params.max_band_decorr ) ) { -#ifndef FIX_1009_OPT_PARAMMC_RENDER - FOR( i = 0; i < hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_len; i++ ) - { - IF( NE_32( hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_fx[j][i], 0 ) ) - { - is_zero = 0; - move16(); - } - } - IF( is_zero ) -#else is_zero = is_zero_arr( hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_fx[j], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_len ); if ( is_zero != 0 ) -#endif { hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_exp[j] = 0; move16(); @@ -2038,22 +2007,23 @@ void ivas_param_mc_dec_render_fx( /*-----------------------------------------------------------------* * protoype signal computation *-----------------------------------------------------------------*/ + param_mc_protoSignalComputation_fx( &hParamMC->Cldfb_RealBuffer_tc_fx[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], &hParamMC->Cldfb_ImagBuffer_tc_fx[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], hParamMC->proto_frame_f_fx, hParamMC->diff_proto_info, - hParamMC->num_freq_bands ); + hParamMC->num_freq_bands, hParamMC->Cldfb_RealBuffer_tc_e, &hParamMC->proto_frame_f_fx_q ); /*-----------------------------------------------------------------* * frequency domain decorrelation *-----------------------------------------------------------------*/ - /* decorrelate prototype frame */ + /* decorrelate prototype frame */ ivas_dirac_dec_decorr_process_fx( hParamMC->num_freq_bands, hParamMC->num_outputs_diff, hParamMC->diff_proto_info->num_protos_diff, DIRAC_SYNTHESIS_COV_MC_LS, nchan_transport, hParamMC->proto_frame_f_fx, - Q5, + hParamMC->proto_frame_f_fx_q, hParamMC->diff_proto_info->num_protos_diff, hParamMC->diff_proto_info->proto_index_diff, hParamMC->proto_frame_dec_f_fx, // output @@ -2081,6 +2051,7 @@ void ivas_param_mc_dec_render_fx( /*-----------------------------------------------------------------* * output synthesis *-----------------------------------------------------------------*/ + ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( &hParamMC->Cldfb_RealBuffer_tc_fx[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], &hParamMC->Cldfb_ImagBuffer_tc_fx[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_exp, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_exp, slot_idx, add( slot_idx, slot_idx_start ), @@ -2133,8 +2104,8 @@ void ivas_param_mc_dec_render_fx( FOR( idx_lfe = 0; idx_lfe < hLsSetup.num_lfe; idx_lfe++ ) { /* Copy just the first band of LFE*/ - v_multc_fixed_16( Cldfb_RealBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], tmp, Cldfb_RealBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); - v_multc_fixed_16( Cldfb_ImagBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], tmp, Cldfb_ImagBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); + v_multc_fx_16( Cldfb_RealBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], tmp, Cldfb_RealBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); + v_multc_fx_16( Cldfb_ImagBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], tmp, Cldfb_ImagBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); Scale_sig32( Cldfb_RealBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1, tmp_exp ); Scale_sig32( Cldfb_ImagBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1, tmp_exp ); @@ -2142,8 +2113,8 @@ void ivas_param_mc_dec_render_fx( { IF( hLsSetup.index_lfe[idx_lfe] != ch ) { - v_add_fixed( Cldfb_RealBuffer_fx[ch][slot_idx], Cldfb_RealBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer_fx[ch][slot_idx], 1, 0 ); - v_add_fixed( Cldfb_ImagBuffer_fx[ch][slot_idx], Cldfb_ImagBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer_fx[ch][slot_idx], 1, 0 ); + v_add_fx_no_hdrm( Cldfb_RealBuffer_fx[ch][slot_idx], Cldfb_RealBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer_fx[ch][slot_idx], 1 ); + v_add_fx_no_hdrm( Cldfb_ImagBuffer_fx[ch][slot_idx], Cldfb_ImagBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer_fx[ch][slot_idx], 1 ); } } } @@ -2184,8 +2155,28 @@ void ivas_param_mc_dec_render_fx( { Word16 input_q = 6; move16(); + + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + IF( st_ivas->hSplitBinRend->hCldfbDataOut != NULL ) + { + FOR( slot_idx = 0; slot_idx < MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + FOR( ch = 0; ch < ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ); ch++ ) + { + Copy32( Cldfb_RealBuffer_fx[ch][slot_idx], st_ivas->hSplitBinRend->hCldfbDataOut->Cldfb_RealBuffer_fx[ch][add( slot_idx_start, slot_idx )], hParamMC->num_freq_bands ); + Copy32( Cldfb_ImagBuffer_fx[ch][slot_idx], st_ivas->hSplitBinRend->hCldfbDataOut->Cldfb_ImagBuffer_fx[ch][add( slot_idx_start, slot_idx )], hParamMC->num_freq_bands ); + } + } + st_ivas->hSplitBinRend->hCldfbDataOut->config = st_ivas->hIntSetup.output_config; + move16(); + } + } + /* Implement binaural rendering */ + /*Binaural output in Q6 format*/ ivas_binRenderer_fx( st_ivas->hBinRenderer, + ( st_ivas->hSplitBinRend == NULL ) ? NULL : &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, st_ivas->hCombinedOrientationData, hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, @@ -2204,12 +2195,22 @@ void ivas_param_mc_dec_render_fx( } } - FOR( Word16 idx1 = 0; idx1 < BINAURAL_CHANNELS; idx1++ ) + Word16 pos_idx; + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - FOR( Word16 idx2 = 0; idx2 < hParamMC->subframe_nbslots[subframe_idx]; idx2++ ) + FOR( pos_idx = 0; pos_idx < st_ivas->hBinRenderer->numPoses; pos_idx++ ) { - Scale_sig32( Cldfb_RealBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( Q6, input_q ) ); // Q6 - Scale_sig32( Cldfb_ImagBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( Q6, input_q ) ); // Q6 + FOR( slot_idx = 0; slot_idx < hParamMC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + FOR( ch = 0; ch < nchan_out_cldfb; ch++ ) + { + ivas_CLDFB_RINGBUF_Push( + st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], + Cldfb_RealBuffer_Binaural_fx[pos_idx][ch][slot_idx], + Cldfb_ImagBuffer_Binaural_fx[pos_idx][ch][slot_idx], + hParamMC->num_freq_bands ); + } + } } } /* update combined orientation access index */ @@ -2221,7 +2222,6 @@ void ivas_param_mc_dec_render_fx( ivas_lssetupconversion_process_param_mc_fx( st_ivas, hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, channel_active ); } - /* CLDFB synthesis */ FOR( ch = 0; ch < nchan_out_cldfb; ch++ ) { @@ -2235,8 +2235,8 @@ void ivas_param_mc_dec_render_fx( { IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { - RealBuffer_fx[i] = Cldfb_RealBuffer_Binaural_fx[ch][i]; // Q6 - ImagBuffer_fx[i] = Cldfb_ImagBuffer_Binaural_fx[ch][i]; // Q6 + RealBuffer_fx[i] = Cldfb_RealBuffer_Binaural_fx[0][ch][i]; // Q6 + ImagBuffer_fx[i] = Cldfb_ImagBuffer_Binaural_fx[0][ch][i]; // Q6 } ELSE { @@ -2246,32 +2246,27 @@ void ivas_param_mc_dec_render_fx( } Word16 len = add( imult1616( slot_idx_start_cldfb_synth, hParamMC->num_freq_bands ), imult1616( hParamMC->num_freq_bands, hParamMC->subframe_nbslots[subframe_idx] ) ); - scale_sig32( output_f_fx[ch], len, 5 - 11 ); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_f_fx[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), - imult1616( hParamMC->num_freq_bands, hParamMC->subframe_nbslots[subframe_idx] ), 0, st_ivas->cldfbSynDec[ch] ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_f_fx[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), - imult1616( hParamMC->num_freq_bands, hParamMC->subframe_nbslots[subframe_idx] ), st_ivas->cldfbSynDec[ch] ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + scale_sig32( output_fx[ch], len, 5 - 11 ); + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), + imult1616( hParamMC->num_freq_bands, hParamMC->subframe_nbslots[subframe_idx] ), 0, 0, st_ivas->cldfbSynDec[ch] ); - scale_sig32( output_f_fx[ch], len, 11 - 5 ); // Q11 + scale_sig32( output_fx[ch], len, 11 - 5 ); // Q11 } ELSE { - set32_fx( &( output_f_fx[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), 0, imult1616( hParamMC->num_freq_bands, hParamMC->subframe_nbslots[subframe_idx] ) ); + set32_fx( &( output_fx[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), 0, imult1616( hParamMC->num_freq_bands, hParamMC->subframe_nbslots[subframe_idx] ) ); } } slot_idx_start = add( slot_idx_start, hParamMC->subframe_nbslots[subframe_idx] ); slot_idx_start_cldfb_synth = add( slot_idx_start_cldfb_synth, hParamMC->subframe_nbslots[subframe_idx] ); } + IF( EQ_16( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) ) { - ivas_mc2sba_fx( st_ivas->hIntSetup, p_output_f_fx, p_output_f_fx, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0 ); + ivas_mc2sba_fx( st_ivas->hIntSetup, p_output_fx, p_output_fx, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0 ); } /* update */ - IF( EQ_16( hParamMC->slots_rendered, hParamMC->num_slots ) ) { hParamMC->hMetadataPMC->last_coded_bwidth = hParamMC->hMetadataPMC->coded_bwidth; @@ -2279,7 +2274,6 @@ void ivas_param_mc_dec_render_fx( param_mc_update_mixing_matrices_fx( hParamMC, hParamMC->h_output_synthesis_cov_state.mixing_matrix_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_exp, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_exp, nchan_transport, nchan_out_cov ); } - hParamMC->subframes_rendered = last_sf; move16(); *nSamplesAvailableNext = imult1616( sub( hParamMC->num_slots, hParamMC->slots_rendered ), NS2SA_FX2( output_Fs, CLDFB_SLOT_NS ) ); @@ -2372,8 +2366,9 @@ static void param_mc_protoSignalComputation_fx( Word32 *ImagBuffer_fx, /* i : CLDFB samples of the transport channels (imaginary part) */ Word32 *proto_frame_f_fx, /* o : interleaved complex prototype CLDFB samples */ const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */ - const Word16 num_freq_bands /* i : number of frequency bands for the prototypes */ -) + const Word16 num_freq_bands, /* i : number of frequency bands for the prototypes */ + const Word16 Cldfb_Real_Imag_exp, /*i: Exponent of real and imag buffers */ + Word16 *proto_frame_f_fx_q ) { Word16 band; Word16 proto_ch_idx, source_ch_cnt; @@ -2384,7 +2379,6 @@ static void param_mc_protoSignalComputation_fx( set32_fx( proto_frame_f_fx, 0, shl( imult1616( num_freq_bands, diff_proto_info->num_protos_diff ), 1 ) ); - FOR( proto_ch_idx = 0; proto_ch_idx < diff_proto_info->num_protos_diff; proto_ch_idx++ ) { Word16 num_source_ch = diff_proto_info->num_source_chan_diff[proto_ch_idx]; @@ -2405,19 +2399,20 @@ static void param_mc_protoSignalComputation_fx( FOR( band = 0; band < num_freq_bands; band++ ) { - - Word32 tmp_x = Mpy_32_32( fac_fx, ( *( p_real_buffer_fx++ ) ) ); // Q(30 + 6 - 31) :: Q5 + Word32 tmp_x = L_shl( Mpy_32_32( fac_fx, ( *( p_real_buffer_fx++ ) ) ), 4 ); // Q(26 + 4 + 6 - 31) :: Q5 *( p_proto_frame_fx ) = L_add( *( p_proto_frame_fx ), tmp_x ); move32(); p_proto_frame_fx++; - tmp_x = Mpy_32_32( fac_fx, ( *( p_imag_buffer_fx++ ) ) ); // Q(30 + 6 - 31) :: Q5 + tmp_x = L_shl( Mpy_32_32( fac_fx, ( *( p_imag_buffer_fx++ ) ) ), 4 ); // Q(26 + 4 + 6 - 31) :: Q5 *( p_proto_frame_fx ) = L_add( *( p_proto_frame_fx ), tmp_x ); move32(); p_proto_frame_fx++; } + *proto_frame_f_fx_q = sub( 30, Cldfb_Real_Imag_exp ); + move16(); } } @@ -2432,16 +2427,17 @@ static void param_mc_protoSignalComputation_fx( *------------------------------------------------------------------------*/ static void ivas_param_mc_dec_copy_diffuse_proto( - PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ - Word32 Cldfb_buffer_real_fx[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (real part) */ - Word32 Cldfb_buffer_imag_fx[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (imaginary part) */ - const Word16 nY, /* i : number of decorrelated channels */ - const Word16 slot_idx /* i : current time slot index */ + PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ + Word32 Cldfb_buffer_real_fx[MAX_LS_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (real part) */ + Word32 Cldfb_buffer_imag_fx[MAX_LS_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (imaginary part) */ + const Word16 nY, /* i : number of decorrelated channels */ + const Word16 slot_idx /* i : current time slot index */ ) { Word16 k, l; Word16 num_freq_bands, num_freq_bands_diff; Word32 *p_proto_diff_fx; + num_freq_bands = hParamMC->num_freq_bands; move16(); num_freq_bands_diff = hParamMC->h_output_synthesis_params.max_band_decorr; @@ -2488,11 +2484,13 @@ static Word16 ivas_param_mc_bin2dec_fx( return out; } + /*------------------------------------------------------------------------- * ivas_param_mc_uniform_decoder() * * decode a uniformily coded sequence of float values *------------------------------------------------------------------------*/ + static Word16 ivas_param_mc_uniform_decoder_fx( Word16 *seq, /* o : decoded sequence of float values hParamCodingInfo -> Q-quant*/ const Word16 sz_seq, /* i : number of values to decode */ @@ -2527,6 +2525,7 @@ static Word16 ivas_param_mc_uniform_decoder_fx( * * decode a sequency of inidices coded with a range coder *------------------------------------------------------------------------*/ + static Word16 ivas_param_mc_range_decoder_LC_fx( UWord16 *bit_buffer, /* i : bit buffer to read from */ Word16 *x, /* o : decoded indices */ @@ -2583,6 +2582,7 @@ static Word16 ivas_param_mc_range_decoder_LC_fx( return cur_bit_pos; } + /*------------------------------------------------------------------------- * param_mc_compute_interpolator() * @@ -2695,56 +2695,46 @@ static void ivas_param_mc_get_mixing_matrices_fx( Word16 ch_idx1, ch_idx2, lfe_idx1, lfe_idx2; Word16 remove_lfe; Word16 lfe_indices[PARAM_MC_LOCAL_SZ_LFE_MAP]; - Word32 Cx_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - Word32 Cy_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - - Word32 Cy_full_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - - Word32 Cr_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; // Q(31 - Cr_e) + Word32 Cy_fx[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; + Word32 Cy_full_fx[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; + Word32 Cr_fx[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; // Q(31 - Cr_e) Word16 Cr_e; Word32 Cy_diag_fx[MAX_OUTPUT_CHANNELS]; // Q(31 - Cy_diag_buff_e) Word16 Cy_diag_buff_e[MAX_OUTPUT_CHANNELS]; - Word32 mixing_matrix_local_fx[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; // Q(31 - mixing_matrix_local_e) + Word32 mixing_matrix_local_fx[MAX_LS_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; // Q(31 - mixing_matrix_local_e) Word16 Cy_diag_e = 0, mixing_matrix_local_e = 0; - Word32 Cproto_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; // Q(31 - Cproto_e) + Word32 Cproto_fx[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; // Q(31 - Cproto_e) Word16 Cproto_e; Word32 *proto_matrix_ptr_fx; // Q(31 - proto_matrix_ptr_e) Word32 *Cx_state_fx; // Q(31 - Cx_state_e) Word32 *Cx_old_state_fx; - Word32 Cy_state_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; // Q(31 - Cy_state_e) + Word32 Cy_state_fx[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; // Q(31 - Cy_state_e) Word32 *Cy_old_state_fx; Word16 Cx_state_e; Word16 Cy_state_e; - Word32 mixing_matrix_res_local_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; // Q(31 - mixing_matrix_res_local_e) + Word32 mixing_matrix_res_local_fx[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; // Q(31 - mixing_matrix_res_local_e) Word16 mixing_matrix_res_local_e; Word32 L_tmp; Word16 tmp_e, tmp; - Word16 proto_matrix_e = hParamMC->h_output_synthesis_params.proto_matrix_e; move16(); - Word32 proto_matrix_noLFE_fx[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS]; // Q(31 - proto_matrix_noLFE_e) - - Word32 mat_mult_buffer1_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; // Q(31 - mat_mult_buffer1_e) - - Word32 Cproto_diag_fx[MAX_CICP_CHANNELS]; // Q(31 - Cproto_diag_e) + Word32 proto_matrix_noLFE_fx[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_LS_CHANNELS]; // Q(31 - proto_matrix_noLFE_e) + Word32 mat_mult_buffer1_fx[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; // Q(31 - mat_mult_buffer1_e) + Word32 Cproto_diag_fx[MAX_LS_CHANNELS]; // Q(31 - Cproto_diag_e) Word16 mat_mult_buffer1_e, proto_matrix_ptr_e, Cproto_diag_e; - Word32 *ptrMM_fx; Word32 *ptrMM_out_fx; - Word16 Cy_e, Cx_e; Word16 Cy_full_e; Word16 new_e = 0; move16(); - set_zero_fx( Cproto_fx, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); - set_zero_fx( mat_mult_buffer1_fx, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); - set_zero_fx( proto_matrix_noLFE_fx, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS ); - set_zero_fx( mixing_matrix_local_fx, MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS ); -#ifdef MSAN_FIX - set_zero_fx( mixing_matrix_res_local_fx, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); -#endif + set_zero_fx( Cproto_fx, MAX_LS_CHANNELS * MAX_LS_CHANNELS ); + set_zero_fx( mat_mult_buffer1_fx, MAX_LS_CHANNELS * MAX_LS_CHANNELS ); + set_zero_fx( proto_matrix_noLFE_fx, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_LS_CHANNELS ); + set_zero_fx( mixing_matrix_local_fx, MAX_LS_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS ); + set_zero_fx( mixing_matrix_res_local_fx, MAX_LS_CHANNELS * MAX_LS_CHANNELS ); Word16 proto_matrix_noLFE_e = 0; move16(); @@ -2775,7 +2765,7 @@ static void ivas_param_mc_get_mixing_matrices_fx( proto_matrix_noLFE_e = proto_matrix_e; move16(); - set_zero_fx( proto_matrix_noLFE_fx, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS ); + set_zero_fx( proto_matrix_noLFE_fx, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_LS_CHANNELS ); FOR( ch_idx1 = 0; ch_idx1 < nX; ch_idx1++ ) { @@ -2800,6 +2790,7 @@ static void ivas_param_mc_get_mixing_matrices_fx( num_lfe_bands = PARAM_MC_MAX_BAND_LFE; move16(); } + IF( hSynthesisOutputSetup->num_lfe > 0 && param_band_idx >= num_lfe_bands ) { remove_lfe = 1; @@ -2825,10 +2816,8 @@ static void ivas_param_mc_get_mixing_matrices_fx( Cx_old_state_fx = hParamMC->h_output_synthesis_cov_state.cx_old_fx[param_band_idx]; Cy_old_state_fx = hParamMC->h_output_synthesis_cov_state.cy_old_fx[param_band_idx]; - /* Getting mixing mtx */ /* estimate target cov from input cov and proto_matrix */ - Cx_state_e = Cx_in_e; move16(); matrix_product_fx( hParamMC->proto_matrix_int_fx, nY_intern, nX, 0, Cx_state_fx, nX, nX, 0, mat_mult_buffer1_fx ); @@ -2858,8 +2847,6 @@ static void ivas_param_mc_get_mixing_matrices_fx( nY_intern, nX, Cx_state_fx, Cx_state_e, Cproto_fx, Cproto_e, Cy_state_fx, &Cy_state_e ); - // dbgwrite2_txt(Cy_state_fx,nY_intern*nY_intern,"../cy_state_fx.txt"); - /* Smoothing: Sum over two buffers */ IF( hParamMC->hMetadataPMC->bAttackPresent ) { @@ -2874,10 +2861,8 @@ static void ivas_param_mc_get_mixing_matrices_fx( ELSE { /* smoothing gains are now identical to one, simply add up */ - // v_add( Cy_state, Cy_old_state, Cy_full, nY_cov * nY_cov ); - - v_add_fixed_me( Cx_state_fx, Cx_state_e, Cx_old_state_fx, hParamMC->h_output_synthesis_cov_state.cx_old_e[param_band_idx], Cx_fx, &Cx_e, imult1616( nX, nX ), 1 ); - v_add_fixed_me( Cy_state_fx, Cy_state_e, Cy_old_state_fx, hParamMC->h_output_synthesis_cov_state.cy_old_e[param_band_idx], Cy_full_fx, &Cy_full_e, imult1616( nY_cov, nY_cov ), 1 ); + v_add_fx_me( Cx_state_fx, Cx_state_e, Cx_old_state_fx, hParamMC->h_output_synthesis_cov_state.cx_old_e[param_band_idx], Cx_fx, &Cx_e, imult1616( nX, nX ), 1 ); + v_add_fx_me( Cy_state_fx, Cy_state_e, Cy_old_state_fx, hParamMC->h_output_synthesis_cov_state.cy_old_e[param_band_idx], Cy_full_fx, &Cy_full_e, imult1616( nY_cov, nY_cov ), 1 ); } Copy32( Cx_state_fx, Cx_old_state_fx, imult1616( nX, nX ) ); @@ -2921,7 +2906,6 @@ static void ivas_param_mc_get_mixing_matrices_fx( /* remove LFE IF necessary */ IF( remove_lfe ) { - Cy_e = Cy_full_e; remove_lfe_from_cy_fx( nY_cov, lfe_indices, hSynthesisOutputSetup->num_lfe, Cy_full_fx, Cy_fx ); } @@ -2938,42 +2922,37 @@ static void ivas_param_mc_get_mixing_matrices_fx( matrix_product_diag_fx( mat_mult_buffer1_fx, mat_mult_buffer1_e, nY_band, nX, 0, proto_matrix_ptr_fx, proto_matrix_ptr_e, nY_band, nX, 1, Cproto_diag_fx, &Cproto_diag_e ); /* make sure we have no negative entries in Cproto_diag due to rounding errors */ - FOR( ch_idx1 = 0; ch_idx1 < nY_band; ch_idx1++ ) { -#ifdef OPT_BASOP_ADD_v1 if ( Cproto_diag_fx[ch_idx1] < 0 ) -#else /* OPT_BASOP_ADD_v1 */ - if ( BASOP_Util_Cmp_Mant32Exp( Cproto_diag_fx[ch_idx1], Cproto_diag_e, 0, 0 ) < 0 ) -#endif /* OPT_BASOP_ADD_v1 */ { Cproto_diag_fx[ch_idx1] = 0; move16(); } } - /* Computing the mixing matrices */ /* bands with decorr */ IF( LT_16( brange[0], hParamMC->h_output_synthesis_params.max_band_decorr ) ) { computeMixingMatrices_fx( nX, nY_band, Cx_fx, Cx_e, Cy_fx, Cy_e, proto_matrix_ptr_fx, proto_matrix_ptr_e, 0, PARAM_MC_REG_SX_FX, 0, PARAM_MC_REG_GHAT_FX, 0, mixing_matrix_local_fx, &mixing_matrix_local_e, Cr_fx, &Cr_e ); + /* Compute mixing matrix FOR residual */ computeMixingMatricesResidual_fx( nY_band, Cproto_diag_fx, Cproto_diag_e, Cr_fx, Cr_e, PARAM_MC_REG_SX_FX, 0, PARAM_MC_REG_GHAT_FX, 0, mixing_matrix_res_local_fx, &mixing_matrix_res_local_e ); IF( NE_16( mixing_matrix_res_local_e, mixing_matrix_local_e ) ) { - tmp = getScaleFactor32( mixing_matrix_local_fx, MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS ); - scale_sig32( mixing_matrix_local_fx, MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS, tmp ); + tmp = getScaleFactor32( mixing_matrix_local_fx, MAX_LS_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS ); + scale_sig32( mixing_matrix_local_fx, MAX_LS_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS, tmp ); mixing_matrix_local_e = sub( mixing_matrix_local_e, tmp ); - tmp = getScaleFactor32( mixing_matrix_res_local_fx, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); - scale_sig32( mixing_matrix_res_local_fx, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS, tmp ); + tmp = getScaleFactor32( mixing_matrix_res_local_fx, MAX_LS_CHANNELS * MAX_LS_CHANNELS ); + scale_sig32( mixing_matrix_res_local_fx, MAX_LS_CHANNELS * MAX_LS_CHANNELS, tmp ); mixing_matrix_res_local_e = sub( mixing_matrix_res_local_e, tmp ); - scale_sig32( mixing_matrix_local_fx, MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS, sub( mixing_matrix_local_e, s_max( mixing_matrix_local_e, mixing_matrix_res_local_e ) ) ); - scale_sig32( mixing_matrix_res_local_fx, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS, sub( mixing_matrix_res_local_e, s_max( mixing_matrix_local_e, mixing_matrix_res_local_e ) ) ); + scale_sig32( mixing_matrix_local_fx, MAX_LS_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS, sub( mixing_matrix_local_e, s_max( mixing_matrix_local_e, mixing_matrix_res_local_e ) ) ); + scale_sig32( mixing_matrix_res_local_fx, MAX_LS_CHANNELS * MAX_LS_CHANNELS, sub( mixing_matrix_res_local_e, s_max( mixing_matrix_local_e, mixing_matrix_res_local_e ) ) ); mixing_matrix_res_local_e = mixing_matrix_local_e = s_max( mixing_matrix_local_e, mixing_matrix_res_local_e ); move16(); @@ -3085,14 +3064,6 @@ static void ivas_param_mc_get_mixing_matrices_fx( } -/*------------------------------------------------------------------------- - * ivas_param_mc_get_mono_stereo_mixing_matrices() - * - * calculate the direct and residual mixing matrices - * for mono and stereo output - *------------------------------------------------------------------------*/ - - /*------------------------------------------------------------------------- * param_mc_update_mixing_matrices() * @@ -3141,13 +3112,6 @@ static void param_mc_update_mixing_matrices_fx( * generate the target covariance matrix *------------------------------------------------------------------------*/ - -/*------------------------------------------------------------------------- - * ivas_param_mc_dequantize_cov_fx() - * - * generate the target covariance matrix - *------------------------------------------------------------------------*/ - static void ivas_param_mc_dequantize_cov_fx( PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ Word16 *ild_q_fx, /* i : sequence of dequantized ILD values Q8 */ @@ -3221,7 +3185,6 @@ static void ivas_param_mc_dequantize_cov_fx( } /* estimate ICCs from estimated Cproto */ - FOR( k = 0; k < nY_int; k++ ) { // a_fx[k] = 1.f / ( sqrtf( Cproto_fx[k + nY_int * k] ) + EPSILON ); @@ -3351,17 +3314,16 @@ static void ivas_param_mc_dequantize_cov_fx( IF( EQ_32( synth_conf, PARAM_MC_SYNTH_LS_CONV_COV ) ) { /* Cy = dmx*Cy*dmx' */ - Word32 mat_mult_buffer1_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; // Q(31 - mat_mult_buffer1_e) - Word16 mat_mult_buffer1_e[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - Word32 target_ch_ener_fx[MAX_CICP_CHANNELS]; // Q(31 - target_ch_ener_e) - Word16 target_ch_ener_e[MAX_CICP_CHANNELS]; - Word32 dmx_ch_ener_fx[MAX_CICP_CHANNELS]; - - Word16 ls_conv_dmx_matrix_e[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - - set32_fx( target_ch_ener_fx, 0, MAX_CICP_CHANNELS ); - set16_fx( target_ch_ener_e, 0, MAX_CICP_CHANNELS ); - set32_fx( dmx_ch_ener_fx, 0, MAX_CICP_CHANNELS ); + Word32 mat_mult_buffer1_fx[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; // Q(31 - mat_mult_buffer1_e) + Word16 mat_mult_buffer1_e[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; + Word32 target_ch_ener_fx[MAX_LS_CHANNELS]; // Q(31 - target_ch_ener_e) + Word16 target_ch_ener_e[MAX_LS_CHANNELS]; + Word32 dmx_ch_ener_fx[MAX_LS_CHANNELS]; + Word16 ls_conv_dmx_matrix_e[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; + + set32_fx( target_ch_ener_fx, 0, MAX_LS_CHANNELS ); + set16_fx( target_ch_ener_e, 0, MAX_LS_CHANNELS ); + set32_fx( dmx_ch_ener_fx, 0, MAX_LS_CHANNELS ); set16_fx( ls_conv_dmx_matrix_e, 1, MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS ); matrix_product_mant_exp( hParamMC->ls_conv_dmx_matrix_fx, ls_conv_dmx_matrix_e, nY_cov, nY_int, 0, @@ -3465,6 +3427,7 @@ static void ivas_param_mc_dequantize_cov_fx( return; } + /*-------------------------------------------------------------------------* * param_mc_set_num_synth_bands() * @@ -3523,7 +3486,6 @@ static void param_mc_set_num_synth_bands( * calculated the diffuse prototype information *-------------------------------------------------------------------------*/ - static ivas_error param_mc_get_diff_proto_info_fx( const Word32 *proto_mtx, /* i : protoype matrix for the synthesis */ const UWord16 nchan_transport, /* i : number of transport channels */ @@ -3531,7 +3493,7 @@ static ivas_error param_mc_get_diff_proto_info_fx( PARAM_MC_DIFF_PROTO_INFO *p_diff_proto_info, /* o : generated diffuse prototype info */ Word16 Q_proto_mtx ) { - Word32 proto_fac_fx[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + Word32 proto_fac_fx[MAX_LS_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; UWord16 cur_out_ch; UWord16 cur_diff_proto; UWord16 cur_transport_ch; @@ -3541,7 +3503,7 @@ static ivas_error param_mc_get_diff_proto_info_fx( max_num_src_chan = 0; move16(); - set_zero_fx( proto_fac_fx, MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS ); + set_zero_fx( proto_fac_fx, MAX_LS_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS ); IF( ( p_diff_proto_info->proto_index_diff = (Word16 *) malloc( nchan_out_cov * sizeof( Word16 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); @@ -3558,7 +3520,7 @@ static ivas_error param_mc_get_diff_proto_info_fx( p_diff_proto_info->num_protos_diff = 1; move16(); - mvr2r_inc_fixed( proto_mtx, nchan_out_cov, proto_fac_fx, nchan_out_cov, nchan_transport ); + mvr2r_inc_fx( proto_mtx, nchan_out_cov, proto_fac_fx, nchan_out_cov, nchan_transport ); p_diff_proto_info->proto_index_diff[0] = 0; move16(); @@ -3609,7 +3571,7 @@ static ivas_error param_mc_get_diff_proto_info_fx( proto_mtx_ptr += nchan_out_cov; } - mvr2r_inc_fixed( proto_mtx + cur_out_ch, nchan_out_cov, proto_fac_fx + p_diff_proto_info->num_protos_diff, nchan_out_cov, nchan_transport ); + mvr2r_inc_fx( proto_mtx + cur_out_ch, nchan_out_cov, proto_fac_fx + p_diff_proto_info->num_protos_diff, nchan_out_cov, nchan_transport ); p_diff_proto_info->proto_index_diff[cur_out_ch] = p_diff_proto_info->num_protos_diff; move16(); @@ -3650,7 +3612,7 @@ static ivas_error param_mc_get_diff_proto_info_fx( { p_diff_proto_info->source_chan_idx[cur_diff_proto][p_diff_proto_info->num_source_chan_diff[cur_diff_proto]] = cur_transport_ch; move16(); - p_diff_proto_info->proto_fac_fx[cur_diff_proto][p_diff_proto_info->num_source_chan_diff[cur_diff_proto]] = L_shl( *proto_fac_ptr, 4 ); // (proto_fac_fx)Q26 + 4 = Q30 + p_diff_proto_info->proto_fac_fx[cur_diff_proto][p_diff_proto_info->num_source_chan_diff[cur_diff_proto]] = *proto_fac_ptr; // (proto_fac_fx)Q26 = Q26 move16(); p_diff_proto_info->num_source_chan_diff[cur_diff_proto] = add( p_diff_proto_info->num_source_chan_diff[cur_diff_proto], 1 ); move16(); @@ -3658,6 +3620,7 @@ static ivas_error param_mc_get_diff_proto_info_fx( proto_fac_ptr += nchan_out_cov; } } + return IVAS_ERR_OK; } diff --git a/lib_dec/ivas_mc_paramupmix_dec_fx.c b/lib_dec/ivas_mc_paramupmix_dec_fx.c index f4d6cb535bea9b6ca6fd4acecc82cc0841c8a1a7..889a7b37829ffa2da94079ee20848198f8c53f1d 100644 --- a/lib_dec/ivas_mc_paramupmix_dec_fx.c +++ b/lib_dec/ivas_mc_paramupmix_dec_fx.c @@ -44,16 +44,18 @@ #include "math.h" #include "wmc_auto.h" #include "rom_dec.h" -#include "ivas_rom_com_fx.h" + /*-----------------------------------------------------------------------* * Local arrays *-----------------------------------------------------------------------*/ /* boxes = { 0 1 2 3 [4 6] [5 7] [8 10] [9 11] }; */ -const Word16 MC_PARAMUPMIX_CHIDX1[MC_PARAMUPMIX_COMBINATIONS] = { 0, 1, 4, 5 }; -const Word16 MC_PARAMUPMIX_CHIDX2[MC_PARAMUPMIX_COMBINATIONS] = { 2, 3, 6, 7 }; -const Word16 qmf_to_par_band[] = { +static const Word16 MC_PARAMUPMIX_CHIDX1[MC_PARAMUPMIX_COMBINATIONS] = { 0, 1, 4, 5 }; + +static const Word16 MC_PARAMUPMIX_CHIDX2[MC_PARAMUPMIX_COMBINATIONS] = { 2, 3, 6, 7 }; + +static const Word16 qmf_to_par_band[] = { 0, 1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, @@ -62,6 +64,7 @@ const Word16 qmf_to_par_band[] = { 11, 11, 11, 11, 11, 11, 11, 11, 11, 11 }; + /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ @@ -118,6 +121,13 @@ void ivas_mc_paramupmix_dec_read_BS( move32(); } } + + FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + Copy32( hMCParamUpmix->alpha_prev_fx[i], hMCParamUpmix->alpha_sf_fx[i], IVAS_MAX_NUM_BANDS ); + Copy32( hMCParamUpmix->beta_prev_fx[i], hMCParamUpmix->beta_sf_fx[i], IVAS_MAX_NUM_BANDS ); + } + hMCParamUpmix->first_frame = 1; move16(); } @@ -145,6 +155,16 @@ void ivas_mc_paramupmix_dec_read_BS( st0->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; /* to avoid BER detect */ move32(); + + IF( EQ_16( hMCParamUpmix->first_frame, 0 ) ) + { + FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + Copy32( hMCParamUpmix->alphas_fx[i], hMCParamUpmix->alpha_prev_fx[i], IVAS_MAX_NUM_BANDS ); + Copy32( hMCParamUpmix->betas_fx[i], hMCParamUpmix->beta_prev_fx[i], IVAS_MAX_NUM_BANDS ); + } + } + FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { get_ec_data( st0, ALPHA, hMCParamUpmix->alpha_quant[i], alpha_quant, hMCParamUpmix->alphas_fx[i] ); @@ -167,6 +187,12 @@ void ivas_mc_paramupmix_dec_read_BS( hMCParamUpmix->first_frame = 0; move16(); } + + FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + Copy32( hMCParamUpmix->alpha_prev_fx[i], hMCParamUpmix->alpha_sf_fx[i], IVAS_MAX_NUM_BANDS ); + Copy32( hMCParamUpmix->beta_prev_fx[i], hMCParamUpmix->beta_sf_fx[i], IVAS_MAX_NUM_BANDS ); + } } pop_wmops(); @@ -180,10 +206,10 @@ void ivas_mc_paramupmix_dec_read_BS( * *------------------------------------------------------------------------*/ -void ivas_mc_paramupmix_dec_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord8 nCldfbSlots, /* i : number of CLFBS slots in the transport channels*/ - const Word16 nSamplesForRendering /* i : number of samples provided */ +void ivas_mc_paramupmix_dec_digest_tc_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord8 nCldfbSlots, /* i : number of CLDFB slots in transport channels */ + const Word16 nSamplesForRendering /* i : number of samples provided */ ) { MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; @@ -209,7 +235,7 @@ void ivas_mc_paramupmix_dec_digest_tc( * *------------------------------------------------------------------------*/ -void ivas_mc_paramupmix_dec_render( +void ivas_mc_paramupmix_dec_render_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ @@ -226,7 +252,7 @@ void ivas_mc_paramupmix_dec_render( hMCParamUpmix = st_ivas->hMCParamUpmix; assert( hMCParamUpmix ); - push_wmops( "ivas_mc_paramupmix_dec_render" ); + push_wmops( "ivas_mc_paramupmix_dec_render_fx" ); FOR( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) { @@ -257,11 +283,6 @@ void ivas_mc_paramupmix_dec_render( } { - FOR( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) - { - Copy32( hMCParamUpmix->alpha_prev_fx[ch], hMCParamUpmix->alpha_sf_fx[ch], IVAS_MAX_NUM_BANDS ); - Copy32( hMCParamUpmix->beta_prev_fx[ch], hMCParamUpmix->beta_sf_fx[ch], IVAS_MAX_NUM_BANDS ); - } FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { @@ -269,7 +290,7 @@ void ivas_mc_paramupmix_dec_render( ivas_mc_paramupmix_dec_sf( st_ivas, output_local_fx ); - Word16 num_ch = s_min( MAX_OUTPUT_CHANNELS, ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ) ); + Word16 num_ch = s_min( MAX_OUTPUT_CHANNELS, ivas_get_nchan_buffers_dec_fx( st_ivas, -1, -1 ) ); FOR( ch = 0; ch < num_ch; ch++ ) { output_local_fx[ch] += n_samples_sf; @@ -278,11 +299,6 @@ void ivas_mc_paramupmix_dec_render( /* update combined orientation access index */ ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_sf ); } - FOR( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) - { - Copy32( hMCParamUpmix->alphas_fx[ch], hMCParamUpmix->alpha_prev_fx[ch], IVAS_MAX_NUM_BANDS ); - Copy32( hMCParamUpmix->betas_fx[ch], hMCParamUpmix->beta_prev_fx[ch], IVAS_MAX_NUM_BANDS ); - } } *nSamplesAvailable = imult1616( sub( st_ivas->hTcBuffer->num_slots, st_ivas->hTcBuffer->slots_rendered ), (Word16) slot_size ); @@ -365,7 +381,11 @@ ivas_error ivas_mc_paramupmix_dec_open( } /* Head or external rotation */ - IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) + test(); + test(); + test(); + test(); + IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation || st_ivas->hCombinedOrientationData ) ) { IF( ( hMCParamUpmix->hoa_encoder_fx = (Word32 *) malloc( st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof( Word32 ) ) ) == NULL ) @@ -392,6 +412,7 @@ ivas_error ivas_mc_paramupmix_dec_open( { Word16 nchan_to_allocate; Word16 nchan_tc; + Word16 granularity; TC_BUFFER_MODE buffer_mode; buffer_mode = TC_BUFFER_MODE_RENDERER; @@ -418,7 +439,9 @@ ivas_error ivas_mc_paramupmix_dec_open( move16(); } - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ), IVAS_ERR_OK ) ) + granularity = ivas_jbm_dec_get_render_granularity_fx( st_ivas->renderer_type, RENDERER_DISABLE, output_Fs ); + + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, granularity ) ), IVAS_ERR_OK ) ) { return error; } @@ -716,20 +739,19 @@ static void ivas_mc_paramupmix_dec_sf( Word16 noparamupmix_delay, n_samples_rendered; MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; Word16 subframeIdx, idx_in, maxBand; -#ifdef MSAN_FIX Word32 Cldfb_RealBuffer_subfr_fx[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] = { 0 }; Word32 Cldfb_ImagBuffer_subfr_fx[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] = { 0 }; -#else - Word32 Cldfb_RealBuffer_subfr_fx[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_subfr_fx[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; -#endif // MSAN_FIX - Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + + Word32 Cldfb_RealBuffer_Binaural_fx[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_Binaural_fx[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word16 slot_index_start; hMCParamUpmix = st_ivas->hMCParamUpmix; assert( hMCParamUpmix ); push_wmops( "ivas_mc_paramupmix_dec_sf" ); + slot_index_start = st_ivas->hTcBuffer->slots_rendered; + FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { pPcm_temp_fx[2 * i] = output_fx[i + 4]; /* un-decorrelated Q11*/ @@ -844,22 +866,56 @@ static void ivas_mc_paramupmix_dec_sf( Word16 input_q = 6; move16(); + + /*LFE handling for split rendering cases*/ + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + IF( st_ivas->hSplitBinRend->hCldfbDataOut != NULL ) + { + FOR( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++ ) + { + FOR( ch = 0; ch < ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ); ch++ ) + { + Copy32( Cldfb_RealBuffer_subfr_fx[ch][slot_idx], st_ivas->hSplitBinRend->hCldfbDataOut->Cldfb_RealBuffer_fx[ch][add( slot_index_start, slot_idx )], maxBand ); + Copy32( Cldfb_ImagBuffer_subfr_fx[ch][slot_idx], st_ivas->hSplitBinRend->hCldfbDataOut->Cldfb_ImagBuffer_fx[ch][add( slot_index_start, slot_idx )], maxBand ); + } + } + + st_ivas->hSplitBinRend->hCldfbDataOut->config = st_ivas->hIntSetup.output_config; + move16(); + } + } + /* Implement binaural rendering */ + /*Binaural output in Q6 format*/ ivas_binRenderer_fx( st_ivas->hBinRenderer, + ( st_ivas->hSplitBinRend == NULL ) ? NULL : &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, st_ivas->hCombinedOrientationData, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, Cldfb_RealBuffer_subfr_fx, Cldfb_ImagBuffer_subfr_fx, &input_q ); - FOR( Word16 idx1 = 0; idx1 < BINAURAL_CHANNELS; idx1++ ) + Word16 pos_idx; + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - FOR( Word16 idx2 = 0; idx2 < MAX_PARAM_SPATIAL_SUBFRAMES; idx2++ ) + FOR( pos_idx = 0; pos_idx < st_ivas->hBinRenderer->numPoses; pos_idx++ ) { - Scale_sig32( Cldfb_RealBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( 6, input_q ) ); // Q6 - Scale_sig32( Cldfb_ImagBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( 6, input_q ) ); // Q6 + FOR( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ ) + { + FOR( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + { + ivas_CLDFB_RINGBUF_Push( + st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], + Cldfb_RealBuffer_Binaural_fx[pos_idx][ch][slot_idx], + Cldfb_ImagBuffer_Binaural_fx[pos_idx][ch][slot_idx], + maxBand ); + } + } } } + + /* Implement CLDFB synthesis */ FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { @@ -868,24 +924,10 @@ static void ivas_mc_paramupmix_dec_sf( FOR( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ ) { - RealBuffer_fx[slot_idx] = Cldfb_RealBuffer_Binaural_fx[ch][slot_idx]; // Q6 - ImagBuffer_fx[slot_idx] = Cldfb_ImagBuffer_Binaural_fx[ch][slot_idx]; // Q6 + RealBuffer_fx[slot_idx] = Cldfb_RealBuffer_Binaural_fx[0][ch][slot_idx]; // Q6 + ImagBuffer_fx[slot_idx] = Cldfb_ImagBuffer_Binaural_fx[0][ch][slot_idx]; // Q6 } - scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, Q5 - Q11 ); // Q11 -> Q5 - st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q5; - move16(); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch][0] ), imult1616( maxBand, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx] ), 0, st_ivas->cldfbSynDec[ch] ); // output_fx returned in Q5 -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch][0] ), imult1616( maxBand, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx] ), st_ivas->cldfbSynDec[ch] ); // output_fx returned in Q5 -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ - scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, Q11 - Q5 ); // Q5 -> Q11 - st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11; - move16(); - } - FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - Scale_sig32( output_fx[ch], imult1616( maxBand, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx] ), 6 ); // Q5 -> Q11 + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch][0] ), imult1616( maxBand, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx] ), 6, 0, st_ivas->cldfbSynDec[ch] ); // output_fx returned in Q11 } } ELSE @@ -912,14 +954,8 @@ static void ivas_mc_paramupmix_dec_sf( ptr_re_fx[0] = Cldfb_RealBuffer_fx[ch][slot_idx]; // Q6 ptr_im_fx[0] = Cldfb_ImagBuffer_fx[ch][slot_idx]; // Q6 - -#ifdef OPT_SBA_AVOID_SPAR_RESCALE cldfbSynthesis_ivas_fx( ptr_re_fx, ptr_im_fx, &( pPcm_temp_fx[ch][L_mult0( hMCParamUpmix->num_freq_bands, slot_idx )] ), - hMCParamUpmix->num_freq_bands, 0, st_ivas->cldfbSynDec[ch] ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( ptr_re_fx, ptr_im_fx, &( pPcm_temp_fx[ch][L_mult0( hMCParamUpmix->num_freq_bands, slot_idx )] ), - hMCParamUpmix->num_freq_bands, st_ivas->cldfbSynDec[ch] ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + hMCParamUpmix->num_freq_bands, 0, 0, st_ivas->cldfbSynDec[ch] ); } scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, sub( Q11, st_ivas->cldfbSynDec[ch]->Q_cldfb_state ) ); // Q6 -> Q11 st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11; @@ -937,22 +973,30 @@ static void ivas_mc_paramupmix_dec_sf( { FOR( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) { - Word32 tmp_buf_fx[L_SUBFRAME5MS_48k]; - Copy32( &output_fx[ch][n_samples_rendered - noparamupmix_delay], tmp_buf_fx, noparamupmix_delay ); - Copy32( output_fx[ch], &output_fx[ch][noparamupmix_delay], sub( n_samples_rendered, noparamupmix_delay ) ); - Copy32( hMCParamUpmix->pcm_delay_fx[ch], output_fx[ch], noparamupmix_delay ); - Copy32( tmp_buf_fx, hMCParamUpmix->pcm_delay_fx[ch], noparamupmix_delay ); + /*delay is handled within LFE decoder*/ + IF( NE_16( st_ivas->hIntSetup.index_lfe[0], ch ) ) + { + Word32 tmp_buf_fx[L_SUBFRAME5MS_48k]; + Copy32( &output_fx[ch][n_samples_rendered - noparamupmix_delay], tmp_buf_fx, noparamupmix_delay ); + Copy32( output_fx[ch], &output_fx[ch][noparamupmix_delay], sub( n_samples_rendered, noparamupmix_delay ) ); + Copy32( hMCParamUpmix->pcm_delay_fx[ch], output_fx[ch], noparamupmix_delay ); + Copy32( tmp_buf_fx, hMCParamUpmix->pcm_delay_fx[ch], noparamupmix_delay ); + } } } ELSE { FOR( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) { - Word32 tmp_buf_fx[L_SUBFRAME5MS_48k]; - Copy32( &output_fx[ch][0], tmp_buf_fx, n_samples_rendered ); - Copy32( hMCParamUpmix->pcm_delay_fx[ch], output_fx[ch], n_samples_rendered ); - Copy32( &hMCParamUpmix->pcm_delay_fx[ch][n_samples_rendered], &hMCParamUpmix->pcm_delay_fx[ch][0], sub( noparamupmix_delay, n_samples_rendered ) ); - Copy32( tmp_buf_fx, &hMCParamUpmix->pcm_delay_fx[ch][noparamupmix_delay - n_samples_rendered], n_samples_rendered ); + /*delay is handled within LFE decoder*/ + IF( NE_16( st_ivas->hIntSetup.index_lfe[0], ch ) ) + { + Word32 tmp_buf_fx[L_SUBFRAME5MS_48k]; + Copy32( &output_fx[ch][0], tmp_buf_fx, n_samples_rendered ); + Copy32( hMCParamUpmix->pcm_delay_fx[ch], output_fx[ch], n_samples_rendered ); + Copy32( &hMCParamUpmix->pcm_delay_fx[ch][n_samples_rendered], &hMCParamUpmix->pcm_delay_fx[ch][0], sub( noparamupmix_delay, n_samples_rendered ) ); + Copy32( tmp_buf_fx, &hMCParamUpmix->pcm_delay_fx[ch][noparamupmix_delay - n_samples_rendered], n_samples_rendered ); + } } } } diff --git a/lib_dec/ivas_mct_core_dec_fx.c b/lib_dec/ivas_mct_core_dec_fx.c index b42eb534b34af52b78b359306728ea7fd919f4a3..f96a20126250b065cfcc5d50b404ae4c780ba283 100644 --- a/lib_dec/ivas_mct_core_dec_fx.c +++ b/lib_dec/ivas_mct_core_dec_fx.c @@ -62,7 +62,7 @@ void ivas_mct_side_bits_fx( { Word16 ch, cpe_id, nChannels, i, k, nSubframes; Word16 nf_side_bits, availableBits, next_bit_pos, nf_bits; - Word16 chBitRatios[MCT_MAX_CHANNELS], tmp, scale; + Word16 chBitRatios[MCT_MAX_CHANNELS], tmp; Decoder_State *st, *sts[MCT_MAX_CHANNELS]; nf_side_bits = 0; @@ -75,9 +75,12 @@ void ivas_mct_side_bits_fx( { FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - sts[i] = hCPE[cpe_id]->hCoreCoder[ch]; - i = add( i, 1 ); - move16(); + IF( LT_16( i, MCT_MAX_CHANNELS ) ) + { + sts[i] = hCPE[cpe_id]->hCoreCoder[ch]; + i = add( i, 1 ); + move16(); + } } } @@ -142,9 +145,7 @@ void ivas_mct_side_bits_fx( } } - tmp = BASOP_Util_Divide3232_Scale( ivas_total_brate, FRAMES_PER_SEC, &scale ); - tmp = shr( tmp, sub( 15, scale ) ); - + tmp = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); availableBits = ( sub( sub( tmp, sts[0]->next_bit_pos ), nf_side_bits ) ); availableBits = sub( availableBits, nb_bits_metadata ); @@ -198,7 +199,7 @@ void ivas_mct_core_dec( Word16 tcx_offset; Word16 tcx_offsetFB; Word16 left_rect; - Word16 L_spec, scale, tmp1, tmp2; + Word16 L_spec; #ifdef DEBUG_MCT float nrg[MCT_MAX_CHANNELS]; #endif @@ -218,22 +219,13 @@ void ivas_mct_core_dec( move16(); FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) { - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ( ch++, i++ ) ) { - sts[i] = hCPE[cpe_id]->hCoreCoder[ch]; - i = add( i, 1 ); - } - } - - i = 0; - move16(); - FOR( ch = 0; ch < nChannels; ch++ ) - { - IF( EQ_32( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) - { - CONTINUE; + IF( LT_16( i, MCT_MAX_CHANNELS ) ) + { + sts[i] = hCPE[cpe_id]->hCoreCoder[ch]; + } } - i = add( i, 1 ); } bfi = sts[0]->bfi; @@ -246,7 +238,7 @@ void ivas_mct_core_dec( move16(); x_fx[ch][0] = signal_out_fx[ch]; x_fx[ch][1] = signal_out_fx[ch] + ( L_FRAME48k / 2 ); - q_x[ch] = Q12; + q_x[ch] = Q11; move16(); } @@ -268,41 +260,58 @@ void ivas_mct_core_dec( { CONTINUE; } - IF( EQ_16( st->core, TCX_10_CORE ) ) { - nSubframes = NB_DIV; + Word16 L_frame_2 = shr( st->L_frame, 1 ); + Word16 L_frameTCX_2 = shr( st->hTcxDec->L_frameTCX, 1 ); + nSubframes = NB_DIV; // assuming NB_DIV is 2. Below logic needs to be modified if NB_DIV changes. + move16(); + FOR( k = 0; k < nSubframes; k++ ) + { + L_spec = shr( st->hTcxCfg->tcx_coded_lines, 1 ); + move32(); + + init_tcx_info_fx( st, L_frame_2, L_frameTCX_2, k, bfi, &tcx_offset, &tcx_offsetFB, &L_frame, &L_frameTCX, &left_rect, &L_spec ); + + Word16 x_e, x_len; + /* mono or dual mono IGF decoding */ + x_e = sub( 31, q_x[ch] ); + decoder_tcx_IGF_mono_fx( st, x_fx[ch][k], &x_e, &x_len, L_frame, left_rect, bfi, k ); + q_x[ch] = sub( 31 - 11, x_e ); // Shift to bring x to Q12 + move16(); + FOR( i = 0; i < x_len; i++ ) + { + x_fx[ch][k][i] = L_shr( x_fx[ch][k][i], q_x[ch] ); + move32(); + } + q_x[ch] = Q11; + move16(); + } } ELSE { nSubframes = 1; - } - move16(); - - FOR( k = 0; k < nSubframes; k++ ) - { - L_spec = BASOP_Util_Divide1616_Scale( st->hTcxCfg->tcx_coded_lines, nSubframes, &scale ); - L_spec = shr( L_spec, sub( 15, scale ) ); - - tmp1 = BASOP_Util_Divide1616_Scale( st->L_frame, nSubframes, &scale ); - tmp1 = shr( tmp1, sub( 15, scale ) ); - tmp2 = BASOP_Util_Divide1616_Scale( st->hTcxDec->L_frameTCX, nSubframes, &scale ); - tmp2 = shr( tmp1, sub( 15, scale ) ); - init_tcx_info_fx( st, tmp1, tmp2, k, bfi, &tcx_offset, &tcx_offsetFB, &L_frame, &L_frameTCX, &left_rect, &L_spec ); - - Word16 x_e, x_len; - /* mono or dual mono IGF decoding */ - x_e = sub( 31, q_x[ch] ); - decoder_tcx_IGF_mono_fx( st, x_fx[ch][k], &x_e, &x_len, L_frame, left_rect, bfi, k ); - q_x[ch] = sub( 31, x_e ); move16(); - FOR( i = 0; i < x_len; i++ ) { - x_fx[ch][k][i] = L_shr( x_fx[ch][k][i], sub( q_x[ch], Q12 ) ); + L_spec = st->hTcxCfg->tcx_coded_lines; move32(); + + init_tcx_info_fx( st, st->L_frame, st->hTcxDec->L_frameTCX, 0, bfi, &tcx_offset, &tcx_offsetFB, &L_frame, &L_frameTCX, &left_rect, &L_spec ); + + Word16 x_e, x_len; + /* mono or dual mono IGF decoding */ + x_e = sub( 31, q_x[ch] ); + decoder_tcx_IGF_mono_fx( st, x_fx[ch][0], &x_e, &x_len, L_frame, left_rect, bfi, 0 ); + q_x[ch] = sub( 31 - 11, x_e ); // Shift to bring x to Q12 + move16(); + FOR( i = 0; i < x_len; i++ ) + { + x_fx[ch][0][i] = L_shr( x_fx[ch][0][i], q_x[ch] ); + move32(); + } + q_x[ch] = Q11; + move16(); } - q_x[ch] = Q12; - move16(); } } } @@ -318,19 +327,7 @@ void ivas_mct_core_dec( * MCT processing *--------------------------------------------------------------------------------*/ - apply_MCT_dec_fx( hMCT, sts, x_fx, q_x ); - FOR( ch = 0; ch < nChannels; ch++ ) - { - FOR( i = 0; i < L_FRAME48k / 2; i++ ) - { - x_fx[ch][0][i] = L_shr( x_fx[ch][0][i], sub( q_x[ch], Q12 ) ); - x_fx[ch][1][i] = L_shr( x_fx[ch][1][i], sub( q_x[ch], Q12 ) ); - move32(); - move32(); - } - q_x[ch] = Q12; - move16(); - } + apply_MCT_dec_fx( hMCT, sts, x_fx ); } pop_wmops(); diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index 4eb0ad68617c2b2b31848cca543a078f80302dd4..b88d95b18e324ebcdc056424793aa0d103634f84 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -48,7 +48,7 @@ * Local function prototypes *-----------------------------------------------------------------------*/ -static ivas_error ivas_mc_dec_reconfig_fx( Decoder_Struct *st_ivas, UWord16 *nSamplesRendered, Word16 *data ); +static ivas_error ivas_mc_dec_reconfig_fx( Decoder_Struct *st_ivas ); /*--------------------------------------------------------------------------* @@ -64,7 +64,7 @@ ivas_error ivas_mct_dec_fx( const Word16 nb_bits_metadata /* i : number of metadata bits */ ) { - Word16 ch, nCPE, cpe_id; + Word16 nCPE, cpe_id; MCT_DEC_HANDLE hMCT; CPE_DEC_HANDLE hCPE; Word16 param[MCT_MAX_BLOCKS][CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV]; @@ -76,18 +76,15 @@ ivas_error ivas_mct_dec_fx( Word16 Aq_fx[MCT_MAX_BLOCKS][CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )]; // Q12 Word32 output_lfe_ch_fx[L_FRAME48k]; Word16 q_output = 11; - Word16 n, k, i; + Word16 n, i; Word32 *x_fx[CPE_CHANNELS][NB_DIV]; //(Q(31 - x_e) - Word16 x_e[MAX_CICP_CHANNELS][NB_DIV]; Word16 x_len[CPE_CHANNELS][NB_DIV]; set16_fx( x_len[0], 0, NB_DIV ); set16_fx( x_len[1], 0, NB_DIV ); Decoder_State **sts; -#ifdef NONBE_FIX_1087_OOB_SBA_DTX_RS Word32 *p_output_orig_fx[2]; - Word32 synth_32_fx[CPE_CHANNELS][L_FRAME_PLUS]; -#endif + Word32 synth_fx_32[CPE_CHANNELS][L_FRAME_PLUS]; Word16 synth_fx[CPE_CHANNELS][L_FRAME_PLUS]; //(Q_synth) Word32 ivas_total_brate; ivas_error error; @@ -164,17 +161,15 @@ ivas_error ivas_mct_dec_fx( /* MCT side bits decoder */ ivas_mct_side_bits_fx( hMCT, st_ivas->hCPE, nCPE, st_ivas->hCPE[0]->hCoreCoder[0], st_ivas->bfi, st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream, ivas_total_brate, nb_bits_metadata ); -#ifdef NONBE_FIX_1087_OOB_SBA_DTX_RS /* in case of switching from an SID frame (with ACELP core) to MCT, buffer of L_FRAME_PLUS samples is needed -> use synth[] as a temporary buffer */ IF( st_ivas->hCPE[0]->hCoreCoder[0]->last_core == ACELP_CORE ) { FOR( n = 0; n < CPE_CHANNELS; n++ ) { p_output_orig_fx[n] = output_fx[n]; - output_fx[n] = synth_32_fx[n]; + output_fx[n] = synth_fx_32[n]; } } -#endif FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) { @@ -186,12 +181,8 @@ ivas_error ivas_mct_dec_fx( FOR( n = 0; n < CPE_CHANNELS; n++ ) { x_fx[n][0] = output_fx[n + ( cpe_id * CPE_CHANNELS )]; // Q11 - x_e[n][0] = 20; - move16(); move16(); x_fx[n][1] = output_fx[n + ( cpe_id * CPE_CHANNELS )] + ( L_FRAME48k / 2 ); // Q11 - x_e[n][1] = 20; - move16(); move16(); set32_fx( x_fx[n][0], 0, L_FRAME48k / 2 ); @@ -199,25 +190,8 @@ ivas_error ivas_mct_dec_fx( } ivas_mdct_core_invQ_fx( st_ivas->hCPE[cpe_id], nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id], - fUseTns[cpe_id], tnsData[cpe_id], x_fx, x_e, x_fx, x_e, x_len, Aq_fx[cpe_id], NULL, 1 ); + fUseTns[cpe_id], tnsData[cpe_id], x_fx, 20, x_fx, 20, x_len, Aq_fx[cpe_id], NULL, 1 ); - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - Word16 subFrames; - IF( EQ_16( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->core, TCX_10_CORE ) ) - { - subFrames = NB_DIV; - } - ELSE - { - subFrames = 1; - } - move16(); - FOR( k = 0; k < subFrames; ++k ) - { - Scale_sig32( x_fx[ch][k], shr( L_FRAME48k, sub( subFrames, 1 ) ), sub( x_e[ch][k], 20 ) ); // Scaling back to Q11 - } - } st_ivas->BER_detect = s_or( st_ivas->BER_detect, st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect ); move16(); @@ -225,22 +199,9 @@ ivas_error ivas_mct_dec_fx( move16(); } - /* MCT core decoder */ Word16 q_x[MAX_TRANSPORT_CHANNELS]; - set16_fx( q_x, Q12, MAX_TRANSPORT_CHANNELS ); - // Scaling output buffer to q_x - FOR( i = 0; i < hMCT->nchan_out_woLFE; ++i ) - { - Scale_sig32( output_fx[i], L_FRAME48k, sub( q_x[i], Q11 ) ); // Q11 -> Q12 - } ivas_mct_core_dec( hMCT, st_ivas->hCPE, nCPE, output_fx, q_x ); - // Scaling output buffer back to Q11 - FOR( i = 0; i < hMCT->nchan_out_woLFE; ++i ) - { - Scale_sig32( output_fx[i], L_FRAME48k, sub( Q11, q_x[i] ) ); // Q12 -> Q11 - } - /* for sba to stereo output disable any further processing for TCs > 2 as it is not needed*/ test(); @@ -267,37 +228,13 @@ ivas_error ivas_mct_dec_fx( Copy_Scale_sig_16_32_DEPREC( Aq_fx[cpe_id][n], Aq_fx_32[cpe_id][n], 102, Q16 - Q12 ); // Q16 x_fx[n][0] = output_fx[n + ( cpe_id * CPE_CHANNELS )]; // Q11 x_fx[n][1] = output_fx[n + ( cpe_id * CPE_CHANNELS )] + ( L_FRAME48k / 2 ); // Q11 - x_e[n][0] = 20; move16(); move16(); - move16(); - x_e[n][1] = 20; - move16(); } - ivas_mdct_core_tns_ns_fx( hCPE, fUseTns[cpe_id], tnsData[cpe_id], x_fx, Aq_fx_32[cpe_id], 1, x_e ); - - FOR( Word16 ind = 0; ind < 2; ind++ ) - { - Word16 nSubFrames; - IF( EQ_16( hCPE->hCoreCoder[ind]->core, TCX_20_CORE ) ) - { - nSubFrames = 1; - } - ELSE - { - nSubFrames = NB_DIV; - } - move16(); - Scale_sig32( x_fx[ind][0], shr( L_FRAME48k, sub( nSubFrames, 1 ) ), sub( x_e[ind][0], 20 ) ); // Q11 - IF( EQ_16( nSubFrames, 2 ) ) - { - Scale_sig32( x_fx[ind][1], shr( L_FRAME48k, 1 ), sub( x_e[ind][1], 20 ) ); // Q11 - } - } + ivas_mdct_core_tns_ns_fx( hCPE, fUseTns[cpe_id], tnsData[cpe_id], x_fx, Aq_fx_32[cpe_id], 1, 20 ); } - test(); test(); IF( EQ_16( st_ivas->renderer_type, RENDERER_MC ) ) @@ -307,12 +244,12 @@ ivas_error ivas_mct_dec_fx( } ELSE IF( EQ_16( st_ivas->renderer_type, RENDERER_MC_PARAMMC ) && ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) { - Word16 x_all_e[MAX_CICP_CHANNELS][NB_DIV]; - FOR( i = 0; i < MAX_CICP_CHANNELS; i++ ) + Word16 x_all_e[MAX_LS_CHANNELS][NB_DIV]; + FOR( i = 0; i < MAX_LS_CHANNELS; i++ ) { set16_fx( x_all_e[i], 0, NB_DIV ); } - Word32 *x_all_fx[MAX_CICP_CHANNELS][NB_DIV]; //(Q(31 - x_all_e) + Word32 *x_all_fx[MAX_LS_CHANNELS][NB_DIV]; //(Q(31 - x_all_e) FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) { FOR( n = 0; n < CPE_CHANNELS; n++ ) @@ -348,30 +285,24 @@ ivas_error ivas_mct_dec_fx( x_fx[n][0] = output_fx[n + ( cpe_id * CPE_CHANNELS )]; // Q11 x_fx[n][1] = output_fx[n + ( cpe_id * CPE_CHANNELS )] + ( L_FRAME48k / 2 ); // Q11 } -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_Aq_12_8_fx, hCPE->hCoreCoder[0]->old_Aq_12_8_fx_32, add( M, 1 ), sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[0]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[1]->old_Aq_12_8_fx, hCPE->hCoreCoder[1]->old_Aq_12_8_fx_32, add( M, 1 ), sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[1]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); -#else - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->old_Aq_12_8_fx, hCPE->hCoreCoder[0]->old_Aq_12_8_fx_32, add( M, 1 ), sub( 28, norm_s( sub( hCPE->hCoreCoder[0]->old_Aq_12_8_fx[0], 1 ) ) ) ); - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[1]->old_Aq_12_8_fx, hCPE->hCoreCoder[1]->old_Aq_12_8_fx_32, add( M, 1 ), sub( 28, norm_s( sub( hCPE->hCoreCoder[1]->old_Aq_12_8_fx[0], 1 ) ) ) ); -#endif ivas_mdct_core_reconstruct_fx( hCPE, x_fx, synth_fx, fUseTns[cpe_id], 1, q_output, e_sig ); - - Word16 hdrm, sh; + Word16 hdrm; hdrm = getScaleFactor16( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ); IF( hdrm != 0 ) { - sh = s_min( sub( e_sig[0], 16 ), hdrm ); - Scale_sig( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX, sh ); - e_sig[0] = sub( e_sig[0], sh ); + hdrm = sub( hdrm, 1 ); + Scale_sig( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX, hdrm ); + e_sig[0] = sub( e_sig[0], hdrm ); move16(); } hdrm = getScaleFactor16( synth_fx[1], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ); IF( hdrm != 0 ) { - sh = s_min( sub( e_sig[1], 16 ), hdrm ); - Scale_sig( synth_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX, sh ); - e_sig[1] = sub( e_sig[1], sh ); + hdrm = sub( hdrm, 1 ); + Scale_sig( synth_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX, hdrm ); + e_sig[1] = sub( e_sig[1], hdrm ); move16(); } @@ -385,7 +316,6 @@ ivas_error ivas_mct_dec_fx( } } -#ifdef NONBE_FIX_1087_OOB_SBA_DTX_RS /* set pointers back */ test(); IF( cpe_id == 0 && st_ivas->hCPE[0]->hCoreCoder[0]->last_core == ACELP_CORE ) @@ -396,12 +326,9 @@ ivas_error ivas_mct_dec_fx( } } -#endif - /*----------------------------------------------------------------* * CoreCoder Post-processing and updates *----------------------------------------------------------------*/ - Word32 synth_fx_32[CPE_CHANNELS][L_FRAME48k]; FOR( n = 0; n < CPE_CHANNELS; n++ ) { @@ -409,19 +336,10 @@ ivas_error ivas_mct_dec_fx( test(); IF( ( st_ivas->sba_dirac_stereo_flag != 0 ) && ( NE_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) || GE_16( cpe_id, sub( nCPE, 2 ) ) ) ) { -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( synth_fx[n], synth_fx_32[n], L_FRAME48k, sub( Q11, ( sub( 15, e_sig[n] ) ) ) ); // Q11 + Copy_Scale_sig_16_32_no_sat( synth_fx[n], synth_fx_32[n], output_frame, sub( Q11, ( sub( 15, e_sig[n] ) ) ) ); // Q11 Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, hCPE->hCoreCoder[n]->hHQ_core->old_out_fx32, output_frame, sub( Q11, hCPE->hCoreCoder[n]->hHQ_core->Q_old_wtda ) ); -#else - Copy_Scale_sig_16_32_DEPREC( synth_fx[n], synth_fx_32[n], L_FRAME48k, sub( Q11, ( sub( 15, e_sig[n] ) ) ) ); // Q11 - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, hCPE->hCoreCoder[n]->hHQ_core->old_out_fx32, output_frame, sub( Q11, hCPE->hCoreCoder[n]->hHQ_core->Q_old_wtda ) ); -#endif ivas_post_proc_fx( NULL, hCPE, n, synth_fx_32[n], NULL, output_frame, 1, Q11 ); -#ifdef MSAN_FIX Copy_Scale_sig_32_16( synth_fx_32[n], synth_fx[n], output_frame, sub( sub( 15, e_sig[n] ), Q11 ) ); // Q0 -#else - Copy_Scale_sig_32_16( synth_fx_32[n], synth_fx[n], L_FRAME48k, 0 - Q11 ); -#endif } /* Postprocessing for ACELP/MDCT core switching and synchronization */ @@ -452,11 +370,8 @@ ivas_error ivas_mct_dec_fx( { return error; } -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( synth_fx[n], output_fx[( cpe_id * CPE_CHANNELS ) + n], output_frame, sub( Q11, Q_synth ) ); // Q11 -#else - Copy_Scale_sig_16_32_DEPREC( synth_fx[n], output_fx[( cpe_id * CPE_CHANNELS ) + n], output_frame, sub( Q11, Q_synth ) ); // Q11 -#endif + /* Save synthesis for HQ FEC */ Word32 output_fx_[L_FRAME48k]; Copy32( output_fx[( cpe_id * CPE_CHANNELS ) + n], output_fx_, L_FRAME48k ); // Q11 @@ -476,11 +391,7 @@ ivas_error ivas_mct_dec_fx( { IF( hCPE->hCoreCoder[n] ) { -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[n]->delay_buf_out_fx, hCPE->hCoreCoder[n]->delay_buf_out32_fx, HQ_DELTA_MAX * HQ_DELAY_COMP, Q11 ); // Q0 -> Q11 -#else - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[n]->delay_buf_out_fx, hCPE->hCoreCoder[n]->delay_buf_out32_fx, HQ_DELTA_MAX * HQ_DELAY_COMP, Q11 ); // Q0 -> Q11 -#endif } } @@ -523,6 +434,7 @@ ivas_error ivas_mct_dec_fx( * * Create, allocate and initialize IVAS decoder MCT handle *-------------------------------------------------------------------------*/ + ivas_error create_mct_dec_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) @@ -615,6 +527,7 @@ ivas_error create_mct_dec_fx( hMCT->hBlockData[n]->ch2 = 0; move16(); move16(); + /*-----------------------------------------------------------------* * MDCT stereo initialization *-----------------------------------------------------------------*/ @@ -656,6 +569,7 @@ ivas_error create_mct_dec_fx( return IVAS_ERR_OK; } + /*------------------------------------------------------------------------- * mct_dec_reconfigure() * @@ -901,10 +815,8 @@ void ivas_mct_dec_close( /*! r : MC format mode */ ivas_error ivas_mc_dec_config_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 idx, /* i : LS config. index */ - UWord16 *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ - Word16 *data /* o : output synthesis signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 idx /* i : LS config. index */ ) { AUDIO_CONFIG signaled_config; @@ -934,7 +846,7 @@ ivas_error ivas_mc_dec_config_fx( IF( st_ivas->ini_frame != 0 ) { test(); - IF( NE_32( st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->hDecoderConfig->ivas_total_brate ) || st_ivas->transport_config != signaled_config || last_mc_mode != st_ivas->mc_mode ) + IF( NE_32( st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->hDecoderConfig->ivas_total_brate ) || last_mc_mode != st_ivas->mc_mode ) { IF( st_ivas->hRenderConfig ) { @@ -944,10 +856,12 @@ ivas_error ivas_mc_dec_config_fx( move16(); } } - IF( NE_32( ( error = ivas_mc_dec_reconfig_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) + + IF( NE_32( ( error = ivas_mc_dec_reconfig_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } + IF( st_ivas->hRenderConfig ) { FOR( Word16 i = 0; i < 4; i++ ) @@ -974,9 +888,7 @@ ivas_error ivas_mc_dec_config_fx( *-------------------------------------------------------------------------*/ static ivas_error ivas_mc_dec_reconfig_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - UWord16 *nSamplesRendered, /* o : number of samples flushed from the last frame (JBM) */ - Word16 *data /* o : output synthesis signal */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { Word16 nchan_transport_old, nSCE_old, nCPE_old, sba_dirac_stereo_flag_old, nchan_hp20_old; @@ -990,17 +902,12 @@ static ivas_error ivas_mc_dec_reconfig_fx( Word16 tc_nchan_tc_new; Word16 tc_nchan_allocate_new; Word16 tc_granularity_new; - AUDIO_CONFIG intern_config_old; - IVAS_OUTPUT_SETUP hIntSetupOld; - Word16 nchan_out_buff_old, nchan_out_buff; + Word16 nchan_out_buff; - error = IVAS_ERR_OK; - move32(); ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; move32(); nchan_transport_old = st_ivas->nchan_transport; move16(); - nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); last_mc_mode = ivas_mc_mode_select_fx( ivas_mc_map_output_config_to_mc_ls_setup_fx( st_ivas->transport_config ), st_ivas->hDecoderConfig->last_ivas_total_brate ); /* NB: this assumes that LS config remains the same between frames */ /* temporally set the current mc_mode back to the previous one to make sure the following call to @@ -1009,7 +916,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( move32(); st_ivas->mc_mode = last_mc_mode; move32(); - ivas_init_dec_get_num_cldfb_instances_ivas_fx( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); + ivas_init_dec_get_num_cldfb_instances_fx( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); st_ivas->mc_mode = mc_mode; move32(); @@ -1034,13 +941,6 @@ static ivas_error ivas_mc_dec_reconfig_fx( st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); move16(); - /* save old IntSetup, might be needed for JBM flushing...*/ - intern_config_old = st_ivas->intern_config; - move32(); - hIntSetupOld = st_ivas->hIntSetup; - tc_granularity_new = 1; - move16(); - /* renderer might have changed, reselect */ renderer_type_old = st_ivas->renderer_type; move32(); @@ -1050,51 +950,51 @@ static ivas_error ivas_mc_dec_reconfig_fx( ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); /* transfer subframe info from DirAC or ParamMC to central tc buffer */ - test(); - IF( EQ_16( last_mc_mode, MC_MODE_PARAMMC ) ) + IF( NE_32( st_ivas->hTcBuffer->tc_buffer_mode, TC_BUFFER_MODE_BUFFER ) ) { - st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes; - move16(); - st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered; - move16(); - st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots; - move16(); - st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered; - move16(); - Copy( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); - } - ELSE IF( EQ_16( last_mc_mode, MC_MODE_MCMASA ) && st_ivas->hSpatParamRendCom != NULL ) - { - st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; - move16(); - st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; - move16(); - st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; - move16(); - st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; - move16(); - Copy( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + test(); + IF( EQ_16( last_mc_mode, MC_MODE_PARAMMC ) ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes; + move16(); + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered; + move16(); + st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots; + move16(); + st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered; + move16(); + Copy( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + ELSE IF( EQ_16( last_mc_mode, MC_MODE_MCMASA ) && st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; + move16(); + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; + move16(); + st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; + move16(); + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; + move16(); + Copy( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } } /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv render what still fits in the new granularity */ - tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->hDecoderConfig->output_Fs ); - move16(); + tc_granularity_new = ivas_jbm_dec_get_render_granularity_fx( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs ); IF( LT_16( tc_granularity_new, st_ivas->hTcBuffer->n_samples_granularity ) ) { - IF( NE_32( ( error = ivas_jbm_dec_flush_renderer_fx( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, last_mc_mode, ISM_MODE_NONE, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } + /* flush already done in IVAS_DEC_ReadFormat() */ } /* JBM: when granularity goes up set samples to discard at the beginning of the frame */ ELSE IF( GT_16( tc_granularity_new, st_ivas->hTcBuffer->n_samples_granularity ) ) { - IF( NE_32( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_jbm_dec_set_discard_samples_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } + IF( EQ_16( st_ivas->mc_mode, MC_MODE_MCT ) ) { st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels_fx( ivas_mc_map_output_config_to_mc_ls_setup_fx( st_ivas->transport_config ) ); @@ -1125,13 +1025,10 @@ static ivas_error ivas_mc_dec_reconfig_fx( ivas_masa_dec_close_fx( &( st_ivas->hMasa ) ); ivas_qmetadata_close_fx( &st_ivas->hQMetaData ); - IF( st_ivas->hDirAC != NULL ) - { - ivas_dirac_rend_close_fx( &( st_ivas->hDirACRend ) ); - ivas_spat_hSpatParamRendCom_close_fx( &( st_ivas->hSpatParamRendCom ) ); - ivas_dirac_dec_close_fx( &( st_ivas->hDirAC ) ); - vbap_free_data_fx( &( st_ivas->hVBAPdata ) ); - } + ivas_dirac_rend_close_fx( &( st_ivas->hDirACRend ) ); + ivas_spat_hSpatParamRendCom_close_fx( &( st_ivas->hSpatParamRendCom ) ); + ivas_dirac_dec_close_fx( &( st_ivas->hDirAC ) ); + vbap_free_data_fx( &( st_ivas->hVBAPdata ) ); /* init LS conversion if the renderer type asks for it */ test(); @@ -1211,13 +1108,10 @@ static ivas_error ivas_mc_dec_reconfig_fx( ivas_masa_dec_close_fx( &( st_ivas->hMasa ) ); ivas_qmetadata_close_fx( &st_ivas->hQMetaData ); - IF( st_ivas->hDirAC != NULL ) - { - ivas_dirac_rend_close_fx( &( st_ivas->hDirACRend ) ); - ivas_spat_hSpatParamRendCom_close_fx( &( st_ivas->hSpatParamRendCom ) ); - ivas_dirac_dec_close_fx( &( st_ivas->hDirAC ) ); - vbap_free_data_fx( &( st_ivas->hVBAPdata ) ); - } + ivas_dirac_rend_close_fx( &( st_ivas->hDirACRend ) ); + ivas_spat_hSpatParamRendCom_close_fx( &( st_ivas->hSpatParamRendCom ) ); + ivas_dirac_dec_close_fx( &( st_ivas->hDirAC ) ); + vbap_free_data_fx( &( st_ivas->hVBAPdata ) ); IF( EQ_16( last_mc_mode, MC_MODE_MCT ) ) { @@ -1346,6 +1240,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( ivas_total_brate, st->igf, st->element_mode ); move16(); } + IF( EQ_16( st_ivas->mc_mode, MC_MODE_MCMASA ) ) { UWord8 separateChannelEnabled; @@ -1358,7 +1253,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( new_brate_SCE = 0; move32(); Word16 temp_e; - Word32 L_temp = BASOP_Util_Divide3232_Scale_cadence( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &temp_e ); + Word32 L_temp = BASOP_Util_Divide3232_Scale_newton( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &temp_e ); L_temp = L_shr( L_temp, sub( 31, temp_e ) ); new_brate_CPE = L_shl( L_temp, 1 ) /*CPE_CHANNELS*/; } @@ -1367,7 +1262,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( new_brate_SCE = 0; move32(); Word16 temp_e; - Word32 L_temp = BASOP_Util_Divide3232_Scale_cadence( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &temp_e ); + Word32 L_temp = BASOP_Util_Divide3232_Scale_newton( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &temp_e ); L_temp = L_shr( L_temp, sub( 31, temp_e ) ); new_brate_CPE = L_shl( L_temp, 1 ) /*CPE_CHANNELS*/; } @@ -1376,7 +1271,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( new_brate_SCE = 0; /* ivas_total_brate / st_ivas->nchan_transport;*/ move32(); Word16 temp_e; - Word32 L_temp = BASOP_Util_Divide3232_Scale_cadence( ivas_total_brate, st_ivas->nchan_transport, &temp_e ); + Word32 L_temp = BASOP_Util_Divide3232_Scale_newton( ivas_total_brate, st_ivas->nchan_transport, &temp_e ); L_temp = L_shr( L_temp, sub( 31, temp_e ) ); new_brate_CPE = L_shl( L_temp, 1 ) /*CPE_CHANNELS*/; } @@ -1387,6 +1282,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( { return error; } + IF( EQ_16( last_mc_mode, MC_MODE_MCT ) && EQ_16( st_ivas->mc_mode, MC_MODE_PARAMMC ) && GT_16( st_ivas->nchan_transport, CPE_CHANNELS ) ) { st = st_ivas->hCPE[1]->hCoreCoder[1]; @@ -1405,42 +1301,11 @@ static ivas_error ivas_mc_dec_reconfig_fx( /*-----------------------------------------------------------------* * re-configure HP20 memories *-----------------------------------------------------------------*/ + IF( NE_32( ( error = ivas_hp20_dec_reconfig_fx( st_ivas, nchan_hp20_old ) ), IVAS_ERR_OK ) ) { return error; } - /*-----------------------------------------------------------------* - * Allocate the LFE handle that is coded separately after the allocation of the core coders - *-----------------------------------------------------------------*/ - - test(); - test(); - IF( ( EQ_16( st_ivas->mc_mode, MC_MODE_MCT ) || EQ_16( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) && st_ivas->hLFE == NULL ) - { - Word32 binauralization_delay_ns = st_ivas->binaural_latency_ns; - move32(); - IF( st_ivas->hBinRenderer != NULL ) - { - IF( st_ivas->hBinRenderer->render_lfe ) - { - /* Account for filterbank delay */ - binauralization_delay_ns = L_add( binauralization_delay_ns, IVAS_FB_DEC_DELAY_NS ); - } - ELSE - { - binauralization_delay_ns = 0; - move32(); - } - } - - IF( NE_32( ( error = ivas_create_lfe_dec_fx( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, binauralization_delay_ns ) ), IVAS_ERR_OK ) ) - { - return error; - } - - set32_fx( st_ivas->hLFE->prevsynth_buf_fx, 0, LFE_PLC_BUFLEN ); - set32_fx( st_ivas->hLFE->prior_out_buffer_fx, 0, L_FRAME48k ); - } /*-----------------------------------------------------------------* * Reconfigure renderers @@ -1448,7 +1313,6 @@ static ivas_error ivas_mc_dec_reconfig_fx( IF( EQ_16( st_ivas->mc_mode, MC_MODE_MCMASA ) ) { - test(); test(); IF( ( NE_16( st_ivas->renderer_type, RENDERER_DISABLE ) ) && ( NE_16( st_ivas->renderer_type, RENDERER_MCMASA_MONO_STEREO ) ) ) { @@ -1469,7 +1333,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( } } } - ELSE IF( EQ_16( st_ivas->renderer_type, RENDERER_DISABLE ) && st_ivas->hDirAC != NULL ) + ELSE IF( EQ_16( st_ivas->renderer_type, RENDERER_DISABLE ) ) { ivas_dirac_rend_close_fx( &( st_ivas->hDirACRend ) ); ivas_spat_hSpatParamRendCom_close_fx( &( st_ivas->hSpatParamRendCom ) ); @@ -1494,7 +1358,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( test(); test(); test(); - IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { /* remove unneeded binaural renderers */ test(); @@ -1502,6 +1366,13 @@ static ivas_error ivas_mc_dec_reconfig_fx( IF( st_ivas->hBinRenderer != NULL && ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) && NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) ) { ivas_binRenderer_close_fx( &st_ivas->hBinRenderer ); + + test(); + test(); + IF( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation || st_ivas->hCombinedOrientationData ) ) + { + efap_free_data_fx( &st_ivas->hEFAPdata ); + } } test(); @@ -1509,29 +1380,24 @@ static ivas_error ivas_mc_dec_reconfig_fx( test(); test(); test(); - IF( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend != NULL ) && ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) && NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) && ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) || NE_16( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) ) + IF( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend[0] != NULL ) && ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) && NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) && ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) || NE_16( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) ) { - - ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); + ivas_rend_closeCrend_fx( &( st_ivas->hCrendWrapper ) ); } test(); IF( st_ivas->hBinRendererTd != NULL && ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) ) { - IF( EQ_16( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM, TRUE ) ) - { - ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); - st_ivas->hHrtfTD = NULL; - } + ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); } - IF( st_ivas->hDiracDecBin != NULL ) + IF( st_ivas->hDiracDecBin[0] != NULL ) { test(); test(); IF( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) && NE_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); + ivas_dirac_dec_close_binaural_data_fx( st_ivas->hDiracDecBin ); } } @@ -1550,20 +1416,30 @@ static ivas_error ivas_mc_dec_reconfig_fx( } ELSE IF( st_ivas->hBinRendererTd == NULL && EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) { - IF( ( error = ivas_td_binaural_open_fx( st_ivas, &st_ivas->SrcInd[0], &st_ivas->num_src ) ) != IVAS_ERR_OK ) + Word16 num_src; + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + + IF( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ) != IVAS_ERR_OK ) { return error; } + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) + { + return error; + } + } IF( EQ_16( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { - IF( ( error = ivas_rend_initCrendWrapper( &st_ivas->hCrendWrapper ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_rend_initCrendWrapper_fx( &st_ivas->hCrendWrapper, 1 ) ) != IVAS_ERR_OK ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" ); } - st_ivas->hCrendWrapper->hCrend = NULL; + st_ivas->hCrendWrapper->hCrend[0] = NULL; st_ivas->hCrendWrapper->hHrtfCrend = NULL; - IF( ( st_ivas->hCrendWrapper->hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) + IF( ( st_ivas->hCrendWrapper->hCrend[0] = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend\n" ); } @@ -1571,7 +1447,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( } ELSE IF( st_ivas->hCrendWrapper == NULL && ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) ) { - IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_rend_openCrend_fx( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hHrtfCrend, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, 0, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) { return error; } @@ -1580,6 +1456,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( } } } + /*-----------------------------------------------------------------* * CLDFB instances *-----------------------------------------------------------------*/ @@ -1589,6 +1466,64 @@ static ivas_error ivas_mc_dec_reconfig_fx( return error; } + /*-----------------------------------------------------------------* + * Allocate the LFE handle that is coded separately after the allocation of the core coders + *-----------------------------------------------------------------*/ + + test(); + IF( ( EQ_16( st_ivas->mc_mode, MC_MODE_MCT ) || EQ_16( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) ) + { + Word32 delay_ns; + IF( NE_16( st_ivas->hIntSetup.index_lfe[0], -1 ) ) + { + delay_ns = st_ivas->binaural_latency_ns; + } + ELSE + { + delay_ns = 0; + } + move32(); + IF( st_ivas->hBinRenderer != NULL ) + { + IF( st_ivas->hBinRenderer->render_lfe ) + { + /* Account for filterbank delay */ + delay_ns = L_add( delay_ns, IVAS_FB_DEC_DELAY_NS ); + } + ELSE + { + delay_ns = 0; + move32(); + } + } + ELSE + { + IF( EQ_16( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) && ( st_ivas->cldfbSynDec[0] != NULL ) ) + { + delay_ns = L_add( delay_ns, IVAS_FB_DEC_DELAY_NS ); + } + } + + IF( st_ivas->hLFE != NULL ) + { + IF( NE_32( st_ivas->hLFE->delay_ns, delay_ns ) ) + { + ivas_lfe_dec_close_fx( &( st_ivas->hLFE ) ); + } + } + + IF( st_ivas->hLFE == NULL ) + { + IF( NE_32( ( error = ivas_create_lfe_dec_fx( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, delay_ns ) ), IVAS_ERR_OK ) ) + { + return error; + } + + set32_fx( st_ivas->hLFE->prevsynth_buf_fx, 0, LFE_PLC_BUFLEN ); + set32_fx( st_ivas->hLFE->prior_out_buffer_fx, 0, L_FRAME48k ); + } + } + /*-----------------------------------------------------------------* * JBM TC buffers *-----------------------------------------------------------------*/ @@ -1598,7 +1533,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( DECODER_TC_BUFFER_HANDLE hTcBuffer; hTcBuffer = st_ivas->hTcBuffer; - tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); + tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode_fx( st_ivas ); tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); tc_nchan_allocate_new = tc_nchan_tc_new; move16(); @@ -1609,8 +1544,18 @@ static ivas_error ivas_mc_dec_reconfig_fx( test(); IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { - tc_nchan_allocate_new = BINAURAL_CHANNELS * 2; + tc_nchan_allocate_new = BINAURAL_CHANNELS; move16(); + test(); + IF( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr ) + { + tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; + move16(); + } + ELSE IF( st_ivas->hOutSetup.separateChannelEnabled ) + { + tc_nchan_allocate_new = add( tc_nchan_allocate_new, 1 ); + } tc_nchan_full_new = tc_nchan_allocate_new; move16(); } @@ -1683,16 +1628,15 @@ static ivas_error ivas_mc_dec_reconfig_fx( } } - /*-----------------------------------------------------------------* - * floating-point output audio buffers + * output audio buffers *-----------------------------------------------------------------*/ - nchan_out_buff = ivas_get_nchan_buffers_dec_ivas_fx( st_ivas, -1, -1 ); - - IF( NE_32( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff_old, nchan_out_buff ) ), IVAS_ERR_OK ) ) + nchan_out_buff = ivas_get_nchan_buffers_dec_fx( st_ivas, -1, -1 ); + IF( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff, st_ivas->hDecoderConfig->Opt_tsm, st_ivas->hTcBuffer ) ) != IVAS_ERR_OK ) { return error; } - return error; + + return IVAS_ERR_OK; } diff --git a/lib_dec/ivas_mct_dec_mct_fx_fx.c b/lib_dec/ivas_mct_dec_mct_fx_fx.c index c275820fbcf25cb352d72c029c7965843fa29090..c5e884f4694db0c4903c45293998e6be42b6fd61 100644 --- a/lib_dec/ivas_mct_dec_mct_fx_fx.c +++ b/lib_dec/ivas_mct_dec_mct_fx_fx.c @@ -165,8 +165,7 @@ void ivas_mct_dec_mct_fx( static void applyGlobalILD_fx( Decoder_State **sts, MCT_DEC_HANDLE hMCT, - Word32 *x[MCT_MAX_CHANNELS][NB_DIV], - Word16 q_x[MCT_MAX_CHANNELS] ) + Word32 *x[MCT_MAX_CHANNELS][NB_DIV] ) { Word16 ch, k; Word16 nSubframes, L_subframeTCX; @@ -206,10 +205,9 @@ static void applyGlobalILD_fx( qratio = L_shl( qratio, q_qratio ); FOR( k = 0; k < nSubframes; k++ ) { - v_multc_fixed( x[ch][k], qratio, x[ch][k], L_subframeTCX ); // Qx - 5 + q_qratio + v_multc_fx( x[ch][k], qratio, x[ch][k], L_subframeTCX ); // Qx - 5 + q_qratio + scale_sig32( x[ch][k], L_subframeTCX, sub( 5, q_qratio ) ); } - q_x[ch] = add( sub( q_x[ch], 5 ), q_qratio ); - move16(); } ELSE { @@ -228,10 +226,10 @@ static void applyGlobalILD_fx( *----------------------------------------------------------*/ void apply_MCT_dec_fx( - MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ - Decoder_State **sts, /* i/o: decoder state structure */ - Word32 *x[MCT_MAX_CHANNELS][NB_DIV], /* i/o: decoded and dequan. spect. input to MCT */ - Word16 q_x[MCT_MAX_CHANNELS] ) + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + Word32 *x[MCT_MAX_CHANNELS][NB_DIV] /* i/o: decoded and dequan. spect. input to MCT */ +) { Word16 pair; MCT_DEC_BLOCK_DATA_HANDLE hBlock; @@ -240,10 +238,10 @@ void apply_MCT_dec_fx( { hBlock = hMCT->hBlockData[pair]; - stereo_decoder_tcx_fx( hBlock->hStereoMdct, hBlock->mask, &x[hBlock->ch2][0], &x[hBlock->ch1][0], &x[hBlock->ch2][0], hBlock->hStereoMdct->mdct_stereo_mode, sts[hBlock->ch1]->core, sts[hBlock->ch2]->core, sts[0]->igf, sts[0]->hTcxDec->L_frameTCX, sts[1]->hTcxDec->L_frameTCX, 1, TCX_20_CORE, TCX_20_CORE, 0, &q_x[hBlock->ch2], &q_x[hBlock->ch1] ); + stereo_decoder_tcx_fx( hBlock->hStereoMdct, hBlock->mask, &x[hBlock->ch2][0], &x[hBlock->ch1][0], &x[hBlock->ch2][0], hBlock->hStereoMdct->mdct_stereo_mode, sts[hBlock->ch1]->core, sts[hBlock->ch2]->core, sts[0]->igf, sts[0]->hTcxDec->L_frameTCX, sts[1]->hTcxDec->L_frameTCX, 1, TCX_20_CORE, TCX_20_CORE, 0 ); } - applyGlobalILD_fx( sts, hMCT, x, q_x ); + applyGlobalILD_fx( sts, hMCT, x ); return; } @@ -302,8 +300,8 @@ void mctStereoIGF_dec_fx( move16(); // Using input Q-factor as 12 - set16_fx( p_x_e[0], 31 - Q12, CPE_CHANNELS ); // Q12 - set16_fx( p_x_e[1], 31 - Q12, CPE_CHANNELS ); // Q12 + set16_fx( p_x_e[0], 31 - Q11, CPE_CHANNELS ); // Q12 + set16_fx( p_x_e[1], 31 - Q11, CPE_CHANNELS ); // Q12 FOR( k = 0; k < nSubframes; k++ ) { @@ -313,17 +311,6 @@ void mctStereoIGF_dec_fx( test(); IF( NE_16( hMCT->hBlockData[b]->hStereoMdct->IGFStereoMode[k], SMDCT_DUAL_MONO ) || NE_16( hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[k], SMDCT_DUAL_MONO ) ) { -#ifndef FIX_1109_OPTIM_MCT_STEREO_IGF_DEC - tmp = BASOP_Util_Divide1616_Scale( sts[0]->hTcxCfg->tcx_coded_lines, nSubframes, &tmp_e ); - L_spec[0] = shr( tmp, add( 15, negate( tmp_e ) ) ); - move16(); - - tmp = BASOP_Util_Divide1616_Scale( sts[0]->L_frame, nSubframes, &tmp_e ); - L_frame_nSubframe = shr( tmp, add( 15, negate( tmp_e ) ) ); - - tmp = BASOP_Util_Divide1616_Scale( sts[0]->hTcxDec->L_frameTCX, nSubframes, &tmp_e ); - L_frameTCX_nSubframe = shr( tmp, add( 15, negate( tmp_e ) ) ); -#else Word16 shr_div, shr_k; assert( nSubframes == 1 || nSubframes == 2 ); @@ -334,7 +321,6 @@ void mctStereoIGF_dec_fx( move16(); L_frame_nSubframe = shr( sts[0]->L_frame, shr_div ); L_frameTCX_nSubframe = shr( sts[0]->hTcxDec->L_frameTCX, shr_div ); -#endif init_tcx_info_fx( sts[0], L_frame_nSubframe, L_frameTCX_nSubframe, k, bfi, &tcx_offset[0], &tcx_offsetFB[0], &L_frame[0], &L_frameTCX[0], &left_rect[0], &L_spec[0] ); @@ -344,28 +330,16 @@ void mctStereoIGF_dec_fx( decoder_tcx_IGF_stereo_fx( sts, hMCT->hBlockData[b]->hStereoMdct, hMCT->hBlockData[b]->mask, p_x, p_x_e, p_x_len, L_frame[0], left_rect[0], k, bfi, 1 /* MCT_flag */ ); // Shifting output with variable exponent back to Q12 -#ifdef FIX_1109_OPTIM_MCT_STEREO_IGF_DEC - shr_k = sub( 31 - Q12, p_x_e[0][k] ); -#endif + shr_k = sub( 31 - Q11, p_x_e[0][k] ); FOR( Word16 i = 0; i < p_x_len[0][k]; i++ ) { -#ifndef FIX_1109_OPTIM_MCT_STEREO_IGF_DEC - p_x[0][k][i] = L_shr( p_x[0][k][i], sub( 31 - Q12, p_x_e[0][k] ) ); -#else p_x[0][k][i] = L_shr( p_x[0][k][i], shr_k ); -#endif move32(); } -#ifdef FIX_1109_OPTIM_MCT_STEREO_IGF_DEC - shr_k = sub( 31 - Q12, p_x_e[1][k] ); -#endif + shr_k = sub( 31 - Q11, p_x_e[1][k] ); FOR( Word16 i = 0; i < p_x_len[1][k]; i++ ) { -#ifndef FIX_1109_OPTIM_MCT_STEREO_IGF_DEC - p_x[1][k][i] = L_shr( p_x[1][k][i], sub( 31 - Q12, p_x_e[1][k] ) ); -#else p_x[1][k][i] = L_shr( p_x[1][k][i], shr_k ); -#endif move32(); } } @@ -395,7 +369,7 @@ void mctStereoIGF_dec_fx( /* mono or dual mono IGF decoding */ - x_e = 31 - Q12; // input q-factor of x[p_ch[ch]][k] is Q12 + x_e = 31 - Q11; // input q-factor of x[p_ch[ch]][k] is Q12 move16(); decoder_tcx_IGF_mono_fx( st, x[p_ch[ch]][k], &x_e, &x_len, L_frame[ch], left_rect[ch], bfi, k ); @@ -403,7 +377,7 @@ void mctStereoIGF_dec_fx( FOR( Word16 i = 0; i < x_len; i++ ) { // Converting from variable exponent to Fixed q-factor (Q12) - x[p_ch[ch]][k][i] = L_shr( x[p_ch[ch]][k][i], sub( 31 - Q12, x_e ) ); + x[p_ch[ch]][k][i] = L_shr( x[p_ch[ch]][k][i], sub( 31 - Q11, x_e ) ); move32(); } } @@ -455,7 +429,7 @@ void mctStereoIGF_dec_fx( init_tcx_info_fx( st, L_frame_nSubframe, L_frameTCX_nSubframe, k, bfi, &tcx_offset[0], &tcx_offsetFB[0], &L_frame[0], &L_frameTCX[0], &left_rect[0], &L_spec[0] ); /* mono or dual mono IGF decoding */ - x_e = 31 - Q12; // Input Q-factor is Q12. + x_e = 31 - Q11; // Input Q-factor is Q12. move16(); decoder_tcx_IGF_mono_fx( st, x[ch][k], &x_e, &x_len, L_frame[0], left_rect[0], bfi, k ); @@ -463,7 +437,7 @@ void mctStereoIGF_dec_fx( FOR( Word16 i = 0; i < x_len; i++ ) { // Converting from variable exponent to Fixed q-factor (Q12) - x[ch][k][i] = L_shr( x[ch][k][i], sub( 31 - Q12, x_e ) ); + x[ch][k][i] = L_shr( x[ch][k][i], sub( 31 - Q11, x_e ) ); move32(); } } diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 1899c8bea485a504c671ac909b1840d61025bd77..695051171fc29c24d3f1fe0fbc5f8a150733cad0 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -185,6 +185,13 @@ static void dec_prm_tcx_sidebits_fx( move16(); } + /* for first frame reset last_core to initialization value for better error-robustness*/ + IF( EQ_16( st->ini_frame, 0 ) ) + { + st->last_core = TCX_20_CORE; + move16(); + } + getTCXWindowing_ivas_fx( st->core, st->last_core, st->element_mode, st->hTcxCfg, st0 ); st->hTcxDec->kernel_type[0] = st->hTcxDec->kernel_type[1] = MDCT_IV; @@ -630,9 +637,9 @@ void ivas_mdct_core_invQ_fx( Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flag TNS enabled */ STnsData tnsData[CPE_CHANNELS][NB_DIV], /* i : TNS parameter */ Word32 *x_0[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ - Word16 x_0_e[CPE_CHANNELS][NB_DIV], + Word16 x_0_e, Word32 *x[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ - Word16 x_e[CPE_CHANNELS][NB_DIV], + Word16 x_e, Word16 x_len[CPE_CHANNELS][NB_DIV], Word16 Aq[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* i : LP coefficients Q12*/ Word16 ms_mask[NB_DIV][MAX_SFB], /* i : M/S mask */ @@ -684,10 +691,8 @@ void ivas_mdct_core_invQ_fx( { spectralData_tmp[k] = malloc( N_MAX * sizeof( Word32 ) ); } -#ifdef MSAN_FIX set32_fx( spectralData_tmp[0], 0, L_FRAME_MAX ); set32_fx( spectralData_tmp[1], 0, L_FRAME_MAX ); -#endif // MSAN_FIX push_wmops( "mdct_core_invQ" ); sts = hCPE->hCoreCoder; @@ -701,6 +706,7 @@ void ivas_mdct_core_invQ_fx( set16_fx( bitsRead, 0, CPE_CHANNELS ); tmp_concealment_method = 0; move16(); + prm_sqQ = NULL; /* set prm_sqQ to NULL - in case of bfi == 1 it's not set or needed, but it triggers sanitizers */ FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -728,18 +734,8 @@ void ivas_mdct_core_invQ_fx( common_exp = s_max( sts[0]->hTonalMDCTConc->lastBlockData.spectralData_exp, sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp ); -#ifdef MSAN_FIX -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( sts[0]->hTonalMDCTConc->lastBlockData.spectralData, spectralData_tmp[0], L_frameTCX[0], sub( 15, sub( common_exp, sts[0]->hTonalMDCTConc->lastBlockData.spectralData_exp ) ) ); // 30 - spectral_exp1 Copy_Scale_sig_16_32_no_sat( sts[1]->hTonalMDCTConc->lastBlockData.spectralData, spectralData_tmp[1], L_frameTCX[1], sub( 15, sub( common_exp, sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp ) ) ); // 30 - spectral_exp2 -#else - Copy_Scale_sig_16_32_DEPREC( sts[0]->hTonalMDCTConc->lastBlockData.spectralData, spectralData_tmp[0], L_frameTCX[0], sub( 15, sub( common_exp, sts[0]->hTonalMDCTConc->lastBlockData.spectralData_exp ) ) ); // 30 - spectral_exp1 - Copy_Scale_sig_16_32_DEPREC( sts[1]->hTonalMDCTConc->lastBlockData.spectralData, spectralData_tmp[1], L_frameTCX[1], sub( 15, sub( common_exp, sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp ) ) ); // 30 - spectral_exp2 -#endif -#else - Copy_Scale_sig_16_32_DEPREC( sts[0]->hTonalMDCTConc->lastBlockData.spectralData, spectralData_tmp[0], L_FRAME_MAX, 15 - ( common_exp - sts[0]->hTonalMDCTConc->lastBlockData.spectralData_exp ) ); // 30 - spectral_exp1 - Copy_Scale_sig_16_32_DEPREC( sts[1]->hTonalMDCTConc->lastBlockData.spectralData, spectralData_tmp[1], L_FRAME_MAX, 15 - ( common_exp - sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp ) ); // 30 - spectral_exp2 -#endif // MSAN_FIX sts[0]->hTonalMDCTConc->lastBlockData.spectralData_exp = sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp = common_exp; move16(); @@ -749,15 +745,10 @@ void ivas_mdct_core_invQ_fx( q_r = sub( 30, sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp ); /* both input in same Q */ - stereo_decoder_tcx_fx( hCPE->hStereoMdct, ms_mask, x_0[1], &spectralData_tmp[0], &spectralData_tmp[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 1, &q_r, &q_l ); + stereo_decoder_tcx_fx( hCPE->hStereoMdct, ms_mask, x_0[1], &spectralData_tmp[0], &spectralData_tmp[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 1 ); -#ifdef MSAN_FIX Copy_Scale_sig_32_16( spectralData_tmp[0], sts[0]->hTonalMDCTConc->lastBlockData.spectralData, L_frameTCX[0], -15 ); // q_l - 15 Copy_Scale_sig_32_16( spectralData_tmp[1], sts[1]->hTonalMDCTConc->lastBlockData.spectralData, L_frameTCX[1], -15 ); // q_r - 15 -#else - Copy_Scale_sig_32_16( spectralData_tmp[0], sts[0]->hTonalMDCTConc->lastBlockData.spectralData, L_FRAME_MAX, -15 ); - Copy_Scale_sig_32_16( spectralData_tmp[1], sts[1]->hTonalMDCTConc->lastBlockData.spectralData, L_FRAME_MAX, -15 ); -#endif sts[0]->hTonalMDCTConc->lastBlockData.spectralData_exp = sub( 30, q_l ); sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp = sub( 30, q_r ); move16(); @@ -976,9 +967,6 @@ void ivas_mdct_core_invQ_fx( IF( EQ_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { - set32_fx( x[ch][0], 0, st->hTcxCfg->tcx_coded_lines ); - x_e[ch][0] = 31; - move16(); /* usually set in decoder_tcx_invQ(), needed for concealment */ st->hTcxDec->damping = 0; move16(); @@ -1010,6 +998,8 @@ void ivas_mdct_core_invQ_fx( FOR( k = 0; k < nSubframes[ch]; k++ ) { + Word16 x_e_local = x_e; + Word16 j, diff; /* Stability Factor */ IF( !bfi ) { @@ -1044,17 +1034,25 @@ void ivas_mdct_core_invQ_fx( nf_seed = 0; move16(); - decoder_tcx_invQ_fx( st, prm[ch], Aq[ch], Aind[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x[ch][k], &x_e[ch][k], NULL, NULL, xn_buf, &fUseTns[ch][k], &tnsData[ch][k], &gain_tcx, &gain_tcx_e, &prm_sqQ, &nf_seed, bfi, k ); + decoder_tcx_invQ_fx( st, prm[ch], Aq[ch], Aind[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x[ch][k], &x_e_local, NULL, NULL, xn_buf, &fUseTns[ch][k], &tnsData[ch][k], &gain_tcx, &gain_tcx_e, &prm_sqQ, &nf_seed, bfi, k ); + diff = sub( x_e_local, x_0_e ); + IF( diff != 0 ) + { + FOR( j = 0; j < L_frameTCX[ch]; j++ ) + { + x_0[ch][k][j] = L_shl_sat( x[ch][k][j], diff ); + move32(); + } + } + ELSE + { + Copy32( x[ch][k], x_0[ch][k], L_frameTCX[ch] ); + } shift = Find_Max_Norm32( x[ch][k], L_frameTCX[ch] ); move16(); Scale_sig32( x[ch][k], L_frameTCX[ch], shift ); - x_e[ch][k] = sub( x_e[ch][k], shift ); - move16(); - - Copy32( x[ch][k], x_0[ch][k], L_frameTCX[ch] ); - x_0_e[ch][k] = x_e[ch][k]; - move16(); + x_e_local = sub( x_e_local, shift ); // PLC to be done test(); @@ -1063,15 +1061,17 @@ void ivas_mdct_core_invQ_fx( TonalMdctConceal_create_concealment_noise_ivas_fx( concealment_noise_fx[ch], &concealment_noise_e[ch], hCPE, L_frameTCX[ch], L_frame[ch], ch, k, st->core, st->hTcxDec->cummulative_damping_tcx, noise_gen_mode_bfi ); } - decoder_tcx_noisefilling_fx( st, concealment_noise_fx[ch], concealment_noise_e[ch], Aq[ch], L_frameTCX_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x[ch][k], &x_e[ch][k], NULL, NULL, &tmp_concealment_method, gain_tcx, gain_tcx_e, prm_sqQ, nf_seed, bfi, MCT_flag, k ); + decoder_tcx_noisefilling_fx( st, concealment_noise_fx[ch], concealment_noise_e[ch], Aq[ch], L_frameTCX_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x[ch][k], &x_e_local, NULL, NULL, &tmp_concealment_method, gain_tcx, gain_tcx_e, prm_sqQ, nf_seed, bfi, MCT_flag, k ); shift = Find_Max_Norm32( x[ch][k], L_frameTCX[ch] ); move16(); Scale_sig32( x[ch][k], L_frameTCX[ch], shift ); - x_e[ch][k] = sub( x_e[ch][k], shift ); + x_e_local = sub( x_e_local, shift ); move16(); - decoder_tcx_noiseshaping_igf_fx( st, L_spec[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x[ch][k], &x_e[ch][k], &x_len[ch][k], NULL, NULL, &tmp_concealment_method, bfi ); + decoder_tcx_noiseshaping_igf_fx( st, L_spec[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x[ch][k], &x_e_local, &x_len[ch][k], NULL, NULL, &tmp_concealment_method, bfi ); + + Scale_sig32( x[ch][k], L_frameTCX[ch], sub( x_e_local, x_e ) ); } } } @@ -1093,30 +1093,31 @@ void ivas_mdct_core_invQ_fx( *-----------------------------------------------------------------*/ void ivas_mdct_core_reconstruct_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *x_fx[][NB_DIV], - /* i/o: synthesis @internal_FS */ // Q(q_x) - Word16 signal_outFB_fx[CPE_CHANNELS][L_FRAME_PLUS], - /* o : synthesis @output_FS */ // e_sig - Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *x_fx[][NB_DIV], /* i/o: synthesis @internal_FS Q(q_x) */ + Word16 signal_outFB_fx[CPE_CHANNELS][L_FRAME_PLUS], /* o : synthesis @output_FS e_sig */ + Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ Word16 q_x, Word16 e_sig[CPE_CHANNELS] ) { Word16 ch, k, bfi; Decoder_State **sts, *st; + /* Framing */ Word16 L_frame[CPE_CHANNELS], L_frameTCX[CPE_CHANNELS], nSubframes[CPE_CHANNELS]; Word16 L_frame_global[CPE_CHANNELS], L_frame_globalTCX[CPE_CHANNELS]; + /* Synth */ - Word16 synth_buf_fx[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M]; + Word16 synth_buf_fx[OLD_SYNTH_INTERNAL_DEC + L_FRAME_PLUS_INTERNAL + M]; Word16 *synth_fx; Word16 synth_bufFB_fx[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M]; Word16 *synthFB_fx; Word16 q_syn = 0; move16(); - Word16 q_win = -2; - move16(); + Word16 q_win = 0; + Word16 q_winFB = 0; + /* TCX */ Word16 xn_buf_fx[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; // Q(-2) Word16 tcx_offset[CPE_CHANNELS]; @@ -1177,57 +1178,62 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->q_old_synth = 0; move16(); } - Copy( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len ); // Q = st->hTcxDec->q_old_synth - Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->hTcxDec->q_old_synth, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth q_syn = st->hTcxDec->q_old_synth; move16(); - set16_fx( synth_fx, 0, L_FRAME_PLUS + M ); + set16_fx( synth_fx, 0, L_FRAME_PLUS_INTERNAL + M ); set16_fx( synthFB_fx, 0, L_FRAME_PLUS + M ); IF( st->core != ACELP_CORE ) { - Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // st->hTcxDec->Q_syn_Overl_TDACFB -> q_win - Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win - Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win - st->hTcxDec->Q_old_syn_Overl = q_win; - Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win - Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win - Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( q_win, st->hHQ_core->Q_old_wtda_LB ) ); // Q(st->hHQ_core->Q_old_wtda_LB) -> q_win - Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( q_win, st->hHQ_core->Q_old_wtda ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win -#ifdef MSAN_FIX - Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win - Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win -#else - Scale_sig( synth_buf_fx, 3136, sub( q_win, q_syn ) ); - Scale_sig( synth_bufFB_fx, 3136, sub( q_win, q_syn ) ); -#endif - Scale_sig( st->syn, M + 1, sub( q_win, st->Q_syn ) ); // st->Q_syn -> q_win + st->Q_syn_factor = 0; + move16(); + Word16 q_win0 = Q15; + move16(); + Word16 q_winFB0 = Q15; + move16(); + FOR( k = 0; k < nSubframes[ch]; k++ ) { init_tcx_info_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], k, bfi, &tcx_offset[ch], &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); + assert( nSubframes[ch] <= 2 ); + q_win0 = q_win; + move16(); + q_winFB0 = q_winFB; + move16(); + q_win = -2; + move16(); + q_winFB = -2; + move16(); + IF( !skip_decoding ) { test(); test(); IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) { - decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, q_win, + decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, &q_winFB, MDCT_IV, fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 ); } ELSE { - decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, q_win, + decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, &q_winFB, st->hTcxDec->kernel_type[k], fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 ); } } ELSE { + q_win = Q15; + move16(); + q_winFB = Q15; + move16(); set16_fx( &synth_fx[k * L_frame[ch]], 0, L_frame[ch] ); set16_fx( &synthFB_fx[k * L_frame[ch]], 0, L_frameTCX[ch] ); /* Note: these buffers are not subframe-based, hence no indexing with k */ set16_fx( &st->hHQ_core->old_out_LB_fx[0], 0, L_frame[ch] ); set16_fx( &st->hHQ_core->old_out_fx[0], 0, L_frameTCX[ch] ); + st->hHQ_core->Q_old_wtda = Q15; + st->hHQ_core->Q_old_wtda_LB = Q15; set16_fx( &st->hTcxDec->syn_Overl[0], 0, shr( L_frame[ch], 1 ) ); set16_fx( &st->hTcxDec->syn_OverlFB[0], 0, shr( L_frameTCX[ch], 1 ) ); set16_fx( &st->hTcxDec->syn_Overl_TDAC[0], 0, shr( L_frame[ch], 1 ) ); @@ -1235,53 +1241,64 @@ void ivas_mdct_core_reconstruct_fx( } } + IF( nSubframes[ch] > 1 ) + { + Word16 q_winN, q_winFBN; + + q_winN = s_min( q_win, q_win0 ); + q_winFBN = s_min( q_winFB, q_winFB0 ); + // Need to rescale for each subframe, because q_win/q_winFB might had changed for the next subframe. Other OLA buffers are rescaled each time. + Scale_sig( synth_fx, L_frame[ch], sub( q_winN, q_win0 ) ); // q_win -> st->hTcxDec->q_old_synth + Scale_sig( synthFB_fx, L_frameTCX[ch], sub( q_winFBN, q_winFB0 ) ); // q_winFB -> st->hTcxDec->q_old_synth + Scale_sig( synth_fx + L_frame[ch], add( L_frame[ch], M ), sub( q_winN, q_win ) ); // q_win -> st->hTcxDec->q_old_synth + Scale_sig( synthFB_fx + L_frameTCX[ch], add( L_frameTCX[ch], M ), sub( q_winFBN, q_winFB ) ); // q_winFB -> st->hTcxDec->q_old_synth + q_win = q_winN; + move16(); + q_winFB = q_winFBN; + move16(); + } + + Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub( q_win, st->hTcxDec->q_old_synth ) ); // q_win + Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( q_winFB, st->Q_syn ) ); // q_winFB + test(); IF( ( bfi == 0 ) && st->hTonalMDCTConc != NULL ) { - TonalMDCTConceal_SaveTimeSignal_ivas_fx( st->hTonalMDCTConc, synthFB_fx, q_win, L_frameTCX[ch] ); + TonalMDCTConceal_SaveTimeSignal_ivas_fx( st->hTonalMDCTConc, synthFB_fx, q_winFB, L_frameTCX[ch] ); } - decoder_tcx_post_ivas_fx( st, synth_fx, synthFB_fx, q_win, NULL, bfi, MCT_flag ); + decoder_tcx_post_ivas_fx( st, synth_fx, synthFB_fx, q_winFB, NULL, bfi, MCT_flag ); - sf = s_min( getScaleFactor16( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ) ), getScaleFactor16( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ) ) ); - IF( LT_16( sf, 2 ) ) + // norm(synth_buf) >= q_syn - q_win + // norm(synth_buf) + q_win >= q_syn + sf = s_min( getScaleFactor16( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS_INTERNAL ), M ) ), getScaleFactor16( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ) ) ); + q_syn = add( sub( sf, 1 ), s_min( q_win, q_winFB ) ); + st->Q_syn = q_syn; + move16(); + + // norm(old_out) >= st->Q_syn - q_win + // norm(old_out) + q_win >= st->Q_syn + sf = s_min( getScaleFactor16( st->hHQ_core->old_out_fx, L_FRAME48k ), getScaleFactor16( st->hHQ_core->old_out_LB_fx, L_FRAME32k ) ); + st->Q_syn = add( sf, s_min( q_win, q_winFB ) ); + + Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS_INTERNAL ), M ), sub( q_syn, q_win ) ); // st->hTcxDec->q_old_synth -> q_syn + Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // st->hTcxDec->q_old_synth -> q_syn + // Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); + Scale_sig( st->syn, M + 1, sub( st->Q_syn, q_win ) ); + + IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - q_syn = sub( sf, 2 ); - st->Q_syn = q_syn; - move16(); + Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, st->prev_Q_syn ) ); // st->Q_syn gets a new value, but st->mem_syn2_fx got its value from E_UTIL_f_preemph3 with st->Q_syn = st->prev_Q_syn } - sf = s_min( getScaleFactor16( st->hHQ_core->old_out_fx, L_FRAME48k ), getScaleFactor16( st->hHQ_core->old_out_LB_fx, L_FRAME32k ) ); - IF( LT_16( sf, sub( st->Q_syn, q_win ) ) ) + ELSE { - st->Q_syn = add( q_win, sf ); + Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, add( q_win, 2 ) ) ); // q_win+2 -> st->Q_syn: in this case, E_UTIL_f_preemph2 shifts st->mem_syn2_fx by 2 bits } - - Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( sub( -1, st->Q_syn ), q_win ) ); // q_win -> Q(-1 - st->Q_syn) - st->hTcxDec->Q_syn_Overl_TDACFB = sub( -1, st->Q_syn ); - move16(); - Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), q_win ) ); // q_win -> Q(-1 - st->Q_syn) - st->hTcxDec->Q_syn_Overl_TDAC = sub( -1, st->Q_syn ); - move16(); - Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_old_syn_Overl ) ); // q_win -> Q(-1 - st->Q_syn) - st->hTcxDec->Q_old_syn_Overl = sub( -1, st->Q_syn ); -#ifdef MSAN_FIX - Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // q_win -> q_syn - Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // q_win -> q_syn -#else - Scale_sig( synth_buf_fx, 3136, sub( q_syn, q_win ) ); - Scale_sig( synth_bufFB_fx, 3136, sub( q_syn, q_win ) ); -#endif - Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); - Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn - Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn - Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn - Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn - st->hHQ_core->Q_old_wtda = st->Q_syn; - move16(); - st->hHQ_core->Q_old_wtda_LB = st->Q_syn; - move16(); } ELSE /*ACELP core for ACELP-PLC */ { + Copy( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len ); // Q = st->hTcxDec->q_old_synth + Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->hTcxDec->q_old_synth, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth + assert( EQ_16( st->bfi, 1 ) ); /* PLC: [TCX: TD PLC] */ IF( MCT_flag != 0 ) @@ -1310,6 +1327,11 @@ void ivas_mdct_core_reconstruct_fx( st->Q_syn = q_syn; move16(); st->hTcxDec->Q_old_syn_Overl = add( st->hTcxDec->Q_old_syn_Overl, q_syn ); + move16(); + st->hTcxDec->Q_syn_OverlFB = add( st->hTcxDec->Q_syn_OverlFB, q_syn ); + move16(); + // st->hTcxDec->Q_syn_Overl = add( st->hTcxDec->Q_syn_Overl, q_syn ); // It is disabled because it increased the number of regressions. + // move16(); IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || ( st->hTcxDec->tcxConceal_recalc_exc != 0 ) ) { @@ -1388,23 +1410,17 @@ void ivas_mdct_core_reconstruct_fx( { Copy_Scale_sig_16_32_no_sat( st->p_bpf_noise_buf, st->p_bpf_noise_buf_32, st->L_frame, Q11 ); // Q0 -> Q11 } - IF( signal_outFB_fx[ch] != NULL ) - { - Copy( synthFB_fx, signal_outFB_fx[ch], st->hTcxDec->L_frameTCX ); - e_sig[ch] = sub( 15, q_syn ); - move16(); - } + + Copy( synthFB_fx, signal_outFB_fx[ch], st->hTcxDec->L_frameTCX ); + e_sig[ch] = sub( 15, q_syn + st->Q_syn_factor ); + move16(); /* updates */ st->last_voice_factor_fx = 0; move16(); st->last_coder_type = st->coder_type; move16(); -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( x_fx_16, x_fx[ch][0], st->L_frame, sub( q_x, q_syn ) ); // q_syn -> Q_x -#else - Copy_Scale_sig_16_32_DEPREC( x_fx_16, x_fx[ch][0], st->L_frame, sub( q_x, q_syn ) ); // q_syn -> Q_x -#endif } IF( GT_16( e_sig[0], e_sig[1] ) ) @@ -1485,7 +1501,7 @@ void ivas_mdct_core_tns_ns_fx( Word32 *x_fx[CPE_CHANNELS][NB_DIV], /* o : synthesis @internal_FS Q(31 - x_e)*/ Word32 Aq_fx[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* o : LP coefficients Q16*/ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ - Word16 x_e[CPE_CHANNELS][NB_DIV] ) + Word16 x_e ) { Word16 ch, k, bfi; Decoder_State **sts, *st; @@ -1508,9 +1524,7 @@ void ivas_mdct_core_tns_ns_fx( move16(); set32_fx( xn_buf_fx, 0, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX ); -#ifdef MSAN_FIX set32_fx( sns_int_scf_fx, 0, FDNS_NPTS ); -#endif /* TNS, ITF, IMDCT and updates */ @@ -1561,7 +1575,7 @@ void ivas_mdct_core_tns_ns_fx( &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); Word16 q_x; - q_x = sub( 31, x_e[ch][k] ); + q_x = sub( 31, x_e ); IF( bfi == 0 ) { sns_interpolate_scalefactors_fx( sns_int_scf_fx, &Aq_fx[ch][k * M], DEC ); // Q16 @@ -1580,7 +1594,7 @@ void ivas_mdct_core_tns_ns_fx( scf_e[ind] = sub( 15, q_shift ); move16(); } - TonalMDCTConceal_SaveFreqSignal_ivas_fx( st->hTonalMDCTConc, x_fx[ch][k], x_e[ch][k], L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline( st, L_frame[ch], L_frameTCX[ch] ) ); + TonalMDCTConceal_SaveFreqSignal_ivas_fx( st->hTonalMDCTConc, x_fx[ch][k], x_e, L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline_fx( st, L_frame[ch], L_frameTCX[ch] ) ); } } ELSE @@ -1642,8 +1656,6 @@ void ivas_mdct_core_tns_ns_fx( norm_x = getScaleFactor32( &x_fx[ch][k][0], length ); Scale_sig32( &x_fx[ch][k][0], length, norm_x ); q_x = add( q_x, norm_x ); - x_e[ch][k] = sub( 31, q_x ); - move16(); Word16 q_sns_int_scf; Word16 q_2; @@ -1656,6 +1668,8 @@ void ivas_mdct_core_tns_ns_fx( } q_2 = q_x; move16(); + Word16 length2 = length; + move16(); sns_shape_spectrum_fx( x_fx[ch][k], &q_x, st->hTcxCfg->psychParamsCurrent, sns_int_scf_fx, q_sns_int_scf, st->hTcxCfg->psychParamsCurrent->nBins, &length ); IF( LT_16( q_2, add( q_x, 1 ) ) ) /*scaling to q_2*/ { @@ -1665,20 +1679,22 @@ void ivas_mdct_core_tns_ns_fx( } ELSE /*scaling to q_x+1*/ { - Scale_sig32( &x_fx[ch][k][0] + length, sub( L_spec[ch], length ), sub( add( q_x, 1 ), q_2 ) ); + Scale_sig32( &x_fx[ch][k][0] + length, sub( length2, length ), sub( add( q_x, 1 ), q_2 ) ); q_x = add( q_x, 1 ); } - x_e[ch][k] = sub( 31, q_x ); - move16(); - v_multc_fixed( x_fx[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sns_int_scf_fx[FDNS_NPTS - 1], x_fx[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sub( L_spec[ch], st->hTcxCfg->psychParamsCurrent->nBins ) ); + /* + 2025-09-07, mul: + in case of PLC, applying SNS up to L_spec might not be enough: In case the transition frame from DTX after an inactive period is lost, L_spec is assumed to represent a regular TCX frame, + however, this frame is nevertheless acting as an transition frame as also visible in L_frameTCX; thus, the safer approach to prevent high frequency artifacts is to apply the SNS up to L_frameTCX; + in case this is not necessary, x[] is filled with zeros, and the multiplication is not causing any additional harm + */ + v_multc_fx( x_fx[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sns_int_scf_fx[FDNS_NPTS - 1], x_fx[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sub( s_max( L_spec[ch], L_frameTCX[ch] ), st->hTcxCfg->psychParamsCurrent->nBins ) ); q_2 = sub( add( q_x, q_sns_int_scf ), 31 ); Scale_sig32( &x_fx[ch][k][0], st->hTcxCfg->psychParamsCurrent->nBins, sub( q_2, q_x ) ); q_x = q_2; move16(); - x_e[ch][k] = sub( 31, q_x ); - move16(); q_x = sub( q_x, 5 ); length = L_frameTCX[ch]; @@ -1695,39 +1711,18 @@ void ivas_mdct_core_tns_ns_fx( } Scale_sig32( &x_fx[ch][k][0], length, -5 ); decoder_tcx_tns_fx( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], &x_fx[ch][k][0], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 0, &length ); - norm_x = getScaleFactor32( &x_fx[ch][k][0], length ); - Scale_sig32( &x_fx[ch][k][0], length, norm_x ); - q_x = add( q_x, norm_x ); - x_e[ch][k] = sub( 31, q_x ); - move16(); + Scale_sig32( &x_fx[ch][k][0], length, sub( sub( 31, q_x ), x_e ) ); } IF( ( bfi != 0 ) && ( st->tonal_mdct_plc_active != 0 ) ) { - Word16 tmp_x_fx_exp[L_FRAME48k], temp = -MAX_16, i; - move16(); + Word16 i; FOR( i = 0; i < FDNS_NPTS; i++ ) { st->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e = s_max( st->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, st->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ); } - set16_fx( tmp_x_fx_exp, x_e[ch][0], L_FRAME48k ); - TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx[ch][0], tmp_x_fx_exp, st->hTcxCfg->psychParamsCurrent ); - - FOR( i = 0; i < L_FRAME48k; i++ ) - { - temp = s_max( temp, tmp_x_fx_exp[i] ); - } - - { - x_e[ch][0] = temp; - move16(); - FOR( i = 0; i < L_FRAME48k; i++ ) - { - x_fx[ch][0][i] = L_shr( x_fx[ch][0][i], sub( temp, tmp_x_fx_exp[i] ) ); - move32(); - } - } + TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx[ch][0], x_e, st->hTcxCfg->psychParamsCurrent ); } test(); diff --git a/lib_dec/ivas_mono_dmx_renderer_fx.c b/lib_dec/ivas_mono_dmx_renderer_fx.c index 2eb8d84dfe6a1d93e468243d1a11353fed12e82e..6c64eee816fc5cfbb4db6c676a09e080e004d4bc 100644 --- a/lib_dec/ivas_mono_dmx_renderer_fx.c +++ b/lib_dec/ivas_mono_dmx_renderer_fx.c @@ -45,8 +45,8 @@ /*------------------------------------------------------------------------- * Local constants *------------------------------------------------------------------------*/ -#define DOWNMIX_ALPHA_FX 31130 /* Smoothing coefficient */ -#define MONO_DOWNMIX_RENDERER_MAX_INPUT_CHANS 4 +#define DOWNMIX_ALPHA_FX 31130 /* Smoothing coefficient alpha */ +#define DOWNMIX_ONE_MINUS_ALPHA_FX 1638 /* Smoothing coefficient (1 - alpha) */ /*------------------------------------------------------------------------- * ivas_mono_dmx_renderer_open() @@ -102,13 +102,14 @@ void ivas_mono_dmx_renderer_close( } /*------------------------------------------------------------------------- - * ivas_mono_downmix_render_passive() + * ivas_ism_mono_dmx() * * Downmix process *------------------------------------------------------------------------*/ -void ivas_mono_downmix_render_passive_fx( + +void ivas_ism_mono_dmx_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_f_fx[], /* i/o: synthesized core-coder transport channels/mono output Qin = 11/ Qout = 8*/ + Word32 *output_fx[], /* i/o: synthesized core-coder transport channels/mono output Qin = 11/ Qout = 8*/ const Word16 output_frame /* i : output frame length */ ) { @@ -120,6 +121,7 @@ void ivas_mono_downmix_render_passive_fx( Word16 Q_shift, proto_shift, input_shift, norm_protoEner, norm_inputEner, proto_norm; Word16 diff_shift, div, div_sqrt; Word32 protoEner_pre, inputEner_pre; + numInputChannels = st_ivas->nSCE; move16(); if ( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) @@ -148,7 +150,7 @@ void ivas_mono_downmix_render_passive_fx( move16(); FOR( Word16 lp = 0; lp < numInputChannels; lp++ ) { - Word16 norm = L_norm_arr( output_f_fx[lp], output_frame ); + Word16 norm = L_norm_arr( output_fx[lp], output_frame ); Output_norm = s_min( Output_norm, norm ); } Q_shift = sub( Output_norm, find_guarded_bits_fx( numInputChannels ) ); @@ -156,16 +158,10 @@ void ivas_mono_downmix_render_passive_fx( /* Compute the Proto Signal */ FOR( i = 0; i < numInputChannels; i++ ) { - v_shr_32( output_f_fx[i], output_shr, output_frame, -Q_shift ); + v_shr_32( output_fx[i], output_shr, output_frame, -Q_shift ); v_add_32( output_shr, proto_signal_fx, proto_signal_fx, output_frame ); } - /* compute the input energy, proto energy after smoothing */ - hDownmix->inputEnergy_fx = Mpy_32_16_1( hDownmix->inputEnergy_fx, DOWNMIX_ALPHA_FX ); - move32(); - hDownmix->protoEnergy_fx = Mpy_32_16_1( hDownmix->protoEnergy_fx, DOWNMIX_ALPHA_FX ); - move32(); - proto_norm = L_norm_arr( proto_signal_fx, output_frame ); proto_shift = sub( proto_norm, shr( ( add( find_guarded_bits_fx( output_frame ), 1 ) ), 1 ) ); @@ -180,11 +176,19 @@ void ivas_mono_downmix_render_passive_fx( protoEner_pre = L_add( protoEner_pre, Mpy_32_32( proto_sh, proto_sh ) ); FOR( j = 0; j < numInputChannels; j++ ) { - Word32 output_f_shift = L_shl( output_f_fx[j][i], input_shift ); + Word32 output_f_shift = L_shl( output_fx[j][i], input_shift ); inputEner_pre = L_add( inputEner_pre, Mpy_32_32( output_f_shift, output_f_shift ) ); } } + hDownmix->inputEnergy_fx = Mpy_32_16_1( hDownmix->inputEnergy_fx, DOWNMIX_ALPHA_FX ); + move32(); + hDownmix->protoEnergy_fx = Mpy_32_16_1( hDownmix->protoEnergy_fx, DOWNMIX_ALPHA_FX ); + move32(); + + protoEner_pre = Mpy_32_16_1( protoEner_pre, DOWNMIX_ONE_MINUS_ALPHA_FX ); + inputEner_pre = Mpy_32_16_1( inputEner_pre, DOWNMIX_ONE_MINUS_ALPHA_FX ); + /* compute the eq factor */ IF( hDownmix->protoEnergy_fx == 0 ) @@ -252,10 +256,9 @@ void ivas_mono_downmix_render_passive_fx( move16(); } - /* equalize the downmix */ - v_multc_fixed_16( proto_signal_fx, eq_fx, output_f_fx[0], output_frame ); - v_shr_32( output_f_fx[0], output_f_fx[0], output_frame, Q_shift ); + v_multc_fx_16( proto_signal_fx, eq_fx, output_fx[0], output_frame ); + v_shr_32( output_fx[0], output_fx[0], output_frame, Q_shift ); return; } @@ -268,7 +271,7 @@ void ivas_mono_downmix_render_passive_fx( void ivas_mono_stereo_downmix_mcmasa_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_f_fx[], /* i/o: synthesized core-coder transport channels/mono or stereo output Q11*/ + Word32 *output_fx[], /* i/o: synthesized core-coder transport channels/mono or stereo output Q11*/ Word16 output_frame /* i : output frame length per channel */ ) { @@ -282,8 +285,8 @@ void ivas_mono_stereo_downmix_mcmasa_fx( test(); IF( EQ_16( st_ivas->hDecoderConfig->nchan_out, 2 ) && st_ivas->hOutSetup.separateChannelEnabled ) { - v_multc_acc_32_16( output_f_fx[st_ivas->hOutSetup.separateChannelIndex], INV_SQRT2_FX_Q15, output_f_fx[0], output_frame ); // Q11 - v_multc_acc_32_16( output_f_fx[st_ivas->hOutSetup.separateChannelIndex], INV_SQRT2_FX_Q15, output_f_fx[1], output_frame ); // Q11 + v_multc_acc_32_16( output_fx[st_ivas->hOutSetup.separateChannelIndex], INV_SQRT2_FX_Q15, output_fx[0], output_frame ); // Q11 + v_multc_acc_32_16( output_fx[st_ivas->hOutSetup.separateChannelIndex], INV_SQRT2_FX_Q15, output_fx[1], output_frame ); // Q11 } /* Mono downmix */ ELSE IF( EQ_16( st_ivas->hDecoderConfig->nchan_out, 1 ) ) @@ -291,16 +294,16 @@ void ivas_mono_stereo_downmix_mcmasa_fx( /* Downmix L and R to dmx_tmp */ FOR( i = 0; i < st_ivas->nchan_transport; i++ ) { - v_multc_acc_32_16( output_f_fx[i], INV_SQRT2_FX_Q15, dmx_tmp_fx, output_frame ); // Q11 + v_multc_acc_32_16( output_fx[i], INV_SQRT2_FX_Q15, dmx_tmp_fx, output_frame ); // Q11 } /* Add center channel */ IF( st_ivas->hOutSetup.separateChannelEnabled ) { - v_add_32( output_f_fx[st_ivas->hOutSetup.separateChannelIndex], dmx_tmp_fx, dmx_tmp_fx, output_frame ); + v_add_32( output_fx[st_ivas->hOutSetup.separateChannelIndex], dmx_tmp_fx, dmx_tmp_fx, output_frame ); } /* Move to output */ - Copy32( dmx_tmp_fx, output_f_fx[0], output_frame ); // Q11 + Copy32( dmx_tmp_fx, output_fx[0], output_frame ); // Q11 } return; @@ -314,7 +317,8 @@ void ivas_mono_stereo_downmix_mcmasa_fx( *------------------------------------------------------------------------*/ void ivas_apply_non_diegetic_panning_fx( - Word32 *output_f_fx[], /* i/o: core-coder transport mono channel/stereo output */ + Word32 *input_f_fx, /* i : non-diegetic object */ + Word32 *output_fx[], /* o: core-coder transport mono channel/stereo output */ const Word16 non_diegetic_pan_gain_fx, /* i : non-diegetic panning gain Q15*/ const Word16 output_frame /* i : output frame length per channel Q11*/ ) @@ -324,8 +328,8 @@ void ivas_apply_non_diegetic_panning_fx( pan_left_fx = add( mult( non_diegetic_pan_gain_fx, 16384 ), 16384 ); // 0.5.Q15 = 16384 pan_right_fx = sub( 32767, pan_left_fx ); - v_multc_fixed( output_f_fx[0], L_shl( L_deposit_l( pan_right_fx ), 16 ), output_f_fx[1], output_frame ); - v_multc_fixed( output_f_fx[0], L_shl( L_deposit_l( pan_left_fx ), 16 ), output_f_fx[0], output_frame ); + v_multc_fx( input_f_fx, L_shl( L_deposit_l( pan_right_fx ), 16 ), output_fx[1], output_frame ); + v_multc_fx( input_f_fx, L_shl( L_deposit_l( pan_left_fx ), 16 ), output_fx[0], output_frame ); return; } diff --git a/lib_dec/ivas_objectRenderer_internal_fx.c b/lib_dec/ivas_objectRenderer_internal_fx.c index 79683e402242b8f940058eedd22252e5fec4b9fb..069e2c0eb4e1f730aa4208d8b385d13af8949eaf 100644 --- a/lib_dec/ivas_objectRenderer_internal_fx.c +++ b/lib_dec/ivas_objectRenderer_internal_fx.c @@ -46,6 +46,7 @@ * * Open and initialize TD Object binaural renderer *---------------------------------------------------------------------*/ + ivas_error ivas_td_binaural_open_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ Word16 *SrcInd, /*Temporarily used to store the updated value of SrcInd*/ @@ -53,58 +54,21 @@ ivas_error ivas_td_binaural_open_fx( { *num_src = st_ivas->nchan_transport; move16(); + test(); - if ( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { *num_src = st_ivas->nchan_ism; move16(); } - return ivas_td_binaural_open_unwrap_fx( &st_ivas->hHrtfTD, st_ivas->hDecoderConfig->output_Fs, *num_src, st_ivas->ivas_format, st_ivas->transport_config, st_ivas->hRenderConfig->directivity_fx, st_ivas->hTransSetup, &st_ivas->hBinRendererTd, &st_ivas->binaural_latency_ns, SrcInd ); -} - -/*---------------------------------------------------------------------* - * ivas_td_binaural_renderer() - * - * Receives the current frames for the object streams, updates metadata - * and renders the current frame. - *---------------------------------------------------------------------*/ - -ivas_error ivas_td_binaural_renderer_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output[], /* i/o: SCE channels / Binaural synthesis Q11*/ - const Word16 output_frame /* i : output frame length */ -) -{ - Word16 ism_md_subframe_update; - Word16 nchan_transport; test(); - IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - nchan_transport = st_ivas->nchan_ism; - } - ELSE + IF( st_ivas->hHrtfTD == NULL && st_ivas->hDecoderConfig->Opt_HRTF_binary ) { - nchan_transport = st_ivas->nchan_transport; + return IVAS_ERROR( IVAS_ERR_INTERNAL, "HRTF binary file present but not used in TD renderer" ); } - move16(); - - IF( st_ivas->hDecoderConfig->Opt_delay_comp ) - { - ism_md_subframe_update = 1; - } - ELSE - { - ism_md_subframe_update = 2; - } - move16(); - if ( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) - { - ism_md_subframe_update = 2; - move16(); - } - return ivas_td_binaural_renderer_unwrap_fx( st_ivas->hReverb, st_ivas->transport_config, st_ivas->hBinRendererTd, nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, st_ivas->hCombinedOrientationData, ism_md_subframe_update, output, output_frame, MAX_PARAM_SPATIAL_SUBFRAMES ); + return ivas_td_binaural_open_unwrap_fx( &st_ivas->hHrtfTD, st_ivas->hDecoderConfig->output_Fs, *num_src, st_ivas->ivas_format, st_ivas->transport_config, st_ivas->hRenderConfig->directivity_fx, st_ivas->hRenderConfig->distAtt_fx, st_ivas->hTransSetup, &st_ivas->hBinRendererTd, &st_ivas->binaural_latency_ns, SrcInd ); } @@ -138,7 +102,9 @@ ivas_error ivas_td_binaural_renderer_sf_fx( Word16 enableCombinedOrientation; /* Set the number of ISMs */ - IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) || ( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && GT_16( st_ivas->nchan_ism, 0 ) ) ) { nchan_ism_internal = st_ivas->nchan_ism; move16(); @@ -241,9 +207,51 @@ ivas_error ivas_td_binaural_renderer_sf_fx( IF( EQ_16( subframe_idx, ism_md_subframe_update_jbm ) ) { - IF( ( error = TDREND_Update_object_positions_fx( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, st_ivas->hIsmMetaData ) ) != IVAS_ERR_OK ) + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - return error; + ISM_METADATA_FRAME ismMetaData[MAX_NUM_OBJECTS]; + ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; + FOR( nS = 0; nS < nchan_ism; nS++ ) + { + ismMetaData[nS].azimuth_fx = st_ivas->hIsmMetaData[nS]->edited_azimuth_fx; + move32(); + ismMetaData[nS].elevation_fx = st_ivas->hIsmMetaData[nS]->edited_elevation_fx; + move32(); + ismMetaData[nS].radius_fx = st_ivas->hIsmMetaData[nS]->edited_radius_fx; + move16(); + ismMetaData[nS].yaw_fx = st_ivas->hIsmMetaData[nS]->edited_yaw_fx; + move32(); + ismMetaData[nS].pitch_fx = st_ivas->hIsmMetaData[nS]->edited_pitch_fx; + move32(); + ismMetaData[nS].non_diegetic_flag = st_ivas->hIsmMetaData[nS]->non_diegetic_flag; + move16(); + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + /* DISC OMASA ISM gaining with TDREND is done in ivas_dec_prepare_renderer()*/ + ismMetaData[nS].gain_fx = ONE_IN_Q29; + move32(); + } + ELSE + { + ismMetaData[nS].gain_fx = st_ivas->hIsmMetaData[nS]->edited_gain_fx; + move32(); + } + hIsmMetaData[nS] = &ismMetaData[nS]; + } + + IF( NE_16( ( error = TDREND_Update_object_positions_fx( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, hIsmMetaData ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + IF( NE_16( error = TDREND_Update_object_positions_fx( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, st_ivas->hIsmMetaData ), IVAS_ERR_OK ) ) + { + return error; + } } } @@ -272,17 +280,13 @@ ivas_error ivas_td_binaural_renderer_sf_fx( move16(); } - IF( NE_32( ( error = TDREND_Update_listener_orientation_fx( st_ivas->hBinRendererTd, - enableCombinedOrientation, - tmp_Quaternion_fx, - tmp_vector_fx ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = TDREND_Update_listener_orientation_fx( st_ivas->hBinRendererTd, enableCombinedOrientation, tmp_Quaternion_fx, tmp_vector_fx ) ), IVAS_ERR_OK ) ) { return error; } test(); - IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { FOR( i = 0; i < nchan_ism_internal; ++i ) { @@ -308,13 +312,13 @@ ivas_error ivas_td_binaural_renderer_sf_fx( /* Render subframe */ /* ism_md_subframe_update_jbm != subframe_idx: trigger update only for ism_md_subframe_update_jbm == subframe_idx, where then the two TDREND_GetMix()-arguments subframe_idx and ism_md_subframe_update are equal, and we want to enforce the update inside TDREND_GetMix to use subframe_idx == 0 */ - IF( NE_32( ( error = TDREND_GetMix_fx( st_ivas->hBinRendererTd, output_fx_local, output_frame, 0, ism_md_subframe_update_jbm != subframe_idx ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = TDREND_GetMix_fx( st_ivas->hBinRendererTd, output_fx_local, output_frame, 0 ) ), IVAS_ERR_OK ) ) { return error; } test(); - IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { /* add reverb to rendered signals */ v_add_32( reverb_signal_fx[0], output_fx_local[0], output_fx_local[0], output_frame ); // Q11 @@ -340,3 +344,158 @@ ivas_error ivas_td_binaural_renderer_sf_fx( return IVAS_ERR_OK; } + +/*---------------------------------------------------------------------* + * ivas_td_binaural_renderer_sf_splitBinaural() + * + * Render to multiple binaural pairs based on relative head positions for split rendering. + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_renderer_sf_splitBinaural( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word32 *output[], /* i/o: SCE channels / Binaural synthesis */ + const Word16 nSamplesRendered /* i : number of samples to render */ +) +{ + Word16 i; + Word16 pos_idx; + IVAS_QUATERNION originalHeadRot[MAX_PARAM_SPATIAL_SUBFRAMES]; + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData; + BINAURAL_TD_OBJECT_RENDERER_HANDLE origTdRendHandle; + ivas_error error; + Word16 original_subframes_rendered; + Word16 original_slots_rendered; + Word32 *p_bin_output[BINAURAL_CHANNELS]; + Word32 output_local[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + Word16 q_fact_orig[MAX_PARAM_SPATIAL_SUBFRAMES]; + + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + + pMultiBinPoseData = &st_ivas->hSplitBinRend->splitrend.multiBinPoseData; + move32(); + + /* If not yet allocated, open additional instances of TD renderer */ + FOR( i = 0; i < pMultiBinPoseData->num_poses - 1; ++i ) + { + IF( st_ivas->hTdRendHandles[i] != NULL ) + { + continue; + } + + IF( ( error = ivas_td_binaural_open_unwrap_fx( &st_ivas->hHrtfTD, + st_ivas->hDecoderConfig->output_Fs, + st_ivas->nchan_transport, + st_ivas->ivas_format, + st_ivas->transport_config, + st_ivas->hRenderConfig->directivity_fx, + st_ivas->hRenderConfig->distAtt_fx, + st_ivas->hTransSetup, + &st_ivas->hTdRendHandles[i], + &st_ivas->binaural_latency_ns, + SrcInd ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Save current head positions */ + FOR( i = 0; i < st_ivas->hCombinedOrientationData->num_subframes; ++i ) + { + originalHeadRot[i] = st_ivas->hCombinedOrientationData->Quaternions[i]; + q_fact_orig[i] = originalHeadRot[i].q_fact; + } + + original_subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + move16(); + original_slots_rendered = st_ivas->hTcBuffer->slots_rendered; + move16(); + origTdRendHandle = st_ivas->hBinRendererTd; + move32(); + + FOR( i = 0; i < st_ivas->hCombinedOrientationData->num_subframes; ++i ) + { + modify_Quat_q_fx( &originalHeadRot[i], &originalHeadRot[i], Q22 ); + } + + FOR( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses; pos_idx++ ) + { + /* Update head positions */ + IF( NE_16( pos_idx, 0 ) ) + { + COMBINED_ORIENTATION_HANDLE pCombinedOrientationData = st_ivas->hCombinedOrientationData; + FOR( i = 0; i < st_ivas->hCombinedOrientationData->num_subframes; ++i ) + { + pCombinedOrientationData->Quaternions[i].w_fx = L_negate( 12582912 ); // Q22 + /*euler*/ + Quat2EulerDegree_fx( originalHeadRot[i], + &pCombinedOrientationData->Quaternions[i].z_fx, + &pCombinedOrientationData->Quaternions[i].y_fx, + &pCombinedOrientationData->Quaternions[i].x_fx ); + pCombinedOrientationData->Quaternions[i].x_fx = L_add( pCombinedOrientationData->Quaternions[i].x_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][0] ); + pCombinedOrientationData->Quaternions[i].y_fx = L_add( pCombinedOrientationData->Quaternions[i].y_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][1] ); + pCombinedOrientationData->Quaternions[i].z_fx = L_add( pCombinedOrientationData->Quaternions[i].z_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][2] ); + + Euler2Quat_fx( deg2rad_fx( pCombinedOrientationData->Quaternions[i].x_fx ), + deg2rad_fx( pCombinedOrientationData->Quaternions[i].y_fx ), + deg2rad_fx( pCombinedOrientationData->Quaternions[i].z_fx ), &pCombinedOrientationData->Quaternions[i] ); + + modify_Quat_q_fx( &pCombinedOrientationData->Quaternions[i], &pCombinedOrientationData->Quaternions[i], q_fact_orig[i] ); + } + } + + /* set output channels */ + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + p_bin_output[i] = output_local[add( i_mult( pos_idx, BINAURAL_CHANNELS ), i )]; + move32(); + } + st_ivas->hTcBuffer->subframes_rendered = original_subframes_rendered; + move16(); + st_ivas->hTcBuffer->slots_rendered = original_slots_rendered; + move16(); + + /* update combined orientation access index */ + ivas_combined_orientation_set_to_start_index( st_ivas->hCombinedOrientationData ); + + /* Render */ + IF( NE_16( pos_idx, 0 ) ) + { + st_ivas->hBinRendererTd = st_ivas->hTdRendHandles[sub( pos_idx, 1 )]; + move32(); + } + + IF( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_bin_output, nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF( EQ_16( st_ivas->ivas_format, MC_FORMAT ) ) + { + Word32 *p_tc[MAX_TRANSPORT_CHANNELS]; + FOR( i = 0; i < st_ivas->nchan_transport; i++ ) + { + p_tc[i] = st_ivas->hTcBuffer->tc_fx[i] + st_ivas->hTcBuffer->n_samples_rendered; + } + ivas_binaural_add_LFE_fx( st_ivas, nSamplesRendered, p_tc, p_bin_output ); + } + } + + FOR( i = 0; i < i_mult( pMultiBinPoseData->num_poses, BINAURAL_CHANNELS ); i++ ) + { + Copy32( output_local[i], output[i], nSamplesRendered ); + } + + /* Restore original head rotation */ + FOR( i = 0; i < st_ivas->hCombinedOrientationData->num_subframes; ++i ) + { + modify_Quat_q_fx( &originalHeadRot[i], &originalHeadRot[i], q_fact_orig[i] ); + st_ivas->hCombinedOrientationData->Quaternions[i] = originalHeadRot[i]; + move32(); + } + + /* restore original td renderer handle */ + st_ivas->hBinRendererTd = origTdRendHandle; + move32(); + + return IVAS_ERR_OK; +} diff --git a/lib_dec/ivas_omasa_dec_fx.c b/lib_dec/ivas_omasa_dec_fx.c index adee0fc91818fea6ae9646a590e02752527f2768..8b691a2794e418f350d4b8589e264b5e9efb4fa6 100644 --- a/lib_dec/ivas_omasa_dec_fx.c +++ b/lib_dec/ivas_omasa_dec_fx.c @@ -32,6 +32,7 @@ #include "options.h" #include +#include #include "ivas_cnst.h" #include "ivas_prot_fx.h" #include "prot_fx.h" @@ -45,7 +46,261 @@ * Local constants *------------------------------------------------------------------------*/ -#define OMASA_TDREND_MATCHING_GAIN_FX 26026 +#define MULT_17_DIV_20_Q15 27853 /* (Word16) ( ( 17.0/20.0 ) * 2^15 + 0.5 ) */ +#define MULT_1_DIV_CLDFB_NO_COL_MAX_Q15 2048 /* (Word16) ( ( 1.0 / CLDFB_NO_COL_MAX ) * 2^15 + 0.5 ) */ +#define ONEMINUX_EXT_RENDER_IIR_FAC_Q31 107374182 /* (Word32) ( ( 1.0 - 0.95 ) * 2^31 + 0.5f ); 0.95 is EXT_RENDER_IIR_FAC */ +#define EXT_RENDER_IIR_FAC_Q31 2040109465 /* (Word32) ( 0.95 * 2^31 + 0.5 ) */ + +// Calculated as (Word16)(((1.0f / (50 * MAX_PARAM_SPATIAL_SUBFRAMES)) * pow(2, 15)) + 0.5f) +#define OMASA_DELAYFRAMES_PER_SEC_Q15 (Word16) 164 // Q15 + +static Word16 interpolator_table_48k_q15[] = { + 0, 137, 273, 410, 546, 683, 819, 956, 1092, 1229, + 1365, 1502, 1638, 1775, 1911, 2048, 2185, 2321, 2458, 2594, + 2731, 2867, 3004, 3140, 3277, 3413, 3550, 3686, 3823, 3959, + 4096, 4233, 4369, 4506, 4642, 4779, 4915, 5052, 5188, 5325, + 5461, 5598, 5734, 5871, 6007, 6144, 6281, 6417, 6554, 6690, + 6827, 6963, 7100, 7236, 7373, 7509, 7646, 7782, 7919, 8055, + 8192, 8329, 8465, 8602, 8738, 8875, 9011, 9148, 9284, 9421, + 9557, 9694, 9830, 9967, 10103, 10240, 10377, 10513, 10650, 10786, + 10923, 11059, 11196, 11332, 11469, 11605, 11742, 11878, 12015, 12151, + 12288, 12425, 12561, 12698, 12834, 12971, 13107, 13244, 13380, 13517, + 13653, 13790, 13926, 14063, 14199, 14336, 14473, 14609, 14746, 14882, + 15019, 15155, 15292, 15428, 15565, 15701, 15838, 15974, 16111, 16247, + 16384, 16521, 16657, 16794, 16930, 17067, 17203, 17340, 17476, 17613, + 17749, 17886, 18022, 18159, 18295, 18432, 18569, 18705, 18842, 18978, + 19115, 19251, 19388, 19524, 19661, 19797, 19934, 20070, 20207, 20343, + 20480, 20617, 20753, 20890, 21026, 21163, 21299, 21436, 21572, 21709, + 21845, 21982, 22118, 22255, 22391, 22528, 22665, 22801, 22938, 23074, + 23211, 23347, 23484, 23620, 23757, 23893, 24030, 24166, 24303, 24439, + 24576, 24713, 24849, 24986, 25122, 25259, 25395, 25532, 25668, 25805, + 25941, 26078, 26214, 26351, 26487, 26624, 26761, 26897, 27034, 27170, + 27307, 27443, 27580, 27716, 27853, 27989, 28126, 28262, 28399, 28535, + 28672, 28809, 28945, 29082, 29218, 29355, 29491, 29628, 29764, 29901, + 30037, 30174, 30310, 30447, 30583, 30720, 30857, 30993, 31130, 31266, + 31403, 31539, 31676, 31812, 31949, 32085, 32222, 32358, 32495, 32631 +}; + +static Word16 interpolator_table_32k_q15[] = { + 0, 205, 410, 614, 819, 1024, 1229, 1434, 1638, 1843, + 2048, 2253, 2458, 2662, 2867, 3072, 3277, 3482, 3686, 3891, + 4096, 4301, 4506, 4710, 4915, 5120, 5325, 5530, 5734, 5939, + 6144, 6349, 6554, 6758, 6963, 7168, 7373, 7578, 7782, 7987, + 8192, 8397, 8602, 8806, 9011, 9216, 9421, 9626, 9830, 10035, + 10240, 10445, 10650, 10854, 11059, 11264, 11469, 11674, 11878, 12083, + 12288, 12493, 12698, 12902, 13107, 13312, 13517, 13722, 13926, 14131, + 14336, 14541, 14746, 14950, 15155, 15360, 15565, 15770, 15974, 16179, + 16384, 16589, 16794, 16998, 17203, 17408, 17613, 17818, 18022, 18227, + 18432, 18637, 18842, 19046, 19251, 19456, 19661, 19866, 20070, 20275, + 20480, 20685, 20890, 21094, 21299, 21504, 21709, 21914, 22118, 22323, + 22528, 22733, 22938, 23142, 23347, 23552, 23757, 23962, 24166, 24371, + 24576, 24781, 24986, 25190, 25395, 25600, 25805, 26010, 26214, 26419, + 26624, 26829, 27034, 27238, 27443, 27648, 27853, 28058, 28262, 28467, + 28672, 28877, 29082, 29286, 29491, 29696, 29901, 30106, 30310, 30515, + 30720, 30925, 31130, 31334, 31539, 31744, 31949, 32154, 32358, 32563 +}; + +static Word16 interpolator_table_16k_q15[] = { + 0, 410, 819, 1229, 1638, 2048, 2458, 2867, 3277, 3686, + 4096, 4506, 4915, 5325, 5734, 6144, 6554, 6963, 7373, 7782, + 8192, 8602, 9011, 9421, 9830, 10240, 10650, 11059, 11469, 11878, + 12288, 12698, 13107, 13517, 13926, 14336, 14746, 15155, 15565, 15974, + 16384, 16794, 17203, 17613, 18022, 18432, 18842, 19251, 19661, 20070, + 20480, 20890, 21299, 21709, 22118, 22528, 22938, 23347, 23757, 24166, + 24576, 24986, 25395, 25805, 26214, 26624, 27034, 27443, 27853, 28262, + 28672, 29082, 29491, 29901, 30310, 30720, 31130, 31539, 31949, 32358 +}; + + +/*------------------------------------------------------------------------- + * Local functions + *------------------------------------------------------------------------*/ + +/** + * Calculate mantissa (Q31) * gain (Q31). + * + * Exponent for the mantissa value is also included as input parameter. + * Adjust the result so that accuracy of the mantissa multiplication is maximixed + * and the corresponding exponent is minimized. + */ + +static Word32 mult32_mantissa_fx( + const Word32 mantissa, + const Word32 gain, + const Word16 exp, + Word16 *exp_result ) +{ + Word64 mult = W_mult_32_32( mantissa, gain ); // Q31 * Q31 -> Q63 + Word16 norm = W_norm( mult ); + Word32 result = W_extract_h( W_shl( mult, norm ) ); // Q63 -> Q31 + *exp_result = sub( exp, norm ); + + return result; +} + + +/** + * Calculate re^2 + im^2 using exponent (Q0) and mantissa (Q31) format. + */ +static Word32 sample_energy_fx( + const Word32 re_m, + const Word16 re_e, + const Word32 im_m, + const Word16 im_e, + Word16 *exp_result ) +{ + Word16 re_exp = add( re_e, re_e ); + Word32 re_mult = mult32_mantissa_fx( re_m, re_m, re_exp, &re_exp ); + move32(); + + Word16 im_exp = add( im_e, im_e ); + Word32 im_mult = mult32_mantissa_fx( im_m, im_m, im_exp, &im_exp ); + move32(); + + return BASOP_Util_Add_Mant32Exp( re_mult, re_exp, im_mult, im_exp, exp_result ); +} + + +/** + * Accumulate sum of re^2 + im^2 over the specified length using exponent (Q0) and mantissa (Q31) format. + */ +static void sample_energy_acc_fx( + Word32 *re_m, + Word16 *re_e, + Word32 *im_m, + Word16 *im_e, + Word32 *out_m, + Word16 *out_e, + const Word16 len ) +{ + Word16 i; + + FOR( i = 0; i < len; i++ ) + { + Word16 exp; + + // energy = re^2 + im^2 + Word32 mantissa = sample_energy_fx( re_m[i], re_e[i], im_m[i], im_e[i], &exp ); + move32(); + + // Accumulate energy + *out_m = BASOP_Util_Add_Mant32Exp( *out_m, *out_e, mantissa, exp, out_e ); + move32(); + } + + return; +} + +// Multiplication of vector (comprising of exponent and mantissa parts) by constant value (Q31) +static void v_multc_exp_mantissa_fx( + const Word32 *in_mantissa, + const Word16 *in_exp, + const Word32 c, + Word32 *out_mantissa, + Word16 *out_exp, + const Word16 len ) +{ + Word16 i; + + FOR( i = 0; i < len; i++ ) + { + out_mantissa[i] = mult32_mantissa_fx( in_mantissa[i], c, in_exp[i], &out_exp[i] ); + move32(); + } + return; +} + + +// Multiplication of vector (comprising of exponent and mantissa parts) by constant acumulate to the output +static void v_multc_acc_exp_mantissa_fx( + const Word32 *in_mantissa, + const Word16 *in_exp, + const Word32 c, + Word32 *out_mantissa, + Word16 *out_exp, + const Word16 len ) +{ + Word16 i; + + FOR( i = 0; i < len; i++ ) + { + Word16 exp; + Word32 mantissa = mult32_mantissa_fx( in_mantissa[i], c, in_exp[i], &exp ); + move32(); + + out_mantissa[i] = BASOP_Util_Add_Mant32Exp( out_mantissa[i], out_exp[i], mantissa, exp, &out_exp[i] ); + move32(); + } + + return; +} + + +// Calculate min( 4, sqrtf( target / proto ) ) +// target and proto values are expressed using exponent and mantissa + +static Word32 get_processing_gain_fx( + const Word32 proto_m, + const Word16 proto_e, + const Word32 target_m, + const Word16 target_e, + Word16 *exp ) +{ + Word16 b = extract_h( proto_m ); + IF( EQ_16( b, 0 ) ) + { + b = 1; + move16(); + } + + Word16 mantissa; + BASOP_Util_Divide_MantExp( extract_h( target_m ), target_e, b, proto_e, &mantissa, exp ); + + Word32 sqrt_mantissa = Sqrt32( L_shl( mantissa, 16 ), exp ); + + Word16 norm = norm_l( sqrt_mantissa ); + sqrt_mantissa = L_shl( sqrt_mantissa, norm ); + *exp = sub( *exp, norm ); + + test(); + IF( GT_16( *exp, 2 ) && NE_32( sqrt_mantissa, 0 ) ) + { + // (2^3) * (1073741824 / 2^31) == 4.0 + sqrt_mantissa = ONE_IN_Q30; // 0.5 in Q31 + *exp = 3; + move32(); + move16(); + } + + return sqrt_mantissa; +} + + +static void mantissa_exp_to_qvalue( + Word16 *exp, + Word32 *output, + const Word16 target_exp, + const Word16 len ) +{ + Word16 bin; + + FOR( bin = 0; bin < len; bin++ ) + { + IF( LT_16( exp[bin], -Q31 ) ) + { + output[bin] = 0; + move32(); + } + ELSE + { + Word16 shift = sub( target_exp, exp[bin] ); + output[bin] = W_sat_l( W_shr( output[bin], shift ) ); + } + } + + return; +} + /*-------------------------------------------------------------------* * ivas_omasa_data_open() @@ -58,7 +313,7 @@ ivas_error ivas_omasa_data_open_fx( ) { MASA_ISM_DATA_HANDLE hMasaIsmData; - Word16 ch, bin; + Word16 ch, band_idx; Word16 sf, obj_idx; IF( ( hMasaIsmData = (MASA_ISM_DATA_HANDLE) malloc( sizeof( MASA_ISM_DATA ) ) ) == NULL ) @@ -66,50 +321,109 @@ ivas_error ivas_omasa_data_open_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA ISM data\n" ) ); } - FOR( bin = 0; bin < CLDFB_NO_CHANNELS_MAX; bin++ ) + FOR( band_idx = 0; band_idx < MASA_FREQUENCY_BANDS; band_idx++ ) { FOR( ch = 0; ch < 2; ch++ ) { - hMasaIsmData->ismPreprocMatrix_fx[ch][ch][bin] = 32767; /* 1.0f in Q15 */ - move16(); - hMasaIsmData->ismPreprocMatrix_fx[1 - ch][ch][bin] = 0; // Q15 - move16(); - hMasaIsmData->eneMoveIIR_fx[ch][bin] = 0; // Q22 + + hMasaIsmData->ismPreprocMatrix_fx[ch][ch][band_idx] = ONE_IN_Q28; + move32(); + hMasaIsmData->ismPreprocMatrix_fx[sub( 1, ch )][ch][band_idx] = 0; move32(); - hMasaIsmData->enePreserveIIR_fx[ch][bin] = 0; // Q22 + hMasaIsmData->eneMoveIIR_fx[ch][band_idx] = 0; + move32(); + hMasaIsmData->eneMoveIIR_e[ch][band_idx] = 0; + move16(); + hMasaIsmData->enePreserveIIR_fx[ch][band_idx] = 0; move32(); + hMasaIsmData->enePreserveIIR_e[ch][band_idx] = 0; + move16(); } - hMasaIsmData->preprocEneTarget_fx[bin] = 0; // Q19 + + hMasaIsmData->eneOrigIIR_fx[band_idx] = 0; + move32(); + hMasaIsmData->eneOrigIIR_e[band_idx] = 0; + move16(); + hMasaIsmData->preprocEneTarget_fx[band_idx] = 0; move32(); - hMasaIsmData->preprocEneRealized_fx[bin] = 0; // Q19 + hMasaIsmData->preprocEneRealized_fx[band_idx] = 0; move32(); } - hMasaIsmData->objectsMoved = 0; - move16(); + hMasaIsmData->objectsEdited = 0; + move32(); hMasaIsmData->delayBuffer_fx = NULL; + move16(); FOR( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) { - hMasaIsmData->ism_is_edited[ch] = 0; - move16(); + hMasaIsmData->ism_dir_is_edited[ch] = 0; + hMasaIsmData->ism_gain_is_edited[ch] = 0; hMasaIsmData->q_elevation_old_fx[ch] = 0; // Q22 move32(); hMasaIsmData->q_azimuth_old_fx[ch] = 0; // Q22 move32(); } + hMasaIsmData->masa_gain_is_edited = 0; + hMasaIsmData->idx_separated_ism = -1; + move16(); + FOR( obj_idx = 0; obj_idx < MAX_NUM_OBJECTS; obj_idx++ ) { - set16_fx( hMasaIsmData->azimuth_ism[obj_idx], 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); - set16_fx( hMasaIsmData->elevation_ism[obj_idx], 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); + set16_fx( hMasaIsmData->azimuth_ism_fx[obj_idx], 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); + set16_fx( hMasaIsmData->elevation_ism_fx[obj_idx], 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR; sf++ ) { set32_fx( hMasaIsmData->energy_ratio_ism_fx[obj_idx][sf], 0, CLDFB_NO_CHANNELS_MAX ); } } - set16_fx( hMasaIsmData->azimuth_separated_ism, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); - set16_fx( hMasaIsmData->elevation_separated_ism, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); + set16_fx( hMasaIsmData->azimuth_separated_ism_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); + set16_fx( hMasaIsmData->elevation_separated_ism_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); + + hMasaIsmData->hExtData = NULL; + move32(); + + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + MASA_ISM_EXT_DATA_HANDLE hExtData; + hExtData = (MASA_ISM_EXT_DATA_HANDLE) malloc( sizeof( MASA_ISM_EXT_DATA ) ); + move32(); + + IF( hExtData == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA ISM data\n" ) ); + } + + hExtData->prev_idx_separated_ism = 0; + move16(); + + FOR( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) + { + set32_fx( hExtData->prev_panning_gains[ch], 0, 2 ); + } + + FOR( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) + { + set32_fx( hExtData->ism_render_proto_energy_frac[ch], 0, CLDFB_NO_CHANNELS_MAX ); + set16_fx( hExtData->ism_render_proto_energy_exp[ch], 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( hExtData->ism_render_target_energy_frac[ch], 0, CLDFB_NO_CHANNELS_MAX ); + set16_fx( hExtData->ism_render_target_energy_exp[ch], 0, CLDFB_NO_CHANNELS_MAX ); + } + + set32_fx( hExtData->masa_render_proto_energy_frac, 0, CLDFB_NO_CHANNELS_MAX ); + set16_fx( hExtData->masa_render_proto_energy_exp, 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( hExtData->masa_render_target_energy_frac, 0, CLDFB_NO_CHANNELS_MAX ); + set16_fx( hExtData->masa_render_target_energy_exp, 0, CLDFB_NO_CHANNELS_MAX ); + + FOR( sf = 0; sf < add( MAX_PARAM_SPATIAL_SUBFRAMES, DELAY_MASA_PARAM_DEC_SFR ); sf++ ) + { + set32_fx( hExtData->masa_render_masa_to_total[sf], 0, CLDFB_NO_CHANNELS_MAX ); + } + + hMasaIsmData->hExtData = hExtData; + move32(); + } st_ivas->hMasaIsmData = hMasaIsmData; @@ -145,6 +459,13 @@ void ivas_omasa_data_close_fx( ( *hMasaIsmData )->delayBuffer_fx = NULL; } + IF( ( *hMasaIsmData )->hExtData != NULL ) + { + free( ( *hMasaIsmData )->hExtData ); + ( *hMasaIsmData )->hExtData = NULL; + move32(); + } + free( *hMasaIsmData ); *hMasaIsmData = NULL; @@ -159,19 +480,16 @@ void ivas_omasa_data_close_fx( *--------------------------------------------------------------------------*/ ivas_error ivas_omasa_dec_config_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - UWord16 *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ Word16 *num_src, - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS], - Word16 *data /* o : output synthesis signal Qx*/ -) + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS] ) { - Word16 k, sce_id, nSCE_old, nchan_hp20_old, numCldfbAnalyses_old, numCldfbSyntheses_old, n_MD; + Word16 k, sce_id, nSCE_old, nchan_hp20_old, numCldfbAnalyses_old, numCldfbSyntheses_old; Word32 ivas_total_brate, ism_total_brate, cpe_brate; Word32 brate_SCE, brate_CPE; ISM_MODE ism_mode_old; IVAS_FORMAT ivas_format_orig; - Word16 nchan_out_buff, nchan_out_buff_old; + Word16 nchan_out_buff; ivas_error error; RENDERER_TYPE old_renderer_type; @@ -191,10 +509,7 @@ ivas_error ivas_omasa_dec_config_fx( move16(); st_ivas->ivas_format = st_ivas->last_ivas_format; move16(); - ivas_init_dec_get_num_cldfb_instances_ivas_fx( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); - nchan_out_buff_old = ivas_get_nchan_buffers_dec_ivas_fx( st_ivas, -1, -1 ); - move16(); - + ivas_init_dec_get_num_cldfb_instances_fx( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); st_ivas->ivas_format = ivas_format_orig; move16(); @@ -227,7 +542,7 @@ ivas_error ivas_omasa_dec_config_fx( } ELSE { - IF( NE_32( ( error = ivas_masa_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_masa_dec_reconfigure_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -292,38 +607,21 @@ ivas_error ivas_omasa_dec_config_fx( IF( NE_16( ism_mode_old, st_ivas->ism_mode ) ) { /* ISM MD reconfig. */ - n_MD = 0; - move16(); - - test(); - IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + IF( st_ivas->hIsmMetaData[0] == NULL ) { - n_MD = 1; - move16(); - - IF( st_ivas->hIsmMetaData[0] == NULL ) + IF( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) { - IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, 1, NULL ) ), IVAS_ERR_OK ) ) - { - return error; - } + return error; } } - ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + ELSE { - n_MD = st_ivas->nchan_ism; - move16(); - - ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); - - IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, NULL ) ), IVAS_ERR_OK ) ) + FOR( k = 0; k < st_ivas->nchan_ism; k++ ) { - return error; + ivas_ism_reset_metadata_handle_dec_fx( st_ivas->hIsmMetaData[k] ); } } - ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); - st_ivas->hCPE[0]->element_brate = L_sub( ivas_total_brate, ism_total_brate ); /*-----------------------------------------------------------------* @@ -352,39 +650,63 @@ ivas_error ivas_omasa_dec_config_fx( } /* objects renderer reconfig. */ - IF( st_ivas->hMasaIsmData != NULL ) + test(); + IF( st_ivas->hMasaIsmData != NULL || st_ivas->hIsmRendererData != NULL ) { + /* this calls also ivas_ism_renderer_close() closing st_ivas->hIsmRendererData used by the EXT renderers. also cleans st_ivas->hMasaIsmData */ ivas_omasa_separate_object_renderer_close( st_ivas ); } + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) && st_ivas->hMasaIsmData != NULL ) /* this structure is in use only in ISM_MASA_MODE_PARAM_ONE_OBJ */ + { + MASA_ISM_DATA_HANDLE hMasaIsmData = st_ivas->hMasaIsmData; + FOR( Word16 obj_idx = 0; obj_idx < MAX_NUM_OBJECTS; obj_idx++ ) + { + set_s( hMasaIsmData->azimuth_ism_fx[obj_idx], 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); + set_s( hMasaIsmData->elevation_ism_fx[obj_idx], 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); + FOR( Word16 sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR; sf++ ) + { + set_l( hMasaIsmData->energy_ratio_ism_fx[obj_idx][sf], 0, CLDFB_NO_CHANNELS_MAX ); + } + } + set_s( hMasaIsmData->azimuth_separated_ism_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); + set_s( hMasaIsmData->elevation_separated_ism_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); + } + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) ) { IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { /* Allocate TD renderer for the objects in DISC mode */ - IF( st_ivas->hBinRendererTd == NULL ) + if ( st_ivas->hBinRendererTd == NULL ) { IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, num_src ) ), IVAS_ERR_OK ) ) { return error; } + + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) + { + return error; + } + } } /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ - IF( NE_32( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_omasa_objects_delay_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } ELSE { - /* TD renderer handle */ - test(); - IF( st_ivas->hBinRendererTd != NULL && EQ_16( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM, TRUE ) ) + if ( st_ivas->hBinRendererTd != NULL ) { + /* TD renderer handle */ ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); - - st_ivas->hHrtfTD = NULL; } /* ISM renderer handle + ISM data handle */ @@ -404,6 +726,11 @@ ivas_error ivas_omasa_dec_config_fx( IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + IF( NE_32( ( error = ivas_omasa_objects_delay_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + IF( NE_32( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) { return error; @@ -414,16 +741,62 @@ ivas_error ivas_omasa_dec_config_fx( /* ISM renderer handle + ISM data handle */ ivas_omasa_separate_object_renderer_close( st_ivas ); } + + IF( EQ_32( old_renderer_type, RENDERER_MONO_DOWNMIX ) ) + { + DECODER_TC_BUFFER_HANDLE hTcBuffer = st_ivas->hTcBuffer; + Word16 n_samples_still_available = sub( hTcBuffer->n_samples_buffered, hTcBuffer->n_samples_rendered ); + + FOR( k = 0; k < hTcBuffer->nchan_transport_internal; k++ ) + { + Scale_sig32( hTcBuffer->tc_buffer_old_fx[k], n_samples_still_available, st_ivas->hCPE[0]->q_output_mem_fx[0] - Q11 ); + } + } + } + + IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_MIX_EXT ) ) + { + /* Allocate 'hIsmRendererData' handle */ + error = ivas_omasa_combine_separate_ism_with_masa_open_fx( st_ivas ); + move32(); + IF( NE_32( error, IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) + { + DIRAC_CONFIG_FLAG common_rend_config_flag; + IF( st_ivas->hSpatParamRendCom == NULL ) + { + common_rend_config_flag = DIRAC_OPEN; + } + ELSE + { + common_rend_config_flag = DIRAC_RECONFIGURE; + } + move32(); + + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + IF( NE_32( ( error = ivas_omasa_objects_delay_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_spat_hSpatParamRendCom_config_fx( &st_ivas->hSpatParamRendCom, common_rend_config_flag, 0, st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->hDecoderConfig->output_Fs, 0, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } } /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ - IF( st_ivas->hDiracDecBin != NULL ) + IF( st_ivas->hDiracDecBin[0] != NULL ) { - IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ), IVAS_ERR_OK ) ) - + IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin[0]->hTdDecorr ), &( st_ivas->hDiracDecBin[0]->useTdDecorr ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -439,11 +812,11 @@ ivas_error ivas_omasa_dec_config_fx( } /*-----------------------------------------------------------------* - * floating-point output audio buffers + * output audio buffers *-----------------------------------------------------------------*/ - nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); - IF( NE_32( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff_old, nchan_out_buff ) ), IVAS_ERR_OK ) ) + nchan_out_buff = ivas_get_nchan_buffers_dec_fx( st_ivas, -1, -1 ); + IF( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff, st_ivas->hDecoderConfig->Opt_tsm, st_ivas->hTcBuffer ) ) != IVAS_ERR_OK ) { return error; } @@ -570,6 +943,7 @@ void ivas_set_surplus_brate_dec( * * decode ISM metadata in OMASA format *--------------------------------------------------------------------------*/ + ivas_error ivas_omasa_ism_metadata_dec_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word32 ism_total_brate, /* i : ISM total bitrate */ @@ -588,6 +962,7 @@ ivas_error ivas_omasa_ism_metadata_dec_fx( move16(); *nchan_transport_ism = st_ivas->nchan_ism; move16(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) { *nchan_ism = 1; @@ -603,6 +978,7 @@ ivas_error ivas_omasa_ism_metadata_dec_fx( move16(); } + test(); test(); IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) { @@ -637,9 +1013,9 @@ ivas_error ivas_omasa_ism_metadata_dec_fx( { meta_write_index = ( add( dirac_bs_md_write_idx, block ) ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; move16(); - st_ivas->hMasaIsmData->azimuth_ism[n][meta_write_index] = azimuth_ism; + st_ivas->hMasaIsmData->azimuth_ism_fx[n][meta_write_index] = azimuth_ism; move16(); - st_ivas->hMasaIsmData->elevation_ism[n][meta_write_index] = elevation_ism; + st_ivas->hMasaIsmData->elevation_ism_fx[n][meta_write_index] = elevation_ism; move16(); } } @@ -661,13 +1037,41 @@ ivas_error ivas_omasa_ism_metadata_dec_fx( { meta_write_index = ( add( dirac_bs_md_write_idx, block ) ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; move16(); - st_ivas->hMasaIsmData->azimuth_separated_ism[meta_write_index] = azimuth_ism; + st_ivas->hMasaIsmData->azimuth_separated_ism_fx[meta_write_index] = azimuth_ism; move16(); - st_ivas->hMasaIsmData->elevation_separated_ism[meta_write_index] = elevation_ism; + st_ivas->hMasaIsmData->elevation_separated_ism_fx[meta_write_index] = elevation_ism; move16(); } } } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) && EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + azimuth_ism = extract_l( L_shr_r( L_abs( st_ivas->hIsmMetaData[0]->azimuth_fx ), 22 ) ); + if ( st_ivas->hIsmMetaData[0]->azimuth_fx < 0 ) + { + azimuth_ism = negate( azimuth_ism ); + } + elevation_ism = extract_l( L_shr_r( L_abs( st_ivas->hIsmMetaData[0]->elevation_fx ), 22 ) ); + if ( st_ivas->hIsmMetaData[0]->elevation_fx < 0 ) + { + elevation_ism = negate( elevation_ism ); + } + + FOR( block = 0; block < 2; block++ ) + { + st_ivas->hMasaIsmData->azimuth_separated_ism_fx[block] = st_ivas->hMasaIsmData->azimuth_separated_ism_fx[add( block, 2 )]; + st_ivas->hMasaIsmData->elevation_separated_ism_fx[block] = st_ivas->hMasaIsmData->elevation_separated_ism_fx[add( block, 2 )]; + move16(); + move16(); + } + FOR( block = 2; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + st_ivas->hMasaIsmData->azimuth_separated_ism_fx[block] = azimuth_ism; + st_ivas->hMasaIsmData->elevation_separated_ism_fx[block] = elevation_ism; + move16(); + move16(); + } + } } return IVAS_ERR_OK; @@ -685,50 +1089,72 @@ void ivas_omasa_dirac_rend_jbm_fx( UWord16 *nSamplesRendered, /* o : number of samples rendered */ UWord16 *nSamplesAvailable, /* o : number of samples still to render */ const Word16 nchan_transport, /* i : number of transport channels */ - Word32 *output_f[] /* o : rendered time signal Q11*/ + Word32 *output_fx[] /* o : rendered time signal Q11*/ ) { Word16 subframes_rendered; - Word16 slots_rendered; Word16 n; Word32 data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; + *nSamplesRendered = s_min( nSamplesAsked, st_ivas->hTcBuffer->n_samples_available ); + test(); IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { - Copy32( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); + Copy32( &output_fx[CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[0], *nSamplesRendered ); + + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + /* Gain separated object, if edited */ + FOR( n = 0; n < st_ivas->nchan_ism; n++ ) + { + test(); + IF( st_ivas->hMasaIsmData->ism_gain_is_edited[n] && EQ_16( st_ivas->hMasaIsmData->idx_separated_ism, n ) ) + { + v_multc_fx_16( data_separated_objects[0], st_ivas->hMasaIsmData->gain_ism_edited_fx[n], data_separated_objects[0], *nSamplesRendered ); // Q = 8 + Scale_sig32( data_separated_objects[0], *nSamplesRendered, Q3 ); // Q = 11 + } + } + } } ELSE { FOR( n = 0; n < st_ivas->nchan_ism; n++ ) { - Copy32( output_f[n + CPE_CHANNELS], data_separated_objects[n], nSamplesAsked ); + Copy32( &output_fx[n + CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[n], *nSamplesRendered ); + + /* Gain discrete objects, if edited */ + IF( st_ivas->hMasaIsmData->ism_gain_is_edited[n] ) + { + v_multc_fx_16( data_separated_objects[n], st_ivas->hMasaIsmData->gain_ism_edited_fx[n], data_separated_objects[n], *nSamplesRendered ); // Q = 8 + Scale_sig32( data_separated_objects[n], *nSamplesRendered, Q3 ); // Q = 11 + } + } + + /* Gain MASA part, if edited in G192. MASA gaining with VOIP is done in ivas_dec_prepare_renderer() */ + IF( !st_ivas->hDecoderConfig->Opt_tsm && st_ivas->hMasaIsmData->masa_gain_is_edited ) + { + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + v_multc_fx_16( output_fx[n], st_ivas->hMasaIsmData->gain_masa_edited_fx, output_fx[n], *nSamplesRendered ); // Q = 8 + Scale_sig32( output_fx[n], *nSamplesRendered, Q3 ); // Q = 11 + } } } subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; move16(); - slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; - move16(); - ivas_dirac_dec_render_fx( st_ivas, nchan_transport, nSamplesAsked, nSamplesRendered, nSamplesAvailable, output_f ); + ivas_dirac_dec_render_fx( st_ivas, nchan_transport, nSamplesAsked, nSamplesRendered, nSamplesAvailable, output_fx ); -#ifdef MSAN_FIX FOR( Word16 ind1 = 0; ind1 < MAX_NUM_OBJECTS; ind1++ ) -#else - FOR( Word16 ind1 = 0; ind1 < MAX_CICP_CHANNELS - 1; ind1++ ) -#endif // MSAN_FIX { scale_sig32( st_ivas->hIsmRendererData->prev_gains_fx[ind1], MAX_OUTPUT_CHANNELS, -1 ); // Q30 -> Q29 } - ivas_omasa_separate_object_render_jbm_fx( st_ivas, *nSamplesRendered, data_separated_objects, output_f, subframes_rendered, slots_rendered ); + ivas_omasa_separate_object_render_jbm_fx( st_ivas, *nSamplesRendered, data_separated_objects, output_fx, subframes_rendered ); -#ifdef MSAN_FIX FOR( Word16 ind1 = 0; ind1 < MAX_NUM_OBJECTS; ind1++ ) -#else - FOR( Word16 ind1 = 0; ind1 < MAX_CICP_CHANNELS - 1; ind1++ ) -#endif // MSAN_FIX { scale_sig32( st_ivas->hIsmRendererData->prev_gains_fx[ind1], MAX_OUTPUT_CHANNELS, 1 ); // Q29 -> Q30 } @@ -736,6 +1162,7 @@ void ivas_omasa_dirac_rend_jbm_fx( return; } + /*--------------------------------------------------------------------------* * ivas_omasa_dirac_td_binaural_render() * @@ -752,54 +1179,93 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( ) { Word16 n; - Word16 gain_fx = OMASA_TDREND_MATCHING_GAIN_FX; // Q15 - move16(); ivas_error error; - Word32 *tc_local_fx[MAX_TRANSPORT_CHANNELS]; - Word32 *p_sepobj_fx[MAX_NUM_OBJECTS]; // Q11 - Word32 data_separated_objects_fx[MAX_NUM_OBJECTS][L_FRAME48k]; - move16(); + Word32 *p_sepobj_fx[BINAURAL_CHANNELS]; // Q11 + Word32 data_separated_objects_fx[BINAURAL_CHANNELS][L_FRAME48k]; + Word32 *re, *im; - FOR( n = 0; n < MAX_NUM_OBJECTS; n++ ) + FOR( n = 0; n < BINAURAL_CHANNELS; n++ ) { p_sepobj_fx[n] = &data_separated_objects_fx[n][0]; } /* Delay the object signals to match the CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ - IF( st_ivas->hSpatParamRendCom->slots_rendered == 0 ) - { - Word16 tcBufferSize; - - tcBufferSize = imult1616( st_ivas->hSpatParamRendCom->num_slots, st_ivas->hSpatParamRendCom->slot_size ); - - FOR( n = 0; n < st_ivas->nchan_ism; n++ ) - { - tc_local_fx[n] = st_ivas->hTcBuffer->tc_fx[n + 2]; // Q11 - v_multc_fixed_16( tc_local_fx[n], gain_fx, tc_local_fx[n], tcBufferSize ); - - delay_signal32_fx( tc_local_fx[n], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer_fx[n], st_ivas->hMasaIsmData->delayBuffer_size ); - } - } ivas_dirac_dec_binaural_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, nchan_transport, output_fx ); /* reset combined orientation access index before calling the td renderer */ ivas_combined_orientation_set_to_start_index( st_ivas->hCombinedOrientationData ); - IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_sepobj_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - return error; - } + Word16 slot_idx, num_cldfb_bands, nchan_transport_orig, cldfb_slots; + Word32 Cldfb_RealBuffer[CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer[CLDFB_NO_CHANNELS_MAX]; + Word32 *p_rend_obj[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; /* [8 * 2] */ + Word16 q_cldfb, q_in = 11; + move16(); - FOR( n = 0; n < BINAURAL_CHANNELS; n++ ) - { - v_add_fx( output_fx[n], p_sepobj_fx[n], output_fx[n], *nSamplesRendered ); - } + FOR( n = 0; n < i_mult( st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses, BINAURAL_CHANNELS ); n++ ) + { + p_rend_obj[n] = &output_fx[n][0]; + move32(); + } - return IVAS_ERR_OK; -} + num_cldfb_bands = st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[0]->no_channels; + move16(); + nchan_transport_orig = st_ivas->nchan_transport; + move16(); + st_ivas->nchan_transport = st_ivas->nchan_ism; + move16(); -/*--------------------------------------------------------------------------* + IF( ( error = ivas_td_binaural_renderer_sf_splitBinaural( st_ivas, p_rend_obj, *nSamplesRendered ) ) != IVAS_ERR_OK ) /* objects are read from st_ivas->hTcBuffer->tc[2..(1+n_isms)] */ + { + return error; + } + + st_ivas->nchan_transport = nchan_transport_orig; + move16(); + cldfb_slots = *nSamplesRendered / num_cldfb_bands; + + FOR( n = 0; n < i_mult( st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses, BINAURAL_CHANNELS ); ++n ) + { + q_cldfb = q_in; + Scale_sig32( st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n]->cldfb_state_fx, + sub( st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n]->p_filter_length, st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n]->no_channels ), + sub( q_cldfb, st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n]->Q_cldfb_state ) ); + st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n]->Q_cldfb_state = q_cldfb; + FOR( slot_idx = 0; slot_idx < cldfb_slots; slot_idx++ ) + { + q_cldfb = q_in; + cldfbAnalysis_ts_fx_fixed_q( &( p_rend_obj[n][num_cldfb_bands * slot_idx] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, num_cldfb_bands, st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n], &q_cldfb ); + + Scale_sig32( Cldfb_RealBuffer, num_cldfb_bands, sub( Q6, q_cldfb ) ); + Scale_sig32( Cldfb_ImagBuffer, num_cldfb_bands, sub( Q6, q_cldfb ) ); + + ivas_CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, sub( slot_idx, cldfb_slots ) ); + v_add_fx( re, Cldfb_RealBuffer, re, num_cldfb_bands ); + v_add_fx( im, Cldfb_ImagBuffer, im, num_cldfb_bands ); + } + } + } + else + { + IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_sepobj_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < BINAURAL_CHANNELS; n++ ) + { + v_add_fx( output_fx[n], p_sepobj_fx[n], output_fx[n], *nSamplesRendered ); + } + } + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* * ivas_omasa_rearrange_channels() * * in case of external rendering, rearrange the channels order @@ -826,3 +1292,881 @@ void ivas_omasa_rearrange_channels_fx( return; } + + +/*-------------------------------------------------------------------------* + * ivas_omasa_combine_separate_ism_with_masa_open_fx() + * + * Open structures, reserve memory, and init values. + *-------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_combine_separate_ism_with_masa_open_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 i; + Word16 *tmp; + + st_ivas->hIsmRendererData = (ISM_RENDERER_HANDLE) malloc( sizeof( ISM_RENDERER_DATA ) ); + move32(); + + IF( st_ivas->hIsmRendererData == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM renderer \n" ) ); + } + + FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { + set_zero_fx( st_ivas->hIsmRendererData->prev_gains_fx[i], MAX_OUTPUT_CHANNELS ); + } + + test(); + test(); + IF( EQ_32( st_ivas->hDecoderConfig->output_Fs, 16000 ) || + EQ_32( st_ivas->hDecoderConfig->output_Fs, 32000 ) || + EQ_32( st_ivas->hDecoderConfig->output_Fs, 48000 ) ) + { + IF( EQ_32( st_ivas->hDecoderConfig->output_Fs, 16000 ) ) + { + st_ivas->hIsmRendererData->interpolator_len = 80; + tmp = interpolator_table_16k_q15; + } + ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_Fs, 32000 ) ) + { + st_ivas->hIsmRendererData->interpolator_len = 160; + tmp = interpolator_table_32k_q15; + } + ELSE + { + st_ivas->hIsmRendererData->interpolator_len = 240; + tmp = interpolator_table_48k_q15; + } + move16(); + move32(); + + st_ivas->hIsmRendererData->interpolator_fx = (Word16 *) malloc( sizeof( Word16 ) * st_ivas->hIsmRendererData->interpolator_len ); + + IF( st_ivas->hIsmRendererData->interpolator_fx == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA ISM renderer interpolator\n" ) ); + } + + FOR( i = 0; i < st_ivas->hIsmRendererData->interpolator_len; i++ ) + { + st_ivas->hIsmRendererData->interpolator_fx[i] = tmp[i]; + move16(); + } + } + ELSE + { + return ( IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Unsupported output sample rate\n" ) ); + } + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_combine_separate_ism_with_masa_fx() + * + * in case of external rendering, combine separated ISM signal with MASA stream + *--------------------------------------------------------------------------*/ + +void ivas_omasa_combine_separate_ism_with_masa_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Word32 *output[], /* i/o: output synthesis signal */ + Word16 *output_q, /* i/o: output Q value */ + const Word16 nchan_ism, /* i : number of ISMs */ + const Word16 output_frame /* i : output frame length per channel */ +) +{ + Word16 n, sf, band, k; + MASA_DECODER_EXT_OUT_META_HANDLE masaMetaHandle; + MASA_DECODER_EXT_OUT_META_HANDLE ismMetaHandle; + MASA_DECODER_EXT_OUT_META ismMeta; + Word32 inRe[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 inIm[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + UWord16 directionIndex; + Word16 nchan_in; + Word16 nBins; + Word16 slot; + Word16 mrange[2], brange[2]; + Word16 processing_len, offset; + + Word32 old_panning_gains_fx[2]; + Word32 new_panning_gains_fx[2]; + + Word16 inRe_exp[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 inIm_exp[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 out_exp[MASA_MAX_TRANSPORT_CHANNELS + 1][L_FRAME48k]; + + Word16 eneMasa_exp[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word32 eneMasa_frac[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word16 eneIsm_exp[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word32 eneIsm_frac[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + Word16 old_panning_gains_q15_fx[2]; + Word16 new_panning_gains_q15_fx[2]; + + Word16 exp; + + masaMetaHandle = st_ivas->hMasa->data.extOutMeta; + ismMetaHandle = &ismMeta; + move32(); + move32(); + + /* Compute CLDFB analysis */ + nchan_in = add( st_ivas->nchan_transport, 1 ); + nBins = mult( output_frame, MULT_1_DIV_CLDFB_NO_COL_MAX_Q15 ); // Q15 + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + FOR( n = 0; n < nchan_in; n++ ) + { + Word16 in_q = *output_q; + move16(); + + cldfbAnalysis_ts_fx_var_q( &( output[n][L_mult0( nBins, slot )] ), + inRe[n][slot], + inIm[n][slot], + nBins, st_ivas->cldfbAnaDec[n], &in_q ); + + /* Assign input exponent */ + exp = sub( Q31, in_q ); + set16_fx( inRe_exp[n][slot], exp, nBins ); + set16_fx( inIm_exp[n][slot], exp, nBins ); + } + } + + /* Convert output to exponent+mantissa representation */ + exp = sub( Q31, *output_q ); + FOR( n = 0; n < add( MASA_MAX_TRANSPORT_CHANNELS, 1 ); n++ ) + { + set16_fx( out_exp[n], exp, output_frame ); + } + + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + set16_fx( eneMasa_exp[sf], 0, MASA_FREQUENCY_BANDS ); + set32_fx( eneMasa_frac[sf], 0, MASA_FREQUENCY_BANDS ); + + set16_fx( eneIsm_exp[sf], 0, MASA_FREQUENCY_BANDS ); + set32_fx( eneIsm_frac[sf], 0, MASA_FREQUENCY_BANDS ); + } + + /* Determine energies */ + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + mrange[0] = st_ivas->hMasa->config.block_grouping[sf]; + mrange[1] = st_ivas->hMasa->config.block_grouping[add( sf, 1 )]; + move16(); + move16(); + + FOR( slot = mrange[0]; slot < mrange[1]; slot++ ) + { + FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + brange[0] = st_ivas->hMasa->config.band_grouping[band]; + brange[1] = st_ivas->hMasa->config.band_grouping[add( band, 1 )]; + move16(); + move16(); + + IF( GT_16( brange[1], nBins ) ) + { + brange[1] = nBins; + move16(); + } + + Word16 len = sub( brange[1], brange[0] ); + + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + sample_energy_acc_fx( &inRe[n][slot][brange[0]], + &inRe_exp[n][slot][brange[0]], + &inIm[n][slot][brange[0]], + &inIm_exp[n][slot][brange[0]], + &eneMasa_frac[sf][band], + &eneMasa_exp[sf][band], + len ); + } + + sample_energy_acc_fx( &inRe[MASA_MAX_TRANSPORT_CHANNELS][slot][brange[0]], + &inRe_exp[MASA_MAX_TRANSPORT_CHANNELS][slot][brange[0]], + &inIm[MASA_MAX_TRANSPORT_CHANNELS][slot][brange[0]], + &inIm_exp[MASA_MAX_TRANSPORT_CHANNELS][slot][brange[0]], + &eneIsm_frac[sf][band], + &eneIsm_exp[sf][band], + len ); + } + } + } + + /* Determine MASA metadata for the object */ + ismMetaHandle->descriptiveMeta.numberOfDirections = 0u; + move16(); + + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + Word32 ele, azi; + + ele = st_ivas->hMasaIsmData->elevation_separated_ism_fx[sf]; + azi = st_ivas->hMasaIsmData->azimuth_separated_ism_fx[sf]; + + directionIndex = index_theta_phi_16_fx( &ele, &azi, st_ivas->hMasa->data.sph_grid16 ); + + FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + ismMetaHandle->directionIndex[0][sf][band] = directionIndex; + ismMetaHandle->directToTotalRatio[0][sf][band] = UINT8_MAX; + ismMetaHandle->spreadCoherence[0][sf][band] = 0; + ismMetaHandle->surroundCoherence[sf][band] = 0; + ismMetaHandle->diffuseToTotalRatio[sf][band] = 0; + move16(); + move16(); + move16(); + move16(); + move16(); + } + } + + /* Merge MASA metadatas */ + ivas_prerend_merge_masa_metadata_fx( masaMetaHandle, masaMetaHandle, + IVAS_REND_AUDIO_CONFIG_TYPE_MASA, + eneMasa_frac, eneMasa_exp, ismMetaHandle, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED, + eneIsm_frac, eneIsm_exp ); + + /* Mix the separated object audio signal to the MASA audio signals */ + ivas_get_stereo_panning_gains_fx( st_ivas->hMasaIsmData->azimuth_separated_ism_fx[0], + st_ivas->hMasaIsmData->elevation_separated_ism_fx[0], old_panning_gains_q15_fx ); + ivas_get_stereo_panning_gains_fx( st_ivas->hMasaIsmData->azimuth_separated_ism_fx[2], + st_ivas->hMasaIsmData->elevation_separated_ism_fx[2], new_panning_gains_q15_fx ); + + /* Subsequent processing in Q31 format */ + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + new_panning_gains_fx[n] = L_shl( new_panning_gains_q15_fx[n], Q16 ); + old_panning_gains_fx[n] = L_shl( old_panning_gains_q15_fx[n], Q16 ); + } + + processing_len = shr( output_frame, 1 ); + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + v_multc_acc_exp_mantissa_fx( output[MASA_MAX_TRANSPORT_CHANNELS], + out_exp[MASA_MAX_TRANSPORT_CHANNELS], + old_panning_gains_fx[n], + output[n], + out_exp[n], + processing_len ); + } + offset = processing_len; + move16(); + + processing_len = shr( output_frame, 2 ); /* divide by MAX_PARAM_SPATIAL_SUBFRAMES; */ + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + Word32 mantissa; + + /* k == 0->gain == old_panning_gains[n] */ + /* output[n][offset] += gain * output[MASA_MAX_TRANSPORT_CHANNELS][offset]; */ + mantissa = mult32_mantissa_fx( output[MASA_MAX_TRANSPORT_CHANNELS][offset], + old_panning_gains_fx[n], + out_exp[MASA_MAX_TRANSPORT_CHANNELS][offset], &exp ); + + output[n][offset] = BASOP_Util_Add_Mant32Exp( output[n][offset], out_exp[n][offset], + mantissa, exp, &out_exp[n][offset] ); + move32(); + move32(); + + FOR( k = 1; k < processing_len; k++ ) + { + Word16 index = add( k, offset ); + + Word32 g1_fx = L_shl( st_ivas->hIsmRendererData->interpolator_fx[k], Q16 ); + + /* 1.0f - g1 */ + Word32 g2_fx = L_sub( MAX_32, L_sub( g1_fx, 1 ) ); + + /* g1 *new_panning_gains[n] + g2 *old_panning_gains[n] */ + Word32 gain_k = W_extract_h( W_add( W_mult_32_32( g1_fx, new_panning_gains_fx[n] ), + W_mult_32_32( g2_fx, old_panning_gains_fx[n] ) ) ); + + /* output[n][k + offset] += gain_k * output[MASA_MAX_TRANSPORT_CHANNELS][k + offset]; */ + mantissa = mult32_mantissa_fx( output[MASA_MAX_TRANSPORT_CHANNELS][index], gain_k, + out_exp[MASA_MAX_TRANSPORT_CHANNELS][index], &exp ); + output[n][index] = BASOP_Util_Add_Mant32Exp( output[n][index], out_exp[n][index], + mantissa, exp, &out_exp[n][index] ); + move32(); + move32(); + } + } + offset = add( offset, processing_len ); + + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + v_multc_acc_exp_mantissa_fx( &output[MASA_MAX_TRANSPORT_CHANNELS][offset], + &out_exp[MASA_MAX_TRANSPORT_CHANNELS][offset], + new_panning_gains_fx[n], + &output[n][offset], + &out_exp[n][offset], + processing_len ); + } + + /* Convert output from exponent+mantissa representation to Q11 */ + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + mantissa_exp_to_qvalue( &out_exp[n][0], &output[n][0], Q20, output_frame ); + } + + /* Zero output object channels */ + FOR( n = 0; n < nchan_ism; n++ ) + { + set_zero_fx( output[add( MASA_MAX_TRANSPORT_CHANNELS, n )], output_frame ); + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_omasa_objects_delay_open() + * + * Open structures, reserve memory, and init values for dela buffers of objects. + *-------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_objects_delay_open_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 i; + Word32 size; + + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + st_ivas->hMasaIsmData->delayBuffer_nchan = 1; + move16(); + } + ELSE + { + st_ivas->hMasaIsmData->delayBuffer_nchan = st_ivas->nchan_ism; + move16(); + } + + st_ivas->hMasaIsmData->delayBuffer_size = extract_l( Mult_32_16( st_ivas->hDecoderConfig->output_Fs, + OMASA_DELAYFRAMES_PER_SEC_Q15 ) ); + + size = L_mult0( st_ivas->hMasaIsmData->delayBuffer_nchan, sizeof( Word16 * ) ); + st_ivas->hMasaIsmData->delayBuffer_fx = (Word32 **) malloc( size ); + move32(); + + IF( st_ivas->hMasaIsmData->delayBuffer_fx == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM delay buffer \n" ) ); + } + + size = L_mult0( st_ivas->hMasaIsmData->delayBuffer_size, sizeof( Word32 ) ); + FOR( i = 0; i < st_ivas->hMasaIsmData->delayBuffer_nchan; i++ ) + { + st_ivas->hMasaIsmData->delayBuffer_fx[i] = (Word32 *) malloc( size ); + move32(); + + IF( st_ivas->hMasaIsmData->delayBuffer_fx[i] == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM delay buffer \n" ) ); + } + set_zero_fx( st_ivas->hMasaIsmData->delayBuffer_fx[i], st_ivas->hMasaIsmData->delayBuffer_size ); + } + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_render_objects_from_mix() + * + * In case of external rendering, render objects from the transport signal + * mix containing MASA audio and object audio. + *--------------------------------------------------------------------------*/ + +void ivas_omasa_render_objects_from_mix_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Word32 *output[], /* o : output synthesis signal */ + const Word16 nchan_ism, /* i : number of ISMs */ + const Word16 output_frame, /* i : output frame length per channel */ + Word16 *output_q /* i/o: output Q value */ +) +{ + Word16 n, m, i; + MASA_ISM_EXT_DATA_HANDLE hExtData; + Word32 separated_object[L_FRAME48k]; + Word32 rendered_objects[MAX_NUM_OBJECTS][L_FRAME48k]; + Word16 coding_delay; + Word32 inRe[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 inIm[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 outRe[MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 outIm[MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 slot; + Word16 sf; + Word16 bin; + Word16 nchan_transport; + Word16 nBins; + + Word16 inRe_exp[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 inIm_exp[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 outRe_exp[MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 outIm_exp[MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + + Word16 transport_energy_exp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 transport_energy_frac[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + + /* Create slot to metadata map */ + slot = 0; + move16(); + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + Word16 index; + + FOR( i = 0; i < CLDFB_SLOTS_PER_SUBFRAME; i++ ) + { + st_ivas->hSpatParamRendCom->render_to_md_map[slot] = st_ivas->hSpatParamRendCom->dirac_read_idx; + move16(); + slot = add( slot, 1 ); + } + + index = add( st_ivas->hSpatParamRendCom->dirac_read_idx, 1 ); + IF( GE_16( index, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ) ) + { + index = 0; + move16(); + } + st_ivas->hSpatParamRendCom->dirac_read_idx = index; + move16(); + } + + /* Move separated object signal and object channels */ + mvl2l( output[CPE_CHANNELS], separated_object, output_frame ); + FOR( n = 0; n < nchan_ism; n++ ) + { + set_zero_fx( output[CPE_CHANNELS + n], output_frame ); + } + + /* Delay the separated object signal by the CLDFB delay */ + delay_signal32_fx( separated_object, output_frame, st_ivas->hMasaIsmData->delayBuffer_fx[0], + st_ivas->hMasaIsmData->delayBuffer_size ); + + /* Set object metadata to the ism struct */ + FOR( n = 0; n < nchan_ism; n++ ) + { + // Q0 -> Q22 + Word32 azi = L_shl( st_ivas->hMasaIsmData->azimuth_ism_fx[n][st_ivas->hSpatParamRendCom->dirac_read_idx], Q22 ); + Word32 ele = L_shl( st_ivas->hMasaIsmData->elevation_ism_fx[n][st_ivas->hSpatParamRendCom->dirac_read_idx], Q22 ); + + st_ivas->hIsmMetaData[n]->azimuth_fx = azi; + st_ivas->hIsmMetaData[n]->elevation_fx = ele; + move16(); + move16(); + } + + /* Move the separated object signal to the correct output channel */ + hExtData = st_ivas->hMasaIsmData->hExtData; + move32(); + coding_delay = mult( output_frame, MULT_17_DIV_20_Q15 ); /* Q15: 17 ms of coding and CLDFB delay */ + mvl2l( separated_object, output[add( CPE_CHANNELS, hExtData->prev_idx_separated_ism )], coding_delay ); + mvl2l( &separated_object[coding_delay], + &output[add( CPE_CHANNELS, st_ivas->hMasaIsmData->idx_separated_ism )][coding_delay], + sub( output_frame, coding_delay ) ); + + /* Compute CLDFB analysis */ + nchan_transport = st_ivas->nchan_transport; + move16(); + nBins = mult( output_frame, MULT_1_DIV_CLDFB_NO_COL_MAX_Q15 ); // Q15 + + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + FOR( n = 0; n < nchan_transport; n++ ) + { + Word16 in_q = *output_q; + move16(); + + cldfbAnalysis_ts_fx_var_q( &( output[n][L_mult0( nBins, slot )] ), + inRe[n][slot], + inIm[n][slot], + nBins, st_ivas->cldfbAnaDec[n], &in_q ); + + /* Assign input exponent */ + Word16 exp = sub( Q31, in_q ); + set16_fx( inRe_exp[n][slot], exp, nBins ); + set16_fx( inIm_exp[n][slot], exp, nBins ); + } + } + + /* Create prototype signals */ + for ( n = 0; n < nchan_ism; n++ ) + { + Word32 panning_gains_fx[2]; + Word16 new_panning_gains_fx[2]; + Word16 azimuth_fx, elevation_fx; + + // Q22 -> Q0 + azimuth_fx = extract_l( L_shr( st_ivas->hIsmMetaData[n]->azimuth_fx, Q22 ) ); + elevation_fx = extract_l( L_shr( st_ivas->hIsmMetaData[n]->elevation_fx, Q22 ) ); + ivas_get_stereo_panning_gains_fx( azimuth_fx, elevation_fx, new_panning_gains_fx ); + + Word16 interpValInc = 0; + move16(); + + // Represents (1.0f - interpVal) value + Word16 interpValDec = extract_l( L_sub( -MIN16B, MULT_1_DIV_CLDFB_NO_COL_MAX_Q15 ) ); + + FOR( slot = 0; slot < sub( CLDFB_NO_COL_MAX, 1 ); slot++ ) + { + interpValInc = add( interpValInc, MULT_1_DIV_CLDFB_NO_COL_MAX_Q15 ); + + FOR( m = 0; m < 2; m++ ) + { + Word32 prev_gain = hExtData->prev_panning_gains[n][m]; + move32(); + + Word32 new_gain = L_shl( new_panning_gains_fx[m], 16 ); // Q15 -> Q31 + + panning_gains_fx[m] = L_add( Mpy_32_16( extract_h( prev_gain ), extract_l( prev_gain ), + interpValDec ), + Mpy_32_16( extract_h( new_gain ), extract_l( new_gain ), + interpValInc ) ); + } + + interpValDec = sub( interpValDec, MULT_1_DIV_CLDFB_NO_COL_MAX_Q15 ); + + v_multc_exp_mantissa_fx( inRe[0][slot], inRe_exp[0][slot], panning_gains_fx[0], + outRe[n][slot], outRe_exp[n][slot], nBins ); + v_multc_exp_mantissa_fx( inIm[0][slot], inIm_exp[0][slot], panning_gains_fx[0], + outIm[n][slot], outIm_exp[n][slot], nBins ); + + v_multc_acc_exp_mantissa_fx( inRe[1][slot], inRe_exp[1][slot], panning_gains_fx[1], + outRe[n][slot], outRe_exp[n][slot], nBins ); + v_multc_acc_exp_mantissa_fx( inIm[1][slot], inIm_exp[1][slot], panning_gains_fx[1], + outIm[n][slot], outIm_exp[n][slot], nBins ); + } + + // Special case where (1.0f - interpVal) = 0 and interpVal = 1 + FOR( m = 0; m < 2; m++ ) + { + panning_gains_fx[m] = L_shl( new_panning_gains_fx[m], 16 ); // Q15 -> Q31 + } + + v_multc_exp_mantissa_fx( inRe[0][slot], inRe_exp[0][slot], panning_gains_fx[0], + outRe[n][slot], outRe_exp[n][slot], nBins ); + v_multc_exp_mantissa_fx( inIm[0][slot], inIm_exp[0][slot], panning_gains_fx[0], + outIm[n][slot], outIm_exp[n][slot], nBins ); + + v_multc_acc_exp_mantissa_fx( inRe[1][slot], inRe_exp[1][slot], panning_gains_fx[1], + outRe[n][slot], outRe_exp[n][slot], nBins ); + v_multc_acc_exp_mantissa_fx( inIm[1][slot], inIm_exp[1][slot], panning_gains_fx[1], + outIm[n][slot], outIm_exp[n][slot], nBins ); + + FOR( m = 0; m < 2; m++ ) + { + hExtData->prev_panning_gains[n][m] = panning_gains_fx[m]; + move32(); + } + } + + /* Determine transport energy */ + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + set_zero_fx( &transport_energy_frac[slot][0], nBins ); + set16_zero_fx( &transport_energy_exp[slot][0], nBins ); + } + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + FOR( bin = 0; bin < nBins; bin++ ) + { + Word16 exp; + + // energy = re^2 + im^2 + Word32 mantissa = sample_energy_fx( inRe[n][slot][bin], inRe_exp[n][slot][bin], + inIm[n][slot][bin], inIm_exp[n][slot][bin], &exp ); + move32(); + + // Accumulate energy + transport_energy_frac[slot][bin] = BASOP_Util_Add_Mant32Exp( transport_energy_frac[slot][bin], + transport_energy_exp[slot][bin], + mantissa, + exp, + &transport_energy_exp[slot][bin] ); + move32(); + } + } + } + + /* Determine temporally smoothed energies and determine gains using them */ + FOR( n = 0; n < nchan_ism; n++ ) + { + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + Word16 md_idx = st_ivas->hSpatParamRendCom->render_to_md_map[slot]; + move16(); + + FOR( bin = 0; bin < nBins; bin++ ) + { + Word16 exp, exp_mult, proto_e, target_e; + Word32 mantissa, proto_m, target_m; + + Word32 ism_target_energy_frac; + Word16 ism_target_energy_exp; + + Word32 ism_proto_energy_frac; + Word16 ism_proto_energy_exp; + + // r1 = transport_energy[slot][bin] * st_ivas->hMasaIsmData->energy_ratio_ism[n][md_idx][bin] + ism_target_energy_frac = mult32_mantissa_fx( transport_energy_frac[slot][bin], + st_ivas->hMasaIsmData->energy_ratio_ism_fx[n][md_idx][bin], + add( transport_energy_exp[slot][bin], 1 ), + &ism_target_energy_exp ); + move32(); + + // r2 = r1 * (1.0 - EXT_RENDER_IIR_FAC) + ism_target_energy_frac = mult32_mantissa_fx( ism_target_energy_frac, + ONEMINUX_EXT_RENDER_IIR_FAC_Q31, + ism_target_energy_exp, + &ism_target_energy_exp ); + move32(); + + // r3 = re^2 + im^2 + mantissa = sample_energy_fx( outRe[n][slot][bin], + outRe_exp[n][slot][bin], + outIm[n][slot][bin], + outIm_exp[n][slot][bin], + &exp ); + move32(); + + // r4 = r3 * (1 - EXT_RENDER_IIR_FAC) + ism_proto_energy_frac = mult32_mantissa_fx( mantissa, ONEMINUX_EXT_RENDER_IIR_FAC_Q31, + exp, &ism_proto_energy_exp ); + move32(); + + + // r5 = ism_render_proto_energy[n][bin] * EXT_RENDER_IIR_FAC + proto_m = mult32_mantissa_fx( hExtData->ism_render_proto_energy_frac[n][bin], EXT_RENDER_IIR_FAC_Q31, + hExtData->ism_render_proto_energy_exp[n][bin], &proto_e ); + move32(); + + // r6 = r5 + r4 + proto_m = BASOP_Util_Add_Mant32Exp( proto_m, proto_e, + ism_proto_energy_frac, + ism_proto_energy_exp, + &proto_e ); + move32(); + + // r7 = ism_render_target_energy[n][bin] * EXT_RENDER_IIR_FAC + target_m = mult32_mantissa_fx( hExtData->ism_render_target_energy_frac[n][bin], EXT_RENDER_IIR_FAC_Q31, + hExtData->ism_render_target_energy_exp[n][bin], &target_e ); + move32(); + + // r8 = r7 + r2 + target_m = BASOP_Util_Add_Mant32Exp( target_m, target_e, + ism_target_energy_frac, + ism_target_energy_exp, + &target_e ); + move32(); + + hExtData->ism_render_proto_energy_frac[n][bin] = proto_m; + hExtData->ism_render_proto_energy_exp[n][bin] = proto_e; + move32(); + move16(); + + hExtData->ism_render_target_energy_frac[n][bin] = target_m; + hExtData->ism_render_target_energy_exp[n][bin] = target_e; + move32(); + move16(); + + // r9 = sqrt(r8 / r6) + mantissa = get_processing_gain_fx( proto_m, proto_e, target_m, target_e, &exp ); + move32(); + + // outRe[n][slot][bin] *= r9 + exp_mult = add( exp, outRe_exp[n][slot][bin] ); + outRe[n][slot][bin] = mult32_mantissa_fx( outRe[n][slot][bin], mantissa, exp_mult, + &outRe_exp[n][slot][bin] ); + move32(); + + // outIm[n][slot][bin] *= r9 + exp_mult = add( exp, outIm_exp[n][slot][bin] ); + outIm[n][slot][bin] = mult32_mantissa_fx( outIm[n][slot][bin], mantissa, exp_mult, + &outIm_exp[n][slot][bin] ); + move32(); + } + } + } + + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + Word16 md_idx = st_ivas->hSpatParamRendCom->render_to_md_map[slot]; + move16(); + + FOR( bin = 0; bin < nBins; bin++ ) + { + Word16 exp, proto_e, target_e, transport_exp; + Word32 mantissa, proto_m, target_m, transport_mantissa; + + Word32 masa_target_energy_frac; + Word16 masa_target_energy_exp; + + // r1 = transport_energy[slot][bin] * hExtData->masa_render_masa_to_total[md_idx][bin] + masa_target_energy_frac = mult32_mantissa_fx( transport_energy_frac[slot][bin], + hExtData->masa_render_masa_to_total[md_idx][bin], + add( transport_energy_exp[slot][bin], 1 ), + &masa_target_energy_exp ); + move32(); + + // r2 = r1 * EXT_RENDER_IIR_FAC + masa_target_energy_frac = mult32_mantissa_fx( masa_target_energy_frac, + ONEMINUX_EXT_RENDER_IIR_FAC_Q31, + masa_target_energy_exp, + &masa_target_energy_exp ); + move32(); + + // r3 = masa_render_proto_energy[bin] * EXT_RENDER_IIR_FAC + proto_m = mult32_mantissa_fx( hExtData->masa_render_proto_energy_frac[bin], EXT_RENDER_IIR_FAC_Q31, + hExtData->masa_render_proto_energy_exp[bin], &proto_e ); + move32(); + + // r4 = transport_energy[slot][bin] * EXT_RENDER_IIR_FAC + transport_mantissa = mult32_mantissa_fx( transport_energy_frac[slot][bin], + ONEMINUX_EXT_RENDER_IIR_FAC_Q31, + transport_energy_exp[slot][bin], &transport_exp ); + move32(); + + // r5 = r3 + r4 + proto_m = BASOP_Util_Add_Mant32Exp( proto_m, proto_e, + transport_mantissa, + transport_exp, + &proto_e ); + move32(); + + // r6 = masa_render_target_energy[bin] * EXT_RENDER_IIR_FAC + target_m = mult32_mantissa_fx( hExtData->masa_render_target_energy_frac[bin], EXT_RENDER_IIR_FAC_Q31, + hExtData->masa_render_target_energy_exp[bin], &target_e ); + move32(); + + // r7 = r6 + r2 + target_m = BASOP_Util_Add_Mant32Exp( target_m, target_e, + masa_target_energy_frac, + masa_target_energy_exp, + &target_e ); + move32(); + + hExtData->masa_render_proto_energy_frac[bin] = proto_m; + hExtData->masa_render_proto_energy_exp[bin] = proto_e; + move16(); + move32(); + + hExtData->masa_render_target_energy_frac[bin] = target_m; + hExtData->masa_render_target_energy_exp[bin] = target_e; + move16(); + move32(); + + // r8 = sqrt(r7 / r5) + mantissa = get_processing_gain_fx( proto_m, proto_e, target_m, target_e, &exp ); + move32(); + + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + Word16 exp_mult; + + // inRe[n][slot][bin] *= r8 + exp_mult = add( exp, inRe_exp[n][slot][bin] ); + inRe[n][slot][bin] = mult32_mantissa_fx( inRe[n][slot][bin], mantissa, exp_mult, + &inRe_exp[n][slot][bin] ); + move32(); + + // inIm[n][slot][bin] *= r8 + exp_mult = add( exp, inIm_exp[n][slot][bin] ); + inIm[n][slot][bin] = mult32_mantissa_fx( inIm[n][slot][bin], mantissa, exp_mult, + &inIm_exp[n][slot][bin] ); + move32(); + } + } + } + + *output_q = Q11; + + /* Compute CLDFB synthesis */ + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + Word32 *outSlotRePr, *outSlotImPr; + Word32 index = L_mult0( nBins, slot ); + + FOR( n = 0; n < nchan_transport; n++ ) + { + outSlotRePr = &( inRe[n][slot][0] ); + outSlotImPr = &( inIm[n][slot][0] ); + move32(); + move32(); + + FOR( bin = 0; bin < nBins; bin++ ) + { + inRe_exp[n][slot][bin] = sub( inRe_exp[n][slot][bin], Q2 ); + inIm_exp[n][slot][bin] = sub( inIm_exp[n][slot][bin], Q2 ); + } + + mantissa_exp_to_qvalue( &inRe_exp[n][slot][0], &inRe[n][slot][0], Q20, nBins ); + mantissa_exp_to_qvalue( &inIm_exp[n][slot][0], &inIm[n][slot][0], Q20, nBins ); + + cldfbSynthesis_ivas_fx( &outSlotRePr, &outSlotImPr, &output[n][index], + nBins, Q2, 1, st_ivas->cldfbSynDec[n] ); + } + + FOR( n = 0; n < nchan_ism; n++ ) + { + Word32 index2 = add( n, CPE_CHANNELS ); + + outSlotRePr = &( outRe[n][slot][0] ); + outSlotImPr = &( outIm[n][slot][0] ); + move32(); + move32(); + mantissa_exp_to_qvalue( &outRe_exp[n][slot][0], &outRe[n][slot][0], Q20 + Q2, nBins ); // + Q2: add two bits headroom to prevent overflow in cldfbSynthesis_ivas_fx(). + mantissa_exp_to_qvalue( &outIm_exp[n][slot][0], &outIm[n][slot][0], Q20 + Q2, nBins ); + + cldfbSynthesis_ivas_fx( &outSlotRePr, &outSlotImPr, &rendered_objects[n][index], + nBins, 0, 1 + Q2, st_ivas->cldfbSynDec[index2] ); + } + } + + /* Combine the rendered objects with the separated objects */ + FOR( n = 0; n < nchan_ism; n++ ) + { + Word16 index = add( CPE_CHANNELS, n ); + v_add_32( output[index], rendered_objects[n], output[index], output_frame ); + } + + hExtData->prev_idx_separated_ism = st_ivas->hMasaIsmData->idx_separated_ism; + move16(); + + return; +} + +/*--------------------------------------------------------------------------* + * ivas_omasa_gain_masa_tc_fx() + * + * in case of external rendering with object editing, MASA transport channels + * need to be gained + *--------------------------------------------------------------------------*/ + +void ivas_omasa_gain_masa_tc_fx( + Word32 *output_fx[], /* i/o: output synthesis signal, Q11 */ + const Word16 gainMasa_fx, /* i : gain, Q12 */ + const Word16 nchan_transport_ism, /* i : number of ISM TCs */ + const Word16 output_frame /* i : output frame length per channel */ +) +{ + /* Edited OMASA EXT MASA transport gaining */ + FOR( Word16 ch = 0; ch < 2; ch++ ) + { + v_multc_fx_16( output_fx[nchan_transport_ism + ch], gainMasa_fx, output_fx[nchan_transport_ism + ch], output_frame ); // Q8 + Scale_sig32( output_fx[nchan_transport_ism + ch], output_frame, Q3 ); // Q8 -> Q11 + } + + return; +} diff --git a/lib_dec/ivas_osba_dec_fx.c b/lib_dec/ivas_osba_dec_fx.c index 493301743b5006932926c92de9f57c3a9f315a9a..47eed0b127a6871ed473eeb0b10815d14b562e1f 100644 --- a/lib_dec/ivas_osba_dec_fx.c +++ b/lib_dec/ivas_osba_dec_fx.c @@ -130,17 +130,19 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx( UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */ Word32 *output_fx[] /* o : rendered time signal Q11*/ -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - , - Word16 out_len /*Store the length of values in each channel*/ -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ ) { Word16 n; ivas_error error; - Word32 output_separated_objects_fx[BINAURAL_CHANNELS][L_FRAME48k]; // VE2SB: TBV + Word32 output_separated_objects_fx[BINAURAL_CHANNELS][L_FRAME48k]; Word32 *p_sepobj_fx[BINAURAL_CHANNELS]; Word16 channel_offset; + Word32 *re, *im; + + FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + set32_fx( output_separated_objects_fx[i], 0, L_FRAME48k ); + } FOR( n = 0; n < BINAURAL_CHANNELS; n++ ) { @@ -150,29 +152,74 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx( channel_offset = st_ivas->nchan_ism; move16(); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, &output_fx[channel_offset] ) ), IVAS_ERR_OK ) ) -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, &output_fx[channel_offset], out_len ) ), IVAS_ERR_OK ) ) -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ { return error; } - IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_sepobj_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) + ivas_combined_orientation_set_to_start_index( st_ivas->hCombinedOrientationData ); + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - return error; - } + Word16 slot_idx, num_cldfb_bands, nchan_transport_orig; + Word16 cldfb_slots; + Word32 Cldfb_RealBuffer[CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer[CLDFB_NO_CHANNELS_MAX]; + Word16 q_cldfb, q_in = 11; + move16(); + + num_cldfb_bands = st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[0]->no_channels; + move16(); + nchan_transport_orig = st_ivas->nchan_transport; + move16(); + st_ivas->nchan_transport = st_ivas->nchan_ism; + move16(); + IF( ( error = ivas_td_binaural_renderer_sf_splitBinaural( st_ivas, output_fx, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } + st_ivas->nchan_transport = nchan_transport_orig; + move16(); + cldfb_slots = *nSamplesRendered / num_cldfb_bands; - FOR( n = 0; n < BINAURAL_CHANNELS; n++ ) + FOR( n = 0; n < i_mult( st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses, BINAURAL_CHANNELS ); ++n ) + { + q_cldfb = q_in; + Scale_sig32( st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n]->cldfb_state_fx, + sub( st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n]->p_filter_length, st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n]->no_channels ), + sub( q_cldfb, st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n]->Q_cldfb_state ) ); + st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n]->Q_cldfb_state = q_cldfb; + FOR( slot_idx = 0; slot_idx < cldfb_slots; slot_idx++ ) + { + q_cldfb = q_in; + cldfbAnalysis_ts_fx_fixed_q( &( output_fx[n][num_cldfb_bands * slot_idx] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, num_cldfb_bands, st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n], &q_cldfb ); + + Scale_sig32( Cldfb_RealBuffer, num_cldfb_bands, sub( Q6, q_cldfb ) ); + Scale_sig32( Cldfb_ImagBuffer, num_cldfb_bands, sub( Q6, q_cldfb ) ); + + ivas_CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, sub( slot_idx, cldfb_slots ) ); + v_add_fx( re, Cldfb_RealBuffer, re, num_cldfb_bands ); + v_add_fx( im, Cldfb_ImagBuffer, im, num_cldfb_bands ); + } + } + } + else { - Word16 i; - FOR( i = 0; i < nSamplesAsked; i++ ) + IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_sepobj_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) { - output_fx[n][i] = L_add( L_shr( output_fx[channel_offset + n][i], 1 ), L_shr( p_sepobj_fx[n][i], 1 ) ); - move32(); + return error; + } + + FOR( n = 0; n < BINAURAL_CHANNELS; n++ ) + { + Word16 i; + FOR( i = 0; i < nSamplesAsked; i++ ) + { + output_fx[n][i] = L_add( output_fx[channel_offset + n][i], p_sepobj_fx[n][i] ); + move32(); + } } } + return IVAS_ERR_OK; } @@ -226,45 +273,99 @@ ivas_error ivas_osba_render_sf_fx( ) { Word16 n; - Word32 output_ism[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - Word32 *p_output_ism[MAX_OUTPUT_CHANNELS]; + Word32 output_sba[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + Word32 *p_output_sba[MAX_OUTPUT_CHANNELS]; ivas_error error; FOR( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) { - p_output_ism[n] = &output_ism[n][0]; + p_output_sba[n] = output_sba[n]; } - FOR( n = 0; n < st_ivas->nchan_ism; n++ ) - { - v_shr( p_output[n], Q11 - Q11, output_ism[n], nSamplesAsked ); // Q11 - } - -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailableNext, p_output ) ), IVAS_ERR_OK ) ) -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailableNext, p_output, 960 ) ), IVAS_ERR_OK ) ) -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + IF( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailableNext, p_output_sba ) ) != IVAS_ERR_OK ) { return error; } IF( NE_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { - ivas_ism_render_sf_fx( st_ivas, p_output_ism, *nSamplesRendered ); + ivas_ism_render_sf_fx( st_ivas, st_ivas->renderer_type, p_output, *nSamplesRendered ); } FOR( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ ) { IF( NE_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { - v_add_fixed( p_output[n], p_output_ism[n], p_output[n], *nSamplesRendered, 1 ); // takes care of downscaling by 0.5f + v_add_fx_no_hdrm( p_output[n], p_output_sba[n], p_output[n], *nSamplesRendered ); } ELSE { - scale_sig32( p_output[n], *nSamplesRendered, -1 ); + Copy32( p_output_sba[n], p_output[n], *nSamplesRendered ); } } return IVAS_ERR_OK; } + + +/*-------------------------------------------------------------------------* + * ivas_osba_stereo_add_channels() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_osba_stereo_add_channels_fx( + Word32 *tc_fx[], /* i : transport channels */ + Word32 *output_fx[], /* i/o: output channels */ + const Word32 gain_bed_fx, /* i : gain bed value */ + const Word16 nchan_out, /* i : number of output channels */ + const Word16 nchan_ism, /* i : number of ISM channels */ + const Word16 ism_mode, /* i : ISM mode */ + const UWord16 n_samples_to_render /* i : output frame length per channel */ +) +{ + Word16 n, i; + + IF( EQ_16( ism_mode, ISM_SBA_MODE_DISC ) ) + { + Word32 gain = gain_bed_fx; + move32(); + + test(); + IF( NE_32( gain, ONE_IN_Q29 ) && GT_32( gain, 0 ) ) + { + FOR( n = 0; n < nchan_out; n++ ) + { + FOR( i = 0; i < n_samples_to_render; i++ ) + { + Word32 tmp1; + tmp1 = Mpy_32_32( tc_fx[n + nchan_ism][i], gain ); // Q11 + Q29 - 31 = Q9 + tmp1 = L_shl( tmp1, 2 ); // Q9 --> Q11 + output_fx[n][i] = L_add_sat( output_fx[n][i], tmp1 ); // Q11 + } + } + } + ELSE + { + FOR( n = 0; n < nchan_out; n++ ) + { + FOR( i = 0; i < n_samples_to_render; i++ ) + { + output_fx[n][i] = L_add_sat( output_fx[n][i], tc_fx[n + nchan_ism][i] ); // Q11 + } + } + } + } + ELSE + { + FOR( n = 0; n < nchan_out; n++ ) + { + FOR( i = 0; i < n_samples_to_render; i++ ) + { + output_fx[n][i] = L_add_sat( output_fx[n][i], tc_fx[n + nchan_ism][i] ); // Q11 + } + } + } + + return; +} diff --git a/lib_dec/ivas_out_setup_conversion_fx.c b/lib_dec/ivas_out_setup_conversion_fx.c index 756eed60ef156f351e0e1cfb5721a2378293d137..339d6eb4b4642e1872c3f790ce9370cac9e52898 100644 --- a/lib_dec/ivas_out_setup_conversion_fx.c +++ b/lib_dec/ivas_out_setup_conversion_fx.c @@ -276,9 +276,6 @@ static ivas_error get_ls_conversion_matrix_fx( Word16 index; Word32 value; const LS_CONVERSION_MATRIX_FX *conversion_matrix_fx; - ivas_error error; - - error = IVAS_ERR_OK; conversion_matrix_fx = NULL; @@ -319,7 +316,7 @@ static ivas_error get_ls_conversion_matrix_fx( } } } - return error; + return IVAS_ERR_OK; } ELSE { @@ -333,7 +330,7 @@ static ivas_error get_ls_conversion_matrix_fx( hLsSetUpConversion->dmxMtx_fx[k][k] = ONE_IN_Q30; move32(); } - return error; + return IVAS_ERR_OK; } ELSE { @@ -360,13 +357,15 @@ static ivas_error get_ls_conversion_matrix_fx( move32(); } } - return error; + return IVAS_ERR_OK; } } } return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "The conversion matrix between these formats is not defined!\n" ); } + + /*------------------------------------------------------------------------- * ivas_ls_setup_conversion_open() * @@ -381,8 +380,8 @@ ivas_error ivas_ls_setup_conversion_open_fx( Word16 chIdx, inChannels, outChannels; Word16 output_frame; Word32 output_Fs; - Word16 nchan_out; Word16 paramUpmixMonoStereo; + ivas_error error; test(); test(); @@ -399,7 +398,7 @@ ivas_error ivas_ls_setup_conversion_open_fx( } output_Fs = st_ivas->hDecoderConfig->output_Fs; move32(); - nchan_out = st_ivas->hDecoderConfig->nchan_out; + outChannels = st_ivas->hDecoderConfig->nchan_out; move16(); output_frame = (Word16) ( output_Fs / FRAMES_PER_SEC ); @@ -409,10 +408,8 @@ ivas_error ivas_ls_setup_conversion_open_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); } - assert( LE_16( nchan_out, MAX_OUTPUT_CHANNELS ) ); + assert( LE_16( outChannels, MAX_OUTPUT_CHANNELS ) ); - outChannels = nchan_out; - move16(); IF( EQ_32( st_ivas->renderer_type, RENDERER_MC_PARAMMC ) ) { inChannels = add( st_ivas->hTransSetup.nchan_out_woLFE, st_ivas->hTransSetup.num_lfe ); @@ -434,7 +431,7 @@ ivas_error ivas_ls_setup_conversion_open_fx( hLsSetUpConversion->dmx_prev_exp[chIdx] = 0; move16(); } - FOR( ; chIdx < MAX_CICP_CHANNELS; chIdx++ ) + FOR( ; chIdx < MAX_LS_CHANNELS; chIdx++ ) { hLsSetUpConversion->targetEnergyPrev_fx[chIdx] = NULL; hLsSetUpConversion->dmxEnergyPrev_fx[chIdx] = NULL; @@ -471,7 +468,7 @@ ivas_error ivas_ls_setup_conversion_open_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); } - FOR( chIdx = 1; chIdx < MAX_CICP_CHANNELS; chIdx++ ) + FOR( chIdx = 1; chIdx < MAX_LS_CHANNELS; chIdx++ ) { hLsSetUpConversion->targetEnergyPrev_fx[chIdx] = NULL; hLsSetUpConversion->dmxEnergyPrev_fx[chIdx] = NULL; @@ -479,12 +476,10 @@ ivas_error ivas_ls_setup_conversion_open_fx( set32_fx( hLsSetUpConversion->targetEnergyPrev_fx[0], 0, MAX_SFB + 2 ); set32_fx( hLsSetUpConversion->dmxEnergyPrev_fx[0], 0, MAX_SFB + 2 ); -#ifdef MSAN_FIX hLsSetUpConversion->te_prev_exp[0] = 0; hLsSetUpConversion->dmx_prev_exp[0] = 0; move16(); move16(); -#endif } /* Initialize the DMX conversion matrix */ @@ -498,7 +493,7 @@ ivas_error ivas_ls_setup_conversion_open_fx( set32_fx( hLsSetUpConversion->dmxMtx_fx[chIdx], 0, outChannels ); } - FOR( ; chIdx < MAX_CICP_CHANNELS; chIdx++ ) + FOR( ; chIdx < MAX_LS_CHANNELS; chIdx++ ) { hLsSetUpConversion->dmxMtx_fx[chIdx] = NULL; } @@ -513,16 +508,25 @@ ivas_error ivas_ls_setup_conversion_open_fx( { IF( EQ_16( paramUpmixMonoStereo, TRUE ) ) { - get_ls_conversion_matrix_fx( hLsSetUpConversion, IVAS_AUDIO_CONFIG_5_1_2, st_ivas->hDecoderConfig->output_config ); + IF( ( error = get_ls_conversion_matrix_fx( hLsSetUpConversion, IVAS_AUDIO_CONFIG_5_1_2, st_ivas->hDecoderConfig->output_config ) ) != IVAS_ERR_OK ) + { + return error; + } } ELSE { - get_ls_conversion_matrix_fx( hLsSetUpConversion, st_ivas->transport_config, st_ivas->hDecoderConfig->output_config ); + IF( ( error = get_ls_conversion_matrix_fx( hLsSetUpConversion, st_ivas->transport_config, st_ivas->hDecoderConfig->output_config ) ) != IVAS_ERR_OK ) + { + return error; + } } } ELSE { - get_ls_conversion_matrix_fx( hLsSetUpConversion, st_ivas->intern_config, st_ivas->hDecoderConfig->output_config ); + IF( ( error = get_ls_conversion_matrix_fx( hLsSetUpConversion, st_ivas->intern_config, st_ivas->hDecoderConfig->output_config ) ) != IVAS_ERR_OK ) + { + return error; + } } } @@ -548,7 +552,7 @@ void ivas_ls_setup_conversion_close_fx( return; } - FOR( idx = 0; idx < MAX_CICP_CHANNELS; idx++ ) + FOR( idx = 0; idx < MAX_LS_CHANNELS; idx++ ) { IF( ( *hLsSetUpConversion )->dmxMtx_fx[idx] != NULL ) { @@ -656,17 +660,18 @@ void ivas_ls_setup_conversion_process_mdct_fx( /* Declaration of all required variables */ Word16 i, bandIdx, chInIdx, chOutIdx, cpe_idx, subFrameIdx, binIdx, idx, j; Word16 inChannels, outChannels, num_CPE; - Word16 transform_type[MAX_CICP_CHANNELS][2]; + Word16 transform_type[MAX_LS_CHANNELS][2]; Word16 frameSize; - Word32 targetEnergy[MAX_SFB + 2], dmxEnergy[MAX_SFB + 2]; + Word64 targetEnergy64[MAX_SFB + 2], dmxEnergy64[MAX_SFB + 2]; + Word16 scf1, scf2; Word32 dmxCoeff; Word32 dmxSignalReal[L_FRAME48k], dmxSignalImag[L_FRAME48k]; Word32 eqGain; - Word32 *sig[NB_DIV], *pTmp[NB_DIV], *x[MAX_CICP_CHANNELS][NB_DIV]; + Word32 *sig[NB_DIV], *pTmp[NB_DIV], *x[MAX_LS_CHANNELS][NB_DIV]; Word32 mdst[L_FRAME48k]; Word32 convertRes[L_FRAME48k]; Word16 start, stop, start_tcx5, stop_tcx5; - Word16 mct_chan_mode[MAX_CICP_CHANNELS]; + Word16 mct_chan_mode[MAX_LS_CHANNELS]; /* Declare all handles */ LSSETUP_CONVERSION_HANDLE hLsSetUpConversion; @@ -696,6 +701,11 @@ void ivas_ls_setup_conversion_process_mdct_fx( Word16 guard_1 = shr( add( find_guarded_bits_fx( tmp_sub ), 1 ), 1 ); Word16 guard_2 = find_guarded_bits_fx( L_mult0( outChannels, inChannels ) ); q_output = sub( q_output, s_max( guard_1, guard_2 ) ); + /* Increase the guard bit by 1 to avoid overflow only if q_output is positive */ + if ( q_output > 0 ) + { + q_output = sub( q_output, 1 ); + } FOR( i = 0; i < inChannels; ++i ) { @@ -738,9 +748,12 @@ void ivas_ls_setup_conversion_process_mdct_fx( /* set overall frequency resolution of (sub)frame to maximum of (sub)frame, requires conversion if both channels are not the same */ frameSize = hLsSetUpConversion->sfbOffset[hLsSetUpConversion->sfbCnt]; move16(); - - set32_fx( targetEnergy, 0, MAX_SFB + 2 ); - set32_fx( dmxEnergy, 0, MAX_SFB + 2 ); + set64_fx( targetEnergy64, 0, MAX_SFB + 2 ); + set64_fx( dmxEnergy64, 0, MAX_SFB + 2 ); + scf1 = 63; + scf2 = 63; + move16(); + move16(); FOR( chOutIdx = 0; chOutIdx < outChannels; chOutIdx++ ) { @@ -754,14 +767,13 @@ void ivas_ls_setup_conversion_process_mdct_fx( move32(); test(); - IF( - NE_16( chInIdx, LFE_CHANNEL ) && - NE_16( mct_chan_mode[chInIdx], MCT_CHAN_MODE_IGNORE ) ) + IF( NE_16( chInIdx, LFE_CHANNEL ) && NE_16( mct_chan_mode[chInIdx], MCT_CHAN_MODE_IGNORE ) ) { /* Step 1: Compute the target energy and DMX signal (possible since we have all signals in TCX20 resolution) */ IF( dmxCoeff ) { - Word32 tmpDMXSig, targetEne; + Word64 targetEne64; + Word32 tmpDMXSig; /* Convert the signal resolution to TCX20 */ /* initially, set pointers to input; if conversion occurs in (sub)frame, set to convertRes */ @@ -805,8 +817,8 @@ void ivas_ls_setup_conversion_process_mdct_fx( stop = hLsSetUpConversion->sfbOffset[bandIdx + 1]; move16(); - targetEne = 0; - move32(); + targetEne64 = 0; + move64(); /* Loop over all the bins in the band */ FOR( binIdx = start; binIdx < stop; binIdx++ ) @@ -814,15 +826,18 @@ void ivas_ls_setup_conversion_process_mdct_fx( tmpDMXSig = Mpy_32_32( L_shl_sat( dmxCoeff, 1 ), sig[0][binIdx] ); dmxSignalReal[binIdx] = L_add( dmxSignalReal[binIdx], tmpDMXSig ); move32(); - targetEne = L_add( targetEne, Mpy_32_32( tmpDMXSig, tmpDMXSig ) ); - + targetEne64 = W_mac_32_32( targetEne64, tmpDMXSig, tmpDMXSig ); tmpDMXSig = Mpy_32_32( L_shl_sat( dmxCoeff, 1 ), mdst[binIdx] ); dmxSignalImag[binIdx] = L_add( dmxSignalImag[binIdx], tmpDMXSig ); move32(); - targetEne = L_add( targetEne, Mpy_32_32( tmpDMXSig, tmpDMXSig ) ); + targetEne64 = W_mac_32_32( targetEne64, tmpDMXSig, tmpDMXSig ); + } + + targetEnergy64[bandIdx] = W_add( targetEnergy64[bandIdx], W_shr( targetEne64, 1 ) ); + if ( NE_64( targetEnergy64[bandIdx], 0 ) ) + { + scf1 = s_min( scf1, W_norm( targetEnergy64[bandIdx] ) ); } - targetEnergy[bandIdx] = L_add( targetEnergy[bandIdx], targetEne ); - move32(); } /* end of band loop */ } } @@ -830,7 +845,8 @@ void ivas_ls_setup_conversion_process_mdct_fx( FOR( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) { - Word32 tmpReal, tmpImag, DMXEne; + Word32 tmpReal, tmpImag; + Word64 DMXEne64; start = hLsSetUpConversion->sfbOffset[bandIdx]; move16(); @@ -838,41 +854,54 @@ void ivas_ls_setup_conversion_process_mdct_fx( move16(); /* Loop over all the bins in the band */ - DMXEne = 0; - move32(); + DMXEne64 = 0; + move64(); + FOR( binIdx = start; binIdx < stop; binIdx++ ) { tmpReal = dmxSignalReal[binIdx]; move32(); tmpImag = dmxSignalImag[binIdx]; move32(); + DMXEne64 = W_mac_32_32( DMXEne64, tmpReal, tmpReal ); + DMXEne64 = W_mac_32_32( DMXEne64, tmpImag, tmpImag ); + } - DMXEne = L_add( DMXEne, L_add( Mpy_32_32( tmpReal, tmpReal ), Mpy_32_32( tmpImag, tmpImag ) ) ); + dmxEnergy64[bandIdx] = W_add( dmxEnergy64[bandIdx], W_shr( DMXEne64, 1 ) ); + if ( NE_64( dmxEnergy64[bandIdx], 0 ) ) + { + scf2 = s_min( scf2, W_norm( dmxEnergy64[bandIdx] ) ); } - dmxEnergy[bandIdx] = L_add( dmxEnergy[bandIdx], DMXEne ); - move32(); } } /* end of out channel loop */ /* Step 3: Peform energy smoothing */ - Word16 te_scale = getScaleFactor32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); scale_sig32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, te_scale ); - Word16 dmx_sacle = getScaleFactor32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); - scale_sig32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, dmx_sacle ); - Word16 te_max_e = s_max( sub( 40, shl( q_output, 1 ) ), sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ); - Word16 dmx_max_e = s_max( sub( 40, shl( q_output, 1 ) ), sub( hLsSetUpConversion->dmx_prev_exp[0], dmx_sacle ) ); + Word16 dmx_scale = getScaleFactor32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); + scale_sig32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, dmx_scale ); + + Word16 targetEnergy_e = sub( add( sub( 40, shl( q_output, 1 ) ), 1 ), scf1 ); + Word16 te_max_e = s_max( targetEnergy_e, sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ); + + Word16 dmxEnergy_e = sub( add( sub( 40, shl( q_output, 1 ) ), 1 ), scf2 ); + Word16 dmx_max_e = s_max( dmxEnergy_e, sub( hLsSetUpConversion->dmx_prev_exp[0], dmx_scale ) ); FOR( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) { - targetEnergy[bandIdx] = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( targetEnergy[bandIdx], sub( te_max_e, sub( 40, shl( q_output, 1 ) ) ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], sub( te_max_e, sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ) ) ) ); + Word32 targetEnergy, dmxEnergy; + + targetEnergy = W_extract_h( W_shl( targetEnergy64[bandIdx], scf1 ) ); + targetEnergy = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( targetEnergy, sub( te_max_e, targetEnergy_e ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], sub( te_max_e, sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ) ) ) ); move32(); - dmxEnergy[bandIdx] = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( dmxEnergy[bandIdx], sub( dmx_max_e, sub( 40, shl( q_output, 1 ) ) ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx], sub( dmx_max_e, sub( hLsSetUpConversion->dmx_prev_exp[0], dmx_sacle ) ) ) ) ); + hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx] = targetEnergy; move32(); - hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx] = targetEnergy[bandIdx]; /* te_prev_exp = 40 - 2*q_output */ + + dmxEnergy = W_extract_h( W_shl( dmxEnergy64[bandIdx], scf2 ) ); + dmxEnergy = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( dmxEnergy, sub( dmx_max_e, dmxEnergy_e ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx], sub( dmx_max_e, sub( hLsSetUpConversion->dmx_prev_exp[0], dmx_scale ) ) ) ) ); move32(); - hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx] = dmxEnergy[bandIdx]; /* dmx_prev_exp = 40 - 2*q_output */ + hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx] = dmxEnergy; move32(); } @@ -894,9 +923,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( FOR( chInIdx = 0; chInIdx < inChannels; chInIdx++ ) { test(); - IF( - NE_16( chInIdx, LFE_CHANNEL ) && - NE_16( mct_chan_mode[chInIdx], MCT_CHAN_MODE_IGNORE ) ) + IF( NE_16( chInIdx, LFE_CHANNEL ) && NE_16( mct_chan_mode[chInIdx], MCT_CHAN_MODE_IGNORE ) ) { IF( EQ_16( transform_type[chInIdx][0], TCX_20 ) ) { @@ -909,7 +936,10 @@ void ivas_ls_setup_conversion_process_mdct_fx( move16(); /* Compute Eq gains */ - ivas_lssetupconversion_computeEQFactor_fx( &targetEnergy[bandIdx], hLsSetUpConversion->te_prev_exp[0], &dmxEnergy[bandIdx], hLsSetUpConversion->dmx_prev_exp[0], &eqGain ); // Q(eqGain) = 30 + ivas_lssetupconversion_computeEQFactor_fx( &hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], hLsSetUpConversion->te_prev_exp[0], + &hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx], hLsSetUpConversion->dmx_prev_exp[0], + &eqGain ); // Q(eqGain) = 30 + FOR( binIdx = start; binIdx < stop; binIdx++ ) { x[chInIdx][0][binIdx] = Mpy_32_32( L_shl( x[chInIdx][0][binIdx], 1 ), eqGain ); // Q - 1 @@ -929,7 +959,9 @@ void ivas_ls_setup_conversion_process_mdct_fx( move16(); /* Compute Eq gains */ - ivas_lssetupconversion_computeEQFactor_fx( &targetEnergy[bandIdx], hLsSetUpConversion->te_prev_exp[0], &dmxEnergy[bandIdx], hLsSetUpConversion->dmx_prev_exp[0], &eqGain ); + ivas_lssetupconversion_computeEQFactor_fx( &hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], hLsSetUpConversion->te_prev_exp[0], + &hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx], hLsSetUpConversion->dmx_prev_exp[0], + &eqGain ); FOR( subFrameIdx = 0; subFrameIdx < NB_DIV; subFrameIdx++ ) { @@ -982,12 +1014,12 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( { Word32 targetEnergy_fx[MAX_SFB + 2], dmxEnergy_fx[MAX_SFB + 2]; Word32 eqGain_fx; - Word32 *sig_fx[MAX_CICP_CHANNELS][NB_DIV], *pTmp_fx[NB_DIV]; - Word32 mdst_fx[MAX_CICP_CHANNELS][L_FRAME48k]; - Word32 convertRes_fx[MAX_CICP_CHANNELS][L_FRAME48k]; + Word32 *sig_fx[MAX_LS_CHANNELS][NB_DIV], *pTmp_fx[NB_DIV]; + Word32 mdst_fx[MAX_LS_CHANNELS][L_FRAME48k]; + Word32 convertRes_fx[MAX_LS_CHANNELS][L_FRAME48k]; Word32 cx_fx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; Word32 cx_imag_fx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - Word32 cy_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word32 cy_fx[MAX_LS_CHANNELS * MAX_LS_CHANNELS]; Word32 real_in_buffer_fx[PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND * PARAM_MC_BAND_TO_MDCT_BAND_RATIO * MAX_TRANSPORT_CHANNELS]; Word32 imag_in_buffer_fx[PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND * PARAM_MC_BAND_TO_MDCT_BAND_RATIO * MAX_TRANSPORT_CHANNELS]; Word32 real_buffer_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; @@ -1011,11 +1043,12 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( Word16 band, bandIdx, num_bands; Word16 num_CPE; - Word16 transform_type[MAX_CICP_CHANNELS][2]; + Word16 transform_type[MAX_LS_CHANNELS][2]; Word16 frameSize; Word16 start, stop, start_tcx5, stop_tcx5; - Word16 mct_chan_mode[MAX_CICP_CHANNELS]; + Word16 mct_chan_mode[MAX_LS_CHANNELS]; + Word16 all_ch_ignored; // Flag for checking if all channels are ignored /* Declare all handles */ LSSETUP_CONVERSION_HANDLE hLsSetUpConversion; @@ -1118,13 +1151,22 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( set_zero_fx( target_ch_ener_fx, MAX_OUTPUT_CHANNELS ); Word16 max_e = 0; move16(); + all_ch_ignored = 1; + move16(); FOR( idx = 0; idx < nchan_transport; idx++ ) { IF( NE_16( mct_chan_mode[idx], MCT_CHAN_MODE_IGNORE ) ) { max_e = s_max( max_e, x_e[idx][0] ); + all_ch_ignored = 0; + move16(); } } + if ( all_ch_ignored ) + { + max_e = 31; + move16(); + } FOR( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) { set_zero_fx( real_in_buffer_fx, PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND * PARAM_MC_BAND_TO_MDCT_BAND_RATIO * MAX_TRANSPORT_CHANNELS ); @@ -1152,22 +1194,32 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( } } } - Word16 shift = 1; + input_exp = max_e; move16(); - FOR( i = 0; i < num_bands * nchan_transport; ++i ) + IF( all_ch_ignored == 0 ) { - real_in_buffer_fx[i] = L_shr( real_in_buffer_fx[i], shift ); - move32(); - imag_in_buffer_fx[i] = L_shr( imag_in_buffer_fx[i], shift ); - move32(); + Word16 shift = 1; + move16(); + FOR( i = 0; i < num_bands * nchan_transport; ++i ) + { + real_in_buffer_fx[i] = L_shr( real_in_buffer_fx[i], shift ); + move32(); + imag_in_buffer_fx[i] = L_shr( imag_in_buffer_fx[i], shift ); + move32(); + } + input_exp = add( input_exp, shift ); } - input_exp = max_e; - move16(); - input_exp = add( input_exp, shift ); + cmplx_matrix_square_fx( real_in_buffer_fx, imag_in_buffer_fx, num_bands, nchan_transport, real_buffer_fx, imag_buffer_fx, input_exp, &output_exp ); v_add_32( cx_fx[bandIdx], real_buffer_fx, cx_fx[bandIdx], i_mult( nchan_transport, nchan_transport ) ); /*Q=Q_real_buffer=Q_imag_buffer=output_exp*/ v_add_32( cx_imag_fx[bandIdx], imag_buffer_fx, cx_imag_fx[bandIdx], i_mult( nchan_transport, nchan_transport ) ); /*Q=Q_real_buffer=Q_imag_buffer=output_exp*/ } + if ( all_ch_ignored ) + { + output_exp = 29; + move16(); + } + Word16 exp_in = 10, exp_out = 0; move16(); move16(); @@ -1175,10 +1227,10 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( { DMXEne_fx = 0; move16(); - set_zero_fx( cy_fx, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + set_zero_fx( cy_fx, MAX_LS_CHANNELS * MAX_LS_CHANNELS ); set_zero_fx( Nrqq_fx, MAX_OUTPUT_CHANNELS ); set_zero_fx( target_ch_ener_fx, MAX_OUTPUT_CHANNELS ); - /* Step 1.2, get target channel energies for the transported format as in ivas_param_mc_get_mono_stereo_mixing_matrices(), Nrqq calculation */ + /* Step 1.2, get target channel energies for the transported format, Nrqq calculation */ ild_q_fx = hParamMC->icld_q_fx + imult1616( bandIdx, hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); move16(); FOR( chInIdx = 0; chInIdx < nchan_transport_format; chInIdx++ ) @@ -1200,7 +1252,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( move32(); } - /* Step 1.3 get target Cy like in ivas_param_mc_get_mono_stereo_mixing_matrices() (with dmx matrix from CICPX to MONO/STEREO saved in hParamMC) */ + /* Step 1.3 get target Cy () (with dmx matrix from CICPX to MONO/STEREO saved in hParamMC) */ FOR( chOutIdx = 0; chOutIdx < nchan_out; chOutIdx++ ) { FOR( i = 0; i < nchan_transport_format; i++ ) @@ -1366,19 +1418,19 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( void ivas_lssetupconversion_process_param_mc_fx( Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ const Word16 num_timeslots, - Word32 Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals Q6*/ - Word32 Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals Q6*/ - Word16 channel_active[MAX_CICP_CHANNELS] /* i : bitmap indicating which output channels are active */ + Word32 Cldfb_RealBuffer_InOut[MAX_LS_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals Q6*/ + Word32 Cldfb_ImagBuffer_InOut[MAX_LS_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals Q6*/ + Word16 channel_active[MAX_LS_CHANNELS] /* i : bitmap indicating which output channels are active */ ) { Word16 slotIdx, chOutIdx, chInIdx, bandIdx; Word16 inChannels, outChannels; - Word32 targetEnergy[MAX_CICP_CHANNELS][CLDFB_NO_CHANNELS_MAX]; - Word32 dmxEnergy[MAX_CICP_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + Word32 targetEnergy[MAX_LS_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + Word32 dmxEnergy[MAX_LS_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 tmpDMXSig, dmxCoeff, tmpReal, tmpImag; Word32 EQ; - Word32 Cldfb_RealBuffer_tmp[MAX_CICP_CHANNELS][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_tmp[MAX_CICP_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_RealBuffer_tmp[MAX_LS_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_tmp[MAX_LS_CHANNELS][CLDFB_NO_CHANNELS_MAX]; LSSETUP_CONVERSION_HANDLE hLsSetUpConversion; Word16 i, k; diff --git a/lib_dec/ivas_output_config_fx.c b/lib_dec/ivas_output_config_fx.c index 3a0960960d9ed0eeef3bcc80374f9bdf45ca28a4..48305b524007f5a031ec98af79f2ed468cc1da06 100644 --- a/lib_dec/ivas_output_config_fx.c +++ b/lib_dec/ivas_output_config_fx.c @@ -37,6 +37,28 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" +static void ms_bin_upmix_renderer_select( + const IVAS_FORMAT ivas_format, /* i : Decoder format */ + IVAS_AUDIO_CONFIG *internal_config, /* o : Internal configuration for rendering */ + RENDERER_TYPE *renderer_type /* o : Selected renderer type */ +) +{ + + *internal_config = EQ_32( ivas_format, MONO_FORMAT ) ? IVAS_AUDIO_CONFIG_MONO : IVAS_AUDIO_CONFIG_STEREO; + + IF( EQ_32( ivas_format, MONO_FORMAT ) ) + { + *renderer_type = RENDERER_NON_DIEGETIC_DOWNMIX; + move16(); + } + ELSE + { + *renderer_type = RENDERER_DISABLE; + move16(); + } + return; +} + /*-------------------------------------------------------------------------* * ivas_renderer_select() @@ -70,7 +92,8 @@ void ivas_renderer_select( *-----------------------------------------------------------------*/ test(); - IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + test(); + IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation || st_ivas->hCombinedOrientationData ) { st_ivas->hCombinedOrientationData->shd_rot_max_order = -1; move16(); @@ -80,18 +103,22 @@ void ivas_renderer_select( test(); test(); test(); - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { test(); test(); test(); test(); test(); - IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) || EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) + { + ms_bin_upmix_renderer_select( st_ivas->ivas_format, internal_config, renderer_type ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) { - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; move16(); @@ -105,7 +132,7 @@ void ivas_renderer_select( ELSE /* ISM_MODE_DISC */ { test(); - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; move16(); @@ -125,8 +152,7 @@ void ivas_renderer_select( { *internal_config = output_config; move16(); - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; move16(); @@ -143,7 +169,9 @@ void ivas_renderer_select( move16(); test(); - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + test(); + test(); + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { *renderer_type = RENDERER_BINAURAL_FASTCONV; move16(); @@ -162,9 +190,9 @@ void ivas_renderer_select( } test(); - IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + test(); + IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation || st_ivas->hCombinedOrientationData ) { - nchan_internal = ivas_sba_get_nchan_metadata_fx( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); test(); test(); @@ -198,7 +226,7 @@ void ivas_renderer_select( *internal_config = output_config; move16(); - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; move16(); @@ -214,14 +242,14 @@ void ivas_renderer_select( *internal_config = transport_config; move16(); test(); - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { test(); test(); test(); test(); test(); - IF( ( EQ_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_5_1 ) || EQ_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_7_1 ) ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && ( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) || EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) ) + IF( ( EQ_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_5_1 ) || EQ_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_7_1 ) ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation || st_ivas->hCombinedOrientationData ) && EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) { *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; move16(); @@ -239,18 +267,9 @@ void ivas_renderer_select( move16(); } -#if 0 // def DEBUGGING /*temp disabling this as paramMC crashes with CREND*/ - IF ( st_ivas->hRenderConfig->renderer_type_override == IVAS_RENDER_TYPE_OVERRIDE_CREND ) - { - *renderer_type = RENDERER_BINAURAL_MIXER_CONV; - } - ELSE IF ( st_ivas->hRenderConfig->renderer_type_override == IVAS_RENDER_TYPE_OVERRIDE_FASTCONV ) - { - *renderer_type = RENDERER_BINAURAL_FASTCONV; - } -#endif test(); - IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + test(); + IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation || st_ivas->hCombinedOrientationData ) { /* force HOA3 domain for rotation*/ *internal_config = IVAS_AUDIO_CONFIG_HOA3; @@ -279,21 +298,47 @@ void ivas_renderer_select( * Non-binaural rendering configurations *-----------------------------------------------------------------*/ - ELSE IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) - { - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) ) - { - *renderer_type = RENDERER_NON_DIEGETIC_DOWNMIX; - move16(); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) || EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) { - test(); - IF( NE_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( output_config, IVAS_AUDIO_CONFIG_MONO ) ) + *internal_config = EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ? IVAS_AUDIO_CONFIG_MONO : IVAS_AUDIO_CONFIG_STEREO; + move16(); + + SWITCH( output_config ) { - *renderer_type = RENDERER_MC; - move16(); + case IVAS_AUDIO_CONFIG_FOA: + case IVAS_AUDIO_CONFIG_HOA2: + case IVAS_AUDIO_CONFIG_HOA3: + *renderer_type = RENDERER_SBA_LINEAR_ENC; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_5_1: + case IVAS_AUDIO_CONFIG_7_1: + case IVAS_AUDIO_CONFIG_5_1_2: + case IVAS_AUDIO_CONFIG_5_1_4: + case IVAS_AUDIO_CONFIG_7_1_4: + case IVAS_AUDIO_CONFIG_LS_CUSTOM: + *renderer_type = RENDERER_MC; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_MONO: + IF( EQ_32( *internal_config, IVAS_AUDIO_CONFIG_STEREO ) ) + { + /* stereo to mono downmix */ + *renderer_type = RENDERER_MC; + move16(); + } + BREAK; + case IVAS_AUDIO_CONFIG_STEREO: + IF( EQ_32( *internal_config, IVAS_AUDIO_CONFIG_MONO ) ) + { + /* mono to stereo upmix */ + *renderer_type = RENDERER_NON_DIEGETIC_DOWNMIX; + move16(); + } + BREAK; + default: + /* RENDERER_DISABLE already set by default */ + BREAK; } } ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) @@ -398,20 +443,17 @@ void ivas_renderer_select( test(); test(); test(); - test(); - test(); IF( EQ_32( ivas_format, SBA_FORMAT ) && ( NE_32( output_config, IVAS_AUDIO_CONFIG_5_1 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1_2 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1_4 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_7_1 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_7_1_4 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && NE_32( output_config, IVAS_AUDIO_CONFIG_MONO ) && NE_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) { test(); test(); - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_FOA ) ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { - *internal_config = output_config; - move16(); + /* 'internal_config' was already set in ivas_set_audio_config_from_sba_order() */ } - ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) ) + ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_FOA ) ) { - *internal_config = IVAS_AUDIO_CONFIG_FOA; + *internal_config = output_config; move16(); } ELSE @@ -419,7 +461,7 @@ void ivas_renderer_select( *internal_config = IVAS_AUDIO_CONFIG_HOA3; move16(); } - st_ivas->renderer_type = RENDERER_SBA_LINEAR_DEC; + *renderer_type = RENDERER_SBA_LINEAR_DEC; move16(); } ELSE IF( ( EQ_32( ivas_format, MASA_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) && EQ_16( st_ivas->nchan_transport, 1 ) ) || @@ -443,11 +485,6 @@ void ivas_renderer_select( *renderer_type = RENDERER_DISABLE; move16(); } - ELSE IF( EQ_32( ivas_format, SBA_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) ) - { - *renderer_type = RENDERER_SBA_LINEAR_DEC; - move16(); - } ELSE IF( EQ_32( ivas_format, SBA_ISM_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) ) { *renderer_type = RENDERER_OSBA_STEREO; @@ -491,16 +528,31 @@ void ivas_renderer_select( } ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { - *renderer_type = RENDERER_DISABLE; - move16(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + *renderer_type = RENDERER_OMASA_OBJECT_EXT; + move32(); + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + *renderer_type = RENDERER_OMASA_MIX_EXT; + move32(); + } + ELSE + { + *renderer_type = RENDERER_DISABLE; + move32(); + } } } ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) { *internal_config = transport_config; move16(); + + test(); test(); - IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) && NE_32( *internal_config, output_config ) ) + IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) && NE_32( *internal_config, output_config ) && NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { test(); test(); @@ -519,7 +571,9 @@ void ivas_renderer_select( { *internal_config = transport_config; move16(); - IF( NE_32( *internal_config, output_config ) ) + + test(); + IF( NE_32( *internal_config, output_config ) && NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { test(); test(); @@ -551,8 +605,11 @@ void ivas_renderer_select( } ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) { - *internal_config = output_config; - move16(); + if ( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + *internal_config = output_config; + move16(); + } /* No rendering for 1TC to Mono or Stereo and 2TC to Stereo */ test(); @@ -600,3 +657,48 @@ void ivas_renderer_select( return; } + + +/*-------------------------------------------------------------------------* + * ivas_renderer_secondary_select() + * + * Select IVAS secondary binaural renderer (used in combined formats) + *-------------------------------------------------------------------------*/ + +/*! r: secondary binaural renderer type */ +RENDERER_TYPE ivas_renderer_secondary_select_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + RENDERER_TYPE renderer_type; + AUDIO_CONFIG output_config; + + /* disabled by default */ + renderer_type = RENDERER_DISABLE; + output_config = st_ivas->hDecoderConfig->output_config; + move32(); + move32(); + + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && + ( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) + { + renderer_type = RENDERER_BINAURAL_OBJECTS_TD; + move32(); + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) && ( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) + { + renderer_type = RENDERER_BINAURAL_OBJECTS_TD; + move32(); + } + + return renderer_type; +} diff --git a/lib_dec/ivas_post_proc_fx.c b/lib_dec/ivas_post_proc_fx.c index 03fe4063ad13e3f19610201a8f66e306556a9622..f3254c4a547fa0f2d626ae87fe07da8b67067c98 100644 --- a/lib_dec/ivas_post_proc_fx.c +++ b/lib_dec/ivas_post_proc_fx.c @@ -112,6 +112,7 @@ void ivas_post_proc_fx( { Word16 numZeros = (Word16) ( NS2SA_FX2( output_Fs, N_ZERO_MDCT_NS ) ); /*Q0*/ move16(); + assert( sts[n]->hHQ_core->Q_old_out_fx32 == Q11 ); Copy32( sts[n]->hHQ_core->old_out_fx32 + numZeros, sts[n]->hTcxDec->FBTCXdelayBuf_32, delay_comp ); /*Q11*/ } @@ -243,12 +244,6 @@ void stereo_dft_dec_core_switching_fx( move16(); } -#ifndef MSAN_FIX - IF( st->p_bpf_noise_buf_32 ) - { - Scale_sig32( st->p_bpf_noise_buf_32, L_FRAME16k, sub( *q, Q11 ) ); - } -#endif test(); test(); @@ -273,9 +268,7 @@ void stereo_dft_dec_core_switching_fx( test(); IF( st->p_bpf_noise_buf_32 && NE_16( st->core, HQ_CORE ) ) { -#ifdef MSAN_FIX Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( *q, Q11 ) ); /*q*/ -#endif stereo_dft_dec_analyze_fx( hCPE, st->p_bpf_noise_buf_32, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 2, 0, q, q_DFT ); } /* st->p_bpf_noise_buf not updated FOR HQ core -> skip analysis and set input memory to zero */ @@ -294,11 +287,7 @@ void stereo_dft_dec_core_switching_fx( { Word16 mem_len = NS2SA_FX2( L_mult0( L_frameTCX, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ); /*Q0*/ move16(); -#ifdef MSAN_FIX Word32 mem_len_inv = mem_len_inv_tbl[( mem_len / 25 ) - 1]; -#else - Word32 mem_len_inv = mem_len_inv_tbl[( mem_len / 25 )]; -#endif move32(); Word16 qmem_len = norm_l( mem_len ); Word32 mem_len_fx = L_shl( mem_len, qmem_len ); @@ -441,9 +430,7 @@ void stereo_dft_dec_core_switching_fx( /* BPF */ IF( st->p_bpf_noise_buf_32 ) { -#ifdef MSAN_FIX Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( *q, Q11 ) ); /*q*/ -#endif stereo_dft_dec_analyze_fx( hCPE, st->p_bpf_noise_buf_32, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 0, 0, q, q_DFT ); } } @@ -472,9 +459,7 @@ void stereo_dft_dec_core_switching_fx( /* BPF */ IF( st->p_bpf_noise_buf_32 ) { -#ifdef MSAN_FIX Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( *q, Q11 ) ); /*q*/ -#endif stereo_dft_dec_analyze_fx( hCPE, st->p_bpf_noise_buf_32, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 0, 0, q, q_DFT ); } @@ -549,9 +534,7 @@ void stereo_dft_dec_core_switching_fx( /* BPF */ IF( st->p_bpf_noise_buf_32 ) { -#ifdef MSAN_FIX Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( *q, Q11 ) ); /*q*/ -#endif stereo_dft_dec_analyze_fx( hCPE, st->p_bpf_noise_buf_32, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 0, 0, q, q_DFT ); } @@ -606,7 +589,7 @@ void stereo_dft_dec_core_switching_fx( Word32 tmp_fade_fx[max( STEREO_DFT_ALLPASS_FADELEN_12k8, STEREO_DFT_ALLPASS_FADELEN_16k )]; Copy32( st->hHQ_core->old_out_LB_fx32 + numZeros, hCPE->hStereoDft->ap_fade_mem_fx, ap_fade_len ); /*st->hHQ_core->q_old_outLB_fx*/ - hCPE->hStereoDft->q_ap_fade_mem_fx = st->hHQ_core->q_old_outLB_fx; + hCPE->hStereoDft->q_ap_fade_mem_fx = st->hHQ_core->Q_old_out_fx32; move16(); test(); @@ -723,12 +706,6 @@ void stereo_dft_dec_core_switching_fx( } } -#ifndef MSAN_FIX - IF( st->p_bpf_noise_buf_32 ) - { - Scale_sig32( st->p_bpf_noise_buf_32, L_FRAME16k, negate( sub( *q, Q11 ) ) ); - } -#endif return; } diff --git a/lib_dec/ivas_qmetadata_dec_fx.c b/lib_dec/ivas_qmetadata_dec_fx.c index c78c51c52aae3a7351ac604da7fea2a00521c962..cc98c6ec494fba2b1fd1895bfb3e35de277421ce 100644 --- a/lib_dec/ivas_qmetadata_dec_fx.c +++ b/lib_dec/ivas_qmetadata_dec_fx.c @@ -39,13 +39,13 @@ #include "ivas_rom_dec.h" #include "wmc_auto.h" #include "prot_fx.h" - #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" + /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ + static Word16 ivas_qmetadata_entropy_decode_diffuseness( UWord16 *bitstream, Word16 *index, IVAS_QDIRECTION *q_direction, UWord16 *diffuseness_index_max_ec_frame ); static Word16 ivas_qmetadata_entropy_decode_df_ratio( UWord16 *bitstream, Word16 *index, IVAS_QDIRECTION *q_direction, Word16 *dfRatio_bits ); static Word16 ivas_qmetadata_raw_decode_dir_fx( IVAS_QDIRECTION *q_direction, UWord16 *bitstream, Word16 *index, const Word16 nbands, const Word16 start_band, const Word16 hrmasa_flag ); @@ -72,8 +72,7 @@ static Word16 read_coherence_data_fx( UWord16 *bitstream, Word16 *p_bit_pos, IVA static Word16 ivas_qmetadata_raw_decode_dir_512_fx( IVAS_QDIRECTION *q_direction, UWord16 *bitstream, Word16 *index, const Word16 nbands, const Word16 start_band, const SPHERICAL_GRID_DATA *sph_grid16 ); static Word16 read_surround_coherence( UWord16 *bitstream, Word16 *p_bit_pos, IVAS_QMETADATA *hQMetaData ); static ivas_error read_huf( Word16 *num_bits_read, const UWord16 *bitstream, UWord16 *out, const Word16 start_pos, const Word16 len, const Word16 *huff_code, const Word16 max_len ); -const Word16 inv_dfRatio_qsteps[9] = { 0, 0, ONE_IN_Q14, 0, 5461, 0, 0, 0, 2341 }; // Q14 - +const Word32 inv_dfRatio_qsteps[9] = { 0, 0, ONE_IN_Q30, 0, 357913941, 0, 0, 0, 153391689 }; // Q30 /*-----------------------------------------------------------------------* * Global function definitions @@ -223,7 +222,7 @@ Word16 ivas_qmetadata_dec_decode( IF( EQ_16( hQMetaData->twoDirBands[b], 1 ) ) { Word32 diffRatio_fx, dir1ratio_fx, dir2ratio_fx; - Word16 dfRatio_fx; + Word32 dfRatio_fx; Word16 dfRatio_qsteps; diffRatio_fx = diffuseness_reconstructions_fx[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; // Q30 @@ -233,17 +232,25 @@ Word16 ivas_qmetadata_dec_decode( /* already encoded as total and ratios in HO-DirAC */ IF( hodirac_flag ) { - - dfRatio_fx = usdequant_fx( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0 /* Q15 */, inv_dfRatio_qsteps[dfRatio_qsteps] ); // Q15 + dfRatio_fx = usdequant32_fx( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0 /* Q15 */, inv_dfRatio_qsteps[dfRatio_qsteps] ); // Q31 dir1ratio_fx = L_sub( ONE_IN_Q30, diffRatio_fx ); - dir2ratio_fx = L_shl( (Word32) dfRatio_fx, Q15 ); /*Q30*/ + dir2ratio_fx = L_shr( dfRatio_fx, 1 ); /*Q30*/ } ELSE { - dfRatio_fx = usdequant_fx( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], shr( MAX_16, 1 ), shr( inv_dfRatio_qsteps[dfRatio_qsteps], 1 ) ); // Q15 + IF( EQ_16( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], sub( dfRatio_qsteps, 1 ) ) ) + { + dfRatio_fx = MAX_32; // Q31 + move16(); + dir1ratio_fx = L_sub( ONE_IN_Q30, diffRatio_fx ); // Q30 + } + ELSE + { + dfRatio_fx = usdequant32_fx( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], L_shr( MAX_32, 1 ), L_shr( inv_dfRatio_qsteps[dfRatio_qsteps], 1 ) ); // Q31 + dir1ratio_fx = Mpy_32_32( L_sub( ONE_IN_Q30, diffRatio_fx ), dfRatio_fx ); // Q30 + } - dir1ratio_fx = Mpy_32_16_1( L_sub( ONE_IN_Q30, diffRatio_fx ), dfRatio_fx ); // Q30 - dir2ratio_fx = L_sub( L_sub( ONE_IN_Q30, diffRatio_fx ), dir1ratio_fx ); // Q30 + dir2ratio_fx = L_sub( L_sub( ONE_IN_Q30, diffRatio_fx ), dir1ratio_fx ); // Q30 } /* Requantize the 1 - dirRatio separately for each direction to obtain inverted dirRatio index. These are used in further decoding. */ @@ -1113,7 +1120,6 @@ Word16 ivas_qmetadata_dec_decode_hr_384_512( } } -#ifdef MSAN_FIX FOR( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) { FOR( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) @@ -1122,19 +1128,8 @@ Word16 ivas_qmetadata_dec_decode_hr_384_512( move32(); } } -#else - FOR( b = 0; b < MASA_MAXIMUM_CODING_SUBBANDS; b++ ) - { - FOR( m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES; m++ ) - { - hQMetaData->q_direction[0].band_data[b].energy_ratio_fx[m] = W_round64_L( W_nrg_ratio[0][b][m] ); - move32(); - } - } -#endif // MSAN_FIX IF( EQ_32( hQMetaData->no_directions, 2 ) ) { -#ifdef MSAN_FIX FOR( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) { FOR( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) @@ -1143,16 +1138,6 @@ Word16 ivas_qmetadata_dec_decode_hr_384_512( move32(); } } -#else - FOR( b = 0; b < MASA_MAXIMUM_CODING_SUBBANDS; b++ ) - { - FOR( m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES; m++ ) - { - hQMetaData->q_direction[1].band_data[b].energy_ratio_fx[m] = W_round64_L( W_nrg_ratio[1][b][m] ); - move32(); - } - } -#endif // MSAN_FIX } /* Store status information for renderer use */ hQMetaData->ec_flag = 0; @@ -1200,11 +1185,13 @@ Word16 ivas_qmetadata_dec_sid_decode( Word32 direction_vector_fx[3]; Word16 metadata_sid_bits; /* bits allocated to SID for metadata */ Word16 bits_delta, bits_dir; + Word16 sba_spar_bitlen; IF( EQ_16( ivas_format, SBA_FORMAT ) ) { - metadata_sid_bits = (Word16) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 2 - SID_FORMAT_NBITS; /* -1 for inactive mode header bit*/ - move16(); + sba_spar_bitlen = ivas_sba_spar_sid_bitlen_fx( nchan_transport ); + metadata_sid_bits = (Word16) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - SBA_ORDER_BITS - SBA_PLANAR_BITS - 1; /* -1 for inactive mode header bit*/ + metadata_sid_bits = sub( metadata_sid_bits, sba_spar_bitlen ); } ELSE { @@ -4646,15 +4633,13 @@ static void read_stream_dct_coeffs_omasa_fx( Word16 *index, /*Q0*/ const Word16 first_line /*Q0*/ ) { - Word16 sign, nbits; + Word16 sign; Word16 i, j, i_min; - Word32 step; Word16 GR1, GR2; step = STEP_M2T_FX; move32(); - nbits = 0; move16(); sign = 1; move16(); @@ -4668,7 +4653,6 @@ static void read_stream_dct_coeffs_omasa_fx( sign = -1; move16(); } - nbits = add( nbits, 1 ); } set16_fx( q_idx, 0, len_stream ); @@ -4694,7 +4678,7 @@ static void read_stream_dct_coeffs_omasa_fx( { i_min = extract_l( L_add( shl( i_min, 1 ), bit_stream[( *index )--] ) ); /*Q0*/ } - nbits = add( nbits, j ); + /* read GR orders */ GR1 = extract_l( L_add( bit_stream[( *index )--], 1 ) ); /*Q0*/ IF( EQ_16( GR1, 2 ) ) diff --git a/lib_dec/ivas_qspherical_dec_fx.c b/lib_dec/ivas_qspherical_dec_fx.c index f6ac39a99f081d7fc2a3d63802bb9983abe5bc7c..f443cc81de370ba99f5e6d3f4d018a40ff96322a 100644 --- a/lib_dec/ivas_qspherical_dec_fx.c +++ b/lib_dec/ivas_qspherical_dec_fx.c @@ -37,7 +37,6 @@ #include "ivas_stat_dec.h" #include "wmc_auto.h" #include "prot_fx.h" -#include "ivas_rom_com_fx.h" #include "ivas_prot_fx.h" diff --git a/lib_dec/ivas_rom_dec.h b/lib_dec/ivas_rom_dec.h index 84c1a94a07d72577dc9dcafdef45974da14bc540..0b29588b2207de3cbb2cb1d3d2f7dd9839a940f6 100644 --- a/lib_dec/ivas_rom_dec.h +++ b/lib_dec/ivas_rom_dec.h @@ -64,7 +64,6 @@ extern const Word16 dft_win_8k_fx[70]; extern const Word16 cna_init_bands[CNA_INIT_NBANDS + 1]; - extern const Word16 min_smooth_gains1_fx[SBA_DIRAC_STEREO_NUM_BANDS]; extern const Word16 max_smooth_gains1_fx[SBA_DIRAC_STEREO_NUM_BANDS]; extern const Word16 min_smooth_gains2_fx[SBA_DIRAC_STEREO_NUM_BANDS]; @@ -90,10 +89,6 @@ extern const UWord16 *const sym_freq_ECSQ_tab_abs_lsbs[1 + 4]; extern const Word16 dirac_dithering_azi_scale_fx[DIRAC_DIFFUSE_LEVELS]; extern const Word16 dirac_dithering_ele_scale_fx[DIRAC_DIFFUSE_LEVELS]; -/*----------------------------------------------------------------------------------* - * FASTCONV and PARAMETRIC binaural renderer ROM tables - *----------------------------------------------------------------------------------*/ -extern const Word32 dmxmtx_table_fx[BINAURAL_CHANNELS][11]; /*----------------------------------------------------------------------* * MC ParamUpmix ROM tables diff --git a/lib_dec/ivas_rom_dec.c b/lib_dec/ivas_rom_dec_fx.c similarity index 66% rename from lib_dec/ivas_rom_dec.c rename to lib_dec/ivas_rom_dec_fx.c index 6f75230c9510b987af703f417b2b20e655e107f7..016335004b15655502a26eb2dca58deba1031052 100644 --- a/lib_dec/ivas_rom_dec.c +++ b/lib_dec/ivas_rom_dec_fx.c @@ -85,10 +85,10 @@ const Word16 dft_alpha_s2_b2_fx[STEREO_DFT_BAND_MAX] = }; const Word32 dft_bpf_weights_fx[] = { - 1073784832, 1068033792, 1050938752, 1022962432, 984855360, 937628928, 882514816, 820918592, 754369152, - 684457792, 612788736, 540921088, 470318240, 402303136, 338025728, 278428768, 224238096, 175948704, 133830104, - 97937064, 68129992, 44097504, 25391846, 11456825, 1667521, 4637491, 8128225, 9447854, 9195525, 7903813, - 6026913, 3934190, 1908039, 148176, 1226213, 2159294, 2654289, 2754147, 2529735, 2071248 + 1073784832, 1068033792, 1050938752, 1022962432, 984855360, 937628928, 882514816, 820918592, 754369152, + 684457792, 612788736, 540921088, 470318240, 402303136, 338025728, 278428768, 224238096, 175948704, 133830104, + 97937064, 68129992, 44097504, 25391846, 11456825, 1667521, 4637491, 8128225, 9447854, 9195525, 7903813, + 6026913, 3934190, 1908039, 148176, 1226213, 2159294, 2654289, 2754147, 2529735, 2071248 }; const Word32 dft_ap_gains_fx[5][3] = @@ -119,76 +119,76 @@ const Word16 dft_res_pred_weights_fx[][STEREO_DFT_BAND_MAX] = const Word16 dft_win232ms_8k_fx[75] = { - 343, 1029, 1714, 2399, 3083, 3766, 4447, 5126, 5802, 6476, 7148, 7816, 8480, 9141, 9798, 10451, 11099, 11742, 12381, 13013, 13640, 14261, 14876, 15484, 16085, 16680, 17267, - 17846, 18418, 18981, 19537, 20083, 20621, 21150, 21669, 22179, 22680, 23170, 23650, 24120, 24579, 25028, 25465, 25891, 26306, 26710, 27101, 27481, 27849, 28204, 28547, 28878, - 29196, 29501, 29793, 30072, 30338, 30591, 30830, 31056, 31268, 31466, 31651, 31822, 31978, 32121, 32250, 32364, 32464, 32550, 32622, 32680, 32723, 32751, 32766 + 343, 1029, 1714, 2399, 3083, 3766, 4447, 5126, 5802, 6476, 7148, 7816, 8480, 9141, 9798, 10451, 11099, 11742, 12381, 13013, 13640, 14261, 14876, 15484, 16085, 16680, 17267, + 17846, 18418, 18981, 19537, 20083, 20621, 21150, 21669, 22179, 22680, 23170, 23650, 24120, 24579, 25028, 25465, 25891, 26306, 26710, 27101, 27481, 27849, 28204, 28547, 28878, + 29196, 29501, 29793, 30072, 30338, 30591, 30830, 31056, 31268, 31466, 31651, 31822, 31978, 32121, 32250, 32364, 32464, 32550, 32622, 32680, 32723, 32751, 32766 }; const Word16 dft_win232ms_12k8_fx[120] = { - 214, 643, 1072, 1500, 1929, 2357, 2784, 3211, 3638, 4064, 4489, 4914, 5337, 5760, 6182, 6602, 7022, 7440, 7857, 8273, 8687, 9100, 9512, 9921, 10329, 10735, 11140, - 11542, 11942, 12341, 12737, 13131, 13523, 13913, 14300, 14684, 15067, 15446, 15823, 16197, 16569, 16938, 17303, 17666, 18026, 18382, 18736, 19086, 19433, 19777, - 20117, 20454, 20787, 21117, 21443, 21766, 22084, 22399, 22711, 23018, 23321, 23620, 23916, 24207, 24494, 24777, 25055, 25330, 25599, 25865, 26126, 26383, 26635, - 26882, 27125, 27364, 27597, 27826, 28050, 28270, 28484, 28694, 28898, 29098, 29293, 29482, 29667, 29847, 30021, 30190, 30355, 30514, 30667, 30816, 30959, 31097, - 31229, 31357, 31478, 31595, 31706, 31811, 31912, 32006, 32095, 32179, 32257, 32330, 32397, 32458, 32514, 32565, 32610, 32649, 32683, 32711, 32733, 32750, 32761, 32767 + 214, 643, 1072, 1500, 1929, 2357, 2784, 3211, 3638, 4064, 4489, 4914, 5337, 5760, 6182, 6602, 7022, 7440, 7857, 8273, 8687, 9100, 9512, 9921, 10329, 10735, 11140, + 11542, 11942, 12341, 12737, 13131, 13523, 13913, 14300, 14684, 15067, 15446, 15823, 16197, 16569, 16938, 17303, 17666, 18026, 18382, 18736, 19086, 19433, 19777, + 20117, 20454, 20787, 21117, 21443, 21766, 22084, 22399, 22711, 23018, 23321, 23620, 23916, 24207, 24494, 24777, 25055, 25330, 25599, 25865, 26126, 26383, 26635, + 26882, 27125, 27364, 27597, 27826, 28050, 28270, 28484, 28694, 28898, 29098, 29293, 29482, 29667, 29847, 30021, 30190, 30355, 30514, 30667, 30816, 30959, 31097, + 31229, 31357, 31478, 31595, 31706, 31811, 31912, 32006, 32095, 32179, 32257, 32330, 32397, 32458, 32514, 32565, 32610, 32649, 32683, 32711, 32733, 32750, 32761, 32767 }; const Word16 dft_win232ms_16k_fx[150] = { - 171, 514, 857, 1200, 1543, 1886, 2228, 2570, 2912, 3254, 3595, 3936, 4277, 4617, 4956, 5295, 5633, 5971, 6308, 6644, 6980, 7315, 7649, 7982, 8315, 8646, 8977, 9306, - 9635, 9962, 10288, 10614, 10938, 11261, 11582, 11903, 12222, 12539, 12856, 13171, 13484, 13796, 14106, 14415, 14723, 15029, 15333, 15635, 15936, 16235, 16532, 16827, - 17121, 17412, 17702, 17990, 18276, 18559, 18841, 19121, 19399, 19674, 19947, 20219, 20487, 20754, 21019, 21281, 21540, 21798, 22053, 22305, 22556, 22803, 23048, 23291, - 23531, 23769, 24003, 24236, 24465, 24692, 24916, 25138, 25357, 25573, 25786, 25996, 26204, 26408, 26610, 26809, 27004, 27197, 27387, 27574, 27758, 27939, 28117, 28291, - 28463, 28631, 28797, 28959, 29118, 29273, 29426, 29575, 29722, 29864, 30004, 30140, 30273, 30403, 30529, 30652, 30772, 30888, 31001, 31110, 31216, 31319, 31418, 31514, - 31606, 31695, 31780, 31862, 31940, 32015, 32087, 32155, 32219, 32280, 32337, 32390, 32441, 32487, 32530, 32570, 32605, 32638, 32666, 32692, 32713, 32731, 32745, 32756, - 32763, 32767 + 171, 514, 857, 1200, 1543, 1886, 2228, 2570, 2912, 3254, 3595, 3936, 4277, 4617, 4956, 5295, 5633, 5971, 6308, 6644, 6980, 7315, 7649, 7982, 8315, 8646, 8977, 9306, + 9635, 9962, 10288, 10614, 10938, 11261, 11582, 11903, 12222, 12539, 12856, 13171, 13484, 13796, 14106, 14415, 14723, 15029, 15333, 15635, 15936, 16235, 16532, 16827, + 17121, 17412, 17702, 17990, 18276, 18559, 18841, 19121, 19399, 19674, 19947, 20219, 20487, 20754, 21019, 21281, 21540, 21798, 22053, 22305, 22556, 22803, 23048, 23291, + 23531, 23769, 24003, 24236, 24465, 24692, 24916, 25138, 25357, 25573, 25786, 25996, 26204, 26408, 26610, 26809, 27004, 27197, 27387, 27574, 27758, 27939, 28117, 28291, + 28463, 28631, 28797, 28959, 29118, 29273, 29426, 29575, 29722, 29864, 30004, 30140, 30273, 30403, 30529, 30652, 30772, 30888, 31001, 31110, 31216, 31319, 31418, 31514, + 31606, 31695, 31780, 31862, 31940, 32015, 32087, 32155, 32219, 32280, 32337, 32390, 32441, 32487, 32530, 32570, 32605, 32638, 32666, 32692, 32713, 32731, 32745, 32756, + 32763, 32767 }; const Word16 dft_win232ms_32k_fx[300] = { - 85, 257, 428, 600, 772, 943, 1115, 1286, 1457, 1629, 1800, 1971, 2143, 2314, 2485, 2656, 2827, 2998, 3169, 3339, 3510, 3681, 3851, 4021, 4192, 4362, 4532, 4701, 4871, - 5041, 5210, 5380, 5549, 5718, 5887, 6055, 6224, 6392, 6560, 6728, 6896, 7064, 7231, 7399, 7566, 7732, 7899, 8065, 8232, 8398, 8563, 8729, 8894, 9059, 9224, 9388, 9553, - 9717, 9880, 10044, 10207, 10370, 10532, 10695, 10857, 11019, 11180, 11341, 11502, 11662, 11823, 11982, 12142, 12301, 12460, 12618, 12777, 12934, 13092, 13249, 13406, - 13562, 13718, 13874, 14029, 14184, 14338, 14492, 14646, 14799, 14952, 15105, 15257, 15408, 15560, 15710, 15861, 16011, 16160, 16309, 16458, 16606, 16754, 16901, 17048, - 17194, 17340, 17485, 17630, 17774, 17918, 18062, 18204, 18347, 18489, 18630, 18771, 18911, 19051, 19191, 19329, 19468, 19605, 19743, 19879, 20015, 20151, 20286, 20420, - 20554, 20688, 20820, 20953, 21084, 21215, 21346, 21476, 21605, 21734, 21862, 21989, 22116, 22242, 22368, 22493, 22618, 22741, 22865, 22987, 23109, 23231, 23351, 23471, - 23591, 23709, 23828, 23945, 24062, 24178, 24293, 24408, 24522, 24636, 24749, 24861, 24972, 25083, 25193, 25302, 25411, 25519, 25626, 25733, 25839, 25944, 26048, 26152, - 26255, 26357, 26459, 26560, 26660, 26759, 26858, 26956, 27053, 27149, 27245, 27340, 27434, 27528, 27620, 27712, 27803, 27894, 27984, 28072, 28161, 28248, 28334, 28420, - 28505, 28589, 28673, 28756, 28837, 28918, 28999, 29078, 29157, 29235, 29312, 29388, 29464, 29538, 29612, 29685, 29758, 29829, 29900, 29969, 30038, 30106, 30174, 30240, - 30306, 30371, 30435, 30498, 30560, 30622, 30682, 30742, 30801, 30859, 30917, 30973, 31029, 31083, 31137, 31190, 31242, 31294, 31344, 31394, 31442, 31490, 31537, 31583, - 31629, 31673, 31717, 31759, 31801, 31842, 31882, 31921, 31960, 31997, 32033, 32069, 32104, 32138, 32171, 32203, 32234, 32265, 32294, 32323, 32351, 32377, 32403, 32428, - 32453, 32476, 32498, 32520, 32540, 32560, 32579, 32597, 32614, 32630, 32645, 32660, 32673, 32686, 32697, 32708, 32718, 32727, 32735, 32742, 32749, 32754, 32758, 32762, - 32765, 32766, 32767 + 85, 257, 428, 600, 772, 943, 1115, 1286, 1457, 1629, 1800, 1971, 2143, 2314, 2485, 2656, 2827, 2998, 3169, 3339, 3510, 3681, 3851, 4021, 4192, 4362, 4532, 4701, 4871, + 5041, 5210, 5380, 5549, 5718, 5887, 6055, 6224, 6392, 6560, 6728, 6896, 7064, 7231, 7399, 7566, 7732, 7899, 8065, 8232, 8398, 8563, 8729, 8894, 9059, 9224, 9388, 9553, + 9717, 9880, 10044, 10207, 10370, 10532, 10695, 10857, 11019, 11180, 11341, 11502, 11662, 11823, 11982, 12142, 12301, 12460, 12618, 12777, 12934, 13092, 13249, 13406, + 13562, 13718, 13874, 14029, 14184, 14338, 14492, 14646, 14799, 14952, 15105, 15257, 15408, 15560, 15710, 15861, 16011, 16160, 16309, 16458, 16606, 16754, 16901, 17048, + 17194, 17340, 17485, 17630, 17774, 17918, 18062, 18204, 18347, 18489, 18630, 18771, 18911, 19051, 19191, 19329, 19468, 19605, 19743, 19879, 20015, 20151, 20286, 20420, + 20554, 20688, 20820, 20953, 21084, 21215, 21346, 21476, 21605, 21734, 21862, 21989, 22116, 22242, 22368, 22493, 22618, 22741, 22865, 22987, 23109, 23231, 23351, 23471, + 23591, 23709, 23828, 23945, 24062, 24178, 24293, 24408, 24522, 24636, 24749, 24861, 24972, 25083, 25193, 25302, 25411, 25519, 25626, 25733, 25839, 25944, 26048, 26152, + 26255, 26357, 26459, 26560, 26660, 26759, 26858, 26956, 27053, 27149, 27245, 27340, 27434, 27528, 27620, 27712, 27803, 27894, 27984, 28072, 28161, 28248, 28334, 28420, + 28505, 28589, 28673, 28756, 28837, 28918, 28999, 29078, 29157, 29235, 29312, 29388, 29464, 29538, 29612, 29685, 29758, 29829, 29900, 29969, 30038, 30106, 30174, 30240, + 30306, 30371, 30435, 30498, 30560, 30622, 30682, 30742, 30801, 30859, 30917, 30973, 31029, 31083, 31137, 31190, 31242, 31294, 31344, 31394, 31442, 31490, 31537, 31583, + 31629, 31673, 31717, 31759, 31801, 31842, 31882, 31921, 31960, 31997, 32033, 32069, 32104, 32138, 32171, 32203, 32234, 32265, 32294, 32323, 32351, 32377, 32403, 32428, + 32453, 32476, 32498, 32520, 32540, 32560, 32579, 32597, 32614, 32630, 32645, 32660, 32673, 32686, 32697, 32708, 32718, 32727, 32735, 32742, 32749, 32754, 32758, 32762, + 32765, 32766, 32767 }; const Word16 dft_win232ms_48k_fx[450] = { - 57, 171, 285, 400, 514, 629, 743, 857, 972, 1086, 1200, 1315, 1429, 1543, 1657, 1772, 1886, 2000, 2114, 2228, 2342, 2456, 2570, 2684, 2798, 2912, 3026, 3140, 3254, 3368, - 3482, 3595, 3709, 3823, 3936, 4050, 4163, 4277, 4390, 4503, 4617, 4730, 4843, 4956, 5069, 5182, 5295, 5408, 5521, 5633, 5746, 5858, 5971, 6083, 6196, 6308, 6420, 6532, - 6644, 6756, 6868, 6980, 7092, 7203, 7315, 7426, 7538, 7649, 7760, 7871, 7982, 8093, 8204, 8315, 8425, 8536, 8646, 8756, 8867, 8977, 9087, 9196, 9306, 9416, 9525, 9635, - 9744, 9853, 9962, 10071, 10180, 10288, 10397, 10505, 10614, 10722, 10830, 10938, 11045, 11153, 11261, 11368, 11475, 11582, 11689, 11796, 11903, 12009, 12115, 12222, 12328, - 12434, 12539, 12645, 12750, 12856, 12961, 13066, 13171, 13275, 13380, 13484, 13588, 13692, 13796, 13900, 14003, 14106, 14210, 14313, 14415, 14518, 14621, 14723, 14825, - 14927, 15029, 15130, 15231, 15333, 15434, 15534, 15635, 15735, 15836, 15936, 16036, 16135, 16235, 16334, 16433, 16532, 16631, 16729, 16827, 16925, 17023, 17121, 17218, - 17315, 17412, 17509, 17606, 17702, 17798, 17894, 17990, 18085, 18181, 18276, 18371, 18465, 18559, 18654, 18748, 18841, 18935, 19028, 19121, 19214, 19306, 19399, 19491, - 19582, 19674, 19765, 19857, 19947, 20038, 20128, 20219, 20308, 20398, 20487, 20577, 20665, 20754, 20843, 20931, 21019, 21106, 21194, 21281, 21367, 21454, 21540, 21626, - 21712, 21798, 21883, 21968, 22053, 22137, 22221, 22305, 22389, 22472, 22556, 22638, 22721, 22803, 22885, 22967, 23048, 23130, 23210, 23291, 23371, 23451, 23531, 23611, - 23690, 23769, 23847, 23925, 24003, 24081, 24159, 24236, 24313, 24389, 24465, 24541, 24617, 24692, 24767, 24842, 24916, 24991, 25064, 25138, 25211, 25284, 25357, 25429, - 25501, 25573, 25644, 25715, 25786, 25856, 25926, 25996, 26066, 26135, 26204, 26272, 26340, 26408, 26476, 26543, 26610, 26676, 26743, 26809, 26874, 26940, 27004, 27069, - 27133, 27197, 27261, 27324, 27387, 27450, 27512, 27574, 27636, 27697, 27758, 27819, 27879, 27939, 27998, 28058, 28117, 28175, 28233, 28291, 28349, 28406, 28463, 28519, - 28575, 28631, 28687, 28742, 28797, 28851, 28905, 28959, 29012, 29065, 29118, 29170, 29222, 29273, 29325, 29376, 29426, 29476, 29526, 29575, 29624, 29673, 29722, 29769, - 29817, 29864, 29911, 29958, 30004, 30050, 30095, 30140, 30185, 30229, 30273, 30317, 30360, 30403, 30445, 30487, 30529, 30571, 30612, 30652, 30692, 30732, 30772, 30811, - 30850, 30888, 30926, 30964, 31001, 31038, 31074, 31110, 31146, 31181, 31216, 31251, 31285, 31319, 31352, 31385, 31418, 31450, 31482, 31514, 31545, 31576, 31606, 31636, - 31666, 31695, 31724, 31752, 31780, 31808, 31835, 31862, 31889, 31915, 31940, 31966, 31991, 32015, 32040, 32063, 32087, 32110, 32132, 32155, 32176, 32198, 32219, 32239, - 32260, 32280, 32299, 32318, 32337, 32355, 32373, 32390, 32408, 32424, 32441, 32457, 32472, 32487, 32502, 32516, 32530, 32544, 32557, 32570, 32582, 32594, 32605, 32617, - 32627, 32638, 32648, 32657, 32666, 32675, 32684, 32692, 32699, 32706, 32713, 32720, 32726, 32731, 32736, 32741, 32745, 32749, 32753, 32756, 32759, 32761, 32763, 32765, - 32766, 32767, 32767 + 57, 171, 285, 400, 514, 629, 743, 857, 972, 1086, 1200, 1315, 1429, 1543, 1657, 1772, 1886, 2000, 2114, 2228, 2342, 2456, 2570, 2684, 2798, 2912, 3026, 3140, 3254, 3368, + 3482, 3595, 3709, 3823, 3936, 4050, 4163, 4277, 4390, 4503, 4617, 4730, 4843, 4956, 5069, 5182, 5295, 5408, 5521, 5633, 5746, 5858, 5971, 6083, 6196, 6308, 6420, 6532, + 6644, 6756, 6868, 6980, 7092, 7203, 7315, 7426, 7538, 7649, 7760, 7871, 7982, 8093, 8204, 8315, 8425, 8536, 8646, 8756, 8867, 8977, 9087, 9196, 9306, 9416, 9525, 9635, + 9744, 9853, 9962, 10071, 10180, 10288, 10397, 10505, 10614, 10722, 10830, 10938, 11045, 11153, 11261, 11368, 11475, 11582, 11689, 11796, 11903, 12009, 12115, 12222, 12328, + 12434, 12539, 12645, 12750, 12856, 12961, 13066, 13171, 13275, 13380, 13484, 13588, 13692, 13796, 13900, 14003, 14106, 14210, 14313, 14415, 14518, 14621, 14723, 14825, + 14927, 15029, 15130, 15231, 15333, 15434, 15534, 15635, 15735, 15836, 15936, 16036, 16135, 16235, 16334, 16433, 16532, 16631, 16729, 16827, 16925, 17023, 17121, 17218, + 17315, 17412, 17509, 17606, 17702, 17798, 17894, 17990, 18085, 18181, 18276, 18371, 18465, 18559, 18654, 18748, 18841, 18935, 19028, 19121, 19214, 19306, 19399, 19491, + 19582, 19674, 19765, 19857, 19947, 20038, 20128, 20219, 20308, 20398, 20487, 20577, 20665, 20754, 20843, 20931, 21019, 21106, 21194, 21281, 21367, 21454, 21540, 21626, + 21712, 21798, 21883, 21968, 22053, 22137, 22221, 22305, 22389, 22472, 22556, 22638, 22721, 22803, 22885, 22967, 23048, 23130, 23210, 23291, 23371, 23451, 23531, 23611, + 23690, 23769, 23847, 23925, 24003, 24081, 24159, 24236, 24313, 24389, 24465, 24541, 24617, 24692, 24767, 24842, 24916, 24991, 25064, 25138, 25211, 25284, 25357, 25429, + 25501, 25573, 25644, 25715, 25786, 25856, 25926, 25996, 26066, 26135, 26204, 26272, 26340, 26408, 26476, 26543, 26610, 26676, 26743, 26809, 26874, 26940, 27004, 27069, + 27133, 27197, 27261, 27324, 27387, 27450, 27512, 27574, 27636, 27697, 27758, 27819, 27879, 27939, 27998, 28058, 28117, 28175, 28233, 28291, 28349, 28406, 28463, 28519, + 28575, 28631, 28687, 28742, 28797, 28851, 28905, 28959, 29012, 29065, 29118, 29170, 29222, 29273, 29325, 29376, 29426, 29476, 29526, 29575, 29624, 29673, 29722, 29769, + 29817, 29864, 29911, 29958, 30004, 30050, 30095, 30140, 30185, 30229, 30273, 30317, 30360, 30403, 30445, 30487, 30529, 30571, 30612, 30652, 30692, 30732, 30772, 30811, + 30850, 30888, 30926, 30964, 31001, 31038, 31074, 31110, 31146, 31181, 31216, 31251, 31285, 31319, 31352, 31385, 31418, 31450, 31482, 31514, 31545, 31576, 31606, 31636, + 31666, 31695, 31724, 31752, 31780, 31808, 31835, 31862, 31889, 31915, 31940, 31966, 31991, 32015, 32040, 32063, 32087, 32110, 32132, 32155, 32176, 32198, 32219, 32239, + 32260, 32280, 32299, 32318, 32337, 32355, 32373, 32390, 32408, 32424, 32441, 32457, 32472, 32487, 32502, 32516, 32530, 32544, 32557, 32570, 32582, 32594, 32605, 32617, + 32627, 32638, 32648, 32657, 32666, 32675, 32684, 32692, 32699, 32706, 32713, 32720, 32726, 32731, 32736, 32741, 32745, 32749, 32753, 32756, 32759, 32761, 32763, 32765, + 32766, 32767, 32767 }; const Word16 dft_win_8k_fx[70] = { - 367, 1102, 1837, 2570, 3303, 4033, 4762, 5488, 6212, 6932, 7649, 8362, 9071, 9775, 10474, 11168, 11857, 12539, 13215, 13885, 14547, 15203, 15850, 16490, 17121, 17743, - 18357, 18961, 19556, 20141, 20716, 21281, 21834, 22377, 22909, 23428, 23937, 24433, 24916, 25388, 25846, 26292, 26724, 27143, 27548, 27939, 28316, 28679, 29027, 29361, - 29680, 29984, 30273, 30547, 30805, 31048, 31275, 31487, 31682, 31862, 32026, 32173, 32305, 32420, 32518, 32601, 32666, 32716, 32749, 32765 + 367, 1102, 1837, 2570, 3303, 4033, 4762, 5488, 6212, 6932, 7649, 8362, 9071, 9775, 10474, 11168, 11857, 12539, 13215, 13885, 14547, 15203, 15850, 16490, 17121, 17743, + 18357, 18961, 19556, 20141, 20716, 21281, 21834, 22377, 22909, 23428, 23937, 24433, 24916, 25388, 25846, 26292, 26724, 27143, 27548, 27939, 28316, 28679, 29027, 29361, + 29680, 29984, 30273, 30547, 30805, 31048, 31275, 31487, 31682, 31862, 32026, 32173, 32305, 32420, 32518, 32601, 32666, 32716, 32749, 32765 }; @@ -357,8 +357,6 @@ const UWord16 * const sym_freq_ECSQ_tab_abs_lsbs[1 + 4] = * DirAC ROM tables *----------------------------------------------------------------------------------*/ - - /*Q10*/ const Word16 dirac_dithering_azi_scale_fx[DIRAC_DIFFUSE_LEVELS] = { @@ -369,21 +367,6 @@ const Word16 dirac_dithering_ele_scale_fx[DIRAC_DIFFUSE_LEVELS] = { 1375 ,2072 ,3680 ,5743 ,9468 ,15979 ,21410 ,28252 }; -/*----------------------------------------------------------------------------------* - * FASTCONV and PARAMETRIC binaural renderer ROM tables - *----------------------------------------------------------------------------------*/ - - -/*----------------------------------------------------------------------------------* - * FASTCONV and PARAMETRIC binaural renderer ROM tables - *----------------------------------------------------------------------------------*/ - -const Word32 dmxmtx_table_fx[BINAURAL_CHANNELS][11] = -{ // Q31 - { 0x7fffffff, 0, 1518485623, 0x7fffffff, 0, 0x7fffffff, 0, 0x7fffffff, 0, 0x7fffffff, 0 }, - { 0, 0x7fffffff, 1518485623, 0, 0x7fffffff, 0, 0x7fffffff, 0, 0x7fffffff, 0, 0x7fffffff }, -}; - /*----------------------------------------------------------------------* diff --git a/lib_dec/ivas_sba_dec_fx.c b/lib_dec/ivas_sba_dec_fx.c index f89e9601f6653de1b4bc48305017ab2584688203..c4a1b0de109f168d1d6bdd22b9b9c2a4c7f0999b 100644 --- a/lib_dec/ivas_sba_dec_fx.c +++ b/lib_dec/ivas_sba_dec_fx.c @@ -30,6 +30,7 @@ *******************************************************************************************************/ +#include "enh32.h" #include #include #include "options.h" @@ -59,6 +60,7 @@ void ivas_sba_set_cna_cng_flag( test(); test(); test(); + test(); IF( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) && EQ_16( st_ivas->nchan_transport, 1 ) ) { /* skip as done in init function */ @@ -72,7 +74,7 @@ void ivas_sba_set_cna_cng_flag( st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; move16(); } - ELSE IF( EQ_16( st_ivas->nchan_transport, 2 ) ) + ELSE IF( EQ_16( st_ivas->nchan_transport, 2 ) && NE_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { FOR( n = 0; n < CPE_CHANNELS; n++ ) { @@ -106,9 +108,7 @@ void ivas_sba_set_cna_cng_flag( *-------------------------------------------------------------------*/ ivas_error ivas_sba_dec_reconfigure_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - UWord16 *nSamplesFlushed, /* o : number of samples flushed Q0*/ - Word16 *data /* o : output synthesis signal Q0*/ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { Word16 nchan_transport_old, nSCE_old, nCPE_old, nchan_hp20_old; @@ -118,12 +118,12 @@ ivas_error ivas_sba_dec_reconfigure_fx( Word32 ivas_total_brate; Word32 last_ivas_total_brate; Word16 num_channels, num_md_sub_frames; - Word16 nchan_out_buff, nchan_out_buff_old; - Word16 sba_analysis_order_old_flush; + Word16 nchan_out_buff; DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; ISM_MODE ism_mode_old; Word16 granularity_new; + Word16 nchan_transport; ism_mode_old = st_ivas->ism_mode; hDecoderConfig = st_ivas->hDecoderConfig; @@ -131,22 +131,18 @@ ivas_error ivas_sba_dec_reconfigure_fx( move32(); last_ivas_total_brate = st_ivas->last_active_ivas_total_brate; move32(); - sba_analysis_order_old_flush = st_ivas->sba_analysis_order; - move16(); /*-----------------------------------------------------------------* * Set SBA high-level parameters * Save old SBA high-level parameters *-----------------------------------------------------------------*/ - nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, sba_analysis_order_old_flush, last_ivas_total_brate ); - - ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); + ivas_init_dec_get_num_cldfb_instances_fx( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); nchan_hp20_old = getNumChanSynthesis( st_ivas ); IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - IF( GE_32( ivas_total_brate, IVAS_256k ) ) + IF( EQ_16( ivas_osba_ism_mode_select( ivas_total_brate, st_ivas->nchan_ism ), ISM_SBA_MODE_DISC ) ) { st_ivas->ism_mode = ISM_SBA_MODE_DISC; move16(); @@ -174,8 +170,6 @@ ivas_error ivas_sba_dec_reconfigure_fx( st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->sba_order ); - *nSamplesFlushed = 0; - move16(); granularity_new = st_ivas->hTcBuffer->n_samples_granularity; /*Q0*/ move16(); @@ -183,77 +177,19 @@ ivas_error ivas_sba_dec_reconfigure_fx( test(); test(); test(); - IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) + IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) { - RENDERER_TYPE renderer_type_new; - Word16 sba_order_internal; - - sba_order_internal = s_min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - - /* get new renderer type */ - /* copy the logic from ivas_renderer_select(), because calling this function has too many side effects that would affect the flushing */ - IF( LE_16( ivas_get_sba_num_TCs_fx( ivas_total_brate, sba_order_internal ), 2 ) ) - { - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) - { - renderer_type_new = RENDERER_BINAURAL_PARAMETRIC; - move16(); - } - ELSE - { - renderer_type_new = RENDERER_BINAURAL_PARAMETRIC_ROOM; - move16(); - } - } - ELSE - { - test(); - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { - renderer_type_new = RENDERER_BINAURAL_FASTCONV; - move16(); - } - ELSE - { - renderer_type_new = RENDERER_BINAURAL_FASTCONV_ROOM; - move16(); - } - } - /* determine new granularity */ - granularity_new = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); /*Q0*/ - move16(); - - /* this will change anyway only with binaural */ - test(); - IF( EQ_16( renderer_type_new, RENDERER_BINAURAL_FASTCONV ) && EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - granularity_new = i_mult( granularity_new, JBM_CLDFB_SLOTS_IN_SUBFRAME ); /*Q0*/ - } + granularity_new = ivas_jbm_dec_get_render_granularity_fx( st_ivas->renderer_type, ivas_renderer_secondary_select_fx( st_ivas ), st_ivas->hDecoderConfig->output_Fs ); /* flush renderer on granularity change form 5ms to 1.25ms, again only possible for binaural rendering */ IF( LT_16( granularity_new, st_ivas->hTcBuffer->n_samples_granularity ) ) { - /* write back info for correct rendering of the flushable samples */ - st_ivas->sba_analysis_order = sba_analysis_order_old_flush; /*Q0*/ - move16(); - st_ivas->hDecoderConfig->ivas_total_brate = last_ivas_total_brate; /*Q0*/ - move32(); - - if ( NE_32( ( error = ivas_jbm_dec_flush_renderer_fx( st_ivas, granularity_new, st_ivas->renderer_type, st_ivas->intern_config, &st_ivas->hIntSetup, st_ivas->mc_mode, ism_mode_old, nSamplesFlushed, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - - /* restore correct values for the current frame*/ - st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->sba_order ); - move16(); - st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate; /*Q0*/ - move32(); + /* flush already done in IVAS_DEC_ReadFormat() */ } ELSE IF( GT_16( granularity_new, st_ivas->hTcBuffer->n_samples_granularity ) ) { - if ( NE_32( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ), IVAS_ERR_OK ) ) + if ( NE_32( ( error = ivas_jbm_dec_set_discard_samples_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -270,7 +206,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( } /* save old */ - IF( NE_16( ism_mode_old, ISM_SBA_MODE_DISC ) ) + IF( NE_16( ism_mode_old, ISM_SBA_MODE_DISC ) && NE_16( st_ivas->hTcBuffer->tc_buffer_mode, TC_BUFFER_MODE_BUFFER ) ) { test(); IF( st_ivas->hDirAC == NULL && st_ivas->hSpar != NULL ) @@ -349,12 +285,8 @@ ivas_error ivas_sba_dec_reconfigure_fx( test(); test(); test(); -#ifdef NONBE_FIX_708_OSBA_BR_SWITCHING_CRASH test(); IF( hSpar->hPCA == NULL && EQ_32( st_ivas->hDecoderConfig->ivas_total_brate, PCA_BRATE ) && EQ_16( st_ivas->sba_order, 1 ) && ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) ) -#else - IF( hSpar->hPCA == NULL && EQ_32( st_ivas->hDecoderConfig->ivas_total_brate, PCA_BRATE ) && EQ_16( st_ivas->sba_order, 1 ) && EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) -#endif { IF( ( hSpar->hPCA = (PCA_DEC_STATE *) malloc( sizeof( PCA_DEC_STATE ) ) ) == NULL ) { @@ -415,7 +347,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( IF( st_ivas->hBinRenderer == NULL && ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) ) { /* open fastconv binaural renderer */ - if ( NE_32( ( error = ivas_binRenderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_binRenderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -427,7 +359,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( IF( EQ_16( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) && st_ivas->hMonoDmxRenderer == NULL ) { - if ( NE_32( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -438,9 +370,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); } - if ( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), - st_ivas->ivas_format ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) { return error; } @@ -477,7 +407,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( } ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( L_add( st_ivas->hDecoderConfig->output_Fs, 400 ) / CLDFB_BANDWIDTH ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0, 1 ); if ( st_ivas->hDirAC ) { @@ -504,6 +434,8 @@ ivas_error ivas_sba_dec_reconfigure_fx( * Allocate, initialize, and configure SCE/CPE/MCT handles *-----------------------------------------------------------------*/ + nchan_transport = st_ivas->nchan_transport; + move16(); IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { test(); @@ -570,6 +502,13 @@ ivas_error ivas_sba_dec_reconfigure_fx( { return error; } + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) + { + return error; + } + } } } @@ -579,7 +518,8 @@ ivas_error ivas_sba_dec_reconfigure_fx( return error; } - st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->nchan_ism, 1 ), 1 ) ); /*Q0*/ + nchan_transport = add( nchan_transport, st_ivas->nchan_ism ); + st_ivas->nCPE = shr_r( nchan_transport, 1 ); move16(); } ELSE IF( EQ_16( ism_mode_old, ISM_SBA_MODE_DISC ) && EQ_16( st_ivas->ism_mode, ISM_MODE_NONE ) ) @@ -592,25 +532,20 @@ ivas_error ivas_sba_dec_reconfigure_fx( /* Time Domain binaural renderer handle */ IF( st_ivas->hBinRendererTd != NULL ) { - IF( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) - { - ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); - st_ivas->hHrtfTD = NULL; - } + ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); } + + nchan_transport = st_ivas->nchan_transport; + move16(); nchan_transport_old = add( nchan_transport_old, st_ivas->nchan_ism ); /*Q0*/ st_ivas->ism_mode = ISM_MODE_NONE; move16(); } ELSE IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->nchan_ism, 1 ), 1 ) ); /*Q0*/ - move16(); - nCPE_old = st_ivas->nCPE; - move16(); - nchan_transport_old = st_ivas->nchan_transport; - move16(); - nchan_transport_old = add( nchan_transport_old, st_ivas->nchan_ism ); /*Q0*/ + nchan_transport = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + st_ivas->nCPE = shr_r( nchan_transport, 1 ); + nchan_transport_old = add( nchan_transport_old, st_ivas->nchan_ism ); } } @@ -622,6 +557,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( /*-----------------------------------------------------------------* * HP20 memories *-----------------------------------------------------------------*/ + IF( NE_32( ( error = ivas_hp20_dec_reconfig_fx( st_ivas, nchan_hp20_old ) ), IVAS_ERR_OK ) ) { return error; @@ -631,9 +567,9 @@ ivas_error ivas_sba_dec_reconfigure_fx( * TD Decorrelator *-----------------------------------------------------------------*/ - IF( st_ivas->hDiracDecBin != NULL ) + IF( st_ivas->hDiracDecBin[0] != NULL ) { - IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin[0]->hTdDecorr ), &( st_ivas->hDiracDecBin[0]->useTdDecorr ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -642,6 +578,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( /*-----------------------------------------------------------------* * CLDFB instances *-----------------------------------------------------------------*/ + IF( NE_32( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ), IVAS_ERR_OK ) ) { return error; @@ -754,20 +691,25 @@ ivas_error ivas_sba_dec_reconfigure_fx( } /*-----------------------------------------------------------------* - * floating-point output audio buffers + * output audio buffers *-----------------------------------------------------------------*/ - nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); /*Q0*/ - - if ( NE_32( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff_old, nchan_out_buff ) ), IVAS_ERR_OK ) ) + nchan_out_buff = ivas_get_nchan_buffers_dec_fx( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); /*Q0*/ + IF( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff, hDecoderConfig->Opt_tsm, st_ivas->hTcBuffer ) ) != IVAS_ERR_OK ) { return error; } - return error; + return IVAS_ERR_OK; } +/*-------------------------------------------------------------------* + * ivas_sba_dec_digest_tc() + * + * + *-------------------------------------------------------------------*/ + void ivas_sba_dec_digest_tc_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const Word16 nCldfbSlots, /* i : number of CLDFB slots Q0*/ @@ -777,17 +719,20 @@ void ivas_sba_dec_digest_tc_fx( Word16 ch_idx, nchan_transport; /* set the md map */ - IF( st_ivas->hDirAC ) + test(); + IF( st_ivas->hDirAC != NULL || EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) { ivas_dirac_dec_set_md_map_fx( st_ivas, nCldfbSlots ); } + test(); IF( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) || EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { ivas_spar_dec_digest_tc_fx( st_ivas, st_ivas->nchan_transport, nCldfbSlots, nSamplesForRendering ); } + test(); - IF( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) + IF( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr ) { Word16 nSamplesLeftForTD, default_frame; Word32 *decorr_signal[BINAURAL_CHANNELS]; @@ -810,9 +755,9 @@ void ivas_sba_dec_digest_tc_fx( { Word16 nSamplesToDecorr = s_min( nSamplesLeftForTD, default_frame ); /*Q0*/ - IF( st_ivas->hDiracDecBin->hTdDecorr ) + IF( st_ivas->hDiracDecBin[0]->hTdDecorr ) { - ivas_td_decorr_process_fx( st_ivas->hDiracDecBin->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr ); + ivas_td_decorr_process_fx( st_ivas->hDiracDecBin[0]->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr ); } FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) @@ -856,7 +801,7 @@ void ivas_sba_dec_digest_tc_fx( Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, M + 1, sub( norm_s( sub( st->hFdCngDec->hFdCngCom->A_cng[0], 1 ) ), 2 ) ); /*Q12 -> Q13*/ - generate_masking_noise_lb_dirac_fx( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc_fx[1], nCldfbSlots, st->cna_dirac_flag && st->flag_cna ); + generate_masking_noise_lb_dirac_fx( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc_fx[1], nCldfbSlots, st_ivas->hSpatParamRendCom, st->cna_dirac_flag && st->flag_cna ); } return; @@ -874,35 +819,39 @@ ivas_error ivas_sba_dec_render_fx( UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered Q0*/ UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render Q0*/ Word32 *output_fx[] /* o : rendered time signal Q11*/ -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - , - Word16 out_len /*Store the length of values in each channel*/ -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ ) { - Word16 slots_to_render, first_sf, last_sf, subframe_idx; + Word16 slots_to_render, first_sf, last_sf, subframe_idx, n_samples_sf; UWord16 slot_size, ch; UWord16 nchan_internal, nchan_out; SPAR_DEC_HANDLE hSpar; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; - Word32 *output_f_local_fx[MAX_OUTPUT_CHANNELS]; -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - Word16 output_f_local_len; -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + Word32 *output_fx_local[MAX_OUTPUT_CHANNELS]; ivas_error error; -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - output_f_local_len = out_len; - move16(); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ hSpar = st_ivas->hSpar; hSpatParamRendCom = st_ivas->hSpatParamRendCom; nchan_internal = ivas_sba_get_nchan_metadata_fx( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); nchan_out = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); /*Q0*/ + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + nchan_out = s_max( nchan_internal, st_ivas->hDecoderConfig->nchan_out ); + + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + nchan_out = s_max( nchan_internal, sub( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_ism ) ); + } + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + nchan_out = BINAURAL_CHANNELS; + move16(); + } + } + nchan_out = s_min( nchan_out, ivas_get_nchan_buffers_dec_fx( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); FOR( ch = 0; ch < nchan_out; ch++ ) { - output_f_local_fx[ch] = output_fx[ch]; /*Q11*/ + output_fx_local[ch] = output_fx[ch]; /*Q11*/ } slot_size = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); /*Q0*/ @@ -924,20 +873,35 @@ ivas_error ivas_sba_dec_render_fx( FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { - Word16 n_samples_sf = imult1616( slot_size, hSpar->subframe_nbslots[subframe_idx] ); /*Q0*/ + n_samples_sf = imult1616( slot_size, hSpar->subframe_nbslots[subframe_idx] ); /*Q0*/ + + ivas_spar_dec_upmixer_sf_fx( st_ivas, output_fx_local, nchan_internal ); + + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + Word32 gain = st_ivas->hSbaIsmData->gain_bed_fx; // Q29 + move32(); + + test(); + IF( NE_32( gain, ONE_IN_Q29 ) && NE_32( gain, 0 ) ) + { + FOR( ch = 0; ch < nchan_out; ch++ ) + { + FOR( Word16 i = 0; i < n_samples_sf; i++ ) + { + Word32 tmp1; + tmp1 = Mpy_32_32( output_fx_local[ch][i], gain ); // Q11 + Q29 - 31 = Q9 + output_fx_local[ch][i] = L_shl( tmp1, 2 ); // Q9 --> Q11 + } + } + } + } -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - ivas_spar_dec_upmixer_sf_fx( st_ivas, output_f_local_fx, nchan_internal ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - ivas_spar_dec_upmixer_sf_fx( st_ivas, output_f_local_fx, nchan_internal, output_f_local_len ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ FOR( ch = 0; ch < nchan_out; ch++ ) { - output_f_local_fx[ch] = output_f_local_fx[ch] + n_samples_sf; /*Q11*/ + output_fx_local[ch] = output_fx_local[ch] + n_samples_sf; /*Q11*/ } -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - output_f_local_len = sub( output_f_local_len, n_samples_sf ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ /* update combined orientation access index */ ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_sf ); } diff --git a/lib_dec/ivas_sba_dirac_stereo_dec_fx.c b/lib_dec/ivas_sba_dirac_stereo_dec_fx.c index 0c75446827d5b7c6a423efed827ce2c1ea2cf635..42a2524f1f6676a2f216159767685da2dbb0d4ae 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec_fx.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec_fx.c @@ -38,10 +38,10 @@ #include "ivas_prot_fx.h" #include "rom_com.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" #include "ivas_rom_dec.h" #include "wmc_auto.h" + #define SIN_NEG_30_DEGREES_Q15 ( (Word16) 0xC000 ) #define SIN_30_DEGREES_Q15 ( (Word16) 0x4000 ) @@ -276,6 +276,8 @@ static Word16 get_panning_tangent_gain( lim_r = sub( idx, 1 ); /*Q0*/ } } + assert( "should not be reached, added to avoid issues with WMC tool instrumentation" ); + return 0; /* should not be reached, added to avoid issues with WMC tool instrumentation */ } static Word16 get_panning( @@ -620,6 +622,9 @@ static void map_params_dirac_to_stereo( move32(); } } + + /* Clamp values here. [-1, 1] is the allowed range, but due to precision issues they can be slightly off which can cause problems later. */ + /* In Q31, this clamping happens implicitly */ q_sqrt = 0; move16(); side_gain[b] = Mpy_32_32( side_gain[b], Sqrt32( L_sub( MAX_32, diffuseness[b] ), &q_sqrt ) ); /*Q31 - q_sqrt*/ @@ -638,9 +643,11 @@ static void map_params_dirac_to_stereo( q_sqrt = 0; move16(); } - res_pred_gain[b] = Mpy_32_16_1( diffuseness[b], sub( MAX_16, surrCoh[b] ) ); /*Q31*/ + + /* for residual prediction gain, allowed range is [0, 1]*/ + res_pred_gain[b] = L_max( Mpy_32_16_1( diffuseness[b], sub( MAX_16, surrCoh[b] ) ), 0 ); /*Q31*/ move32(); - res_pred_gain[b + STEREO_DFT_BAND_MAX] = Mpy_32_16_1( diffuseness[b], sub( MAX_16, surrCoh[b] ) ); /*Q31*/ + res_pred_gain[b + STEREO_DFT_BAND_MAX] = L_max( Mpy_32_16_1( diffuseness[b], sub( MAX_16, surrCoh[b] ) ), 0 ); /*Q31*/ move32(); } } @@ -725,12 +732,10 @@ static void ivas_sba_dirac_stereo_compute_td_stefi_nrgs( ELSE { set32_fx( hStereoDft->hb_stefi_sig_fx + hStereoDft->hb_stefi_delay, 0, output_frame ); -#ifdef MSAN_FIX hStereoDft->hb_nrg_subr_fx[0] = 0; move32(); hStereoDft->hb_nrg_subr_fx[1] = 0; move32(); -#endif // MSAN_FIX } hStereoDft->hb_nrg_subr_fx[0] = hStereoDft->hb_nrg_subr_fx[0]; // imult3216(hStereoDft->hb_nrg_subr_fx[0] , shr(hStereoDft->NFFT, 1)); /*hStereoDft->q_hb_nrg_subr*/ move32(); @@ -1240,12 +1245,10 @@ void ivas_sba_dirac_stereo_dec_fx( CPE_DEC_HANDLE hCPE; STEREO_DFT_DEC_DATA_HANDLE hStereoDft; -#ifdef MSAN_FIX FOR( Word16 i = 0; i < CPE_CHANNELS; i++ ) { set32_fx( DFT[i], 0, STEREO_DFT_BUF_MAX ); } -#endif hSCE = st_ivas->hSCE[0]; hCPE = st_ivas->hCPE[0]; @@ -1257,18 +1260,10 @@ void ivas_sba_dirac_stereo_dec_fx( q_dft[1] = hCPE->hStereoDft->q_dft; move16(); -#ifdef MSAN_FIX Scale_sig32( hCPE->prev_hb_synth_fx[0], NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ), negate( sub( Q11, hCPE->hStereoDft->q_dft ) ) ); /*hSCE->q_prev_hb_synth_fx + hCPE->hStereoDft->q_dft - Q11*/ -#else - Scale_sig32( hCPE->prev_hb_synth_fx[0], NS2SA_FX2( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ), -( Q11 - hCPE->hStereoDft->q_dft ) ); -#endif IF( hSCE != NULL ) { -#ifdef MSAN_FIX Scale_sig32( hSCE->prev_hb_synth_fx, NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ), negate( sub( Q11, hCPE->hStereoDft->q_dft ) ) ); /*hSCE->q_prev_hb_synth_fx + hCPE->hStereoDft->q_dft - Q11*/ -#else - Scale_sig32( hSCE->prev_hb_synth_fx, NS2SA_FX2( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ), -( Q11 - hCPE->hStereoDft->q_dft ) ); -#endif // MSAN_FIX hSCE->q_prev_hb_synth_fx = hCPE->hStereoDft->q_dft; move16(); } @@ -1398,18 +1393,10 @@ void ivas_sba_dirac_stereo_dec_fx( set32_fx( output[ch], 0, output_frame ); } -#ifdef MSAN_FIX Scale_sig32( hCPE->prev_hb_synth_fx[0], NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); /*hSCE->q_prev_hb_synth_fx + Q11 - hCPE->hStereoDft->q_dft*/ -#else - Scale_sig32( hCPE->prev_hb_synth_fx[0], NS2SA_FX2( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ), ( Q11 - hCPE->hStereoDft->q_dft ) ); -#endif IF( hSCE != NULL ) { -#ifdef MSAN_FIX Scale_sig32( hSCE->prev_hb_synth_fx, NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); /*hSCE->q_prev_hb_synth_fx + Q11 - hCPE->hStereoDft->q_dft*/ -#else - Scale_sig32( hSCE->prev_hb_synth_fx, NS2SA_FX2( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ), ( Q11 - hCPE->hStereoDft->q_dft ) ); -#endif // MSAN_FIX hSCE->q_prev_hb_synth_fx = Q11; move16(); } diff --git a/lib_dec/ivas_sba_rendering_internal_fx.c b/lib_dec/ivas_sba_rendering_internal_fx.c index bbe63e965c4dd80be1cedec78bd8365bdd4b3a92..d9f7b26be0676b936f9d11c681b3001ed0332488 100644 --- a/lib_dec/ivas_sba_rendering_internal_fx.c +++ b/lib_dec/ivas_sba_rendering_internal_fx.c @@ -49,7 +49,7 @@ * SBA signals transformed into MC in CLDFB domain *-------------------------------------------------------------------------*/ -void ivas_sba2mc_cldfb_fixed( +void ivas_sba2mc_cldfb_fx( IVAS_OUTPUT_SETUP hInSetup, /* i : Format of input layout */ Word32 RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb real part (Q_real) */ Word32 ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part (Q_imag) */ @@ -65,10 +65,10 @@ void ivas_sba2mc_cldfb_fixed( Word32 *p_real_fx, *p_imag_fx, *p_realOut_fx, *p_imagOut_fx; Word16 nb_channels_in; - push_wmops( "ivas_sba2mc_cldfb_fixed" ); + push_wmops( "ivas_sba2mc_cldfb_fx" ); nb_channels_in = hInSetup.nchan_out_woLFE; /*Q0*/ move16(); - assert( EQ_16( nb_channels_in, 16 ) && EQ_16( nb_channels_out, 11 ) && "ivas_sba2mc_cldfb_fixed; only HOA3 to CICP19 is for now supported!" ); + assert( EQ_16( nb_channels_in, 16 ) && EQ_16( nb_channels_out, 11 ) && "ivas_sba2mc_cldfb_fx; only HOA3 to CICP19 is for now supported!" ); FOR( n = 0; n < nb_channels_out; n++ ) { @@ -77,7 +77,7 @@ void ivas_sba2mc_cldfb_fixed( FOR( m = 0; m < nb_channels_in; m++ ) { - g_fx = hoa_dec_mtx[( ( SBA_NHARM_HOA3 * n ) + m )]; // Q29 + g_fx = L_shl_sat( hoa_dec_mtx[( ( SBA_NHARM_HOA3 * n ) + m )], Q2 ); p_realOut_fx = realOut_fx[n]; p_imagOut_fx = imagOut_fx[n]; @@ -87,9 +87,9 @@ void ivas_sba2mc_cldfb_fixed( p_imag_fx = ImagBuffer[m][iBlock]; /*Q_imag*/ FOR( iBand = 0; iBand < nb_bands; iBand++ ) { - *p_realOut_fx = L_add( *p_realOut_fx, Mpy_32_32( L_shl_sat( g_fx, Q2 ), *( p_real_fx++ ) ) ); // Q_real + *p_realOut_fx = Madd_32_32( *p_realOut_fx, g_fx, *( p_real_fx++ ) ); // Q_real move32(); - *p_imagOut_fx = L_add( *p_imagOut_fx, Mpy_32_32( L_shl_sat( g_fx, Q2 ), *( p_imag_fx++ ) ) ); // Q_imag + *p_imagOut_fx = Madd_32_32( *p_imagOut_fx, g_fx, *( p_imag_fx++ ) ); // Q_imag move32(); p_realOut_fx++; p_imagOut_fx++; @@ -121,6 +121,7 @@ void ivas_sba2mc_cldfb_fixed( return; } + /*-------------------------------------------------------------------------* * ivas_mc2sba() * @@ -129,12 +130,11 @@ void ivas_sba2mc_cldfb_fixed( void ivas_mc2sba_fx( IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ - Word32 *in_buffer_td_fx[], - /* i : MC signals (on input) and the HOA3 (on output) */ /*Q*/ - Word32 *buffer_td_fx[], /* i/o: MC signals (on input) and the HOA3 (on output) Q*/ - const Word16 output_frame, /* i : output frame length per channel Q0*/ - const Word16 sba_order, /* i : Ambisonic (SBA) order Q0*/ - const Word16 gain_lfe_fx /* i : gain for LFE, 0 = ignore LFE Q14*/ + Word32 *in_buffer_td_fx[], /* i : MC signals (on input) and the HOA3 (on output) Q*/ + Word32 *buffer_td_fx[], /* i/o: MC signals (on input) and the HOA3 (on output) Q*/ + const Word16 output_frame, /* i : output frame length per channel Q0*/ + const Word16 sba_order, /* i : Ambisonic (SBA) order Q0*/ + const Word16 gain_lfe_fx /* i : gain for LFE, 0 = ignore LFE Q14*/ ) { Word16 i, j, k; @@ -167,7 +167,7 @@ void ivas_mc2sba_fx( /* Add LFE to omni W with gain*/ FOR( k = 0; k < output_frame; k++ ) { - buffer_tmp_fx[0][k] = L_add( buffer_tmp_fx[0][k], L_shl( Mult_32_16( in_buffer_td_fx[i][k], gain_lfe_fx ), 1 ) ); /*Q+14-15+1==Q*/ + buffer_tmp_fx[0][k] = Madd_32_16( buffer_tmp_fx[0][k], L_shl( in_buffer_td_fx[i][k], 1 ), gain_lfe_fx ); /*Q+14-15+1==Q*/ move32(); } } @@ -196,7 +196,7 @@ void ivas_mc2sba_fx( { FOR( k = 0; k < output_frame; k++ ) { - buffer_tmp_fx[j][k] = L_add( buffer_tmp_fx[j][k], L_shl( Mult_32_32( in_buffer_td_fx[i][k], gains_fx[j] ), 2 ) ); /*Q+29-31+2==Q*/ + buffer_tmp_fx[j][k] = Madd_32_32( buffer_tmp_fx[j][k], L_shl_sat( in_buffer_td_fx[i][k], 2 ), gains_fx[j] ); /*Q+29-31+2==Q*/ move32(); } } @@ -218,6 +218,7 @@ void ivas_mc2sba_fx( * MC signals transformed into SBA in CLDFB domain * used for binaural rendering with head rotation *-------------------------------------------------------------------------*/ + void ivas_param_mc_mc2sba_cldfb_fx( IVAS_OUTPUT_SETUP hTransSetup, /* i : transported MC Format */ Word32 *hoa_encoder_fx, /* i : HOA3 encoder for the transported MC format Q31*/ @@ -342,23 +343,25 @@ Word16 ivas_sba_remapTCs_fx( } } } + return ( nchan_remapped ); } + /*-------------------------------------------------------------------------* * ivas_ism2sba_sf() * * ISM transformed into SBA in TD domain. *-------------------------------------------------------------------------*/ + void ivas_ism2sba_sf_fx( - Word32 *buffer_in_fx[], - /* i : TC buffer */ /*Q_buffer_in*/ - Word32 *buffer_out_fx[], /* o : TD signal buffers Q_buffer_in + 29 - 31*/ - ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ - const Word16 num_objects, /* i : number of objects Q0*/ - const Word16 n_samples_to_render, /* i : output frame length per channel Q0*/ - const Word16 offset, /* i : offset for the interpolatr Q0*/ - const Word16 sba_order /* i : Ambisonic (SBA) order Q0*/ + Word32 *buffer_in_fx[], /* i : TC buffer Q_buffer_in*/ + Word32 *buffer_out_fx[], /* o : TD signal buffers Q_buffer_in + 29 - 31*/ + ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ + const Word16 num_objects, /* i : number of objects Q0*/ + const Word16 n_samples_to_render, /* i : output frame length per channel Q0*/ + const Word16 offset, /* i : offset for the interpolatr Q0*/ + const Word16 sba_order /* i : Ambisonic (SBA) order Q0*/ ) { Word16 i, j, k; @@ -380,7 +383,7 @@ void ivas_ism2sba_sf_fx( FOR( j = 0; j < sba_num_chans; j++ ) { g2_fx = hIsmRendererData->interpolator_fx + offset; /*Pointer addition*/ /*Q15*/ - tc_fx = buffer_in_fx[i] + offset; /*Pointer addition*/ /*Q_buffer_in*/ + tc_fx = buffer_in_fx[i]; /*Q_buffer_in*/ out_fx = buffer_tmp_fx[j]; /*Q_buffer_in + 29 - 31*/ gain_fx = hIsmRendererData->gains_fx[i][j]; /*Q29*/ move32(); @@ -397,24 +400,24 @@ void ivas_ism2sba_sf_fx( } } } + FOR( j = 0; j < sba_num_chans; j++ ) { Copy32( buffer_tmp_fx[j], buffer_out_fx[j], n_samples_to_render ); /*Q_buffer_in + 29 - 31*/ } + return; } + /*-------------------------------------------------------------------* * ivas_sba_linear_renderer() * * Linear rendering for SBA format *-------------------------------------------------------------------*/ -/*TODO: To be tested*/ -/************************ -Float to fixed conversion required for:output_f -*************************/ + ivas_error ivas_sba_linear_renderer_fx( - Word32 *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output Q11*/ + Word32 *output_fx[], /* i/o: synthesized core-coder transport channels/DirAC output Q11*/ const Word16 output_frame, /* i : output frame length per channel Q0*/ const Word16 nchan_in, /* i : number of input ambisonics channels Q0*/ const Word16 nchan_ism, /* i : number of objects Q0*/ @@ -451,17 +454,17 @@ ivas_error ivas_sba_linear_renderer_fx( case IVAS_AUDIO_CONFIG_HOA3: /* Ambisonics output, order: 3 */ FOR( i = nchan_hoa; i < output_setup.nchan_out_woLFE; i++ ) { - set_zero_fx( output_f[i], output_frame ); + set_zero_fx( output_fx[i], output_frame ); } BREAK; case IVAS_AUDIO_CONFIG_EXTERNAL: FOR( i = output_setup.nchan_out_woLFE - 1; i >= nchan_ism; i-- ) { - Copy32( output_f[i - nchan_ism], output_f[i], output_frame ); /*Q11*/ + Copy32( output_fx[i - nchan_ism], output_fx[i], output_frame ); /*Q11*/ } FOR( ; i >= 0; i-- ) { - set_zero_fx( output_f[i], output_frame ); + set_zero_fx( output_fx[i], output_frame ); } BREAK; default: @@ -477,6 +480,7 @@ ivas_error ivas_sba_linear_renderer_fx( * * Determine SBA mixing matrices *-------------------------------------------------------------------*/ + void ivas_sba_mix_matrix_determiner_fx( SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ Word32 *output_fx[], /* i/o: transport/output audio channels Q_output*/ @@ -491,6 +495,7 @@ void ivas_sba_mix_matrix_determiner_fx( Word16 num_bands_out, nchan_transport, nchan_out; Word16 Q_p_output = add( 11, Q_output ); Word32 temp_fx; + /* Convert numeric range */ FOR( ch = 0; ch < nchan_remapped; ch++ ) { @@ -505,7 +510,7 @@ void ivas_sba_mix_matrix_determiner_fx( temp_fx = MAX16B; /*Q0*/ move32(); } - ELSE IF( LT_32( temp_fx, L_negate( PCM16_TO_FLT_FAC_FX ) ) ) + ELSE IF( LT_32( temp_fx, -( PCM16_TO_FLT_FAC_FX ) ) ) { temp_fx = -( PCM16_TO_FLT_FAC_FX ); /*Q0*/ move32(); @@ -520,6 +525,7 @@ void ivas_sba_mix_matrix_determiner_fx( move16(); nchan_out = nchan_transport; /*Q0*/ move16(); + ivas_agc_dec_process_fx( hSpar->hAgcDec, ( output_fx ), ( output_fx ), nchan_transport, output_frame ); Q_p_output = sub( Q_p_output, 3 ); #ifdef DEBUGGING @@ -538,6 +544,8 @@ void ivas_sba_mix_matrix_determiner_fx( /* Mixing matrix determiner */ num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; /*Q0*/ move16(); + ivas_spar_dec_gen_umx_mat_fx( hSpar->hMdDec, nchan_transport, num_bands_out, bfi, num_md_sub_frames ); + return; } diff --git a/lib_dec/ivas_sce_dec_fx.c b/lib_dec/ivas_sce_dec_fx.c index 6e1893015fec3992e084426df2874572579b5d15..77c53c5ef63d18306328a6c065a495908be58b4f 100644 --- a/lib_dec/ivas_sce_dec_fx.c +++ b/lib_dec/ivas_sce_dec_fx.c @@ -416,22 +416,9 @@ ivas_error create_sce_dec( move16(); } - // if (st_ivas->mode == IVAS_DEC_MODE_EVS) - IF( EQ_16( st->element_mode, EVS_MONO ) ) + IF( ( error = init_decoder_fx( st, 0, st_ivas->mc_mode ) ) != IVAS_ERR_OK ) { - error = init_decoder_fx( st, EVS_MONO ); - IF( error ) - { - return error; - } - } - ELSE - { - error = init_decoder_ivas_fx( st, 0, st_ivas->mc_mode ); - IF( error ) - { - return error; - } + return error; } IF( EQ_16( (Word16) st_ivas->ivas_format, SBA_FORMAT ) && ( EQ_16( (Word16) st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) || ( EQ_16( (Word16) st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) && EQ_16( st_ivas->nchan_transport, 1 ) ) ) ) diff --git a/lib_dec/ivas_sns_dec_fx.c b/lib_dec/ivas_sns_dec_fx.c index 3271160245fc505e7c56cdc7ea2d760c53d3ad86..17b4390abf69d2af2fd1631c104ca123b53c07cb 100644 --- a/lib_dec/ivas_sns_dec_fx.c +++ b/lib_dec/ivas_sns_dec_fx.c @@ -38,7 +38,6 @@ #include "ivas_cnst.h" #include #include "wmc_auto.h" -#include "ivas_rom_com_fx.h" #include "ivas_prot_fx.h" /*------------------------------------------------------------------- @@ -83,7 +82,7 @@ static void sns_1st_dec_fx( FOR( i = 0; i < M / 2; i++ ) { -#ifdef IMPROV_PRECISION +#ifdef IMPROV_COMPLEX_BE snsq_fx[i] = L_mac( L_mult( ( *p_dico++ ), cdbk_fix ), means[i], means_fix ); // Q16 #else snsq_fx[i] = L_add( L_mult( ( *p_dico++ ), cdbk_fix ), L_mult( means[i], means_fix ) ); // Q16 @@ -95,7 +94,7 @@ static void sns_1st_dec_fx( FOR( i = M / 2; i < M; i++ ) { -#ifdef IMPROV_PRECISION +#ifdef IMPROV_COMPLEX_BE snsq_fx[i] = L_mac( L_mult( ( *p_dico++ ), cdbk_fix ), means[i], means_fix ); /*Q16*/ #else snsq_fx[i] = L_add( L_mult( ( *p_dico++ ), cdbk_fix ), L_mult( means[i], means_fix ) ); /*Q16*/ diff --git a/lib_dec/ivas_spar_decoder_fx.c b/lib_dec/ivas_spar_decoder_fx.c index 461b18fbc38fb5dd3e846f58e2a4b23337f40db3..864d0543821e666566163296335a36ffc999ea3b 100644 --- a/lib_dec/ivas_spar_decoder_fx.c +++ b/lib_dec/ivas_spar_decoder_fx.c @@ -292,16 +292,7 @@ ivas_error ivas_spar_dec_open_fx( move16(); } - test(); - test(); - test(); - IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && ( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - /* get correct granularity in case of binaural rendering of the discrete objects with the td obj renderer */ - Word32 quo, rem; - iDiv_and_mod_32( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &quo, &rem, 0 ); - granularity = extract_l( quo ); /*Q0*/ - } + granularity = ivas_jbm_dec_get_render_granularity_fx( st_ivas->renderer_type, ivas_renderer_secondary_select_fx( st_ivas ), output_Fs ); IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, granularity ) ), IVAS_ERR_OK ) ) { @@ -379,7 +370,6 @@ ivas_error ivas_spar_dec_fx( Word16 next_bit_pos_orig, last_bit_pos; UWord16 bstr_meta[MAX_BITS_METADATA], *bit_stream_orig; ivas_error error; - Word32 quo, rem; push_wmops( "ivas_spar_decode" ); error = IVAS_ERR_OK; @@ -402,8 +392,8 @@ ivas_error ivas_spar_dec_fx( IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - iDiv_and_mod_32( hDecoderConfig->ivas_total_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); - last_bit_pos = sub( extract_l( L_sub( quo, 1 ) ), nb_bits_read[1] ); /*Q0*/ + i = extract_l( Mpy_32_32_r( hDecoderConfig->ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + last_bit_pos = sub( sub( i, 1 ), nb_bits_read[1] ); /*Q0*/ } ELSE { @@ -416,24 +406,24 @@ ivas_error ivas_spar_dec_fx( /* read DirAC bitstream */ IF( st_ivas->hQMetaData != NULL ) { - ivas_dirac_dec_read_BS_fx( hDecoderConfig->ivas_total_brate, st0, st_ivas->hDirAC, st_ivas->hSpatParamRendCom, st_ivas->hQMetaData, nb_bits_read, last_bit_pos, ivas_get_hodirac_flag_fx( hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ), st_ivas->hSpar->dirac_to_spar_md_bands ); + ivas_dirac_dec_read_BS_fx( hDecoderConfig->ivas_total_brate, st0, st_ivas->hDirAC, st_ivas->hSpatParamRendCom, st_ivas->hQMetaData, nb_bits_read, last_bit_pos, ivas_get_hodirac_flag_fx( hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ), st_ivas->nchan_transport, st_ivas->hSpar->dirac_to_spar_md_bands ); } IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - iDiv_and_mod_32( hDecoderConfig->ivas_total_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); - last_bit_pos = sub( extract_l( L_sub( quo, 1 ) ), nb_bits_read[1] ); /*Q0*/ + i = extract_l( Mpy_32_32_r( hDecoderConfig->ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + last_bit_pos = sub( sub( i, 1 ), nb_bits_read[1] ); /*Q0*/ } ELSE { - iDiv_and_mod_32( hDecoderConfig->ivas_total_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); - last_bit_pos = extract_l( L_sub( quo, 1 ) ); /*Q0*/ + i = extract_l( Mpy_32_32_r( hDecoderConfig->ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + last_bit_pos = sub( i, 1 ); /*Q0*/ } test(); if ( !st0->bfi && EQ_32( hDecoderConfig->ivas_total_brate, IVAS_SID_5k2 ) ) { - last_bit_pos = sub( last_bit_pos, SID_FORMAT_NBITS ); /*Q0*/ + last_bit_pos = sub( last_bit_pos, ( SID_FORMAT_NBITS + SBA_PLANAR_BITS + SBA_ORDER_BITS ) ); /*Q0*/ } nb_bits_read_orig = *nb_bits_read; /*Q0*/ move16(); @@ -476,7 +466,7 @@ ivas_error ivas_spar_dec_fx( IF( !st0->bfi && EQ_32( hDecoderConfig->ivas_total_brate, IVAS_SID_5k2 ) ) { Word16 zero_pad_bits; - *nb_bits_read = add( *nb_bits_read, SID_FORMAT_NBITS ); /*Q0*/ + *nb_bits_read = add( *nb_bits_read, SID_FORMAT_NBITS + SBA_PLANAR_BITS + SBA_ORDER_BITS ); /*Q0*/ move16(); zero_pad_bits = sub( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC, *nb_bits_read ); /*Q0*/ assert( zero_pad_bits <= 1 ); @@ -704,7 +694,7 @@ void ivas_spar_get_cldfb_gains_fx( cf_end = add( sub( hSpar->hFbMixer->cross_fade_end_offset, encfb_delay ), decfb_delay ); /*Q0*/ cf_len = sub( cf_end, cf_start ); weights_fx = hSpar->hFbMixer->cldfb_cross_fade_fx; /*hSpar->hFbMixer->cldfb_cross_fade_q*/ - cf_cldfb_start = shr( extract_l( ceil_fixed( sub( divide1616( sub( cf_start, shr( decfb_delay, 1 ) ), shl( stride, 9 ) ), 32 ), 6 ) ), 6 ); /*Q0*/ + cf_cldfb_start = shr( extract_l( ceil_fx( sub( divide1616( sub( cf_start, shr( decfb_delay, 1 ) ), shl( stride, 9 ) ), 32 ), 6 ) ), 6 ); /*Q0*/ cf_cldfb_end = shr( divide1616( add( sub( cf_start, shr( decfb_delay, 1 ) ), cf_len ), shl( stride, 9 ) ), 6 ); /*q-factor of stride is 9(as max value is 60)*/ /*Q0*/ num_cf_slots = add( sub( cf_cldfb_end, cf_cldfb_start ), 1 ); /*Q0*/ num_samples = add( imult1616( num_cf_slots, stride ), sub( pt_len, stride ) ); /*Q0*/ @@ -787,11 +777,7 @@ void ivas_spar_get_cldfb_gains_fx( cldfbAnalysis_ts_fx_fixed_q( ts_inout_fx, ts_re_fx, ts_im_fx, num_cldfb_bands, cldfbAnaDec0, &q_cldfb ); cldfb_reset_memory_fx( cldfbSynDec0 ); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( pp_ts_re_fx, pp_ts_im_fx, ts_inout_fx, num_cldfb_bands, 0, cldfbSynDec0 ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( pp_ts_re_fx, pp_ts_im_fx, ts_inout_fx, num_cldfb_bands, cldfbSynDec0 ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + cldfbSynthesis_ivas_fx( pp_ts_re_fx, pp_ts_im_fx, ts_inout_fx, num_cldfb_bands, 0, 0, cldfbSynDec0 ); FOR( sample = 0; sample < stride; sample++ ) { T_fx[( ( slot * stride ) + sample )][slot] = ts_inout_fx[sample]; /*Q21*/ @@ -812,6 +798,7 @@ void ivas_spar_get_cldfb_gains_fx( tgt_fx[sample] = L_shl( Mpy_32_32( tgt_fx[sample], L_add( T_fx[sample][0], L_add( T_fx[sample][1], T_fx[sample][2] ) ) ), 10 ); /*Q31*/ move32(); } + /* compute matrices */ FOR( slot_row = 0; slot_row < num_cf_slots; slot_row++ ) { @@ -846,6 +833,7 @@ void ivas_spar_get_cldfb_gains_fx( Word16 output_q = 27; move16(); matrix_inverse_fx( Tt_T_fx, Tt_T_inv_fx, num_cf_slots, &output_q ); + /* compute the optimal coefficients */ FOR( slot_row = 0; slot_row < num_cf_slots; slot_row++ ) { @@ -866,6 +854,8 @@ void ivas_spar_get_cldfb_gains_fx( return; } + + Word16 ivas_is_res_channel( const Word16 ch, /* i : ch index in WYZX ordering Q0*/ const Word16 nchan_transport /* i : number of transport channels (1-4) Q0*/ @@ -1161,53 +1151,62 @@ void ivas_spar_get_parameters_fx( split_band = SPAR_DIRAC_SPLIT_START_BAND; move16(); -#ifdef FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_USE_MADD_ADD_WEIGHTS Word16 add_weight_fx = sub( MAX_WORD16, weight_fx ); Word16 add_weight_20ms_fx = sub( MAX_WORD16, weight_20ms_fx ); -#endif - FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + Word16 out_flag[IVAS_MAX_FB_MIXER_OUT_CH]; + + Word32 band_bool = LT_16( split_band, IVAS_MAX_NUM_BANDS ); + + FOR( out_ch = 0; out_ch < num_ch_out; out_ch++ ) { - FOR( out_ch = 0; out_ch < num_ch_out; out_ch++ ) + /* 20ms cross-fade for Transport channels in all frequency bands */ + /* sub-frame processing for missing channels in all frequency bands*/ + out_flag[out_ch] = band_bool && ( 0 == ivas_is_res_channel( out_ch, hSpar->hMdDec->spar_md_cfg.nchan_transport ) ); + move16(); + } + Word32 frame_bool = GT_16( hSpar->i_subframe, 3 ); + + FOR( out_ch = 0; out_ch < num_ch_out; out_ch++ ) + { + IF( out_flag[out_ch] ) { - test(); - IF( LT_16( split_band, IVAS_MAX_NUM_BANDS ) - /* 20ms cross-fade for Transport channels in all frequency bands */ - && ( 0 == ivas_is_res_channel( out_ch, hSpar->hMdDec->spar_md_cfg.nchan_transport ) ) /* sub-frame processing for missing channels in all frequency bands*/ - ) + IF( frame_bool ) { - FOR( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) { - IF( GT_16( hSpar->i_subframe, 3 ) ) + FOR( in_ch = 0; in_ch < num_ch_in; in_ch++ ) { -#ifndef FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_USE_MADD_ADD_WEIGHTS - par_mat_fx[out_ch][in_ch][spar_band] = L_add_sat( Mpy_32_16_1( hSpar->hMdDec->mixer_mat_prev_fx[ts0][out_ch][in_ch][spar_band], sub( MAX_WORD16, weight_fx ) ), - Mpy_32_16_1( hSpar->hMdDec->mixer_mat_prev_fx[ts1][out_ch][in_ch][spar_band], weight_fx ) ); /*hSpar->hMdDec->Q_mixer_mat*/ -#else par_mat_fx[out_ch][in_ch][spar_band] = Madd_32_16( Mpy_32_16_1( hSpar->hMdDec->mixer_mat_prev_fx[ts1][out_ch][in_ch][spar_band], weight_fx ), hSpar->hMdDec->mixer_mat_prev_fx[ts0][out_ch][in_ch][spar_band], add_weight_fx ); -#endif move32(); } - ELSE + } + } + ELSE + { + FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + FOR( in_ch = 0; in_ch < num_ch_in; in_ch++ ) { - par_mat_fx[out_ch][in_ch][spar_band] = hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][spar_band]; /*hSpar->hMdDec->Q_mixer_mat*/ - move32(); + { + par_mat_fx[out_ch][in_ch][spar_band] = hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][spar_band]; /*hSpar->hMdDec->Q_mixer_mat*/ + move32(); + } } } } - ELSE + } + ELSE + { + FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) { FOR( in_ch = 0; in_ch < num_ch_in; in_ch++ ) { /* 20ms Transport channel reconstruction with matching encoder/decoder processing */ Word16 prev_idx = SPAR_DIRAC_SPLIT_START_BAND < IVAS_MAX_NUM_BANDS ? 1 : 0; /* if SPAR_DIRAC_SPLIT_START_BAND == IVAS_MAX_NUM_BANDS, then the sub-frame mixer_mat delay line is not active */ move16(); -#ifndef FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_USE_MADD_ADD_WEIGHTS - par_mat_fx[out_ch][in_ch][spar_band] = L_add_sat( Mpy_32_16_1( hSpar->hMdDec->mixer_mat_prev_fx[prev_idx][out_ch][in_ch][spar_band], sub( MAX_WORD16, weight_20ms_fx ) ), Mpy_32_16_1( hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][spar_band], weight_20ms_fx ) ); /*hSpar->hMdDec->Q_mixer_mat*/ -#else par_mat_fx[out_ch][in_ch][spar_band] = Madd_32_16( Mpy_32_16_1( hSpar->hMdDec->mixer_mat_prev_fx[prev_idx][out_ch][in_ch][spar_band], add_weight_20ms_fx ), hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][spar_band], weight_20ms_fx ); /*hSpar->hMdDec->Q_mixer_mat*/ -#endif move32(); } } @@ -1310,8 +1309,10 @@ static void ivas_spar_calc_smooth_facs_fx( Word32 smooth_short_avg_fx[IVAS_MAX_NUM_BANDS]; Word32 L_temp; Word16 exp_tmp, q_tmp; + bin = 0; move16(); + FOR( b = 0; b < nbands_spar; b++ ) { test(); @@ -1367,17 +1368,10 @@ static void ivas_spar_calc_smooth_facs_fx( smooth_long_avg_fx[b] = L_add( smooth_long_avg_fx[b], smooth_buf_fx[b][i] ); // Q0 move32(); } -#ifndef FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_HQ_CONSTANTS - smooth_short_avg_fx[b] = Mpy_32_16_1( smooth_short_avg_fx[b], 5461 /*(1/6 in Q15)*/ ); // Q0 - move32(); - smooth_long_avg_fx[b] = Mpy_32_16_1( smooth_long_avg_fx[b], 1639 /*(1/20 in Q15)*/ ); // Q0 - move32(); -#else - smooth_short_avg_fx[b] = Mpy_32_32( smooth_short_avg_fx[b], 357913941 /*(1/6 in Q31)*/ ); // Q0 + smooth_short_avg_fx[b] = Mpy_32_32( smooth_short_avg_fx[b], 357913941 /*(1/6 in Q31)*/ ); // Q0 move32(); smooth_long_avg_fx[b] = Mpy_32_32( smooth_long_avg_fx[b], 107374182 /*(1/20 in Q31)*/ ); // Q0 move32(); -#endif /* calculate smoothing factor based on energy averages */ /* reduce factor for higher short-term energy */ @@ -1554,9 +1548,9 @@ void ivas_spar_dec_set_render_map_fx( /*-------------------------------------------------------------------* - * ivas_spar_dec_upmixer() + * ivas_spar_dec_set_render_params() * - * IVAS SPAR upmixer + * IVAS SPAR set rendering parameters *-------------------------------------------------------------------*/ void ivas_spar_dec_set_render_params_fx( @@ -1622,9 +1616,7 @@ void ivas_spar_dec_digest_tc_fx( } /* TD decorrelator */ - Word32 quo, rem; - iDiv_and_mod_32( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC, &quo, &rem, 0 ); - default_frame = extract_l( quo ); /*Q0*/ + default_frame = extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); nSamplesLeftForTD = nSamplesForRendering; /*Q0*/ move16(); nchan_internal = ivas_sba_get_nchan_metadata_fx( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); /*Q0*/ @@ -1641,7 +1633,6 @@ void ivas_spar_dec_digest_tc_fx( IF( hSpar->hTdDecorr ) { - ivas_td_decorr_process_fx( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); st_ivas->hTcBuffer->q_tc_fx = s_min( st_ivas->hTcBuffer->q_tc_fx, q_format ); move16(); @@ -1689,22 +1680,18 @@ void ivas_spar_dec_upmixer_sf_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ Word32 *output_fx[], /* o : output audio channels Q11*/ const Word16 nchan_internal /* i : number of internal channels Q0*/ -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - , - Word16 out_len -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ ) { Word16 cldfb_band, num_cldfb_bands, numch_in, numch_out; - Word32 *cldfb_in_ts_re_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX]; - Word32 *cldfb_in_ts_im_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX]; + Word32 *cldfb_in_ts_re_fx[HOA3_CHANNELS][CLDFB_NO_COL_MAX]; + Word32 *cldfb_in_ts_im_fx[HOA3_CHANNELS][CLDFB_NO_COL_MAX]; Word16 i, b, ts, out_ch, in_ch; Word16 num_spar_bands, spar_band, nchan_transport; Word16 num_in_ingest, split_band; Word16 slot_size, slot_idx_start; Word16 md_idx; - Word32 *p_tc_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; - Word32 Pcm_tmp_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; + Word32 *p_tc_fx[HOA3_CHANNELS]; + Word32 Pcm_tmp_fx[HOA3_CHANNELS][2 /* Re, Im*/ * L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; Word16 numch_out_dirac; Word32 mixer_mat_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; Word16 b_skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; @@ -1714,6 +1701,7 @@ void ivas_spar_dec_upmixer_sf_fx( Word16 q1 = 30; Word16 prod; move16(); + push_wmops( "ivas_spar_dec_upmixer_sf_fx" ); hSpar = st_ivas->hSpar; hDecoderConfig = st_ivas->hDecoderConfig; @@ -1747,9 +1735,7 @@ void ivas_spar_dec_upmixer_sf_fx( p_tc_fx[i] = st_ivas->hTcBuffer->tc_fx[( i + nchan_ism )] + prod; /*Q11*/ } - test(); - test(); - IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { FOR( i = 0; i < nchan_ism; i++ ) { @@ -1765,7 +1751,6 @@ void ivas_spar_dec_upmixer_sf_fx( } } - /*---------------------------------------------------------------------* * TD Decorr and pcm ingest *---------------------------------------------------------------------*/ @@ -1788,19 +1773,17 @@ void ivas_spar_dec_upmixer_sf_fx( hSpar->hFbMixer->fb_cfg->num_in_chans = num_in_ingest; /*Q0*/ move16(); - /*---------------------------------------------------------------------* * Prepare CLDFB buffers *---------------------------------------------------------------------*/ -#ifdef MSAN_FIX - set_zero_fx( &Pcm_tmp_fx[0][0], ( MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS ) * L_FRAME48k ); -#endif // MSAN_FIX + set_zero_fx( &Pcm_tmp_fx[0][0], HOA3_CHANNELS * 2 * L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES ); + /* set-up pointers */ IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) { /* at this point, output channels are used as intermediate procesing buffers */ - FOR( in_ch = 0; in_ch < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; in_ch++ ) + FOR( in_ch = 0; in_ch < HOA3_CHANNELS; in_ch++ ) { FOR( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) { @@ -1835,7 +1818,6 @@ void ivas_spar_dec_upmixer_sf_fx( numch_out_dirac = hDecoderConfig->nchan_out; move16(); - /* CLDFB analysis of incoming frame */ FOR( in_ch = 0; in_ch < numch_in; in_ch++ ) { @@ -1864,16 +1846,15 @@ void ivas_spar_dec_upmixer_sf_fx( test(); test(); - IF( ( LT_32( hDecoderConfig->ivas_total_brate, IVAS_24k4 ) ) && ( ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA2 ) ) || ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA3 ) ) ) ) + IF( LT_32( hDecoderConfig->ivas_total_brate, IVAS_24k4 ) && ( EQ_32( st_ivas->intern_config, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_32( st_ivas->intern_config, IVAS_AUDIO_CONFIG_HOA3 ) ) ) { Word16 q_cldfb = 6; move16(); ivas_spar_calc_smooth_facs_fx( cldfb_in_ts_re_fx[0], cldfb_in_ts_im_fx[0], q_cldfb, num_spar_bands, hSpar->subframe_nbslots[hSpar->subframes_rendered], hSpar->subframes_rendered == 0, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_buf_fx ); } -#ifdef FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_USE_UNIQUE_SHL + Word16 sh_l = sub( 31, q1 ); -#endif FOR( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { md_idx = hSpar->render_to_md_map[( ts + slot_idx_start )]; /*Q0*/ @@ -1885,22 +1866,16 @@ void ivas_spar_dec_upmixer_sf_fx( test(); test(); - IF( ( LT_32( hDecoderConfig->ivas_total_brate, IVAS_24k4 ) ) && ( ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA2 ) ) || ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA3 ) ) ) ) + IF( LT_32( hDecoderConfig->ivas_total_brate, IVAS_24k4 ) && ( EQ_32( st_ivas->intern_config, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_32( st_ivas->intern_config, IVAS_AUDIO_CONFIG_HOA3 ) ) ) { FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE Word16 diff = sub( 32767, hSpar->hMdDec->smooth_fac_fx[spar_band] ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ FOR( out_ch = 0; out_ch < numch_out; out_ch++ ) { FOR( in_ch = 0; in_ch < numch_in; in_ch++ ) { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE mixer_mat_fx[out_ch][in_ch][spar_band] = Madd_32_16( Mpy_32_16_1( mixer_mat_fx[out_ch][in_ch][spar_band], diff ), hSpar->hMdDec->mixer_mat_prev2_fx[out_ch][in_ch][spar_band], hSpar->hMdDec->smooth_fac_fx[spar_band] ); /*q1*/ -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - mixer_mat_fx[out_ch][in_ch][spar_band] = Madd_32_16( Mpy_32_16_1( mixer_mat_fx[out_ch][in_ch][spar_band], sub( 32767, hSpar->hMdDec->smooth_fac_fx[spar_band] ) ), hSpar->hMdDec->mixer_mat_prev2_fx[out_ch][in_ch][spar_band], hSpar->hMdDec->smooth_fac_fx[spar_band] ); /*q1*/ -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ move32(); hSpar->hMdDec->mixer_mat_prev2_fx[out_ch][in_ch][spar_band] = mixer_mat_fx[out_ch][in_ch][spar_band]; /*q1*/ move32(); @@ -1908,68 +1883,7 @@ void ivas_spar_dec_upmixer_sf_fx( } } } -#ifndef FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_SPLIT_LOOPS - FOR( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ ) - { - Word32 out_re_fx[IVAS_SPAR_MAX_CH]; - Word32 out_im_fx[IVAS_SPAR_MAX_CH]; - Word32 cldfb_par_fx; /*q1*/ - ivas_fb_bin_to_band_data_t *bin2band = &hSpar->hFbMixer->pFb->fb_bin_to_band; - FOR( out_ch = 0; out_ch < numch_out; out_ch++ ) - { - out_re_fx[out_ch] = 0; - move32(); - out_im_fx[out_ch] = 0; - move32(); - FOR( in_ch = 0; in_ch < numch_in; in_ch++ ) - { - IF( b_skip_mat[out_ch][in_ch] == 0 ) - { - IF( LT_16( cldfb_band, CLDFB_PAR_WEIGHT_START_BAND ) ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ - { - spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; /*Q0*/ - move16(); - cldfb_par_fx = mixer_mat_fx[out_ch][in_ch][spar_band]; /*q1*/ - move32(); - } - ELSE - { - Word64 acc = 0; - move64(); - FOR( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) - { - /* accumulate contributions from all SPAR bands */ - acc = W_mac_32_32( acc, mixer_mat_fx[out_ch][in_ch][spar_band], bin2band->pp_cldfb_weights_per_spar_band_fx[cldfb_band][spar_band] ); // q1+ Q23 - } - cldfb_par_fx = W_shl_sat_l( acc, -23 ); // q1 - } - - out_re_fx[out_ch] = Madd_32_32( out_re_fx[out_ch], cldfb_in_ts_re_fx[in_ch][ts][cldfb_band], cldfb_par_fx ); /*q1-25*/ - move32(); - out_im_fx[out_ch] = Madd_32_32( out_im_fx[out_ch], cldfb_in_ts_im_fx[in_ch][ts][cldfb_band], cldfb_par_fx ); /*q1-25*/ - move32(); - } - } - } - - /*update CLDFB data with the parameter-modified data*/ - FOR( out_ch = 0; out_ch < numch_out; out_ch++ ) - { -#ifndef FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_USE_UNIQUE_SHL - cldfb_in_ts_re_fx[out_ch][ts][cldfb_band] = L_shl( out_re_fx[out_ch], sub( 31, q1 ) ); /*Q=6*/ - move32(); - cldfb_in_ts_im_fx[out_ch][ts][cldfb_band] = L_shl( out_im_fx[out_ch], sub( 31, q1 ) ); /*Q=6*/ - move32(); -#else - cldfb_in_ts_re_fx[out_ch][ts][cldfb_band] = L_shl( out_re_fx[out_ch], sh_l ); /*Q=6*/ - move32(); - cldfb_in_ts_im_fx[out_ch][ts][cldfb_band] = L_shl( out_im_fx[out_ch], sh_l ); /*Q=6*/ - move32(); -#endif - } - } -#else /* FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_SPLIT_LOOPS */ /* Note: This version splits the cldfb band loop into 2 loops, removing some inner-loop IF_statements */ Word16 min_cldf_band = s_min( CLDFB_PAR_WEIGHT_START_BAND, num_cldfb_bands ); Word32 out_re_fx[IVAS_SPAR_MAX_CH]; @@ -2004,21 +1918,13 @@ void ivas_spar_dec_upmixer_sf_fx( /*update CLDFB data with the parameter-modified data*/ FOR( out_ch = 0; out_ch < numch_out; out_ch++ ) { -#ifndef FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_USE_UNIQUE_SHL - cldfb_in_ts_re_fx[out_ch][ts][cldfb_band] = L_shl( out_re_fx[out_ch], sub( 31, q1 ) ); /*Q=6*/ - move32(); - cldfb_in_ts_im_fx[out_ch][ts][cldfb_band] = L_shl( out_im_fx[out_ch], sub( 31, q1 ) ); /*Q=6*/ - move32(); -#else cldfb_in_ts_re_fx[out_ch][ts][cldfb_band] = L_shl( out_re_fx[out_ch], sh_l ); /*Q=6*/ move32(); cldfb_in_ts_im_fx[out_ch][ts][cldfb_band] = L_shl( out_im_fx[out_ch], sh_l ); /*Q=6*/ move32(); -#endif } } - /* Second loop from min_cldf_band (CLDFB_PAR_WEIGHT_START_BAND) till num_cldfb_bands */ FOR( ; cldfb_band < num_cldfb_bands; cldfb_band++ ) { @@ -2052,20 +1958,13 @@ void ivas_spar_dec_upmixer_sf_fx( /*update CLDFB data with the parameter-modified data*/ FOR( out_ch = 0; out_ch < numch_out; out_ch++ ) { -#ifndef FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_USE_UNIQUE_SHL - cldfb_in_ts_re_fx[out_ch][ts][cldfb_band] = L_shl( out_re_fx[out_ch], sub( 31, q1 ) ); /*Q=6*/ - move32(); - cldfb_in_ts_im_fx[out_ch][ts][cldfb_band] = L_shl( out_im_fx[out_ch], sub( 31, q1 ) ); /*Q=6*/ - move32(); -#else cldfb_in_ts_re_fx[out_ch][ts][cldfb_band] = L_shl( out_re_fx[out_ch], sh_l ); /*Q=6*/ move32(); cldfb_in_ts_im_fx[out_ch][ts][cldfb_band] = L_shl( out_im_fx[out_ch], sh_l ); /*Q=6*/ move32(); -#endif } } -#endif /* FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_SPLIT_LOOPS */ + test(); IF( ( EQ_16( ( add( add( slot_idx_start, ts ), 1 ) ), hSpar->num_slots ) ) || ( NE_16( ( shr( md_idx, 2 ) /* md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME */ ), ( hSpar->render_to_md_map[( ( slot_idx_start + ts ) + 1 )] / JBM_CLDFB_SLOTS_IN_SUBFRAME /*It's value is 4*/ ) ) ) ) { @@ -2080,12 +1979,6 @@ void ivas_spar_dec_upmixer_sf_fx( } IF( LT_16( split_band, IVAS_MAX_NUM_BANDS ) ) { -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - Copy32( hSpar->hMdDec->mixer_mat_prev_fx[1][0][0], hSpar->hMdDec->mixer_mat_prev_fx[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); /*hSpar->hMdDec->Q_mixer_mat*/ - Copy32( hSpar->hMdDec->mixer_mat_prev_fx[2][0][0], hSpar->hMdDec->mixer_mat_prev_fx[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); /*hSpar->hMdDec->Q_mixer_mat*/ - Copy32( hSpar->hMdDec->mixer_mat_prev_fx[3][0][0], hSpar->hMdDec->mixer_mat_prev_fx[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); /*hSpar->hMdDec->Q_mixer_mat*/ - Copy32( hSpar->hMdDec->mixer_mat_prev_fx[4][0][0], hSpar->hMdDec->mixer_mat_prev_fx[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); /*hSpar->hMdDec->Q_mixer_mat*/ -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ FOR( out_ch = 0; out_ch < numch_out; out_ch++ ) { @@ -2093,7 +1986,6 @@ void ivas_spar_dec_upmixer_sf_fx( { FOR( b = 0; b < num_spar_bands; b++ ) { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE hSpar->hMdDec->mixer_mat_prev_fx[0][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat_prev_fx[1][out_ch][in_ch][b]; hSpar->hMdDec->mixer_mat_prev_fx[1][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat_prev_fx[2][out_ch][in_ch][b]; hSpar->hMdDec->mixer_mat_prev_fx[2][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat_prev_fx[3][out_ch][in_ch][b]; @@ -2102,7 +1994,6 @@ void ivas_spar_dec_upmixer_sf_fx( move32(); move32(); move32(); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ hSpar->hMdDec->mixer_mat_prev_fx[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][( b + ( md_sf * IVAS_MAX_NUM_BANDS ) )]; /*hSpar->hMdDec->Q_mixer_mat*/ move32(); @@ -2119,11 +2010,15 @@ void ivas_spar_dec_upmixer_sf_fx( test(); test(); - IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) ) + test(); + test(); + IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) && !( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && EQ_32( st_ivas->intern_config, IVAS_AUDIO_CONFIG_FOA ) ) ) { ivas_dirac_dec_render_sf_fx( st_ivas, output_fx, nchan_internal, cldfb_in_ts_re_fx, cldfb_in_ts_im_fx ); } + /*------------------------------------------------------------------ends*/ + IF( st_ivas->hDirAC != NULL ) { Word16 outchannels, idx_in, idx_lfe, ch; @@ -2153,29 +2048,13 @@ void ivas_spar_dec_upmixer_sf_fx( test(); test(); test(); - IF( ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) || !( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) && + IF( ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) || !( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) && !( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) ) { -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - Scale_sig32( st_ivas->cldfbSynDec[idx_in]->cldfb_state_fx, st_ivas->cldfbSynDec[idx_in]->p_filter_length, -6 ); /*st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state-6*/ - st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state = sub( st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state, 6 ); - move16(); - Scale_sig32( output_fx[ch], out_len, -6 ); /*Q5*/ -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ FOR( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[idx_in][ts], &cldfb_in_ts_im_fx[idx_in][ts], &output_fx[ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, 6, st_ivas->cldfbSynDec[idx_in] ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[idx_in][ts], &cldfb_in_ts_im_fx[idx_in][ts], &output_fx[ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, st_ivas->cldfbSynDec[idx_in] ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[idx_in][ts], &cldfb_in_ts_im_fx[idx_in][ts], &output_fx[ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, 6, 0, st_ivas->cldfbSynDec[idx_in] ); } -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - Scale_sig32( output_fx[ch], out_len, 6 ); /*Q11*/ - Scale_sig32( st_ivas->cldfbSynDec[idx_in]->cldfb_state_fx, st_ivas->cldfbSynDec[idx_in]->p_filter_length, 6 ); /*st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state+6*/ - st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state = add( st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state, 6 ); - move16(); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ } idx_in = add( idx_in, 1 ); @@ -2187,26 +2066,10 @@ void ivas_spar_dec_upmixer_sf_fx( /* CLDFB to time synthesis (overwrite mixer output) */ FOR( out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) { -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - Scale_sig32( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx, st_ivas->cldfbSynDec[out_ch]->p_filter_length, -6 ); /*st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state-6*/ - st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state = sub( st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state, 6 ); - move16(); - Scale_sig32( output_fx[out_ch], out_len, -6 ); /*Q5*/ -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ FOR( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[out_ch][ts], &cldfb_in_ts_im_fx[out_ch][ts], &output_fx[out_ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, 6, st_ivas->cldfbSynDec[out_ch] ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[out_ch][ts], &cldfb_in_ts_im_fx[out_ch][ts], &output_fx[out_ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, st_ivas->cldfbSynDec[out_ch] ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[out_ch][ts], &cldfb_in_ts_im_fx[out_ch][ts], &output_fx[out_ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, 6, 0, st_ivas->cldfbSynDec[out_ch] ); } -#ifndef OPT_SBA_AVOID_SPAR_RESCALE - Scale_sig32( output_fx[out_ch], out_len, 6 ); /*Q11*/ - Scale_sig32( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx, st_ivas->cldfbSynDec[out_ch]->p_filter_length, 6 ); /*st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state+6*/ - st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state = add( st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state, 6 ); - move16(); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ } } diff --git a/lib_dec/ivas_spar_md_dec_fx.c b/lib_dec/ivas_spar_md_dec_fx.c index 7f487a75c272279cbc0ab168f8116743069db676..248518134d1350dcc9022a80e7571d11a9c2033e 100644 --- a/lib_dec/ivas_spar_md_dec_fx.c +++ b/lib_dec/ivas_spar_md_dec_fx.c @@ -39,11 +39,12 @@ #include "wmc_auto.h" #include "ivas_stat_dec.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" + /*------------------------------------------------------------------------------------------* * Local constants *------------------------------------------------------------------------------------------*/ +#define DEG180_BY_PI_Q24 ( (Word32) 0x394BB835 ) /* 180.0/PI in Q24) */ #define IVAS_DEFAULT_DTX_CNG_RAMP ( 8 ) @@ -1318,14 +1319,12 @@ static void ivas_get_spar_matrices_fx( tmp_C2_re_fx[0][j] = Mpy_32_32( active_w_dm_fac_fx, L_negate( hMdDec->spar_md.band_coeffs[( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )].pred_re_fx[j - 1] ) ); // Q31 *Q22=Q22 move32(); } - re_fx = Mpy_32_32( tmp_C2_re_fx[0][1], tmp_C1_re_fx[1][0] ); // Q22 *Q22 =Q13 - re_fx1 = L_add( ONE_IN_Q13, re_fx ); // Q13+Q13 + re_fx1 = Madd_32_32( ONE_IN_Q13, tmp_C2_re_fx[0][1], tmp_C1_re_fx[1][0] ); // Q13+Q13 - re_fx = Mpy_32_32( tmp_C2_re_fx[0][2], tmp_C1_re_fx[2][0] ); // Q22 *Q22 =Q13 - re_fx1 = L_add( re_fx1, re_fx ); // Q13+Q13 + re_fx1 = Madd_32_32( re_fx1, tmp_C2_re_fx[0][2], tmp_C1_re_fx[2][0] ); // Q13+Q13 - re_fx = Mpy_32_32( tmp_C2_re_fx[0][3], tmp_C1_re_fx[3][0] ); // Q22 *Q22 =Q13 - tmp_dm_re_fx[0][0] = L_shl( L_add( re_fx1, re_fx ), Q9 ); // (Q13+Q13) << Q9 = Q22; + tmp_dm_re_fx[0][0] = L_shl( Madd_32_32( re_fx1, tmp_C2_re_fx[0][3], tmp_C1_re_fx[3][0] ), Q9 ); // (Q13+Q13) << Q9 = Q22; + // move32(); IF( EQ_16( dyn_active_w_flag, 1 ) ) @@ -1401,7 +1400,7 @@ static void ivas_get_spar_matrices_fx( { FOR( k = dmx_ch; k < numch_out; k++ ) { - IF( EQ_16( sub( j, dmx_ch ), sub( k, dmx_ch ) ) ) + IF( EQ_16( j, k ) ) { tmpP_re_fx[j][k] = hMdDec->spar_md.band_coeffs[add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )].P_re_fx[sub( k, dmx_ch )]; // Q22 move32(); @@ -1702,7 +1701,7 @@ static void ivas_spar_dec_parse_md_bs_fx( { *nB = SPAR_DTX_BANDS; move16(); - *bands_bw = idiv1616( num_bands, *nB ); /*Q0*/ + *bands_bw = shr( num_bands, SPAR_DTX_BANDS_LOG2 ); /*Q0*/ move16(); FOR( i = 0; i < *nB; i++ ) @@ -2647,6 +2646,7 @@ static void ivas_parse_parameter_bitstream_dtx( Word32 pr_min_max_fx[2]; Word16 pr_q_lvls, pr, pd, pd_q_lvls, pr_pd_bits; Word16 zero_pad_bits, sid_bits_len; + Word16 sba_spar_bitlen; sid_bits_len = st0->next_bit_pos; /*Q0*/ move16(); @@ -2732,7 +2732,8 @@ static void ivas_parse_parameter_bitstream_dtx( } sid_bits_len = sub( st0->next_bit_pos, sid_bits_len ); - zero_pad_bits = sub( ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ), sid_bits_len ); + sba_spar_bitlen = ivas_sba_spar_sid_bitlen_fx( num_dmx_per_band[0] ); + zero_pad_bits = sub( sba_spar_bitlen, sid_bits_len ); assert( zero_pad_bits >= 0 ); if ( EQ_16( num_dmx_per_band[0], 2 ) ) { @@ -2946,18 +2947,10 @@ void ivas_spar_to_dirac_fx( radius_fx = Sqrt32( temp, &q_temp ); Word16 check_azi_fx = BASOP_util_atan2( dvy_fx[band], dvx_fx[band], 0 ); /*Q13*/ - Word32 check_azi_fx_32 = L_shl( check_azi_fx, 16 ); /*Q29*/ - Word16 check_azi_fx_res; - IF( check_azi_fx_32 < 0 ) - { - check_azi_fx_res = negate( divide3232( L_negate( check_azi_fx_32 ), 1686629760 /*3.145f in Q29*/ ) ); /*Q15*/ - } - ELSE - { - check_azi_fx_res = divide3232( check_azi_fx_32, 1686629760 /*3.145f in Q29*/ ); /*Q15*/ - } - Word32 azi_intermediate = Mpy_32_16_1( DEGREE_180_Q_22, check_azi_fx_res ); /*Q22*/ - azi_intermediate = L_add( azi_intermediate, ONE_IN_Q21 ); /*Q22*/ + + Word32 azi_intermediate = Mpy_32_16_1( DEG180_BY_PI_Q24, check_azi_fx ); + + azi_intermediate = L_add( azi_intermediate, ONE_IN_Q21 ); /*Q22*/ Word16 azi_res; IF( azi_intermediate < 0 ) @@ -2970,18 +2963,8 @@ void ivas_spar_to_dirac_fx( } Word16 check_ele_fx = BASOP_util_atan2( dvz_fx[band], radius_fx, sub( add( 9, q_dvnorm ), q_temp ) ); /*Q13*/ - Word32 check_ele_fx_32 = L_shl( check_ele_fx, 16 ); /*Q29*/ - Word16 check_ele_fx_res; - IF( check_azi_fx_32 < 0 ) - { - check_ele_fx_res = negate( divide3232( L_negate( check_ele_fx_32 ), 1686629760 /*3.145f in Q29*/ ) ); /*Q15*/ - } - ELSE - { - check_ele_fx_res = divide3232( check_ele_fx_32, 1686629760 /*3.145f in Q29*/ ); /*Q15*/ - } - Word32 ele_intermediate = Mpy_32_16_1( DEGREE_180_Q_22, check_ele_fx_res ); /*Q22*/ - ele_intermediate = L_add( ele_intermediate, ONE_IN_Q21 ); /*Q22*/ + Word32 ele_intermediate = Mpy_32_16_1( DEG180_BY_PI_Q24, check_ele_fx ); + ele_intermediate = L_add( ele_intermediate, ONE_IN_Q21 ); /*Q22*/ Word16 ele_res; IF( ele_intermediate < 0 ) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 5704f4f60cef9c0e4ed840230ac1f5165ac09f04..16c164cc4c63d0526f89f1c979d787264fd727ac 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -463,6 +463,9 @@ typedef struct ivas_param_ism_dec_data_structure Word32 elevation_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS]; /* Q22 */ Word16 power_ratios_fx[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS][MAX_PARAM_ISM_WAVE]; /* Q15 */ + Word32 edited_azimuth_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS]; // Q22 + Word32 edited_elevation_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS]; // Q22 + /*sub-modules*/ PARAM_ISM_CONFIG_HANDLE hParamIsm; /* Parametric ISM common handle */ PARAM_ISM_RENDERING_HANDLE hParamIsmRendering; /* ParamISM rendering handle */ @@ -573,7 +576,7 @@ typedef struct ivas_param_mc_dec_data_structure Word32 *proto_matrix_int_fx; Word16 proto_matrix_int_len; Word16 proto_matrix_int_e; - + Word16 proto_frame_f_fx_q; /*sub-modules*/ HANDLE_DIRAC_DECORR_PARAMS h_freq_domain_decorr_ap_params; HANDLE_DIRAC_DECORR_STATE h_freq_domain_decorr_ap_state; @@ -715,6 +718,8 @@ typedef struct ivas_osba_data Word16 delayBuffer_size; Word16 delayBuffer_nchan; + Word32 gain_bed_fx; // Q29 + } SBA_ISM_DATA, *SBA_ISM_DATA_HANDLE; @@ -834,7 +839,7 @@ typedef struct ivas_lfe_dec_data_structure LFE_WINDOW_HANDLE pWindow_state; const UWord16 *cum_freq_models[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; Word16 lfe_dec_indices_coeffs_tbl[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; - Word16 lfe_block_delay_s_fx; /* Q15 */ + Word32 delay_ns; /* Q0 */ Word16 lfe_prior_buf_len; Word32 prior_out_buffer_fx[L_FRAME48k]; /* Q9 */ @@ -852,37 +857,37 @@ typedef struct ivas_lfe_dec_data_structure typedef struct renderer_struct { - Word32 prev_gains_fx[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; /*Q30*/ - Word16 *interpolator_fx; /*Q15*/ + Word32 prev_gains_fx[MAX_NUM_OBJECTS][MAX_OUTPUT_CHANNELS]; /*Q30*/ + Word16 *interpolator_fx; /*Q15*/ Word16 interpolator_len; - Word32 gains_fx[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; /*Q30*/ + Word16 interp_offset_fx; + Word32 gains_fx[MAX_NUM_OBJECTS][MAX_OUTPUT_CHANNELS]; /*Q30*/ } ISM_RENDERER_DATA, *ISM_RENDERER_HANDLE; -/* Fastconv binaural data structure */ -typedef struct ivas_binaural_rendering_struct -{ - /* Common variables for all modules */ - IVAS_OUTPUT_SETUP_HANDLE hInputSetup; /* pointer to input spatial format for binaural renderer*/ - EFAP_HANDLE hEFAPdata; /* EFAP structure*/ - Word32 *hoa_dec_mtx; /* pointer to HOA decoder mtx */ /*Q29*/ - Word8 rotInCldfb; /* Flag to enable rotation within bin Renderer in CLDFB*/ - Word16 max_band; /* band upto which rendering is performed */ - Word16 conv_band; /* band upto which convolution in cldfb domain is performed */ - Word16 timeSlots; /* number of time slots of binaural renderer */ - Word16 nInChannels; /* number input channels */ - Word8 render_lfe; /* Flag to render LFE in binaural rendering*/ - IVAS_FORMAT ivas_format; /* format; corresponds to st_ivas->ivas_format, unless the signal gets transormed to a different domain for rendering */ - /* Convolution module structure */ - BINRENDERER_CONV_MODULE_HANDLE_FX hBinRenConvModule; +/*----------------------------------------------------------------------------------* + * IVAS decoder specific ISAR wrapper structures + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + Word32 Cldfb_RealBuffer_fx[MAX_OUTPUT_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* Double space to account for TSM */ + Word32 Cldfb_ImagBuffer_fx[MAX_OUTPUT_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + IVAS_AUDIO_CONFIG config; - /* Variables related to reverberator module */ - Word32 earlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; - REVERB_STRUCT_HANDLE hReverb; +} ISAR_DEC_SPLIT_REND_CLDFB_OUT_DATA, *ISAR_DEC_SPLIT_REND_CLDFB_OUT_DATA_HANDLE; -} BINAURAL_RENDERER, *BINAURAL_RENDERER_HANDLE; +typedef struct +{ + TD_RINGBUF_HANDLE hMultiBinTdData; + ISAR_CLDFB_RINGBUF_HANDLE hMultiBinCldfbData[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; + ISAR_SPLIT_REND_BITS_HANDLE hSplitRendBits; /*scratch buffer for frame by frame processing*/ + SPLIT_REND_WRAPPER splitrend; + ISAR_DEC_SPLIT_REND_CLDFB_OUT_DATA_HANDLE hCldfbDataOut; /*buffer to store cldfb data before binauralization*/ + Word16 numTdSamplesPerChannelCached; +} ISAR_DEC_SPLIT_REND_WRAPPER, *ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE; /*----------------------------------------------------------------------------------* * MASA decoder structures @@ -919,36 +924,71 @@ typedef struct ivas_masa_decoder_struct } MASA_DECODER, *MASA_DECODER_HANDLE; +/* Data structure for MASA_ISM EXT rendering */ +typedef struct ivas_masa_ism_ext_data_structure +{ + Word16 prev_idx_separated_ism; // Q0 (Integer) + Word32 prev_panning_gains[MAX_NUM_OBJECTS][2]; // Q31 + Word16 ism_render_proto_energy_exp[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; // Q0 (Integer exponent) + Word32 ism_render_proto_energy_frac[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; // Q31 + Word16 ism_render_target_energy_exp[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; // Q0 (Integer exponent) + Word32 ism_render_target_energy_frac[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; // Q31 + Word16 masa_render_proto_energy_exp[CLDFB_NO_CHANNELS_MAX]; // Q0 (Integer exponent) + Word32 masa_render_proto_energy_frac[CLDFB_NO_CHANNELS_MAX]; // Q31 + Word16 masa_render_target_energy_exp[CLDFB_NO_CHANNELS_MAX]; // Q0 (Integer exponent) + Word32 masa_render_target_energy_frac[CLDFB_NO_CHANNELS_MAX]; // Q31 + Word32 masa_render_masa_to_total[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR][CLDFB_NO_CHANNELS_MAX]; // Q30 + +} MASA_ISM_EXT_DATA, *MASA_ISM_EXT_DATA_HANDLE; + /* Data structure for MASA_ISM rendering */ typedef struct ivas_masa_ism_data_structure { - Word16 azimuth_ism[MAX_NUM_OBJECTS][MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; - Word16 elevation_ism[MAX_NUM_OBJECTS][MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; + Word16 azimuth_ism_fx[MAX_NUM_OBJECTS][MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; // Q0 + Word16 elevation_ism_fx[MAX_NUM_OBJECTS][MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; // Q0 Word32 energy_ratio_ism_fx[MAX_NUM_OBJECTS][MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR][CLDFB_NO_CHANNELS_MAX]; /* Q30 */ Word32 masa_to_total_energy_ratio_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; /* Q30 */ - Word16 azimuth_ism_edited[MAX_NUM_OBJECTS]; - Word16 elevation_ism_edited[MAX_NUM_OBJECTS]; - UWord8 ism_is_edited[MAX_NUM_OBJECTS]; + Word16 azimuth_ism_edited_fx[MAX_NUM_OBJECTS]; // Q0 + Word16 elevation_ism_edited_fx[MAX_NUM_OBJECTS]; // Q0 + + UWord8 ism_dir_is_edited[MAX_NUM_OBJECTS]; + Word16 gain_ism_fx[MAX_NUM_OBJECTS]; + Word16 gain_masa_fx; + + Word16 gain_ism_edited_fx[MAX_NUM_OBJECTS]; // Q12 + UWord8 ism_gain_is_edited[MAX_NUM_OBJECTS]; + Word16 gain_masa_edited_fx; // Q12 + UWord8 masa_gain_is_edited; Word16 idx_separated_ism; - Word16 azimuth_separated_ism[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; - Word16 elevation_separated_ism[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; + Word16 azimuth_separated_ism_fx[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; + Word16 elevation_separated_ism_fx[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR]; Word32 q_azimuth_old_fx[MAX_NUM_OBJECTS]; /* Q22 */ Word32 q_elevation_old_fx[MAX_NUM_OBJECTS]; /* Q22 */ - Word16 ismPreprocMatrix_fx[2][2][CLDFB_NO_CHANNELS_MAX]; /* Q15 */ - UWord8 objectsMoved; - Word32 eneMoveIIR_fx[2][CLDFB_NO_CHANNELS_MAX]; /*Q-22*/ - Word32 enePreserveIIR_fx[2][CLDFB_NO_CHANNELS_MAX]; /*Q-22*/ - Word32 preprocEneTarget_fx[CLDFB_NO_CHANNELS_MAX]; /*Q-19*/ - Word32 preprocEneRealized_fx[CLDFB_NO_CHANNELS_MAX]; /*Q-19*/ + UWord8 objectsEdited; + Word32 preprocEneTarget_fx[MASA_FREQUENCY_BANDS]; + Word16 preprocEneTarget_e[MASA_FREQUENCY_BANDS]; + Word32 preprocEneRealized_fx[MASA_FREQUENCY_BANDS]; + Word16 preprocEneRealized_e[MASA_FREQUENCY_BANDS]; + Word32 ismPreprocMatrix_fx[2][2][MASA_FREQUENCY_BANDS]; // Q28? + // Word16 ismPreprocMatrix_e[2][2][MASA_FREQUENCY_BANDS]; // Not needed? + Word32 eneMoveIIR_fx[2][MASA_FREQUENCY_BANDS]; + Word16 eneMoveIIR_e[2][MASA_FREQUENCY_BANDS]; + Word32 enePreserveIIR_fx[2][MASA_FREQUENCY_BANDS]; + Word16 enePreserveIIR_e[2][MASA_FREQUENCY_BANDS]; + Word32 eneOrigIIR_fx[MASA_FREQUENCY_BANDS]; + Word16 eneOrigIIR_e[MASA_FREQUENCY_BANDS]; + Word16 bits_ism[MAX_NUM_OBJECTS]; Word32 **delayBuffer_fx; /* Q11 */ Word16 delayBuffer_size; Word16 delayBuffer_nchan; + MASA_ISM_EXT_DATA_HANDLE hExtData; + } MASA_ISM_DATA, *MASA_ISM_DATA_HANDLE; @@ -958,12 +998,10 @@ typedef struct ivas_masa_ism_data_structure typedef struct decoder_tc_buffer_structure { - Word32 *tc_buffer_fx; /* the buffer itself */ - Word16 tc_buff_len; /*stores memory length of tc buffer*/ - Word32 *tc_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; /* pointers into the buffer to the beginning of each tc Q11 for ivas */ // VE2SB: TBV -#ifdef MSAN_FIX - Word16 no_channels; /*Stores no of channels in tc_fx with values*/ -#endif + Word32 *tc_buffer_old_fx[MAX_INTERN_CHANNELS]; /* TC audio samples not rendered in the previous frame */ + Word32 *tc_buffer_fx; /* the buffer itself */ + Word32 *tc_fx[MAX_INTERN_CHANNELS]; /* pointers into the buffer to the beginning of each tc */ + Word16 no_channels; /*Stores no of channels in tc_fx with values*/ Word16 q_tc_fx; TC_BUFFER_MODE tc_buffer_mode; /* mode of the buffer (no buffering, render buffering, out buffering) */ Word16 nchan_transport_jbm; /* number of TCs after TC decoding */ @@ -981,6 +1019,8 @@ typedef struct decoder_tc_buffer_structure Word16 num_slots; Word16 n_samples_discard; /* number of samples to discard from the beginning of the output */ + Word32 *tc_buffer2_fx; /* non-scaled buffer of output audio - needed only when '*tc_buffer* is not long enough */ + } DECODER_TC_BUFFER, *DECODER_TC_BUFFER_HANDLE; typedef struct jbm_metadata_structure @@ -1010,23 +1050,25 @@ typedef struct jbm_metadata_structure typedef struct decoder_config_structure { - Word32 ivas_total_brate; /* IVAS total bitrate in bps */ - Word32 last_ivas_total_brate; /* last IVAS total bitrate in bps */ - Word32 output_Fs; /* output signal sampling frequency in Hz */ - Word16 nchan_out; /* number of output audio channels */ - AUDIO_CONFIG output_config; /* output audio configuration */ - Word16 Opt_LsCustom; /* indicates whether loudspeaker custom setup is used */ - Word16 Opt_HRTF_binary; /* indicates whether HRTF binary file is used */ - Word16 Opt_Headrotation; /* indicates whether head-rotation is used */ - Word16 Opt_RendConfigCustom; /* indicates whether Renderer configuration custom setup is used */ - IVAS_HEAD_ORIENT_TRK_T orientation_tracking; /* indicates orientation tracking type */ - Word16 Opt_non_diegetic_pan; /* indicates diegetic or not */ - Word16 non_diegetic_pan_gain_fx; /* non diegetic panning gain*/ /* Q15 */ - Word16 Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ - Word16 Opt_ExternalOrientation; /* indiates whether external orientations are used */ - Word16 Opt_dpid_on; /* indicates whether Directivity pattern option is used */ - Word16 Opt_aeid_on; /* indicates whether Acoustic environment option is used */ - Word16 Opt_tsm; /* indicates whether time scaling modification is activated */ + Word32 ivas_total_brate; /* IVAS total bitrate in bps */ + Word32 last_ivas_total_brate; /* last IVAS total bitrate in bps */ + Word32 output_Fs; /* output signal sampling frequency in Hz */ + Word16 nchan_out; /* number of output audio channels */ + AUDIO_CONFIG output_config; /* output audio configuration */ + Word16 Opt_LsCustom; /* indicates whether loudspeaker custom setup is used */ + Word16 Opt_HRTF_binary; /* indicates whether HRTF binary file is used */ + Word16 Opt_Headrotation; /* indicates whether head-rotation is used */ + Word16 Opt_RendConfigCustom; /* indicates whether Renderer configuration custom setup is used */ + IVAS_ROOM_SIZE_T Opt_RoomSize; /* Selected room size */ + IVAS_HEAD_ORIENT_TRK_T orientation_tracking; /* indicates orientation tracking type */ + Word16 Opt_non_diegetic_pan; /* indicates diegetic or not */ + Word16 non_diegetic_pan_gain_fx; /* non diegetic panning gain, Q15 */ + Word16 Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ + Word16 Opt_ExternalOrientation; /* indicates whether external orientations are used */ + Word16 Opt_dpid_on; /* indicates whether Directivity pattern option is used */ + Word16 Opt_aeid_on; /* indicates whether Acoustic environment option is used */ + Word16 Opt_ObjEdit_on; /* indicates whether object editing option is used */ + Word16 Opt_tsm; /* indicates whether time scaling modification is activated */ IVAS_RENDER_FRAMESIZE render_framesize; Word16 Opt_delay_comp; /* flag indicating delay compensation active */ @@ -1047,8 +1089,8 @@ typedef struct Decoder_Struct IVAS_FORMAT ivas_format; /* IVAS format */ IVAS_FORMAT last_ivas_format; /* last frame IVAS format */ - Word16 sid_format; /* IVAS format indicator from SID frame */ - Word16 nchan_transport; /* number of transport channels */ + Word16 sid_format; /* IVAS format indicator from SID frame */ + Word16 nchan_transport; /* number of transport channels */ IVAS_OUTPUT_SETUP hOutSetup; /* output setup structure */ AUDIO_CONFIG intern_config; /* internal audio configuration */ IVAS_OUTPUT_SETUP hIntSetup; /* internal setup structure */ @@ -1056,24 +1098,26 @@ typedef struct Decoder_Struct AUDIO_CONFIG transport_config; /* transport audio configuration */ IVAS_OUTPUT_SETUP hTransSetup; /* transport setup structure */ - Word16 element_mode_init; /* element mode used at initialization */ - Word16 codec_mode; /* Mode 1 or 2 */ - Word16 ini_frame; /* initialization frames counter */ - Word16 ini_active_frame; /* initialization active frames counter */ + Word16 element_mode_init; /* element mode used at initialization */ + Word16 codec_mode; /* Mode 1 or 2 */ + Word16 ini_frame; /* initialization frames counter */ + Word16 ini_active_frame; /* initialization active frames counter */ - Word16 bfi; /* FEC - bad frame indicator */ - Word16 BER_detect; /* BER detect flag */ - Word16 num_bits; /* BER detect flag */ + Word16 bfi; /* FEC - bad frame indicator */ + Word16 BER_detect; /* BER detect flag */ - UWord16 *bit_stream; /* Pointer to bitstream buffer */ - Word16 writeFECoffset; /* parameter for debugging JBM stuff */ + UWord16 *bit_stream; /* Pointer to bitstream buffer */ + Word16 writeFECoffset; /* parameter for debugging JBM stuff */ + + Word32 **mem_hp20_out_fx; /* output signals HP filter memories */ IVAS_LIMITER_HANDLE hLimiter; /* Limiter handle */ + Word32 *p_output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; /* Word32-output audio buffers */ /* core-decoder modules */ - Word16 nSCE; /* number of total SCEs */ - Word16 nCPE; /* number of total CPEs */ - Word16 nCPE_old; /* number of total CPEs available in the last frame before bitrate switching */ + Word16 nSCE; /* number of total SCEs */ + Word16 nCPE; /* number of total CPEs */ + Word16 nCPE_old; /* number of total CPEs available in the last frame before bitrate switching */ SCE_DEC_HANDLE hSCE[MAX_SCE]; /* SCE handles */ CPE_DEC_HANDLE hCPE[MCT_MAX_BLOCKS]; /* CPE handles */ @@ -1092,12 +1136,12 @@ typedef struct Decoder_Struct LFE_DEC_HANDLE hLFE; /* LFE handle */ ISM_MODE ism_mode; /* ISM format mode */ - Word16 nchan_ism; /* number of ISM channels */ + Word16 nchan_ism; /* number of ISM channels */ MC_MODE mc_mode; /* MC format mode */ - Word16 sba_order; /* Ambisonic (SBA) order */ - Word16 sba_planar; /* Ambisonic (SBA) planar flag */ - Word16 sba_analysis_order; /* Ambisonic (SBA) order used for analysis and coding */ - Word16 sba_dirac_stereo_flag; /* flag indicating stereo output for SBA DirAC modes with 1 TC */ + Word16 sba_order; /* Ambisonic (SBA) order */ + Word16 sba_planar; /* Ambisonic (SBA) planar flag */ + Word16 sba_analysis_order; /* Ambisonic (SBA) order used for analysis and coding */ + Word16 sba_dirac_stereo_flag; /* flag indicating stereo output for SBA DirAC modes with 1 TC */ /* rendering modules */ RENDERER_TYPE renderer_type; /* renderer type */ @@ -1106,21 +1150,22 @@ typedef struct Decoder_Struct BINAURAL_RENDERER_HANDLE hBinRenderer; /* fastconv binaural renderer handle */ BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd; /* Time domain binaural object renderer handle */ TDREND_HRFILT_FiltSet_t *hHrtfTD; /* pointer to HRTF data for TD renderer */ - DIRAC_DEC_BIN_HANDLE hDiracDecBin; /* parametric binaural renderer handle */ + DIRAC_DEC_BIN_HANDLE hDiracDecBin[MAX_HEAD_ROT_POSES]; /* parametric binaural renderer handle */ LSSETUP_CONVERSION_HANDLE hLsSetUpConversion; /* MC LS configuration convertion handle */ EFAP_HANDLE hEFAPdata; /* EFAP structure */ VBAP_HANDLE hVBAPdata; /* VBAP structure */ MONO_DOWNMIX_RENDERER_HANDLE hMonoDmxRenderer; /* Mono downmix structure */ CREND_WRAPPER_HANDLE hCrendWrapper; /* Crend handle */ REVERB_HANDLE hReverb; /* Reverb handle */ - HRTFS_CREND_HANDLE hSetOfHRTF; /* Set of HRTFs handle (CRend) */ + HRTFS_CREND_HANDLE hHrtfCrend; /* HRTF tables for CRend binaural renderer */ HRTFS_FASTCONV_HANDLE hHrtfFastConv; /* FASTCONV HRTF tables for binaural rendering */ HRTFS_PARAMBIN_HANDLE hHrtfParambin; /* HRTF tables for parametric binauralizer */ + HRTFS_STATISTICS_HANDLE hHrtfStatistics; /* HRTF statistics handle */ LSSETUP_CUSTOM_HANDLE hLsSetupCustom; /* Custom LS configuration handle */ Word32 *hoa_dec_mtx; /* Pointer to decoder matrix for SBA */ HEAD_TRACK_DATA_HANDLE hHeadTrackData; /* Head tracking data structure */ RENDER_CONFIG_DATA *hRenderConfig; /* Renderer config pointer */ - Word32 binaural_latency_ns; /* Binauralization latency in ns */ + Word32 binaural_latency_ns; /* Binauralization latency in ns */ EXTERNAL_ORIENTATION_HANDLE hExtOrientationData; /* External orientation data structure */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData; /* Combined external and head orientation data structure */ DIRAC_REND_HANDLE hDirACRend; /* DirAC renderer handle */ @@ -1128,21 +1173,27 @@ typedef struct Decoder_Struct MASA_ISM_DATA_HANDLE hMasaIsmData; /* OMASA rendering handle */ SBA_ISM_DATA_HANDLE hSbaIsmData; /* OSBA rendering handle */ + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pAcousticEnvironments; /* Acoustic environment array */ + Word16 acousticEnvironmentsCount; /* Number of acoustic environments in the array*/ + Word16 flag_omasa_brate; + ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend; /* ISAR split binaural rendering handle */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hTdRendHandles[MAX_HEAD_ROT_POSES - 1]; /* TD object renderer handles */ /* JBM module */ DECODER_TC_BUFFER_HANDLE hTcBuffer; /* JBM structure */ JBM_METADATA_HANDLE hJbmMetadata; /* Structure for metadata buffering in JBM */ Word32 last_active_ivas_total_brate; - Word16 ism_extmeta_active; /* Extended metadata active in decoder */ - Word16 ism_extmeta_cnt; /* Change frame counter for extended metadata */ - Word32 **mem_hp20_out_fx; - Word32 *p_output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; /* Word32-output audio buffers */ - Word16 p_out_len;/*Stores the total no of channels for which memory is allocated to p_output_fx*/ - Word16 num_src; - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + Word16 ism_extmeta_active; /* Extended metadata active in decoder */ + Word16 ism_extmeta_cnt; /* Change frame counter for extended metadata */ + +#ifdef TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR + Word16 flushing; +#endif + Word16 restartNeeded; /* Flag to signal decoder restart */ + } Decoder_Struct; /* clang-format on */ diff --git a/lib_dec/ivas_stereo_adapt_GR_dec_fx.c b/lib_dec/ivas_stereo_adapt_GR_dec_fx.c index 2bade4786e8c8fde9f33e95ff0cbdeaaedc95ffb..57166fae4c34e72e6145b560345ef2c264385b84 100644 --- a/lib_dec/ivas_stereo_adapt_GR_dec_fx.c +++ b/lib_dec/ivas_stereo_adapt_GR_dec_fx.c @@ -46,9 +46,9 @@ /*! r: number of bits read */ static Word16 read_GR2( - const UWord16 *bit_stream, /* i : bitstream to be read Q0*/ - Word16 *ind, /* o : parameters read Q0*/ - const Word16 len /* i : number of params to be read Q0*/ + const UWord16 *bit_stream, /* i : bitstream to be read Q0*/ + Word16 *ind, /* o : parameters read Q0*/ + const Word16 len /* i : number of params to be read Q0*/ ) { Word16 i; @@ -103,9 +103,9 @@ static Word16 read_GR2( /*! r: number of bits read */ static Word16 read_GR1( - const UWord16 *bit_stream, /* i : bitstream to be read Q0*/ - Word16 *ind, /* o : parameters read Q0*/ - const Word16 len /* i : number of params to be read Q0*/ + const UWord16 *bit_stream, /* i : bitstream to be read Q0*/ + Word16 *ind, /* o : parameters read Q0*/ + const Word16 len /* i : number of params to be read Q0*/ ) { Word16 i; @@ -159,9 +159,9 @@ static Word16 read_GR1( /*! r: number of bits read */ Word16 read_GR0( - const UWord16 *bit_stream, /* i : bitstream to be read Q0*/ - Word16 *ind, /* o : parameters read Q0*/ - const Word16 len /* i : number of params to be read Q0*/ + const UWord16 *bit_stream, /* i : bitstream to be read Q0*/ + Word16 *ind, /* o : parameters read Q0*/ + const Word16 len /* i : number of params to be read Q0*/ ) { Word16 i; @@ -240,11 +240,11 @@ static ivas_error find_map( *---------------------------------------------------------------------*/ static void decode_adapt_GR_indices1( - const Word16 *ind, /* i : array of input encoded symbols Q0*/ - const Word16 len, /* i : number of parameters to decode Q0*/ - const Word16 no_symb, /* i : number of possible symbols in GR coding Q0*/ - Word16 *out, /* o : array of decoded parameters Q0*/ - const Word16 *map0 /* i : initial mapping array for the adaptive GR Q0*/ + const Word16 *ind, /* i : array of input encoded symbols Q0*/ + const Word16 len, /* i : number of parameters to decode Q0*/ + const Word16 no_symb, /* i : number of possible symbols in GR coding Q0*/ + Word16 *out, /* o : array of decoded parameters Q0*/ + const Word16 *map0 /* i : initial mapping array for the adaptive GR Q0*/ ) { const Word16 *map; @@ -279,8 +279,8 @@ static void decode_adapt_GR_indices1( /*! r: read value */ Word16 get_value( - const UWord16 *bit_stream, /* i : bitstream Q0*/ - const Word16 nbits /* i : number of bits to be read Q0*/ + const UWord16 *bit_stream, /* i : bitstream Q0*/ + const Word16 nbits /* i : number of bits to be read Q0*/ ) { Word16 i; @@ -358,12 +358,12 @@ Word16 read_BS_GR( /*! r: number of bits read */ Word16 read_BS_adapt_GR_sg( - const UWord16 *bit_stream, /* i : bitstream to be read Q0*/ - const Word16 nb, /* i : starting position in bitstream Q0*/ - Word16 *ind1, /* o : decoded side gain values Q0*/ - const Word16 len, /* i : number of params to be read Q0*/ - Word16 *GR_ord, /* o : GR order used (read from bitstream) Q0*/ - const Word16 *map0 /* i : initial map Q0*/ + const UWord16 *bit_stream, /* i : bitstream to be read Q0*/ + const Word16 nb, /* i : starting position in bitstream Q0*/ + Word16 *ind1, /* o : decoded side gain values Q0*/ + const Word16 len, /* i : number of params to be read Q0*/ + Word16 *GR_ord, /* o : GR order used (read from bitstream) Q0*/ + const Word16 *map0 /* i : initial map Q0*/ ) { Word16 b, ind1_tmp[STEREO_DFT_BAND_MAX], ord; diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec_fx.c similarity index 95% rename from lib_dec/ivas_stereo_cng_dec.c rename to lib_dec/ivas_stereo_cng_dec_fx.c index 2291fcea103a5a5abcb12f26aad087a199d599f5..844f4d5946e7ec2280779fa42a703a1c6729e1c7 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec_fx.c @@ -39,7 +39,7 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" + /*------------------------------------------------------------------- * Local constants @@ -59,8 +59,8 @@ #define CM_INIT 50 #define CORR_INIT 8 #define SID_INIT 6 -#define STEREO_CNA_LR_CORR_LT_FILT_FX 2040109440 /* long-term averaging factor for L/R correlation estimation in stereo CNA */ -#define STEREO_CNA_ILD_LT_FILT_FX 1932735283 /* long-term averaging factor for ILD estimation in stereo CNA */ +#define STEREO_CNA_LR_CORR_LT_FILT_FX 2040109440 /* long-term averaging factor for L/R correlation estimation in stereo CNA, == 0.95f */ +#define STEREO_CNA_ILD_LT_FILT_FX 1932735283 /* long-term averaging factor for ILD estimation in stereo CNA, == 0.9f */ /*------------------------------------------------------------------- * stereo_dft_dec_sid_coh() @@ -76,15 +76,15 @@ static void stereo_dft_generate_comfort_noise_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT Stereo decoder handle */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ - const Word16 last_element_mode, /* i : last element mode Q0*/ - Decoder_State *st, /* i/o: Core coder decoder state */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ + const Word16 last_element_mode, /* i : last element mode Q0*/ + Decoder_State *st, /* i/o: Core coder decoder state */ Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers q_dft*/ - Decoder_State *st1, /* i/o: Core coder decoder state secondary channel */ - const Word16 targetGain, /* i : ICA target gain Q13*/ - const Word16 chan, /* i : channel number Q0*/ - const Word16 output_frame, /* i : output frame size Q0*/ - Word16 q_dft /* i : Q of DFT */ + Decoder_State *st1, /* i/o: Core coder decoder state secondary channel */ + const Word16 targetGain, /* i : ICA target gain Q13*/ + const Word16 chan, /* i : channel number Q0*/ + const Word16 output_frame, /* i : output frame size Q0*/ + Word16 q_dft /* i : Q of DFT */ ) { Word16 i, j, k; @@ -242,7 +242,7 @@ static void stereo_dft_generate_comfort_noise_fx( } LR_ratio = extract_h( tdm_ratio_tabl_fx[hStereoCng->last_tdm_idx] ); /* Q15 */ -#ifdef IMPROV_PRECISION +#ifdef IMPROV_COMPLEX tmp16 = shr( hStereoDft->g_state_fx[b], 2 ); tmp_p = add( ONE_IN_Q13, tmp16 ); tmp_s = sub( ONE_IN_Q13, tmp16 ); @@ -342,7 +342,7 @@ static void stereo_dft_generate_comfort_noise_fx( // lp_ener_fx will be in Q6 at this point. // So applying appropriate left shift on the denominator. - factor = L_shr( BASOP_Util_Divide3232_Scale_cadence( st->lp_ener_fx, L_shl( st->L_frame, Q6 ), &q_div ), 1 ); /* fixed factor in the loop below */ /* q_div */ + factor = L_shr( BASOP_Util_Divide3232_Scale_newton( st->lp_ener_fx, L_shl( st->L_frame, Q6 ), &q_div ), 1 ); /* fixed factor in the loop below */ /* q_div */ factor = Sqrt32( factor, &q_div ); q_div = add( q_div, 1 ); @@ -425,7 +425,7 @@ static void stereo_dft_generate_comfort_noise_fx( assert( ftmp > 0 ); q_div = 0; move16(); - ftmp = BASOP_Util_Divide3232_Scale_cadence( L_shl( 1, q_tmp ), ftmp, &q_div ); /* q_div */ + ftmp = BASOP_Util_Divide3232_Scale_newton( L_shl( 1, q_tmp ), ftmp, &q_div ); /* q_div */ /* in float: both a = "div"=(1/(x^2+y^2) and sqrt(a) is used and summed up in the same loop. @@ -698,7 +698,7 @@ static void stereo_dft_generate_comfort_noise_fx( move16(); FOR( k = 0; k < ( hFdCngCom->nFFTpart - 2 ); k++ ) { - factor = BASOP_Util_Divide3232_Scale_cadence( L_add( hFdCngCom->sidNoiseEstLp[k], DELTA_FX ), L_add( st->hFdCngDec->partNoiseShape[k], DELTA_FX ), &q_div ); /* q_div */ + factor = BASOP_Util_Divide3232_Scale_newton( L_add( hFdCngCom->sidNoiseEstLp[k], DELTA_FX ), L_add( st->hFdCngDec->partNoiseShape[k], DELTA_FX ), &q_div ); /* q_div */ q_div = add( q_div, sub( hFdCngCom->sidNoiseEstExp, st->hFdCngDec->partNoiseShape_exp ) ); IF( q_div < 0 ) { @@ -709,12 +709,8 @@ static void stereo_dft_generate_comfort_noise_fx( factor = L_min( L_add( L_shl( hStereoDft->scale_fx, sub( 16, q_div ) ), W_extract_l( W_mult0_32_32( Mpy_32_16_1( L_sub( factor, L_shl( hStereoDft->scale_fx, sub( 16, q_div ) ) ), ONE_BY_MAX_K ), hStereoCng->xfade_frame_counter ) ) ), factor ); /* q_div */ FOR( ; j <= hFdCngCom->part[k]; j++ ) { -#ifdef FIX_ISSUE_1218 /* NOTE: saturation is added here as part of issue 1218 fix. After rescaling the fdcng noise estimation buffers, due to slight precision loss, values may slightly overflow */ hFdCngCom->cngNoiseLevel[j] = L_shl_sat( Mpy_32_32( st->hFdCngDec->bandNoiseShape[j], factor ), q_div ); /* exp(st->hFdCngDec->bandNoiseShape_exp) */ -#else - hFdCngCom->cngNoiseLevel[j] = L_shl( Mpy_32_32( st->hFdCngDec->bandNoiseShape[j], factor ), q_div ); /* exp(st->hFdCngDec->bandNoiseShape_exp) */ -#endif move32(); } } @@ -900,11 +896,11 @@ static void stereo_dft_generate_comfort_noise_fx( * DFT stereo CNG *-------------------------------------------------------------------*/ void stereo_dtf_cng_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ - Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers q_dft*/ - const Word16 output_frame, /* i : output frame size Q0*/ - Word16 q_dft /* i : Q factor of the DFT data */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ + Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers q_dft*/ + const Word16 output_frame, /* i : output frame size Q0*/ + Word16 q_dft /* i : Q factor of the DFT data */ ) { Decoder_State **sts; @@ -948,7 +944,7 @@ void stereo_dtf_cng_fx( void stereo_cng_dec_update( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const Word32 ivas_total_brate /* i : IVAS total bitrate Q0*/ + const Word32 ivas_total_brate /* i : IVAS total bitrate Q0*/ ) { IF( GT_32( hCPE->hCoreCoder[0]->core_brate, SID_2k40 ) ) @@ -1012,8 +1008,8 @@ void stereo_cng_compute_PScorr_fx( Word16 *output_Q, Word32 *c_PS_LT_fx, Word16 Q_c_PS_LT_fx, - const Word16 L_frame_0, /* i : L_frame channel 0 Q0*/ - const Word16 L_frame_1 /* i : L_frame channel 1 Q0*/ + const Word16 L_frame_0, /* i : L_frame channel 0 Q0*/ + const Word16 L_frame_1 /* i : L_frame channel 1 Q0*/ ) { Word16 i; @@ -1135,7 +1131,7 @@ void stereo_cng_compute_PScorr_fx( *-------------------------------------------------------------------*/ static void stereo_cng_compute_LRcorr_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ Word32 *output_fx[CPE_CHANNELS], /* i : Output signal OUTPUT_Q*/ const Word16 output_frame, /* i : Output frame length Q0*/ const Word16 tdm_ratio_idx /* i : TDM ratio index Q0*/ @@ -1339,8 +1335,8 @@ static void stereo_cng_compute_LRcorr_fx( static void FindEmEs_fx( const Word32 *ch1_fx, /* i : Left channel OUTPUT_Q*/ const Word32 *ch2_fx, /* i : right channel OUTPUT_Q*/ - const Word16 len, /* i : length Q0*/ - Word32 *lt_es_em_fx /* i/o: LT energy ratio Q24*/ + const Word16 len, /* i : length Q0*/ + Word32 *lt_es_em_fx /* i/o: LT energy ratio Q24*/ ) { Word16 i; @@ -1398,11 +1394,12 @@ static void FindEmEs_fx( temp_q = 0; move16(); } - log_res = BASOP_Util_Log2( square_res ); - es_em_fx = Mpy_32_32( log_res, 1616107501 ); // 25+30-31 + log_res = L_add( BASOP_Util_Log2( square_res ), L_shl( temp_q, Q25 ) ); + es_em_fx = Mpy_32_32( log_res, 1616107501 /* 5 * (ln(2)/ln(10)) */ ); // 25+30-31 /* long-term estimate */ *lt_es_em_fx = L_add( Mpy_32_32( 858993459, *lt_es_em_fx ), Mpy_32_32( 1288490188, es_em_fx ) ); /* Q24 */ move32(); + return; } @@ -1414,10 +1411,10 @@ static void FindEmEs_fx( *-------------------------------------------------------------------*/ void stereo_cna_update_params_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *output_fx[CPE_CHANNELS], /* i : Output signal OUTPUT_Q*/ - const Word16 output_frame, /* i : Output frame length Q0*/ - const Word16 tdm_ratio_idx /* i : TDM ratio index Q0*/ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *output_fx[CPE_CHANNELS], /* i : Output signal OUTPUT_Q*/ + const Word16 output_frame, /* i : Output frame length Q0*/ + const Word16 tdm_ratio_idx /* i : TDM ratio index Q0*/ ) { Word16 i; @@ -1452,13 +1449,15 @@ void stereo_cna_update_params_fx( { FindEmEs_fx( output_fx[0], output_fx[1], output_frame, &hCPE->lt_es_em_fx ); - hCPE->hStereoCng->first_SID_after_TD = 1; /* Q0 */ move16(); stereo_cng_compute_LRcorr_fx( hCPE, output_fx, output_frame, tdm_ratio_idx ); } ELSE { + hFdCngDec->first_cna_noise_updated = 0; + move16(); + return; } @@ -1476,11 +1475,7 @@ void stereo_cna_update_params_fx( { IF( EQ_16( hCPE->nchan_out, 1 ) ) { -#ifdef OPT_STEREO_32KBPS_V1 c_LR_fx = MAX_32; -#else /* OPT_STEREO_32KBPS_V1 */ - c_LR_fx = MAX_WORD16; -#endif /* OPT_STEREO_32KBPS_V1 */ move32(); c_ILD_fx = 0; move32(); @@ -1543,11 +1538,7 @@ void stereo_cna_update_params_fx( dotLR_fx_q = add( dotLR_fx_q, sub( sub( 31, temp_res_q ), 31 ) ); dotLR_fx = W_deposit32_l( L_shl_sat( W_extract_l( dotLR_fx ), sub( 31, dotLR_fx_q ) ) ); /* Q31 */ /* estimate L/R correlation factor and ILD in time domain */ -#ifdef OPT_STEREO_32KBPS_V1 - c_LR_fx = W_extract_l( dotLR_fx ); /* Q31 */ -#else /* OPT_STEREO_32KBPS_V1 */ - c_LR_fx = extract_h( W_extract_l( dotLR_fx ) ); /* Q15 */ -#endif /* OPT_STEREO_32KBPS_V1 */ + c_LR_fx = W_extract_l( dotLR_fx ); /* Q31 */ temp_res_q = 0; move16(); @@ -1586,24 +1577,15 @@ void stereo_cna_update_params_fx( /* update of long-term ILD and LR correlation factors for stereo CNA */ IF( !hFdCngDec->first_cna_noise_updated ) { -#ifdef OPT_STEREO_32KBPS_V1 hFdCngDec->cna_LR_LT_fx = extract_h( c_LR_fx ); -#else /* OPT_STEREO_32KBPS_V1 */ - hFdCngDec->cna_LR_LT_fx = extract_l( c_LR_fx ); -#endif /* OPT_STEREO_32KBPS_V1 */ move16(); hFdCngDec->cna_ILD_LT_fx = extract_l( c_ILD_fx ); move16(); } ELSE { -#ifdef OPT_STEREO_32KBPS_V1 hFdCngDec->cna_LR_LT_fx = extract_h( L_add_sat( Mpy_32_16_1( STEREO_CNA_LR_CORR_LT_FILT_FX, hFdCngDec->cna_LR_LT_fx ), Mpy_32_32( ONE_IN_Q31 - STEREO_CNA_LR_CORR_LT_FILT_FX, c_LR_fx ) ) ); /* Q31 */ -#else /* OPT_STEREO_32KBPS_V1 */ - hFdCngDec->cna_LR_LT_fx = extract_h( L_add_sat( Mpy_32_16_1( STEREO_CNA_LR_CORR_LT_FILT_FX, hFdCngDec->cna_LR_LT_fx ), - Mpy_32_16_1( L_sub( ONE_IN_Q31, STEREO_CNA_LR_CORR_LT_FILT_FX ), extract_l( c_LR_fx ) ) ) ); /* Q31 */ -#endif /* OPT_STEREO_32KBPS_V1 */ move16(); hFdCngDec->cna_ILD_LT_fx = extract_h( L_add_sat( Mpy_32_16_1( STEREO_CNA_ILD_LT_FILT_FX, hFdCngDec->cna_ILD_LT_fx ), @@ -1615,7 +1597,6 @@ void stereo_cna_update_params_fx( set16_fx( hFdCngDec->cna_cm_fx, hFdCngDec->cna_LR_LT_fx, hFdCngDec->cna_nbands ); } - /* Soft VAD for stereo CNA */ test(); IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) || EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) @@ -1659,8 +1640,8 @@ void stereo_cna_update_params_fx( *-------------------------------------------------------------------*/ void stereo_cng_init_dec_fx( - STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: stereo CNG decoder structure */ - const Word16 *frameSize /* i : pointer to frameSize of channel 0 to be used for channel 1 Q0*/ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: stereo CNG decoder structure */ + const Word16 *frameSize /* i : pointer to frameSize of channel 0 to be used for channel 1 Q0*/ ) { hStereoCng->prev_sid_nodata = 0; diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c deleted file mode 100644 index f0fd1978b2e03862de5a38a572aff48efa0c3002..0000000000000000000000000000000000000000 --- a/lib_dec/ivas_stereo_dft_dec.c +++ /dev/null @@ -1,494 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#include -#include -#include "options.h" -#include -#include "cnst.h" -#include "rom_com.h" -#include "rom_dec.h" -#include "prot_fx.h" -#include "ivas_cnst.h" -#include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" -#include "ivas_rom_dec.h" -#include "wmc_auto.h" -#include "ivas_prot_fx.h" - -/*-------------------------------------------------------------------* - * Local constants - *-------------------------------------------------------------------*/ - -#define STEFI_DELAY_IND( d, buf_ind ) ( ( buf_ind ) + STEREO_DFT_PAST_MAX - ( d ) + 1 ) % STEREO_DFT_PAST_MAX - -#define STEREO_DFT_RES_RATIO_LIMIT_FX ( Word32 )( 0x170A3D71 ) -#define STEREO_DFT_STEFFI_DELAY_SHORT 2 -#define STEREO_DFT_STEFFI_DELAY_LONG 4 -#define STEREO_DFT_STEFFI_DELAY_OFFSET 2 - - -#define STEREO_DFT_BPF_SIZE 40 /* BPF: Number of weights for BPF in DFT: 40*40Hz=1.6kHz*/ - - -/*------------------------------------------------------------------------- - * Local function prototypes - *-------------------------------------------------------------------------*/ - - -/*------------------------------------------------------------------------- - * stereo_dft_dec_create() - * - * Create DFT stereo handle - *------------------------------------------------------------------------*/ - - -/*------------------------------------------------------------------------- - * stereo_dft_dec_open() - * - * Open DFT decoder stereo handle - *-------------------------------------------------------------------------*/ - - -/*------------------------------------------------------------------------- - * stereo_dft_dec_reset() - * - * Reset DFT stereo memories - *------------------------------------------------------------------------*/ - -/*------------------------------------------------------------------------- - * stereo_dft_dec_update() - * - * Update DFT memories for new frame - *-------------------------------------------------------------------------*/ - -/*------------------------------------------------------------------------- - * stereo_dft_dec_destroy() - * - * destroy DFT stereo handle - *-------------------------------------------------------------------------*/ - -void stereo_dft_dec_destroy( - STEREO_DFT_DEC_DATA_HANDLE *hStereoDft_glob /* i/o: decoder DFT stereo handle */ -) -{ - STEREO_DFT_DEC_DATA_HANDLE hStereoDft; - - hStereoDft = *hStereoDft_glob; - - IF( hStereoDft->hConfig != NULL ) - { - free( hStereoDft->hConfig ); - hStereoDft->hConfig = NULL; - } - - IF( hStereoDft->hBpf != NULL ) - { - free( hStereoDft->hBpf ); - hStereoDft->hBpf = NULL; - } - - IF( hStereoDft->hTcxLtpDec != NULL ) - { - free( hStereoDft->hTcxLtpDec ); - hStereoDft->hTcxLtpDec = NULL; - } - - free( hStereoDft ); - hStereoDft = NULL; - - return; -} - - -/*------------------------------------------------------------------------- - * stereo_dft_dec_analyze() - * - * DFT analysis on a 20ms frame - *-------------------------------------------------------------------------*/ - -void stereo_dft_dec_analyze_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const Word32 *input_fx, /* i : input signal q*/ - Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers q_out_DFT*/ - const Word16 chan, /* i : channel number Q0*/ - const Word16 input_frame, /* i : input frame size Q0*/ - const Word16 output_frame, /* i : output frame size Q0*/ - const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */ - const Word16 k_offset, /* i : offset of DFT Q0*/ - const Word16 delay, /* i : delay in samples FOR input signal Q0*/ - Word16 *q, - Word16 *q_out_DFT ) -{ - - Word16 i, k; - STEREO_DFT_DEC_DATA_HANDLE hStereoDft; - Word32 *pInput_fx, *pInput_buff_fx; - Word32 *mem_fx, input_buff_fx[STEREO_DFT32MS_OVL_MAX + L_FRAME48k]; - Word32 DFT_fx[STEREO_DFT32MS_N_MAX], *pDFT_out_fx; - Word16 NFFT, NFFT_core, ovl, zp; - Word16 offset; - Word32 fac_fx; - const Word16 *trigo_fx, *win_left_fx, *win_right_fx, *win2_fx; - Word16 trigo_dec_fx[STEREO_DFT32MS_N_MAX / 2 + 1]; - Word16 trigo_step; - Word32 inputFs; - Word16 delay_dec; - Word16 mem_size; - Word16 ovl2; - - push_wmops( "DFT_analysis" ); - - hStereoDft = hCPE->hStereoDft; - - assert( output_frame == STEREO_DFT_NBDIV * hStereoDft->N ); - - /*-----------------------------------------------------------------* - * Initialization - *-----------------------------------------------------------------*/ - - IF( EQ_16( input_frame, output_frame ) ) - { - trigo_fx = hStereoDft->dft_trigo_fx; - trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */ - win_right_fx = hStereoDft->win32ms_fx; /* Q15 */ - win_left_fx = hStereoDft->win32ms_fx; /* Q15 */ - win2_fx = hStereoDft->win232ms_fx; /* Q15 */ - - test(); - IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) - { - assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); - mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */ - } - ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) - { - mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */ - } - ELSE - { - mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ - } - } - ELSE IF( EQ_16( input_frame, L_FRAME ) ) - { - trigo_fx = hStereoDft->dft_trigo_12k8_fx; /* Q15 */ - trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP; - move16(); - win_right_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */ - win_left_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */ - win2_fx = hStereoDft->win232ms_12k8_fx; /* Q15 */ - - test(); - IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) - { - assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); - mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */ - } - ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) - { - mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */ - } - ELSE - { - assert( ( chan == 1 ) && "12.8kHz sampling rate only FOR second channel, i.e. residual coding or allpass signal" ); - mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ - } - } - ELSE IF( EQ_16( input_frame, L_FRAME16k ) ) - { - trigo_fx = hStereoDft->dft_trigo_16k_fx; /* Q15 */ - trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP; - move16(); - win_right_fx = hStereoDft->win32ms_16k_fx; /* Q15 */ - win_left_fx = hStereoDft->win32ms_16k_fx; /* Q15 */ - win2_fx = hStereoDft->win232ms_16k_fx; /* Q15 */ - - test(); - IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) - { - assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); - mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */ - } - ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) - { - mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */ - } - ELSE - { - assert( ( chan == 1 ) && ( hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF ) && "16kHz sampling rate only FOR second channel with allpass signal" ); - mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ - } - } - ELSE IF( EQ_16( input_frame, L_FRAME8k ) ) - { - assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only FOR residual coding" ); - trigo_fx = hStereoDft->dft_trigo_8k_fx; /* Q15 */ - trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP; - move16(); - win_right_fx = hStereoDft->win32ms_8k_fx; /* Q15 */ - win_left_fx = hStereoDft->win32ms_8k_fx; /* Q15 */ - win2_fx = hStereoDft->win232ms_8k_fx; /* Q15 */ - mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ - } - ELSE - { - IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error in DFT stereo: sampling rate not supported" ); - mem_fx = NULL; /* to avoid compilation warning */ - trigo_fx = NULL; /* to avoid compilation warning */ - trigo_step = -1; /* to avoid compilation warning */ - move16(); - win_right_fx = NULL; /* to avoid compilation warning */ - win_left_fx = NULL; /* to avoid compilation warning */ - win2_fx = NULL; /* to avoid compilation warning */ - } - - inputFs = L_mult0( input_frame, FRAMES_PER_SEC ); /* Q0 */ - delay_dec = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS ); - move16(); - zp = NS2SA_FX2( inputFs, STEREO_DFT32MS_ZP_NS ); - move16(); - ovl = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS ); - move16(); - NFFT = NS2SA_FX2( inputFs, STEREO_DFT32MS_N_NS ); - Word16 qfac_fx; - fac_fx = BASOP_Util_Divide3232_Scale_cadence( hStereoDft->NFFT, NFFT, &qfac_fx ); /* qfac_fx */ - qfac_fx = sub( 31, qfac_fx ); - ovl2 = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL2_NS ); - move16(); - - /* Offset FOR the time buffers */ - assert( ( delay >= -NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_DELAY_DEC_BWE_NS + STEREO_DFT_OVL_NS / 2 ) ) && ( delay <= NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_OVL_NS ) ) ); - mem_size = add( delay_dec, delay ); - - /* Update buffers */ - Copy32( mem_fx, input_buff_fx, mem_size ); /* Q11 */ - Copy32( input_fx, input_buff_fx + mem_size, input_frame ); /* q */ - Copy32( input_buff_fx + input_frame, mem_fx, mem_size ); /* q */ - pInput_buff_fx = input_buff_fx; /* q */ - - test(); - IF( EQ_16( hCPE->nchan_out, 1 ) && ( hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) - { - pop_wmops(); - return; - } - - - /*-----------------------------------------------------------------* - * DFT Analysis: loop over frame - *-----------------------------------------------------------------*/ - - assert( ( k_offset <= STEREO_DFT_NBDIV ) ); - - FOR( i = 0; i < NFFT / 4; i++ ) - { - trigo_dec_fx[i] = trigo_fx[i * trigo_step]; - move16(); - trigo_dec_fx[NFFT / 2 - i] = trigo_fx[i * trigo_step]; - move16(); - } - trigo_dec_fx[NFFT / 4] = trigo_fx[NFFT / 4 * trigo_step]; - move16(); - - FOR( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ ) - { - set32_fx( DFT_fx, 0, STEREO_DFT32MS_N_MAX ); - IF( k == 0 ) - { - offset = 0; - move16(); - } - ELSE - { - /* If OVL2 = OVL offset = 10ms */ - offset = NS2SA_FX2( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 ); - move16(); - } - - pInput_fx = pInput_buff_fx + offset; /* q */ - pDFT_out_fx = out_DFT_fx[chan] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* q_out_DFT */ - - /*Forwards FFT: L and R*/ - /* Zero Padding & Flat Portion */ - Copy32( pInput_fx, DFT_fx + zp, sub( NFFT, i_mult( 2, zp ) ) ); /* q */ - - /* Overlapping portions */ - IF( k == 0 ) - { - FOR( i = 0; i < ovl; i++ ) - { - DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win_left_fx[STEREO_DFT32MS_STEP * i] ); /* q */ - move32(); - } - FOR( i = 0; i < ovl2; i++ ) - { - DFT_fx[NFFT - zp - 1 - i] = Mpy_32_16_1( DFT_fx[NFFT - zp - 1 - i], win2_fx[i] ); /* q */ - move32(); - } - } - ELSE - { - FOR( i = 0; i < ovl2; i++ ) - { - DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win2_fx[i] ); /* q */ - move32(); - } - FOR( i = 0; i < ovl; i++ ) - { - DFT_fx[NFFT - zp - i - 1] = Mpy_32_16_1( DFT_fx[NFFT - zp - i - 1], win_right_fx[STEREO_DFT32MS_STEP * i] ); /* q */ - move32(); - } - } - Word16 q_DFT, q_shift, guarded_bits; - q_DFT = *q; - move16(); - guarded_bits = find_guarded_bits_fx( NFFT ); - q_shift = sub( L_norm_arr( DFT_fx, NFFT ), guarded_bits ); - - FOR( Word16 j = 0; j < NFFT; j++ ) - { - DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift*/ - move32(); - } - - q_DFT = add( q_DFT, q_shift ); - - rfft_fx( DFT_fx, trigo_dec_fx, NFFT, -1 ); - - q_shift = sub( L_norm_arr( DFT_fx, NFFT ), sub( 31, qfac_fx ) ); - FOR( Word16 j = 0; j < NFFT; j++ ) - { - DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift */ - move32(); - } - q_DFT = add( q_DFT, q_shift ); - IF( sub( q_out_DFT[chan], q_DFT ) > 0 ) - { - FOR( Word32 j = 0; j < NFFT; j++ ) - { - out_DFT_fx[chan][j] = L_shr( out_DFT_fx[chan][j], sub( q_out_DFT[chan], q_DFT ) ); /* q_DFT */ - move32(); - } - q_out_DFT[chan] = q_DFT; - move16(); - } - ELSE - { - FOR( Word32 j = 0; j < NFFT; j++ ) - { - DFT_fx[j] = L_shr( DFT_fx[j], sub( q_DFT, q_out_DFT[chan] ) ); /* q_DFT */ - move32(); - } - q_DFT = q_out_DFT[chan]; - move16(); - } - - /*Resampling: filtering+scaling*/ - test(); - test(); - IF( ( ana_type == DFT_STEREO_DEC_ANA_FB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_NOCORE ) ) - { - pDFT_out_fx[0] = L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ); /*DC*/ /* qDFT */ - move32(); - IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/ - { - pDFT_out_fx[1] = L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */ - move32(); - } - ELSE - { - pDFT_out_fx[1] = 0; - move32(); - } - FOR( i = 2; i < NFFT; i++ ) - { - pDFT_out_fx[i] = L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */ - move32(); - } - FOR( i = NFFT; i < hStereoDft->NFFT; i++ ) - { - pDFT_out_fx[i] = 0; /* qDFT */ - move32(); - } - } - ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) - { - pDFT_out_fx[0] = L_sub( pDFT_out_fx[0], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[0], fac_fx ), dft_bpf_weights_fx[0] ), sub( 32, qfac_fx ) ) ); /* qDFT */ - move32(); - - FOR( i = 1; i < STEREO_DFT_BPF_SIZE; i++ ) - { - pDFT_out_fx[2 * i] = L_sub( pDFT_out_fx[2 * i], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */ - move32(); - pDFT_out_fx[2 * i + 1] = L_sub( pDFT_out_fx[2 * i + 1], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i + 1], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */ - move32(); - } - } - ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_HB_ADD ) ) - { - NFFT_core = NS2SA_FX2( L_mult0( hCPE->hCoreCoder[0]->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_N_NS ); /* Q0 */ - move16(); - - FOR( i = NFFT_core; i < NFFT; i++ ) - { - pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */ - move32(); - } - } - ELSE - { - pDFT_out_fx[0] = L_add( pDFT_out_fx[0], L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ) ); /*DC*/ /* qDFT */ - move32(); - IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/ - { - pDFT_out_fx[1] = L_add( L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[1] ); /* qDFT */ - move32(); - } - FOR( i = 2; i < NFFT; i++ ) - { - pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */ - move32(); - } - } - } - - pop_wmops(); - return; -} - - -/*--------------------------------------------------------------- - * stereo_dft_dec_smooth_parameters() - * - * - * ---------------------------------------------------------------*/ diff --git a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c index e82005965b6a452c7d327e89d07b42b082048c7b..9b166c41a74204592214c56e42110a7c5ed592f2 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c @@ -74,11 +74,11 @@ void stereo_dft_dmx_out_reset_fx( *-------------------------------------------------------------------------*/ void stereo_dft_unify_dmx_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ - Decoder_State *st0, /* i/o: decoder state structure */ - Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers hStereoDft->qDFT*/ - Word32 *input_mem, /* i/o: mem of buffer DFT analysis Q11*/ - const Word16 prev_sid_nodata /* i : Previous SID/No data indicator Q0*/ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ + Decoder_State *st0, /* i/o: decoder state structure */ + Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers hStereoDft->qDFT*/ + Word32 *input_mem, /* i/o: mem of buffer DFT analysis Q11*/ + const Word16 prev_sid_nodata /* i : Previous SID/No data indicator Q0*/ ) { Word16 i, k, b, N_div; @@ -102,6 +102,8 @@ void stereo_dft_unify_dmx_fx( Word16 num_plocs; Word32 plocsi[STEREO_DFT_RES_N_PEAKS_MAX]; + set32_fx( DFT_PRED_RES, 0, STEREO_DFT32MS_N_32k ); + output_frame = extract_l( Mult_32_16( st0->output_Fs, INV_FRAME_PER_SEC_Q15 ) ); /* Q0 */ samp_ratio = BASOP_Util_Divide3232_Scale( st0->sr_core, st0->output_Fs, &q_samp_ratio ); samp_ratio = shr( samp_ratio, sub( Q15 - Q12, q_samp_ratio ) ); @@ -376,10 +378,8 @@ void stereo_dft_unify_dmx_fx( Word16 idx_k0, idx_k1; Word16 q_shift0; Word16 q_shift1; - idx_k0 = ( add( hStereoDft->past_DMX_pos, 1 ) ) % STEREO_DFT_PAST_MAX; - move16(); - idx_k1 = ( add( idx_k0, 1 ) ) % STEREO_DFT_PAST_MAX; - move16(); + idx_k0 = add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX - 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */ + idx_k1 = add( idx_k0, 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k0] ); q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k1] ); diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 195166e7ef87f1f6f0438490dd8397d846423a81..add5223594ccc5e33588a99ced8715a828f2f367 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -41,7 +41,6 @@ #include "ivas_prot_fx.h" #include "ivas_cnst.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" #include "ivas_rom_dec.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" @@ -96,9 +95,7 @@ void stereo_dft_dec_reset_fx( { Word16 i; Word16 j, b; -#ifdef MSAN_FIX set_zero_fx( hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ) ); -#endif /*Configuration*/ set16_fx( hStereoDft->prm_res, hStereoDft->hConfig->prm_res, STEREO_DFT_DEC_DFT_NB ); @@ -122,25 +119,13 @@ void stereo_dft_dec_reset_fx( set16_fx( hStereoDft->res_pred_index_previous, 0, STEREO_DFT_BAND_MAX ); -#ifdef MSAN_FIX FOR( i = 0; i < STEREO_DFT_BAND_MAX * 2; i++ ) { hStereoDft->res_gains_ind_fx[0][i] = 1006632960; /* 15.0f in Q26 */ move32(); } -#else - FOR( i = 0; i < STEREO_DFT_BAND_MAX; i++ ) - { - hStereoDft->res_gains_ind_fx[0][i] = 1006632960; /* 15.0f in Q26 */ - move32(); - } -#endif -#ifdef MSAN_FIX set32_fx( hStereoDft->res_gains_ind_fx[1], 0, STEREO_DFT_BAND_MAX * 2 ); -#else - set32_fx( hStereoDft->res_gains_ind_fx[1], 0, STEREO_DFT_BAND_MAX ); -#endif /*residual coding*/ set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB ); @@ -235,7 +220,7 @@ void stereo_dft_dec_reset_fx( { set32_fx( hStereoDft->smooth_buf_fx[i], 0, SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); } - hStereoDft->q_smooth_buf_fx = Q7; + hStereoDft->q_smooth_buf_fx = Q6; move16(); set16_fx( hStereoDft->smooth_fac_fx[0], 0, SBA_DIRAC_STEREO_NUM_BANDS ); set16_fx( hStereoDft->smooth_fac_fx[1], 0, SBA_DIRAC_STEREO_NUM_BANDS ); @@ -260,7 +245,6 @@ void stereo_dft_dec_reset_fx( move32(); hStereoDft->frame_sid_nodata = 0; move16(); -#ifdef MSAN_FIX FOR( b = 0; b < 2 * IVAS_MAX_NUM_BANDS; b++ ) { FOR( i = 0; i < 2; i++ ) @@ -272,19 +256,6 @@ void stereo_dft_dec_reset_fx( } } } -#else - FOR( b = 0; b < hStereoDft->nbands; b++ ) - { - FOR( i = 0; i < 2; i++ ) - { - FOR( j = 0; j < 4; j++ ) - { - hStereoDft->mixer_mat_smooth_fx[i][j][b] = 0; - move32(); - } - } - } -#endif hStereoDft->first_frame = 1; move16(); hStereoDft->g_L_prev_fx = 0; @@ -296,15 +267,15 @@ void stereo_dft_dec_reset_fx( } /*------------------------------------------------------------------------- - * stereo_dft_dec_open() + * stereo_dft_dec_open_fx() * * Open DFT decoder stereo handle *-------------------------------------------------------------------------*/ static void stereo_dft_dec_open_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word32 output_Fs, /* i : output sampling rate Q0*/ - const Word16 nchan_transport /* i : number of transport channels Q0*/ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const Word32 output_Fs, /* i : output sampling rate Q0*/ + const Word16 nchan_transport /* i : number of transport channels Q0*/ ) { /*Sizes*/ @@ -395,11 +366,11 @@ static void stereo_dft_dec_open_fx( *------------------------------------------------------------------------*/ ivas_error stereo_dft_dec_create_fx( - STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word32 element_brate, /* i : element bitrate Q0*/ - const Word32 output_Fs, /* i : output sampling rate Q0*/ - const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC Q0*/ - const Word16 nchan_transport /* i : number of transport channels Q0*/ + STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */ + const Word32 element_brate, /* i : element bitrate Q0*/ + const Word32 output_Fs, /* i : output sampling rate Q0*/ + const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC Q0*/ + const Word16 nchan_transport /* i : number of transport channels Q0*/ ) { STEREO_DFT_DEC_DATA_HANDLE hStereoDft_loc; @@ -429,9 +400,9 @@ ivas_error stereo_dft_dec_create_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) ); } -#ifdef MSAN_FIX set_zero_fx( hStereoDft_loc->hb_nrg_subr_fx, STEREO_DFT_NBDIV ); /*Setting hb_nrg_subr_fx to zero*/ -#endif // MSAN_FIX + hStereoDft_loc->q_hb_nrg_subr = Q31; + move16(); hStereoDft_loc->hConfig->force_mono_transmission = 0; move16(); @@ -627,9 +598,9 @@ static void stereo_dft_dequantize_res_gains_f_fx( *-------------------------------------------------------------------------*/ void stereo_dft_dec_update_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word16 output_frame, /* i : output frame length Q0*/ - const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC Q0*/ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const Word16 output_frame, /* i : output frame length Q0*/ + const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC Q0*/ ) { Word16 b, i, k_offset; @@ -712,6 +683,402 @@ void stereo_dft_dec_update_fx( return; } +/*------------------------------------------------------------------------- + * stereo_dft_dec_destroy_fx() + * + * destroy DFT stereo handle + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec_destroy_fx( + STEREO_DFT_DEC_DATA_HANDLE *hStereoDft_glob /* i/o: decoder DFT stereo handle */ +) +{ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft; + + hStereoDft = *hStereoDft_glob; + + IF( hStereoDft->hConfig != NULL ) + { + free( hStereoDft->hConfig ); + hStereoDft->hConfig = NULL; + } + + IF( hStereoDft->hBpf != NULL ) + { + free( hStereoDft->hBpf ); + hStereoDft->hBpf = NULL; + } + + IF( hStereoDft->hTcxLtpDec != NULL ) + { + free( hStereoDft->hTcxLtpDec ); + hStereoDft->hTcxLtpDec = NULL; + } + + free( hStereoDft ); + hStereoDft = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dec_analyze_fx() + * + * DFT analysis on a 20ms frame + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec_analyze_fx( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const Word32 *input_fx, /* i : input signal q*/ + Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers q_out_DFT*/ + const Word16 chan, /* i : channel number Q0*/ + const Word16 input_frame, /* i : input frame size Q0*/ + const Word16 output_frame, /* i : output frame size Q0*/ + const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */ + const Word16 k_offset, /* i : offset of DFT Q0*/ + const Word16 delay, /* i : delay in samples FOR input signal Q0*/ + Word16 *q, + Word16 *q_out_DFT ) +{ + + Word16 i, k; + STEREO_DFT_DEC_DATA_HANDLE hStereoDft; + Word32 *pInput_fx, *pInput_buff_fx; + Word32 *mem_fx, input_buff_fx[STEREO_DFT32MS_OVL_MAX + L_FRAME48k]; + Word32 DFT_fx[STEREO_DFT32MS_N_MAX], *pDFT_out_fx; + Word16 NFFT, NFFT_core, ovl, zp; + Word16 offset; + Word32 fac_fx; + const Word16 *trigo_fx, *win_left_fx, *win_right_fx, *win2_fx; + Word16 trigo_dec_fx[STEREO_DFT32MS_N_MAX / 2 + 1]; + Word16 trigo_step; + Word32 inputFs; + Word16 delay_dec; + Word16 mem_size; + Word16 ovl2; + + push_wmops( "DFT_analysis" ); + + hStereoDft = hCPE->hStereoDft; + + assert( output_frame == STEREO_DFT_NBDIV * hStereoDft->N ); + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + IF( EQ_16( input_frame, output_frame ) ) + { + trigo_fx = hStereoDft->dft_trigo_fx; + trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */ + win_right_fx = hStereoDft->win32ms_fx; /* Q15 */ + win_left_fx = hStereoDft->win32ms_fx; /* Q15 */ + win2_fx = hStereoDft->win232ms_fx; /* Q15 */ + + test(); + IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) + { + assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); + mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */ + } + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) + { + mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */ + } + ELSE + { + mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ + } + } + ELSE IF( EQ_16( input_frame, L_FRAME ) ) + { + trigo_fx = hStereoDft->dft_trigo_12k8_fx; /* Q15 */ + trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP; + move16(); + win_right_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */ + win_left_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */ + win2_fx = hStereoDft->win232ms_12k8_fx; /* Q15 */ + + test(); + IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) + { + assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); + mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */ + } + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) + { + mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */ + } + ELSE + { + assert( ( chan == 1 ) && "12.8kHz sampling rate only FOR second channel, i.e. residual coding or allpass signal" ); + mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ + } + } + ELSE IF( EQ_16( input_frame, L_FRAME16k ) ) + { + trigo_fx = hStereoDft->dft_trigo_16k_fx; /* Q15 */ + trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP; + move16(); + win_right_fx = hStereoDft->win32ms_16k_fx; /* Q15 */ + win_left_fx = hStereoDft->win32ms_16k_fx; /* Q15 */ + win2_fx = hStereoDft->win232ms_16k_fx; /* Q15 */ + + test(); + IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) + { + assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); + mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */ + } + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) + { + mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */ + } + ELSE + { + assert( ( chan == 1 ) && ( hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF ) && "16kHz sampling rate only FOR second channel with allpass signal" ); + mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ + } + } + ELSE IF( EQ_16( input_frame, L_FRAME8k ) ) + { + assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only FOR residual coding" ); + trigo_fx = hStereoDft->dft_trigo_8k_fx; /* Q15 */ + trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP; + move16(); + win_right_fx = hStereoDft->win32ms_8k_fx; /* Q15 */ + win_left_fx = hStereoDft->win32ms_8k_fx; /* Q15 */ + win2_fx = hStereoDft->win232ms_8k_fx; /* Q15 */ + mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ + } + ELSE + { + IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error in DFT stereo: sampling rate not supported" ); + mem_fx = NULL; /* to avoid compilation warning */ + trigo_fx = NULL; /* to avoid compilation warning */ + trigo_step = -1; /* to avoid compilation warning */ + move16(); + win_right_fx = NULL; /* to avoid compilation warning */ + win_left_fx = NULL; /* to avoid compilation warning */ + win2_fx = NULL; /* to avoid compilation warning */ + } + + inputFs = L_mult0( input_frame, FRAMES_PER_SEC ); /* Q0 */ + delay_dec = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS ); + move16(); + zp = NS2SA_FX2( inputFs, STEREO_DFT32MS_ZP_NS ); + move16(); + ovl = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS ); + move16(); + NFFT = NS2SA_FX2( inputFs, STEREO_DFT32MS_N_NS ); + Word16 qfac_fx; + fac_fx = BASOP_Util_Divide3232_Scale_newton( hStereoDft->NFFT, NFFT, &qfac_fx ); /* qfac_fx */ + qfac_fx = sub( 31, qfac_fx ); + ovl2 = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL2_NS ); + move16(); + + /* Offset FOR the time buffers */ + assert( ( delay >= -NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_DELAY_DEC_BWE_NS + STEREO_DFT_OVL_NS / 2 ) ) && ( delay <= NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_OVL_NS ) ) ); + mem_size = add( delay_dec, delay ); + + /* Update buffers */ + Copy32( mem_fx, input_buff_fx, mem_size ); /* Q11 */ + Copy32( input_fx, input_buff_fx + mem_size, input_frame ); /* q */ + Copy32( input_buff_fx + input_frame, mem_fx, mem_size ); /* q */ + pInput_buff_fx = input_buff_fx; /* q */ + + test(); + IF( EQ_16( hCPE->nchan_out, 1 ) && ( hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) + { + pop_wmops(); + return; + } + + + /*-----------------------------------------------------------------* + * DFT Analysis: loop over frame + *-----------------------------------------------------------------*/ + + assert( ( k_offset <= STEREO_DFT_NBDIV ) ); + + FOR( i = 0; i < NFFT / 4; i++ ) + { + trigo_dec_fx[i] = trigo_fx[i * trigo_step]; + move16(); + trigo_dec_fx[NFFT / 2 - i] = trigo_fx[i * trigo_step]; + move16(); + } + trigo_dec_fx[NFFT / 4] = trigo_fx[NFFT / 4 * trigo_step]; + move16(); + + FOR( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ ) + { + set32_fx( DFT_fx, 0, STEREO_DFT32MS_N_MAX ); + IF( k == 0 ) + { + offset = 0; + move16(); + } + ELSE + { + /* If OVL2 = OVL offset = 10ms */ + offset = NS2SA_FX2( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 ); + move16(); + } + + pInput_fx = pInput_buff_fx + offset; /* q */ + pDFT_out_fx = out_DFT_fx[chan] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* q_out_DFT */ + + /*Forwards FFT: L and R*/ + /* Zero Padding & Flat Portion */ + Copy32( pInput_fx, DFT_fx + zp, sub( NFFT, i_mult( 2, zp ) ) ); /* q */ + + /* Overlapping portions */ + IF( k == 0 ) + { + FOR( i = 0; i < ovl; i++ ) + { + DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win_left_fx[STEREO_DFT32MS_STEP * i] ); /* q */ + move32(); + } + FOR( i = 0; i < ovl2; i++ ) + { + DFT_fx[NFFT - zp - 1 - i] = Mpy_32_16_1( DFT_fx[NFFT - zp - 1 - i], win2_fx[i] ); /* q */ + move32(); + } + } + ELSE + { + FOR( i = 0; i < ovl2; i++ ) + { + DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win2_fx[i] ); /* q */ + move32(); + } + FOR( i = 0; i < ovl; i++ ) + { + DFT_fx[NFFT - zp - i - 1] = Mpy_32_16_1( DFT_fx[NFFT - zp - i - 1], win_right_fx[STEREO_DFT32MS_STEP * i] ); /* q */ + move32(); + } + } + Word16 q_DFT, q_shift, guarded_bits; + q_DFT = *q; + move16(); + guarded_bits = find_guarded_bits_fx( NFFT ); + q_shift = sub( L_norm_arr( DFT_fx, NFFT ), guarded_bits ); + + FOR( Word16 j = 0; j < NFFT; j++ ) + { + DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift*/ + move32(); + } + + q_DFT = add( q_DFT, q_shift ); + + rfft_fx( DFT_fx, trigo_dec_fx, NFFT, -1 ); + + q_shift = sub( L_norm_arr( DFT_fx, NFFT ), sub( 31, qfac_fx ) ); + FOR( Word16 j = 0; j < NFFT; j++ ) + { + DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift */ + move32(); + } + q_DFT = add( q_DFT, q_shift ); + IF( sub( q_out_DFT[chan], q_DFT ) > 0 ) + { + FOR( Word32 j = 0; j < NFFT; j++ ) + { + out_DFT_fx[chan][j] = L_shr( out_DFT_fx[chan][j], sub( q_out_DFT[chan], q_DFT ) ); /* q_DFT */ + move32(); + } + q_out_DFT[chan] = q_DFT; + move16(); + } + ELSE + { + FOR( Word32 j = 0; j < NFFT; j++ ) + { + DFT_fx[j] = L_shr( DFT_fx[j], sub( q_DFT, q_out_DFT[chan] ) ); /* q_DFT */ + move32(); + } + q_DFT = q_out_DFT[chan]; + move16(); + } + + /*Resampling: filtering+scaling*/ + test(); + test(); + IF( ( ana_type == DFT_STEREO_DEC_ANA_FB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_NOCORE ) ) + { + pDFT_out_fx[0] = L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ); /*DC*/ /* qDFT */ + move32(); + IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/ + { + pDFT_out_fx[1] = L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */ + move32(); + } + ELSE + { + pDFT_out_fx[1] = 0; + move32(); + } + FOR( i = 2; i < NFFT; i++ ) + { + pDFT_out_fx[i] = L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */ + move32(); + } + FOR( i = NFFT; i < hStereoDft->NFFT; i++ ) + { + pDFT_out_fx[i] = 0; /* qDFT */ + move32(); + } + } + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) + { + pDFT_out_fx[0] = L_sub( pDFT_out_fx[0], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[0], fac_fx ), dft_bpf_weights_fx[0] ), sub( 32, qfac_fx ) ) ); /* qDFT */ + move32(); + + FOR( i = 1; i < STEREO_DFT_BPF_SIZE; i++ ) + { + pDFT_out_fx[2 * i] = L_sub( pDFT_out_fx[2 * i], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */ + move32(); + pDFT_out_fx[2 * i + 1] = L_sub( pDFT_out_fx[2 * i + 1], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i + 1], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */ + move32(); + } + } + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_HB_ADD ) ) + { + NFFT_core = NS2SA_FX2( L_mult0( hCPE->hCoreCoder[0]->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_N_NS ); /* Q0 */ + move16(); + + FOR( i = NFFT_core; i < NFFT; i++ ) + { + pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */ + move32(); + } + } + ELSE + { + pDFT_out_fx[0] = L_add( pDFT_out_fx[0], L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ) ); /*DC*/ /* qDFT */ + move32(); + IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/ + { + pDFT_out_fx[1] = L_add( L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[1] ); /* qDFT */ + move32(); + } + FOR( i = 2; i < NFFT; i++ ) + { + pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */ + move32(); + } + } + } + + pop_wmops(); + return; +} + + /*------------------------------------------------------------------------- * stereo_dft_dec_synthesize_fx() * @@ -719,11 +1086,11 @@ void stereo_dft_dec_update_fx( *-------------------------------------------------------------------------*/ void stereo_dft_dec_synthesize_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i : DFT buffers qDFT*/ - const Word16 chan, /* i : channel number Q0*/ - Word32 output[L_FRAME48k], /* o : output synthesis signal qDFT*/ - const Word16 output_frame /* i : output frame length Q0*/ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i : DFT buffers qDFT*/ + const Word16 chan, /* i : channel number Q0*/ + Word32 output[L_FRAME48k], /* o : output synthesis signal qDFT*/ + const Word16 output_frame /* i : output frame length Q0*/ ) { Word16 i, k; @@ -1333,10 +1700,10 @@ void stereo_dft_dec_smooth_parameters_fx( *-------------------------------------------------------------------------*/ void stereo_dft_dec_res_fx( - CPE_DEC_HANDLE hCPE, /* i/o: decoder CPE handle */ + CPE_DEC_HANDLE hCPE, /* i/o: decoder CPE handle */ Word32 res_buf[STEREO_DFT_N_8k], /* i : residual buffer q_res*/ - Word16 q_res, /* i : q fact of residural buffer */ - Word32 *output /* o : output Q16*/ + Word16 q_res, /* i : q fact of residural buffer */ + Word32 *output /* o : output Q16*/ ) { Word16 i; @@ -1426,7 +1793,7 @@ void stereo_dft_dec_res_fx( IF( prev_bfi ) { /* Ramp up BPF contribution for the first good frame */ - step = (Word16) ( 0x00CD ); // ( 1.0f / L_FRAME8k ); /* Q15 */ + step = (Word16) ( 0x00CD ); // ( 1.0f / L_FRAME8k ); /* Q15 */ move16(); fac = negate( step ); FOR( i = 0; i < L_FRAME8k; i++ ) @@ -1436,11 +1803,7 @@ void stereo_dft_dec_res_fx( move32(); } } -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */ -#else - Copy_Scale_sig_16_32_DEPREC( out_16, output, L_FRAME8k, 16 ); /* Q16 */ -#endif IF( res_bpf_flag ) { v_sub_32( output, bpf_error_signal_8k, output, L_FRAME8k ); @@ -1451,20 +1814,12 @@ void stereo_dft_dec_res_fx( set16_fx( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k ); hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0; move16(); -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */ -#else - Copy_Scale_sig_16_32_DEPREC( out_16, output, L_FRAME8k, 16 ); /* Q16 */ -#endif } ELSE { /* This step is needed to ensure output is properly populated with scaled values in all cases*/ -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */ -#else - Copy_Scale_sig_16_32_DEPREC( out_16, output, L_FRAME8k, 16 ); /* Q16 */ -#endif } return; @@ -1478,18 +1833,18 @@ void stereo_dft_dec_res_fx( *-------------------------------------------------------------------------*/ void stereo_dft_dec_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - Decoder_State *st0, /* i/o: decoder state structure */ - Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers qDFT*/ - Word32 *input_mem, /* i/o: mem of buffer DFT analysis */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure Q0*/ - const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC Q0*/ - const Word16 sba_mono_flag, /* i : signal mono output for SBA DirAC Q0*/ - ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */ - const Word16 cross_fade_start_offset, /* i : SPAR mixer delay compensation Q0*/ - const Word32 output_Fs, /* i : Fs for delay calculation Q0*/ - const Word16 nchan_transport, /* i : number of transpor channels Q0*/ - const Word16 num_md_sub_frames /* i : number of MD subframes Q0*/ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + Decoder_State *st0, /* i/o: decoder state structure */ + Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers qDFT*/ + Word32 *input_mem, /* i/o: mem of buffer DFT analysis */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure Q0*/ + const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC Q0*/ + const Word16 sba_mono_flag, /* i : signal mono output for SBA DirAC Q0*/ + ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */ + const Word16 cross_fade_start_offset, /* i : SPAR mixer delay compensation Q0*/ + const Word32 output_Fs, /* i : Fs for delay calculation Q0*/ + const Word16 nchan_transport, /* i : number of transpor channels Q0*/ + const Word16 num_md_sub_frames /* i : number of MD subframes Q0*/ ) { Word16 i, k, b, N_div, stop; @@ -1525,10 +1880,6 @@ void stereo_dft_dec_fx( HANDLE_FD_CNG_COM hFdCngCom = hFdCngDec->hFdCngCom; Word16 *cna_seed = &( hFdCngCom->seed ); Word32 DFT_W, DFT_Y; -#ifndef OPT_STEREO_32KBPS_V1 - Word16 q_samp_ratio = Q15; - move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ Word16 len; output_frame = (Word16) Mpy_32_32( L_add( st0->output_Fs, FRAMES_PER_SEC_BY_2 ), ONE_BY_FRAMES_PER_SEC_Q31 ); /* Q0 */ @@ -1537,12 +1888,7 @@ void stereo_dft_dec_fx( * Initialization *-----------------------------------------------------------------*/ -#ifdef OPT_STEREO_32KBPS_V1 samp_ratio = divide3232( st0->sr_core, st0->output_Fs ); // Q15 -#else /* OPT_STEREO_32KBPS_V1 */ - samp_ratio = (Word16) BASOP_Util_Divide3232_Scale( st0->sr_core, st0->output_Fs, &q_samp_ratio ); - samp_ratio = shr( samp_ratio, sub( Q15 - Q12, q_samp_ratio ) ); -#endif /* OPT_STEREO_32KBPS_V1 */ stop = shr( STEREO_DFT32MS_N_32k, 1 ); @@ -2117,17 +2463,10 @@ void stereo_dft_dec_fx( /*Nyquist Freq.*/ IF( EQ_16( hStereoDft->band_limits[b], shr( hStereoDft->NFFT, 1 ) ) ) { -#ifdef OPT_STEREO_32KBPS_V1 DFT_L[1] = Madd_32_16( pDFT_DMX[1], pDFT_DMX[1], g ); /* qDFT */ move32(); DFT_R[1] = Msub_32_16( pDFT_DMX[1], pDFT_DMX[1], g ); /* qDFT */ move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - DFT_L[1] = L_add( pDFT_DMX[1], Mpy_32_16_1( pDFT_DMX[1], g ) ); /* qDFT */ - move32(); - DFT_R[1] = L_sub( pDFT_DMX[1], Mpy_32_16_1( pDFT_DMX[1], g ) ); /* qDFT */ - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ DFT_L[1] = Mpy_32_16_1( DFT_L[1], INV_SQRT2_FX_Q15 ); /* qDFT */ move32(); DFT_R[1] = Mpy_32_16_1( DFT_R[1], INV_SQRT2_FX_Q15 ); /* qDFT */ @@ -2252,7 +2591,7 @@ void stereo_dft_dec_fx( q_cna_level = hFdCngDec->smoothed_psd_exp; move16(); l_tmp = Sqrt32( cna_level, &q_cna_level ); - scale_fact = Mpy_32_32( l_tmp, scale_fact0 ); /* q_cna_level */ + scale_fact = Mpy_32_32( l_tmp, scale_fact0 ); /* Q = (31-q_cna_level) + Q15 - 31 */ /* scale_fact0 will be in Q15 by the time the above operation is performed so the q of scale_fact represented now by q_cna_level has to be updated @@ -2260,52 +2599,28 @@ void stereo_dft_dec_fx( q_cna_level = sub( Q31, add( q_cna_level, Q16 ) ); /* generate comfort noise from gaussian noise and add to the decoded DFT spectrum */ -#ifdef OPT_STEREO_32KBPS_V1 Word16 shift = sub( q_cna_level, hStereoDft->q_dft ); -#endif /* OPT_STEREO_32KBPS_V1 */ N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ -#ifdef OPT_STEREO_32KBPS_V1 - l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ - l_tmp = L_shr( l_tmp, shift ); /* q_dft */ -#else /* OPT_STEREO_32KBPS_V1 */ - l_tmp = L_add( Madd_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ - l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ -#endif /* OPT_STEREO_32KBPS_V1 */ - DFT_L[2 * i] = L_add( DFT_L[2 * i], l_tmp ); /* q_dft */ + l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ + l_tmp = L_shr( l_tmp, shift ); /* q_dft */ + DFT_L[2 * i] = L_add_sat( DFT_L[2 * i], l_tmp ); /* q_dft */ move32(); -#ifdef OPT_STEREO_32KBPS_V1 l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ l_tmp = L_shr( l_tmp, shift ); /* q_dft */ - DFT_R[2 * i] = L_add( DFT_R[2 * i], l_tmp ); /* q_dft */ -#else /* OPT_STEREO_32KBPS_V1 */ - l_tmp = L_sub( Msub_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ - l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ - DFT_R[2 * i] = L_add( DFT_R[2 * i], l_tmp ); /* q_dft */ -#endif /* OPT_STEREO_32KBPS_V1 */ + DFT_R[2 * i] = L_add_sat( DFT_R[2 * i], l_tmp ); /* q_dft */ move32(); N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ -#ifdef OPT_STEREO_32KBPS_V1 - l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ - l_tmp = L_shr( l_tmp, shift ); /* q_dft */ - DFT_L[2 * i + 1] = L_add( DFT_L[2 * i + 1], l_tmp ); /* q_dft */ + l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ + l_tmp = L_shr( l_tmp, shift ); /* q_dft */ + DFT_L[2 * i + 1] = L_add_sat( DFT_L[2 * i + 1], l_tmp ); /* q_dft */ move32(); l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ l_tmp = L_shr( l_tmp, shift ); /* q_dft */ - DFT_R[2 * i + 1] = L_add( DFT_R[2 * i + 1], l_tmp ); /* q_dft */ + DFT_R[2 * i + 1] = L_add_sat( DFT_R[2 * i + 1], l_tmp ); /* q_dft */ move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - l_tmp = L_add( Madd_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ - l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ - DFT_L[2 * i + 1] = L_add( DFT_L[2 * i + 1], l_tmp ); /* q_dft */ - move32(); - l_tmp = L_sub( Msub_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ - l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ - DFT_R[2 * i + 1] = L_add( DFT_R[2 * i + 1], l_tmp ); /* q_dft */ - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ } } @@ -2393,12 +2708,7 @@ static void stereo_dft_compute_td_stefi_params_fx( return; } -#ifdef OPT_STEREO_32KBPS_V1 bin0 = round_fx( L_mult0( hStereoDft->NFFT, samp_ratio ) ); -#else /* OPT_STEREO_32KBPS_V1 */ - bin0 = extract_l( L_shr_r( Mpy_32_16_1( (Word32) hStereoDft->NFFT, samp_ratio ), 1 ) ); /* Q0 */ - bin0 = shl( bin0, Q3 ); -#endif /* OPT_STEREO_32KBPS_V1 */ bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */ b = hStereoDft->nbands; /* Q0 */ move16(); @@ -2439,9 +2749,6 @@ static void stereo_dft_compute_td_stefi_params_fx( nbands = add( nbands, 1 ); wsum = L_add( wsum, dft_res_pred_weights_fx[bres][b - band0] ); -#ifdef DBG_TD_STEFI - printf( "frame: %d\tband: %-2d\tpred_gain1: %f\tpred_gain2: %f\tppg1: %f\tppg2: %f\n", frame, b, hStereoDft->res_pred_gain[b + STEREO_DFT_BAND_MAX], hStereoDft->res_pred_gain[b + 2 * STEREO_DFT_BAND_MAX], hStereoDft->past_res_pred_gain[STEREO_DFT_TD_STEFI_SUBFR_DELAY - 2][b], hStereoDft->past_res_pred_gain[d_short - 1][b] ); -#endif } IF( nbands == 0 ) @@ -2513,12 +2820,6 @@ static void stereo_dft_compute_td_stefi_params_fx( move32(); move16(); -#ifdef DBG_TD_STEFI - printf( "frame: %d\tpred_gain: %f\tpred_gain_avg: %f\tg2_0: %f\tgain: %f\n", frame, pred_gain, pred_gain_avg, g2, hStereoDft->td_gain[0] ); - printf( "nrg_DMX: %f\tnrd_pred_DMX: %f\tnbands: %d\tbin0: %d\n", nrg_DMX, nrg_pred_DMX, hStereoDft->nbands, bin0 ); - /*printf( "td_gain: %f\n", hStereoDft->td_gain[0] );*/ -#endif - return; } @@ -2562,19 +2863,15 @@ static void stereo_dft_dequantize_ipd_fx( * *-------------------------------------------------------------------------*/ void stereo_dft_generate_res_pred_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ -#ifdef OPT_STEREO_32KBPS_V1 - const Word16 samp_ratio, /* i : sampling ratio Q15*/ -#else /* OPT_STEREO_32KBPS_V1 */ - const Word16 samp_ratio, /* i : sampling ratio Q13*/ -#endif /* OPT_STEREO_32KBPS_V1 */ - Word32 *pDFT_DMX, /* i : downmix signal qDFT*/ - Word32 *DFT_PRED_RES, /* o : residual prediction signal qDFT*/ - Word32 *pPredGain, /* i : residual prediction gains Q31*/ - const Word16 k, /* i : subframe index Q0*/ - Word32 *ap_filt_DMX, /* i : enhanced stereo filling signal qDFT*/ - Word16 *stop, /* o : last FD stereo filling bin Q0*/ - const Word16 bfi /* i : BFI flag Q0*/ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const Word16 samp_ratio, /* i : sampling ratio Q15*/ + Word32 *pDFT_DMX, /* i : downmix signal qDFT*/ + Word32 *DFT_PRED_RES, /* o : residual prediction signal qDFT*/ + Word32 *pPredGain, /* i : residual prediction gains Q31*/ + const Word16 k, /* i : subframe index Q0*/ + Word32 *ap_filt_DMX, /* i : enhanced stereo filling signal qDFT*/ + Word16 *stop, /* o : last FD stereo filling bin Q0*/ + const Word16 bfi /* i : BFI flag Q0*/ ) { /* general variables */ @@ -2585,9 +2882,6 @@ void stereo_dft_generate_res_pred_fx( /* variables for enhanced stereo filling */ Word16 norm_fac, q_norm_fac; -#ifndef OPT_STEREO_32KBPS_V1 - Word16 lim_norm_fac; -#endif /* OPT_STEREO_32KBPS_V1 */ Word16 q_sqrt; Word16 alpha; // gain_limit; @@ -2601,12 +2895,7 @@ void stereo_dft_generate_res_pred_fx( Word32 pred_gain_avg; Word32 g2; Word16 nbands_respred; -#ifdef OPT_STEREO_32KBPS_V1 Word16 q_new, diff; -#else /* OPT_STEREO_32KBPS_V1 */ - q_norm_fac = 0; - move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ Word16 len; push_wmops( "gen_respred" ); @@ -2629,12 +2918,7 @@ void stereo_dft_generate_res_pred_fx( /* In ACELP mode the downmix signal is not available in bandwidth extension area. * * Therefore, the downmix energy in the corresponding subbands is estimated. */ -#ifdef OPT_STEREO_32KBPS_V1 bin0 = round_fx( L_mult0( hStereoDft->NFFT, samp_ratio ) ); -#else /* OPT_STEREO_32KBPS_V1 */ - bin0 = (Word16) ( L_shr( L_add( L_mult0( hStereoDft->NFFT, samp_ratio ), ONE_IN_Q12 ), Q12 + 1 ) ); /* Q0 */ - move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */ b = hStereoDft->nbands; move16(); @@ -2679,22 +2963,12 @@ void stereo_dft_generate_res_pred_fx( len = s_min( hStereoDft->band_limits[b + 1], bin0 ); FOR( i = hStereoDft->band_limits[b]; i < len; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 dmx_nrg_64bit = W_mac_32_32( W_mac_32_32( dmx_nrg_64bit, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ); /* 2 * q_dft + 1 */ rev_nrg_64bit = W_mac_32_32( W_mac_32_32( rev_nrg_64bit, ap_filt_DMX[2 * i], ap_filt_DMX[2 * i] ), ap_filt_DMX[2 * i + 1], ap_filt_DMX[2 * i + 1] ); /* 2 * q_dft + 1 */ -#else /* OPT_STEREO_32KBPS_V1 */ - dmx_nrg_64bit = W_add( dmx_nrg_64bit, - W_add( W_mult0_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), - W_mult0_32_32( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ) ); /* 2 * q_dft */ - rev_nrg_64bit = W_add( rev_nrg_64bit, - W_add( W_mult0_32_32( ap_filt_DMX[2 * i], ap_filt_DMX[2 * i] ), - W_mult0_32_32( ap_filt_DMX[2 * i + 1], ap_filt_DMX[2 * i + 1] ) ) ); /* 2 * q_dft */ -#endif /* OPT_STEREO_32KBPS_V1 */ } -#ifdef OPT_STEREO_32KBPS_V1 q_new = add( shl( hStereoDft->q_dft, 1 ), 1 ); q_shift = W_norm( dmx_nrg_64bit ); dmx_nrg = W_shl_sat_l( dmx_nrg_64bit, sub( q_shift, 32 ) ); // 2 * hStereoDft->q_dft + 1 - (q_shift - 32) @@ -2703,54 +2977,26 @@ void stereo_dft_generate_res_pred_fx( rev_nrg = W_shl_sat_l( rev_nrg_64bit, sub( q_shift, 32 ) ); // 2 * hStereoDft->q_dft + 1 - (q_shift - 32) rev_nrg_q = add( q_new, sub( q_shift, 32 ) ); move16(); -#else /* OPT_STEREO_32KBPS_V1 */ - q_shift = W_norm( dmx_nrg_64bit ); - dmx_nrg = W_extract_l( W_shl( dmx_nrg_64bit, sub( q_shift, 32 ) ) ); // 2 * hStereoDft->q_dft + (q_shift - 32) - dmx_nrg_q = add( imult1616( 2, hStereoDft->q_dft ), sub( q_shift, 32 ) ); - q_shift = W_norm( rev_nrg_64bit ); - rev_nrg = W_extract_l( W_shl( rev_nrg_64bit, sub( q_shift, 32 ) ) ); // 2 * hStereoDft->q_dft + (q_shift - 32) - rev_nrg_q = add( imult1616( 2, hStereoDft->q_dft ), sub( q_shift, 32 ) ); -#endif /* OPT_STEREO_32KBPS_V1 */ /* Reach a common Q for dmx_nrg and rev_nrg */ q_com = s_min( dmx_nrg_q, rev_nrg_q ); dmx_nrg = L_shl( dmx_nrg, sub( q_com, dmx_nrg_q ) ); /* q_com */ rev_nrg = L_shl( rev_nrg, sub( q_com, rev_nrg_q ) ); /* q_com */ -#ifdef OPT_STEREO_32KBPS_V1 diff = sub( hStereoDft->q_smoothed_nrg, q_com ); IF( diff < 0 ) -#else /* OPT_STEREO_32KBPS_V1 */ - IF( LT_16( hStereoDft->q_smoothed_nrg, q_com ) ) -#endif /* OPT_STEREO_32KBPS_V1 */ { -#ifdef OPT_STEREO_32KBPS_V1 rev_nrg = L_shl( rev_nrg, shl( diff, 1 ) ); dmx_nrg = L_shl( dmx_nrg, shl( diff, 1 ) ); -#else /* OPT_STEREO_32KBPS_V1 */ - rev_nrg = L_shr( rev_nrg, shl( sub( q_com, hStereoDft->q_smoothed_nrg ), 1 ) ); - dmx_nrg = L_shr( dmx_nrg, shl( sub( q_com, hStereoDft->q_smoothed_nrg ), 1 ) ); -#endif /* OPT_STEREO_32KBPS_V1 */ q_com = hStereoDft->q_smoothed_nrg; move16(); } -#ifdef OPT_STEREO_32KBPS_V1 ELSE -#else /* OPT_STEREO_32KBPS_V1 */ - ELSE IF( GT_16( hStereoDft->q_smoothed_nrg, q_com ) ) -#endif /* OPT_STEREO_32KBPS_V1 */ { -#ifdef OPT_STEREO_32KBPS_V1 hStereoDft->smooth_res_nrg_fx[b] = L_shr( hStereoDft->smooth_res_nrg_fx[b], shl( diff, 1 ) ); /* hStereoDft->q_smoothed_nrg */ move32(); hStereoDft->smooth_dmx_nrg_fx[b] = L_shr( hStereoDft->smooth_dmx_nrg_fx[b], shl( diff, 1 ) ); /* hStereoDft->q_smoothed_nrg */ move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - hStereoDft->smooth_res_nrg_fx[b] = L_shr( hStereoDft->smooth_res_nrg_fx[b], shl( sub( hStereoDft->q_smoothed_nrg, q_com ), 1 ) ); /* hStereoDft->q_smoothed_nrg */ - move32(); - hStereoDft->smooth_dmx_nrg_fx[b] = L_shr( hStereoDft->smooth_dmx_nrg_fx[b], shl( sub( hStereoDft->q_smoothed_nrg, q_com ), 1 ) ); /* hStereoDft->q_smoothed_nrg */ - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ q_smoothed_nrg_local[b] = q_com; move16(); } @@ -2760,15 +3006,12 @@ void stereo_dft_generate_res_pred_fx( hStereoDft->smooth_dmx_nrg_fx[b] = Madd_32_16( Mpy_32_16_1( hStereoDft->smooth_dmx_nrg_fx[b], alpha ), dmx_nrg, sub( (Word16) ( 0x7FFF ), alpha ) ); /* hStereoDft->q_smoothed_nrg */ move32(); -#ifdef OPT_STEREO_32KBPS_V1 // Compute norm_fac in Q14 norm_fac = MAX_16; move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ /* normalization factor */ IF( hStereoDft->smooth_res_nrg_fx[b] != 0 ) { -#ifdef OPT_STEREO_32KBPS_V1 norm_fac = 0; move16(); IF( hStereoDft->smooth_dmx_nrg_fx[b] != 0 ) @@ -2791,88 +3034,15 @@ void stereo_dft_generate_res_pred_fx( norm_fac = extract_h( prod ); } -#else /* OPT_STEREO_32KBPS_V1 */ - norm_fac = BASOP_Util_Divide3232_Scale( hStereoDft->smooth_dmx_nrg_fx[b], hStereoDft->smooth_res_nrg_fx[b], &q_norm_fac ); /* q_norm_fac */ - norm_fac = Sqrt16( norm_fac, &q_norm_fac ); - IF( norm_fac != 0 ) - { - /* gain compressor */ - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( LE_16( q_norm_fac, -Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && GT_16( (Word16) 0x3333, norm_fac ) ) || ( ( q_norm_fac == 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) ) - { - lim_norm_fac = (Word16) 0x5000; - move16(); - } - ELSE IF( GT_16( q_norm_fac, Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && LT_16( (Word16) 0x5000, norm_fac ) ) || ( ( q_norm_fac == 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) ) - { - lim_norm_fac = (Word16) 0x3333; - move16(); - } - ELSE - { - lim_norm_fac = norm_fac; - move16(); - } - IF( EQ_16( lim_norm_fac, norm_fac ) ) - { - norm_fac = ONE_IN_Q14; - move16(); - q_norm_fac = Q1; - move16(); - } - ELSE - { - norm_fac = extract_l( L_shr( L_mult0( norm_fac, lim_norm_fac ), Q15 ) ); /* q_norm_fac */ - q_norm_fac = add( q_norm_fac, 1 ); - test(); - IF( q_norm_fac < 0 ) - { - norm_fac = shl( norm_fac, q_norm_fac ); - q_norm_fac = 0; - move16(); - } - ELSE IF( GT_16( q_norm_fac, 2 ) && LT_16( norm_s( norm_fac ), sub( q_norm_fac, Q1 ) ) ) - { - norm_fac = MAX_16; - move16(); - q_norm_fac = Q1; - move16(); - } - } - } -#endif /* OPT_STEREO_32KBPS_V1 */ } -#ifndef OPT_STEREO_32KBPS_V1 - ELSE - { - norm_fac = MAX_16; - move16(); - q_norm_fac = Q1; - move16(); - } -#endif /* OPT_STEREO_32KBPS_V1 */ len = s_min( hStereoDft->band_limits[b + 1], bin0 ); FOR( i = hStereoDft->band_limits[b]; i < len; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i] ), 1 ); /* q_dft */ move32(); DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i + 1] ), 1 ); /* q_dft */ move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i] ), q_norm_fac ); /* q_dft */ - move32(); - DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i + 1] ), q_norm_fac ); /* q_dft */ - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ } } @@ -2991,16 +3161,20 @@ void stereo_dft_generate_res_pred_fx( move32(); DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); /* q_dft */ move32(); - past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ); /* q_dft */ } test(); IF( !bfi || GE_16( b, hStereoDft->res_cod_band_max ) ) { Word16 q_div; Word16 op; + FOR( i = hStereoDft->band_limits[b]; i < len; i++ ) + { + past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ); /* q_dft */ + } op = BASOP_Util_Divide3232_Scale( L_add( 1, dmx_nrg ), L_add( 1, past_dmx_nrg ), &q_div ); /* q_sqrt */ q_sqrt = q_div; move16(); + norm_fac = Sqrt16( op, &q_sqrt ); g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); /* Q31 */ IF( LE_32( q_sqrt, norm_l( g2 ) ) ) @@ -3479,9 +3653,9 @@ static void stereo_dft_adapt_sf_delay_fx( } void stereo_dft_dec_sid_coh_fx( Decoder_State *st, /* i/o: decoder state structure */ - const Word16 nbands, /* i : number of DFT stereo bands Q0*/ - Word16 *coh_fx, /* i/o: coherence Q15*/ - Word16 *nb_bits /* i/o: number of bits read Q0*/ + const Word16 nbands, /* i : number of DFT stereo bands Q0*/ + Word16 *coh_fx, /* i/o: coherence Q15*/ + Word16 *nb_bits /* i/o: number of bits read Q0*/ ) { Word16 alpha_fx; @@ -3505,10 +3679,10 @@ void stereo_dft_dec_sid_coh_fx( IF( sub( sub( nr_of_sid_stereo_bits, *nb_bits ), STEREO_DFT_N_COH_ALPHA_BITS - STEREO_DFT_PRED_NBITS ) > 0 ) { /* Read coherence from bitstream */ - coh_pred_index = get_next_indice_fx( st, STEREO_DFT_PRED_NBITS ); /* Read predictor index Q0*/ + coh_pred_index = get_next_indice_fx( st, STEREO_DFT_PRED_NBITS ); /* Read predictor index Q0*/ ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_PRED_NBITS ); - alpha_index = get_next_indice_fx( st, STEREO_DFT_N_COH_ALPHA_BITS ); /* Read alpha index Q0*/ + alpha_index = get_next_indice_fx( st, STEREO_DFT_N_COH_ALPHA_BITS ); /* Read alpha index Q0*/ ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_N_COH_ALPHA_BITS ); alpha_step = 0; @@ -3628,17 +3802,17 @@ void stereo_dft_dequantize_itd_fx( *-------------------------------------------------------------------------*/ void stereo_dft_dec_read_BS_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ - const Word32 element_brate, /* i : element bitrate Q0*/ - Word32 *total_brate, /* o : total bitrate Q0*/ - Decoder_State *st, /* i/o: decoder state structure */ - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ - const Word16 bwidth, /* i : bandwidth Q0*/ - const Word16 output_frame, /* i : output frame length Q0*/ + const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ + const Word32 element_brate, /* i : element bitrate Q0*/ + Word32 *total_brate, /* o : total bitrate Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ + const Word16 bwidth, /* i : bandwidth Q0*/ + const Word16 output_frame, /* i : output frame length Q0*/ Word32 res_buf_fx[STEREO_DFT_N_8k], /* o : residual buffer Q0*/ - Word16 *nb_bits, /* o : number of bits read Q0*/ + Word16 *nb_bits, /* o : number of bits read Q0*/ Word16 *coh_fx, /* i/o: Coherence Q15*/ - const Word16 ivas_format /* i : ivas format Q0*/ + const Word16 ivas_format /* i : ivas format Q0*/ ) { Word32 sg_tmp_fx[STEREO_DFT_BAND_MAX]; @@ -3903,7 +4077,7 @@ void stereo_dft_dec_read_BS_fx( IF( !hStereoDft->frame_sid_nodata ) { itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); /* Q0 */ - ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit Q0*/ + ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit Q0*/ move16(); hStereoDft->itd_fx[k + k_offset] = 0; move32(); @@ -4180,11 +4354,10 @@ void stereo_dft_dec_read_BS_fx( ecsq_inst.config_index = sub( shl( hStereoDft->res_cod_mode[k_offset], 1 ), 1 ); /* Q0 */ move16(); - ECSQ_decode( &ecsq_inst, hStereoDft->res_cod_line_max, dec ); + ECSQ_decode_fx( &ecsq_inst, hStereoDft->res_cod_line_max, dec ); n_bits = rc_uni_dec_virtual_finish_fx( &range_uni_dec_state ); /* Q0 */ - set_zero_fx( res_buf_fx, STEREO_DFT_N_8k ); FOR( Word16 c = 0; c < hStereoDft->res_cod_line_max; c++ ) { @@ -4222,7 +4395,7 @@ void stereo_dft_dec_read_BS_fx( test(); IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_16( ivas_format, MASA_FORMAT ) ) { - *nb_bits = (Word16) Mult_32_16( L_sub( element_brate, SID_2k40 ), INV_FRAME_PER_SEC_Q15 ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; Q0*/ + *nb_bits = (Word16) Mult_32_16( L_sub( element_brate, SID_2k40 ), INV_FRAME_PER_SEC_Q15 ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; Q0*/ move16(); } { diff --git a/lib_dec/ivas_stereo_dft_plc_fx.c b/lib_dec/ivas_stereo_dft_plc_fx.c index 90d9c58235bda9d978657307b0547a9e1c8abda4..6e4af32e5c6a1b0f13468ba98046cc7eafdfcc70 100644 --- a/lib_dec/ivas_stereo_dft_plc_fx.c +++ b/lib_dec/ivas_stereo_dft_plc_fx.c @@ -58,17 +58,17 @@ * ---------------------------------------------------------------*/ void stereo_dft_res_ecu_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ Word32 *pDFT_RES, /* i/o: residual signal hStereoDft->q_dft*/ Word32 *const DFT_PRED_RES, /* i/o: residual prediction signal hStereoDft->q_dft*/ - const Word16 k, /* i : Subframe index Q0*/ - const Word16 output_frame, /* i : Output frame length Q0*/ - const Word16 prev_bfi, /* i : Previous BFI Q0*/ - const Word32 dmx_nrg, /* i : Down-mix energy Qx*/ - Word16 *num_plocs, /* i/o: Number of peak locations Q0*/ - Word16 *plocs, /* i/o: Peak locations (bin) Q0*/ - Word32 *plocsi, /* i/o: Peak locations (fractional) Qx*/ - Word32 *input_mem /* o : Residual DFT buffer input mem Q11*/ + const Word16 k, /* i : Subframe index Q0*/ + const Word16 output_frame, /* i : Output frame length Q0*/ + const Word16 prev_bfi, /* i : Previous BFI Q0*/ + const Word32 dmx_nrg, /* i : Down-mix energy Qx*/ + Word16 *num_plocs, /* i/o: Number of peak locations Q0*/ + Word16 *plocs, /* i/o: Peak locations (bin) Q0*/ + Word32 *plocsi, /* i/o: Peak locations (fractional) Qx*/ + Word32 *input_mem /* o : Residual DFT buffer input mem Q11*/ ) { Word32 res_buf[L_FRAME8k] = { 0 }; @@ -124,7 +124,7 @@ void stereo_dft_res_ecu_fx( rfft_fx( res_buf, trigo_dec, L_FRAME8k, +1 ); - v_multc_fixed_16( res_buf, fac, res_buf, L_FRAME8k ); /* hStereoDft->q_dft */ + v_multc_fx_16( res_buf, fac, res_buf, L_FRAME8k ); /* hStereoDft->q_dft */ Copy32( res_buf + ( OFFSET8k - ZP8k ), &hStereoDft->res_cod_mem_fx[0], STEREO_DFT_OVL_8k ); /* hStereoDft->q_dft */ hStereoDft->q_res_cod_mem_fx = hStereoDft->q_dft; move16(); @@ -145,7 +145,7 @@ void stereo_dft_res_ecu_fx( v_shr_32( res_buf, res_buf, L_FRAME8k, negate( q_shift ) ); /* hStereoDft->q_dft */ - v_multc_fixed( res_buf, fac, res_buf, L_FRAME8k ); /* hStereoDft->q_dft */ + v_multc_fx( res_buf, fac, res_buf, L_FRAME8k ); /* hStereoDft->q_dft */ /* Cross-fade memory */ fac = 0; @@ -182,12 +182,14 @@ void stereo_dft_res_ecu_fx( /*! r: interpolated maximum position */ Word32 imax_pos_fx( - const Word32 *y /* i : Input vector for peak interpolation Qx*/ + const Word32 *y /* i : Input vector for peak interpolation Qx*/ ) { Word32 posi, y1, y2, y3, y3_y1, y2i; Word32 ftmp_den1, ftmp_den2; Word16 q_div_2i, q_div_posi; + Word64 W_tmp; + Word16 shift1, shift2; /* Seek the extrema of the parabola P(x) defined by 3 consecutive points so that P([-1 0 1]) = [y1 y2 y3] */ y1 = y[0]; /* Qx */ move32(); @@ -195,9 +197,13 @@ Word32 imax_pos_fx( move32(); y3 = y[2]; /* Qx */ move32(); - y3_y1 = L_sub( y3, y1 ); /* Qx */ - ftmp_den1 = L_sub( L_add( y1, y3 ), L_shl( y2, 1 ) ); /* Qx */ - ftmp_den2 = L_shl( L_sub( L_sub( L_shl( y2, 1 ), y1 ), y3 ), 1 ); /* Qx */ + y3_y1 = L_sub( y3, y1 ); /* Qx */ + W_tmp = W_sub( W_add( y1, y3 ), W_shl( y2, 1 ) ); /* Qx */ + shift1 = W_norm( W_tmp ); + ftmp_den1 = W_extract_h( W_shl( W_tmp, shift1 ) ); /* Qx + shift1 - 32 */ + W_tmp = W_shl( W_sub( W_sub( W_shl( y2, 1 ), y1 ), y3 ), 1 ); /* Qx */ + shift2 = W_norm( W_tmp ); + ftmp_den2 = W_extract_h( W_shl( W_tmp, shift2 ) ); /* Qx + shift2 - 32 */ test(); IF( ( ftmp_den2 == 0 ) || ( ftmp_den1 == 0 ) ) @@ -206,6 +212,7 @@ Word32 imax_pos_fx( } y2i = Mpy_32_16_1( Mpy_32_16_1( y3_y1, BASOP_Util_Divide3232_Scale( y3_y1, ftmp_den1, &q_div_2i ) ), (Word16) ( 0xF000 ) ); /* q_div_2i */ + q_div_2i = sub( add( q_div_2i, shift1 ), 32 ); IF( q_div_2i < 0 ) { y2i = L_shl( y2i, q_div_2i ); @@ -219,6 +226,7 @@ Word32 imax_pos_fx( } /* their corresponding normalized locations */ posi = BASOP_Util_Divide3232_Scale( y3_y1, ( ftmp_den2 ), &q_div_posi ); /* q_div_posi */ + q_div_posi = sub( add( q_div_posi, shift2 ), 32 ); IF( ( q_div_posi != 0 ) ) { posi = L_shl( posi, q_div_posi ); @@ -443,7 +451,7 @@ static void ivas_peakfinder_fx( move16(); leftMin = x[ii]; /* Qx */ move32(); - peakLoc[*cInd] = tempLoc; /* Add peak to index Q0*/ + peakLoc[*cInd] = tempLoc; /* Add peak to index Q0*/ move16(); peakMag[*cInd] = tempMag; /* Q0 */ move32(); @@ -536,17 +544,17 @@ static void ivas_peakfinder_fx( * ---------------------------------------------------------------*/ void stereo_dft_res_subst_spec_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ - Word32 *pDFT_RES, /* i/o: residual signal qDFT*/ - const Word32 *const DFT_PRED_RES, /* i : residual prediction signal qDFT*/ - const Word16 time_offs, /* i : Time offset for phase adjustment Q0*/ - const Word16 L_res, /* i : bandwidth of residual signal Q0*/ - const Word16 L_ana, /* i : Length of FFT analysis Q0*/ - const Word16 k, /* i : Subframe index Q0*/ - Word16 *num_plocs, /* i/o: Number of peak locations Q0*/ - Word16 *plocs, /* i/o: Peak locations (bin) Q0*/ - Word32 *plocsi, /* i/o: Peak locations (fractional) Qx*/ - const Word16 analysis_flag /* i : Flag for running peak analysis Q0*/ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ + Word32 *pDFT_RES, /* i/o: residual signal qDFT*/ + const Word32 *const DFT_PRED_RES, /* i : residual prediction signal qDFT*/ + const Word16 time_offs, /* i : Time offset for phase adjustment Q0*/ + const Word16 L_res, /* i : bandwidth of residual signal Q0*/ + const Word16 L_ana, /* i : Length of FFT analysis Q0*/ + const Word16 k, /* i : Subframe index Q0*/ + Word16 *num_plocs, /* i/o: Number of peak locations Q0*/ + Word16 *plocs, /* i/o: Peak locations (bin) Q0*/ + Word32 *plocsi, /* i/o: Peak locations (fractional) Qx*/ + const Word16 analysis_flag /* i : Flag for running peak analysis Q0*/ ) { Word16 i, idx; @@ -647,7 +655,6 @@ void stereo_dft_res_subst_spec_fx( /* Apply phase adjustment of identified peaks, including Np=1 peak neighbors on each side */ FOR( i = *num_plocs - 1; i >= 0; i-- ) { - Flag flg_ov; IF( k == 0 ) { Word32 op; @@ -699,7 +706,7 @@ void stereo_dft_res_subst_spec_fx( move32(); } - cos_F = shl_o( getCosWord16( extract_l( corr_phase ) ), 1, &flg_ov ); + cos_F = shl_sat( getCosWord16( extract_l( corr_phase ) ), 1 ); sin_F = getSinWord16( extract_l( corr_phase ) ); idx = s_max( 0, sub( plocs[i], Np ) ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */ @@ -723,11 +730,11 @@ void stereo_dft_res_subst_spec_fx( * ---------------------------------------------------------------*/ void stereo_dft_res_ecu_burst_att_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ Word32 *pDFT_RES, /* i/o: residual signal /att. residual qDFT*/ - const Word32 dmx_nrg, /* i : dmx energy of current frame Qx*/ - const Word16 L_res, /* i : Bandwidth of residual Q0*/ - const Word16 L_ana /* i : Length of FFT analysis Q0*/ + const Word32 dmx_nrg, /* i : dmx energy of current frame Qx*/ + const Word16 L_res, /* i : Bandwidth of residual Q0*/ + const Word16 L_ana /* i : Length of FFT analysis Q0*/ ) { Word32 fac; @@ -749,7 +756,7 @@ void stereo_dft_res_ecu_burst_att_fx( fac = L_sub( MAX_32, L_deposit_h( BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->time_offs, L_ana ), L_add( hStereoDft->time_offs, L_ana ), &q_fac ) ) ); /* Q0 */ } - v_multc_fixed( pDFT_RES, fac, pDFT_RES, shl( L_res, 1 ) ); + v_multc_fx( pDFT_RES, fac, pDFT_RES, shl( L_res, 1 ) ); return; } @@ -762,9 +769,9 @@ void stereo_dft_res_ecu_burst_att_fx( /*! r: total energy of downmix with maximum swb bandwidth max */ Word32 stereo_dft_dmx_swb_nrg_fx( - const Word32 *dmx_k0, /* i : first subframe spectrum q0*/ - const Word32 *dmx_k1, /* i : second subframe spectrum q1*/ - const Word16 frame_length, /* i : frame lanegth Q0*/ + const Word32 *dmx_k0, /* i : first subframe spectrum q0*/ + const Word32 *dmx_k1, /* i : second subframe spectrum q1*/ + const Word16 frame_length, /* i : frame lanegth Q0*/ const Word16 q0, const Word16 q1 ) { @@ -779,8 +786,9 @@ Word32 stereo_dft_dmx_swb_nrg_fx( FOR( i = 0; i < frame_length / 2; i++ ) { dmx_nrg = L_add( dmx_nrg, - L_add( Madd_32_32( Mpy_32_32( dmx_k0[2 * i], dmx_k0[2 * i] ), dmx_k0[2 * i + 1], dmx_k0[2 * i + 1] ), - Madd_32_32( Mpy_32_32( dmx_k1[2 * i], dmx_k1[2 * i] ), dmx_k1[2 * i + 1], dmx_k1[2 * i + 1] ) ) ); /* Q0 */ + L_shr( L_add( Madd_32_32( Mpy_32_32( dmx_k0[2 * i], dmx_k0[2 * i] ), dmx_k0[2 * i + 1], dmx_k0[2 * i + 1] ), + Madd_32_32( Mpy_32_32( dmx_k1[2 * i], dmx_k1[2 * i] ), dmx_k1[2 * i + 1], dmx_k1[2 * i + 1] ) ), + 1 ) ); /* Q0 */ } } ELSE @@ -788,8 +796,9 @@ Word32 stereo_dft_dmx_swb_nrg_fx( FOR( i = 0; i < frame_length / 2; i++ ) { dmx_nrg = L_add( dmx_nrg, - L_add( L_shl( Madd_32_32( Mpy_32_32( dmx_k0[2 * i], dmx_k0[2 * i] ), dmx_k0[2 * i + 1], dmx_k0[2 * i + 1] ), q0 ), - L_shl( Madd_32_32( Mpy_32_32( dmx_k1[2 * i], dmx_k1[2 * i] ), dmx_k1[2 * i + 1], dmx_k1[2 * i + 1] ), q1 ) ) ); /*3*q0 - 31*/ + L_shr( L_add( L_shl( Madd_32_32( Mpy_32_32( dmx_k0[2 * i], dmx_k0[2 * i] ), dmx_k0[2 * i + 1], dmx_k0[2 * i + 1] ), q0 ), + L_shl( Madd_32_32( Mpy_32_32( dmx_k1[2 * i], dmx_k1[2 * i] ), dmx_k1[2 * i + 1], dmx_k1[2 * i + 1] ), q1 ) ), + 1 ) ); /*3*q0 - 31*/ } } diff --git a/lib_dec/ivas_stereo_eclvq_dec_fx.c b/lib_dec/ivas_stereo_eclvq_dec_fx.c index dfa411145fc3ce2930203029047d821a1d37e45d..9d777c9b7bbd1d46ab705d89a8ad8ad1165e6cdc 100644 --- a/lib_dec/ivas_stereo_eclvq_dec_fx.c +++ b/lib_dec/ivas_stereo_eclvq_dec_fx.c @@ -119,7 +119,7 @@ static Word16 arith_decode_prob_escape( * the dequantized vector is obtained using the ECSQ_dequantize_vector method * ---------------------------------------------------------------*/ -void ECSQ_decode( +void ECSQ_decode_fx( ECSQ_instance *ecsq_inst, const Word16 N, /* Q0 */ Word16 *output /* Q0 */ @@ -209,7 +209,7 @@ void ECSQ_decode( } ELSE { - count0 = left0 * ECSQ_tab_inverse[left0 + left1]; /* left0 * round(ECSQ_PROB_TOTAL / (left0 + left1)) Q0*/ + count0 = left0 * ECSQ_tab_inverse[left0 + left1]; /* left0 * round(ECSQ_PROB_TOTAL / (left0 + left1)) Q0*/ sym = rc_uni_dec_read_bit_prob_fast( rc_st_dec, count0, ECSQ_PROB_BITS ); /* Q0 */ } diff --git a/lib_dec/ivas_stereo_ica_dec_fx.c b/lib_dec/ivas_stereo_ica_dec_fx.c index fa0da5cf7f48ea781b9b9599de522302b654893b..a3b2b08485237e25f2da2f5cf8a46cb4abb578ad 100644 --- a/lib_dec/ivas_stereo_ica_dec_fx.c +++ b/lib_dec/ivas_stereo_ica_dec_fx.c @@ -53,19 +53,14 @@ * ---------------------------------------------------------------*/ void stereo_tca_dec_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 *synth_fx[CPE_CHANNELS], /* i/o: output synth qsynth*/ const Word16 output_frame /* i : length of a frame per channel Q0*/ ) { /* Buffers, input Left and right channels @ input_Fs*/ -#ifdef MSAN_FIX Word32 bufChanL_fx[L_DEC_MEM_LEN_ICA + L_FRAME48k] = { 0 }; Word32 bufChanR_fx[L_DEC_MEM_LEN_ICA + L_FRAME48k] = { 0 }; -#else - Word32 bufChanL_fx[L_DEC_MEM_LEN_ICA + L_FRAME48k]; - Word32 bufChanR_fx[L_DEC_MEM_LEN_ICA + L_FRAME48k]; -#endif Word32 *ptrChanL_fx, *ptrChanR_fx; Word32 *target_fx; Word16 target_idx, prevNCShift, currentNCShift, l_shift_adapt; @@ -323,9 +318,9 @@ void stereo_tca_dec_fx( #define MAX_TARGET_GAIN_Q29 1904890240 void stereo_tca_scale_R_channel_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *output_fx, /* i/o: output synthesis, R channel q_out*/ - const Word16 output_frame /* i : frame length Q0*/ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *output_fx, /* i/o: output synthesis, R channel q_out*/ + const Word16 output_frame /* i : frame length Q0*/ ) { STEREO_TCA_DEC_HANDLE hStereoTCA; diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c index 04aeccbb525f0af2ccf95974b6d878db3f3c4332..647ad6e77f1ccb7f3a374f2a1fc804310a77a8b5 100644 --- a/lib_dec/ivas_stereo_icbwe_dec_fx.c +++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c @@ -41,7 +41,6 @@ #include "wmc_auto.h" #include "rom_com.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" #define Q_icBWE 16 @@ -116,15 +115,14 @@ static Word16 FindScale( void stereo_icBWE_dec_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *synthRef_fx, /* i/o: Reference channel HB synthesis at output Fs Q11 */ - Word32 *synth_fx, /* o : Non reference channel HB synthesis at output Fs Q11 */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *synthRef_fx, /* i/o: Reference channel HB synthesis at output Fs Q11 */ + Word32 *synth_fx, /* o : Non reference channel HB synthesis at output Fs Q11 */ const Word16 *fb_synth_ref_fx, /* i : ref. high-band synthesis 16-20 kHz Q_white_exc*/ - const Word16 *voice_factors_fx, /* i : voicing factors Q15 */ - const Word16 output_frame, /* i : frame length Q0 */ - Word16 *Q_syn /* i : Q of synth and synthRef buffers */ - , - const Word16 Q_white_exc /* i : Q of fb_synth_ref_fx */ + const Word16 *voice_factors_fx, /* i : voicing factors Q15 */ + const Word16 output_frame, /* i : frame length Q0 */ + Word16 *Q_syn, /* i : Q of synth and synthRef buffers */ + const Word16 Q_white_exc /* i : Q of fb_synth_ref_fx */ ) { Word16 i, j, k, nbSubFr; @@ -234,12 +232,10 @@ void stereo_icBWE_dec_fx( ELSE { set32_fx( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, 0, output_frame ); -#ifdef MSAN_FIX hCPE->hStereoDft->hb_nrg_subr_fx[0] = 0; move32(); hCPE->hStereoDft->hb_nrg_subr_fx[1] = 0; move32(); -#endif // MSAN_FIX } hCPE->hStereoDft->hb_nrg_subr_fx[0] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[0], shl( shr( hCPE->hStereoDft->NFFT, 1 ), 6 ) ) ); // 2 * (Qsynth + SynthRef_shift) - 40 // 2 * (Qx + SynthRef_shift) - 31 - 15 move32(); @@ -318,7 +314,7 @@ void stereo_icBWE_dec_fx( icbweM2Ref_fx = extract_h( L_add( ONE_IN_Q30, temp ) ); // Q14 gsMapping_fx = extract_h( L_sub( ONE_IN_Q30, temp ) ); // Q14 - winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); //(int16_t)((SHB_OVERLAP_LEN * st->output_Fs) / 16000); Q0 + winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); //(int16_t)((SHB_OVERLAP_LEN * st->output_Fs) / 16000); Q0 winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */ alpha_fx = winSlope_fx; /* Q15 */ move16(); @@ -430,7 +426,7 @@ void stereo_icBWE_dec_fx( test(); IF( LT_32( hCPE->hStereoDftDmx->targetGain_fx, 268435456 /* 0.5 in Q29 */ ) || GT_32( hCPE->hStereoDftDmx->targetGain_fx, 1073741824 /* 2.0 in Q29 */ ) ) { - v_multc_fixed_16_16( voice_factors_fx, 16384 /* 0.5 in Q15 */, nlMixFac_fx, NB_SUBFR16k ); + v_multc_fx_16_16( voice_factors_fx, 16384 /* 0.5 in Q15 */, nlMixFac_fx, NB_SUBFR16k ); } } ELSE @@ -438,7 +434,7 @@ void stereo_icBWE_dec_fx( test(); IF( LT_32( hCPE->hStereoTCA->targetGain_fx, 268435456 /* 0.5 in Q29 */ ) || GT_32( hCPE->hStereoTCA->targetGain_fx, 1073741824 /* 2.0 in Q29 */ ) ) { - v_multc_fixed_16_16( voice_factors_fx, 16384 /* 0.5 in Q15 */, nlMixFac_fx, NB_SUBFR16k ); + v_multc_fx_16_16( voice_factors_fx, 16384 /* 0.5 in Q15 */, nlMixFac_fx, NB_SUBFR16k ); } } @@ -613,7 +609,7 @@ void stereo_icBWE_dec_fx( Q_syn_shb = tmp; move16(); - deemph_fx_32( 0, shb_synth_nonref_fx + L_SHB_LAHEAD, specMapping_fx, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping_fx ) ); + deemph_fx_32( shb_synth_nonref_fx + L_SHB_LAHEAD, specMapping_fx, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping_fx ) ); hStereoICBWE->prev_Q_memshbspec = Q_syn_shb; move16(); Copy32( shb_synth_nonref_fx + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD ); /* Q_syn_shb */ @@ -639,7 +635,7 @@ void stereo_icBWE_dec_fx( IF( EQ_16( st->extl, FB_TBE ) ) { - v_multc_fixed_16_16( fb_synth_ref_fx, gsMapping_fx, fb_synth_nonref_fx, L_FRAME48k ); + v_multc_fx_16_16( fb_synth_ref_fx, gsMapping_fx, fb_synth_nonref_fx, L_FRAME48k ); } /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ @@ -719,13 +715,9 @@ void stereo_icBWE_dec_fx( { IF( LE_16( ratio_L_fx, 29490 /* 0.9 in Q15*/ ) ) { -#ifdef FIX_TMP_714 tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15 -#else - tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 -#endif - tmp = mult_r( tmp, gsMapping_fx ); // Q14 - tmp = mult_r( tmp, gsMapping_fx ); // Q13 + tmp = mult_r( tmp, gsMapping_fx ); // Q14 + tmp = mult_r( tmp, gsMapping_fx ); // Q13 IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) ) { temp1_fx = 0; @@ -819,11 +811,7 @@ void stereo_icBWE_dec_fx( hStereoICBWE->prev_Q_fsout = tmp; move16(); } -#ifndef MSAN_FIX - Scale_sig32( synth_fx, L_FRAME48k, sub( *Q_syn, add( 1, tmp ) ) ); -#else - Scale_sig32( synth_fx, output_frame, sub( *Q_syn, add( 1, tmp ) ) ); /* Qsyn - 1 */ -#endif + Scale_sig32( synth_fx, output_frame, sub( *Q_syn, add( 1, tmp ) ) ); /* Qsyn - 1 */ *Q_syn = sub( *Q_syn, 1 ); @@ -886,13 +874,9 @@ void stereo_icBWE_dec_fx( { IF( LE_16( ratio_L_fx, 29490 /* 0.9 in Q15*/ ) ) { -#ifdef FIX_TMP_714 tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15 -#else - tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 -#endif - tmp = mult_r( tmp, gsMapping_fx ); // Q14 - tmp = mult_r( tmp, gsMapping_fx ); // Q13 + tmp = mult_r( tmp, gsMapping_fx ); // Q14 + tmp = mult_r( tmp, gsMapping_fx ); // Q13 IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) ) { temp1_fx = 0; @@ -918,6 +902,7 @@ void stereo_icBWE_dec_fx( winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */ alpha_fx = winSlope_fx; /* Q15 */ move16(); + Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx ); FOR( i = 0; i < winLen_fx; i++ ) { L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ @@ -925,7 +910,7 @@ void stereo_icBWE_dec_fx( tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */ move32(); - IF( LE_16( alpha_fx, sub( 32767 /* 1.0 in Q15*/, winSlope_fx ) ) ) + if ( LE_16( alpha_fx, winSlope_fx_ ) ) { alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ } @@ -950,10 +935,10 @@ void stereo_icBWE_dec_fx( *-------------------------------------------------------------------*/ void stereo_icBWE_decproc_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 *output[CPE_CHANNELS], /* i/o: output synthesis Q11*/ Word32 outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis Q11*/ - const Word16 last_core, /* i : last core, primary channel Q0*/ + const Word16 last_core, /* i : last core, primary channel Q0*/ const Word16 last_bwidth, /* i : last bandwidth Q0*/ const Word16 output_frame /* i : frame length Q0*/ ) diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index a6b350d3301a38c47499587c69b988d1fa1b3abf..4d5996bb6db4a85e1a527987c0b1da2e27f29473 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -176,9 +176,8 @@ void stereo_mdct_core_dec_fx( Word16 x_len[CPE_CHANNELS][NB_DIV]; /*needed to allocate N_MAX to prevent stereo switching crash */ - Word32 x_0_buf_fx[CPE_CHANNELS][N_MAX]; + Word32 x_0_buf_fx[CPE_CHANNELS][N_MAX]; /* note: in FLP, this buffer is shared with signal_outFB_tmp_fx[][] */ Word32 *x_0_fx[CPE_CHANNELS][NB_DIV]; - Word16 x_0_e[CPE_CHANNELS][NB_DIV]; /* Concealment */ Word16 bfi; @@ -230,6 +229,7 @@ void stereo_mdct_core_dec_fx( set32_fx( x_0_buf_fx[ch], 0, N_MAX ); x_0_fx[ch][0] = &x_0_buf_fx[ch][0]; x_0_fx[ch][1] = &x_0_buf_fx[ch][0] + L_FRAME48k / 2; + nTnsBitsTCX10[ch][0] = 0; move16(); nTnsBitsTCX10[ch][1] = 0; @@ -289,40 +289,14 @@ void stereo_mdct_core_dec_fx( { FOR( j = 0; j < NB_DIV; ++j ) { - x_e[i][j] = 31; + x_e[i][j] = 20; move16(); x_len[i][j] = 0; move16(); - x_0_e[i][j] = 31; - move16(); } } - ivas_mdct_core_invQ_fx( hCPE, nTnsBitsTCX10, p_param, param_lpc, param, fUseTns, tnsData, x_0_fx, x_0_e, x_fx, x_e, x_len, Aq_fx, ms_mask, 0 ); - - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - Word16 subFrames; - // Word16 subFrames = ( hCPE->hCoreCoder[ch]->core == TCX_10_CORE ) ? NB_DIV : 1; - IF( ( hCPE->hCoreCoder[ch]->core == TCX_10_CORE ) ) - { - subFrames = NB_DIV; /* Q0 */ - } - ELSE - { - subFrames = 1; /* Q0 */ - } - move16(); - FOR( k = 0; k < subFrames; ++k ) - { - Scale_sig32( x_fx[ch][k], x_len[ch][k], sub( x_e[ch][k], 20 ) ); /* exp(20) */ - x_e[ch][k] = 20; - move16(); - Scale_sig32( x_0_fx[ch][k], x_len[ch][k], sub( x_0_e[ch][k], 20 ) ); /* exp(20) */ - x_0_e[ch][k] = 20; - move16(); - } - } + ivas_mdct_core_invQ_fx( hCPE, nTnsBitsTCX10, p_param, param_lpc, param, fUseTns, tnsData, x_0_fx, 20, x_fx, 20, x_len, Aq_fx, ms_mask, 0 ); FOR( ch = 0; ch < nChannels; ch++ ) { @@ -437,7 +411,7 @@ void stereo_mdct_core_dec_fx( } Word16 s = getScaleFactor32( x_fx[ch][k], L_frameTCX[ch] ); Scale_sig32( x_fx[ch][k], L_frameTCX[ch], s ); /* exp(x_e + 31 - s) */ - TonalMDCTConceal_SaveFreqSignal_ivas_fx( st->hTonalMDCTConc, x_fx[ch][k], sub( x_e[ch][k], s ), L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline( st, L_frame[ch], L_frameTCX[ch] ) ); + TonalMDCTConceal_SaveFreqSignal_ivas_fx( st->hTonalMDCTConc, x_fx[ch][k], sub( x_e[ch][k], s ), L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline_fx( st, L_frame[ch], L_frameTCX[ch] ) ); Scale_sig32( x_fx[ch][k], L_frameTCX[ch], negate( s ) ); /* exp(x_e) */ } } @@ -465,39 +439,11 @@ void stereo_mdct_core_dec_fx( test(); IF( ( !bfi || ( sts[0]->core != ACELP_CORE || sts[1]->core != ACELP_CORE ) ) && !hCPE->hStereoMdct->isSBAStereoMode ) { - Word16 q_x_1 = 11, q_x_0 = 11; - move16(); - move16(); - - stereo_decoder_tcx_fx( hCPE->hStereoMdct, ms_mask, x_0_fx[1], x_fx[0], x_fx[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 0, &q_x_1, &q_x_0 ); - } - - ivas_mdct_core_tns_ns_fx( hCPE, fUseTns, tnsData, x_fx, Aq_fx_32, 0, x_e ); - FOR( Word16 ind = 0; ind < 2; ind++ ) - { - Word16 nSubFrames; - // Word16 nSubFrames = EQ_16( hCPE->hCoreCoder[ind]->core, TCX_20_CORE ) ? 1 : NB_DIV; - IF( EQ_16( hCPE->hCoreCoder[ind]->core, TCX_20_CORE ) ) - { - nSubFrames = 1; - } - ELSE - { - nSubFrames = NB_DIV; - } - move16(); - Scale_sig32( x_fx[ind][0], shr( L_FRAME_MAX, sub( nSubFrames, 1 ) ), sub( x_e[ind][0], 20 ) ); /* exp(20) */ - x_e[ind][0] = 20; - move16(); - IF( EQ_16( nSubFrames, 2 ) ) - { - Scale_sig32( x_fx[ind][1], shr( L_FRAME_MAX, 1 ), sub( x_e[ind][1], 20 ) ); /* exp(20) */ - x_e[ind][1] = 20; - move16(); - } + stereo_decoder_tcx_fx( hCPE->hStereoMdct, ms_mask, x_0_fx[1], x_fx[0], x_fx[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 0 ); } + ivas_mdct_core_tns_ns_fx( hCPE, fUseTns, tnsData, x_fx, Aq_fx_32, 0, 20 ); test(); test(); IF( EQ_16( st_ivas->renderer_type, RENDERER_MC_PARAMMC ) && ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) @@ -540,13 +486,8 @@ void stereo_mdct_core_dec_fx( move16(); } } -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_Aq_12_8_fx, hCPE->hCoreCoder[0]->old_Aq_12_8_fx_32, M + 1, sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[0]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); /* Q28 */ Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[1]->old_Aq_12_8_fx, hCPE->hCoreCoder[1]->old_Aq_12_8_fx_32, M + 1, sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[1]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); /* Q28 */ -#else - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->old_Aq_12_8_fx, hCPE->hCoreCoder[0]->old_Aq_12_8_fx_32, M + 1, ( 28 - norm_s( hCPE->hCoreCoder[0]->old_Aq_12_8_fx[0] - 1 ) ) ); /* Q28 */ - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[1]->old_Aq_12_8_fx, hCPE->hCoreCoder[1]->old_Aq_12_8_fx_32, M + 1, ( 28 - norm_s( hCPE->hCoreCoder[1]->old_Aq_12_8_fx[0] - 1 ) ) ); /* Q28 */ -#endif ivas_mdct_core_reconstruct_fx( hCPE, x_fx, signal_outFB_tmp_fx, fUseTns, 0, Q11, e_sigFB ); Copy32( signal_out_tmp_fx[0], signal_out_fx[0], L_FRAME48k ); /* Q11 */ @@ -567,10 +508,10 @@ void stereo_mdct_core_dec_fx( *--------------------------------------------------------------------*/ static void apply_dmx_weights_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 *x[CPE_CHANNELS][NB_DIV], /* i/o: MDCT Spectrum Q11*/ - Word16 transform_type_left[NB_DIV], /* i : indicate TCX5 for left ch Q0*/ - Word16 transform_type_right[NB_DIV] /* i : indicate TCX5 for right ch Q0*/ + Word16 transform_type_left[NB_DIV], /* i : indicate TCX5 for left ch Q0*/ + Word16 transform_type_right[NB_DIV] /* i : indicate TCX5 for right ch Q0*/ ) { Word16 b, k, l, i, ch; @@ -605,7 +546,7 @@ static void apply_dmx_weights_fx( { /* use TCX20 band config for TCX20 in both channels and mixed frames */ sfbConf = &hCPE->hStereoMdct->stbParamsTCX20; - nsub = nsub2[0] = nsub2[1] = 1; /* overall TCX 20 Q0*/ + nsub = nsub2[0] = nsub2[1] = 1; /* overall TCX 20 Q0*/ move16(); move16(); move16(); @@ -1094,8 +1035,8 @@ static void run_min_stats_fx( { arr_tmp = power_spec; } - ApplyFdCng_ivas_fx( NULL, 0, arr_tmp, power_spec_q, NULL, NULL, NULL, st, st->bfi, 0 ); - /*=================================================*/ + + ApplyFdCng_fx( NULL, 0, arr_tmp, power_spec_q, NULL, NULL, NULL, st, st->bfi, 0 ); } /* restore VAD (see above) */ diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c b/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c index 5b1378a894fead3f6efabcef3e7746132dccad56..1a639a3d7d4e79b5324f22361a7b1c97b31a5409 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c @@ -48,12 +48,16 @@ static void inverseBwMS_fx( const Word16 startLine, const Word16 stopLine, Word32 x0[], Word32 x1[], const Word32 norm_fac ); -#define NF_RED_FAC_FIXED 1610612736 // Q31 -#define SQRT2_OVER_2_FIXED 1518500250 // Q31 -#define POINT_8_FIXED 1717986918 // Q31 -#define POINT_2_FIXED 429496730 // Q31 -#define ONE_POINT_3_FIXED 87241523 // Q26 -#define POINT_9_FIXED 60397978 // Q26 +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ + +#define NF_RED_FAC_FX 1610612736 // Q31 +#define POINT_8_FX 1717986918 // Q31 +#define POINT_2_FX 429496730 // Q31 +#define ONE_POINT_3_FX 87241523 // Q26 +#define POINT_9_FX 60397978 // Q26 + /*-------------------------------------------------------------------* * parse_stereo_from_bitstream @@ -62,12 +66,12 @@ static void inverseBwMS_fx( const Word16 startLine, const Word16 stopLine, Word3 *-------------------------------------------------------------------*/ void parse_stereo_from_bitstream( - STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo decoder structure */ - Decoder_State **sts, /* i/o: decoder state structure */ - const Word16 mct_on, /* i : flag mct block (1) or stereo (0) Q0*/ - const Word16 isSBAStereoMode, /* i : flag core coding for SBA Q0*/ - Decoder_State *st0, /* i/o: decoder state structure for Bstr */ - Word16 ms_mask[NB_DIV][MAX_SFB] /* o : bandwise MS mask Q0*/ + STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + const Word16 mct_on, /* i : flag mct block (1) or stereo (0) Q0*/ + const Word16 isSBAStereoMode, /* i : flag core coding for SBA Q0*/ + Decoder_State *st0, /* i/o: decoder state structure for Bstr */ + Word16 ms_mask[NB_DIV][MAX_SFB] /* o : bandwise MS mask Q0*/ ) { Word16 i, k, nSubframes, mdct_stereo_mode; @@ -233,7 +237,7 @@ void parse_stereo_from_bitstream( IF( !mct_on ) { - hStereoMdct->split_ratio = SMDCT_EQUAL_RATIO_RANGE; /* Equal bits to both channels Q0*/ + hStereoMdct->split_ratio = SMDCT_EQUAL_RATIO_RANGE; /* Equal bits to both channels Q0*/ move16(); hStereoMdct->split_ratio = extract_l( get_next_indice_fx( st0, SMDCT_NBBITS_SPLIT_RATIO ) ); /* Q0 */ @@ -250,12 +254,13 @@ void parse_stereo_from_bitstream( * * Band-wise M/S stereo processing *-------------------------------------------------------------------*/ + static void inverseBwMS_fx( - const Word16 startLine, /* i : start line of sfb Q0*/ - const Word16 stopLine, /* i : stop line of sfb Q0*/ - Word32 x0[], /* i/o: mid/left channel coefficients Qx*/ - Word32 x1[], /* i/o: side/right channel coefficients Qx*/ - const Word32 norm_fac /* i : normalization factor Q31*/ + const Word16 startLine, /* i : start line of sfb Q0*/ + const Word16 stopLine, /* i : stop line of sfb Q0*/ + Word32 x0[], /* i/o: mid/left channel coefficients Qx*/ + Word32 x1[], /* i/o: side/right channel coefficients Qx*/ + const Word32 norm_fac /* i : normalization factor Q31*/ ) { Word16 j; @@ -280,11 +285,12 @@ static void inverseBwMS_fx( * * M/S stereo processing *-------------------------------------------------------------------*/ + void inverseMS_fx( - const Word16 L_frame, /* i : frame length Q0*/ - Word32 x0[], /* i/o: mid/left channel coefficients Qx*/ - Word32 x1[], /* i/o: side/right channel coefficients Qx*/ - const Word32 norm_fac /* i : normalization factor Q31*/ + const Word16 L_frame, /* i : frame length Q0*/ + Word32 x0[], /* i/o: mid/left channel coefficients Qx*/ + Word32 x1[], /* i/o: side/right channel coefficients Qx*/ + const Word32 norm_fac /* i : normalization factor Q31*/ ) { inverseBwMS_fx( 0, L_frame, x0, x1, norm_fac ); @@ -298,24 +304,24 @@ void inverseMS_fx( * * apply stereo processing (inverse MS and global ILD) *-------------------------------------------------------------------*/ + void stereo_decoder_tcx_fx( - STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: MDCT stereo decoder structure */ - Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask Q0*/ - Word32 *spec_r_0[NB_DIV], /* i/o: spectrum right channel Qx*/ - Word32 *spec_l[], /* i/o: spectrum left channel [NB_DIV][N] Qx*/ - Word32 *spec_r[], /* i/o: spectrum right channel [NB_DIV][N] Qx*/ - const Word16 mdct_stereo_mode[], /* i : stereo mode (FB/band wise MS, dual mono Q0*/ - const Word16 core_l, /* i : core for left channel (TCX20/TCX10) Q0*/ - const Word16 core_r, /* i : core for right channel (TCX20/TCX10) Q0*/ - const Word16 igf, /* i : flag for IGF activity Q0*/ - const Word16 L_frameTCX_l, /* i : TCX frame length of left channel Q0*/ - const Word16 L_frameTCX_r, /* i : TCX frame length of right channel Q0*/ - const Word16 mct_on, /* i : flag mct block (1) or stereo (0) Q0*/ - const Word16 last_core_l, /* i : last core for left channel Q0*/ - const Word16 last_core_r, /* i : last core for right channel Q0*/ - const Word16 tmp_plc_upmix, /* i : indicates temp upmix for PLC decision Q0*/ - Word16 *q_x_ch2, - Word16 *q_x_ch1 ) + STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: MDCT stereo decoder structure */ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask Q0*/ + Word32 *spec_r_0[NB_DIV], /* i/o: spectrum right channel Qx*/ + Word32 *spec_l[], /* i/o: spectrum left channel [NB_DIV][N] Qx*/ + Word32 *spec_r[], /* i/o: spectrum right channel [NB_DIV][N] Qx*/ + const Word16 mdct_stereo_mode[], /* i : stereo mode (FB/band wise MS, dual mono Q0*/ + const Word16 core_l, /* i : core for left channel (TCX20/TCX10) Q0*/ + const Word16 core_r, /* i : core for right channel (TCX20/TCX10) Q0*/ + const Word16 igf, /* i : flag for IGF activity Q0*/ + const Word16 L_frameTCX_l, /* i : TCX frame length of left channel Q0*/ + const Word16 L_frameTCX_r, /* i : TCX frame length of right channel Q0*/ + const Word16 mct_on, /* i : flag mct block (1) or stereo (0) Q0*/ + const Word16 last_core_l, /* i : last core for left channel Q0*/ + const Word16 last_core_r, /* i : last core for right channel Q0*/ + const Word16 tmp_plc_upmix /* i : indicates temp upmix for PLC decision Q0*/ +) { Word16 i, k, sfb, nSubframes; STEREO_MDCT_BAND_PARAMETERS *sfbConf = NULL; @@ -356,15 +362,11 @@ void stereo_decoder_tcx_fx( { IF( EQ_32( spec_r_0[k][i], 0 ) ) { - spec_r[k][i] = Mpy_32_32( spec_r[k][i], NF_RED_FAC_FIXED ); /* Qx */ + spec_r[k][i] = Mpy_32_32( spec_r[k][i], NF_RED_FAC_FX ); /* Qx */ move32(); } } - inverseMS_fx( sfbConf->sfbOffset[sfbConf->nBandsStereoCore], spec_l[k], spec_r[k], SQRT2_OVER_2_FIXED ); - *q_x_ch2 = *q_x_ch2; - move16(); - *q_x_ch1 = *q_x_ch1; - move16(); + inverseMS_fx( sfbConf->sfbOffset[sfbConf->nBandsStereoCore], spec_l[k], spec_r[k], SQRT2_OVER_2_FX ); } ELSE IF( EQ_16( mdct_stereo_mode[k], SMDCT_BW_MS ) ) { @@ -376,15 +378,11 @@ void stereo_decoder_tcx_fx( { IF( EQ_32( spec_r_0[k][i], 0 ) ) { - spec_r[k][i] = Mpy_32_32( spec_r[k][i], NF_RED_FAC_FIXED ); /* Qx */ + spec_r[k][i] = Mpy_32_32( spec_r[k][i], NF_RED_FAC_FX ); /* Qx */ move32(); } } - inverseBwMS_fx( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], spec_l[k], spec_r[k], SQRT2_OVER_2_FIXED ); - *q_x_ch2 = *q_x_ch2; - move16(); - *q_x_ch1 = *q_x_ch1; - move16(); + inverseBwMS_fx( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], spec_l[k], spec_r[k], SQRT2_OVER_2_FX ); } } } @@ -397,15 +395,11 @@ void stereo_decoder_tcx_fx( { IF( EQ_32( spec_r_0[k][i], 0 ) ) { - spec_r[k][i] = Mpy_32_32( spec_r[k][i], NF_RED_FAC_FIXED ); /* Qx */ + spec_r[k][i] = Mpy_32_32( spec_r[k][i], NF_RED_FAC_FX ); /* Qx */ move32(); } } - inverseMS_fx( sub( sfbConf->sfbOffset[sfbConf->sfbCnt], sfbConf->sfbOffset[sfbConf->nBandsStereoCore] ), &spec_l[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], &spec_r[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], SQRT2_OVER_2_FIXED ); - *q_x_ch2 = *q_x_ch2; - move16(); - *q_x_ch1 = *q_x_ch1; - move16(); + inverseMS_fx( sub( sfbConf->sfbOffset[sfbConf->sfbCnt], sfbConf->sfbOffset[sfbConf->nBandsStereoCore] ), &spec_l[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], &spec_r[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], SQRT2_OVER_2_FX ); } ELSE IF( EQ_16( hStereoMdct->IGFStereoMode[k], SMDCT_BW_MS ) ) { @@ -417,15 +411,11 @@ void stereo_decoder_tcx_fx( { IF( EQ_32( spec_r_0[k][i], 0 ) ) { - spec_r[k][i] = Mpy_32_32( spec_r[k][i], NF_RED_FAC_FIXED ); /* Qx */ + spec_r[k][i] = Mpy_32_32( spec_r[k][i], NF_RED_FAC_FX ); /* Qx */ move32(); } } - inverseBwMS_fx( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], spec_l[k], spec_r[k], SQRT2_OVER_2_FIXED ); - *q_x_ch2 = *q_x_ch2; - move16(); - *q_x_ch1 = *q_x_ch1; - move16(); + inverseBwMS_fx( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], spec_l[k], spec_r[k], SQRT2_OVER_2_FX ); } } } @@ -433,19 +423,19 @@ void stereo_decoder_tcx_fx( IF( !mct_on ) { - tmp_32 = BASOP_Util_Divide3232_Scale_cadence( SMDCT_ILD_RANGE << 16, L_deposit_h( hStereoMdct->global_ild[k] ), &tmp_e ); + tmp_32 = BASOP_Util_Divide3232_Scale_newton( SMDCT_ILD_RANGE << 16, L_deposit_h( hStereoMdct->global_ild[k] ), &tmp_e ); tmp_32 = L_shr( tmp_32, sub( 5, tmp_e ) ); /* nrgRatio = nrg[1]/nrg[0] */ // Q26 nrgRatio = L_sub( tmp_32, ONE_IN_Q26 ); // Q26 - hStereoMdct->smooth_ratio_fx = W_extract_h( W_mac_32_32( W_mult_32_32( POINT_8_FIXED, hStereoMdct->smooth_ratio_fx ), POINT_2_FIXED, nrgRatio ) ); // Q26 + hStereoMdct->smooth_ratio_fx = W_extract_h( W_mac_32_32( W_mult_32_32( POINT_8_FX, hStereoMdct->smooth_ratio_fx ), POINT_2_FX, nrgRatio ) ); // Q26 move32(); /* set flag to reverse dmx computation in case of right-side panning, only relevant for mono output */ - IF( GT_32( hStereoMdct->smooth_ratio_fx, ONE_POINT_3_FIXED ) ) + IF( GT_32( hStereoMdct->smooth_ratio_fx, ONE_POINT_3_FX ) ) { hStereoMdct->reverse_dmx = 1; /* Q0 */ move16(); } - ELSE IF( LT_32( hStereoMdct->smooth_ratio_fx, POINT_9_FIXED ) ) + ELSE IF( LT_32( hStereoMdct->smooth_ratio_fx, POINT_9_FX ) ) { hStereoMdct->reverse_dmx = 0; /* Q0 */ move16(); @@ -480,20 +470,16 @@ void stereo_decoder_tcx_fx( IF( ( GT_32( nrgRatio, ONE_IN_Q26 ) ) && ( LT_16( k, tmp1 ) ) ) { shift = norm_l( nrgRatio ); - nrgRatio = L_shl( nrgRatio, shift ); /* Q26 + shift */ - v_multc_fixed( spec_r[k], nrgRatio, spec_r[k], L_frameTCX_r ); /* spec_r will be in Qx + shift - Q5 */ - Scale_sig32( spec_r[k], L_frameTCX_r, sub( 5, shift ) ); /* Qx */ - *q_x_ch2 = *q_x_ch2; - move16(); + nrgRatio = L_shl( nrgRatio, shift ); /* Q26 + shift */ + v_multc_fx( spec_r[k], nrgRatio, spec_r[k], L_frameTCX_r ); /* spec_r will be in Qx + shift - Q5 */ + Scale_sig32( spec_r[k], L_frameTCX_r, sub( 5, shift ) ); /* Qx */ } ELSE IF( ( LT_32( nrgRatio, ONE_IN_Q26 ) ) && ( LT_16( k, tmp2 ) ) ) { - inv_nrgRatio = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q26, nrgRatio, &tmp_e ); + inv_nrgRatio = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q26, nrgRatio, &tmp_e ); shift = sub( 5, tmp_e ); - v_multc_fixed( spec_l[k], inv_nrgRatio, spec_l[k], L_frameTCX_l ); /* spec_r will be in Qx - tmp_e */ - Scale_sig32( spec_l[k], L_frameTCX_l, sub( 5, shift ) ); /* Qx */ - *q_x_ch1 = *q_x_ch1; - move16(); + v_multc_fx( spec_l[k], inv_nrgRatio, spec_l[k], L_frameTCX_l ); /* spec_r will be in Qx - tmp_e */ + Scale_sig32( spec_l[k], L_frameTCX_l, sub( 5, shift ) ); /* Qx */ } } } /* for k */ @@ -509,10 +495,10 @@ void stereo_decoder_tcx_fx( *-------------------------------------------------------------------*/ void initMdctStereoDecData_fx( - STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ - const Word16 igf, /* i : flag indicating IGF activity Q0*/ - const H_IGF_GRID igfGrid, /* i : IGF grid configuration Q0*/ - const Word32 element_brate, /* i : element bitrate Q0*/ + STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ + const Word16 igf, /* i : flag indicating IGF activity Q0*/ + const H_IGF_GRID igfGrid, /* i : IGF grid configuration Q0*/ + const Word32 element_brate, /* i : element bitrate Q0*/ const Word16 bwidth /* i : audio bandwidth Q0*/ ) { @@ -648,7 +634,7 @@ void synchonize_channels_mdct_sid_fx( move16(); sts[1]->bwidth = sts[0]->bwidth; move16(); - sts[0]->hFdCngDec->hFdCngCom->coherence_fx = sts[1]->hFdCngDec->hFdCngCom->coherence_fx; /* coherence is stored in sts[1] - see ivas_decision_matrix_dec() */ + sts[0]->hFdCngDec->hFdCngCom->coherence_fx[0] = sts[1]->hFdCngDec->hFdCngCom->coherence_fx[0]; /* coherence is stored in sts[1] - see ivas_decision_matrix_dec() */ move16(); sts[0]->hFdCngDec->hFdCngCom->no_side_flag = sts[1]->hFdCngDec->hFdCngCom->no_side_flag; move16(); @@ -680,15 +666,12 @@ void synchonize_channels_mdct_sid_fx( * between active/inactive coding in MDCT-Stereo DTX *-------------------------------------------------------------------*/ -// helper function -static void update_exp( Word16 *a_exp, Word16 *b_exp, Word16 *buff_a, Word16 *buff_b, Word16 legth ); - static void update_exp( Word16 *a_exp, Word16 *b_exp, - Word16 *buff_a, /* exp(a_exp) */ - Word16 *buff_b, /* exp(b_exp) */ - Word16 legth /* Q0 */ + Word16 *buff_a, /* exp(a_exp) */ + Word16 *buff_b, /* exp(b_exp) */ + const Word16 legth /* Q0 */ ) { Word16 diff = 0; @@ -904,13 +887,8 @@ void updateBuffersForDmxMdctStereo_fx( move16(); sts[0]->hTcxLtpDec->exp_tcxltp_mem_out = add( sts[0]->hTcxLtpDec->exp_tcxltp_mem_out, 1 ); move16(); -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( &sts[0]->hTcxLtpDec->tcxltp_mem_in[0], &sts[0]->hTcxLtpDec->tcxltp_mem_in_32[0], TCXLTP_MAX_DELAY, sub( 11, sub( 15, sts[0]->hTcxLtpDec->exp_tcxltp_mem_in ) ) ); // Q11 Copy_Scale_sig_16_32_no_sat( &sts[0]->hTcxLtpDec->tcxltp_mem_out[0], &sts[0]->hTcxLtpDec->tcxltp_mem_out_32[0], TCXLTP_MAX_DELAY, sub( 11, sub( 15, sts[0]->hTcxLtpDec->exp_tcxltp_mem_out ) ) ); // Q11 -#else - Copy_Scale_sig_16_32_DEPREC( &sts[0]->hTcxLtpDec->tcxltp_mem_in[0], &sts[0]->hTcxLtpDec->tcxltp_mem_in_32[0], TCXLTP_MAX_DELAY, sub( 11, sub( 15, sts[0]->hTcxLtpDec->exp_tcxltp_mem_in ) ) ); // Q11 - Copy_Scale_sig_16_32_DEPREC( &sts[0]->hTcxLtpDec->tcxltp_mem_out[0], &sts[0]->hTcxLtpDec->tcxltp_mem_out_32[0], TCXLTP_MAX_DELAY, sub( 11, sub( 15, sts[0]->hTcxLtpDec->exp_tcxltp_mem_out ) ) ); // Q11 -#endif } return; @@ -925,9 +903,9 @@ void updateBuffersForDmxMdctStereo_fx( *-------------------------------------------------------------------*/ void applyDmxMdctStereo_fx( - const CPE_DEC_HANDLE hCPE, /* i : CPE handle */ - Word32 *output_fx[CPE_CHANNELS], /* i/o: core decoder output q_out*/ - const Word16 output_frame /* i : output frame length Q0*/ + const CPE_DEC_HANDLE hCPE, /* i : CPE handle */ + Word32 *output_fx[CPE_CHANNELS], /* i/o: core decoder output q_out*/ + const Word16 output_frame /* i : output frame length Q0*/ ) { Word16 crossfade_len, i; diff --git a/lib_dec/ivas_stereo_switching_dec_fx.c b/lib_dec/ivas_stereo_switching_dec_fx.c index 6c2ad055c02f74fed3a8bf773bc70983246c9915..237b5f9d5fac4fbf400b6cf7ef51d5d1fc58d5d7 100644 --- a/lib_dec/ivas_stereo_switching_dec_fx.c +++ b/lib_dec/ivas_stereo_switching_dec_fx.c @@ -41,13 +41,15 @@ #include "wmc_auto.h" #include #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" + /*-------------------------------------------------------------------* * Local constants *-------------------------------------------------------------------*/ + #define DFT2TD_CORR_THRESH_FX 1932735283 + /*-------------------------------------------------------------------* * Function allocate_CoreCoder_TCX() * @@ -68,6 +70,8 @@ static ivas_error allocate_CoreCoder_TCX_fx( reset_tcx_overl_buf_fx( st->hTcxDec ); // st->hTcxDec->CngLevelBackgroundTrace_bfi = 0; //initializing to avoid garbage overflow; set16_fx( st->hTcxDec->syn_OverlFB, 0, L_FRAME48k / 2 ); + st->hTcxDec->Q_syn_OverlFB = 0; + move16(); set16_fx( st->hTcxDec->old_synth, 0, OLD_SYNTH_INTERNAL_DEC ); st->hTcxDec->q_old_synth = 0; move16(); @@ -154,7 +158,7 @@ static ivas_error allocate_CoreCoder_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for GSC\n" ) ); } - GSC_dec_init_ivas_fx( st->hGSCDec ); + GSC_dec_init_fx( st->hGSCDec ); } IF( st->hPFstat == NULL ) @@ -197,9 +201,7 @@ static ivas_error allocate_CoreCoder_fx( } hf_synth_init_fx( st->hBWE_zero ); -#ifdef MSAN_FIX set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); -#endif } IF( st->cldfbAna == NULL ) @@ -305,8 +307,8 @@ static void deallocate_CoreCoder_fx( /* CLDFB BPF & resampling tools */ IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - deleteCldfb_ivas_fx( &st->cldfbAna ); /* delete analysis at max. sampling rate 48kHz */ - deleteCldfb_ivas_fx( &st->cldfbBPF ); /* delete analysis BPF at max. internal sampling rate 16kHz */ + deleteCldfb_fx( &st->cldfbAna ); /* delete analysis at max. sampling rate 48kHz */ + deleteCldfb_fx( &st->cldfbBPF ); /* delete analysis BPF at max. internal sampling rate 16kHz */ } IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) @@ -341,13 +343,13 @@ static void cpy_tcx_ltp_data_fx( move16(); /* (int16_t) ( ( TCXLTP_MAX_DELAY * output_Fs ) / 48000 ) */ sz = extract_l( Mpy_32_32_r( TCXLTP_MAX_DELAY * output_Fs, 44739 /* 1 / 48000 in Q31 */ ) ); /* Q0 */ - Copy( hTcxLtpDecOld->tcxltp_mem_in, hTcxLtpDecNew->tcxltp_mem_in, sz ); // TODO: One of these will be removed later /* exp(exp_tcxltp_mem_in) */ + Copy( hTcxLtpDecOld->tcxltp_mem_in, hTcxLtpDecNew->tcxltp_mem_in, sz ); // TODO: One of these will be removed later /* exp(exp_tcxltp_mem_in) */ Copy32( hTcxLtpDecOld->tcxltp_mem_in_32, hTcxLtpDecNew->tcxltp_mem_in_32, sz ); /* exp(exp_tcxltp_mem_in) */ hTcxLtpDecNew->exp_tcxltp_mem_in = hTcxLtpDecOld->exp_tcxltp_mem_in; /* exp(exp_tcxltp_mem_in) */ move16(); /* (int16_t) ( ( L_FRAME48k * output_Fs ) / 48000 ) */ sz = extract_l( Mpy_32_32_r( L_FRAME48k * output_Fs, 44739 /* 1 / 48000 in Q31 */ ) ); /* Q0 */ - Copy( hTcxLtpDecOld->tcxltp_mem_out, hTcxLtpDecNew->tcxltp_mem_out, sz ); // TODO: One of these will be removed later /* exp(exp_tcxltp_mem_in) */ + Copy( hTcxLtpDecOld->tcxltp_mem_out, hTcxLtpDecNew->tcxltp_mem_out, sz ); // TODO: One of these will be removed later /* exp(exp_tcxltp_mem_in) */ Copy32( hTcxLtpDecOld->tcxltp_mem_out_32, hTcxLtpDecNew->tcxltp_mem_out_32, sz ); /* exp(exp_tcxltp_mem_in) */ hTcxLtpDecNew->exp_tcxltp_mem_out = hTcxLtpDecOld->exp_tcxltp_mem_out; /* exp(exp_tcxltp_mem_in) */ move16(); @@ -361,14 +363,15 @@ static void cpy_tcx_ltp_data_fx( * * Dynamically allocate/deallocate data structures depending on the actual CPE mode *-------------------------------------------------------------------*/ + ivas_error stereo_memory_dec_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ - CPE_DEC_HANDLE hCPE, /* i : CPE decoder structure */ - const Word16 nb_bits_metadata, /* i : number of metadata bits Q0*/ - const Word32 output_Fs, /* i : output sampling rate Q0*/ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const MC_MODE mc_mode, /* i : MC mode */ - const Word16 nchan_transport /* i : number of transport channels Q0*/ + const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ + CPE_DEC_HANDLE hCPE, /* i : CPE decoder structure */ + const Word16 nb_bits_metadata, /* i : number of metadata bits Q0*/ + const Word32 output_Fs, /* i : output sampling rate Q0*/ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const MC_MODE mc_mode, /* i : MC mode */ + const Word16 nchan_transport /* i : number of transport channels Q0*/ ) { DEC_CORE_HANDLE st; @@ -420,11 +423,12 @@ ivas_error stereo_memory_dec_fx( test(); IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { + assert( hCPE->hCoreCoder[0]->hHQ_core->Q_old_out_fx32 == hCPE->hCoreCoder[1]->hHQ_core->Q_old_out_fx32 ); v_add_32( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[1]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); /* exp(exp_old_out) */ - v_multc_fixed_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, 16384 /* 0.5 in Q15 */, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); /* exp(exp_old_out) */ + v_multc_fx_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, 16384 /* 0.5 in Q15 */, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); /* exp(exp_old_out) */ v_add_32( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[1]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k ); /* q_old_outLB_fx */ - v_multc_fixed_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, 16384 /* 0.5 in Q15 */, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k ); /* exp(exp_old_out) */ + v_multc_fx_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, 16384 /* 0.5 in Q15 */, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k ); /* exp(exp_old_out) */ } /*--------------------------------------------------------------* @@ -514,7 +518,7 @@ ivas_error stereo_memory_dec_fx( /* deallocate data structure of the previous CPE mode */ IF( hCPE->hStereoDft != NULL ) { - stereo_dft_dec_destroy( &( hCPE->hStereoDft ) ); + stereo_dft_dec_destroy_fx( &( hCPE->hStereoDft ) ); hCPE->hStereoDft = NULL; } @@ -686,7 +690,7 @@ ivas_error stereo_memory_dec_fx( /* deallocate data structure of the previous CPE mode */ IF( hCPE->hStereoDft != NULL ) { - stereo_dft_dec_destroy( &( hCPE->hStereoDft ) ); + stereo_dft_dec_destroy_fx( &( hCPE->hStereoDft ) ); hCPE->hStereoDft = NULL; } @@ -759,7 +763,7 @@ ivas_error stereo_memory_dec_fx( if ( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) { - st->last_core = ACELP_CORE; /* needed to set-up TCX core in SetTCXModeInfo() Q0*/ + st->last_core = ACELP_CORE; /* needed to set-up TCX core in SetTCXModeInfo() Q0*/ move16(); } @@ -1091,6 +1095,7 @@ ivas_error stereo_memory_dec_fx( * Synchronize upmixed DFT/TD/MDCT stereo synthesis to match the overall delay of 32ms * Handling of TD stereo <-> DFT stereo transitions *-------------------------------------------------------------------*/ + void synchro_synthesis_fx( const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ @@ -1146,12 +1151,12 @@ void synchro_synthesis_fx( test(); IF( GE_32( hCPE->last_element_brate, IVAS_32k ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) { - dft_mono_brate_switch = -1; /* switch from residual coding mode or MDCT Stereo Q0*/ + dft_mono_brate_switch = -1; /* switch from residual coding mode or MDCT Stereo Q0*/ move16(); } ELSE IF( LE_32( hCPE->last_element_brate, IVAS_24k4 ) && GT_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) { - dft_mono_brate_switch = 1; /* switch to residual coding mode Q0*/ + dft_mono_brate_switch = 1; /* switch to residual coding mode Q0*/ move16(); } } @@ -1262,7 +1267,8 @@ void synchro_synthesis_fx( test(); test(); test(); - IF( ( NE_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && !sba_dirac_stereo_flag && NE_16( dft_mono_brate_switch, -1 ) ) || EQ_16( dft_mono_brate_switch, 1 ) ) + test(); + IF( ( !use_cldfb_for_last_dft && NE_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && !sba_dirac_stereo_flag && NE_16( dft_mono_brate_switch, -1 ) ) || EQ_16( dft_mono_brate_switch, 1 ) ) { Word32 *pPrev_synth_fx; Word32 inv_fade_len_fx = 0; @@ -1678,18 +1684,22 @@ void synchro_synthesis_fx( return; } + /*-------------------------------------------------------------------* * Function stereo_switching_dec() * * Handling of memories in case of CPE modes switching *-------------------------------------------------------------------*/ -Word32 side_gain_table[32 + 1] = { -ONE_IN_Q31, -2040109440, -1932735232, -1825361152, -1717986944, - -1610612736, -1503238528, -1395864320, -1288490240, -1181115904, -1073741824, - -966367616, -858993408, -751619200, -644245120, -536870912, -429496704, - -322122496, -214748288, -107374208, 0, 107374336, 214748416, - 322122496, 429496832, 536870912, 644245248, 751619328, 858993408, - 966367744, 1073741824, 1181116160, 1288490240 }; +static Word32 side_gain_table[32 + 1] = { + -ONE_IN_Q31, -2040109440, -1932735232, -1825361152, -1717986944, + -1610612736, -1503238528, -1395864320, -1288490240, -1181115904, -1073741824, + -966367616, -858993408, -751619200, -644245120, -536870912, -429496704, + -322122496, -214748288, -107374208, 0, 107374336, 214748416, + 322122496, 429496832, 536870912, 644245248, 751619328, 858993408, + 966367744, 1073741824, 1181116160, 1288490240 +}; + void stereo_switching_dec( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ const Word32 ivas_total_brate /* i : IVAS total bitrate Q0*/ @@ -1735,7 +1745,7 @@ void stereo_switching_dec( test(); IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && GE_32( hCPE->element_brate, IVAS_32k ) && LE_32( hCPE->last_element_brate, IVAS_24k4 ) ) { - dft32ms_ovl = extract_l( Mpy_32_32( imult3216( sts[0]->output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 ) ); // 1/48000 = 44740 (Q31) /* Q0 */ + dft32ms_ovl = extract_l( Mpy_32_32( imult3216( sts[0]->output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 ) ); // 1/48000 = 44740 (Q31) /* Q0 */ set32_fx( hCPE->output_mem_fx[0], 0, dft32ms_ovl ); } test(); @@ -1743,7 +1753,7 @@ void stereo_switching_dec( IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && NE_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && hCPE->hCoreCoder[0]->ini_frame > 0 ) { /* windowing the OLA memory */ - dft32ms_ovl = extract_l( Mpy_32_32( imult3216( sts[0]->output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 ) ); // 1/48000 = 44740 (Q31) /* Q0 */ + dft32ms_ovl = extract_l( Mpy_32_32( imult3216( sts[0]->output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 ) ); // 1/48000 = 44740 (Q31) /* Q0 */ FOR( n = 0; n < CPE_CHANNELS; n++ ) { IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) @@ -1941,6 +1951,8 @@ void stereo_switching_dec( Copy( sts[0]->old_exc_fx, sts[1]->old_exc_fx, L_EXC_MEM_DEC ); /* Q_exc */ sts[1]->Q_exc = sts[0]->Q_exc; move16(); + sts[1]->Q_syn_factor = sts[0]->Q_syn_factor; + move16(); sts[1]->Q_exc_cng = sts[0]->Q_exc_cng; move16(); sts[1]->prev_Q_exc = sts[0]->prev_Q_exc; @@ -1981,6 +1993,10 @@ void stereo_switching_dec( Copy( sts[0]->lsf_old_fx, sts[1]->lsf_old_fx, M ); /* Q2.56 */ Copy( sts[0]->lsp_old_fx, sts[1]->lsp_old_fx, M ); /* Q15 */ + + sts[1]->last_core_brate = sts[0]->last_core_brate; + move16(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { sts[1]->last_core = sts[0]->last_core; /* Q0 */ @@ -1988,7 +2004,6 @@ void stereo_switching_dec( sts[1]->last_coder_type = sts[0]->last_coder_type; /* Q0 */ move16(); - // 32bit buffer Copy32( sts[0]->hHQ_core->old_out_fx32, sts[1]->hHQ_core->old_out_fx32, L_FRAME48k ); /* exp(exp_old_out) */ Copy32( sts[0]->delay_buf_out32_fx, sts[1]->delay_buf_out32_fx, HQ_DELTA_MAX * HQ_DELAY_COMP ); /* Q11 */ @@ -2036,11 +2051,14 @@ void stereo_switching_dec( return; } + + /*-------------------------------------------------------------------* * Function stereo_td2dft_update() * * update OLA buffers - needed for switching from TD stereo to DFT stereo *-------------------------------------------------------------------*/ + void stereo_td2dft_update_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ const Word16 n, /* i : channel number Q0*/ @@ -2064,7 +2082,7 @@ void stereo_td2dft_update_fx( sts = hCPE->hCoreCoder; ovl = NS2SA_FX2( i_mult( sts[n]->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ); /* Q0 */ move16(); - dft32ms_ovl = extract_l( Mpy_32_32( imult3216( sts[0]->output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 ) ); // 1/48000 = 44740 (Q31) /* Q0 */ + dft32ms_ovl = extract_l( Mpy_32_32( imult3216( sts[0]->output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 ) ); // 1/48000 = 44740 (Q31) /* Q0 */ move16(); hq_delay_comp = NS2SA_FX2( sts[0]->output_Fs, DELAY_CLDFB_NS ); /* Q0 */ move16(); @@ -2124,12 +2142,10 @@ void stereo_td2dft_update_fx( } ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && hCPE->input_mem_fx[0] != NULL ) { - /* update DFT stereo OLA memories */ /*set_zero( hCPE->input_mem_LB[n], STEREO_DFT32MS_OVL_16k );*/ L_lerp_fx_q11( output_fx + sub( sts[n]->L_frame, ovl ), hCPE->input_mem_LB_fx[n], STEREO_DFT32MS_OVL_16k, ovl ); - /* TCX synthesis (it was already delayed in TD stereo in core_switching_post_dec()) */ IF( sts[n]->hTcxDec != NULL ) { @@ -2151,23 +2167,17 @@ void stereo_td2dft_update_fx( move16(); /* update buffers used for fading when switching to DFT Stereo */ + assert( sts[0]->hHQ_core->Q_old_out_fx32 == sts[1]->hHQ_core->Q_old_out_fx32 ); + v_add_fx( sts[0]->hHQ_core->old_out_LB_fx32 + nsLB, sts[1]->hHQ_core->old_out_LB_fx32 + nsLB, hCPE->old_outLB_mdct_fx, old_outLB_len ); L_lerp_fx_q11( hCPE->old_outLB_mdct_fx, hCPE->old_outLB_mdct_fx, STEREO_MDCT2DFT_FADE_LEN_48k, old_outLB_len ); -#ifndef MSAN_FIX - for ( i = 0; i < STEREO_MDCT2DFT_FADE_LEN_48k; i++ ) -#else FOR( i = 0; i < old_outLB_len; i++ ) -#endif { hCPE->old_outLB_mdct_fx[i] = L_shr( hCPE->old_outLB_mdct_fx[i], 1 ); /* Q11 */ move32(); } v_add_fx( sts[0]->hHQ_core->old_out_fx32 + ns, sts[1]->hHQ_core->old_out_fx32 + ns, hCPE->old_out_mdct_fx, old_out_len ); /* exp(exp_old_out) */ -#ifndef MSAN_FIX - for ( int i = 0; i < STEREO_MDCT2DFT_FADE_LEN_48k; i++ ) -#else FOR( i = 0; i < old_out_len; i++ ) -#endif { hCPE->old_out_mdct_fx[i] = L_shr( hCPE->old_out_mdct_fx[i], 1 ); /* q_old_out_mdct */ move32(); @@ -2190,13 +2200,16 @@ void stereo_td2dft_update_fx( return; } + + /*-------------------------------------------------------------------* * Function stereo_mdct2dft_update() * * update OLA buffers - needed for switching from MDCT stereo to DFT stereo *-------------------------------------------------------------------*/ + void stereo_mdct2dft_update_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 output0_fx[], /* i/o: synthesis @internal Fs, ch0 Q11*/ Word32 synth0_fx[] /* i/o: synthesis @output Fs, ch0 Q11*/ ) @@ -2213,8 +2226,9 @@ void stereo_mdct2dft_update_fx( st = hCPE->hCoreCoder[0]; - fade_len = extract_l( Mpy_32_32( imult3216( st->output_Fs, STEREO_MDCT2DFT_FADE_LEN_48k ), 44740 ) ); // 1/48000 = 44740 (Q31) /* Q0 */ - fade_len_LB = extract_l( Mpy_32_32( imult3216( 3 * STEREO_MDCT2DFT_FADE_LEN_48k * FRAMES_PER_SEC, st->L_frame ), 44740 ) ); // 1/48000 = 44740 (Q31) /* Q0 */ + fade_len = extract_l( Mpy_32_32( imult3216( st->output_Fs, STEREO_MDCT2DFT_FADE_LEN_48k ), 44740 ) ); // 1/48000 = 44740 (Q31) /* Q0 */ + fade_len_LB = extract_l( Mpy_32_32( imult3216( 3 * STEREO_MDCT2DFT_FADE_LEN_48k * FRAMES_PER_SEC, st->L_frame ), 44740 ) ); // 1/48000 = 44740 (Q31) /* Q0 */ + SWITCH( st->output_Fs ) { case 16000: @@ -2230,6 +2244,7 @@ void stereo_mdct2dft_update_fx( move32(); BREAK; } + FOR( i = 0; i < fade_len; i++ ) { Word32 descen_gain; @@ -2316,19 +2331,10 @@ static Word32 ncross_corr_self_fx( Word64 c_c_fx; Word32 c_c_fx_return; Word64 energy_x_fx, energy_y_fx; -#ifndef OPT_STEREO_32KBPS_V1 - Word16 c_c_fx_q; - Word64 energy_xy_fx; -#endif /* OPT_STEREO_32KBPS_V1 */ UWord16 j; Word32 *signal_a_fx, *signal_b_fx; Word32 temp_x, temp_y; Word16 headroom_left_x, headroom_left_y; -#ifndef OPT_STEREO_32KBPS_V1 - Word16 x_inv_q, y_inv_q; - Word16 x_q, y_q; - Word16 res_q; -#endif /* OPT_STEREO_32KBPS_V1 */ c_c_fx = 0; move64(); energy_x_fx = 0; @@ -2339,20 +2345,13 @@ static Word32 ncross_corr_self_fx( signal_b_fx = &signal_fx[y]; /* Q11 */ FOR( j = 0; j < corr_len; j += subsampling ) { -#ifdef OPT_STEREO_32KBPS_V1 c_c_fx = W_mac_32_32( c_c_fx, signal_a_fx[j], signal_b_fx[j] ); /* 2 * Q11 + 1*/ energy_x_fx = W_mac_32_32( energy_x_fx, signal_a_fx[j], signal_a_fx[j] ); /* 2 * Q11+ 1 */ energy_y_fx = W_mac_32_32( energy_y_fx, signal_b_fx[j], signal_b_fx[j] ); /* 2 * Q11+ 1 */ -#else /* OPT_STEREO_32KBPS_V1 */ - c_c_fx = W_add( c_c_fx, W_mult0_32_32( ( signal_a_fx[j] ), ( signal_b_fx[j] ) ) ); /* 2 * Q11 */ - energy_x_fx = W_add( energy_x_fx, W_mult0_32_32( ( signal_a_fx[j] ), ( signal_a_fx[j] ) ) ); /* 2 * Q11 */ - energy_y_fx = W_add( energy_y_fx, W_mult0_32_32( ( signal_b_fx[j] ), ( signal_b_fx[j] ) ) ); /* 2 * Q11 */ -#endif /* OPT_STEREO_32KBPS_V1 */ } headroom_left_x = W_norm( energy_x_fx ); headroom_left_y = W_norm( energy_y_fx ); -#ifdef OPT_STEREO_32KBPS_V1 temp_x = W_extract_h( W_shl( energy_x_fx, headroom_left_x ) ); // Q23 + headroom_left_x -32 temp_y = W_extract_h( W_shl( energy_y_fx, headroom_left_y ) ); // Q23 + headroom_left_y -32 Word64 prod = W_mult0_32_32( temp_x, temp_y ); // Q(headroom_left_x + headroom_left_y - 18) @@ -2361,7 +2360,7 @@ static Word32 ncross_corr_self_fx( q_prod = sub( 81, add( add( headroom_left_x, headroom_left_y ), q_prod ) ); energy = Sqrt32( energy, &q_prod ); - IF( LT_32( energy, L_shl_sat( 1, sub( 31, q_prod ) ) ) ) + IF( LE_32( energy, L_shl_sat( 1, sub( 31, q_prod ) ) ) ) { c_c_fx_return = W_shl_sat_l( c_c_fx, 31 - ( 2 * OUTPUT_Q + 1 ) ); // Q31 } @@ -2371,83 +2370,11 @@ static Word32 ncross_corr_self_fx( Word16 q_cc = W_norm( c_c_fx ); Word32 num = W_extract_h( W_shl( c_c_fx, q_cc ) ); // Q(23 + q_cc - 32) -> e(40 - q_cc) Word16 quo_e; - num = BASOP_Util_Divide3232_Scale_cadence( num, energy, &quo_e ); + num = BASOP_Util_Divide3232_Scale_newton( num, energy, &quo_e ); quo_e = add( sub( sub( 40, q_cc ), q_prod ), quo_e ); c_c_fx_return = L_shl_sat( num, quo_e ); // Q31 } -#else /* OPT_STEREO_32KBPS_V1 */ - IF( LT_16( headroom_left_x, 32 ) ) - { - energy_x_fx = W_shr( energy_x_fx, sub( 32, headroom_left_x ) ); /* 2 * Q11 - (32 -headroom_left_x) */ - x_q = sub( 31, ( sub( ( 2 * OUTPUT_Q ), sub( 32, headroom_left_x ) ) ) ); - } - ELSE - { - x_q = 31 - ( 2 * OUTPUT_Q ); - } - IF( LT_16( headroom_left_y, 32 ) ) - { - energy_y_fx = W_shr( energy_y_fx, sub( 32, headroom_left_y ) ); /* 2 * Q11 - (32 -headroom_left_y) */ - y_q = sub( 31, ( sub( ( 2 * OUTPUT_Q ), ( sub( 32, headroom_left_y ) ) ) ) ); - } - ELSE - { - y_q = 31 - ( 2 * OUTPUT_Q ); - } - - x_inv_q = x_q; - move16(); - y_inv_q = y_q; - move16(); - - temp_x = Sqrt32( W_extract_l( energy_x_fx ), &x_q ); - IF( x_q < 0 ) - { - temp_x = L_shr( temp_x, i_mult( -1, x_q ) ); /* Q0 */ - x_q = 0; - move16(); - } - - temp_y = Sqrt32( W_extract_l( energy_y_fx ), &y_q ); - IF( y_q < 0 ) - { - temp_y = L_shr( temp_y, i_mult( -1, y_q ) ); /* Q0 */ - y_q = 0; - move16(); - } - - energy_xy_fx = Mpy_32_32( temp_x, temp_y ); /* x_q + y_q - 31 */ - res_q = add( y_q, x_q ); - - IF( ( energy_xy_fx < L_shr( ONE_IN_Q31, res_q ) ) || energy_xy_fx == 0 ) - { - energy_xy_fx = ONE_IN_Q31; /* conceal silent frames */ - res_q = 0; - c_c_fx = W_shl( c_c_fx, 31 - ( 2 * OUTPUT_Q ) ); /* Q31 */ - } - ELSE - { - Word32 temp_x_inv = ISqrt32( W_extract_l( energy_x_fx ), &x_inv_q ); - Word32 temp_y_inv = ISqrt32( W_extract_l( energy_y_fx ), &y_inv_q ); - Word16 headroom_left_c_c; - energy_xy_fx = Mpy_32_32( temp_x_inv, temp_y_inv ); /* exp(x_inv_q + y_inv_q) */ - res_q = add( x_inv_q, y_inv_q ); - headroom_left_c_c = W_norm( c_c_fx ); - c_c_fx_q = OUTPUT_Q * 2; - move16(); - IF( LT_16( headroom_left_c_c, 32 ) ) - { - c_c_fx = W_shr( c_c_fx, extract_l( sub( 32, headroom_left_c_c ) ) ); /* c_c_fx_q - (32 - headroom_left_c_c) */ - c_c_fx_q = sub( c_c_fx_q, sub( 32, headroom_left_c_c ) ); - } - c_c_fx = W_deposit32_l( Mpy_32_32( W_extract_l( c_c_fx ), W_extract_l( energy_xy_fx ) ) ); /* c_c_fx_q + (31 - res_q) - 31 */ - c_c_fx_q = add( c_c_fx_q, sub( sub( 31, res_q ), 31 ) ); - c_c_fx = W_extract_l( W_shl_sat_l( c_c_fx, extract_l( sub( 31, c_c_fx_q ) ) ) ); /* Q31 */ - } - c_c_fx_return = W_extract_l( c_c_fx ); /* Q31 */ - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ return c_c_fx_return; } @@ -2460,7 +2387,7 @@ static Word32 ncross_corr_self_fx( *-------------------------------------------------------------------*/ void smooth_dft2td_transition_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 *output_fx[CPE_CHANNELS], /* i/o: synthesis @external Fs Q11*/ const Word16 output_frame /* i : output frame lenght Q0*/ ) diff --git a/lib_dec/ivas_stereo_td_dec_fx.c b/lib_dec/ivas_stereo_td_dec_fx.c index 023c9a2e5e3a1fc4dd97ded44e0ac846508e84ed..ec135d7a0d634cef179b28bad1fe8fe4c4d6bded 100644 --- a/lib_dec/ivas_stereo_td_dec_fx.c +++ b/lib_dec/ivas_stereo_td_dec_fx.c @@ -39,9 +39,13 @@ #include "ivas_rom_com.h" #include "ivas_cnst.h" #include "wmc_auto.h" -#include "ivas_rom_com_fx.h" #include "ivas_prot_fx.h" +/*-------------------------------------------------------------------* + * stereo_td_init_dec() + * + * Initialize TD stereo decoder + *-------------------------------------------------------------------*/ void stereo_td_init_dec_fx( STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ @@ -59,13 +63,13 @@ void stereo_td_init_dec_fx( hStereoTD->tdm_LRTD_flag = 0; move16(); // hStereoTD->prevSP_ratio = 0.5f; - hStereoTD->prevSP_ratio_fx = ONE_IN_Q14; //.5 /* Q15 */ + hStereoTD->prevSP_ratio_fx = ONE_IN_Q14; //.5 /* Q15 */ move16(); // hStereoTD->SP_ratio_LT = 0.0f; hStereoTD->SP_ratio_LT_fx = 0; move32(); // hStereoTD->c_LR_LT = 0.5f; - hStereoTD->c_LR_LT_fx = ONE_IN_Q30; //.5 /* Q31 */ + hStereoTD->c_LR_LT_fx = ONE_IN_Q30; //.5 /* Q31 */ move32(); hStereoTD->flag_skip_DMX = 0; @@ -89,13 +93,15 @@ void stereo_td_init_dec_fx( * * Configure TD stereo decoder *-------------------------------------------------------------------*/ -Word32 power_table[32 + 1] = { + +static Word32 power_table[32 + 1] = { 53687092, 60237908, 67588048, 75835024, 85088304, 95470648, 107119832, 120190432, 134855872, 151310800, 169773488, 190488992, 213732176, 239811440, 269072832, 301904704, 338742656, 380075520, 426451744, 478486688, 536870912, 602379200, 675880448, 758350272, 850883136, 954706496, 1071198464, 1201904384, 1348558720, 1513107968, 1697734912, 1904890240, 2137321728 }; // Q29 + void tdm_configure_dec_fx( const Word16 ivas_format, /* i : IVAS format Q0*/ const Word16 ism_mode, /* i : ISM mode in combined format Q0*/ @@ -210,7 +216,7 @@ void tdm_configure_dec_fx( move16(); } - sts[0]->tdm_LRTD_flag = hStereoTD->tdm_LRTD_flag; /* the flag was already read in function stereo_memory_dec() Q0*/ + sts[0]->tdm_LRTD_flag = hStereoTD->tdm_LRTD_flag; /* the flag was already read in function stereo_memory_dec() Q0*/ move16(); sts[1]->tdm_LRTD_flag = hStereoTD->tdm_LRTD_flag; /* Q0 */ move16(); @@ -355,26 +361,16 @@ void tdm_upmix_plain_fx( { FOR( i = start_index; i < end_index; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 Word32 temp_left = Madd_32_32( SCh_2_R_fx[i], L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ); /* Qx */ Left_fx[i] = W_shl_sat_l( W_mult0_32_32( temp_left, inv_den_LR_ratio_fx ), -30 ); /* Qx */ move32(); Word32 temp_right = Msub_32_32( PCh_2_L_fx[i], L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ); /* Qx */ Right_fx[i] = W_shl_sat_l( W_mult0_32_32( temp_right, inv_den_LR_ratio_fx ), -30 ); /* Qx */ move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - Word32 temp_left = L_add( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), SCh_2_R_fx[i] ); /* Qx */ - Left_fx[i] = L_shl_sat( Mpy_32_32( temp_left, inv_den_LR_ratio_fx ), 1 ); /* Qx + 1 */ - move32(); - Word32 temp_right = L_add( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), L_negate( LR_ratio_fx ) ), PCh_2_L_fx[i] ); /* Qx */ - Right_fx[i] = L_shl_sat( Mpy_32_32( temp_right, inv_den_LR_ratio_fx ), 1 ); /* Qx + 1 */ - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ } } ELSE { -#ifdef OPT_STEREO_32KBPS_V1 Word32 inv_den_LR_ratio_fx_neg = L_negate( inv_den_LR_ratio_fx ); FOR( i = start_index; i < end_index; i++ ) { @@ -385,17 +381,6 @@ void tdm_upmix_plain_fx( Right_fx[i] = W_shl_sat_l( W_mult0_32_32( temp_right, inv_den_LR_ratio_fx_neg ), -30 ); /* Qx */ move32(); } -#else /* OPT_STEREO_32KBPS_V1 */ - FOR( i = start_index; i < end_index; i++ ) - { - Word32 temp_left = L_sub( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), SCh_2_R_fx[i] ); /* Qx */ - Left_fx[i] = L_shl_sat( Mpy_32_32( temp_left, inv_den_LR_ratio_fx ), 1 ); /* Qx + 1 */ - move32(); - Word32 temp_right = L_sub( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), PCh_2_L_fx[i] ); /* Qx */ - Right_fx[i] = L_shl_sat( Mpy_32_32( temp_right, inv_den_LR_ratio_fx ), 1 ); /* Qx + 1 */ - move32(); - } -#endif /* OPT_STEREO_32KBPS_V1 */ } return; @@ -534,7 +519,7 @@ Word32 inv_time[960 + 1] = { }; static void tdm_upmix_fade_fx( Word32 Left_fx[], /* o : left channel Qx*/ - Word32 Right_fx[], /* o : right channel Qx*/ + Word32 Right_fx[], /* o : right channel Qx*/ const Word32 PCh_2_L_fx[], /* i : primary channel Qx*/ const Word32 SCh_2_R_fx[], /* i : secondary channel Qx*/ const Word32 LR_ratio_mem_fx, /* i : last mixing ratio Q31*/ @@ -642,11 +627,11 @@ static void tdm_upmix_fade_fx( void stereo_tdm_combine_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *PCh_2_L_fx, /* i/o: Primary channel -> output as left channel Qx*/ - Word32 *SCh_2_R_fx, /* i/o: Secondary channel -> output as right channel Qx*/ - const Word16 output_frame, /* i : Number of samples Q0*/ - const Word16 flag_HB, /* i : flag to distinguish between core (0) and HB (1) synthesis Q0*/ - const Word16 tdm_ratio_idx /* i : TDM ratio index Q0*/ + Word32 *PCh_2_L_fx, /* i/o: Primary channel -> output as left channel Qx*/ + Word32 *SCh_2_R_fx, /* i/o: Secondary channel -> output as right channel Qx*/ + const Word16 output_frame, /* i : Number of samples Q0*/ + const Word16 flag_HB, /* i : flag to distinguish between core (0) and HB (1) synthesis Q0*/ + const Word16 tdm_ratio_idx /* i : TDM ratio index Q0*/ ) { Word16 i; @@ -696,7 +681,7 @@ void stereo_tdm_combine_fx( } ELSE { - stereo_tdm_coder_type = 1; /* mode 2 : SM scheme Q0*/ + stereo_tdm_coder_type = 1; /* mode 2 : SM scheme Q0*/ move16(); } } diff --git a/lib_dec/ivas_svd_dec_fx.c b/lib_dec/ivas_svd_dec_fx.c old mode 100644 new mode 100755 index 1467687d8b49a576e6b28bbc4ac58a7ccdd2065d..d6811d2df5e53d7d48594daa858eefb15ef8dcd7 --- a/lib_dec/ivas_svd_dec_fx.c +++ b/lib_dec/ivas_svd_dec_fx.c @@ -29,7 +29,6 @@ the United Nations Convention on Contracts on the International Sales of Goods. *******************************************************************************************************/ - #include #include "options.h" #include "prot_fx.h" @@ -67,49 +66,27 @@ static void HouseholderReduction_fx( Word16 *eps_x_fx_e ); static void biDiagonalReductionLeft_fx( - Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ - Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ - Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ -#ifndef FIX_1010_OPT_SINGLE_RESCALE - Word16 *singularVectors_e, -#else - Word16 singularVectors2_e[][MAX_OUTPUT_CHANNELS], -#endif - Word16 singularValues_e[MAX_OUTPUT_CHANNELS], - Word16 *secDiag_e, - const Word16 nChannelsL, /* Q0 */ + Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ + Word16 singularValues_e[][MAX_OUTPUT_CHANNELS], /* Q0 */ + const Word16 nChannelsL, const Word16 nChannelsC, /* Q0 */ const Word16 currChannel, /* Q0 */ - Word32 *sig_x, /* exp(sig_x_e) */ - Word16 *sig_x_e, - Word32 *g /* Q31 */ -); + Word32 *g, + Word16 *g_e ); static void biDiagonalReductionRight_fx( Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ - Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ -#ifndef FIX_1010_OPT_SINGLE_RESCALE - Word16 *singularVectors_e, -#else - Word16 singularVectors2_e[][MAX_OUTPUT_CHANNELS], -#endif - Word16 *secDiag_e, + Word16 singularVectors_e[][MAX_OUTPUT_CHANNELS], const Word16 nChannelsL, /* Q0 */ const Word16 nChannelsC, /* Q0 */ const Word16 currChannel, /* Q0 */ - Word32 *sig_x, /* exp(sig_x_e) */ - Word16 *sig_x_e, - Word32 *g /* Q31 */ -); // Q31 + Word32 *g, + Word16 *g_e ); static void singularVectorsAccumulationLeft_fx( Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) as Input, Q31 as output */ Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ -#ifndef FIX_1010_OPT_SINGLE_RESCALE - Word16 singularVectors_e, -#else Word16 singularVectors_Left_e[][MAX_OUTPUT_CHANNELS], -#endif Word16 singularValues_e[MAX_OUTPUT_CHANNELS], const Word16 nChannelsL, /* Q0 */ const Word16 nChannelsC /* Q0 */ @@ -119,16 +96,8 @@ static void singularVectorsAccumulationRight_fx( Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* singularVectors_e */ Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* singularVectors_e */ Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ -#ifndef FIX_1010_OPT_SINGLE_RESCALE - Word16 singularVectors_e, -#else Word16 singularVectors_Left_e[][MAX_OUTPUT_CHANNELS], -#endif -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - Word16 secDiag_e, -#else Word16 *secDiag_e, -#endif const Word16 nChannelsC /* Q0 */ ); @@ -137,14 +106,14 @@ static Word32 maxWithSign_fx( ); static Word16 BidagonalDiagonalisation_fx( - Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) singularValues_fx_e*/ + Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) singularValues_fx_e*/ Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) singularValues_fx_e*/ - Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) singularValues_fx_e*/ + Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) singularValues_fx_e*/ Word32 secDiag_fx[MAX_OUTPUT_CHANNELS], /* i/o: secDiag_fx_e*/ - Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ - Word16 *secDiag_fx_e, /* i/o: */ - const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ - const Word16 nChannelsC, /* i : number of columns in the matrix to be decomposed Q0*/ + Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ + Word16 *secDiag_fx_e, /* i/o: */ + const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ + const Word16 nChannelsC, /* i : number of columns in the matrix to be decomposed Q0*/ const Word32 eps_x, /* i : eps_x_e*/ const Word16 eps_x_e /* i : */ ); @@ -168,7 +137,6 @@ static void ApplyRotation_fx( const Word16 nChannels /* Q0 */ ); -#ifdef FIX_1010_OPT_GIVENS_INV static void GivensRotation2_fx( const Word32 x, /* exp(x_e) */ const Word16 x_e, @@ -178,7 +146,6 @@ static void GivensRotation2_fx( Word32 *resultInv, Word16 *out_e, Word16 *outInv_e ); -#endif static Word32 GivensRotation_fx( const Word32 x, /* exp(x_e) */ @@ -188,16 +155,16 @@ static Word32 GivensRotation_fx( Word16 *out_e ); static void ApplyQRTransform_fx( - Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) singularValues_e*/ + Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) singularValues_e*/ Word32 singularValues[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) singularValues_e*/ - Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) singularValues_e*/ - Word32 secDiag[MAX_OUTPUT_CHANNELS], /* i/o: secDiag_e*/ + Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) singularValues_e*/ + Word32 secDiag[MAX_OUTPUT_CHANNELS], /* i/o: secDiag_e*/ Word16 singularValues_e[MAX_OUTPUT_CHANNELS], Word16 secDiag_e[MAX_OUTPUT_CHANNELS], - const Word16 startIndex, /* i : Q0*/ - const Word16 currentIndex, /* i : Q0*/ - const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ - const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed Q0*/ + const Word16 startIndex, /* i : Q0*/ + const Word16 currentIndex, /* i : Q0*/ + const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ + const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed Q0*/ ); /*------------------------------------------------------------------------- @@ -207,11 +174,11 @@ static void ApplyQRTransform_fx( *-------------------------------------------------------------------------*/ void mat2svdMat_fx( - const Word32 *mat, /* i : matrix as column ordered vector Qx*/ - Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* o : matrix as two-dimensional arry Qx*/ - const Word16 nRows, /* i : number of rows of the matrix Q0*/ - const Word16 mCols, /* i : number of columns of the matrix Q0*/ - const Word16 transpose /* i : flag indication transposition Q0*/ + const Word32 *mat, /* i : matrix as column ordered vector Qx*/ + Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* o : matrix as two-dimensional arry Qx*/ + const Word16 nRows, /* i : number of rows of the matrix Q0*/ + const Word16 mCols, /* i : number of columns of the matrix Q0*/ + const Word16 transpose /* i : flag indication transposition Q0*/ ) { Word16 i, j; @@ -264,10 +231,10 @@ void mat2svdMat_fx( *---------------------------------------------------------------------*/ void svdMat2mat_fx( - Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* i : matrix as two-dimensional arry Qx*/ - Word32 *mat, /* o : matrix as column ordered vector Qx*/ - const Word16 nRows, /* i : number of rows of the matrix Q0*/ - const Word16 mCols /* i : number of columns of the matrix Q0*/ + Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* i : matrix as two-dimensional arry Qx*/ + Word32 *mat, /* o : matrix as column ordered vector Qx*/ + const Word16 nRows, /* i : number of rows of the matrix Q0*/ + const Word16 mCols /* i : number of columns of the matrix Q0*/ ) { Word16 i, j; @@ -294,23 +261,19 @@ void svdMat2mat_fx( Word16 svd_fx( Word32 InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) InputMatrix_e*/ Word16 InputMatrix_e, - Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) singularValues_fx_e*/ + Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) singularValues_fx_e*/ Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) singularValues_fx_e*/ - Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) singularValues_fx_e*/ + Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) singularValues_fx_e*/ Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], - const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ - const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed Q0*/ + const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ + const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed Q0*/ ) { Word16 iCh, jCh; Word16 lengthSingularValues; Word16 errorMessage, condition; Word32 secDiag_fx[MAX_OUTPUT_CHANNELS]; -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - Word16 secDiag_fx_e = 0; -#else Word16 secDiag_fx_e[MAX_OUTPUT_CHANNELS]; -#endif move16(); Word32 eps_x_fx = 0, temp_fx; move16(); @@ -320,11 +283,6 @@ Word16 svd_fx( push_wmops( "svd_fx" ); -#ifndef FIX_1010_OPT_SINGLE_RESCALE - set32_fx( secDiag_fx, 0, MAX_OUTPUT_CHANNELS ); - set16_fx( singularValues_fx_e, 0, MAX_OUTPUT_CHANNELS ); -#endif - /* Collecting Values */ FOR( iCh = 0; iCh < nChannelsL; iCh++ ) { @@ -336,22 +294,14 @@ Word16 svd_fx( } /* Householder reduction */ -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - HouseholderReduction_fx( singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, InputMatrix_e, singularValues_fx_e, &secDiag_fx_e, nChannelsL, nChannelsC, &eps_x_fx, &eps_x_fx_e ); -#else HouseholderReduction_fx( singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, InputMatrix_e, singularValues_fx_e, secDiag_fx_e, nChannelsL, nChannelsC, &eps_x_fx, &eps_x_fx_e ); -#endif /* Set extremely small values to zero if needed */ // flushToZeroArray(singularValues, max_length); // flushToZeroMat(singularVectors_Left, nChannelsL, nChannelsL); // flushToZeroMat(singularVectors_Right, nChannelsC, nChannelsC); /* BidagonalDiagonalisation */ -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - errorMessage = BidagonalDiagonalisation_fx( singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, singularValues_fx_e, &secDiag_fx_e, nChannelsL, nChannelsC, eps_x_fx, eps_x_fx_e ); /* Q0 */ -#else errorMessage = BidagonalDiagonalisation_fx( singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, singularValues_fx_e, secDiag_fx_e, nChannelsL, nChannelsC, eps_x_fx, eps_x_fx_e ); /* Q0 */ -#endif /* Sort the singular values descending order */ lengthSingularValues = s_min( nChannelsL, nChannelsC ); /* Q0 */ @@ -361,7 +311,7 @@ Word16 svd_fx( move16(); FOR( iCh = 0; iCh < lengthSingularValues - 1; iCh++ ) { - IF( BASOP_Util_Cmp_Mant32Exp( singularValues_fx[iCh], singularValues_fx_e[iCh], singularValues_fx[iCh + 1], singularValues_fx_e[iCh + 1] ) < 0 ) + IF( LT_32( L_shl_sat( singularValues_fx[iCh], sub( singularValues_fx_e[iCh], singularValues_fx_e[iCh + 1] ) ), singularValues_fx[iCh + 1] ) ) { condition = 1; move16(); @@ -418,20 +368,16 @@ Word16 svd_fx( *-------------------------------------------------------------------------*/ static Word16 BidagonalDiagonalisation_fx( - Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) singularValues_fx_e*/ + Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) singularValues_fx_e*/ Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) singularValues_fx_e*/ - Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) singularValues_fx_e*/ + Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) singularValues_fx_e*/ Word32 secDiag_fx[MAX_OUTPUT_CHANNELS], /* i/o: secDiag_fx_e*/ - Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - Word16 *secDiag_fx_e, /* i/o: */ -#else - Word16 *secDiag_new_e, /* i/o: */ -#endif - const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ - const Word16 nChannelsC, /* i : number of columns in the matrix to be decomposed Q0*/ - const Word32 eps_x, /* i : eps_x_e*/ - const Word16 eps_x_e /* i : */ + Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ + Word16 *secDiag_new_e, /* i/o: */ + const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ + const Word16 nChannelsC, /* i : number of columns in the matrix to be decomposed Q0*/ + const Word32 eps_x, /* i : eps_x_e*/ + const Word16 eps_x_e /* i : */ ) { Word16 kCh, nCh, iCh, jCh, split; @@ -441,9 +387,7 @@ static Word16 BidagonalDiagonalisation_fx( move16(); move16(); Word16 temp_exp; -#ifdef FIX_1010_OPT_NORM_NOSAT Word16 temp_exp2; -#endif Word32 g = 0; move16(); Word16 g_e = 0; @@ -451,14 +395,8 @@ static Word16 BidagonalDiagonalisation_fx( Word16 convergence, iteration, found_split; Word16 error = 0; move16(); -#ifdef FIX_1010_OPT_GIVENS_INV Word32 temp; -#endif Word16 singularValues_new_e[MAX_OUTPUT_CHANNELS]; -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - Word16 secDiag_new_e[MAX_OUTPUT_CHANNELS]; - set16_fx( secDiag_new_e, *secDiag_fx_e, MAX_OUTPUT_CHANNELS ); -#endif Copy( singularValues_fx_e, singularValues_new_e, MAX_OUTPUT_CHANNELS ); FOR( iCh = nChannelsC - 1; iCh >= 0; iCh-- ) /* nChannelsC */ @@ -478,14 +416,15 @@ static Word16 BidagonalDiagonalisation_fx( FOR( jCh = iCh; jCh >= 0; jCh-- ) { - split = sub( jCh, 1 ); /* Q0 */ - IF( LE_16( BASOP_Util_Cmp_Mant32Exp( L_abs( secDiag_fx[jCh] ), secDiag_new_e[jCh], Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), eps_x_e ), 0 ) ) /* is secDiag[ch] vanishing compared to eps_x */ + Word16 com_e = s_max( secDiag_new_e[jCh], eps_x_e ); + IF( LE_32( L_shr( L_abs( secDiag_fx[jCh] ), sub( com_e, secDiag_new_e[jCh] ) ), L_shr( Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), sub( com_e, eps_x_e ) ) ) ) /* is secDiag[ch] vanishing compared to eps_x */ { found_split = 0; move16(); BREAK; } - IF( LE_16( BASOP_Util_Cmp_Mant32Exp( L_abs( singularValues_fx[split] ), singularValues_new_e[split], Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), eps_x_e ), 0 ) ) /* is singularValues[split] vanishing compared to eps_x */ + com_e = s_max( singularValues_new_e[jCh - 1], eps_x_e ); + IF( LE_32( L_shr( L_abs( singularValues_fx[jCh - 1] ), sub( com_e, singularValues_new_e[jCh - 1] ) ), L_shr( Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), sub( com_e, eps_x_e ) ) ) ) /* is singularValues[jCh - 1] vanishing compared to eps_x */ { BREAK; } @@ -513,60 +452,32 @@ static Word16 BidagonalDiagonalisation_fx( move32(); c_e = 0; move16(); - + split = sub( jCh, 1 ); /* Q0 */ FOR( kCh = jCh; kCh <= iCh; kCh++ ) { g = Mpy_32_32( s, secDiag_fx[kCh] ); /* exp(s_e + secDiag_new_e) */ g_e = add( s_e, secDiag_new_e[kCh] ); secDiag_fx[kCh] = Mpy_32_32( c, secDiag_fx[kCh] ); /* exp(c_e + secDiag_new_e) */ secDiag_new_e[kCh] = add( c_e, secDiag_new_e[kCh] ); - IF( LE_16( BASOP_Util_Cmp_Mant32Exp( L_abs( g ), g_e, Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), eps_x_e ), 0 ) ) /* is singularValues[split] vanishing compared to eps_x */ + Word16 com_e = s_max( g_e, eps_x_e ); + IF( LE_32( L_shr( L_abs( g ), sub( com_e, g_e ) ), L_shr( Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), sub( com_e, eps_x_e ) ) ) ) { BREAK; } c = singularValues_fx[kCh]; /* exp(singularValues_new_e) */ c_e = singularValues_new_e[kCh]; -#ifdef FIX_1010_OPT_GIVENS_INV GivensRotation2_fx( g, g_e, singularValues_fx[kCh], singularValues_new_e[kCh], &singularValues_fx[kCh], &temp, &singularValues_new_e[kCh], &temp_exp ); /* exp(singularValues_new_e) */ c = Mpy_32_32( c, temp ); c_e = add( c_e, temp_exp ); -#else - singularValues_fx[kCh] = GivensRotation_fx( g, g_e, singularValues_fx[kCh], singularValues_new_e[kCh], &singularValues_new_e[kCh] ); /* exp(singularValues_new_e) */ - c = BASOP_Util_Divide3232_Scale_cadence( c, maxWithSign_fx( singularValues_fx[kCh] ), &temp_exp ); /* exp(temp_exp + (c_e - singularValues_new_e)) */ - c_e = add( temp_exp, sub( c_e, singularValues_new_e[kCh] ) ); -#endif -#ifndef FIX_1010_OPT_NORM_NOSAT - IF( c_e > 0 ) - { - c = L_shl_sat( c, c_e ); // Q31 - c_e = 0; - move16(); - } -#else temp_exp2 = norm_l( c ); c = L_shl( c, temp_exp2 ); c_e = sub( c_e, temp_exp2 ); -#endif -#ifdef FIX_1010_OPT_GIVENS_INV s = Mpy_32_32( -g, temp ); s_e = add( g_e, temp_exp ); -#else - s = BASOP_Util_Divide3232_Scale_cadence( -g, maxWithSign_fx( singularValues_fx[kCh] ), &temp_exp ); /* exp(temp_exp + (g_e - singularValues_new_e))*/ - s_e = add( temp_exp, sub( g_e, singularValues_new_e[kCh] ) ); -#endif -#ifndef FIX_1010_OPT_NORM_NOSAT - IF( s_e > 0 ) - { - s = L_shl_sat( s, s_e ); // Q31 - s_e = 0; - move16(); - } -#else temp_exp2 = norm_l( s ); s = L_shl( s, temp_exp2 ); s_e = sub( s_e, temp_exp2 ); -#endif ApplyRotation_fx( singularVectors_Left_fx, c, c_e, s, s_e, 0, x11_e, 0, x12_e, &f1, &f1_e, &f2, &f2_e, kCh, split, nChannelsL ); /* nChannelsL */ } } @@ -617,24 +528,6 @@ static Word16 BidagonalDiagonalisation_fx( // rescaling block Copy( singularValues_new_e, singularValues_fx_e, MAX_OUTPUT_CHANNELS ); -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - Word16 max_exp = -31; - move16(); - FOR( iCh = 0; iCh < nChannelsC; iCh++ ) - { - if ( secDiag_fx[iCh] ) - { - max_exp = s_max( max_exp, secDiag_new_e[iCh] ); - } - } - *secDiag_fx_e = max_exp; - move16(); - FOR( iCh = 0; iCh < nChannelsC; iCh++ ) - { - secDiag_fx[iCh] = L_shr_r( secDiag_fx[iCh], sub( *secDiag_fx_e, secDiag_new_e[iCh] ) ); /* exp(secDiag_fx_e) */ - move32(); - } -#endif return ( error ); } @@ -646,25 +539,21 @@ static Word16 BidagonalDiagonalisation_fx( *-------------------------------------------------------------------------*/ static void ApplyQRTransform_fx( - Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) singularValues_e*/ - Word32 singularValues[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) singularValues_e*/ - Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) singularValues_e*/ - Word32 secDiag[MAX_OUTPUT_CHANNELS], /* i/o: secDiag_e*/ + Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) singularValues_e*/ + Word32 singularValues[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) singularValues_e*/ + Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) singularValues_e*/ + Word32 secDiag[MAX_OUTPUT_CHANNELS], /* i/o: secDiag_e*/ Word16 singularValues_e[MAX_OUTPUT_CHANNELS], Word16 secDiag_e[MAX_OUTPUT_CHANNELS], - const Word16 startIndex, /* i : Q0*/ - const Word16 currentIndex, /* i : Q0*/ - const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ - const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed Q0*/ + const Word16 startIndex, /* i : Q0*/ + const Word16 currentIndex, /* i : Q0*/ + const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ + const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed Q0*/ ) { -#ifdef FIX_1010_OPT_GIVENS_INV Word32 temp; Word16 temp_e; -#endif -#ifdef FIX_1010_OPT_NORM_NOSAT Word16 temp_norm_e; -#endif Word16 ch, split; Word32 d = 0, g = 0, r = 0, x_ii = 0, x_split = 0, x_kk = 0, mu = 0, aux = 0; move32(); @@ -730,7 +619,7 @@ static void ApplyQRTransform_fx( L_temp1 = BASOP_Util_Add_Mant32Exp( r, r_e, r, r_e, &L_temp1_e ); /* exp(L_temp1_e) */ L_temp1 = maxWithSign_fx( Mpy_32_32( L_temp1, x_split ) ); /* exp(L_temp1_e + x_split_e) */ L_temp1_e = add( L_temp1_e, x_split_e ); - d = BASOP_Util_Divide3232_Scale_cadence( d, L_temp1, &temp_exp ); /* temp_exp + d_e - L_temp1_e */ + d = BASOP_Util_Divide3232_Scale_newton( d, L_temp1, &temp_exp ); /* temp_exp + d_e - L_temp1_e */ d_e = add( temp_exp, sub( d_e, L_temp1_e ) ); g = GivensRotation_fx( MAX_32, 0, d, d_e, &g_e ); @@ -748,7 +637,7 @@ static void ApplyQRTransform_fx( L_temp1_e = g_e; move16(); L_temp2 = maxWithSign_fx( BASOP_Util_Add_Mant32Exp( d, d_e, L_temp1, L_temp1_e, &L_temp2_e ) ); /* exp(L_temp2_e) */ - mu = BASOP_Util_Divide3232_Scale_cadence( x_split, L_temp2, &mu_e ); /* exp(mu_e + (x-plit_e - L_temp2_e)) */ + mu = BASOP_Util_Divide3232_Scale_newton( x_split, L_temp2, &mu_e ); /* exp(mu_e + (x-plit_e - L_temp2_e)) */ mu_e = add( mu_e, sub( x_split_e, L_temp2_e ) ); mu = BASOP_Util_Add_Mant32Exp( mu, mu_e, L_negate( r ), r_e, &mu_e ); /* exp(mu_e) */ @@ -756,7 +645,7 @@ static void ApplyQRTransform_fx( L_temp1 = BASOP_Util_Add_Mant32Exp( x_ii, x_ii_e, x_kk, x_kk_e, &L_temp1_e ); /* exp(L_temp1_e) */ L_temp2 = BASOP_Util_Add_Mant32Exp( x_ii, x_ii_e, L_negate( x_kk ), x_kk_e, &L_temp2_e ); /* exp(L_temp2_e) */ d = BASOP_Util_Add_Mant32Exp( Mpy_32_32( L_temp1, L_temp2 ), add( L_temp1_e, L_temp2_e ), Mpy_32_32( r, mu ), add( r_e, mu_e ), &d_e ); /* exp(d_e) */ - d = BASOP_Util_Divide3232_Scale_cadence( d, maxWithSign_fx( x_ii ), &temp_exp ); /* exp(temp_exp + (d_e - x_ii_e) */ + d = BASOP_Util_Divide3232_Scale_newton( d, maxWithSign_fx( x_ii ), &temp_exp ); /* exp(temp_exp + (d_e - x_ii_e) */ d_e = add( temp_exp, sub( d_e, x_ii_e ) ); /*QR transformation*/ @@ -767,47 +656,17 @@ static void ApplyQRTransform_fx( g = Mpy_32_32( c, secDiag[ch + 1] ); /* exp(c_e + secDiag_e) */ g_e = add( c_e, secDiag_e[ch + 1] ); -#ifdef FIX_1010_OPT_GIVENS_INV GivensRotation2_fx( d, d_e, r, r_e, &secDiag[ch], &temp, &secDiag_e[ch], &temp_e ); /* exp(secDiag_e) */ c = Mpy_32_32( d, temp ); c_e = add( temp_e, d_e ); -#else - secDiag[ch] = GivensRotation_fx( d, d_e, r, r_e, &secDiag_e[ch] ); /* exp(secDiag_e) */ - move32(); - c = BASOP_Util_Divide3232_Scale_cadence( d, maxWithSign_fx( secDiag[ch] ), &c_e ); /* exp(c_e + (d_e + secDiag_e)) */ - c_e = add( c_e, sub( d_e, secDiag_e[ch] ) ); -#endif -#ifndef FIX_1010_OPT_NORM_NOSAT - IF( c_e > 0 ) - { - c = L_shl_sat( c, c_e ); // Q31 - c_e = 0; - move16(); - } -#else temp_norm_e = norm_l( c ); c = L_shl( c, temp_norm_e ); c_e = sub( c_e, temp_norm_e ); -#endif -#ifdef FIX_1010_OPT_GIVENS_INV s = Mpy_32_32( r, temp ); s_e = add( r_e, temp_e ); -#else - s = BASOP_Util_Divide3232_Scale_cadence( r, maxWithSign_fx( secDiag[ch] ), &s_e ); /* exp(s_e + (r_e - sec_Diag_e))*/ - s_e = add( s_e, sub( r_e, secDiag_e[ch] ) ); -#endif -#ifndef FIX_1010_OPT_NORM_NOSAT - IF( s_e > 0 ) - { - s = L_shl_sat( s, s_e ); // Q31 - s_e = 0; - move16(); - } -#else temp_norm_e = norm_l( s ); s = L_shl( s, temp_norm_e ); s_e = sub( s_e, temp_norm_e ); -#endif r = Mpy_32_32( s, singularValues[ch + 1] ); /* exp(r_e + secDiag_e) */ r_e = add( s_e, singularValues_e[ch + 1] ); x_split = Mpy_32_32( c, singularValues[ch + 1] ); /* exp(c_e + secDiag_e) */ @@ -821,48 +680,21 @@ static void ApplyQRTransform_fx( // ApplyRotation(singularVectors_Right, c, s, x_ii, aux, &d, &g, ch + 1, ch, nChannelsC); ApplyRotation_fx( singularVectors_Right, c, c_e, s, s_e, x_ii, x_ii_e, aux, aux_e, &d, &d_e, &g, &g_e, ch + 1, ch, nChannelsC ); -#ifdef FIX_1010_OPT_GIVENS_INV GivensRotation2_fx( d, d_e, r, r_e, &singularValues[ch], &aux, &singularValues_e[ch], &aux_e ); /* exp(singularValues_e) */ -#else - singularValues[ch] = GivensRotation_fx( d, d_e, r, r_e, &singularValues_e[ch] ); /* exp(singularValues_e) */ - move32(); -#endif IF( singularValues[ch] != 0 ) { -#ifndef FIX_1010_OPT_GIVENS_INV - aux = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, singularValues[ch], &aux_e ); /* exp(aux_e + (1 - singularValues_e)) */ - aux_e = add( aux_e, sub( 1, singularValues_e[ch] ) ); -#endif c = Mpy_32_32( d, aux ); /* exp(d_e + aux_e) */ c_e = add( d_e, aux_e ); -#ifndef FIX_1010_OPT_NORM_NOSAT - IF( c_e > 0 ) - { - c = L_shl_sat( c, c_e ); // Q31 - c_e = 0; - move16(); - } -#else temp_norm_e = norm_l( c ); c = L_shl( c, temp_norm_e ); c_e = sub( c_e, temp_norm_e ); -#endif s = Mpy_32_32( r, aux ); /* exp(r_e + aux_e) */ s_e = add( r_e, aux_e ); -#ifndef FIX_1010_OPT_NORM_NOSAT - IF( s_e > 0 ) - { - s = L_shl_sat( s, s_e ); // Q31 - s_e = 0; - move16(); - } -#else temp_norm_e = norm_l( s ); s = L_shl( s, temp_norm_e ); s_e = sub( s_e, temp_norm_e ); -#endif } // ApplyRotation(singularVectors_Left, c, s, g, x_split, &d, &x_ii, ch + 1, ch, nChannelsL); @@ -915,7 +747,6 @@ static void ApplyRotation_fx( *g = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x12 ), add( c_e, x12_e ), Mpy_32_32( L_negate( s ), x11 ), add( s_e, x11_e ), g_e ); /* exp(g_e) */ move32(); -#ifdef SVD_WMOPS_OPT Word16 c_q = sub( 31, c_e ); Word16 s_q = sub( 31, s_e ); Word32 op1, op2; @@ -939,6 +770,7 @@ static void ApplyRotation_fx( move16(); } op_e = add( op_e, 1 ); // 64 bit mac -> +1 + op_e = negate( op_e ); FOR( ch = 0; ch < nChannels; ch++ ) { @@ -948,52 +780,14 @@ static void ApplyRotation_fx( move32(); Word64 temp = W_mac_32_32( W_mult_32_32( op1, x11 ), op2, x12 ); // Q(singularVector) + op_e - temp = W_shr( temp, op_e ); // Q(singularVector) - singularVector[ch][currentIndex2] = W_sat_l( temp ); // Q(singularVector) + singularVector[ch][currentIndex2] = W_shl_sat_l( temp, op_e ); // Q(singularVector) move32(); temp = W_mac_32_32( W_mult_32_32( op1, x12 ), L_negate( op2 ), x11 ); // Q(singularVector) + op_e - temp = W_shr( temp, op_e ); // Q(singularVector) - singularVector[ch][currentIndex1] = W_sat_l( temp ); // Q(singularVector) - move32(); - } -#else -#ifndef FIX_MINOR_SVD_WMOPS_MR1010X - FOR( ch = 0; ch < nChannels; ch++ ) - { - x11 = singularVector[ch][currentIndex2]; - move32(); - x12 = singularVector[ch][currentIndex1]; - move32(); - singularVector[ch][currentIndex2] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x11 ), c_e, Mpy_32_32( s, x12 ), s_e, &temp_exp ); /* exp(temp_exp) */ - move32(); - singularVector[ch][currentIndex2] = L_shl_sat( singularVector[ch][currentIndex2], temp_exp ); /* exp(temp_exp) */ - move32(); - singularVector[ch][currentIndex1] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x12 ), c_e, Mpy_32_32( L_negate( s ), x11 ), s_e, &temp_exp ); /* exp(temp_exp) */ - move32(); - singularVector[ch][currentIndex1] = L_shl_sat( singularVector[ch][currentIndex1], temp_exp ); /* exp(temp_exp) */ - move32(); - } -#else - Word32 s_neg = L_negate( s ); - Word32 temp; - FOR( ch = 0; ch < nChannels; ch++ ) - { - x11 = singularVector[ch][currentIndex2]; - move32(); - x12 = singularVector[ch][currentIndex1]; - move32(); - temp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x11 ), c_e, Mpy_32_32( s, x12 ), s_e, &temp_exp ); /* exp(temp_exp) */ - singularVector[ch][currentIndex2] = L_shl_sat( temp, temp_exp ); /* exp(temp_exp) */ - move32(); - temp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x12 ), c_e, Mpy_32_32( s_neg, x11 ), s_e, &temp_exp ); /* exp(temp_exp) */ - singularVector[ch][currentIndex1] = L_shl_sat( temp, temp_exp ); /* exp(temp_exp) */ + singularVector[ch][currentIndex1] = W_shl_sat_l( temp, op_e ); // Q(singularVector) move32(); } -#endif -#endif - return; } @@ -1017,43 +811,67 @@ static void HouseholderReduction_fx( Word16 *eps_x_fx_e ) { Word16 nCh; - // float g = 0.0f, sig_x = 0.0f;// to be removed - Word32 g_fx = 0, sig_x_fx = 0; + + Word32 g_left_fx = 0; + Word16 g_left_e = 0; move32(); + move16(); + Word32 g_right_fx = 0; + Word16 g_right_e = 0; move32(); - Word16 sig_x_fx_e = 0; move16(); -#ifdef FIX_1010_OPT_SINGLE_RESCALE + Word16 iCh, jCh; Word16 singularVectors_Left_fx_e[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + + Word16 sc = 0; + move16(); + sc = getScaleFactor32( singularVectors_Left_fx[0], nChannelsC ); + FOR( jCh = 1; jCh < nChannelsL; jCh++ ) + { + sc = s_min( sc, getScaleFactor32( singularVectors_Left_fx[jCh], nChannelsC ) ); + } FOR( jCh = 0; jCh < nChannelsL; jCh++ ) { + Scale_sig32( singularVectors_Left_fx[jCh], nChannelsC, sc ); FOR( iCh = 0; iCh < nChannelsC; iCh++ ) { - singularVectors_Left_fx_e[jCh][iCh] = singularVectors_Left_e; + singularVectors_Left_fx_e[jCh][iCh] = singularVectors_Left_e - sc; move16(); } } -#endif - /* Bidiagonal Reduction for every channel */ - FOR( nCh = 0; nCh < nChannelsC; nCh++ ) /* nChannelsC */ + FOR( nCh = 0; nCh < nChannelsC; nCh++ ) { -#ifndef FIX_1010_OPT_SINGLE_RESCALE - biDiagonalReductionLeft_fx( singularVectors_Left_fx, singularValues_fx, secDiag_fx, &singularVectors_Left_e, singularValues_fx_e, secDiag_fx_e, nChannelsL, nChannelsC, nCh, &sig_x_fx, &sig_x_fx_e, &g_fx ); - biDiagonalReductionRight_fx( singularVectors_Left_fx, secDiag_fx, &singularVectors_Left_e, secDiag_fx_e, nChannelsL, nChannelsC, nCh, &sig_x_fx, &sig_x_fx_e, &g_fx ); -#else - biDiagonalReductionLeft_fx( singularVectors_Left_fx, singularValues_fx, secDiag_fx, singularVectors_Left_fx_e, singularValues_fx_e, secDiag_fx_e, nChannelsL, nChannelsC, nCh, &sig_x_fx, &sig_x_fx_e, &g_fx ); - biDiagonalReductionRight_fx( singularVectors_Left_fx, secDiag_fx, singularVectors_Left_fx_e, secDiag_fx_e, nChannelsL, nChannelsC, nCh, &sig_x_fx, &sig_x_fx_e, &g_fx ); -#endif + secDiag_fx[nCh] = g_right_fx; /* from the previous channel */ + move32(); + secDiag_fx_e[nCh] = g_right_e; + + biDiagonalReductionLeft_fx( + singularVectors_Left_fx, + singularVectors_Left_fx_e, + nChannelsL, + nChannelsC, + nCh, + &g_left_fx, + &g_left_e ); + + singularValues_fx[nCh] = g_left_fx; + move32(); + singularValues_fx_e[nCh] = g_left_e; + + biDiagonalReductionRight_fx( + singularVectors_Left_fx, + singularVectors_Left_fx_e, + nChannelsL, + nChannelsC, + nCh, + &g_right_fx, + &g_right_e ); Word16 L_temp_e; -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - Word32 L_temp = BASOP_Util_Add_Mant32Exp( L_abs( singularValues_fx[nCh] ), singularValues_fx_e[nCh], L_abs( secDiag_fx[nCh] ), *secDiag_fx_e, &L_temp_e ); /* exp(L_temp_e) */ -#else Word32 L_temp = BASOP_Util_Add_Mant32Exp( L_abs( singularValues_fx[nCh] ), singularValues_fx_e[nCh], L_abs( secDiag_fx[nCh] ), secDiag_fx_e[nCh], &L_temp_e ); /* exp(L_temp_e) */ -#endif IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_temp, L_temp_e, *eps_x_fx, *eps_x_fx_e ), 1 ) ) { *eps_x_fx = L_temp; /* exp(L_temp_e) */ @@ -1063,20 +881,12 @@ static void HouseholderReduction_fx( } } + /* SingularVecotr Accumulation */ -#ifndef FIX_1010_OPT_SINGLE_RESCALE - singularVectorsAccumulationRight_fx( singularVectors_Left_fx, singularVectors_Right_fx, secDiag_fx, singularVectors_Left_e, *secDiag_fx_e, nChannelsC ); - singularVectorsAccumulationLeft_fx( singularVectors_Left_fx, singularValues_fx, singularVectors_Left_e, singularValues_fx_e, nChannelsL, nChannelsC ); -#else -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - singularVectorsAccumulationRight_fx( singularVectors_Left_fx, singularVectors_Right_fx, secDiag_fx, singularVectors_Left_fx_e, *secDiag_fx_e, nChannelsC ); -#else singularVectorsAccumulationRight_fx( singularVectors_Left_fx, singularVectors_Right_fx, secDiag_fx, singularVectors_Left_fx_e, secDiag_fx_e, nChannelsC ); -#endif singularVectorsAccumulationLeft_fx( singularVectors_Left_fx, singularValues_fx, singularVectors_Left_fx_e, singularValues_fx_e, nChannelsL, nChannelsC ); -#endif return; } @@ -1086,374 +896,155 @@ static void HouseholderReduction_fx( * * *-------------------------------------------------------------------------*/ - static void biDiagonalReductionLeft_fx( - Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ - Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ - Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ -#ifndef FIX_1010_OPT_SINGLE_RESCALE - Word16 *singularVectors_e, -#else - Word16 singularVectors2_e[][MAX_OUTPUT_CHANNELS], -#endif - Word16 singularValues_e[MAX_OUTPUT_CHANNELS], - Word16 *secDiag_e, - const Word16 nChannelsL, /* Q0 */ + Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ + Word16 singularVectors_e[][MAX_OUTPUT_CHANNELS], /* Q0 */ + const Word16 nChannelsL, const Word16 nChannelsC, /* Q0 */ const Word16 currChannel, /* Q0 */ - Word32 *sig_x, /* exp(sig_x_e) */ - Word16 *sig_x_e, - Word32 *g /* Q31 */ -) + Word32 *g, + Word16 *g_e ) { - Word16 iCh, jCh, idx; + Word16 iCh, jCh; Word32 norm_x, f, r; Word16 norm_x_e, f_e, r_e; Word32 L_temp; Word16 L_temp_e; -#ifndef FIX_1010_OPT_SINGLE_RESCALE - Word16 sing_exp[MAX_OUTPUT_CHANNELS]; - Word16 sing_exp2[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS] = { 0 }; - FOR( jCh = 0; jCh < MAX_OUTPUT_CHANNELS; jCh++ ) - { - set16_fx( sing_exp2[jCh], *singularVectors_e, MAX_OUTPUT_CHANNELS ); - } -#endif - secDiag[currChannel] = Mpy_32_32( *sig_x, *g ); /* exp(sig_x_e) */ - move32(); -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - // rescaling block - IF( GT_16( *sig_x_e, *secDiag_e ) ) - { - FOR( Word16 i = 0; i < MAX_OUTPUT_CHANNELS; i++ ){ - IF( NE_16( i, currChannel ) ){ - secDiag[i] = L_shl( secDiag[i], sub( *secDiag_e, *sig_x_e ) ); /* sig_x_e */ - move32(); - } -} -*secDiag_e = *sig_x_e; -move16(); -} -ELSE IF( LT_16( *sig_x_e, *secDiag_e ) ) -{ - secDiag[currChannel] = L_shr_r( secDiag[currChannel], sub( *secDiag_e, *sig_x_e ) ); /* exp(secDiag_e) */ + /* Setting values to 0 */ + *g = 0; + *g_e = 0; move32(); -} -#else - secDiag_e[currChannel] = *sig_x_e; move16(); -#endif - -/* Setting values to 0 */ -( *sig_x ) = 0; -move32(); -( *g ) = 0; -move32(); -IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ -{ - idx = currChannel; - move16(); - - FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ - { -#ifndef FIX_1010_OPT_SINGLE_RESCALE - ( *sig_x ) = BASOP_Util_Add_Mant32Exp( *sig_x, *sig_x_e, L_abs( singularVectors[jCh][currChannel] ), *singularVectors_e, sig_x_e ); /* exp(sig_x_e) */ -#else - ( *sig_x ) = BASOP_Util_Add_Mant32Exp( *sig_x, *sig_x_e, L_abs( singularVectors[jCh][currChannel] ), singularVectors2_e[jCh][currChannel], sig_x_e ); /* exp(sig_x_e) */ -#endif - } - - IF( ( *sig_x ) ) /*(fabsf(*sig_x) > EPSILON * fabsf(*sig_x)) { */ + IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ { -#ifdef FIX_1010_OPT_DIV - Word16 invVal_e; - Word32 invVal; - invVal = BASOP_Util_Divide3232_Scale_cadence( MAXVAL_WORD32, maxWithSign_fx( *sig_x ), &invVal_e ); -#endif + Word64 temp = 0; + move64(); norm_x = 0; move32(); norm_x_e = 0; move16(); - FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ - { -#ifndef FIX_1010_OPT_DIV -#ifndef FIX_1010_OPT_SINGLE_RESCALE - singularVectors[jCh][currChannel] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[jCh][currChannel], maxWithSign_fx( *sig_x ), &sing_exp[jCh] ); /* exp(sing_exp + (singularVectors_e - sig_x_e) */ - move32(); - sing_exp[jCh] = add( sing_exp[jCh], sub( *singularVectors_e, *sig_x_e ) ); - move16(); - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ), shl( sing_exp[jCh], 1 ), &norm_x_e ); /* exp(norm_x_e) */ -#else - singularVectors[jCh][currChannel] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[jCh][currChannel], maxWithSign_fx( *sig_x ), &L_temp_e ); /* exp(sing_exp + (singularVectors_e - sig_x_e) */ - move32(); - singularVectors2_e[jCh][currChannel] = add( L_temp_e, sub( singularVectors2_e[jCh][currChannel], *sig_x_e ) ); - move16(); - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ), shl( singularVectors2_e[jCh][currChannel], 1 ), &norm_x_e ); /* exp(norm_x_e) */ -#endif -#else - Word16 temp_e = norm_l( singularVectors[jCh][currChannel] ); - singularVectors[jCh][currChannel] = Mpy_32_32( L_shl( singularVectors[jCh][currChannel], temp_e ), invVal ); /* exp(sing_exp + (singularVectors_e - sig_x_e) */ - move32(); -#ifndef FIX_1010_OPT_SINGLE_RESCALE - sing_exp[jCh] = sub( add( invVal_e, sub( *singularVectors_e, *sig_x_e ) ), temp_e ); - move16(); - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ), shl( sing_exp[jCh], 1 ), &norm_x_e ); /* exp(norm_x_e) */ -#else - singularVectors2_e[jCh][currChannel] = sub( add( invVal_e, sub( singularVectors2_e[jCh][currChannel], *sig_x_e ) ), temp_e ); - move16(); - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ), shl( singularVectors2_e[jCh][currChannel], 1 ), &norm_x_e ); /* exp(norm_x_e) */ -#endif -#endif - } - IF( GT_16( norm_x_e, 0 ) ) - { - norm_x = MAX_32; - move32(); - norm_x_e = 0; - move16(); - } - L_temp_e = norm_x_e; + Word16 max_e = MIN_16; move16(); - L_temp = Sqrt32( norm_x, &L_temp_e ); - L_temp = L_shl_r( L_temp, L_temp_e ); // Q31 - //( *g ) = L_negate( GE_32( singularVectors[currChannel][idx], 0 ) ? L_temp : L_negate( L_temp ) ); -#ifndef FIX_MINOR_SVD_WMOPS_MR1010X - IF( singularVectors[currChannel][idx] >= 0 ) + FOR( jCh = currChannel; jCh < nChannelsL; jCh++ ) /* nChannelsL */ { - ( *g ) = L_negate( L_temp ); - move32(); + max_e = s_max( max_e, singularVectors_e[jCh][currChannel] ); } - ELSE + + FOR( jCh = currChannel; jCh < nChannelsL; jCh++ ) /* nChannelsL */ { - ( *g ) = L_negate( L_negate( L_temp ) ); - move32(); + temp = W_add( temp, L_shr( Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ), shl( sub( max_e, singularVectors_e[jCh][currChannel] ), 1 ) ) ); } -#else - if ( singularVectors[currChannel][idx] >= 0 ) - { - L_temp = L_negate( L_temp ); - } - ( *g ) = L_temp; - move32(); -#endif - -#ifndef FIX_1010_OPT_SINGLE_RESCALE - r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ( *g ), singularVectors[currChannel][idx] ), sing_exp[currChannel], -norm_x, norm_x_e, &r_e ); /* exp(r_e) */ - singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], sing_exp[currChannel], -( *g ), 0, &sing_exp[currChannel] ); /* sing_exp */ -#else - r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ( *g ), singularVectors[currChannel][idx] ), singularVectors2_e[currChannel][idx], -norm_x, norm_x_e, &r_e ); /* exp(r_e) */ - singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], singularVectors2_e[currChannel][idx], -( *g ), 0, &singularVectors2_e[currChannel][idx] ); /* sing_exp */ -#endif - move32(); -#ifdef FIX_1010_OPT_DIV - invVal = BASOP_Util_Divide3232_Scale_cadence( MAXVAL_WORD32, maxWithSign_fx( r ), &invVal_e ); -#endif + Word16 nrm = W_norm( temp ); + nrm = sub( nrm, 32 ); + norm_x = W_shl_sat_l( temp, nrm ); + norm_x_e = sub( add( max_e, max_e ), nrm ); - FOR( iCh = currChannel + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ + IF( norm_x ) /*(fabsf(*sig_x) > EPSILON * fabsf(*sig_x)) { */ { - norm_x = 0; - move32(); - norm_x_e = 0; + Word16 invVal_e; + Word32 invVal; + + L_temp_e = norm_x_e; move16(); - FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ + L_temp = Sqrt32( norm_x, &L_temp_e ); + //( *g ) = L_negate( GE_32( singularVectors[currChannel][idx], 0 ) ? L_temp : L_negate( L_temp ) ); + if ( singularVectors[currChannel][currChannel] >= 0 ) { -#ifndef FIX_1010_OPT_SINGLE_RESCALE - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][iCh] ), add( sing_exp[jCh], *singularVectors_e ), &norm_x_e ); /* exp(norm_x_e) */ -#else - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][iCh] ), add( singularVectors2_e[jCh][currChannel], singularVectors2_e[jCh][iCh] ), &norm_x_e ); /* exp(norm_x_e) */ -#endif + L_temp = L_negate( L_temp ); + move32(); } + *g = L_temp; + move32(); + *g_e = L_temp_e; + move16(); -#ifndef FIX_1010_OPT_DIV - f = BASOP_Util_Divide3232_Scale_cadence( norm_x, maxWithSign_fx( r ), &f_e ); /* f_e + (norm_x_e - r_e) */ - f_e = add( f_e, sub( norm_x_e, r_e ) ); -#else - f = Mpy_32_32( norm_x, invVal ); /* invVal_e + (norm_x_e - r_e) */ - f_e = add( invVal_e, sub( norm_x_e, r_e ) ); -#endif + r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ( *g ), singularVectors[currChannel][currChannel] ), singularVectors_e[currChannel][currChannel] + ( *g_e ), -norm_x, norm_x_e, &r_e ); /* exp(r_e) */ + singularVectors[currChannel][currChannel] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][currChannel], singularVectors_e[currChannel][currChannel], -( *g ), *g_e, &singularVectors_e[currChannel][currChannel] ); /* sing_exp */ + invVal = BASOP_Util_Divide3232_Scale_newton( MAXVAL_WORD32, maxWithSign_fx( r ), &invVal_e ); - FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ + FOR( iCh = currChannel + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ { -#ifndef FIX_1010_OPT_SINGLE_RESCALE - singularVectors[jCh][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors[jCh][iCh], *singularVectors_e, Mpy_32_32( f, singularVectors[jCh][currChannel] ), add( f_e, sing_exp[jCh] ), &sing_exp2[jCh][iCh] ); /* exp( sing_exp2) */ -#else - singularVectors[jCh][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors[jCh][iCh], singularVectors2_e[jCh][iCh], Mpy_32_32( f, singularVectors[jCh][currChannel] ), add( f_e, singularVectors2_e[jCh][currChannel] ), &singularVectors2_e[jCh][iCh] ); -#endif - move32(); - } - } + Word16 max2_e = MIN_16; + max_e = MIN_16; + move16(); + move16(); + temp = 0; + move64(); + FOR( jCh = currChannel; jCh < nChannelsL; jCh++ ) /* nChannelsL */ + { + max_e = s_max( max_e, singularVectors_e[jCh][currChannel] ); /* exp(norm_x_e) */ + max2_e = s_max( max2_e, singularVectors_e[jCh][iCh] ); /* exp(norm_x_e) */ + } + max_e = add( max_e, max2_e ); - FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ - { - singularVectors[jCh][currChannel] = Mpy_32_32( singularVectors[jCh][currChannel], ( *sig_x ) ); /* sing_exp + sig_x_e */ - move32(); -#ifndef FIX_1010_OPT_SINGLE_RESCALE - sing_exp2[jCh][currChannel] = add( sing_exp[jCh], *sig_x_e ); -#else - singularVectors2_e[jCh][currChannel] = add( singularVectors2_e[jCh][currChannel], *sig_x_e ); -#endif - move16(); - } + FOR( jCh = currChannel; jCh < nChannelsL; jCh++ ) /* nChannelsL */ + { + temp = W_add( temp, L_shr( Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][iCh] ), sub( max_e, add( singularVectors_e[jCh][currChannel], singularVectors_e[jCh][iCh] ) ) ) ); + } + nrm = W_norm( temp ); + nrm = sub( nrm, 32 ); + norm_x = W_shl_sat_l( temp, nrm ); + norm_x_e = sub( max_e, nrm ); -#ifndef FIX_1010_OPT_SINGLE_RESCALE - // rescaling block - Word16 exp_max = *singularVectors_e; - move16(); - FOR( iCh = 0; iCh < nChannelsC; iCh++ ) - { - FOR( jCh = 0; jCh < nChannelsL; jCh++ ) - { - exp_max = s_max( exp_max, sing_exp2[jCh][iCh] ); - } - } + f = Mpy_32_32( norm_x, invVal ); /* invVal_e + (norm_x_e - r_e) */ + f_e = add( invVal_e, sub( norm_x_e, r_e ) ); - FOR( iCh = 0; iCh < nChannelsC; iCh++ ) - { - FOR( jCh = 0; jCh < nChannelsL; jCh++ ) - { - singularVectors[jCh][iCh] = L_shr_r( singularVectors[jCh][iCh], sub( exp_max, sing_exp2[jCh][iCh] ) ); /* exp(exp_max) */ - move32(); + FOR( jCh = currChannel; jCh < nChannelsL; jCh++ ) /* nChannelsL */ + { + singularVectors[jCh][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors[jCh][iCh], singularVectors_e[jCh][iCh], Mpy_32_32( f, singularVectors[jCh][currChannel] ), add( f_e, singularVectors_e[jCh][currChannel] ), &singularVectors_e[jCh][iCh] ); + } } } - *singularVectors_e = exp_max; - move16(); -#endif } - - // rescaling block - singularValues[currChannel] = Mpy_32_32( ( *sig_x ), ( *g ) ); /* sig_x_e */ - move32(); - singularValues_e[currChannel] = *sig_x_e; - move16(); -} - -return; + return; } -/*------------------------------------------------------------------------- - * biDiagonalReductionRight() - * - * - *-------------------------------------------------------------------------*/ - static void biDiagonalReductionRight_fx( Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ - Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_exp[]) */ -#ifndef FIX_1010_OPT_SINGLE_RESCALE - Word16 *singularVectors_e, -#else - Word16 singularVectors2_e[][MAX_OUTPUT_CHANNELS], -#endif -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - Word16 *secDiag_e, -#else - Word16 *secDiag_exp, -#endif + Word16 singularVectors_e[][MAX_OUTPUT_CHANNELS], const Word16 nChannelsL, /* Q0 */ const Word16 nChannelsC, /* Q0 */ const Word16 currChannel, /* Q0 */ - Word32 *sig_x, /* exp(sig_x_e) */ - Word16 *sig_x_e, - Word32 *g /* Q31 */ -) + Word32 *g, + Word16 *g_e ) { Word16 iCh, jCh, idx; Word32 norm_x, r; Word16 norm_x_e, r_e; -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - Word16 secDiag_exp[MAX_OUTPUT_CHANNELS]; -#endif Word32 L_temp; Word16 L_temp_e; -#ifndef FIX_1010_OPT_SINGLE_RESCALE - Word16 sing_exp[MAX_OUTPUT_CHANNELS]; - Word16 sing_exp2[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS] = { 0 }; - FOR( jCh = 0; jCh < MAX_OUTPUT_CHANNELS; jCh++ ) - { - set16_fx( sing_exp2[jCh], *singularVectors_e, MAX_OUTPUT_CHANNELS ); - } -#endif -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - set16_fx( secDiag_exp, *secDiag_e, MAX_OUTPUT_CHANNELS ); -#endif /* Setting values to 0 */ - ( *sig_x ) = 0; - move32(); - ( *g ) = 0; + *g = 0; + *g_e = 0; move32(); - + move16(); IF( LT_16( currChannel, nChannelsL ) && NE_16( currChannel, sub( nChannelsC, 1 ) ) ) /* i <=m && i !=n */ { idx = add( currChannel, 1 ); /* Q0 */ - FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ + norm_x = 0; + move32(); + norm_x_e = 0; + move16(); + FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /*nChannelsC */ { -#ifndef FIX_1010_OPT_SINGLE_RESCALE - ( *sig_x ) = BASOP_Util_Add_Mant32Exp( *sig_x, *sig_x_e, L_abs( singularVectors[currChannel][jCh] ), *singularVectors_e, sig_x_e ); /* exp(sig_x_e) */ -#else - ( *sig_x ) = BASOP_Util_Add_Mant32Exp( *sig_x, *sig_x_e, L_abs( singularVectors[currChannel][jCh] ), singularVectors2_e[currChannel][jCh], sig_x_e ); /* exp(sig_x_e) */ -#endif + norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[currChannel][jCh], singularVectors[currChannel][jCh] ), shl( singularVectors_e[currChannel][jCh], 1 ), &norm_x_e ); /* exp(norm_x_e) */ } - IF( ( *sig_x ) ) /*(fabsf(*sig_x) > EPSILON * fabsf(*sig_x)) { */ + IF( norm_x ) /*(fabsf(*sig_x) > EPSILON * fabsf(*sig_x)) { */ { - norm_x = 0; - move32(); - norm_x_e = 0; - move16(); - -#ifdef FIX_1010_OPT_DIV - Word16 invVal_e, temp_e; + Word16 invVal_e; Word32 invVal; - invVal = BASOP_Util_Divide3232_Scale_cadence( MAXVAL_WORD32, maxWithSign_fx( *sig_x ), &invVal_e ); -#endif - FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /*nChannelsC */ - { -#ifndef FIX_1010_OPT_DIV -#ifndef FIX_1010_OPT_SINGLE_RESCALE - singularVectors[currChannel][jCh] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[currChannel][jCh], maxWithSign_fx( *sig_x ), &sing_exp[jCh] ); /* exp(sing_exp + (singularVectors_e - sig_x_e)) */ - move32(); - sing_exp[jCh] = add( sing_exp[jCh], sub( *singularVectors_e, *sig_x_e ) ); - move16(); - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[currChannel][jCh], singularVectors[currChannel][jCh] ), shl( sing_exp[jCh], 1 ), &norm_x_e ); /* exp(norm_x_e) */ -#else - singularVectors[currChannel][jCh] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[currChannel][jCh], maxWithSign_fx( *sig_x ), &L_temp_e ); /* exp(sing_exp + (singularVectors_e - sig_x_e)) */ - move32(); - singularVectors2_e[currChannel][jCh] = add( L_temp_e, sub( singularVectors2_e[currChannel][jCh], *sig_x_e ) ); - move16(); - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[currChannel][jCh], singularVectors[currChannel][jCh] ), shl( singularVectors2_e[currChannel][jCh], 1 ), &norm_x_e ); /* exp(norm_x_e) */ -#endif -#else - temp_e = norm_l( singularVectors[currChannel][jCh] ); - singularVectors[currChannel][jCh] = Mpy_32_32( L_shl( singularVectors[currChannel][jCh], temp_e ), invVal ); /* exp(sing_exp + (singularVectors_e - sig_x_e) */ - move32(); -#ifndef FIX_1010_OPT_SINGLE_RESCALE - sing_exp[jCh] = add( sub( invVal_e, temp_e ), sub( *singularVectors_e, *sig_x_e ) ); - move16(); - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[currChannel][jCh], singularVectors[currChannel][jCh] ), shl( sing_exp[jCh], 1 ), &norm_x_e ); /* exp(norm_x_e) */ -#else - singularVectors2_e[currChannel][jCh] = add( sub( invVal_e, temp_e ), sub( singularVectors2_e[currChannel][jCh], *sig_x_e ) ); - move16(); - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[currChannel][jCh], singularVectors[currChannel][jCh] ), shl( singularVectors2_e[currChannel][jCh], 1 ), &norm_x_e ); /* exp(norm_x_e) */ -#endif -#endif - } - IF( GT_16( norm_x_e, 0 ) ) - { - norm_x = MAX_32; - move32(); - norm_x_e = 0; - move16(); - } + L_temp_e = norm_x_e; move16(); L_temp = Sqrt32( norm_x, &L_temp_e ); - L_temp = L_shl_r( L_temp, L_temp_e ); // Q31 + // L_temp = L_shl_r( L_temp, L_temp_e ); // Q31 IF( singularVectors[currChannel][idx] >= 0 ) { ( *g ) = L_negate( L_temp ); /* exp(L_temp_e) */ @@ -1461,49 +1052,16 @@ static void biDiagonalReductionRight_fx( } ELSE { - ( *g ) = L_negate( L_negate( L_temp ) ); /* exp(L_temp_e) */ + ( *g ) = L_temp; /* exp(L_temp_e) */ move32(); } + *g_e = L_temp_e; + move16(); -#ifndef FIX_1010_OPT_SINGLE_RESCALE - r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ( *g ), singularVectors[currChannel][idx] ), sing_exp[idx], -norm_x, norm_x_e, &r_e ); /* exp(r_e) */ - singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], sing_exp[idx], -( *g ), 0, &sing_exp[idx] ); /* exp(sing_exp) */ -#else - r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ( *g ), singularVectors[currChannel][idx] ), singularVectors2_e[currChannel][idx], -norm_x, norm_x_e, &r_e ); /* exp(r_e) */ - singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], singularVectors2_e[currChannel][idx], -( *g ), 0, &singularVectors2_e[currChannel][idx] ); /* exp(sing_exp) */ -#endif - move32(); - -#ifdef FIX_1010_OPT_DIV - invVal = BASOP_Util_Divide3232_Scale_cadence( MAXVAL_WORD32, maxWithSign_fx( r ), &invVal_e ); -#endif + r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ( *g ), singularVectors[currChannel][idx] ), singularVectors_e[currChannel][idx] + ( *g_e ), -norm_x, norm_x_e, &r_e ); /* exp(r_e) */ + singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], singularVectors_e[currChannel][idx], -( *g ), *g_e, &singularVectors_e[currChannel][idx] ); /* exp(sing_exp) */ - FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ - { -#ifndef FIX_1010_OPT_DIV -#ifndef FIX_1010_OPT_SINGLE_RESCALE - secDiag[jCh] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[currChannel][jCh], maxWithSign_fx( r ), &secDiag_exp[jCh] ); /* exp(secDiag_exp + (sing_exp - r_e) */ - move32(); - secDiag_exp[jCh] = add( secDiag_exp[jCh], sub( sing_exp[jCh], r_e ) ); - move32(); -#else - secDiag[jCh] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[currChannel][jCh], maxWithSign_fx( r ), &secDiag_exp[jCh] ); /* exp(secDiag_exp + (sing_exp - r_e) */ - move32(); - secDiag_exp[jCh] = add( secDiag_exp[jCh], sub( singularVectors2_e[currChannel][jCh], r_e ) ); - move32(); -#endif -#else - temp_e = norm_l( singularVectors[currChannel][jCh] ); - secDiag[jCh] = Mpy_32_32( L_shl( singularVectors[currChannel][jCh], temp_e ), invVal ); /* exp(sing_exp + (singularVectors_e - sig_x_e) */ - move32(); -#ifndef FIX_1010_OPT_SINGLE_RESCALE - secDiag_exp[jCh] = add( sub( invVal_e, temp_e ), sub( sing_exp[jCh], r_e ) ); -#else - secDiag_exp[jCh] = add( sub( invVal_e, temp_e ), sub( singularVectors2_e[currChannel][jCh], r_e ) ); -#endif - move16(); -#endif - } + invVal = BASOP_Util_Divide3232_Scale_newton( MAXVAL_WORD32, maxWithSign_fx( r ), &invVal_e ); FOR( iCh = currChannel + 1; iCh < nChannelsL; iCh++ ) /* nChannelsL */ { @@ -1513,76 +1071,17 @@ static void biDiagonalReductionRight_fx( move16(); FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ { -#ifndef FIX_1010_OPT_SINGLE_RESCALE - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[iCh][jCh], singularVectors[currChannel][jCh] ), add( *singularVectors_e, sing_exp[jCh] ), &norm_x_e ); /* exp(norm_x_e) */ -#else - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[iCh][jCh], singularVectors[currChannel][jCh] ), add( singularVectors2_e[iCh][jCh], singularVectors2_e[currChannel][jCh] ), &norm_x_e ); /* exp(norm_x_e) */ -#endif + norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[iCh][jCh], singularVectors[currChannel][jCh] ), add( singularVectors_e[iCh][jCh], singularVectors_e[currChannel][jCh] ), &norm_x_e ); /* exp(norm_x_e) */ } - FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ - { -#ifndef FIX_1010_OPT_SINGLE_RESCALE - singularVectors[iCh][jCh] = BASOP_Util_Add_Mant32Exp( singularVectors[iCh][jCh], *singularVectors_e, Mpy_32_32( norm_x, secDiag[jCh] ), add( norm_x_e, secDiag_exp[jCh] ), &sing_exp2[iCh][jCh] ); /* exp(sing_exp2) */ -#else - singularVectors[iCh][jCh] = BASOP_Util_Add_Mant32Exp( singularVectors[iCh][jCh], singularVectors2_e[iCh][jCh], Mpy_32_32( norm_x, secDiag[jCh] ), add( norm_x_e, secDiag_exp[jCh] ), &singularVectors2_e[iCh][jCh] ); /* exp(sing_exp2) */ -#endif - move32(); - } - } - - FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ - { - singularVectors[currChannel][jCh] = Mpy_32_32( singularVectors[currChannel][jCh], ( *sig_x ) ); /* exp(sing_exp + sig_x_e) */ - move32(); -#ifndef FIX_1010_OPT_SINGLE_RESCALE - sing_exp2[currChannel][jCh] = add( sing_exp[jCh], *sig_x_e ); -#else - singularVectors2_e[currChannel][jCh] = add( singularVectors2_e[currChannel][jCh], *sig_x_e ); -#endif - move16(); - } + norm_x = Mpy_32_32( norm_x, invVal ); /* invVal_e + (norm_x_e - r_e) */ + norm_x_e = add( invVal_e, sub( norm_x_e, r_e ) ); -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - /*rescaling block*/ - Word16 exp_max = *secDiag_e; - move16(); - FOR( jCh = 0; jCh < nChannelsC; jCh++ ) - { - exp_max = s_max( exp_max, secDiag_exp[jCh] ); - } - FOR( jCh = 0; jCh < nChannelsC; jCh++ ) - { - secDiag[jCh] = L_shr_r( secDiag[jCh], sub( exp_max, secDiag_exp[jCh] ) ); /* exp(exp_max) */ - move32(); - } - *secDiag_e = exp_max; - move16(); -#endif - - -#ifndef FIX_1010_OPT_SINGLE_RESCALE - exp_max = *singularVectors_e; - move16(); - FOR( iCh = 0; iCh < nChannelsL; iCh++ ) - { - FOR( jCh = 0; jCh < nChannelsC; jCh++ ) - { - exp_max = s_max( exp_max, sing_exp2[iCh][jCh] ); - } - } - - FOR( iCh = 0; iCh < nChannelsL; iCh++ ) - { - FOR( jCh = 0; jCh < nChannelsC; jCh++ ) + FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ { - singularVectors[iCh][jCh] = L_shr_r( singularVectors[iCh][jCh], sub( exp_max, sing_exp2[iCh][jCh] ) ); /* exp(exp_max) */ - move32(); + singularVectors[iCh][jCh] = BASOP_Util_Add_Mant32Exp( singularVectors[iCh][jCh], singularVectors_e[iCh][jCh], Mpy_32_32( norm_x, singularVectors[currChannel][jCh] ), add( norm_x_e, singularVectors_e[currChannel][jCh] ), &singularVectors_e[iCh][jCh] ); /* exp(sing_exp2) */ } } - *singularVectors_e = exp_max; - move16(); -#endif } } @@ -1598,11 +1097,7 @@ static void biDiagonalReductionRight_fx( static void singularVectorsAccumulationLeft_fx( Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* input exp(singularVectors_Left_e), output Q31 */ Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ -#ifndef FIX_1010_OPT_SINGLE_RESCALE - Word16 singularVectors_e, -#else Word16 singularVectors_Left_e[][MAX_OUTPUT_CHANNELS], -#endif Word16 singularValues_e[MAX_OUTPUT_CHANNELS], const Word16 nChannelsL, /* Q0 */ const Word16 nChannelsC /* Q0 */ @@ -1612,13 +1107,6 @@ static void singularVectorsAccumulationLeft_fx( Word16 nChannels; Word32 norm_y, t_jj, t_ii; Word16 norm_y_e, t_jj_e, t_ii_e, temp_exp; -#ifndef FIX_1010_OPT_SINGLE_RESCALE - Word16 sing_exp2[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS] = { 0 }; - FOR( nCh = 0; nCh < MAX_OUTPUT_CHANNELS; nCh++ ) - { - set16_fx( sing_exp2[nCh], singularVectors_e, MAX_OUTPUT_CHANNELS ); - } -#endif /* Processing */ nChannels = s_min( nChannelsL, nChannelsC ); /* min(nChannelsL,ChannelsC) Q0*/ @@ -1638,15 +1126,10 @@ static void singularVectorsAccumulationLeft_fx( IF( t_ii ) /*if (fabsf(t_ii) > EPSILON *fabsf(t_ii)) {*/ { -#ifdef FIX_1010_OPT_DIV - t_ii = BASOP_Util_Divide3232_Scale_cadence( MAXVAL_WORD32, maxWithSign_fx( t_ii ), &temp_exp ); + t_ii = BASOP_Util_Divide3232_Scale_newton( MAXVAL_WORD32, maxWithSign_fx( t_ii ), &temp_exp ); t_ii_e = sub( temp_exp, t_ii_e ); -#else - t_ii = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, maxWithSign_fx( t_ii ), &temp_exp ); /* exp(1 + (temp_exp + tii_e)) */ - t_ii_e = add( 1, sub( temp_exp, t_ii_e ) ); -#endif Word16 tempe; - Word32 temp = BASOP_Util_Divide3232_Scale_cadence( t_ii, maxWithSign_fx( singularVectors_Left[nCh][nCh] ), &tempe ); + Word32 temp = BASOP_Util_Divide3232_Scale_newton( t_ii, maxWithSign_fx( singularVectors_Left[nCh][nCh] ), &tempe ); tempe = add( tempe, sub( t_ii_e, singularVectors_Left_e[nCh][nCh] ) ); // fprintf( fp, "%e\n", me2f( t_ii, t_ii_e ) ); FOR( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ @@ -1659,18 +1142,14 @@ static void singularVectorsAccumulationLeft_fx( move16(); FOR( k = nCh + 1; k < nChannelsL; k++ ) /* nChannelsL */ { -#ifndef FIX_1010_OPT_SINGLE_RESCALE - norm_y = BASOP_Util_Add_Mant32Exp( norm_y, norm_y_e, Mpy_32_32( singularVectors_Left[k][nCh], singularVectors_Left[k][iCh] ), add( sing_exp2[k][nCh], sing_exp2[k][iCh] ), &norm_y_e ); /* exp(norm_y_e) */ -#else prod[k] = W_mult0_32_32( singularVectors_Left[k][nCh], singularVectors_Left[k][iCh] ); prod_e[k] = add( singularVectors_Left_e[k][nCh], singularVectors_Left_e[k][iCh] ); max_e = s_max( max_e, prod_e[k] ); -#endif } FOR( k = nCh + 1; k < nChannelsL; k++ ) /* nChannelsL */ { - acc = W_add( acc, W_shr( prod[k], sub( max_e, prod_e[k] ) ) ); + acc = W_add( acc, W_shr( prod[k], s_min( 63, sub( max_e, prod_e[k] ) ) ) ); } Word16 acc_e = W_norm( acc ); acc = W_shl( acc, acc_e ); @@ -1678,18 +1157,10 @@ static void singularVectorsAccumulationLeft_fx( norm_y = W_extract_h( acc ); norm_y_e = add( sub( max_e, acc_e ), 1 ); t_jj = Mpy_32_32( temp, norm_y ); -#ifndef FIX_1010_OPT_SINGLE_RESCALE - t_jj_e = add( temp_exp, sub( add( t_ii_e, norm_y_e ), sing_exp2[nCh][nCh] ) ); -#else t_jj_e = add( tempe, norm_y_e ); -#endif FOR( k = nCh; k < nChannelsL; k++ ) /* nChannelsL */ { -#ifndef FIX_1010_OPT_SINGLE_RESCALE - singularVectors_Left[k][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Left[k][iCh], sing_exp2[k][iCh], Mpy_32_32( t_jj, singularVectors_Left[k][nCh] ), add( t_jj_e, sing_exp2[k][nCh] ), &sing_exp2[k][iCh] ); /* exp(sing_exp2) */ -#else singularVectors_Left[k][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Left[k][iCh], singularVectors_Left_e[k][iCh], Mpy_32_32( t_jj, singularVectors_Left[k][nCh] ), add( t_jj_e, singularVectors_Left_e[k][nCh] ), &singularVectors_Left_e[k][iCh] ); /* exp(sing_exp2) */ -#endif move32(); } } @@ -1698,11 +1169,7 @@ static void singularVectorsAccumulationLeft_fx( { singularVectors_Left[iCh][nCh] = Mpy_32_32( singularVectors_Left[iCh][nCh], t_ii ); /* exp(sing_exp2 + t_ii_e) */ move32(); -#ifndef FIX_1010_OPT_SINGLE_RESCALE - sing_exp2[iCh][nCh] = add( sing_exp2[iCh][nCh], t_ii_e ); -#else singularVectors_Left_e[iCh][nCh] = add( singularVectors_Left_e[iCh][nCh], t_ii_e ); -#endif move16(); } } @@ -1714,23 +1181,18 @@ static void singularVectorsAccumulationLeft_fx( move32(); } } -#ifndef FIX_1010_OPT_SINGLE_RESCALE - singularVectors_Left[nCh][nCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Left[nCh][nCh], sing_exp2[nCh][nCh], ONE_IN_Q30, 1, &sing_exp2[nCh][nCh] ); /* exp(sing_exp2) */ -#else - singularVectors_Left[nCh][nCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Left[nCh][nCh], singularVectors_Left_e[nCh][nCh], ONE_IN_Q30, 1, &singularVectors_Left_e[nCh][nCh] ); /* exp(sing_exp2) */ -#endif + Word16 exp = s_max( singularVectors_Left_e[nCh][nCh], 1 ); + singularVectors_Left[nCh][nCh] = L_sub( L_shr( singularVectors_Left[nCh][nCh], sub( exp, singularVectors_Left_e[nCh][nCh] ) ), L_shr( MINUS_ONE_IN_Q31, exp ) ); /* exp(sing_exp2) */ move32(); + singularVectors_Left_e[nCh][nCh] = exp; + move16(); } // fclose(fp); FOR( nCh = 0; nCh < nChannelsL; nCh++ ) { FOR( iCh = 0; iCh < nChannelsC; iCh++ ) { -#ifndef FIX_1010_OPT_SINGLE_RESCALE - singularVectors_Left[nCh][iCh] = L_shl_sat( singularVectors_Left[nCh][iCh], sing_exp2[nCh][iCh] ); /* Q31 */ -#else - singularVectors_Left[nCh][iCh] = L_shl_sat( singularVectors_Left[nCh][iCh], singularVectors_Left_e[nCh][iCh] ); /* Q31 */ -#endif + singularVectors_Left[nCh][iCh] = L_shl_sat( singularVectors_Left[nCh][iCh], singularVectors_Left_e[nCh][iCh] ); /* Q31 */ move32(); } } @@ -1748,16 +1210,8 @@ static void singularVectorsAccumulationRight_fx( Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_Left_e) */ Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* input exp(singularVectors_Left_e), output Q31 */ Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ -#ifndef FIX_1010_OPT_SINGLE_RESCALE - Word16 singularVectors_e, -#else Word16 singularVectors_Left_e[][MAX_OUTPUT_CHANNELS], -#endif -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - Word16 secDiag_e, -#else Word16 *secDiag_e, -#endif const Word16 nChannelsC /* Q0 */ ) { @@ -1767,7 +1221,7 @@ static void singularVectorsAccumulationRight_fx( Word16 norm_y_e, temp_exp1, sing_right_exp[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS] = { 0 }; /* Processing */ - nChannels = nChannelsC; /* nChannelsC Q0*/ + nChannels = nChannelsC; /* nChannelsC Q0*/ /* avoid compiler warning */ t_ii = secDiag[nChannels - 1]; /* exp(secDiag_e[nChannels - 1]) */ @@ -1783,47 +1237,48 @@ static void singularVectorsAccumulationRight_fx( FOR( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC*/ { -#ifdef FIX_1010_OPT_DIV ratio_float = L_deposit_h( BASOP_Util_Divide3232_Scale( singularVectors_Left[nCh][iCh], maxWithSign_fx( singularVectors_Left[nCh][nCh + 1] ), &temp_exp1 ) ); /* exp(temp_exp1) */ singularVectors_Right[iCh][nCh] = L_deposit_h( BASOP_Util_Divide3232_Scale( ratio_float, maxWithSign_fx( t_ii ), &sing_right_exp[iCh][nCh] ) ); /* exp(sing_right_exp + (temp_exp1 - secDiag_e) */ -#else - ratio_float = BASOP_Util_Divide3232_Scale_cadence( singularVectors_Left[nCh][iCh], maxWithSign_fx( singularVectors_Left[nCh][nCh + 1] ), &temp_exp1 ); /* exp(temp_exp1) */ - singularVectors_Right[iCh][nCh] = BASOP_Util_Divide3232_Scale_cadence( ratio_float, maxWithSign_fx( t_ii ), &sing_right_exp[iCh][nCh] ); /* exp(sing_right_exp + (temp_exp1 - secDiag_e) */ -#endif -#ifdef FIX_1010_OPT_SINGLE_RESCALE temp_exp1 = add( temp_exp1, sub( singularVectors_Left_e[nCh][iCh], singularVectors_Left_e[nCh][nCh + 1] ) ); -#endif move32(); -#ifndef FIX_1010_OPT_SEC_SINGLE_RESCALE - sing_right_exp[iCh][nCh] = add( sing_right_exp[iCh][nCh], sub( temp_exp1, secDiag_e ) ); -#else sing_right_exp[iCh][nCh] = add( sing_right_exp[iCh][nCh], sub( temp_exp1, secDiag_e[nCh + 1] ) ); -#endif move16(); // singularVectors_Right[iCh][nCh] = L_shl_sat( singularVectors_Right[iCh][nCh], temp_exp2 ); } FOR( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ { - norm_y = 0; - move32(); - norm_y_e = 0; + Word64 norm_val = 0; + move64(); + Word16 maxL_e = MIN_16; + Word16 maxR_e = MIN_16; + Word16 maxR2_e = MIN_16; + move16(); + move16(); move16(); + FOR( k = nCh + 1; k < nChannelsC; k++ ) /* nChannelsC */ + { + maxL_e = s_max( maxL_e, singularVectors_Left_e[nCh][k] ); + maxR_e = s_max( maxR_e, sing_right_exp[k][iCh] ); + maxR2_e = s_max( maxR2_e, sing_right_exp[k][nCh] ); + } FOR( k = nCh + 1; k < nChannelsC; k++ ) /* nChannelsC */ { -#ifndef FIX_1010_OPT_SINGLE_RESCALE - norm_y = BASOP_Util_Add_Mant32Exp( norm_y, norm_y_e, Mpy_32_32( singularVectors_Left[nCh][k], singularVectors_Right[k][iCh] ), add( singularVectors_e, sing_right_exp[k][iCh] ), &norm_y_e ); /* exp(norm_y_e) */ -#else - norm_y = BASOP_Util_Add_Mant32Exp( norm_y, norm_y_e, Mpy_32_32( singularVectors_Left[nCh][k], singularVectors_Right[k][iCh] ), add( singularVectors_Left_e[nCh][k], sing_right_exp[k][iCh] ), &norm_y_e ); /* exp(norm_y_e) */ -#endif + norm_val = W_mac_32_32( norm_val, L_shr( singularVectors_Left[nCh][k], sub( maxL_e, singularVectors_Left_e[nCh][k] ) ), L_shr( singularVectors_Right[k][iCh], sub( maxR_e, sing_right_exp[k][iCh] ) ) ); } + norm_y_e = W_norm( norm_val ); + norm_y = W_extract_h( W_shl( norm_val, norm_y_e ) ); + norm_y_e = sub( add( maxL_e, maxR_e ), norm_y_e ); + Word16 max_new = s_max( maxR_e, add( maxR2_e, norm_y_e ) ); FOR( k = nCh + 1; k < nChannelsC; k++ ) /* nChannelsC */ { - singularVectors_Right[k][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Right[k][iCh], sing_right_exp[k][iCh], Mpy_32_32( norm_y, singularVectors_Right[k][nCh] ), add( norm_y_e, sing_right_exp[k][nCh] ), &sing_right_exp[k][iCh] ); /* exp(sing_right_exp) */ + Word32 temp = Mpy_32_32( norm_y, singularVectors_Right[k][nCh] ); + Word32 op2 = L_shr( temp, sub( max_new, add( norm_y_e, sing_right_exp[k][nCh] ) ) ); + singularVectors_Right[k][iCh] = L_add_sat( L_shr( singularVectors_Right[k][iCh], sub( max_new, sing_right_exp[k][iCh] ) ), op2 ); /* exp(sing_right_exp) */ move32(); - singularVectors_Right[k][iCh] = L_shl_sat( singularVectors_Right[k][iCh], sing_right_exp[k][iCh] ); /* Q31 */ + singularVectors_Right[k][iCh] = L_shl_sat( singularVectors_Right[k][iCh], max_new ); /* Q31 */ move32(); sing_right_exp[k][iCh] = 0; move16(); @@ -1853,7 +1308,6 @@ static void singularVectorsAccumulationRight_fx( *-------------------------------------------------------------------------*/ -#ifdef FIX_1010_OPT_GIVENS_INV static void GivensRotation2_fx( const Word32 x, /* exp(x_e) */ const Word16 x_e, @@ -1875,7 +1329,6 @@ static void GivensRotation2_fx( *resultInv = ISqrt32( r, outInv_e ); move32(); } -#endif static Word32 GivensRotation_fx( const Word32 x, /* exp(x_e) */ @@ -1884,62 +1337,10 @@ static Word32 GivensRotation_fx( const Word16 z_e, Word16 *out_e ) { -#ifdef FIX_1010_OPT_GIVENS Word32 r; -#else - Word32 x_abs, z_abs; - Word32 cotan, tan, r; - Word16 temp_exp; - Word32 L_temp; -#endif -#ifdef FIX_1010_OPT_GIVENS r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( z, z ), shl( z_e, 1 ), Mpy_32_32( x, x ), shl( x_e, 1 ), out_e ); r = Sqrt32( r, out_e ); -#else - x_abs = L_abs( x ); - z_abs = L_abs( z ); - test(); - IF( LE_32( x_abs, Mpy_32_32( CONVERGENCE_FACTOR_FX, x_abs ) ) && LE_32( z_abs, Mpy_32_32( CONVERGENCE_FACTOR_FX, z_abs ) ) ) - { - r = 0; - move32(); - } - ELSE IF( BASOP_Util_Cmp_Mant32Exp( x_abs, x_e, z_abs, z_e ) >= 0 ) - { - IF( LE_32( x_abs, SVD_MINIMUM_VALUE_FX ) ) - { - r = 0; - move32(); - } - ELSE - { - cotan = BASOP_Util_Divide3232_Scale_cadence( z_abs, x_abs, &temp_exp ); /* exp(temp_exp + (z_e - x_e) */ - temp_exp = add( temp_exp, sub( z_e, x_e ) ); - L_temp = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, Mpy_32_32( cotan, cotan ), 2 * temp_exp, &temp_exp ); /* exp(temp_exp) */ - L_temp = Sqrt32( L_temp, &temp_exp ); - r = Mpy_32_32( x_abs, L_temp ); /* exp(x_e + temp_exp) */ - *out_e = add( x_e, temp_exp ); - } - } - ELSE - { - IF( LE_32( z_abs, SVD_MINIMUM_VALUE_FX ) ) - { - r = 0; - move32(); - } - ELSE - { - tan = BASOP_Util_Divide3232_Scale_cadence( x_abs, z_abs, &temp_exp ); /* exp(temp_exp + (x_e - z_e) */ - temp_exp = add( temp_exp, sub( x_e, z_e ) ); - L_temp = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, Mpy_32_32( tan, tan ), shl( temp_exp, 1 ), &temp_exp ); /* exp(temp_exp) */ - L_temp = Sqrt32( L_temp, &temp_exp ); - r = Mpy_32_32( z_abs, L_temp ); /* exp(z_e + temp_exp) */ - *out_e = add( z_e, temp_exp ); - } - } -#endif return ( r ); } @@ -1953,20 +1354,6 @@ static Word32 maxWithSign_fx( const Word32 a /* Qx */ ) { -#ifndef FIX_MINOR_SVD_WMOPS_MR1010X - IF( GT_32( L_abs( a ), SVD_MINIMUM_VALUE_FX ) ) - { - return a; - } - ELSE IF( a < 0 ) - { - return -SVD_MINIMUM_VALUE_FX; - } - ELSE - { - return SVD_MINIMUM_VALUE_FX; - } -#else Word32 result; IF( a >= 0 ) { @@ -1977,7 +1364,6 @@ static Word32 maxWithSign_fx( result = L_min( a, -SVD_MINIMUM_VALUE_FX ); } return result; -#endif } /*------------------------------------------------------------------------- diff --git a/lib_dec/ivas_tcx_core_dec_fx.c b/lib_dec/ivas_tcx_core_dec_fx.c index c187c351c462fe7ff3b8dcc5b1e91044a659c34d..d721d426aead1e2c24555a9535a4c0e3c59ad0ba 100644 --- a/lib_dec/ivas_tcx_core_dec_fx.c +++ b/lib_dec/ivas_tcx_core_dec_fx.c @@ -55,9 +55,9 @@ static void stereo_tcx_dec_mode_switch_reconf_ivas_fx( Decoder_State *st, const * Initialize stereo TCX decoder *-------------------------------------------------------------*/ void stereo_tcx_init_dec_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ - const Word16 last_element_mode /* i : element mode of previous frame Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ + const Word16 last_element_mode /* i : element mode of previous frame Q0*/ ) { TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; @@ -190,18 +190,18 @@ void stereo_tcx_init_dec_fx( *-------------------------------------------------------------------*/ void stereo_tcx_core_dec_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const FRAME_MODE frameMode, /* i : Decoder frame mode */ - Word16 *signal_out_fx, /* o : synthesis @internal_Fs, Q0*/ - Word16 *signal_outFB_fx, /* o : synthesis @output_Fs, Q0*/ - Word16 pitch_buf_fx[], /* o : Word16 pitch for each subframe, Q6*/ - const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC Q0*/ - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const Word16 last_element_mode, /* i : last element mode Q0*/ - const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel Q0*/ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ - const Word16 nchan_out, /* i : number of output channels Q0*/ - const IVAS_FORMAT ivas_format /* i : IVAS format */ + Decoder_State *st, /* i/o: decoder state structure */ + const FRAME_MODE frameMode, /* i : Decoder frame mode */ + Word16 *signal_out_fx, /* o : synthesis @internal_Fs, Q0*/ + Word16 *signal_outFB_fx, /* o : synthesis @output_Fs, Q0*/ + Word16 pitch_buf_fx[], /* o : Word16 pitch for each subframe, Q6*/ + const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC Q0*/ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ + const Word16 last_element_mode, /* i : last element mode Q0*/ + const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel Q0*/ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ + const Word16 nchan_out, /* i : number of output channels Q0*/ + const IVAS_FORMAT ivas_format /* i : IVAS format */ ) { Word16 i, k; @@ -219,8 +219,6 @@ void stereo_tcx_core_dec_fx( /*Concealment*/ Word16 bfi; - Word32 L_tmp, mod; - /*LPC*/ Word16 lsf_fx[( NB_DIV + 1 ) * M], lsp_fx[( NB_DIV + 1 ) * M], lspmid_fx[M], lsfmid_fx[M], lsf_tmp_fx[( NB_DIV + 1 ) * M]; Word16 lspnew_uw_fx[NB_DIV * M], lsfnew_uw_fx[NB_DIV * M]; @@ -228,11 +226,11 @@ void stereo_tcx_core_dec_fx( Word16 pit_gain_fx[NB_SUBFR16k]; /*Synth*/ - Word16 synth_buf_fx[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M]; + Word16 synth_buf_fx[OLD_SYNTH_INTERNAL_DEC + L_FRAME_PLUS_INTERNAL + M]; Word16 *synth_fx; Word16 synth_bufFB_fx[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M]; Word16 *synthFB_fx; - + Word16 synth_q[2]; Word32 psd_fx[L_FRAME16k]; Word32 psd_part_fx[NPART_SHAPING]; Word16 psd_part_e; @@ -262,11 +260,10 @@ void stereo_tcx_core_dec_fx( * Initializations *--------------------------------------------------------------------------------*/ - iDiv_and_mod_32( st->total_brate, FRAMES_PER_SEC, &L_tmp, &mod, 0 ); - total_nbbits = extract_l( L_tmp ); /* Q0 */ + total_nbbits = extract_l( Mpy_32_32_r( st->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); bitsRead = 0; move16(); - LSF_Q_prediction = -1; /* to avoid compilation warnings Q0*/ + LSF_Q_prediction = -1; /* to avoid compilation warnings Q0*/ move16(); IF( frameMode == FRAMEMODE_NORMAL ) @@ -302,7 +299,7 @@ void stereo_tcx_core_dec_fx( synthFB_fx = synth_bufFB_fx + hTcxDec->old_synth_lenFB; Copy_Scale_sig( hTcxDec->old_synth, synth_buf_fx, hTcxDec->old_synth_len, negate( st->Q_syn ) ); /* q_old_synth - st->Q_syn */ Copy( hTcxDec->old_synthFB_fx, synth_bufFB_fx, hTcxDec->old_synth_lenFB ); /* q_old_synthFB */ - set16_fx( synth_fx, 0, L_FRAME_PLUS + M ); + set16_fx( synth_fx, 0, L_FRAME_PLUS_INTERNAL + M ); set16_fx( synthFB_fx, 0, L_FRAME_PLUS + M ); /*--------------------------------------------------------------------------------* @@ -330,9 +327,13 @@ void stereo_tcx_core_dec_fx( st->core = GetPLCModeDecision_ivas_fx( st ); /* Q0 */ move16(); } - + IF( st->core != ACELP_CORE ) + { + st->Q_syn_factor = 0; + move16(); + } /*--------------------------------------------------------------------------------* - * LPC PARAMETERS + * LPC envelope decoding *--------------------------------------------------------------------------------*/ st->acelp_cfg.midLpc = 0; @@ -344,18 +345,8 @@ void stereo_tcx_core_dec_fx( { Word16 tcx_lpc_cdk; - test(); - test(); - IF( bfi && st->use_partial_copy && EQ_16( st->rf_frame_type, RF_TCXFD ) ) - { - tcx_lpc_cdk = tcxlpc_get_cdk( GENERIC ); /* Q0 */ - move16(); - } - ELSE - { - tcx_lpc_cdk = tcxlpc_get_cdk( st->coder_type ); /* Q0 */ - move16(); - } + tcx_lpc_cdk = tcxlpc_get_cdk( st->coder_type ); + move16(); Copy( st->lsf_old_fx, &lsf_fx[0], M ); /* Q2.56 */ Copy( st->lsp_old_fx, &lsp_fx[0], M ); /* Q15 */ @@ -386,7 +377,7 @@ void stereo_tcx_core_dec_fx( FOR( k = 0; k < st->numlpc; ++k ) { - Copy( &lsp_fx[( k + 1 ) * M], &lspnew_uw_fx[k * M], M ); /*basop not used for k * M as M is a multiple of 2 Q15*/ + Copy( &lsp_fx[( k + 1 ) * M], &lspnew_uw_fx[k * M], M ); /*basop not used for k * M as M is a multiple of 2 Q15*/ Copy( &lsf_fx[( k + 1 ) * M], &lsfnew_uw_fx[k * M], M ); /* Q2.56 */ } } @@ -448,7 +439,7 @@ void stereo_tcx_core_dec_fx( Copy( &lsfnew_uw_fx[k * M], &lsf_fx[( k + 1 ) * M], M ); /* Q2.56 */ Copy( &lsfnew_uw_fx[k * M], &lsf_tmp_fx[( k + 1 ) * M], M ); /* Q2.56 */ - v_multc_fixed_16_16( &lsf_tmp_fx[( k + 1 ) * M], sr_core_ratio, &lsf_tmp_fx[( k + 1 ) * M], M ); + v_multc_fx_16_16( &lsf_tmp_fx[( k + 1 ) * M], sr_core_ratio, &lsf_tmp_fx[( k + 1 ) * M], M ); Scale_sig( &lsf_tmp_fx[( k + 1 ) * M], M, tmp ); test(); IF( !st->lpcQuantization && EQ_32( st->sr_core, INT_FS_16k_FX ) ) @@ -480,13 +471,6 @@ void stereo_tcx_core_dec_fx( E_LPC_f_lsp_a_conversion( st->lsp_old_fx, st->old_Aq_12_8_fx, M ); } - test(); - if ( st->enablePlcWaveadjust && bfi ) - { - st->hPlcInfo->nbLostCmpt = add( st->hPlcInfo->nbLostCmpt, 1 ); /* Q0 */ - move16(); - } - /*--------------------------------------------------------------------------------* * TD-TCX concealment *--------------------------------------------------------------------------------*/ @@ -585,7 +569,9 @@ void stereo_tcx_core_dec_fx( } /* TCX decoder */ - decoder_tcx_ivas_fx( st, prm, Aq_fx, Aind, &synth_fx[0], &synthFB_fx[0], bfi, 0, sba_dirac_stereo_flag ); + decoder_tcx_ivas_fx( st, prm, Aq_fx, Aind, &synth_fx[0], &synthFB_fx[0], &synth_q[0], bfi, 0, sba_dirac_stereo_flag ); + st->Q_syn_factor = sub( synth_q[0], st->Q_syn ); + st->Q_syn = synth_q[0]; } /*--------------------------------------------------------------------------------* @@ -614,8 +600,22 @@ void stereo_tcx_core_dec_fx( } /* TCX decoder */ - decoder_tcx_ivas_fx( st, prm, Aq_fx, Aind, &synth_fx[k * st->L_frame / 2], &synthFB_fx[k * ( hTcxDec->L_frameTCX / 2 )], bfi, k, sba_dirac_stereo_flag ); + decoder_tcx_ivas_fx( st, prm, Aq_fx, Aind, &synth_fx[k * st->L_frame / 2], &synthFB_fx[k * ( hTcxDec->L_frameTCX / 2 )], &synth_q[k], bfi, k, sba_dirac_stereo_flag ); } + + Word16 q_min, q_shift; + + q_min = s_min( synth_q[0], synth_q[1] ); + st->Q_syn_factor = sub( q_min, st->Q_syn ); + st->Q_syn = q_min; + + q_shift = sub( q_min, synth_q[0] ); + scale_sig( &synth_fx[0], shr( st->L_frame, 1 ), q_shift ); + scale_sig( &synthFB_fx[0], shr( hTcxDec->L_frameTCX, 1 ), q_shift ); + + q_shift = sub( q_min, synth_q[1] ); + scale_sig( &synth_fx[shr( st->L_frame, 1 )], shr( st->L_frame, 1 ), q_shift ); + scale_sig( &synthFB_fx[shr( hTcxDec->L_frameTCX, 1 )], shr( hTcxDec->L_frameTCX, 1 ), q_shift ); } /*--------------------------------------------------------------------------------* @@ -625,51 +625,11 @@ void stereo_tcx_core_dec_fx( test(); IF( EQ_16( st->core, TCX_10_CORE ) || EQ_16( st->core, TCX_20_CORE ) ) { - test(); - test(); - IF( st->enablePlcWaveadjust || /* bfi */ - ( GE_32( st->last_total_brate, HQ_48k ) && /* recovery */ - EQ_16( st->last_codec_mode, MODE2 ) ) ) - { - IF( st->hTonalMDCTConc->q_lastPcmOut != 0 ) - { - Scale_sig( st->hTonalMDCTConc->secondLastPcmOut, shr( hTcxDec->L_frameTCX, 1 ), negate( st->hTonalMDCTConc->q_lastPcmOut ) ); - Scale_sig( st->hTonalMDCTConc->lastPcmOut, hTcxDec->L_frameTCX, negate( st->hTonalMDCTConc->q_lastPcmOut ) ); - st->hTonalMDCTConc->q_lastPcmOut = 0; - move16(); - } - /* waveform adjustment */ - concealment_signal_tuning_fx( st, bfi, synthFB_fx, st->last_core_bfi ); - - test(); - test(); - test(); -#ifdef NONBE_FIX_1402_WAVEADJUST - IF( ( bfi || st->prev_bfi ) && st->hPlcInfo->Pitch_fx && EQ_16( st->hPlcInfo->concealment_method, TCX_NONTONAL ) ) -#else - IF( ( bfi || st->prev_bfi ) && st->hPlcInfo->Pitch && EQ_16( st->hPlcInfo->concealment_method, TCX_NONTONAL ) ) -#endif - { - lerp( synthFB_fx, synth_fx, st->L_frame, hTcxDec->L_frameTCX ); - - if ( !bfi && st->prev_bfi ) - { -#ifdef NONBE_FIX_1402_WAVEADJUST - st->hPlcInfo->Pitch_fx = 0; -#else - st->hPlcInfo->Pitch = 0; -#endif - move16(); - } - } - } - IF( !bfi && st->hTonalMDCTConc != NULL ) { - TonalMDCTConceal_SaveTimeSignal_ivas_fx( st->hTonalMDCTConc, synthFB_fx, 0, hTcxDec->L_frameTCX ); + TonalMDCTConceal_SaveTimeSignal_ivas_fx( st->hTonalMDCTConc, synthFB_fx, st->Q_syn, hTcxDec->L_frameTCX ); } - - decoder_tcx_post_ivas_fx( st, synth_fx, synthFB_fx, 0, Aq_fx, bfi, 0 ); + decoder_tcx_post_ivas_fx( st, synth_fx, synthFB_fx, st->Q_syn, Aq_fx, bfi, 0 ); IF( EQ_16( st->core, TCX_20_CORE ) ) { @@ -756,8 +716,8 @@ void stereo_tcx_core_dec_fx( IF( EQ_16( bfi, 1 ) ) { - Copy( st->lspold_uw, st->lsp_old_fx, M ); /* for recovery Q15*/ - Copy( st->lsfold_uw, st->lsf_old_fx, M ); /* for recovery Q15*/ + Copy( st->lspold_uw, st->lsp_old_fx, M ); /* for recovery Q15*/ + Copy( st->lsfold_uw, st->lsf_old_fx, M ); /* for recovery Q15*/ } ELSE { @@ -816,21 +776,11 @@ void stereo_tcx_core_dec_fx( move16(); /* Postfiltering */ -#ifndef MSAN_FIX - IF( st->p_bpf_noise_buf_32 ) - { - Copy_Scale_sig_32_16( st->p_bpf_noise_buf_32, st->p_bpf_noise_buf, st->L_frame, negate( Q11 ) ); - } -#endif post_decoder( st, synth_buf_fx, pit_gain_fx, pitch, signal_out_fx, st->p_bpf_noise_buf ); test(); -#ifdef MSAN_FIX IF( st->p_bpf_noise_buf_32 && st->tcxonly == 0 ) -#else - IF( st->p_bpf_noise_buf_32 ) -#endif // MSAN_FIX { Copy_Scale_sig_16_32_no_sat( st->p_bpf_noise_buf, st->p_bpf_noise_buf_32, st->L_frame, Q11 ); /* q_p_bpf + Q11 */ } @@ -841,12 +791,6 @@ void stereo_tcx_core_dec_fx( IF( !bfi ) { - if ( st->enablePlcWaveadjust ) - { - st->hPlcInfo->nbLostCmpt = 0; - move16(); - } - IF( param[1 + NOISE_FILL_RANGES] != 0 ) { Word32 tcxltp_pitch_tmp = L_add( L_deposit_h( hTcxLtpDec->tcxltp_pitch_int ), L_shl( L_deposit_l( div_s( hTcxLtpDec->tcxltp_pitch_fr, st->pit_res_max ) ), 1 ) ); /*15Q16*/ @@ -893,11 +837,11 @@ void stereo_tcx_core_dec_fx( { Word16 buffer[L_FRAME16k]; lerp( signal_outFB_fx, buffer, st->L_frame, hTcxDec->L_frameTCX ); - ApplyFdCng_ivas_fx( buffer, 0 /* Q of buffer */, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_fx( buffer, 0 /* Q of buffer */, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); } ELSE { - ApplyFdCng_ivas_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); } } @@ -923,7 +867,6 @@ void stereo_tcx_core_dec_fx( Word32 signal_out_32_fx[L_FRAME48k]; Word16 exp; Copy_Scale_sig_16_32_no_sat( signal_out_fx, signal_out_32_fx, st->hFdCngDec->hFdCngCom->frameSize, Q6 ); - Copy_Scale_sig_16_32_no_sat( st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), Q15 ); generate_masking_noise_ivas_fx( signal_out_32_fx, &exp, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); Copy_Scale_sig_32_16( signal_out_32_fx, signal_out_fx, st->hFdCngDec->hFdCngCom->frameSize, negate( exp ) ); // Q0 Copy_Scale_sig_32_16( st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), -Q15 ); // Q0 @@ -933,7 +876,7 @@ void stereo_tcx_core_dec_fx( test(); IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && st->idchan == 0 ) { - ApplyFdCng_ivas_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); } } @@ -941,10 +884,11 @@ void stereo_tcx_core_dec_fx( return; } + static void stereo_tcx_dec_mode_switch_reconf_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ - const Word16 last_element_mode, /* i : element mode of previous frame Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ + const Word16 last_element_mode, /* i : element mode of previous frame Q0*/ Word16 *Q_syn_Overl_TDAC, Word16 *Q_fer_samples, Word16 *Q_syn_Overl, @@ -985,9 +929,9 @@ static void stereo_tcx_dec_mode_switch_reconf_ivas_fx( return; } static void dec_prm_tcx_ivas_fx( - Decoder_State *st, /* i/o: decoder memory state */ - Word16 param[], /* o : decoded parameters Q0*/ - Word16 param_lpc[], /* o : LPC parameters Q0*/ + Decoder_State *st, /* i/o: decoder memory state */ + Word16 param[], /* o : decoded parameters Q0*/ + Word16 param_lpc[], /* o : LPC parameters Q0*/ Word16 *total_nbbits, /* i/o: number of bits / decoded bits Q0*/ const Word16 last_element_mode, /* i : last element mode Q0*/ Word16 *bitsRead /* o : number of read bits Q0*/ @@ -1027,10 +971,9 @@ static void dec_prm_tcx_ivas_fx( getTCXMode_ivas_fx( st, st, 0 /* <- MCT_flag */ ); /* last_core for error concealment */ - test(); - IF( !st->use_partial_copy && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) + IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - st->last_core_from_bs = get_next_indice_fx( st, 1 ); /* Store decoder memory of last_core Q0*/ + st->last_core_from_bs = get_next_indice_fx( st, 1 ); /* Store decoder memory of last_core Q0*/ move16(); test(); @@ -1073,22 +1016,18 @@ static void dec_prm_tcx_ivas_fx( } } - IF( !st->use_partial_copy ) + IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) - { - getTCXWindowing_ivas_fx( st->core, st->last_core, st->element_mode, st->hTcxCfg, st ); - } - st->flagGuidedAcelp = 0; - move16(); - - if ( st->dec_glr ) - { - st->dec_glr_idx = -1; - move16(); - } + getTCXWindowing_ivas_fx( st->core, st->last_core, st->element_mode, st->hTcxCfg, st ); } + st->flagGuidedAcelp = 0; + move16(); + if ( st->dec_glr ) + { + st->dec_glr_idx = -1; + move16(); + } /*--------------------------------------------------------------------------------* * LPC parameters @@ -1103,24 +1042,18 @@ static void dec_prm_tcx_ivas_fx( * TCX20/10 parameters *--------------------------------------------------------------------------------*/ - IF( st->use_partial_copy == 0 ) - { - getTCXparam_fx( st, st, hm_cfg, param, bits_common, start_bit_pos, NULL, NULL, NULL, -1 ); - } + getTCXparam_fx( st, st, hm_cfg, param, bits_common, start_bit_pos, NULL, NULL, NULL, -1 ); - IF( !st->use_partial_copy ) + IF( LT_16( sub( *total_nbbits, bitsRead[0] ), sub( st->next_bit_pos, start_bit_pos ) ) ) { - IF( LT_16( sub( *total_nbbits, bitsRead[0] ), sub( st->next_bit_pos, start_bit_pos ) ) ) - { - st->BER_detect = 1; - move16(); - st->next_bit_pos = add( start_bit_pos, sub( *total_nbbits, bitsRead[0] ) ); /* Q0 */ - move16(); - } - - bitsRead[0] = sub( st->next_bit_pos, start_bit_pos ); /* Q0 */ + st->BER_detect = 1; + move16(); + st->next_bit_pos = add( start_bit_pos, sub( *total_nbbits, bitsRead[0] ) ); /* Q0 */ move16(); } + bitsRead[0] = sub( st->next_bit_pos, start_bit_pos ); /* Q0 */ + move16(); + return; } diff --git a/lib_dec/ivas_td_low_rate_dec_fx.c b/lib_dec/ivas_td_low_rate_dec_fx.c index 98c1a6a79dd6fcd080752f1b40a09f483c7cf8da..32b5b3f87d609a93a90e3c797645bf71f6f9b88d 100644 --- a/lib_dec/ivas_td_low_rate_dec_fx.c +++ b/lib_dec/ivas_td_low_rate_dec_fx.c @@ -40,15 +40,22 @@ #include "prot_fx.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" + +/*-------------------------------------------------------------------* + * tdm_low_rate_dec_fx() + * + * Low-bitrate decoder + *-------------------------------------------------------------------*/ + void tdm_low_rate_dec_fx( - Decoder_State *st, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Q_exc*/ - Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - const Word16 *lsf_new /* i : ISFs at the end of the frame Q8/100 (2.56x)*/ + Decoder_State *st, /* i/o: decoder static memory */ + Word16 dct_epit[], /* o : GSC excitation in DCT domain Q_exc*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + const Word16 *lsf_new /* i : ISFs at the end of the frame Q8/100 (2.56x)*/ ) { Word16 tmp_nb_bits_tot, pit_band_idx; @@ -127,7 +134,7 @@ void tdm_low_rate_dec_fx( tmp_nb_bits_tot = sub( tmp_nb_bits_tot, 1 ); /* Q0 */ } - gsc_dec_ivas_fx( st, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st->coder_type, &last_bin, lsf_new, exc_wo_nf_fx, &st->Q_exc ); + gsc_dec_fx( st, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st->coder_type, &last_bin, lsf_new, exc_wo_nf_fx, &st->Q_exc ); /*--------------------------------------------------------------------------------------* * iDCT transform @@ -137,7 +144,6 @@ void tdm_low_rate_dec_fx( edct_16fx( exc_wo_nf_fx, exc_wo_nf_fx, L_FRAME, find_guarded_bits_fx( L_FRAME ), IVAS_CPE_TD ); -#ifdef FIX_USAN_ISSUES IF( bwe_exc != NULL ) { Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, &exc[0], &bwe_exc[0], st->hGSCDec->last_exc_dct_in_fx, @@ -148,10 +154,6 @@ void tdm_low_rate_dec_fx( Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, &exc[0], NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, L_FRAME * HIBND_ACB_L_FAC, L_shl( st->lp_gainc_fx, 13 /* Q3 -> Q16*/ ), &( st->Q_exc ), st->Q_subfr, NULL, 0, st->coder_type ); } -#else - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, &exc[0], &bwe_exc[0], st->hGSCDec->last_exc_dct_in_fx, - L_FRAME, L_FRAME * HIBND_ACB_L_FAC, L_shl( st->lp_gainc_fx, 13 /* Q3 -> Q16*/ ), &( st->Q_exc ), st->Q_subfr, NULL, 0, st->coder_type ); -#endif /*----------------------------------------------------------------------* * Remove potential pre-echo in case an onset has been detected *----------------------------------------------------------------------*/ @@ -193,29 +195,25 @@ void tdm_low_rate_dec_fx( return; } + /*---------------------------------------------------------------------* * decod_gen_2sbfr() * * Decode generic (GC), 2 subframes mode *---------------------------------------------------------------------*/ -/*---------------------------------------------------------------------* - * decod_gen_2sbfr_ivas_fx() - * - * Decode generic (GC), 2 subframes mode - *---------------------------------------------------------------------*/ -void decod_gen_2sbfr_ivas_fx( - Decoder_State *st, /* i/o: decoder static memory */ +void decod_gen_2sbfr_fx( + Decoder_State *st, /* i/o: decoder static memory */ const Word16 sharpFlag, /* i : formant sharpening flag `Q0*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ + const Word16 *Aq, /* i : LP filter coefficient Q12*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ - const Word16 tdm_Pri_pitch_buf[] /* i : pitch values for primary channel Q6*/ + const Word16 tdm_Pri_pitch_buf[] /* i : pitch values for primary channel Q6*/ ) { Word16 T0, T0_frac, T0_min, T0_max; /* integer pitch variables */ @@ -227,12 +225,12 @@ void decod_gen_2sbfr_ivas_fx( move32(); Word16 gain_inov = 0; /* Innovation gain */ move16(); - Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ - Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes */ + Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ + Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes */ Word16 voice_fac; /* voicing factor */ Word16 code[2 * L_SUBFR]; /* algebraic codevector */ const Word16 *p_Aq; /* Pointer to frame LP coefficient */ - Word16 *pt_pitch; /* pointer to Word16 pitch */ + Word16 *pt_pitch; /* pointer to Word16 pitch */ Word16 i_subfr; /* tmp variables */ Word16 L_frame; Word16 pitch_limit_flag; @@ -259,8 +257,8 @@ void decod_gen_2sbfr_ivas_fx( * ACELP subframe loop *------------------------------------------------------------------*/ - p_Aq = Aq; /* pointer to interpolated LPC parameters Q12*/ - pt_pitch = pitch_buf; /* pointer to the pitch buffer Q6*/ + p_Aq = Aq; /* pointer to interpolated LPC parameters Q12*/ + pt_pitch = pitch_buf; /* pointer to the pitch buffer Q6*/ FOR( i_subfr = 0; i_subfr < L_frame; i_subfr += 2 * L_SUBFR ) { @@ -268,7 +266,7 @@ void decod_gen_2sbfr_ivas_fx( * Decode pitch lag *----------------------------------------------------------------------*/ - *pt_pitch = pit_decode_ivas_fx( st, st->core_brate, 0, L_frame, i_subfr, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, 2 * L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); /* Q6 */ + *pt_pitch = pit_decode_fx( st, st->core_brate, 0, L_frame, i_subfr, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, 2 * L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); /* Q6 */ test(); test(); @@ -280,8 +278,14 @@ void decod_gen_2sbfr_ivas_fx( /*--------------------------------------------------------------* * Find the adaptive codebook vector *--------------------------------------------------------------*/ - - pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, 2 * L_SUBFR + 1, inter4_2_fx_Q15, L_INTERPOL2, PIT_UP_SAMP ); + IF( st->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, 2 * L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, 2 * L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } /*--------------------------------------------------------------* * LP filtering of the adaptive excitation @@ -300,7 +304,7 @@ void decod_gen_2sbfr_ivas_fx( * Estimate spectrum tilt and voicing *--------------------------------------------------------------*/ - gain_dec_lbr_ivas_fx( st, GENERIC, i_subfr, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, gc_mem, gp_mem, 2 * L_SUBFR ); + gain_dec_lbr_fx( st, GENERIC, i_subfr, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, gc_mem, gp_mem, 2 * L_SUBFR ); st->tilt_code_fx = est_tilt_ivas_fx( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, st->Q_exc, 2 * L_SUBFR, 0 ); /* Q15 */ move16(); @@ -317,10 +321,13 @@ void decod_gen_2sbfr_ivas_fx( Word16 gain_code16 = round_fx( L_shl( gain_code, st->Q_exc ) ); /*Q_exc*/ Acelp_dec_total_exc( exc, exc2, gain_code16, gain_pit, i_subfr, code, 2 * L_SUBFR ); + /*-----------------------------------------------------------------* * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_ivas_fx( L_frame, 2 * L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/], bwe_exc, 0, NULL, st->Q_exc, T0, T0_frac, GENERIC, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); + + prep_tbe_exc_fx( L_frame, 2 * L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/], bwe_exc, 0, NULL, Q10, st->Q_exc, T0, T0_frac, GENERIC, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); + voice_factors[i_subfr / L_SUBFR + 1] = voice_factors[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/]; /* Q15 */ move16(); @@ -328,9 +335,10 @@ void decod_gen_2sbfr_ivas_fx( * Excitation enhancements (update of total excitation signal) * called twice because adapting it to double the subfr length would need lot of modifications *----------------------------------------------------------------*/ - enhancer_ivas_fx2( st->core_brate, 0, GENERIC, i_subfr, L_frame, voice_fac, st->stab_fac_fx, norm_gain_code, gain_inov, &st->gc_threshold_fx, code, exc2, gain_pit, &st->dm_fx, st->Q_exc ); - enhancer_ivas_fx2( st->core_brate, 0, GENERIC, i_subfr, L_frame, voice_fac, st->stab_fac_fx, norm_gain_code, gain_inov, &st->gc_threshold_fx, code + L_SUBFR, exc2 + L_SUBFR, gain_pit, &st->dm_fx, st->Q_exc ); + enhancer_ivas_fx( MODE1, st->core_brate, -1, 0, GENERIC, i_subfr, L_frame, voice_fac, st->stab_fac_fx, norm_gain_code, gain_inov, &st->gc_threshold_fx, code, exc2, gain_pit, &st->dm_fx, st->Q_exc ); + + enhancer_ivas_fx( MODE1, st->core_brate, -1, 0, GENERIC, i_subfr, L_frame, voice_fac, st->stab_fac_fx, norm_gain_code, gain_inov, &st->gc_threshold_fx, code + L_SUBFR, exc2 + L_SUBFR, gain_pit, &st->dm_fx, st->Q_exc ); p_Aq += 2 * ( M + 1 ); /* Q12 */ diff --git a/lib_dec/jbm_jb4_circularbuffer.h b/lib_dec/jbm_jb4_circularbuffer.h index 9e3102feba4dee6b3812f2aca4cdd5c6b7461c20..36325c8c71942843674cb0388f01b553ab4cad6f 100644 --- a/lib_dec/jbm_jb4_circularbuffer.h +++ b/lib_dec/jbm_jb4_circularbuffer.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef JBM_JB4_CIRCULARBUFFER_H diff --git a/lib_dec/jbm_jb4_circularbuffer.c b/lib_dec/jbm_jb4_circularbuffer_fx.c similarity index 99% rename from lib_dec/jbm_jb4_circularbuffer.c rename to lib_dec/jbm_jb4_circularbuffer_fx.c index f9d6d1ca148c39a2c2891ace4451261d119a2458..94341968436e8f28bf43ba8f4136a39b20062476 100644 --- a/lib_dec/jbm_jb4_circularbuffer.c +++ b/lib_dec/jbm_jb4_circularbuffer_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_dec/jbm_jb4_inputbuffer.h b/lib_dec/jbm_jb4_inputbuffer.h index 769cccba68424358d328d32f01c540de96d5904d..93174a08284b532b449f6bef2d05fe7c730e1dbe 100644 --- a/lib_dec/jbm_jb4_inputbuffer.h +++ b/lib_dec/jbm_jb4_inputbuffer.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /** \file jbm_jb4_inputbuffer.h RTP input buffer with fixed capacity. */ diff --git a/lib_dec/jbm_jb4_inputbuffer.c b/lib_dec/jbm_jb4_inputbuffer_fx.c similarity index 99% rename from lib_dec/jbm_jb4_inputbuffer.c rename to lib_dec/jbm_jb4_inputbuffer_fx.c index 5497a437126a701eccbc82e1aad6bf352a654f06..3e16f8ef5d415d17ee13950bee113812a37f8168 100644 --- a/lib_dec/jbm_jb4_inputbuffer.c +++ b/lib_dec/jbm_jb4_inputbuffer_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /** \file jbm_jb4_inputbuffer.c RTP input buffer with fixed capacity. */ diff --git a/lib_dec/jbm_jb4_jmf.h b/lib_dec/jbm_jb4_jmf.h index 6b5a004348d06f61385b761e1fc1e454d84041c8..255c8a39a3025264bc2bffb1d84fee3e2e583f62 100644 --- a/lib_dec/jbm_jb4_jmf.h +++ b/lib_dec/jbm_jb4_jmf.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /** \file jbm_jb4_jmf.h jitter measure fifo - a fifo used for windowed measure of network status */ diff --git a/lib_dec/jbm_jb4_jmf.c b/lib_dec/jbm_jb4_jmf_fx.c similarity index 99% rename from lib_dec/jbm_jb4_jmf.c rename to lib_dec/jbm_jb4_jmf_fx.c index 5ab8242c75bbbd078d3fbc6ddc30ee102bf1b224..086c76e5a1640493e37b0e659e9ec997abf5e7f0 100644 --- a/lib_dec/jbm_jb4_jmf.c +++ b/lib_dec/jbm_jb4_jmf_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /** \file jbm_jb4_jmf.c jitter measure fifo - a fifo used for windowed measure of network status */ diff --git a/lib_dec/jbm_jb4sb.h b/lib_dec/jbm_jb4sb.h index 5b5ff16c5f2a19c2e06b74cf8bd1e456feeb8545..f579a5f25ef2104de71a7a53a5ca718550cffbbb 100644 --- a/lib_dec/jbm_jb4sb.h +++ b/lib_dec/jbm_jb4sb.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /** \file jbm_jb4sb.h EVS Jitter Buffer Management Interface */ @@ -86,6 +86,10 @@ void JB4_Destroy( JB4_HANDLE *ph ); ivas_error JB4_Init( JB4_HANDLE h, const Word16 safetyMargin ); +#ifdef NONBE_1122_KEEP_EVS_MODE_UNCHANGED +void JB4_TMP_SetEvsCompatFlag( JB4_HANDLE h ); +#endif + JB4_DATAUNIT_HANDLE JB4_AllocDataUnit( JB4_HANDLE h ); void JB4_FreeDataUnit( JB4_HANDLE h, JB4_DATAUNIT_HANDLE dataUnit ); diff --git a/lib_dec/jbm_jb4sb.c b/lib_dec/jbm_jb4sb_fx.c similarity index 96% rename from lib_dec/jbm_jb4sb.c rename to lib_dec/jbm_jb4sb_fx.c index 002b4bc109985558a4bf8769317309d597cb8aca..43ef69a9846152b5a860e2e7aa2a9f458337eb28 100644 --- a/lib_dec/jbm_jb4sb.c +++ b/lib_dec/jbm_jb4sb_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /*! \file jbm_jb4sb.c EVS Jitter Buffer Management Interface */ @@ -198,6 +198,9 @@ struct JB4 JB4_DATAUNIT_HANDLE freeMemorySlots[MAX_JBM_SLOTS]; UWord16 nFreeMemorySlots; /*@} */ +#ifdef NONBE_1122_KEEP_EVS_MODE_UNCHANGED + bool evsMode; +#endif }; /* JB4 */ @@ -323,6 +326,10 @@ ivas_error JB4_Create( } h->nFreeMemorySlots = MAX_JBM_SLOTS; move16(); +#ifdef NONBE_1122_KEEP_EVS_MODE_UNCHANGED + h->evsMode = false; + move16(); +#endif *ph = h; return IVAS_ERR_OK; @@ -407,6 +414,13 @@ ivas_error JB4_Init( return IVAS_ERR_OK; } +#ifdef NONBE_1122_KEEP_EVS_MODE_UNCHANGED +void JB4_TMP_SetEvsCompatFlag( JB4_HANDLE h ) +{ + h->evsMode = true; + move16(); +} +#endif /* Returns a memory slot to store a new data unit */ JB4_DATAUNIT_HANDLE JB4_AllocDataUnit( @@ -419,10 +433,12 @@ JB4_DATAUNIT_HANDLE JB4_AllocDataUnit( JB4_dropFromBuffer( h ); } + /* LOCK JBM MEMORY SLOT BEGIN */ h->nFreeMemorySlots = (UWord16) L_sub( h->nFreeMemorySlots, 1 ); move16(); dataUnit = h->freeMemorySlots[h->nFreeMemorySlots]; h->freeMemorySlots[h->nFreeMemorySlots] = NULL; + /* LOCK JBM MEMORY SLOT END */ assert( dataUnit != NULL ); return dataUnit; @@ -436,8 +452,10 @@ void JB4_FreeDataUnit( { assert( dataUnit != NULL ); assert( h->nFreeMemorySlots < MAX_JBM_SLOTS ); + /* LOCK JBM MEMORY SLOT BEGIN */ h->freeMemorySlots[h->nFreeMemorySlots] = dataUnit; h->nFreeMemorySlots = (UWord16) L_add( h->nFreeMemorySlots, 1 ); + /* LOCK JBM MEMORY SLOT END */ move16(); return; @@ -756,11 +774,17 @@ static void JB4_targetPlayoutDelay( move32(); move32(); - if ( LT_64( *targetStartUp, 60 ) ) +#ifdef NONBE_1122_KEEP_EVS_MODE_UNCHANGED + IF( !h->evsMode ) { - *targetStartUp = 60; +#endif + *targetDtx = JB4_MAX( *targetDtx, (UWord32) h->safetyMargin ); move32(); +#ifdef NONBE_1122_KEEP_EVS_MODE_UNCHANGED } +#endif + *targetStartUp = JB4_MAX( *targetStartUp, (UWord32) h->safetyMargin ); + move32(); return; } @@ -911,7 +935,7 @@ static void JB4_adaptActivePlayout( ELSE { Word16 exp; - Word32 temp = BASOP_Util_Divide3232_Scale_cadence( W_extract_l( W_sub( dropRateMax, dropRateMin ) ), W_extract_l( dropGapMax ), &exp ); + Word32 temp = BASOP_Util_Divide3232_Scale_newton( W_extract_l( W_sub( dropRateMax, dropRateMin ) ), W_extract_l( dropGapMax ), &exp ); /* limit gap to [gapMin,gapMax] and calculate current drop rate from gap */ Word64 temp2 = W_mult0_32_32( W_extract_l( JB4_MIN( gap, dropGapMax ) ), temp ); Word64 temp3 = W_shr( temp2, sub( 31, exp ) ); @@ -922,7 +946,11 @@ static void JB4_adaptActivePlayout( } rate = (UWord32) W_add( temp3, dropRateMin ); *scale = idiv1616( sub( 1000, (Word16) rate ), 10 ); - *maxScaling = (UWord32) W_sub( currPlayoutDelay, targetMax ); + /* Limit max scaling to the duration of one frame. APA will not exceed this limit + * anyway due to the 50% limitation of APA_MIN_SCALE and APA_MAX_SCALE. Limiting + * the value to a sensible range here avoids integer overflows at later stages when + * converting maxScaling from milliseconds to samples. */ + *maxScaling = (UWord32) JB4_MIN( W_sub( currPlayoutDelay, targetMax ), 1000 / IVAS_NUM_FRAMES_PER_SEC ); move32(); move32(); } @@ -943,7 +971,11 @@ static void JB4_adaptActivePlayout( { *scale = 120; move32(); - *maxScaling = (UWord32) W_sub( targetMaxStretch, currPlayoutDelay ); + /* Limit max scaling to the duration of one frame. APA will not exceed this limit + * anyway due to the 50% limitation of APA_MIN_SCALE and APA_MAX_SCALE. Limiting + * the value to a sensible range here avoids integer overflows at later stages when + * converting maxScaling from milliseconds to samples. */ + *maxScaling = (UWord32) JB4_MIN( W_sub( targetMaxStretch, currPlayoutDelay ), 1000 / IVAS_NUM_FRAMES_PER_SEC ); move32(); } } @@ -1290,7 +1322,7 @@ static void JB4_estimateShortTermJitter( } IF( temp != 0 ) { - temp = L_shr( ceil_fixed( temp, sub( 15, exp ) ), sub( 15, exp ) ); // Q31 + temp = L_shr( ceil_fx( temp, sub( 15, exp ) ), sub( 15, exp ) ); // Q31 } h->stJitter = (UWord32) W_mult0_32_32( temp, h->frameDuration ); move32(); diff --git a/lib_dec/jbm_pcmdsp_apa.h b/lib_dec/jbm_pcmdsp_apa.h index 7955d0ea6e1b86aa6be7d6dcab90b331ef7c463f..2fdc1f6253a48cdf75526760aba33b0f02b40a2c 100644 --- a/lib_dec/jbm_pcmdsp_apa.h +++ b/lib_dec/jbm_pcmdsp_apa.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /*! @file jbm_pcmdsp_apa.h Adaptive Playout for Audio (apa). */ @@ -39,9 +39,9 @@ #ifndef JBM_PCMDSP_APA_H #define JBM_PCMDSP_APA_H JBM_PCMDSP_APA_H +#include "common_api_types.h" #include -#include -#include "options.h" + /* ******************************************************************************** @@ -50,17 +50,17 @@ */ /* size of IO buffers (a_in[], a_out[]) for apa_exec() */ -#define APA_BUF_PER_CHANNEL ( 960 * 3 ) -#define APA_MAX_NUM_CHANNELS 16 +#define APA_BUF_PER_CHANNEL ( IVAS_MAX_FRAME_SIZE * 2 ) /* == twice the max. frame length */ +#define APA_MAX_NUM_CHANNELS ( 12 ) /* == MAX_TRANSPORT_CHANNELS */ #define APA_BUF ( APA_BUF_PER_CHANNEL * APA_MAX_NUM_CHANNELS ) /* min/max sampling rate [Hz] */ #define APA_MIN_RATE 1000 -#define APA_MAX_RATE 48000 +#define APA_MAX_RATE IVAS_MAX_SAMPLING_RATE /* min/max scaling [%] */ -#define APA_MIN_SCALE 50 -#define APA_MAX_SCALE 150 +#define APA_MIN_SCALE IVAS_TIME_SCALE_MIN +#define APA_MAX_SCALE IVAS_TIME_SCALE_MAX #define APA_SM_SURROUND 1 #define APA_SM_LOGARITHMIC 2 diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa_fx.c similarity index 95% rename from lib_dec/jbm_pcmdsp_apa.c rename to lib_dec/jbm_pcmdsp_apa_fx.c index fc793dff01c72047684bc8a5db1fe53ab98f5644..f33ca4b6610c360930c884c4a727d56aacb34b43 100644 --- a/lib_dec/jbm_pcmdsp_apa.c +++ b/lib_dec/jbm_pcmdsp_apa_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /*! @file jbm_pcmdsp_apa.c Adaptive Playout for Audio (apa). */ @@ -76,7 +76,8 @@ struct apa_state_t bool evs_compat_mode; Word16 *buf_out_fx; - Word16 Q_buf_out; + Word16 Q_buf_out; /* stores the scaling of buf_out_fx */ + Word16 Q_a_out_init_old; /* stores initially determined max. scaling of data in buf_out_fx, before beeing adjusted to previous frame scaling */ UWord16 buf_out_capacity; UWord16 l_buf_out; @@ -126,7 +127,7 @@ struct apa_state_t UWord16 qualityred; /* quality reduction threshold */ UWord16 qualityrise; /* quality rising for adaptive quality thresholds */ - UWord16 last_pitch; /* last pitch/sync position */ + Word16 last_pitch; /* last pitch/sync position */ UWord16 bad_frame_count; /* # frames before quality threshold is lowered */ UWord16 good_frame_count; /* # scaled frames */ @@ -190,6 +191,8 @@ ivas_error apa_init( } memset( ps->buf_out_fx, 0, ( sizeof( Word16 ) * ps->buf_out_capacity ) ); ps->Q_buf_out = Q15; + ps->Q_a_out_init_old = Q15; + move16(); move16(); ps->evs_compat_mode = false; @@ -270,10 +273,10 @@ UWord8 apa_reconfigure( free( ps->buf_out_fx ); ps->buf_out_fx = (Word16 *) malloc( sizeof( Word16 ) * ps->buf_out_capacity ); -#ifdef MSAN_FIX memset( ps->buf_out_fx, 0, ( sizeof( Word16 ) * ps->buf_out_capacity ) ); -#endif ps->Q_buf_out = Q15; + ps->Q_a_out_init_old = Q15; + move16(); move16(); IF( !ps->buf_out_fx ) { @@ -679,15 +682,15 @@ bool apa_exit( */ UWord8 apa_exec_fx( apa_state_t *ps, /* i/o: state struct */ - const Word16 a_in[], /* i : input samples Q0 */ + const Word16 a_in[], /* i : input samples Q0 */ UWord16 l_in, /* i : number of input samples */ UWord16 maxScaling, /* i : allowed number of inserted/removed samples */ - Word16 a_out[], /* o : output samples Q0*/ + Word16 a_out[], /* o : output samples Q0*/ UWord16 *l_out /* o : number of output samples */ ) { UWord16 i; - Word16 frm_in[APA_BUF]; /* TODO(mcjbm): this buffer could be smaller - always allocates space for 16 channels */ + Word16 frm_in[CPE_CHANNELS * APA_BUF / APA_MAX_NUM_CHANNELS]; /* in EVS, 2 output channels */ /* NOTE: this buffer could be smaller if alocated dynamically based on the actual sampling rate and number of channels */ UWord16 l_frm_out; Word16 l_rem; Word32 dl_scaled, dl_copied, l_frm_out_target; @@ -879,28 +882,42 @@ UWord8 apa_exec_fx( move32(); } +#ifdef DEBUG_APA_SILENCE_NON_SCALED + IF( l_in == *l_out ) + { + set_s( a_out, 0, *l_out ); + } + ELSE + { + set_s( a_out, INT16_MAX, *l_out ); + } +#endif + return 0; } UWord8 apa_exec_ivas_fx( apa_state_t *ps, /* i/o: state struct */ - const Word32 a_in[], /* i : input samples Q(-1) */ + const Word32 a_in[], /* i : input samples Q(-1) */ UWord16 l_in, /* i : number of input samples */ UWord16 maxScaling, /* i : allowed number of inserted/removed samples */ - Word32 a_out[], /* o : output samples Q(-1) */ + Word32 a_out[], /* o : output samples Q(-1) */ UWord16 *l_out /* o : number of output samples */ ) { UWord16 i; - Word16 frm_in[APA_BUF]; /* TODO(mcjbm): this buffer could be smaller - always allocates space for 16 channels */ + Word16 frm_in[APA_BUF]; /* NOTE: this buffer could be smaller if alocated dynamically based on the actual sampling rate and number of channels */ UWord16 l_frm_out; Word16 l_rem; Word32 dl_scaled, dl_copied, l_frm_out_target; Word32 expScaling, actScaling; UWord32 statsResetThreshold, statsResetShift; Word16 Q_a_out; + Word16 Q_a_out_init_old; - Q_a_out = add( getScaleFactor32_copy( a_in, L_mult0( ps->num_channels, APA_BUF_PER_CHANNEL ) ), Q11 - Q16 - Q1 ); + Q_a_out = add( getScaleFactor32_copy( a_in, l_in ), Q11 - Q16 - Q1 ); + Q_a_out_init_old = Q_a_out; /* store the possible scaling of a_in, to be re-used in the next frame */ + move16(); statsResetThreshold = 1637; move32(); statsResetShift = 2; @@ -966,70 +983,82 @@ UWord8 apa_exec_ivas_fx( { Word16 a_tmp[APA_BUF]; Word16 *buf_out_ptr = &( ps->buf_out_fx[ps->l_buf_out - ps->l_frm] ); - Word16 *frm_in_ptr = &( frm_in[ps->l_frm] ); - Q_a_out = s_min( Q_a_out, ps->Q_buf_out ); - FOR( i = 0; i < ps->num_channels * APA_BUF_PER_CHANNEL; i++ ) - { - a_tmp[i] = extract_h( L_shl( a_in[i], add( Q_a_out, Q5 ) ) ); // Q_a_out - move16(); - } + /* + don't compare against actual scaling in ps->Q_buf_out, but possible scaling in ps->Q_a_out_init_old; otherwise we are constantly reducing the scaling over time, leading to precision issues + alternative approach: determine scaling of ps->buf_out_fx, but this is costly due to the sheer amount of samples stored there... + */ + Q_a_out = s_min( Q_a_out, ps->Q_a_out_init_old ); Scale_sig( ps->buf_out_fx, ps->buf_out_capacity, sub( Q_a_out, ps->Q_buf_out ) ); // Q_buf_out -> Q_a_out - - /* fill input frame */ - /* 1st input frame: previous output samples */ - FOR( i = 0; i < ps->l_frm; i++ ) - { - frm_in[i] = buf_out_ptr[i]; - move16(); - } - /* 2nd input frame: new input samples */ - FOR( i = 0; i < ps->l_frm; i++ ) - { - frm_in_ptr[i] = a_tmp[i]; - move16(); - } - /* no scaling */ IF( EQ_32( ps->scale, 100 ) ) { - copy_frm_fx( ps, frm_in, a_tmp, &l_frm_out ); - } - /* shrink */ - ELSE IF( LT_32( ps->scale, 100 ) ) - { - shrink_frm_ivas_fx( ps, frm_in, maxScaling, a_tmp, Q_a_out, &l_frm_out ); + FOR( i = 0; i < ps->l_frm; i++ ) + { + a_out[i] = a_in[i]; // Q11 + move32(); + } + l_frm_out = ps->l_frm; + move16(); } - /* extend */ ELSE { - extend_frm_ivas_fx( ps, frm_in, a_tmp, Q_a_out, &l_frm_out ); - } - /* control the amount/frequency of scaling */ - IF( NE_32( l_frm_out, ps->l_frm ) ) - { - test(); - IF( ( maxScaling != 0 ) && - GT_32( abs_s( extract_l( L_sub( ps->l_frm, l_frm_out ) ) ), maxScaling ) ) + Word16 *frm_in_ptr = &( frm_in[ps->l_frm] ); + + FOR( i = 0; i < ps->l_frm; i++ ) { - /* maxScaling exceeded -> discard scaled frame */ - copy_frm_fx( ps, frm_in, a_tmp, &l_frm_out ); + a_tmp[i] = extract_h( L_shl( a_in[i], add( Q_a_out, Q5 ) ) ); // Q_a_out + move16(); } - ELSE IF( GT_32( L_abs( l_frm_out_target ), ps->l_frm ) ) /* ignore small difference */ + /* fill input frame */ + /* 1st input frame: previous output samples */ + FOR( i = 0; i < ps->l_frm; i++ ) { - dl_copied = L_sub( l_frm_out_target, ps->l_frm ); - dl_scaled = L_sub( l_frm_out_target, l_frm_out ); - /* discard scaled frame if copied frame is closer to target length */ - IF( LT_32( L_abs( dl_copied ), L_abs( dl_scaled ) ) ) + frm_in[i] = buf_out_ptr[i]; + move16(); + } + /* 2nd input frame: new input samples */ + FOR( i = 0; i < ps->l_frm; i++ ) + { + frm_in_ptr[i] = a_tmp[i]; + move16(); + } + /* shrink */ + IF( LT_32( ps->scale, 100 ) ) + { + shrink_frm_ivas_fx( ps, frm_in, maxScaling, a_tmp, Q_a_out, &l_frm_out ); + } + /* extend */ + ELSE + { + extend_frm_ivas_fx( ps, frm_in, a_tmp, Q_a_out, &l_frm_out ); + } + /* control the amount/frequency of scaling */ + IF( NE_32( l_frm_out, ps->l_frm ) ) + { + test(); + IF( ( maxScaling != 0 ) && + GT_32( abs_s( extract_l( L_sub( ps->l_frm, l_frm_out ) ) ), maxScaling ) ) { + /* maxScaling exceeded -> discard scaled frame */ copy_frm_fx( ps, frm_in, a_tmp, &l_frm_out ); } + ELSE IF( GT_32( L_abs( l_frm_out_target ), ps->l_frm ) ) /* ignore small difference */ + { + dl_copied = L_sub( l_frm_out_target, ps->l_frm ); + dl_scaled = L_sub( l_frm_out_target, l_frm_out ); + /* discard scaled frame if copied frame is closer to target length */ + IF( LT_32( L_abs( dl_copied ), L_abs( dl_scaled ) ) ) + { + copy_frm_fx( ps, frm_in, a_tmp, &l_frm_out ); + } + } } - } - FOR( i = 0; i < ps->num_channels * APA_BUF_PER_CHANNEL; i++ ) - { - a_out[i] = L_shl( a_tmp[i], sub( Q11, Q_a_out ) ); // Q0 -> Q11 - move32(); + FOR( i = 0; i < l_frm_out; i++ ) + { + a_out[i] = L_shl( a_tmp[i], sub( Q11, Q_a_out ) ); // Q0 -> Q11 + move32(); + } } } @@ -1073,6 +1102,8 @@ UWord8 apa_exec_ivas_fx( } ps->l_buf_out = (UWord16) L_add( ps->l_buf_out, l_frm_out ); move16(); + ps->Q_a_out_init_old = Q_a_out_init_old; + move16(); *l_out = l_frm_out; move16(); @@ -1080,6 +1111,7 @@ UWord8 apa_exec_ivas_fx( ps->l_in_total = UL_addNsD( ps->l_in_total, ps->l_frm ); move32(); + test(); IF( LT_32( L_abs( ps->diffSinceSetScale ), L_sub( 0x7FFFFF, L_sub( l_frm_out, ps->l_frm ) ) ) && LT_64( ps->nFramesSinceSetScale, statsResetThreshold ) ) @@ -1336,7 +1368,7 @@ static Word8 logarithmic_search_fx( const apa_state_t *ps, DO { - coeff_max = 0x80000000; /* will always be overwritten with result of first correlation */ + coeff_max = INT32_MIN; /* will always be overwritten with result of first correlation */ move32(); FOR( i = s_start; i < s_start + inlen; i += css * ps->num_channels ) @@ -1534,7 +1566,6 @@ static bool copy_frm_fx( return 0; } - /* ******************************************************************************** * diff --git a/lib_dec/jbm_pcmdsp_fifo.h b/lib_dec/jbm_pcmdsp_fifo.h index 1375c5713eba5c5cb67d29f43bfb546d59bc3527..80a3ddb900a73fdf8c6ee86a3e27e99c5094e892 100644 --- a/lib_dec/jbm_pcmdsp_fifo.h +++ b/lib_dec/jbm_pcmdsp_fifo.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /*! @file jbm_pcmdsp_fifo.h Ringbuffer (FIFO) with fixed capacity for audio samples. */ diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.h b/lib_dec/jbm_pcmdsp_similarityestimation.h index 086f881814e1583db970c97716bb09955f988e32..5b3b6ac61335005145ad9b6ca64505c4467f00a0 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation.h +++ b/lib_dec/jbm_pcmdsp_similarityestimation.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /*! @file jbm_pcmdsp_similarityestimation.h Algorithms for correlation and similarity estimation. */ diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c similarity index 97% rename from lib_dec/jbm_pcmdsp_similarityestimation.c rename to lib_dec/jbm_pcmdsp_similarityestimation_fx.c index cc13c0148d23a45b7a154bb93fc2ce91fa1ccc10..ee800fcc0940aeec74a845a556fc6263255bbb2d 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /*! @file jbm_pcmdsp_similarityestimation.c Algorithms for correlation and similarity estimation. */ @@ -113,9 +113,9 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, sumXX = L_shl( sumXX, normX ); normY = norm_l( sumYY ); sumYY = L_shl( sumYY, normY ); - product = L_mult0( extract_h( sumXX ), extract_h( sumYY ) ); + product = L_shr( L_mult0( extract_h( sumXX ), extract_h( sumYY ) ), 1 ); normXY = add( normX, normY ); - normXY = sub( normXY, 32 ); + normXY = sub( normXY, 32 + 1 ); /* change norm to factor of 2 */ IF( s_and( normXY, 0x1 ) != 0 ) @@ -128,7 +128,6 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, IF( sqrtXY != 0 ) { - Flag Overflow = 0; move32(); normCC = 0; move16(); @@ -136,7 +135,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, normCC = add( normCC, 16 ); /* scale to Q15 with saturation */ BASOP_SATURATE_WARNING_OFF - cc = shl_ro( cc, add( normXY, normCC ), &Overflow ); + cc = shr_r_sat( cc, negate( add( normXY, normCC ) ) ); BASOP_SATURATE_WARNING_ON *energy = L_shr_r( L_deposit_l( sqrtXY ), normXY ); } diff --git a/lib_dec/jbm_pcmdsp_window.h b/lib_dec/jbm_pcmdsp_window.h index 1d193433e7b90f55d7a22902932a7bdaf19f17c2..2d0d0be0b193cb12ff62adbd2aa275053f4d602d 100644 --- a/lib_dec/jbm_pcmdsp_window.h +++ b/lib_dec/jbm_pcmdsp_window.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ /*! @file jbm_jbm_pcmdsp_window.h Window functions. */ diff --git a/lib_dec/jbm_pcmdsp_window.c b/lib_dec/jbm_pcmdsp_window_fx.c similarity index 98% rename from lib_dec/jbm_pcmdsp_window.c rename to lib_dec/jbm_pcmdsp_window_fx.c index eba40ec988241af9b0b4385df9b56e935053ab17..3afeaf10661a044e5405fefe1bf87a41f3cd21ce 100644 --- a/lib_dec/jbm_pcmdsp_window.c +++ b/lib_dec/jbm_pcmdsp_window_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_dec/lead_deindexing_fx.c b/lib_dec/lead_deindexing_fx.c index 786e0c276956fcb209bed3bc2c814b69c2b6f828..3773990a1f55df3b3d9e1dd0201615ebb13fd001 100644 --- a/lib_dec/lead_deindexing_fx.c +++ b/lib_dec/lead_deindexing_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -192,7 +192,6 @@ void re8_decode_base_index_fx( m1 = sub( k1, 1 ); m2 = 8; move16(); -#ifdef CR_2109_to_2112_cd0_ce0 l = 1; move16(); FOR( i = 0; i < 8; i++ ) @@ -206,9 +205,6 @@ void re8_decode_base_index_fx( test(); /* if the signs are constrained and all components are non-zero */ IF( EQ_16( k1, 7 ) && ( l > 0 ) ) -#else - IF( k1 == 7 ) -#endif { m2 = 7; move16(); diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 0c4d54db8bcde6d8889b50d9a1b2966209740fb4..bd0e430187c08fea79a167f718787a7d622b70dd 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -36,6 +36,8 @@ #include "common_api_types.h" #include #include "typedef.h" +#include "ivas_rtp_pi_data.h" + /*---------------------------------------------------------------------* * Decoder enums @@ -64,6 +66,12 @@ typedef enum _IVAS_DEC_COMPLEXITY_LEVEL IVAS_DEC_COMPLEXITY_LEVEL_THREE = 3 } IVAS_DEC_COMPLEXITY_LEVEL; +typedef enum _IVAS_DEC_PCM_TYPE +{ + IVAS_DEC_PCM_INT16, + IVAS_DEC_PCM_FLOAT, + IVAS_DEC_PCM_INVALID +} IVAS_DEC_PCM_TYPE; /* bitstream formats that can be consumed */ typedef enum _IVAS_DEC_BS_FORMAT @@ -80,6 +88,7 @@ typedef enum _IVAS_DEC_BS_FORMAT } IVAS_DEC_BS_FORMAT; typedef struct IVAS_DEC *IVAS_DEC_HANDLE; +typedef struct pidata_ts_struct *hPiDataTs; #ifdef SUPPORT_JBM_TRACEFILE /* Callback function for JBM tracefile writing */ @@ -96,32 +105,33 @@ typedef ivas_error ( *JbmTraceFileWriterFn )( const void *data, void *writer ); /*! r: error code */ ivas_error IVAS_DEC_Open( - IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */ - IVAS_DEC_MODE mode /* i : compatibility mode (EVS or IVAS) */ + IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */ + IVAS_DEC_MODE mode /* i : compatibility mode (EVS or IVAS) */ ); /*! r: error code */ ivas_error IVAS_DEC_Configure( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const UWord32 sampleRate, /* i : output sampling frequency */ - const IVAS_AUDIO_CONFIG outputConfig, /* i : audio configuration */ - const Word16 tsmEnabled, /* i : enable TSM */ - const IVAS_RENDER_FRAMESIZE renderFramesize, /* i : rendering frame size */ - const Word16 customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ - const Word16 hrtfReaderEnabled, /* i : enable HRTF binary file input */ - const Word16 enableHeadRotation, /* i : enable head rotation for binaural output */ - const Word16 enableExternalOrientation, /* i : enable external orientations */ - const IVAS_HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ - const Word16 renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ - const Word16 Opt_non_diegetic_pan, /* i : diegetic or not */ - const Word16 non_diegetic_pan_gain_fx, /* i : non diegetic panning gain Q15 */ - const Word16 Opt_dpid_on, /* i : enable directivity pattern option */ - const UWord16 acousticEnvironmentId, /* i : Acoustic environment ID */ - const Word16 delayCompensationEnabled /* i : enable delay compensation */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const UWord32 sampleRate, /* i : output sampling frequency */ + const IVAS_AUDIO_CONFIG outputConfig, /* i : output configuration */ + const IVAS_RENDER_FRAMESIZE renderFramesize, /* i : rendering frame size */ + const bool customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ + const bool hrtfReaderEnabled, /* i : enable HRTF binary file input */ + const bool enableHeadRotation, /* i : enable head rotation for binaural output */ + const bool enableExternalOrientation, /* i : enable external orientations */ + const IVAS_HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ + const bool renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ + const IVAS_ROOM_SIZE_T roomSize, /* i : room size selector for reverb */ + const bool non_diegetic_pan_enabled, /* i : enabled diegetic panning */ + const Word16 non_diegetic_pan_gain_fx, /* i : non diegetic panning gain */ + const bool dpidEnabled, /* i : enable directivity pattern option */ + const UWord16 acousticEnvironmentId, /* i : Acoustic environment ID */ + const bool objEditEnabled, /* i : enable object editing */ + const bool delayCompensationEnabled /* i : enable delay compensation */ ); void IVAS_DEC_Close( - IVAS_DEC_HANDLE *phIvasDec /* i/o: pointer to IVAS decoder handle */ + IVAS_DEC_HANDLE *phIvasDec /* i/o: pointer to IVAS decoder handle */ ); @@ -129,148 +139,248 @@ void IVAS_DEC_Close( /*! r: error code */ ivas_error IVAS_DEC_FeedFrame_Serial( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - UWord16 *serial, /* i : buffer containing serial input bitstream. Each bit should be stored as a single UWord16 value */ - const UWord16 num_bits, /* i : number of bits in input bitstream */ - Word16 bfi /* i : bad frame indicator flag */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + UWord16 *serial, /* i : buffer containing serial input bitstream. Each bit should be stored as a single UWord16 value */ + const UWord16 num_bits, /* i : number of bits in input bitstream */ + Word16 bfi /* i : bad frame indicator flag */ +); + +ivas_error IVAS_DEC_ReadFormat( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_BIN_RENDERER_TYPE *binaural_renderer, /* o : binaural renderer type */ + IVAS_BIN_RENDERER_TYPE *binaural_renderer_sec, /* o : secondary binaural renderer type */ + IVAS_AUDIO_CONFIG *hrtf_set_audio_cfg /* o : HRTF set audio config. */ +); + +ivas_error IVAS_DEC_GetSamplesDecoder( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ ); /*! r: decoder error code */ -ivas_error IVAS_DEC_GetSamples( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const Word16 nSamplesAsked, /* i : number of samples wanted by the caller */ - Word16 *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels Q0 */ - Word16 *nOutSamples, /* o : number of samples per channel written to output buffer */ - bool *needNewFrame /* o : indication that the decoder needs a new frame */ +ivas_error IVAS_DEC_GetSamplesRenderer( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const Word16 nSamplesAsked, /* i : number of samples wanted by the caller */ + Word16 *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels Q0 */ + Word16 *nOutSamples, /* o : number of samples per channel written to output buffer */ + bool *needNewFrame /* o : indication that the decoder needs a new frame */ +); + +ivas_error IVAS_DEC_GetEditableParameters( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_EDITABLE_PARAMETERS *hIvasEditableParameters /* o : object editing parameters handle */ +); + +ivas_error IVAS_DEC_SetEditableParameters( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_EDITABLE_PARAMETERS hIvasEditableParameters /* i : object editing parameters handle */ ); +ivas_error IVAS_DEC_PrepareRenderer( + IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ +); + +ivas_error IVAS_DEC_GetSplitBinauralBitstream( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *pcmBuf_out, /* o : output synthesis signal for BINAURAL_SPLIT_PCM */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ + Word16 *nOutSamples, /* o : number of samples per channel written to output buffer */ + bool *needNewFrame /* o : indication that the decoder needs a new frame */ +); + +/*! r: decoder error code */ +ivas_error IVAS_DEC_GetSplitRendBitstreamHeader( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + ISAR_SPLIT_REND_CODEC *pCodec, /* o : pointer to codec setting */ + ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, /* o : pointer to pose correction mode */ + Word16 *pIsar_frame_size_ms, /* o : pointer to ISAR frame size setting */ + Word16 *pCodec_frame_size_ms, /* o : pointer to codec frame size setting */ + Word16 *pLc3plusHighRes /* o : pointer to LC3plus High-Res setting */ +); + +/*! r: decoder error code */ +ivas_error IVAS_DEC_GetCldfbSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word32 *out_real, /* o : buffer for decoded PCM real output in CLDFB domain */ + Word32 *out_imag, /* o : buffer for decoded PCM imag output in CLDFB domain */ + IVAS_AUDIO_CONFIG *audio_config, /* o : audio configuration */ + Word16 *nOutSamples /* o : number of samples per channel written to output buffer */ +); + +/*! r: decoder error code */ +ivas_error IVAS_DEC_is_split_rendering_enabled( + IVAS_DEC_HANDLE hIvasDec, /* i : IVAS decoder handle */ + Word16 *isSplitRend /* o : flag to indicate if split rendering is enabled */ +); + +/*! r: decoder error code */ +ivas_error IVAS_DEC_is_split_rendering_coded_out( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *isSplitCoded /* o : flag to indicate if split rendering is enabled */ +); /*! r: error code */ ivas_error IVAS_DEC_GetObjectMetadata( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_ISM_METADATA *metadata, /* o : struct where metadata decoded in most recently decoded frame will be written */ - const UWord16 zero_flag, /* i : if this flag is enabled, this function outputs a zero-initialized metadata struct */ - const UWord16 objectIdx /* i : index of the queried object */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_ISM_METADATA *metadata, /* o : struct where metadata decoded in most recently decoded frame will be written */ + const UWord16 zero_flag, /* i : if this flag is enabled, this function outputs a zero-initialized metadata struct */ + const UWord16 objectIdx /* i : index of the queried object */ ); /*! r: error code */ ivas_error IVAS_DEC_GetMasaMetadata( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to metadata from the most recently decoded frame */ - const UWord8 getFromJbmBuffer /* i : get metadata from a JBM buffer */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to metadata from the most recently decoded frame */ + const UWord8 getFromJbmBuffer /* i : get metadata from a JBM buffer */ ); /*! r: error code */ ivas_error IVAS_DEC_FeedHeadTrackData( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_QUATERNION orientation, /* i : head-tracking data, listener orientation */ - IVAS_VECTOR3 Pos, /* i : listener position */ - const Word16 subframe_idx /* i : subframe index */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION orientation, /* i : head-tracking data, listener orientation */ + IVAS_VECTOR3 Pos, /* i : listener position */ + const Word16 subframe_idx, /* i : subframe index */ + const ISAR_SPLIT_REND_ROT_AXIS rot_axis /* i : external control for rotation axis for split rendering */ ); /*! r: error code */ ivas_error IVAS_DEC_FeedRefRotData( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_QUATERNION rotation /* i : reference rotation data */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION rotation /* i : reference rotation data */ ); /*! r: error code */ ivas_error IVAS_DEC_FeedRefVectorData( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_VECTOR3 listenerPos, /* i : Listener position */ - IVAS_VECTOR3 refPos /* i : Reference position */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_VECTOR3 listenerPos, /* i : Listener position */ + IVAS_VECTOR3 refPos /* i : Reference position */ ); /*! r: error code */ ivas_error IVAS_DEC_FeedExternalOrientationData( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_QUATERNION orientation, /* i : external orientation data */ - Word8 enableHeadRotation, /* i : flag to enable head rotation for this frame */ - Word8 enableExternalOrientation, /* i : flag to enable external orientation for this frame */ - Word8 enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ - Word16 numFramesToTargetOrientation, /* i : number of frames until target orientation is reached */ - const Word16 subframe_idx /* i : subframe index */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION orientation, /* i : external orientation data */ + Word8 enableHeadRotation, /* i : flag to enable head rotation for this frame */ + Word8 enableExternalOrientation, /* i : flag to enable external orientation for this frame */ + Word8 enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ + Word16 numFramesToTargetOrientation, /* i : number of frames until target orientation is reached */ + const Word16 subframe_idx /* i : subframe index */ ); /*! r: error code */ ivas_error IVAS_DEC_VoIP_FeedFrame( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - UWord8 *au, /* i : buffer containing input access unit */ - const UWord16 auSize, /* i : size of the access unit */ - const UWord16 rtpSequenceNumber, /* i : RTP sequence number (16 bits) */ - const UWord32 rtpTimeStamp, /* i : RTP timestamp (32 bits) */ - const UWord32 rcvTime_ms, /* i : receive time of the RTP packet in milliseconds */ - const bool qBit /* i : Q bit for AMR-WB IO */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + UWord8 *au, /* i : buffer containing input access unit */ + const UWord16 auSize, /* i : size of the access unit */ + const UWord16 rtpSequenceNumber, /* i : RTP sequence number (16 bits) */ + const UWord32 rtpTimeStamp, /* i : RTP timestamp (32 bits) */ + const UWord32 rcvTime_ms, /* i : receive time of the RTP packet in milliseconds */ + const bool qBit /* i : Q bit for AMR-WB IO */ ); ivas_error IVAS_DEC_VoIP_SetScale( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const Word16 maxScaling, /* i : maximum allowed TSM scale */ - const Word16 scale /* i : TSM scale to set */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const Word16 maxScaling, /* i : maximum allowed TSM scale */ + const Word16 scale /* i : TSM scale to set */ +); + +#ifdef VARIABLE_SPEED_DECODING +ivas_error IVAS_DEC_EnableTsm( + IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ ); ivas_error IVAS_DEC_TSM_SetQuality( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const Word16 quality /* i : target TSM quality Q14 */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const Word16 quality /* i : target TSM quality Q14 */ ); +#endif /*! r: error code */ ivas_error IVAS_DEC_VoIP_GetSamples( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - UWord16 nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ - Word16 *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels Q0 */ - const UWord32 systemTimestamp_ms /* i : current system timestamp */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + UWord16 nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + Word16 *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels Q0 */ #ifdef SUPPORT_JBM_TRACEFILE - , JbmTraceFileWriterFn jbmWriterFn, - void* jbmWriter + JbmTraceFileWriterFn jbmWriterFn, + void* jbmWriter, #endif + bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ + UWord16 *nSamplesRendered, /* o : number of samples rendered */ + bool *parametersAvailableForEditing, /* o : indicates whether objects editing is available */ + const UWord32 systemTimestamp_ms /* i : current system timestamp */ +); + +/*! r: error code */ +ivas_error IVAS_DEC_VoIP_GetSplitBinauralBitstream( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + /* const IVAS_DEC_PCM_TYPE pcmType, */ /* i : type for the decoded PCM resolution */ + Word16 *pcmBuf, /* o : output synthesis signal */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ +#ifdef SUPPORT_JBM_TRACEFILE + JbmTraceFileWriterFn jbmWriterFn, + void* jbmWriter, +#endif + bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ + UWord16 *nSamplesRendered, /* o : number of samples rendered */ + bool *parametersAvailableForEditing, /* o : indicates whether objects editing is available */ + const UWord32 systemTimestamp_ms /* i : current system timestamp */ ); ivas_error IVAS_DEC_Flush( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const Word16 nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ - Word16 *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels Q0 */ - Word16 *nSamplesFlushed /* o : number of samples flushed */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const Word16 nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + Word16 *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels Q0 */ + Word16 *nSamplesFlushed /* o : number of samples flushed */ ); +ivas_error IVAS_DEC_isRestartNeeded( + IVAS_DEC_HANDLE hIvasDec, /* i : IVAS decoder handle */ + bool *restartNeeded /* o : flag to signal decoder restart */ +); + + /* Setter functions - apply changes to decoder configuration */ /*! r: error code */ ivas_error IVAS_DEC_EnableVoIP( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const Word16 jbmSafetyMargin, /* i : allowed delay reserve for JBM, in milliseconds */ - const IVAS_DEC_INPUT_FORMAT inputFormat /* i : format of the input bitstream */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const Word16 jbmSafetyMargin, /* i : allowed delay reserve for JBM, in milliseconds */ + const IVAS_DEC_INPUT_FORMAT inputFormat /* i : format of the input bitstream */ ); +/*! r: error code */ +ivas_error IVAS_DEC_EnableSplitRendering( + IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ +); ivas_error IVAS_DEC_SetRenderFramesize( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const IVAS_RENDER_FRAMESIZE render_framesize /* i : render framesize */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_FRAMESIZE render_framesize /* i : render framesize */ ); ivas_error IVAS_DEC_GetRenderFramesize( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_RENDER_FRAMESIZE *render_framesize /* o : render framesize */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_RENDER_FRAMESIZE *render_framesize /* o : render framesize */ ); ivas_error IVAS_DEC_GetRenderFramesizeSamples( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word16 *render_framesize /* o : render framesize in samples Q0 */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *render_framesize /* o : render framesize in samples Q0 */ ); ivas_error IVAS_DEC_GetReferencesUpdateFrequency( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word16 *update_frequency /* o : update frequency Q0 */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *update_frequency /* o : update frequency Q0 */ ); ivas_error IVAS_DEC_GetNumOrientationSubframes( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word16 *num_subframes /* o : render framesize */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *num_subframes /* o : render framesize */ ); ivas_error IVAS_DEC_GetRenderFramesizeMs( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - UWord32 *render_framesize /* o : render framesize in samples Q0 */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + UWord32 *render_framesize /* o : render framesize in samples Q0 */ ); @@ -278,128 +388,153 @@ ivas_error IVAS_DEC_GetRenderFramesizeMs( /*! r: error code */ ivas_error IVAS_DEC_GetNumObjects( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - UWord16 *numObjects /* o : number of objects for which the decoder has been configured */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + UWord16 *numObjects /* o : number of objects for which the decoder has been configured */ ); /*! r: error code */ ivas_error IVAS_DEC_GetFormat( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_BS_FORMAT *format /* o : format detected from bitstream fed to the decoder */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_BS_FORMAT *format /* o : format detected from bitstream fed to the decoder */ ); /*! r: error code */ ivas_error IVAS_DEC_GetOutputBufferSize( - const IVAS_DEC_HANDLE hIvasDec, /* i : IVAS decoder handle */ - Word16 *outputBufferSize /* o : total number of samples expected in the output buffer for current decoder configuration */ + const IVAS_DEC_HANDLE hIvasDec, /* i : IVAS decoder handle */ + Word16 *outputBufferSize /* o : total number of samples expected in the output buffer for current decoder configuration*/ ); /*! r: error code */ ivas_error IVAS_DEC_GetNumOutputChannels( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word16 *numOutputChannels /* o : number of PCM output channels */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *numOutputChannels /* o : number of PCM output channels */ ); /*! r: error code */ ivas_error IVAS_DEC_FeedCustomLsData( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const IVAS_CUSTOM_LS_DATA hLsCustomData /* i : Custom loudspeaker setup data */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_CUSTOM_LS_DATA hLsCustomData /* i : Custom loudspeaker setup data */ ); /*! r: error code */ -ivas_error IVAS_DEC_GetHrtfHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_HANDLE *hHrtfTD /* o : HRTF handle */ +ivas_error IVAS_DEC_GetHrtfTDrendHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_TD_HANDLE **hHrtfTD /* o : TD rend. HRTF handle */ ); /*! r: error code */ ivas_error IVAS_DEC_GetHrtfCRendHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* o : Set of HRTF handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_CREND_HANDLE **hHrtfCrend /* o : Crend HRTF handle */ ); ivas_error IVAS_DEC_GetHrtfFastConvHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* o : FASTCONV HRTF handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_FASTCONV_HANDLE **hHrtfFastConv /* o : FASTCONV HRTF handle */ ); ivas_error IVAS_DEC_GetHrtfParamBinHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* o : Parametric binauralizer HRTF handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ +); + +ivas_error IVAS_DEC_GetHrtfStatisticsHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_STATISTICS_HANDLE **hHrtfStatistics /* o : HRTF statistics handle */ ); +ivas_error IVAS_DEC_HRTF_binary_open( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_BIN_RENDERER_TYPE binaural_renderer /* i : binaural renderer type */ +); + +ivas_error IVAS_DEC_HRTF_binary_close( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_BIN_RENDERER_TYPE binaural_renderer_old /* i : previous binaural renderer type */ +); + +ivas_error IVAS_DEC_AddAcousticEnvironment( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_ROOM_ACOUSTICS_CONFIG_DATA roomAcousticsConfig /* i: Room acoustic configuration */ +); + +ivas_error IVAS_DEC_GetAcousticEnvironment( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + UWord16 aeID, /* i : Acoustic environment ID */ + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pAcEnv /* o : Room acoustic environment data pointer */ +); /*! r: error code*/ ivas_error IVAS_DEC_GetRenderConfig( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render config handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render config handle */ ); /*! r: error code*/ ivas_error IVAS_DEC_GetDefaultRenderConfig( - IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render config handle */ + IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render config handle */ ); /*! r: error code*/ ivas_error IVAS_DEC_FeedRenderConfig( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const IVAS_RENDER_CONFIG_DATA hRenderConfig /* i : Render config data structure */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_DATA hRenderConfig /* i : Render config data structure */ ); /*! r: error code */ ivas_error IVAS_DEC_GetDelay( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word16 *nSamples, /* o : decoder delay in samples */ - Word32 *timeScale /* o : time scale of the delay, equal to decoder output sampling rate */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *nSamples, /* o : decoder delay in samples */ + Word32 *timeScale /* o : time scale of the delay, equal to decoder output sampling rate */ ); /*! r: error code */ ivas_error IVAS_DEC_HasDecodedFirstGoodFrame( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - bool *hasDecodedFirstGoodFrame /* o : flag indicating if the decoder has decoded a good frame since it was configured */ -); - -/*! r: error code */ -ivas_error IVAS_DEC_GetPcmFrameSize( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word32 *pcmFrameSize /* o : total size of the PCM output frame. This takes into account the number of output channels Q0 */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + bool *hasDecodedFirstGoodFrame /* o : flag indicating if the decoder has decoded a good frame since it was configured */ ); /*! r: true if decoder has no data in VoIP jitter buffer */ -bool IVAS_DEC_VoIP_IsEmpty( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const Word16 nSamplesAsked +ivas_error IVAS_DEC_VoIP_IsEmpty( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const Word16 nSamplesAsked, /* i : number of output samples asked */ + bool *isEmpty /* o : isEmpty flag */ ); ivas_error IVAS_DEC_VoIP_Get_CA_offset( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word16 *optimum_offset, //Q0 - Word16 *FEC_hi //Q0 + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *optimum_offset, //Q0 + Word16 *FEC_hi //Q0 ); #ifdef SUPPORT_JBM_TRACEFILE ivas_error IVAS_DEC_GetJbmData( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_JBM_TRACE_DATA *JbmTraceData /* o : JBM Trace data */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_JBM_TRACE_DATA *JbmTraceData /* o : JBM Trace data */ ); #endif +ivas_error IVAS_DEC_FeedPiDataToDecoder( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + hPiDataTs piData, /* i : PI data received in rtp packet */ + UWord32 numPiData /* i : number of PI data received in rtp packet */ +); + /* Utility functions */ /*! r: pointer to an error message string */ const char *IVAS_DEC_GetErrorMessage( - ivas_error error /* i : decoder error code enum */ + ivas_error error /* i : decoder error code enum */ ); -void IVAS_DEC_PrintConfig( - const IVAS_DEC_HANDLE hIvasDec, /* i : IVAS decoder handle */ - const bool quietModeEnabled, /* i : quiet mode flag: if true, reduces the amount of config info printed */ - const bool voipMode +ivas_error IVAS_DEC_PrintConfig( + const IVAS_DEC_HANDLE hIvasDec, /* i : IVAS decoder handle */ + const bool quietModeEnabled, /* i : quiet mode flag: if true, reduces the amount of config info printed */ + const bool voipMode ); - void IVAS_DEC_PrintDisclaimer( - void + void ); /* clang-format on */ diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 4135854479a9d968833714127c99c13762efa8f3..7954afd6905c9883c97087679645df5cd5e54354 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -1,4 +1,4 @@ -/****************************************************************************************************** +/****************************************************************************************************** (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., @@ -31,36 +31,36 @@ *******************************************************************************************************/ #include "lib_dec.h" -#include -#include -#include #include "ivas_cnst.h" #include "ivas_prot_rend_fx.h" #include "prot_fx.h" +#include "isar_prot.h" +#include "ivas_rom_com.h" +#include "lib_isar_pre_rend.h" #include "ivas_prot_fx.h" - #include "jbm_jb4sb.h" #include "jbm_pcmdsp_apa.h" #include "jbm_pcmdsp_fifo.h" +#include "ivas_rtp_pi_data.h" #include #include -#ifndef FIX_DISCLAIMER -#include +#ifdef DEBUGGING +#include "float_to_fix_ops.h" #endif #include "wmc_auto.h" -#define INV_1000_Q31 2147484 /*1/1000 IN Q31*/ /*---------------------------------------------------------------------* * Local structs *---------------------------------------------------------------------*/ + struct IVAS_DEC_VOIP { - UWord16 nSamplesFrame; /* Total number of samples in a frame (includes number of channels) */ JB4_HANDLE hJBM; UWord16 lastDecodedWasActive; JB4_DATAUNIT_HANDLE hCurrentDataUnit; /* Points to the currently processed data unit */ UWord16 *bs_conversion_buf; /* Buffer for bitstream conversion from packed to serial */ + Word16 nSamplesRendered20ms; /* how many samples have been rendered since the last 20ms render border*/ #ifdef SUPPORT_JBM_TRACEFILE IVAS_JBM_TRACE_DATA JbmTraceData; #endif @@ -79,42 +79,52 @@ struct IVAS_DEC bool isInitialized; Word16 bitstreamformat; /* Bitstream format flag (G.192/MIME/VOIP_G192_RTP/VOIP_RTPDUMP) */ - bool Opt_VOIP; /* flag indicating VOIP mode with JBM */ - Word16 tsm_scale; /* scale for TSM operation */ +#ifdef DEBUGGING + bool Opt_VOIP; /* flag indicating VOIP mode with JBM */ +#endif + Word16 tsm_scale; /* scale for TSM operation */ Word16 tsm_max_scaling; - Word32 *apaExecBuffer_fx; /* Buffer for APA scaling */ - Word16 tsm_quality; /*Q14*/ + Word16 timeScalingDone; /* have we done already one TSM in a 20ms frame? */ + Word16 tsm_quality; /*Q14*/ PCMDSP_APA_HANDLE hTimeScaler; bool needNewFrame; bool hasBeenFedFrame; bool updateOrientation; UWord16 nSamplesAvailableNext; - Word16 nSamplesRendered; Word16 nTransportChannelsOld; Word16 amrwb_rfc4867_flag; /* MIME from rfc4867 is used */ Word16 sdp_hf_only; /* RTP payload format parameter: only Header-Full format without zero padding for size collision avoidance */ Word16 prev_ft_speech; /* RXDTX handler: previous frametype flag for G.192 format AMRWB SID_FIRST detection */ Word16 CNG; /* RXDTX handler: CNG=1, nonCNG=0 */ + + UWord16 nSamplesFlushed; + Word16 *flushbuffer; + bool hasBeenPreparedRendering; }; + /*---------------------------------------------------------------------* * Local function declarations *---------------------------------------------------------------------*/ -static void IVAS_DEC_Close_VoIP( IVAS_DEC_VOIP *hVoIP ); +static void ivas_destroy_handle_VoIP_fx( IVAS_DEC_VOIP *hVoIP ); #ifdef SUPPORT_JBM_TRACEFILE static void store_JbmData( IVAS_DEC_VOIP *hVoIP, JB4_DATAUNIT_HANDLE dataUnit, const UWord32 systemTimestamp_ms, const UWord16 extBufferedSamples, const Word32 output_Fs ); #endif -static ivas_error evs_dec_main_fx( Decoder_Struct *st_ivas, const Word16 nOutSamples, Word32 *floatBuf, Word16 *pcmBuf ); +static ivas_error evs_dec_main_fx( Decoder_Struct *st_ivas ); static ivas_error input_format_API_to_internal( IVAS_DEC_INPUT_FORMAT input_format, Word16 *bitstream_format_internal, Word16 *sdp_hf_only, const bool is_voip_enabled ); static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig ); -static ivas_error IVAS_DEC_VoIP_reconfigure( IVAS_DEC_HANDLE hIvasDec, const UWord16 nTransportChannels, const UWord16 l_ts ); -static ivas_error IVAS_DEC_Setup( IVAS_DEC_HANDLE hIvasDec, UWord16 *nTcBufferGranularity, UWord8 *nTransportChannels, UWord8 *nOutChannels, UWord16 *nSamplesRendered, Word16 *data ); -static ivas_error IVAS_DEC_GetTcSamples( IVAS_DEC_HANDLE hIvasDec, Word32 *pcmBuf_fx, Word16 *nOutSamples ); -static ivas_error IVAS_DEC_RendererFeedTcSamples( IVAS_DEC_HANDLE hIvasDec, const Word16 nSamplesForRendering, Word16 *nSamplesResidual, Word32 *pcmBuf ); -static ivas_error IVAS_DEC_GetRenderedSamples( IVAS_DEC_HANDLE hIvasDec, const UWord16 nSamplesForRendering, UWord16 *nSamplesRendered, UWord16 *nSamplesAvailableNext, Word16 *pcmBuf ); -static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( IVAS_DEC_HANDLE hIvasDec, Word16 *nSamplesBuffered ); +static ivas_error ivas_dec_setup_all( IVAS_DEC_HANDLE hIvasDec, UWord8 *nTransportChannels, ISAR_SPLIT_REND_BITS_DATA *splitRendBits ); +static ivas_error apa_setup( IVAS_DEC_HANDLE hIvasDec, const bool isInitialized_voip, const UWord16 nTransportChannels ); +static ivas_error isar_set_split_rend_setup( ISAR_DEC_SPLIT_REND_WRAPPER *hSplitBinRend, const ISAR_SPLIT_REND_CONFIG_DATA *hSplitBinConfig, const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, ISAR_SPLIT_REND_BITS_DATA *splitRendBits ); +static ivas_error ivas_dec_reconfig_split_rend( Decoder_Struct *st_ivas ); +static ivas_error ivas_dec_init_split_rend( Decoder_Struct *st_ivas ); +static ivas_error ivas_create_handle_isar( ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE *hSplitBinRend_out ); +static void ivas_destroy_handle_isar( ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE *hSplitBinRend_out ); static Word16 get_render_frame_size_ms( IVAS_RENDER_FRAMESIZE render_framesize ); +static Word16 get_render_frame_size_samples( const DECODER_CONFIG_HANDLE hDecoderConfig ); +static Word16 ivas_dec_split_rend_cldfb_in( const RENDERER_TYPE renderer_type ); +static void update_voip_rendered20ms( IVAS_DEC_HANDLE hIvasDec, const Word16 nSamplesRendered ); /*---------------------------------------------------------------------* @@ -145,17 +155,17 @@ ivas_error IVAS_DEC_Open( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for IVAS decoder handle" ); } + hIvasDec = *phIvasDec; hIvasDec->hVoIP = NULL; - hIvasDec->apaExecBuffer_fx = NULL; hIvasDec->hTimeScaler = NULL; hIvasDec->tsm_scale = 100; hIvasDec->tsm_max_scaling = 0; hIvasDec->tsm_quality = ONE_IN_Q14; /*1.f Q14*/ + hIvasDec->timeScalingDone = 0; hIvasDec->needNewFrame = false; hIvasDec->nTransportChannelsOld = 0; hIvasDec->nSamplesAvailableNext = 0; - hIvasDec->nSamplesRendered = 0; hIvasDec->nSamplesFrame = 0; hIvasDec->hasBeenFedFrame = false; hIvasDec->hasBeenFedFirstGoodFrame = false; @@ -174,20 +184,29 @@ ivas_error IVAS_DEC_Open( move16(); move16(); move16(); + move16(); + hIvasDec->flushbuffer = NULL; + hIvasDec->nSamplesFlushed = 0; + move16(); + hIvasDec->hasBeenPreparedRendering = false; + move16(); hIvasDec->mode = mode; move16(); hIvasDec->bitstreamformat = G192; + move16(); +#ifdef DEBUGGING hIvasDec->Opt_VOIP = 0; + move16(); +#endif hIvasDec->amrwb_rfc4867_flag = -1; hIvasDec->prev_ft_speech = 1; /* RXDTX handler previous frametype flag for G.192 format AMRWB SID_FIRST detection */ hIvasDec->CNG = 0; /* RXDTX handler CNG = 1, no CNG = 0*/ move16(); move16(); move16(); - move16(); - move16(); + /*-----------------------------------------------------------------* * Initialize IVAS-codec decoder state *-----------------------------------------------------------------*/ @@ -214,6 +233,9 @@ ivas_error IVAS_DEC_Open( /* initialize pointers to handles to NULL */ ivas_initialize_handles_dec( st_ivas ); + st_ivas->restartNeeded = 0; + move16(); + /* set high-level parameters */ IF( EQ_16( mode, IVAS_DEC_MODE_EVS ) ) { @@ -267,6 +289,7 @@ ivas_error IVAS_DEC_Open( move16(); move16(); move16(); + return IVAS_ERR_OK; } @@ -274,6 +297,48 @@ ivas_error IVAS_DEC_Open( } +/*-------------------------------------------------------------------------* + * isar_set_split_rend_setup() + * + * Setup IVAS split rendering + *-------------------------------------------------------------------------*/ + +static ivas_error isar_set_split_rend_setup( + ISAR_DEC_SPLIT_REND_WRAPPER *hSplitBinRend, + const ISAR_SPLIT_REND_CONFIG_DATA *hSplitBinConfig, + const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, + ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ +) +{ + splitRendBits->bits_read = 0; + splitRendBits->bits_written = 0; + splitRendBits->buf_len = ISAR_MAX_SPLIT_REND_BITS_BUFFER_SIZE_IN_BYTES; + splitRendBits->codec = ISAR_SPLIT_REND_CODEC_DEFAULT; + splitRendBits->pose_correction = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE; + splitRendBits->codec_frame_size_ms = 0; + splitRendBits->isar_frame_size_ms = 0; + splitRendBits->lc3plus_highres = 0; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + + + ISAR_PRE_REND_GetMultiBinPoseData( hSplitBinConfig, &hSplitBinRend->splitrend.multiBinPoseData, ( hCombinedOrientationData != NULL ) ? hCombinedOrientationData->sr_pose_pred_axis : DEFAULT_AXIS ); + + IF( hCombinedOrientationData != NULL ) + { + isar_set_split_rend_ht_setup_fx( &hSplitBinRend->splitrend, hCombinedOrientationData->Quaternions, hCombinedOrientationData->Rmat_fx ); + } + + return IVAS_ERR_OK; +} + + /*---------------------------------------------------------------------* * init_decoder_config() * @@ -291,6 +356,7 @@ static void init_decoder_config( hDecoderConfig->Opt_HRTF_binary = 0; hDecoderConfig->Opt_Headrotation = 0; hDecoderConfig->Opt_RendConfigCustom = 0; + hDecoderConfig->Opt_RoomSize = IVAS_ROOM_SIZE_AUTO; hDecoderConfig->orientation_tracking = IVAS_HEAD_ORIENT_TRK_NONE; hDecoderConfig->Opt_non_diegetic_pan = 0; hDecoderConfig->non_diegetic_pan_gain_fx = 0; // Q15 @@ -299,6 +365,8 @@ static void init_decoder_config( hDecoderConfig->Opt_ExternalOrientation = 0; hDecoderConfig->Opt_dpid_on = 0; hDecoderConfig->Opt_aeid_on = 0; + hDecoderConfig->Opt_ObjEdit_on = 0; + move16(); move16(); move16(); move16(); @@ -314,6 +382,7 @@ static void init_decoder_config( move16(); move16(); move16(); + return; } @@ -321,7 +390,7 @@ static void init_decoder_config( /*---------------------------------------------------------------------* * IVAS_DEC_Close( ) * - * + * Deallocate IVAS decoder memory handles *---------------------------------------------------------------------*/ void IVAS_DEC_Close( @@ -337,22 +406,26 @@ void IVAS_DEC_Close( IF( ( *phIvasDec )->hVoIP ) { - IVAS_DEC_Close_VoIP( ( *phIvasDec )->hVoIP ); + ivas_destroy_handle_VoIP_fx( ( *phIvasDec )->hVoIP ); ( *phIvasDec )->hVoIP = NULL; } IF( ( *phIvasDec )->st_ivas ) { + /* destroy Split binaural renderer (ISAR) handle */ + ivas_destroy_handle_isar( &( *phIvasDec )->st_ivas->hSplitBinRend ); + ivas_destroy_dec_fx( ( *phIvasDec )->st_ivas ); ( *phIvasDec )->st_ivas = NULL; } apa_exit( &( *phIvasDec )->hTimeScaler ); - IF( ( *phIvasDec )->apaExecBuffer_fx != NULL ) + IF( ( *phIvasDec )->flushbuffer != NULL ) { - free( ( *phIvasDec )->apaExecBuffer_fx ); + free( ( *phIvasDec )->flushbuffer ); } + free( *phIvasDec ); *phIvasDec = NULL; phIvasDec = NULL; @@ -396,38 +469,59 @@ static IVAS_DEC_BS_FORMAT mapIvasFormat( } +/*---------------------------------------------------------------------* + * create_flush_buffer() + * + * Create flush buffer - needed for binaural outputs with TSM or in VoIP mode + *---------------------------------------------------------------------*/ + +static ivas_error create_flush_buffer_fx( + IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ +) +{ + hIvasDec->flushbuffer = (Word16 *) malloc( CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( Word16 ) ); + if ( hIvasDec->flushbuffer == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate JBM flush buffer" ); + } + + set16_fx( hIvasDec->flushbuffer, 0, CPE_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); + + return IVAS_ERR_OK; +} + + /*---------------------------------------------------------------------* * IVAS_DEC_Configure( ) * * Decoder configuration - * legacy code behavior: if no output format set, then it's EVS mono + * legacy behavior: if no output format set, then it's EVS mono *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_Configure( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const UWord32 sampleRate, /* i : output sampling frequency */ - const AUDIO_CONFIG outputConfig, /* i : output configuration */ - const Word16 tsmEnabled, /* i : enable time scale modification */ - const IVAS_RENDER_FRAMESIZE renderFramesize, /* i : rendering frame size */ - const Word16 customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ - const Word16 hrtfReaderEnabled, /* i : enable HRTF binary file input */ - const Word16 enableHeadRotation, /* i : enable head rotation for binaural output */ - const Word16 enableExternalOrientation, /* i : enable external orientations */ - const IVAS_HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ - const Word16 renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ - const Word16 Opt_non_diegetic_pan, /* i : diegetic or not */ - const Word16 non_diegetic_pan_gain_fx, /* i : non diegetic panning gain Q15 */ - const Word16 Opt_dpid_on, /* i : enable directivity pattern option */ - const UWord16 acousticEnvironmentId, /* i : Acoustic environment ID */ - const Word16 delayCompensationEnabled /* i : enable delay compensation */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const UWord32 sampleRate, /* i : output sampling frequency */ + const IVAS_AUDIO_CONFIG outputConfig, /* i : output configuration */ + const IVAS_RENDER_FRAMESIZE renderFramesize, /* i : rendering frame size */ + const bool customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ + const bool hrtfReaderEnabled, /* i : enable HRTF binary file input */ + const bool enableHeadRotation, /* i : enable head rotation for binaural output */ + const bool enableExternalOrientation, /* i : enable external orientations */ + const IVAS_HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ + const bool renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ + const IVAS_ROOM_SIZE_T roomSize, /* i : room size selector for reverb */ + const bool non_diegetic_pan_enabled, /* i : enabled diegetic panning */ + const Word16 non_diegetic_pan_gain_fx, /* i : non diegetic panning gain */ + const bool dpidEnabled, /* i : enable directivity pattern option */ + const UWord16 acousticEnvironmentId, /* i : Acoustic environment ID */ + const bool objEditEnabled, /* i : enable object editing */ + const bool delayCompensationEnabled /* i : enable delay compensation */ ) { Decoder_Struct *st_ivas; DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; - error = IVAS_ERR_OK; - move32(); test(); IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { @@ -446,18 +540,30 @@ ivas_error IVAS_DEC_Configure( test(); test(); test(); - IF( EQ_16( hIvasDec->mode, IVAS_DEC_MODE_EVS ) && !( ( EQ_16( outputConfig, IVAS_AUDIO_CONFIG_MONO ) && Opt_non_diegetic_pan == 0 ) || - ( EQ_16( outputConfig, IVAS_AUDIO_CONFIG_STEREO ) && EQ_16( Opt_non_diegetic_pan, 1 ) ) ) ) + test(); + test(); + test(); + test(); + test(); + IF( EQ_16( hIvasDec->mode, IVAS_DEC_MODE_EVS ) && + ( EQ_16( outputConfig, IVAS_AUDIO_CONFIG_INVALID ) || + EQ_16( outputConfig, IVAS_AUDIO_CONFIG_ISM1 ) || + EQ_16( outputConfig, IVAS_AUDIO_CONFIG_ISM2 ) || + EQ_16( outputConfig, IVAS_AUDIO_CONFIG_ISM3 ) || + EQ_16( outputConfig, IVAS_AUDIO_CONFIG_ISM4 ) || + EQ_16( outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || + EQ_16( outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || + EQ_16( outputConfig, IVAS_AUDIO_CONFIG_MASA1 ) || + EQ_16( outputConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) ) { return IVAS_ERR_WRONG_MODE; } st_ivas = hIvasDec->st_ivas; - hDecoderConfig = st_ivas->hDecoderConfig; - hDecoderConfig->output_config = outputConfig; move16(); + IF( EQ_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_INVALID ) ) { return IVAS_ERR_WRONG_PARAMS; @@ -480,18 +586,18 @@ ivas_error IVAS_DEC_Configure( move16(); } - hDecoderConfig->Opt_tsm = tsmEnabled; - hDecoderConfig->Opt_LsCustom = customLsOutputEnabled; - hDecoderConfig->Opt_Headrotation = enableHeadRotation; + hDecoderConfig->Opt_LsCustom = (Word16) customLsOutputEnabled; + hDecoderConfig->Opt_Headrotation = (Word16) enableHeadRotation; hDecoderConfig->orientation_tracking = orientation_tracking; - hDecoderConfig->Opt_HRTF_binary = hrtfReaderEnabled; - hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled; - hDecoderConfig->Opt_non_diegetic_pan = Opt_non_diegetic_pan; + hDecoderConfig->Opt_HRTF_binary = (Word16) hrtfReaderEnabled; + hDecoderConfig->Opt_RendConfigCustom = (Word16) renderConfigEnabled; + hDecoderConfig->Opt_RoomSize = roomSize; + hDecoderConfig->Opt_non_diegetic_pan = (Word16) non_diegetic_pan_enabled; hDecoderConfig->non_diegetic_pan_gain_fx = non_diegetic_pan_gain_fx; // Q15 - hDecoderConfig->Opt_delay_comp = delayCompensationEnabled; + hDecoderConfig->Opt_delay_comp = (Word16) delayCompensationEnabled; hDecoderConfig->Opt_ExternalOrientation = enableExternalOrientation; - hDecoderConfig->Opt_dpid_on = Opt_dpid_on; - IF( NE_32( (Word32) acousticEnvironmentId, 65535 ) ) + hDecoderConfig->Opt_dpid_on = (Word16) dpidEnabled; + IF( NE_32( (UWord16) acousticEnvironmentId, IVAS_DEFAULT_AEID ) ) { hDecoderConfig->Opt_aeid_on = TRUE; } @@ -499,6 +605,8 @@ ivas_error IVAS_DEC_Configure( { hDecoderConfig->Opt_aeid_on = FALSE; } + hDecoderConfig->Opt_ObjEdit_on = (Word16) objEditEnabled; + move16(); move16(); move16(); move16(); @@ -515,6 +623,7 @@ ivas_error IVAS_DEC_Configure( { return IVAS_ERR_WRONG_PARAMS; } + IF( EQ_16( outputConfig, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { hDecoderConfig->render_framesize = IVAS_RENDER_FRAMESIZE_20MS; @@ -523,7 +632,6 @@ ivas_error IVAS_DEC_Configure( { hDecoderConfig->render_framesize = renderFramesize; } - move16(); /* Set decoder parameters to initial values */ @@ -532,6 +640,15 @@ ivas_error IVAS_DEC_Configure( return error; } + /* create ISAR handle */ + IF( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + IF( ( error = ivas_create_handle_isar( &st_ivas->hSplitBinRend ) ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for ISAR handle" ); + } + } + if ( EQ_16( hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) { hIvasDec->st_ivas->ivas_format = MONO_FORMAT; @@ -539,28 +656,48 @@ ivas_error IVAS_DEC_Configure( } hIvasDec->nSamplesFrame = (UWord16) Mpy_32_16_1( hDecoderConfig->output_Fs, INV_FRAME_PER_SEC_Q15 ); - hIvasDec->nSamplesAvailableNext = 0; - hIvasDec->nSamplesRendered = 0; - hIvasDec->tsm_scale = 100; - hIvasDec->tsm_max_scaling = 0; - hIvasDec->tsm_quality = ONE_IN_Q14 /*1.0f Q14*/; - move16(); - move16(); - move16(); - move16(); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_EnableSplitRendering( ) + * + * Update IVAS decoder config. if Split rendering is enabled + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_EnableSplitRendering( + IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ +) +{ + DECODER_CONFIG_HANDLE hDecoderConfig; + + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig; + move32(); + + hDecoderConfig->Opt_Headrotation = 1; move16(); + hDecoderConfig->render_framesize = IVAS_RENDER_FRAMESIZE_20MS; + move32(); - return error; + return IVAS_ERR_OK; } /*---------------------------------------------------------------------* * get_render_framesize_ms( ) * - * Get the 5ms flag + * Get render framesize in ms *---------------------------------------------------------------------*/ -Word16 get_render_frame_size_ms( +static Word16 get_render_frame_size_ms( const IVAS_RENDER_FRAMESIZE render_framesize ) { IF( EQ_16( render_framesize, IVAS_RENDER_FRAMESIZE_5MS ) ) @@ -575,6 +712,7 @@ Word16 get_render_frame_size_ms( { return ( ( 1000 / ( FRAMES_PER_SEC * IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ) ) << 2 ); } + return 0; } @@ -582,7 +720,7 @@ Word16 get_render_frame_size_ms( /*---------------------------------------------------------------------* * IVAS_DEC_SetRenderFramesize( ) * - * Get the 5ms flag + * Set render framesize *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_SetRenderFramesize( @@ -600,13 +738,26 @@ ivas_error IVAS_DEC_SetRenderFramesize( hIvasDec->st_ivas->hDecoderConfig->render_framesize = render_framesize; move16(); + IF( hIvasDec->st_ivas->hExtOrientationData != NULL ) + { + hIvasDec->st_ivas->hExtOrientationData->num_subframes = (Word16) render_framesize; + move16(); + } + + IF( hIvasDec->st_ivas->hCombinedOrientationData != NULL ) + { + hIvasDec->st_ivas->hCombinedOrientationData->num_subframes = (Word16) render_framesize; + move16(); + } + return IVAS_ERR_OK; } + /*---------------------------------------------------------------------* * IVAS_DEC_GetGetRenderFramesize( ) * - * Get the 5ms flag + * Get render framesize *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetRenderFramesize( @@ -627,48 +778,67 @@ ivas_error IVAS_DEC_GetRenderFramesize( return IVAS_ERR_OK; } + /*---------------------------------------------------------------------* - * IVAS_DEC_GetGetRenderFramesizeSamples( ) + * get_render_frame_size_samples( ) + * * - * Get render framesize in samples *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_GetRenderFramesizeSamples( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word16 *render_framesize /* o : render framesize in samples Q0 */ +static Word16 get_render_frame_size_samples( + const DECODER_CONFIG_HANDLE hDecoderConfig /* i : configuration structure */ ) { Word16 tmp; - test(); - test(); - IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || render_framesize == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - tmp = (Word16) Mpy_32_16_1( hIvasDec->st_ivas->hDecoderConfig->output_Fs, INV_FR_P_S_MX_PRM_SPL_SBFR_Q15 ); + tmp = (Word16) Mpy_32_16_1( hDecoderConfig->output_Fs, INV_FR_P_S_MX_PRM_SPL_SBFR_Q15 ); - IF( EQ_16( hIvasDec->st_ivas->hDecoderConfig->render_framesize, IVAS_RENDER_FRAMESIZE_5MS ) ) + IF( EQ_16( hDecoderConfig->render_framesize, IVAS_RENDER_FRAMESIZE_5MS ) ) { - *render_framesize = tmp; + /* correct value already in tmp */ } - ELSE IF( EQ_16( hIvasDec->st_ivas->hDecoderConfig->render_framesize, IVAS_RENDER_FRAMESIZE_10MS ) ) + ELSE IF( EQ_16( hDecoderConfig->render_framesize, IVAS_RENDER_FRAMESIZE_10MS ) ) { - *render_framesize = shl( tmp, 1 ); + tmp = shl( tmp, 1 ); } - ELSE IF( EQ_16( hIvasDec->st_ivas->hDecoderConfig->render_framesize, IVAS_RENDER_FRAMESIZE_20MS ) ) + ELSE IF( EQ_16( hDecoderConfig->render_framesize, IVAS_RENDER_FRAMESIZE_20MS ) ) { - *render_framesize = shl( tmp, 2 ); + tmp = shl( tmp, 2 ); } ELSE { - *render_framesize = 0; + tmp = 0; + } + + return tmp; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetGetRenderFramesizeSamples( ) + * + * Get render framesize in samples + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetRenderFramesizeSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *render_framesize /* o : render framesize in samples Q0 */ +) +{ + + test(); + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || render_framesize == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; } + + *render_framesize = get_render_frame_size_samples( hIvasDec->st_ivas->hDecoderConfig ); move16(); return IVAS_ERR_OK; } + /*---------------------------------------------------------------------* * IVAS_DEC_GetGetRenderFramesizeMs( ) * @@ -676,8 +846,8 @@ ivas_error IVAS_DEC_GetRenderFramesizeSamples( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetRenderFramesizeMs( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - UWord32 *render_framesize /* o : render framesize in samples Q0 */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + UWord32 *render_framesize /* o : render framesize in samples Q0 */ ) { test(); @@ -693,6 +863,7 @@ ivas_error IVAS_DEC_GetRenderFramesizeMs( return IVAS_ERR_OK; } + /*---------------------------------------------------------------------* * IVAS_DEC_GetGetReferencesUpdateFrequency( ) * @@ -700,8 +871,8 @@ ivas_error IVAS_DEC_GetRenderFramesizeMs( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetReferencesUpdateFrequency( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word16 *update_frequency /* o : update frequency Q0 */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *update_frequency /* o : update frequency Q0 */ ) { test(); @@ -733,7 +904,7 @@ ivas_error IVAS_DEC_GetReferencesUpdateFrequency( /*---------------------------------------------------------------------* * IVAS_DEC_GetGetNumOrientationSubframes( ) * - * Get the number of subframes for head/ecernal orientation per render frame + * Get the number of subframes for head/external orientation per render frame *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetNumOrientationSubframes( @@ -772,9 +943,6 @@ ivas_error IVAS_DEC_EnableVoIP( DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; - error = IVAS_ERR_OK; - move32(); - test(); IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { @@ -783,10 +951,13 @@ ivas_error IVAS_DEC_EnableVoIP( hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig; +#ifdef DEBUGGING hIvasDec->Opt_VOIP = 1; +#endif hDecoderConfig->Opt_tsm = 1; move16(); move16(); + IF( NE_16( (Word16) hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { hDecoderConfig->nchan_out = audioCfg2channels( hDecoderConfig->output_config ); @@ -806,7 +977,7 @@ ivas_error IVAS_DEC_EnableVoIP( hIvasDec->hVoIP->lastDecodedWasActive = 0; move16(); hIvasDec->hVoIP->hCurrentDataUnit = NULL; - hIvasDec->hVoIP->nSamplesFrame = (UWord16) Mpy_32_16_1( hDecoderConfig->output_Fs, INV_FRAME_PER_SEC_Q15 ); + hIvasDec->hVoIP->nSamplesRendered20ms = 0; move16(); #define WMC_TOOL_SKIP @@ -830,7 +1001,21 @@ ivas_error IVAS_DEC_EnableVoIP( return IVAS_ERR_FAILED_ALLOC; } - return error; +#ifdef NONBE_1122_KEEP_EVS_MODE_UNCHANGED + if ( EQ_16( hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) + { + JB4_TMP_SetEvsCompatFlag( hIvasDec->hVoIP->hJBM ); + } +#endif + + /* init flush buffer (needed for binaural outputs) */ + IF( ( error = create_flush_buffer_fx( hIvasDec ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in create_flush_buffer , code: %d\n", error ); + return error; + } + + return IVAS_ERR_OK; } @@ -849,25 +1034,25 @@ ivas_error IVAS_DEC_FeedFrame_Serial( { ivas_error error; + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + IF( !hIvasDec->isInitialized ) { /* Once first frame is fed, finish initialization in EVS Mono. * In IVAS mode, initialization is done in ivas_dec(). */ IF( EQ_16( hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) { + hIvasDec->st_ivas->hDecoderConfig->ivas_total_brate = ACELP_8k00; + move32(); + IF( NE_32( ( error = ivas_init_decoder_fx( hIvasDec->st_ivas ) ), IVAS_ERR_OK ) ) { return error; } - Word32 ivas_total_brate = hIvasDec->st_ivas->hDecoderConfig->ivas_total_brate; - move32(); - test(); - IF( ( EQ_16( hIvasDec->st_ivas->ivas_format, MC_FORMAT ) ) && ( EQ_16( hIvasDec->st_ivas->mc_mode, MC_MODE_PARAMMC ) ) ) - { - MC_LS_SETUP mc_ls_setup; - mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup_fx( hIvasDec->st_ivas->transport_config ); - hIvasDec->st_ivas->nchan_transport = ivas_param_mc_getNumTransportChannels_fx( ivas_total_brate, mc_ls_setup ); - } test(); IF( hIvasDec->hVoIP != NULL && hIvasDec->hVoIP->hCurrentDataUnit != NULL ) @@ -880,11 +1065,7 @@ ivas_error IVAS_DEC_FeedFrame_Serial( hIvasDec->st_ivas->hDecoderConfig->ivas_total_brate = imult3216( hIvasDec->hVoIP->hCurrentDataUnit->dataSize, FRAMES_PER_SEC ); move32(); } - ELSE - { - hIvasDec->st_ivas->hDecoderConfig->ivas_total_brate = ACELP_8k00; - move32(); - } + hIvasDec->isInitialized = true; move16(); } @@ -946,47 +1127,65 @@ ivas_error IVAS_DEC_FeedFrame_Serial( hIvasDec->needNewFrame = false; hIvasDec->hasBeenFedFrame = true; - hIvasDec->nSamplesRendered = 0; hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; move16(); move16(); move16(); - move16(); return IVAS_ERR_OK; } /*---------------------------------------------------------------------* - * IVAS_DEC_GetSamples( ) + * isar_get_frame_size( ) + * * - * Main function to decode to PCM data *---------------------------------------------------------------------*/ +static Word16 isar_get_frame_size( + Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +) +{ + Word32 output_Fs; + Word16 nSamplesPerChannel; -ivas_error IVAS_DEC_GetSamples( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const Word16 nSamplesAsked, /* i : number of samples wanted by the caller */ - Word16 *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels Q0 */ - Word16 *nOutSamples, /* o : number of samples per channel written to output buffer */ - bool *needNewFrame /* o :indication that the decoder needs a new frame */ + output_Fs = st_ivas->hDecoderConfig->output_Fs; + + test(); + test(); + IF( NE_32( st_ivas->hDecoderConfig->render_framesize, IVAS_RENDER_FRAMESIZE_20MS ) && + ( EQ_32( st_ivas->hRenderConfig->split_rend_config.poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) || + EQ_32( st_ivas->hRenderConfig->split_rend_config.dof, 0 ) ) ) + { + nSamplesPerChannel = extract_l( ar_div( output_Fs, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ); + nSamplesPerChannel = imult1616( nSamplesPerChannel, st_ivas->hDecoderConfig->render_framesize ); + } + ELSE + { + nSamplesPerChannel = extract_l( ar_div( output_Fs, FRAMES_PER_SEC ) ); + } + + return nSamplesPerChannel; +} + + +/*---------------------------------------------------------------------* + * isar_render_poses( ) + * + * + *---------------------------------------------------------------------*/ + +static ivas_error isar_render_poses( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const Word16 nSamplesAsked, /* i : number of samples wanted by the caller */ + Word16 *nOutSamples, /* o : number of samples per channel written to output buffer */ + bool *needNewFrame /* o : indication that the decoder needs a new frame */ ) { + Word16 pcmBuf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES * L_FRAME48k]; + Decoder_Struct *st_ivas; ivas_error error; - Word16 nOutSamplesElse, nSamplesToRender; - UWord16 nSamplesRendered, nSamplesRendered_loop, l_ts, nTimeScalerOutSamples; - UWord8 nTransportChannels, nOutChannels; - - nSamplesRendered = 0; - nOutChannels = 0; - nSamplesRendered_loop = 0; - l_ts = 0; - nTransportChannels = 0; - move16(); - move16(); - move16(); - move16(); - move16(); + Word16 numPoses; test(); IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) @@ -994,161 +1193,342 @@ ivas_error IVAS_DEC_GetSamples( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - IF( hIvasDec->updateOrientation ) + *needNewFrame = false; + move16(); + + st_ivas = hIvasDec->st_ivas; + + numPoses = st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; + move16(); + + /* init flush buffer for rate switch if not already initizalized */ + IF( hIvasDec->flushbuffer == NULL ) { - /*----------------------------------------------------------------* - * Combine orientations - *----------------------------------------------------------------*/ + /* hIvasDec->flushbuffer = (void *) malloc( sizeof( Word16 ) * numPoses * BINAURAL_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); */ + /* set16_fx( (Word16 *) hIvasDec->flushbuffer, 0, numPoses * BINAURAL_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); */ + Word16 num_samples_flushbuffer; + num_samples_flushbuffer = mult0( mult0( numPoses, BINAURAL_CHANNELS ), shl( div_l( hIvasDec->nSamplesFrame, IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ), 1 ) ); + hIvasDec->flushbuffer = (void *) malloc( L_mult0( sizeof( Word16 ), num_samples_flushbuffer ) ); + set16_fx( (Word16 *) hIvasDec->flushbuffer, 0, num_samples_flushbuffer ); + } - IF( NE_32( ( error = combine_external_and_head_orientations_dec( hIvasDec->st_ivas->hHeadTrackData, hIvasDec->st_ivas->hExtOrientationData, hIvasDec->st_ivas->hCombinedOrientationData ) ), IVAS_ERR_OK ) ) - { - return error; - } - hIvasDec->updateOrientation = false; - move16(); + /* render */ + IF( NE_32( ( error = IVAS_DEC_GetSamplesRenderer( hIvasDec, nSamplesAsked, pcmBuf, nOutSamples, needNewFrame ) ), IVAS_ERR_OK ) ) + { + return error; } - test(); - IF( !hIvasDec->hasBeenFedFrame && hIvasDec->nSamplesAvailableNext == 0 ) + IF( !hIvasDec->hasBeenFedFirstGoodFrame ) { - /* no frame was fed, do nothing but ask for a frame */ - *needNewFrame = true; - *nOutSamples = 0; - hIvasDec->needNewFrame = true; - move16(); - move16(); - move16(); return IVAS_ERR_OK; } - test(); - /* check if we are still at the beginning with bad frames, put out zeroes, keep track of subframes */ - IF( !hIvasDec->isInitialized && hIvasDec->st_ivas->bfi ) + /* NOTE: Here BASOP differs from the float version. In float, we push samples to TD ring buffer here. In BASOP, TD signals are only available in 16 bit here. + * To save TD signals in 32-bit precision, samples are pushed via ivas_TD_RINGBUF_PushChannels in ivas_jbm_dec_render_fx within IVAS_DEC_GetSamplesRenderer. */ + + return error; +} + + +/*---------------------------------------------------------------------* + * isar_generate_metadata_and_bitstream( ) + * + * + *---------------------------------------------------------------------*/ + +static ivas_error isar_generate_metadata_and_bitstream( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Word32 **p_head_pose_buf, /* i/o: PCM buffer with head-pose data */ + Word16 nSamples, /* i : duration of audio (in samples per channel) for which metadata should be generated */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ + Word16 Q_out[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS] /* o : Q-format of each channel of p_head_pose_buf */ +) +{ + ivas_error error; + ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend; + Word16 max_band; + Word16 pcm_out_flag; + Word16 cldfb_in_flag; + Word16 ro_md_flag; + IVAS_QUATERNION Quaternion; + Word16 i, j, num_poses, num_cldfb_slots, n_samples_in_cldfb_slot; + Word32 *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; + Word32 *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; + + hSplitBinRend = st_ivas->hSplitBinRend; + + max_band = extract_l( ar_div( imult3216( st_ivas->hDecoderConfig->output_Fs, BINAURAL_MAXBANDS ), 48000 ) ); + move16(); + cldfb_in_flag = ivas_dec_split_rend_cldfb_in( st_ivas->renderer_type ); + move16(); + pcm_out_flag = 0; + move16(); + if ( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - hIvasDec->hasBeenFedFrame = false; - move16(); - set16_fx( pcmBuf, 0, imult1616( hIvasDec->st_ivas->hDecoderConfig->nchan_out, nSamplesAsked ) ); - hIvasDec->nSamplesRendered = add( hIvasDec->nSamplesRendered, nSamplesAsked ); + pcm_out_flag = 1; move16(); - *nOutSamples = nSamplesAsked; - move16(); - hIvasDec->nSamplesAvailableNext = sub( hIvasDec->nSamplesAvailableNext, nSamplesAsked ); + } + + IF( cldfb_in_flag ) + { + n_samples_in_cldfb_slot = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + assert( nSamples % n_samples_in_cldfb_slot == 0 ); + num_cldfb_slots = int_div_s_x( nSamples, n_samples_in_cldfb_slot ); + + num_poses = hSplitBinRend->splitrend.multiBinPoseData.num_poses; move16(); - IF( hIvasDec->nSamplesAvailableNext == 0 ) + + FOR( i = 0; i < imult1616( BINAURAL_CHANNELS, num_poses ); ++i ) { - hIvasDec->needNewFrame = true; - *needNewFrame = true; - move16(); - move16(); + FOR( j = 0; j < num_cldfb_slots; ++j ) + { + /* Save pointers to first CLDFB column in the ring buffer. Allows us to save + * significant amounts of memory by not copying CLDFB values into a separate buffer. */ + ivas_CLDFB_RINGBUF_GetByIdx( hSplitBinRend->hMultiBinCldfbData[i], &p_Cldfb_RealBuffer_Binaural[i][j], &p_Cldfb_ImagBuffer_Binaural[i][j], 0 ); + + /* Pop the CLDFB column we just saved pointers to. This is fine as long as we use + * the saved columns only before any new columns are pushed to the buffer - the new + * columns could potentially overwrite the old columns we wanted to use. + * This requirement is fulfilled in this case. */ + ivas_CLDFB_RINGBUF_Pop( hSplitBinRend->hMultiBinCldfbData[i], NULL, NULL, CLDFB_NO_CHANNELS_MAX ); + } } } ELSE { - /* check if we need to run the setup function */ - test(); - IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ){ - /* setup */ + ivas_TD_RINGBUF_PopChannels( st_ivas->hSplitBinRend->hMultiBinTdData, p_head_pose_buf, nSamples ); - IF( NE_32( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ){ - return error; + num_cldfb_slots = 0; // just to avoid compilation warning + num_poses = 0; // just to avoid compilation warning + move16(); + move16(); } -} -{ - /* check if we need to run the setup function, tc decoding and feeding the renderer */ - test(); - IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) + + IF( st_ivas->hBinRendererTd != NULL ) { - Word16 nResidualSamples, nSamplesTcsScaled; - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); + ro_md_flag = 1; + move16(); + } + ELSE + { + ro_md_flag = 0; + move16(); + } - test(); - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm && NE_16( (Word16) nTransportChannels, hIvasDec->nTransportChannelsOld ) ) + IF( st_ivas->hHeadTrackData != NULL ) + { + Quaternion = st_ivas->hHeadTrackData->Quaternions[0]; + /* Copy of a struct: 4x Word32 and 1x Word32 */ + move32(); + move32(); + move32(); + move32(); + move16(); + } + ELSE + { + Quaternion.w_fx = -12582912; + move32(); + Quaternion.x_fx = 0; + move32(); + Quaternion.y_fx = 0; + move32(); + Quaternion.z_fx = 0; + move32(); + } + Word16 q1 = 31, q2 = 31, Q_buff; + move32(); + move32(); + Q_out[0] = 31; + move32(); + + IF( EQ_16( cldfb_in_flag, 1 ) ) + { + FOR( i = 0; i < i_mult( BINAURAL_CHANNELS, num_poses ); i++ ) { - IF( NE_32( ( error = IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ) ), IVAS_ERR_OK ) ) + FOR( j = 0; j < num_cldfb_slots; j++ ) { - return error; + q1 = s_min( q1, L_norm_arr( p_Cldfb_RealBuffer_Binaural[i][j], CLDFB_NO_CHANNELS_MAX ) ); + q2 = s_min( q2, L_norm_arr( p_Cldfb_ImagBuffer_Binaural[i][j], CLDFB_NO_CHANNELS_MAX ) ); } } - - /* IVAS decoder */ - IF( NE_32( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hIvasDec->apaExecBuffer_fx, &nOutSamplesElse ) ), IVAS_ERR_OK ) ) - { - return error; - } - - /* JBM */ - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + Q_buff = s_min( q1, q2 ); + FOR( i = 0; i < i_mult( BINAURAL_CHANNELS, num_poses ); i++ ) { - IF( apa_set_scale_fx( hIvasDec->hTimeScaler, hIvasDec->tsm_scale ) != 0 ) + FOR( j = 0; j < num_cldfb_slots; j++ ) { - return IVAS_ERR_UNKNOWN; + scale_sig32( p_Cldfb_RealBuffer_Binaural[i][j], CLDFB_NO_CHANNELS_MAX, Q_buff ); + scale_sig32( p_Cldfb_ImagBuffer_Binaural[i][j], CLDFB_NO_CHANNELS_MAX, Q_buff ); } + } + Q_buff = add( Q_buff, Q6 ); + } + ELSE + { + /*TD input*/ + /*if CLDFB handles have been allocated then assume valid multi binaural input in out[][] buffer and perform CLDFB analysis*/ + num_poses = hSplitBinRend->splitrend.multiBinPoseData.num_poses; + move16(); - // tmp apaExecBuffer - IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) - { - Word16 tmp_apaExecBuffer[APA_BUF]; - FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) - { - tmp_apaExecBuffer[i] = extract_l( L_shr( hIvasDec->apaExecBuffer_fx[i], Q11 ) ); // Q0 - } - IF( apa_exec_fx( hIvasDec->hTimeScaler, tmp_apaExecBuffer, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, tmp_apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) - { - return IVAS_ERR_UNKNOWN; - } - FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) - { - hIvasDec->apaExecBuffer_fx[i] = L_shl( tmp_apaExecBuffer[i], Q11 ); // Q11 - } - } - ELSE - { - IF( apa_exec_ivas_fx( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer_fx, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer_fx, &nTimeScalerOutSamples ) != 0 ) - { - return IVAS_ERR_UNKNOWN; - } - } - assert( LE_32( (Word32) nTimeScalerOutSamples, APA_BUF ) ); - nSamplesTcsScaled = idiv1616U( extract_l( nTimeScalerOutSamples ), nTransportChannels ); + FOR( i = 0; i < num_poses * BINAURAL_CHANNELS; ++i ) + { + Q_out[0] = s_min( Q_out[0], L_norm_arr( p_head_pose_buf[i], L_FRAME48k ) ); } - ELSE + + FOR( i = 0; i < num_poses * BINAURAL_CHANNELS; ++i ) { - nSamplesTcsScaled = hIvasDec->nSamplesFrame; - move16(); + scale_sig32( p_head_pose_buf[i], L_FRAME48k, Q_out[0] ); } + Q_out[0] = add( Q_out[0], Q11 ); + Q_out[1] = Q_out[0]; + move16(); + Q_buff = Q31 + Q6; // likely unneeded + move16(); + } + + IF( NE_32( ( error = ISAR_PRE_REND_MultiBinToSplitBinaural( &hSplitBinRend->splitrend, + Quaternion, + st_ivas->hRenderConfig->split_rend_config.splitRendBitRate, + st_ivas->hRenderConfig->split_rend_config.codec, + st_ivas->hRenderConfig->split_rend_config.isar_frame_size_ms, + st_ivas->hRenderConfig->split_rend_config.codec_frame_size_ms, + splitRendBits, + p_Cldfb_RealBuffer_Binaural, + p_Cldfb_ImagBuffer_Binaural, + max_band, p_head_pose_buf, 1, cldfb_in_flag, pcm_out_flag, ro_md_flag, Q_buff, &Q_out[0] ) ), + IVAS_ERR_OK ) ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetSamplesRenderer( ) + * + * Main function to render the decoded data to output data + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetSamplesRenderer( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const Word16 nSamplesAsked, /* i : number of samples wanted by the caller */ + Word16 *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels Q0 */ + Word16 *nOutSamples, /* o : number of samples per channel written to output buffer */ + bool *needNewFrame /* o :indication that the decoder needs a new frame */ +) +{ + ivas_error error; + UWord16 nSamplesRendered, nSamplesRendered_loop; + UWord8 nOutChannels; + Decoder_Struct *st_ivas; + + nSamplesRendered = 0; + nOutChannels = 0; + nSamplesRendered_loop = 0; + move16(); + move16(); + move16(); + + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } - /* Feed decoded transport channels samples to the renderer */ - IF( NE_32( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer_fx ) ), IVAS_ERR_OK ) ) + /* the rendering needs to be prepared at this point */ + IF( hIvasDec->hasBeenPreparedRendering == false ) + { + return IVAS_ERR_UNKNOWN; + } + + st_ivas = hIvasDec->st_ivas; + + IF( hIvasDec->updateOrientation ) + { + /*----------------------------------------------------------------* + * Combine orientations + *----------------------------------------------------------------*/ + + IF( NE_32( ( error = combine_external_and_head_orientations_dec( st_ivas->hHeadTrackData, st_ivas->hExtOrientationData, st_ivas->hCombinedOrientationData ) ), IVAS_ERR_OK ) ) { return error; } - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + /*----------------------------------------------------------------* + * Binaural split rendering setup + *----------------------------------------------------------------*/ + + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - /* feed residual samples to TSM for the next call */ - IF( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (UWord16) nResidualSamples ) != 0 ) + IF( st_ivas->hCombinedOrientationData != NULL ) { - return IVAS_ERR_UNKNOWN; + isar_set_split_rend_ht_setup_fx( &st_ivas->hSplitBinRend->splitrend, st_ivas->hCombinedOrientationData->Quaternions, st_ivas->hCombinedOrientationData->Rmat_fx ); } } - hIvasDec->hasBeenFedFrame = false; + + hIvasDec->updateOrientation = false; move16(); } - /* render IVAS frames directly to the output buffer */ - nSamplesToRender = sub( nSamplesAsked, nSamplesRendered ); - IF( NE_32( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hIvasDec->nSamplesAvailableNext, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ) + test(); + IF( !hIvasDec->hasBeenFedFrame && hIvasDec->nSamplesAvailableNext == 0 ) { - return error; + /* no frame was fed, do nothing but ask for a frame */ + *needNewFrame = true; + *nOutSamples = 0; + hIvasDec->needNewFrame = true; + move16(); + move16(); + move16(); + + return IVAS_ERR_OK; + } + + /* check if we are still at the beginning with bad frames, put out zeroes, keep track of subframes */ + test(); + IF( !hIvasDec->isInitialized && st_ivas->bfi ) + { + hIvasDec->hasBeenFedFrame = false; + move16(); + set16_fx( pcmBuf, 0, imult1616( st_ivas->hDecoderConfig->nchan_out, nSamplesAsked ) ); + nSamplesRendered = nSamplesAsked; + move16(); + hIvasDec->nSamplesAvailableNext = sub( hIvasDec->nSamplesAvailableNext, nSamplesAsked ); + move16(); + } + ELSE + { + nOutChannels = (UWord8) st_ivas->hDecoderConfig->nchan_out; + hIvasDec->hasBeenFedFrame = false; + + /* check for possible flushed samples from a rate switch */ + IF( GT_16( hIvasDec->nSamplesFlushed, 0 ) ) + { + /* note: offset (rendered samples) is always 0 */ + Copy( hIvasDec->flushbuffer, pcmBuf, imult1616( hIvasDec->nSamplesFlushed, nOutChannels ) ); + + nSamplesRendered = hIvasDec->nSamplesFlushed; + hIvasDec->nSamplesFlushed = 0; + move16(); + move16(); + } + + /* render IVAS frames directly to the output buffer */ + IF( ( error = ivas_jbm_dec_render_fx( st_ivas, sub( nSamplesAsked, nSamplesRendered ), &nSamplesRendered_loop, &hIvasDec->nSamplesAvailableNext, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); } - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); - nSamplesToRender = sub( nSamplesToRender, nSamplesRendered_loop ); IF( hIvasDec->nSamplesAvailableNext == 0 ) { *needNewFrame = true; - hIvasDec->needNewFrame = true; move16(); + hIvasDec->needNewFrame = true; move16(); } ELSE @@ -1156,188 +1536,99 @@ ivas_error IVAS_DEC_GetSamples( *needNewFrame = false; move16(); } -} -} -*nOutSamples = nSamplesRendered; -move16(); + *nOutSamples = nSamplesRendered; + move16(); -return IVAS_ERR_OK; + return IVAS_ERR_OK; } /*---------------------------------------------------------------------* - * IVAS_DEC_Setup( ) - * + * IVAS_DEC_GetSplitBinauralBitstream( ) * + * Get split-rendering bitstream *---------------------------------------------------------------------*/ -static ivas_error IVAS_DEC_Setup( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - UWord16 *nTcBufferGranularity, /* o : granularity of the TC Buffer */ - UWord8 *nTransportChannels, /* o : number of decoded transport PCM channels */ - UWord8 *nOutChannels, /* o : number of decoded out channels (PCM or CLDFB) */ - UWord16 *nSamplesRendered, /* o : number of samples flushed from the last frame */ - Word16 *data /* o : output synthesis signal Q0 */ +ivas_error IVAS_DEC_GetSplitBinauralBitstream( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *pcmBuf_out, /* o : output synthesis signal for BINAURAL_SPLIT_PCM */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ + Word16 *nOutSamples, /* o : number of samples per channel written to output buffer */ + bool *needNewFrame /* o : indication that the decoder needs a new frame */ ) { + Decoder_Struct *st_ivas; ivas_error error; + Word32 head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; + Word32 *p_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; + Word16 i; + Word16 pcm_out_flag; + Word16 numSamplesPerChannelToOutput; + Word16 Q_out[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; + + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + + IF( EQ_16( is_split_rendering_enabled( st_ivas->hDecoderConfig, st_ivas->hRenderConfig ), 0 ) ) + { + return IVAS_ERR_WRONG_PARAMS; + } - *nSamplesRendered = 0; + numSamplesPerChannelToOutput = isar_get_frame_size( st_ivas ); move16(); + pcm_out_flag = 0; + move16(); + if ( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + pcm_out_flag = 1; + move16(); + } - IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) + IF( NE_32( ( error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, nOutSamples, needNewFrame ) ), IVAS_ERR_OK ) ) { - IF( EQ_16( (Word16) hIvasDec->st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) + return error; + } + + IF( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + return IVAS_ERR_OK; + } + + FOR( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) + { + p_head_pose_buf[i] = head_pose_buf[i]; + } + + IF( NE_32( ( error = isar_generate_metadata_and_bitstream( st_ivas, p_head_pose_buf, *nOutSamples, splitRendBits, Q_out ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* convert to int16 with limiting for BINAURAL_SPLIT_PCM */ + IF( pcm_out_flag ) + { + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) { - *nTransportChannels = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; - *nOutChannels = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; + scale_sig32( p_head_pose_buf[i], numSamplesPerChannelToOutput, sub( Q11, Q_out[i] ) ); // Q11 + } + IF( EQ_32( st_ivas->hDecoderConfig->render_framesize, IVAS_RENDER_FRAMESIZE_5MS ) ) + { +#ifndef DISABLE_LIMITER + ivas_limiter_dec_fx( st_ivas->hLimiter, p_head_pose_buf, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToOutput, st_ivas->BER_detect, Q11 ); +#endif } ELSE { - *nTransportChannels = 1; - *nOutChannels = 1; + ivas_limiter_dec_fx( st_ivas->hLimiter, p_head_pose_buf, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToOutput, st_ivas->BER_detect, Q11 ); } - move16(); - move16(); - } - ELSE - { - Decoder_Struct *st_ivas; - - st_ivas = hIvasDec->st_ivas; - - /*----------------------------------------------------------------* - * IVAS decoder setup - * - read IVAS format signaling - * - read IVAS format specific signaling - * - initialize decoder in the first frame based on IVAS format and number of transport channels - * - reconfigure the decoder when the number of TC or IVAS total bitrate change - *----------------------------------------------------------------*/ - - IF( st_ivas->bfi == 0 ) - { - Word32 ivas_total_brate; - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src = 0; - move16(); - - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( is_DTXrate( ivas_total_brate ) == 0 && ( !( st_ivas->ini_active_frame == 0 && NE_32( ivas_total_brate, FRAME_NO_DATA ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) && EQ_16( st_ivas->nCPE, 1 ) ) ) && st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 1] && st_ivas->ivas_format == MASA_FORMAT && st_ivas->last_ivas_format != MASA_FORMAT && ( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) && st_ivas->ini_active_frame == 0 ) ) - { - IF( st_ivas->hSpar ) - { - Word16 Q_tmp = getScaleFactor16( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, 16 ); - Scale_sig( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, 16, sub( Q_tmp, st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q ) ); - st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q = Q_tmp; - } - } - - test(); - test(); - test(); - test(); - test(); - IF( is_DTXrate( ivas_total_brate ) == 0 && EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) && GT_16( st_ivas->ini_frame, 0 ) && ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) && st_ivas->ini_active_frame == 0 ) - { - IF( st_ivas->hSpar ) - { - Word16 Q_tmp = getScaleFactor16( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, 16 ); - Scale_sig( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, 16, sub( Q_tmp, st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q ) ); - st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q = Q_tmp; - move16(); - } - } - - IF( NE_32( ( error = ivas_dec_setup( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - test(); - IF( ( st_ivas->ivas_format == MC_FORMAT ) && ( st_ivas->mc_mode == MC_MODE_PARAMMC ) ) - { - MC_LS_SETUP mc_ls_setup; - mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup_fx( st_ivas->transport_config ); - st_ivas->nchan_transport = ivas_param_mc_getNumTransportChannels_fx( ivas_total_brate, mc_ls_setup ); - } - - test(); - test(); - test(); - test(); - test(); - test(); - IF( is_DTXrate( ivas_total_brate ) == 0 && ( !( st_ivas->ini_active_frame == 0 && NE_32( ivas_total_brate, FRAME_NO_DATA ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) && EQ_16( st_ivas->nCPE, 1 ) ) ) && st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 1] && st_ivas->ivas_format == MASA_FORMAT && ( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) || st_ivas->ini_active_frame == 0 ) ) - { - IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - Word16 nchan_rend = num_src; - IF( EQ_16( st_ivas->ivas_format, MC_FORMAT ) && NE_16( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend--; /* Skip LFE channel -- added to the others */ - } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; - IF( Src_p->SrcSpatial_p != NULL ) - { - Src_p->SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - } - } - - - test(); - test(); - test(); - test(); - test(); - IF( is_DTXrate( ivas_total_brate ) == 0 && EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) && st_ivas->ini_frame > 0 && ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) && st_ivas->ini_active_frame == 0 ) - { - IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - Word16 nchan_rend = num_src; - test(); - IF( EQ_16( st_ivas->ivas_format, MC_FORMAT ) && NE_16( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend--; /* Skip LFE channel -- added to the others */ - } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; - IF( Src_p->SrcSpatial_p != NULL ) - { - Src_p->SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - } - } - } - - *nTransportChannels = (UWord8) st_ivas->hTcBuffer->nchan_transport_jbm; - *nTcBufferGranularity = (UWord16) st_ivas->hTcBuffer->n_samples_granularity; - *nOutChannels = (UWord8) st_ivas->hDecoderConfig->nchan_out; - move16(); - move16(); - move16(); + + ivas_syn_output_fx( p_head_pose_buf, Q11, numSamplesPerChannelToOutput, st_ivas->hDecoderConfig->nchan_out, pcmBuf_out ); } return IVAS_ERR_OK; @@ -1345,249 +1636,133 @@ static ivas_error IVAS_DEC_Setup( /*---------------------------------------------------------------------* - * IVAS_DEC_GetTcSamples( ) + * ivas_dec_setup_all() * - * Main function to decode to PCM data of the transport channels + * Set-up all decoder parts: IVAS decoder, ISAR *---------------------------------------------------------------------*/ -static ivas_error IVAS_DEC_GetTcSamples( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word32 *pcmBuf_fx, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels Q11 */ - Word16 *nOutSamples /* o : number of samples per channel written to output buffer */ +static ivas_error ivas_dec_setup_all( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + UWord8 *nTransportChannels, /* o : number of decoded transport PCM channels */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ ) { - Decoder_Struct *st_ivas; ivas_error error; - - test(); - IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - st_ivas = hIvasDec->st_ivas; - - *nOutSamples = (Word16) Mpy_32_16_1( st_ivas->hDecoderConfig->output_Fs, INV_FRAME_PER_SEC_Q15 ); - move16(); - IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) { - IF( NE_32( ( error = evs_dec_main_fx( st_ivas, *nOutSamples, pcmBuf_fx, NULL ) ), IVAS_ERR_OK ) ) + IF( EQ_16( (Word16) hIvasDec->st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) { - return error; + *nTransportChannels = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; + } + ELSE + { + *nTransportChannels = 1; } + move16(); } - ELSE IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_IVAS ) ) + ELSE { - /* run the main IVAS decoding routine */ - /*------------------------flt 2 fix----------------------*/ - Word16 n; - Decoder_State *st, **sts; /* used for bitstream handling */ - Word16 nCPE, cpe_id; - nCPE = st_ivas->nCPE; + Decoder_Struct *st_ivas; + + st_ivas = hIvasDec->st_ivas; - IF( st_ivas->hDecoderConfig->Opt_tsm == 0 ) + /* Setup IVAS split rendering */ + IF( splitRendBits != NULL ) { - FOR( n = 0; n < ivas_get_nchan_buffers_dec_ivas_fx( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) + IF( ( error = isar_set_split_rend_setup( st_ivas->hSplitBinRend, &st_ivas->hRenderConfig->split_rend_config, st_ivas->hCombinedOrientationData, splitRendBits ) ) != IVAS_ERR_OK ) { - set32_fx( st_ivas->p_output_fx[n], 0, L_FRAME48k ); - st_ivas->hTcBuffer->tc_fx[n] = st_ivas->p_output_fx[n]; // Q11 + return error; } } + /*----------------------------------------------------------------* + * IVAS decoder setup + * - read IVAS format signaling + * - read IVAS format specific signaling + * - initialize decoder in the first frame based on IVAS format and number of transport channels + * - reconfigure the decoder when the number of TC or IVAS total bitrate change + *----------------------------------------------------------------*/ - CPE_DEC_HANDLE hCPE; - test(); - test(); - test(); - test(); - test(); - IF( ( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) || EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) || ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) || EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) && ( GT_16( st_ivas->nCPE, 1 ) ) ) + IF( EQ_16( st_ivas->bfi, 0 ) ) { - - nCPE = st_ivas->nCPE; - move16(); - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + error = IVAS_ERR_OK; // this is just to help the clang-formatting keep alignments + IF( ( error = ivas_dec_setup( st_ivas ) ) != IVAS_ERR_OK ) { - hCPE = st_ivas->hCPE[cpe_id]; - sts = hCPE->hCoreCoder; - - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - st = hCPE->hCoreCoder[n]; - IF( st->hTcxDec ) - st->hTcxDec->conNoiseLevelIndex = st->hTcxDec->NoiseLevelIndex_bfi; - IF( st->hTcxDec ) - st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; - } + return error; } } - /* Function call: ivas_jbm_dec_tc function */ - IF( NE_32( ( error = ivas_jbm_dec_tc_fx( st_ivas, pcmBuf_fx ) ), IVAS_ERR_OK ) ) - { - return error; - } + *nTransportChannels = (UWord8) st_ivas->hTcBuffer->nchan_transport_jbm; + move16(); - hIvasDec->isInitialized = true; /* Initialization done in ivas_dec() */ + /*-----------------------------------------------------------------* + * ISAR: + * - initialize ISAR handle at the first frame + * - reconfigure the ISAR handle in case of bitrate switching (renderer might change) + *-----------------------------------------------------------------*/ test(); - test(); - test(); - test(); - test(); - test(); - IF( ( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) || EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) || ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) || EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) && ( GT_16( st_ivas->nCPE, 1 ) ) ) + IF( EQ_16( st_ivas->ini_frame, 0 ) && splitRendBits != NULL ) { - FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + IF( ( error = ivas_dec_init_split_rend( st_ivas ) ) != IVAS_ERR_OK ) { - hCPE = st_ivas->hCPE[cpe_id]; - sts = hCPE->hCoreCoder; - FOR( n = 0; n < 2; n++ ) - { - - /*-------------------cldfb-start-------------------------*/ - /*note : cldfb_size here signifies the original size which was assigned to cldfb_state_fx buffer not its current size*/ - IF( sts[n]->cldfbAna != NULL ) - { - scale_sig32( sts[n]->cldfbAna->cldfb_state_fx, sts[n]->cldfbAna->cldfb_size, sub( Q11, Q10 ) ); // Q11 - sts[n]->cldfbAna->Q_cldfb_state = Q11; - move16(); - } - IF( sts[n]->cldfbSyn != NULL ) - { - scale_sig32( sts[n]->cldfbSyn->cldfb_state_fx, sts[n]->cldfbSyn->cldfb_size, sub( Q11, Q4 ) ); // Q11 - sts[n]->cldfbSyn->Q_cldfb_state = Q11; - move16(); - } - /*-------------------cldfb-end---------------------------*/ - } + return error; } } - } - if ( hIvasDec->hasBeenFedFirstGoodFrame ) - { - hIvasDec->hasDecodedFirstGoodFrame = true; - move16(); - } - - return IVAS_ERR_OK; -} - - -/*---------------------------------------------------------------------* - * IVAS_DEC_Rendered_FeedTcSamples( ) - * - * Feed decoded transport channels samples to the renderer - *---------------------------------------------------------------------*/ - -static ivas_error IVAS_DEC_RendererFeedTcSamples( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const Word16 nSamplesForRendering, /* i : number of TC samples wanted from the renderer */ - Word16 *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call */ - Word32 *pcmBuf /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels Q11*/ -) -{ - Decoder_Struct *st_ivas; - test(); - IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; + test(); + IF( EQ_16( (Word16) st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( (Word16) st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + IF( ( error = ivas_dec_reconfig_split_rend( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } } - st_ivas = hIvasDec->st_ivas; - - /* feed the TCs to the IVAS renderer */ - ivas_jbm_dec_feed_tc_to_renderer_fx( st_ivas, nSamplesForRendering, nSamplesResidual, pcmBuf ); - return IVAS_ERR_OK; } /*---------------------------------------------------------------------* - * IVAS_DEC_GetRenderedSamples( ) - * - * Main function to render the transport channels to PCM output data - *---------------------------------------------------------------------*/ - -static ivas_error IVAS_DEC_GetRenderedSamples( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const UWord16 nSamplesForRendering, /* i : number of TC samples wanted from the renderer */ - UWord16 *nSamplesRendered, /* o : number of samples rendered */ - UWord16 *nSamplesAvailableNext, /* o : number of samples still available in the renerer pipeline */ - Word16 *pcmBuf // Q0 -) -{ - Decoder_Struct *st_ivas; - ivas_error error; - - test(); - IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - st_ivas = hIvasDec->st_ivas; - - /* run the main IVAS decoding routine */ - error = ivas_jbm_dec_render_fx( st_ivas, nSamplesForRendering, nSamplesRendered, nSamplesAvailableNext, pcmBuf ); - - return error; -} - - -/*---------------------------------------------------------------------* - * IVAS_DEC_GetBufferedNumberOfSamples( ) + * IVAS_DEC_GetNumObjects( ) * * Returns the number of objects available in the decoded bitstream *---------------------------------------------------------------------*/ -static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word16 *nSamplesBuffered /* o : number of samples still buffered */ +ivas_error IVAS_DEC_GetNumObjects( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + UWord16 *numObjects /* o : number of objects for which the decoder has been configured */ ) { - *nSamplesBuffered = 0; + Word16 is_masa_ism; + + is_masa_ism = 0; move16(); + test(); IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - /* check if the TC buffer already exists, otherweise nothing is buffered anyway */ - if ( hIvasDec->st_ivas->hTcBuffer != NULL ) + IF( hIvasDec->st_ivas->hMasa != NULL ) { - *nSamplesBuffered = sub( hIvasDec->st_ivas->hTcBuffer->n_samples_buffered, hIvasDec->st_ivas->hTcBuffer->n_samples_rendered ); - move16(); + IF( EQ_32( hIvasDec->st_ivas->hMasa->config.input_ivas_format, MASA_ISM_FORMAT ) ) + { + is_masa_ism = 1; + move16(); + } } - return IVAS_ERR_OK; -} - - -/*---------------------------------------------------------------------* - * IVAS_DEC_GetNumObjects( ) - * - * Returns the number of objects available in the decoded bitstream - *---------------------------------------------------------------------*/ - -ivas_error IVAS_DEC_GetNumObjects( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - UWord16 *numObjects /* o : number of objects for which the decoder has been configured */ -) -{ test(); - IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } test(); test(); - IF( EQ_16( (Word16) hIvasDec->st_ivas->ivas_format, ISM_FORMAT ) || EQ_16( (Word16) hIvasDec->st_ivas->ivas_format, SBA_ISM_FORMAT ) || EQ_16( (Word16) hIvasDec->st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + IF( EQ_32( hIvasDec->st_ivas->ivas_format, ISM_FORMAT ) || + EQ_32( hIvasDec->st_ivas->ivas_format, SBA_ISM_FORMAT ) || + EQ_32( hIvasDec->st_ivas->ivas_format, MASA_ISM_FORMAT ) || + EQ_16( is_masa_ism, 1 ) ) { *numObjects = hIvasDec->st_ivas->nchan_ism; } @@ -1613,6 +1788,12 @@ ivas_error IVAS_DEC_GetFormat( IVAS_DEC_BS_FORMAT *format /* o : format detected from bitstream fed to the decoder */ ) { + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + IF( hIvasDec->hasDecodedFirstGoodFrame ) { *format = mapIvasFormat( hIvasDec->st_ivas->ivas_format ); @@ -1623,14 +1804,24 @@ ivas_error IVAS_DEC_GetFormat( } move32(); + test(); + IF( EQ_32( *format, IVAS_DEC_BS_MASA ) && hIvasDec->st_ivas->hMasa != NULL ) + { + IF( EQ_32( hIvasDec->st_ivas->hMasa->config.input_ivas_format, MASA_ISM_FORMAT ) ) + { + *format = IVAS_DEC_BS_MASA_ISM; + move32(); + } + } + return IVAS_ERR_OK; } /*---------------------------------------------------------------------* - * getInputBufferSize() - * + * getOutputBufferSize() * + * Get size of output buffer in samples *---------------------------------------------------------------------*/ static Word16 getOutputBufferSize( @@ -1644,7 +1835,7 @@ static Word16 getOutputBufferSize( IF( EQ_16( (Word16) st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { - return extract_l( Mult_32_16( imult3216( st_ivas->hDecoderConfig->output_Fs, ( IVAS_MAX_OUTPUT_CHANNELS + IVAS_MAX_NUM_OBJECTS ) ), INV_FRAME_PER_SEC_Q15 ) ); + return extract_l( Mult_32_16( imult3216( st_ivas->hDecoderConfig->output_Fs, ( MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS ) ), INV_FRAME_PER_SEC_Q15 ) ); } ELSE IF( EQ_16( (Word16) st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { @@ -1665,7 +1856,7 @@ static Word16 getOutputBufferSize( /*---------------------------------------------------------------------* * IVAS_DEC_GetOutputBufferSize() * - * + * Returns size of output buffer in samples *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetOutputBufferSize( @@ -1705,6 +1896,12 @@ ivas_error IVAS_DEC_GetNumOutputChannels( Word16 *numOutputChannels /* o : number of PCM output channels */ ) { + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + IF( hIvasDec->hasDecodedFirstGoodFrame ) { *numOutputChannels = hIvasDec->st_ivas->hDecoderConfig->nchan_out; @@ -1724,15 +1921,20 @@ ivas_error IVAS_DEC_GetNumOutputChannels( * * Get metadata of one object decoded in the most recent frame *---------------------------------------------------------------------*/ + ivas_error IVAS_DEC_GetObjectMetadata( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_ISM_METADATA *metadata, /* o : struct where metadata decoded in most recently decoded frame will be written */ - const UWord16 zero_flag, /* i : if this flag is enabled, this function outputs a zero-initialized metadata struct */ - const UWord16 objectIdx /* i : index of the queried object */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_ISM_METADATA *metadata, /* o : struct where metadata decoded in most recently decoded frame will be written */ + const UWord16 zero_flag, /* i : if this flag is enabled, this function outputs a zero-initialized metadata struct */ + const UWord16 objectIdx /* i : index of the queried object */ ) { Decoder_Struct *st_ivas; ISM_METADATA_HANDLE hIsmMeta; + Word16 is_masa_ism; + + is_masa_ism = 0; + move16(); test(); IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) @@ -1741,9 +1943,23 @@ ivas_error IVAS_DEC_GetObjectMetadata( } st_ivas = hIvasDec->st_ivas; + + IF( st_ivas->hMasa != NULL ) + { + IF( EQ_32( hIvasDec->st_ivas->hMasa->config.input_ivas_format, MASA_ISM_FORMAT ) ) + { + is_masa_ism = 1; + move16(); + } + } + + test(); test(); - test(); - IF( NE_16( st_ivas->ivas_format, ISM_FORMAT ) && NE_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) && NE_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + test(); + IF( NE_32( st_ivas->ivas_format, ISM_FORMAT ) && + NE_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && + NE_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && + EQ_16( is_masa_ism, 0 ) ) { return IVAS_ERR_WRONG_MODE; } @@ -1755,7 +1971,12 @@ ivas_error IVAS_DEC_GetObjectMetadata( hIsmMeta = st_ivas->hIsmMetaData[objectIdx]; - IF( hIsmMeta == NULL || zero_flag ) + test(); + test(); + test(); + IF( hIsmMeta == NULL || + EQ_16( zero_flag, 1 ) || + ( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) ) { metadata->azimuth_fx = 0; // Q22 metadata->elevation_fx = 0; // Q22 @@ -1763,19 +1984,55 @@ ivas_error IVAS_DEC_GetObjectMetadata( metadata->yaw_fx = 0; // Q22 metadata->pitch_fx = 0; // Q22 metadata->spread_fx = 0; // Q22 - metadata->gainFactor_fx = ONE_IN_Q31; // Q31 + metadata->gainFactor_fx = ONE_IN_Q29; // Q31 metadata->non_diegetic_flag = 0; } ELSE { - metadata->azimuth_fx = hIsmMeta->azimuth_fx; // Q22 - metadata->elevation_fx = hIsmMeta->elevation_fx; // Q22 - metadata->radius_fx = hIsmMeta->radius_fx; // Q9 - metadata->yaw_fx = hIsmMeta->yaw_fx; // Q22 - metadata->pitch_fx = hIsmMeta->pitch_fx; // Q22 - metadata->spread_fx = 0; // Q22 - metadata->gainFactor_fx = ONE_IN_Q31; - metadata->non_diegetic_flag = hIsmMeta->non_diegetic_flag; + IF( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) ) + { + metadata->azimuth_fx = hIsmMeta->edited_azimuth_fx; + metadata->elevation_fx = hIsmMeta->edited_elevation_fx; + metadata->radius_fx = hIsmMeta->edited_radius_fx; + metadata->yaw_fx = hIsmMeta->edited_yaw_fx; + metadata->pitch_fx = hIsmMeta->edited_pitch_fx; + metadata->spread_fx = 0; + metadata->gainFactor_fx = hIsmMeta->edited_gain_fx; + metadata->non_diegetic_flag = hIsmMeta->non_diegetic_flag; + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + metadata->azimuth_fx = st_ivas->hParamIsmDec->edited_azimuth_values_fx[objectIdx]; + metadata->elevation_fx = st_ivas->hParamIsmDec->edited_elevation_values_fx[objectIdx]; + metadata->radius_fx = hIsmMeta->radius_fx; + metadata->yaw_fx = hIsmMeta->yaw_fx; + metadata->pitch_fx = hIsmMeta->pitch_fx; + metadata->spread_fx = 0; + metadata->gainFactor_fx = ONE_IN_Q29; + metadata->non_diegetic_flag = hIsmMeta->non_diegetic_flag; + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + metadata->azimuth_fx = st_ivas->hIsmMetaData[objectIdx]->edited_azimuth_fx; + metadata->elevation_fx = st_ivas->hIsmMetaData[objectIdx]->edited_elevation_fx; + metadata->radius_fx = st_ivas->hIsmMetaData[objectIdx]->edited_radius_fx; + metadata->yaw_fx = st_ivas->hIsmMetaData[objectIdx]->edited_yaw_fx; + metadata->pitch_fx = st_ivas->hIsmMetaData[objectIdx]->edited_pitch_fx; + metadata->spread_fx = 0; + metadata->gainFactor_fx = st_ivas->hIsmMetaData[objectIdx]->edited_gain_fx; + metadata->non_diegetic_flag = st_ivas->hIsmMetaData[objectIdx]->non_diegetic_flag; + } + ELSE + { + metadata->azimuth_fx = hIsmMeta->azimuth_fx; // Q22 + metadata->elevation_fx = hIsmMeta->elevation_fx; // Q22 + metadata->radius_fx = hIsmMeta->radius_fx; // Q9 + metadata->yaw_fx = hIsmMeta->yaw_fx; // Q22 + metadata->pitch_fx = hIsmMeta->pitch_fx; // Q22 + metadata->spread_fx = 0; // Q22 + metadata->gainFactor_fx = ONE_IN_Q29; + metadata->non_diegetic_flag = hIsmMeta->non_diegetic_flag; + } } move32(); @@ -1786,9 +2043,11 @@ ivas_error IVAS_DEC_GetObjectMetadata( move32(); move16(); move16(); + return IVAS_ERR_OK; } + /*---------------------------------------------------------------------* * IVAS_DEC_GetMasaMetadata( ) * @@ -1831,10 +2090,11 @@ ivas_error IVAS_DEC_GetMasaMetadata( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_FeedHeadTrackData( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_QUATERNION orientation, /* i : head-tracking data, listener orientation */ - IVAS_VECTOR3 Pos, /* i : listener position */ - const Word16 subframe_idx /* i : subframe index */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION orientation, /* i : head-tracking data, listener orientation */ + IVAS_VECTOR3 Pos, /* i : listener position */ + const Word16 subframe_idx, /* i : subframe index */ + const ISAR_SPLIT_REND_ROT_AXIS rot_axis /* i : external control for rotation axis for split rendering */ ) { HEAD_TRACK_DATA_HANDLE hHeadTrackData; @@ -1855,9 +2115,11 @@ ivas_error IVAS_DEC_FeedHeadTrackData( /* Move head-tracking data to the decoder handle */ /* check for Euler angle signaling */ - IF( EQ_32( orientation.w_fx, -1610612736 /* -3.0f in Q29 */ ) ) + /* check for Euler angle signaling */ + IF( EQ_32( orientation.w_fx, L_negate( 12582912 ) ) && EQ_16( orientation.q_fact, Q22 ) ) { Euler2Quat_fx( deg2rad_fx( orientation.x_fx ), deg2rad_fx( orientation.y_fx ), deg2rad_fx( orientation.z_fx ), &orientation ); + modify_Quat_q_fx( &orientation, &orientation, Q29 ); } Word32 updateRate_fx = 1677721600; // value is 200 in Q23 @@ -1896,6 +2158,9 @@ ivas_error IVAS_DEC_FeedHeadTrackData( move32(); move16(); + hHeadTrackData->sr_pose_pred_axis = rot_axis; + move32(); + hIvasDec->updateOrientation = true; move16(); @@ -1906,7 +2171,7 @@ ivas_error IVAS_DEC_FeedHeadTrackData( /*---------------------------------------------------------------------* * IVAS_DEC_FeedRefRotData( ) * - * Feed the decoder with the reference rotation + * Feed the decoder with the reference rotation data *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_FeedRefRotData( @@ -1973,10 +2238,10 @@ ivas_error IVAS_DEC_FeedRefVectorData( hIvasDec->updateOrientation = true; move16(); - ivas_error error_fx = ivas_orient_trk_SetReferenceVector_fx( pOtr, listenerPos, refPos ); - return error_fx; + return ivas_orient_trk_SetReferenceVector_fx( pOtr, listenerPos, refPos ); } + /*---------------------------------------------------------------------* * IVAS_DEC_FeedExternalOrientationData( ) * @@ -2007,8 +2272,10 @@ ivas_error IVAS_DEC_FeedExternalOrientationData( { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } + orientation.q_fact = Q29; move16(); + /* Move external orientation data to the decoder handle (invert orientations) */ QuaternionInverse_fx( orientation, &hExternalOrientationData->Quaternions[subframe_idx] ); @@ -2090,14 +2357,14 @@ ivas_error IVAS_DEC_FeedCustomLsData( /*---------------------------------------------------------------------* - * IVAS_DEC_GetHrtfHandle( ) - * + * IVAS_DEC_GetHrtfTDrendHandle( ) * + * Get TD binaural renderer handle *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_GetHrtfHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_HANDLE *hHrtfTD /* o : HRTF handle */ +ivas_error IVAS_DEC_GetHrtfTDrendHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_TD_HANDLE **hHrtfTD /* o : TD rend. HRTF handle */ ) { test(); @@ -2107,7 +2374,7 @@ ivas_error IVAS_DEC_GetHrtfHandle( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - *hHrtfTD = hIvasDec->st_ivas->hHrtfTD; + *hHrtfTD = &hIvasDec->st_ivas->hHrtfTD; return IVAS_ERR_OK; } @@ -2116,22 +2383,22 @@ ivas_error IVAS_DEC_GetHrtfHandle( /*---------------------------------------------------------------------* * IVAS_DEC_GetHrtfCRendHandle( ) * - * + * Get Crend binaural renderer handle *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetHrtfCRendHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* o : Set of HRTF handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_CREND_HANDLE **hHrtfCrend /* o : Crend HRTF handle */ ) { test(); test(); - IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hSetOfHRTF == NULL ) + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hHrtfCrend == NULL ) { return IVAS_ERR_WRONG_PARAMS; } - *hSetOfHRTF = hIvasDec->st_ivas->hSetOfHRTF; + *hHrtfCrend = &hIvasDec->st_ivas->hHrtfCrend; return IVAS_ERR_OK; } @@ -2140,12 +2407,12 @@ ivas_error IVAS_DEC_GetHrtfCRendHandle( /*---------------------------------------------------------------------* * IVAS_DEC_GetHrtfFastConvHandle( ) * - * + * Get FastConv binaural renderer handle *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetHrtfFastConvHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* o : FASTCONV HRTF handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_FASTCONV_HANDLE **hHrtfFastConv /* o : FASTCONV HRTF handle */ ) { test(); @@ -2155,7 +2422,7 @@ ivas_error IVAS_DEC_GetHrtfFastConvHandle( return IVAS_ERR_WRONG_PARAMS; } - *hHrtfFastConv = hIvasDec->st_ivas->hHrtfFastConv; + *hHrtfFastConv = &hIvasDec->st_ivas->hHrtfFastConv; return IVAS_ERR_OK; } @@ -2164,12 +2431,12 @@ ivas_error IVAS_DEC_GetHrtfFastConvHandle( /*---------------------------------------------------------------------* * IVAS_DEC_GetHrtfParamBinHandle( ) * - * + * Get Parametric binaural renderer handle *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetHrtfParamBinHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* o : Parametric binauralizer HRTF handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ ) { test(); @@ -2179,766 +2446,3329 @@ ivas_error IVAS_DEC_GetHrtfParamBinHandle( return IVAS_ERR_WRONG_PARAMS; } - *hHrtfParambin = hIvasDec->st_ivas->hHrtfParambin; + *hHrtfParambin = &hIvasDec->st_ivas->hHrtfParambin; return IVAS_ERR_OK; } + /*---------------------------------------------------------------------* - * copyRendererConfigStruct( ) - * + * IVAS_DEC_GetHrtfStatisticsHandle( ) * + * Get HRTF statistics (room effect) binaural renderer handle *---------------------------------------------------------------------*/ -static ivas_error copyRendererConfigStruct( - RENDER_CONFIG_HANDLE hRCin, - IVAS_RENDER_CONFIG_HANDLE hRCout ) +ivas_error IVAS_DEC_GetHrtfStatisticsHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_STATISTICS_HANDLE **hHrtfStatistics /* o : HRTF statistics handle */ +) { test(); - IF( hRCin == NULL || hRCout == NULL ) + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hHrtfStatistics == NULL ) { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; + return IVAS_ERR_WRONG_PARAMS; } - hRCout->roomAcoustics.override = hRCin->roomAcoustics.override; - hRCout->roomAcoustics.nBands = hRCin->roomAcoustics.nBands; - hRCout->roomAcoustics.acousticPreDelay_fx = hRCin->roomAcoustics.acousticPreDelay_fx; - hRCout->roomAcoustics.inputPreDelay_fx = hRCin->roomAcoustics.inputPreDelay_fx; - - Copy32( hRCin->roomAcoustics.pFc_input_fx, hRCout->roomAcoustics.pFc_input_fx, CLDFB_NO_CHANNELS_MAX ); // Q16 - Copy32( hRCin->roomAcoustics.pAcoustic_rt60_fx, hRCout->roomAcoustics.pAcoustic_rt60_fx, CLDFB_NO_CHANNELS_MAX ); // Q26 - Copy32( hRCin->roomAcoustics.pAcoustic_dsr_fx, hRCout->roomAcoustics.pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX ); // Q30 - Copy( hRCin->directivity_fx, hRCout->directivity_fx, 3 * MAX_NUM_OBJECTS ); - hRCout->roomAcoustics.use_er = hRCin->roomAcoustics.use_er; - hRCout->roomAcoustics.lowComplexity = hRCin->roomAcoustics.lowComplexity; - move16(); - move16(); - move16(); - move32(); - move32(); - move32(); + *hHrtfStatistics = &hIvasDec->st_ivas->hHrtfStatistics; return IVAS_ERR_OK; } /*---------------------------------------------------------------------* - * IVAS_DEC_GetRenderConfig( ) - * + * IVAS_DEC_HRTF_binary_open( ) * + * Allocate HRTF binary handles *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_GetRenderConfig( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render configuration handle */ +ivas_error IVAS_DEC_HRTF_binary_open( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_BIN_RENDERER_TYPE binaural_renderer /* i : binaural renderer type */ ) { + ivas_error error; + Decoder_Struct *st_ivas; + + st_ivas = hIvasDec->st_ivas; + test(); - test(); - test(); - IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hRenderConfig == NULL || hRCout == NULL ) + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - return copyRendererConfigStruct( hIvasDec->st_ivas->hRenderConfig, hRCout ); -} - -/*! r: error code*/ -ivas_error IVAS_DEC_GetDefaultRenderConfig( - IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render config handle */ -) -{ - RENDER_CONFIG_DATA RCin; - RENDER_CONFIG_HANDLE hRCin = &RCin; - ivas_error error; - IF( NE_32( ( error = ivas_render_config_init_from_rom_fx( &hRCin ) ), IVAS_ERR_OK ) ) + IF( st_ivas->hDecoderConfig->Opt_HRTF_binary ) { - return error; + /* TD binaural renderer */ + test(); + test(); + IF( ( EQ_32( binaural_renderer, IVAS_BIN_RENDERER_TYPE_TDREND ) || EQ_32( binaural_renderer, IVAS_BIN_RENDERER_TYPE_DEFAULT ) ) && st_ivas->hHrtfTD == NULL ) + { + IF( ( error = ivas_HRTF_binary_open_fx( &( st_ivas->hHrtfTD ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Crend binaural renderer */ + test(); + test(); + IF( ( EQ_32( binaural_renderer, IVAS_BIN_RENDERER_TYPE_CREND ) || EQ_32( binaural_renderer, IVAS_BIN_RENDERER_TYPE_DEFAULT ) ) && st_ivas->hHrtfCrend == NULL ) + { + IF( ( error = ivas_HRTF_CRend_binary_open_fx( &( st_ivas->hHrtfCrend ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* FastConv binaural renderer */ + test(); + test(); + IF( ( EQ_32( binaural_renderer, IVAS_BIN_RENDERER_TYPE_FASTCONV ) || EQ_32( binaural_renderer, IVAS_BIN_RENDERER_TYPE_DEFAULT ) ) && st_ivas->hHrtfFastConv == NULL ) + { + IF( ( error = ivas_HRTF_fastconv_binary_open_fx( &st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Parametric binaural renderer */ + test(); + test(); + IF( ( EQ_32( binaural_renderer, IVAS_BIN_RENDERER_TYPE_PARAMBIN ) || EQ_32( binaural_renderer, IVAS_BIN_RENDERER_TYPE_DEFAULT ) ) && st_ivas->hHrtfParambin == NULL ) + { + IF( ( error = ivas_HRTF_parambin_binary_open_fx( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + test(); + test(); + test(); + IF( st_ivas->hHrtfStatistics == NULL && ( EQ_32( binaural_renderer, IVAS_BIN_RENDERER_TYPE_FASTCONV ) || EQ_32( binaural_renderer, IVAS_BIN_RENDERER_TYPE_CREND ) ) && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + IF( ( error = ivas_HRTF_statistics_binary_open_fx( &st_ivas->hHrtfStatistics ) ) != IVAS_ERR_OK ) + { + return error; + } + } } - return copyRendererConfigStruct( hRCin, hRCout ); + return IVAS_ERR_OK; } /*---------------------------------------------------------------------* - * IVAS_DEC_FeedRenderConfig( ) - * + * IVAS_DEC_HRTF_binary_close( ) * + * Deallocate HRTF binary handles *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_FeedRenderConfig( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const IVAS_RENDER_CONFIG_DATA renderConfig /* i : Render configuration struct */ +ivas_error IVAS_DEC_HRTF_binary_close( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_BIN_RENDERER_TYPE binaural_renderer_old /* i : previous binaural renderer type */ ) { - RENDER_CONFIG_HANDLE hRenderConfig; + Decoder_Struct *st_ivas; test(); - test(); - IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hRenderConfig == NULL ) + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - hRenderConfig = hIvasDec->st_ivas->hRenderConfig; - hRenderConfig->roomAcoustics.override = renderConfig.roomAcoustics.override; - hRenderConfig->roomAcoustics.nBands = renderConfig.roomAcoustics.nBands; - hRenderConfig->roomAcoustics.acousticPreDelay_fx = renderConfig.roomAcoustics.acousticPreDelay_fx; - hRenderConfig->roomAcoustics.inputPreDelay_fx = renderConfig.roomAcoustics.inputPreDelay_fx; + st_ivas = hIvasDec->st_ivas; - hRenderConfig->roomAcoustics.use_er = 0; - move16(); - move16(); - move16(); - move32(); - move32(); - IF( EQ_16( renderConfig.roomAcoustics.use_er, 1 ) ) + test(); + IF( st_ivas->hDecoderConfig->Opt_HRTF_binary && st_ivas->ini_frame > 0 ) { - hRenderConfig->roomAcoustics.use_er = renderConfig.roomAcoustics.use_er; - hRenderConfig->roomAcoustics.lowComplexity = renderConfig.roomAcoustics.lowComplexity; - hRenderConfig->roomAcoustics.dimensions = renderConfig.roomAcoustics.dimensions; - hRenderConfig->roomAcoustics.ListenerOrigin = renderConfig.roomAcoustics.ListenerOrigin; + test(); + IF( !( EQ_32( binaural_renderer_old, IVAS_BIN_RENDERER_TYPE_TDREND ) || EQ_32( binaural_renderer_old, IVAS_BIN_RENDERER_TYPE_DEFAULT ) ) ) + { + ivas_HRTF_binary_close_fx( &st_ivas->hHrtfTD ); + } - Copy32( renderConfig.roomAcoustics.AbsCoeff_fx, hRenderConfig->roomAcoustics.AbsCoeff_fx, IVAS_ROOM_ABS_COEFF ); - move16(); - move32(); - } + test(); + IF( !( EQ_32( binaural_renderer_old, IVAS_BIN_RENDERER_TYPE_CREND ) || EQ_32( binaural_renderer_old, IVAS_BIN_RENDERER_TYPE_DEFAULT ) ) ) + { + /* CRend binaural renderer handle */ + ivas_HRTF_CRend_binary_close_fx( &st_ivas->hHrtfCrend ); + } - Copy32( renderConfig.roomAcoustics.pFc_input_fx, hRenderConfig->roomAcoustics.pFc_input_fx, CLDFB_NO_CHANNELS_MAX ); // Q16 - Copy32( renderConfig.roomAcoustics.pAcoustic_rt60_fx, hRenderConfig->roomAcoustics.pAcoustic_rt60_fx, CLDFB_NO_CHANNELS_MAX ); // Q26 - Copy32( renderConfig.roomAcoustics.pAcoustic_dsr_fx, hRenderConfig->roomAcoustics.pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX ); // Q30 + test(); + IF( !( EQ_32( binaural_renderer_old, IVAS_BIN_RENDERER_TYPE_FASTCONV ) || EQ_32( binaural_renderer_old, IVAS_BIN_RENDERER_TYPE_DEFAULT ) ) ) + { + /* Fastconv HRTF memories */ + ivas_binaural_hrtf_close_fx( &st_ivas->hHrtfFastConv ); - Copy( renderConfig.directivity_fx, hRenderConfig->directivity_fx, 3 * MAX_NUM_OBJECTS ); + /* Fastconv HRTF filters */ + ivas_HRTF_fastconv_binary_close_fx( &st_ivas->hHrtfFastConv ); + } + + test(); + IF( !( EQ_32( binaural_renderer_old, IVAS_BIN_RENDERER_TYPE_PARAMBIN ) || EQ_32( binaural_renderer_old, IVAS_BIN_RENDERER_TYPE_DEFAULT ) ) ) + { + /* Parametric binauralizer HRTF filters */ + ivas_HRTF_parambin_binary_close_fx( &st_ivas->hHrtfParambin ); + } + } return IVAS_ERR_OK; } /*---------------------------------------------------------------------* - * IVAS_DEC_GetDelay( ) - * + * IVAS_DEC_AddAcousticEnvironment( ) * + * Adds acoustic environment configuration *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_GetDelay( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word16 *nSamples, /* o : decoder delay in samples */ - Word32 *timeScale /* o : time scale of the delay, equal to decoder output sampling rate */ +ivas_error IVAS_DEC_AddAcousticEnvironment( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_ROOM_ACOUSTICS_CONFIG_DATA roomAcousticsConfig /* i : Room acoustic configuration */ ) { + Word16 n; Decoder_Struct *st_ivas; - DECODER_CONFIG_HANDLE hDecoderConfig; - Word32 out_fs_fx; + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pAE = NULL; test(); test(); test(); - IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || nSamples == NULL || timeScale == NULL ) + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || ( hIvasDec->st_ivas->acousticEnvironmentsCount > 0 && hIvasDec->st_ivas->pAcousticEnvironments == NULL ) ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - IF( !hIvasDec->hasDecodedFirstGoodFrame ) + st_ivas = hIvasDec->st_ivas; + + /* Check if already there */ + FOR( n = 0; n < st_ivas->acousticEnvironmentsCount; n++ ) { - /* Delay depends on IVAS format, which is unknown until first frame has been decoded */ - return IVAS_ERR_WAITING_FOR_BITSTREAM; + IF( st_ivas->pAcousticEnvironments[n].aeID == roomAcousticsConfig.aeID ) + { + move32(); + pAE = &st_ivas->pAcousticEnvironments[n]; + break; + } } - st_ivas = hIvasDec->st_ivas; - hDecoderConfig = st_ivas->hDecoderConfig; - - IF( NE_32( hDecoderConfig->output_Fs, 48000 ) ) + /* If not found */ + IF( pAE == NULL ) { - IF( NE_32( hDecoderConfig->output_Fs, 32000 ) ) + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *ppAE = malloc( ( st_ivas->acousticEnvironmentsCount + 1 ) * sizeof( IVAS_ROOM_ACOUSTICS_CONFIG_DATA ) ); + + IF( ppAE == NULL ) { - out_fs_fx = FS_16K_IN_NS_Q31; + return IVAS_ERR_FAILED_ALLOC; } - ELSE + + FOR( n = 0; n < st_ivas->acousticEnvironmentsCount; n++ ) { - out_fs_fx = FS_32K_IN_NS_Q31; + pAE = &ppAE[n]; + pAE->aeID = st_ivas->pAcousticEnvironments[n].aeID; + pAE->nBands = st_ivas->pAcousticEnvironments[n].nBands; + pAE->acousticPreDelay_fx = st_ivas->pAcousticEnvironments[n].acousticPreDelay_fx; + pAE->inputPreDelay_fx = st_ivas->pAcousticEnvironments[n].inputPreDelay_fx; + + Copy32( st_ivas->pAcousticEnvironments[n].pFc_input_fx, pAE->pFc_input_fx, CLDFB_NO_CHANNELS_MAX ); // Q16 + Copy32( st_ivas->pAcousticEnvironments[n].pAcoustic_rt60_fx, pAE->pAcoustic_rt60_fx, CLDFB_NO_CHANNELS_MAX ); // Q26 + Copy32( st_ivas->pAcousticEnvironments[n].pAcoustic_dsr_fx, pAE->pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX ); // Q30 + + pAE->use_er = st_ivas->pAcousticEnvironments[n].use_er; + + move16(); + move16(); + move32(); + move32(); + move16(); + + IF( EQ_16( pAE->use_er, 1 ) ) + { + pAE->lowComplexity = st_ivas->pAcousticEnvironments[n].lowComplexity; + move32(); + + pAE->dimensions.x_fx = st_ivas->pAcousticEnvironments[n].dimensions.x_fx; + pAE->dimensions.y_fx = st_ivas->pAcousticEnvironments[n].dimensions.y_fx; + pAE->dimensions.z_fx = st_ivas->pAcousticEnvironments[n].dimensions.z_fx; + move32(); + move32(); + move32(); + + pAE->ListenerOrigin.x_fx = st_ivas->pAcousticEnvironments[n].ListenerOrigin.x_fx; + pAE->ListenerOrigin.y_fx = st_ivas->pAcousticEnvironments[n].ListenerOrigin.y_fx; + pAE->ListenerOrigin.z_fx = st_ivas->pAcousticEnvironments[n].ListenerOrigin.z_fx; + move32(); + move32(); + move32(); + + Copy32( st_ivas->pAcousticEnvironments[n].AbsCoeff_fx, pAE->AbsCoeff_fx, IVAS_ROOM_ABS_COEFF ); + } } - } - ELSE - { - out_fs_fx = FS_48K_IN_NS_Q31; - } - move32(); - nSamples[1] = NS2SA_FX2( hDecoderConfig->output_Fs, get_delay_fx( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbAnaDec[0] ) ); - move16(); - nSamples[2] = extract_l( W_round64_L( W_mult0_32_32( L_shl( st_ivas->binaural_latency_ns, 1 ), out_fs_fx ) ) ); - move16(); - nSamples[0] = add( nSamples[1], nSamples[2] ); - move16(); + free( st_ivas->pAcousticEnvironments ); + st_ivas->pAcousticEnvironments = ppAE; - IF( EQ_16( (Word16) st_ivas->ivas_format, MASA_FORMAT ) ) - { - /* note: in MASA, all delay is compensated at the decoder by default, so subtract the encoder delay for print-out */ - nSamples[1] = sub( nSamples[1], NS2SA_FX2( hDecoderConfig->output_Fs, IVAS_ENC_DELAY_NS ) ); + n = st_ivas->acousticEnvironmentsCount++; + pAE = &st_ivas->pAcousticEnvironments[n]; + move32(); move16(); + move32(); } - *timeScale = hDecoderConfig->output_Fs; - move32(); + pAE->aeID = roomAcousticsConfig.aeID; + pAE->nBands = roomAcousticsConfig.nBands; + pAE->acousticPreDelay_fx = roomAcousticsConfig.acousticPreDelay_fx; + pAE->inputPreDelay_fx = roomAcousticsConfig.inputPreDelay_fx; - return IVAS_ERR_OK; -} + Copy32( roomAcousticsConfig.pFc_input_fx, pAE->pFc_input_fx, CLDFB_NO_CHANNELS_MAX ); // Q16 + Copy32( roomAcousticsConfig.pAcoustic_rt60_fx, pAE->pAcoustic_rt60_fx, CLDFB_NO_CHANNELS_MAX ); // Q26 + Copy32( roomAcousticsConfig.pAcoustic_dsr_fx, pAE->pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX ); // Q30 + pAE->use_er = roomAcousticsConfig.use_er; -/*---------------------------------------------------------------------* - * IVAS_DEC_HasDecodedFirstGoodFrame( ) - * - * - *---------------------------------------------------------------------*/ + move16(); + move16(); + move32(); + move32(); + move16(); -ivas_error IVAS_DEC_HasDecodedFirstGoodFrame( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - bool *hasDecodedFirstGoodFrame /* o : flag indicating if the decoder has decoded a good frame since it was configured */ -) -{ - test(); - test(); - IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hasDecodedFirstGoodFrame == NULL ) + IF( EQ_16( pAE->use_er, 1 ) ) { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } + pAE->lowComplexity = roomAcousticsConfig.lowComplexity; + move32(); - *hasDecodedFirstGoodFrame = hIvasDec->hasDecodedFirstGoodFrame; - move16(); + pAE->dimensions.x_fx = roomAcousticsConfig.dimensions.x_fx; + pAE->dimensions.y_fx = roomAcousticsConfig.dimensions.y_fx; + pAE->dimensions.z_fx = roomAcousticsConfig.dimensions.z_fx; + move32(); + move32(); + move32(); + + pAE->ListenerOrigin.x_fx = roomAcousticsConfig.ListenerOrigin.x_fx; + pAE->ListenerOrigin.y_fx = roomAcousticsConfig.ListenerOrigin.y_fx; + pAE->ListenerOrigin.z_fx = roomAcousticsConfig.ListenerOrigin.z_fx; + move32(); + move32(); + move32(); + + Copy32( roomAcousticsConfig.AbsCoeff_fx, pAE->AbsCoeff_fx, IVAS_ROOM_ABS_COEFF ); + } return IVAS_ERR_OK; } /*---------------------------------------------------------------------* - * IVAS_DEC_GetPcmFrameSize( ) - * + * IVAS_DEC_GetAcousticEnvironment( ) * + * Gets acoustic environment configuration with a given ID *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_GetPcmFrameSize( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word32 *pcmFrameSize /* o : total size of the PCM output frame. This takes into account the number of output channels Q0 */ +ivas_error IVAS_DEC_GetAcousticEnvironment( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + UWord16 aeID, /* i : Acoustic environment ID */ + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pAcEnv /* o : Room acoustic environment data pointer */ ) { + Word16 n, m; + Word16 found = 0; + move16(); + Decoder_Struct *st_ivas; + test(); - test(); - IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || pcmFrameSize == NULL ) + IF( hIvasDec == NULL || pAcEnv == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - IF( hIvasDec->hasDecodedFirstGoodFrame ) - { - *pcmFrameSize = Mult_32_16( imult3216( hIvasDec->st_ivas->hDecoderConfig->output_Fs, hIvasDec->st_ivas->hDecoderConfig->nchan_out ), INV_FRAME_PER_SEC_Q15 ); - } - ELSE - { - *pcmFrameSize = 0; - } + st_ivas = hIvasDec->st_ivas; move32(); - return IVAS_ERR_OK; -} - - -/*---------------------------------------------------------------------* - * isSidFrame( ) - * - * Check if a frame contains a SID - *---------------------------------------------------------------------*/ - -static bool isSidFrame( - const UWord16 size ) -{ - IF( EQ_16( size, ( SID_1k75 / FRAMES_PER_SEC ) ) ) - { - return true; /* AMR-WB SID */ - } - ELSE IF( EQ_16( size, ( SID_2k40 / FRAMES_PER_SEC ) ) ) - { - return true; /* EVS SID */ - } - ELSE IF( EQ_16( size, ( IVAS_SID_5k2 / FRAMES_PER_SEC ) ) ) + /* In case of default AE ID, select the first one available */ + test(); + IF( aeID == (UWord16) IVAS_DEFAULT_AEID && st_ivas->acousticEnvironmentsCount > 0 ) { - return true; /* IVAS SID */ + aeID = st_ivas->pAcousticEnvironments[0].aeID; + move32(); } - return false; -} - -static void bsCompactToSerial( const UWord8 *compact, UWord16 *serial, UWord16 num_bits ) -{ -/* Bitstream conversion is not counted towards complexity and memory usage */ -#define WMC_TOOL_SKIP - UWord32 i; - UWord8 byte = 0; - const UWord8 mask = 0x80; - move16(); - move16(); - - FOR( i = 0; i < num_bits; ++i ) + FOR( n = 0; n < st_ivas->acousticEnvironmentsCount; n++ ) { - if ( ( i % 8 ) == 0 ) + IVAS_ROOM_ACOUSTICS_CONFIG_DATA ae = st_ivas->pAcousticEnvironments[n]; + move32(); + IF( aeID == ae.aeID ) { - byte = compact[i / 8]; + found = 1; + pAcEnv->aeID = aeID; + pAcEnv->nBands = ae.nBands; + pAcEnv->inputPreDelay_fx = ae.inputPreDelay_fx; move16(); - } + move16(); + move16(); + move32(); - serial[i] = shr( s_and( byte, mask ), 7 ); - move16(); + FOR( m = 0; m < pAcEnv->nBands; m++ ) + { + pAcEnv->pFc_input_fx[m] = ae.pFc_input_fx[m]; + pAcEnv->pAcoustic_rt60_fx[m] = ae.pAcoustic_rt60_fx[m]; + pAcEnv->pAcoustic_dsr_fx[m] = ae.pAcoustic_dsr_fx[m]; + move32(); + move32(); + move32(); + } - byte = (UWord8) shl( byte, 1 ); + /* If ER are allocated then propagate parameters */ + pAcEnv->use_er = ae.use_er; + move16(); + + IF( ae.use_er != 0 ) + { + pAcEnv->lowComplexity = ae.lowComplexity; + move32(); + + pAcEnv->dimensions.x_fx = ae.dimensions.x_fx; + pAcEnv->dimensions.y_fx = ae.dimensions.y_fx; + pAcEnv->dimensions.z_fx = ae.dimensions.z_fx; + move32(); + move32(); + move32(); + + pAcEnv->ListenerOrigin.x_fx = ae.ListenerOrigin.x_fx; + pAcEnv->ListenerOrigin.y_fx = ae.ListenerOrigin.y_fx; + pAcEnv->ListenerOrigin.z_fx = ae.ListenerOrigin.z_fx; + move32(); + move32(); + move32(); + + Copy32( ae.AbsCoeff_fx, pAcEnv->AbsCoeff_fx, IVAS_ROOM_ABS_COEFF ); + } + } } - /* Add 4 padding bytes required by core coder */ - FOR( i = 0; i < 4 * 8; ++i ) + IF( found == 0 ) { - serial[( num_bits + i )] = 0; - move16(); + return IVAS_ERR_ACOUSTIC_ENVIRONMENT_MISSING; + } + ELSE + { + return IVAS_ERR_OK; } -#undef WMC_TOOL_SKIP } /*---------------------------------------------------------------------* - * IVAS_DEC_VoIP_FeedFrame( ) + * copyRendererConfigStruct( ) + * * - * Feed RTP packet into internal jitter buffer *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_VoIP_FeedFrame( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - UWord8 *au, /* i : buffer containing input access unit */ - const UWord16 auSize, /* i : size of the access unit */ - const UWord16 rtpSequenceNumber, /* i : RTP sequence number (16 bits) */ - const UWord32 rtpTimeStamp, /* i : RTP timestamp (32 bits) */ - const UWord32 rcvTime_ms, /* i : receive time of the RTP packet in milliseconds */ - const bool qBit /* i : Q bit for AMR-WB IO */ -) +static ivas_error copyRendererConfigStruct( + RENDER_CONFIG_HANDLE hRCin, + IVAS_RENDER_CONFIG_HANDLE hRCout ) { - JB4_DATAUNIT_HANDLE dataUnit; - Word16 partialCopyFrameType, partialCopyOffset; - Word16 result; - - IF( auSize == 0 ) - { - return IVAS_ERR_OK; /* ignore empty/NO_DATA frame - shouldn't be transmitted in RTP */ - } - IF( GT_16( shr( add( auSize, 7 ), 3 ), (Word16) MAX_AU_SIZE ) ) + test(); + IF( hRCin == NULL || hRCout == NULL ) { - return IVAS_ERR_INVALID_BITSTREAM; + return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - /* check if frame contains a partial copy and get its offset */ - evs_dec_previewFrame( au, auSize, &partialCopyFrameType, &partialCopyOffset ); - - /* create data unit for primary copy in the frame */ - dataUnit = JB4_AllocDataUnit( hIvasDec->hVoIP->hJBM ); - mvc2c( au, dataUnit->data, shr( add( auSize, 7 ), 3 ) ); - dataUnit->dataSize = auSize; - dataUnit->duration = 20; - dataUnit->sequenceNumber = rtpSequenceNumber; - dataUnit->silenceIndicator = isSidFrame( dataUnit->dataSize ); - move16(); - dataUnit->timeScale = 1000; - dataUnit->rcvTime = rcvTime_ms; - dataUnit->timeStamp = rtpTimeStamp; - dataUnit->partial_frame = 0; - dataUnit->partialCopyOffset = partialCopyOffset; - dataUnit->qBit = qBit; - move16(); + hRCout->roomAcoustics.aeID = hRCin->roomAcoustics.aeID; move16(); + hRCout->roomAcoustics.nBands = hRCin->roomAcoustics.nBands; + hRCout->roomAcoustics.acousticPreDelay_fx = hRCin->roomAcoustics.acousticPreDelay_fx; + hRCout->roomAcoustics.inputPreDelay_fx = hRCin->roomAcoustics.inputPreDelay_fx; + + Copy32( hRCin->roomAcoustics.pFc_input_fx, hRCout->roomAcoustics.pFc_input_fx, CLDFB_NO_CHANNELS_MAX ); // Q16 + Copy32( hRCin->roomAcoustics.pAcoustic_rt60_fx, hRCout->roomAcoustics.pAcoustic_rt60_fx, CLDFB_NO_CHANNELS_MAX ); // Q26 + Copy32( hRCin->roomAcoustics.pAcoustic_dsr_fx, hRCout->roomAcoustics.pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX ); // Q30 + Copy( hRCin->directivity_fx, hRCout->directivity_fx, 3 * MAX_NUM_OBJECTS ); + Copy32( hRCin->distAtt_fx, hRCout->distAtt_fx, 3 ); + + hRCout->split_rend_config = hRCin->split_rend_config; + + hRCout->roomAcoustics.use_er = hRCin->roomAcoustics.use_er; + hRCout->roomAcoustics.lowComplexity = hRCin->roomAcoustics.lowComplexity; move16(); move16(); move16(); move32(); move32(); move32(); - move32(); - - /* add the frame to the JBM */ - result = JB4_PushDataUnit( hIvasDec->hVoIP->hJBM, dataUnit, rcvTime_ms ); - IF( result != 0 ) - { - return IVAS_ERR_UNKNOWN; - } - - test(); - IF( NE_16( partialCopyFrameType, RF_NO_DATA ) && partialCopyOffset != 0 ) - { - /* create data unit for partial copy in the frame */ - dataUnit = JB4_AllocDataUnit( hIvasDec->hVoIP->hJBM ); - mvc2c( au, dataUnit->data, shr( add( auSize, 7 ), 3 ) ); - dataUnit->dataSize = auSize; - dataUnit->duration = 20; - dataUnit->sequenceNumber = rtpSequenceNumber; - dataUnit->silenceIndicator = 0; /* there are no partial copies for SID frames */ - dataUnit->timeScale = 1000; - dataUnit->rcvTime = rcvTime_ms; - dataUnit->timeStamp = (UWord32) W_sub( rtpTimeStamp, imult3216( dataUnit->duration, partialCopyOffset ) ); - move32(); - dataUnit->partial_frame = 1; - dataUnit->partialCopyOffset = partialCopyOffset; - dataUnit->qBit = qBit; - move16(); - move16(); - move16(); - move16(); - move16(); - move32(); - move32(); - move32(); - - /* add the frame to the JBM */ - result = JB4_PushDataUnit( hIvasDec->hVoIP->hJBM, dataUnit, rcvTime_ms ); - IF( result != 0 ) - { - return IVAS_ERR_UNKNOWN; - } - } return IVAS_ERR_OK; } + /*---------------------------------------------------------------------* - * IVAS_DEC_VoIP_SetScale( ) + * IVAS_DEC_GetRenderConfig( ) * - * Set the TSM scale + * Return renderer configuration parameters handle *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_VoIP_SetScale( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const Word16 maxScaling, /* i : max allowed absolute difference in samples from the default 20ms frame size */ - const Word16 scale /* i : TSM scale to set in percent of the default frame size */ +ivas_error IVAS_DEC_GetRenderConfig( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render configuration handle */ ) { - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm == false ) - { - return IVAS_ERR_TSM_NOT_ENABLED; - } - ELSE + test(); + test(); + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hRenderConfig == NULL || hRCout == NULL ) { - hIvasDec->tsm_scale = scale; - hIvasDec->tsm_max_scaling = maxScaling; - move16(); - move16(); + return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - return error; + return copyRendererConfigStruct( hIvasDec->st_ivas->hRenderConfig, hRCout ); } + /*---------------------------------------------------------------------* - * IVAS_DEC_VoIP_SetScale( ) + * IVAS_DEC_GetDefaultRenderConfig( ) * - * Set the TSM scale + * Return default renderer configuration parameters *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_TSM_SetQuality( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const Word16 quality /* i : target TSM quality Q14 */ +/*! r: error code*/ +ivas_error IVAS_DEC_GetDefaultRenderConfig( + IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render config handle */ ) { + RENDER_CONFIG_DATA RCin; + RENDER_CONFIG_HANDLE hRCin = &RCin; ivas_error error; - error = IVAS_ERR_OK; - move32(); - - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm == false ) + IF( NE_32( ( error = ivas_render_config_init_from_rom_fx( &hRCin ) ), IVAS_ERR_OK ) ) { - return IVAS_ERR_TSM_NOT_ENABLED; - } - ELSE - { - hIvasDec->tsm_quality = quality; // Q14 - move16(); + return error; } - return error; + return copyRendererConfigStruct( hRCin, hRCout ); } /*---------------------------------------------------------------------* - * IVAS_DEC_VoIP_GetSamples( ) + * IVAS_DEC_FeedRenderConfig( ) * - * Main function to decode one frame in VoIP + * Set renderer configuration (acoustic environment) parameters *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_VoIP_GetSamples( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - UWord16 nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ - Word16 *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels Q0 */ - const UWord32 systemTimestamp_ms /* i : current system timestamp */ -#ifdef SUPPORT_JBM_TRACEFILE - , - JbmTraceFileWriterFn jbmWriterFn, - void *jbmWriter -#endif +ivas_error IVAS_DEC_FeedRenderConfig( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_DATA renderConfig /* i : Render configuration struct */ ) { + RENDER_CONFIG_HANDLE hRenderConfig; Decoder_Struct *st_ivas; - DECODER_CONFIG_HANDLE hDecoderConfig; - IVAS_DEC_VOIP *hVoIP; - UWord32 extBufferedTime_ms, scale, maxScaling; - JB4_DATAUNIT_HANDLE dataUnit; - UWord16 extBufferedSamples; - Word16 timeScalingDone; - Word16 result; ivas_error error; - Word16 nSamplesRendered; - UWord8 nOutChannels; + test(); + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hRenderConfig == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hRenderConfig = hIvasDec->st_ivas->hRenderConfig; st_ivas = hIvasDec->st_ivas; - hDecoderConfig = st_ivas->hDecoderConfig; - hVoIP = hIvasDec->hVoIP; - timeScalingDone = 0; - nOutChannels = (UWord8) st_ivas->hDecoderConfig->nchan_out; - nSamplesRendered = 0; + + hRenderConfig->roomAcoustics.aeID = renderConfig.roomAcoustics.aeID; + move16(); + hRenderConfig->roomAcoustics.nBands = renderConfig.roomAcoustics.nBands; + hRenderConfig->roomAcoustics.acousticPreDelay_fx = renderConfig.roomAcoustics.acousticPreDelay_fx; + hRenderConfig->roomAcoustics.inputPreDelay_fx = renderConfig.roomAcoustics.inputPreDelay_fx; + + hRenderConfig->roomAcoustics.use_er = 0; move16(); move16(); move16(); + move32(); + move32(); + IF( EQ_16( renderConfig.roomAcoustics.use_er, 1 ) ) + { + hRenderConfig->roomAcoustics.use_er = renderConfig.roomAcoustics.use_er; + hRenderConfig->roomAcoustics.lowComplexity = renderConfig.roomAcoustics.lowComplexity; + hRenderConfig->roomAcoustics.dimensions = renderConfig.roomAcoustics.dimensions; + hRenderConfig->roomAcoustics.ListenerOrigin = renderConfig.roomAcoustics.ListenerOrigin; - IF( nSamplesPerChannel == 0 ) + Copy32( renderConfig.roomAcoustics.AbsCoeff_fx, hRenderConfig->roomAcoustics.AbsCoeff_fx, IVAS_ROOM_ABS_COEFF ); + move16(); + move32(); + } + + Copy32( renderConfig.roomAcoustics.pFc_input_fx, hRenderConfig->roomAcoustics.pFc_input_fx, CLDFB_NO_CHANNELS_MAX ); // Q16 + Copy32( renderConfig.roomAcoustics.pAcoustic_rt60_fx, hRenderConfig->roomAcoustics.pAcoustic_rt60_fx, CLDFB_NO_CHANNELS_MAX ); // Q26 + Copy32( renderConfig.roomAcoustics.pAcoustic_dsr_fx, hRenderConfig->roomAcoustics.pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX ); // Q30 + + /* Re-initialize reverb instance if already available */ + + /* TD renderer Jot reverberator */ + IF( st_ivas->hReverb != NULL ) { - return IVAS_ERR_WRONG_PARAMS; + IF( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } } - /* make sure that the FIFO after decoder/scaler contains at least one sound card frame (i.e. 20ms) */ - WHILE( LT_16( nSamplesRendered, nSamplesPerChannel ) ) + /* CREND Jot reverberator */ + test(); + test(); + IF( st_ivas->hCrendWrapper != NULL && st_ivas->hCrendWrapper->hCrend[0] != NULL && st_ivas->hCrendWrapper->hCrend[0]->hReverb != NULL ) { - IF( hIvasDec->nSamplesAvailableNext == 0 ) + IF( ( error = ivas_reverb_open_fx( &st_ivas->hCrendWrapper->hCrend[0]->hReverb, hIvasDec->st_ivas->hHrtfStatistics, hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { - Word16 nSamplesBuffered; - nSamplesBuffered = 0; - move16(); - IF( hIvasDec->hasBeenFedFirstGoodFrame ) - { - IF( NE_32( ( error = IVAS_DEC_GetBufferedNumberOfSamples( hIvasDec, &nSamplesBuffered ) ), IVAS_ERR_OK ) ) - { - return error; - } - } + return error; + } + } - extBufferedSamples = add( nSamplesRendered, nSamplesBuffered ); - Word16 exp; - extBufferedTime_ms = BASOP_Util_Divide3232_Scale( imult3216( extBufferedSamples, 1000 ), hDecoderConfig->output_Fs, &exp ); - extBufferedTime_ms = (UWord32) W_shr( extBufferedTime_ms, sub( 15, exp ) ); // Q0 - dataUnit = NULL; + /* Parametric renderer reverberator */ + test(); + IF( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->hReverb != NULL ) + { + ivas_binaural_reverb_close_fx( &( st_ivas->hDiracDecBin[0]->hReverb ) ); - /* pop one access unit from the jitter buffer */ - result = JB4_PopDataUnit( hVoIP->hJBM, systemTimestamp_ms, extBufferedTime_ms, &dataUnit, &scale, &maxScaling ); - IF( result != 0 ) - { - return IVAS_ERR_UNKNOWN; - } + IF( ( error = ivas_binaural_reverb_init_fx( &( hIvasDec->st_ivas->hDiracDecBin[0]->hReverb ), hIvasDec->st_ivas->hHrtfStatistics, hIvasDec->st_ivas->hSpatParamRendCom->num_freq_bands, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRenderConfig->roomAcoustics ), hIvasDec->st_ivas->hDecoderConfig->output_Fs, NULL, NULL, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } - IF( EQ_32( hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) - { - if ( GT_32( maxScaling, 20 ) ) - { - maxScaling = 20; - move16(); - } - } - maxScaling = Mult_32_32( imult3216( hDecoderConfig->output_Fs, (Word16) maxScaling ), INV_1000_Q31 ); + /* FastConv renderer reverberator */ + test(); + IF( st_ivas->hBinRenderer != NULL && st_ivas->hBinRenderer->hReverb != NULL ) + { + ivas_binaural_reverb_close_fx( &( st_ivas->hBinRenderer->hReverb ) ); - /* avoid time scaling multiple times in one sound card slot */ - IF( NE_64( scale, 100U ) ) - { - IF( timeScalingDone ) - { - scale = 100; - move32(); - } - ELSE - { - timeScalingDone = 1; - move16(); - } - } + IF( ( error = ivas_binaural_reverb_init_fx( &( hIvasDec->st_ivas->hBinRenderer->hReverb ), hIvasDec->st_ivas->hHrtfStatistics, hIvasDec->st_ivas->hBinRenderer->conv_band, hIvasDec->st_ivas->hBinRenderer->timeSlots, &( hRenderConfig->roomAcoustics ), hIvasDec->st_ivas->hDecoderConfig->output_Fs, NULL, NULL, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } - /* limit scale to range supported by time scaler */ - IF( LT_32( scale, APA_MIN_SCALE ) ) - { - scale = APA_MIN_SCALE; - move32(); - } - ELSE IF( GT_32( scale, APA_MAX_SCALE ) ) - { - scale = APA_MAX_SCALE; - move32(); - } + Copy( renderConfig.directivity_fx, hRenderConfig->directivity_fx, 3 * MAX_NUM_OBJECTS ); + Copy32( renderConfig.distAtt_fx, hRenderConfig->distAtt_fx, 3 ); - IF( NE_32( ( error = IVAS_DEC_VoIP_SetScale( hIvasDec, (Word16) maxScaling, (Word16) scale ) ), IVAS_ERR_OK ) ) - { - return error; - } + hRenderConfig->split_rend_config = renderConfig.split_rend_config; - /* copy bitstream into decoder state */ - IF( dataUnit ) - { - hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; + /* Overwrite any pose correction settings if 0 DOF (no pose correction) was selected */ + IF( hRenderConfig->split_rend_config.dof == 0 ) + { + hRenderConfig->split_rend_config.poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE; + move16(); + } - bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); + IF( is_split_rendering_enabled( st_ivas->hDecoderConfig, hRenderConfig ) ) + { + IF( ( error = isar_split_rend_validate_config( &hRenderConfig->split_rend_config, ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + return IVAS_ERR_OK; +} - IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( hIvasDec->hasDecodedFirstGoodFrame ) - { - /* Decoder has been initialized with first good frame - do PLC */ - IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ) ), IVAS_ERR_OK ) ) - { - return error; - } - } -#ifdef SUPPORT_JBM_TRACEFILE - /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ - test(); - IF( jbmWriterFn != NULL && jbmWriter != NULL ) - { - /* write JBM trace data entry */ - store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); - IF( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError writing JBM Trace data to file\n" ); - return IVAS_ERR_UNKNOWN; - } - } -#endif - IF( dataUnit ) - { - IF( dataUnit->partial_frame != 0 ) - { - hVoIP->lastDecodedWasActive = 1; - } - ELSE - { - hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; - } - move16(); +/*---------------------------------------------------------------------* + * feedAcousticEnvPI( ) + * + * Set acoustic environment from the PI data + *---------------------------------------------------------------------*/ - /* data unit memory is no longer used */ - JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); - } +static ivas_error feedAcousticEnvPI( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_PIDATA_ACOUSTIC_ENV hAcoustEnvPI /* i : Render configuration struct */ +) +{ + RENDER_CONFIG_HANDLE hRenderConfig; + Decoder_Struct *st_ivas; + ivas_error error; - IF( !hIvasDec->hasBeenFedFirstGoodFrame ) - { - hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; - hIvasDec->nSamplesRendered = 0; - move16(); - move16(); - } + test(); + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hRenderConfig == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hRenderConfig = hIvasDec->st_ivas->hRenderConfig; + st_ivas = hIvasDec->st_ivas; + move32(); + move32(); + + /* Ignore if AE ID already in use */ + IF( EQ_16( hRenderConfig->roomAcoustics.aeID, hAcoustEnvPI.aeid ) ) + { + return IVAS_ERR_OK; + } + + /* Attempt to load the one already available */ + IF( ( error = IVAS_DEC_GetAcousticEnvironment( hIvasDec, hAcoustEnvPI.aeid, &hRenderConfig->roomAcoustics ) ) == IVAS_ERR_ACOUSTIC_ENVIRONMENT_MISSING ) + { + /* Add the new compact room environment */ + IVAS_ROOM_ACOUSTICS_CONFIG_DATA acEnv; + + acEnv.aeID = hAcoustEnvPI.aeid; + acEnv.nBands = IVAS_PI_AE_NUM_BANDS; + move16(); + move16(); + + acEnv.pFc_input_fx[IVAS_PI_AE_LOW] = IVAS_PI_AE_LOW_FREQ * 0x10000; /* Q16 */ + acEnv.pFc_input_fx[IVAS_PI_AE_MID] = IVAS_PI_AE_MID_FREQ * 0x10000; + acEnv.pFc_input_fx[IVAS_PI_AE_HIGH] = IVAS_PI_AE_HIGH_FREQ * 0x10000; + move32(); + move32(); + move32(); + + acEnv.pAcoustic_rt60_fx[IVAS_PI_AE_LOW] = hAcoustEnvPI.rt60_fx[IVAS_PI_AE_LOW]; + acEnv.pAcoustic_rt60_fx[IVAS_PI_AE_MID] = hAcoustEnvPI.rt60_fx[IVAS_PI_AE_MID]; + acEnv.pAcoustic_rt60_fx[IVAS_PI_AE_HIGH] = hAcoustEnvPI.rt60_fx[IVAS_PI_AE_HIGH]; + acEnv.inputPreDelay_fx = ( ( hAcoustEnvPI.rt60_fx[IVAS_PI_AE_MID] * 0x00CCCCC ) >> 26 ); /* Q26 RT60[MID] / 10 -> Q27 */ + move32(); + move32(); + move32(); + move32(); + + acEnv.pAcoustic_dsr_fx[IVAS_PI_AE_LOW] = hAcoustEnvPI.dsr_fx[IVAS_PI_AE_LOW]; + acEnv.pAcoustic_dsr_fx[IVAS_PI_AE_MID] = hAcoustEnvPI.dsr_fx[IVAS_PI_AE_MID]; + acEnv.pAcoustic_dsr_fx[IVAS_PI_AE_HIGH] = hAcoustEnvPI.dsr_fx[IVAS_PI_AE_HIGH]; + move32(); + move32(); + move32(); + + acEnv.use_er = hAcoustEnvPI.availEarlyReflections; + move16(); + + IF( hAcoustEnvPI.availEarlyReflections ) + { + hRenderConfig->roomAcoustics.dimensions.x_fx = hAcoustEnvPI.roomDimensions.x_fx; + hRenderConfig->roomAcoustics.dimensions.y_fx = hAcoustEnvPI.roomDimensions.y_fx; + hRenderConfig->roomAcoustics.dimensions.z_fx = hAcoustEnvPI.roomDimensions.z_fx; + move32(); + move32(); + move32(); + + Copy32( hAcoustEnvPI.absorbCoeffs_fx, hRenderConfig->roomAcoustics.AbsCoeff_fx, IVAS_ROOM_ABS_COEFF ); } - /* decode */ - IF( !hIvasDec->hasBeenFedFirstGoodFrame ) + IF( ( error = IVAS_DEC_AddAcousticEnvironment( hIvasDec, acEnv ) ) != IVAS_ERR_OK ) { - /* codec mode to use not known yet - simply output silence */ - /* directly set output zero */ - Word16 nSamplesToZero = s_min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); - set16_fx( pcmBuf + imult1616( nSamplesRendered, nOutChannels ), 0, imult1616( nSamplesToZero, nOutChannels ) ); - nSamplesRendered = add( nSamplesRendered, nSamplesToZero ); - hIvasDec->nSamplesRendered = add( hIvasDec->nSamplesRendered, nSamplesToZero ); - hIvasDec->nSamplesAvailableNext = sub( hIvasDec->nSamplesAvailableNext, nSamplesToZero ); - move16(); + return error; + } + + IF( ( error = IVAS_DEC_GetAcousticEnvironment( hIvasDec, hAcoustEnvPI.aeid, &hRenderConfig->roomAcoustics ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Re-initialize reverb instance if already available */ + + /* TD renderer Jot reverberator */ + IF( st_ivas->hReverb != NULL ) + { + IF( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* CREND Jot reverberator */ + test(); + test(); + IF( st_ivas->hCrendWrapper != NULL && st_ivas->hCrendWrapper->hCrend[0] != NULL && st_ivas->hCrendWrapper->hCrend[0]->hReverb != NULL ) + { + IF( ( error = ivas_reverb_open_fx( &st_ivas->hCrendWrapper->hCrend[0]->hReverb, st_ivas->hHrtfStatistics, hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Parametric renderer reverberator */ + test(); + IF( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->hReverb != NULL ) + { + ivas_binaural_reverb_close_fx( &( st_ivas->hDiracDecBin[0]->hReverb ) ); + + IF( ( error = ivas_binaural_reverb_init_fx( &( st_ivas->hDiracDecBin[0]->hReverb ), st_ivas->hHrtfStatistics, st_ivas->hSpatParamRendCom->num_freq_bands, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, + &( hRenderConfig->roomAcoustics ), st_ivas->hDecoderConfig->output_Fs, NULL, NULL, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* FastConv renderer reverberator */ + test(); + IF( st_ivas->hBinRenderer != NULL && st_ivas->hBinRenderer->hReverb != NULL ) + { + ivas_binaural_reverb_close_fx( &( st_ivas->hBinRenderer->hReverb ) ); + + IF( ( error = ivas_binaural_reverb_init_fx( &( st_ivas->hBinRenderer->hReverb ), st_ivas->hHrtfStatistics, st_ivas->hBinRenderer->conv_band, st_ivas->hBinRenderer->timeSlots, + &( hRenderConfig->roomAcoustics ), st_ivas->hDecoderConfig->output_Fs, NULL, NULL, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetDelay( ) + * + * Return IVAS decoder delay in nanoseconds + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetDelay( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *nSamples, /* o : decoder delay in samples */ + Word32 *timeScale /* o : time scale of the delay, equal to decoder output sampling rate */ +) +{ + Decoder_Struct *st_ivas; + DECODER_CONFIG_HANDLE hDecoderConfig; + Word32 out_fs_fx; + + test(); + test(); + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || nSamples == NULL || timeScale == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( !hIvasDec->hasDecodedFirstGoodFrame ) + { + /* Delay depends on IVAS format, which is unknown until first frame has been decoded */ + return IVAS_ERR_WAITING_FOR_BITSTREAM; + } + + st_ivas = hIvasDec->st_ivas; + hDecoderConfig = st_ivas->hDecoderConfig; + + IF( NE_32( hDecoderConfig->output_Fs, 48000 ) ) + { + IF( NE_32( hDecoderConfig->output_Fs, 32000 ) ) + { + out_fs_fx = FS_16K_IN_NS_Q31; + } + ELSE + { + out_fs_fx = FS_32K_IN_NS_Q31; + } + } + ELSE + { + out_fs_fx = FS_48K_IN_NS_Q31; + } + move32(); + + nSamples[1] = NS2SA_FX2( hDecoderConfig->output_Fs, get_delay_fx( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbSynDec[0], (Word16) EQ_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ); + move16(); + nSamples[2] = extract_l( W_round64_L( W_mult0_32_32( L_shl( st_ivas->binaural_latency_ns, 1 ), out_fs_fx ) ) ); + move16(); + nSamples[0] = add( nSamples[1], nSamples[2] ); + move16(); + + test(); + IF( EQ_16( (Word16) st_ivas->ivas_format, MASA_FORMAT ) || EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + /* note: in MASA, all delay is compensated at the decoder by default, so subtract the encoder delay for print-out */ + nSamples[1] = sub( nSamples[1], NS2SA_FX2( hDecoderConfig->output_Fs, IVAS_ENC_DELAY_NS ) ); + move16(); + } + + *timeScale = hDecoderConfig->output_Fs; + move32(); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_HasDecodedFirstGoodFrame( ) + * + * Return flag indicating if the decoder has decoded a good frame + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_HasDecodedFirstGoodFrame( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + bool *hasDecodedFirstGoodFrame /* o : flag indicating if the decoder has decoded a good frame since it was configured */ +) +{ + test(); + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hasDecodedFirstGoodFrame == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *hasDecodedFirstGoodFrame = hIvasDec->hasDecodedFirstGoodFrame; + move16(); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * isSidFrame( ) + * + * Check if a frame contains a SID + *---------------------------------------------------------------------*/ + +static bool isSidFrame( + const UWord16 size ) +{ + IF( EQ_16( size, ( SID_1k75 / FRAMES_PER_SEC ) ) ) + { + return true; /* AMR-WB SID */ + } + ELSE IF( EQ_16( size, ( SID_2k40 / FRAMES_PER_SEC ) ) ) + { + return true; /* EVS SID */ + } + ELSE IF( EQ_16( size, ( IVAS_SID_5k2 / FRAMES_PER_SEC ) ) ) + { + return true; /* IVAS SID */ + } + + return false; +} + + +/*---------------------------------------------------------------------* + * bsCompactToSerial( ) + * + * Bitstream conversion to Byte format + *---------------------------------------------------------------------*/ + +static void bsCompactToSerial( + const UWord8 *compact, + UWord16 *serial, + const UWord16 num_bits ) +{ +/* Bitstream conversion is not counted towards complexity and memory usage */ +#define WMC_TOOL_SKIP + UWord32 i; + UWord8 byte = 0; + const UWord8 mask = 0x80; + move16(); + move16(); + + FOR( i = 0; i < num_bits; ++i ) + { + if ( ( i % 8 ) == 0 ) + { + byte = compact[i / 8]; move16(); } + + serial[i] = shr( s_and( byte, mask ), 7 ); + move16(); + + byte = (UWord8) shl( byte, 1 ); + } + + /* Add 4 padding bytes required by core coder */ + FOR( i = 0; i < 4 * 8; ++i ) + { + serial[( num_bits + i )] = 0; + move16(); + } +#undef WMC_TOOL_SKIP +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_FeedFrame( ) + * + * Feed RTP packet into internal jitter buffer + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_FeedFrame( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + UWord8 *au, /* i : buffer containing input access unit */ + const UWord16 auSize, /* i : size of the access unit */ + const UWord16 rtpSequenceNumber, /* i : RTP sequence number (16 bits) */ + const UWord32 rtpTimeStamp, /* i : RTP timestamp (32 bits) */ + const UWord32 rcvTime_ms, /* i : receive time of the RTP packet in milliseconds */ + const bool qBit /* i : Q bit for AMR-WB IO */ +) +{ + JB4_DATAUNIT_HANDLE dataUnit; + Word16 partialCopyFrameType, partialCopyOffset; + Word16 result; + + test(); + test(); + IF( hIvasDec == NULL || hIvasDec->hVoIP == NULL || au == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( auSize == 0 ) + { + return IVAS_ERR_OK; /* ignore empty/NO_DATA frame - shouldn't be transmitted in RTP */ + } + + IF( GT_16( shr( add( auSize, 7 ), 3 ), (Word16) MAX_AU_SIZE ) ) + { + return IVAS_ERR_INVALID_BITSTREAM; + } + + partialCopyFrameType = 0; + move16(); + partialCopyOffset = 0; + move16(); + + IF( EQ_16( hIvasDec->mode, (Word16) IVAS_DEC_MODE_EVS ) ) + { + /* check if frame contains a partial copy and get its offset */ + evs_dec_previewFrame( au, auSize, &partialCopyFrameType, &partialCopyOffset ); + } + + /* create data unit for primary copy in the frame */ + dataUnit = JB4_AllocDataUnit( hIvasDec->hVoIP->hJBM ); + mvc2c( au, dataUnit->data, shr( add( auSize, 7 ), 3 ) ); + dataUnit->dataSize = auSize; + dataUnit->duration = 20; + dataUnit->sequenceNumber = rtpSequenceNumber; + dataUnit->silenceIndicator = isSidFrame( dataUnit->dataSize ); + move16(); + dataUnit->timeScale = 1000; + dataUnit->rcvTime = rcvTime_ms; + dataUnit->timeStamp = rtpTimeStamp; + dataUnit->partial_frame = 0; + dataUnit->partialCopyOffset = partialCopyOffset; + dataUnit->qBit = qBit; + move16(); + move16(); + move16(); + move16(); + move16(); + move32(); + move32(); + move32(); + move32(); + + /* add the frame to the JBM */ + result = JB4_PushDataUnit( hIvasDec->hVoIP->hJBM, dataUnit, rcvTime_ms ); + IF( result != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + + test(); + IF( NE_16( partialCopyFrameType, RF_NO_DATA ) && partialCopyOffset != 0 ) + { + /* create data unit for partial copy in the frame */ + dataUnit = JB4_AllocDataUnit( hIvasDec->hVoIP->hJBM ); + mvc2c( au, dataUnit->data, shr( add( auSize, 7 ), 3 ) ); + dataUnit->dataSize = auSize; + dataUnit->duration = 20; + dataUnit->sequenceNumber = rtpSequenceNumber; + dataUnit->silenceIndicator = 0; /* there are no partial copies for SID frames */ + dataUnit->timeScale = 1000; + dataUnit->rcvTime = rcvTime_ms; + dataUnit->timeStamp = (UWord32) W_sub( rtpTimeStamp, imult3216( dataUnit->duration, partialCopyOffset ) ); + move32(); + dataUnit->partial_frame = 1; + dataUnit->partialCopyOffset = partialCopyOffset; + dataUnit->qBit = qBit; + move16(); + move16(); + move16(); + move16(); + move16(); + move32(); + move32(); + move32(); + + /* add the frame to the JBM */ + result = JB4_PushDataUnit( hIvasDec->hVoIP->hJBM, dataUnit, rcvTime_ms ); + IF( result != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_SetScale( ) + * + * Set the TSM scale + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_SetScale( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const Word16 maxScaling, /* i : max allowed absolute difference in samples from the default 20ms frame size */ + const Word16 scale /* i : TSM scale to set in percent of the default frame size */ +) +{ + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm == 0 ) + { + return IVAS_ERR_TSM_NOT_ENABLED; + } + ELSE + { + hIvasDec->tsm_scale = scale; + hIvasDec->tsm_max_scaling = maxScaling; + move16(); + move16(); + } + + return IVAS_ERR_OK; +} + +#ifdef VARIABLE_SPEED_DECODING + +/*---------------------------------------------------------------------* + * IVAS_DEC_EnableTsm( ) + * + * Enable Time-Scale Modification (TSM) + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_EnableTsm( + IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ +) +{ + AUDIO_CONFIG output_config; + ivas_error error; + + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hIvasDec->st_ivas->hDecoderConfig->Opt_tsm = 1; + move16(); + + /* Init flush buffer if necessary (only needed for binaural) */ + output_config = hIvasDec->st_ivas->hDecoderConfig->output_config; + + test(); + test(); + test(); + test(); + test(); + IF( hIvasDec->flushbuffer == NULL && ( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) + { + IF( ( error = create_flush_buffer( hIvasDec ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_TSM_SetQuality( ) + * + * set the quality theshold for the time scale modiciation that is used + * to determine if the TSM yielded a signal that satisfies the minimum + * quality requirements. + * quality is lower limit for minimum quality + * Range is [-2;2] - where positive values allow + * only pasting with same phase information + * Negative values would yield cross phased pasting + * When not setting the minimum quality with this function the default + * value used is 1.0f + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_TSM_SetQuality( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const Word16 quality /* i : target TSM quality Q14 */ +) +{ + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( !hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + return IVAS_ERR_TSM_NOT_ENABLED; + } + ELSE + { + hIvasDec->tsm_quality = quality; // Q14 + move16(); + } + + return IVAS_ERR_OK; +} + +#endif + +/*---------------------------------------------------------------------* + * renderer_type_to_mode() + * + * Convert (codec library) renderer type to (API public) binaural renderer mode + *---------------------------------------------------------------------*/ + +/*! r: binaural renderer mode (API type) */ +static IVAS_BIN_RENDERER_TYPE renderer_type_to_mode( + const RENDERER_TYPE renderer_type /* i : renderer type (codec library type) */ +) +{ + IVAS_BIN_RENDERER_TYPE binaural_renderer; + + SWITCH( renderer_type ) + { + case RENDERER_BINAURAL_OBJECTS_TD: + binaural_renderer = IVAS_BIN_RENDERER_TYPE_TDREND; + BREAK; + case RENDERER_BINAURAL_MIXER_CONV: + case RENDERER_BINAURAL_MIXER_CONV_ROOM: + binaural_renderer = IVAS_BIN_RENDERER_TYPE_CREND; + BREAK; + case RENDERER_BINAURAL_FASTCONV: + binaural_renderer = IVAS_BIN_RENDERER_TYPE_FASTCONV; + BREAK; + case RENDERER_BINAURAL_FASTCONV_ROOM: + binaural_renderer = IVAS_BIN_RENDERER_TYPE_FASTCONV; + BREAK; + case RENDERER_BINAURAL_PARAMETRIC: + case RENDERER_BINAURAL_PARAMETRIC_ROOM: + binaural_renderer = IVAS_BIN_RENDERER_TYPE_PARAMBIN; + BREAK; + default: + binaural_renderer = IVAS_BIN_RENDERER_TYPE_NONE; + BREAK; + } + move32(); + + return binaural_renderer; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_ReadFormat( ) + * + * Read main parameters from the bitstream to set-up the decoder: + * - IVAS format + * - IVAS format specific signaling + * - compensate for renderer granularity change in JBM + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_ReadFormat( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_BIN_RENDERER_TYPE *binaural_renderer, /* o : binaural renderer type */ + IVAS_BIN_RENDERER_TYPE *binaural_renderer_sec, /* o : secondary binaural renderer type */ + IVAS_AUDIO_CONFIG *hrtf_set_audio_cfg /* o : HRTF set audio config. */ +) +{ + ivas_error error; + Decoder_Struct *st_ivas; + ISM_MODE ism_mode_old; + MC_MODE mc_mode_old; + Word16 nchan_transport_old; + AUDIO_CONFIG intern_config_old, transport_config_old, output_config; + RENDERER_TYPE renderer_type_old, renderer_type_sec_new, renderer_type_sec_old; + + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + ism_mode_old = st_ivas->ism_mode; + mc_mode_old = st_ivas->mc_mode; + nchan_transport_old = st_ivas->nchan_transport; + intern_config_old = st_ivas->intern_config; + transport_config_old = st_ivas->transport_config; + renderer_type_old = st_ivas->renderer_type; + renderer_type_sec_old = ivas_renderer_secondary_select_fx( st_ivas ); + move32(); + move32(); + move16(); + move32(); + move32(); + move32(); + move32(); + + output_config = st_ivas->hDecoderConfig->output_config; + move32(); + + IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) + { + return IVAS_ERR_OK; + } + + IF( st_ivas->bfi == 0 ) + { + IF( NE_32( error = ivas_dec_get_format_fx( st_ivas ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( EQ_16( st_ivas->restartNeeded, 1 ) ) + { + return IVAS_ERR_OK; + } + + /* Select binaural renderer */ + ivas_renderer_select( st_ivas ); + *binaural_renderer = renderer_type_to_mode( st_ivas->renderer_type ); + + /* Select secondary binaural renderer (used in combined formats) */ + renderer_type_sec_new = ivas_renderer_secondary_select_fx( st_ivas ); + *binaural_renderer_sec = renderer_type_to_mode( renderer_type_sec_new ); + + /* select HRTF audio configuration to load the right HRTF set for the external binary file */ + *hrtf_set_audio_cfg = IVAS_AUDIO_CONFIG_INVALID; + move32(); + IF( EQ_32( *binaural_renderer, IVAS_BIN_RENDERER_TYPE_FASTCONV ) ) + { + IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + /* SHD HRIRs */ + *hrtf_set_audio_cfg = IVAS_AUDIO_CONFIG_HOA3; + move32(); + + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) + { + /* BRIRs */ + *hrtf_set_audio_cfg = IVAS_AUDIO_CONFIG_7_1_4; + move32(); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) + { + /* HRIRs */ + *hrtf_set_audio_cfg = IVAS_AUDIO_CONFIG_7_1_4; + move32(); + test(); + test(); + IF( st_ivas->hDecoderConfig->Opt_Headrotation && + ( NE_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) || NE_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) ) + { + /* SHD HRIRs for low complexity rotation */ + *hrtf_set_audio_cfg = IVAS_AUDIO_CONFIG_HOA3; + move32(); + } + } + } + ELSE IF( EQ_32( *binaural_renderer, IVAS_BIN_RENDERER_TYPE_CREND ) ) + { + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + /* BRIRs */ + *hrtf_set_audio_cfg = IVAS_AUDIO_CONFIG_7_1_4; + move32(); + } + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) + { + test(); + /* BRIRs */ + *hrtf_set_audio_cfg = IVAS_AUDIO_CONFIG_7_1_4; + move32(); + test(); + test(); + IF( st_ivas->hDecoderConfig->Opt_Headrotation && ( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) + { + /* SHD HRIRs for low complexity rotation */ + *hrtf_set_audio_cfg = IVAS_AUDIO_CONFIG_HOA3; + move32(); + } + } + } + + test(); + test(); + test(); + test(); + /* JBM: compensate when binaural renderer granularity changes (happens in bitrate switching) */ + IF( st_ivas->ini_active_frame > 0 && st_ivas->hDecoderConfig->Opt_tsm && + ( NE_32( renderer_type_old, st_ivas->renderer_type ) || + NE_32( renderer_type_sec_old, renderer_type_sec_new ) ) ) + { + Word16 tc_granularity_new = ivas_jbm_dec_get_render_granularity_fx( st_ivas->renderer_type, renderer_type_sec_new, st_ivas->hDecoderConfig->output_Fs ); + + st_ivas->nchan_transport = nchan_transport_old; + move16(); + + IF( st_ivas->hTcBuffer == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* when granularity goes down, render what still fits in the new granularity */ + IF( LT_32( tc_granularity_new, st_ivas->hTcBuffer->n_samples_granularity ) ) + { + IF( NE_32( ( error = ivas_jbm_dec_flush_renderer_fx( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &st_ivas->hIntSetup, mc_mode_old, ism_mode_old, &hIvasDec->nSamplesFlushed, hIvasDec->flushbuffer ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + } + + st_ivas->ism_mode = ism_mode_old; + st_ivas->mc_mode = mc_mode_old; + st_ivas->nchan_transport = nchan_transport_old; + st_ivas->intern_config = intern_config_old; + st_ivas->transport_config = transport_config_old; + st_ivas->renderer_type = renderer_type_old; + move32(); + move32(); + move16(); + move32(); + move32(); + move32(); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * apa_exec_evs_wrapper( ) + * + * + *---------------------------------------------------------------------*/ + +static ivas_error apa_exec_evs_wrapper( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const UWord8 nTransportChannels, + UWord16 *nTimeScalerOutSamples ) +{ + Word16 ch; + UWord16 apa_buff_len; + Word16 tmp_apaExecBuffer[CPE_CHANNELS * APA_BUF / APA_MAX_NUM_CHANNELS]; /* in EVS, 2 output channels */ + DECODER_TC_BUFFER_HANDLE hTcBuffer; + + test(); + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hTcBuffer == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + apa_buff_len = (UWord16) shl( mult0( hIvasDec->nSamplesFrame, nTransportChannels ), 1 ); + + hTcBuffer = hIvasDec->st_ivas->hTcBuffer; + + FOR( ch = 0; ch < apa_buff_len; ++ch ) + { + tmp_apaExecBuffer[ch] = extract_l( L_shr( hTcBuffer->tc_buffer_fx[ch], Q11 ) ); // Q0 + } + + IF( apa_exec_fx( hIvasDec->hTimeScaler, tmp_apaExecBuffer, (UWord16) mult0( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, tmp_apaExecBuffer, nTimeScalerOutSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + + FOR( ch = 0; ch < apa_buff_len; ++ch ) + { + hTcBuffer->tc_buffer_fx[ch] = L_shl( tmp_apaExecBuffer[ch], Q11 ); // Q11 + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetSamplesDecoder( ) + * + * Main function to run setup, decode transport channels, do TSM and feed to renderer. + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetSamplesDecoder( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ +) +{ + ivas_error error; + Decoder_Struct *st_ivas; + UWord16 nTimeScalerOutSamples; + UWord8 nTransportChannels; + Word16 nResidualSamples, nSamplesTcsScaled; + bool isInitialized_voip; + + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + test(); + IF( !hIvasDec->hasBeenFedFirstGoodFrame && !hIvasDec->isInitialized ) /* note: 'isInitialized' is related to EVS decoder */ + { + return IVAS_ERR_OK; + } + + st_ivas = hIvasDec->st_ivas; + test(); + isInitialized_voip = hIvasDec->hTimeScaler != NULL; + + test(); + IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) /* wait for the first good frame */ + { + /*-----------------------------------------------------------------* + * Setup all decoder parts (IVAS decoder, ISAR) + *-----------------------------------------------------------------*/ + + IF( NE_32( ( error = ivas_dec_setup_all( hIvasDec, &nTransportChannels, splitRendBits ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /*-----------------------------------------------------------------* + * IVAS decoder: decode transport channels and metadata + *-----------------------------------------------------------------*/ + + IF( EQ_32( hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) + { + IF( ( error = evs_dec_main_fx( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE IF( EQ_32( hIvasDec->mode, IVAS_DEC_MODE_IVAS ) ) + { + IF( ( error = ivas_jbm_dec_tc_fx( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + hIvasDec->isInitialized = true; /* Initialization done in ivas_dec() */ + move16(); + } + + if ( hIvasDec->hasBeenFedFirstGoodFrame ) + { + hIvasDec->hasDecodedFirstGoodFrame = true; + move16(); + } + + /*-----------------------------------------------------------------* + * JBM + *-----------------------------------------------------------------*/ + + IF( st_ivas->hDecoderConfig->Opt_tsm ) + { + IF( NE_16( nTransportChannels, hIvasDec->nTransportChannelsOld ) ) + { + IF( ( error = apa_setup( hIvasDec, isInitialized_voip, nTransportChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + IF( apa_set_scale_fx( hIvasDec->hTimeScaler, hIvasDec->tsm_scale ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + + /* convert deinterleaved decoded TC audio channels buffer to an interleaved one */ + ivas_buffer_deinterleaved_to_interleaved_fx( st_ivas->p_output_fx, nTransportChannels, hIvasDec->nSamplesFrame, st_ivas->hTcBuffer->tc_buffer_fx ); + + IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) + { + apa_exec_evs_wrapper( hIvasDec, nTransportChannels, &nTimeScalerOutSamples ); + } + ELSE + { + IF( apa_exec_ivas_fx( hIvasDec->hTimeScaler, st_ivas->hTcBuffer->tc_buffer_fx, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, st_ivas->hTcBuffer->tc_buffer_fx, &nTimeScalerOutSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + + assert( LE_32( (Word32) nTimeScalerOutSamples, APA_BUF ) ); + nSamplesTcsScaled = idiv1616U( extract_l( nTimeScalerOutSamples ), nTransportChannels ); + hIvasDec->timeScalingDone = 1; + move16(); + + /* convert interleaved time-scaled TC audio channels buffer to deinterleaved one */ + ivas_buffer_interleaved_to_deinterleaved_fx( st_ivas->hTcBuffer->tc_buffer_fx, nTransportChannels, nSamplesTcsScaled, NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); + } + else + { + nSamplesTcsScaled = hIvasDec->nSamplesFrame; + } + + /*-----------------------------------------------------------------* + * Feed decoded transport channels samples to the renderer + *-----------------------------------------------------------------*/ + + ivas_jbm_dec_feed_tc_to_renderer_fx( st_ivas, nSamplesTcsScaled, &nResidualSamples ); + + IF( st_ivas->hDecoderConfig->Opt_tsm ) + { + /* feed residual samples to TSM for the next call */ + IF( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (UWord16) nResidualSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + hIvasDec->hasBeenFedFrame = false; + move16(); + } + + hIvasDec->hasBeenPreparedRendering = false; + move16(); + + /*-----------------------------------------------------------------* + * Set editable metadata + *-----------------------------------------------------------------*/ + + IF( st_ivas->hIsmMetaData[0] ) + { + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + test(); + test(); + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + Word16 obj; + ISM_METADATA_HANDLE *hIsmMetaData = st_ivas->hIsmMetaData; + FOR( obj = 0; obj < st_ivas->nchan_ism; obj++ ) + { + hIsmMetaData[obj]->edited_azimuth_fx = hIsmMetaData[obj]->azimuth_fx; + move32(); + hIsmMetaData[obj]->edited_elevation_fx = hIsmMetaData[obj]->elevation_fx; + move32(); + hIsmMetaData[obj]->edited_yaw_fx = hIsmMetaData[obj]->yaw_fx; + move32(); + hIsmMetaData[obj]->edited_pitch_fx = hIsmMetaData[obj]->pitch_fx; + move32(); + hIsmMetaData[obj]->edited_radius_fx = hIsmMetaData[obj]->radius_fx; + move32(); + hIsmMetaData[obj]->edited_gain_fx = ONE_IN_Q29; + move32(); + } + + if ( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + st_ivas->hSbaIsmData->gain_bed_fx = ONE_IN_Q29; // TODO: Check Q value + move32(); + } + } + } + } + + IF( st_ivas->hParamIsmDec != NULL ) + { + IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + Word16 obj = 0; + PARAM_ISM_DEC_HANDLE hParamIsmDec = st_ivas->hParamIsmDec; + FOR( obj = 0; obj < st_ivas->nchan_ism; obj++ ) + { + hParamIsmDec->edited_azimuth_values_fx[obj] = hParamIsmDec->azimuth_values_fx[obj]; + hParamIsmDec->edited_elevation_values_fx[obj] = hParamIsmDec->elevation_values_fx[obj]; + move32(); + move32(); + } + } + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetEditableParameters( ) + * + * Get editable metadata parameters + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetEditableParameters( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_EDITABLE_PARAMETERS *hIvasEditableParameters /* o : object editing parameters handle */ +) +{ + Word16 obj, dirac_read_idx; + Decoder_Struct *st_ivas; + ISM_MODE ism_mode; + + test(); + test(); + IF( hIvasEditableParameters == NULL || hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + hIvasEditableParameters->num_obj = 0; + move16(); + + return IVAS_ERR_OK; + } + + st_ivas = hIvasDec->st_ivas; + ism_mode = st_ivas->ism_mode; + + test(); + test(); + test(); + test(); + IF( !( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) || + EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) || + EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) || + ( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && GT_16( st_ivas->nchan_ism, 0 ) ) ) ) + + hIvasEditableParameters->gain_bed_fx = ONE_IN_Q29; + move32(); + hIvasEditableParameters->num_obj = st_ivas->nchan_ism; + move16(); + + test(); + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + test(); + IF( EQ_32( ism_mode, ISM_MODE_DISC ) || EQ_32( ism_mode, ISM_SBA_MODE_DISC ) ) + { + FOR( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ ) + { + hIvasEditableParameters->ism_metadata[obj].azimuth_fx = st_ivas->hIsmMetaData[obj]->azimuth_fx; + move32(); + hIvasEditableParameters->ism_metadata[obj].elevation_fx = st_ivas->hIsmMetaData[obj]->elevation_fx; + move32(); + hIvasEditableParameters->ism_metadata[obj].yaw_fx = st_ivas->hIsmMetaData[obj]->yaw_fx; + move32(); + hIvasEditableParameters->ism_metadata[obj].pitch_fx = st_ivas->hIsmMetaData[obj]->pitch_fx; + move32(); + hIvasEditableParameters->ism_metadata[obj].radius_fx = st_ivas->hIsmMetaData[obj]->radius_fx; + move16(); + hIvasEditableParameters->ism_metadata[obj].gain_fx = st_ivas->hIsmMetaData[obj]->edited_gain_fx; + move32(); + hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = st_ivas->hIsmMetaData[obj]->non_diegetic_flag; + move16(); + } + + IF( EQ_32( ism_mode, ISM_SBA_MODE_DISC ) ) + { + hIvasEditableParameters->gain_bed_fx = ONE_IN_Q29; + move32(); + } + } + ELSE IF( EQ_32( ism_mode, ISM_MODE_PARAM ) ) + { + FOR( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ ) + { + hIvasEditableParameters->ism_metadata[obj].azimuth_fx = st_ivas->hParamIsmDec->azimuth_values_fx[obj]; + move32(); + hIvasEditableParameters->ism_metadata[obj].elevation_fx = st_ivas->hParamIsmDec->elevation_values_fx[obj]; + move32(); + hIvasEditableParameters->ism_metadata[obj].yaw_fx = 0; + move32(); + hIvasEditableParameters->ism_metadata[obj].pitch_fx = 0; + move32(); + hIvasEditableParameters->ism_metadata[obj].radius_fx = 0; + move16(); + hIvasEditableParameters->ism_metadata[obj].gain_fx = ONE_IN_Q29; + move32(); + hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = 0; + move16(); + } + } + ELSE IF( EQ_32( ism_mode, ISM_MODE_NONE ) ) + { + hIvasEditableParameters->num_obj = 0; + move16(); + } +#ifdef DEBUGGING + ELSE + { + assert( 0 && "This should never happen!" ); + } +#endif + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) || ( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && GT_16( st_ivas->nchan_ism, 0 ) ) ) + { + /* object editing possible only in two highest OMASA modes */ + test(); + IF( EQ_32( ism_mode, ISM_MASA_MODE_DISC ) ) + { + FOR( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ ) + { + hIvasEditableParameters->ism_metadata[obj].azimuth_fx = st_ivas->hIsmMetaData[obj]->azimuth_fx; + move32(); + hIvasEditableParameters->ism_metadata[obj].elevation_fx = st_ivas->hIsmMetaData[obj]->elevation_fx; + move32(); + hIvasEditableParameters->ism_metadata[obj].yaw_fx = st_ivas->hIsmMetaData[obj]->yaw_fx; + move32(); + hIvasEditableParameters->ism_metadata[obj].pitch_fx = st_ivas->hIsmMetaData[obj]->pitch_fx; + move32(); + hIvasEditableParameters->ism_metadata[obj].radius_fx = st_ivas->hIsmMetaData[obj]->radius_fx; + move32(); + + /* reset the otherwise unused "gain" field for the object */ + st_ivas->hIsmMetaData[obj]->edited_gain_fx = ONE_IN_Q29; + move32(); + hIvasEditableParameters->ism_metadata[obj].gain_fx = st_ivas->hIsmMetaData[obj]->edited_gain_fx; + move32(); + hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = st_ivas->hIsmMetaData[obj]->non_diegetic_flag; + move16(); + } + } + ELSE IF( EQ_32( ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + /* Handle MONO output */ + IF( NE_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) + { + dirac_read_idx = st_ivas->hSpatParamRendCom->render_to_md_map[st_ivas->hSpatParamRendCom->subframes_rendered]; + } + ELSE + { + dirac_read_idx = 0; + } + move16(); + + FOR( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ ) + { + hIvasEditableParameters->ism_metadata[obj].azimuth_fx = L_shl( L_deposit_l( st_ivas->hMasaIsmData->azimuth_ism_fx[obj][dirac_read_idx] ), Q22 ); + hIvasEditableParameters->ism_metadata[obj].elevation_fx = L_shl( L_deposit_l( st_ivas->hMasaIsmData->elevation_ism_fx[obj][dirac_read_idx] ), Q22 ); + move32(); + move32(); + + hIvasEditableParameters->ism_metadata[obj].yaw_fx = st_ivas->hIsmMetaData[obj]->yaw_fx; + hIvasEditableParameters->ism_metadata[obj].pitch_fx = st_ivas->hIsmMetaData[obj]->pitch_fx; + hIvasEditableParameters->ism_metadata[obj].radius_fx = st_ivas->hIsmMetaData[obj]->radius_fx; + move32(); + move32(); + move32(); + + /* reset the otherwise unused "gain" field for the object */ + st_ivas->hIsmMetaData[obj]->edited_gain_fx = ONE_IN_Q29; + hIvasEditableParameters->ism_metadata[obj].gain_fx = st_ivas->hIsmMetaData[obj]->edited_gain_fx; + hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = st_ivas->hIsmMetaData[obj]->non_diegetic_flag; + move32(); + move32(); + move16(); + } + } + ELSE IF( EQ_32( ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( ism_mode, ISM_MODE_NONE ) ) + { + hIvasEditableParameters->num_obj = 0; + move16(); + } +#ifdef DEBUGGING + ELSE + { + assert( 0 && "This should never happen!" ); + } +#endif + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_SetEditableParameters( ) + * + * Set editable metadata parameters + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_SetEditableParameters( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_EDITABLE_PARAMETERS hIvasEditableParameters /* i : object editing parameters handle */ +) +{ + Word16 dirac_read_idx, obj; + Decoder_Struct *st_ivas; + ISM_MODE ism_mode; + + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + return IVAS_ERR_OK; + } + + st_ivas = hIvasDec->st_ivas; + ism_mode = st_ivas->ism_mode; + + test(); + test(); + test(); + test(); + IF( !( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) || + EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) || + EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) || + ( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && GT_16( st_ivas->nchan_ism, 0 ) ) ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Object editing no supported in this operation mode." ); + } + + test(); + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + test(); + IF( EQ_32( ism_mode, ISM_MODE_DISC ) || EQ_32( ism_mode, ISM_SBA_MODE_DISC ) ) + { +#ifdef DEBUGGING + assert( hIvasEditableParameters.num_obj == st_ivas->nchan_ism ); +#endif + FOR( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ ) + { + st_ivas->hIsmMetaData[obj]->edited_azimuth_fx = hIvasEditableParameters.ism_metadata[obj].azimuth_fx; + move32(); + st_ivas->hIsmMetaData[obj]->edited_elevation_fx = hIvasEditableParameters.ism_metadata[obj].elevation_fx; + move32(); + st_ivas->hIsmMetaData[obj]->edited_radius_fx = hIvasEditableParameters.ism_metadata[obj].radius_fx; + move32(); + st_ivas->hIsmMetaData[obj]->edited_yaw_fx = hIvasEditableParameters.ism_metadata[obj].yaw_fx; + move32(); + st_ivas->hIsmMetaData[obj]->edited_pitch_fx = hIvasEditableParameters.ism_metadata[obj].pitch_fx; + move32(); + IF( GT_32( hIvasEditableParameters.ism_metadata[obj].gain_fx, EDIT_GAIN_MAX_Q29 ) ) + { + st_ivas->hIsmMetaData[obj]->edited_gain_fx = EDIT_GAIN_MAX_Q29; + move32(); + } + ELSE + { + st_ivas->hIsmMetaData[obj]->edited_gain_fx = hIvasEditableParameters.ism_metadata[obj].gain_fx; + move32(); + } + st_ivas->hIsmMetaData[obj]->non_diegetic_flag = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag; + move16(); + } + + IF( EQ_32( ism_mode, ISM_SBA_MODE_DISC ) ) + { + IF( GT_32( hIvasEditableParameters.gain_bed_fx, EDIT_GAIN_MAX_Q29 ) ) + { + st_ivas->hSbaIsmData->gain_bed_fx = EDIT_GAIN_MAX_Q29; + move32(); + } + ELSE + { + st_ivas->hSbaIsmData->gain_bed_fx = hIvasEditableParameters.gain_bed_fx; + move32(); + } + } + } + ELSE IF( EQ_32( ism_mode, ISM_MODE_PARAM ) ) + { +#ifdef DEBUGGING + assert( hIvasEditableParameters.num_obj == st_ivas->nchan_ism ); +#endif + FOR( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ ) + { + st_ivas->hParamIsmDec->edited_azimuth_values_fx[obj] = hIvasEditableParameters.ism_metadata[obj].azimuth_fx; + move32(); + st_ivas->hParamIsmDec->edited_elevation_values_fx[obj] = hIvasEditableParameters.ism_metadata[obj].elevation_fx; + move32(); + + IF( st_ivas->hMasaIsmData != NULL ) + { + /* Limit gain edit to a range of +12dB to -24dB with parametric ISM mode */ + IF( GT_32( hIvasEditableParameters.gain_bed_fx, EDIT_GAIN_MAX_Q29 ) ) + { + st_ivas->hMasaIsmData->gain_ism_edited_fx[obj] = EDIT_GAIN_MAX_Q12; // Q12 + move16(); + } + ELSE IF( LT_32( hIvasEditableParameters.gain_bed_fx, EDIT_GAIN_MIN_Q29 ) ) + { + st_ivas->hMasaIsmData->gain_ism_edited_fx[obj] = EDIT_GAIN_MIN_Q12; // Q12 + move16(); + } + ELSE + { + st_ivas->hMasaIsmData->gain_ism_edited_fx[obj] = shr( extract_h( hIvasEditableParameters.ism_metadata[obj].gain_fx ), Q1 ); // Q29 -> Q12 + move16(); + } + + /* Detect direction editing in Param-ISM mode */ + IF( GT_32( L_abs( L_sub( st_ivas->hParamIsmDec->azimuth_values_fx[obj], hIvasEditableParameters.ism_metadata[obj].azimuth_fx ) ), OMASA_AZI_EDIT_THR_Q22 ) || // | azi_orig[obj] - azi_edit[obj] | > azi_threshold + GT_32( L_abs( L_sub( st_ivas->hParamIsmDec->elevation_values_fx[obj], hIvasEditableParameters.ism_metadata[obj].elevation_fx ) ), OMASA_ELE_EDIT_THR_Q22 ) ) // | ele_orig[obj] - ele_edit[obj] | > ele_threshold + { + st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 1; + } + ELSE + { + st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 0; + } + move16(); + + /* Detect gain editing in Param-ISM mode */ + IF( GT_16( abs_s( sub( ONE_IN_Q12, shr( extract_h( hIvasEditableParameters.ism_metadata[obj].gain_fx ), Q1 ) ) ), OMASA_GAIN_EDIT_THR_Q12 ) ) // | 1.0f - gain_edit[obj] | > gain_threshold + { + st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 1; + } + ELSE + { + st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 0; + } + move16(); + } + } + + IF( st_ivas->hMasaIsmData != NULL ) + { + /* MASA is not present with the ISM format */ + st_ivas->hMasaIsmData->masa_gain_is_edited = 0; + move16(); + } + } + ELSE IF( EQ_32( ism_mode, ISM_MODE_NONE ) ) + { + IF( NE_16( hIvasEditableParameters.num_obj, 0 ) ) + { + return IVAS_ERR_OBJECTS_EDITING_NOT_SUPPORTED; + } + } +#ifdef DEBUGGING + ELSE + { + assert( 0 && "This should never happen!" ); + } +#endif + } + ELSE IF( EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) && ( EQ_16( ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_16( ism_mode, ISM_MASA_MODE_DISC ) ) ) + { + Word32 id_th; + Word32 threshold_azi, threshold_ele; + +#ifdef DEBUGGING + assert( hIvasEditableParameters.num_obj == st_ivas->nchan_ism ); +#endif + FOR( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ ) + { + IF( st_ivas->hMasaIsmData != NULL ) + { + /* copy relevant fields also to OMASA structs, but only if the value has been changed. original values are in st_ivas->hIsmMetaData */ + /* first, need to convert float values to ints used internally */ + Word16 new_azi, new_ele; + + new_azi = extract_l( L_shr( L_add( L_abs( hIvasEditableParameters.ism_metadata[obj].azimuth_fx ), 2097152 ), Q22 ) ); // Q22->Q0 + IF( LT_32( hIvasEditableParameters.ism_metadata[obj].azimuth_fx, 0 ) ) + { + new_azi = negate( new_azi ); + } + + new_ele = extract_l( L_shr( L_add( L_abs( hIvasEditableParameters.ism_metadata[obj].elevation_fx ), 2097152 ), Q22 ) ); // Q22->Q0 + IF( LT_32( hIvasEditableParameters.ism_metadata[obj].elevation_fx, 0 ) ) + { + new_ele = negate( new_ele ); + } + + IF( EQ_16( ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + /* Handle MONO output */ + IF( NE_16( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) + { + dirac_read_idx = st_ivas->hSpatParamRendCom->render_to_md_map[st_ivas->hSpatParamRendCom->subframes_rendered]; + } + ELSE + { + dirac_read_idx = 0; + } + move16(); + + /* determine thresholds for detecting object metadata edit for direction based on quantization resolution of the spatial direction parameters. + * these depend from the number of bits used to transmit the directions, + * which in turn depends from the object priority and importance: + * importance -> priority -> number of bits -> elevation resolution -> elevation ring index -> azimuth resolution. + * leading to elevation_resolution -> elevation threshold and azimuth resolution -> azimuth threshold */ + id_th = extract_l( L_shr( L_add( Mpy_32_16_1( delta_theta_masa_inv_fx[st_ivas->hMasaIsmData->bits_ism[obj] - 3], abs_s( st_ivas->hMasaIsmData->elevation_ism_fx[obj][dirac_read_idx] ) ), 32768 ), 16 ) ); // + 0.5f in Q16 + threshold_azi = Mpy_32_32( 1509949440, no_phi_masa_inv_fx[st_ivas->hMasaIsmData->bits_ism[obj] - 1][id_th] ); // Q = 22; + threshold_ele = delta_theta_masa_fx[st_ivas->hMasaIsmData->bits_ism[obj] - 3]; + + test(); + IF( ( GT_32( L_shl( abs_s( sub( new_azi, st_ivas->hMasaIsmData->azimuth_ism_fx[obj][dirac_read_idx] ) ), 22 ), threshold_azi ) ) || // | azi_edit[obj] - azi_orig[obj] | > azi_threshold + ( GT_32( L_shl( abs_s( sub( new_ele, st_ivas->hMasaIsmData->elevation_ism_fx[obj][dirac_read_idx] ) ), 22 ), threshold_ele ) ) ) // | ele_edit[obj] - ele_orig[obj] | > ele_threshold + { + /* at least one of the threshold is exceeded, so use new direction value and set editing detection flag */ + st_ivas->hMasaIsmData->azimuth_ism_edited_fx[obj] = new_azi; + move32(); + st_ivas->hMasaIsmData->elevation_ism_edited_fx[obj] = new_ele; + move32(); + + st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 1; + } + ELSE + { + st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 0; + } + move16(); + } + ELSE + { + /* detect editing in ISM_MASA_MODE_DISC mode */ + test(); + IF( L_abs( L_sub( st_ivas->hIsmMetaData[obj]->azimuth_fx, hIvasEditableParameters.ism_metadata[obj].azimuth_fx ) ) > OMASA_AZI_EDIT_THR_Q22 || // | azi_orig[obj] - azi_edit[obj] | > azi_threshold + L_abs( L_sub( st_ivas->hIsmMetaData[obj]->elevation_fx, hIvasEditableParameters.ism_metadata[obj].elevation_fx ) ) > OMASA_ELE_EDIT_THR_Q22 ) // | ele_orig[obj] - ele_edit[obj] | > ele_threshold + { + st_ivas->hMasaIsmData->azimuth_ism_edited_fx[obj] = new_azi; + move32(); + st_ivas->hMasaIsmData->elevation_ism_edited_fx[obj] = new_ele; + move32(); + + st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 1; + } + ELSE + { + st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 0; + } + move16(); + } + + /* compare pre-edit gain and the edited one to detect editing */ + IF( GT_16( abs_s( sub( shr( extract_h( st_ivas->hIsmMetaData[obj]->edited_gain_fx ), Q1 ), shr( extract_h( hIvasEditableParameters.ism_metadata[obj].gain_fx ), Q1 ) ) ), OMASA_GAIN_EDIT_THR_Q12 ) ) // | gain_edit[obj] - gain_orig[obj] | > gain_threshold + { + st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 1; + /* Limit gain edit to a range of +12dB to -24dB with parametric OMASA mode */ + test(); + IF( GT_32( hIvasEditableParameters.ism_metadata[obj].gain_fx, EDIT_GAIN_MAX_Q29 ) ) + { + st_ivas->hMasaIsmData->gain_ism_edited_fx[obj] = EDIT_GAIN_MAX_Q12; + move16(); + } + ELSE IF( EQ_16( ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) && LT_32( hIvasEditableParameters.ism_metadata[obj].gain_fx, EDIT_GAIN_MIN_Q29 ) ) + { + st_ivas->hMasaIsmData->gain_ism_edited_fx[obj] = EDIT_GAIN_MIN_Q12; + move16(); + } + ELSE + { + st_ivas->hMasaIsmData->gain_ism_edited_fx[obj] = shr( extract_h( hIvasEditableParameters.ism_metadata[obj].gain_fx ), Q1 ); // Q29 --> Q12 + move16(); + } + } + ELSE + { + st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 0u; + } + move32(); + } + + /* Copy edited values to hIsmMetaData struct */ + IF( st_ivas->hIsmMetaData[obj] != NULL ) + { + st_ivas->hIsmMetaData[obj]->edited_azimuth_fx = hIvasEditableParameters.ism_metadata[obj].azimuth_fx; + move32(); + st_ivas->hIsmMetaData[obj]->edited_elevation_fx = hIvasEditableParameters.ism_metadata[obj].elevation_fx; + move32(); + IF( EQ_16( ism_mode, ISM_MASA_MODE_DISC ) ) + { + st_ivas->hIsmMetaData[obj]->edited_yaw_fx = hIvasEditableParameters.ism_metadata[obj].yaw_fx; + move16(); + st_ivas->hIsmMetaData[obj]->edited_pitch_fx = hIvasEditableParameters.ism_metadata[obj].pitch_fx; + move16(); + st_ivas->hIsmMetaData[obj]->edited_radius_fx = hIvasEditableParameters.ism_metadata[obj].radius_fx; + move16(); + } + test(); + IF( GT_32( hIvasEditableParameters.ism_metadata[obj].gain_fx, EDIT_GAIN_MAX_Q29 ) ) + { + st_ivas->hIsmMetaData[obj]->edited_gain_fx = EDIT_GAIN_MAX_Q29; + } + ELSE IF( EQ_16( ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) && LT_32( hIvasEditableParameters.ism_metadata[obj].gain_fx, EDIT_GAIN_MIN_Q29 ) ) + { + st_ivas->hIsmMetaData[obj]->edited_gain_fx = EDIT_GAIN_MIN_Q29; + } + ELSE + { + st_ivas->hIsmMetaData[obj]->edited_gain_fx = hIvasEditableParameters.ism_metadata[obj].gain_fx; + } + st_ivas->hIsmMetaData[obj]->non_diegetic_flag = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag; + move16(); + } + } + + IF( GT_16( abs_s( sub( shr( extract_h( hIvasEditableParameters.gain_bed_fx ), Q1 ), ONE_IN_Q12 ) ), OMASA_GAIN_EDIT_THR_Q12 ) ) // | gain_bed - 1.0f | > gain_threshold + { + /* Limit gain edit to a range of +12dB to -24dB with parametric OMASA mode */ + test(); + IF( GT_32( hIvasEditableParameters.gain_bed_fx, EDIT_GAIN_MAX_Q29 ) ) + { + st_ivas->hMasaIsmData->gain_masa_edited_fx = EDIT_GAIN_MAX_Q12; + move16(); + } + ELSE IF( EQ_16( ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) && LT_32( hIvasEditableParameters.gain_bed_fx, EDIT_GAIN_MIN_Q29 ) ) + { + st_ivas->hMasaIsmData->gain_masa_edited_fx = EDIT_GAIN_MIN_Q12; + move16(); + } + ELSE + { + st_ivas->hMasaIsmData->gain_masa_edited_fx = shr( extract_h( hIvasEditableParameters.gain_bed_fx ), Q1 ); + move16(); + } + st_ivas->hMasaIsmData->masa_gain_is_edited = 1; + } + ELSE + { + st_ivas->hMasaIsmData->masa_gain_is_edited = 0; + } + move16(); + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_PrepareRenderer( ) + * + * prepare IVAS renderer + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_PrepareRenderer( + IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ +) +{ + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + test(); + IF( hIvasDec->hasBeenFedFirstGoodFrame || hIvasDec->isInitialized ) /* note: 'isInitialized' is related to EVS decoder */ + { + ivas_dec_prepare_renderer_fx( hIvasDec->st_ivas ); + } + + hIvasDec->hasBeenPreparedRendering = true; + move16(); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * ivas_dec_voip_get_samples_common( ) + * + * Main function to output one frame in VoIP. Holds common code for + * regular output configs and split rendering configs. + *---------------------------------------------------------------------*/ + +static ivas_error ivas_dec_voip_get_samples_common + + ( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + UWord16 nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + /* const IVAS_DEC_PCM_TYPE pcmType, */ /* i : type for the decoded PCM resolution */ + Word16 *pcmBuf, /* o : output synthesis signal */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ + Word32 **p_head_pose_buf, /* i : PCM buffer with head-pose data */ +#ifdef SUPPORT_JBM_TRACEFILE + JbmTraceFileWriterFn jbmWriterFn, + void *jbmWriter, +#endif + bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ + UWord16 *nSamplesRendered, /* o : number of samples rendered */ + bool *parametersAvailableForEditing, /* o : indicates whether objects editing is available */ + const UWord32 systemTimestamp_ms /* i : current system timestamp */ + ) +{ + Decoder_Struct *st_ivas; + DECODER_CONFIG_HANDLE hDecoderConfig; + IVAS_DEC_VOIP *hVoIP; + UWord32 extBufferedTime_ms, scale, maxScaling; + JB4_DATAUNIT_HANDLE dataUnit; + UWord16 extBufferedSamples; + Word16 result; + ivas_error error; + UWord8 nOutChannels; + + *parametersAvailableForEditing = false; + move16(); + + test(); + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->hVoIP == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + hDecoderConfig = st_ivas->hDecoderConfig; + hVoIP = hIvasDec->hVoIP; + nOutChannels = (UWord8) st_ivas->hDecoderConfig->nchan_out; + move16(); + + IF( nSamplesPerChannel == 0 ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + test(); + test(); + IF( ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || + EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) && + splitRendBits == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* make sure that the FIFO after decoder/scaler contains at least one sound card frame (i.e. 20ms) */ + WHILE( LT_16( *nSamplesRendered, nSamplesPerChannel ) ) + { + IF( hIvasDec->nSamplesAvailableNext == 0 ) + { + Word16 nSamplesBuffered; + nSamplesBuffered = 0; + move16(); + + IF( hIvasDec->hasBeenFedFirstGoodFrame ) + { + /* check if the TC buffer already exists, otherweise nothing is buffered anyway */ + IF( st_ivas->hTcBuffer != NULL ) + { + nSamplesBuffered = sub( st_ivas->hTcBuffer->n_samples_buffered, st_ivas->hTcBuffer->n_samples_rendered ); + nSamplesBuffered = add( nSamplesBuffered, hVoIP->nSamplesRendered20ms ); + } + } + + extBufferedSamples = nSamplesBuffered; + move16(); + Word16 exp; + extBufferedTime_ms = BASOP_Util_Divide3232_Scale( imult3216( extBufferedSamples, 1000 ), hDecoderConfig->output_Fs, &exp ); + extBufferedTime_ms = (UWord32) W_shr( extBufferedTime_ms, sub( 15, exp ) ); // Q0 + dataUnit = NULL; + + /* pop one access unit from the jitter buffer */ + result = JB4_PopDataUnit( hVoIP->hJBM, systemTimestamp_ms, extBufferedTime_ms, &dataUnit, &scale, &maxScaling ); + IF( result != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + + IF( EQ_32( hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) + { + if ( GT_32( maxScaling, 20 ) ) + { + maxScaling = 20; + move16(); + } + } + maxScaling = Mult_32_32( imult3216( hDecoderConfig->output_Fs, (Word16) maxScaling ), INV_1000_Q31 ); + +#ifdef DEBUG_MODE_JBM + dbgwrite( &extBufferedSamples, sizeof( uint16_t ), 1, 1, "./res/JBM_extBufferedSamples.dat" ); + dbgwrite( &systemTimestamp_ms, sizeof( uint32_t ), 1, 1, "./res/JBM_systemTimestamp.dat" ); + dbgwrite( &scale, sizeof( uint32_t ), 1, 1, "./res/JBM_scale.dat" ); + dbgwrite( &maxScaling, sizeof( uint32_t ), 1, 1, "./res/JBM_maxScale.dat" ); +#endif + /* avoid time scaling multiple times within one 20ms frame*/ + IF( NE_64( scale, 100U ) ) + { + IF( hIvasDec->timeScalingDone ) + { + scale = 100; + move32(); + } + } + + /* limit scale to range supported by time scaler */ + IF( LT_32( scale, APA_MIN_SCALE ) ) + { + scale = APA_MIN_SCALE; + move32(); + } + ELSE IF( GT_32( scale, APA_MAX_SCALE ) ) + { + scale = APA_MAX_SCALE; + move32(); + } + + IF( NE_32( ( error = IVAS_DEC_VoIP_SetScale( hIvasDec, (Word16) maxScaling, (Word16) scale ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* copy bitstream into decoder state */ + IF( dataUnit ) + { + hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; + + bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); + + IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } + + *bitstreamReadDone = true; + } + ELSE IF( hIvasDec->hasDecodedFirstGoodFrame ) + { + /* Decoder has been initialized with first good frame - do PLC */ + IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + +#ifdef SUPPORT_JBM_TRACEFILE + /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ + test(); + IF( jbmWriterFn != NULL && jbmWriter != NULL ) + { + /* write JBM trace data entry */ + store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); + IF( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing JBM Trace data to file\n" ); + return IVAS_ERR_UNKNOWN; + } + } +#endif + IF( dataUnit ) + { + IF( dataUnit->partial_frame != 0 ) + { + hVoIP->lastDecodedWasActive = 1; + } + ELSE + { + hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; + } + move16(); + + /* data unit memory is no longer used */ + JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); + } + + test(); + IF( hIvasDec->hasBeenFedFirstGoodFrame && *bitstreamReadDone == true ) + { + /* new bitstream was feeded, return for reconfiguration */ + return IVAS_ERR_OK; + } + + IF( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; + move16(); + } + } + + /* decode */ + IF( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + /* codec mode to use not known yet - simply output silence */ + /* directly set output zero */ + Word16 nSamplesToZero = s_min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); + set16_fx( pcmBuf + imult1616( *nSamplesRendered, nOutChannels ), 0, imult1616( nSamplesToZero, nOutChannels ) ); + *nSamplesRendered = add( *nSamplesRendered, nSamplesToZero ); + hIvasDec->nSamplesAvailableNext = sub( hIvasDec->nSamplesAvailableNext, nSamplesToZero ); + move16(); + move16(); + update_voip_rendered20ms( hIvasDec, nSamplesToZero ); + } + ELSE + { + Word16 nSamplesToRender, nSamplesRendered_loop; + bool tmp; + + /* decode TCs, do TSM and prepare the renderer */ + test(); + IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) + { + test(); + IF( hIvasDec->nSamplesAvailableNext == 0 || EQ_16( hIvasDec->nSamplesAvailableNext, hIvasDec->nSamplesFrame ) ) + { + IF( NE_32( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, splitRendBits ) ), IVAS_ERR_OK ) ) + { + return error; + } + + *bitstreamReadDone = false; + move16(); + *parametersAvailableForEditing = true; + move16(); + + return IVAS_ERR_OK; + } + } + + nSamplesToRender = sub( nSamplesPerChannel, *nSamplesRendered ); + + /* check if we still need to prepare the renderer */ + IF( hIvasDec->hasBeenPreparedRendering == false ) + { + IF( NE_32( ( error = IVAS_DEC_PrepareRenderer( hIvasDec ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( splitRendBits != NULL ) + { + /* Render head poses from time-scaled transport channels */ + IF( NE_32( ( error = isar_render_poses( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &tmp ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE{ + /* render IVAS frames directly to the output buffer */ + IF( NE_32( ( error = IVAS_DEC_GetSamplesRenderer( hIvasDec, nSamplesToRender, pcmBuf + imult1616( *nSamplesRendered, nOutChannels ), &nSamplesRendered_loop, &tmp ) ), IVAS_ERR_OK ) ){ + return error; + } + } + + *nSamplesRendered = add( *nSamplesRendered, nSamplesRendered_loop ); + update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); +} +} + +IF( hIvasDec->hasDecodedFirstGoodFrame &&splitRendBits != NULL ) +{ + Word16 Q_out[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; + Word16 i; + + /* Analyse head poses over entire frame, generate ISAR metadata and maybe encode if split coded */ + IF( NE_32( ( error = isar_generate_metadata_and_bitstream( st_ivas, p_head_pose_buf, *nSamplesRendered, splitRendBits, Q_out ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* Synthesise PCM output if split PCM */ + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + scale_sig32( p_head_pose_buf[i], *nSamplesRendered, sub( Q11, Q_out[i] ) ); // Q11 + } + + IF( EQ_32( st_ivas->hDecoderConfig->render_framesize, IVAS_RENDER_FRAMESIZE_5MS ) ) + { +#ifndef DISABLE_LIMITER + ivas_limiter_dec_fx( st_ivas->hLimiter, p_head_pose_buf, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect, Q11 ); +#endif + } + ELSE + { + ivas_limiter_dec_fx( st_ivas->hLimiter, p_head_pose_buf, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect, Q11 ); + } + + ivas_syn_output_fx( p_head_pose_buf, Q11, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, pcmBuf ); + } +} + +return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_GetSamples( ) + * + * Main function to decode one frame in VoIP + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_GetSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + UWord16 nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + /* const IVAS_DEC_PCM_TYPE pcmType, */ /* i : type for the decoded PCM resolution */ + Word16 *pcmBuf, /* o : output synthesis signal */ +#ifdef SUPPORT_JBM_TRACEFILE + JbmTraceFileWriterFn jbmWriterFn, + void *jbmWriter, +#endif + bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ + UWord16 *nSamplesRendered, /* o : number of samples rendered */ + bool *parametersAvailableForEditing, /* o : indicates whether objects editing is available */ + const UWord32 systemTimestamp_ms /* i : current system timestamp */ +) +{ + return ivas_dec_voip_get_samples_common( + hIvasDec, + nSamplesPerChannel, + /* pcmType, */ + pcmBuf, + NULL, + NULL, +#ifdef SUPPORT_JBM_TRACEFILE + jbmWriterFn, + jbmWriter, +#endif + bitstreamReadDone, + nSamplesRendered, + parametersAvailableForEditing, + systemTimestamp_ms ); +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_GetSplitBinauralBitstream( ) + * + * Main function to decode one split-rendering frame in VoIP + *---------------------------------------------------------------------*/ + +/*! r: error code */ +ivas_error IVAS_DEC_VoIP_GetSplitBinauralBitstream( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + /* const IVAS_DEC_PCM_TYPE pcmType, */ /* i : type for the decoded PCM resolution */ + Word16 *pcmBuf, /* o : output synthesis signal */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ +#ifdef SUPPORT_JBM_TRACEFILE + JbmTraceFileWriterFn jbmWriterFn, + void *jbmWriter, +#endif + bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ + UWord16 *nSamplesRendered, /* o : number of samples rendered */ + bool *parametersAvailableForEditing, /* o : indicates whether objects editing is available */ + const UWord32 systemTimestamp_ms /* i : current system timestamp */ +) +{ + Word16 i; + Word32 head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; + Word32 *pp_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; + ivas_error error = IVAS_ERR_UNKNOWN; + Word16 nSamplesPerChannel = 0; + move16(); + + IF( NE_32( ( error = IVAS_DEC_GetRenderFramesizeSamples( hIvasDec, &nSamplesPerChannel ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* Set pointers to beginning of head pose buffers */ + FOR( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) + { + pp_head_pose_buf[i] = head_pose_buf[i]; + } + + return ivas_dec_voip_get_samples_common( + hIvasDec, + nSamplesPerChannel, + /* IVAS_DEC_PCM_INT16, */ + pcmBuf, + splitRendBits, + pp_head_pose_buf, +#ifdef SUPPORT_JBM_TRACEFILE + jbmWriterFn, + jbmWriter, +#endif + bitstreamReadDone, + nSamplesRendered, + parametersAvailableForEditing, + systemTimestamp_ms ); +} + + +/*---------------------------------------------------------------------* + * update_voip_rendered20ms( ) + * + * pdate the number of samples that have been rendered since the last 20ms render border + *---------------------------------------------------------------------*/ + +static void update_voip_rendered20ms( + IVAS_DEC_HANDLE hIvasDec, + const Word16 nSamplesRendered ) +{ + Word16 nSamplesRenderedTotal; + + nSamplesRenderedTotal = add( hIvasDec->hVoIP->nSamplesRendered20ms, nSamplesRendered ); + + /* we have crossed a 20ms border, reset the time scaling done flag */ + IF( GE_16( nSamplesRenderedTotal, hIvasDec->nSamplesFrame ) ) + { + hIvasDec->timeScalingDone = 0; + move16(); + } + + /* float code was: hIvasDec->hVoIP->nSamplesRendered20ms = nSamplesRenderedTotal % hIvasDec->hVoIP->nSamplesFrame; */ + hIvasDec->hVoIP->nSamplesRendered20ms = nSamplesRenderedTotal; + move16(); + WHILE( GE_16( hIvasDec->hVoIP->nSamplesRendered20ms, hIvasDec->nSamplesFrame ) ) + { + hIvasDec->hVoIP->nSamplesRendered20ms = sub( hIvasDec->hVoIP->nSamplesRendered20ms, hIvasDec->nSamplesFrame ); + } + + return; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_Flush( ) + * + * Function to flush remaining audio samples in VoIP + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_Flush( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const Word16 nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + Word16 *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels Q0 */ + Word16 *nSamplesFlushed /* o : number of samples flushed */ +) +{ + ivas_error error; + UWord16 nSamplesToRender; + UWord16 nSamplesFlushedLocal; + + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + +#ifdef TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR + hIvasDec->st_ivas->flushing = 1; + move16(); +#endif + + *nSamplesFlushed = s_min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); + move16(); + + nSamplesToRender = (UWord16) *nSamplesFlushed; + move16(); + + /* render IVAS frames */ + error = IVAS_ERR_OK; + move16(); + + test(); + IF( GT_16( nSamplesToRender, 0 ) && NE_16( (Word16) hIvasDec->st_ivas->ivas_format, (Word16) MONO_FORMAT ) ) + { + error = ivas_jbm_dec_render_fx( hIvasDec->st_ivas, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmBuf ); + } + ELSE + { + *nSamplesFlushed = 0; + move16(); + } + +#ifdef TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR + hIvasDec->st_ivas->flushing = 0; + move16(); +#endif + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_isRestartNeeded( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_isRestartNeeded( + IVAS_DEC_HANDLE hIvasDec, /* i : IVAS decoder handle */ + bool *restartNeeded /* o : flag to signal decoder restart */ +) +{ + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *restartNeeded = false; + move16(); + if ( EQ_16( hIvasDec->st_ivas->restartNeeded, 1 ) ) + { + *restartNeeded = true; + move16(); + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_IsEmpty( ) + * + * Returns 'true' if decoder has no data in VoIP jitter buffer + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_IsEmpty( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const Word16 nSamplesAsked, /* i : number of output samples asked */ + bool *isEmpty /* o : isEmpty flag */ +) +{ + test(); + IF( hIvasDec == NULL || hIvasDec->hVoIP == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *isEmpty = false; + move16(); + test(); + if ( ( JB4_bufferedDataUnits( hIvasDec->hVoIP->hJBM ) == 0 ) && LT_16( hIvasDec->nSamplesAvailableNext, nSamplesAsked ) ) + { + *isEmpty = true; + move16(); + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_Get_CA_offset( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_Get_CA_offset( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *optimum_offset, + Word16 *FEC_hi ) +{ + test(); + test(); + IF( ( hIvasDec == NULL || hIvasDec->hVoIP == NULL || hIvasDec->hVoIP->hJBM == NULL ) ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *optimum_offset = JB4_getFECoffset( hIvasDec->hVoIP->hJBM ); + *FEC_hi = JB4_FECoffset( hIvasDec->hVoIP->hJBM ); + move16(); + move16(); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * ivas_destroy_handle_VoIP( ) + * + * Deallocate VoIP handle + *---------------------------------------------------------------------*/ + +static void ivas_destroy_handle_VoIP_fx( + IVAS_DEC_VOIP *hVoIP /* i/o: IVAS decoder handle */ +) +{ + JB4_Destroy( &hVoIP->hJBM ); + + IF( hVoIP->bs_conversion_buf != NULL ) + { +#define WMC_TOOL_SKIP + /* Bitstream conversion is not counted towards complexity and memory usage */ + free( hVoIP->bs_conversion_buf ); +#undef WMC_TOOL_SKIP + } + + free( hVoIP ); + + return; +} + +#ifdef SUPPORT_JBM_TRACEFILE + +/*---------------------------------------------------------------------* + * store_JbmData() + * + * Store JBM trace data entry + *---------------------------------------------------------------------*/ + +static void store_JbmData( + IVAS_DEC_VOIP *hVoIP, + JB4_DATAUNIT_HANDLE dataUnit, + const UWord32 systemTimestamp_ms, + const UWord16 extBufferedSamples, + const Word32 output_Fs ) +{ + IVAS_JBM_TRACE_DATA *JbmTraceData; + + IF( hVoIP == NULL ) + { + return; + } + + JbmTraceData = &hVoIP->JbmTraceData; + + JbmTraceData->systemTimestamp_ms = systemTimestamp_ms; + JbmTraceData->extBufferedSamples = extBufferedSamples; + JbmTraceData->lastDecodedWasActive = hVoIP->lastDecodedWasActive; + JbmTraceData->output_Fs = output_Fs; + JbmTraceData->dataUnit_flag = dataUnit != NULL; + move16(); + move16(); + move16(); + move32(); + move32(); + IF( dataUnit != NULL ) + { + JbmTraceData->sequenceNumber = dataUnit->sequenceNumber; + JbmTraceData->timeStamp = dataUnit->timeStamp; + JbmTraceData->rcvTime = dataUnit->rcvTime; + JbmTraceData->partial_frame = dataUnit->partial_frame; + JbmTraceData->partialCopyOffset = dataUnit->partialCopyOffset; + move16(); + move16(); + move16(); + move32(); + move32(); + } + + return; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetJbmData() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetJbmData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_JBM_TRACE_DATA *JbmTraceData /* o : JBM Trace data */ + +) +{ + test(); + test(); + IF( hIvasDec == NULL || hIvasDec->hVoIP == NULL || JbmTraceData == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *JbmTraceData = hIvasDec->hVoIP->JbmTraceData; + + return IVAS_ERR_OK; +} + +#endif + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetErrorMessage( ) + * + * Maps error codes to error description strings + *---------------------------------------------------------------------*/ + +const char *IVAS_DEC_GetErrorMessage( + ivas_error error /* i : decoder error code enum */ +) +{ + return ivas_error_to_string( error ); +} + + +/*---------------------------------------------------------------------* + * printConfigInfo_dec( ) + * + * + *---------------------------------------------------------------------*/ + +static ivas_error printConfigInfo_dec( + Decoder_Struct *st_ivas, + const Word16 bitstreamformat, + const bool Opt_VOIP, + const bool quietModeEnabled ) +{ + ivas_error error; + Word8 config_str[50]; + AUDIO_CONFIG output_config; + + /*-----------------------------------------------------------------* + * Print info on screen + *-----------------------------------------------------------------*/ + + fprintf( stdout, "\n" ); + + /*-----------------------------------------------------------------* + * Print output sampling frequency + *-----------------------------------------------------------------*/ + + fprintf( stdout, "Output sampling rate: %d Hz\n", st_ivas->hDecoderConfig->output_Fs ); + + /*-----------------------------------------------------------------* + * Print bitrate + *-----------------------------------------------------------------*/ + + IF( !quietModeEnabled ) + { + IF( !Opt_VOIP ) + { + fprintf( stdout, "Bitrate: %.2f kbps\n", (float) st_ivas->hDecoderConfig->ivas_total_brate / 1000 ); + + IF( st_ivas->hDecoderConfig->ivas_total_brate <= 0 ) + { + IF( EQ_16( bitstreamformat, G192 ) ) + { + fprintf( stdout, "Active Bitrate not identified in bitstream file \n" ); + } + ELSE /* MIME */ + { + fprintf( stdout, "Active Bitrate not identified from first MIME frame \n" ); + } + } + } + } + + /*-----------------------------------------------------------------* + * Print output configuration + *-----------------------------------------------------------------*/ + + IF( EQ_16( (Word16) st_ivas->ivas_format, MONO_FORMAT ) ) + { + IF( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) + { + fprintf( stdout, "Output configuration: mono EVS bit-exact decoding to stereo\n" ); + float non_diegetic_pan_gain = (float) ( st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx ) / (float) ( 1LL << Q15 ); + fprintf( stdout, "Non-diegetic panning: %.2f\n", non_diegetic_pan_gain * 90.f ); + } + ELSE + { + output_config = st_ivas->hDecoderConfig->output_config; + IF( NE_16( (Word16) output_config, IVAS_AUDIO_CONFIG_MONO ) ) + { + get_channel_config( output_config, &config_str[0] ); + fprintf( stdout, "Output configuration: mono EVS bit-exact decoding rendering to %s\n", config_str ); + } + ELSE + { + fprintf( stdout, "Output configuration: mono EVS bit-exact decoding\n" ); + } + } + } + ELSE + { + IF( !quietModeEnabled ) + { + IF( EQ_16( (Word16) st_ivas->ivas_format, STEREO_FORMAT ) ) + { + fprintf( stdout, "Input configuration: Stereo\n" ); + } + ELSE IF( EQ_16( (Word16) st_ivas->ivas_format, ISM_FORMAT ) ) + { + IF( EQ_16( (Word16) st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + fprintf( stdout, "Input configuration: ISM (ParamISM): 2 transport channels\n" ); + } + ELSE + { + fprintf( stdout, "Input configuration: ISM: %d transport channel(s)\n", st_ivas->nchan_transport ); + } + } + ELSE IF( EQ_16( (Word16) st_ivas->ivas_format, SBA_FORMAT ) ) + { + fprintf( stdout, "Input configuration: Scene Based Audio, Ambisonic order %i%s, %d transport channel(s)\n", st_ivas->sba_order, st_ivas->sba_planar ? " (Planar)" : "", st_ivas->nchan_transport ); + } + ELSE IF( EQ_16( (Word16) st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + fprintf( stdout, "Input configuration: Combined Scene Based Audio, Ambisonic order %i, with %d Objects \n", st_ivas->sba_order, st_ivas->nchan_ism ); + } + ELSE IF( EQ_16( (Word16) st_ivas->ivas_format, MASA_FORMAT ) ) + { + fprintf( stdout, "Input configuration: MASA - %d channel(s)\n", st_ivas->nchan_transport ); + } + ELSE IF( EQ_16( (Word16) st_ivas->ivas_format, MC_FORMAT ) ) + { + IF( NE_32( ( error = get_channel_config( st_ivas->transport_config, &config_str[0] ) ), IVAS_ERR_OK ) ) + { + return error; + } + + fprintf( stdout, "Input configuration: %s\n", config_str ); + } + ELSE IF( EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + fprintf( stdout, "Input configuration: combined ISM and MASA (%i ISM stream(s)) \n", st_ivas->nchan_ism ); + } + } + + output_config = st_ivas->hDecoderConfig->output_config; + move16(); + get_channel_config( output_config, &config_str[0] ); + fprintf( stdout, "Output configuration: %s\n", config_str ); + + test(); + test(); + IF( ( EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) + { + fprintf( stdout, "Render framesize: %dms\n", get_render_frame_size_ms( st_ivas->hDecoderConfig->render_framesize ) ); + } + IF( st_ivas->hDecoderConfig->Opt_HRTF_binary ) + { + fprintf( stdout, "HRIR/BRIR file: ON\n" ); + } + + IF( st_ivas->hDecoderConfig->Opt_RendConfigCustom ) + { + fprintf( stdout, "Renderer config. file: ON\n" ); + } + + IF( st_ivas->hDecoderConfig->Opt_Headrotation ) + { + fprintf( stdout, "Head rotation: ON\n" ); + } + + IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + fprintf( stdout, "External orientation: ON\n" ); + } + + IF( NE_16( (Word16) st_ivas->hDecoderConfig->orientation_tracking, IVAS_HEAD_ORIENT_TRK_NONE ) ) + { + SWITCH( st_ivas->hDecoderConfig->orientation_tracking ) + { + case IVAS_HEAD_ORIENT_TRK_AVG: + fprintf( stdout, "Orientation tracking: AVG\n" ); + BREAK; + case IVAS_HEAD_ORIENT_TRK_REF: + fprintf( stdout, "Orientation tracking: REF\n" ); + BREAK; + case IVAS_HEAD_ORIENT_TRK_REF_VEC: + fprintf( stdout, "Orientation tracking: REF_VEC\n" ); + BREAK; + case IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV: + fprintf( stdout, "Orientation tracking: REF_VEC_LEV\n" ); + BREAK; + default: + BREAK; + } + } + + IF( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) + { + float non_diegetic_pan_gain = (float) ( st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx ) / (float) ( 1LL << Q15 ); + fprintf( stdout, "Non-diegetic panning: %.2f\n", non_diegetic_pan_gain * 90.f ); + } + + IF( st_ivas->hDecoderConfig->Opt_dpid_on ) + { + fprintf( stdout, "Directivity pattern: ON\n" ); + } + + IF( st_ivas->hDecoderConfig->Opt_aeid_on ) + { + fprintf( stdout, "Acoustic environment ID:ON\n" ); + } + + IF( st_ivas->hDecoderConfig->Opt_ObjEdit_on ) + { + fprintf( stdout, "Objects editing : ON\n" ); + } + } + + /*-----------------------------------------------------------------* + * Print TSM mode info + *-----------------------------------------------------------------*/ + + IF( st_ivas->hDecoderConfig->Opt_tsm ) + { + fprintf( stdout, "TSM mode: ON\n" ); + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_PrintConfig( ) + * + * Print decoder set-up info + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_PrintConfig( + const IVAS_DEC_HANDLE hIvasDec, + const bool quietModeEnabled, + const bool voipMode ) +{ + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + printConfigInfo_dec( hIvasDec->st_ivas, hIvasDec->bitstreamformat, voipMode, quietModeEnabled ); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_PrintDisclaimer( ) + * + * Print IVAS disclaimer to console + *---------------------------------------------------------------------*/ + +void IVAS_DEC_PrintDisclaimer( void ) +{ + print_disclaimer( stderr ); + + return; +} + + +/*---------------------------------------------------------------------* + * evs_dec_main( ) + * + * EVS codec main decoder fucntion + *---------------------------------------------------------------------*/ + +static ivas_error evs_dec_main_fx( + Decoder_Struct *st_ivas ) +{ + DEC_CORE_HANDLE *hCoreCoder; + Word16 mixer_left_fx, mixer_right_fx; + Word32 *p_output_fx[MAX_TRANSPORT_CHANNELS]; + Word16 ch, i, nOutSamples; + Word16 output_16[L_FRAME48k]; + ivas_error error; + + hCoreCoder = st_ivas->hSCE[0]->hCoreCoder; + hCoreCoder[0]->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + move32(); + hCoreCoder[0]->output_frame_fx = extract_l( Mult_32_16( hCoreCoder[0]->output_Fs, INV_FRAME_PER_SEC_Q15 ) ); // Q0 + move16(); + nOutSamples = hCoreCoder[0]->output_frame_fx; + move16(); + + mdct_switching_dec_fx( hCoreCoder[0] ); + + FOR( ch = 0; ch < MAX_TRANSPORT_CHANNELS; ch++ ) + { + p_output_fx[ch] = st_ivas->p_output_fx[ch]; // Q0 + IF( p_output_fx[ch] != NULL ) + { + set_zero_fx( p_output_fx[ch], L_FRAME48k ); + } + } + + /* run the main EVS decoding routine */ + IF( EQ_16( hCoreCoder[0]->codec_mode, MODE1 ) ) + { + IF( hCoreCoder[0]->Opt_AMR_WB ) + { + IF( NE_32( ( error = amr_wb_dec_fx( output_16, hCoreCoder[0] ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + IF( NE_32( ( error = evs_dec_fx( hCoreCoder[0], output_16, FRAMEMODE_NORMAL ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + ELSE + { + IF( hCoreCoder[0]->bfi == 0 ) + { + IF( NE_32( ( error = evs_dec_fx( hCoreCoder[0], output_16, FRAMEMODE_NORMAL ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_16( hCoreCoder[0]->bfi, 2 ) ) + { + IF( NE_32( ( error = evs_dec_fx( hCoreCoder[0], output_16, FRAMEMODE_FUTURE ) ), IVAS_ERR_OK ) ) + { + return error; + } + } ELSE { - Word16 nSamplesToRender, nSamplesRendered_loop; - bool tmp; - nSamplesToRender = sub( nSamplesPerChannel, nSamplesRendered ); - - /* render IVAS frames directly to the output buffer */ - IF( NE_32( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmBuf + imult1616( nSamplesRendered, nOutChannels ), &nSamplesRendered_loop, &tmp ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = evs_dec_fx( hCoreCoder[0], output_16, FRAMEMODE_MISSING ) ), IVAS_ERR_OK ) ) { return error; } - - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); } } - return IVAS_ERR_OK; -} - - -/*---------------------------------------------------------------------* - * IVAS_DEC_VoIP_Flush( ) - * - * Function to flush remaining audio in VoIP - *---------------------------------------------------------------------*/ - -ivas_error IVAS_DEC_Flush( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const Word16 nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ - Word16 *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels Q0 */ - Word16 *nSamplesFlushed /* o : number of samples flushed */ -) -{ - ivas_error error; - UWord16 nSamplesToRender; - UWord16 nSamplesFlushedLocal; - - *nSamplesFlushed = s_min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); - move16(); + FOR( i = 0; i < nOutSamples; i++ ) + { + p_output_fx[0][i] = L_shl( output_16[i], Q11 ); /* Q11 */ + } - nSamplesToRender = (UWord16) *nSamplesFlushed; + st_ivas->BER_detect = hCoreCoder[0]->BER_detect; move16(); + IF( EQ_16( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) + { + mixer_left_fx = add( shr( st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, Q1 ), ONE_IN_Q14 ); // Q14 + mixer_right_fx = sub( MAX16B, mixer_left_fx ); - /* render IVAS frames */ - error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmBuf ); - - return error; -} - - -/*---------------------------------------------------------------------* - * IVAS_DEC_VoIP_IsEmpty( ) - * - * - *---------------------------------------------------------------------*/ + v_multc_fx_16( p_output_fx[0], mixer_right_fx, p_output_fx[1], nOutSamples ); /* Q11 */ + v_multc_fx_16( p_output_fx[0], mixer_left_fx, p_output_fx[0], nOutSamples ); /* Q11 */ + } -bool IVAS_DEC_VoIP_IsEmpty( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const Word16 nSamplesAsked ) -{ test(); - return ( JB4_bufferedDataUnits( hIvasDec->hVoIP->hJBM ) == 0 && LT_16( hIvasDec->nSamplesAvailableNext, nSamplesAsked ) ); + IF( st_ivas->hDecoderConfig->Opt_tsm && EQ_16( st_ivas->hDecoderConfig->nchan_out, 1 ) ) + { + /* BE workaround: in order to keep EVS bit-exact wrt. TS 26.443, convert 'float' output data to 'short' before the TSM */ + /* not applicable in BASOP */ + } + + return IVAS_ERR_OK; } /*---------------------------------------------------------------------* - * IVAS_DEC_VoIP_Get_CA_offset( ) + * input_format_API_to_internal() * * *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_VoIP_Get_CA_offset( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - Word16 *optimum_offset, - Word16 *FEC_hi ) +static ivas_error input_format_API_to_internal( + IVAS_DEC_INPUT_FORMAT input_format, + Word16 *bitstream_format_internal, + Word16 *sdp_hf_only, + const bool is_voip_enabled ) { - test(); - test(); - IF( ( hIvasDec == NULL || hIvasDec->hVoIP == NULL || hIvasDec->hVoIP->hJBM == NULL ) ) + SWITCH( input_format ) { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; + case IVAS_DEC_INPUT_FORMAT_G192: + IF( is_voip_enabled ) + { + *bitstream_format_internal = VOIP_G192_RTP; + } + ELSE + { + *bitstream_format_internal = G192; + } + *sdp_hf_only = 0; + BREAK; + case IVAS_DEC_INPUT_FORMAT_MIME: + *bitstream_format_internal = MIME; + *sdp_hf_only = 0; + BREAK; + case IVAS_DEC_INPUT_FORMAT_RTPDUMP: + assert( is_voip_enabled && "RTP dump only supported in VoIP mode" ); + *bitstream_format_internal = VOIP_RTPDUMP; + *sdp_hf_only = 0; + BREAK; + case IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF: + assert( is_voip_enabled && "RTP dump only supported in VoIP mode" ); + *bitstream_format_internal = VOIP_RTPDUMP; + *sdp_hf_only = 1; + BREAK; + default: + return IVAS_ERR_INVALID_BITSTREAM; } - *optimum_offset = JB4_getFECoffset( hIvasDec->hVoIP->hJBM ); - *FEC_hi = JB4_FECoffset( hIvasDec->hVoIP->hJBM ); move16(); move16(); @@ -2947,547 +5777,664 @@ ivas_error IVAS_DEC_VoIP_Get_CA_offset( /*---------------------------------------------------------------------* - * IVAS_DEC_Close_VoIP( ) - * + * apa_setup() * + * Setup APA decoder *---------------------------------------------------------------------*/ -static void IVAS_DEC_Close_VoIP( - IVAS_DEC_VOIP *hVoIP /* i/o: IVAS decoder handle */ -) +static ivas_error apa_setup( + IVAS_DEC_HANDLE hIvasDec, + const bool isInitialized_voip, + const UWord16 nTransportChannels ) { - JB4_Destroy( &hVoIP->hJBM ); + UWord16 l_ts; - IF( hVoIP->bs_conversion_buf != NULL ) + l_ts = (UWord16) hIvasDec->st_ivas->hTcBuffer->n_samples_granularity; + move16(); + + IF( !isInitialized_voip ) { -#define WMC_TOOL_SKIP - /* Bitstream conversion is not counted towards complexity and memory usage */ - free( hVoIP->bs_conversion_buf ); -#undef WMC_TOOL_SKIP - } + DECODER_CONFIG_HANDLE hDecoderConfig; - free( hVoIP ); + UWord16 wss, css; + Word32 startQuality; - return; -} + startQuality = L_shl( L_deposit_l( hIvasDec->tsm_quality ), Q2 ); /* Q14 --> Q16*/ + hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig; + IF( EQ_32( hDecoderConfig->output_Fs, 8000 ) ) + { + wss = 1; + css = 1; + } + ELSE IF( EQ_32( hDecoderConfig->output_Fs, 16000 ) ) + { + wss = 2; + css = 1; + } + ELSE IF( EQ_32( hDecoderConfig->output_Fs, 32000 ) ) + { + wss = 4; + css = 2; + } + ELSE IF( EQ_32( hDecoderConfig->output_Fs, 48000 ) ) + { + wss = 6; + css = 3; + } + ELSE + { + return IVAS_ERR_INIT_ERROR; + } -#ifdef SUPPORT_JBM_TRACEFILE -/*---------------------------------------------------------------------* - * store_JbmData() - * - * Store JBM trace data entry - *---------------------------------------------------------------------*/ + move16(); + move16(); -static void store_JbmData( - IVAS_DEC_VOIP *hVoIP, - JB4_DATAUNIT_HANDLE dataUnit, - const UWord32 systemTimestamp_ms, - const UWord16 extBufferedSamples, - const Word32 output_Fs ) -{ - IVAS_JBM_TRACE_DATA *JbmTraceData; + test(); + test(); + test(); + test(); + IF( NE_32( (Word32) apa_init( &hIvasDec->hTimeScaler, nTransportChannels ), IVAS_ERR_OK ) || + apa_set_rate( hIvasDec->hTimeScaler, hDecoderConfig->output_Fs ) != 0 || + apa_set_complexity_options( hIvasDec->hTimeScaler, wss, css ) != 0 || + apa_set_quality( hIvasDec->hTimeScaler, startQuality, 4, 4 ) != 0 || + apa_set_renderer_granularity( hIvasDec->hTimeScaler, l_ts ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } - IF( hVoIP == NULL ) + IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) + { + IF( apa_set_evs_compat_mode( hIvasDec->hTimeScaler, true ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + } + } + ELSE { - return; + IF( apa_reconfigure( hIvasDec->hTimeScaler, nTransportChannels, l_ts ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } } - JbmTraceData = &hVoIP->JbmTraceData; - - JbmTraceData->systemTimestamp_ms = systemTimestamp_ms; - JbmTraceData->extBufferedSamples = extBufferedSamples; - JbmTraceData->lastDecodedWasActive = hVoIP->lastDecodedWasActive; - JbmTraceData->output_Fs = output_Fs; - JbmTraceData->dataUnit_flag = dataUnit != NULL; - move16(); - move16(); + hIvasDec->nTransportChannelsOld = nTransportChannels; move16(); - move32(); - move32(); - IF( dataUnit != NULL ) - { - JbmTraceData->sequenceNumber = dataUnit->sequenceNumber; - JbmTraceData->timeStamp = dataUnit->timeStamp; - JbmTraceData->rcvTime = dataUnit->rcvTime; - JbmTraceData->partial_frame = dataUnit->partial_frame; - JbmTraceData->partialCopyOffset = dataUnit->partialCopyOffset; - move16(); - move16(); - move16(); - move32(); - move32(); - } - return; + return IVAS_ERR_OK; } /*---------------------------------------------------------------------* - * IVAS_DEC_GetJbmData() + * IVAS_DEC_GetSplitRendBitstreamHeader() * * *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_GetJbmData( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_JBM_TRACE_DATA *JbmTraceData /* o : JBM Trace data */ - +ivas_error IVAS_DEC_GetSplitRendBitstreamHeader( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + ISAR_SPLIT_REND_CODEC *pCodec, /* o : pointer to codec setting */ + ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, /* o : pointer to pose correction mode */ + Word16 *pIsar_frame_size_ms, /* o : pointer to ISAR frame size setting */ + Word16 *pCodec_frame_size_ms, /* o : pointer to codec frame size setting */ + Word16 *pLc3plusHighRes /* o : pointer to LC3plus High-Res setting */ ) { - IF( hIvasDec->hVoIP == NULL ) + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - *JbmTraceData = hIvasDec->hVoIP->JbmTraceData; + *pCodec = hIvasDec->st_ivas->hRenderConfig->split_rend_config.codec; + *pCodec_frame_size_ms = hIvasDec->st_ivas->hRenderConfig->split_rend_config.codec_frame_size_ms; + *poseCorrection = hIvasDec->st_ivas->hRenderConfig->split_rend_config.poseCorrectionMode; + *pIsar_frame_size_ms = hIvasDec->st_ivas->hRenderConfig->split_rend_config.isar_frame_size_ms; + *pLc3plusHighRes = hIvasDec->st_ivas->hRenderConfig->split_rend_config.lc3plus_highres; return IVAS_ERR_OK; } -#endif - /*---------------------------------------------------------------------* - * IVAS_DEC_GetErrorMessage( ) + * IVAS_DEC_GetCldfbSamples() * - * Maps error codes to error description strings + * API function to output CLDFB samples *---------------------------------------------------------------------*/ -const char *IVAS_DEC_GetErrorMessage( - ivas_error error /* i : decoder error code enum */ +ivas_error IVAS_DEC_GetCldfbSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word32 *out_real, /* o : buffer for decoded PCM real output in CLDFB domain */ + Word32 *out_imag, /* o : buffer for decoded PCM imag output in CLDFB domain */ + AUDIO_CONFIG *audio_config, /* o : audio configuration */ + Word16 *nOutSamples /* o : number of samples per channel written to output buffer */ ) { - return ivas_error_to_string( error ); -} - -#ifndef FIX_DISCLAIMER -/*---------------------------------------------------------------------* - * get_channel_config() - * - * Gets a str related to input config - *---------------------------------------------------------------------*/ + ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend; + Word16 ch, b, slot_idx, num_chs, maxBand, num_samples; -static ivas_error get_channel_config( - AUDIO_CONFIG config, - Word8 *str ) -{ - IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_MONO ) ) - { - strcpy( (char *) str, "Mono" ); - } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_STEREO ) ) - { - strcpy( (char *) str, "Stereo" ); - } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_5_1 ) ) - { - strcpy( (char *) str, "Multichannel 5.1 (CICP6)" ); - } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_7_1 ) ) - { - strcpy( (char *) str, "Multichannel 7.1 (CICP12)" ); - } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_5_1_2 ) ) - { - strcpy( (char *) str, "Multichannel 5.1+2 (CICP14)" ); - } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_5_1_4 ) ) - { - strcpy( (char *) str, "Multichannel 5.1+4 (CICP16)" ); - } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_7_1_4 ) ) - { - strcpy( (char *) str, "Multichannel 7.1+4 (CICP19)" ); - } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - strcpy( (char *) str, "Multichannel (custom loudspeaker layout)" ); - } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_FOA ) ) - { - strcpy( (char *) str, "Ambisonics: First Order (FOA)" ); - } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_HOA2 ) ) - { - strcpy( (char *) str, "Ambisonics: Second Order (HOA2)" ); - } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_HOA3 ) ) + test(); + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hSplitBinRend == NULL ) { - strcpy( (char *) str, "Ambisonics: Third Order (HOA3)" ); + return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_BINAURAL ) ) + + hSplitBinRend = hIvasDec->st_ivas->hSplitBinRend; + num_samples = 0; + + IF( hSplitBinRend->hCldfbDataOut != NULL ) { - strcpy( (char *) str, "Binaural: no room" ); + *audio_config = hSplitBinRend->hCldfbDataOut->config; + IF( hSplitBinRend->hCldfbDataOut->config != IVAS_AUDIO_CONFIG_INVALID ) + { + num_chs = audioCfg2channels( hSplitBinRend->hCldfbDataOut->config ); + maxBand = (Word16) ( ( CLDFB_NO_CHANNELS_MAX * hIvasDec->st_ivas->hDecoderConfig->output_Fs ) / 48000 ); + + FOR( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) + { + FOR( b = 0; b < maxBand; b++ ) + { + FOR( ch = 0; ch < num_chs; ch++ ) + { + *out_real++ = hSplitBinRend->hCldfbDataOut->Cldfb_RealBuffer_fx[ch][slot_idx][b]; + *out_imag++ = hSplitBinRend->hCldfbDataOut->Cldfb_ImagBuffer_fx[ch][slot_idx][b]; + } + } + } + num_samples = CLDFB_NO_COL_MAX * maxBand; + } } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) + ELSE { - strcpy( (char *) str, "Binaural: room with impulse responses" ); + *audio_config = IVAS_AUDIO_CONFIG_INVALID; } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + + *nOutSamples = num_samples; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_create_handle_isar() + * + * Initialize IVAS decoder split-rendering handle + *-------------------------------------------------------------------*/ + +static ivas_error ivas_create_handle_isar( + ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE *hSplitBinRend_out /* o : ISAR split binaural rendering handle */ +) +{ + ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend; + Word16 i; + + IF( ( hSplitBinRend = (ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE) malloc( sizeof( ISAR_DEC_SPLIT_REND_WRAPPER ) ) ) == NULL ) { - strcpy( (char *) str, "Binaural: room with reverb" ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for IVAS decoder handle" ); } - ELSE IF( EQ_16( (Word16) config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + + isar_init_split_rend_handles( &hSplitBinRend->splitrend ); + + hSplitBinRend->hMultiBinTdData = NULL; + FOR( i = 0; i < MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; ++i ) { - strcpy( (char *) str, "External renderer" ); + hSplitBinRend->hMultiBinCldfbData[i] = NULL; } - ELSE + hSplitBinRend->hCldfbDataOut = NULL; + hSplitBinRend->numTdSamplesPerChannelCached = 0; + move16(); + + *hSplitBinRend_out = hSplitBinRend; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_destroy_handle_isar() + * + * destroy IVAS decoder split rend handle + *-------------------------------------------------------------------*/ + +static void ivas_destroy_handle_isar( + ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE *hSplitBinRend /* i/o: ISAR split binaural rendering handle */ +) +{ + Word16 i; + + IF( *hSplitBinRend != NULL ) { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Error: Incorrect Input/Output Configuration" ); + IF( ( *hSplitBinRend )->hMultiBinTdData != NULL ) + { + ivas_TD_RINGBUF_Close( &( *hSplitBinRend )->hMultiBinTdData ); + } + + FOR( i = 0; i < MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; ++i ) + { + IF( ( *hSplitBinRend )->hMultiBinCldfbData[i] != NULL ) + { + ivas_CLDFB_RINGBUF_Close( &( *hSplitBinRend )->hMultiBinCldfbData[i] ); + } + } + + ISAR_PRE_REND_close( &( *hSplitBinRend )->splitrend, NULL ); + + IF( ( *hSplitBinRend )->hCldfbDataOut != NULL ) + { + free( ( *hSplitBinRend )->hCldfbDataOut ); + ( *hSplitBinRend )->hCldfbDataOut = NULL; + } + + free( *hSplitBinRend ); + *hSplitBinRend = NULL; } - return IVAS_ERR_OK; + return; } -#endif + /*---------------------------------------------------------------------* - * printConfigInfo_dec( ) + * IVAS_DEC_is_split_rendering_enabled() * * *---------------------------------------------------------------------*/ -static ivas_error printConfigInfo_dec( - Decoder_Struct *st_ivas, - const Word16 bitstreamformat, - const bool Opt_VOIP, - const bool quietModeEnabled ) +/*! r: decoder error code */ +ivas_error IVAS_DEC_is_split_rendering_enabled( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *isSplitRend /* o : flag to indicate if split rendering is enabled */ +) { - ivas_error error; - Word8 config_str[50]; - AUDIO_CONFIG output_config; + Decoder_Struct *st_ivas; - /*-----------------------------------------------------------------* - * Print info on screen - *-----------------------------------------------------------------*/ + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } - fprintf( stdout, "\n" ); + st_ivas = hIvasDec->st_ivas; - /*-----------------------------------------------------------------* - * Print output sampling frequency - *-----------------------------------------------------------------*/ + *isSplitRend = is_split_rendering_enabled( st_ivas->hDecoderConfig, st_ivas->hRenderConfig ); - fprintf( stdout, "Output sampling rate: %d Hz\n", st_ivas->hDecoderConfig->output_Fs ); + return IVAS_ERR_OK; +} - /*-----------------------------------------------------------------* - * Print bitrate - *-----------------------------------------------------------------*/ - IF( !quietModeEnabled ) - { - IF( !Opt_VOIP ) - { - fprintf( stdout, "Bitrate: %.2f kbps\n", (float) st_ivas->hDecoderConfig->ivas_total_brate / 1000 ); +/*-------------------------------------------------------------------* + * ivas_dec_reconfig_split_rend() + * + * IVAS decoder split rend reconfig + *-------------------------------------------------------------------*/ - IF( st_ivas->hDecoderConfig->ivas_total_brate <= 0 ) - { - IF( EQ_16( bitstreamformat, G192 ) ) - { - fprintf( stdout, "Active Bitrate not identified in bitstream file \n" ); - } - ELSE /* MIME */ - { - fprintf( stdout, "Active Bitrate not identified from first MIME frame \n" ); - } - } - } - } +static ivas_error ivas_dec_reconfig_split_rend( + Decoder_Struct *st_ivas /* i : IVAS decoder structure */ +) +{ + ivas_error error; + Word16 cldfb_in_flag, num_ch, ch, isCldfbNeeded, i, pcm_out_flag; + SPLIT_REND_WRAPPER *hSplitRendWrapper; - /*-----------------------------------------------------------------* - * Print output configuration - *-----------------------------------------------------------------*/ + hSplitRendWrapper = &st_ivas->hSplitBinRend->splitrend; + move16(); + pcm_out_flag = ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; + move16(); + cldfb_in_flag = 0; + move16(); - IF( EQ_16( (Word16) st_ivas->ivas_format, MONO_FORMAT ) ) + test(); + test(); + test(); + IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || + EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || + EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || + EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { - IF( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) - { - fprintf( stdout, "Output configuration: mono EVS bit-exact decoding to stereo\n" ); - float non_diegetic_pan_gain = fixedToFloat( st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, 15 ); - fprintf( stdout, "Non-diegetic panning: %.2f\n", non_diegetic_pan_gain * 90.f ); - } - ELSE - { - fprintf( stdout, "Output configuration: mono EVS bit-exact decoding\n" ); - } + cldfb_in_flag = 1; + move16(); } - ELSE - { - IF( !quietModeEnabled ) - { - IF( EQ_16( (Word16) st_ivas->ivas_format, STEREO_FORMAT ) ) - { - fprintf( stdout, "Input configuration: Stereo\n" ); - } - ELSE IF( EQ_16( (Word16) st_ivas->ivas_format, ISM_FORMAT ) ) - { - IF( EQ_16( (Word16) st_ivas->ism_mode, ISM_MODE_PARAM ) ) - { - fprintf( stdout, "Input configuration: ISM (ParamISM): 2 transport channels\n" ); - } - ELSE - { - fprintf( stdout, "Input configuration: ISM: %d transport channel(s)\n", st_ivas->nchan_transport ); - } - } - ELSE IF( EQ_16( (Word16) st_ivas->ivas_format, SBA_FORMAT ) ) - { - fprintf( stdout, "Input configuration: Scene Based Audio, Ambisonic order %i%s, %d transport channel(s)\n", st_ivas->sba_order, st_ivas->sba_planar ? " (Planar)" : "", st_ivas->nchan_transport ); - } - ELSE IF( EQ_16( (Word16) st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - fprintf( stdout, "Input configuration: Combined Scene Based Audio, Ambisonic order %i, with %d Objects \n", st_ivas->sba_order, st_ivas->nchan_ism ); - } - ELSE IF( EQ_16( (Word16) st_ivas->ivas_format, MASA_FORMAT ) ) - { - fprintf( stdout, "Input configuration: MASA - %d channel(s)\n", st_ivas->nchan_transport ); - } - ELSE IF( EQ_16( (Word16) st_ivas->ivas_format, MC_FORMAT ) ) - { - IF( NE_32( ( error = get_channel_config( st_ivas->transport_config, &config_str[0] ) ), IVAS_ERR_OK ) ) - { - return error; - } - fprintf( stdout, "Input configuration: %s\n", config_str ); - } - ELSE IF( EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) ) - { - fprintf( stdout, "Input configuration: combined ISM and MASA (%i ISM stream(s)) \n", st_ivas->nchan_ism ); - } - } + ISAR_PRE_REND_GetMultiBinPoseData( &st_ivas->hRenderConfig->split_rend_config, &hSplitRendWrapper->multiBinPoseData, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->sr_pose_pred_axis : DEFAULT_AXIS ); - output_config = st_ivas->hDecoderConfig->output_config; + isCldfbNeeded = 0; + move16(); + + test(); + test(); + test(); + test(); + IF( ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) && EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) || + ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) ) + { + cldfb_in_flag = 0; move16(); - get_channel_config( output_config, &config_str[0] ); - fprintf( stdout, "Output configuration: %s\n", config_str ); + } - test(); - test(); - IF( ( EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) + IF( NE_16( st_ivas->renderer_type, RENDERER_DISABLE ) ) + { + IF( EQ_16( cldfb_in_flag, 0 ) ) { - fprintf( stdout, "Render framesize: %dms\n", get_render_frame_size_ms( st_ivas->hDecoderConfig->render_framesize ) ); + isCldfbNeeded = 1; + move16(); } - IF( st_ivas->hDecoderConfig->Opt_HRTF_binary ) + ELSE IF( EQ_16( st_ivas->hRenderConfig->split_rend_config.codec, ISAR_SPLIT_REND_CODEC_LC3PLUS ) && cldfb_in_flag ) { - fprintf( stdout, "HRIR/BRIR file: ON\n" ); + isCldfbNeeded = 1; + move16(); } - - IF( st_ivas->hDecoderConfig->Opt_RendConfigCustom ) + ELSE IF( pcm_out_flag && cldfb_in_flag ) { - fprintf( stdout, "Renderer config. file: ON\n" ); + isCldfbNeeded = 1; + move16(); } + } + ELSE IF( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) + { + isCldfbNeeded = 1; + move16(); + } - IF( st_ivas->hDecoderConfig->Opt_Headrotation ) + test(); + test(); + IF( EQ_16( isCldfbNeeded, 1 ) && hSplitRendWrapper->hCldfbHandles == NULL ) + { + IF( ( hSplitRendWrapper->hCldfbHandles = (CLDFB_HANDLES_WRAPPER_HANDLE) malloc( sizeof( CLDFB_HANDLES_WRAPPER ) ) ) == NULL ) { - fprintf( stdout, "Head rotation: ON\n" ); + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB handles\n" ) ); } - IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + num_ch = MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; + move16(); + FOR( ch = 0; ch < num_ch; ch++ ) { - fprintf( stdout, "External orientation: ON\n" ); + hSplitRendWrapper->hCldfbHandles->cldfbAna[ch] = NULL; + move16(); } - IF( NE_16( (Word16) st_ivas->hDecoderConfig->orientation_tracking, IVAS_HEAD_ORIENT_TRK_NONE ) ) + num_ch = i_mult( hSplitRendWrapper->multiBinPoseData.num_poses, BINAURAL_CHANNELS ); + move16(); + + FOR( ch = 0; ch < num_ch; ch++ ) { - SWITCH( st_ivas->hDecoderConfig->orientation_tracking ) + IF( ( error = openCldfb_ivas_fx( &( hSplitRendWrapper->hCldfbHandles->cldfbAna[ch] ), CLDFB_ANALYSIS, st_ivas->hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) { - case IVAS_HEAD_ORIENT_TRK_AVG: - fprintf( stdout, "Orientation tracking: AVG\n" ); - BREAK; - case IVAS_HEAD_ORIENT_TRK_REF: - fprintf( stdout, "Orientation tracking: REF\n" ); - BREAK; - case IVAS_HEAD_ORIENT_TRK_REF_VEC: - fprintf( stdout, "Orientation tracking: REF_VEC\n" ); - BREAK; - case IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV: - fprintf( stdout, "Orientation tracking: REF_VEC_LEV\n" ); - BREAK; - default: - BREAK; + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not open CLDFB handles\n" ) ); } } - IF( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - float non_diegetic_pan_gain = fixedToFloat( st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, 15 ); - fprintf( stdout, "Non-diegetic panning: %.2f\n", non_diegetic_pan_gain * 90.f ); + IF( ( error = openCldfb_ivas_fx( &( hSplitRendWrapper->hCldfbHandles->cldfbSyn[ch] ), CLDFB_SYNTHESIS, st_ivas->hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) + { + return error; + } } - - IF( st_ivas->hDecoderConfig->Opt_dpid_on ) + } + ELSE IF( EQ_16( isCldfbNeeded, 0 ) && hSplitRendWrapper->hCldfbHandles != NULL ) + { + num_ch = MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; + move16(); + FOR( ch = 0; ch < num_ch; ch++ ) { - fprintf( stdout, "Directivity pattern: ON\n" ); + IF( hSplitRendWrapper->hCldfbHandles->cldfbAna[ch] != NULL ) + { + deleteCldfb_fx( &hSplitRendWrapper->hCldfbHandles->cldfbAna[ch] ); + hSplitRendWrapper->hCldfbHandles->cldfbAna[ch] = NULL; + move32(); + } } - IF( st_ivas->hDecoderConfig->Opt_aeid_on ) + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - fprintf( stdout, "Acoustic environment ID:ON\n" ); + IF( hSplitRendWrapper->hCldfbHandles->cldfbSyn[ch] != NULL ) + { + deleteCldfb_fx( &hSplitRendWrapper->hCldfbHandles->cldfbSyn[ch] ); + hSplitRendWrapper->hCldfbHandles->cldfbSyn[ch] = NULL; + move32(); + } } - } - - /*-----------------------------------------------------------------* - * Print TSM mode info - *-----------------------------------------------------------------*/ - IF( st_ivas->hDecoderConfig->Opt_tsm ) - { - fprintf( stdout, "TSM mode: ON\n" ); + free( hSplitRendWrapper->hCldfbHandles ); + hSplitRendWrapper->hCldfbHandles = NULL; + move32(); } - return IVAS_ERR_OK; -} - - -/*---------------------------------------------------------------------* - * IVAS_DEC_PrintConfig( ) - * - * Print decoder set-up info - *---------------------------------------------------------------------*/ - -void IVAS_DEC_PrintConfig( - const IVAS_DEC_HANDLE hIvasDec, - const bool quietModeEnabled, - const bool voipMode ) -{ - printConfigInfo_dec( hIvasDec->st_ivas, hIvasDec->bitstreamformat, voipMode, quietModeEnabled ); + test(); + test(); + test(); + test(); + test(); + IF( ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) && + ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || NE_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && + !( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) ) /* td-rend not needed? */ + { + FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + IF( st_ivas->hTdRendHandles[i] != NULL ) + { + st_ivas->hTdRendHandles[i]->HrFiltSet_p = NULL; + move32(); + ivas_td_binaural_close_fx( &st_ivas->hTdRendHandles[i] ); + } + } + } - return; + return IVAS_ERR_OK; } -/*---------------------------------------------------------------------* - * IVAS_DEC_PrintDisclaimer( ) +/*-------------------------------------------------------------------* + * ivas_dec_split_rend_cldfb_in() * - * Print IVAS disclaimer to console - *---------------------------------------------------------------------*/ + * + *-------------------------------------------------------------------*/ -void IVAS_DEC_PrintDisclaimer( void ) +static Word16 ivas_dec_split_rend_cldfb_in( + const RENDERER_TYPE renderer_type /* i : renderer type */ +) { - print_disclaimer( stderr ); - - return; + test(); + test(); + test(); + IF( EQ_32( renderer_type, RENDERER_BINAURAL_FASTCONV ) || + EQ_32( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || + EQ_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || + EQ_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + return 1; + } + ELSE + { + return 0; + } } -/*---------------------------------------------------------------------* - * evs_dec_main( ) +/*-------------------------------------------------------------------* + * ivas_dec_init_split_rend() * - * EVS codec main decoder fucntion - *---------------------------------------------------------------------*/ + * IVAS decoder split rendering initialization + *-------------------------------------------------------------------*/ -static ivas_error evs_dec_main_fx( - Decoder_Struct *st_ivas, - const Word16 nOutSamples, - Word32 *Buf_fx, // Q11 - Word16 *pcmBuf // Q0 +static ivas_error ivas_dec_init_split_rend( + Decoder_Struct *st_ivas /* i : IVAS decoder structure */ ) { - DEC_CORE_HANDLE *hCoreCoder; - Word16 mixer_left_fx, mixer_right_fx; - Word32 *p_output_fx[MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN]; - Word16 ch, n, i; - Word16 output_16[L_FRAME48k]; ivas_error error; + Word16 cldfb_in_flag, pcm_out_flag; + Word16 mixed_td_cldfb_flag; + Word16 i, num_poses; + ISAR_SPLIT_REND_ROT_AXIS head_rot_axis; - hCoreCoder = st_ivas->hSCE[0]->hCoreCoder; - hCoreCoder[0]->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - hCoreCoder[0]->total_num_bits = st_ivas->num_bits; + pcm_out_flag = 0; move16(); - move32(); - hCoreCoder[0]->output_frame_fx = extract_l( Mult_32_16( hCoreCoder[0]->output_Fs, 0x0290 /*Q0*/ ) ); // Q0 + if ( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + pcm_out_flag = 1; + move16(); + } + cldfb_in_flag = 0; move16(); - mdct_switching_dec_fx( hCoreCoder[0] ); - FOR( ch = 0; ch < MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; ch++ ) + cldfb_in_flag = ivas_dec_split_rend_cldfb_in( st_ivas->renderer_type ); + + head_rot_axis = DEFAULT_AXIS; + move32(); + if ( st_ivas->hHeadTrackData != NULL ) { - p_output_fx[ch] = st_ivas->p_output_fx[ch]; // Q0 + head_rot_axis = st_ivas->hHeadTrackData->sr_pose_pred_axis; + move32(); } - /* run the main EVS decoding routine */ - IF( EQ_16( hCoreCoder[0]->codec_mode, MODE1 ) ) + ISAR_PRE_REND_GetMultiBinPoseData( &st_ivas->hRenderConfig->split_rend_config, &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, head_rot_axis ); + + num_poses = st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; + move16(); + assert( num_poses <= MAX_HEAD_ROT_POSES ); + + IF( cldfb_in_flag ) { - IF( hCoreCoder[0]->Opt_AMR_WB ) - { - IF( NE_32( ( error = amr_wb_dec_fx( output_16, hCoreCoder[0] ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE + FOR( i = 0; i < num_poses * BINAURAL_CHANNELS; ++i ) { - IF( NE_32( ( error = evs_dec_fx( hCoreCoder[0], output_16, FRAMEMODE_NORMAL ) ), IVAS_ERR_OK ) ) + /* note: this is intra-frame heap memory */ + IF( NE_32( ( error = ivas_CLDFB_RINGBUF_Open( &st_ivas->hSplitBinRend->hMultiBinCldfbData[i], CLDFB_NO_COL_MAX ) ), IVAS_ERR_OK ) ) { - return error; + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for split rendering structure" ); } } } ELSE { - IF( hCoreCoder[0]->bfi == 0 ) - { - IF( NE_32( ( error = evs_dec_fx( hCoreCoder[0], output_16, FRAMEMODE_NORMAL ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_16( hCoreCoder[0]->bfi, 2 ) ) + IF( NE_32( ( error = ivas_TD_RINGBUF_Open( &st_ivas->hSplitBinRend->hMultiBinTdData, get_render_frame_size_samples( st_ivas->hDecoderConfig ), i_mult( num_poses, BINAURAL_CHANNELS ) ) ), IVAS_ERR_OK ) ) { - IF( NE_32( ( error = evs_dec_fx( hCoreCoder[0], output_16, FRAMEMODE_FUTURE ) ), IVAS_ERR_OK ) ) - { - return error; - } + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for split rendering structure" ); } - ELSE + } + + IF( EQ_16( cldfb_in_flag, 1 ) && ( EQ_16( st_ivas->hSplitBinRend->splitrend.multiBinPoseData.poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ) ) + { + IF( ( st_ivas->hSplitBinRend->hCldfbDataOut = (ISAR_DEC_SPLIT_REND_CLDFB_OUT_DATA_HANDLE) malloc( sizeof( ISAR_DEC_SPLIT_REND_CLDFB_OUT_DATA ) ) ) == NULL ) { - IF( NE_32( ( error = evs_dec_fx( hCoreCoder[0], output_16, FRAMEMODE_MISSING ) ), IVAS_ERR_OK ) ) - { - return error; - } + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for cldfb data out buffer\n" ) ); } } - FOR( i = 0; i < nOutSamples; i++ ) + mixed_td_cldfb_flag = 0; + move16(); + test(); + test(); + test(); + test(); + IF( ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) && EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) || + ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) ) { - p_output_fx[0][i] = L_shl( output_16[i], Q11 ); /* Q11 */ + mixed_td_cldfb_flag = 1; + move16(); } - st_ivas->BER_detect = hCoreCoder[0]->BER_detect; + error = ISAR_PRE_REND_open( &st_ivas->hSplitBinRend->splitrend, &st_ivas->hRenderConfig->split_rend_config, st_ivas->hDecoderConfig->output_Fs, cldfb_in_flag, pcm_out_flag, st_ivas->hDecoderConfig->render_framesize, mixed_td_cldfb_flag ); move16(); - IF( EQ_16( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_is_split_rendering_coded_out() + * + * Return flag to indicate if split rendering is enabled + *---------------------------------------------------------------------*/ + +/*! r: decoder error code */ +ivas_error IVAS_DEC_is_split_rendering_coded_out( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + Word16 *isSplitCoded /* o : flag to indicate if split rendering is enabled */ +) +{ + Decoder_Struct *st_ivas; + + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { - mixer_left_fx = add( shr( st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, Q1 ), ONE_IN_Q14 ); // Q14 - mixer_right_fx = sub( MAX16B, mixer_left_fx ); + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } - v_multc_fixed_16( p_output_fx[0], mixer_right_fx, p_output_fx[1], nOutSamples ); /* Q11 */ - v_multc_fixed_16( p_output_fx[0], mixer_left_fx, p_output_fx[0], nOutSamples ); /* Q11 */ + st_ivas = hIvasDec->st_ivas; + *isSplitCoded = 0; + move16(); + + test(); + test(); + test(); + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || + ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && st_ivas->hDecoderConfig->Opt_non_diegetic_pan && st_ivas->hRenderConfig->split_rend_config.dof == 0 ) ) + { + *isSplitCoded = 1; + move16(); } - IF( !st_ivas->hDecoderConfig->Opt_tsm ) + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * feedSinglePIorientation( ) + * + * Feed a single orientation PI data to external orientation handle. + *---------------------------------------------------------------------*/ + +static ivas_error feedSinglePIorientation( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const bool isOrientationSaved, /* i : flag to indicate if an orientation for this PI type was previously saved */ + IVAS_QUATERNION *savedOrientation /* i : previously saved orientation for this PI type */ +) +{ + Word16 i; + ivas_error error; + Decoder_Struct *st_ivas; + IVAS_QUATERNION savedInvOrientation; + + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { - ivas_jbm_dec_copy_tc_no_tsm_fx( st_ivas, p_output_fx, nOutSamples ); + return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - ELSE IF( Buf_fx != NULL ) + + st_ivas = hIvasDec->st_ivas; + + IF( isOrientationSaved ) { - FOR( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ ) + IF( !st_ivas->hExtOrientationData ) { - FOR( i = 0; i < nOutSamples; i++ ) + IF( NE_32( error = ivas_external_orientation_open_fx( &( st_ivas->hExtOrientationData ), st_ivas->hDecoderConfig->render_framesize ), IVAS_ERR_OK ) ) { - Buf_fx[i * st_ivas->hDecoderConfig->nchan_out + n] = p_output_fx[n][i]; /* Does the same as above */ /* Q11 */ - move32(); + return error; } } - } - ELSE - { - /* ivas_syn_output( p_output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcmBuf ); */ - FOR( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ ) + + IF( !st_ivas->hCombinedOrientationData ) { - FOR( i = 0; i < nOutSamples; i++ ) + IF( NE_32( error = ivas_combined_orientation_open_fx( &( st_ivas->hCombinedOrientationData ), st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->render_framesize ), IVAS_ERR_OK ) ) { - pcmBuf[i * st_ivas->hDecoderConfig->nchan_out + n] = extract_l( L_shr( p_output_fx[n][i], Q11 ) ); /* Does the same as above */ /* Q0 */ - move16(); + return error; } } + + QuaternionInverse_fx( *savedOrientation, &savedInvOrientation ); + + /* use the new PI orientation or the previously saved orientation in processing */ + FOR( i = 0; i < st_ivas->hExtOrientationData->num_subframes; i++ ) + { + QuaternionProduct_fx( st_ivas->hExtOrientationData->Quaternions[i], savedInvOrientation, + &st_ivas->hExtOrientationData->Quaternions[i] ); + st_ivas->hExtOrientationData->enableExternalOrientation[i] = true; + move16(); + } + + hIvasDec->updateOrientation = true; + move16(); } return IVAS_ERR_OK; @@ -3495,164 +6442,134 @@ static ivas_error evs_dec_main_fx( /*---------------------------------------------------------------------* - * input_format_API_to_internal() - * + * setDiegeticInput( ) * + * Set isDiegeticInput flag for combined orientation handle based on PI data. *---------------------------------------------------------------------*/ -static ivas_error input_format_API_to_internal( - IVAS_DEC_INPUT_FORMAT input_format, - Word16 *bitstream_format_internal, - Word16 *sdp_hf_only, - const bool is_voip_enabled ) +static void setDiegeticInputPI( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const bool *diegeticPIValues /* i : diegetic values for the input stream */ +) { - SWITCH( input_format ) + Word16 i; + + IF( hIvasDec->st_ivas->hCombinedOrientationData != NULL ) { - case IVAS_DEC_INPUT_FORMAT_G192: - IF( is_voip_enabled ) - { - *bitstream_format_internal = VOIP_G192_RTP; - } - ELSE - { - *bitstream_format_internal = G192; - } - *sdp_hf_only = 0; - BREAK; - case IVAS_DEC_INPUT_FORMAT_MIME: - *bitstream_format_internal = MIME; - *sdp_hf_only = 0; - BREAK; - case IVAS_DEC_INPUT_FORMAT_RTPDUMP: - assert( is_voip_enabled && "RTP dump only supported in VoIP mode" ); - *bitstream_format_internal = VOIP_RTPDUMP; - *sdp_hf_only = 0; - BREAK; - case IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF: - assert( is_voip_enabled && "RTP dump only supported in VoIP mode" ); - *bitstream_format_internal = VOIP_RTPDUMP; - *sdp_hf_only = 1; - BREAK; - default: - return IVAS_ERR_INVALID_BITSTREAM; + FOR( i = 0; i < ( 1 + IVAS_MAX_NUM_OBJECTS ); i++ ) + { + hIvasDec->st_ivas->hCombinedOrientationData->isDiegeticInputPI[i] = diegeticPIValues[i]; + move16(); + } + + hIvasDec->st_ivas->hCombinedOrientationData->isDiegeticInputPISet = true; + move16(); } - move16(); - move16(); - return IVAS_ERR_OK; + return; } /*---------------------------------------------------------------------* - * IVAS_DEC_VoIP_reconfigure() + * IVAS_DEC_FeedPiDataToDecoder( ) * * *---------------------------------------------------------------------*/ -static ivas_error IVAS_DEC_VoIP_reconfigure( - IVAS_DEC_HANDLE hIvasDec, - const UWord16 nTransportChannels, - const UWord16 l_ts ) +ivas_error IVAS_DEC_FeedPiDataToDecoder( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + hPiDataTs piData, /* i : PI data received in rtp packet */ + UWord32 numPiData /* i : number of PI data received in rtp packet */ +) { - Word16 apa_buffer_size; - - apa_buffer_size = hIvasDec->nSamplesFrame; - move16(); + UWord32 i; + Decoder_Struct *st_ivas; + ivas_error error = IVAS_ERR_OK; + move32(); - IF( hIvasDec->apaExecBuffer_fx == NULL ) + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { - DECODER_CONFIG_HANDLE hDecoderConfig; - - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) - { - UWord16 wss, css; - Word32 startQuality; + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } - startQuality = L_shl( L_deposit_l( hIvasDec->tsm_quality ), Q2 ); /* Q14 --> Q16*/ - apa_buffer_size = APA_BUF_PER_CHANNEL; + st_ivas = hIvasDec->st_ivas; - move16(); - /* get current renderer type*/ - hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig; + FOR( i = 0; i < numPiData; i++ ) + { + UWord32 piDataType = piData->data.noPiData.piDataType; + move32(); - IF( EQ_32( hDecoderConfig->output_Fs, 8000 ) ) - { - wss = 1; - css = 1; - } - ELSE IF( EQ_32( hDecoderConfig->output_Fs, 16000 ) ) - { - wss = 2; - css = 1; - } - ELSE IF( EQ_32( hDecoderConfig->output_Fs, 32000 ) ) - { - wss = 4; - css = 2; - } - ELSE IF( EQ_32( hDecoderConfig->output_Fs, 48000 ) ) - { - wss = 6; - css = 3; - } - ELSE + SWITCH( piDataType ) + { + case IVAS_PI_SCENE_ORIENTATION: { - return IVAS_ERR_INIT_ERROR; + IVAS_QUATERNION *quat = &piData->data.scene.orientation; +#ifdef DEBUGGING + fprintf( stdout, "PI_SCENE_ORIENTATION : %f, %f, %f, %f\n", + fixedToFloat( quat->w_fx, Q15 ), + fixedToFloat( quat->x_fx, Q15 ), + fixedToFloat( quat->y_fx, Q15 ), + fixedToFloat( quat->z_fx, Q15 ) ); +#endif + error = feedSinglePIorientation( hIvasDec, true, quat ); } + BREAK; - move16(); - move16(); - test(); - test(); - test(); - test(); - IF( NE_32( (Word32) apa_init( &hIvasDec->hTimeScaler, nTransportChannels ), IVAS_ERR_OK ) || - apa_set_rate( hIvasDec->hTimeScaler, hDecoderConfig->output_Fs ) != 0 || - apa_set_complexity_options( hIvasDec->hTimeScaler, wss, css ) != 0 || - apa_set_quality( hIvasDec->hTimeScaler, startQuality, 4, 4 ) != 0 || - apa_set_renderer_granularity( hIvasDec->hTimeScaler, l_ts ) != 0 ) + case IVAS_PI_DEVICE_ORIENTATION_COMPENSATED: { - return IVAS_ERR_INIT_ERROR; + IVAS_QUATERNION *quat = &piData->data.deviceCompensated.orientation; +#ifdef DEBUGGING + fprintf( stdout, "PI_DEVICE_ORIENTATION : %f, %f, %f, %f\n", + fixedToFloat( quat->w_fx, Q15 ), + fixedToFloat( quat->x_fx, Q15 ), + fixedToFloat( quat->y_fx, Q15 ), + fixedToFloat( quat->z_fx, Q15 ) ); +#endif + error = feedSinglePIorientation( hIvasDec, true, quat ); } + BREAK; - IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) + case IVAS_PI_ACOUSTIC_ENVIRONMENT: { - IF( apa_set_evs_compat_mode( hIvasDec->hTimeScaler, true ) != 0 ) + UWord16 aeid; + aeid = piData->data.acousticEnv.aeid; + move16(); +#ifdef DEBUGGING + fprintf( stdout, "PI_ACOUSTIC_ENVIRONMENT : AEID : %d\n", aeid ); +#endif + test(); + test(); + IF( piData->data.acousticEnv.availLateReverb && st_ivas->hRenderConfig != NULL && aeid != st_ivas->hRenderConfig->roomAcoustics.aeID ) { - return IVAS_ERR_INIT_ERROR; + error = feedAcousticEnvPI( hIvasDec, piData->data.acousticEnv ); } } + BREAK; - IF( ( hIvasDec->apaExecBuffer_fx = malloc( sizeof( Word32 ) * L_mult0( apa_buffer_size, (Word16) nTransportChannels ) ) ) == NULL ) + case IVAS_PI_DIEGETIC_TYPE: { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); +#ifdef DEBUGGING + fprintf( stdout, "PI_DIEGETIC_TYPE : %d, %d, %d, %d, %d\n", piData->data.digeticIndicator.isDiegetic[0], piData->data.digeticIndicator.isDiegetic[1], piData->data.digeticIndicator.isDiegetic[2], piData->data.digeticIndicator.isDiegetic[3], piData->data.digeticIndicator.isDiegetic[4] ); +#endif + setDiegeticInputPI( hIvasDec, piData->data.digeticIndicator.isDiegetic ); } + BREAK; - set_zero2_fx( hIvasDec->apaExecBuffer_fx, L_mult0( apa_buffer_size, (Word16) nTransportChannels ) ); - } - } - ELSE - { - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) - { - IF( apa_reconfigure( hIvasDec->hTimeScaler, nTransportChannels, l_ts ) != 0 ) - { - return IVAS_ERR_INIT_ERROR; - } - apa_buffer_size = APA_BUF_PER_CHANNEL; - move16(); - free( hIvasDec->apaExecBuffer_fx ); - IF( ( hIvasDec->apaExecBuffer_fx = malloc( sizeof( Word32 ) * L_mult0( apa_buffer_size, (Word16) nTransportChannels ) ) ) == NULL ) + default: { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); + /* NOT HANDLED PI DATA - DO NOTHING */ } - set_zero2_fx( hIvasDec->apaExecBuffer_fx, L_mult0( apa_buffer_size, (Word16) nTransportChannels ) ); + BREAK; } - /* realloc apa_exe_buffer */ - } - hIvasDec->nTransportChannelsOld = nTransportChannels; - move16(); + IF( NE_32( error, IVAS_ERR_OK ) ) + { + return error; + } + + piData++; + } return IVAS_ERR_OK; } diff --git a/lib_dec/lp_exc_d_fx.c b/lib_dec/lp_exc_d_fx.c index 2358bfa79f97eced178fd2e6f1fd0da489bce2b7..0ce010cebc579ba4be26a60f625a63a56f7b65f7 100644 --- a/lib_dec/lp_exc_d_fx.c +++ b/lib_dec/lp_exc_d_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -9,27 +9,26 @@ /*======================================================================*/ /* FUNCTION : lp_filt_exc_dec_fx() */ -/*-----------------------------------------------------------------------*/ -/* PURPOSE : Low-pass filtering of the adaptive exctitation */ -/* */ -/*-----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word32) core_brate : Core bitrate Q0 */ -/* _ (Word16) Opt_AMR_WB : flag indicating AMR-WB IO mode Q0 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) i_subfr : subframe index Q0 */ +/*----------------------------------------------------------------------*/ +/* PURPOSE : Low-pass filtering of the adaptive exctitation */ +/* */ +/*----------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* _ (Word32) core_brate : Core bitrate Q0 */ +/* _ (Word16) Opt_AMR_WB : flag indicating AMR-WB IO mode Q0 */ +/* _ (Word16) coder_type : coding type Q0 */ +/* _ (Word16) i_subfr : subframe index Q0 */ /* _ (Word16) L_subfr : subframe size Q0 */ -/*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/*-----------------------------------------------------------------------*/ -/* INPUT OUTPUT ARGUMENTS */ -/* _ (Word16 *) exc : excitation buffer Q0 */ -/*-----------------------------------------------------------------------*/ - -/* */ -/*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/*----------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/*----------------------------------------------------------------------*/ +/* INPUT OUTPUT ARGUMENTS */ +/* _ (Word16 *) exc : excitation buffer Q0 */ +/*----------------------------------------------------------------------*/ +/* */ +/*----------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ /*=======================================================================*/ void lp_filt_exc_dec_fx( diff --git a/lib_dec/lsf_dec_fx.c b/lib_dec/lsf_dec_fx.c index 21e8705f3aa64d7b7efcb4a8b7b929fbfe49a626..3af2e35ed787b63cec3d72949833666bf8ed04e8 100644 --- a/lib_dec/lsf_dec_fx.c +++ b/lib_dec/lsf_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -8,9 +8,11 @@ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "ivas_prot_fx.h" + /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ + static void dqlsf_CNG_fx( Decoder_State *st_fx, Word16 *lsf_q ); /*--------------------------------------------------------------------------------------* @@ -88,7 +90,6 @@ static void dqlsf_CNG_fx( /* _ (Word16*) lsp_new : LP filter coefficient Q15 */ /* _ (Word16*) lsp_mid : LP filter coefficient Q15 */ /*---------------------------------------------------------------------------*/ - /* _ (Word16[]) st_fx->lsf_adaptive_mean_fx : FEC - adaptive mean LSF */ /* vector for FEC Q(x2.56) */ /* _ (Word16[]) st_fx->mem_AR_fx : AR memory of LSF quantizer */ @@ -100,269 +101,15 @@ static void dqlsf_CNG_fx( /*===========================================================================*/ void lsf_dec_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ - Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ - Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ - const Word16 tdm_low_rate_mode /* i : secondary channel low rate mode flag Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ -) -{ - Word16 i; - Word16 no_param_lpc; - Word16 param_lpc[NPRM_LPC_NEW]; - Word32 L_tmp; - Word16 nBits = 0; - move16(); - Word16 tmp_old[M + 1], tmp_new[M + 1]; - Word16 enr_old = 0, enr_new = 0; - move16(); - move16(); - Word16 lsf_diff, coder_type; - - /* initialize */ - coder_type = st_fx->coder_type; - if ( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - coder_type = INACTIVE; /* Q0 */ - move16(); - } - test(); - if ( EQ_16( coder_type, AUDIO ) && st_fx->GSC_IVAS_mode > 0 ) - { - coder_type = GENERIC; /* Q0 */ - move16(); - } - no_param_lpc = 0; - nBits = 0; - move16(); - move16(); - - /* Find the number of bits for LSF quantization */ - IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - nBits = LSF_BITS_CNG; /* Q0 */ - move16(); - } - ELSE - { - test(); - IF( st_fx->nelp_mode_dec == 0 && st_fx->ppp_mode_dec == 0 ) - { - nBits = st_fx->acelp_cfg.lsf_bits; /* Q0 */ - move16(); - } - ELSE IF( EQ_16( st_fx->nelp_mode_dec, 1 ) ) - { - IF( EQ_16( coder_type, UNVOICED ) ) - { - nBits = 30; /* Q0 */ - move16(); - if ( st_fx->bwidth == NB ) - { - nBits = 32; /* Q0 */ - move16(); - } - } - } - ELSE IF( EQ_16( st_fx->ppp_mode_dec, 1 ) ) - { - nBits = 26; /* Q0 */ - move16(); - } - } - - /* LSF de-quantization */ - lsf_end_dec_fx( st_fx, 0, coder_type, st_fx->bwidth, nBits, lsf_new, param_lpc, LSF_Q_prediction, &no_param_lpc, - tdm_lsfQ_PCh ); - - /* convert quantized LSFs to LSPs */ - - lsf2lsp_fx( lsf_new, lsp_new, M, st_fx->sr_core ); - /* set seed_acelp used in UC mode */ - test(); - IF( EQ_16( coder_type, UNVOICED ) && GT_16( st_fx->element_mode, EVS_MONO ) ) - { - st_fx->seed_acelp = 0; - move16(); - FOR( i = no_param_lpc - 1; i >= 0; i-- ) - { - /* rightshift before *seed_acelp+param_lpc[i] to avoid overflows*/ - st_fx->seed_acelp = extract_l( L_add( imult3216( 31821L /* Q0 */, add( shr( ( st_fx->seed_acelp ), 1 ), param_lpc[i] ) ), 13849L /* Q0 */ ) ); /* Q0 */ - move16(); - } - } - IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - /* return if SID frame (conversion to A(z) done in the calling function) */ - return; - } - - /*-------------------------------------------------------------------------------------* - * FEC - update adaptive LSF mean vector - *-------------------------------------------------------------------------------------*/ - - FOR( i = 0; i < M; i++ ) - { - L_tmp = L_mult( lsf_new[i], 10922 ); /*Q(x2.56+16)*/ - L_tmp = L_mac( L_tmp, st_fx->lsfoldbfi1_fx[i], 10922 ); /*Q(x2.56+16)*/ - L_tmp = L_mac( L_tmp, st_fx->lsfoldbfi0_fx[i], 10922 ); /*Q(x2.56+16)*/ - st_fx->lsf_adaptive_mean_fx[i] = round_fx( L_tmp ); /*Q(x2.56)*/ - move16(); - } - - test(); - test(); - IF( ( st_fx->prev_bfi && ( EQ_16( coder_type, TRANSITION ) ) && ( EQ_16( tc_subfr, sub( st_fx->L_frame, L_SUBFR ) ) ) ) ) - { - lsf_diff = 1205; - move16(); /*int_fs / (float)(2*(M+1)); = 470.588 -> 1205 in Q2.56 */ - if ( EQ_16( st_fx->L_frame, L_FRAME ) ) - { - lsf_diff = 964; - move16(); /*int_fs / (float)(2*(M+1)); = 376.47 -> 964 in Q2.56 */ - } - st_fx->lsf_old_fx[0] = lsf_diff; - move16(); - - FOR( i = 1; i < M; i++ ) - { - st_fx->lsf_old_fx[i] = add( st_fx->lsf_old_fx[i - 1], lsf_diff ); /* Q2.56 */ - move16(); - } - lsf2lsp_fx( st_fx->lsf_old_fx, st_fx->lsp_old_fx, M, st_fx->sr_core ); - } - /*-------------------------------------------------------------------------------------* - * Mid-frame LSF decoding - * LSP interpolation and conversion of LSPs to A(z) - *-------------------------------------------------------------------------------------*/ - IF( st_fx->rate_switching_reset ) - { - /*extrapolation in case of unstable LSF convert*/ - Copy( lsp_new, st_fx->lsp_old_fx, M ); /* Q15 */ - Copy( lsf_new, st_fx->lsf_old_fx, M ); /* Q2.56 */ - } - { - /* Mid-frame LSF decoding */ - lsf_mid_dec_fx( st_fx, lsp_new, coder_type, lsp_mid ); - } - test(); - test(); - IF( !( st_fx->prev_bfi && ( EQ_16( coder_type, TRANSITION ) ) && ( EQ_16( tc_subfr, sub( st_fx->L_frame, L_SUBFR ) ) ) ) ) - { - IF( st_fx->prev_bfi ) - { - /* check, if LSP interpolation can be relaxed */ - E_LPC_f_lsp_a_conversion( st_fx->lsp_old_fx, tmp_old, M ); - enr_old = Enr_1_Az_fx( tmp_old, 2 * L_SUBFR ); /* Q3 */ - - E_LPC_f_lsp_a_conversion( lsp_new, tmp_new, M ); - enr_new = Enr_1_Az_fx( tmp_new, 2 * L_SUBFR ); /* Q3 */ - - IF( LT_16( enr_new, mult_r( 9830 /*0.3 Q15*/, enr_old ) ) ) - { - /* OLD CODE : if( st->safety_net == 1), replaced with a decision similar to MODE2 */ - st_fx->relax_prev_lsf_interp = -1; - move16(); - test(); - test(); - test(); - test(); - if ( st_fx->clas_dec == UNVOICED_CLAS || EQ_16( st_fx->clas_dec, SIN_ONSET ) || st_fx->clas_dec == INACTIVE_CLAS || EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) ) - { - st_fx->relax_prev_lsf_interp = 1; - move16(); - } - } - } - } - test(); - IF( EQ_16( st_fx->last_core, HQ_CORE ) && st_fx->core == ACELP_CORE ) - { - /* update old LSPs/LSFs in case of HQ->ACELP core switching */ - Copy( lsp_mid, st_fx->lsp_old_fx, M ); /* Q15 */ - lsp2lsf_fx( lsp_mid, st_fx->lsf_old_fx, M, st_fx->sr_core ); /* Q15 */ - } - test(); - IF( EQ_16( tdm_low_rate_mode, 1 ) && GT_16( coder_type, UNVOICED ) ) - { - // PMT("To be verified") - IF( EQ_16( st_fx->active_cnt, 1 ) ) - { - Copy( lsp_mid, st_fx->lsp_old_fx, M ); /* Q15 */ - lsp2lsf_fx( lsp_mid, st_fx->lsf_old_fx, M, st_fx->sr_core ); /* Q15 */ - Copy( lsp_new, lsp_mid, M ); /* Q15 */ - } - - /* LSP interpolation and conversion of LSPs to A(z) - two-subframe mode */ - int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid, lsp_new, Aq, M, -2 ); - } - ELSE - { - /* LSP interpolation and conversion of LSPs to A(z) */ - int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid, lsp_new, Aq, M, st_fx->relax_prev_lsf_interp ); - } - /*------------------------------------------------------------------* - * Check LSF stability (distance between old LSFs and current LSFs) - *------------------------------------------------------------------*/ - - IF( st_fx->element_mode == EVS_MONO ) - { - st_fx->stab_fac_fx = lsf_stab_fx( lsf_new, st_fx->lsf_old_fx, 0, st_fx->L_frame ); /*Q15*/ - move16(); - } - ELSE - { - st_fx->stab_fac_fx = lsf_stab_ivas_fx( lsf_new, st_fx->lsf_old_fx, 0, st_fx->L_frame ); /* Q15 */ - move16(); - } - - return; -} - -/*===========================================================================*/ -/* FUNCTION : lsf_dec_ivas_fx() */ -/*---------------------------------------------------------------------------*/ -/* PURPOSE : LSF decoder */ -/*---------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Struct) st_fx : decoder static memory */ -/* _ (Word16) L_frame : length of the frame */ -/* _ (Word16) coder_type : coding type */ -/* _ (Word16) bwidth : input signal bandwidth */ -/*---------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) Aq : LP filter coefficient Q12 */ -/* _ (Word16*) lsf_new : LP filter coefficient Q(x2.56) */ -/* _ (Word16*) lsp_new : LP filter coefficient Q15 */ -/* _ (Word16*) lsp_mid : LP filter coefficient Q15 */ -/*---------------------------------------------------------------------------*/ - -/* _ (Word16[]) st_fx->lsf_adaptive_mean_fx : FEC - adaptive mean LSF */ -/* vector for FEC Q(x2.56) */ -/* _ (Word16[]) st_fx->mem_AR_fx : AR memory of LSF quantizer */ -/* (past quantized LSFs without mean) Q(x2.56) */ -/* _ (Word16) st_fx->stab_fac_fx : LSF stability factor Q15 */ -/*---------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*===========================================================================*/ - -void lsf_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ - Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ - Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ - const Word16 tdm_low_rate_mode /* i : secondary channel low rate mode flag Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ + Decoder_State *st_fx, /* i/o: State structure */ + const Word16 tc_subfr, /* i : TC subframe index Q0*/ + Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ + Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ + Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ + Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ + Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag Q0*/ + const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ ) { Word16 i; @@ -543,7 +290,6 @@ void lsf_dec_ivas_fx( test(); IF( EQ_16( tdm_low_rate_mode, 1 ) && GT_16( coder_type, UNVOICED ) ) { - // PMT("To be verified") IF( EQ_16( st_fx->active_cnt, 1 ) ) { Copy( lsp_mid, st_fx->lsp_old_fx, M ); /* Q15 */ @@ -617,15 +363,14 @@ void lsf_dec_ivas_fx( void lsf_end_dec_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 mode2_flag, /* Q0 */ - const Word16 coder_type_org, /* i : coding type Q0*/ - const Word16 bwidth, /* i : input signal bandwidth Q0*/ - const Word16 nBits_in, /* i : number of bits used for ISF quantization Q0*/ - Word16 *qlsf, /* o : quantized LSFs in the cosine domain Qx2.56*/ - Word16 *lpc_param, /* i : LPC parameters Q0*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *nb_indices /* o : number of indices Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ + const Word16 coder_type_org, /* i : coding type Q0*/ + const Word16 bwidth, /* i : input signal bandwidth Q0*/ + const Word16 nBits_in, /* i : number of bits used for ISF quantization Q0*/ + Word16 *qlsf, /* o : quantized LSFs in the cosine domain Qx2.56*/ + Word16 *lpc_param, /* i : LPC parameters Q0*/ + Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ + Word16 *nb_indices, /* o : number of indices Q0*/ + const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ ) { Word16 pred0[M]; /* Prediction for the safety-net quantizer (usually mean)*/ @@ -1062,10 +807,10 @@ void lsf_end_dec_fx( /* _ None */ /*========================================================================*/ void lsf_mid_dec_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ + Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 lsp_new[], /* i : quantized LSPs from frame endS Q15*/ - Word16 coder_type, /* i : Coder type Q0*/ - Word16 lsp_mid[] /* o : quantized LSPs Q15*/ + Word16 coder_type, /* i : Coder type Q0*/ + Word16 lsp_mid[] /* o : quantized LSPs Q15*/ ) { Word16 j, idx; diff --git a/lib_dec/lsf_msvq_ma_dec_fx.c b/lib_dec/lsf_msvq_ma_dec_fx.c index 61e338c9c52451d70dec2d2a8f5656b29c664682..71d57c29993f71199482d5acc239ab4e0beb3d98 100644 --- a/lib_dec/lsf_msvq_ma_dec_fx.c +++ b/lib_dec/lsf_msvq_ma_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -159,12 +159,12 @@ Word16 lsf_bctcvq_decprm( /* Returns: number of indices */ Word16 D_lsf_tcxlpc( - const Word16 indices[], /* i : VQ indices Q0*/ - Word16 lsf_q[], /* o : quantized LSF Q1*/ - Word16 lsp_q_ind[], /* o :quantized LSP (w/o MA prediction) Q1*/ - Word16 narrowband, /* i : narrowband flag Q0*/ - Word16 cdk, /* i : codebook selector Q0*/ - Word16 mem_MA[] /* i : MA memory Q1*/ + const Word16 indices[], /* i : VQ indices Q0*/ + Word16 lsf_q[], /* o : quantized LSF Q1*/ + Word16 lsp_q_ind[], /* o :quantized LSP (w/o MA prediction) Q1*/ + Word16 narrowband, /* i : narrowband flag Q0*/ + Word16 cdk, /* i : codebook selector Q0*/ + Word16 mem_MA[] /* i : MA memory Q1*/ ) { Word16 i; @@ -185,9 +185,6 @@ Word16 D_lsf_tcxlpc( M, M, indices + NumIndices, -#ifdef IVAS_MSVQ - 0, NULL, -#endif lsf_q ); NumIndices = add( NumIndices, TCXLPC_NUMSTAGES ); /* Q0 */ @@ -208,9 +205,6 @@ Word16 D_lsf_tcxlpc( M, M, indices + NumIndices, -#ifdef IVAS_MSVQ - 0, NULL, -#endif lsf_rem_q_ind ); NumIndices = add( NumIndices, TCXLPC_IND_NUMSTAGES ); /* Q0 */ @@ -264,7 +258,7 @@ Word16 dec_lsf_tcxlpc( Word16 lsf_q_ind[M]; Word16 *flag; - flag = *indices; /* Save pointer Q0*/ + flag = *indices; /* Save pointer Q0*/ *flag = 0; move16(); /* Set flag to disabled */ ++*indices; @@ -287,9 +281,6 @@ Word16 dec_lsf_tcxlpc( M, M, flag + 1, -#ifdef IVAS_MSVQ - 0, NULL, -#endif lsf_q_ind ); /* Update flag */ diff --git a/lib_dec/nelp_dec_fx.c b/lib_dec/nelp_dec_fx.c index c088dd82663b8faa30514363b931ccd27ba39001..ff9c44bcdd4a32ccaabcfb29f89110cc31ca6c14 100644 --- a/lib_dec/nelp_dec_fx.c +++ b/lib_dec/nelp_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_dec/peak_vq_dec_fx.c b/lib_dec/peak_vq_dec_fx.c index 87d7e9cf3eceace20afd4016fc328a96eff25bfc..80fa60560198ea9f2cda772a64713847c1d1ec66 100644 --- a/lib_dec/peak_vq_dec_fx.c +++ b/lib_dec/peak_vq_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -112,7 +112,6 @@ static void peak_vq_dec_fx( set16_fx( pvq_inp_vector, 0, HVQ_PVQ_BUF_LEN ); assert( ( core_brate > HQ_16k40 && core_brate <= HQ_48k ) && "HVQ rate not supported" ); - // PMT("max_peaks equation needs to be converted") max_peaks = extract_l( Mpy_32_32( ( L_add( imult3216( core_brate, HVQ_PEAKS_PER_DELTA ), HVQ_PEAKS_PER_DELTA_OFFS ) ), 282564 ) ); /* 1 / HVQ_PEAKS_BPS_DELTA in Q31 = 282564*/ bin_th = HVQ_THRES_BIN_24k; move16(); diff --git a/lib_dec/pit_dec_fx.c b/lib_dec/pit_dec_fx.c index 1d3e9649793cb0578063ec2b5235a452812ffe1d..dc3e6277d09bbf8cbd05a263b8610fb8faa3f0ad 100644 --- a/lib_dec/pit_dec_fx.c +++ b/lib_dec/pit_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -298,7 +298,7 @@ void Mode2_delta_pit_dec( /* PURPOSE : calculate pitch value */ /* */ /*-----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* _ (Word32) core_brate : Core bitrate Q0 */ /* _ (Word16) Opt_AMR_WB : flag indicating AMR-WB IO mode Q0 */ /* _ (Word16) L_frame : length of the frame Q0 */ @@ -319,246 +319,22 @@ void Mode2_delta_pit_dec( /* _ (Word16 ) pitch : close loop integer pitch Q6 */ /*=======================================================================*/ - -Word16 pit_decode_fx( /* o : floating pitch value */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame, /* i : length of the frame */ - Word16 i_subfr, /* i : subframe index */ - const Word16 coder_type, /* i : coding type */ - Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ - Word16 *T0, /* o : close loop integer pitch */ - Word16 *T0_frac, /* o : close loop fractional part of the pitch */ - Word16 *T0_min, /* i/o: delta search min for sf 2 & 4 */ - Word16 *T0_max, /* i/o: delta search max for sf 2 & 4 */ - const Word16 L_subfr /* i : subframe length */ -) -{ - Word16 pitch; /*Q2*/ - Word16 pitch_index, nBits, pit_flag; - - pitch_index = 0; - move16(); - - /*----------------------------------------------------------------* - * Set pit_flag = 0 for every subframe with absolute pitch search - *----------------------------------------------------------------*/ - pit_flag = i_subfr; - move16(); - - if ( EQ_16( i_subfr, PIT_DECODE_2XL_SUBFR ) ) - { - pit_flag = 0; - move16(); - } - - /*-------------------------------------------------------* - * Retrieve the pitch index - *-------------------------------------------------------*/ - IF( !Opt_AMR_WB ) - { - /*----------------------------------------------------------------* - * pitch Q: Set limit_flag to 0 for restrained limits, and 1 for extended limits - *----------------------------------------------------------------*/ - test(); - test(); - IF( i_subfr == 0 ) - { - *limit_flag = 1; - move16(); - - if ( EQ_16( coder_type, VOICED ) ) - { - *limit_flag = 2; - move16(); /* double-extended limits */ - } - test(); - if ( EQ_16( coder_type, GENERIC ) && EQ_32( core_brate, ACELP_7k20 ) ) - { - *limit_flag = 0; - move16(); - } - } - ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) && EQ_32( coder_type, GENERIC ) && LE_32( core_brate, ACELP_13k20 ) ) - { - if ( GT_16( *T0, shr( add( PIT_FR1_EXTEND_8b, PIT_MIN ), 1 ) ) ) - { - *limit_flag = 0; - move16(); - } - } - - /*-------------------------------------------------------* - * Retrieve the number of Q bits - *-------------------------------------------------------*/ - - nBits = 0; - move16(); - IF( NE_16( coder_type, AUDIO ) ) - { - /* find the number of bits */ - nBits = st_fx->acelp_cfg.pitch_bits[shr( i_subfr, 6 )]; - move16(); - pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); - } - - /*-------------------------------------------------------* - * Pitch decoding in AUDIO mode - * (both ACELP@12k8 and ACELP@16k cores) - *-------------------------------------------------------*/ - IF( EQ_16( coder_type, AUDIO ) ) - { - test(); - if ( EQ_16( L_subfr, L_FRAME / 2 ) && i_subfr != 0 ) - { - pit_flag = L_SUBFR; - move16(); - } - if ( pit_flag == 0 ) - { - nBits = 10; - move16(); - } - if ( pit_flag != 0 ) - { - nBits = 6; - move16(); - } - - pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); - - test(); - test(); - IF( EQ_16( L_subfr, L_FRAME / 2 ) && i_subfr != 0 && GE_16( pitch_index, 32 ) ) /* safety check in case of bit errors */ - { - pitch_index = shr( pitch_index, 1 ); - st_fx->BER_detect = 1; - move16(); - } - - pit_Q_dec_fx( 0, pitch_index, nBits, 4, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - ELSE IF( EQ_16( coder_type, VOICED ) ) - { - /*-------------------------------------------------------* - * Pitch decoding in VOICED mode - * (ACELP@12k8 core only) - *-------------------------------------------------------*/ - if ( EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - pit_flag = i_subfr; - move16(); - } - - pit_Q_dec_fx( 0, pitch_index, nBits, 4, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - ELSE - { - /*-------------------------------------------------------* - * Pitch decoding in GENERIC mode - * (both ACELP@12k8 and ACELP@16k cores) - *-------------------------------------------------------*/ - IF( EQ_16( L_frame, L_FRAME ) ) - { - pit_Q_dec_fx( 0, pitch_index, nBits, 8, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - ELSE - { - pit16k_Q_dec_fx( pitch_index, nBits, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - } - } - - /*-------------------------------------------------------* - * Pitch decoding in AMR-WB IO mode - *-------------------------------------------------------*/ - - ELSE - { - *limit_flag = 0; - move16(); - test(); - test(); - IF( i_subfr == 0 || ( EQ_16( i_subfr, 2 * L_SUBFR ) && EQ_32( core_brate, ACELP_8k85 ) ) ) - { - nBits = 8; - move16(); - } - ELSE - { - nBits = 5; - move16(); - } - IF( GT_32( core_brate, ACELP_8k85 ) ) - { - nBits = 6; - move16(); - test(); - if ( i_subfr == 0 || EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - nBits = 9; - move16(); - } - } - - pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); - - pit_Q_dec_fx( 1, pitch_index, nBits, 8, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - - /*-------------------------------------------------------* - * Compute floating pitch output - *-------------------------------------------------------*/ - - pitch = shl( add( shl( *T0, 2 ), *T0_frac ), 4 ); /* save subframe pitch values Q6 */ - - return pitch; -} - -/*======================================================================*/ -/* FUNCTION : pit_decode_ivas_fx() */ -/*-----------------------------------------------------------------------*/ -/* PURPOSE : calculate pitch value */ -/* */ -/*-----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word32) core_brate : Core bitrate Q0 */ -/* _ (Word16) Opt_AMR_WB : flag indicating AMR-WB IO mode Q0 */ -/* _ (Word16) L_frame : length of the frame Q0 */ -/* _ (Word16) i_subfr : length of the frame Q0 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) L_subfr : subframe length */ -/*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16 *) T0 : close loop integer pitch */ -/* _ (Word16 *) T0_frac : close loop fractional part of the pitch */ -/* _ (Word16 ) pitch : pitch value Q6 */ -/*-----------------------------------------------------------------------*/ -/* INPUT OUTPUT ARGUMENTS */ -/* _ (Word16 *) T0_min : delta search min for sf 2 & 4 */ -/* _ (Word16 *) T0_max : delta search max for sf 2 & 4 */ -/*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ (Word16 ) pitch : close loop integer pitch Q6 */ -/*=======================================================================*/ - - -Word16 pit_decode_ivas_fx( /* o : floating pitch value */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame, /* i : length of the frame */ - Word16 i_subfr, /* i : subframe index */ - const Word16 coder_type, /* i : coding type */ - Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ - Word16 *T0, /* o : close loop integer pitch */ - Word16 *T0_frac, /* o : close loop fractional part of the pitch */ - Word16 *T0_min, /* i/o: delta search min for sf 2 & 4 */ - Word16 *T0_max, /* i/o: delta search max for sf 2 & 4 */ - const Word16 L_subfr, /* i : subframe length */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6 */ +/*! r: floating pitch value */ +Word16 pit_decode_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word32 core_brate, /* i : core bitrate */ + const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const Word16 L_frame, /* i : length of the frame */ + Word16 i_subfr, /* i : subframe index */ + const Word16 coder_type, /* i : coding type */ + Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ + Word16 *T0, /* o : close loop integer pitch */ + Word16 *T0_frac, /* o : close loop fractional part of the pitch */ + Word16 *T0_min, /* i/o: delta search min for sf 2 & 4 */ + Word16 *T0_max, /* i/o: delta search max for sf 2 & 4 */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6 */ ) { Word16 pitch; /*Q2*/ @@ -815,9 +591,8 @@ void pit_Q_dec_fx( Word16 *T0, /* o : integer pitch lag */ Word16 *T0_frac, /* o : pitch fraction */ Word16 *T0_min, /* i/o: delta search min */ - Word16 *T0_max /* i/o: delta search max */ - , - Word16 *BER_detect /* o : BER detect flag */ + Word16 *T0_max, /* i/o: delta search max */ + Word16 *BER_detect /* o : BER detect flag */ ) { IF( EQ_16( nBits, 10 ) ) /* absolute decoding with 10 bits */ @@ -926,9 +701,8 @@ void pit16k_Q_dec_fx( Word16 *T0, /* o : integer pitch lag */ Word16 *T0_frac, /* o : pitch fraction */ Word16 *T0_min, /* i/o: delta search min */ - Word16 *T0_max /* i/o: delta search max */ - , - Word16 *BER_detect /* o : BER detect flag */ + Word16 *T0_max, /* i/o: delta search max */ + Word16 *BER_detect /* o : BER detect flag */ ) { Word16 index; diff --git a/lib_dec/pitch_extr_fx.c b/lib_dec/pitch_extr_fx.c index 73e9623f5da99fc082caae28ff4ce9c12a27bd20..d6608cb33fc8a69d59f6f606156dae6f31c49443 100644 --- a/lib_dec/pitch_extr_fx.c +++ b/lib_dec/pitch_extr_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -157,7 +157,6 @@ void pitch_pred_linear_fit( { Word32 t1, t2, t3, t4, t5, t6, t7; Word16 e1, e2, e3, e4, e5, e6, e7; - Flag Overflow; t1 = L_mult0( pg[4], pg[3] ); /*Q24*/ /* t1 = pg[4]*pg[3] */ e1 = 7; move16(); @@ -180,8 +179,8 @@ void pitch_pred_linear_fit( t6 = BASOP_Util_Add_Mant32Exp( t3, e3, t4, e4, &e6 ); t7 = BASOP_Util_Add_Mant32Exp( t5, e5, t6, e6, &e7 ); /*Q31,e7*/ sum0_q = norm_l( t7 ); - sum0 = round_fx_o( L_shl( t7, sum0_q ), &Overflow ); /*Q15,e7-sum0_q*/ - sum0_q = add( 15, sub( sum0_q, e7 ) ); /* sum0 is now Qsum0_q*/ + sum0 = round_fx_sat( L_shl( t7, sum0_q ) ); /*Q15,e7-sum0_q*/ + sum0_q = add( 15, sub( sum0_q, e7 ) ); /* sum0 is now Qsum0_q*/ } pit = 0; @@ -221,8 +220,7 @@ void pitch_pred_linear_fit( a2 = mac_r( L_mac( L_mult( mult_r( 2 * 2048, pg[1] ) /*Q8*/, pg[2] ) /*Q5+16*/, mult_r( 2 * 2048, pg[1] ) /*Q8*/, pg[3] ) /*Q5+16*/, mult_r( -4 * 2048, pg[0] ) /*Q8*/, pg[1] /*Q12*/ ) /*Q5*/; a1 = mac_r( L_mac( L_mult( mult_r( 3 * 2048, pg[0] ) /*Q8*/, pg[1] ) /*Q5+16*/, mult_r( 4 * 2048, pg[0] ) /*Q8*/, pg[2] /*Q12*/ ) /*Q5+16*/, mult_r( 3 * 2048, pg[0] ) /*Q8*/, pg[3] /*Q12*/ ) /*Q5*/; - a = L_mac( L_mac( L_mac( L_mac( L_mult( a1, round_fx( L_shl( ml[0], 4 ) ) ) /*Q4*/ - , + a = L_mac( L_mac( L_mac( L_mac( L_mult( a1, round_fx( L_shl( ml[0], 4 ) ) ) /*Q4*/, round_fx( L_shl( ml[1], 4 ) ) /*Q4*/, a2 ), round_fx( L_shl( ml[2], 4 ) ) /*Q4*/, a3 ), round_fx( L_shl( ml[3], 4 ) ) /*Q4*/, a4 ), @@ -259,8 +257,7 @@ void pitch_pred_linear_fit( b4 = mac_r( L_mac( L_mac( L_mult( mult_r( -3 * 8192, pg[0] ), pg[3] ), mult_r( -2 * 8192, pg[1] ), pg[3] ), mult_r( -32768 / 2, pg[3] ), mult_r( 32768 / 2, pg[2] ) ), mult_r( 32768 / 2, pg[4] ), mult_r( 32768 / 2, pg[3] ) ); /*Q7*/ b5 = mac_r( L_mac( L_mac( L_mult( mult_r( -32768 /*(-4*8192)*/, pg[0] ), pg[4] ), mult_r( -3 * 8192, pg[1] ), pg[4] ), mult_r( -2 * 8192, pg[2] ), pg[4] ), mult_r( -32768 / 2, pg[4] ), mult_r( 32768 / 2, pg[3] ) ) /*Q7*/; - b = L_mac( L_mac( L_mac( L_mac( L_mult( b1, round_fx( L_shl( ml[0], 4 ) ) ) /*Q4*/ - , + b = L_mac( L_mac( L_mac( L_mac( L_mult( b1, round_fx( L_shl( ml[0], 4 ) ) ) /*Q4*/, round_fx( L_shl( ml[1], 4 ) ) /*Q4*/, b2 ), round_fx( L_shl( ml[2], 4 ) ) /*Q4*/, b3 ), round_fx( L_shl( ml[3], 4 ) ) /*Q4*/, b4 ), diff --git a/lib_dec/post_dec_fx.c b/lib_dec/post_dec_fx.c index d581f810a7dd724424e19f9651b0a5c4a11e930c..8bf9380b3fbe89ad809c452874a919b35cb61be8 100644 --- a/lib_dec/post_dec_fx.c +++ b/lib_dec/post_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -168,10 +168,10 @@ void post_decoder( /* Update synth2 memory */ Copy( synth_buf2 + L_frame, hBPF->pst_old_syn_fx, NBPSF_PIT_MAX ); - return; } + void post_decoder_ivas_fx( Decoder_State *st, Word16 synth_buf[], // Q0 @@ -606,10 +606,6 @@ void cldfb_synth_set_bandsToZero( Word16 realQ1, imagQ1, flag, offset, WBcnt; Word16 perc_detect, perc_miss; Word16 i, k, tmp1, tmp2, tmp3, tmp, update_perc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif realQ1 = 0; @@ -656,8 +652,8 @@ void cldfb_synth_set_bandsToZero( /* use 16-bit precision of real and imag buffers */ realQ1 = extract_l( L_shr( rAnalysis[k][i], sub( 31 + 3 - 15, scaleFactor.lb_scale ) ) ); /*31 - (15 + scaleFactor.lb_scale) + 3 )*/ imagQ1 = extract_l( L_shr( iAnalysis[k][i], sub( 31 + 3 - 15, scaleFactor.lb_scale ) ) ); /* Q(-3), headroom */ - nrgQ31 = L_mac0_o( nrgQ31, realQ1, realQ1, &Overflow ); - nrgQ31 = L_mac0_o( nrgQ31, imagQ1, imagQ1, &Overflow ); /* keep in Q(-6) */ + nrgQ31 = L_mac0_sat( nrgQ31, realQ1, realQ1 ); + nrgQ31 = L_mac0_sat( nrgQ31, imagQ1, imagQ1 ); /* keep in Q(-6) */ } nrg_band[i] = ( nrgQ31 ); move16(); diff --git a/lib_dec/ppp_dec_fx.c b/lib_dec/ppp_dec_fx.c index 00a333798ef26d9645b5c3a480cbe7c0dc267443..a9254f68c0e43d7b976d7e0bf1535a5e915fbdc9 100644 --- a/lib_dec/ppp_dec_fx.c +++ b/lib_dec/ppp_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -202,29 +202,29 @@ static void DTFS_dequant_cw_fx( } } /*===================================================================*/ -/* FUNCTION : void ppp_quarter_decoder_fx () */ +/* FUNCTION : void ppp_quarter_decoder_fx () */ /*-------------------------------------------------------------------*/ -/* PURPOSE : */ +/* PURPOSE : */ /*-------------------------------------------------------------------*/ /* INPUT ARGUMENTS : */ -/* _ Word16 bfi_fx - Q0 bad frame indicator */ -/* _ const Word16 *curr_lpc_fx - Q12 current frame LPC */ -/* _ Word16 *exc_fx - Q0 previous frame excitation */ -/* _ Word16 prevCW_lag_fx - Q0 Previous lag */ -/* _ (struct DTFS_fx) PREV_CW_D_FX : prototype in polar domain */ +/* _ Word16 bfi_fx - Q0 bad frame indicator */ +/* _ const Word16 *curr_lpc_fx - Q12 current frame LPC */ +/* _ Word16 *exc_fx - Q0 previous frame excitation */ +/* _ Word16 prevCW_lag_fx - Q0 Previous lag */ +/* _ (struct DTFS_fx) PREV_CW_D_FX : prototype in polar domain */ /* (Word16) lag: length of prototype in time domain */ /* (Word16 []) a: amplitude of harmonics, normalized */ /* (Word16) Q: norm factor of a */ /*-------------------------------------------------------------------*/ /* OUTPUT ARGUMENTS : */ -/* _ Decoder_State_fx *st_fx: */ -/* _ Word16 *pitch - Q6 floating pitch values for each subframe */ -/* _ Word16 *out_fx - Q0 residual signal */ +/* _ Decoder_State_fx *st_fx: */ +/* _ Word16 *pitch - Q6 floating pitch values for each subframe */ +/* _ Word16 *out_fx - Q0 residual signal */ /*-------------------------------------------------------------------*/ /* INPUT/OUTPUT ARGUMENTS : */ -/* _ Decoder_State_fx *st_fx: */ -/* _ lsp_old_fx - Q15 */ -/* _ st_fx->dtfs_dec_xxxx */ +/* _ Decoder_State_fx *st_fx: */ +/* _ lsp_old_fx - Q15 */ +/* _ st_fx->dtfs_dec_xxxx */ /* _ gainp_ppp Q14 */ /* _ lastLgainD_fx - Q11 */ /* _ lastHgainD_fx - Q11 */ @@ -233,24 +233,24 @@ static void DTFS_dequant_cw_fx( /* (Word16) lag: length of prototype in time domain */ /* (Word16 []) a: amplitude of harmonics, normalized */ /* (Word16) Q: norm factor of a */ -/* _ Word16 *pitch_buf_fx - Q6 fixed pitch values for each subframe */ -/* _ Word16 *exc_fx - Q0 previous frame excitation */ +/* _ Word16 *pitch_buf_fx - Q6 fixed pitch values for each subframe */ +/* _ Word16 *exc_fx - Q0 previous frame excitation */ /*-------------------------------------------------------------------*/ /* RETURN ARGUMENTS : */ -/* _ None */ +/* _ None */ /*-------------------------------------------------------------------*/ -/* CALLED FROM : RX */ +/* CALLED FROM : RX */ /*===================================================================*/ ivas_error ppp_quarter_decoder_fx( - DTFS_STRUCTURE *CURRCW_Q_DTFS_FX, /* i/o: Current CW DTFS */ - Word16 prevCW_lag_fx, /* i : Previous lag */ - Word16 *lastLgainD_fx, /* i/o: Last gain lowband Q11 */ - Word16 *lastHgainD_fx, /* i/o: Last gain highwband Q11 */ - Word16 *lasterbD_fx, /* i/o: Last ERB vector Q13 */ - Word16 bfi, /* i : FER flag */ + DTFS_STRUCTURE *CURRCW_Q_DTFS_FX, /* i/o: Current CW DTFS */ + Word16 prevCW_lag_fx, /* i : Previous lag */ + Word16 *lastLgainD_fx, /* i/o: Last gain lowband Q11 */ + Word16 *lastHgainD_fx, /* i/o: Last gain highwband Q11 */ + Word16 *lasterbD_fx, /* i/o: Last ERB vector Q13 */ + Word16 bfi, /* i : FER flag */ Word16 *S_fx, /* i : sine table, Q15 */ Word16 *C_fx, /* i : cosine table, Q15 */ - DTFS_STRUCTURE PREV_CW_D_FX, /* i : Previous DTFS */ + DTFS_STRUCTURE PREV_CW_D_FX, /* i : Previous DTFS */ Decoder_State *st_fx ) { DTFS_STRUCTURE *PREVDTFS_FX; diff --git a/lib_dec/pvq_core_dec_fx.c b/lib_dec/pvq_core_dec_fx.c index 93da9c77a8a0ec9dc80d47a98cd2b5910c1b67e4..96595be9abd67706f1504eb4e1e25cd311236a9d 100644 --- a/lib_dec/pvq_core_dec_fx.c +++ b/lib_dec/pvq_core_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -477,10 +477,6 @@ static void densitySymbolIndexDecode_fx( Word32 acc; Word16 alpha = 0; move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif IF( s_and( (Word16) 0xFFFE, density ) == 0 ) { /* odd density exit */ @@ -492,7 +488,7 @@ static void densitySymbolIndexDecode_fx( sym_freq = L_deposit_l( 1 ); angle = atan2_fx( SQRT_DIM_fx[opp_sz], SQRT_DIM_fx[near_sz] ); // Q13 - angle = shl_o( angle, 1, &Overflow ); + angle = shl_sat( angle, 1 ); angle = mult_r( angle, 20861 ); c = mult_r( density, angle ); density_c = sub( density, c ); diff --git a/lib_dec/pvq_decode_fx.c b/lib_dec/pvq_decode_fx.c index 649840f55ce2f942b1a2a5acfbfe16c21a456f4c..cf815e4e974729bed273748767bc954adc84103d 100644 --- a/lib_dec/pvq_decode_fx.c +++ b/lib_dec/pvq_decode_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -33,10 +33,6 @@ void pvq_decode_fx( Word32 L_yy, L_isqrt, L_tmp; UWord16 u16_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif entry = get_size_mpvq_calc_offset_fx( dim, k_val, h_mem ); /* get size & prepare H(adaptive table for entry.size=N_MPVQ(dim,k_val) */ @@ -103,8 +99,8 @@ void pvq_decode_fx( Mpy_32_16_ss( L_isqrt, shl( y[i], shift_num ), &L_tmp, &u16_tmp ); /* Q31*Q(0+x) *2*/ Mpy_32_16_ss( L_tmp, neg_gain_norm, &L_tmp, &u16_tmp ); /* Q31*Q(0+x) *Q15 *2*/ - L_tmp = L_shr_o( L_tmp, shift_tot, &Overflow ); - xq[i] = round_fx_o( L_tmp, &Overflow ); /* Q15 , array move */ + L_tmp = L_shr_sat( L_tmp, shift_tot ); + xq[i] = round_fx_sat( L_tmp ); /* Q15 , array move */ move16(); } } diff --git a/lib_dec/range_dec_fx.c b/lib_dec/range_dec_fx.c index 7f62e0dd351583588e04b0e65efa6bcbefa3354c..fc68dee3521021ed909c631a209cef8c762db8d6 100644 --- a/lib_dec/range_dec_fx.c +++ b/lib_dec/range_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -147,16 +147,16 @@ Word32 rc_dec_bits_fx( /* i : Decoded value */ { hPVQ->rc_offset = sub( hPVQ->rc_offset, sub( bits, 16 ) ); move16(); - value = UL_lshl( UL_deposit_l( get_indice( st_fx, hPVQ->rc_offset, sub( bits, 16 ) ) ), 16 ); + value = UL_lshl( UL_deposit_l( get_indice_fx( st_fx, hPVQ->rc_offset, sub( bits, 16 ) ) ), 16 ); hPVQ->rc_offset = sub( hPVQ->rc_offset, 16 ); move16(); - value = UL_or( value, UL_deposit_l( get_indice( st_fx, hPVQ->rc_offset, 16 ) ) ); + value = UL_or( value, UL_deposit_l( get_indice_fx( st_fx, hPVQ->rc_offset, 16 ) ) ); } ELSE { hPVQ->rc_offset = sub( hPVQ->rc_offset, bits ); move16(); - value = UL_deposit_l( get_indice( st_fx, hPVQ->rc_offset, bits ) ); + value = UL_deposit_l( get_indice_fx( st_fx, hPVQ->rc_offset, bits ) ); } return value; diff --git a/lib_dec/re8_dec_fx.c b/lib_dec/re8_dec_fx.c index e6c35e29339fc8dc0f9080434b1ab8ed19f6f9e9..7c88bea92d8ca67b5a0cfcaea50bc578d3915c94 100644 --- a/lib_dec/re8_dec_fx.c +++ b/lib_dec/re8_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_dec/rom_dec.h b/lib_dec/rom_dec.h index 8c1021682a5494198dc376249596b674a7041475..b4c7e4780e61b1727c14c3ee912fbbd50d2654e0 100644 --- a/lib_dec/rom_dec.h +++ b/lib_dec/rom_dec.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef ROM_DEC_H diff --git a/lib_dec/rom_dec.c b/lib_dec/rom_dec_fx.c similarity index 97% rename from lib_dec/rom_dec.c rename to lib_dec/rom_dec_fx.c index 3f5243286c21707d6fc854775d9f0830af13d6b6..01be2c7cc6b7baabe998292d80626cdb6ccf93c9 100644 --- a/lib_dec/rom_dec.c +++ b/lib_dec/rom_dec_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -51,6 +51,7 @@ const Word16 h_low_fx[5] = /* Q15 */ { -410, 3572, 25602, 3572, -410 }; + const Word16 inv_sqi[15] = /* Q15 */ { 8192, /* 1/4 */ @@ -69,9 +70,11 @@ const Word16 inv_sqi[15] = /* Q15 */ 146, /* 1/225 */ 128 /* 1/256 */ }; + /*-------------------------------------------------------------------* * index square used in fec_adapt_codebook *-------------------------------------------------------------------*/ + const Word16 sqi[15] = /* Q0 */ { 4, /* 2 */ @@ -90,8 +93,10 @@ const Word16 sqi[15] = /* Q0 */ 225, /* 15 */ 256 /* 16 */ }; + /* RE8 related tables */ const Word16 mult_avq_tab[7] = {1,1,1,342,1,1,171}; + const Word16 shift_avq_tab[7] = {0,0,1, 10,2,0, 10}; const Word16 hntable[55]= @@ -123,7 +128,7 @@ const Word16 hestable[15]= const Word16 lsf_tab_fx[LPC_SHB_ORDER] = /* Q15 */ { 2315, 3920, 5546, 6759, 7978, - 10254, 11336, 12476, 13437, 14590 + 10254, 11336, 12476, 13437, 14590 }; const Word16 POW_ATT_TABLE0[OFF_FRAMES_LIMIT + 1] = /* Q15 */ @@ -132,15 +137,18 @@ const Word16 POW_ATT_TABLE0[OFF_FRAMES_LIMIT + 1] = /* Q15 */ 20675, 19745, 18856, 18007, 17197, 16423, 8211, 4106, 2053, 1026, 513, 257, 128, 64, 32, 16, 8, 4, 2, 1, 0 }; + const Word16 POW_ATT_TABLE1[OFF_FRAMES_LIMIT + 1] = /* Q15 */ { 32767, 31656, 30581, 29543, 28540, 27571, 26635, 25731, 24857, 24013, 23198, 22410, 21650, 20915, 20205, 19519, 9759, 4880, 2440, 1220, 610, 305, 152, 76, 38, 19, 10, 5, 2, 1, 0 }; + /* frequency group start bins for transient analysis */ /* 125 375 750 1250 2000 4000 8000 16000 24000 */ const Word16 gw[LGW_MAX] = { 1, 3, 6, 10, 16, 32, 64, 128, 192 }; + const Word16 gw_fx[LGW_MAX] = { 1, 3, 6, 10, 16, 32, 64, 128, 192 }; /* Q0 frequency group start bins for transient analysis */ const Word16 gw_len_inv_fx[LGW_MAX - 1] = /* Q15 */ @@ -148,14 +156,15 @@ const Word16 gw_len_inv_fx[LGW_MAX - 1] = /* Q15 */ 16384, 10923, 8192, 5461, 2048, 1024, 512, 512, }; + const Word16 GR_POW_HEADROOM[LGW_MAX] = /* in Q0-- Number of bits down-shifting to prevent from saturation in group power accumulation.*/ { 0, 0, 1, 2, 2, 3, 4, 4, 4 }; + /* 31.25 343.75 718.75 1218.75 1968.75 4000 8000 16000 24000 */ const Word16 ivas_gwlpr[LGW_MAX] = { 1, 3*QUOT_LPR_LTR-1, 6*QUOT_LPR_LTR-1, 10*QUOT_LPR_LTR-1, 16*QUOT_LPR_LTR-1, 32*QUOT_LPR_LTR, 64*QUOT_LPR_LTR, 128*QUOT_LPR_LTR, 192*QUOT_LPR_LTR }; - const Word16 w_hamm48k_2_fx[L_TRANA48k / 2] = /* Q15 */ { 2621, 2623, 2630, 2640, 2654, 2672, 2694, 2721, @@ -215,6 +224,7 @@ const Word16 w_hamm16k_2_fx[L_TRANA16k / 2] = /* Q15 */ 28549, 29053, 29529, 29976, 30393, 30780, 31134, 31455, 31742, 31995, 32213, 32396, 32543, 32653, 32727, 32763 }; + const Word16 w_hamm_sana48k_2_fx[288] = /* Q15 */ { 2621, 2622, 2625, 2630, 2636, 2644, 2654, 2666, @@ -254,6 +264,7 @@ const Word16 w_hamm_sana48k_2_fx[288] = /* Q15 */ 32552, 32579, 32604, 32628, 32649, 32669, 32687, 32703, 32717, 32730, 32741, 32750, 32757, 32762, 32766, 32767 }; + const Word16 w_hamm_sana32k_2_fx[L_PROT_HAMM_LEN2_32k] = /* Q15 */ { 2621, 2623, 2630, 2640, 2654, 2672, 2694, 2721, @@ -281,6 +292,7 @@ const Word16 w_hamm_sana32k_2_fx[L_PROT_HAMM_LEN2_32k] = /* Q15 */ 32283, 32344, 32400, 32452, 32501, 32545, 32585, 32622, 32654, 32682, 32707, 32727, 32743, 32755, 32763, 32767 }; + const Word16 w_hamm_sana16k_2_fx[L_PROT_HAMM_LEN2_16k] = /* Q15 */ { 2621, 2630, 2654, 2695, 2752, 2825, 2914, 3019, @@ -305,30 +317,30 @@ const Word16 swb_hr_inv_frm_len[4] = /* in Q19 */ 4369 /* 1/(960/8) */ }; -const Word16 inv_tbl_2n_minus1[] = { -1, -1, /* Bits = 0 and 1 are not used */ - 21845/*Q16*/, - 18725/*Q17*/, - 17476/*Q18*/, - 16913/*Q19*/, - 16644/*Q20*/, - 16513/*Q21*/ +const Word16 inv_tbl_2n_minus1[] = { + -1, -1, /* Bits = 0 and 1 are not used */ + 21845/*Q16*/, + 18725/*Q17*/, + 17476/*Q18*/, + 16913/*Q19*/, + 16644/*Q20*/, + 16513/*Q21*/ }; /* in Qx */ - /* er_dec_tcx.c */ const Word16 h_high3_32[L_FIR_FER2] = { -1694/*-0.0517f Q15*/, -1923/*-0.0587f Q15*/, -2687/*-0.0820f Q15*/, -3355/*-0.1024f Q15*/, -3814/*-0.1164f Q15*/, 28790/*0.8786f Q15*/, -3814/*-0.1164f Q15*/, -3355/*-0.1024f Q15*/, -2687/*-0.0820f Q15*/, -1923/*-0.0587f Q15*/, -1694/*-0.0517f Q15*/ }; + const Word16 h_high3_16[L_FIR_FER2] = { 0/* 0.f Q15*/, -672/*-0.0205f Q15*/, -2133/*-0.0651f Q15*/, -4116/*-0.1256f Q15*/, -5872/*-0.1792f Q15*/, 26306/*0.8028f Q15*/, -5872/*-0.1792f Q15*/, -4116/*-0.1256f Q15*/, -2133/*-0.0651f Q15*/, -672/*-0.0205f Q15*/, 0/* 0.f Q15*/ }; -const Word16 T_256DIV_L_Frame[] = + +const Word16 T_256DIV_L_Frame[6] = { - 6554 /*L_Frame 640*/ - ,8192 /*L_Frame 512*/ - ,8738 /*L_Frame 480*/ - ,13107/*L_Frame 320*/ - ,16384 /*L_Frame 256*/ - ,26214 /*L_Frame 160*/ + 6554, /*L_Frame 640*/ + 8192, /*L_Frame 512*/ + 8738, /*L_Frame 480*/ + 13107, /*L_Frame 320*/ + 16384, /*L_Frame 256*/ + 26214 /*L_Frame 160*/ }; -/* clang-format on */ - /* Word16 (Q15) Hann window ranging from 0 to 32767/32768 (~0.999969) */ const Word16 pcmdsp_window_hann_960[960] = { @@ -444,3 +456,4 @@ const Word16 pcmdsp_window_hann_640[640] = { 490, 452, 415, 380, 346, 314, 283, 254, 227, 201, 176, 154, 132, 113, 94, 78, 63, 50, 38, 27, 19, 12, 6, 2, 0 }; +/* clang-format on */ diff --git a/lib_dec/rst_dec_fx.c b/lib_dec/rst_dec_fx.c index c226d8b9a68830300eec9c433d781875fde11569..cce198e33850939caae17e89a855e7aa2fb3ab84 100644 --- a/lib_dec/rst_dec_fx.c +++ b/lib_dec/rst_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include "options.h" /* Compilation switches */ diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index 712ead8f460687baf4d0335122614e075e08e681..57072b9a436f30695aa72302cbce529fbcc92476 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef STAT_DEC_H @@ -94,11 +94,13 @@ typedef struct Word16 msPsdFirstMoment[NPART_SHAPING]; Word32 msPsdSecondMoment[NPART_SHAPING]; - Word16 msNoiseFloor[NPART_SHAPING]; /* Estimated noise floor */ - Word32 msNoiseEst[NPART_SHAPING]; /* Estimated noise level */ + Word16 msNoiseFloor[NPART_SHAPING]; /* Estimated noise floor */ + Word32 msNoiseFloor_32fx[NPART_SHAPING]; /* IVAS: Estimated noise floor Q25*/ + Word32 msNoiseEst[NPART_SHAPING]; /* Estimated noise level */ Word16 msNoiseEst_exp; Word16 msLogPeriodog[NPART_SHAPING]; Word16 msLogNoiseEst[NPART_SHAPING]; + Word32 msLogNoiseEst_32fx[NPART_SHAPING]; /*IVAS: Q25*/ Word16 npart_shaping; /* Number of partitions */ Word16 nFFTpart_shaping; /* Number of hybrid spectral partitions */ @@ -161,13 +163,7 @@ typedef struct { Word16 L_frameTCX; -#ifndef NONBE_FIX_1402_WAVEADJUST - Word16 Pitch; -#endif Word16 Pitch_fx; -#ifndef NONBE_FIX_1402_WAVEADJUST - Word16 T_bfi; -#endif Word8 T_bfi_fx; Word16 Transient[MAX_POST_LEN]; @@ -187,9 +183,6 @@ typedef struct Word16 step_concealgain_fx; Word16 concealment_method; -#ifndef NONBE_FIX_1402_WAVEADJUST - Word16 subframe; -#endif Word16 subframe_fx; Word16 nbLostCmpt; Word16 seed; @@ -707,11 +700,11 @@ typedef struct hq_nbfec_structure typedef struct hq_dec_structure { Word32 old_out_fx32[L_FRAME48k]; /* HQ core - previous synthesis for OLA */ - Word16 old_out_fx[L_FRAME48k]; /* HQ core - previous synthesis for OLA */ + Word16 old_out_fx[L_FRAME48k]; /* HQ core - previous synthesis for OLA. Q_old_wtda */ Word16 exp_old_out; - Word16 old_out_LB_fx[L_FRAME32k]; /* HQ core - previous synthesis for OLA for Low Band */ + Word16 old_out_LB_fx[L_FRAME32k]; /* HQ core - previous synthesis for OLA for Low Band. Q_old_wtda_LB */ Word32 old_out_LB_fx32[L_FRAME32k]; - Word16 q_old_outLB_fx; + Word16 Q_old_out_fx32; /* Q for both old_out_fx32 and old_out_LB_fx32 */ Word16 Q_old_wtda_LB; Word16 Q_old_wtda; Word16 Q_old_postdec; /*scaling of the output of core_switching_post_dec_fx() */ @@ -829,7 +822,8 @@ typedef struct td_bwe_dec_structure Word16 old_bwe_exc_fx[PIT16k_MAX * 2]; /*Q_exc*/ Word16 bwe_seed[2]; Word32 bwe_non_lin_prev_scale_fx; - Word16 old_bwe_exc_extended_fx[NL_BUFF_OFFSET]; + Word16 old_bwe_exc_extended_fx[NL_BUFF_OFFSET]; /* EVS : Q(prev_Q_bwe_exc - 16), IVAS : Q(q_old_bwe_exc_extended_fx) */ + Word16 q_old_bwe_exc_extended_fx; Word32 genSHBsynth_Hilbert_Mem_fx[HILBERT_MEM_SIZE]; @@ -1038,7 +1032,6 @@ typedef struct Decoder_State Word16 bitstreamformat; /* Bitstream format flag (G.192/MIME/VOIP_G192_RTP/VOIP_RTPDUMP) */ Word16 sdp_hf_only; /* RTP payload format parameter: only Header-Full format without zero padding for size collision avoidance */ Word16 amrwb_rfc4867_flag; /* MIME from rfc4867 is used */ - Word16 total_num_bits; /* == st->total_brate / 50 */ Word16 BER_detect; /* flag to signal detected bit error in the bitstream */ Word32 output_Fs; /* output sampling rate */ Word16 output_frame_fx; /* Output frame length Q0*/ @@ -1316,6 +1309,7 @@ typedef struct Decoder_State Word16 Q_syn; Word16 Q_syn2; Word16 Q_syn_cng; + Word16 Q_syn_factor; // This q_factor is used to avoid using fix Q0 for synth[] at the output of con_tcx_ivas_fx() and ivas_core_dec_fx(). For con_tcx_ivas_fx, it is used for two consecutive TCX concealment processes and It cannot be greater than 0. Word16 prev_Q_syn; Word16 prev_Q_bwe_exc; diff --git a/lib_dec/stat_noise_uv_dec_fx.c b/lib_dec/stat_noise_uv_dec_fx.c index d2fa36b9b17a86f29e402983d364f6a9db1e6dd5..6972e4dd3bb8d90aedc26354a21d5b55d59e5e8c 100644 --- a/lib_dec/stat_noise_uv_dec_fx.c +++ b/lib_dec/stat_noise_uv_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -76,10 +76,20 @@ void stat_noise_uv_dec_fx( IF( !st_fx->Opt_AMR_WB ) { - stat_noise_uv_mod_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, - st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, - &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, - &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); + IF( st_fx->element_mode > EVS_MONO ) + { + stat_noise_uv_mod_ivas_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, &st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, + st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, + &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, + &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); + } + ELSE + { + stat_noise_uv_mod_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, + st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, + &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, + &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); + } } diff --git a/lib_dec/swb_bwe_dec_fx.c b/lib_dec/swb_bwe_dec_fx.c index 42d2a9cc4a2e8015773e402e81b9751400538e11..1845b32e4dd244574a21a025fbf7db78d3aac582 100644 --- a/lib_dec/swb_bwe_dec_fx.c +++ b/lib_dec/swb_bwe_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_dec/swb_bwe_dec_hr_fx.c b/lib_dec/swb_bwe_dec_hr_fx.c index 9fae1ded560681fb2420b3bc487adbb7ab23ece4..813a26ea6aa28f4b5493fa3eae45d16421eafcb7 100644 --- a/lib_dec/swb_bwe_dec_hr_fx.c +++ b/lib_dec/swb_bwe_dec_hr_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -11,7 +11,6 @@ #define Q_GUARD 1 #define Q_32_BITS 14 /* scaling of 't_audio32' */ #define MAKE_PSEUDO_FLT( v, e ) ( ( ( (Word32) ( v ) ) << 16 ) + ( e ) ) -#define AVQ_DEMUX /*-----------------------------------------------------------* * Gain_Dequant_HR() * @@ -595,11 +594,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB Nsv = ( NUM_TRANS_END_FREQ_COEF - NUM_TRANS_START_FREQ_COEF ) / WIDTH_BAND; move16(); -#ifdef AVQ_DEMUX AVQ_demuxdec_fx( st_fx, x_norm, &nBits, Nsv, nq, 0, sub( Nsv, 1 ) ); -#else - AVQ_demuxdec_fx( st_fx, x_norm, &nBits, Nsv, nq ); -#endif temp = add( len, NUM_TRANS_START_FREQ_COEF ); /* 't_audio' in Q8 */ t_audio_exp = 8; @@ -848,11 +843,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB /* Nsv = i / WIDTH_BAND */ Nsv = shr( i, 3 ); -#ifdef AVQ_DEMUX AVQ_demuxdec_fx( st_fx, x_norm, &nBits, Nsv, nq, 0, sub( Nsv, 1 ) ); -#else - AVQ_demuxdec_fx( st_fx, x_norm, &nBits, Nsv, nq ); -#endif /*---------------------------------------------------------------------* * second stage decoding *---------------------------------------------------------------------*/ @@ -889,11 +880,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB } nBits = sub( nBits, NBITS_GLOB_GAIN_BWE_HR ); -#ifdef AVQ_DEMUX AVQ_demuxdec_fx( st_fx, x_norm1, &nBits, Nsv2, nq2, 0, sub( Nsv2, 1 ) ); -#else - AVQ_demuxdec_fx( st_fx, x_norm1, &nBits, Nsv2, nq2 ); -#endif } /*---------------------------------------------------------------------* diff --git a/lib_dec/swb_bwe_dec_lr_fx.c b/lib_dec/swb_bwe_dec_lr_fx.c index c0565dd75b636dc91be2e8f116a3ad43cb70515e..c7c94adacf19b8170e9f3c4c9a44f0a259362ef6 100644 --- a/lib_dec/swb_bwe_dec_lr_fx.c +++ b/lib_dec/swb_bwe_dec_lr_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include "options.h" diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 492c927b6e7fcf81fd3ce8eaedd017ab5b55660c..5ca7ba1f640bc7d7c015c0833efcd0d66a6a4f57 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -56,10 +56,13 @@ static void find_max_mem_dec( hBWE_TD = st_fx->hBWE_TD; /* old BWE exc max */ - FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { - tempQ15 = abs_s( hBWE_TD->old_bwe_exc_extended_fx[i] ); - max = s_max( max, tempQ15 ); + FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + { + tempQ15 = abs_s( hBWE_TD->old_bwe_exc_extended_fx[i] ); + max = s_max( max, tempQ15 ); + } } /* decimate all-pass steep memory */ @@ -232,10 +235,13 @@ static void rescale_genSHB_mem_dec( TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; - FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { - hBWE_TD->old_bwe_exc_extended_fx[i] = shl( hBWE_TD->old_bwe_exc_extended_fx[i], sf ); - move16(); + FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + { + hBWE_TD->old_bwe_exc_extended_fx[i] = shl( hBWE_TD->old_bwe_exc_extended_fx[i], sf ); + move16(); + } } FOR( i = 0; i < 7; i++ ) @@ -283,9 +289,12 @@ void find_max_mem_wb( Decoder_State *st_fx, Word16 *n_mem ) TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; - FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { - max = s_max( max, abs_s( hBWE_TD->old_bwe_exc_extended_fx[i] ) ); + FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + { + max = s_max( max, abs_s( hBWE_TD->old_bwe_exc_extended_fx[i] ) ); + } } FOR( i = 0; i < 7; i++ ) { @@ -362,10 +371,13 @@ void rescale_genWB_mem( Decoder_State *st_fx, Word16 sf ) TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; - FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { - hBWE_TD->old_bwe_exc_extended_fx[i] = shl( hBWE_TD->old_bwe_exc_extended_fx[i], sf ); - move16(); + FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + { + hBWE_TD->old_bwe_exc_extended_fx[i] = shl( hBWE_TD->old_bwe_exc_extended_fx[i], sf ); + move16(); + } } FOR( i = 0; i < 10; i++ ) @@ -418,6 +430,8 @@ static void InitSWBdecBuffer_fx( move16(); set16_fx( hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); + hBWE_TD->q_old_bwe_exc_extended_fx = Q15; + move16(); hBWE_TD->bwe_non_lin_prev_scale_fx = 0; move16(); @@ -599,6 +613,7 @@ void ivas_wb_tbe_dec_fx( Word16 error[L_FRAME16k]; Word16 synth_frac[L_FRAME16k]; Word16 upsampled_synth[L_FRAME48k]; + Word32 tmp_synL[L_FRAME48k], upsampled_synth_32fx[L_FRAME48k]; Word32 prev_pow, curr_pow, curr_frame_pow; Word16 curr_frame_pow_exp; Word16 temp, scale, n; @@ -618,10 +633,7 @@ void ivas_wb_tbe_dec_fx( move16(); Word32 dummy2[HILBERT_MEM_SIZE]; Word16 f, inc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + Word64 W_tmp; TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; set32_fx( &dummy2[0], 0, HILBERT_MEM_SIZE ); @@ -853,17 +865,20 @@ void ivas_wb_tbe_dec_fx( move16(); /* restrict this to 21 due to the Q factor requireemnt of the random number generator (keep 1 bit headroom) */ } - prev_pow = 0; - move32(); + W_tmp = 0; + move64(); IF( st_fx->element_mode > EVS_MONO ) { tmp = sub( shl( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ), 31 + 16 ); - prev_pow = L_shl_sat( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ + W_tmp = L_shl( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ } FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ ) { - prev_pow = L_mac0( prev_pow, hBWE_TD->state_syn_shbexc_fx[i], hBWE_TD->state_syn_shbexc_fx[i] ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ + W_tmp = W_mac_16_16( W_tmp, hBWE_TD->state_syn_shbexc_fx[i], hBWE_TD->state_syn_shbexc_fx[i] ); /*Q(2*(st_fx->prev_Q_bwe_exc-16 + 1))*/ } + exp = W_norm( W_tmp ); + prev_pow = W_extract_h( W_shl( W_tmp, exp ) ); + exp = sub( add( add( shl( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ), 1 ), exp ), 32 ); rescale_genWB_mem( st_fx, sub( Q_bwe_exc, st_fx->prev_Q_bwe_exc ) ); @@ -901,7 +916,7 @@ void ivas_wb_tbe_dec_fx( } Lscale = root_a_over_b_fx( curr_pow, shl_r( Q_bwe_exc_ext, 1 ), prev_pow, - shl_r( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ), &exp ); + exp, &exp ); FOR( i = 0; i < L_SHB_LAHEAD / 4 - 1; i++ ) { @@ -943,7 +958,7 @@ void ivas_wb_tbe_dec_fx( n = norm_s( max ); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - shaped_wb_excitation_frac[i] = shl_o( shaped_wb_excitation[i], n, &Overflow ); /*Q14*/ + shaped_wb_excitation_frac[i] = shl_sat( shaped_wb_excitation[i], n ); /*Q14*/ move16(); } n = sub( 14, n ); @@ -951,8 +966,8 @@ void ivas_wb_tbe_dec_fx( move32(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - L_tmp = L_mult_o( shaped_wb_excitation_frac[i], shaped_wb_excitation_frac[i], &Overflow ); /*Q29*/ - curr_frame_pow = L_add_o( curr_frame_pow, L_shr( L_tmp, 7 ), &Overflow ); /*Q22*/ + L_tmp = L_mult_sat( shaped_wb_excitation_frac[i], shaped_wb_excitation_frac[i] ); /*Q29*/ + curr_frame_pow = L_add_sat( curr_frame_pow, L_shr( L_tmp, 7 ) ); /*Q22*/ } } curr_frame_pow_exp = add( n, n ); @@ -1146,7 +1161,7 @@ void ivas_wb_tbe_dec_fx( L_tmp = Mult_32_16( Lacc, 102 ); /* Q22 */ exp = norm_l( L_tmp ); - tmp = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); + tmp = round_fx_sat( L_shl( L_tmp, exp ) ); exp = sub( add( exp, 22 ), 30 ); tmp = div_s( 16384, tmp ); L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* Q(31-exp) */ @@ -1163,9 +1178,10 @@ void ivas_wb_tbe_dec_fx( } ELSE IF( EQ_32( st_fx->output_Fs, 48000 ) ) { - Scale_sig( hBWE_TD->mem_resamp_HB_fx, INTERP_3_1_MEM_LEN, sub( Qx, hBWE_TD->prev_Qx ) ); - ivas_interpolate_3_over_1_allpass_fx( synth, L_FRAME16k, upsampled_synth, hBWE_TD->mem_resamp_HB_fx ); - Copy( upsampled_synth, synth, L_FRAME48k ); + Copy_Scale_sig_16_32_no_sat( synth, tmp_synL, L_FRAME48k, sub( Q11, Qx ) ); + interpolate_3_over_1_allpass_fx32( tmp_synL, L_FRAME16k, upsampled_synth_32fx, hBWE_TD->mem_resamp_HB_fx_32 ); + Copy_Scale_sig_32_16( hBWE_TD->mem_resamp_HB_fx_32, hBWE_TD->mem_resamp_HB_fx, INTERP_3_1_MEM_LEN, sub( Qx, Q11 ) ); + Copy_Scale_sig_32_16( upsampled_synth_32fx, synth, L_FRAME48k, sub( Qx, Q11 ) ); } } ELSE @@ -1261,10 +1277,6 @@ void wb_tbe_dec_fx( move16(); Word32 dummy2[HILBERT_MEM_SIZE]; Word16 f, inc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; set32_fx( &dummy2[0], 0, HILBERT_MEM_SIZE ); @@ -1585,7 +1597,7 @@ void wb_tbe_dec_fx( n = norm_s( max ); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - shaped_wb_excitation_frac[i] = shl_o( shaped_wb_excitation[i], n, &Overflow ); /*Q14*/ + shaped_wb_excitation_frac[i] = shl_sat( shaped_wb_excitation[i], n ); /*Q14*/ move16(); } n = sub( 14, n ); @@ -1593,8 +1605,8 @@ void wb_tbe_dec_fx( move32(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { - L_tmp = L_mult_o( shaped_wb_excitation_frac[i], shaped_wb_excitation_frac[i], &Overflow ); /*Q29*/ - curr_frame_pow = L_add_o( curr_frame_pow, L_shr( L_tmp, 7 ), &Overflow ); /*Q22*/ + L_tmp = L_mult_sat( shaped_wb_excitation_frac[i], shaped_wb_excitation_frac[i] ); /*Q29*/ + curr_frame_pow = L_add_sat( curr_frame_pow, L_shr( L_tmp, 7 ) ); /*Q22*/ } } curr_frame_pow_exp = add( n, n ); @@ -1790,7 +1802,7 @@ void wb_tbe_dec_fx( L_tmp = Mult_32_16( Lacc, 102 ); /* Q22 */ exp = norm_l( L_tmp ); - tmp = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); + tmp = round_fx_sat( L_shl( L_tmp, exp ) ); exp = sub( add( exp, 22 ), 30 ); tmp = div_s( 16384, tmp ); L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* Q(31-exp) */ @@ -2693,8 +2705,8 @@ void swb_tbe_dec_fx( FOR( i = 0; i < L_SHB_LAHEAD; i++ ) { - L_tmp = Mult_32_16( Lscale, shaped_shb_excitation[i] ); /* Q_bwe_exc + (31-exp) - 15 */ - shaped_shb_excitation[i] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc */ + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ move16(); } IF( exp < 0 ) @@ -2703,15 +2715,35 @@ void swb_tbe_dec_fx( exp = 0; move16(); } - FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + /* + code for EVS and IVAS are basically identical with the exception of i_mult_sat() which has precision issues + thus is was replaced for IVAS and kept for EVS, in order to keep EVS BE to test sequences and legacy implementations + */ + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { - temp = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ - L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp ); /* Q31-exp */ - temp = sub( 32767 /*1.0f Q15*/, temp ); - Lscale = L_add( Mult_32_16( Lscale, temp ), L_tmp1 ); - L_tmp = Mult_32_16( Lscale, shaped_shb_excitation[i] ); /* Q_bwe_exc + (31-exp) - 15 */ - shaped_shb_excitation[i] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc */ - move16(); + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ + L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp ); /* Q31-exp */ + temp = sub( 32767 /*1.0f Q15*/, temp ); + Lscale = L_add( Mult_32_16( Lscale, temp ), L_tmp1 ); + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); + } + } + ELSE + { + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); + L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp ); /* Q31-exp */ + temp = sub( 32767 /*1.0f Q15*/, temp ); + Lscale = L_add( Mult_32_16( Lscale, temp ), L_tmp1 ); + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); + } } /* Update SHB excitation */ @@ -4251,7 +4283,7 @@ void ivas_dequantizeSHBparams_fx_9_1( move16(); IF( i != 0 ) { - idx = idiv1616( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR ); + idx = shr( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR_LOG2 ); } Q_subgain[i] = Q_subgain[idx]; move16(); @@ -4579,7 +4611,7 @@ static void dequantizeSHBparams_fx_9_1( move16(); IF( i != 0 ) { - idx = idiv1616( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR ); + idx = shr( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR_LOG2 ); } Q_subgain[i] = Q_subgain[idx]; move16(); @@ -4644,7 +4676,8 @@ void fb_tbe_dec_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp, + st->element_mode ); /* add the fb_synth component to the hb_synth component */ /* v_add_fx( hb_synth, fb_synth, hb_synth, L_FRAME48k );*/ @@ -4713,7 +4746,8 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp, + st->element_mode ); test(); IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && ( st->idchan == 0 ) ) @@ -5361,12 +5395,6 @@ static void rescale_genSHB_mem_dec_ivas( TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; - FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) - { - hBWE_TD->old_bwe_exc_extended_fx[i] = shl( hBWE_TD->old_bwe_exc_extended_fx[i], sf ); - move16(); - } - FOR( i = 0; i < 7; i++ ) { hBWE_TD->mem_genSHBexc_filt_down_shb_fx[i] = shl( hBWE_TD->mem_genSHBexc_filt_down_shb_fx[i], sf ); @@ -6070,12 +6098,6 @@ void ivas_swb_tbe_dec_fx( tmp = i_mult( j, ( LPC_SHB_ORDER + 1 ) ); /* convert LSPs to LP coefficients */ E_LPC_f_lsp_a_conversion( lsp_temp_fx, lpc_shb_sf_fx + tmp, LPC_SHB_ORDER ); -#ifndef FIX_1100_REMOVE_LPC_RESCALING - /* Bring the LPCs to Q12 */ - Copy_Scale_sig( lpc_shb_sf_fx + tmp, lpc_shb_sf_fx + tmp, LPC_SHB_ORDER + 1, sub( norm_s( lpc_shb_sf_fx[tmp] ), 2 ) ); - lpc_shb_sf_fx[i_mult( j, ( LPC_SHB_ORDER + 1 ) )] = ONE_IN_Q12; // recheck this - move16(); -#endif } } @@ -6139,7 +6161,7 @@ void ivas_swb_tbe_dec_fx( /* ----- calculate optimum Q_bwe_exc and rescale memories accordingly ----- */ Lmax = 0; move32(); - FOR( cnt = 0; cnt < L_FRAME32k; cnt++ ) + FOR( cnt = 0; cnt < L_FRAME32k + NL_BUFF_OFFSET; cnt++ ) { Lmax = L_max( Lmax, L_abs( bwe_exc_extended_fx[cnt] ) ); } @@ -6169,7 +6191,7 @@ void ivas_swb_tbe_dec_fx( /* rescale the bwe_exc_extended and bring it to 16-bit single precision with dynamic norm */ sc = sub( Q_bwe_exc, add( Q_exc, Q_exc ) ); - FOR( cnt = 0; cnt < L_FRAME32k; cnt++ ) + FOR( cnt = 0; cnt < L_FRAME32k + NL_BUFF_OFFSET; cnt++ ) { bwe_exc_extended_16[cnt] = round_fx_sat( L_shl_sat( bwe_exc_extended_fx[cnt], sc ) ); move16(); @@ -6275,15 +6297,35 @@ void ivas_swb_tbe_dec_fx( exp = 0; move16(); } - FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + /* + code for EVS and IVAS are basically identical with the exception of i_mult_sat() which has precision issues + thus is was replaced for IVAS and kept for EVS, in order to keep EVS BE to test sequences and legacy implementations + */ + IF( EQ_16( st->element_mode, EVS_MONO ) ) { - temp_fx = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ - L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp_fx ); /* Q31-exp */ - temp_fx = sub( 32767 /*1.0f Q15*/, temp_fx ); - Lscale = L_add( Mult_32_16( Lscale, temp_fx ), L_tmp1 ); - L_tmp = Mult_32_16( Lscale, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ - shaped_shb_excitation_fx[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ - move16(); + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp_fx = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ + L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp_fx ); /* Q31-exp */ + temp_fx = sub( 32767 /*1.0f Q15*/, temp_fx ); + Lscale = L_add( Mult_32_16( Lscale, temp_fx ), L_tmp1 ); + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation_fx[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); + } + } + ELSE + { + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp_fx = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); + L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp_fx ); /* Q31-exp */ + temp_fx = sub( 32767 /*1.0f Q15*/, temp_fx ); + Lscale = L_add( Mult_32_16( Lscale, temp_fx ), L_tmp1 ); + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation_fx[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); + } } } ELSE @@ -6458,9 +6500,9 @@ void ivas_swb_tbe_dec_fx( { ener_fx = s_max( 1, ener_fx ); exp_ener = norm_s( ener_fx ); - tmp = shl( ener_fx, exp_ener ); /*Q(2+exp)*/ - inv_ener = div_s( 16384, tmp ); /*Q(15+14-2-exp)*/ - prev_ener_ratio_fx = L_shr( L_mult0( st->prev_ener_shb_fx, inv_ener ), add( sub( 9, exp_ener ), 1 ) ); /*Q: 1+27-exp-9+exp-1 = 18 */ + tmp = shl( ener_fx, exp_ener ); /*Q(2+exp)*/ + inv_ener = div_s( 16384, tmp ); /*Q(15+14-2-exp)*/ + prev_ener_ratio_fx = L_shr_sat( L_mult0( st->prev_ener_shb_fx, inv_ener ), add( sub( 9, exp_ener ), 1 ) ); /*Q: 1+27-exp-9+exp-1 = 18 */ } IF( EQ_16( st->nbLostCmpt, 1 ) ) @@ -6636,7 +6678,7 @@ void ivas_swb_tbe_dec_fx( move16(); IF( i != 0 ) { - idx = idiv1616( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR ); + idx = shr( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR_LOG2 ); } GainShape_fx[i] = GainShape_tmp_fx[idx]; move16(); @@ -6680,7 +6722,7 @@ void ivas_swb_tbe_dec_fx( move16(); IF( i != 0 ) { - idx = idiv1616( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR ); + idx = shr( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR_LOG2 ); } GainShape_fx[i] = GainShape_fx[idx]; move16(); @@ -7028,14 +7070,13 @@ void ivas_swb_tbe_dec_fx( tmp1 = 0; move16(); + + Word32 idx32 = L_shr_r( 0x00333333, 10 ); /*NUM_SHB_SUBFR/L_FRAME16k*/ // Q16 + FOR( i = 0; i < L_FRAME16k; i++ ) { - Word16 idx = 0; - move16(); - IF( i != 0 ) - { - idx = idiv1616( i_mult( NUM_SHB_SUBFR, i ), L_FRAME16k ); - } + Word16 idx; + idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ move16(); diff --git a/lib_dec/syn_outp_fx.c b/lib_dec/syn_outp_fx.c index 133ff17b44e2f40ac846c88353ebfb4d97092a56..07f356665e4204a5e43e3ec1e3778c21e72196e0 100644 --- a/lib_dec/syn_outp_fx.c +++ b/lib_dec/syn_outp_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -67,10 +67,6 @@ void unscale_AGC( { Word16 i, fac, tmp, frame_fac, max_val; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*----------------------------------------------------------------* * calculate AGC factor to avoid saturation @@ -82,7 +78,7 @@ void unscale_AGC( max_val = s_max( max_val, abs_s( x[i] ) ); } BASOP_SATURATE_WARNING_OFF_EVS - tmp = shl_o( 30000, Qx, &Overflow ); /* saturation can occur here */ + tmp = shl_sat( 30000, Qx ); /* saturation can occur here */ BASOP_SATURATE_WARNING_ON_EVS frame_fac = 0; move16(); diff --git a/lib_dec/tcq_core_dec_fx.c b/lib_dec/tcq_core_dec_fx.c index c13a8856500971c9c26f4a6b651728c2f4189672..adebdb7039093760ac8c8454f311dc2e72685e10 100644 --- a/lib_dec/tcq_core_dec_fx.c +++ b/lib_dec/tcq_core_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include @@ -69,12 +69,6 @@ void tcq_core_LR_dec_fx( Word32 divider = 0; move32(); -#ifndef BASOP_NOGLOB_DECLARE_LOCAL - if ( Overflow == 1 ) - { - Overflow = 0; /* set overflow flag to zero before entering TCQ functions without any message */ - } -#endif /* initialization */ set16_fx( dpath, 0, 280 ); diff --git a/lib_dec/tcx_utils_dec_fx.c b/lib_dec/tcx_utils_dec_fx.c index 1a847c6a0dc39ba1d5fdbc8c48bc98b39a00029b..b688fa30ac8b2699478c85b8001ac715e2fdf78a 100644 --- a/lib_dec/tcx_utils_dec_fx.c +++ b/lib_dec/tcx_utils_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ diff --git a/lib_dec/tns_base_dec_fx.c b/lib_dec/tns_base_dec_fx.c index 13f6ca461baaf7179c0019945c0757445019bdb0..e245a4674acca3a9eed93f2b189caec8036ade81 100644 --- a/lib_dec/tns_base_dec_fx.c +++ b/lib_dec/tns_base_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -26,11 +26,8 @@ typedef Word32 ( *TLinearPredictionFilter )( Word16 order, Word16 const parCoeff * * *---------------------------------------------------------------------*/ -#ifdef IVAS_CODE -void -#else + Word16 -#endif ReadTnsData( STnsConfig const *pTnsConfig, Decoder_State *st, @@ -47,20 +44,6 @@ ReadTnsData( IF( GT_16( pTnsConfig->nMaxFilters, 1 ) ) { -#ifdef IVAS_CODE - IF( pTnsConfig->allowTnsOnWhite ) - { - IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) - { - ReadFromBitstream( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, st, &stream, pnSize ); - } - ELSE - { - ReadFromBitstream( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, st, &stream, pnSize ); - } - } - ELSE -#endif { IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) @@ -81,20 +64,10 @@ ReadTnsData( move16(); *pnBits = sub( st->next_bit_pos, start_bit_pos ); - -#ifdef IVAS_CODE - return; -#else return TNS_NO_ERROR; -#endif } -#define IVAS_CODE -#ifdef IVAS_CODE -void -#else -Word16 -#endif -ReadTnsData_ivas_fx( + +void ReadTnsData_ivas_fx( STnsConfig const *pTnsConfig, Decoder_State *st, Word16 *pnBits, /*Q0*/ @@ -109,7 +82,6 @@ ReadTnsData_ivas_fx( IF( GT_16( pTnsConfig->nMaxFilters, 1 ) ) { -#ifdef IVAS_CODE IF( pTnsConfig->allowTnsOnWhite ) { IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) @@ -122,7 +94,6 @@ ReadTnsData_ivas_fx( } } ELSE -#endif { IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) @@ -143,13 +114,9 @@ ReadTnsData_ivas_fx( move16(); *pnBits = sub( st->next_bit_pos, start_bit_pos ); -#ifdef IVAS_CODE return; -#else - return TNS_NO_ERROR; -#endif } -#undef IVAS_CODE + /*---------------------------------------------------------------------* * DecodeTnsData() * @@ -169,21 +136,6 @@ Word16 DecodeTnsData( IF( GT_16( pTnsConfig->nMaxFilters, 1 ) ) { - -#ifdef IVAS_CODE - IF( pTnsConfig->allowTnsOnWhite ) - { - IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) - { - SetParameters( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, pTnsData, &stream, pnSize ); - } - ELSE - { - SetParameters( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, pTnsData, &stream, pnSize ); - } - } - ELSE -#endif { IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) { diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index 650e8572bc7bbcaddb28a1a385df35933750cd1b..767e5c8e758f8e520fe9b1a52084213b7bf00426 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #define _USE_MATH_DEFINES @@ -103,18 +103,6 @@ ivas_error TonalMDCTConceal_Init( hTonalMDCTConc->nScaleFactors = nScaleFactors; move16(); -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - PMTE() - set_zero( hTonalMDCTConc->scaleFactorsBackground, FDNS_NPTS ); - PsychoacousticParameters_Init( INT_FS_16k, L_FRAME16k, 64, 1, 1, &hTonalMDCTConc->psychParamsTCX20 ); - PsychoacousticParameters_Init( INT_FS_16k, L_FRAME16k / 2, 64, 0, 1, &hTonalMDCTConc->psychParamsTCX10 ); - hTonalMDCTConc->psychParams = NULL; - hTonalMDCTConc->scf_fadeout = 1.0f; - hTonalMDCTConc->last_block_nrg = 0.0f; - hTonalMDCTConc->curr_noise_nrg = 0.0f; - hTonalMDCTConc->faded_signal_nrg = 0.0f; - -#endif /* Offset the pointer to the end of buffer, so that pTCI is not destroyed when new time samples are stored in lastPcmOut */ move16(); @@ -146,28 +134,20 @@ ivas_error TonalMDCTConceal_Init_ivas_fx( hTonalMDCTConc->tcx_cfg = hTcxCfg; hTonalMDCTConc->lastBlockData.spectralData = hTonalMDCTConc->spectralDataBuffers[0]; -#ifdef MSAN_FIX set16_fx( hTonalMDCTConc->lastBlockData.spectralData, 0, L_FRAME_MAX ); -#endif move16(); hTonalMDCTConc->secondLastBlockData.spectralData = hTonalMDCTConc->spectralDataBuffers[1]; -#ifdef MSAN_FIX set16_fx( hTonalMDCTConc->secondLastBlockData.spectralData, 0, L_FRAME_MAX ); -#endif move16(); hTonalMDCTConc->secondLastPowerSpectrum = hTonalMDCTConc->secondLastBlockData.spectralData; move16(); hTonalMDCTConc->secondLastPowerSpectrum_exp = hTonalMDCTConc->secondLastBlockData.spectralData_exp; move16(); hTonalMDCTConc->lastBlockData.scaleFactors = hTonalMDCTConc->scaleFactorsBuffers[0]; -#ifdef MSAN_FIX set16_fx( hTonalMDCTConc->lastBlockData.scaleFactors, 0, FDNS_NPTS ); -#endif move16(); hTonalMDCTConc->secondLastBlockData.scaleFactors = hTonalMDCTConc->scaleFactorsBuffers[1]; -#ifdef MSAN_FIX set16_fx( hTonalMDCTConc->secondLastBlockData.scaleFactors, 0, FDNS_NPTS ); -#endif move16(); hTonalMDCTConc->lastBlockData.scaleFactors_exp = hTonalMDCTConc->scaleFactorsBuffers_exp[0]; move16(); @@ -206,9 +186,6 @@ ivas_error TonalMDCTConceal_Init_ivas_fx( hTonalMDCTConc->nScaleFactors = nScaleFactors; move16(); - //#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - // PMTE() - // To be uncommented when field of fixed type is added for scaleFactorsBackground set32_fx( hTonalMDCTConc->scaleFactorsBackground_fx, 0, FDNS_NPTS ); hTonalMDCTConc->scf_fadeout = 16384 /*1.000000 Q14*/; PsychoacousticParameters_Init_fx( INT_FS_16k, L_FRAME16k, 64, 1, 1, &hTonalMDCTConc->psychParamsTCX20 ); @@ -234,9 +211,7 @@ ivas_error TonalMDCTConceal_Init_ivas_fx( move16(); /* just the second half of the second last pcm output is needed */ -#ifdef MSAN_FIX set16_fx( hTonalMDCTConc->timeDataBuffer, 0, ( 3 * L_FRAME_MAX ) / 2 ); -#endif hTonalMDCTConc->secondLastPcmOut = &hTonalMDCTConc->timeDataBuffer[( 3 * L_FRAME_MAX ) / 2 - ( 3 * min( L_FRAME_MAX, nSamples ) / 2 )]; hTonalMDCTConc->lastPcmOut = &hTonalMDCTConc->timeDataBuffer[( 3 * L_FRAME_MAX ) / 2 - min( L_FRAME_MAX, nSamples )]; /* If the second last frame was lost, we reuse saved TonalComponentsInfo and don't update pcm buffers */ @@ -252,12 +227,7 @@ void TonalMDCTConceal_SaveFreqSignal( Word16 nNewSamplesCore, // Q0 const Word16 *scaleFactors, // Q31-scaleFactors_exp const Word16 *scaleFactors_exp, - const Word16 gain_tcx_exp -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - , - const int16_t infoIGFStartLine -#endif -) + const Word16 gain_tcx_exp ) { Word16 *temp; Word16 nOldSamples, tmp_exp, s, i, max_exp; @@ -350,20 +320,6 @@ void TonalMDCTConceal_SaveFreqSignal( test(); IF( ( nNewSamples > 0 ) && ( LE_16( nNewSamples, 2 * L_FRAME_MAX ) ) ) { -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - int16_t i; - PMTE() - hTonalMDCTConc->last_block_nrg_flt = 0.0f; - for ( i = 0; i < infoIGFStartLine; i++ ) - { - hTonalMDCTConc->lastBlockData.spectralData[i] = mdctSpectrum[i]; - hTonalMDCTConc->last_block_nrg_flt += mdctSpectrum[i] * mdctSpectrum[i]; - } - for ( ; i < nNewSamples; i++ ) - { - hTonalMDCTConc->lastBlockData.spectralData[i] = mdctSpectrum[i]; - } -#else /* Store new data */ s = getScaleFactor32( mdctSpectrum, nNewSamples ); @@ -385,7 +341,6 @@ void TonalMDCTConceal_SaveFreqSignal( move16(); } hTonalMDCTConc->lastBlockData.spectralData_exp = sub( mdctSpectrum_exp, s ); -#endif move16(); hTonalMDCTConc->lastBlockData.gain_tcx_exp = gain_tcx_exp; @@ -495,17 +450,16 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx( IF( ( nNewSamples > 0 ) && ( LE_16( nNewSamples, 2 * L_FRAME_MAX ) ) ) { /* Store new data */ - hTonalMDCTConc->last_block_nrg = 0; - move32(); - + Word64 W_tmp = 0; + move64(); FOR( i = 0; i < infoIGFStartLine; i++ ) { - Word16 tmp = extract_h( mdctSpectrum[i] ); - hTonalMDCTConc->last_block_nrg = L_add( hTonalMDCTConc->last_block_nrg, - L_shr( L_mult0( tmp, tmp ), 16 ) ); // Q31-last_block_nrg_exp - move32(); + W_tmp = W_mac_32_16( W_tmp, Mpy_32_32( mdctSpectrum[i], mdctSpectrum[i] ), 1 ); // exp: mdctSpectrum_exp + mdctSpectrum_exp - 1 } - hTonalMDCTConc->last_block_nrg_exp = sub( 31, sub( shl( sub( 15, mdctSpectrum_exp ), 1 ), 16 ) ); + s = W_norm( W_tmp ); + hTonalMDCTConc->last_block_nrg = W_extract_h( W_shl( W_tmp, s ) ); // exp:add( sub( shl( mdctSpectrum_exp, 1 ), s ), 31 ) + move32(); + hTonalMDCTConc->last_block_nrg_exp = add( sub( shl( mdctSpectrum_exp, 1 ), s ), 31 ); move16(); /* Store new data */ @@ -770,10 +724,6 @@ static void ivas_CalcPowerSpecAndDetectTonalComponents_fx( Word16 invScaleFactors[FDNS_NPTS]; Word16 invScaleFactors_exp[FDNS_NPTS]; Word16 powerSpectrum_exp, tmp_exp, old_exp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif Word16 nBands; Word32 invScaleFactors_fx[FDNS_NPTS]; @@ -903,7 +853,7 @@ static void ivas_CalcPowerSpecAndDetectTonalComponents_fx( /* 16 bits are now enough for storing the power spectrum */ FOR( i = 0; i < nSamples; i++ ) { - hTonalMDCTConc->secondLastPowerSpectrum[i] = round_fx_o( powerSpectrum[i], &Overflow ); // Q31 - powerSpectrum_exp + hTonalMDCTConc->secondLastPowerSpectrum[i] = round_fx_sat( powerSpectrum[i] ); // Q31 - powerSpectrum_exp move32(); } @@ -919,12 +869,7 @@ static void CalcPowerSpecAndDetectTonalComponents( Word32 secondLastMDCT[], // Q31-secondLastMDCT_exp Word16 secondLastMDCT_exp, Word32 const pitchLag, /*15Q16*/ - Word16 element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif -) + Word16 element_mode ) { Word16 nSamples; Word16 i; @@ -933,10 +878,6 @@ static void CalcPowerSpecAndDetectTonalComponents( Word16 invScaleFactors[FDNS_NPTS]; Word16 invScaleFactors_exp[FDNS_NPTS]; Word16 powerSpectrum_exp, tmp_exp, old_exp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif nSamples = hTonalMDCTConc->nNonZeroSamples; @@ -1014,20 +955,9 @@ static void CalcPowerSpecAndDetectTonalComponents( /* here mdct_shaping() is intentionally used rather then mdct_shaping_16() */ -#ifdef IVAS_CODE_MDCT_GSHAPE - IF( psychParamsCurrent == NULL ) -#endif { mdct_shaping( powerSpectrum, hTonalMDCTConc->nSamplesCore, invScaleFactors, invScaleFactors_exp ); } -#ifdef IVAS_CODE_MDCT_GSHAPE - ELSE - { - PMTE() - sns_shape_spectrum( powerSpectrum, psychParamsCurrent, invScaleFactors, hTonalMDCTConc->nSamplesCore ); - nBands = psychParamsCurrent->nBands; - } -#endif FOR( i = hTonalMDCTConc->nSamplesCore; i < nSamples; i++ ) { powerSpectrum[i] = L_shl_sat( Mpy_32_16_1( powerSpectrum[i], invScaleFactors[FDNS_NPTS - 1] ), invScaleFactors_exp[FDNS_NPTS - 1] ); // powerSpectrum_exp+ 2*invScaleFactors_exp -15 @@ -1037,7 +967,7 @@ static void CalcPowerSpecAndDetectTonalComponents( /* 16 bits are now enough for storing the power spectrum */ FOR( i = 0; i < nSamples; i++ ) { - hTonalMDCTConc->secondLastPowerSpectrum[i] = round_fx_o( powerSpectrum[i], &Overflow ); // Q31-powerSpectrum_exp + hTonalMDCTConc->secondLastPowerSpectrum[i] = round_fx_sat( powerSpectrum[i] ); // Q31-powerSpectrum_exp move32(); } @@ -1080,12 +1010,7 @@ void TonalMDCTConceal_Detect( const TonalMDCTConcealPtr hTonalMDCTConc, const Word32 pitchLag, /*15Q16*/ Word16 *numIndices, - Word16 element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif -) + Word16 element_mode ) { Word32 secondLastMDST[L_FRAME_MAX]; Word32 secondLastMDCT[L_FRAME_MAX]; @@ -1157,9 +1082,6 @@ void TonalMDCTConceal_Detect( { /* If the second last frame was also lost, it is expected that pastTimeSignal could hold a bit different signal (e.g. including fade-out) from the one stored in TonalMDCTConceal_SaveTimeSignal. */ /* That is why we reuse the already stored information about the concealed spectrum in the second last frame */ -#ifdef IVAS_CODE_MDCT_GSHAPE - IF( psychParamsCurrent == NULL ) -#endif { nSamples = hTonalMDCTConc->nNonZeroSamples; move16(); @@ -1167,13 +1089,6 @@ void TonalMDCTConceal_Detect( hTonalMDCTConc->secondLastBlockData.scaleFactors, hTonalMDCTConc->secondLastBlockData.scaleFactors_exp, hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, powerSpectrum ); } -#ifdef IVAS_CODE_MDCT_GSHAPE - ELSE - { - sns_shape_spectrum( powerSpectrum, psychParamsCurrent, hTonalMDCTConc->secondLastBlockData.scaleFactors, hTonalMDCTConc->nSamplesCore ); - nBands = psychParamsCurrent->nBands; - } -#endif powerSpectrum_exp = getScaleFactor32( powerSpectrum, nSamples ); powerSpectrum_exp = sub( powerSpectrum_exp, 3 ); /*extra 3 bits of headroom for MA filter in getEnvelope*/ @@ -1226,9 +1141,7 @@ void TonalMDCTConceal_Detect_ivas_fx( Word16 element_mode ) { Word32 secondLastMDST[L_FRAME_MAX]; -#ifdef MSAN_FIX set32_fx( secondLastMDST, 0, L_FRAME_MAX ); -#endif Word32 secondLastMDCT[L_FRAME_MAX]; Word16 secondLastMDCT_exp; Word32 *powerSpectrum = secondLastMDST; @@ -1236,9 +1149,7 @@ void TonalMDCTConceal_Detect_ivas_fx( Word16 nSamples; // Word16 nBands; Word32 sns_int_scf_fx[FDNS_NPTS]; -#ifdef MSAN_FIX set32_fx( sns_int_scf_fx, 0, FDNS_NPTS ); -#endif nSamples = hTonalMDCTConc->nSamples; move16(); @@ -1302,11 +1213,7 @@ void TonalMDCTConceal_Detect_ivas_fx( { /* If the second last frame was also lost, it is expected that pastTimeSignal could hold a bit different signal (e.g. including fade-out) from the one stored in TonalMDCTConceal_SaveTimeSignal. */ /* That is why we reuse the already stored information about the concealed spectrum in the second last frame */ -#ifdef MSAN_FIX Word16 temp_power_spectrum_q = 0; -#else - Word16 power_spectrum_q; -#endif nSamples = hTonalMDCTConc->nNonZeroSamples; move16(); Copy_Scale_sig_16_32_DEPREC( hTonalMDCTConc->secondLastPowerSpectrum, powerSpectrum, nSamples, Q15 ); @@ -1399,14 +1306,16 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( { Word16 i, l, ld, fac; Word16 rnd; - - Word16 tmp, g, tilt, exp_last, exp_noise, tiltFactor, crossfadeGain, e_crossfadeGain; - Word32 L_tmp, L_tmp2, nrgNoiseInLastFrame, nrgWhiteNoise; + Word16 tmp, g, tilt, exp_last, exp_noise, tiltFactor, crossfadeGain, e_crossfadeGain, scaleFactor; + Word32 L_tmp, L_tmp1, L_tmp2, nrgNoiseInLastFrame, nrgWhiteNoise; Word16 inv_exp, inv_samples, exp; Word32 last_block_nrg_correct; Word16 last_block_nrg_correct_e; Word32 max_concealment_value; Word16 max_spectral_value; + Word64 sum1, sum2; + Word16 num16, den16, exp1, exp2; + Word16 shift1, shift2; crossfadeGain = crossfadeGain_const; move16(); @@ -1575,9 +1484,6 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( } mdctSpectrum[i] = L_shl( L_tmp2, exp ); // Q15 - e_crossfadeGain + Q15 - spectralData_exp + exp move32(); - - hTonalMDCTConc->faded_signal_nrg = L_add( hTonalMDCTConc->faded_signal_nrg, Mpy_32_32( mdctSpectrum[i], mdctSpectrum[i] ) ); // Q31- faded_signal_nrg_exp - move32(); } FOR( i = crossOverFreq; i < hTonalMDCTConc->lastBlockData.nSamples; i++ ) { @@ -1586,7 +1492,24 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( } *mdctSpectrum_exp = sub( add( e_crossfadeGain, hTonalMDCTConc->lastBlockData.spectralData_exp ), exp ); move16(); - hTonalMDCTConc->faded_signal_nrg_exp = shl( *mdctSpectrum_exp, 1 ); + scaleFactor = getScaleFactor32( mdctSpectrum, crossOverFreq ); + IF( scaleFactor > 8 ) + { + scaleFactor = sub( scaleFactor, 8 ); // add headroom + } + ELSE + { + scaleFactor = 0; + move16(); + } + + FOR( i = 0; i < crossOverFreq; i++ ) + { + Word32 mdctSpectrumScaled = L_shl( mdctSpectrum[i], scaleFactor ); + hTonalMDCTConc->faded_signal_nrg = L_add( hTonalMDCTConc->faded_signal_nrg, Mpy_32_32( mdctSpectrumScaled, mdctSpectrumScaled ) ); + } + move32(); + hTonalMDCTConc->faded_signal_nrg_exp = shl( sub( *mdctSpectrum_exp, scaleFactor ), 1 ); move16(); } } @@ -1613,9 +1536,12 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( move16(); Word32 y = concealment_noise[l]; // concealment_noise_e move32(); - last_block_nrg_correct = L_add( last_block_nrg_correct, Mpy_32_16_1( L_msu( 0, x, fac ), x ) ); // exp = 2 * x_exp + ld - y = L_negate( Mpy_32_32( y, y ) ); // Q31-2* concealment_noise_e - hTonalMDCTConc->curr_noise_nrg = BASOP_Util_Add_Mant32Exp( hTonalMDCTConc->curr_noise_nrg, hTonalMDCTConc->curr_noise_nrg_exp, y, 2 * concealment_noise_e, &hTonalMDCTConc->curr_noise_nrg_exp ); // Q31- hTonalMDCTConc->curr_noise_nrg_exp + shift1 = norm_l( y ); + y = L_shl( y, shift1 ); + + last_block_nrg_correct = L_add( last_block_nrg_correct, Mpy_32_16_1( L_msu( 0, x, fac ), x ) ); // exp = 2 * x_exp + ld + y = L_negate( Mpy_32_32( y, y ) ); // Q31-(2* concealment_noise_e + shift1) + hTonalMDCTConc->curr_noise_nrg = BASOP_Util_Add_Mant32Exp( hTonalMDCTConc->curr_noise_nrg, hTonalMDCTConc->curr_noise_nrg_exp, y, shl( sub( concealment_noise_e, shift1 ), 1 ), &hTonalMDCTConc->curr_noise_nrg_exp ); // Q31- hTonalMDCTConc->curr_noise_nrg_exp move32(); } } @@ -1681,29 +1607,9 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( /* actual fadeout is done in this case */ ELSE { - Word32 num, den; - Word16 exp_num, exp_den; - - exp_num = cngLevelBackgroundTrace_bfi_e; - move16(); - exp_den = hTonalMDCTConc->curr_noise_nrg_exp; - move16(); - - ld = norm_l( cngLevelBackgroundTrace_bfi ); - num = L_shl( cngLevelBackgroundTrace_bfi, ld ); // Q15 - exp_num + ld - exp_num = sub( exp_num, ld ); - ld = norm_l( hTonalMDCTConc->curr_noise_nrg ); - den = L_shl( hTonalMDCTConc->curr_noise_nrg, ld ); // Q15 - exp_den + ld - exp_den = sub( exp_den, ld ); + tmp = BASOP_Util_Divide3232_Scale( cngLevelBackgroundTrace_bfi, hTonalMDCTConc->curr_noise_nrg, &exp ); + exp = add( exp, sub( cngLevelBackgroundTrace_bfi_e, hTonalMDCTConc->curr_noise_nrg_exp ) ); - exp = sub( exp_num, exp_den ); - - IF( GT_32( num, den ) ) - { - num = L_shr( num, 1 ); // Q31- exp -1 - exp = add( exp, 1 ); - } - tmp = div_l( num, round_fx( den ) ); tmp = Sqrt16( tmp, &exp ); g = mult_r( g, tmp ); // exponent of g = exp @@ -1767,9 +1673,6 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( } mdctSpectrum[l] = L_shl( L_tmp2, exp ); // Q15 - e_crossfadeGain + Q15 - spectralData_exp + exp move32(); - - hTonalMDCTConc->faded_signal_nrg = L_add( hTonalMDCTConc->faded_signal_nrg, Mpy_32_32( mdctSpectrum[l], mdctSpectrum[l] ) ); // Q31 - 2*mdctSpectrum_exp - move32(); } FOR( i = 1; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) @@ -1789,8 +1692,6 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( } mdctSpectrum[l] = L_shl( L_tmp2, exp ); // Q15 - e_crossfadeGain + Q15 - spectralData_exp + exp move32(); - - hTonalMDCTConc->faded_signal_nrg = L_add( hTonalMDCTConc->faded_signal_nrg, Mpy_32_32( mdctSpectrum[l], mdctSpectrum[l] ) ); // Q31- 2*mdctSpectrum_exp } } @@ -1809,9 +1710,6 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( } mdctSpectrum[l] = L_shl( L_tmp2, exp ); // Q15 - e_crossfadeGain + Q15 - spectralData_exp + exp move32(); - - hTonalMDCTConc->faded_signal_nrg = L_add( hTonalMDCTConc->faded_signal_nrg, Mpy_32_32( mdctSpectrum[l], mdctSpectrum[l] ) ); // Q31- 2*mdctSpectrum_exp - move32(); } FOR( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) @@ -1819,8 +1717,24 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( mdctSpectrum[l] = L_deposit_h( 0 ); move32(); } + scaleFactor = getScaleFactor32( mdctSpectrum, crossOverFreq ); + IF( scaleFactor > 8 ) + { + scaleFactor = sub( scaleFactor, 8 ); // add headroom + } + ELSE + { + scaleFactor = 0; + move16(); + } - hTonalMDCTConc->faded_signal_nrg_exp = shl( *mdctSpectrum_exp, 1 ); + FOR( i = 0; i < crossOverFreq; i++ ) + { + Word32 mdctSpectrumScaled = L_shl( mdctSpectrum[i], scaleFactor ); + hTonalMDCTConc->faded_signal_nrg = L_add( hTonalMDCTConc->faded_signal_nrg, Mpy_32_32( mdctSpectrumScaled, mdctSpectrumScaled ) ); + } + move32(); + hTonalMDCTConc->faded_signal_nrg_exp = shl( sub( *mdctSpectrum_exp, scaleFactor ), 1 ); move16(); } } @@ -1832,32 +1746,12 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( test(); IF( GT_32( hTonalMDCTConc->faded_signal_nrg, 0 ) && flag ) { - Word16 num_exp, den_exp; - Word32 num, den; + Word16 num_exp; + Word32 num; num = BASOP_Util_Add_Mant32Exp( hTonalMDCTConc->last_block_nrg, hTonalMDCTConc->last_block_nrg_exp, L_negate( last_block_nrg_correct ), last_block_nrg_correct_e, &num_exp ); // Q31-num_exp - - den = hTonalMDCTConc->faded_signal_nrg; // Q31 - hTonalMDCTConc->faded_signal_nrg_exp - move32(); - den_exp = hTonalMDCTConc->faded_signal_nrg_exp; - move16(); - - ld = norm_l( num ); - num = L_shl( num, ld ); // Q31-num_exp + ld - num_exp = sub( num_exp, ld ); - - ld = norm_l( den ); - den = L_shl( den, ld ); // Q31-den_exp + ld - den_exp = sub( den_exp, ld ); - - exp = sub( num_exp, den_exp ); - - IF( GT_32( num, den ) ) - { - num = L_shr( num, 1 ); // Q31- exp -1 - exp = add( exp, 1 ); - } - tmp = div_l( num, extract_h( den ) ); + tmp = BASOP_Util_Divide3232_Scale( num, hTonalMDCTConc->faded_signal_nrg, &exp ); + exp = add( exp, sub( num_exp, hTonalMDCTConc->faded_signal_nrg_exp ) ); tmp = Sqrt16( tmp, &exp ); FOR( i = 0; i < crossOverFreq; i++ ) @@ -1869,28 +1763,36 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( } } ELSE{ - IF( !tonalConcealmentActive ){ - ld = sub( 14, norm_s( hTonalMDCTConc->lastBlockData.nSamples ) ); - fac = shr( -32768, ld ); - + IF( tonalConcealmentActive == 0 ){ + sum1 = 0; + sum2 = 0; + move64(); + move64(); FOR( i = 0; i < crossOverFreq; i++ ) { - Word16 x = hTonalMDCTConc->lastBlockData.spectralData[i]; - Word32 y; - rnd = extract_l( L_mac0( 13849, rnd, 31821 ) ); /* Q0 */ - y = L_mult( tilt, rnd ); /* 15Q16 */ + Word16 x; + /*x = hTonalMDCTConc->lastBlockData.spectralData[i]; + nrgNoiseInLastFrame += x * x;*/ + sum1 = W_mac0_16_16( sum1, hTonalMDCTConc->lastBlockData.spectralData[i], hTonalMDCTConc->lastBlockData.spectralData[i] ); // Q: 2*(15-hTonalMDCTConc->lastBlockData.spectralData_exp) - nrgNoiseInLastFrame = L_add( nrgNoiseInLastFrame, Mpy_32_16_1( L_msu( 0, x, fac ), x ) ); // Q(31 - x_exp - ld) + Q(15 - x_exp) - 15 = Q(31 - x_exp * 2 - ld) - x = round_fx( y ); /* 15Q16 -> 15Q0 */ - nrgWhiteNoise = L_add( nrgWhiteNoise, Mpy_32_16_1( L_msu( 0, x, fac ), x ) ); // Q(31 - (15 - 0) - ld) + Q(0) - 15 = Q(1 - ld) + /* rnd = own_random(&rnd); */ + rnd = extract_l( L_mac0( 13849, rnd, 31821 ) ); /* Q0 */ - mdctSpectrum[i] = y; /* 15Q16 */ + /* mdctSpectrum[i] = tilt * rnd; */ + mdctSpectrum[i] = L_mult( tilt, rnd ); // Q16 move32(); + /* tilt *= tiltFactor; */ tilt = mult_r( tilt, tiltFactor ); /* Q15 */ + + /* nrgWhiteNoise += mdctSpectrum[i] * mdctSpectrum[i]; */ + x = round_fx( mdctSpectrum[i] ); // Q0 + sum2 = W_mac0_16_16( sum2, x, x ); // Q0 } + *mdctSpectrum_exp = 15; + move16(); - IF( nrgNoiseInLastFrame == 0 ) + IF( sum1 /* nrgNoiseInLastFrame */ == 0 ) { set32_fx( mdctSpectrum, 0, crossOverFreq ); *mdctSpectrum_exp = SPEC_EXP_DEC; @@ -1898,85 +1800,70 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( } ELSE { - exp_last = add( ld, shl( hTonalMDCTConc->lastBlockData.spectralData_exp, 1 ) ); - exp_noise = add( ld, 30 ); - - IF( nrgWhiteNoise > 0 ) + IF( g == 0 ) { - ld = norm_l( nrgNoiseInLastFrame ); - nrgNoiseInLastFrame = L_shl( nrgNoiseInLastFrame, ld ); // Q31- exp_last + ld - exp_last = sub( exp_last, ld ); - ld = norm_l( nrgWhiteNoise ); - nrgWhiteNoise = L_shl( nrgWhiteNoise, ld ); // Q31 - exp_noise + ld - exp_noise = sub( exp_noise, ld ); - - exp = sub( exp_last, exp_noise ); - - IF( GT_32( nrgNoiseInLastFrame, nrgWhiteNoise ) ) - { - nrgNoiseInLastFrame = L_shr( nrgNoiseInLastFrame, 1 ); // Q31-exp -1 - exp = add( exp, 1 ); - } - tmp = div_l( nrgNoiseInLastFrame, round_fx( nrgWhiteNoise ) ); // Q15 - tmp = Sqrt16( tmp, &exp ); - g = mult_r( g, tmp ); // exponent of g = exp - - L_tmp = L_deposit_h( 0 ); - ld = sub( hTonalMDCTConc->lastBlockData.spectralData_exp, 15 ); - exp = sub( ld, exp ); - - IF( exp > 0 ) - { - g = shr( g, exp ); // Q15 - exp - *mdctSpectrum_exp = hTonalMDCTConc->lastBlockData.spectralData_exp; - move16(); - } - ELSE - { - crossfadeGain = shl( crossfadeGain, exp ); // Q15-e_crossfadeGain+ exp - e_crossfadeGain = sub( e_crossfadeGain, exp ); - *mdctSpectrum_exp = add( e_crossfadeGain, hTonalMDCTConc->lastBlockData.spectralData_exp ); - move16(); - } - /*make a headroom for mdct_shaping*/ - exp = sub( *mdctSpectrum_exp, SPEC_EXP_DEC ); - /* assert(exp < 0);*/ - IF( exp < 0 ) - { - *mdctSpectrum_exp = SPEC_EXP_DEC; - move16(); - } - ELSE + *mdctSpectrum_exp = add( add( hTonalMDCTConc->lastBlockData.spectralData_exp, e_crossfadeGain ), 31 - SPEC_EXP_DEC ); + move16(); + FOR( i = 0; i < crossOverFreq; i++ ) { - exp = 0; - move16(); + /* mdctSpectrum[i] = g * mdctSpectrum[i] + crossfadeGain * hTonalMDCTConc->lastBlockData.spectralData[i]; */ + L_tmp = L_mult( crossfadeGain, hTonalMDCTConc->lastBlockData.spectralData[i] ); // exp: hTonalMDCTConc->lastBlockData.spectralData_exp+e_crossfadeGain + if ( mdctSpectrum[i] <= 0 ) + { + /* mdctSpectrum[i] = g * mdctSpectrum[i] - crossfadeGain * hTonalMDCTConc->lastBlockData.spectralData[i]; */ + L_tmp = L_negate( L_tmp ); // exp: hTonalMDCTConc->lastBlockData.spectralData_exp+e_crossfadeGain + } + /* headroom for mdct_shaping */ + mdctSpectrum[i] = L_shr( L_tmp, 31 - SPEC_EXP_DEC ); // *mdctSpectrum_exp + move32(); } } - FOR( i = 0; i < crossOverFreq; i++ ) + ELSE { - Word16 const x = hTonalMDCTConc->lastBlockData.spectralData[i]; // Q15 - spectralData_exp - move16(); - Word32 const y = mdctSpectrum[i]; // Q31-mdctSpectrum_exp - move32(); - - IF( g > 0 ) + IF( sum2 /* nrgWhiteNoise */ > 0 ) { - L_tmp = Mpy_32_16_1( y, g ); // Q31-mdctSpectrum_exp- spectralData_exp + exp1 = sub( W_norm( sum1 ), 1 ); + num16 = extract_h( W_extract_h( W_shl( sum1, exp1 ) ) ); // nrgNoiseInLastFrame -> Q: 2*(15-hTonalMDCTConc->lastBlockData.spectralData_exp)+exp1-48 + exp2 = W_norm( sum2 ); + den16 = extract_h( W_extract_h( W_shl( sum2, exp2 ) ) ); // nrgWhiteNoise -> Q: exp2-48 + + /* sqrt( nrgNoiseInLastFrame / nrgWhiteNoise ) */ + tmp = div_s( num16, den16 ); // Q: 15+(2*(15-hTonalMDCTConc->lastBlockData.spectralData_exp)+exp1-48)-(exp2-48) + exp = sub( sub( shl( hTonalMDCTConc->lastBlockData.spectralData_exp, 1 ), 30 ), sub( exp1, exp2 ) ); // exp of tmp + tmp = Sqrt16( tmp, &exp ); + g = mult_r( g, tmp ); // exponent of g = exp } - L_tmp2 = L_msu( L_tmp, crossfadeGain, x ); // Q15 - e_crossfadeGain + Q15 - spectralData_exp - IF( GT_32( y, 0 ) ) + exp1 = add( *mdctSpectrum_exp, exp ); + exp2 = add( hTonalMDCTConc->lastBlockData.spectralData_exp, e_crossfadeGain ); + exp = add( s_max( exp1, exp2 ), 1 ); + shift1 = sub( exp1, exp ); + shift2 = sub( exp2, exp ); + + FOR( i = 0; i < crossOverFreq; i++ ) { - L_tmp2 = L_mac( L_tmp, crossfadeGain, x ); // Q15 - e_crossfadeGain + Q15 - spectralData_exp + L_tmp1 = L_shl( Mpy_32_16_1( mdctSpectrum[i], g ), shift1 ); // g * mdctSpectrum[i] + L_tmp2 = L_shl( L_mult( crossfadeGain, hTonalMDCTConc->lastBlockData.spectralData[i] ), shift2 ); // exp + + /* mdctSpectrum[i] = g * mdctSpectrum[i] - crossfadeGain * hTonalMDCTConc->lastBlockData.spectralData[i]; */ + L_tmp = L_sub( L_tmp1, L_tmp2 ); // exp + if ( mdctSpectrum[i] > 0 ) + { + /* mdctSpectrum[i] = g * mdctSpectrum[i] + crossfadeGain * hTonalMDCTConc->lastBlockData.spectralData[i]; */ + L_tmp = L_add( L_tmp1, L_tmp2 ); // exp + } + mdctSpectrum[i] = L_shr( L_tmp, 31 - SPEC_EXP_DEC ); // exp+31-SPEC_EXP_DEC + move32(); } - mdctSpectrum[i] = L_shl( L_tmp2, exp ); // Q15 - e_crossfadeGain + Q15 - spectralData_exp + exp - move32(); + /* headroom for mdct_shaping */ + *mdctSpectrum_exp = add( exp, 31 - SPEC_EXP_DEC ); + move16(); } } - exp = sub( hTonalMDCTConc->lastBlockData.spectralData_exp, sub( *mdctSpectrum_exp, 16 ) ); + exp = sub( hTonalMDCTConc->lastBlockData.spectralData_exp, *mdctSpectrum_exp ); FOR( i = crossOverFreq; i < hTonalMDCTConc->lastBlockData.nSamples; i++ ) { - mdctSpectrum[i] = L_shl( L_deposit_l( hTonalMDCTConc->lastBlockData.spectralData[i] ), exp ); // Q15 - spectralData_exp + exp + mdctSpectrum[i] = L_shl( L_deposit_h( hTonalMDCTConc->lastBlockData.spectralData[i] ), exp ); // mdctSpectrum_exp move32(); } } @@ -2229,19 +2116,12 @@ void TonalMDCTConceal_InsertNoise( Word16 *pSeed, /*IN/OUT*/ const Word16 tiltCompFactor, // Q15 Word16 crossfadeGain, // Q15 -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - const Word16concealment_noise[L_FRAME48k], - const float cngLevelBackgroundTrace_bfi, -#endif const Word16 crossOverFreq ) { Word16 i, ld, fac; Word16 rnd, exp, exp_last, exp_noise, inv_samples, inv_exp; Word16 g, tiltFactor, tilt, tmp; Word32 nrgNoiseInLastFrame, nrgWhiteNoise, L_tmp, L_tmp2; -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - float last_block_nrg_correct; -#endif g = sub( 32767 /*1.0f Q15*/, crossfadeGain ); @@ -2252,16 +2132,6 @@ void TonalMDCTConceal_InsertNoise( rnd = *pSeed; move16(); } -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - /* based on what is done in tcx_noise_filling() */ - /* always initialize these to avoid compiler warnings */ - tiltFactor = (float) pow( max( 0.375f, tiltCompFactor ), 1.0f / hTonalMDCTConc->lastBlockData.nSamples ); - tilt = 1.0f; - nrgNoiseInLastFrame = 0.0f; - nrgWhiteNoise = 0.0f; - hTonalMDCTConc->faded_signal_nrg_flt = 0.0f; - last_block_nrg_correct = 0.0f; -#endif IF( hTonalMDCTConc->lastBlockData.blockIsValid == 0 ) { /* may just become active if the very first frame is lost */ @@ -2269,199 +2139,8 @@ void TonalMDCTConceal_InsertNoise( *mdctSpectrum_exp = SPEC_EXP_DEC; move16(); } -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - else if ( concealment_noise != NULL ) - { - if ( !tonalConcealmentActive ) - { - /* if fadeout has not started yet, only apply sign scrambling */ - if ( crossfadeGain == 1.0f ) - { - for ( i = 0; i < crossOverFreq; i++ ) - { - if ( concealment_noise[i] > 0 ) - { - mdctSpectrum[i] = hTonalMDCTConc->lastBlockData.spectralData[i]; - } - else - { - mdctSpectrum[i] = -hTonalMDCTConc->lastBlockData.spectralData[i]; - } - } - - for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) - { - mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; - } - } - /* actual fadeout is done in this case */ - else - { - g *= (float) sqrt( cngLevelBackgroundTrace_bfi / hTonalMDCTConc->curr_noise_nrg_flt ); - - for ( i = 0; i < crossOverFreq; i++ ) - { - x = hTonalMDCTConc->lastBlockData.spectralData[i]; - y = concealment_noise[i]; - - if ( y > 0 ) - { - mdctSpectrum[i] = g * y + crossfadeGain * x; - } - else - { - mdctSpectrum[i] = g * y - crossfadeGain * x; - } - - hTonalMDCTConc->faded_signal_nrg_flt += mdctSpectrum[i] * mdctSpectrum[i]; - } - for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) - { - mdctSpectrum[l] = 0.0f; - } - } - } - else - { - assert( hTonalMDCTConc->pTCI->numIndexes > 0 ); - - /* initialize bins of tonal components with zero: basically not - necessary, but currently the whole spectrum is rescaled in - mdct_noiseShaping() and then there would be a processing of - uninitialized values */ - for ( i = 0; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - for ( l = hTonalMDCTConc->pTCI->lowerIndex[i]; l <= hTonalMDCTConc->pTCI->upperIndex[i]; l++ ) - { - mdctSpectrum[l] = 0; - if ( l < crossOverFreq ) - { - last_block_nrg_correct += hTonalMDCTConc->lastBlockData.spectralData[l] * hTonalMDCTConc->lastBlockData.spectralData[l]; - hTonalMDCTConc->curr_noise_nrg_flt -= concealment_noise[l] * concealment_noise[l]; - } - } - } - - /* if fadeout has not started yet, only apply sign scrambling */ - if ( crossfadeGain == 1.0f ) - { - for ( l = 0; l < hTonalMDCTConc->pTCI->lowerIndex[0]; l++ ) - { - if ( concealment_noise[l] > 0 ) - { - mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; - } - else - { - mdctSpectrum[l] = -hTonalMDCTConc->lastBlockData.spectralData[l]; - } - } - for ( i = 1; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - for ( l = hTonalMDCTConc->pTCI->upperIndex[i - 1] + 1; l < hTonalMDCTConc->pTCI->lowerIndex[i]; l++ ) - { - if ( concealment_noise[l] > 0 ) - { - mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; - } - else - { - mdctSpectrum[l] = -hTonalMDCTConc->lastBlockData.spectralData[l]; - } - } - } - - for ( l = hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] + 1; l < crossOverFreq; l++ ) - { - if ( concealment_noise[l] > 0 ) - { - mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; - } - else - { - mdctSpectrum[l] = -hTonalMDCTConc->lastBlockData.spectralData[l]; - } - } - - for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) - { - mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; - } - } - /* actual fadeout is done in this case */ - else - { - g *= (float) sqrt( cngLevelBackgroundTrace_bfi / hTonalMDCTConc->curr_noise_nrg_flt ); - - for ( l = 0; l < hTonalMDCTConc->pTCI->lowerIndex[0]; l++ ) - { - x = hTonalMDCTConc->lastBlockData.spectralData[l]; - y = concealment_noise[l]; - - if ( y > 0 ) - { - mdctSpectrum[l] = g * y + crossfadeGain * x; - } - else - { - mdctSpectrum[l] = g * y - crossfadeGain * x; - } - hTonalMDCTConc->faded_signal_nrg_flt += mdctSpectrum[l] * mdctSpectrum[l]; - } - for ( i = 1; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - for ( l = hTonalMDCTConc->pTCI->upperIndex[i - 1] + 1; l < hTonalMDCTConc->pTCI->lowerIndex[i]; l++ ) - { - x = hTonalMDCTConc->lastBlockData.spectralData[l]; - y = concealment_noise[l]; - - if ( y > 0 ) - { - mdctSpectrum[l] = g * y + crossfadeGain * x; - } - else - { - mdctSpectrum[l] = g * y - crossfadeGain * x; - } - hTonalMDCTConc->faded_signal_nrg_flt += mdctSpectrum[l] * mdctSpectrum[l]; - } - } - - for ( l = hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] + 1; l < crossOverFreq; l++ ) - { - x = hTonalMDCTConc->lastBlockData.spectralData[l]; - y = concealment_noise[l]; - - if ( y > 0 ) - { - mdctSpectrum[l] = g * y + crossfadeGain * x; - } - else - { - mdctSpectrum[l] = g * y - crossfadeGain * x; - } - hTonalMDCTConc->faded_signal_nrg_flt += mdctSpectrum[l] * mdctSpectrum[l]; - } - - for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) - { - mdctSpectrum[l] = 0.0f; - } - } - } - - if ( hTonalMDCTConc->faded_signal_nrg_flt > 0.0f && hTonalMDCTConc->curr_noise_nrg_flt > MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG ) - { - float nrg_corr_factor; - - nrg_corr_factor = sqrtf( ( hTonalMDCTConc->last_block_nrg_flt - last_block_nrg_correct ) / hTonalMDCTConc->faded_signal_nrg_flt ); - v_multc( mdctSpectrum, nrg_corr_factor, mdctSpectrum, crossOverFreq ); - } - } -#endif ELSE { -#ifndef IVAS_CODE_CNG_FIX185_PLC_FADEOUT L_tmp = 805306368l /*0.375f Q31*/; move32(); inv_exp = 15; @@ -2478,7 +2157,6 @@ void TonalMDCTConceal_InsertNoise( nrgNoiseInLastFrame = L_deposit_h( 0 ); nrgWhiteNoise = L_deposit_h( 0 ); exp_last = exp_noise = 0; -#endif move16(); move16(); IF( !tonalConcealmentActive ) @@ -2836,10 +2514,6 @@ void TonalMDCTConceal_Apply( const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ Word32 *mdctSpectrum, // Q31-*mdctSpectrum_exp /*IN/OUT*/ Word16 *mdctSpectrum_exp /*IN */ -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif ) { Word16 i, l, exp; @@ -2857,22 +2531,12 @@ void TonalMDCTConceal_Apply( move16(); assert( hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] < nSamples ); -#ifdef IVAS_CODE_MDCT_GSHAPE - IF( psychParamsCurrent == NULL ) -#endif { mdct_shaping_16( hTonalMDCTConc->secondLastPowerSpectrum, hTonalMDCTConc->nSamplesCore, nSamples, hTonalMDCTConc->secondLastBlockData.scaleFactors, hTonalMDCTConc->secondLastBlockData.scaleFactors_exp, hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, powerSpectrum ); } -#ifdef IVAS_CODE_MDCT_GSHAPE - ELSE - { - sns_shape_spectrum( powerSpectrum, psychParamsCurrent, hTonalMDCTConc->secondLastBlockData.scaleFactors, hTonalMDCTConc->nSamplesCore ); - nBands = psychParamsCurrent->nBands; - } -#endif phaseDiff = hTonalMDCTConc->pTCI->phaseDiff; /* if multiple frame loss occurs use the phase from the last frame and continue rotating */ pCurrentPhase = hTonalMDCTConc->pTCI->phase_currentFramePredicted; @@ -2936,9 +2600,9 @@ void TonalMDCTConceal_Apply( } void TonalMDCTConceal_Apply_ivas_fx( - TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ - Word32 *mdctSpectrum, // Q31-*mdctSpectrum_exp /*IN/OUT*/ - Word16 mdctSpectrum_exp[L_FRAME_MAX], /*IN */ + TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + Word32 *mdctSpectrum, // Q31-*mdctSpectrum_exp /*IN/OUT*/ + Word16 mdctSpectrum_exp, /*IN */ const PsychoacousticParameters *psychParamsCurrent ) { @@ -3104,8 +2768,7 @@ void TonalMDCTConceal_Apply_ivas_fx( /* getCosWord16 returns 1Q14*/ mdctSpectrum[l] = Mpy_32_16_1( powerSpectrum[l], getCosWord16( extract_l( currentPhase ) ) ); move32(); - mdctSpectrum_exp[l] = add( powerSpectrum_exp, 1 ); // getCosWord16 returns Q14 (exp is 1)d - move16(); + mdctSpectrum[l] = L_shr( mdctSpectrum[l], sub( mdctSpectrum_exp, add( powerSpectrum_exp, 1 ) ) ); } } } @@ -3235,7 +2898,7 @@ void TonalMdctConceal_create_concealment_noise_ivas_fx( HANDLE_FD_CNG_COM hFdCngCom; Word16 *rnd_c, *rnd; Word16 crossOverFreq, i, save_rnd_c, max_noise_line; - Word16 c, c_inv, inc; + Word16 c, c_inv, inc, inc_log2; Word32 noise_shape_buffer[L_FRAME48k]; Word16 noise_shape_buffer_e[L_FRAME48k]; Word16 start_idx, stop_idx, noise_shape_buffer_common_exp = MIN16B_FLT_FX, last_scf_e, temp_e; @@ -3343,14 +3006,21 @@ void TonalMdctConceal_create_concealment_noise_ivas_fx( IF( GT_16( st->core, TCX_20_CORE ) ) { inc = 2; + inc_log2 = 1; + move16(); + move16(); + start_idx = shr( hFdCngCom->startBand, inc_log2 ); + stop_idx = shr( hFdCngCom->stopFFTbin, inc_log2 ); } ELSE { inc = 1; + start_idx = hFdCngCom->startBand; + stop_idx = hFdCngCom->stopFFTbin; + move16(); + move16(); + move16(); } - move16(); - start_idx = idiv1616( hFdCngCom->startBand, inc ); - stop_idx = idiv1616( hFdCngCom->stopFFTbin, inc ); FOR( i = 0; i < start_idx; i++ ) { @@ -3428,7 +3098,15 @@ void TonalMdctConceal_create_concealment_noise_ivas_fx( move32(); IF( concealment_noise[i] != 0 ) { - hTonalMDCTConc->curr_noise_nrg = BASOP_Util_Add_Mant32Exp( hTonalMDCTConc->curr_noise_nrg, hTonalMDCTConc->curr_noise_nrg_exp, Mpy_32_32( concealment_noise[i], concealment_noise[i] ), shl( *concealment_noise_exp, 1 ), &temp_e ); // Q31-temp_e + Word32 cnp; + Word16 cnp_e; + + cnp_e = norm_l( concealment_noise[i] ); + cnp = L_shl( concealment_noise[i], cnp_e ); + cnp = Mpy_32_32( cnp, cnp ); + cnp_e = shl( sub( *concealment_noise_exp, cnp_e ), 1 ); + + hTonalMDCTConc->curr_noise_nrg = BASOP_Util_Add_Mant32Exp( hTonalMDCTConc->curr_noise_nrg, hTonalMDCTConc->curr_noise_nrg_exp, cnp, cnp_e, &temp_e ); // Q31-temp_e } hTonalMDCTConc->curr_noise_nrg_exp = temp_e; move16(); @@ -3448,7 +3126,15 @@ void TonalMdctConceal_create_concealment_noise_ivas_fx( move32(); IF( concealment_noise[i] != 0 ) { - hTonalMDCTConc->curr_noise_nrg = BASOP_Util_Add_Mant32Exp( hTonalMDCTConc->curr_noise_nrg, hTonalMDCTConc->curr_noise_nrg_exp, Mpy_32_32( concealment_noise[i], concealment_noise[i] ), shl( *concealment_noise_exp, 1 ), &temp_e ); // Q31-temp_e + Word32 cnp; + Word16 cnp_e; + + cnp_e = norm_l( concealment_noise[i] ); + cnp = L_shl( concealment_noise[i], cnp_e ); + cnp = Mpy_32_32( cnp, cnp ); + cnp_e = shl( sub( *concealment_noise_exp, cnp_e ), 1 ); + + hTonalMDCTConc->curr_noise_nrg = BASOP_Util_Add_Mant32Exp( hTonalMDCTConc->curr_noise_nrg, hTonalMDCTConc->curr_noise_nrg_exp, cnp, cnp_e, &temp_e ); // Q31-temp_e } hTonalMDCTConc->curr_noise_nrg_exp = temp_e; move16(); @@ -3511,9 +3197,7 @@ void TonalMdctConceal_whiten_noise_shape_ivas_fx( psychParams = st->hTonalMDCTConc->psychParams; hFdCngCom = st->hFdCngDec->hFdCngCom; -#ifdef MSAN_FIX set32_fx( whitenend_noise_shape, 0, L_FRAME16k ); -#endif IF( EQ_32( whitening_mode, ON_FIRST_LOST_FRAME ) ) { @@ -3600,216 +3284,3 @@ void TonalMdctConceal_whiten_noise_shape_ivas_fx( pop_wmops(); } - - -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT -void TonalMdctConceal_create_concealment_noise( - float concealment_noise[L_FRAME48k], - CPE_DEC_HANDLE hCPE, - const int16_t L_frameTCX, - const int16_t L_frame, - const int16_t idchan, - const int16_t subframe_idx, - const int16_t core, - const int16_t crossfade_gain, - const TONALMDCTCONC_NOISE_GEN_MODE noise_gen_mode ) -{ - STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct; - TonalMDCTConcealPtr hTonalMDCTConc; - Decoder_State *st; - HANDLE_FD_CNG_COM hFdCngCom; - int16_t *rnd_c, *rnd; - int16_t crossOverFreq, i, save_rnd_c, max_noise_line; - float c, c_inv; - float noise_shape_buffer[L_FRAME48k]; - int16_t inc, start_idx, stop_idx; - float *cngNoiseLevelPtr; - float last_scf; - - wmops_sub_start( "create_conc_noise" ); - - hStereoMdct = hCPE->hStereoMdct; - st = hCPE->hCoreCoder[idchan]; - hTonalMDCTConc = st->hTonalMDCTConc; - hFdCngCom = st->hFdCngDec->hFdCngCom; - rnd = &hStereoMdct->noise_seeds_channels[idchan]; - rnd_c = &hStereoMdct->noise_seed_common; - - /* determine start bin for IGF */ - if ( st->igf == 0 ) - { - if ( st->narrowBand == 0 ) - { - /* minimum needed for output with sampling rates lower then the - nominal sampling rate */ - crossOverFreq = min( L_frameTCX, L_frame ); - } - else - { - crossOverFreq = L_frameTCX; - } - } - else - { - crossOverFreq = min( st->hIGFDec->infoIGFStartLine, L_frameTCX ); - } - - /* for tonal mdct concealment with tonal components above the crossover frequency, conditionally raise the frequency index until which noise is generated */ - max_noise_line = crossOverFreq; - if ( st->tonal_mdct_plc_active ) - { - max_noise_line = max( max_noise_line, hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] + 1 ); - } - - /* first lost frame is handled separately */ - if ( !hTonalMDCTConc->lastBlockData.blockIsConcealed ) - { - *rnd = 1977 + idchan; - /* will be set twice when looping over two channels, but does not matter */ - *rnd_c = 1979; - } - - if ( crossfade_gain == 1.0f ) - { - /* In first frame, noise is weighted with zero anyway, we only need the random numbers for the sign scrambling */ - for ( i = 0; i < max_noise_line; i++ ) - { - *rnd = own_random( rnd ); - concealment_noise[i] = *rnd; - } - - wmops_sub_end(); - - return; - } - - save_rnd_c = *rnd_c; - - c = sqrtf( hStereoMdct->lastCoh ); - c_inv = sqrtf( 1 - hStereoMdct->lastCoh ); - - /* pre-compute the noise shape for later weighting of the noise spectra */ - cngNoiseLevelPtr = &hFdCngCom->cngNoiseLevel_flt[0]; - inc = ( st->core > TCX_20_CORE ) ? 2 : 1; - start_idx = hFdCngCom->startBand / inc; - stop_idx = hFdCngCom->stopFFTbin / inc; - - for ( i = 0; i < start_idx; i++ ) - { - noise_shape_buffer[i] = 0.0f; - } - for ( ; i < stop_idx; i++, cngNoiseLevelPtr += inc ) - { - noise_shape_buffer[i] = sqrtf( *( cngNoiseLevelPtr ) ); - } - - last_scf = sqrtf( *( cngNoiseLevelPtr - inc ) ); - - for ( ; i < max_noise_line; i++ ) - { - noise_shape_buffer[i] = last_scf; - } - - /* fill the noise vector */ - hTonalMDCTConc->curr_noise_nrg_flt = MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG; - if ( noise_gen_mode == EQUAL_CORES || ( ( noise_gen_mode == TCX20_IN_0_TCX10_IN_1 && idchan == 0 ) || ( noise_gen_mode == TCX10_IN_0_TCX20_IN_1 && idchan == 1 ) ) ) - { - /* current channel is TCX20 -> generate noise for "full-length" spectrum */ - for ( i = 0; i < max_noise_line; i++ ) - { - *rnd = own_random( rnd ); - *rnd_c = own_random( rnd_c ); - - concealment_noise[i] = ( c_inv * *rnd + c * *rnd_c ) * noise_shape_buffer[i]; - hTonalMDCTConc->curr_noise_nrg_flt += concealment_noise[i] * concealment_noise[i]; - } - } - else /* ( ( noise_gen_mode == TCX10_IN_0_TCX20_IN_1 && idchan == 0 ) || ( noise_gen_mode == TCX20_IN_0_TCX10_IN_1 && idchan == 1 ) ) */ - { - /* current channel is TCX10 and the other is TCX20 -> generate noise for "half-length" spectrum, but "increment" mid seed twice, to have the same seed in mid as the other (TCX20) channel for next frame */ - for ( i = 0; i < max_noise_line; i++ ) - { - *rnd = own_random( rnd ); - *rnd_c = own_random( rnd_c ); - - concealment_noise[i] = ( c_inv * *rnd + c * *rnd_c ) * noise_shape_buffer[i]; - hTonalMDCTConc->curr_noise_nrg_flt += concealment_noise[i] * concealment_noise[i]; - - *rnd_c = own_random( rnd_c ); - } - } - if ( st->tonal_mdct_plc_active ) - { - for ( i = crossOverFreq; i < max( crossOverFreq, hTonalMDCTConc->pTCI->lowerIndex[hTonalMDCTConc->pTCI->numIndexes - 1] ); ++i ) - { - concealment_noise[i] *= 0.0f; - } - } - /* restore common seed - - after finishing the first channel - - after a first subframe if the current channel is TCX10 */ - if ( ( idchan == 0 && ( core == TCX_20 || ( core == TCX_10 && subframe_idx == 1 ) ) ) || ( core == TCX_10 && subframe_idx == 0 ) ) - { - *rnd_c = save_rnd_c; - } - st->seed_tcx_plc = *rnd; - wmops_sub_end(); - - return; -} -void TonalMdctConceal_whiten_noise_shape( - Decoder_State *st, - const int16_t L_frame, - const TONALMDCTCONC_NOISE_SHAPE_WHITENING_MODE whitening_mode ) -{ - int16_t inc, start_idx, stop_idx; - float *noiseLevelPtr, *scfs_bg, *scfs_for_shaping; - HANDLE_FD_CNG_COM hFdCngCom; - float whitenend_noise_shape[L_FRAME16k]; - float scfs_int[FDNS_NPTS]; - const PsychoacousticParameters *psychParams; - - push_wmops( "apply_sns_on_noise_shape" ); - - scfs_bg = &st->hTonalMDCTConc->scaleFactorsBackground_flt[0]; - psychParams = st->hTonalMDCTConc->psychParams; - hFdCngCom = st->hFdCngDec->hFdCngCom; - - inc = ( ( whitening_mode == ON_FIRST_LOST_FRAME ? st->core : st->last_core ) > TCX_20_CORE ) ? 2 : 1; - start_idx = hFdCngCom->startBand / inc; - stop_idx = L_frame / inc; - noiseLevelPtr = hFdCngCom->cngNoiseLevel_flt; - - set_zero( whitenend_noise_shape, start_idx ); - for ( int16_t j = start_idx; j < stop_idx; j++, noiseLevelPtr += inc ) - { - whitenend_noise_shape[j] = *noiseLevelPtr; - } - - if ( whitening_mode == ON_FIRST_LOST_FRAME ) - { - float scf[SNS_NPTS]; - - sns_compute_scf( whitenend_noise_shape, psychParams, L_frame, scf ); - sns_interpolate_scalefactors( scfs_int, scf, ENC ); - sns_interpolate_scalefactors( scfs_bg, scf, DEC ); - scfs_for_shaping = &scfs_int[0]; - } - else /* whitening_mode == ON_FIRST_GOOD_FRAME */ - { - scfs_for_shaping = &scfs_bg[0]; - } - - if ( sum_f( scfs_for_shaping, FDNS_NPTS ) > 0.0f ) - { - sns_shape_spectrum( whitenend_noise_shape, psychParams, scfs_for_shaping, L_frame ); - mvr2r( whitenend_noise_shape + start_idx, hFdCngCom->cngNoiseLevel_flt, stop_idx - start_idx ); - } - else - { - set_zero( hFdCngCom->cngNoiseLevel_flt, stop_idx - start_idx ); - } - - pop_wmops(); -} -#endif diff --git a/lib_dec/transition_dec_fx.c b/lib_dec/transition_dec_fx.c index b82378198604518d2b6ea4a15a4417d0a306a15e..8fb036d2adc76482f9a365e82ff5452b838bb138 100644 --- a/lib_dec/transition_dec_fx.c +++ b/lib_dec/transition_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -13,26 +13,24 @@ *----------------------------------------------------------------------*/ static void tc_dec_fx( Decoder_State *st_fx, const Word16 L_frame, Word16 exc[], Word16 *T0, Word16 *T0_frac, const Word16 i_subfr, const Word16 tc_subfr, Word16 *position, Word16 bwe_exc[], Word16 *Q_exc ); /*======================================================================*/ -/* FUNCTION : transition_dec_fx() */ +/* FUNCTION : transition_dec_fx() */ /*----------------------------------------------------------------------*/ -/* PURPOSE : Principal function for TC decoding */ -/* */ +/* PURPOSE : Principal function for TC decoding */ +/* */ /*----------------------------------------------------------------------*/ -/* GLOBAL INPUT ARGUMENTS : */ -/* _ (Word16) L_frame : length of the frame Q0 */ -/* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ -/* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ -/*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q0) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q0) */ -/*-----------------------------------------------------------------------*/ - - -/*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*=======================================================================*/ +/* GLOBAL INPUT ARGUMENTS : */ +/* _ (Word16) L_frame : length of the frame Q0 */ +/* _ (Word16[]) pitch_buf_fx: floating pitch values for each subframe Q6*/ +/* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ +/*----------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) exc_fx : adapt. excitation exc (Q0) */ +/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q0) */ +/*----------------------------------------------------------------------*/ +/*----------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*======================================================================*/ void transition_dec_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ @@ -56,9 +54,7 @@ void transition_dec_fx( Word16 i, offset, temp, tmp; Word16 limit_flag; Word16 i_subfridx; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) ( Opt_AMR_WB ); -#endif i_subfridx = i_subfr / L_SUBFR; /*i_subfr / L_SUBFR*/ /* Set limit_flag to 0 for restrained limits, and 1 for extended limits */ @@ -211,7 +207,14 @@ void transition_dec_fx( limit_T0_fx( L_FRAME, 8, pit_flag, limit_flag, *T0, 0, T0_min, T0_max ); /* find T0_min and T0_max */ /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } offset = tbe_celp_exc_offset( *T0, *T0_frac, L_frame ); move16(); @@ -241,7 +244,14 @@ void transition_dec_fx( limit_T0_fx( L_FRAME, 8, pit_flag, limit_flag, *T0, 0, T0_min, T0_max ); /* find T0_min and T0_max */ /* Find the adaptive codebook vector. ACELP long-term prediction */ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } offset = tbe_celp_exc_offset( *T0, *T0_frac, L_frame ); move16(); move16(); /* penality for 2 ptrs initialization */ @@ -310,7 +320,14 @@ void transition_dec_fx( } /* Find the adaptive codebook vector. ACELP long-term prediction */ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } offset = tbe_celp_exc_offset( *T0, *T0_frac, L_frame ); move16(); move16(); /* penality for 2 ptrs initialization */ @@ -332,7 +349,14 @@ void transition_dec_fx( delta_pit_dec_fx( 2, index, T0, T0_frac, *T0_min ); /* Find the adaptive codebook vector. ACELP long-term prediction */ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } offset = tbe_celp_exc_offset( *T0, *T0_frac, L_frame ); move16(); move16(); /* penality for 2 ptrs initialization */ @@ -353,7 +377,14 @@ void transition_dec_fx( pit_Q_dec_fx( 0, index, nBits, 8, pit_flag, limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); /* Find the adaptive codebook vector */ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } offset = tbe_celp_exc_offset( *T0, *T0_frac, L_frame ); move16(); move16(); /* penality for 2 ptrs initialization */ @@ -546,7 +577,14 @@ void transition_dec_fx( ELSE { /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } offset = tbe_celp_exc_offset( *T0, *T0_frac, L_frame ); move16(); move16(); /* penalty for 2 ptrs initialization */ @@ -595,26 +633,24 @@ void transition_dec_fx( /*======================================================================*/ -/* FUNCTION : tc_dec_fx() */ +/* FUNCTION : tc_dec_fx() */ /*----------------------------------------------------------------------*/ -/* PURPOSE : Principal function for TC decoding */ -/* * Principal function for TC decoding. */ -/* * - constructs glottal codebook contribution */ -/* * - uses pitch sharpening */ -/* * - uses gain_trans */ +/* PURPOSE : Principal function for TC decoding */ +/* * Principal function for TC decoding. */ +/* * - constructs glottal codebook contribution */ +/* * - uses pitch sharpening */ +/* * - uses gain_trans */ /*----------------------------------------------------------------------*/ -/* GLOBAL INPUT ARGUMENTS : */ -/* _ (Word16) L_frame : length of the frame Q0 */ +/* GLOBAL INPUT ARGUMENTS : */ +/* _ (Word16) L_frame : length of the frame Q0 */ /*----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q0) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q0) */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) exc_fx : adapt. excitation exc (Q0) */ +/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q0) */ /*----------------------------------------------------------------------*/ - - /*----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*======================================================================*/ static void tc_dec_fx( @@ -636,10 +672,6 @@ static void tc_dec_fx( Word16 j, sc; Word16 tempS; Word16 index; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*----------------------------------------------------------------* * find the number of bits *----------------------------------------------------------------*/ @@ -789,7 +821,7 @@ static void tc_dec_fx( j = s_min( L_SUBFR, add( imp_pos, L_IMPULSE2 ) ); FOR( ; i <= j; i++ ) { - exc[i + i_subfr] = round_fx_o( L_shl_o( L_mult_o( pt_shape[i], gain_trans, &Overflow ), sc, &Overflow ), &Overflow ); /* (Qx * Q14 ) */ + exc[i + i_subfr] = round_fx_sat( L_shl_sat( L_mult_sat( pt_shape[i], gain_trans ), sc ) ); /* (Qx * Q14 ) */ move16(); } FOR( ; i < L_SUBFR; i++ ) @@ -830,9 +862,7 @@ Word16 tc_classif_fx( /*o: Q0*/ ) { Word16 tc_subfr, indice; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) ( L_frame ); -#endif IF( EQ_16( st_fx->L_frame, L_FRAME ) ) { IF( get_next_indice_fx( st_fx, 1 ) ) diff --git a/lib_dec/updt_dec_fx.c b/lib_dec/updt_dec_fx.c index 0e1b951bb4afc1e1b5e636f067099700fba78b32..240f9545c4cc8669299569d18ff755cbd35d77be 100644 --- a/lib_dec/updt_dec_fx.c +++ b/lib_dec/updt_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -394,8 +394,8 @@ void updt_IO_switch_dec_fx( *-------------------------------------------------------------------*/ void updt_bw_switching_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 *synth, /* i : fixed point synthesis signal Qpost */ + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word16 *synth, /* i : synthesis signal Qpost */ const Word16 Qpost ) { test(); @@ -576,23 +576,6 @@ void updt_dec_common_fx( test(); test(); test(); -#ifdef IVAS_CODE - /* Store long-term estimates of stab_fac and log energy diff to estimate env_stab in case of core switch ACELP/TCX->HQ */ - if ( st->element_mode != EVS_MONO ) - { - output_frame = NS2SA( st->output_Fs, FRAME_SIZE_NS ); - log_energy = log2f( ( sum2_f( synth, output_frame ) / output_frame ) + 1.0f ); - log_energy_diff = fabsf( st->log_energy_old - log_energy ); - st->log_energy_old = log_energy; - st->log_energy_diff_lt = ENV_SMOOTH_FAC * log_energy_diff + ( 1.0f - ENV_SMOOTH_FAC ) * st->log_energy_diff_lt; - if ( st->core == HQ_CORE ) - { - st->stab_fac = min( 1, ( STAB_FAC_EST1 + ( STAB_FAC_EST2 * st->hHQ_core->mem_env_delta ) + ( STAB_FAC_EST3 * st->log_energy_diff_lt ) ) ); - st->stab_fac = max( 0, st->stab_fac ); - } - st->stab_fac_smooth_lt = ENV_SMOOTH_FAC * st->stab_fac + ( 1.0f - ENV_SMOOTH_FAC ) * st->stab_fac_smooth_lt; - } -#endif IF( ( ( LE_32( st_fx->core_brate, SID_2k40 ) ) && EQ_16( st_fx->cng_type, FD_CNG ) ) || ( st_fx->tcxonly && EQ_16( st_fx->codec_mode, MODE2 ) ) ) { @@ -803,7 +786,7 @@ static void ivas_updt_bw_switching_fx( move16(); } } - st_fx->prev_bws_cnt = st_fx->bws_cnt; // TODO: Duplicate variables + st_fx->prev_bws_cnt = st_fx->bws_cnt; move16(); return; } @@ -964,23 +947,6 @@ void ivas_updt_dec_common_fx( test(); test(); test(); -#ifdef IVAS_CODE - /* Store long-term estimates of stab_fac and log energy diff to estimate env_stab in case of core switch ACELP/TCX->HQ */ - if ( st->element_mode != EVS_MONO ) - { - output_frame = NS2SA( st->output_Fs, FRAME_SIZE_NS ); - log_energy = log2f( ( sum2_f( synth, output_frame ) / output_frame ) + 1.0f ); - log_energy_diff = fabsf( st->log_energy_old - log_energy ); - st->log_energy_old = log_energy; - st->log_energy_diff_lt = ENV_SMOOTH_FAC * log_energy_diff + ( 1.0f - ENV_SMOOTH_FAC ) * st->log_energy_diff_lt; - if ( st->core == HQ_CORE ) - { - st->stab_fac = min( 1, ( STAB_FAC_EST1 + ( STAB_FAC_EST2 * st->hHQ_core->mem_env_delta ) + ( STAB_FAC_EST3 * st->log_energy_diff_lt ) ) ); - st->stab_fac = max( 0, st->stab_fac ); - } - st->stab_fac_smooth_lt = ENV_SMOOTH_FAC * st->stab_fac + ( 1.0f - ENV_SMOOTH_FAC ) * st->stab_fac_smooth_lt; - } -#else IF( st_fx->element_mode != EVS_MONO ) { Word16 q_div = sub( Q31, shl( Qpostd, 1 ) ); @@ -1003,7 +969,6 @@ void ivas_updt_dec_common_fx( st_fx->stab_fac_smooth_lt_fx = extract_h( L_add( L_mult( ENV_SMOOTH_FAC_FX, st_fx->stab_fac_fx ), L_mult( sub( MAX_16, ENV_SMOOTH_FAC_FX ), st_fx->stab_fac_smooth_lt_fx ) ) ); // Q15 } -#endif test(); test(); @@ -1242,6 +1207,8 @@ void update_decoder_LPD_cng( Copy( hTcxDec->old_synth + st->L_frame, hTcxDec->old_synth, sub( hTcxDec->old_synth_len, st->L_frame ) ); Copy( synth, hTcxDec->old_synth + sub( hTcxDec->old_synth_len, st->L_frame ), st->L_frame ); bufferCopyFx( synth + sub( st->L_frame, ( st->L_frame / 2 ) ), hTcxDec->old_syn_Overl, st->L_frame / 2, 0 /*Qf_syn*/, -1 /*Qf_old_xnq*/, 0, 0 /*Q_old_xnq*/ ); + st->hTcxDec->Q_old_syn_Overl = sub( st->Q_syn, 1 ); + move16(); hTcxDec->tcxltp_last_gain_unmodified = 0; move16(); diff --git a/lib_dec/vlpc_1st_dec_fx.c b/lib_dec/vlpc_1st_dec_fx.c index f34372453648c00213cbfcd3a350f3e200309eee..45fd00390aa85c2069a22724090211692c7871ad 100644 --- a/lib_dec/vlpc_1st_dec_fx.c +++ b/lib_dec/vlpc_1st_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_dec/vlpc_2st_dec_fx.c b/lib_dec/vlpc_2st_dec_fx.c index ee3d5ed7659fbf28caebb1ed25e577890e43cf7a..562cce4cf40daa5015e262ba3c37c6e36cbb6081 100644 --- a/lib_dec/vlpc_2st_dec_fx.c +++ b/lib_dec/vlpc_2st_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_dec/voiced_dec_fx.c b/lib_dec/voiced_dec_fx.c index c937a3b2b6c032bb139c98919a65ae6af4f29f9f..2108baad59d767c4900d18562756eae4a0247cab 100644 --- a/lib_dec/voiced_dec_fx.c +++ b/lib_dec/voiced_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_dec/waveadjust_fec_dec_fx.c b/lib_dec/waveadjust_fec_dec_fx.c index f993caa8d1650555dc32b1c8ff9c2dc53f5e3df0..f72dfde5cb9a448bfda91c4f4ab3a65da22e20fb 100644 --- a/lib_dec/waveadjust_fec_dec_fx.c +++ b/lib_dec/waveadjust_fec_dec_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -848,16 +848,8 @@ void concealment_init_ivas_fx( hPlcInfo->L_frameTCX = L_frameTCX; move16(); -#ifndef NONBE_FIX_1402_WAVEADJUST - hPlcInfo->Pitch = 0; - move16(); -#endif hPlcInfo->Pitch_fx = 0; move16(); -#ifndef NONBE_FIX_1402_WAVEADJUST - hPlcInfo->T_bfi = 0; - move16(); -#endif hPlcInfo->T_bfi_fx = 0; move16(); hPlcInfo->outx_new_n1_fx = 0; @@ -876,10 +868,6 @@ void concealment_init_ivas_fx( move16(); hPlcInfo->concealment_method = TCX_NONTONAL; move16(); -#ifndef NONBE_FIX_1402_WAVEADJUST - hPlcInfo->subframe = 0; - move16(); -#endif hPlcInfo->subframe_fx = 0; move16(); hPlcInfo->nbLostCmpt = (Word16) L_deposit_l( 0 ); @@ -928,7 +916,7 @@ void concealment_decode_fix( Word16 i; Word16 N = hPlcInfo->L_frameTCX; Word16 *seed = &( hPlcInfo->seed ); - Word16 sign; + Word16 sign = 0; move16(); IF( hPlcInfo->concealment_method == TCX_NONTONAL ) /* #define TCX_NONTONAL 0 */ @@ -942,7 +930,16 @@ void concealment_decode_fix( /* sign randomization */ FOR( i = 0; i < N; i++ ) { - sign = add( shl( shr( own_random_fix( seed ), 15 ), 1 ), 1 ); + Word16 rnd; + rnd = own_random_fix( seed ); + IF( GE_16( rnd, 0 ) ) + { + sign = 1; + } + ELSE IF( LT_16( rnd, 0 ) ) + { + sign = -1; + } if ( EQ_16( sign, -1 ) ) { invkoef[i] = L_negate( invkoef[i] ); @@ -1326,11 +1323,7 @@ static Word16 waveform_adj_fix( test(); test(); test(); -#ifdef NONBE_FIX_1402_WAVEADJUST IF( hPlcInfo->T_bfi_fx && ( LE_16( pitch, Framesizediv2 ) ) && ( GT_16( Framesize, 256 ) ) && ( EQ_16( core, 1 ) ) ) -#else - IF( hPlcInfo->T_bfi && ( LE_16( pitch, Framesizediv2 ) ) && ( GT_16( Framesize, 256 ) ) && ( EQ_16( core, 1 ) ) ) -#endif { Word16 i1 = 0, i2 = 0; Word16 pos1, pos2, pos3; diff --git a/lib_enc/ACcontextMapping_enc_fx.c b/lib_enc/ACcontextMapping_enc_fx.c index c52fddf97ee55b28084b7e44ba010a1edf76d3d4..91edc47a5bf9fadfcd14628755e9408acf72c9b9 100644 --- a/lib_enc/ACcontextMapping_enc_fx.c +++ b/lib_enc/ACcontextMapping_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -163,8 +163,7 @@ void ACcontextMapping_encode2_no_mem_s17_LC_fx( idx = s_min( idx1, idx2 ); /* Q0 */ /* Get context */ - ctx = &c[s_or( p1, p2 )]; /* Q0 */ - /* _DIFF_FLOAT_FIX_ float is using t as UWord16 */ + ctx = &c[s_or( p1, p2 )]; /* Q0 */ t = add( *ctx, rateFlag ); /* Q0 */ if ( GT_16( idx, nt_half ) ) { @@ -343,13 +342,13 @@ void ACcontextMapping_encode2_no_mem_s17_LC_fx( /* Push number of encoded tuples */ value = sub( shr( lastnz, 1 ), 1 ); /* Q0 */ - push_next_indice_fx( hBstr, value, nbbits_ntuples ); + push_next_indice( hBstr, value, nbbits_ntuples ); /* Push arithmetic coded bits */ - push_next_bits_fx( hBstr, &ptr[nbbits_ntuples], sub( bp, nbbits_ntuples ) ); + push_next_bits( hBstr, (UWord16 *) &ptr[nbbits_ntuples], sub( bp, nbbits_ntuples ) ); /* Push sign bits */ - push_next_bits_fx( hBstr, signs, nbbits_signs ); + push_next_bits( hBstr, (UWord16 *) signs, nbbits_signs ); bp = add( bp, nbbits_signs ); /* Q0 */ /*write residual Quantization bits*/ @@ -372,7 +371,7 @@ void ACcontextMapping_encode2_no_mem_s17_LC_fx( assert( bp + k <= nbbits ); /* Push the rest of the buffer */ - push_next_bits_fx( hBstr, &ptr[bp], sub( nbbits, bp ) ); + push_next_bits( hBstr, (UWord16 *) &ptr[bp], sub( nbbits, bp ) ); return /*(bp+nbbits_lsbs)*/; /*return only for debug plot*/ } @@ -1249,6 +1248,9 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( k = 1; move16(); + Word16 round_bit_estimate_fx; + Word32 target_Q15 = L_shl( target, Q15 ); // Q15 + WHILE( LT_16( k, nt / 2 ) ) { bit_estimate_fx = W_add( bit_estimate_fx, MAKE_NUMBER_QX( 1, Q23 ) ); @@ -1334,7 +1336,7 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( ctx = &c[L_or( p1, p2 )]; t = (UWord16) L_add( *ctx, rateFlag ); - IF( LT_16( nt_half, idx ) ) + if ( LT_16( nt_half, idx ) ) { t = add( t, ( 1 << NBITS_CONTEXT ) ); } @@ -1351,7 +1353,7 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( /* check while condition */ /* MSBs coding */ - WHILE( GE_16( s_max( a1, b1 ), A_THRES ) ) + FOR( ; s_max( a1, b1 ) >= A_THRES; ) { pki = lookup[lev1]; /* ESC symbol */ @@ -1361,17 +1363,13 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( b1 = shr( b1, 1 ); lev1 = s_min( add( lev1, ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); - - /* check while condition */ } - pki = lookup[lev1]; symbol = add( a1, i_mult( A_THRES, b1 ) ); /* Q0 */ bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][symbol] ); - /* Should we truncate? */ - IF( GT_32( W_extract_l( W_shr( bit_estimate_fx, Q8 ) ), L_shl( target, Q15 ) ) ) + IF( GT_32( W_shl_sat_l( bit_estimate_fx, -Q8 ), target_Q15 ) ) // Q15 { stop2 = 1; move16(); @@ -1393,14 +1391,11 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( { lev1 = shr( lev1, NBITS_CONTEXT + NBITS_RATEQ ); + t = add( 13, lev1 ); IF( lev1 <= 0 ) { t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) ); } - ELSE - { - t = add( 13, lev1 ); - } *ctx = L_add( imult3216( L_and( *ctx, 0xf ), 16 ), t ); move32(); @@ -1424,16 +1419,14 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( } } - } /*end of the 2-tuples loop*/ - - total_output_bits = round_fx( W_extract_l( W_shr( bit_estimate_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */ - + } /*end of the 2-tuples loop*/ + total_output_bits = round_fx( W_shl_sat_l( bit_estimate_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */ IF( *stop ) { - total_output_bits = round_fx( W_extract_l( W_shr( nbits2_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */ + total_output_bits = round_fx( W_shl_sat_l( nbits2_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */ } - IF( stop2 ) + if ( stop2 ) { stop2 = total_output_bits; /* Q0 */ move16(); @@ -1455,8 +1448,7 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( hm_cfg->numPeakIndices = numPeakIndicesOrig; /* Q0 */ move16(); - - return round_fx( L_add( W_extract_l( W_shr( nbits2_fx, Q7 ) ), ONE_IN_Q14 ) ); /* Q0 */ + return round_fx( L_add( W_shl_sat_l( nbits2_fx, -Q7 ), ONE_IN_Q14 ) ); /* Q0 */ } ELSE /* if (!hm_cfg) */ { @@ -1530,10 +1522,9 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( /* check while condition */ /* MSBs coding */ - WHILE( GE_16( s_max( a1, b1 ), A_THRES ) ) + FOR( ; s_max( a1, b1 ) >= A_THRES; ) { pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */ - move16(); bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC] ); bit_estimate_fx = W_add( bit_estimate_fx, MAKE_NUMBER_QX( 2, Q23 ) ); @@ -1543,18 +1534,14 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( lev1 = add( lev1, 1 ); esc_nb = s_min( lev1, 3 ); - - /* check while condition */ } - pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */ - move16(); symbol = add( a1, i_mult( A_THRES, b1 ) ); /* Q0 */ bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][symbol] ); /* Should we truncate? */ - IF( GT_32( W_extract_l( W_shr( bit_estimate_fx, Q8 ) ), L_shl( target, Q15 ) ) ) + IF( GT_32( W_shl_sat_l( bit_estimate_fx, -Q8 ), target_Q15 ) ) // Q15 { overflow_flag = 1; move16(); @@ -1571,44 +1558,42 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( } /* Update context for next 2-tuple */ - IF( LT_16( esc_nb, 2 ) ) - { - cp = add( 1, i_mult( add( a1, b1 ), add( esc_nb, 1 ) ) ); /* Q0 */ - } - ELSE + cp = add( 1, i_mult( add( a1, b1 ), add( esc_nb, 1 ) ) ); /* Q0 */ + if ( GE_16( esc_nb, 2 ) ) { cp = add( 12, esc_nb ); /* Q0 */ } /*shift old bits and replace last 4 bits*/ s = (UWord16) L_add( L_shl( s, 4 ), cp ); t = s_and( s, 0xFF ); - } /*end of the 2-tuples loop*/ - tot_bits2 = round_fx( W_extract_l( W_shr( nbits2_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */ - IF( LT_16( lastnz2, lastnz ) ) /* Overflow occured because unable to code all tuples */ + tot_bits2 = round_fx( W_shl_sat_l( nbits2_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */ + round_bit_estimate_fx = round_fx( W_shl_sat_l( bit_estimate_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */ + if ( LT_16( lastnz2, lastnz ) ) /* Overflow occured because unable to code all tuples */ { overflow_flag = 1; move16(); } - IF( EQ_16( mode, -1 ) ) + if ( EQ_16( mode, -1 ) ) { - tot_bits2 = round_fx( W_extract_l( W_shr( bit_estimate_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */ + tot_bits2 = round_bit_estimate_fx; + move16(); } - IF( overflow_flag == 0 ) /* No overflow */ + if ( overflow_flag == 0 ) /* No overflow */ { *stop = 0; move16(); } - ELSE /* Overflow */ - { - IF( *stop ){ - *stop = tot_bits2; /* Q0 */ + IF( overflow_flag != 0 ) /* Overflow */ + { + IF( *stop ){ + *stop = tot_bits2; /* Q0 */ move16(); } ELSE { - *stop = round_fx( W_extract_l( W_shr( bit_estimate_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */ + *stop = round_bit_estimate_fx; move16(); } } @@ -1743,13 +1728,12 @@ Word16 RCcontextMapping_encode2_estimate_bandWise_fx( /* Get context */ t = add( hContextMem->ctx, hContextMem->rateFlag ); /* Q0 */ - IF( GE_16( hContextMem->nt_half, idx ) ) + tmp = ( 1 << NBITS_CONTEXT ); + move16(); + if ( GE_16( hContextMem->nt_half, idx ) ) { tmp = 0; - } - ELSE - { - tmp = ( 1 << NBITS_CONTEXT ); + move16(); } t = add( t, tmp ); /* Q0 */ @@ -1771,15 +1755,14 @@ Word16 RCcontextMapping_encode2_estimate_bandWise_fx( /* check while condition */ /* MSBs coding */ - WHILE( GE_16( s_max( a1, b1 ), A_THRES ) ) + FOR( ; s_max( a1, b1 ) >= A_THRES; ) { pki = lookup[lev1]; /* Q0 */ - move16(); hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC] ); hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, MAKE_NUMBER_QX( 2, Q23 ) ); - move32(); - move32(); + move64(); + move64(); // hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC]; @@ -1789,34 +1772,30 @@ Word16 RCcontextMapping_encode2_estimate_bandWise_fx( b1 = shr( b1, 1 ); lev1 = s_min( add( lev1, ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); /* Q0 */ - /* check while condition */ + /* check while condition */ } pki = lookup[lev1]; /* Q0 */ - move16(); + symbol = add( a1, i_mult( A_THRES, b1 ) ); /* MSB symbol Q0*/ hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][symbol] ); - move32(); + move64(); // hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][symbol]; /* Update context */ lev1 = shr( lev1, NBITS_CONTEXT + NBITS_RATEQ ); - IF( lev1 <= 0 ) - { - t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) ); /* Q0 */ - } - ELSE + t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) ); /* Q0 */ + if ( lev1 > 0 ) { t = add( 13, lev1 ); /* Q0 */ } - hContextMem->ctx = add( i_mult( s_and( hContextMem->ctx, 0xf ), 16 ), t ); /* Q0 */ move16(); - } /*end of the 2-tuples loop*/ - total_output_bits = round_fx( W_extract_l( W_shr( hContextMem->bit_estimate_fx, Q7 ) ) ); /* Q0 */ + } /*end of the 2-tuples loop*/ + total_output_bits = round_fx( W_shl_sat_l( hContextMem->bit_estimate_fx, -Q7 ) ); /* Q0 */ // total_output_bits = (Word16) ( hContextMem->bit_estimate + 0.5f ); @@ -1826,519 +1805,3 @@ Word16 RCcontextMapping_encode2_estimate_bandWise_fx( return bandBits; } - - -#ifdef IVAS_CODE_RANGE_CODER - -/*-------------------------------------------------------------------* - * RCcontextMapping_encode2_estimate_no_mem_s17_LCS() - * - * Range coder bit-estimation - *-------------------------------------------------------------------*/ - -int16_t RCcontextMapping_encode2_estimate_no_mem_s17_LCS( - int16_t *x, /* Spectral coefficients */ - const int16_t nt, /* L - size of spectrum (no. of spectral coefficients) */ - int16_t *lastnz_out, - int16_t *nEncoded, /* No. of spectral coefficients that can be coded without an overflow occuring */ - const int16_t target, /* Target bits */ - int16_t *stop, - int16_t mode, - CONTEXT_HM_CONFIG *hm_cfg /* context-based harmonic model configuration */ -) -{ - /* Common variables */ - int16_t a1, b1; - int16_t k, pki, lev1; - uint16_t t; - int16_t lastnz, lastnz2; - int16_t rateFlag; - float bit_estimate; - int16_t symbol; - const uint8_t *lookup; - float nbits2; - - /* Initialization */ - bit_estimate = 2.0f; - nbits2 = 0.f; - - /* bits to encode lastnz */ - k = 1; - - while ( k < nt / 2 ) - { - bit_estimate++; - k = k << 1; - /* check while condition */ - } - - nbits2 = bit_estimate; - - if ( hm_cfg ) - { - int16_t a1_i, b1_i; - int16_t stop2; - int16_t total_output_bits; - int16_t nt_half; - int32_t c[2], *ctx; - int32_t p1, p2; - int16_t ii[2]; - int16_t idx1, idx2, idx; - int16_t numPeakIndicesOrig = 0, numHoleIndices = 0; /* only to avoid compiler warning */ - - /* Rate flag */ - if ( target > 400 ) - { - rateFlag = 2 << NBITS_CONTEXT; /* Select context-A for higher bitrates */ - } - else - { - rateFlag = 0; /* Select context-B for lower bitrates */ - } - - nt_half = nt >> 1; - stop2 = 0; - c[0] = c[1] = 0; - - /* Find last non-zero tuple in the mapped domain signal */ - lastnz = find_last_nz_pair( x, nt, hm_cfg ); - - lastnz2 = 2; - - /* mapped domain */ - numPeakIndicesOrig = hm_cfg->numPeakIndices; - hm_cfg->numPeakIndices = min( hm_cfg->numPeakIndices, lastnz ); - numHoleIndices = lastnz - hm_cfg->numPeakIndices; - - /* Mark hole indices beyond lastnz as pruned */ - for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) - { - hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] + nt; - } - - ii[0] = numPeakIndicesOrig; - ii[1] = 0; - - p1 = p2 = 0; /* to avoid compilation warnings */ - - /* Main Loop through the 2-tuples */ - for ( k = 0; k < lastnz; k += 2 ) - { - a1_i = get_next_coeff_mapped( ii, &p1, &idx1, hm_cfg ); - b1_i = get_next_coeff_mapped( ii, &p2, &idx2, hm_cfg ); - - idx = min( idx1, idx2 ); - - /* Get context */ - ctx = &c[p1 | p2]; - - t = (uint16_t) ( *ctx + rateFlag ); - t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT ); - - /* Init current 2-tuple encoding */ - a1 = (int16_t) abs( x[a1_i] ); - b1 = (int16_t) abs( x[b1_i] ); - lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); - - /* Signs Bits */ - bit_estimate += min( a1, 1 ); - bit_estimate += min( b1, 1 ); - - /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */ - lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); - - /* check while condition */ - /* MSBs coding */ - while ( max( a1, b1 ) >= A_THRES ) - { - pki = lookup[lev1]; /* ESC symbol */ - - bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC]; - bit_estimate += 2; /* Add 2 LSB bits corresponding to the bit-plane */ - - ( a1 ) >>= 1; - ( b1 ) >>= 1; - - lev1 = min( lev1 + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); - - /* check while condition */ - } - - pki = lookup[lev1]; - - symbol = a1 + A_THRES * b1; - bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][symbol]; - - /* Should we truncate? */ - if ( bit_estimate > target ) - { - stop2 = 1; - - if ( *stop ) - { - break; - } - } - else - { - lastnz2 = b1_i + 1; - nbits2 = bit_estimate; - } - - /* Update context for next 2-tuple */ - if ( p1 == p2 ) /* peak-peak or hole-hole context */ - { - lev1 >>= NBITS_CONTEXT + NBITS_RATEQ; - - if ( lev1 <= 0 ) - { - t = 1 + ( a1 + b1 ) * ( lev1 + 2 ); - } - else - { - t = 13 + lev1; - } - - *ctx = ( *ctx & 0xf ) * 16 + t; - } - else - { - /* mixed context */ - - if ( idx1 & 1 ) - { - /* update first context */ - c[p1] = update_mixed_context( c[p1], (int16_t) abs( x[a1_i] ) ); - } - - if ( idx2 & 1 ) - { - /* update second context */ - c[p2] = update_mixed_context( c[p2], (int16_t) abs( x[b1_i] ) ); - } - } - - } /*end of the 2-tuples loop*/ - - total_output_bits = (int16_t) ( bit_estimate + 0.5f ); - if ( *stop ) - { - total_output_bits = (int16_t) ( nbits2 + 0.5f ); - } - - if ( stop2 ) - { - stop2 = total_output_bits; - } - *nEncoded = lastnz2; - *stop = stop2; /* If zero, it means no overflow occured during bit-estimation */ - *lastnz_out = lastnz; - - /* Restore hole indices beyond lastnz */ - for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) - { - hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] - nt; - } - hm_cfg->numPeakIndices = numPeakIndicesOrig; - - return (int16_t) ( nbits2 + 0.5f ); - } - else /* if (!hm_cfg) */ - { - int16_t esc_nb, cp, rateQ; - uint16_t s; - int16_t tot_bits2; - int16_t overflow_flag = 0; - - /* Rate flag */ - if ( target > 400 ) - { - rateFlag = 2; - } - else - { - rateFlag = 0; /* Select context-B for lower bitrates */ - } - - t = 0; - s = 0; - cp = 0; - lastnz = 1; - lastnz2 = 0; - tot_bits2 = 0; - - /* Find last non-zero tuple in the mapped domain signal */ - for ( lastnz = ( nt - 2 ); lastnz >= 0; lastnz -= 2 ) - { - if ( ( x[lastnz] != 0 ) || ( x[lastnz + 1] != 0 ) ) - { - break; - } - } - lastnz += 2; - if ( lastnz < 2 ) - { - lastnz = 2; /* At least one tuple is coded */ - } - - lastnz2 = 2; - - /* Main Loop through the 2-tuples */ - for ( k = 0; k < lastnz; k += 2 ) - { - /* Init current 2-tuple encoding */ - a1 = (int16_t) abs( x[k] ); - b1 = (int16_t) abs( x[k + 1] ); - lev1 = 0; - esc_nb = 0; - rateQ = rateFlag + ( k > ( nt >> 1 ) ); - - /* Signs Bits */ - bit_estimate += min( a1, 1 ); - bit_estimate += min( b1, 1 ); - - /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */ - lookup = &ari_lookup_s17_LC[t + ( rateQ << NBITS_CONTEXT )]; - - /* check while condition */ - /* MSBs coding */ - while ( max( a1, b1 ) >= A_THRES ) - { - pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; - - bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC]; - bit_estimate += 2; /* Add 2 LSB bits corresponding to the bit-plane */ - - ( a1 ) >>= 1; - ( b1 ) >>= 1; - - lev1++; - esc_nb = min( lev1, 3 ); - - /* check while condition */ - } - - pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; - - symbol = a1 + A_THRES * b1; - bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][symbol]; - - /* Should we truncate? */ - if ( bit_estimate > target ) /* Overflow occured */ - { - overflow_flag = 1; - } - else - { - if ( abs( x[k] ) || abs( x[k + 1] ) ) /* No overflow & non-zero tuple */ - { - nbits2 = bit_estimate; - lastnz2 = k + 2; - } - } - - /* Update context for next 2-tuple */ - if ( esc_nb < 2 ) - { - cp = 1 + ( a1 + b1 ) * ( esc_nb + 1 ); - } - else - { - cp = 12 + esc_nb; - } - /*shift old bits and replace last 4 bits*/ - s = ( s << 4 ) + cp; - t = s & 0xFF; - - } /*end of the 2-tuples loop*/ - - tot_bits2 = (int16_t) ( nbits2 + 0.5f ); - if ( lastnz2 < lastnz ) /* Overflow occured because unable to code all tuples */ - { - overflow_flag = 1; - } - if ( mode == -1 ) - { - tot_bits2 = (int16_t) ( bit_estimate + 0.5f ); - } - if ( overflow_flag == 0 ) /* No overflow */ - { - *stop = 0; - } - else /* Overflow */ - { - if ( *stop ) - { - *stop = tot_bits2; - } - else - { - *stop = (int16_t) ( bit_estimate + 0.5f ); - } - } - - *lastnz_out = lastnz; - *nEncoded = lastnz2; - /* Safety mechanism to avoid overflow */ - if ( lastnz2 == 2 && overflow_flag == 1 ) - { - for ( k = 0; k < lastnz2; k++ ) - { - x[k] = 0; - } - } - - return tot_bits2; - } -} - -/*-------------------------------------------------------------------* - * RCcontextMapping_encode2_estimate_bandWise_start() - * - * Range coder - start bandwise bit-estimation - *-------------------------------------------------------------------*/ - -int16_t RCcontextMapping_encode2_estimate_bandWise_start( - int16_t *x, - const int16_t nt, - const int16_t target, - HANDLE_RC_CONTEXT_MEM hContextMem ) -{ - int16_t i, k; - - /* Rate flag */ - if ( target > 400 ) - { - hContextMem->rateFlag = 2 << NBITS_CONTEXT; - } - else - { - hContextMem->rateFlag = 0; - } - - hContextMem->bit_estimate = 2.0f; - - /* Init */ - hContextMem->nt_half = nt >> 1; - - /* bits to encode lastnz */ - k = 1; - - while ( k < hContextMem->nt_half ) - { - hContextMem->bit_estimate++; - - k = k << 1; - /* check while condition */ - } - - /* bits to encode lastnz */ - hContextMem->nbits_old = (int16_t) hContextMem->bit_estimate; - - hContextMem->ctx = 0; - hContextMem->lastnz = 2; - - /* Find last non-zero tuple */ - - for ( i = nt; i >= 4; i -= 2 ) - { - - if ( x[i - 2] != 0 || x[i - 1] != 0 ) - { - hContextMem->lastnz = i; - break; - } - } - - return (int16_t) hContextMem->bit_estimate; -} - -/*-------------------------------------------------------------------* - * RCcontextMapping_encode2_estimate_bandWise() - * - * Range coder - bandwise bit-estimation - *-------------------------------------------------------------------*/ - -int16_t RCcontextMapping_encode2_estimate_bandWise( - int16_t *x, - const int16_t start_line, - const int16_t end_line, - HANDLE_RC_CONTEXT_MEM hContextMem ) -{ - int16_t a1, b1, a1_i, b1_i; - int16_t k, pki, lev1; - uint16_t t; - int16_t bandBits = 0; - int16_t total_output_bits; /* No. of bits after finalization */ - int16_t symbol; - const uint8_t *lookup; - int16_t idx; - - /* Main Loop through the 2-tuples */ - /*hContextMem->nt_half = end_line >> 1;*/ - for ( k = start_line; k < min( hContextMem->lastnz, end_line ); k += 2 ) - { - a1_i = k; - b1_i = k + 1; - - idx = k; - - /* Get context */ - t = hContextMem->ctx + hContextMem->rateFlag; - t += ( hContextMem->nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT ); - - /* Init current 2-tuple encoding */ - a1 = (int16_t) abs( x[a1_i] ); - b1 = (int16_t) abs( x[b1_i] ); - lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); - - /* Signs Bits */ - hContextMem->bit_estimate += min( a1, 1 ); - hContextMem->bit_estimate += min( b1, 1 ); - - /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */ - lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); - - /* check while condition */ - /* MSBs coding */ - while ( max( a1, b1 ) >= A_THRES ) - { - pki = lookup[lev1]; - hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC]; - hContextMem->bit_estimate += 2; /* Add the 2 LSB bits that were shifted out */ - - ( a1 ) >>= 1; - ( b1 ) >>= 1; - - lev1 = min( lev1 + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); - /* check while condition */ - } - - pki = lookup[lev1]; - symbol = a1 + A_THRES * b1; /* MSB symbol */ - hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][symbol]; - - /* Update context */ - lev1 >>= NBITS_CONTEXT + NBITS_RATEQ; - - if ( lev1 <= 0 ) - { - t = 1 + ( a1 + b1 ) * ( lev1 + 2 ); - } - else - { - t = 13 + lev1; - } - - hContextMem->ctx = ( hContextMem->ctx & 0xf ) * 16 + t; - - } /*end of the 2-tuples loop*/ - total_output_bits = (int16_t) ( hContextMem->bit_estimate + 0.5f ); - - bandBits = total_output_bits - hContextMem->nbits_old; - hContextMem->nbits_old = total_output_bits; - - return bandBits; -} - -#endif diff --git a/lib_enc/FEC_enc_fx.c b/lib_enc/FEC_enc_fx.c index 87243e8d2fa5268c37ab5a6cb7513969450575d9..d6db81232ee9376c593bcaf04828c7e3bc90d869 100644 --- a/lib_enc/FEC_enc_fx.c +++ b/lib_enc/FEC_enc_fx.c @@ -1,23 +1,22 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ -#include "ivas_prot_fx.h" /* Function prototypes */ +#include "ivas_prot_fx.h" /* Function prototypes */ /*============================================================================*/ -/* FUNCTION : void FEC_encode_fx() */ +/* FUNCTION : void FEC_encode_fx() */ /*----------------------------------------------------------------------------*/ -/* PURPOSE : Encoder supplementary information for FEC */ +/* PURPOSE : Encoder supplementary information for FEC */ /*----------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ +/* INPUT ARGUMENTS : */ /* Word16 *synth i : pointer to synthesized speech for E computation */ /* Word16 coder_type i : type of coder */ /* Word16 clas i : signal clas for current frame */ @@ -26,30 +25,31 @@ /* Word16 L_frame i : Frame length */ /* Word32 total_brate i : total codec bitrate */ /*----------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /*----------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /* Word16 *last_pulse_pos i/o: Position of the last pulse */ -/* Encoder_State *st_fx i/o: state structure */ +/* Encoder_State *st_fx i/o: state structure */ /*----------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*----------------------------------------------------------------------------*/ -/* */ +/* */ /*============================================================================*/ + void FEC_encode_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const ACELP_config acelp_cfg, /* i/o: configuration of the ACELP */ - const Word16 *synth, /* i : pointer to synthesized speech for E computation Q_synth*/ - const Word16 coder_type, /* i : type of coder Q0*/ - Word16 clas, /* i : signal clas for current frame Q0*/ - const Word16 *fpit, /* i : close loop fractional pitch buffer Q6*/ - const Word16 *res, /* i : LP residual signal frame Qx*/ - Word16 *last_pulse_pos, /* i/o: Position of the last pulse Q0*/ - const Word16 L_frame, /* i : Frame length Q0*/ - const Word32 total_brate, /* i : total codec bitrate Q0*/ - const Word16 Q_new, /* i : input scaling */ - const Word16 shift /* i : scaling to get 12bits */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const ACELP_config acelp_cfg, /* i/o: configuration of the ACELP */ + const Word16 *synth, /* i : pointer to synthesized speech for E computation Q_synth*/ + const Word16 coder_type, /* i : type of coder Q0*/ + Word16 clas, /* i : signal clas for current frame Q0*/ + const Word16 *fpit, /* i : close loop fractional pitch buffer Q6*/ + const Word16 *res, /* i : LP residual signal frame Qx*/ + Word16 *last_pulse_pos, /* i/o: Position of the last pulse Q0*/ + const Word16 L_frame, /* i : Frame length Q0*/ + const Word32 total_brate, /* i : total codec bitrate Q0*/ + const Word16 Q_new, /* i : input scaling */ + const Word16 shift /* i : scaling to get 12bits */ ) { Word16 tmpS, index; @@ -94,7 +94,7 @@ void FEC_encode_fx( index = 3; move16(); } - push_indice_fx( hBstr, IND_FEC_CLAS, index, FEC_BITS_CLS ); + push_indice( hBstr, IND_FEC_CLAS, index, FEC_BITS_CLS ); } /*-----------------------------------------------------------------* @@ -117,7 +117,7 @@ void FEC_encode_fx( tmpS = s_min( tmpS, 31 ); tmpS = s_max( tmpS, 0 ); - push_indice_fx( hBstr, IND_FEC_ENR, tmpS, FEC_BITS_ENR ); + push_indice( hBstr, IND_FEC_ENR, tmpS, FEC_BITS_ENR ); } /*-----------------------------------------------------------------* * Encode last glottal pulse position (8 bits) @@ -154,10 +154,10 @@ void FEC_encode_fx( if ( sign == 1 ) { - maxi = add( maxi, 128 ); /* use 8 bits (MSB represent the sign of the pulse) Q0*/ + maxi = add( maxi, 128 ); /* use 8 bits (MSB represent the sign of the pulse) Q0*/ } - push_indice_fx( hBstr, IND_FEC_POS, maxi, FEC_BITS_POS ); + push_indice( hBstr, IND_FEC_POS, maxi, FEC_BITS_POS ); } maxi = 0; move16(); @@ -197,7 +197,7 @@ void FEC_encode_fx( *-------------------------------------------------------------------*/ void FEC_lsf_estim_enc_fx( - Encoder_State *st_fx, /* i : Encoder static memory */ + Encoder_State *st_fx, /* i : Encoder static memory */ Word16 *lsf /* o : estimated LSF vector Qlog2(2.56)*/ ) { @@ -300,16 +300,16 @@ void FEC_lsf_estim_enc_fx( *-------------------------------------------------------------------*/ void FEC_encode_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const ACELP_config acelp_cfg, /* i/o: configuration of the ACELP */ - const Word16 *synth, /* i : pointer to synthesized speech for E computation Q_Synth*/ - const Word16 coder_type, /* i : type of coder Q0*/ - Word16 clas, /* i : signal clas for current frame Q0*/ - const Word16 *fpit, /* i : close loop fractional pitch buffer Q6*/ - const Word16 *res, /* i : LP residual signal frame Qx*/ - Word16 *last_pulse_pos, /* i/o: Position of the last pulse Q0*/ - const Word16 L_frame, /* i : Frame length Q0*/ - const Word32 total_brate, /* i : total codec bitrate Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const ACELP_config acelp_cfg, /* i/o: configuration of the ACELP */ + const Word16 *synth, /* i : pointer to synthesized speech for E computation Q_Synth*/ + const Word16 coder_type, /* i : type of coder Q0*/ + Word16 clas, /* i : signal clas for current frame Q0*/ + const Word16 *fpit, /* i : close loop fractional pitch buffer Q6*/ + const Word16 *res, /* i : LP residual signal frame Qx*/ + Word16 *last_pulse_pos, /* i/o: Position of the last pulse Q0*/ + const Word16 L_frame, /* i : Frame length Q0*/ + const Word32 total_brate, /* i : total codec bitrate Q0*/ const Word16 Q_synth /* i : input scaling */ ) { @@ -431,7 +431,7 @@ void FEC_encode_ivas_fx( if ( EQ_16( sign, 1 ) ) { - maxi = add( maxi, 128 ); /* use 8 bits (MSB represent the sign of the pulse) Q0*/ + maxi = add( maxi, 128 ); /* use 8 bits (MSB represent the sign of the pulse) Q0*/ } push_indice( hBstr, IND_FEC_POS, maxi, FEC_BITS_POS ); diff --git a/lib_enc/SNR_calc_fx.c b/lib_enc/SNR_calc_fx.c index 09acfd5dca1bb7bde7ab0896faee5ba2148c79d1..ef54f1841f3fa8cfd42d8b3eb485820e396d66da 100644 --- a/lib_enc/SNR_calc_fx.c +++ b/lib_enc/SNR_calc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -19,15 +19,15 @@ *-------------------------------------------------------------------*/ void calc_lf_snr_fx( - Word32 *lf_snr_smooth, /* o : smoothed lf_snr Q25*/ - Word32 *lf_snr, /* o : long time frequency domain SNR calculated by l_speech_snr and l_silence_snr Q25*/ - const Word32 l_speech_snr, /* i : sum of active frames snr Q16*/ - const Word32 l_speech_snr_count, /* i : amount of the active frame Q0*/ - const Word32 l_silence_snr, /* i : sum of the nonactive frames snr Q16*/ - const Word32 l_silence_snr_count, /* i : amount of the nonactive frame Q0*/ + Word32 *lf_snr_smooth, /* o : smoothed lf_snr Q25*/ + Word32 *lf_snr, /* o : long time frequency domain SNR calculated by l_speech_snr and l_silence_snr Q25*/ + const Word32 l_speech_snr, /* i : sum of active frames snr Q16*/ + const Word32 l_speech_snr_count, /* i : amount of the active frame Q0*/ + const Word32 l_silence_snr, /* i : sum of the nonactive frames snr Q16*/ + const Word32 l_silence_snr_count, /* i : amount of the nonactive frame Q0*/ const Word16 fg_energy_count, /* i : amount of the foreground energy frame Q0*/ const Word16 bg_energy_count, /* i : amount of the background energy frame Q0*/ - const Word16 bw_index /* i : band width index Q0*/ + const Word16 bw_index /* i : band width index Q0*/ ) { @@ -72,14 +72,14 @@ void calc_lf_snr_fx( *-------------------------------------------------------------------*/ void calc_lt_snr_fx( VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ - Word32 *lt_snr_org_fp, /* o : original long time SNR Q25*/ - Word32 *lt_snr_fp, /* o : long time SNR calculated by fg_energy and bg_energy Q25*/ - Word32 fg_energy, /* i : foreground energy sum Qx*/ - Word16 fg_energy_count, /* i : amount of the foreground energy frame Q0*/ - Word32 bg_energy, /* i : background energy sum Qx*/ - Word16 bg_energy_count, /* i : amount of the background energy frame Q0*/ - Word16 bw_index, /* i : band width index Q0*/ - Word16 lt_noise_sp_center0 /* i : long time noise spectral center by 0 Q10*/ + Word32 *lt_snr_org_fp, /* o : original long time SNR Q25*/ + Word32 *lt_snr_fp, /* o : long time SNR calculated by fg_energy and bg_energy Q25*/ + Word32 fg_energy, /* i : foreground energy sum Qx*/ + Word16 fg_energy_count, /* i : amount of the foreground energy frame Q0*/ + Word32 bg_energy, /* i : background energy sum Qx*/ + Word16 bg_energy_count, /* i : amount of the background energy frame Q0*/ + Word16 bw_index, /* i : band width index Q0*/ + Word16 lt_noise_sp_center0 /* i : long time noise spectral center by 0 Q10*/ ) { Word16 tmp_lt_noise_sp_center; @@ -172,9 +172,9 @@ void calc_lt_snr_fx( * *-------------------------------------------------------------------*/ void calc_snr_flux_fx( - Word32 tsnr, /* i : time-domain SNR Q25*/ - Word32 *pre_snr, /* i/o: time-domain SNR storage Q25*/ - Word32 *snr_flux_fp /* o : average tsnr Q25*/ + Word32 tsnr, /* i : time-domain SNR Q25*/ + Word32 *pre_snr, /* i/o: time-domain SNR storage Q25*/ + Word32 *snr_flux_fp /* o : average tsnr Q25*/ ) { Word32 i; @@ -229,12 +229,12 @@ void calc_snr_flux_fx( * *-------------------------------------------------------------------*/ void snr_calc( - VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ - const Word16 sacle_sbpower, /* i : the Scaling of sbpower */ - Word32 *snr, /* o : frequency domain SNR Q25*/ - Word32 *tsnr, /* o : time domain SNR Q25*/ - const Word32 frame_energy, /* i : current frame energy sacle_sbpower*/ - const Word32 bwidth /* i : audio band width Q0*/ + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + const Word16 sacle_sbpower, /* i : the Scaling of sbpower */ + Word32 *snr, /* o : frequency domain SNR Q25*/ + Word32 *tsnr, /* o : time domain SNR Q25*/ + const Word32 frame_energy, /* i : current frame energy sacle_sbpower*/ + const Word32 bwidth /* i : audio band width Q0*/ ) { Word32 i; @@ -371,14 +371,14 @@ void snr_calc( } Word32 construct_snr_thresh_fx( - Word16 sp_center[], /* i : spectral center Q10*/ - Word32 snr_flux, /* i : snr flux Q25*/ - Word32 lt_snr, /* i : long time time domain snr Q25*/ - Word32 l_snr, /* i : long time frequency domain snr Q25*/ - Word32 continuous_speech_num, /* i : amount of continuous speech frames Q0*/ - Word16 continuous_noise_num, /* i : amount of continuous noise frames Q0*/ - Word32 fg_energy_est_start, /* i : whether if estimated energy Q0*/ - Word16 bw_index /* i : band width index Q0*/ + Word16 sp_center[], /* i : spectral center Q10*/ + Word32 snr_flux, /* i : snr flux Q25*/ + Word32 lt_snr, /* i : long time time domain snr Q25*/ + Word32 l_snr, /* i : long time frequency domain snr Q25*/ + Word32 continuous_speech_num, /* i : amount of continuous speech frames Q0*/ + Word16 continuous_noise_num, /* i : amount of continuous noise frames Q0*/ + Word32 fg_energy_est_start, /* i : whether if estimated energy Q0*/ + Word16 bw_index /* i : band width index Q0*/ ) { diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c index d2d5ac4e6583ab86396685bb38c2ae67610dc01e..ff4c684e838c33e383021cd56e61be3292302b23 100644 --- a/lib_enc/acelp_core_enc_fx.c +++ b/lib_enc/acelp_core_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -10,7 +10,6 @@ #include "stat_enc.h" #include "rom_com.h" #include "rom_enc.h" /* Encoder static table prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "ivas_cnst.h" #include "ivas_prot_fx.h" @@ -21,24 +20,23 @@ * ACELP core encoder *--------------------------------------------------------------------*/ ivas_error acelp_core_enc_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 inp_fx[], /* i : input signal of the current frame Q_new*/ - const Word32 ener_fx, /* i : residual energy from Levinson-Durbin Q6*/ - Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ - Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes Q12*/ - const Word16 epsP_h_fx[M + 1], /* i : LP prediction errors Qx*/ - const Word16 epsP_l_fx[M + 1], /* i : LP prediction errors Qx*/ - Word16 lsp_new_fx[M], /* i : LSPs at the end of the frame Q15*/ - Word16 lsp_mid_fx[M], /* i : LSPs in the middle of the frame Q15*/ - Word16 vad_hover_flag_fx, /* i : VAD hangover flag Q0*/ - const Word16 attack_flag, /* i : attack flag (GSC or TC) Q0*/ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 inp_fx[], /* i : input signal of the current frame Q_new*/ + const Word32 ener_fx, /* i : residual energy from Levinson-Durbin Q6*/ + Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ + Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes Q12*/ + const Word16 epsP_h_fx[M + 1], /* i : LP prediction errors Qx*/ + const Word16 epsP_l_fx[M + 1], /* i : LP prediction errors Qx*/ + Word16 lsp_new_fx[M], /* i : LSPs at the end of the frame Q15*/ + Word16 lsp_mid_fx[M], /* i : LSPs in the middle of the frame Q15*/ + Word16 vad_hover_flag_fx, /* i : VAD hangover flag Q0*/ + const Word16 attack_flag, /* i : attack flag (GSC or TC) Q0*/ Word32 bwe_exc_extended_fx[], /* i/o: bandwidth extended excitation st->prev_Q_bwe_exc*/ Word16 *voice_factors_fx, /* o : voicing factors Q15*/ Word16 old_syn_12k8_16k_fx[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE q_old_syn*/ Word16 pitch_buf_fx[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ Word16 *unbits_fx, /* o : number of unused bits Q0*/ STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - const float tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ const Word16 Q_new, const Word16 shift ) { @@ -107,8 +105,6 @@ ivas_error acelp_core_enc_fx( * Initialization *------------------------------------------------------------------*/ - (void) tdm_lsfQ_PCh; - Es_pred_fx = 0; move16(); @@ -394,14 +390,7 @@ ivas_error acelp_core_enc_fx( test(); IF( !nelp_mode && !ppp_mode ) { - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#ifdef NONBE_FIX_GSC_BSTR - st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, st_fx->inactive_coder_type_flag, -#else - st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, -#endif - tc_subfr_fx, 0, &nb_bits, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, - tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, st_fx->inactive_coder_type_flag, tc_subfr_fx, 0, &nb_bits, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); } /*-----------------------------------------------------------------* @@ -420,6 +409,7 @@ ivas_error acelp_core_enc_fx( /*-----------------------------------------------------------------* * Reset higher ACELP pre-quantizer in case of switching *-----------------------------------------------------------------*/ + IF( !st_fx->use_acelp_preq ) { st_fx->mem_deemp_preQ_fx = 0; @@ -452,6 +442,7 @@ ivas_error acelp_core_enc_fx( /*---------------------------------------------------------------* * Calculation of LP residual (filtering through A[z] filter) *---------------------------------------------------------------*/ + calc_residu_fx( st_fx, inp_fx, res_fx, Aq_fx ); calculate_hangover_attenuation_gain_fx( st_fx, &att, vad_hover_flag_fx ); v_multc_att( res_fx, att, res_fx, st_fx->L_frame ); @@ -464,29 +455,24 @@ ivas_error acelp_core_enc_fx( { tc_classif_enc_fx( Q_new, st_fx->L_frame, &tc_subfr_fx, &position, attack_flag, st_fx->pitch[0], res_fx ); - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -#ifdef NONBE_FIX_GSC_BSTR - -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, tc_subfr_fx, 1, NULL, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, -#else - -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, tc_subfr_fx, 1, NULL, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, -#endif - tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, tc_subfr_fx, 1, NULL, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); } /*---------------------------------------------------------------* * Calculation of prediction for scaled innovation energy * (for memory-less gain quantizer) *---------------------------------------------------------------*/ + IF( nb_bits > 0 ) { Es_pred_enc_fx( &Es_pred_fx, &indice, st_fx->L_frame, res_fx, st_fx->voicing_fx, nb_bits, 0, Q_new ); - push_indice_fx( st_fx->hBstr, IND_ES_PRED, indice, nb_bits ); + push_indice( st_fx->hBstr, IND_ES_PRED, indice, nb_bits ); } - /*------------------------------------------------------------* * Encode excitation according to coding type *------------------------------------------------------------*/ + test(); test(); IF( hSC_VBR->nelp_mode ) @@ -521,13 +507,7 @@ ivas_error acelp_core_enc_fx( lsp_mid_bck_fx, mCb1_fx, Bin_E_fx, Bin_E_old_fx, mem_syn_bck_fx, mem_w0_bck_fx, streaklimit_fx, pstreaklen_fx ); /* Configure ACELP bit allocation */ - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -#ifdef NONBE_FIX_GSC_BSTR - -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, st_fx->inactive_coder_type_flag, tc_subfr_fx, 0, &nb_bits, unbits_fx, 0, &uc_two_stage_flag, 0, 0, -#else - -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, tc_subfr_fx, 0, &nb_bits, unbits_fx, 0, &uc_two_stage_flag, 0, 0, -#endif - st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, st_fx->inactive_coder_type_flag, tc_subfr_fx, 0, &nb_bits, unbits_fx, 0, &uc_two_stage_flag, 0, 0, st_fx->idchan, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); /* redo LSF quantization */ lsf_enc_fx( st_fx, lsf_new_fx, lsp_new_fx, lsp_mid_fx, Aq_fx, st_fx->Nb_ACELP_frames, tdm_low_rate_mode, st_fx->GSC_IVAS_mode, Q_new ); @@ -631,7 +611,7 @@ ivas_error acelp_core_enc_fx( WHILE( nBits > 0 ) { i = s_min( nBits, 16 ); // Q0 - push_indice_fx( st_fx->hBstr, IND_UNUSED, 0, i ); + push_indice( st_fx->hBstr, IND_UNUSED, 0, i ); nBits = sub( nBits, i ); // Q0 } } @@ -720,23 +700,23 @@ ivas_error acelp_core_enc_fx( * ACELP core encoder *--------------------------------------------------------------------*/ ivas_error acelp_core_enc_ivas_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 inp[], /* i : input signal of the current frame Q_new*/ - Word16 A[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ - Word16 Aw[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes Q12*/ - const Word32 epsP[M + 1], /* i : LP prediction errors Qx*/ - Word16 lsp_new[M], /* i : LSPs at the end of the frame Q15*/ - Word16 lsp_mid[M], /* i : LSPs in the middle of the frame Q15*/ - const Word16 vad_hover_flag, /* i : VAD hangover flag Q0*/ - const Word16 attack_flag, /* i : attack flag (GSC or TC) Q0*/ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 inp[], /* i : input signal of the current frame Q_new*/ + Word16 A[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ + Word16 Aw[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes Q12*/ + const Word32 epsP[M + 1], /* i : LP prediction errors Qx*/ + Word16 lsp_new[M], /* i : LSPs at the end of the frame Q15*/ + Word16 lsp_mid[M], /* i : LSPs in the middle of the frame Q15*/ + const Word16 vad_hover_flag, /* i : VAD hangover flag Q0*/ + const Word16 attack_flag, /* i : attack flag (GSC or TC) Q0*/ Word32 bwe_exc_extended_fx[], /* i/o: bandwidth extended excitation st->prev_Q_bwe_exc*/ - Word16 *voice_factors_fx, /* o : voicing factors Q15*/ - Word16 old_syn_12k8_16k[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE q_old_syn_12k8_16*/ + Word16 *voice_factors_fx, /* o : voicing factors Q15*/ + Word16 old_syn_12k8_16k[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE q_old_syn_12k8_16*/ Word16 *q_old_syn_12k8_16, - Word16 pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ - Word16 *unbits, /* o : number of unused bits Q0*/ + Word16 pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ + Word16 *unbits, /* o : number of unused bits Q0*/ STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel X2.56*/ + Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel X2.56*/ Word16 Q_new ) { Word16 i, nBits; /* reserved bits */ @@ -772,21 +752,17 @@ ivas_error acelp_core_enc_ivas_fx( Word32 Bin_E_fx[L_FFT], Bin_E_old_fx[L_FFT / 2]; Word16 clip_var_fx, mem_w0_bck_fx, streaklimit_fx; -#ifdef MSAN_FIX set16_fx( old_bwe_exc_fx, 0, ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 ); set16_fx( old_exc_fx, 0, L_EXC ); set16_fx( Aq, 0, NB_SUBFR16k * ( M + 1 ) ); set16_fx( syn_fx, 0, L_FRAME16k ); -#endif Word16 tilt_code_bck_fx; Word32 gc_threshold_bck_fx; Word16 clip_var_bck_fx[6]; Word32 q_env_fx[NUM_ENV_CNG]; -#ifdef MSAN_FIX set32_fx( q_env_fx, 0, NUM_ENV_CNG ); set16_fx( exc2_fx, 0, L_FRAME16k ); -#endif Word16 exc3_fx[L_FRAME16k]; Word16 syn1_fx[L_FRAME16k]; Word16 *tdm_Pri_pitch_buf_fx; @@ -1189,11 +1165,7 @@ ivas_error acelp_core_enc_ivas_fx( test(); IF( !nelp_mode && !ppp_mode ) { -#ifdef NONBE_FIX_GSC_BSTR - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, st->inactive_coder_type_flag, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#else - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#endif + config_acelp1_fx( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, st->inactive_coder_type_flag, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); } /*-----------------------------------------------------------------* @@ -1241,21 +1213,14 @@ ivas_error acelp_core_enc_ivas_fx( ELSE { const Word16 *pt_interp_2_fx; + Word16 beta_index; + Word16 lsf_wgts_fx[M]; - IF( NE_16( st->active_cnt, 1 ) ) - { - Word16 beta_index; - Word16 lsf_wgts_fx[M]; - - /* intra_frame prediction for the LSFs */ - lsp2lsf_fx( lsp_new, lsf_new_fx, M, 12800 ); - - Unified_weighting_fx( &st->Bin_E_fx[L_FFT / 2], add( Q_new, ( QSCALE - 2 ) ), lsf_new_fx, lsf_wgts_fx, st->bwidth == NB, (Word16) EQ_16( st->coder_type, UNVOICED ), st->sr_core, M ); - - tdm_SCh_lsf_reuse_fx( ENC, st->element_brate, lsf_new_fx, lsp_new, tdm_lsfQ_PCh, lsf_wgts_fx, &beta_index ); - - push_indice( hBstr, IND_IC_LSF_PRED, beta_index, TDM_IC_LSF_PRED_BITS ); - } + /* intra_frame prediction for the LSFs */ + lsp2lsf_fx( lsp_new, lsf_new_fx, M, 12800 ); + Unified_weighting_fx( &st->Bin_E_fx[L_FFT / 2], add( Q_new, ( QSCALE - 2 ) ), lsf_new_fx, lsf_wgts_fx, st->bwidth == NB, (Word16) EQ_16( st->coder_type, UNVOICED ), st->sr_core, M ); + tdm_SCh_lsf_reuse_fx( ENC, st->element_brate, lsf_new_fx, lsp_new, tdm_lsfQ_PCh, lsf_wgts_fx, &beta_index ); + push_indice( hBstr, IND_IC_LSF_PRED, beta_index, TDM_IC_LSF_PRED_BITS ); pt_interp_2_fx = interpol_frac_12k8_fx; @@ -1319,7 +1284,7 @@ ivas_error acelp_core_enc_ivas_fx( IF( NE_16( att_fx, 32767 /* ONE_IN_Q15 */ ) ) { - v_multc_fixed_16_16( res_fx, att_fx, res_fx, st->L_frame ); + v_multc_fx_16_16( res_fx, att_fx, res_fx, st->L_frame ); } /*-----------------------------------------------------------------* @@ -1330,11 +1295,7 @@ ivas_error acelp_core_enc_ivas_fx( { tc_classif_enc_fx( Q_new, st->L_frame, &tc_subfr, &position, attack_flag, st->pitch[0], res_fx ); -#ifdef NONBE_FIX_GSC_BSTR - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#else - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#endif + config_acelp1_fx( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); } /*---------------------------------------------------------------* @@ -1393,11 +1354,7 @@ ivas_error acelp_core_enc_ivas_fx( lsf_syn_mem_restore_ivas_fx( st, tilt_code_bck_fx, gc_threshold_bck_fx, clip_var_bck_fx, next_force_sf_bck, lsp_new, lsp_mid, clip_var_fx, mem_AR_fx, mem_MA_fx, lsp_new_bck_fx, lsp_mid_bck_fx, Bin_E_fx, Bin_E_old_fx, mem_syn_bck_fx, mem_w0_bck_fx, streaklimit_fx, pstreaklen ); /* Configure ACELP bit allocation */ -#ifdef NONBE_FIX_GSC_BSTR - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, st->inactive_coder_type_flag, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#else - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#endif + config_acelp1_fx( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, st->inactive_coder_type_flag, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); /* redo LSF quantization */ lsf_enc_ivas_fx( st, lsf_new_fx, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, 0, NULL, Q_new ); @@ -1406,6 +1363,7 @@ ivas_error acelp_core_enc_ivas_fx( calc_residu_fx( st, inp, res_fx, Aq ); st->hTdCngEnc->burst_ho_cnt = 0; move16(); + /* VOICED frames in SC-VBR */ encod_gen_voic_ivas_fx( st, inp, Aw, Aq, Es_pred_fx, res_fx, syn_fx, exc_fx, exc2_fx, pitch_buf, voice_factors_fx, bwe_exc_fx, unbits, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf_fx, 0, Q_new ); } @@ -1458,12 +1416,8 @@ ivas_error acelp_core_enc_ivas_fx( test(); IF( st->element_mode > EVS_MONO && st->hTcxEnc != NULL ) { - Copy( syn1_fx + shr( st->L_frame, 1 ), st->hTcxEnc->Txnq, shr( st->L_frame, 1 ) ); // st->Q_syn -#ifdef MSAN_FIX + Copy( syn1_fx + shr( st->L_frame, 1 ), st->hTcxEnc->Txnq, shr( st->L_frame, 1 ) ); // st->Q_syn Scale_sig( st->hTcxEnc->Txnq + shr( st->L_frame, 1 ), sub( L_FRAME32k / 2 + 64, shr( st->L_frame, 1 ) ), sub( st->Q_syn, st->hTcxEnc->q_Txnq ) ); // st->Q_syn -#else - Scale_sig( st->hTcxEnc->Txnq + shr( st->L_frame, 1 ), sub( L_FRAME32k / 2 + 64, shr( st->L_frame, 2 ) ), sub( st->Q_syn, st->hTcxEnc->q_Txnq ) ); -#endif st->hTcxEnc->q_Txnq = st->Q_syn; move16(); } @@ -1479,8 +1433,9 @@ ivas_error acelp_core_enc_ivas_fx( { /* exc2 buffer is needed only for updating of Aq[] which is needed for core switching */ Copy( exc_fx, exc2_fx, st->L_frame ); // Q_new - - stat_noise_uv_enc_ivas_fx( st, epsP, lsp_new, lsp_mid, Aq, exc2_fx, uc_two_stage_flag, Q_new ); + Word16 q_exc2 = Q_new; + move16(); + stat_noise_uv_enc_ivas_fx( st, epsP, lsp_new, lsp_mid, Aq, exc2_fx, uc_two_stage_flag, &q_exc2 ); } /*-----------------------------------------------------------------* @@ -1488,11 +1443,7 @@ ivas_error acelp_core_enc_ivas_fx( *-----------------------------------------------------------------*/ Scale_sig( syn_fx, L_FRAME, sub( s_min( st->Q_syn, Q_new ), st->Q_syn ) ); // min( st->Q_syn, Q_new ) -#ifdef MSAN_FIX Scale_sig( res_fx, st->L_frame, sub( s_min( st->Q_syn, Q_new ), Q_new ) ); // min( st->Q_syn, Q_new ) -#else - Scale_sig( res_fx, L_FRAME16k, sub( s_min( st->Q_syn, Q_new ), Q_new ) ); -#endif FEC_encode_ivas_fx( hBstr, st->acelp_cfg, syn_fx, st->coder_type, st->clas, pitch_buf, res_fx, &st->Last_pulse_pos, st->L_frame, st->total_brate, s_min( st->Q_syn, Q_new ) ); IF( st->hBWE_TD != NULL ) { @@ -1557,13 +1508,9 @@ ivas_error acelp_core_enc_ivas_fx( IF( !st->Opt_SC_VBR && ( st->idchan == 0 || NE_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && st->tdm_LRTD_flag ) ) ) { /* Apply a non linearity to the SHB excitation */ -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( Q_new, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc -#else - Copy_Scale_sig_16_32_DEPREC( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( Q_new, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc -#endif + Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( Q_new, 1 ), sub( st->hBWE_TD->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, Q_new, st->coder_type, voice_factors_fx, st->L_frame ); - Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, negate( sub( shl( Q_new, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc + Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, negate( sub( shl( Q_new, 1 ), sub( st->hBWE_TD->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc } test(); diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index d88e1523ed825acceb35a351a58e66b63f4906ce..2f51be28e414ed30a524fe93305985f51a158c48 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -1,42 +1,26 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" #include "cnst.h" -#include "rom_com_fx.h" -//#include "prot_fx.h" #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ + + /*---------------------------------------------------------------------* * Local function prototypes *---------------------------------------------------------------------*/ -static void encod_gen_voic_core_switch_fx( Encoder_State *st_fx, - const Word16 L_frame_fx, - const Word16 inp_fx[], - const Word16 Aq_fx[], - const Word16 A_fx[], - const Word16 T_op[], - Word16 *exc_fx, - const Word32 core_bitrate_fx, - Word16 shift, - Word16 Q_new ); -static void encod_gen_voic_core_switch_ivas_fx( Encoder_State *st_fx, - const Word16 L_frame_fx, - const Word16 inp_fx[], - const Word16 Aq_fx[], - const Word16 A_fx[], - const Word16 T_op[], - Word16 *exc_fx, - const Word32 core_bitrate_fx, - Word16 shift, - Word16 Q_new ); +static void encod_gen_voic_core_switch_fx( Encoder_State *st_fx, const Word16 L_frame_fx, const Word16 inp_fx[], const Word16 Aq_fx[], const Word16 A_fx[], const Word16 T_op[], Word16 *exc_fx, const Word32 core_bitrate_fx, Word16 shift, Word16 Q_new ); + +static void encod_gen_voic_core_switch_ivas_fx( Encoder_State *st_fx, const Word16 L_frame_fx, const Word16 inp_fx[], const Word16 Aq_fx[], const Word16 A_fx[], const Word16 T_op[], Word16 *exc_fx, const Word32 core_bitrate_fx, Word16 shift, Word16 Q_new ); static void bwe_switch_enc_fx( Encoder_State *st_fx, const Word16 *new_speech ); + static void bwe_switch_enc_ivas_fx( Encoder_State *st_fx, const Word16 *new_speech ); static Word16 dotprod_satcont( const Word16 *x, const Word16 *y, Word16 qx, Word16 qy, Word16 *qo, Word16 len, Word16 delta ); @@ -62,7 +46,8 @@ void acelp_core_switch_enc_fx( Word16 Aq[2 * ( M + 1 )]; LPD_state_HANDLE hLPDmem; /* ACELP LPDmem memories */ BSTR_ENC_HANDLE hBstr = st_fx->hBstr; - + UWord16 value; + Word16 nb_bits; hLPDmem = st_fx->hLPDmem; /* initializations */ @@ -112,7 +97,6 @@ void acelp_core_switch_enc_fx( } } #ifdef FIX_I4_OL_PITCH - PMTE() IF( EQ_16( st_fx->last_codec_mode, MODE1 ) ) { /* in MODE1 T_op is at 12.8 kHz */ @@ -144,31 +128,27 @@ void acelp_core_switch_enc_fx( move16(); } #endif + /*----------------------------------------------------------------* * Excitation encoding *----------------------------------------------------------------*/ - config_acelp1( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, -#ifdef NONBE_FIX_GSC_BSTR - GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); -#else - GENERIC, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); -#endif + config_acelp1_fx( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, + GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); encod_gen_voic_core_switch_fx( st_fx, st_fx->last_L_frame, inp, Aq, A, T_op, exc, cbrate, shift, Q_new ); - /*----------------------------------------------------------------* - * bit-stream: modify the layer of sub frame CELP - *----------------------------------------------------------------*/ - FOR( i = 0; i < 20; i++ ) + i = find_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START, &value, &nb_bits ); +#ifdef DEBUGGING + assert( i >= 0 && "Internal error in ACELP core switching - unable to find ACELP subframe indices!" ); +#endif + while ( hBstr->ind_list[i].id == TAG_ACELP_SUBFR_LOOP_START ) { - hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].value = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].value; /* Q0 */ - move16(); - hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].nb_bits = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits; /* Q0 */ - move16(); - hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits = -1; /* Q0 */ - move16(); + push_indice( hBstr, IND_CORE_SWITCHING_CELP_SUBFRAME, hBstr->ind_list[i].value, hBstr->ind_list[i].nb_bits ); + i++; } + delete_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START ); + /*----------------------------------------------------------------* * BWE encoding *----------------------------------------------------------------*/ @@ -263,12 +243,7 @@ void acelp_core_switch_enc_ivas_fx( * Excitation encoding *----------------------------------------------------------------*/ - config_acelp1_IVAS( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, -#ifdef NONBE_FIX_GSC_BSTR - GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); -#else - GENERIC, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); -#endif + config_acelp1_fx( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); encod_gen_voic_core_switch_ivas_fx( st_fx, st_fx->last_L_frame, inp, Aq, A, T_op, exc, cbrate, shift, Q_new ); @@ -424,9 +399,9 @@ static void encod_gen_voic_core_switch_fx( * Close-loop pitch search and quantization * Adaptive exc. construction *----------------------------------------------------------------*/ - set16_fx( dummyF, -1, NB_SUBFR16k ); /* hack to signal ACELP->HQ switching frame */ - pitch = pit_encode_fx( hBstr, - st_fx->acelp_cfg.pitch_bits, core_bitrate, 0, L_frame, GENERIC, &pitch_limit_flag, 0, exc, L_SUBFR, T_op, &T0_min, &T0_max, &T0, &T0_frac, h1, xn, 0 /*hStereoTD->tdm_Pitch_reuse_flag*/, dummyF /*hStereoTD->tdm_Pri_pitch_buf*/ ); /* Q6 */ + + set16_fx( dummyF, -1, NB_SUBFR16k ); /* hack to signal ACELP->HQ switching frame */ + pitch = pit_encode_fx( hBstr, st_fx->acelp_cfg.pitch_bits, core_bitrate, 0, L_frame, GENERIC, &pitch_limit_flag, 0, exc, L_SUBFR, T_op, &T0_min, &T0_max, &T0, &T0_frac, h1, xn, 0 /*hStereoTD->tdm_Pitch_reuse_flag*/, dummyF /*hStereoTD->tdm_Pri_pitch_buf*/, st_fx->element_mode, Q_new ); /* Q6 */ /*-----------------------------------------------------------------* * Find adaptive exitation @@ -449,7 +424,7 @@ static void encod_gen_voic_core_switch_fx( IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { - push_indice_fx( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); } /*-----------------------------------------------------------------* @@ -497,7 +472,7 @@ static void encod_gen_voic_core_switch_fx( /* write reserved bits */ IF( unbits ) { - push_indice_fx( hBstr, IND_UNUSED, 0, unbits ); + push_indice( hBstr, IND_UNUSED, 0, unbits ); } /*-----------------------------------------------------------------* @@ -631,16 +606,16 @@ static void encod_gen_voic_core_switch_ivas_fx( * Close-loop pitch search and quantization * Adaptive exc. construction *----------------------------------------------------------------*/ - set16_fx( dummyF, -1, NB_SUBFR16k ); /* hack to signal ACELP->HQ switching frame */ - pitch = pit_encode_ivas_fx( hBstr, - st_fx->acelp_cfg.pitch_bits, core_bitrate, 0, L_frame, GENERIC, &pitch_limit_flag, 0, exc, L_SUBFR, T_op, &T0_min, &T0_max, &T0, &T0_frac, h1, xn, 0 /*hStereoTD->tdm_Pitch_reuse_flag*/, dummyF /*hStereoTD->tdm_Pri_pitch_buf*/, Q_new ); /* Q6 */ + set16_fx( dummyF, -1, NB_SUBFR16k ); /* hack to signal ACELP->HQ switching frame */ + pitch = pit_encode_fx( hBstr, st_fx->acelp_cfg.pitch_bits, core_bitrate, 0, L_frame, GENERIC, &pitch_limit_flag, 0, exc, L_SUBFR, T_op, &T0_min, &T0_max, &T0, &T0_frac, h1, xn, 0 /*hStereoTD->tdm_Pitch_reuse_flag*/, dummyF /*hStereoTD->tdm_Pri_pitch_buf*/, st_fx->element_mode, Q_new ); /* Q6 */ + /*-----------------------------------------------------------------* * Find adaptive exitation *-----------------------------------------------------------------*/ - pred_lt4( &exc[0], &exc[0], T0, T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc[0], &exc[0], T0, T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); /*-----------------------------------------------------------------* * Gain clipping test to avoid unstable synthesis on frame erasure @@ -652,10 +627,9 @@ static void encod_gen_voic_core_switch_ivas_fx( /*-----------------------------------------------------------------* * LP filtering of the adaptive excitation, codebook target computation *-----------------------------------------------------------------*/ - lp_flag = st_fx->acelp_cfg.ltf_mode; /* Q0 */ - Scale_sig( h1, L_SUBFR, sub( 14, q_h1 ) ); /* set h1[] in Q14 with scaling for convolution Q14+shift*/ - lp_select = lp_filt_exc_enc_ivas_fx( MODE1, GENERIC, 0, exc, h1, xn, y1, xn2, L_SUBFR, L_frame, g_corr, clip_gain, &gain_pit, &lp_flag ); /* Q0 */ - + lp_flag = st_fx->acelp_cfg.ltf_mode; /* Q0 */ + Scale_sig( h1, L_SUBFR, sub( 14, q_h1 ) ); /* set h1[] in Q14 with scaling for convolution Q14+shift*/ + lp_select = lp_filt_exc_enc_fx( MODE1, GENERIC, 0, exc, h1, xn, y1, xn2, L_SUBFR, L_frame, g_corr, clip_gain, &gain_pit, &lp_flag ); /* Q0 */ IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); @@ -673,15 +647,14 @@ static void encod_gen_voic_core_switch_ivas_fx( *-----------------------------------------------------------------*/ IF( EQ_16( L_frame, L_FRAME ) ) { - gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame, 0, -1, xn, y1, shift_wsp, y2, code, st_fx->old_Es_pred_fx, - &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); + gain_enc_mless_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame, 0, -1, xn, y1, shift_wsp, y2, code, st_fx->old_Es_pred_fx, + &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); } ELSE { - gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame, 0, -1, xn, y1, shift_wsp, y2, code, st_fx->old_Es_pred_fx, - &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); + gain_enc_mless_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame, 0, -1, xn, y1, shift_wsp, y2, code, st_fx->old_Es_pred_fx, + &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); } - gp_clip_test_gain_pit_fx( st_fx->element_mode, core_bitrate, gain_pit, st_fx->clip_var_fx ); Lgcode = L_shl( gain_code, Q_new ); /* scaled gain_code with Qnew -> Q16*/ @@ -716,7 +689,7 @@ static void encod_gen_voic_core_switch_ivas_fx( * long term prediction on the 2nd sub frame *-----------------------------------------------------------------*/ - pred_lt4( &exc[L_SUBFR], &exc[L_SUBFR], T0, T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc[L_SUBFR], &exc[L_SUBFR], T0, T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); FOR( i = L_SUBFR; i < 2 * L_SUBFR; i++ ) { @@ -727,7 +700,6 @@ static void encod_gen_voic_core_switch_ivas_fx( return; } - /*-------------------------------------------------------------------* * bwe_switch_enc() * @@ -754,10 +726,7 @@ static void bwe_switch_enc_fx( Word16 synth_subfr_bwe_fx[SWITCH_MAX_GAP]; /* synthesized bwe for core switching */ Word16 n, L; BSTR_ENC_HANDLE hBstr; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + hBstr = st_fx->hBstr; L = NS2SA_FX2( st_fx->input_Fs, FRAME_SIZE_NS ); @@ -846,7 +815,7 @@ static void bwe_switch_enc_fx( } } - push_indice_fx( hBstr, IND_CORE_SWITCHING_AUDIO_DELAY, d1m_fx, AUDIODELAYBITS ); + push_indice( hBstr, IND_CORE_SWITCHING_AUDIO_DELAY, d1m_fx, AUDIODELAYBITS ); tmp = add( i_mult2( d1m_fx, delta_fx ), fdelay_fx ); /* Q0 */ ptmp = &hb_synth_tmp_fx[tmp]; /* Q0 */ @@ -873,13 +842,14 @@ static void bwe_switch_enc_fx( L_tmp1 = L_mult( tmp, E2_fx ); /*30-q_tmp1+q_tmp2 */ q_tmp2 = sub( q_tmp1, q_tmp2 ); /*30-q_tmp2 */ L_tmp1 = L_shl( L_tmp1, sub( q_tmp2, 24 ) ); - gain_fx = round_fx_o( Isqrt( L_tmp1 ), &Overflow ); /*Q12 */ + gain_fx = round_fx_sat( Isqrt( L_tmp1 ) ); /*Q12 */ ind1_fx = usquant_fx( gain_fx, &gain_fx, shr( MINVALUEOFFIRSTGAIN_FX, 1 ), shr( DELTAOFFIRSTGAIN_FX, 4 ), ( 1 << NOOFGAINBITS1 ) ); /* Q0 */ - push_indice_fx( hBstr, IND_CORE_SWITCHING_AUDIO_GAIN, ind1_fx, NOOFGAINBITS1 ); + push_indice( hBstr, IND_CORE_SWITCHING_AUDIO_GAIN, ind1_fx, NOOFGAINBITS1 ); return; } + static void bwe_switch_enc_ivas_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ const Word16 *new_speech_fx /* i : original input signal Q0 */ @@ -900,10 +870,7 @@ static void bwe_switch_enc_ivas_fx( Word16 synth_subfr_bwe_fx[SWITCH_MAX_GAP]; /* synthesized bwe for core switching */ Word16 n, L; BSTR_ENC_HANDLE hBstr; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + hBstr = st_fx->hBstr; L = NS2SA_FX2( st_fx->input_Fs, FRAME_SIZE_NS ); @@ -1016,7 +983,7 @@ static void bwe_switch_enc_ivas_fx( L_tmp1 = L_mult( tmp, E2_fx ); /*30-q_tmp1+q_tmp2 */ q_tmp2 = sub( q_tmp1, q_tmp2 ); /*30-q_tmp2 */ L_tmp1 = L_shl( L_tmp1, sub( q_tmp2, 24 ) ); - gain_fx = round_fx_o( Isqrt( L_tmp1 ), &Overflow ); /*Q12 */ + gain_fx = round_fx_sat( Isqrt( L_tmp1 ) ); /*Q12 */ ind1_fx = usquant_fx( gain_fx, &gain_fx, shr( MINVALUEOFFIRSTGAIN_FX, 1 ), shr( DELTAOFFIRSTGAIN_FX, 4 ), ( 1 << NOOFGAINBITS1 ) ); push_indice( hBstr, IND_CORE_SWITCHING_AUDIO_GAIN, ind1_fx, NOOFGAINBITS1 ); @@ -1037,9 +1004,7 @@ static Word16 dotprod_satcont( Word16 tmp_tabx[L_FRAME48k], tmp_taby[L_FRAME48k]; Word16 shift, q, ener, i; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; -#endif Copy( x, tmp_tabx, len ); /* qx */ Copy( y, tmp_taby, len ); /* qy */ diff --git a/lib_enc/acelp_enc_util_fx.c b/lib_enc/acelp_enc_util_fx.c index 181583e91d23686fd8a753128ec344665e4e27a2..26ca2a020123a1c560ef400954049903ec854b0a 100644 --- a/lib_enc/acelp_enc_util_fx.c +++ b/lib_enc/acelp_enc_util_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -13,7 +13,6 @@ #include "prot_fx_enc.h" /* Function prototypes */ #include "stat_enc.h" #include "rom_com.h" -#include "rom_com_fx.h" #include "rom_enc.h" @@ -105,10 +104,10 @@ Word16 E_ACELP_toeplitz_mul_fx( } void E_ACELP_weighted_code( - const Word16 code[], /* i: code Q9*/ - const Word16 H[], /* i: impulse response Q*/ - Word16 Q, /* i: Q format of H */ - Word16 y[] /* o: weighted code Q9*/ + const Word16 code[], /* i: code Q9*/ + const Word16 H[], /* i: impulse response Q*/ + Word16 Q, /* i: Q format of H */ + Word16 y[] /* o: weighted code Q9*/ ) { Word16 i, j, k, one, n, nz[L_SUBFR]; @@ -154,16 +153,14 @@ void E_ACELP_weighted_code( } void E_ACELP_conv( - const Word16 xn2[], /* i Qx*/ - const Word16 h2[], /* i Q12*/ - Word16 cn2[] /* o Q0*/ + const Word16 xn2[], /* i Qx*/ + const Word16 h2[], /* i Q12*/ + Word16 cn2[] /* o Q0*/ ) { Word16 i, k; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif + FOR( k = 0; k < L_SUBFR; k++ ) { /*cn2[k] = xn2[k]; */ @@ -174,43 +171,41 @@ void E_ACELP_conv( /*cn2[k]-=cn2[i]*h2[k-i];*/ L_tmp_64 = W_msu0_16_16( L_tmp_64, cn2[i], h2[k - i] ); /*h2 4Q11*/ } - L_tmp = W_sat_l( L_tmp_64 ); /* 4Q11 */ - cn2[k] = round_fx_o( L_shl_o( L_tmp, 5, &Overflow ), &Overflow ); /* Q0 */ + L_tmp = W_sat_l( L_tmp_64 ); /* 4Q11 */ + cn2[k] = round_fx_sat( L_shl_sat( L_tmp, 5 ) ); /* Q0 */ } } void E_ACELP_conv_ivas_fx( - const Word16 xn2[], /* i Qx*/ - const Word16 h2[], /* i Q12*/ - Word16 cn2[] /* o Q0*/ + const Word16 xn2[], /* i Qnew - 1*/ + const Word16 h2[], /* i Q12*/ + Word16 cn2[] /* o Qnew*/ ) { Word16 i, k; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif + FOR( k = 0; k < L_SUBFR; k++ ) { /*cn2[k] = xn2[k]; */ Word64 L_tmp_64; - L_tmp_64 = W_deposit32_l( L_mult0( xn2[k], 0x800 ) ); /* 4Q11 */ + L_tmp_64 = W_deposit32_l( L_mult0( xn2[k], 0x800 ) ); /* Qnew -1 + 12 */ FOR( i = 0; i < k; i++ ) { /*cn2[k]-=cn2[i]*h2[k-i];*/ - L_tmp_64 = W_msu0_16_16( L_tmp_64, cn2[i], h2[k - i] ); /*h2 4Q11*/ + L_tmp_64 = W_msu0_16_16( L_tmp_64, cn2[i], h2[k - i] ); /*Qnew + 11*/ } - L_tmp = W_sat_l( L_tmp_64 ); /* 4Q11 */ - cn2[k] = round_fx_o( L_shl_o( L_tmp, 5, &Overflow ), &Overflow ); /* Q0*/ + L_tmp = W_sat_l( L_tmp_64 ); /* Qnew + 11 */ + cn2[k] = round_fx_sat( L_shl_sat( L_tmp, 5 ) ); /* Qnew*/ move16(); } } void E_ACELP_build_code( - Word16 nb_pulse, /* i Q0*/ - const Word16 codvec[], /* i Q0*/ - const Word16 sign[], /* i Q0*/ - Word16 code[], /* o Q9*/ - Word16 ind[] /* o Q0*/ + Word16 nb_pulse, /* i Q0*/ + const Word16 codvec[], /* i Q0*/ + const Word16 sign[], /* i Q0*/ + Word16 code[], /* o Q9*/ + Word16 ind[] /* o Q0*/ ) { Word16 i, k, val, index, track, tmp, vec[4]; @@ -230,7 +225,7 @@ void E_ACELP_build_code( FOR( k = 0; k < nb_pulse; ++k ) { - i = codvec[k]; /* read pulse position Q0*/ + i = codvec[k]; /* read pulse position Q0*/ move16(); val = sign[i]; /* read sign Q0*/ move16(); @@ -263,9 +258,9 @@ void E_ACELP_build_code( } void E_ACELP_setup_pulse_search_pos( - const PulseConfig *config, /* i: pulse configuration */ - Word16 k, /* i: interation number Q0*/ - UWord8 ipos[] /* o: pulse search positions Q0*/ + const PulseConfig *config, /* i: pulse configuration */ + Word16 k, /* i: interation number Q0*/ + UWord8 ipos[] /* o: pulse search positions Q0*/ ) { Word16 restpulses, iPulse; diff --git a/lib_enc/amr_wb_enc_fx.c b/lib_enc/amr_wb_enc_fx.c index b1b2257e2b8f422ccc17444d939f4350c0bb305d..9b20100ba13a75354a9069b188cc48b38997d9c2 100644 --- a/lib_enc/amr_wb_enc_fx.c +++ b/lib_enc/amr_wb_enc_fx.c @@ -1,13 +1,11 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_enc.h" /* Encoder static table prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_enc.h" /* Encoder static table prototypes */ #include "basop_util.h" #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ @@ -24,9 +22,10 @@ *--------------------------------------------------------------------*/ void amr_wb_enc_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 input_sp[], /* i : input signal Q0*/ - const Word16 n_samples /* i : number of input samples Q0*/ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 input_sp[], /* i : input signal Q0*/ + Word32 *mem_hp20_in_fx, /* i/o: hp20 filter memory Qx*/ + const Word16 n_samples /* i : number of input samples Q0*/ ) { Word16 i, delay; @@ -109,7 +108,7 @@ void amr_wb_enc_fx( move16(); st->coder_type = GENERIC; move16(); - input_frame = st->input_frame_fx; + input_frame = extract_l( Mpy_32_32_r( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); move16(); /* frame length of the input signal */ st->extl = -1; move16(); @@ -183,7 +182,7 @@ void amr_wb_enc_fx( st->input_fx[i] = 0; move16(); } - hp20( st->input_fx, 1, input_frame, st->mem_hp20_in_fx, st->input_Fs ); + hp20( st->input_fx, 1, input_frame, mem_hp20_in_fx, st->input_Fs ); /*-----------------------------------------------------------------* * switching from ACELP@16k core to AMR-WB IO mode @@ -372,7 +371,7 @@ void amr_wb_enc_fx( * WB, SWB and FB bandwidth detector *----------------------------------------------------------------*/ - bw_detect_fx( st, st->input_fx, NULL, NULL, NULL, MONO_FORMAT, 0 ); + bw_detect_fx( st, st->input_fx, NULL, NULL, NULL, MONO_FORMAT, 0, 0 ); /* in AMR_WB IO, limit the maximum band-width to WB */ if ( GT_16( st->bwidth, WB ) ) @@ -548,7 +547,7 @@ void amr_wb_enc_fx( * Write VAD information into the bitstream in AMR-WB IO mode *--------------------------------------------------------------------------------------*/ - push_indice_fx( st->hBstr, IND_VAD_FLAG, st->vad_flag, 1 ); + push_indice( st->hBstr, IND_VAD_FLAG, st->vad_flag, 1 ); } /*-----------------------------------------------------------------* diff --git a/lib_enc/analy_lp_fx.c b/lib_enc/analy_lp_fx.c index c2f9d0585d356c513226ee2059d219e835976724..8739661168a5dd90e7c596fd8b261f9b572ac612 100644 --- a/lib_enc/analy_lp_fx.c +++ b/lib_enc/analy_lp_fx.c @@ -1,19 +1,18 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ -#include "rom_com.h" /* Static table prototypes */ -#include "rom_enc.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ +#include "rom_enc.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*-------------------------------------------------------------------* - * analy_lp() + * analy_lp_fx() * * Perform LP analysis * @@ -23,23 +22,26 @@ * - find interpolated LSPs and convert back to A(z) for all subframes * - update LSPs for the next frame *-------------------------------------------------------------------*/ -void analy_lp_ivas_fx( - const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ - const Word16 L_frame, /* i :(q0) length of the frame */ - const Word16 L_look, /* i :(q0) look-ahead */ - Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ - Word16 A[], /* o :(q14) A(z) filter coefficients */ + +void analy_lp_fx( + const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ + const Word16 L_frame, /* i :(q0) length of the frame */ + const Word16 L_look, /* i :(q0) look-ahead */ + Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ + Word16 A[], /* o :(q14) A(z) filter coefficients */ Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 lsp_new[], /* o :(q15) current frame LSPs */ - Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ - Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ - const Word16 Top[2], /* i :(q0) open loop pitch lag */ - const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ - const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ - const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ - Word16 Q_new, /*i: stores Q for speech*/ - Word16 *Q_r /*stores q for ener*/ ) + Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 lsp_new[], /* o :(q15) current frame LSPs */ + Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ + Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ + const Word16 Top[2], /* i :(q0) open loop pitch lag */ + const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ + const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ + const Word16 element_mode, /* i : element mode */ + const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ + Word16 Q_new, /* i : stores Q for speech */ + Word16 *Q_r /*stores q for ener*/ +) { Word16 r_h[M + 1]; /* Autocorrelations of windowed speech MSB */ Word16 r_l[M + 1]; /* Autocorrelations of windowed speech LSB */ @@ -74,19 +76,22 @@ void analy_lp_ivas_fx( /* Autocorrelations */ autocorr_fx( pt, M, r_h, r_l, &Q_r[1 - i_subfr], wind_length, wind, 0, 0 ); - /*if ( r[0] < 100.0f && no_thr == 0 )*/ - /*r[0] = 100.0f*/ - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_Comp( r_h[0], r_l[0] ) /* Q_r[1 - i_subfr]*/, sub( 31, add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ) ), 100 /*q0*/, 31 ), -1 ) ) + IF( NE_16( element_mode, EVS_MONO ) ) { - /*Q_min stores min of 24 and the actual Q for r*/ - Word16 Q_min = s_min( add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ), 24 ); /* comparing q with 24 because exponent of 100 is 7 so max q should be 24*/ - L_Extract( L_shl( 100, Q_min ), &r_h[0], &r_l[0] ); /*extracting high and low components of r[0]*/ - FOR( i = 1; i < 17; i++ ) + /*if ( r[0] < 100.0f && no_thr == 0 )*/ + /*r[0] = 100.0f*/ + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_Comp( r_h[0], r_l[0] ) /* Q_r[1 - i_subfr]*/, sub( 31, add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ) ), 100 /*q0*/, 31 ), -1 ) ) { - L_Extract( L_shr( L_Comp( r_h[i], r_l[i] ), sub( add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ), Q_min ) ), &r_h[i], &r_l[i] ); /*scaling all the values to q24*/ + /*Q_min stores min of 24 and the actual Q for r*/ + Word16 Q_min = s_min( add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ), 24 ); /* comparing q with 24 because exponent of 100 is 7 so max q should be 24*/ + L_Extract( L_shl( 100, Q_min ), &r_h[0], &r_l[0] ); /*extracting high and low components of r[0]*/ + FOR( i = 1; i < 17; i++ ) + { + L_Extract( L_shr( L_Comp( r_h[i], r_l[i] ), sub( add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ), Q_min ) ), &r_h[i], &r_l[i] ); /*scaling all the values to q24*/ + } + Q_r[1 - i_subfr] = sub( Q_min, shl( Q_new, 1 ) ); /*updating the q (subtracting shl( Q_new, 1 ) as in later part it is being added-> to maintain q24 )*/ + move16(); } - Q_r[1 - i_subfr] = sub( Q_min, shl( Q_new, 1 ) ); /*updating the q (subtracting shl( Q_new, 1 ) as in later part it is being added-> to maintain q24 )*/ - move16(); } /* Lag windowing */ @@ -124,92 +129,6 @@ void analy_lp_ivas_fx( return; } -void analy_lp_fx( - const Word16 speech[], /* i : pointer to the speech frame Q_new*/ - const Word16 L_frame, /* i : length of the frame Q0*/ - const Word16 L_look, /* i : look-ahead Q0*/ - Word32 *ener, /* o : residual energy from Levinson-Durbin Q_r*/ - Word16 A[], /* o : A(z) filter coefficients Q14*/ - Word16 epsP_h[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 epsP_l[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 lsp_new[], /* o : current frame LSPs Q15*/ - Word16 lsp_mid[], /* o : current mid-frame LSPs Q15*/ - Word16 lsp_old[], /* i/o: previous frame unquantized LSPs Q15*/ - const Word16 Top[2], /* i : open loop pitch lag Q0*/ - const Word16 Tnc[2], /* i : open loop pitch gain Q15*/ - const Word32 Core_sr, /* i : Internal core sampling rate Q0*/ - const Word16 sec_chan_low_rate, /* i : flag to signal second channel Q0*/ - Word16 Q_new, - Word16 *Q_r ) -{ - Word16 r_h[M + 1]; /* Autocorrelations of windowed speech MSB */ - Word16 r_l[M + 1]; /* Autocorrelations of windowed speech LSB */ - Word32 LepsP[M + 1]; - Word16 i, i_subfr, wind_length = 0; - Word16 *lsp; - const Word16 *wind = NULL; - const Word16 *pt; - Word16 half_frame; - - IF( EQ_16( L_frame, L_FRAME ) ) - { - wind_length = L_LP; - move16(); - wind = Assym_window_W16fx; /* Q15 */ - } - ELSE /* L_frame == L_FRAME16k */ - { - wind_length = L_LP_16k; - move16(); - wind = assym_window_16k_fx; /* Q15 */ - } - lsp = lsp_mid; /* Q15 */ - half_frame = shr( L_frame, 1 ); - - FOR( i_subfr = 0; i_subfr <= 1; i_subfr++ ) - { - pt = speech + sub( add( half_frame, L_look ), wind_length ); - half_frame = shl( half_frame, 1 ); - - /* Autocorrelations */ - autocorr_fx( pt, M, r_h, r_l, &Q_r[1 - i_subfr], wind_length, wind, 0, 0 ); - - /* Lag windowing */ - adapt_lag_wind( r_h, r_l, M, Top[i_subfr], Tnc[i_subfr], Core_sr ); - - /* Levinson-Durbin */ - E_LPC_lev_dur( r_h, r_l, A, LepsP, M, NULL ); - FOR( i = 0; i <= M; i++ ) - { - L_Extract( LepsP[i], &epsP_h[i], &epsP_l[i] ); - } - /*Q_r[... might not be needed from external...*/ - Q_r[1 - i_subfr] = add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ); - move16(); - - /* Conversion of A(z) to LSPs */ - E_LPC_a_lsp_conversion( A, lsp, lsp_old, M ); - - lsp = lsp_new; /* Q15 */ - } - IF( EQ_16( sec_chan_low_rate, 1 ) ) - { - /* LSP interpolation */ - int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, -2 ); - } - ELSE - { - /* LSP interpolation */ - int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, 0 ); - } - Copy( lsp_new, lsp_old, M ); /* Q15 */ - *ener = L_Comp( epsP_h[M], epsP_l[M] ); /* Q_r */ - move32(); - - return; -} - - /*-------------------------------------------------------------------* * analy_lp_AMR_WB() * @@ -223,16 +142,16 @@ void analy_lp_fx( *-------------------------------------------------------------------*/ void analy_lp_AMR_WB_fx( - const Word16 speech[], /* i : pointer to the speech frame Q_new*/ - Word32 *ener, /* o : residual energy from Levinson-Durbin Q_r*/ - Word16 A[], /* o : A(z) filter coefficients Q14*/ - Word16 epsP_h[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 epsP_l[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 isp_new[], /* o : current frame ISPs Q15*/ - Word16 isp_old[], /* i/o: previous frame unquantized ISPs Q15*/ - Word16 isf_new[], /* o : current frame ISPs Q15*/ - Word16 Top, /* i : open loop pitch lag Q0*/ - Word16 Tnc, /* i : open loop pitch gain Qx*/ + const Word16 speech[], /* i : pointer to the speech frame Q_new*/ + Word32 *ener, /* o : residual energy from Levinson-Durbin Q_r*/ + Word16 A[], /* o : A(z) filter coefficients Q14*/ + Word16 epsP_h[], /* o : LP analysis residual energies for each iteration Q_r*/ + Word16 epsP_l[], /* o : LP analysis residual energies for each iteration Q_r*/ + Word16 isp_new[], /* o : current frame ISPs Q15*/ + Word16 isp_old[], /* i/o: previous frame unquantized ISPs Q15*/ + Word16 isf_new[], /* o : current frame ISPs Q15*/ + Word16 Top, /* i : open loop pitch lag Q0*/ + Word16 Tnc, /* i : open loop pitch gain Qx*/ Word16 Q_new, Word16 *Q_r ) { diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index 185bac26bc7847ecd023228e95a204404ee2b044..dc34ccc5b96557e1de1aeb9cde7e7d4941f845cb 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -321,7 +321,7 @@ static void find_enr_dft_ivas_fx( } /* normalization per frequency bin */ - band_fx[i] = W_extract_h( W_shl( band_ener, sub( Q16, shift ) ) ); // *q_band + band_fx[i] = W_shl_sat_l( band_ener, sub( Q16 - 32, shift ) ); // *q_band move32(); /* per band energy without E_MIN */ @@ -399,6 +399,10 @@ static void find_enr_dft_ivas_fx( BinE_fx[STEREO_DFT_N_12k8_ENC / 2 - 1] = BinE_fx[STEREO_DFT_N_12k8_ENC / 2 - 2]; // // *q_Bin_E move32(); + Word16 norm = getScaleFactor32( BinE_fx, L_FFT ); + scale_sig32( BinE_fx, L_FFT, norm ); + *q_Bin_E = add( *q_Bin_E, norm ); + move16(); L_lerp_fx( BinE_fx, Bin_E_fx, L_FFT / 2, STEREO_DFT_N_12k8_ENC / 2, q_Bin_E ); MVR2R_WORD32( Bin_E_fx, ptE_fx, VOIC_BINS ); // *q_Bin_E @@ -434,7 +438,7 @@ void ivas_analy_sp_fx( Word16 *q_fr_bands, /* o : energy in critical frequency bands Q0 */ Word32 *lf_E, /* o : per bin E for first... q_lf_E */ Word16 *q_lf_E, /* o : per bin E for first... Q0 */ - Word16 *Etot, /* o : total input energy Q8 */ + Word32 *Etot, /* o : total input energy Q24 */ const Word16 min_band, /* i : minimum critical band Q0 */ const Word16 max_band, /* i : maximum critical band Q0 */ Word32 *Bin_E, /* o : per-bin energy spectrum q_Bin_E */ @@ -490,9 +494,9 @@ void ivas_analy_sp_fx( } ELSE { - Word16 scale = 0; + Word16 scale = 0, shift; move16(); - + shift = s_min( norm_arr( speech + 3 * ( L_SUBFR / 2 ) - L_FFT / 2, L_FFT ), norm_arr( speech + 7 * ( L_SUBFR / 2 ) - L_FFT / 2, L_FFT ) ); FOR( i_subfr = 0; i_subfr <= 1; i_subfr++ ) { /* set pointer to the beginning of the signal for spectral analysis */ @@ -503,27 +507,26 @@ void ivas_analy_sp_fx( /* set the pointer for second analysis window */ pt = speech + 7 * ( L_SUBFR / 2 ) - L_FFT / 2; } - /* Clear 1st value of 1st part, copy 1st value of 2nd part */ pt_fft[0] = 0; move16(); - pt_fft[L_FFT / 2] = pt[L_FFT / 2]; // Q_new - preemph_bits + pt_fft[L_FFT / 2] = shl( pt[L_FFT / 2], shift ); // (Q_new + shift) - preemph_bits move16(); FOR( i = 1; i < L_FFT / 2; i++ ) { /* 1st windowed part */ - pt_fft[i] = mult_r( pt[i], sqrt_han_window_fx[i] ); // Q_new - preemph_bits + pt_fft[i] = mult_r( shl( pt[i], shift ), sqrt_han_window_fx[i] ); // (Q_new + shift) - preemph_bits move16(); /* 2nd windowed part */ - pt_fft[L_FFT - i] = mult_r( pt[L_FFT - i], sqrt_han_window_fx[i] ); // Q_new - preemph_bits + pt_fft[L_FFT - i] = mult_r( shl( pt[L_FFT - i], shift ), sqrt_han_window_fx[i] ); // (Q_new + shift) - preemph_bits move16(); } /* compute the spectrum */ fft_rel_16_32fx( pt_fft, &scale, i_subfr, L_FFT, LOG2_L_FFT ); - *q_fft_buff = add( Q_new, scale ); // resultant q for fft_buff + *q_fft_buff = add( add( Q_new, shift ), scale ); // resultant q for fft_buff move16(); IF( EQ_16( i_subfr, 1 ) ) { @@ -554,7 +557,7 @@ void ivas_analy_sp_fx( /* Average total log energy over both half-frames */ /* *Etot = 10.0f * (float)log10(0.5f * *Etot); */ - *Etot = -12800 /* 10.f * logf(0.00001f) in Q8 */; + *Etot = -838860800 /* 10.f * log10f(0.00001f) in Q24 : This is when LEtot is 0*/; move16(); IF( LEtot != 0 ) { @@ -563,9 +566,11 @@ void ivas_analy_sp_fx( LEtot = W_shl( LEtot, exp ); // q_fr_bands+2+exp Ltmp = BASOP_Util_Log10( W_extract_h( LEtot ), sub( 61, add( *q_fr_bands, exp ) ) /* 31-(q_fr_bands+2+exp-32) */ ); // Q25 Ltmp = Mpy_32_32( Ltmp, 1342177280 /* 10.f in Q27 */ ); // (Q25, Q27) -> Q21 - *Etot = extract_h( L_shl( Ltmp, Q24 - Q21 ) ); // Q8 + *Etot = L_shl( Ltmp, Q24 - Q21 ); // Q24 move16(); } + *q_band_energies = *q_fr_bands; + move16(); } ELSE { @@ -575,10 +580,10 @@ void ivas_analy_sp_fx( set32_fx( lf_E, 0, 2 * VOIC_BINS ); set32_fx( band_energies, 0, 2 * NB_BANDS ); set32_fx( fr_bands, E_MIN_FXQ31, 2 * NB_BANDS ); // Q31 (*q_fr_bands) - - LEtot = W_shl( W_mult_32_16( E_MIN_FXQ31, add( sub( max_band, min_band ), 1 ) ), 1 ); // Q32 (*q_fr_bands+1) + *Etot = -193760400; // Q24 *q_fr_bands = Q31; *q_lf_E = *q_fr_bands; + move32(); move16(); move16(); } @@ -593,31 +598,30 @@ void ivas_analy_sp_fx( MVR2R_WORD32( Bin_E, Bin_E + ( L_FFT / 2 ), L_FFT / 2 ); MVR2R_WORD32( band_energies, band_energies + NB_BANDS, NB_BANDS ); MVR2R_WORD32( pt_bands, pt_bands + NB_BANDS, NB_BANDS ); - } - /* Average total log energy over both half-frames */ - *Etot = -12800 /* 10.f * logf(0.00001f) in Q8 */; - move16(); - IF( LEtot != 0 ) - { - exp = W_norm( LEtot ); - LEtot = W_shl( LEtot, exp ); // q_fr_bands+exp - Ltmp = BASOP_Util_Log10( W_extract_h( LEtot ), sub( 62, add( *q_fr_bands, exp ) ) /* 31-(q_fr_bands+1+exp-32) */ ); // Q25 - Ltmp = Mpy_32_32( Ltmp, 1342177280 /* 10.f in Q27 */ ); // (Q25, Q27) -> Q21 - *Etot = extract_h( L_shl( Ltmp, Q24 - Q21 ) ); // Q8 + /* Average total log energy over both half-frames */ + *Etot = -838860800 /* 10.f * log10f(0.00001f) in Q24 : This is when LEtot is 0*/; move16(); + IF( LEtot != 0 ) + { + exp = W_norm( LEtot ); + LEtot = W_shl( LEtot, exp ); // q_fr_bands+exp + Ltmp = BASOP_Util_Log10( W_extract_h( LEtot ), sub( 62, add( *q_fr_bands, exp ) ) /* 31-(q_fr_bands+1+exp-32) */ ); // Q25 + Ltmp = Mpy_32_32( Ltmp, 1342177280 /* 10.f in Q27 */ ); // (Q25, Q27) -> Q21 + *Etot = L_shl( Ltmp, Q24 - Q21 ); // Q24 + move16(); + } } + *q_band_energies = *q_fr_bands; + move16(); } - *q_band_energies = *q_fr_bands; - move16(); - exp = sub( getScaleFactor32( fr_bands, 2 * NB_BANDS ), 1 ); scale_sig32( fr_bands, 2 * NB_BANDS, exp ); /* q_fr_bands + exp */ *q_fr_bands = add( *q_fr_bands, exp ); move16(); - exp = sub( getScaleFactor32( band_energies, 2 * NB_BANDS ), 1 ); + exp = getScaleFactor32( band_energies, 2 * NB_BANDS ); scale_sig32( band_energies, 2 * NB_BANDS, exp ); /* q_band_energies + exp */ *q_band_energies = add( *q_band_energies, exp ); move16(); @@ -631,14 +635,14 @@ void ivas_analy_sp_fx( move32(); Bin_E[L_FFT - 1] = Bin_E[L_FFT - 2]; // *q_Bin_E move32(); - + Word32 add_const = 21475; // 1e-5 in Q31 FOR( i = 0; i < L_FFT / 2; i++ ) { Bin_E_old[i] = Bin_E[i]; // *q_Bin_E move32(); /* PS[i] = ( Bin_E[i] + 1e-5f + Bin_E[i + L_FFT / 2] + 1e-5f ) / 2.0f; */ - PS[i] = W_extract_h( W_mac_32_32( W_mult_32_32( Bin_E[i], ONE_IN_Q30 ), Bin_E[i + L_FFT / 2], ONE_IN_Q30 ) ); // *q_Bin_E + PS[i] = W_extract_h( W_add( W_shl( W_add( W_deposit32_l( Bin_E[i] ), W_deposit32_l( Bin_E[i + L_FFT / 2] ) ), 31 ), W_shr( W_shl( add_const, 32 ), sub( 31, *q_Bin_E ) ) ) ); // *q_Bin_E move32(); /* Bin_E[i] = (float) ( 10.0f * log( PS[i] ) ); */ @@ -695,7 +699,7 @@ static void ivas_find_enr( Word16 data[], /* i : fft result */ Word16 q_data, /* i : Q of fft result */ Word32 band[], /* o : per band energy q_band */ - Word16 *q_band, /* o : Q of per band energy */ + Word16 *q_band, /* o : Q of per band energy */ Word32 *ptE, /* o : per bin energy for low frequencies q_ptE */ Word16 *q_ptE, /* o : Q of per bin energy for low frequencies Q0 */ Word64 *LEtot, /* o : total energy q_band+1 */ @@ -715,6 +719,7 @@ static void ivas_find_enr( Word32 min_ener; Word16 shift = 0; move16(); + Word16 tmp_shift; ptR = &data[1]; /* first real */ ptI = &data[L_FFT - 1]; /* first imaginary */ @@ -744,13 +749,14 @@ static void ivas_find_enr( freq = BIN_FREQ_FX; move16(); + tmp_shift = sub( -Q16, shift ); // 16 - shift - 32 FOR( i = 0; i < voic_band; i++ ) /* up to maximum allowed voiced critical band */ { band_ener = 0; move64(); start_freq = freq; move16(); - WHILE( LE_32( freq, crit_bands_fx[i] ) ) + FOR( ; LE_32( freq, crit_bands_fx[i] ); ) { /* *ptE = *ptR * *ptR + *ptI * *ptI; @@ -783,7 +789,7 @@ static void ivas_find_enr( freq = add( freq, BIN_FREQ_FX ); } - band[i] = W_extract_h( W_shl( band_ener, sub( Q16, shift ) ) ); // *q_band + band[i] = W_shl_sat_l( band_ener, tmp_shift ); // *q_band move32(); band_energies[i] = band[i]; /* per band energy without E_MIN */ // *q_band @@ -808,7 +814,7 @@ static void ivas_find_enr( move64(); start_freq = freq; move16(); - WHILE( LE_32( freq, crit_bands_fx[i] ) ) + FOR( ; LE_32( freq, crit_bands_fx[i] ); ) { /* *Bin_E = *ptR * *ptR + *ptI * *ptI; @@ -839,7 +845,7 @@ static void ivas_find_enr( freq = add( freq, BIN_FREQ_FX ); } - band[i] = W_extract_h( W_shl_nosat( band_ener, sub( Q16, shift ) ) ); // *q_band + band[i] = W_shl_sat_l( band_ener, tmp_shift ); // *q_band move32(); band_energies[i] = band[i]; /* per band energy without E_MIN */ // *q_band @@ -857,7 +863,7 @@ static void ivas_find_enr( * Find the total energy over the input bandwidth *-----------------------------------------------------------------*/ - etot = *LEtot; // *q_band + etot = *LEtot; // *q_band+1 move64(); FOR( i = min_band; i <= max_band; i++ ) { @@ -892,11 +898,6 @@ static void find_enr( Word32 etot; Word16 exp_etot; Word32 *tmpptr; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - ptR = &data[1]; /* first real */ ptI = &data[L_FFT - 1]; /* first imaginary */ @@ -942,9 +943,9 @@ static void find_enr( /* *ptE *= 4.0 / (L_FFT*L_FFT) */ /* normalization - corresponds to FFT normalization by 2/L_FFT */ - BASOP_SATURATE_WARNING_OFF_EVS; /* saturation seems to have no effect (tested by simulation) */ - *ptE = L_shl_o( Ltmp, diff_scaleM2, &Overflow ); /* Q_new + QSCALE - 2 */ - move32(); /* scaled by Q_new + QSCALE - 2 */ + BASOP_SATURATE_WARNING_OFF_EVS; /* saturation seems to have no effect (tested by simulation) */ + *ptE = L_shl_sat( Ltmp, diff_scaleM2 ); /* Q_new + QSCALE - 2 */ + move32(); /* scaled by Q_new + QSCALE - 2 */ BASOP_SATURATE_WARNING_ON_EVS; /*band[i] += *ptE++;*/ *Bin_E = *ptE; @@ -968,9 +969,9 @@ static void find_enr( exp_band = sub( exp_band, shift_to_norm ); exp_band = sub( diff_scaleP1, exp_band ); - BASOP_SATURATE_WARNING_OFF_EVS; /* saturation seems to have no effect (tested by simulation) */ - band[i] = L_shl_o( Ltmp1, exp_band, &Overflow ); /* Q15 + exp_band */ - move32(); /* band scaled by Q_new + QSCALE */ + BASOP_SATURATE_WARNING_OFF_EVS; /* saturation seems to have no effect (tested by simulation) */ + band[i] = L_shl_sat( Ltmp1, exp_band ); /* Q15 + exp_band */ + move32(); /* band scaled by Q_new + QSCALE */ BASOP_SATURATE_WARNING_ON_EVS; test(); @@ -1019,9 +1020,9 @@ static void find_enr( /* *ptE *= 4.0 / (L_FFT*L_FFT) */ /* normalization - corresponds to FFT normalization by 2/L_FFT */ - BASOP_SATURATE_WARNING_OFF_EVS; /* saturation seems to have no effect (tested by simulation) */ - *Bin_E = L_shl_o( Ltmp, diff_scaleM2, &Overflow ); /* Q_new + QSCALE */ - move32(); /* scaled by Q_new + QSCALE - 2 */ + BASOP_SATURATE_WARNING_OFF_EVS; /* saturation seems to have no effect (tested by simulation) */ + *Bin_E = L_shl_sat( Ltmp, diff_scaleM2 ); /* Q_new + QSCALE */ + move32(); /* scaled by Q_new + QSCALE - 2 */ BASOP_SATURATE_WARNING_ON_EVS; Bin_E++; Ltmp1 = L_add( Ltmp1, Ltmp ); @@ -1042,7 +1043,7 @@ static void find_enr( exp_band = sub( exp_band, shift_to_norm ); exp_band = sub( diff_scaleP1, exp_band ); BASOP_SATURATE_WARNING_OFF_EVS; /* saturation seems to have no effect (tested by simulation) */ - band[i] = L_shl_o( Ltmp1, exp_band, &Overflow ); + band[i] = L_shl_sat( Ltmp1, exp_band ); move32(); /* band scaled by Q_new + QSCALE */ BASOP_SATURATE_WARNING_ON_EVS; diff --git a/lib_enc/ari_enc_fx.c b/lib_enc/ari_enc_fx.c index 29ddd838c69cfb2be54ccfd8d304168190e848bf..0c44f113e95dc5ef0895032792288305ade7fb42 100644 --- a/lib_enc/ari_enc_fx.c +++ b/lib_enc/ari_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -63,12 +63,12 @@ Word16 ari_put_bit_plus_follow( ) { assert( bit == 0 || bit == 1 ); - ptr[bp++] = bit; /* send initially a zero or one Q0*/ + ptr[bp++] = bit; /* send initially a zero or one Q0*/ move16(); bit = s_xor( bit, 1 ); /* invert bit to send */ FOR( ; bits_to_follow > 0; bits_to_follow-- ) { - ptr[bp++] = bit; /* send inverted bit Q0*/ + ptr[bp++] = bit; /* send inverted bit Q0*/ move16(); } return bp; @@ -171,7 +171,7 @@ Word16 ari_encode_14bits_ext_fx( /* Output an opposite bit */ /* later if in middle half. */ bits_to_follow = add( bits_to_follow, 1 ); /* Q0 */ - low = L_sub( low, ari_q1new ); /* Subtract offset to middle Q0*/ + low = L_sub( low, ari_q1new ); /* Subtract offset to middle Q0*/ high = L_sub( high, ari_q1new ); /* Q0 */ } ELSE @@ -248,7 +248,7 @@ static Word16 ari_encode_14bits_high_low( /* Output an opposite bit */ /* later if in middle half. */ bits_to_follow = add( bits_to_follow, 1 ); /* Q0 */ - low = L_sub( low, ari_q1new ); /* Subtract offset to middle Q0*/ + low = L_sub( low, ari_q1new ); /* Subtract offset to middle Q0*/ high = L_sub( high, ari_q1new ); /* Q0 */ } ELSE @@ -532,7 +532,7 @@ static Word16 ari_encode_14bits_high_low_ivas_fx( /* Output an opposite bit */ /* later if in middle half. */ bits_to_follow = add( bits_to_follow, 1 ); /* Q0 */ - low = L_sub( low, ari_q1new ); /* Subtract offset to middle Q0*/ + low = L_sub( low, ari_q1new ); /* Subtract offset to middle Q0*/ high = L_sub( high, ari_q1new ); /* Q0 */ } ELSE diff --git a/lib_enc/ari_hm_enc_fx.c b/lib_enc/ari_hm_enc_fx.c index 76d48ccf4318fd1aa0931b8b8358876751c1d6e1..d70f09062cb44e073e60628be3a0994d0c39cb58 100644 --- a/lib_enc/ari_hm_enc_fx.c +++ b/lib_enc/ari_hm_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -42,12 +42,12 @@ Word16 EncodeIndex_fx( NumRatioBitsBwLtpIndx = NumRatioBits[Bandwidth][LtpPitchIndex]; move16(); - push_next_indice_fx( hBst, s_and( PeriodicityIndex, 0xff ), NumRatioBitsBwLtpIndx ); + push_next_indice( hBst, s_and( PeriodicityIndex, 0xff ), NumRatioBitsBwLtpIndx ); return NumRatioBitsBwLtpIndx; } ELSE { - push_next_indice_fx( hBst, PeriodicityIndex, 8 ); + push_next_indice( hBst, PeriodicityIndex, 8 ); return 8; } } @@ -241,10 +241,6 @@ Word16 SearchPeriodicityIndex_fx( Word32 Lag; Word16 s, tmp, tmp2, tmp3; Word32 tmp32; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* Debug init (not instrumented) */ C = -3000; @@ -457,8 +453,8 @@ Word16 SearchPeriodicityIndex_fx( tmp32 = L_mult0( Score, NumToConsider ); /* -> 16Q15 */ tmp = sub( norm_l( tmp32 ), 1 ); tmp2 = norm_l( AbsTotal ); - tmp3 = div_s( round_fx_o( L_shl_o( tmp32, tmp, &Overflow ), &Overflow ), round_fx_o( L_shl_o( AbsTotal, tmp2, &Overflow ), &Overflow ) ); - *RelativeScore = shr_o( tmp3, add( sub( tmp, tmp2 ), 2 ), &Overflow ); /* -> 2Q13 */ + tmp3 = div_s( round_fx_sat( L_shl( tmp32, tmp ) ), round_fx_sat( L_shl( AbsTotal, tmp2 ) ) ); + *RelativeScore = shr_sat( tmp3, add( sub( tmp, tmp2 ), 2 ) ); /* -> 2Q13 */ move16(); } ELSE diff --git a/lib_enc/arith_coder_enc_fx.c b/lib_enc/arith_coder_enc_fx.c index 98a5173f592f6f5c41fd26316bd5ec30b4d72ede..b8c55ee1b82080e409abbe126116fe3d1cac4e74 100644 --- a/lib_enc/arith_coder_enc_fx.c +++ b/lib_enc/arith_coder_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -48,11 +48,6 @@ static Word16 tcx_arith_estimate_scale( { Word16 scale, tmp, k, s, s1; Word32 L_tmp, accu; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - /* compute normalised standard deviation and determine approximate scale */ accu = L_deposit_l( 0 ); @@ -72,7 +67,7 @@ static Word16 tcx_arith_estimate_scale( s1 = norm_l( abs_spectrum[k] ); } - tmp = mult_r( round_fx_o( L_shl( abs_spectrum[k], s1 ), &Overflow ), envelope[k] ); + tmp = mult_r( round_fx_sat( L_shl( abs_spectrum[k], s1 ) ), envelope[k] ); L_tmp = L_mult0( tmp, tmp ); tmp = sub( shl( s1, 1 ), 1 ); @@ -367,11 +362,6 @@ static Word16 tcx_arith_rateloop( Word32 L_tmp; Word16 tmp, tmp3; Word32 tmp2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - scale = tcx_arith_estimate_scale( abs_spectrum, abs_spectrum_e, L_frame, envelope, envelope_e, &tmp ); scale = mult_r( scale, *target_bits_fac ); @@ -379,7 +369,7 @@ static Word16 tcx_arith_rateloop( scale_max = tcx_arith_find_max_scale( abs_spectrum, abs_spectrum_e, L_frame, envelope, envelope_e, exps, deadzone, scale_e ); - scale = shl_o( scale, sub( tmp, *scale_e ), &Overflow ); + scale = shl_sat( scale, sub( tmp, *scale_e ) ); scale = s_min( scale, scale_max ); scale_best = scale; @@ -440,7 +430,7 @@ static Word16 tcx_arith_rateloop( { /* Update estimator temporal compensation factor */ tmp = BASOP_Util_Divide3232_Scale( L_mult0( target_bits, 1 << 9 ), bits, &s ); - tmp = shl_o( mult_r( *target_bits_fac, tmp ), s, &Overflow ); + tmp = shl_sat( mult_r( *target_bits_fac, tmp ), s ); tmp = s_min( tmp, 20480 /*1.25f Q14*/ ); tmp = s_max( tmp, 12288 /*0.75f Q14*/ ); *target_bits_fac = tmp; @@ -470,8 +460,8 @@ static Word16 tcx_arith_rateloop( { /* adjust = 1.25f * target_bits / (float)bits; */ tmp = BASOP_Util_Divide3232_Scale( L_mult0( target_bits, 0x280 ), bits, &s ); - adjust = shl_o( tmp, sub( s, 1 ), &Overflow ); /* Q14 */ - scale = shl_o( mult_r( scale, adjust ), 1, &Overflow ); + adjust = shl_sat( tmp, sub( s, 1 ) ); /* Q14 */ + scale = shl_sat( mult_r( scale, adjust ), 1 ); scale = s_min( scale, scale_max ); } } @@ -680,15 +670,10 @@ void tcx_arith_encode_envelope_fx( const Word8 *deadzone_flags; Word16 gamma_w, gamma_uw; Word16 hm_bits; - Word32 L_tmp, L_tmp2; + Word32 L_tmp; + Word64 W_tmp2; Word16 tmp; TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; - move32(); - move32(); -#endif assert( L_spec <= N_MAX_ARI ); @@ -772,10 +757,10 @@ void tcx_arith_encode_envelope_fx( move16(); /* Multiply back the signs */ - L_tmp2 = L_deposit_l( 0 ); + W_tmp2 = 0; FOR( k = 0; k <= kMax; k++ ) { - L_tmp2 = L_macNs_co( L_tmp2, q_spectrum[k], k, &Carry, &Overflow ); + W_tmp2 = W_mac_16_16( W_tmp2, q_spectrum[k], k ); if ( signs[k] != 0 ) L_tmp = L_mult( q_spectrum[k], -( 1 << ( 30 - SPEC_EXP_DEC ) ) ); @@ -789,7 +774,7 @@ void tcx_arith_encode_envelope_fx( set32_fx( spectrum + k, 0, sub( s_max( L_frame, L_spec ), k ) ); /* noise filling seed */ - *nf_seed = extract_l( L_tmp2 ); + *nf_seed = extract_l( W_extract_l( W_tmp2 ) ); move16(); } diff --git a/lib_enc/avq_cod_fx.c b/lib_enc/avq_cod_fx.c index 962b715cd7a1068638db2451a6547556ac1c0eb8..d42ae6c4dfd4d2f1b5f48640de08a663fa8c9629 100644 --- a/lib_enc/avq_cod_fx.c +++ b/lib_enc/avq_cod_fx.c @@ -1,6 +1,7 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include #include "options.h" /* Compilation switches */ @@ -13,8 +14,8 @@ /*-------------------------------------------------------------------* * Local prototypes *-------------------------------------------------------------------*/ + static void wrte_cv( BSTR_ENC_HANDLE hBstr, const Word16 nq, const Word16 i_ind, const Word16 kv_ind, UWord16 I, Word16 kv[], Word16 *bits ); -static void wrte_cv_ivas_fx( BSTR_ENC_HANDLE hBstr, const Word16 nq, const Word16 i_ind, const Word16 kv_ind, UWord16 I, Word16 kv[], Word16 *bits ); /*-------------------------------------------------------------------* * Function AVQ_cod() * @@ -22,12 +23,13 @@ static void wrte_cv_ivas_fx( BSTR_ENC_HANDLE hBstr, const Word16 nq, const Word1 * Split algevraic vector quantizer (AVQ) base on RE8 latice * *-------------------------------------------------------------------*/ -void AVQ_cod_fx( /* o: comfort noise gain factor */ - const Word16 xri[], /* i: vector to quantize Qx*/ - Word16 xriq[], /* o: quantized normalized vector (assuming the bit budget is enough) */ - const Word16 NB_BITS, /* i: number of allocated bits */ - const Word16 Nsv, /* i: number of subvectors (lg=Nsv*8) */ - const Word16 Q_in_ref /* i: Scaling input */ +/* o: comfort noise gain factor */ +void AVQ_cod_fx( + const Word16 xri[], /* i : vector to quantize Qx*/ + Word16 xriq[], /* o : quantized normalized vector (assuming the bit budget is enough) */ + const Word16 NB_BITS, /* i : number of allocated bits */ + const Word16 Nsv, /* i : number of subvectors (lg=Nsv*8) */ + const Word16 Q_in_ref /* i : Scaling input */ ) { Word16 i, l, iter, c[8]; @@ -35,9 +37,7 @@ void AVQ_cod_fx( /* o: comfort noise gain factor Word16 ebits[NSV_MAX], e_ebits, f_ebits, e_tmp, f_tmp, tmp16, l_8; Word32 Lener, Ltmp, Lgain, x1[8]; Word16 tot_est_bits, Q_in; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif + Q_in = sub( Q_in_ref, 1 ); move16(); @@ -53,7 +53,7 @@ void AVQ_cod_fx( /* o: comfort noise gain factor Lener = L_shl( 4, shl( Q_in, 1 ) ); /* to set ebits >= 0 */ FOR( i = 0; i < 8; i++ ) { - Lener = L_mac_o( Lener, xri[l * 8 + i], xri[l * 8 + i], &Overflow ); + Lener = L_mac_sat( Lener, xri[l * 8 + i], xri[l * 8 + i] ); } /* estimated bit consumption when gain=1 */ /* ebits[l] = 5.0 * FAC_LOG2 * (Word16)log10(ener * 0.5) */ @@ -161,411 +161,13 @@ void AVQ_cod_fx( /* o: comfort noise gain factor * * Encode subvectors and write indexes into the bitstream *-----------------------------------------------------------------*/ -void AVQ_encmux_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - const Word16 extl, /* i : extension layer */ - Word16 xriq[], /* i/o: rounded subvectors [0..8*Nsv-1] followed - by rounded bit allocations [8*Nsv..8*Nsv+Nsv-1] */ - Word16 *nb_bits, /* i/o: number of allocated bits */ - const Word16 Nsv, /* i: number of subvectors */ - Word16 nq_out[], /* o : AVQ nq index */ - Word16 avq_bit_sFlag, /* i : flag for AVQ bit saving solution */ - Word16 trgtSvPos /* i : target SV for AVQ bit savings */ -) -{ - Word16 i, j = 0, bits, pos, pos_max, overflow, pos_tmp, bit_tmp; - Word16 sort_idx[NSV_MAX], nq[NSV_MAX], kv[NSV_MAX * 8]; - Word16 *t; - UWord16 I[NSV_MAX]; - Word16 nq_ind, i_ind, kv_ind; - Word16 nq_est, unused_bits, unused_bits_idx; - Word16 bitsMod, Nsvm1, Nsvm2; - Word16 unusedbitsFlag; - Word16 svOrder[NSV_MAX], k, nullVec, dummy_bits; - - test(); - IF( EQ_16( extl, SWB_BWE_HIGHRATE ) || EQ_16( extl, FB_BWE_HIGHRATE ) ) - { - nq_ind = IND_NQ2; - move16(); - i_ind = IND_I2; - move16(); - kv_ind = IND_KV2; - move16(); - } - ELSE - { - nq_ind = IND_NQ; - move16(); - i_ind = IND_I; - move16(); - kv_ind = IND_KV; - move16(); - } - - FOR( i = 0; i < NSV_MAX; i++ ) - { - I[i] = (UWord16) -1; - move16(); - } - unusedbitsFlag = 0; - bitsMod = 0; - move16(); - move16(); - /*----------------------------------------------------------------- - * Encode subvectors and fix possible overflows in total bit budget, - * i.e. find for each subvector a codebook index nq (nq=0,2,3,4,...,NSV_MAX), - * a base codebook index (I), and a Voronoi index (kv) - *-----------------------------------------------------------------*/ - - /* sort subvectors by estimated bit allocations in decreasing order */ - t = kv; - /* reuse vector to save memory */ - /*ptr init*/ - FOR( i = 0; i < Nsv; i++ ) - { - t[i] = xriq[8 * Nsv + i]; - move16(); - } - - FOR( i = 0; i < Nsv; i++ ) - { - bits = t[0]; - move16(); - pos = 0; - move16(); - FOR( j = 1; j < Nsv; j++ ) - { - if ( GT_16( t[j], bits ) ) - { - pos = j; - move16(); - } - bits = s_max( t[j], bits ); - } - sort_idx[i] = pos; - move16(); - t[pos] = -1; - move16(); - } - - /* compute multi-rate indices and avoid bit budget overflow */ - pos_max = 0; - move16(); - bits = 0; - move16(); - FOR( i = 0; i < Nsv; i++ ) - { - /* find vector to quantize (criteria: nb of estimated bits) */ - pos = sort_idx[i]; - move16(); - - /* compute multi-rate index of rounded subvector (nq,I,kv[]) */ - re8_cod_fx( &xriq[pos * 8], &nq[pos], &I[pos], &kv[8 * pos] ); - - IF( nq[pos] > 0 ) - { - j = pos_max; - move16(); - j = s_max( pos, j ); - - /* compute (number of bits -1) to describe Q #nq */ - IF( GE_16( nq[pos], 2 ) ) - { - overflow = sub( i_mult2( nq[pos], 5 ), 1 ); - } - ELSE - { - overflow = 0; - move16(); - } - - /* check for overflow and compute number of bits-1 (n) */ - IF( GT_16( add( bits, add( overflow, j ) ), *nb_bits ) ) - { - /* if budget overflow */ - pos_tmp = add( shl( pos, 3 ), 8 ); /*(pos*8)+8*/ - FOR( j = pos * 8; j < pos_tmp; j++ ) - { - xriq[j] = 0; - move16(); - } - nq[pos] = 0; - move16(); /* force Q0 */ - } - ELSE - { - bits = add( bits, overflow ); - pos_max = j; - move16(); /* update index of the last described subvector */ - } - } - } - nullVec = 0; - Nsvm1 = sub( Nsv, 1 ); - Nsvm2 = sub( Nsvm1, 1 ); - dummy_bits = 0; - svOrder[Nsvm1] = trgtSvPos; - svOrder[0] = 0; - svOrder[1] = 1; - i = 2; - j = i; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - if ( EQ_16( avq_bit_sFlag, 2 ) ) - { - j = add( i, 1 ); - } - WHILE( i < Nsvm1 ) - { - svOrder[i] = j; - move16(); - i++; /*ptr*/ - j = add( j, 1 ); - } - /* write indexes to the bitstream */ - /* ============================== */ - - bits = *nb_bits; - move16(); - overflow = 0; - move16(); - FOR( i = 0; i < Nsv; i++ ) - { - k = svOrder[i]; - move16(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( avq_bit_sFlag, 2 ) && EQ_16( s_and( bits, 4 ), 4 ) && GT_16( bits, 8 ) && LT_16( bits, 30 ) && GE_16( k, trgtSvPos ) && LT_16( i, Nsvm1 ) ) - { - ordr_esti( sub( Nsv, i ), &trgtSvPos, &svOrder[i], Nsv ); - k = svOrder[i]; - move16(); - avq_bit_sFlag = 1; - move16(); - } - - test(); - IF( EQ_16( k, trgtSvPos ) && avq_bit_sFlag > 0 ) - { - test(); - test(); - IF( EQ_16( sub( *nb_bits, bits ), 7 ) || LT_16( bits, BIT_SAVING_LOW_THR ) || GE_16( bits, BIT_SAVING_HIGH_THR ) ) - { - avq_bit_sFlag = 0; - move16(); - } - ELSE - { - BREAK; - } - } - - if ( EQ_16( sub( i_mult2( 5, nq[k] ), 1 ), bits ) ) /* check the overflow */ - { - overflow = 1; - move16(); - } - - IF( GT_16( bits, 8 ) ) - { - /* write the unary code for nq[i] */ - j = sub( nq[k], 1 ); - IF( nq[k] > 0 ) - { - /* write the unary code */ - FOR( ; j > 16; j -= 16 ) - { - push_indice_fx( hBstr, nq_ind, 65535, 16 ); - bits = sub( bits, 16 ); - } - - IF( j > 0 ) - { - push_indice_fx( hBstr, nq_ind, extract_l( L_sub( L_shl( 1L, j ), 1L ) ), j ); - bits = sub( bits, j ); - } - } - IF( !overflow ) - { - /* write the stop bit */ - push_indice_fx( hBstr, nq_ind, 0, 1 ); - bits = sub( bits, 1 ); - } - - wrte_cv( hBstr, nq[k], i_ind, kv_ind, I[k], &kv[k * 8], &bits ); - } - } /* for */ - /* Bit Saving Solution */ - test(); - IF( avq_bit_sFlag > 0 && GT_16( bits, 8 ) ) - { - // PMT("code not validated yet") - bitsMod = s_and( bits, 4 /*bits%5*/ ); - i = svOrder[Nsvm1]; - move16(); - IF( NE_16( i, Nsvm1 ) ) - { - nullVec = 0; - move16(); - FOR( j = i; j < Nsv - 1; j++ ) - { - if ( nq[svOrder[j]] == 0 ) - { - nullVec = add( nullVec, 1 ); - } - } - /*nq_est = bits / 5;*/ - nq_est = mult( bits, 6554 ); - assert( nq_est == bits / 5 ); - - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( bitsMod > 0 || ( EQ_16( nullVec, 4 ) && EQ_16( nq_est, 5 ) ) ) && NE_16( bitsMod, 4 ) && GE_16( add( bits, nullVec ), add( add( shl( nq_est, 2 ), nq_est ), 4 ) ) /*5 * nq_est + 4*/ && nq[svOrder[Nsvm2]] == 0 ) /* detect need for dummy bits */ - { - dummy_bits = sub( 5, bitsMod ); - bits = add( bits, dummy_bits ); /* add dummy bits */ - bitsMod = 0; - move16(); - } - ELSE IF( nq_est > 4 && ( ( bitsMod == 0 && GT_16( nullVec, 3 ) && GT_16( nullVec, 6 ) ) || ( EQ_16( bitsMod, 4 ) && EQ_16( nullVec, 5 ) ) ) && nq[svOrder[Nsvm2]] == 0 ) /* wasted bits 4, 5 for nq 6,7..*/ - { - overflow = 0; - move16(); - if ( s_and( add( bitsMod, nullVec ), 4 ) != 0 ) - { - overflow = 1; - move16(); - } - dummy_bits = add( nullVec, overflow ); - bits = add( bits, dummy_bits ); /* add dummy bits */ - bitsMod = 0; - move16(); - } - } - - overflow = 1; - move16(); - IF( NE_16( bitsMod, 4 ) ) - { - overflow = 0; - move16(); - bits = sub( bits, bitsMod ); - } - bits = add( bits, overflow ); /*add fake bit */ - unused_bits = sub( bits, add( shl( nq[i], 2 ), nq[i] ) ); - if ( nq[i] == 0 ) /*no bit savings*/ - { - unused_bits = sub( unused_bits, 1 ); /*Stop Bit*/ - } - /*unused_bits_idx = (int16_t)unused_bits / 5;*/ - unused_bits_idx = mult( unused_bits, 6554 ); - assert( unused_bits_idx == unused_bits / 5 ); - unusedbitsFlag = 0; - move16(); - IF( dummy_bits == 0 ) - { - test(); - test(); - IF( EQ_16( unused_bits_idx, 1 ) && GT_16( bits, BIT_SAVING_LOW_THR ) ) - { - unused_bits_idx = 0; - unusedbitsFlag = 1; - move16(); - move16(); - } - ELSE IF( unused_bits_idx == 0 && GT_16( bits, BIT_SAVING_LOW_THR ) ) - { - unused_bits_idx = 1; - unusedbitsFlag = -1; - move16(); - move16(); - } - } - - j = unused_bits_idx; - move16(); - /*Encode Unused Bit Unary Codeword */ - IF( j > 0 ) - { - /* write the unary code */ - push_indice_fx( hBstr, nq_ind, sub( shl( 1, j ), 1 ), j ); - } - - IF( nq[i] != 0 ) - { - /* write the stop bit */ - push_indice_fx( hBstr, nq_ind, 0, 1 ); - } - /*Compute AVQ code book number from unused Bits */ - bit_tmp = add( unusedbitsFlag, unused_bits_idx ); - /*nq_est = (int16_t)ceil(0.2f * (bits - 5 * (unusedbitsFlag + unused_bits_idx)));*/ - nq_est = mult( 6554, sub( bits, add( shl( bit_tmp, 2 ), bit_tmp ) ) ); - assert( (Word16) ceil( 0.2f * ( bits - 5 * ( unusedbitsFlag + unused_bits_idx ) ) ) == nq_est ); - - if ( EQ_16( nq_est, 1 ) ) - { - nq_est = 0; - move16(); - } - bits = sub( bits, overflow ); - - bits = sub( bits, j ); - - if ( nq_est != 0 ) - { - bits = sub( bits, 1 ); - } - nq[i] = nq_est; - move16(); - - /* write codebook indices (rank I and event. Voronoi index kv) */ - wrte_cv( hBstr, nq[i], i_ind, kv_ind, I[i], &kv[i * 8], &bits ); - - bits = sub( bits, dummy_bits ); - - if ( NE_16( bitsMod, 4 ) ) - { - bits = add( bits, bitsMod ); - } - } - *nb_bits = bits; - move16(); - - FOR( i = 0; i < Nsv; i++ ) - { - nq_out[i] = nq[i]; - move16(); - } - - return; -} - -void AVQ_encmux_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ +void AVQ_encmux_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ const Word16 extl, /* i : extension layer */ - Word16 xriq[], /* i/o: rounded subvectors [0..8*Nsv-1] followed - by rounded bit allocations [8*Nsv..8*Nsv+Nsv-1] */ + Word16 xriq[], /* i/o: rounded subvectors [0..8*Nsv-1] followed by rounded bit allocations [8*Nsv..8*Nsv+Nsv-1] */ Word16 *nb_bits, /* i/o: number of allocated bits */ - const Word16 Nsv, /* i: number of subvectors */ + const Word16 Nsv, /* i : number of subvectors */ Word16 nq_out[], /* o : AVQ nq index */ Word16 avq_bit_sFlag, /* i : flag for AVQ bit saving solution */ Word16 trgtSvPos /* i : target SV for AVQ bit savings */ @@ -720,7 +322,7 @@ void AVQ_encmux_ivas_fx( { j = add( i, 1 ); } - WHILE( LT_16( i, Nsvm1 ) ) + WHILE( i < Nsvm1 ) { svOrder[i] = j; move16(); @@ -751,6 +353,7 @@ void AVQ_encmux_ivas_fx( } assert( tmp == bits % 5 ); IF( EQ_16( avq_bit_sFlag, 2 ) && EQ_16( tmp, 4 ) && GT_16( bits, 8 ) && LT_16( bits, 30 ) && GE_16( k, trgtSvPos ) && LT_16( i, Nsvm1 ) ) + { ordr_esti( sub( Nsv, i ), &trgtSvPos, &svOrder[i], Nsv ); k = svOrder[i]; @@ -807,15 +410,14 @@ void AVQ_encmux_ivas_fx( bits = sub( bits, 1 ); } - wrte_cv_ivas_fx( hBstr, nq[k], i_ind, kv_ind, I[k], &kv[k * 8], &bits ); + wrte_cv( hBstr, nq[k], i_ind, kv_ind, I[k], &kv[k * 8], &bits ); } } /* for */ /* Bit Saving Solution */ test(); IF( avq_bit_sFlag > 0 && GT_16( bits, 8 ) ) { - // PMT("code not validated yet") - // bitsMod = bits%5; + /* bitsMod = bits % 5;*/ bitsMod = bits; move16(); WHILE( bitsMod >= 5 ) @@ -831,13 +433,13 @@ void AVQ_encmux_ivas_fx( move16(); FOR( j = i; j < Nsv - 1; j++ ) { - IF( nq[svOrder[j]] == 0 ) + if ( nq[svOrder[j]] == 0 ) { nullVec = add( nullVec, 1 ); } } /*nq_est = bits / 5;*/ - nq_est = mult( bits, 6554 /*1/5 in Q15*/ ); + nq_est = mult( bits, 6554 ); assert( nq_est == bits / 5 ); test(); @@ -850,7 +452,7 @@ void AVQ_encmux_ivas_fx( test(); test(); test(); - + test(); IF( ( bitsMod > 0 || ( EQ_16( nullVec, 4 ) && EQ_16( nq_est, 5 ) ) ) && NE_16( bitsMod, 4 ) && GE_16( add( bits, nullVec ), add( add( shl( nq_est, 2 ), nq_est ), 4 ) ) /*5 * nq_est + 4*/ && nq[svOrder[Nsvm2]] == 0 ) /* detect need for dummy bits */ { dummy_bits = sub( 5, bitsMod ); @@ -890,7 +492,7 @@ void AVQ_encmux_ivas_fx( } bits = add( bits, overflow ); /*add fake bit */ unused_bits = sub( bits, add( shl( nq[i], 2 ), nq[i] ) ); - IF( nq[i] == 0 ) /*no bit savings*/ + if ( nq[i] == 0 ) /*no bit savings*/ { unused_bits = sub( unused_bits, 1 ); /*Stop Bit*/ } @@ -933,7 +535,6 @@ void AVQ_encmux_ivas_fx( { /* write the unary code */ push_indice( hBstr, nq_ind, u_extract_l( L_sub( L_shl_sat( 1, j ), 1 ) ), j ); - assert( abs( ( 1 << j ) - 1 ) <= 65536 ); } IF( nq[i] != 0 ) @@ -945,7 +546,7 @@ void AVQ_encmux_ivas_fx( /*Compute AVQ code book number from unused Bits */ bit_tmp = add( unusedbitsFlag, unused_bits_idx ); /*nq_est = (int16_t)ceil(0.2f * (bits - 5 * (unusedbitsFlag + unused_bits_idx)));*/ - nq_est = mult( 6554 /*.2 in Q15*/, sub( bits, add( shl( bit_tmp, 2 ), bit_tmp ) ) ); + nq_est = mult( 6554, sub( bits, add( shl( bit_tmp, 2 ), bit_tmp ) ) ); assert( (Word16) ceil( 0.2f * ( bits - 5 * ( unusedbitsFlag + unused_bits_idx ) ) ) == nq_est ); if ( EQ_16( nq_est, 1 ) ) @@ -957,7 +558,7 @@ void AVQ_encmux_ivas_fx( bits = sub( bits, j ); - IF( nq_est != 0 ) + if ( nq_est != 0 ) { bits = sub( bits, 1 ); } @@ -965,11 +566,11 @@ void AVQ_encmux_ivas_fx( move16(); /* write codebook indices (rank I and event. Voronoi index kv) */ - wrte_cv_ivas_fx( hBstr, nq[i], i_ind, kv_ind, I[i], &kv[i * 8], &bits ); + wrte_cv( hBstr, nq[i], i_ind, kv_ind, I[i], &kv[i * 8], &bits ); bits = sub( bits, dummy_bits ); - IF( NE_16( bitsMod, 4 ) ) + if ( NE_16( bitsMod, 4 ) ) { bits = add( bits, bitsMod ); } @@ -986,8 +587,9 @@ void AVQ_encmux_ivas_fx( return; } + /*-------------------------------------------------------------------* - * Function AVQ_cod_lpc_fx() * + * Function AVQ_cod_lpc_fx() * * * * Split algebraic vector quantizer (AVQ) for LPC quantization * *-------------------------------------------------------------------*/ @@ -1091,66 +693,6 @@ static void wrte_cv( bits = *nbits; move16(); - /* write codebook indices (rank I and event. Voronoi index kv) */ - IF( nq == 0 ) /* Q0 */ - { - /* nothing to write */ - } - ELSE IF( LT_16( nq, 5 ) ) /* Q2, Q3, Q4 */ - { - nq4 = shl( nq, 2 ); - push_indice_fx( hBstr, i_ind, I, nq4 ); - bits = sub( bits, nq4 ); - } - ELSE IF( EQ_16( s_and( nq, 1 ), 0 ) ) /* Q4 + Voronoi extensions r=1,2,3,... */ - { - push_indice_fx( hBstr, i_ind, I, 4 * 4 ); - bits = sub( bits, 4 * 4 ); - /*pos = (int16_t)(nq / 2 - 2);*/ /* Voronoi order determination */ - pos = sub( shr( nq, 1 ), 2 ); - FOR( j = 0; j < 8; j++ ) - { - push_indice_fx( hBstr, kv_ind, kv[j], pos ); - } - - bits = sub( bits, shl( pos, 3 ) ); - } - ELSE /* Q3 + Voronoi extensions r=1,2,3,... */ - { - push_indice_fx( hBstr, i_ind, I, 4 * 3 ); - bits = sub( bits, 4 * 3 ); - - /*pos = (int16_t)(nq / 2 - 1);*/ /* Voronoi order determination */ - pos = sub( shr( nq, 1 ), 1 ); - FOR( j = 0; j < 8; j++ ) - { - push_indice_fx( hBstr, kv_ind, kv[j], pos ); - } - - bits = sub( bits, shl( pos, 3 ) ); - } - - *nbits = bits; - move16(); - return; -} - -static void wrte_cv_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 nq, /* i : AVQ nq index */ - const Word16 i_ind, /* i : Base Bitstream index */ - const Word16 kv_ind, /* i : Vornoi Bitstream index */ - UWord16 I, /* o : rank I code book index */ - Word16 kv[], /* o : Vornoi index kv */ - Word16 *nbits /* i/o: bits */ -) -{ - Word16 pos, j; - Word16 bits, nq4; - - bits = *nbits; - move16(); - /* write codebook indices (rank I and event. Voronoi index kv) */ IF( nq == 0 ) /* Q0 */ { diff --git a/lib_enc/bass_psfilter_enc_fx.c b/lib_enc/bass_psfilter_enc_fx.c index a1d672fe0059f3a6971fa0fb7f6bb6800745d88a..083f8d68ed6a09e1b57cf14253695d9fadd9e301 100644 --- a/lib_enc/bass_psfilter_enc_fx.c +++ b/lib_enc/bass_psfilter_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -36,11 +36,6 @@ Word16 bass_pf_enc_fx( Word32 cross_n_d, nrg_n; const Word16 *pFilt; Word32 ener2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - IF( NE_16( l_frame, L_FRAME16k ) ) { @@ -129,7 +124,7 @@ Word16 bass_pf_enc_fx( /* gain = tmp/nrg; */ gain = BASOP_Util_Divide3232_Scale( tmp, nrg, &tmp16 ); BASOP_SATURATE_WARNING_OFF_EVS; - gain = shl_o( gain, tmp16, &Overflow ); /* Q15 */ + gain = shl_sat( gain, tmp16 ); /* Q15 */ BASOP_SATURATE_WARNING_ON_EVS; if ( gain < 0 ) @@ -153,14 +148,14 @@ Word16 bass_pf_enc_fx( FOR( i = 0; i < lg; i++ ) { tmp32 = L_msu0( 0, gain, syn[i + i_subfr - T] ); - tmp32 = L_msu0_o( tmp32, gain, syn[i + i_subfr + T], &Overflow ); - tmp16 = mac_ro( tmp32, gain, syn[i + i_subfr], &Overflow ); /* Q0 */ + tmp32 = L_msu0_sat( tmp32, gain, syn[i + i_subfr + T] ); + tmp16 = mac_r_sat( tmp32, gain, syn[i + i_subfr] ); /* Q0 */ lp_error = Mpy_32_16_1( lp_error, 29491 /*0.9f Q15*/ ); - lp_error = L_mac_o( lp_error, tmp16, 0x1000, &Overflow ); /* Q13 */ + lp_error = L_mac_sat( lp_error, tmp16, 0x1000 ); /* Q13 */ - tmp16 = round_fx_o( L_shl_o( lp_error, s1, &Overflow ), &Overflow ); /* Q0+s1-3 */ - ener2 = L_mac0_o( ener2, tmp16, tmp16, &Overflow ); /* Q0+(s1-3)*2 */ + tmp16 = round_fx_sat( L_shl_sat( lp_error, s1 ) ); /* Q0+s1-3 */ + ener2 = L_mac0_sat( ener2, tmp16, tmp16 ); /* Q0+(s1-3)*2 */ } } @@ -169,13 +164,13 @@ Word16 bass_pf_enc_fx( FOR( i = lg; i < l_subfr; i++ ) { tmp32 = L_mult0( gain, syn[i + i_subfr] ); - tmp32 = L_msu0_o( tmp32, gain, syn[i + i_subfr - T], &Overflow ); /* Q0 */ - tmp16 = round_fx_o( tmp32, &Overflow ); + tmp32 = L_msu0_sat( tmp32, gain, syn[i + i_subfr - T] ); /* Q0 */ + tmp16 = round_fx_sat( tmp32 ); lp_error = Mpy_32_16_1( lp_error, 29491 /*0.9f Q15*/ ); - lp_error = L_mac_o( lp_error, tmp16, 0x1000, &Overflow ); /* Q13 */ + lp_error = L_mac_sat( lp_error, tmp16, 0x1000 ); /* Q13 */ - tmp16 = round_fx_o( L_shl_o( lp_error, s1, &Overflow ), &Overflow ); /* Q0+s1-3 */ - ener2 = L_mac0_o( ener2, tmp16, tmp16, &Overflow ); /* Q0+(s1-3)*2 */ + tmp16 = round_fx_sat( L_shl_sat( lp_error, s1 ) ); /* Q0+s1-3 */ + ener2 = L_mac0_sat( ener2, tmp16, tmp16 ); /* Q0+(s1-3)*2 */ } } @@ -210,7 +205,7 @@ Word16 bass_pf_enc_fx( tmp32 = L_deposit_l( 1 ); tmp16 = BASOP_Util_Divide3232_Scale( tmp, tmp32, &st ); BASOP_SATURATE_WARNING_OFF_EVS; - tmp16 = shl_o( tmp16, sub( st, 2 ), &Overflow ); /* Q15 */ + tmp16 = shl_sat( tmp16, sub( st, 2 ) ); /* Q15 */ if ( GT_16( tmp16, 16384 /*0.5f Q15*/ ) ) { @@ -236,7 +231,7 @@ Word16 bass_pf_enc_fx( tmp32 = L_mac( tmp32, tmp16, syn[i + i_subfr] ); noise_in[i] = round_fx( L_shl( tmp32, s2 ) ); /* Q0+s2 */ - error_in[i] = sub_o( orig[i + i_subfr], syn[i + i_subfr], &Overflow ); /*Q0*/ + error_in[i] = sub_sat( orig[i + i_subfr], syn[i + i_subfr] ); /*Q0*/ move16(); } } @@ -250,7 +245,7 @@ Word16 bass_pf_enc_fx( noise_in[i] = round_fx( L_shl( tmp32, s2 ) ); /* Q0+s2 */ move16(); - error_in[i] = sub_o( orig[i + i_subfr], syn[i + i_subfr], &Overflow ); /*Q0*/ + error_in[i] = sub_sat( orig[i + i_subfr], syn[i + i_subfr] ); /*Q0*/ move16(); } } @@ -269,11 +264,7 @@ Word16 bass_pf_enc_fx( st = sub( s2, s2_old ); FOR( i = 0; i < tmp16; i++ ) { -#ifdef FIX_ISSUE_1187 noise_buf[i] = shl_sat( mem_bpf->noise_buf[i], st ); -#else - noise_buf[i] = shl( mem_bpf->noise_buf[i], st ); -#endif move16(); } Copy( noise_buf + l_subfr, mem_bpf->noise_buf, tmp16 ); diff --git a/lib_enc/bw_detect_fx.c b/lib_enc/bw_detect_fx.c index 2e9b2c5db1fa63e6e80f58b43617227bab6bd2cb..acf0d322a6915ccd60eddcbe1711ebf81279401e 100644 --- a/lib_enc/bw_detect_fx.c +++ b/lib_enc/bw_detect_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -41,21 +41,21 @@ void bw_detect_fx( Encoder_State *st, /* i/o: Encoder State */ const Word16 signal_in[], /* i : input signal */ - Word16 *spectrum, /* i : MDCT spectrum */ + Word16 *spectrum, /* i : MDCT spectrum Q_spec */ const Word32 *enerBuffer, /* i : CLDFB Energy Q31 */ const Word16 *cldfbBuf_Ener_Exp, /* i : CLDFB Energy Exponent */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word16 mct_on /* i : flag MCT mode */ -) + const Word16 mct_on, /* i : flag MCT mode */ + const Word16 Q_spec ) { - Word16 Q_dct; + Word16 Q_dct, E_spect_bin, tmp_1; Word16 i, j, k, bw_max, bin_width, n_bins; Word16 max_NB, max_WB, max_SWB, max_FB, mean_NB, mean_WB, mean_SWB, mean_FB; /* Q11*/ const Word16 *pt, *pt1; Word16 spect[L_FRAME48k], spect_bin[BWD_N_BINS_MAX]; Word32 spect32[L_FRAME48k], in_win32[BWD_TOTAL_WIDTH]; Word16 e_tmp, f_tmp; - Word32 L_tmp, sum32; + Word32 L_tmp, sum32, L_tmp_q_shift; Word32 L_tmp1, L_tmp2, L_tmp3; Word16 scale; @@ -67,10 +67,7 @@ void bw_detect_fx( const Word32 *pt32; Word32 max_NB32, max_WB32, max_SWB32, max_FB32, mean_NB32, mean_WB32, mean_SWB32, mean_FB32; /* Q11*/ /* we need Word32 for the new cldfb energy vectors */ Word16 bwd_count_wider_bw; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + Word16 lp_noise_fx; bwd_count_wider_bw = BWD_COUNT_WIDER_BW; move16(); @@ -120,16 +117,19 @@ void bw_detect_fx( move32(); /* Q31 */ cldfb_bin_Exp[0] = add( cldfb_bin_Exp[0], CLDFBscalingFactor_EXP ); move16(); - - if ( cldfb_bin[i] == 0 ) + if ( cldfb_bin[0] == 0 ) { - cldfb_bin[i] = L_deposit_l( 1 ); + cldfb_bin[0] = L_deposit_l( 1 ); move32(); } - L_tmp = BASOP_Util_Log2( cldfb_bin[0] ); /*(log2(660423549*2^(-31))/64)*2^31*/ - L_tmp = L_add_o( L_tmp, L_shl( L_deposit_l( cldfb_bin_Exp[0] ), 31 - LD_DATA_SCALE ), &Overflow ); /* Q25 */ - cldfb_bin[0] = Mpy_32_16_1( L_tmp, 9864 /*1.0f/3.3219280948873623478703194294894f Q15*/ ); - move32(); /* 1/log2(10) */ /* Q25 */ + L_tmp = BASOP_Util_Log2( cldfb_bin[0] ); /*(log2(660423549*2^(-31))/64)*2^31*/ + L_tmp = Mpy_32_16_1( L_tmp, INV_LOG2_10 ); // instead of adding it to L_tmp_q_shift and then multiplying by INV_LOG2_10 ( to avoid saturation ). + + L_tmp_q_shift = L_shl_sat( L_deposit_l( cldfb_bin_Exp[0] ), 31 - LD_DATA_SCALE ); // This term should be added to L_temp to align it to Q25 + L_tmp_q_shift = Mpy_32_16_1( L_tmp_q_shift, INV_LOG2_10 ); // instead of adding it to L_tmp and then multiplying by INV_LOG2_10 ( to avoid saturation ). + + cldfb_bin[0] = L_add( L_tmp, L_tmp_q_shift ); /* Q25 */ + move32(); /* 1/log2(10) */ /* Q25 */ /* WB: 4.4 - 7.2 kHz, 8 cldfb-bands, mid band(14) counted twice */ IF( GE_32( st->input_Fs, 16000 ) ) @@ -156,10 +156,14 @@ void bw_detect_fx( cldfb_bin[i] = L_deposit_l( 1 ); move32(); } - L_tmp = BASOP_Util_Log2( cldfb_bin[i] ); /*(log2(660423549*2^(-31))/64)*2^31*/ - L_tmp = L_add( L_tmp, L_shl( L_deposit_l( cldfb_bin_Exp[i] ), 31 - LD_DATA_SCALE ) ); /* Q25 */ - cldfb_bin[i] = Mpy_32_16_1( L_tmp, 9864 /*1.0f/3.3219280948873623478703194294894f Q15*/ ); - move32(); /* 1/log2(10) */ /* Q25 */ + L_tmp = BASOP_Util_Log2( cldfb_bin[i] ); /*(log2(660423549*2^(-31))/64)*2^31*/ + L_tmp = Mpy_32_16_1( L_tmp, INV_LOG2_10 ); // instead of adding it to L_tmp_q_shift and then multiplying by INV_LOG2_10 ( to avoid saturation ). + + L_tmp_q_shift = L_shl_sat( L_deposit_l( cldfb_bin_Exp[i] ), 31 - LD_DATA_SCALE ); // This term should be added to L_temp to align it to Q25 + L_tmp_q_shift = Mpy_32_16_1( L_tmp_q_shift, INV_LOG2_10 ); // instead of adding it to L_tmp and then multiplying by INV_LOG2_10 ( to avoid saturation ). + + cldfb_bin[i] = L_add( L_tmp, L_tmp_q_shift ); /* Q25 */ + move32(); /* 1/log2(10) */ /* Q25 */ } } @@ -195,10 +199,14 @@ void bw_detect_fx( cldfb_bin[i] = L_deposit_l( 1 ); move32(); } - L_tmp = BASOP_Util_Log2( cldfb_bin[i] ); /*(log2(660423549*2^(-31))/64)*2^31*/ - L_tmp = L_add( L_tmp, L_shl( L_deposit_l( cldfb_bin_Exp[i] ), 31 - LD_DATA_SCALE ) ); /* Q25 */ - cldfb_bin[i] = Mpy_32_16_1( L_tmp, 9864 /*1.0f/3.3219280948873623478703194294894f Q15*/ ); - move32(); /* 1/log2(10) */ /* Q25 */ + L_tmp = BASOP_Util_Log2( cldfb_bin[i] ); /*(log2(660423549*2^(-31))/64)*2^31*/ + L_tmp = Mpy_32_16_1( L_tmp, INV_LOG2_10 ); // instead of adding it to L_tmp_q_shift and then multiplying by INV_LOG2_10 ( to avoid saturation ). + + L_tmp_q_shift = L_shl_sat( L_deposit_l( cldfb_bin_Exp[i] ), 31 - LD_DATA_SCALE ); // This term should be added to L_temp to align it to Q25 + L_tmp_q_shift = Mpy_32_16_1( L_tmp_q_shift, INV_LOG2_10 ); // instead of adding it to L_tmp and then multiplying by INV_LOG2_10 ( to avoid saturation ). + + cldfb_bin[i] = L_add( L_tmp, L_tmp_q_shift ); /* Q25 */ + move32(); /* 1/log2(10) */ /* Q25 */ } } @@ -228,10 +236,14 @@ void bw_detect_fx( cldfb_bin[i] = L_deposit_l( 1 ); move32(); } - L_tmp = BASOP_Util_Log2( cldfb_bin[i] ); /*(log2(660423549*2^(-31))/64)*2^31*/ - L_tmp = L_add( L_tmp, L_shl( L_deposit_l( cldfb_bin_Exp[i] ), 31 - LD_DATA_SCALE ) ); /* Q25 */ - cldfb_bin[i] = Mpy_32_16_1( L_tmp, 9864 /*1.0f/3.3219280948873623478703194294894f Q15*/ ); - move32(); /* 1/log2(10) */ /* Q25 */ + L_tmp = BASOP_Util_Log2( cldfb_bin[i] ); /*(log2(660423549*2^(-31))/64)*2^31*/ + L_tmp = Mpy_32_16_1( L_tmp, INV_LOG2_10 ); // instead of adding it to L_tmp_q_shift and then multiplying by INV_LOG2_10 ( to avoid saturation ). + + L_tmp_q_shift = L_shl_sat( L_deposit_l( cldfb_bin_Exp[i] ), 31 - LD_DATA_SCALE ); // This term should be added to L_temp to align it to Q25 + L_tmp_q_shift = Mpy_32_16_1( L_tmp_q_shift, INV_LOG2_10 ); // instead of adding it to L_tmp and then multiplying by INV_LOG2_10 ( to avoid saturation ). + + cldfb_bin[i] = L_add( L_tmp, L_tmp_q_shift ); /* Q25 */ + move32(); /* 1/log2(10) */ /* Q25 */ } } /* cldfb_bin_Exp[] are applied now in cldfb_bin[i] -> don't use again */ @@ -296,7 +308,7 @@ void bw_detect_fx( FOR( i = 0; i < BWD_TOTAL_WIDTH; i++ ) { - spect[i] = round_fx_o( L_shr_o( spect32[i], Q_dct, &Overflow ), &Overflow ); + spect[i] = round_fx_sat( L_shr_sat( spect32[i], Q_dct ) ); move16(); } Q_dct = -2; @@ -312,6 +324,11 @@ void bw_detect_fx( bin_width = i_mult( bin_width, l_frame / BWD_TOTAL_WIDTH ); Copy( spectrum, spect, l_frame ); + if ( st->element_mode != EVS_MONO ) + { + Q_dct = Q_spec; + move16(); + } } /*---------------------------------------------------------------------* * compute energy per spectral bins @@ -319,6 +336,7 @@ void bw_detect_fx( set16_fx( spect_bin, 1, n_bins ); Q_dct = shl( Q_dct, 1 ); + E_spect_bin = sub( Q31, Q_dct ); FOR( k = 0; k <= bw_max; k++ ) { @@ -328,27 +346,36 @@ void bw_detect_fx( pt1 = &spect[i_mult2( i, bin_width )]; FOR( j = 0; j < bin_width; j++ ) { - sum32 = L_mac0_o( sum32, *pt1, *pt1, &Overflow ); + sum32 = L_mac0_sat( sum32, *pt1, *pt1 ); pt1++; } - - IF( LE_32( sum32, 1 ) ) + tmp_1 = BASOP_Util_Cmp_Mant32Exp( sum32, E_spect_bin, MAX_32, Q31 - 41 ); /* Any sum32 in Q_dct if it is less than MAX_32 in Q41 will be less than 0.001 */ + test(); + IF( st->element_mode != EVS_MONO && tmp_1 < 0 ) { - /*deal with zero spectrum*/ - spect_bin[i] = -1; + spect_bin[i] = -6144; /* log10f( 0.00100000005 ) in Q11 */ move16(); } ELSE { - /* spect_bin[i] = (float)log10(spect_bin[i]); - = log2(spect_bin[i])*log10(2); */ - e_tmp = norm_l( sum32 ); - L_tmp = L_shl( sum32, e_tmp ); - f_tmp = Log2_norm_lc( L_tmp ); - e_tmp = sub( sub( 30, e_tmp ), Q_dct ); - L_tmp = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - spect_bin[i] = round_fx( L_shl( L_tmp, 11 ) ); /* Q11 */ - move16(); + IF( LE_32( sum32, 1 ) ) + { + /*deal with zero spectrum*/ + spect_bin[i] = -1; + move16(); + } + ELSE + { + /* spect_bin[i] = (float)log10(spect_bin[i]); + = log2(spect_bin[i])*log10(2); */ + e_tmp = norm_l( sum32 ); + L_tmp = L_shl( sum32, e_tmp ); + f_tmp = Log2_norm_lc( L_tmp ); + e_tmp = sub( sub( 30, e_tmp ), Q_dct ); + L_tmp = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + spect_bin[i] = round_fx( L_shl( L_tmp, 11 ) ); /* Q11 */ + move16(); + } } } } @@ -517,7 +544,17 @@ void bw_detect_fx( /*if( localVAD || st->lp_noise > 30 )*/ test(); - IF( st->localVAD || GT_16( st->lp_noise_fx, 7680 /*30 in Q8*/ ) ) + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + lp_noise_fx = st->lp_noise_fx; + move16(); + } + ELSE + { + lp_noise_fx = extract_h( st->lp_noise_32fx ); + } + + IF( st->localVAD || GT_32( ( lp_noise_fx ), 7680 /*30 in Q8*/ ) ) { /*st->lt_mean_NB_fx = ALPHA_BWD * st->lt_mean_NB_fx + (1-ALPHA_BWD) * mean_NB;*/ L_tmp = L_mult( ALPHA_BWD_FX, st->lt_mean_NB_fx ); /* Q15 * Q11 -> Q27 */ @@ -903,6 +940,7 @@ void bw_detect_fx( return; } + /*-------------------------------------------------------------------* * set_bw_fx() * @@ -937,7 +975,6 @@ void set_bw_fx( test(); IF( GT_16( element_mode, IVAS_SCE ) ) { - // PMT("this IVAS_SCE section has not been verified ") IF( LT_32( element_brate, MIN_BRATE_SWB_STEREO ) ) { st->bwidth = WB; @@ -1138,15 +1175,20 @@ Word16 set_bw_mct_fx( { bw_changed = 1; move16(); + } - FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + /* + * always set bw for all CPEs even if it is the same value as before, + * in case of bw + br switching when changing to MCT, this overwrites + * potentially incorrect initial values + */ + FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = hCPE[cpe_id]->hCoreCoder[ch]; - st->bwidth = mct_bwidth; - move16(); - } + st = hCPE[cpe_id]->hCoreCoder[ch]; + st->bwidth = mct_bwidth; + move16(); } } return bw_changed; diff --git a/lib_enc/cng_enc_fx.c b/lib_enc/cng_enc_fx.c index 99e99bef7cebae933d58f043ed7f6a2e071c7245..e51dd4884a0c67da51b2261aa6754de2c62cd071 100644 --- a/lib_enc/cng_enc_fx.c +++ b/lib_enc/cng_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -108,11 +108,6 @@ void CNG_enc_fx( st_lp_sp_enr = hTdCngEnc->lp_sp_enr_fx; move16(); Word16 lp_ener_thr_scale; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - /* Temp variables for floating point functions */ lp_ener_thr_scale = 8; /* 4.0f*/ /*IVAS_CODE Q2 */ move16(); @@ -462,7 +457,6 @@ void CNG_enc_fx( IF( hTdCngEnc->burst_ho_cnt > 0 ) { /**allow_cn_step |= ( hTdCngEnc->ho_ener_hist_fx[hTdCngEnc->ho_hist_ptr] > 4 * hTdCngEnc->lp_ener_fx ); */ -#if 1 /*allow_cn_step |= (hDtxEnc->first_CNG || st->element_mode == EVS_MONO) && (hTdCngEnc->ho_ener_hist[hTdCngEnc->ho_hist_ptr] > lp_ener_thr_scale * hTdCngEnc->lp_ener);*/ /* (hTdCngEnc->ho_ener_hist[hTdCngEnc->ho_hist_ptr] > lp_ener_thr_scale * hTdCngEnc->lp_ener); */ L_tmp1 = L_shr( hTdCngEnc->ho_ener_hist_fx[hTdCngEnc->ho_hist_ptr], 2 ); @@ -471,10 +465,6 @@ void CNG_enc_fx( L_tmp1 = L_add( L_tmp1, L_shr( hTdCngEnc->lp_ener_fx, 8 ) ); } L_tmp1 = L_sub( L_tmp1, hTdCngEnc->lp_ener_fx ); -#else - L_tmp1 = L_shr( hTdCngEnc->ho_ener_hist_fx[hTdCngEnc->ho_hist_ptr], 2 ); - L_tmp1 = L_sub( L_tmp1, hTdCngEnc->lp_ener_fx ); -#endif test(); test(); IF( ( hDtxEnc->first_CNG > 0 || st_fx->element_mode == EVS_MONO ) && L_tmp1 > 0 ) @@ -640,7 +630,7 @@ void CNG_enc_fx( FOR( i = 0; i < M; i++ ) { dev = abs_s( sub( lsp_tmp[i], lsp_new[i] ) ); /*Q15 */ - dist = add_o( dist, dev, &Overflow ); /*Q15 */ + dist = add_sat( dist, dev ); /*Q15 */ if ( GT_16( dev, max_dev ) ) { max_dev = dev; @@ -770,10 +760,10 @@ void CNG_enc_fx( FOR( i = 0; i < NUM_ENV_CNG; i++ ) { /* env[i] = 2.0f*(*ptR * *ptR + *ptI * *ptI)/L_FFT; */ - L_tmp = L_mult_o( *ptR, *ptR, &Overflow ); /* 2*Q_new+1 */ - L_tmp = L_add_o( L_tmp, L_mult_o( *ptI, *ptI, &Overflow ), &Overflow ); /* 2*Q_new+1 */ - L_tmp = L_add_o( L_tmp, L_tmp, &Overflow ); /* 2*Q_new+1 */ - L_tmp = Mult_32_16( L_tmp, 128 ); /* 2*Q_new+1 */ + L_tmp = L_mult_sat( *ptR, *ptR ); /* 2*Q_new+1 */ + L_tmp = L_add_sat( L_tmp, L_mult_sat( *ptI, *ptI ) ); /* 2*Q_new+1 */ + L_tmp = L_add_sat( L_tmp, L_tmp ); /* 2*Q_new+1 */ + L_tmp = Mult_32_16( L_tmp, 128 ); /* 2*Q_new+1 */ tmp1 = add( add( Q_new, Q_new ), 1 ); env[i] = L_shr( L_tmp, sub( tmp1, 6 ) ); move32(); /* Q6 */ @@ -975,7 +965,7 @@ void CNG_enc_fx( hTdCngEnc->old_enr_index = enr_index; move16(); - push_indice_fx( hBstr, IND_ENERGY, enr_index, num_bits ); + push_indice( hBstr, IND_ENERGY, enr_index, num_bits ); if ( enr_index == 0 ) { enr_index = -5; @@ -1051,7 +1041,7 @@ void CNG_enc_fx( exp = norm_l( L_tmp ); L_tmp = L_shl( L_tmp, exp ); /*Q(exp+6)*/ tmp1 = extract_h( L_tmp ); /*Q(exp+6-16)=exp-10*/ - L_tmp = L_mult_o( tmp1, tmp1, &Overflow ); /*Q(2*exp - 19)*/ + L_tmp = L_mult_sat( tmp1, tmp1 ); /*Q(2*exp - 19)*/ L_tmp = L_shr( L_tmp, sub( add( exp, exp ), 36 ) ); /* Q17 */ d = L_add( d, L_tmp ); } @@ -1063,7 +1053,7 @@ void CNG_enc_fx( move16(); } } - push_indice_fx( hBstr, IND_CNG_ENV1, min1_idx, 6 ); + push_indice( hBstr, IND_CNG_ENV1, min1_idx, 6 ); /* get quantized res_env_details */ FOR( i = 0; i < NUM_ENV_CNG; i++ ) { @@ -1122,28 +1112,28 @@ void CNG_enc_fx( /* dithering bit for AMR-WB IO mode is always set to 0 */ IF( EQ_32( st_fx->core_brate, SID_1k75 ) ) { - push_indice_fx( hBstr, IND_DITHERING, 0, 1 ); + push_indice( hBstr, IND_DITHERING, 0, 1 ); } IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) { IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) { - push_indice_fx( hBstr, IND_ACELP_16KHZ, 1, 1 ); + push_indice( hBstr, IND_ACELP_16KHZ, 1, 1 ); } ELSE { - push_indice_fx( hBstr, IND_ACELP_16KHZ, 0, 1 ); + push_indice( hBstr, IND_ACELP_16KHZ, 0, 1 ); } - push_indice_fx( hBstr, IND_CNG_HO, s_min( hTdCngEnc->burst_ho_cnt, 7 ), 3 ); + push_indice( hBstr, IND_CNG_HO, s_min( hTdCngEnc->burst_ho_cnt, 7 ), 3 ); hTdCngEnc->num_ho = m; move16(); - push_indice_fx( hBstr, IND_SID_TYPE, 0, 1 ); + push_indice( hBstr, IND_SID_TYPE, 0, 1 ); test(); IF( LT_32( st_fx->input_Fs, 32000 ) && NE_16( st_fx->element_mode, IVAS_CPE_DFT ) ) { - push_indice_fx( hBstr, IND_SID_BW, 0, 1 ); + push_indice( hBstr, IND_SID_BW, 0, 1 ); *sid_bw = 0; move16(); } @@ -1238,10 +1228,7 @@ void CNG_enc_ivas_fx( Word64 w_temp; Word32 inv_frame_len; Word32 L_ener; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + step_inv = 0; move16(); maxl = 0; @@ -1266,11 +1253,11 @@ void CNG_enc_ivas_fx( move16(); /* Temp variables for floating point functions */ - lp_ener_thr_scale = 8; /* 4.0f*/ /* Q2 */ + lp_ener_thr_scale = 8; /* 4.0f*/ /* Q1 */ move16(); if ( st_fx->element_mode != EVS_MONO ) { - lp_ener_thr_scale = 7; /* 3.5f;*/ /* Q2 */ + lp_ener_thr_scale = 7; /* 3.5f;*/ /* Q1 */ move16(); } @@ -1639,7 +1626,7 @@ void CNG_enc_ivas_fx( IF( hTdCngEnc->burst_ho_cnt > 0 ) { /**allow_cn_step |= ( hDtxEnc->first_CNG || st->element_mode == EVS_MONO ) && ( hTdCngEnc->ho_ener_hist[hTdCngEnc->ho_hist_ptr] > lp_ener_thr_scale * hTdCngEnc->lp_ener );*/ - w_temp = W_msu_32_16( W_shl( W_deposit32_l( hTdCngEnc->ho_ener_hist_fx[hTdCngEnc->ho_hist_ptr] ), 1 ), hTdCngEnc->lp_ener_fx, lp_ener_thr_scale ); /*Q7*/ + w_temp = W_msu_32_16( W_shl( W_deposit32_l( hTdCngEnc->ho_ener_hist_fx[hTdCngEnc->ho_hist_ptr] ), 2 ), hTdCngEnc->lp_ener_fx, lp_ener_thr_scale ); /*Q8*/ test(); test(); @@ -1876,7 +1863,7 @@ void CNG_enc_ivas_fx( { E_LPC_f_lsp_a_conversion( hDtxEnc->lspCNG_fx, Aq, M ); exp = sub( Q14, norm_s( Aq[0] ) ); - Scale_sig( Aq, M, sub( Q12, exp ) ); // Q12 + Scale_sig( Aq, M + 1, sub( Q12, exp ) ); // Q12 } tmp_loop = shr( st_fx->L_frame, 6 ); @@ -1898,7 +1885,7 @@ void CNG_enc_ivas_fx( L_tmp1 = L_mult0( hTdCngEnc->CNG_att_fx, 26214 /* 1/20.0f in Q19 */ ); // Q26 (7 + 19) L_tmp1 = BASOP_Util_fPow( 1342177280 /*10 in Q27 */, 4, L_tmp1, 5, &exp ); att = extract_h( L_shl( L_sub( L_tmp1, EPSILON_FX ), exp ) ); // Q15 // Subtracting by EPSILON_FX to avoid assertion when L_tmp1 value is 1073741824 and exp =1 - v_multc_fixed_16_16( res1, att, res1, st_fx->L_frame ); /* Q_new */ + v_multc_fx_16_16( res1, att, res1, st_fx->L_frame ); /* Q_new */ } ELSE IF( st_fx->bwidth != NB ) { @@ -1944,10 +1931,10 @@ void CNG_enc_ivas_fx( FOR( i = 0; i < NUM_ENV_CNG; i++ ) { /* env[i] = 2.0f*(*ptR * *ptR + *ptI * *ptI)/L_FFT; */ - L_tmp = L_mult_o( *ptR, *ptR, &Overflow ); /* 2*Q_new+1 */ - L_tmp = L_add_o( L_tmp, L_mult_o( *ptI, *ptI, &Overflow ), &Overflow ); /* 2*Q_new+1 */ - L_tmp = L_add_o( L_tmp, L_tmp, &Overflow ); /* 2*Q_new+1 */ - L_tmp = Mult_32_16( L_tmp, 128 ); /* 2*Q_new+1 */ + L_tmp = L_mult_sat( *ptR, *ptR ); /* 2*Q_new+1 */ + L_tmp = L_add_sat( L_tmp, L_mult_sat( *ptI, *ptI ) ); /* 2*Q_new+1 */ + L_tmp = L_add_sat( L_tmp, L_tmp ); /* 2*Q_new+1 */ + L_tmp = Mult_32_16( L_tmp, 128 ); /* 2*Q_new+1 */ tmp1 = add( add( Q_new, Q_new ), 1 ); env[i] = L_shr( L_tmp, sub( tmp1, 6 ) ); move32(); /* Q6 */ @@ -1986,19 +1973,19 @@ void CNG_enc_ivas_fx( move16(); BREAK; case L_FRAME32k: - inv_frame_len = ONE_BY_L_FRAME48k_Q31; + inv_frame_len = ONE_BY_L_FRAME32k_Q31; move16(); BREAK; case L_FRAME16k: - inv_frame_len = ONE_BY_L_FRAME48k_Q31; + inv_frame_len = ONE_BY_L_FRAME16k_Q31; move16(); BREAK; case L_FRAME8k: - inv_frame_len = ONE_BY_L_FRAME48k_Q31; + inv_frame_len = ONE_BY_L_FRAME8k_Q31; move16(); BREAK; case L_FRAME4k: - inv_frame_len = ONE_BY_L_FRAME48k_Q31; + inv_frame_len = ONE_BY_L_FRAME4k_Q31; move16(); BREAK; default: @@ -2011,14 +1998,12 @@ void CNG_enc_ivas_fx( /* convert log2 of residual signal energy */ /*enr = (float)log10( enr + 0.1f ) / (float)log10( 2.0f ); */ -#ifdef FIX_ISSUE_1245 IF( L_ener == 0 ) { enr = -850; /*log(0.1) base 2 in Q8*/ move16(); } ELSE -#endif { hi = norm_l( L_ener ); lo = Log2_norm_lc( L_shl( L_ener, hi ) ); @@ -2251,7 +2236,7 @@ void CNG_enc_ivas_fx( exp = norm_l( L_tmp ); L_tmp = L_shl( L_tmp, exp ); /*Q(exp+6)*/ tmp1 = extract_h( L_tmp ); /*Q(exp+6-16)=exp-10*/ - L_tmp = L_mult_o( tmp1, tmp1, &Overflow ); /*Q(2*exp - 19)*/ + L_tmp = L_mult_sat( tmp1, tmp1 ); /*Q(2*exp - 19)*/ L_tmp = L_shr( L_tmp, sub( add( exp, exp ), 36 ) ); /* Q17 */ d = L_add( d, L_tmp ); /* Q17 */ } @@ -2460,10 +2445,9 @@ static void shb_CNG_encod_fx( idx_ener_fx = s_max( idx_ener_fx, 0 ); } - push_indice_fx( hBstr, IND_SHB_CNG_GAIN, idx_ener_fx, 4 ); - push_indice_fx( hBstr, IND_SID_BW, 1, 1 ); - hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, hBstr->ind_list[IND_CNG_ENV1].nb_bits ); - hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1; + push_indice( hBstr, IND_SHB_CNG_GAIN, idx_ener_fx, 4 ); + push_indice( hBstr, IND_SID_BW, 1, 1 ); + delete_indice( hBstr, IND_CNG_ENV1 ); move16(); move16(); @@ -2472,7 +2456,7 @@ static void shb_CNG_encod_fx( } else { - push_indice_fx( hBstr, IND_UNUSED, 0, 2 ); + push_indice( hBstr, IND_UNUSED, 0, 2 ); } hTdCngEnc->ho_sid_bw = L_shl( L_and( hTdCngEnc->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); hTdCngEnc->ho_sid_bw = L_or( hTdCngEnc->ho_sid_bw, 0x1L ); @@ -2484,7 +2468,7 @@ static void shb_CNG_encod_fx( IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) { hTdCngEnc->ho_sid_bw = L_shl( L_and( hTdCngEnc->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); - push_indice_fx( hBstr, IND_SID_BW, 0, 1 ); + push_indice( hBstr, IND_SID_BW, 0, 1 ); } } @@ -2519,10 +2503,7 @@ static Word16 shb_DTX_fx( DTX_ENC_HANDLE hDtxEnc = st_fx->hDtxEnc; TD_CNG_ENC_HANDLE hTdCngEnc = st_fx->hTdCngEnc; TD_BWE_ENC_HANDLE hBWE_TD = st_fx->hBWE_TD; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + shb_new_speech_fx = shb_old_speech_fx + ( ACELP_LOOK_12k8 + L_SUBFR ) * 5 / 4; Copy( hBWE_TD->old_speech_shb_fx, shb_old_speech_fx, ( ACELP_LOOK_12k8 + L_SUBFR ) * 5 / 4 ); Copy( shb_speech_fx, shb_new_speech_fx, L_FRAME16k ); @@ -2539,7 +2520,7 @@ static Word16 shb_DTX_fx( wb_ener_fx = L_deposit_l( 0 ); FOR( i = 0; i < st_fx->L_frame; i++ ) { - wb_ener_fx = L_mac_o( wb_ener_fx, syn_12k8_16k[i], syn_12k8_16k[i], &Overflow ); + wb_ener_fx = L_mac_sat( wb_ener_fx, syn_12k8_16k[i], syn_12k8_16k[i] ); } wb_ener_fx = L_add( Mpy_32_16_1( wb_ener_fx, 128 ), 1 ); /* 128 in Q15, wb_ener_fx in Q1 */ @@ -2548,7 +2529,7 @@ static Word16 shb_DTX_fx( fra = Log2_norm_lc( L_shl( wb_ener_fx, exp ) ); exp = sub( 30 - 1, exp ); wb_ener_fx = Mpy_32_16( exp, fra, LG10 ); - log_wb_ener_fx = round_fx_o( L_shl_o( wb_ener_fx, 10, &Overflow ), &Overflow ); /* log_wb_ener_fx in Q8 */ + log_wb_ener_fx = round_fx_sat( L_shl_sat( wb_ener_fx, 10 ) ); /* log_wb_ener_fx in Q8 */ exp = norm_l( shb_ener_fx ); fra = Log2_norm_lc( L_shl( shb_ener_fx, exp ) ); exp = sub( 30 - 1, exp ); @@ -2559,7 +2540,6 @@ static Word16 shb_DTX_fx( { att = 0; move16(); - // PMT("apply_scale is not implemented") } ELSE { @@ -2567,7 +2547,7 @@ static Word16 shb_DTX_fx( move16(); } - log_shb_ener_fx = sub_o( round_fx_o( L_shl_o( shb_ener_fx, 10, &Overflow ), &Overflow ), att, &Overflow ); /* log_shb_ener_fx in Q8 */ + log_shb_ener_fx = sub_sat( round_fx_sat( L_shl_sat( shb_ener_fx, 10 ) ), att ); /* log_shb_ener_fx in Q8 */ IF( hDtxEnc->first_CNG == 0 ) { hTdCngEnc->mov_wb_cng_ener_fx = log_wb_ener_fx; @@ -2854,7 +2834,6 @@ static void shb_CNG_encod_ivas_fx( ELSE { /*idx_ener = (int16_t)(0.7f * (0.1f * st->hTdCngEnc->mov_shb_cng_ener / (float)log10(2.0f) + 6.0f) + 0.5f);*/ - // PMT("shb_CNG_encod_fx quantization in missing") /* 6.0 in Q8 -> 1510 */ /* 0.7 in Q15 22938 */ /* ( 1 / log10(2.0) ) * 0.1 in Q15 -> 10886 */ @@ -2976,12 +2955,6 @@ static Word16 shb_DTX_ivas_fx( TD_CNG_ENC_HANDLE hTdCngEnc = st->hTdCngEnc; TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD; - -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif - shb_new_speech_fx = shb_old_speech_fx + ( ACELP_LOOK_12k8 + L_SUBFR ) * 5 / 4; Copy( hBWE_TD->old_speech_shb_fx, shb_old_speech_fx, ( ACELP_LOOK_12k8 + L_SUBFR ) * 5 / 4 ); // old_speech_shb_fx -> Q0 Copy( shb_speech_fx, shb_new_speech_fx, L_FRAME16k ); // Q0 @@ -2998,7 +2971,7 @@ static Word16 shb_DTX_ivas_fx( wb_ener_fx = L_deposit_l( 0 ); FOR( i = 0; i < st->L_frame; i++ ) { - wb_ener_fx = L_mac_o( wb_ener_fx, syn_12k8_16k_fx[i], syn_12k8_16k_fx[i], &Overflow ); // ( Q0 + Q0 + Q1 ) --> Q1 due to left shift in L_mac + wb_ener_fx = L_mac_sat( wb_ener_fx, syn_12k8_16k_fx[i], syn_12k8_16k_fx[i] ); // ( Q0 + Q0 + Q1 ) --> Q1 due to left shift in L_mac } wb_ener_fx = L_add( Mpy_32_16_1( wb_ener_fx, 128 ), 1 ); /* 128 in Q15, wb_ener_fx in Q1 */ @@ -3008,7 +2981,7 @@ static Word16 shb_DTX_ivas_fx( exp = sub( 30 - 1, exp ); wb_ener_fx = Mpy_32_16( exp, fra, LG10 ); - log_wb_ener_fx = round_fx_o( L_shl_o( wb_ener_fx, 10, &Overflow ), &Overflow ); /* log_wb_ener_fx in Q8 */ + log_wb_ener_fx = round_fx_sat( L_shl_sat( wb_ener_fx, 10 ) ); /* log_wb_ener_fx in Q8 */ exp = norm_l( shb_ener_fx ); fra = Log2_norm_lc( L_shl( shb_ener_fx, exp ) ); exp = sub( 30 - 1, exp ); @@ -3032,8 +3005,7 @@ static Word16 shb_DTX_ivas_fx( move16(); } - - log_shb_ener_fx = sub_o( round_fx_o( L_shl_o( shb_ener_fx, 10, &Overflow ), &Overflow ), att_fx, &Overflow ); /* log_shb_ener_fx in Q8 */ + log_shb_ener_fx = sub_sat( round_fx_sat( L_shl_sat( shb_ener_fx, 10 ) ), att_fx ); /* log_shb_ener_fx in Q8 */ IF( st->hDtxEnc->first_CNG == 0 ) { diff --git a/lib_enc/cod2t32_fx.c b/lib_enc/cod2t32_fx.c index a948a4656c7154b56e7af98b6e3fae967d5e5ec2..fa66223cb9679fc3425e43f0b5e4e0f44ed510ee 100644 --- a/lib_enc/cod2t32_fx.c +++ b/lib_enc/cod2t32_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -47,10 +47,7 @@ void acelp_2t32_fx( Word32 L_tmp; Word16 rrixix[NB_TRACK_FCB_2T][NB_POS_FCB_2T]; Word16 rrixiy[MSIZE]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + /*----------------------------------------------------------------* * Compute rrixix[][] needed for the codebook search. *----------------------------------------------------------------*/ @@ -63,11 +60,11 @@ void acelp_2t32_fx( L_cor = L_deposit_h( 1 ); FOR( i = 0; i < NB_POS_FCB_2T; i++ ) { - L_cor = L_mac_o( L_cor, *ptr_h1, *ptr_h1, &Overflow ); + L_cor = L_mac_sat( L_cor, *ptr_h1, *ptr_h1 ); ptr_h1++; *p1-- = extract_h( L_cor ); move16(); /*Q9 Q7*/ - L_cor = L_mac_o( L_cor, *ptr_h1, *ptr_h1, &Overflow ); + L_cor = L_mac_sat( L_cor, *ptr_h1, *ptr_h1 ); ptr_h1++; *p0-- = extract_h( L_cor ); move16(); /*Q9 Q7*/ @@ -108,17 +105,17 @@ void acelp_2t32_fx( L_cor = L_mult( *ptr_h1++, *ptr_h2++ ); // Q(12+12+1) FOR( i = k; i < NB_POS_FCB_2T - 1; i++ ) { - *p1 = round_fx_o( L_cor, &Overflow ); // Q(25-16) - L_cor = L_mac_o( L_cor, *ptr_h1++, *ptr_h2++, &Overflow ); - *p0 = round_fx_o( L_cor, &Overflow ); // Q(9) - L_cor = L_mac_o( L_cor, *ptr_h1++, *ptr_h2++, &Overflow ); + *p1 = round_fx_sat( L_cor ); // Q(25-16) + L_cor = L_mac_sat( L_cor, *ptr_h1++, *ptr_h2++ ); + *p0 = round_fx_sat( L_cor ); // Q(9) + L_cor = L_mac_sat( L_cor, *ptr_h1++, *ptr_h2++ ); move16(); move16(); p1 -= ( NB_POS_FCB_2T + 1 ); p0 -= ( NB_POS_FCB_2T + 1 ); } - *p1 = round_fx_o( L_cor, &Overflow ); // Q9 + *p1 = round_fx_sat( L_cor ); // Q9 pos -= NB_POS_FCB_2T; move16(); pos2--; @@ -221,9 +218,9 @@ void acelp_2t32_fx( FOR( i1 = 1; i1 < L_SUBFR; i1 += STEP ) { ps2 = add( ps1, dn_p[i1] ); - alp2 = add_o( alp1, add_o( *p1++, *p2++, &Overflow ), &Overflow ); + alp2 = add_sat( alp1, add_sat( *p1++, *p2++ ) ); sq = mult( ps2, ps2 ); - s = L_msu_o( L_mult( alpk, sq ), psk, alp2, &Overflow ); + s = L_msu_sat( L_mult( alpk, sq ), psk, alp2 ); IF( s > 0 ) { psk = sq; @@ -292,282 +289,12 @@ void acelp_2t32_fx( } { /* write index to array of indices */ - push_indice_fx( hBstr, IND_ALG_CDBK_2T32, index, 12 ); + push_indice( hBstr, IND_ALG_CDBK_2T32, index, 12 ); } return; } -void acelp_2t32_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 dn[], /* i : corr. between target and h[]. Qx*/ - const Word16 h[], /* i : impulse response of weighted synthesis filter Q12*/ - Word16 code[], /* o : algebraic (fixed) codebook excitation Q9 */ - Word16 y[] /* o : filtered fixed codebook excitation Q9 */ -) -{ - Word16 i, j, k, i0, i1, ix, iy, pos, pos2, sign0, sign1, index; - Word16 ps1, ps2, alpk, alp1, alp2; - Word16 sq, psk; - Word16 pol[L_SUBFR], dn_p[L_SUBFR]; - Word16 ii, jj; - Word16 *p0, *p1, *p2; - const Word16 *ptr_h1, *ptr_h2, *ptr_hf; - - Word32 s, L_cor; - Word32 L_tmp; - Word16 rrixix[NB_TRACK_FCB_2T][NB_POS_FCB_2T]; - Word16 rrixiy[MSIZE]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - /*----------------------------------------------------------------* - * Compute rrixix[][] needed for the codebook search. - *----------------------------------------------------------------*/ - - /* Init pointers to last position of rrixix[] */ - p0 = &rrixix[0][NB_POS_FCB_2T - 1]; - p1 = &rrixix[1][NB_POS_FCB_2T - 1]; - - ptr_h1 = h; - move16(); - L_cor = L_deposit_h( 1 ); - FOR( i = 0; i < NB_POS_FCB_2T; i++ ) - { - L_cor = L_mac_o( L_cor, *ptr_h1, *ptr_h1, &Overflow ); - ptr_h1++; - *p1-- = extract_h( L_cor ); - move16(); /*Q9 Q7*/ - L_cor = L_mac_o( L_cor, *ptr_h1, *ptr_h1, &Overflow ); - ptr_h1++; - *p0-- = extract_h( L_cor ); - move16(); /*Q9 Q7*/ - } - - p0 = rrixix[0]; - p1 = rrixix[1]; - - FOR( i = 0; i < NB_POS_FCB_2T; i++ ) - { - *p0 = shr( *p0, 1 ); - move16(); - p0++; - *p1 = shr( *p1, 1 ); - move16(); - p1++; - } - - /*------------------------------------------------------------* - * Compute rrixiy[][] needed for the codebook search. - *------------------------------------------------------------*/ - - pos = MSIZE - 1; - move16(); - pos2 = MSIZE - 2; - move16(); - ptr_hf = h + 1; - - FOR( k = 0; k < NB_POS_FCB_2T; k++ ) - { - /* Init pointers to last position of diagonals */ - p1 = &rrixiy[pos]; - p0 = &rrixiy[pos2]; - - ptr_h1 = h; - ptr_h2 = ptr_hf; - - L_cor = L_mult( *ptr_h1++, *ptr_h2++ ); // Q25 - FOR( i = k; i < NB_POS_FCB_2T - 1; i++ ) - { - *p1 = round_fx_o( L_cor, &Overflow ); // Q9 - L_cor = L_mac_o( L_cor, *ptr_h1++, *ptr_h2++, &Overflow ); - *p0 = round_fx_o( L_cor, &Overflow ); // Q9 - L_cor = L_mac_o( L_cor, *ptr_h1++, *ptr_h2++, &Overflow ); - move16(); - move16(); - p1 -= ( NB_POS_FCB_2T + 1 ); - p0 -= ( NB_POS_FCB_2T + 1 ); - } - - *p1 = round_fx_o( L_cor, &Overflow ); - pos -= NB_POS_FCB_2T; - move16(); - pos2 = sub( pos2, 1 ); - ptr_hf += STEP; - move16(); - } - - /*----------------------------------------------------------------* - * computing reference vector and pre-selection of polarities - *----------------------------------------------------------------*/ - - L_tmp = L_deposit_h( dn[0] ); - FOR( i = 0; i < L_SUBFR; i++ ) - { - /* FIR high-pass filtering */ - IF( i == 0 ) - { - L_tmp = L_msu( L_tmp, dn[1], 11469 /*.3f Q15*/ ); - } - ELSE IF( EQ_16( i, L_SUBFR - 1 ) ) - { - L_tmp = L_deposit_h( dn[i] ); - L_tmp = L_msu( L_tmp, dn[i - 1], 11469 /*.3f Q15*/ ); - } - ELSE - { - L_tmp = L_deposit_h( dn[i] ); - L_tmp = L_msu( L_tmp, dn[i - 1], 11469 /*.3f Q15*/ ); - L_tmp = L_msu( L_tmp, dn[i + 1], 11469 /*.3f Q15*/ ); - } - - /* pre-selection of polarities */ - IF( L_tmp >= 0 ) - { - pol[i] = 1; - move16(); - dn_p[i] = dn[i]; - move16(); - } - ELSE - { - pol[i] = -1; - move16(); - dn_p[i] = negate( dn[i] ); - move16(); - } - } - - /*----------------------------------------------------------------* - * compute denominator ( multiplied by polarity ) - *----------------------------------------------------------------*/ - - k = 0; - ii = 0; - move16(); - move16(); - FOR( i = 0; i < NB_POS_FCB_2T; i++ ) - { - jj = 1; - move16(); - FOR( j = 0; j < NB_POS_FCB_2T; j++ ) - { - test(); - if ( EQ_16( s_and( pol[ii], pol[jj] ), 1 ) && EQ_16( s_or( pol[ii], pol[jj] ), -1 ) ) - { - rrixiy[k + j] = negate( rrixiy[k + j] ); - move16(); - } - jj = add( jj, 2 ); - } - ii = add( ii, 2 ); - k = add( k, NB_POS_FCB_2T ); - } - - /*----------------------------------------------------------------* - * search 2 pulses - * All combinaisons are tested: - * 32 pos x 32 pos x 2 signs = 2048 tests - *----------------------------------------------------------------*/ - p0 = rrixix[0]; - p1 = rrixix[1]; - p2 = rrixiy; - psk = -1; - move16(); - alpk = 1; - move16(); - ix = 0; - move16(); - iy = 1; - move16(); - - FOR( i0 = 0; i0 < L_SUBFR; i0 += STEP ) - { - ps1 = dn_p[i0]; - move16(); - alp1 = *p0++; - move16(); - pos = -1; - move16(); - FOR( i1 = 1; i1 < L_SUBFR; i1 += STEP ) - { - ps2 = add( ps1, dn_p[i1] ); - alp2 = add_o( alp1, add_o( *p1++, *p2++, &Overflow ), &Overflow ); - sq = mult( ps2, ps2 ); - s = L_msu_o( L_mult( alpk, sq ), psk, alp2, &Overflow ); - IF( s > 0 ) - { - psk = sq; - move16(); - alpk = alp2; - move16(); - pos = i1; - move16(); - } - } - p1 -= NB_POS_FCB_2T; - - IF( pos >= 0 ) - { - ix = i0; - move16(); - iy = pos; - move16(); - } - } - - i0 = shr( ix, 1 ); - i1 = shr( iy, 1 ); - - sign0 = shl( pol[ix], 9 ); // Q9 - sign1 = shl( pol[iy], 9 ); // Q9 - - /*-------------------------------------------------------------------* - * Build the codeword, the filtered codeword and index of codevector. - *-------------------------------------------------------------------*/ - - set16_fx( code, 0, L_SUBFR ); - - code[ix] = sign0; - move16(); - code[iy] = sign1; - move16(); - - index = add( shl( i0, 6 ), i1 ); - - - if ( sign0 < 0 ) - { - index = add( index, 0x800 ); - } - if ( sign1 < 0 ) - { - index = add( index, 0x20 ); /* move16();*/ - } - - set16_fx( y, 0, L_SUBFR ); - /* y_Q9 = sign_Q9<<3 * h_Q12 */ - - sign0 = shl( sign0, 3 ); - sign1 = shl( sign1, 3 ); - - FOR( i = ix; i < L_SUBFR; i++ ) - { - y[i] = mult_r( sign0, h[i - ix] ); // Q9 - move16(); - } - FOR( i = iy; i < L_SUBFR; i++ ) - { - y[i] = round_fx( L_mac( L_deposit_h( y[i] ), sign1, h[i - iy] ) ); // Q9 - move16(); - } - { - /* write index to array of indices */ - push_indice( hBstr, IND_ALG_CDBK_2T32, index, 12 ); - } - return; -} /*---------------------------------------------------------------------------------- * Function acelp_1t64() * @@ -578,88 +305,21 @@ void acelp_2t32_ivas_fx( *----------------------------------------------------------------------------------*/ void acelp_1t64_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 dn[], /* i : corr. between target and h[]. Qx*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 dn[], /* i : corr. between target and h[]. Qx*/ const Word16 h[], /* i : impulse response of weighted synthesis filter Q12 */ - Word16 code[], /* o : algebraic (fixed) codebook excitation Q9 */ - Word16 y[], /* o : filtered fixed codebook excitation Q9 */ - const Word16 L_subfr /* i : subframe length */ + Word16 code[], /* o : algebraic (fixed) codebook excitation Q9 */ + Word16 y[], /* o : filtered fixed codebook excitation Q9 */ + const Word16 L_subfr /* i : subframe length */ ) { Word16 i, pos, sgn, index; Word32 L_tmp; - /*-------------------------------------------------------------------* - * Find position and sign of maximum impulse. - *-------------------------------------------------------------------*/ - pos = emaximum_fx( 0, dn, L_subfr, &L_tmp ); - - IF( dn[pos] < 0 ) - { - sgn = -512; //-1 in Q9 - move16(); - } - ELSE - { - sgn = 512; // 1 in Q9 - move16(); - } - /*-------------------------------------------------------------------* - * Build the codeword, the filtered codeword and index of codevector. - *-------------------------------------------------------------------*/ - - set16_fx( code, 0, L_subfr ); - code[pos] = sgn; - move16(); - - set16_fx( y, 0, L_subfr ); - - FOR( i = pos; i < L_subfr; i++ ) - { - IF( sgn > 0 ) - { - y[i] = shr_r( h[i - pos], 3 ); // Q9 - move16(); - } - ELSE - { - y[i] = negate( shr_r( h[i - pos], 3 ) ); // Q9 - move16(); - } - } - - index = pos; - move16(); - if ( sgn > 0 ) - { - index = add( index, L_subfr ); - } - IF( EQ_16( L_subfr, L_SUBFR ) ) - { - push_indice_fx( hBstr, IND_ALG_CDBK_1T64, index, 7 ); - } - ELSE /* L_subfr == 2*L_SUBFR */ - { - push_indice_fx( hBstr, IND_ALG_CDBK_1T64, index, 8 ); - } - - return; -} - -void acelp_1t64_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 dn[], /* i : corr. between target and h[]. Qx */ - const Word16 h[], /* i : impulse response of weighted synthesis filter Q12*/ - Word16 code[], /* o : algebraic (fixed) codebook excitation Q9*/ - Word16 y[], /* o : filtered fixed codebook excitation Q9*/ - const Word16 L_subfr /* i : subframe length */ -) -{ - Word16 i, pos, sgn, index; - Word32 L_tmp; /*-------------------------------------------------------------------* * Find position and sign of maximum impulse. *-------------------------------------------------------------------*/ + pos = emaximum_fx( 0, dn, L_subfr, &L_tmp ); IF( dn[pos] < 0 ) diff --git a/lib_enc/cod4t64_fast.c b/lib_enc/cod4t64_fast_fx.c similarity index 84% rename from lib_enc/cod4t64_fast.c rename to lib_enc/cod4t64_fast_fx.c index 0e4c02744823c9718cfae159a01f6aaf362ff25a..7079f65971792963c9701841da0e9cc00e80bd54 100644 --- a/lib_enc/cod4t64_fast.c +++ b/lib_enc/cod4t64_fast_fx.c @@ -123,10 +123,11 @@ void acelp_fast_fx( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const Word16 cdk_index, /* i : codebook index */ const Word16 dn_orig[L_SUBFR], - /* i : corr. between target and h[]. */ // Q_new + 1 + /* i : corr. between target and h[]. */ // Q_dn Word16 Q_dn, const Word16 cn[L_SUBFR], - /* i : residual after long term prediction */ // Q_new + 1 + /* i : residual after long term prediction */ // q_cn + const Word16 q_cn, const Word16 H[L_SUBFR], /* i : impulse response of weighted synthesis filter */ // e(norm_s(H[0])+1) Word16 code[L_SUBFR], @@ -144,7 +145,8 @@ void acelp_fast_fx( Word16 track_order[NB_TRACK_FCB_4T * MAX_NUM_INTER], m0_track[NB_TRACK_FCB_4T]; Word16 ind_stream[NPMAXPT * NB_TRACK_FCB_4T], idx; Word16 G, G1, G2, G3, Gn, Gd; - Word32 Gd32; + Word32 Gd32 = 0; + move32(); Word16 y_tmp[L_SUBFR_MAX]; Word32 dn[L_SUBFR_MAX]; Word32 crit_num, crit_den, crit_num_max, crit_den_max, L_tmp1, L_tmp2; @@ -161,7 +163,9 @@ void acelp_fast_fx( Word64 s64; Word16 flag = 0; move16(); - + Word32 temp1, temp2, temp3, temp4, temp5, temp6; + Word16 q_temp1, q_temp2; + Word16 scale_temp1, scale_temp2; /*-----------------------------------------------------------------* * Initialization *-----------------------------------------------------------------*/ @@ -294,16 +298,23 @@ void acelp_fast_fx( exp = sub( Q31, shl( Q_dn, 1 ) ); + s64 = 0; + move64(); + FOR( i = 0; i < L_subfr; i++ ) + { + s64 = W_mac_16_16( s64, dn_orig[i], dn_orig[i] ); // 2 * Q_dn + 1 + } dndn_fx = 21474836 /*0.01f in Q31 */; move32(); dndn_e = 0; move16(); - FOR( i = 0; i < L_subfr; i++ ) + IF( s64 ) { - dndn_fx = BASOP_Util_Add_Mant32Exp( dndn_fx, dndn_e, L_mult0( dn_orig[i], dn_orig[i] ), exp, &dndn_e ); // Q(dndn_e) + Word16 new_exp1 = W_norm( s64 ); + dndn_fx = W_extract_h( W_shl( s64, new_exp1 ) ); // 2 * Q_dyn + exp1 - 31 + dndn_e = sub( 31, sub( add( add( shl( Q_dn, 1 ), 1 ), new_exp1 ), 32 ) ); } - exp1 = sub( Q31, shl( sub( Q_dn, 1 ), 1 ) ); cncn_fx = 214748365 /* 0.1f in Q31 */; move32(); @@ -312,31 +323,42 @@ void acelp_fast_fx( FOR( q = 0; q < nb_tracks; q++ ) { + s64 = 0; + move64(); + FOR( i = 0; i < L_subfr; i += nb_tracks ) + { + s64 = W_mac_16_16( s64, cn[i + q], cn[i + q] ); // 2 * q_cn + 1 + } + cncn_track[q] = 214748365 /* 0.1f in Q31 */; move32(); cncn_track_e[q] = 0; move16(); - - FOR( i = 0; i < L_subfr; i += nb_tracks ) + IF( s64 ) { - Word32 L_tmp = L_mult0( cn[i + q], cn[i + q] ); - shift = norm_l( L_tmp ); - L_tmp = L_shl( L_tmp, shift ); - cncn_track[q] = BASOP_Util_Add_Mant32Exp( cncn_track[q], cncn_track_e[q], L_tmp, sub( exp1, shift ), &cncn_track_e[q] ); // Q(cncn_track_e[q]) - move32(); + Word16 new_exp1 = W_norm( s64 ); + cncn_track[q] = W_extract_h( W_shl( s64, new_exp1 ) ); // 2 * Q_dyn + exp1 - 31 + cncn_track_e[q] = sub( 31, sub( add( add( shl( q_cn, 1 ), 1 ), new_exp1 ), 32 ) ); } cncn_fx = BASOP_Util_Add_Mant32Exp( cncn_fx, cncn_e, cncn_track[q], cncn_track_e[q], &cncn_e ); // Q(cncn_e) } - Word16 tmp; + Word16 tmp = 0; + move16(); s_coef_fx = BASOP_Util_Divide3232_Scale( dndn_fx, cncn_fx, &tmp ); tmp = add( tmp, sub( dndn_e, cncn_e ) ); s_coef_fx = Sqrt16( s_coef_fx, &tmp ); // Q(15 - tmp) - + q_temp1 = add( add( sub( Q15, tmp ), q_cn ), Q1 ); + scale_temp1 = sub( q_temp1, Q_dn ); FOR( i = 0; i < L_subfr; i++ ) { - bn_orig_fx[i] = L_mac0( L_shr( L_mult( s_coef_fx, cn[i] ), sub( 15, tmp ) ), beta1_fx, dn_orig[i] ); // Q_dn + temp1 = L_mult( s_coef_fx, cn[i] ); // Q(15 - tmp)+q_cn+1 + temp2 = L_mult( beta1_fx, dn_orig[i] ); // 1+Q_dn+1 + /* bn_orig_fx[i] is being used in Q_dn */ + temp2 = L_shr( temp2, 1 ); + temp1 = L_shr( temp1, scale_temp1 ); + bn_orig_fx[i] = L_add( temp1, temp2 ); // Q_dn move32(); IF( bn_orig_fx[i] >= 0 ) @@ -576,12 +598,12 @@ void acelp_fast_fx( } ELSE { - Gn = i_mult( s[0], shr( dn_orig[m[0]], 1 ) ); // Q_dn - 1 - Gd = alp[0]; // Q6 + Gn = i_mult( s[0], dn_orig[m[0]] ); // Q_dn + Gd = alp[0]; // Q6 move16(); - G = Gn; // Q_dn - 1 + G = Gn; // Q_dn move16(); - G = i_mult( G, s[0] ); // Q_dn - 1 + G = i_mult( G, s[0] ); // Q_dn track = track_order[q * nb_tracks + 1]; // Q0 move16(); @@ -596,14 +618,17 @@ void acelp_fast_fx( move64(); FOR( i = track; i < L_subfr; i += nb_tracks ) { - dn[i] = L_shr( L_msu( L_mult0( Gd, dn_orig[i] ), G, *alp_pos0 ), 6 ); // Q_dn + temp1 = L_mult0( Gd, dn_orig[i] ); + temp2 = L_mult0( G, *alp_pos0 ); + temp3 = L_sub( temp1, temp2 ); + dn[i] = L_shr( temp3, 6 ); move32(); alp_pos0 += nb_tracks; s64 = W_mac_32_32( s64, dn[i], dn[i] ); // 2 * Q_dn + 1 } exp1 = W_norm( s64 ); dndn_fx = W_extract_h( W_shl( s64, exp1 ) ); // 2 * Q_dyn + exp1 - 31 - dndn_e = sub( 31, sub( add( shl( Q_dn, 1 ), exp ), 31 ) ); + dndn_e = sub( 31, sub( add( add( shl( Q_dn, 1 ), 1 ), exp1 ), 32 ) ); IF( dndn_fx == 0 ) { @@ -612,17 +637,28 @@ void acelp_fast_fx( dndn_e = 0; move16(); } + exp1 = 0; + move16(); s_coef_fx = BASOP_Util_Divide3232_Scale( dndn_fx, cncn_track[track], &exp1 ); exp1 = add( exp1, sub( dndn_e, cncn_track_e[track] ) ); s_coef_fx = Sqrt16( s_coef_fx, &exp1 ); - exp1 = sub( exp1, shift ); max_val_fx = EPSILLON_FX; move16(); m[1] = track; // Q0 move16(); + q_temp1 = add( add( sub( Q15, exp1 ), q_cn ), 1 ); + q_temp2 = add( Q_dn, Q2 ); + scale_temp1 = sub( q_temp1, Q_dn ); + scale_temp2 = sub( q_temp2, Q_dn ); FOR( i = track; i < L_subfr; i += nb_tracks ) { - dn[i] = L_add( L_shr( L_mult( s_coef_fx, cn[i] ), sub( 15, exp1 ) ), L_shr( imult3216( dn[i], beta2_fx ), 2 ) ); // Q_dn + temp1 = L_mult( s_coef_fx, cn[i] ); // Q(15 - tmp)+q_cn+1 + temp2 = imult3216( dn[i], beta2_fx ); // Q_dn + 2 + + /* bn_orig_fx[i] is being used in Q_dn */ + temp2 = L_shr( temp2, scale_temp2 ); + temp1 = L_shr( temp1, scale_temp1 ); + dn[i] = L_add( temp1, temp2 ); // Q_dn move32(); temp_fx = imult3216( dn[i], sign_fx[i] ); // Q_dn @@ -645,14 +681,14 @@ void acelp_fast_fx( IF( GE_16( nb_pulse, 3 ) ) { - Gn = add( Gn, i_mult( s[1], shr( dn_orig[m[1]], 1 ) ) ); // Q_dn -1 + Gn = add( Gn, i_mult( s[1], dn_orig[m[1]] ) ); // Q_dn Gd32 = Gd; move16(); Gd32 = L_add( Gd32, L_add( alp[0], L_mult0( i_mult( shl( s[0], 1 ), s[1] ), alp[m[0] - m[1]] ) ) ); // Q6 - G = Gn; // Q_dn - 1 + G = Gn; // Q_dn move16(); - G1 = i_mult( G, s[1] ); // Q_dn-1 - G = i_mult( G, s[0] ); // Q_dn-1 + G1 = i_mult( G, s[1] ); // Q_dn + G = i_mult( G, s[0] ); // Q_dn track = track_order[q * nb_tracks + 2]; // Q0 move16(); @@ -661,7 +697,12 @@ void acelp_fast_fx( FOR( i = track; i < L_subfr; i += nb_tracks ) { - dn[i] = L_shr( L_msu( L_msu0( imult3216( Gd32, dn_orig[i] ), G, *alp_pos0 ), G1, *alp_pos1 ), 6 ); // Q_dn + temp1 = imult3216( Gd32, dn_orig[i] ); + temp2 = L_mult0( G, *alp_pos0 ); + temp3 = L_mult0( G1, *alp_pos1 ); + temp4 = L_sub( temp1, temp2 ); + temp4 = L_sub( temp4, temp3 ); + dn[i] = L_shr( temp4, 6 ); move32(); alp_pos0 += nb_tracks; alp_pos1 += nb_tracks; @@ -677,15 +718,17 @@ void acelp_fast_fx( IF( GE_16( nb_pulse, 4 ) ) { - Gn = add( Gn, i_mult( s[2], shr( dn_orig[m[2]], 1 ) ) ); // Q_dn-1 - Gd32 = Gd; - move16(); - Gd32 = L_add( Gd32, L_add( L_add( alp[0], L_mult0( i_mult( shl( s[0], 1 ), s[2] ), alp[m[0] - m[2]] ) ), L_mult0( i_mult( shl( s[1], 1 ), s[2] ), alp[m[1] - m[2]] ) ) ); // Q6 - G = Gn; // Q_dn-1 + Gn = add( Gn, i_mult( s[2], dn_orig[m[2]] ) ); // Q_dn + temp1 = alp[0]; + move32(); + temp2 = L_mult0( i_mult( shl( s[0], 1 ), s[2] ), alp[m[0] - m[2]] ); + temp3 = L_mult0( i_mult( shl( s[1], 1 ), s[2] ), alp[m[1] - m[2]] ); + Gd32 = L_add( Gd32, L_add( L_add( temp1, temp2 ), temp3 ) ); // Q6 + G = Gn; // Q_dn move16(); - G1 = i_mult( G, s[1] ); // Q_dn-1 - G2 = i_mult( G, s[2] ); // Q_dn-1 - G = i_mult( G, s[0] ); // Q_dn-1 + G1 = i_mult( G, s[1] ); // Q_dn + G2 = i_mult( G, s[2] ); // Q_dn + G = i_mult( G, s[0] ); // Q_dn track = track_order[q * nb_tracks + 3]; move16(); @@ -695,7 +738,15 @@ void acelp_fast_fx( FOR( i = track; i < L_subfr; i += nb_tracks ) { - dn[i] = L_shr( L_msu( L_msu( L_msu( imult3216( Gd32, dn_orig[i] ), G, *alp_pos0 ), G1, *alp_pos1 ), G2, *alp_pos2 ), 6 ); // Q_dn + + temp1 = imult3216( Gd32, dn_orig[i] ); + temp2 = L_mult0( G, *alp_pos0 ); + temp3 = L_mult0( G1, *alp_pos1 ); + temp4 = L_mult0( G2, *alp_pos2 ); + temp5 = L_sub( temp1, temp2 ); + temp5 = L_sub( temp5, temp3 ); + temp5 = L_sub( temp5, temp4 ); + dn[i] = L_shr( temp5, 6 ); move32(); alp_pos0 += nb_tracks; alp_pos1 += nb_tracks; @@ -717,16 +768,20 @@ void acelp_fast_fx( IF( GE_16( nb_pulse, 5 ) ) { - Gn = add( Gn, i_mult( s[3], shr( dn_orig[m[3]], 1 ) ) ); // Q_dn-1 - Gd32 = Gd; - move16(); - Gd32 = L_add( Gd32, L_add( L_add( L_add( alp[0], L_mult0( i_mult( shl( s[0], 1 ), s[3] ), alp[m[0] - m[3]] ) ), L_mult0( i_mult( shl( s[1], 1 ), s[3] ), alp[m[1] - m[3]] ) ), L_mult0( i_mult( shl( s[2], 1 ), s[3] ), alp[m[2] - m[3]] ) ) ); // Q6 + Gn = add( Gn, i_mult( s[3], dn_orig[m[3]] ) ); // Q_dn + temp1 = alp[0]; + move32(); + temp2 = L_mult0( i_mult( shl( s[0], 1 ), s[3] ), alp[m[0] - m[3]] ); + temp3 = L_mult0( i_mult( shl( s[1], 1 ), s[3] ), alp[m[1] - m[3]] ); + temp4 = L_mult0( i_mult( shl( s[2], 1 ), s[3] ), alp[m[2] - m[3]] ); + + Gd32 = L_add( Gd32, L_add( L_add( L_add( temp1, temp2 ), temp3 ), temp4 ) ); // Q6 G = Gn; - move16(); // Q_dn-1 - G1 = i_mult( G, s[1] ); // Q_dn-1 - G2 = i_mult( G, s[2] ); // Q_dn-1 - G3 = i_mult( G, s[3] ); // Q_dn-1 - G = i_mult( G, s[0] ); // Q_dn-1 + move16(); // Q_dn + G1 = i_mult( G, s[1] ); // Q_dn + G2 = i_mult( G, s[2] ); // Q_dn + G3 = i_mult( G, s[3] ); // Q_dn + G = i_mult( G, s[0] ); // Q_dn IF( EQ_16( cdk_index, 6 ) ) { @@ -740,7 +795,16 @@ void acelp_fast_fx( FOR( i = track; i < L_subfr; i += nb_tracks ) { - dn[i] = L_shr( L_msu( L_msu( L_msu( L_msu( imult3216( Gd32, dn_orig[i] ), G, *alp_pos0 ), G1, *alp_pos1 ), G2, *alp_pos2 ), G3, *alp_pos3 ), 6 ); // Q_dn + temp1 = imult3216( Gd32, dn_orig[i] ); + temp2 = L_mult0( G, *alp_pos0 ); + temp3 = L_mult0( G1, *alp_pos1 ); + temp4 = L_mult0( G2, *alp_pos2 ); + temp5 = L_mult0( G3, *alp_pos3 ); + temp6 = L_sub( temp1, temp2 ); + temp6 = L_sub( temp6, temp3 ); + temp6 = L_sub( temp6, temp4 ); + temp6 = L_sub( temp6, temp5 ); + dn[i] = L_shr( temp6, 6 ); move32(); alp_pos0 += nb_tracks; alp_pos1 += nb_tracks; @@ -760,7 +824,16 @@ void acelp_fast_fx( FOR( i = 0; i < L_subfr; i++ ) { - dn[i] = L_shr( L_msu( L_msu( L_msu( L_msu( imult3216( Gd32, dn_orig[i] ), G, *alp_pos0 ), G1, *alp_pos1 ), G2, *alp_pos2 ), G3, *alp_pos3 ), 6 ); /*Q_dn*/ + temp1 = imult3216( Gd32, dn_orig[i] ); + temp2 = L_mult0( G, *alp_pos0 ); + temp3 = L_mult0( G1, *alp_pos1 ); + temp4 = L_mult0( G2, *alp_pos2 ); + temp5 = L_mult0( G3, *alp_pos3 ); + temp6 = L_sub( temp1, temp2 ); + temp6 = L_sub( temp6, temp3 ); + temp6 = L_sub( temp6, temp4 ); + temp6 = L_sub( temp6, temp5 ); + dn[i] = L_shr( temp6, 6 ); move16(); alp_pos0++; alp_pos1++; diff --git a/lib_enc/cod4t64_fx.c b/lib_enc/cod4t64_fx.c index 99b794b42325932654eef0f13ab6f90b733671d2..ac494e1604e858bc94d80eaee0a18abc5f543945 100644 --- a/lib_enc/cod4t64_fx.c +++ b/lib_enc/cod4t64_fx.c @@ -1,12 +1,12 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* VMR-WB compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_enc.h" /* Encoder static table prototypes */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -22,6 +22,7 @@ /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ + static Word16 quant_1p_N1_fx( const Word16 pos, const Word16 N ); static Word16 quant_3p_3N1_fx( const Word16 pos1, const Word16 pos2, const Word16 pos3, const Word16 N ); static Word32 quant_4p_4N_fx( const Word16 pos[], const Word16 N ); @@ -55,421 +56,6 @@ static Word32 pre_process_fx( const Word16 v[], Word16 sector_6p[], Word32 secto *---------------------------------------------------------------------*/ Word16 acelp_4t64_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 dn[], /* i : corr. between target and h[]. */ - const Word16 cn[], /* i : residual after long term prediction Q_new*/ - const Word16 H[], /* i : impulse response of weighted synthesis filter Q12*/ - Word16 R[], /* i : autocorrelation values */ - const Word16 acelpautoc, /* i : autocorrealtion flag */ - Word16 code[], /* o : algebraic (fixed) codebook excitation Q9*/ - Word16 y[], /* o : filtered fixed codebook excitation Q9*/ - Word16 nbbits, /* i : number of bits per codebook */ - const Word16 cmpl_flag, /* i : complexity reduction flag */ - const Word16 Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ -) -{ - - Word16 i, k, index, track; - Word32 L_index; - Word16 ind[NPMAXPT * NB_TRACK_FCB_4T + 32]; /* VE3: why +32 ???*/ - Word16 codvec[NB_PULSE_MAX + 4] = { 0 }; - Word16 saved_bits = 0; - - PulseConfig config; - Word16 indexing_indices[6], wordcnt, bitcnt; - - set16_fx( codvec, 0, NB_PULSE_MAX + 4 ); - SWITCH( nbbits ) - { - - case 20: /* EVS/AMR-WB pulse indexing: 20 bits, 4 pulses, 4 tracks */ - config.nbiter = 4; - move16(); /* 4x12x16=768 loop */ - config.alp = 16384; - move16(); /* 2 in Q13*/ - config.nb_pulse = 4; - move16(); - config.fixedpulses = 0; - move16(); - config.nbpos[0] = 4; - move16(); - config.nbpos[1] = 8; - move16(); - BREAK; - - case 28: /* EVS pulse indexing: 28 bits, 6 pulses, 4 tracks */ - config.nbiter = 4; - move16(); /* 4x20x16=1280 loops */ - config.alp = 8192; /*1 in Q13*/ - move16(); /* coeff FOR sign setting */ - config.nb_pulse = 6; - move16(); - config.fixedpulses = 0; - move16(); - config.nbpos[0] = 6; - move16(); - config.nbpos[1] = 6; - move16(); - config.nbpos[2] = 8; - move16(); - BREAK; - - case 36: /* EVS/AMR-WB pulse indexing: 36 bits, 8 pulses, 4 tracks */ - config.nbiter = 4; - move16(); /* 4x20x16=1280 loops */ - config.alp = 8192; /*1 in Q13*/ - move16(); /* coeff FOR sign setting */ - config.nb_pulse = 8; - move16(); - config.fixedpulses = 2; - move16(); - config.nbpos[0] = 4; - move16(); - config.nbpos[1] = 8; - move16(); - config.nbpos[2] = 8; - move16(); - BREAK; - - case 43: /* EVS pulse indexing: 43 bits, 10 pulses, 4 tracks */ - case 44: /* AMR-WB pulse indexing: 44 bits, 10 pulses, 4 tracks */ - config.nbiter = 4; - move16(); /* 4x26x16=1664 loops */ - config.alp = 8192; /*1 in Q13*/ - move16(); - config.nb_pulse = 10; - move16(); - config.fixedpulses = 2; - move16(); - config.nbpos[0] = 4; - move16(); - config.nbpos[1] = 6; - move16(); - config.nbpos[2] = 8; - move16(); - config.nbpos[3] = 8; - move16(); - BREAK; - - case 50: /* EVS pulse indexing: 50 bits, 12 pulses, 4 tracks */ - case 52: /* AMR-WB pulse indexing: 52 bits, 12 pulses, 4 tracks */ - config.nbiter = 4; - move16(); /* 4x26x16=1664 loops */ - config.alp = 8192; /*1 in Q13*/ - move16(); - config.nb_pulse = 12; - move16(); - config.fixedpulses = 4; - move16(); - config.nbpos[0] = 4; - move16(); - config.nbpos[1] = 6; - move16(); - config.nbpos[2] = 8; - move16(); - config.nbpos[3] = 8; - move16(); - BREAK; - - case 62: /* EVS pulse indexing: 62 bits, 16 pulses, 4 tracks */ - case 64: /* AMR-WB pulse indexing: 64 bits, 16 pulses, 4 tracks */ - config.nbiter = 3; - move16(); /* 3x36x16=1728 loops */ - config.alp = 6554; /*.8f in Q13*/ - move16(); - config.nb_pulse = 16; - move16(); - config.fixedpulses = 4; - move16(); - config.nbpos[0] = 4; - move16(); - config.nbpos[1] = 4; - move16(); - config.nbpos[2] = 6; - move16(); - config.nbpos[3] = 6; - move16(); - config.nbpos[4] = 8; - move16(); - config.nbpos[5] = 8; - move16(); - BREAK; - - case 72: /* AMR-WB pulse indexing: 72 bits, 18 pulses, 4 tracks */ - config.nbiter = 3; - move16(); /* 3x35x16=1680 loops */ - config.alp = 6144; /*.75f in Q13*/ - move16(); - config.nb_pulse = 18; - move16(); - config.fixedpulses = 4; - move16(); - config.nbpos[0] = 2; - move16(); - config.nbpos[1] = 3; - move16(); - config.nbpos[2] = 4; - move16(); - config.nbpos[3] = 5; - move16(); - config.nbpos[4] = 6; - move16(); - config.nbpos[5] = 7; - move16(); - config.nbpos[6] = 8; - move16(); - BREAK; - - case 88: /* AMR-WB pulse indexing: 88 bits, 24 pulses, 4 tracks */ - config.nbiter = 2; - move16(); /* 2x53x16=1696 loop */ - config.alp = 4096; /*.5f in Q13*/ - move16(); - config.nb_pulse = 24; - move16(); - config.fixedpulses = 4; - move16(); - config.nbpos[0] = 2; - move16(); - config.nbpos[1] = 2; - move16(); - config.nbpos[2] = 3; - move16(); - config.nbpos[3] = 4; - move16(); - config.nbpos[4] = 5; - move16(); - config.nbpos[5] = 6; - move16(); - config.nbpos[6] = 7; - move16(); - config.nbpos[7] = 8; - move16(); - config.nbpos[8] = 8; - move16(); - config.nbpos[9] = 8; - move16(); - BREAK; - - case 87: /* EVS pulse indexing: 87 bits, 26 pulses, 4 tracks */ - config.nbiter = 1; - move16(); - config.alp = 4096; /*.5f in Q13*/ - move16(); - config.nb_pulse = 26; - move16(); - config.fixedpulses = 4; - move16(); - config.nbpos[0] = 4; - move16(); - config.nbpos[1] = 6; - move16(); - config.nbpos[2] = 6; - move16(); - config.nbpos[3] = 8; - move16(); - config.nbpos[4] = 8; - move16(); - config.nbpos[5] = 8; - move16(); - config.nbpos[6] = 8; - move16(); - config.nbpos[7] = 8; - move16(); - config.nbpos[8] = 8; - move16(); - config.nbpos[9] = 8; - move16(); - config.nbpos[10] = 8; - move16(); - BREAK; - } - - /* reduce the number of iterations as a compromise between the performance and complexity */ - if ( cmpl_flag > 0 ) - { - config.nbiter = cmpl_flag; - move16(); - } - - config.codetrackpos = TRACKPOS_FIXED_FIRST; - move16(); - config.bits = nbbits; - move16(); - - IF( acelpautoc ) - { - E_ACELP_4tsearchx_fx( dn, cn, R, code, &config, ind ); - - /* Generate weighted code */ - E_ACELP_weighted_code( code, H, 12, y ); - } - ELSE - { - E_ACELP_4tsearch_fx( dn, cn, H, code, &config, ind, y ); - - FOR( i = 0; i < L_SUBFR; i++ ) - { - y[i] = shr( y[i], 3 ); - move16(); /*Q9 */ - } - } - - /*-----------------------------------------------------------------* - * Indexing - *-----------------------------------------------------------------*/ - - IF( !Opt_AMR_WB ) - { - saved_bits = E_ACELP_indexing_fx( code, &config, NB_TRACK_FCB_4T, indexing_indices ); - - saved_bits = 0; - move16(); - - wordcnt = shr( nbbits, 4 ); - bitcnt = s_and( nbbits, 15 ); - FOR( i = 0; i < wordcnt; i++ ) - { - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, indexing_indices[i], 16 ); - } - IF( bitcnt ) - { - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, indexing_indices[i], bitcnt ); - } - } - ELSE - { - /* AMR-WB pulse indexing */ - - IF( EQ_16( nbbits, 20 ) ) - { - FOR( track = 0; track < NB_TRACK_FCB_4T; track++ ) - { - k = i_mult2( track, NPMAXPT ); - index = quant_1p_N1_fx( ind[k], 4 ); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, index, 5 ); - } - } - ELSE IF( EQ_16( nbbits, 36 ) ) - { - FOR( track = 0; track < NB_TRACK_FCB_4T; track++ ) - { - - k = i_mult2( track, NPMAXPT ); /* k = track * NPMAXPT;*/ - index = quant_2p_2N1_fx( ind[k], ind[k + 1], 4 ); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, index, 9 ); - } - } - ELSE IF( EQ_16( nbbits, 44 ) ) /* AMR-WB pulse indexing */ - { - FOR( track = 0; track < ( NB_TRACK_FCB_4T - 2 ); track++ ) - { - k = i_mult2( track, NPMAXPT ); - index = quant_3p_3N1_fx( ind[k], ind[k + 1], ind[k + 2], 4 ); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, index, 13 ); - } - - FOR( track = 2; track < NB_TRACK_FCB_4T; track++ ) - { - k = i_mult2( track, NPMAXPT ); - index = quant_2p_2N1_fx( ind[k], ind[k + 1], 4 ); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, index, 9 ); - } - } - ELSE IF( EQ_16( nbbits, 52 ) ) /* AMR-WB pulse indexing */ - { - FOR( track = 0; track < NB_TRACK_FCB_4T; track++ ) - { - k = i_mult2( track, NPMAXPT ); - index = quant_3p_3N1_fx( ind[k], ind[k + 1], ind[k + 2], 4 ); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, index, 13 ); - } - } - ELSE IF( EQ_16( nbbits, 64 ) ) /* AMR-WB pulse indexing */ - { - FOR( track = 0; track < NB_TRACK_FCB_4T; track++ ) - { - k = i_mult2( track, NPMAXPT ); - L_index = quant_4p_4N_fx( &ind[k], 4 ); - index = extract_l( L_shr( L_index, 14 ) & 3 ); - logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_1, index, 2 ); - } - - FOR( track = 0; track < NB_TRACK_FCB_4T; track++ ) - { - k = i_mult2( track, NPMAXPT ); - L_index = quant_4p_4N_fx( &ind[k], 4 ); - index = extract_l( L_index & 0x3FFF ); - logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_2, index, 14 ); - } - } - ELSE IF( EQ_16( nbbits, 72 ) ) - { - FOR( track = 0; track < ( NB_TRACK_FCB_4T - 2 ); track++ ) - { - k = i_mult2( track, NPMAXPT ); - L_index = quant_5p_5N_fx( &ind[k], 4 ); - index = extract_l( L_shr( L_index, 10 ) & 0x03FF ); - logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_1, index, 10 ); - } - - FOR( track = 2; track < NB_TRACK_FCB_4T; track++ ) - { - k = i_mult2( track, NPMAXPT ); - L_index = quant_4p_4N_fx( &ind[k], 4 ); - index = extract_l( L_shr( L_index, 14 ) & 3 ); - logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_1, index, 2 ); - } - - FOR( track = 0; track < ( NB_TRACK_FCB_4T - 2 ); track++ ) - { - k = i_mult2( track, NPMAXPT ); - L_index = quant_5p_5N_fx( &ind[k], 4 ); - index = extract_l( L_index & 0x03FF ); - logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_2, index, 10 ); - } - - FOR( track = 2; track < NB_TRACK_FCB_4T; track++ ) - { - k = i_mult2( track, NPMAXPT ); - L_index = quant_4p_4N_fx( &ind[k], 4 ); - index = extract_l( L_index & 0x3FFF ); - logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_2, index, 14 ); - } - } - ELSE IF( EQ_16( nbbits, 88 ) ) - { - FOR( track = 0; track < NB_TRACK_FCB_4T; track++ ) - { - k = i_mult2( track, NPMAXPT ); - L_index = quant_6p_6N_2_fx( &ind[k], 4 ); - index = extract_l( L_shr( L_index, 11 ) & 0x07FF ); - logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_1, index, 11 ); - } - - FOR( track = 0; track < NB_TRACK_FCB_4T; track++ ) - { - k = i_mult2( track, NPMAXPT ); - L_index = quant_6p_6N_2_fx( &ind[k], 4 ); - index = extract_l( L_index & 0x07FF ); - logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_2, index, 11 ); - } - } - } - - return saved_bits; -} - - -Word16 acelp_4t64_ivas_fx( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ Word16 dn[], /* i : corr. between target and h[]. */ const Word16 cn[], /* i : residual after long term prediction Q_new*/ @@ -481,9 +67,8 @@ Word16 acelp_4t64_ivas_fx( Word16 nbbits, /* i : number of bits per codebook */ const Word16 cmpl_flag, /* i : complexity reduction flag */ const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - Word16 element_mode ) + const Word16 element_mode ) { - Word16 i, k, index, track; Word32 L_index; Word16 ind[NPMAXPT * NB_TRACK_FCB_4T + 32]; /* VE3: why +32 ???*/ @@ -708,21 +293,19 @@ Word16 acelp_4t64_ivas_fx( } config.codetrackpos = TRACKPOS_FIXED_FIRST; - move32(); + move16(); config.bits = nbbits; move16(); IF( acelpautoc ) { - E_ACELP_4tsearchx_ivas_fx( dn, cn, R, code, &config, ind, element_mode ); - + E_ACELP_4tsearchx_fx( dn, cn, R, code, &config, ind, element_mode ); /* Generate weighted code */ E_ACELP_weighted_code( code, H, 12, y ); } ELSE { - E_ACELP_4tsearch_fx( dn, cn, H, code, &config, ind, y ); - + E_ACELP_4tsearch_fx( dn, cn, H, code, &config, ind, y, 0 ); FOR( i = 0; i < L_SUBFR; i++ ) { y[i] = shr( y[i], 3 ); @@ -883,14 +466,16 @@ Word16 acelp_4t64_ivas_fx( return saved_bits; } + /*---------------------------------------------------------------------* *encode class for 3p 4p 5p 6p/track * *---------------------------------------------------------------------*/ -static Word32 fcb_encode_cl_fx( /* o: class index of the pulse on a track */ - const Word32 buffer[], /* i: pulses on a track */ - const Word32 pulse_num, /* i: pulses number on a track */ - const Word32 pos_num /* i: number of the position which have pulse */ +/* o: comfort noise gain factor */ +static Word32 fcb_encode_cl_fx( + const Word32 buffer[], /* i : pulses on a track */ + const Word32 pulse_num, /* i : pulses number on a track */ + const Word32 pos_num /* i : number of the position which have pulse */ ) { Word32 i, k; @@ -915,9 +500,11 @@ static Word32 fcb_encode_cl_fx( /* o: class index of t /*---------------------------------------------------------------------* *encode fcb pulse index * *---------------------------------------------------------------------*/ -static Word32 fcb_encode_PI_fx( /* o: return index of the pulse on a track */ - const Word16 v[], /* i: pulse on a track Q9 */ - const Word32 pulse_num /* i: number of the pulse on a track */ + +/* o: return index of the pulse on a track */ +static Word32 fcb_encode_PI_fx( + const Word16 v[], /* i : pulse on a track Q9 */ + const Word32 pulse_num /* i : number of the pulse on a track */ ) { Word16 sector_p[7]; @@ -943,10 +530,12 @@ static Word32 fcb_encode_PI_fx( /* o: return index of t /*---------------------------------------------------------------------* *encode the class and compute class offset * *---------------------------------------------------------------------*/ -static Word32 fcb_encode_class_fx( /* o: class offset */ - const Word32 sector_6p_num[], /* i: position which have pulse on a track */ - const Word32 pulse_num, /* i: pulse number on a track */ - const Word32 pulse_pos_num /* i: number of position which have pulse on a track */ + +/* o: class offset */ +static Word32 fcb_encode_class_fx( + const Word32 sector_6p_num[], /* i : position which have pulse on a track */ + const Word32 pulse_num, /* i : pulse number on a track */ + const Word32 pulse_pos_num /* i : number of position which have pulse on a track */ ) { Word32 i, j, k; @@ -976,14 +565,18 @@ static Word32 fcb_encode_class_fx( /* o: class o } return mn9_offet; } + + /*---------------------------------------------------------------------* *encode the position * *---------------------------------------------------------------------*/ -static Word32 fcb_encode_position_fx( /* o: return index of the positions which have pulse*/ - const Word16 pos_vector[], /* i: position of the pulse on a track */ - Word32 n, - const Word32 pos_num, /* i: the number of position which have pulse */ - const Word32 flag ) + +/* o: return index of the positions which have pulse*/ +static Word32 fcb_encode_position_fx( + const Word16 pos_vector[], /* i: position of the pulse on a track */ + Word32 n, + const Word32 pos_num, /* i: the number of position which have pulse */ + const Word32 flag ) { Word32 i; Word32 mmm1; @@ -1015,20 +608,17 @@ static Word32 fcb_encode_position_fx( /* o: return return mmm1; } -/*-------------------------------------------------------------------* - * search_ixiy - * - * Find the best positions of 2 pulses in a subframe - *-------------------------------------------------------------------*/ /*------------------------------------------------------------* * quant_1p_N1 * * Quantization of 1 pulse with N+1 bits: *-------------------------------------------------------------*/ -static Word16 quant_1p_N1_fx( /* o : return N+1 bits */ - const Word16 pos, /* i : position of the pulse */ - const Word16 N /* i : number of bits FOR position */ + +/* o : return N+1 bits */ +static Word16 quant_1p_N1_fx( + const Word16 pos, /* i : position of the pulse */ + const Word16 N /* i : number of bits FOR position */ ) { Word16 mask; @@ -1042,6 +632,7 @@ static Word16 quant_1p_N1_fx( /* o : return N+1 bits { index = add( index, shl( 1, N ) ); /* index += 1 << N */ } + return index; } @@ -1050,11 +641,15 @@ static Word16 quant_1p_N1_fx( /* o : return N+1 bits * quant_2p_2N1_fx * * Quantization of 2 pulses with 2*N+1 bits: + + *-------------------------------------------------------------*/ -Word16 quant_2p_2N1_fx( /* o: return (2*N)+1 bits */ - const Word16 pos1, /* i: position of the pulse 1 */ - const Word16 pos2, /* i: position of the pulse 2 */ - const Word16 N /* i: number of bits FOR position */ + +/* o: return (2*N)+1 bits */ +Word16 quant_2p_2N1_fx( + const Word16 pos1, /* i : position of the pulse 1 */ + const Word16 pos2, /* i : position of the pulse 2 */ + const Word16 N /* i : number of bits FOR position */ ) { Word16 mask, tmp; @@ -1116,23 +711,29 @@ Word16 quant_2p_2N1_fx( /* o: return (2*N)+1 bits */ return index; } + + /*---------------------------------------------------------------------* * Quantization of 3 pulses with 3*N+1 bits: * *---------------------------------------------------------------------*/ -static Word16 quant_3p_3N1_fx( /* o : return (3*N)+1 bits */ - const Word16 pos1, /* i : position of the pulse 1 */ - const Word16 pos2, /* i : position of the pulse 2 */ - const Word16 pos3, /* i : position of the pulse 3 */ - const Word16 N /* i : number of bits for position */ + +/* o : return (3*N)+1 bits */ +static Word16 quant_3p_3N1_fx( + const Word16 pos1, /* i : position of the pulse 1 */ + const Word16 pos2, /* i : position of the pulse 2 */ + const Word16 pos3, /* i : position of the pulse 3 */ + const Word16 N /* i : number of bits for position */ ) { Word16 nb_pos; Word16 index; nb_pos = shl( 1, sub( N, 1 ) ); /* nb_pos = (1<<(N-1)); */ + /*-------------------------------------------------------* * Quantization of 3 pulses with 3*N+1 bits: * *-------------------------------------------------------*/ + logic16(); logic16(); logic16(); @@ -1159,32 +760,38 @@ static Word16 quant_3p_3N1_fx( /* o : return (3*N)+1 bits ELSE { index = quant_2p_2N1_fx( pos2, pos3, sub( N, 1 ) ); /* index = quant_2p_2N1_fx(pos2, pos3, (N-1)); */ - /* index += (pos2 & nb_pos) << N; */ + /* index += (pos2 & nb_pos) << N; */ index = add( index, shl( (Word16) ( pos2 & nb_pos ), N ) ); logic16(); - /* index += quant_1p_N1_fx(pos1, N) << (2*N); */ + /* index += quant_1p_N1_fx(pos1, N) << (2*N); */ index = add( index, shl( quant_1p_N1_fx( pos1, N ), shl( N, 1 ) ) ); } return ( index ); } + + /*---------------------------------------------------------------------* * Quantization of 4 pulses with 4*N+1 bits: * *---------------------------------------------------------------------*/ -static Word32 quant_4p_4N1_fx( /* o : return (4*N)+1 bits */ - const Word16 pos1, /* i : position of the pulse 1 */ - const Word16 pos2, /* i : position of the pulse 2 */ - const Word16 pos3, /* i : position of the pulse 3 */ - const Word16 pos4, /* i : position of the pulse 4 */ - const Word16 N /* i : number of bits for position */ + +/* o : return (4*N)+1 bits */ +static Word32 quant_4p_4N1_fx( + const Word16 pos1, /* i : position of the pulse 1 */ + const Word16 pos2, /* i : position of the pulse 2 */ + const Word16 pos3, /* i : position of the pulse 3 */ + const Word16 pos4, /* i : position of the pulse 4 */ + const Word16 N /* i : number of bits for position */ ) { Word16 nb_pos; Word32 index; nb_pos = shl( 1, sub( N, 1 ) ); /* nb_pos = (1<<(N-1)); */ + /*-------------------------------------------------------* * Quantization of 4 pulses with 4*N+1 bits: * *-------------------------------------------------------*/ + logic16(); logic16(); logic16(); @@ -1192,7 +799,7 @@ static Word32 quant_4p_4N1_fx( /* o : return (4*N)+1 bits IF( ( ( pos1 ^ pos2 ) & nb_pos ) == 0 ) { index = quant_2p_2N1_fx( pos1, pos2, sub( N, 1 ) ); /* index = quant_2p_2N1_fx(pos1, pos2, (N-1)); */ - /* index += (pos1 & nb_pos) << N; */ + /* index += (pos1 & nb_pos) << N; */ index = L_add( index, L_shl( L_deposit_l( (Word16) ( pos1 & nb_pos ) ), N ) ); logic16(); /* index += quant_2p_2N1_fx(pos3, pos4, N) << (2*N); */ @@ -1216,15 +823,19 @@ static Word32 quant_4p_4N1_fx( /* o : return (4*N)+1 bits /* index += quant_2p_2N1_fx(pos1, pos4, N) << (2*N); */ index = L_add( index, L_shl( quant_2p_2N1_fx( pos1, pos4, N ), shl( N, 1 ) ) ); } + return ( index ); } + + /*---------------------------------------------------------------------* * Quantization of 4 pulses with 4*N bits: * *---------------------------------------------------------------------*/ -static Word32 quant_4p_4N_fx( /* o : return 4*N bits */ - const Word16 pos[], /* i : position of the pulse 1..4 */ - const Word16 N /* i : number of bits for position */ +/* o : return 4*N bits */ +static Word32 quant_4p_4N_fx( + const Word16 pos[], /* i : position of the pulse 1..4 */ + const Word16 N /* i : number of bits for position */ ) { Word16 i, j, k, nb_pos, n_1, tmp; @@ -1296,9 +907,10 @@ static Word32 quant_4p_4N_fx( /* o : return 4*N bits } -static Word32 quant_5p_5N_fx( /* o : return 5*N bits */ - const Word16 pos[], /* i : position of the pulse 1..5 */ - const Word16 N ) /* i : number of bits for position */ +/* o : return 5*N bits */ +static Word32 quant_5p_5N_fx( + const Word16 pos[], /* i : position of the pulse 1..5 */ + const Word16 N ) /* i : number of bits for position */ { Word16 i, j, k, nb_pos, n_1, tmp; Word16 posA[5], posB[5]; @@ -1376,9 +988,11 @@ static Word32 quant_5p_5N_fx( /* o : return 5*N bits return ( index ); } -static Word32 quant_6p_6N_2_fx( /* o : return (6*N)-2 bits */ - const Word16 pos[], /* i : position of the pulse 1..6 */ - const Word16 N ) /* i : number of bits for position */ + +/* o : return (6*N)-2 bits */ +static Word32 quant_6p_6N_2_fx( + const Word16 pos[], /* i : position of the pulse 1..6 */ + const Word16 N ) /* i : number of bits for position */ { Word16 i, j, k, nb_pos, n_1; Word16 posA[6], posB[6]; @@ -1462,11 +1076,13 @@ static Word32 quant_6p_6N_2_fx( /* o : return (6*N)-2 bits /*---------------------------------------------------------------------* *order the pulse position * *---------------------------------------------------------------------*/ -static Word32 pre_process_fx( /* o: return sign value of pulse on a track */ - const Word16 v[], /* i: the pulse vector Q9 */ - Word16 pos_vector[], /* o: position of the pulse on a track */ - Word32 pos_vector_num[], /* o: the pulse number on the position which have pulse Q0 */ - Word32 *pulse_pos_num /* i: the number of position which have pulse */ + +/* o: return sign value of pulse on a track */ +static Word32 pre_process_fx( + const Word16 v[], /* i : the pulse vector Q9 */ + Word16 pos_vector[], /* o : position of the pulse on a track */ + Word32 pos_vector_num[], /* o : the pulse number on the position which have pulse Q0 */ + Word32 *pulse_pos_num /* i : the number of position which have pulse */ ) { Word16 j, k; diff --git a/lib_enc/cod_ace_fx.c b/lib_enc/cod_ace_fx.c index e701b8e466b946d9c4c6cbc739f4a77476e558ca..66819c4acfaff9185d2be31f54171452a3ba7286 100644 --- a/lib_enc/cod_ace_fx.c +++ b/lib_enc/cod_ace_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -37,14 +37,8 @@ Word16 coder_acelp_fx( /* o : SEGSNR for CL decision * Word16 *bwe_exc /* o : excitation for SWB TBE Qx */ ) { -#ifndef SIMPLIFY_CODE_BE - Word16 i, j, i_subfr, j_subfr; - Word16 tmp, tmp2, Es_pred; - Word32 gain_code_vect[2]; -#else Word16 i, i_subfr, j_subfr; Word16 tmp, Es_pred; -#endif Word16 T0, T0_min, T0_min_frac, T0_max, T0_max_frac, T0_res; Word16 T0_frac; Word16 gain_pit, voice_fac; @@ -81,10 +75,6 @@ Word16 coder_acelp_fx( /* o : SEGSNR for CL decision * Word16 dummy = 0; move16(); ACELP_config *acelp_cfg; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif acelp_cfg = &( st->acelp_cfg ); LPD_state_HANDLE hLPDmem = st->hLPDmem; @@ -103,11 +93,7 @@ Word16 coder_acelp_fx( /* o : SEGSNR for CL decision * /* Configure ACELP */ -#ifndef MSAN_FIX - hLPDmem->nbits = BITS_ALLOC_config_acelp( target_bits, st->coder_type, acelp_cfg, st->narrowBand, st->nb_subfr ); -#else BITS_ALLOC_config_acelp( target_bits, st->coder_type, acelp_cfg, st->narrowBand, st->nb_subfr ); -#endif /* Init Framing parameters */ move16(); @@ -324,12 +310,6 @@ Word16 coder_acelp_fx( /* o : SEGSNR for CL decision * gp_clip_test_gain_pit_fx( st->element_mode, st->core_brate, gain_pit, st->clip_var_fx ); -#ifndef SIMPLIFY_CODE_BE - gain_code_vect[0] = gain_code; - move32(); - gain_code_vect[1] = gain_code; - move32(); -#endif /*----------------------------------------------------------* * - voice factor (for pitch enhancement) * *----------------------------------------------------------*/ @@ -361,56 +341,31 @@ Word16 coder_acelp_fx( /* o : SEGSNR for CL decision * /*-------------------------------------------------------* * - Find the total excitation. * *-------------------------------------------------------*/ -#ifndef SIMPLIFY_CODE_BE - tmp2 = shr( L_SUBFR, 1 ); - FOR( j = 0; j < 2; j++ ) - { - FOR( i = sub( tmp2, shr( L_SUBFR, 1 ) ); i < tmp2; i++ ) - { - /* code in Q9, gain_pit in Q14; exc Q_new */ - Ltmp = Mpy_32_16_1( gain_code2, code2[i] ); - Ltmp = L_shl( Ltmp, Q_new_p5 ); - Ltmp = L_mac( Ltmp, gain_pit, exc[i + i_subfr] ); - BASOP_SATURATE_WARNING_OFF_EVS - exc2[i] = round_fx( L_shl( Ltmp, 1 ) ); - BASOP_SATURATE_WARNING_ON_EVS - - Ltmp2 = Mpy_32_16_1( gain_code_vect[j], code[i] ); - Ltmp2 = L_shl( Ltmp2, Q_new_p5 ); - Ltmp = L_add( Ltmp, Ltmp2 ); - BASOP_SATURATE_WARNING_OFF_EVS - Ltmp = L_shl( Ltmp, 1 ); /* saturation can occur here */ - BASOP_SATURATE_WARNING_ON_EVS - exc[i + i_subfr] = round_fx( Ltmp ); - } - tmp2 = L_SUBFR; - move16(); - } -#else FOR( i = 0; i < L_SUBFR; i++ ) { /* code in Q9, gain_pit in Q14; exc Q_new */ Ltmp = Mpy_32_16_1( gain_code2, code2[i] ); Ltmp = L_shl( Ltmp, Q_new_p5 ); Ltmp = L_mac( Ltmp, gain_pit, exc[i + i_subfr] ); - exc2[i] = round_fx_sat( L_shl_o( Ltmp, 1, &Overflow ) ); + exc2[i] = round_fx_sat( L_shl_sat( Ltmp, 1 ) ); move16(); Ltmp2 = Mpy_32_16_1( gain_code, code[i] ); Ltmp2 = L_shl_sat( Ltmp2, Q_new_p5 ); Ltmp = L_add_sat( Ltmp, Ltmp2 ); - Ltmp = L_shl_o( Ltmp, 1, &Overflow ); /* saturation can occur here */ - exc[i + i_subfr] = round_fx_o( Ltmp, &Overflow ); + Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here */ + exc[i + i_subfr] = round_fx_sat( Ltmp ); move16(); } -#endif + /*-----------------------------------------------------------------* * Prepare TBE excitation *-----------------------------------------------------------------*/ IF( st->igf != 0 ) { - prep_tbe_exc_fx( L_frame, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], - bwe_exc, gain_preQ, code_preQ, Q_new, T0, T0_frac, st->coder_type, st->core_brate ); + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], + bwe_exc, gain_preQ, code_preQ, Q10, Q_new, T0, T0_frac, st->coder_type, st->core_brate, + st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); } /*---------------------------------------------------------* diff --git a/lib_enc/cod_tcx_fx.c b/lib_enc/cod_tcx_fx.c index e6fc25e367957fef69abbe7dc45e9035bd516f31..a60d070a5ee6e7471e8f1f6d554019cc19310a7f 100644 --- a/lib_enc/cod_tcx_fx.c +++ b/lib_enc/cod_tcx_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -8,21 +8,18 @@ #include #include "rom_com.h" #include "stat_com.h" -// #include "prot_fx.h" #include "prot_fx.h" #include "basop_util.h" #include "stl.h" -// #include "basop_mpy.h" #include "prot_fx_enc.h" -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS #include #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" -#endif +#include "ivas_rom_com.h" #ifdef DEBUGGING #include "debug.h" #endif + #define SIMILAR_TNS_THRESHOLD_FX_IN_Q15 ( 1311 ) #define TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q7 ( 384 ) #define TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23 ( 25165824 ) @@ -43,10 +40,8 @@ void HBAutocorrelation_fx( Word32 L_tmp, L_sum; Word16 y[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif /*-----------------------------------------------------------* * Windowing * @@ -140,487 +135,7 @@ void HBAutocorrelation_fx( move32(); } } -#ifdef ADD_IVAS_TNS - -/*-------------------------------------------------------------------* - * TNSAnalysisStereo() - * - * - *-------------------------------------------------------------------*/ - -#define SIMILAR_TNS_THRESHOLD ( 0.04f ) -#define TNS_GAIN_THRESHOLD_FOR_WHITE ( 3.0f ) -void TNSAnalysisStereo( - Encoder_State **sts, /* i : encoder state handle */ - float *mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* o : MDST spectrum */ - const int16_t bWhitenedDomain, /* i : whitened domain flag */ - int16_t tnsSize[MCT_MAX_CHANNELS][NB_DIV], /* i : number of tns parameters put into prm */ - int16_t tnsBits[MCT_MAX_CHANNELS][NB_DIV], /* i : number of tns bits in the frame */ - int16_t param_core[][NB_DIV * NPRM_DIV], /* o : TNS parameters */ - const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ -) -{ - int16_t ch, k, L_spec, L_frame, nSubframes, iFilter; - float *spectrum; - Encoder_State *st = NULL; - TCX_ENC_HANDLE hTcxEnc = NULL; - int16_t individual_decision[NB_DIV]; - float maxPredictionGain = 0.f, meanPredictionGain; - - individual_decision[0] = 0; - individual_decision[1] = 0; - L_spec = -1; - L_frame = -1; - - /* TNS filter analysis, loop over channels */ - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = sts[ch]; - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - continue; - } - - hTcxEnc = st->hTcxEnc; - - nSubframes = ( hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - - for ( k = 0; k < nSubframes; k++ ) - { - /* reset tns on whitened domain flag */ - if ( !bWhitenedDomain ) - { - hTcxEnc->bTnsOnWhithenedSpectra[k] = 0; - hTcxEnc->fUseTns[k] = 0; - } - - if ( st->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) - { - - spectrum = hTcxEnc->spectrum[k]; - L_frame = hTcxEnc->L_frameTCX; - st->hTcxCfg->pCurrentTnsConfig = &st->hTcxCfg->tnsConfig[hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( st->last_core == ACELP_CORE )]; - L_spec = st->hTcxCfg->pCurrentTnsConfig->iFilterBorders[0]; - - /*-----------------------------------------------------------* - * Temporal Noise Shaping analysis * - *-----------------------------------------------------------*/ - - if ( hTcxEnc->transform_type[k] == TCX_5 ) - { - /* rearrange LF sub-window lines prior to TNS analysis & filtering */ - tcx5TnsGrouping( L_frame >> 2, L_spec >> 1, spectrum ); - } - - /* WMOPS: All initializations are either for safety or static (tables) and thus not to be counted */ - ResetTnsData( &hTcxEnc->tnsData[k] ); - if ( st->hTcxCfg->pCurrentTnsConfig->maxOrder <= 0 ) - { - break; - } - - CalculateTnsFilt( st->hTcxCfg->pCurrentTnsConfig, spectrum, &hTcxEnc->tnsData[k], NULL ); - } - } - } - - if ( !mct_on ) - { - /* TNS decision */ - /* if framing differs between channels, keep the filter decision per channel */ - if ( ( sts[0]->hTcxEnc->transform_type[0] != sts[1]->hTcxEnc->transform_type[0] && - sts[0]->hTcxEnc->transform_type[1] != sts[1]->hTcxEnc->transform_type[1] ) || - sts[0]->hTcxCfg->fIsTNSAllowed != sts[1]->hTcxCfg->fIsTNSAllowed ) - { - individual_decision[0] = individual_decision[1] = 1; - } - else if ( bWhitenedDomain ) - { - nSubframes = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - for ( k = 0; k < nSubframes; k++ ) - { - if ( sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] != sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) - { - individual_decision[k] = 1; - } - } - } - - /* framing equal, check for similar filters, if very similar (also indicator for and M signal), - * use at least the same decision, maybe use the same filter - */ - { - int16_t isTCX10; - isTCX10 = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 0 : 1; - - nSubframes = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - - for ( k = 0; k < nSubframes; k++ ) - { - if ( sts[0]->hTcxCfg->fIsTNSAllowed && individual_decision[k] != 1 && ( !bWhitenedDomain || sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) - { - float maxPredGain = -1.0f; - sts[0]->hTcxCfg->pCurrentTnsConfig = &sts[0]->hTcxCfg->tnsConfig[sts[0]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[0]->last_core == ACELP_CORE )]; - sts[1]->hTcxCfg->pCurrentTnsConfig = &sts[1]->hTcxCfg->tnsConfig[sts[1]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[1]->last_core == ACELP_CORE )]; - -#ifdef DEBUGGING - assert( sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters == sts[1]->hTcxCfg->pCurrentTnsConfig->nMaxFilters ); -#endif - for ( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - STnsFilter *pFilter[2]; - struct TnsParameters const *pTnsParameters[2]; - pFilter[0] = sts[0]->hTcxEnc->tnsData[k].filter + iFilter; - pTnsParameters[0] = sts[0]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter; - pFilter[1] = sts[1]->hTcxEnc->tnsData[k].filter + iFilter; - pTnsParameters[1] = sts[1]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter; - -#ifdef DEBUGGING - assert( pTnsParameters[0]->startLineFrequency == pTnsParameters[1]->startLineFrequency ); - assert( pTnsParameters[0]->nSubdivisions == pTnsParameters[1]->nSubdivisions ); -#endif - /* if prediction gain and avgSqrCoef are both close we are pretty sure the filters are quite similar, use the avg of - * both filters for the decision - */ - meanPredictionGain = ( pFilter[0]->predictionGain + pFilter[1]->predictionGain ) * 0.5f; - maxPredictionGain = max( maxPredictionGain, meanPredictionGain ); - - if ( ( pFilter[0]->predictionGain > pTnsParameters[0]->minPredictionGain ) && ( sts[0]->element_brate < IVAS_80k ) && - ( pFilter[1]->predictionGain > pTnsParameters[1]->minPredictionGain ) && ( sts[0]->hTcxEnc->tnsData[k].nFilters == sts[1]->hTcxEnc->tnsData[k].nFilters ) ) - { - pFilter[0]->predictionGain = pFilter[1]->predictionGain = meanPredictionGain; /* more TNS filter sync at 48kbps */ - } - if ( ( fabs( pFilter[0]->predictionGain - pFilter[1]->predictionGain ) < SIMILAR_TNS_THRESHOLD * meanPredictionGain ) && - ( sts[0]->hTcxEnc->tnsData[k].nFilters == sts[1]->hTcxEnc->tnsData[k].nFilters ) ) - { - float maxAvgSqrCoef = max( pFilter[0]->avgSqrCoef, pFilter[1]->avgSqrCoef ); - float meanLtpGain = ( sts[0]->hTcxEnc->tcxltp_gain + sts[1]->hTcxEnc->tcxltp_gain ) * 0.5f; - maxPredGain = max( maxPredGain, meanPredictionGain ); - if ( ( meanPredictionGain > pTnsParameters[0]->minPredictionGain ) || ( maxAvgSqrCoef > pTnsParameters[0]->minAvgSqrCoef ) ) - { - if ( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 || sts[1]->hTcxEnc->tnsData[k].nFilters > 0 || isTCX10 || meanLtpGain < 0.6f ) - { - ++sts[0]->hTcxEnc->tnsData[k].nFilters; - pFilter[0]->filterType = TNS_FILTER_ON; - ++sts[1]->hTcxEnc->tnsData[k].nFilters; - pFilter[1]->filterType = TNS_FILTER_ON; - } - else - { - const float maxEnergyChange = ( GetTCXMaxenergyChange( sts[0]->hTranDet, isTCX10, NSUBBLOCKS, 3 ) + GetTCXMaxenergyChange( sts[1]->hTranDet, isTCX10, NSUBBLOCKS, 3 ) ) * 0.5f; - - if ( maxEnergyChange >= pTnsParameters[0]->minEnergyChange ) - { - ++sts[0]->hTcxEnc->tnsData[k].nFilters; - pFilter[0]->filterType = TNS_FILTER_ON; - ++sts[1]->hTcxEnc->tnsData[k].nFilters; - pFilter[1]->filterType = TNS_FILTER_ON; - } - else - { - pFilter[0]->filterType = TNS_FILTER_OFF; - pFilter[1]->filterType = TNS_FILTER_OFF; - } - } - } - else if ( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 && sts[1]->hTcxEnc->tnsData[k].nFilters > 0 ) /* If a previous filter is turned on */ - { - pFilter[0]->filterType = TNS_FILTER_ON_ZERO; - pFilter[1]->filterType = TNS_FILTER_ON_ZERO; - ++sts[0]->hTcxEnc->tnsData[k].nFilters; - ++sts[1]->hTcxEnc->tnsData[k].nFilters; - } - else if ( sts[0]->hTcxEnc->tnsData[k].nFilters != sts[1]->hTcxEnc->tnsData[k].nFilters ) /* sanity check */ - { - assert( 0 ); - } - else - { - pFilter[0]->filterType = TNS_FILTER_OFF; - pFilter[1]->filterType = TNS_FILTER_OFF; - } - if ( ( pFilter[0]->filterType == TNS_FILTER_ON ) && ( pFilter[1]->filterType == TNS_FILTER_ON ) && ( sts[0]->element_brate < IVAS_80k ) ) - { - int16_t tmpIntValue = 0; - int16_t tmpCoeff[TNS_MAX_FILTER_ORDER]; - int16_t i, maxOrder = max( pFilter[0]->order, pFilter[1]->order ); - - set_s( tmpCoeff, 0, TNS_MAX_FILTER_ORDER ); - for ( i = 0; i < maxOrder; i++ ) - { - tmpIntValue = (int16_t) max( tmpIntValue, abs( pFilter[0]->coefIndex[i] - pFilter[1]->coefIndex[i] ) ); - } - if ( tmpIntValue == 1 ) /* the TNS coefficients are sufficiently similar to equalize the two filters */ - { - for ( i = maxOrder - 1; i >= 0; i-- ) - { - tmpCoeff[i] = ( abs( pFilter[0]->coefIndex[i] ) < abs( pFilter[1]->coefIndex[i] ) ? pFilter[0]->coefIndex[i] : pFilter[1]->coefIndex[i] ); - if ( ( tmpIntValue > 0 ) && ( tmpCoeff[i] == 0 ) ) - { - maxOrder--; - } - else - { - tmpIntValue = 0; - } - } - /* make sure that maxOrder is non zero and not all coefficients are zero (could happen in rare cases) */ - if ( maxOrder > 0 ) - { - for ( i = TNS_MAX_FILTER_ORDER - 1; i >= 0; i-- ) - { - pFilter[0]->coefIndex[i] = pFilter[1]->coefIndex[i] = tmpCoeff[i]; - } - - pFilter[0]->order = pFilter[1]->order = maxOrder; - } - } - } - } - else - { - individual_decision[k] = 1; - } - } - - if ( individual_decision[k] == 0 ) - { - sts[0]->hTcxEnc->fUseTns[k] = ( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 ) ? 1 : 0; - sts[1]->hTcxEnc->fUseTns[k] = ( sts[1]->hTcxEnc->tnsData[k].nFilters > 0 ) ? 1 : 0; - } - else - { - sts[0]->hTcxEnc->tnsData[k].nFilters = 0; - sts[1]->hTcxEnc->tnsData[k].nFilters = 0; - sts[0]->hTcxEnc->fUseTns[k] = 0; - sts[1]->hTcxEnc->fUseTns[k] = 0; - for ( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - sts[0]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF; - sts[1]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF; - } - } - - if ( !bWhitenedDomain && individual_decision[k] == 0 && maxPredGain < TNS_GAIN_THRESHOLD_FOR_WHITE && sts[0]->hTcxEnc->transform_type[k] != TCX_5 ) - { - sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1; - sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1; - sts[0]->hTcxEnc->tnsData[k].nFilters = 0; - sts[1]->hTcxEnc->tnsData[k].nFilters = 0; - sts[0]->hTcxEnc->fUseTns[k] = 0; - sts[1]->hTcxEnc->fUseTns[k] = 0; - for ( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - ClearTnsFilterCoefficients( sts[0]->hTcxEnc->tnsData[k].filter + iFilter ); - ClearTnsFilterCoefficients( sts[1]->hTcxEnc->tnsData[k].filter + iFilter ); - } - } - maxPredictionGain = max( maxPredictionGain, maxPredGain ); - } - } - } - } - - /* individual decision for each channel */ - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - continue; - } - - int16_t isTCX10; - isTCX10 = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 0 : 1; - - nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - - for ( k = 0; k < nSubframes; k++ ) - { - if ( sts[ch]->hTcxCfg->fIsTNSAllowed && ( individual_decision[k] || mct_on ) && - ( !bWhitenedDomain || sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) - { - float maxPredGain = -1.0f; - - sts[ch]->hTcxCfg->pCurrentTnsConfig = &sts[ch]->hTcxCfg->tnsConfig[sts[ch]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[ch]->last_core == ACELP_CORE )]; - - for ( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - STnsFilter *pFilter; - const struct TnsParameters *pTnsParameters; - pFilter = sts[ch]->hTcxEnc->tnsData[k].filter + iFilter; - pTnsParameters = sts[ch]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter; - maxPredGain = max( maxPredGain, pFilter->predictionGain ); - - if ( ( pFilter->predictionGain > pTnsParameters->minPredictionGain ) || ( pFilter->avgSqrCoef > pTnsParameters->minAvgSqrCoef ) ) - { - if ( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 || isTCX10 || sts[ch]->hTcxEnc->tcxltp_gain < 0.6f ) - { - ++sts[ch]->hTcxEnc->tnsData[k].nFilters; - pFilter->filterType = TNS_FILTER_ON; - } - else - { - const float maxEnergyChange = GetTCXMaxenergyChange( sts[ch]->hTranDet, isTCX10, NSUBBLOCKS, 3 ); - - if ( maxEnergyChange >= pTnsParameters->minEnergyChange ) - { - ++sts[ch]->hTcxEnc->tnsData[k].nFilters; - pFilter->filterType = TNS_FILTER_ON; - } - else - { - pFilter->filterType = TNS_FILTER_OFF; - } - } - } - else if ( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 ) /* If a previous filter is turned on */ - { - pFilter->filterType = TNS_FILTER_ON_ZERO; - ++sts[ch]->hTcxEnc->tnsData[k].nFilters; - } - else - { - pFilter->filterType = TNS_FILTER_OFF; - } - } - - sts[ch]->hTcxEnc->fUseTns[k] = ( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 ) ? 1 : 0; - - if ( !bWhitenedDomain && maxPredGain < TNS_GAIN_THRESHOLD_FOR_WHITE && sts[ch]->hTcxEnc->transform_type[k] != TCX_5 ) - { - sts[ch]->hTcxEnc->fUseTns[k] = 0; - sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1; - sts[ch]->hTcxEnc->tnsData[k].nFilters = 0; - for ( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - ClearTnsFilterCoefficients( sts[ch]->hTcxEnc->tnsData[k].filter + iFilter ); - sts[ch]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF; - } - } - maxPredictionGain = max( maxPredictionGain, maxPredGain ); - } - } - } - - - /* we have the decision, set filter data accordingly */ - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - continue; - } - - nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - - for ( k = 0; k < nSubframes; k++ ) - { - if ( sts[ch]->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) - { - sts[ch]->hTcxCfg->pCurrentTnsConfig = &sts[ch]->hTcxCfg->tnsConfig[sts[ch]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[ch]->last_core == ACELP_CORE )]; - - for ( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - STnsFilter *pFilter; - pFilter = sts[ch]->hTcxEnc->tnsData[k].filter + iFilter; - switch ( pFilter->filterType ) - { - case TNS_FILTER_OFF: - ClearTnsFilterCoefficients( sts[ch]->hTcxEnc->tnsData[k].filter + iFilter ); - break; - case TNS_FILTER_ON_ZERO: - /* Since TNS filter of order 0 is not allowed we have to signal in the stream filter of order 1 with the 0th coefficient equal to 0 */ - ClearTnsFilterCoefficients( pFilter ); - pFilter->order = 1; - break; - } - } - } - } - } - - /* Apply filters, loop over channels */ - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = sts[ch]; - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - continue; - } - - nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - - for ( k = 0; k < nSubframes; k++ ) - { - if ( bWhitenedDomain && ( ch > 0 ) && /* test for identical TNS filter data in both channels */ - sts[0]->hTcxCfg->fIsTNSAllowed && sts[0]->hTcxEnc->fUseTns[k] && - sts[1]->hTcxCfg->fIsTNSAllowed && sts[1]->hTcxEnc->fUseTns[k] ) - { - int16_t equalFilterData = ( sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters == sts[1]->hTcxCfg->pCurrentTnsConfig->nMaxFilters && - sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] == sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] && - sts[0]->hTcxEnc->tnsData[k].nFilters == sts[1]->hTcxEnc->tnsData[k].nFilters ) - ? 1 - : 0; - if ( equalFilterData ) - { - for ( iFilter = st->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - const int16_t *pDataCh0 = (const int16_t *) &sts[0]->hTcxEnc->tnsData[k].filter[iFilter]; - const int16_t *pDataCh1 = (const int16_t *) &sts[1]->hTcxEnc->tnsData[k].filter[iFilter]; - int16_t i = 2 + TNS_MAX_FILTER_ORDER; /* excl. informative float data. Portable? */ - - while ( ( i >= 0 ) && ( pDataCh0[i] == pDataCh1[i] ) ) - { - i--; - } - if ( i >= 0 ) - { - equalFilterData = 0; - break; - } - } - if ( equalFilterData ) - { - st->hTcxEnc->tnsData[k].nFilters *= -1; /* signals common TNS */ - } - } - } - if ( st->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || st->hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) - { - L_spec = st->hTcxCfg->pCurrentTnsConfig->iFilterBorders[0]; - spectrum = st->hTcxEnc->spectrum[k]; - /* If TNS should be used then get the residual after applying it inplace in the spectrum */ - if ( st->hTcxEnc->fUseTns[k] ) - { - st->hTcxCfg->pCurrentTnsConfig = &st->hTcxCfg->tnsConfig[st->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( st->last_core == ACELP_CORE )]; - - ApplyTnsFilter( st->hTcxCfg->pCurrentTnsConfig, &st->hTcxEnc->tnsData[k], spectrum, 1 ); - } - - if ( st->hTcxEnc->transform_type[k] == TCX_5 ) - { - tcx5TnsUngrouping( L_frame >> 2, L_spec >> 1, st->hTcxEnc->spectrum[k], ENC ); - } - - st->hTcxEnc->tnsData[k].tnsOnWhitenedSpectra = st->hTcxEnc->bTnsOnWhithenedSpectra[k]; - - EncodeTnsData( st->hTcxCfg->pCurrentTnsConfig, &st->hTcxEnc->tnsData[k], param_core[ch] + k * NPRM_DIV + 1 + NOISE_FILL_RANGES + LTPSIZE, tnsSize[ch] + k, tnsBits[ch] + k ); - } - - if ( st->hTcxEnc->transform_type[k] == TCX_5 ) - { - tcx5SpectrumInterleaving( st->hTcxCfg->tcx5SizeFB, st->hTcxEnc->spectrum[k] ); - tcx5SpectrumInterleaving( st->hTcxCfg->tcx5SizeFB, mdst_spectrum[ch][k] ); - } - } - } - - return; -} - - -#endif void TNSAnalysis_fx( TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ Word16 L_frame, /* input: frame length */ @@ -708,14 +223,14 @@ void TNSAnalysis_ivas_fx( TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ Word16 L_frame, /* i : frame length */ Word16 L_spec, /* i : length of the spectrum */ - Word16 transform_type, /* i : transform type for the frame/subframe - TCX20 | TCX10 | TCX 5 (meaning 2 x TCX 5) */ + Word16 transform_type, /* i : transform type for the frame/subframe - TCX20 | TCX10 | TCX 5 (meaning 2 x TCX 5) */ Word8 isAfterACELP, /* i : Flag indicating if the last frame was ACELP. For the second TCX subframe it should be 0 */ Word32 spectrum[], /* i : MDCT spectrum Q=Qx*/ TRAN_DET_HANDLE hTranDet, /* i : handle transient detection */ Word16 ltp_gain, /* i : ltp gain Q=15*/ STnsData *pTnsData, /* o : Tns data */ Word8 *pfUseTns, /* o : Flag indicating if TNS is used */ - Word16 *predictionGain /* o : TNS prediction gain Q=7 */ + Word16 *predictionGain /* o : TNS prediction gain Q=7 */ ) { Word32 buff[8]; @@ -1319,154 +834,6 @@ void ShapeSpectrum_ivas_fx( } } -#ifdef ADD_IVAS_TNS -/*-----------------------------------------------------------* - * EstimateStereoTCXNoiseLevel() - * - * Estimate and quantize stereo noise factors - *-----------------------------------------------------------*/ - -void EstimateStereoTCXNoiseLevel( - Encoder_State **sts, /* i : state handle */ - float *q_spectrum[CPE_CHANNELS][NB_DIV], /* i : quantized MDCT spectrum */ - float gain_tcx[][NB_DIV], /* i : global gain */ - int16_t L_frame[][NB_DIV], /* i : frame length */ - int16_t noiseFillingBorder[][NB_DIV], /* i : noise filling border */ - int16_t hm_active[][NB_DIV], /* i : flag indicating if the harmonic model is active */ - const int16_t ignore_chan[], /* i : flag indicating whether the channel should be ignored */ - float fac_ns[][NB_DIV], /* o : noise filling level */ - int16_t param_core[][NB_DIV * NPRM_DIV], /* o : quantized noise filling level */ - const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ -) -{ - int16_t ch, n; - int16_t nSubframes, maxNfCalcBw, iStart, noiseTransWidth; - float smooth_gain; - float combined_q_spectrum[N_MAX]; - int16_t *fac_ns_q; - int32_t total_brate; - - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - Encoder_State *st = sts[ch]; - TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; - - nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - - if ( ignore_chan[ch] ) - { - continue; - } - total_brate = ( st->element_mode == IVAS_CPE_MDCT && !MCT_flag ) ? st->element_brate : st->total_brate; - - for ( n = 0; n < nSubframes; n++ ) - { - fac_ns_q = param_core[ch] + n * NPRM_DIV + 1; - maxNfCalcBw = min( noiseFillingBorder[ch][n], (int16_t) ( hTcxEnc->measuredBwRatio * (float) L_frame[ch][n] + 0.5f ) ); - if ( ( total_brate >= HQ_96k && ( st->element_mode <= IVAS_SCE || st->bwidth < SWB ) ) || total_brate > IVAS_192k ) - { - fac_ns[ch][n] = 0.0f; - *fac_ns_q = 0; - } - else - { - iStart = L_frame[ch][n] / ( ( total_brate >= ACELP_13k20 && !st->rf_mode ) ? 6 : 8 ); /* noise filling start bin*/ - - if ( n == 0 ) - { - mvr2r( hTcxEnc->ltpGainMemory, &hTcxEnc->ltpGainMemory[1], N_LTP_GAIN_MEMS - 1 ); - hTcxEnc->ltpGainMemory[0] = st->hTcxEnc->tcxltp_gain; - } - - smooth_gain = dotp( hTcxEnc->ltpGainMemory, nf_tw_smoothing_coeffs, N_LTP_GAIN_MEMS ); - - noiseTransWidth = GetTransWidth( st->tcxonly, ( L_frame[ch][n] == st->L_frame >> 1 ), smooth_gain, ( st->hTcxCfg->ctx_hm && st->last_core != ACELP_CORE && hm_active[ch][n] ) ); - - mvr2r( q_spectrum[ch][n], combined_q_spectrum, L_frame[ch][n] ); - tcx_noise_factor( hTcxEnc->spectrum[n], combined_q_spectrum, iStart, maxNfCalcBw, noiseTransWidth, L_frame[ch][n], gain_tcx[ch][n], hTcxEnc->noiseTiltFactor, &fac_ns[ch][n], fac_ns_q, st->element_mode ); - - /* hysteresis for very tonal passages (more stationary noise filling level) */ - if ( *fac_ns_q == 1 ) - { - hTcxEnc->noiseLevelMemory_cnt = (int16_t) min( INT16_MAX, 1 + abs( hTcxEnc->noiseLevelMemory_cnt ) ); /* update counter */ - } - else - { - if ( ( *fac_ns_q == 2 ) && ( abs( hTcxEnc->noiseLevelMemory_cnt ) > 5 ) ) - { - *fac_ns_q = 1; /* reduce noise filling level by one step */ - fac_ns[ch][n] = 0.75f / ( 1 << NBITS_NOISE_FILL_LEVEL ); - - /* signal that noise level is changed by inverting sign of level memory */ - hTcxEnc->noiseLevelMemory_cnt = ( hTcxEnc->noiseLevelMemory_cnt < 0 ) ? 5 : -1 - hTcxEnc->noiseLevelMemory_cnt; - } - else - { - hTcxEnc->noiseLevelMemory_cnt = 0; /* reset memory since level is too different */ - } - } - } /* bitrate */ - } -#ifdef DEBUG_MODE_MDCT - dbgwrite( &smooth_gain, sizeof( float ), 1, 1, "./res/smooth_gain" ); - dbgwrite( &st->hTcxEnc->tcxltp_gain, sizeof( float ), 1, 1, "./res/tcxltp_gain" ); - dbgwrite( &noiseTransWidth, sizeof( int16_t ), 1, 1, "./res/noiseTrans" ); - dbgwrite( &fac_ns[ch][0], sizeof( float ), 2, 1, "./res/fac_ns" ); -#endif - } - - return; -} - - -/*-----------------------------------------------------------* - * DecideTonalSideInfo() - * - * - *-----------------------------------------------------------*/ - -static int16_t DecideTonalSideInfo( - const float spectrum[], - const int16_t L_frame_glob, - float SFM2 ) -{ - float SFM, K, K2; - int16_t Tonal_SideInfo; - - SFM = SFM_Cal( spectrum, min( 200, L_frame_glob ) ); - - if ( L_frame_glob <= 256 ) - { - K = 0.4f; - K2 = 0.1f; - } - else if ( L_frame_glob == 320 || L_frame_glob == 512 ) - { - K = 0.4f; - K2 = 0.1f; - } - else /*FrameSize_Core == 640*/ - { - K = 0.35f; - K2 = 0.04f; - } - - - Tonal_SideInfo = 0; - if ( SFM < K ) - { - Tonal_SideInfo = 1; - } - - if ( SFM2 < K2 ) - { - Tonal_SideInfo = 1; - } - - return Tonal_SideInfo; -} -#endif - /*-------------------------------------------------------------------* * GetTransWidth() * @@ -1717,9 +1084,7 @@ void EstimateStereoTCXNoiseLevel_fx( Word16 *fac_ns_q; Word32 total_brate; -#ifdef MSAN_FIX set32_fx( combined_q_spectrum, 0, N_MAX ); -#endif FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -1905,10 +1270,6 @@ void QuantizeSpectrum_fx( Word16 nz; /* non-zero length in ALDO window*/ CONTEXT_HM_CONFIG *phm_cfg; TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; -#endif /* Stack memory is split between encoder and internal decoder to reduce max stack memory usage. */ @@ -2289,7 +1650,7 @@ void QuantizeSpectrum_fx( tmp1 = BASOP_Util_Divide1616_Scale( sqTargetBits, tmp1, &tmp2 ); BASOP_SATURATE_WARNING_OFF_EVS - hTcxEnc->tcx_target_bits_fac = shl_o( mult( hTcxEnc->tcx_target_bits_fac, tmp1 ), tmp2, &Overflow ); + hTcxEnc->tcx_target_bits_fac = shl_sat( mult( hTcxEnc->tcx_target_bits_fac, tmp1 ), tmp2 ); move16(); BASOP_SATURATE_WARNING_ON_EVS @@ -2409,7 +1770,7 @@ void QuantizeSpectrum_fx( } /* Limit low sqGain for avoiding saturation of the gain quantizer*/ - tmp1 = mult_r( shl_o( L_spec, 5, &Overflow ), 26214 /*128.f/NORM_MDCT_FACTOR Q15*/ ); + tmp1 = mult_r( shl_sat( L_spec, 5 ), 26214 /*128.f/NORM_MDCT_FACTOR Q15*/ ); s = 15 - 5 - 7; IF( L_spec >= 1024 ) { @@ -2471,17 +1832,20 @@ void QuantizeSpectrum_fx( /* Save quantized Values */ tmp32 = L_deposit_l( 0 ); + move16(); + Word64 seed = 0; + move64(); FOR( i = 0; i < L_spec; i++ ) { spectrum[i] = L_mult( sqQ[i], 1 << ( 30 - SPEC_EXP_DEC ) ); move32(); /* noise filling seed */ - tmp32 = L_macNs_co( tmp32, abs_s( sqQ[i] ), i, &Carry, &Overflow ); + seed = W_mac_16_16( seed, abs_s( sqQ[i] ), i ); } *spectrum_e = SPEC_EXP_DEC; move16(); - nf_seed = extract_l( tmp32 ); + nf_seed = extract_l( W_extract_l( seed ) ); // Q0 } ELSE /* low rates: new arithmetic coder */ { @@ -3236,7 +2600,7 @@ void QuantizeSpectrum_fx( /* scale output */ FOR( i = 0; i < L_frame; i++ ) { - xn_buf16[i] = shr_o( xn_buf16[i], Q, &Overflow ); + xn_buf16[i] = shr_sat( xn_buf16[i], Q ); move16(); } @@ -3369,7 +2733,7 @@ void QuantizeSpectrum_fx( BASOP_SATURATE_WARNING_OFF_EVS; FOR( i = 0; i < L_frame; i++ ) { - xn_buf16[i] = shl_o( xn_buf16[i], TCX_IMDCT_HEADROOM, &Overflow ); + xn_buf16[i] = shl_sat( xn_buf16[i], TCX_IMDCT_HEADROOM ); move16(); } BASOP_SATURATE_WARNING_ON_EVS; @@ -3531,12 +2895,7 @@ void QuantizeTCXSpectrum_fx( CONTEXT_HM_CONFIG *phm_cfg; Word16 att_fx = 0; move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); - Flag Carry = 0; - move16(); -#endif + /*-----------------------------------------------------------* * Init * *-----------------------------------------------------------*/ @@ -3747,7 +3106,7 @@ void QuantizeTCXSpectrum_fx( } /* Quantize original spectrum */ - sqGain_fx = SQ_gain_ivas_fx( spectrum_fx, *spectrum_e, shl( mult( hTcxEnc->tcx_target_bits_fac, sqTargetBits ), 1 ), L_spec, &sqGain_e ); + sqGain_fx = SQ_gain_ivas_fx( spectrum_fx, *spectrum_e, ( mult( hTcxEnc->tcx_target_bits_fac, shl( sqTargetBits, 1 ) ) ), L_spec, &sqGain_e ); tcx_scalar_quantization_ivas_fx( spectrum_fx, *spectrum_e, sqQ, L_spec, sqGain_fx, sqGain_e, st->hTcxCfg->sq_rounding, hTcxEnc->memQuantZeros, st->tcxonly ); @@ -3831,6 +3190,9 @@ void QuantizeTCXSpectrum_fx( IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) { + Word16 scale = sub( L_norm_arr( spectrum_fx, L_spec ), 2 ); + scale_sig32( spectrum_fx, L_spec, scale ); + *spectrum_e = sub( *spectrum_e, scale ); sqGain_fx = SQ_gain_estimate_fx( spectrum_fx, *spectrum_e, shl( mult( hTcxEnc->tcx_target_bits_fac, sqTargetBits ), 1 ), L_spec, &sqGain_e ); } ELSE @@ -3873,7 +3235,7 @@ void QuantizeTCXSpectrum_fx( tmp1 = BASOP_Util_Divide1616_Scale( sqTargetBits, tmp1, &tmp2 ); BASOP_SATURATE_WARNING_OFF_EVS - hTcxEnc->tcx_target_bits_fac = shl_o( mult( hTcxEnc->tcx_target_bits_fac, tmp1 ), tmp2, &Overflow ); + hTcxEnc->tcx_target_bits_fac = shl_sat( mult( hTcxEnc->tcx_target_bits_fac, tmp1 ), tmp2 ); BASOP_SATURATE_WARNING_ON_EVS if ( GT_16( hTcxEnc->tcx_target_bits_fac, 20480 /*1.25 in Q14*/ ) ) @@ -4150,18 +3512,19 @@ void QuantizeTCXSpectrum_fx( move16(); } - tmp32 = L_deposit_l( 0 ); + Word64 tmp64 = 0; FOR( i = 0; i < L_spec; i++ ) { spectrum_fx[i] = L_mult( sqQ[i], 1 << ( 30 - SPEC_EXP_DEC ) ); move32(); /* noise filling seed */ - tmp32 = L_macNs_co( tmp32, abs_s( sqQ[i] ), i, &Carry, &Overflow ); + tmp64 = W_mac_16_16( tmp64, abs_s( sqQ[i] ), i ); } *spectrum_e = SPEC_EXP_DEC; move16(); - *nf_seed = extract_l( tmp32 ); + assert( W_extract_h( tmp64 ) == 0 ); + *nf_seed = extract_l( W_extract_l( tmp64 ) ); } ELSE { @@ -4365,9 +3728,6 @@ void coder_tcx_fx( Word16 winMDST[N_MAX + L_MDCT_OVLP_MAX]; Word16 *pWinMDST; Word16 left_overlap_mode, right_overlap_mode; -#ifndef MSAN_FIX - LPD_state_HANDLE hLPDmem = st->hLPDmem; -#endif TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; left_overlap = right_overlap = -1; @@ -4532,11 +3892,6 @@ void coder_tcx_fx( n, st, hm_cfg ); - -#ifndef MSAN_FIX - hLPDmem->nbits = add( hLPDmem->nbits, add( tnsBits, ltpBits ) ); - move16(); -#endif } @@ -4644,10 +3999,6 @@ void InternalTCXDecoder_fx( Word16 Aq_old_fx[M + 1]; Word32 sns_interpolated_scalefactors_fx[FDNS_NPTS], A_fx32[M + 1]; Word16 *xn_buf16 = (Word16 *) xn_buf32; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif Copy32( x_quant_fx, spectrum_fx, s_max( L_frame, L_spec ) ); @@ -4742,7 +4093,7 @@ void InternalTCXDecoder_fx( } ELSE { - mdct_shaping( spectrum_fx, L_frame, gainlpc_fx, gainlpc_e ); + mdct_noiseShaping_ivas_fx( spectrum_fx, spectrum_e, L_frame, gainlpc_fx, gainlpc_e ); } /*-----------------------------------------------------------* * Apply gain * @@ -5163,7 +4514,7 @@ void InternalTCXDecoder_fx( /* scale output */ FOR( i = 0; i < L_frame; i++ ) { - xn_buf16[i] = shr_o( xn_buf16[i], Q, &Overflow ); + xn_buf16[i] = shr_sat( xn_buf16[i], Q ); move16(); } @@ -5296,7 +4647,7 @@ void InternalTCXDecoder_fx( BASOP_SATURATE_WARNING_OFF_EVS; FOR( i = 0; i < L_frame; i++ ) { - xn_buf16[i] = shl_o( xn_buf16[i], TCX_IMDCT_HEADROOM, &Overflow ); + xn_buf16[i] = shl_sat( xn_buf16[i], TCX_IMDCT_HEADROOM ); move16(); } BASOP_SATURATE_WARNING_ON_EVS; @@ -5554,8 +4905,8 @@ void TNSAnalysisStereo_fx( test(); test(); test(); - IF( GT_32( pFilter[0]->predictionGain32, L_shl_sat( L_deposit_h( pTnsParameters[0]->minPredictionGain ), sub( PRED_GAIN_E, pFilter[0]->predictionGain_e ) ) ) && LT_32( sts[0]->element_brate, IVAS_80k ) && - GT_32( pFilter[1]->predictionGain32, L_shl_sat( L_deposit_h( pTnsParameters[1]->minPredictionGain ), sub( PRED_GAIN_E, pFilter[1]->predictionGain_e ) ) ) && EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) ) + IF( GT_32( pFilter[0]->predictionGain32, L_shl_sat( ( pTnsParameters[0]->minPredictionGain_32 ), sub( PRED_GAIN_E, pFilter[0]->predictionGain_e ) ) ) && LT_32( sts[0]->element_brate, IVAS_80k ) && + GT_32( pFilter[1]->predictionGain32, L_shl_sat( ( pTnsParameters[1]->minPredictionGain_32 ), sub( PRED_GAIN_E, pFilter[1]->predictionGain_e ) ) ) && EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) ) { pFilter[0]->predictionGain32 = pFilter[1]->predictionGain32 = meanPredictionGain_fx; /* more TNS filter sync at 48kbps */ move32(); @@ -5587,7 +4938,7 @@ void TNSAnalysisStereo_fx( test(); test(); - IF( GT_32( meanPredictionGain_fx, L_shl_sat( L_deposit_h( pTnsParameters[0]->minPredictionGain ), sub( PRED_GAIN_E, meanPredictionGain_e ) ) ) || GT_16( maxAvgSqrCoef_fx, pTnsParameters[0]->minAvgSqrCoef ) ) + IF( GT_32( meanPredictionGain_fx, L_shl_sat( ( pTnsParameters[0]->minPredictionGain_32 ), sub( PRED_GAIN_E, meanPredictionGain_e ) ) ) || GT_16( maxAvgSqrCoef_fx, pTnsParameters[0]->minAvgSqrCoef ) ) { test(); test(); @@ -5740,6 +5091,17 @@ void TNSAnalysisStereo_fx( move16(); move16(); } + ELSE + { + pFilter[0]->filterType = TNS_FILTER_OFF; + pFilter[1]->filterType = TNS_FILTER_OFF; + sts[0]->hTcxEnc->tnsData[k].nFilters = 0; + sts[1]->hTcxEnc->tnsData[k].nFilters = 0; + move16(); + move16(); + move16(); + move16(); + } } } } @@ -5885,7 +5247,7 @@ void TNSAnalysisStereo_fx( } test(); - IF( GT_32( pFilter->predictionGain32, L_shl_sat( L_deposit_h( pTnsParameters->minPredictionGain ), sub( PRED_GAIN_E, pFilter->predictionGain_e ) ) ) || GT_16( pFilter->avgSqrCoef, pTnsParameters->minAvgSqrCoef ) ) + IF( GT_32( pFilter->predictionGain32, L_shl_sat( ( pTnsParameters->minPredictionGain_32 ), sub( PRED_GAIN_E, pFilter->predictionGain_e ) ) ) || GT_16( pFilter->avgSqrCoef, pTnsParameters->minAvgSqrCoef ) ) { test(); test(); diff --git a/lib_enc/cod_uv_fx.c b/lib_enc/cod_uv_fx.c index 8eccddc0b822eb5eaba77b68f5eba4f6f1cc3411..684282bdb4db989fab629aeb10529107dcaf0928 100644 --- a/lib_enc/cod_uv_fx.c +++ b/lib_enc/cod_uv_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -71,8 +71,8 @@ void gauss_L2_fx( FOR( i = 0; i < L_SUBFR; i++ ) { - tmp32 = L_mac0( tmp32, y11[i], y11[i] ); /* Q18 */ - tmp32_2 = L_mac0( tmp32_2, y11[i], y2[i] ); /* Q18 */ + tmp32 = L_mac0_sat( tmp32, y11[i], y11[i] ); /* Q18 */ + tmp32_2 = L_mac0_sat( tmp32_2, y11[i], y2[i] ); /* Q18 */ } tmp16 = norm_l( tmp32 ); @@ -135,7 +135,6 @@ void gauss_L2_ivas_fx( *gain = L_deposit_l( 0 ); move32(); /*Update correlations for gains coding */ -#ifdef FIX_ISSUE_1167 tmp32 = L_shr( 21474836l /*0.01f Q31*/, 31 - 16 ); /* Q16 */ tmp32_2 = L_shr( 21474836l /*0.01f Q31*/, 31 - 16 ); /* Q16 */ FOR( i = 0; i < L_SUBFR; i++ ) @@ -144,34 +143,17 @@ void gauss_L2_ivas_fx( tmp32 = L_mac0( tmp32, tmp16, tmp16 ); /* Q16 */ tmp32_2 = L_mac0( tmp32_2, tmp16, shr( y2[i], 1 ) ); /* Q16 */ } -#else - tmp32 = L_shr( 21474836l /*0.01f Q31*/, 31 - 18 ); /* Q18 */ - tmp32_2 = L_shr( 21474836l /*0.01f Q31*/, 31 - 18 ); /* Q18 */ - FOR( i = 0; i < L_SUBFR; i++ ) - { - tmp32 = L_mac0( tmp32, y11[i], y11[i] ); /* Q18 */ - tmp32_2 = L_mac0( tmp32_2, y11[i], y2[i] ); /* Q18 */ - } -#endif tmp16 = norm_l( tmp32 ); // To be checked g_corr->y1y1 = round_fx_sat( L_shl( tmp32, tmp16 ) ); -#ifdef FIX_ISSUE_1167 g_corr->y1y1_e = sub( 31 - 16, tmp16 ); -#else - g_corr->y1y1_e = sub( 31 - 18, tmp16 ); -#endif move16(); move16(); tmp16 = norm_l( tmp32_2 ); g_corr->y1y2 = round_fx_sat( L_shl( tmp32_2, tmp16 ) ); -#ifdef FIX_ISSUE_1167 g_corr->y1y2_e = sub( 31 - 16, tmp16 ); -#else - g_corr->y1y2_e = sub( 31 - 18, tmp16 ); -#endif move16(); move16(); } diff --git a/lib_enc/comvad_decision_fx.c b/lib_enc/comvad_decision_fx.c index 1499bbfce0e51540ecf72e3d742924df9442ebaf..479781d27f81ada362100741eef47eb6c2d2915b 100644 --- a/lib_enc/comvad_decision_fx.c +++ b/lib_enc/comvad_decision_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ diff --git a/lib_enc/cor_shif_fx.c b/lib_enc/cor_shif_fx.c index 28e837f486cc10b95f9852599f2b98002369c087..5e42145521b79d7ded9734a556cb8f8b2e3bf642 100644 --- a/lib_enc/cor_shif_fx.c +++ b/lib_enc/cor_shif_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include "options.h" /* Compilation switches */ diff --git a/lib_enc/core_enc_2div_fx.c b/lib_enc/core_enc_2div_fx.c index fa74ec6b562f88a5e675aba13685de56fa703fdb..45aba6a058e66b7eddb206ed568604586c346529 100644 --- a/lib_enc/core_enc_2div_fx.c +++ b/lib_enc/core_enc_2div_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -275,7 +275,7 @@ void core_encode_twodiv_fx( hTcxEnc->fUseTns[0], st ); - /*_DIFF_FLOAT_FIX_ -> The line below is present in float */ + /*_DIFF_FLOAT_FIX_EVS_IVAS -> The line below is present in float */ // hTcxEnc->measuredBwRatio = 0x4000; /* Calculate target bits */ diff --git a/lib_enc/core_enc_init_fx.c b/lib_enc/core_enc_init_fx.c index bfe17fcd2aa9ba8539c350e0e324c3b867d1600e..a8c674170365bd4a43a6d0cee9216e58ffa83ab3 100644 --- a/lib_enc/core_enc_init_fx.c +++ b/lib_enc/core_enc_init_fx.c @@ -1,15 +1,12 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include -// #include "prot_fx.h" -// #include "basop_mpy.h" #include "options.h" #include "cnst.h" #include "stl.h" #include "basop_util.h" -#include "rom_com_fx.h" #include "ivas_cnst.h" #include #include "rom_com.h" /* Common constants */ @@ -53,15 +50,7 @@ void init_coder_ace_plus_fx( /* Bitrate */ st->tcxonly = (Word8) getTcxonly( -#ifdef IVAS_CODE_SWITCHING - st->element_mode, -#endif - st->total_brate -#ifdef IVAS_CODE_SWITCHING - , - MCT_flag, st->is_ism_format -#endif - ); + st->total_brate ); move16(); /* Core Sampling Rate */ @@ -82,12 +71,12 @@ void init_coder_ace_plus_fx( /* Core Framing */ L_frame_old = st->last_L_frame; move16(); - st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 /* 1/FRAMES_PER_SEC in Q15*/ ) ); + st->L_frame = extract_l( Mult_32_16( st->sr_core, INV_FRAME_PER_SEC_Q15 ) ); st->L_frame_past = -1; move16(); move16(); - hTcxEnc->L_frameTCX = extract_l( Mult_32_16( st->input_Fs, 0x0290 /* 1/FRAMES_PER_SEC in Q15*/ ) ); + hTcxEnc->L_frameTCX = extract_l( Mult_32_16( st->input_Fs, INV_FRAME_PER_SEC_Q15 ) ); move16(); st->nb_subfr = NB_SUBFR; move16(); @@ -215,11 +204,6 @@ void init_coder_ace_plus_fx( move16(); st->tfa_flag = 0; move16(); - /* Initialize DTX */ - IF( st->ini_frame == 0 ) - { - vad_init_fx( &st->vad_st ); - } st->glr = 0; move16(); @@ -250,6 +234,8 @@ void init_coder_ace_plus_fx( set16_fx( st->bpf_T, PIT_MIN_12k8, NB_SUBFR16k ); + st->mem_bpf_fx.lp_error = 0; + move16(); st->mem_bpf_fx.noise_shift_old = 0; move16(); @@ -299,12 +285,9 @@ static void init_tcx_fx( Word16 i; Word16 fscaleFB; TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) MCT_flag; (void) total_brate; (void) last_total_brate; -#endif - // PMT("init_tcx_fx needs an entire review to adapt to IVAS") fscaleFB = div_l( L_shl( st->input_Fs, LD_FSCALE_DENOM + 1 ), 12800 ); init_TCX_config( st->hTcxCfg, st->L_frame, st->fscale, hTcxEnc->L_frameTCX, fscaleFB ); @@ -945,10 +928,8 @@ static void init_modes_fx( void init_coder_ace_plus_ivas_fx( Encoder_State *st, /* i : Encoder state */ const Word32 last_total_brate, /* i : last total bitrate */ -#ifdef FIX_920_IGF_INIT_ERROR - const Word32 igf_brate, /* i : IGF configuration bitrate */ -#endif - const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */ + const Word32 igf_brate, /* i : IGF configuration bitrate */ + const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */ ) { TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; @@ -980,14 +961,14 @@ void init_coder_ace_plus_ivas_fx( /* Core Framing */ L_frame_old = st->last_L_frame; move16(); - st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 ) ); /* 0x0290 is 1/FRAMES_PER_SEC in Q15*/ + st->L_frame = extract_l( Mult_32_16( st->sr_core, INV_FRAME_PER_SEC_Q15 ) ); move16(); st->L_frame_past = -1; move16(); IF( hTcxEnc != NULL ) { - hTcxEnc->L_frameTCX = extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ); /* 0x0290 is 1/FRAMES_PER_SEC in Q15*/ + hTcxEnc->L_frameTCX = extract_l( Mult_32_16( st->input_Fs, INV_FRAME_PER_SEC_Q15 ) ); move16(); IF( st->ini_frame == 0 ) @@ -1080,11 +1061,7 @@ void init_coder_ace_plus_ivas_fx( test(); IF( st->igf && st->hIGFEnc != NULL ) { -#ifdef FIX_920_IGF_INIT_ERROR IGFEncSetMode_ivas_fx( st->hIGFEnc, igf_brate, st->bwidth, st->element_mode, st->rf_mode ); -#else - IGFEncSetMode_ivas_fx( st->hIGFEnc, st->total_brate, st->bwidth, st->element_mode, st->rf_mode ); -#endif } ELSE IF( st->hIGFEnc != NULL ) { @@ -1569,6 +1546,10 @@ static void init_acelp_ivas_fx( Encoder_State *st, Word16 L_frame_old, Word16 sh { set16_fx( hLPDmem->syn, 0, 1 + M ); set16_fx( hLPDmem->mem_syn_r, 0, L_SYN_MEM ); + hLPDmem->q_lpd_syn = Q15; + hLPDmem->q_mem_syn = Q15; + move16(); + move16(); } IF( st->hTcxEnc != NULL ) @@ -1599,6 +1580,8 @@ static void init_acelp_ivas_fx( Encoder_State *st, Word16 L_frame_old, Word16 sh Copy( hLPDmem->mem_syn1_fx, hLPDmem->mem_syn2, M ); set16_fx( hLPDmem->syn, 0, M ); hLPDmem->q_lpd_syn = Q15; + hLPDmem->q_mem_syn = Q15; + move16(); move16(); } IF( st->hTcxEnc != NULL ) diff --git a/lib_enc/core_enc_ol_fx.c b/lib_enc/core_enc_ol_fx.c index 04857c334d7130aa8b298baaa0bdb78f8cd5e82e..cdecaf3d6f34caa5d7f2bce86f20c85b8bc0ace5 100644 --- a/lib_enc/core_enc_ol_fx.c +++ b/lib_enc/core_enc_ol_fx.c @@ -1,14 +1,12 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include #include "options.h" #include "cnst.h" /* Common constants */ -//#include "prot_fx.h" #include "basop_util.h" -#include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -80,14 +78,8 @@ void core_encode_openloop_fx( Word16 w_rf[M + 1], lsf_uq_rf[M + 1]; Word16 lsf_q_1st_rf[M + 1], lsf_q_d_rf[M + 1], lsf_q_rf[M + 1]; Word16 lsp_old_q_rf[M + 1], lsf_old_q_rf[M + 1]; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) vad_hover_flag; (void) vad_flag_dtx; -#endif -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; RF_ENC_HANDLE hRF = st->hRF; @@ -255,7 +247,7 @@ void core_encode_openloop_fx( /* reset TBE buffers previous frame frame wasn't ACELP*/ IF( st->last_core != ACELP_CORE ) { - TBEreset_enc_fx( st, st->bwidth ); + TBEreset_enc_fx( st->hBWE_TD, st->last_core, st->bwidth ); } @@ -554,7 +546,7 @@ void core_encode_openloop_fx( /*v_sub(lsf_uq_rf, lsf_q_1st_rf, lsf_q_d_rf, M);*/ FOR( i = 0; i < M; i++ ) { - lsf_q_d_rf[i] = shl_o( mult_r( sub_o( lsf_uq_rf[i], lsf_q_1st_rf[i], &Overflow ), 25600 ), 5, &Overflow ); + lsf_q_d_rf[i] = shl_sat( mult_r( sub_sat( lsf_uq_rf[i], lsf_q_1st_rf[i] ), 25600 ), 5 ); move16(); /*input value is in Qx2.56, convert to Q6 to match table, quantizer table kept at Q6 to avoid losing precision */ /*Assume this difference data max range can be represented by Q6*/ @@ -695,7 +687,7 @@ void core_encode_openloop_fx( test(); test(); IF( rf_PLC_Mode == 0 && hRF->rf_gain_tcx[1] != 0 && - ( ( st->transientDetection.transientDetector.bIsAttackPresent != 0 && LT_16( hRF->rf_gain_tcx[0], mult_r( hRF->rf_gain_tcx[1], 31785 /*0.97f Q15*/ ) ) ) || + ( ( st->hTranDet->transientDetector.bIsAttackPresent != 0 && LT_16( hRF->rf_gain_tcx[0], mult_r( hRF->rf_gain_tcx[1], 31785 /*0.97f Q15*/ ) ) ) || LT_16( hRF->rf_gain_tcx[0], mult_r( hRF->rf_gain_tcx[1], 29491 /*0.90f Q15*/ ) ) ) ) { TD_mode = 0; @@ -755,10 +747,6 @@ static void closest_centroid_rf( Word16 tmp, tmpL; Word64 werr_64; Word32 L_tmp, best_werr, werr; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif ind_vec[0] = 0; move16(); @@ -773,8 +761,8 @@ static void closest_centroid_rf( tmpL = i_mult2( i, length ); FOR( j = 0; j < length; j++ ) { - tmp = sub_o( data[j], quantizer[tmpL + j], &Overflow ); - L_tmp = L_mult_o( tmp, tmp, &Overflow ); + tmp = sub_sat( data[j], quantizer[tmpL + j] ); + L_tmp = L_mult_sat( tmp, tmp ); werr_64 = W_mac_32_16( werr_64, L_tmp, weights[j] ); } werr = W_sat_m( werr_64 ); @@ -826,10 +814,6 @@ void core_acelp_tcx20_switching_fx( Word16 snr_tcx, snr_acelp, dsnr; TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* Check minimum pitch for quantization */ FOR( i = 0; i < 3; i++ ) @@ -886,7 +870,7 @@ void core_acelp_tcx20_switching_fx( st->pit_fr2, st->pit_max, st->pit_res_max, - &st->transientDetection, + st->hTranDet, 0, A_q_tcx, M ); @@ -1105,7 +1089,7 @@ void core_acelp_tcx20_switching_fx( FOR( j = 0; j < L_SUBFR; j++ ) { - tmp32 = L_mac0_o( tmp32, st->wspeech_enc[i + j], st->wspeech_enc[i + j], &Overflow ); + tmp32 = L_mac0_sat( tmp32, st->wspeech_enc[i + j], st->wspeech_enc[i + j] ); } tmp32 = L_shr( BASOP_Util_Log2( tmp32 ), 9 ); /* 15Q16 */ tmp32 = L_add( tmp32, L_sub( 0x1F0000, L_shl( L_deposit_h( add( Q_new, sub( shift, 1 ) ) ), 1 ) ) ); /* wspeech_enc scaling */ @@ -1123,7 +1107,7 @@ void core_acelp_tcx20_switching_fx( tcx_snr = L_shl( Mpy_32_16_1( tcx_snr, 0x6054 ), 2 ); /* 0x6054 -> 10/log2(10) (2Q13) */ BASOP_SATURATE_WARNING_OFF_EVS - snr_tcx = round_fx_o( L_shl_o( tcx_snr, 8, &Overflow ), &Overflow ); /* 7Q8 */ + snr_tcx = round_fx_sat( L_shl_sat( tcx_snr, 8 ) ); /* 7Q8 */ BASOP_SATURATE_WARNING_ON_EVS /*--------------------------------------------------------------* @@ -1157,11 +1141,11 @@ void core_acelp_tcx20_switching_fx( FOR( j = 0; j < L_SUBFR; j++ ) { - signal = L_mac0_o( signal, st->wspeech_enc[i + j], st->wspeech_enc[i + j], &Overflow ); + signal = L_mac0_sat( signal, st->wspeech_enc[i + j], st->wspeech_enc[i + j] ); - tmp16 = round_fx_o( L_shl_o( Mpy_32_16_r( gain, st->wspeech_enc[i + j - T0] ), 15, &Overflow ), &Overflow ); - tmp16 = sub_o( st->wspeech_enc[i + j], tmp16, &Overflow ); - noise = L_mac0_o( noise, tmp16, tmp16, &Overflow ); + tmp16 = round_fx_sat( L_shl_sat( Mpy_32_16_r( gain, st->wspeech_enc[i + j - T0] ), 15 ) ); + tmp16 = sub_sat( st->wspeech_enc[i + j], tmp16 ); + noise = L_mac0_sat( noise, tmp16, tmp16 ); } /* Assume always 4 sub frames. */ /*assert( (st->L_frame / L_SUBFR) == 4);*/ @@ -1214,7 +1198,7 @@ void core_acelp_tcx20_switching_fx( test(); if ( ( GT_16( snr_acelp, snr_tcx ) ) && ( LT_16( snr_acelp, add( snr_tcx, 512 /*2.0f Q8*/ ) ) ) && - ( LT_16( add_o( st->prevTempFlatness_fx, currFlatness, &Overflow ), 416 /*3.25f Q7*/ ) || EQ_16( stab_fac, 0x7fff /*1 Q15*/ ) || + ( LT_16( add_sat( st->prevTempFlatness_fx, currFlatness ), 416 /*3.25f Q7*/ ) || EQ_16( stab_fac, 0x7fff /*1 Q15*/ ) || ( EQ_32( st->sr_core, INT_FS_12k8 ) && EQ_16( st->sp_aud_decision0, 1 ) && LT_16( add_sat( st->prevTempFlatness_fx, currFlatness ), 2560 /*20.f Q7*/ ) ) ) && ( LE_16( st->acelpFramesCount, 6 ) ) ) { diff --git a/lib_enc/core_enc_reconf_fx.c b/lib_enc/core_enc_reconf_fx.c index 1ba496b0e4f3eca516d5a3b7d53b44b9a84b1500..9f21792e353c441ee0ac0802ccf948cc48756b8a 100644 --- a/lib_enc/core_enc_reconf_fx.c +++ b/lib_enc/core_enc_reconf_fx.c @@ -1,32 +1,30 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" -//#include "prot_fx.h" -#include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" +#include "cnst.h" /* Common constants */ #include "rom_enc.h" /* Encoder static table prototypes */ #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ + /*-----------------------------------------------------------------* - * Funtion core_coder_reconfig_fx * + * Funtion core_coder_reconfig_fx * * ~~~~~~~~~~~~~~~~~~~ * * - reconfig core coder when switching to another frame type * *-----------------------------------------------------------------*/ + void core_coder_reconfig_fx( Encoder_State *st, const Word32 last_total_brate ) { Word16 i, bwidth, index; TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) last_total_brate; -#endif /*Configuration of ACELP*/ BITS_ALLOC_init_config_acelp( st->total_brate, st->narrowBand, st->nb_subfr, &( st->acelp_cfg ) ); diff --git a/lib_enc/core_enc_switch_fx.c b/lib_enc/core_enc_switch_fx.c index f3b4aea6b733fb4dca0a8e778a430f4368e34f96..b61609e50c06e942b791564429ee2dad0f04fae0 100644 --- a/lib_enc/core_enc_switch_fx.c +++ b/lib_enc/core_enc_switch_fx.c @@ -1,13 +1,13 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include #include "options.h" #include "prot_fx.h" #include "cnst.h" /* Common constants */ #include "ivas_cnst.h" -#include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ @@ -49,11 +49,7 @@ void core_coder_mode_switch_fx( switchWB = 1; /*force init when coming from MODE1*/ } -#ifdef IVAS_CODE_SWITCHING - tcxonly_tmp = getTcxonly( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format ); -#else tcxonly_tmp = getTcxonly( st->total_brate ); -#endif if ( NE_16( tcxonly_tmp, st->tcxonly ) ) { @@ -69,13 +65,9 @@ void core_coder_mode_switch_fx( move32(); st->sr_core = sr_core; move32(); - st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 ) ); + st->L_frame = extract_l( Mult_32_16( st->sr_core, INV_FRAME_PER_SEC_Q15 ) ); assert( st->L_frame == st->sr_core / 50 ); -#ifdef IVAS_CODE_SWITCHING - st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format ); -#else st->tcxonly = (Word8) getTcxonly( st->total_brate ); -#endif /* st->bits_frame_nominal = (int)( (float)st->L_frame/(float)st->fscale ) * (float)FSCALE_DENOM/128.0f * (float)st->bitrate/100.0f + 0.49f ; */ /* st->bits_frame_nominal = extract_l(L_shr(Mpy_32_16_1( L_shl(st->bitrate,8), mult_r(div_s(st->fscale, shl(st->L_frame,4)), FL2WORD16(FSCALE_DENOM/12800.f))), 6)); */ tmp32 = L_shl( st->total_brate, 1 ); /* (float)st->L_frame/(float)st->fscale * (float)FSCALE_DENOM/128.0f * (float)st->bitrate */ @@ -118,9 +110,6 @@ void core_coder_mode_switch_fx( IF( st->hTcxCfg->fIsTNSAllowed != 0 ) { InitTnsConfigs( st->bwidth, st->hTcxCfg->tcx_coded_lines, st->hTcxCfg->tnsConfig, st->hIGFEnc->infoStopFrequency, st->total_brate, st->element_mode, MCT_flag ); -#ifdef IVAS_CODE - SetAllowTnsOnWhite( st->hTcxCfg->tnsConfig, EQ_16( st->element_mode, IVAS_CPE_MDCT ) ); -#endif } st->narrowBand = 0; @@ -184,7 +173,7 @@ void core_coder_mode_switch_fx( ( EQ_16( st->bwidth, FB ) && NE_16( st->last_extl, FB_TBE ) ) ) { /* reset TBE buffers as previous frame wasn't using TBE */ - TBEreset_enc_fx( st, st->bwidth ); + TBEreset_enc_fx( st->hBWE_TD, st->last_core, st->bwidth ); } ELSE { @@ -246,7 +235,6 @@ void core_coder_mode_switch_ivas_fx( exp_res = 0; move16(); - if ( EQ_16( st->last_core, AMR_WB_CORE ) ) { bSwitchFromAmrwbIO = 1; @@ -277,9 +265,7 @@ void core_coder_mode_switch_ivas_fx( { st->sr_core = sr_core; move16(); - Word16 tmp = BASOP_Util_Divide3232_Scale( sr_core, FRAMES_PER_SEC, &exp_res ); - st->L_frame = shr( tmp, sub( 15, exp_res ) ); // Q0 - move16(); + st->L_frame = extract_l( Mpy_32_32_r( sr_core, ONE_BY_FRAMES_PER_SEC_Q31 ) ); st->tcxonly = getTcxonly_fx( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format ); move16(); @@ -393,7 +379,7 @@ void core_coder_mode_switch_ivas_fx( move16(); IF( hTcxEnc != NULL ) { - hTcxEnc->L_frameTCX = extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ); /* 0x0290 is 1/FRAMES_PER_SEC in Q15*/ + hTcxEnc->L_frameTCX = extract_l( Mult_32_16( st->input_Fs, INV_FRAME_PER_SEC_Q15 ) ); move16(); } st->currEnergyHF_fx = 0; @@ -408,11 +394,7 @@ void core_coder_mode_switch_ivas_fx( Scale_sig( st->old_inp_12k8_fx, L_INP_MEM, shift ); st->exp_old_inp_12k8 = sub( st->exp_old_inp_12k8, shift ); move16(); -#ifdef FIX_920_IGF_INIT_ERROR init_coder_ace_plus_ivas_fx( st, last_total_brate, st->total_brate, MCT_flag ); -#else - init_coder_ace_plus_ivas_fx( st, last_total_brate, MCT_flag ); -#endif if ( st->hLPDmem != NULL ) { st->hLPDmem->q_lpd_old_exc = st->prev_Q_new; @@ -433,7 +415,7 @@ void core_coder_mode_switch_ivas_fx( ( EQ_16( st->bwidth, SWB ) && NE_16( st->last_extl, SWB_TBE ) ) || ( EQ_16( st->bwidth, FB ) && NE_16( st->last_extl, FB_TBE ) ) ) { - TBEreset_enc_fx( st, st->bwidth ); + TBEreset_enc_fx( st->hBWE_TD, st->last_core, st->bwidth ); } ELSE { diff --git a/lib_enc/core_enc_updt_fx.c b/lib_enc/core_enc_updt_fx.c index 305c2a92fe5f74d7c02317667cb6aa3c234f1401..94a2ef74651e237f5f7d2930b346d7cd00143bf1 100644 --- a/lib_enc/core_enc_updt_fx.c +++ b/lib_enc/core_enc_updt_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -48,27 +48,9 @@ void core_encode_update_fx( Encoder_State *st ) if ( hTcxEnc != NULL ) { Copy( hTcxEnc->buf_speech_ltp + st->L_frame, hTcxEnc->buf_speech_ltp, n ); - -#ifdef IVAS_CODE - IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) - { - st->hTcxEnc->kernel_switch_corr_past = 0.f; - st->hTcxEnc->kernel_type[0] = MDCT_IV; - st->hTcxEnc->kernel_symmetry_past = 0; - st->hTcxEnc->enc_ste_pre_corr_past = 0; - move16(); - move16(); - move16(); - move16(); - } -#endif } /* Update previous mode */ - // move16(); - // st->last_core = st->core; /* _DIFF_FLOAT_FIX_ not in float -> remove? */ - - test(); test(); test(); @@ -171,8 +153,8 @@ void core_encode_update_cng_fx( tmp = sub( st->wspeech_enc[-1], shl( hLPDmem->mem_w0, shift ) ); E_UTIL_deemph2( negate( shift ), wsyn, st->preemph_fac, st->L_frame, &tmp ); - hLPDmem->mem_w0 = sub( st->wspeech_enc[st->L_frame - 1], tmp ); - hLPDmem->mem_w0 = shr( hLPDmem->mem_w0, shift ); + hLPDmem->mem_w0 = sub_sat( st->wspeech_enc[st->L_frame - 1], tmp ); + hLPDmem->mem_w0 = shr_sat( hLPDmem->mem_w0, shift ); move16(); move16(); /* Update LPC-related memories */ diff --git a/lib_enc/core_switching_enc_fx.c b/lib_enc/core_switching_enc_fx.c index dc306229884ed4b3834ea6e0b6da1fcc2ba324a1..aa06b12d20d5eeff4b7469045355661ab18be1d9 100644 --- a/lib_enc/core_switching_enc_fx.c +++ b/lib_enc/core_switching_enc_fx.c @@ -1,13 +1,12 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_enc.h" /* Encoder static table prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ -#include "rom_com.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_enc.h" /* Encoder static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "ivas_prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -45,8 +44,6 @@ void core_switching_pre_enc_fx( { IF( hLPDmem != NULL ) { - st_fx->mem_deemph_fx = hLPDmem->syn[M]; - move16(); Copy( hLPDmem->mem_syn2, hLPDmem->mem_syn1_fx, M ); /*hLPDmem->q_mem_syn*/ } @@ -178,8 +175,16 @@ void core_switching_pre_enc_fx( test(); test(); - IF( ( ( ( st_fx->core == ACELP_CORE ) || EQ_16( st_fx->core, AMR_WB_CORE ) ) && EQ_16( st_fx->last_core, HQ_CORE ) ) || - ( ( EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && EQ_16( last_element_mode, IVAS_CPE_DFT ) ) ) && EQ_16( active_cnt, 1 ) ) ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( ( ( st_fx->core == ACELP_CORE ) || EQ_16( st_fx->core, AMR_WB_CORE ) ) && EQ_16( st_fx->last_core, HQ_CORE ) ) /* EVS and HQ -> ACELP */ || + ( ( EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && EQ_16( last_element_mode, IVAS_CPE_DFT ) ) ) && EQ_16( active_cnt, 1 ) ) || + ( st_fx->core == ACELP_CORE && GT_16( st_fx->last_L_frame, L_FRAME16k ) ) /* TCX @ 25.6/32 kHz -> ACELP */ ) { IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) { @@ -192,7 +197,6 @@ void core_switching_pre_enc_fx( lsf2lsp_fx( st_fx->lsf_old_fx, st_fx->lsp_old_fx, M, INT_FS_FX ); } - st_fx->mem_deemph_fx = 0; /* Reset ACELP parameters */ IF( hLPDmem != NULL ) { @@ -282,8 +286,7 @@ void core_switching_pre_enc_fx( tmp16 = shr( st_fx->L_frame, 6 ); Copy( st_fx->old_pitch_buf_fx + tmp16, st_fx->old_pitch_buf_fx, tmp16 ); /*Q6*/ - set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR, tmp16 ); - + set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR << 6, tmp16 ); /* Reset old TD BWE buffers */ IF( hBWE_TD != NULL ) { @@ -295,7 +298,7 @@ void core_switching_pre_enc_fx( /* reset BWE memories */ IF( hBWE_FD != NULL ) { - set16_fx( hBWE_FD->old_syn_12k8_16k_fx, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); /* TODO : this might not be needed */ + set16_fx( hBWE_FD->old_syn_12k8_16k_fx, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); } } test(); @@ -478,7 +481,7 @@ void core_switching_post_enc_fx( } ELSE IF( EQ_16( st_fx->last_core, TCX_20_CORE ) || EQ_16( st_fx->last_core, TCX_10_CORE ) ) { - TBEreset_enc_fx( st_fx, st_fx->bwidth ); + TBEreset_enc_fx( st_fx->hBWE_TD, st_fx->last_core, st_fx->bwidth ); } test(); test(); @@ -653,8 +656,6 @@ void core_switching_pre_enc_ivas_fx( { IF( hLPDmem != NULL ) { - st_fx->mem_deemph_fx = hLPDmem->syn[M]; - move16(); Copy( hLPDmem->mem_syn2, hLPDmem->mem_syn1_fx, M ); } @@ -794,8 +795,11 @@ void core_switching_pre_enc_ivas_fx( test(); test(); test(); - IF( ( ( ( st_fx->core == ACELP_CORE ) || EQ_16( st_fx->core, AMR_WB_CORE ) ) && EQ_16( st_fx->last_core, HQ_CORE ) ) || - ( ( EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && EQ_16( last_element_mode, IVAS_CPE_DFT ) ) ) && EQ_16( active_cnt, 1 ) ) ) + test(); + test(); + IF( ( ( ( st_fx->core == ACELP_CORE ) || EQ_16( st_fx->core, AMR_WB_CORE ) ) && EQ_16( st_fx->last_core, HQ_CORE ) ) /* EVS and HQ -> ACELP */ || + ( ( EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && EQ_16( last_element_mode, IVAS_CPE_DFT ) ) ) && EQ_16( active_cnt, 1 ) ) || + ( st_fx->core == ACELP_CORE && GT_16( st_fx->last_L_frame, L_FRAME16k ) ) /* TCX @ 25.6/32 kHz -> ACELP */ ) { IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) { @@ -808,8 +812,6 @@ void core_switching_pre_enc_ivas_fx( lsf2lsp_fx( st_fx->lsf_old_fx, st_fx->lsp_old_fx, M, INT_FS_FX ); } - st_fx->mem_deemph_fx = 0; - move16(); /* Reset ACELP parameters */ IF( hLPDmem != NULL ) { @@ -851,8 +853,7 @@ void core_switching_pre_enc_ivas_fx( } Copy( st_fx->old_pitch_buf_fx + tmp16, st_fx->old_pitch_buf_fx, tmp16 ); - set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR, tmp16 ); - + set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR << 6, tmp16 ); /* Reset old ACELP buffers */ test(); IF( ( st_fx->element_mode == EVS_MONO ) && hLPDmem != NULL ) @@ -902,8 +903,7 @@ void core_switching_pre_enc_ivas_fx( tmp16 = shr( st_fx->L_frame, 6 ); Copy( st_fx->old_pitch_buf_fx + tmp16, st_fx->old_pitch_buf_fx, tmp16 ); - set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR, tmp16 ); - + set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR << 6, tmp16 ); /* Reset old TD BWE buffers */ IF( hBWE_TD != NULL ) { @@ -915,7 +915,7 @@ void core_switching_pre_enc_ivas_fx( /* reset BWE memories */ IF( hBWE_FD != NULL ) { - set16_fx( hBWE_FD->old_syn_12k8_16k_fx, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); /* TODO : this might not be needed */ + set16_fx( hBWE_FD->old_syn_12k8_16k_fx, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); } } test(); @@ -997,10 +997,8 @@ void core_switching_pre_enc_ivas_fx( tmp = sub( L_LOOK_16k + L_SUBFR16k, Sample_Delay_HP ); Copy( &hBWE_TD->old_speech_shb_fx[tmp], hBWE_FD->new_input_hp_fx, Sample_Delay_HP ); -#ifdef FIX_ISSUE_1230 hBWE_FD->Q_new_input_hp = 0; move16(); -#endif IF( NE_16( st_fx->last_extl, WB_BWE ) ) { @@ -1153,7 +1151,7 @@ void core_switching_post_enc_ivas_fx( } ELSE IF( EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) ) { - TBEreset_enc_fx( st, st->bwidth ); + TBEreset_enc_fx( st->hBWE_TD, st->last_core, st->bwidth ); } test(); diff --git a/lib_enc/corr_xh_fx.c b/lib_enc/corr_xh_fx.c index 51165d141e93973a92e5c45de7c4a803f7c80075..4f0614fba3265c0e0f93e072eadf366dbe6c065f 100644 --- a/lib_enc/corr_xh_fx.c +++ b/lib_enc/corr_xh_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" @@ -31,10 +31,6 @@ void corr_xh_fx( { Word16 i, j, k; Word32 L_tmp, y32[L_SUBFR], L_maxloc, L_tot; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif /* first keep the result on 32 bits and find absolute maximum */ L_tot = L_deposit_l( 1 ); @@ -47,7 +43,7 @@ void corr_xh_fx( L_tmp = L_mac( 1L, x[i], h[0] ); /* 1 -> to avoid null dn[] Qx+15*/ FOR( j = i; j < L_SUBFR - 1; j++ ) { - L_tmp = L_mac_o( L_tmp, x[j + 1], h[j + 1 - i], &Overflow ); /*Qx+15*/ + L_tmp = L_mac_sat( L_tmp, x[j + 1], h[j + 1 - i] ); /*Qx+15*/ } y32[i] = L_tmp; /*Qx+15*/ @@ -57,8 +53,8 @@ void corr_xh_fx( } /* tot += 3*max / 8 */ L_maxloc = L_shr( L_maxloc, 2 ); - L_tot = L_add_o( L_tot, L_maxloc, &Overflow ); /* +max/4 */ - L_tot = L_add_o( L_tot, L_shr( L_maxloc, 1 ), &Overflow ); /* +max/8 */ + L_tot = L_add_sat( L_tot, L_maxloc ); /* +max/4 */ + L_tot = L_add_sat( L_tot, L_shr( L_maxloc, 1 ) ); /* +max/8 */ } /* Find the number of right shifts to do on y32[] so that */ @@ -82,10 +78,6 @@ void corr_hh_ivas_fx( { Word16 i, j, k; Word32 L_tmp, y32[L_SUBFR * 2], L_maxloc, L_tot; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif /* first keep the result on 32 bits and find absolute maximum */ L_tot = L_deposit_l( 1 ); @@ -98,7 +90,7 @@ void corr_hh_ivas_fx( L_tmp = L_mac( 1L, shr( h[i], 3 ), shr( h[0], 3 ) ); /* 1 -> to avoid null dn[] */ // 2*(15 - norm_s(h[0]) -3) - 1 FOR( j = i; j < L_subfr - 1; j++ ) { - L_tmp = L_mac_o( L_tmp, shr( h[j + 1], 3 ), shr( h[j + 1 - i], 3 ), &Overflow ); // 2*(15 - norm_s(h[0]) -3) - 1 + L_tmp = L_mac_sat( L_tmp, shr( h[j + 1], 3 ), shr( h[j + 1 - i], 3 ) ); // 2*(15 - norm_s(h[0]) -3) - 1 //?sat } y32[i] = L_tmp; // 2*(15 - norm_s(h[0]) -3) - 1 @@ -108,8 +100,8 @@ void corr_hh_ivas_fx( } /* tot += 3*max / 8 */ L_maxloc = L_shr( L_maxloc, 2 ); - L_tot = L_add_o( L_tot, L_maxloc, &Overflow ); /* +max/4 */ - L_tot = L_add_o( L_tot, L_shr( L_maxloc, 1 ), &Overflow ); /* +max/8 */ + L_tot = L_add_sat( L_tot, L_maxloc ); /* +max/4 */ + L_tot = L_add_sat( L_tot, L_shr( L_maxloc, 1 ) ); /* +max/8 */ } /* Find the number of right shifts to do on y32[] so that */ @@ -133,16 +125,12 @@ void corr_xh_ivas_fx( const Word16 Qx, Word16 dn[], /* o : correlation between x[] and h[] Qdn*/ Word16 *Qdn, - const Word16 h[], /* i : impulse response (of weighted synthesis filter) (Q15 - norm_s(h[0]))*/ + const Word16 h[], /* i : impulse response (of weighted synthesis filter) (Q14 - norm_s(h[0]))*/ const Word16 L_subfr /* i : length of the subframe Q0*/ ) { Word16 i, j, k; Word32 L_tmp, y32[L_SUBFR * 2], L_maxloc, L_tot; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif /* first keep the result on 32 bits and find absolute maximum */ L_tot = L_deposit_l( 0 ); @@ -152,21 +140,21 @@ void corr_xh_ivas_fx( L_maxloc = L_deposit_l( 0 ); FOR( i = k; i < L_subfr; i += STEP ) { - L_tmp = L_mac( 0, x[i], h[0] ); // Qx+(15 - norm_s(h[0])) + L_tmp = L_mac( 0, x[i], h[0] ); // Qx+(14 - norm_s(h[0])) + 1 FOR( j = i; j < L_subfr - 1; j++ ) { - L_tmp = L_mac_o( L_tmp, x[j + 1], h[j + 1 - i], &Overflow ); // Qx+(15 - norm_s(h[0])) + L_tmp = L_mac_sat( L_tmp, x[j + 1], h[j + 1 - i] ); // Qx+(14 - norm_s(h[0])) + 1 } - y32[i] = L_tmp; // Qx+(15 - norm_s(h[0])) + y32[i] = L_tmp; // Qx+(14 - norm_s(h[0])) + 1 move32(); L_tmp = L_abs( L_tmp ); - L_maxloc = L_max( L_tmp, L_maxloc ); // Qx+(15 - norm_s(h[0])) + L_maxloc = L_max( L_tmp, L_maxloc ); // Qx+(14 - norm_s(h[0])) +1 } /* tot += 3*max / 8 */ L_maxloc = L_shr( L_maxloc, 2 ); - L_tot = L_add_o( L_tot, L_maxloc, &Overflow ); /* +max/4 */ - L_tot = L_add_o( L_tot, L_shr( L_maxloc, 1 ), &Overflow ); /* +max/8 */ + L_tot = L_add_sat( L_tot, L_maxloc ); /* +max/4 */ + L_tot = L_add_sat( L_tot, L_shr( L_maxloc, 1 ) ); /* +max/8 */ } /* Find the number of right shifts to do on y32[] so that */ @@ -176,11 +164,11 @@ void corr_xh_ivas_fx( FOR( i = 0; i < L_subfr; i++ ) { - dn[i] = round_fx( L_shl( y32[i], j ) ); // Qx+(15 - norm_s(h[0])) +j - 16 + dn[i] = round_fx( L_shl( y32[i], j ) ); // Qx+(14 - norm_s(h[0])) + 1 +j - 16 move16(); } - *Qdn = sub( add( add( Qx, sub( 15, norm_s( h[0] ) ) ), j ), 16 ); + *Qdn = sub( add( add( Qx, add( sub( 14, norm_s( h[0] ) ), 1 ) ), j ), 16 ); move16(); return; } diff --git a/lib_enc/decision_matrix_enc_fx.c b/lib_enc/decision_matrix_enc_fx.c index 3624cf37463b4f56b24b40fb5660b567a406ced2..086b6e86aedcdb5772da37fd780e00be60f03e7a 100644 --- a/lib_enc/decision_matrix_enc_fx.c +++ b/lib_enc/decision_matrix_enc_fx.c @@ -1,14 +1,12 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include #include "options.h" #include "cnst.h" /* Common constants */ -//#include "prot_fx.h" #include "stat_enc.h" -#include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -386,7 +384,6 @@ void decision_matrix_enc_fx( move16(); } -#ifdef NONBE_FIX_GSC_BSTR /*-----------------------------------------------------------------* * set inactive coder_type flag in ACELP core *-----------------------------------------------------------------*/ @@ -400,7 +397,6 @@ void decision_matrix_enc_fx( move16(); } -#endif return; } @@ -451,14 +447,14 @@ Word16 signalling_mode1_tcx20_enc_fx( num_bits = add( num_bits, nBits ); IF( push != 0 ) { - push_indice_fx( hBstr, IND_ACELP_SIGNALLING, sub( idx, start_idx ), nBits ); + push_indice( hBstr, IND_ACELP_SIGNALLING, sub( idx, start_idx ), nBits ); } /* HQ/TCX core switching flag */ num_bits = add( num_bits, 1 ); IF( push != 0 ) { - push_indice_fx( hBstr, IND_MDCT_CORE, 1, 1 ); + push_indice( hBstr, IND_MDCT_CORE, 1, 1 ); } } ELSE @@ -469,7 +465,7 @@ Word16 signalling_mode1_tcx20_enc_fx( num_bits = add( num_bits, 1 ); IF( push != 0 ) { - push_indice_fx( hBstr, IND_CORE, 1, 1 ); + push_indice( hBstr, IND_CORE, 1, 1 ); } } @@ -477,7 +473,7 @@ Word16 signalling_mode1_tcx20_enc_fx( num_bits = add( num_bits, 1 ); IF( push != 0 ) { - push_indice_fx( hBstr, IND_MDCT_CORE, 1, 1 ); + push_indice( hBstr, IND_MDCT_CORE, 1, 1 ); } num_bits = add( num_bits, 2 ); @@ -486,19 +482,19 @@ Word16 signalling_mode1_tcx20_enc_fx( /* write band-width (needed for different I/O sampling rate support) */ IF( EQ_16( st->bwidth, NB ) ) { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 0, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 0, 2 ); } ELSE IF( EQ_16( st->bwidth, WB ) ) { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 1, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 1, 2 ); } ELSE IF( EQ_16( st->bwidth, SWB ) ) { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 2, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 2, 2 ); } ELSE /* st->bwidth == FB */ { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 3, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 3, 2 ); } } } @@ -529,28 +525,28 @@ void signalling_enc_fx( assert( !st_fx->tcxonly ); assert( st_fx->core == HQ_CORE ); - push_next_indice_fx( hBstr, 1, 1 ); /* TCX */ - push_next_indice_fx( hBstr, 1, 1 ); /* HQ_CORE */ + push_next_indice( hBstr, 1, 1 ); /* TCX */ + push_next_indice( hBstr, 1, 1 ); /* HQ_CORE */ /* write ACELP->HQ core switching flag */ test(); IF( ( st_fx->last_core == ACELP_CORE ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) { - push_indice_fx( hBstr, IND_HQ_SWITCHING_FLG, 1, 1 ); + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 1, 1 ); /* write ACELP L_frame info */ IF( EQ_16( st_fx->last_L_frame, L_FRAME ) ) { - push_indice_fx( hBstr, IND_LAST_L_FRAME, 0, 1 ); + push_indice( hBstr, IND_LAST_L_FRAME, 0, 1 ); } ELSE { - push_indice_fx( hBstr, IND_LAST_L_FRAME, 1, 1 ); + push_indice( hBstr, IND_LAST_L_FRAME, 1, 1 ); } } ELSE { - push_indice_fx( hBstr, IND_HQ_SWITCHING_FLG, 0, 1 ); + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 0, 1 ); } return; @@ -576,7 +572,7 @@ void signalling_enc_fx( IF( EQ_16( ppp_mode, 1 ) || EQ_16( nelp_mode, 1 ) ) { /* 1 bit to distinguish between 2.8kbps PPP/NELP frame and SID frame */ - push_indice_fx( hBstr, IND_CORE, 0, 1 ); + push_indice( hBstr, IND_CORE, 0, 1 ); /* SC-VBR: 0 - PPP_NB, 1 - PPP_WB, 2 - NELP_NB, 3 - NELP_WB */ test(); test(); @@ -588,19 +584,19 @@ void signalling_enc_fx( test(); IF( EQ_16( st_fx->coder_type, VOICED ) && EQ_16( st_fx->bwidth, NB ) && EQ_16( ppp_mode, 1 ) ) { - push_indice_fx( hBstr, IND_PPP_NELP_MODE, 0, 2 ); + push_indice( hBstr, IND_PPP_NELP_MODE, 0, 2 ); } ELSE IF( EQ_16( st_fx->coder_type, VOICED ) && NE_16( st_fx->bwidth, NB ) && EQ_16( ppp_mode, 1 ) ) { - push_indice_fx( hBstr, IND_PPP_NELP_MODE, 1, 2 ); + push_indice( hBstr, IND_PPP_NELP_MODE, 1, 2 ); } ELSE IF( EQ_16( st_fx->coder_type, UNVOICED ) && EQ_16( st_fx->bwidth, NB ) && EQ_16( nelp_mode, 1 ) ) { - push_indice_fx( hBstr, IND_PPP_NELP_MODE, 2, 2 ); + push_indice( hBstr, IND_PPP_NELP_MODE, 2, 2 ); } ELSE IF( EQ_16( st_fx->coder_type, UNVOICED ) && NE_16( st_fx->bwidth, NB ) && EQ_16( nelp_mode, 1 ) ) { - push_indice_fx( hBstr, IND_PPP_NELP_MODE, 3, 2 ); + push_indice( hBstr, IND_PPP_NELP_MODE, 3, 2 ); } } ELSE IF( NE_32( st_fx->core_brate, SID_2k40 ) && ( st_fx->core_brate != FRAME_NO_DATA ) ) @@ -608,7 +604,7 @@ void signalling_enc_fx( /* write the ACELP/HQ core selection bit */ IF( GE_32( st_fx->total_brate, ACELP_24k40 ) ) { - push_indice_fx( hBstr, IND_CORE, 0, 1 ); + push_indice( hBstr, IND_CORE, 0, 1 ); } /* find the section in the ACELP signalling table corresponding to bitrate */ @@ -654,7 +650,7 @@ void signalling_enc_fx( idx++; } - push_indice_fx( hBstr, IND_ACELP_SIGNALLING, idx - start_idx, nBits ); + push_indice( hBstr, IND_ACELP_SIGNALLING, idx - start_idx, nBits ); } /* write extension layer flag to distinguish between TBE (0) and BWE (1) */ @@ -666,11 +662,11 @@ void signalling_enc_fx( test(); IF( EQ_16( st_fx->extl, WB_TBE ) || EQ_16( st_fx->extl, SWB_TBE ) || EQ_16( st_fx->extl, FB_TBE ) ) { - push_indice_fx( hBstr, IND_BWE_FLAG, 0, 1 ); + push_indice( hBstr, IND_BWE_FLAG, 0, 1 ); } ELSE IF( EQ_16( st_fx->extl, WB_BWE ) || EQ_16( st_fx->extl, SWB_BWE ) || EQ_16( st_fx->extl, FB_BWE ) ) { - push_indice_fx( hBstr, IND_BWE_FLAG, 1, 1 ); + push_indice( hBstr, IND_BWE_FLAG, 1, 1 ); } } } @@ -680,24 +676,24 @@ void signalling_enc_fx( test(); IF( ( st_fx->last_core == ACELP_CORE ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) { - push_indice_fx( hBstr, IND_HQ_SWITCHING_FLG, 1, 1 ); + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 1, 1 ); /* write ACELP L_frame info */ IF( EQ_16( st_fx->last_L_frame, L_FRAME ) ) { - push_indice_fx( hBstr, IND_LAST_L_FRAME, 0, 1 ); + push_indice( hBstr, IND_LAST_L_FRAME, 0, 1 ); } ELSE { - push_indice_fx( hBstr, IND_LAST_L_FRAME, 1, 1 ); + push_indice( hBstr, IND_LAST_L_FRAME, 1, 1 ); } } ELSE { - push_indice_fx( hBstr, IND_HQ_SWITCHING_FLG, 0, 1 ); + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 0, 1 ); } /* HQ/TCX core switching flag */ - push_indice_fx( hBstr, IND_MDCT_CORE, 0, 1 ); + push_indice( hBstr, IND_MDCT_CORE, 0, 1 ); /* Use ACELP signaling for LR MDCT */ IF( LE_32( st_fx->total_brate, ACELP_16k40 ) ) @@ -721,7 +717,7 @@ void signalling_enc_fx( idx++; } - push_indice_fx( hBstr, IND_ACELP_SIGNALLING, idx - start_idx, nBits ); + push_indice( hBstr, IND_ACELP_SIGNALLING, idx - start_idx, nBits ); } ELSE { @@ -729,25 +725,25 @@ void signalling_enc_fx( IF( LE_32( st_fx->core_brate, ACELP_64k ) ) { /* write ACELP/HQ core indication flag */ - push_indice_fx( hBstr, IND_CORE, 1, 1 ); + push_indice( hBstr, IND_CORE, 1, 1 ); } /* write band-width (needed for different I/O sampling rate support) */ IF( EQ_16( st_fx->bwidth, NB ) ) { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 0, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 0, 2 ); } ELSE IF( EQ_16( st_fx->bwidth, WB ) ) { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 1, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 1, 2 ); } ELSE IF( EQ_16( st_fx->bwidth, SWB ) ) { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 2, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 2, 2 ); } ELSE /* st_fx->bwidth == FB */ { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 3, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 3, 2 ); } } } diff --git a/lib_enc/detect_transient_fx.c b/lib_enc/detect_transient_fx.c index 51f1cb47692fb74518524ee8f876adfb4082a58e..71c56cecf76462223fb91a1f104a79b2dd5b9b5a 100644 --- a/lib_enc/detect_transient_fx.c +++ b/lib_enc/detect_transient_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -48,7 +48,7 @@ /*--------------------------------------------------------------------------*/ /* float x (i) in Q_new input to filter */ /* float y (o) in Q_new +2 output of filter */ -/* float *oldy (i/o) previous output of filter */ +/* float *oldy (i/o) previous output of filter */ /* float *oldx (i/o) in Q_memx previous input of filter */ /* short L (i) in Q_memx +2 length (32 or 48 kHz) */ /*--------------------------------------------------------------------------*/ @@ -62,29 +62,28 @@ static void hp_filter_fx( { Word16 i; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - /*y[0] = 0.4931f * *oldy + 0.7466f*(x[0] - *oldx); */ - L_tmp = L_mult( sub_o( x[0], *oldx, &Overflow ), 24465 /*0.7466f in Q15*/ ); /*Q_new+16 */ - L_tmp = L_mac_sat( L_tmp, *oldy, 16158 /*0.4931f in Q15*/ ); /*Q_new+16 */ - y[0] = round_fx_sat( L_tmp ); /*Q_new */ + L_tmp = L_mult( sub_sat( x[0], *oldx ), 24465 /*0.7466f in Q15*/ ); /*Q_new+16 */ + L_tmp = L_mac_sat( L_tmp, *oldy, 16158 /*0.4931f in Q15*/ ); /*Q_new+16 */ + y[0] = round_fx_sat( L_tmp ); /*Q_new */ FOR( i = 1; i < L; i++ ) { /*y[i] = 0.4931f*y[i-1] + 0.7466f*(x[i] - x[i-1]); */ - L_tmp = L_mult( sub_o( x[i], x[i - 1], &Overflow ), 24465 /*0.7466f in Q15*/ ); /*Q_new+16 */ - L_tmp = L_mac_o( L_tmp, y[i - 1], 16158 /*0.4931f in Q15*/, &Overflow ); /*Q_new+16 */ - y[i] = round_fx_o( L_tmp, &Overflow ); /*Q_new */ + L_tmp = L_mult( sub_sat( x[i], x[i - 1] ), 24465 /*0.7466f in Q15*/ ); /*Q_new+16 */ + L_tmp = L_mac_sat( L_tmp, y[i - 1], 16158 /*0.4931f in Q15*/ ); /*Q_new+16 */ + y[i] = round_fx_sat( L_tmp ); /*Q_new */ } *oldx = x[L - 1]; move16(); /*Q_new */ *oldy = y[L - 1]; move16(); /*Q_new */ + + return; } + + /*--------------------------------------------------------------------------*/ /* Function detect_transient */ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ @@ -117,10 +116,8 @@ Word16 detect_transient_fx( Word32 E_low_fx, E_high_fx; Word16 temp16, Thres_fx = 0; Word16 exp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif shift = 0; move16(); @@ -151,7 +148,7 @@ Word16 detect_transient_fx( FOR( i = 0; i < L / 4; i++ ) { /*EnergyLT += out_filt[i] * out_filt[i]; */ - EnergyLT = L_mac0_o( EnergyLT, out_filt_fx[i], out_filt_fx[i], &Overflow ); /*2Q_new */ + EnergyLT = L_mac0_sat( EnergyLT, out_filt_fx[i], out_filt_fx[i] ); /*2Q_new */ } } ELSE @@ -170,16 +167,16 @@ Word16 detect_transient_fx( FOR( i = 0; i < L / 4; i++ ) { temp16 = extract_l( L_shr( out_filt_fx[i + blk * ( L / 4 )], 12 ) ); - Energy_fx = L_add_o( Energy_fx, L_mult0( temp16, temp16 ), &Overflow ); - temp16 = shr( in_fx[i + blk * ( L / 4 )], Q_new ); /*Q0*/ - Energy_in_fx[blk + 1] = L_add_o( Energy_in_fx[blk + 1], L_mult0( temp16, temp16 ), &Overflow ); /*Q0*/ + Energy_fx = L_add_sat( Energy_fx, L_mult0( temp16, temp16 ) ); + temp16 = shr( in_fx[i + blk * ( L / 4 )], Q_new ); /*Q0*/ + Energy_in_fx[blk + 1] = L_add_sat( Energy_in_fx[blk + 1], L_mult0( temp16, temp16 ) ); /*Q0*/ move32(); } - E_in_fx = L_add_o( E_in_fx, Energy_in_fx[blk + 1], &Overflow ); /*Q0*/ - E_out_fx = L_add_o( E_out_fx, Energy_fx, &Overflow ); /*Q0*/ + E_in_fx = L_add_sat( E_in_fx, Energy_in_fx[blk + 1] ); /*Q0*/ + E_out_fx = L_add_sat( E_out_fx, Energy_fx ); /*Q0*/ - Thres_fx = 2185; /*1 /15 Q15*/ + Thres_fx = 2185; /*1 /15 Q15*/ move16(); IF( GT_32( Mult_32_16( Energy_fx, 5461 ), EnergyLT ) ) { @@ -201,13 +198,13 @@ Word16 detect_transient_fx( FOR( i = 0; i < L / 8; i++ ) { /*Energy += out_filt_fx[i + blk*(L/4)] * out_filt_fx[i + blk*(L/4)]; */ - L_tmp = L_mac0_o( L_tmp, out_filt_fx[i + blk * ( L / 4 )], out_filt_fx[i + blk * ( L / 4 )], &Overflow ); /*2Q_new */ + L_tmp = L_mac0_sat( L_tmp, out_filt_fx[i + blk * ( L / 4 )], out_filt_fx[i + blk * ( L / 4 )] ); /*2Q_new */ } L_tmp2 = L_deposit_l( 0 ); FOR( ; i < L / 4; i++ ) { /*Energy += out_filt_fx[i + blk*(L/4)] * out_filt_fx[i + blk*(L/4)]; */ - L_tmp2 = L_mac0_o( L_tmp2, out_filt_fx[i + blk * ( L / 4 )], out_filt_fx[i + blk * ( L / 4 )], &Overflow ); /*2Q_new */ + L_tmp2 = L_mac0_sat( L_tmp2, out_filt_fx[i + blk * ( L / 4 )], out_filt_fx[i + blk * ( L / 4 )] ); /*2Q_new */ } Overflow = 0; move16(); @@ -218,10 +215,7 @@ Word16 detect_transient_fx( shift = 1; move16(); } - Overflow = 0; - move16(); - - Energy = L_add_o( L_shr( L_tmp, shift ), L_shr( L_tmp2, shift ), &Overflow ); /*2Q_new - shift*/ + Energy = L_add_sat( L_shr( L_tmp, shift ), L_shr( L_tmp2, shift ) ); /*2Q_new - shift*/ test(); IF( EQ_16( st_fx->extl, SWB_BWE ) || EQ_16( st_fx->extl, FB_BWE ) ) { @@ -250,7 +244,7 @@ Word16 detect_transient_fx( move16(); } thr = shl( thr, shift ); - /*if(Energy > L_shr(Mult_32_16(EnergyLT,22624),shift_cnt)) //getting in Q0 32*16 = Q_inp1+Q_inp2+1-16 */ + /*if(Energy > L_shr(Mult_32_16(EnergyLT,22624),shift_cnt)) //getting in Q0 32*16 = Q_inp1+Q_inp2+1-16 */ IF( GT_32( Mult_32_16( Energy, thr ), EnergyLT ) ) /*if(Energy > 6.0f * EnergyLT) */ { @@ -260,9 +254,9 @@ Word16 detect_transient_fx( move16(); } } - /*EnergyLT = 0.75f*EnergyLT + 0.25f*Energy; */ - /*0.75f*EnergyLT in Q0 //0.25f*Energy in Q0 */ - EnergyLT = L_add_o( Mult_32_16( EnergyLT, 24576 /*0.75f in Q15*/ ), Mult_32_16( Energy, shl( 8192 /*0.25 in Q15*/, shift ) ), &Overflow ); /*2Q_new */ + /*EnergyLT = 0.75f*EnergyLT + 0.25f*Energy; */ + /*0.75f*EnergyLT in Q0 //0.25f*Energy in Q0 */ + EnergyLT = L_add_sat( Mult_32_16( EnergyLT, 24576 /*0.75f in Q15*/ ), Mult_32_16( Energy, shl( 8192 /*0.25 in Q15*/, shift ) ) ); /*2Q_new */ } } st_fx->EnergyLT_fx = EnergyLT; @@ -288,7 +282,7 @@ Word16 detect_transient_fx( E_low_fx = L_deposit_l( 0 ); FOR( i = 0; i < position + 1; i++ ) { - /*blk++; */ + /*blk++; */ blk = add( blk, 1 ); E_low_fx = L_add_sat( E_low_fx, Energy_in_fx[i] ); /*Q0*/ } diff --git a/lib_enc/diffcod_fx.c b/lib_enc/diffcod_fx.c index 51a31fa8ae82ba811147417ac2efaec44079eaa6..871fd422fef42d0e3e513f23e2c9dfd0a0f90fe4 100644 --- a/lib_enc/diffcod_fx.c +++ b/lib_enc/diffcod_fx.c @@ -1,14 +1,15 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Compilation switches */ -#include "rom_com_fx.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function Prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Compilation switches */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*--------------------------------------------------------------------------*/ /* Function diffcod */ /* ~~~~~~~~~~~~~~~~~ */ diff --git a/lib_enc/dtx_fx.c b/lib_enc/dtx_fx.c index 154b43c124b83fe0394d7662fdad731a8d288d5c..483304cdedf36ced3b85cb458bcec935acadf4fd 100644 --- a/lib_enc/dtx_fx.c +++ b/lib_enc/dtx_fx.c @@ -1,19 +1,20 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" #include "rom_com.h" -// #include "basop_mpy.h" #include #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*-------------------------------------------------------------------* * Local constants *-------------------------------------------------------------------*/ + #define ALPHA_ENER_FAST_FX 29491 /* Fast adaptation (noise down, speech up) */ #define ALPHA_ENER_SLOW_FX 32440 /* Fast adaptation (noise down, speech up) */ @@ -29,18 +30,18 @@ #define CNG_TYPE_HO 20 /* hangover for switching between CNG types */ -#ifndef NONBE_FIX_1277_EVS_DTX_HIGH_RATE_THRESHOLD -#define DTX_THR 5 /* LP_NOISE level */ -#endif #define MAX_BRATE_DTX_EVS ACELP_24k40 /* maximum bitrate to which the default DTX is applied in EVS; otherwise DTX is applied only in silence */ #define MAX_BRATE_DTX_IVAS IVAS_80k /* maximum bitrate to which the default DTX is applied in IVAS; otherwise DTX is applied only in silence */ + /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ static void update_SID_cnt_fx( DTX_ENC_HANDLE hDtxEnc, const Word32 core_brate, const Word16 Opt_AMR_WB ); + + /*==================================================================================*/ /* FUNCTION : dtx_ivas_fx() */ /*----------------------------------------------------------------------------------*/ @@ -51,10 +52,10 @@ static void update_SID_cnt_fx( DTX_ENC_HANDLE hDtxEnc, const Word32 core_brate, /* _ (Word16) vad : vad flag Q0 */ /* _ (Word16[]) speech_fx : Pointer to the speech frame qSpeech */ /* _ (Word16) qSpeech : speech buffer qformat value */ -/* _ (Word16*) qener : frame_ener/lt_ener_voiced/lt_ener_noise buf qformat */ +/* _ (Word16*) qener : frame_ener/lt_ener_voiced/lt_ener_noise buf qformat */ /*----------------------------------------------------------------------------------*/ /* OUTPUT ARGUMENTS : */ -/* _ (Word16*) qener : frame_ener/lt_ener_voiced/lt_ener_noise buf qformat */ +/* _ (Word16*) qener : frame_ener/lt_ener_voiced/lt_ener_noise buf qformat */ /* _ (Encoder_State_Fx) st_fx : encoder state structure */ /*----------------------------------------------------------------------------------*/ @@ -63,14 +64,12 @@ static void update_SID_cnt_fx( DTX_ENC_HANDLE hDtxEnc, const Word32 core_brate, /* _ None */ /*==================================================================================*/ void dtx_ivas_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ -#ifdef NONBE_1211_DTX_BR_SWITCHING + Encoder_State *st_fx, /* i/o: encoder state structure */ const Word32 last_ivas_total_brate, /* i : last IVAS total bitrate Q0*/ -#endif - const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ - const Word16 vad, /* i : vad flag for DTX Q0*/ - const Word16 speech[], /* i : Pointer to the speech frame Q_speech*/ - Word16 Q_speech /* i : Q factor for speech */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ + const Word16 vad, /* i : vad flag for DTX Q0*/ + const Word16 speech[], /* i : Pointer to the speech frame Q_speech*/ + Word16 Q_speech /* i : Q factor for speech */ ) { Word16 alpha, i, j, Q_speech2; @@ -79,25 +78,15 @@ void dtx_ivas_fx( TD_CNG_ENC_HANDLE hTdCngEnc = st_fx->hTdCngEnc; Word16 last_br_cng_flag, last_br_flag, br_dtx_flag; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif -#ifdef NONBE_1211_DTX_BR_SWITCHING Word32 total_brate_ref; total_brate_ref = st_fx->total_brate; move32(); -#endif IF( st_fx->dtx_sce_sba != 0 ) { last_br_cng_flag = 1; last_br_flag = 1; -#ifndef NONBE_1211_DTX_BR_SWITCHING - br_dtx_flag = 1; - move16(); -#endif move16(); move16(); } @@ -106,21 +95,15 @@ void dtx_ivas_fx( test(); test(); test(); - last_br_cng_flag = LE_32( st_fx->last_total_brate_cng, MAX_BRATE_DTX_EVS ) || LT_16( st_fx->lp_noise_fx, DTX_THR * 256 ) || ( EQ_16( st_fx->element_mode, IVAS_SCE ) && LE_32( st_fx->last_total_brate_cng, MAX_BRATE_DTX_IVAS ) ); + last_br_cng_flag = LE_32( st_fx->last_total_brate_cng, MAX_BRATE_DTX_EVS ) || LT_32( ( st_fx->lp_noise_32fx ), DTX_THR * 16777216 ) || ( EQ_16( st_fx->element_mode, IVAS_SCE ) && LE_32( st_fx->last_total_brate_cng, MAX_BRATE_DTX_IVAS ) ); test(); test(); test(); -#ifdef NONBE_1211_DTX_BR_SWITCHING last_br_flag = ( st_fx->element_mode == EVS_MONO && LE_32( st_fx->last_total_brate, MAX_BRATE_DTX_EVS ) ) || ( st_fx->element_mode != EVS_MONO && LE_32( last_ivas_total_brate, MAX_BRATE_DTX_IVAS ) ) || - LT_16( st_fx->lp_noise_fx, DTX_THR * 256 ); -#else - last_br_flag = LE_32( st_fx->last_total_brate, MAX_BRATE_DTX_EVS ) || LT_16( st_fx->lp_noise_fx, DTX_THR * 256 ) || ( EQ_16( st_fx->element_mode, IVAS_SCE ) && LE_32( st_fx->last_total_brate, MAX_BRATE_DTX_IVAS ) ); - br_dtx_flag = 0; - move16(); -#endif + LT_32( ( st_fx->lp_noise_32fx ), DTX_THR * 16777216 ); } /* Initialization */ @@ -217,10 +200,8 @@ void dtx_ivas_fx( * Select SID or FRAME_NO_DATA frame if DTX is enabled *------------------------------------------------------------------------*/ -#ifdef NONBE_1211_DTX_BR_SWITCHING br_dtx_flag = 1; move16(); -#endif IF( st_fx->dtx_sce_sba == 0 ) { @@ -230,11 +211,7 @@ void dtx_ivas_fx( test(); br_dtx_flag = ( ( st_fx->element_mode == EVS_MONO ) && LE_32( st_fx->total_brate, MAX_BRATE_DTX_EVS ) ) || ( ( st_fx->element_mode != EVS_MONO ) && LE_32( ivas_total_brate, MAX_BRATE_DTX_IVAS ) ) || -#ifdef NONBE_FIX_1277_EVS_DTX_HIGH_RATE_THRESHOLD - LT_16( st_fx->lp_noise_fx, DTX_THR * 256 ); -#else - LT_16( st_fx->lp_noise_fx, 3840 /*15 in Q8*/ ); -#endif + LT_16( extract_h( st_fx->lp_noise_32fx ), DTX_THR * 256 ); } test(); test(); @@ -295,7 +272,6 @@ void dtx_ivas_fx( st_fx->core_brate = SID_2k40; move32(); } - // PMT("dtx_sce_sba code is missing") test(); test(); IF( ( ( st_fx->last_core != ACELP_CORE ) || EQ_16( st_fx->cng_type, FD_CNG ) ) && EQ_16( st_fx->dtx_sce_sba, 1 ) ) @@ -352,13 +328,11 @@ void dtx_ivas_fx( reset_indices_enc_fx( st_fx->hBstr, st_fx->hBstr->nb_ind_tot ); } } -#ifdef NONBE_1211_DTX_BR_SWITCHING ELSE IF( st_fx->element_mode != EVS_MONO ) { st_fx->total_brate = total_brate_ref; move32(); } -#endif /*------------------------------------------------------------------------* * Reset counters when in active frame (not in SID or FRAME_NO_DATA frame) @@ -402,7 +376,6 @@ void dtx_ivas_fx( IF( EQ_16( st_fx->element_mode, IVAS_SCE ) ) { Word32 lp_thresh, fd_thresh; - // PMT( "lp_thresh scaling is to be found" ) test(); IF( st_fx->Opt_DTX_ON && EQ_16( st_fx->dtx_sce_sba, 1 ) ) { @@ -428,7 +401,7 @@ void dtx_ivas_fx( st_fx->cng_type = FD_CNG; move16(); } - ELSE IF( EQ_16( st_fx->cng_type, FD_CNG ) && ( LT_32( st_fx->bckr_tilt_lt, fd_thresh ) ) && ( GT_16( st_fx->lp_noise_fx, 512 /* 2 in Q8 */ ) ) ) + ELSE IF( EQ_16( st_fx->cng_type, FD_CNG ) && ( LT_32( st_fx->bckr_tilt_lt, fd_thresh ) ) && ( GT_32( st_fx->lp_noise_32fx, 67108864 /* 2 in Q24 */ ) ) ) { st_fx->cng_type = LP_CNG; move16(); @@ -486,7 +459,7 @@ void dtx_ivas_fx( speech++; FOR( i = 1; i < L_FRAME / 16; i++ ) { - L_tmp = L_mac0_o( L_tmp, *speech, *speech, &Overflow ); /*2*Q_speech*/ + L_tmp = L_mac0_sat( L_tmp, *speech, *speech ); /*2*Q_speech*/ speech++; } hDtxEnc->frame_ener_fx = L_add( hDtxEnc->frame_ener_fx, L_shr( L_tmp, Q_speech2 ) ); /* Q(-7) */ @@ -631,10 +604,10 @@ void dtx_ivas_fx( /* _ (Word16) vad : vad flag Q0 */ /* _ (Word16[]) speech_fx : Pointer to the speech frame qSpeech */ /* _ (Word16) qSpeech : speech buffer qformat value */ -/* _ (Word16*) qener : frame_ener/lt_ener_voiced/lt_ener_noise buf qformat */ +/* _ (Word16*) qener : frame_ener/lt_ener_voiced/lt_ener_noise buf qformat */ /*----------------------------------------------------------------------------------*/ /* OUTPUT ARGUMENTS : */ -/* _ (Word16*) qener : frame_ener/lt_ener_voiced/lt_ener_noise buf qformat */ +/* _ (Word16*) qener : frame_ener/lt_ener_voiced/lt_ener_noise buf qformat */ /* _ (Encoder_State_Fx) st_fx : encoder state structure */ /*----------------------------------------------------------------------------------*/ @@ -656,10 +629,6 @@ void dtx_fx( TD_CNG_ENC_HANDLE hTdCngEnc = st_fx->hTdCngEnc; Word16 last_br_cng_flag, last_br_flag, br_dtx_flag; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif IF( st_fx->dtx_sce_sba != 0 ) { @@ -681,7 +650,7 @@ void dtx_fx( /* Initialization */ IF( st_fx->ini_frame == 0 ) { - st_fx->active_fr_cnt_fx = CNG_TYPE_HO; + st_fx->active_cnt = CNG_TYPE_HO; move16(); st_fx->cng_type = FD_CNG; @@ -781,7 +750,7 @@ void dtx_fx( st_fx->fd_cng_reset_flag == 0 ) { /* reset counter */ - st_fx->active_fr_cnt_fx = 0; + st_fx->active_cnt = 0; move16(); IF( st_fx->Opt_AMR_WB ) @@ -863,7 +832,7 @@ void dtx_fx( /* reset the bitstream (IVAS format signalling was already written) */ IF( NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) && st_fx->hBstr != NULL ) { - reset_indices_enc_fx( st_fx->hBstr, MAX_NUM_INDICES ); + reset_indices_enc_fx( st_fx->hBstr, st_fx->hBstr->nb_ind_tot ); } } @@ -903,7 +872,7 @@ void dtx_fx( move16(); /* reset the counter of CNG frames for averaging */ } test(); - IF( GE_16( st_fx->active_fr_cnt_fx, CNG_TYPE_HO ) && st_fx->Opt_AMR_WB == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( GE_16( st_fx->active_cnt, CNG_TYPE_HO ) && st_fx->Opt_AMR_WB == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { IF( EQ_16( st_fx->element_mode, IVAS_SCE ) ) { @@ -936,8 +905,8 @@ void dtx_fx( st_fx->cng_type = LP_CNG; move16(); } - st_fx->active_fr_cnt_fx = add( st_fx->active_fr_cnt_fx, 1 ); - st_fx->active_fr_cnt_fx = s_min( st_fx->active_fr_cnt_fx, 200 ); + st_fx->active_cnt = add( st_fx->active_cnt, 1 ); + st_fx->active_cnt = s_min( st_fx->active_cnt, 200 ); } /*------------------------------------------------------------------------* @@ -956,7 +925,7 @@ void dtx_fx( speech++; FOR( i = 1; i < L_FRAME / 16; i++ ) { - L_tmp = L_mac0_o( L_tmp, *speech, *speech, &Overflow ); /*2*Q_speech*/ + L_tmp = L_mac0_sat( L_tmp, *speech, *speech ); /*2*Q_speech*/ speech++; } hDtxEnc->frame_ener_fx = L_add( hDtxEnc->frame_ener_fx, L_shr( L_tmp, Q_speech2 ) ); /*Q(-7) */ @@ -1261,9 +1230,6 @@ void dtx_hangover_control_fx( VAD_HANDLE hVAD = st_fx->hVAD; DTX_ENC_HANDLE hDtxEnc = st_fx->hDtxEnc; TD_CNG_ENC_HANDLE hTdCngEnc = st_fx->hTdCngEnc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /* get current frame exc energy in log2 */ exp = norm_l( hTdCngEnc->ho_ener_circ_fx[hTdCngEnc->ho_circ_ptr] ); @@ -1432,7 +1398,7 @@ void dtx_hangover_control_fx( move16(); FOR( j = 0; j < m; j++ ) { - lsp_est[i] = add_o( lsp_est[i], tmp[j * M + i], &Overflow ); /*Q15 */ + lsp_est[i] = add_sat( lsp_est[i], tmp[j * M + i] ); /*Q15 */ } lsp_est[i] = sub( lsp_est[i], tmp[max_idx[0] * M + i] ); /*Q15 */ @@ -1448,12 +1414,12 @@ void dtx_hangover_control_fx( move16(); FOR( j = 0; j < m; j++ ) { - lsp_est[i] = add_o( lsp_est[i], tmp[j * M + i], &Overflow ); /*Q15 */ + lsp_est[i] = add_sat( lsp_est[i], tmp[j * M + i] ); /*Q15 */ } - lsp_est[i] = sub_o( lsp_est[i], add_o( tmp[max_idx[0] * M + i], tmp[max_idx[1] * M + i], &Overflow ), &Overflow ); /*Q15 */ - S_tmp = div_s( 1, sub( m, 2 ) ); /*Q15 */ - lsp_est[i] = mult_r( lsp_est[i], S_tmp ); /*Q15 */ + lsp_est[i] = sub_sat( lsp_est[i], add_sat( tmp[max_idx[0] * M + i], tmp[max_idx[1] * M + i] ) ); /*Q15 */ + S_tmp = div_s( 1, sub( m, 2 ) ); /*Q15 */ + lsp_est[i] = mult_r( lsp_est[i], S_tmp ); /*Q15 */ } } @@ -1461,8 +1427,8 @@ void dtx_hangover_control_fx( move16(); FOR( i = 0; i < M; i++ ) { - Dlsp_n2e = add_o( Dlsp_n2e, abs_s( sub( lsp_new_fx[i], lsp_est[i] ) ), &Overflow ); /*Q15 */ - lsp_est[i] = add( mult_r( 26214, lsp_est[i] ), mult_r( 6554, lsp_new_fx[i] ) ); /*Q15 */ + Dlsp_n2e = add_sat( Dlsp_n2e, abs_s( sub( lsp_new_fx[i], lsp_est[i] ) ) ); /*Q15 */ + lsp_est[i] = add( mult_r( 26214, lsp_est[i] ), mult_r( 6554, lsp_new_fx[i] ) ); /*Q15 */ } /* get deviation of CNG parameters between newly estimated and current state memory */ @@ -1474,7 +1440,7 @@ void dtx_hangover_control_fx( FOR( i = 0; i < M; i++ ) { S_tmp = abs_s( sub( hDtxEnc->lspCNG_fx[i], lsp_est[i] ) ); /*Q15 */ - Dlsp = add_o( Dlsp, S_tmp, &Overflow ); /*Q15 */ + Dlsp = add_sat( Dlsp, S_tmp ); /*Q15 */ IF( GT_16( S_tmp, S_max ) ) { S_max = S_tmp; /*Q15 */ diff --git a/lib_enc/enc_acelp_fx.c b/lib_enc/enc_acelp_fx.c index a509a7cd74346749a88061b9a841e5bbad9ac4cc..ba09a659407b4a72e66fd6d7d7d62fca96c19229 100644 --- a/lib_enc/enc_acelp_fx.c +++ b/lib_enc/enc_acelp_fx.c @@ -1,15 +1,14 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "typedef.h" #include #include #include "options.h" #include "cnst.h" -//#include "prot_fx.h" #include "basop_util.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "rom_enc.h" #include "prot_fx.h" /* Function prototypes */ @@ -51,17 +50,21 @@ void E_ACELP_corrmatrix_fx( Word16 h[] /*Q12*/, Word16 sign[] /*Q0*/, Word16 vec * Returns: * void */ -void E_ACELP_h_vec_corr1_fx( Word16 h[] /*Qx*/, Word16 vec[] /*Qx*/, UWord8 track /*Q0*/, Word16 sign[] /*Q15*/, Word16 ( *rrixix )[16] /*Q9*/, Word16 cor[] /*Q9*/, Word16 dn2_pos[] /*Q0*/, Word16 nb_pulse /*Q0*/ ) +void E_ACELP_h_vec_corr1_fx( + Word16 h[] /*Qx*/, + Word16 vec[] /*Qx*/, + UWord8 track /*Q0*/, + Word16 sign[] /*Q15*/, + Word16 ( *rrixix )[16] /*Q9*/, + Word16 cor[] /*Q9*/, + Word16 dn2_pos[] /*Q0*/, + Word16 nb_pulse /*Q0*/ ) { Word16 i, j; Word16 dn, corr; Word16 *dn2; Word16 *p0, *p1, *p2; Word32 L_sum; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif dn2 = &dn2_pos[( track * 8 )]; /*Q0*/ p0 = rrixix[track]; /*Q9*/ @@ -75,37 +78,41 @@ void E_ACELP_h_vec_corr1_fx( Word16 h[] /*Qx*/, Word16 vec[] /*Qx*/, UWord8 trac p2 = &vec[dn]; /*Qx*/ FOR( j = dn; j < L_SUBFR - 1; j++ ) { - L_sum = L_mac_o( L_sum, *p1++, *p2++, &Overflow ); /*2*Qx+1*/ + L_sum = L_mac_sat( L_sum, *p1++, *p2++ ); /*2*Qx+1*/ } - corr = mac_ro( L_sum, *p1++, *p2++, &Overflow ); /*Q9*/ + corr = mac_r_sat( L_sum, *p1++, *p2++ ); /*Q9*/ /*cor[dn >> 2] = sign[dn] * s + p0[dn >> 2];*/ j = shr( dn, 2 ); if ( sign[dn] > 0 ) { - corr = add_o( p0[j], corr, &Overflow ); /*Q9*/ + corr = add_sat( p0[j], corr ); /*Q9*/ } if ( sign[dn] < 0 ) { - corr = sub_o( p0[j], corr, &Overflow ); /*Q9*/ + corr = sub_sat( p0[j], corr ); /*Q9*/ } cor[j] = corr; /*Q9*/ move16(); } + return; } -void E_ACELP_h_vec_corr2_fx( Word16 h[] /*Qx*/, Word16 vec[] /*Qx*/, UWord8 track /*Q0*/, Word16 sign[] /*Q15*/, Word16 ( *rrixix )[16] /*Q9*/, Word16 cor[] /*Q9*/ ) + +void E_ACELP_h_vec_corr2_fx( + Word16 h[] /*Qx*/, + Word16 vec[] /*Qx*/, + UWord8 track /*Q0*/, + Word16 sign[] /*Q15*/, + Word16 ( *rrixix )[16] /*Q9*/, + Word16 cor[] /*Q9*/ ) { Word16 i, j, pos, corr; Word16 *p0, *p1, *p2; Word32 L_sum; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif p0 = rrixix[track]; /*Q9*/ @@ -118,25 +125,26 @@ void E_ACELP_h_vec_corr2_fx( Word16 h[] /*Qx*/, Word16 vec[] /*Qx*/, UWord8 trac p2 = &vec[pos]; /*Qx*/ FOR( j = pos; j < L_SUBFR - 1; j++ ) { - L_sum = L_mac_o( L_sum, *p1++, *p2++, &Overflow ); /* 2*Qx+1 */ + L_sum = L_mac_sat( L_sum, *p1++, *p2++ ); /* 2*Qx+1 */ } - corr = mac_ro( L_sum, *p1++, *p2++, &Overflow ); /*Q9*/ + corr = mac_r_sat( L_sum, *p1++, *p2++ ); /*Q9*/ /*cor[i] = s * sign[track] + p0[i];*/ if ( sign[pos] > 0 ) { - corr = add_o( *p0++, corr, &Overflow ); /*Q9*/ + corr = add_sat( *p0++, corr ); /*Q9*/ } if ( sign[pos] < 0 ) { - corr = sub_o( *p0++, corr, &Overflow ); /*Q9*/ + corr = sub_sat( *p0++, corr ); /*Q9*/ } cor[i] = corr; /*Q9*/ move16(); pos = add( pos, 4 ); } + return; } @@ -164,7 +172,19 @@ void E_ACELP_h_vec_corr2_fx( Word16 h[] /*Qx*/, Word16 vec[] /*Qx*/, UWord8 trac * Returns: * void */ -static void E_ACELP_2pulse_search( Word16 nb_pos_ix /*Q0*/, UWord8 track_x /*Q0*/, UWord8 track_y /*Q0*/, Word16 *ps /*Qdn*/, Word16 *alp /*Qx*/, Word16 *ix /*Q0*/, Word16 *iy /*Q0*/, Word16 dn[] /*Qdn*/, Word16 *dn2 /*Q0*/, Word16 cor_x[] /*Qx*/, Word16 cor_y[] /*Qx*/, Word16 ( *rrixiy )[256] /*Q9*/ ) +static void E_ACELP_2pulse_search( + Word16 nb_pos_ix /*Q0*/, + UWord8 track_x /*Q0*/, + UWord8 track_y /*Q0*/, + Word16 *ps /*Qdn*/, + Word16 *alp /*Qx*/, + Word16 *ix /*Q0*/, + Word16 *iy /*Q0*/, + Word16 dn[] /*Qdn*/, + Word16 *dn2 /*Q0*/, + Word16 cor_x[] /*Qx*/, + Word16 cor_y[] /*Qx*/, + Word16 ( *rrixiy )[256] /*Q9*/ ) { Word16 x, x2, y, i, *pos_x; Word16 ps0, ps1, alp2_16, ps2, sq; @@ -174,12 +194,6 @@ static void E_ACELP_2pulse_search( Word16 nb_pos_ix /*Q0*/, UWord8 track_x /*Q0* Word32 xy_save; Word16 check = 0; /* debug code not instrumented */ -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - /* eight dn2 max positions per track */ /*pos_x = &dn2[track_x << 3]; SHIFT(1); PTR_INIT(1);*/ pos_x = &dn2[( track_x * 8 )]; /*Qdn*/ @@ -195,7 +209,7 @@ static void E_ACELP_2pulse_search( Word16 nb_pos_ix /*Q0*/, UWord8 track_x /*Q0* sqk[0] = -1; move16(); x2 = shr( pos_x[0], 2 ); /*Qdn*/ - if ( mac_ro( L_mac_o( L_mac_o( alp0, cor_x[x2], _1_, &Overflow ), cor_y[0], _1_, &Overflow ), rrixiy[track_x][( x2 * 16 )], _1_, &Overflow ) < 0 ) + if ( mac_r_sat( L_mac_sat( L_mac_sat( alp0, cor_x[x2], _1_ ), cor_y[0], _1_ ), rrixiy[track_x][( x2 * 16 )], _1_ ) < 0 ) { sqk[0] = 1; move16(); @@ -215,7 +229,7 @@ static void E_ACELP_2pulse_search( Word16 nb_pos_ix /*Q0*/, UWord8 track_x /*Q0* ps1 = add( ps0, dn[x] ); /*Qdn*/ /*alp1 = alp0 + cor_x[x2];*/ - alp1 = L_mac_o( alp0, cor_x[x2], _1_, &Overflow ); /*Q22*/ + alp1 = L_mac_sat( alp0, cor_x[x2], _1_ ); /*Q22*/ p1 = cor_y; /*Qx*/ p2 = &rrixiy[track_x][( x2 * 16 )]; /*Q9*/ @@ -227,9 +241,9 @@ static void E_ACELP_2pulse_search( Word16 nb_pos_ix /*Q0*/, UWord8 track_x /*Q0* move16(); /*alp2 = alp1 + (*p1++) + (*p2++);*/ - alp2 = L_mac_o( alp1, *p1++, _1_, &Overflow ); /*Qx+12+1*/ - alp2_16 = mac_ro( alp2, *p2++, _1_, &Overflow ); /*Q6*/ - alpk[1 - ik] = alp2_16; /*Q6*/ + alp2 = L_mac_sat( alp1, *p1++, _1_ ); /*Qx+12+1*/ + alp2_16 = mac_r_sat( alp2, *p2++, _1_ ); /*Q6*/ + alpk[1 - ik] = alp2_16; /*Q6*/ move16(); /*sq = ps2 * ps2;*/ @@ -268,6 +282,7 @@ static void E_ACELP_2pulse_search( Word16 nb_pos_ix /*Q0*/, UWord8 track_x /*Q0* *alp = alpk[ik]; /*Q6*/ move16(); + return; } @@ -291,13 +306,14 @@ static void E_ACELP_2pulse_search( Word16 nb_pos_ix /*Q0*/, UWord8 track_x /*Q0* * Returns: * void */ -static void E_ACELP_1pulse_search( UWord8 tracks[2], - Word16 *ps, /*Qdn*/ - Word16 *alp, /*Qx*/ - Word16 *ix, /*Q0*/ - Word16 dn[], /*Qdn*/ - Word16 cor_x[], /*Q6*/ - Word16 cor_y[] /*Q6*/ ) +static void E_ACELP_1pulse_search( + UWord8 tracks[2], + Word16 *ps, /*Qdn*/ + Word16 *alp, /*Qx*/ + Word16 *ix, /*Q0*/ + Word16 dn[], /*Qdn*/ + Word16 cor_x[], /*Q6*/ + Word16 cor_y[] /*Q6*/ ) { Word16 x, x_save = 0; Word16 ps0; @@ -377,6 +393,7 @@ static void E_ACELP_1pulse_search( UWord8 tracks[2], move16(); *ix = x_save; /*Q0*/ move16(); + return; } @@ -400,7 +417,11 @@ static void E_ACELP_1pulse_search( UWord8 tracks[2], * Returns: * void */ -static void E_ACELP_xh_corr( Word16 *x /*Qx*/, Word16 *y /*Qy*/, Word16 *h /*Q12*/, Word16 L_subfr /*Q0*/ ) +static void E_ACELP_xh_corr( + Word16 *x /*Qx*/, + Word16 *y /*Qy*/, + Word16 *h /*Q12*/, + Word16 L_subfr /*Q0*/ ) { Word16 i, j, k; Word32 L_tmp, y32[L_SUBFR16k], L_maxloc, L_tot; @@ -452,7 +473,11 @@ static void E_ACELP_xh_corr( Word16 *x /*Qx*/, Word16 *y /*Qy*/, Word16 *h /*Q12 * \param bits amount of target headroom bits for y * \return exponent of y */ -Word16 E_ACELP_hh_corr( Word16 *x /*Q11*/, Word16 *y /*Qy*/, Word16 L_subfr /*Q0*/, Word16 bits /*Q0*/ ) +Word16 E_ACELP_hh_corr( + Word16 *x /*Q11*/, + Word16 *y /*Qy*/, + Word16 L_subfr /*Q0*/, + Word16 bits /*Q0*/ ) { Word16 i, j, k = 0; /* initialize just to avoid compiler warning */ Word32 L_tmp, L_sum; @@ -518,24 +543,27 @@ Word16 E_ACELP_hh_corr( Word16 *x /*Q11*/, Word16 *y /*Qy*/, Word16 L_subfr /*Q0 * Returns: * pitch gain (0 ... 1.2F) (Q14) */ -Word16 E_ACELP_xy1_corr_fx( Word16 xn[] /*Q15-exp_xn*/, Word16 y1[] /*Q15-exp_xn*/, ACELP_CbkCorr *g_corr, Word16 norm_flag /*Q0*/, Word16 L_subfr /*Q0*/, Word16 exp_xn ) +Word16 E_ACELP_xy1_corr_fx( + Word16 xn[] /*Q15-exp_xn*/, + Word16 y1[] /*Q15-exp_xn*/, + ACELP_CbkCorr *g_corr, + Word16 norm_flag /*Q0*/, + Word16 L_subfr /*Q0*/, + Word16 exp_xn ) { Word16 i, Q_xn; Word16 xy, yy, exp_xy, exp_yy, gain; Word32 L_off; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif L_off = L_shr( 10737418l /*0.01f/2.0f Q31*/, s_min( add( exp_xn, exp_xn ), 31 ) ); L_off = L_max( 1, L_off ); /* ensure at least a '1' */ /* Compute scalar product t1: */ - yy = round_fx_o( Dot_product15_offs( y1, y1, L_subfr, &exp_yy, L_off ), &Overflow ); /*Q15 - exp_yy*/ + yy = round_fx_sat( Dot_product15_offs( y1, y1, L_subfr, &exp_yy, L_off ) ); /*Q15 - exp_yy*/ /* Compute scalar product t0: */ - xy = round_fx_o( Dot_product12_offs( xn, y1, L_subfr, &exp_xy, L_off ), &Overflow ); /*Q15 - exp_xy*/ + xy = round_fx_sat( Dot_product12_offs( xn, y1, L_subfr, &exp_xy, L_off ) ); /*Q15 - exp_xy*/ + /* Compute doubled format out of the exponent */ Q_xn = shl( sub( 15, exp_xn ), 1 ); g_corr->y1y1 = yy; @@ -563,7 +591,7 @@ Word16 E_ACELP_xy1_corr_fx( Word16 xn[] /*Q15-exp_xn*/, Word16 y1[] /*Q15-exp_xn i = add( exp_xy, 1 - 1 ); /* -1 -> gain in Q14 */ i = sub( i, exp_yy ); BASOP_SATURATE_WARNING_OFF_EVS - gain = shl_o( gain, i, &Overflow ); /* saturation can occur here */ + gain = shl_sat( gain, i ); /* saturation can occur here */ BASOP_SATURATE_WARNING_ON_EVS /* gain = s_max(0, gain); */ /* see above xy < 0. */ @@ -577,7 +605,7 @@ Word16 E_ACELP_xy1_corr_fx( Word16 xn[] /*Q15-exp_xn*/, Word16 y1[] /*Q15-exp_xn Word16 tmp, exp_tmp, exp_div; /* Compute scalar product */ - tmp = round_fx_o( Dot_product12_offs( xn, xn, L_subfr, &exp_tmp, 1 ), &Overflow ); /*Q15 - exp_tmp*/ + tmp = round_fx_sat( Dot_product12_offs( xn, xn, L_subfr, &exp_tmp, 1 ) ); /*Q15 - exp_tmp*/ /* gain_p_snr = sqrt(/) */ tmp = BASOP_Util_Divide1616_Scale( tmp, yy, &exp_div ); exp_tmp = add( sub( exp_tmp, exp_yy ), exp_div ); @@ -587,7 +615,7 @@ Word16 E_ACELP_xy1_corr_fx( Word16 xn[] /*Q15-exp_xn*/, Word16 y1[] /*Q15-exp_xn /* Note: shl works as shl or shr. */ exp_tmp = sub( exp_tmp, 1 ); BASOP_SATURATE_WARNING_OFF_EVS - tmp = round_fx_o( L_shl_o( Mpy_32_16_1( 1717986944l /*ACELP_GAINS_CONST Q31*/, tmp ), exp_tmp, &Overflow ), &Overflow ); /*Q14*/ + tmp = round_fx_sat( L_shl_sat( Mpy_32_16_1( 1717986944l /*ACELP_GAINS_CONST Q31*/, tmp ), exp_tmp ) ); /*Q14*/ BASOP_SATURATE_WARNING_ON_EVS gain = s_min( gain, tmp ); /*Q14*/ @@ -595,7 +623,6 @@ Word16 E_ACELP_xy1_corr_fx( Word16 xn[] /*Q15-exp_xn*/, Word16 y1[] /*Q15-exp_xn bail: - return ( gain ); } @@ -618,7 +645,13 @@ bail: * Returns: * pitch gain (0 ... 1.2F) */ -void E_ACELP_xy2_corr( Word16 xn[] /*Q_xn*/, Word16 y1[] /*Q_xn*/, Word16 y2[] /*Q9*/, ACELP_CbkCorr *g_corr, Word16 L_subfr /*Q0*/, Word16 exp_xn ) +void E_ACELP_xy2_corr( + Word16 xn[] /*Q_xn*/, + Word16 y1[] /*Q_xn*/, + Word16 y2[] /*Q9*/, + ACELP_CbkCorr *g_corr, + Word16 L_subfr /*Q0*/, + Word16 exp_xn ) { Word16 xny2, y2y2, y1y2, xx, exp_xny2, exp_y2y2, exp_y1y2, exp_xx; Word32 L_off; @@ -680,14 +713,15 @@ void E_ACELP_xy2_corr( Word16 xn[] /*Q_xn*/, Word16 y1[] /*Q_xn*/, Word16 y2[] / * Returns: * void */ -void E_ACELP_codebook_target_update_fx( Word16 *x /*Q_xn*/, Word16 *x2 /*Q_xn*/, Word16 *y /*Q_xn*/, Word16 gain /*Q14*/, Word16 L_subfr /*Q0*/ ) +void E_ACELP_codebook_target_update_fx( + Word16 *x /*Q_xn*/, + Word16 *x2 /*Q_xn*/, + Word16 *y /*Q_xn*/, + Word16 gain /*Q14*/, + Word16 L_subfr /*Q0*/ ) { Word16 i, Q15_flag; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif assert( gain >= 0 ); Q15_flag = 0; @@ -704,11 +738,13 @@ void E_ACELP_codebook_target_update_fx( Word16 *x /*Q_xn*/, Word16 *x2 /*Q_xn*/, L_tmp = L_deposit_h( x[i] ); /*Q_xn+16*/ if ( Q15_flag == 0 ) { - L_tmp = L_msu_o( L_tmp, y[i], gain, &Overflow ); /*Q_xn+15*/ + L_tmp = L_msu_sat( L_tmp, y[i], gain ); /*Q_xn+15*/ } - x2[i] = msu_ro( L_tmp, y[i], gain, &Overflow ); /*Q_xn*/ + x2[i] = msu_r_sat( L_tmp, y[i], gain ); /*Q_xn*/ move16(); } + + return; } @@ -732,7 +768,15 @@ void E_ACELP_codebook_target_update_fx( Word16 *x /*Q_xn*/, Word16 *x2 /*Q_xn*/, * Returns: * void */ -void E_ACELP_pulsesign( const Word16 cn[] /*Q_xn*/, Word16 dn[] /*Qdn*/, Word16 dn2[] /*Qdn2*/, Word16 sign[] /*Q13*/, Word16 vec[] /*Q15*/, const Word16 alp /*Q13*/, const Word16 sign_val /*Q15*/, const Word16 L_subfr /*Q0*/ ) +void E_ACELP_pulsesign( + const Word16 cn[] /*Q_xn*/, + Word16 dn[] /*Qdn*/, + Word16 dn2[] /*Qdn2*/, + Word16 sign[] /*Q13*/, + Word16 vec[] /*Q15*/, + const Word16 alp /*Q13*/, + const Word16 sign_val /*Q15*/, + const Word16 L_subfr /*Q0*/ ) { Word16 i; Word32 Lval, Lcor; @@ -740,11 +784,6 @@ void E_ACELP_pulsesign( const Word16 cn[] /*Q_xn*/, Word16 dn[] /*Qdn*/, Word16 Word16 signs[3]; Word16 *ptr16; Word16 val, index; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - /* calculate energy for normalization of cn[] and dn[] */ Lval = L_mac0( 1, cn[0], cn[0] ); /*2*Q_xn*/ @@ -752,8 +791,8 @@ void E_ACELP_pulsesign( const Word16 cn[] /*Q_xn*/, Word16 dn[] /*Qdn*/, Word16 FOR( i = 1; i < L_subfr; i++ ) { - Lval = L_mac0_o( Lval, cn[i], cn[i], &Overflow ); /*2*Q_xn*/ - Lcor = L_mac0( Lcor, dn[i], dn[i] ); /*2*Qdn*/ + Lval = L_mac0_sat( Lval, cn[i], cn[i] ); /*2*Q_xn*/ + Lcor = L_mac0( Lcor, dn[i], dn[i] ); /*2*Qdn*/ } e_dn = 31; @@ -769,8 +808,8 @@ void E_ACELP_pulsesign( const Word16 cn[] /*Q_xn*/, Word16 dn[] /*Qdn*/, Word16 if ( i > 0 ) Lcor = L_shr( Lcor, i ); - k_dn = round_fx_o( Lval, &Overflow ); /*Q15 - e_dn*/ - k_cn = round_fx_o( Lcor, &Overflow ); /*Q15 - e_cn*/ + k_dn = round_fx_sat( Lval ); /*Q15 - e_dn*/ + k_cn = round_fx_sat( Lcor ); /*Q15 - e_cn*/ k_cn = mult_r( 0x2000, k_cn ); /* 1 in Q13 */ k_dn = mult_r( alp, k_dn ); /* alp in Q13 */ @@ -788,9 +827,9 @@ void E_ACELP_pulsesign( const Word16 cn[] /*Q_xn*/, Word16 dn[] /*Qdn*/, Word16 FOR( i = 0; i < L_subfr; i++ ) { /*cor = (s * cn[i]) + (alp * dn[i]); MULT(1);MAC(1);*/ - Lcor = L_mult( cn[i], k_cn ); /*Q_xn + Q15 - e_cn + 1*/ - Lcor = L_mac( Lcor, dn[i], k_dn ); /*Qdn + Q15 - e_dn + 1*/ - val = round_fx_o( L_shl_o( Lcor, 4, &Overflow ), &Overflow ); /*shifting by 4 may overflow but improves accuracy Qdn + 4 - e_dn*/ + Lcor = L_mult( cn[i], k_cn ); /*Q_xn + Q15 - e_cn + 1*/ + Lcor = L_mac( Lcor, dn[i], k_dn ); /*Qdn + Q15 - e_dn + 1*/ + val = round_fx_sat( L_shl_sat( Lcor, 4 ) ); /*shifting by 4 may overflow but improves accuracy Qdn + 4 - e_dn*/ index = shr( val, 15 ); sign[i] = ptr16[index]; /*Q15*/ @@ -809,7 +848,10 @@ void E_ACELP_pulsesign( const Word16 cn[] /*Q_xn*/, Word16 dn[] /*Qdn*/, Word16 } -void E_ACELP_findcandidates( Word16 dn2[] /*Qx*/, Word16 dn2_pos[] /*Q0*/, Word16 pos_max[] /*Q0*/ ) +void E_ACELP_findcandidates( + Word16 dn2[] /*Qx*/, + Word16 dn2_pos[] /*Q0*/, + Word16 pos_max[] /*Q0*/ ) { Word16 i, k, j, i8; Word16 *ps_ptr; @@ -841,7 +883,9 @@ void E_ACELP_findcandidates( Word16 dn2[] /*Qx*/, Word16 dn2_pos[] /*Q0*/, Word1 } -static void E_ACELP_apply_sign( Word16 *p0 /*Qx*/, Word16 *psign0 /*Q15*/ ) +static void E_ACELP_apply_sign( + Word16 *p0 /*Qx*/, + Word16 *psign0 /*Q15*/ ) { p0[0] = mult_r( p0[0], psign0[0] ); /*Qx*/ move16(); @@ -875,9 +919,14 @@ static void E_ACELP_apply_sign( Word16 *p0 /*Qx*/, Word16 *psign0 /*Q15*/ ) move16(); p0[15] = mult_r( p0[15], psign0[60] ); move16(); + + return; } -void E_ACELP_vec_neg_fx( Word16 h[] /*Qx*/, Word16 h_inv[] /*Qx*/, Word16 L_subfr /*Q0*/ ) +void E_ACELP_vec_neg_fx( + Word16 h[] /*Qx*/, + Word16 h_inv[] /*Qx*/, + Word16 L_subfr /*Q0*/ ) { Word16 i; @@ -886,10 +935,17 @@ void E_ACELP_vec_neg_fx( Word16 h[] /*Qx*/, Word16 h_inv[] /*Qx*/, Word16 L_subf h_inv[i] = negate( h[i] ); move16(); } + + return; } -void E_ACELP_corrmatrix_fx( Word16 h[] /*Q12*/, Word16 sign[] /*Q0*/, Word16 vec[] /*Q15*/, Word16 rrixix[4][16] /*Q9*/, Word16 rrixiy[4][256] /*Q9*/ ) +void E_ACELP_corrmatrix_fx( + Word16 h[] /*Q12*/, + Word16 sign[] /*Q0*/, + Word16 vec[] /*Q15*/, + Word16 rrixix[4][16] /*Q9*/, + Word16 rrixiy[4][256] /*Q9*/ ) { Word16 *p0, *p1, *p2, *p3, *psign0, *psign1, *psign2, *psign3; @@ -927,7 +983,6 @@ void E_ACELP_corrmatrix_fx( Word16 h[] /*Q12*/, Word16 sign[] /*Q0*/, Word16 vec *p0-- = round_fx( L_shr( cor, 1 ) ); /* Q9 */ } - /* * Compute rrixiy[][] needed for the codebook search. */ @@ -1064,10 +1119,19 @@ void E_ACELP_corrmatrix_fx( Word16 h[] /*Q12*/, Word16 sign[] /*Q0*/, Word16 vec E_ACELP_apply_sign( p3, psign3 ); p3 += 16; } + return; } -void E_ACELP_4tsearch_fx( Word16 dn[] /*Qdn*/, const Word16 cn[] /*Q_xn*/, const Word16 H[] /*Q12*/, Word16 code[] /*Q9*/, const PulseConfig *config, Word16 ind[] /*Q0*/, Word16 y[] /*Qy*/ ) +void E_ACELP_4tsearch_fx( + Word16 dn[] /*Qdn*/, + const Word16 cn[] /*Q_xn*/, + const Word16 H[] /*Q12*/, + Word16 code[] /*Q9*/, + const PulseConfig *config, + Word16 ind[] /*Q0*/, + Word16 y[] /*Qy*/, + const Word16 element_mode ) { Word16 sign[L_SUBFR], vec[L_SUBFR]; Word16 cor_x[16], cor_y[16], h_buf[4 * L_SUBFR]; @@ -1086,11 +1150,6 @@ void E_ACELP_4tsearch_fx( Word16 dn[] /*Qdn*/, const Word16 cn[] /*Q_xn*/, const Word32 s, L_tmp; Word16 nb_pulse, nb_pulse_m2; Word16 check = 0; /* debug code not instrumented */ -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - alp = config->alp; /* Q13 */ /* initial value for energy of all fixed pulses */ move16(); @@ -1128,7 +1187,7 @@ void E_ACELP_4tsearch_fx( Word16 dn[] /*Qdn*/, const Word16 cn[] /*Q_xn*/, const BASOP_SATURATE_WARNING_OFF_EVS FOR( i = 0; i < L_SUBFR; i++ ) { - L_tmp = L_mac_o( L_tmp, H[i], H[i], &Overflow ); /*Q25*/ + L_tmp = L_mac_sat( L_tmp, H[i], H[i] ); /*Q25*/ } val = extract_h( L_tmp ); /*Q9*/ BASOP_SATURATE_WARNING_ON_EVS @@ -1143,18 +1202,21 @@ void E_ACELP_4tsearch_fx( Word16 dn[] /*Qdn*/, const Word16 cn[] /*Q_xn*/, const scale = -2; move16(); } - + test(); + if ( EQ_16( val, 32767 ) && element_mode > EVS_MONO ) + { + scale = -3; + move16(); + } Copy_Scale_sig( H, h, L_SUBFR, scale ); /*Q12+scale*/ E_ACELP_vec_neg_fx( h, h_inv, L_SUBFR ); - /* * Compute correlation matrices needed for the codebook search. */ E_ACELP_corrmatrix_fx( h, sign, vec, rrixix, rrixiy ); - /* * Deep first search: * ------------------ @@ -1273,9 +1335,8 @@ void E_ACELP_4tsearch_fx( Word16 dn[] /*Qdn*/, const Word16 cn[] /*Q_xn*/, const L_tmp = L_mult( vec[0], vec[0] ); /*Q25+2*scale*/ FOR( i = 1; i < L_SUBFR; i++ ) - L_tmp = L_mac_o( L_tmp, vec[i], vec[i], &Overflow ); /*Q25+2*scale*/ - - alp = round_fx( L_shr( L_tmp, 3 ) ); /*Q6+2*scale*/ + L_tmp = L_mac_sat( L_tmp, vec[i], vec[i] ); /*Q25+2*scale*/ + alp = round_fx( L_shr( L_tmp, 3 ) ); /*Q6+2*scale*/ /*alp *= 0.5F; */ } @@ -1330,7 +1391,7 @@ void E_ACELP_4tsearch_fx( Word16 dn[] /*Qdn*/, const Word16 cn[] /*Q_xn*/, const FOR( i = 0; i < L_SUBFR; i++ ) { tmp = add( *p0++, *p1++ ); - vec[i] = add_o( vec[i], tmp, &Overflow ); /* can saturate here. */ + vec[i] = add_sat( vec[i], tmp ); /* can saturate here. */ move16(); } } @@ -1361,7 +1422,6 @@ void E_ACELP_4tsearch_fx( Word16 dn[] /*Qdn*/, const Word16 cn[] /*Q_xn*/, const } assert( check ); /* debug code not instrumented */ - /* * Build the codeword, the filtered codeword and index of codevector, as well as store weighted correlations. */ @@ -1380,339 +1440,13 @@ void E_ACELP_4tsearch_fx( Word16 dn[] /*Qdn*/, const Word16 cn[] /*Q_xn*/, const } FOR( i = 0; i < L_SUBFR; i++ ) { - y[i] = add_o( y[i], *p0++, &Overflow ); /*Q12+scale*/ + y[i] = add_sat( y[i], *p0++ ); /*Q12+scale*/ move16(); } } return; } -#ifdef FIX_ISSUE_1165 -void E_ACELP_4tsearch_ivas_fx( Word16 dn[] /*Qdn*/, const Word16 cn[] /*Q_xn*/, const Word16 H[] /*Q12*/, Word16 code[] /*Q9*/, const PulseConfig *config, Word16 ind[] /*Q0*/, Word16 y[] /*Qy*/ ) -{ - Word16 sign[L_SUBFR], vec[L_SUBFR]; - Word16 cor_x[16], cor_y[16], h_buf[4 * L_SUBFR]; - Word16 rrixix[4][16]; - Word16 rrixiy[4][256]; - Word16 dn2[L_SUBFR]; - Word16 psk, ps, alpk, alp = 0; - Word16 codvec[NB_PULSE_MAX]; - Word16 pos_max[4]; - Word16 dn2_pos[8 * 4]; - UWord8 ipos[NB_PULSE_MAX]; - Word16 *p0, *p1, *p2, *p3; - Word16 *h, *h_inv; - Word16 i, j, k, l, st, pos; - Word16 val, tmp, scale; - Word32 s, L_tmp; - Word16 nb_pulse, nb_pulse_m2; - Word16 check = 0; /* debug code not instrumented */ -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - - alp = config->alp; /* Q13 */ /* initial value for energy of all fixed pulses */ - move16(); - nb_pulse = config->nb_pulse; - move16(); - nb_pulse_m2 = sub( nb_pulse, 2 ); - - set16_fx( codvec, 0, nb_pulse ); - - /* - * Find sign for each pulse position. - */ - - E_ACELP_pulsesign( cn, dn, dn2, sign, vec, alp, 0x7fff, L_SUBFR ); - - /* - * Select the most important 8 position per track according to dn2[]. - */ - E_ACELP_findcandidates( dn2, dn2_pos, pos_max ); - - /* - * Compute h_inv[i]. - */ - set16_fx( h_buf, 0, L_SUBFR ); - - set16_fx( h_buf + ( 2 * L_SUBFR ), 0, L_SUBFR ); - - h = h_buf + L_SUBFR; - h_inv = h_buf + ( 3 * L_SUBFR ); - - /*Check the energy if it is too high then scale to prevent an overflow*/ - scale = 0; - move16(); - L_tmp = L_deposit_l( 0 ); - BASOP_SATURATE_WARNING_OFF_EVS - FOR( i = 0; i < L_SUBFR; i++ ) - { - L_tmp = L_mac_o( L_tmp, H[i], H[i], &Overflow ); /*Q25*/ - } - val = extract_h( L_tmp ); /*Q9*/ - BASOP_SATURATE_WARNING_ON_EVS - - if ( GT_16( val, 0x2000 ) ) - { - scale = -1; - move16(); - } - if ( GT_16( val, 0x7000 ) ) - { - scale = -2; - move16(); - } - if ( EQ_16( val, 32767 ) ) - { - scale = -3; - move16(); - } - - Copy_Scale_sig( H, h, L_SUBFR, scale ); /*Q12+scale*/ - - E_ACELP_vec_neg_fx( h, h_inv, L_SUBFR ); - - - /* - * Compute correlation matrices needed for the codebook search. - */ - E_ACELP_corrmatrix_fx( h, sign, vec, rrixix, rrixiy ); - - - /* - * Deep first search: - * ------------------ - * 20 bits (4p): 4 iter x ((4x16)+(8x16)) = 768 tests - * 36 bits (8p): 4 iter x ((1x1)+(4x16)+(8x16)+(8x16)) = 1280 tests - * 52 bits (12p): 3 iter x ((1x1)+(1x1)+(4x16)+(6x16) - * +(8x16)+(8x16)) = 1248 tests - * 64 bits (16p): 2 iter x ((1x1)+(1x1)+(4x16)+(6x16) - * +(6x16)+(8x16)+(8x16)+(8x16)) = 1280 tests - */ - psk = -1; - move16(); - alpk = 1; - move16(); - - /*Number of iterations*/ - FOR( k = 0; k < config->nbiter; k++ ) - { - E_ACELP_setup_pulse_search_pos( config, k, ipos ); - - /* format of alp changes to Q(15-ALP2_E) */ - - pos = config->fixedpulses; - move16(); - - IF( config->fixedpulses == 0 ) /* 1100, 11, 1110, 1111, 2211 */ - { - ps = 0; - move16(); - alp = 0; - move16(); - set16_fx( vec, 0, L_SUBFR ); - } - ELSE IF( EQ_16( config->fixedpulses, 2 ) ) /* 2222 and 3322 */ - { - /* first stage: fix 2 pulses */ - ind[0] = pos_max[ipos[0]]; - move16(); - ind[1] = pos_max[ipos[1]]; - move16(); - ps = add( dn[ind[0]], dn[ind[1]] ); - - /*alp = rrixix[ipos[0]][ind[0] >> 2] + rrixix[ipos[1]][ind[1] >> 2] + - rrixiy[ipos[0]][((ind[0] >> 2) << 4) + (ind[1] >> 2)];*/ - - i = shr( ind[0], 2 ); - j = shr( ind[1], 2 ); - l = add( shl( i, 4 ), j ); - s = L_mult( rrixix[ipos[0]][i], _1_ ); /* Q9+Q12+1 */ - s = L_mac( s, rrixix[ipos[1]][j], _1_ ); /* Q9+Q12+1 */ - alp = mac_r( s, rrixiy[ipos[0]][l], _1_ ); /* Q9+Q12+1-16 */ - - p0 = h - ind[0]; /*Q12+scale*/ - IF( sign[ind[0]] < 0 ) - { - p0 = h_inv - ind[0]; /*Q12+scale*/ - } - - p1 = h - ind[1]; /*Q12+scale*/ - IF( sign[ind[1]] < 0 ) - { - p1 = h_inv - ind[1]; /*Q12+scale*/ - } - - FOR( i = 0; i < L_SUBFR; i++ ) - { - vec[i] = add( *p0++, *p1++ ); /*Q12+scale*/ - move16(); - } - } - ELSE /* 3333 and above */ - { - /* first stage: fix 4 pulses */ - - ind[0] = pos_max[ipos[0]]; /*Q0*/ - move16(); - ind[1] = pos_max[ipos[1]]; /*Q0*/ - move16(); - ind[2] = pos_max[ipos[2]]; /*Q0*/ - move16(); - ind[3] = pos_max[ipos[3]]; /*Q0*/ - move16(); - - /*ps = dn[ind[0]] + dn[ind[1]] + dn[ind[2]] + dn[ind[3]];*/ - ps = add( add( add( dn[ind[0]], dn[ind[1]] ), dn[ind[2]] ), dn[ind[3]] ); - - p0 = h - ind[0]; /*Q12+scale*/ - IF( sign[ind[0]] < 0 ) - { - p0 = h_inv - ind[0]; /*Q12+scale*/ - } - - p1 = h - ind[1]; /*Q12+scale*/ - IF( sign[ind[1]] < 0 ) - { - p1 = h_inv - ind[1]; /*Q12+scale*/ - } - - p2 = h - ind[2]; /*Q12+scale*/ - IF( sign[ind[2]] < 0 ) - { - p2 = h_inv - ind[2]; /*Q12+scale*/ - } - - p3 = h - ind[3]; /*Q12+scale*/ - IF( sign[ind[3]] < 0 ) - { - p3 = h_inv - ind[3]; /*Q12+scale*/ - } - - FOR( i = 0; i < L_SUBFR; i++ ) - { - vec[i] = add( add( add( *p0++, *p1++ ), *p2++ ), *p3++ ); /*Q12+scale*/ - move16(); - } - - L_tmp = L_mult( vec[0], vec[0] ); /*Q25+2*scale*/ - FOR( i = 1; i < L_SUBFR; i++ ) - L_tmp = L_mac_o( L_tmp, vec[i], vec[i], &Overflow ); /*Q25+2*scale*/ - - alp = round_fx( L_shr( L_tmp, 3 ) ); /*Q6+2*scale*/ - - /*alp *= 0.5F; */ - } - - /* other stages of 2 pulses */ - st = 0; - move16(); - FOR( j = pos; j < nb_pulse; j += 2 ) - { - IF( GE_16( nb_pulse_m2, j ) ) /* pair-wise search */ - { - /* - * Calculate correlation of all possible positions - * of the next 2 pulses with previous fixed pulses. - * Each pulse can have 16 possible positions. - */ - E_ACELP_h_vec_corr1_fx( h, vec, ipos[j], sign, rrixix, cor_x, dn2_pos, config->nbpos[st] ); - - E_ACELP_h_vec_corr2_fx( h, vec, ipos[j + 1], sign, rrixix, cor_y ); - - /* - * Find best positions of 2 pulses. - */ - E_ACELP_2pulse_search( config->nbpos[st], ipos[j], ipos[j + 1], &ps, &alp, - &ind[j], &ind[j + 1], dn, dn2_pos, cor_x, cor_y, rrixiy ); - } - ELSE /* single pulse search */ - { - E_ACELP_h_vec_corr2_fx( h, vec, ipos[j], sign, rrixix, cor_x ); - - E_ACELP_h_vec_corr2_fx( h, vec, ipos[j + 1], sign, rrixix, cor_y ); - - E_ACELP_1pulse_search( &ipos[j], &ps, &alp, - &ind[j], dn, cor_x, cor_y ); - } - - IF( GT_16( nb_pulse_m2, j ) ) - { - p0 = h - ind[j]; /*Q12+scale*/ - IF( sign[ind[j]] < 0 ) - { - p0 = h_inv - ind[j]; /*Q12+scale*/ - } - - p1 = h - ind[j + 1]; /*Q12+scale*/ - IF( sign[ind[j + 1]] < 0 ) - { - p1 = h_inv - ind[j + 1]; /*Q12+scale*/ - } - - - FOR( i = 0; i < L_SUBFR; i++ ) - { - tmp = add( *p0++, *p1++ ); - vec[i] = add_o( vec[i], tmp, &Overflow ); /* can saturate here. */ - move16(); - } - } - st = add( st, 1 ); - } - - /* memorise the best codevector */ - - /*ps = ps * ps; MULT(1);*/ - ps = mult( ps, ps ); - /*s = (alpk * ps) - (psk * alp); MULT(2);ADD(1);*/ - s = L_msu( L_mult( alpk, ps ), psk, alp ); /*Q9+Q6+1=Q16*/ - - if ( psk < 0 ) - { - s = 1; - move32(); - } - IF( s > 0 ) - { - psk = ps; - move16(); - alpk = alp; - move16(); - Copy( ind, codvec, nb_pulse ); /*Q0*/ - check = 1; /* debug code not instrumented */ - } - } - - assert( check ); /* debug code not instrumented */ - - /* - * Build the codeword, the filtered codeword and index of codevector, as well as store weighted correlations. - */ - - E_ACELP_build_code( nb_pulse, codvec, sign, code, ind ); - - set16_fx( y, 0, L_SUBFR ); - FOR( k = 0; k < nb_pulse; ++k ) - { - i = codvec[k]; /*Q0*/ - move16(); - p0 = h_inv - i; /*Q12+scale*/ - IF( sign[i] > 0 ) - { - p0 -= 2 * L_SUBFR; - } - FOR( i = 0; i < L_SUBFR; i++ ) - { - y[i] = add_o( y[i], *p0++, &Overflow ); /*Q12+scale*/ - move16(); - } - } - return; -} -#endif /* * E_ACELP_4t_fx @@ -1748,70 +1482,8 @@ void E_ACELP_4tsearch_ivas_fx( Word16 dn[] /*Qdn*/, const Word16 cn[] /*Q_xn*/, * Returns: * void */ -void E_ACELP_4t_fx( - Word16 dn[], /*Qdn*/ - Word16 cn[] /* Q_xn */, - Word16 H[], /*Q12*/ - Word16 R[], /*Qx*/ - Word8 acelpautoc, /*Q0*/ - Word16 code[], /*Q9*/ - Word16 cdk_index, /*Q0*/ - Word16 _index[], /*Q0*/ - const Word16 L_frame, /*Q0*/ - const Word16 last_L_frame, /*Q0*/ - const Word32 total_brate, /*Q0*/ - const Word16 i_subfr, /*Q0*/ - const Word16 cmpl_flag /*Q0*/ ) -{ - PulseConfig config; - Word16 ind[NPMAXPT * 4]; - Word16 y[L_SUBFR]; - - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - memcpy( &config, &PulseConfTable[cdk_index], sizeof( PulseConfTable[cdk_index] ) ); - - if ( cmpl_flag > 0 ) - { - config.nbiter = cmpl_flag; - move16(); - } - test(); - test(); - IF( NE_16( L_frame, last_L_frame ) && EQ_32( total_brate, ACELP_24k40 ) && LT_32( i_subfr, 5 * L_SUBFR ) ) - { - config.nbiter = sub( config.nbiter, 1 ); - config.nbiter = s_max( config.nbiter, 1 ); - } - - IF( acelpautoc ) - { - E_ACELP_4tsearchx_fx( dn, cn, R, code, &config, ind ); - } - ELSE - { - E_ACELP_4tsearch_fx( dn, cn, H, code, &config, ind, y ); - } - E_ACELP_indexing_fx( code, &config, NB_TRACK_FCB_4T, _index ); - return; -} - -void E_ACELP_4t_ivas_fx( +void E_ACELP_4t_fx( Word16 dn[], /*Qdn*/ Word16 cn[] /* Q_xn */, Word16 H[], /*Q12*/ @@ -1825,7 +1497,8 @@ void E_ACELP_4t_ivas_fx( const Word32 total_brate, /*Q0*/ const Word16 i_subfr, /*Q0*/ const Word16 cmpl_flag, /*Q0*/ - Word16 element_mode /*Q0*/ ) + const Word16 element_mode /*Q0*/ +) { PulseConfig config; Word16 ind[NPMAXPT * 4]; @@ -1849,7 +1522,6 @@ void E_ACELP_4t_ivas_fx( move16(); memcpy( &config, &PulseConfTable[cdk_index], sizeof( PulseConfTable[cdk_index] ) ); - if ( cmpl_flag > 0 ) { config.nbiter = cmpl_flag; @@ -1865,20 +1537,18 @@ void E_ACELP_4t_ivas_fx( IF( acelpautoc ) { - E_ACELP_4tsearchx_ivas_fx( dn, cn, R, code, &config, ind, element_mode ); + E_ACELP_4tsearchx_fx( dn, cn, R, code, &config, ind, element_mode ); } ELSE { -#ifdef FIX_ISSUE_1165 - E_ACELP_4tsearch_ivas_fx( dn, cn, H, code, &config, ind, y ); -#else - E_ACELP_4tsearch_fx( dn, cn, H, code, &config, ind, y ); -#endif + E_ACELP_4tsearch_fx( dn, cn, H, code, &config, ind, y, element_mode ); } E_ACELP_indexing_fx( code, &config, NB_TRACK_FCB_4T, _index ); + return; } + static void E_ACELP_indexing_shift( Word16 wordcnt, /* i: 16-bit word count including the newly shifted-in bits Q0*/ Word16 shift_bits, /* i: number of bits to shift in from the lsb Q0*/ @@ -1900,9 +1570,11 @@ static void E_ACELP_indexing_shift( } dst[i] = s_or( lshl( src[i], shift_bits ), lsb_bits ); /*Q(shift_bits)*/ move16(); + return; } + #define MAX_IDX_LEN 9 Word16 E_ACELP_indexing_fx( @@ -2027,11 +1699,13 @@ Word16 E_ACELP_indexing_fx( return saved_bits; } + /*--------------------------------------------------------------------------* * E_ACELP_adaptive_codebook * * Find adaptive codebook. *--------------------------------------------------------------------------*/ + void E_ACELP_adaptive_codebook( Word16 *exc, /* i/o: pointer to the excitation frame Q_new */ Word16 T0, /* i : integer pitch lag Q0 */ @@ -2049,13 +1723,10 @@ void E_ACELP_adaptive_codebook( ACELP_CbkCorr *g_corr, /* o : ACELP correlation values */ Word16 **pt_indice, /* i/o: quantization indices pointer */ Word16 *pitch_gain, /* o : adaptive codebook gain 1Q14 */ - Word16 exp_xn /* i : exponent of xn (Q_xn-15) */ - , + Word16 exp_xn, /* i : exponent of xn (Q_xn-15) */ Word16 rf_mode, Word16 rf_coder_type, - Word16 *lp_select - -) + Word16 *lp_select ) { Word16 y2[L_SUBFR], xn2[L_SUBFR], code[L_SUBFR]; ACELP_CbkCorr g_corr2; @@ -2138,6 +1809,7 @@ void E_ACELP_adaptive_codebook( * - find filtered pitch exc. y2[]=exc[] convolved with h1[]) * * - compute pitch gain2 * *-----------------------------------------------------------------*/ + test(); IF( EQ_16( mode, NORMAL_OPERATION ) || EQ_16( mode, LOW_PASS ) ) { @@ -2177,6 +1849,7 @@ void E_ACELP_adaptive_codebook( /*-----------------------------------------------------------------* * use the best prediction (minimise quadratic error). * *-----------------------------------------------------------------*/ + test(); IF( EQ_16( mode, LOW_PASS ) || LT_32( L_tmp, L_ener ) ) { @@ -2230,6 +1903,7 @@ void E_ACELP_adaptive_codebook( * * Find innovative codebook. *--------------------------------------------------------------------------*/ + void E_ACELP_innovative_codebook_fx( Word16 *exc, /* i : pointer to the excitation frame Q_new */ Word16 T0, /* i : integer pitch lag Q0 */ @@ -2258,7 +1932,6 @@ void E_ACELP_innovative_codebook_fx( Word16 Rw2[L_SUBFR]; Word16 pitch, idx; - pitch = T0; move16(); idx = shr( i_subfr, 6 ); @@ -2301,8 +1974,7 @@ void E_ACELP_innovative_codebook_fx( /* Innovative codebook search */ assert( acelp_cfg->fixed_cdk_index[idx] < ACELP_FIXED_CDK_NB ); - E_ACELP_4t_fx( dn, cn2, h2, Rw2, acelpautoc, code, acelp_cfg->fixed_cdk_index[idx], *pt_indice, L_frame, last_L_frame, total_brate, i_subfr, 0 ); - + E_ACELP_4t_fx( dn, cn2, h2, Rw2, acelpautoc, code, acelp_cfg->fixed_cdk_index[idx], *pt_indice, L_frame, last_L_frame, total_brate, i_subfr, 0, 0 ); *pt_indice += 8; /* Generate weighted code */ @@ -2329,17 +2001,16 @@ void E_ACELP_innovative_codebook_fx( * n - (output) range of possible states (0...n-1) * p - (output) number of pulses found *--------------------------------------------------------------------------*/ -static void E_ACELP_codearithp_fx( const Word16 v[] /*Q9*/, UWord32 *n /*Q0*/, UWord32 *ps /*Q0*/, Word16 *p /*Q0*/ ) + +static void E_ACELP_codearithp_fx( + const Word16 v[] /*Q9*/, + UWord32 *n /*Q0*/, + UWord32 *ps /*Q0*/, + Word16 *p /*Q0*/ ) { Word16 k, nb_pulse, i, t, pos[NPMAXPT], posno; Word16 sign, m; - UWord32 s; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; - move32(); - move32(); -#endif + UWord64 W_s; /* Collect different pulse positions to pos[], number of them to posno */ posno = 0; @@ -2362,7 +2033,7 @@ static void E_ACELP_codearithp_fx( const Word16 v[] /*Q9*/, UWord32 *n /*Q0*/, U } /* Iterate over the different pulse positions */ - s = L_deposit_l( 0 ); + W_s = 0; t = 0; move16(); nb_pulse = 0; @@ -2375,9 +2046,7 @@ static void E_ACELP_codearithp_fx( const Word16 v[] /*Q9*/, UWord32 *n /*Q0*/, U /* Code m-1 pulses */ FOR( i = 1; i < m; ++i ) { - Carry = 0; - move32(); - s = L_add_co( s, pulsestostates[pos[k]][t], &Carry, &Overflow ); + W_s = W_add( W_s, pulsestostates[pos[k]][t] ); t = add( t, 1 ); if ( sub( t, NPMAXPT ) > 0 ) { @@ -2388,22 +2057,18 @@ static void E_ACELP_codearithp_fx( const Word16 v[] /*Q9*/, UWord32 *n /*Q0*/, U /* Code sign */ /* We use L_add_c since we want to work with unsigned UWord32 */ /* Therefore, we have to clear carry */ - Carry = 0; - move32(); - s = L_lshl( s, 1 ); + W_s = W_lshl( W_s, 1 ); if ( sign < 0 ) { - s = L_add_co( s, 1, &Carry, &Overflow ); + W_s = W_add( W_s, 1 ); } /* Code last pulse */ - Carry = 0; - move32(); - s = L_add_co( s, pulsestostates[pos[k]][t], &Carry, &Overflow ); + W_s = W_add( W_s, pulsestostates[pos[k]][t] ); t = add( t, 1 ); } - *ps = s; /*Q0*/ + *ps = (UWord32) W_s; /*Q0*/ move32(); *n = L_deposit_l( 0 ); if ( nb_pulse ) @@ -2414,10 +2079,17 @@ static void E_ACELP_codearithp_fx( const Word16 v[] /*Q9*/, UWord32 *n /*Q0*/, U *p = nb_pulse; /*Q0*/ move16(); + return; } -void fcb_pulse_track_joint_fx( UWord16 *idxs /*Q0*/, Word16 wordcnt /*Q0*/, UWord32 *index_n /*Q0*/, Word16 *pulse_num /*Q0*/, Word16 track_num /*Q0*/ ) + +void fcb_pulse_track_joint_fx( + UWord16 *idxs /*Q0*/, + Word16 wordcnt /*Q0*/, + UWord32 *index_n /*Q0*/, + Word16 *pulse_num /*Q0*/, + Word16 track_num /*Q0*/ ) { Word16 hi_to_low[10]; UWord32 index, index_mask; @@ -2532,5 +2204,6 @@ void fcb_pulse_track_joint_fx( UWord16 *idxs /*Q0*/, Word16 wordcnt /*Q0*/, UWor idxs[track] = extract_l( index ); index = L_lshr( index, 16 ); } + return; } diff --git a/lib_enc/enc_acelp_tcx_main_fx.c b/lib_enc/enc_acelp_tcx_main_fx.c index 3498321646e22d98a77ebd738db6e55f43fdee03..da8443f06c0045c58772ae2284c051a81a7e5126 100644 --- a/lib_enc/enc_acelp_tcx_main_fx.c +++ b/lib_enc/enc_acelp_tcx_main_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_enc/enc_acelpx_fx.c b/lib_enc/enc_acelpx_fx.c index f18da2ef27024789870875f55f2b3f04c1b01b1c..95104c76ca247bbd3f99052eae64f5cee21b4971 100644 --- a/lib_enc/enc_acelpx_fx.c +++ b/lib_enc/enc_acelpx_fx.c @@ -1,24 +1,27 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" -//#include "prot_fx.h" #include "basop_util.h" #include "options.h" #include "rom_enc.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*--------------------------------------------------------------------------------------* * Local constant *--------------------------------------------------------------------------------------*/ #define _1_Q11 ( 2048 /*1.0f Q11*/ ) /* 1.0f in 4Q11 */ + + /*--------------------------------------------------------------------------------------* * E_ACELP_update_cor *--------------------------------------------------------------------------------------*/ + static void E_ACELP_update_cor_fx( const Word16 pos[], /* i Q0*/ Word16 nb_pulse, /* i Q0*/ @@ -111,11 +114,16 @@ static void E_ACELP_update_cor_fx( { assert( !"Number of pulses not supported" ); } + + return; } + + /*--------------------------------------------------------------------------------------* * E_ACELP_2pulse_searchx * Iterations: nb_pos_ix*16 *--------------------------------------------------------------------------------------*/ + static void E_ACELP_2pulse_searchx_fx( const Word16 nb_pos_ix, /*Q0*/ const Word16 track_x, /*Q0*/ @@ -139,10 +147,6 @@ static void E_ACELP_2pulse_searchx_fx( Word32 alp0, alp1, alp2, s; Word16 *pR, sgnx; Word16 sqk[2], alpk[2], ik; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* eight dn2 max positions per track */ pos_x = &dn2[( track_x * 8 )]; /*Qdn*/ @@ -167,8 +171,7 @@ static void E_ACELP_2pulse_searchx_fx( { sgnx = negate( sgnx ); } - if ( mac_ro( L_mac_o( L_mac_o( alp0, cor[x], sign[x], &Overflow ), cor[track_y], sign[track_y], &Overflow ), R[track_y - x], sgnx, &Overflow ) < 0 ) - + if ( mac_r_sat( L_mac_sat( L_mac_sat( alp0, cor[x], sign[x] ), cor[track_y], sign[track_y] ), R[track_y - x], sgnx ) < 0 ) { sqk[0] = 1; move16(); @@ -187,10 +190,10 @@ static void E_ACELP_2pulse_searchx_fx( move16(); /* dn[x] has only nb_pos_ix positions saved */ /*ps1 = ps0 + dn[x]; INDIRECT(1);ADD(1);*/ - ps1 = add_sat( ps0, dn[x] ); /*Qdn*/ - /*alp1 = alp0 + 2*sgnx*cor[x]; INDIRECT(1);MULT(1); MAC(1);*/ - alp1 = L_mac_o( alp0, cor[x], sgnx, &Overflow ); /* Qalp = (Q_R=Q_cor)*Q_signval */ - pR = R - x; /*Q9+scale*/ + ps1 = add_sat( ps0, dn[x] ); /*Qdn*/ + /*alp1 = alp0 + 2*sgnx*cor[x]; INDIRECT(1);MULT(1); MAC(1);*/ + alp1 = L_mac_sat( alp0, cor[x], sgnx ); /* Qalp = (Q_R=Q_cor)*Q_signval */ + pR = R - x; /*Q9+scale*/ FOR( y = track_y; y < L_SUBFR; y += 4 ) { @@ -204,14 +207,14 @@ static void E_ACELP_2pulse_searchx_fx( assert( sgnx != 0 ); alp2_16 = 0; - alp2 = L_mac_o( alp1, cor[y], sign[y], &Overflow ); /* Qalp = (Q_R=Q_cor)*Q_signval */ + alp2 = L_mac_sat( alp1, cor[y], sign[y] ); /* Qalp = (Q_R=Q_cor)*Q_signval */ if ( sgnx > 0 ) { - alp2_16 = mac_ro( alp2, pR[y], sign[y], &Overflow ); /* Qalp = (Q_R=Q_cor)*Q_signval */ + alp2_16 = mac_r_sat( alp2, pR[y], sign[y] ); /* Qalp = (Q_R=Q_cor)*Q_signval */ } if ( sgnx < 0 ) { - alp2_16 = msu_ro( alp2, pR[y], sign[y], &Overflow ); /* Qalp = (Q_R=Q_cor)*Q_signval */ + alp2_16 = msu_r_sat( alp2, pR[y], sign[y] ); /* Qalp = (Q_R=Q_cor)*Q_signval */ } alpk[1 - ik] = alp2_16; /* Qalp */ move16(); @@ -221,9 +224,8 @@ static void E_ACELP_2pulse_searchx_fx( sqk[1 - ik] = sq; /* Q9 */ move16(); - /*s = (alpk * sq) - (sqk * alp2); MULT(1);MAC(1);*/ - s = L_msu_o( L_mult( alpk[ik], sq ), sqk[ik], alp2_16, &Overflow ); /* Q_sq = Q_sqk, Q_alpk = Q_alp */ + s = L_msu_sat( L_mult( alpk[ik], sq ), sqk[ik], alp2_16 ); /* Q_sq = Q_sqk, Q_alpk = Q_alp */ if ( s > 0 ) { ik = sub( 1, ik ); @@ -256,11 +258,15 @@ static void E_ACELP_2pulse_searchx_fx( move16(); assert( ( ( pos[0] & 3 ) == track_x ) && ( ( pos[1] & 3 ) == track_y ) ); /* sanity check */ + + return; } + /*--------------------------------------------------------------------------------------* * E_ACELP_1pulse_searchx *--------------------------------------------------------------------------------------*/ + static void E_ACELP_1pulse_searchx_fx( UWord8 tracks[2], /*Q0*/ Word16 *R, /*Q9+scale*/ @@ -281,10 +287,7 @@ static void E_ACELP_1pulse_searchx_fx( Word16 ntracks, t; Word16 sqk[2], alpk[2], ik; move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + /* save these to limit memory searches */ /*alp0 = *alp + R[0]; INDIRECT(1);*/ ps0 = *ps; /* Qdn */ @@ -299,7 +302,7 @@ static void E_ACELP_1pulse_searchx_fx( sqk[0] = -1; ik = 0; move16(); - if ( mac_ro( alp0, cor[tracks[0]], sign[tracks[0]], &Overflow ) < 0 ) + if ( mac_r_sat( alp0, cor[tracks[0]], sign[tracks[0]] ) < 0 ) { sqk[0] = 1; move16(); @@ -323,18 +326,17 @@ static void E_ACELP_1pulse_searchx_fx( ps1 = add( ps0, dn[x] ); /* alp1 = alp0 + 2*sign[x]*cor[x]; MAC(1); MULT(1);*/ assert( sign[x] == sign_val_1 << 1 || sign[x] == -( sign_val_1 << 1 ) ); - alp1 = mac_ro( alp0, cor[x], sign[x], &Overflow ); /* Qalp = (Q_R=Q_cor)*Q_signval */ - alpk[1 - ik] = alp1; /* Qalp */ + alp1 = mac_r_sat( alp0, cor[x], sign[x] ); /* Qalp = (Q_R=Q_cor)*Q_signval */ + alpk[1 - ik] = alp1; /* Qalp */ move16(); - /*sq = ps1 * ps1; MULT(1);*/ sq = mult_r( ps1, ps1 ); /* 6Q9 */ sqk[1 - ik] = sq; /* Q9 */ move16(); /*s = (alpk[ik] * sq) - (sqk[ik] * alp1); MULT(1);MAC(1);*/ - s = L_msu_o( L_mult_o( alpk[ik], sq, &Overflow ), sqk[ik], alp1, &Overflow ); /* Q9+Qalp+1 */ + s = L_msu_sat( L_mult_sat( alpk[ik], sq ), sqk[ik], alp1 ); /* Q9+Qalp+1 */ if ( s > 0 ) { ik = sub( 1, ik ); @@ -354,20 +356,25 @@ static void E_ACELP_1pulse_searchx_fx( move16(); *ix = x_save; /* Q0 */ move16(); + + return; } + /*--------------------------------------------------------------------------------------* * E_ACELP_4tsearchx_fx * Autocorrelation method for searching pulse positions effectively * Algorithm is identical to traditional covariance method *--------------------------------------------------------------------------------------*/ + void E_ACELP_4tsearchx_fx( Word16 dn[], /*Qdn*/ const Word16 cn[], /*Q_new*/ Word16 Rw[], /*Q9*/ Word16 code[], /*Q9*/ const PulseConfig *config, - Word16 ind[] /*Q0*/ ) + Word16 ind[], /*Q0*/ + const Word16 element_mode ) { Word16 sign[L_SUBFR], vec[L_SUBFR]; Word16 cor[L_SUBFR]; @@ -383,13 +390,15 @@ void E_ACELP_4tsearchx_fx( Word16 scale; Word16 sign_val_1, sign_val_2; Word16 nb_pulse, nb_pulse_m2; + Word16 psk = 0; + Word16 val, index, track; + move16(); move16(); move16(); ps = 0; /* to avoid compilation warnings */ move16(); - alp = config->alp; /* Q13 */ move16(); nb_pulse = config->nb_pulse; @@ -398,241 +407,28 @@ void E_ACELP_4tsearchx_fx( nb_pulse_m2 = sub( nb_pulse, 2 ); /* Init to avoid crash when the search does not find a solution */ - FOR( k = 0; k < nb_pulse; k++ ) - { - codvec[k] = k; - move16(); - } - - scale = 0; - move16(); - s = L_mult0( Rw[0], Rw[0] ); /*Q18*/ - FOR( i = 1; i < L_SUBFR; i++ ) - { - s = L_mac0( s, Rw[i], Rw[i] ); /*Q18*/ - } - if ( s_and( (Word16) GE_16( nb_pulse, 9 ), (Word16) GT_32( s, 0x800000 ) ) ) - { - scale = -1; - move16(); - } - if ( s_and( (Word16) GE_16( nb_pulse, 13 ), (Word16) GT_32( s, 0x4000000 ) ) ) - { - scale = -2; - move16(); - } - IF( GE_16( nb_pulse, 18 ) ) + IF( EQ_16( element_mode, EVS_MONO ) ) { - if ( GT_32( s, 0x200000 ) ) + FOR( k = 0; k < nb_pulse; k++ ) { - scale = -1; - move16(); - } - if ( GT_32( s, 0x400000 ) ) - { - scale = -2; + codvec[k] = k; move16(); } - if ( GT_32( s, 0x4000000 ) ) - { - scale = -3; - move16(); - } - } - if ( s_and( (Word16) GE_16( nb_pulse, 28 ), (Word16) GT_32( s, 0x800000 ) ) ) - { - scale = -3; - move16(); - } - if ( s_and( (Word16) GE_16( nb_pulse, 36 ), (Word16) GT_32( s, 0x4000000 ) ) ) - { - scale = -4; - move16(); - } - - /* Set up autocorrelation vector */ - R = R_buf + L_SUBFR - 1; - Copy_Scale_sig( Rw, R, L_SUBFR, scale ); /*Q9+scale*/ - FOR( k = 1; k < L_SUBFR; k++ ) - { - R[-k] = R[k]; - move16(); } - - /* Sign value */ - sign_val_2 = 0x2000; /* Q15 */ - move16(); - if ( GE_16( nb_pulse, 24 ) ) - { - sign_val_2 = shr( sign_val_2, 1 ); /* Q15 */ - } - sign_val_1 = shr( sign_val_2, 1 ); /* Q15 */ - - /* - * Find sign for each pulse position. - */ - E_ACELP_pulsesign( cn, dn, dn2, sign, vec, alp, sign_val_2, L_SUBFR ); - - /* - * Select the most important 8 position per track according to dn2[]. - */ - E_ACELP_findcandidates( dn2, dn2_pos, pos_max ); - - /* - * Deep first search: - */ - - /* Ensure that in the loop below s > 0 in the first iteration, the actual values do not matter. */ - ps2k = -1; - move16(); - alpk = 1; - move16(); - - /* Number of iterations */ - FOR( k = 0; k < config->nbiter; k++ ) + ELSE { - E_ACELP_setup_pulse_search_pos( config, k, ipos ); - - /* index to first non-fixed position */ - pos = config->fixedpulses; /* Q0 */ - move16(); - - IF( config->fixedpulses == 0 ) /* 1100, 11, 1110, 1111, 2211 */ + FOR( k = 0; k < nb_pulse; k++ ) { - ps = 0; - move16(); - alp = 0; + codvec[k] = s_and( k, 3 ); move16(); - set16_fx( cor, 0, L_SUBFR ); } - ELSE - { - assert( config->fixedpulses == 2 || config->fixedpulses == 4 ); - - /* set fixed positions */ - FOR( i = 0; i < pos; ++i ) - { - ind[i] = pos_max[ipos[i]]; /* Q0 */ - move16(); - } - - /* multiplication of autocorrelation with signed fixed pulses */ - E_ACELP_update_cor_fx( ind, config->fixedpulses, sign, R, NULL, cor ); - - /* normalisation contribution of fixed part */ - s = L_mult0( cor[ind[0]], sign[ind[0]] ); /* Q22 */ - ps = dn[ind[0]]; /* Qdn */ - move16(); - FOR( i = 1; i < pos; ++i ) - { - s = L_mac0( s, cor[ind[i]], sign[ind[i]] ); /*Q12+Q9+1=Q22 */ - ps = add( ps, dn[ind[i]] ); /* Qdn */ - } - alp = round_fx( s ); /*mac0 >>1 sign = 2 Q6*/ - } - - /* other stages of 2 pulses */ - st = 0; - move16(); - FOR( j = pos; j < nb_pulse; j += 2 ) - { - IF( GE_16( nb_pulse_m2, j ) ) /* pair-wise search */ - { - /* - * Calculate correlation of all possible positions - * of the next 2 pulses with previous fixed pulses. - * Each pulse can have 16 possible positions. - */ - - E_ACELP_2pulse_searchx_fx( config->nbpos[st], ipos[j], ipos[j + 1], R, &ps, &alp, - &ind[j], &ind[j + 1], dn, dn2_pos, cor, sign, sign_val_2 ); - } - ELSE /* single pulse search */ - { - E_ACELP_1pulse_searchx_fx( &ipos[j], R, &ps, &alp, - &ind[j], dn, cor, sign, sign_val_1 ); - } - - - st = add( st, 1 ); - } - - /* memorise the best codevector */ - /*ps2 = ps * ps; MULT(1);*/ - ps2 = mult( ps, ps ); /* 2*Qdn+1 */ - - /*s = (alpk * ps2) - (ps2k * alp); MULT(2);ADD(1);*/ - s = L_msu( L_mult( alpk, ps2 ), ps2k, alp ); /* 2*Qdn+8 */ - - IF( s > 0 ) - { - ps2k = ps2; - move16(); - alpk = alp; - move16(); - Copy( ind, codvec, nb_pulse ); /* Q0 */ - } - } - - - /* - * Store weighted energy of code, build the codeword and index of codevector. - */ - E_ACELP_build_code( nb_pulse, codvec, sign, code, ind ); -} - -void E_ACELP_4tsearchx_ivas_fx( - Word16 dn[], /*Qdn*/ - const Word16 cn[], /*Q_new*/ - Word16 Rw[], /*Q9*/ - Word16 code[], /*Q9*/ - const PulseConfig *config, - Word16 ind[], /*Q0*/ - Word16 element_mode ) -{ - Word16 sign[L_SUBFR], vec[L_SUBFR]; - Word16 cor[L_SUBFR]; - Word16 R_buf[2 * L_SUBFR - 1], *R; - Word16 dn2[L_SUBFR]; - Word16 ps2k, ps /* same format as dn[] */, ps2, alpk, alp = 0 /* Q13 and later Q_Rw*Q_signval=Q_cor*Q_signval */; - Word32 s; - Word16 codvec[NB_PULSE_MAX]; - Word16 pos_max[4]; - Word16 dn2_pos[8 * 4]; - UWord8 ipos[NB_PULSE_MAX]; - Word16 i, j, k, st, pos = 0; - Word16 scale; - Word16 sign_val_1, sign_val_2; - Word16 nb_pulse, nb_pulse_m2; - Word16 psk; - Word16 val, index, track; - move16(); - move16(); - - psk = ps = 0; /* to avoid compilation warnings */ - move16(); - move16(); - - - alp = config->alp; /* Q13 */ - move16(); - nb_pulse = config->nb_pulse; - move16(); - nb_pulse_m2 = sub( nb_pulse, 2 ); - - /* Init to avoid crash when the search does not find a solution */ - FOR( k = 0; k < nb_pulse; k++ ) - { - codvec[k] = k; - move16(); } - scale = 0; move16(); - s = L_mult0( Rw[0], Rw[0] ); /* Q18 */ + s = L_mult0( Rw[0], Rw[0] ); /*Q18*/ FOR( i = 1; i < L_SUBFR; i++ ) { - s = L_mac0( s, Rw[i], Rw[i] ); /* Q18 */ + s = L_mac0( s, Rw[i], Rw[i] ); /*Q18*/ } if ( s_and( (Word16) GE_16( nb_pulse, 9 ), (Word16) GT_32( s, 0x800000 ) ) ) { @@ -675,7 +471,7 @@ void E_ACELP_4tsearchx_ivas_fx( /* Set up autocorrelation vector */ R = R_buf + L_SUBFR - 1; - Copy_Scale_sig( Rw, R, L_SUBFR, scale ); /* Q9 + scale */ + Copy_Scale_sig( Rw, R, L_SUBFR, scale ); /*Q9+scale*/ FOR( k = 1; k < L_SUBFR; k++ ) { R[-k] = R[k]; @@ -749,7 +545,7 @@ void E_ACELP_4tsearchx_ivas_fx( FOR( i = 1; i < pos; ++i ) { s = L_mac0( s, cor[ind[i]], sign[ind[i]] ); /*Q12+Q9+1=Q22 */ - ps = add( ps, dn[ind[i]] ); + ps = add( ps, dn[ind[i]] ); /* Qdn */ } alp = round_fx( s ); /*mac0 >>1 sign = 2 Q6*/ } @@ -776,19 +572,14 @@ void E_ACELP_4tsearchx_ivas_fx( &ind[j], dn, cor, sign, sign_val_1 ); } - IF( GT_16( alp, ONE_IN_Q14 ) ) + test(); + IF( GT_16( alp, ONE_IN_Q14 ) && ( element_mode > EVS_MONO ) ) { alp = shr( alp, 1 ); Scale_sig( cor, L_SUBFR, -1 ); /*Q8*/ Scale_sig( R_buf, 2 * L_SUBFR - 1, -1 ); /*Q8+scale*/ -#ifndef MSAN_FIX - Scale_sig( dn, 2 * L_SUBFR, -1 ); -#else - Scale_sig( dn, L_SUBFR, -1 ); /*Qdn-1*/ -#endif + Scale_sig( dn, L_SUBFR, -1 ); /*Qdn-1*/ } - - st = add( st, 1 ); } @@ -807,11 +598,10 @@ void E_ACELP_4tsearchx_ivas_fx( move16(); alpk = alp; move16(); - Copy( ind, codvec, nb_pulse ); /*Q0*/ + Copy( ind, codvec, nb_pulse ); /* Q0 */ } } - /* * Store weighted energy of code, build the codeword and index of codevector. */ @@ -859,4 +649,6 @@ void E_ACELP_4tsearchx_ivas_fx( move16(); } } + + return; } diff --git a/lib_enc/enc_amr_wb_fx.c b/lib_enc/enc_amr_wb_fx.c index 08a20bbb9b8effbccc2227ae263e1c7a0d32ba4d..f68b94daf048b36d3bc6bced9833598f64a1c11a 100644 --- a/lib_enc/enc_amr_wb_fx.c +++ b/lib_enc/enc_amr_wb_fx.c @@ -1,21 +1,22 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ + /*-------------------------------------------------------------------* * encod_amr_wb() * * Encode excitation signal in AMR-WB IO mode *-------------------------------------------------------------------*/ + void encod_amr_wb_fx( Encoder_State *st, /* i/o: state structure */ const Word16 speech[], /* i : input speech Q_new-1*/ @@ -64,10 +65,6 @@ void encod_amr_wb_fx( AMRWB_IO_ENC_HANDLE hAmrwb_IO = st->hAmrwb_IO; BSTR_ENC_HANDLE hBstr = st->hBstr; LPD_state_HANDLE hLPDmem = st->hLPDmem; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*------------------------------------------------------------------* * Initializations @@ -129,6 +126,7 @@ void encod_amr_wb_fx( * target in residual domain "cn" * Compute impulse response, h1[], of weighted synthesis filter *----------------------------------------------------------------*/ + Copy( &res[i_subfr], &exc[i_subfr], L_SUBFR ); /*Q_new*/ find_targets_fx( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, @@ -146,7 +144,7 @@ void encod_amr_wb_fx( *----------------------------------------------------------------*/ *pt_pitch = pit_encode_fx( hBstr, st->acelp_cfg.pitch_bits, st->core_brate, 1, L_FRAME, -1, &pitch_limit_flag, i_subfr, exc, - L_SUBFR, T_op, &T0_min, &T0_max, &T0, &T0_frac, h1, xn, 0 /*hStereoTD->tdm_Pitch_reuse_flag*/, NULL /*hStereoTD->tdm_Pri_pitch_buf*/ ); + L_SUBFR, T_op, &T0_min, &T0_max, &T0, &T0_frac, h1, xn, 0 /*hStereoTD->tdm_Pitch_reuse_flag*/, NULL /*hStereoTD->tdm_Pri_pitch_buf*/, 0, Q_new ); /*-----------------------------------------------------------------* * Find adaptive exitation @@ -165,36 +163,38 @@ void encod_amr_wb_fx( * LP filtering of the adaptive excitation, codebook target computation *-----------------------------------------------------------------*/ - lp_select = lp_filt_exc_enc_fx( MODE1, -1, i_subfr, exc, h1, - xn, y1, xn2, L_SUBFR, L_FRAME, g_corr, clip_gain, &gain_pit, &lp_flag ); + lp_select = lp_filt_exc_enc_fx( MODE1, -1, i_subfr, exc, h1, xn, y1, xn2, L_SUBFR, L_FRAME, g_corr, clip_gain, &gain_pit, &lp_flag ); IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { - push_indice_fx( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); } /*-----------------------------------------------------------------* * Innovation encoding *-----------------------------------------------------------------*/ + inov_encode_fx( st, st->core_brate, 1, L_FRAME, st->last_L_frame, -1, -1, 0, i_subfr, -1, p_Aq, gain_pit, cn, exc, h2, hLPDmem->tilt_code, *pt_pitch, xn2, code, y2, &unbits, L_SUBFR, shift ); + /*-----------------------------------------------------------------* * Gain encoding * Pitch gain clipping test * Estimate spectrum tilt and voicing *-----------------------------------------------------------------*/ + gain_enc_amr_wb_fx( hBstr, xn, shift_wsp, y1, y2, code, st->core_brate, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain, hAmrwb_IO->past_qua_en_fx ); gp_clip_test_gain_pit_fx( st->element_mode, st->core_brate, gain_pit, st->clip_var_fx ); - Lgcode = L_shl_o( gain_code, Q_new, &Overflow ); /* scaled gain_code with Qnew -> Q16*/ - gcode16 = round_fx_o( Lgcode, &Overflow ); /*Q0*/ + Lgcode = L_shl_sat( gain_code, Q_new ); /* scaled gain_code with Qnew -> Q16*/ + gcode16 = round_fx_sat( Lgcode ); /*Q0*/ hLPDmem->tilt_code = Est_tilt2( exc + i_subfr, gain_pit, code, Lgcode, &voice_fac, shift ); /*Q15*/ FOR( i = 0; i < L_SUBFR; i++ ) { - exc2[i + i_subfr] = round_fx_o( L_shl_o( L_mult( gain_pit, exc[i + i_subfr] ), 1, &Overflow ), &Overflow ); /*Q_new*/ + exc2[i + i_subfr] = round_fx_sat( L_shl_sat( L_mult( gain_pit, exc[i + i_subfr] ), 1 ) ); /*Q_new*/ move16(); } @@ -211,16 +211,18 @@ void encod_amr_wb_fx( Ltmp = L_shl_sat( Ltmp, sub( 1, shift ) ); /* Q_new+15 */ hLPDmem->mem_w0 = round_fx_sat( Ltmp ); /*Q_new-1 */ move16(); + /*-----------------------------------------------------------------* * Find the total excitation *-----------------------------------------------------------------*/ + FOR( i = 0; i < L_SUBFR; i++ ) { L_tmp = L_mult( gcode16, code[i] ); /*Q10*/ L_tmp = L_shl_sat( L_tmp, 5 ); /*Q15*/ L_tmp = L_mac_sat( L_tmp, exc[i + i_subfr], gain_pit ); /* Q_new+15 */ - L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /* saturation can occur here Q_new+15*/ - exc[i + i_subfr] = round_fx_o( L_tmp, &Overflow ); /*Q_new*/ + L_tmp = L_shl_sat( L_tmp, 1 ); /* saturation can occur here Q_new+15*/ + exc[i + i_subfr] = round_fx_sat( L_tmp ); /*Q_new*/ move16(); } @@ -228,6 +230,7 @@ void encod_amr_wb_fx( * Synthesize speech to update mem_syn[] * Update A(z) filters *-----------------------------------------------------------------*/ + Syn_filt_s( 1, p_Aq, M, &exc[i_subfr], &syn[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1 ); /*-----------------------------------------------------------------* @@ -243,7 +246,7 @@ void encod_amr_wb_fx( hVAD->hangover_cnt, &hAmrwb_IO->gain_alpha_fx, &hf_gain_fx[i_subfr / L_SUBFR], add( Q_new, 1 ), st->Q_syn ); } - push_indice_fx( hBstr, IND_HF_GAIN_MODIFICATION, hf_gain_fx[i_subfr / L_SUBFR], 4 ); + push_indice( hBstr, IND_HF_GAIN_MODIFICATION, hf_gain_fx[i_subfr / L_SUBFR], 4 ); } p_Aw += ( M + 1 ); diff --git a/lib_enc/enc_gain_fx.c b/lib_enc/enc_gain_fx.c index 7c9606cfc24bcf592bfd1a0390ea625645414b50..8c53a5d12204779630e1f0bc893a2b76dd8311fd 100644 --- a/lib_enc/enc_gain_fx.c +++ b/lib_enc/enc_gain_fx.c @@ -1,20 +1,17 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include #include "options.h" #include "cnst.h" -//#include "prot_fx.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "rom_enc.h" #include "basop_util.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ -void E_GAIN_norm_corr_fx( Word16 exc[] /*Q_new*/, Word16 xn[] /*(Q_new+shift-1)*/, Word16 h[] /*(Q14+shift)*/, Word16 t_min, Word16 t_max, Word16 corr_norm[] /*(Q15+(Q_new+shift-1)+scale)*/, Word16 L_subfr ); /* * E_GAIN_norm_corr @@ -36,14 +33,21 @@ void E_GAIN_norm_corr_fx( Word16 exc[] /*Q_new*/, Word16 xn[] /*(Q_new+shift-1)* * Returns: * void */ -void E_GAIN_norm_corr_fx( Word16 exc[] /*Q_new*/, Word16 xn[] /*(Q_new+shift-1)*/, Word16 h[] /*(Q14+shift)*/, Word16 t_min, Word16 t_max, Word16 corr_norm[] /*(Q15+(Q_new+shift-1)+scale)*/, Word16 L_subfr ) + +static void E_GAIN_norm_corr_fx( + Word16 exc[] /*Q_new*/, + Word16 xn[] /*(Q_new+shift-1)*/, + Word16 h[] /*(Q14+shift)*/, + Word16 t_min, + Word16 t_max, + Word16 corr_norm[] /*(Q15+(Q_new+shift-1)+scale)*/, + Word16 L_subfr ) { Word16 excf[L_SUBFR]; /* filtered past excitation (Q_new+shift-1) */ Word16 ps, norm, exp_alp, exp_ps, scale, L_subfr2; Word16 t, j, k; Word32 L_tmp, L_tmp2; - k = negate( t_min ); L_subfr2 = shr( L_subfr, 1 ); diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index 06c49a8d3a3d9b7ed08f81da11f2030ac5da0127..bfe50a588edf8c5f1fe5f0313c815d22fc7b6f77 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -1,52 +1,82 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + +/*-------------------------------------------------------------------* + * rem_offset() + * + * + *-------------------------------------------------------------------*/ + +static void rem_offset( + const Word16 *in, + Word16 *out, + const Word16 l_subfr ) +{ + Word16 i; + Word16 tmp; + Word32 loffset = 0; + move32(); + + tmp = shl( 2, norm_s( l_subfr ) ); /* l_subfr is expected to be based 2 */ + FOR( i = 0; i < l_subfr; i++ ) + { + loffset = L_mac( loffset, in[i], tmp ); + } + tmp = round_fx_sat( loffset ); + FOR( i = 0; i < l_subfr; i++ ) + { + out[i] = sub( in[i], tmp ); + move16(); + } + + return; +} + + /*======================================================================*/ -/* FUNCTION : encod_gen_voic_fx() */ +/* FUNCTION : encod_gen_voic_fx() */ +/*----------------------------------------------------------------------*/ +/* PURPOSE : encode generic (GC), voiced (VC) and AMR-WB IO frames */ +/* */ /*----------------------------------------------------------------------*/ -/* PURPOSE : encode generic (GC), voiced (VC) and AMR-WB IO frames */ -/* */ +/* INPUT ARGUMENTS : */ +/* _ (Struct) st_fx : encoder static memory */ +/* _ (Word16) L_frame_fx : length of the frame Q0 */ +/* _ (Word16[]) speech_fx : input speech Q0 */ +/* _ (Word16[]) Aq_fx : LP filter coefficient Q12 */ +/* _ (Word16[]) A_fx : unquantized A(z) filter */ +/* with bandwidth expansion Q12 */ +/* _ (Word16) coder_type : coding type */ +/* _ (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ +/* _ (Word16[]) T_op_fx : open loop pitch Q0 */ +/* _ (Word16[]) voicing_fx : floating pitch values for each subframe Q15*/ +/* _ (Word16[]) res_fx : residual signal Q_new */ +/* _ (Word16[]) exc_fx : adapt. excitation exc (Q0) */ +/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q0) */ +/* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ +/* _ (Word16) shift : shift */ +/* _ (Word16) Q_new : */ /*----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Struct) st_fx : encoder static memory */ -/* _ (Word16) L_frame_fx : length of the frame Q0 */ - -/* _ (Word16[]) speech_fx : input speech Q0 */ -/* _ (Word16[]) Aq_fx : LP filter coefficient Q12 */ -/* _ (Word16[]) A_fx : unquantized A(z) filter */ -/* with bandwidth expansion Q12 */ -/* _ (Word16) coder_type : coding type */ -/* _ (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ -/* _ (Word16[]) T_op_fx : open loop pitch Q0 */ -/* _ (Word16[]) voicing_fx : floating pitch values for each subframe Q15*/ -/* _ (Word16[]) res_fx : residual signal Q_new */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q0) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q0) */ -/* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ -/* _ (Word16) shift : shift */ -/* _ (Word16) Q_new : */ -/*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q0) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q0) */ -/* _ (Word16[]) syn_fx :core synthesis Q_new */ -/* _ (Word16[]) voice_factors_fx: voicing factors Q15 */ -/* _ (Word16[]) bwe_exc_fx : excitation for SWB TBE Q0 */ -/*-----------------------------------------------------------------------*/ - - -/*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*=======================================================================*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) exc_fx : adapt. excitation exc (Q0) */ +/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q0) */ +/* _ (Word16[]) syn_fx :core synthesis Q_new */ +/* _ (Word16[]) voice_factors_fx: voicing factors Q15 */ +/* _ (Word16[]) bwe_exc_fx : excitation for SWB TBE Q0 */ +/*----------------------------------------------------------------------*/ +/*----------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*======================================================================*/ void encod_gen_voic_fx( Encoder_State *st_fx, /* i/o: state structure */ @@ -61,7 +91,7 @@ void encod_gen_voic_fx( Word16 *pitch_buf_fx, /* i/o: floating pitch values for each subframe Q6*/ Word16 *voice_factors_fx, /* o : voicing factors Q15*/ Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q0*/ - Word16 *unbits_fx, /* i/o: number of unused bits Q0*/ + Word16 *unbits_fx, /* i/o: number of unused bits Q0*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer Q6*/ Word16 shift, @@ -111,10 +141,6 @@ void encod_gen_voic_fx( Word16 shift_wsp; Word16 harm_flag_acelp; Word16 lp_select, lp_flag, L_frame; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; SP_MUS_CLAS_HANDLE hSpMusClas = st_fx->hSpMusClas; @@ -169,6 +195,7 @@ void encod_gen_voic_fx( /* set and write harmonicity flag */ harm_flag_acelp = 0; move16(); + test(); test(); IF( GE_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) && LE_32( st_fx->core_brate, MAX_BRATE_AVQ_EXC_TD ) && EQ_16( st_fx->coder_type, GENERIC ) ) @@ -179,7 +206,7 @@ void encod_gen_voic_fx( move16(); } - push_indice_fx( hBstr, IND_HARM_FLAG_ACELP, harm_flag_acelp, 1 ); + push_indice( hBstr, IND_HARM_FLAG_ACELP, harm_flag_acelp, 1 ); } /*------------------------------------------------------------------* @@ -206,8 +233,13 @@ void encod_gen_voic_fx( /* scaling of xn[] to limit dynamic at 12 bits */ Scale_sig( xn_fx, L_SUBFR, shift ); + /*----------------------------------------------------------------* + * Close-loop pitch search and quantization + *----------------------------------------------------------------*/ + *pt_pitch_fx = pit_encode_fx( hBstr, st_fx->acelp_cfg.pitch_bits, st_fx->core_brate, 0, L_frame, st_fx->coder_type, &pitch_limit_flag, i_subfr_fx, exc_fx, - L_SUBFR, st_fx->pitch, &T0_min_fx, &T0_max_fx, &T0_fx, &T0_frac_fx, h1_fx, xn_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); /* Q6 */ + L_SUBFR, st_fx->pitch, &T0_min_fx, &T0_max_fx, &T0_fx, &T0_frac_fx, h1_fx, xn_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf, st_fx->element_mode, Q_new ); /* Q6 */ + tbe_celp_exc( L_frame, i_subfr_fx, T0_fx, T0_frac_fx, &error_fx, bwe_exc_fx ); @@ -239,11 +271,11 @@ void encod_gen_voic_fx( IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { - push_indice_fx( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); } /*st_fx->lowrate_pitchGain = 0.9f * st_fx->lowrate_pitchGain + 0.1f * gain_pit_fx;*/ - hSpMusClas->lowrate_pitchGain = round_fx_o( L_mac_o( L_mult( 29491, hSpMusClas->lowrate_pitchGain ), 6554, gain_pit_fx, &Overflow ), &Overflow ); /*Q14*Q16(0.1) + Q15 -> Q15*/ + hSpMusClas->lowrate_pitchGain = round_fx_sat( L_mac_sat( L_mult( 29491, hSpMusClas->lowrate_pitchGain ), 6554, gain_pit_fx ) ); /*Q14*Q16(0.1) + Q15 -> Q15*/ /*-----------------------------------------------------------------* * Transform domain contribution encoding - active frames @@ -271,7 +303,8 @@ void encod_gen_voic_fx( IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) { gain_enc_lbr_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->coder_type, i_subfr_fx, xn_fx, y1_fx, shift_wsp, y2_fx, code_fx, - &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, gc_mem, gp_mem, clip_gain_fx, L_SUBFR ); + &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, gc_mem, gp_mem, clip_gain_fx, L_SUBFR, + st_fx->element_mode ); } ELSE IF( GT_32( st_fx->core_brate, ACELP_32k ) ) { @@ -294,9 +327,8 @@ void encod_gen_voic_fx( } gp_clip_test_gain_pit_fx( st_fx->element_mode, st_fx->core_brate, gain_pit_fx, st_fx->clip_var_fx ); - Lgcode = L_shl_o( gain_code_fx, Q_new, &Overflow ); /* scaled gain_code with Qnew -> Q16*/ - gcode16 = round_fx_o( Lgcode, &Overflow ); /*Q0*/ - + Lgcode = L_shl_sat( gain_code_fx, Q_new ); /* scaled gain_code with Qnew -> Q16*/ + gcode16 = round_fx_sat( Lgcode ); /*Q0*/ hLPDmem->tilt_code = Est_tilt2( &exc_fx[i_subfr_fx], gain_pit_fx, code_fx, Lgcode, &voice_fac_fx, shift ); /* Q15 */ move16(); @@ -331,20 +363,20 @@ void encod_gen_voic_fx( FOR( i = 0; i < L_SUBFR; i++ ) { /* Contribution from AVQ layer */ - Ltmp1 = L_mult_o( gain_preQ_fx, code_preQ_fx[i], &Overflow ); /* Q2 + Q6 -> Q9*/ - Ltmp1 = L_shl_o( Ltmp1, tmp1_fx, &Overflow ); /* Q16 + Q_exc */ + Ltmp1 = L_mult_sat( gain_preQ_fx, code_preQ_fx[i] ); /* Q2 + Q6 -> Q9*/ + Ltmp1 = L_shl_sat( Ltmp1, tmp1_fx ); /* Q16 + Q_exc */ /* Compute exc2 */ - Ltmp = L_shl_o( L_mult( gain_pit_fx, exc_fx[i + i_subfr_fx] ), 1, &Overflow ); /* Q16 */ - exc2_fx[i + i_subfr_fx] = round_fx_o( L_add_o( Ltmp, Ltmp1, &Overflow ), &Overflow ); /* Q0 */ + Ltmp = L_shl_sat( L_mult( gain_pit_fx, exc_fx[i + i_subfr_fx] ), 1 ); /* Q16 */ + exc2_fx[i + i_subfr_fx] = round_fx_sat( L_add_sat( Ltmp, Ltmp1 ) ); /* Q0 */ move16(); /* code in Q9, gain_pit in Q14 */ - Ltmp = L_mult( gcode16, code_fx[i] ); /* Q10 */ - Ltmp = L_shl( Ltmp, 5 ); /* Q15 */ - Ltmp = L_mac( Ltmp, exc_fx[i + i_subfr_fx], gain_pit_fx ); /* Q15 */ - Ltmp = L_shl_o( Ltmp, 1, &Overflow ); /* saturation can occur here Q16*/ - exc_fx[i + i_subfr_fx] = round_fx_o( L_add_o( Ltmp, Ltmp1, &Overflow ), &Overflow ); /* Q0 */ + Ltmp = L_mult( gcode16, code_fx[i] ); /* Q10 */ + Ltmp = L_shl( Ltmp, 5 ); /* Q15 */ + Ltmp = L_mac( Ltmp, exc_fx[i + i_subfr_fx], gain_pit_fx ); /* Q15 */ + Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16*/ + exc_fx[i + i_subfr_fx] = round_fx_sat( L_add_sat( Ltmp, Ltmp1 ) ); /* Q0 */ } } ELSE @@ -353,23 +385,26 @@ void encod_gen_voic_fx( * Construct adaptive part of the excitation * Save the non-enhanced excitation for FEC_exc *-----------------------------------------------------------------*/ + FOR( i = 0; i < L_SUBFR; i++ ) { /* code in Q9, gain_pit in Q14 */ - Ltmp = L_mult( gcode16, code_fx[i] ); /* Q10 */ - Ltmp = L_shl_o( Ltmp, 5, &Overflow ); /* Q15 */ - Ltmp = L_mac_o( Ltmp, exc_fx[i + i_subfr_fx], gain_pit_fx, &Overflow ); /* Q15 */ - Ltmp = L_shl_o( Ltmp, 1, &Overflow ); /* saturation can occur here Q16*/ - exc_fx[i + i_subfr_fx] = round_fx_o( Ltmp, &Overflow ); /* Q0 */ + Ltmp = L_mult( gcode16, code_fx[i] ); /* Q10 */ + Ltmp = L_shl_sat( Ltmp, 5 ); /* Q15 */ + Ltmp = L_mac_sat( Ltmp, exc_fx[i + i_subfr_fx], gain_pit_fx ); /* Q15 */ + Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16*/ + exc_fx[i + i_subfr_fx] = round_fx_sat( Ltmp ); /* Q0 */ } } + /*-----------------------------------------------------------------* * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_fx( L_frame, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_new, - T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate ); + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q10, Q_new, + T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. @@ -387,7 +422,7 @@ void encod_gen_voic_fx( WHILE( unbits_PI_fx > 0 ) { i = s_min( unbits_PI_fx, 16 ); - push_indice_fx( hBstr, IND_UNUSED, 0, i ); + push_indice( hBstr, IND_UNUSED, 0, i ); unbits_PI_fx -= i; } IF( st_fx->Opt_SC_VBR ) @@ -398,23 +433,25 @@ void encod_gen_voic_fx( hSC_VBR->prev_tilt_code_fx = hLPDmem->tilt_code; /* Q15 */ move16(); } + return; } + void encod_gen_voic_ivas_fx( Encoder_State *st_fx, /* i/o: state structure */ - const Word16 speech_fx[], /* i : input speech Q0*/ + const Word16 speech_fx[], /* i : input speech Qnew -1 */ const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes Q12*/ const Word16 Aq_fx[], /* i : 12k8 Lp coefficient Q12*/ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy Q8*/ const Word16 *res_fx, /* i : residual signal Q_new*/ - Word16 *syn_fx, /* i/o: core synthesis Q_new*/ - Word16 *exc_fx, /* i/o: current non-enhanced excitation Q0*/ - Word16 *exc2_fx, /* i/o: current enhanced excitation Q0*/ + Word16 *syn_fx, /* i/o: core synthesis Q_new - 1*/ + Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/ + Word16 *exc2_fx, /* i/o: current enhanced excitation Q_new*/ Word16 *pitch_buf_fx, /* i/o: floating pitch values for each subframe Q6*/ Word16 *voice_factors_fx, /* o : voicing factors Q15*/ Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q0*/ - Word16 *unbits_fx, /* i/o: number of unused bits Q0*/ + Word16 *unbits_fx, /* i/o: number of unused bits Q0*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer Q6*/ Word16 shift, @@ -465,10 +502,6 @@ void encod_gen_voic_ivas_fx( Word16 harm_flag_acelp; Word16 lp_select, lp_flag, L_frame; Word16 q_h1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; LPD_state_HANDLE hLPDmem = st_fx->hLPDmem; @@ -489,7 +522,6 @@ void encod_gen_voic_ivas_fx( L_frame = st_fx->L_frame; move16(); - IF( EQ_16( L_frame, L_FRAME ) ) { T0_max_fx = PIT_MAX; @@ -518,10 +550,15 @@ void encod_gen_voic_ivas_fx( set16_fx( code_preQ_fx, 0, L_SUBFR ); shift_wsp = add( Q_new, shift ); + if ( LT_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) ) + { + shift_wsp = sub( shift_wsp, 1 ); + } /* set and write harmonicity flag */ harm_flag_acelp = 0; move16(); + test(); test(); IF( GE_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) && LE_32( st_fx->core_brate, MAX_BRATE_AVQ_EXC_TD ) && EQ_16( st_fx->coder_type, GENERIC ) ) @@ -555,12 +592,24 @@ void encod_gen_voic_ivas_fx( q_h1 = sub( 14, norm_s( h1_fx[0] ) ); Copy_Scale_sig( h1_fx, h2_fx, L_SUBFR, sub( 11, q_h1 ) ); /*Q11*/ - + Scale_sig( h1_fx, L_SUBFR, sub( 14, q_h1 ) ); /* set h1[] in Q14 with scaling for convolution Q14*/ /* scaling of xn[] to limit dynamic at 12 bits */ Scale_sig( xn_fx, L_SUBFR, shift ); + test(); + test(); + IF( Es_pred_fx < 0 && LE_16( i_subfr_fx, L_SUBFR ) && NE_16( st_fx->last_core, ACELP_CORE ) ) + { + /* During core transition, when the temporal correlation is non existent */ + rem_offset( xn_fx, xn_fx, L_SUBFR ); + rem_offset( cn_fx, cn_fx, L_SUBFR ); + } + + /*----------------------------------------------------------------* + * Close-loop pitch search and quantization + *----------------------------------------------------------------*/ - *pt_pitch_fx = pit_encode_ivas_fx( hBstr, st_fx->acelp_cfg.pitch_bits, st_fx->core_brate, 0, L_frame, st_fx->coder_type, &pitch_limit_flag, i_subfr_fx, exc_fx, - L_SUBFR, st_fx->pitch, &T0_min_fx, &T0_max_fx, &T0_fx, &T0_frac_fx, h1_fx, xn_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf, Q_new ); /* Q6 */ + *pt_pitch_fx = pit_encode_fx( hBstr, st_fx->acelp_cfg.pitch_bits, st_fx->core_brate, 0, L_frame, st_fx->coder_type, &pitch_limit_flag, i_subfr_fx, exc_fx, + L_SUBFR, st_fx->pitch, &T0_min_fx, &T0_max_fx, &T0_fx, &T0_frac_fx, h1_fx, xn_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf, st_fx->element_mode, Q_new ); /* Q6 */ move16(); tbe_celp_exc_ivas( st_fx->element_mode, st_fx->idchan, L_frame, L_SUBFR, i_subfr_fx, T0_fx, T0_frac_fx, &error_fx, bwe_exc_fx, st_fx->tdm_LRTD_flag ); @@ -569,7 +618,7 @@ void encod_gen_voic_ivas_fx( * Find adaptive exitation *-----------------------------------------------------------------*/ - pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); /*-----------------------------------------------------------------* * Gain clipping test to avoid unstable synthesis on frame erasure @@ -587,9 +636,9 @@ void encod_gen_voic_ivas_fx( /*-----------------------------------------------------------------* * LP filtering of the adaptive excitation, codebook target computation *-----------------------------------------------------------------*/ - Scale_sig( h1_fx, L_SUBFR, sub( 14, q_h1 ) ); /* set h1[] in Q14 with scaling for convolution Q14*/ - lp_select = lp_filt_exc_enc_ivas_fx( MODE1, st_fx->coder_type, i_subfr_fx, exc_fx, h1_fx, - xn_fx, y1_fx, xn2_fx, L_SUBFR, L_frame, g_corr_fx, clip_gain_fx, &gain_pit_fx, &lp_flag ); + + lp_select = lp_filt_exc_enc_fx( MODE1, st_fx->coder_type, i_subfr_fx, exc_fx, h1_fx, + xn_fx, y1_fx, xn2_fx, L_SUBFR, L_frame, g_corr_fx, clip_gain_fx, &gain_pit_fx, &lp_flag ); IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { @@ -621,18 +670,19 @@ void encod_gen_voic_ivas_fx( IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) { - gain_enc_lbr_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->coder_type, i_subfr_fx, xn_fx, y1_fx, sub( shift_wsp, 1 ), y2_fx, code_fx, - &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, gc_mem, gp_mem, clip_gain_fx, L_SUBFR ); + gain_enc_lbr_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->coder_type, i_subfr_fx, xn_fx, y1_fx, shift_wsp, y2_fx, code_fx, + &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, gc_mem, gp_mem, clip_gain_fx, L_SUBFR, + st_fx->element_mode ); } ELSE IF( GT_32( st_fx->core_brate, ACELP_32k ) ) { - gain_enc_SQ_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr_fx, xn_fx, y1_fx, y2_fx, code_fx, Es_pred_fx, - &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx, sub( shift_wsp, 1 ) ); + gain_enc_SQ_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr_fx, xn_fx, y1_fx, y2_fx, code_fx, Es_pred_fx, + &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx, shift_wsp ); } ELSE { - gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame, i_subfr_fx, -1, xn_fx, y1_fx, sub( shift_wsp, 1 ), y2_fx, code_fx, Es_pred_fx, - &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx ); + gain_enc_mless_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame, i_subfr_fx, -1, xn_fx, y1_fx, shift_wsp, y2_fx, code_fx, Es_pred_fx, + &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx ); } IF( st_fx->Opt_SC_VBR ) { @@ -645,8 +695,8 @@ void encod_gen_voic_ivas_fx( } gp_clip_test_gain_pit_fx( st_fx->element_mode, st_fx->core_brate, gain_pit_fx, st_fx->clip_var_fx ); - Lgcode = L_shl_o( gain_code_fx, Q_new, &Overflow ); /* scaled gain_code with Qnew -> Q16*/ - gcode16 = round_fx_o( Lgcode, &Overflow ); /* Q0 */ + Lgcode = L_shl_sat( gain_code_fx, Q_new ); /* scaled gain_code with Qnew -> Q16*/ + gcode16 = round_fx_sat( Lgcode ); hLPDmem->tilt_code = est_tilt_ivas_fx( &exc_fx[i_subfr_fx], gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, Q_new, L_SUBFR, 0 ); /* Q15 */ move16(); @@ -656,11 +706,7 @@ void encod_gen_voic_ivas_fx( *-----------------------------------------------------------------*/ test(); -#ifdef NONBE_FIX_GSC_BSTR IF( !st_fx->inactive_coder_type_flag && EQ_16( st_fx->coder_type, INACTIVE ) ) -#else - IF( GE_32( st_fx->total_brate, MAX_GSC_INACTIVE_BRATE ) && EQ_16( st_fx->coder_type, INACTIVE ) ) -#endif { transf_cdbk_enc_ivas_fx( st_fx, 0, i_subfr_fx, cn_fx, exc_fx, p_Aq_fx, p_Aw_fx, h1_fx, xn_fx, xn2_fx, y1_fx, y2_fx, Es_pred_fx, &gain_pit_fx, gain_code_fx, g_corr_fx, clip_gain_fx, &gain_preQ_fx, code_preQ_fx, unbits_fx, Q_new, shift ); @@ -670,14 +716,29 @@ void encod_gen_voic_ivas_fx( * Update memory of the weighting filter *-----------------------------------------------------------------*/ + /*At this point + xn has to be in Qnew + yn has to be in Qnew + y2_fx has to be in Q9 + gcode16 in Q_new + gain_pit_fx in Q14 + */ + Scale_sig( xn_fx, L_SUBFR, 1 ); + Scale_sig( y1_fx, L_SUBFR, 1 ); /* st_fx->mem_w0 = xn[L_SUBFR-1] - (gain_pit*y1[L_SUBFR-1]) - (gain_code*y2[L_SUBFR-1]); */ - Ltmp = L_mult0( gcode16, y2_fx[L_SUBFR - 1] ); /* Q9 */ - Ltmp = L_shl( Ltmp, add( 5, shift ) ); // Q_new+14+shift + Ltmp = L_mult0( gcode16, y2_fx[L_SUBFR - 1] ); + Ltmp = L_shl( Ltmp, add( 5, shift ) ); Ltmp = L_negate( Ltmp ); - Ltmp = L_mac( Ltmp, xn_fx[L_SUBFR - 1], 16384 /*Q14*/ ); // Q_new-1+15+shift - Ltmp = L_msu( Ltmp, y1_fx[L_SUBFR - 1], gain_pit_fx /*Q14*/ ); // Q_new-1+15+shift - Ltmp = L_shl_sat( Ltmp, sub( 1, shift ) ); // Q_new+15 - hLPDmem->mem_w0 = round_fx_sat( Ltmp ); /*Q_new-1 */ + Word32 Ltmp2 = L_mult0( xn_fx[L_SUBFR - 1], 16384 ); + Ltmp = L_add( Ltmp, Ltmp2 ); + Word32 Ltmp3 = L_mult0( y1_fx[L_SUBFR - 1], gain_pit_fx ); + Ltmp = L_sub( Ltmp, Ltmp3 ); + + /*Ltmp is in Q14 + Qnew here + We need memWo in Qnew -1 */ + + Ltmp = L_shl( Ltmp, sub( 1, shift ) ); // Q14 + Qnew + 1 + hLPDmem->mem_w0 = round_fx_sat( Ltmp ); /*Q_new-1 */ move16(); IF( gain_preQ_fx != 0 ) { @@ -686,20 +747,20 @@ void encod_gen_voic_ivas_fx( FOR( i = 0; i < L_SUBFR; i++ ) { /* Contribution from AVQ layer */ - Ltmp1 = L_mult_o( gain_preQ_fx, code_preQ_fx[i], &Overflow ); /* Q2 + Q6 -> Q9*/ - Ltmp1 = L_shl_o( Ltmp1, tmp1_fx, &Overflow ); /* Q16 + Q_exc */ + Ltmp1 = L_mult_sat( gain_preQ_fx, code_preQ_fx[i] ); + Ltmp1 = L_shl_sat( Ltmp1, tmp1_fx ); /* Compute exc2 */ - Ltmp = L_shl_o( L_mult( gain_pit_fx, exc_fx[i + i_subfr_fx] ), 1, &Overflow ); /* Q0 */ - exc2_fx[i + i_subfr_fx] = round_fx_o( L_add_o( Ltmp, Ltmp1, &Overflow ), &Overflow ); /* Q0 */ + Ltmp = L_shl_sat( L_mult( gain_pit_fx, exc_fx[i + i_subfr_fx] ), 1 ); + exc2_fx[i + i_subfr_fx] = round_fx_sat( L_add_sat( Ltmp, Ltmp1 ) ); move16(); /* code in Q9, gain_pit in Q14 */ - Ltmp = L_mult( gcode16, code_fx[i] ); /* Q10 */ - Ltmp = L_shl( Ltmp, 5 ); /* Q15 */ - Ltmp = L_mac( Ltmp, exc_fx[i + i_subfr_fx], gain_pit_fx ); /* Q15 */ - Ltmp = L_shl_o( Ltmp, 1, &Overflow ); /* saturation can occur here Q16*/ - exc_fx[i + i_subfr_fx] = round_fx_o( L_add_o( Ltmp, Ltmp1, &Overflow ), &Overflow ); /* Q0 */ + Ltmp = L_mult( gcode16, code_fx[i] ); /*Qnew + 9 + 1 */ + Ltmp = L_shl( Ltmp, 5 ); /*Qnew + 9+ 1+5 */ + Ltmp = L_mac( Ltmp, exc_fx[i + i_subfr_fx], gain_pit_fx ); /*Qnew + 14 + 1*/ + Ltmp = L_shl_sat( Ltmp, 1 ); /*Qnew + 14 + 1 +1 */ /* saturation can occur here Q16*/ + exc_fx[i + i_subfr_fx] = round_fx_sat( L_add_sat( Ltmp, Ltmp1 ) ); move16(); } } @@ -709,31 +770,34 @@ void encod_gen_voic_ivas_fx( * Construct adaptive part of the excitation * Save the non-enhanced excitation for FEC_exc *-----------------------------------------------------------------*/ + FOR( i = 0; i < L_SUBFR; i++ ) { /* code in Q9, gain_pit in Q14 */ - Ltmp = L_mult( gcode16, code_fx[i] ); /* Q10 */ - Ltmp = L_shl_o( Ltmp, 5, &Overflow ); /* Q15 */ - Ltmp = L_mac_o( Ltmp, exc_fx[i + i_subfr_fx], gain_pit_fx, &Overflow ); /* Q15 */ - Ltmp = L_shl_o( Ltmp, 1, &Overflow ); /* saturation can occur here Q16*/ - exc_fx[i + i_subfr_fx] = round_fx_o( Ltmp, &Overflow ); /* Q0 */ + /*gcode16 in Qnew*/ + Ltmp = L_mult( gcode16, code_fx[i] ); /*Qnew + 9 + 1 */ + Ltmp = L_shl_sat( Ltmp, 5 ); /*Qnew + 9+ 1+5 */ + Ltmp = L_mac_sat( Ltmp, exc_fx[i + i_subfr_fx], gain_pit_fx ); /*Qnew + 14 + 1*/ + Ltmp = L_shl_sat( Ltmp, 1 ); /*Qnew + 14 + 1 +1 */ + exc_fx[i + i_subfr_fx] = round_fx_sat( Ltmp ); } } + /*-----------------------------------------------------------------* * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_new, - T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, - st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_AVQ_OUT_DEC, Q_new, + T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. * Update A(z) filters *-----------------------------------------------------------------*/ - Syn_filt_s( 1, p_Aq_fx, M, &exc_fx[i_subfr_fx], &syn_fx[i_subfr_fx], L_SUBFR, hLPDmem->mem_syn, 1 ); + syn_filt_fx( 1, p_Aq_fx, M, &exc_fx[i_subfr_fx], &syn_fx[i_subfr_fx], L_SUBFR, hLPDmem->mem_syn, 1 ); p_Aw_fx += ( M + 1 ); p_Aq_fx += ( M + 1 ); diff --git a/lib_enc/enc_gen_voic_rf_fx.c b/lib_enc/enc_gen_voic_rf_fx.c index e9c9d87f74bfa057d719079170b1496c85b61887..82794098a07a30943cc926d68f25395a3a8a8766 100644 --- a/lib_enc/enc_gen_voic_rf_fx.c +++ b/lib_enc/enc_gen_voic_rf_fx.c @@ -1,11 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" #include "cnst.h" -#include "rom_com_fx.h" #include "stl.h" #include "rom_basop_util.h" #include "rom_com.h" /* Common constants */ @@ -115,18 +114,18 @@ void reset_rf_indices_fx( *-------------------------------------------------------------------*/ void coder_acelp_rf_fx( ACELP_config *acelp_cfg, /*input/output: configuration of the ACELP coding*/ - const Word16 coder_type, /* input: coding type Q0*/ - const Word16 A[], /* input: coefficients 4xAz[M+1] Q12*/ - const Word16 Aq[], /* input: coefficients 4xAz_q[M+1] Q12*/ - Word16 speech[], /* input: speech[-M..lg] Q_new-1*/ - const Word16 voicing[], /* input: open-loop LTP gain Q15*/ - const Word16 T_op[], /* input: open-loop LTP lag Q0*/ + const Word16 coder_type, /* input: coding type Q0*/ + const Word16 A[], /* input: coefficients 4xAz[M+1] Q12*/ + const Word16 Aq[], /* input: coefficients 4xAz_q[M+1] Q12*/ + Word16 speech[], /* input: speech[-M..lg] Q_new-1*/ + const Word16 voicing[], /* input: open-loop LTP gain Q15*/ + const Word16 T_op[], /* input: open-loop LTP lag Q0*/ Word16 stab_fac, /* Q15 */ Encoder_State *st, - Word16 target_bits, /* i/o : coder memory state Q0*/ - const Word16 rf_frame_type, /* i : rf_frame_type Q0*/ - Word16 *exc_rf, /* i/o: pointer to RF excitation Q_new*/ - Word16 *syn_rf, /* i/o: pointer to RF synthesis Q_new-1*/ + Word16 target_bits, /* i/o : coder memory state Q0*/ + const Word16 rf_frame_type, /* i : rf_frame_type Q0*/ + Word16 *exc_rf, /* i/o: pointer to RF excitation Q_new*/ + Word16 *syn_rf, /* i/o: pointer to RF synthesis Q_new-1*/ Word16 Q_new, Word16 shift ) { @@ -165,11 +164,6 @@ void coder_acelp_rf_fx( Word16 prev_gain_pit; Word16 rf_coder_type; Word16 lp_select; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - RF_ENC_HANDLE hRF = st->hRF; /* to avoid compilation warnings */ @@ -432,25 +426,25 @@ void coder_acelp_rf_fx( /*----------------------------------------------------------* * - voice factor (for pitch enhancement) * *----------------------------------------------------------*/ + E_UTIL_voice_factor( exc_rf, i_subfr, code, gain_pit, gain_code, &voice_fac, &( hRF->rf_tilt_code ), L_SUBFR, acelp_cfg->voice_tilt, Q_new, shift ); - /*-----------------------------------------------------------------* * Update memory of the weighting filter *-----------------------------------------------------------------*/ + /* st_fx->_rf_mem_w0 = xn[L_SUBFR-1] - (gain_pit*y1[L_SUBFR-1]) - (gain_code*y2[L_SUBFR-1]); */ - Ltmp = Mpy_32_16_1( gain_code, y2[L_SUBFR - 1] ); /* Q10 */ - Ltmp = L_shl_o( Ltmp, add( 5, Q_xn ), &Overflow ); /* Q15 + Q_xn */ - Ltmp = L_mac_o( Ltmp, y1[L_SUBFR - 1], gain_pit, &Overflow ); /* Q15 + Q_xn */ + Ltmp = Mpy_32_16_1( gain_code, y2[L_SUBFR - 1] ); /* Q10 */ + Ltmp = L_shl_sat( Ltmp, add( 5, Q_xn ) ); /* Q15 + Q_xn */ + Ltmp = L_mac_sat( Ltmp, y1[L_SUBFR - 1], gain_pit ); /* Q15 + Q_xn */ /* Add Gaussian contribution*/ - Ltmp2 = Mpy_32_16_1( gain_code2, y22[L_SUBFR - 1] ); /* Q10 */ - Ltmp2 = L_shl_o( Ltmp2, add( 5, Q_xn ), &Overflow ); /* Q15 + Q_xn */ - Ltmp = L_add_o( Ltmp, Ltmp2, &Overflow ); /* Q15 + Q_xn */ - hRF->rf_mem_w0 = sub_o( xn[L_SUBFR - 1], round_fx_o( L_shl_o( Ltmp, 1, &Overflow ), &Overflow ), &Overflow ); /* Q_xn */ + Ltmp2 = Mpy_32_16_1( gain_code2, y22[L_SUBFR - 1] ); /* Q10 */ + Ltmp2 = L_shl_sat( Ltmp2, add( 5, Q_xn ) ); /* Q15 + Q_xn */ + Ltmp = L_add_sat( Ltmp, Ltmp2 ); /* Q15 + Q_xn */ + hRF->rf_mem_w0 = sub_sat( xn[L_SUBFR - 1], round_fx_sat( L_shl_sat( Ltmp, 1 ) ) ); /* Q_xn */ move16(); - hRF->rf_mem_w0 = shr_o( hRF->rf_mem_w0, shift, &Overflow ); /*Qnew-1*/ - + hRF->rf_mem_w0 = shr_sat( hRF->rf_mem_w0, shift ); /*Qnew-1*/ /*-------------------------------------------------------* * - Find the total excitation. * @@ -462,26 +456,26 @@ void coder_acelp_rf_fx( FOR( i = sub( tmp2, shr( L_SUBFR, 1 ) ); i < tmp2; i++ ) { /* code in Q9, gain_pit in Q14; exc Q_new */ - Ltmp = Mpy_32_16_1( gain_code2, code2[i] ); /* Q10 */ - Ltmp = L_shl_o( Ltmp, Q_new_p5, &Overflow ); /* Q15 + Q_new */ - Ltmp = L_mac_o( Ltmp, gain_pit, exc_rf[i + i_subfr], &Overflow ); /* Q15 + Q_new */ - exc2[i] = round_fx_o( L_shl_o( Ltmp, 1, &Overflow ), &Overflow ); /* Q_new */ + Ltmp = Mpy_32_16_1( gain_code2, code2[i] ); /* Q10 */ + Ltmp = L_shl_sat( Ltmp, Q_new_p5 ); /* Q15 + Q_new */ + Ltmp = L_mac_sat( Ltmp, gain_pit, exc_rf[i + i_subfr] ); /* Q15 + Q_new */ + exc2[i] = round_fx_sat( L_shl_sat( Ltmp, 1 ) ); /* Q_new */ move16(); - Ltmp2 = Mpy_32_16_1( gain_code_vect[j], code[i] ); /* Q10 */ - Ltmp2 = L_shl_o( Ltmp2, Q_new_p5, &Overflow ); /* Q15 + Q_new */ - Ltmp = L_add_o( Ltmp, Ltmp2, &Overflow ); /* Q15 + Q_new */ - Ltmp = L_shl_o( Ltmp, 1, &Overflow ); /* saturation can occur here Q16 + Q_new*/ - exc_rf[i + i_subfr] = round_fx_o( Ltmp, &Overflow ); /* Q_new */ + Ltmp2 = Mpy_32_16_1( gain_code_vect[j], code[i] ); /* Q10 */ + Ltmp2 = L_shl_sat( Ltmp2, Q_new_p5 ); /* Q15 + Q_new */ + Ltmp = L_add_sat( Ltmp, Ltmp2 ); /* Q15 + Q_new */ + Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16 + Q_new*/ + exc_rf[i + i_subfr] = round_fx_sat( Ltmp ); /* Q_new */ move16(); } tmp2 = L_SUBFR; move16(); } - /*---------------------------------------------------------* * Enhance the excitation * *---------------------------------------------------------*/ + E_UTIL_enhancer( voice_fac, stab_fac, past_gcode, gain_inov, &hRF->rf_gc_threshold, code, exc2, gain_pit, &hRF->rf_dm_fx.prev_gain_code, hRF->rf_dm_fx.prev_gain_pit, &hRF->rf_dm_fx.prev_state, coder_type, diff --git a/lib_enc/enc_higher_acelp_fx.c b/lib_enc/enc_higher_acelp_fx.c index 64a11be5b145b5db326b69af31dc1b4d627ea512..db4088ac581970a4b9af79fce9355fbfb13424e3 100644 --- a/lib_enc/enc_higher_acelp_fx.c +++ b/lib_enc/enc_higher_acelp_fx.c @@ -1,22 +1,26 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "prot_fx.h" /* Function prototypes */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx_enc.h" + /*---------------------------------------------------------------------* * Local function prototype *---------------------------------------------------------------------*/ + static void find_cn_fx( const Word16 xn[], const Word16 Ap[], const Word16 *p_Aq, Word16 cn[] ); + /*-----------------------------------------------------------------* * Transform domain contribution encoding *-----------------------------------------------------------------*/ + #define Q_MINUS 4 void transf_cdbk_enc_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ @@ -53,10 +57,8 @@ void transf_cdbk_enc_fx( Word16 Qdct; Word16 avq_bit_sFlag; Word16 trgtSvPos; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif avq_bit_sFlag = 0; move16(); @@ -83,9 +85,10 @@ void transf_cdbk_enc_fx( * For inactive frame, find target in residual domain * Deemphasis *--------------------------------------------------------------*/ + IF( EQ_16( st_fx->coder_type, INACTIVE ) ) { - gcode16 = round_fx_o( L_shl_o( gain_code, Q_new, &Overflow ), &Overflow ); + gcode16 = round_fx_sat( L_shl_sat( gain_code, Q_new ) ); FOR( i = 0; i < L_SUBFR; i++ ) { /*x_tran[i] = xn[i] - *gain_pit * y1[i] - gain_code * y2[i];*/ @@ -132,12 +135,14 @@ void transf_cdbk_enc_fx( /*--------------------------------------------------------------* * Split algebraic vector quantizer based on RE8 lattice *--------------------------------------------------------------*/ + AVQ_cod_fx( x_tran, x_norm, nBits, Nsv, 0 ); /*--------------------------------------------------------------* * Find prequantizer excitation gain * Quantize the gain *--------------------------------------------------------------*/ + L_corr = L_deposit_l( 0 ); L_ener = L_deposit_l( 0 ); FOR( i = 0; i < Nsv * 8; i++ ) @@ -179,8 +184,8 @@ void transf_cdbk_enc_fx( { m_corr = div_s( 16384, m_den ); e_corr = sub( 14 + 4, e_den ); - Ltmp = L_shr( Mult_32_16( Ltmp, m_corr ), e_corr ); /*Q12*/ - stmp = round_fx_o( L_shl_o( Ltmp, 16, &Overflow ), &Overflow ); /* Q12 */ + Ltmp = L_shr( Mult_32_16( Ltmp, m_corr ), e_corr ); /*Q12*/ + stmp = round_fx_sat( L_shl_sat( Ltmp, 16 ) ); /* Q12 */ } ELSE { @@ -242,11 +247,12 @@ void transf_cdbk_enc_fx( Ltmp = L_shl( Ltmp, add( e_den, 9 ) ); /* Q18*/ *gain_preQ = round_fx( Ltmp ); /* Q2*/ } - push_indice_fx( st_fx->hBstr, IND_AVQ_GAIN, index, G_AVQ_BITS ); + push_indice( st_fx->hBstr, IND_AVQ_GAIN, index, G_AVQ_BITS ); /*--------------------------------------------------------------* * Encode and multiplex subvectors into bit-stream *--------------------------------------------------------------*/ + trgtSvPos = Nsv - 1; move16(); test(); @@ -276,7 +282,7 @@ void transf_cdbk_enc_fx( WHILE( *unbits > 0 ) { i = s_min( *unbits, 16 ); - push_indice_fx( st_fx->hBstr, IND_UNUSED, 0, i ); + push_indice( st_fx->hBstr, IND_UNUSED, 0, i ); *unbits -= i; } } @@ -287,10 +293,9 @@ void transf_cdbk_enc_fx( FOR( i = 0; i < Nsv * WIDTH_BAND; i++ ) { - x_tran[i] = shl_o( x_norm[i], Q_AVQ_OUT_DEC, &Overflow ); + x_tran[i] = shl_sat( x_norm[i], Q_AVQ_OUT_DEC ); move16(); } - set16_fx( x_tran + Nsv * WIDTH_BAND, 0, sub( L_SUBFR, i_mult2( WIDTH_BAND, Nsv ) ) ); test(); test(); @@ -313,6 +318,7 @@ void transf_cdbk_enc_fx( /*--------------------------------------------------------------* * Preemphasise *--------------------------------------------------------------*/ + /* in extreme cases at subframe boundaries, lower the preemphasis memory to avoid a saturation */ test(); if ( ( nq[7] != 0 ) && ( GT_16( sub( st_fx->last_nq_preQ, nq[0] ), 7 ) ) ) @@ -369,6 +375,8 @@ void transf_cdbk_enc_fx( return; } + + void transf_cdbk_enc_ivas_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ const Word16 harm_flag_acelp, /* i : harmonic flag for higher rates ACELP Q0*/ @@ -404,10 +412,8 @@ void transf_cdbk_enc_ivas_fx( Word16 Qdct; Word16 avq_bit_sFlag; Word16 trgtSvPos; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif avq_bit_sFlag = 0; move16(); @@ -434,9 +440,10 @@ void transf_cdbk_enc_ivas_fx( * For inactive frame, find target in residual domain * Deemphasis *--------------------------------------------------------------*/ + IF( EQ_16( st_fx->coder_type, INACTIVE ) ) { - gcode16 = round_fx_o( L_shl_o( gain_code, Q_new, &Overflow ), &Overflow ); + gcode16 = round_fx_sat( L_shl_sat( gain_code, Q_new ) ); FOR( i = 0; i < L_SUBFR; i++ ) { /*x_tran[i] = xn[i] - *gain_pit * y1[i] - gain_code * y2[i];*/ @@ -482,12 +489,14 @@ void transf_cdbk_enc_ivas_fx( /*--------------------------------------------------------------* * Split algebraic vector quantizer based on RE8 lattice *--------------------------------------------------------------*/ + AVQ_cod_fx( x_tran, x_norm, nBits, Nsv, 0 ); /*--------------------------------------------------------------* * Find prequantizer excitation gain * Quantize the gain *--------------------------------------------------------------*/ + L_corr = L_deposit_l( 0 ); L_ener = L_deposit_l( 0 ); FOR( i = 0; i < Nsv * 8; i++ ) @@ -529,8 +538,8 @@ void transf_cdbk_enc_ivas_fx( { m_corr = div_s( 16384, m_den ); e_corr = sub( 14 + 4, e_den ); - Ltmp = L_shr( Mult_32_16( Ltmp, m_corr ), e_corr ); /*Q12*/ - stmp = round_fx_o( L_shl_o( Ltmp, 16, &Overflow ), &Overflow ); /* Q12 */ + Ltmp = L_shr( Mult_32_16( Ltmp, m_corr ), e_corr ); /*Q12*/ + stmp = round_fx_sat( L_shl_sat( Ltmp, 16 ) ); /* Q12 */ } ELSE { @@ -599,6 +608,7 @@ void transf_cdbk_enc_ivas_fx( /*--------------------------------------------------------------* * Encode and multiplex subvectors into bit-stream *--------------------------------------------------------------*/ + trgtSvPos = sub( Nsv, 1 ); move16(); test(); @@ -614,7 +624,7 @@ void transf_cdbk_enc_ivas_fx( move16(); } - AVQ_encmux_ivas_fx( st_fx->hBstr, -1, x_norm, &nBits, Nsv, nq, avq_bit_sFlag, trgtSvPos ); + AVQ_encmux_fx( st_fx->hBstr, -1, x_norm, &nBits, Nsv, nq, avq_bit_sFlag, trgtSvPos ); /* save # of AVQ unused bits for next subframe */ *unbits = nBits; @@ -640,10 +650,9 @@ void transf_cdbk_enc_ivas_fx( FOR( i = 0; i < Nsv * WIDTH_BAND; i++ ) { - x_tran[i] = shl_o( x_norm[i], Q_AVQ_OUT_DEC, &Overflow ); + x_tran[i] = shl_sat( x_norm[i], Q_AVQ_OUT_DEC ); move16(); } - set16_fx( x_tran + Nsv * WIDTH_BAND, 0, sub( L_SUBFR, i_mult2( WIDTH_BAND, Nsv ) ) ); test(); test(); @@ -666,6 +675,7 @@ void transf_cdbk_enc_ivas_fx( /*--------------------------------------------------------------* * Preemphasise *--------------------------------------------------------------*/ + /* in extreme cases at subframe boundaries, lower the preemphasis memory to avoid a saturation */ test(); if ( ( nq[7] != 0 ) && ( GT_16( sub( st_fx->last_nq_preQ, nq[0] ), 7 ) ) ) @@ -746,6 +756,8 @@ void transf_cdbk_enc_ivas_fx( return; } + + /*-------------------------------------------------------------------* * Find target in residual domain - cn[] *-------------------------------------------------------------------*/ @@ -774,13 +786,15 @@ static void find_cn_fx( /*-----------------------------------------------------------------* * Transform domain contribution encoding *-----------------------------------------------------------------*/ -Word16 gain_quant_fx( /* o: quantization index Q0*/ - Word32 *gain, /* i: quantized gain Q16*/ - Word16 *gain16, /* o: quantized gain expg*/ - const Word16 c_min, /* i: log10 of lower limit in Q14*/ - const Word16 c_max, /* i: log10 of upper limit in Q13*/ - const Word16 bits, /* i: number of bits to quantize Q0*/ - Word16 *expg /* o: output exponent of gain16 */ + +/* o: quantization index Q0*/ +Word16 gain_quant_fx( + Word32 *gain, /* i : quantized gain Q16*/ + Word16 *gain16, /* o : quantized gain expg*/ + const Word16 c_min, /* i : log10 of lower limit in Q14*/ + const Word16 c_max, /* i : log10 of upper limit in Q13*/ + const Word16 bits, /* i : number of bits to quantize Q0*/ + Word16 *expg /* o : output exponent of gain16 */ ) { Word16 index, levels; diff --git a/lib_enc/enc_nelp_fx.c b/lib_enc/enc_nelp_fx.c index c3eb2ae189911eb524d0ed32b015b0a58959554d..30756d19d6abcbf03857c417d4caaa5555cdb62d 100644 --- a/lib_enc/enc_nelp_fx.c +++ b/lib_enc/enc_nelp_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -12,48 +12,47 @@ #include "basop_util.h" /*==============================================================================*/ -/* FUNCTION : encod_nelp_fx() */ +/* FUNCTION : encod_nelp_fx() */ /*------------------------------------------------------------------------------*/ /* PURPOSE : Encode Unvoiced frames in SC-VBR */ /*------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Encoder_State) st_fx: state structure */ -/* _ (Word16[]) speech_fx : input speech Q_new-1 */ -/* _ (Word16[]) Aq_fx : 12k8 Lp coefficient Q12 */ -/* _ (Word16[]) A_fx : unquantized A(z) filter */ -/* with bandwidth expansion Q12 */ -/* _ (Word16) coder_type : coding type */ -/* _ (Word16[]) res_fx : residual signal Q_new */ -/* _ (Word16*) Q_new : res qformat */ +/* INPUT ARGUMENTS : */ +/* _ (Encoder_State) st_fx: state structure */ +/* _ (Word16[]) speech_fx : input speech Q_new-1 */ +/* _ (Word16[]) Aq_fx : 12k8 Lp coefficient Q12 */ +/* _ (Word16[]) A_fx : unquantized A(z) filter */ +/* with bandwidth expansion Q12 */ +/* _ (Word16) coder_type : coding type */ +/* _ (Word16[]) res_fx : residual signal Q_new */ +/* _ (Word16*) Q_new : res qformat */ /* _ (Word16) shift */ /*------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) synth_fx : core synthesis */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) synth_fx : core synthesis */ /* _ (Word16[]) tmp_noise_fx: long-term noise energy Q0 */ -/* _ (Word16[]) exc_fx : current non-enhanced excitation Q_new */ -/* _ (Word16[]) exc2_fx : current enhanced excitation Q_new */ -/* _ (Word16[]) pitch_buf_fx: floating pitch values for each subframe Q6 */ +/* _ (Word16[]) exc_fx : current non-enhanced excitation Q_new */ +/* _ (Word16[]) exc2_fx : current enhanced excitation Q_new */ +/* _ (Word16[]) pitch_buf_fx: floating pitch values for each subframe Q6 */ /* _ (Word16*) voice_factors : voicing factors */ /* _ (Word16*) bwe_exc : excitation for SWB TBE */ /*------------------------------------------------------------------------------*/ - /*------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*==============================================================================*/ void encod_nelp_fx( Encoder_State *st_fx, /* i/o: state structure */ - const Word16 *speech_fx, /* i : input speech Q_new-1*/ - const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes Q12*/ + const Word16 *speech_fx, /* i : input speech Q_new-1*/ + const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes Q12*/ const Word16 Aq_fx[], /* i : 12k8 Lp coefficient Q12*/ - Word16 *res_fx, /* o : residual signal Q_new*/ - Word16 *synth_fx, /* o : core synthesis Q_new*/ - Word16 *tmp_noise_fx, /* o : long-term noise energy Q0*/ - Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/ - Word16 *exc2_fx, /* i/o: current enhanced excitation Q_new*/ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6*/ - Word16 *voice_factors_fx, /* o : voicing factors Q15*/ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_new*/ + Word16 *res_fx, /* o : residual signal Q_new*/ + Word16 *synth_fx, /* o : core synthesis Q_new*/ + Word16 *tmp_noise_fx, /* o : long-term noise energy Q0*/ + Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/ + Word16 *exc2_fx, /* i/o: current enhanced excitation Q_new*/ + Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6*/ + Word16 *voice_factors_fx, /* o : voicing factors Q15*/ + Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_new*/ Word16 Q_new, Word16 shift @@ -245,7 +244,7 @@ void encod_nelp_ivas_fx( res_fx, L_SUBFR, p_Aw_fx, TILT_FAC_FX, xn_fx, NULL, h1_fx ); /* scale xn[] and h1[] to avoid overflow in dot_product12() */ - Scale_sig( xn_fx, L_SUBFR, shift ); /* scaling of xn[] to limit dynamic at 12 bits Q_new-1+shift */ + Scale_sig( xn_fx, L_SUBFR, shift ); /* scaling of xn[] to limit dynamic at 12 bits Q_new-1+shift */ IF( i_subfr == 0 ) { diff --git a/lib_enc/enc_pit_exc_fx.c b/lib_enc/enc_pit_exc_fx.c index 7e5734e70bdead3ae0e6a5569eac06ca3458b5f3..200c22a1a1f61c5469a8bdaa6b8d6e580ccd925a 100644 --- a/lib_enc/enc_pit_exc_fx.c +++ b/lib_enc/enc_pit_exc_fx.c @@ -1,50 +1,51 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*======================================================================*/ -/* FUNCTION : enc_pit_exc_fx() */ +/* FUNCTION : enc_pit_exc_fx() */ /*----------------------------------------------------------------------*/ -/* PURPOSE : Encode pitch only contribution */ -/* */ +/* PURPOSE : Encode pitch only contribution */ +/* */ /*----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Struct) st_fx : encoder static memory */ -/* _ (Word16[]) speech_fx : input speech Qnew-1 */ -/* _ (Word16[]) Aq_fx : LP filter coefficient Q12 */ -/* _ (Word16[]) A_fx : unquantized A(z) filter */ -/* with bandwidth expansion Q12 */ -/* _ (Word16) coder_type : coding type */ -/* _ (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ -/* _ (Word16[]) T_op_fx : open loop pitch Q0 */ -/* _ (Word16[]) voicing_fx : floating pitch values for each subframe Q15*/ -/* _ (Word16[]) res_fx : residual signal Q_new */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Qnew) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Qnew) */ -/* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ +/* INPUT ARGUMENTS : */ +/* _ (Struct) st_fx : encoder static memory */ +/* _ (Word16[]) speech_fx : input speech Qnew-1 */ +/* _ (Word16[]) Aq_fx : LP filter coefficient Q12 */ +/* _ (Word16[]) A_fx : unquantized A(z) filter */ +/* with bandwidth expansion Q12 */ +/* _ (Word16) coder_type : coding type */ +/* _ (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ +/* _ (Word16[]) T_op_fx : open loop pitch Q0 */ +/* _ (Word16[]) voicing_fx : floating pitch values for each subframe Q15*/ +/* _ (Word16[]) res_fx : residual signal Q_new */ +/* _ (Word16[]) exc_fx : adapt. excitation exc (Qnew) */ +/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Qnew) */ +/* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ /* _ (Word16[]) *wH1, : Weighted impulses response mask */ -/* _ (Word16) shift : shift */ -/* _ (Word16) Q_new : */ +/* _ (Word16) shift : shift */ +/* _ (Word16) Q_new : */ /*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Qnew) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Qnew) */ -/* _ (Word16[]) syn_fx :core synthesis */ -/* _ (Word16[]) voice_factors_fx: voicing factors Q15 */ -/* _ (Word16[]) bwe_exc_fx : excitation for SWB TBE Q0 */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) exc_fx : adapt. excitation exc (Qnew) */ +/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Qnew) */ +/* _ (Word16[]) syn_fx :core synthesis */ +/* _ (Word16[]) voice_factors_fx: voicing factors Q15 */ +/* _ (Word16[]) bwe_exc_fx : excitation for SWB TBE Q0 */ /*-----------------------------------------------------------------------*/ - /*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*=======================================================================*/ + void enc_pit_exc_fx( Encoder_State *st_fx, /* i/o: State structure */ const Word16 *speech, /* i : Input speech Q_new-1*/ @@ -59,9 +60,9 @@ void enc_pit_exc_fx( Word16 *pitch_buf, /* i/o: Fractionnal per subframe pitch Q6*/ const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ Word16 *gpit, /* o : pitch mean gpit Q15*/ - Word16 *saved_bit_pos, /* o : saved position in the bitstream before pitch contribution Q0*/ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ - const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer Q6*/ + Word16 *saved_bit_pos, /* o : saved position in the bitstream before pitch contribution Q0*/ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ + const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer Q6*/ Word16 Q_new, Word16 shift ) { @@ -102,10 +103,6 @@ void enc_pit_exc_fx( BSTR_ENC_HANDLE hBstr = st_fx->hBstr; GSC_ENC_HANDLE hGSCEnc = st_fx->hGSCEnc; LPD_state_HANDLE hLPDmem = st_fx->hLPDmem; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*------------------------------------------------------------------* * Initialization @@ -157,7 +154,6 @@ void enc_pit_exc_fx( } ELSE { - Local_BR = ACELP_7k20; move32(); Pitch_BR = st_fx->core_brate; /* Q0 */ @@ -228,6 +224,7 @@ void enc_pit_exc_fx( /*------------------------------------------------------------------* * ACELP subframe loop *------------------------------------------------------------------*/ + cn = NULL; if ( EQ_16( L_subfr, L_SUBFR ) ) { @@ -239,6 +236,7 @@ void enc_pit_exc_fx( p_Aq = Aq; pt_pitch = pitch_buf; /* pointer to the pitch buffer */ shift_wsp = add( Q_new, shift ); + FOR( i_subfr = 0; i_subfr < st_fx->L_frame; i_subfr += L_subfr ) { @@ -248,15 +246,11 @@ void enc_pit_exc_fx( * target in residual domain "cn" * Compute impulse response, h1[], of weighted synthesis filter *----------------------------------------------------------------*/ + Copy( &res[i_subfr], &exc[i_subfr], L_subfr ); /* Q_new */ /* condition on target (compared to float) has been put outside the loop */ -#if 1 // ndef BUG_FIX find_targets_fx( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, L_subfr, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); -#else - find_targets_fx( speech, hGSCEnc->mem_syn_tmp_fx, i_subfr, &hLPDmem->mem_w0, p_Aq, /*_DIFF_FLOAT_FIX_ --> Here I think mem_syn_tmp_fx should be used */ - res, L_subfr, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); -#endif Copy_Scale_sig( h1, h2, L_subfr, -2 ); /* Q13 */ Scale_sig( h1, L_subfr, add( 1, shift ) ); /* set h1[] in Q14 with scaling for convolution */ @@ -267,13 +261,17 @@ void enc_pit_exc_fx( * Close-loop pitch search and quantization * Adaptive exc. construction *----------------------------------------------------------------*/ + *pt_pitch = pit_encode_fx( hBstr, st_fx->acelp_cfg.pitch_bits, Pitch_BR, 0, st_fx->L_frame, Pitch_CT, &pitch_limit_flag, i_subfr, exc, - L_subfr, st_fx->pitch, &T0_min, &T0_max, T0, T0_frac, h1, xn, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); /* Q6 */ + L_subfr, st_fx->pitch, &T0_min, &T0_max, T0, T0_frac, h1, xn, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf, st_fx->element_mode, Q_new ); /* Q6 */ + + /*-----------------------------------------------------------------* * Find adaptive exitation *-----------------------------------------------------------------*/ pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_subfr + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + /*-----------------------------------------------------------------* * Gain clipping test to avoid unstable synthesis on frame erasure * or in case of floating point encoder & fixed p. decoder @@ -286,16 +284,15 @@ void enc_pit_exc_fx( * (No LP filtering of the adaptive excitation) *-----------------------------------------------------------------*/ - lp_select = lp_filt_exc_enc_fx( MODE1, AUDIO, i_subfr, exc, h1, - xn, y1, xn2, L_subfr, st_fx->L_frame, g_corr, clip_gain, &gain_pit, &lp_flag ); /* Q0 */ + lp_select = lp_filt_exc_enc_fx( MODE1, AUDIO, i_subfr, exc, h1, xn, y1, xn2, L_subfr, st_fx->L_frame, g_corr, clip_gain, &gain_pit, &lp_flag ); /* Q0 */ IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { - push_indice_fx( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); } /*st_fx->lowrate_pitchGain = 0.9f * st_fx->lowrate_pitchGain + 0.1f * gain_pit;*/ - hSpMusClas->lowrate_pitchGain = round_fx_o( L_mac_o( L_mult( 29491, hSpMusClas->lowrate_pitchGain ), 6554, gain_pit, &Overflow ), &Overflow ); /*Q14*Q16(0.1) + Q15 -> Q15*/ + hSpMusClas->lowrate_pitchGain = round_fx_sat( L_mac_sat( L_mult( 29491, hSpMusClas->lowrate_pitchGain ), 6554, gain_pit ) ); /*Q14*Q16(0.1) + Q15 -> Q15*/ gpit_tmp = gain_pit; move16(); /*Q14*/ @@ -312,15 +309,15 @@ void enc_pit_exc_fx( IF( GE_32( st_fx->core_brate, MIN_RATE_FCB ) ) { pit_idx = vquant_fx( &gain_pit, mean_gp_fx, &gain_pit, dic_gp_fx, 1, 32 ); /* Q0 */ - push_indice_fx( hBstr, IND_PIT_IDX, pit_idx, 5 ); + push_indice( hBstr, IND_PIT_IDX, pit_idx, 5 ); } ELSE { pit_idx = vquant_fx( &gain_pit, mean_gp_fx, &gain_pit, dic_gp_fx, 1, 16 ); /* Q0 */ - push_indice_fx( hBstr, IND_PIT_IDX, pit_idx, 4 ); + push_indice( hBstr, IND_PIT_IDX, pit_idx, 4 ); } } - else if ( use_fcb == 2 ) + ELSE IF( use_fcb == 2 ) { /*-----------------------------------------------------------------* * Innovation encoding @@ -333,7 +330,8 @@ void enc_pit_exc_fx( * Gain encoding *-----------------------------------------------------------------*/ - gain_enc_lbr_fx( st_fx->hBstr, st_fx->acelp_cfg.gains_mode, GENERIC, i_subfr, xn, y1, shift_wsp, y2, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, gc_mem, gp_mem, clip_gain, 2 * L_SUBFR ); + gain_enc_lbr_fx( st_fx->hBstr, st_fx->acelp_cfg.gains_mode, GENERIC, i_subfr, xn, y1, shift_wsp, y2, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, gc_mem, gp_mem, clip_gain, 2 * L_SUBFR, + st_fx->element_mode ); } ELSE { @@ -343,12 +341,15 @@ void enc_pit_exc_fx( inov_encode_fx( st_fx, Local_BR, 0, st_fx->L_frame, st_fx->last_L_frame, LOCAL_CT, WB, 1, i_subfr, -1, p_Aq, gain_pit, cn, exc, h2, hLPDmem->tilt_code, *pt_pitch, xn2, code, y2, &unbits_PI, L_SUBFR, shift ); + /*-----------------------------------------------------------------* * Gain encoding *-----------------------------------------------------------------*/ + gain_enc_mless_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_FRAME, i_subfr, -1, xn, y1, shift_wsp, y2, code, Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); } + gp_clip_test_gain_pit_fx( st_fx->element_mode, st_fx->core_brate, gain_pit, st_fx->clip_var_fx ); Lgcode = L_shl_sat( gain_code, Q_new ); /* scaled gain_code with Qnew -> Q16*/ @@ -363,18 +364,20 @@ void enc_pit_exc_fx( hLPDmem->tilt_code = 0; move16(); } + /*-----------------------------------------------------------------* * Update memory of the weighting filter *-----------------------------------------------------------------*/ + IF( use_fcb != 0 ) { - Ltmp = L_mult( gcode16, y2[L_subfr - 1] ); /* Q10 + Q_new */ - Ltmp = L_shl_o( Ltmp, add( 5, shift ), &Overflow ); /* Q15 + Q_new + shift */ + Ltmp = L_mult( gcode16, y2[L_subfr - 1] ); /* Q10 + Q_new */ + Ltmp = L_shl_sat( Ltmp, add( 5, shift ) ); /* Q15 + Q_new + shift */ Ltmp = L_negate( Ltmp ); - Ltmp = L_mac_o( Ltmp, xn[L_subfr - 1], 16384, &Overflow ); /* Q_new + Q15 + shift */ - Ltmp = L_msu_o( Ltmp, y1[L_subfr - 1], gain_pit, &Overflow ); /* Q_new + Q15 + shift */ - Ltmp = L_shl_o( Ltmp, sub( 1, shift ), &Overflow ); /* Q_new + 15 */ - hLPDmem->mem_w0 = round_fx_o( Ltmp, &Overflow ); /*Q_new-1 */ + Ltmp = L_mac_sat( Ltmp, xn[L_subfr - 1], 16384 ); /* Q_new + Q15 + shift */ + Ltmp = L_msu_sat( Ltmp, y1[L_subfr - 1], gain_pit ); /* Q_new + Q15 + shift */ + Ltmp = L_shl_sat( Ltmp, sub( 1, shift ) ); /* Q_new + 15 */ + hLPDmem->mem_w0 = round_fx_sat( Ltmp ); /*Q_new-1 */ move16(); } ELSE @@ -390,16 +393,17 @@ void enc_pit_exc_fx( * Construct adaptive part of the excitation * Save the non-enhanced excitation for FEC_exc *-----------------------------------------------------------------*/ + IF( use_fcb != 0 ) { FOR( i = 0; i < L_subfr; i++ ) { /* code in Q9, gain_pit in Q14 */ - Ltmp = L_mult( gcode16, code[i] ); /* Q10 + Q_new */ - Ltmp = L_shl_o( Ltmp, 5, &Overflow ); /* Q15 + Q_new */ - Ltmp = L_mac_o( Ltmp, exc[i + i_subfr], gain_pit, &Overflow ); /* Q15 + Q_new */ - Ltmp = L_shl_o( Ltmp, 1, &Overflow ); /* saturation can occur here Q_new + Q16*/ - exc[i + i_subfr] = round_fx_o( Ltmp, &Overflow ); /* Q_new */ + Ltmp = L_mult( gcode16, code[i] ); /* Q10 + Q_new */ + Ltmp = L_shl_sat( Ltmp, 5 ); /* Q15 + Q_new */ + Ltmp = L_mac_sat( Ltmp, exc[i + i_subfr], gain_pit ); /* Q15 + Q_new */ + Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q_new + Q16*/ + exc[i + i_subfr] = round_fx_sat( Ltmp ); /* Q_new */ move16(); } } @@ -409,7 +413,7 @@ void enc_pit_exc_fx( { Ltmp = L_mult( exc[i + i_subfr], gain_pit ); /* Q15 + Q_new */ - Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16 + Q_new */ + Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16 + Q_new */ exc[i + i_subfr] = round_fx_sat( Ltmp ); /* Q_new */ } } @@ -522,10 +526,13 @@ void enc_pit_exc_fx( } } - cum_gpit = shl_o( cum_gpit, 1, &Overflow ); /*Q15*/ + cum_gpit = shl_sat( cum_gpit, 1 ); /*Q15*/ *gpit = round_fx( L_mac( L_mult( 3277, *gpit ), 29491, cum_gpit ) ); /*Q15*/ + + return; } + void enc_pit_exc_ivas_fx( Encoder_State *st_fx, /* i/o: State structure */ const Word16 *speech, /* i : Input speech Q_new-1*/ @@ -540,29 +547,29 @@ void enc_pit_exc_ivas_fx( Word16 *pitch_buf, /* i/o: Fractionnal per subframe pitch Q6*/ const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ Word16 *gpit, /* o : pitch mean gpit Q15*/ - Word16 *saved_bit_pos, /* o : saved position in the bitstream before pitch contribution Q0*/ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ - const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer Q6*/ + Word16 *saved_bit_pos, /* o : saved position in the bitstream before pitch contribution Q0*/ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ + const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer Q6*/ Word16 Q_new, Word16 shift ) { Word16 xn[PIT_EXC_L_SUBFR]; /* Target vector for pitch search */ Word16 xn2[PIT_EXC_L_SUBFR]; /* Target vector for codebook search */ Word16 h1[PIT_EXC_L_SUBFR + ( M + 1 )]; /* Impulse response vector */ - Word16 y1[PIT_EXC_L_SUBFR]; /* Filtered adaptive excitation */ - Word16 code[2 * L_SUBFR]; /* Fixed codebook excitation */ - Word16 y2[2 * L_SUBFR]; /* Filtered algebraic excitation */ - Word16 voice_fac; /* Voicing factor */ - Word32 gain_code; /* Gain of code */ - Word16 gain_inov; /* inovation gain */ - Word16 gain_pit; /* Pitch gain */ - Word16 pit_idx, i_subfr; /* tmp variables */ - Word16 T0_min, T0_max; /* pitch variables */ - Word16 g_corr[10]; /* ACELP correlation values + gain pitch */ - Word16 clip_gain, i; /* LSF clip gain and LP flag */ - const Word16 *p_Aw, *p_Aq; /* pointer to LP filter coefficient vector */ - Word16 cn1[PIT_EXC_L_SUBFR], *cn; /* (Used only when L_subfr == L_SUBFR) Target vector in residual domain */ - Word16 *pt_pitch; /* pointer to floating pitch */ + Word16 cn[PIT_EXC_L_SUBFR]; + Word16 y1[PIT_EXC_L_SUBFR]; /* Filtered adaptive excitation */ + Word16 code[2 * L_SUBFR]; /* Fixed codebook excitation */ + Word16 y2[2 * L_SUBFR]; /* Filtered algebraic excitation */ + Word16 voice_fac; /* Voicing factor */ + Word32 gain_code; /* Gain of code */ + Word16 gain_inov; /* inovation gain */ + Word16 gain_pit; /* Pitch gain */ + Word16 pit_idx, i_subfr; /* tmp variables */ + Word16 T0_min, T0_max; /* pitch variables */ + Word16 g_corr[10]; /* ACELP correlation values + gain pitch */ + Word16 clip_gain, i; /* LSF clip gain and LP flag */ + const Word16 *p_Aw, *p_Aq; /* pointer to LP filter coefficient vector */ + Word16 *pt_pitch; /* pointer to floating pitch */ Word16 L_subfr; Word16 cum_gpit, gpit_tmp; Word32 Local_BR, Pitch_BR; @@ -578,17 +585,10 @@ void enc_pit_exc_ivas_fx( Word16 use_fcb; Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes*/ -#ifndef FIX_ISSUE_1376 - Word16 h1_q15[PIT_EXC_L_SUBFR + ( M + 1 )]; -#endif Word16 q_h1; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; GSC_ENC_HANDLE hGSCEnc = st_fx->hGSCEnc; LPD_state_HANDLE hLPDmem = st_fx->hLPDmem; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*------------------------------------------------------------------* * Initialization @@ -602,9 +602,7 @@ void enc_pit_exc_ivas_fx( move16(); Pitch_CT = GENERIC; move16(); -#ifdef MSAN_FIX - set16_fx( cn1, 0, PIT_EXC_L_SUBFR ); -#endif + set16_fx( cn, 0, PIT_EXC_L_SUBFR ); test(); test(); IF( st_fx->GSC_IVAS_mode > 0 && ( st_fx->GSC_noisy_speech || GT_32( st_fx->core_brate, GSC_H_RATE_STG ) ) ) @@ -642,7 +640,6 @@ void enc_pit_exc_ivas_fx( } ELSE { - Local_BR = ACELP_7k20; move32(); Pitch_BR = st_fx->core_brate; @@ -714,18 +711,12 @@ void enc_pit_exc_ivas_fx( /*------------------------------------------------------------------* * ACELP subframe loop *------------------------------------------------------------------*/ - cn = NULL; - test(); - if ( EQ_16( L_subfr, L_SUBFR ) || EQ_16( L_subfr, L_SUBFR * 2 ) ) - { - cn = cn1; - move16(); - } - p_Aw = Aw; + p_Aw = Aw; p_Aq = Aq; pt_pitch = pitch_buf; /* pointer to the pitch buffer */ shift_wsp = add( Q_new, shift ); + FOR( i_subfr = 0; i_subfr < st_fx->L_frame; i_subfr += L_subfr ) { @@ -735,6 +726,7 @@ void enc_pit_exc_ivas_fx( * target in residual domain "cn" * Compute impulse response, h1[], of weighted synthesis filter *----------------------------------------------------------------*/ + Copy( &res[i_subfr], &exc[i_subfr], L_subfr ); /* Q_new */ /* condition on target (compared to float) has been put outside the loop */ @@ -752,16 +744,17 @@ void enc_pit_exc_ivas_fx( * Adaptive exc. construction *----------------------------------------------------------------*/ - *pt_pitch = pit_encode_ivas_fx( hBstr, st_fx->acelp_cfg.pitch_bits, Pitch_BR, 0, st_fx->L_frame, Pitch_CT, &pitch_limit_flag, i_subfr, exc, - L_subfr, st_fx->pitch, &T0_min, &T0_max, T0, T0_frac, h1, xn, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf, Q_new ); /* Q6 */ - move16(); + *pt_pitch = pit_encode_fx( hBstr, st_fx->acelp_cfg.pitch_bits, Pitch_BR, 0, st_fx->L_frame, Pitch_CT, &pitch_limit_flag, i_subfr, exc, + L_subfr, st_fx->pitch, &T0_min, &T0_max, T0, T0_frac, h1, xn, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf, st_fx->element_mode, Q_new ); /* Q6 */ + Scale_sig( h1, L_subfr, sub( 14, q_h1 ) ); /* set h1[] in Q14 with scaling for convolution Q14*/ /*-----------------------------------------------------------------* * Find adaptive exitation *-----------------------------------------------------------------*/ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_subfr + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_subfr + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + /*-----------------------------------------------------------------* * Gain clipping test to avoid unstable synthesis on frame erasure * or in case of floating point encoder & fixed p. decoder @@ -773,20 +766,17 @@ void enc_pit_exc_ivas_fx( * Codebook target computation * (No LP filtering of the adaptive excitation) *-----------------------------------------------------------------*/ -#ifndef FIX_ISSUE_1376 - Copy_Scale_sig( h1, h1_q15, L_subfr, 1 ); // Q14 -> Q15 - - lp_select = lp_filt_exc_enc_ivas_fx( MODE1, AUDIO, i_subfr, exc, h1_q15, - xn, y1, xn2, L_subfr, st_fx->L_frame, g_corr, clip_gain, &gain_pit, &lp_flag ); /* Q0 */ -#else - lp_select = lp_filt_exc_enc_ivas_fx( MODE1, AUDIO, i_subfr, exc, h1, - xn, y1, xn2, L_subfr, st_fx->L_frame, g_corr, clip_gain, &gain_pit, &lp_flag ); /* Q0 */ -#endif + + lp_select = lp_filt_exc_enc_fx( MODE1, AUDIO, i_subfr, exc, h1, xn, y1, xn2, L_subfr, st_fx->L_frame, g_corr, clip_gain, &gain_pit, &lp_flag ); /* Q0 */ + + IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); } + st_fx->hSpMusClas->lowrate_pitchGain = mac_r( L_mult( 29491 /* 0.9 in Q15 */, st_fx->hSpMusClas->lowrate_pitchGain ), 3277 /* 0.1 in Q15 */, gain_pit ); /* Q14 */ + gpit_tmp = gain_pit; move16(); /*Q14*/ test(); @@ -810,7 +800,7 @@ void enc_pit_exc_ivas_fx( push_indice( hBstr, IND_PIT_IDX, pit_idx, 4 ); } } - else if ( use_fcb == 2 ) + ELSE IF( use_fcb == 2 ) { /*-----------------------------------------------------------------* * Innovation encoding @@ -823,7 +813,8 @@ void enc_pit_exc_ivas_fx( * Gain encoding *-----------------------------------------------------------------*/ - gain_enc_lbr_ivas_fx( st_fx->hBstr, st_fx->acelp_cfg.gains_mode, GENERIC, i_subfr, xn, y1, sub( shift_wsp, 1 ), y2, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, gc_mem, gp_mem, clip_gain, 2 * L_SUBFR ); + gain_enc_lbr_fx( st_fx->hBstr, st_fx->acelp_cfg.gains_mode, GENERIC, i_subfr, xn, y1, sub( shift_wsp, 1 ), y2, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, gc_mem, gp_mem, clip_gain, 2 * L_SUBFR, + st_fx->element_mode ); } ELSE { @@ -833,19 +824,22 @@ void enc_pit_exc_ivas_fx( inov_encode_ivas_fx( st_fx, Local_BR, 0, st_fx->L_frame, st_fx->last_L_frame, LOCAL_CT, WB, 1, i_subfr, -1, p_Aq, gain_pit, cn, exc, h2, hLPDmem->tilt_code, *pt_pitch, xn2, code, y2, &unbits_PI, L_SUBFR, shift, Q_new ); + /*-----------------------------------------------------------------* * Gain encoding *-----------------------------------------------------------------*/ - gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_FRAME, i_subfr, -1, xn, y1, sub( shift_wsp, 1 ), y2, code, Es_pred, - &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); + + gain_enc_mless_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, st_fx->L_frame, i_subfr, -1, xn, y1, sub( shift_wsp, 1 ), y2, code, Es_pred, + &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); } + gp_clip_test_gain_pit_fx( st_fx->element_mode, st_fx->core_brate, gain_pit, st_fx->clip_var_fx ); Lgcode = L_shl_sat( gain_code, Q_new ); /* scaled gain_code with Qnew -> Q16*/ gcode16 = round_fx_sat( Lgcode ); IF( use_fcb != 0 ) { - hLPDmem->tilt_code = est_tilt_ivas_fx( &exc[i_subfr], gain_pit, code, gain_code, &voice_fac, Q_new, L_SUBFR, 0 ); // Q15 + hLPDmem->tilt_code = est_tilt_ivas_fx( &exc[i_subfr], gain_pit, code, gain_code, &voice_fac, Q_new, L_subfr, 0 ); // Q15 move16(); } ELSE @@ -853,18 +847,20 @@ void enc_pit_exc_ivas_fx( hLPDmem->tilt_code = 0; move16(); } + /*-----------------------------------------------------------------* * Update memory of the weighting filter *-----------------------------------------------------------------*/ + IF( use_fcb != 0 ) { Ltmp = L_mult0( gcode16, y2[L_subfr - 1] ); - Ltmp = L_shl_o( Ltmp, add( 5, shift ), &Overflow ); // Q_new+14+shift + Ltmp = L_shl_sat( Ltmp, add( 5, shift ) ); // Q_new+14+shift Ltmp = L_negate( Ltmp ); - Ltmp = L_mac_o( Ltmp, xn[L_subfr - 1], 16384, &Overflow ); // Q_new-1+15+shift - Ltmp = L_msu_o( Ltmp, y1[L_subfr - 1], gain_pit, &Overflow ); // Q_new-1+15+shift - Ltmp = L_shl_o( Ltmp, sub( 1, shift ), &Overflow ); // Q_new+15 - hGSCEnc->mem_w0_tmp_fx = round_fx_o( Ltmp, &Overflow ); /*Q_new-1 */ + Ltmp = L_mac_sat( Ltmp, xn[L_subfr - 1], 16384 ); // Q_new-1+15+shift + Ltmp = L_msu_sat( Ltmp, y1[L_subfr - 1], gain_pit ); // Q_new-1+15+shift + Ltmp = L_shl_sat( Ltmp, sub( 1, shift ) ); // Q_new+15 + hGSCEnc->mem_w0_tmp_fx = round_fx_sat( Ltmp ); /*Q_new-1 */ } ELSE { @@ -878,16 +874,17 @@ void enc_pit_exc_ivas_fx( * Construct adaptive part of the excitation * Save the non-enhanced excitation for FEC_exc *-----------------------------------------------------------------*/ + IF( use_fcb != 0 ) { FOR( i = 0; i < L_subfr; i++ ) { /* code in Q9, gain_pit in Q14 */ - Ltmp = L_mult( gcode16, code[i] ); /* Q10 + Q_new */ - Ltmp = L_shl_o( Ltmp, 5, &Overflow ); /* Q15 + Q_new */ - Ltmp = L_mac_o( Ltmp, exc[i + i_subfr], gain_pit, &Overflow ); /* Q15 + Q_new */ - Ltmp = L_shl_o( Ltmp, 1, &Overflow ); /* saturation can occur here Q16 + Q_new */ - exc[i + i_subfr] = round_fx_o( Ltmp, &Overflow ); /* Q_new */ + Ltmp = L_mult( gcode16, code[i] ); /* Q10 + Q_new */ + Ltmp = L_shl_sat( Ltmp, 5 ); /* Q15 + Q_new */ + Ltmp = L_mac_sat( Ltmp, exc[i + i_subfr], gain_pit ); /* Q15 + Q_new */ + Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16 + Q_new */ + exc[i + i_subfr] = round_fx_sat( Ltmp ); /* Q_new */ move16(); } } @@ -897,7 +894,7 @@ void enc_pit_exc_ivas_fx( { Ltmp = L_mult( exc[i + i_subfr], gain_pit ); /* Q15 + Q_new */ - Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16 + Q_new */ + Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16 + Q_new */ exc[i + i_subfr] = round_fx_sat( Ltmp ); /* Q_new */ move16(); } @@ -1011,6 +1008,8 @@ void enc_pit_exc_ivas_fx( } } - cum_gpit = shl_o( cum_gpit, 1, &Overflow ); /*Q15*/ + cum_gpit = shl_sat( cum_gpit, 1 ); /*Q15*/ *gpit = round_fx( L_mac( L_mult( 3277, *gpit ), 29491, cum_gpit ) ); /*Q15*/ + + return; } diff --git a/lib_enc/enc_ppp_fx.c b/lib_enc/enc_ppp_fx.c index c2aeaa7ca3d4ec2d9aad3c65eb64e7cac8177e6c..70360f9d2c281e2c988ab6e82ac103f5d98dd708 100644 --- a/lib_enc/enc_ppp_fx.c +++ b/lib_enc/enc_ppp_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -19,50 +19,50 @@ void E_LPC_f_lsp_a_conversion( const Word16 *lsp, Word16 *a, const Word16 m ); /* PURPOSE : */ /*---------------------------------------------------------------------------------------*/ /* INPUT ARGUMENTS : */ -/* _ (Word16) speech_fx[], i : input speech Q_new */ -/* _ (Word16) Aq_fx[], i : 12k8 Lp coefficient Q12 */ +/* _ (Word16) speech_fx[], i : input speech Q_new */ +/* _ (Word16) Aq_fx[], i : 12k8 Lp coefficient Q12 */ /* _ (Word16) A_fx[], i : unquantized A(z) filter with bandwidth expansion Q12*/ -/* _ (Word16) coder_type, i : coding type */ -/* _ (Word16) T_op_fx[], i : open loop pitch */ -/* _ (Word16) voicing_fx[], i : voicing Q15 */ -/* _ (Word16) *res_fx, i : residual signal Q_new */ -/* _ (Word16) Q_new i : Q factor for res */ -/* _ (Word16) vadsnr_fx i : SNR for current frame Q7 */ +/* _ (Word16) coder_type, i : coding type */ +/* _ (Word16) T_op_fx[], i : open loop pitch */ +/* _ (Word16) voicing_fx[], i : voicing Q15 */ +/* _ (Word16) *res_fx, i : residual signal Q_new */ +/* _ (Word16) Q_new i : Q factor for res */ +/* _ (Word16) vadsnr_fx i : SNR for current frame Q7 */ /*---------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16) *exc2_fx, o : current enhanced excitation Q0 */ -/* _ (Word16) *pitch_buf_fx, o : floating pitch values for each subframe Q6 */ -/* _ (Word16) *synth_fx, o : core synthesis Q-1 */ -/* _ Encoder_State *st_fx: */ -/* _ lastLgainE_fx - Q11 */ -/* _ lastHgainE_fx - Q11 */ -/* _ lasterbE_fx - Q13 */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16) *exc2_fx, o : current enhanced excitation Q0 */ +/* _ (Word16) *pitch_buf_fx, o : floating pitch values for each subframe Q6 */ +/* _ (Word16) *synth_fx, o : core synthesis Q-1 */ +/* _ Encoder_State *st_fx: */ +/* _ lastLgainE_fx - Q11 */ +/* _ lastHgainE_fx - Q11 */ +/* _ lasterbE_fx - Q13 */ /*---------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ Encoder_State *st_fx: */ -/* _ st_fx->dtfs_enc_xxxx */ -/* _ a nd b in st_fx->dtfs_enc_Q */ -/* rest all in Q0 */ -/* - bump_up_fx - Q0 */ -/* _ (Word16) *exc_fx, o : current enhanced excitation Q0 */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ Encoder_State *st_fx: */ +/* _ st_fx->dtfs_enc_xxxx */ +/* _ a nd b in st_fx->dtfs_enc_Q */ +/* rest all in Q0 */ +/* - bump_up_fx - Q0 */ +/* _ (Word16) *exc_fx, o : current enhanced excitation Q0 */ /*---------------------------------------------------------------------------------------*/ /* RETURN ARGUMENTS : */ -/* _ None. */ +/* _ None. */ /*---------------------------------------------------------------------------------------*/ /* CALLED FROM : TX */ /*=======================================================================================*/ ivas_error encod_ppp_fx( Encoder_State *st_fx, /* i/o: state structure */ - const Word16 speech_fx[], /* i : input speech Q_new*/ - const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes Q12*/ - const Word16 Aq_fx[], /* i : 12k8 Lp coefficient Q14*/ - Word16 *res_fx, /* i : residual signal Q_new*/ - Word16 *synth_fx, /* o : core synthesis Q-1*/ - Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/ - Word16 *exc2_fx, /* o : current enhanced excitation Q0*/ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_new*/ + const Word16 speech_fx[], /* i : input speech Q_new*/ + const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes Q12*/ + const Word16 Aq_fx[], /* i : 12k8 Lp coefficient Q14*/ + Word16 *res_fx, /* i : residual signal Q_new*/ + Word16 *synth_fx, /* o : core synthesis Q-1*/ + Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/ + Word16 *exc2_fx, /* o : current enhanced excitation Q0*/ + Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_new*/ Word16 Q_new, Word16 shift ) { @@ -189,8 +189,7 @@ ivas_error encod_ppp_fx( /* We write signalling indices again only in case of bump_up */ /* delete previous indices */ - reset_indices_enc_fx( hBstr, MAX_NUM_INDICES ); - + reset_indices_enc_fx( hBstr, hBstr->nb_ind_tot ); /* signalling matrix (writing of signalling bits) */ signalling_enc_fx( st_fx ); } @@ -237,16 +236,16 @@ ivas_error encod_ppp_fx( ivas_error encod_ppp_ivas_fx( Encoder_State *st_fx, /* i/o: state structure */ - const Word16 speech_fx[], /* i : input speech Q_new*/ - const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes Q12*/ + const Word16 speech_fx[], /* i : input speech Q_new*/ + const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes Q12*/ const Word16 Aq_fx[], /* i : 12k8 Lp coefficient Q12*/ - Word16 *res_fx, /* i : residual signal Q_new*/ - Word16 *synth_fx, /* o : core synthesis Q-1*/ - Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/ - Word16 *exc2_fx, /* o : current enhanced excitation Q0*/ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_new*/ + Word16 *res_fx, /* i : residual signal Q_new*/ + Word16 *synth_fx, /* o : core synthesis Q-1*/ + Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/ + Word16 *exc2_fx, /* o : current enhanced excitation Q0*/ + Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_new*/ Word16 Q_new, Word16 shift ) { @@ -373,8 +372,7 @@ ivas_error encod_ppp_ivas_fx( /* We write signalling indices again only in case of bump_up */ /* delete previous indices */ - reset_indices_enc_fx( hBstr, MAX_NUM_INDICES ); - + reset_indices_enc_fx( hBstr, hBstr->nb_ind_tot ); /* signalling matrix (writing of signalling bits) */ signalling_enc_fx( st_fx ); } diff --git a/lib_enc/enc_prm_fx.c b/lib_enc/enc_prm_fx.c index ecd4e2f013b4bb937d8fa8cb5d8f88a19b1482b6..6a861b8aff23a5fe0ad63888449f9b3eccfb3a97 100644 --- a/lib_enc/enc_prm_fx.c +++ b/lib_enc/enc_prm_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -8,7 +8,6 @@ #include #include "options.h" #include "cnst.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "stl.h" #include "prot_fx.h" @@ -33,7 +32,7 @@ static void enc_prm_hm( } /* Flag */ - push_next_indice_fx( hBstr, prm_hm[0], 1 ); + push_next_indice( hBstr, prm_hm[0], 1 ); IF( prm_hm[0] ) { @@ -50,7 +49,7 @@ static void enc_prm_hm( IF( EQ_16( st->hTcxCfg->coder_type, VOICED ) ) { /* Gain index */ - push_next_indice_fx( hBstr, prm_hm[2], kTcxHmNumGainBits ); + push_next_indice( hBstr, prm_hm[2], kTcxHmNumGainBits ); } } } @@ -152,7 +151,7 @@ void enc_prm_rf_ivas_fx( index = 3; move16(); } - push_next_indice_fx( hBstr, index, 2 ); + push_next_indice( hBstr, index, 2 ); IF( EQ_16( rf_frame_type, RF_TCXFD ) ) { @@ -296,9 +295,9 @@ void enc_prm_rf_fx( /* LSF indices */ IF( EQ_16( rf_frame_type, RF_TCXFD ) ) { - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][0], lsf_numbits[0] ); /* VQ 1 */ - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][1], lsf_numbits[1] ); /* VQ 2 */ - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][2], lsf_numbits[2] ); /* VQ 3 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][0], lsf_numbits[0] ); /* VQ 1 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][1], lsf_numbits[1] ); /* VQ 2 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][2], lsf_numbits[2] ); /* VQ 3 */ } /* classification */ @@ -324,12 +323,12 @@ void enc_prm_rf_fx( index = 3; move16(); } - push_next_indice_fx( hBstr, index, 2 ); + push_next_indice( hBstr, index, 2 ); IF( EQ_16( rf_frame_type, RF_TCXFD ) ) { /* TCX global gain = 7 bits */ - push_next_indice_fx( hBstr, hRF->rf_gain_tcx[fec_offset], 7 ); + push_next_indice( hBstr, hRF->rf_gain_tcx[fec_offset], 7 ); /*window info 1 bit for long overlap 2 if minimum or half overlap*/ @@ -345,35 +344,35 @@ void enc_prm_rf_fx( test(); IF( ( EQ_16( rf_frame_type, RF_TCXTD1 ) || EQ_16( rf_frame_type, RF_TCXTD2 ) ) && hTcxEnc->tcxltp != 0 ) { - push_next_indice_fx( hBstr, hRF->rf_tcxltp_param[fec_offset], 9 ); + push_next_indice( hBstr, hRF->rf_tcxltp_param[fec_offset], 9 ); } } } ELSE IF( EQ_16( rf_frame_type, 7 ) ) /* NELP bitstream writing */ { /* LSF indices */ - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][0], 8 ); /* VQ 1 */ - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][1], 8 ); /* VQ 2 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][0], 8 ); /* VQ 1 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][1], 8 ); /* VQ 2 */ /* NELP gain indices */ - push_next_indice_fx( hBstr, hRF->rf_indx_nelp_iG1[fec_offset], 5 ); - push_next_indice_fx( hBstr, hRF->rf_indx_nelp_iG2[fec_offset][0], 6 ); - push_next_indice_fx( hBstr, hRF->rf_indx_nelp_iG2[fec_offset][1], 6 ); + push_next_indice( hBstr, hRF->rf_indx_nelp_iG1[fec_offset], 5 ); + push_next_indice( hBstr, hRF->rf_indx_nelp_iG2[fec_offset][0], 6 ); + push_next_indice( hBstr, hRF->rf_indx_nelp_iG2[fec_offset][1], 6 ); /* NELP filter selection index */ - push_next_indice_fx( hBstr, hRF->rf_indx_nelp_fid[fec_offset], 2 ); + push_next_indice( hBstr, hRF->rf_indx_nelp_fid[fec_offset], 2 ); /* tbe gainFr */ - push_next_indice_fx( hBstr, hRF->rf_indx_tbeGainFr[fec_offset], 5 ); + push_next_indice( hBstr, hRF->rf_indx_tbeGainFr[fec_offset], 5 ); } ELSE IF( GE_16( rf_frame_type, 4 ) ) /* rf_frame_type ALL_PRED: 4, NO_PRED: 5, GEN_PRED: 6 */ { /* LSF indices */ - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][0], 8 ); /* VQ 1 */ - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][1], 8 ); /* VQ 2 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][0], 8 ); /* VQ 1 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][1], 8 ); /* VQ 2 */ /* ES pred */ - push_next_indice_fx( hBstr, hRF->rf_indx_EsPred[fec_offset], 3 ); + push_next_indice( hBstr, hRF->rf_indx_EsPred[fec_offset], 3 ); ltp_mode = ACELP_LTP_MODE[1][1][rf_frame_type]; /* Q0 */ ltf_mode = ACELP_LTF_MODE[1][1][rf_frame_type]; /* Q0 */ @@ -386,13 +385,13 @@ void enc_prm_rf_fx( n = ACELP_LTP_BITS_SFR[ltp_mode][sfr]; IF( n != 0 ) { - push_next_indice_fx( hBstr, hRF->rf_indx_pitch[fec_offset][sfr], n ); + push_next_indice( hBstr, hRF->rf_indx_pitch[fec_offset][sfr], n ); } /* Adaptive codebook filtering (1 bit) */ IF( EQ_16( ltf_mode, 2 ) ) { - push_next_indice_fx( hBstr, hRF->rf_indx_ltfMode[fec_offset][sfr], 1 ); + push_next_indice( hBstr, hRF->rf_indx_ltfMode[fec_offset][sfr], 1 ); } /*Innovative codebook*/ @@ -403,7 +402,7 @@ void enc_prm_rf_fx( ( EQ_16( rf_frame_type, RF_GENPRED ) && ( sfr == 0 || EQ_16( sfr, 2 ) ) ) ) { - push_next_indice_fx( hBstr, hRF->rf_indx_fcb[fec_offset][sfr], 7 ); + push_next_indice( hBstr, hRF->rf_indx_fcb[fec_offset][sfr], 7 ); } /* Gains (5b, 6b or 7b / subfr) */ @@ -411,11 +410,11 @@ void enc_prm_rf_fx( IF( sfr == 0 || EQ_16( sfr, 2 ) ) { n = ACELP_GAINS_BITS[gains_mode]; - push_next_indice_fx( hBstr, hRF->rf_indx_gain[fec_offset][sfr], n ); + push_next_indice( hBstr, hRF->rf_indx_gain[fec_offset][sfr], n ); } } /* tbe gainFr */ - push_next_indice_fx( hBstr, hRF->rf_indx_tbeGainFr[fec_offset], 2 ); + push_next_indice( hBstr, hRF->rf_indx_tbeGainFr[fec_offset], 2 ); } /***************/ @@ -429,15 +428,15 @@ void enc_prm_rf_fx( test(); IF( EQ_16( fec_offset, 2 ) ) { - push_next_indice_fx( hBstr, 0, 2 ); + push_next_indice( hBstr, 0, 2 ); } ELSE IF( EQ_16( fec_offset, 3 ) || EQ_16( fec_offset, 5 ) || EQ_16( fec_offset, 7 ) ) { - push_next_indice_fx( hBstr, ( fec_offset - 1 ) / 2, 2 ); + push_next_indice( hBstr, ( fec_offset - 1 ) / 2, 2 ); } /* write RF frame type last in the bitstream */ - push_next_indice_fx( hBstr, rf_frame_type, 3 ); + push_next_indice( hBstr, rf_frame_type, 3 ); } @@ -533,7 +532,7 @@ void enc_prm_fx( IF( st->tcxonly ) { - push_next_indice_fx( hBstr, core == TCX_10_CORE, 1 ); + push_next_indice( hBstr, core == TCX_10_CORE, 1 ); { index = 3; move16(); @@ -553,7 +552,7 @@ void enc_prm_fx( index = 2; move16(); } - push_next_indice_fx( hBstr, index, 2 ); + push_next_indice( hBstr, index, 2 ); } } ELSE @@ -581,13 +580,13 @@ void enc_prm_fx( { idx = add( idx, 1 ); /* Q0 */ } - push_next_indice_fx( hBstr, idx - start_idx, nBits ); - push_next_indice_fx( hBstr, 0, 1 ); /* Indicate to the decoder that the core is ACELP*/ - nbits_start = 3; /* Q0 */ + push_next_indice( hBstr, idx - start_idx, nBits ); + push_next_indice( hBstr, 0, 1 ); /* Indicate to the decoder that the core is ACELP*/ + nbits_start = 3; /* Q0 */ } ELSE { - push_next_indice_fx( hBstr, coder_type, 3 ); + push_next_indice( hBstr, coder_type, 3 ); } } ELSE @@ -595,15 +594,15 @@ void enc_prm_fx( IF( EQ_16( st->mdct_sw, MODE1 ) ) { /* 2 bits instead of 3 as TCX is already signaled */ - push_next_indice_fx( hBstr, st->hTcxCfg->coder_type, 2 ); + push_next_indice( hBstr, st->hTcxCfg->coder_type, 2 ); } ELSE { IF( EQ_16( st->mdct_sw_enable, MODE2 ) ) { - push_next_indice_fx( hBstr, 1, 1 ); /* TCX */ - push_next_indice_fx( hBstr, 0, 1 ); /* not HQ_CORE */ - push_next_indice_fx( hBstr, st->hTcxCfg->coder_type, 2 ); + push_next_indice( hBstr, 1, 1 ); /* TCX */ + push_next_indice( hBstr, 0, 1 ); /* not HQ_CORE */ + push_next_indice( hBstr, st->hTcxCfg->coder_type, 2 ); } ELSE { @@ -641,13 +640,13 @@ void enc_prm_fx( { idx = add( idx, 1 ); } - push_next_indice_fx( hBstr, idx - start_idx, nBits ); - push_next_indice_fx( hBstr, 1, 1 ); /* Indicate to the decoder that the core is TCX*/ + push_next_indice( hBstr, idx - start_idx, nBits ); + push_next_indice( hBstr, 1, 1 ); /* Indicate to the decoder that the core is TCX*/ nbits_start = 3; } ELSE { - push_next_indice_fx( hBstr, 4 + st->hTcxCfg->coder_type, 3 ); + push_next_indice( hBstr, 4 + st->hTcxCfg->coder_type, 3 ); } } } @@ -667,7 +666,7 @@ void enc_prm_fx( tmp = TCX_20_CORE; move16(); } - push_next_indice_fx( hBstr, tmp, 1 ); + push_next_indice( hBstr, tmp, 1 ); } /* write TCX overlap mode (1 bit: full, 2 bits: half or no overlap) */ @@ -696,7 +695,7 @@ void enc_prm_fx( overlap_code = 0; move16(); } - push_next_indice_fx( hBstr, overlap_code, nbits_tcx ); + push_next_indice( hBstr, overlap_code, nbits_tcx ); } IF( st->hPlcExt->enableGplc ) @@ -719,7 +718,7 @@ void enc_prm_fx( IF( EQ_16( core, ACELP_CORE ) ) { - push_next_indice_fx( hBstr, st->glr_idx[0], G_LPC_RECOVERY_BITS ); + push_next_indice( hBstr, st->glr_idx[0], G_LPC_RECOVERY_BITS ); } } @@ -789,7 +788,7 @@ void enc_prm_fx( IF( n != 0 ) { - push_next_indice_fx( hBstr, st->bpf_gain_param, n ); + push_next_indice( hBstr, st->bpf_gain_param, n ); } /* Mean energy (2 or 3 bits) */ @@ -797,7 +796,7 @@ void enc_prm_fx( IF( n != 0 ) { - push_next_indice_fx( hBstr, prm[j++], n ); + push_next_indice( hBstr, prm[j++], n ); } /* Subframe parameters */ @@ -810,14 +809,14 @@ void enc_prm_fx( IF( n != 0 ) { - push_next_indice_fx( hBstr, prm[j++], n ); + push_next_indice( hBstr, prm[j++], n ); } /* Adaptive codebook filtering (1 bit) */ IF( EQ_16( st->acelp_cfg.ltf_mode, 2 ) ) { - push_next_indice_fx( hBstr, prm[j++], 1 ); + push_next_indice( hBstr, prm[j++], 1 ); } /*Innovative codebook*/ @@ -839,12 +838,12 @@ void enc_prm_fx( FOR( ix = 0; ix < wordcnt; ix++ ) { - push_next_indice_fx( hBstr, prm[j++], 16 ); + push_next_indice( hBstr, prm[j++], 16 ); } IF( bitcnt ) { - push_next_indice_fx( hBstr, prm[j++], bitcnt ); + push_next_indice( hBstr, prm[j++], bitcnt ); } j = add( j_old, 8 ); /* Q0 */ @@ -852,7 +851,7 @@ void enc_prm_fx( /* Gains (5b, 6b or 7b / subfr) */ n = ACELP_GAINS_BITS[st->acelp_cfg.gains_mode[sfr]]; - push_next_indice_fx( hBstr, prm[j++], n ); + push_next_indice( hBstr, prm[j++], n ); } /*end of for(sfr)*/ } /*end of mode[0]==0*/ @@ -866,14 +865,14 @@ void enc_prm_fx( move16(); IF( st->enablePlcWaveadjust ) { - push_next_indice_fx( hBstr, st->Tonal_SideInfo, 1 ); + push_next_indice( hBstr, st->Tonal_SideInfo, 1 ); } /* TCX Gain = 7 bits */ - push_next_indice_fx( hBstr, prm[j++], 7 ); + push_next_indice( hBstr, prm[j++], 7 ); /* TCX Noise Filling = NBITS_NOISE_FILL_LEVEL bits */ - push_next_indice_fx( hBstr, prm[j++], NBITS_NOISE_FILL_LEVEL ); + push_next_indice( hBstr, prm[j++], NBITS_NOISE_FILL_LEVEL ); /* LTP data */ test(); @@ -881,13 +880,13 @@ void enc_prm_fx( { IF( prm[j] ) { - push_next_indice_fx( hBstr, 1, 1 ); - push_next_indice_fx( hBstr, prm[j + 1], 9 ); - push_next_indice_fx( hBstr, prm[j + 2], 2 ); + push_next_indice( hBstr, 1, 1 ); + push_next_indice( hBstr, prm[j + 1], 9 ); + push_next_indice( hBstr, prm[j + 2], 2 ); } ELSE { - push_next_indice_fx( hBstr, 0, 1 ); + push_next_indice( hBstr, 0, 1 ); } } j = add( j, 3 ); @@ -932,7 +931,7 @@ void enc_prm_fx( test(); IF( st->hTcxCfg->ctx_hm && NE_16( last_core, ACELP_CORE ) ) { - push_next_indice_fx( hBstr, prm[j], 1 ); + push_next_indice( hBstr, prm[j], 1 ); IF( prm[j] ) { @@ -965,7 +964,7 @@ void enc_prm_fx( IF( hTcxEnc->tcx_lpc_shaped_ari != 0 ) { - push_next_bits_fx( hBstr, &prm[++j], nbits_tcx ); + push_next_bits( hBstr, (UWord16 *) &prm[++j], nbits_tcx ); j = add( j, nbits_tcx ); /* Q0 */ } ELSE @@ -1015,14 +1014,14 @@ void enc_prm_fx( test(); IF( st->enablePlcWaveadjust && k ) { - push_next_indice_fx( hBstr, st->Tonal_SideInfo, 1 ); + push_next_indice( hBstr, st->Tonal_SideInfo, 1 ); } /* TCX Gain = 7 bits */ - push_next_indice_fx( hBstr, prm[j++], 7 ); + push_next_indice( hBstr, prm[j++], 7 ); /* TCX Noise Filling = NBITS_NOISE_FILL_LEVEL bits */ - push_next_indice_fx( hBstr, prm[j++], NBITS_NOISE_FILL_LEVEL ); + push_next_indice( hBstr, prm[j++], NBITS_NOISE_FILL_LEVEL ); /* LTP data */ test(); @@ -1031,13 +1030,13 @@ void enc_prm_fx( { IF( prm[j] ) { - push_next_indice_fx( hBstr, 1, 1 ); - push_next_indice_fx( hBstr, prm[j + 1], 9 ); - push_next_indice_fx( hBstr, prm[j + 2], 2 ); + push_next_indice( hBstr, 1, 1 ); + push_next_indice( hBstr, prm[j + 1], 9 ); + push_next_indice( hBstr, prm[j + 2], 2 ); } ELSE { - push_next_indice_fx( hBstr, 0, 1 ); + push_next_indice( hBstr, 0, 1 ); } } j = add( j, 3 ); @@ -1079,7 +1078,7 @@ void enc_prm_fx( test(); IF( st->hTcxCfg->ctx_hm && !( last_core == ACELP_CORE && k == 0 ) ) { - push_next_indice_fx( hBstr, prm[j], 1 ); + push_next_indice( hBstr, prm[j], 1 ); IF( prm[j] ) { @@ -1519,10 +1518,10 @@ void writeTCXparam_fx( *--------------------------------------------------------------------*/ void writeTCXMode_fx( - Encoder_State *st, /* i/o: encoder state structure */ - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ - Word16 *nbits_start /* o : nbits start Q0*/ + Encoder_State *st, /* i/o: encoder state structure */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ + Word16 *nbits_start /* o : nbits start Q0*/ ) { UWord16 index; diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index 5b9f6750302d8933f8718fd68ec923edc7b20863..879ed6dd038b6eb099713e169b84888e116fe48d 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -1,53 +1,53 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Compilation switches */ -// #include "prot_fx.h" /* Function prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Compilation switches */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*=================================================================================*/ -/* FUNCTION : void encod_tran_fx () */ +/* FUNCTION : void encod_tran_fx () */ /*---------------------------------------------------------------------------------*/ -/* PURPOSE : */ +/* PURPOSE : */ /*---------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* (Word16) L_frame_fx : length of the frame Q0 */ -/* (Word16[]) speech_fx : input speech Q0 */ -/* (Word16[]) Aq_fx : 12k8 Lp coefficient Q12 */ -/* (Word16[]) A_fx : unquantized A(z) filter with bandwidth expansion Q12 */ -/* (Word16) coder_type : coding type Q0 */ -/* (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ -/* (Word16[]) T_op_fx : open loop pitch Q0 */ -/* (Word16[]) voicing_fx : voicing Q15 */ -/* (Word16*) res_fx : residual signal Q_new*/ -/* (Word16) gsc_attack_flag : Flag to indicate when an audio attack is deal with TM*/ -/* (Word16) shift : shift factor */ -/* (Word16[]) Q_new : input scaling */ +/* INPUT ARGUMENTS : */ +/* (Word16) L_frame_fx : length of the frame Q0 */ +/* (Word16[]) speech_fx : input speech Q0 */ +/* (Word16[]) Aq_fx : 12k8 Lp coefficient Q12 */ +/* (Word16[]) A_fx : unquantized A(z) filter with bandwidth expansion Q12 */ +/* (Word16) coder_type : coding type Q0 */ +/* (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ +/* (Word16[]) T_op_fx : open loop pitch Q0 */ +/* (Word16[]) voicing_fx : voicing Q15 */ +/* (Word16*) res_fx : residual signal Q_new*/ +/* (Word16) gsc_attack_flag : Flag to indicate when an audio attack is deal with TM*/ +/* (Word16) shift : shift factor */ +/* (Word16[]) Q_new : input scaling */ /*---------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* (Word16*) voice_factors : voicing factors Q15 */ +/* OUTPUT ARGUMENTS : */ +/* (Word16*) voice_factors : voicing factors Q15 */ /*---------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Encoder_State *st_fx :Encoder state structure */ -/* (Word16*) syn_fx :core synthesis Qnew */ -/* (Word16*) exc_fx :current non-enhanced excitation Q0 */ -/* (Word16*) exc2_fx :current enhanced excitation Q0 */ -/* (Word16*) pitch_buf_fx :floating pitch values for each subframe Q6 */ -/* (Word16*) bwe_exc_fx :excitation for SWB TBE Q0 */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* Encoder_State *st_fx :Encoder state structure */ +/* (Word16*) syn_fx :core synthesis Qnew */ +/* (Word16*) exc_fx :current non-enhanced excitation Q0 */ +/* (Word16*) exc2_fx :current enhanced excitation Q0 */ +/* (Word16*) pitch_buf_fx :floating pitch values for each subframe Q6 */ +/* (Word16*) bwe_exc_fx :excitation for SWB TBE Q0 */ /*---------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*---------------------------------------------------------------------------------*/ Word16 encod_tran_fx( Encoder_State *st_fx, /* i/o: state structure */ const Word16 speech_fx[], /* i : input speech Q0*/ - const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes Q12*/ + const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes Q12*/ const Word16 Aq_fx[], /* i : 12k8 Lp coefficient Q12*/ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy Q8*/ const Word16 *res_fx, /* i : residual signal Q_new*/ @@ -93,19 +93,17 @@ Word16 encod_tran_fx( Word16 L_frame_fx; Word16 shift_wsp; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif BSTR_ENC_HANDLE hBstr = st_fx->hBstr; SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR; LPD_state_HANDLE hLPDmem = st_fx->hLPDmem; L_frame_fx = st_fx->L_frame; move16(); + /*------------------------------------------------------------------* * Initializations *------------------------------------------------------------------*/ + gain_pit = 0; move16(); gain_code = L_deposit_l( 0 ); @@ -200,11 +198,13 @@ Word16 encod_tran_fx( Jopt_flag = 1; move16(); } + /*-----------------------------------------------------------------* * Quantize the gains * Test quantized gain of pitch for pitch clipping algorithm * Update tilt of code: 0.0 (unvoiced) to 0.5 (voiced) *-----------------------------------------------------------------*/ + IF( Jopt_flag == 0 ) { /* SQ gain_code */ @@ -228,9 +228,10 @@ Word16 encod_tran_fx( } gp_clip_test_gain_pit_fx( st_fx->element_mode, st_fx->core_brate, gain_pit, st_fx->clip_var_fx ); - Lgcode = L_shl_o( gain_code, Q_new, &Overflow ); /* scaled gain_code with Qnew -> Q16*/ - gcode16 = round_fx_o( Lgcode, &Overflow ); + Lgcode = L_shl_sat( gain_code, Q_new ); /* scaled gain_code with Qnew -> Q16*/ + gcode16 = round_fx_sat( Lgcode ); hLPDmem->tilt_code = Est_tilt2( &exc_fx[i_subfr], gain_pit, code, Lgcode, &voice_fac, shift ); /* Q15 */ + /*-----------------------------------------------------------------* * Update memory of the weighting filter *-----------------------------------------------------------------*/ @@ -243,6 +244,7 @@ Word16 encod_tran_fx( L_tmp = L_msu( L_tmp, y1[L_SUBFR - 1], gain_pit ); L_tmp = L_shl_sat( L_tmp, sub( 1, shift ) ); /* Q_new + 15 */ hLPDmem->mem_w0 = round_fx_sat( L_tmp ); /*Q_new-1*/ + /*-----------------------------------------------------------------* * Construct adaptive part of the excitation * Save the non-enhanced excitation for FEC_exc @@ -277,11 +279,11 @@ Word16 encod_tran_fx( FOR( i = 0; i < L_SUBFR; i++ ) { /* code in Q9, gain_pit in Q14 */ - L_tmp = L_mult( gcode16, code[i] ); /* Q10 + Q_new */ - L_tmp = L_shl_o( L_tmp, 5, &Overflow ); /* Q15 + Q_new */ - L_tmp = L_mac_o( L_tmp, exc_fx[i + i_subfr], gain_pit, &Overflow ); /* Q15 + Q_new */ - L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /* saturation can occur here Q16 + Q_new */ - exc_fx[i + i_subfr] = round_fx_o( L_tmp, &Overflow ); /* Q_new */ + L_tmp = L_mult( gcode16, code[i] ); /* Q10 + Q_new */ + L_tmp = L_shl_sat( L_tmp, 5 ); /* Q15 + Q_new */ + L_tmp = L_mac_sat( L_tmp, exc_fx[i + i_subfr], gain_pit ); /* Q15 + Q_new */ + L_tmp = L_shl_sat( L_tmp, 1 ); /* saturation can occur here Q16 + Q_new */ + exc_fx[i + i_subfr] = round_fx_sat( L_tmp ); /* Q_new */ } /*-----------------------------------------------------------------* @@ -293,13 +295,12 @@ Word16 encod_tran_fx( tmp1_fx = add( 16 - ( 2 + Q_AVQ_OUT_DEC + 1 ), Q_new ); FOR( i = 0; i < L_SUBFR; i++ ) { - L_tmp = L_mult( gain_preQ, code_preQ[i] ); /* Q2 + Q10 -> Q13*/ - L_tmp = L_shl_o( L_tmp, tmp1_fx, &Overflow ); /* Q16 + Q_exc */ - tmp_fx = round_fx_o( L_tmp, &Overflow ); - - exc2_fx[i + i_subfr] = add_o( exc2_fx[i + i_subfr], tmp_fx, &Overflow ); /* Q_exc */ + L_tmp = L_mult( gain_preQ, code_preQ[i] ); /* Q2 + Q10 -> Q13*/ + L_tmp = L_shl_sat( L_tmp, tmp1_fx ); /* Q16 + Q_exc */ + tmp_fx = round_fx_sat( L_tmp ); + exc2_fx[i + i_subfr] = add_sat( exc2_fx[i + i_subfr], tmp_fx ); /* Q_exc */ move16(); - exc_fx[i + i_subfr] = add_o( exc_fx[i + i_subfr], tmp_fx, &Overflow ); /* Q_exc */ + exc_fx[i + i_subfr] = add_sat( exc_fx[i + i_subfr], tmp_fx ); /* Q_exc */ move16(); } } @@ -308,8 +309,8 @@ Word16 encod_tran_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_fx( L_frame_fx, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], - bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate ); + prep_tbe_exc_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], + bwe_exc_fx, gain_preQ, code_preQ, Q10, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. @@ -327,7 +328,7 @@ Word16 encod_tran_fx( WHILE( unbits_PI > 0 ) { i = s_min( unbits_PI, 16 ); - push_indice_fx( hBstr, IND_UNUSED, 0, i ); + push_indice( hBstr, IND_UNUSED, 0, i ); unbits_PI -= i; } @@ -336,72 +337,72 @@ Word16 encod_tran_fx( { IF( EQ_16( tc_subfr, TC_0_0 ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); } ELSE IF( EQ_16( tc_subfr, TC_0_64 ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); } ELSE IF( EQ_16( tc_subfr, TC_0_128 ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); } ELSE IF( EQ_16( tc_subfr, TC_0_192 ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); } ELSE IF( EQ_16( tc_subfr, L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); } ELSE IF( EQ_16( tc_subfr, 2 * L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); } ELSE IF( EQ_16( tc_subfr, 3 * L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); } } ELSE /* L_frame == L_FRAME16k */ { IF( tc_subfr == 0 ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 2 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 2 ); } ELSE IF( EQ_16( tc_subfr, L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 2 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 2 ); } ELSE IF( EQ_16( tc_subfr, 2 * L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 2, 2 ); + push_indice( hBstr, IND_TC_SUBFR, 2, 2 ); } ELSE IF( EQ_16( tc_subfr, 3 * L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 3, 2 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 3, 2 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); } ELSE IF( EQ_16( tc_subfr, 4 * L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 3, 2 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 3, 2 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); } } @@ -417,10 +418,11 @@ Word16 encod_tran_fx( return tc_subfr; } + Word16 encod_tran_ivas_fx( Encoder_State *st_fx, /* i/o: state structure */ const Word16 speech_fx[], /* i : input speech Q0*/ - const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes Q12*/ + const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes Q12*/ const Word16 Aq_fx[], /* i : 12k8 Lp coefficient Q12*/ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy Q8*/ const Word16 *res_fx, /* i : residual signal Q_new*/ @@ -433,7 +435,7 @@ Word16 encod_tran_ivas_fx( Word16 tc_subfr, /* i/o: TC subframe classification Q0*/ Word16 position, /* i : maximum of residual signal index Q0*/ Word16 *unbits, /* i/o: number of unused bits Q0*/ - const Word16 shift, /* i : Scaling to get 12 bits */ + const Word16 shift_r, /* i : Scaling to get 12 bits */ const Word16 Q_new /* i : Input scaling */ ) { @@ -467,24 +469,23 @@ Word16 encod_tran_ivas_fx( Word16 shift_wsp; Word32 L_tmp; Word16 q_h1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + Word16 shift, tmp; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR; LPD_state_HANDLE hLPDmem = st_fx->hLPDmem; + shift = shift_r; /* for IVAS, shift_r is always 0 */ + /* will be reusing the EVS shift strategy later on to allow of H1 overshoot */ + move16(); L_frame_fx = st_fx->L_frame; move16(); -#ifdef MSAN_FIX set16_fx( h1, 0, L_SUBFR + ( M + 1 ) ); -#endif /*------------------------------------------------------------------* * Initializations *------------------------------------------------------------------*/ + gain_pit = 0; move16(); gain_code = L_deposit_l( 0 ); @@ -522,6 +523,10 @@ Word16 encod_tran_ivas_fx( move16(); set16_fx( code_preQ, 0, L_SUBFR ); shift_wsp = add( Q_new, shift ); + if ( LT_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) ) + { + shift_wsp = sub( shift_wsp, 1 ); + } /*----------------------------------------------------------------* * ACELP subframe loop @@ -537,13 +542,20 @@ Word16 encod_tran_ivas_fx( Copy( &res_fx[i_subfr], &exc_fx[i_subfr], L_SUBFR ); /* Q_new */ + find_targets_ivas_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res_fx, L_SUBFR, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); q_h1 = sub( 14, norm_s( h1[0] ) ); + tmp = sub( 14, norm_arr( h1, L_SUBFR ) ); + shift = sub( q_h1, tmp ); /* shift is initialized to shift_r ( to 0) at the beginning of the scope, re-compute shift_wsp in case it has changed */ + shift_wsp = add( Q_new, shift ); + if ( LT_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) ) + { + shift_wsp = sub( shift_wsp, 1 ); + } Copy_Scale_sig( h1, h2_fx, L_SUBFR, sub( 11, q_h1 ) ); /*Q11*/ - Scale_sig( h1, L_SUBFR, sub( 13, q_h1 ) ); - + Scale_sig( h1, L_SUBFR, add( sub( 14, q_h1 ), shift ) ); /* scaling of xn[] to limit dynamic at 12 bits */ Scale_sig( xn, L_SUBFR, shift ); @@ -561,7 +573,6 @@ Word16 encod_tran_ivas_fx( IF( GE_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) ) { - Scale_sig( h1, L_SUBFR, add( 1, shift ) ); /* set h1[] in Q14 with scaling for convolution */ transf_cdbk_enc_ivas_fx( st_fx, 0, i_subfr, cn, exc_fx, p_Aq, Aw_fx, h1, xn, xn2, y1, y2, Es_pred_fx, &gain_pit, gain_code, g_corr, clip_gain, &gain_preQ, code_preQ, unbits, Q_new, shift ); } @@ -581,37 +592,40 @@ Word16 encod_tran_ivas_fx( Jopt_flag = 1; move16(); } + /*-----------------------------------------------------------------* * Quantize the gains * Test quantized gain of pitch for pitch clipping algorithm * Update tilt of code: 0.0 (unvoiced) to 0.5 (voiced) *-----------------------------------------------------------------*/ + IF( Jopt_flag == 0 ) { /* SQ gain_code */ - gain_enc_tc_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y2, code, Es_pred_fx, - &gain_pit, &gain_code, &gain_inov, &norm_gain_code, sub( shift_wsp, 1 ) ); + gain_enc_tc_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y2, code, Es_pred_fx, + &gain_pit, &gain_code, &gain_inov, &norm_gain_code, shift_wsp ); } ELSE { IF( GT_32( st_fx->core_brate, ACELP_32k ) ) { /* SQ gain_pit and gain_code */ - gain_enc_SQ_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y1, y2, code, Es_pred_fx, - &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain, sub( shift_wsp, 1 ) ); + gain_enc_SQ_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y1, y2, code, Es_pred_fx, + &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain, shift_wsp ); } ELSE { /* VQ gain_pit and gain_code */ - gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame_fx, i_subfr, tc_subfr, xn, y1, sub( shift_wsp, 1 ), y2, code, Es_pred_fx, - &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); + gain_enc_mless_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame_fx, i_subfr, tc_subfr, xn, y1, shift_wsp, y2, code, Es_pred_fx, + &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); } } gp_clip_test_gain_pit_fx( st_fx->element_mode, st_fx->core_brate, gain_pit, st_fx->clip_var_fx ); - Lgcode = L_shl_o( gain_code, Q_new, &Overflow ); /* scaled gain_code with Qnew -> Q16*/ - gcode16 = round_fx_o( Lgcode, &Overflow ); + Lgcode = L_shl_sat( gain_code, Q_new ); /* scaled gain_code with Qnew -> Q16*/ + gcode16 = round_fx_sat( Lgcode ); hLPDmem->tilt_code = est_tilt_ivas_fx( &exc_fx[i_subfr], gain_pit, code, gain_code, &voice_fac, Q_new, L_SUBFR, 0 ); // Q15 + /*-----------------------------------------------------------------* * Update memory of the weighting filter *-----------------------------------------------------------------*/ @@ -624,6 +638,7 @@ Word16 encod_tran_ivas_fx( L_tmp = L_msu( L_tmp, y1[L_SUBFR - 1], gain_pit ); // Q_new-1+15+shift L_tmp = L_shl_sat( L_tmp, sub( 1, shift ) ); // Q_new+15 hLPDmem->mem_w0 = round_fx_sat( L_tmp ); /*Q_new-1*/ + /*-----------------------------------------------------------------* * Construct adaptive part of the excitation * Save the non-enhanced excitation for FEC_exc @@ -655,14 +670,15 @@ Word16 encod_tran_ivas_fx( * Construct adaptive part of the excitation * Save the non-enhanced excitation for FEC_exc *-----------------------------------------------------------------*/ + FOR( i = 0; i < L_SUBFR; i++ ) { /* code in Q9, gain_pit in Q14 */ - L_tmp = L_mult( gcode16, code[i] ); /* Q10 + Q_new */ - L_tmp = L_shl_o( L_tmp, 5, &Overflow ); /* Q15 + Q_new */ - L_tmp = L_mac_o( L_tmp, exc_fx[i + i_subfr], gain_pit, &Overflow ); /* Q15 + Q_new */ - L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /* saturation can occur here Q16 + Q_new */ - exc_fx[i + i_subfr] = round_fx_o( L_tmp, &Overflow ); /* Q_new */ + L_tmp = L_mult( gcode16, code[i] ); /* Q10 + Q_new */ + L_tmp = L_shl_sat( L_tmp, 5 ); /* Q15 + Q_new */ + L_tmp = L_mac_sat( L_tmp, exc_fx[i + i_subfr], gain_pit ); /* Q15 + Q_new */ + L_tmp = L_shl_sat( L_tmp, 1 ); /* saturation can occur here Q16 + Q_new */ + exc_fx[i + i_subfr] = round_fx_sat( L_tmp ); /* Q_new */ } /*-----------------------------------------------------------------* @@ -674,13 +690,13 @@ Word16 encod_tran_ivas_fx( tmp1_fx = add( 16 - ( 2 + Q_AVQ_OUT_DEC + 1 ), Q_new ); FOR( i = 0; i < L_SUBFR; i++ ) { - L_tmp = L_mult( gain_preQ, code_preQ[i] ); /* Q2 + Q10 -> Q13*/ - L_tmp = L_shl_o( L_tmp, tmp1_fx, &Overflow ); /* Q16 + Q_exc */ - tmp_fx = round_fx_o( L_tmp, &Overflow ); + L_tmp = L_mult( gain_preQ, code_preQ[i] ); /* Q2 + Q10 -> Q13*/ + L_tmp = L_shl_sat( L_tmp, tmp1_fx ); /* Q16 + Q_exc */ + tmp_fx = round_fx_sat( L_tmp ); - exc2_fx[i + i_subfr] = add_o( exc2_fx[i + i_subfr], tmp_fx, &Overflow ); /* Q_exc */ + exc2_fx[i + i_subfr] = add_sat( exc2_fx[i + i_subfr], tmp_fx ); /* Q_exc */ move16(); - exc_fx[i + i_subfr] = add_o( exc_fx[i + i_subfr], tmp_fx, &Overflow ); /* Q_exc */ + exc_fx[i + i_subfr] = add_sat( exc_fx[i + i_subfr], tmp_fx ); /* Q_exc */ move16(); } } @@ -689,9 +705,9 @@ Word16 encod_tran_ivas_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_ivas_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], - bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, - st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); + prep_tbe_exc_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], + bwe_exc_fx, gain_preQ, code_preQ, Q10, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. diff --git a/lib_enc/enc_uv_fx.c b/lib_enc/enc_uv_fx.c index b0c67abf528e2aef3bf40e609cfaba8e803b5f70..eb614935941d19c4b4c467a5fd05438dc2e914db 100644 --- a/lib_enc/enc_uv_fx.c +++ b/lib_enc/enc_uv_fx.c @@ -1,6 +1,7 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include #include "options.h" /* Compilation switches */ @@ -9,15 +10,16 @@ #include "rom_com.h" #include "prot_fx_enc.h" /* Function prototypes */ + /*-------------------------------------------------------------------* * encod_unvoiced() * * Encode unvoiced (UC) frames *-------------------------------------------------------------------*/ -/*fixed point implementation of unvoiced_encoder*/ + void encod_unvoiced_fx( Encoder_State *st_fx, /* i/o: state structure */ - const Word16 *speech_fx, /* i : Input speech Q_new*/ + const Word16 *speech_fx, /* i : Input speech Q_new*/ const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes Q12*/ const Word16 *Aq_fx, /* i : 12k8 Lp coefficient Q12*/ const Word16 Es_pred, /* i : predicted scaled innov. energy Q8*/ @@ -28,7 +30,7 @@ void encod_unvoiced_fx( Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/ Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6*/ Word16 *voice_factors_fx, /* o : voicing factors Q15*/ - Word16 *bwe_exc_fx, /* i/o: excitation for SWB TBE Q_exc*/ + Word16 *bwe_exc_fx, /* i/o: excitation for SWB TBE Q_exc*/ const Word16 Q_new, const Word16 shift ) { @@ -81,7 +83,6 @@ void encod_unvoiced_fx( Q_xn = add( sub( Q_new, 1 ), shift ); Q_new_p5 = add( Q_new, 5 ); - FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) { /*----------------------------------------------------------------* @@ -89,6 +90,7 @@ void encod_unvoiced_fx( * Find the excitation search target "xn" and innovation target in residual domain "cn" * Compute impulse response, h1[], of weighted synthesis filter *----------------------------------------------------------------*/ + i_subfr_idx = shr( i_subfr, 6 ); Copy( &res_fx[i_subfr], &exc_fx[i_subfr], L_SUBFR ); /* Q_new */ @@ -100,9 +102,11 @@ void encod_unvoiced_fx( /* scaling of xn[] to limit dynamic at 12 bits */ Scale_sig( xn_fx, L_SUBFR, shift ); + /*----------------------------------------------------------------* * Unvoiced subframe processing *----------------------------------------------------------------*/ + IF( !uc_two_stage_flag ) { *pt_pitch_fx = gaus_encode_fx( st_fx, i_subfr, h1_fx, xn_fx, exc_fx, &hLPDmem->mem_w0, st_fx->clip_var_fx, @@ -123,9 +127,11 @@ void encod_unvoiced_fx( * Gain clipping test to avoid unstable synthesis on frame erasure * or in case of floating point encoder & fixed p. decoder *-----------------------------------------------------------------*/ + Mode2_gp_clip_fx( st_fx->voicing_fx, i_subfr, st_fx->coder_type, xn_fx, st_fx->clip_var_fx, L_SUBFR, Q_xn ); *pt_pitch_fx = L_SUBFR; move16(); + /*----------------------------------------------------------------------* * Encode the algebraic innovation * *----------------------------------------------------------------------*/ @@ -153,7 +159,7 @@ void encod_unvoiced_fx( #ifdef DEBUGGING assert( st_fx->acelp_cfg.gains_mode[i_subfr_idx] == 7 && "Error: UC two-stage, only 5+2 gain Q is supported" ); #endif - push_indice_fx( st_fx->hBstr, IND_GAIN, index, st_fx->acelp_cfg.gains_mode[i_subfr_idx] ); + push_indice( st_fx->hBstr, IND_GAIN, index, st_fx->acelp_cfg.gains_mode[i_subfr_idx] ); gp_clip_test_gain_pit_fx( st_fx->element_mode, st_fx->core_brate, gain_pit_fx, st_fx->clip_var_fx ); @@ -165,15 +171,18 @@ void encod_unvoiced_fx( /*----------------------------------------------------------* * - voice factor (for pitch enhancement) * *----------------------------------------------------------*/ + E_UTIL_voice_factor( exc_fx, i_subfr, code_fx, gain_pit_fx, L_gain_code_fx, &voice_fac_fx, &( hLPDmem->tilt_code ), L_SUBFR, acelp_cfg->voice_tilt, Q_new, shift ); IF( st_fx->Opt_RF_ON ) { st_fx->hRF->rf_tilt_buf[i_subfr_idx] = hLPDmem->tilt_code; } + /*-----------------------------------------------------------------* * Update memory of the weighting filter *-----------------------------------------------------------------*/ + /* st_fx->mem_w0 = xn[L_SUBFR-1] - (gain_pit*y1[L_SUBFR-1]) - (gain_code*y2[L_SUBFR-1]); */ Ltmp = Mpy_32_16_1( L_gain_code_fx, y2_fx[L_SUBFR - 1] ); /* Q10 */ Ltmp = L_shl( Ltmp, add( 5, Q_xn ) ); /* Q15 + Q_xn */ @@ -204,7 +213,7 @@ void encod_unvoiced_fx( Ltmp2 = Mpy_32_16_1( gain_code_vect[j], code_fx[i] ); /* Q10 */ Ltmp2 = L_shl( Ltmp2, Q_new_p5 ); /* Q15 + Q_new */ Ltmp = L_add( Ltmp, Ltmp2 ); /* Q15 + Q_new */ - Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16 + Q_new */ + Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16 + Q_new */ exc_fx[i + i_subfr] = round_fx_sat( Ltmp ); /* Q_new */ } tmp2 = L_SUBFR; @@ -222,6 +231,7 @@ void encod_unvoiced_fx( * Synthesize speech to update mem_syn[]. * Update A(z) filters *-----------------------------------------------------------------*/ + Syn_filt_s( 1, p_Aq_fx, M, &exc_fx[i_subfr], &syn_fx[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1 ); p_Aw_fx += ( M + 1 ); @@ -238,11 +248,12 @@ void encod_unvoiced_fx( return; } + void encod_unvoiced_ivas_fx( Encoder_State *st_fx, /* i/o: state structure */ - const Word16 *speech_fx, /* i : Input speech Q_new*/ + const Word16 *speech_fx, /* i : Input speech Q_new*/ const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes Q12*/ - const Word16 *Aq_fx, /* i : 12k8 Lp coefficient Q12*/ + const Word16 *Aq_fx, /* i : 12k8 Lp coefficient Q12*/ const Word16 Es_pred, /* i : predicted scaled innov. energy Q8*/ const Word16 uc_two_stage_flag, /* i : flag indicating two-stage UC Q0*/ const Word16 *res_fx, /* i : residual signal Q_new*/ @@ -251,7 +262,7 @@ void encod_unvoiced_ivas_fx( Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/ Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6*/ Word16 *voice_factors_fx, /* o : voicing factors Q15*/ - Word16 *bwe_exc_fx, /* i/o: excitation for SWB TBE Q_exc*/ + Word16 *bwe_exc_fx, /* i/o: excitation for SWB TBE Q_exc*/ const Word16 Q_new, const Word16 shift ) { @@ -287,6 +298,7 @@ void encod_unvoiced_ivas_fx( /*------------------------------------------------------------------* * Initializations *------------------------------------------------------------------*/ + gain_pit_fx = 0; move16(); @@ -306,7 +318,6 @@ void encod_unvoiced_ivas_fx( Q_xn = add( sub( Q_new, 1 ), shift ); Q_new_p5 = add( Q_new, 5 ); - FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) { /*----------------------------------------------------------------* @@ -314,6 +325,7 @@ void encod_unvoiced_ivas_fx( * Find the excitation search target "xn" and innovation target in residual domain "cn" * Compute impulse response, h1[], of weighted synthesis filter *----------------------------------------------------------------*/ + i_subfr_idx = shr( i_subfr, 6 ); Copy( &res_fx[i_subfr], &exc_fx[i_subfr], L_SUBFR ); /* Q_new */ @@ -326,14 +338,16 @@ void encod_unvoiced_ivas_fx( /* scaling of xn[] to limit dynamic at 12 bits */ Scale_sig( xn_fx, L_SUBFR, shift ); // Q_new - 1 + shift + /*----------------------------------------------------------------* * Unvoiced subframe processing *----------------------------------------------------------------*/ + IF( !uc_two_stage_flag ) { - *pt_pitch_fx = gaus_encode_ivas_fx( st_fx, i_subfr, h1_fx, xn_fx, exc_fx, &hLPDmem->mem_w0, st_fx->clip_var_fx, - &hLPDmem->tilt_code, code_fx, &L_gain_code_fx, y2_fx, &gain_inov_fx, - &voice_fac_fx, &gain_pit_fx, Q_new, shift, &norm_gain_code_fx ); /* Q0 */ + *pt_pitch_fx = gaus_encode_fx( st_fx, i_subfr, h1_fx, xn_fx, exc_fx, &hLPDmem->mem_w0, st_fx->clip_var_fx, + &hLPDmem->tilt_code, code_fx, &L_gain_code_fx, y2_fx, &gain_inov_fx, + &voice_fac_fx, &gain_pit_fx, Q_new, shift, &norm_gain_code_fx ); /* Q0 */ move16(); } ELSE @@ -341,24 +355,26 @@ void encod_unvoiced_ivas_fx( /*----------------------------------------------------------------* * Unvoiced subframe processing in two stages *----------------------------------------------------------------*/ - // PMT("The code below needs validation, never been tested") + /* No adaptive codebook (UC) */ set16_fx( y1, 0, L_SUBFR ); set16_fx( exc_fx + i_subfr, 0, L_SUBFR ); + /*-----------------------------------------------------------------* * Gain clipping test to avoid unstable synthesis on frame erasure * or in case of floating point encoder & fixed p. decoder *-----------------------------------------------------------------*/ + Mode2_gp_clip_fx( st_fx->voicing_fx, i_subfr, st_fx->coder_type, xn_fx, st_fx->clip_var_fx, L_SUBFR, Q_xn ); *pt_pitch_fx = L_SUBFR << 6; move16(); + /*----------------------------------------------------------------------* * Encode the algebraic innovation * *----------------------------------------------------------------------*/ - // E_ACELP_innovative_codebook_fx( exc_fx, *pt_pitch_fx, 0, 1, gain_pit_fx, hLPDmem->tilt_code, acelp_cfg, i_subfr, p_Aq_fx, h1_fx, xn_fx, cn_fx, y1, y2_fx, (Word8) st_fx->acelp_autocorr, &prm, code_fx, shift, st_fx->L_frame, st_fx->last_L_frame, st_fx->total_brate, st_fx->element_mode ); inov_encode_ivas_fx( st_fx, st_fx->core_brate, 0, L_FRAME, st_fx->last_L_frame, - UNVOICED, st_fx->bwidth, st_fx->sharpFlag, i_subfr, -1, p_Aq_fx, + UNVOICED, st_fx->bwidth, 1, i_subfr, -1, p_Aq_fx, gain_pit_fx, cn_fx, exc_fx, h2_fx, hLPDmem->tilt_code, *pt_pitch_fx, xn_fx, code_fx, y2_fx, &unbits_PI, L_SUBFR, shift, Q_new ); E_ACELP_xy2_corr( xn_fx, y1, y2_fx, &g_corr, L_SUBFR, Q_xn ); @@ -398,6 +414,7 @@ void encod_unvoiced_ivas_fx( /*----------------------------------------------------------* * - voice factor (for pitch enhancement) * *----------------------------------------------------------*/ + E_UTIL_voice_factor( exc_fx, i_subfr, code_fx, gain_pit_fx, L_gain_code_fx, &voice_fac_fx, &( hLPDmem->tilt_code ), L_SUBFR, acelp_cfg->voice_tilt, Q_new, shift ); if ( st_fx->Opt_RF_ON ) @@ -408,6 +425,7 @@ void encod_unvoiced_ivas_fx( /*-----------------------------------------------------------------* * Update memory of the weighting filter *-----------------------------------------------------------------*/ + /* st_fx->mem_w0 = xn[L_SUBFR-1] - (gain_pit*y1[L_SUBFR-1]) - (gain_code*y2[L_SUBFR-1]); */ Ltmp = Mpy_32_16_1( L_gain_code_fx, y2_fx[L_SUBFR - 1] ); /* Q10 */ Ltmp = L_shl( Ltmp, add( 5, Q_xn ) ); // Qxn+15 @@ -439,7 +457,7 @@ void encod_unvoiced_ivas_fx( Ltmp2 = Mpy_32_16_1( gain_code_vect[j], code_fx[i] ); /* Q10 */ Ltmp2 = L_shl_sat( Ltmp2, Q_new_p5 ); /* Q15 + Q_new */ Ltmp = L_add_sat( Ltmp, Ltmp2 ); /* Q15 + Q_new */ - Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16 + Q_new */ + Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16 + Q_new */ exc_fx[i + i_subfr] = round_fx_sat( Ltmp ); /* Q_new */ move16(); } @@ -453,19 +471,16 @@ void encod_unvoiced_ivas_fx( voice_factors_fx[i_subfr / L_SUBFR] = 0; move16(); -#ifdef FIX_ISSUE_1148 if ( st_fx->hBWE_TD != NULL ) { interp_code_5over2_fx( &exc_fx[i_subfr], &bwe_exc_fx[i_subfr * HIBND_ACB_L_FAC], L_SUBFR ); } -#else - interp_code_5over2_fx( &exc_fx[i_subfr], &bwe_exc_fx[i_subfr * HIBND_ACB_L_FAC], L_SUBFR ); -#endif /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. * Update A(z) filters *-----------------------------------------------------------------*/ + Syn_filt_s( 1, p_Aq_fx, M, &exc_fx[i_subfr], &syn_fx[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1 ); p_Aw_fx += ( M + 1 ); diff --git a/lib_enc/energy_fx.c b/lib_enc/energy_fx.c index 7dc96a4e31a73fa401bb5170f05035510b58de02..53cda71c19f689b630b1f9d6a9eebca739785d73 100644 --- a/lib_enc/energy_fx.c +++ b/lib_enc/energy_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -17,18 +17,18 @@ * *-------------------------------------------------------------------*/ void est_energy_fx( - Word32 enerBuffer[CLDFB_NO_CHANNELS_MAX], /* i : energy vector per band enerBuffer_exp*/ - Word16 enerBuffer_exp, /* i : exponent of energy vector */ - Word32 *frame_sb_energy, /* o : energy of sub-band divided non-uniformly frame_sb_energy_scale*/ - Word32 *frame_energy2_p, /* o : frame energy 2 frame_energy2_Q*/ - Word32 *HB_Power_p, /* o : high frequency energy HB_Power_Q*/ - Word32 *frame_energy_p, /* o : frame energy 1 frame_energy_Q*/ - Word16 *sb_power_Q, /* o : the scaling of sb_power */ - Word16 *frame_energy2_Q, /* o : the scaling of frame_energy */ - Word16 *HB_Power_Q, /* o : the scaling of HB_Power */ - Word16 *frame_energy_Q, /* o : the Scaling of frame_energy */ - Word16 *frame_sb_energy_scale, /* o : the Scaling of frame_sb_energy[] */ - const Word32 bandwidth /* i : band width Q0*/ + Word32 enerBuffer[CLDFB_NO_CHANNELS_MAX], /* i : energy vector per band enerBuffer_exp*/ + Word16 enerBuffer_exp, /* i : exponent of energy vector */ + Word32 *frame_sb_energy, /* o : energy of sub-band divided non-uniformly frame_sb_energy_scale*/ + Word32 *frame_energy2_p, /* o : frame energy 2 frame_energy2_Q*/ + Word32 *HB_Power_p, /* o : high frequency energy HB_Power_Q*/ + Word32 *frame_energy_p, /* o : frame energy 1 frame_energy_Q*/ + Word16 *sb_power_Q, /* o : the scaling of sb_power */ + Word16 *frame_energy2_Q, /* o : the scaling of frame_energy */ + Word16 *HB_Power_Q, /* o : the scaling of HB_Power */ + Word16 *frame_energy_Q, /* o : the Scaling of frame_energy */ + Word16 *frame_sb_energy_scale, /* o : the Scaling of frame_sb_energy[] */ + const Word32 bandwidth /* i : band width Q0*/ ) { Word32 i, j; @@ -42,9 +42,6 @@ void est_energy_fx( const Word16 *Nregion_index; Word32 *sb_power = enerBuffer; Word32 Ltmp32 = 0; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif move32(); SNR_sb_num = SNR_SUB_BAND_NUM[bandwidth - CLDFBVAD_NB_ID]; move16(); @@ -125,7 +122,7 @@ void est_energy_fx( tmpspec_amp = L_shl( sb_power[j], s16MaxCoefNorm ); /* sb_power_Q + s16MaxCoefNorm */ s32CopyPower = L_add( s32CopyPower, tmpspec_amp ); } - frame_sb_energy[i] = L_shr_o( s32CopyPower, s16MaxCoefNorm, &Overflow ); /* sb_power_Q */ + frame_sb_energy[i] = L_shr_sat( s32CopyPower, s16MaxCoefNorm ); /* sb_power_Q */ move32(); } @@ -203,11 +200,11 @@ static void update_sb_bg_energy( * *-------------------------------------------------------------------*/ void background_update_fx( - VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ - Word16 scale, /* i : the scaling of frame energy */ - Word32 frame_energy, /* i : current frame energy scale*/ - Word32 update_flag, /* i : update flag Q0*/ - Word16 music_backgound_f, /* i : background music flag Q0*/ + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + Word16 scale, /* i : the scaling of frame energy */ + Word32 frame_energy, /* i : current frame energy scale*/ + Word32 update_flag, /* i : update flag Q0*/ + Word16 music_backgound_f, /* i : background music flag Q0*/ Word32 snr /* Q25 */ ) { @@ -451,11 +448,7 @@ void background_update_fx( tmp = L_shr( 2147 /* 0.000001 Q31 */, sub( 31, scale_sb_energy ) ); /* scale_sb_energy */ FOR( i = 0; i < SNR_sb_num; i++ ) { -#ifdef FIX_ISSUE_1209 sb_bg_energy[i] = L_add_sat( MUL_F( sb_bg_energy[i], 32112 /* 0.98 Q15 */ ), tmp ); /* scale_sb_energy */ -#else - sb_bg_energy[i] = L_add( MUL_F( sb_bg_energy[i], 32112 /* 0.98 Q15 */ ), tmp ); /* scale_sb_energy */ -#endif move32(); } } diff --git a/lib_enc/eval_pit_contr_fx.c b/lib_enc/eval_pit_contr_fx.c index aef5fd637644d28922b643193804a24b9b93be31..0aa1e1835d1f954de974e801b51d7e8ab6d5eb5d 100644 --- a/lib_enc/eval_pit_contr_fx.c +++ b/lib_enc/eval_pit_contr_fx.c @@ -1,17 +1,19 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*-------------------------------------------------------------------* * Local constantes *-------------------------------------------------------------------*/ + #define NB_VOIC_FX 13 #define DIV_NB_VOIC_FX 2521 @@ -23,41 +25,40 @@ #define HANGOVER_DELAY 2 + /*======================================================================*/ -/* FUNCTION : Pit_exc_contribution_len_fx() */ +/* FUNCTION : Pit_exc_contribution_len_fx() */ /*----------------------------------------------------------------------*/ /* PURPOSE : Determine up to which band the pit contribution is significant*/ /*----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Struct) st_fx : encoder static memory */ -/* _ (Word16[]) dct_res : DCT of residual Qnew */ -/* _ (Word16[]) dct_pitex : DCT of pitch contribution Qnew */ -/* _ (Word16[]) pitch_buf : Pitch per subframe Q6 */ -/* _ (Word16[]) nb_subfr : Number of subframe considered */ -/* _ (Word16) hangover : hangover for the time contribution switching*/ -/* _ (Word16) Qnew : */ -/*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) dct_res : DCT of residual Qnew */ -/* _ (Word16[]) dct_pitex : DCT of pitch contribution Qnew */ -/*-----------------------------------------------------------------------*/ - - -/*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*=======================================================================*/ - -Word16 Pit_exc_contribution_len_fx( /* o : bin where pitch contribution is significant */ - Encoder_State *st_fx, /* i/o: state structure */ - const Word16 *dct_res, /* i : DCT of residual Qnew*/ - Word16 *dct_pitex, /* i/o: DCT of pitch contribution Qnew*/ - Word16 *pitch_buf, /* i/o: Pitch per subframe Q6*/ - const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ - Word16 *hangover, /* i : hangover for the time contribution switching Q0*/ - Word16 Qnew ) -{ +/* INPUT ARGUMENTS : */ +/* _ (Struct) st_fx : encoder static memory */ +/* _ (Word16[]) dct_res : DCT of residual Qnew */ +/* _ (Word16[]) dct_pitex : DCT of pitch contribution Qnew */ +/* _ (Word16[]) pitch_buf : Pitch per subframe Q6 */ +/* _ (Word16[]) nb_subfr : Number of subframe considered */ +/* _ (Word16) hangover : hangover for the time contribution switching*/ +/* _ (Word16) Qnew : */ +/*----------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) dct_res : DCT of residual Qnew */ +/* _ (Word16[]) dct_pitex : DCT of pitch contribution Qnew */ +/*----------------------------------------------------------------------*/ +/*----------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*======================================================================*/ +/* o : bin where pitch contribution is significant */ +Word16 Pit_exc_contribution_len_fx( + Encoder_State *st_fx, /* i/o: state structure */ + const Word16 *dct_res, /* i : DCT of residual Qnew*/ + Word16 *dct_pitex, /* i/o: DCT of pitch contribution Qnew*/ + Word16 *pitch_buf, /* i/o: Pitch per subframe Q6*/ + const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ + Word16 *hangover, /* i : hangover for the time contribution switching Q0*/ + Word16 Qnew ) +{ Word16 corr_dct_pit[MBANDS_LOC]; Word32 corr_tmp, L_tmp; Word16 av_corr, min_corr, ftmp, tmp_ex, tmp_res; @@ -378,24 +379,14 @@ Word16 Pit_exc_contribution_len_fx( /* o : bin where pit move16(); set16_fx( pitch_buf, shl( L_SUBFR, 6 ), NB_SUBFR16k ); + /* pitch contribution useless - delete all previously written indices belonging to pitch contribution */ - FOR( i = TAG_ACELP_SUBFR_LOOP_START; i < TAG_ACELP_SUBFR_LOOP_END; i++ ) + for ( i = TAG_ACELP_SUBFR_LOOP_START; i < TAG_ACELP_SUBFR_LOOP_END; i++ ) { - IF( hBstr->ind_list[i].nb_bits != -1 ) - { - hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, hBstr->ind_list[i].nb_bits ); /* Q0 */ - hBstr->ind_list[i].nb_bits = -1; - move16(); - } + delete_indice( hBstr, i ); } - IF( hBstr->ind_list[IND_ES_PRED].nb_bits != -1 ) - { - hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, hBstr->ind_list[IND_ES_PRED].nb_bits ); /* Q0 */ - move16(); - hBstr->ind_list[IND_ES_PRED].nb_bits = -1; - move16(); - } + delete_indice( hBstr, IND_ES_PRED ); } IF( LT_32( st_fx->core_brate, CFREQ_BITRATE ) ) { @@ -409,17 +400,17 @@ Word16 Pit_exc_contribution_len_fx( /* o : bin where pit IF( EQ_16( st_fx->coder_type, INACTIVE ) ) { - push_indice_fx( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 1 ); + push_indice( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 1 ); } } ELSE { - push_indice_fx( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 3 ); + push_indice( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 3 ); } } ELSE { - push_indice_fx( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 4 ); + push_indice( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 4 ); } return last_pit_bin; @@ -428,11 +419,11 @@ Word16 Pit_exc_contribution_len_fx( /* o : bin where pit Word16 Pit_exc_contribution_len_ivas_fx( /* o : bin where pitch contribution is significant */ Encoder_State *st_fx, /* i/o: state structure */ - const Word16 *dct_res, /* i : DCT of residual Q_new*/ - Word16 *dct_pitex, /* i/o: DCT of pitch contribution Q_new*/ - Word16 *pitch_buf, /* i/o: Pitch per subframe Q6*/ - const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ - Word16 *hangover, /* i : hangover for the time contribution switching Q0*/ + const Word16 *dct_res, /* i : DCT of residual Q_new*/ + Word16 *dct_pitex, /* i/o: DCT of pitch contribution Q_new*/ + Word16 *pitch_buf, /* i/o: Pitch per subframe Q6*/ + const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ + Word16 *hangover, /* i : hangover for the time contribution switching Q0*/ Word16 Qnew ) { diff --git a/lib_enc/evs_enc_fx.c b/lib_enc/evs_enc_fx.c index c86b7e0613bcc737810d7a33d01b17b2d021a76e..416c2f4e974134a63139b6f4cb74cd4dc16b3a02 100644 --- a/lib_enc/evs_enc_fx.c +++ b/lib_enc/evs_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -29,10 +29,10 @@ static void configure_core_coder_loc( Encoder_State *st ); *-------------------------------------------------------------------*/ ivas_error evs_enc_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 *data, /* i : input signal Q0*/ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 *data, /* i : input signal Q0*/ Word32 *mem_hp20_in_fx, /* i/o: hp20 filter memory Qx*/ - const Word16 n_samples /* i : number of input samples Q0*/ + const Word16 n_samples /* i : number of input samples Q0*/ ) { Word16 i, input_frame, delay; @@ -100,7 +100,7 @@ ivas_error evs_enc_fx( * Initializiation *-----------------------------------------------------------------*/ - input_frame = st->input_frame_fx; + input_frame = extract_l( Mpy_32_32_r( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); move16(); st->core = -1; move16(); @@ -169,18 +169,6 @@ ivas_error evs_enc_fx( { updt_IO_switch_enc_fx( st, input_frame ); set16_fx( hBWE_TD->old_speech_shb_fx, 0, L_LOOK_16k + L_SUBFR16k ); -#if defined IVAS_CODE - PMT( "find scaling factor for prev_enr_EnvSHBres, prev_pow_exc16kWhtnd and prev_mix_factor " ) - set16_fx( st->hBWE_TD->old_speech_shb, 0, L_LOOK_16k + L_SUBFR16k ); - set16_fx( st->hBWE_TD->mem_shb_res, 0, MAX_LEN_MA_FILTER ); - set16_fx( st->hBWE_TD->old_EnvSHBres, 0, L_FRAME4k ); - st->hBWE_TD->old_mean_EnvSHBres = 0; - st->hBWE_TD->prev_enr_EnvSHBres = 1.0f; - st->hBWE_TD->prev_shb_env_tilt = 0; - st->hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; - st->hBWE_TD->prev_mix_factor = 1.0f; - st->hBWE_TD->prev_Env_error = 0; -#endif cldfb_reset_memory( st->cldfbAnaEnc ); cldfb_reset_memory( st->cldfbSynTd ); } @@ -281,7 +269,7 @@ ivas_error evs_enc_fx( IF( EQ_16( st->core, ACELP_CORE ) ) { acelp_core_enc_fx( st, inp, ener, A, Aw, epsP_h, epsP_l, lsp_new, lsp_mid, vad_hover_flag, - attack_flag, bwe_exc_extended, voice_factors, old_syn_12k8_16k, pitch_buf, &unbits, NULL, NULL, Q_new, shift ); + attack_flag, bwe_exc_extended, voice_factors, old_syn_12k8_16k, pitch_buf, &unbits, NULL, Q_new, shift ); } /*---------------------------------------------------------------------* * HQ core encoding @@ -326,7 +314,7 @@ ivas_error evs_enc_fx( bwe_exc_extended, voice_factors, pitch_buf, vad_hover_flag, &Q_new, &shift ); #ifndef FIX_I4_OL_PITCH - Copy( pitch_orig, st->pitch, 3 ); /* populate the original OL pitch values back Q0*/ + Copy( pitch_orig, st->pitch, 3 ); /* populate the original OL pitch values back Q0*/ #endif /*---------------------------------------------------------------------* @@ -419,7 +407,7 @@ ivas_error evs_enc_fx( FOR( i = 0; i < padBits; i++ ) { - push_next_indice_fx( hBstr, 0, 1 ); + push_next_indice( hBstr, 0, 1 ); } } @@ -466,16 +454,6 @@ ivas_error evs_enc_fx( { set16_fx( hBWE_TD->old_speech_shb_fx, 0, L_LOOK_16k + L_SUBFR16k ); set16_fx( shb_speech, 0, L_FRAME16k ); -#if defined IVAS_CODE - set_f( st->hBWE_TD->mem_shb_res, 0.0f, MAX_LEN_MA_FILTER ); - set_f( st->hBWE_TD->old_EnvSHBres, 0.0f, L_FRAME4k ); - st->hBWE_TD->old_mean_EnvSHBres = 0.0f; - st->hBWE_TD->prev_enr_EnvSHBres = 1.0f; - st->hBWE_TD->prev_shb_env_tilt = 0.0f; - st->hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; - st->hBWE_TD->prev_mix_factor = 1.0f; - st->hBWE_TD->prev_Env_error = 0.0f; -#endif } /* SWB TBE encoder */ @@ -641,7 +619,6 @@ static void initFrameHeader_loc( Encoder_State *st ) } ELSE { - // PMT("Frame header needs review") FOR( n = 0; n < FRAME_SIZE_NB; n++ ) { IF( EQ_16( FrameSizeConfig[n].frame_bits, st->bits_frame_nominal ) ) @@ -678,19 +655,19 @@ static void writeFrameHeader_loc( Encoder_State *st ) IF( EQ_16( st->cng_type, FD_CNG ) ) { /* write SID/CNG type flag */ - push_next_indice_fx( hBstr, 1, 1 ); + push_next_indice( hBstr, 1, 1 ); /* write bandwidth mode */ - push_next_indice_fx( hBstr, st->bwidth, 2 ); + push_next_indice( hBstr, st->bwidth, 2 ); /* write L_frame */ IF( EQ_16( st->L_frame, L_FRAME ) ) { - push_next_indice_fx( hBstr, 0, 1 ); + push_next_indice( hBstr, 0, 1 ); } ELSE { - push_next_indice_fx( hBstr, 1, 1 ); + push_next_indice( hBstr, 1, 1 ); } } } @@ -698,7 +675,7 @@ static void writeFrameHeader_loc( Encoder_State *st ) { IF( st->rf_mode == 0 ) { - push_next_indice_fx( hBstr, sub( st->bwidth, FrameSizeConfig[st->frame_size_index].bandwidth_min ), FrameSizeConfig[st->frame_size_index].bandwidth_bits ); + push_next_indice( hBstr, sub( st->bwidth, FrameSizeConfig[st->frame_size_index].bandwidth_min ), FrameSizeConfig[st->frame_size_index].bandwidth_bits ); } } @@ -706,7 +683,7 @@ static void writeFrameHeader_loc( Encoder_State *st ) test(); IF( FrameSizeConfig[st->frame_size_index].reserved_bits && st->rf_mode == 0 ) { - push_next_indice_fx( hBstr, 0, FrameSizeConfig[st->frame_size_index].reserved_bits ); + push_next_indice( hBstr, 0, FrameSizeConfig[st->frame_size_index].reserved_bits ); } } diff --git a/lib_enc/ext_sig_ana_fx.c b/lib_enc/ext_sig_ana_fx.c index f546c3ef8f6c2edb7eddad5358700447e8efc613..435bfb52dc7f04f49d042556868e5322bcfe7bd0 100644 --- a/lib_enc/ext_sig_ana_fx.c +++ b/lib_enc/ext_sig_ana_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -70,24 +70,12 @@ void core_signal_analysis_high_bitrate_fx( Word32 *tmpP32; Word16 Q_exp; -#ifdef IVAS_CODE - int16_t disable_ltp = 0; -#endif TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; -#ifndef IVAS_CODE /* dummy */ (void) vad_hover_flag; (void) last_element_mode; -#endif -#ifdef IVAS_CODE - if ( NE_16( last_element_mode, st->element_mode ) ) - { - disable_ltp = 1; /* disable TCX-LTP in stereo switching to avoid discontinuities in synthesis */ - move16(); - } -#endif left_overlap = -1; move16(); right_overlap = -1; @@ -122,7 +110,6 @@ void core_signal_analysis_high_bitrate_fx( } IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - // PMT("tcx_ltp_encode_fx should be verified for IVAS") tcx_ltp_encode_fx( hTcxEnc->tcxltp, (Word8) st->tcxonly, hTcxEnc->tcxMode, L_frame, L_SUBFR, st->speech_enc + st->encoderLookahead_enc, hTcxEnc->speech_ltp + st->encoderLookahead_enc, st->speech_enc + st->encoderLookahead_enc, @@ -130,7 +117,7 @@ void core_signal_analysis_high_bitrate_fx( &hTcxEnc->tcxltp_pitch_int, &hTcxEnc->tcxltp_pitch_fr, &hTcxEnc->tcxltp_gain, &hTcxEnc->tcxltp_pitch_int_past, &hTcxEnc->tcxltp_pitch_fr_past, &hTcxEnc->tcxltp_gain_past, &hTcxEnc->tcxltp_norm_corr_past, st->last_core, st->pit_min, st->pit_fr1, - st->pit_fr2, st->pit_max, st->pit_res_max, &st->transientDetection, + st->pit_fr2, st->pit_max, st->pit_res_max, st->hTranDet, tmp8, NULL, M ); } ELSE @@ -142,7 +129,7 @@ void core_signal_analysis_high_bitrate_fx( &hTcxEnc->tcxltp_pitch_int, &hTcxEnc->tcxltp_pitch_fr, &hTcxEnc->tcxltp_gain, &hTcxEnc->tcxltp_pitch_int_past, &hTcxEnc->tcxltp_pitch_fr_past, &hTcxEnc->tcxltp_gain_past, &hTcxEnc->tcxltp_norm_corr_past, st->last_core, st->pit_min, st->pit_fr1, - st->pit_fr2, st->pit_max, st->pit_res_max, &st->transientDetection, + st->pit_fr2, st->pit_max, st->pit_res_max, st->hTranDet, tmp8, NULL, M ); } @@ -190,7 +177,7 @@ void core_signal_analysis_high_bitrate_fx( alw_pitch_lag_12k8_wc = s_min( alw_pitch_lag_12k8[0], alw_pitch_lag_12k8[1] ); /* Q0 */ alw_voicing_wc = s_max( alw_voicing[0], alw_voicing[1] ); /* Q15 */ } - overlap_mode[0] = last_overlap; /* Overlap between the last and the current frame Q0*/ + overlap_mode[0] = last_overlap; /* Overlap between the last and the current frame Q0*/ move16(); IF( EQ_16( hTcxEnc->tcxMode, TCX_20 ) ) @@ -200,7 +187,7 @@ void core_signal_analysis_high_bitrate_fx( transform_type[0] = TCX_20; transform_type[1] = TCX_20; move16(); - overlap_mode[1] = curr_overlap; /* Overlap between the current and the next frame Q0*/ + overlap_mode[1] = curr_overlap; /* Overlap between the current and the next frame Q0*/ move16(); IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) @@ -260,7 +247,7 @@ void core_signal_analysis_high_bitrate_fx( move16(); } } - overlap_mode[2] = curr_overlap; /* Overlap between the current and the next frame Q0*/ + overlap_mode[2] = curr_overlap; /* Overlap between the current and the next frame Q0*/ move16(); } IF( NE_16( transform_type[0], TCX_20 ) ) @@ -300,15 +287,6 @@ void core_signal_analysis_high_bitrate_fx( WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno], overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, tcx20Win, st->element_mode != IVAS_CPE_MDCT /* truncate_aldo */, 1 ); -#ifdef IVAS_CODE - if ( windowed_samples != NULL ) /* save windowed speech_TCX samples */ - { - assert( L_subframe + ( left_overlap + right_overlap ) / 2 < 2 * L_FRAME_MAX / nSubframes - L_FRAME_MAX / 8 ); - windowed_samples[frameno * L_FRAME_MAX + 0] = (float) overlap_mode[frameno]; - windowed_samples[frameno * L_FRAME_MAX + 1] = (float) overlap_mode[frameno + 1]; - mvr2r( tcx20Win, windowed_samples + frameno * L_FRAME_MAX + 2, L_subframe + ( left_overlap + right_overlap ) / 2 ); - } -#endif } IF( EQ_16( transform_type[frameno], TCX_5 ) ) @@ -321,15 +299,6 @@ void core_signal_analysis_high_bitrate_fx( tcx20Win[folding_offset + i] = sub_sat( tcx20Win[folding_offset + i], tcx20Win[folding_offset - 1 - i] ); // Q0 move16(); } -#ifdef IVAS_CODE - if ( st->element_mode == IVAS_CPE_MDCT && frameno == 0 && overlap_mode[0] == FULL_OVERLAP && L_subframe - left_overlap > minWindowLen ) - { - for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ - { - tcx20Win[left_overlap + i] -= hTcxEnc->speech_TCX[-1 - i] * st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] * st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i]; - } - } -#endif /* Outter right folding */ tmp = shr( right_overlap, 1 ); FOR( i = 0; i < tmp; i++ ) @@ -365,13 +334,6 @@ void core_signal_analysis_high_bitrate_fx( tmpP16 += tcx5SizeFB; tmpP32 += tcx5SizeFB; -#ifdef IVAS_CODE - /* high-band gain control in case of BWS */ - if ( st->bwidth_sw_cnt > 0 ) - { - v_multc( hTcxEnc->spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, hTcxEnc->spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), L_subframe - L_FRAME16k / ( 2 * nSubframes ) ); - } -#endif } } ELSE /* transform_type[frameno] != TCX_5 */ @@ -414,33 +376,12 @@ void core_signal_analysis_high_bitrate_fx( } ELSE { -#ifdef IVAS_CODE - if ( st->element_mode == IVAS_CPE_MDCT && frameno == 0 && transform_type[0] == TCX_10 && overlap_mode[0] == FULL_OVERLAP && L_subframe - left_overlap > minWindowLen ) - { - for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ - { - tcx20Win[left_overlap + i] -= hTcxEnc->speech_TCX[-1 - i] * st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] * st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i]; - } - } -#endif TCX_MDCT( tcx20Win, spectrum[frameno], &spectrum_e[frameno], left_overlap, sub( L_subframe, shr( add( left_overlap, right_overlap ), 1 ) ), right_overlap, st->element_mode ); } /* For TCX20 at bitrates up to 64 kbps we need the power spectrum */ /* high-band gain control in case of BWS */ -#ifdef IVAS_CODE - if ( st->bwidth_sw_cnt > 0 ) - { - v_multc( hTcxEnc->spectrum[frameno] + L_FRAME16k / nSubframes, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, hTcxEnc->spectrum[frameno] + L_FRAME16k / nSubframes, L_subframe - L_FRAME16k / nSubframes ); - } - - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - set_f( &hTcxEnc->spectrum[frameno][MCT_LFE_MAX_LINE], 0.f, L_subframe - MCT_LFE_MAX_LINE ); - st->hTcxCfg->tcx_coded_lines = MCT_LFE_MAX_LINE; - } -#endif IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { test(); @@ -461,94 +402,6 @@ void core_signal_analysis_high_bitrate_fx( pMdstWin, powerSpec, &powerSpec_e ); } } -#ifdef IVAS_CODE - if ( st->element_mode == IVAS_CPE_MDCT ) - { - L_subframe = L_frameTCX / nSubframes; - - if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP && st->mct_chan_mode != MCT_CHAN_MODE_LFE ) - { - wtda_ext( hTcxEnc->new_speech_TCX, mdstWin, overlap_mode[frameno], overlap_mode[frameno + 1], L_frameTCX, 3 ); - } - else - { - /* Windowing for the MDST */ - WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, mdstWin, 0, 1 ); - } - - if ( transform_type[frameno] == TCX_5 ) - { - /* Outer left folding */ - for ( i = 0; i < left_overlap / 2; i++ ) - { - mdstWin[left_overlap / 2 + i] += mdstWin[left_overlap / 2 - 1 - i]; - } - - if ( frameno == 0 && overlap_mode[0] == FULL_OVERLAP && L_subframe - left_overlap > minWindowLen ) - { - for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ - { - mdstWin[left_overlap + i] += hTcxEnc->speech_TCX[-1 - i] * st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] * st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i]; - } - } - - /* Outer right folding */ - for ( i = 0; i < right_overlap / 2; i++ ) - { - mdstWin[L_subframe + left_overlap / 2 - 1 - i] -= mdstWin[L_subframe + left_overlap / 2 + i]; - } - - /* 2xTCX5 */ - L_subframe = tcx5SizeFB; - folding_offset = left_overlap / 2; - - for ( i = 0; i < 2; i++ ) - { - assert( st->mct_chan_mode != MCT_CHAN_MODE_LFE ); - WindowSignal( st->hTcxCfg, folding_offset, i == 0 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, i == 1 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, &left_overlap, &right_overlap, mdstWin + i * tcx5SizeFB, &L_subframe, tcx5Win, 0, 1 ); - - TCX_MDST( tcx5Win, mdst_spectrum[frameno] + i * tcx5SizeFB, left_overlap, L_subframe - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); - /* high-band gain control in case of BWS */ - if ( st->bwidth_sw_cnt > 0 ) - { - v_multc( mdst_spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, mdst_spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), L_subframe - L_FRAME16k / ( 2 * nSubframes ) ); - } - } - } - else /* transform_type[frameno] != TCX_5 */ - { - if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP && st->mct_chan_mode != MCT_CHAN_MODE_LFE ) - { - edst( mdstWin, mdst_spectrum[frameno], L_subframe, st->element_mode ); - - v_multc( mdst_spectrum[frameno], (float) sqrt( (float) NORM_MDCT_FACTOR / L_subframe ), mdst_spectrum[frameno], L_subframe ); - } - else - { - if ( frameno == 0 && transform_type[0] == TCX_10 && overlap_mode[0] == FULL_OVERLAP && L_subframe - left_overlap > minWindowLen ) - { - for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ - { - mdstWin[left_overlap + i] += hTcxEnc->speech_TCX[-1 - i] * st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] * st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i]; - } - } - - TCX_MDST( mdstWin, mdst_spectrum[frameno], left_overlap, L_subframe - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); - } - - /* high-band gain control in case of BWS */ - if ( st->bwidth_sw_cnt > 0 ) - { - v_multc( mdst_spectrum[frameno] + L_FRAME16k / nSubframes, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, mdst_spectrum[frameno] + L_FRAME16k / nSubframes, L_subframe - L_FRAME16k / nSubframes ); - } - } - - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - set_f( &mdst_spectrum[frameno][MCT_LFE_MAX_LINE], 0.f, L_subframe - MCT_LFE_MAX_LINE ); - } - } -#endif } IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) @@ -559,9 +412,6 @@ void core_signal_analysis_high_bitrate_fx( st->hTcxCfg->tcx_coded_lines, transform_type[frameno], ( frameno == 0 ) && ( st->last_core == ACELP_CORE ), spectrum[frameno], &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); -#ifdef IVAS_CODE - IF( st->hTcxCfg->fIsTNSAllowed ) -#endif { EncodeTnsData_fx( st->hTcxCfg->pCurrentTnsConfig, &hTcxEnc->tnsData[frameno], param_core + frameno * NPRM_DIV + 1 + NOISE_FILL_RANGES + LTPSIZE, pTnsSize + frameno, pTnsBits + frameno ); @@ -583,9 +433,6 @@ void core_signal_analysis_high_bitrate_fx( * LPC analysis *---------------------------------------------------------------*/ -#ifdef IVAS_CODE - IF( st->tcxonly ) -#endif { HBAutocorrelation_fx( st->hTcxCfg, lpc_left_overlap_mode, lpc_right_overlap_mode, &st->speech_enc_pe[frameno * tcx10Size], shr( L_frame, sub( nSubframes, 1 ) ), r, M ); @@ -675,6 +522,7 @@ void core_signal_analysis_high_bitrate_ivas_fx( Word16 alw_voicing[2], alw_voicing_wc = -1; Word16 disable_ltp = 0; Word16 tmp, *tmpP16; + Word16 q_mdstWin = st->q_inp, q_tcx20Win = st->q_inp; Word32 *tmpP32; Word16 Q_exp; Word32 L_tmpbuf[N_MAX + L_MDCT_OVLP_MAX]; @@ -684,15 +532,18 @@ void core_signal_analysis_high_bitrate_ivas_fx( move16(); move16(); move16(); + move16(); + move16(); (void) vad_hover_flag; Word16 Q_win_temp[2]; Word16 *speech_ltp_fx = NULL; Word16 *wspeech_fx = NULL; Word16 *speech_fx = NULL; - Word16 q_out_wtda = 0; + Word16 q_out_wtda = st->q_inp; move16(); Word16 win_len[2]; move16(); + Word16 shift; set32_fx( buf_powerSPec, 0, N_MAX + L_MDCT_OVLP_MAX ); set16_fx( buf_powerSPec_exp, 0, N_MAX + L_MDCT_OVLP_MAX ); @@ -799,7 +650,7 @@ void core_signal_analysis_high_bitrate_ivas_fx( alw_voicing_wc = s_max( alw_voicing[0], alw_voicing[1] ); // Q15 } - overlap_mode[0] = last_overlap; /* Overlap between the last and the current frame Q0*/ + overlap_mode[0] = last_overlap; /* Overlap between the last and the current frame Q0*/ move16(); IF( EQ_16( hTcxEnc->tcxMode, TCX_20 ) ) @@ -810,7 +661,7 @@ void core_signal_analysis_high_bitrate_ivas_fx( move16(); transform_type[1] = TCX_20; move16(); - overlap_mode[1] = curr_overlap; /* Overlap between the current and the next frame Q0*/ + overlap_mode[1] = curr_overlap; /* Overlap between the current and the next frame Q0*/ move16(); IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) @@ -870,7 +721,7 @@ void core_signal_analysis_high_bitrate_ivas_fx( move16(); } } - overlap_mode[2] = curr_overlap; /* Overlap between the current and the next frame Q0*/ + overlap_mode[2] = curr_overlap; /* Overlap between the current and the next frame Q0*/ move16(); } @@ -961,16 +812,14 @@ void core_signal_analysis_high_bitrate_ivas_fx( move32(); windowed_samples[frameno * L_FRAME_MAX + 1] = L_deposit_l( overlap_mode[frameno + 1] ); // Q0 move32(); - Copy_Scale_sig_16_32_DEPREC( tcx20Win, windowed_samples + add( imult1616( frameno, L_FRAME_MAX ), 2 ), add( L_subframe, shr( add( left_overlap, right_overlap ), 1 ) ), 0 ); + Copy_Scale_sig_16_32_DEPREC( tcx20Win, windowed_samples + add( imult1616( frameno, L_FRAME_MAX ), 2 ), add( L_subframe, shr( add( left_overlap, right_overlap ), 1 ) ), negate( q_tcx20Win ) ); *q_win = s_min( *q_win, sub( L_norm_arr( windowed_samples + add( imult1616( frameno, L_FRAME_MAX ), 2 ), add( L_subframe, shr( add( left_overlap, right_overlap ), 1 ) ) ), 1 ) ); move16(); Q_win_temp[frameno] = *q_win; move16(); -#ifdef MSAN_FIX Scale_sig32( windowed_samples + frameno * L_FRAME_MAX + 2, win_len[frameno], *q_win ); // q_win -#endif IF( EQ_16( frameno, 1 ) ) { Scale_sig32( windowed_samples + 2, win_len[0], sub( *q_win, Q_win_temp[0] ) ); // q_win @@ -985,7 +834,7 @@ void core_signal_analysis_high_bitrate_ivas_fx( /* Outter left folding */ FOR( i = 0; i < folding_offset; i++ ) { - tcx20Win[folding_offset + i] = sub_sat( tcx20Win[folding_offset + i], tcx20Win[folding_offset - 1 - i] ); // Q0 + tcx20Win[folding_offset + i] = sub_sat( tcx20Win[folding_offset + i], tcx20Win[folding_offset - 1 - i] ); // q_tcx20Win move16(); } @@ -998,18 +847,16 @@ void core_signal_analysis_high_bitrate_ivas_fx( Word32 L_tmp; FOR( i = minWindowLen; i >= tmp; i-- ) /* outer left folding of shortened long ALDO slope */ { - L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (Q0, Q15) -> Q16 - L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i].v.im ); // (Q16, Q15) -> Q16 - L_tmp = L_shl( L_tmp, sub( 0, Q16 ) ); // Q0 - tcx20Win[left_overlap + i] = sub_sat( tcx20Win[left_overlap + i], extract_l( L_tmp ) ); // Q0 + L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (q_tcx20Win, Q15) -> Q16 + q_tcx20Win + L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i].v.im ); // (Q16 + q_tcx20Win, Q15) -> Q16 + q_tcx20Win + tcx20Win[left_overlap + i] = sub_sat( tcx20Win[left_overlap + i], extract_h( L_tmp ) ); // q_tcx20Win move32(); } FOR( i = tmp - 1; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ { - L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (Q0, Q15) -> Q16 - L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[i].v.re ); // (Q16, Q15) -> Q16 - L_tmp = L_shl( L_tmp, sub( 0, Q16 ) ); // Q0 - tcx20Win[left_overlap + i] = sub_sat( tcx20Win[left_overlap + i], extract_l( L_tmp ) ); // Q0 + L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (q_tcx20Win, Q15) -> Q16 + q_tcx20Win + L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[i].v.re ); // (Q16 + q_tcx20Win, Q15) -> Q16 + q_tcx20Win + tcx20Win[left_overlap + i] = sub_sat( tcx20Win[left_overlap + i], extract_h( L_tmp ) ); // q_tcx20Win move32(); } } @@ -1018,7 +865,7 @@ void core_signal_analysis_high_bitrate_ivas_fx( tmp = shr( right_overlap, 1 ); FOR( i = 0; i < tmp; i++ ) { - tcx20Win[L_subframe + folding_offset - 1 - i] = add_sat( tcx20Win[L_subframe + folding_offset - 1 - i], tcx20Win[L_subframe + folding_offset + i] ); // Q0 + tcx20Win[L_subframe + folding_offset - 1 - i] = add_sat( tcx20Win[L_subframe + folding_offset - 1 - i], tcx20Win[L_subframe + folding_offset + i] ); // q_tcx20Win move16(); } @@ -1029,6 +876,12 @@ void core_signal_analysis_high_bitrate_ivas_fx( tmpP16 = tcx20Win; tmpP32 = hTcxEnc->spectrum_fx[frameno]; assert( st->mct_chan_mode != MCT_CHAN_MODE_LFE ); + Word16 len[2], exp[2]; + hTcxEnc->spectrum_e[frameno] = sub( 16, q_tcx20Win ); + exp[0] = exp[1] = hTcxEnc->spectrum_e[frameno]; + move16(); + move16(); + move16(); FOR( i = 0; i < 2; i++ ) { test(); @@ -1039,17 +892,17 @@ void core_signal_analysis_high_bitrate_ivas_fx( mac_r( 2 << 16, -( 3 << 8 ), shl( i, 7 ) ), /* equivalent to: sub(i, 1) == 0 ? RECTANGULAR_OVERLAP : MIN_OVERLAP */ &left_overlap, &right_overlap, tmpP16, &L_subframe, tcx5Win, st->element_mode != IVAS_CPE_MDCT, 1 ); - hTcxEnc->spectrum_e[frameno] = 16; - move16(); TCX_MDCT( tcx5Win, tmpP32, - &hTcxEnc->spectrum_e[frameno], + &exp[i], left_overlap, sub( L_subframe, shr( add( left_overlap, right_overlap ), 1 ) ), right_overlap, st->element_mode ); tmpP16 += tcx5SizeFB; tmpP32 += tcx5SizeFB; + len[i] = L_subframe; + move16(); /* high-band gain control in case of BWS */ IF( st->bwidth_sw_cnt > 0 ) @@ -1060,12 +913,19 @@ void core_signal_analysis_high_bitrate_ivas_fx( tmp = BASOP_Util_Divide1616_Scale( st->bwidth_sw_cnt, BWS_TRAN_PERIOD, &exp_diff ); factor = L_shl( L_deposit_h( tmp ), exp_diff ); // Q31 - v_multc_fixed( hTcxEnc->spectrum_fx[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), - factor, - hTcxEnc->spectrum_fx[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), - L_subframe - L_FRAME16k / ( 2 * nSubframes ) ); + v_multc_fx( hTcxEnc->spectrum_fx[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), + factor, + hTcxEnc->spectrum_fx[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), + L_subframe - L_FRAME16k / ( 2 * nSubframes ) ); } } + hTcxEnc->spectrum_e[frameno] = s_max( exp[0], exp[1] ); + move16(); + + FOR( i = 0; i < 2; i++ ) + { + scale_sig32( hTcxEnc->spectrum_fx[frameno] + i * L_subframe, len[i], sub( exp[i], hTcxEnc->spectrum_e[frameno] ) ); + } } ELSE /* transform_type[frameno] != TCX_5 */ { @@ -1093,7 +953,7 @@ void core_signal_analysis_high_bitrate_ivas_fx( tmp = Sqrt16( tmp, &exp_diff ); factor = L_shl( L_deposit_h( tmp ), exp_diff ); // Q31 - v_multc_fixed( hTcxEnc->spectrum_fx[frameno], factor, hTcxEnc->spectrum_fx[frameno], L_subframe ); + v_multc_fx( hTcxEnc->spectrum_fx[frameno], factor, hTcxEnc->spectrum_fx[frameno], L_subframe ); } ELSE { @@ -1107,23 +967,23 @@ void core_signal_analysis_high_bitrate_ivas_fx( Word32 L_tmp; FOR( i = minWindowLen; i >= tmp; i-- ) /* outer left folding of shortened long ALDO slope */ { - L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (Q0, Q15) -> Q16 - L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i].v.im ); // (Q16, Q15) -> Q16 - L_tmp = L_shl( L_tmp, sub( 0, Q16 ) ); // Q0 - tcx20Win[left_overlap + i] = sub_sat( tcx20Win[left_overlap + i], extract_l( L_tmp ) ); // Q0 + L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (q_tcx20Win, Q15) -> Q16 + q_tcx20Win + L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i].v.im ); // (Q16, Q15) -> Q16 + q_tcx20Win + tcx20Win[left_overlap + i] = sub_sat( tcx20Win[left_overlap + i], extract_h( L_tmp ) ); // q_tcx20Win move32(); } FOR( i = tmp - 1; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ { - L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (Q0, Q15) -> Q16 - L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[i].v.re ); // (Q16, Q15) -> Q16 - L_tmp = L_shl( L_tmp, sub( 0, Q16 ) ); // Q0 - tcx20Win[left_overlap + i] = sub_sat( tcx20Win[left_overlap + i], extract_l( L_tmp ) ); // Q0 + L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (q_tcx20Win, Q15) -> Q16 + q_tcx20Win + L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[i].v.re ); // (Q16 + q_tcx20Win, Q15) -> Q16 + q_tcx20Win + tcx20Win[left_overlap + i] = sub_sat( tcx20Win[left_overlap + i], extract_h( L_tmp ) ); // q_tcx20Win move32(); } } TCX_MDCT( tcx20Win, hTcxEnc->spectrum_fx[frameno], &hTcxEnc->spectrum_e[frameno], left_overlap, sub( L_subframe, shr( add( left_overlap, right_overlap ), 1 ) ), right_overlap, st->element_mode ); + hTcxEnc->spectrum_e[frameno] = sub( hTcxEnc->spectrum_e[frameno], q_tcx20Win ); + move16(); } /* high-band gain control in case of BWS */ @@ -1135,10 +995,10 @@ void core_signal_analysis_high_bitrate_ivas_fx( tmp = BASOP_Util_Divide1616_Scale( st->bwidth_sw_cnt, BWS_TRAN_PERIOD, &exp_diff ); factor = L_shl( L_deposit_h( tmp ), exp_diff ); // Q31 - v_multc_fixed( hTcxEnc->spectrum_fx[frameno] + L_FRAME16k / nSubframes, - factor, - hTcxEnc->spectrum_fx[frameno] + L_FRAME16k / nSubframes, - L_subframe - L_FRAME16k / nSubframes ); + v_multc_fx( hTcxEnc->spectrum_fx[frameno] + L_FRAME16k / nSubframes, + factor, + hTcxEnc->spectrum_fx[frameno] + L_FRAME16k / nSubframes, + L_subframe - L_FRAME16k / nSubframes ); } IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) @@ -1149,24 +1009,32 @@ void core_signal_analysis_high_bitrate_ivas_fx( IF( EQ_16( hTcxEnc->tcxMode, TCX_20 ) && ( ( LT_32( st->total_brate, HQ_96k ) ) || st->igf ) ) { pMdstWin = tcx20Win; + Word16 q_pmdstWin = q_tcx20Win; + move16(); test(); if ( ( ( EQ_16( hTcxEnc->tcxMode, TCX_20 ) ) && ( NE_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) ) ) { pMdstWin = mdstWin; + q_pmdstWin = q_mdstWin; + move16(); } /* Compute noise-measure flags for spectrum filling and quantization */ AnalyzePowerSpectrum_ivas_fx( st, div_l( L_mult( L_subframe, st->L_frame ), hTcxEnc->L_frameTCX ), L_subframe, left_overlap, right_overlap, hTcxEnc->spectrum_fx[frameno], hTcxEnc->spectrum_e[frameno], - pMdstWin, powerSpec, powerSpec_e ); + pMdstWin, q_pmdstWin, powerSpec, powerSpec_e ); } } } IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) { - Word16 q_mdstWin, scale; - L_subframe = idiv1616( L_frameTCX, nSubframes ); /* Q0 */ + Word16 scale; + L_subframe = L_frameTCX; /* Q0 */ /* L_subframe = idiv1616( L_frameTCX, nSubframes ); */ + IF( EQ_16( nSubframes, 2 ) ) + { + L_subframe = shr( L_frameTCX, 1 ); + } test(); IF( EQ_16( transform_type[frameno], TCX_20 ) && NE_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) @@ -1175,8 +1043,7 @@ void core_signal_analysis_high_bitrate_ivas_fx( scale = sub( norm_arr( mdstWin, L_frameTCX ), 1 ); scale = s_min( 1, scale ); // restricting the Q to zero or less scale_sig( mdstWin, L_frameTCX, scale ); - q_mdstWin = add( -1, scale ); - move16(); + q_mdstWin = add( add( st->q_inp, -1 ), scale ); } ELSE { @@ -1187,8 +1054,7 @@ void core_signal_analysis_high_bitrate_ivas_fx( scale = sub( norm_arr( mdstWin, sig_len ), 1 ); scale = s_min( 0, scale ); // restricting the Q to zero or less scale_sig( mdstWin, sig_len, scale ); - q_mdstWin = scale; - move16(); + q_mdstWin = add( scale, st->q_inp ); } IF( EQ_16( transform_type[frameno], TCX_5 ) ) @@ -1204,20 +1070,21 @@ void core_signal_analysis_high_bitrate_ivas_fx( IF( frameno == 0 && overlap_mode[0] == FULL_OVERLAP && GT_16( sub( L_subframe, left_overlap ), minWindowLen ) ) { tmp = shr( st->hTcxCfg->tcx_mdct_window_min_lengthFB, 1 ); + shift = sub( q_mdstWin, add( Q16, st->q_inp ) ); Word32 L_tmp; FOR( i = minWindowLen; i >= tmp; i-- ) /* outer left folding of shortened long ALDO slope */ { - L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (Q0, Q15) -> Q16 - L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i].v.im ); // (Q16, Q15) -> Q16 - L_tmp = L_shl( L_tmp, sub( q_mdstWin, Q16 ) ); // q_mdstWin + L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (q_inp, Q15) -> Q16 + q_inp + L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i].v.im ); // (Q16 + q_inp, Q15) -> Q16 + q_inp + L_tmp = L_shl( L_tmp, shift ); // q_mdstWin mdstWin[left_overlap + i] = add( mdstWin[left_overlap + i], extract_l( L_tmp ) ); // q_mdstWin move32(); } FOR( i = tmp - 1; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ { - L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (Q0, Q15) -> Q16 - L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[i].v.re ); // (Q16, Q15) -> Q16 - L_tmp = L_shl( L_tmp, sub( q_mdstWin, Q16 ) ); // q_mdstWin + L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (q_inp, Q15) -> Q16 + q_inp + L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[i].v.re ); // (Q16 + q_inp, Q15) -> Q16 + q_inp + L_tmp = L_shl( L_tmp, shift ); // q_mdstWin mdstWin[left_overlap + i] = add( mdstWin[left_overlap + i], extract_l( L_tmp ) ); // q_mdstWin move32(); } @@ -1253,10 +1120,10 @@ void core_signal_analysis_high_bitrate_ivas_fx( tmp = BASOP_Util_Divide1616_Scale( st->bwidth_sw_cnt, BWS_TRAN_PERIOD, &exp_diff ); factor = L_shl( L_deposit_h( tmp ), exp_diff ); // Q31 - v_multc_fixed( spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), - factor, - spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), - L_subframe - L_FRAME16k / ( 2 * nSubframes ) ); + v_multc_fx( spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), + factor, + spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), + L_subframe - L_FRAME16k / ( 2 * nSubframes ) ); } } } @@ -1281,7 +1148,7 @@ void core_signal_analysis_high_bitrate_ivas_fx( tmp = Sqrt16( tmp, &exp_diff ); factor = L_shl( L_deposit_h( tmp ), exp_diff ); // Q31 - v_multc_fixed( spectrum[frameno], factor, spectrum[frameno], L_subframe ); + v_multc_fx( spectrum[frameno], factor, spectrum[frameno], L_subframe ); } ELSE { @@ -1292,19 +1159,20 @@ void core_signal_analysis_high_bitrate_ivas_fx( { tmp = shr( st->hTcxCfg->tcx_mdct_window_min_lengthFB, 1 ); Word32 L_tmp; + shift = sub( q_mdstWin, add( Q16, st->q_inp ) ); FOR( i = minWindowLen; i >= tmp; i-- ) /* outer left folding of shortened long ALDO slope */ { - L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (Q0, Q15) -> Q16 - L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i].v.im ); // (Q16, Q15) -> Q16 - L_tmp = L_shl( L_tmp, sub( q_mdstWin, Q16 ) ); // q_mdstWin + L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (q_inp, Q15) -> Q16 + q_inp + L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i].v.im ); // (Q16 + q_inp, Q15) -> Q16 + q_inp + L_tmp = L_shl( L_tmp, shift ); // q_mdstWin mdstWin[left_overlap + i] = add( mdstWin[left_overlap + i], extract_l( L_tmp ) ); // q_mdstWin move32(); } FOR( i = tmp - 1; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ { - L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (Q0, Q15) -> Q16 - L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[i].v.re ); // (Q16, Q15) -> Q16 - L_tmp = L_shl( L_tmp, sub( q_mdstWin, Q16 ) ); // q_mdstWin + L_tmp = L_mult( hTcxEnc->speech_TCX[-1 - i], st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] ); // (q_inp, Q15) -> Q16 + q_inp + L_tmp = Mpy_32_16_1( L_tmp, st->hTcxCfg->tcx_mdct_window_minimumFB[i].v.re ); // (Q16 + q_inp, Q15) -> Q16 + q_inp + L_tmp = L_shl( L_tmp, shift ); // q_mdstWin mdstWin[left_overlap + i] = add( mdstWin[left_overlap + i], extract_l( L_tmp ) ); // q_mdstWin move32(); } @@ -1322,7 +1190,7 @@ void core_signal_analysis_high_bitrate_ivas_fx( tmp = BASOP_Util_Divide1616_Scale( st->bwidth_sw_cnt, BWS_TRAN_PERIOD, &exp_diff ); factor = L_shl( L_deposit_h( tmp ), exp_diff ); // Q31 - v_multc_fixed( spectrum[frameno] + L_FRAME16k / nSubframes, factor, spectrum[frameno] + L_FRAME16k / nSubframes, L_subframe - L_FRAME16k / nSubframes ); + v_multc_fx( spectrum[frameno] + L_FRAME16k / nSubframes, factor, spectrum[frameno] + L_FRAME16k / nSubframes, L_subframe - L_FRAME16k / nSubframes ); } } } @@ -1384,27 +1252,11 @@ void core_signal_analysis_high_bitrate_ivas_fx( IF( st->igf ) { Word16 q_spectrum = sub( Q31, hTcxEnc->spectrum_e[frameno] ); -#ifndef MSAN_FIX - ProcessIGF_ivas_fx( st, hTcxEnc->spectrum_fx[frameno], hTcxEnc->spectrum_fx[frameno], &q_spectrum, powerSpec, powerSpec_e, transform_type[frameno] == TCX_20, frameno, 0, vad_hover_flag ); -#else - ProcessIGF_ivas_fx( st, N_MAX + L_MDCT_OVLP_MAX, hTcxEnc->spectrum_fx[frameno], hTcxEnc->spectrum_fx[frameno], &q_spectrum, powerSpec, powerSpec_e, transform_type[frameno] == TCX_20, frameno, 0, vad_hover_flag ); -#endif + ProcessIGF_ivas_fx( st, N_MAX + L_MDCT_OVLP_MAX, hTcxEnc->spectrum_fx[frameno], &q_spectrum, hTcxEnc->spectrum_fx[frameno], q_spectrum, powerSpec, powerSpec_e, transform_type[frameno] == TCX_20, frameno, 0, vad_hover_flag ); } } } -#ifndef MSAN_FIX - IF( windowed_samples != NULL ) - { - FOR( frameno = 0; frameno < nSubframes; frameno++ ) - { - IF( !( ( EQ_16( transform_type[frameno], TCX_20 ) ) && ( NE_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) ) ) - { - Scale_sig32( windowed_samples + frameno * L_FRAME_MAX + 2, win_len, *q_win ); - } - } - } -#endif IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { diff --git a/lib_enc/fd_cng_enc_fx.c b/lib_enc/fd_cng_enc_fx.c index 328b81762f5998e87fcf88b120cd76fcd1488087..15a412049eecf572961c0b5b787d06aabdc3847c 100644 --- a/lib_enc/fd_cng_enc_fx.c +++ b/lib_enc/fd_cng_enc_fx.c @@ -1,15 +1,16 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ - +#include "wmc_auto.h" #include #include "stl.h" #include "options.h" #include "cnst.h" +#include "ivas_cnst.h" #include "stl.h" -#include "rom_com_fx.h" #include "rom_com.h" +#include "ivas_rom_com.h" #include "rom_enc.h" #include "prot_fx.h" #include "prot_fx_enc.h" @@ -35,26 +36,33 @@ extern void BASOP_getTables( const PWord16 **ptwiddle, const PWord16 **sin_twidd /************************************* * Create an instance of type FD_CNG * *************************************/ -void createFdCngEnc_fx( HANDLE_FD_CNG_ENC *hFdCngEnc ) +ivas_error createFdCngEnc_fx( + HANDLE_FD_CNG_ENC *hFdCngEnc ) { HANDLE_FD_CNG_ENC hs; + ivas_error error; /* Allocate memory */ - hs = (HANDLE_FD_CNG_ENC) calloc( 1, sizeof( FD_CNG_ENC ) ); - move16(); + IF( ( hs = (HANDLE_FD_CNG_ENC) malloc( sizeof( FD_CNG_ENC ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for FD CNG ENC structure" ); + } + IF( ( error = createFdCngCom_fx( &( hs->hFdCngCom ) ) ) != IVAS_ERR_OK ) + { + return error; + } - createFdCngCom_fx( &( hs->hFdCngCom ) ); *hFdCngEnc = hs; move16(); - return; + return IVAS_ERR_OK; } void initFdCngEnc_fx( HANDLE_FD_CNG_ENC hsEnc, - Word32 input_Fs, /* Q0 */ - Word16 scale ) + const Word32 input_Fs, /* Q0 */ + const Word16 scale ) { Word16 j; HANDLE_FD_CNG_COM hsCom = hsEnc->hFdCngCom; @@ -130,8 +138,10 @@ void initFdCngEnc_fx( move16(); set16_fx( hsEnc->msLogPeriodog_fx, 0, NPART ); set16_fx( hsEnc->msLogNoiseEst_fx, 0, NPART ); + set32_fx( hsEnc->msLogNoiseEst_32fx, 0, NPART ); set16_fx( hsEnc->msPsd_fx, 0, NPART ); set16_fx( hsEnc->msNoiseFloor_fx, 0, NPART ); + set32_fx( hsEnc->msNoiseFloor_32fx, 0, NPART ); set32_fx( hsEnc->msMinBuf_fx, 2147483647l /*1.0 Q31*/, MSNUMSUBFR * NPART ); set32_fx( hsEnc->msCurrentMin_fx, 2147483647l /*1.0 Q31*/, NPART ); set32_fx( hsEnc->msCurrentMinOut_fx, 2147483647l /*1.0 Q31*/, NPART ); @@ -144,8 +154,11 @@ void initFdCngEnc_fx( hsEnc->msPeriodogBufPtr = 0; move16(); set32_fx( hsEnc->msPsdSecondMoment_fx, 0, NPART ); - set32_fx( hsEnc->mem_coherence_fx, EPSILON_FX, 4 ); - set16_fx( hsEnc->mem_coherence_exp, 0, 4 ); + FOR( Word16 i = 0; i < MDCT_ST_DTX_NUM_COHERENCE_BANDS; i++ ) + { + set32_fx( hsEnc->mem_coherence_fx[i], EPSILON_FX, 4 ); + set16_fx( hsEnc->mem_coherence_exp[i], 0, 4 ); + } return; } @@ -153,9 +166,11 @@ void initFdCngEnc_fx( /************************************ * Configure FD_CNG * ************************************/ -void configureFdCngEnc_fx( HANDLE_FD_CNG_ENC hsEnc, /* i/o: Contains the variables related to the FD-based CNG process */ - Word16 bandwidth, /* i: bandwidth Q0*/ - Word32 bitrate /* Q0 */ + +void configureFdCngEnc_fx( + HANDLE_FD_CNG_ENC hsEnc, /* i/o: Contains the variables related to the FD-based CNG process */ + const Word16 bandwidth, /* i: bandwidth Q0*/ + const Word32 bitrate /* Q0 */ ) { HANDLE_FD_CNG_COM hsCom = hsEnc->hFdCngCom; @@ -277,6 +292,8 @@ void configureFdCngEnc_fx( HANDLE_FD_CNG_ENC hsEnc, /* i/o: Contains the variabl BASOP_getTables( &hsCom->olapWinSyn, NULL, NULL, shr( hsCom->fftlen, 2 ) ); hsCom->frameSize = shr( hsCom->fftlen, 1 ); move16(); + + return; } void configureFdCngEnc_ivas_fx( @@ -414,12 +431,14 @@ void configureFdCngEnc_ivas_fx( return; } + /************************************** * Delete the instance of type FD_CNG * **************************************/ -void deleteFdCngEnc_fx( HANDLE_FD_CNG_ENC *hFdCngEnc ) -{ +void deleteFdCngEnc_fx( + HANDLE_FD_CNG_ENC *hFdCngEnc ) +{ HANDLE_FD_CNG_ENC hsEnc; hsEnc = *hFdCngEnc; move16(); @@ -430,6 +449,8 @@ void deleteFdCngEnc_fx( HANDLE_FD_CNG_ENC *hFdCngEnc ) *hFdCngEnc = NULL; move16(); } + + return; } @@ -445,8 +466,16 @@ void resetFdCngEnc_fx( /* st->totalNoise_fx; Q8 Noise estimator - total noise energy */ /* Detect fast increase of totalNoise */ - totalNoiseIncrease = sub( hNoiseEst->totalNoise_fx, st->last_totalNoise_fx ); // Q8 - st->last_totalNoise_fx = hNoiseEst->totalNoise_fx; // Q8 + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + totalNoiseIncrease = sub( hNoiseEst->totalNoise_fx, st->last_totalNoise_fx ); // Q8 + st->last_totalNoise_fx = hNoiseEst->totalNoise_fx; // Q8 + } + ELSE + { + totalNoiseIncrease = sub( extract_h( hNoiseEst->totalNoise_32fx ), st->last_totalNoise_fx ); // Q8 + st->last_totalNoise_fx = extract_h( hNoiseEst->totalNoise_32fx ); // Q8 + } move16(); IF( totalNoiseIncrease > 0 ) { @@ -523,7 +552,7 @@ void resetFdCngEnc_fx( Returns: void */ -void perform_noise_estimation_enc_fx( Word32 *band_energies, /* i: energy in critical bands without minimum noise floor MODE2_E_MIN band_energies_exp*/ +void perform_noise_estimation_enc_fx( Word32 *band_energies, /* i: energy in critical bands without minimum noise floor MODE2_E_MIN band_energies_exp*/ Word16 band_energies_exp, /* i: exponent for energy in critical bands without minimum noise floor MODE2_E_MIN */ Word32 *enerBuffer, /* enerBuffer_exp */ Word16 enerBuffer_exp, @@ -687,17 +716,17 @@ void perform_noise_estimation_enc_fx( Word32 *band_energies, /* i: energy in void */ Word16 AdjustFirstSID_fx( - Word16 npart, /* i : number of parts Q0*/ - Word32 *msPeriodog, /* i : pointer to periodog vector msPeriodog_exp */ - Word16 msPeriodog_exp, /* i : exponent of periodog vector */ - Word32 *energy_ho, /* i/o : pointer to energy energy_ho_exp*/ - Word16 *energy_ho_exp, /* i/o : pointer to exponent of energy */ - Word32 *msNoiseEst, /* i/o : pointer to estimated noise msNoiseEst_exp*/ - Word16 *msNoiseEst_exp, /* i/o : pointer to exponent of estimated noise */ - Word32 *msNoiseEst_old, /* i/o : pointer to old estimated noise msNoiseEst_old_exp*/ - Word16 *msNoiseEst_old_exp, /* i/o : pointer to exponent of old estimated noise */ - Word16 *active_frame_counter, /* i/o : pointer to active frame counter Q0*/ - Encoder_State *stcod /* i : pointer to Coder_State_Plus structure */ + Word16 npart, /* i : number of parts Q0*/ + Word32 *msPeriodog, /* i : pointer to periodog vector msPeriodog_exp */ + Word16 msPeriodog_exp, /* i : exponent of periodog vector */ + Word32 *energy_ho, /* i/o : pointer to energy energy_ho_exp*/ + Word16 *energy_ho_exp, /* i/o : pointer to exponent of energy */ + Word32 *msNoiseEst, /* i/o : pointer to estimated noise msNoiseEst_exp*/ + Word16 *msNoiseEst_exp, /* i/o : pointer to exponent of estimated noise */ + Word32 *msNoiseEst_old, /* i/o : pointer to old estimated noise msNoiseEst_old_exp*/ + Word16 *msNoiseEst_old_exp, /* i/o : pointer to exponent of old estimated noise */ + Word16 *active_frame_counter, /* i/o : pointer to active frame counter Q0*/ + Encoder_State *stcod /* i : pointer to Coder_State_Plus structure */ ) { Word16 i, sc, s1, s2, lambda, lambdaM1, invFac; @@ -830,7 +859,7 @@ Word16 AdjustFirstSID_fx( void */ static void msvq_encoder( const Word16 *const cb[], /* i : Codebook (indexed cb[*stages][levels][p]) scaled with 8 bits Q9.7*/ - Word16 u[], /* i : Vector to be encoded (prediction and mean removed) Q9.7*/ + Word16 u[], /* i : Vector to be encoded (prediction and mean removed) Q9.7*/ const Word16 levels[], /* i : Number of levels in each stage Q0*/ Word16 maxC, /* i : Tree search size Q0*/ Word16 stages, /* i : Number of stages Q0*/ @@ -1169,7 +1198,6 @@ void FdCng_encodeSID_fx( HANDLE_FD_CNG_ENC stenc, /* i/o: pointer to FD_CNG stru maxVal = L_add( maxVal, gain ); maxVal = L_shl( Mpy_32_16_1( maxVal, 21771 /*0.66438561897 Q15*/ ), 1 ); - // PMT("st must be replaced by hFdCngCom") sidNoiseEst_Exp = 0; move16(); WHILE( maxVal >= 0 ) @@ -1211,27 +1239,27 @@ void FdCng_encodeSID_fx( HANDLE_FD_CNG_ENC stenc, /* i/o: pointer to FD_CNG stru { FOR( i = 0; i < stages_37bits; i++ ) { - push_next_indice_fx( hBstr, indices[i], bits_37bits[i] ); + push_next_indice( hBstr, indices[i], bits_37bits[i] ); } - push_next_indice_fx( hBstr, index, 7 ); + push_next_indice( hBstr, index, 7 ); } ELSE { - push_indice_fx( hBstr, IND_SID_TYPE, 1, 1 ); - push_indice_fx( hBstr, IND_ACELP_16KHZ, corest->bwidth, 2 ); + push_indice( hBstr, IND_SID_TYPE, 1, 1 ); + push_indice( hBstr, IND_ACELP_16KHZ, corest->bwidth, 2 ); IF( EQ_16( corest->L_frame, L_FRAME16k ) ) { - push_indice_fx( hBstr, IND_ACELP_16KHZ, 1, 1 ); + push_indice( hBstr, IND_ACELP_16KHZ, 1, 1 ); } ELSE { - push_indice_fx( hBstr, IND_ACELP_16KHZ, 0, 1 ); + push_indice( hBstr, IND_ACELP_16KHZ, 0, 1 ); } FOR( i = 0; i < stages_37bits; i++ ) { - push_indice_fx( hBstr, IND_LSF, indices[i], bits_37bits[i] ); + push_indice( hBstr, IND_LSF, indices[i], bits_37bits[i] ); } - push_indice_fx( hBstr, IND_ENERGY, index, 7 ); + push_indice( hBstr, IND_ENERGY, index, 7 ); } /* Interpolate the bin/band-wise levels from the partition levels */ @@ -2066,7 +2094,7 @@ Word16 cng_energy_fx( L_tmp = L_mult0( tmp16, tmp16 ); pt_res++; tmp16 = shl( *pt_res, scale ); - L_tmp = L_mac0( L_tmp, tmp16, tmp16 ); /* 2*(Q_new+scale) */ + L_tmp = L_mac0_sat( L_tmp, tmp16, tmp16 ); /* 2*(Q_new+scale) */ pt_res++; L_ener = L_add( L_ener, L_shr( Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), 7 ) ); /* 2*(Q_new+scale)+15+1-16+1, divide by L_frame done here */ } @@ -2120,7 +2148,7 @@ Word16 cng_energy_ivas_fx( const Word16 element_mode, /* i : element mode Q0*/ const Word16 bwidth, /* i : audio bandwidh Q0*/ const Word16 CNG_mode, /* i : mode for DTX configuration Q0*/ - const Word16 CNG_att, /* i : attenuation factor for CNG Q7*/ + const Word16 CNG_att, /* i : attenuation factor for CNG Q7*/ const Word16 *exc, /* i : input signal Q_new*/ const Word16 len, /* i : vector length */ const Word16 Q_new /* i : Input scaling */ @@ -2177,7 +2205,6 @@ Word16 cng_energy_ivas_fx( test(); IF( EQ_16( element_mode, IVAS_CPE_DFT ) || EQ_16( element_mode, IVAS_CPE_TD ) ) { - // PMT(" IVAS CNG ener computing is missing") enr = add( enr, mult( CNG_att, FAC_LOG2_BY10_Q16 ) ); /* Q8 (7+16-15) */ } ELSE IF( NE_16( bwidth, NB ) ) @@ -2208,7 +2235,7 @@ Word16 cng_energy_ivas_fx( } void perform_noise_estimation_enc_ivas_fx( - Word32 *band_energies, /* i: energy in critical bands without minimum noise floor MODE2_E_MIN band_energies_exp*/ + Word32 *band_energies, /* i: energy in critical bands without minimum noise floor MODE2_E_MIN band_energies_exp*/ Word16 band_energies_exp, Word32 *enerBuffer, /* enerBuffer_exp */ Word16 enerBuffer_exp, @@ -2240,12 +2267,12 @@ void perform_noise_estimation_enc_ivas_fx( Word16 nCLDFBpart = hFdCngEnc->hFdCngCom->nCLDFBpart; /* Q0 */ move16(); - Word16 *psize = hFdCngEnc->hFdCngCom->psize; // 6Q9 + Word16 *psize_norm = hFdCngEnc->hFdCngCom->psize_norm; // 6Q9 Word32 *msPeriodog_fx = hFdCngEnc->msPeriodog_fx; Word32 *msNoiseEst_fx = hFdCngEnc->msNoiseEst_fx; /* exp(msNoiseEst_fx_exp) */ Word16 *msLogPeriodog_fx = hFdCngEnc->msLogPeriodog_fx; - Word16 *msLogNoiseEst_fx = hFdCngEnc->msLogNoiseEst_fx; + Word32 *msLogNoiseEst_fx = hFdCngEnc->msLogNoiseEst_32fx; Word32 scaleEB_fx = 0; move32(); @@ -2317,8 +2344,10 @@ void perform_noise_estimation_enc_ivas_fx( move32(); periodog_exp[i] = sub( Q31, add( add( sub( Q31, enerBuffer_exp ), 35 - 31 ), scale ) ); move16(); - max_exp = s_max( max_exp, periodog_exp[i] ); - + if ( *ptr_per_fx ) + { + max_exp = s_max( max_exp, periodog_exp[i] ); + } ptr_per_fx++; i++; } @@ -2350,8 +2379,8 @@ void perform_noise_estimation_enc_ivas_fx( &hFdCngEnc->msPeriodog_fx_exp_cldfb ); ///* find common exponent for fft part and cldfb part of msperiodog */ - s1 = getScaleFactor32( msPeriodog_fx, nFFTpart ); - s2 = getScaleFactor32( &msPeriodog_fx[nFFTpart], nCLDFBpart ); + s1 = L_norm_arr( msPeriodog_fx, nFFTpart ); + s2 = L_norm_arr( &msPeriodog_fx[nFFTpart], nCLDFBpart ); s = s_max( sub( hFdCngEnc->msPeriodog_fx_exp_fft, s1 ), sub( hFdCngEnc->msPeriodog_fx_exp_cldfb, s2 ) ); s1 = sub( s, hFdCngEnc->msPeriodog_fx_exp_fft ); @@ -2370,7 +2399,7 @@ void perform_noise_estimation_enc_ivas_fx( FOR( i = 0; i < nCLDFBpart; i++ ) { - msPeriodog_fx[nFFTpart + i] = L_shr( msPeriodog_fx[nFFTpart + i], s_min( 31, s2 ) ); /* hFdCngEnc->msPeriodog_fx_exp_fft */ + msPeriodog_fx[nFFTpart + i] = L_shr( msPeriodog_fx[nFFTpart + i], s2 ); /* hFdCngEnc->msPeriodog_fx_exp_fft */ move32(); } } @@ -2385,12 +2414,12 @@ void perform_noise_estimation_enc_ivas_fx( /* Call the minimum statistics routine for noise estimation */ - minimum_statistics_fx( npart, nFFTpart, psize, msLogPeriodog_fx, hFdCngEnc->msNoiseFloor_fx, msLogNoiseEst_fx, hFdCngEnc->msAlpha_fx, hFdCngEnc->msPsd_fx, hFdCngEnc->msPsdFirstMoment_fx, + minimum_statistics_fx( npart, nFFTpart, psize_norm, msLogPeriodog_fx, hFdCngEnc->msNoiseFloor_32fx, msLogNoiseEst_fx, hFdCngEnc->msAlpha_fx, hFdCngEnc->msPsd_fx, hFdCngEnc->msPsdFirstMoment_fx, hFdCngEnc->msPsdSecondMoment_fx, hFdCngEnc->msMinBuf_fx, hFdCngEnc->msBminWin_fx, hFdCngEnc->msBminSubWin_fx, hFdCngEnc->msCurrentMin_fx, hFdCngEnc->msCurrentMinOut_fx, hFdCngEnc->msCurrentMinSubWindow_fx, hFdCngEnc->msLocalMinFlag, hFdCngEnc->msNewMinFlag, hFdCngEnc->msPeriodogBuf_fx, &( hFdCngEnc->msPeriodogBufPtr ), hFdCngEnc->hFdCngCom, ENC, ( hCPE == NULL ) ? 0 : hCPE->element_mode ); /* Expand MS outputs */ - expand_range( msLogNoiseEst_fx, msNoiseEst_fx, &hFdCngEnc->msNoiseEst_fx_exp, hFdCngEnc->hFdCngCom->npart ); + expand_range_fx( msLogNoiseEst_fx, msNoiseEst_fx, &hFdCngEnc->msNoiseEst_fx_exp, hFdCngEnc->hFdCngCom->npart ); return; } @@ -2457,7 +2486,7 @@ void FdCng_encodeSID_ivas_fx( v_fx[i] = Mpy_32_32( 671088640 /*10 in Q26*/, BASOP_Util_Log10( E_fx[i], hFdCngEnc->msNoiseEst_fx_exp ) ); // Q20 = 26+25-31 move32(); } - e_fx = L_add( e_fx, v_fx[i] ); // Q20 + e_fx = L_add( e_fx, L_shr( v_fx[i], 1 ) ); // Q19, add one bit headroom } /* Normalize MSVQ input */ @@ -2526,8 +2555,7 @@ void FdCng_encodeSID_ivas_fx( { gain_fx = L_add( gain_fx, v_fx[i] ); // Q = 31 - v_e } - - e_fx = L_shl( e_fx, sub( 11, v_e ) ); // Q = 31 - v_e + e_fx = L_shl( e_fx, sub( 12, v_e ) ); // Q = 31 - v_e gain_fx = Mpy_32_16_1( L_sub( e_fx, gain_fx ), div_s( 1, N ) ); // Q = 31 - v_e gain_fx = L_shl( gain_fx, sub( v_e, 8 ) ); // Q23 @@ -2651,8 +2679,11 @@ void stereoFdCngCoherence_fx( IF( NE_16( last_element_mode, IVAS_CPE_MDCT ) ) { - set32_fx( sts[0]->hFdCngEnc->mem_coherence_fx, EPSILON_FX, 4 ); - set16_fx( sts[0]->hFdCngEnc->mem_coherence_exp, 0, 4 ); + FOR( i = 0; i < MDCT_ST_DTX_NUM_COHERENCE_BANDS; i++ ) + { + set32_fx( sts[0]->hFdCngEnc->mem_coherence_fx[i], EPSILON_FX, 4 ); + set16_fx( sts[0]->hFdCngEnc->mem_coherence_exp[i], 0, 4 ); + } } test(); test(); @@ -2717,48 +2748,66 @@ void stereoFdCngCoherence_fx( pt_fftL = fft_buf_fx[0]; pt_fftR = fft_buf_fx[1]; - mem = sts[0]->hFdCngEnc->mem_coherence_fx; /* exp(sts[0]->hFdCngEnc->mem_coherence_exp) */ - mem_exp = sts[0]->hFdCngEnc->mem_coherence_exp; + + /* only estimate coherence in inactive frames (or in the first 50 frames to build an initial value) */ + test(); + test(); + test(); + IF( NE_16( ( LE_32( sts[0]->ini_frame, 50 ) || ( EQ_16( sts[0]->vad_flag, 0 ) && EQ_16( sts[1]->vad_flag, 0 ) ) ), 0 ) ) + { + return; + } + FOR( i_subfr = 0; i_subfr < 2; i_subfr++ ) { - cr = ci = eL = eR = EPSILON_FX; - move32(); - move32(); - move32(); - move32(); - cr_exp = ci_exp = eL_exp = eR_exp = 0; - move16(); - move16(); + Word16 band_len_cum; + + band_len_cum = 0; move16(); + i = MDCT_ST_DTX_FIRST_BAND_OFFSET; move16(); -#ifdef IMPROV_PRECISION_EVSBE - cr = BASOP_Util_Add_Mant32Exp( cr, cr_exp, L_mac( L_mult( pt_fftL[0], pt_fftR[0] ), pt_fftL[L_FFT / 2], pt_fftR[L_FFT / 2] ), shl( fft_exp, 1 ), &cr_exp ); /* exp(cr_exp) */ - eL = BASOP_Util_Add_Mant32Exp( eL, eL_exp, L_mac( L_mult( pt_fftL[0], pt_fftL[0] ), pt_fftL[L_FFT / 2], pt_fftL[L_FFT / 2] ), shl( fft_exp, 1 ), &eL_exp ); /* exp(eL_exp) */ - eR = BASOP_Util_Add_Mant32Exp( eR, eR_exp, L_mac( L_mult( pt_fftR[0], pt_fftR[0] ), pt_fftR[L_FFT / 2], pt_fftR[L_FFT / 2] ), shl( fft_exp, 1 ), &eR_exp ); /* exp(eR_exp) */ -#else - cr = BASOP_Util_Add_Mant32Exp( cr, cr_exp, L_add( L_mult( pt_fftL[0], pt_fftR[0] ), L_mult( pt_fftL[L_FFT / 2], pt_fftR[L_FFT / 2] ) ), shl( fft_exp, 1 ), &cr_exp ); /* exp(cr_exp) */ - eL = BASOP_Util_Add_Mant32Exp( eL, eL_exp, L_add( L_mult( pt_fftL[0], pt_fftL[0] ), L_mult( pt_fftL[L_FFT / 2], pt_fftL[L_FFT / 2] ) ), shl( fft_exp, 1 ), &eL_exp ); /* exp(eL_exp) */ - eR = BASOP_Util_Add_Mant32Exp( eR, eR_exp, L_add( L_mult( pt_fftR[0], pt_fftR[0] ), L_mult( pt_fftR[L_FFT / 2], pt_fftR[L_FFT / 2] ) ), shl( fft_exp, 1 ), &eR_exp ); /* exp(eR_exp) */ -#endif - FOR( i = 1; i < L_FFT / 2; i++ ) - { -#ifdef IMPROV_PRECISION_EVSBE - cr = BASOP_Util_Add_Mant32Exp( cr, cr_exp, L_mac( L_mult( pt_fftL[i], pt_fftR[i] ), pt_fftL[L_FFT - i], pt_fftR[L_FFT - i] ), shl( fft_exp, 1 ), &cr_exp ); /* exp(cr_exp) */ - ci = BASOP_Util_Add_Mant32Exp( ci, ci_exp, L_mac( L_mult( -pt_fftL[i], pt_fftR[L_FFT - i] ), pt_fftL[L_FFT - i], pt_fftR[i] ), shl( fft_exp, 1 ), &ci_exp ); /* exp(ci_exp) */ - eL = BASOP_Util_Add_Mant32Exp( eL, eL_exp, L_mac( L_mult( pt_fftL[i], pt_fftL[i] ), pt_fftL[L_FFT - i], pt_fftL[L_FFT - i] ), shl( fft_exp, 1 ), &eL_exp ); /* exp(eL_exp) */ - eR = BASOP_Util_Add_Mant32Exp( eR, eR_exp, L_mac( L_mult( pt_fftR[i], pt_fftR[i] ), pt_fftR[L_FFT - i], pt_fftR[L_FFT - i] ), shl( fft_exp, 1 ), &eR_exp ); /* exp(eR_exp) */ -#else - cr = BASOP_Util_Add_Mant32Exp( cr, cr_exp, L_add( L_mult( pt_fftL[i], pt_fftR[i] ), L_mult( pt_fftL[L_FFT - i], pt_fftR[L_FFT - i] ) ), shl( fft_exp, 1 ), &cr_exp ); /* exp(cr_exp) */ - ci = BASOP_Util_Add_Mant32Exp( ci, ci_exp, L_add( L_mult( -pt_fftL[i], pt_fftR[L_FFT - i] ), L_mult( pt_fftL[L_FFT - i], pt_fftR[i] ) ), shl( fft_exp, 1 ), &ci_exp ); /* exp(ci_exp) */ - eL = BASOP_Util_Add_Mant32Exp( eL, eL_exp, L_add( L_mult( pt_fftL[i], pt_fftL[i] ), L_mult( pt_fftL[L_FFT - i], pt_fftL[L_FFT - i] ) ), shl( fft_exp, 1 ), &eL_exp ); /* exp(eL_exp) */ - eR = BASOP_Util_Add_Mant32Exp( eR, eR_exp, L_add( L_mult( pt_fftR[i], pt_fftR[i] ), L_mult( pt_fftR[L_FFT - i], pt_fftR[L_FFT - i] ) ), shl( fft_exp, 1 ), &eR_exp ); /* exp(eR_exp) */ -#endif - } - test(); - test(); - IF( LE_32( sts[0]->ini_frame, 50 ) || ( sts[0]->vad_flag == 0 && sts[1]->vad_flag == 0 ) ) + FOR( Word16 b = 0; b < MDCT_ST_DTX_NUM_COHERENCE_BANDS; b++ ) { + Word16 sqr_inp, temp, sqr_out, sqr_inp_exp; + Word32 sqr_inp32; + band_len_cum += mdct_stereo_dtx_coherence_bandlengths[b]; + move16(); + cr = ci = eL = eR = EPSILON_FX; + move32(); + move32(); + move32(); + move32(); + cr_exp = ci_exp = eL_exp = eR_exp = 0; + move16(); + move16(); + move16(); + move16(); + + mem = sts[0]->hFdCngEnc->mem_coherence_fx[b]; + mem_exp = sts[0]->hFdCngEnc->mem_coherence_exp[b]; + + /* for last band, we need to make adjustments to fit with the FFT buffer layout */ + /* do the calculations for fftbin 0 (not anymore as it is skipped - we only calculate coherence above the 2nd bin) and L_FFT/2 outside the loop - imaginary part is always zero there, but not part of the buffer */ + IF( EQ_16( b, sub( MDCT_ST_DTX_NUM_COHERENCE_BANDS, 1 ) ) ) + { + /* this calculates values for fft bin at L_FFT/2 - no imaginary value there, not even part of the array */ + cr = BASOP_Util_Add_Mant32Exp( cr, cr_exp, L_mult( pt_fftL[L_FFT / 2], pt_fftR[L_FFT / 2] ), shl( fft_exp, 1 ), &cr_exp ); /* exp(cr_exp) */ + eL = BASOP_Util_Add_Mant32Exp( eL, eL_exp, L_mult( pt_fftL[L_FFT / 2], pt_fftL[L_FFT / 2] ), shl( fft_exp, 1 ), &eL_exp ); /* exp(eL_exp) */ + eR = BASOP_Util_Add_Mant32Exp( eR, eR_exp, L_mult( pt_fftR[L_FFT / 2], pt_fftR[L_FFT / 2] ), shl( fft_exp, 1 ), &eR_exp ); /* exp(eR_exp) */ + + /* skip last fft bin (fs/2 Hz) bin in the loop later */ + band_len_cum = sub( band_len_cum, 1 ); + } + + FOR( ; i < band_len_cum; i++ ) + { + cr = BASOP_Util_Add_Mant32Exp( cr, cr_exp, L_add( L_mult( pt_fftL[i], pt_fftR[i] ), L_mult( pt_fftL[L_FFT - i], pt_fftR[L_FFT - i] ) ), shl( fft_exp, 1 ), &cr_exp ); /* exp(cr_exp) */ + ci = BASOP_Util_Add_Mant32Exp( ci, ci_exp, L_add( L_mult( -pt_fftL[i], pt_fftR[L_FFT - i] ), L_mult( pt_fftL[L_FFT - i], pt_fftR[i] ) ), shl( fft_exp, 1 ), &ci_exp ); /* exp(ci_exp) */ + eL = BASOP_Util_Add_Mant32Exp( eL, eL_exp, L_add( L_mult( pt_fftL[i], pt_fftL[i] ), L_mult( pt_fftL[L_FFT - i], pt_fftL[L_FFT - i] ) ), shl( fft_exp, 1 ), &eL_exp ); /* exp(eL_exp) */ + eR = BASOP_Util_Add_Mant32Exp( eR, eR_exp, L_add( L_mult( pt_fftR[i], pt_fftR[i] ), L_mult( pt_fftR[L_FFT - i], pt_fftR[L_FFT - i] ) ), shl( fft_exp, 1 ), &eR_exp ); /* exp(eR_exp) */ + } + mem[0] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( mem[0], 31129 /*0.95f*/ ), mem_exp[0], Mpy_32_16_1( cr, 1638 /*0.05f*/ ), cr_exp, &mem_exp[0] ); /* exp(mem_exp[0]) */ move32(); mem[1] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( mem[1], 31129 /*0.95f*/ ), mem_exp[1], Mpy_32_16_1( ci, 1638 /*0.05f*/ ), ci_exp, &mem_exp[1] ); /* exp(mem_exp[1]) */ @@ -2767,19 +2816,23 @@ void stereoFdCngCoherence_fx( move32(); mem[3] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( mem[3], 31129 /*0.95f*/ ), mem_exp[3], Mpy_32_16_1( eR, 1638 /*0.05f*/ ), eR_exp, &mem_exp[3] ); /* exp(mem_exp[3]) */ move32(); + + /* could be done outside the loop, as the second assignment overwrites the first, but this would mean a second loop over bands */ + /* For orientation, in float, this is "sts[0]->hFdCngEnc->hFdCngCom->coherence[b] = sqrtf( ( mem[0] * mem[0] + mem[1] * mem[1] ) / ( mem[2] * mem[3] ) );" */ + sqr_inp32 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( mem[0], mem[0] ), shl( mem_exp[0], 1 ), Mpy_32_32( mem[1], mem[1] ), shl( mem_exp[1], 1 ), &sqr_inp_exp ); /* exp(sqr_inp_exp) */ + sqr_inp = BASOP_Util_Divide3232_Scale( sqr_inp32, Mpy_32_32( mem[2], mem[3] ), &temp ); + sqr_inp_exp = add( temp, sub( sqr_inp_exp, add( mem_exp[2], mem_exp[3] ) ) ); + sqr_out = Sqrt16( sqr_inp, &sqr_inp_exp ); + + sts[0]->hFdCngEnc->hFdCngCom->coherence_fx[b] = shl_sat( sqr_out, sqr_inp_exp ); // Q15 expected. + move16(); } pt_fftL += L_FFT; pt_fftR += L_FFT; } - Word16 sqr_inp, temp, sqr_out, sqr_inp_exp; - Word32 sqr_inp32 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( mem[0], mem[0] ), shl( mem_exp[0], 1 ), Mpy_32_32( mem[1], mem[1] ), shl( mem_exp[1], 1 ), &sqr_inp_exp ); /* exp(sqr_inp_exp) */ - sqr_inp = BASOP_Util_Divide3232_Scale( sqr_inp32, Mpy_32_32( mem[2], mem[3] ), &temp ); - sqr_inp_exp = add( temp, sub( sqr_inp_exp, add( mem_exp[2], mem_exp[3] ) ) ); - sqr_out = Sqrt16( sqr_inp, &sqr_inp_exp ); - sts[0]->hFdCngEnc->hFdCngCom->coherence_fx = shl_sat( sqr_out, sqr_inp_exp ); // Q15 expected. - move16(); + return; } @@ -2851,16 +2904,19 @@ void FdCngEncodeMDCTStereoSID_fx( { IF( lr_in_ptr_fx[ch][p] ) { - t1 = BASOP_Util_Log2( lr_in_ptr_fx[ch][p] ); // Q25 - t2 = L_add( t1, L_shl( lr_in_ptr_e[ch], Q25 ) ); // Q25 + t1 = BASOP_Util_Log2( lr_in_ptr_fx[ch][p] ); // Q25 + t2 = L_add( t1, L_shl( lr_in_ptr_e[ch], Q25 ) ); // Q25 + ms_ptr_fx[ch][p] = Mpy_32_32( t2, TEN_MULT_LOG10_2_IN_Q29 ); // Q23 + move32(); } ELSE { - t2 = 0; + // 10.f * log10f( EPSILON ) --> -150.0f + // Subsequent additions / subtractions happen on these numbers, so to avoid saturations + // this value is set to -128.0f in Q23 + ms_ptr_fx[ch][p] = -ONE_IN_Q30; // Q23 move32(); } - ms_ptr_fx[ch][p] = Mpy_32_32( t2, TEN_MULT_LOG10_2_IN_Q29 ); // Q23 - move32(); E_fx[ch] = L_add( E_fx[ch], L_shr( ms_ptr_fx[ch][p], 4 ) ); // Q19 move32(); } @@ -3050,7 +3106,7 @@ void FdCngEncodeMDCTStereoSID_fx( } /* quantize channel coherence */ - coh_idx = mult_r( sts[0]->hFdCngEnc->hFdCngCom->coherence_fx, 15 ); + coh_idx = mult_r( sts[0]->hFdCngEnc->hFdCngCom->coherence_fx[0], 15 ); coh_idx = s_max( 0, s_min( coh_idx, 15 ) ); /* ---- Write SID bitstream ---- */ @@ -3084,8 +3140,13 @@ void FdCngEncodeMDCTStereoSID_fx( push_indice( sts[ch]->hBstr, IND_ENERGY, gain_idx[ch], 7 ); } - /* pad with zeros to reach common SID frame size */ - push_indice( sts[1]->hBstr, IND_ENERGY, 0, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); + /* write the four additional coherence values */ + FOR( Word16 b = 1; b < MDCT_ST_DTX_NUM_COHERENCE_BANDS; b++ ) + { + coh_idx = mult_r( sts[0]->hFdCngEnc->hFdCngCom->coherence_fx[b], 15 ); + coh_idx = s_max( 0, s_min( coh_idx, 15 ) ); + push_indice( sts[1]->hBstr, IND_ENERGY, coh_idx, 4 ); + } return; } @@ -3200,7 +3261,7 @@ void FdCngEncodeDiracMDCTStereoSID_fx( extend_dctN_input_fx( ms_ptr_fx[0], dct_target_fx, N[0], tot_sig_ext_fx, FDCNG_VQ_MAX_LEN, invTrfMatrix_fx, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); /* use 18 basis vectors*/ - Copy32( tot_sig_ext_fx, ms_ptr_fx[0], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 Q23*/ + Copy32( tot_sig_ext_fx, ms_ptr_fx[0], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 Q23*/ } create_IDCT_N_Matrix_fx( invTrfMatrix_fx, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM_fx ) / ( sizeof( Word32 ) ) ); @@ -3256,7 +3317,7 @@ void FdCngEncodeDiracMDCTStereoSID_fx( { pow = L_shl( gain_fx[ch], sub( 8, ms_ptr_e ) ); /* Q31 - ms_ptr_e */ pow = L_add( ms_ptr_fx[ch][p], pow ); /* Q31 - ms_ptr_e */ - pow = Mpy_32_32( pow, 214748365 /* 0.1 in Q31 */ ); /*pow = 0.1 Q31 - ms_ptr_e*/ + pow = Mpy_32_32( pow, 214748365 /* 0.1 in Q31 */ ); /*pow = 0.1 Q31 - ms_ptr_e*/ lr_out_ptr_fx[ch][p] = BASOP_Util_fPow( 10, 31, pow, ms_ptr_e, &e_lr_out[p] ); tmp_e = s_max( tmp_e, e_lr_out[p] ); } @@ -3289,9 +3350,9 @@ void FdCngEncodeDiracMDCTStereoSID_fx( lpc_from_spectrum( hFdCngCom, hFdCngEnc->startBandDec, hFdCngEnc->stopFFTbinDec, sts[ch]->preemph_fac ); sts[ch]->hDtxEnc->last_CNG_L_frame = sts[ch]->L_frame; } - sts[0]->hFdCngEnc->hFdCngCom->coherence_fx = 0; + sts[0]->hFdCngEnc->hFdCngCom->coherence_fx[0] = 0; move16(); - sts[1]->hFdCngEnc->hFdCngCom->coherence_fx = 0; + sts[1]->hFdCngEnc->hFdCngCom->coherence_fx[0] = 0; move16(); /* ---- Write SID bitstream ---- */ diff --git a/lib_enc/find_tar_fx.c b/lib_enc/find_tar_fx.c index 4e15bc82820dbe3f6de8055ff78d911f814b63e9..5b3ab4792a05a9c77c52a5183f23f976b7a2f5bd 100644 --- a/lib_enc/find_tar_fx.c +++ b/lib_enc/find_tar_fx.c @@ -1,9 +1,9 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ -//#include "prot_fx.h" /* Function prototypes */ +// #include "prot_fx.h" /* Function prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "cnst.h" /* Common constants */ @@ -20,7 +20,7 @@ void find_targets_fx( const Word16 *res, /* i : residual signal Q_new*/ const Word16 L_subfr, /* i : length of vectors for gain quantization Q0*/ const Word16 *Ap, /* i : unquantized A(z) filter with bandwidth expansion Q12*/ - Word16 tilt_fac, /* i : tilt factor Q15*/ + Word16 tilt_fac, /* i : tilt factor Q15*/ Word16 *xn, /* o : Close-loop Pitch search target vector Q_new-1*/ Word16 *cn, /* o : target vector in residual domain Q_new*/ Word16 *h1 /* o : impulse response of weighted synthesis filter Q14*/ @@ -31,10 +31,8 @@ void find_targets_fx( Word16 scale, scaleq, j, d, s, s2, tmp; Word16 Aqs[M + 1]; Word32 Ltmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif /*------------------------------------------------------------------------* * Find the target vector for excitation search: * @@ -114,7 +112,6 @@ void find_targets_fx( } h1[M] = round_fx_o( L_shl_o( Ltmp, s, &Overflow ), &Overflow ); /* Q11 + s */ - // PMT("should we used extended basop here for when the L_subfr > L_SUBFR, to prevent saturation/overflow and the subsequent loop\n") FOR( i = M + 1; i < L_subfr; i++ ) { Ltmp = L_msu( 0, Aqs[1], h1[i - 1] ); /* Q27 */ @@ -134,7 +131,7 @@ void find_targets_fx( { Ltmp = L_msu( Ltmp, Aqs[j], h1[i - j] ); /* Q27 */ } - h1[i] = round_fx( L_shl_o( Ltmp, s, &Overflow ) ); /* Q11 + s */ + h1[i] = round_fx( L_shl_sat( Ltmp, s ) ); /* Q11 + s */ } Ltmp = L_mult( Ap[i], s2 ); /* Q27 */ FOR( j = 1; j <= M; j++ ) @@ -168,7 +165,7 @@ void find_targets_ivas_fx( const Word16 *res, /* i : residual signal Q_new*/ const Word16 L_subfr, /* i : length of vectors for gain quantization Q0*/ const Word16 *Ap, /* i : unquantized A(z) filter with bandwidth expansion Q12*/ - Word16 tilt_fac, /* i : tilt factor Q15*/ + Word16 tilt_fac, /* i : tilt factor Q15*/ Word16 *xn, /* o : Close-loop Pitch search target vector Q_new-1*/ Word16 *cn, /* o : target vector in residual domain Q_new*/ Word16 *h1 /* o : impulse response of weighted synthesis filter Q(14 - norm_s(h1[0]))*/ @@ -181,10 +178,7 @@ void find_targets_ivas_fx( Word32 h1_32[6 * L_SUBFR]; Word16 sf; Word64 Ltmp64; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif + /*------------------------------------------------------------------------* * Find the target vector for excitation search: * @@ -204,13 +198,12 @@ void find_targets_ivas_fx( move16(); } - syn_filt_fx( 0, p_Aq, M, &res[i_subfr], temp + M, L_subfr, temp, 0 ); + syn_filt_fx( 1, p_Aq, M, &res[i_subfr], temp + M, L_subfr, temp, 0 ); - Residu3_fx( Ap, temp + M, xn, L_subfr, 0 ); /* xn in Q_new */ + Residu3_fx( Ap, temp + M, xn, L_subfr, 0 ); /* xn in Q_new - 1 */ - deemph_fx( xn, tilt_fac, L_subfr, mem_w0 ); /* xn in Q_new */ + deemph_fx( xn, tilt_fac, L_subfr, mem_w0 ); /* xn in Q_new - 1 */ - *mem_w0 = shr( *mem_w0, 1 ); // Q_new - 1 /*-----------------------------------------------------------------* * Find target in residual domain (cn[]) for innovation search @@ -220,14 +213,14 @@ void find_targets_ivas_fx( /* first half: xn[] --> cn[] */ temp[0] = 0; move16(); - preemph_copy_fx( xn, cn, tilt_fac, shr( L_subfr, 1 ), temp ); - syn_filt_s_lc_fx( 1, Ap, cn, temp, shr( L_subfr, 1 ) ); /* Q_new -> Q_new - 1 */ - Residu3_lc_fx( p_Aq, M, temp, cn, shr( L_subfr, 1 ), 1 ); /* Q_new - 1 -> Q_new */ + preemph_copy_fx( xn, cn, tilt_fac, L_subfr / 2, temp ); + syn_filt_s_lc_fx( 1, Ap, cn, temp, L_subfr / 2 ); /* Q-1 -> Q-2 */ + Residu3_lc_fx( p_Aq, M, temp, cn, L_subfr / 2, 1 ); /* Q-2 -> Q-1 */ + Scale_sig( cn, L_subfr / 2, 1 ); /* second half: res[] --> cn[] (approximated and faster) */ - Copy( &res[i_subfr + shr( L_subfr, 1 )], cn + shr( L_subfr, 1 ), shr( L_subfr, 1 ) ); /* Q_new */ + Copy( &res[i_subfr + ( L_subfr / 2 )], cn + ( L_subfr / 2 ), L_subfr / 2 ); } - scale_sig( xn, L_subfr, -1 ); // Q_new - 1 /*---------------------------------------------------------------* * Compute impulse response, h1[], of weighted synthesis filter * @@ -251,14 +244,12 @@ void find_targets_ivas_fx( } set32_fx( h1_32, 0, L_subfr ); - Overflow = 0; - move16(); FOR( i = 0; i < M; i++ ) { Ltmp64 = W_mult_16_16( Ap[i], s2 ); /* Q27 */ FOR( j = 1; j <= i; j++ ) { - Ltmp64 = W_msu_16_16( Ltmp64, Aqs[j], extract_h( L_shl_o( h1_32[i - j], s, &Overflow ) ) ); /* Q27 */ + Ltmp64 = W_msu_16_16( Ltmp64, Aqs[j], extract_h( L_shl_sat( h1_32[i - j], s ) ) ); /* Q27 */ } h1_32[i] = W_extract_l( Ltmp64 ); /* Q27 */ move32(); @@ -267,17 +258,17 @@ void find_targets_ivas_fx( Ltmp64 = W_mult_16_16( Ap[i], s2 ); /* Q27 */ FOR( j = 1; j <= M; j++ ) { - Ltmp64 = W_msu_16_16( Ltmp64, Aqs[j], extract_h( L_shl_o( h1_32[i - j], s, &Overflow ) ) ); /* Q27 */ + Ltmp64 = W_msu_16_16( Ltmp64, Aqs[j], extract_h( L_shl_sat( h1_32[i - j], s ) ) ); /* Q27 */ } h1_32[M] = W_extract_l( Ltmp64 ); /* Q27 */ move32(); FOR( i = M + 1; i < L_subfr; i++ ) { - Ltmp64 = W_msu_16_16( 0, Aqs[1], extract_h( L_shl_o( h1_32[i - 1], s, &Overflow ) ) ); /* Q27 */ + Ltmp64 = W_msu_16_16( 0, Aqs[1], extract_h( L_shl_sat( h1_32[i - 1], s ) ) ); /* Q27 */ FOR( j = 2; j <= M; j++ ) { - Ltmp64 = W_msu_16_16( Ltmp64, Aqs[j], extract_h( L_shl_o( h1_32[i - j], s, &Overflow ) ) ); /* Q27 */ + Ltmp64 = W_msu_16_16( Ltmp64, Aqs[j], extract_h( L_shl_sat( h1_32[i - j], s ) ) ); /* Q27 */ } h1_32[i] = W_extract_l( Ltmp64 ); /* Q27 */ move32(); diff --git a/lib_enc/find_tilt_fx.c b/lib_enc/find_tilt_fx.c index ea71b09bc9f73f71ada928bed3bd19be2ef090dd..56ea1e9dd3f4193c9f93447498e8eba77adad866 100644 --- a/lib_enc/find_tilt_fx.c +++ b/lib_enc/find_tilt_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -16,21 +16,20 @@ *-------------------------------------------------------------------*/ void find_tilt_fx( - const Word32 fr_bands[], /* i : energy in frequency bands Q_new + Q_SCALE*/ - const Word32 bckr[], /* i : per band background noise energy estimate Q_new + Q_SCALE*/ - Word32 ee[2], /* o : lf/hf E ration for present frame Q6*/ - const Word16 pitch[3], /* i : open loop pitch values for 3 half-frames Q0*/ - const Word16 voicing[3], /* i : normalized correlation for 3 half-frames Q15*/ + const Word32 fr_bands[], /* i : energy in frequency bands Q_new + Q_SCALE*/ + const Word32 bckr[], /* i : per band background noise energy estimate Q_new + Q_SCALE*/ + Word32 ee[2], /* o : lf/hf E ration for present frame Q6*/ + const Word16 pitch[3], /* i : open loop pitch values for 3 half-frames Q0*/ + const Word16 voicing[3], /* i : normalized correlation for 3 half-frames Q15*/ const Word32 *lf_E, /* i : per bin energy for low frequencies Q_new + Q_SCALE - 2*/ - const Word16 corr_shift, /* i : normalized correlation correction Q15*/ - const Word16 bwidth, /* i : input signal bandwidth Q0*/ - const Word16 max_band, /* i : maximum critical band Q0*/ + const Word16 corr_shift, /* i : normalized correlation correction Q15*/ + const Word16 bwidth, /* i : input signal bandwidth Q0*/ + const Word16 max_band, /* i : maximum critical band Q0*/ Word32 hp_E[], /* o : energy in HF Q_new + Q_SCALE*/ - const Word16 codec_mode, /* i : MODE1 or MODE2 Q0*/ - const Word16 Q_new, /* i : scaling factor */ - Word32 *bckr_tilt_lt /* i/o: lf/hf E ratio of background noise Q16*/ - , - Word16 Opt_vbr_mode /* Q0 */ + const Word16 codec_mode, /* i : MODE1 or MODE2 Q0*/ + const Word16 Q_new, /* i : scaling factor */ + Word32 *bckr_tilt_lt, /* i/o: lf/hf E ratio of background noise Q16*/ + Word16 Opt_vbr_mode /* Q0 */ ) { Word32 lp_bckr = 0, hp_bckr = 0, lp_E, Ltmp; @@ -44,10 +43,7 @@ void find_tilt_fx( Word16 scaling; move32(); move32(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + /*-----------------------------------------------------------------* * Initializations *-----------------------------------------------------------------*/ @@ -93,11 +89,7 @@ void find_tilt_fx( } tmp = BASOP_Util_Divide3232_Scale( lp_bckr, hp_bckr, &e_tmp ); -#ifdef FIX_ISSUE_1152 Ltmp = L_shr_r_sat( L_deposit_h( tmp ), sub( 15, e_tmp ) ); -#else - Ltmp = L_shr_r( L_deposit_h( tmp ), sub( 15, e_tmp ) ); -#endif *bckr_tilt_lt = L_add( Mpy_32_16_r( *bckr_tilt_lt, 29491 ), Mpy_32_16_r( Ltmp, 3277 ) ); /* Q16 */ @@ -112,8 +104,8 @@ void find_tilt_fx( /*mean_voi = 0.5f * (voicing[1] + voicing[2]) + corr_shift;*/ Ltmp = L_mult( voicing[1], 16384 /* 0.5 in Q15 */ ); /* Q31 */ Ltmp = L_mac( Ltmp, voicing[2], 16384 /* 0.5 in Q15 */ ); /* Q31 */ - Ltmp = L_mac_o( Ltmp, corr_shift, 32767, &Overflow ); /* Q31 */ - mean_voi = round_fx_o( Ltmp, &Overflow ); /* Q15 */ + Ltmp = L_mac_sat( Ltmp, corr_shift, 32767 ); /* Q31 */ + mean_voi = round_fx_sat( Ltmp ); /* Q15 */ /*f0 = INT_FS_FX / pitch[2];*/ e_tmp = norm_s( pitch[2] ); @@ -159,14 +151,15 @@ void find_tilt_fx( tmp = sub( freq, f2 ); IF( L_mac0( -(Word32) TH_D_FX * TH_D_FX, tmp, tmp ) < 0 ) { - lp_E = L_add_o( *pt_E, lp_E, &Overflow ); /* Q_new + QSCALE - 2 */ - m_cnt = add( m_cnt, 1 ); /* Q0 */ + lp_E = L_add_sat( *pt_E, lp_E ); /* Q_new + QSCALE - 2 */ + m_cnt = add( m_cnt, 1 ); /* Q0 */ } pt_E++; } - f1 = add_o( f1, f0, &Overflow ); - f2 = add_o( f2, f0, &Overflow ); + f1 = add_sat( f1, f0 ); + f2 = add_sat( f2, f0 ); } + /*lp_E = lp_E / (float)cnt - lp_bckr;*/ e_tmp = sub( norm_l( lp_E ), 1 ); m_tmp = extract_h( L_shl( lp_E, e_tmp ) ); @@ -179,7 +172,7 @@ void find_tilt_fx( m_tmp = div_s( m_tmp, m_cnt ); /* exp(e_tmp + e_cnt) */ e_tmp = sub( e_tmp, e_cnt ); - lp_E = L_sub_o( L_shr_o( m_tmp, sub( e_tmp, 1 ), &Overflow ), lp_bckr, &Overflow ); /* Q_new + QSCALE */ + lp_E = L_sub_sat( L_shr_sat( m_tmp, sub( e_tmp, 1 ) ), lp_bckr ); /* Q_new + QSCALE */ pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame */ } @@ -207,7 +200,7 @@ void find_tilt_fx( m_tmp = div_s( m_tmp, m_hpE ); /* exp(e_tmp + e_hpE) */ e_tmp = sub( e_tmp, e_hpE ); - ee[i] = L_shr_o( m_tmp, add( e_tmp, 15 - 6 ), &Overflow ); /* ee in Q6 */ + ee[i] = L_shr_sat( m_tmp, add( e_tmp, 15 - 6 ) ); /* ee in Q6 */ } ELSE IF( lp_E == 0 ) { @@ -220,10 +213,10 @@ void find_tilt_fx( IF( EQ_16( bwidth, NB ) ) /* For NB input, compensate for the missing bands */ { - Ltmp = L_shl_o( ee[i], 3, &Overflow ); + Ltmp = L_shl_sat( ee[i], 3 ); IF( EQ_32( Ltmp, MAX_32 ) ) /* if Overflow: Compute with less precision */ { - Ltmp = Mult_32_16( ee[i], 24576 /* 0.75 in Q15 */ ); /* 6/8 Q6*/ + Ltmp = Mult_32_16( ee[i], 24576 /* 0.75 in Q15 */ ); /* 6/8 Q6*/ ee[i] = L_shl_sat( Ltmp, 3 ); move32(); /* x8 */ } @@ -247,16 +240,16 @@ void find_tilt_fx( * Find LF/HF energy ratio *-------------------------------------------------------------------*/ void find_tilt_ivas_fx( - const Word32 fr_bands[], /* i : energy in frequency bands q_fr_bands*/ - const Word16 q_fr_bands, /* i : Q of fr_bands Q0*/ + const Word32 fr_bands[], /* i : energy in frequency bands q_fr_bands*/ + const Word16 q_fr_bands, /* i : Q of fr_bands Q0*/ const Word32 bckr[], /* i : per band background noise energy estimate q_bckr*/ const Word16 q_bckr, /* i : Q of bckr Q0*/ - Word32 ee[2], /* o : lf/hf E ration for present frame Q6*/ - const Word16 pitch[3], /* i : open loop pitch values for 3 half-frames Q0*/ - const Word16 voicing[3], /* i : normalized correlation for 3 half-frames Q15*/ + Word32 ee[2], /* o : lf/hf E ration for present frame Q6*/ + const Word16 pitch[3], /* i : open loop pitch values for 3 half-frames Q0*/ + const Word16 voicing[3], /* i : normalized correlation for 3 half-frames Q15*/ const Word32 *lf_E, /* i : per bin energy for low frequencies q_lf_E*/ const Word16 q_lf_E, /* i : Q of lf_E */ - const Word16 corr_shift, /* i : normalized correlation correction Q15*/ + const Word16 corr_shift, /* i : normalized correlation correction Q15*/ const Word16 bwidth, /* i : input signal bandwidth */ const Word16 max_band, /* i : maximum critical band */ Word32 hp_E[], /* o : energy in HF Q_new*/ @@ -275,12 +268,9 @@ void find_tilt_ivas_fx( Word64 sum; Word16 inv_bands, q_lp_E; Word32 Le_min_scaled, Ltmp2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif move32(); move32(); + /*-----------------------------------------------------------------* * Initializations *-----------------------------------------------------------------*/ @@ -326,14 +316,14 @@ void find_tilt_ivas_fx( { sum = W_mac_32_16( sum, pt_bckr[i], inv_bands ); // q_bckr+16 } - lp_bckr = W_shl_sat_l( sum, -16 ); // q_bckr - /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/ /* estimated noise E in last 2 critical bands */ - hp_bckr = W_extract_h( W_mac_32_32( W_mult_32_32( bckr[max_band - 1], ONE_IN_Q30 ), bckr[max_band], ONE_IN_Q30 ) ); // q_bckr - if ( hp_bckr == 0 ) /* Avoid division by zero. */ + lp_bckr = W_shl_sat_l( sum, -16 ); // q_bckr + /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/ /* estimated noise E in last 2 critical bands */ + hp_bckr = W_extract_h( W_shl( W_add( W_deposit32_l( bckr[max_band - 1] ), W_deposit32_l( bckr[max_band] ) ), 31 ) ); // q_bckr + if ( hp_bckr == 0 ) /* Avoid division by zero. */ { hp_bckr = L_deposit_l( 1 ); } - Ltmp = BASOP_Util_Divide3232_Scale_cadence( lp_bckr, hp_bckr, &e_tmp ); + Ltmp = BASOP_Util_Divide3232_Scale_newton( lp_bckr, hp_bckr, &e_tmp ); Ltmp = Mpy_32_16_r( Ltmp, 3277 /* 0.1f in Q15 */ ); Ltmp = L_shr_sat( Ltmp, sub( 15, e_tmp ) ); *bckr_tilt_lt = L_add_sat( Mpy_32_16_r( *bckr_tilt_lt, 29491 /* 0.9f in Q15 */ ), Ltmp ); // Q16 @@ -348,10 +338,10 @@ void find_tilt_ivas_fx( hp_bckr = L_add_sat( L_shl_sat( hp_bckr, 1 ), hp_bckr ); /* Q_new */ } /*mean_voi = 0.5f * (voicing[1] + voicing[2]) + corr_shift;*/ - Ltmp = L_mult( voicing[1], 16384 /* 0.5 in Q15 */ ); // Q31 - Ltmp = L_mac( Ltmp, voicing[2], 16384 /* 0.5 in Q15 */ ); // Q31 - Ltmp = L_mac_o( Ltmp, corr_shift, 32767 /* 1.0f in Q15 */, &Overflow ); // Q31 - mean_voi = round_fx_o( Ltmp, &Overflow ); // Q15 + Ltmp = L_mult( voicing[1], 16384 /* 0.5 in Q15 */ ); // Q31 + Ltmp = L_mac( Ltmp, voicing[2], 16384 /* 0.5 in Q15 */ ); // Q31 + Ltmp = L_mac_sat( Ltmp, corr_shift, 32767 /* 1.0f in Q15 */ ); // Q31 + mean_voi = round_fx_sat( Ltmp ); // Q15 /*f0 = INT_FS_FX / pitch[2];*/ e_tmp = norm_s( pitch[2] ); @@ -365,9 +355,9 @@ void find_tilt_ivas_fx( FOR( i = 0; i < 2; i++ ) { - /*hp_E[i] = 0.5f * (hf_bands[max_band-1] + hf_bands[max_band]) - hp_bckr; */ /* averaged E in last 2 critical bands */ - Ltmp = W_extract_h( W_mac_32_32( W_mult_32_32( hf_bands[max_band - 1], ONE_IN_Q30 ), hf_bands[max_band], ONE_IN_Q30 ) ); // q_fr_bands - Ltmp = L_sub( Ltmp, hp_bckr ); // q_fr_bands + /*hp_E[i] = 0.5f * (hf_bands[max_band-1] + hf_bands[max_band]) - hp_bckr; */ /* averaged E in last 2 critical bands */ + Ltmp = W_extract_h( W_shl( W_add( W_deposit32_l( hf_bands[max_band - 1] ), W_deposit32_l( hf_bands[max_band] ) ), 31 ) ); // q_fr_bands + Ltmp = L_sub( Ltmp, hp_bckr ); // q_fr_bands Ltmp2 = L_max( Ltmp, L_shl_sat( 1, q_fr_bands ) ); // q_fr_bands, saturation is added because q_fr_bands is limited to 31 if ( Opt_vbr_mode == 0 ) @@ -403,9 +393,10 @@ void find_tilt_ivas_fx( } pt_E++; } - f1 = add_o( f1, f0, &Overflow ); - f2 = add_o( f2, f0, &Overflow ); + f1 = add_sat( f1, f0 ); + f2 = add_sat( f2, f0 ); } + /*lp_E = lp_E / (float)cnt - lp_bckr;*/ e_tmp = sub( W_norm( sum ), 1 ); m_tmp = extract_h( W_extract_h( W_shl( sum, e_tmp ) ) ); // q_lf_E+1+e_tmp-32-16 @@ -422,7 +413,7 @@ void find_tilt_ivas_fx( lp_E = W_extract_h( W_shl( sum, q_lp_E ) ); // q_bckr+1+q_lp_E-32 q_lp_E = sub( add( q_lp_E, q_bckr ), Q31 ); - pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame Q_new - 1 */ + pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame Q_new - 1 */ } ELSE /* Other than high-pitched voiced frames */ { @@ -466,16 +457,16 @@ void find_tilt_ivas_fx( m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) ); // e_hpE+q_bckr-16 m_tmp = div_s( m_tmp, m_hpE ); // Q15+(e_tmp+q_lp_E)-(e_hpE+q_bckr) e_tmp = sub( add( e_tmp, q_lp_E ), add( e_hpE, q_bckr ) ); - ee[i] = L_shr_o( m_tmp, add( e_tmp, 15 - 6 ), &Overflow ); /* ee in Q6 */ + ee[i] = L_shr_sat( m_tmp, add( e_tmp, 15 - 6 ) ); /* ee in Q6 */ move32(); } IF( bwidth == NB ) /* For NB input, compensate for the missing bands */ { - Ltmp = L_shl_o( ee[i], 3, &Overflow ); /* Q6 */ - IF( EQ_32( Ltmp, MAX_32 ) ) /* if Overflow: Compute with less precision */ + Ltmp = L_shl_sat( ee[i], 3 ); /* Q6 */ + IF( EQ_32( Ltmp, MAX_32 ) ) /* if Overflow: Compute with less precision */ { - Ltmp = Mult_32_16( ee[i], 24576 /* 0.75 in Q15 */ ); /* 6/8 Q6*/ + Ltmp = Mult_32_16( ee[i], 24576 /* 0.75 in Q15 */ ); /* 6/8 Q6*/ ee[i] = L_shl_sat( Ltmp, 3 ); /* Q6 */ move32(); /* x8 */ } diff --git a/lib_enc/find_uv_fx.c b/lib_enc/find_uv_fx.c index 79dc78c6d31dc23cf4e86ffa62c9fbd78f63a9e2..a0fa4dbbd163b2de097f81659d929125cf00aaf7 100644 --- a/lib_enc/find_uv_fx.c +++ b/lib_enc/find_uv_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -23,19 +23,15 @@ * energy is trailing off after a spike *-------------------------------------------------------------------*/ -static Word16 find_ener_decrease_fx( /* o : maximum energy ratio Q10*/ - const Word16 ind_deltaMax, /* i : index of the beginning of maximum energy search Q0*/ - const Word32 *pt_enr_ssf /* i : Pointer to the energy buffer Qx*/ +static Word16 find_ener_decrease_fx( /* o : maximum energy ratio Q10*/ + const Word16 ind_deltaMax, /* i : index of the beginning of maximum energy search Q0*/ + const Word32 *pt_enr_ssf /* i : Pointer to the energy buffer Qx*/ ) { Word16 i, j, end, flag; Word16 wtmp0, wtmp1; Word32 maxEnr, minEnr; Word16 dE2, exp0, exp1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif dE2 = 0; move16(); @@ -76,7 +72,7 @@ static Word16 find_ener_decrease_fx( /* o : maximum exp1 = sub( norm_l( maxEnr ), 1 ); wtmp1 = extract_h( L_shl( maxEnr, exp1 ) ); wtmp1 = div_s( wtmp1, wtmp0 ); - dE2 = shr_ro( wtmp1, add( sub( exp1, exp0 ), 15 - 10 ), &Overflow ); /*Q10*/ + dE2 = shr_r_sat( wtmp1, add( sub( exp1, exp0 ), 15 - 10 ) ); /*Q10*/ return dE2; } @@ -87,20 +83,20 @@ static Word16 find_ener_decrease_fx( /* o : maximum * Decision about coder type *-------------------------------------------------------------------*/ -Word16 find_uv_fx( /* o : coding type */ - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 *T_op_fr, /* i : pointer to adjusted fractional pitch (4 val.) Q6*/ - const Word16 *voicing_fr, /* i : refined correlation for each subframes Q15*/ - const Word16 *speech, /* i : pointer to speech signal for E computation Q_new*/ - const Word32 *ee, /* i : lf/hf Energy ratio for present frame Q6*/ - const Word16 corr_shift, /* i : normalized correlation correction in noise Q15*/ - const Word16 relE, /* i : relative frame energy Q8*/ - const Word16 Etot, /* i : total energy Q8*/ - const Word32 hp_E[], /* i : energy in HF Q_new + Q_SCALE*/ +Word16 find_uv_fx( /* o : coding type */ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 *T_op_fr, /* i : pointer to adjusted fractional pitch (4 val.) Q6*/ + const Word16 *voicing_fr, /* i : refined correlation for each subframes Q15*/ + const Word16 *speech, /* i : pointer to speech signal for E computation Q_new*/ + const Word32 *ee, /* i : lf/hf Energy ratio for present frame Q6*/ + const Word16 corr_shift, /* i : normalized correlation correction in noise Q15*/ + const Word16 relE, /* i : relative frame energy Q8*/ + const Word16 Etot, /* i : total energy Q8*/ + const Word32 hp_E[], /* i : energy in HF Q_new + Q_SCALE*/ const Word16 Q_new, - Word16 *flag_spitch, /* i/o: flag to indicate very short stable pitch and high correlation Q0*/ + Word16 *flag_spitch, /* i/o: flag to indicate very short stable pitch and high correlation Q0*/ const Word16 shift, - const Word16 last_core_orig /* i : original last core Q0*/ + const Word16 last_core_orig /* i : original last core Q0*/ ) { Word16 coder_type, i; @@ -119,11 +115,6 @@ Word16 find_uv_fx( /* o : coding type */ Word16 ee0_th, ee1_th, voi_th, nb_cond, flag_low_relE; NOISE_EST_HANDLE hNoiseEst = st_fx->hNoiseEst; SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - Word16 Last_Resort; Word16 vadnoise; @@ -182,7 +173,7 @@ Word16 find_uv_fx( /* o : coding type */ exp1 = sub( norm_l( *pt_enr_ssf1 ), 1 ); wtmp1 = extract_h( L_shl( *pt_enr_ssf1, exp1 ) ); fac = div_s( wtmp1, wtmp0 ); - fac_32 = L_shr_o( L_deposit_l( fac ), add( sub( exp1, exp0 ), 15 - 13 ), &Overflow ); /* fac32 in Q13*/ + fac_32 = L_shr_sat( L_deposit_l( fac ), add( sub( exp1, exp0 ), 15 - 13 ) ); /* fac32 in Q13*/ if ( GT_32( fac_32, dE1 ) ) { @@ -201,9 +192,9 @@ Word16 find_uv_fx( /* o : coding type */ * Average voicing (normalized correlation) *-----------------------------------------------------------------*/ - /*mean_ee = 1.0f/3.0f * (st->ee_old + ee[0] + ee[1]); */ /* coefficients take into account the position of the window */ - mean_ee = L_add_o( L_add_o( st_fx->ee_old_fx, ee[0], &Overflow ), ee[1], &Overflow ); /* Q6 */ - mean_ee = Mult_32_16( mean_ee, 10923 /* 1/3 in Q15 */ ); /*Q6*/ + /*mean_ee = 1.0f/3.0f * (st->ee_old + ee[0] + ee[1]); */ /* coefficients take into account the position of the window */ + mean_ee = L_add_sat( L_add_sat( st_fx->ee_old_fx, ee[0] ), ee[1] ); /* Q6 */ + mean_ee = Mult_32_16( mean_ee, 10923 /* 1/3 in Q15 */ ); /*Q6*/ /* mean_voi3 = 1.0f/3.0f * (voicing[0] + voicing[1] + voicing[2]);*/ Ltmp0 = L_mult( st_fx->voicing_fx[0], 10923 /* 1/3 in Q15 */ ); /* Q31 */ @@ -228,7 +219,7 @@ Word16 find_uv_fx( /* o : coding type */ { dE2_th = 21 << 10; move32(); - if ( GE_16( add_o( mean_voi3, corr_shift, &Overflow ), 22282 /* 0.68 in Q15 */ ) ) /*( mean_voi3 + corr_shift ) >= 0.68f*/ + if ( GE_16( add_sat( mean_voi3, corr_shift ), 22282 /* 0.68 in Q15 */ ) ) /*( mean_voi3 + corr_shift ) >= 0.68f*/ { nb_cond = 0; move16(); @@ -307,7 +298,7 @@ Word16 find_uv_fx( /* o : coding type */ test(); if ( ( EQ_16( st_fx->last_coder_type_raw, UNVOICED ) ) || /* previous frame was unvoiced */ ( ( LT_32( ee[0], ee0_th ) ) && ( GT_32( hp_E[0], L_shl( E_MIN_FX, Q_new ) ) ) && /* energy is concentrated in high frequencies provided that some energy is present in HF */ - ( LT_16( add_o( st_fx->voicing_fx[0], corr_shift, &Overflow ), voi_th ) ) ) ) /* normalized correlation is low */ + ( LT_16( add_sat( st_fx->voicing_fx[0], corr_shift ), voi_th ) ) ) ) /* normalized correlation is low */ { tmp_offset_flag = 0; move16(); @@ -383,16 +374,16 @@ Word16 find_uv_fx( /* o : coding type */ test(); test(); test(); - if ( ( ( LT_16( add_o( mean_voi3, corr_shift, &Overflow ), add( 22282 /* 0.68 in Q15 */, mean_voi3_offset ) ) ) && /* normalized correlation low */ - ( LT_16( add_o( st_fx->voicing_fx[2], corr_shift, &Overflow ), 25887 /* 0.79 in Q15 */ ) ) && /* normalized correlation low on look-ahead - onset detection */ - ( LT_32( ee[0], 640 /* 10.0f in Q6 */ ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy concentrated in high frequencies provided that some energy is present in HF... */ - ( LT_32( ee[1], ee1_th ) ) && ( GT_32( hp_E[1], E_min_th ) ) && /* ... biased towards look-ahead to detect onsets */ - ( tmp_offset_flag == 0 ) && /* Take care of voiced offsets */ - /*( st_fx->music_hysteresis_fx == 0 ) &&*/ /* ... and in segment after AUDIO frames */ - ( LE_32( dE1, 237568 /* 29.0f in Q13 */ ) ) && /* Avoid on sharp energy spikes */ - ( LE_32( st_fx->old_dE1_fx, 237568 /* 29.0f in Q13 */ ) ) && /* + one frame hysteresis */ - ( st_fx->spike_hyst < 0 ) ) || /* Avoid after sharp energy spikes followed by decay (e.g. castanets) */ - flag_low_relE ) /* low relative frame energy (only for SC-VBR) */ + if ( ( ( LT_16( add_sat( mean_voi3, corr_shift ), add( 22282 /* 0.68 in Q15 */, mean_voi3_offset ) ) ) && /* normalized correlation low */ + ( LT_16( add_sat( st_fx->voicing_fx[2], corr_shift ), 25887 /* 0.79 in Q15 */ ) ) && /* normalized correlation low on look-ahead - onset detection */ + ( LT_32( ee[0], 640 /* 10.0f in Q6 */ ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy concentrated in high frequencies provided that some energy is present in HF... */ + ( LT_32( ee[1], ee1_th ) ) && ( GT_32( hp_E[1], E_min_th ) ) && /* ... biased towards look-ahead to detect onsets */ + ( tmp_offset_flag == 0 ) && /* Take care of voiced offsets */ + /*( st_fx->music_hysteresis_fx == 0 ) &&*/ /* ... and in segment after AUDIO frames */ + ( LE_32( dE1, 237568 /* 29.0f in Q13 */ ) ) && /* Avoid on sharp energy spikes */ + ( LE_32( st_fx->old_dE1_fx, 237568 /* 29.0f in Q13 */ ) ) && /* + one frame hysteresis */ + ( st_fx->spike_hyst < 0 ) ) || /* Avoid after sharp energy spikes followed by decay (e.g. castanets) */ + flag_low_relE ) /* low relative frame energy (only for SC-VBR) */ { coder_type = UNVOICED; move16(); @@ -412,16 +403,16 @@ Word16 find_uv_fx( /* o : coding type */ test(); test(); test(); - if ( ( ( LT_16( add_o( mean_voi3, corr_shift, &Overflow ), add( 22774 /* 0.695f in Q15 */, mean_voi3_offset ) ) ) && /* normalized correlation low */ - ( LT_16( add_sat( st_fx->voicing_fx[2], corr_shift ), 25887 /* 0.8 in Q15 */ ) ) && /* normalized correlation low on look-ahead - onset detection */ - ( LT_32( ee[0], 397 /* 6.2f in Q6 */ ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy concentrated in high frequencies provided that some energy is present in HF... */ - ( LT_32( ee[1], 397 /* 6.2f in Q6 */ ) ) && ( GT_32( hp_E[1], E_min_th ) ) && /* ... biased towards look-ahead to detect onsets */ - ( tmp_offset_flag == 0 ) && /* Take care of voiced offsets */ - /*( st_fx->music_hysteresis_fx == 0 ) && */ /* ... and in segment after AUDIO frames */ - ( LE_32( dE1, 245760 /* 30.0f in Q13 */ ) ) && /* Avoid on sharp energy spikes */ - ( LE_32( st_fx->old_dE1_fx, 245760 /* 30.0f in Q13 */ ) ) && /* + one frame hysteresis */ - ( st_fx->spike_hyst < 0 ) ) /* Avoid after sharp energy spikes followed by decay (e.g. castanets) */ - || ( flag_low_relE && ( LE_32( st_fx->old_dE1_fx, 245760 /* 30.0f in Q13 */ ) ) ) ) /* low relative frame energy (only for SC-VBR) */ + if ( ( ( LT_16( add_sat( mean_voi3, corr_shift ), add( 22774 /* 0.695f in Q15 */, mean_voi3_offset ) ) ) && /* normalized correlation low */ + ( LT_16( add_sat( st_fx->voicing_fx[2], corr_shift ), 25887 /* 0.8 in Q15 */ ) ) && /* normalized correlation low on look-ahead - onset detection */ + ( LT_32( ee[0], 397 /* 6.2f in Q6 */ ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy concentrated in high frequencies provided that some energy is present in HF... */ + ( LT_32( ee[1], 397 /* 6.2f in Q6 */ ) ) && ( GT_32( hp_E[1], E_min_th ) ) && /* ... biased towards look-ahead to detect onsets */ + ( tmp_offset_flag == 0 ) && /* Take care of voiced offsets */ + /*( st_fx->music_hysteresis_fx == 0 ) && */ /* ... and in segment after AUDIO frames */ + ( LE_32( dE1, 245760 /* 30.0f in Q13 */ ) ) && /* Avoid on sharp energy spikes */ + ( LE_32( st_fx->old_dE1_fx, 245760 /* 30.0f in Q13 */ ) ) && /* + one frame hysteresis */ + ( st_fx->spike_hyst < 0 ) ) /* Avoid after sharp energy spikes followed by decay (e.g. castanets) */ + || ( flag_low_relE && ( LE_32( st_fx->old_dE1_fx, 245760 /* 30.0f in Q13 */ ) ) ) ) /* low relative frame energy (only for SC-VBR) */ { coder_type = UNVOICED; move16(); @@ -583,15 +574,15 @@ Word16 find_uv_fx( /* o : coding type */ *-------------------------------------------------------------------*/ Word16 find_uv_ivas_fx( /* o : coding type */ Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 *T_op_fr, /* i : pointer to adjusted fractional pitch (4 val.) Q6*/ - const Word16 *voicing_fr, /* i : refined correlation for each subframes Q15*/ - const Word16 *speech, /* i : pointer to speech signal for E computation Q_new*/ - const Word32 *ee, /* i : lf/hf Energy ratio for present frame Q6*/ + const Word16 *T_op_fr, /* i : pointer to adjusted fractional pitch (4 val.) Q6*/ + const Word16 *voicing_fr, /* i : refined correlation for each subframes Q15*/ + const Word16 *speech, /* i : pointer to speech signal for E computation Q_new*/ + const Word32 *ee, /* i : lf/hf Energy ratio for present frame Q6*/ Word32 *dE1X, /* o : sudden energy increase for S/M classifier Q13*/ - const Word16 corr_shift, /* i : normalized correlation correction in noise Q15*/ - const Word16 relE, /* i : relative frame energy Q8*/ - const Word16 Etot, /* i : total energy Q8*/ - const Word32 hp_E[], /* i : energy in HF q_hp_E*/ + const Word16 corr_shift, /* i : normalized correlation correction in noise Q15*/ + const Word16 relE, /* i : relative frame energy Q8*/ + const Word16 Etot, /* i : total energy Q8*/ + const Word32 hp_E[], /* i : energy in HF q_hp_E*/ Word16 *flag_spitch, /* i/o: flag to indicate very short stable pitch and high correlation Q0*/ const Word16 last_core_orig, /* i : original last core Q0*/ STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ @@ -614,10 +605,6 @@ Word16 find_uv_ivas_fx( /* o : coding typ Word16 ee0_th, ee1_th, voi_th, nb_cond, flag_low_relE; NOISE_EST_HANDLE hNoiseEst = st_fx->hNoiseEst; SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif Word16 Last_Resort; Word16 vadnoise; @@ -674,7 +661,7 @@ Word16 find_uv_ivas_fx( /* o : coding typ exp1 = sub( norm_l( *pt_enr_ssf1 ), 1 ); wtmp1 = extract_h( L_shl( *pt_enr_ssf1, exp1 ) ); fac = div_s( wtmp1, wtmp0 ); - fac_32 = L_shr_o( L_deposit_l( fac ), add( sub( exp1, exp0 ), 15 - 13 ), &Overflow ); /* fac32 in Q13*/ + fac_32 = L_shr_sat( L_deposit_l( fac ), add( sub( exp1, exp0 ), 15 - 13 ) ); /* fac32 in Q13*/ if ( GT_32( fac_32, dE1 ) ) { @@ -717,9 +704,9 @@ Word16 find_uv_ivas_fx( /* o : coding typ * Average voicing (normalized correlation) *-----------------------------------------------------------------*/ - /*mean_ee = 1.0f/3.0f * (st->ee_old + ee[0] + ee[1]); */ /* coefficients take into account the position of the window */ - mean_ee = L_add_o( L_add_o( st_fx->ee_old_fx, ee[0], &Overflow ), ee[1], &Overflow ); /* Q6 */ - mean_ee = Mult_32_16( mean_ee, 10923 ); /*Q6*/ + /*mean_ee = 1.0f/3.0f * (st->ee_old + ee[0] + ee[1]); */ /* coefficients take into account the position of the window */ + mean_ee = L_add_sat( L_add_sat( st_fx->ee_old_fx, ee[0] ), ee[1] ); /* Q6 */ + mean_ee = Mult_32_16( mean_ee, 10923 ); /*Q6*/ /* mean_voi3 = 1.0f/3.0f * (voicing[0] + voicing[1] + voicing[2]);*/ Ltmp0 = L_mult( st_fx->voicing_fx[0], 10923 /* 1/3 in Q15 */ ); /* Q31 */ @@ -729,7 +716,7 @@ Word16 find_uv_ivas_fx( /* o : coding typ * Total frame energy difference (dE3) *-----------------------------------------------------------------*/ - dE3 = sub( Etot, hNoiseEst->Etot_last_fx ); /*Q8*/ + dE3 = sub( Etot, extract_h( hNoiseEst->Etot_last_32fx ) ); /*Q8*/ /*-----------------------------------------------------------------* * Energy decrease after spike (dE2) @@ -744,7 +731,7 @@ Word16 find_uv_ivas_fx( /* o : coding typ { dE2_th = 21 << 10; move32(); - if ( GE_16( add_o( mean_voi3, corr_shift, &Overflow ), 22282 ) ) /*( mean_voi3 + corr_shift ) >= 0.68f*/ + if ( GE_16( add_sat( mean_voi3, corr_shift ), 22282 ) ) /*( mean_voi3 + corr_shift ) >= 0.68f*/ { nb_cond = 0; move16(); @@ -823,9 +810,10 @@ Word16 find_uv_ivas_fx( /* o : coding typ test(); test(); test(); - IF( ( EQ_16( st_fx->last_coder_type_raw, UNVOICED ) ) || /* previous frame was unvoiced */ - ( ( LT_32( ee[0], ee0_th ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy is concentrated in high frequencies provided that some energy is present in HF */ - ( LT_16( add_o( st_fx->voicing_fx[0], corr_shift, &Overflow ), voi_th ) ) ) ) /* normalized correlation is low */ + IF( ( EQ_16( st_fx->last_coder_type_raw, UNVOICED ) ) || /* previous frame was unvoiced */ + ( ( LT_32( ee[0], ee0_th ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy is concentrated in high frequencies provided that some energy is present in HF */ + ( LT_16( add_sat( st_fx->voicing_fx[0], corr_shift ), voi_th ) ) ) ) + /* normalized correlation is low */ { tmp_offset_flag = 0; move16(); @@ -853,11 +841,11 @@ Word16 find_uv_ivas_fx( /* o : coding typ IF( st_fx->input_bwidth != NB ) { /*relE_thres = 0.700f * st->lp_noise - 33.5f; (lp_noise in Q8, constant Q8<<16) */ - L_tmp = L_mac( -562036736 /* 33.5f in Q24 */, 22938 /* 0.7 in Q15 */, st_fx->lp_noise_fx ); // Q24 + L_tmp = L_mac( -562036736 /* 33.5f in Q24 */, 22938 /* 0.7 in Q15 */, extract_h( st_fx->lp_noise_32fx ) ); // Q24 IF( Last_Resort == 0 ) { /*relE_thres = 0.650f * st->lp_noise - 33.5f; (lp_noise in Q8, constant Q8<<16)*/ - L_tmp = L_mac( -562036736 /* 33.5f in Q24 */, 21299 /* 0.650f in Q15 */, st_fx->lp_noise_fx ); // Q24 + L_tmp = L_mac( -562036736 /* 33.5f in Q24 */, 21299 /* 0.650f in Q15 */, extract_h( st_fx->lp_noise_32fx ) ); // Q24 } relE_thres = round_fx( L_tmp ); } @@ -865,7 +853,7 @@ Word16 find_uv_ivas_fx( /* o : coding typ { /*relE_thres = 0.60f * st->lp_noise - 28.2f; (lp_noise in Q8, constant Q8<<16)*/ - L_tmp = L_mac( -473117491 /* 28.2f in Q24 */, 19661 /* 0.6f in Q15 */, st_fx->lp_noise_fx ); // Q24 + L_tmp = L_mac( -473117491 /* 28.2f in Q24 */, 19661 /* 0.6f in Q15 */, extract_h( st_fx->lp_noise_32fx ) ); // Q24 relE_thres = round_fx( L_tmp ); } relE_thres = s_max( relE_thres, -6400 /* -25.0f in Q8 */ ); /* Q8 */ @@ -901,16 +889,17 @@ Word16 find_uv_ivas_fx( /* o : coding typ test(); test(); test(); - IF( ( ( LT_16( add_o( mean_voi3, corr_shift, &Overflow ), add( 22282 /* 0.68 in Q15 */, mean_voi3_offset ) ) ) && /* normalized correlation low */ - ( LT_16( add_o( st_fx->voicing_fx[2], corr_shift, &Overflow ), 25887 /* 0.79 in Q15 */ ) ) && /* normalized correlation low on look-ahead - onset detection */ - ( LT_32( ee[0], 640 /* 10.0f in Q6 */ ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy concentrated in high frequencies provided that some energy is present in HF... */ - ( LT_32( ee[1], ee1_th ) ) && ( GT_32( hp_E[1], E_min_th ) ) && /* ... biased towards look-ahead to detect onsets */ - ( tmp_offset_flag == 0 ) && /* Take care of voiced offsets */ - /*( st_fx->music_hysteresis_fx == 0 ) &&*/ /* ... and in segment after AUDIO frames */ - ( LE_32( dE1, 237568 /* 29.0f in Q13 */ ) ) && /* Avoid on sharp energy spikes */ - ( LE_32( st_fx->old_dE1_fx, 237568 /* 29.0f in Q13 */ ) ) && /* + one frame hysteresis */ - ( st_fx->spike_hyst < 0 ) ) || /* Avoid after sharp energy spikes followed by decay (e.g. castanets) */ - flag_low_relE ) /* low relative frame energy (only for SC-VBR) */ + IF( ( ( LT_16( add_sat( mean_voi3, corr_shift ), add( 22282 /* 0.68 in Q15 */, mean_voi3_offset ) ) ) && /* normalized correlation low */ + ( LT_16( add_sat( st_fx->voicing_fx[2], corr_shift ), 25887 /* 0.79 in Q15 */ ) ) && /* normalized correlation low on look-ahead - onset detection */ + ( LT_32( ee[0], 640 /* 10.0f in Q6 */ ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy concentrated in high frequencies provided that some energy is present in HF... */ + ( LT_32( ee[1], ee1_th ) ) && ( GT_32( hp_E[1], E_min_th ) ) && /* ... biased towards look-ahead to detect onsets */ + ( tmp_offset_flag == 0 ) && /* Take care of voiced offsets */ + /*( st_fx->music_hysteresis_fx == 0 ) &&*/ /* ... and in segment after AUDIO frames */ + ( LE_32( dE1, 237568 /* 29.0f in Q13 */ ) ) && /* Avoid on sharp energy spikes */ + ( LE_32( st_fx->old_dE1_fx, 237568 /* 29.0f in Q13 */ ) ) && /* + one frame hysteresis */ + ( st_fx->spike_hyst < 0 ) ) || /* Avoid after sharp energy spikes followed by decay (e.g. castanets) */ + flag_low_relE ) + /* low relative frame energy (only for SC-VBR) */ { coder_type = UNVOICED; move16(); @@ -927,16 +916,16 @@ Word16 find_uv_ivas_fx( /* o : coding typ test(); test(); test(); - if ( ( ( LT_16( add_o( mean_voi3, corr_shift, &Overflow ), add( 22774 /* 0.695f in Q15 */, mean_voi3_offset ) ) ) && /* normalized correlation low */ - /*( LT_16( add_o( st_fx->voicing_fx[2], corr_shift, &Overflow ), 25887 ) ) && */ /* normalized correlation low on look-ahead - onset detection */ - ( LT_32( ee[0], 397 /* 6.2f in Q6 */ ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy concentrated in high frequencies provided that some energy is present in HF... */ - ( LT_32( ee[1], 397 /* 6.2f in Q16 */ ) ) && ( GT_32( hp_E[1], E_min_th ) ) && /* ... biased towards look-ahead to detect onsets */ - ( tmp_offset_flag == 0 ) && /* Take care of voiced offsets */ - /*( st_fx->music_hysteresis_fx == 0 ) && */ /* ... and in segment after AUDIO frames */ - ( LE_32( dE1, 245760 /* 30.0f in Q13 */ ) ) && /* Avoid on sharp energy spikes */ - ( LE_32( st_fx->old_dE1_fx, 245760 /* 30.0f in Q13 */ ) ) && /* + one frame hysteresis */ - ( st_fx->spike_hyst < 0 ) ) /* Avoid after sharp energy spikes followed by decay (e.g. castanets) */ - || ( flag_low_relE && ( LE_32( st_fx->old_dE1_fx, 245760 /* 30.0f in Q13 */ ) ) ) ) /* low relative frame energy (only for SC-VBR) */ + if ( ( ( LT_16( add_sat( mean_voi3, corr_shift ), add( 22774 /* 0.695f in Q15 */, mean_voi3_offset ) ) ) && /* normalized correlation low */ + /*( LT_16( add_o( st_fx->voicing_fx[2], corr_shift, &Overflow ), 25887 ) ) && */ /* normalized correlation low on look-ahead - onset detection */ + ( LT_32( ee[0], 397 /* 6.2f in Q6 */ ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy concentrated in high frequencies provided that some energy is present in HF... */ + ( LT_32( ee[1], 397 /* 6.2f in Q16 */ ) ) && ( GT_32( hp_E[1], E_min_th ) ) && /* ... biased towards look-ahead to detect onsets */ + ( tmp_offset_flag == 0 ) && /* Take care of voiced offsets */ + /*( st_fx->music_hysteresis_fx == 0 ) && */ /* ... and in segment after AUDIO frames */ + ( LE_32( dE1, 245760 /* 30.0f in Q13 */ ) ) && /* Avoid on sharp energy spikes */ + ( LE_32( st_fx->old_dE1_fx, 245760 /* 30.0f in Q13 */ ) ) && /* + one frame hysteresis */ + ( st_fx->spike_hyst < 0 ) ) /* Avoid after sharp energy spikes followed by decay (e.g. castanets) */ + || ( flag_low_relE && ( LE_32( st_fx->old_dE1_fx, 245760 /* 30.0f in Q13 */ ) ) ) ) /* low relative frame energy (only for SC-VBR) */ { coder_type = UNVOICED; move16(); diff --git a/lib_enc/find_wsp_fx.c b/lib_enc/find_wsp_fx.c index 155e499046dd1ead55fbc5fc7bf4f87eb4edd434..6e75c36c2ce874ceb10b13e29c04967fdf12dc7f 100644 --- a/lib_enc/find_wsp_fx.c +++ b/lib_enc/find_wsp_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -14,12 +14,12 @@ * find_wsp_fx * * Parameters: - * Az I: A(z) filter coefficients Q12 + * Az I: A(z) filter coefficients Q12 * speech I: pointer to the denoised speech frame Q_new - preemph_bits * wsp O: pointer to the weighted speech frame Q_new - preemph_bits - * mem_wsp I/O: W(z) denominator memory + * mem_wsp I/O: W(z) denominator memory * preemph_fac I: pre-emphasis factor Q15 - * L_frame I: length of the frame + * L_frame I: length of the frame * lookahead I: length of a look-ahead * L_subfr I: length of the sub-frame * @@ -30,17 +30,17 @@ * void */ void find_wsp_fx( - const Word16 Az[], /* i : A(z) filter coefficients Q12*/ - const Word16 speech[], /* i : pointer to the denoised speech frame Q_new-preemph_bits*/ - Word16 wsp[], /* o : poitnter to the weighted speech frame Q_new-preemph_bits*/ - Word16 *mem_wsp, /* i/o: W(Z) denominator memory Q_new-preemph_bits*/ - const Word16 preemph_fac, /* i : pre - emphasis factor Q15*/ - const Word16 L_frame, /* i : length of the frame Q0*/ - const Word16 lookahead, /* i : look-ahead Q0*/ - const Word16 L_subfr, /* i : length of subframe Q0*/ - Word16 *Aw, /* o : weighted A(z) filter coefficients Q12*/ - const Word16 gamma, /* i : weighting factor Q15*/ - const Word16 nb_subfr /* i : number of subframes Q0*/ + const Word16 Az[], /* i : A(z) filter coefficients Q12*/ + const Word16 speech[], /* i : pointer to the denoised speech frame Q_new-preemph_bits*/ + Word16 wsp[], /* o : poitnter to the weighted speech frame Q_new-preemph_bits*/ + Word16 *mem_wsp, /* i/o: W(Z) denominator memory Q_new-preemph_bits*/ + const Word16 preemph_fac, /* i : pre - emphasis factor Q15*/ + const Word16 L_frame, /* i : length of the frame Q0*/ + const Word16 lookahead, /* i : look-ahead Q0*/ + const Word16 L_subfr, /* i : length of subframe Q0*/ + Word16 *Aw, /* o : weighted A(z) filter coefficients Q12*/ + const Word16 gamma, /* i : weighting factor Q15*/ + const Word16 nb_subfr /* i : number of subframes Q0*/ ) { Word16 i_subfr, wtmp; diff --git a/lib_enc/frame_spec_dif_cor_rate_fx.c b/lib_enc/frame_spec_dif_cor_rate_fx.c index 3e2eb40155f5e006eda820818db061688d9d2299..54e6148af0ae94641339d7b0a962c83cf7cfd116 100644 --- a/lib_enc/frame_spec_dif_cor_rate_fx.c +++ b/lib_enc/frame_spec_dif_cor_rate_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -20,10 +20,10 @@ * *-------------------------------------------------------------------*/ void frame_spec_dif_cor_rate_fx( - VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ - Word32 *spec_amp, /* i : spectral amplitude scale*/ - Word16 sacle, /* i : the scaling of spec_amp */ - Word16 f_tonality_rate[3] /* o : tonality rate Qx*/ + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + Word32 *spec_amp, /* i : spectral amplitude scale*/ + Word16 sacle, /* i : the scaling of spec_amp */ + Word16 f_tonality_rate[3] /* o : tonality rate Qx*/ ) { @@ -35,7 +35,7 @@ void frame_spec_dif_cor_rate_fx( Word16 scalefactor, spec_dif_cor_rate; Word32 m, dx, dy; Word16 *pre_spec_low_dif = hVAD_CLDFB->pre_spec_low_dif; - const Word32 FIX_cost1 = 2147484 /* 0.001f Q31 */; + const Word32 FIX_cost1 = INV_1000_Q31; move16(); move32(); diff --git a/lib_enc/gain_enc_fx.c b/lib_enc/gain_enc_fx.c index 0321cd763496bed2b50533c25200944947315a6d..3e3c763230a571a5cd5e0486d3452c7a955585a7 100644 --- a/lib_enc/gain_enc_fx.c +++ b/lib_enc/gain_enc_fx.c @@ -1,15 +1,15 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ -#include "rom_com.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*-------------------------------------------------------------------* * Local constants *-------------------------------------------------------------------*/ @@ -17,12 +17,14 @@ #define RANGE 64 #define NB_QUA_GAIN7B 128 /* Number of quantization levels */ + /*-------------------------------------------------------------------* * Local function prototype *-------------------------------------------------------------------*/ static Word16 Find_Opt_gainQ_fx( Word16 *coeff, Word16 *exp_coeff, Word16 *gain_pit, Word32 *gain_code, Word16 gcode0, Word16 exp_gcode0, const Word16 *cdbk, const Word16 size ); + /*==========================================================================*/ /* FUNCTION : Es_pred_enc_fx() */ /*--------------------------------------------------------------------------*/ @@ -30,12 +32,12 @@ static Word16 Find_Opt_gainQ_fx( Word16 *coeff, Word16 *exp_coeff, Word16 *gain_ /*--------------------------------------------------------------------------*/ /* INPUT ARGUMENTS : */ /* _ Word16 L_frame, i : length of the frame Q0 */ -/* _ Word16 *res, i : residual signal Q_new */ +/* _ Word16 *res, i : residual signal Q_new */ /* _ Word16 *voicing, i : normalized correlation in three 1/2frames Q15*/ -/* _ Word16 coder_type, i : coder_type Q0 */ -/* _ Word16 bwidth, i : input signal bandwidth Q0 */ -/* _ Word32 core_brate, i : core bitrate Q0 */ -/* _ Word16 Q_new i : Scaling in speech Q0 */ +/* _ Word16 coder_type, i : coder_type Q0 */ +/* _ Word16 bwidth, i : input signal bandwidth Q0 */ +/* _ Word32 core_brate, i : core bitrate Q0 */ +/* _ Word16 Q_new i : Scaling in speech Q0 */ /*--------------------------------------------------------------------------*/ /* OUTPUT ARGUMENTS : */ /* _ Word16 *Es_pred, o : predicited scaled innovation energy Q8 */ @@ -49,14 +51,14 @@ static Word16 Find_Opt_gainQ_fx( Word16 *coeff, Word16 *exp_coeff, Word16 *gain_ /*==========================================================================*/ void Es_pred_enc_fx( - Word16 *Es_pred, /* o : predicited scaled innovation energy Q8*/ - Word16 *indice, /* o : indice of quantization Q0*/ - const Word16 L_frame, /* i : length of the frame Q0*/ - const Word16 *res, /* i : residual signal Q_new*/ - const Word16 *voicing, /* i : normalized correlation in three 1/2frames Q15*/ - const Word16 nb_bits, /* i : allocated number of bits Q0*/ - const Word16 no_ltp, /* i : no_ltp flag Q0*/ - Word16 Q_new /* i : Scaling in speech Q0*/ + Word16 *Es_pred, /* o : predicited scaled innovation energy Q8*/ + Word16 *indice, /* o : indice of quantization Q0*/ + const Word16 L_frame, /* i : length of the frame Q0*/ + const Word16 *res, /* i : residual signal Q_new*/ + const Word16 *voicing, /* i : normalized correlation in three 1/2frames Q15*/ + const Word16 nb_bits, /* i : allocated number of bits Q0*/ + const Word16 no_ltp, /* i : no_ltp flag Q0*/ + Word16 Q_new /* i : Scaling in speech Q0*/ ) { Word16 i, i_subfr, size, tmp16, tmp16_2, Q_res; @@ -64,10 +66,6 @@ void Es_pred_enc_fx( Word16 s0, s1, ener_dB, mean_ener_code16; const Word16 *qua_table; Word32 ener_fx, Lmean_ener_code, Ltmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif Lmean_ener_code = L_deposit_l( 0 ); Q_res = sub( shl( Q_new, 1 ), 3 ); @@ -90,12 +88,12 @@ void Es_pred_enc_fx( FOR( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) { /* calculate the energy of residual signal */ - tmp16 = mult_r( res[i_subfr + 0], 8192 /* 1 in Q13 */ ); /* remove 2bits Q_new - 2*/ + tmp16 = mult_r( res[i_subfr + 0], 8192 /* 1 in Q13 */ ); /* remove 2bits Q_new - 2*/ ener_fx = L_mult( tmp16, tmp16 ); FOR( i = 1; i < L_SUBFR; i++ ) { - tmp16 = mult_r( res[i_subfr + i], 8192 /* 1 in Q13 */ ); /* remove 2bits Q_new - 2*/ - ener_fx = L_mac_o( ener_fx, tmp16, tmp16, &Overflow ); + tmp16 = mult_r( res[i_subfr + i], 8192 /* 1 in Q13 */ ); /* remove 2bits Q_new - 2*/ + ener_fx = L_mac_sat( ener_fx, tmp16, tmp16 ); } /* ener = 10 * (float)log10(ener / (float)L_SUBFR) */ @@ -177,7 +175,7 @@ void Es_pred_enc_fx( FOR( i = 1; i < size; i++ ) { - tmp16_2 = abs_s( sub_o( mean_ener_code16, qua_table[i], &Overflow ) ); + tmp16_2 = abs_s( sub_sat( mean_ener_code16, qua_table[i] ) ); IF( LT_16( tmp16_2, tmp16 ) ) { tmp16 = tmp16_2; @@ -202,24 +200,24 @@ void Es_pred_enc_fx( * - the mean-squared weighted error criterion is used for codebook search *---------------------------------------------------------------------*/ void gain_enc_mless_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 gains_mode[], /* i : gain bits Q0*/ - const Word16 element_mode, /* i : element mode Q0*/ - const Word16 L_frame, /* i : length of the frame Q0*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - const Word16 *xn, /* i : target vector Q_xn*/ - const Word16 *y1, /* i : zero-memory filtered adaptive excitation Q_xn*/ - const Word16 Q_xn, /* i : xn and y1 scaling */ - const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ - const Word16 *code, /* i : algebraic excitation Q9*/ - const Word16 Es_pred, /* i : predicted scaled innovation energy Q8*/ - Word16 *gain_pit, /* o : quantized pitch gain Q14*/ - Word32 *gain_code, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ - Word16 *g_corr, /* i/o: correlations , -2,, -2 and 2 Qx*/ - const Word16 clip_gain /* i : gain pitch clipping flag (1 = clipping) Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 gains_mode[], /* i : gain bits Q0*/ + const Word16 element_mode, /* i : element mode Q0*/ + const Word16 L_frame, /* i : length of the frame Q0*/ + const Word16 i_subfr, /* i : subframe index Q0*/ + const Word16 tc_subfr, /* i : TC subframe index Q0*/ + const Word16 *xn, /* i : target vector Q_xn*/ + const Word16 *y1, /* i : zero-memory filtered adaptive excitation Q_xn*/ + const Word16 Q_xn, /* i : xn and y1 scaling */ + const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ + const Word16 *code, /* i : algebraic excitation Q9*/ + const Word16 Es_pred, /* i : predicted scaled innovation energy Q8*/ + Word16 *gain_pit, /* o : quantized pitch gain Q14*/ + Word32 *gain_code, /* o : quantized codebook gain Q16*/ + Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ + Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ + Word16 *g_corr, /* i/o: correlations , -2,, -2 and 2 Qx*/ + const Word16 clip_gain /* i : gain pitch clipping flag (1 = clipping) Q0*/ ) { @@ -233,10 +231,6 @@ void gain_enc_mless_fx( Word16 exp1, exp2; Word16 exp_num, exp_den, exp_div, frac_den; Word32 L_frac_num, L_frac_den, L_div; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*-----------------------------------------------------------------* * calculate the rest of the correlation coefficients @@ -275,31 +269,42 @@ void gain_enc_mless_fx( /* gain_inov = 1.0f / sqrt((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ L_tmp = Dot_product12( code, code, L_SUBFR, &exp_code ); exp_inov = sub( exp_code, 18 + 6 ); - exp_code = sub( exp_code, 30 ); + // To avoid crash in case code value is 0, + test(); + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_tmp, exp_inov, 21474836, 0 ), -1 ) && element_mode > EVS_MONO ) + { + // setting values to avoid extra computation + *gain_inov = 32767; /*8(max value gain_inov can hold) in Q12*/ + Ei = -9743; /* -38 in Q8*/ + move16(); + move16(); + } + ELSE + { - /*Ei = 10 * log10((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ + exp_code = sub( exp_code, 30 ); - /*----------------------------------------------------------------* - * calculate the predicted gain code - *----------------------------------------------------------------*/ - tmp = norm_l( L_tmp ); - frac = Log2_norm_lc( L_shl( L_tmp, tmp ) ); - tmp = add( 30 - 18 - 6 - 1, sub( exp_code, tmp ) ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ - L_tmp1 = Mpy_32_16( tmp, frac, 12330 ); /* Q13 */ - Ei = round_fx( L_shl( L_tmp1, 11 ) ); /* Q8 */ + /*Ei = 10 * log10((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ + /*----------------------------------------------------------------* + * calculate the predicted gain code + *----------------------------------------------------------------*/ + tmp = norm_l( L_tmp ); + frac = Log2_norm_lc( L_shl( L_tmp, tmp ) ); + tmp = add( 30 - 18 - 6 - 1, sub( exp_code, tmp ) ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ + L_tmp1 = Mpy_32_16( tmp, frac, 12330 ); /* Q13 */ + Ei = round_fx( L_shl( L_tmp1, 11 ) ); /* Q8 */ + /*---------------------------------------------------------------* + * Decode codebook gain and the adaptive excitation low-pass + * filtering factor (Finalize computation ) + *---------------------------------------------------------------*/ + /* gain_inov = 1.0f / sqrt((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ + L_tmp = Isqrt_lc( L_tmp, &exp_inov ); + *gain_inov = extract_h( L_shl( L_tmp, sub( exp_inov, 3 ) ) ); /* gain_inov in Q12 */ + move16(); + } /* predicted codebook gain */ gcode0 = sub( Es_pred, Ei ); /* Q8 */ - - /*---------------------------------------------------------------* - * Decode codebook gain and the adaptive excitation low-pass - * filtering factor (Finalize computation ) - *---------------------------------------------------------------*/ - /* gain_inov = 1.0f / sqrt((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ - L_tmp = Isqrt_lc( L_tmp, &exp_inov ); - *gain_inov = extract_h( L_shl( L_tmp, sub( exp_inov, 3 ) ) ); /* gain_inov in Q12 */ - move16(); - /* gcode0 = pow(10, 0.05 * (Es_pred - Ei)) */ /*----------------------------------------------------------------* * gcode0 = pow(10.0, gcode0/20) @@ -339,10 +344,10 @@ void gain_enc_mless_fx( = ((-0.5*g_corr[3]*g_corr[0]) - (-0.25*g_corr[1]*g_corr[4]))/tmp1; = ((0.25*g_corr[1]*g_corr[4]) - (0.5*g_corr[0]*g_corr[3]))/tmp1; */ - L_tmp1 = L_mult( coeff[0], coeff[2] ); /*Q31*/ + L_tmp1 = L_mult_sat( coeff[0], coeff[2] ); /*Q31*/ exp1 = add( exp_coeff[0], exp_coeff[2] ); - L_tmp2 = L_shr( L_mult( coeff[4], coeff[4] ), 2 ); /*Q31*/ + L_tmp2 = L_shr( L_mult_sat( coeff[4], coeff[4] ), 2 ); /*Q31*/ exp2 = add( exp_coeff[4], exp_coeff[4] ); IF( GT_16( exp1, exp2 ) ) @@ -388,7 +393,7 @@ void gain_enc_mless_fx( L_div = Mult_32_16( L_frac_num, tmp ); /*Q(30-exp)*/ exp_div = sub( exp_num, exp_den ); - *gain_pit = round_fx_o( L_shl_o( L_div, add( exp, exp_div ), &Overflow ), &Overflow ); /*Q14*/ + *gain_pit = round_fx_sat( L_shl_sat( L_div, add( exp, exp_div ) ) ); /*Q14*/ L_tmp1 = L_shr( L_mult( coeff[1], coeff[4] ), 2 ); /*Q31*/ exp1 = add( exp_coeff[1], exp_coeff[4] ); @@ -413,7 +418,7 @@ void gain_enc_mless_fx( L_div = Mult_32_16( L_frac_num, tmp ); /*Q(30-exp)*/ exp_div = sub( exp_num, exp_den ); - *gain_code = L_shl_o( L_div, sub( add( exp, exp_div ), 14 ), &Overflow ); + *gain_code = L_shl_sat( L_div, sub( add( exp, exp_div ), 14 ) ); move32(); /*Q16*/ *gain_pit = s_max( G_PITCH_MIN_TC192_Q14, s_min( *gain_pit, G_PITCH_MAX_TC192_Q14 ) ); @@ -428,7 +433,7 @@ void gain_enc_mless_fx( tmp1 = mult_r( G_PITCH_MAX_MINUS_MIN_TC192_Q13, div_s( 1, sub( shl( 1, nBits ), 1 ) ) ); /*Q13*/ /* set quantization step */ index = usquant_fx( *gain_pit, gain_pit, G_PITCH_MIN_TC192_Q14, tmp1, shl( 1, nBits ) ); move16(); - push_indice_fx( hBstr, IND_GAIN_PIT, index, nBits ); + push_indice( hBstr, IND_GAIN_PIT, index, nBits ); /* gain_code Q */ /**gain_code /= gcode0;*/ @@ -441,9 +446,9 @@ void gain_enc_mless_fx( } index = gain_quant_fx( gain_code, &gain_code16, LG10_G_CODE_MIN_TC192_Q14, LG10_G_CODE_MAX_TC192_Q13, nBits2, &expg ); - push_indice_fx( hBstr, IND_GAIN_CODE, index, nBits2 ); - L_tmp = L_mult( gain_code16, gcode0 ); /*Q0*Q0 -> Q1*/ - *gain_code = L_shl_o( L_tmp, add( add( expg, exp_gcode0 ), 15 ), &Overflow ); /*Q16*/ + push_indice( hBstr, IND_GAIN_CODE, index, nBits2 ); + L_tmp = L_mult( gain_code16, gcode0 ); /*Q0*Q0 -> Q1*/ + *gain_code = L_shl_sat( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); /*Q16*/ } ELSE { @@ -466,6 +471,7 @@ void gain_enc_mless_fx( qua_table = gain_qua_mless_6b_fx; if ( element_mode > EVS_MONO ) { + qua_table = gain_qua_mless_6b_stereo_fx; } move16(); if ( EQ_16( clip_gain, 1 ) ) @@ -508,7 +514,7 @@ void gain_enc_mless_fx( * search for the best quantizer *-----------------------------------------------------------------*/ index = Find_Opt_gainQ_fx( coeff, exp_coeff, gain_pit, gain_code, gcode0, exp_gcode0, qua_table, size ); // Q0 - push_indice_fx( hBstr, IND_GAIN, index, nBits ); + push_indice( hBstr, IND_GAIN, index, nBits ); } /* *norm_gain_code = *gain_code / *gain_inov; */ @@ -522,118 +528,116 @@ void gain_enc_mless_fx( return; } -void gain_enc_mless_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 gains_mode[], /* i : gain bits Q0*/ - const Word16 element_mode, /* i : element mode Q0*/ - const Word16 L_frame, /* i : length of the frame Q0*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - const Word16 *xn, /* i : target vector Q_xn*/ - const Word16 *y1, /* i : zero-memory filtered adaptive excitation Q_xn*/ - const Word16 Q_xn, /* i : xn and y1 scaling */ - const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ - const Word16 *code, /* i : algebraic excitation Q9*/ - const Word16 Es_pred, /* i : predicted scaled innovation energy Q8*/ - Word16 *gain_pit, /* o : quantized pitch gain Q14*/ - Word32 *gain_code, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ - Word16 *g_corr, /* i/o: correlations , -2,, -2 and 2 Qx*/ - const Word16 clip_gain /* i : gain pitch clipping flag (1 = clipping) Q0*/ + +/*---------------------------------------------------------------------* + * gain_enc_SQ() + * + * Scalar Quantization of pitch and codebook gains without prediction + * - an initial predicted gain, gcode0, is first determined based on + * the predicted scaled innovation energy + * - a correction factor gamma = g_code / gcode0 is then vector quantized + * along with gain_pit + * - the mean-squared weighted error criterion is used for codebook search + *---------------------------------------------------------------------*/ + +void gain_enc_SQ_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 gains_mode[], /* i : gain bits Q0*/ + const Word16 i_subfr, /* i : subframe index Q0*/ + const Word16 *xn, /* i : target vector Q_xn*/ + const Word16 *yy1, /* i : zero-memory filtered adaptive excitation Q_xn*/ + const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ + const Word16 *code, /* i : algebraic excitation Q9*/ + const Word16 Es_pred, /* i : predicted scaled innovation energy Q8*/ + Word16 *gain_pit, /* o : quantized pitch gain Q14*/ + Word32 *gain_code, /* o : quantized codebook gain Q16*/ + Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ + Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ + Word16 *g_corr, /* i/o: correlations , ,, -2 and 2 Qx*/ + const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ + const Word16 Q_xn /* i : xn and y1 scaling */ ) { - - Word16 index, size, nBits, nBits2; + Word16 index, nBits_pitch, nBits_code; Word16 gcode0, Ei, gain_code16; - const Word16 *qua_table; Word16 coeff[5], exp_coeff[5]; Word16 exp, exp_code, exp_inov, exp_gcode0, frac, tmp; + Word32 L_tmp, L_tmp1, L_tmp2; Word16 tmp1, expg; Word16 exp1, exp2; Word16 exp_num, exp_den, exp_div, frac_den; Word32 L_frac_num, L_frac_den, L_div; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*-----------------------------------------------------------------* * calculate the rest of the correlation coefficients * c2 = , c3 = -2, c4 = 2 *-----------------------------------------------------------------*/ + /*g_corr[1] *= -0.5;*/ + /*g_corr[2] = dotp( y2, y2, L_SUBFR ) + 0.01f;*/ + /*g_corr[3] = dotp( xn, y2, L_SUBFR ) - 0.02f;*/ + /*g_corr[4] = dotp( yy1, y2, L_SUBFR ) + 0.02f;*/ coeff[0] = g_corr[0]; move16(); exp_coeff[0] = g_corr[1]; move16(); - coeff[1] = negate( g_corr[2] ); - move16(); /* coeff[1] = -2 xn yy1 */ - exp_coeff[1] = add( g_corr[3], 1 ); + coeff[1] = g_corr[2]; + move16(); /* coeff[1] = xn yy1 */ + exp_coeff[1] = g_corr[3]; move16(); /* Compute scalar product */ coeff[2] = extract_h( Dot_product12( y2, y2, L_SUBFR, &exp ) ); + move16(); exp_coeff[2] = add( sub( exp, 18 ), shl( Q_xn, 1 ) ); move16(); /* -18 (y2 Q9) */ - /* Compute scalar product -2* */ - coeff[3] = extract_h( L_negate( Dot_product12( xn, y2, L_SUBFR, &exp ) ) ); - exp_coeff[3] = add( sub( exp, 9 - 1 ), Q_xn ); - move16(); /* -9 (y2 Q9), +1 (2 xn y2) */ + /* Compute scalar product */ + coeff[3] = extract_h( Dot_product12( xn, y2, L_SUBFR, &exp ) ); + move16(); + exp_coeff[3] = add( sub( exp, 9 ), Q_xn ); + move16(); /* -9 (y2 Q9), (xn y2) */ - /* Compute scalar product 2* */ - coeff[4] = extract_h( Dot_product12( y1, y2, L_SUBFR, &exp ) ); - exp_coeff[4] = add( sub( exp, 9 - 1 ), Q_xn ); - move16(); /* -9 (y2 Q9), +1 (2 y1 y2) */ + /* Compute scalar product */ + coeff[4] = extract_h( Dot_product12( yy1, y2, L_SUBFR, &exp ) ); + move16(); + exp_coeff[4] = add( sub( exp, 9 ), Q_xn ); + move16(); /* -9 (y2 Q9), (y1 y2) */ /*-----------------------------------------------------------------* * calculate the unscaled innovation energy * calculate the predicted gain code + * calculate optimal gains *-----------------------------------------------------------------*/ + /*Ecode = (dotp( code, code, L_SUBFR) + 0.01f) / L_SUBFR;*/ + /**gain_inov = 1.0f / (float)sqrt( Ecode );*/ - /* gain_inov = 1.0f / sqrt((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ L_tmp = Dot_product12( code, code, L_SUBFR, &exp_code ); exp_inov = sub( exp_code, 18 + 6 ); + exp_code = sub( exp_code, 30 ); - // To avoid crash in case code value is 0, - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_tmp, exp_inov, 21474836, 0 ), -1 ) ) - { - // setting values to avoid extra computation - *gain_inov = 32767; /*8(max value gain_inov can hold) in Q12*/ - Ei = -9743; /* -38 in Q8*/ - move16(); - move16(); - } - ELSE - { - exp_code = sub( exp_code, 30 ); - - /*Ei = 10 * log10((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ - - /*----------------------------------------------------------------* - * calculate the predicted gain code - *----------------------------------------------------------------*/ - tmp = norm_l( L_tmp ); - frac = Log2_norm_lc( L_shl( L_tmp, tmp ) ); - tmp = add( 30 - 18 - 6 - 1, sub( exp_code, tmp ) ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ - L_tmp1 = Mpy_32_16( tmp, frac, 12330 ); /* Q13 */ - Ei = round_fx( L_shl( L_tmp1, 11 ) ); /* Q8 */ - - /*---------------------------------------------------------------* - * Decode codebook gain and the adaptive excitation low-pass - * filtering factor (Finalize computation ) - *---------------------------------------------------------------*/ - /* gain_inov = 1.0f / sqrt((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ - L_tmp = Isqrt_lc( L_tmp, &exp_inov ); - *gain_inov = extract_h( L_shl( L_tmp, sub( exp_inov, 3 ) ) ); /* gain_inov in Q12 */ - move16(); - } + /*Ei = 10 * log10((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ + /*----------------------------------------------------------------* + * calculate the predicted gain code + *----------------------------------------------------------------*/ + tmp = norm_l( L_tmp ); + frac = Log2_norm_lc( L_shl( L_tmp, tmp ) ); + tmp = add( 30 - 18 - 6 - 1, sub( exp_code, tmp ) ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ + L_tmp1 = Mpy_32_16( tmp, frac, 12330 ); /* Q13 */ + Ei = round_fx( L_shl( L_tmp1, 11 ) ); /* Q8 */ /* predicted codebook gain */ gcode0 = sub( Es_pred, Ei ); /* Q8 */ + /*---------------------------------------------------------------* + * Decode codebook gain and the adaptive excitation low-pass + * filtering factor (Finalize computation ) + *---------------------------------------------------------------*/ + /* gain_inov = 1.0f / sqrt((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ + L_tmp = Isqrt_lc( L_tmp, &exp_inov ); + *gain_inov = extract_h( L_shl( L_tmp, sub( exp_inov, 3 ) ) ); /* gain_inov in Q12 */ + /* gcode0 = pow(10, 0.05 * (Es_pred - Ei)) */ /*----------------------------------------------------------------* * gcode0 = pow(10.0, gcode0/20) @@ -650,197 +654,151 @@ void gain_enc_mless_ivas_fx( /* 16384 < Pow2() <= 32767 */ exp_gcode0 = sub( exp_gcode0, 14 ); - /*-----------------------------------------------------------------* - * select the codebook, size and number of bits - * set the gains searching range - *-----------------------------------------------------------------*/ - nBits = gains_mode[i_subfr >> 6]; - move16(); - test(); - test(); - test(); - test(); - test(); - IF( ( EQ_16( tc_subfr, 3 * L_SUBFR ) && EQ_16( i_subfr, 3 * L_SUBFR ) && EQ_16( L_frame, L_FRAME ) ) || - ( EQ_16( tc_subfr, 4 * L_SUBFR ) && EQ_16( i_subfr, 4 * L_SUBFR ) && EQ_16( L_frame, L_FRAME16k ) ) ) - { - /* *gain_pit = (g_corr[2]*tmp2) - (0.5f*g_corr[4]*tmp3); - = ((-0.5f*g_corr[1]*g_corr[2]) - (-0.25*g_corr[3]*g_corr[4]))/tmp1; - = ((0.25*g_corr[3]*g_corr[4]) - (0.5*g_corr[1]*g_corr[2]))/tmp1; */ + /*tmp1 = (g_corr[0]*g_corr[2]) - (g_corr[4]*g_corr[4]); + tmp2 = g_corr[1]/tmp1; + tmp1 = g_corr[3]/tmp1; - /* *gain_code = (g_corr[0]*tmp3) - (0.5f*g_corr[4]*tmp2); - = ((-0.5*g_corr[3]*g_corr[0]) - (-0.25*g_corr[1]*g_corr[4]))/tmp1; - = ((0.25*g_corr[1]*g_corr[4]) - (0.5*g_corr[0]*g_corr[3]))/tmp1; */ + *gain_pit = (g_corr[2]*tmp2) - (g_corr[4]*tmp1); + *gain_code = (g_corr[0]*tmp1) - (g_corr[4]*tmp2);*/ - L_tmp1 = L_mult_sat( coeff[0], coeff[2] ); /*Q31 added saturation for -32768*-32768*/ - exp1 = add( exp_coeff[0], exp_coeff[2] ); + /* *gain_pit = (g_corr[2]*tmp2) - (g_corr[4]*tmp3); + = ((g_corr[1]*g_corr[2]) - (g_corr[3]*g_corr[4]))/tmp1;*/ - L_tmp2 = L_shr( L_mult_sat( coeff[4], coeff[4] ), 2 ); /*Q31 added saturation for -32768*-32768*/ - exp2 = add( exp_coeff[4], exp_coeff[4] ); + /* *gain_code = (g_corr[0]*tmp3) - (g_corr[4]*tmp2); + = ((g_corr[3]*g_corr[0]) - (g_corr[1]*g_corr[4]))/tmp1;*/ - IF( GT_16( exp1, exp2 ) ) - { - L_tmp2 = L_shr( L_tmp2, sub( exp1, exp2 ) ); /*Q31*/ - exp_den = exp1; - move16(); - } - ELSE - { - L_tmp1 = L_shr( L_tmp1, sub( exp2, exp1 ) ); /*Q31*/ - exp_den = exp2; - move16(); - } - L_frac_den = L_sub( L_tmp1, L_tmp2 ); /*Q31*/ + L_tmp1 = L_mult( coeff[0], coeff[2] ); /*Q31*/ + exp1 = add( exp_coeff[0], exp_coeff[2] ); - frac_den = extract_h( L_frac_den ); /* Q15 */ - frac_den = s_max( frac_den, 1 ); /* Q15 */ - L_frac_den = L_max( L_frac_den, 1 ); /* Q31 */ - exp = norm_l( L_frac_den ); - tmp = div_s( shl( 1, sub( 14, exp ) ), frac_den ); /*Q(14-exp)*/ + L_tmp2 = L_mult_sat( coeff[4], coeff[4] ); /*Q31*/ + exp2 = add( exp_coeff[4], exp_coeff[4] ); - L_tmp1 = L_shr( L_mult( coeff[3], coeff[4] ), 2 ); /*Q31*/ - exp1 = add( exp_coeff[3], exp_coeff[4] ); + IF( GT_16( exp1, exp2 ) ) + { + L_tmp2 = L_shr( L_tmp2, sub( exp1, exp2 ) ); /*Q31*/ + exp_den = exp1; + move16(); + } + ELSE + { + L_tmp1 = L_shr( L_tmp1, sub( exp2, exp1 ) ); /*Q31*/ + exp_den = exp2; + move16(); + } + L_frac_den = L_sub( L_tmp1, L_tmp2 ); /*Q31*/ - L_tmp2 = L_shr( L_mult( coeff[1], coeff[2] ), 1 ); /*Q31*/ - exp2 = add( exp_coeff[1], exp_coeff[2] ); + frac_den = extract_h( L_frac_den ); /* Q15 */ + frac_den = s_max( frac_den, 1 ); /* Q15 */ + L_frac_den = L_max( L_frac_den, 1 ); /* Q31 */ + exp = norm_l( L_frac_den ); + tmp = div_s( shl( 1, sub( 14, exp ) ), frac_den ); /*Q(14-exp)*/ - IF( GT_16( exp1, exp2 ) ) - { - L_tmp2 = L_shr( L_tmp2, sub( exp1, exp2 ) ); /*Q31*/ - exp_num = exp1; - move16(); - } - ELSE - { - L_tmp1 = L_shr( L_tmp1, sub( exp2, exp1 ) ); /*Q31*/ - exp_num = exp2; - move16(); - } - L_frac_num = L_sub( L_tmp1, L_tmp2 ); /*Q31*/ - L_div = Mult_32_16( L_frac_num, tmp ); /*Q(30-exp)*/ - exp_div = sub( exp_num, exp_den ); + L_tmp1 = L_mult( coeff[3], coeff[4] ); /*Q31*/ + exp1 = add( exp_coeff[3], exp_coeff[4] ); - *gain_pit = round_fx_o( L_shl_o( L_div, add( exp, exp_div ), &Overflow ), &Overflow ); /*Q14*/ + L_tmp2 = L_mult( coeff[1], coeff[2] ); /*Q31*/ + exp2 = add( exp_coeff[1], exp_coeff[2] ); - L_tmp1 = L_shr( L_mult( coeff[1], coeff[4] ), 2 ); /*Q31*/ - exp1 = add( exp_coeff[1], exp_coeff[4] ); + IF( GT_16( exp1, exp2 ) ) + { + L_tmp2 = L_shr( L_tmp2, sub( exp1, exp2 ) ); /*Q31*/ + exp_num = exp1; + move16(); + } + ELSE + { + L_tmp1 = L_shr( L_tmp1, sub( exp2, exp1 ) ); /*Q31*/ + exp_num = exp2; + move16(); + } + L_frac_num = L_sub_sat( L_tmp2, L_tmp1 ); /*Q31*/ - L_tmp2 = L_shr( L_mult( coeff[0], coeff[3] ), 1 ); /*Q31*/ - exp2 = add( exp_coeff[0], exp_coeff[3] ); + L_div = Mult_32_16( L_frac_num, tmp ); /*Q(30-exp)*/ + exp_div = sub( exp_num, exp_den ); - IF( GT_16( exp1, exp2 ) ) - { - L_tmp2 = L_shr( L_tmp2, sub( exp1, exp2 ) ); /*Q31*/ - exp_num = exp1; - move16(); - } - ELSE - { - L_tmp1 = L_shr( L_tmp1, sub( exp2, exp1 ) ); /*Q31*/ - exp_num = exp2; - move16(); - } - L_frac_num = L_sub( L_tmp1, L_tmp2 ); /*Q31*/ + *gain_pit = round_fx_sat( L_shl_sat( L_div, add( exp, exp_div ) ) ); /*Q14*/ - L_div = Mult_32_16( L_frac_num, tmp ); /*Q(30-exp)*/ - exp_div = sub( exp_num, exp_den ); + L_tmp1 = L_mult_sat( coeff[1], coeff[4] ); /*Q31*/ + exp1 = add( exp_coeff[1], exp_coeff[4] ); - *gain_code = L_shl_o( L_div, sub( add( exp, exp_div ), 14 ), &Overflow ); - move32(); /*Q16*/ + L_tmp2 = L_mult_sat( coeff[0], coeff[3] ); /*Q31*/ + exp2 = add( exp_coeff[0], exp_coeff[3] ); - *gain_pit = s_max( G_PITCH_MIN_TC192_Q14, s_min( *gain_pit, G_PITCH_MAX_TC192_Q14 ) ); + IF( GT_16( exp1, exp2 ) ) + { + L_tmp2 = L_shr( L_tmp2, sub( exp1, exp2 ) ); /*Q31*/ + exp_num = exp1; + move16(); + } + ELSE + { + L_tmp1 = L_shr( L_tmp1, sub( exp2, exp1 ) ); /*Q31*/ + exp_num = exp2; + move16(); + } + L_frac_num = L_sub_sat( L_tmp2, L_tmp1 ); /*Q31*/ - /* set number of bits for two SQs */ - nBits2 = shr( add( nBits, 1 ), 1 ); - nBits = shr( nBits, 1 ); + L_div = Mult_32_16( L_frac_num, tmp ); /*Q(30-exp)*/ + exp_div = sub( exp_num, exp_den ); - /* gain_pit Q */ + *gain_code = L_shl_sat( L_div, s_max( -31, sub( add( exp, exp_div ), 14 ) ) ); + move32(); /*Q16*/ - tmp1 = mult_r( G_PITCH_MAX_MINUS_MIN_TC192_Q13, div_s( 1, sub( shl( 1, nBits ), 1 ) ) ); /*Q13*/ /* set quantization step */ - index = usquant_fx( *gain_pit, gain_pit, G_PITCH_MIN_TC192_Q14, tmp1, shl( 1, nBits ) ); - move16(); - push_indice( hBstr, IND_GAIN_PIT, index, nBits ); + *gain_pit = s_max( G_PITCH_MIN_Q14, s_min( *gain_pit, G_PITCH_MAX_Q14 ) ); - /* gain_code Q */ - /**gain_code /= gcode0;*/ - IF( gcode0 != 0 ) - { - tmp = div_s( 16384, gcode0 ); /*Q15*/ - L_tmp = Mult_32_16( *gain_code, tmp ); /*Q16*/ - *gain_code = L_shr( L_tmp, add( 14, exp_gcode0 ) ); /*Q16*/ - move32(); - } + /*-----------------------------------------------------------------* + * limit the pitch gain searching range (if indicated by clip_gain) + *-----------------------------------------------------------------*/ - index = gain_quant_fx( gain_code, &gain_code16, LG10_G_CODE_MIN_TC192_Q14, LG10_G_CODE_MAX_TC192_Q13, nBits2, &expg ); - push_indice( hBstr, IND_GAIN_CODE, index, nBits2 ); - L_tmp = L_mult( gain_code16, gcode0 ); /*Q0*Q0 -> Q1*/ - *gain_code = L_shl_o( L_tmp, add( add( expg, exp_gcode0 ), 15 ), &Overflow ); /*Q16*/ + test(); + test(); + IF( EQ_16( clip_gain, 1 ) && GT_16( *gain_pit, 15565 /* 0.95 in Q14 */ ) ) + { + *gain_pit = 15565; /* 0.95 in Q14 */ + move16(); } - ELSE + ELSE IF( EQ_16( clip_gain, 2 ) && GT_16( *gain_pit, 10650 /* 0.65 in Q14 */ ) ) { - size = shl( 1, nBits ); + *gain_pit = 10650; /* 0.65 in Q14 */ + move16(); + } - SWITCH( nBits ) - { - case 7: - { - qua_table = gain_qua_mless_7b_fx; // Q14 - if ( EQ_16( clip_gain, 1 ) ) - { - size = sub( size, 30 ); - } - BREAK; - } - case 6: - { - qua_table = gain_qua_mless_6b_fx; // Q14 - if ( element_mode > EVS_MONO ) - { - qua_table = gain_qua_mless_6b_stereo_fx; - } - if ( EQ_16( clip_gain, 1 ) ) - { - size = sub( size, 14 ); - } - BREAK; - } - case 5: - { - qua_table = gain_qua_mless_5b_fx; // Q14 - if ( EQ_16( clip_gain, 1 ) ) - { - size = sub( size, 6 ); - } - BREAK; - } - default: - { - qua_table = gain_qua_mless_6b_fx; // Q14 - if ( EQ_16( clip_gain, 1 ) ) - { - size = sub( size, 14 ); - } - BREAK; - } - } + /*-----------------------------------------------------------------* + * search for the best quantized values + *-----------------------------------------------------------------*/ - /* in case of AVQ inactive, limit the gain_pit to 0.65 */ - test(); - IF( EQ_16( clip_gain, 2 ) && EQ_16( nBits, 6 ) ) - { - size = sub( size, 36 ); - nBits = sub( nBits, 1 ); - } + nBits_pitch = gains_mode[i_subfr >> 6]; + move16(); - /*-----------------------------------------------------------------* - * search for the best quantizer - *-----------------------------------------------------------------*/ - index = Find_Opt_gainQ_fx( coeff, exp_coeff, gain_pit, gain_code, gcode0, exp_gcode0, qua_table, size ); - push_indice( hBstr, IND_GAIN, index, nBits ); + /* set number of bits for two SQs */ + nBits_code = shr( add( nBits_pitch, 1 ), 1 ); + nBits_pitch = shr( nBits_pitch, 1 ); + + /* gain_pit Q */ + /*tmp1 = (G_PITCH_MAX - G_PITCH_MIN) / ((1 << nBits_pitch) - 1);*/ /* set quantization step */ + tmp1 = mult_r( G_PITCH_MAX_Q13, div_s( 1, sub( shl( 1, nBits_pitch ), 1 ) ) ); /*Q13*/ /* set quantization step */ + + index = usquant_fx( *gain_pit, gain_pit, G_PITCH_MIN_Q14, tmp1, shl( 1, nBits_pitch ) ); // Q0 + push_indice( hBstr, IND_GAIN_PIT, index, nBits_pitch ); + + /* gain_code Q */ + /* *gain_code /= gcode0; */ + IF( gcode0 != 0 ) + { + tmp = div_s( 16384, gcode0 ); /*Q15*/ + L_tmp = Mult_32_16( *gain_code, tmp ); /*Q16*/ + *gain_code = L_shr( L_tmp, add( 14, exp_gcode0 ) ); /*Q16*/ + move32(); } + index = gain_quant_fx( gain_code, &gain_code16, LG10_G_CODE_MIN_Q14, LG10_G_CODE_MAX_Q13, nBits_code, &expg ); + push_indice( hBstr, IND_GAIN_CODE, index, nBits_code ); + L_tmp = L_mult( gain_code16, gcode0 ); /*Q0*Q0 -> Q1*/ + *gain_code = L_shl_sat( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); + move32(); /*Q16*/ + /* *norm_gain_code = *gain_code / *gain_inov; */ exp = sub( norm_s( *gain_inov ), 1 ); exp = s_max( exp, 0 ); @@ -852,1599 +810,421 @@ void gain_enc_mless_ivas_fx( return; } -/*---------------------------------------------------------------------* - * gain_enc_SQ() + +/*-------------------------------------------------------------------* + * gain_enc_gaus() * - * Scalar Quantization of pitch and codebook gains without prediction - * - an initial predicted gain, gcode0, is first determined based on - * the predicted scaled innovation energy - * - a correction factor gamma = g_code / gcode0 is then vector quantized - * along with gain_pit - * - the mean-squared weighted error criterion is used for codebook search - *---------------------------------------------------------------------*/ + * Quantization of gain for Gaussian codebook + *-------------------------------------------------------------------*/ -void gain_enc_SQ_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 gains_mode[], /* i : gain bits Q0*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 *xn, /* i : target vector Q_xn*/ - const Word16 *yy1, /* i : zero-memory filtered adaptive excitation Q_xn*/ - const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ - const Word16 *code, /* i : algebraic excitation Q9*/ - const Word16 Es_pred, /* i : predicted scaled innovation energy Q8*/ - Word16 *gain_pit, /* o : quantized pitch gain Q14*/ - Word32 *gain_code, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ - Word16 *g_corr, /* i/o: correlations , ,, -2 and 2 Qx*/ - const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ - const Word16 Q_xn /* i : xn and y1 scaling */ +/* o : Return index of quantization */ +Word16 gain_enc_gaus_fx( + Word32 *gain, /* i/o: Code gain to quantize Q16*/ + const Word16 bits, /* i : number of bits to quantize Q0*/ + const Word16 lowBound, /* i : lower bound of quantizer (dB) Q8*/ + const Word16 stepSize, /* i : Step size choice Q14*/ + const Word16 inv_stepSize /* i : Step size choice Q15*/ ) { - Word16 index, nBits_pitch, nBits_code; - Word16 gcode0, Ei, gain_code16; - Word16 coeff[5], exp_coeff[5]; - Word16 exp, exp_code, exp_inov, exp_gcode0, frac, tmp; - - Word32 L_tmp, L_tmp1, L_tmp2; - Word16 tmp1, expg; - Word16 exp1, exp2; - Word16 exp_num, exp_den, exp_div, frac_den; - Word32 L_frac_num, L_frac_den, L_div; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + Word16 index, exp_gain, frac_gain, wtmp; + Word16 enr_q, wenr; + Word32 Ltmp, enr; - /*-----------------------------------------------------------------* - * calculate the rest of the correlation coefficients - * c2 = , c3 = -2, c4 = 2 - *-----------------------------------------------------------------*/ - /*g_corr[1] *= -0.5;*/ - /*g_corr[2] = dotp( y2, y2, L_SUBFR ) + 0.01f;*/ - /*g_corr[3] = dotp( xn, y2, L_SUBFR ) - 0.02f;*/ - /*g_corr[4] = dotp( yy1, y2, L_SUBFR ) + 0.02f;*/ + /*enr = 20.0 * log10(*gain + 0.001) codebook gain in dB */ + exp_gain = norm_l( *gain ); + frac_gain = Log2_norm_lc( L_shl( *gain, exp_gain ) ); + exp_gain = sub( 30 - 16, exp_gain ); - coeff[0] = g_corr[0]; - move16(); - exp_coeff[0] = g_corr[1]; - move16(); - coeff[1] = g_corr[2]; - move16(); /* coeff[1] = xn yy1 */ - exp_coeff[1] = g_corr[3]; - move16(); + enr = Mpy_32_16( exp_gain, frac_gain, LG10 ); /* Output in Q13 */ + wenr = extract_h( L_shl( enr, 8 + 3 ) ); - /* Compute scalar product */ - coeff[2] = extract_h( Dot_product12( y2, y2, L_SUBFR, &exp ) ); - move16(); - exp_coeff[2] = add( sub( exp, 18 ), shl( Q_xn, 1 ) ); - move16(); /* -18 (y2 Q9) */ + /*----------------------------------------------------------------* + * Quantize linearly the log E + *----------------------------------------------------------------*/ - /* Compute scalar product */ - coeff[3] = extract_h( Dot_product12( xn, y2, L_SUBFR, &exp ) ); - move16(); - exp_coeff[3] = add( sub( exp, 9 ), Q_xn ); - move16(); /* -9 (y2 Q9), (xn y2) */ + wtmp = sub( wenr, lowBound ); /* Q8 */ - /* Compute scalar product */ - coeff[4] = extract_h( Dot_product12( yy1, y2, L_SUBFR, &exp ) ); - move16(); - exp_coeff[4] = add( sub( exp, 9 ), Q_xn ); - move16(); /* -9 (y2 Q9), (y1 y2) */ + index = extract_l( L_shr( L_mac( 8388608, wtmp, inv_stepSize ), 16 + 8 ) ); // Q0 - /*-----------------------------------------------------------------* - * calculate the unscaled innovation energy - * calculate the predicted gain code - * calculate optimal gains - *-----------------------------------------------------------------*/ - /*Ecode = (dotp( code, code, L_SUBFR) + 0.01f) / L_SUBFR;*/ - /**gain_inov = 1.0f / (float)sqrt( Ecode );*/ + /* index [0 (1< Q26 */ + enr = L_shr( enr, 10 ); /*Q26->Q16*/ + frac_gain = L_Extract_lc( enr, &exp_gain ); + + Ltmp = Pow2( 14, frac_gain ); /* Put 14 as exponent */ + exp_gain = sub( exp_gain, 14 ); /* Retreive exponent of wtmp */ + *gain = L_shl_sat( Ltmp, add( 16, exp_gain ) ); + move32(); /*Q16*/ + + return index; +} + + +/*-----------------------------------------------------------------* + * gain_enc_tc() + * + * Search and quantization of gain_code for subframes (in the + * beginning of frame) without pulses in TC - 3b coding. + * In this case: + * - gain_pit = 0 + * - gain_code - scalar quantization (no prediciton history used) + *-----------------------------------------------------------------*/ + +void gain_enc_tc_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 gains_mode[], /* i : gain bits Q0*/ + const Word16 i_subfr, /* i : subframe index Q0*/ + const Word16 xn_fx[], /* i : target vector Q_xn*/ + const Word16 y2_fx[], /* i : zero-memory filtered algebraic codebook excitation Q_xn*/ + const Word16 code_fx[], /* i : algebraic excitation Q9*/ + const Word16 Es_pred_fx, /* i : predicted scaled innovation energy Q8*/ + Word16 *gain_pit_fx, /* o : Pitch gain / Quantized pitch gain Q14*/ + Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ + Word16 *gain_inov_fx, /* o : innovation gain Q12*/ + Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ + const Word16 Q_xn /* i : xn and y1 scaling */ +) +{ + Word16 i, index = 0, nBits, num, den, exp_num, exp_den; + Word16 Ei_fx, g_code_fx, gcode0_fx; + Word16 expg, expg2, e_tmp, f_tmp, exp_gcode0, tmp_fx, frac, tmp16; + Word32 L_tmp, L_tmp1; + Word16 wgain_code = 0, gain_code16; + *gain_pit_fx = 0; + move16(); + move16(); + move16(); - /*Ei = 10 * log10((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ /*----------------------------------------------------------------* - * calculate the predicted gain code + * get number of bits for gain quantization *----------------------------------------------------------------*/ - tmp = norm_l( L_tmp ); - frac = Log2_norm_lc( L_shl( L_tmp, tmp ) ); - tmp = add( 30 - 18 - 6 - 1, sub( exp_code, tmp ) ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ - L_tmp1 = Mpy_32_16( tmp, frac, 12330 ); /* Q13 */ - Ei = round_fx( L_shl( L_tmp1, 11 ) ); /* Q8 */ - - /* predicted codebook gain */ - gcode0 = sub( Es_pred, Ei ); /* Q8 */ - /*---------------------------------------------------------------* - * Decode codebook gain and the adaptive excitation low-pass - * filtering factor (Finalize computation ) - *---------------------------------------------------------------*/ - /* gain_inov = 1.0f / sqrt((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ - L_tmp = Isqrt_lc( L_tmp, &exp_inov ); - *gain_inov = extract_h( L_shl( L_tmp, sub( exp_inov, 3 ) ) ); /* gain_inov in Q12 */ + nBits = gains_mode[shr( i_subfr, 6 )]; - /* gcode0 = pow(10, 0.05 * (Es_pred - Ei)) */ /*----------------------------------------------------------------* - * gcode0 = pow(10.0, gcode0/20) - * = pow(2, 3.321928*gcode0/20) - * = pow(2, 0.166096*gcode0) + * find the code pitch (for current subframe) *----------------------------------------------------------------*/ - L_tmp = L_mult( gcode0, 21771 ); /* *0.166096 in Q17 -> Q26 */ - L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ + /**gain_code = dotp( xn, y2, L_SUBFR )/( dotp( y2, y2, L_SUBFR ) + 0.01f );*/ + /* Compute scalar product */ + L_tmp = Dot_product( y2_fx, y2_fx, L_SUBFR ); /* -18 (y2 Q9) */ + exp_den = norm_l( L_tmp ); + den = extract_h( L_shl( L_tmp, exp_den ) ); + exp_den = sub( add( exp_den, 18 ), shl( Q_xn, 1 ) ); - gcode0 = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); + /* Compute scalar product */ + L_tmp1 = Dot_product( xn_fx, y2_fx, L_SUBFR ); /* -9 (y2 Q9) */ + exp_num = sub( norm_l( L_tmp1 ), 1 ); + num = extract_h( L_shl( L_tmp1, exp_num ) ); + exp_num = sub( add( exp_num, 8 ), Q_xn ); + tmp16 = s_or( shr( num, 16 ), 1 ); /* extract sign if num < 0 tmp16 = -1 else tmp16 = 1 */ + num = abs_s( num ); - /*tmp1 = (g_corr[0]*g_corr[2]) - (g_corr[4]*g_corr[4]); - tmp2 = g_corr[1]/tmp1; - tmp1 = g_corr[3]/tmp1; + /*----------------------------------------------------------------* + * compute gain = xy/yy + *----------------------------------------------------------------*/ - *gain_pit = (g_corr[2]*tmp2) - (g_corr[4]*tmp1); - *gain_code = (g_corr[0]*tmp1) - (g_corr[4]*tmp2);*/ + g_code_fx = div_s( num, den ); - /* *gain_pit = (g_corr[2]*tmp2) - (g_corr[4]*tmp3); - = ((g_corr[1]*g_corr[2]) - (g_corr[3]*g_corr[4]))/tmp1;*/ + i = sub( exp_num, exp_den ); /* Gain_trans in Q7 */ + g_code_fx = i_mult2( g_code_fx, tmp16 ); /* apply sign */ + *gain_code_fx = L_shr_sat( L_deposit_l( g_code_fx ), i ); + move32(); - /* *gain_code = (g_corr[0]*tmp3) - (g_corr[4]*tmp2); - = ((g_corr[3]*g_corr[0]) - (g_corr[1]*g_corr[4]))/tmp1;*/ + /*----------------------------------------------------------------* + * calculate the predicted gain code + * decode codebook gain + *----------------------------------------------------------------*/ - L_tmp1 = L_mult( coeff[0], coeff[2] ); /*Q31*/ - exp1 = add( exp_coeff[0], exp_coeff[2] ); + *gain_pit_fx = 0; + move16(); - L_tmp2 = L_mult_o( coeff[4], coeff[4], &Overflow ); /*Q31*/ - exp2 = add( exp_coeff[4], exp_coeff[4] ); + /*Ecode = (dotp( code, code, L_SUBFR) + 0.01f) / L_SUBFR; + *gain_inov = 1.0f / (float)sqrt( Ecode );*/ - IF( GT_16( exp1, exp2 ) ) - { - L_tmp2 = L_shr( L_tmp2, sub( exp1, exp2 ) ); /*Q31*/ - exp_den = exp1; - move16(); - } - ELSE - { - L_tmp1 = L_shr( L_tmp1, sub( exp2, exp1 ) ); /*Q31*/ - exp_den = exp2; - move16(); - } - L_frac_den = L_sub( L_tmp1, L_tmp2 ); /*Q31*/ + L_tmp = Dot_product12( code_fx, code_fx, L_SUBFR, &expg ); + expg = sub( expg, 18 + 6 ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ + expg2 = expg; + move16(); + L_tmp1 = L_tmp; /* sets to 'L_tmp' in 1 clock */ + move32(); + L_tmp = Isqrt_lc( L_tmp, &expg ); - frac_den = extract_h( L_frac_den ); /* Q15 */ - frac_den = s_max( frac_den, 1 ); /* Q15 */ - L_frac_den = L_max( L_frac_den, 1 ); /* Q31 */ - exp = norm_l( L_frac_den ); - tmp = div_s( shl( 1, sub( 14, exp ) ), frac_den ); /*Q(14-exp)*/ + *gain_inov_fx = extract_h( L_shl( L_tmp, sub( expg, 3 ) ) ); + move16(); /* gain_inov in Q12 */ + /*Ei = 10 * (float)log10( Ecode );*/ + e_tmp = norm_l( L_tmp1 ); + f_tmp = Log2_norm_lc( L_shl( L_tmp1, e_tmp ) ); + e_tmp = sub( expg2, add( 1, e_tmp ) ); + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 12330 ); /* Q13 */ /* 10*log10(2) in Q12*/ + Ei_fx = round_fx( L_shl( L_tmp1, 11 ) ); /* Q8 */ + /*gcode0 = (float) pow(10, 0.05 * (Es_pred - Ei));*/ + gcode0_fx = sub( Es_pred_fx, Ei_fx ); /* Q8 */ + /*-----------------------------------------------------------------* + * gcode0 = pow(10.0, gcode0/20) + * = pow(2, 3.321928*gcode0/20) + * = pow(2, 0.166096*gcode0) + *-----------------------------------------------------------------*/ + L_tmp = L_mult( gcode0_fx, 21771 ); /* *0.166096 in Q17 -> Q26 */ + L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ + frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ + gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ + exp_gcode0 = sub( exp_gcode0, 14 ); + IF( GT_16( nBits, 3 ) ) + { + /*g_code = *gain_code / gcode0;*/ + IF( gcode0_fx != 0 ) + { + tmp16 = div_s( 16384, gcode0_fx ); /*Q15*/ + L_tmp = Mult_32_16( *gain_code_fx, tmp16 ); /*Q16*/ + *gain_code_fx = L_shr( L_tmp, add( 14, exp_gcode0 ) ); /*Q16*/ + move32(); + } + ELSE + { + *gain_code_fx = MAX_32; + move32(); + } - L_tmp1 = L_mult( coeff[3], coeff[4] ); /*Q31*/ - exp1 = add( exp_coeff[3], exp_coeff[4] ); + /*index = gain_quant( &g_code, G_CODE_MIN, G_CODE_MAX, nBits );*/ + index = gain_quant_fx( gain_code_fx, &gain_code16, LG10_G_CODE_MIN_TC_Q14, LG10_G_CODE_MAX_TC_Q13, nBits, &expg ); - L_tmp2 = L_mult( coeff[1], coeff[2] ); /*Q31*/ - exp2 = add( exp_coeff[1], exp_coeff[2] ); + /**gain_code = g_code * gcode0;*/ + L_tmp = L_mult( gain_code16, gcode0_fx ); /*Q0*Q0 -> Q1*/ + *gain_code_fx = L_shl( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); /*Q16*/ + move32(); - IF( GT_16( exp1, exp2 ) ) - { - L_tmp2 = L_shr( L_tmp2, sub( exp1, exp2 ) ); /*Q31*/ - exp_num = exp1; - move16(); + push_indice( hBstr, IND_GAIN_CODE, index, nBits ); } ELSE { - L_tmp1 = L_shr( L_tmp1, sub( exp2, exp1 ) ); /*Q31*/ - exp_num = exp2; + index = N_GAIN_CODE_TC - 1; move16(); - } - L_frac_num = L_sub_o( L_tmp2, L_tmp1, &Overflow ); /*Q31*/ - - L_div = Mult_32_16( L_frac_num, tmp ); /*Q(30-exp)*/ - exp_div = sub( exp_num, exp_den ); - - *gain_pit = round_fx_o( L_shl_o( L_div, add( exp, exp_div ), &Overflow ), &Overflow ); /*Q14*/ + FOR( i = 0; i < N_GAIN_CODE_TC - 1; i++ ) + { + L_tmp = L_mult( tbl_gain_code_tc_quant_mean[i], gcode0_fx ); /* Q13*Q0 -> Q14 */ + L_tmp = L_shl( L_tmp, add( exp_gcode0, 2 ) ); /* Q14 -> Q16 */ - L_tmp1 = L_mult( coeff[1], coeff[4] ); /*Q31*/ - exp1 = add( exp_coeff[1], exp_coeff[4] ); + IF( LT_32( *gain_code_fx, L_tmp ) ) + { + index = i; + move16(); + BREAK; + } + } - L_tmp2 = L_mult( coeff[0], coeff[3] ); /*Q31*/ - exp2 = add( exp_coeff[0], exp_coeff[3] ); + /*----------------------------------------------------------------* + * 3-bit -> 2-bit encoding + *----------------------------------------------------------------*/ - IF( GT_16( exp1, exp2 ) ) - { - L_tmp2 = L_shr( L_tmp2, sub( exp1, exp2 ) ); /*Q31*/ - exp_num = exp1; - move16(); - } - ELSE - { - L_tmp1 = L_shr( L_tmp1, sub( exp2, exp1 ) ); /*Q31*/ - exp_num = exp2; - move16(); + IF( EQ_16( nBits, 2 ) ) + { + /* 2-bit -> 3-bit decoding */ + index = shr( index, 1 ); + wgain_code = tbl_gain_code_tc_fx[shl( index, 1 )]; + move16(); + /**gain_code *= gcode0;*/ + L_tmp = L_mult( wgain_code, gcode0_fx ); /* Q13*Q0 -> Q14 */ + *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 2 ) ); + move32(); /* Q14 -> Q16 */ + push_indice( hBstr, IND_GAIN_CODE, index, nBits ); + } + ELSE /* nBits == 3 */ + { + wgain_code = tbl_gain_code_tc_fx[index]; + move16(); + /**gain_code *= gcode0;*/ + L_tmp = L_mult( wgain_code, gcode0_fx ); /* Q13*Q0 -> Q14 */ + *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 2 ) ); + move32(); /* Q14 -> Q16 */ + push_indice( hBstr, IND_GAIN_CODE, index, nBits ); + } } - L_frac_num = L_sub_o( L_tmp2, L_tmp1, &Overflow ); /*Q31*/ - L_div = Mult_32_16( L_frac_num, tmp ); /*Q(30-exp)*/ - exp_div = sub( exp_num, exp_den ); + /*-----------------------------------------------------------------* + * decode normalized codebook gain + *-----------------------------------------------------------------*/ - *gain_code = L_shl_sat( L_div, s_max( -31, sub( add( exp, exp_div ), 14 ) ) ); - move32(); /*Q16*/ - - *gain_pit = s_max( G_PITCH_MIN_Q14, s_min( *gain_pit, G_PITCH_MAX_Q14 ) ); - - /*-----------------------------------------------------------------* - * limit the pitch gain searching range (if indicated by clip_gain) - *-----------------------------------------------------------------*/ - - test(); - test(); - IF( EQ_16( clip_gain, 1 ) && GT_16( *gain_pit, 15565 /* 0.95 in Q14 */ ) ) - { - *gain_pit = 15565; /* 0.95 in Q14 */ - move16(); - } - ELSE IF( EQ_16( clip_gain, 2 ) && GT_16( *gain_pit, 10650 /* 0.65 in Q14 */ ) ) - { - *gain_pit = 10650; /* 0.65 in Q14 */ - move16(); - } - - /*-----------------------------------------------------------------* - * search for the best quantized values - *-----------------------------------------------------------------*/ - - nBits_pitch = gains_mode[i_subfr >> 6]; - move16(); - - /* set number of bits for two SQs */ - nBits_code = shr( add( nBits_pitch, 1 ), 1 ); - nBits_pitch = shr( nBits_pitch, 1 ); - - /* gain_pit Q */ - /*tmp1 = (G_PITCH_MAX - G_PITCH_MIN) / ((1 << nBits_pitch) - 1);*/ /* set quantization step */ - tmp1 = mult_r( G_PITCH_MAX_Q13, div_s( 1, sub( shl( 1, nBits_pitch ), 1 ) ) ); /*Q13*/ /* set quantization step */ - - index = usquant_fx( *gain_pit, gain_pit, G_PITCH_MIN_Q14, tmp1, shl( 1, nBits_pitch ) ); // Q0 - push_indice_fx( hBstr, IND_GAIN_PIT, index, nBits_pitch ); - - /* gain_code Q */ - /* *gain_code /= gcode0; */ - IF( gcode0 != 0 ) - { - tmp = div_s( 16384, gcode0 ); /*Q15*/ - L_tmp = Mult_32_16( *gain_code, tmp ); /*Q16*/ - *gain_code = L_shr( L_tmp, add( 14, exp_gcode0 ) ); /*Q16*/ - move32(); - } - - index = gain_quant_fx( gain_code, &gain_code16, LG10_G_CODE_MIN_Q14, LG10_G_CODE_MAX_Q13, nBits_code, &expg ); - push_indice_fx( hBstr, IND_GAIN_CODE, index, nBits_code ); - L_tmp = L_mult( gain_code16, gcode0 ); /*Q0*Q0 -> Q1*/ - *gain_code = L_shl_sat( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); - move32(); /*Q16*/ - - /* *norm_gain_code = *gain_code / *gain_inov; */ - exp = sub( norm_s( *gain_inov ), 1 ); - exp = s_max( exp, 0 ); + /**norm_gain_code = *gain_code / *gain_inov;*/ + expg = sub( norm_s( *gain_inov_fx ), 1 ); + expg = s_max( expg, 0 ); - tmp = div_s( shr( 8192, exp ), *gain_inov ); - *norm_gain_code = L_shr( Mult_32_16( *gain_code, tmp ), sub( 1, exp ) ); // Q16 + tmp_fx = div_s( shr( 8192, expg ), *gain_inov_fx ); + *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); // Q16 move32(); return; } -void gain_enc_SQ_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 gains_mode[], /* i : gain bits Q0*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 *xn, /* i : target vector Q_xn*/ - const Word16 *yy1, /* i : zero-memory filtered adaptive excitation Q_xn*/ - const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ - const Word16 *code, /* i : algebraic excitation Q9*/ - const Word16 Es_pred, /* i : predicted scaled innovation energy Q8*/ - Word16 *gain_pit, /* o : quantized pitch gain Q14*/ - Word32 *gain_code, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ - Word16 *g_corr, /* i/o: correlations , ,, -2 and 2 Qx*/ - const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ - const Word16 Q_xn /* i : xn and y1 scaling */ -) -{ - Word16 index, nBits_pitch, nBits_code; - Word16 gcode0, Ei, gain_code16; - Word16 coeff[5], exp_coeff[5]; - Word16 exp, exp_code, exp_inov, exp_gcode0, frac, tmp; - - Word32 L_tmp, L_tmp1, L_tmp2; - Word16 tmp1, expg; - Word16 exp1, exp2; - Word16 exp_num, exp_den, exp_div, frac_den; - Word32 L_frac_num, L_frac_den, L_div; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - /*-----------------------------------------------------------------* - * calculate the rest of the correlation coefficients - * c2 = , c3 = -2, c4 = 2 - *-----------------------------------------------------------------*/ - /*g_corr[1] *= -0.5;*/ - /*g_corr[2] = dotp( y2, y2, L_SUBFR ) + 0.01f;*/ - /*g_corr[3] = dotp( xn, y2, L_SUBFR ) - 0.02f;*/ - /*g_corr[4] = dotp( yy1, y2, L_SUBFR ) + 0.02f;*/ - - coeff[0] = g_corr[0]; - move16(); - exp_coeff[0] = g_corr[1]; - move16(); - coeff[1] = g_corr[2]; - move16(); /* coeff[1] = xn yy1 */ - exp_coeff[1] = g_corr[3]; - move16(); - - /* Compute scalar product */ - coeff[2] = extract_h( Dot_product12( y2, y2, L_SUBFR, &exp ) ); - move16(); - exp_coeff[2] = add( sub( exp, 18 ), shl( Q_xn, 1 ) ); - move16(); /* -18 (y2 Q9) */ - - /* Compute scalar product */ - coeff[3] = extract_h( Dot_product12( xn, y2, L_SUBFR, &exp ) ); - move16(); - exp_coeff[3] = add( sub( exp, 9 ), Q_xn ); - move16(); /* -9 (y2 Q9), (xn y2) */ - - /* Compute scalar product */ - coeff[4] = extract_h( Dot_product12( yy1, y2, L_SUBFR, &exp ) ); - move16(); - exp_coeff[4] = add( sub( exp, 9 ), Q_xn ); - move16(); /* -9 (y2 Q9), (y1 y2) */ - - /*-----------------------------------------------------------------* - * calculate the unscaled innovation energy - * calculate the predicted gain code - * calculate optimal gains - *-----------------------------------------------------------------*/ - /*Ecode = (dotp( code, code, L_SUBFR) + 0.01f) / L_SUBFR;*/ - /**gain_inov = 1.0f / (float)sqrt( Ecode );*/ - - L_tmp = Dot_product12( code, code, L_SUBFR, &exp_code ); - exp_inov = sub( exp_code, 18 + 6 ); - exp_code = sub( exp_code, 30 ); - - /*Ei = 10 * log10((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ - /*----------------------------------------------------------------* - * calculate the predicted gain code - *----------------------------------------------------------------*/ - tmp = norm_l( L_tmp ); - frac = Log2_norm_lc( L_shl( L_tmp, tmp ) ); - tmp = add( 30 - 18 - 6 - 1, sub( exp_code, tmp ) ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ - L_tmp1 = Mpy_32_16( tmp, frac, 12330 ); /* Q13 */ - Ei = round_fx( L_shl( L_tmp1, 11 ) ); /* Q8 */ - /* predicted codebook gain */ - gcode0 = sub( Es_pred, Ei ); /* Q8 */ +/*-----------------------------------------------------------------* + * Find_Opt_gainQ_fx() + * + * Find the best quantizer + *-----------------------------------------------------------------*/ - /*---------------------------------------------------------------* - * Decode codebook gain and the adaptive excitation low-pass - * filtering factor (Finalize computation ) - *---------------------------------------------------------------*/ - /* gain_inov = 1.0f / sqrt((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ - L_tmp = Isqrt_lc( L_tmp, &exp_inov ); - *gain_inov = extract_h( L_shl( L_tmp, sub( exp_inov, 3 ) ) ); /* gain_inov in Q12 */ +static Word16 Find_Opt_gainQ_fx( + Word16 *coeff, /* exp(exp_coeff) */ + Word16 *exp_coeff, + Word16 *gain_pit, /* Q14 */ + Word32 *gain_code, /* Q16 */ + Word16 gcode0, /* exp(exp_gcode0) */ + Word16 exp_gcode0, + const Word16 *cdbk, /* i : Codebook used Q14*/ + const Word16 size /* i : size of Codebook used Q0*/ +) +{ + Word16 index, i, j; + const Word16 *p; + Word16 g_pitch, g2_pitch, g_code, g_pit_cod, g2_code, g2_code_lo; + Word32 dist_min; + Word16 coeff_lo[5]; + Word16 exp_max[5]; + Word16 exp_code, e_max; + Word32 L_tmp, L_tmp1; - /* gcode0 = pow(10, 0.05 * (Es_pred - Ei)) */ /*----------------------------------------------------------------* - * gcode0 = pow(10.0, gcode0/20) - * = pow(2, 3.321928*gcode0/20) - * = pow(2, 0.166096*gcode0) - *----------------------------------------------------------------*/ - - L_tmp = L_mult( gcode0, 21771 ); /* *0.166096 in Q17 -> Q26 */ - L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0 = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - - /*tmp1 = (g_corr[0]*g_corr[2]) - (g_corr[4]*g_corr[4]); - tmp2 = g_corr[1]/tmp1; - tmp1 = g_corr[3]/tmp1; - - *gain_pit = (g_corr[2]*tmp2) - (g_corr[4]*tmp1); - *gain_code = (g_corr[0]*tmp1) - (g_corr[4]*tmp2);*/ - - /* *gain_pit = (g_corr[2]*tmp2) - (g_corr[4]*tmp3); - = ((g_corr[1]*g_corr[2]) - (g_corr[3]*g_corr[4]))/tmp1;*/ - - /* *gain_code = (g_corr[0]*tmp3) - (g_corr[4]*tmp2); - = ((g_corr[3]*g_corr[0]) - (g_corr[1]*g_corr[4]))/tmp1;*/ - - L_tmp1 = L_mult( coeff[0], coeff[2] ); /*Q31*/ - exp1 = add( exp_coeff[0], exp_coeff[2] ); - - L_tmp2 = L_mult_o( coeff[4], coeff[4], &Overflow ); /*Q31*/ - exp2 = add( exp_coeff[4], exp_coeff[4] ); - - IF( GT_16( exp1, exp2 ) ) - { - L_tmp2 = L_shr( L_tmp2, sub( exp1, exp2 ) ); /*Q31*/ - exp_den = exp1; - move16(); - } - ELSE - { - L_tmp1 = L_shr( L_tmp1, sub( exp2, exp1 ) ); /*Q31*/ - exp_den = exp2; - move16(); - } - L_frac_den = L_sub( L_tmp1, L_tmp2 ); /*Q31*/ - - frac_den = extract_h( L_frac_den ); /* Q15 */ - frac_den = s_max( frac_den, 1 ); /* Q15 */ - L_frac_den = L_max( L_frac_den, 1 ); /* Q31 */ - exp = norm_l( L_frac_den ); - tmp = div_s( shl( 1, sub( 14, exp ) ), frac_den ); /*Q(14-exp)*/ - - - L_tmp1 = L_mult( coeff[3], coeff[4] ); /*Q31*/ - exp1 = add( exp_coeff[3], exp_coeff[4] ); - - L_tmp2 = L_mult( coeff[1], coeff[2] ); /*Q31*/ - exp2 = add( exp_coeff[1], exp_coeff[2] ); - - IF( GT_16( exp1, exp2 ) ) - { - L_tmp2 = L_shr( L_tmp2, sub( exp1, exp2 ) ); /*Q31*/ - exp_num = exp1; - move16(); - } - ELSE - { - L_tmp1 = L_shr( L_tmp1, sub( exp2, exp1 ) ); /*Q31*/ - exp_num = exp2; - move16(); - } - L_frac_num = L_sub_o( L_tmp2, L_tmp1, &Overflow ); /*Q31*/ - - L_div = Mult_32_16( L_frac_num, tmp ); /*Q(30-exp)*/ - exp_div = sub( exp_num, exp_den ); - - *gain_pit = round_fx_o( L_shl_o( L_div, add( exp, exp_div ), &Overflow ), &Overflow ); /*Q14*/ - move16(); - - // To be checked - L_tmp1 = L_mult_o( coeff[1], coeff[4], &Overflow ); /*Q31*/ - exp1 = add( exp_coeff[1], exp_coeff[4] ); - - L_tmp2 = L_mult( coeff[0], coeff[3] ); /*Q31*/ - exp2 = add( exp_coeff[0], exp_coeff[3] ); - - IF( GT_16( exp1, exp2 ) ) - { - L_tmp2 = L_shr( L_tmp2, sub( exp1, exp2 ) ); /*Q31*/ - exp_num = exp1; - move16(); - } - ELSE - { - L_tmp1 = L_shr( L_tmp1, sub( exp2, exp1 ) ); /*Q31*/ - exp_num = exp2; - move16(); - } - L_frac_num = L_sub_o( L_tmp2, L_tmp1, &Overflow ); /*Q31*/ - - L_div = Mult_32_16( L_frac_num, tmp ); /*Q(30-exp)*/ - exp_div = sub( exp_num, exp_den ); - - *gain_code = L_shl_sat( L_div, s_max( -31, sub( add( exp, exp_div ), 14 ) ) ); - move32(); /*Q16*/ - - *gain_pit = s_max( G_PITCH_MIN_Q14, s_min( *gain_pit, G_PITCH_MAX_Q14 ) ); - - /*-----------------------------------------------------------------* - * limit the pitch gain searching range (if indicated by clip_gain) - *-----------------------------------------------------------------*/ - - test(); - test(); - IF( EQ_16( clip_gain, 1 ) && GT_16( *gain_pit, 15565 /* 0.95 in Q14 */ ) ) - { - *gain_pit = 15565; /* 0.95 in Q14 */ - move16(); - } - ELSE IF( EQ_16( clip_gain, 2 ) && GT_16( *gain_pit, 10650 /* 0.65 in Q14 */ ) ) - { - *gain_pit = 10650; /* 0.65 in Q14 */ - move16(); - } - - /*-----------------------------------------------------------------* - * search for the best quantized values - *-----------------------------------------------------------------*/ - - nBits_pitch = gains_mode[i_subfr >> 6]; - move16(); - - /* set number of bits for two SQs */ - nBits_code = shr( add( nBits_pitch, 1 ), 1 ); - nBits_pitch = shr( nBits_pitch, 1 ); - - /* gain_pit Q */ - /*tmp1 = (G_PITCH_MAX - G_PITCH_MIN) / ((1 << nBits_pitch) - 1);*/ /* set quantization step */ - tmp1 = mult_r( G_PITCH_MAX_Q13, div_s( 1, sub( shl( 1, nBits_pitch ), 1 ) ) ); /*Q13*/ /* set quantization step */ - - index = usquant_fx( *gain_pit, gain_pit, G_PITCH_MIN_Q14, tmp1, shl( 1, nBits_pitch ) ); - push_indice( hBstr, IND_GAIN_PIT, index, nBits_pitch ); - - /* gain_code Q */ - /* *gain_code /= gcode0; */ - IF( gcode0 != 0 ) - { - tmp = div_s( 16384, gcode0 ); /*Q15*/ - L_tmp = Mult_32_16( *gain_code, tmp ); /*Q16*/ - *gain_code = L_shr( L_tmp, add( 14, exp_gcode0 ) ); /*Q16*/ - move32(); - } - - index = gain_quant_fx( gain_code, &gain_code16, LG10_G_CODE_MIN_Q14, LG10_G_CODE_MAX_Q13, nBits_code, &expg ); - push_indice( hBstr, IND_GAIN_CODE, index, nBits_code ); - L_tmp = L_mult( gain_code16, gcode0 ); /*Q0*Q0 -> Q1*/ - *gain_code = L_shl_sat( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); - move32(); /*Q16*/ - - /* *norm_gain_code = *gain_code / *gain_inov; */ - exp = sub( norm_s( *gain_inov ), 1 ); - exp = s_max( exp, 0 ); - - tmp = div_s( shr( 8192, exp ), *gain_inov ); - *norm_gain_code = L_shr( Mult_32_16( *gain_code, tmp ), sub( 1, exp ) ); // Q16 - move32(); - - return; -} - -/*-------------------------------------------------------------------* - * gain_enc_gaus() - * - * Quantization of gain for Gaussian codebook - *-------------------------------------------------------------------*/ -Word16 gain_enc_gaus_fx( /* o : Return index of quantization */ - Word32 *gain, /* i/o: Code gain to quantize Q16*/ - const Word16 bits, /* i : number of bits to quantize Q0*/ - const Word16 lowBound, /* i : lower bound of quantizer (dB) Q8*/ - const Word16 stepSize, /* i : Step size choice Q14*/ - const Word16 inv_stepSize /* i : Step size choice Q15*/ -) -{ - Word16 index, exp_gain, frac_gain, wtmp; - Word16 enr_q, wenr; - Word32 Ltmp, enr; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - /*enr = 20.0 * log10(*gain + 0.001) codebook gain in dB */ - exp_gain = norm_l( *gain ); - frac_gain = Log2_norm_lc( L_shl( *gain, exp_gain ) ); - exp_gain = sub( 30 - 16, exp_gain ); - - enr = Mpy_32_16( exp_gain, frac_gain, LG10 ); /* Output in Q13 */ - wenr = extract_h( L_shl( enr, 8 + 3 ) ); - - /*----------------------------------------------------------------* - * Quantize linearly the log E - *----------------------------------------------------------------*/ - - wtmp = sub( wenr, lowBound ); /* Q8 */ - - index = extract_l( L_shr( L_mac( 8388608, wtmp, inv_stepSize ), 16 + 8 ) ); // Q0 - - /* index [0 (1< Q26 */ - enr = L_shr( enr, 10 ); /*Q26->Q16*/ - frac_gain = L_Extract_lc( enr, &exp_gain ); - - Ltmp = Pow2( 14, frac_gain ); /* Put 14 as exponent */ - exp_gain = sub( exp_gain, 14 ); /* Retreive exponent of wtmp */ - *gain = L_shl_o( Ltmp, add( 16, exp_gain ), &Overflow ); - move32(); /*Q16*/ - - return index; -} -/*-----------------------------------------------------------------* - * gain_enc_tc() - * - * Search and quantization of gain_code for subframes (in the - * beginning of frame) without pulses in TC - 3b coding. - * In this case: - * - gain_pit = 0 - * - gain_code - scalar quantization (no prediciton history used) - *-----------------------------------------------------------------*/ -void gain_enc_tc_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 gains_mode[], /* i : gain bits Q0*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 xn_fx[], /* i : target vector Q_xn*/ - const Word16 y2_fx[], /* i : zero-memory filtered algebraic codebook excitation Q_xn*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 Es_pred_fx, /* i : predicted scaled innovation energy Q8*/ - Word16 *gain_pit_fx, /* o : Pitch gain / Quantized pitch gain Q14*/ - Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov_fx, /* o : innovation gain Q12*/ - Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ - const Word16 Q_xn /* i : xn and y1 scaling */ -) -{ - Word16 i, index = 0, nBits, num, den, exp_num, exp_den; - Word16 Ei_fx, g_code_fx, gcode0_fx; - Word16 expg, expg2, e_tmp, f_tmp, exp_gcode0, tmp_fx, frac, tmp16; - Word32 L_tmp, L_tmp1; - Word16 wgain_code = 0, gain_code16; - *gain_pit_fx = 0; - move16(); - move16(); - move16(); - - /*----------------------------------------------------------------* - * get number of bits for gain quantization - *----------------------------------------------------------------*/ - nBits = gains_mode[shr( i_subfr, 6 )]; - - /*----------------------------------------------------------------* - * find the code pitch (for current subframe) - *----------------------------------------------------------------*/ - - /**gain_code = dotp( xn, y2, L_SUBFR )/( dotp( y2, y2, L_SUBFR ) + 0.01f );*/ - /* Compute scalar product */ - L_tmp = Dot_product( y2_fx, y2_fx, L_SUBFR ); /* -18 (y2 Q9) */ - exp_den = norm_l( L_tmp ); - den = extract_h( L_shl( L_tmp, exp_den ) ); - exp_den = sub( add( exp_den, 18 ), shl( Q_xn, 1 ) ); - - /* Compute scalar product */ - L_tmp1 = Dot_product( xn_fx, y2_fx, L_SUBFR ); /* -9 (y2 Q9) */ - exp_num = sub( norm_l( L_tmp1 ), 1 ); - num = extract_h( L_shl( L_tmp1, exp_num ) ); - exp_num = sub( add( exp_num, 8 ), Q_xn ); - - tmp16 = s_or( shr( num, 16 ), 1 ); /* extract sign if num < 0 tmp16 = -1 else tmp16 = 1 */ - num = abs_s( num ); - - /*----------------------------------------------------------------* - * compute gain = xy/yy - *----------------------------------------------------------------*/ - g_code_fx = div_s( num, den ); - - i = sub( exp_num, exp_den ); /* Gain_trans in Q7 */ - g_code_fx = i_mult2( g_code_fx, tmp16 ); /* apply sign */ - *gain_code_fx = L_shr_sat( L_deposit_l( g_code_fx ), i ); - move32(); - - /*----------------------------------------------------------------* - * calculate the predicted gain code - * decode codebook gain - *----------------------------------------------------------------*/ - - *gain_pit_fx = 0; - move16(); - - /*Ecode = (dotp( code, code, L_SUBFR) + 0.01f) / L_SUBFR; - *gain_inov = 1.0f / (float)sqrt( Ecode );*/ - - L_tmp = Dot_product12( code_fx, code_fx, L_SUBFR, &expg ); - expg = sub( expg, 18 + 6 ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ - expg2 = expg; - move16(); - L_tmp1 = L_tmp; /* sets to 'L_tmp' in 1 clock */ - move32(); - L_tmp = Isqrt_lc( L_tmp, &expg ); - - *gain_inov_fx = extract_h( L_shl( L_tmp, sub( expg, 3 ) ) ); - move16(); /* gain_inov in Q12 */ - - /*Ei = 10 * (float)log10( Ecode );*/ - e_tmp = norm_l( L_tmp1 ); - f_tmp = Log2_norm_lc( L_shl( L_tmp1, e_tmp ) ); - e_tmp = sub( expg2, add( 1, e_tmp ) ); - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 12330 ); /* Q13 */ /* 10*log10(2) in Q12*/ - Ei_fx = round_fx( L_shl( L_tmp1, 11 ) ); /* Q8 */ - /*gcode0 = (float) pow(10, 0.05 * (Es_pred - Ei));*/ - gcode0_fx = sub( Es_pred_fx, Ei_fx ); /* Q8 */ - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, gcode0/20) - * = pow(2, 3.321928*gcode0/20) - * = pow(2, 0.166096*gcode0) - *-----------------------------------------------------------------*/ - L_tmp = L_mult( gcode0_fx, 21771 ); /* *0.166096 in Q17 -> Q26 */ - L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - exp_gcode0 = sub( exp_gcode0, 14 ); - IF( GT_16( nBits, 3 ) ) - { - /*g_code = *gain_code / gcode0;*/ - IF( gcode0_fx != 0 ) - { - tmp16 = div_s( 16384, gcode0_fx ); /*Q15*/ - L_tmp = Mult_32_16( *gain_code_fx, tmp16 ); /*Q16*/ - *gain_code_fx = L_shr( L_tmp, add( 14, exp_gcode0 ) ); /*Q16*/ - move32(); - } - ELSE - { - *gain_code_fx = MAX_32; - move32(); - } - - /*index = gain_quant( &g_code, G_CODE_MIN, G_CODE_MAX, nBits );*/ - index = gain_quant_fx( gain_code_fx, &gain_code16, LG10_G_CODE_MIN_TC_Q14, LG10_G_CODE_MAX_TC_Q13, nBits, &expg ); - - /**gain_code = g_code * gcode0;*/ - L_tmp = L_mult( gain_code16, gcode0_fx ); /*Q0*Q0 -> Q1*/ - *gain_code_fx = L_shl( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); /*Q16*/ - move32(); - - push_indice_fx( hBstr, IND_GAIN_CODE, index, nBits ); - } - ELSE - { - index = N_GAIN_CODE_TC - 1; - move16(); - FOR( i = 0; i < N_GAIN_CODE_TC - 1; i++ ) - { - L_tmp = L_mult( tbl_gain_code_tc_quant_mean[i], gcode0_fx ); /* Q13*Q0 -> Q14 */ - L_tmp = L_shl( L_tmp, add( exp_gcode0, 2 ) ); /* Q14 -> Q16 */ - - IF( LT_32( *gain_code_fx, L_tmp ) ) - { - index = i; - move16(); - BREAK; - } - } - /*----------------------------------------------------------------* - * 3-bit -> 2-bit encoding - *----------------------------------------------------------------*/ - IF( EQ_16( nBits, 2 ) ) - { - /* 2-bit -> 3-bit decoding */ - index = shr( index, 1 ); - wgain_code = tbl_gain_code_tc_fx[shl( index, 1 )]; - move16(); - /**gain_code *= gcode0;*/ - L_tmp = L_mult( wgain_code, gcode0_fx ); /* Q13*Q0 -> Q14 */ - *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 2 ) ); - move32(); /* Q14 -> Q16 */ - push_indice_fx( hBstr, IND_GAIN_CODE, index, nBits ); - } - ELSE /* nBits == 3 */ - { - wgain_code = tbl_gain_code_tc_fx[index]; - move16(); - /**gain_code *= gcode0;*/ - L_tmp = L_mult( wgain_code, gcode0_fx ); /* Q13*Q0 -> Q14 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 2 ) ); - move32(); /* Q14 -> Q16 */ - push_indice_fx( hBstr, IND_GAIN_CODE, index, nBits ); - } - } - - /*-----------------------------------------------------------------* - * decode normalized codebook gain - *-----------------------------------------------------------------*/ - /**norm_gain_code = *gain_code / *gain_inov;*/ - expg = sub( norm_s( *gain_inov_fx ), 1 ); - expg = s_max( expg, 0 ); - - tmp_fx = div_s( shr( 8192, expg ), *gain_inov_fx ); - *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); // Q16 - move32(); - return; -} - -void gain_enc_tc_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 gains_mode[], /* i : gain bits Q0*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 xn_fx[], /* i : target vector Q_xn*/ - const Word16 y2_fx[], /* i : zero-memory filtered algebraic codebook excitation Q_xn*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 Es_pred_fx, /* i : predicted scaled innovation energy Q8*/ - Word16 *gain_pit_fx, /* o : Pitch gain / Quantized pitch gain Q14*/ - Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov_fx, /* o : innovation gain Q12*/ - Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q6*/ - const Word16 Q_xn /* i : xn and y1 scaling */ -) -{ - Word16 i, index = 0, nBits, num, den, exp_num, exp_den; - Word16 Ei_fx, g_code_fx, gcode0_fx; - Word16 expg, expg2, e_tmp, f_tmp, exp_gcode0, tmp_fx, frac, tmp16; - Word32 L_tmp, L_tmp1; - Word16 wgain_code = 0, gain_code16; - *gain_pit_fx = 0; - move16(); - move16(); - move16(); - - /*----------------------------------------------------------------* - * get number of bits for gain quantization - *----------------------------------------------------------------*/ - nBits = gains_mode[i_subfr >> 6]; // Q0 - move16(); - - /*----------------------------------------------------------------* - * find the code pitch (for current subframe) - *----------------------------------------------------------------*/ - - /**gain_code = dotp( xn, y2, L_SUBFR )/( dotp( y2, y2, L_SUBFR ) + 0.01f );*/ - /* Compute scalar product */ - L_tmp = Dot_product( y2_fx, y2_fx, L_SUBFR ); /* -18 (y2 Q9) */ - exp_den = norm_l( L_tmp ); - den = extract_h( L_shl( L_tmp, exp_den ) ); - exp_den = sub( add( exp_den, 18 ), shl( Q_xn, 1 ) ); - - /* Compute scalar product */ - L_tmp1 = Dot_product( xn_fx, y2_fx, L_SUBFR ); /* -9 (y2 Q9) */ - exp_num = sub( norm_l( L_tmp1 ), 1 ); - num = extract_h( L_shl( L_tmp1, exp_num ) ); - exp_num = sub( add( exp_num, 8 ), Q_xn ); - - tmp16 = s_or( shr( num, 16 ), 1 ); /* extract sign if num < 0 tmp16 = -1 else tmp16 = 1 */ - num = abs_s( num ); - - /*----------------------------------------------------------------* - * compute gain = xy/yy - *----------------------------------------------------------------*/ - g_code_fx = div_s( num, den ); - - i = sub( exp_num, exp_den ); /* Gain_trans in Q7 */ - g_code_fx = i_mult2( g_code_fx, tmp16 ); /* apply sign */ - *gain_code_fx = L_shr_sat( L_deposit_l( g_code_fx ), i ); /* Q16 */ - move32(); - - /*----------------------------------------------------------------* - * calculate the predicted gain code - * decode codebook gain - *----------------------------------------------------------------*/ - - *gain_pit_fx = 0; - move16(); - - /*Ecode = (dotp( code, code, L_SUBFR) + 0.01f) / L_SUBFR; - *gain_inov = 1.0f / (float)sqrt( Ecode );*/ - - L_tmp = Dot_product12( code_fx, code_fx, L_SUBFR, &expg ); - expg = sub( expg, 18 + 6 ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ - expg2 = expg; - move16(); - L_tmp1 = L_tmp; /* sets to 'L_tmp' in 1 clock */ - move32(); - L_tmp = Isqrt_lc( L_tmp, &expg ); - - *gain_inov_fx = extract_h( L_shl( L_tmp, sub( expg, 3 ) ) ); - move16(); /* gain_inov in Q12 */ - - /*Ei = 10 * (float)log10( Ecode );*/ - e_tmp = norm_l( L_tmp1 ); - f_tmp = Log2_norm_lc( L_shl( L_tmp1, e_tmp ) ); - e_tmp = sub( expg2, add( 1, e_tmp ) ); - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 12330 ); /* Q13 */ /* 10*log10(2) in Q12*/ - Ei_fx = round_fx( L_shl( L_tmp1, 11 ) ); /* Q8 */ - /*gcode0 = (float) pow(10, 0.05 * (Es_pred - Ei));*/ - gcode0_fx = sub( Es_pred_fx, Ei_fx ); /* Q8 */ - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, gcode0/20) - * = pow(2, 3.321928*gcode0/20) - * = pow(2, 0.166096*gcode0) - *-----------------------------------------------------------------*/ - L_tmp = L_mult( gcode0_fx, 21771 ); /* *0.166096 in Q17 -> Q26 */ - L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - exp_gcode0 = sub( exp_gcode0, 14 ); - IF( GT_16( nBits, 3 ) ) - { - /*g_code = *gain_code / gcode0;*/ - IF( gcode0_fx != 0 ) - { - tmp16 = div_s( 16384, gcode0_fx ); /*Q15*/ - L_tmp = Mult_32_16( *gain_code_fx, tmp16 ); /*Q16*/ - *gain_code_fx = L_shr( L_tmp, add( 14, exp_gcode0 ) ); /*Q16*/ - move32(); - } - ELSE - { - *gain_code_fx = MAX_32; - move32(); - } - - /*index = gain_quant( &g_code, G_CODE_MIN, G_CODE_MAX, nBits );*/ - index = gain_quant_fx( gain_code_fx, &gain_code16, LG10_G_CODE_MIN_TC_Q14, LG10_G_CODE_MAX_TC_Q13, nBits, &expg ); - - /**gain_code = g_code * gcode0;*/ - L_tmp = L_mult( gain_code16, gcode0_fx ); /*Q0*Q0 -> Q1*/ - *gain_code_fx = L_shl( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); /*Q16*/ - move32(); - - push_indice( hBstr, IND_GAIN_CODE, index, nBits ); - } - ELSE - { - index = N_GAIN_CODE_TC - 1; - move16(); - FOR( i = 0; i < N_GAIN_CODE_TC - 1; i++ ) - { - L_tmp = L_mult( tbl_gain_code_tc_quant_mean[i], gcode0_fx ); /* Q13*Q0 -> Q14 */ - L_tmp = L_shl( L_tmp, add( exp_gcode0, 2 ) ); /* Q14 -> Q16 */ - - IF( LT_32( *gain_code_fx, L_tmp ) ) - { - index = i; - move16(); - BREAK; - } - } - /*----------------------------------------------------------------* - * 3-bit -> 2-bit encoding - *----------------------------------------------------------------*/ - IF( EQ_16( nBits, 2 ) ) - { - /* 2-bit -> 3-bit decoding */ - index = shr( index, 1 ); - wgain_code = tbl_gain_code_tc_fx[index * 2]; // Q13 - move16(); - /**gain_code *= gcode0;*/ - L_tmp = L_mult( wgain_code, gcode0_fx ); /* Q13*Q0 -> Q14 */ - *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 2 ) ); - move32(); /* Q14 -> Q16 */ - push_indice( hBstr, IND_GAIN_CODE, index, nBits ); - } - ELSE /* nBits == 3 */ - { - wgain_code = tbl_gain_code_tc_fx[index]; // Q13 - move16(); - /**gain_code *= gcode0;*/ - L_tmp = L_mult( wgain_code, gcode0_fx ); /* Q13*Q0 -> Q14 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 2 ) ); - move32(); /* Q14 -> Q16 */ - push_indice( hBstr, IND_GAIN_CODE, index, nBits ); - } - } - - /*-----------------------------------------------------------------* - * decode normalized codebook gain - *-----------------------------------------------------------------*/ - /**norm_gain_code = *gain_code / *gain_inov;*/ - expg = sub( norm_s( *gain_inov_fx ), 1 ); - expg = s_max( expg, 0 ); - - tmp_fx = div_s( shr( 8192, expg ), *gain_inov_fx ); - *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); // Q6 - move32(); - return; -} -/*-----------------------------------------------------------------* - * Find_Opt_gainQ_fx() - * - * Find the best quantizer - *-----------------------------------------------------------------*/ -static Word16 Find_Opt_gainQ_fx( - Word16 *coeff, /* exp(exp_coeff) */ - Word16 *exp_coeff, - Word16 *gain_pit, /* Q14 */ - Word32 *gain_code, /* Q16 */ - Word16 gcode0, /* exp(exp_gcode0) */ - Word16 exp_gcode0, - const Word16 *cdbk, /* i : Codebook used Q14*/ - const Word16 size /* i : size of Codebook used Q0*/ -) -{ - Word16 index, i, j; - const Word16 *p; - Word16 g_pitch, g2_pitch, g_code, g_pit_cod, g2_code, g2_code_lo; - Word32 dist_min; - Word16 coeff_lo[5]; - Word16 exp_max[5]; - Word16 exp_code, e_max; - Word32 L_tmp, L_tmp1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - - /*----------------------------------------------------------------* - * Find the best quantizer - * ~~~~~~~~~~~~~~~~~~~~~~~ - * Before doing the computation we need to align exponents of coeff[] - * to be sure to have the maximum precision. - * - * In the table the pitch gains are in Q14, the code gains are in Q9 and - * are multiply by gcode0 which have been multiply by 2^exp_gcode0. - * Also when we compute g_pitch*g_pitch, g_code*g_code and g_pitch*g_code - * we divide by 2^15. - * Considering all the scaling above we have: - * - * exp_code = exp_gcode0-9+15 = exp_gcode0+6 - * - * g_pitch*g_pitch = -14-14+15 - * g_pitch = -14 - * g_code*g_code = (2*exp_code)+15 - * g_code = exp_code - * g_pitch*g_code = -14 + exp_code +15 - * - * g_pitch*g_pitch * coeff[0] ;exp_max0 = exp_coeff[0] - 13 - * g_pitch * coeff[1] ;exp_max1 = exp_coeff[1] - 14 - * g_code*g_code * coeff[2] ;exp_max2 = exp_coeff[2] +15+(2*exp_code) - * g_code * coeff[3] ;exp_max3 = exp_coeff[3] + exp_code - * g_pitch*g_code * coeff[4] ;exp_max4 = exp_coeff[4] + 1 + exp_code - *----------------------------------------------------------------*/ - - exp_code = add( exp_gcode0, 6 ); - - exp_max[0] = sub( exp_coeff[0], 13 ); - move16(); - exp_max[1] = sub( exp_coeff[1], 14 ); - move16(); - exp_max[2] = add( exp_coeff[2], add( 15, shl( exp_code, 1 ) ) ); - move16(); - exp_max[3] = add( exp_coeff[3], exp_code ); - move16(); - exp_max[4] = add( exp_coeff[4], add( 1, exp_code ) ); - move16(); - - /* Find maximum exponant */ - e_max = exp_max[0]; - move16(); - FOR( i = 1; i < 5; i++ ) - { - e_max = s_max( exp_max[i], e_max ); - } - - /* align coeff[] and save in special 32 bit double precision */ - FOR( i = 0; i < 5; i++ ) - { - j = add( sub( e_max, exp_max[i] ), 2 ); /* /4 to avoid overflow */ - L_tmp = L_deposit_h( coeff[i] ); - L_tmp = L_shr( L_tmp, j ); - L_Extract( L_tmp, &coeff[i], &coeff_lo[i] ); - coeff_lo[i] = shr( coeff_lo[i], 3 ); /* lo >> 3 */ - move16(); - } - - /* searching of codebook */ - p = cdbk; // Q14 - move16(); - dist_min = L_deposit_h( MAX_16 ); - index = 0; - move16(); - FOR( i = 0; i < size; i++ ) - { - g_pitch = *p++; - move16(); - g_code = *p++; - move16(); - - g_code = mult_r( g_code, gcode0 ); // exp_gcode - 1 - g2_pitch = mult_r( g_pitch, g_pitch ); // Q13 - g_pit_cod = mult_r( g_code, g_pitch ); - L_tmp = L_mult( g_code, g_code ); - g2_code_lo = L_Extract_lc( L_tmp, &g2_code ); - - L_tmp = L_mult( coeff[2], g2_code_lo ); - L_tmp = L_shr( L_tmp, 3 ); - L_tmp = L_mac( L_tmp, coeff_lo[0], g2_pitch ); - L_tmp = L_mac( L_tmp, coeff_lo[1], g_pitch ); - L_tmp = L_mac( L_tmp, coeff_lo[2], g2_code ); - L_tmp = L_mac( L_tmp, coeff_lo[3], g_code ); - L_tmp = L_mac( L_tmp, coeff_lo[4], g_pit_cod ); - L_tmp = L_shr( L_tmp, 12 ); - L_tmp = L_mac( L_tmp, coeff[0], g2_pitch ); /* 15 - coeff_exp + 13 - 1 */ - L_tmp = L_mac( L_tmp, coeff[1], g_pitch ); /* 15 - coeff_exp + 13 - 1 */ - L_tmp = L_mac( L_tmp, coeff[2], g2_code ); /* 15 - coeff_exp + 13 - 1 */ - L_tmp = L_mac( L_tmp, coeff[3], g_code ); /* 15 - coeff_exp + 13 - 1 */ - L_tmp = L_mac( L_tmp, coeff[4], g_pit_cod ); /* 15 - coeff_exp + 13 - 1 */ - - L_tmp1 = L_sub_o( L_tmp, dist_min, &Overflow ); - if ( L_tmp1 < 0 ) - { - index = i; - move16(); - } - dist_min = L_min( L_tmp, dist_min ); - } - - p = &cdbk[add( index, index )]; // Q14 - move16(); - - *gain_pit = *p++; /* selected pitch gain in Q14 */ - move16(); - g_code = *p++; /* selected code gain in Q9 */ - move16(); - - L_tmp = L_mult( g_code, gcode0 ); /* Q9*Q0 -> Q10 */ - L_tmp = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /* Q10 -> Q16 */ - *gain_code = L_tmp; /* gain of code in Q16 */ - move16(); - return index; -} -/*---------------------------------------------------------------------* - * gain_enc_lbr() - * - * Quantization of pitch and codebook gains without prediction (memory-less) - * in ACELP at 6.6 and 7.5 kbps - * - the gain codebooks and gain estimation constants are different in each subframe - * - the estimated gain, gcode0, is first determined based on - * classification and/or previous quantized gains (from previous subframes in the current frame) - * - a correction factor gamma = g_code / gcode0 is then vector quantized - * along with gain_pit - * - the mean-squared error criterion is used for codebook search - *---------------------------------------------------------------------*/ - -void gain_enc_lbr_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 gains_mode[], /* i : gain bits Q0*/ - const Word16 coder_type, /* i : coding type Q0*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 *xn, /* i : target vector Q_xn*/ - const Word16 *y1, /* i : zero-memory filtered adaptive excitation Q_xn*/ - const Word16 Q_xn, /* i : xn and y1 format */ - const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ - const Word16 *code, /* i : algebraic excitation Q9*/ - Word16 *gain_pit, /* o : quantized pitch gain Q14*/ - Word32 *gain_code, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ - Word16 *g_corr, /* i/o: correlations , -2,, -2 and 2 mant/exp*/ - Word32 gc_mem[], /* i/o: gain_code from previous subframes Q16*/ - Word16 gp_mem[], /* i/o: gain_pitch from previous subframes Q14*/ - const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ - const Word16 L_subfr /* i : subframe length Q0*/ -) -{ - - Word16 index = 0, size, nBits, n_pred, ctype; - const Word16 *b, *cdbk = 0; - Word16 gcode0, aux[10]; - Word16 coeff[5], exp_coeff[5]; - Word16 exp, exp_code, exp_inov, exp_gcode0, frac, tmp, L_subfr_sf; - Word32 L_tmp, L_tmp1, L_inov; - move16(); - move16(); - - L_subfr_sf = 6; - move16(); - if ( GT_16( L_subfr, L_SUBFR ) ) - { - L_subfr_sf = 7; - move16(); - } - /*-----------------------------------------------------------------* - * calculate the rest of the correlation coefficients - * c2 = , c3 = -2, c4 = 2, c5* = - * c5* - not necessary to calculate - *-----------------------------------------------------------------*/ - - coeff[0] = g_corr[0]; - move16(); - exp_coeff[0] = g_corr[1]; - move16(); - coeff[1] = negate( g_corr[2] ); - move16(); /* coeff[1] = -2 xn yy1 */ - exp_coeff[1] = add( g_corr[3], 1 ); - move16(); - - /* Compute scalar product */ - coeff[2] = extract_h( Dot_product12( y2, y2, L_subfr, &exp ) ); - move16(); - exp_coeff[2] = add( sub( exp, 18 ), shl( Q_xn, 1 ) ); /* -18 (y2 Q9) */ - move16(); - - /* Compute scalar product -2* */ - - coeff[3] = extract_h( L_negate( Dot_product12( xn, y2, L_subfr, &exp ) ) ); - move16(); - exp_coeff[3] = add( sub( exp, 9 - 1 ), Q_xn ); /* -9 (y2 Q9), +1 (2 xn y2) */ - move16(); - - /* Compute scalar product 2* */ - - coeff[4] = extract_h( Dot_product12( y1, y2, L_subfr, &exp ) ); - move16(); - exp_coeff[4] = add( sub( exp, 9 - 1 ), Q_xn ); /* -9 (y2 Q9), +1 (2 yy1 y2) */ - move16(); - - /*g_corr[2] += 0.01F; g_corr[3] -= 0.02F; g_corr[4] += 0.02F;*/ - - /*Ecode = ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR; - *gain_inov = 1.0f / (float)sqrt(Ecode);*/ - L_tmp = Dot_product12( code, code, L_subfr, &exp_code ); - L_inov = L_tmp; /* sets to 'L_tmp' in 1 clock */ - move32(); - /* exp_code: -18 (code in Q9), -6 (/L_SUBFR), -31 (L_tmp Q31->Q0) */ - /* output gain_inov*/ - exp_inov = sub( exp_code, add( 18, L_subfr_sf ) ); - L_inov = Isqrt_lc( L_inov, &exp_inov ); - *gain_inov = extract_h( L_shl( L_inov, sub( exp_inov, 3 ) ) ); /* gain_inov in Q12 */ - move16(); - - - /*-----------------------------------------------------------------* - * select the codebook, size and number of bits - * set the gains searching range - *-----------------------------------------------------------------*/ - - nBits = gains_mode[shr( i_subfr, L_subfr_sf )]; - move16(); - size = shl( 1, nBits ); - - ctype = shl( sub( coder_type, 1 ), 1 ); - - /*-----------------------------------------------------------------* - * calculate prediction of gcode - * search for the best codeword - *-----------------------------------------------------------------*/ - test(); - IF( i_subfr == 0 ) - { - b = b_1sfr_fx; // Q12 - move16(); - n_pred = 2; - move16(); - - SWITCH( nBits ) - { - case 8: - { - cdbk = gp_gamma_1sfr_8b_fx; /* Q14 / Q9 */ - if ( EQ_16( clip_gain, 1 ) ) - { - size = sub( size, 60 ); - } - BREAK; - } - case 7: - { - cdbk = gp_gamma_1sfr_7b_fx; /* Q14 / Q9 */ - if ( EQ_16( clip_gain, 1 ) ) - { - size = sub( size, 27 ); - } - BREAK; - } - case 6: - { - cdbk = gp_gamma_1sfr_6b_fx; /* Q14 / Q9 */ - if ( EQ_16( clip_gain, 1 ) ) - { - size = sub( size, 10 ); - } - BREAK; - } - } - - /* calculate predicted gain */ - aux[0] = 4096; /* 1 in Q12 */ - move16(); - aux[1] = shl( ctype, 12 ); - move16(); - - /* gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.5f * (float)log10(Ecode)); - gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.05f * 10 * (float)log10(Ecode)); - gcode0 = (float)pow(10, 0.05(20 * dotp(b, aux, n_pred) - 10 * (float)log10(Ecode))); */ - - exp_code = sub( exp_code, 18 + 6 + 1 ); - exp = norm_l( L_tmp ); - frac = Log2_norm_lc( L_shl( L_tmp, exp ) ); - exp = sub( exp_code, exp ); - L_tmp1 = Mpy_32_16( exp, frac, 24660 ); /* Q14 */ /* 10*log10(2) in Q13*/ - - L_tmp = Dot_product( b, aux, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 320 ); /*Q14, 20 in Q4*/ - L_tmp = L_sub( L_tmp, L_tmp1 ); /*Q14*/ - - gcode0 = round_fx( L_shl( L_tmp, 10 ) ); /* Q8 */ - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, gcode0/20) - * = pow(2, 3.321928*gcode0/20) - * = pow(2, 0.166096*gcode0) - *-----------------------------------------------------------------*/ - - L_tmp = L_mult( gcode0, 21771 ); /* *0.166096 in Q17 -> Q26 */ - L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0 = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - index = Find_Opt_gainQ_fx( coeff, exp_coeff, gain_pit, gain_code, gcode0, exp_gcode0, cdbk, size ); // Q0 - - gc_mem[0] = *gain_code; - move16(); /*Q16*/ - gp_mem[0] = *gain_pit; - move16(); /*Q14*/ - } - ELSE IF( EQ_16( i_subfr, L_SUBFR ) || EQ_16( L_subfr, 2 * L_SUBFR ) ) - { - b = b_2sfr_fx; - move16(); - n_pred = 4; - move16(); - - switch ( nBits ) - { - case 7: - { - cdbk = gp_gamma_2sfr_7b_fx; /* Q14/Q9 */ - if ( EQ_16( clip_gain, 1 ) ) - { - size = sub( size, 30 ); - } - BREAK; - } - case 6: - { - cdbk = gp_gamma_2sfr_6b_fx; /* Q14/Q9 */ - if ( EQ_16( clip_gain, 1 ) ) - { - size = sub( size, 12 ); - } - BREAK; - } - } - - /* calculate predicted gain */ - aux[0] = 4096; /* 1 in Q12 */ - move16(); - aux[1] = shl( ctype, 12 ); - move16(); - - /*aux[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ - exp = norm_l( gc_mem[0] ); - frac = Log2_norm_lc( L_shl( gc_mem[0], exp ) ); - exp = sub( sub( 30, exp ), 16 ); /*Q_format(gc_1sfr_fx)=16*/ - L_tmp1 = Mpy_32_16( exp, frac, 9864 ); - move16(); /* Q16 */ - aux[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - aux[3] = shr( gp_mem[0], 2 ); - move16(); /*Q12*/ - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, dotp(b, aux, n_pred) - * = pow(2, 3.321928*dotp(b, aux, n_pred) - *-----------------------------------------------------------------*/ - L_tmp = Dot_product( b, aux, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 27213 ); /* *3.321928 in Q13 -> Q23 */ - L_tmp = L_shr( L_tmp, 7 ); /* From Q23 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0 = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - index = Find_Opt_gainQ_fx( coeff, exp_coeff, gain_pit, gain_code, gcode0, exp_gcode0, cdbk, size ); // Q0 - gc_mem[1] = *gain_code; // Q16 - move32(); - gp_mem[1] = *gain_pit; // Q14 - move16(); - } - ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - b = b_3sfr_fx; // Q12 - move16(); - n_pred = 6; - move16(); - IF( EQ_16( nBits, 7 ) ) - { - cdbk = gp_gamma_3sfr_7b_fx; - if ( clip_gain == 1 ) - { - size -= 28; - } - } - ELSE - { - cdbk = gp_gamma_3sfr_6b_fx; /* Q14 / Q9 */ - if ( EQ_16( clip_gain, 1 ) ) - { - size = sub( size, 11 ); - } - } - /* calculate predicted gain */ - aux[0] = 4096; /* 1 in Q12 */ - move16(); - aux[1] = shl( ctype, 12 ); - move16(); - - /*aux[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ - exp = norm_l( gc_mem[0] ); - frac = Log2_norm_lc( L_shl( gc_mem[0], exp ) ); - exp = sub( sub( 30, exp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( exp, frac, 9864 ); /* Q16 */ - aux[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - /*aux[3] = (float)log10(gc_mem[1]); - = log2(gc_mem[1])*log10(2);*/ - exp = norm_l( gc_mem[1] ); - frac = Log2_norm_lc( L_shl( gc_mem[1], exp ) ); - exp = sub( sub( 30, exp ), 16 ); /*Q_format(gc_mem[1])=16*/ - L_tmp1 = Mpy_32_16( exp, frac, 9864 ); /* Q16 */ - aux[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - aux[4] = shr( gp_mem[0], 2 ); - move16(); /*Q12*/ - aux[5] = shr( gp_mem[1], 2 ); - move16(); /*Q12*/ - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, dotp(b, aux, n_pred) - * = pow(2, 3.321928*dotp(b, aux, n_pred) - *-----------------------------------------------------------------*/ - L_tmp = Dot_product( b, aux, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 27213 ); /* *3.321928 in Q13 -> Q23 */ - L_tmp = L_shr( L_tmp, 7 ); /* From Q23 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0 = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - /*----------------------------------------------------------------* - * Find the best quantizer - * ~~~~~~~~~~~~~~~~~~~~~~~ - * Before doing the computation we need to align exponents of coeff[] - * to be sure to have the maximum precision. - * - * In the table the pitch gains are in Q14, the code gains are in Q9 and - * are multiply by gcode0 which have been multiply by 2^exp_gcode0. - * Also when we compute g_pitch*g_pitch, g_code*g_code and g_pitch*g_code - * we divide by 2^15. - * Considering all the scaling above we have: - * - * exp_code = exp_gcode0-9+15 = exp_gcode0+6 - * - * g_pitch*g_pitch = -14-14+15 - * g_pitch = -14 - * g_code*g_code = (2*exp_code)+15 - * g_code = exp_code - * g_pitch*g_code = -14 + exp_code +15 - * - * g_pitch*g_pitch * coeff[0] ;exp_max0 = exp_coeff[0] - 13 - * g_pitch * coeff[1] ;exp_max1 = exp_coeff[1] - 14 - * g_code*g_code * coeff[2] ;exp_max2 = exp_coeff[2] +15+(2*exp_code) - * g_code * coeff[3] ;exp_max3 = exp_coeff[3] + exp_code - * g_pitch*g_code * coeff[4] ;exp_max4 = exp_coeff[4] + 1 + exp_code - *----------------------------------------------------------------*/ + * Find the best quantizer + * ~~~~~~~~~~~~~~~~~~~~~~~ + * Before doing the computation we need to align exponents of coeff[] + * to be sure to have the maximum precision. + * + * In the table the pitch gains are in Q14, the code gains are in Q9 and + * are multiply by gcode0 which have been multiply by 2^exp_gcode0. + * Also when we compute g_pitch*g_pitch, g_code*g_code and g_pitch*g_code + * we divide by 2^15. + * Considering all the scaling above we have: + * + * exp_code = exp_gcode0-9+15 = exp_gcode0+6 + * + * g_pitch*g_pitch = -14-14+15 + * g_pitch = -14 + * g_code*g_code = (2*exp_code)+15 + * g_code = exp_code + * g_pitch*g_code = -14 + exp_code +15 + * + * g_pitch*g_pitch * coeff[0] ;exp_max0 = exp_coeff[0] - 13 + * g_pitch * coeff[1] ;exp_max1 = exp_coeff[1] - 14 + * g_code*g_code * coeff[2] ;exp_max2 = exp_coeff[2] +15+(2*exp_code) + * g_code * coeff[3] ;exp_max3 = exp_coeff[3] + exp_code + * g_pitch*g_code * coeff[4] ;exp_max4 = exp_coeff[4] + 1 + exp_code + *----------------------------------------------------------------*/ - index = Find_Opt_gainQ_fx( coeff, exp_coeff, gain_pit, gain_code, gcode0, exp_gcode0, cdbk, size ); + exp_code = add( exp_gcode0, 6 ); - gc_mem[2] = *gain_code; // Q16 - move32(); - gp_mem[2] = *gain_pit; // Q14 - move16(); + exp_max[0] = sub( exp_coeff[0], 13 ); + move16(); + exp_max[1] = sub( exp_coeff[1], 14 ); + move16(); + exp_max[2] = add( exp_coeff[2], add( 15, shl( exp_code, 1 ) ) ); + move16(); + exp_max[3] = add( exp_coeff[3], exp_code ); + move16(); + exp_max[4] = add( exp_coeff[4], add( 1, exp_code ) ); + move16(); + + /* Find maximum exponant */ + e_max = exp_max[0]; + move16(); + FOR( i = 1; i < 5; i++ ) + { + e_max = s_max( exp_max[i], e_max ); } - ELSE IF( EQ_16( i_subfr, 3 * L_SUBFR ) ) + + /* align coeff[] and save in special 32 bit double precision */ + FOR( i = 0; i < 5; i++ ) { - b = b_4sfr_fx; // Q12 - move16(); - n_pred = 8; - move16(); - IF( EQ_16( nBits, 7 ) ) - { - cdbk = gp_gamma_4sfr_7b_fx; - if ( clip_gain == 1 ) - { - size -= 25; - } - } - ELSE - { - cdbk = gp_gamma_4sfr_6b_fx; /* Q14 / Q9 */ - if ( EQ_16( clip_gain, 1 ) ) - { - size = sub( size, 11 ); - } - } - /* calculate predicted gain */ - aux[0] = 4096; /* 1 in Q12 */ - move16(); - aux[1] = shl( ctype, 12 ); + j = add( sub( e_max, exp_max[i] ), 2 ); /* /4 to avoid overflow */ + L_tmp = L_deposit_h( coeff[i] ); + L_tmp = L_shr( L_tmp, j ); + L_Extract( L_tmp, &coeff[i], &coeff_lo[i] ); + coeff_lo[i] = shr( coeff_lo[i], 3 ); /* lo >> 3 */ move16(); + } - /*aux[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ - exp = norm_l( gc_mem[0] ); - frac = Log2_norm_lc( L_shl( gc_mem[0], exp ) ); - exp = sub( sub( 30, exp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( exp, frac, 9864 ); /* Q16 */ - aux[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + /* searching of codebook */ + p = cdbk; // Q14 + move16(); + dist_min = L_deposit_h( MAX_16 ); + index = 0; + move16(); + FOR( i = 0; i < size; i++ ) + { + g_pitch = *p++; move16(); - - /*aux[3] = (float)log10(gc_mem[1]); - = log2(gc_mem[1])*log10(2);*/ - exp = norm_l( gc_mem[1] ); - frac = Log2_norm_lc( L_shl( gc_mem[1], exp ) ); - exp = sub( sub( 30, exp ), 16 ); /*Q_format(gc_mem[1])=16*/ - L_tmp1 = Mpy_32_16( exp, frac, 9864 ); /* Q16 */ - aux[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + g_code = *p++; move16(); + g_code = mult_r( g_code, gcode0 ); // exp_gcode - 1 + g2_pitch = mult_r( g_pitch, g_pitch ); // Q13 + g_pit_cod = mult_r( g_code, g_pitch ); + L_tmp = L_mult( g_code, g_code ); + g2_code_lo = L_Extract_lc( L_tmp, &g2_code ); - /*aux[4] = (float)log10(gc_mem[2]); - = log2(gc_mem[2])*log10(2);*/ - exp = norm_l( gc_mem[2] ); - frac = Log2_norm_lc( L_shl( gc_mem[2], exp ) ); - exp = sub( sub( 30, exp ), 16 ); /*Q_format(gc_mem[2])=16*/ - L_tmp1 = Mpy_32_16( exp, frac, 9864 ); /* Q16 */ - aux[4] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); + L_tmp = L_mult( coeff[2], g2_code_lo ); + L_tmp = L_shr( L_tmp, 3 ); + L_tmp = L_mac( L_tmp, coeff_lo[0], g2_pitch ); + L_tmp = L_mac( L_tmp, coeff_lo[1], g_pitch ); + L_tmp = L_mac( L_tmp, coeff_lo[2], g2_code ); + L_tmp = L_mac( L_tmp, coeff_lo[3], g_code ); + L_tmp = L_mac( L_tmp, coeff_lo[4], g_pit_cod ); + L_tmp = L_shr( L_tmp, 12 ); + L_tmp = L_mac( L_tmp, coeff[0], g2_pitch ); /* 15 - coeff_exp + 13 - 1 */ + L_tmp = L_mac( L_tmp, coeff[1], g_pitch ); /* 15 - coeff_exp + 13 - 1 */ + L_tmp = L_mac( L_tmp, coeff[2], g2_code ); /* 15 - coeff_exp + 13 - 1 */ + L_tmp = L_mac( L_tmp, coeff[3], g_code ); /* 15 - coeff_exp + 13 - 1 */ + L_tmp = L_mac( L_tmp, coeff[4], g_pit_cod ); /* 15 - coeff_exp + 13 - 1 */ - aux[5] = shr( gp_mem[0], 2 ); - move16(); /*Q12*/ - aux[6] = shr( gp_mem[1], 2 ); - move16(); /*Q12*/ - aux[7] = shr( gp_mem[2], 2 ); - move16(); /*Q12*/ - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, dotp(b, aux, n_pred) - * = pow(2, 3.321928*dotp(b, aux, n_pred) - *-----------------------------------------------------------------*/ - L_tmp = Dot_product( b, aux, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 27213 ); /* *3.321928 in Q13 -> Q23 */ - L_tmp = L_shr( L_tmp, 7 ); /* From Q23 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ + L_tmp1 = L_sub_sat( L_tmp, dist_min ); + if ( L_tmp1 < 0 ) + { + index = i; + move16(); + } + dist_min = L_min( L_tmp, dist_min ); + } - gcode0 = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); + p = &cdbk[add( index, index )]; // Q14 + move16(); - index = Find_Opt_gainQ_fx( coeff, exp_coeff, gain_pit, gain_code, gcode0, exp_gcode0, cdbk, size ); // Q0 - } + *gain_pit = *p++; /* selected pitch gain in Q14 */ + move16(); + g_code = *p++; /* selected code gain in Q9 */ + move16(); - /* *norm_gain_code = *gain_code / *gain_inov; */ - exp = sub( norm_s( *gain_inov ), 1 ); - exp = s_max( exp, 0 ); + L_tmp = L_mult( g_code, gcode0 ); /* Q9*Q0 -> Q10 */ + L_tmp = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /* Q10 -> Q16 */ + *gain_code = L_tmp; /* gain of code in Q16 */ + move16(); - tmp = div_s( shr( 8192, exp ), *gain_inov ); - *norm_gain_code = L_shr( Mult_32_16( *gain_code, tmp ), sub( 1, exp ) ); // Q16 - move32(); - { - push_indice_fx( hBstr, IND_GAIN, index, nBits ); - } - return; + return index; } -void gain_enc_lbr_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + +/*---------------------------------------------------------------------* + * gain_enc_lbr() + * + * Quantization of pitch and codebook gains without prediction (memory-less) + * in ACELP at 6.6 and 7.5 kbps + * - the gain codebooks and gain estimation constants are different in each subframe + * - the estimated gain, gcode0, is first determined based on + * classification and/or previous quantized gains (from previous subframes in the current frame) + * - a correction factor gamma = g_code / gcode0 is then vector quantized + * along with gain_pit + * - the mean-squared error criterion is used for codebook search + *---------------------------------------------------------------------*/ + +void gain_enc_lbr_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const Word16 gains_mode[], /* i : gain bits Q0*/ const Word16 coder_type, /* i : coding type Q0*/ const Word16 i_subfr, /* i : subframe index Q0*/ @@ -2458,13 +1238,13 @@ void gain_enc_lbr_ivas_fx( Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ Word16 *g_corr, /* i/o: correlations , -2,, -2 and 2 mant/exp*/ - Word32 gc_mem[], /* i/o: gain_code from previous subframes Q16*/ - Word16 gp_mem[], /* i/o: gain_pitch from previous subframes Q14*/ + Word32 gc_mem[], /* i/o: gain_code from previous subframes Q16*/ + Word16 gp_mem[], /* i/o: gain_pitch from previous subframes Q14*/ const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ - const Word16 L_subfr /* i : subframe length Q0*/ + const Word16 L_subfr, /* i : subframe length Q0*/ + const Word16 element_mode /* i : mode element Q0*/ ) { - Word16 index = 0, size, nBits, n_pred, ctype; const Word16 *b, *cdbk = 0; Word16 gcode0, aux[10]; @@ -2472,6 +1252,7 @@ void gain_enc_lbr_ivas_fx( Word16 exp, exp_code, exp_inov, exp_gcode0, frac, tmp, L_subfr_sf; Word32 L_tmp, L_tmp1, L_inov; move16(); + move16(); L_subfr_sf = 6; move16(); @@ -2480,6 +1261,7 @@ void gain_enc_lbr_ivas_fx( L_subfr_sf = 7; move16(); } + /*-----------------------------------------------------------------* * calculate the rest of the correlation coefficients * c2 = , c3 = -2, c4 = 2, c5* = @@ -2496,12 +1278,6 @@ void gain_enc_lbr_ivas_fx( move16(); /* Compute scalar product */ -#ifdef DEBUG - if ( L_subfr != L_SUBFR ) - { - PMT( "Entire function needs review to accommode for L_subfr > L_SUBFR" ); - } -#endif coeff[2] = extract_h( Dot_product12( y2, y2, L_subfr, &exp ) ); move16(); exp_coeff[2] = add( sub( exp, 18 ), shl( Q_xn, 1 ) ); /* -18 (y2 Q9) */ @@ -2535,7 +1311,6 @@ void gain_enc_lbr_ivas_fx( *gain_inov = extract_h( L_shl_sat( L_inov, sub( exp_inov, 3 ) ) ); /* gain_inov in Q12 */ move16(); - /*-----------------------------------------------------------------* * select the codebook, size and number of bits * set the gains searching range @@ -2551,6 +1326,7 @@ void gain_enc_lbr_ivas_fx( * calculate prediction of gcode * search for the best codeword *-----------------------------------------------------------------*/ + test(); IF( i_subfr == 0 ) { @@ -2597,15 +1373,29 @@ void gain_enc_lbr_ivas_fx( move16(); /* gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.5f * (float)log10(Ecode)); - gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.05f * 10 * (float)log10(Ecode)); - gcode0 = (float)pow(10, 0.05(20 * dotp(b, aux, n_pred) - 10 * (float)log10(Ecode))); */ - - exp_code = sub( exp_code, 18 + 6 + 1 ); - exp = norm_l( L_tmp ); - frac = Log2_norm_lc( L_shl( L_tmp, exp ) ); - exp = sub( exp_code, exp ); - L_tmp1 = Mpy_32_16( exp, frac, 24660 ); /* Q14 */ /* 10*log10(2) in Q13*/ + gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.05f * 10 * (float)log10(Ecode)); + gcode0 = (float)pow(10, 0.05(20 * dotp(b, aux, n_pred) - 10 * (float)log10(Ecode))); */ + IF( element_mode > EVS_MONO ) + { + // Ecode = (Ecode / L_subfr) + L_tmp = L_shr( L_tmp, L_subfr_sf ); // Q19 + (Q30-exp_code) + /* Calculation for log10(Ecode) exponent for applying log10 = Q31 - q = Q31 - Q19 - Q30 + exp_code = exp_code - Q18*/ + L_tmp = BASOP_Util_Log10( L_tmp, sub( exp_code, 18 ) ); // new q = Q25 + exp = norm_l( L_tmp ); + L_tmp = L_shl( L_tmp, exp ); // Q25 + exp + // 10 in Q27 , ( 10 * log10( Ecode ) ) + L_tmp1 = Mpy_32_32( L_tmp, 1342177280 ); // Q25 + exp + 1 + Q27 - 32 = Q21 + exp + L_tmp1 = L_shr( L_tmp1, add( 7, exp ) ); // Q21 + exp - 7 - exp = Q14 + } + ELSE + { + exp_code = sub( exp_code, 18 + 6 + 1 ); + exp = norm_l( L_tmp ); + frac = Log2_norm_lc( L_shl( L_tmp, exp ) ); + exp = sub( exp_code, exp ); + L_tmp1 = Mpy_32_16( exp, frac, 24660 ); /* Q14 */ /* 10*log10(2) in Q13*/ + } L_tmp = Dot_product( b, aux, n_pred ); /*Q25*/ L_tmp = Mult_32_16( L_tmp, 320 ); /*Q14, 20 in Q4*/ L_tmp = L_sub( L_tmp, L_tmp1 ); /*Q14*/ @@ -2623,10 +1413,10 @@ void gain_enc_lbr_ivas_fx( frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ gcode0 = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ + /* output of Pow2() will be: */ + /* 16384 < Pow2() <= 32767 */ exp_gcode0 = sub( exp_gcode0, 14 ); - index = Find_Opt_gainQ_fx( coeff, exp_coeff, gain_pit, gain_code, gcode0, exp_gcode0, cdbk, size ); + index = Find_Opt_gainQ_fx( coeff, exp_coeff, gain_pit, gain_code, gcode0, exp_gcode0, cdbk, size ); // Q0 gc_mem[0] = *gain_code; move16(); /*Q16*/ @@ -2635,7 +1425,7 @@ void gain_enc_lbr_ivas_fx( } ELSE IF( EQ_16( i_subfr, L_SUBFR ) || EQ_16( L_subfr, 2 * L_SUBFR ) ) { - b = b_2sfr_fx; // Q12 + b = b_2sfr_fx; move16(); n_pred = 4; move16(); @@ -2644,7 +1434,7 @@ void gain_enc_lbr_ivas_fx( { case 7: { - cdbk = gp_gamma_2sfr_7b_fx; /* Q14 / Q9 */ + cdbk = gp_gamma_2sfr_7b_fx; /* Q14/Q9 */ if ( EQ_16( clip_gain, 1 ) ) { size = sub( size, 30 ); @@ -2653,7 +1443,7 @@ void gain_enc_lbr_ivas_fx( } case 6: { - cdbk = gp_gamma_2sfr_6b_fx; /* Q14 / Q9 */ + cdbk = gp_gamma_2sfr_6b_fx; /* Q14/Q9 */ if ( EQ_16( clip_gain, 1 ) ) { size = sub( size, 12 ); @@ -2669,11 +1459,12 @@ void gain_enc_lbr_ivas_fx( move16(); /*aux[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ + = log2(gc_mem[0])*log10(2);*/ exp = norm_l( gc_mem[0] ); frac = Log2_norm_lc( L_shl( gc_mem[0], exp ) ); - exp = sub( sub( 30, exp ), 16 ); /*Q_format(gc_1sfr_fx)=16*/ - L_tmp1 = Mpy_32_16( exp, frac, 9864 ); /* Q16 */ + exp = sub( sub( 30, exp ), 16 ); /*Q_format(gc_1sfr_fx)=16*/ + L_tmp1 = Mpy_32_16( exp, frac, 9864 ); + move16(); /* Q16 */ aux[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ move16(); @@ -2690,8 +1481,8 @@ void gain_enc_lbr_ivas_fx( frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ gcode0 = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ + /* output of Pow2() will be: */ + /* 16384 < Pow2() <= 32767 */ exp_gcode0 = sub( exp_gcode0, 14 ); index = Find_Opt_gainQ_fx( coeff, exp_coeff, gain_pit, gain_code, gcode0, exp_gcode0, cdbk, size ); // Q0 @@ -2708,10 +1499,10 @@ void gain_enc_lbr_ivas_fx( move16(); IF( EQ_16( nBits, 7 ) ) { - cdbk = gp_gamma_3sfr_7b_fx; /* Q14 / Q9 */ - if ( EQ_16( clip_gain, 1 ) ) + cdbk = gp_gamma_3sfr_7b_fx; + if ( clip_gain == 1 ) { - size = sub( size, 28 ); + size -= 28; } } ELSE @@ -2723,13 +1514,13 @@ void gain_enc_lbr_ivas_fx( } } /* calculate predicted gain */ - aux[0] = 4096; // Q12 + aux[0] = 4096; /* 1 in Q12 */ move16(); aux[1] = shl( ctype, 12 ); move16(); /*aux[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ + = log2(gc_mem[0])*log10(2);*/ exp = norm_l( gc_mem[0] ); frac = Log2_norm_lc( L_shl( gc_mem[0], exp ) ); exp = sub( sub( 30, exp ), 16 ); /*Q_format(gc_mem[0])=16*/ @@ -2738,7 +1529,7 @@ void gain_enc_lbr_ivas_fx( move16(); /*aux[3] = (float)log10(gc_mem[1]); - = log2(gc_mem[1])*log10(2);*/ + = log2(gc_mem[1])*log10(2);*/ exp = norm_l( gc_mem[1] ); frac = Log2_norm_lc( L_shl( gc_mem[1], exp ) ); exp = sub( sub( 30, exp ), 16 ); /*Q_format(gc_mem[1])=16*/ @@ -2761,8 +1552,8 @@ void gain_enc_lbr_ivas_fx( frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ gcode0 = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ + /* output of Pow2() will be: */ + /* 16384 < Pow2() <= 32767 */ exp_gcode0 = sub( exp_gcode0, 14 ); /*----------------------------------------------------------------* @@ -2794,23 +1585,23 @@ void gain_enc_lbr_ivas_fx( index = Find_Opt_gainQ_fx( coeff, exp_coeff, gain_pit, gain_code, gcode0, exp_gcode0, cdbk, size ); - gc_mem[2] = *gain_code; /* Q16 */ + gc_mem[2] = *gain_code; // Q16 move32(); - gp_mem[2] = *gain_pit; /* Q14 */ + gp_mem[2] = *gain_pit; // Q14 move16(); } ELSE IF( EQ_16( i_subfr, 3 * L_SUBFR ) ) { - b = b_4sfr_fx; /* Q12 */ + b = b_4sfr_fx; // Q12 move16(); n_pred = 8; move16(); IF( EQ_16( nBits, 7 ) ) { - cdbk = gp_gamma_4sfr_7b_fx; /* Q14 / Q9 */ - if ( EQ_16( clip_gain, 1 ) ) + cdbk = gp_gamma_4sfr_7b_fx; + if ( clip_gain == 1 ) { - size = sub( size, 25 ); + size -= 25; } } ELSE @@ -2822,13 +1613,13 @@ void gain_enc_lbr_ivas_fx( } } /* calculate predicted gain */ - aux[0] = 4096; // Q12 + aux[0] = 4096; /* 1 in Q12 */ move16(); aux[1] = shl( ctype, 12 ); move16(); /*aux[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ + = log2(gc_mem[0])*log10(2);*/ exp = norm_l( gc_mem[0] ); frac = Log2_norm_lc( L_shl( gc_mem[0], exp ) ); exp = sub( sub( 30, exp ), 16 ); /*Q_format(gc_mem[0])=16*/ @@ -2837,7 +1628,7 @@ void gain_enc_lbr_ivas_fx( move16(); /*aux[3] = (float)log10(gc_mem[1]); - = log2(gc_mem[1])*log10(2);*/ + = log2(gc_mem[1])*log10(2);*/ exp = norm_l( gc_mem[1] ); frac = Log2_norm_lc( L_shl( gc_mem[1], exp ) ); exp = sub( sub( 30, exp ), 16 ); /*Q_format(gc_mem[1])=16*/ @@ -2846,7 +1637,7 @@ void gain_enc_lbr_ivas_fx( move16(); /*aux[4] = (float)log10(gc_mem[2]); - = log2(gc_mem[2])*log10(2);*/ + = log2(gc_mem[2])*log10(2);*/ exp = norm_l( gc_mem[2] ); frac = Log2_norm_lc( L_shl( gc_mem[2], exp ) ); exp = sub( sub( 30, exp ), 16 ); /*Q_format(gc_mem[2])=16*/ @@ -2859,19 +1650,19 @@ void gain_enc_lbr_ivas_fx( aux[6] = shr( gp_mem[1], 2 ); move16(); /*Q12*/ aux[7] = shr( gp_mem[2], 2 ); - move16(); /*Q12*/ - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, dotp(b, aux, n_pred) - * = pow(2, 3.321928*dotp(b, aux, n_pred) - *-----------------------------------------------------------------*/ + move16(); /*Q12*/ + /*-----------------------------------------------------------------* + * gcode0 = pow(10.0, dotp(b, aux, n_pred) + * = pow(2, 3.321928*dotp(b, aux, n_pred) + *-----------------------------------------------------------------*/ L_tmp = Dot_product( b, aux, n_pred ); /*Q25*/ L_tmp = Mult_32_16( L_tmp, 27213 ); /* *3.321928 in Q13 -> Q23 */ L_tmp = L_shr( L_tmp, 7 ); /* From Q23 to Q16 */ frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ gcode0 = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ + /* output of Pow2() will be: */ + /* 16384 < Pow2() <= 32767 */ exp_gcode0 = sub( exp_gcode0, 14 ); index = Find_Opt_gainQ_fx( coeff, exp_coeff, gain_pit, gain_code, gcode0, exp_gcode0, cdbk, size ); // Q0 @@ -2887,9 +1678,11 @@ void gain_enc_lbr_ivas_fx( { push_indice( hBstr, IND_GAIN, index, nBits ); } + return; } + /*-------------------------------------------------------------------* * gain_enc_amr_wb() * @@ -2901,22 +1694,21 @@ void gain_enc_lbr_ivas_fx( * mean-squared weighted error criterion is used in the quantizer search. *-------------------------------------------------------------------*/ - void gain_enc_amr_wb_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 *xn, /* i : target vector Q_xn*/ - const Word16 Q_xn, /* i : xn and yy1 format */ - const Word16 *yy1, /* i : zero-memory filtered adaptive excitation Q_xn*/ - const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ - const Word16 *code, /* i : algebraic excitation Q9*/ - const Word32 core_brate, /* i : core bitrate Q0*/ - Word16 *gain_pit, /* i/o: pitch gain / Quantized pitch gain Q14*/ - Word32 *gain_code, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ - Word16 *g_coeff, /* i/o: correlations , -2,, -2 and 2 Qx*/ - const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ - Word16 *past_qua_en /* i/o: gain quantization memory (4 words) Q10*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 *xn, /* i : target vector Q_xn*/ + const Word16 Q_xn, /* i : xn and yy1 format */ + const Word16 *yy1, /* i : zero-memory filtered adaptive excitation Q_xn*/ + const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ + const Word16 *code, /* i : algebraic excitation Q9*/ + const Word32 core_brate, /* i : core bitrate Q0*/ + Word16 *gain_pit, /* i/o: pitch gain / Quantized pitch gain Q14*/ + Word32 *gain_code, /* o : quantized codebook gain Q16*/ + Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ + Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ + Word16 *g_coeff, /* i/o: correlations , -2,, -2 and 2 Qx*/ + const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ + Word16 *past_qua_en /* i/o: gain quantization memory (4 words) Q10*/ ) { @@ -2927,15 +1719,12 @@ void gain_enc_amr_wb_fx( Word16 exp_max[5], tmp, nBits; Word32 L_tmp, dist_min, L_inov, L_tmp1; const Word16 *t_qua_gain, *p; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*----------------------------------------------------------------* * Find the initial quantization pitch index * Set gains search range *----------------------------------------------------------------*/ + IF( GE_32( core_brate, ACELP_12k65 ) ) { t_qua_gain = t_qua_gain7b_fx; // Q14 @@ -2981,6 +1770,7 @@ void gain_enc_amr_wb_fx( } nBits = 6; } + /*----------------------------------------------------------------* * Compute coefficients needed for the quantization. * @@ -2993,6 +1783,7 @@ void gain_enc_amr_wb_fx( * Product and have been computed in Adpt_enr() and * are in vector g_coeff[]. *----------------------------------------------------------------*/ + coeff[0] = g_coeff[0]; move16(); exp_coeff[0] = g_coeff[1]; @@ -3026,6 +1817,7 @@ void gain_enc_amr_wb_fx( * L_tmp = MEAN_ENER - 10log10(energy of code/ L_subfr) * = MEAN_ENER - 3.0103*log2(energy of code/ L_subfr) *----------------------------------------------------------------*/ + L_tmp = Dot_product12( code, code, L_SUBFR, &exp_code ); L_inov = L_add( L_tmp, 0 ); /* exp_code: -18 (code in Q9), -6 (/L_subfr), -31 (L_tmp Q31->Q0) */ @@ -3045,6 +1837,7 @@ void gain_enc_amr_wb_fx( /*----------------------------------------------------------------* * predicted codebook gain *----------------------------------------------------------------*/ + L_tmp = L_shl( L_tmp, 10 ); /* From Q14 to Q24 */ L_tmp = L_mac0( L_tmp, pred_gain_fx[0], past_qua_en[0] ); /* Q14*Q10 -> Q24 */ L_tmp = L_mac0( L_tmp, pred_gain_fx[1], past_qua_en[1] ); /* Q14*Q10 -> Q24 */ @@ -3162,7 +1955,7 @@ void gain_enc_amr_wb_fx( L_tmp = L_mac( L_tmp, coeff[3], g_code ); /* 15 - coeff_exp + 13 - 1 */ L_tmp = L_mac( L_tmp, coeff[4], g_pit_cod ); /* 15 - coeff_exp + 13 - 1 */ - L_tmp1 = L_sub_o( L_tmp, dist_min, &Overflow ); + L_tmp1 = L_sub_sat( L_tmp, dist_min ); /* splitting the if cost half the complexity of using IF macro */ if ( L_tmp1 < 0 ) { @@ -3184,10 +1977,9 @@ void gain_enc_amr_wb_fx( g_code = *p++; /* selected code gain in Q11 */ move16(); - L_tmp = L_mult( g_code, gcode0 ); /* Q11*Q0 -> Q12 */ - L_tmp = L_shl_o( L_tmp, add( exp_gcode0, 4 ), &Overflow ); /* Q12 -> Q16 */ - - *gain_code = L_tmp; /* gain of code in Q16 */ + L_tmp = L_mult( g_code, gcode0 ); /* Q11*Q0 -> Q12 */ + L_tmp = L_shl_sat( L_tmp, add( exp_gcode0, 4 ) ); /* Q12 -> Q16 */ + *gain_code = L_tmp; /* gain of code in Q16 */ move16(); /*---------------------------------------------------* @@ -3223,7 +2015,7 @@ void gain_enc_amr_wb_fx( *norm_gain_code = L_shr( Mult_32_16( *gain_code, tmp ), sub( 1, exp ) ); // Q16 move32(); - push_indice_fx( hBstr, IND_GAIN, index, nBits ); + push_indice( hBstr, IND_GAIN, index, nBits ); return; } diff --git a/lib_enc/gaus_enc_fx.c b/lib_enc/gaus_enc_fx.c index f943b104d5ba4e27f3e0b7bbac7061463fd111f4..5c53881cd0943f595f435c5d628ce3646b1cfbb2 100644 --- a/lib_enc/gaus_enc_fx.c +++ b/lib_enc/gaus_enc_fx.c @@ -1,15 +1,15 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "rom_enc.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ -//#include "basop_mpy.h" + /*-------------------------------------------------------------------* * Local constants @@ -19,6 +19,7 @@ /* #define FAC_DELTA 16.0f */ #define SFAC_DELTA 11 + /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ @@ -27,7 +28,6 @@ static Word16 cod_2pos_fx( const Word16 ind1, const Word16 ind2, const Word16 si static void gauss2v_fx( BSTR_ENC_HANDLE hBstr, const Word16 h[], const Word16 xn[], const Word16 dn[], Word16 code[], Word16 y1[], Word32 *gain, const Word16 lg, const Word16 shift, const Word16 Q_new, const Word16 nb_bits ); -static void gauss2v_ivas_fx( BSTR_ENC_HANDLE hBstr, const Word16 h[], const Word16 xn[], const Word16 dn[], Word16 code[], Word16 y1[], Word32 *gain, const Word16 lg, const Word16 shift, const Word16 Q_new, const Word16 nb_bits ); /*-------------------------------------------------------------------* * Gaus_encode @@ -40,22 +40,22 @@ static void gauss2v_ivas_fx( BSTR_ENC_HANDLE hBstr, const Word16 h[], const Word *-------------------------------------------------------------------*/ Word16 gaus_encode_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 *h1, /* i : weighted filter input response Q14*/ - const Word16 *xn, /* i : target vector Q12*/ - Word16 *exc, /* o : pointer to excitation signal frame Q_new*/ - Word16 *mem_w0, /* o : weighting filter denominator memory Q_new*/ - Word16 *clip_gain, /* o : memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ - Word16 *tilt_code, /* o : synthesis excitation spectrum tilt Q15*/ - Word16 *code, /* o : algebraic excitation Q9*/ - Word32 *gain_code, /* o : Code gain. Q16*/ - Word16 *y2, /* o : zero-memory filtered adaptive excitation Q9*/ - Word16 *gain_inov, /* o : innovation gain Q12*/ - Word16 *voice_fac, /* o : voicing factor Q15*/ - Word16 *gain_pit, /* o : adaptive excitation gain Q14*/ - const Word16 Q_new, /* i : scaling factor */ - const Word16 shift, /* i : scaling factor */ - Word32 *norm_gain_code /* o : normalized innovative cb. gain Q16*/ + const Word16 i_subfr, /* i : subframe index Q0*/ + const Word16 *h1, /* i : weighted filter input response Q14*/ + const Word16 *xn, /* i : target vector Q12*/ + Word16 *exc, /* o : pointer to excitation signal frame Q_new*/ + Word16 *mem_w0, /* o : weighting filter denominator memory Q_new*/ + Word16 *clip_gain, /* o : memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ + Word16 *tilt_code, /* o : synthesis excitation spectrum tilt Q15*/ + Word16 *code, /* o : algebraic excitation Q9*/ + Word32 *gain_code, /* o : Code gain. Q16*/ + Word16 *y2, /* o : zero-memory filtered adaptive excitation Q9*/ + Word16 *gain_inov, /* o : innovation gain Q12*/ + Word16 *voice_fac, /* o : voicing factor Q15*/ + Word16 *gain_pit, /* o : adaptive excitation gain Q14*/ + const Word16 Q_new, /* i : scaling factor */ + const Word16 shift, /* i : scaling factor */ + Word32 *norm_gain_code /* o : normalized innovative cb. gain Q16*/ ) { Word16 nb_bits, idx; @@ -63,10 +63,6 @@ Word16 gaus_encode_fx( Word32 Ltmp; Word16 dn[L_SUBFR], exp_code, gcode; /* Correlation between xn and h1 */ Word16 exp, tmp, tmp_idx; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*----------------------------------------------------------------* * Encode gaussian excitation @@ -90,116 +86,20 @@ Word16 gaus_encode_fx( exp_code = sub( exp_code, 18 + 6 ); /* exp: -18 (code in Q9), -6 (L_subfr = 64) */ Ltmp = Isqrt_lc( Ltmp, &exp_code ); - *gain_inov = extract_h( L_shl( Ltmp, sub( exp_code, 3 ) ) ); /* g_code_inov in Q12 */ + *gain_inov = extract_h( L_shl_sat( Ltmp, sub( exp_code, 3 ) ) ); /* g_code_inov in Q12 */ nb_bits = st_fx->acelp_cfg.gains_mode[tmp_idx]; /* Q0 */ move16(); /* low bound = -30; stepSize = 1.71875; inv_stepSize = 0.5818181 */ idx = gain_enc_gaus_fx( gain_code, nb_bits, -7680, 28160, 19065 ); /* Q0 */ - push_indice_fx( st_fx->hBstr, IND_GAIN, idx, nb_bits ); + push_indice( st_fx->hBstr, IND_GAIN, idx, nb_bits ); /*----------------------------------------------------------------* * Total excitation for Unvoiced coders *----------------------------------------------------------------*/ - gcode = round_fx_o( L_shl_o( *gain_code, Q_new, &Overflow ), &Overflow ); /* scaled gain_code with Qnew */ - FOR( i = 0; i < L_SUBFR; i++ ) - { - exc[i + i_subfr] = round_fx( L_shl( L_mult( gcode, code[i] ), 15 - 9 ) ); /* Q_new */ - } - - /*----------------------------------------------------------------* - * Updates: last value of new target is stored in mem_w0 - *----------------------------------------------------------------*/ - - Ltmp = L_mult( gcode, y2[L_SUBFR - 1] ); /* Q_new + 10 */ - Ltmp = L_shl( Ltmp, add( 5, shift ) ); /* Q_new + 15 + shift */ - Ltmp = L_negate( Ltmp ); - Ltmp = L_mac( Ltmp, xn[L_SUBFR - 1], 16384 ); /* Q_new + 15 + shift */ - Ltmp = L_shl_sat( Ltmp, sub( 1, shift ) ); /* Q_new + 16 */ - *mem_w0 = round_fx_sat( Ltmp ); /* Q_new */ - move16(); - init_gp_clip_fx( clip_gain ); /* reset pitch clipping parameters */ - - *gain_pit = 0; - *tilt_code = 0; - move16(); /* purely unvoiced */ - *voice_fac = -32768; /* -1 in Q31 */ - move16(); /* purely unvoiced */ - exp = sub( norm_s( *gain_inov ), 1 ); - exp = s_max( exp, 0 ); - - tmp = div_s( shr( 8192, exp ), *gain_inov ); - *norm_gain_code = L_shr( Mult_32_16( *gain_code, tmp ), sub( 1, exp ) ); /* Q16 */ - move16(); - - return ( L_SUBFR << 6 ); -} - -Word16 gaus_encode_ivas_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 *h1, /* i : weighted filter input response Q14*/ - const Word16 *xn, /* i : target vector Q12*/ - Word16 *exc, /* o : pointer to excitation signal frame Q_new*/ - Word16 *mem_w0, /* o : weighting filter denominator memory Q_new*/ - Word16 *clip_gain, /* o : memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ - Word16 *tilt_code, /* o : synthesis excitation spectrum tilt Q15*/ - Word16 *code, /* o : algebraic excitation Q9*/ - Word32 *gain_code, /* o : Code gain. Q16*/ - Word16 *y2, /* o : zero-memory filtered adaptive excitation Q9*/ - Word16 *gain_inov, /* o : innovation gain Q12*/ - Word16 *voice_fac, /* o : voicing factor Q15*/ - Word16 *gain_pit, /* o : adaptive excitation gain Q14*/ - const Word16 Q_new, /* i : scaling factor */ - const Word16 shift, /* i : scaling factor */ - Word32 *norm_gain_code /* o : normalized innovative cb. gain Q16*/ -) -{ - Word16 nb_bits, idx; - Word16 i = 0; - move16(); - Word32 Ltmp; - Word16 dn[L_SUBFR], exp_code, gcode; /* Correlation between xn and h1 */ - Word16 exp, tmp, tmp_idx; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - /*----------------------------------------------------------------* - * Encode gaussian excitation - *----------------------------------------------------------------*/ - - /* Correlation between target xn2[] and impulse response h1[] */ - corr_xh_fx( xn, dn, h1 ); - - tmp_idx = shr( i_subfr, 6 ); - nb_bits = st_fx->acelp_cfg.fixed_cdk_index[tmp_idx]; /* Q0 */ - move16(); - - gauss2v_ivas_fx( st_fx->hBstr, h1, xn, dn, code, y2, gain_code, L_SUBFR, shift, Q_new, shr( nb_bits, 1 ) ); - - /*----------------------------------------------------------------* - * Encode gaussian gain - *----------------------------------------------------------------*/ - /* codeword energy computation */ - Ltmp = Dot_product12( code, code, L_SUBFR, &exp_code ); - - exp_code = sub( exp_code, 18 + 6 ); /* exp: -18 (code in Q9), -6 (L_subfr = 64) */ - Ltmp = Isqrt_lc( Ltmp, &exp_code ); - *gain_inov = extract_h( L_shl( Ltmp, sub( exp_code, 3 ) ) ); /* g_code_inov in Q12 */ - - nb_bits = st_fx->acelp_cfg.gains_mode[tmp_idx]; /* Q0 */ - move16(); - /* low bound = -30; stepSize = 1.71875; inv_stepSize = 0.5818181 */ - idx = gain_enc_gaus_fx( gain_code, nb_bits, -7680, 28160, 19065 ); /* Q0 */ - push_indice( st_fx->hBstr, IND_GAIN, idx, nb_bits ); + gcode = round_fx_sat( L_shl_sat( *gain_code, Q_new ) ); /* scaled gain_code with Qnew */ - /*----------------------------------------------------------------* - * Total excitation for Unvoiced coders - *----------------------------------------------------------------*/ - gcode = round_fx_o( L_shl_o( *gain_code, Q_new, &Overflow ), &Overflow ); /* scaled gain_code with Qnew */ FOR( i = 0; i < L_SUBFR; i++ ) { exc[i + i_subfr] = round_fx( L_shl( L_mult( gcode, code[i] ), 15 - 9 ) ); /* Q_new */ @@ -221,7 +121,7 @@ Word16 gaus_encode_ivas_fx( *gain_pit = 0; *tilt_code = 0; move16(); /* purely unvoiced */ - *voice_fac = -32768; /* -1 in Q15 */ + *voice_fac = -32768; /* -1 in Q31 */ move16(); /* purely unvoiced */ exp = sub( norm_s( *gain_inov ), 1 ); exp = s_max( exp, 0 ); @@ -292,10 +192,6 @@ void gauss2v_fx( Word16 gxx, gcc, index_delta, delta, m_sign, inv_delta; Word16 hg[190], Gaus_dico2[190]; Word16 shiftP3; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*----------------------------------------------------------------* * Encode the tilt of gaussian excitation @@ -362,8 +258,8 @@ void gauss2v_fx( exp_den = norm_l( Lden ); Den = extract_h( L_shl( Lden, exp_den ) ); - delta = shr_o( div_s( Num, Den ), sub( exp_num, exp_den ), &Overflow ); /* Q15 */ - delta = i_mult2( delta, m_sign ); /* Apply sign Q0*/ + delta = shr_sat( div_s( Num, Den ), sub( exp_num, exp_den ) ); /* Q15 */ + delta = i_mult2( delta, m_sign ); /* Apply sign Q0*/ /* index_delta = (short)(FAC_DELTA * fdelta) */ index_delta = shr( delta, SFAC_DELTA ); @@ -525,8 +421,8 @@ void gauss2v_fx( cor2_norm = norm_l( cor2 ); eneri_norm = norm_l( eneri ); - cor2_mantissa = round_fx_o( L_shl_o( cor2, cor2_norm, &Overflow ), &Overflow ); - eneri_mantissa = round_fx_o( L_shl_o( eneri, eneri_norm, &Overflow ), &Overflow ); + cor2_mantissa = round_fx_sat( L_shl_sat( cor2, cor2_norm ) ); + eneri_mantissa = round_fx_sat( L_shl_sat( eneri, eneri_norm ) ); difference_norm = sub( add( cor2_norm, enerw_norm ), add( cor2w_norm, eneri_norm ) ); update_best = 0; @@ -638,8 +534,8 @@ void gauss2v_fx( idx = cod_2pos_fx( i, j, sign1, sign2, nvec ); /* Q0 */ move16(); - push_indice_fx( hBstr, IND_GAUS_CDBK_INDEX, idx, 2 * nb_bits + 1 ); - push_indice_fx( hBstr, IND_TILT_FACTOR, index_delta, 3 ); + push_indice( hBstr, IND_GAUS_CDBK_INDEX, idx, 2 * nb_bits + 1 ); + push_indice( hBstr, IND_TILT_FACTOR, index_delta, 3 ); /*----------------------------------------------------------------* * Find quantized gain @@ -695,487 +591,22 @@ void gauss2v_fx( /* Gain must be output in a 32-bit variable as a Q16 */ /* Compensate for Q_new */ - *gain = L_shl_o( Portion, sub( 13, Q_new ), &Overflow ); /* Q16 */ + *gain = L_shl_sat( Portion, sub( 13, Q_new ) ); /* Q16 */ move32(); return; } -void gauss2v_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - const Word16 h[], /* i : weighted LP filter impulse response Q15 */ - const Word16 xn[], /* i : target signal Q12 */ - const Word16 dn[], /* i : backward filtered target Q12 */ - Word16 code[], /* o : gaussian excitation Q9 */ - Word16 y1[], /* o : zero-memory filtered gauss. excitation Q8 */ - Word32 *gain, /* o : excitation gain. 32-bit number in Q16 */ - const Word16 lg, /* i : subframe size Q0 */ - const Word16 shift, /* i : Scaling factor Q0 */ - const Word16 Q_new, /* i : Scaling factor Q0 */ - const Word16 nb_bits /* i : nb ob bits per track (max 6) */ -) -{ - Word16 i, j, ind1, ind2; - Word16 nvec, step; - Word32 cor, cora, dotprod; - Word16 enerw; - Word32 eneri, cor2; - Word32 enerw32, cor2w32; - Word16 *cpt1; - Word16 *pt1, *pt2; - Word32 max_val[NMAX + 1]; - Word16 *pos[NMAX + 1]; - Word32 sign[NMAX + 1]; - Word32 ener[NMAX + 1], corr[NMAX + 1], ener1; - Word16 dico2[L_SUBFR * NMAX]; - Word16 exp_num; - Word16 exp_den; - Word16 Num; - Word16 Den; - Word32 GainPortion1; - Word32 GainPortion2; - Word32 cor_abs; - Word16 cor_neg; - Word16 div_result; - Word32 ener_sqrt; - Word32 Portion; - Word16 sign1, sign2; - Word16 enerw_norm, enerw_mantissa; - Word16 cor2w_norm, cor2w_mantissa; - Word16 eneri_norm, eneri_mantissa; - Word16 cor2_norm, cor2_mantissa; - Word16 difference_norm; - Word32 cor32; /* 32-bit intermediate value*/ - Word16 hi1, lo1; - Word16 update_best; - Word16 idx; - Word32 Lc0, Lc1, Lnum, Lden; - Word16 gxx, gcc, index_delta, delta, m_sign, inv_delta; - Word16 hg[190], Gaus_dico2[190]; - Word16 shiftP3; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - /*----------------------------------------------------------------* - * Encode the tilt of gaussian excitation - *----------------------------------------------------------------*/ - - /* Compute spectral tilt of target */ - Lc0 = L_mult( xn[1], xn[1] ); - Lc1 = L_mult( xn[1], xn[0] ); - FOR( i = 2; i < L_SUBFR; i++ ) - { - /* fc0 += xn[i]*xn[i] */ - /* fc1 += xn[i]*xn[i-1] */ - Lc0 = L_mac_sat( Lc0, xn[i], xn[i] ); - Lc1 = L_mac_sat( Lc1, xn[i], xn[i - 1] ); - } - /* fgxx = fc1/fc0 */ - exp_num = sub( norm_l( Lc1 ), 1 ); - Num = extract_h( L_shl( Lc1, exp_num ) ); - m_sign = s_or( shr( Num, 16 ), 1 ); /* Remove sign */ - Num = abs_s( Num ); - Lc0 = L_max( Lc0, 1 ); - exp_den = norm_l( Lc0 ); - Den = extract_h( L_shl( Lc0, exp_den ) ); - gxx = shr( div_s( Num, Den ), sub( exp_num, sub( exp_den, 2 ) ) ); /* Q13 */ - gxx = i_mult2( gxx, m_sign ); /* Apply sign */ - - set16_fx( hg, 0, 190 ); /* Compute spectral tilt of filtered codebook */ - Copy( h, hg, L_SUBFR ); - conv_fx( gaus_dico_fx, hg, Gaus_dico2, 190 ); - - Lc0 = L_mult( Gaus_dico2[1], Gaus_dico2[1] ); - Lc1 = L_mult( Gaus_dico2[1], Gaus_dico2[0] ); - FOR( i = 2; i < 190; i++ ) - { - /* fc0 += fgaus_dico2[i]*fgaus_dico2[i] */ - /* fc1 += fgaus_dico2[i]*fgaus_dico2[i-1] */ - Lc0 = L_mac( Lc0, Gaus_dico2[i], Gaus_dico2[i] ); - Lc1 = L_mac( Lc1, Gaus_dico2[i], Gaus_dico2[i - 1] ); - } - - /* fgcc = fc1/fc0 */ - - exp_num = sub( norm_l( Lc1 ), 1 ); - Num = extract_h( L_shl( Lc1, exp_num ) ); - m_sign = s_or( shr( Num, 16 ), 1 ); /* Remove sign */ - Num = abs_s( Num ); - - Lc0 = L_max( Lc0, 1 ); - exp_den = norm_l( Lc0 ); - Den = extract_h( L_shl( Lc0, exp_den ) ); - gcc = shr( div_s( Num, Den ), sub( exp_num, sub( exp_den, 2 ) ) ); /* Q13 */ - gcc = i_mult2( gcc, m_sign ); /* Apply sign */ - - /* fdelta = (1-fgcc*fgxx) / (2*fgcc+fgxx) Compute and quantize spectral tilt modification factor */ - Lnum = L_sub( 134217728L, L_mult( gcc, gxx ) ); /* Q30 */ - Lden = L_mac( L_mult( gxx, 8192 ), gcc, 16384 ); /* Q30 */ - - exp_num = sub( norm_l( Lnum ), 1 ); - Num = extract_h( L_shl( Lnum, exp_num ) ); - m_sign = s_or( shr( Num, 16 ), 1 ); /* Remove sign */ - Num = abs_s( Num ); - - Lden = L_max( Lden, 1 ); - exp_den = norm_l( Lden ); - Den = extract_h( L_shl( Lden, exp_den ) ); - - delta = shr_o( div_s( Num, Den ), sub( exp_num, exp_den ), &Overflow ); /* Q15 */ - delta = i_mult2( delta, m_sign ); /* Apply sign */ - /* index_delta = (short)(FAC_DELTA * fdelta) */ - index_delta = shr( delta, SFAC_DELTA ); - - /* index_delta [0,7] */ - index_delta = s_max( index_delta, 0 ); - index_delta = s_min( index_delta, 7 ); - - /* fdelta = STEP_DELTA * (float)index_delta */ - delta = shl( index_delta, 11 ); /* delta in Q15 */ - - IF( delta > 0 ) /* Adapt spectral tilt of initial codebook */ - { - /* Computation of 1 / (1+fdelta*fdelta) */ - inv_delta = inv_delta_tab[sub( index_delta, 1 )]; - move16(); /* Q15 */ - - /* fgaus_dico2[0] = gaus_dico[0] */ - Gaus_dico2[0] = gaus_dico_fx[0]; - move16(); - FOR( i = 1; i < 190; i++ ) - { - /* fgaus_dico2[i] = (gaus_dico[i] - fdelta*gaus_dico[i-1]) / (1 + fdelta*fdelta) */ - Lnum = L_msu( L_deposit_h( gaus_dico_fx[i] ), delta, gaus_dico_fx[i - 1] ); - Gaus_dico2[i] = round_fx( Mpy_32_16_1( Lnum, inv_delta ) ); - move16(); - } - } - ELSE - { - FOR( i = 0; i < 190; i++ ) - { - /* fgaus_dico2[i] = gaus_dico[i] */ - Gaus_dico2[i] = gaus_dico_fx[i]; - move16(); - } - } - - /*----------------------------------------------------------------* - * Initializations - *----------------------------------------------------------------*/ - - ind1 = 0; - move16(); - ind2 = 0; - move16(); - - nvec = shl( 1, nb_bits ); - step = shr( 0x80, nb_bits ); - - /*----------------------------------------------------------------* - * dot product between dn and gaussian codevectors, - * keep NMAX best vectors - *----------------------------------------------------------------*/ - - set32_fx( max_val, 0, NMAX + 1 ); - set32_fx( sign, 0, NMAX + 1 ); - - FOR( i = 0; i < NMAX + 1; i++ ) - { - pos[i] = (Word16 *) Gaus_dico2; - } - - cpt1 = Gaus_dico2; - move16(); - - FOR( i = 0; i < nvec; i++ ) - { - /* Dot product without normalization, because values are compared with each other afterwards. */ - cor = Dot_product( cpt1, dn, lg ); /* Q12 * Q12 * length of 64 + 1 left shift ==> Q31*/ - cora = L_abs( cor ); - j = NMAX - 1; - move16(); - - DO - { - IF( GE_32( cora, max_val[j] ) ) - { - max_val[j + 1] = max_val[j]; - move32(); /*Q31*/ - pos[j + 1] = pos[j]; - move16(); /*Pointer*/ - sign[j + 1] = sign[j]; - move32(); /*Q31*/ - max_val[j] = cora; - move32(); /*Q31*/ - pos[j] = cpt1; - move16(); /*Pointer*/ - sign[j] = cor; - move32(); /*Q31*/ - } - j--; - } - WHILE( j >= 0 ); - cpt1 += step; - } - - /*----------------------------------------------------------------* - * filter selected vectors - * put sign - * compute energy - *----------------------------------------------------------------*/ - - pt1 = dico2; - move16(); - FOR( i = 0; i < NMAX; i++ ) - { - /* Input vector (pos) Q12, filter coefs in Q15, result in same format as input vector (Q12) */ - conv_fx( pos[i], h, pt1, lg ); - - /* put sign and compute energy */ - IF( sign[i] < 0 ) - { - FOR( j = 0; j < lg; j++ ) - { - pt1[j] = negate( pt1[j] ); - move16(); /*Store into dico2*/ - } - } - ener[i] = Dot_product( pt1, pt1, lg ); /* pt1 points to filtered vector in dico2, in Q12 */ - move32(); /* Result is for Q12 * Q12 with length of 64 (6 bits) + 1 left shift => Q31 */ - corr[i] = Dot_product( pt1, xn, lg ); /* must be equal to sign[i] !! */ - move32(); /* pt1 points into dico2, in Q12. xn is in Q12 */ - /* Result is for Q12 * Q12 with length of 64 (6 bits) + 1 left shift => Q31 */ - pt1 += L_SUBFR; - } - - /*------------------------------------------------------------------------* - * try all combinations of NMAX best vectors - *------------------------------------------------------------------------*/ - - pt1 = dico2; - move16(); - - /* Initial values for search algorithm */ - enerw32 = L_deposit_h( 0x80 ); - cor2w32 = L_deposit_l( -2 ); - enerw_norm = norm_l( enerw32 ); - cor2w_norm = norm_l( cor2w32 ); - cor2w_mantissa = round_fx( L_shl( cor2w32, cor2w_norm ) ); - enerw_mantissa = round_fx( L_shl( enerw32, enerw_norm ) ); - - FOR( i = 0; i < NMAX; i++ ) - { - pt2 = pt1; - move16(); - FOR( j = i; j < NMAX; j++ ) - { - cor32 = L_add( corr[i], corr[j] ); /* Q31 */ - - dotprod = Dot_product( pt1, pt2, lg ); /* Q12 * Q12 * length of 64 + 1 left shift ==> Q31 */ - - /* eneri = round_fx(ener[i]) + round_fx(ener[j]) + 2*round_fx(dotprod) */ - /* Use ScalingShift to stay aligned with ener[] */ - eneri = L_shl( dotprod, 1 ); /* One left shift added for factor of 2 */ -#ifndef FIX_1298 - eneri = L_add( ener[i], eneri ); - eneri = L_add( ener[j], eneri ); /* Q31 */ -#else - eneri = L_add_sat( ener[i], eneri ); - eneri = L_add_sat( ener[j], eneri ); /* Q31 */ -#endif - lo1 = L_Extract_lc( cor32, &hi1 ); - cor2 = Sad_32( 0, hi1, lo1 ); /* Square + Add */ - - cor2_norm = norm_l( cor2 ); - eneri_norm = norm_l( eneri ); - cor2_mantissa = round_fx_o( L_shl_o( cor2, cor2_norm, &Overflow ), &Overflow ); - eneri_mantissa = round_fx_o( L_shl_o( eneri, eneri_norm, &Overflow ), &Overflow ); - difference_norm = sub( add( cor2_norm, enerw_norm ), add( cor2w_norm, eneri_norm ) ); - - update_best = 0; - move16(); - - IF( difference_norm > 0 ) - { - if ( GT_32( L_shr( L_mult( cor2_mantissa, enerw_mantissa ), difference_norm ), - L_mult( cor2w_mantissa, eneri_mantissa ) ) ) - { - update_best = 1; - move16(); - } - } - ELSE - { - if ( L_msu_sat( L_shl( L_mult( cor2w_mantissa, eneri_mantissa ), difference_norm ), cor2_mantissa, enerw_mantissa ) < 0 ) // Saturation to be revisited - { - update_best = 1; - move16(); - } - } - IF( update_best != 0 ) - { - cor2w_mantissa = cor2_mantissa; - move16(); - cor2w_norm = cor2_norm; - move16(); - enerw_mantissa = eneri_mantissa; - move16(); - enerw_norm = eneri_norm; - move16(); - ind1 = i; - move16(); - ind2 = j; - move16(); - } - pt2 += L_SUBFR; - } - pt1 += L_SUBFR; - } - - enerw = round_fx( L_shr( L_deposit_h( enerw_mantissa ), enerw_norm ) ); - - /*----------------------------------------------------------------* - * Compute zero-memory filtered gauss. excitation y - *----------------------------------------------------------------*/ - - pt1 = dico2 + ind1 * L_SUBFR; - move16(); /*Pointer arithmetic*/ - pt2 = dico2 + ind2 * L_SUBFR; - move16(); - - shiftP3 = add( shift, 3 ); - FOR( i = 0; i < lg; i++ ) - { - /* Sum of 2 Q12 values, must give a Q1.8 */ - y1[i] = shr( add( pt1[i], pt2[i] ), shiftP3 ); - move16(); /* Compensate for "shift" */ - } - - /*----------------------------------------------------------------* - * signs of vectors - *----------------------------------------------------------------*/ - - sign1 = ( -32768 ); - move16(); - if ( sign[ind1] >= 0 ) - { - sign1 = 32767; - move16(); - } - - sign2 = ( -32768 ); - move16(); - if ( sign[ind2] >= 0 ) - { - sign2 = 32767; - move16(); - } - - /*----------------------------------------------------------------* - * Compute code - *----------------------------------------------------------------*/ - - pt1 = pos[ind1]; - move16(); /* Points to gaussian vector (gaus_dico_fx) in Q12 */ - pt2 = pos[ind2]; - move16(); /* Points to gaussian vector (gaus_dico_fx) in Q12 */ - - /* sign[ind1] and sign[ind2] */ - FOR( i = 0; i < lg; i++ ) - { - /* code[i]=(pt1[i]*sign1 + pt2[i]*sign2) /8 */ - /* Division by 8 (shift by 3) is for scaling (Q12 to Q0.9 output) */ - code[i] = shr( add( mult( pt1[i], sign1 ), mult( pt2[i], sign2 ) ), 3 ); - move16(); - } - - cor = L_add( corr[ind1], corr[ind2] ); - - /*----------------------------------------------------------------* - * Compute index - *----------------------------------------------------------------*/ - - i = (Word16) ( ( pos[ind1] - Gaus_dico2 ) / step ); /* Division by step can be replaced by shift. Pointer arithmetic */ - j = (Word16) ( ( pos[ind2] - Gaus_dico2 ) / step ); /* Division by step can be replaced by shift. Pointer arithmetic */ - - idx = cod_2pos_fx( i, j, sign1, sign2, nvec ); - move16(); - - push_indice( hBstr, IND_GAUS_CDBK_INDEX, idx, 2 * nb_bits + 1 ); - push_indice( hBstr, IND_TILT_FACTOR, index_delta, 3 ); - - /*----------------------------------------------------------------* - * Find quantized gain - *----------------------------------------------------------------*/ - - /* Divide cor/enerw: intermediate result stored into GainPortion1 */ - cor_neg = 0; - move16(); - if ( cor < 0 ) /* Make Num positive. */ - { - cor_neg = 1; - move16(); - } - cor_abs = L_abs( cor ); - - exp_num = sub( norm_l( cor_abs ), 1 ); - exp_den = norm_s( enerw ); - Num = round_fx( L_shl( cor_abs, exp_num ) ); - Den = shl( enerw, exp_den ); - - GainPortion1 = L_deposit_l( 0 ); /* Unexpected division by zero. Eliminate this gain contribution */ - IF( Den != 0 ) /* Protection against division by zero */ - { - div_result = div_s( Num, Den ); /* Q15 */ - IF( cor_neg != 0 ) - { - div_result = negate( div_result ); /* Retrieve sign */ - } - /* Re-scale to compensate for normalization*/ - GainPortion1 = L_shr( L_deposit_l( div_result ), sub( exp_num, exp_den ) ); - } - - ener1 = Dot_product( xn, xn, lg ); /* Q12 * Q12 * length of 64 + 1 left shift ==> Q31 */ - - exp_num = sub( norm_s( enerw ), 1 ); - exp_den = norm_l( ener1 ); - Num = shl( enerw, exp_num ); - Den = round_fx_sat( L_shl_sat( ener1, exp_den ) ); - GainPortion2 = L_deposit_l( 0 ); /* Unexpected division by zero. Eliminate this gain contribution */ - IF( Den != 0 ) /* Protection against division by zero */ - { - div_result = div_s( Num, Den ); /* Q15 */ - - /* Re-scale to compensate for normalization*/ - GainPortion2 = L_shr_sat( L_deposit_l( div_result ), sub( exp_num, exp_den ) ); - } - - ener_sqrt = Isqrt( L_shl_sat( GainPortion2, 1 ) ); /* Make value a Q16 prior to division (align on power of 4) */ - ener_sqrt = L_shr( ener_sqrt, 8 ); /* Left-shift Q23 result to make a Q15 result */ - - Portion = Mult_32_16( GainPortion1, 19661 ); /* Performs GainPortion1*.6 */ - Portion = Madd_32_16( Portion, ener_sqrt, 13107 ); /* Performs ener_sqrt*.4 */ - - /* Gain must be output in a 32-bit variable as a Q16 */ - /* Compensate for Q_new */ - *gain = L_shl_o( Portion, sub( 13, Q_new ), &Overflow ); - move32(); - - return; -} /*---------------------------------------------------------------------* * Put selected codevector positions and signs into quantization index *---------------------------------------------------------------------*/ -static Word16 cod_2pos_fx( /* o : codebook quantization index */ - const Word16 ind1, /* i : index of 1st gaussian vector Q0*/ - const Word16 ind2, /* i : index of 2nd gaussian vector Q0*/ - const Word16 sign1, /* i : sign of 1st gaussian vector Qx*/ - const Word16 sign2, /* i : sign of 2nd gaussian vector Qx*/ - const Word16 n /* i : nb. of codebook vectors Q0*/ +static Word16 cod_2pos_fx( /* o : codebook quantization index */ + const Word16 ind1, /* i : index of 1st gaussian vector Q0*/ + const Word16 ind2, /* i : index of 2nd gaussian vector Q0*/ + const Word16 sign1, /* i : sign of 1st gaussian vector Qx*/ + const Word16 sign2, /* i : sign of 2nd gaussian vector Qx*/ + const Word16 n /* i : nb. of codebook vectors Q0*/ ) { Word16 i1, i2, index, s1, s2; diff --git a/lib_enc/gp_clip_fx.c b/lib_enc/gp_clip_fx.c index d7614473b32a086f9d0171d2ae510f9d5f941316..d565fea0cac33f830efc20e7992439704c43dfad 100644 --- a/lib_enc/gp_clip_fx.c +++ b/lib_enc/gp_clip_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -68,7 +68,7 @@ * Pitch Gain clipping initializations *-------------------------------------------------------------------*/ void init_gp_clip_fx( - Word16 mem[] /* o : memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ + Word16 mem[] /* o : memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ ) { mem[0] = DIST_ISF_MAX; @@ -114,10 +114,6 @@ Word16 gp_clip_fx( Word32 ener; Word32 L_tmp; Word16 thres; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif clip = 0; move16(); @@ -142,10 +138,10 @@ Word16 gp_clip_fx( } } - ener = L_mac_o( 1L, xn[0], xn[0], &Overflow ); + ener = L_mac_sat( 1L, xn[0], xn[0] ); FOR( i = 1; i < L_SUBFR; i++ ) { - ener = L_mac_o( ener, xn[i], xn[i], &Overflow ); + ener = L_mac_sat( ener, xn[i], xn[i] ); } /* ener = 10.0f*(float)log10(ener) */ @@ -276,10 +272,10 @@ void gp_clip_test_isf_fx( *-------------------------------------------------------------------*/ void gp_clip_test_gain_pit_fx( - const Word16 element_mode, /* i : element mode Q0*/ - const Word32 core_brate, /* i : core bitrate Q0*/ - const Word16 gain_pit, /* i : gain of quantized pitch Q14*/ - Word16 mem[] /* i/o: memory of gain of pitch clipping algorithm 1Q14*/ + const Word16 element_mode, /* i : element mode Q0*/ + const Word32 core_brate, /* i : core bitrate Q0*/ + const Word16 gain_pit, /* i : gain of quantized pitch Q14*/ + Word16 mem[] /* i/o: memory of gain of pitch clipping algorithm 1Q14*/ ) { Word16 gain; @@ -334,10 +330,7 @@ Word16 Mode2_gp_clip_fx( Word16 clip, tmp, exp_xn; Word16 i; Word32 wener, Ltmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + move16(); clip = 0; @@ -355,7 +348,7 @@ Word16 Mode2_gp_clip_fx( FOR( i = 0; i < L_subfr; i++ ) { - wener = L_mac0_o( wener, xn[i], xn[i], &Overflow ); + wener = L_mac0_sat( wener, xn[i], xn[i] ); } /*wener = 10.0f*(float)log10(wener);*/ @@ -423,10 +416,10 @@ Word16 Mode2_gp_clip_fx( * check the minimum distance of LSFs for pitch gain clipping flag *-------------------------------------------------------------------*/ void gp_clip_test_lsf_fx( - const Word16 element_mode, /* i : element mode Q0*/ - const Word16 lsf[], /* i : lsf values (in frequency domain) 14Q1*1.28*/ - Word16 mem[], /* i/o: memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ - const Word16 m /* i : dimension of lsf Q0*/ + const Word16 element_mode, /* i : element mode Q0*/ + const Word16 lsf[], /* i : lsf values (in frequency domain) 14Q1*1.28*/ + Word16 mem[], /* i/o: memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ + const Word16 m /* i : dimension of lsf Q0*/ ) { Word16 i; diff --git a/lib_enc/gs_enc_fx.c b/lib_enc/gs_enc_fx.c index 1642d1253ca44a9da38178f806a166ebfd151297..472b9f7659e6adc26745c2071510f8ab30d73654 100644 --- a/lib_enc/gs_enc_fx.c +++ b/lib_enc/gs_enc_fx.c @@ -1,41 +1,44 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" #include "cnst.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ static Word16 edyn_fx( const Word16 *vec, const Word16 lvec, Word16 Qnew ); + /*-------------------------------------------------------------------* * encod_audio() * * Encode audio (AC) frames *-------------------------------------------------------------------*/ + void encod_audio_fx( - Encoder_State *st_fx, /* i/o: State structure */ - const Word16 speech[], /* i : input speech Q_new */ - const Word16 Aw[], /* i : weighted A(z) unquantized for subframes Q12 */ - const Word16 Aq[], /* i : 12k8 Lp coefficient Q12 */ - const Word16 *res, /* i : residual signal Q_new */ - Word16 *synth, /* i/o: core synthesis Q-1 */ - Word16 *exc, /* i/o: current non-enhanced excitation Q_new */ - Word16 *pitch_buf, /* i/o: floating pitch values for each subframe Q6 */ - Word16 *voice_factors, /* o : voicing factors Q15 */ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q0 */ - const Word16 attack_flag, /* i : Flag that point to an attack coded with AC mode (GSC) */ - Word16 *lsf_new, /* i : current frame ISF vector Qx2.56 */ - Word16 *tmp_noise, /* o : noise energy Q2*/ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ - const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer Q6*/ + Encoder_State *st_fx, /* i/o: State structure */ + const Word16 speech[], /* i : input speech Q_new */ + const Word16 Aw[], /* i : weighted A(z) unquantized for subframes Q12 */ + const Word16 Aq[], /* i : 12k8 Lp coefficient Q12 */ + const Word16 *res, /* i : residual signal Q_new */ + Word16 *synth, /* i/o: core synthesis Q-1 */ + Word16 *exc, /* i/o: current non-enhanced excitation Q_new */ + Word16 *pitch_buf, /* i/o: floating pitch values for each subframe Q6 */ + Word16 *voice_factors, /* o : voicing factors Q15 */ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q0 */ + const Word16 attack_flag, /* i : Flag that point to an attack coded with AC mode (GSC) */ + Word16 *lsf_new, /* i : current frame ISF vector Qx2.56 */ + Word16 *tmp_noise, /* o : noise energy Q2 */ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0 */ + const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer Q6 */ Word16 Q_new, Word16 shift ) { @@ -78,20 +81,14 @@ void encod_audio_fx( * Encode GSC attack flag (used to reduce possible pre-echo) * Encode GSC SWB speech flag *---------------------------------------------------------------*/ -#ifdef GSC_IVAS // TVB -->>>>>> - test(); - IF( ( st_fx->element_mode > EVS_MONO ) && st_fx->idchan == 0 ) - { - push_indice_fx( hBstr, IND_GSC_IVAS_SP, st_fx->GSC_IVAS_mode, 2 ); - } -#endif + IF( attack_flag > 0 ) { - push_indice_fx( hBstr, IND_GSC_ATTACK, 1, 1 ); + push_indice( hBstr, IND_GSC_ATTACK, 1, 1 ); } ELSE { - push_indice_fx( hBstr, IND_GSC_ATTACK, 0, 1 ); + push_indice( hBstr, IND_GSC_ATTACK, 0, 1 ); } @@ -105,7 +102,7 @@ void encod_audio_fx( IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) || ( NE_16( st_fx->coder_type, INACTIVE ) && ( ( EQ_16( st_fx->element_mode, EVS_MONO ) && GE_32( st_fx->total_brate, ACELP_13k20 ) ) || ( GT_16( st_fx->element_mode, EVS_MONO ) && GT_32( st_fx->total_brate, MIN_BRATE_GSC_NOISY_FLAG ) && GE_16( st_fx->bwidth, SWB ) && !st_fx->flag_ACELP16k ) ) ) ) { - push_indice_fx( hBstr, IND_GSC_SWB_SPEECH, st_fx->GSC_noisy_speech, 1 ); + push_indice( hBstr, IND_GSC_SWB_SPEECH, st_fx->GSC_noisy_speech, 1 ); } /*---------------------------------------------------------------* * Find and encode the number of subframes @@ -185,12 +182,12 @@ void encod_audio_fx( IF( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, MIN_RATE_4SBFR ) ) { - push_indice_fx( hBstr, IND_HF_NOISE, nb_subfr_flag, 2 ); + push_indice( hBstr, IND_HF_NOISE, nb_subfr_flag, 2 ); } ELSE IF( GE_32( st_fx->core_brate, ACELP_9k60 ) ) { /* nb_subfr_flag can only have the value 0 or 1 */ - push_indice_fx( hBstr, IND_HF_NOISE, nb_subfr_flag, 1 ); + push_indice( hBstr, IND_HF_NOISE, nb_subfr_flag, 1 ); } } test(); @@ -227,7 +224,7 @@ void encod_audio_fx( move16(); } Es_pred_enc_fx( &Es_pred, &indice, st_fx->L_frame, res, st_fx->voicing_fx, nb_bits, 0, Q_new ); - push_indice_fx( hBstr, IND_ES_PRED, indice, nb_bits ); + push_indice( hBstr, IND_ES_PRED, indice, nb_bits ); } enc_pit_exc_fx( st_fx, speech, Aw, Aq, Es_pred, res, synth, exc, &T0_tmp, @@ -290,7 +287,7 @@ void encod_audio_fx( { hGSCEnc->noise_lev = s_max( hGSCEnc->noise_lev, NOISE_LEVEL_SP2 ); move16(); - push_indice_fx( hBstr, IND_NOISE_LEVEL, sub( hGSCEnc->noise_lev, NOISE_LEVEL_SP2 ), 2 ); + push_indice( hBstr, IND_NOISE_LEVEL, sub( hGSCEnc->noise_lev, NOISE_LEVEL_SP2 ), 2 ); } ELSE IF( st_fx->GSC_noisy_speech ) { @@ -300,7 +297,7 @@ void encod_audio_fx( } ELSE { - push_indice_fx( hBstr, IND_NOISE_LEVEL, sub( hGSCEnc->noise_lev, NOISE_LEVEL_SP0 ), 3 ); + push_indice( hBstr, IND_NOISE_LEVEL, sub( hGSCEnc->noise_lev, NOISE_LEVEL_SP0 ), 3 ); } /*---------------------------------------------------------------* @@ -387,7 +384,7 @@ void encod_audio_fx( * Updates *--------------------------------------------------------------------------------------*/ - hLPDmem->mem_w0 = hGSCEnc->mem_w0_tmp_fx; /*_DIFF_FLOAT_FIX_ The way it is written in the original fix point is that at this point mem_w0 falls back to its original value (before enc_pit_exc, seems not the case in float */ + hLPDmem->mem_w0 = hGSCEnc->mem_w0_tmp_fx; move16(); Copy( exc_wo_nf, exc, st_fx->L_frame ); @@ -395,18 +392,18 @@ void encod_audio_fx( } void encod_audio_ivas_fx( - Encoder_State *st_fx, /* i/o: State structure */ + Encoder_State *st_fx, /* i/o: State structure */ const Word16 speech[], /* i : input speech Q_new */ - const Word16 Aw[], /* i : weighted A(z) unquantized for subframes Q12 */ - const Word16 Aq[], /* i : 12k8 Lp coefficient Q12 */ + const Word16 Aw[], /* i : weighted A(z) unquantized for subframes Q12 */ + const Word16 Aq[], /* i : 12k8 Lp coefficient Q12 */ const Word16 *res, /* i : residual signal Q_new */ Word16 *synth, /* i/o: core synthesis Q-1 */ Word16 *exc, /* i/o: current non-enhanced excitation Q_new */ - Word16 *pitch_buf, /* i/o: floating pitch values for each subframe Q6 */ - Word16 *voice_factors, /* o : voicing factors Q15 */ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q0 */ - const Word16 attack_flag, /* i : Flag that point to an attack coded with AC mode (GSC) */ - Word16 *lsf_new, /* i : current frame ISF vector Qx2.56 */ + Word16 *pitch_buf, /* i/o: floating pitch values for each subframe Q6 */ + Word16 *voice_factors, /* o : voicing factors Q15 */ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q0 */ + const Word16 attack_flag, /* i : Flag that point to an attack coded with AC mode (GSC)*/ + Word16 *lsf_new, /* i : current frame ISF vector Qx2.56 */ Word16 *tmp_noise, /* o : noise energy Q8*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer */ @@ -439,8 +436,8 @@ void encod_audio_ivas_fx( move16(); T0_frac_tmp = 0; move16(); - Copy( hLPDmem->mem_syn, hGSCEnc->mem_syn_tmp_fx, M ); - hGSCEnc->mem_w0_tmp_fx = hLPDmem->mem_w0; + Copy_Scale_sig( hLPDmem->mem_syn, hGSCEnc->mem_syn_tmp_fx, M, sub( sub( Q_new, 1 ), hLPDmem->q_mem_syn ) ); + Copy_Scale_sig( &hLPDmem->mem_w0, &hGSCEnc->mem_w0_tmp_fx, 1, sub( sub( Q_new, 1 ), hLPDmem->q_mem_syn ) ); move16(); Es_pred = 0; move16(); @@ -763,8 +760,8 @@ void encod_audio_ivas_fx( /*--------------------------------------------------------------------------------------* * Updates *--------------------------------------------------------------------------------------*/ + Copy_Scale_sig( &hGSCEnc->mem_w0_tmp_fx, &hLPDmem->mem_w0, 1, sub( hLPDmem->q_mem_syn, sub( Q_new, 1 ) ) ); - hLPDmem->mem_w0 = hGSCEnc->mem_w0_tmp_fx; /*_DIFF_FLOAT_FIX_ The way it is written in the original fix point is that at this point mem_w0 falls back to its original value (before enc_pit_exc, seems not the case in float */ move16(); Copy( exc_wo_nf, exc, st_fx->L_frame ); /* Q_new */ @@ -772,27 +769,27 @@ void encod_audio_ivas_fx( } /*================================================================================*/ -/* FUNCTION : void gsc_enc_fx () */ +/* FUNCTION : void gsc_enc_fx () */ /*--------------------------------------------------------------------------------*/ /* PURPOSE : Generic audio signal encoder */ /*--------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) res_dct_in : dct of residual signal Q_exc */ -/* _ (Word16) Diff_len : Lenght of the difference signal Q0 */ -/* _ (Word16) coder_type : coding type Q0 */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) res_dct_in : dct of residual signal Q_exc */ +/* _ (Word16) Diff_len : Lenght of the difference signal Q0 */ +/* _ (Word16) coder_type : coding type Q0 */ /* _ (Word16) bits_used : Number of bit used before frequency Q Q0 */ /* _ (Word16) nb_subfr : Number of subframe considered Q0 */ -/* _ (Word16) Qexc : Q format of exc_dct_in */ +/* _ (Word16) Qexc : Q format of exc_dct_in */ /*--------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /* _ None */ /*--------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /* Encoder_State *st_fx:Encoder State Structure */ /* _ (Word16[]) exc_dct_in : dctof pitch-only excitation / total excitation Q_exc */ /*--------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _None */ +/* RETURN ARGUMENTS : */ +/* _None */ /*================================================================================*/ @@ -931,7 +928,7 @@ void gsc_enc_fx( WHILE( bit > 0 ) { i = s_min( bit, 16 ); - push_indice_fx( hBstr, IND_UNUSED, 0, i ); + push_indice( hBstr, IND_UNUSED, 0, i ); bit = sub( bit, i ); } /* Reorder Q bands */ @@ -1006,7 +1003,7 @@ void gsc_enc_fx( highband_exc_dct_in_fx( st_fx->core_brate, mfreq_bindiv_loc, last_bin, Diff_len, hGSCEnc->noise_lev, tmp_band, exc_diffQ, &hGSCEnc->seed_tcx, Ener_per_bd_iQ, nb_subfr, exc_dct_in, st_fx->last_coder_type, bitallocation_band, lsf_new, - hGSCEnc->last_exc_dct_in_fx, &st_fx->last_ener_fx, hGSCEnc->last_bitallocation_band, bitallocation_exc, 0, st_fx->coder_type, + hGSCEnc->last_exc_dct_in_fx, &hGSCEnc->last_ener_fx, hGSCEnc->last_bitallocation_band, bitallocation_exc, 0, st_fx->coder_type, st_fx->bwidth, exc_wo_nf, Q_PVQ_OUT, Q_exc, st_fx->GSC_noisy_speech, NULL, st_fx->L_frame, st_fx->element_mode, st_fx->GSC_IVAS_mode ); exc_dct_in[0] = 0; @@ -1305,24 +1302,24 @@ void gsc_enc_ivas_fx( } /*======================================================================*/ -/* FUNCTION : edyn_fx() */ +/* FUNCTION : edyn_fx() */ /*----------------------------------------------------------------------*/ -/* PURPOSE : Calculate energy dynamics in a vector */ -/* (ratio of energy maximum to energy mean) */ -/* */ +/* PURPOSE : Calculate energy dynamics in a vector */ +/* (ratio of energy maximum to energy mean) */ +/* */ /*----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16 *) vec : ratio of max to mean Qnew */ -/* _ (Word16) lvec : input vector */ -/* _ (Word16) Q_new : */ +/* INPUT ARGUMENTS : */ +/* _ (Word16 *) vec : ratio of max to mean Qnew */ +/* _ (Word16) lvec : input vector */ +/* _ (Word16) Q_new : */ /*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16) dyn : ratio of energy maximum to energy mean (Q7) */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16) dyn : ratio of energy maximum to energy mean (Q7) */ /*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*=======================================================================*/ static Word16 edyn_fx( /* o : ratio of max to mean */ @@ -1335,10 +1332,6 @@ static Word16 edyn_fx( /* o : ratio of max to mean */ Word32 L_tmp, ener_max, ener_mean; Word16 tmp, exp2, tmp2, tmp1, exp1, exp3; Word16 scale; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif ener_mean = L_shl( 1, shl( Qnew, 1 ) ); /*2*Qnew*/ ener_max = L_shl( 1, shl( Qnew, 1 ) ); @@ -1347,7 +1340,7 @@ static Word16 edyn_fx( /* o : ratio of max to mean */ { L_tmp = L_mult0( vec[j], vec[j] ); /*2*Qnew*/ ener_max = L_max( ener_max, L_tmp ); - ener_mean = L_add_o( ener_mean, L_tmp, &Overflow ); + ener_mean = L_add_sat( ener_mean, L_tmp ); } /*dyn = 10.0f * (ener_max / ener_mean);*/ ener_mean = Mult_32_16( ener_mean, div_s( 1, lvec ) ); /*2*Qnew*/ @@ -1355,7 +1348,7 @@ static Word16 edyn_fx( /* o : ratio of max to mean */ IF( ener_mean > 0 ) { exp1 = norm_l( ener_mean ); - tmp1 = round_fx_o( L_shl( ener_mean, exp1 ), &Overflow ); + tmp1 = round_fx_sat( L_shl( ener_mean, exp1 ) ); exp1 = sub( 30, exp1 ); exp2 = norm_l( ener_max ); diff --git a/lib_enc/guided_plc_enc_fx.c b/lib_enc/guided_plc_enc_fx.c index 60a3f8f50773d8e32359d71cc2ed14587e4d5a03..db33f6c6301524cb28f44dfe811e584af092315c 100644 --- a/lib_enc/guided_plc_enc_fx.c +++ b/lib_enc/guided_plc_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -43,11 +43,6 @@ static void coderLookAheadInnovation( move32(); move16(); move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - /* Debug init (not instrumented) */ T0_fx = -3000; @@ -165,10 +160,9 @@ static void coderLookAheadInnovation( ps_e = add( alp_e, ps_e ); BASOP_SATURATE_WARNING_OFF_EVS - max_ps_tmp = L_shl_o( max_ps, sub( max_ps_e, ps_e ), &Overflow ); + max_ps_tmp = L_shl_sat( max_ps, sub( max_ps_e, ps_e ) ); BASOP_SATURATE_WARNING_ON_EVS - IF( LT_32( max_ps_tmp, ps ) ) { max_ps = L_add( ps, 0 ); @@ -215,7 +209,7 @@ void enc_prm_side_Info_fx( IF( GT_16( hPlc_Ext->nBits, 1 ) ) { - push_next_indice_fx( st->hBstr, 1, 1 ); + push_next_indice( st->hBstr, 1, 1 ); diff_pitch = sub( hPlc_Ext->T0, hPlc_Ext->T0_4th ); test(); @@ -225,11 +219,11 @@ void enc_prm_side_Info_fx( move16(); } - push_next_indice_fx( st->hBstr, add( diff_pitch, search_range ), bits_per_subfr ); + push_next_indice( st->hBstr, add( diff_pitch, search_range ), bits_per_subfr ); } ELSE { - push_next_indice_fx( st->hBstr, 0, 1 ); + push_next_indice( st->hBstr, 0, 1 ); } return; @@ -432,6 +426,8 @@ Word16 encSideSpecPowDiffuseDetector_fx( return idx; } + + /*-------------------------------------------------------------------* * updateSpecPowDiffuseIdx_fx() * @@ -442,11 +438,6 @@ void updateSpecPowDiffuseIdx_fx( { Word16 min_gp; Word16 k; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - move32(); move16(); @@ -455,18 +446,20 @@ void updateSpecPowDiffuseIdx_fx( FOR( k = 1; k < 4; k++ ) { - st->mean_gc[1] = L_add_o( st->mean_gc[1], st->gain_code[k], &Overflow ); + st->mean_gc[1] = L_add_sat( st->mean_gc[1], st->gain_code[k] ); move32(); min_gp = s_min( min_gp, st->bpf_gainT[k] ); } /* Suppress saturation warning in threshold comparison. */ test(); - if ( LT_32( st->mean_gc[1], L_add_o( st->mean_gc[0], Mpy_32_16_r( st->mean_gc[0], 3211 /*0.098 Q15*/ ), &Overflow ) ) || GT_16( min_gp, 13435 /*0.82 Q14*/ ) ) + if ( LT_32( st->mean_gc[1], L_add_sat( st->mean_gc[0], Mpy_32_16_r( st->mean_gc[0], 3211 /*0.098 Q15*/ ) ) ) || GT_16( min_gp, 13435 /*0.82 Q14*/ ) ) { move16(); st->glr_idx[0] = 0; } move16(); st->mean_gc[0] = st->mean_gc[1]; /* Q15 */ + + return; } diff --git a/lib_enc/hf_cod_amrwb_fx.c b/lib_enc/hf_cod_amrwb_fx.c index e21a8bd677e665f1e9d36c61d1311074ee56c165..84ba1b48438deae3fed33092423cbf1bcfee29fe 100644 --- a/lib_enc/hf_cod_amrwb_fx.c +++ b/lib_enc/hf_cod_amrwb_fx.c @@ -1,22 +1,23 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -//#include "prot_fx.h" -#include "rom_com_fx.h" #include "cnst.h" #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ + /*---------------------------------------------------------------------* * hf_cod_init() * * *---------------------------------------------------------------------*/ + void hf_cod_init_fx( Word16 *mem_hp400_enc, /* o: memory of hp 400 Hz filter */ Word16 *mem_hf1_enc, /* o: HF band-pass filter memory */ @@ -86,9 +87,6 @@ void hf_cod_fx( Word32 L_tmp; Word16 *pt1; const Word16 *pt2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /* Original speech signal as reference for high band gain quantisation */ Copy( speech16k_fx, HF_SP_fx, L_SUBFR16k ); @@ -107,11 +105,10 @@ void hf_cod_fx( ener_exc_fx = dot_prod_satcontr( exc_fx, exc_fx, Q_exc, Q_exc, &q1, L_SUBFR ); ener_hf_fx = dot_prod_satcontr( HF_fx, HF_fx, -3, -3, &q2, L_SUBFR16k ); - scale_fx = div_s( shl( 1, 14 ), ener_exc_fx ); /*Q(29-q1) */ - L_tmp = L_mult( ener_hf_fx, scale_fx ); /*30-q1+q2 */ - q2 = sub( q1, q2 ); /*30-q2 */ - scale_fx = round_fx( Isqrt( L_shl_o( L_tmp, sub( q2, 26 ), &Overflow ) ) ); /*Q13 */ - + scale_fx = div_s( shl( 1, 14 ), ener_exc_fx ); /*Q(29-q1) */ + L_tmp = L_mult( ener_hf_fx, scale_fx ); /*30-q1+q2 */ + q2 = sub( q1, q2 ); /*30-q2 */ + scale_fx = round_fx( Isqrt( L_shl_sat( L_tmp, sub( q2, 26 ) ) ) ); /*Q13 */ pt1 = HF_fx; FOR( i = 0; i < L_SUBFR16k; i++ ) @@ -183,11 +180,10 @@ void hf_cod_fx( ener_hf_fx = dot_prod_satcontr( HF_syn_fx, HF_syn_fx, 0, 0, &q2, L_SUBFR16k ); ener_input_fx = dot_prod_satcontr( HF_SP_fx, HF_SP_fx, 0, 0, &q1, L_SUBFR16k ); - HF_calc_gain_fx = div_s( shl( 1, 14 ), ener_input_fx ); /*Q(29-q1) */ - L_tmp = L_mult( ener_hf_fx, HF_calc_gain_fx ); /*30-q1+q2 */ - q2 = sub( q1, q2 ); /*30-q2 */ - HF_calc_gain_fx = round_fx_o( Isqrt( L_shl_sat( L_tmp, sub( q2, 20 ) ) ), &Overflow ); /*Q10 */ - + HF_calc_gain_fx = div_s( shl( 1, 14 ), ener_input_fx ); /*Q(29-q1) */ + L_tmp = L_mult( ener_hf_fx, HF_calc_gain_fx ); /*30-q1+q2 */ + q2 = sub( q1, q2 ); /*30-q2 */ + HF_calc_gain_fx = round_fx_sat( Isqrt( L_shl_sat( L_tmp, sub( q2, 20 ) ) ) ); /*Q10 */ /* set energy of HF synthesis to energy of original HF: cross-fade between HF levels in active and inactive frame in hangover period */ diff --git a/lib_enc/hq_classifier_enc_fx.c b/lib_enc/hq_classifier_enc_fx.c index 944cb26491e4e19ddd932fa474b2991618e7878e..07152c84267d8270bb762b7dab56c7f91772ad2f 100644 --- a/lib_enc/hq_classifier_enc_fx.c +++ b/lib_enc/hq_classifier_enc_fx.c @@ -1,15 +1,15 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*-----------------------------------------------------------------* * Local constants *-----------------------------------------------------------------*/ @@ -28,20 +28,20 @@ *-----------------------------------------------------------------*/ void hvq_classifier_fx( const Word32 *input /*Q12*/, Word16 *prev_Npeaks, Word16 *prev_peaks, Word16 *hqswb_clas, Word16 *Npeaks, Word16 *peaks, const Word32 L_core_brate, const Word16 last_core, Word32 *L_nf_gains /*Q12*/, Word16 *hvq_hangover, Word32 *L_pe_gains /*Q12*/ ); -static Word16 hf_spectrum_sparseness_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word32 *coefs_fx /* i : MDCT spectrum Q12*/ -); +static Word16 hf_spectrum_sparseness_fx( Encoder_State *st, const Word32 *coefs_fx ); + + /*--------------------------------------------------------------------------* * hf_spectrum_sparseness() * * Detection of sparse spectrum in high band for activation of harmonic * modes HQ_HARMONIC and HQ_HVQ *--------------------------------------------------------------------------*/ + /*! r: Harmonic decision for high band */ static Word16 hf_spectrum_sparseness_fx( Encoder_State *st, /* i/o: encoder state structure */ - const Word32 *coefs_fx /* i : MDCT spectrum (Q12) */ + const Word32 *coefs_fx /* i : MDCT spectrum (Q12) */ ) { Word16 i; @@ -83,7 +83,6 @@ static Word16 hf_spectrum_sparseness_fx( crest_mod_fx = 0; move32(); maximum_l( A_fx, L_SPEC_HB, &Amax_fx ); -#ifdef NONBE_1233_HQ_CLASSIFIER_DIV_BY_ZERO IF( Amax_fx == 0 ) { /* For all-zero input the crest is 1.0 */ @@ -94,7 +93,6 @@ static Word16 hf_spectrum_sparseness_fx( } ELSE { -#endif thr_fx = Mpy_32_32( Amax_fx, PEAK_THRESHOLD_FX ); /* Q12 */ movmean_fx = 0; /* avoid uninitialized warning */ move32(); @@ -143,9 +141,9 @@ static Word16 hf_spectrum_sparseness_fx( } } Word16 l_shift = W_norm( inv_rms_fx ); - inv_rms32_fx = W_extract_h( W_shl( inv_rms_fx, l_shift ) ); // Q15+l_shift-32 - Word16 q_rms = sub( add( Q15, l_shift ), 32 ); // q_rms - inv_rms32_div_fx = BASOP_Util_Divide3232_Scale_cadence( inv_rms32_fx, L_SPEC_HB, &inv_rms32_e ); /* Q31-inv_rms32_e */ + inv_rms32_fx = W_extract_h( W_shl( inv_rms_fx, l_shift ) ); // Q15+l_shift-32 + Word16 q_rms = sub( add( Q15, l_shift ), 32 ); // q_rms + inv_rms32_div_fx = BASOP_Util_Divide3232_Scale_newton( inv_rms32_fx, L_SPEC_HB, &inv_rms32_e ); /* Q31-inv_rms32_e */ inv_rms32_e = sub( 31, add( sub( Q31, inv_rms32_e ), q_rms ) ); // inv_rms = 1.0f / (float) sqrtf( inv_rms / L_SPEC_HB ); inv_rms32_fx = ISqrt32( inv_rms32_div_fx, &inv_rms32_e ); /* Q31-inv_rms32_e */ @@ -160,9 +158,7 @@ static Word16 hf_spectrum_sparseness_fx( move32(); st->hHQ_core->crest_mod_lp_q = sub( Q12, inv_rms32_e ); move16(); -#ifdef NONBE_1233_HQ_CLASSIFIER_DIV_BY_ZERO } -#endif *crest_lp_fx = L_add( Mpy_32_32( HQ_CREST_FAC_SM_FX, ( *crest_lp_fx ) ), Mpy_32_32( ONE_IN_Q31 - HQ_CREST_FAC_SM_FX, crest_fx ) ); /* Q(st->hHQ_core->crest_lp_q) */ move32(); *crest_mod_lp_fx = L_add( Mpy_32_32( HQ_CREST_FAC_SM_FX, ( *crest_mod_lp_fx ) ), Mpy_32_32( L_sub( ONE_IN_Q31, HQ_CREST_FAC_SM_FX ), crest_mod_fx ) ); /* Q(st->hHQ_core->crest_mod_lp_q) */ @@ -198,7 +194,6 @@ Word16 hq_classifier_enc_fx( /* o : Consumed bits Word16 *hqswb_clas /* o : HQ class Q0 */ ) { -#ifndef SOLVED_COMP_ENC_DEC Word16 bits; HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core; @@ -262,16 +257,16 @@ Word16 hq_classifier_enc_fx( /* o : Consumed bits { IF( GE_16( *hqswb_clas, HQ_GEN_SWB ) ) { - push_indice_fx( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas - 5, bits ); + push_indice( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas - 5, bits ); } ELSE { - push_indice_fx( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas, bits ); + push_indice( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas, bits ); } } ELSE { - push_indice_fx( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas, bits ); + push_indice( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas, bits ); } test(); @@ -281,88 +276,7 @@ Word16 hq_classifier_enc_fx( /* o : Consumed bits *hqswb_clas = HQ_GEN_SWB; /* Q0 */ move16(); } -#else - - Word16 bits; - HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core; - Word32 max_brate; - Word16 harmonic_decision; - - - max_brate = HQ_32k; - move32(); - if ( st_fx->element_mode > EVS_MONO ) - { - max_brate = HQ_48k; - move32(); - } - - *hqswb_clas = HQ_NORMAL; - bits = 1; - move16(); - IF( EQ_16( is_transient, 1 ) ) - { - *hqswb_clas = HQ_TRANSIENT; - move16(); - } - - /* classification and limit bandwidth for bit allocation */ - test(); - IF( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_SPEC48k ) ) - { - IF( LE_32( st_fx->core_brate, max_brate ) ) - { - test(); - IF( !is_transient && EQ_16( st_fx->bwidth, st_fx->last_bwidth ) ) - { - /* Detect HQ_HARMONIC mode */ - *hqswb_clas = peak_avrg_ratio_fx( st_fx->total_brate, coefs, NUMC_N + 96, &hHQ_core->mode_count, &hHQ_core->mode_count1, 12 ); - -#if 0 - harmonic_decision = hf_spectrum_sparseness( st, coefs ); -#else - harmonic_decision = 0; - move16(); -#endif - test(); - IF( EQ_16( *hqswb_clas, HQ_HARMONIC ) && !harmonic_decision ) - { - *hqswb_clas = HQ_NORMAL; - move16(); - } - ELSE - { - /* Detect harmonic VQ mode HQ_HVQ */ - hvq_classifier_fx( coefs, &hHQ_core->prev_Npeaks, hHQ_core->prev_peaks, hqswb_clas, Npeaks, peaks, st_fx->core_brate, st_fx->last_core, - nf_gains, &hHQ_core->hvq_hangover, pe_gains ); - } - } - bits = 2; - move16(); - } - } - ELSE IF( EQ_16( length, L_SPEC16k_EXT ) || EQ_16( length, L_SPEC48k_EXT ) ) - { - bits = 0; /* HQ_NORMAL only -- no signalling needed */ - move16(); - } - /* write signalling info to the bitstream */ - push_indice_fx( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas, bits ); - IF( LE_32( st_fx->core_brate, HQ_32k ) && EQ_16( *hqswb_clas, HQ_NORMAL ) ) - { - IF( EQ_16( length, L_SPEC32k ) ) - { - *hqswb_clas = HQ_GEN_SWB; - move16(); - } - ELSE IF( EQ_16( length, L_SPEC48k ) ) - { - *hqswb_clas = HQ_GEN_FB; - move16(); - } - } -#endif return bits; } Word16 hq_classifier_enc_ivas_fx( /* o : Consumed bits Q0 */ @@ -681,11 +595,8 @@ Word16 peak_avrg_ratio_fx( test(); test(); test(); -#ifndef SOLVED_COMP_ENC_DEC /*This affect BE even if it shouldn't*/ + IF( ( GE_16( add( k, k1 ), 5 ) && GT_16( k1, 2 ) && EQ_32( total_brate, HQ_24k40 ) ) || ( ( ( GE_16( add( k, k1 ), 10 ) && GT_16( k1, 5 ) ) || GE_16( *mode_count, 5 ) ) && LT_16( *mode_count1, 5 ) ) ) -#else - if ( ( GE_16( add( k, k1 ), 5 ) && GT_16( k1, 2 ) && LT_32( total_brate, HQ_BWE_CROSSOVER_BRATE ) ) || ( ( ( GE_16( add( k, k1 ), 10 ) && GT_16( k1, 5 ) ) || GE_16( *mode_count, 5 ) ) && LT_16( *mode_count1, 5 ) ) ) -#endif { hqswb_clas = HQ_HARMONIC; move16(); @@ -741,12 +652,9 @@ void hvq_classifier_ivas_fx( Word16 num_peak_cands, high, low; Word16 sharp[HVQ_NSUB_32k]; Word16 peak_cand_idx[HVQ_THRES_BIN_32k], avail_peaks[HVQ_NSUB_32k]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif Word16 temp_e = 0; move16(); + L_input_max = L_deposit_l( 0 ); set32_fx( L_thr, 0, L_FRAME16k ); @@ -897,7 +805,7 @@ void hvq_classifier_ivas_fx( sharp[i] = extract_h( L_shl( L_tmp, shift ) ); /* 30-s+s-8-16 -> Q6 */ move16(); /*sharp_dist += (sharp[i]-HVQ_SHARP_THRES); */ - sharp_dist = add_o( sharp_dist, sub( sharp[i], HVQ_SHARP_THRES_FX ), &Overflow ); /* Q6 */ + sharp_dist = add_sat( sharp_dist, sub( sharp[i], HVQ_SHARP_THRES_FX ) ); /* Q6 */ if ( GT_16( sharp[i], HVQ_SHARP_THRES_FX ) ) { num_sharp_bands = add( num_sharp_bands, 1 ); @@ -1174,18 +1082,11 @@ void hvq_classifier_fx( Word16 num_peak_cands, high, low; Word16 sharp[HVQ_NSUB_32k]; Word16 peak_cand_idx[HVQ_THRES_BIN_32k], avail_peaks[HVQ_NSUB_32k]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + L_input_max = L_deposit_l( 0 ); set32_fx( L_thr, 0, L_FRAME16k ); -#ifndef SOLVED_COMP_ENC_DEC IF( EQ_32( L_core_brate, HQ_24k40 ) ) -#else - IF( LT_32( L_core_brate, HQ_BWE_CROSSOVER_BRATE ) ) -#endif { nsub = HVQ_NSUB_24k; move16(); @@ -1333,7 +1234,7 @@ void hvq_classifier_fx( move16(); /*sharp_dist += (sharp[i]-HVQ_SHARP_THRES); */ - sharp_dist = add_o( sharp_dist, sub( sharp[i], HVQ_SHARP_THRES_FX ), &Overflow ); + sharp_dist = add_sat( sharp_dist, sub( sharp[i], HVQ_SHARP_THRES_FX ) ); IF( GT_16( sharp[i], HVQ_SHARP_THRES_FX ) ) { num_sharp_bands = add( num_sharp_bands, 1 ); @@ -1424,7 +1325,6 @@ void hvq_classifier_fx( num_peak_cands = add( num_peak_cands, 1 ); } } -#ifndef ADD_IVAS_HQ_CODE IF( EQ_32( L_core_brate, HQ_24k40 ) ) { peak_th = HVQ_MAX_PEAKS_24k_CLAS; @@ -1435,9 +1335,6 @@ void hvq_classifier_fx( peak_th = HVQ_MAX_PEAKS_32k; move16(); } -#else - peak_th = (int16_t) ( ( core_brate * HVQ_PEAKS_PER_DELTA_THR + HVQ_PEAKS_PER_DELTA_THR_OFFS ) / HVQ_PEAKS_BPS_DELTA ); -#endif /* Find peaks */ pindx = maximum_32_fx( L_input_abs, num_peak_cands, &L_m ); i = 0; @@ -1559,7 +1456,6 @@ void hvq_classifier_fx( move16(); } -#ifndef ADD_IVAS_HQ_CODE IF( EQ_32( L_core_brate, HQ_24k40 ) ) { *Npeaks = s_min( HVQ_MAX_PEAKS_24k, *Npeaks ); /* Q0 */ @@ -1570,9 +1466,6 @@ void hvq_classifier_fx( *Npeaks = s_min( HVQ_MAX_PEAKS_32k, *Npeaks ); /* Q0 */ move16(); } -#else - *Npeaks = (int16_t) ( min( ( core_brate * HVQ_PEAKS_PER_DELTA + HVQ_PEAKS_PER_DELTA_OFFS ) / HVQ_PEAKS_BPS_DELTA, *Npeaks ) ); -#endif } ELSE { @@ -1585,99 +1478,3 @@ void hvq_classifier_fx( return; } - -#ifdef ADD_IVAS_HQ_CODE -/*--------------------------------------------------------------------------* - * hf_spectrum_sparseness() - * - * Detection of sparse spectrum in high band for activation of harmonic - * modes HQ_HARMONIC and HQ_HVQ - *--------------------------------------------------------------------------*/ -/*! r: Harmonic decision for high band */ -static int16_t hf_spectrum_sparseness( - Encoder_State *st, /* i/o: encoder state structure */ - const float *coefs /* i : MDCT spectrum */ -) -{ - int16_t i; - float thr; - int16_t low_count; - float A[L_SPEC_HB]; - float Amax; - float movmean; - float inv_rms; - float crest; - float crest_mod; - const float *p_num; - float *crest_lp; - float *crest_mod_lp; - int16_t result; - - crest_lp = &st->hHQ_core->crest_lp; - crest_mod_lp = &st->hHQ_core->crest_mod_lp; - - result = TRUE; - if ( st->element_mode != EVS_MONO ) - { - for ( i = 0; i < L_SPEC_HB; i++ ) - { - A[i] = (float) fabsf( coefs[i + L_SPEC_HB] ); - } - low_count = 0; - inv_rms = 0.0f; - crest_mod = 0.0f; - maximum( A, L_SPEC_HB, &Amax ); - thr = Amax * PEAK_THRESHOLD; - movmean = 0.0f; /* avoid uninitialized warning */ - p_num = &inv_tbl[HALF_WIN_LENGTH + 1]; /* Table for division 1./(11:21) */ - for ( i = 0; i < L_SPEC_HB; i++ ) - { - inv_rms += A[i] * A[i]; - if ( A[i] < thr ) - { - low_count += 1; - } - if ( i <= HALF_WIN_LENGTH ) - { - if ( i == 0 ) - { - movmean = sum_f( &A[0], i + HALF_WIN_LENGTH + 1 ) * ( *p_num ); - } - else - { - p_num++; - movmean = movmean + ( A[i + HALF_WIN_LENGTH] - movmean ) * ( *p_num ); - } - } - else - { - if ( L_SPEC_HB <= i + HALF_WIN_LENGTH ) - { - p_num--; - movmean = movmean + ( movmean - A[i - HALF_WIN_LENGTH - 1] ) * ( *p_num ); - } - else - { - movmean = movmean + ( A[i + HALF_WIN_LENGTH] - A[i - HALF_WIN_LENGTH - 1] ) * ( *p_num ); - } - } - if ( crest_mod < movmean ) - { - crest_mod = movmean; - } - } - inv_rms = 1.0f / (float) sqrtf( inv_rms / L_SPEC_HB ); - crest = Amax * inv_rms; - crest_mod = crest_mod * inv_rms; - *crest_lp = HQ_CREST_FAC_SM * ( *crest_lp ) + ( 1.0f - HQ_CREST_FAC_SM ) * crest; - *crest_mod_lp = HQ_CREST_FAC_SM * ( *crest_mod_lp ) + ( 1.0f - HQ_CREST_FAC_SM ) * crest_mod; - - if ( ( ( *crest_lp ) > HQ_CREST_THRESHOLD ) && ( ( *crest_mod_lp ) > HQ_CREST_MOD_THRESHOLD ) && ( low_count > LOW_COUNT_THRESHOLD ) ) - { - result = FALSE; - } - } - - return result; -} -#endif diff --git a/lib_enc/hq_core_enc_fx.c b/lib_enc/hq_core_enc_fx.c index f22218d13675013ebf72419bf23980144ac8e4fb..1966a4256d90814ef52592010c1f6d0f313b5ca7 100644 --- a/lib_enc/hq_core_enc_fx.c +++ b/lib_enc/hq_core_enc_fx.c @@ -1,14 +1,15 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*-------------------------------------------------------------------------- * hq_core_enc() * @@ -17,11 +18,11 @@ void hq_core_enc_fx( Encoder_State *st_fx, - const Word16 *audio, /* i : input audio signal Q0 */ - const Word16 input_frame_orig, /* i : frame length Q0*/ - const Word16 hq_core_type, /* i : HQ core type Q0*/ - const Word16 Voicing_flag, /* i : Voicing flag for FER method selection Q0*/ - const Word16 vad_hover_flag /* i : VAD hangover flag Q0*/ + const Word16 *audio, /* i : input audio signal Q0*/ + const Word16 input_frame_orig, /* i : frame length Q0*/ + const Word16 hq_core_type, /* i : HQ core type Q0*/ + const Word16 Voicing_flag, /* i : Voicing flag for FER method selection Q0*/ + const Word16 vad_hover_flag /* i : VAD hangover flag Q0*/ ) { Word16 i, is_transient, num_bits, extra_unused; @@ -35,15 +36,6 @@ void hq_core_enc_fx( Word16 tmp; Word32 L_tmp; UWord16 lsb; -#ifdef ADD_IVAS_HQ_CODE_L_SPEC - Word16 L_spec; -#endif -#ifdef ADD_IVAS_HQ_CODE - Word16 left_overlap, right_overlap; - Word16 overlap, nz, tcx_offset, L_frame; - Word16 Aq_old[M + 1]; - Word16 output[L_FRAME16k]; -#endif Word16 two_frames_buffer[2 * L_FRAME48k]; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; @@ -87,37 +79,6 @@ void hq_core_enc_fx( is_transient = detect_transient_fx( audio, input_frame, 0, st_fx ); /* Q0 */ -#ifdef ADD_IVAS_HQ_CODE - test(); - test(); - test(); - IF( ( st_fx->element_mode > EVS_MONO ) && ( ( st_fx->last_core == ACELP_CORE ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) ) - { - /*-------------------------------------------------------------------------- - * IVAS switching frame - *--------------------------------------------------------------------------*/ - - L_spec = input_frame; - left_overlap = -1; - right_overlap = -1; - move16(); - move16(); - move16(); - - WindowSignal( &( st_fx->tcx_cfg ), st_fx->hTcxCfg->tcx_offsetFB, TRANSITION_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, st_fx->hTcxEnc->speech_TCX, &L_spec, wtda_audio, 1, 1 ); - Q_audio = 16; - move16(); /*tbv inspired from core_enc_ol*/ - TCX_MDCT( wtda_audio, t_audio, &Q_audio, left_overlap, sub( L_spec, shr( add( left_overlap, right_overlap ), 1 ) ), right_overlap, st_fx->element_mode ); - - inner_frame = inner_frame_tbl[st_fx->bwidth]; - L_spec = l_spec_ext_tbl[st_fx->bwidth]; - is_transient = 0; - move16(); - move16(); - move16(); - } - ELSE -#endif { /*-------------------------------------------------------------------------- * Windowing and time-domain aliasing @@ -144,10 +105,8 @@ void hq_core_enc_fx( move16(); } } -#ifndef ADD_IVAS_HQ_CODE /* subtract signalling bits */ num_bits = sub( num_bits, hBstr->nb_bits_tot ); /* Q0 */ -#endif direct_transform_fx( wtda_audio, t_audio, is_transient, input_frame, &Q_audio, st_fx->element_mode ); /* scale coefficients to their nominal level (8kHz) */ @@ -174,10 +133,6 @@ void hq_core_enc_fx( /* limit encoded band-width according to the command-line OR BWD limitation */ inner_frame = inner_frame_tbl[st_fx->bwidth]; /* Q0 */ move16(); -#ifdef ADD_IVAS_HQ_CODE_L_SPEC - L_spec = l_spec_tbl[st_fx->bwidth]; - move16(); -#endif IF( GT_16( input_frame, inner_frame ) ) { IF( EQ_16( is_transient, 1 ) ) @@ -193,31 +148,10 @@ void hq_core_enc_fx( set32_fx( t_audio + inner_frame, 0, sub( input_frame, inner_frame ) ); } } -#ifdef ADD_IVAS_HQ_CODE_L_SPEC - /* subtract signalling bits */ - num_bits = sub( num_bits, hBstr->nb_bits_tot_fx ); -#endif - /*-------------------------------------------------------------------------- * High-band gain control in case of BWS *--------------------------------------------------------------------------*/ -#ifdef ADD_IVAS_HQ_CODE - IF( st_fx->bwidth_sw_cnt > 0 ) - { - IF( is_transient ) - { - FOR( i = 0; i < NUM_TIME_SWITCHING_BLOCKS; i++ ) - { - v_multc( t_audio + i * inner_frame / NUM_TIME_SWITCHING_BLOCKS + L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, t_audio + i * inner_frame / NUM_TIME_SWITCHING_BLOCKS + L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS, inner_frame / NUM_TIME_SWITCHING_BLOCKS - L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ); - } - } - ELSE - { - v_multc( t_audio + L_FRAME16k, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, t_audio + L_FRAME16k, L_spec - L_FRAME16k ); - } - } -#endif /*-------------------------------------------------------------------------- * Classify whether to put extra bits for FER mitigation *--------------------------------------------------------------------------*/ @@ -229,12 +163,12 @@ void hq_core_enc_fx( { IF( Voicing_flag > 0 ) { - push_indice_fx( hBstr, IND_HQ_VOICING_FLAG, 1, 1 ); + push_indice( hBstr, IND_HQ_VOICING_FLAG, 1, 1 ); num_bits = sub( num_bits, 1 ); } ELSE { - push_indice_fx( hBstr, IND_HQ_VOICING_FLAG, 0, 1 ); + push_indice( hBstr, IND_HQ_VOICING_FLAG, 0, 1 ); num_bits = sub( num_bits, 1 ); } } @@ -263,12 +197,7 @@ void hq_core_enc_fx( t_audio[i] = L_shr( t_audio[i], sub( Q_audio, 12 ) ); /* Q12 */ move32(); } - -#ifdef ADD_IVAS_HQ_CODE_L_SPEC - hq_hr_enc_fx( st_fx, t_audio, L_spec, &num_bits, is_transient, vad_hover_flag ); -#else hq_hr_enc_fx( st_fx, t_audio, inner_frame, &num_bits, is_transient, vad_hover_flag ); -#endif Q_audio = 12; move16(); } @@ -278,59 +207,14 @@ void hq_core_enc_fx( WHILE( num_bits >= 16 ) { - push_indice_fx( hBstr, IND_UNUSED, 0, 16 ); + push_indice( hBstr, IND_UNUSED, 0, 16 ); num_bits = sub( num_bits, 16 ); } IF( num_bits != 0 ) { - push_indice_fx( hBstr, IND_UNUSED, 0, num_bits ); - } -#ifdef ADD_IVAS_HQ_CODE - if ( st->element_mode > EVS_MONO && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) - { - overlap = st->hTcxCfg->tcx_mdct_window_length; - nz = NS2SA( st->sr_core, N_ZERO_MDCT_NS ); - L_frame = (int16_t) ( st->L_frame + st->hTcxCfg->tcx_offset - st->hTcxCfg->lfacNext ); - tcx_offset = st->hTcxCfg->lfacNext; - set_f( Aq_old, 0, M + 1 ); /* Dummy filter */ - Aq_old[0] = 1; - - /* Code taken from InternalTCXDecoder() */ - TCX_MDCT_Inverse( t_audio, wtda_audio, overlap, L_frame - overlap, overlap, st->element_mode ); - - /* Window current frame */ - tcx_windowing_synthesis_current_frame( wtda_audio, st->hTcxCfg->tcx_aldo_window_2, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, /*st->hTcxCfg->tcx_mdct_window_length*/ st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, st->last_core == ACELP_CORE, st->hTcxCfg->tcx_last_overlap_mode, /*left mode*/ st->hTcxEnc->acelp_zir, st->hTcxEnc->Txnq, NULL, Aq_old, st->hTcxCfg->tcx_mdct_window_trans, st->L_frame >> 1, tcx_offset < 0 ? -tcx_offset : 0, st->last_core, 0, 0 ); - - /*Compute windowed synthesis in case of switching to ALDO windows in next frame*/ - mvr2r( wtda_audio + L_frame - nz, st->hTcxEnc->old_out, nz + overlap ); - set_zero( st->hTcxEnc->old_out + nz + overlap, nz ); - - tcx_windowing_synthesis_past_frame( st->hTcxEnc->old_out + nz, st->hTcxCfg->tcx_aldo_window_1_trunc, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, FULL_OVERLAP ); - - for ( i = 0; i < nz; i++ ) - { - st->hTcxEnc->old_out[nz + overlap + i] = wtda_audio[L_frame - 1 - i] * st->hTcxCfg->tcx_aldo_window_1_trunc[-1 - i]; - } - mvr2r( wtda_audio + ( overlap >> 1 ) - tcx_offset, output, st->L_frame ); - } - else - { - ener_match = (float) sqrt( (float) L_FRAME16k / (float) NORM_MDCT_FACTOR ); - v_multc( t_audio, ener_match, t_audio, inner_frame ); - - inverse_transform( t_audio, wtda_audio, is_transient, L_FRAME16k, inner_frame, st->element_mode ); - - window_ola( wtda_audio, output, st->hTcxEnc->old_out, L_FRAME16k, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL ); - } - - if ( st->element_mode > EVS_MONO ) - { - /* Store LB synthesis in case of switch to ACELP */ - mvr2r( output, st->hLPDmem->old_exc, L_FRAME16k ); + push_indice( hBstr, IND_UNUSED, 0, num_bits ); } -#endif - return; } @@ -374,7 +258,6 @@ void HQ_core_enc_init_fx( hHQ_core->last_max_pos_pulse = 0; move16(); -#ifdef MSAN_FIX hHQ_core->crest_lp_fx = HQ_CREST_THRESHOLD_FX; /* Q28 */ move32(); hHQ_core->crest_lp_q = Q28; @@ -383,7 +266,6 @@ void HQ_core_enc_init_fx( move32(); hHQ_core->crest_mod_lp_q = Q29; move16(); -#endif return; } @@ -425,6 +307,7 @@ void hq_core_enc_ivas_fx( st->Nb_ACELP_frames = 0; move16(); set_zero_fx( t_audio_fx, L_FRAME48k_EXT ); + /* set input_frame length */ input_frame = input_frame_orig; /* Q0 */ @@ -448,8 +331,7 @@ void hq_core_enc_ivas_fx( * Write signaling information *--------------------------------------------------------------------------*/ - num_bits = BASOP_Util_Divide3232_Scale( st->total_brate, FRAMES_PER_SEC, &exp ); /* Q15-exp */ - num_bits = shr( num_bits, sub( 15, exp ) ); /* Q0 */ + num_bits = extract_l( Mpy_32_32_r( st->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); extra_unused = 0; move16(); @@ -482,13 +364,9 @@ void hq_core_enc_ivas_fx( Q_audio = sub( Q16, q ); TCX_MDCT( wtda_audio_fx16, t_audio_fx, &Q_audio, left_overlap, sub( L_spec, shr( add( left_overlap, right_overlap ), 1 ) ), right_overlap, st->element_mode ); Q_audio = sub( Q31, Q_audio ); -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( wtda_audio_fx16, wtda_audio_fx32, 2 * L_FRAME48k, sub( Q_audio, q ) ); /* Q_audio */ -#else - Copy_Scale_sig_16_32_DEPREC( wtda_audio_fx16, wtda_audio_fx32, 2 * L_FRAME48k, sub( Q_audio, q ) ); /* Q_audio */ -#endif - inner_frame = inner_frame_tbl[st->bwidth]; /* Q0 */ - L_spec = l_spec_ext_tbl[st->bwidth]; /* Q0 */ + inner_frame = inner_frame_tbl[st->bwidth]; /* Q0 */ + L_spec = l_spec_ext_tbl[st->bwidth]; /* Q0 */ is_transient = 0; move16(); move16(); @@ -552,11 +430,9 @@ void hq_core_enc_ivas_fx( /* limit encoded band-width according to the command-line OR BWD limitation */ inner_frame = inner_frame_tbl[st->bwidth]; /* Q0 */ L_spec = l_spec_tbl[st->bwidth]; /* Q0 */ - move16(); move16(); - IF( GT_16( input_frame, inner_frame ) ) { IF( EQ_16( is_transient, 1 ) ) @@ -572,7 +448,6 @@ void hq_core_enc_ivas_fx( } } - /* subtract signaling bits */ num_bits = sub( num_bits, hBstr->nb_bits_tot ); /* Q0 */ @@ -590,12 +465,12 @@ void hq_core_enc_ivas_fx( { FOR( i = 0; i < NUM_TIME_SWITCHING_BLOCKS; i++ ) { - v_multc_fixed( t_audio_fx + add( i_mult2( i, shr( inner_frame, 2 ) ), L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ), L_tmp, t_audio_fx + add( i_mult2( i, shr( inner_frame, 2 ) ), L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ), sub( shr( inner_frame, 2 ), L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ) ); // Q_audio + Q31 - Q31 -> Q_audio + v_multc_fx( t_audio_fx + add( i_mult2( i, shr( inner_frame, 2 ) ), L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ), L_tmp, t_audio_fx + add( i_mult2( i, shr( inner_frame, 2 ) ), L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ), sub( shr( inner_frame, 2 ), L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ) ); // Q_audio + Q31 - Q31 -> Q_audio } } ELSE { - v_multc_fixed( t_audio_fx + L_FRAME16k, L_tmp, t_audio_fx + L_FRAME16k, L_spec - L_FRAME16k ); // Q_audio + Q31 - Q31 -> Q_audio + v_multc_fx( t_audio_fx + L_FRAME16k, L_tmp, t_audio_fx + L_FRAME16k, L_spec - L_FRAME16k ); // Q_audio + Q31 - Q31 -> Q_audio } } @@ -674,7 +549,6 @@ void hq_core_enc_ivas_fx( Copy_Scale_sig_32_16( wtda_audio_fx32, wtda_audio_fx16, 2 * L_FRAME48k, negate( Q_audio ) ); // Q0 TCX_MDCT_Inverse( t_audio_fx, sub( sub( 31, Q_audio ), 15 ), wtda_audio_fx16, overlap, sub( L_frame, overlap ), overlap, st->element_mode ); - /* Window current frame */ Word16 tcx_offset_tmp; @@ -689,7 +563,6 @@ void hq_core_enc_ivas_fx( } tcx_windowing_synthesis_current_frame( wtda_audio_fx16, st->hTcxCfg->tcx_aldo_window_2, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, /*st->hTcxCfg->tcx_mdct_window_length*/ st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, st->last_core == ACELP_CORE, st->hTcxCfg->tcx_last_overlap_mode, /*left mode*/ st->hTcxEnc->acelp_zir, st->hTcxEnc->Txnq, NULL, Aq_old_fx, st->hTcxCfg->tcx_mdct_window_trans, shr( st->L_frame, 1 ), tcx_offset_tmp, st->last_core, 0, 0 ); - /*Compute windowed synthesis in case of switching to ALDO windows in next frame*/ Copy( wtda_audio_fx16 + sub( L_frame, nz ), st->hTcxEnc->old_out_fx, nz + overlap ); /* Q0 */ set16_fx( st->hTcxEnc->old_out_fx + add( nz, overlap ), 0, nz ); @@ -711,7 +584,7 @@ void hq_core_enc_ivas_fx( { Word16 tmp_q = Q_audio; move16(); - Word32 ener_match_fx = SQRT2_FIXED; + Word32 ener_match_fx = SQRT2_FX; move32(); FOR( i = 0; i < input_frame; i++ ) { @@ -723,7 +596,6 @@ void hq_core_enc_ivas_fx( scale_sig32( wtda_audio_fx32, 2 * L_FRAME48k, sub( Q_audio, tmp_q ) ); /* Q_audio */ Inverse_Transform( t_audio_fx, &Q_audio, wtda_audio_fx32, is_transient, L_FRAME16k, inner_frame, st->element_mode ); - out_q = Q_audio; move16(); window_ola_fx( wtda_audio_fx32, output_fx, &out_q, st->hTcxEnc->old_out_fx, &old_q, L_FRAME16k, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL ); diff --git a/lib_enc/hq_env_enc_fx.c b/lib_enc/hq_env_enc_fx.c index 5d47710ed9fe68624d4a61c83d4b9ed99b03a942..bcf0e3945c690e037de9bcebcf7440dc42322468 100644 --- a/lib_enc/hq_env_enc_fx.c +++ b/lib_enc/hq_env_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -295,13 +295,13 @@ Word16 encode_envelope_indices_fx( /* o : Number of b test(); IF( EQ_16( flag_HQ2, LOW_RATE_HQ_CORE_TRAN ) || EQ_16( flag_HQ2, LOW_RATE_HQ_CORE ) ) { - push_indice_fx( hBstr, IND_HQ2_DENG_HMODE, *LCmode, BITS_DE_HMODE ); - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, difidx[0], BITS_DE_FCOMP ); + push_indice( hBstr, IND_HQ2_DENG_HMODE, *LCmode, BITS_DE_HMODE ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, difidx[0], BITS_DE_FCOMP ); } ELSE { - push_indice_fx( hBstr, IND_LC_MODE, *LCmode, 2 ); - push_indice_fx( hBstr, IND_YNRM, difidx[0], NORM0_BITS ); + push_indice( hBstr, IND_LC_MODE, *LCmode, 2 ); + push_indice( hBstr, IND_YNRM, difidx[0], NORM0_BITS ); } test(); @@ -331,7 +331,7 @@ Word16 encode_envelope_indices_fx( /* o : Number of b m = lshr( m, 1 ); /* Q0 */ } - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, v, r ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, v, r ); } } ELSE @@ -370,7 +370,7 @@ Word16 encode_envelope_indices_fx( /* o : Number of b move16(); } } - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, m, r ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, m, r ); prevj = j; move16(); } @@ -419,11 +419,11 @@ Word16 encode_envelope_indices_fx( /* o : Number of b IF( EQ_16( flag_HQ2, LOW_RATE_HQ_CORE ) ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, m, r ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, m, r ); } ELSE { - push_indice_fx( hBstr, IND_YNRM, m, r ); + push_indice( hBstr, IND_YNRM, m, r ); } prevj = j; @@ -515,11 +515,11 @@ Word16 encode_envelope_indices_fx( /* o : Number of b IF( flag_HQ2 == 0 ) { - push_indice_fx( hBstr, IND_YNRM, v, r ); + push_indice( hBstr, IND_YNRM, v, r ); } ELSE { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, v, r ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, v, r ); } } } @@ -536,14 +536,14 @@ Word16 encode_envelope_indices_fx( /* o : Number of b r = huffsizn[j]; /* Q0 */ move16(); - push_indice_fx( hBstr, IND_YNRM, m, r ); + push_indice( hBstr, IND_YNRM, m, r ); } } ELSE { FOR( i = 1; i < num_sfm; i++ ) { - push_indice_fx( hBstr, IND_YNRM, difidx[i], NORMI_BITS ); + push_indice( hBstr, IND_YNRM, difidx[i], NORMI_BITS ); } } } diff --git a/lib_enc/hq_hr_enc_fx.c b/lib_enc/hq_hr_enc_fx.c index 1cd516b43ede33b5bb2659fe020e73be8976338e..7f18bd48acb52566672112ce1bcd3cb09c5be3fb 100644 --- a/lib_enc/hq_hr_enc_fx.c +++ b/lib_enc/hq_hr_enc_fx.c @@ -1,20 +1,22 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ -#include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "rom_com.h" /* Static table prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "ivas_prot_fx.h" #include "prot_fx_enc.h" /* Function prototypes */ + + /*--------------------------------------------------------------------------* * hq_hr_enc_fx() * * HQ High rate encoding routine *--------------------------------------------------------------------------*/ + void hq_hr_enc_fx( Encoder_State *st_fx, /* i/o: encoder state structure fx */ Word32 *t_audio, /* i/o: transform-domain coefficients Q12 */ @@ -236,12 +238,12 @@ void hq_hr_enc_fx( IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) ) { nf_idx = noise_adjust_fx( t_audio_norm, 12, R, sfm_start, sfm_end, s_max( core_sfm, sub( num_env_bands, 1 ) ) ); /* Q0 */ - push_indice_fx( st_fx->hBstr, IND_NF_IDX, nf_idx, 2 ); + push_indice( st_fx->hBstr, IND_NF_IDX, nf_idx, 2 ); } ELSE { nf_idx = noise_adjust_fx( t_audio_norm, 12, R, sfm_start, sfm_end, core_sfm ); /* Q0 */ - push_indice_fx( st_fx->hBstr, IND_NF_IDX, nf_idx, 2 ); + push_indice( st_fx->hBstr, IND_NF_IDX, nf_idx, 2 ); } } /* updates */ @@ -249,20 +251,6 @@ void hq_hr_enc_fx( move16(); /* Prepare synthesis for LB generation in case of switch to ACELP */ -#ifdef ADD_IVAS_HQ_CODE - IF( NE_16( hqswb_clas, HQ_HVQ ) ) - { - apply_envelope_enc( t_audio_q, ynrm, num_sfm, sfm_start, sfm_end ); - } - - IF( is_transient ) - { - de_interleave_spectrum( t_audio_q, length ); - } - Copy32( t_audio_q, t_audio, length ); -#endif - - return; } diff --git a/lib_enc/hq_lr_enc_fx.c b/lib_enc/hq_lr_enc_fx.c index 9aca0f6465fd0e06e899334619e5504490d4a930..48b3edc383944273200df8743edd40630a2f06fc 100644 --- a/lib_enc/hq_lr_enc_fx.c +++ b/lib_enc/hq_lr_enc_fx.c @@ -1,18 +1,17 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" #include "cnst.h" -// #include "prot_fx.h" -#include "rom_com_fx.h" #include "rom_enc.h" -// #include "basop_mpy.h" #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ + /*--------------------------------------------------------------------------* * Local function prototypes *--------------------------------------------------------------------------*/ @@ -115,7 +114,7 @@ static void spt_shorten_domain_set_fx( move16(); } } - push_indice_fx( st_fx->hBstr, IND_HQ2_SPT_SHORTEN, spt_shorten_flag[j], 1 ); + push_indice( st_fx->hBstr, IND_HQ2_SPT_SHORTEN, spt_shorten_flag[j], 1 ); *bit_budget = sub( *bit_budget, 1 ); /* Q0 */ move16(); } @@ -272,11 +271,6 @@ void hq_lr_enc_fx( Word16 beta_fx; /*Q14 1.05f; */ HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - set32_fx( L_y2, 0x0L, L_FRAME48k ); set16_fx( inp_vector_fx, 0, inner_frame_fx ); @@ -313,7 +307,7 @@ void hq_lr_enc_fx( } /* write the classification information into the bitstream */ - push_indice_fx( hBstr, IND_HQ2_SWB_CLAS, hqswb_clas_fx, 2 ); + push_indice( hBstr, IND_HQ2_SWB_CLAS, hqswb_clas_fx, 2 ); ( *num_bits_fx ) = sub( *num_bits_fx, 2 ); move16(); IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) ) @@ -325,7 +319,7 @@ void hq_lr_enc_fx( ELSE { /* write the transient bit into the bitstream */ - push_indice_fx( st_fx->hBstr, IND_HQ2_SWB_CLAS, is_transient_fx, 1 ); + push_indice( st_fx->hBstr, IND_HQ2_SWB_CLAS, is_transient_fx, 1 ); /* subtract one bit for the transient flag */ ( *num_bits_fx ) = sub( ( *num_bits_fx ), 1 ); @@ -606,9 +600,9 @@ void hq_lr_enc_fx( exp = 0; move16(); } - L_tmp = Mult_32_16( Ep_vari_fx, 3277 ); /*13+15-15=13 */ - L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( 12, exp ), &Overflow ); /*Q(13+exp-15 +12-exp +4 = 14) */ - tmp2 = extract_h( Ep_avrg_fx ); /*Q13-16=-3 */ + L_tmp = Mult_32_16( Ep_vari_fx, 3277 ); /*13+15-15=13 */ + L_tmp = L_shl_sat( Mult_32_16( L_tmp, tmp ), sub( 12, exp ) ); /*Q(13+exp-15 +12-exp +4 = 14) */ + tmp2 = extract_h( Ep_avrg_fx ); /*Q13-16=-3 */ IF( tmp2 != 0 ) { exp = norm_s( tmp2 ); @@ -623,10 +617,10 @@ void hq_lr_enc_fx( exp = 0; move16(); } - L_tmp2 = Mult_32_16( Ep_vari_fx, 6554 ); /*13+15-15=13 */ - L_tmp2 = L_shl_o( Mult_32_16( L_tmp2, tmp2 ), sub( 13, exp ), &Overflow ); /*Q(13+exp-15 +13-exp +3 = 14) */ - L_tmp = L_min( L_tmp, L_tmp2 ); /*Q14 */ - tmp = extract_l( L_min( L_tmp, 13107 ) ); /*Q14 */ + L_tmp2 = Mult_32_16( Ep_vari_fx, 6554 ); /*13+15-15=13 */ + L_tmp2 = L_shl_sat( Mult_32_16( L_tmp2, tmp2 ), sub( 13, exp ) ); /*Q(13+exp-15 +13-exp +3 = 14) */ + L_tmp = L_min( L_tmp, L_tmp2 ); /*Q14 */ + tmp = extract_l( L_min( L_tmp, 13107 ) ); /*Q14 */ alpha_fx = add( 16384, tmp ); } IF( EQ_16( hHQ_core->last_bitalloc_max_band[j++], 1 ) ) @@ -647,10 +641,10 @@ void hq_lr_enc_fx( exp = 0; move16(); } - L_tmp = L_shl_o( Mult_32_16( Ep_avrg_fx, tmp ), sub( 14, exp ), &Overflow ); /*Q(13+exp-15 +14-exp+2 = 14) */ - L_tmp = L_max( L_tmp, 16384 ); /*Q14 */ - tmp = extract_l( L_min( L_tmp, beta_fx ) ); /*Q14 */ - alpha_fx = shl( mult( alpha_fx, tmp ), 1 ); /*14+14-15 +1=Q14 */ + L_tmp = L_shl_sat( Mult_32_16( Ep_avrg_fx, tmp ), sub( 14, exp ) ); /*Q(13+exp-15 +14-exp+2 = 14) */ + L_tmp = L_max( L_tmp, 16384 ); /*Q14 */ + tmp = extract_l( L_min( L_tmp, beta_fx ) ); /*Q14 */ + alpha_fx = shl( mult( alpha_fx, tmp ), 1 ); /*14+14-15 +1=Q14 */ } ELSE { @@ -670,11 +664,11 @@ void hq_lr_enc_fx( exp = 0; move16(); } - L_tmp = L_shl_o( Mult_32_16( Ep_tmp_fx[i], tmp2 ), sub( 19, exp ), &Overflow ); /*Q(13+exp-15 +19-exp +3 = 20) */ - L_tmp = Mult_32_16( L_tmp, shl( sub( bands_fx, lowband ), 9 ) ); /*20 +9 -15 =Q14 */ - L_tmp = L_max( L_tmp, 13926 ); /*Q14 */ - tmp2 = extract_l( L_min( L_tmp, 16384 ) ); /*Q14 */ - alpha_fx = shl( mult( alpha_fx, tmp2 ), 1 ); /*14+14-15+1 =Q14 */ + L_tmp = L_shl_sat( Mult_32_16( Ep_tmp_fx[i], tmp2 ), sub( 19, exp ) ); /*Q(13+exp-15 +19-exp +3 = 20) */ + L_tmp = Mult_32_16( L_tmp, shl( sub( bands_fx, lowband ), 9 ) ); /*20 +9 -15 =Q14 */ + L_tmp = L_max( L_tmp, 13926 ); /*Q14 */ + tmp2 = extract_l( L_min( L_tmp, 16384 ) ); /*Q14 */ + alpha_fx = shl( mult( alpha_fx, tmp2 ), 1 ); /*14+14-15+1 =Q14 */ } L_band_energy_tmp[i] = L_shl( Mult_32_16( L_band_energy_tmp[i], alpha_fx ), 1 ); /*Q(Q_band_energy+14-15 +1= Q_band_energy) */ move32(); @@ -741,7 +735,7 @@ void hq_lr_enc_fx( /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */ FOR( i = 0; i < 2; i++ ) { - push_indice_fx( st_fx->hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 ); + push_indice( st_fx->hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 ); } } ELSE IF( is_transient_fx == 0 && EQ_16( inner_frame_fx, L_FRAME16k ) ) @@ -749,7 +743,7 @@ void hq_lr_enc_fx( bit_budget_fx = sub( bit_budget_fx, 2 ); /* bits in high bands to indicate the last 2 subbands is allocated bits or not Q0*/ FOR( i = 0; i < bands_fx; i++ ) { - Ep_tmp_fx[i] = L_shl_o( Ep_tmp_fx[i], 2, &Overflow ); /* Q15 */ + Ep_tmp_fx[i] = L_shl_sat( Ep_tmp_fx[i], 2 ); /* Q15 */ move32(); } IF( EQ_32( st_fx->core_brate, ACELP_13k20 ) ) @@ -781,7 +775,7 @@ void hq_lr_enc_fx( IF( GE_16( i, lowband ) && add( sub( i, bands_fx ), p2a_bands_fx ) < 0 ) { Ep_vari_fx = L_add_sat( Ep_vari_fx, L_abs( L_sub_sat( Ep_tmp_fx[i], Ep_tmp_fx[( i - 1 )] ) ) ); /*Q15 */ - Ep_avrg_fx = L_add_o( Ep_avrg_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ + Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */ } IF( GE_16( i, highband ) ) @@ -849,8 +843,8 @@ void hq_lr_enc_fx( IF( EQ_16( hHQ_core->last_bitalloc_max_band[sub( i, add( tmp, 1 ) )], 1 ) ) { tmp = sub( tmp, lowband ); - L_tmp = Mult_32_16( Ep_tmp_fx[i], tmp ); /*Q(15+0-15 = 0) */ - tmp = extract_h( L_shl_o( L_tmp, 16, &Overflow ) ); /*Q0 */ + L_tmp = Mult_32_16( Ep_tmp_fx[i], tmp ); /*Q(15+0-15 = 0) */ + tmp = extract_h( L_shl_sat( L_tmp, 16 ) ); /*Q0 */ IF( tmp != 0 ) { exp = norm_s( tmp ); @@ -911,11 +905,11 @@ void hq_lr_enc_fx( { IF( GE_16( i, lowband ) ) { - Ep_avrg_fx = L_add_o( Ep_avrg_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ + Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */ } ELSE { - Ep_avrgL_fx = L_add_o( Ep_avrgL_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ + Ep_avrgL_fx = L_add_sat( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */ IF( GT_32( Ep_tmp_fx[i], Ep_peak_fx ) ) { Ep_peak_fx = L_add( Ep_tmp_fx[i], 0 ); /*Q15 */ @@ -970,7 +964,7 @@ void hq_lr_enc_fx( /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */ FOR( i = 0; i < 2; i++ ) { - push_indice_fx( st_fx->hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 ); + push_indice( st_fx->hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 ); } } ELSE IF( EQ_16( st_fx->bwidth, SWB ) && EQ_16( hqswb_clas_fx, HQ_HARMONIC ) && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) ) @@ -1179,13 +1173,9 @@ void hq_lr_enc_ivas_fx( Word32 L_band_energy_tmp[BANDS_MAX]; UWord16 lo; Word16 Q_band_energy; - Flag Overflow; - move32(); - BSTR_ENC_HANDLE hBstr = st->hBstr; HQ_ENC_HANDLE hHQ_core = st->hHQ_core; - set32_fx( L_y2, 0x0L, L_FRAME48k ); set32_fx( inp_vector, 0, inner_frame ); flag_spt = 0; @@ -1448,7 +1438,7 @@ void hq_lr_enc_ivas_fx( } ELSE { - Ep_avrgL_fx = L_add_o( Ep_avrgL_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ + Ep_avrgL_fx = L_add_sat( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */ IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 ) { Ep_peak_fx = Ep_tmp_fx[i]; /*Q15 */ @@ -1572,10 +1562,10 @@ void hq_lr_enc_ivas_fx( move16(); } Mpy_32_16_ss( Ep_avrg_fx, tmp, &L_tmp, &lo ); - L_tmp = L_shl_o( L_tmp, sub( 14, exp ), &Overflow ); /*Q(13+exp-15 +14-exp+2 = 14) */ - L_tmp = L_max( L_tmp, 16384 ); /*14 */ - tmp = extract_l( L_min( L_tmp, beta_fx ) ); /*14 */ - alpha_fx = shl( mult( alpha_fx, tmp ), 1 ); /*14+14-15 +1=14 */ + L_tmp = L_shl_sat( L_tmp, sub( 14, exp ) ); /*Q(13+exp-15 +14-exp+2 = 14) */ + L_tmp = L_max( L_tmp, 16384 ); /*14 */ + tmp = extract_l( L_min( L_tmp, beta_fx ) ); /*14 */ + alpha_fx = shl( mult( alpha_fx, tmp ), 1 ); /*14+14-15 +1=14 */ } ELSE { @@ -1619,7 +1609,7 @@ void hq_lr_enc_ivas_fx( { IF( sub( i, lowband ) >= 0 ) { - Ep_avrg_fx = L_add_o( Ep_avrg_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ + Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */ } ELSE { @@ -1661,8 +1651,8 @@ void hq_lr_enc_ivas_fx( Mpy_32_16_ss( Ep_peak_fx, tmp, &L_tmp, &lo ); Mpy_32_16_ss( L_tmp, lowband, &L_tmp, &lo ); Mpy_32_16_ss( L_tmp, 18842, &L_tmp, &lo ); - L_tmp = L_shl_o( L_tmp, sub( 27, exp ), &Overflow ); /*Q14 0.5 */ - tmp2 = extract_l( L_min( L_tmp, 19661 ) ); /*14 */ + L_tmp = L_shl_sat( L_tmp, sub( 27, exp ) ); /*Q14 0.5 */ + tmp2 = extract_l( L_min( L_tmp, 19661 ) ); /*14 */ Mpy_32_16_ss( L_band_energy_tmp[i], tmp2, &L_tmp, &lo ); L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q_band_energy */ move32(); @@ -1685,7 +1675,7 @@ void hq_lr_enc_ivas_fx( bit_budget = sub( bit_budget, 2 ); /* bits in high bands to indicate the last 2 subbands is allocated bits or not */ FOR( i = 0; i < bands; i++ ) { - Ep_tmp_fx[i] = L_shl_o( Ep_tmp_fx[i], 2, &Overflow ); /* Q15 */ + Ep_tmp_fx[i] = L_shl_sat( Ep_tmp_fx[i], 2 ); /* Q15 */ move32(); } IF( EQ_32( st->core_brate, ACELP_13k20 ) ) @@ -1721,7 +1711,7 @@ void hq_lr_enc_ivas_fx( IF( sub( i, lowband ) >= 0 && add( sub( i, bands ), p2a_bands ) < 0 ) { Ep_vari_fx = L_add( Ep_vari_fx, L_abs( L_sub( Ep_tmp_fx[i], Ep_tmp_fx[sub( i, 1 )] ) ) ); /*Q15 */ - Ep_avrg_fx = L_add_o( Ep_avrg_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ + Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */ } IF( sub( i, highband ) >= 0 ) @@ -1754,7 +1744,7 @@ void hq_lr_enc_ivas_fx( tmp = sub( bands, p2a_bands ); tmp = sub( tmp, lowband ); /*Q0 */ - tmp1 = extract_h( L_shl_o( Ep_avrg_fx, 1, &Overflow ) ); /*Q0 */ + tmp1 = extract_h( L_shl_sat( Ep_avrg_fx, 1 ) ); /*Q0 */ IF( tmp1 != 0 ) { exp = norm_s( tmp1 ); @@ -1793,7 +1783,7 @@ void hq_lr_enc_ivas_fx( { tmp = sub( tmp, lowband ); Mpy_32_16_ss( Ep_tmp_fx[i], tmp, &L_tmp, &lo ); - tmp = extract_h( L_shl_o( L_tmp, 16, &Overflow ) ); /*Q0 */ + tmp = extract_h( L_shl_sat( L_tmp, 16 ) ); /*Q0 */ IF( tmp != 0 ) { exp = norm_s( tmp ); @@ -1817,8 +1807,7 @@ void hq_lr_enc_ivas_fx( ELSE { tmp = sub( tmp, lowband ); - - tmp1 = extract_h( L_shl_o( Ep_avrg_fx, 1, &Overflow ) ); /*Q0 */ + tmp1 = extract_h( L_shl_sat( Ep_avrg_fx, 1 ) ); /*Q0 */ IF( tmp1 != 0 ) { exp = norm_s( tmp1 ); @@ -1857,11 +1846,11 @@ void hq_lr_enc_ivas_fx( { IF( sub( i, lowband ) >= 0 ) { - Ep_avrg_fx = L_add_o( Ep_avrg_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ + Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */ } ELSE { - Ep_avrgL_fx = L_add_o( Ep_avrgL_fx, Ep_tmp_fx[i], &Overflow ); /*Q15 */ + Ep_avrgL_fx = L_add_sat( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */ IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 ) { Ep_peak_fx = Ep_tmp_fx[i]; /* Q15 */ @@ -1886,7 +1875,7 @@ void hq_lr_enc_ivas_fx( move16(); FOR( i = 0; i < lowband; i++ ) { - tmp = extract_h( L_shl_o( Ep_avrgL_fx, 1, &Overflow ) ); /*Q0 */ + tmp = extract_h( L_shl_sat( Ep_avrgL_fx, 1 ) ); /*Q0 */ IF( tmp != 0 ) { exp = norm_s( tmp ); @@ -2151,14 +2140,14 @@ static Word16 small_symbol_enc_tran_ivas_fx( /* o : bit * if flag_pack = 0, estimatng else packing bits *--------------------------------------------------------------------------*/ -static Word16 small_symbol_enc_fx( /* o : bits */ - BSTR_ENC_HANDLE hBstr, /* i : handle to the bitstream */ - const Word16 *qbidx, /* i : input of dequantized differential energy Q0*/ - const Word16 BANDS, /* i : number of bands Q0*/ - Word16 *hLCmode, /* i/o: LC mode info Q0*/ - const Word16 flag_pack /* i : indicator of packing or estimating bits Q0*/ - , - const Word16 is_transient /* Q0 */ ) +/* o : bits */ +static Word16 small_symbol_enc_fx( + BSTR_ENC_HANDLE hBstr, /* i : handle to the bitstream */ + const Word16 *qbidx, /* i : input of dequantized differential energy Q0*/ + const Word16 BANDS, /* i : number of bands Q0*/ + Word16 *hLCmode, /* i/o: LC mode info Q0*/ + const Word16 flag_pack, /* i : indicator of packing or estimating bits Q0*/ + const Word16 is_transient /* Q0 */ ) { Word16 i, bits; Word16 difidx[BANDS_MAX], LSB[BANDS_MAX]; @@ -2213,7 +2202,7 @@ static Word16 small_symbol_enc_fx( /* o : bits /* Encoding LSB bit packing */ FOR( i = 0; i < BANDS; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, LSB[i], BITS_DE_LSB ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB[i], BITS_DE_LSB ); } } @@ -2289,12 +2278,13 @@ static Word16 small_symbol_enc_ivas_fx( } -static Word16 large_symbol_enc_fx( /* o : bits Q0*/ - BSTR_ENC_HANDLE hBstr, /* i : handle to the bitstream */ - Word16 *qbidx, /* i : input of dequantized differential energy Q0*/ - const Word16 BANDS, /* i : number of bands Q0*/ - Word16 *hLCmode0, /* i/o: LC mode info Q0*/ - const Word16 flag_pack /* i : indicator of packing or estimating bits Q0*/ +/* o : bits Q0 */ +static Word16 large_symbol_enc_fx( + BSTR_ENC_HANDLE hBstr, /* i : handle to the bitstream */ + Word16 *qbidx, /* i : input of dequantized differential energy Q0*/ + const Word16 BANDS, /* i : number of bands Q0*/ + Word16 *hLCmode0, /* i/o: LC mode info Q0*/ + const Word16 flag_pack /* i : indicator of packing or estimating bits Q0*/ ) { Word16 i, bits, tmp; @@ -2526,74 +2516,74 @@ static Word16 large_symbol_enc_fx( /* o : bits /* Encoding MSB bits */ IF( *hLCmode0 == 0 ) { - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE, 0, BITS_DE_8SMODE ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE, 0, BITS_DE_8SMODE ); bits = BITS_DE_8SMODE; move16(); IF( cnt_outlyer0 == 0 ) { - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE_N0, 0, BITS_DE_8SMODE_N0 ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 0, BITS_DE_8SMODE_N0 ); bits = add( bits, BITS_DE_8SMODE_N0 ); IF( EQ_16( cnt_outlyer, 1 ) ) { /* 01 */ - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 ); bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */ - push_indice_fx( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS ); + push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS ); bits = add( bits, BITS_DE_8SPOS ); - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG ); bits = add( bits, BITS_ABS_ENG ); } ELSE { /* 00 */ - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 ); bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */ } FOR( i = 0; i < pos_outlyer; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */ } FOR( i = ( pos_outlyer + 1 ); i < BANDS; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */ } } ELSE IF( EQ_16( cnt_outlyer0, 1 ) ) { - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE_N0, 1, BITS_DE_8SMODE_N0 ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 1, BITS_DE_8SMODE_N0 ); bits = add( bits, BITS_DE_8SMODE_N0 ); IF( EQ_16( cnt_outlyer, 1 ) ) { - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 ); bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */ - push_indice_fx( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS ); + push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS ); bits = add( bits, BITS_DE_8SPOS ); - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG ); bits = add( bits, BITS_ABS_ENG ); - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG ); bits = add( bits, BITS_ABS_ENG ); } ELSE { - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 ); bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */ - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG ); bits = add( bits, BITS_ABS_ENG ); /* Q0 */ } FOR( i = 1; i < pos_outlyer; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); bits = add( bits, hessize[tdifidx0[i] + 4] ); /* Q0 */ } FOR( i = pos_outlyer + 1; i < BANDS; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); bits = add( bits, hessize[tdifidx0[i] + 4] ); /* Q0 */ } } @@ -2601,12 +2591,12 @@ static Word16 large_symbol_enc_fx( /* o : bits ELSE { bits = add( BITS_DE_8SMODE, BITS_MAX_DEPTH ); /* Q0 */ - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE, 1, BITS_DE_8SMODE ); - push_indice_fx( hBstr, IND_HQ2_DENG_8SDEPTH, lsbdepth1, BITS_MAX_DEPTH ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE, 1, BITS_DE_8SMODE ); + push_indice( hBstr, IND_HQ2_DENG_8SDEPTH, lsbdepth1, BITS_MAX_DEPTH ); FOR( i = 0; i < BANDS; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx1[i] + 4], hessize[tdifidx1[i] + 4] ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx1[i] + 4], hessize[tdifidx1[i] + 4] ); bits = add( bits, hessize[tdifidx1[i] + 4] ); /* Q0 */ } @@ -2614,7 +2604,7 @@ static Word16 large_symbol_enc_fx( /* o : bits { FOR( i = 0; i < BANDS; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, LSB1[i], lsbdepth1 ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB1[i], lsbdepth1 ); } /*bits += BANDS * lsbdepth1; */ bits = add( bits, extract_h( L_shl( L_mult( BANDS, lsbdepth1 ), 15 ) ) ); /* Q0 */ @@ -3115,7 +3105,7 @@ static Word16 band_energy_quant_fx( { deng_cmode = 0; move16(); - push_indice_fx( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE ); + push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE ); large_symbol_enc_fx( hBstr, bq2_fx, bands_fx, &hLCmode0, 1 ); deng_bits = add( ebits, BITS_DE_CMODE ); /* Q0 */ } @@ -3124,7 +3114,7 @@ static Word16 band_energy_quant_fx( /* setting energy difference coding mode and storing it */ deng_cmode = 1; move16(); - push_indice_fx( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE ); + push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE ); deng_bits = add( hbits, BITS_DE_CMODE ); /* Q0 */ @@ -3165,7 +3155,7 @@ static Word16 band_energy_quant_fx( static Word16 band_energy_quant_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const Word32 *L_t_audio, /* i : Q12 : input MDCT signal (Qs) */ const Word16 band_start[], /* i : Q0 : band start table */ const Word16 band_end[], /* i : Q0 : band end table */ @@ -3173,7 +3163,8 @@ static Word16 band_energy_quant_ivas_fx( const Word16 bands, /* i : Q0 : number of bands */ const Word32 L_qint, /* i : Q29 */ const Word16 eref_fx, /* i : Q10 */ - const Word16 is_transient /* i : Q0 : indicator for HQ_TRANSIENT */ ) + const Word16 is_transient /* i : Q0 : indicator for HQ_TRANSIENT */ +) { Word16 i, k; Word16 ebits; @@ -3394,10 +3385,6 @@ static Word16 p2a_threshold_quant_fx( Word32 L_p2a; Word16 p2a_fx; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif exp_safe = 4; /* never happen overflow. */ move16(); @@ -3464,7 +3451,7 @@ static Word16 p2a_threshold_quant_fx( /* 10/( log(10)/log(2) ) = 3.01029995663981195211 24660(Q13) */ L_p2a = Mpy_32_16_1( L_tmp, 24660 ); /* 16+13-15 -> Q14 */ - p2a_fx = round_fx_o( L_shl_o( L_p2a, 13, &Overflow ), &Overflow ); /* 27 -16 -> 11 */ + p2a_fx = round_fx_sat( L_shl_sat( L_p2a, 13 ) ); /* 27 -16 -> 11 */ } IF( LE_16( p2a_fx, p2a_th_fx ) ) @@ -3479,7 +3466,7 @@ static Word16 p2a_threshold_quant_fx( move16(); } - push_indice_fx( hBstr, IND_HQ2_P2A_FLAGS, p2a_flags_fx[k], 1 ); + push_indice( hBstr, IND_HQ2_P2A_FLAGS, p2a_flags_fx[k], 1 ); j = add( j, 1 ); } @@ -3514,10 +3501,6 @@ static Word16 p2a_threshold_quant_ivas_fx( Word32 L_p2a; Word16 p2a_fx; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif exp_safe = 4; /* never happen overflow. */ move16(); @@ -3583,7 +3566,7 @@ static Word16 p2a_threshold_quant_ivas_fx( /* 10/( log(10)/log(2) ) = 3.01029995663981195211 24660(Q13) */ L_p2a = Mpy_32_16_1( L_tmp, 24660 ); /* 16+13-15 -> Q14 */ - p2a_fx = round_fx_o( L_shl_o( L_p2a, 13, &Overflow ), &Overflow ); /* 27 -16 -> 11 */ + p2a_fx = round_fx_sat( L_shl_sat( L_p2a, 13 ) ); /* 27 -16 -> 11 */ } IF( LE_16( p2a_fx, p2a_th_fx ) ) @@ -3650,10 +3633,6 @@ static void mdct_spectrum_fine_gain_enc_fx( Word16 d_fx; Word16 dmin_fx; Word16 imin_fx; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* Fine gain quantization on only the most significant energy bands */ @@ -3723,9 +3702,9 @@ static void mdct_spectrum_fine_gain_enc_fx( exp_normn = norm_l( L_Exy ); exp_normn = sub( exp_normn, 1 ); exp_normd = norm_l( L_Eyy ); - gamma_fx = div_l( L_shl_o( L_Exy, exp_normn, &Overflow ), round_fx_o( L_shl_o( L_Eyy, exp_normd, &Overflow ), &Overflow ) ); /* Qgamma */ - Qgamma = add( sub( exp_normn, exp_normd ), 15 ); /* exp_normn - (exp_normd-16) - 1; */ - gamma_fx = shl( gamma_fx, sub( 14, Qgamma ) ); /* Qgamma -> Q14 */ + gamma_fx = div_l( L_shl( L_Exy, exp_normn ), round_fx_sat( L_shl( L_Eyy, exp_normd ) ) ); /* Qgamma */ + Qgamma = add( sub( exp_normn, exp_normd ), 15 ); /* exp_normn - (exp_normd-16) - 1; */ + gamma_fx = shl( gamma_fx, sub( 14, Qgamma ) ); /* Qgamma -> Q14 */ dmin_fx = 32767; move16(); @@ -3768,7 +3747,7 @@ static void mdct_spectrum_fine_gain_enc_fx( move16(); } - push_indice_fx( st_fx->hBstr, IND_HQ2_SUBBAND_GAIN, imin_fx, gqbits ); + push_indice( st_fx->hBstr, IND_HQ2_SUBBAND_GAIN, imin_fx, gqbits ); } return; @@ -3812,10 +3791,6 @@ static void mdct_spectrum_fine_gain_enc_ivas_fx( Word16 d_fx; Word16 dmin_fx; Word16 imin_fx; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* Fine gain quantization on only the most significant energy bands */ @@ -3885,9 +3860,9 @@ static void mdct_spectrum_fine_gain_enc_ivas_fx( exp_normn = norm_l( L_Exy ); exp_normn = sub( exp_normn, 1 ); exp_normd = norm_l( L_Eyy ); - gamma_fx = div_l( L_shl_o( L_Exy, exp_normn, &Overflow ), round_fx_o( L_shl_o( L_Eyy, exp_normd, &Overflow ), &Overflow ) ); /* Qgamma */ - Qgamma = add( sub( exp_normn, exp_normd ), 15 ); /* exp_normn - (exp_normd-16) - 1; */ - gamma_fx = shl( gamma_fx, sub( 14, Qgamma ) ); /* Qgamma -> Q14 */ + gamma_fx = div_l( L_shl( L_Exy, exp_normn ), round_fx_sat( L_shl( L_Eyy, exp_normd ) ) ); /* Qgamma */ + Qgamma = add( sub( exp_normn, exp_normd ), 15 ); /* exp_normn - (exp_normd-16) - 1; */ + gamma_fx = shl( gamma_fx, sub( 14, Qgamma ) ); /* Qgamma -> Q14 */ dmin_fx = 32767; move16(); diff --git a/lib_enc/hvq_enc_fx.c b/lib_enc/hvq_enc_fx.c index b06a1734dd6e65a8e17e029efdc5d5bb6a1f0347..57692bbefc0919f12b67ee156432804c8ae5b14f 100644 --- a/lib_enc/hvq_enc_fx.c +++ b/lib_enc/hvq_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -49,10 +49,7 @@ Word16 hvq_enc_ivas_fx( /*o : Consumed bits Word16 expPeMean, expNfMean, expNfpe, expNfpe3, expo, expo3; Word16 manPeMean, manNfMean, manNfpe, man; Word16 tmp16, adjust; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + bits_used = 0; move16(); @@ -118,7 +115,7 @@ Word16 hvq_enc_ivas_fx( /*o : Consumed bits nf_cnt = add( nf_cnt, 1 ); /* Q0 */ } - pe_mean = L_add_o( pe_mean, pe, &Overflow ); /* in Q12 and always positive */ + pe_mean = L_add_sat( pe_mean, pe ); /* in Q12 and always positive */ } IF( pe_mean > 0 ) @@ -145,8 +142,8 @@ Word16 hvq_enc_ivas_fx( /*o : Consumed bits acc = L_mult( tmp16, HVQ_NFPE_FACTOR_CUBE_FX ); /* in Q(12+6+1) = Q19 */ expNfpe3 = extract_l( L_mult0( expNfpe, 3 ) ); /* Cube operation */ /* Number of bits required to adjust to Q15 */ - adjust = add( 19 - ( 15 + 16 ), expNfpe3 ); /* +16 is due to the following extract_h(). */ - noise_level[i] = extract_h( L_shr_o( acc, adjust, &Overflow ) ); /* noise_level[] in Q15 */ + adjust = add( 19 - ( 15 + 16 ), expNfpe3 ); /* +16 is due to the following extract_h(). */ + noise_level[i] = extract_h( L_shr_sat( acc, adjust ) ); /* noise_level[] in Q15 */ move16(); q_noise_level_idx[i] = quant_lc_fx( noise_level[i], &q_noise_level[i] ); move16(); @@ -176,14 +173,14 @@ Word16 hvq_enc_ivas_fx( /*o : Consumed bits acc = L_mult( tmp16, HVQ_LB_NFPE_FACTOR_CUBE_FX ); /* in Q(12+9+1) = Q22 */ expo3 = extract_l( L_mult0( expo, 3 ) ); /* Cube operation. */ /* Number of bits required to adjust to Q15 */ - adjust = add( 22 - ( 15 + 16 ), expo3 ); /* +16 is due to the following extract_h(). */ - lb_nfpe = extract_h( L_shr_o( acc, adjust, &Overflow ) ); /* noise_level[] in Q15 */ - IF( GT_16( lb_nfpe, 16384 ) ) /* in Q15 */ + adjust = add( 22 - ( 15 + 16 ), expo3 ); /* +16 is due to the following extract_h(). */ + lb_nfpe = extract_h( L_shr_sat( acc, adjust ) ); /* noise_level[] in Q15 */ + IF( GT_16( lb_nfpe, 16384 ) ) /* in Q15 */ { lb_nfpe = 16384; move16(); } - Mpy_32_16_ss( nf_gains[i], shl_o( lb_nfpe, 1, &Overflow ), &nf_gains[i], &dontCare ); /* nf_gains[] in Q12 */ + Mpy_32_16_ss( nf_gains[i], shl_sat( lb_nfpe, 1 ), &nf_gains[i], &dontCare ); /* nf_gains[] in Q12 */ } ELSE { @@ -226,10 +223,7 @@ Word16 hvq_enc_fx( /*o : Consumed bits Word16 expPeMean, expNfMean, expNfpe, expNfpe3, expo, expo3; Word16 manPeMean, manNfMean, manNfpe, man; Word16 tmp16, adjust; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + bits_used = 0; move16(); @@ -295,7 +289,7 @@ Word16 hvq_enc_fx( /*o : Consumed bits nf_cnt = add( nf_cnt, 1 ); /* Q0 */ } - pe_mean = L_add_o( pe_mean, pe, &Overflow ); /* in Q12 and always positive */ + pe_mean = L_add_sat( pe_mean, pe ); /* in Q12 and always positive */ } IF( pe_mean > 0 ) @@ -322,8 +316,8 @@ Word16 hvq_enc_fx( /*o : Consumed bits acc = L_mult( tmp16, HVQ_NFPE_FACTOR_CUBE_FX ); /* in Q(12+6+1) = Q19 */ expNfpe3 = extract_l( L_mult0( expNfpe, 3 ) ); /* Cube operation */ /* Number of bits required to adjust to Q15 */ - adjust = add( 19 - ( 15 + 16 ), expNfpe3 ); /* +16 is due to the following extract_h(). */ - noise_level[i] = extract_h( L_shr_o( acc, adjust, &Overflow ) ); /* noise_level[] in Q15 */ + adjust = add( 19 - ( 15 + 16 ), expNfpe3 ); /* +16 is due to the following extract_h(). */ + noise_level[i] = extract_h( L_shr_sat( acc, adjust ) ); /* noise_level[] in Q15 */ move16(); q_noise_level_idx[i] = quant_lc_fx( noise_level[i], &q_noise_level[i] ); move16(); @@ -335,7 +329,7 @@ Word16 hvq_enc_fx( /*o : Consumed bits q_noise_level[i] = 0; move16(); } - push_indice_fx( st_fx->hBstr, IND_HVQ_BWE_NL, q_noise_level_idx[i], 2 ); + push_indice( st_fx->hBstr, IND_HVQ_BWE_NL, q_noise_level_idx[i], 2 ); bits_used = add( bits_used, 2 ); noise_level[i] = q_noise_level[i]; /* in Q15 */ @@ -353,14 +347,14 @@ Word16 hvq_enc_fx( /*o : Consumed bits acc = L_mult( tmp16, HVQ_LB_NFPE_FACTOR_CUBE_FX ); /* in Q(12+9+1) = Q22 */ expo3 = extract_l( L_mult0( expo, 3 ) ); /* Cube operation. */ /* Number of bits required to adjust to Q15 */ - adjust = add( 22 - ( 15 + 16 ), expo3 ); /* +16 is due to the following extract_h(). */ - lb_nfpe = extract_h( L_shr_o( acc, adjust, &Overflow ) ); /* noise_level[] in Q15 */ - IF( lb_nfpe > 16384 ) /* in Q15 */ + adjust = add( 22 - ( 15 + 16 ), expo3 ); /* +16 is due to the following extract_h(). */ + lb_nfpe = extract_h( L_shr_sat( acc, adjust ) ); /* noise_level[] in Q15 */ + IF( lb_nfpe > 16384 ) /* in Q15 */ { lb_nfpe = 16384; move16(); } - Mpy_32_16_ss( nf_gains[i], shl_o( lb_nfpe, 1, &Overflow ), &nf_gains[i], &dontCare ); /* nf_gains[] in Q12 */ + Mpy_32_16_ss( nf_gains[i], shl_sat( lb_nfpe, 1 ), &nf_gains[i], &dontCare ); /* nf_gains[] in Q12 */ } ELSE { diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c deleted file mode 100644 index fc7c32fdbd7119867a844145f82b2c742ab98662..0000000000000000000000000000000000000000 --- a/lib_enc/igf_enc.c +++ /dev/null @@ -1,2811 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include -#include "options.h" -#include -#include "prot_fx.h" -#include "cnst.h" -#include "stat_enc.h" -#include "wmc_auto.h" -#include "prot_fx_enc.h" - - -#define INV_Log2_10_Q15 9864 /*1/log2(10) in Q15*/ -#define INV_Log2_10_Q12 1233 /*1/log2(10) in Q12*/ -#define INV_Log2_e_Q15 22713 /*1/log2(e) in Q15*/ -/*-------------------------------------------------------------------* - * IGF_write_bit_fx() - * - * write single bit to stream - *-------------------------------------------------------------------*/ -static void IGF_write_bit_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 *bitCount, /* i/o: bit counter */ - const Word16 value /* i : value */ -) -{ - IF( hBstr ) - { - push_next_indice( hBstr, value, 1 ); - } - - ( *bitCount ) = add( ( *bitCount ), 1 ); - move16(); - - return; -} - -/*-------------------------------------------------------------------* - * IGF_write_bits() - * - * write bits to stream - *-------------------------------------------------------------------*/ -static void IGF_write_bits( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 *bitCount, /* i/o: bit counter */ - const Word16 value, /* i/o: value */ - Word16 bits /* i : number of bits */ -) -{ - WHILE( bits-- ) - { - IF( s_and( value, shl( 1, bits ) ) == 0 ) - { - IGF_write_bit_fx( hBstr, bitCount, 0 ); - } - ELSE - { - IGF_write_bit_fx( hBstr, bitCount, 1 ); - } - } - - return; -} - - -/*-------------------------------------------------------------------* - * IGF_getCrest_new() - * - * crest factor calculation - *-------------------------------------------------------------------*/ - -/*! r: crest factor */ -static Word16 IGF_getCrest_new_fx( - const Word16 *logSpec, /* i : power spectrum */ - const Word16 start, /* i : start subband index */ - const Word16 stop, /* i : stop subband index */ - Word16 *crest_exp /*Stores the exponent of the result(return value)*/ -) -{ - Word16 i; - Word16 x; - Word32 x_eff; - Word16 x_max; - Word16 exp; - Word16 temp; - Word16 temp_e; - Word16 crest; /*1.0f in Q15*/ - x_eff = 0; - x_max = 0; - exp = 0; - temp = 0; - crest = 32767; /*1.0f in Q15*/ - move32(); - move16(); - move16(); - move16(); - move16(); - - FOR( i = start; i < stop; i++ ) - { - x = logSpec[i]; - move16(); - x_eff = L_add( x_eff, L_mult0( x, x ) ); - - IF( GT_16( x, x_max ) ) - { - x_max = x; - move16(); - } - } - - x_eff = BASOP_Util_Divide3216_Scale( x_eff, sub( stop, start ), &temp_e ); - temp_e = add( temp_e, 16 ); /*exp += 31 - 15 + 16(because x_eff is word32)*/ - x_eff = L_shr( x_eff, sub( 15, temp_e ) ); - temp_e = 15; - move16(); - temp = Sqrt16( extract_l( x_eff ), &temp_e ); - - test(); - IF( x_eff > 0 && x_max > 0 ) - { - temp = BASOP_Util_Divide1616_Scale( x_max, temp, &exp ); - exp = add( exp, sub( 15, temp_e ) ); - IF( exp < 0 ) - { - temp = shl( temp, exp ); - exp = 0; - move16(); - } - crest = s_max( shl_sat( 1, sub( 15, exp ) ), temp ); - } - *crest_exp = exp; - move16(); - return crest; -} - - -/*-------------------------------------------------------------------* - * IGF_getSFM_new() - * - * calculates spectral flatness measurement - *-------------------------------------------------------------------*/ - -/*! r: SFM value */ -static Word16 IGF_getSFM_new_fx( - const Word32 *powerSpectrum, /* i : power spectrum */ - const Word16 *logSpec, /* i : log of power spectrum */ - const Word16 start, /* i : start subband index */ - const Word16 stop, /* i : stop subband index */ - Word16 *e_ps /*Stores exp related to power spectrum*/ -) -{ - Word16 n; - Word16 i; - Word16 num; - Word32 denom; - Word16 numf; - Word32 tmp; - Word16 sfm; - Word16 sfm_e; - Word16 denom_e; - Word16 numf_e; /*stores exponent for numf*/ - Word16 tmp_e; - - num = 0; - denom = ONE_IN_Q30; - denom_e = 1; - sfm = MAX16B; // Q15 - move16(); - move32(); - move16(); - move16(); - - FOR( i = start; i < stop; i++ ) - { - tmp = powerSpectrum[i]; - n = logSpec[i /*-start*/]; - move32(); - move16(); - num = add( num, n ); - denom = BASOP_Util_Add_Mant32Exp( tmp, e_ps[i], denom, denom_e, &denom_e ); - } - - numf = BASOP_Util_Divide1616_Scale( num, sub( stop, start ), &numf_e ); - denom = BASOP_Util_Divide3216_Scale( denom, sub( stop, start ), &tmp_e ); - denom_e = add( add( denom_e, tmp_e ), 1 ); /*denom_e+tmp_e-15 +16(because type of denom is word32)*/ - - IF( denom != 0 ) - { - tmp = BASOP_util_Pow2( L_add( numf, shl_sat( 1, sub( 14, numf_e ) ) ), add( 16, numf_e ), &tmp_e ); - sfm = BASOP_Util_Divide3232_Scale( tmp, denom, &sfm_e ); - sfm_e = add( sfm_e, sub( tmp_e, denom_e ) ); - sfm = shl_sat( extract_l( L_min( sfm, L_shl_sat( 1, sub( 15, sfm_e ) ) ) ), sfm_e ); - } - - return sfm; -} -/*-------------------------------------------------------------------* - * IGF_getTilt() - * - * calculates spectral tilt - *-------------------------------------------------------------------*/ - -/*! r: spectral tilt value */ - -/*-------------------------------------------------------------------* - * IGF_getTNR() - * - * calculates tonal-to-noise ratio - *-------------------------------------------------------------------*/ - -/*! r: spectral tilt value */ -/* Returns value with exponent as 9 and Q as 22*/ -static Word32 IGF_getTNR_fx( - const Word32 *powerSpectrum, /* i : energies */ - const Word16 start, /* i : start subband index */ - const Word16 stop, /* i : stop subband index */ - const Word16 adap, /* i : SFB width adaptation */ - Word16 e_ps, /*Stores exponent for powerSpectrum*/ - Word16 e_adap /*Stores exponent for adap*/ -) -{ - Word16 i; - Word16 width; - Word32 avg; - Word32 tonal; - Word16 tonal_e; /* holds exp for tonal*/ - Word32 noise; - Word16 noise_e; /* holds exp for noise*/ - Word32 tonalToNoise; - Word32 rootSpec[300]; - Word16 rootSpec_e[300]; /*rootSpec_e[i] holds exp for rootSpec[i]*/ - Word16 avg_e; /* holds exp for avg*/ - Word16 tmp_e; - avg = 0; - tonal = 0; - noise = EPSILON_FX; - tonal_e = 0; - noise_e = 0; - avg_e = 0; - tmp_e = 0; - move32(); - move32(); - move32(); - move16(); - move16(); - move16(); - move16(); - - set32_fx( rootSpec, 0, 300 ); - set16_fx( rootSpec_e, 0, 300 ); - - width = sub( stop, start ); - FOR( i = start; i < stop; i++ ) - { - rootSpec_e[i - start] = e_ps; - move16(); - rootSpec[i - start] = Sqrt32( powerSpectrum[i], &rootSpec_e[i - start] ); /*rootSpec[i - start] = sqrtf( powerSpectrum[i] );*/ - move32(); - avg = BASOP_Util_Add_Mant32Exp( avg, avg_e, rootSpec[i - start], rootSpec_e[i - start], &avg_e ); /*avg += rootSpec[i - start];resultant exponent is avg_e*/ - } - avg = BASOP_Util_Divide3216_Scale( avg, width, &tmp_e ); /*avg /= width;*/ - avg_e = add( 16, sub( add( avg_e, tmp_e ), 15 ) ); - - FOR( i = start; i < stop; i++ ) - { - Word16 normSpec_e; /*stores resultant exponent for normSpec*/ - Word16 normSpec = BASOP_Util_Divide3232_Scale( rootSpec[i - start], avg, &normSpec_e ); /*rootSpec[i - start] / avg;*/ - normSpec_e = add( normSpec_e, sub( rootSpec_e[i - start], avg_e ) ); - IF( GT_32( normSpec, L_add( L_shl( 1, sub( 15, normSpec_e ) ), L_shl( adap, sub( e_adap, normSpec_e ) ) ) ) ) - { - tonal = BASOP_Util_Add_Mant32Exp( tonal, tonal_e, rootSpec[i - start], rootSpec_e[i - start], &tonal_e ); /*tonal += rootSpec[i - start];*/ - } - ELSE IF( LT_32( normSpec, L_shl( 1, sub( 15, normSpec_e ) ) ) ) - { - noise = BASOP_Util_Add_Mant32Exp( noise, noise_e, rootSpec[i - start], rootSpec_e[i - start], &noise_e ); /*noise += rootSpec[i - start];*/ - } - } - - /*tonalToNoise = 20.f * log10f( max( 1e-018f, tonal / noise ) )*/ - IF( noise == 0 ) // To handle condition if denom = 0 - { - tonalToNoise = imult3216( L_shr( L_add( L_shl( 18 /* log10f(1e-018f) */, Q25 ), Mpy_32_16_1( L_add( BASOP_Util_Log2( tonal ), L_shl( tonal_e, Q25 ) ) /*Q25*/, INV_Log2_10_Q15 ) /*25+15-15*/ ), 3 ) /*Q22*/, 20 ); - } - ELSE - { - Word16 temp = BASOP_Util_Divide3232_Scale( tonal, noise, &tmp_e ); /*tonal / noise*/ - tmp_e = add( tmp_e, sub( tonal_e, noise_e ) ); - IF( GE_16( temp, 1 ) ) - { - tonalToNoise = imult3216( Mult_32_16( L_add( BASOP_Util_Log2( temp ), L_shl( add( 16, tmp_e ), Q25 ) ) /*Q25*/, INV_Log2_10_Q12 ) /*25+12-15*/, 20 ); /*Q22*/ - } - ELSE - { - tonalToNoise = -1509949440; /*-360.f Q22*/ - move32(); - } - } - - return tonalToNoise; -} - -static Word32 IGF_getTNR_ivas_fx( - const Word32 *powerSpectrum, /* i : energies */ - const Word16 start, /* i : start subband index */ - const Word16 stop, /* i : stop subband index */ - const Word16 adap, /* i : SFB width adaptation */ - Word16 *e_ps, /*Stores exponent for powerSpectrum*/ - Word16 e_adap /*Stores exponent for adap*/ -) -{ - Word16 i; - Word16 width; - Word32 avg; - Word32 tonal; - Word16 tonal_e; /* holds exp for tonal*/ - Word32 noise; - Word16 noise_e; /* holds exp for noise*/ - Word32 tonalToNoise; - Word32 rootSpec[300]; - Word16 rootSpec_e[300]; /*rootSpec_e[i] holds exp for rootSpec[i]*/ - Word16 avg_e; /* holds exp for avg*/ - Word16 tmp_e; - avg = 0; - tonal = 0; - noise = EPSILON_FX; - tonal_e = 0; - noise_e = 0; - avg_e = 0; - tmp_e = 0; - move32(); - move32(); - move32(); - move16(); - move16(); - move16(); - move16(); - - set32_fx( rootSpec, 0, 300 ); - set16_fx( rootSpec_e, 0, 300 ); - - width = sub( stop, start ); - FOR( i = start; i < stop; i++ ) - { - rootSpec_e[( i - start )] = e_ps[i]; - move16(); - rootSpec[( i - start )] = Sqrt32( powerSpectrum[i], &rootSpec_e[( i - start )] ); /*rootSpec[i - start] = sqrtf( powerSpectrum[i] );*/ - move32(); - avg = BASOP_Util_Add_Mant32Exp( avg, avg_e, rootSpec[( i - start )], rootSpec_e[( i - start )], &avg_e ); /*avg += rootSpec[i - start];resultant exponent is avg_e*/ - } - avg = BASOP_Util_Divide3216_Scale( avg, width, &tmp_e ); /*avg /= width;*/ - avg_e = add( 16, sub( add( avg_e, tmp_e ), 15 ) ); - - FOR( i = start; i < stop; i++ ) - { - Word16 normSpec_e; /*stores resultant exponent for normSpec*/ - Word16 normSpec = BASOP_Util_Divide3232_Scale( rootSpec[i - start], avg, &normSpec_e ); /*rootSpec[i - start] / avg;*/ - normSpec_e = add( normSpec_e, sub( rootSpec_e[i - start], avg_e ) ); - IF( GT_32( normSpec, L_add_sat( L_shl_sat( 1, sub( 15, normSpec_e ) ), L_shl_sat( adap, sub( e_adap, normSpec_e ) ) ) ) ) - { - tonal = BASOP_Util_Add_Mant32Exp( tonal, tonal_e, rootSpec[( i - start )], rootSpec_e[( i - start )], &tonal_e ); /*tonal += rootSpec[i - start];*/ - } - ELSE IF( LT_32( normSpec, L_shl_sat( 1, sub( 15, normSpec_e ) ) ) ) - { - noise = BASOP_Util_Add_Mant32Exp( noise, noise_e, rootSpec[( i - start )], rootSpec_e[( i - start )], &noise_e ); /*noise += rootSpec[i - start];*/ - } - } - - /*tonalToNoise = 20.f * log10f( max( 1e-018f, tonal / noise ) )*/ - IF( noise == 0 ) // To handle condition if denom = 0 - { - tonalToNoise = imult3216( L_shr( L_add( L_shl( 18 /* log10f(1e-018f) */, Q25 ), Mpy_32_16_1( L_add( BASOP_Util_Log2( tonal ), L_shl( tonal_e, Q25 ) ) /*Q25*/, INV_Log2_10_Q15 ) /*25+15-15*/ ), 3 ) /*Q22*/, 20 ); - } - ELSE - { - Word16 temp = BASOP_Util_Divide3232_Scale( tonal, noise, &tmp_e ); /*tonal / noise*/ - tmp_e = add( tmp_e, sub( tonal_e, noise_e ) ); - IF( GE_16( temp, 1 ) ) - { - tonalToNoise = imult3216( Mult_32_16( L_add( BASOP_Util_Log2( temp ), L_shl( add( 16, tmp_e ), Q25 ) ) /*Q25*/, INV_Log2_10_Q12 ) /*25+12-15*/, 20 ); /*Q22*/ - } - ELSE - { - tonalToNoise = -1509949440; /*-360.f Q22*/ - move32(); - } - } - - return tonalToNoise; -} - -/*-------------------------------------------------------------------* - * IGF_CalculateEnvelope() - * - * envelope estimation - *-------------------------------------------------------------------*/ - -static void IGF_CalculateEnvelope_ivas_fx( - const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ - Word32 *pMDCTSpectrum_fx, /* i : MDCT spectrum */ - Word16 e_mdct, /* i : exp of MDCT spectrum */ - Word32 *pPowerSpectrum_fx, /* i : MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 *e_ps, /* i : exp of power spectrum */ - const Word16 igfGridIdx, /* i : IGF grid index */ - const Word16 isTransient, /* i : flag indicating if transient is detected */ - const Word16 last_core_acelp, /* i : indicator if last frame was ACELP core */ - const Word16 element_mode, /* i : IVAS element_mode */ - const Word16 att /* i : attenuation */ -) -{ - IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; - H_IGF_GRID hGrid; - Word16 *swb_offset; - Word16 sfb; /* this is the actual scalefactor band */ - Word16 width; /* this is width in subbands of the actual scalefactor band */ - Word16 tile_idx; - Word16 strt_cpy; - Word32 gain; /* the gain which has to be applied to the source tile to get the destination energy */ - Word16 sb; - Word32 sfbEnergyR; - Word32 sfbEnergyC; /* the energy of the destination region of the tile */ - Word32 sfbEnergyTileR; - Word32 sfbEnergyTileC; /* the energy of the destination region of the tile */ - Word16 tmp, x, y; - Word16 mean_x_fx, mean_y_fx; - Word32 mean_xy_fx, mean_x2_fx; - Word16 tmp_tb; - Word16 tmp_sb; - Word16 sfbCnt; - Word16 sfm; - Word16 crest; - Word16 temp; - Word16 mean_x_e, mean_y_e; /*Stores exponent for mean_x and mean_y respectively*/ - Word16 mean_xy_e, mean_x2_e; /*stores exponent for mean_xy and mean_x2 respectively*/ - Word16 sfbEnergyTileR_e; /*Exponent for sfbEnergyTileR*/ - Word16 sfbEnergyTileC_e; /*Exponent for sfbEnergyTileC*/ - Word16 sfbEnergyC_e; /*Exponent for sfbEnergyC*/ - Word16 sfbEnergyR_e; - Word16 gain_e; /*exponent for gain*/ - Word16 tmp_tb_e; /*Stores exponent for tmp_tb*/ - Word16 tmp_sb_e; /*stores exponent for tmp_sb*/ - Word16 crest_exp; /*Stores the exponent of the result(return value)*/ - Word16 sfm_exp; /*stores exponent for ouput from sfm*/ - Word16 tmp_e; - - hPrivateData = &hIGFEnc->igfData; - hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx]; - swb_offset = hGrid->swb_offset; - - IF( element_mode > EVS_MONO ) - { - IF( igfGridIdx != IGF_GRID_LB_NORM ) - { - FOR( sfbCnt = 0; sfbCnt < sub( hGrid->sfbWrap[hGrid->nTiles], hGrid->sfbWrap[0] ); sfbCnt++ ) - { - /* reset filter */ - hPrivateData->prevSFM_FIR_SFB_TB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_FIR_TB_e[sfbCnt] - hPrivateData->prevSFB_FIR_TB_e[sfbCnt] = 0; - hPrivateData->prevSFM_IIR_SFB_TB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_IIR_TB_e[sfbCnt] - hPrivateData->prevSFB_IIR_TB_e[sfbCnt] = 0; - hPrivateData->prevSFM_FIR_SFB_SB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_FIR_SB_e[sfbCnt] - hPrivateData->prevSFB_FIR_SB_e[sfbCnt] = 0; - hPrivateData->prevSFM_IIR_SFB_SB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_IIR_SB_e[sfbCnt] - hPrivateData->prevSFB_IIR_SB_e[sfbCnt] = 0; - hPrivateData->prevDampingFactor_IIR_fx[sfbCnt] = MIN16B; /* -1.f in Q15*/ - hPrivateData->prevDampingFactor_IIR_e[sfbCnt] = 0; - hPrivateData->dampingFactorSmoothing[sfbCnt] = 2; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - } - } - - IF( pPowerSpectrum_fx ) - { - FOR( sb = hGrid->sbWrap[0]; sb < swb_offset[hGrid->sfbWrap[hGrid->nTiles]]; sb++ ) - { - IF( LT_32( 1, pPowerSpectrum_fx[sb] ) ) - { - hPrivateData->logSpec[sb] = s_max( 0, (Word16) L_shr( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( e_ps[sb], Q25 ) ), Q25 ) ); - move16(); - } - ELSE - { - hPrivateData->logSpec[sb] = 0; - move16(); - } - } - } - - FOR( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ ) - { - strt_cpy = hGrid->sbWrap[tile_idx]; - move16(); - - FOR( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) - { - width = sub( swb_offset[sfb + 1], swb_offset[sfb] ); - sfbEnergyTileR = EPSILON_FIX; - sfbEnergyTileC = EPSILON_FIX; - sfbEnergyC = EPSILON_FX; - sfbEnergyTileR_e = 0; - sfbEnergyTileC_e = 0; - sfbEnergyC_e = 0; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - - IF( pPowerSpectrum_fx != NULL ) - { - tmp = strt_cpy; - move16(); - FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ ) - { - Word16 shift = norm_l( pPowerSpectrum_fx[sb] ); - sfbEnergyC = BASOP_Util_Add_Mant32Exp( sfbEnergyC, sfbEnergyC_e, L_shl( pPowerSpectrum_fx[sb], shift ), sub( e_ps[sb], shift ), &sfbEnergyC_e ); - // sfbEnergyTileR = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR, sfbEnergyTileR_e, Mult_32_32( pMDCTSpectrum_fx[strt_cpy], pMDCTSpectrum_fx[strt_cpy] ), shl( e_mdct, 1 ), &sfbEnergyTileR_e ); - Word64 tmp64 = W_mult_32_32( pMDCTSpectrum_fx[strt_cpy], pMDCTSpectrum_fx[strt_cpy] ); - Word16 tmp64_e = W_norm( tmp64 ); - tmp64 = W_shl( tmp64, tmp64_e ); - - sfbEnergyTileR = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR, sfbEnergyTileR_e, W_extract_h( tmp64 ), shl( e_mdct, 1 ) - tmp64_e, &sfbEnergyTileR_e ); - shift = norm_l( pPowerSpectrum_fx[strt_cpy] ); - sfbEnergyTileC = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC, sfbEnergyTileC_e, L_shl( pPowerSpectrum_fx[strt_cpy], shift ), sub( e_ps[strt_cpy], shift ), &sfbEnergyTileC_e ); - - strt_cpy = add( strt_cpy, 1 ); - } - - sfbEnergyTileR = L_deposit_h( BASOP_Util_Divide3232_Scale( sfbEnergyTileR, width, &tmp_e ) ); - sfbEnergyTileR_e = add( sub( sfbEnergyTileR_e, Q31 ), tmp_e ); - - IF( sfbEnergyTileR == 0 ) - { - sfbEnergyTileR = EPSILON_FX; - sfbEnergyTileR_e = 0; - move32(); - move16(); - } - IF( sfbEnergyC == 0 ) - { - sfbEnergyC = EPSILON_FX; - sfbEnergyC_e = 0; - move32(); - move16(); - } - IF( sfbEnergyTileC == 0 ) - { - sfbEnergyTileC = EPSILON_FX; - sfbEnergyTileC_e = 0; - temp = BASOP_Util_Divide3232_Scale( sfbEnergyC, sfbEnergyTileC, &tmp_e ); - tmp_e = add( tmp_e, sub( sfbEnergyC_e, sfbEnergyTileC_e ) ); - move32(); - move16(); - } - ELSE - { - /*gain = (float) ( sfbEnergyTileR * ( sfbEnergyC / sfbEnergyTileC ) );*/ - temp = BASOP_Util_Divide3232_Scale( sfbEnergyC, sfbEnergyTileC, &tmp_e ); - tmp_e = add( tmp_e, sub( sfbEnergyC_e, sfbEnergyTileC_e ) ); - } - - gain = Mult_32_16( sfbEnergyTileR, temp ); // gain_e - gain_e = add( tmp_e, sfbEnergyTileR_e ); - - IF( element_mode > EVS_MONO ) - { - test(); - IF( !isTransient ) - { - Word16 diffSFM; - Word16 shiftedSFM = 0; - Word16 shiftedSFM_e = 0; - move16(); - move16(); - - // tmp_tb = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1] ) / IGF_getCrest_new( hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1] ); - sfm = IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1], e_ps ); - sfm_exp = 0; - move16(); - crest = IGF_getCrest_new_fx( hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1], &crest_exp ); - tmp_tb = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); // tmp_tb_e - tmp_tb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); - - // tmp_sb = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, tmp, strt_cpy ) / IGF_getCrest_new( hPrivateData->logSpec, tmp, strt_cpy ); - sfm = IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, tmp, strt_cpy, e_ps ); - crest = IGF_getCrest_new_fx( hPrivateData->logSpec, tmp, strt_cpy, &crest_exp ); - tmp_sb = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); // tmp_sb_e - tmp_sb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); - - test(); - IF( last_core_acelp || hPrivateData->wasTransient ) - { - hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = tmp_tb; /*Exponent for hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] : hPrivateData->prevSFB_FIR_TB_e[sfb] and hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] : hPrivateData->prevSFB_IIR_TB_e[sfb] */ - hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = tmp_sb; /*Exponent for hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] : hPrivateData->prevSFB_FIR_SB_e[sfb] and hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] : hPrivateData->prevSFB_IIR_SB_e[sfb] */ - hPrivateData->prevSFB_FIR_TB_e[sfb] = hPrivateData->prevSFB_IIR_TB_e[sfb] = tmp_tb_e; - hPrivateData->prevSFB_FIR_SB_e[sfb] = hPrivateData->prevSFB_IIR_SB_e[sfb] = tmp_sb_e; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - - tmp_tb = shr( tmp_tb, 2 ); /*taking 2 guard bits so it's exponent tmp_sb_e=+2*/ - tmp_sb = shr( tmp_sb, 2 ); /*taking 2 guard bits so it's exponent tmp_tb_e=+2 */ - tmp_sb_e = add( tmp_sb_e, 2 ); - tmp_tb_e = add( tmp_tb_e, 2 ); - - Word16 tmp0, tmp2, tmp3, tmp4; - Word16 tmp0_e, tmp2_e, tmp3_e, tmp4_e; - tmp0 = shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], 2 ); - tmp0_e = add( hPrivateData->prevSFB_FIR_TB_e[sfb], 2 ); - move16(); - tmp2 = shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], 2 ); - tmp2_e = add( hPrivateData->prevSFB_IIR_TB_e[sfb], 2 ); - move16(); - tmp3 = shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], 2 ); - tmp3_e = add( hPrivateData->prevSFB_FIR_SB_e[sfb], 2 ); - move16(); - tmp4 = shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], 2 ); - tmp4_e = add( hPrivateData->prevSFB_IIR_SB_e[sfb], 2 ); - move16(); - Word16 x1, x2; - - Word16 x1_e = BASOP_Util_Add_MantExp( tmp0, tmp0_e, tmp2, tmp2_e - 1, &x1 ); - Word16 x2_e = BASOP_Util_Add_MantExp( tmp3, tmp3_e, tmp4, tmp4_e - 1, &x2 ); - hPrivateData->sfb_tb_e[sfb] = BASOP_Util_Add_MantExp( tmp_tb, tmp_tb_e, x1, x1_e, &hPrivateData->SFM_tb_fx[sfb] ); // hPrivateData->sfb_sb_e[sfb] - move16(); - BASOP_Util_Add_MantExp( 22118, 2, negate( hPrivateData->SFM_tb_fx[sfb] ), hPrivateData->sfb_tb_e[sfb], &tmp ); - - IF( tmp < 0 ) - { - hPrivateData->sfb_tb_e[sfb] = 2; - hPrivateData->SFM_tb_fx[sfb] = 22118; - move16(); - move16(); - } - - hPrivateData->sfb_sb_e[sfb] = BASOP_Util_Add_MantExp( tmp_sb, tmp_sb_e, x2, x2_e, &hPrivateData->SFM_sb_fx[sfb] ); // hPrivateData->sfb_tb_e[sfb] - move16(); - BASOP_Util_Add_MantExp( 22118, 2, negate( hPrivateData->SFM_sb_fx[sfb] ), hPrivateData->sfb_sb_e[sfb], &tmp ); - - IF( tmp < 0 ) - { - hPrivateData->sfb_sb_e[sfb] = 2; - hPrivateData->SFM_sb_fx[sfb] = 22118; - move16(); - move16(); - } - - BASOP_Util_Add_MantExp( hPrivateData->SFM_sb_fx[sfb], hPrivateData->sfb_sb_e[sfb], negate( hPrivateData->SFM_tb_fx[sfb] ), hPrivateData->sfb_tb_e[sfb], &diffSFM ); - - test(); - IF( diffSFM > 0 && LT_32( hPrivateData->SFM_tb_fx[sfb], L_shr( 3277 /*0.1 Q15*/, hPrivateData->sfb_tb_e[sfb] ) ) ) /* check whether target SFB is more tonal than source SFB */ - { - Word16 currDampingFactor, dampingFactor; - Word16 slope, threshold; - Word16 alpha; - Word16 slope_e, threshold_e, currDampingFactor_e, dampingFactor_e, alpha_e; - - /* calculate spectral tilt to detect sudden drops (or increases) in energy in the current SFB */ - // slope = IGF_getTilt_fx( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1], e_ps, &slope_e ); - - x = 1; - mean_x_fx = mean_y_fx = 0; - Word32 mean_y_fx_tmp = 0; - move32(); - mean_xy_fx = mean_x2_fx = 0; -#ifdef FIX_ISSUE_1214 - mean_x_e = 15; - mean_xy_e = mean_y_e = mean_x2_e = 31; -#else - mean_x_e = mean_y_e = 15; - mean_xy_e = mean_x2_e = 31; -#endif - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - - FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ ) - { - mean_x_fx = add( mean_x_fx, x ); /*Q0*/ - mean_x2_fx = L_add( mean_x2_fx, L_mult0( x, x ) ); /*Q0*/ - -#ifdef FIX_ISSUE_1214 - /*y = 20.f * log10f( max( 1.f, powerSpectrum[i] ) );*/ - IF( LE_64( W_deposit32_l( pPowerSpectrum_fx[sb] ), W_shl( 1, ( sub( 31, e_ps[sb] ) ) ) ) ) - { - y = 0; - move16(); - } -#else - - /*y = 20 * (int16_t) log10f( max( 1e-018f, pPowerSpectrum[sb] ) );*/ - IF( LT_32( pPowerSpectrum_fx[sb], 1 ) ) - { - y = imult1616( 20, ( -18 /* log10f(1e-018f) */ ) ); - } -#endif - ELSE - { - y = imult1616( 20, extract_l( L_shr( Mult_32_16( ( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( e_ps[sb], Q25 ) ) ), INV_Log2_10_Q15 ), Q25 ) ) ); /*Q0*/ - } - mean_y_fx_tmp = L_mac0( mean_y_fx_tmp, y, 1 ); /*Q0*/ - mean_xy_fx = L_add( mean_xy_fx, L_mult0( y, x ) ); /*Q0*/ - - x = add( x, 1 ); - } - mean_y_fx = BASOP_Util_Divide3216_Scale( mean_y_fx_tmp, width, &tmp_e ); /* mean_y_e*/ - - mean_y_e = add( mean_y_e, sub( tmp_e, 15 ) ); - mean_x_fx = BASOP_Util_Divide1616_Scale( mean_x_fx, width, &tmp_e ); /* mean_x_e*/ - mean_x_e = add( mean_x_e, sub( tmp_e, 15 ) ); - mean_xy_fx = BASOP_Util_Divide3216_Scale( mean_xy_fx, width, &tmp_e ); /* mean_xy_e*/ - mean_xy_e = add( mean_xy_e, sub( tmp_e, 15 ) ); - mean_x2_fx = BASOP_Util_Divide3216_Scale( mean_x2_fx, width, &tmp_e ); /* mean_x2_e*/ - mean_x2_e = add( mean_x2_e, sub( tmp_e, 15 ) ); - - /*slope = ( mean_xy - mean_x * mean_y ) / ( mean_x2 - mean_x * mean_x );*/ - slope = BASOP_Util_Divide3232_Scale( ( L_sub( mean_xy_fx, L_shl( mult( mean_x_fx, mean_y_fx ), sub( add( mean_x_e, mean_y_e ), mean_xy_e ) ) ) ), ( L_sub( mean_x2_fx, L_shl( mult( mean_x_fx, mean_x_fx ), sub( add( mean_x_e, mean_x_e ), mean_x2_e ) ) ) ), &slope_e ); - slope_e = add( slope_e, sub( mean_xy_e, mean_x2_e ) ); - - /* determine whether strong tilt is due to a step in the spectrum (e.g. band limitation, no damping) - or a tonal component close the band border (apply damping) by calculating SFM for a shift of 1/2 SFB width*/ - threshold = BASOP_Util_Divide1616_Scale( 60, width, &threshold_e ); - - test(); - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope, add( slope_e, 16 ), negate( threshold ), add( threshold_e, 16 ) ), -1 ) ) - { - Word16 shift = shr( width, 1 ); - sfm = IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift, e_ps ); - crest = IGF_getCrest_new_fx( hPrivateData->logSpec, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift, &crest_exp ); - shiftedSFM = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); - } - ELSE IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope, add( slope_e, 16 ), threshold, add( threshold_e, 16 ) ), 1 ) && ( NE_16( sfb, sub( hGrid->sfbWrap[hGrid->nTiles], 1 ) ) ) ) - { - Word16 shift = shr( width, 1 ); - shiftedSFM = BASOP_Util_Divide1616_Scale( IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift, e_ps ), IGF_getCrest_new_fx( hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift, &crest_exp ), &tmp_e ); - sfm = IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift, e_ps ); - crest = IGF_getCrest_new_fx( hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift, &crest_exp ); - shiftedSFM = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); - } - shiftedSFM_e = add( shiftedSFM_e, sub( sfm_exp, crest_exp ) ); - - IF( GT_32( shiftedSFM, L_shl( 1311 /*0.04f Q15*/, negate( shiftedSFM_e ) ) ) ) - { - currDampingFactor = 32767; /*1.f Q15*/ - currDampingFactor_e = 0; - move16(); - move16(); - } - ELSE - { - // alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f ); - temp = BASOP_Util_Divide1616_Scale( 320, swb_offset[sfb + 1], &alpha_e ); - alpha = extract_l( L_min( temp, L_shl( 20480 /*1.25 Q14*/, sub( 1, alpha_e ) ) ) ); // alpha_e - - // currDampingFactor = expf( 1.25f * alpha * logf( hPrivateData->SFM_tb[sfb] / hPrivateData->SFM_sb[sfb] ) ); - temp = BASOP_Util_Divide1616_Scale( hPrivateData->SFM_tb_fx[sfb], hPrivateData->SFM_sb_fx[sfb], &tmp_e ); // tmp_e - tmp_e = add( tmp_e, sub( hPrivateData->sfb_tb_e[sfb], hPrivateData->sfb_sb_e[sfb] ) ); - Word16 temp1 = mult( 20480 /* 1.25f in Q14 */, alpha ); - Word16 tmp1_e = add( 1, alpha_e ); - currDampingFactor = round_fx( BASOP_util_Pow2( Mpy_32_16_1( L_add( BASOP_Util_Log2( temp ), L_shl_sat( add( 16, tmp_e ), 25 ) ), temp1 ), add( tmp1_e, 6 ), &currDampingFactor_e ) ); // currDampingFactor_e - - /* calculate tonal-to-noise ratio and reduce damping for low values*/ - - Word32 tonalToNoise; - Word16 adap; - Word16 adap_e; /*stores exp for adap*/ - Word16 tonalToNoise_e; /*stores exponent for tonalToNoise*/ - tonalToNoise_e = 9; - move16(); - adap = BASOP_Util_Divide1616_Scale( width, 40, &adap_e ); - tonalToNoise = IGF_getTNR_ivas_fx( pPowerSpectrum_fx, swb_offset[sfb], swb_offset[sfb + 1], adap, e_ps, adap_e ); /*Q22*/ - - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tonalToNoise, tonalToNoise_e, L_add( L_shl( 10, sub( 15, adap_e ) ), adap ), add( 16, adap_e ) ), -1 ) ) - { - // currDampingFactor += 0.03f * ( ( 10 + adap ) - tonalToNoise ); - Word32 temp2 = BASOP_Util_Add_Mant32Exp( L_add( L_shl( 10, sub( 15, adap_e ) ) /*exp:adap_e*/, adap ), add( adap_e, 16 ), L_negate( tonalToNoise ), tonalToNoise_e, &tmp_e ); // tmp_e - currDampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor, currDampingFactor_e, extract_l( Mult_32_32( 983 /*0.03f Q15*/, temp2 ) ), tmp_e, &currDampingFactor ); // currDampingFactor_e - } - } - - Word32 L_tmp = hPrivateData->prevDampingFactor_IIR_fx[sfb]; - move32(); - L_tmp = L_shl( L_tmp, hPrivateData->prevDampingFactor_IIR_e[sfb] ); - test(); - test(); - IF( last_core_acelp || hPrivateData->wasTransient || EQ_32( L_tmp, MIN16B ) ) - { - tmp = BASOP_Util_Cmp_Mant32Exp( currDampingFactor, currDampingFactor_e, 3277 /* 0.1f in Q15 */, 0 ); - IF( tmp >= 0 ) - { - hPrivateData->prevDampingFactor_IIR_fx[sfb] = currDampingFactor; - hPrivateData->prevDampingFactor_IIR_e[sfb] = currDampingFactor_e; - move16(); - move16(); - } - ELSE - { - hPrivateData->prevDampingFactor_IIR_fx[sfb] = 3277; /* 0.1 in Q15 */ - hPrivateData->prevDampingFactor_IIR_e[sfb] = 0; - move16(); - move16(); - } - } - IF( last_core_acelp ) - { - hPrivateData->dampingFactorSmoothing[sfb] = 2; - move16(); - } - - dampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor, currDampingFactor_e, hPrivateData->prevDampingFactor_IIR_fx[sfb], hPrivateData->prevDampingFactor_IIR_e[sfb], &dampingFactor ); // dampingFactor_e - dampingFactor = shr( dampingFactor, 1 ); - - gain = Mult_32_16( gain, shl_sat( extract_l( L_min( L_add( dampingFactor, Mult_32_16( L_shl( hPrivateData->dampingFactorSmoothing[sfb], sub( 15, dampingFactor_e ) ) /*Q:15-dampingFactor_e*/, 3277 /*0.1f Q15*/ ) /*Q:15-dampingFactor_e*/ ), shl_sat( 1, sub( 15, dampingFactor_e ) ) ) ), dampingFactor_e ) /*Q15*/ ); - - hPrivateData->prevDampingFactor_IIR_fx[sfb] = dampingFactor; - move16(); - hPrivateData->prevDampingFactor_IIR_e[sfb] = dampingFactor_e; - move16(); - if ( hPrivateData->dampingFactorSmoothing[sfb] > 0 ) - { - hPrivateData->dampingFactorSmoothing[sfb] = sub( hPrivateData->dampingFactorSmoothing[sfb], 1 ); - move16(); - } - } - ELSE - { - hPrivateData->prevDampingFactor_IIR_fx[sfb] = MIN16B; // exponent : hPrivateData->prevDampingFactor_IIR_e[sfb] - hPrivateData->prevDampingFactor_IIR_e[sfb] = 0; - hPrivateData->dampingFactorSmoothing[sfb] = 1; - move16(); - move16(); - move16(); - } - - hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = tmp_tb; // hPrivateData->prevSFB_FIR_TB_e[sfb] - hPrivateData->prevSFB_FIR_TB_e[sfb] = tmp_tb_e; - hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = hPrivateData->SFM_tb_fx[sfb]; // hPrivateData->prevSFB_IIR_TB_e[sfb] - hPrivateData->prevSFB_IIR_TB_e[sfb] = hPrivateData->sfb_tb_e[sfb]; - hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = tmp_sb; // hPrivateData->prevSFB_FIR_SB_e[sfb] - hPrivateData->prevSFB_FIR_SB_e[sfb] = tmp_sb_e; - hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = hPrivateData->SFM_sb_fx[sfb]; // hPrivateData->prevSFB_IIR_SB_e[sfb] - hPrivateData->prevSFB_IIR_SB_e[sfb] = hPrivateData->sfb_sb_e[sfb]; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - ELSE - { - hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0; // hPrivateData->prevSFB_FIR_TB_e[sfb] - hPrivateData->prevSFB_FIR_TB_e[sfb] = 0; - hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_TB_e[sfb] - hPrivateData->prevSFB_IIR_TB_e[sfb] = 0; - hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_TB_e[sfb] - hPrivateData->prevSFB_FIR_SB_e[sfb] = 0; - hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_SB_e[sfb] - hPrivateData->prevSFB_IIR_SB_e[sfb] = 0; - hPrivateData->prevDampingFactor_IIR_fx[sfb] = MIN16B; /* hPrivateData->prevDampingFactor_IIR_e[sfb]*/ - hPrivateData->prevDampingFactor_IIR_e[sfb] = 0; - hPrivateData->dampingFactorSmoothing[sfb] = 2; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - } - } - ELSE - { - tmp_e = e_mdct; - move16(); - sfbEnergyR = add_sat( EPSILON_FX, BASOP_Util_Divide3216_Scale( sum2_32_fx( pMDCTSpectrum_fx + swb_offset[sfb], width, &tmp_e ) /*exp: tmp_e*/, width, &sfbEnergyR_e ) ); // sfbEnergyR_e - sfbEnergyR_e = add( sfbEnergyR_e, add( tmp_e, -15 ) ); - gain = L_shl( sfbEnergyR, 16 ); // gain_e - move32(); - gain_e = sfbEnergyR_e; - - IF( element_mode > EVS_MONO ) - { - hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0; // hPrivateData->prevSFB_FIR_TB_e[sfb] - hPrivateData->prevSFB_FIR_TB_e[sfb] = 0; - hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_TB_e[sfb] - hPrivateData->prevSFB_IIR_TB_e[sfb] = 0; - hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_TB_e[sfb] - hPrivateData->prevSFB_FIR_SB_e[sfb] = 0; - hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_SB_e[sfb] - hPrivateData->prevSFB_IIR_SB_e[sfb] = 0; - hPrivateData->prevDampingFactor_IIR_fx[sfb] = MIN16B; /* hPrivateData->prevDampingFactor_IIR_e[sfb]*/ - hPrivateData->prevDampingFactor_IIR_e[sfb] = 0; - hPrivateData->dampingFactorSmoothing[sfb] = 2; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - } - - gain = Mult_32_16( gain, att ); // gain_e - gain_e = add( gain_e, 0 ); - - /*gain=0.5f+log2f(gain)*2+16 becuase 2.885390081777927f=2*1/loge(2) so 2*1/loge(2)*loge(x) can be written as 2*log2(x)*/ - gain = L_add( ONE_IN_Q22, L_add( L_add( L_shr( BASOP_Util_Log2( gain ), 1 ), L_shl( gain_e, Q24 ) ), L_shl( 16, Q23 ) ) ); /*Q23*/ - test(); - test(); - IF( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) ) - { - gain = L_add( gain, ONE_IN_Q21 ); /* better preservation of original HF band energy */ - } - test(); - test(); - IF( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_64000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_64000_CPE ) ) ) - { - gain = L_add( gain, ONE_IN_Q20 ); - } - gain = L_min( gain, 91 << Q23 ); /* 13+15+63, see arithcode encode residual */ - gain = L_max( gain, 0 ); - gain_e = 8; /* stores exponent for gain_fx*/ - move16(); - hPrivateData->igfScfQuantized[sfb] = extract_l( L_shr( gain, Q23 ) ); /*Q0*/ - move16(); - } - } - - return; -} - -/*-------------------------------------------------------------------* - * IGF_CalculateStereoEnvelope_fx() - * - * envelope estimation - - *-------------------------------------------------------------------*/ -static void IGF_CalculateStereoEnvelope_fx( - const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ - const Word32 *pMDCTSpectrum_fx, /* i : MDCT spectrum */ - Word16 pMDCTSpectrum_e, /* i : exponent for pMDCTSpectrum_fx */ - const Word32 *pMDCTSpectrumMsInv_fx, /* i : MDCT spectrum */ - Word16 pMDCTSpectrumMsInv_e, /* i : expontent for pMDCTSpectrumMsInv_fx */ - const Word32 *pPowerSpectrum_fx, /* i : MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 pPowerSpectrum_e, /* i : exponent for pPowerSpectrum_fx */ - const Word32 *pPowerSpectrumMsInv_fx, /* i : inverse power spectrum */ - Word16 pPowerSpectrumMsInv_e, /* i : exponent for pPowerSpectrumMsInv_fx */ - const Word16 igfGridIdx, /* i : IGF grid index */ - const Word16 coreMsMask[N_MAX], /* i : line wise ms Mask */ - const Word16 isTransient, /* i : flag indicating if transient is detected */ - const Word16 last_core_acelp /* i : indicator if last frame was ACELP core */ -) -{ - IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; - H_IGF_GRID hGrid; - Word16 *swb_offset; - Word16 sfb; /* this is the actual scalefactor band */ - Word16 width; /* this is width in subbands of the actual scalefactor band */ - Word16 tile_idx; - Word16 strt_cpy; - Word32 gain_fx; /* the gain which has to be applied to the source tile to get the destination energy */ - Word16 sb; - Word16 sfbEnergyR_fx; - Word32 sfbEnergyC_fx; /* the energy of the destination region of the tile */ - Word32 sfbEnergyTileR_fx; - Word32 sfbEnergyTileC_fx; /* the energy of the destination region of the tile */ - Word16 tmp, x, y; - Word16 mean_x_fx, mean_y_fx; - Word32 mean_xy_fx, mean_x2_fx; - Word16 slope_fx; - Word16 tmp_tb_fx; - Word16 tmp_sb_fx; - Word16 sfbCnt; - Word32 tileSrcSpec_fx[MAX_IGF_SFB_LEN]; - Word16 sfm; - Word16 crest; - Word16 temp; - Word16 mean_x_e, mean_y_e; /*Stores exponent for mean_x and mean_y respectively*/ - Word16 mean_xy_e, mean_x2_e; /*stores exponent for mean_xy and mean_x2 respectively*/ - Word16 tileSrcSpec_e; /*Exponent for tileSrcSpec_fx*/ - Word16 sfbEnergyTileR_e; /*Exponent for sfbEnergyTileR_fx*/ - Word16 sfbEnergyTileC_e; /*Exponent for sfbEnergyTileC_fx*/ - Word16 sfbEnergyC_e; /*Exponent for sfbEnergyC_fx*/ - Word16 gain_e; /*exponent for gain_fx*/ - Word16 crest_exp; /*stores exponent for output from crest*/ - Word16 sfm_exp; /*stores exponent for ouput from sfm*/ - Word16 tmp_tb_e; /*Stores exponent for tmp_tb_fx*/ - Word16 tmp_sb_e; /*stores exponent for tmp_sb_fx*/ - Word16 slope_e; /*stores exponent for slope_fx*/ - Word16 sfbEnergyR_e; /*stores exponent for sfbEnergyR*/ - Word16 tmp_e; - - hPrivateData = &hIGFEnc->igfData; - hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx]; - swb_offset = hGrid->swb_offset; - move16(); - - IF( igfGridIdx != IGF_GRID_LB_NORM ) - { - FOR( sfbCnt = 0; sfbCnt < sub( hGrid->sfbWrap[hGrid->nTiles], hGrid->sfbWrap[0] ); sfbCnt++ ) - { - /* reset filter */ - hPrivateData->prevSFM_FIR_SFB_TB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_FIR_TB_e[sfbCnt] - hPrivateData->prevSFM_IIR_SFB_TB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_IIR_TB_e[sfbCnt] - hPrivateData->prevSFM_FIR_SFB_SB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_FIR_SB_e[sfbCnt] - hPrivateData->prevSFM_IIR_SFB_SB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_IIR_SB_e[sfbCnt] - hPrivateData->prevSFB_FIR_TB_e[sfbCnt] = 0; - hPrivateData->prevSFB_IIR_TB_e[sfbCnt] = 0; - hPrivateData->prevSFB_FIR_SB_e[sfbCnt] = 0; - hPrivateData->prevSFB_IIR_SB_e[sfbCnt] = 0; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - } - - IF( pPowerSpectrum_fx ) - { - FOR( sb = hGrid->sbWrap[0]; sb < swb_offset[hGrid->sfbWrap[hGrid->nTiles]]; sb++ ) - { - /*hPrivateData->logSpec[sb] = max( 0, (Word16) ( logf( max( FLT_MIN, pPowerSpectrum[sb] ) ) * INV_LOG_2 ) );*/ - IF( LE_32( 1, pPowerSpectrum_fx[sb] ) ) - { - hPrivateData->logSpec[sb] = s_max( 0, (Word16) L_shr( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( pPowerSpectrum_e, Q25 ) ), 25 ) ); - } - ELSE - { - hPrivateData->logSpec[sb] = 0; /*max(0,-126) is always 0*/ - } - move16(); - } - } - - FOR( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ ) - { - strt_cpy = hGrid->sbWrap[tile_idx]; - move16(); - - FOR( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) - { - width = sub( swb_offset[sfb + 1], swb_offset[sfb] ); - sfbEnergyTileR_fx = EPSILON_FX; - sfbEnergyTileC_fx = EPSILON_FX; - sfbEnergyC_fx = EPSILON_FX; - sfbEnergyTileR_e = 0; - sfbEnergyTileC_e = 0; - sfbEnergyC_e = 0; - move16(); - move16(); - move16(); - move32(); - move32(); - move32(); - IF( pPowerSpectrum_fx ) - { - Word16 final_exp; - Word16 norm_exp; - Word32 scaled_value; - tmp = strt_cpy; - move16(); - - FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ ) - { - IF( NE_16( coreMsMask[sb], coreMsMask[strt_cpy] ) ) - { - sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e, &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ - norm_exp = norm_l( pMDCTSpectrumMsInv_fx[strt_cpy] ); - final_exp = sub( pMDCTSpectrumMsInv_e, norm_exp ); - scaled_value = L_shl( pMDCTSpectrumMsInv_fx[strt_cpy], norm_exp ); - sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( scaled_value, scaled_value ), shl( final_exp, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ - sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrumMsInv_fx[strt_cpy], pPowerSpectrumMsInv_e, &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ - tileSrcSpec_fx[sub( strt_cpy, tmp )] = pPowerSpectrumMsInv_fx[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ - tileSrcSpec_e = pPowerSpectrumMsInv_e; - } - ELSE - { - sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e, &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ - norm_exp = norm_l( pMDCTSpectrum_fx[strt_cpy] ); - final_exp = sub( pMDCTSpectrum_e, norm_exp ); - scaled_value = L_shl( pMDCTSpectrum_fx[strt_cpy], norm_exp ); - sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( scaled_value, scaled_value ), shl( final_exp, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ - sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrum_fx[strt_cpy], pPowerSpectrum_e, &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ - tileSrcSpec_fx[sub( strt_cpy, tmp )] = pPowerSpectrum_fx[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ - tileSrcSpec_e = pPowerSpectrum_e; - } - move32(); - move16(); - strt_cpy = add( strt_cpy, 1 ); - } - - sfbEnergyTileR_fx = BASOP_Util_Divide3216_Scale( sfbEnergyTileR_fx, width, &tmp_e ); - sfbEnergyTileR_e = sub( add( sfbEnergyTileR_e, tmp_e ), 15 ); /*stores the resultant exponent for sfbEnergyTileR_fx*/ - - /*gain = (float) ( sfbEnergyTileR * ( sfbEnergyC / sfbEnergyTileC ) );*/ - temp = BASOP_Util_Divide3232_Scale( sfbEnergyC_fx, L_add( sfbEnergyTileC_fx, EPSILON_FX ), &tmp_e ); - gain_e = add( tmp_e, sub( sfbEnergyC_e, sfbEnergyTileC_e ) ); - gain_fx = Mult_32_16( sfbEnergyTileR_fx, temp ); - gain_e = add( 16, add( gain_e, sfbEnergyTileR_e ) ); /*stores the resultant exponent for gain_fx*/ - - IF( !isTransient ) - { - Word16 diffSFM_fx; - Word16 shiftedSFM_fx; - Word16 shiftedSFM_e; /*stores the resultant exponent for shiftedSFM_fx*/ - shiftedSFM_fx = 0; - shiftedSFM_e = 0; - move16(); - move16(); - - // tmp_tb = IGF_getSFM_ivas(pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1]) / IGF_getCrest_ivas(pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1]); - sfm = IGF_getSFM( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] ); - crest = IGF_getCrest( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] ); - tmp_tb_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); - tmp_tb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); /*stores the resultant exponent for tmp_tb_fx*/ - - // tmp_sb = IGF_getSFM_ivas(tileSrcSpec, 0, strt_cpy - tmp) / IGF_getCrest_ivas(tileSrcSpec, 0, strt_cpy - tmp); - sfm = IGF_getSFM( &sfm_exp, tileSrcSpec_fx, &tileSrcSpec_e, 0, sub( strt_cpy, tmp ) ); - crest = IGF_getCrest( &crest_exp, tileSrcSpec_fx, tileSrcSpec_e, 0, sub( strt_cpy, tmp ) ); - tmp_sb_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); - tmp_sb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); /*stores the resultant exponent for tmp_sb_fx*/ - - IF( last_core_acelp || hPrivateData->wasTransient ) - { - hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = tmp_tb_fx; /*Exponent for hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] values stored in hPrivateData->sfb_tb_e[sfb] */ - hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = tmp_sb_fx; /*Exponent for hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] values stored in hPrivateData->sfb_sb_e[sfb]*/ - hPrivateData->prevSFB_FIR_TB_e[sfb] = tmp_sb_e; - hPrivateData->prevSFB_IIR_TB_e[sfb] = tmp_sb_e; - hPrivateData->prevSFB_FIR_SB_e[sfb] = tmp_sb_e; - hPrivateData->prevSFB_IIR_SB_e[sfb] = tmp_sb_e; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - ELSE - { - /* Purpose of this block: - -to make the exponent of hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] equal to that of tmp_tb_fx - -to make the exponent of hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] equal to that of tmp_sb_fx - */ - Word16 diff_sb_e; /*stores the difference of exponents for sb*/ - Word16 diff_tb_e; /*stores the difference of exponents for tb*/ - diff_sb_e = sub( tmp_sb_e, hPrivateData->sfb_sb_e[sfb] ); - diff_tb_e = sub( tmp_tb_e, hPrivateData->sfb_tb_e[sfb] ); - IF( LE_16( tmp_tb_e, hPrivateData->sfb_tb_e[sfb] ) ) - { - tmp_tb_fx = shl( tmp_tb_fx, diff_tb_e ); - tmp_tb_e = hPrivateData->sfb_tb_e[sfb]; - move16(); - } - ELSE - { - hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], diff_tb_e ); - hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], diff_tb_e ); - move16(); - move16(); - hPrivateData->prevSFB_FIR_TB_e[sfb] = tmp_tb_e; - hPrivateData->prevSFB_IIR_TB_e[sfb] = tmp_tb_e; - move16(); - move16(); - } - IF( LE_16( tmp_sb_e, hPrivateData->sfb_sb_e[sfb] ) ) - { - tmp_sb_fx = shl( tmp_sb_fx, diff_sb_e ); - tmp_sb_e = hPrivateData->sfb_sb_e[sfb]; - move16(); - } - ELSE - { - hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], diff_sb_e ); - hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], diff_sb_e ); - move16(); - move16(); - hPrivateData->prevSFB_FIR_SB_e[sfb] = tmp_sb_e; - hPrivateData->prevSFB_IIR_SB_e[sfb] = tmp_sb_e; - move16(); - move16(); - } - } -#ifdef FIX_ISSUE_1214 - tmp_tb_fx = shr_sat( tmp_tb_fx, sub( 2, tmp_tb_e ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */ - tmp_sb_fx = shr_sat( tmp_sb_fx, sub( 2, tmp_sb_e ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */ - hPrivateData->SFM_tb_fx[sfb] = add_sat( tmp_tb_fx, add_sat( shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], sub( 2, hPrivateData->prevSFB_FIR_TB_e[sfb] ) ), shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], sub( 3, hPrivateData->prevSFB_IIR_TB_e[sfb] ) ) ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */ - hPrivateData->SFM_tb_fx[sfb] = s_min( 22118 /*2.7f Q13*/, hPrivateData->SFM_tb_fx[sfb] ); /* resultant exponent stored in hPrivateData->sfb_sb_e[sfb]*/ - hPrivateData->SFM_sb_fx[sfb] = add_sat( tmp_sb_fx, add_sat( shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], sub( 2, hPrivateData->prevSFB_FIR_SB_e[sfb] ) ), shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], sub( 3, hPrivateData->prevSFB_IIR_SB_e[sfb] ) ) ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */ - hPrivateData->SFM_sb_fx[sfb] = s_min( 22118 /*2.7f Q13*/, hPrivateData->SFM_sb_fx[sfb] ); /*resultant exponent stores in hPrivateData->sfb_tb_e[sfb]*/ -#else - tmp_tb_fx = shl_sat( tmp_tb_fx, sub( 2, tmp_tb_e ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */ - tmp_sb_fx = shl_sat( tmp_sb_fx, sub( 2, tmp_sb_e ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */ - hPrivateData->SFM_tb_fx[sfb] = add_sat( tmp_tb_fx, add_sat( shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], sub( 2, tmp_tb_e ) ), shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], sub( 3, tmp_tb_e ) ) ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */ - hPrivateData->SFM_tb_fx[sfb] = s_min( 22118 /*2.7f Q13*/, hPrivateData->SFM_tb_fx[sfb] ); /* resultant exponent stored in hPrivateData->sfb_sb_e[sfb]*/ - hPrivateData->SFM_sb_fx[sfb] = add_sat( tmp_sb_fx, add_sat( shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], sub( 2, tmp_sb_e ) ), shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], sub( 3, tmp_sb_e ) ) ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */ - hPrivateData->SFM_sb_fx[sfb] = s_min( 22118 /*2.7f Q13*/, hPrivateData->SFM_sb_fx[sfb] ); /*resultant exponent stores in hPrivateData->sfb_tb_e[sfb]*/ -#endif - move16(); - move16(); - move16(); - move16(); - hPrivateData->sfb_sb_e[sfb] = 2; - hPrivateData->sfb_tb_e[sfb] = 2; - move16(); - move16(); - - diffSFM_fx = sub( hPrivateData->SFM_sb_fx[sfb], hPrivateData->SFM_tb_fx[sfb] ); /*Q13*/ - - test(); - IF( diffSFM_fx > 0 && LT_16( hPrivateData->SFM_tb_fx[sfb], 819 /*0.1 Q13*/ ) ) /* check whether target SFB is more tonal than source SFB */ - { - Word16 currDampingFactor_fx, dampingFactor_fx, alpha_fx; - Word16 threshold_e, threshold_fx, alpha_e, currDampingFactor_e, dampingFactor_e; - /* calculate spectral tilt to detect sudden drops (or increases) in energy in the current SFB */ - x = 1; - mean_x_fx = mean_y_fx = 0; - mean_xy_fx = mean_x2_fx = 0; - mean_x_e = mean_y_e = 15; - mean_xy_e = mean_x2_e = 31; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ ) - { - mean_x_fx = add( mean_x_fx, x ); /*Q0*/ - mean_x2_fx = L_add( mean_x2_fx, L_mult0( x, x ) ); /*Q0*/ - - /*y = 20 * (Word16) log10f( max( 1e-018f, pPowerSpectrum[sb] ) );*/ - IF( LT_32( pPowerSpectrum_fx[sb], 1 ) ) - { - y = 20 * ( -18 ); - move16(); - } - ELSE - { - y = imult1616( 20, extract_l( L_shr( Mult_32_16( ( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( pPowerSpectrum_e, Q25 ) ) ), INV_Log2_10_Q15 ), 25 ) ) ); /*Q0*/ - } - mean_y_fx = add( mean_y_fx, y ); /*Q0*/ - mean_xy_fx = L_add( mean_xy_fx, L_mult0( y, x ) ); /*Q0*/ - - x = add( x, 1 ); - } - mean_y_fx = BASOP_Util_Divide1616_Scale( mean_y_fx, width, &tmp_e ); /* resultant exp stores in mean_y_e*/ - mean_y_e = add( mean_y_e, sub( tmp_e, 15 ) ); - mean_x_fx = BASOP_Util_Divide1616_Scale( mean_x_fx, width, &tmp_e ); /* resultant exp stores in mean_x_e*/ - mean_x_e = add( mean_x_e, sub( tmp_e, 15 ) ); - mean_xy_fx = BASOP_Util_Divide3216_Scale( mean_xy_fx, width, &tmp_e ); /* resultant exp stores in mean_xy_e*/ - mean_xy_e = add( mean_xy_e, sub( tmp_e, 15 ) ); - mean_x2_fx = BASOP_Util_Divide3216_Scale( mean_x2_fx, width, &tmp_e ); /* resultant exp stores in mean_x2_e*/ - mean_x2_e = add( mean_x2_e, sub( tmp_e, 15 ) ); - - /*slope = ( mean_xy - mean_x * mean_y ) / ( mean_x2 - mean_x * mean_x );*/ - slope_fx = BASOP_Util_Divide3232_Scale( ( L_sub( mean_xy_fx, L_shl( mult( mean_x_fx, mean_y_fx ), sub( add( mean_x_e, mean_y_e ), mean_xy_e ) ) ) ), ( L_sub( mean_x2_fx, L_shl( mult( mean_x_fx, mean_x_fx ), sub( add( mean_x_e, mean_x_e ), mean_x2_e ) ) ) ), &slope_e ); - slope_e = add( slope_e, sub( mean_xy_e, mean_x2_e ) ); /*stores resultant exponent for slope_fx*/ - - /* determine whether strong tilt is due to a step in the spectrum (e.g. band limitation, no damping) - or a tonal component close the band border (apply damping) by calculating SFM for a shift of 1/2 SFB width*/ - threshold_fx = BASOP_Util_Divide1616_Scale( 60, width, &threshold_e ); /*stores resultant exponent for threshold_fx*/ - test(); - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope_fx, add( slope_e, 16 ), negate( threshold_fx ), add( threshold_e, 16 ) ), -1 ) ) - { - Word16 shift = shr( width, 1 ); - // shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ); - sfm = IGF_getSFM( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) ); - crest = IGF_getCrest( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) ); - shiftedSFM_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); - } - ELSE IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope_fx, add( slope_e, 16 ), threshold_fx, add( threshold_e, 16 ) ), 1 ) && ( NE_16( sfb, sub( hGrid->sfbWrap[hGrid->nTiles], 1 ) ) ) ) - { - Word16 shift; - shift = shr( width, 1 ); - // shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ); - sfm = IGF_getSFM( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) ); - crest = IGF_getCrest( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) ); - shiftedSFM_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); - } - IF( shiftedSFM_fx ) - { - shiftedSFM_e = add( shiftedSFM_e, sub( sfm_exp, crest_exp ) ); /* stores resultant exponent for shiftedSFM_fx*/ - } - - // alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f ); - temp = BASOP_Util_Divide1616_Scale( 320, swb_offset[sfb + 1], &alpha_e ); - alpha_fx = extract_l( L_min( temp, L_shl( 20480 /*1.25 Q14*/, sub( 1, alpha_e ) ) ) ); /* exponent is alpha_e*/ - temp = BASOP_Util_Divide1616_Scale( hPrivateData->SFM_tb_fx[sfb], hPrivateData->SFM_sb_fx[sfb], &tmp_e ); - tmp_e = add( tmp_e, sub( hPrivateData->sfb_tb_e[sfb], hPrivateData->sfb_sb_e[sfb] ) ); /* stores resultant exponent for temp */ - - // currDampingFactor = expf( alpha * logf( hPrivateData->SFM_tb[sfb] / hPrivateData->SFM_sb[sfb] ) ); - currDampingFactor_fx = round_fx( BASOP_util_Pow2( Mpy_32_16_1( L_add( BASOP_Util_Log2( temp ), L_shl( add( 16, tmp_e ), 25 ) ), alpha_fx ), add( alpha_e, 6 ), &currDampingFactor_e ) ); /*exp is currDampingFactor_e*/ - - IF( GT_32( shiftedSFM_fx, L_shl( 1311 /*0.04f Q15*/, negate( shiftedSFM_e ) ) ) ) - { - currDampingFactor_fx = 32767; /*1.f Q15*/ - currDampingFactor_e = 0; - move16(); - move16(); - } - test(); - test(); - IF( last_core_acelp || hPrivateData->wasTransient || EQ_32( hPrivateData->prevDampingFactor_IIR_fx[sfb], L_shl( -1, sub( 15, hPrivateData->prevDampingFactor_IIR_e[sfb] ) ) ) ) - { - tmp = BASOP_Util_Cmp_Mant32Exp( currDampingFactor_fx, currDampingFactor_e, 3277, 0 ); - IF( tmp >= 0 ) - { - hPrivateData->prevDampingFactor_IIR_fx[sfb] = currDampingFactor_fx; - hPrivateData->prevDampingFactor_IIR_e[sfb] = currDampingFactor_e; - } - ELSE - { - hPrivateData->prevDampingFactor_IIR_fx[sfb] = 3277; /* 0.1 in Q15 */ - hPrivateData->prevDampingFactor_IIR_e[sfb] = 0; - } - - move16(); - move16(); - } - - { - Word32 tonalToNoise; - Word16 adap; - Word16 adap_e; /*stores exp for adap*/ - Word16 tonalToNoise_e; /*stores exponent for tonalToNoise*/ - tonalToNoise_e = 9; /*stores exponent for tonalToNoise*/ - move16(); - adap = BASOP_Util_Divide1616_Scale( width, 30, &adap_e ); - tonalToNoise = IGF_getTNR_fx( pPowerSpectrum_fx, swb_offset[sfb], swb_offset[sfb + 1], adap, pPowerSpectrum_e, adap_e ); /*Q22*/ - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tonalToNoise, tonalToNoise_e, L_add( L_shl( 10, sub( 15, adap_e ) ), adap ), add( 16, adap_e ) ), -1 ) ) - { - // currDampingFactor += 0.1f * ( ( 10 + adap ) - tonalToNoise ); - Word32 temp2 = BASOP_Util_Add_Mant32Exp( L_add( L_shl( 10, sub( 15, adap_e ) ) /*exp:adap_e*/, adap ), add( adap_e, 16 ), L_negate( tonalToNoise ), tonalToNoise_e, &tmp_e ); /* resultant exp is tmp_e*/ - currDampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor_fx, currDampingFactor_e, extract_l( Mult_32_16( temp2, 3277 /*0.1f Q15*/ ) ), tmp_e, &currDampingFactor_fx ); /*stores resultant exp for currDampingFactor_fx*/ - } - } - - dampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor_fx, currDampingFactor_e, hPrivateData->prevDampingFactor_IIR_fx[sfb], hPrivateData->prevDampingFactor_IIR_e[sfb], &dampingFactor_fx ); - dampingFactor_fx = shr( dampingFactor_fx, 1 ); /* resultant exponent is dampingFactor_e*/ - IF( NE_16( BASOP_Util_Cmp_Mant32Exp( dampingFactor_fx, add( dampingFactor_e, 16 ), shr( hPrivateData->prevDampingFactor_IIR_fx[sfb], 1 ), add( hPrivateData->prevDampingFactor_IIR_e[sfb], 16 ) ), -1 ) ) - { - // do nothing - } - ELSE - { - dampingFactor_fx = shr( hPrivateData->prevDampingFactor_IIR_fx[sfb], 1 ); /* resultant exponent is hPrivateData->prevDampingFactor_IIR_e[sfb]*/ - dampingFactor_e = hPrivateData->prevDampingFactor_IIR_e[sfb]; - move16(); - } - IF( dampingFactor_e < 0 ) - { - dampingFactor_fx = shl( dampingFactor_fx, dampingFactor_e ); - dampingFactor_e = 0; - move16(); - } - gain_fx = Mult_32_16( gain_fx, shl_sat( extract_l( L_min( L_add( dampingFactor_fx, Mult_32_16( L_shl( hPrivateData->dampingFactorSmoothing[sfb], sub( 15, dampingFactor_e ) ) /*Q:15-dampingFactor_e*/, 3277 /*0.1f Q15*/ ) /*Q:15-dampingFactor_e*/ ), shl_sat( 1, sub( 15, dampingFactor_e ) ) ) ), dampingFactor_e ) /*Q15*/ ); - - hPrivateData->prevDampingFactor_IIR_fx[sfb] = dampingFactor_fx; - hPrivateData->prevDampingFactor_IIR_e[sfb] = dampingFactor_e; - move16(); - move16(); - if ( hPrivateData->dampingFactorSmoothing[sfb] > 0 ) - { - hPrivateData->dampingFactorSmoothing[sfb] = sub( hPrivateData->dampingFactorSmoothing[sfb], 1 ); - move16(); - } - } - ELSE - { - hPrivateData->prevDampingFactor_IIR_fx[sfb] = -( 1 << 15 ); /* resultant exp which is 0 stores in hPrivateData->prevDampingFactor_IIR_e[sfb]*/ - hPrivateData->prevDampingFactor_IIR_e[sfb] = 0; - hPrivateData->dampingFactorSmoothing[sfb] = 1; - move16(); - move16(); - move16(); - } - - hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = tmp_tb_fx; - hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = hPrivateData->SFM_tb_fx[sfb]; - hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = tmp_sb_fx; - hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = hPrivateData->SFM_sb_fx[sfb]; - hPrivateData->prevSFB_FIR_TB_e[sfb] = hPrivateData->sfb_tb_e[sfb]; - hPrivateData->prevSFB_IIR_TB_e[sfb] = hPrivateData->sfb_tb_e[sfb]; - hPrivateData->prevSFB_FIR_SB_e[sfb] = hPrivateData->sfb_sb_e[sfb]; - hPrivateData->prevSFB_IIR_SB_e[sfb] = hPrivateData->sfb_sb_e[sfb]; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - ELSE - { - hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0; - hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0; - hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0; - hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0; - hPrivateData->prevSFB_FIR_TB_e[sfb] = 0; - hPrivateData->prevSFB_IIR_TB_e[sfb] = 0; - hPrivateData->prevSFB_FIR_SB_e[sfb] = 0; - hPrivateData->prevSFB_IIR_SB_e[sfb] = 0; - - hPrivateData->dampingFactorSmoothing[sfb] = 2; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - } - ELSE - { - tmp_e = pMDCTSpectrum_e; - sfbEnergyR_fx = add_sat( EPSILON_FX, BASOP_Util_Divide3216_Scale( sum2_32_fx( pMDCTSpectrum_fx + swb_offset[sfb], width, &tmp_e ) /*exp: tmp_e*/, width, &sfbEnergyR_e ) ); - sfbEnergyR_e = add( sfbEnergyR_e, add( tmp_e, -15 ) ); /* stores resultant exponent for sfbEnergyR_fx*/ - gain_fx = sfbEnergyR_fx; /*resultant exponent stored in gain_e=sfbEnergyR_e*/ - move32(); - gain_e = add( sfbEnergyR_e, 16 ); /* because gain_fx is word32;only after adding 16 q of gain_fx is 15-sfbEnergyR_e*/ - - hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0; - hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0; - hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0; - hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0; - hPrivateData->prevSFB_FIR_TB_e[sfb] = 0; - hPrivateData->prevSFB_IIR_TB_e[sfb] = 0; - hPrivateData->prevSFB_FIR_SB_e[sfb] = 0; - hPrivateData->prevSFB_IIR_SB_e[sfb] = 0; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - /*gain=0.5f+log2f(gain)*2+16 becuase 2.885390081777927f=2*1/loge(2) so 2*1/loge(2)*loge(x) can be written as 2*log2(x)*/ - gain_fx = L_add( ONE_IN_Q22, L_add( L_add( L_shr( BASOP_Util_Log2( gain_fx ), 1 ), L_shl( gain_e, Q24 ) ), L_shl( 16, Q23 ) ) ); /*Q23*/ - test(); - test(); - if ( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) ) - { - gain_fx = L_add( gain_fx, ONE_IN_Q21 ); /* better preservation of original HF band energy */ - } - test(); - test(); - if ( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_64000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_64000_CPE ) ) ) - { - gain_fx = L_add( gain_fx, ONE_IN_Q20 ); - } - gain_fx = L_min( gain_fx, 91 << Q23 ); /* 13+15+63, see arithcode encode residual */ - gain_fx = L_max( gain_fx, 0 ); - gain_e = 8; /* stores exponent for gain_fx*/ - move16(); - hPrivateData->igfScfQuantized[sfb] = (Word16) ( L_shr( gain_fx, 23 ) ); /*Q0*/ - move16(); - } - } - - return; -} - - -/*-------------------------------------------------------------------* - * IGF_WriteEnvelope() - * - * writes IGF SCF values - *-------------------------------------------------------------------*/ -/*! r: number of bits writen */ -static Word16 IGF_WriteEnvelope( - const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 *pBitOffset, /* i : ptr to bitOffset counter */ - const Word16 igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ - const Word16 isIndepFlag, /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ - Word16 *igfAllZero /* i : returns 1 if all IGF scfs are zero, else 0 */ -) -{ - IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; - H_IGF_GRID hGrid; - Word16 sfb; - Word16 totBitCount; - Word16 startBitCount; - - startBitCount = *pBitOffset; - totBitCount = 0; - *igfAllZero = 1; - move16(); - move16(); - move16(); - hPrivateData = &hIGFEnc->igfData; - hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; - - FOR( sfb = hGrid->startSfb; sfb < hGrid->stopSfb; sfb++ ) - { - IF( hPrivateData->igfScfQuantized[sfb] != 0 ) - { - *igfAllZero = 0; - move16(); - BREAK; - } - } - - IF( *igfAllZero != 0 ) - { - IGF_write_bit_fx( hBstr, pBitOffset, 1 ); - - if ( NULL == hBstr ) - { - IGFSCFEncoderSaveContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx ); - } - - IGFSCFEncoderReset_fx( &hPrivateData->hIGFSCFArithEnc ); - - if ( NULL == hBstr ) - { - IGFSCFEncoderRestoreContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx ); - } - } - ELSE - { - IGF_write_bit_fx( hBstr, pBitOffset, 0 ); - - if ( NULL == hBstr ) - { - IGFSCFEncoderSaveContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx ); - } - - *pBitOffset = IGFSCFEncoderEncode_ivas_fx( &hPrivateData->hIGFSCFArithEnc, hBstr, *pBitOffset, &hPrivateData->igfScfQuantized[hGrid->startSfb], igfGridIdx, isIndepFlag ); - move16(); - - if ( NULL == hBstr ) - { - IGFSCFEncoderRestoreContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx ); - } - } - totBitCount = sub( *pBitOffset, startBitCount ); - - return totBitCount; -} - - -/*-------------------------------------------------------------------* - * IGF_Whitening() - * - * calculates the IGF whitening levels by SFM and crest - *-------------------------------------------------------------------*/ -static void IGF_Whitening_ivas_fx( - const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : | instance handle of IGF Encoder */ - Word32 *powerSpectrum, /* i : Q31 | MDCT/MDST power spectrum */ - Word16 *powerSpectrum_e, /* i : Q31 | MDCT/MDST power spectrum */ - const Word16 igfGridIdx, /* i : Q0 | IGF grid index */ - const Word16 isTransient, /* i : Q0 | flag indicating if transient is detected */ - const Word16 last_core_acelp, /* i : Q0 | indicator if last frame was ACELP core */ - const Word16 isTNSActive, /* i : Q0 | indicator if TNS is active */ - const Word16 sp_aud_decision0, /* i : Q0 | first stage classifier decision */ - const Word32 brate, /* i : Q0 | bitrate */ - const Word16 element_mode /* i : Q0 | element mode */ -) -{ - IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; - H_IGF_GRID hGrid; - Word16 p; /*Q0*/ - Word16 tmp; - Word16 tmp_e; - Word16 SFM_src; - Word16 SFM_tar; - Word16 SFM_src_e; - Word16 SFM_tar_e; - Word16 num_Tiles; - Word16 SFM; - Word16 crest_e; - - SFM = -ONE_IN_Q13; /*1.0f Q13*/ - move16(); - - hPrivateData = &hIGFEnc->igfData; - hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx]; - - IF( NE_16( igfGridIdx, IGF_GRID_LB_NORM ) ) - { - FOR( p = 0; p < hGrid->nTiles; p++ ) - { - /* reset filter */ - hPrivateData->prevSFM_FIR[p] = L_deposit_l( 0 ); - hPrivateData->prevSFM_IIR[p] = 0; - move16(); - - /* preset values: */ - hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; - move16(); - } - } - - FOR( p = 0; p < IGF_MAX_TILES; p++ ) - { - /* update prev data: */ - hPrivateData->igfPrevWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p]; - /* preset values: */ - hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; - move16(); - move16(); - } - - test(); - IF( !( isTransient || hPrivateData->wasTransient ) ) - { - IF( powerSpectrum ) - { - FOR( p = 0; p < hGrid->nTiles; p++ ) - { - Word16 sb; - - IF( isTNSActive ) - { - FOR( sb = hGrid->tile[p]; sb < hGrid->tile[p + 1]; sb++ ) - { - IF( LT_32( powerSpectrum[sb], 1 ) ) - hPrivateData->logSpec[sb] = 0; /* max(0,FLT_MIN_EXP )*/ - ELSE - hPrivateData->logSpec[sb] = extract_l( L_max( 0, L_shr( L_add( BASOP_Util_Log2( powerSpectrum[sb] ), L_shl( powerSpectrum_e[sb], Q25 ) ), Q25 ) ) ); - move16(); - } - } - - /* if current tile contains only a single SFB, reuse already computed SFM values */ - test(); - IF( element_mode > EVS_MONO && EQ_16( sub( hGrid->sfbWrap[p + 1], hGrid->sfbWrap[p] ), 1 ) ) - { - tmp = hPrivateData->SFM_tb_fx[p]; - tmp_e = hPrivateData->sfb_tb_e[p]; - move16(); - move16(); - } - ELSE - { - tmp = BASOP_Util_Divide1616_Scale( IGF_getSFM_new_fx( powerSpectrum, hPrivateData->logSpec, hGrid->tile[p], hGrid->tile[p + 1], powerSpectrum_e ), IGF_getCrest_new_fx( hPrivateData->logSpec, hGrid->tile[p], hGrid->tile[p + 1], &crest_e ), &tmp_e ); - tmp_e = sub( tmp_e, crest_e ); - } - - test(); - IF( last_core_acelp || hPrivateData->wasTransient ) - { - hPrivateData->prevSFM_FIR[p] = L_shl( tmp, add( 1, tmp_e ) ); /*16-(15-exp)=>15Q16*/ - hPrivateData->prevSFM_IIR[p] = shl( tmp, sub( tmp_e, 2 ) ); /*13-(15-exp)=>2Q13*/ - move32(); - move16(); - } - - test(); - IF( LE_32( brate, IVAS_48k ) && EQ_16( element_mode, IVAS_CPE_MDCT ) ) - { - Word16 temp; - num_Tiles = 0; - SFM_src = 0; - SFM_tar = 0; - SFM_src_e = 0; - SFM_tar_e = 0; - move16(); - move16(); - move16(); - move16(); - move16(); - - FOR( sb = hGrid->sfbWrap[p]; sb < hGrid->sfbWrap[p + 1]; sb++ ) - { - num_Tiles = add( num_Tiles, 1 ); - SFM_src_e = BASOP_Util_Add_MantExp( hPrivateData->SFM_sb_fx[sb], hPrivateData->sfb_sb_e[sb], SFM_src, SFM_src_e, &SFM_src ); - SFM_tar_e = BASOP_Util_Add_MantExp( hPrivateData->SFM_tb_fx[sb], hPrivateData->sfb_tb_e[sb], SFM_tar, SFM_tar_e, &SFM_tar ); - } - - /* compute the average */ - SFM_src = shr( BASOP_Util_Divide1616_Scale( SFM_src, num_Tiles, &temp ), 2 ); - SFM_src_e = add( SFM_src_e, sub( temp, 13 ) ); /*temp-15+2:because right shifted by 2 which are the guard bits*/ - SFM_tar = shr( BASOP_Util_Divide1616_Scale( SFM_tar, num_Tiles, &temp ), 2 ); - SFM_tar_e = add( SFM_tar_e, sub( temp, 13 ) ); /*temp-15+2:because right shifted by 2 which are the guard bits*/ - - IF( LT_16( SFM_tar_e, SFM_src_e ) ) - { - SFM_tar = shl( SFM_tar, sub( SFM_tar_e, SFM_src_e ) ); /*making the q for SFM_tar and SFM_src equal with 2 as guard bits*/ - SFM_tar_e = SFM_src_e; - } - ELSE - { - SFM_src = shr( SFM_src, sub( SFM_tar_e, SFM_src_e ) ); /*making the q for SFM_tar and SFM_src equal with 2 as guard bits*/ - SFM_src_e = SFM_tar_e; - } - move16(); - - test(); - test(); - IF( ( p > 0 ) && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) ) - { - test(); - if ( EQ_16( p, 1 ) && EQ_16( abs_s( sub( hPrivateData->igfCurrWhiteningLevel[0], hPrivateData->igfCurrWhiteningLevel[1] ) ), 2 ) ) /* OFF vs. STRONG */ - { - hPrivateData->igfCurrWhiteningLevel[0] = IGF_WHITENING_MID; - move16(); - } - hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p - 1]; - move16(); - } - ELSE IF( sp_aud_decision0 ) - { - /* Music */ - /* whitening Off: when tonality of target is more than source or tonality of target is close to that of source */ - test(); - if ( LE_16( SFM_tar, SFM_src ) || LE_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) ) - { - hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; - move16(); - } - - /* whitening mid: */ - test(); - if ( GT_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) && LE_32( SFM_tar, L_add( SFM_src, L_shl( 5, sub( 13, SFM_src_e ) ) /*1.25 with exponent SFM_src_e*/ ) ) ) - { - hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; - move16(); - } - - /* whitening strong */ - if ( GT_32( SFM_tar, L_add( SFM_src, L_shl( 5, sub( 13, SFM_src_e ) ) /*1.25 with exponent SFM_src_e*/ ) ) ) - { - hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG; - move16(); - } - } - ELSE - { - /* Speech */ - /* whitening Off: when tonality of target is more than source or tonality of target is close to that of source */ - test(); - if ( LE_16( SFM_tar, SFM_src ) || LE_32( SFM_tar, L_add( SFM_src, L_shr( 3277 /*0.1 Q15*/, SFM_src_e ) ) ) ) - { - hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; - move16(); - } - - /* whitening mid: */ - test(); - if ( GT_32( SFM_tar, L_add( SFM_src, L_shr( 3277 /*0.1 Q15*/, SFM_src_e ) ) ) && LE_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) ) - { - hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; - move16(); - } - - /* whitening strong */ - if ( GT_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) ) - { - hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG; - move16(); - } - } - - SFM = shl( SFM_tar, sub( SFM_tar_e, 2 ) ); /*2Q13*/ - } - ELSE - { - test(); - IF( element_mode > EVS_MONO && EQ_16( sub( hGrid->sfbWrap[p + 1], hGrid->sfbWrap[p] ), 1 ) ) - { - SFM = shl( tmp, sub( tmp_e, 2 ) ); /*2Q13*/ - } - ELSE - { - Word32 temp; - temp = L_add( L_shl( tmp, sub( tmp_e, 2 ) ), L_add( L_shr( hPrivateData->prevSFM_FIR[p], 3 ), L_shr( hPrivateData->prevSFM_IIR[p], 1 ) ) ); - SFM = extract_l( L_min( 22118 /*2.7*/, temp ) ); /*2Q13*/ - } - hPrivateData->prevSFM_FIR[p] = L_shl( tmp, add( 1, tmp_e ) ); /*15Q16*/ - hPrivateData->prevSFM_IIR[p] = SFM; - move32(); - move16(); - - IF( GT_16( SFM, hGrid->whiteningThreshold[1][p] ) ) - { - hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG; - move16(); - } - ELSE IF( GT_16( SFM, hGrid->whiteningThreshold[0][p] ) ) - { - hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; - move16(); - } - ELSE - { - hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; - move16(); - } - } - - IF( element_mode > EVS_MONO ) - { - IF( last_core_acelp ) /* reset */ - { - set16_fx( hPrivateData->igfPastSFM_fx[p], -ONE_IN_Q13, IGF_PAST_SFM_LEN ); - hPrivateData->igfWhiteningHangoverCnt[p] = 2; - move16(); - } - ELSE - { - test(); - test(); - test(); - test(); - /* check whether change in whitening level should be allowed or not (if SFM is inside a certain margin around thresholds) */ - IF( NE_16( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfPrevWhiteningLevel[p] ) && - ( ( GT_32( SFM, L_sub( hGrid->whiteningThreshold[0][p], 1229 /*0.15f Q13*/ ) ) && LT_32( SFM, L_add( hGrid->whiteningThreshold[0][p], 1229 ) ) ) || - ( GT_32( SFM, L_sub( hGrid->whiteningThreshold[1][p], 1229 ) ) && LT_32( SFM, L_add( hGrid->whiteningThreshold[1][p], 1229 ) ) ) ) ) - { - Word16 mean_past_SFM; - Word16 mean_past_SFM_e; - Word16 countable; - Word16 i; - mean_past_SFM = 0; - mean_past_SFM_e = 0; - countable = 0; - move16(); - move16(); - move16(); - - /* compute mean of last (available) SFM values */ - FOR( i = 0; i < IGF_PAST_SFM_LEN; i++ ) - { - IF( hPrivateData->igfPastSFM_fx[p][i] >= 0 ) - { - mean_past_SFM_e = BASOP_Util_Add_MantExp( mean_past_SFM, mean_past_SFM_e, hPrivateData->igfPastSFM_fx[p][i], 2, &mean_past_SFM ); - countable = add( countable, 1 ); - } - } - IF( countable ) - { - Word16 temp; - mean_past_SFM = BASOP_Util_Divide1616_Scale( mean_past_SFM, countable, &temp ); - mean_past_SFM_e = add( mean_past_SFM_e, sub( temp, 15 ) ); - mean_past_SFM = shl( mean_past_SFM, sub( mean_past_SFM_e, 2 ) ); /*mean_past_SFM_e=2*/ - /* deny change in whitening level for small deviations from mean SFM */ - if ( LT_16( abs_s( sub( SFM, mean_past_SFM ) ), 1638 ) /*0.2 in Q13*/ ) - { - hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p]; - move16(); - } - } - } - } - - hPrivateData->igfPastSFM_fx[p][hPrivateData->igfPastSFM_pos] = SFM; /*2Q13*/ - move16(); - } - } - - SWITCH( hPrivateData->igfInfo.bitRateIndex ) - { - case IGF_BITRATE_WB_9600: - case IGF_BITRATE_RF_WB_13200: - case IGF_BITRATE_WB_13200_CPE: - case IGF_BITRATE_WB_16400_CPE: - case IGF_BITRATE_RF_SWB_13200: - case IGF_BITRATE_SWB_9600: - case IGF_BITRATE_SWB_13200_CPE: - case IGF_BITRATE_SWB_16400: - case IGF_BITRATE_SWB_24400: - case IGF_BITRATE_SWB_24400_CPE: - case IGF_BITRATE_SWB_32000_CPE: - case IGF_BITRATE_SWB_32000: - case IGF_BITRATE_FB_16400: - case IGF_BITRATE_FB_24400: - case IGF_BITRATE_FB_24400_CPE: - case IGF_BITRATE_FB_32000_CPE: - case IGF_BITRATE_FB_32000: - hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 1] = hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 2]; - move16(); - break; - default: - break; - } - } - ELSE - { - FOR( p = 0; p < hGrid->nTiles; p++ ) - { - hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; - move16(); - } - } - } - ELSE - { - /* reset filter */ - FOR( p = 0; p < IGF_MAX_TILES; p++ ) - { - hPrivateData->prevSFM_FIR[p] = L_deposit_l( 0 ); - hPrivateData->prevSFM_IIR[p] = 0; - move32(); - move16(); - } - } - - IF( element_mode > EVS_MONO ) - { - IF( EQ_16( SFM, -ONE_IN_Q13 /*1.0f 2Q13*/ ) ) /* reset */ - { - FOR( p = 0; p < hGrid->nTiles; p++ ) - { - set16_fx( hPrivateData->igfPastSFM_fx[p], -ONE_IN_Q13, IGF_PAST_SFM_LEN ); - hPrivateData->igfWhiteningHangoverCnt[p] = 2; - move16(); - } - } - - /* vibrato handling */ - FOR( p = 0; p < hGrid->nTiles; p = p + 2 ) - { - test(); - test(); - test(); - IF( ( hPrivateData->igfPrevWhiteningLevel[p] == IGF_WHITENING_OFF && hPrivateData->igfCurrWhiteningLevel[p] != IGF_WHITENING_OFF ) || - ( hPrivateData->igfPrevWhiteningLevel[p + 1] == IGF_WHITENING_OFF && hPrivateData->igfCurrWhiteningLevel[p + 1] != IGF_WHITENING_OFF ) ) - { - Word16 i; - Word16 pastSfm_a[4], pastSfm_b[4]; - Word16 pastSfmDiffSum_a, pastSfmDiffSum_b; - - FOR( i = 0; i < 4; i++ ) - { - pastSfm_a[i] = hPrivateData->igfPastSFM_fx[p][add( hPrivateData->igfPastSFM_pos, sub( 4, i ) ) % IGF_PAST_SFM_LEN]; - pastSfm_b[i] = hPrivateData->igfPastSFM_fx[p + 1][add( hPrivateData->igfPastSFM_pos, sub( 4, i ) ) % IGF_PAST_SFM_LEN]; - move16(); - move16(); - } - pastSfmDiffSum_a = pastSfmDiffSum_b = 0; - move16(); - move16(); - FOR( i = 0; i < 3; i++ ) - { - IF( NE_16( pastSfm_a[i + 1], -ONE_IN_Q13 ) ) - { - pastSfmDiffSum_a = add( pastSfmDiffSum_a, sub( pastSfm_a[i], pastSfm_a[i + 1] ) ); - pastSfmDiffSum_b = add( pastSfmDiffSum_b, sub( pastSfm_b[i], pastSfm_b[i + 1] ) ); - } - ELSE - { - break; - } - } - test(); - test(); - test(); - test(); - /* if tonality oscillates between two tiles, turn whitening off in both */ - IF( ( ( pastSfmDiffSum_a > 0 && pastSfmDiffSum_b < 0 ) || - ( pastSfmDiffSum_a < 0 && pastSfmDiffSum_b > 0 ) ) && - ( GT_32( L_abs( L_sub( pastSfmDiffSum_a, pastSfmDiffSum_b ) ), ONE_IN_Q12 /* 0.5 in Q13 */ ) ) ) - { - hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p + 1] = IGF_WHITENING_OFF; - move16(); - move16(); - } - } - } - - /* hangover */ - FOR( p = 0; p < hGrid->nTiles; p++ ) - { - IF( NE_16( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfPrevWhiteningLevel[p] ) ) - { - hPrivateData->igfWhiteningHangoverCnt[p] = add( hPrivateData->igfWhiteningHangoverCnt[p], 1 ); - IF( EQ_16( hPrivateData->igfWhiteningHangoverCnt[p], 3 ) ) - { - hPrivateData->igfWhiteningHangoverCnt[p] = 0; - } - ELSE - { - hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p]; - } - move16(); - move16(); - } - ELSE - { - hPrivateData->igfWhiteningHangoverCnt[p] = 0; - move16(); - } - } - - hPrivateData->igfPastSFM_pos = add( hPrivateData->igfPastSFM_pos, 1 ) % IGF_PAST_SFM_LEN; - move16(); - } - - hPrivateData->wasTransient = isTransient; - move16(); - - return; -} - - -/*-------------------------------------------------------------------* - * IGF_WriteWhiteningTile_fx() - * - * write whitening levels into bitstream - *-------------------------------------------------------------------*/ - -/*! r: number of bits written */ -static Word16 IGF_WriteWhiteningTile_fx( /**< out: Q0 | number of bits written */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 *pBitOffset, /**< in: | ptr to bitOffset counter */ - Word16 whiteningLevel /**< in: Q0 | whitening levels to write */ -) -{ - Word16 totBitCount; - Word16 startBitCount; - - totBitCount = 0; - startBitCount = *pBitOffset; - move16(); - move16(); - - IF( EQ_32( whiteningLevel, IGF_WHITENING_MID ) ) - { - IGF_write_bits( hBstr, pBitOffset, 0, 1 ); - } - ELSE - { - IGF_write_bits( hBstr, pBitOffset, 1, 1 ); - IF( whiteningLevel == IGF_WHITENING_OFF ) - { - IGF_write_bits( hBstr, pBitOffset, 0, 1 ); - } - ELSE - { - IGF_write_bits( hBstr, pBitOffset, 1, 1 ); - } - } - totBitCount = sub( *pBitOffset, startBitCount ); - - return totBitCount; -} - - -/*-------------------------------------------------------------------* - * IGF_WriteWhiteningLevels_fx() - * - * writes the whitening levels - *-------------------------------------------------------------------*/ - -static Word16 IGF_WriteWhiteningLevels_fx( /**< out: Q0 | total number of bits written */ - const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF encoder */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 *pBitOffset, /**< in: | ptr to bitOffset counter */ - const Word16 igfGridIdx, /**< in: Q0 | igf grid index see declaration of IGF_GRID_IDX for details */ - const Word16 isIndepFlag /**< in: Q0 | if 1 frame is independent, 0 = frame is coded with data from previous frame */ -) -{ - IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; - H_IGF_GRID hGrid; - Word16 p; - Word16 nTiles; - Word16 isSame; - Word32 tmp32; - Word16 totBitCount; - Word16 startBitCount; - - totBitCount = 0; - move16(); - isSame = 1; - move16(); - startBitCount = *pBitOffset; - move16(); - hPrivateData = &hInstance->igfData; - hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; - nTiles = hGrid->nTiles; - move16(); - - IF( isIndepFlag ) - { - isSame = 0; - move16(); - } - ELSE - { - p = 0; - move16(); - tmp32 = 0; - move32(); - test(); - WHILE( ( LT_16( p, nTiles ) ) && ( tmp32 == 0 ) ) - { - test(); - tmp32 = L_sub( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfPrevWhiteningLevel[p] ); - if ( tmp32 != 0 ) - { - isSame = 0; - move16(); - } - p++; - } - } - IF( isSame ) - { - IGF_write_bits( hBstr, pBitOffset, 1, 1 ); - } - ELSE - { - IF( !isIndepFlag ) - { - IGF_write_bits( hBstr, pBitOffset, 0, 1 ); - } - IGF_WriteWhiteningTile_fx( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[0] ); - p = 1; - move16(); - tmp32 = 0; - move32(); - test(); - IF( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) - { - isSame = 1; - move16(); - } - ELSE - { - if ( LT_16( p, nTiles ) ) - { - isSame = 1; - move16(); - } - test(); - WHILE( ( LT_16( p, nTiles ) ) && ( tmp32 == 0 ) ) - { - test(); - tmp32 = L_sub( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfCurrWhiteningLevel[p - 1] ); - if ( tmp32 != 0 ) - { - isSame = 0; - move16(); - } - p++; - } - } - test(); - IF( !isSame ) - { - IGF_write_bits( hBstr, pBitOffset, 1, 1 ); - FOR( p = 1; p < nTiles; p++ ) - { - IGF_WriteWhiteningTile_fx( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[p] ); - } - } - ELSE IF( NE_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) && NE_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) - { - IGF_write_bits( hBstr, pBitOffset, 0, 1 ); - } - } - - totBitCount = sub( *pBitOffset, startBitCount ); - - return totBitCount; -} - - -/*-------------------------------------------------------------------* - * IGF_WriteFlatteningTrigger_fx() - * - * write flattening trigger - *-------------------------------------------------------------------*/ - -/*! r: number of bits written */ -static Word16 IGF_WriteFlatteningTrigger_fx( /**< out: | number of bits written */ - const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 *pBitOffset /**< in: | ptr to bitOffset counter */ -) -{ - Word16 flatteningTrigger; - - Word16 totBitCount; - Word16 startBitCount; - totBitCount = 0; - startBitCount = *pBitOffset; - flatteningTrigger = hInstance->flatteningTrigger; - move16(); - move16(); - move16(); - - IGF_write_bits( hBstr, pBitOffset, flatteningTrigger, 1 ); - totBitCount = sub( *pBitOffset, startBitCount ); - - return totBitCount; -} - - -/*-------------------------------------------------------------------* - * IGF_UpdateInfo() - * - * updates the start/stop frequency of IGF according to igfGridIdx - *-------------------------------------------------------------------*/ - -/*-------------------------------------------------------------------* - * IGFEncWriteBitstream() - * - * IGF bitstream writer - *-------------------------------------------------------------------*/ - -/*! r: number of bits written per frame */ -Word16 IGFEncWriteBitstream_ivas_fx( - const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 *pBitOffset, /* i : ptr to bitOffset counter */ - const Word16 igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ - const Word16 isIndepFlag /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ -) -{ - Word16 igfAllZero; - Word16 startBitCount; - - startBitCount = *pBitOffset; - move16(); - hIGFEnc->infoTotalBitsPerFrameWritten = 0; - move16(); - - if ( isIndepFlag ) - { - hIGFEnc->infoTotalBitsWritten = 0; - move16(); - } - - IGF_WriteEnvelope( hIGFEnc, /* i: instance handle of IGF Encoder */ - hBstr, /* i: encoder state */ - pBitOffset, /* i: ptr to bitOffset counter */ - igfGridIdx, /* i: igf grid index see definition of IGF_GRID_IDX for details */ - isIndepFlag, /* i: if 1 frame is independent, 0 = frame is coded with data from previous frame */ - &igfAllZero ); /* o: *igfAllZero */ - - IGF_WriteWhiteningLevels_fx( hIGFEnc, /* i: instance handle of IGF Encoder */ - hBstr, /* i: encoder state */ - pBitOffset, /* i: ptr to bitOffset counter */ - igfGridIdx, /* i: igf grid index see definition of IGF_GRID_IDX for details */ - isIndepFlag ); /* i: if 1 frame is independent, 0 = frame is coded with data from previous frame */ - - IGF_WriteFlatteningTrigger_fx( hIGFEnc, /* i: instance handle of IGF Encoder */ - hBstr, /* i: encoder state */ - pBitOffset ); /* i: ptr to bitOffset counter */ - - hIGFEnc->infoTotalBitsPerFrameWritten = sub( *pBitOffset, startBitCount ); - hIGFEnc->infoTotalBitsWritten = add( hIGFEnc->infoTotalBitsWritten, hIGFEnc->infoTotalBitsPerFrameWritten ); - move16(); - move16(); - - return hIGFEnc->infoTotalBitsPerFrameWritten; -} - - -/*-------------------------------------------------------------------* - * IGFEncSetMode() - * - * sets the IGF mode according to given bitrate - *-------------------------------------------------------------------*/ -void IGFEncSetMode_ivas_fx( - const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i/o: instance handle of IGF Encoder */ - const Word32 total_brate, /* i : encoder total bitrate */ - const Word16 bwidth, /* i : encoder audio bandwidth */ - const Word16 element_mode, /* i : IVAS element mode */ - const Word16 rf_mode /* i : flag to signal the RF mode */ -) -{ - IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; - Word16 i; - - hPrivateData = &hIGFEnc->igfData; - hPrivateData->igfBitstreamBits = 0; - move16(); - set16_fx( hPrivateData->igfScfQuantized, 0, IGF_MAX_SFB ); - set16_fx( hPrivateData->igfCurrWhiteningLevel, 0, IGF_MAX_TILES ); - set16_fx( hPrivateData->igfPrevWhiteningLevel, 0, IGF_MAX_TILES ); - set16_fx( hPrivateData->igfWhiteningHangoverCnt, 0, IGF_MAX_TILES ); - FOR( i = 0; i < IGF_MAX_TILES; i++ ) - { - set16_fx( hPrivateData->igfPastSFM_fx[i], -( ONE_IN_Q13 ), IGF_PAST_SFM_LEN ); - } - - hPrivateData->igfPastSFM_pos = 0; - move16(); - - FOR( i = 0; i < IGF_BITBUFSIZE / 8; i++ ) - { - hPrivateData->igfBitstream[i] = 0; - move16(); - } - hPrivateData->wasTransient = 0; - move16(); - set32_fx( hPrivateData->prevSFM_FIR, 0, IGF_MAX_TILES ); - set16_fx( hPrivateData->prevSFM_IIR, 0, IGF_MAX_TILES ); - set16_fx( hPrivateData->dampingFactorSmoothing, 2, IGF_MAX_SFB ); - set16_fx( hPrivateData->prevSFM_FIR_SFB_SB_fx, 0, IGF_MAX_SFB ); - set16_fx( hPrivateData->prevSFB_FIR_TB_e, 15, IGF_MAX_SFB ); - set16_fx( hPrivateData->prevSFB_FIR_SB_e, 15, IGF_MAX_SFB ); - set16_fx( hPrivateData->prevSFM_IIR_SFB_SB_fx, 0, IGF_MAX_SFB ); - set16_fx( hPrivateData->prevSFB_IIR_SB_e, 15, IGF_MAX_SFB ); - set16_fx( hPrivateData->prevSFM_FIR_SFB_TB_fx, 0, IGF_MAX_SFB ); - set16_fx( hPrivateData->prevSFB_IIR_TB_e, 15, IGF_MAX_SFB ); - set16_fx( hPrivateData->sfb_tb_e, 15, IGF_MAX_SFB ); - set16_fx( hPrivateData->sfb_sb_e, 15, IGF_MAX_SFB ); - set16_fx( hPrivateData->prevSFM_IIR_SFB_TB_fx, 0, IGF_MAX_SFB ); - set16_fx( hPrivateData->prevDampingFactor_IIR_fx, -( ONE_IN_Q15 ), IGF_MAX_SFB ); - set16_fx( hPrivateData->prevDampingFactor_IIR_e, 0, IGF_MAX_SFB ); - set16_fx( hPrivateData->logSpec, 0, L_FRAME_PLUS ); - set16_fx( hPrivateData->SFM_sb_fx, 0, IGF_MAX_SFB ); - set16_fx( hPrivateData->SFM_tb_fx, 0, IGF_MAX_SFB ); - - IF( IGFCommonFuncsIGFConfiguration_ivas_fx( total_brate, bwidth, element_mode, &hPrivateData->igfInfo, rf_mode ) != 0 ) - { - IGFSCFEncoderOpen_fx( &hPrivateData->hIGFSCFArithEnc, &hPrivateData->igfInfo, total_brate, bwidth, element_mode, rf_mode ); - - hIGFEnc->infoSamplingRate = hPrivateData->igfInfo.sampleRate; - move32(); - hIGFEnc->infoStartFrequency = hPrivateData->igfInfo.grid[0].startFrequency; - move16(); - hIGFEnc->infoStopFrequency = hPrivateData->igfInfo.grid[0].stopFrequency; - move16(); - hIGFEnc->infoStartLine = hPrivateData->igfInfo.grid[0].startLine; - move16(); - hIGFEnc->infoStopLine = hPrivateData->igfInfo.grid[0].stopLine; - move16(); - } - ELSE - { - /* IGF configuration failed -> error! */ - hIGFEnc->infoSamplingRate = 0; - move32(); - hIGFEnc->infoStartFrequency = -1; - move16(); - hIGFEnc->infoStopFrequency = -1; - move16(); - hIGFEnc->infoStartLine = -1; - move16(); - hIGFEnc->infoStopLine = -1; - move16(); - fprintf( stderr, "IGFEncSetMode_fx: initialization error!\n" ); - } - - /* reset remaining variables */ - hIGFEnc->infoTotalBitsWritten = 0; - move16(); - hIGFEnc->infoTotalBitsPerFrameWritten = 0; - move16(); - hIGFEnc->flatteningTrigger = 0; - move16(); - hIGFEnc->spec_be_igf_e = 0; - move16(); - hIGFEnc->tns_predictionGain = 0; - move16(); - set32_fx( hIGFEnc->spec_be_igf, 0, N_MAX_TCX - IGF_START_MN ); - return; -} - -/*-------------------------------------------------------------------* - * pack_bit_ivas() - * - * insert a bit into packed octet - *-------------------------------------------------------------------*/ - -/*-------------------------------------------------------------------* - * IGFEncConcatenateBitstream() - * - * IGF bitstream concatenation for TCX10 modes - *-------------------------------------------------------------------*/ - -void IGFEncConcatenateBitstream( - const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ - const Word16 bsBits, /* i : number of IGF bits written to list of indices */ - BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ -) -{ - Word16 i; - IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; - Indice *ind_list; - UWord8 *pFrame; /* byte array with bit packet and byte aligned coded speech data */ - Word16 *pFrame_size; /* number of bits in the binary encoded access unit [bits] */ - Word16 k, nb_bits_written; - Word32 imask; - UWord8 omask; - - hPrivateData = &hIGFEnc->igfData; - - ind_list = &hBstr->ind_list[sub( hBstr->nb_ind_tot, bsBits )]; /* here, we assume that each bit has been written as a single indice */ - pFrame = hPrivateData->igfBitstream; - pFrame_size = &hPrivateData->igfBitstreamBits; - nb_bits_written = 0; - move16(); - - omask = (UWord8) shr( 0x80, s_and( *pFrame_size, 0x7 ) ); - pFrame += shr( *pFrame_size, 3 ); - - /* bitstream packing (conversion of individual indices into a serial stream) */ - FOR( i = 0; i < bsBits; i++ ){ - IF( ind_list[i].nb_bits > 0 ){ - /* mask from MSB to LSB */ - imask = L_shl( 1, ( sub( ind_list[i].nb_bits, 1 ) ) ); - - /* write bit by bit */ - FOR( k = 0; k < ind_list[i].nb_bits; k++ ) - { - pack_bit( ind_list[i].value & imask, &pFrame, &omask ); - imask = L_shr( imask, 1 ); - } - nb_bits_written = add( nb_bits_written, ind_list[i].nb_bits ); - - /* delete the indice */ - ind_list[i].nb_bits = -1; - move16(); -} -} - -*pFrame_size = add( *pFrame_size, nb_bits_written ); -move16(); - -/* update list of indices */ -hBstr->nb_ind_tot = sub( hBstr->nb_ind_tot, bsBits ); -hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, nb_bits_written ); -move16(); -move16(); - -return; -} - - -/*-------------------------------------------------------------------* - * IGFEncResetTCX10BitCounter_ivas_fx() - * - * IGF reset bitstream bit counter for TCX10 modes - *-------------------------------------------------------------------*/ - -void IGFEncResetTCX10BitCounter_ivas_fx( - const IGF_ENC_INSTANCE_HANDLE hIGFEnc /* i : instance handle of IGF Encoder */ -) -{ - IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; - - hPrivateData = &hIGFEnc->igfData; - hPrivateData->igfBitstreamBits = 0; - hIGFEnc->infoTotalBitsWritten = 0; - move16(); - move16(); - return; -} - - -/*-------------------------------------------------------------------* - * IGFEncApplyMono() - * - * apply the IGF encoder, main encoder interface - *-------------------------------------------------------------------*/ - -void IGFEncApplyMono_ivas_fx( - Encoder_State *st, /* i : Encoder state */ -#ifdef MSAN_FIX - Word16 powerSpectrum_len, /* i: length of pPowerSpectrum_fx buffer */ -#endif - const Word16 igfGridIdx, /* i : IGF grid index */ - Word32 *pMDCTSpectrum_fx, /* i/o: MDCT spectrum */ - Word16 e_mdct, /* i : exponent of pMDCTspectrum */ - Word32 *pPowerSpectrum_fx, /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 *e_ps, /* i : exponent of pPowerSpectrum */ - const Word16 isTCX20, /* i : flag indicating if the input is TCX20 or TCX10/2xTCX5 */ - const Word8 isTNSActive, /* i : flag indicating if the TNS is active */ - const Word16 sp_aud_decision0, /* i : first stage switching decision */ - const Word16 vad_hover_flag /* i : VAD hangover flag */ -) -{ - Word32 *pPowerSpectrumParameter_fx; - Word16 *pPowerSpectrumParameter_exp; - Word16 att_fx = MAX16B; - Word16 last_core_acelp; - move16(); - - Word32 common_pPowerSpectrum_fx[N_MAX + L_MDCT_OVLP_MAX]; - -#ifdef MSAN_FIX - set32_fx( common_pPowerSpectrum_fx, 0, N_MAX + L_MDCT_OVLP_MAX ); -#endif - - Word16 common_pPowerSpectrum_exp = MIN16B; - move16(); - IF( st->last_core == ACELP_CORE ) - { - last_core_acelp = 1; - move16(); - } - ELSE - { - last_core_acelp = 0; - move16(); - } - - test(); - IF( !isTNSActive && isTCX20 ) - { - pPowerSpectrumParameter_fx = pPowerSpectrum_fx; - pPowerSpectrumParameter_exp = e_ps; - } - ELSE - { - pPowerSpectrumParameter_fx = NULL; - pPowerSpectrumParameter_exp = NULL; - } - - IGF_UpdateInfo( st->hIGFEnc, igfGridIdx ); - - test(); - IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - calculate_hangover_attenuation_gain_ivas_fx( st, &att_fx, vad_hover_flag ); - } - - IGF_CalculateEnvelope_ivas_fx( st->hIGFEnc, pMDCTSpectrum_fx, e_mdct, pPowerSpectrumParameter_fx, pPowerSpectrumParameter_exp, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, st->element_mode, att_fx ); - - IF( isTCX20 ) - { - pPowerSpectrumParameter_fx = pPowerSpectrum_fx; - pPowerSpectrumParameter_exp = e_ps; - } - ELSE - { - pPowerSpectrumParameter_fx = NULL; - pPowerSpectrumParameter_exp = NULL; - } - - IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) - { - IGF_Whitening_ivas_fx( st->hIGFEnc, pPowerSpectrumParameter_fx, pPowerSpectrumParameter_exp, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, isTNSActive, sp_aud_decision0, st->element_brate, st->element_mode ); - } - ELSE - { - IGF_Whitening_ivas_fx( st->hIGFEnc, pPowerSpectrumParameter_fx, pPowerSpectrumParameter_exp, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, isTNSActive, sp_aud_decision0, st->total_brate, st->element_mode ); - } - - IF( pPowerSpectrumParameter_fx ) - { -#ifndef MSAN_FIX - FOR( Word16 i = 0; i < N_MAX + L_MDCT_OVLP_MAX; i++ ) -#else - FOR( Word16 i = 0; i < powerSpectrum_len; i++ ) -#endif - { - common_pPowerSpectrum_exp = s_max( common_pPowerSpectrum_exp, pPowerSpectrumParameter_exp[i] ); - } - -#ifndef MSAN_FIX - FOR( Word16 i = 0; i < N_MAX + L_MDCT_OVLP_MAX; i++ ) -#else - FOR( Word16 i = 0; i < powerSpectrum_len; i++ ) -#endif - { - common_pPowerSpectrum_fx[i] = L_shl( pPowerSpectrumParameter_fx[i], sub( pPowerSpectrumParameter_exp[i], common_pPowerSpectrum_exp ) ); - move16(); - } - pPowerSpectrumParameter_fx = common_pPowerSpectrum_fx; - } - IGF_ErodeSpectrum_ivas_fx( st->hIGFEnc, pMDCTSpectrum_fx, pPowerSpectrumParameter_fx, common_pPowerSpectrum_exp, igfGridIdx, 0 ); -} - - -/*-------------------------------------------------------------------* - * IGFEncApplyStereo() - * - * apply the IGF encoder, main encoder interface - *-------------------------------------------------------------------*/ - -void IGFEncApplyStereo_fx( - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ - Word16 ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ - const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ - const Word16 igfGridIdx, /* i : IGF grid index */ - Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ - Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ - Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ - const Word16 frameno, /* i : flag indicating index of current subfr. */ - const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ - const Word32 element_brate, /* i : element bitrate */ - const Word16 mct_on ) -{ - Word32 *pPowerSpectrumParameter_fx[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */ - Word32 *pPowerSpectrumParameterMsInv_fx[NB_DIV]; - Word16 coreMsMask[N_MAX]; - Word16 sfb, ch, last_core_acelp; - STEREO_MDCT_BAND_PARAMETERS *sfbConf; - Word16 exp_pPowerSpectrum[L_FRAME48k]; - - /* assumptions: stereo filling was already done on the flattened spectra - * IGF region is always coded M/S, never L/R (to be done in the encoder) - * for residual bands with stereo filling infoTcxNoise is set to zero - * both channels have the same IGF configuration - */ - - /* sanity checks: check if both channels have the same configuration...*/ - assert( ( sts[0]->core == sts[1]->core ) ); - - /* initialization */ - IF( EQ_16( sts[0]->core, TCX_20_CORE ) ) - { - sfbConf = &hStereoMdct->stbParamsTCX20; - } - ELSE - { - sfbConf = &hStereoMdct->stbParamsTCX10; - } - if ( sts[0]->last_core == ACELP_CORE ) - { - sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; - } - - /* create line wise ms mask for the core bands */ - set16_fx( coreMsMask, 0, N_MAX ); - FOR( sfb = 0; sfb < sfbConf->sfbCnt; sfb++ ) - { - set16_fx( &coreMsMask[sfbConf->sfbOffset[sfb]], ms_mask[frameno][sfb], sub( sfbConf->sfbOffset[sfb + 1], sfbConf->sfbOffset[sfb] ) ); - } - - test(); - test(); - IF( EQ_16( sts[0]->core, TCX_20_CORE ) && !sts[0]->hTcxEnc->fUseTns[frameno] && !sts[1]->hTcxEnc->fUseTns[frameno] ) - { - pPowerSpectrumParameter_fx[0] = &pPowerSpectrum_fx[0][0]; - pPowerSpectrumParameter_fx[1] = &pPowerSpectrum_fx[1][0]; - pPowerSpectrumParameterMsInv_fx[0] = pPowerSpectrumMsInv_fx[0][0]; - pPowerSpectrumParameterMsInv_fx[1] = pPowerSpectrumMsInv_fx[1][0]; - } - ELSE - { - pPowerSpectrumParameter_fx[0] = NULL; - pPowerSpectrumParameter_fx[1] = NULL; - pPowerSpectrumParameterMsInv_fx[0] = NULL; - pPowerSpectrumParameterMsInv_fx[1] = NULL; - } - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - last_core_acelp = extract_l( EQ_16( sts[ch]->last_core, ACELP_CORE ) ); - - IGF_UpdateInfo( hIGFEnc[ch], igfGridIdx ); - IGF_CalculateStereoEnvelope_fx( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum_fx[frameno], sts[ch]->hTcxEnc->spectrum_e[frameno], inv_spectrum_fx[ch][frameno], sts[ch]->hTcxEnc->spectrum_e[frameno], pPowerSpectrumParameter_fx[ch], sts[ch]->hTcxEnc->spectrum_e[frameno], pPowerSpectrumParameterMsInv_fx[ch], sts[ch]->hTcxEnc->spectrum_e[frameno], igfGridIdx, coreMsMask, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp ); - - IF( EQ_16( sts[ch]->core, TCX_20_CORE ) ) - { - pPowerSpectrumParameter_fx[ch] = pPowerSpectrum_fx[ch]; - } - ELSE - { - pPowerSpectrumParameter_fx[ch] = NULL; - } - - set16_fx( exp_pPowerSpectrum, sts[ch]->hTcxEnc->spectrum_e[frameno], L_FRAME48k ); - - IGF_Whitening_ivas_fx( hIGFEnc[ch], pPowerSpectrumParameter_fx[ch], &exp_pPowerSpectrum[0], igfGridIdx, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, ( sts[0]->hTcxEnc->fUseTns[frameno] || sts[1]->hTcxEnc->fUseTns[frameno] ), sp_aud_decision0, element_brate, sts[ch]->element_mode ); - - IGF_ErodeSpectrum_ivas_fx( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum_fx[frameno], pPowerSpectrumParameter_fx[ch], sts[ch]->hTcxEnc->spectrum_e[frameno], igfGridIdx, mct_on ); - } - return; -} - - -/*-------------------------------------------------------------------* - * IGFSaveSpectrumForITF() - * - * - *-------------------------------------------------------------------*/ - -void IGFSaveSpectrumForITF_ivas_fx( - IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i/o: instance handle of IGF Encoder */ - const Word16 igfGridIdx, /* i : IGF grid index */ - const Word32 *pITFSpectrum, /* i : MDCT spectrum */ - Word16 exp_pITFSpectrum ) -{ - IGF_UpdateInfo( hIGFEnc, igfGridIdx ); - - Copy32( pITFSpectrum + IGF_START_MN, hIGFEnc->spec_be_igf, sub( hIGFEnc->infoStopLine, IGF_START_MN ) ); - - scale_sig32( hIGFEnc->spec_be_igf, sub( hIGFEnc->infoStopLine, IGF_START_MN ), sub( exp_pITFSpectrum, s_max( exp_pITFSpectrum, hIGFEnc->spec_be_igf_e ) ) ); - scale_sig32( hIGFEnc->spec_be_igf + sub( hIGFEnc->infoStopLine, IGF_START_MN ), sub( N_MAX_TCX - IGF_START_MN, sub( hIGFEnc->infoStopLine, IGF_START_MN ) ), sub( hIGFEnc->spec_be_igf_e, s_max( exp_pITFSpectrum, hIGFEnc->spec_be_igf_e ) ) ); - hIGFEnc->spec_be_igf_e = s_max( exp_pITFSpectrum, hIGFEnc->spec_be_igf_e ); - move16(); - - return; -} - -ivas_error IGF_Reconfig( - IGF_ENC_INSTANCE_HANDLE *hIGFEnc, /* i/o: instance handle of IGF Encoder */ - const Word16 igf, /* i : IGF on/off */ - const Word16 reset, /* i : reset flag */ - const Word32 brate, /* i : bitrate for configuration */ - const Word16 bwidth, /* i : signal bandwidth */ - const Word16 element_mode, /* i : IVAS element mode */ - const Word16 rf_mode /* i : flag to signal the RF mode */ -) -{ - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - test(); - test(); - test(); - IF( igf && *hIGFEnc == NULL ) - { - IF( ( *hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) ); - } - IGFEncSetMode_ivas_fx( *hIGFEnc, brate, bwidth, element_mode, rf_mode ); - } - ELSE IF( igf && reset ) - { - IGFEncSetMode_ivas_fx( *hIGFEnc, brate, bwidth, element_mode, rf_mode ); - } - ELSE IF( !igf && *hIGFEnc != NULL ) - { - free( *hIGFEnc ); - *hIGFEnc = NULL; - } - - return error; -} diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c old mode 100644 new mode 100755 index cc48408763babac36e5f43a16ffc5c3777a222a1..d9d7c052585e634e0c97b1af28d8299bd8ae0f21 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -13,35 +13,46 @@ #include "stat_enc.h" #include "basop_util.h" -/**********************************************************************/ /* -write single bit to stream -**************************************************************************/ + +/*-------------------------------------------------------------------* + * IGF_write_bit_fx() + * + * write single bit to stream + *-------------------------------------------------------------------*/ + static void IGF_write_bit_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 *bitCount, /**< in/out: | bit counter */ - Word16 bit /**< in: | value of bit */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 *bitCount, /* i/o: bit counter */ + const Word16 value /* i : value */ ) { - IGFCommonFuncsWriteSerialBit( hBstr, bitCount, bit ); + IF( hBstr ) + { + push_next_indice( hBstr, value, 1 ); + } + + ( *bitCount ) = add( ( *bitCount ), 1 ); + move16(); + + return; } -/**********************************************************************/ /* -write bits to stream -**************************************************************************/ +/*-------------------------------------------------------------------* + * IGF_write_bits() + * + * write bits to stream + *-------------------------------------------------------------------*/ + static void IGF_write_bits( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 *bitCount, /**< in/out: | bit counter */ - Word16 value, /**< in: | value to be written */ - Word16 bits /**< in: Q0 | number of bits */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 *bitCount, /* i/o: bit counter */ + const Word16 value, /* i/o: value */ + Word16 bits /* i : number of bits */ ) { - Word16 tmp; - - WHILE( bits ) + WHILE( bits-- ) { - bits = sub( bits, 1 ); - tmp = s_and( value, shl( 1, bits ) ); - IF( tmp == 0 ) + IF( s_and( value, shl( 1, bits ) ) == 0 ) { IGF_write_bit_fx( hBstr, bitCount, 0 ); } @@ -55,15 +66,16 @@ static void IGF_write_bits( } -/**********************************************************************/ /* +/**********************************************************************/ /* envelope estimation **************************************************************************/ -static void IGF_CalculateEnvelope( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ - Word32 *pMDCTSpectrum, /**< in: Q31 | MDCT spectrum */ - Word16 MDCTSpectrum_e, /**< in: | exponent of MDCT spectrum */ - Word32 *pPowerSpectrum, /**< in: Q31 | MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 PowerSpectrum_e, /**< in: | exponent of MDCT^2 + MDST^2 spectrum, or estimate */ - const Word16 igfGridIdx /**< in: Q0 | IGF grid index */ +static void IGF_CalculateEnvelope( + const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ + Word32 *pMDCTSpectrum, /**< in: Q31 | MDCT spectrum */ + Word16 MDCTSpectrum_e, /**< in: | exponent of MDCT spectrum */ + Word32 *pPowerSpectrum, /**< in: Q31 | MDCT^2 + MDST^2 spectrum, or estimate */ + Word16 PowerSpectrum_e, /**< in: | exponent of MDCT^2 + MDST^2 spectrum, or estimate */ + const Word16 igfGridIdx /**< in: Q0 | IGF grid index */ ) { @@ -93,10 +105,6 @@ static void IGF_CalculateEnvelope( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< Word16 tmp_exp; Word32 L_tmp; Word16 shift; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* initialize variables */ Copy32( pMDCTSpectrum + IGF_START_MN, hInstance->spec_be_igf, hInstance->infoStopLine - IGF_START_MN ); @@ -218,8 +226,8 @@ static void IGF_CalculateEnvelope( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< move16(); } - BASOP_Util_Divide_MantExp( round_fx_o( sfbEnergyTileR[sfb], &Overflow ), sfbEnergyTileR_exp[sfb], width, 15, &gain, &gain_exp ); - BASOP_Util_Divide_MantExp( round_fx_o( sfbEnergyC[sfb], &Overflow ), sfbEnergyC_exp[sfb], round_fx_o( sfbEnergyTileC[sfb], &Overflow ), sfbEnergyTileC_exp[sfb], &tmp, &tmp_exp ); + BASOP_Util_Divide_MantExp( round_fx_sat( sfbEnergyTileR[sfb] ), sfbEnergyTileR_exp[sfb], width, 15, &gain, &gain_exp ); + BASOP_Util_Divide_MantExp( round_fx_sat( sfbEnergyC[sfb] ), sfbEnergyC_exp[sfb], round_fx_sat( sfbEnergyTileC[sfb] ), sfbEnergyTileC_exp[sfb], &tmp, &tmp_exp ); L_tmp = L_mult( gain, tmp ); gain_exp = add( gain_exp, tmp_exp ); } @@ -247,7 +255,7 @@ static void IGF_CalculateEnvelope( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< L_tmp = BASOP_Util_Log2( L_tmp ); L_tmp = L_add( L_tmp, L_deposit_h( shl( gain_exp, 15 - 6 ) ) ); shift = norm_l( L_tmp ); - gain = round_fx_o( L_shl_o( L_tmp, shift, &Overflow ), &Overflow ); + gain = round_fx_sat( L_shl( L_tmp, shift ) ); gain_exp = sub( 7, shift ); gain_exp = BASOP_Util_Add_MantExp( gain, gain_exp, 32767 /*16 Q11*/, 4, &gain ); gain_exp = BASOP_Util_Add_MantExp( gain, gain_exp, 0x4000, 0, &gain ); @@ -277,16 +285,19 @@ static void IGF_CalculateEnvelope( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< return; } + /**********************************************************************/ /* writes IGF SCF values **************************************************************************/ -static void IGF_WriteEnvelope( /**< out: Q0 | number of bits writen */ - const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 *pBitOffset, /**< in: | ptr to bitOffset counter */ - const Word16 igfGridIdx, /**< in: Q0 | igf grid index see declaration of IGF_GRID_IDX for details */ - const Word16 isIndepFlag, /**< in: Q0 | if 1 frame is independent, 0 = frame is coded with data from previous frame */ - Word16 *igfAllZero /**< in: Q0 | returns 1 if all IGF scfs are zero, else 0 */ + +/**< out: Q0 | number of bits writen */ +static void IGF_WriteEnvelope( + const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 *pBitOffset, /**< in: | ptr to bitOffset counter */ + const Word16 igfGridIdx, /**< in: Q0 | igf grid index see declaration of IGF_GRID_IDX for details */ + const Word16 isIndepFlag, /**< in: Q0 | if 1 frame is independent, 0 = frame is coded with data from previous frame */ + Word16 *igfAllZero /**< in: Q0 | returns 1 if all IGF scfs are zero, else 0 */ ) { IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; @@ -358,7 +369,6 @@ void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< ou Word32 highPassEner; /* Q31 */ Word32 lastLine; Word32 nextLine; - Word32 L_c; Word32 highPassEner_Ovfl; Word16 s; Word16 tmploop; @@ -372,13 +382,6 @@ void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< ou Word16 tmp; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; - move32(); - move32(); -#endif - hPrivateData = &hInstance->igfData; hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; igfBgn = hGrid->startLine; @@ -409,19 +412,14 @@ void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< ou IF( igfBgn > 0 ) { - L_c = 0; - move32(); + Word64 W_highPassEner = 0; + move64(); FOR( i = 0; i < igfBgn; i++ ) { - Carry = 0; - move32(); - highPassEner = L_add_co( highPassEner, Mpy_32_16_1( pPowerSpectrum[i], shl( i, 4 ) /*Q4*/ ) /*Q20, pPowerSpectrum_exp*/, &Carry, &Overflow ); - Overflow = 0; - move32(); - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); + W_highPassEner = W_add( W_highPassEner, W_deposit32_l( Mpy_32_16_1( pPowerSpectrum[i], shl( i, 4 ) /*Q4*/ ) ) /*Q20, pPowerSpectrum_exp*/ ); } - highPassEner = norm_llQ31( L_c, highPassEner, highPassEner_exp ); /*Q20, highPassEner_exp*/ + highPassEner = w_norm_llQ31( W_highPassEner, highPassEner_exp ); /*Q20, highPassEner_exp*/ *highPassEner_exp = add( *highPassEner_exp, pPowerSpectrum_exp ); move16(); test(); @@ -442,8 +440,8 @@ void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< ou /* May overflow - just for threshold comparison */ /* negate because the negated may be 1 larger in abs, */ /* so whenever compared to the negation of a maximum possible pPowerspectrum, it is still larger */ - highPassEner_Ovfl = L_shl_o( L_negate( highPassEner ), sub( *highPassEner_exp, pPowerSpectrum_exp ), &Overflow ); - L_tmp = L_add_o( pPowerSpectrum[i - 1], highPassEner_Ovfl, &Overflow ); + highPassEner_Ovfl = L_shl_sat( L_negate( highPassEner ), sub( *highPassEner_exp, pPowerSpectrum_exp ) ); + L_tmp = L_add_sat( pPowerSpectrum[i - 1], highPassEner_Ovfl ); if ( L_tmp >= 0 ) { @@ -781,6 +779,87 @@ Word16 IGF_getCrest( /**< ou return crest; } +Word16 IGF_getCrest_ivas( /**< out: Q15| crest factor */ + Word16 *crest_exp, /**< out: | exponent of crest factor */ + const Word32 *powerSpectrum, /**< in: Q31 | power spectrum */ + const Word16 *powerSpectrum_exp, /**< in: | exponent of power spectrum */ + const Word16 start, /**< in: Q0 | start subband index */ + const Word16 stop /**< in: Q0 | stop subband index */ +) +{ + Word16 i; + Word16 x; + Word16 s; + Word32 x_eff32; + Word16 x_max; + Word16 crest; + Word16 tmp; + Word32 tmp32; + + x_eff32 = 0; + move32(); + x_max = 0; + move16(); + crest = 16384 /*.5f Q15*/; + move16(); + *crest_exp = 1; + move16(); + + FOR( i = start; i < stop; i++ ) + { + /*x = max(0, (int)(log(powerSpectrum[i]) * INV_LOG_2));*/ + + /*see IGF_getSFM for more comment */ + x = sub( sub( powerSpectrum_exp[i], norm_l( powerSpectrum[i] ) ), 1 ); /*Q0*/ + if ( powerSpectrum[i] == 0 ) /*special case: energy is zero*/ + { + x = 0; + move16(); + } + x = s_max( 0, x ); + x_eff32 = L_mac0( x_eff32, x, x ); /*Q0*/ + x_max = s_max( x_max, x ); /*Q0*/ + } + + /*x_eff /= (stop - start);*/ + x_eff32 = BASOP_Util_Divide3216_Scale( x_eff32, sub( stop, start ), &s ); /*Q-1, s*/ + s = add( s, 32 ); /*make x_eff Q31*/ + + /*trunkate to int*/ + x_eff32 = L_shr( x_eff32, sub( 31, s ) ); + x_eff32 = L_shl( x_eff32, sub( 31, s ) ); + + test(); + IF( x_eff32 > 0 && x_max > 0 ) + { + /*crest = max(1.f, (float)x_max/sqrt(x_eff));*/ + tmp32 = ISqrt32( x_eff32, &s ); /*Q31, s*/ + tmp32 = Mpy_32_16_1( tmp32 /*Q31, s*/, x_max /*Q0*/ ); /*Q16, s*/ + i = norm_l( tmp32 ); + tmp32 = L_shl( tmp32, i ); /*Q31, s-i+15*/ + crest = extract_h( tmp32 ); + *crest_exp = add( sub( s, i ), 15 ); + move16(); + /* limit crest factor to a lower bound of 1, may overflow */ + BASOP_SATURATE_WARNING_OFF_EVS + tmp = shl_sat( -1, sub( 15, *crest_exp ) ); /* build negative threshold */ + tmp = add_sat( crest, tmp ); + BASOP_SATURATE_WARNING_ON_EVS + if ( tmp < 0 ) + { + crest = 1; + move16(); + } + if ( tmp < 0 ) + { + *crest_exp = 15; + move16(); + } + } + + return crest; +} + /************************************************************************* calculates spectral flatness measurment **************************************************************************/ @@ -799,16 +878,10 @@ Word16 IGF_getSFM( /**< out: Q15| SFM value Word16 invDenom_exp, numf_exp; Word16 numf; Word32 SFM32; - Word32 L_c; Word16 invDenom, SFM; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; move32(); move32(); -#endif - L_c = 0; move32(); num = 0; move32(); @@ -819,6 +892,7 @@ Word16 IGF_getSFM( /**< out: Q15| SFM value SFM = 32767 /*1.0f Q15*/; move16(); + Word64 W_denom = W_deposit32_l( denom ); FOR( i = start; i < stop; i++ ) { /*ln(x * 2^-Qx * 2^xExp) = ln(x) - Qx + xExp*/ @@ -838,15 +912,10 @@ Word16 IGF_getSFM( /**< out: Q15| SFM value n = s_max( 0, n ); num = L_add( num, L_deposit_l( n ) ); /*Q0*/ - Carry = 0; - move32(); - denom = L_add_co( energy[i], denom, &Carry, &Overflow ); - Overflow = 0; - move32(); - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); + W_denom = W_add( W_deposit32_l( energy[i] ), W_denom ); } - denom = norm_llQ31( L_c, denom, &denom_exp ); /*Q31*/ + denom = w_norm_llQ31( W_denom, &denom_exp ); /*Q31*/ denom_exp = add( denom_exp, *energy_exp ); /* calculate SFM only if signal is present */ @@ -895,6 +964,103 @@ Word16 IGF_getSFM( /**< out: Q15| SFM value return SFM /*Q15*/; } +/************************************************************************* +calculates spectral flatness measurment +**************************************************************************/ +Word16 IGF_getSFM_ivas_fx( /**< out: Q15| SFM value */ + Word16 *SFM_exp, /**< out: | exponent of SFM Factor */ + const Word32 *energy, /**< in: Q31| energies */ + const Word16 *energy_exp, /**< in: | exponent of energies */ + const Word16 start, /**< in: Q0 | start subband index */ + const Word16 stop /**< in: Q0 | stop subband index */ +) +{ + Word16 n, i, s; + Word32 num; + Word32 denom; + Word16 denom_exp; + Word16 invDenom_exp, numf_exp; + Word16 numf; + Word32 SFM32; + Word16 invDenom, SFM; + + num = 0; + move32(); + denom = 65536; // 1.f in Q16 + denom_exp = 15; + *SFM_exp = 0; + move16(); + SFM = 32767 /*1.0f Q15*/; + move16(); + + FOR( i = start; i < stop; i++ ) + { + /*ln(x * 2^-Qx * 2^xExp) = ln(x) - Qx + xExp*/ + + /* n = sub(sub(31,norm_l(tmp32)),1); */ /*<- ld */ + /* n = sub(n,31); */ /*<- -Qx */ + /* n = add(n,*energy_exp); */ /*<- +xExp */ + + n = sub( sub( energy_exp[i], norm_l( energy[i] ) ), 1 ); /*<-- short form*/ + + if ( energy[i] == 0 ) /*special case: energy is zero*/ + { + n = 0; + move16(); + } + + n = s_max( 0, n ); + num = L_add( num, L_deposit_l( n ) ); /*Q0*/ + + denom = BASOP_Util_Add_Mant32Exp( energy[i], energy_exp[i], denom, denom_exp, &denom_exp ); + } + + /* calculate SFM only if signal is present */ + IF( denom != 0 ) + { + /*numf = (float)num / (float)(stop - start);*/ + numf = BASOP_Util_Divide3216_Scale( num, /*Q0*/ + sub( stop, start ), /*Q0*/ + &s ); /*Q-1 s*/ + numf_exp = add( s, 16 ); /*-> numf Q15 numf_exp*/ + /*denom /= (float)(stop - start);*/ + /*return ((float)pow(2.0, numf + 0.5f) / denom);*/ + + /*SFM= ((float)pow(2.0, numf + 0.5f) * invDenom);*/ + invDenom = BASOP_Util_Divide3232_uu_1616_Scale( L_deposit_l( sub( stop, start ) ) /*Q0*/, + denom /*Q31, denom_exp*/, + &s ); /*Q-16, s-denom_exp*/ + invDenom_exp = add( sub( s, denom_exp ), 31 ); /*invDenom: Q15, invDenom_exp*/ + + /*add .5f to numf*/ + SFM32 = L_add( L_shl( L_deposit_l( numf ), numf_exp ) /*16Q15*/, 16384l /*.5f Q15*/ ); /*16Q15*/ + s = norm_l( SFM32 ); + SFM32 = L_shl( SFM32, s ); + s = sub( 16, s ); /*SFM32(numf) is Q31 now*/ + + /*do the pow2 and the mult*/ + SFM32 = BASOP_util_Pow2( SFM32, s, &s ); + SFM32 = Mpy_32_16_1( SFM32, invDenom ); + *SFM_exp = add( s, invDenom_exp ); + + /*Transform to Q15*/ + s = norm_l( SFM32 ); + SFM = round_fx_sat( L_shl_sat( SFM32, s ) ); + *SFM_exp = sub( *SFM_exp, s ); + move16(); + /**SFM_exp = s_min(*SFM_exp, 0);*/ + IF( *SFM_exp > 0 ) + { + *SFM_exp = 0; + move16(); + SFM = 32767 /*1.0f Q15*/; + move16(); + } + } + + return SFM /*Q15*/; +} + /**********************************************************************/ /* calculates the IGF whitening levels by SFM and crest **************************************************************************/ @@ -1054,15 +1220,20 @@ static void IGF_Whitening( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in } hPrivateData->wasTransient = isTransient; move16(); + + return; } + /**********************************************************************/ /* write whitening levels into bitstream **************************************************************************/ -static void IGF_WriteWhiteningTile_fx( /**< out: Q0 | number of bits written */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 *pBitOffset, /**< in: | ptr to bitOffset counter */ - Word16 whiteningLevel /**< in: Q0 | whitening levels to write */ + +/**< out: Q0 | number of bits written */ +static void IGF_WriteWhiteningTile_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 *pBitOffset, /**< in: | ptr to bitOffset counter */ + Word16 whiteningLevel /**< in: Q0 | whitening levels to write */ ) { IF( EQ_32( whiteningLevel, IGF_WHITENING_MID ) ) @@ -1081,6 +1252,8 @@ static void IGF_WriteWhiteningTile_fx( /**< ou IGF_write_bits( hBstr, pBitOffset, 1, 1 ); } } + + return; } /**********************************************************************/ /* @@ -1356,7 +1529,7 @@ void IGFEncSetMode_fx( * insert a bit into packed octet *-------------------------------------------------------------------*/ -static void pack_bit_ivas_fx( +static void pack_bit_fx( const Word16 bit, /* i : bit to be packed */ UWord8 **pt, /* i/o: pointer to octet array into which bit will be placed */ UWord8 *omask /* i/o: output mask to indicate where in the octet the bit is to be written */ @@ -1429,7 +1602,7 @@ void IGFEncConcatenateBitstream_ivas_fx( const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* write bit by bit */ FOR( k = 0; k < ind_list[i].nb_bits; k++ ) { - pack_bit_ivas_fx( extract_l( L_and( ind_list[i].value, imask ) ), &pFrame, &omask ); + pack_bit_fx( extract_l( L_and( ind_list[i].value, imask ) ), &pFrame, &omask ); imask = L_shr( imask, 1 ); } nb_bits_written = add( nb_bits_written, ind_list[i].nb_bits ); @@ -1450,55 +1623,15 @@ hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, nb_bits_written ); return; } -/**********************************************************************/ /* - IGF bitsream concatenation for TCX10 modes - **************************************************************************/ -void IGFEncConcatenateBitstream_fx( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ - Word16 bsBits, /**< in: Q0 | number of IGF bits written to list of indices */ - Word16 *next_ind, /**< in/out: | pointer to actual bit indice */ - Word16 *nb_bits, /**< in/out: | total number of bits already written */ - Indice *ind_list_fx /**< in: | pointer to list of indices */ -) -{ - IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; - - hPrivateData = &hInstance->igfData; - *next_ind = *next_ind - bsBits; - move16(); - indices_to_serial_generic( - &ind_list_fx[*next_ind], - bsBits, - hPrivateData->igfBitstream, - &hPrivateData->igfBitstreamBits ); - - *nb_bits = sub( *nb_bits, bsBits ); - move16(); - return; -} - -/**********************************************************************/ /* - IGF reset bitsream bit counter for TCX10 modes - **************************************************************************/ -void IGFEncResetTCX10BitCounter_fx( const IGF_ENC_INSTANCE_HANDLE hInstance /**< in: | instance handle of IGF Encoder */ -) -{ - IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; - - hPrivateData = &hInstance->igfData; - hPrivateData->igfBitstreamBits = 0; - move16(); - hInstance->infoTotalBitsWritten = 0; - move16(); - return; -} +/**********************************************************************/ /* + IGF write concatenated bitsream for TCX10 modes +**************************************************************************/ -/**********************************************************************/ /* - IGF write concatenated bitsream for TCX10 modes - **************************************************************************/ -Word16 IGFEncWriteConcatenatedBitstream_fx( /**< out: Q0 | total number of bits written */ - const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ - BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +/**< out: Q0 | total number of bits written */ +Word16 IGFEncWriteConcatenatedBitstream_fx( + const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ ) { IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; @@ -1513,13 +1646,13 @@ Word16 IGFEncWriteConcatenatedBitstream_fx( tmp = shr( hPrivateData->igfBitstreamBits, 3 ); FOR( i = 0; i < tmp; i++ ) { - push_next_indice_fx( hBstr, pBitstream[i], 8 ); + push_next_indice( hBstr, pBitstream[i], 8 ); } bitsLeft = s_and( hPrivateData->igfBitstreamBits, 0x7 ); IF( bitsLeft > 0 ) { - push_next_indice_fx( hBstr, shr( pBitstream[i], sub( 8, bitsLeft ) ), bitsLeft ); + push_next_indice( hBstr, shr( pBitstream[i], sub( 8, bitsLeft ) ), bitsLeft ); } return hInstance->infoTotalBitsWritten; @@ -1601,7 +1734,7 @@ void IGFEncApplyMono_fx( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in pPowerSpectrumParameterWhitening, /* i: MDCT^2 + MDST^2 spectrum, or estimate */ PowerSpectrum_e, /* i: exponent of powerSpectrum */ igfGridIdx, /* i: IGF grid index */ - ( st->transientDetection.transientDetector.bIsAttackPresent == 1 ), + ( st->hTranDet->transientDetector.bIsAttackPresent == 1 ), last_core_acelp ); /* i: last frame was acelp indicator */ pPowerSpectrumParameter = NULL; @@ -1658,3 +1791,2602 @@ ivas_error IGF_Reconfig_fx( return error; } + + +#define INV_Log2_10_Q15 9864 /*1/log2(10) in Q15*/ +#define INV_Log2_10_Q12 1233 /*1/log2(10) in Q12*/ +#define INV_Log2_e_Q15 22713 /*1/log2(e) in Q15*/ + + +/*-------------------------------------------------------------------* + * IGF_getCrest_new() + * + * crest factor calculation + *-------------------------------------------------------------------*/ + +/*! r: crest factor */ +static Word16 IGF_getCrest_new_fx( + const Word16 *logSpec, /* i : power spectrum */ + const Word16 start, /* i : start subband index */ + const Word16 stop, /* i : stop subband index */ + Word16 *crest_exp /*Stores the exponent of the result(return value)*/ +) +{ + Word16 i; + Word16 x; + Word32 x_eff; + Word16 x_max; + Word16 exp; + Word16 temp; + Word16 temp_e; + Word16 crest; /*1.0f in Q15*/ + x_eff = 0; + x_max = 0; + exp = 0; + temp = 0; + crest = 32767; /*1.0f in Q15*/ + move32(); + move16(); + move16(); + move16(); + move16(); + + FOR( i = start; i < stop; i++ ) + { + x = logSpec[i]; + move16(); + x_eff = L_mac0( x_eff, x, x ); + + if ( GT_16( x, x_max ) ) + { + x_max = x; + move16(); + } + } + + x_eff = BASOP_Util_Divide3216_Scale( x_eff, sub( stop, start ), &temp_e ); + temp_e = add( temp_e, 16 ); /*exp += 31 - 15 + 16(because x_eff is word32)*/ + x_eff = L_shr( x_eff, sub( 15, temp_e ) ); + temp_e = 15; + move16(); + temp = Sqrt16( extract_l( x_eff ), &temp_e ); + + test(); + IF( x_eff > 0 && x_max > 0 ) + { + temp = BASOP_Util_Divide1616_Scale( x_max, temp, &exp ); + exp = add( exp, sub( 15, temp_e ) ); + IF( exp < 0 ) + { + temp = shl( temp, exp ); + exp = 0; + move16(); + } + crest = s_max( shl_sat( 1, sub( 15, exp ) ), temp ); + } + *crest_exp = exp; + move16(); + return crest; +} + + +/*-------------------------------------------------------------------* + * IGF_getSFM_new() + * + * calculates spectral flatness measurement + *-------------------------------------------------------------------*/ + +/*! r: SFM value */ +static Word16 IGF_getSFM_new_fx( + const Word32 *powerSpectrum, /* i : power spectrum */ + const Word16 *logSpec, /* i : log of power spectrum */ + const Word16 start, /* i : start subband index */ + const Word16 stop, /* i : stop subband index */ + Word16 *e_ps /*Stores exp related to power spectrum*/ +) +{ + Word16 n; + Word16 i; + Word16 num; + Word32 denom; + Word16 numf; + Word32 tmp; + Word16 sfm; + Word16 sfm_e; + Word16 denom_e; + Word16 numf_e; /*stores exponent for numf*/ + Word16 tmp_e; + + num = 0; + denom = ONE_IN_Q30; + denom_e = 1; + sfm = MAX16B; // Q15 + move16(); + move32(); + move16(); + move16(); + + FOR( i = start; i < stop; i++ ) + { + tmp = powerSpectrum[i]; + n = logSpec[i /*-start*/]; + move32(); + move16(); + num = add( num, n ); + denom = BASOP_Util_Add_Mant32Exp( tmp, e_ps[i], denom, denom_e, &denom_e ); + } + + numf = BASOP_Util_Divide1616_Scale( num, sub( stop, start ), &numf_e ); + denom = BASOP_Util_Divide3216_Scale( denom, sub( stop, start ), &tmp_e ); + denom_e = add( add( denom_e, tmp_e ), 1 ); /*denom_e+tmp_e-15 +16(because type of denom is word32)*/ + + IF( denom != 0 ) + { + tmp = BASOP_util_Pow2( L_add( numf, shl_sat( 1, sub( 14, numf_e ) ) ), add( 16, numf_e ), &tmp_e ); + sfm = BASOP_Util_Divide3232_Scale( tmp, denom, &sfm_e ); + sfm_e = add( sfm_e, sub( tmp_e, denom_e ) ); + sfm = shl_sat( extract_l( L_min( sfm, L_shl_sat( 1, sub( 15, sfm_e ) ) ) ), sfm_e ); + } + + return sfm; +} +/*-------------------------------------------------------------------* + * IGF_getTilt() + * + * calculates spectral tilt + *-------------------------------------------------------------------*/ + +/*! r: spectral tilt value */ + +/*-------------------------------------------------------------------* + * IGF_getTNR() + * + * calculates tonal-to-noise ratio + *-------------------------------------------------------------------*/ + +/*! r: spectral tilt value */ +/* Returns value with exponent as 9 and Q as 22*/ + +static Word32 IGF_getTNR_ivas_fx( + const Word32 *powerSpectrum, /* i : energies */ + const Word16 start, /* i : start subband index */ + const Word16 stop, /* i : stop subband index */ + const Word16 adap, /* i : SFB width adaptation */ + Word16 *e_ps, /*Stores exponent for powerSpectrum*/ + Word16 e_adap /*Stores exponent for adap*/ +) +{ + Word16 i; + Word16 width; + Word32 avg; + Word32 tonal; + Word16 tonal_e; /* holds exp for tonal*/ + Word32 noise; + Word16 noise_e; /* holds exp for noise*/ + Word32 tonalToNoise; + Word32 rootSpec[300]; + Word16 rootSpec_e[300]; /*rootSpec_e[i] holds exp for rootSpec[i]*/ + Word16 avg_e; /* holds exp for avg*/ + Word16 tmp_e; + avg = 0; + tonal = 0; + noise = EPSILON_FX; + tonal_e = 0; + noise_e = 0; + avg_e = 0; + tmp_e = 0; + move32(); + move32(); + move32(); + move16(); + move16(); + move16(); + move16(); + + set32_fx( rootSpec, 0, 300 ); + set16_fx( rootSpec_e, 0, 300 ); + + width = sub( stop, start ); + FOR( i = start; i < stop; i++ ) + { + rootSpec_e[( i - start )] = e_ps[i]; + move16(); + rootSpec[( i - start )] = Sqrt32( powerSpectrum[i], &rootSpec_e[( i - start )] ); /*rootSpec[i - start] = sqrtf( powerSpectrum[i] );*/ + move32(); + avg = BASOP_Util_Add_Mant32Exp( avg, avg_e, rootSpec[( i - start )], rootSpec_e[( i - start )], &avg_e ); /*avg += rootSpec[i - start];resultant exponent is avg_e*/ + } + avg = BASOP_Util_Divide3216_Scale( avg, width, &tmp_e ); /*avg /= width;*/ + avg_e = add( 16, sub( add( avg_e, tmp_e ), 15 ) ); + + FOR( i = start; i < stop; i++ ) + { + Word16 normSpec_e; /*stores resultant exponent for normSpec*/ + Word16 normSpec = BASOP_Util_Divide3232_Scale( rootSpec[i - start], avg, &normSpec_e ); /*rootSpec[i - start] / avg;*/ + normSpec_e = add( normSpec_e, sub( rootSpec_e[i - start], avg_e ) ); + IF( GT_32( normSpec, L_add_sat( L_shl_sat( 1, sub( 15, normSpec_e ) ), L_shl_sat( adap, sub( e_adap, normSpec_e ) ) ) ) ) + { + tonal = BASOP_Util_Add_Mant32Exp( tonal, tonal_e, rootSpec[( i - start )], rootSpec_e[( i - start )], &tonal_e ); /*tonal += rootSpec[i - start];*/ + } + ELSE IF( LT_32( normSpec, L_shl_sat( 1, sub( 15, normSpec_e ) ) ) ) + { + noise = BASOP_Util_Add_Mant32Exp( noise, noise_e, rootSpec[( i - start )], rootSpec_e[( i - start )], &noise_e ); /*noise += rootSpec[i - start];*/ + } + } + + /*tonalToNoise = 20.f * log10f( max( 1e-018f, tonal / noise ) )*/ + IF( noise == 0 ) // To handle condition if denom = 0 + { + tonalToNoise = imult3216( L_shr( L_add( L_shl( 18 /* log10f(1e-018f) */, Q25 ), Mpy_32_16_1( L_add( BASOP_Util_Log2( tonal ), L_shl( tonal_e, Q25 ) ) /*Q25*/, INV_Log2_10_Q15 ) /*25+15-15*/ ), 3 ) /*Q22*/, 20 ); + } + ELSE + { + Word16 temp = BASOP_Util_Divide3232_Scale( tonal, noise, &tmp_e ); /*tonal / noise*/ + tmp_e = add( tmp_e, sub( tonal_e, noise_e ) ); + IF( GE_16( temp, 1 ) ) + { + tonalToNoise = imult3216( Mult_32_16( L_add( BASOP_Util_Log2( temp ), L_shl( add( 16, tmp_e ), Q25 ) ) /*Q25*/, INV_Log2_10_Q12 ) /*25+12-15*/, 20 ); /*Q22*/ + } + ELSE + { + tonalToNoise = -1509949440; /*-360.f Q22*/ + move32(); + } + } + + return tonalToNoise; +} + +/*-------------------------------------------------------------------* + * IGF_CalculateEnvelope() + * + * envelope estimation + *-------------------------------------------------------------------*/ + +static void IGF_CalculateEnvelope_ivas_fx( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + Word32 *pMDCTSpectrum_fx, /* i : MDCT spectrum */ + Word16 e_mdct, /* i : exp of MDCT spectrum */ + Word32 *pPowerSpectrum_fx, /* i : MDCT^2 + MDST^2 spectrum, or estimate */ + Word16 *e_ps, /* i : exp of power spectrum */ + const Word16 igfGridIdx, /* i : IGF grid index */ + const Word16 isTransient, /* i : flag indicating if transient is detected */ + const Word16 last_core_acelp, /* i : indicator if last frame was ACELP core */ + const Word16 element_mode, /* i : IVAS element_mode */ + const Word16 att /* i : attenuation */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + Word16 *swb_offset; + Word16 sfb; /* this is the actual scalefactor band */ + Word16 width; /* this is width in subbands of the actual scalefactor band */ + Word16 tile_idx; + Word16 strt_cpy; + Word32 gain; /* the gain which has to be applied to the source tile to get the destination energy */ + Word16 sb; + Word32 sfbEnergyR; + Word32 sfbEnergyC; /* the energy of the destination region of the tile */ + Word32 sfbEnergyTileR; + Word32 sfbEnergyTileC; /* the energy of the destination region of the tile */ + Word16 tmp, x, y; + Word16 mean_x_fx, mean_y_fx; + Word32 mean_xy_fx, mean_x2_fx; + Word16 tmp_tb; + Word16 tmp_sb; + Word16 sfbCnt; + Word16 sfm; + Word16 crest; + Word16 temp; + Word16 mean_x_e, mean_y_e; /*Stores exponent for mean_x and mean_y respectively*/ + Word16 mean_xy_e, mean_x2_e; /*stores exponent for mean_xy and mean_x2 respectively*/ + Word16 sfbEnergyTileR_e; /*Exponent for sfbEnergyTileR*/ + Word16 sfbEnergyTileC_e; /*Exponent for sfbEnergyTileC*/ + Word16 sfbEnergyC_e; /*Exponent for sfbEnergyC*/ + Word16 sfbEnergyR_e; + Word16 gain_e; /*exponent for gain*/ + Word16 tmp_tb_e; /*Stores exponent for tmp_tb*/ + Word16 tmp_sb_e; /*stores exponent for tmp_sb*/ + Word16 crest_exp; /*Stores the exponent of the result(return value)*/ + Word16 sfm_exp; /*stores exponent for ouput from sfm*/ + Word16 tmp_e; + + hPrivateData = &hIGFEnc->igfData; + hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx]; + swb_offset = hGrid->swb_offset; + + IF( element_mode > EVS_MONO ) + { + IF( igfGridIdx != IGF_GRID_LB_NORM ) + { + FOR( sfbCnt = 0; sfbCnt < sub( hGrid->sfbWrap[hGrid->nTiles], hGrid->sfbWrap[0] ); sfbCnt++ ) + { + /* reset filter */ + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_FIR_TB_e[sfbCnt] + hPrivateData->prevSFB_FIR_TB_e[sfbCnt] = 0; + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_IIR_TB_e[sfbCnt] + hPrivateData->prevSFB_IIR_TB_e[sfbCnt] = 0; + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_FIR_SB_e[sfbCnt] + hPrivateData->prevSFB_FIR_SB_e[sfbCnt] = 0; + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_IIR_SB_e[sfbCnt] + hPrivateData->prevSFB_IIR_SB_e[sfbCnt] = 0; + hPrivateData->prevDampingFactor_IIR_fx[sfbCnt] = MIN16B; /* -1.f in Q15*/ + hPrivateData->prevDampingFactor_IIR_e[sfbCnt] = 0; + hPrivateData->dampingFactorSmoothing[sfbCnt] = 2; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + } + } + + IF( pPowerSpectrum_fx ) + { + FOR( sb = hGrid->sbWrap[0]; sb < swb_offset[hGrid->sfbWrap[hGrid->nTiles]]; sb++ ) + { + IF( LT_32( 1, pPowerSpectrum_fx[sb] ) ) + { + hPrivateData->logSpec[sb] = s_max( 0, extract_l( W_extract_l( W_shr( W_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), W_shl( e_ps[sb], Q25 ) ), Q25 ) ) ) ); + move16(); + } + ELSE + { + hPrivateData->logSpec[sb] = 0; + move16(); + } + } + } + + FOR( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ ) + { + strt_cpy = hGrid->sbWrap[tile_idx]; + move16(); + + FOR( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) + { + width = sub( swb_offset[sfb + 1], swb_offset[sfb] ); + sfbEnergyTileR = EPSILON_FIX; + sfbEnergyTileC = EPSILON_FIX; + sfbEnergyC = EPSILON_FX; + sfbEnergyTileR_e = 0; + sfbEnergyTileC_e = 0; + sfbEnergyC_e = 0; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + + IF( pPowerSpectrum_fx != NULL ) + { + tmp = strt_cpy; + move16(); + FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ ) + { + Word16 shift = norm_l( pPowerSpectrum_fx[sb] ); + sfbEnergyC = BASOP_Util_Add_Mant32Exp( sfbEnergyC, sfbEnergyC_e, L_shl( pPowerSpectrum_fx[sb], shift ), sub( e_ps[sb], shift ), &sfbEnergyC_e ); + // sfbEnergyTileR = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR, sfbEnergyTileR_e, Mult_32_32( pMDCTSpectrum_fx[strt_cpy], pMDCTSpectrum_fx[strt_cpy] ), shl( e_mdct, 1 ), &sfbEnergyTileR_e ); + Word64 tmp64 = W_mult_32_32( pMDCTSpectrum_fx[strt_cpy], pMDCTSpectrum_fx[strt_cpy] ); + Word16 tmp64_e = W_norm( tmp64 ); + tmp64 = W_shl( tmp64, tmp64_e ); + + sfbEnergyTileR = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR, sfbEnergyTileR_e, W_extract_h( tmp64 ), shl( e_mdct, 1 ) - tmp64_e, &sfbEnergyTileR_e ); + shift = norm_l( pPowerSpectrum_fx[strt_cpy] ); + sfbEnergyTileC = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC, sfbEnergyTileC_e, L_shl( pPowerSpectrum_fx[strt_cpy], shift ), sub( e_ps[strt_cpy], shift ), &sfbEnergyTileC_e ); + + strt_cpy = add( strt_cpy, 1 ); + } + + sfbEnergyTileR = L_deposit_h( BASOP_Util_Divide3232_Scale( sfbEnergyTileR, width, &tmp_e ) ); + sfbEnergyTileR_e = add( sub( sfbEnergyTileR_e, Q31 ), tmp_e ); + + IF( sfbEnergyTileR == 0 ) + { + sfbEnergyTileR = EPSILON_FX; + sfbEnergyTileR_e = 0; + move32(); + move16(); + } + IF( sfbEnergyC == 0 ) + { + sfbEnergyC = EPSILON_FX; + sfbEnergyC_e = 0; + move32(); + move16(); + } + IF( sfbEnergyTileC == 0 ) + { + sfbEnergyTileC = EPSILON_FX; + sfbEnergyTileC_e = 0; + temp = BASOP_Util_Divide3232_Scale( sfbEnergyC, sfbEnergyTileC, &tmp_e ); + tmp_e = add( tmp_e, sub( sfbEnergyC_e, sfbEnergyTileC_e ) ); + move32(); + move16(); + } + ELSE + { + /*gain = (float) ( sfbEnergyTileR * ( sfbEnergyC / sfbEnergyTileC ) );*/ + temp = BASOP_Util_Divide3232_Scale( sfbEnergyC, sfbEnergyTileC, &tmp_e ); + tmp_e = add( tmp_e, sub( sfbEnergyC_e, sfbEnergyTileC_e ) ); + } + + gain = Mult_32_16( sfbEnergyTileR, temp ); // gain_e + gain_e = add( tmp_e, sfbEnergyTileR_e ); + + IF( element_mode > EVS_MONO ) + { + test(); + IF( !isTransient ) + { + Word16 diffSFM; + Word16 shiftedSFM = 0; + Word16 shiftedSFM_e = 0; + move16(); + move16(); + + // tmp_tb = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1] ) / IGF_getCrest_new( hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1] ); + sfm = IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1], e_ps ); + sfm_exp = 0; + move16(); + crest = IGF_getCrest_new_fx( hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1], &crest_exp ); + tmp_tb = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); // tmp_tb_e + tmp_tb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); + + // tmp_sb = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, tmp, strt_cpy ) / IGF_getCrest_new( hPrivateData->logSpec, tmp, strt_cpy ); + sfm = IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, tmp, strt_cpy, e_ps ); + crest = IGF_getCrest_new_fx( hPrivateData->logSpec, tmp, strt_cpy, &crest_exp ); + tmp_sb = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); // tmp_sb_e + tmp_sb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); + + test(); + IF( last_core_acelp || hPrivateData->wasTransient ) + { + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = tmp_tb; /*Exponent for hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] : hPrivateData->prevSFB_FIR_TB_e[sfb] and hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] : hPrivateData->prevSFB_IIR_TB_e[sfb] */ + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = tmp_sb; /*Exponent for hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] : hPrivateData->prevSFB_FIR_SB_e[sfb] and hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] : hPrivateData->prevSFB_IIR_SB_e[sfb] */ + hPrivateData->prevSFB_FIR_TB_e[sfb] = hPrivateData->prevSFB_IIR_TB_e[sfb] = tmp_tb_e; + hPrivateData->prevSFB_FIR_SB_e[sfb] = hPrivateData->prevSFB_IIR_SB_e[sfb] = tmp_sb_e; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + + tmp_tb = shr( tmp_tb, 2 ); /*taking 2 guard bits so it's exponent tmp_sb_e=+2*/ + tmp_sb = shr( tmp_sb, 2 ); /*taking 2 guard bits so it's exponent tmp_tb_e=+2 */ + tmp_sb_e = add( tmp_sb_e, 2 ); + tmp_tb_e = add( tmp_tb_e, 2 ); + + Word16 tmp0, tmp2, tmp3, tmp4; + Word16 tmp0_e, tmp2_e, tmp3_e, tmp4_e; + tmp0 = shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], 2 ); + tmp0_e = add( hPrivateData->prevSFB_FIR_TB_e[sfb], 2 ); + move16(); + tmp2 = shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], 2 ); + tmp2_e = add( hPrivateData->prevSFB_IIR_TB_e[sfb], 2 ); + move16(); + tmp3 = shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], 2 ); + tmp3_e = add( hPrivateData->prevSFB_FIR_SB_e[sfb], 2 ); + move16(); + tmp4 = shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], 2 ); + tmp4_e = add( hPrivateData->prevSFB_IIR_SB_e[sfb], 2 ); + move16(); + Word16 x1, x2; + + Word16 x1_e = BASOP_Util_Add_MantExp( tmp0, tmp0_e, tmp2, tmp2_e - 1, &x1 ); + Word16 x2_e = BASOP_Util_Add_MantExp( tmp3, tmp3_e, tmp4, tmp4_e - 1, &x2 ); + hPrivateData->sfb_tb_e[sfb] = BASOP_Util_Add_MantExp( tmp_tb, tmp_tb_e, x1, x1_e, &hPrivateData->SFM_tb_fx[sfb] ); // hPrivateData->sfb_sb_e[sfb] + move16(); + BASOP_Util_Add_MantExp( 22118, 2, negate( hPrivateData->SFM_tb_fx[sfb] ), hPrivateData->sfb_tb_e[sfb], &tmp ); + + IF( tmp < 0 ) + { + hPrivateData->sfb_tb_e[sfb] = 2; + hPrivateData->SFM_tb_fx[sfb] = 22118; + move16(); + move16(); + } + + hPrivateData->sfb_sb_e[sfb] = BASOP_Util_Add_MantExp( tmp_sb, tmp_sb_e, x2, x2_e, &hPrivateData->SFM_sb_fx[sfb] ); // hPrivateData->sfb_tb_e[sfb] + move16(); + BASOP_Util_Add_MantExp( 22118, 2, negate( hPrivateData->SFM_sb_fx[sfb] ), hPrivateData->sfb_sb_e[sfb], &tmp ); + + IF( tmp < 0 ) + { + hPrivateData->sfb_sb_e[sfb] = 2; + hPrivateData->SFM_sb_fx[sfb] = 22118; + move16(); + move16(); + } + + BASOP_Util_Add_MantExp( hPrivateData->SFM_sb_fx[sfb], hPrivateData->sfb_sb_e[sfb], negate( hPrivateData->SFM_tb_fx[sfb] ), hPrivateData->sfb_tb_e[sfb], &diffSFM ); + + test(); + IF( diffSFM > 0 && LT_32( hPrivateData->SFM_tb_fx[sfb], L_shr( 3277 /*0.1 Q15*/, hPrivateData->sfb_tb_e[sfb] ) ) ) /* check whether target SFB is more tonal than source SFB */ + { + Word16 currDampingFactor, dampingFactor; + Word16 slope, threshold; + Word16 alpha; + Word16 slope_e, threshold_e, currDampingFactor_e, dampingFactor_e, alpha_e; + + /* calculate spectral tilt to detect sudden drops (or increases) in energy in the current SFB */ + // slope = IGF_getTilt_fx( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1], e_ps, &slope_e ); + + x = 1; + mean_x_fx = mean_y_fx = 0; + Word32 mean_y_fx_tmp = 0; + move32(); + mean_xy_fx = mean_x2_fx = 0; + mean_x_e = 15; + mean_xy_e = mean_y_e = mean_x2_e = 31; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + + FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ ) + { + mean_x_fx = add( mean_x_fx, x ); /*Q0*/ + mean_x2_fx = L_add( mean_x2_fx, L_mult0( x, x ) ); /*Q0*/ + + /*y = 20.f * log10f( max( 1.f, powerSpectrum[i] ) );*/ + IF( LE_64( W_deposit32_l( pPowerSpectrum_fx[sb] ), W_shl( 1, ( sub( 31, e_ps[sb] ) ) ) ) ) + { + y = 0; + move16(); + } + ELSE + { + y = imult1616( 20, extract_l( L_shr( Mult_32_16( ( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( e_ps[sb], Q25 ) ) ), INV_Log2_10_Q15 ), Q25 ) ) ); /*Q0*/ + } + mean_y_fx_tmp = L_mac0( mean_y_fx_tmp, y, 1 ); /*Q0*/ + mean_xy_fx = L_add( mean_xy_fx, L_mult0( y, x ) ); /*Q0*/ + + x = add( x, 1 ); + } + mean_y_fx = BASOP_Util_Divide3216_Scale( mean_y_fx_tmp, width, &tmp_e ); /* mean_y_e*/ + + mean_y_e = add( mean_y_e, sub( tmp_e, 15 ) ); + mean_x_fx = BASOP_Util_Divide1616_Scale( mean_x_fx, width, &tmp_e ); /* mean_x_e*/ + mean_x_e = add( mean_x_e, sub( tmp_e, 15 ) ); + mean_xy_fx = BASOP_Util_Divide3216_Scale( mean_xy_fx, width, &tmp_e ); /* mean_xy_e*/ + mean_xy_e = add( mean_xy_e, sub( tmp_e, 15 ) ); + mean_x2_fx = BASOP_Util_Divide3216_Scale( mean_x2_fx, width, &tmp_e ); /* mean_x2_e*/ + mean_x2_e = add( mean_x2_e, sub( tmp_e, 15 ) ); + + /*slope = ( mean_xy - mean_x * mean_y ) / ( mean_x2 - mean_x * mean_x );*/ + slope = BASOP_Util_Divide3232_Scale( ( L_sub( mean_xy_fx, L_shl( mult( mean_x_fx, mean_y_fx ), sub( add( mean_x_e, mean_y_e ), mean_xy_e ) ) ) ), ( L_sub( mean_x2_fx, L_shl( mult( mean_x_fx, mean_x_fx ), sub( add( mean_x_e, mean_x_e ), mean_x2_e ) ) ) ), &slope_e ); + slope_e = add( slope_e, sub( mean_xy_e, mean_x2_e ) ); + + /* determine whether strong tilt is due to a step in the spectrum (e.g. band limitation, no damping) + or a tonal component close the band border (apply damping) by calculating SFM for a shift of 1/2 SFB width*/ + threshold = BASOP_Util_Divide1616_Scale( 60, width, &threshold_e ); + + test(); + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope, add( slope_e, 16 ), negate( threshold ), add( threshold_e, 16 ) ), -1 ) ) + { + Word16 shift = shr( width, 1 ); + sfm = IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift, e_ps ); + crest = IGF_getCrest_new_fx( hPrivateData->logSpec, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift, &crest_exp ); + shiftedSFM = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); + } + ELSE IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope, add( slope_e, 16 ), threshold, add( threshold_e, 16 ) ), 1 ) && ( NE_16( sfb, sub( hGrid->sfbWrap[hGrid->nTiles], 1 ) ) ) ) + { + Word16 shift = shr( width, 1 ); + shiftedSFM = BASOP_Util_Divide1616_Scale( IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift, e_ps ), IGF_getCrest_new_fx( hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift, &crest_exp ), &tmp_e ); + sfm = IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift, e_ps ); + crest = IGF_getCrest_new_fx( hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift, &crest_exp ); + shiftedSFM = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); + } + shiftedSFM_e = add( shiftedSFM_e, sub( sfm_exp, crest_exp ) ); + + IF( GT_32( shiftedSFM, L_shl( 1311 /*0.04f Q15*/, negate( shiftedSFM_e ) ) ) ) + { + currDampingFactor = 32767; /*1.f Q15*/ + currDampingFactor_e = 0; + move16(); + move16(); + } + ELSE + { + // alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f ); + temp = BASOP_Util_Divide1616_Scale( 320, swb_offset[sfb + 1], &alpha_e ); + alpha = extract_l( L_min( temp, L_shl( 20480 /*1.25 Q14*/, sub( 1, alpha_e ) ) ) ); // alpha_e + + // currDampingFactor = expf( 1.25f * alpha * logf( hPrivateData->SFM_tb[sfb] / hPrivateData->SFM_sb[sfb] ) ); + temp = BASOP_Util_Divide1616_Scale( hPrivateData->SFM_tb_fx[sfb], hPrivateData->SFM_sb_fx[sfb], &tmp_e ); // tmp_e + tmp_e = add( tmp_e, sub( hPrivateData->sfb_tb_e[sfb], hPrivateData->sfb_sb_e[sfb] ) ); + Word16 temp1 = mult( 20480 /* 1.25f in Q14 */, alpha ); + Word16 tmp1_e = add( 1, alpha_e ); + currDampingFactor = round_fx( BASOP_util_Pow2( Mpy_32_16_1( L_add( BASOP_Util_Log2( temp ), L_shl_sat( add( 16, tmp_e ), 25 ) ), temp1 ), add( tmp1_e, 6 ), &currDampingFactor_e ) ); // currDampingFactor_e + + /* calculate tonal-to-noise ratio and reduce damping for low values*/ + + Word32 tonalToNoise; + Word16 adap; + Word16 adap_e; /*stores exp for adap*/ + Word16 tonalToNoise_e; /*stores exponent for tonalToNoise*/ + tonalToNoise_e = 9; + move16(); + adap = BASOP_Util_Divide1616_Scale( width, 40, &adap_e ); + tonalToNoise = IGF_getTNR_ivas_fx( pPowerSpectrum_fx, swb_offset[sfb], swb_offset[sfb + 1], adap, e_ps, adap_e ); /*Q22*/ + + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tonalToNoise, tonalToNoise_e, L_add( L_shl( 10, sub( 15, adap_e ) ), adap ), add( 16, adap_e ) ), -1 ) ) + { + // currDampingFactor += 0.03f * ( ( 10 + adap ) - tonalToNoise ); + Word32 temp2 = BASOP_Util_Add_Mant32Exp( L_add( L_shl( 10, sub( 15, adap_e ) ) /*exp:adap_e*/, adap ), add( adap_e, 16 ), L_negate( tonalToNoise ), tonalToNoise_e, &tmp_e ); // tmp_e + currDampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor, currDampingFactor_e, extract_l( Mult_32_32( 983 /*0.03f Q15*/, temp2 ) ), tmp_e, &currDampingFactor ); // currDampingFactor_e + } + } + + Word32 L_tmp = hPrivateData->prevDampingFactor_IIR_fx[sfb]; + move32(); + L_tmp = L_shl( L_tmp, hPrivateData->prevDampingFactor_IIR_e[sfb] ); + test(); + test(); + IF( last_core_acelp || hPrivateData->wasTransient || EQ_32( L_tmp, MIN16B ) ) + { + tmp = BASOP_Util_Cmp_Mant32Exp( currDampingFactor, currDampingFactor_e, 3277 /* 0.1f in Q15 */, 0 ); + IF( tmp >= 0 ) + { + hPrivateData->prevDampingFactor_IIR_fx[sfb] = currDampingFactor; + hPrivateData->prevDampingFactor_IIR_e[sfb] = currDampingFactor_e; + move16(); + move16(); + } + ELSE + { + hPrivateData->prevDampingFactor_IIR_fx[sfb] = 3277; /* 0.1 in Q15 */ + hPrivateData->prevDampingFactor_IIR_e[sfb] = 0; + move16(); + move16(); + } + } + IF( last_core_acelp ) + { + hPrivateData->dampingFactorSmoothing[sfb] = 2; + move16(); + } + + dampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor, currDampingFactor_e, hPrivateData->prevDampingFactor_IIR_fx[sfb], hPrivateData->prevDampingFactor_IIR_e[sfb], &dampingFactor ); // dampingFactor_e + dampingFactor = shr( dampingFactor, 1 ); + + gain = Mult_32_16( gain, shl_sat( extract_l( L_min( L_add( dampingFactor, Mult_32_16( L_shl( hPrivateData->dampingFactorSmoothing[sfb], sub( 15, dampingFactor_e ) ) /*Q:15-dampingFactor_e*/, 3277 /*0.1f Q15*/ ) /*Q:15-dampingFactor_e*/ ), shl_sat( 1, sub( 15, dampingFactor_e ) ) ) ), dampingFactor_e ) /*Q15*/ ); + + hPrivateData->prevDampingFactor_IIR_fx[sfb] = dampingFactor; + move16(); + hPrivateData->prevDampingFactor_IIR_e[sfb] = dampingFactor_e; + move16(); + if ( hPrivateData->dampingFactorSmoothing[sfb] > 0 ) + { + hPrivateData->dampingFactorSmoothing[sfb] = sub( hPrivateData->dampingFactorSmoothing[sfb], 1 ); + move16(); + } + } + ELSE + { + hPrivateData->prevDampingFactor_IIR_fx[sfb] = MIN16B; // exponent : hPrivateData->prevDampingFactor_IIR_e[sfb] + hPrivateData->prevDampingFactor_IIR_e[sfb] = 0; + hPrivateData->dampingFactorSmoothing[sfb] = 1; + move16(); + move16(); + move16(); + } + + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = tmp_tb; // hPrivateData->prevSFB_FIR_TB_e[sfb] + hPrivateData->prevSFB_FIR_TB_e[sfb] = tmp_tb_e; + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = hPrivateData->SFM_tb_fx[sfb]; // hPrivateData->prevSFB_IIR_TB_e[sfb] + hPrivateData->prevSFB_IIR_TB_e[sfb] = hPrivateData->sfb_tb_e[sfb]; + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = tmp_sb; // hPrivateData->prevSFB_FIR_SB_e[sfb] + hPrivateData->prevSFB_FIR_SB_e[sfb] = tmp_sb_e; + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = hPrivateData->SFM_sb_fx[sfb]; // hPrivateData->prevSFB_IIR_SB_e[sfb] + hPrivateData->prevSFB_IIR_SB_e[sfb] = hPrivateData->sfb_sb_e[sfb]; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + ELSE + { + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0; // hPrivateData->prevSFB_FIR_TB_e[sfb] + hPrivateData->prevSFB_FIR_TB_e[sfb] = 0; + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_TB_e[sfb] + hPrivateData->prevSFB_IIR_TB_e[sfb] = 0; + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_TB_e[sfb] + hPrivateData->prevSFB_FIR_SB_e[sfb] = 0; + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_SB_e[sfb] + hPrivateData->prevSFB_IIR_SB_e[sfb] = 0; + hPrivateData->prevDampingFactor_IIR_fx[sfb] = MIN16B; /* hPrivateData->prevDampingFactor_IIR_e[sfb]*/ + hPrivateData->prevDampingFactor_IIR_e[sfb] = 0; + hPrivateData->dampingFactorSmoothing[sfb] = 2; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + } + } + ELSE + { + tmp_e = e_mdct; + move16(); + sfbEnergyR = add_sat( EPSILON_FX, BASOP_Util_Divide3216_Scale( sum2_32_fx( pMDCTSpectrum_fx + swb_offset[sfb], width, &tmp_e ) /*exp: tmp_e*/, width, &sfbEnergyR_e ) ); // sfbEnergyR_e + sfbEnergyR_e = add( sfbEnergyR_e, add( tmp_e, -15 ) ); + gain = L_shl( sfbEnergyR, 16 ); // gain_e + move32(); + gain_e = sfbEnergyR_e; + + IF( element_mode > EVS_MONO ) + { + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0; // hPrivateData->prevSFB_FIR_TB_e[sfb] + hPrivateData->prevSFB_FIR_TB_e[sfb] = 0; + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_TB_e[sfb] + hPrivateData->prevSFB_IIR_TB_e[sfb] = 0; + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_TB_e[sfb] + hPrivateData->prevSFB_FIR_SB_e[sfb] = 0; + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_SB_e[sfb] + hPrivateData->prevSFB_IIR_SB_e[sfb] = 0; + hPrivateData->prevDampingFactor_IIR_fx[sfb] = MIN16B; /* hPrivateData->prevDampingFactor_IIR_e[sfb]*/ + hPrivateData->prevDampingFactor_IIR_e[sfb] = 0; + hPrivateData->dampingFactorSmoothing[sfb] = 2; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + } + + gain = Mult_32_16( gain, att ); // gain_e + gain_e = add( gain_e, 0 ); + + /*gain=0.5f+log2f(gain)*2+16 becuase 2.885390081777927f=2*1/loge(2) so 2*1/loge(2)*loge(x) can be written as 2*log2(x)*/ + gain = L_add( ONE_IN_Q22, L_add( L_add( L_shr( BASOP_Util_Log2( gain ), 1 ), L_shl( gain_e, Q24 ) ), L_shl( 16, Q23 ) ) ); /*Q23*/ + test(); + test(); + IF( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) ) + { + gain = L_add( gain, ONE_IN_Q21 ); /* better preservation of original HF band energy */ + } + test(); + test(); + IF( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_64000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_64000_CPE ) ) ) + { + gain = L_add( gain, ONE_IN_Q20 ); + } + gain = L_min( gain, 91 << Q23 ); /* 13+15+63, see arithcode encode residual */ + gain = L_max( gain, 0 ); + gain_e = 8; /* stores exponent for gain_fx*/ + move16(); + hPrivateData->igfScfQuantized[sfb] = extract_l( L_shr( gain, Q23 ) ); /*Q0*/ + move16(); + } + } + + return; +} + +/*-------------------------------------------------------------------* + * IGF_CalculateStereoEnvelope_fx() + * + * envelope estimation + + *-------------------------------------------------------------------*/ +static void IGF_CalculateStereoEnvelope_fx( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + const Word32 *pMDCTSpectrum_fx, /* i : MDCT spectrum */ + Word16 pMDCTSpectrum_e, /* i : exponent for pMDCTSpectrum_fx */ + const Word32 *pMDCTSpectrumMsInv_fx, /* i : MDCT spectrum */ + Word16 pMDCTSpectrumMsInv_e, /* i : expontent for pMDCTSpectrumMsInv_fx */ + const Word32 *pPowerSpectrum_fx, /* i : MDCT^2 + MDST^2 spectrum, or estimate */ + Word16 *pPowerSpectrum_e, /* i : exponent for pPowerSpectrum_fx */ + const Word32 *pPowerSpectrumMsInv_fx, /* i : inverse power spectrum */ + Word16 *q_pPowerSpectrumMsInv, /* i : Q for pPowerSpectrumMsInv_fx */ + const Word16 igfGridIdx, /* i : IGF grid index */ + const Word16 coreMsMask[N_MAX], /* i : line wise ms Mask */ + const Word16 isTransient, /* i : flag indicating if transient is detected */ + const Word16 last_core_acelp, /* i : indicator if last frame was ACELP core */ + const Word16 mct_on ) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + Word16 *swb_offset; + Word16 sfb; /* this is the actual scalefactor band */ + Word16 width; /* this is width in subbands of the actual scalefactor band */ + Word16 tile_idx; + Word16 strt_cpy; + Word32 gain_fx; /* the gain which has to be applied to the source tile to get the destination energy */ + Word16 sb; + Word16 sfbEnergyR_fx; + Word32 sfbEnergyC_fx; /* the energy of the destination region of the tile */ + Word32 sfbEnergyTileR_fx; + Word32 sfbEnergyTileC_fx; /* the energy of the destination region of the tile */ + Word16 tmp, x, y; + Word16 mean_x_fx, mean_y_fx; + Word32 mean_xy_fx, mean_x2_fx; + Word16 slope_fx; + Word16 tmp_tb_fx; + Word16 tmp_sb_fx; + Word16 sfbCnt; + Word32 tileSrcSpec_fx[MAX_IGF_SFB_LEN]; + Word16 sfm; + Word16 crest; + Word16 temp; + Word16 mean_x_e, mean_y_e; /*Stores exponent for mean_x and mean_y respectively*/ + Word16 mean_xy_e, mean_x2_e; /*stores exponent for mean_xy and mean_x2 respectively*/ + Word16 tileSrcSpec_e[MAX_IGF_SFB_LEN]; /*Exponent for tileSrcSpec_fx*/ + Word16 sfbEnergyTileR_e; /*Exponent for sfbEnergyTileR_fx*/ + Word16 sfbEnergyTileC_e; /*Exponent for sfbEnergyTileC_fx*/ + Word16 sfbEnergyC_e; /*Exponent for sfbEnergyC_fx*/ + Word16 gain_e; /*exponent for gain_fx*/ + Word16 crest_exp; /*stores exponent for output from crest*/ + Word16 sfm_exp; /*stores exponent for ouput from sfm*/ + Word16 tmp_tb_e; /*Stores exponent for tmp_tb_fx*/ + Word16 tmp_sb_e; /*stores exponent for tmp_sb_fx*/ + Word16 slope_e; /*stores exponent for slope_fx*/ + Word16 sfbEnergyR_e; /*stores exponent for sfbEnergyR*/ + Word16 tmp_e; + Word32 temp_pPowerSpectrumMsInv[N_MAX], length; + Word16 q_temp_pPowerSpectrumMsInv = Q31, i; + move16(); + + IF( pPowerSpectrumMsInv_fx != NULL ) + { + length = N_MAX; + move16(); + if ( mct_on ) + { + length = L_FRAME48k; + move16(); + } + FOR( i = 0; i < length; i++ ) + { + IF( pPowerSpectrumMsInv_fx[i] != 0 ) + { + q_temp_pPowerSpectrumMsInv = s_min( q_temp_pPowerSpectrumMsInv, add( q_pPowerSpectrumMsInv[i], norm_l( pPowerSpectrumMsInv_fx[i] ) ) ); + } + } + FOR( i = 0; i < length; i++ ) + { + temp_pPowerSpectrumMsInv[i] = L_shl( pPowerSpectrumMsInv_fx[i], sub( q_temp_pPowerSpectrumMsInv, q_pPowerSpectrumMsInv[i] ) ); + move32(); + } + } + + hPrivateData = &hIGFEnc->igfData; + hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx]; + swb_offset = hGrid->swb_offset; + move16(); + + IF( igfGridIdx != IGF_GRID_LB_NORM ) + { + FOR( sfbCnt = 0; sfbCnt < sub( hGrid->sfbWrap[hGrid->nTiles], hGrid->sfbWrap[0] ); sfbCnt++ ) + { + /* reset filter */ + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_FIR_TB_e[sfbCnt] + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_IIR_TB_e[sfbCnt] + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_FIR_SB_e[sfbCnt] + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_IIR_SB_e[sfbCnt] + hPrivateData->prevSFB_FIR_TB_e[sfbCnt] = 0; + hPrivateData->prevSFB_IIR_TB_e[sfbCnt] = 0; + hPrivateData->prevSFB_FIR_SB_e[sfbCnt] = 0; + hPrivateData->prevSFB_IIR_SB_e[sfbCnt] = 0; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + } + + IF( pPowerSpectrum_fx ) + { + FOR( sb = hGrid->sbWrap[0]; sb < swb_offset[hGrid->sfbWrap[hGrid->nTiles]]; sb++ ) + { + /*hPrivateData->logSpec[sb] = max( 0, (Word16) ( logf( max( FLT_MIN, pPowerSpectrum[sb] ) ) * INV_LOG_2 ) );*/ + IF( LE_32( 1, pPowerSpectrum_fx[sb] ) ) + { + hPrivateData->logSpec[sb] = s_max( 0, (Word16) L_shr( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( pPowerSpectrum_e[sb], Q25 ) ), 25 ) ); + } + ELSE + { + hPrivateData->logSpec[sb] = 0; /*max(0,-126) is always 0*/ + } + move16(); + } + } + + FOR( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ ) + { + strt_cpy = hGrid->sbWrap[tile_idx]; + move16(); + + FOR( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) + { + width = sub( swb_offset[sfb + 1], swb_offset[sfb] ); + sfbEnergyTileR_fx = EPSILON_FX; + sfbEnergyTileC_fx = EPSILON_FX; + sfbEnergyC_fx = EPSILON_FX; + sfbEnergyTileR_e = 0; + sfbEnergyTileC_e = 0; + sfbEnergyC_e = 0; + move16(); + move16(); + move16(); + move32(); + move32(); + move32(); + IF( pPowerSpectrum_fx ) + { + Word16 final_exp; + Word16 norm_exp; + Word32 scaled_value; + tmp = strt_cpy; + move16(); + + FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ ) + { + IF( NE_16( coreMsMask[sb], coreMsMask[strt_cpy] ) ) + { + sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e[sb], &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ + norm_exp = norm_l( pMDCTSpectrumMsInv_fx[strt_cpy] ); + final_exp = sub( pMDCTSpectrumMsInv_e, norm_exp ); + scaled_value = L_shl( pMDCTSpectrumMsInv_fx[strt_cpy], norm_exp ); + sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( scaled_value, scaled_value ), shl( final_exp, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ + sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrumMsInv_fx[strt_cpy], sub( 31, q_pPowerSpectrumMsInv[strt_cpy] ), &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ + tileSrcSpec_fx[strt_cpy - tmp] = temp_pPowerSpectrumMsInv[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ + tileSrcSpec_e[strt_cpy - tmp] = sub( 31, q_temp_pPowerSpectrumMsInv ); + } + ELSE + { + sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e[sb], &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ + norm_exp = norm_l( pMDCTSpectrum_fx[strt_cpy] ); + final_exp = sub( pMDCTSpectrum_e, norm_exp ); + scaled_value = L_shl( pMDCTSpectrum_fx[strt_cpy], norm_exp ); + sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( scaled_value, scaled_value ), shl( final_exp, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ + sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrum_fx[strt_cpy], pPowerSpectrum_e[strt_cpy], &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ + tileSrcSpec_fx[strt_cpy - tmp] = pPowerSpectrum_fx[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ + tileSrcSpec_e[strt_cpy - tmp] = pPowerSpectrum_e[strt_cpy]; + } + move32(); + move16(); + strt_cpy = add( strt_cpy, 1 ); + } + + sfbEnergyTileR_fx = BASOP_Util_Divide3216_Scale( sfbEnergyTileR_fx, width, &tmp_e ); + sfbEnergyTileR_e = sub( add( sfbEnergyTileR_e, tmp_e ), 15 ); /*stores the resultant exponent for sfbEnergyTileR_fx*/ + + /*gain = (float) ( sfbEnergyTileR * ( sfbEnergyC / sfbEnergyTileC ) );*/ + temp = BASOP_Util_Divide3232_Scale( sfbEnergyC_fx, L_add( sfbEnergyTileC_fx, EPSILON_FX ), &tmp_e ); + gain_e = add( tmp_e, sub( sfbEnergyC_e, sfbEnergyTileC_e ) ); + gain_fx = Mult_32_16( sfbEnergyTileR_fx, temp ); + gain_e = add( 16, add( gain_e, sfbEnergyTileR_e ) ); /*stores the resultant exponent for gain_fx*/ + + IF( !isTransient ) + { + Word16 diffSFM_fx; + Word16 shiftedSFM_fx; + Word16 shiftedSFM_e; /*stores the resultant exponent for shiftedSFM_fx*/ + shiftedSFM_fx = 0; + shiftedSFM_e = 0; + move16(); + move16(); + + // tmp_tb = IGF_getSFM_ivas(pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1]) / IGF_getCrest_ivas(pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1]); + sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] ); + crest = IGF_getCrest_ivas( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] ); + tmp_tb_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); + tmp_tb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); /*stores the resultant exponent for tmp_tb_fx*/ + + // tmp_sb = IGF_getSFM_ivas(tileSrcSpec, 0, strt_cpy - tmp) / IGF_getCrest_ivas(tileSrcSpec, 0, strt_cpy - tmp); + sfm = IGF_getSFM_ivas_fx( &sfm_exp, tileSrcSpec_fx, tileSrcSpec_e, 0, sub( strt_cpy, tmp ) ); + crest = IGF_getCrest_ivas( &crest_exp, tileSrcSpec_fx, tileSrcSpec_e, 0, sub( strt_cpy, tmp ) ); + tmp_sb_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); + tmp_sb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); /*stores the resultant exponent for tmp_sb_fx*/ + + IF( last_core_acelp || hPrivateData->wasTransient ) + { + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = tmp_tb_fx; /*Exponent for hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] values stored in hPrivateData->sfb_tb_e[sfb] */ + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = tmp_sb_fx; /*Exponent for hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] values stored in hPrivateData->sfb_sb_e[sfb]*/ + hPrivateData->prevSFB_FIR_TB_e[sfb] = tmp_sb_e; + hPrivateData->prevSFB_IIR_TB_e[sfb] = tmp_sb_e; + hPrivateData->prevSFB_FIR_SB_e[sfb] = tmp_sb_e; + hPrivateData->prevSFB_IIR_SB_e[sfb] = tmp_sb_e; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + ELSE + { + /* Purpose of this block: + -to make the exponent of hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] equal to that of tmp_tb_fx + -to make the exponent of hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] equal to that of tmp_sb_fx + */ + Word16 diff_sb_e; /*stores the difference of exponents for sb*/ + Word16 diff_tb_e; /*stores the difference of exponents for tb*/ + diff_sb_e = sub( tmp_sb_e, hPrivateData->sfb_sb_e[sfb] ); + diff_tb_e = sub( tmp_tb_e, hPrivateData->sfb_tb_e[sfb] ); + IF( LE_16( tmp_tb_e, hPrivateData->sfb_tb_e[sfb] ) ) + { + tmp_tb_fx = shl( tmp_tb_fx, diff_tb_e ); + tmp_tb_e = hPrivateData->sfb_tb_e[sfb]; + move16(); + } + ELSE + { + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], diff_tb_e ); + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], diff_tb_e ); + move16(); + move16(); + hPrivateData->prevSFB_FIR_TB_e[sfb] = tmp_tb_e; + hPrivateData->prevSFB_IIR_TB_e[sfb] = tmp_tb_e; + move16(); + move16(); + } + IF( LE_16( tmp_sb_e, hPrivateData->sfb_sb_e[sfb] ) ) + { + tmp_sb_fx = shl( tmp_sb_fx, diff_sb_e ); + tmp_sb_e = hPrivateData->sfb_sb_e[sfb]; + move16(); + } + ELSE + { + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], diff_sb_e ); + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], diff_sb_e ); + move16(); + move16(); + hPrivateData->prevSFB_FIR_SB_e[sfb] = tmp_sb_e; + hPrivateData->prevSFB_IIR_SB_e[sfb] = tmp_sb_e; + move16(); + move16(); + } + } + tmp_tb_fx = shr_sat( tmp_tb_fx, sub( 2, tmp_tb_e ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */ + tmp_sb_fx = shr_sat( tmp_sb_fx, sub( 2, tmp_sb_e ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */ + hPrivateData->SFM_tb_fx[sfb] = add_sat( tmp_tb_fx, add_sat( shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], sub( 2, hPrivateData->prevSFB_FIR_TB_e[sfb] ) ), shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], sub( 3, hPrivateData->prevSFB_IIR_TB_e[sfb] ) ) ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */ + hPrivateData->SFM_tb_fx[sfb] = s_min( 22118 /*2.7f Q13*/, hPrivateData->SFM_tb_fx[sfb] ); /* resultant exponent stored in hPrivateData->sfb_sb_e[sfb]*/ + hPrivateData->SFM_sb_fx[sfb] = add_sat( tmp_sb_fx, add_sat( shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], sub( 2, hPrivateData->prevSFB_FIR_SB_e[sfb] ) ), shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], sub( 3, hPrivateData->prevSFB_IIR_SB_e[sfb] ) ) ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */ + hPrivateData->SFM_sb_fx[sfb] = s_min( 22118 /*2.7f Q13*/, hPrivateData->SFM_sb_fx[sfb] ); /*resultant exponent stores in hPrivateData->sfb_tb_e[sfb]*/ + move16(); + move16(); + move16(); + move16(); + hPrivateData->sfb_sb_e[sfb] = 2; + hPrivateData->sfb_tb_e[sfb] = 2; + move16(); + move16(); + + diffSFM_fx = sub( hPrivateData->SFM_sb_fx[sfb], hPrivateData->SFM_tb_fx[sfb] ); /*Q13*/ + + test(); + IF( diffSFM_fx > 0 && LT_16( hPrivateData->SFM_tb_fx[sfb], 819 /*0.1 Q13*/ ) ) /* check whether target SFB is more tonal than source SFB */ + { + Word16 currDampingFactor_fx, dampingFactor_fx, alpha_fx; + Word16 threshold_e, threshold_fx, alpha_e, currDampingFactor_e, dampingFactor_e; + /* calculate spectral tilt to detect sudden drops (or increases) in energy in the current SFB */ + x = 1; + mean_x_fx = mean_y_fx = 0; + mean_xy_fx = mean_x2_fx = 0; + mean_x_e = mean_y_e = 15; + mean_xy_e = mean_x2_e = 31; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ ) + { + mean_x_fx = add( mean_x_fx, x ); /*Q0*/ + mean_x2_fx = L_add( mean_x2_fx, L_mult0( x, x ) ); /*Q0*/ + + /*y = 20 * (Word16) log10f( max( 1e-018f, pPowerSpectrum[sb] ) );*/ + IF( LT_32( pPowerSpectrum_fx[sb], 1 ) ) + { + y = 20 * ( -18 ); + move16(); + } + ELSE + { + y = imult1616( 20, extract_l( L_shr( Mult_32_16( ( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( pPowerSpectrum_e[sb], Q25 ) ) ), INV_Log2_10_Q15 ), 25 ) ) ); /*Q0*/ + } + mean_y_fx = add( mean_y_fx, y ); /*Q0*/ + mean_xy_fx = L_add( mean_xy_fx, L_mult0( y, x ) ); /*Q0*/ + + x = add( x, 1 ); + } + mean_y_fx = BASOP_Util_Divide1616_Scale( mean_y_fx, width, &tmp_e ); /* resultant exp stores in mean_y_e*/ + mean_y_e = add( mean_y_e, sub( tmp_e, 15 ) ); + mean_x_fx = BASOP_Util_Divide1616_Scale( mean_x_fx, width, &tmp_e ); /* resultant exp stores in mean_x_e*/ + mean_x_e = add( mean_x_e, sub( tmp_e, 15 ) ); + mean_xy_fx = BASOP_Util_Divide3216_Scale( mean_xy_fx, width, &tmp_e ); /* resultant exp stores in mean_xy_e*/ + mean_xy_e = add( mean_xy_e, sub( tmp_e, 15 ) ); + mean_x2_fx = BASOP_Util_Divide3216_Scale( mean_x2_fx, width, &tmp_e ); /* resultant exp stores in mean_x2_e*/ + mean_x2_e = add( mean_x2_e, sub( tmp_e, 15 ) ); + + /*slope = ( mean_xy - mean_x * mean_y ) / ( mean_x2 - mean_x * mean_x );*/ + slope_fx = BASOP_Util_Divide3232_Scale( ( L_sub( mean_xy_fx, L_shl( mult( mean_x_fx, mean_y_fx ), sub( add( mean_x_e, mean_y_e ), mean_xy_e ) ) ) ), ( L_sub( mean_x2_fx, L_shl( mult( mean_x_fx, mean_x_fx ), sub( add( mean_x_e, mean_x_e ), mean_x2_e ) ) ) ), &slope_e ); + slope_e = add( slope_e, sub( mean_xy_e, mean_x2_e ) ); /*stores resultant exponent for slope_fx*/ + + /* determine whether strong tilt is due to a step in the spectrum (e.g. band limitation, no damping) + or a tonal component close the band border (apply damping) by calculating SFM for a shift of 1/2 SFB width*/ + threshold_fx = BASOP_Util_Divide1616_Scale( 60, width, &threshold_e ); /*stores resultant exponent for threshold_fx*/ + test(); + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope_fx, add( slope_e, 16 ), negate( threshold_fx ), add( threshold_e, 16 ) ), -1 ) ) + { + Word16 shift = shr( width, 1 ); + // shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ); + sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) ); + crest = IGF_getCrest_ivas( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) ); + shiftedSFM_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); + } + ELSE IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope_fx, add( slope_e, 16 ), threshold_fx, add( threshold_e, 16 ) ), 1 ) && ( NE_16( sfb, sub( hGrid->sfbWrap[hGrid->nTiles], 1 ) ) ) ) + { + Word16 shift; + shift = shr( width, 1 ); + // shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ); + sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) ); + crest = IGF_getCrest_ivas( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) ); + shiftedSFM_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); + } + IF( shiftedSFM_fx ) + { + shiftedSFM_e = add( shiftedSFM_e, sub( sfm_exp, crest_exp ) ); /* stores resultant exponent for shiftedSFM_fx*/ + } + + // alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f ); + temp = BASOP_Util_Divide1616_Scale( 320, swb_offset[sfb + 1], &alpha_e ); + alpha_fx = extract_l( L_min( temp, L_shl( 20480 /*1.25 Q14*/, sub( 1, alpha_e ) ) ) ); /* exponent is alpha_e*/ + temp = BASOP_Util_Divide1616_Scale( hPrivateData->SFM_tb_fx[sfb], hPrivateData->SFM_sb_fx[sfb], &tmp_e ); + tmp_e = add( tmp_e, sub( hPrivateData->sfb_tb_e[sfb], hPrivateData->sfb_sb_e[sfb] ) ); /* stores resultant exponent for temp */ + + // currDampingFactor = expf( alpha * logf( hPrivateData->SFM_tb[sfb] / hPrivateData->SFM_sb[sfb] ) ); + currDampingFactor_fx = round_fx( BASOP_util_Pow2( Mpy_32_16_1( L_add( BASOP_Util_Log2( temp ), L_shl( add( 16, tmp_e ), 25 ) ), alpha_fx ), add( alpha_e, 6 ), &currDampingFactor_e ) ); /*exp is currDampingFactor_e*/ + + IF( GT_32( shiftedSFM_fx, L_shl( 1311 /*0.04f Q15*/, negate( shiftedSFM_e ) ) ) ) + { + currDampingFactor_fx = 32767; /*1.f Q15*/ + currDampingFactor_e = 0; + move16(); + move16(); + } + test(); + test(); + IF( last_core_acelp || hPrivateData->wasTransient || EQ_32( hPrivateData->prevDampingFactor_IIR_fx[sfb], L_shl( -1, sub( 15, hPrivateData->prevDampingFactor_IIR_e[sfb] ) ) ) ) + { + tmp = BASOP_Util_Cmp_Mant32Exp( currDampingFactor_fx, currDampingFactor_e, 3277, 0 ); + IF( tmp >= 0 ) + { + hPrivateData->prevDampingFactor_IIR_fx[sfb] = currDampingFactor_fx; + hPrivateData->prevDampingFactor_IIR_e[sfb] = currDampingFactor_e; + } + ELSE + { + hPrivateData->prevDampingFactor_IIR_fx[sfb] = 3277; /* 0.1 in Q15 */ + hPrivateData->prevDampingFactor_IIR_e[sfb] = 0; + } + + move16(); + move16(); + } + + { + Word32 tonalToNoise; + Word16 adap; + Word16 adap_e; /*stores exp for adap*/ + Word16 tonalToNoise_e; /*stores exponent for tonalToNoise*/ + tonalToNoise_e = 9; /*stores exponent for tonalToNoise*/ + move16(); + adap = BASOP_Util_Divide1616_Scale( width, 30, &adap_e ); + tonalToNoise = IGF_getTNR_ivas_fx( pPowerSpectrum_fx, swb_offset[sfb], swb_offset[sfb + 1], adap, pPowerSpectrum_e, adap_e ); /*Q22*/ + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tonalToNoise, tonalToNoise_e, L_add( L_shl( 10, sub( 15, adap_e ) ), adap ), add( 16, adap_e ) ), -1 ) ) + { + // currDampingFactor += 0.1f * ( ( 10 + adap ) - tonalToNoise ); + Word32 temp2 = BASOP_Util_Add_Mant32Exp( L_add( L_shl( 10, sub( 15, adap_e ) ) /*exp:adap_e*/, adap ), add( adap_e, 16 ), L_negate( tonalToNoise ), tonalToNoise_e, &tmp_e ); /* resultant exp is tmp_e*/ + currDampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor_fx, currDampingFactor_e, extract_l( Mult_32_16( temp2, 3277 /*0.1f Q15*/ ) ), tmp_e, &currDampingFactor_fx ); /*stores resultant exp for currDampingFactor_fx*/ + } + } + + dampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor_fx, currDampingFactor_e, hPrivateData->prevDampingFactor_IIR_fx[sfb], hPrivateData->prevDampingFactor_IIR_e[sfb], &dampingFactor_fx ); + dampingFactor_fx = shr( dampingFactor_fx, 1 ); /* resultant exponent is dampingFactor_e*/ + IF( NE_16( BASOP_Util_Cmp_Mant32Exp( dampingFactor_fx, add( dampingFactor_e, 16 ), shr( hPrivateData->prevDampingFactor_IIR_fx[sfb], 1 ), add( hPrivateData->prevDampingFactor_IIR_e[sfb], 16 ) ), -1 ) ) + { + // do nothing + } + ELSE + { + dampingFactor_fx = shr( hPrivateData->prevDampingFactor_IIR_fx[sfb], 1 ); /* resultant exponent is hPrivateData->prevDampingFactor_IIR_e[sfb]*/ + dampingFactor_e = hPrivateData->prevDampingFactor_IIR_e[sfb]; + move16(); + } + IF( dampingFactor_e < 0 ) + { + dampingFactor_fx = shl( dampingFactor_fx, dampingFactor_e ); + dampingFactor_e = 0; + move16(); + } + gain_fx = Mult_32_16( gain_fx, shl_sat( extract_l( L_min( L_add( dampingFactor_fx, Mult_32_16( L_shl( hPrivateData->dampingFactorSmoothing[sfb], sub( 15, dampingFactor_e ) ) /*Q:15-dampingFactor_e*/, 3277 /*0.1f Q15*/ ) /*Q:15-dampingFactor_e*/ ), shl_sat( 1, sub( 15, dampingFactor_e ) ) ) ), dampingFactor_e ) /*Q15*/ ); + + hPrivateData->prevDampingFactor_IIR_fx[sfb] = dampingFactor_fx; + hPrivateData->prevDampingFactor_IIR_e[sfb] = dampingFactor_e; + move16(); + move16(); + if ( hPrivateData->dampingFactorSmoothing[sfb] > 0 ) + { + hPrivateData->dampingFactorSmoothing[sfb] = sub( hPrivateData->dampingFactorSmoothing[sfb], 1 ); + move16(); + } + } + ELSE + { + hPrivateData->prevDampingFactor_IIR_fx[sfb] = -( 1 << 15 ); /* resultant exp which is 0 stores in hPrivateData->prevDampingFactor_IIR_e[sfb]*/ + hPrivateData->prevDampingFactor_IIR_e[sfb] = 0; + hPrivateData->dampingFactorSmoothing[sfb] = 1; + move16(); + move16(); + move16(); + } + + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = tmp_tb_fx; + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = hPrivateData->SFM_tb_fx[sfb]; + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = tmp_sb_fx; + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = hPrivateData->SFM_sb_fx[sfb]; + hPrivateData->prevSFB_FIR_TB_e[sfb] = hPrivateData->sfb_tb_e[sfb]; + hPrivateData->prevSFB_IIR_TB_e[sfb] = hPrivateData->sfb_tb_e[sfb]; + hPrivateData->prevSFB_FIR_SB_e[sfb] = hPrivateData->sfb_sb_e[sfb]; + hPrivateData->prevSFB_IIR_SB_e[sfb] = hPrivateData->sfb_sb_e[sfb]; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + ELSE + { + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0; + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0; + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0; + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0; + hPrivateData->prevSFB_FIR_TB_e[sfb] = 0; + hPrivateData->prevSFB_IIR_TB_e[sfb] = 0; + hPrivateData->prevSFB_FIR_SB_e[sfb] = 0; + hPrivateData->prevSFB_IIR_SB_e[sfb] = 0; + + hPrivateData->dampingFactorSmoothing[sfb] = 2; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + } + ELSE + { + tmp_e = pMDCTSpectrum_e; + sfbEnergyR_fx = add_sat( EPSILON_FX, BASOP_Util_Divide3216_Scale( sum2_32_fx( pMDCTSpectrum_fx + swb_offset[sfb], width, &tmp_e ) /*exp: tmp_e*/, width, &sfbEnergyR_e ) ); + sfbEnergyR_e = add( sfbEnergyR_e, add( tmp_e, -15 ) ); /* stores resultant exponent for sfbEnergyR_fx*/ + gain_fx = sfbEnergyR_fx; /*resultant exponent stored in gain_e=sfbEnergyR_e*/ + move32(); + gain_e = add( sfbEnergyR_e, 16 ); /* because gain_fx is word32;only after adding 16 q of gain_fx is 15-sfbEnergyR_e*/ + + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0; + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0; + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0; + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0; + hPrivateData->prevSFB_FIR_TB_e[sfb] = 0; + hPrivateData->prevSFB_IIR_TB_e[sfb] = 0; + hPrivateData->prevSFB_FIR_SB_e[sfb] = 0; + hPrivateData->prevSFB_IIR_SB_e[sfb] = 0; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + /*gain=0.5f+log2f(gain)*2+16 becuase 2.885390081777927f=2*1/loge(2) so 2*1/loge(2)*loge(x) can be written as 2*log2(x)*/ + gain_fx = L_add( ONE_IN_Q22, L_add( L_add( L_shr( BASOP_Util_Log2( gain_fx ), 1 ), L_shl( gain_e, Q24 ) ), L_shl( 16, Q23 ) ) ); /*Q23*/ + test(); + test(); + if ( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) ) + { + gain_fx = L_add( gain_fx, ONE_IN_Q21 ); /* better preservation of original HF band energy */ + } + test(); + test(); + if ( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_64000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_64000_CPE ) ) ) + { + gain_fx = L_add( gain_fx, ONE_IN_Q20 ); + } + gain_fx = L_min( gain_fx, 91 << Q23 ); /* 13+15+63, see arithcode encode residual */ + gain_fx = L_max( gain_fx, 0 ); + gain_e = 8; /* stores exponent for gain_fx*/ + move16(); + hPrivateData->igfScfQuantized[sfb] = (Word16) ( L_shr( gain_fx, 23 ) ); /*Q0*/ + move16(); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_WriteEnvelope() + * + * writes IGF SCF values + *-------------------------------------------------------------------*/ +/*! r: number of bits writen */ +static Word16 IGF_WriteEnvelope_ivas( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 *pBitOffset, /* i : ptr to bitOffset counter */ + const Word16 igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ + const Word16 isIndepFlag, /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ + Word16 *igfAllZero /* i : returns 1 if all IGF scfs are zero, else 0 */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + Word16 sfb; + Word16 totBitCount; + Word16 startBitCount; + + startBitCount = *pBitOffset; + totBitCount = 0; + *igfAllZero = 1; + move16(); + move16(); + move16(); + hPrivateData = &hIGFEnc->igfData; + hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; + + FOR( sfb = hGrid->startSfb; sfb < hGrid->stopSfb; sfb++ ) + { + IF( hPrivateData->igfScfQuantized[sfb] != 0 ) + { + *igfAllZero = 0; + move16(); + BREAK; + } + } + + IF( *igfAllZero != 0 ) + { + IGF_write_bit_fx( hBstr, pBitOffset, 1 ); + + if ( NULL == hBstr ) + { + IGFSCFEncoderSaveContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx ); + } + + IGFSCFEncoderReset_fx( &hPrivateData->hIGFSCFArithEnc ); + + if ( NULL == hBstr ) + { + IGFSCFEncoderRestoreContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx ); + } + } + ELSE + { + IGF_write_bit_fx( hBstr, pBitOffset, 0 ); + + if ( NULL == hBstr ) + { + IGFSCFEncoderSaveContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx ); + } + + *pBitOffset = IGFSCFEncoderEncode_ivas_fx( &hPrivateData->hIGFSCFArithEnc, hBstr, *pBitOffset, &hPrivateData->igfScfQuantized[hGrid->startSfb], igfGridIdx, isIndepFlag ); + move16(); + + if ( NULL == hBstr ) + { + IGFSCFEncoderRestoreContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx ); + } + } + totBitCount = sub( *pBitOffset, startBitCount ); + + return totBitCount; +} + + +/*-------------------------------------------------------------------* + * IGF_Whitening() + * + * calculates the IGF whitening levels by SFM and crest + *-------------------------------------------------------------------*/ + +static void IGF_Whitening_ivas_fx( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : | instance handle of IGF Encoder */ + Word32 *powerSpectrum, /* i : Q31 | MDCT/MDST power spectrum */ + Word16 *powerSpectrum_e, /* i : Q31 | MDCT/MDST power spectrum */ + const Word16 igfGridIdx, /* i : Q0 | IGF grid index */ + const Word16 isTransient, /* i : Q0 | flag indicating if transient is detected */ + const Word16 last_core_acelp, /* i : Q0 | indicator if last frame was ACELP core */ + const Word16 isTNSActive, /* i : Q0 | indicator if TNS is active */ + const Word16 sp_aud_decision0, /* i : Q0 | first stage classifier decision */ + const Word32 brate, /* i : Q0 | bitrate */ + const Word16 element_mode /* i : Q0 | element mode */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + Word16 p; /*Q0*/ + Word16 tmp; + Word16 tmp_e; + Word16 SFM_src; + Word16 SFM_tar; + Word16 SFM_src_e; + Word16 SFM_tar_e; + Word16 num_Tiles; + Word16 SFM; + Word16 crest_e; + + SFM = -ONE_IN_Q13; /*1.0f Q13*/ + move16(); + + hPrivateData = &hIGFEnc->igfData; + hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx]; + + IF( NE_16( igfGridIdx, IGF_GRID_LB_NORM ) ) + { + FOR( p = 0; p < hGrid->nTiles; p++ ) + { + /* reset filter */ + hPrivateData->prevSFM_FIR[p] = L_deposit_l( 0 ); + hPrivateData->prevSFM_IIR[p] = 0; + move16(); + + /* preset values: */ + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + move16(); + } + } + + FOR( p = 0; p < IGF_MAX_TILES; p++ ) + { + /* update prev data: */ + hPrivateData->igfPrevWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p]; + /* preset values: */ + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + move16(); + move16(); + } + + test(); + IF( !( isTransient || hPrivateData->wasTransient ) ) + { + IF( powerSpectrum ) + { + FOR( p = 0; p < hGrid->nTiles; p++ ) + { + Word16 sb; + + IF( isTNSActive ) + { + FOR( sb = hGrid->tile[p]; sb < hGrid->tile[p + 1]; sb++ ) + { + IF( LT_32( powerSpectrum[sb], 1 ) ) + hPrivateData->logSpec[sb] = 0; /* max(0,FLT_MIN_EXP )*/ + ELSE + hPrivateData->logSpec[sb] = extract_l( L_max( 0, L_shr( L_add( BASOP_Util_Log2( powerSpectrum[sb] ), L_shl( powerSpectrum_e[sb], Q25 ) ), Q25 ) ) ); + move16(); + } + } + + /* if current tile contains only a single SFB, reuse already computed SFM values */ + test(); + IF( element_mode > EVS_MONO && EQ_16( sub( hGrid->sfbWrap[p + 1], hGrid->sfbWrap[p] ), 1 ) ) + { + tmp = hPrivateData->SFM_tb_fx[p]; + tmp_e = hPrivateData->sfb_tb_e[p]; + move16(); + move16(); + } + ELSE + { + tmp = BASOP_Util_Divide1616_Scale( IGF_getSFM_new_fx( powerSpectrum, hPrivateData->logSpec, hGrid->tile[p], hGrid->tile[p + 1], powerSpectrum_e ), IGF_getCrest_new_fx( hPrivateData->logSpec, hGrid->tile[p], hGrid->tile[p + 1], &crest_e ), &tmp_e ); + tmp_e = sub( tmp_e, crest_e ); + } + + test(); + IF( last_core_acelp || hPrivateData->wasTransient ) + { + hPrivateData->prevSFM_FIR[p] = L_shl( tmp, add( 1, tmp_e ) ); /*16-(15-exp)=>15Q16*/ + hPrivateData->prevSFM_IIR[p] = shl( tmp, sub( tmp_e, 2 ) ); /*13-(15-exp)=>2Q13*/ + move32(); + move16(); + } + + test(); + IF( LE_32( brate, IVAS_48k ) && EQ_16( element_mode, IVAS_CPE_MDCT ) ) + { + Word16 temp; + num_Tiles = 0; + SFM_src = 0; + SFM_tar = 0; + SFM_src_e = 0; + SFM_tar_e = 0; + move16(); + move16(); + move16(); + move16(); + move16(); + + FOR( sb = hGrid->sfbWrap[p]; sb < hGrid->sfbWrap[p + 1]; sb++ ) + { + num_Tiles = add( num_Tiles, 1 ); + SFM_src_e = BASOP_Util_Add_MantExp( hPrivateData->SFM_sb_fx[sb], hPrivateData->sfb_sb_e[sb], SFM_src, SFM_src_e, &SFM_src ); + SFM_tar_e = BASOP_Util_Add_MantExp( hPrivateData->SFM_tb_fx[sb], hPrivateData->sfb_tb_e[sb], SFM_tar, SFM_tar_e, &SFM_tar ); + } + + /* compute the average */ + SFM_src = shr( BASOP_Util_Divide1616_Scale( SFM_src, num_Tiles, &temp ), 2 ); + SFM_src_e = add( SFM_src_e, sub( temp, 13 ) ); /*temp-15+2:because right shifted by 2 which are the guard bits*/ + SFM_tar = shr( BASOP_Util_Divide1616_Scale( SFM_tar, num_Tiles, &temp ), 2 ); + SFM_tar_e = add( SFM_tar_e, sub( temp, 13 ) ); /*temp-15+2:because right shifted by 2 which are the guard bits*/ + + IF( LT_16( SFM_tar_e, SFM_src_e ) ) + { + SFM_tar = shl( SFM_tar, sub( SFM_tar_e, SFM_src_e ) ); /*making the q for SFM_tar and SFM_src equal with 2 as guard bits*/ + SFM_tar_e = SFM_src_e; + } + ELSE + { + SFM_src = shr( SFM_src, sub( SFM_tar_e, SFM_src_e ) ); /*making the q for SFM_tar and SFM_src equal with 2 as guard bits*/ + SFM_src_e = SFM_tar_e; + } + move16(); + + test(); + test(); + IF( ( p > 0 ) && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) ) + { + test(); + if ( EQ_16( p, 1 ) && EQ_16( abs_s( sub( hPrivateData->igfCurrWhiteningLevel[0], hPrivateData->igfCurrWhiteningLevel[1] ) ), 2 ) ) /* OFF vs. STRONG */ + { + hPrivateData->igfCurrWhiteningLevel[0] = IGF_WHITENING_MID; + move16(); + } + hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p - 1]; + move16(); + } + ELSE IF( sp_aud_decision0 ) + { + /* Music */ + /* whitening Off: when tonality of target is more than source or tonality of target is close to that of source */ + test(); + if ( LE_16( SFM_tar, SFM_src ) || LE_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + move16(); + } + + /* whitening mid: */ + test(); + if ( GT_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) && LE_32( SFM_tar, L_add( SFM_src, L_shl( 5, sub( 13, SFM_src_e ) ) /*1.25 with exponent SFM_src_e*/ ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; + move16(); + } + + /* whitening strong */ + if ( GT_32( SFM_tar, L_add( SFM_src, L_shl( 5, sub( 13, SFM_src_e ) ) /*1.25 with exponent SFM_src_e*/ ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG; + move16(); + } + } + ELSE + { + /* Speech */ + /* whitening Off: when tonality of target is more than source or tonality of target is close to that of source */ + test(); + if ( LE_16( SFM_tar, SFM_src ) || LE_32( SFM_tar, L_add( SFM_src, L_shr( 3277 /*0.1 Q15*/, SFM_src_e ) ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + move16(); + } + + /* whitening mid: */ + test(); + if ( GT_32( SFM_tar, L_add( SFM_src, L_shr( 3277 /*0.1 Q15*/, SFM_src_e ) ) ) && LE_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; + move16(); + } + + /* whitening strong */ + if ( GT_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG; + move16(); + } + } + + SFM = shl( SFM_tar, sub( SFM_tar_e, 2 ) ); /*2Q13*/ + } + ELSE + { + test(); + IF( element_mode > EVS_MONO && EQ_16( sub( hGrid->sfbWrap[p + 1], hGrid->sfbWrap[p] ), 1 ) ) + { + SFM = shl( tmp, sub( tmp_e, 2 ) ); /*2Q13*/ + } + ELSE + { + Word32 temp; + temp = L_add( L_shl( tmp, sub( tmp_e, 2 ) ), L_add( L_shr( hPrivateData->prevSFM_FIR[p], 3 ), L_shr( hPrivateData->prevSFM_IIR[p], 1 ) ) ); + SFM = extract_l( L_min( 22118 /*2.7*/, temp ) ); /*2Q13*/ + } + hPrivateData->prevSFM_FIR[p] = L_shl( tmp, add( 1, tmp_e ) ); /*15Q16*/ + hPrivateData->prevSFM_IIR[p] = SFM; + move32(); + move16(); + + IF( GT_16( SFM, hGrid->whiteningThreshold[1][p] ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG; + move16(); + } + ELSE IF( GT_16( SFM, hGrid->whiteningThreshold[0][p] ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; + move16(); + } + ELSE + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + move16(); + } + } + + IF( element_mode > EVS_MONO ) + { + IF( last_core_acelp ) /* reset */ + { + set16_fx( hPrivateData->igfPastSFM_fx[p], -ONE_IN_Q13, IGF_PAST_SFM_LEN ); + hPrivateData->igfWhiteningHangoverCnt[p] = 2; + move16(); + } + ELSE + { + test(); + test(); + test(); + test(); + /* check whether change in whitening level should be allowed or not (if SFM is inside a certain margin around thresholds) */ + IF( NE_16( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfPrevWhiteningLevel[p] ) && + ( ( GT_32( SFM, L_sub( hGrid->whiteningThreshold[0][p], 1229 /*0.15f Q13*/ ) ) && LT_32( SFM, L_add( hGrid->whiteningThreshold[0][p], 1229 ) ) ) || + ( GT_32( SFM, L_sub( hGrid->whiteningThreshold[1][p], 1229 ) ) && LT_32( SFM, L_add( hGrid->whiteningThreshold[1][p], 1229 ) ) ) ) ) + { + Word16 mean_past_SFM; + Word16 mean_past_SFM_e; + Word16 countable; + Word16 i; + mean_past_SFM = 0; + mean_past_SFM_e = 0; + countable = 0; + move16(); + move16(); + move16(); + + /* compute mean of last (available) SFM values */ + FOR( i = 0; i < IGF_PAST_SFM_LEN; i++ ) + { + IF( hPrivateData->igfPastSFM_fx[p][i] >= 0 ) + { + mean_past_SFM_e = BASOP_Util_Add_MantExp( mean_past_SFM, mean_past_SFM_e, hPrivateData->igfPastSFM_fx[p][i], 2, &mean_past_SFM ); + countable = add( countable, 1 ); + } + } + IF( countable ) + { + Word16 temp; + mean_past_SFM = BASOP_Util_Divide1616_Scale( mean_past_SFM, countable, &temp ); + mean_past_SFM_e = add( mean_past_SFM_e, sub( temp, 15 ) ); + mean_past_SFM = shl( mean_past_SFM, sub( mean_past_SFM_e, 2 ) ); /*mean_past_SFM_e=2*/ + /* deny change in whitening level for small deviations from mean SFM */ + if ( LT_16( abs_s( sub( SFM, mean_past_SFM ) ), 1638 ) /*0.2 in Q13*/ ) + { + hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p]; + move16(); + } + } + } + } + + hPrivateData->igfPastSFM_fx[p][hPrivateData->igfPastSFM_pos] = SFM; /*2Q13*/ + move16(); + } + } + + SWITCH( hPrivateData->igfInfo.bitRateIndex ) + { + case IGF_BITRATE_WB_9600: + case IGF_BITRATE_RF_WB_13200: + case IGF_BITRATE_WB_13200_CPE: + case IGF_BITRATE_WB_16400_CPE: + case IGF_BITRATE_RF_SWB_13200: + case IGF_BITRATE_SWB_9600: + case IGF_BITRATE_SWB_13200_CPE: + case IGF_BITRATE_SWB_16400: + case IGF_BITRATE_SWB_24400: + case IGF_BITRATE_SWB_24400_CPE: + case IGF_BITRATE_SWB_32000_CPE: + case IGF_BITRATE_SWB_32000: + case IGF_BITRATE_FB_16400: + case IGF_BITRATE_FB_24400: + case IGF_BITRATE_FB_24400_CPE: + case IGF_BITRATE_FB_32000_CPE: + case IGF_BITRATE_FB_32000: + hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 1] = hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 2]; + move16(); + break; + default: + break; + } + } + ELSE + { + FOR( p = 0; p < hGrid->nTiles; p++ ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; + move16(); + } + } + } + ELSE + { + /* reset filter */ + FOR( p = 0; p < IGF_MAX_TILES; p++ ) + { + hPrivateData->prevSFM_FIR[p] = L_deposit_l( 0 ); + hPrivateData->prevSFM_IIR[p] = 0; + move32(); + move16(); + } + } + + IF( element_mode > EVS_MONO ) + { + IF( EQ_16( SFM, -ONE_IN_Q13 /*1.0f 2Q13*/ ) ) /* reset */ + { + FOR( p = 0; p < hGrid->nTiles; p++ ) + { + set16_fx( hPrivateData->igfPastSFM_fx[p], -ONE_IN_Q13, IGF_PAST_SFM_LEN ); + hPrivateData->igfWhiteningHangoverCnt[p] = 2; + move16(); + } + } + + /* vibrato handling */ + FOR( p = 0; p < hGrid->nTiles; p = p + 2 ) + { + test(); + test(); + test(); + IF( ( hPrivateData->igfPrevWhiteningLevel[p] == IGF_WHITENING_OFF && hPrivateData->igfCurrWhiteningLevel[p] != IGF_WHITENING_OFF ) || + ( hPrivateData->igfPrevWhiteningLevel[p + 1] == IGF_WHITENING_OFF && hPrivateData->igfCurrWhiteningLevel[p + 1] != IGF_WHITENING_OFF ) ) + { + Word16 i; + Word16 pastSfm_a[4], pastSfm_b[4]; + Word16 pastSfmDiffSum_a, pastSfmDiffSum_b; + + FOR( i = 0; i < 4; i++ ) + { + pastSfm_a[i] = hPrivateData->igfPastSFM_fx[p][add( hPrivateData->igfPastSFM_pos, sub( 4, i ) ) % IGF_PAST_SFM_LEN]; + pastSfm_b[i] = hPrivateData->igfPastSFM_fx[p + 1][add( hPrivateData->igfPastSFM_pos, sub( 4, i ) ) % IGF_PAST_SFM_LEN]; + move16(); + move16(); + } + pastSfmDiffSum_a = pastSfmDiffSum_b = 0; + move16(); + move16(); + FOR( i = 0; i < 3; i++ ) + { + IF( NE_16( pastSfm_a[i + 1], -ONE_IN_Q13 ) ) + { + pastSfmDiffSum_a = add( pastSfmDiffSum_a, sub( pastSfm_a[i], pastSfm_a[i + 1] ) ); + pastSfmDiffSum_b = add( pastSfmDiffSum_b, sub( pastSfm_b[i], pastSfm_b[i + 1] ) ); + } + ELSE + { + break; + } + } + test(); + test(); + test(); + test(); + /* if tonality oscillates between two tiles, turn whitening off in both */ + IF( ( ( pastSfmDiffSum_a > 0 && pastSfmDiffSum_b < 0 ) || + ( pastSfmDiffSum_a < 0 && pastSfmDiffSum_b > 0 ) ) && + ( GT_32( L_abs( L_sub( pastSfmDiffSum_a, pastSfmDiffSum_b ) ), ONE_IN_Q12 /* 0.5 in Q13 */ ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p + 1] = IGF_WHITENING_OFF; + move16(); + move16(); + } + } + } + + /* hangover */ + FOR( p = 0; p < hGrid->nTiles; p++ ) + { + IF( NE_16( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfPrevWhiteningLevel[p] ) ) + { + hPrivateData->igfWhiteningHangoverCnt[p] = add( hPrivateData->igfWhiteningHangoverCnt[p], 1 ); + IF( EQ_16( hPrivateData->igfWhiteningHangoverCnt[p], 3 ) ) + { + hPrivateData->igfWhiteningHangoverCnt[p] = 0; + } + ELSE + { + hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p]; + } + move16(); + move16(); + } + ELSE + { + hPrivateData->igfWhiteningHangoverCnt[p] = 0; + move16(); + } + } + + hPrivateData->igfPastSFM_pos = add( hPrivateData->igfPastSFM_pos, 1 ) % IGF_PAST_SFM_LEN; + move16(); + } + + hPrivateData->wasTransient = isTransient; + move16(); + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_WriteWhiteningTile_fx() + * + * write whitening levels into bitstream + *-------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static Word16 IGF_WriteWhiteningTile_ivas_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 *pBitOffset, /**< in: | ptr to bitOffset counter */ + Word16 whiteningLevel /**< in: Q0 | whitening levels to write */ +) +{ + Word16 totBitCount; + Word16 startBitCount; + + totBitCount = 0; + startBitCount = *pBitOffset; + move16(); + move16(); + + IF( EQ_32( whiteningLevel, IGF_WHITENING_MID ) ) + { + IGF_write_bits( hBstr, pBitOffset, 0, 1 ); + } + ELSE + { + IGF_write_bits( hBstr, pBitOffset, 1, 1 ); + IF( whiteningLevel == IGF_WHITENING_OFF ) + { + IGF_write_bits( hBstr, pBitOffset, 0, 1 ); + } + ELSE + { + IGF_write_bits( hBstr, pBitOffset, 1, 1 ); + } + } + totBitCount = sub( *pBitOffset, startBitCount ); + + return totBitCount; +} + + +/*-------------------------------------------------------------------* + * IGF_WriteWhiteningLevels_fx() + * + * writes the whitening levels + *-------------------------------------------------------------------*/ + +/**< out: Q0 | total number of bits written */ +static Word16 IGF_WriteWhiteningLevels_ivas_fx( + const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF encoder */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 *pBitOffset, /**< in: | ptr to bitOffset counter */ + const Word16 igfGridIdx, /**< in: Q0 | igf grid index see declaration of IGF_GRID_IDX for details */ + const Word16 isIndepFlag /**< in: Q0 | if 1 frame is independent, 0 = frame is coded with data from previous frame */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + Word16 p; + Word16 nTiles; + Word16 isSame; + Word32 tmp32; + Word16 totBitCount; + Word16 startBitCount; + + totBitCount = 0; + move16(); + isSame = 1; + move16(); + startBitCount = *pBitOffset; + move16(); + hPrivateData = &hInstance->igfData; + hGrid = &hPrivateData->igfInfo.grid[igfGridIdx]; + nTiles = hGrid->nTiles; + move16(); + + IF( isIndepFlag ) + { + isSame = 0; + move16(); + } + ELSE + { + p = 0; + move16(); + tmp32 = 0; + move32(); + test(); + WHILE( ( LT_16( p, nTiles ) ) && ( tmp32 == 0 ) ) + { + test(); + tmp32 = L_sub( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfPrevWhiteningLevel[p] ); + if ( tmp32 != 0 ) + { + isSame = 0; + move16(); + } + p++; + } + } + IF( isSame ) + { + IGF_write_bits( hBstr, pBitOffset, 1, 1 ); + } + ELSE + { + IF( !isIndepFlag ) + { + IGF_write_bits( hBstr, pBitOffset, 0, 1 ); + } + IGF_WriteWhiteningTile_ivas_fx( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[0] ); + p = 1; + move16(); + tmp32 = 0; + move32(); + test(); + IF( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) + { + isSame = 1; + move16(); + } + ELSE + { + if ( LT_16( p, nTiles ) ) + { + isSame = 1; + move16(); + } + test(); + WHILE( ( LT_16( p, nTiles ) ) && ( tmp32 == 0 ) ) + { + test(); + tmp32 = L_sub( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfCurrWhiteningLevel[p - 1] ); + if ( tmp32 != 0 ) + { + isSame = 0; + move16(); + } + p++; + } + } + test(); + IF( !isSame ) + { + IGF_write_bits( hBstr, pBitOffset, 1, 1 ); + FOR( p = 1; p < nTiles; p++ ) + { + IGF_WriteWhiteningTile_ivas_fx( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[p] ); + } + } + ELSE IF( NE_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) && NE_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) + { + IGF_write_bits( hBstr, pBitOffset, 0, 1 ); + } + } + + totBitCount = sub( *pBitOffset, startBitCount ); + + return totBitCount; +} + + +/*-------------------------------------------------------------------* + * IGF_WriteFlatteningTrigger_fx() + * + * write flattening trigger + *-------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static Word16 IGF_WriteFlatteningTrigger_ivas_fx( + const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 *pBitOffset /**< in: | ptr to bitOffset counter */ +) +{ + Word16 flatteningTrigger; + + Word16 totBitCount; + Word16 startBitCount; + totBitCount = 0; + startBitCount = *pBitOffset; + flatteningTrigger = hInstance->flatteningTrigger; + move16(); + move16(); + move16(); + + IGF_write_bits( hBstr, pBitOffset, flatteningTrigger, 1 ); + totBitCount = sub( *pBitOffset, startBitCount ); + + return totBitCount; +} + + +/*-------------------------------------------------------------------* + * IGFEncWriteBitstream() + * + * IGF bitstream writer + *-------------------------------------------------------------------*/ + +/*! r: number of bits written per frame */ +Word16 IGFEncWriteBitstream_ivas_fx( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 *pBitOffset, /* i : ptr to bitOffset counter */ + const Word16 igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ + const Word16 isIndepFlag /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ +) +{ + Word16 igfAllZero; + Word16 startBitCount; + + startBitCount = *pBitOffset; + move16(); + hIGFEnc->infoTotalBitsPerFrameWritten = 0; + move16(); + + if ( isIndepFlag ) + { + hIGFEnc->infoTotalBitsWritten = 0; + move16(); + } + + IGF_WriteEnvelope_ivas( hIGFEnc, /* i: instance handle of IGF Encoder */ + hBstr, /* i: encoder state */ + pBitOffset, /* i: ptr to bitOffset counter */ + igfGridIdx, /* i: igf grid index see definition of IGF_GRID_IDX for details */ + isIndepFlag, /* i: if 1 frame is independent, 0 = frame is coded with data from previous frame */ + &igfAllZero ); /* o: *igfAllZero */ + + IGF_WriteWhiteningLevels_ivas_fx( hIGFEnc, /* i: instance handle of IGF Encoder */ + hBstr, /* i: encoder state */ + pBitOffset, /* i: ptr to bitOffset counter */ + igfGridIdx, /* i: igf grid index see definition of IGF_GRID_IDX for details */ + isIndepFlag ); /* i: if 1 frame is independent, 0 = frame is coded with data from previous frame */ + + IGF_WriteFlatteningTrigger_ivas_fx( hIGFEnc, /* i: instance handle of IGF Encoder */ + hBstr, /* i: encoder state */ + pBitOffset ); /* i: ptr to bitOffset counter */ + + hIGFEnc->infoTotalBitsPerFrameWritten = sub( *pBitOffset, startBitCount ); + hIGFEnc->infoTotalBitsWritten = add( hIGFEnc->infoTotalBitsWritten, hIGFEnc->infoTotalBitsPerFrameWritten ); + move16(); + move16(); + + return hIGFEnc->infoTotalBitsPerFrameWritten; +} + + +/*-------------------------------------------------------------------* + * IGFEncSetMode() + * + * sets the IGF mode according to given bitrate + *-------------------------------------------------------------------*/ + +void IGFEncSetMode_ivas_fx( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i/o: instance handle of IGF Encoder */ + const Word32 total_brate, /* i : encoder total bitrate */ + const Word16 bwidth, /* i : encoder audio bandwidth */ + const Word16 element_mode, /* i : IVAS element mode */ + const Word16 rf_mode /* i : flag to signal the RF mode */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + Word16 i; + + hPrivateData = &hIGFEnc->igfData; + hPrivateData->igfBitstreamBits = 0; + move16(); + set16_fx( hPrivateData->igfScfQuantized, 0, IGF_MAX_SFB ); + set16_fx( hPrivateData->igfCurrWhiteningLevel, 0, IGF_MAX_TILES ); + set16_fx( hPrivateData->igfPrevWhiteningLevel, 0, IGF_MAX_TILES ); + set16_fx( hPrivateData->igfWhiteningHangoverCnt, 0, IGF_MAX_TILES ); + FOR( i = 0; i < IGF_MAX_TILES; i++ ) + { + set16_fx( hPrivateData->igfPastSFM_fx[i], -( ONE_IN_Q13 ), IGF_PAST_SFM_LEN ); + } + + hPrivateData->igfPastSFM_pos = 0; + move16(); + + FOR( i = 0; i < IGF_BITBUFSIZE / 8; i++ ) + { + hPrivateData->igfBitstream[i] = 0; + move16(); + } + hPrivateData->wasTransient = 0; + move16(); + set32_fx( hPrivateData->prevSFM_FIR, 0, IGF_MAX_TILES ); + set16_fx( hPrivateData->prevSFM_IIR, 0, IGF_MAX_TILES ); + set16_fx( hPrivateData->dampingFactorSmoothing, 2, IGF_MAX_SFB ); + set16_fx( hPrivateData->prevSFM_FIR_SFB_SB_fx, 0, IGF_MAX_SFB ); + set16_fx( hPrivateData->prevSFB_FIR_TB_e, 15, IGF_MAX_SFB ); + set16_fx( hPrivateData->prevSFB_FIR_SB_e, 15, IGF_MAX_SFB ); + set16_fx( hPrivateData->prevSFM_IIR_SFB_SB_fx, 0, IGF_MAX_SFB ); + set16_fx( hPrivateData->prevSFB_IIR_SB_e, 15, IGF_MAX_SFB ); + set16_fx( hPrivateData->prevSFM_FIR_SFB_TB_fx, 0, IGF_MAX_SFB ); + set16_fx( hPrivateData->prevSFB_IIR_TB_e, 15, IGF_MAX_SFB ); + set16_fx( hPrivateData->sfb_tb_e, 15, IGF_MAX_SFB ); + set16_fx( hPrivateData->sfb_sb_e, 15, IGF_MAX_SFB ); + set16_fx( hPrivateData->prevSFM_IIR_SFB_TB_fx, 0, IGF_MAX_SFB ); + set16_fx( hPrivateData->prevDampingFactor_IIR_fx, -( ONE_IN_Q15 ), IGF_MAX_SFB ); + set16_fx( hPrivateData->prevDampingFactor_IIR_e, 0, IGF_MAX_SFB ); + set16_fx( hPrivateData->logSpec, 0, L_FRAME_PLUS ); + set16_fx( hPrivateData->SFM_sb_fx, 0, IGF_MAX_SFB ); + set16_fx( hPrivateData->SFM_tb_fx, 0, IGF_MAX_SFB ); + + IF( IGFCommonFuncsIGFConfiguration_ivas_fx( total_brate, bwidth, element_mode, &hPrivateData->igfInfo, rf_mode ) != 0 ) + { + IGFSCFEncoderOpen_fx( &hPrivateData->hIGFSCFArithEnc, &hPrivateData->igfInfo, total_brate, bwidth, element_mode, rf_mode ); + + hIGFEnc->infoSamplingRate = hPrivateData->igfInfo.sampleRate; + move32(); + hIGFEnc->infoStartFrequency = hPrivateData->igfInfo.grid[0].startFrequency; + move16(); + hIGFEnc->infoStopFrequency = hPrivateData->igfInfo.grid[0].stopFrequency; + move16(); + hIGFEnc->infoStartLine = hPrivateData->igfInfo.grid[0].startLine; + move16(); + hIGFEnc->infoStopLine = hPrivateData->igfInfo.grid[0].stopLine; + move16(); + } + ELSE + { + /* IGF configuration failed -> error! */ + hIGFEnc->infoSamplingRate = 0; + move32(); + hIGFEnc->infoStartFrequency = -1; + move16(); + hIGFEnc->infoStopFrequency = -1; + move16(); + hIGFEnc->infoStartLine = -1; + move16(); + hIGFEnc->infoStopLine = -1; + move16(); + fprintf( stderr, "IGFEncSetMode_fx: initialization error!\n" ); + } + + /* reset remaining variables */ + hIGFEnc->infoTotalBitsWritten = 0; + move16(); + hIGFEnc->infoTotalBitsPerFrameWritten = 0; + move16(); + hIGFEnc->flatteningTrigger = 0; + move16(); + hIGFEnc->spec_be_igf_e = 0; + move16(); + hIGFEnc->tns_predictionGain = 0; + move16(); + set32_fx( hIGFEnc->spec_be_igf, 0, N_MAX_TCX - IGF_START_MN ); + + return; +} + + +/*-------------------------------------------------------------------* + * IGFEncResetTCX10BitCounter_fx() + * + * IGF reset bitstream bit counter for TCX10 modes + *-------------------------------------------------------------------*/ + +void IGFEncResetTCX10BitCounter_fx( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc /* i : instance handle of IGF Encoder */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + + hPrivateData = &hIGFEnc->igfData; + hPrivateData->igfBitstreamBits = 0; + hIGFEnc->infoTotalBitsWritten = 0; + move16(); + move16(); + + return; +} + + +/*-------------------------------------------------------------------* + * IGFEncApplyMono() + * + * apply the IGF encoder, main encoder interface + *-------------------------------------------------------------------*/ + +void IGFEncApplyMono_ivas_fx( + Encoder_State *st, /* i : Encoder state */ + Word16 powerSpectrum_len, /* i: length of pPowerSpectrum_fx buffer */ + const Word16 igfGridIdx, /* i : IGF grid index */ + Word32 *pMDCTSpectrum_fx, /* i/o: MDCT spectrum */ + Word16 e_mdct, /* i : exponent of pMDCTspectrum */ + Word32 *pPowerSpectrum_fx, /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word16 *e_ps, /* i : exponent of pPowerSpectrum */ + const Word16 isTCX20, /* i : flag indicating if the input is TCX20 or TCX10/2xTCX5 */ + const Word8 isTNSActive, /* i : flag indicating if the TNS is active */ + const Word16 sp_aud_decision0, /* i : first stage switching decision */ + const Word16 vad_hover_flag /* i : VAD hangover flag */ +) +{ + Word32 *pPowerSpectrumParameter_fx; + Word16 *pPowerSpectrumParameter_exp; + Word16 att_fx = MAX16B; + Word16 last_core_acelp; + move16(); + + Word32 common_pPowerSpectrum_fx[N_MAX + L_MDCT_OVLP_MAX]; + + set32_fx( common_pPowerSpectrum_fx, 0, N_MAX ); + + Word16 common_pPowerSpectrum_exp = MIN16B; + move16(); + IF( st->last_core == ACELP_CORE ) + { + last_core_acelp = 1; + move16(); + } + ELSE + { + last_core_acelp = 0; + move16(); + } + + test(); + IF( !isTNSActive && isTCX20 ) + { + pPowerSpectrumParameter_fx = pPowerSpectrum_fx; + pPowerSpectrumParameter_exp = e_ps; + } + ELSE + { + pPowerSpectrumParameter_fx = NULL; + pPowerSpectrumParameter_exp = NULL; + } + + IGF_UpdateInfo( st->hIGFEnc, igfGridIdx ); + + test(); + IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) + { + calculate_hangover_attenuation_gain_ivas_fx( st, &att_fx, vad_hover_flag ); + } + + IGF_CalculateEnvelope_ivas_fx( st->hIGFEnc, pMDCTSpectrum_fx, e_mdct, pPowerSpectrumParameter_fx, pPowerSpectrumParameter_exp, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, st->element_mode, att_fx ); + + IF( isTCX20 ) + { + pPowerSpectrumParameter_fx = pPowerSpectrum_fx; + pPowerSpectrumParameter_exp = e_ps; + } + ELSE + { + pPowerSpectrumParameter_fx = NULL; + pPowerSpectrumParameter_exp = NULL; + } + + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) + { + IGF_Whitening_ivas_fx( st->hIGFEnc, pPowerSpectrumParameter_fx, pPowerSpectrumParameter_exp, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, isTNSActive, sp_aud_decision0, st->element_brate, st->element_mode ); + } + ELSE + { + IGF_Whitening_ivas_fx( st->hIGFEnc, pPowerSpectrumParameter_fx, pPowerSpectrumParameter_exp, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, isTNSActive, sp_aud_decision0, st->total_brate, st->element_mode ); + } + + IF( pPowerSpectrumParameter_fx ) + { + FOR( Word16 i = 0; i < powerSpectrum_len; i++ ) + { + common_pPowerSpectrum_exp = s_max( common_pPowerSpectrum_exp, pPowerSpectrumParameter_exp[i] ); + } + + FOR( Word16 i = 0; i < powerSpectrum_len; i++ ) + { + common_pPowerSpectrum_fx[i] = L_shl( pPowerSpectrumParameter_fx[i], sub( pPowerSpectrumParameter_exp[i], common_pPowerSpectrum_exp ) ); + move16(); + } + pPowerSpectrumParameter_fx = common_pPowerSpectrum_fx; + } + + IGF_ErodeSpectrum_ivas_fx( st->hIGFEnc, pMDCTSpectrum_fx, pPowerSpectrumParameter_fx, common_pPowerSpectrum_exp, igfGridIdx, 0 ); + + return; +} + + +/*-------------------------------------------------------------------* + * IGFEncApplyStereo() + * + * apply the IGF encoder, main encoder interface + *-------------------------------------------------------------------*/ + +void IGFEncApplyStereo_fx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ + Word16 ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ + const Word16 igfGridIdx, /* i : IGF grid index */ + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ + Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + Word16 exp_inv_spectrum_fx[CPE_CHANNELS], /* i : exp of inverse spectrum */ + const Word16 frameno, /* i : flag indicating index of current subfr. */ + const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 mct_on ) +{ + Word32 *pPowerSpectrumParameter_fx[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */ + Word16 *exp_pPowerSpectrumParameter_fx[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */ + Word32 *pPowerSpectrumParameterMsInv_fx[NB_DIV]; + Word16 *q_pPowerSpectrumParameterMsInv_fx[NB_DIV]; + Word16 coreMsMask[N_MAX]; + Word16 sfb, ch, last_core_acelp; + STEREO_MDCT_BAND_PARAMETERS *sfbConf; + Word32 common_pPowerSpectrum_fx[N_MAX]; + + set32_fx( common_pPowerSpectrum_fx, 0, N_MAX ); + + Word16 common_pPowerSpectrum_exp = MIN16B; + move16(); + + /* assumptions: stereo filling was already done on the flattened spectra + * IGF region is always coded M/S, never L/R (to be done in the encoder) + * for residual bands with stereo filling infoTcxNoise is set to zero + * both channels have the same IGF configuration + */ + + /* sanity checks: check if both channels have the same configuration...*/ + assert( ( sts[0]->core == sts[1]->core ) ); + + /* initialization */ + IF( EQ_16( sts[0]->core, TCX_20_CORE ) ) + { + sfbConf = &hStereoMdct->stbParamsTCX20; + } + ELSE + { + sfbConf = &hStereoMdct->stbParamsTCX10; + } + if ( sts[0]->last_core == ACELP_CORE ) + { + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + + /* create line wise ms mask for the core bands */ + set16_fx( coreMsMask, 0, N_MAX ); + FOR( sfb = 0; sfb < sfbConf->sfbCnt; sfb++ ) + { + set16_fx( &coreMsMask[sfbConf->sfbOffset[sfb]], ms_mask[frameno][sfb], sub( sfbConf->sfbOffset[sfb + 1], sfbConf->sfbOffset[sfb] ) ); + } + + test(); + test(); + IF( EQ_16( sts[0]->core, TCX_20_CORE ) && !sts[0]->hTcxEnc->fUseTns[frameno] && !sts[1]->hTcxEnc->fUseTns[frameno] ) + { + pPowerSpectrumParameter_fx[0] = &pPowerSpectrum_fx[0][0]; + exp_pPowerSpectrumParameter_fx[0] = &exp_pPowerSpectrum_fx[0][0]; + pPowerSpectrumParameter_fx[1] = &pPowerSpectrum_fx[1][0]; + exp_pPowerSpectrumParameter_fx[1] = &exp_pPowerSpectrum_fx[1][0]; + pPowerSpectrumParameterMsInv_fx[0] = pPowerSpectrumMsInv_fx[0][0]; + pPowerSpectrumParameterMsInv_fx[1] = pPowerSpectrumMsInv_fx[1][0]; + q_pPowerSpectrumParameterMsInv_fx[0] = q_pPowerSpectrumMsInv_fx[0][0]; + q_pPowerSpectrumParameterMsInv_fx[1] = q_pPowerSpectrumMsInv_fx[1][0]; + } + ELSE + { + pPowerSpectrumParameter_fx[0] = NULL; + pPowerSpectrumParameter_fx[1] = NULL; + pPowerSpectrumParameterMsInv_fx[0] = NULL; + pPowerSpectrumParameterMsInv_fx[1] = NULL; + q_pPowerSpectrumParameterMsInv_fx[0] = NULL; + q_pPowerSpectrumParameterMsInv_fx[1] = NULL; + } + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + last_core_acelp = extract_l( EQ_16( sts[ch]->last_core, ACELP_CORE ) ); + + IGF_UpdateInfo( hIGFEnc[ch], igfGridIdx ); + IGF_CalculateStereoEnvelope_fx( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum_fx[frameno], sts[ch]->hTcxEnc->spectrum_e[frameno], inv_spectrum_fx[ch][frameno], + exp_inv_spectrum_fx[ch], pPowerSpectrumParameter_fx[ch], exp_pPowerSpectrum_fx[ch], pPowerSpectrumParameterMsInv_fx[ch], + q_pPowerSpectrumParameterMsInv_fx[ch], igfGridIdx, coreMsMask, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, mct_on ); + + IF( EQ_16( sts[ch]->core, TCX_20_CORE ) ) + { + pPowerSpectrumParameter_fx[ch] = pPowerSpectrum_fx[ch]; + exp_pPowerSpectrumParameter_fx[ch] = exp_pPowerSpectrum_fx[ch]; + } + ELSE + { + pPowerSpectrumParameter_fx[ch] = NULL; + } + + IGF_Whitening_ivas_fx( hIGFEnc[ch], pPowerSpectrumParameter_fx[ch], exp_pPowerSpectrumParameter_fx[ch], igfGridIdx, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, ( sts[0]->hTcxEnc->fUseTns[frameno] || sts[1]->hTcxEnc->fUseTns[frameno] ), sp_aud_decision0, element_brate, sts[ch]->element_mode ); + + IF( pPowerSpectrumParameter_fx[ch] ) + { + Word16 length = N_MAX; + move16(); + if ( mct_on ) + { + length = L_FRAME48k; + move16(); + } + FOR( Word16 i = 0; i < length; i++ ) + { + common_pPowerSpectrum_exp = s_max( common_pPowerSpectrum_exp, exp_pPowerSpectrumParameter_fx[ch][i] ); + } + + FOR( Word16 i = 0; i < length; i++ ) + { + common_pPowerSpectrum_fx[i] = L_shl( pPowerSpectrumParameter_fx[ch][i], sub( exp_pPowerSpectrumParameter_fx[ch][i], common_pPowerSpectrum_exp ) ); + move32(); + } + pPowerSpectrumParameter_fx[ch] = common_pPowerSpectrum_fx; + } + IGF_ErodeSpectrum_ivas_fx( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum_fx[frameno], pPowerSpectrumParameter_fx[ch], common_pPowerSpectrum_exp, igfGridIdx, mct_on ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * IGFSaveSpectrumForITF() + * + * + *-------------------------------------------------------------------*/ + +void IGFSaveSpectrumForITF_ivas_fx( + IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i/o: instance handle of IGF Encoder */ + const Word16 igfGridIdx, /* i : IGF grid index */ + const Word32 *pITFSpectrum, /* i : MDCT spectrum */ + Word16 exp_pITFSpectrum ) +{ + IGF_UpdateInfo( hIGFEnc, igfGridIdx ); + + Copy32( pITFSpectrum + IGF_START_MN, hIGFEnc->spec_be_igf, sub( hIGFEnc->infoStopLine, IGF_START_MN ) ); + + scale_sig32( hIGFEnc->spec_be_igf, sub( hIGFEnc->infoStopLine, IGF_START_MN ), sub( exp_pITFSpectrum, s_max( exp_pITFSpectrum, hIGFEnc->spec_be_igf_e ) ) ); + scale_sig32( hIGFEnc->spec_be_igf + sub( hIGFEnc->infoStopLine, IGF_START_MN ), sub( N_MAX_TCX - IGF_START_MN, sub( hIGFEnc->infoStopLine, IGF_START_MN ) ), sub( hIGFEnc->spec_be_igf_e, s_max( exp_pITFSpectrum, hIGFEnc->spec_be_igf_e ) ) ); + hIGFEnc->spec_be_igf_e = s_max( exp_pITFSpectrum, hIGFEnc->spec_be_igf_e ); + move16(); + + return; +} + + +/*-------------------------------------------------------------------* + * IGF_Reconfig() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IGF_Reconfig( + IGF_ENC_INSTANCE_HANDLE *hIGFEnc, /* i/o: instance handle of IGF Encoder */ + const Word16 igf, /* i : IGF on/off */ + const Word16 reset, /* i : reset flag */ + const Word32 brate, /* i : bitrate for configuration */ + const Word16 bwidth, /* i : signal bandwidth */ + const Word16 element_mode, /* i : IVAS element mode */ + const Word16 rf_mode /* i : flag to signal the RF mode */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + test(); + test(); + test(); + IF( igf && *hIGFEnc == NULL ) + { + IF( ( *hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) ); + } + IGFEncSetMode_ivas_fx( *hIGFEnc, brate, bwidth, element_mode, rf_mode ); + } + ELSE IF( igf && reset ) + { + IGFEncSetMode_ivas_fx( *hIGFEnc, brate, bwidth, element_mode, rf_mode ); + } + ELSE IF( !igf && *hIGFEnc != NULL ) + { + free( *hIGFEnc ); + *hIGFEnc = NULL; + } + + return error; +} diff --git a/lib_enc/igf_scf_enc.c b/lib_enc/igf_scf_enc.c index 2921b58866c86fab78dcf3af0061fa68559cd4ec..16f2560d1e4a858f0c52b217bf2a956aaa1f7876 100644 --- a/lib_enc/igf_scf_enc.c +++ b/lib_enc/igf_scf_enc.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_enc/igf_scf_enc_fx.c b/lib_enc/igf_scf_enc_fx.c index 8659d53a166cb2a6f155bb85c4f3025c780424a7..d1341a98af3f27cc8846dcb3db7e735ea9597d7c 100644 --- a/lib_enc/igf_scf_enc_fx.c +++ b/lib_enc/igf_scf_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -358,7 +358,7 @@ Word16 IGFSCFEncoderEncode_fx( { FOR( i = 0; i < hPublicData->ptrBitIndex; ++i ) { - push_next_indice_fx( hBstr, ptr[i], 1 ); + push_next_indice( hBstr, ptr[i], 1 ); } } diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index ebfd9c4a26ea5c93a35999c9c361dceb418f6a25..7c29b4e06757134f1092b24d5013ee6ce1b86719 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -1,12 +1,42 @@ -/*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ -#include "rom_com.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "stl.h" #include "ivas_cnst.h" #include "ivas_error.h" @@ -16,1055 +46,28 @@ /*-----------------------------------------------------------------------* - * init_encoder_fx() + * init_encoder() * * Initialization of state variables *-----------------------------------------------------------------------*/ -ivas_error init_encoder_fx( - Encoder_State *st_fx /* i/o: Encoder static variables structure */ -) -{ - Word16 i; - Word32 L_tmp; - - - Word16 idchan = 0; /* i : channel ID */ - Word16 vad_only_flag = 0; /* i : channel ID */ - move16(); - move16(); - ISM_MODE ism_mode = ISM_MODE_NONE; - ivas_error error; - - error = IVAS_ERR_OK; - - /*-----------------------------------------------------------------* - * General signal buffers - *-----------------------------------------------------------------*/ - IF( !vad_only_flag ) - { - IF( ( st_fx->hSignalBuf = (SIGNAL_BUFFERS_ENC_HANDLE) malloc( sizeof( SIGNAL_BUFFERS_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Signal buffers\n" ) ); - } - - st_fx->Bin_E_old_fx = st_fx->hSignalBuf->Bin_E_old_fx; - st_fx->mem_decim_fx = st_fx->hSignalBuf->mem_decim_fx; - st_fx->mem_decim16k_fx = st_fx->hSignalBuf->mem_decim16k_fx; - st_fx->old_inp_12k8_fx = st_fx->hSignalBuf->old_inp_12k8_fx; - st_fx->old_inp_16k_fx = st_fx->hSignalBuf->old_inp_16k_fx; - st_fx->buf_speech_enc_pe = st_fx->hSignalBuf->buf_speech_enc_pe; - st_fx->buf_synth = st_fx->hSignalBuf->buf_synth; - st_fx->buf_speech_enc = st_fx->hSignalBuf->buf_speech_enc; - st_fx->buf_wspeech_enc = st_fx->hSignalBuf->buf_wspeech_enc; - - /* initializations */ - set16_fx( st_fx->old_inp_12k8_fx, 0, L_INP_MEM ); /* memory of input signal at 12.8kHz */ - set16_fx( st_fx->old_inp_16k_fx, 0, L_INP_MEM ); - set16_fx( st_fx->mem_decim16k_fx, 0, 2 * L_FILT_MAX ); - set16_fx( st_fx->mem_decim_fx, 0, 2 * L_FILT_MAX ); - set32_fx( st_fx->Bin_E_old_fx, 0, L_FFT / 2 ); - st_fx->q_Bin_E_old = Q31; - move16(); - - st_fx->input_buff_fx = st_fx->hSignalBuf->input_buff; - set16_fx( st_fx->input_buff_fx, 0, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); - st_fx->old_input_signal_fx = st_fx->input_buff_fx; - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) - { - st_fx->input_fx = st_fx->input_buff_fx + st_fx->input_Fs / FRAMES_PER_SEC + NS2SA_FX2( st_fx->input_Fs, DELAY_FIR_RESAMPL_NS ); - } - ELSE - { - st_fx->input_fx = st_fx->input_buff_fx + st_fx->input_Fs / FRAMES_PER_SEC; - } - } - ELSE - { - st_fx->hSignalBuf = NULL; - st_fx->Bin_E_old_fx = NULL; - st_fx->mem_decim_fx = NULL; - st_fx->mem_decim16k_fx = NULL; - st_fx->old_inp_12k8_fx = NULL; - st_fx->old_inp_16k_fx = NULL; - st_fx->buf_speech_enc_pe = NULL; - st_fx->buf_synth = NULL; - st_fx->buf_speech_enc = NULL; - st_fx->buf_wspeech_enc = NULL; - st_fx->input_buff_fx = NULL; - } - - /*-----------------------------------------------------------------* - * ACELP core parameters - *-----------------------------------------------------------------*/ - st_fx->last_core = -1; - move16(); - - if ( st_fx->Opt_AMR_WB ) - { - st_fx->last_core = AMR_WB_CORE; - move16(); - } - - st_fx->L_frame = L_FRAME; - move16(); - st_fx->last_coder_type = GENERIC; - move16(); - st_fx->last_total_brate = st_fx->total_brate; - move32(); - st_fx->last_total_brate_cng = -1; - move32(); - st_fx->last_core_brate = st_fx->total_brate; - move32(); - st_fx->extl = -1; - move16(); - st_fx->last_extl = -1; - move16(); - st_fx->last_L_frame = L_FRAME; - move16(); - st_fx->rate_switching_reset = 0; - move16(); - st_fx->rate_switching_reset_16kHz = 0; - move16(); - - /*-----------------------------------------------------------------* - * Bitstream - *-----------------------------------------------------------------*/ - - IF( !vad_only_flag ) - { - IF( ( st_fx->hBstr = (BSTR_ENC_HANDLE) malloc( sizeof( BSTR_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Bitstream structure\n" ) ); - } - } - ELSE - { - st_fx->hBstr = NULL; - } - - - Copy( GEWB_Ave_fx, st_fx->mem_AR_fx, M ); - Copy( GEWB_Ave_fx, st_fx->lsfoldbfi0_fx, M ); - Copy( GEWB_Ave_fx, st_fx->lsfoldbfi1_fx, M ); - Copy( GEWB_Ave_fx, st_fx->lsf_adaptive_mean_fx, M ); - init_lvq_fx( st_fx->offset_scale1_fx, st_fx->offset_scale2_fx, st_fx->offset_scale1_p_fx, st_fx->offset_scale2_p_fx, st_fx->no_scales_fx, st_fx->no_scales_p_fx ); - st_fx->next_force_safety_net = 0; - move16(); - st_fx->pstreaklen = 0; - move16(); - st_fx->streaklimit_fx = 32767; - move16(); /*1;//Q15 */ - set16_fx( st_fx->mem_MA_fx, 0, M ); - - init_gp_clip_fx( st_fx->clip_var_fx ); - pitch_ol_init_fx( &st_fx->old_thres_fx, &st_fx->old_pitch, &st_fx->delta_pit, &st_fx->old_corr_fx ); - - /*-----------------------------------------------------------------* - * AMR-WB IO initialization - *-----------------------------------------------------------------*/ - test(); - IF( st_fx->Opt_AMR_WB || EQ_16( st_fx->element_mode, EVS_MONO ) ) - { - IF( ( st_fx->hAmrwb_IO = (AMRWB_IO_ENC_HANDLE) malloc( sizeof( AMRWB_IO_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for AMR-WB IO\n" ) ); - } - - amr_wb_enc_init_fx( st_fx->hAmrwb_IO ); - } - ELSE - { - st_fx->hAmrwb_IO = NULL; - } - st_fx->clas = UNVOICED_CLAS; - move16(); - set16_fx( st_fx->old_wsp2_fx, 0, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); - set16_fx( st_fx->old_wsp_fx, 0, L_WSP_MEM ); - st_fx->mem_deemph_fx = 0; - move16(); - st_fx->mem_preemph_fx = 0; - move16(); - st_fx->mem_preemph16k_fx = 0; - move16(); - st_fx->mem_preemph_enc = 0; - move16(); - - /* AVQ pre-quantizer memory */ - st_fx->mem_preemp_preQ_fx = 0; - move16(); - st_fx->mem_deemp_preQ_fx = 0; - move16(); - st_fx->last_nq_preQ = 0; - move16(); - st_fx->use_acelp_preq = 0; - move16(); - - /* (Decimated) Weighted Speech Memory */ - st_fx->mem_wsp_enc = 0; - move16(); - - st_fx->mem_wsp_fx = 0; - move16(); - st_fx->mem_wsp_q = 0; - move16(); - set32_fx( st_fx->Bin_E_fx, 0, L_FFT ); - st_fx->q_Bin_E = Q31; - move16(); - set16_fx( st_fx->mem_decim2_fx, 0, 3 ); - set16_fx( st_fx->lgBin_E_fx, 0, L_FFT / 2 ); - - st_fx->ini_frame = 0; - move16(); - st_fx->ee_old_fx = 640; - move32(); /*chk //10 in Q6 */ - st_fx->Nb_ACELP_frames = 0; - move16(); - st_fx->audio_frame_cnt = AUDIO_COUNTER_INI; - move16(); /* Initializatin of the audio frame counter mildly into the audio mode */ - - /* adaptive lag window memory */ - st_fx->old_pitch_la = 0; - move16(); - st_fx->old_voicing_la = 0; - move16(); - set32_fx( st_fx->mem_hp20_in_fx, 0, 5 ); - - st_fx->old_hpfilt_in_fx = 0; - move16(); - st_fx->old_hpfilt_out_fx = 0; - move16(); - st_fx->EnergyLT_fx = 0; - move32(); - st_fx->prev_Q_new = 0; - move16(); - - - IF( EQ_32( st_fx->input_Fs, 8000 ) ) - { - st_fx->min_band = 1; - move16(); - st_fx->max_band = 16; - move16(); - } - ELSE - { - st_fx->min_band = 0; - move16(); - st_fx->max_band = 19; - move16(); - } - IF( st_fx->Opt_AMR_WB ) - { - Copy( mean_isf_amr_wb_fx, st_fx->lsf_old_fx, M ); - E_LPC_isf_isp_conversion( st_fx->lsf_old_fx, st_fx->lsp_old1_fx, M ); - } - ELSE - { - Copy( GEWB_Ave_fx, st_fx->lsf_old_fx, M ); - lsf2lsp_fx( st_fx->lsf_old_fx, st_fx->lsp_old1_fx, M, INT_FS_FX ); - } - - Copy( st_fx->lsf_old_fx, st_fx->lsf_old1_fx, M ); - Copy( st_fx->lsp_old1_fx, st_fx->lsp_old_fx, M ); - Copy( st_fx->lsp_old_fx, st_fx->lsp_old16k_fx, M ); - Copy( st_fx->lsp_old_fx, st_fx->lspold_enc_fx, M ); - - st_fx->stab_fac_fx = 0; - move16(); - /* Bass post-filter memories - encoder side of MODE2 */ - st_fx->bpf_off = 0; - move16(); - - /* TC mode */ - st_fx->tc_cnt = 0; - move16(); - st_fx->mCb1_fx = 0; - move16(); - - /* AC mode */ - - /*-----------------------------------------------------------------* - * parameters for AC coder type (GSC) - *-----------------------------------------------------------------*/ - - // st_fx->GSC_noisy_speech = 0; - st_fx->GSC_IVAS_mode = 0; - move16(); - test(); - test(); - IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) - { - IF( ( st_fx->hGSCEnc = (GSC_ENC_HANDLE) malloc( sizeof( GSC_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for GSC\n" ) ); - } - - GSC_enc_init_fx( st_fx->hGSCEnc ); - } - ELSE - { - st_fx->hGSCEnc = NULL; - } - - st_fx->last_ener_fx = 0; - move16(); - - st_fx->old_dE1_fx = 0; - move16(); - st_fx->old_ind_deltaMax = 0; - move32(); - set32_fx( st_fx->old_enr_ssf_fx, 0, 2 * NB_SSF ); - st_fx->spike_hyst = -1; - move16(); - st_fx->music_hysteresis_fx = 0; - move16(); /* Counter of frames after AUDIO frame to prevent UC */ - st_fx->last_harm_flag_acelp = 0; - move16(); - st_fx->GSC_noisy_speech = 0; - move16(); - - /* speech/music classifier */ - st_fx->Last_pulse_pos = 0; - move16(); - - st_fx->last_vad_spa_fx = 0; - move16(); - - /*-----------------------------------------------------------------* - * VAD - *-----------------------------------------------------------------*/ - - st_fx->vad_flag = 1; - st_fx->localVAD = 0; - move16(); - move16(); - test(); - test(); - test(); - test(); - IF( ( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || st_fx->element_mode == EVS_MONO ) && ( !vad_only_flag ) ) - { - if ( ( st_fx->hVAD = (VAD_HANDLE) malloc( sizeof( VAD_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VAD\n" ) ); - } - - wb_vad_init_fx( st_fx->hVAD ); - st_fx->hVAD->prim_act_quick_fx = 0; - move16(); - st_fx->hVAD->prim_act_slow_fx = 0; - move16(); - st_fx->hVAD->prim_act_fx = 0; - move16(); - st_fx->hVAD->prim_act_quick_he_fx = 0; - move16(); - st_fx->hVAD->prim_act_slow_he_fx = 0; - move16(); - st_fx->hVAD->prim_act_he_fx = 0; - move16(); - st_fx->hVAD->hangover_terminate_flag = 0; - move16(); - - st_fx->hVAD->consec_inactive = 0; - move16(); - st_fx->hVAD->spectral_tilt_reset = 1; - move16(); - st_fx->hVAD->running_avg_fx = 0; - move16(); - st_fx->hVAD->ra_deltasum_fx = 0; - move16(); - st_fx->hVAD->trigger_SID = 0; - move16(); - st_fx->hVAD->L_snr_sum_vad_fx = 0; - move32(); - } - ELSE - { - st_fx->hVAD = NULL; - } - - st_fx->Pos_relE_cnt = 5120; - move16(); /*20.0f*/ - st_fx->nb_active_frames_HE_SAD_fx = 0; - move16(); - st_fx->lp_speech_fx = 11520; - move16(); /*Q8 (45.0) */ /* Initialize the long-term active speech level in dB */ - - /* avoid uninitialized memory access */ - - /*-----------------------------------------------------------------* - * Noise estimator - *-----------------------------------------------------------------*/ - - test(); - test(); - IF( /*idchan == 0 ||*/ EQ_16( st_fx->element_mode, IVAS_CPE_TD ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || st_fx->element_mode == EVS_MONO ) - { - if ( ( st_fx->hNoiseEst = (NOISE_EST_HANDLE) malloc( sizeof( NOISE_EST_DATA ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Noise estimation\n" ); - } - noise_est_init_fx( st_fx->hNoiseEst ); - } - ELSE - { - st_fx->hNoiseEst = NULL; - } - - /*-----------------------------------------------------------------* - * Speech/music classifier - *-----------------------------------------------------------------*/ - test(); - test(); - test(); - IF( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || st_fx->element_mode == EVS_MONO ) - { - IF( ( st_fx->hSpMusClas = (SP_MUS_CLAS_HANDLE) malloc( sizeof( SP_MUS_CLAS_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Speech/music classifier\n" ) ); - } - - speech_music_clas_init_fx( st_fx->hSpMusClas ); - - st_fx->sp_aud_decision0 = 0; - st_fx->sp_aud_decision1 = 0; - st_fx->sp_aud_decision2 = 0; - move16(); - move16(); - move16(); - } - ELSE - { - st_fx->hSpMusClas = NULL; - } - - st_fx->bckr_tilt_lt = 0; - move32(); - - /* WB, SWB and FB bandwidth detector */ - st_fx->lt_mean_NB_fx = 0; - move16(); - st_fx->lt_mean_WB_fx = 0; - move16(); - st_fx->lt_mean_SWB_fx = 0; - move16(); - st_fx->count_WB = BWD_COUNT_MAX; - move16(); - st_fx->count_SWB = BWD_COUNT_MAX; - move16(); - st_fx->count_FB = BWD_COUNT_MAX; - move16(); - st_fx->bwidth = st_fx->max_bwidth; - move16(); - st_fx->last_input_bwidth = st_fx->bwidth; - move16(); - st_fx->last_bwidth = st_fx->bwidth; - move16(); - st_fx->last_bwidth_cng = st_fx->bwidth; - move16(); - - - move16(); - st_fx->coder_type_raw = VOICED; - st_fx->last_coder_type_raw = st_fx->coder_type_raw; - move16(); - st_fx->is_ism_format = 0; - move16(); - if ( NE_16( ism_mode, ISM_MODE_NONE ) ) - { - st_fx->is_ism_format = 1; - move16(); - } - /* Stationary noise UV modification */ - st_fx->ge_sm_fx = 640; - move32(); /*Q(GE_SHIFT) */ - st_fx->uv_count = 0; - move16(); - st_fx->act_count = 3; - move16(); - Copy( st_fx->lsp_old_fx, st_fx->lspold_s_fx, M ); - st_fx->noimix_seed = RANDOM_INITSEED; - move16(); - st_fx->min_alpha_fx = 1; - move16(); - st_fx->exc_pe_fx = 0; - move16(); - - /* CNG and DTX */ - st_fx->lp_noise_fx = 0; - move16(); - - test(); - test(); - IF( ( ( idchan == 0 && st_fx->Opt_DTX_ON ) || EQ_16( st_fx->element_mode, EVS_MONO ) ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && st_fx->Opt_DTX_ON ) ) - { - if ( ( st_fx->hDtxEnc = (DTX_ENC_HANDLE) malloc( sizeof( DTX_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX variables\n" ) ); - } - dtx_enc_init_fx( st_fx, st_fx->var_SID_rate_flag_fx, st_fx->interval_SID_fx ); - } - ELSE - { - st_fx->hDtxEnc = NULL; - } - - st_fx->fd_cng_reset_flag = 0; - move16(); - - IF( st_fx->Opt_DTX_ON ) - { - move16(); - } - st_fx->active_fr_cnt_fx = 0; - move16(); - st_fx->cng_type = -1; - move16(); - - - /*-----------------------------------------------------------------* - * LP-CNG - *-----------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - test(); - IF( ( ( idchan == 0 && st_fx->Opt_DTX_ON && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, EVS_MONO ) ) && !( EQ_16( ism_mode, ISM_MODE_PARAM ) || EQ_16( ism_mode, ISM_MODE_DISC ) ) ) - { - IF( ( st_fx->hTdCngEnc = (TD_CNG_ENC_HANDLE) malloc( sizeof( TD_CNG_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) ); - } - - td_cng_enc_init_fx( st_fx->hTdCngEnc, st_fx->Opt_DTX_ON, st_fx->max_bwidth ); - } - ELSE - { - st_fx->hTdCngEnc = NULL; - } - - - /*-----------------------------------------------------------------* - * ACELP LPDmem - *-----------------------------------------------------------------*/ - - test(); - test(); - IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) - { - IF( ( st_fx->hLPDmem = (LPD_state_HANDLE) malloc( sizeof( LPD_state ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LPDmem\n" ) ); - } - - LPDmem_enc_init_fx( st_fx->hLPDmem ); - } - ELSE - { - st_fx->hLPDmem = NULL; - } - - /* FEC */ - st_fx->last_clas = UNVOICED_CLAS; - move16(); - - FOR( i = 0; i < 2 * NB_SUBFR16k; i++ ) - { - st_fx->old_pitch_buf_fx[i] = L_SUBFR_Q6; - move16(); - } - st_fx->old_Es_pred_fx = 0; - move16(); - set16_fx( st_fx->old_Aq_12_8_fx + 1, 0, M ); - st_fx->old_Aq_12_8_fx[0] = 4096; - move16(); - - /*-----------------------------------------------------------------* - * CLDFB Analysis - *-----------------------------------------------------------------*/ - - /* open analysis for input SR */ - if ( ( error = openCldfb( &st_fx->cldfbAnaEnc, CLDFB_ANALYSIS, CLDFB_getNumChannels( st_fx->input_Fs ), st_fx->input_frame_fx ) ) != IVAS_ERR_OK ) - { - return error; - } - - if ( ( error = openCldfb( &st_fx->cldfbSynTd, CLDFB_SYNTHESIS, CLDFB_getNumChannels( 16000 ), L_FRAME16k ) ) != IVAS_ERR_OK ) - { - return error; - } - - st_fx->energyCoreLookahead_Fx = 0; - move32(); - st_fx->sf_energyCoreLookahead_Fx = 0; - move16(); - - /* stable short pitch detection */ - st_fx->voicing0_sm_fx = 0; - move16(); - st_fx->voicing_sm_fx = 0; - move16(); - st_fx->LF_EnergyRatio_sm_fx = 128; - move16(); - st_fx->predecision_flag = 0; - move16(); - st_fx->diff_sm_fx = 0; - move32(); - st_fx->energy_sm_fx = 0; - move32(); - - /*-----------------------------------------------------------------* - * SC-VBR parameters - *-----------------------------------------------------------------*/ - test(); - IF( st_fx->Opt_SC_VBR || st_fx->element_mode == EVS_MONO ) - { - IF( ( st_fx->hSC_VBR = (SC_VBR_ENC_HANDLE) malloc( sizeof( SC_VBR_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SC-VBR\n" ) ); - } - - sc_vbr_enc_init_fx( st_fx->hSC_VBR ); - } - ELSE - { - st_fx->hSC_VBR = NULL; - } - /* PLC encoder */ - IF( st_fx->element_mode == EVS_MONO ) - { - IF( ( st_fx->hPlcExt = (PLC_ENC_EVS_HANDLE) malloc( sizeof( PLC_ENC_EVS ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hPlcExt\n" ) ); - } - } - ELSE - { - st_fx->hPlcExt = NULL; - } - /*-----------------------------------------------------------------* - * Temporal Envelope Coding - *-----------------------------------------------------------------*/ - - IF( st_fx->element_mode == EVS_MONO ) - { - IF( ( st_fx->hTECEnc = (TEC_ENC_HANDLE) malloc( sizeof( TEC_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TEC\n" ) ); - } - } - ELSE - { - st_fx->hTECEnc = NULL; - } - - /*-----------------------------------------------------------------* - * SWB BWE parameters - *-----------------------------------------------------------------*/ - IF( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) - { - IF( ( st_fx->hBWE_FD = (FD_BWE_ENC_HANDLE) malloc( sizeof( FD_BWE_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FD BWE\n" ) ); - } - - fd_bwe_enc_init_fx( st_fx->hBWE_FD ); - } - ELSE - { - st_fx->hBWE_FD = NULL; - } - - st_fx->prev_Q_shb = 0; - move16(); - st_fx->last_Opt_SC_VBR = 0; - move16(); - - /*-----------------------------------------------------------------* - * TBE parameters - *-----------------------------------------------------------------*/ - - IF( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) - { - IF( ( st_fx->hBWE_TD = (TD_BWE_ENC_HANDLE) malloc( sizeof( TD_BWE_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); - } - - // IF ((error = openCldfb(&st_fx->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS)) != IVAS_ERR_OK) - //{ - // return error; - // } - - InitSWBencBuffer_fx( st_fx /*st_fx->hBWE_TD*/ ); - ResetSHBbuffer_Enc_fx( st_fx /*st_fx->hBWE_TD*/ ); - } - ELSE - { - st_fx->hBWE_TD = NULL; - // st_fx->cldfbSynTd = NULL; - } - - test(); - IF( st_fx->Opt_RF_ON || st_fx->element_mode == EVS_MONO ) - { - IF( ( st_fx->hRF = (RF_ENC_HANDLE) malloc( sizeof( RF_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for RF\n" ) ); - } - - /* initialize RF indice buffers */ - reset_rf_indices_fx( st_fx /*->hRF, st_fx->L_frame, &st->rf_target_bits_write*/ ); - } - ELSE - { - st_fx->hRF = NULL; - } - - - /*-----------------------------------------------------------------* - * HQ core parameters - *-----------------------------------------------------------------*/ - - st_fx->input_fx = st_fx->input_buff_fx + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ); - set16_fx( st_fx->input_buff_fx + L_FRAME48k, 0, L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); - st_fx->old_input_signal_fx = st_fx->input_fx - add( NS2SA_FX2( st_fx->input_Fs, DELAY_FIR_RESAMPL_NS ), st_fx->input_frame_fx ); - - - st_fx->Energy_Old_fx = 0; - move16(); - st_fx->Q_old_wtda = 15; - move16(); - st_fx->EnergyLT_fx = 1; - move32(); - st_fx->EnergyLT_fx_exp = 30; - move16(); /* Set to a High Exponent so it is 1^-30 */ - st_fx->TransientHangOver = 0; - move16(); - - /*-----------------------------------------------------------------* - * TCX core - *-----------------------------------------------------------------*/ - - // VE: reduction possible for MCT_CHAN_MODE_LFE channel - see I1-172 - test(); - IF( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) - { - IF( ( st_fx->hTcxEnc = (TCX_ENC_HANDLE) malloc( sizeof( TCX_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxEnc\n" ) ); - } - - /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */ - /*st_fx->hTcxEnc->spectrum[0] = st_fx->hTcxEnc->spectrum_long; - st_fx->hTcxEnc->spectrum[1] = st_fx->hTcxEnc->spectrum_long + N_TCX10_MAX;*/ - - st_fx->hTcxEnc->spectrum_fx[0] = st_fx->hTcxEnc->spectrum_long_fx; - st_fx->hTcxEnc->spectrum_fx[1] = st_fx->hTcxEnc->spectrum_long_fx + N_TCX10_MAX; - - set16_fx( st_fx->hTcxEnc->old_out_fx, 0, L_FRAME32k ); - st_fx->hTcxEnc->Q_old_out = 0; - move16(); - /* MDCT selector */ - MDCT_selector_reset_fx( st_fx->hTcxEnc ); - st_fx->hTcxEnc->Q_old_out = 0; - move16(); - - /* MDCT classifier */ - MDCT_classifier_reset_fx( st_fx->hTcxEnc ); - - IF( ( st_fx->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxCfg\n" ) ); - } - } - ELSE - { - st_fx->hTcxEnc = NULL; - // st_fx->hTcxCfg = NULL; - } - /*-----------------------------------------------------------------* - * HQ core parameters - *-----------------------------------------------------------------*/ - - test(); - test(); - IF( NE_16( st_fx->element_mode, IVAS_CPE_TD ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) && idchan == 0 ) - { - IF( ( st_fx->hHQ_core = (HQ_ENC_HANDLE) malloc( sizeof( HQ_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ core\n" ) ); - } - - HQ_core_enc_init_fx( st_fx->hHQ_core ); - } - ELSE - { - st_fx->hHQ_core = NULL; - } - - st_fx->last_enerBuffer_exp = 0; - move16(); - - /*-----------------------------------------------------------------* - * Channel-aware mode - *-----------------------------------------------------------------*/ - - - test(); - test(); - test(); - IF( st_fx->Opt_RF_ON == 0 || ( NE_16( st_fx->bwidth, WB ) && NE_16( st_fx->bwidth, SWB ) ) || NE_32( st_fx->total_brate, ACELP_13k20 ) ) - { - IF( EQ_16( st_fx->Opt_RF_ON, 1 ) ) - { - printf( "\nWarning: Channel-aware mode only available for 13.2 kbps WB/SWB\n" ); - printf( " Switched to normal mode!\n" ); - st_fx->Opt_RF_ON = 0; - move16(); - st_fx->rf_fec_offset = 0; - move16(); - } - st_fx->rf_mode = 0; - move16(); - } - ELSE - { - st_fx->rf_mode = st_fx->Opt_RF_ON; - move16(); - } - st_fx->rf_mode_last = st_fx->rf_mode; - move16(); - /* initialize RF indice buffers */ - reset_rf_indices_fx( st_fx ); - - /*-----------------------------------------------------------------* - * MODE2 initialization - *-----------------------------------------------------------------*/ - - st_fx->last_sr_core = i_mult2( st_fx->last_L_frame, 50 ); - move16(); - /*-----------------------------------------------------------------* - * IGF - *-----------------------------------------------------------------*/ - - test(); - IF( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) - { - IF( ( st_fx->hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) ); - } - } - ELSE - { - st_fx->hIGFEnc = NULL; - move16(); - } - - IF( EQ_16( st_fx->codec_mode, MODE2 ) ) - { - st_fx->igf = getIgfPresent_fx( st_fx->element_mode, st_fx->total_brate, st_fx->bwidth, st_fx->rf_mode ); - } - ELSE - { - st_fx->igf = 0; - move16(); - } - - /* FD-CNG encoder */ - createFdCngEnc_fx( &st_fx->hFdCngEnc ); - initFdCngEnc_fx( st_fx->hFdCngEnc, st_fx->input_Fs, st_fx->cldfbAnaEnc->scale ); - L_tmp = st_fx->total_brate; - move32(); - test(); - if ( st_fx->rf_mode && EQ_32( st_fx->total_brate, ACELP_13k20 ) ) - { - L_tmp = ACELP_9k60; - move32(); - } - configureFdCngEnc_fx( st_fx->hFdCngEnc, st_fx->bwidth, L_tmp ); - - st_fx->last_totalNoise_fx = 0; - move16(); - set16_fx( st_fx->totalNoise_increase_hist_fx, 0, TOTALNOISE_HIST_SIZE ); - st_fx->totalNoise_increase_len = 0; - move16(); - init_coder_ace_plus_fx( st_fx, st_fx->last_total_brate, 0, -10 /*hack*/ ); - // PMT("Transient detector init needs review, handle hTranDet is missing") - InitTransientDetection_fx( extract_l( Mult_32_16( st_fx->input_Fs, 0x0290 ) ), - NS2SA_FX2( st_fx->input_Fs, DELAY_FIR_RESAMPL_NS ), - &st_fx->transientDetection ); - - st_fx->Q_syn2 = 0; - move16(); - st_fx->Q_syn = 0; - move16(); - set16_fx( st_fx->Q_max, Q_MAX, L_Q_MEM ); - set16_fx( st_fx->Q_max_16k, Q_MAX, L_Q_MEM ); - st_fx->Q_old = 15; - move16(); - st_fx->old_wsp_max = 0; - move16(); - st_fx->old_wsp_shift = 0; - move16(); - st_fx->sharpFlag = 0; - move16(); - - st_fx->tdm_LRTD_flag = 0; /* LRTD stereo mode flag */ - move16(); - st_fx->cna_dirac_flag = 0; /* CNA in DirAC flag */ - move16(); - st_fx->cng_sba_flag = 0; /* CNG in SBA flag */ - move16(); - st_fx->GSC_IVAS_mode = 0; /* CNG in SBA flag */ - move16(); - st_fx->element_mode = EVS_MONO; /* element mode */ - move16(); - st_fx->last_element_mode = st_fx->element_mode; /* element mode */ - move16(); - st_fx->element_brate = -1; /* element bitrate */ - move32(); - // PMT("element_mode and element_brate should be initialized at a proper place in ivas_dec_init eventually") - st_fx->low_rate_mode = 0; /* low-rate mode flag */ - move16(); - // st_fx->coder_type = GENERIC; /* low-rate mode flag */ - - set16_fx( st_fx->pitch, L_SUBFR, 3 ); - set16_fx( st_fx->voicing_fx, 0, 3 ); - - -#ifdef DEBUGGING - st_fx->id_element = -1; /* element ID */ - move16(); -#endif - st_fx->extl_orig = -1; /* extension layer */ - move16(); - st_fx->extl_brate_orig = 0; /* extension layer bitrate */ - move32(); - return error; -} -/*-----------------------------------------------------------------------* - * LPDmem_enc_init_fx() - * - * Initialization of ACELP LPDmem state variables - *-----------------------------------------------------------------------*/ - -void LPDmem_enc_init_fx( - LPD_state_HANDLE hLPDmem /* i/o: LP memories */ -) -{ - Word16 i; - - set16_fx( hLPDmem->syn, 0, 1 + M ); - set16_fx( hLPDmem->old_exc, 0, L_EXC_MEM ); - set16_fx( hLPDmem->mem_syn, 0, M ); - set16_fx( hLPDmem->mem_syn1_fx, 0, M ); - set16_fx( hLPDmem->mem_syn2, 0, M ); - set16_fx( hLPDmem->mem_syn_r, 0, L_SYN_MEM ); - set16_fx( hLPDmem->mem_syn3, 0, M ); - - hLPDmem->mem_w0 = 0; - move16(); - hLPDmem->tilt_code = 0; - move16(); - hLPDmem->gc_threshold = 0; - move32(); - hLPDmem->dm_fx.prev_state = 0; - move16(); /* This corresponds to st_fx->dispMem in FLP */ - hLPDmem->dm_fx.prev_gain_code = 0; - move32(); - - FOR( i = 2; i < 8; i++ ) - { - hLPDmem->dm_fx.prev_gain_pit[i - 2] = 0; - move16(); - } - return; -} - -void LPDmem_enc_init_ivas_fx( - LPD_state_HANDLE hLPDmem /* i/o: LP memories */ -) -{ - Word16 i; - - set16_fx( hLPDmem->syn, 0, 1 + M ); - set16_fx( hLPDmem->old_exc, 0, L_EXC_MEM ); - set16_fx( hLPDmem->mem_syn, 0, M ); - set16_fx( hLPDmem->mem_syn1_fx, 0, M ); - set16_fx( hLPDmem->mem_syn2, 0, M ); - set16_fx( hLPDmem->mem_syn_r, 0, L_SYN_MEM ); - set16_fx( hLPDmem->mem_syn3, 0, M ); - hLPDmem->q_lpd_syn = Q15; - move16(); - hLPDmem->mem_w0 = 0; - move16(); - hLPDmem->tilt_code = 0; - move16(); - hLPDmem->gc_threshold = 0; - move32(); - hLPDmem->q_mem_syn = Q15; - move16(); - hLPDmem->dm_fx.prev_state = 0; - move16(); /* This corresponds to st_fx->dispMem in FLP */ - hLPDmem->dm_fx.prev_gain_code = 0; - move32(); - - FOR( i = 2; i < 8; i++ ) - { - hLPDmem->dm_fx.prev_gain_pit[i - 2] = 0; - move16(); - } - - hLPDmem->q_lpd_syn = Q15; - move16(); - hLPDmem->q_lpd_old_exc = Q15; - move16(); - hLPDmem->q_mem_syn = Q15; - move16(); - - return; -} - -/*-----------------------------------------------------------------------* - * destroy_encoder_fx() - * - * Free memory which was allocated in init_encoder_fx() - *-----------------------------------------------------------------------*/ - -void destroy_encoder_fx( - Encoder_State *st_fx /* i/o: Encoder static variables structure */ -) -{ - deleteCldfb( &st_fx->cldfbAnaEnc ); - deleteCldfb( &st_fx->cldfbSynTd ); - - deleteFdCngEnc_fx( &st_fx->hFdCngEnc ); - - return; -} - -ivas_error init_encoder_ivas_fx( - Encoder_State *st, /* i/o: state structure */ - Encoder_Struct *st_ivas, /* i/o: encoder state structure */ - const Word16 idchan, /* i : channel ID */ - const Word16 var_SID_rate_flag, /* i : flag for variable SID update rate */ - const Word16 interval_SID, /* i : interval for SID update */ - const Word16 vad_only_flag, /* i : flag to indicate front-VAD structure */ - const ISM_MODE ism_mode, /* i : ISM mode */ - const Word32 element_brate /* i : element bitrate */ +ivas_error init_encoder_fx( + Encoder_State *st, /* i/o: state structure */ + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ + const Word16 idchan, /* i : channel ID */ + const Word16 vad_only_flag, /* i : flag to indicate front-VAD structure */ + const ISM_MODE ism_mode, /* i : ISM mode */ + const Word32 element_brate /* i : element bitrate */ ) { - Word16 i; + Word16 i, input_frame; ivas_error error; Word32 igf_brate; - error = IVAS_ERR_OK; - move32(); + /* input_frame = st->input_Fs / FRAMES_PER_SEC */ + input_frame = extract_l( Mpy_32_32( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + + input_frame = extract_l( Mpy_32_32_r( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); /*-----------------------------------------------------------------* * General parameters @@ -1127,8 +130,7 @@ ivas_error init_encoder_ivas_fx( st->is_ism_format = 0; move16(); - - IF( NE_16( ism_mode, ISM_MODE_NONE ) ) + if ( NE_16( ism_mode, ISM_MODE_NONE ) ) { st->is_ism_format = 1; move16(); @@ -1168,6 +170,7 @@ ivas_error init_encoder_ivas_fx( Copy( GEWB_Ave_fx, st->lsfoldbfi0_fx, M ); Copy( GEWB_Ave_fx, st->lsfoldbfi1_fx, M ); Copy( GEWB_Ave_fx, st->lsf_adaptive_mean_fx, M ); + init_lvq_fx( st->offset_scale1_fx, st->offset_scale2_fx, st->offset_scale1_p_fx, st->offset_scale2_p_fx, st->no_scales_fx, st->no_scales_p_fx ); st->next_force_safety_net = 0; move16(); @@ -1178,17 +181,24 @@ ivas_error init_encoder_ivas_fx( move16(); set16_fx( st->mem_MA_fx, 0, M ); + st->mCb1_fx = 0; + move16(); + init_gp_clip_fx( st->clip_var_fx ); + pitch_ol_init_fx( &st->old_thres_fx, &st->old_pitch, &st->delta_pit, &st->old_corr_fx ); + set16_fx( st->old_wsp_fx, 0, L_WSP_MEM ); st->exp_old_wsp = 0; move16(); - set16_fx( st->old_wsp2_fx, 0, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); // Needs to change depending on usage. + set16_fx( st->old_wsp2_fx, 0, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); st->Q_old_wsp2 = 0; move16(); st->mem_preemph_fx = 0; move16(); + st->mem_preemph_fx_q_inp = 0; + move16(); st->mem_preemph16k_fx = 0; move16(); st->mem_preemph_enc = 0; @@ -1196,16 +206,6 @@ ivas_error init_encoder_ivas_fx( st->exp_mem_preemph_enc = 0; move16(); -#if 1 // TODO: Float Initializations. To be removed later - st->active_cnt = 0; - move16(); -#endif - - st->pst_mem_deemp_err_fx = 0; - move16(); - st->pst_lp_ener_fx = 0; - move16(); - /* AVQ pre-quantizer memory */ st->mem_preemp_preQ_fx = 0; move16(); @@ -1227,10 +227,13 @@ ivas_error init_encoder_ivas_fx( move16(); st->mem_wsp_q = 0; move16(); + set16_fx( st->mem_decim2_fx, 0, 3 ); set32_fx( st->Bin_E_fx, 0, L_FFT ); st->q_Bin_E = Q31; move16(); + set16_fx( st->lgBin_E_fx, 0, L_FFT / 2 ); + st->ee_old_fx = 640; /* 10.0f in Q6 */ move16(); st->Nb_ACELP_frames = 0; @@ -1241,6 +244,8 @@ ivas_error init_encoder_ivas_fx( /* adaptive lag window memory */ st->old_pitch_la = 0; move16(); + st->old_voicing_la = 0; + move16(); st->prev_Q_new = 0; move16(); @@ -1303,6 +308,8 @@ ivas_error init_encoder_ivas_fx( /* stereo switching memories */ st->mem_preemph_DFT_fx = 0; move16(); + st->mem_preemph_DFT_fx_q_inp = 0; + move16(); set16_fx( st->inp_12k8_mem_stereo_sw_fx, 0, sub( sub( STEREO_DFT_OVL_12k8, L_MEM_RECALC_12K8 ), L_FILT ) ); st->mem_preemph16k_DFT_fx = 0; move16(); @@ -1327,6 +334,7 @@ ivas_error init_encoder_ivas_fx( move16(); st->Q_stat_noise = 15; move16(); + /* FEC */ st->last_clas = UNVOICED_CLAS; move16(); @@ -1398,14 +406,11 @@ ivas_error init_encoder_ivas_fx( st->exp_buf_wspeech_enc = 0; move16(); /* initializations */ -#ifndef MSAN_FIX - set32_fx( st->Bin_E_old_fx, 0, shr( L_FFT, 2 ) ); -#else set32_fx( st->Bin_E_old_fx, 0, L_FFT / 2 ); -#endif st->q_Bin_E_old = Q31; move16(); set16_fx( st->mem_decim_fx, 0, shl( L_FILT_MAX, 1 ) ); + set16_fx( st->mem_decim_fx_q_inp, 0, shl( L_FILT_MAX, 1 ) ); set16_fx( st->mem_decim16k_fx, 0, shl( L_FILT_MAX, 1 ) ); set16_fx( st->old_inp_12k8_fx, 0, L_INP_MEM ); set16_fx( st->old_inp_16k_fx, 0, L_INP_MEM ); @@ -1419,27 +424,32 @@ ivas_error init_encoder_ivas_fx( set16_fx( st->input_buff_fx, 0, add( L_FRAME48k, add( L_FRAME48k, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ) ); st->q_inp = Q15; move16(); + st->mem_preemph_q = Q15; + move16(); + st->mem_q = Q15; + move16(); st->q_old_inp = Q15; move16(); set32_fx( st->input_buff32_fx, 0, add( L_FRAME48k, add( L_FRAME48k, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ) ); st->q_inp32 = Q31; move16(); - st->old_input_signal_fx = st->input_buff_fx; - /* st->input_Fs / FRAMES_PER_SEC */ - Word16 frame_length = extract_l( Mpy_32_32( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + st->q_old_inp32 = Q31; + move16(); IF( st->element_mode == EVS_MONO ) { - st->input32_fx = st->input_buff32_fx + st->input_Fs / FRAMES_PER_SEC + NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ); - st->input_fx = st->input_buff_fx + add( frame_length, (Word16) NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ) ); + st->input32_fx = st->input_buff32_fx + add( input_frame, NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ) ); + st->input_fx = st->input_buff_fx + add( L_FRAME48k, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); ///////////////////// input_Fs + st->old_input_signal_fx = st->input_fx - add( NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), input_frame ); + st->old_input_signal32_fx = st->input_buff32_fx; } ELSE { - st->input32_fx = st->input_buff32_fx + Mpy_32_32( st->input_Fs, 42949673 ) /* 1/50 in Q31*/; // st->input_Fs / FRAMES_PER_SEC - st->input_fx = st->input_buff_fx + frame_length; + st->input32_fx = st->input_buff32_fx + input_frame; + st->input_fx = st->input_buff_fx + input_frame; + st->old_input_signal_fx = st->input_buff_fx; + st->old_input_signal32_fx = st->input_buff32_fx; } -#if 1 // TODO: To be removed later -#endif } ELSE { @@ -1454,8 +464,6 @@ ivas_error init_encoder_ivas_fx( st->buf_speech_enc = NULL; st->buf_wspeech_enc = NULL; st->input_buff_fx = NULL; -#if 1 -#endif } /*-----------------------------------------------------------------* @@ -1472,7 +480,14 @@ ivas_error init_encoder_ivas_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Noise estimation\n" ); } - noise_est_init_ivas_fx( st->hNoiseEst ); + IF( st->element_mode == EVS_MONO ) + { + noise_est_init_fx( st->hNoiseEst ); + } + ELSE + { + noise_est_init_ivas_fx( st->hNoiseEst ); + } } ELSE { @@ -1495,7 +510,7 @@ ivas_error init_encoder_ivas_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VAD\n" ) ); } - wb_vad_init_ivas_fx( st->hVAD ); + wb_vad_init_fx( st->hVAD ); } ELSE { @@ -1507,14 +522,10 @@ ivas_error init_encoder_ivas_fx( /* CLDFB-based VAD */ IF( st->element_mode == EVS_MONO ) { - /* This is done to as in EVS T_CldfbVadState structure is present in Encoder State */ - /* - if ( ( st->hVAD_CLDFB = (VAD_CLDFB_HANDLE) malloc( sizeof( T_CldfbVadState ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB VAD\n" ) ); - } - */ - st->hVAD_CLDFB = &st->vad_st; + if ( ( st->hVAD_CLDFB = (VAD_CLDFB_HANDLE) malloc( sizeof( T_CldfbVadState ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB VAD\n" ) ); + } vad_init_fx( st->hVAD_CLDFB ); } @@ -1534,7 +545,14 @@ ivas_error init_encoder_ivas_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Speech/music classifier\n" ) ); } - speech_music_clas_init_ivas_fx( st->hSpMusClas ); + IF( st->element_mode == EVS_MONO ) + { + speech_music_clas_init_fx( st->hSpMusClas ); + } + ELSE + { + speech_music_clas_init_ivas_fx( st->hSpMusClas ); + } st->sp_aud_decision0 = 0; move16(); st->sp_aud_decision1 = 0; @@ -1547,7 +565,6 @@ ivas_error init_encoder_ivas_fx( st->hSpMusClas = NULL; } - /*-----------------------------------------------------------------* * WB, SWB and FB bandwidth detector *-----------------------------------------------------------------*/ @@ -1575,15 +592,19 @@ ivas_error init_encoder_ivas_fx( st->bwidth_sw_cnt = 0; move16(); - /*-----------------------------------------------------------------* * DTX *-----------------------------------------------------------------*/ st->lp_speech_fx = 11520; /*Q8 (45.0) */ /* Initialize the long-term active speech level in dB */ move16(); + st->lp_speech_32fx = 754974720; /*Q24 (45.0) */ /* Initialize the long-term active speech level in dB */ + move32(); st->lp_noise_fx = 0; move16(); + st->lp_noise_32fx = 0; + move16(); + st->flag_noisy_speech_snr = 0; move16(); st->fd_cng_reset_flag = 0; @@ -1605,7 +626,7 @@ ivas_error init_encoder_ivas_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX variables\n" ) ); } - dtx_enc_init_fx( st, var_SID_rate_flag, interval_SID ); + dtx_enc_init_fx( st, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID ); } ELSE { @@ -1646,7 +667,7 @@ ivas_error init_encoder_ivas_fx( st->rf_mode = 0; move16(); - return error; + return IVAS_ERR_OK; } /*-----------------------------------------------------------------* @@ -1665,7 +686,14 @@ ivas_error init_encoder_ivas_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) ); } - td_cng_enc_init_ivas_fx( st->hTdCngEnc, st->Opt_DTX_ON, st->max_bwidth ); + IF( st->element_mode == EVS_MONO ) + { + td_cng_enc_init_fx( st->hTdCngEnc, st->Opt_DTX_ON, st->max_bwidth ); + } + ELSE + { + td_cng_enc_init_ivas_fx( st->hTdCngEnc, st->Opt_DTX_ON, st->max_bwidth ); + } } ELSE { @@ -1675,14 +703,26 @@ ivas_error init_encoder_ivas_fx( /*-----------------------------------------------------------------* * CLDFB & resampling tools parameters *-----------------------------------------------------------------*/ + test(); test(); test(); IF( ( NE_16( st->element_mode, IVAS_CPE_MDCT ) && idchan == 0 ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) ) { - IF( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, ENC ) ) != IVAS_ERR_OK ) + IF( st->element_mode == EVS_MONO ) { - return error; + /* open analysis for input SR */ + IF( ( error = openCldfb( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE + { + IF( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, ENC ) ) != IVAS_ERR_OK ) + { + return error; + } } } ELSE @@ -1690,10 +730,20 @@ ivas_error init_encoder_ivas_fx( st->cldfbAnaEnc = NULL; } - st->energyCoreLookahead_Fx = 2; /* 6.1e-5f in Q15 */ - move32(); - st->sf_energyCoreLookahead_Fx = 2; /* 6.1e-5f in Q15 */ - move16(); + IF( st->element_mode == EVS_MONO ) + { + st->energyCoreLookahead_Fx = 0; + move32(); + st->sf_energyCoreLookahead_Fx = 0; + move16(); + } + ELSE + { + st->energyCoreLookahead_Fx = 2; /* 6.1e-5f in Q15 */ + move32(); + st->sf_energyCoreLookahead_Fx = 2; /* 6.1e-5f in Q15 */ + move16(); + } /*-----------------------------------------------------------------* * SC-VBR parameters @@ -1717,7 +767,6 @@ ivas_error init_encoder_ivas_fx( st->last_Opt_SC_VBR = 0; move16(); - /*-----------------------------------------------------------------* * AMR-WB IO initialization *-----------------------------------------------------------------*/ @@ -1750,7 +799,7 @@ ivas_error init_encoder_ivas_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LPDmem\n" ) ); } - LPDmem_enc_init_ivas_fx( st->hLPDmem ); + LPDmem_enc_init_fx( st->hLPDmem ); } ELSE { @@ -1794,13 +843,25 @@ ivas_error init_encoder_ivas_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); } - IF( ( error = openCldfb_ivas_fx( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS, ENC ) ) != IVAS_ERR_OK ) + IF( st->element_mode == EVS_MONO ) { - return error; + if ( ( error = openCldfb( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000 ) ) != IVAS_ERR_OK ) + { + return error; + } + + InitSWBencBuffer_fx( st->hBWE_TD ); } + ELSE + { + IF( ( error = openCldfb_ivas_fx( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS, ENC ) ) != IVAS_ERR_OK ) + { + return error; + } - InitSWBencBuffer_ivas_fx( st ); - ResetSHBbuffer_Enc_fx( st ); + InitSWBencBuffer_ivas_fx( st->hBWE_TD ); + } + ResetSHBbuffer_Enc_fx( st->hBWE_TD ); } ELSE { @@ -1821,16 +882,15 @@ ivas_error init_encoder_ivas_fx( } fd_bwe_enc_init_fx( st->hBWE_FD ); -#ifdef MSAN_FIX - st->Q_old_wtda = 0; - move16(); -#endif } ELSE { st->hBWE_FD = NULL; } + st->prev_Q_shb = 0; + move16(); + /*-----------------------------------------------------------------* * HQ core parameters *-----------------------------------------------------------------*/ @@ -1856,6 +916,15 @@ ivas_error init_encoder_ivas_fx( move16(); st->EnergyLT_fx = 0; move32(); + st->Q_old_wtda = 0; + move16(); + IF( st->element_mode == EVS_MONO ) + { + st->EnergyLT_fx = 1; + move32(); + st->Q_old_wtda = 15; + move16(); + } st->Energy_Old_fx = 0; move32(); st->TransientHangOver = 0; @@ -1934,6 +1003,7 @@ ivas_error init_encoder_ivas_fx( set32_fx( st->hTcxEnc->spectrum_long_fx, 0, N_MAX ); st->hTcxEnc->spectrum_long_e = 0; move16(); + /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */ st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx; st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX; @@ -1942,12 +1012,6 @@ ivas_error init_encoder_ivas_fx( st->hTcxEnc->spectrum_e[0] = st->hTcxEnc->spectrum_e[1] = 0; move16(); move16(); -#if 1 - // set_f( st->hTcxEnc->spectrum_long, 0, N_MAX ); - // st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long; - // st->hTcxEnc->spectrum[1] = st->hTcxEnc->spectrum_long + N_TCX10_MAX; - // set_f( st->hTcxEnc->old_out, 0, L_FRAME32k ); -#endif set16_fx( st->hTcxEnc->old_out_fx, 0, L_FRAME32k ); st->hTcxEnc->Q_old_out = 0; @@ -2049,7 +1113,6 @@ ivas_error init_encoder_ivas_fx( st->last_sr_core = L_mult0( st->last_L_frame, FRAMES_PER_SEC ); move32(); - /* PLC encoder */ IF( st->element_mode == EVS_MONO ) { @@ -2069,46 +1132,34 @@ ivas_error init_encoder_ivas_fx( set16_fx( st->totalNoise_increase_hist_fx, 0, TOTALNOISE_HIST_SIZE ); st->totalNoise_increase_len = 0; move16(); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; - IF( hTcxEnc != NULL ) - { - hTcxEnc->L_frameTCX = extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ); /* 0x0290 is 1/FRAMES_PER_SEC in Q15*/ - move16(); - } - st->currEnergyHF_fx = 0; - move32(); - st->currEnergyHF_e_fx = 0; - move16(); -#ifdef MSAN_FIX st->prevEnergyHF_fx = 0; move32(); -#endif - /* Initialize TCX */ + IF( st->element_mode == EVS_MONO ) + { + init_coder_ace_plus_fx( st, st->last_total_brate, 0, -10 /*hack*/ ); + } + ELSE + { + /* Initialize Signal Buffers */ + Word16 shift = getScaleFactor16( st->old_inp_16k_fx, L_INP_MEM ); + Scale_sig( st->old_inp_16k_fx, L_INP_MEM, shift ); + st->exp_old_inp_16k = sub( st->exp_old_inp_16k, shift ); + move16(); + shift = getScaleFactor16( st->old_inp_12k8_fx, L_INP_MEM ); + Scale_sig( st->old_inp_12k8_fx, L_INP_MEM, shift ); + st->exp_old_inp_12k8 = sub( st->exp_old_inp_12k8, shift ); + move16(); - /* Initialize Signal Buffers */ - Word16 shift = getScaleFactor16( st->old_inp_16k_fx, L_INP_MEM ); - Scale_sig( st->old_inp_16k_fx, L_INP_MEM, shift ); - st->exp_old_inp_16k = sub( st->exp_old_inp_16k, shift ); - move16(); - shift = getScaleFactor16( st->old_inp_12k8_fx, L_INP_MEM ); - Scale_sig( st->old_inp_12k8_fx, L_INP_MEM, shift ); - st->exp_old_inp_12k8 = sub( st->exp_old_inp_12k8, shift ); - move16(); - /* Initialize ACELP */ -#endif -#ifdef FIX_920_IGF_INIT_ERROR - init_coder_ace_plus_ivas_fx( st, st->last_total_brate, igf_brate, 0 ); -#else - init_coder_ace_plus_ivas_fx( st, st->last_total_brate, 0 ); -#endif + init_coder_ace_plus_ivas_fx( st, st->last_total_brate, igf_brate, 0 ); + } IF( st->hLPDmem != NULL ) { st->hLPDmem->q_lpd_old_exc = st->prev_Q_new; move16(); } + /*-----------------------------------------------------------------* * FD-CNG encoder *-----------------------------------------------------------------*/ @@ -2119,8 +1170,13 @@ ivas_error init_encoder_ivas_fx( test(); IF( ( idchan == 0 && st->Opt_DTX_ON ) || st->element_mode == EVS_MONO || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) ) { - createFdCngEnc_fx( &st->hFdCngEnc ); + IF( ( error = createFdCngEnc_fx( &st->hFdCngEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + initFdCngEnc_fx( st->hFdCngEnc, st->input_Fs, st->cldfbAnaEnc->scale ); + /* initialization for IVAS modes happens in first frame pre-processing */ IF( st->element_mode == EVS_MONO ) { @@ -2138,7 +1194,7 @@ ivas_error init_encoder_ivas_fx( move32(); } - configureFdCngEnc_ivas_fx( st->hFdCngEnc, st->bwidth, total_brate ); + configureFdCngEnc_fx( st->hFdCngEnc, st->bwidth, total_brate ); } } ELSE @@ -2154,17 +1210,14 @@ ivas_error init_encoder_ivas_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Transient Detection\n" ) ); } - Word16 temp; - Word16 frame_length = BASOP_Util_Divide3232_Scale( st->input_Fs, FRAMES_PER_SEC, &temp ); - frame_length = shr( frame_length, sub( 15, temp ) ); IF( GT_16( st->element_mode, EVS_MONO ) ) { - InitTransientDetection_ivas_fx( frame_length, 0, st->hTranDet, 1 ); + InitTransientDetection_ivas_fx( input_frame, 0, st->hTranDet, 1 ); } ELSE { - InitTransientDetection_ivas_fx( frame_length, NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet, 0 ); + InitTransientDetection_fx( input_frame, NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet ); } /*-----------------------------------------------------------------* @@ -2191,10 +1244,60 @@ ivas_error init_encoder_ivas_fx( move16(); st->old_wsp_shift = 0; move16(); - st->sharpFlag = 0; +#ifdef DEBUGGING + st->id_element = -1; /* element ID */ + move16(); +#endif + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * LPDmem_enc_init() + * + * Initialization of ACELP LPDmem state variables + *-----------------------------------------------------------------------*/ + +void LPDmem_enc_init_fx( + LPD_state_HANDLE hLPDmem /* i/o: LP memories */ +) +{ + Word16 i; + + set16_fx( hLPDmem->syn, 0, 1 + M ); + set16_fx( hLPDmem->old_exc, 0, L_EXC_MEM ); + set16_fx( hLPDmem->mem_syn, 0, M ); + set16_fx( hLPDmem->mem_syn1_fx, 0, M ); + set16_fx( hLPDmem->mem_syn2, 0, M ); + set16_fx( hLPDmem->mem_syn_r, 0, L_SYN_MEM ); + set16_fx( hLPDmem->mem_syn3, 0, M ); + + hLPDmem->q_lpd_old_exc = Q15; + move16(); + hLPDmem->q_lpd_syn = Q15; + move16(); + hLPDmem->q_mem_syn = Q15; + move16(); + + hLPDmem->mem_w0 = 0; + move16(); + hLPDmem->tilt_code = 0; move16(); + hLPDmem->gc_threshold = 0; + move32(); + hLPDmem->dm_fx.prev_state = 0; + move16(); /* This corresponds to st_fx->dispMem in FLP */ + hLPDmem->dm_fx.prev_gain_code = 0; + move32(); + + FOR( i = 2; i < 8; i++ ) + { + hLPDmem->dm_fx.prev_gain_pit[i - 2] = 0; + move16(); + } - return error; + return; } @@ -2208,8 +1311,8 @@ void destroy_cldfb_encoder_fx( Encoder_State *st /* i/o: Encoder static variables structure */ ) { - deleteCldfb_ivas_fx( &st->cldfbSynTd ); - deleteCldfb_ivas_fx( &st->cldfbAnaEnc ); + deleteCldfb_fx( &st->cldfbSynTd ); + deleteCldfb_fx( &st->cldfbAnaEnc ); deleteFdCngEnc_fx( &st->hFdCngEnc ); diff --git a/lib_enc/inov_enc_fx.c b/lib_enc/inov_enc_fx.c index 46bec5f4d9e8b41563b4ab1ca6246fdf2dd54249..81b9ba49e904333c5881cfc372e0e98dfe11db49 100644 --- a/lib_enc/inov_enc_fx.c +++ b/lib_enc/inov_enc_fx.c @@ -1,12 +1,11 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" -#include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "ivas_prot_fx.h" /* Function prototypes */ @@ -14,47 +13,46 @@ /*==============================================================================*/ -/* FUNCTION : inov_encode_fx() */ +/* FUNCTION : inov_encode_fx() */ /*------------------------------------------------------------------------------*/ -/* PURPOSE : Encode the algebraic innovation */ +/* PURPOSE : Encode the algebraic innovation */ /*------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) core_brate: core bitrate Q0 */ -/* _ (Word16) Opt_AMR_WB: flag indicating AMR-WB IO mode Q0 */ -/* _ (Word16) bwidth : input signal bandwidth Q0 */ -/* _ (Word16) L_frame_fx : length of the frame Q0 */ -/* _ (Word16[]) h2 : weighted filter input response Q12 */ -/* _ (Word16[]) xn2 : target vector Q_new */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) i_subfr : current sub frame indicator Q0 */ -/* _ (Word16[]) exc_fx : pointer to excitation signal frame Q_new */ -/* _ (Word16) L_subfr : subframe length Q0 */ -/* _ (Word16) clip_gain : adaptive gain clipping flag Q0 */ -/* _ (Word16) gain_pit : adaptive excitation gain Q14 */ -/* _ (Word16) sharpFlag : formant sharpening flag Q0 */ -/* _ (Word16) tc_subfr : TC subframe index Q0 */ -/* _ (Word16) p_Aq : LP filter coefficients Q12 */ -/* _ (Word16) Jopt_flag :joint optimization flag Q0 */ -/* _ (Word16) y1 : Filtered adaptive excitation Q_new */ -/* _ (Word16) y2 :zero-memory filtered algebraic excitation Q_new */ -/* _ (Word16) cn : target vector in residual domain Q_new */ -/* _ (Word16) tilt_code : tilt of the excitation of previous subframe Q15 */ -/* _ (Word16) pt_pitch : pointer to current subframe fractional pitchQ6 */ -/* _ (Word16) index_buf_4T :5Sx4Track buffer for PI Q0 */ -/* _ (Word16) shift :shift */ -/* _ (Word16) Q_new : */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) core_brate: core bitrate Q0 */ +/* _ (Word16) Opt_AMR_WB: flag indicating AMR-WB IO mode Q0 */ +/* _ (Word16) bwidth : input signal bandwidth Q0 */ +/* _ (Word16) L_frame_fx: length of the frame Q0 */ +/* _ (Word16[]) h2 : weighted filter input response Q12 */ +/* _ (Word16[]) xn2 : target vector Q_new */ +/* _ (Word16) coder_type: coding type Q0 */ +/* _ (Word16) i_subfr : current sub frame indicator Q0 */ +/* _ (Word16[]) exc_fx : pointer to excitation signal frame Q_new */ +/* _ (Word16) L_subfr : subframe length Q0 */ +/* _ (Word16) clip_gain : adaptive gain clipping flag Q0 */ +/* _ (Word16) gain_pit : adaptive excitation gain Q14 */ +/* _ (Word16) sharpFlag : formant sharpening flag Q0 */ +/* _ (Word16) tc_subfr : TC subframe index Q0 */ +/* _ (Word16) p_Aq : LP filter coefficients Q12 */ +/* _ (Word16) Jopt_flag :joint optimization flag Q0 */ +/* _ (Word16) y1 : Filtered adaptive excitation Q_new */ +/* _ (Word16) y2 :zero-memory filtered algebraic excitation Q_new */ +/* _ (Word16) cn : target vector in residual domain Q_new */ +/* _ (Word16) tilt_code : tilt of the excitation of previous subframe Q15 */ +/* _ (Word16) pt_pitch : pointer to current subframe fractional pitchQ6 */ +/* _ (Word16) index_buf_4T :5Sx4Track buffer for PI Q0 */ +/* _ (Word16) shift :shift */ +/* _ (Word16) Q_new : */ /*------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q0) */ -/* _ (Word16) cn : target vector in residual domain Q_new */ -/* _ (Word16) code :algebraic excitation Q9 */ -/* _ (Word16) y2 :zero-memory filtered algebraic excitation Q_new */ -/* _ (Word16) unbits :number of unused bits for PI Q0 */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) exc_fx : adapt. excitation exc (Q0) */ +/* _ (Word16) cn : target vector in residual domain Q_new */ +/* _ (Word16) code :algebraic excitation Q9 */ +/* _ (Word16) y2 :zero-memory filtered algebraic excitation Q_new */ +/* _ (Word16) unbits :number of unused bits for PI Q0 */ /*------------------------------------------------------------------------------*/ - /*------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*==============================================================================*/ Word16 inov_encode_fx( @@ -89,9 +87,7 @@ Word16 inov_encode_fx( Word16 Rw[L_SUBFR]; Word16 acelpautoc; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) last_L_frame; -#endif stack_pulses = 0; move16(); @@ -291,7 +287,7 @@ Word16 inov_encode_fx( } ELSE { - *unbits = add( *unbits, acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, nBits, cmpl_flag, Opt_AMR_WB ) ); + *unbits = add( *unbits, acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, nBits, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ) ); move16(); } } @@ -304,39 +300,38 @@ Word16 inov_encode_fx( } ELSE IF( ( EQ_32( core_brate, ACELP_8k85 ) ) ) { - acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 20, cmpl_flag, Opt_AMR_WB ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 20, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_12k65 ) ) { - acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 36, cmpl_flag, Opt_AMR_WB ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 36, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_14k25 ) ) { - acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 44, cmpl_flag, Opt_AMR_WB ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 44, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_15k85 ) ) { - acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 52, cmpl_flag, Opt_AMR_WB ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 52, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_18k25 ) ) { - acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 64, cmpl_flag, Opt_AMR_WB ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 64, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_19k85 ) ) { - acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 72, cmpl_flag, Opt_AMR_WB ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 72, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_23k05 ) ) { - acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 88, cmpl_flag, Opt_AMR_WB ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 88, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_23k85 ) ) { - acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 88, 1, Opt_AMR_WB ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 88, 1, Opt_AMR_WB, st_fx->element_mode ); } } - /*----------------------------------------------------------------* * Pitch sharpening *----------------------------------------------------------------*/ @@ -346,6 +341,7 @@ Word16 inov_encode_fx( return stack_pulses; } + Word16 inov_encode_ivas_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ const Word32 core_brate, /* i : core bitrate */ @@ -372,7 +368,7 @@ Word16 inov_encode_ivas_fx( Word16 shift, Word16 Q_new ) { - Word16 dn[2 * L_SUBFR], Qdn; + Word16 dn[2 * L_SUBFR], Qdn, Qcn, Qh2; Word16 nBits, cmpl_flag; Word16 stack_pulses; Word16 g1, g2; @@ -380,7 +376,7 @@ Word16 inov_encode_ivas_fx( Word16 acelpautoc; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; Word16 i, k; - Word16 Qxn, Rw_q, j, max_xn2; + Word16 Qxn, max_xn2; stack_pulses = 0; move16(); @@ -418,23 +414,22 @@ Word16 inov_encode_ivas_fx( test(); test(); + Qcn = Q_new; + move16(); IF( GT_32( core_brate, ACELP_13k20 ) && !Opt_AMR_WB && EQ_16( L_subfr, L_SUBFR ) ) { acelpautoc = 1; move16(); - cb_shape_fx( 1, 1, 0, sharpFlag, 0, g1, g2, p_Aq, h2, tilt_code, shr( add( pt_pitch, 26 ), 6 ), 0, L_SUBFR ); /* h2: Q11, Rw: (Rw_e)Q */ - // Word16 Rw_e = E_ACELP_hh_corr( h2, Rw, L_SUBFR, 3 ); - corr_hh_ivas_fx( h2, Rw, &Rw_q, L_subfr ); // Q(Rw) = Q11-2 + /* Rw_e = */ E_ACELP_hh_corr( h2, Rw, L_SUBFR, 3 ); - E_ACELP_conv_ivas_fx( xn2, h2, cn ); // Qcn = Qxn2 + E_ACELP_conv( xn2, h2, cn ); /* dn_e -> Rw_e*Q_xn */ - // Scale_sig(Rw, L_SUBFR, sub(5, Rw_e)); //Q9 - j = E_ACELP_toeplitz_mul_fx( Rw, cn, dn, L_SUBFR, 1 ); - Qdn = add( add( Qxn, Rw_q ), add( j, 1 ) ); - // Scale_sig(Rw, L_subfr, -3); //Q9->Q6 + /*dn_e = */ E_ACELP_toeplitz_mul_fx( Rw, cn, dn, L_SUBFR, 1 ); + Qdn = Qcn; + move16(); } ELSE { @@ -443,9 +438,22 @@ Word16 inov_encode_ivas_fx( updt_tar_fx( cn, cn, &exc[i_subfr], gain_pit, L_subfr ); /* scaling of cn[] to limit dynamic at 12 bits */ Scale_sig( cn, L_subfr, shift ); - + Word16 q_h1 = sub( 14, norm_s( h2[0] ) ); + Scale_sig( h2, L_SUBFR, sub( 11, q_h1 ) ); /* set h2[] in Q11*/ cb_shape_fx( 1, 1, 0, sharpFlag, 0, g1, g2, p_Aq, h2, tilt_code, shr( add( pt_pitch, 26 ), 6 ), 0, L_subfr ); corr_xh_ivas_fx( xn2, Qxn, dn, &Qdn, h2, L_subfr ); // Q(dn) = Q_new+1 + IF( LT_16( Qdn, Qcn ) ) + { + scale_sig( cn, L_subfr, sub( Qdn, Qcn ) ); + Qcn = Qdn; + move16(); + } + ELSE + { + scale_sig( dn, L_subfr, sub( Qcn, Qdn ) ); + Qdn = Qcn; + move16(); + } } /*-----------------------------------------------------------------* @@ -576,6 +584,9 @@ Word16 inov_encode_ivas_fx( set16_fx( y2, 0, L_SUBFR ); + Qh2 = sub( 14, norm_s( h2[0] ) ); + Scale_sig( h2, L_SUBFR, sub( Q12, Qh2 ) ); + IF( !Opt_AMR_WB ) { IF( st_fx->acelp_cfg.fcb_mode ) @@ -587,7 +598,7 @@ Word16 inov_encode_ivas_fx( IF( i_subfr != 0 ) { idx = idiv1616( i_subfr, L_subfr ); - idx2 = idiv1616( i_subfr, L_SUBFR ); + idx2 = shr( i_subfr, L_SUBFR_LOG2 ); } IF( LT_16( st_fx->acelp_cfg.fixed_cdk_index[idx], ACELP_FIXED_CDK_NB ) ) @@ -607,28 +618,27 @@ Word16 inov_encode_ivas_fx( IF( EQ_16( nBits, 8 ) ) { - acelp_1t64_ivas_fx( hBstr, dn, h2, code, y2, L_subfr ); + acelp_1t64_fx( hBstr, dn, h2, code, y2, L_subfr ); } ELSE { - acelp_fast_fx( hBstr, nBits, dn, Qdn, cn, h2, code, y2, L_subfr ); + acelp_fast_fx( hBstr, nBits, dn, Qdn, cn, Qcn, h2, code, y2, L_subfr ); } } ELSE IF( ( EQ_16( st_fx->idchan, 1 ) && LE_16( st_fx->acelp_cfg.fixed_cdk_index[idx2], 7 ) ) || ( st_fx->idchan == 0 && LE_16( st_fx->acelp_cfg.fixed_cdk_index[idx2], 3 ) ) ) { IF( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] == 0 ) { - acelp_1t64_ivas_fx( hBstr, dn, h2, code, y2, L_subfr ); + acelp_1t64_fx( hBstr, dn, h2, code, y2, L_subfr ); } ELSE { - acelp_fast_fx( hBstr, st_fx->acelp_cfg.fixed_cdk_index[idx2], dn, Qdn, cn, h2, code, y2, L_SUBFR ); + acelp_fast_fx( hBstr, st_fx->acelp_cfg.fixed_cdk_index[idx2], dn, Qdn, cn, Qcn, h2, code, y2, L_SUBFR ); } } ELSE { - E_ACELP_4t_ivas_fx( dn, cn, h2, Rw, (Word8) acelpautoc, code, st_fx->acelp_cfg.fixed_cdk_index[idx2], prm, L_frame, last_L_frame, st_fx->total_brate, i_subfr, cmpl_flag, st_fx->element_mode ); - + E_ACELP_4t_fx( dn, cn, h2, Rw, (Word8) acelpautoc, code, st_fx->acelp_cfg.fixed_cdk_index[idx2], prm, L_frame, last_L_frame, st_fx->total_brate, i_subfr, cmpl_flag, st_fx->element_mode ); wordcnt = shr( ACELP_FIXED_CDK_BITS( st_fx->acelp_cfg.fixed_cdk_index[idx2] ), 4 ); bitcnt = s_and( ACELP_FIXED_CDK_BITS( st_fx->acelp_cfg.fixed_cdk_index[idx2] ), 15 ); @@ -651,7 +661,7 @@ Word16 inov_encode_ivas_fx( { FOR( k = 0; k < L_SUBFR - i; k++ ) { - y2[i + k] = add_sat( y2[i + k], round_fx( L_shl( L_mult( code[i], h2[k] ), sh ) ) ); // Q9 Added saturation: needs to be rechecked + y2[i + k] = add_sat( y2[i + k], round_fx_sat( L_shl_sat( L_mult( code[i], h2[k] ), sh ) ) ); // Q9 Added saturation: needs to be rechecked move16(); } } @@ -679,15 +689,15 @@ Word16 inov_encode_ivas_fx( IF( EQ_16( nBits, 7 ) ) { - acelp_1t64_ivas_fx( hBstr, dn, h2, code, y2, L_SUBFR ); + acelp_1t64_fx( hBstr, dn, h2, code, y2, L_SUBFR ); } ELSE IF( EQ_16( nBits, 12 ) ) { - acelp_2t32_ivas_fx( hBstr, dn, h2, code, y2 ); + acelp_2t32_fx( hBstr, dn, h2, code, y2 ); } ELSE { - *unbits = add( *unbits, acelp_4t64_ivas_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, nBits, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ) ); + *unbits = add( *unbits, acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, nBits, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ) ); move16(); } } @@ -696,43 +706,42 @@ Word16 inov_encode_ivas_fx( { IF( EQ_32( core_brate, ACELP_6k60 ) ) { - acelp_2t32_ivas_fx( hBstr, dn, h2, code, y2 ); + acelp_2t32_fx( hBstr, dn, h2, code, y2 ); } ELSE IF( ( EQ_32( core_brate, ACELP_8k85 ) ) ) { - acelp_4t64_ivas_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 20, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 20, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_12k65 ) ) { - acelp_4t64_ivas_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 36, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 36, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_14k25 ) ) { - acelp_4t64_ivas_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 44, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 44, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_15k85 ) ) { - acelp_4t64_ivas_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 52, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 52, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_18k25 ) ) { - acelp_4t64_ivas_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 64, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 64, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_19k85 ) ) { - acelp_4t64_ivas_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 72, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 72, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_23k05 ) ) { - acelp_4t64_ivas_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 88, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 88, cmpl_flag, Opt_AMR_WB, st_fx->element_mode ); } ELSE IF( EQ_32( core_brate, ACELP_23k85 ) ) { - acelp_4t64_ivas_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 88, 1, Opt_AMR_WB, st_fx->element_mode ); + acelp_4t64_fx( hBstr, dn, cn, h2, Rw, acelpautoc, code, y2, 88, 1, Opt_AMR_WB, st_fx->element_mode ); } } - /*----------------------------------------------------------------* * Pitch sharpening *----------------------------------------------------------------*/ diff --git a/lib_enc/isf_enc_amr_wb_fx.c b/lib_enc/isf_enc_amr_wb_fx.c index 4851ed15552285743d2dcc88e6dda9ba61a7a2be..d58998565bdb404e232a6b7b8c5e0318eae1c3a4 100644 --- a/lib_enc/isf_enc_amr_wb_fx.c +++ b/lib_enc/isf_enc_amr_wb_fx.c @@ -173,11 +173,11 @@ static void qisf_ns_28b_fx( indice[4] = add( sub_VQ_fx( &isf[12], dico5_ns_28b_fx + 4, 4, DICO5_NS_28b - 1, &tmp ), 1 ); /* First vector has a problem -> do not allow */ move16(); /* write indices to array */ - push_indice_fx( hBstr, IND_ISF_0_0, indice[0], 6 ); - push_indice_fx( hBstr, IND_ISF_0_1, indice[1], 6 ); - push_indice_fx( hBstr, IND_ISF_0_2, indice[2], 6 ); - push_indice_fx( hBstr, IND_ISF_0_3, indice[3], 5 ); - push_indice_fx( hBstr, IND_ISF_0_4, indice[4], 5 ); + push_indice( hBstr, IND_ISF_0_0, indice[0], 6 ); + push_indice( hBstr, IND_ISF_0_1, indice[1], 6 ); + push_indice( hBstr, IND_ISF_0_2, indice[2], 6 ); + push_indice( hBstr, IND_ISF_0_3, indice[3], 5 ); + push_indice( hBstr, IND_ISF_0_4, indice[4], 5 ); /* decoding the ISFs */ disf_ns_28b_fx( indice, isf ); @@ -305,11 +305,11 @@ static void qisf_2s_36b_fx( indice[0] = Indirect_dico1[indice[0]]; move16(); /* Make interoperable with G722.2 */ - push_indice_fx( hBstr, IND_ISF_0_0, indice[0], 8 ); - push_indice_fx( hBstr, IND_ISF_0_1, indice[1], 8 ); - push_indice_fx( hBstr, IND_ISF_1_0, indice[2], 7 ); - push_indice_fx( hBstr, IND_ISF_1_1, indice[3], 7 ); - push_indice_fx( hBstr, IND_ISF_1_2, indice[4], 6 ); + push_indice( hBstr, IND_ISF_0_0, indice[0], 8 ); + push_indice( hBstr, IND_ISF_0_1, indice[1], 8 ); + push_indice( hBstr, IND_ISF_1_0, indice[2], 7 ); + push_indice( hBstr, IND_ISF_1_1, indice[3], 7 ); + push_indice( hBstr, IND_ISF_1_2, indice[4], 6 ); return; } @@ -442,13 +442,13 @@ static void qisf_2s_46b_fx( indice[0] = Indirect_dico1[indice[0]]; move16(); /* Make interoperable with G722.2 */ - push_indice_fx( hBstr, IND_ISF_0_0, indice[0], 8 ); - push_indice_fx( hBstr, IND_ISF_0_1, indice[1], 8 ); - push_indice_fx( hBstr, IND_ISF_1_0, indice[2], 6 ); - push_indice_fx( hBstr, IND_ISF_1_1, indice[3], 7 ); - push_indice_fx( hBstr, IND_ISF_1_2, indice[4], 7 ); - push_indice_fx( hBstr, IND_ISF_1_3, indice[5], 5 ); - push_indice_fx( hBstr, IND_ISF_1_4, indice[6], 5 ); + push_indice( hBstr, IND_ISF_0_0, indice[0], 8 ); + push_indice( hBstr, IND_ISF_0_1, indice[1], 8 ); + push_indice( hBstr, IND_ISF_1_0, indice[2], 6 ); + push_indice( hBstr, IND_ISF_1_1, indice[3], 7 ); + push_indice( hBstr, IND_ISF_1_2, indice[4], 7 ); + push_indice( hBstr, IND_ISF_1_3, indice[5], 5 ); + push_indice( hBstr, IND_ISF_1_4, indice[6], 5 ); return; } diff --git a/lib_enc/ivas_agc_enc_fx.c b/lib_enc/ivas_agc_enc_fx.c index d74e10bdaf25ea124ae9326ad807ac835e6e6e97..10d7cb8c71c2b736bc7fa24bbd467bed6f7dc94b 100644 --- a/lib_enc/ivas_agc_enc_fx.c +++ b/lib_enc/ivas_agc_enc_fx.c @@ -49,13 +49,14 @@ #define TWO_IN_Q29 1073741824 #define ONE_MINUS_M_DELTA_PROD_FLT_FC 1073741824 // Q15 -static Word16 ceil_fx( Word16 inp, Word16 Q ); -static Word32 pow32_fx( Word16 inp, Word16 indx ); -static Word16 BASOP_Util_Cmp_Mant32Exp_sat( Word32 a_m, Word16 a_e, Word32 b_m, Word16 b_e ); -static Word16 ceil_fx( Word16 inp, Word16 Q ) + +static Word16 ceil_fx_loc( + const Word16 inp, + const Word16 Q ) { Word16 ret; Word32 ret_32; + IF( inp > 0 ) { IF( EQ_16( Q, 15 ) ) @@ -77,7 +78,8 @@ static Word16 ceil_fx( Word16 inp, Word16 Q ) return ret; } -Word16 BASOP_Util_Cmp_Mant32Exp_sat /*!< o: flag: result of comparison */ + +static Word16 BASOP_Util_Cmp_Mant32Exp_sat /*!< o: flag: result of comparison */ /* 0, if a == b */ /* 1, if a > b */ /* -1, if a < b */ @@ -90,7 +92,6 @@ Word16 BASOP_Util_Cmp_Mant32Exp_sat /*!< o: flag: result of comparison */ Word32 diff_m; Word16 diff_e, shift, result; - /* This function compares two input parameters, both represented by a 32-bit mantissa and a 16-bit exponent. If both values are identical, 0 is returned. @@ -171,7 +172,9 @@ Word16 BASOP_Util_Cmp_Mant32Exp_sat /*!< o: flag: result of comparison */ return result; } -Word32 pow32_fx( Word16 inp, Word16 indx ) +static Word32 pow32_fx( + const Word16 inp, + const Word16 indx ) { Word32 temp_1, temp_2; IF( EQ_16( indx, 1 ) ) @@ -626,7 +629,7 @@ void ivas_agc_enc_process_fx( div_e = 0; move16(); } - temp_16 = ceil_fx( temp_16, sub( Q15, div_e ) ); /* Q0 */ + temp_16 = ceil_fx_loc( temp_16, sub( Q15, div_e ) ); /* Q0 */ } pState->gain_state[i].gainExpVal = temp_16; /* Q0 */ move16(); diff --git a/lib_enc/ivas_core_enc_fx.c b/lib_enc/ivas_core_enc_fx.c index cacbcabd36f4c3d36cc52d6c3bcd4ddf9c6daab4..96bbca887782fdb1e711c4ff9ae0b289ab940d66 100644 --- a/lib_enc/ivas_core_enc_fx.c +++ b/lib_enc/ivas_core_enc_fx.c @@ -51,37 +51,38 @@ * * Principal IVAS core coder routine, where number of core channels is 1 or 2 *-------------------------------------------------------------------*/ + ivas_error ivas_core_enc_fx( - SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ - const Word16 n_CoreChannels, /* i : number of core channels to be coded Q0*/ - Word16 old_inp_12k8_fx[][L_INP_12k8], /* i : buffer of old input signal Q_new-1*/ - Word16 old_inp_16k_fx[][L_INP], /* i : buffer of old input signal Q_new-1*/ - Word16 Q_new[], - Word32 ener_fx[], /* i : residual energy from Levinson-Durbin epsP_fx_q*/ - Word16 A_fx[][NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ - Word16 Aw_fx[][NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquantized for subframes Q12*/ - Word32 epsP_fx[][M + 1], /* i : LP prediction errors epsP_fx_q*/ - Word16 epsP_fx_q[], /* i : LP prediction errors */ - Word16 lsp_new_fx[][M], /* i : LSPs at the end of the frame Q15*/ - Word16 lsp_mid_fx[][M], /* i : LSPs in the middle of the frame Q15*/ - const Word16 vad_hover_flag[], /* i : VAD hanglover flag Q0*/ - Word16 attack_flag[], /* i : attack flag (GSC or TC) Q0*/ - Word32 realBuffer_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer q_re_im_buf*/ - Word32 imagBuffer_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer q_re_im_buf*/ - Word16 *q_re_im_buf, - Word16 old_wsp_fx[][L_WSP], /* i : weighted input signal buffer e_old_wsp*/ - Word16 e_old_wsp[], - const Word16 loc_harm[], /* i : harmonicity flag Q0*/ - const Word16 cor_map_sum_fx[], /* i : speech/music clasif. parameter Q8*/ - const Word16 vad_flag_dtx[], /* i : HE-SAD flag with additional DTX HO Q0*/ - Word32 enerBuffer_fx[][CLDFB_NO_CHANNELS_MAX], /* o : energy buffer enerBuffer_fx_exp*/ - Word16 enerBuffer_fx_exp[], /* o : energy buffer */ - Word16 fft_buff_fx[][2 * L_FFT], /* i : FFT buffer Qx*/ - const Word16 tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag Q0*/ - const Word16 ivas_format, /* i : IVAS format Q0*/ - const Word16 flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ + SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + const Word16 n_CoreChannels, /* i : number of core channels to be coded Q0*/ + Word16 old_inp_12k8_fx[][L_INP_12k8], /* i : buffer of old input signal Q_new-1*/ + Word16 old_inp_16k_fx[][L_INP], /* i : buffer of old input signal Q_new-1*/ + Word16 Q_new[], /* i : Q factor of speech buffers */ + Word32 ener_fx[], /* i : residual energy from Levinson-Durbin epsP_fx_q*/ + Word16 A_fx[][NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ + Word16 Aw_fx[][NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquantized for subframes Q12*/ + Word32 epsP_fx[][M + 1], /* i : LP prediction errors epsP_fx_q*/ + Word16 epsP_fx_q[], /* i : LP prediction errors */ + Word16 lsp_new_fx[][M], /* i : LSPs at the end of the frame Q15*/ + Word16 lsp_mid_fx[][M], /* i : LSPs in the middle of the frame Q15*/ + const Word16 vad_hover_flag[], /* i : VAD hanglover flag Q0*/ + Word16 attack_flag[], /* i : attack flag (GSC or TC) Q0*/ + Word32 realBuffer_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer q_re_im_buf*/ + Word32 imagBuffer_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer q_re_im_buf*/ + Word16 *q_re_im_buf, /* i : Q factor of re/im CLDFB buffers */ + Word16 old_wsp_fx[][L_WSP], /* i : weighted input signal buffer e_old_wsp*/ + Word16 e_old_wsp[], /* i : Q factor of old_wsp buffer */ + const Word16 loc_harm[], /* i : harmonicity flag Q0*/ + const Word16 cor_map_sum_fx[], /* i : speech/music clasif. parameter Q8*/ + const Word16 vad_flag_dtx[], /* i : HE-SAD flag with additional DTX HO Q0*/ + Word32 enerBuffer_fx[][CLDFB_NO_CHANNELS_MAX], /* o : energy buffer enerBuffer_fx_exp*/ + Word16 enerBuffer_fx_exp[], /* o : energy buffer */ + Word16 fft_buff_fx[][2 * L_FFT], /* i : FFT buffer Qx*/ + const Word16 tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag Q0*/ + const Word16 ivas_format, /* i : IVAS format Q0*/ + const Word16 flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ ) { Word16 n, input_frame; @@ -89,17 +90,15 @@ ivas_error ivas_core_enc_fx( Encoder_State **sts, *st; STEREO_ICBWE_ENC_HANDLE hStereoICBWE; STEREO_TD_ENC_DATA_HANDLE hStereoTD; - move16(); - move16(); Word16 voice_factors_fx[CPE_CHANNELS][NB_SUBFR16k]; /* Q15 */ Word32 shb_speech_fx32[L_FRAME16k]; Word32 *new_swb_speech_fx; Word16 *inp_fx[CPE_CHANNELS]; - Word16 shb_speech_fx[L_FRAME16k]; // Q_shb_spch + Word16 *shb_speech_fx; Word16 Q_shb_spch; Word32 new_swb_speech_buffer_fx[L_FRAME48k + STEREO_DFT_OVL_MAX]; Word16 new_inp_resamp16k_fx[CPE_CHANNELS][L_FRAME16k]; /* new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ - Word16 hb_speech_fx[L_FRAME16k / 4]; + Word16 *hb_speech_fx; Word32 bwe_exc_extended_fx[CPE_CHANNELS][L_FRAME32k + NL_BUFF_OFFSET]; /* 2 * Q_new */ Word16 old_syn_12k8_16k_fx[CPE_CHANNELS][L_FRAME16k]; /* ACELP core synthesis at 12.8kHz or 16kHz to be used by the SWB BWE */ Word16 *new_swb_speech_fx_16; @@ -107,25 +106,21 @@ ivas_error ivas_core_enc_fx( Word16 Voicing_flag[CPE_CHANNELS]; Word16 pitch_buf_fx[CPE_CHANNELS][NB_SUBFR16k]; /* Q6 */ Word16 unbits[CPE_CHANNELS]; - Word16 tdm_lspQ_PCh_fx[M], tdm_lsfQ_PCh_fx[M]; /* 1 : Q15, 2 : Q2.56 */ + Word16 tdm_lsfQ_PCh_fx[M]; /* Q2.56 */ Word16 last_element_mode, tdm_Pitch_reuse_flag; Word32 element_brate, last_element_brate, input_Fs; Word16 diff_nBits; ivas_error error; Word16 max_num_indices_BWE; - Word16 i; + Word16 i, shift, Q_min; set32_fx( new_swb_speech_buffer_fx, 0, L_FRAME48k + STEREO_DFT_OVL_MAX ); - set16_fx( new_swb_speech_buffer_fx_16, 0, L_FRAME48k + STEREO_DFT_OVL_MAX ); -#ifdef MSAN_FIX FOR( i = 0; i < CPE_CHANNELS; i++ ) { set_zero_fx( bwe_exc_extended_fx[i], L_FRAME32k + NL_BUFF_OFFSET ); set16_fx( old_syn_12k8_16k_fx[i], 0, L_FRAME16k ); } - set16_fx( shb_speech_fx, 0, L_FRAME16k ); -#endif push_wmops( "ivas_core_enc" ); @@ -203,7 +198,6 @@ ivas_error ivas_core_enc_fx( * Initializiation per core-coder channel *-----------------------------------------------------------------*/ - st->extl = -1; move16(); unbits[n] = 0; @@ -215,7 +209,7 @@ ivas_error ivas_core_enc_fx( /*---------------------------------------------------------------------* * Pre-processing, incl. Decision matrix *---------------------------------------------------------------------*/ -#ifdef MSAN_FIX + IF( st->cldfbAnaEnc ) { Word16 tmp_shift = L_norm_arr( enerBuffer_fx[n], st->cldfbAnaEnc->no_channels ); @@ -227,20 +221,9 @@ ivas_error ivas_core_enc_fx( move16(); } } -#else - Word16 tmp_shift = getScaleFactor32( enerBuffer_fx[n], CLDFB_NO_CHANNELS_MAX ); - tmp_shift = sub( tmp_shift, 5 ); - IF( tmp_shift < 0 ) - { - scale_sig32( enerBuffer_fx[n], CLDFB_NO_CHANNELS_MAX, tmp_shift ); - enerBuffer_fx_exp[n] = sub( enerBuffer_fx_exp[n], tmp_shift ); - move16(); - } -#endif Scale_sig( fft_buff_fx[n], ( 2 * L_FFT ), -1 ); // To create 1 headroom for addition of magnitude square spectrum // fft_buff_fx_exp = add(fft_buff_fx_exp,1); - FOR( i = 0; i < st->nb_subfr; i++ ) { Scale_sig( &A_fx[n][i * ( M + 1 )], M + 1, sub( norm_s( A_fx[n][i * ( M + 1 )] ), 2 ) ); // scaling to Q12 @@ -285,7 +268,7 @@ ivas_error ivas_core_enc_fx( test(); IF( hCPE != NULL && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && hCPE->brate_surplus > 0 ) { - ivas_combined_format_brate_sanity_fx( hCPE->element_brate, sts[0]->core, sts[0]->total_brate, &( sts[0]->core_brate ), &( sts[0]->inactive_coder_type_flag ), &diff_nBits ); + ivas_combined_format_brate_sanity_fx( element_brate, sts[0]->core, sts[0]->total_brate, &( sts[0]->core_brate ), &( sts[0]->inactive_coder_type_flag ), &diff_nBits ); } /*---------------------------------------------------------------------* @@ -326,6 +309,7 @@ ivas_error ivas_core_enc_fx( /*---------------------------------------------------------------------* * Preprocessing (preparing) for ACELP/HQ core switching *---------------------------------------------------------------------*/ + core_switching_pre_enc_ivas_fx( st, old_inp_12k8_fx[n], sub( Q_new[n], 1 ), old_inp_16k_fx[n], sub( Q_new[n], 1 ), sts[0]->active_cnt, last_element_mode ); /*---------------------------------------------------------------------* @@ -365,6 +349,7 @@ ivas_error ivas_core_enc_fx( move16(); Q_spec_old = hTcxEnc->spectrum_long_e; move16(); + /* TCX core encoder */ stereo_tcx_core_enc( st, old_inp_12k8_fx[n] + L_INP_MEM, old_inp_16k_fx[n] + L_INP_MEM, Aw_fx[n], lsp_new_fx[n], lsp_mid_fx[n], pitch_buf_fx[n], last_element_mode, vad_hover_flag[0], 0 ); @@ -428,11 +413,10 @@ ivas_error ivas_core_enc_fx( test(); IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && n == 0 ) { - td_stereo_param_updt_fx( st->lsp_old_fx, st->lsf_old_fx, pitch_buf_fx[0], tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, hStereoTD->tdm_Pri_pitch_buf_fx, st->flag_ACELP16k, hStereoTD->tdm_use_IAWB_Ave_lpc ); + td_stereo_param_updt_fx( st->lsp_old_fx, st->lsf_old_fx, pitch_buf_fx[0], tdm_lsfQ_PCh_fx, hStereoTD->tdm_Pri_pitch_buf_fx, st->flag_ACELP16k, hStereoTD->tdm_use_IAWB_Ave_lpc ); } } - /*---------------------------------------------------------------------* * MDCT stereo: joint TCX Core Encoding *---------------------------------------------------------------------*/ @@ -457,13 +441,6 @@ ivas_error ivas_core_enc_fx( st->hTcxEnc->exp_buf_speech_ltp = st->exp_buf_speech_enc; move16(); } - - Scale_sig( st->input_fx, input_frame, negate( st->q_inp ) ); // Q0 - Scale_sig( st->old_input_signal_fx, input_frame, negate( st->q_old_inp ) ); // Q0 - st->q_old_inp = 0; - move16(); - st->q_inp = 0; - move16(); } Word16 Q_spec_old[2], L_spec; Q_spec_old[0] = hCPE->hCoreCoder[0]->hTcxEnc->spectrum_long_e; @@ -552,6 +529,17 @@ ivas_error ivas_core_enc_fx( st->hTcxEnc->exp_buf_speech_ltp = st->exp_buf_speech_enc; move16(); } + shift = norm_arr( st->input_fx, input_frame ); + Q_min = s_max( -2, add( st->q_inp, shift ) ); + scale_sig( st->input_fx, input_frame, sub( Q_min, st->q_inp ) ); + st->q_inp = Q_min; + move16(); + + shift = norm_arr( st->input_fx - input_frame, input_frame ); + Q_min = s_max( -2, add( st->q_old_inp, shift ) ); + scale_sig( st->input_fx - input_frame, input_frame, sub( Q_min, st->q_old_inp ) ); + st->q_old_inp = Q_min; + move16(); } Word16 Q_spec_old[2], L_spec; @@ -632,15 +620,12 @@ ivas_error ivas_core_enc_fx( * Postprocessing, BWEs and Updates *---------------------------------------------------------------------*/ + Word16 tmp_input_fx[L_FRAME48k], tmp_old_input_fx[L_FRAME48k], q_inp[2]; + FOR( n = 0; n < n_CoreChannels; n++ ) { st = sts[n]; - Scale_sig( st->old_input_signal_fx, input_frame, negate( st->q_old_inp ) ); // Q0 - Scale_sig( st->input_fx, add( input_frame, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), negate( st->q_inp ) ); // Q0 - st->q_old_inp = st->q_inp = 0; - move16(); - move16(); IF( st->hBWE_FD != NULL ) { Scale_sig( st->hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, sub( negate( 1 ), st->Q_old_wtda ) ); // Q(-1) @@ -651,9 +636,21 @@ ivas_error ivas_core_enc_fx( move16(); } + Copy( st->input_fx - input_frame, tmp_old_input_fx, input_frame ); + Copy( st->input_fx, tmp_input_fx, input_frame ); + q_inp[0] = st->q_old_inp; + q_inp[1] = st->q_inp; + + Scale_sig( st->input_fx - input_frame, 2 * input_frame, sub( -1, st->q_inp ) ); + st->q_inp = -1; + move16(); + st->q_old_inp = -1; + move16(); + /*---------------------------------------------------------------------* * Postprocessing for ACELP/HQ core switching *---------------------------------------------------------------------*/ + core_switching_post_enc_ivas_fx( st, old_inp_12k8_fx[n], old_inp_16k_fx[n], A_fx[n], Q_new[n] ); /*---------------------------------------------------------------------* @@ -661,6 +658,8 @@ ivas_error ivas_core_enc_fx( * WB BWE encoding *---------------------------------------------------------------------*/ + hb_speech_fx = new_swb_speech_buffer_fx_16; /* reuse existing buffer: hb_speech[L_FRAME16k/4]; */ + test(); test(); IF( GE_32( input_Fs, 16000 ) && LT_16( st->bwidth, SWB ) && st->hBWE_TD != NULL ) @@ -682,13 +681,6 @@ ivas_error ivas_core_enc_fx( wb_bwe_enc_ivas_fx( st, new_inp_resamp16k_fx[n] ); } - IF( st->hBWE_FD != NULL ) - { - Scale_sig( st->hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, Q1 ); // Q-1 -> Q0 - st->Q_old_wtda = add( st->Q_old_wtda, Q1 ); - move16(); - } - /*---------------------------------------------------------------------* * SWB(FB) TBE encoding * SWB(FB) BWE encoding @@ -696,6 +688,8 @@ ivas_error ivas_core_enc_fx( new_swb_speech_fx = new_swb_speech_buffer_fx + STEREO_DFT_OVL_MAX; new_swb_speech_fx_16 = new_swb_speech_buffer_fx_16 + STEREO_DFT_OVL_MAX; + set16_fx( new_swb_speech_buffer_fx_16, 0, L_FRAME48k + STEREO_DFT_OVL_MAX ); + shb_speech_fx = new_inp_resamp16k_fx[n]; /* reuse existing buffer: shb_speech[L_FRAME16k] */ test(); test(); @@ -703,12 +697,31 @@ ivas_error ivas_core_enc_fx( { /* Common pre-processing for SWB(FB) TBE and SWB(FB) BWE */ /* Scaling cldfb_state_fx */ - scale_sig32( st->cldfbSynTd->cldfb_state_fx, st->cldfbSynTd->p_filter_length, sub( q_re_im_buf[n], st->cldfbSynTd->Q_cldfb_state ) ); // st->cldfbSynTd->Q_cldfb_state -> q_realImagBuffer + Word16 q_shift, scf_cldfb; + scf_cldfb = L_norm_arr( st->cldfbSynTd->cldfb_state_fx, st->cldfbSynTd->p_filter_length ); + + scale_sig32( st->cldfbSynTd->cldfb_state_fx, st->cldfbSynTd->p_filter_length, scf_cldfb ); + st->cldfbSynTd->Q_cldfb_state = add( st->cldfbSynTd->Q_cldfb_state, scf_cldfb ); + + q_shift = sub( sub( q_re_im_buf[n], 1 ), st->cldfbSynTd->Q_cldfb_state ); // cldfb_state_fx will be used in cldfbSynthesis_ivas_fx and has to be aligned with (q_re_im_buf[n] - 1) + IF( GT_32( q_shift, 0 ) ) + { + FOR( Word16 ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) + { + scale_sig32( realBuffer_fx[n][ts], CLDFB_NO_CHANNELS_MAX, negate( q_shift ) ); + scale_sig32( imagBuffer_fx[n][ts], CLDFB_NO_CHANNELS_MAX, negate( q_shift ) ); + } + q_re_im_buf[n] = add( st->cldfbSynTd->Q_cldfb_state, 1 ); + } + ELSE + { + scale_sig32( st->cldfbSynTd->cldfb_state_fx, st->cldfbSynTd->p_filter_length, q_shift ); // st->cldfbSynTd->Q_cldfb_state -> q_realImagBuffer + st->cldfbSynTd->Q_cldfb_state = sub( q_re_im_buf[n], 1 ); + } swb_pre_proc_ivas_fx( st, new_swb_speech_fx_16, new_swb_speech_fx, shb_speech_fx, &Q_shb_spch, realBuffer_fx[n], imagBuffer_fx[n], q_re_im_buf[n], hCPE ); - /* Re-scaling cldfb_state_fx */ - scale_sig32( st->cldfbSynTd->cldfb_state_fx, st->cldfbSynTd->p_filter_length, negate( sub( q_re_im_buf[n], st->cldfbSynTd->Q_cldfb_state ) ) ); // q_realImagBuffer -> st->cldfbSynTd->Q_cldfb_state + st->cldfbSynTd->Q_cldfb_state = sub( q_re_im_buf[n], 1 ); } ELSE IF( GE_32( input_Fs, 32000 ) ) { @@ -720,7 +733,7 @@ ivas_error ivas_core_enc_fx( Word16 Q_shb_spch_16 = Q_shb_spch; move16(); - Word16 shift = add( getScaleFactor16( shb_speech_fx, L_FRAME16k ), Q16 ); + shift = add( getScaleFactor16( shb_speech_fx, L_FRAME16k ), Q16 ); Copy_Scale_sig_16_32_no_sat( shb_speech_fx, shb_speech_fx32, L_FRAME16k, shift ); // Q_shb_spch Q_shb_spch = add( Q_shb_spch, shift ); @@ -732,9 +745,6 @@ ivas_error ivas_core_enc_fx( Scale_sig( st->hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, shift ); // st->Q_old_wtda } - Word16 q_new_swb_speech_buffer = getScaleFactor16( new_swb_speech_buffer_fx_16, L_FRAME48k + STEREO_DFT_OVL_MAX ); - Scale_sig( new_swb_speech_buffer_fx_16, L_FRAME48k + STEREO_DFT_OVL_MAX, q_new_swb_speech_buffer ); // Q0->q_new_swb_speech_buffer - /* SWB TBE encoder */ test(); test(); @@ -751,17 +761,15 @@ ivas_error ivas_core_enc_fx( IF( EQ_16( st->extl, FB_TBE ) ) { /* FB TBE encoder */ - fb_tbe_enc_ivas_fx( st, st->input_fx, fb_exc_fx, Q_fb_exc ); + fb_tbe_enc_ivas_fx( st, st->input_fx, fb_exc_fx, Q_fb_exc, st->q_inp ); } } } ELSE IF( EQ_16( st->extl, SWB_BWE ) || EQ_16( st->extl, FB_BWE ) ) { - Copy_Scale_sig_32_16( shb_speech_fx32, shb_speech_fx, L_FRAME16k, -Q16 ); // Q_shb_spch - 16 - Scale_sig( new_swb_speech_buffer_fx_16, L_FRAME48k + STEREO_DFT_OVL_MAX, negate( q_new_swb_speech_buffer ) ); // q_new_swb_speech_buffer -> Q0 + Copy_Scale_sig_32_16( shb_speech_fx32, shb_speech_fx, L_FRAME16k, -Q16 ); // Q_shb_spch - 16 /* SWB(FB) BWE encoder */ - swb_bwe_enc_ivas_fx( st, last_element_mode, old_inp_12k8_fx[n], old_inp_16k_fx[n], old_syn_12k8_16k_fx[n], new_swb_speech_fx_16, shb_speech_fx, sub( Q_shb_spch, Q16 ), sub( Q_new[n], 1 ) ); - Scale_sig( new_swb_speech_buffer_fx_16, L_FRAME48k + STEREO_DFT_OVL_MAX, q_new_swb_speech_buffer ); // Q0 -> q_new_swb_speech_buffer + swb_bwe_enc_ivas_fx( st, last_element_mode, old_inp_12k8_fx[n], old_inp_16k_fx[n], old_syn_12k8_16k_fx[n], new_swb_speech_fx_16, st->q_inp, shb_speech_fx, sub( Q_shb_spch, Q16 ), sub( Q_new[n], 1 ) ); } Scale_sig( old_syn_12k8_16k_fx[n], L_FRAME16k, sub( Q1, Q_new[n] ) ); // Q0 @@ -769,6 +777,7 @@ ivas_error ivas_core_enc_fx( /*---------------------------------------------------------------------* * SWB DTX/CNG encoding *---------------------------------------------------------------------*/ + test(); test(); test(); @@ -783,6 +792,9 @@ ivas_error ivas_core_enc_fx( * Inter-channel BWE encoding *-------------------------------------------------------------------*/ + Word16 q_new_swb_speech_buffer = getScaleFactor16( new_swb_speech_buffer_fx_16, L_FRAME48k + STEREO_DFT_OVL_MAX ); + Scale_sig( new_swb_speech_buffer_fx_16, L_FRAME48k + STEREO_DFT_OVL_MAX, q_new_swb_speech_buffer ); // st->q_inp+q_new_swb_speech_buffer + q_new_swb_speech_buffer = add( st->q_inp, q_new_swb_speech_buffer ); test(); test(); IF( n == 0 && GE_32( input_Fs, 32000 ) && hStereoICBWE != NULL ) @@ -791,7 +803,7 @@ ivas_error ivas_core_enc_fx( stereo_icBWE_preproc_fx( hCPE, input_frame, new_swb_speech_buffer_fx_16 /*tmp buffer*/, q_new_swb_speech_buffer ); q_new_swb_speech_buffer = add( q_new_swb_speech_buffer, 16 ); - Copy_Scale_sig_16_32_no_sat( new_swb_speech_buffer_fx_16, new_swb_speech_buffer_fx, L_FRAME48k + STEREO_DFT_OVL_MAX, Q16 ); // q_new_swb_speech_buffer - 16 - > q_new_swb_speech_buffer + Copy_Scale_sig_16_32_no_sat( new_swb_speech_buffer_fx_16, new_swb_speech_buffer_fx, L_FRAME48k + STEREO_DFT_OVL_MAX, Q16 ); // q_new_swb_speech_buffer+st->q_inp - 16 - > q_new_swb_speech_buffer+st->q_inp Copy_Scale_sig_16_32_no_sat( voice_factors_fx[0], voice_factors_fx32[0], NB_SUBFR16k, Q16 ); // Q31 stereo_icBWE_enc_ivas_fx( hCPE, shb_speech_fx32, sub( Q31, Q_shb_spch ), new_swb_speech_buffer_fx, sub( Q31, q_new_swb_speech_buffer ), voice_factors_fx32[0] ); @@ -812,6 +824,13 @@ ivas_error ivas_core_enc_fx( } } + Copy( tmp_old_input_fx, st->input_fx - input_frame, input_frame ); + Copy( tmp_input_fx, st->input_fx, input_frame ); + st->q_old_inp = q_inp[0]; + move16(); + st->q_inp = q_inp[1]; + move16(); + /*---------------------------------------------------------------------* * Channel-aware mode - write signaling information into the bitstream *---------------------------------------------------------------------*/ @@ -837,6 +856,7 @@ ivas_error ivas_core_enc_fx( /*------------------------------------------------------------------* * Write potentially unused bits in combined format coding *-----------------------------------------------------------------*/ + test(); test(); IF( hCPE != NULL && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && hCPE->brate_surplus > 0 ) diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 45098926ecb19c6bca014e525e975845f050359f..d62fa49c181ebc85fddb0e74f850d3f1625d405a 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -56,11 +56,7 @@ #define SCE_SMC_THR 16000 -static void calculate_energy_buffer_ivas_fx( CPE_ENC_HANDLE hCPE, Word32 enerBuffer_dft[], const Word16 no_channels, const Word32 input_Fs, Word16 *enerBuffer_dft_e ); - -#ifdef IVAS_FIXED_ENC -static void calculate_energy_buffer_fx( CPE_ENC_HANDLE hCPE, Word64 enerBuffer_dft_fx[], Word16 *enerBuffer_dft_q_fx, const Word16 no_channels, const Word32 input_Fs ); -#endif +static void calculate_energy_buffer_ivas_fx( CPE_ENC_HANDLE hCPE, Word32 enerBuffer_dft[], const Word16 no_channels, const Word32 input_Fs, Word16 enerBuffer_dft_e[] ); /*-------------------------------------------------------------------* * pre_proc_front_ivas() @@ -81,60 +77,58 @@ static Word16 get_zero_flag( Word32 arr[], Word16 len ) } ivas_error pre_proc_front_ivas_fx( - SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - const Word32 element_brate, /* i : SCE/CPE element bitrate Q0*/ - const Word16 nb_bits_metadata, /* i : number of metadata bits Q0*/ - const Word16 input_frame, /* i : frame length Q0*/ - const Word16 n, /* i : channel number Q0*/ - Word16 old_inp_12k8_fx[], /* o : buffer of old input signal Q_new-1*/ - Word16 old_inp_16k_fx[], /* o : buffer of old input signal @16kHz Q_new-1*/ - Word32 *ener_fx, /* o : residual energy from Levinson-Durbin epsP_fx_q*/ - Word16 *relE_fx, /* o : frame relative energy Q8*/ - Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* o : A(z) unquantized for the 4 subframes Q12*/ - Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* o : weighted A(z) unquantized for subframes Q12*/ - Word32 epsP_fx[M + 1], /* o : LP prediction errors epsP_fx_q*/ + SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const Word32 element_brate, /* i : SCE/CPE element bitrate Q0*/ + const Word16 nb_bits_metadata, /* i : number of metadata bits Q0*/ + const Word16 input_frame, /* i : frame length Q0*/ + const Word16 n, /* i : channel number Q0*/ + Word16 old_inp_12k8_fx[], /* o : buffer of old input signal (st->Q_inp until preemph, then Q_new, then Q_new-1 towards the end)*/ + Word16 old_inp_16k_fx[], /* o : buffer of old input signal @16kHz Q_new-1*/ + Word32 *ener_fx, /* o : residual energy from Levinson-Durbin epsP_fx_q*/ + Word16 *relE_fx, /* o : frame relative energy Q8*/ + Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* o : A(z) unquantized for the 4 subframes Q12*/ + Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* o : weighted A(z) unquantized for subframes Q12*/ + Word32 epsP_fx[M + 1], /* o : LP prediction errors epsP_fx_q*/ Word16 *epsP_fx_q, - Word16 lsp_new_fx[M], /* o : LSPs at the end of the frame Q15*/ - Word16 lsp_mid_fx[M], /* o : LSPs in the middle of the frame Q15*/ - Word16 *vad_hover_flag, /* o : VAD hangover flag Q0*/ - Word16 *attack_flag, /* o : flag signaling attack Q0*/ - Word32 realBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer Q(q_re_im_buf)*/ - Word32 imagBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer Q(q_re_im_buf)*/ - Word16 *q_re_im_buf, /* i/o: Q-factor of real and imag buffer */ - Word16 old_wsp_fx[], /* o : weighted input signal buffer q_old_wsp*/ + Word16 lsp_new_fx[M], /* o : LSPs at the end of the frame Q15*/ + Word16 lsp_mid_fx[M], /* o : LSPs in the middle of the frame Q15*/ + Word16 *vad_hover_flag, /* o : VAD hangover flag Q0*/ + Word16 *attack_flag, /* o : flag signaling attack Q0*/ + Word32 realBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer Q(q_re_im_buf)*/ + Word32 imagBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer Q(q_re_im_buf)*/ + Word16 *q_re_im_buf, /* i/o: Q-factor of real and imag buffer */ + Word16 old_wsp_fx[], /* o : weighted input signal buffer q_old_wsp*/ Word16 *q_old_wsp, - Word16 pitch_fr_fx[NB_SUBFR], /* o : fractional pitch values Q6*/ - Word16 voicing_fr_fx[NB_SUBFR], /* o : fractional pitch gains Q15*/ - Word16 *loc_harm, /* o : harmonicity flag Q0*/ - Word16 *cor_map_sum_fx, /* o : speech/music clasif. parameter Q8*/ - Word16 *vad_flag_dtx, /* o : HE-SAD flag with additional DTX HO Q0*/ - Word32 enerBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : energy buffer enerBuffer_fx_exp*/ - Word16 *enerBuffer_fx_exp, /* o : energy buffer */ - Word16 fft_buff_fx[2 * L_FFT], /* o : FFT buffer fft_buff_fx_q*/ - Word16 *fft_buff_fx_q, /* o : FFT buffer */ - const Word16 tdm_A_PCh_fx[M + 1], /* i : unq. LP coeff. of primary channel Q12*/ - const Word16 tdm_lsp_new_PCh_fx[M], /* i : unq. LSPs of primary channel Q15*/ - const Word32 currFlatness_fx, /* i : flatness parameter Q21*/ - const Word16 tdm_ratio_idx, /* i : Current Ratio_L index Q0*/ - Word32 fr_bands_LR_fx[][2 * NB_BANDS], /* i : energy in frequency bands (fr_bands_LR_fx_q) fr_bands_LR_fx_q*/ + Word16 pitch_fr_fx[NB_SUBFR], /* o : fractional pitch values Q6*/ + Word16 voicing_fr_fx[NB_SUBFR], /* o : fractional pitch gains Q15*/ + Word16 *loc_harm, /* o : harmonicity flag Q0*/ + Word16 *cor_map_sum_fx, /* o : speech/music clasif. parameter Q8*/ + Word16 *vad_flag_dtx, /* o : HE-SAD flag with additional DTX HO Q0*/ + Word32 enerBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : energy buffer enerBuffer_fx_exp*/ + Word16 *enerBuffer_fx_exp, /* o : energy buffer */ + Word16 fft_buff_fx[2 * L_FFT], /* o : FFT buffer fft_buff_fx_q*/ + Word16 *fft_buff_fx_q, /* o : FFT buffer */ + const Word16 tdm_A_PCh_fx[M + 1], /* i : unq. LP coeff. of primary channel Q12*/ + const Word16 tdm_lsp_new_PCh_fx[M], /* i : unq. LSPs of primary channel Q15*/ + const Word32 currFlatness_fx, /* i : flatness parameter Q21*/ + const Word16 tdm_ratio_idx, /* i : Current Ratio_L index Q0*/ + Word32 fr_bands_LR_fx[][2 * NB_BANDS], /* i : energy in frequency bands (fr_bands_LR_fx_q) fr_bands_LR_fx_q*/ Word16 fr_bands_LR_fx_q[CPE_CHANNELS], - const Word16 Etot_LR_fx[], /* i : total energy Left & Right channel Q8*/ - Word32 lf_E_LR_fx[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels (lf_E_LR_fx_q)*/ + const Word16 Etot_LR_fx[], /* i : total energy Left & Right channel Q8*/ + Word32 lf_E_LR_fx[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels (lf_E_LR_fx_q)*/ Word16 lf_E_LR_fx_q, - const Word16 localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover, LR channels Q0*/ - Word32 band_energies_LR_fx[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN (band_energies_LR_fx_q)*/ + const Word16 localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover, LR channels Q0*/ + Word32 band_energies_LR_fx[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN (band_energies_LR_fx_q)*/ Word16 band_energies_LR_fx_q, - const Word16 flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ - const Word16 front_vad_flag, /* i : front-VAD flag to overwrite VAD decision Q0*/ - const Word16 force_front_vad, /* i : flag to force VAD decision Q0*/ - const Word16 front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision Q0*/ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ -#ifdef NONBE_1211_DTX_BR_SWITCHING + const Word16 flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ + const Word16 front_vad_flag, /* i : front-VAD flag to overwrite VAD decision Q0*/ + const Word16 force_front_vad, /* i : flag to force VAD decision Q0*/ + const Word16 front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision Q0*/ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ const Word32 last_ivas_total_brate, /* i : last IVAS total bitrate Q0*/ -#endif - const Word32 ivas_total_brate, /* i : IVAS total bitrate - for setting the DTX Q0*/ + const Word32 ivas_total_brate, /* i : IVAS total bitrate - for setting the DTX Q0*/ Word16 *Q_new #ifdef DEBUG_MODE_INFO , @@ -151,26 +145,6 @@ ivas_error pre_proc_front_ivas_fx( { st = hCPE->hCoreCoder[n]; } - Word16 old_inp_12k8_e; - Word16 shift = getScaleFactor16( st->old_inp_12k8_fx, 240 ); - Scale_sig( st->old_inp_12k8_fx, 240, shift ); /* exp(st->exp_old_inp_12k8 - shift) */ - st->exp_old_inp_12k8 = sub( st->exp_old_inp_12k8, shift ); - move16(); - shift = getScaleFactor16( old_inp_12k8_fx, 496 ); - Scale_sig( old_inp_12k8_fx, 496, shift ); /* exp(16 - shift) */ - old_inp_12k8_e = sub( Q16, shift ); - IF( GT_16( old_inp_12k8_e, st->exp_old_inp_12k8 ) ) - { - Scale_sig( st->old_inp_12k8_fx, 240, sub( st->exp_old_inp_12k8, old_inp_12k8_e ) ); /* exp(old_inp_12k8_e) */ - st->exp_old_inp_12k8 = old_inp_12k8_e; - move16(); - } - ELSE - { - Scale_sig( old_inp_12k8_fx, 496, sub( old_inp_12k8_e, st->exp_old_inp_12k8 ) ); /* exp(st->exp_old_inp_12k8) */ - old_inp_12k8_e = st->exp_old_inp_12k8; - move16(); - } Word16 q_tmpN_LR[CPE_CHANNELS]; Word16 q_tmpE_LR[CPE_CHANNELS]; @@ -184,7 +158,7 @@ ivas_error pre_proc_front_ivas_fx( Word16 high_lpn_flag; Word16 lsf_new_fx[M]; // Q2.56 Word16 localVAD_HE_SAD; - Word16 non_staX_fx; + Word32 non_staX_fx; Word16 alw_pitch_lag_12k8[2]; Word16 alw_voicing_fx[2]; Word16 last_core_orig; @@ -212,16 +186,12 @@ ivas_error pre_proc_front_ivas_fx( Word16 new_inp_out_size; Word16 Q_new_inp; Word16 mem_decim_size; -#ifndef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING - Word16 Q_new; - Word16 corr_shift_fx; -#endif Word16 dummy_fx; Word16 ncharX_fx; Word16 ncharX_LR_fx; /* noise character for sp/mus classifier */ Word16 loc_harmLR_fx[CPE_CHANNELS]; /* harmonicity flag */ - Word16 non_staX_LR_fx; /* non-stationarity for sp/mus classifier */ + Word32 non_staX_LR_fx; /* non-stationarity for sp/mus classifier */ Word16 sp_div_fx; Word16 q_sp_div; Word16 sp_div_LR_fx; @@ -231,7 +201,7 @@ ivas_error pre_proc_front_ivas_fx( Word16 S_map_fx[L_FFT / 2]; Word16 cor_map_sum_LR_fx[CPE_CHANNELS]; /* speech/music clasif. parameter */ Word16 S_map_LR_fx[L_FFT / 2]; /* short-term correlation map */ - Word16 Etot_fx; /* total energy Q8 */ + Word32 Etot_fx; /* total energy Q8 */ Word32 tmpN_fx[NB_BANDS]; /* Temporary noise update */ Word32 tmpE_fx[NB_BANDS]; /* Temporary averaged energy of 2 sf. */ Word32 tmpN_LR_fx[CPE_CHANNELS][NB_BANDS]; /* Temporary noise update */ @@ -248,6 +218,8 @@ ivas_error pre_proc_front_ivas_fx( Word16 imagBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; Word16 res_cod_SNR_M_fx_e[STEREO_DFT_BAND_MAX]; Word16 Qfact_PS, q_lf_E_fx; + Word16 enerBuffer_fx_exp_buf[CLDFB_NO_CHANNELS_MAX]; + Word32 bckr_temp[NB_BANDS]; #ifdef DEBUG_MODE_INFO Word32 *in_buff_temp; Word16 in_q_temp; @@ -257,51 +229,29 @@ ivas_error pre_proc_front_ivas_fx( temp1F_icatdmResampBuf_fx = (Word16 *) malloc( 45 * sizeof( Word16 * ) ); set16_fx( fft_buff_fx, 0, 512 ); - IF( hSCE != NULL ) - { -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( hSCE->hCoreCoder[n]->input_fx, hSCE->hCoreCoder[n]->input32_fx, input_frame, sub( Q11, hSCE->hCoreCoder[n]->q_inp ) ); /* Q11 */ - Copy_Scale_sig_16_32_no_sat( hSCE->hCoreCoder[n]->input_fx - input_frame, hSCE->hCoreCoder[n]->input32_fx - input_frame, input_frame, sub( Q11, hSCE->hCoreCoder[n]->q_old_inp ) ); /* Q11 */ -#else - Copy_Scale_sig_16_32_DEPREC( hSCE->hCoreCoder[n]->input_fx, hSCE->hCoreCoder[n]->input32_fx, input_frame, sub( Q11, hSCE->hCoreCoder[n]->q_inp ) ); /* Q11 */ - Copy_Scale_sig_16_32_DEPREC( hSCE->hCoreCoder[n]->input_fx - input_frame, hSCE->hCoreCoder[n]->input32_fx - input_frame, input_frame, sub( Q11, hSCE->hCoreCoder[n]->q_old_inp ) ); /* Q11 */ -#endif - hSCE->hCoreCoder[n]->q_inp32 = Q11; - move16(); - Scale_sig( hSCE->hCoreCoder[n]->input_fx, input_frame, sub( -1, hSCE->hCoreCoder[n]->q_inp ) ); /* Q(-1) */ - hSCE->hCoreCoder[n]->q_inp = -1; - move16(); - Scale_sig( hSCE->hCoreCoder[n]->old_input_signal_fx, input_frame, sub( -1, hSCE->hCoreCoder[n]->q_old_inp ) ); /* Q(-1) */ - hSCE->hCoreCoder[n]->q_old_inp = -1; - move16(); + Word16 Q_min = add( sub( 15, st->exp_old_inp_12k8 ), norm_arr( st->old_inp_12k8_fx, L_INP_MEM ) ); + Word16 input_frame_full = shl( input_frame, 1 ); //(old frame input length + new frame input length) + Q_min = s_min( Q_min, sub( add( getScaleFactor32( st->input32_fx - input_frame, input_frame_full ), st->q_inp32 ), 16 ) ); + Q_min = s_max( -2, Q_min ); + Copy_Scale_sig_32_16( st->input32_fx - input_frame, st->input_fx - input_frame, input_frame_full, sub( Q_min, st->q_inp32 ) ); // Q_min + st->q_inp = Q_min; + move16(); + st->q_old_inp = Q_min; + move16(); #ifdef DEBUG_MODE_INFO + IF( hSCE != NULL ) + { in_buff_temp = hSCE->hCoreCoder[n]->input32_fx; in_q_temp = hSCE->hCoreCoder[n]->q_inp32; -#endif } ELSE { -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[n]->input_fx, hCPE->hCoreCoder[n]->input32_fx, input_frame, sub( Q11, hCPE->hCoreCoder[n]->q_inp ) ); /* Q11 */ - Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[n]->input_fx - input_frame, hCPE->hCoreCoder[n]->input32_fx - input_frame, input_frame, sub( Q11, hCPE->hCoreCoder[n]->q_old_inp ) ); /* Q11 */ -#else - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[n]->input_fx, hCPE->hCoreCoder[n]->input32_fx, input_frame, sub( Q11, hCPE->hCoreCoder[n]->q_inp ) ); /* Q11 */ - Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[n]->input_fx - input_frame, hCPE->hCoreCoder[n]->input32_fx - input_frame, input_frame, sub( Q11, hCPE->hCoreCoder[n]->q_old_inp ) ); /* Q11 */ -#endif - hCPE->hCoreCoder[n]->q_inp32 = Q11; - move16(); - Scale_sig( hCPE->hCoreCoder[n]->input_fx, input_frame, sub( -1, hCPE->hCoreCoder[n]->q_inp ) ); /* Q(-1) */ - hCPE->hCoreCoder[n]->q_inp = -1; - move16(); - Scale_sig( hCPE->hCoreCoder[n]->old_input_signal_fx, input_frame, sub( -1, hCPE->hCoreCoder[n]->q_old_inp ) ); /* Q(-1) */ - hCPE->hCoreCoder[n]->q_old_inp = -1; - move16(); -#ifdef DEBUG_MODE_INFO in_buff_temp = hCPE->hCoreCoder[n]->input32_fx; in_q_temp = hCPE->hCoreCoder[n]->q_inp32; -#endif } +#endif + #ifdef DEBUG_MODE_INFO if ( !( hCPE != NULL && hCPE->hStereoTD != NULL && ch_idx > 0 ) ) @@ -316,16 +266,14 @@ ivas_error pre_proc_front_ivas_fx( } #endif -#ifdef MSAN_FIX FOR( Word16 k = 0; k < CLDFB_NO_COL_MAX; k++ ) { set32_fx( realBuffer_fx[k], 0, CLDFB_NO_CHANNELS_MAX ); set32_fx( imagBuffer_fx[k], 0, CLDFB_NO_CHANNELS_MAX ); } -#endif Word16 sf_energySum[CLDFB_NO_CHANNELS_MAX]; - Word16 Q_to_be_looked_into = -1; + Word16 Q_inp_const = -1; move16(); Word16 headroom = 0, preemp_len = 0, inp_max = 0; move16(); @@ -365,9 +313,6 @@ ivas_error pre_proc_front_ivas_fx( IF( hSCE != NULL ) { st = hSCE->hCoreCoder[n]; -#ifndef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING - signal_in = hSCE->hCoreCoder[n]->input; -#endif signal_in_fx = hSCE->hCoreCoder[n]->input_fx; /* hSCE->hCoreCoder[n]->q_inp */ signal32_in_fx = hSCE->hCoreCoder[n]->input32_fx; /* hSCE->hCoreCoder[n]->q_inp32 */ element_mode = IVAS_SCE; @@ -381,9 +326,6 @@ ivas_error pre_proc_front_ivas_fx( ELSE /* CPE */ { st = hCPE->hCoreCoder[n]; -#ifndef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING - signal_in = hCPE->hCoreCoder[n]->input; -#endif signal_in_fx = hCPE->hCoreCoder[n]->input_fx; /* hSCE->hCoreCoder[n]->q_inp */ signal32_in_fx = hCPE->hCoreCoder[n]->input32_fx; /* hSCE->hCoreCoder[n]->q_inp32 */ element_mode = hCPE->element_mode; @@ -480,11 +422,6 @@ ivas_error pre_proc_front_ivas_fx( L_look = L_LOOK_12k8; /* lookahead at 12.8kHz */ move16(); - Scale_sig( old_inp_12k8_fx, L_INP_12k8, sub( Q_to_be_looked_into, sub( Q15, old_inp_12k8_e ) ) ); /* Q_to_be_looked_into*/ - old_inp_12k8_e = sub( Q15, Q_to_be_looked_into ); - Scale_sig( st->old_inp_12k8_fx, 240, sub( Q_to_be_looked_into, sub( Q15, st->exp_old_inp_12k8 ) ) ); /* Q_to_be_looked_into */ - st->exp_old_inp_12k8 = sub( Q15, Q_to_be_looked_into ); - move16(); new_inp_12k8_fx = old_inp_12k8_fx + L_INP_MEM; /* pointer to new samples of the input signal in 12.8kHz core */ inp_12k8_fx = new_inp_12k8_fx - L_look; /* pointer to the current frame of input signal in 12.8kHz core */ @@ -495,15 +432,15 @@ ivas_error pre_proc_front_ivas_fx( IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) { - Copy( st->old_inp_12k8_fx, old_inp_12k8_fx, L_INP_MEM - STEREO_DFT_OVL_12k8 ); /* exp(st->exp_old_inp_12k8) */ + Copy_Scale_sig( st->old_inp_12k8_fx, old_inp_12k8_fx, L_INP_MEM - STEREO_DFT_OVL_12k8, sub( st->q_inp, sub( Q15, st->exp_old_inp_12k8 ) ) ); /* st->q_inp */ } ELSE IF( EQ_16( element_mode, IVAS_CPE_TD ) ) { - Copy( st->old_inp_12k8_fx, old_inp_12k8_fx, sub( L_INP_MEM - L_FILT, lMemRecalc_12k8 ) ); /* exp(st->exp_old_inp_12k8) */ + Copy_Scale_sig( st->old_inp_12k8_fx, old_inp_12k8_fx, sub( L_INP_MEM - L_FILT, lMemRecalc_12k8 ), sub( st->q_inp, sub( Q15, st->exp_old_inp_12k8 ) ) ); /* st->q_inp */ } ELSE { - Copy( st->old_inp_12k8_fx, old_inp_12k8_fx, L_INP_MEM - L_FILT ); /* exp(st->exp_old_inp_12k8) */ + Copy_Scale_sig( st->old_inp_12k8_fx, old_inp_12k8_fx, L_INP_MEM - L_FILT, sub( st->q_inp, sub( Q15, st->exp_old_inp_12k8 ) ) ); /* st->q_inp */ } Copy( st->old_wsp_fx, old_wsp_fx, L_WSP_MEM ); /* exp(st->exp_old_wsp) */ @@ -528,16 +465,22 @@ ivas_error pre_proc_front_ivas_fx( test(); IF( EQ_16( element_mode, IVAS_SCE ) || ( EQ_16( element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) ) { - analysisCldfbEncoder_ivas_fx( st, signal32_in_fx, 11, input_frame, realBuffer_fx, imagBuffer_fx, realBuffer16, imagBuffer16, enerBuffer_fx, enerBuffer_fx_exp, &cldfbScale ); + scale_sig32( signal32_in_fx - input_frame, input_frame_full, sub( 11, st->q_inp32 ) ); // Q11 + st->q_inp32 = 11; + move16(); + analysisCldfbEncoder_ivas_fx( st, signal32_in_fx, st->q_inp32, input_frame, realBuffer_fx, imagBuffer_fx, realBuffer16, imagBuffer16, enerBuffer_fx, enerBuffer_fx_exp, &cldfbScale ); } ELSE IF( ( EQ_16( element_mode, IVAS_CPE_TD ) && st->idchan == 0 ) || ( EQ_16( st->idchan, 1 ) && st->tdm_LRTD_flag ) ) { /* cldfb analysis only for pri. channel */ - analysisCldfbEncoder_ivas_fx( st, signal32_in_fx - NS2SA_FX2( input_Fs, L_MEM_RECALC_TBE_NS ), 11, input_frame, realBuffer_fx, imagBuffer_fx, realBuffer16, imagBuffer16, enerBuffer_fx, enerBuffer_fx_exp, &cldfbScale ); + scale_sig32( signal32_in_fx - input_frame, input_frame_full, sub( 11, st->q_inp32 ) ); // Q11 + st->q_inp32 = 11; + move16(); + analysisCldfbEncoder_ivas_fx( st, signal32_in_fx - NS2SA_FX2( input_Fs, L_MEM_RECALC_TBE_NS ), st->q_inp32, input_frame, realBuffer_fx, imagBuffer_fx, realBuffer16, imagBuffer16, enerBuffer_fx, enerBuffer_fx_exp, &cldfbScale ); } ELSE IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) { - calculate_energy_buffer_ivas_fx( hCPE, enerBuffer_fx, st->cldfbAnaEnc->no_channels, input_Fs, enerBuffer_fx_exp ); + calculate_energy_buffer_ivas_fx( hCPE, enerBuffer_fx, st->cldfbAnaEnc->no_channels, input_Fs, enerBuffer_fx_exp_buf ); } ELSE { @@ -553,17 +496,19 @@ ivas_error pre_proc_front_ivas_fx( * Change the sampling frequency to 12.8 kHz * (if not available from downsampled DMX) *----------------------------------------------------------------*/ - + Scale_sig( st->mem_decim_fx_q_inp, 2 * L_FILT_MAX, sub( st->q_inp, st->mem_q ) ); /* st->q_inp */ test(); + IF( EQ_16( element_mode, IVAS_SCE ) ) { - new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx, input_frame, input_Fs, new_inp_12k8_fx, INT_FS_12k8, st->mem_decim_fx, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); /* Q0 */ - Scale_sig( new_inp_12k8_fx, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to Q_to_be_looked_into*/ - - Copy( st->mem_decim_fx, mem_decim_dummy_fx, 2 * L_FILT_MAX ); /* Q(-1) */ + new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx, input_frame, input_Fs, new_inp_12k8_fx, INT_FS_12k8, st->mem_decim_fx_q_inp, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); /* st->q_inp */ + Scale_sig( new_inp_12k8_fx, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/ + st->mem_q = st->q_inp; + move16(); + Copy( st->mem_decim_fx_q_inp, mem_decim_dummy_fx, 2 * L_FILT_MAX ); /* Q(-1) */ set16_fx( temp1F_icatdmResampBuf_fx, 0, L_FILT_MAX ); - new_inp_out_size = modify_Fs_ivas_fx( temp1F_icatdmResampBuf_fx, NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), input_Fs, new_inp_12k8_fx + L_FRAME, INT_FS_12k8, mem_decim_dummy_fx, 0, &Q_new_inp, &mem_decim_size ); /* Q0 */ - Scale_sig( new_inp_12k8_fx + L_FRAME, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to Q_to_be_looked_into*/ + new_inp_out_size = modify_Fs_ivas_fx( temp1F_icatdmResampBuf_fx, NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), input_Fs, new_inp_12k8_fx + L_FRAME, INT_FS_12k8, mem_decim_dummy_fx, 0, &Q_new_inp, &mem_decim_size ); /* st->q_inp */ + Scale_sig( new_inp_12k8_fx + L_FRAME, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/ } ELSE IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_MDCT ) ) { @@ -574,27 +519,43 @@ ivas_error pre_proc_front_ivas_fx( Word16 length_inp = NS2SA_FX2( input_Fs, L_MEM_RECALC_SCH_NS ); Word16 length_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_SCH_NS ); - new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx - lMemRecalc - length_inp, length_inp, input_Fs, new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, INT_FS_12k8, st->mem_decim_fx, 0, &Q_new_inp, &mem_decim_size ); /* Q0 */ - Scale_sig( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to Q_to_be_looked_into*/ + new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx - lMemRecalc - length_inp, length_inp, input_Fs, new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, INT_FS_12k8, st->mem_decim_fx_q_inp, 0, &Q_new_inp, &mem_decim_size ); /* st->q_inp */ + Scale_sig( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/ } - new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx - lMemRecalc, input_frame, input_Fs, new_inp_12k8_fx - lMemRecalc_12k8, INT_FS_12k8, st->mem_decim_fx, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); /* Q0 */ - Copy( st->mem_decim_fx, mem_decim_dummy_fx, 2 * L_FILT_MAX ); /* Q(-1) */ - Scale_sig( new_inp_12k8_fx - lMemRecalc_12k8, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to Q_to_be_looked_into*/ + new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx - lMemRecalc, input_frame, input_Fs, new_inp_12k8_fx - lMemRecalc_12k8, INT_FS_12k8, st->mem_decim_fx_q_inp, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); /* st->q_inp */ + st->mem_q = st->q_inp; + move16(); + Copy( st->mem_decim_fx_q_inp, mem_decim_dummy_fx, 2 * L_FILT_MAX ); /* st->q_inp */ + Scale_sig( new_inp_12k8_fx - lMemRecalc_12k8, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/ IF( lMemRecalc > 0 ) { - new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx + sub( input_frame, lMemRecalc ), lMemRecalc, input_Fs, new_inp_12k8_fx + sub( L_FRAME, lMemRecalc_12k8 ), INT_FS_12k8, mem_decim_dummy_fx, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); /* Q0 */ - Scale_sig( new_inp_12k8_fx + L_FRAME - lMemRecalc_12k8, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to Q_to_be_looked_into*/ + new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx + sub( input_frame, lMemRecalc ), lMemRecalc, input_Fs, new_inp_12k8_fx + sub( L_FRAME, lMemRecalc_12k8 ), INT_FS_12k8, mem_decim_dummy_fx, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); /* st->q_inp */ + Scale_sig( new_inp_12k8_fx + L_FRAME - lMemRecalc_12k8, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/ } set16_fx( temp1F_icatdmResampBuf_fx, 0, L_FILT_MAX ); - new_inp_out_size = modify_Fs_ivas_fx( temp1F_icatdmResampBuf_fx, NS2SA_FX2( input_Fs, DELAY_FIR_RESAMPL_NS ), input_Fs, new_inp_12k8_fx + L_FRAME, INT_FS_12k8, mem_decim_dummy_fx, 0, &Q_new_inp, &mem_decim_size ); /* Q0 */ - Scale_sig( new_inp_12k8_fx + L_FRAME, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to Q_to_be_looked_into*/ + new_inp_out_size = modify_Fs_ivas_fx( temp1F_icatdmResampBuf_fx, NS2SA_FX2( input_Fs, DELAY_FIR_RESAMPL_NS ), input_Fs, new_inp_12k8_fx + L_FRAME, INT_FS_12k8, mem_decim_dummy_fx, 0, &Q_new_inp, &mem_decim_size ); /* st->q_inp */ + Scale_sig( new_inp_12k8_fx + L_FRAME, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/ } ELSE /* DFT stereo */ { /* update the FIR resampling filter memory, needed for switching to time-domain (FIR) resampling */ - Copy( signal_in_fx + sub( input_frame, add( NS2SA_FX2( input_Fs, L_MEM_RECALC_NS ), 2 * NS2SA_FX2( input_Fs, DELAY_FIR_RESAMPL_NS ) ) ), st->mem_decim_fx, 2 * NS2SA_FX2( input_Fs, DELAY_FIR_RESAMPL_NS ) ); /* hSCE->hCoreCoder[n]->q_inp */ + Copy( signal_in_fx + sub( input_frame, add( NS2SA_FX2( input_Fs, L_MEM_RECALC_NS ), 2 * NS2SA_FX2( input_Fs, DELAY_FIR_RESAMPL_NS ) ) ), st->mem_decim_fx_q_inp, 2 * NS2SA_FX2( input_Fs, DELAY_FIR_RESAMPL_NS ) ); /* st->q_inp */ + st->mem_q = st->q_inp; + move16(); + scale_sig( old_inp_12k8_fx, L_INP_MEM - STEREO_DFT_OVL_12k8, sub( Q_inp_const, st->q_inp ) ); + scale_sig( st->input_fx - input_frame, input_frame_full, sub( Q_inp_const, st->q_inp ) ); + Copy_Scale_sig( st->mem_decim_fx_q_inp, st->mem_decim_fx, 2 * L_FILT_MAX, sub( Q_inp_const, st->q_inp ) ); /* Q(-1) */ + // Scale_sig( st->mem_decim_fx, 2 * L_FILT_MAX, sub( Q_inp_const, st->q_inp ) ); /* Q(-1) */ + st->q_inp = Q_inp_const; + move16(); + st->q_old_inp = Q_inp_const; + move16(); + } + IF( NE_16( Q_inp_const, st->q_inp ) ) + { + Copy_Scale_sig( st->mem_decim_fx_q_inp, st->mem_decim_fx, 2 * L_FILT_MAX, sub( Q_inp_const, st->q_inp ) ); /* Q(-1) */ } Scale_sig( st->buf_speech_enc, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, sub( -1, sub( 15, st->exp_buf_speech_enc ) ) ); /* Q(-1) */ @@ -605,15 +566,15 @@ ivas_error pre_proc_front_ivas_fx( test(); IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) { - Copy( new_inp_12k8_fx - STEREO_DFT_OVL_12k8, st->buf_speech_enc + L_FRAME32k - STEREO_DFT_OVL_12k8, L_FRAME + STEREO_DFT_OVL_12k8 ); /* Q_to_be_looked_into */ + Copy_Scale_sig( new_inp_12k8_fx - STEREO_DFT_OVL_12k8, st->buf_speech_enc + L_FRAME32k - STEREO_DFT_OVL_12k8, L_FRAME + STEREO_DFT_OVL_12k8, sub( Q_inp_const, st->q_inp ) ); /* Q_inp_const */ } ELSE IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_MDCT ) ) { - Copy( new_inp_12k8_fx - lMemRecalc_12k8, st->buf_speech_enc + L_FRAME32k - lMemRecalc_12k8 - L_FILT, add( L_FRAME + L_FILT, lMemRecalc_12k8 ) ); /* Q_to_be_looked_into */ + Copy_Scale_sig( new_inp_12k8_fx - lMemRecalc_12k8, st->buf_speech_enc + L_FRAME32k - lMemRecalc_12k8 - L_FILT, add( L_FRAME + L_FILT, lMemRecalc_12k8 ), sub( Q_inp_const, st->q_inp ) ); /* Q_inp_const */ } ELSE { - Copy( new_inp_12k8_fx, st->buf_speech_enc + L_FRAME32k, L_FRAME ); /* Q_to_be_looked_into */ + Copy_Scale_sig( new_inp_12k8_fx, st->buf_speech_enc + L_FRAME32k, L_FRAME, sub( Q_inp_const, st->q_inp ) ); /* Q_inp_const */ } /*------------------------------------------------------------------* @@ -627,20 +588,23 @@ ivas_error pre_proc_front_ivas_fx( headroom = 2; move16(); - + st->mem_preemph_fx_q_inp = shl_sat( st->mem_preemph_fx_q_inp, sub( st->q_inp, st->mem_preemph_q ) ); /*st->q_inp*/ + move16(); + st->mem_preemph_DFT_fx_q_inp = shl_sat( st->mem_preemph_DFT_fx_q_inp, sub( st->q_inp, st->mem_preemph_q ) ); /*st->q_inp*/ + move16(); test(); IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) { - Copy( new_inp_12k8_fx - STEREO_DFT_OVL_12k8 + L_FRAME, st->inp_12k8_mem_stereo_sw_fx, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); /* memory for TD/DFT stereo switching Q_to_be_looked_into*/ + Copy_Scale_sig( new_inp_12k8_fx - STEREO_DFT_OVL_12k8 + L_FRAME, st->inp_12k8_mem_stereo_sw_fx, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, sub( Q_inp_const, st->q_inp ) ); /* memory for TD/DFT stereo switching Q_inp_const*/ - st->mem_preemph_fx = st->mem_preemph_DFT_fx; /* Q(-1) */ + st->mem_preemph_fx_q_inp = st->mem_preemph_DFT_fx_q_inp; /* st->q_inp */ move16(); - st->mem_preemph_DFT_fx = old_inp_12k8_fx[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; /* Q_new - 1 */ + st->mem_preemph_DFT_fx_q_inp = old_inp_12k8_fx[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; /* st->q_inp */ move16(); // PREEMPH_FX( new_inp_12k8_fx - STEREO_DFT_OVL_12k8, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); - PREEMPH_32FX( new_inp_12k8_fx - STEREO_DFT_OVL_12k8, sig_out, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); - dummy_fx = st->mem_preemph_fx; + PREEMPH_32FX( new_inp_12k8_fx - STEREO_DFT_OVL_12k8, sig_out, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx_q_inp ); + dummy_fx = st->mem_preemph_fx_q_inp; move16(); // PREEMPH_FX( new_inp_12k8_fx - STEREO_DFT_OVL_12k8 + L_FRAME, PREEMPH_FAC, STEREO_DFT_OVL_12k8, &dummy_fx ); @@ -656,18 +620,18 @@ ivas_error pre_proc_front_ivas_fx( { IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) { - st->mem_preemph_fx = st->mem_preemph_DFT_fx; + st->mem_preemph_fx_q_inp = st->mem_preemph_DFT_fx_q_inp; /* st->q_inp */ move16(); - Copy( st->inp_12k8_mem_stereo_sw_fx, new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); /* Q(-1) */ + Copy_Scale_sig( st->inp_12k8_mem_stereo_sw_fx, new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, sub( st->q_inp, Q_inp_const ) ); /* st->q_inp */ // PREEMPH_FX( new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), PREEMPH_FAC, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, &st->mem_preemph_fx ); - PREEMPH_32FX( new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), sig_out, PREEMPH_FAC, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, &st->mem_preemph_fx ); + PREEMPH_32FX( new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), sig_out, PREEMPH_FAC, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, &st->mem_preemph_fx_q_inp ); preemp_start_idx = new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); move16(); preemp_len = STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT; move16(); } - st->mem_preemph_DFT_fx = old_inp_12k8_fx[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; /* == inp_12k8[L_FRAME-1] Q_new - 1 */ + st->mem_preemph_DFT_fx_q_inp = old_inp_12k8_fx[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; /* st->q_inp */ move16(); } @@ -678,15 +642,15 @@ ivas_error pre_proc_front_ivas_fx( Word16 length_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_SCH_NS ); move16(); // PREEMPH_FX( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, PREEMPH_FAC, length_12k8, &st->mem_preemph_fx ); - PREEMPH_32FX( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, sig_out, PREEMPH_FAC, length_12k8, &st->mem_preemph_fx ); + PREEMPH_32FX( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, sig_out, PREEMPH_FAC, length_12k8, &st->mem_preemph_fx_q_inp ); preemp_start_idx = new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8; preemp_len = length_12k8; move16(); } // PREEMPH_FX( new_inp_12k8_fx - lMemRecalc_12k8, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); - PREEMPH_32FX( new_inp_12k8_fx - lMemRecalc_12k8, sig_out + preemp_len, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); - dummy_fx = st->mem_preemph_fx; /* Q(-1) */ + PREEMPH_32FX( new_inp_12k8_fx - lMemRecalc_12k8, sig_out + preemp_len, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx_q_inp ); + dummy_fx = st->mem_preemph_fx_q_inp; /* st->q_inp */ move16(); // PREEMPH_FX( new_inp_12k8_fx - lMemRecalc_12k8 + L_FRAME, PREEMPH_FAC, lMemRecalc_12k8 + L_FILT, &dummy_fx ); PREEMPH_32FX( new_inp_12k8_fx - lMemRecalc_12k8 + L_FRAME, sig_out + preemp_len + L_FRAME, PREEMPH_FAC, lMemRecalc_12k8 + L_FILT, &dummy_fx ); @@ -707,8 +671,8 @@ ivas_error pre_proc_front_ivas_fx( ELSE /* IVAS_SCE or IVAS_CPE_MDCT */ { // PREEMPH_FX( new_inp_12k8_fx, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); - PREEMPH_32FX( new_inp_12k8_fx, sig_out, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); - dummy_fx = st->mem_preemph_fx; + PREEMPH_32FX( new_inp_12k8_fx, sig_out, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx_q_inp ); + dummy_fx = st->mem_preemph_fx_q_inp; move16(); // PREEMPH_FX( new_inp_12k8_fx + L_FRAME, PREEMPH_FAC, L_FILT, &dummy_fx ); PREEMPH_32FX( new_inp_12k8_fx + L_FRAME, sig_out + L_FRAME, PREEMPH_FAC, L_FILT, &dummy_fx ); @@ -716,12 +680,16 @@ ivas_error pre_proc_front_ivas_fx( preemp_len = L_FRAME + L_FILT; move16(); } - + st->mem_preemph_fx = shl_sat( st->mem_preemph_fx_q_inp, sub( -1, st->q_inp ) ); /*Q(-1) saturation added as float value goes above 65536 for +10 dB test (ltv48_MC512.wav and ltv48_MC51.wav) */ + move16(); + st->mem_preemph_DFT_fx = shl_sat( st->mem_preemph_DFT_fx_q_inp, sub( -1, st->q_inp ) ); /*Q(-1)*/ + move16(); + st->mem_preemph_q = st->q_inp; + move16(); maximum_abs_32_fx( sig_out, preemp_len, &max_32 ); inp_max = s_max( extract_h( max_32 ), 1 ); - shift = sub( norm_s( inp_max ), headroom ); - Word16 Q_min; + Word16 shift = add( sub( norm_s( inp_max ), headroom ), st->q_inp ); shift = s_max( shift, 0 ); shift = s_min( shift, Q_MAX ); minimum_fx( st->Q_max, L_Q_MEM, &Q_min ); @@ -744,12 +712,10 @@ ivas_error pre_proc_front_ivas_fx( st->Q_max[i] = shift; move16(); - Copy_Scale_sig32_16( sig_out, preemp_start_idx, preemp_len, *Q_new ); /* Q_to_be_looked_into + Q_new */ - - Scale_sig( old_inp_12k8_fx, (Word16) ( preemp_start_idx - old_inp_12k8_fx ), *Q_new ); /* Q(-1) */ - - *Q_new = add( *Q_new, Q_to_be_looked_into ); + *Q_new = add( *Q_new, Q_inp_const ); move16(); + Copy_Scale_sig32_16( sig_out, preemp_start_idx, preemp_len, sub( add( *Q_new, 1 ), st->q_inp ) ); /* Q_new */ + Scale_sig( old_inp_12k8_fx, (Word16) ( preemp_start_idx - old_inp_12k8_fx ), sub( *Q_new, st->q_inp ) ); /* Q_new */ cldfbScale.hb_scale = cldfbScale.lb_scale; move16(); @@ -774,7 +740,7 @@ ivas_error pre_proc_front_ivas_fx( IF( hStereoClassif != NULL ) { - IF( GT_32( sub( st->lp_speech_fx, Etot_fx ), 25 << Q8 ) ) /*Q8*/ + IF( GT_32( L_sub( st->lp_speech_32fx, Etot_fx ), 25 << Q24 ) ) /*Q8*/ { hStereoClassif->silence_flag = 2; move16(); @@ -794,11 +760,11 @@ ivas_error pre_proc_front_ivas_fx( IF( hCPE != NULL ) { - noise_est_pre_32fx( L_deposit_h( Etot_fx ), st->ini_frame, st->hNoiseEst, st->idchan, element_mode, hCPE->last_element_mode ); + noise_est_pre_32fx( ( Etot_fx ), st->ini_frame, st->hNoiseEst, st->idchan, element_mode, hCPE->last_element_mode ); } ELSE { - noise_est_pre_32fx( L_deposit_h( Etot_fx ), st->ini_frame, st->hNoiseEst, st->idchan, element_mode, element_mode ); + noise_est_pre_32fx( ( Etot_fx ), st->ini_frame, st->hNoiseEst, st->idchan, element_mode, element_mode ); } test(); @@ -810,26 +776,9 @@ ivas_error pre_proc_front_ivas_fx( move16(); } - Word16 scale = add( L_norm_arr( st->hNoiseEst->bckr_fx, NB_BANDS ), st->hNoiseEst->q_bckr ); - scale = s_min( scale, add( L_norm_arr( st->hNoiseEst->enrO_fx, NB_BANDS ), st->hNoiseEst->q_enrO ) ); - scale = s_min( scale, fr_bands_fx_q ); - - scale_sig32( st->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, st->hNoiseEst->q_bckr ) ); - st->hNoiseEst->q_bckr = scale; - move16(); - - scale_sig32( st->hNoiseEst->enrO_fx, NB_BANDS, sub( scale, st->hNoiseEst->q_enrO ) ); - st->hNoiseEst->q_enrO = scale; - move16(); - - scale_sig32( fr_bands_fx, 2 * NB_BANDS, sub( scale, fr_bands_fx_q ) ); - fr_bands_fx_q = scale; - move16(); - st->vad_flag = wb_vad_ivas_fx( st, fr_bands_fx, fr_bands_fx_q, &i, &i, &i, &snr_sum_he_fx, &localVAD_HE_SAD, &( st->flag_noisy_speech_snr ), NULL, NULL, -MAX_16, -MAX_16 ); //-100000f == max 16bit float move16(); - #ifdef DEBUG_FORCE_DIR if ( st->force_dir[0] != '\0' ) { @@ -855,7 +804,7 @@ ivas_error pre_proc_front_ivas_fx( test(); IF( ( hCPE != NULL && !( lr_vad_enabled && st->idchan == 0 ) ) || hSCE != NULL ) { - *vad_flag_dtx = ivas_dtx_hangover_addition_fx( st, st->vad_flag, sub( st->lp_speech_fx, st->lp_noise_fx ), 0, vad_hover_flag, NULL, NULL, NULL ); /* Q0 */ + *vad_flag_dtx = ivas_dtx_hangover_addition_fx( st, st->vad_flag, extract_h( L_sub( st->lp_speech_32fx, st->lp_noise_32fx ) ), 0, vad_hover_flag, NULL, NULL, NULL ); /* Q0 */ move16(); } ELSE @@ -885,22 +834,38 @@ ivas_error pre_proc_front_ivas_fx( /*----------------------------------------------------------------* * NB/WB/SWB/FB bandwidth detector *----------------------------------------------------------------*/ - FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + + IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) { - sf_energySum[i] = *enerBuffer_fx_exp; - move16(); + FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + { + sf_energySum[i] = enerBuffer_fx_exp_buf[i]; + move16(); + } + } + ELSE + { + set16_fx( sf_energySum, *enerBuffer_fx_exp, CLDFB_NO_CHANNELS_MAX ); } test(); IF( st->idchan == 0 && NE_16( element_mode, IVAS_CPE_MDCT ) ) { - Scale_sig( st->input_fx, 480, negate( Q_to_be_looked_into ) ); /*scaling from Q_to_be_looked_into to q0*/ + Word16 input_fx_tmp[480]; + Copy_Scale_sig( st->input_fx, input_fx_tmp, shr( input_frame, 1 ), negate( st->q_inp ) ); /*scaling from Q_inp_const to q0*/ - bw_detect_fx( st, st->input_fx, NULL, enerBuffer_fx, sf_energySum, ivas_format, 0 ); - - Scale_sig( st->input_fx, 480, Q_to_be_looked_into ); /*scaling back to Q_to_be_looked_into*/ + bw_detect_fx( st, input_fx_tmp, NULL, enerBuffer_fx, sf_energySum, ivas_format, 0, 0 ); } + IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) + { + maximum_fx( sf_energySum, CLDFB_NO_CHANNELS_MAX, enerBuffer_fx_exp ); + FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + { + enerBuffer_fx[i] = L_shl( enerBuffer_fx[i], sub( sf_energySum[i], *enerBuffer_fx_exp ) ); + move32(); + } + } IF( NE_16( element_mode, IVAS_CPE_MDCT ) ) /* in MDCT stereo, set_bw_stereo() is used instead */ { @@ -936,52 +901,22 @@ ivas_error pre_proc_front_ivas_fx( * Correlation correction as a function of total noise level *----------------------------------------------------------------*/ - noise_est_down_ivas_fx( fr_bands_fx, fr_bands_fx_q, st->hNoiseEst->bckr_fx, tmpN_fx, tmpE_fx, st->min_band, st->max_band, - &st->hNoiseEst->totalNoise_fx, Etot_fx, &st->hNoiseEst->Etot_last_fx, &st->hNoiseEst->Etot_v_h2_fx ); - q_tmpN = fr_bands_fx_q; - q_tmpE = fr_bands_fx_q; - move16(); - move16(); + noise_est_down_ivas_fx( fr_bands_fx, fr_bands_fx_q, st->hNoiseEst->bckr_fx, &st->hNoiseEst->q_bckr, tmpN_fx, &q_tmpN, tmpE_fx, &q_tmpE, st->min_band, st->max_band, + &st->hNoiseEst->totalNoise_32fx, Etot_fx, &st->hNoiseEst->Etot_last_32fx, &st->hNoiseEst->Etot_v_h2_32fx ); test(); IF( lr_vad_enabled && st->idchan == 0 ) { - scale = add( L_norm_arr( hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, NB_BANDS ), hCPE->hFrontVad[0]->hNoiseEst->q_bckr ); - scale = s_min( scale, add( L_norm_arr( hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, NB_BANDS ), hCPE->hFrontVad[1]->hNoiseEst->q_bckr ) ); - scale = s_min( scale, add( L_norm_arr( fr_bands_LR_fx[0], 2 * NB_BANDS ), fr_bands_LR_fx_q[0] ) ); - scale = s_min( scale, add( L_norm_arr( fr_bands_LR_fx[1], 2 * NB_BANDS ), fr_bands_LR_fx_q[1] ) ); - - scale_sig32( fr_bands_LR_fx[0], 2 * NB_BANDS, sub( scale, fr_bands_LR_fx_q[0] ) ); - fr_bands_LR_fx_q[0] = scale; - move16(); - scale_sig32( fr_bands_LR_fx[1], 2 * NB_BANDS, sub( scale, fr_bands_LR_fx_q[1] ) ); - fr_bands_LR_fx_q[1] = scale; - move16(); - - scale_sig32( hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, hCPE->hFrontVad[0]->hNoiseEst->q_bckr ) ); - hCPE->hFrontVad[0]->hNoiseEst->q_bckr = scale; - move16(); - scale_sig32( hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, hCPE->hFrontVad[1]->hNoiseEst->q_bckr ) ); - hCPE->hFrontVad[1]->hNoiseEst->q_bckr = scale; - move16(); - - noise_est_down_ivas_fx( fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, tmpN_LR_fx[0], tmpE_LR_fx[0], st->min_band, st->max_band, &hCPE->hFrontVad[0]->hNoiseEst->totalNoise_fx, Etot_LR_fx[0], &hCPE->hFrontVad[0]->hNoiseEst->Etot_last_fx, &hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_fx ); - noise_est_down_ivas_fx( fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, tmpN_LR_fx[1], tmpE_LR_fx[1], st->min_band, st->max_band, &hCPE->hFrontVad[1]->hNoiseEst->totalNoise_fx, Etot_LR_fx[1], &hCPE->hFrontVad[1]->hNoiseEst->Etot_last_fx, &hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_fx ); + noise_est_down_ivas_fx( fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[0]->hNoiseEst->q_bckr, tmpN_LR_fx[0], &q_tmpN_LR[0], tmpE_LR_fx[0], &q_tmpE_LR[0], st->min_band, st->max_band, &hCPE->hFrontVad[0]->hNoiseEst->totalNoise_32fx, L_deposit_h( Etot_LR_fx[0] ), &hCPE->hFrontVad[0]->hNoiseEst->Etot_last_32fx, &hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_32fx ); + noise_est_down_ivas_fx( fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[1]->hNoiseEst->q_bckr, tmpN_LR_fx[1], &q_tmpN_LR[1], tmpE_LR_fx[1], &q_tmpE_LR[1], st->min_band, st->max_band, &hCPE->hFrontVad[1]->hNoiseEst->totalNoise_32fx, L_deposit_h( Etot_LR_fx[1] ), &hCPE->hFrontVad[1]->hNoiseEst->Etot_last_32fx, &hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_32fx ); - q_tmpN_LR[0] = q_tmpE_LR[0] = scale; - move16(); - move16(); - q_tmpN_LR[1] = q_tmpE_LR[1] = scale; - move16(); - move16(); - - corr_shiftL_fx = correlation_shift_fx( hCPE->hFrontVad[0]->hNoiseEst->totalNoise_fx ); // Q15 - corr_shiftR_fx = correlation_shift_fx( hCPE->hFrontVad[1]->hNoiseEst->totalNoise_fx ); // Q15 + corr_shiftL_fx = correlation_shift_fx( extract_h( hCPE->hFrontVad[0]->hNoiseEst->totalNoise_32fx ) ); // Q15 + corr_shiftR_fx = correlation_shift_fx( extract_h( hCPE->hFrontVad[1]->hNoiseEst->totalNoise_32fx ) ); // Q15 } - *relE_fx = sub( Etot_fx, st->lp_speech_fx ); // Q8 + *relE_fx = sub( extract_h( Etot_fx ), extract_h( st->lp_speech_32fx ) ); // Q8 move16(); - corr_shift_fx = correlation_shift_fx( st->hNoiseEst->totalNoise_fx ); /* Q15 */ + corr_shift_fx = correlation_shift_fx( extract_h( st->hNoiseEst->totalNoise_32fx ) ); /* Q15 */ /*----------------------------------------------------------------* * FD-CNG Noise Estimator @@ -993,78 +928,41 @@ ivas_error pre_proc_front_ivas_fx( test(); IF( st->idchan == 0 || EQ_16( element_mode, IVAS_CPE_MDCT ) ) { - test(); - test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) && lr_vad_enabled && band_energies_LR_fx != NULL ) + Word16 norm; + norm = L_norm_arr( st->hFdCngEnc->msPeriodog_fx, NPART ); + IF( NE_16( norm, Q31 ) ) { - Word16 normmsPeriodog_fx = Q31, zero_flag = 0; - move16(); - move16(); - zero_flag = get_zero_flag( st->hFdCngEnc->msPeriodog_fx, NPART ); - IF( zero_flag ) - { - normmsPeriodog_fx = getScaleFactor32( st->hFdCngEnc->msPeriodog_fx, NPART ); - move16(); - } - st->hFdCngEnc->msPeriodog_fx_exp_cldfb = sub( 31, normmsPeriodog_fx ); - st->hFdCngEnc->msPeriodog_fx_exp_fft = sub( 31, normmsPeriodog_fx ); + scale_sig32( st->hFdCngEnc->msPeriodog_fx, NPART, norm ); // exp:st->hFdCngEnc->msPeriodog_fx_exp-norm + st->hFdCngEnc->msPeriodog_fx_exp = sub( st->hFdCngEnc->msPeriodog_fx_exp, norm ); + st->hFdCngEnc->msPeriodog_fx_exp_cldfb = sub( st->hFdCngEnc->msPeriodog_fx_exp_cldfb, norm ); + st->hFdCngEnc->msPeriodog_fx_exp_fft = sub( st->hFdCngEnc->msPeriodog_fx_exp_fft, norm ); move16(); move16(); - Scale_sig32( st->hFdCngEnc->msPeriodog_fx, NPART, normmsPeriodog_fx ); /* exp(st->hFdCngEnc->msPeriodog_fx_exp - normmsPeriodog_fx) */ - st->hFdCngEnc->msPeriodog_fx_exp = sub( st->hFdCngEnc->msPeriodog_fx_exp, normmsPeriodog_fx ); - Word16 msNoiseEst_Q = Q31; move16(); + } + norm = L_norm_arr( st->hFdCngEnc->msNoiseEst_old_fx, NPART ); + IF( NE_16( norm, Q31 ) ) + { + scale_sig32( st->hFdCngEnc->msNoiseEst_old_fx, NPART, norm ); // exp:st->hFdCngEnc->msNoiseEst_old_fx_exp-norm + st->hFdCngEnc->msNoiseEst_old_fx_exp = sub( st->hFdCngEnc->msNoiseEst_old_fx_exp, norm ); move16(); - zero_flag = get_zero_flag( st->hFdCngEnc->msNoiseEst_old_fx, NPART ); - IF( zero_flag ) - { - msNoiseEst_Q = getScaleFactor32( st->hFdCngEnc->msNoiseEst_old_fx, NPART ); - scale_sig32( st->hFdCngEnc->msNoiseEst_old_fx, NPART, msNoiseEst_Q ); /* exp(st->hFdCngEnc->msNoiseEst_old_fx_exp - msNoiseEst_Q) */ - st->hFdCngEnc->msNoiseEst_old_fx_exp = sub( st->hFdCngEnc->msNoiseEst_old_fx_exp, msNoiseEst_Q ); - move16(); - } + } + + test(); + test(); + IF( EQ_16( element_mode, IVAS_CPE_TD ) && lr_vad_enabled && band_energies_LR_fx != NULL ) + { perform_noise_estimation_enc_ivas_fx( band_energies_LR_fx, sub( Q31, band_energies_LR_fx_q ), enerBuffer_fx, *enerBuffer_fx_exp, st->hFdCngEnc, input_Fs, hCPE ); } ELSE { - Word16 normmsPeriodog_fx = Q31, zero_flag = 0; - move16(); - move16(); - shift = getScaleFactor32( band_energies_fx, 2 * NB_BANDS ); - scale_sig32( band_energies_fx, 2 * NB_BANDS, shift ); - q_band_energies = add( q_band_energies, shift ); - - zero_flag = get_zero_flag( st->hFdCngEnc->msPeriodog_fx, NPART ); /* Q0 */ - IF( zero_flag ) + norm = L_norm_arr( st->hFdCngEnc->hFdCngCom->periodog, PERIODOGLEN ); + IF( NE_16( norm, Q31 ) ) { - normmsPeriodog_fx = getScaleFactor32( st->hFdCngEnc->msPeriodog_fx, NPART ); - } - st->hFdCngEnc->msPeriodog_fx_exp_cldfb = sub( 31, normmsPeriodog_fx ); - st->hFdCngEnc->msPeriodog_fx_exp_fft = sub( 31, normmsPeriodog_fx ); - move16(); - move16(); - Scale_sig32( st->hFdCngEnc->msPeriodog_fx, NPART, normmsPeriodog_fx ); /* exp(st->hFdCngEnc->msPeriodog_fx_exp - normmsPeriodog_fx)*/ - st->hFdCngEnc->msPeriodog_fx_exp = sub( st->hFdCngEnc->msPeriodog_fx_exp, normmsPeriodog_fx ); - move16(); - Word16 msNoiseEst_Q = Q31; - move16(); - zero_flag = get_zero_flag( st->hFdCngEnc->msNoiseEst_old_fx, NPART ); /* Q0 */ - IF( zero_flag ) - { - msNoiseEst_Q = getScaleFactor32( st->hFdCngEnc->msNoiseEst_old_fx, NPART ); - scale_sig32( st->hFdCngEnc->msNoiseEst_old_fx, NPART, msNoiseEst_Q ); /* exp(st->hFdCngEnc->msNoiseEst_old_fx_exp - msNoiseEst_Q) */ - st->hFdCngEnc->msNoiseEst_old_fx_exp = sub( st->hFdCngEnc->msNoiseEst_old_fx_exp, msNoiseEst_Q ); + scale_sig32( st->hFdCngEnc->hFdCngCom->periodog, PERIODOGLEN, norm ); // exp:st->hFdCngEnc->hFdCngCom->exp_cldfb_periodog-norm + st->hFdCngEnc->hFdCngCom->exp_cldfb_periodog = sub( st->hFdCngEnc->hFdCngCom->exp_cldfb_periodog, norm ); move16(); } - zero_flag = get_zero_flag( st->hFdCngEnc->hFdCngCom->periodog, PERIODOGLEN ); /* Q0 */ - Word16 normmsperiodog = 31; - move16(); - IF( zero_flag ) - { - normmsperiodog = getScaleFactor32( st->hFdCngEnc->hFdCngCom->periodog, PERIODOGLEN ); - } - st->hFdCngEnc->hFdCngCom->exp_cldfb_periodog = sub( 31, normmsperiodog ); - move16(); perform_noise_estimation_enc_ivas_fx( band_energies_fx, sub( Q31, q_band_energies ), enerBuffer_fx, *enerBuffer_fx_exp, st->hFdCngEnc, input_Fs, hCPE ); } @@ -1092,11 +990,7 @@ ivas_error pre_proc_front_ivas_fx( move16(); } -#ifdef NONBE_1211_DTX_BR_SWITCHING dtx_ivas_fx( st, last_ivas_total_brate, ivas_total_brate, *vad_flag_dtx, inp_12k8_fx, *Q_new ); -#else - dtx_ivas_fx( st, ivas_total_brate, *vad_flag_dtx, inp_12k8_fx, *Q_new ); -#endif test(); test(); @@ -1184,10 +1078,8 @@ ivas_error pre_proc_front_ivas_fx( * LP analysis *----------------------------------------------------------------*/ Word16 stab_fac_fx; - Word16 Q_new_loc; Word16 Q_r[2]; set16_fx( Q_r, 0, 2 ); - Q_new_loc = *Q_new; move16(); alw_pitch_lag_12k8[0] = st->old_pitch_la; /* Q0 */ @@ -1210,8 +1102,7 @@ ivas_error pre_proc_front_ivas_fx( move16(); } - analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, - INT_FS_12k8, i, Q_new_loc, Q_r ); + analy_lp_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, element_mode, i, *Q_new, Q_r ); FOR( Word16 idx = 0; idx < M + 1; idx++ ) { @@ -1266,21 +1157,10 @@ ivas_error pre_proc_front_ivas_fx( Word16 shift1 = norm_arr( old_wsp_fx, L_WSP_MEM ); Word16 shift2 = norm_arr( wsp_fx, L_WSP - L_WSP_MEM ); - maximum_abs_16_fx( old_wsp_fx, L_WSP_MEM, &shift ); - if ( !shift ) - { - shift1 = Q15; - move16(); - } - maximum_abs_16_fx( wsp_fx, L_WSP - L_WSP_MEM, &shift ); - if ( !shift ) - { - shift2 = Q15; - move16(); - } shift = s_min( add( *q_old_wsp, shift1 ), add( Q_wsp, shift2 ) ); shift = s_min( shift, add( norm_arr( st->mem_decim2_fx, 3 ), st->Q_old_wsp2 ) ); shift = s_min( shift, add( norm_arr( st->old_wsp2_fx, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ), st->Q_old_wsp2 ) ); + shift = s_min( shift, 15 ); scale_sig( old_wsp_fx, L_WSP_MEM, sub( shift, *q_old_wsp ) ); scale_sig( wsp_fx, L_WSP - L_WSP_MEM, sub( shift, Q_wsp ) ); @@ -1317,10 +1197,10 @@ ivas_error pre_proc_front_ivas_fx( IF( LE_32( element_brate, IVAS_32k ) ) { /* 1/4 pitch precision improvement */ - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr_fx[0], &voicing_fr_fx[0], 0, wsp_fx, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr_fx[1], &voicing_fr_fx[1], L_SUBFR, wsp_fx, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr_fx[2], &voicing_fr_fx[2], 2 * L_SUBFR, wsp_fx, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr_fx[3], &voicing_fr_fx[3], 3 * L_SUBFR, wsp_fx, 7 ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr_fx[0], &voicing_fr_fx[0], 0, wsp_fx, 7, element_mode ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr_fx[1], &voicing_fr_fx[1], L_SUBFR, wsp_fx, 7, element_mode ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr_fx[2], &voicing_fr_fx[2], 2 * L_SUBFR, wsp_fx, 7, element_mode ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr_fx[3], &voicing_fr_fx[3], 3 * L_SUBFR, wsp_fx, 7, element_mode ); } ELSE { @@ -1346,24 +1226,7 @@ ivas_error pre_proc_front_ivas_fx( /*------------------------------------------------------------------* * Update estimated noise energy and voicing cut-off frequency *-----------------------------------------------------------------*/ - { - // TODO: this scalings to be checked - scale = s_min( Q30, add( st->hNoiseEst->q_bckr, L_norm_arr( st->hNoiseEst->bckr_fx, NB_BANDS ) ) ); - scale = s_min( scale, sub( add( fr_bands_fx_q, L_norm_arr( fr_bands_fx, 2 * NB_BANDS ) ), 4 ) ); - scale_sig32( st->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, st->hNoiseEst->q_bckr ) ); - scale_sig32( fr_bands_fx, 2 * NB_BANDS, sub( scale, fr_bands_fx_q ) ); - st->hNoiseEst->q_bckr = fr_bands_fx_q = scale; - } - - scale = s_min( Q31, s_min( add( q_tmpN, L_norm_arr( tmpN_fx, NB_BANDS ) ), add( st->hNoiseEst->q_bckr, L_norm_arr( st->hNoiseEst->bckr_fx, NB_BANDS ) ) ) ); - scale = sub( scale, 1 ); // guard bits - scale_sig32( st->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, st->hNoiseEst->q_bckr ) ); - scale_sig32( tmpN_fx, NB_BANDS, sub( scale, q_tmpN ) ); - st->hNoiseEst->q_bckr = q_tmpN = scale; - move16(); - move16(); - - scale = s_min( Q31, add( st->hNoiseEst->ave_enr_q, s_min( L_norm_arr( st->hNoiseEst->ave_enr_fx, NB_BANDS ), L_norm_arr( st->hNoiseEst->ave_enr2_fx, NB_BANDS ) ) ) ); + Word16 scale = s_min( Q31, add( st->hNoiseEst->ave_enr_q, s_min( L_norm_arr( st->hNoiseEst->ave_enr_fx, NB_BANDS ), L_norm_arr( st->hNoiseEst->ave_enr2_fx, NB_BANDS ) ) ) ); scale = s_min( scale, add( q_tmpE, L_norm_arr( tmpE_fx, NB_BANDS ) ) ); scale = sub( scale, 1 ); // guard bits scale_sig32( tmpE_fx, NB_BANDS, sub( scale, q_tmpE ) ); @@ -1382,24 +1245,15 @@ ivas_error pre_proc_front_ivas_fx( move16(); move16(); - noise_est_ivas_fx( st, old_pitch1, tmpN_fx, epsP_fx, Etot_fx, *relE_fx, corr_shift_fx, tmpE_fx, q_tmpE, fr_bands_fx, fr_bands_fx_q, cor_map_sum_fx, - &ncharX_fx, &sp_div_fx, &q_sp_div, &non_staX_fx, loc_harm, lf_E_fx, q_lf_E_fx, &st->hNoiseEst->harm_cor_cnt, st->hNoiseEst->Etot_l_lp_fx, - st->hNoiseEst->Etot_v_h2_fx, &st->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_fx, - hStereoClassif, NULL, st->ini_frame ); + noise_est_ivas_fx( st, old_pitch1, tmpN_fx, q_tmpN, epsP_fx, extract_h( Etot_fx ), *relE_fx, corr_shift_fx, tmpE_fx, q_tmpE, fr_bands_fx, fr_bands_fx_q, cor_map_sum_fx, + &ncharX_fx, &sp_div_fx, &q_sp_div, &non_staX_fx, loc_harm, lf_E_fx, q_lf_E_fx, &st->hNoiseEst->harm_cor_cnt, extract_h( st->hNoiseEst->Etot_l_lp_32fx ), + st->hNoiseEst->Etot_v_h2_32fx, &st->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_fx, hStereoClassif, NULL, st->ini_frame ); test(); IF( lr_vad_enabled && st->idchan == 0 ) { FOR( Word16 j = 0; j < 2; j++ ) { - scale = s_min( add( q_tmpN_LR[j], L_norm_arr( tmpN_LR_fx[j], NB_BANDS ) ), add( hCPE->hFrontVad[j]->hNoiseEst->q_bckr, L_norm_arr( hCPE->hFrontVad[j]->hNoiseEst->bckr_fx, NB_BANDS ) ) ); - scale = sub( s_min( Q31, scale ), 1 ); - scale_sig32( hCPE->hFrontVad[j]->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, hCPE->hFrontVad[j]->hNoiseEst->q_bckr ) ); - scale_sig32( tmpN_LR_fx[j], NB_BANDS, sub( scale, q_tmpN_LR[j] ) ); - hCPE->hFrontVad[j]->hNoiseEst->q_bckr = q_tmpN_LR[j] = scale; - move16(); - move16(); - scale = add( hCPE->hFrontVad[j]->hNoiseEst->ave_enr_q, s_min( L_norm_arr( hCPE->hFrontVad[j]->hNoiseEst->ave_enr_fx, NB_BANDS ), L_norm_arr( hCPE->hFrontVad[j]->hNoiseEst->ave_enr2_fx, NB_BANDS ) ) ); scale = s_min( scale, add( q_tmpE_LR[j], L_norm_arr( tmpE_LR_fx[j], NB_BANDS ) ) ); scale = sub( s_min( Q31, scale ), 1 ); @@ -1424,17 +1278,17 @@ ivas_error pre_proc_front_ivas_fx( move16(); /* Run noise_est for Left and Right channel */ - noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[0], epsP_fx, Etot_LR_fx[0], sub( Etot_LR_fx[0], hCPE->hFrontVad[0]->lp_speech_fx ), corr_shiftL_fx, + noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[0], q_tmpN_LR[0], epsP_fx, Etot_LR_fx[0], sub( Etot_LR_fx[0], hCPE->hFrontVad[0]->lp_speech_fx ), corr_shiftL_fx, tmpE_LR_fx[0], q_tmpE_LR[0], fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], &cor_map_sum_LR_fx[0], &ncharX_LR_fx, &sp_div_LR_fx, &q_sp_div_LR, &non_staX_LR_fx, loc_harmLR_fx, lf_E_LR_fx[0], lf_E_LR_fx_q, &hCPE->hFrontVad[0]->hNoiseEst->harm_cor_cnt, - hCPE->hFrontVad[0]->hNoiseEst->Etot_l_lp_fx, hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_fx, &hCPE->hFrontVad[0]->hNoiseEst->bg_cnt, + extract_h( hCPE->hFrontVad[0]->hNoiseEst->Etot_l_lp_32fx ), hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_32fx, &hCPE->hFrontVad[0]->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_LR_fx, NULL, hCPE->hFrontVad[0], hCPE->hFrontVad[0]->ini_frame ); /* Note: the index [0] in the last argument is intended, the ini_frame counter is only maintained in the zero-th channel's VAD handle */ - noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[1], epsP_fx, Etot_LR_fx[1], sub( Etot_LR_fx[1], hCPE->hFrontVad[1]->lp_speech_fx ), corr_shiftR_fx, + noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[1], q_tmpN_LR[1], epsP_fx, Etot_LR_fx[1], sub( Etot_LR_fx[1], hCPE->hFrontVad[1]->lp_speech_fx ), corr_shiftR_fx, tmpE_LR_fx[1], q_tmpE_LR[1], fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], &cor_map_sum_LR_fx[1], &ncharX_LR_fx, &sp_div_LR_fx, &q_sp_div_LR, &non_staX_LR_fx, loc_harmLR_fx, lf_E_LR_fx[1], lf_E_LR_fx_q, &hCPE->hFrontVad[1]->hNoiseEst->harm_cor_cnt, - hCPE->hFrontVad[1]->hNoiseEst->Etot_l_lp_fx, hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_fx, &hCPE->hFrontVad[1]->hNoiseEst->bg_cnt, + extract_h( hCPE->hFrontVad[1]->hNoiseEst->Etot_l_lp_32fx ), hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_32fx, &hCPE->hFrontVad[1]->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_LR_fx, NULL, hCPE->hFrontVad[1], hCPE->hFrontVad[0]->ini_frame ); } @@ -1452,23 +1306,19 @@ ivas_error pre_proc_front_ivas_fx( * Find spectral tilt * UC and VC frame selection *-----------------------------------------------------------------*/ + scale = s_min( Q31, s_min( add( st->hNoiseEst->q_bckr, L_norm_arr( st->hNoiseEst->bckr_fx, NB_BANDS ) ), add( fr_bands_fx_q, L_norm_arr( fr_bands_fx, 2 * NB_BANDS ) ) ) ); scale_sig32( fr_bands_fx, 2 * NB_BANDS, sub( scale, fr_bands_fx_q ) ); - scale_sig32( st->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, st->hNoiseEst->q_bckr ) ); - st->hNoiseEst->q_bckr = fr_bands_fx_q = scale; - move16(); + Copy_Scale_sig32( st->hNoiseEst->bckr_fx, bckr_temp, NB_BANDS, sub( scale, st->hNoiseEst->q_bckr ) ); + fr_bands_fx_q = scale; move16(); - find_tilt_ivas_fx( fr_bands_fx, fr_bands_fx_q, st->hNoiseEst->bckr_fx, st->hNoiseEst->q_bckr, ee_fx, st->pitch, st->voicing_fx, lf_E_fx, q_lf_E_fx, + find_tilt_ivas_fx( fr_bands_fx, fr_bands_fx_q, bckr_temp, scale, ee_fx, st->pitch, st->voicing_fx, lf_E_fx, q_lf_E_fx, corr_shift_fx, st->input_bwidth, st->max_band, hp_E_fx, MODE1, &( st->bckr_tilt_lt ), st->Opt_SC_VBR ); - st->coder_type = find_uv_ivas_fx( st, pitch_fr_fx, voicing_fr_fx, inp_12k8_fx, ee_fx, &dE1X_fx, corr_shift_fx, *relE_fx, Etot_fx, hp_E_fx, + st->coder_type = find_uv_ivas_fx( st, pitch_fr_fx, voicing_fr_fx, inp_12k8_fx, ee_fx, &dE1X_fx, corr_shift_fx, *relE_fx, extract_h( Etot_fx ), hp_E_fx, &flag_spitch, last_core_orig, hStereoClassif, *Q_new /*q_inp_12k8*/, fr_bands_fx_q ); // Q0 -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( st->lgBin_E_fx, st->Bin_E_fx, L_FFT / 2, sub( st->q_Bin_E, Q7 ) ); -#else - Copy_Scale_sig_16_32_DEPREC( st->lgBin_E_fx, st->Bin_E_fx, L_FFT / 2, sub( st->q_Bin_E, Q7 ) ); -#endif #ifdef DEBUG_FORCE_DIR if ( st->force_dir[0] != '\0' ) @@ -1498,7 +1348,7 @@ ivas_error pre_proc_front_ivas_fx( * TC frame selection *-----------------------------------------------------------------*/ - st->clas = signal_clas_fx( st, inp_12k8_fx, ee_fx, *relE_fx, L_look, tdm_SM_last_clas ); /* Q0 */ + st->clas = signal_clas_ivas_fx( st, inp_12k8_fx, ee_fx, *relE_fx, L_look, tdm_SM_last_clas ); /* Q0 */ move16(); select_TC_fx( MODE1, st->tc_cnt, &st->coder_type, st->localVAD ); @@ -1528,7 +1378,7 @@ ivas_error pre_proc_front_ivas_fx( move16(); stereo_classifier_features_ivas_fx( hStereoClassif, st->idchan, element_mode, localVAD_HE_SAD, lsf_new_fx, epsP_fx, st->pitch, st->voicing_fx, *cor_map_sum_fx, non_staX_fx, sp_div_fx, - st->clas, sub( 31, *epsP_fx_q ), ( 31 - Q8 ) /* exp of cor_map_sum */, ( 31 - Q8 ) /* exp of non_staX_fx */, sub( 15, q_sp_div ) ); + st->clas, sub( 31, *epsP_fx_q ), ( 31 - Q8 ) /* exp of cor_map_sum */, ( 31 - Q20 ) /* exp of non_staX_fx */, sub( 15, q_sp_div ) ); } /*----------------------------------------------------------------* @@ -1540,7 +1390,7 @@ ivas_error pre_proc_front_ivas_fx( scale_sig32( PS_fx, 128, shift ); Qfact_PS = add( Qfact_PS, shift ); - smc_dec = ivas_smc_gmm_fx( st, hStereoClassif, localVAD_HE_SAD, Etot_fx, lsp_new_fx, *cor_map_sum_fx /*Q8*/, epsP_fx, PS_fx, non_staX_fx, *relE_fx, &high_lpn_flag, flag_spitch, Qfact_PS, *epsP_fx_q, hSpMusClas->past_PS_Q ); /* Q0 */ + smc_dec = ivas_smc_gmm_fx( st, hStereoClassif, localVAD_HE_SAD, extract_h( Etot_fx ), lsp_new_fx, *cor_map_sum_fx /*Q8*/, epsP_fx, PS_fx, non_staX_fx, *relE_fx, &high_lpn_flag, flag_spitch, Qfact_PS, *epsP_fx_q, hSpMusClas->past_PS_Q ); /* Q0 */ #ifdef DEBUG_FORCE_DIR if ( st->force_dir[0] != '\0' ) @@ -1583,7 +1433,7 @@ ivas_error pre_proc_front_ivas_fx( test(); IF( lr_vad_enabled && st->idchan == 0 ) { - ivas_long_enr_fx( st, -1, localVAD_HE_SAD, high_lpn_flag, hCPE->hFrontVad, CPE_CHANNELS, localVAD_HE_SAD_LR, Etot_LR_fx ); + ivas_long_enr_fx( st, -16777216 /*-1 << 24*/, localVAD_HE_SAD, high_lpn_flag, hCPE->hFrontVad, CPE_CHANNELS, localVAD_HE_SAD_LR, Etot_LR_fx ); Copy32( fr_bands_LR_fx[0] + NB_BANDS, hCPE->hFrontVad[0]->hNoiseEst->enrO_fx, NB_BANDS ); // fr_bands_LR_fx_q hCPE->hFrontVad[0]->hNoiseEst->q_enrO = fr_bands_LR_fx_q[0]; @@ -1648,12 +1498,6 @@ ivas_error pre_proc_front_ivas_fx( move16(); } - IF( flag_16k_smc ) - { - Scale_sig( st->input_fx, input_frame, sub( -1, st->q_inp ) ); /* Q(-1) */ - st->q_inp = -1; - move16(); - } /* these are for ivas_acelp_tcx20_switching_fx */ Scale_sig32( st->hTcxEnc->spectrum_long_fx, N_MAX, sub( st->hTcxEnc->spectrum_long_e, 16 ) ); /* Q(-1) */ st->hTcxEnc->spectrum_long_e = 16; @@ -1710,7 +1554,7 @@ ivas_error pre_proc_front_ivas_fx( st->mem_wsp_enc = shl( st->mem_wsp_enc, sub( 0, sub( Q15, st->exp_buf_wspeech_enc ) ) ); // Q0 move16(); - *Q_new = add( *Q_new, Q_to_be_looked_into ); // actual Q_new + *Q_new = add( *Q_new, Q_inp_const ); // actual Q_new move16(); Scale_sig( old_inp_12k8_fx, L_INP_12k8, sub( *Q_new, Q_old_inp_12k8 ) ); /* Q_new */ @@ -1761,7 +1605,7 @@ ivas_error pre_proc_front_ivas_fx( st->q_Bin_E = add( *Q_new, Q_SCALE - 2 ); move16(); /* 2nd stage speech/music classification (ACELP/GSC/TCX core selection) */ - ivas_smc_mode_selection_fx( st, element_brate, smc_dec, *relE_fx, Etot_fx, attack_flag, inp_12k8_fx, *Q_new, S_map_fx, flag_spitch ); + ivas_smc_mode_selection_fx( st, element_brate, smc_dec, *relE_fx, extract_h( Etot_fx ), attack_flag, inp_12k8_fx, *Q_new, S_map_fx, flag_spitch ); } #ifdef DEBUG_FORCE_DIR @@ -1801,9 +1645,8 @@ ivas_error pre_proc_front_ivas_fx( st->exp_old_inp_12k8 = sub( Q15, add( *Q_new, shift ) ); move16(); - // Scale_sig( old_inp_12k8_fx, L_INP_12k8, negate( add( *Q_new, 1 ) ) ); - *Q_new = sub( *Q_new, Q_to_be_looked_into ); // ivas_core_enc will assume inp signal (12k8 and 16k) in Q_new - 1 + *Q_new = sub( *Q_new, Q_inp_const ); // ivas_core_enc will assume inp signal (12k8 and 16k) in Q_new - 1 move16(); free( mem_decim_dummy_fx ); @@ -1812,69 +1655,6 @@ ivas_error pre_proc_front_ivas_fx( return error; } -#ifdef IVAS_FIXED_ENC -/*-------------------------------------------------------------------* - * calculate_energy_buffer_fx() - * - * calculate DFT-based energies - *--------------------------------------------------------------------*/ - -static void calculate_energy_buffer_fx( - CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - Word64 enerBuffer_dft_fx[], /* o : energy buffer */ - Word16 *enerBuffer_dft_q_fx, - const Word16 no_channels, /* i : no. of used CLDFB channels */ - const Word32 input_Fs /* i : input sampling rate */ -) -{ - Word16 i, j; - Word64 nrg_DMX_fx[CLDFB_NO_CHANNELS_MAX]; - Word64 *p_nrg_DMX_fx; - Word32 *pDFT_DMX_fx; - Word16 *pDFT_DMX_q_fx; - Word32 chan_width_bins_fx; - Word16 band_res_dft_fx, chan_width_f_fx, start, stop; - - Word16 temp_q1 = norm_l( input_Fs ) - 1; - Word16 temp_q2 = norm_s( hCPE->hStereoDft->NFFT ); - - band_res_dft_fx = div_l( L_shl( input_Fs, temp_q1 ), shl( hCPE->hStereoDft->NFFT, temp_q2 ) ); - chan_width_f_fx = 24000 / CLDFB_NO_CHANNELS_MAX; - chan_width_bins_fx = L_shl( (Word32) div_s( chan_width_f_fx, band_res_dft_fx ), ( sub( add( temp_q1, 1 ), temp_q2 ) ) ); // Q16 - - pDFT_DMX_fx = hCPE->hStereoDft->DFT_fx[0]; - pDFT_DMX_q_fx = hCPE->hStereoDft->DFT_q_fx; - start = 1; - p_nrg_DMX_fx = nrg_DMX_fx; - - *p_nrg_DMX_fx = Mpy_32_32( pDFT_DMX_fx[0], pDFT_DMX_fx[0] ); - - FOR( i = 0; i < no_channels; i++ ) - { - stop = (Word16) ( L_add( Mpy_32_16_1( chan_width_bins_fx, add( i, 1 ) ), 1 ) >> 1 ); - FOR( j = start; j < stop; j++ ) - { - *p_nrg_DMX_fx = W_add( *p_nrg_DMX_fx, Mpy_32_32( pDFT_DMX_fx[2 * j], pDFT_DMX_fx[2 * j] ) ); - *p_nrg_DMX_fx = W_add( *p_nrg_DMX_fx, Mpy_32_32( pDFT_DMX_fx[2 * j + 1], pDFT_DMX_fx[2 * j + 1] ) ); - } - enerBuffer_dft_q_fx[i] = 2 * pDFT_DMX_q_fx[i] - 31; - start = stop; - p_nrg_DMX_fx++; - } - - FOR( i = 0; i < no_channels; i++ ) /* Consider only used channels, dependent on Fs */ - { - enerBuffer_dft_fx[i] = nrg_DMX_fx[i] / 3; - } - - /* Set remaining entries of enerBuffer to zero */ - FOR( ; i < CLDFB_NO_CHANNELS_MAX; i++ ) - { - enerBuffer_dft_fx[i] = 0; - } - return; -} -#endif /*-------------------------------------------------------------------* * calculate_energy_buffer() * @@ -1882,24 +1662,19 @@ static void calculate_energy_buffer_fx( *--------------------------------------------------------------------*/ static void calculate_energy_buffer_ivas_fx( CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - Word32 enerBuffer_dft_fx[], /* o : energy buffer() exp(enerBuffer_dft_e)*/ + Word32 enerBuffer_dft_fx[], /* o : energy buffer() exp(enerBuffer_dft_e)*/ const Word16 no_channels, /* i : no. of used CLDFB channels Q0*/ const Word32 input_Fs, /* i : input sampling rate Q0*/ - Word16 *enerBuffer_dft_e ) + Word16 enerBuffer_dft_e[] ) { - Word16 i, j; + Word16 i, j, guard_bits; Word64 nrg_DMX_fx[CLDFB_NO_CHANNELS_MAX]; Word64 *p_nrg_DMX_fx; Word32 *pDFT_DMX_fx; /*q_DFT_DMX_fx*/ Word32 chan_width_bins_fx; Word16 band_res_dft_fx, chan_width_f_fx, start, stop; - Word16 norm_nrg_DMX_fx; - Word64 max_abs_nrg_DMX_fx; - Flag overflow = 0; - move32(); + Word16 norm_nrg_DMX_fx[CLDFB_NO_CHANNELS_MAX]; - max_abs_nrg_DMX_fx = 0; - move64(); Word16 temp_q1 = sub( norm_l( input_Fs ), 1 ); Word16 temp_q2 = norm_s( hCPE->hStereoDft->NFFT ); @@ -1913,47 +1688,46 @@ static void calculate_energy_buffer_ivas_fx( start = 1; move16(); - pDFT_DMX_fx = hCPE->hStereoDft->DFT_fx[0]; /*q_DFT_DMX_fx = 31-hCPE->hStereoDft->DFT_fx_e[0]*/ + guard_bits = add( find_guarded_bits_fx( extract_h( chan_width_bins_fx ) ), 1 ); /* Q0 */ + + pDFT_DMX_fx = hCPE->hStereoDft->DFT_fx[0]; /* q_DFT_DMX_fx = 31 - hCPE->hStereoDft->DFT_fx_e[0] */ p_nrg_DMX_fx = nrg_DMX_fx; - *p_nrg_DMX_fx = Mpy_32_32( pDFT_DMX_fx[0], pDFT_DMX_fx[0] ); /*2 * q_DFT_DMX_fx -31 */ + *p_nrg_DMX_fx = W_shr( W_mult_32_32( pDFT_DMX_fx[0], pDFT_DMX_fx[0] ), guard_bits ); /* 2 * q_DFT_DMX_fx + 1 - guard_bits */ move64(); FOR( i = 0; i < no_channels; i++ ) { - stop = extract_l( L_shr( L_add( Mpy_32_16_1( chan_width_bins_fx, add( i, 1 ) ), 1 ), 1 ) ); + stop = extract_l( L_shr( L_add( Mpy_32_16_1( chan_width_bins_fx, add( i, 1 ) ), 1 ), 1 ) ); /* Q0 */ FOR( j = start; j < stop; j++ ) { - *p_nrg_DMX_fx = W_add( *p_nrg_DMX_fx, Mpy_32_32( pDFT_DMX_fx[2 * j], pDFT_DMX_fx[2 * j] ) ); /*2 * q_DFT_DMX_fx -31 */ + *p_nrg_DMX_fx = W_add( *p_nrg_DMX_fx, W_shr( W_mult_32_32( pDFT_DMX_fx[2 * j], pDFT_DMX_fx[2 * j] ), guard_bits ) ); /* 2 * q_DFT_DMX_fx + 1 - guard_bits */ move64(); - *p_nrg_DMX_fx = W_add( *p_nrg_DMX_fx, Mpy_32_32( pDFT_DMX_fx[2 * j + 1], pDFT_DMX_fx[2 * j + 1] ) ); + *p_nrg_DMX_fx = W_add( *p_nrg_DMX_fx, W_shr( W_mult_32_32( pDFT_DMX_fx[2 * j + 1], pDFT_DMX_fx[2 * j + 1] ), guard_bits ) ); /* 2 * q_DFT_DMX_fx + 1 - guard_bits */ move64(); - // 2 * DFT_fx_e - } - IF( GT_64( W_abs( *p_nrg_DMX_fx ), max_abs_nrg_DMX_fx ) ) - { - max_abs_nrg_DMX_fx = W_abs( *p_nrg_DMX_fx ); } + norm_nrg_DMX_fx[i] = W_norm( W_abs( *p_nrg_DMX_fx ) ); + move16(); start = stop; move16(); p_nrg_DMX_fx++; } - norm_nrg_DMX_fx = W_norm( max_abs_nrg_DMX_fx ); FOR( i = 0; i < no_channels; i++ ) /* Consider only used channels, dependent on Fs */ { - enerBuffer_dft_fx[i] = W_extract_h( W_shl_o( nrg_DMX_fx[i], norm_nrg_DMX_fx, &overflow ) ) / 3; /*q_enerBuffer_dft_fx=2 * q_DFT_DMX_fx -31+ norm_nrg_DMX_fx -32*/ + enerBuffer_dft_fx[i] = Mpy_32_16_1( W_extract_h( W_shl( nrg_DMX_fx[i], norm_nrg_DMX_fx[i] ) ), 10923 /* 1/3 in Q15 */ ); /* 2 * q_DFT_DMX_fx + 1 - guard_bits + norm_nrg_DMX_fx[i] - 32 */ move32(); + enerBuffer_dft_e[i] = sub( add( shl( hCPE->hStereoDft->DFT_fx_e[0], 1 ), guard_bits ), norm_nrg_DMX_fx[i] ); + move16(); } - *enerBuffer_dft_e = sub( add( 32, shl( hCPE->hStereoDft->DFT_fx_e[0], 1 ) ), norm_nrg_DMX_fx ); /*31-q_enerBuffer_dft_fx*/ - move16(); - /* Set remaining entries of enerBuffer to zero */ FOR( ; i < CLDFB_NO_CHANNELS_MAX; i++ ) { enerBuffer_dft_fx[i] = 0; move32(); + enerBuffer_dft_e[i] = 0; + move16(); } return; } diff --git a/lib_enc/ivas_core_pre_proc_fx.c b/lib_enc/ivas_core_pre_proc_fx.c index 8d00e608c083a3d89eada175ce3256e9fd6cf4e2..cb5c157152f8b385d2db17db4f8dd8966a9fb57f 100644 --- a/lib_enc/ivas_core_pre_proc_fx.c +++ b/lib_enc/ivas_core_pre_proc_fx.c @@ -49,30 +49,30 @@ * Decision matrix, Preprocessing at other Fs, core switching decision, ...) *--------------------------------------------------------------------*/ ivas_error pre_proc_ivas_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 last_element_mode, /* i : last element mode Q0*/ - const Word32 element_brate, /* i : element bitrate Q0*/ - const Word32 last_element_brate, /* i : last element bitrate Q0*/ - const Word16 input_frame, /* i : frame length Q0*/ - Word16 old_inp_12k8_fx[], /* i/o: buffer of old input signal Q_new-1 */ - Word16 old_inp_16k_fx[], /* i/o: buffer of old input signal @ 16kHz Q_new-1 */ - Word16 **inp_fx, /* o : ptr. to inp. signal in the current frame Q_new*/ - Word32 *ener_fx, /* o : residual energy from Levinson-Durbin epsP_fx_q*/ - Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes Q12*/ - Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes Q14*/ - Word32 epsP_fx[M + 1], /* i : LP prediction errors epsP_fx_q*/ - Word16 *epsP_fx_q, /* i : LP prediction errors */ - Word16 lsp_new_fx[M], /* i/o: LSPs at the end of the frame Q15*/ - Word16 lsp_mid_fx[M], /* i/o: LSPs in the middle of the frame Q15*/ - Word16 *new_inp_resamp16k_fx, /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE Q_new-1*/ - Word16 *Voicing_flag, /* o : voicing flag for HQ FEC Q0*/ - Word16 old_wsp_fx[], /* i : weighted input signal buffer e_old_wsp*/ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 last_element_mode, /* i : last element mode Q0*/ + const Word32 element_brate, /* i : element bitrate Q0*/ + const Word32 last_element_brate, /* i : last element bitrate Q0*/ + const Word16 input_frame, /* i : frame length Q0*/ + Word16 old_inp_12k8_fx[], /* i/o: buffer of old input signal Q_new-1 */ + Word16 old_inp_16k_fx[], /* i/o: buffer of old input signal @ 16kHz Q_new-1 */ + Word16 **inp_fx, /* o : ptr. to inp. signal in the current frame Q_new*/ + Word32 *ener_fx, /* o : residual energy from Levinson-Durbin epsP_fx_q*/ + Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes Q12*/ + Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes Q14*/ + Word32 epsP_fx[M + 1], /* i : LP prediction errors epsP_fx_q*/ + Word16 *epsP_fx_q, /* i : LP prediction errors */ + Word16 lsp_new_fx[M], /* i/o: LSPs at the end of the frame Q15*/ + Word16 lsp_mid_fx[M], /* i/o: LSPs in the middle of the frame Q15*/ + Word16 *new_inp_resamp16k_fx, /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE Q_new-1*/ + Word16 *Voicing_flag, /* o : voicing flag for HQ FEC Q0*/ + Word16 old_wsp_fx[], /* i : weighted input signal buffer e_old_wsp*/ Word16 e_old_wsp, - const Word16 loc_harm, /* i : harmonicity flag Q0*/ - const Word16 vad_flag_dtx, /* i : HE-SAD flag with additional DTX HO Q0*/ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ - const Word16 vad_hover_flag, /* i : VAD hangover flag Q0*/ - const Word16 flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ + const Word16 loc_harm, /* i : harmonicity flag Q0*/ + const Word16 vad_flag_dtx, /* i : HE-SAD flag with additional DTX HO Q0*/ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ + const Word16 vad_hover_flag, /* i : VAD hangover flag Q0*/ + const Word16 flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ Word32 enerBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* e_enerBuffer */ Word16 e_enerBuffer, Word16 fft_buff_fx[2 * L_FFT], /* Qx */ @@ -282,11 +282,7 @@ ivas_error pre_proc_ivas_fx( } ELSE IF( GT_32( st->total_brate, MAX_GSC_INACTIVE_BRATE ) && ( ( st->vad_flag == 0 && GE_16( st->bwidth, SWB ) && GE_16( st->max_bwidth, SWB ) ) || ( st->localVAD == 0 && ( LE_16( st->bwidth, WB ) || LE_16( st->max_bwidth, WB ) ) ) ) ) { -#ifdef NONBE_FIX_GSC_BSTR /* inactive frames will be coded by AVQ technology (exceptionally it can be later rewritten to GSC technology in ivas_combined_format_brate_sanity()) */ -#else - /* inactive frames will be coded by AVQ technology */ -#endif st->coder_type = INACTIVE; move16(); } @@ -466,7 +462,7 @@ ivas_error pre_proc_ivas_fx( IF( EQ_16( st->coder_type, GENERIC ) || EQ_16( st->coder_type, VOICED ) || EQ_16( st->coder_type, TRANSITION ) ) { test(); - IF( GE_32( element_brate, FRMT_SHP_MIN_BRATE_IVAS ) && GT_16( st->lp_noise_fx, FORMANT_SHARPENING_NOISE_THRESHOLD_FX ) ) + IF( GE_32( element_brate, FRMT_SHP_MIN_BRATE_IVAS ) && GT_32( st->lp_noise_32fx, FORMANT_SHARPENING_NOISE_THRESHOLD_FX << 16 ) ) { st->sharpFlag = 0; move16(); @@ -531,7 +527,7 @@ ivas_error pre_proc_ivas_fx( sr_core_tmp = L_max( INT_FS_16k, st->sr_core ); } - L_look = NS2SA_FX2( sr_core_tmp, ACELP_LOOK_NS ); /* lookahead at other sampling rate (16kHz, 25.6kHz, 32kHz) Q0*/ + L_look = NS2SA_FX2( sr_core_tmp, ACELP_LOOK_NS ); /* lookahead at other sampling rate (16kHz, 25.6kHz, 32kHz) Q0*/ move16(); inp_16k_fx = old_inp_16k_fx + L_INP_MEM - L_look; @@ -569,9 +565,6 @@ ivas_error pre_proc_ivas_fx( Scale_sig( st->buf_speech_enc_pe, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, sub( Q_old_inp_16k, sub( Q15, st->exp_buf_speech_enc_pe ) ) ); /* Q15 - Q_old_inp_16k */ st->exp_buf_speech_enc_pe = sub( Q15, Q_old_inp_16k ); move16(); - Scale_sig( st->input_fx, input_frame, sub( -1, st->q_inp ) ); - st->q_inp = -1; - move16(); Scale_sig( st->buf_wspeech_enc, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320, sub( Q_old_inp_16k, sub( Q15, st->exp_buf_wspeech_enc ) ) ); /* Q15 - Q_old_inp_16k */ st->mem_wsp_enc = shl( st->mem_wsp_enc, sub( Q_old_inp_16k, sub( Q15, st->exp_buf_wspeech_enc ) ) ); // Q_old_inp_16k move16(); @@ -700,13 +693,13 @@ ivas_error ivas_compute_core_buffers_fx( Encoder_State *st, /* i/o: encoder state structure */ Word16 **inp16k_out_fx, /* o : ptr. to inp. signal in the current frame Q_new-1*/ Word16 *old_inp_16k_fx, /* i/o: buffer of old input signal @ 16kHz Q_new-1*/ - Word16 new_inp_resamp16k_out_fx[], /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE Q_old_inp_16k*/ + Word16 new_inp_resamp16k_out_fx[], /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE Q_old_inp_16k*/ const Word16 input_frame, /* i : frame length Q0*/ const Word16 last_element_mode, /* i : last element mode Q0*/ const Word32 sr_core, /* i : core-coder sampling rate Q0*/ - Word32 *ener_fx, /* o : residual energy from Levinson-Durbin Q_r*/ + Word32 *ener_fx, /* o : residual energy from Levinson-Durbin Q_r*/ Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes Q14*/ - Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes Q14*/ + Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes Q14*/ Word32 epsP_fx[M + 1], /* i/o: LP prediction errors Q_r*/ Word16 lsp_new_fx[M], /* i/o: LSPs at the end of the frame Q15*/ Word16 lsp_mid_fx[M], /* i/o: LSPs in the middle of the frame Q15*/ @@ -717,7 +710,7 @@ ivas_error ivas_compute_core_buffers_fx( Word16 *inp_16k_fx, *new_inp_16k_fx; Word16 delay, element_mode; Word16 temp1F_icatdmResampBuf_fx[L_FILT_MAX]; /* temp buffers for ICA TDM resamplers */ - Word16 mem_decim16k_dummy_fx[2 * L_FILT_MAX]; + Word16 mem_decim16k_dummy_fx[2 * L_FILT_MAX], input_buf_fx[L_FRAME48k * 2]; Word16 *signal_in_fx; Word16 lMemRecalc, lMemRecalc_16k, L_frame_tmp, L_look; Word32 input_Fs; @@ -734,12 +727,15 @@ ivas_error ivas_compute_core_buffers_fx( Word16 *preemp_start_idx = NULL; Word32 sig_out[960], max_32; /*Word16 Q_exp, Q_wsp_exp*/; -#ifdef MSAN_FIX set16_fx( new_inp_resamp16k_fx, 0, L_FRAME16k ); -#endif set16_fx( epsP_h, 0, M + 1 ); set16_fx( epsP_l, 0, M + 1 ); - signal_in_fx = st->input_fx; /* st->q_inp */ + set16_fx( input_buf_fx, 0, L_FRAME48k * 2 ); + + Copy_Scale_sig( st->input_fx - input_frame, input_buf_fx, input_frame, sub( -1, st->q_old_inp ) ); + Copy_Scale_sig( st->input_fx, input_buf_fx + input_frame, input_frame, sub( -1, st->q_inp ) ); + + signal_in_fx = &input_buf_fx[input_frame]; /* st->q_inp */ input_Fs = st->input_Fs; /* Q0 */ move32(); @@ -833,8 +829,8 @@ ivas_error ivas_compute_core_buffers_fx( /* no resampling needed, only delay adjustment to account for the FIR resampling delay */ delay = NS2SA_FX2( input_Fs, DELAY_FIR_RESAMPL_NS ); move16(); - Copy( st->mem_decim16k_fx + delay, new_inp_16k_fx - sub( lMemRecalc, add( delay, L_FILT16k ) ), delay ); /* Q(-1) */ - Copy( signal_in_fx - lMemRecalc, new_inp_16k_fx - add( lMemRecalc, L_FILT16k ), add( input_frame, lMemRecalc ) ); /* st->q_inp */ + Copy( st->mem_decim16k_fx + delay, new_inp_16k_fx - add( lMemRecalc, sub( delay, L_FILT16k ) ), delay ); /* Q(-1) */ + Copy( signal_in_fx - lMemRecalc, new_inp_16k_fx - sub( lMemRecalc, L_FILT16k ), add( input_frame, lMemRecalc ) ); /* st->q_inp */ Copy( signal_in_fx + sub( sub( input_frame, lMemRecalc ), shl( delay, 1 ) ), st->mem_decim16k_fx, shl( delay, 1 ) ); /* st->q_inp */ } ELSE IF( EQ_32( input_Fs, 32000 ) || EQ_32( input_Fs, 48000 ) ) @@ -890,8 +886,11 @@ ivas_error ivas_compute_core_buffers_fx( IF( EQ_16( st->bwidth, WB ) ) { - Copy_Scale_sig( new_inp_16k_fx - delay, st->hBWE_FD->old_input_wb_fx, delay, negate( add( Q_old_inp_16k, 1 ) ) ); /* Scaling to Q(-1) */ - Copy( new_inp_16k_fx - STEREO_DFT_OVL_16k, st->hBWE_FD->L_old_wtda_swb_fx + L_FRAME16k - STEREO_DFT_OVL_16k + delay, sub( STEREO_DFT_OVL_16k, delay ) ); /* Check Q here once. Q should be Q_old_wtda */ + Copy_Scale_sig( new_inp_16k_fx - delay, st->hBWE_FD->old_input_wb_fx, delay, negate( add( Q_old_inp_16k, 1 ) ) ); /* Scaling to Q(-1) */ + scale_sig( st->hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, sub( Q_old_inp_16k, st->Q_old_wtda ) ); // st->Q_old_wtda->Q_old_inp_16k + Copy( new_inp_16k_fx - STEREO_DFT_OVL_16k, st->hBWE_FD->L_old_wtda_swb_fx + L_FRAME16k - STEREO_DFT_OVL_16k + delay, sub( STEREO_DFT_OVL_16k, delay ) ); + st->Q_old_wtda = Q_old_inp_16k; + move16(); } } ELSE IF( EQ_16( element_mode, IVAS_CPE_TD ) ) @@ -902,8 +901,11 @@ ivas_error ivas_compute_core_buffers_fx( test(); IF( EQ_16( st->bwidth, WB ) && st->hBWE_FD != NULL ) { - Copy_Scale_sig( new_inp_16k_fx + L_FILT16k - delay, st->hBWE_FD->old_input_wb_fx, delay, negate( add( Q_old_inp_16k, 1 ) ) ); /* Scaling to Q(-1) */ - Copy( new_inp_16k_fx - L_MEM_RECALC_16K, st->hBWE_FD->L_old_wtda_swb_fx + L_FRAME16k - L_MEM_RECALC_16K - L_FILT16k + delay, sub( L_MEM_RECALC_16K + L_FILT16k, delay ) ); /* Check Q here once. Q should be Q_old_wtda */ + Copy_Scale_sig( new_inp_16k_fx + L_FILT16k - delay, st->hBWE_FD->old_input_wb_fx, delay, negate( add( Q_old_inp_16k, 1 ) ) ); /* Scaling to Q(-1) */ + scale_sig( st->hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, sub( Q_old_inp_16k, st->Q_old_wtda ) ); // st->Q_old_wtda->Q_old_inp_16k + Copy( new_inp_16k_fx - L_MEM_RECALC_16K, st->hBWE_FD->L_old_wtda_swb_fx + L_FRAME16k - L_MEM_RECALC_16K - L_FILT16k + delay, sub( L_MEM_RECALC_16K + L_FILT16k, delay ) ); + st->Q_old_wtda = Q_old_inp_16k; + move16(); } } ELSE IF( element_mode == IVAS_SCE ) @@ -955,7 +957,7 @@ ivas_error ivas_compute_core_buffers_fx( { IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) { - Copy( new_inp_16k_fx - STEREO_DFT_OVL_16k + L_FRAME16k, st->inp_16k_mem_stereo_sw_fx, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); /* update for TD/DFT stereo switching Q(-1) */ + Copy( new_inp_16k_fx - STEREO_DFT_OVL_16k + L_FRAME16k, st->inp_16k_mem_stereo_sw_fx, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); /* update for TD/DFT stereo switching Q(-1) */ st->mem_preemph16k_fx = st->mem_preemph16k_DFT_fx; /* Q(-1) */ move16(); @@ -1069,9 +1071,7 @@ ivas_error ivas_compute_core_buffers_fx( } st->Q_max_16k[i] = shift; move16(); - - Copy_Scale_sig32_16( sig_out, preemp_start_idx, preemp_len, *Q_new ); - + Copy_Scale_sig32_16( sig_out, preemp_start_idx, preemp_len, add( *Q_new, 1 ) ); Scale_sig( old_inp_16k_fx, (Word16) ( preemp_start_idx - old_inp_16k_fx ), *Q_new ); } ELSE IF( GT_32( input_Fs, 8000 ) ) /* keep memory up-to-date in case of bitrate switching */ @@ -1138,11 +1138,11 @@ ivas_error ivas_compute_core_buffers_fx( IF( Q_new ) { - analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, 0, sub( *Q_new, 1 ), Q_r ); + analy_lp_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, sub( *Q_new, 1 ), Q_r ); } ELSE { - analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, 0, -1, Q_r ); + analy_lp_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, -1, Q_r ); } /*--------------------------------------------------------------* @@ -1169,11 +1169,8 @@ ivas_error ivas_compute_core_buffers_fx( ELSE IF( GT_32( input_Fs, 8000 ) && EQ_32( sr_core, INT_FS_16k ) ) { Copy( &old_inp_16k_fx[L_frame_tmp], st->old_inp_16k_fx, L_INP_MEM ); - IF( Q_new ) - { - st->exp_old_inp_16k = sub( Q16, *Q_new ); //(*Q_new - 1) - move16(); - } + st->exp_old_inp_16k = sub( Q16, *Q_new ); //(*Q_new - 1) + move16(); } ELSE IF( GT_32( input_Fs, 8000 ) ) { diff --git a/lib_enc/ivas_corecoder_enc_reconfig_fx.c b/lib_enc/ivas_corecoder_enc_reconfig_fx.c index a1f2196fb0af3dfb3311509761c86508740f644a..a277c965bd63c9be6a5831cb589586b51c10fcc6 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig_fx.c +++ b/lib_enc/ivas_corecoder_enc_reconfig_fx.c @@ -38,6 +38,10 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #include "math.h" +#include "wmc_auto.h" +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) +#include +#endif /*-------------------------------------------------------------------* * ivas_corecoder_enc_reconfig() * @@ -131,7 +135,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( tmp = 0; move16(); } - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = L_shr( st_ivas->hCPE[cpe_id]->element_brate, tmp ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() Q0*/ + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = L_shr( st_ivas->hCPE[cpe_id]->element_brate, tmp ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() Q0*/ move32(); } } @@ -192,6 +196,9 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); temp_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; /* Q0 */ move16(); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( temp_ind_list[i].function_name, hBstr->ind_list[i].function_name, 100 ); +#endif hBstr->ind_list[i].nb_bits = -1; /* Q0 */ move16(); } @@ -213,24 +220,37 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); } - Word16 q_com_sce = Q15; + Word16 q_com_sce = Q15, q_com_sce32 = Q31; + move16(); + move16(); + Word16 q_com_cpe = Q15, q_com_cpe32 = Q31; move16(); - Word16 q_com_cpe = Q15; move16(); IF( nSCE_old > 0 ) { FOR( k = 0; k < nSCE_old; k++ ) { - shift = getScaleFactor16( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal_fx, input_frame ); - Scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal_fx, input_frame, shift ); /* st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp + shift */ + shift = sub( getScaleFactor16( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal_fx, input_frame ), Q1 ); + scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal_fx, input_frame, shift ); /* st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp + shift */ st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp = add( st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp, shift ); move16(); q_com_sce = s_min( q_com_sce, st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp ); - shift = getScaleFactor16( st_ivas->hSCE[k]->hCoreCoder[0]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ) ); - Scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), shift ); /* st_ivas->hSCE[k]->hCoreCoder[0]->q_inp + shift */ + shift = sub( getScaleFactor16( st_ivas->hSCE[k]->hCoreCoder[0]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ) ), Q1 ); + scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), shift ); /* st_ivas->hSCE[k]->hCoreCoder[0]->q_inp + shift */ st_ivas->hSCE[k]->hCoreCoder[0]->q_inp = add( st_ivas->hSCE[k]->hCoreCoder[0]->q_inp, shift ); move16(); q_com_sce = s_min( q_com_sce, st_ivas->hSCE[k]->hCoreCoder[0]->q_inp ); + + shift = sub( getScaleFactor32( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal32_fx, input_frame ), Q1 ); + scale_sig32( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal32_fx, input_frame, shift ); /* st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp + shift */ + st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp32 = add( st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp32, shift ); + move16(); + q_com_sce32 = s_min( q_com_sce32, st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp32 ); + shift = sub( getScaleFactor32( st_ivas->hSCE[k]->hCoreCoder[0]->input32_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ) ), Q1 ); + scale_sig32( st_ivas->hSCE[k]->hCoreCoder[0]->input32_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), shift ); /* st_ivas->hSCE[k]->hCoreCoder[0]->q_inp + shift */ + st_ivas->hSCE[k]->hCoreCoder[0]->q_inp32 = add( st_ivas->hSCE[k]->hCoreCoder[0]->q_inp32, shift ); + move16(); + q_com_sce32 = s_min( q_com_sce32, st_ivas->hSCE[k]->hCoreCoder[0]->q_inp32 ); } } @@ -241,16 +261,27 @@ ivas_error ivas_corecoder_enc_reconfig_fx( { FOR( n = 0; n < CPE_CHANNELS; n++ ) { - shift = getScaleFactor16( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal_fx, input_frame ); - Scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal_fx, input_frame, shift ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp + shift */ + shift = sub( getScaleFactor16( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal_fx, input_frame ), Q1 ); + scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal_fx, input_frame, shift ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp + shift */ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp = add( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp, shift ); move16(); q_com_cpe = s_min( q_com_cpe, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp ); - shift = getScaleFactor16( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ) ); - Scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), shift ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp + shift */ + shift = sub( getScaleFactor16( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ) ), Q1 ); + scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), shift ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp + shift */ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp = add( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp, shift ); move16(); q_com_cpe = s_min( q_com_cpe, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp ); + + shift = sub( getScaleFactor32( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal32_fx, input_frame ), Q1 ); + scale_sig32( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal32_fx, input_frame, shift ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp + shift */ + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp32 = add( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp32, shift ); + move16(); + q_com_cpe32 = s_min( q_com_cpe32, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp32 ); + shift = sub( getScaleFactor32( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input32_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ) ), Q1 ); + scale_sig32( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input32_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), shift ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp + shift */ + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32 = add( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32, shift ); + move16(); + q_com_cpe32 = s_min( q_com_cpe32, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32 ); } } } @@ -259,14 +290,16 @@ ivas_error ivas_corecoder_enc_reconfig_fx( { FOR( k = 0; k < nSCE_old; k++ ) { - Scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal_fx, input_frame, sub( q_com, st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp ) ); /* q_com */ + scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal_fx, input_frame, sub( q_com, st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp ) ); /* q_com */ st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp = q_com; move16(); - Scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), sub( q_com, st_ivas->hSCE[k]->hCoreCoder[0]->q_inp ) ); /* q_com */ + scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), sub( q_com, st_ivas->hSCE[k]->hCoreCoder[0]->q_inp ) ); /* q_com */ st_ivas->hSCE[k]->hCoreCoder[0]->q_inp = q_com; move16(); Copy_Scale_sig_16_32_DEPREC( st_ivas->hSCE[k]->hCoreCoder[0]->input_buff_fx, st_ivas->hSCE[k]->hCoreCoder[0]->input_buff32_fx, L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS ) + L_FRAME48k, Q6 ); /* Q6 + q_com */ st_ivas->hSCE[k]->hCoreCoder[0]->q_inp32 = add( Q6, q_com ); + st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp32 = add( Q6, q_com ); + move16(); move16(); } } @@ -277,14 +310,16 @@ ivas_error ivas_corecoder_enc_reconfig_fx( { FOR( n = 0; n < CPE_CHANNELS; n++ ) { - Scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal_fx, input_frame, sub( q_com, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp ) ); /* q_com */ + scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal_fx, input_frame, sub( q_com, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp ) ); /* q_com */ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp = q_com; move16(); - Scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), sub( q_com, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp ) ); /* q_com */ + scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), sub( q_com, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp ) ); /* q_com */ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp = q_com; move16(); Copy_Scale_sig_16_32_DEPREC( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff_fx, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff32_fx, L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS ) + L_FRAME48k, Q6 ); /* Q6 + q_com */ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32 = add( Q6, q_com ); + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp32 = add( Q6, q_com ); + move16(); move16(); } } @@ -301,7 +336,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( { set32_fx( input_buff_fx[0], 0, len_inp_memory ); Copy32( st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx, input_buff_fx[0], len_inp_memory ); /* st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32 */ - q_input_buff[0] = st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32; + q_input_buff[0] = st_ivas->hSCE[0]->hCoreCoder[0]->q_old_inp32; move16(); } @@ -311,7 +346,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( IF( nCPE_old > 0 ) { Copy32( st_ivas->hCPE[0]->hCoreCoder[n]->input_buff32_fx, input_buff_fx[n + 1], len_inp_memory ); /* st_ivas->hCPE[0]->hCoreCoder[n]->q_inp32 */ - q_input_buff[n + 1] = st_ivas->hCPE[0]->hCoreCoder[n]->q_inp32; + q_input_buff[n + 1] = st_ivas->hCPE[0]->hCoreCoder[n]->q_old_inp32; move16(); } } @@ -334,10 +369,10 @@ ivas_error ivas_corecoder_enc_reconfig_fx( IF( GT_16( n_CoreCoder_existing, sce_id ) ) { Copy32( st_ivas->hSCE[sce_id]->hCoreCoder[0]->input_buff32_fx, input_buff_fx[sce_id], len_inp_memory ); /* st_ivas->hSCE[sce_id]->hCoreCoder[0]->q_inp32 */ - q_input_buff[sce_id] = st_ivas->hSCE[sce_id]->hCoreCoder[0]->q_inp32; + q_input_buff[sce_id] = st_ivas->hSCE[sce_id]->hCoreCoder[0]->q_old_inp32; move16(); } - destroy_sce_enc_fx( st_ivas->hSCE[sce_id], ( EQ_16( st_ivas->hEncoderConfig->element_mode_init, EVS_MONO ) && !st_ivas->hEncoderConfig->stereo_dmx_evs ) ); + destroy_sce_enc_fx( st_ivas->hSCE[sce_id] ); st_ivas->hSCE[sce_id] = NULL; } @@ -349,7 +384,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( IF( n_CoreCoder_existing > cpe_id * CPE_CHANNELS + n ) { Copy32( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff32_fx, input_buff_fx[( cpe_id - st_ivas->nCPE ) * CPE_CHANNELS + n], len_inp_memory ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32 */ - q_input_buff[( cpe_id - st_ivas->nCPE ) * CPE_CHANNELS + n] = st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32; + q_input_buff[( cpe_id - st_ivas->nCPE ) * CPE_CHANNELS + n] = st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp32; move16(); } } @@ -398,7 +433,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( IF( GT_16( n_CoreCoder_existing, sce_id ) && NE_16( hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) ) { Copy32( input_buff_fx[sce_id], st_ivas->hSCE[sce_id]->hCoreCoder[0]->input_buff32_fx, len_inp_memory ); /* q_input_buff[sce_id] */ - st_ivas->hSCE[sce_id]->hCoreCoder[0]->q_inp32 = q_input_buff[sce_id]; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->q_old_inp32 = q_input_buff[sce_id]; move16(); } test(); @@ -475,7 +510,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( IF( GT_16( n_CoreCoder_existing, add( i_mult( cpe_id, CPE_CHANNELS ), n ) ) ) { Copy32( input_buff_fx[n], st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff32_fx, len_inp_memory ); /* q_input_buff */ - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32 = q_input_buff[n]; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp32 = q_input_buff[n]; move16(); } } @@ -517,6 +552,9 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; /* Q0 */ move16(); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].function_name, temp_ind_list[i].function_name, 100 ); +#endif } nb_bits = add( nb_bits, temp_ind_list[i].nb_bits ); /* Q0 */ @@ -541,6 +579,9 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; /* Q0 */ move16(); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].function_name, temp_ind_list[i].function_name, 100 ); +#endif } nb_bits = add( nb_bits, temp_ind_list[i].nb_bits ); /* Q0 */ @@ -560,7 +601,9 @@ ivas_error ivas_corecoder_enc_reconfig_fx( IF( st_ivas->nSCE ) { Copy32( input_buff_fx[0], st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx, len_inp_memory ); /* q_input_buff */ - st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32 = q_input_buff[0]; + // st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32 = q_input_buff[0]; + st_ivas->hSCE[0]->hCoreCoder[0]->q_old_inp32 = q_input_buff[0]; + move16(); move16(); } @@ -569,7 +612,9 @@ ivas_error ivas_corecoder_enc_reconfig_fx( FOR( n = 0; n < CPE_CHANNELS; n++ ) { Copy32( input_buff_fx[n + 1], st_ivas->hCPE[0]->hCoreCoder[n]->input_buff32_fx, len_inp_memory ); /* q_input_buff */ - st_ivas->hCPE[0]->hCoreCoder[n]->q_inp32 = q_input_buff[n + 1]; + // st_ivas->hCPE[0]->hCoreCoder[n]->q_inp32 = q_input_buff[n + 1]; + st_ivas->hCPE[0]->hCoreCoder[n]->q_old_inp32 = q_input_buff[n + 1]; + move16(); move16(); } } @@ -579,7 +624,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( { IF( NE_16( input_frame, len_inp_memory ) ) { - Copy_Scale_sig32_16( st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx, st_ivas->hSCE[0]->hCoreCoder[0]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32 ) ); // Q(q_data_fx) -> Q(q_input) + Copy_Scale_sig32_16( st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx, st_ivas->hSCE[0]->hCoreCoder[0]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hSCE[0]->hCoreCoder[0]->q_old_inp32 ) ); // Q(q_data_fx) -> Q(q_input) st_ivas->hSCE[0]->hCoreCoder[0]->q_old_inp = 0; move16(); Copy_Scale_sig32_16( st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx + sub( len_inp_memory, input_frame ), st_ivas->hSCE[0]->hCoreCoder[0]->input_buff_fx + sub( len_inp_memory, input_frame ), sub( len_inp_memory, input_frame ), sub( add( Q16, 0 ), st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32 ) ); // Q(q_data_fx) -> Q(q_input) @@ -588,7 +633,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( } ELSE { - Copy_Scale_sig32_16( st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx, st_ivas->hSCE[0]->hCoreCoder[0]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32 ) ); // Q(q_data_fx) -> Q(q_input) + Copy_Scale_sig32_16( st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx, st_ivas->hSCE[0]->hCoreCoder[0]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hSCE[0]->hCoreCoder[0]->q_old_inp32 ) ); // Q(q_data_fx) -> Q(q_input) st_ivas->hSCE[0]->hCoreCoder[0]->q_old_inp = 0; move16(); } @@ -600,7 +645,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( { IF( NE_16( input_frame, len_inp_memory ) ) { - Copy_Scale_sig32_16( st_ivas->hCPE[0]->hCoreCoder[n]->input_buff32_fx, st_ivas->hCPE[0]->hCoreCoder[n]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hCPE[0]->hCoreCoder[n]->q_inp32 ) ); // Q(q_data_fx) -> Q(q_input) + Copy_Scale_sig32_16( st_ivas->hCPE[0]->hCoreCoder[n]->input_buff32_fx, st_ivas->hCPE[0]->hCoreCoder[n]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hCPE[0]->hCoreCoder[n]->q_old_inp32 ) ); // Q(q_data_fx) -> Q(q_input) st_ivas->hCPE[0]->hCoreCoder[n]->q_old_inp = 0; move16(); @@ -610,7 +655,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( } ELSE { - Copy_Scale_sig32_16( st_ivas->hCPE[0]->hCoreCoder[n]->input_buff32_fx, st_ivas->hCPE[0]->hCoreCoder[n]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hCPE[0]->hCoreCoder[n]->q_inp32 ) ); // Q(q_data_fx) -> Q(q_input) + Copy_Scale_sig32_16( st_ivas->hCPE[0]->hCoreCoder[n]->input_buff32_fx, st_ivas->hCPE[0]->hCoreCoder[n]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hCPE[0]->hCoreCoder[n]->q_old_inp32 ) ); // Q(q_data_fx) -> Q(q_input) st_ivas->hCPE[0]->hCoreCoder[n]->q_old_inp = 0; move16(); } @@ -650,7 +695,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( } ELSE IF( st_ivas->hMCT != NULL && GT_16( st_ivas->nCPE, 1 ) ) { - IF( ( error = mct_enc_reconfigure_fx( st_ivas, st_ivas->nchan_transport != nchan_transport_old ) ) != IVAS_ERR_OK ) + IF( ( error = mct_enc_reconfigure_fx( st_ivas, (UWord16) NE_16( nchan_transport_old_real, nchan_transport_real ) ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_cpe_enc_fx.c b/lib_enc/ivas_cpe_enc_fx.c index ea70a33d36279ed00872b406d49e338eee6294ad..c5eb5c67d0915dbec1a231934bb0e631b7d7ca16 100644 --- a/lib_enc/ivas_cpe_enc_fx.c +++ b/lib_enc/ivas_cpe_enc_fx.c @@ -51,36 +51,37 @@ /*--------------------------------------------------------------------------* * Local function prototypes *--------------------------------------------------------------------------*/ + static void stereo_mode_combined_format_enc_fx( const Encoder_Struct *st_ivas, CPE_ENC_HANDLE hCPE ); + /*-------------------------------------------------------------------* * ivas_cpe_enc() * * Channel Pair Element (CPE) encoding routine *-------------------------------------------------------------------*/ + ivas_error ivas_cpe_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const Word16 cpe_id, /* i : CPE # identifier Q0*/ - Word32 data_fx_ch0[], /* i : input signal for channel 0 Q(q_data_fx)*/ - Word32 data_fx_ch1[], /* i : input signal for channel 1 Q(q_data_fx)*/ - Word16 q_data_fx, /* i : Q-factor of input signal for both channels */ - const Word16 input_frame, /* i : input frame length per channel Q0*/ - const Word16 nb_bits_metadata, /* i : number of metadata bits Q0*/ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const Word16 cpe_id, /* i : CPE # identifier Q0*/ + Word32 data_fx_ch0[], /* i : input signal for channel 0 Q(q_data_fx)*/ + Word32 data_fx_ch1[], /* i : input signal for channel 1 Q(q_data_fx)*/ + Word16 q_data_fx, /* i : Q-factor of input signal for both channels */ + const Word16 input_frame, /* i : input frame length per channel Q0*/ + const Word16 nb_bits_metadata, /* i : number of metadata bits Q0*/ Word16 Q_new_out[] ) { CPE_ENC_HANDLE hCPE; + STEREO_DFT_CONFIG_DATA_HANDLE hConfigDft; Encoder_State **sts; Word16 n, n_CoreChannels; Word32 old_inp_12k8_fx[CPE_CHANNELS][L_INP_12k8]; /* buffer of input signal @ 12k8 Q15 */ Word16 old_inp_12k8_16fx[CPE_CHANNELS][L_INP_12k8]; /* buffer of input signal @ 12k8 Q_new-1 */ Word32 old_inp_16k_fx[CPE_CHANNELS][L_INP]; /* buffer of input signal @ 16kHz Q15 */ Word16 old_inp_16k_16fx[CPE_CHANNELS][L_INP]; /* buffer of input signal @ 16kHz Q_new-1 */ - Word16 Q_new[CPE_CHANNELS] = { 0 }; - Word16 fft_buff_fx[CPE_CHANNELS][2 * L_FFT]; /* FFT buffer */ - Word16 fft_buff_fx_q[CPE_CHANNELS]; /* FFT buffer */ -#ifdef MSAN_FIX + Word16 fft_buff_fx[CPE_CHANNELS][2 * L_FFT]; /* FFT buffer */ + Word16 fft_buff_fx_q[CPE_CHANNELS]; /* FFT buffer */ set16_fx( fft_buff_fx_q, 0, CPE_CHANNELS ); -#endif Word16 fft_buff_fx_final_q = MAX_16; move16(); Word32 ener_fx[CPE_CHANNELS]; /* residual energy from Levinson-Durbin Q6 */ @@ -106,16 +107,17 @@ ivas_error ivas_cpe_enc_fx( Word32 currFlatness_fx[CPE_CHANNELS]; /* flatness parameter Q21 */ Word16 tdm_ratio_idx, tdm_ratio_idx_SM; /* temp. TD stereo parameters */ Word16 tdm_SM_or_LRTD_Pri; /* temp. TD stereo parameters */ - - Word16 nb_bits; /* number of DFT stereo side bits */ - Word32 fr_bands_fx[CPE_CHANNELS][2 * NB_BANDS]; /* energy in frequency bands (Q_buffer + QSCALE) */ - Word16 Etot_LR_fx[CPE_CHANNELS]; /* total energy Q8 */ - Word32 lf_E_fx[CPE_CHANNELS][2 * VOIC_BINS]; /* per bin spectrum energy in lf (Q_buffer + QSCALE - 2) */ - Word16 localVAD_HE_SAD[CPE_CHANNELS]; /* HE-SAD flag without hangover, LR channels */ - Word32 band_energies_LR_fx[2 * NB_BANDS]; /* energy in critical bands without minimum noise floor E_MIN (Q_buffer + QSCALE - band_ener_guardbits) */ + Word16 nb_bits; /* number of DFT stereo side bits */ + Word32 fr_bands_fx[CPE_CHANNELS][2 * NB_BANDS]; /* energy in frequency bands (Q_buffer + QSCALE) */ + Word16 Etot_LR_fx[CPE_CHANNELS]; /* total energy Q8 */ + Word32 lf_E_fx[CPE_CHANNELS][2 * VOIC_BINS]; /* per bin spectrum energy in lf (Q_buffer + QSCALE - 2) */ + Word16 localVAD_HE_SAD[CPE_CHANNELS]; /* HE-SAD flag without hangover, LR channels */ + Word32 band_energies_LR_fx[2 * NB_BANDS]; /* energy in critical bands without minimum noise floor E_MIN (Q_buffer + QSCALE - band_ener_guardbits) */ Word16 Q_buffer[2]; Word16 orig_input_fx[CPE_CHANNELS][L_FRAME48k]; + Word32 orig_input_fx32[CPE_CHANNELS][L_FRAME48k]; Word16 Q_orig_inp[CPE_CHANNELS]; + Word16 Q_orig_inp32[CPE_CHANNELS]; Word16 Etot_last_fx[CPE_CHANNELS]; Word32 tmp, input_Fs; Word16 max_bwidth, ivas_format; @@ -127,8 +129,10 @@ ivas_error ivas_cpe_enc_fx( Word16 last_bits_frame_nominal; /* last_bits_frame_nominal for M or PCh channel */ Word16 old_wsp_fx[CPE_CHANNELS][L_WSP]; Word16 e_old_wsp[CPE_CHANNELS], q_old_wsp; - move16(); // Q_new - move16(); // Q_new + Word16 Q_new[CPE_CHANNELS] = { 0 }; + move16(); + move16(); + Word16 q_com, shift, q_min, gb; error = IVAS_ERR_OK; move32(); @@ -176,7 +180,6 @@ ivas_error ivas_cpe_enc_fx( set16_fx( voicing_fr_fx[0], 0, NB_SUBFR ); set16_fx( voicing_fr_fx[1], 0, NB_SUBFR ); -#ifdef MSAN_FIX FOR( Word16 i = 0; i < CPE_CHANNELS; i++ ) { set16_zero_fx( fft_buff_fx[i], 2 * L_FFT ); @@ -185,7 +188,7 @@ ivas_error ivas_cpe_enc_fx( set16_zero_fx( old_inp_12k8_16fx[i], L_INP_12k8 ); set_zero_fx( old_inp_12k8_fx[i], L_INP_12k8 ); } -#endif + /*------------------------------------------------------------------* * CPE initialization - core coder *-----------------------------------------------------------------*/ @@ -203,8 +206,8 @@ ivas_error ivas_cpe_enc_fx( IF( st_ivas->hMCT == NULL ) /*already updated before CPE call*/ { - sts[n]->input_bwidth = sts[n]->last_input_bwidth; /* updated in BWD Q0*/ - sts[n]->bwidth = sts[n]->last_bwidth; /* updated in BWD Q0*/ + sts[n]->input_bwidth = sts[n]->last_input_bwidth; /* updated in BWD Q0*/ + sts[n]->bwidth = sts[n]->last_bwidth; /* updated in BWD Q0*/ move16(); move16(); } @@ -220,30 +223,34 @@ ivas_error ivas_cpe_enc_fx( #endif } - Copy32( data_fx_ch0, sts[0]->input32_fx, input_frame ); // Q(q_data_fx) - sts[0]->q_inp32 = q_data_fx; + Word16 norm, Q_min = s_min( q_data_fx, add( sts[0]->q_old_inp32, L_norm_arr( sts[0]->input32_fx - input_frame, input_frame ) ) ); + norm = L_norm_arr( data_fx_ch0, input_frame ); + IF( data_fx_ch1 != NULL ) /*this may happen for cases with odd number of channels*/ + { + Q_min = s_min( Q_min, add( sts[1]->q_old_inp32, L_norm_arr( sts[1]->input32_fx - input_frame, input_frame ) ) ); + norm = s_min( norm, L_norm_arr( data_fx_ch1, input_frame ) ); + } + scale_sig32( sts[0]->input32_fx - input_frame, input_frame, sub( Q_min, sts[0]->q_old_inp32 ) ); + sts[0]->q_old_inp32 = Q_min; move16(); - Word16 norm = L_norm_arr( sts[0]->input32_fx, input_frame ); - scale_sig32( sts[0]->input32_fx, input_frame, norm ); - sts[0]->q_inp32 = add( sts[0]->q_inp32, norm ); + Copy_Scale_sig32( data_fx_ch0, sts[0]->input32_fx, input_frame, sub( Q_min, q_data_fx ) ); // Q(Q_min) + sts[0]->q_inp32 = Q_min; move16(); - Copy_Scale_sig32_16( sts[0]->input32_fx, sts[0]->input_fx, input_frame, 0 ); - sts[0]->q_inp = sub( sts[0]->q_inp32, Q16 ); + Copy_Scale_sig32_16( sts[0]->input32_fx, sts[0]->input_fx, input_frame, norm ); + sts[0]->q_inp = add( sub( sts[0]->q_inp32, Q16 ), norm ); move16(); IF( data_fx_ch1 != NULL ) /*this may happen for cases with odd number of channels*/ { - Copy32( data_fx_ch1, sts[1]->input32_fx, input_frame ); // Q(q_data_fx) - sts[1]->q_inp32 = q_data_fx; + scale_sig32( sts[1]->input32_fx - input_frame, input_frame, sub( Q_min, sts[1]->q_old_inp32 ) ); + sts[1]->q_old_inp32 = Q_min; move16(); - - norm = L_norm_arr( sts[1]->input32_fx, input_frame ); - scale_sig32( sts[1]->input32_fx, input_frame, norm ); - sts[1]->q_inp32 = add( sts[1]->q_inp32, norm ); + Copy_Scale_sig32( data_fx_ch1, sts[1]->input32_fx, input_frame, sub( Q_min, q_data_fx ) ); // Q(Q_min) + sts[1]->q_inp32 = Q_min; move16(); - Copy_Scale_sig32_16( sts[1]->input32_fx, sts[1]->input_fx, input_frame, 0 ); - sts[1]->q_inp = sub( sts[1]->q_inp32, Q16 ); + Copy_Scale_sig32_16( sts[1]->input32_fx, sts[1]->input_fx, input_frame, norm ); + sts[1]->q_inp = add( sub( sts[1]->q_inp32, Q16 ), norm ); move16(); } @@ -260,6 +267,7 @@ ivas_error ivas_cpe_enc_fx( * Stereo technology selection * Front-VAD on input L and R channels *----------------------------------------------------------------*/ + test(); IF( sts[0]->ini_frame > 0 && st_ivas->hMCT == NULL ) { @@ -288,9 +296,7 @@ ivas_error ivas_cpe_enc_fx( move16(); Word16 front_create_flag = 0; move16(); -#ifdef MSAN_FIX set32_fx( band_energies_LR_fx, 0, 2 * NB_BANDS ); -#endif IF( hCPE->hFrontVad[0] != NULL && NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { @@ -303,8 +309,8 @@ ivas_error ivas_cpe_enc_fx( } FOR( n = 0; n < CPE_CHANNELS; n++ ) { - Scale_sig( sts[n]->input_fx, input_frame, sub( scale_inp, sts[n]->q_inp ) ); - Scale_sig( hCPE->hFrontVad[n]->mem_decim_fx, 2 * L_FILT_MAX, sub( scale_inp, hCPE->hFrontVad[n]->q_mem_decim ) ); + scale_sig( sts[n]->input_fx, input_frame, sub( scale_inp, sts[n]->q_inp ) ); + scale_sig( hCPE->hFrontVad[n]->mem_decim_fx, 2 * L_FILT_MAX, sub( scale_inp, hCPE->hFrontVad[n]->q_mem_decim ) ); sts[n]->q_inp = scale_inp; move16(); hCPE->hFrontVad[n]->q_mem_decim = scale_inp; @@ -366,40 +372,23 @@ ivas_error ivas_cpe_enc_fx( /*----------------------------------------------------------------* * dynamically allocate data structures depending on the actual stereo mode *----------------------------------------------------------------*/ + IF( ( error = stereo_memory_enc_fx( hCPE, input_Fs, max_bwidth, ivas_format, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) { return error; } + hConfigDft = NULL; + IF( hCPE->hStereoDft != NULL ) + { + hConfigDft = hCPE->hStereoDft->hConfig; + } /*----------------------------------------------------------------* * Set TD stereo parameters *----------------------------------------------------------------*/ -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( sts[1]->input_fx, sts[1]->input32_fx, input_frame, sub( Q11, sts[1]->q_inp ) ); /* Q11 */ - Copy_Scale_sig_16_32_no_sat( sts[0]->input_fx, sts[0]->input32_fx, input_frame, sub( Q11, sts[0]->q_inp ) ); /* Q11 */ -#else - Copy_Scale_sig_16_32_DEPREC( sts[1]->input_fx, sts[1]->input32_fx, input_frame, sub( Q11, sts[1]->q_inp ) ); /* Q11 */ - Copy_Scale_sig_16_32_DEPREC( sts[0]->input_fx, sts[0]->input32_fx, input_frame, sub( Q11, sts[0]->q_inp ) ); /* Q11 */ -#endif - Word16 shift = getScaleFactor32( sts[1]->input32_fx, input_frame ); - scale_sig32( sts[1]->input32_fx, input_frame, shift ); /* Q11 + shift */ - sts[1]->q_inp32 = add( Q11, shift ); - move16(); - - shift = getScaleFactor32( sts[0]->input32_fx, input_frame ); - scale_sig32( sts[0]->input32_fx, input_frame, shift ); /* Q11 + shift */ - sts[0]->q_inp32 = add( Q11, shift ); - move16(); - Q_inp = s_min( Q_inp, s_min( sts[0]->q_inp32, sts[1]->q_inp32 ) ); - scale_sig32( sts[0]->input32_fx, input_frame, sub( Q_inp, sts[0]->q_inp32 ) ); /* Q_inp */ - scale_sig32( sts[1]->input32_fx, input_frame, sub( Q_inp, sts[1]->q_inp32 ) ); /* Q_inp */ - sts[1]->q_inp32 = sts[0]->q_inp32 = Q_inp; - move16(); - move16(); - - IF( ( error = stereo_set_tdm_fx( hCPE, input_frame, Q_inp ) ) != IVAS_ERR_OK ) + IF( ( error = stereo_set_tdm_fx( hCPE, input_frame, sts[1]->q_inp32 ) ) != IVAS_ERR_OK ) { return error; } @@ -408,78 +397,51 @@ ivas_error ivas_cpe_enc_fx( /*----------------------------------------------------------------* * Resets/updates in case of stereo switching *----------------------------------------------------------------*/ -#ifdef FIX_ISSUE_1247 - shift = norm_arr( sts[1]->old_input_signal_fx, input_frame ); - Scale_sig( sts[1]->old_input_signal_fx, input_frame, shift ); /* sts[1]->q_old_inp + shift */ - sts[1]->q_old_inp = add( sts[1]->q_old_inp, shift ); - move16(); - shift = norm_arr( sts[1]->input_fx, input_frame ); - Scale_sig( sts[1]->input_fx, input_frame, shift ); /* sts[1]->q_inp + shift */ - sts[1]->q_inp = add( sts[1]->q_inp, shift ); - move16(); - - shift = norm_arr( sts[0]->old_input_signal_fx, input_frame ); - Scale_sig( sts[0]->old_input_signal_fx, input_frame, shift ); /* sts[1]->q_old_inp + shift */ - sts[0]->q_old_inp = add( sts[0]->q_old_inp, shift ); - move16(); - shift = norm_arr( sts[0]->input_fx, input_frame ); - Scale_sig( sts[0]->input_fx, input_frame, shift ); /* sts[1]->q_inp, shift */ - sts[0]->q_inp = add( sts[0]->q_inp, shift ); - move16(); -#else - shift = getScaleFactor16( sts[1]->old_input_signal_fx, input_frame ); - Scale_sig( sts[1]->old_input_signal_fx, input_frame, shift ); /* sts[1]->q_old_inp + shift */ - sts[1]->q_old_inp = add( sts[1]->q_old_inp, shift ); - move16(); - shift = getScaleFactor16( sts[1]->input_fx, input_frame ); - Scale_sig( sts[1]->input_fx, input_frame, shift ); /* sts[1]->q_inp + shift */ - sts[1]->q_inp = add( sts[1]->q_inp, shift ); - move16(); - - shift = getScaleFactor16( sts[0]->old_input_signal_fx, input_frame ); - Scale_sig( sts[0]->old_input_signal_fx, input_frame, shift ); /* sts[1]->q_old_inp + shift */ - sts[0]->q_old_inp = add( sts[0]->q_old_inp, shift ); - move16(); - shift = getScaleFactor16( sts[0]->input_fx, input_frame ); - Scale_sig( sts[0]->input_fx, input_frame, shift ); /* sts[1]->q_inp, shift */ - sts[0]->q_inp = add( sts[0]->q_inp, shift ); - move16(); -#endif - - Word16 q_inp = s_min( s_min( sts[0]->q_inp, sts[0]->q_old_inp ), s_min( sts[1]->q_inp, sts[1]->q_old_inp ) ); - Scale_sig( sts[1]->input_fx, input_frame, sub( q_inp, sts[1]->q_inp ) ); /* q_inp */ - Scale_sig( sts[1]->old_input_signal_fx, input_frame, sub( q_inp, sts[1]->q_old_inp ) ); /* q_inp */ - sts[1]->q_inp = q_inp; - sts[1]->q_old_inp = q_inp; - move16(); - move16(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) + { + gb = find_guarded_bits_fx( sts[0]->encoderLookahead_FB ); + shift = L_norm_arr( sts[1]->old_input_signal32_fx, shl( input_frame, 1 ) ); + shift = s_min( shift, L_norm_arr( sts[0]->old_input_signal32_fx, shl( input_frame, 1 ) ) ); + + IF( LT_16( shift, gb ) ) + { + shift = sub( shift, gb ); + scale_sig32( sts[1]->input32_fx, input_frame, shift ); /* q_inp32 + shift */ + scale_sig32( sts[0]->input32_fx, input_frame, shift ); /* q_inp32 + shift */ + scale_sig32( sts[1]->old_input_signal32_fx, input_frame, shift ); /* q_old_inp32 + shift */ + scale_sig32( sts[0]->old_input_signal32_fx, input_frame, shift ); /* q_old_inp32 + shift */ + sts[1]->q_inp32 = add( sts[1]->q_inp32, shift ); + sts[0]->q_inp32 = add( sts[0]->q_inp32, shift ); + sts[1]->q_old_inp32 = add( sts[1]->q_old_inp32, shift ); + sts[0]->q_old_inp32 = add( sts[0]->q_old_inp32, shift ); + move16(); + move16(); + move16(); + move16(); + } + } - Scale_sig( sts[0]->input_fx, input_frame, sub( q_inp, sts[0]->q_inp ) ); /* q_inp */ - Scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( q_inp, sts[0]->q_old_inp ) ); /* q_inp */ - sts[0]->q_inp = q_inp; - move16(); - sts[0]->q_old_inp = q_inp; - move16(); - Scale_sig( sts[0]->buf_speech_enc, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, sub( q_inp, sub( Q15, sts[0]->exp_buf_speech_enc ) ) ); // q_inp - sts[0]->exp_buf_speech_enc = sub( Q15, q_inp ); - move16(); - stereo_switching_enc_fx( hCPE, sts[0]->old_input_signal_fx, input_frame, q_inp ); + stereo_switching_enc_fx( hCPE, sts[0]->old_input_signal32_fx, input_frame, sts[0]->q_old_inp32 ); /*----------------------------------------------------------------* * Temporal inter-channel alignment, stereo adjustment *----------------------------------------------------------------*/ - Copy_Scale_sig_16_32_DEPREC( sts[0]->input_buff_fx, sts[0]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), Q6 ); /* Q6 + sts[0]->q_inp */ - sts[0]->q_inp32 = add( Q6, sts[0]->q_inp ); + shift = s_min( L_norm_arr( sts[0]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), L_norm_arr( sts[1]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ); + q_min = add( sts[0]->q_inp32, sub( shift, find_guarded_bits_fx( input_frame ) ) ); + scale_sig32( sts[1]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), sub( q_min, sts[1]->q_inp32 ) ); /* q_min */ + scale_sig32( sts[0]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), sub( q_min, sts[0]->q_inp32 ) ); /* q_min */ + sts[0]->q_inp32 = sts[1]->q_inp32 = sts[0]->q_old_inp32 = sts[1]->q_old_inp32 = q_min; + move16(); + move16(); move16(); - Copy_Scale_sig_16_32_DEPREC( sts[1]->input_buff_fx, sts[1]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), Q6 ); /* Q6 + sts[0]->q_inp */ - sts[1]->q_inp32 = add( Q6, sts[1]->q_inp ); move16(); stereo_tca_enc_fx( hCPE, input_frame ); - shift = s_min( 0, sub( add( L_norm_arr( sts[0]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), sts[0]->q_inp32 ), 16 ) ); + shift = sub( add( L_norm_arr( sts[0]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), sts[0]->q_inp32 ), 16 ); shift = s_min( shift, sub( add( L_norm_arr( sts[1]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), sts[1]->q_inp32 ), 16 ) ); Copy_Scale_sig32_16( sts[0]->input_buff32_fx, sts[0]->input_buff_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), sub( add( Q16, shift ), sts[0]->q_inp32 ) ); // shift Copy_Scale_sig32_16( sts[1]->input_buff32_fx, sts[1]->input_buff_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), sub( add( Q16, shift ), sts[1]->q_inp32 ) ); // shift @@ -489,15 +451,19 @@ ivas_error ivas_cpe_enc_fx( move16(); move16(); move16(); + /*----------------------------------------------------------------* * Input signal buffering - needed in IC-BWE and TD ITD in MDCT stereo *----------------------------------------------------------------*/ FOR( n = 0; n < CPE_CHANNELS; n++ ) { + Copy32( sts[n]->input32_fx, orig_input_fx32[n], input_frame ); /* sts->q_inp32 */ Copy( sts[n]->input_fx, orig_input_fx[n], input_frame ); /* sts->q_inp */ Scale_sig( orig_input_fx[n], input_frame, sub( -1, sts[n]->q_inp ) ); // Q(-1) Q_orig_inp[n] = -1; + Q_orig_inp32[n] = sts[n]->q_inp32; + move16(); move16(); IF( hCPE->hStereoICBWE != NULL ) @@ -527,7 +493,7 @@ ivas_error ivas_cpe_enc_fx( RunTransientDetection_ivas_fx( sts[n]->input_fx, input_frame, sts[n]->hTranDet, sts[n]->q_inp ); // Note q of sts[n]->input_fx changes inside function } - currFlatness_fx[n] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) sts[n]->hTranDet, NSUBBLOCKS, 0 ); // Q21 + currFlatness_fx[n] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( sts[n]->hTranDet, NSUBBLOCKS, 0 ); // Q21 move32(); } @@ -561,32 +527,23 @@ ivas_error ivas_cpe_enc_fx( IF( NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) && ( NE_32( hCPE->element_brate, hCPE->last_element_brate ) || NE_16( hCPE->last_element_mode, hCPE->element_mode ) || sts[0]->ini_frame == 0 || ( NE_32( ivas_total_brate, st_ivas->hEncoderConfig->last_ivas_total_brate ) ) || LE_32( sts[0]->last_core_brate, SID_2k40 ) ) ) /* If the last frame was SID or NO_DATA, we need to run stereo_dft_config here since VAD decision is not known yet */ { - STEREO_DFT_CONFIG_DATA_HANDLE hConfig; - IF( hCPE->hStereoDft == NULL ) - { - hConfig = NULL; - } - ELSE - { - hConfig = hCPE->hStereoDft->hConfig; - } IF( st_ivas->hQMetaData != NULL ) { test(); /* No Basop - st_ivas->ism_mode != ISM_MODE_NONE as comparison with 0 */ IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) && st_ivas->ism_mode != ISM_MODE_NONE ) { - stereo_dft_config_fx( hConfig, L_mult0( st_ivas->hQMetaData->bits_frame_nominal, 35 /* 0.70f * FRAMES_PER_SEC */ ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + stereo_dft_config_fx( hConfigDft, L_mult0( st_ivas->hQMetaData->bits_frame_nominal, 35 /* 0.70f * FRAMES_PER_SEC */ ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } ELSE { - stereo_dft_config_fx( hConfig, L_mult0( st_ivas->hQMetaData->bits_frame_nominal, FRAMES_PER_SEC ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + stereo_dft_config_fx( hConfigDft, L_mult0( st_ivas->hQMetaData->bits_frame_nominal, FRAMES_PER_SEC ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } } ELSE { /* note; "bits_frame_nominal" needed in TD stereo as well */ - stereo_dft_config_fx( hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + stereo_dft_config_fx( hConfigDft, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } } @@ -679,13 +636,9 @@ ivas_error ivas_cpe_enc_fx( * Stereo processing * Stereo down-mix *----------------------------------------------------------------*/ - // printf("\n%f %f ", hCPE->hStereoClassif->is_speech, hCPE->hCoreCoder[0]->hSpMusClas->past_dlp[0]); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { -#ifndef MSAN_FIX - hCPE->hStereoClassif->xtalk_score_fx = floatToFixed( hCPE->hStereoClassif->xtalk_score, 31 ); -#endif // !MSAN_FIX - /*flt2fix: dft_synthesize*/ test(); if ( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] ) { @@ -702,47 +655,46 @@ ivas_error ivas_cpe_enc_fx( hCPE->hStereoDft->Spd_R_smooth_fx_e = sub( hCPE->hStereoDft->Spd_R_smooth_fx_e, temp ); move16(); - shift = getScaleFactor16( sts[1]->old_input_signal_fx, input_frame ); - Scale_sig( sts[1]->old_input_signal_fx, input_frame, shift ); /* sts[1]->q_old_inp + shift */ - sts[1]->q_old_inp = add( sts[1]->q_old_inp, shift ); - move16(); - shift = getScaleFactor16( sts[1]->input_fx, input_frame ); - Scale_sig( sts[1]->input_fx, input_frame, shift ); /* sts[1]->q_inp + shift */ - sts[1]->q_inp = add( sts[1]->q_inp, shift ); - move16(); - Scale_sig( sts[1]->input_fx, input_frame, sub( s_min( sts[1]->q_inp, sts[1]->q_old_inp ), sts[1]->q_inp ) ); /* min( sts[1]->q_inp, sts[1]->q_old_inp) */ - Scale_sig( sts[1]->old_input_signal_fx, input_frame, sub( s_min( sts[1]->q_old_inp, sts[1]->q_inp ), sts[1]->q_old_inp ) ); /* min( sts[1]->q_old_inp, sts[1]->q_inp) */ - sts[1]->q_inp = s_min( sts[1]->q_inp, sts[1]->q_old_inp ); - move16(); - sts[1]->q_old_inp = sts[1]->q_inp; + q_com = MAX_16; move16(); + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + q_com = s_min( q_com, sub( add( L_norm_arr( sts[n]->input32_fx, input_frame ), sts[n]->q_inp32 ), 16 ) ); + q_com = s_min( q_com, sub( add( L_norm_arr( sts[n]->old_input_signal32_fx, input_frame ), sts[n]->q_old_inp32 ), 16 ) ); + q_com = s_min( q_com, add( norm_arr( hCPE->input_mem_fx[n], hCPE->hStereoDft->dft_ovl ), hCPE->q_input_mem[n] ) ); - shift = getScaleFactor16( sts[0]->old_input_signal_fx, input_frame ); - Scale_sig( sts[0]->old_input_signal_fx, input_frame, shift ); /* sts[0]->q_old_inp + shift */ - sts[0]->q_old_inp = add( sts[0]->q_old_inp, shift ); - move16(); - shift = getScaleFactor16( sts[0]->input_fx, input_frame ); - Scale_sig( sts[0]->input_fx, input_frame, shift ); /* sts[0]->q_inp + shift */ - sts[0]->q_inp = add( sts[0]->q_inp, shift ); - move16(); - Scale_sig( sts[0]->input_fx, input_frame, sub( s_min( sts[0]->q_inp, sts[0]->q_old_inp ), sts[0]->q_inp ) ); /* min( sts[1]->q_inp, sts[1]->q_old_inp) */ - Scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( s_min( sts[0]->q_old_inp, sts[0]->q_inp ), sts[0]->q_old_inp ) ); /* min( sts[1]->q_old_inp, sts[1]->q_inp) */ - sts[0]->q_inp = s_min( sts[0]->q_inp, sts[0]->q_old_inp ); - move16(); - sts[0]->q_old_inp = sts[0]->q_inp; - move16(); + if ( EQ_16( q_com, Q15 ) ) + { + q_com = 0; + move16(); + } + } + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + Copy_Scale_sig_32_16( sts[n]->input32_fx, sts[n]->input_fx, input_frame, sub( q_com, sts[n]->q_inp32 ) ); + sts[n]->q_inp = q_com; + move16(); + + Copy_Scale_sig_32_16( sts[n]->old_input_signal32_fx, sts[n]->old_input_signal_fx, input_frame, sub( q_com, sts[n]->q_old_inp32 ) ); + sts[n]->q_old_inp = q_com; + move16(); + + scale_sig( hCPE->input_mem_fx[n], hCPE->hStereoDft->dft_ovl, sub( q_com, hCPE->q_input_mem[n] ) ); + hCPE->q_input_mem[n] = q_com; + move16(); + } - stereo_dft_hybrid_ITD_flag_fx( hCPE->hStereoDft->hConfig, input_Fs, hCPE->hStereoDft->hItd->hybrid_itd_max ); + stereo_dft_hybrid_ITD_flag_fx( hConfigDft, input_Fs, hCPE->hStereoDft->hItd->hybrid_itd_max ); /* Time Domain ITD compensation using extrapolation */ - stereo_td_itd_fx( hCPE->hStereoDft->hItd, hCPE->hStereoDft->input_mem_itd_fx, hCPE->hStereoDft->q_input_mem_itd, hCPE->hStereoDft->hConfig->hybrid_itd_flag, hCPE->hStereoDft->dft_ovl, sts, input_frame, hCPE->input_mem_fx, hCPE->q_input_mem ); + stereo_td_itd_fx( hCPE->hStereoDft->hItd, hCPE->hStereoDft->input_mem_itd_fx, hCPE->hStereoDft->q_input_mem_itd, hConfigDft->hybrid_itd_flag, hCPE->hStereoDft->dft_ovl, sts, input_frame, hCPE->input_mem_fx, hCPE->q_input_mem ); stereo_dft_enc_analyze_fx( sts, CPE_CHANNELS, input_frame, hCPE->hStereoDft, NULL, hCPE->hStereoDft->DFT_fx, hCPE->hStereoDft->DFT_fx_e, hCPE->input_mem_fx, hCPE->q_input_mem ); - sts[0]->total_brate = L_mult0( add( sts[0]->bits_frame_nominal, 10 ), FRAMES_PER_SEC ); /* add small overhead; st[0]->total_brate used in coder_type_modif() Q0*/ + sts[0]->total_brate = L_mult0( add( sts[0]->bits_frame_nominal, 10 ), FRAMES_PER_SEC ); /* add small overhead; st[0]->total_brate used in coder_type_modif() Q0*/ /* Update DFT Stereo memories */ - stereo_dft_enc_update_fx( hCPE->hStereoDft, sts[0]->max_bwidth ); + stereo_dft_enc_update_fx( hCPE->hStereoDft, max_bwidth ); /* DFT stereo processing */ stereo_dft_enc_process_fx( hCPE, vad_flag_dtx, vad_hover_flag, input_frame ); @@ -775,6 +727,8 @@ ivas_error ivas_cpe_enc_fx( move16(); } stereo_tdm_downmix_ivas_fx( hCPE->hStereoTD, sts[0]->input_fx, sts[1]->input_fx, input_frame, tdm_ratio_idx, tdm_SM_flag, tdm_ratio_idx_SM ); + Copy_Scale_sig_16_32_no_sat( sts[0]->input_fx, sts[0]->input32_fx, input_frame, sub( sts[0]->q_inp32, sts[0]->q_inp ) ); + Copy_Scale_sig_16_32_no_sat( sts[1]->input_fx, sts[1]->input32_fx, input_frame, sub( sts[1]->q_inp32, sts[1]->q_inp ) ); /* signal the bitrate for BW selection in the SCh */ sts[0]->bits_frame_channel = 0; @@ -789,8 +743,8 @@ ivas_error ivas_cpe_enc_fx( move16(); } - Etot_last_fx[0] = sts[0]->hNoiseEst->Etot_last_fx; /* Q8 */ - Etot_last_fx[1] = sts[1]->hNoiseEst->Etot_last_fx; /* Q8 */ + Etot_last_fx[0] = extract_h( sts[0]->hNoiseEst->Etot_last_32fx ); /* Q8 */ + Etot_last_fx[1] = extract_h( sts[1]->hNoiseEst->Etot_last_32fx ); /* Q8 */ move16(); move16(); } @@ -805,29 +759,32 @@ ivas_error ivas_cpe_enc_fx( sts[1]->exp_old_inp_12k8 = Q15; move16(); } - } - test(); - IF( hCPE->hStereoMdct != NULL && hCPE->hStereoMdct->hItd != NULL ) - { - Word16 q_min; + q_min = sts[1]->q_old_inp; move16(); q_min = s_min( q_min, sts[1]->q_inp ); q_min = s_min( q_min, sts[0]->q_old_inp ); q_min = s_min( q_min, sts[0]->q_inp ); + q_min = s_min( q_min, hCPE->q_input_mem[0] ); + q_min = s_min( q_min, hCPE->q_input_mem[1] ); shift = norm_arr( sts[1]->old_input_signal_fx, input_frame ); shift = s_min( shift, norm_arr( sts[1]->input_fx, input_frame ) ); shift = s_min( shift, norm_arr( sts[0]->old_input_signal_fx, input_frame ) ); shift = s_min( shift, norm_arr( sts[0]->input_fx, input_frame ) ); + shift = s_min( shift, norm_arr( hCPE->input_mem_fx[0], hCPE->hStereoMdct->hDft_ana->dft_ovl ) ); + shift = s_min( shift, norm_arr( hCPE->input_mem_fx[1], hCPE->hStereoMdct->hDft_ana->dft_ovl ) ); q_min = add( q_min, shift ); - scale_sig( sts[1]->input_fx, input_frame, sub( q_min, sts[1]->q_inp ) ); /* q_min */ - scale_sig( sts[1]->old_input_signal_fx, input_frame, sub( q_min, sts[1]->q_old_inp ) ); /* q_min */ - scale_sig( sts[0]->input_fx, input_frame, sub( q_min, sts[0]->q_inp ) ); /* q_min */ - scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( q_min, sts[0]->q_old_inp ) ); /* q_min */ - + scale_sig( sts[1]->input_fx, input_frame, sub( q_min, sts[1]->q_inp ) ); /* q_min */ + scale_sig( sts[1]->old_input_signal_fx, input_frame, sub( q_min, sts[1]->q_old_inp ) ); /* q_min */ + scale_sig( sts[0]->input_fx, input_frame, sub( q_min, sts[0]->q_inp ) ); /* q_min */ + scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( q_min, sts[0]->q_old_inp ) ); /* q_min */ + scale_sig( hCPE->input_mem_fx[0], hCPE->hStereoMdct->hDft_ana->dft_ovl, sub( q_min, hCPE->q_input_mem[0] ) ); /* q_min */ + scale_sig( hCPE->input_mem_fx[1], hCPE->hStereoMdct->hDft_ana->dft_ovl, sub( q_min, hCPE->q_input_mem[1] ) ); /* q_min */ + hCPE->q_input_mem[1] = q_min; + hCPE->q_input_mem[0] = q_min; sts[1]->q_old_inp = q_min; sts[0]->q_old_inp = q_min; sts[1]->q_inp = q_min; @@ -836,6 +793,8 @@ ivas_error ivas_cpe_enc_fx( move16(); move16(); move16(); + move16(); + move16(); } stereo_td_itd_mdct_stereo_fx( hCPE, vad_flag_dtx, vad_hover_flag, input_frame ); @@ -844,6 +803,7 @@ ivas_error ivas_cpe_enc_fx( /*----------------------------------------------------------------* * DFT stereo: iDFT and resampling on both channels *----------------------------------------------------------------*/ + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { Word32 internal_Fs; @@ -864,32 +824,28 @@ ivas_error ivas_cpe_enc_fx( Word16 out_16k_start_ind = 0, out_16k_end_ind = 0; move16(); move16(); - stereo_dft_enc_synthesize_fx( hCPE->hStereoDft, sts[0]->input32_fx, &out_start_ind, &out_end_ind, 0, input_Fs, input_Fs, 0, NULL ); -#ifdef FIX_ISSUE_1135 - // Normalise the input buffer from Q15 - Word16 input_norm, q_inp32, common_q, fir_delay_len; - input_norm = L_norm_arr( sts[0]->input32_fx + out_start_ind, sub( out_end_ind, out_start_ind ) ); - q_inp32 = add( Q15, input_norm ); - fir_delay_len = NS2SA_FX2( sts[0]->input_Fs, DELAY_FIR_RESAMPL_NS ); + stereo_dft_enc_synthesize_fx( hCPE->hStereoDft, sts[0]->input32_fx, &out_start_ind, &out_end_ind, 0, input_Fs, input_Fs, 0, NULL ); + Scale_sig32( sts[0]->input32_fx - input_frame, add( out_start_ind, input_frame ), sub( Q15, sts[0]->q_old_inp32 ) ); // scaling initial part of the input buffer + Scale_sig32( sts[0]->input32_fx + out_end_ind, sub( input_frame, out_end_ind ), sub( Q15, sts[0]->q_inp32 ) ); // scaling initial part of the input buffer + sts[0]->q_inp32 = Q15; + sts[0]->q_old_inp32 = Q15; + move16(); move16(); - // Find common Q-factor between { q_inp, q_old_inp and q_inp32-16 } - common_q = s_min( s_min( sub( q_inp32, 16 ), sts[0]->q_inp ), sts[0]->q_old_inp ); + // Normalise the input buffer from Q15 + Word16 input_norm, q_inp; //, common_q, fir_delay_len; + input_norm = L_norm_arr( sts[0]->input32_fx - input_frame, shl( input_frame, 1 ) ); + q_inp = sub( add( Q15, input_norm ), 16 ); // Rescale the old input, input and FIR delay section of input buffer - scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( common_q, sts[0]->q_old_inp ) ); // q_old_inp -> common_q - Copy_Scale_sig32_16( sts[0]->input32_fx + out_start_ind, sts[0]->input_fx + out_start_ind, sub( out_end_ind, out_start_ind ), sub( add( Q16, common_q ), Q15 ) ); // Q15 -> common_q - scale_sig( sts[0]->input_fx + out_end_ind, add( sub( input_frame, out_end_ind ), fir_delay_len ), sub( common_q, sts[0]->q_inp ) ); // q_inp -> common_q + Copy_Scale_sig32_16( sts[0]->input32_fx - input_frame, sts[0]->input_fx - input_frame, shl( input_frame, 1 ), sub( add( Q16, q_inp ), Q15 ) ); // Q15 -> q_inp // Update the Q-factors - sts[0]->q_inp = common_q; + sts[0]->q_inp = q_inp; move16(); - sts[0]->q_old_inp = common_q; + sts[0]->q_old_inp = q_inp; move16(); -#else - Copy_Scale_sig32_16( sts[0]->input32_fx + out_start_ind, sts[0]->input_fx + out_start_ind, sub( out_end_ind, out_start_ind ), sub( add( Q16, sts[0]->q_inp ), Q15 ) ); // Q15 -#endif /* iDFT & resampling to 12.8kHz internal sampling rate */ stereo_dft_enc_synthesize_fx( hCPE->hStereoDft, old_inp_12k8_fx[0] + L_INP_MEM, &out_12k8_start_ind[0], &out_12k8_end_ind[0], 0, input_Fs, INT_FS_12k8, 0, NULL ); @@ -898,7 +854,7 @@ ivas_error ivas_cpe_enc_fx( /* iDFT & resampling to 16kHz internal sampling rate for M channel */ IF( EQ_32( input_Fs, internal_Fs ) ) { - Copy32( sts[0]->input32_fx - STEREO_DFT_OVL_16k, old_inp_16k_fx[0] + L_INP_MEM - STEREO_DFT_OVL_16k, add( input_frame, STEREO_DFT_OVL_16k ) ); /* Q_inp */ + Copy32( sts[0]->input32_fx - STEREO_DFT_OVL_16k, old_inp_16k_fx[0] + L_INP_MEM - STEREO_DFT_OVL_16k, add( input_frame, STEREO_DFT_OVL_16k ) ); /* sts[0]->q_inp32 */ out_16k_start_ind = -STEREO_DFT_OVL_16k; out_16k_end_ind = add( out_16k_start_ind, add( input_frame, STEREO_DFT_OVL_16k ) ); move16(); @@ -928,6 +884,9 @@ ivas_error ivas_cpe_enc_fx( set16_fx( sts[1]->input_fx, 0, input_frame ); sts[1]->q_inp = Q15; move16(); + set32_fx( sts[1]->input32_fx, 0, input_frame ); + sts[1]->q_inp32 = Q31; + move16(); } #ifdef DEBUG_MODE_INFO @@ -937,6 +896,7 @@ ivas_error ivas_cpe_enc_fx( /*----------------------------------------------------------------* * Front Pre-processing *----------------------------------------------------------------*/ + FOR( n = 0; n < n_CoreChannels; n++ ) { set16_fx( old_wsp_fx[n], 0, L_WSP ); @@ -956,11 +916,7 @@ ivas_error ivas_cpe_enc_fx( &ener_fx[n], &relE_fx[n], A_fx[n], Aw_fx[n], epsP_fx[n], &epsP_fx_q[n], lsp_new_fx[n], lsp_mid_fx[n], &vad_hover_flag[n], &attack_flag[n], realBuffer_fx[n], imagBuffer_fx[n], &q_re_im_buf[n], old_wsp_fx[n], &q_old_wsp, pitch_fr_fx[n], voicing_fr_fx[n], &loc_harm[n], &cor_map_sum_fx[n], &vad_flag_dtx[n], enerBuffer_fx[n], &enerBuffer_fx_exp[n], fft_buff_fx[n], &fft_buff_fx_q[n], A_fx[0], lsp_new_fx[0], currFlatness_fx[n], tdm_ratio_idx, fr_bands_fx, q_fr_bands, Etot_LR_fx, lf_E_fx, q_lf_E[n], localVAD_HE_SAD, -#ifdef NONBE_1211_DTX_BR_SWITCHING band_energies_LR_fx, q_band_energies_LR, 0, front_vad_flag, 0, 0, ivas_format, st_ivas->hMCT != NULL, st_ivas->hEncoderConfig->last_ivas_total_brate, ivas_total_brate, &Q_new[n] -#else - band_energies_LR_fx, q_band_energies_LR, 0, front_vad_flag, 0, 0, ivas_format, st_ivas->hMCT != NULL, ivas_total_brate, &Q_new[n] -#endif #ifdef DEBUG_MODE_INFO , ( st_ivas->nSCE + ( cpe_id * CPE_CHANNELS ) + n ) @@ -1001,6 +957,7 @@ ivas_error ivas_cpe_enc_fx( /*----------------------------------------------------------------* * Stereo DTX updates *----------------------------------------------------------------*/ + test(); test(); IF( EQ_16( ivas_format, MASA_FORMAT ) && nb_bits_metadata > 0 && hCPE->hCoreCoder[0]->Opt_DTX_ON ) @@ -1029,48 +986,70 @@ ivas_error ivas_cpe_enc_fx( /*----------------------------------------------------------------* * Core codec configuration *----------------------------------------------------------------*/ - /* IGF reconfiguration */ - FOR( n = 0; n < n_CoreChannels; n++ ) + + test(); + test(); + IF( NE_32( sts[0]->core_brate, SID_2k40 ) && NE_32( sts[0]->core_brate, FRAME_NO_DATA ) ) /* Reconfigurations not needed with DTX*/ { test(); - test(); - test(); - test(); - test(); - test(); - IF( ( NE_32( hCPE->last_element_brate, hCPE->element_brate ) || NE_16( hCPE->element_mode, hCPE->last_element_mode ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( sts[0]->bits_frame_nominal, last_bits_frame_nominal ) ) || NE_16( sts[n]->last_bwidth, sts[n]->bwidth ) ) && ( n == 0 || EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) ) + IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && st_ivas->hMCT == NULL ) { - Word16 igf; - igf = getIgfPresent_fx( sts[n]->element_mode, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), sts[n]->max_bwidth, sts[n]->rf_mode ); /* Q0 */ - IF( ( error = IGF_Reconfig_fx( &sts[n]->hIGFEnc, igf, 0, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), sts[n]->max_bwidth, sts[n]->element_mode, sts[n]->rf_mode ) ) != IVAS_ERR_OK ) + /* set coded BW for MDCT stereo */ + set_bw_stereo_fx( hCPE ); + + /* reconfiguration of MDCT stereo */ + test(); + test(); + test(); + IF( sts[0]->bwidth != sts[0]->last_bwidth || ( ( hCPE->last_element_brate != hCPE->element_brate || hCPE->last_element_mode != hCPE->element_mode ) && sts[0]->bwidth != max_bwidth ) ) { - return error; + initMdctStereoEncData_fx( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, sts[0]->bwidth, 0, NULL, 0 ); + + test(); + test(); + test(); + hCPE->hStereoMdct->isSBAStereoMode = ( ( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) && ( EQ_16( st_ivas->nchan_transport, 2 ) ) ); /* Q0 */ + move16(); + + test(); + IF( LE_32( hCPE->element_brate, MAX_MDCT_ITD_BRATE ) && EQ_16( ivas_format, STEREO_FORMAT ) ) + { + IF( ( error = initMdctItdHandling_fx( hCPE->hStereoMdct, input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } } } - } - test(); - IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && st_ivas->hMCT == NULL ) - { - /* set coded BW for MDCT stereo */ - set_bw_stereo_fx( hCPE ); - /* reconfiguration of MDCT stereo */ - test(); - test(); - test(); - IF( sts[0]->bwidth != sts[0]->last_bwidth || ( ( hCPE->last_element_brate != hCPE->element_brate || hCPE->last_element_mode != hCPE->element_mode ) && sts[0]->bwidth != sts[0]->max_bwidth ) ) + /* IGF reconfiguration */ + FOR( n = 0; n < n_CoreChannels; n++ ) { - initMdctStereoEncData_fx( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, sts[0]->bwidth, 0, NULL, 0 ); - test(); test(); test(); - hCPE->hStereoMdct->isSBAStereoMode = ( ( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) && ( EQ_16( st_ivas->nchan_transport, 2 ) ) ); /* Q0 */ - test(); - IF( LE_32( hCPE->element_brate, MAX_MDCT_ITD_BRATE ) && EQ_16( ivas_format, STEREO_FORMAT ) ) + test(); + test(); + test(); + test(); + IF( ( NE_32( hCPE->last_element_brate, hCPE->element_brate ) || NE_16( hCPE->element_mode, hCPE->last_element_mode ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( sts[0]->bits_frame_nominal, last_bits_frame_nominal ) ) || NE_16( sts[n]->last_bwidth, sts[n]->bwidth ) || EQ_32( sts[n]->last_core_brate, SID_2k40 ) || EQ_32( sts[n]->last_core_brate, FRAME_NO_DATA ) ) && ( EQ_16( n, 0 ) || EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) ) { - IF( ( error = initMdctItdHandling_fx( hCPE->hStereoMdct, input_Fs ) ) != IVAS_ERR_OK ) + Word16 igf; + Word16 bw; + + /* float uses ternary operator for this: bw = ( hCPE->element_mode == IVAS_CPE_MDCT ) ? sts[n]->bwidth : sts[n]->max_bwidth; */ + bw = max_bwidth; + move16(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) + { + bw = sts[n]->bwidth; + move16(); + } + igf = getIgfPresent_fx( sts[n]->element_mode, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), bw, sts[n]->rf_mode ); /* Q0 */ + move16(); + IF( ( error = IGF_Reconfig_fx( &sts[n]->hIGFEnc, igf, 0, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), bw, sts[n]->element_mode, sts[n]->rf_mode ) ) != IVAS_ERR_OK ) + { return error; } @@ -1125,7 +1104,7 @@ ivas_error ivas_cpe_enc_fx( IF( EQ_32( sts[0]->core_brate, SID_2k40 ) ) { - ivas_write_format_sid_fx( ivas_format, hCPE->element_mode, sts[0]->hBstr ); + ivas_write_format_sid_fx( ivas_format, hCPE->element_mode, sts[0]->hBstr, hEncoderConfig->sba_order, hEncoderConfig->sba_planar ); } /*----------------------------------------------------------------* @@ -1145,11 +1124,11 @@ ivas_error ivas_cpe_enc_fx( /* Reconfigure DFT Stereo for inactive frames */ IF( EQ_32( sts[0]->core_brate, SID_2k40 ) ) { - stereo_dft_config_fx( hCPE->hStereoDft->hConfig, IVAS_SID_5k2, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + stereo_dft_config_fx( hConfigDft, IVAS_SID_5k2, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } ELSE { - stereo_dft_config_fx( hCPE->hStereoDft->hConfig, FRAME_NO_DATA, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + stereo_dft_config_fx( hConfigDft, FRAME_NO_DATA, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } stereo_dft_cng_side_gain_fx( hCPE->hStereoDft, hCPE->hStereoCng, sts[0]->core_brate, sts[0]->last_core_brate, sts[0]->bwidth ); @@ -1271,6 +1250,9 @@ ivas_error ivas_cpe_enc_fx( /* update input samples buffer */ FOR( n = 0; n < CPE_CHANNELS; n++ ) { + Copy32( orig_input_fx32[n], sts[n]->old_input_signal32_fx, input_frame ); /* Q_orig_inp32 */ + sts[n]->q_old_inp32 = Q_orig_inp32[n]; + move16(); Copy( orig_input_fx[n], sts[n]->old_input_signal_fx, input_frame ); /* Q_orig_inp */ sts[n]->q_old_inp = Q_orig_inp[n]; move16(); @@ -1281,6 +1263,9 @@ ivas_error ivas_cpe_enc_fx( Copy( sts[0]->input_fx, sts[0]->old_input_signal_fx, input_frame ); /* sts[n]->q_inp */ sts[0]->q_old_inp = sts[0]->q_inp; move16(); + Copy32( sts[0]->input32_fx, sts[0]->old_input_signal32_fx, input_frame ); /* st->q_inp32 */ + sts[0]->q_old_inp32 = sts[0]->q_inp32; + move16(); } ELSE IF( st_ivas->hMCT == NULL ) /* note: in MCT, input buffers are updated later in ivas_mct_enc() */ { @@ -1290,6 +1275,9 @@ ivas_error ivas_cpe_enc_fx( Copy( sts[n]->input_fx, sts[n]->old_input_signal_fx, input_frame ); /* sts[n]->q_inp */ sts[n]->q_old_inp = sts[n]->q_inp; move16(); + Copy32( sts[n]->input32_fx, sts[n]->old_input_signal32_fx, input_frame ); /* st->q_inp32 */ + sts[n]->q_old_inp32 = sts[n]->q_inp32; + move16(); } } @@ -1325,11 +1313,13 @@ ivas_error ivas_cpe_enc_fx( return error; } + /*------------------------------------------------------------------------- * create_cpe_enc() * * Create, allocate and initialize IVAS encoder CPE handle *-------------------------------------------------------------------------*/ + ivas_error create_cpe_enc_fx( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ const Word16 cpe_id, /* i : CPE # identifier Q0*/ @@ -1418,9 +1408,7 @@ ivas_error create_cpe_enc_fx( hCPE->input_mem_fx[n] = NULL; } } -#ifdef MSAN_FIX set16_fx( hCPE->q_input_mem, Q15, CPE_CHANNELS ); -#endif /*-----------------------------------------------------------------* * stereo classifier: allocate and initialize @@ -1460,17 +1448,17 @@ ivas_error create_cpe_enc_fx( IF( GT_16( st_ivas->nCPE, 1 ) ) { - st->total_brate = hCPE->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() Q0*/ + st->total_brate = hCPE->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() Q0*/ move32(); } ELSE { - st->total_brate = L_shr( hCPE->element_brate, 1 ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() Q0*/ + st->total_brate = L_shr( hCPE->element_brate, 1 ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() Q0*/ move32(); } st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; move16(); - IF( NE_32( ( error = init_encoder_ivas_fx( st, st_ivas, n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, ISM_MODE_NONE, hCPE->element_brate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = init_encoder_fx( st, st_ivas, n, 0, ISM_MODE_NONE, hCPE->element_brate ) ), IVAS_ERR_OK ) ) { return error; } @@ -1633,6 +1621,8 @@ ivas_error create_cpe_enc_fx( return error; } + + /*------------------------------------------------------------------------- * destroy_cpe_enc() * @@ -1788,5 +1778,6 @@ static void stereo_mode_combined_format_enc_fx( } } } + return; } diff --git a/lib_enc/ivas_decision_matrix_enc_fx.c b/lib_enc/ivas_decision_matrix_enc_fx.c index bd63553bd70f502ee2ad342de594d6ade28caf07..42e2f446ef539a3105237d0597f67c086fd7cb42 100644 --- a/lib_enc/ivas_decision_matrix_enc_fx.c +++ b/lib_enc/ivas_decision_matrix_enc_fx.c @@ -74,7 +74,7 @@ void ivas_decision_matrix_enc_fx( Encoder_State *st, /* i : encoder state structure */ const Word32 element_brate, /* i : element bitrate Q0*/ const Word16 fft_buff[], /* i : FFT buffer Qx*/ - const Word32 enerBuffer[], /* i : energy buffer enerBuffer_exp*/ + const Word32 enerBuffer[], /* i : energy buffer enerBuffer_exp*/ Word16 enerBuffer_exp, const Word16 last_element_mode /* i : last element mode Q0*/ ) @@ -197,14 +197,6 @@ void ivas_decision_matrix_enc_fx( move16(); } } - - test(); - test(); - test(); - test(); - test(); - test(); - #ifdef DEBUG_FORCE_DIR if ( st->force_dir[0] != '\0' ) { @@ -217,14 +209,22 @@ void ivas_decision_matrix_enc_fx( #endif /* do not allow TD stereo ACELP core -> DFT stereo TCX core switching as it is on the WC complexity path */ + test(); + test(); + test(); + test(); + test(); + test(); if ( ( ( st->last_core == ACELP_CORE && EQ_16( last_element_mode, IVAS_CPE_TD ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) ) || ( EQ_16( st->tdm_LRTD_flag, 1 ) && LE_32( st->total_brate, IVAS_16k4 ) ) ) && EQ_16( st->core, TCX_20_CORE ) && LE_32( st->total_brate, MAX_ACELP_BRATE ) ) /* Override TCX in case of LRTD && primary channel has low bitrate*/ { st->core = ACELP_CORE; move16(); } + /* sanity check: highest bitrates in ISM */ + test(); test(); - if ( st->is_ism_format && st->tcxonly ) + if ( st->is_ism_format && st->tcxonly && GT_32( st->total_brate, MAX_ACELP_BRATE_ISM ) ) { st->core = TCX_20_CORE; move16(); @@ -573,11 +573,11 @@ void ivas_decision_matrix_enc_fx( *---------------------------------------------------------------------*/ void ivas_signaling_enc_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ - const Word32 element_brate, /* i : element bitrate Q0*/ - const Word16 tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag in TD stereo OR LRTD primary channel Q0*/ - const Word16 tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag in TD stereo Q0*/ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ + const Word32 element_brate, /* i : element bitrate Q0*/ + const Word16 tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag in TD stereo OR LRTD primary channel Q0*/ + const Word16 tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag in TD stereo Q0*/ ) { Word16 ind; diff --git a/lib_enc/ivas_dirac_enc_fx.c b/lib_enc/ivas_dirac_enc_fx.c index db5ee872becb1e0b4b4af63ed17377082f48ccfd..0264a21994e7f06d2d79bece1d4c19210d8d1858 100644 --- a/lib_enc/ivas_dirac_enc_fx.c +++ b/lib_enc/ivas_dirac_enc_fx.c @@ -39,25 +39,23 @@ #include "ivas_prot_fx.h" #include "ivas_cnst.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" #include "wmc_auto.h" + /*------------------------------------------------------------------------- * Local function prototypes *------------------------------------------------------------------------*/ + static void computeIntensityVector_enc_fx( const DIRAC_ENC_HANDLE hDirAC, Word32 Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], Word32 Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], const Word16 enc_param_start_band, /* i : first band to process */ const Word16 num_frequency_bands, - Word32 intensity_real[DIRAC_NUM_DIMS][DIRAC_MAX_NBANDS] -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC - , + Word32 intensity_real[DIRAC_NUM_DIMS][DIRAC_MAX_NBANDS], Word16 q_cldfb, - Word16 q_intensity_real[DIRAC_MAX_NBANDS] -#endif -); + Word16 q_intensity_real[DIRAC_MAX_NBANDS] ); + /*------------------------------------------------------------------------- * ivas_dirac_enc_open() @@ -318,14 +316,15 @@ ivas_error ivas_dirac_enc_fx( DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ - Word32 *data_f_fx[], /* i/o: SBA channels Qx*/ - Word32 **pp_fr_real_fx, /* o : real freq domain values pp_fr_q*/ - Word32 **pp_fr_imag_fx, /* o : imag freq domain values pp_fr_q*/ + Word32 *data_f_fx[], /* i/o: SBA channels Qx*/ + Word32 **pp_fr_real_fx, /* o : real freq domain values pp_fr_q*/ + Word32 **pp_fr_imag_fx, /* o : imag freq domain values pp_fr_q*/ Word16 pp_fr_q, - const Word16 input_frame, /* i : input frame length Q0*/ - const Word16 dtx_vad, /* i : DTX vad flag Q0*/ - const IVAS_FORMAT ivas_format, /* i : ivas format */ - const Word16 hodirac_flag, /* i : hodirac flag Q0*/ + const Word16 input_frame, /* i : input frame length Q0*/ + const Word16 dtx_vad, /* i : DTX vad flag Q0*/ + const IVAS_FORMAT ivas_format, /* i : ivas format */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 hodirac_flag, /* i : hodirac flag Q0*/ const Word16 shift ) { Word16 orig_dirac_bands; @@ -436,7 +435,7 @@ ivas_error ivas_dirac_enc_fx( ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( &avg_dir_fx[0], Q30, &hQMetaData->q_direction[0].band_data[0].azimuth_fx[i], &hQMetaData->q_direction[0].band_data[0].elevation_fx[i] ); - Word32 tmp = dotp_fixed( avg_dir_fx, avg_dir_fx, 3 ); // 2*avg_dir_e + Word32 tmp = dotp_fx32( avg_dir_fx, avg_dir_fx, 3 ); // 2*avg_dir_e Word16 tmp_e = shl( avg_dir_e, 1 ); tmp = Sqrt32( tmp, &tmp_e ); Word16 er_tmp_e = 0; @@ -465,7 +464,7 @@ ivas_error ivas_dirac_enc_fx( push_next_indice( hMetaData, 1, 1 ); /* encode SID parameters */ - ivas_qmetadata_enc_sid_encode_fx( hMetaData, hQMetaData, -1, SBA_FORMAT ); + ivas_qmetadata_enc_sid_encode_fx( hMetaData, hQMetaData, -1, nchan_transport, SBA_FORMAT ); } Word16 len = 0; @@ -536,12 +535,12 @@ ivas_error ivas_dirac_enc_fx( *-------------------------------------------------------------------------*/ static Word16 ivas_dirac_get_mono_flag_fx( - const Word16 *band_grouping, /* i : Band grouping for estimation Q0*/ - Word32 Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Real part of input signal e_Cldfb*/ - Word32 Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Imag part of input signal e_Cldfb*/ - Word16 e_Cldfb, /* i : Exponent of cldfb buffer */ - const Word16 nchan_ana, /* i : number of analysis channels Q0*/ - Word16 *mono_frame_count ) /* i/o: current number of mono frames count Q0*/ + const Word16 *band_grouping, /* i : Band grouping for estimation Q0*/ + Word32 Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Real part of input signal e_Cldfb*/ + Word32 Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : Imag part of input signal e_Cldfb*/ + Word16 e_Cldfb, /* i : Exponent of cldfb buffer */ + const Word16 nchan_ana, /* i : number of analysis channels Q0*/ + Word16 *mono_frame_count ) /* i/o: current number of mono frames count Q0*/ { Word16 brange[2]; Word16 i, j, ch_idx; @@ -664,8 +663,7 @@ static Word16 ivas_dirac_get_mono_flag_fx( move32(); move16(); } - - IF( BASOP_Util_Cmp_Mant32Exp( divide3232( W_band_power, other_ch_band_power ), 31, threshold, threshold_e ) == 0 ) + IF( BASOP_Util_Cmp_Mant32Exp( W_band_power, W_band_power_e, Mpy_32_32( other_ch_band_power, threshold ), other_ch_band_power_e + threshold_e ) == 1 ) { any_mono_band = 1; move16(); @@ -735,9 +733,9 @@ void computeReferencePower_enc_fx_dirac( const Word16 *band_grouping, /* i : Band grouping for estimation */ Word32 Cldfb_RealBuffer[][DIRAC_NO_FB_BANDS_MAX], /* i : Real part of input signal e_Cldfb*/ Word32 Cldfb_ImagBuffer[][DIRAC_NO_FB_BANDS_MAX], /* i : Imag part of input signal e_Cldfb*/ - Word16 e_Cldfb, /* i : exponent of Cldfb buffer */ + Word16 e_Cldfb, /* i : exponent of Cldfb buffer */ Word32 *reference_power, /* o : Estimated power e_reference*/ - Word16 *e_reference, /* o : exponent of reference_power */ + Word16 *e_reference, /* o : exponent of reference_power */ const Word16 enc_param_start_band, /* i : first band to process Q0*/ const Word16 num_freq_bands, /* i : Number of frequency bands Q0*/ const IVAS_FORMAT ivas_format, /* i : ivas_format */ @@ -761,7 +759,6 @@ void computeReferencePower_enc_fx_dirac( *dirac_mono_flag = ivas_dirac_get_mono_flag_fx( band_grouping, Cldfb_RealBuffer, Cldfb_ImagBuffer, e_Cldfb, nchan_ana, mono_frame_count ); /* Q0 */ move16(); } -#ifdef FIX_1127_IMPROVE_SBA_MLD Word16 gb = 0; move16(); FOR( i = 0; i < num_freq_bands; i++ ) @@ -774,7 +771,6 @@ void computeReferencePower_enc_fx_dirac( } e_reference_W = sub( 31, sub( add( shl( sub( 31, e_Cldfb ), 1 ), 1 ), gb ) ); e_reference_temp = e_reference_W; -#endif move16(); FOR( i = 0; i < num_freq_bands; i++ ) { @@ -791,14 +787,8 @@ void computeReferencePower_enc_fx_dirac( FOR( j = brange[0]; j < brange[1]; j++ ) { -#ifdef FIX_1127_IMPROVE_SBA_MLD reference_power_W[i] = W_add( reference_power_W[i], W_shr( W_mult_32_32( Cldfb_RealBuffer[0][j], Cldfb_RealBuffer[0][j] ), gb ) ); /* exp(2 * e_Cldfb) */ reference_power_W[i] = W_add( reference_power_W[i], W_shr( W_mult_32_32( Cldfb_ImagBuffer[0][j], Cldfb_ImagBuffer[0][j] ), gb ) ); /* exp(2 * e_Cldfb) */ -#else - reference_power_W[i] = W_mac_32_32( reference_power_W[i], Cldfb_RealBuffer[0][j], Cldfb_RealBuffer[0][j] ); - reference_power_W[i] = W_mac_32_32( reference_power_W[i], Cldfb_ImagBuffer[0][j], Cldfb_ImagBuffer[0][j] ); - e_reference_W = imult1616( (Word16) 2, e_Cldfb ); -#endif move64(); move64(); } @@ -810,14 +800,8 @@ void computeReferencePower_enc_fx_dirac( /* abs()^2 */ FOR( j = brange[0]; j < brange[1]; j++ ) { -#ifdef FIX_1127_IMPROVE_SBA_MLD reference_power_temp[i] = W_add( reference_power_temp[i], W_shr( W_mult_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), gb ) ); /* exp(2 * e_Cldfb) */ reference_power_temp[i] = W_add( reference_power_temp[i], W_shr( W_mult_32_32( Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ), gb ) ); /* exp(2 * e_Cldfb) */ -#else - reference_power_temp[i] = W_mac_32_32( reference_power_temp[i], Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ); - reference_power_temp[i] = W_mac_32_32( reference_power_temp[i], Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ); - e_reference_temp = imult1616( (Word16) 2, e_Cldfb ); -#endif move64(); move64(); } @@ -867,16 +851,17 @@ void computeReferencePower_enc_fx( Word16 ref_power_w, /* i : use 0 if hodirac is enabled Q0*/ const Word16 nchan_ana, /* i : number of analysis channels Q0*/ Word16 inp_q, /* i : q of cld buffers */ - Word16 *ref_exp /* i : output q */ -) + Word16 q_reference_power[DIRAC_NO_FB_BANDS_MAX] ) { Word16 brange[2]; Word16 ch_idx, i, j; - Word16 ref_Q = 63; - move16(); + Word16 num_bins, guard_bits, norm; Word64 reference_power_tmp[DIRAC_MAX_NBANDS]; Word64 reference_power_W[DIRAC_MAX_NBANDS]; + + Word16 shift_ref_power = sub( shl( inp_q, 1 ), 31 ); + FOR( i = 0; i < num_freq_bands; i++ ) { brange[0] = band_grouping[i + enc_param_start_band]; /* Q0 */ @@ -889,24 +874,28 @@ void computeReferencePower_enc_fx( move64(); reference_power_tmp[i] = 0; move64(); + + num_bins = sub( brange[1], brange[0] ); + guard_bits = find_guarded_bits_fx( num_bins ); + FOR( j = brange[0]; j < brange[1]; j++ ) { - // 2*inp_q + 1 - reference_power_W[i] = W_add( reference_power_W[i], W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[0][j], Cldfb_RealBuffer[0][j] ), Cldfb_ImagBuffer[0][j], Cldfb_ImagBuffer[0][j] ) ); + reference_power_W[i] = W_add( reference_power_W[i], W_shr( W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[0][j], Cldfb_RealBuffer[0][j] ), Cldfb_ImagBuffer[0][j], Cldfb_ImagBuffer[0][j] ), guard_bits ) ); // 2*inp_q + 1 - guard_bits move64(); } - reference_power_tmp[i] = W_add( reference_power_tmp[i], reference_power_W[i] ); // 2*inp_q + 1 + reference_power_tmp[i] = W_add( reference_power_tmp[i], reference_power_W[i] ); // 2*inp_q + 1 - guard_bits move64(); FOR( ch_idx = 1; ch_idx < nchan_ana; ch_idx++ ) { /* abs()^2 */ FOR( j = brange[0]; j < brange[1]; j++ ) { - reference_power_tmp[i] = W_add( reference_power_tmp[i], W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ) ); + reference_power_tmp[i] = W_add( reference_power_tmp[i], W_shr( W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ), guard_bits ) ); // 2*inp_q + 1 - guard_bits move64(); } - // 2*inp_q + 1 } + q_reference_power[i] = sub( shift_ref_power, guard_bits ); + move16(); } FOR( i = 0; i < num_freq_bands; i++ ) { @@ -926,20 +915,21 @@ void computeReferencePower_enc_fx( } } } + FOR( i = 0; i < num_freq_bands; i++ ) { - ref_Q = s_min( ref_Q, W_norm( reference_power_tmp[i] ) ); - } - FOR( i = 0; i < num_freq_bands; i++ ) - { - reference_power_tmp[i] = W_shl( reference_power_tmp[i], ref_Q ); // 2*inp_q + 1 + ref_Q - move64(); - reference_power[i] = W_extract_h( reference_power_tmp[i] ); // 2*inp_q + ref_Q - 31 + norm = 63; + move16(); + IF( reference_power_tmp[i] != 0 ) + { + norm = W_norm( reference_power_tmp[i] ); + } + reference_power[i] = W_extract_h( W_shl( reference_power_tmp[i], norm ) ); // 2 * inp_q + 1 - guard_bits + norm - 32 move32(); + q_reference_power[i] = add( q_reference_power[i], norm ); + move16(); } - *ref_exp = sub( Q31, ( sub( add( shl( inp_q, Q1 ), ref_Q ), Q31 ) ) ); - move16(); return; } /*------------------------------------------------------------------------- @@ -974,11 +964,7 @@ void ivas_dirac_param_est_enc_fx( Word32 *p_Cldfb_ImagBuffer_fx[DIRAC_MAX_ANA_CHANS]; Word16 cldfb_q; Word32 intensity_real_fx[DIRAC_NUM_DIMS][DIRAC_MAX_NBANDS]; -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC Word16 intensity_real_q[DIRAC_MAX_NBANDS]; -#else - Word16 intensity_real_q; -#endif Word32 direction_vector_fx[DIRAC_NUM_DIMS][DIRAC_MAX_NBANDS]; Word16 direction_vector_q; Word32 diffuseness_vector_fx[DIRAC_MAX_NBANDS]; @@ -1008,17 +994,13 @@ void ivas_dirac_param_est_enc_fx( cldfb_q = 0; move16(); -#ifndef NONBE_IMPROVE_DIRAC_INTENSITY_PREC - intensity_real_q = 0; - move16(); -#endif direction_vector_q = 0; move16(); diffuseness_vector_q = 0; move16(); - l_ts = idiv1616( input_frame, MAX_PARAM_SPATIAL_SUBFRAMES ); /* Q0 */ + l_ts = shr( input_frame, MAX_PARAM_SPATIAL_SUBFRAMES_LOG2 ); /* Q0 */ IF( useLowerRes ) { q_direction->cfg.nblocks = 1; @@ -1147,19 +1129,13 @@ void ivas_dirac_param_est_enc_fx( Cldfb_ImagBuffer_fx, hDirAC->hConfig->enc_param_start_band, num_freq_bands, - intensity_real_fx -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC - , + intensity_real_fx, cldfb_q, - intensity_real_q -#endif - ); -#ifndef NONBE_IMPROVE_DIRAC_INTENSITY_PREC - intensity_real_q = sub( shl( cldfb_q, 1 ), 31 ); // 2 * Q_Cldfb + 1 - 32; -#endif + intensity_real_q ); + IF( !hodirac_flag ) { - computeDirectionVectors_fixed( + computeDirectionVectors_fx2( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], @@ -1167,22 +1143,15 @@ void ivas_dirac_param_est_enc_fx( num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], - direction_vector_fx[2] -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC - , - 31, intensity_real_q -#else - , - sub( 31, intensity_real_q ) -#endif - ); + direction_vector_fx[2], + 31, intensity_real_q ); direction_vector_q = Q30; move16(); } /* fill buffers of length "averaging_length" time slots for intensity and energy */ - hDirAC->index_buffer_intensity = add( ( hDirAC->index_buffer_intensity % hDirAC->no_col_avg_diff ), 1 ); /* averaging_length = 32 Q0*/ + hDirAC->index_buffer_intensity = add( ( hDirAC->index_buffer_intensity % hDirAC->no_col_avg_diff ), 1 ); /* averaging_length = 32 Q0*/ move16(); index = hDirAC->index_buffer_intensity; /* Q0 */ move16(); @@ -1190,11 +1159,7 @@ void ivas_dirac_param_est_enc_fx( { /* only real part needed */ Copy32( intensity_real_fx[i], &( hDirAC->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); /* intensity_real_q */ -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC Copy( intensity_real_q, &hDirAC->buffer_intensity_real_q[i][index - 1][0], num_freq_bands ); -#else - set16_fx( &hDirAC->buffer_intensity_real_q[i][index - 1][0], intensity_real_q, num_freq_bands ); -#endif } Copy32( reference_power_fx[ts], &( hDirAC->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); /* exp(reference_power_exp) */ FOR( i = 0; i < num_freq_bands; i++ ) @@ -1406,12 +1371,7 @@ void ivas_dirac_param_est_enc_fx( Scale_sig32( dir_v_fx, 3, -1 ); ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( dir_v_fx, -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC Q29, -#else - - Q30, -#endif &q_direction->band_data[band_m_idx].azimuth_fx[block_m_idx], &q_direction->band_data[band_m_idx].elevation_fx[block_m_idx] ); } @@ -1499,19 +1459,16 @@ void ivas_dirac_param_est_enc_fx( * * *------------------------------------------------------------------------*/ + static void computeIntensityVector_enc_fx( const DIRAC_ENC_HANDLE hDirAC, Word32 Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* q_cldfb */ Word32 Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* q_cldfb */ - const Word16 enc_param_start_band, /* i : first band to process Q0*/ + const Word16 enc_param_start_band, /* i : first band to process Q0*/ const Word16 num_frequency_bands, /* Q0 */ - Word32 intensity_real[DIRAC_NUM_DIMS][DIRAC_MAX_NBANDS] /* q_intensity_real */ -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC - , + Word32 intensity_real[DIRAC_NUM_DIMS][DIRAC_MAX_NBANDS], /* q_intensity_real */ Word16 q_cldfb, - Word16 q_intensity_real[DIRAC_MAX_NBANDS] -#endif -) + Word16 q_intensity_real[DIRAC_MAX_NBANDS] ) { /* Reminder * X = a + ib; Y = c + id @@ -1520,20 +1477,16 @@ static void computeIntensityVector_enc_fx( Word16 i, j; Word32 real, img; Word16 brange[2]; -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC Word16 shift_value = sub( shl( q_cldfb, 1 ), 31 ); -#endif FOR( i = 0; i < num_frequency_bands; i++ ) { brange[0] = hDirAC->band_grouping[i + enc_param_start_band]; /* Q0 */ move16(); brange[1] = hDirAC->band_grouping[i + enc_param_start_band + 1]; /* Q0 */ move16(); -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC Word16 num_bins = sub( brange[1], brange[0] ); Word16 gb = find_guarded_bits_fx( num_bins ); Word16 norm; -#endif intensity_real[0][i] = 0; move32(); intensity_real[1][i] = 0; @@ -1552,7 +1505,6 @@ static void computeIntensityVector_enc_fx( move32(); img = Cldfb_ImagBuffer[0][j]; move32(); -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC Word64 t1, t2, t3; t1 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[3][j], real ), Cldfb_ImagBuffer[3][j], img ); /* 2 * q_cldfb + 1 */ t2 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[1][j], real ), Cldfb_ImagBuffer[1][j], img ); /* 2 * q_cldfb + 1 */ @@ -1564,14 +1516,7 @@ static void computeIntensityVector_enc_fx( tmp_1 = W_add( tmp_1, t1 ); /* 2 * q_cldfb + 1 */ tmp_2 = W_add( tmp_2, t2 ); /* 2 * q_cldfb + 1 */ tmp_3 = W_add( tmp_3, t3 ); /* 2 * q_cldfb + 1 */ -#else - /* Intensity is XYZ order, audio is WYZX order. */ - tmp_1 = W_add( tmp_1, W_add( W_mult_32_32( Cldfb_RealBuffer[3][j], real ), W_mult_32_32( Cldfb_ImagBuffer[3][j], img ) ) ); - tmp_2 = W_add( tmp_2, W_add( W_mult_32_32( Cldfb_RealBuffer[1][j], real ), W_mult_32_32( Cldfb_ImagBuffer[1][j], img ) ) ); - tmp_3 = W_add( tmp_3, W_add( W_mult_32_32( Cldfb_RealBuffer[2][j], real ), W_mult_32_32( Cldfb_ImagBuffer[2][j], img ) ) ); -#endif } -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC norm = 63; move16(); IF( tmp_1 != 0 ) @@ -1593,15 +1538,6 @@ static void computeIntensityVector_enc_fx( intensity_real[2][i] = W_extract_h( W_shl( tmp_3, norm ) ); // shift_value - (gb - norm) q_intensity_real[i] = sub( shift_value, sub( gb, norm ) ); move16(); -#else - - intensity_real[0][i] = W_extract_h( tmp_1 ); // output Q= 2* input_q + 1 - 32 - move32(); - intensity_real[1][i] = W_extract_h( tmp_2 ); // output Q= 2* input_q + 1 - 32 - move32(); - intensity_real[2][i] = W_extract_h( tmp_3 ); // output Q= 2* input_q + 1 - 32 - move32(); -#endif } return; diff --git a/lib_enc/ivas_enc_cov_handler_fx.c b/lib_enc/ivas_enc_cov_handler_fx.c index c05d59b9086289658e59e23ebab2248e3d9118f0..32360fd41724fee407902034120f7dc671a4cab8 100644 --- a/lib_enc/ivas_enc_cov_handler_fx.c +++ b/lib_enc/ivas_enc_cov_handler_fx.c @@ -60,12 +60,12 @@ static void ivas_band_cov_fx( Word32 **ppIn_FR_real, Word32 **ppIn_FR_imag, Word *------------------------------------------------------------------------*/ ivas_error ivas_spar_covar_enc_open_fx( - ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ - ivas_filterbank_t *pFb, /* i/o: FB handle */ - const Word32 input_Fs, /* i : input sampling rate Q0*/ - const Word16 nchan_inp, /* i : number of input channels Q0*/ - const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ - const Word32 ivas_total_brate /* i : IVAS total bitrate Q0*/ + ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const Word32 input_Fs, /* i : input sampling rate Q0*/ + const Word16 nchan_inp, /* i : number of input channels Q0*/ + const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ + const Word32 ivas_total_brate /* i : IVAS total bitrate Q0*/ ) { ivas_enc_cov_handler_state_t *hCovState; @@ -224,7 +224,7 @@ static Word16 ivas_spar_get_activeW_flag_fx( q_shift = Q31; move16(); q_shift = W_norm( bb_var_64bit[ch] ); - bb_var[ch] = W_extract_l( W_shl_nosat( bb_var_64bit[ch], sub( q_shift, 32 ) ) ); /* q_bb_var[ch] + sub( q_shift, 32 ) */ + bb_var[ch] = W_shl_sat_l( bb_var_64bit[ch], sub( q_shift, 32 ) ); /* q_bb_var[ch] + sub( q_shift, 32 ) */ move32(); q_bb_var[ch] = add( q_bb_var[ch], sub( q_shift, 32 ) ); move16(); @@ -271,7 +271,7 @@ static Word16 ivas_spar_get_activeW_flag_fx( } ELSE { - L_tmp = BASOP_Util_Divide3232_Scale_cadence( hCovEnc->bb_var_lt_fx[0], side_ch_var, &exp_diff ); // (Q31 - exp_diff) + L_tmp = BASOP_Util_Divide3232_Scale_newton( hCovEnc->bb_var_lt_fx[0], side_ch_var, &exp_diff ); // (Q31 - exp_diff) en_ratio = L_shl_sat( L_tmp, exp_diff ); // Q31 IF( LT_32( en_ratio, Mpy_32_32( IVAS_SPAR_DYN_ACTIVEW_THRESH_FX, IVAS_SPAR_DYN_ACTIVEW_THRESH_FX ) ) ) // LHS Q31 :: RHS Q31 { @@ -514,6 +514,7 @@ static void ivas_band_cov_fx( Word16 q_shift, q_shift_tmp; Word16 m, start_bin, active_bins; Word16 num_blocks; + Word16 shift_conv, q_shift_cov[IVAS_MAX_NUM_BANDS][IVAS_MAX_NUM_BANDS]; num_blocks = idiv1616( num_bins, stride ); /* Q0 */ FOR( i = 0; i < num_chans; i++ ) @@ -525,17 +526,13 @@ static void ivas_band_cov_fx( move16(); move16(); + q_shift = 31; + move16(); FOR( k = 0; k < num_bins; k++ ) { pV_re_64bit[k] = W_add( W_mult0_32_32( ppIn_FR_real[i1][k], ppIn_FR_real[j1][k] ), W_mult0_32_32( ppIn_FR_imag[i1][k], ppIn_FR_imag[j1][k] ) ); //(q_In_FR[i1], q_In_FR[j1]) -> (q_In_FR[i1] + q_In_FR[j1]) move64(); - } - - q_shift = 31; - move16(); - FOR( k = 0; k < num_bins; k++ ) - { q_shift_tmp = W_norm( pV_re_64bit[k] ); if ( pV_re_64bit[k] != 0 ) { @@ -545,7 +542,7 @@ static void ivas_band_cov_fx( q_shift_tmp = sub( q_shift, 32 ); FOR( k = 0; k < num_bins; k++ ) { - pV_re[k] = W_extract_l( W_shl_nosat( pV_re_64bit[k], q_shift_tmp ) ); //(q_In_FR[i1] + q_In_FR[j1]) + (q_shift - 32) + pV_re[k] = W_shl_sat_l( pV_re_64bit[k], q_shift_tmp ); //(q_In_FR[i1] + q_In_FR[j1]) + (q_shift - 32) move32(); /* perform rounding towards lower value for negative results */ if ( pV_re[k] < 0 ) @@ -554,6 +551,8 @@ static void ivas_band_cov_fx( } } + q_shift_cov[i][j] = Q31; + move16(); FOR( k = start_band; k < end_band; k++ ) { Word64 temp; @@ -575,7 +574,7 @@ static void ivas_band_cov_fx( /* optional: add temporal weight here */ FOR( m = 0; m < active_bins; m++ ) { - temp = W_add( temp, W_mult0_32_32( cov_ptr[m], p_bin_to_band[m] ) ); // ((q_In_FR[i1] + q_In_FR[j1]) + (q_shift - 32), Q22) -> (q_In_FR[i1] + q_In_FR[j1] + (q_shift - 10) + temp = W_mac_32_32( temp, cov_ptr[m], p_bin_to_band[m] ); // ((q_In_FR[i1] + q_In_FR[j1]) + (q_shift - 32), Q22) + 1-> (q_In_FR[i1] + q_In_FR[j1] + (q_shift - 9) } cov_ptr += stride; move16(); @@ -584,8 +583,13 @@ static void ivas_band_cov_fx( cov_real_64bit[i][j][k] = temp * (Word64) ( num_blocks ); // (q_In_FR[i1] + q_In_FR[j1] + (q_shift - 10) - guard_bits move64(); move64(); // conservative estimation of a 64 bit multiplication + shift_conv = W_norm( cov_real_64bit[i][j][k] ); + if ( cov_real_64bit[i][j][k] != 0 ) + { + q_shift_cov[i][j] = s_min( q_shift_cov[i][j], shift_conv ); + } } - q_cov_real[i][j] = add( add( q_In_FR, q_In_FR ), sub( q_shift, Q10 ) ); + q_cov_real[i][j] = add( add( q_In_FR, q_In_FR ), sub( q_shift, Q9 ) ); move16(); } } @@ -594,20 +598,11 @@ static void ivas_band_cov_fx( { FOR( j = i; j < num_chans; j++ ) { - q_shift = 31; - move16(); + q_shift_tmp = sub( q_shift_cov[i][j], 32 ); FOR( k = start_band; k < end_band; k++ ) { - q_shift_tmp = W_norm( cov_real_64bit[i][j][k] ); - if ( cov_real_64bit[i][j][k] != 0 ) - { - q_shift = s_min( q_shift, q_shift_tmp ); - } - } - q_shift_tmp = sub( q_shift, 32 ); - FOR( k = start_band; k < end_band; k++ ) - { - cov_real[i][j][k] = W_extract_l( W_shl_nosat( cov_real_64bit[i][j][k], q_shift_tmp ) ); /* q_cov_real[i][j] + q_shift - 32 */ + + cov_real[i][j][k] = W_shl_sat_l( cov_real_64bit[i][j][k], q_shift_tmp ); /* q_cov_real[i][j] + q_shift - 32 */ move32(); } q_cov_real[i][j] = add( q_cov_real[i][j], q_shift_tmp ); diff --git a/lib_enc/ivas_enc_fx.c b/lib_enc/ivas_enc_fx.c index e8e1bc59e5913762d56f4b6d28accf33176cb34e..34c6c320fcf380d3041a5c8344c9934a95a0e986 100644 --- a/lib_enc/ivas_enc_fx.c +++ b/lib_enc/ivas_enc_fx.c @@ -50,9 +50,9 @@ * Principal IVAS encoder routine *-------------------------------------------------------------------*/ ivas_error ivas_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const Word16 *data, /* i : input signal Q0*/ - const Word16 n_samples /* i : number of input samples Q0*/ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const Word16 *data, /* i : input signal Q0*/ + const Word16 n_samples /* i : number of input samples Q0*/ ) { Word16 i, n, input_frame, n_samples_chan, nchan_inp /*, scale*/; @@ -87,8 +87,7 @@ ivas_error ivas_enc_fx( input_frame = extract_l( Mpy_32_16_1( input_Fs, INV_FRAME_PER_SEC_Q15 ) ); IF( NE_16( nchan_inp, 1 ) ) { - n_samples_chan = div_l( L_deposit_l( n_samples ), nchan_inp ); /* Q0 */ - n_samples_chan = shl( n_samples_chan, 1 ); /* Q0 */ + n_samples_chan = extract_l( Mpy_32_32_r( n_samples, one_by_q_level[nchan_inp] ) ); /* Q0 */ } ELSE { @@ -159,11 +158,11 @@ ivas_error ivas_enc_fx( test(); IF( ( EQ_32( ivas_format, SBA_FORMAT ) ) && !( GT_16( st_ivas->sba_analysis_order, 1 ) ) ) { - hp20_fx_32( data_fx[HOA_keep_ind[st_ivas->hSpar->hMdEnc->HOA_md_ind[i]]], input_frame, st_ivas->mem_hp20_in_fx[i], input_Fs ); + hp20_fx_32_opt( data_fx[HOA_keep_ind[st_ivas->hSpar->hMdEnc->HOA_md_ind[i]]], input_frame, st_ivas->mem_hp20_in_fx[i], input_Fs ); } ELSE IF( !( EQ_32( ivas_format, MC_FORMAT ) && EQ_16( i, LFE_CHANNEL ) ) ) { - hp20_fx_32( data_fx[i], input_frame, st_ivas->mem_hp20_in_fx[i], input_Fs ); + hp20_fx_32_opt( data_fx[i], input_frame, st_ivas->mem_hp20_in_fx[i], input_Fs ); } } @@ -247,8 +246,7 @@ ivas_error ivas_enc_fx( IF( EQ_16( st_ivas->nchan_transport, 2 ) ) { IF( ( error = ivas_masa_encode_fx( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], st_ivas->nchan_transport, ivas_format, ivas_total_brate, hEncoderConfig->Opt_DTX_ON, st_ivas->hCPE[0]->element_mode, - ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != - IVAS_ERR_OK ) + ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -256,8 +254,7 @@ ivas_error ivas_enc_fx( ELSE { IF( ( error = ivas_masa_encode_fx( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], st_ivas->nchan_transport, ivas_format, ivas_total_brate, hEncoderConfig->Opt_DTX_ON, -1, - ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != - IVAS_ERR_OK ) + ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -313,7 +310,7 @@ ivas_error ivas_enc_fx( /* Stereo transport is used also with monoMASA, duplicate mono if monoMASA */ IF( EQ_16( sub( st_ivas->hEncoderConfig->nchan_inp, hEncoderConfig->nchan_ism ), 1 ) ) { - v_multc_fixed( data_fx[hEncoderConfig->nchan_ism], L_deposit_h( INV_SQRT2_FX_Q15 ) /* Q31 */, data_fx[hEncoderConfig->nchan_ism], input_frame ); + v_multc_fx( data_fx[hEncoderConfig->nchan_ism], L_deposit_h( INV_SQRT2_FX_Q15 ) /* Q31 */, data_fx[hEncoderConfig->nchan_ism], input_frame ); Copy32( data_fx[hEncoderConfig->nchan_ism], data_fx[hEncoderConfig->nchan_ism + 1], input_frame ); /* st_ivas->q_data_fx */ } @@ -344,13 +341,22 @@ ivas_error ivas_enc_fx( { norm_data_in = s_min( norm_data_in, L_norm_arr( data_fx[i], input_frame ) ); } - norm_data_in = sub( norm_data_in, 7 ); /*guard bit is 4->to handle overflow in cldfbAnalysis*/ - FOR( i = 0; i < hEncoderConfig->nchan_ism + st_ivas->nchan_transport; i++ ) + IF( LT_16( norm_data_in, 31 ) ) + { + norm_data_in = sub( norm_data_in, 7 ); /*guard bit is 4->to handle overflow in cldfbAnalysis*/ + norm_data_in = s_min( norm_data_in, 20 ); // limit Q to 31 (11 + norm) + FOR( i = 0; i < hEncoderConfig->nchan_ism + st_ivas->nchan_transport; i++ ) + { + scale_sig32( data_fx[i], input_frame, norm_data_in ); /* st_ivas->q_data_fx + norm_data_in */ + } + st_ivas->q_data_fx = add( st_ivas->q_data_fx, norm_data_in ); + move16(); + } + ELSE { - scale_sig32( data_fx[i], input_frame, norm_data_in ); /* st_ivas->q_data_fx + norm_data_in */ + st_ivas->q_data_fx = 31; + move16(); } - st_ivas->q_data_fx = add( st_ivas->q_data_fx, norm_data_in ); - move16(); } /* Estimate MASA parameters for the objects */ @@ -640,8 +646,7 @@ ivas_error ivas_enc_fx( } IF( ( error = ivas_masa_encode_fx( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], st_ivas->nchan_transport, ivas_format, ivas_total_brate, 0, -1, - ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != - IVAS_ERR_OK ) + ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c index b37e618299f706dfe8bbfe83620a447895e1b225..35400f652ca47ba8e9f04a4e195a6af7edad38f1 100644 --- a/lib_enc/ivas_front_vad_fx.c +++ b/lib_enc/ivas_front_vad_fx.c @@ -50,25 +50,25 @@ * Standalone front-VAD module *-----------------------------------------------------------------------------------------*/ ivas_error front_vad_fx( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure, nullable */ - Encoder_State *st, /* i/o: encoder state structure */ - const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ - FRONT_VAD_ENC_HANDLE *hFrontVads, /* i/o: FrontVad handles */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ - const Word16 input_frame, /* i : frame length Q0*/ - Word16 vad_flag_dtx[], /* o : HE-SAD flag with additional DTX HO Q0*/ - Word32 fr_bands_fx[][2 * NB_BANDS], /* o : energy in frequency bands q_fr_bands_fx*/ - Word16 q_fr_bands[], /* o : Q of fr_bands_fx */ - Word16 Etot_LR_fx[], /* o : total energy Left & Right channel Q8*/ - Word32 lf_E_fx[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels q_lf_E*/ - Word16 q_lf_E[], /* o : Q of lf_E_fx */ - Word16 localVAD_HE_SAD[], /* o : HE-SAD flag without hangover, LR channels Q0*/ - Word16 vad_hover_flag[], /* o : VAD hangover flag Q0*/ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure, nullable */ + Encoder_State *st, /* i/o: encoder state structure */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + FRONT_VAD_ENC_HANDLE *hFrontVads, /* i/o: FrontVad handles */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ + const Word16 input_frame, /* i : frame length Q0*/ + Word16 vad_flag_dtx[], /* o : HE-SAD flag with additional DTX HO Q0*/ + Word32 fr_bands_fx[][2 * NB_BANDS], /* o : energy in frequency bands q_fr_bands_fx*/ + Word16 q_fr_bands[], /* o : Q of fr_bands_fx */ + Word16 Etot_LR_fx[], /* o : total energy Left & Right channel Q8*/ + Word32 lf_E_fx[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels q_lf_E*/ + Word16 q_lf_E[], /* o : Q of lf_E_fx */ + Word16 localVAD_HE_SAD[], /* o : HE-SAD flag without hangover, LR channels Q0*/ + Word16 vad_hover_flag[], /* o : VAD hangover flag Q0*/ Word32 band_energies_LR_fx[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN q_band_energies_LR */ - Word16 *q_band_energies_LR, /* o : Q of band_energies_LR_fx */ - Word32 *PS_out_fx, /* o : energy spectrum q_PS_out*/ - Word16 *q_PS_out, /* o : Q of PS_out_fx Q0*/ - Word16 *Bin_E_out_fx, /* o : log-energy spectrum of the current frame Q7*/ + Word16 *q_band_energies_LR, /* o : Q of band_energies_LR_fx */ + Word32 *PS_out_fx, /* o : energy spectrum q_PS_out*/ + Word16 *q_PS_out, /* o : Q of PS_out_fx Q0*/ + Word16 *Bin_E_out_fx, /* o : log-energy spectrum of the current frame Q7*/ Word16 Q_inp, Word16 *Q_buffer, Word16 Q_add, @@ -90,6 +90,7 @@ ivas_error front_vad_fx( ivas_error error; Word16 Q_new; Word16 Qband, mem_decim_size; + Word32 Etot_LR_32fx; error = IVAS_ERR_OK; push_wmops( "front_vad" ); move16(); @@ -202,8 +203,6 @@ ivas_error front_vad_fx( move16(); FOR( n = 0; n < n_chan; n++ ) { - hFrontVads[n]->lp_speech_fx = shr( hFrontVads[n]->lp_speech_fx, 1 ); - move16(); scale_inp = s_min( sts[n]->q_inp, hCPE->hFrontVad[n]->q_mem_decim ); Scale_sig( sts[n]->input_fx, input_frame, sub( scale_inp, sts[n]->q_inp ) ); @@ -240,15 +239,15 @@ ivas_error front_vad_fx( PREEMPH_FX( hFrontVad->buffer_12k8_fx + L_FFT / 2, PREEMPH_FAC, L_FRAME, &hFrontVad->mem_preemph_fx ); - Q_new = add( sub( Q_inp, Qband ), Q_add ); - Scale_sig( hFrontVad->buffer_12k8_fx, L_FFT / 2, sub( Q_new, Q_buffer[n] ) ); /* Q_new */ - Scale_sig( hFrontVad->buffer_12k8_fx + L_FFT / 2, 384 - L_FFT / 2, sub( Q_new, add( Q_inp, Qband ) ) ); /* Q_new */ + Q_new = s_min( add( add( Q_inp, Qband ), Q_add ), Q_buffer[n] ); + scale_sig( hFrontVad->buffer_12k8_fx, L_FFT / 2, sub( Q_new, Q_buffer[n] ) ); /* Q_new */ + scale_sig( hFrontVad->buffer_12k8_fx + L_FFT / 2, 3 * L_FRAME / 2 - L_FFT / 2, sub( Q_new, add( Q_inp, Qband ) ) ); /* Q_new */ Q_buffer[n] = Q_new; move16(); ivas_analy_sp_fx( IVAS_CPE_TD, hCPE, sts[0]->input_Fs, hFrontVad->buffer_12k8_fx + L_FFT / 2 - 3 * ( L_SUBFR / 2 ), Q_new, fr_bands_fx[n], - &q_fr_bands[n], lf_E_fx[n], &q_lf_E[n], &Etot_LR_fx[n], sts[0]->min_band, sts[0]->max_band, Bin_E_fx, &q_Bin_E, Bin_E_old_fx, + &q_fr_bands[n], lf_E_fx[n], &q_lf_E[n], &Etot_LR_32fx, sts[0]->min_band, sts[0]->max_band, Bin_E_fx, &q_Bin_E, Bin_E_old_fx, &q_Bin_E_old, PS_fx, q_PS_out, lgBin_E_fx, band_energies_fx, &q_band_energies, fft_buffLR_fx, &q_fft_buffLR ); if ( n == 0 ) { @@ -275,21 +274,12 @@ ivas_error front_vad_fx( /* add up energies for later calculating average of channel energies */ - Word32 Etot_fx = L_deposit_h( Etot_LR_fx[n] ); /* Q24 */ - - noise_est_pre_32fx( Etot_fx, hFrontVads[0]->ini_frame, hFrontVad->hNoiseEst, 0, 0, 0 ); - - /* wb_vad */ - Word16 scale = s_min( q_fr_bands[n], add( hFrontVads[n]->hNoiseEst->q_enrO, L_norm_arr( hFrontVads[n]->hNoiseEst->enrO_fx, NB_BANDS ) ) ); - - scale_sig32( hFrontVads[n]->hNoiseEst->enrO_fx, NB_BANDS, sub( scale, hFrontVads[n]->hNoiseEst->q_enrO ) ); // scale - hFrontVads[n]->hNoiseEst->q_enrO = scale; - move16(); + noise_est_pre_32fx( Etot_LR_32fx, hFrontVads[0]->ini_frame, hFrontVad->hNoiseEst, 0, 0, 0 ); - scale_sig32( fr_bands_fx[n], 2 * NB_BANDS, sub( scale, q_fr_bands[n] ) ); // scale - q_fr_bands[n] = scale; + Etot_LR_fx[n] = extract_h( Etot_LR_32fx ); move16(); + /* wb_vad */ hFrontVad->hVAD->vad_flag = wb_vad_ivas_fx( sts[n], fr_bands_fx[n], q_fr_bands[n], &dummy, &dummy, &dummy, &snr_sum_he_fx, &localVAD_HE_SAD[n], &dummy_short, hFrontVad->hVAD, hFrontVad->hNoiseEst, hFrontVad->lp_speech_fx, hFrontVad->lp_noise_fx ); // Q0 @@ -314,7 +304,7 @@ ivas_error front_vad_fx( IF( EQ_16( n_chan, CPE_CHANNELS ) ) { /* get average channel energies, adding up was already done, so only need to scale by number of channels */ - v_multc_fixed( &band_energies_LR_fx[0], ONE_IN_Q30 /* 0.5f in Q31 */, &band_energies_LR_fx[0], 2 * NB_BANDS ); + v_multc_fx( &band_energies_LR_fx[0], ONE_IN_Q30 /* 0.5f in Q31 */, &band_energies_LR_fx[0], 2 * NB_BANDS ); /* Logical OR between L and R decisions */ test(); @@ -395,9 +385,9 @@ ivas_error front_vad_create_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VAD\n" ) ); } - wb_vad_init_ivas_fx( hFrontVad->hVAD ); + wb_vad_init_fx( hFrontVad->hVAD ); - hFrontVad->lp_speech_fx = 11520; // Q9/* Initialize the long-term active speech level in dB */ + hFrontVad->lp_speech_fx = 11520; // 45.0f in Q8 /* Initialize the long-term active speech level in dB */ move16(); hFrontVad->lp_noise_fx = 0; /* Initialize the long-term noise level in dB */ move16(); @@ -462,10 +452,10 @@ void front_vad_destroy_fx( * Standalone front-VAD module for SPAR *-----------------------------------------------------------------------------------------*/ ivas_error front_vad_spar_fx( - SPAR_ENC_HANDLE hSpar, /* i/o: SPAR encoder structure */ - const Word32 *omni_in, /* i : omnidirectional input signal Q11*/ - ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ - const Word16 input_frame /* i : input frame length Q0*/ + SPAR_ENC_HANDLE hSpar, /* i/o: SPAR encoder structure */ + const Word32 *omni_in, /* i : omnidirectional input signal Q11*/ + ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ + const Word16 input_frame /* i : input frame length Q0*/ ) { FRONT_VAD_ENC_HANDLE hFrontVad; @@ -500,7 +490,7 @@ ivas_error front_vad_spar_fx( Word16 sp_div_fx; Word16 Q_sp_div; - Word16 non_staX_fx; + Word32 non_staX_fx; Word16 sp_floor; Word16 cor_map_sum_fx; @@ -609,23 +599,13 @@ ivas_error front_vad_spar_fx( Q_inp_12k8 = hFrontVad->q_buffer_12k8; move16(); - scale = s_min( add( q_fr_bands[0], L_norm_arr( fr_bands_fx[0], 2 * NB_BANDS ) ), add( hFrontVad->hNoiseEst->q_bckr, L_norm_arr( hFrontVad->hNoiseEst->bckr_fx, NB_BANDS ) ) ); - scale_sig32( fr_bands_fx[0], 40, sub( scale, q_fr_bands[0] ) ); // scale - scale_sig32( hFrontVad->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, hFrontVad->hNoiseEst->q_bckr ) ); // scale - hFrontVad->hNoiseEst->q_bckr = q_fr_bands[0] = scale; - move16(); - move16(); - - noise_est_down_ivas_fx( fr_bands_fx[0], q_fr_bands[0], hFrontVad->hNoiseEst->bckr_fx, tmpN_fx, tmpE_fx, st->min_band, st->max_band, - &hFrontVad->hNoiseEst->totalNoise_fx, Etot_fx[0], &hFrontVad->hNoiseEst->Etot_last_fx, &hFrontVad->hNoiseEst->Etot_v_h2_fx ); + Word16 q_tmpN, q_tmpE; + noise_est_down_ivas_fx( fr_bands_fx[0], q_fr_bands[0], hFrontVad->hNoiseEst->bckr_fx, &hFrontVad->hNoiseEst->q_bckr, tmpN_fx, &q_tmpN, tmpE_fx, &q_tmpE, st->min_band, st->max_band, + &hFrontVad->hNoiseEst->totalNoise_32fx, L_deposit_h( Etot_fx[0] ) /*q8->q24*/, &hFrontVad->hNoiseEst->Etot_last_32fx, &hFrontVad->hNoiseEst->Etot_v_h2_32fx ); - corr_shift_fx = correlation_shift_fx( hFrontVad->hNoiseEst->totalNoise_fx ); /* Q15 */ + corr_shift_fx = correlation_shift_fx( extract_h( hFrontVad->hNoiseEst->totalNoise_32fx ) ); /* Q15 */ -#ifdef NONBE_1211_DTX_BR_SWITCHING dtx_ivas_fx( st, hEncoderConfig->last_ivas_total_brate, hEncoderConfig->ivas_total_brate, vad_flag_dtx[0], inp_12k8_fx, Q_inp_12k8 ); -#else - dtx_ivas_fx( st, hEncoderConfig->ivas_total_brate, vad_flag_dtx[0], inp_12k8_fx, Q_inp_12k8 ); -#endif /* linear prediction analysis */ alw_pitch_lag_12k8[0] = st->old_pitch_la; /* Q0 */ @@ -647,14 +627,15 @@ ivas_error front_vad_spar_fx( hFrontVad->q_buffer_12k8 = Q_inp_12k8; move16(); - analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_LOOK_12k8, &res_energy_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, 0 /* <-- sec_chan_low_rate */, Q_inp_12k8, Q_r ); + analy_lp_fx( inp_12k8_fx, L_FRAME, L_LOOK_12k8, &res_energy_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, st->element_mode, 0, Q_inp_12k8, Q_r ); + FOR( Word16 i = 0; i <= M; i++ ) { epsP_fx[i] = L_Comp( epsP_h[i], epsP_l[i] ); // Q_r[0] move32(); } - relE_fx = sub( Etot_fx[0], st->lp_speech_fx ); + relE_fx = sub( Etot_fx[0], extract_h( st->lp_speech_32fx ) ); Scale_sig( A_fx, ( L_FRAME / L_SUBFR ) * ( M + 1 ), -2 ); // Q12 st->mem_wsp_fx = (Word16) shl_sat( st->mem_wsp_fx, Q_inp_12k8 - st->mem_wsp_q ); /* Q_inp_12k8 */ @@ -670,14 +651,45 @@ ivas_error front_vad_spar_fx( old_pitch = st->pitch[1]; move16(); - Scale_sig( wsp_fx, 368, sub( Q8, Q_inp_12k8 ) ); // Q8 - pitch_ol_ivas_fx( st->pitch, st->voicing_fx, &st->old_pitch, &st->old_corr_fx, corr_shift_fx, &st->old_thres_fx, &st->delta_pit, st->old_wsp2_fx, wsp_fx, st->mem_decim2_fx, relE_fx, st->clas, st->input_bwidth, st->Opt_SC_VBR, Q8 ); + Word16 shift, Q_wsp; + Word16 shift1 = norm_arr( old_wsp_fx, L_WSP_MEM ); + Word16 shift2 = norm_arr( wsp_fx, L_WSP - L_WSP_MEM ); + maximum_abs_16_fx( old_wsp_fx, L_WSP_MEM, &shift ); + if ( !shift ) + { + shift1 = Q15; + move16(); + } + maximum_abs_16_fx( wsp_fx, L_WSP - L_WSP_MEM, &shift ); + if ( !shift ) + { + shift2 = Q15; + move16(); + } + + shift = s_min( Q15, s_min( add( Q_inp_12k8, shift1 ), add( Q_inp_12k8, shift2 ) ) ); + shift = s_min( shift, add( norm_arr( st->mem_decim2_fx, 3 ), st->Q_old_wsp2 ) ); + shift = s_min( shift, add( norm_arr( st->old_wsp2_fx, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ), st->Q_old_wsp2 ) ); + + scale_sig( old_wsp_fx, L_WSP_MEM, sub( shift, Q_inp_12k8 ) ); + scale_sig( wsp_fx, L_WSP - L_WSP_MEM, sub( shift, Q_inp_12k8 ) ); + + Q_wsp = shift; + move16(); + + scale_sig( st->mem_decim2_fx, 3, sub( Q_wsp, st->Q_old_wsp2 ) ); // Q( mem_decim ) = Q( old_wsp2 ) + scale_sig( st->old_wsp2_fx, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM, sub( Q_wsp, st->Q_old_wsp2 ) ); // Q_wsp + + st->Q_old_wsp2 = Q_wsp; + move16(); + + pitch_ol_ivas_fx( st->pitch, st->voicing_fx, &st->old_pitch, &st->old_corr_fx, corr_shift_fx, &st->old_thres_fx, &st->delta_pit, st->old_wsp2_fx, wsp_fx, st->mem_decim2_fx, relE_fx, st->clas, st->input_bwidth, st->Opt_SC_VBR, Q_wsp ); /* Updates for adaptive lag window memory */ st->old_pitch_la = st->pitch[2]; /* Q0 */ move16(); - Scale_sig( wsp_fx, 368, Q9 - Q8 ); /* Q9 */ - StableHighPitchDetect_ivas_fx( &flag_spitch, st->pitch, st->voicing_fx, wsp_fx, st->localVAD, &st->voicing_sm_fx, &st->voicing0_sm_fx, &st->LF_EnergyRatio_sm_fx, &st->predecision_flag, &st->diff_sm_fx, &st->energy_sm_fx, Q12, st->lgBin_E_fx ); + + StableHighPitchDetect_ivas_fx( &flag_spitch, st->pitch, st->voicing_fx, wsp_fx, st->localVAD, &st->voicing_sm_fx, &st->voicing0_sm_fx, &st->LF_EnergyRatio_sm_fx, &st->predecision_flag, &st->diff_sm_fx, &st->energy_sm_fx, Q_wsp, st->lgBin_E_fx ); IF( st->hSpMusClas != NULL ) { Word16 dummy_int; @@ -700,21 +712,14 @@ ivas_error front_vad_spar_fx( Scale_sig32( epsP_fx, M + 1, scale ); // Q_esp scale = add( hFrontVad->hNoiseEst->ave_enr_q, s_min( L_norm_arr( hFrontVad->hNoiseEst->ave_enr_fx, NB_BANDS ), L_norm_arr( hFrontVad->hNoiseEst->ave_enr2_fx, NB_BANDS ) ) ); - scale = s_min( scale, add( hFrontVad->hNoiseEst->q_bckr, L_norm_arr( tmpE_fx, NB_BANDS ) ) ); + scale = s_min( scale, add( q_tmpE, L_norm_arr( tmpE_fx, NB_BANDS ) ) ); scale = sub( s_min( scale, Q31 ), 1 ); scale_sig32( hFrontVad->hNoiseEst->ave_enr_fx, NB_BANDS, sub( scale, hFrontVad->hNoiseEst->ave_enr_q ) ); scale_sig32( hFrontVad->hNoiseEst->ave_enr2_fx, NB_BANDS, sub( scale, hFrontVad->hNoiseEst->ave_enr_q ) ); - scale_sig32( tmpE_fx, NB_BANDS, sub( scale, hFrontVad->hNoiseEst->q_bckr ) ); + scale_sig32( tmpE_fx, NB_BANDS, sub( scale, q_tmpE ) ); hFrontVad->hNoiseEst->ave_enr_q = scale; move16(); - scale = add( hFrontVad->hNoiseEst->q_bckr, s_min( L_norm_arr( hFrontVad->hNoiseEst->bckr_fx, NB_BANDS ), L_norm_arr( tmpN_fx, NB_BANDS ) ) ); - scale = sub( s_min( Q31, scale ), 1 ); // guard bits - scale_sig32( hFrontVad->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, hFrontVad->hNoiseEst->q_bckr ) ); - scale_sig32( tmpN_fx, NB_BANDS, sub( scale, hFrontVad->hNoiseEst->q_bckr ) ); - hFrontVad->hNoiseEst->q_bckr = scale; - move16(); - scale = add( hFrontVad->hNoiseEst->fr_bands_fx_q, s_min( L_norm_arr( hFrontVad->hNoiseEst->fr_bands1_fx, NB_BANDS ), L_norm_arr( hFrontVad->hNoiseEst->fr_bands2_fx, NB_BANDS ) ) ); scale = s_min( scale, add( q_fr_bands[0], L_norm_arr( fr_bands_fx[0], 2 * NB_BANDS ) ) ); scale = s_min( Q31, scale ); @@ -725,9 +730,9 @@ ivas_error front_vad_spar_fx( move16(); move16(); - noise_est_ivas_fx( st, old_pitch, tmpN_fx, epsP_fx, Etot_fx[0], sub( Etot_fx[0], hFrontVad->lp_speech_fx ), corr_shift_fx, tmpE_fx, + noise_est_ivas_fx( st, old_pitch, tmpN_fx, q_tmpN, epsP_fx, Etot_fx[0], sub( Etot_fx[0], hFrontVad->lp_speech_fx ), corr_shift_fx, tmpE_fx, hFrontVad->hNoiseEst->ave_enr_q, fr_bands_fx[0], q_fr_bands[0], &cor_map_sum_fx, NULL, &sp_div_fx, &Q_sp_div, &non_staX_fx, &loc_harm, - lf_E_fx[0], q_lf_E[0], &hFrontVad->hNoiseEst->harm_cor_cnt, hFrontVad->hNoiseEst->Etot_l_lp_fx, hFrontVad->hNoiseEst->Etot_v_h2_fx, + lf_E_fx[0], q_lf_E[0], &hFrontVad->hNoiseEst->harm_cor_cnt, extract_h( hFrontVad->hNoiseEst->Etot_l_lp_32fx ), hFrontVad->hNoiseEst->Etot_v_h2_32fx, &hFrontVad->hNoiseEst->bg_cnt, st->lgBin_E_fx, &sp_floor, S_map_fx, NULL, hFrontVad, hFrontVad->ini_frame ); MVR2R_WORD16( st->pitch, st->pitch, 3 ); @@ -735,16 +740,15 @@ ivas_error front_vad_spar_fx( /* 1st stage speech/music classification (GMM model) */ /* run only to get 'high_lpn_flag' parameter */ SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; - Word16 non_sta_fx = shr( non_staX_fx, Q2 ); // Q8->Q6 Word16 Etot_fx_0 = Etot_fx[0]; move16(); scale = getScaleFactor32( PS_fx, 128 ); Qfact_PS = add( Qfact_PS, scale ); Scale_sig32( PS_fx, 128, scale ); - ivas_smc_gmm_fx( st, NULL, localVAD_HE_SAD[0], Etot_fx_0, lsp_new_fx, cor_map_sum_fx, epsP_fx, PS_fx, non_sta_fx, relE_fx, &high_lpn_flag, flag_spitch, Qfact_PS, Q_esp, hSpMusClas->past_PS_Q ); + ivas_smc_gmm_fx( st, NULL, localVAD_HE_SAD[0], Etot_fx_0, lsp_new_fx, cor_map_sum_fx, epsP_fx, PS_fx, non_staX_fx, relE_fx, &high_lpn_flag, flag_spitch, Qfact_PS, Q_esp, hSpMusClas->past_PS_Q ); /* long-term energy update */ - ivas_long_enr_fx( st, -1, localVAD_HE_SAD[0], high_lpn_flag, &hFrontVad, 1, localVAD_HE_SAD, Etot_fx ); + ivas_long_enr_fx( st, -256 /*-1 q8*/, localVAD_HE_SAD[0], high_lpn_flag, &hFrontVad, 1, localVAD_HE_SAD, Etot_fx ); /* increase ini_frame counter */ hFrontVad->ini_frame = s_min( add( hFrontVad->ini_frame, 1 ), MAX_FRAME_COUNTER ); /* Q0 */ @@ -754,7 +758,8 @@ ivas_error front_vad_spar_fx( move16(); hSpar->front_vad_dtx_flag = 1; move16(); - if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) + test(); + if ( EQ_32( st->core_brate, SID_2k40 ) || st->core_brate == FRAME_NO_DATA ) { hSpar->front_vad_dtx_flag = 0; move16(); diff --git a/lib_enc/ivas_init_enc_fx.c b/lib_enc/ivas_init_enc_fx.c index 57858b03ebb2b017899ab8a57e690e0b0be2cc36..ce623be9c2a0c8fdb10304258f34001ae9fc22ff 100644 --- a/lib_enc/ivas_init_enc_fx.c +++ b/lib_enc/ivas_init_enc_fx.c @@ -41,6 +41,9 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #include "prot_fx_enc.h" +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) +#include +#endif /*-------------------------------------------------------------------* @@ -141,6 +144,7 @@ void ivas_write_format_fx( return; } + /*-------------------------------------------------------------------* * ivas_write_format_sid() * @@ -150,7 +154,9 @@ void ivas_write_format_fx( void ivas_write_format_sid_fx( const IVAS_FORMAT ivas_format, /* i : IVAS format */ const Word16 element_mode, /* i : element bitrate Q0*/ - BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word16 sba_planar /* i : SBA planar flag */ ) { Word16 ind = 0; /* to avoid compilation warning */ @@ -178,10 +184,6 @@ void ivas_write_format_sid_fx( ind = SID_ISM; move16(); BREAK; - case MC_FORMAT: - ind = SID_MULTICHANNEL; - move16(); - BREAK; case SBA_FORMAT: SWITCH( element_mode ) { @@ -217,9 +219,19 @@ void ivas_write_format_sid_fx( push_indice( hBstr, IND_IVAS_FORMAT, ind, SID_FORMAT_NBITS ); + IF( EQ_32( ivas_format, SBA_FORMAT ) ) + { + /* Write SBA planar flag */ + push_indice( hBstr, IND_SMODE, sba_planar, SBA_PLANAR_BITS ); + + /* Write SBA order */ + push_indice( hBstr, IND_SMODE, sba_order, SBA_ORDER_BITS ); + } + return; } + /*-------------------------------------------------------------------* * getNumChanAnalysis() * @@ -270,57 +282,7 @@ Word16 getNumChanAnalysis_fx( return n; } -/*-------------------------------------------------------------------* - * copy_encoder_config_ivas_fx() - * - * Copy configuration structrue to the state structrure - *-------------------------------------------------------------------*/ - -void copy_encoder_config_ivas_fx( - Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ - Encoder_State *st, /* o : encoder state structure */ - const Word16 flag_all /* i : flag 1==update all, 0=partial update Q0*/ -) -{ - IF( flag_all ) - { - st->input_Fs = st_ivas->hEncoderConfig->input_Fs; /* Q0 */ - move32(); - - st->last_codec_mode = st_ivas->last_codec_mode; /* Q0 */ - move16(); - st->last_total_brate = st_ivas->hEncoderConfig->last_ivas_total_brate; /* Q0 */ - move32(); - - st->Opt_DTX_ON = st_ivas->hEncoderConfig->Opt_DTX_ON; /* Q0 */ - move16(); - - st->last_Opt_SC_VBR = st_ivas->hEncoderConfig->last_Opt_SC_VBR; /* Q0 */ - move16(); - } - - st->Opt_AMR_WB = st_ivas->hEncoderConfig->Opt_AMR_WB; /* Q0 */ - st->Opt_SC_VBR = st_ivas->hEncoderConfig->Opt_SC_VBR; /* Q0 */ - move16(); - move16(); - - st->codec_mode = st_ivas->codec_mode; /* Q0 */ - st->max_bwidth = st_ivas->hEncoderConfig->max_bwidth; /* Q0 */ - move16(); - move16(); - - st->Opt_RF_ON = st_ivas->hEncoderConfig->Opt_RF_ON; /* Q0 */ - st->rf_fec_offset = st_ivas->hEncoderConfig->rf_fec_offset; /* Q0 */ - st->rf_fec_indicator = st_ivas->hEncoderConfig->rf_fec_indicator; /* Q0 */ - move16(); - move16(); - move16(); - - st->element_mode = st_ivas->hEncoderConfig->element_mode_init; /* Q0 */ - move16(); - return; -} /*-------------------------------------------------------------------* * copy_encoder_config_fx() * @@ -328,9 +290,9 @@ void copy_encoder_config_ivas_fx( *-------------------------------------------------------------------*/ void copy_encoder_config_fx( - Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ - Encoder_State *st_fx, /* o : encoder state structure */ - const Word16 flag_all /* i : flag 1==update all, 0=partial update Q0*/ + Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ + Encoder_State *st_fx, /* o : encoder state structure */ + const Word16 flag_all /* i : flag 1==update all, 0=partial update Q0*/ ) { IF( flag_all ) @@ -373,13 +335,13 @@ void copy_encoder_config_fx( st_fx->force_dir = st_ivas->hEncoderConfig->force_dir; #endif #endif - st_fx->element_mode = st_ivas->hEncoderConfig->element_mode_init; /* Q0 */ move16(); return; } + /*------------------------------------------------------------------------- * ivas_initialize_handles_enc_fx() * @@ -464,7 +426,7 @@ void ivas_initialize_handles_enc_fx( * Initialize IVAS encoder state structure *-------------------------------------------------------------------*/ -ivas_error ivas_init_encoder( +ivas_error ivas_init_encoder_fx( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) { @@ -476,53 +438,55 @@ ivas_error ivas_init_encoder( Word32 element_brate_tmp[MAX_NUM_OBJECTS]; ENCODER_CONFIG_HANDLE hEncoderConfig; ivas_error error; + Word32 tmp_br, tmp32; error = IVAS_ERR_OK; + move32(); hEncoderConfig = st_ivas->hEncoderConfig; ivas_format = hEncoderConfig->ivas_format; - input_Fs = hEncoderConfig->input_Fs; /* Q0 */ - ivas_total_brate = hEncoderConfig->ivas_total_brate; /* Q0 */ move32(); + input_Fs = hEncoderConfig->input_Fs; /* Q0 */ + move32(); + ivas_total_brate = hEncoderConfig->ivas_total_brate; /* Q0 */ move32(); hEncoderConfig->last_ivas_total_brate = ivas_total_brate; /* Q0 */ move32(); - if ( NE_32( ivas_format, MONO_FORMAT ) ) + if ( NE_16( ivas_format, MONO_FORMAT ) ) { /* In IVAS, ensure that minimum coded bandwidth is WB */ hEncoderConfig->max_bwidth = s_max( hEncoderConfig->max_bwidth, WB ); /* Q0 */ move16(); } st_ivas->ism_mode = ISM_MODE_NONE; - st_ivas->mc_mode = MC_MODE_NONE; move32(); + st_ivas->mc_mode = MC_MODE_NONE; move32(); st_ivas->nchan_transport = -1; move16(); /*-----------------------------------------------------------------* - * Allocate floating-point input audio buffers + * Allocate input audio buffers *-----------------------------------------------------------------*/ nchan_inp_buff = hEncoderConfig->nchan_inp; /* Q0 */ move16(); - - IF( EQ_32( ivas_format, MONO_FORMAT ) ) + IF( EQ_16( ivas_format, MONO_FORMAT ) ) { nchan_inp_buff = 0; move16(); } - ELSE IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) ) + ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { - if ( EQ_32( sub( hEncoderConfig->nchan_inp, hEncoderConfig->nchan_ism ), 1 ) ) /* mono is duplicated in monoMASA */ + IF( EQ_16( sub( hEncoderConfig->nchan_inp, hEncoderConfig->nchan_ism ), 1 ) ) /* mono is duplicated in monoMASA */ { - nchan_inp_buff = add( nchan_inp_buff, 1 ); + nchan_inp_buff = add( nchan_inp_buff, 1 ); /* Q0 */ } - nchan_inp_buff = add( nchan_inp_buff, 1 ); /* for *data_separated_object */ + nchan_inp_buff = add( nchan_inp_buff, 1 ); /* for *data_separated_object Q0*/ } FOR( n = 0; n < nchan_inp_buff; n++ ) @@ -530,7 +494,7 @@ ivas_error ivas_init_encoder( /* note: these are intra-frame heap memories */ IF( ( st_ivas->p_data_fx[n] = (Word32 *) malloc( Mpy_32_16_1( input_Fs, INV_FRAME_PER_SEC_Q15 ) * sizeof( Word32 ) ) ) == NULL ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point input audio buffer!\n" ) ); + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for input audio buffer!\n" ) ); } set32_fx( st_ivas->p_data_fx[n], 0, extract_l( Mpy_32_16_1( input_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); } @@ -540,6 +504,8 @@ ivas_error ivas_init_encoder( { st_ivas->p_data_fx[n] = NULL; } + + /*-----------------------------------------------------------------* * Allocate and initialize buffer of indices *-----------------------------------------------------------------*/ @@ -555,16 +521,22 @@ ivas_error ivas_init_encoder( } /* reset the list of indices */ - for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) + FOR( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) { st_ivas->ind_list[i].nb_bits = -1; move16(); } +#ifdef BITSTERAM_ANALYSIS + for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) + { + memset( st_ivas->ind_list[i].function_name, 'A', 100 * sizeof( char ) ); + } +#endif + /* set the maximum allowed number of metadata indices in the list */ st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata_fx( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); /* Q0 */ move16(); - /* allocate buffer of metadata indices */ IF( st_ivas->ivas_max_num_indices_metadata > 0 ) { @@ -574,7 +546,7 @@ ivas_error ivas_init_encoder( } /* reset the list of metadata indices */ - for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) + FOR( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) { st_ivas->ind_list_metadata[i].nb_bits = -1; move16(); @@ -601,19 +573,9 @@ ivas_error ivas_init_encoder( move16(); test(); - IF( st_ivas->hEncoderConfig->element_mode_init != EVS_MONO ) - { - IF( ( error = create_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE + IF( NE_32( ( error = create_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) { - IF( NE_32( ( error = create_evs_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } + return error; } /* prepare stereo downmix for EVS */ @@ -628,12 +590,12 @@ ivas_error ivas_init_encoder( ELSE IF( EQ_32( ivas_format, STEREO_FORMAT ) ) { st_ivas->nSCE = 0; - st_ivas->nCPE = 1; /* in stereo, there is always only one CPE */ - st_ivas->nchan_transport = CPE_CHANNELS; - cpe_id = 0; move16(); + st_ivas->nCPE = 1; /* in stereo, there is always only one CPE */ move16(); + st_ivas->nchan_transport = CPE_CHANNELS; move16(); + cpe_id = 0; move16(); IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, ivas_total_brate ) ) != IVAS_ERR_OK ) @@ -643,7 +605,8 @@ ivas_error ivas_init_encoder( } ELSE IF( EQ_32( ivas_format, ISM_FORMAT ) ) { - st_ivas->ism_mode = ivas_ism_mode_select( hEncoderConfig->nchan_inp, ivas_total_brate ); + st_ivas->ism_mode = ivas_ism_mode_select( hEncoderConfig->nchan_inp, ivas_total_brate ); /* Q0 */ + move32(); IF( ( error = ivas_ism_metadata_enc_create_fx( st_ivas, hEncoderConfig->nchan_inp, element_brate_tmp ) ) != IVAS_ERR_OK ) { @@ -690,7 +653,6 @@ ivas_error ivas_init_encoder( { return error; } - IF( ( error = ivas_dirac_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { return error; @@ -707,25 +669,27 @@ ivas_error ivas_init_encoder( } } + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &tmp_br, &tmp32, 0 ); FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { - IF( ( error = create_sce_enc_fx( st_ivas, sce_id, ivas_total_brate / st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + IF( ( error = create_sce_enc_fx( st_ivas, sce_id, tmp_br ) ) != IVAS_ERR_OK ) { return error; } - if ( EQ_32( ivas_format, SBA_FORMAT ) && st_ivas->hEncoderConfig->Opt_DTX_ON ) + test(); + IF( EQ_16( ivas_format, SBA_FORMAT ) && st_ivas->hEncoderConfig->Opt_DTX_ON ) { st_ivas->hSCE[sce_id]->hCoreCoder[0]->dtx_sce_sba = 1; move16(); } } + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &tmp_br, &tmp32, 0 ); + tmp_br = L_shl( tmp_br, CPE_CHANNELS_LOG2 ); FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, imult3216( res_dec, CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) + IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, tmp_br ) ) != IVAS_ERR_OK ) { return error; } @@ -748,7 +712,7 @@ ivas_error ivas_init_encoder( } } } - ELSE IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) ) + ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { Word32 ism_total_brate; Word16 k; @@ -765,7 +729,8 @@ ivas_error ivas_init_encoder( k = 0; move16(); - while ( k < SIZE_IVAS_BRATE_TBL && NE_32( ivas_total_brate, ivas_brate_tbl[k] ) ) + test(); + WHILE( LT_16( k, SIZE_IVAS_BRATE_TBL ) && NE_32( ivas_total_brate, ivas_brate_tbl[k] ) ) { k++; } @@ -774,7 +739,7 @@ ivas_error ivas_init_encoder( move32(); FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { - ism_total_brate = L_add( ism_total_brate, sep_object_brate[k - 2][st_ivas->nSCE - 1] ); + ism_total_brate = L_add( ism_total_brate, sep_object_brate[k - 2][st_ivas->nSCE - 1] ); /* Q0 */ IF( ( error = create_sce_enc_fx( st_ivas, sce_id, sep_object_brate[k - 2][st_ivas->nSCE - 1] ) ) != IVAS_ERR_OK ) { return error; @@ -785,6 +750,7 @@ ivas_error ivas_init_encoder( { return error; } + IF( ( error = ivas_masa_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { return error; @@ -798,12 +764,12 @@ ivas_error ivas_init_encoder( } } - if ( GE_32( L_sub( ivas_total_brate, ism_total_brate ), MIN_BRATE_MDCT_STEREO ) ) + IF( GE_32( L_sub( ivas_total_brate, ism_total_brate ), MIN_BRATE_MDCT_STEREO ) ) { st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; move16(); } - else + ELSE { st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_DFT; move16(); @@ -816,12 +782,7 @@ ivas_error ivas_init_encoder( } ELSE IF( EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { - st_ivas->ism_mode = ISM_MODE_NONE; - - if ( GE_32( ivas_total_brate, IVAS_256k ) ) - { - st_ivas->ism_mode = ISM_SBA_MODE_DISC; - } + st_ivas->ism_mode = ivas_osba_ism_mode_select( ivas_total_brate, st_ivas->hEncoderConfig->nchan_ism ); IF( ( error = ivas_ism_metadata_enc_create_fx( st_ivas, hEncoderConfig->nchan_ism, element_brate_tmp ) ) != IVAS_ERR_OK ) { @@ -834,8 +795,7 @@ ivas_error ivas_init_encoder( return error; } - st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->hEncoderConfig->sba_order ); - move16(); + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->hEncoderConfig->sba_order ); /* Q0 */ IF( ( error = ivas_spar_enc_open_fx( st_ivas, 0 ) ) != IVAS_ERR_OK ) { @@ -858,11 +818,11 @@ ivas_error ivas_init_encoder( } } + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &tmp_br, &tmp32, 0 ); + tmp_br = L_shl( tmp_br, CPE_CHANNELS_LOG2 ); FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, imult3216( res_dec, CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) + IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, tmp_br ) ) != IVAS_ERR_OK ) { return error; } @@ -879,13 +839,14 @@ ivas_error ivas_init_encoder( ELSE { /* allocate and initialize MCT core coder */ - st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->hEncoderConfig->nchan_ism, 1 ), 1 ) ); + Word16 n_all = add( st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_ism ); + st_ivas->nCPE = shr_r( n_all, 1 ); + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &tmp_br, &tmp32, 0 ); + tmp_br = L_shl( tmp_br, CPE_CHANNELS_LOG2 ); FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, imult3216( res_dec, CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) + IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, tmp_br ) ) != IVAS_ERR_OK ) { return error; } @@ -896,6 +857,7 @@ ivas_error ivas_init_encoder( return error; } } + IF( ( error = ivas_osba_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { return error; @@ -904,8 +866,9 @@ ivas_error ivas_init_encoder( ELSE IF( EQ_32( ivas_format, MC_FORMAT ) ) { st_ivas->mc_mode = ivas_mc_mode_select_fx( hEncoderConfig->mc_input_setup, ivas_total_brate ); /* Q0 */ + move32(); - IF( ( error = ivas_create_lfe_lpf_enc_fx( &st_ivas->hLfeLpf, hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_create_lfe_lpf_enc_fx( &st_ivas->hLfeLpf, input_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -913,15 +876,15 @@ ivas_error ivas_init_encoder( IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) { st_ivas->nSCE = 0; - st_ivas->nCPE = idiv1616( hEncoderConfig->nchan_inp, CPE_CHANNELS ); /* Q0 */ move16(); + st_ivas->nCPE = shr( hEncoderConfig->nchan_inp, CPE_CHANNELS_LOG2 ); /* Q0 */ move16(); + iDiv_and_mod_32( ivas_total_brate, sub( hEncoderConfig->nchan_inp, 1 ), &tmp_br, &tmp32, 0 ); + tmp_br = L_shl( tmp_br, CPE_CHANNELS_LOG2 ); FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, sub( hEncoderConfig->nchan_inp, 1 ), &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, imult3216( res_dec, CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) + IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, tmp_br ) ) != IVAS_ERR_OK ) { return error; } @@ -943,10 +906,10 @@ ivas_error ivas_init_encoder( ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) { st_ivas->nSCE = 0; - st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2; - st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; move16(); + st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS >> 1; move16(); + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; move16(); IF( ( error = ivas_mc_paramupmix_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) @@ -954,11 +917,10 @@ ivas_error ivas_init_encoder( return error; } + iDiv_and_mod_32( ivas_total_brate, st_ivas->nCPE, &tmp_br, &tmp32, 0 ); FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nCPE, &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, res_dec ) ) != IVAS_ERR_OK ) + IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, tmp_br ) ) != IVAS_ERR_OK ) { return error; } @@ -981,11 +943,10 @@ ivas_error ivas_init_encoder( return error; } + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nCPE, st_ivas->nSCE ), &tmp_br, &tmp32, 0 ); FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nCPE, st_ivas->nSCE ), &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, res_dec ) ) != IVAS_ERR_OK ) + IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, tmp_br ) ) != IVAS_ERR_OK ) { return error; } @@ -1014,6 +975,7 @@ ivas_error ivas_init_encoder( { return error; } + IF( ( error = ivas_mcmasa_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { return error; @@ -1031,7 +993,7 @@ ivas_error ivas_init_encoder( FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; /* Q0 */ move16(); IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, brate_cpe ) ) != IVAS_ERR_OK ) @@ -1071,873 +1033,105 @@ ivas_error ivas_init_encoder( set32_fx( st_ivas->mem_hp20_in_fx[i], 0, L_HP20_MEM + 2 ); } + return error; } -ivas_error ivas_init_encoder_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -) -{ - Word16 i, n; - Word16 nchan_inp_buff; - Word16 sce_id, cpe_id; - IVAS_FORMAT ivas_format; - Word32 input_Fs, ivas_total_brate; - Word32 element_brate_tmp[MAX_NUM_OBJECTS]; - ENCODER_CONFIG_HANDLE hEncoderConfig; - ivas_error error; - error = IVAS_ERR_OK; - move32(); - hEncoderConfig = st_ivas->hEncoderConfig; - ivas_format = hEncoderConfig->ivas_format; - move32(); - input_Fs = hEncoderConfig->input_Fs; /* Q0 */ - move32(); - ivas_total_brate = hEncoderConfig->ivas_total_brate; /* Q0 */ - move32(); +/*------------------------------------------------------------------------- + * destroy_core_enc() + * + * Close core encoder handles + *-------------------------------------------------------------------------*/ - hEncoderConfig->last_ivas_total_brate = ivas_total_brate; /* Q0 */ - move32(); +void destroy_core_enc_fx( + ENC_CORE_HANDLE hCoreCoder /* i/o: core encoder structure */ +) +{ + destroy_cldfb_encoder_fx( hCoreCoder ); - IF( NE_16( ivas_format, MONO_FORMAT ) ) + IF( hCoreCoder->hSignalBuf != NULL ) { - /* In IVAS, ensure that minimum coded bandwidth is WB */ - hEncoderConfig->max_bwidth = extract_l( L_max( hEncoderConfig->max_bwidth, WB ) ); /* Q0 */ - move16(); + free( hCoreCoder->hSignalBuf ); + hCoreCoder->hSignalBuf = NULL; } - st_ivas->ism_mode = ISM_MODE_NONE; - move32(); - st_ivas->mc_mode = MC_MODE_NONE; - move32(); - st_ivas->nchan_transport = -1; - move16(); - - /*-----------------------------------------------------------------* - * Allocate floating-point input audio buffers - *-----------------------------------------------------------------*/ - - nchan_inp_buff = hEncoderConfig->nchan_inp; /* Q0 */ - move16(); - IF( EQ_16( ivas_format, MONO_FORMAT ) ) + IF( hCoreCoder->hBstr != NULL ) { - nchan_inp_buff = 0; - move16(); + free( hCoreCoder->hBstr ); + hCoreCoder->hBstr = NULL; } - ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) + + IF( hCoreCoder->hLPDmem != NULL ) { - IF( EQ_16( sub( hEncoderConfig->nchan_inp, hEncoderConfig->nchan_ism ), 1 ) ) /* mono is duplicated in monoMASA */ - { - nchan_inp_buff = add( nchan_inp_buff, 1 ); /* Q0 */ - } + free( hCoreCoder->hLPDmem ); + hCoreCoder->hLPDmem = NULL; + } - nchan_inp_buff = add( nchan_inp_buff, 1 ); /* for *data_separated_object Q0*/ + IF( hCoreCoder->hTranDet != NULL ) + { + free( hCoreCoder->hTranDet ); + hCoreCoder->hTranDet = NULL; } - FOR( n = 0; n < nchan_inp_buff; n++ ) + IF( hCoreCoder->hNoiseEst != NULL ) { - /* note: these are intra-frame heap memories */ - IF( ( st_ivas->p_data_fx[n] = (Word32 *) malloc( Mpy_32_16_1( input_Fs, INV_FRAME_PER_SEC_Q15 ) * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point input audio buffer!\n" ) ); - } + free( hCoreCoder->hNoiseEst ); + hCoreCoder->hNoiseEst = NULL; } - FOR( ; n < MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + + IF( hCoreCoder->hVAD != NULL ) { - st_ivas->p_data_fx[n] = NULL; + free( hCoreCoder->hVAD ); + hCoreCoder->hVAD = NULL; } + IF( hCoreCoder->hVAD_CLDFB != NULL ) + { + free( hCoreCoder->hVAD_CLDFB ); + hCoreCoder->hVAD_CLDFB = NULL; + } - /*-----------------------------------------------------------------* - * Allocate and initialize buffer of indices - *-----------------------------------------------------------------*/ + IF( hCoreCoder->hTdCngEnc != NULL ) + { + free( hCoreCoder->hTdCngEnc ); + hCoreCoder->hTdCngEnc = NULL; + } - /* set the maximum allowed number of indices in the list */ - st_ivas->ivas_max_num_indices = get_ivas_max_num_indices_fx( ivas_format, ivas_total_brate ); /* Q0 */ - move16(); + IF( hCoreCoder->hDtxEnc != NULL ) + { + free( hCoreCoder->hDtxEnc ); + hCoreCoder->hDtxEnc = NULL; + } - /* allocate buffer of indices */ - IF( ( st_ivas->ind_list = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices * sizeof( Indice ) ) ) == NULL ) + IF( hCoreCoder->hSpMusClas != NULL ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + free( hCoreCoder->hSpMusClas ); + hCoreCoder->hSpMusClas = NULL; } - /* reset the list of indices */ - FOR( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) + IF( hCoreCoder->hGSCEnc != NULL ) { - st_ivas->ind_list[i].nb_bits = -1; - move16(); + free( hCoreCoder->hGSCEnc ); + hCoreCoder->hGSCEnc = NULL; } - /* set the maximum allowed number of metadata indices in the list */ - st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata_fx( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); /* Q0 */ - move16(); - /* allocate buffer of metadata indices */ - IF( st_ivas->ivas_max_num_indices_metadata > 0 ) + IF( hCoreCoder->hSC_VBR != NULL ) { - IF( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); - } + free( hCoreCoder->hSC_VBR ); + hCoreCoder->hSC_VBR = NULL; + } - /* reset the list of metadata indices */ - FOR( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) - { - st_ivas->ind_list_metadata[i].nb_bits = -1; - move16(); - } + IF( hCoreCoder->hAmrwb_IO != NULL ) + { + free( hCoreCoder->hAmrwb_IO ); + hCoreCoder->hAmrwb_IO = NULL; } - ELSE + + IF( hCoreCoder->hBWE_TD != NULL ) { - st_ivas->ind_list_metadata = NULL; - } - - /*-----------------------------------------------------------------* - * Allocate and initialize SCE/CPE and other handles - *-----------------------------------------------------------------*/ - test(); - IF( EQ_32( ivas_format, MONO_FORMAT ) ) - { - st_ivas->nSCE = 1; /* in mono, there is always only one SCE */ - move16(); - st_ivas->nCPE = 0; - move16(); - st_ivas->nchan_transport = 1; - move16(); - sce_id = 0; - move16(); - - test(); - IF( st_ivas->hEncoderConfig->element_mode_init == EVS_MONO ) - { - IF( NE_32( ( error = create_evs_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE - { - IF( ( error = create_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - /* prepare stereo downmix for EVS */ - IF( EQ_16( hEncoderConfig->stereo_dmx_evs, 1 ) ) - { - IF( ( error = stereo_dmx_evs_init_encoder_fx( &( st_ivas->hStereoDmxEVS ), input_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - ELSE IF( EQ_32( ivas_format, STEREO_FORMAT ) ) - { - st_ivas->nSCE = 0; - move16(); - st_ivas->nCPE = 1; /* in stereo, there is always only one CPE */ - move16(); - st_ivas->nchan_transport = CPE_CHANNELS; - move16(); - cpe_id = 0; - move16(); - - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, ivas_total_brate ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE IF( EQ_32( ivas_format, ISM_FORMAT ) ) - { - st_ivas->ism_mode = ivas_ism_mode_select( hEncoderConfig->nchan_inp, ivas_total_brate ); /* Q0 */ - move32(); - - IF( ( error = ivas_ism_metadata_enc_create_fx( st_ivas, hEncoderConfig->nchan_inp, element_brate_tmp ) ) != IVAS_ERR_OK ) - { - return error; - } - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - IF( ( error = create_sce_enc_fx( st_ivas, sce_id, element_brate_tmp[sce_id] ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) - { - IF( ( error = ivas_param_ism_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( st_ivas->hEncoderConfig->Opt_DTX_ON ) - { - IF( ( error = ivas_ism_dtx_open( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - ELSE IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, MASA_FORMAT ) ) - { - IF( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( EQ_32( ivas_format, SBA_FORMAT ) ) - { - st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->hEncoderConfig->sba_order ); /* Q0 */ - move16(); - - IF( ( error = ivas_spar_enc_open_fx( st_ivas, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } - IF( ( error = ivas_dirac_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE - { - st_ivas->nchan_transport = hEncoderConfig->nchan_inp; /* Q0 */ - move16(); - - IF( ( error = ivas_masa_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( ( error = create_sce_enc_fx( st_ivas, sce_id, res_dec ) ) != IVAS_ERR_OK ) - { - return error; - } - test(); - IF( EQ_16( ivas_format, SBA_FORMAT ) && st_ivas->hEncoderConfig->Opt_DTX_ON ) - { - st_ivas->hSCE[sce_id]->hCoreCoder[0]->dtx_sce_sba = 1; - move16(); - } - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, imult3216( res_dec, CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - IF( hEncoderConfig->Opt_DTX_ON ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cng_sba_flag = 1; - move16(); - } - } - } - - IF( st_ivas->nCPE > 1 ) - { - IF( ( error = create_mct_enc_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - ELSE IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) ) - { - Word32 ism_total_brate; - Word16 k; - - st_ivas->ism_mode = ivas_omasa_ism_mode_select_fx( ivas_total_brate, hEncoderConfig->nchan_ism ); /* Q0 */ - move32(); - st_ivas->nchan_transport = 2; - move16(); - - IF( ( error = ivas_ism_metadata_enc_create_fx( st_ivas, hEncoderConfig->nchan_ism, element_brate_tmp ) ) != IVAS_ERR_OK ) - { - return error; - } - - k = 0; - move16(); - test(); - WHILE( LT_16( k, SIZE_IVAS_BRATE_TBL ) && NE_32( ivas_total_brate, ivas_brate_tbl[k] ) ) - { - k++; - } - - ism_total_brate = 0; - move32(); - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - ism_total_brate = L_add( ism_total_brate, sep_object_brate[k - 2][st_ivas->nSCE - 1] ); /* Q0 */ - IF( ( error = create_sce_enc_fx( st_ivas, sce_id, sep_object_brate[k - 2][st_ivas->nSCE - 1] ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) - { - return error; - } - IF( ( error = ivas_masa_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( NE_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - IF( ( error = ivas_omasa_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( GE_32( L_sub( ivas_total_brate, ism_total_brate ), MIN_BRATE_MDCT_STEREO ) ) - { - st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - ELSE - { - st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_DFT; - move16(); - } - - IF( ( error = create_cpe_enc_fx( st_ivas, 0, L_sub( ivas_total_brate, ism_total_brate ) ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE IF( EQ_32( ivas_format, SBA_ISM_FORMAT ) ) - { - st_ivas->ism_mode = ISM_MODE_NONE; - move32(); - - IF( GE_32( ivas_total_brate, IVAS_256k ) ) - { - st_ivas->ism_mode = ISM_SBA_MODE_DISC; - move32(); - } - - IF( ( error = ivas_ism_metadata_enc_create_fx( st_ivas, hEncoderConfig->nchan_ism, element_brate_tmp ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* allocate and initialize SBA handles */ - IF( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) - { - return error; - } - - st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->hEncoderConfig->sba_order ); /* Q0 */ - - IF( ( error = ivas_spar_enc_open_fx( st_ivas, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( ( error = ivas_dirac_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( EQ_32( st_ivas->ism_mode, ISM_MODE_NONE ) ) - { - /* allocate and initialize SBA core-coders */ - IF( EQ_16( st_ivas->nchan_transport, 1 ) ) - { - IF( ( error = create_sce_enc_fx( st_ivas, 0, ivas_total_brate ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, imult3216( res_dec, CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( GT_16( st_ivas->nCPE, 1 ) ) - { - IF( ( error = create_mct_enc_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - ELSE - { - /* allocate and initialize MCT core coder */ - st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->hEncoderConfig->nchan_ism, 1 ), 1 ) ); /* Q0 */ - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, imult3216( res_dec, CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( ( error = create_mct_enc_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - IF( ( error = ivas_osba_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE IF( EQ_32( ivas_format, MC_FORMAT ) ) - { - st_ivas->mc_mode = ivas_mc_mode_select_fx( hEncoderConfig->mc_input_setup, ivas_total_brate ); /* Q0 */ - move32(); - - IF( ( error = ivas_create_lfe_lpf_enc_fx( &st_ivas->hLfeLpf, hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( NE_32( st_ivas->mc_mode, MC_MODE_MCT ) ) - { - st_ivas->nSCE = 0; - move16(); - st_ivas->nCPE = idiv1616( hEncoderConfig->nchan_inp, CPE_CHANNELS ); /* Q0 */ - move16(); - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, sub( hEncoderConfig->nchan_inp, 1 ), &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, imult3216( res_dec, CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( ( error = create_mct_enc_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( ( error = ivas_create_lfe_enc_fx( &st_ivas->hLFE, input_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - - st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels_fx( st_ivas->hEncoderConfig->mc_input_setup ); /* Q0 */ - move16(); - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) - { - st_ivas->nSCE = 0; - move16(); - st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS >> 1; - move16(); - st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; - move16(); - - IF( ( error = ivas_mc_paramupmix_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nCPE, &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, res_dec ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( ( error = create_mct_enc_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( ( error = ivas_create_lfe_enc_fx( &st_ivas->hLFE, input_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) - { - IF( ( error = ivas_param_mc_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nCPE + st_ivas->nSCE ) ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( GT_16( st_ivas->nCPE, 1 ) ) - { - IF( ( error = create_mct_enc_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) - { - Word32 brate_sce, brate_cpe; - - ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( hEncoderConfig->element_mode_init ), ivas_total_brate ); - - IF( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( ( error = ivas_masa_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( ( error = ivas_mcmasa_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - ivas_mcmasa_split_brate_fx( st_ivas->hMcMasa->separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - IF( ( error = create_sce_enc_fx( st_ivas, sce_id, brate_sce ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; /* Q0 */ - move16(); - - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, brate_cpe ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - } - - /*-----------------------------------------------------------------* - * Allocate and initialize HP20 filter memories - *-----------------------------------------------------------------*/ - - /* set number of input channels used for analysis/coding */ - n = getNumChanAnalysis_fx( st_ivas ); - IF( n > 0 ) - { - IF( ( st_ivas->mem_hp20_in_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); - } - } - ELSE - { - st_ivas->mem_hp20_in_fx = NULL; - } - - FOR( i = 0; i < n; i++ ) - { - IF( ( st_ivas->mem_hp20_in_fx[i] = (Word32 *) malloc( ( L_HP20_MEM + 2 ) * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); - } - - set32_fx( st_ivas->mem_hp20_in_fx[i], 0, L_HP20_MEM + 2 ); - } - - return error; -} -/*------------------------------------------------------------------------- - * destroy_core_enc() - * - * Close core encoder handles - *-------------------------------------------------------------------------*/ - -void destroy_core_enc_fx( - ENC_CORE_HANDLE hCoreCoder /* i/o: core encoder structure */ -) -{ - Word16 i; - - destroy_cldfb_encoder_fx( hCoreCoder ); - - IF( hCoreCoder->hSignalBuf != NULL ) - { - free( hCoreCoder->hSignalBuf ); - hCoreCoder->hSignalBuf = NULL; - } - - IF( hCoreCoder->hBstr != NULL ) - { - /* reset buffer of indices */ - FOR( i = 0; i < hCoreCoder->hBstr->nb_ind_tot; i++ ) - { - hCoreCoder->hBstr->ind_list[i].nb_bits = -1; - move16(); - } - free( hCoreCoder->hBstr ); - hCoreCoder->hBstr = NULL; - } - - IF( hCoreCoder->hLPDmem != NULL ) - { - free( hCoreCoder->hLPDmem ); - hCoreCoder->hLPDmem = NULL; - } - - IF( hCoreCoder->hTranDet != NULL ) - { - free( hCoreCoder->hTranDet ); - hCoreCoder->hTranDet = NULL; - } - - IF( hCoreCoder->hNoiseEst != NULL ) - { - free( hCoreCoder->hNoiseEst ); - hCoreCoder->hNoiseEst = NULL; - } - - IF( hCoreCoder->hVAD != NULL ) - { - free( hCoreCoder->hVAD ); - hCoreCoder->hVAD = NULL; - } - - IF( hCoreCoder->hVAD_CLDFB != NULL ) - { - /* This is not required as we are not allocating memory dynamically */ - // free( hCoreCoder->hVAD_CLDFB ); - hCoreCoder->hVAD_CLDFB = NULL; - } - - IF( hCoreCoder->hTdCngEnc != NULL ) - { - free( hCoreCoder->hTdCngEnc ); - hCoreCoder->hTdCngEnc = NULL; - } - - IF( hCoreCoder->hDtxEnc != NULL ) - { - free( hCoreCoder->hDtxEnc ); - hCoreCoder->hDtxEnc = NULL; - } - - IF( hCoreCoder->hSpMusClas != NULL ) - { - free( hCoreCoder->hSpMusClas ); - hCoreCoder->hSpMusClas = NULL; - } - - IF( hCoreCoder->hGSCEnc != NULL ) - { - free( hCoreCoder->hGSCEnc ); - hCoreCoder->hGSCEnc = NULL; - } - - IF( hCoreCoder->hSC_VBR != NULL ) - { - free( hCoreCoder->hSC_VBR ); - hCoreCoder->hSC_VBR = NULL; - } - - IF( hCoreCoder->hAmrwb_IO != NULL ) - { - free( hCoreCoder->hAmrwb_IO ); - hCoreCoder->hAmrwb_IO = NULL; - } - - IF( hCoreCoder->hBWE_TD != NULL ) - { - free( hCoreCoder->hBWE_TD ); - hCoreCoder->hBWE_TD = NULL; - } - - IF( hCoreCoder->hBWE_FD != NULL ) - { - free( hCoreCoder->hBWE_FD ); - hCoreCoder->hBWE_FD = NULL; - } - - IF( hCoreCoder->hRF != NULL ) - { - free( hCoreCoder->hRF ); - hCoreCoder->hRF = NULL; - } - - IF( hCoreCoder->hTECEnc != NULL ) - { - free( hCoreCoder->hTECEnc ); - hCoreCoder->hTECEnc = NULL; - } - - IF( hCoreCoder->hTcxEnc != NULL ) - { - free( hCoreCoder->hTcxEnc ); - hCoreCoder->hTcxEnc = NULL; - } - - IF( hCoreCoder->hTcxCfg != NULL ) - { - free( hCoreCoder->hTcxCfg ); - hCoreCoder->hTcxCfg = NULL; - } - - IF( hCoreCoder->hIGFEnc != NULL ) - { - free( hCoreCoder->hIGFEnc ); - hCoreCoder->hIGFEnc = NULL; - } - - IF( hCoreCoder->hPlcExt != NULL ) - { - free( hCoreCoder->hPlcExt ); - hCoreCoder->hPlcExt = NULL; - } - - IF( hCoreCoder->hHQ_core != NULL ) - { - free( hCoreCoder->hHQ_core ); - hCoreCoder->hHQ_core = NULL; - } - - free( hCoreCoder ); - - return; -} - -void destroy_evs_core_enc_fx( - ENC_CORE_HANDLE hCoreCoder /* i/o: core encoder structure */ -) -{ - Word16 i; - - destroy_encoder_fx( hCoreCoder ); - - IF( hCoreCoder->hSignalBuf != NULL ) - { - free( hCoreCoder->hSignalBuf ); - hCoreCoder->hSignalBuf = NULL; - } - - IF( hCoreCoder->hBstr != NULL ) - { - /* reset buffer of indices */ - FOR( i = 0; i < hCoreCoder->hBstr->nb_ind_tot; i++ ) - { - hCoreCoder->hBstr->ind_list[i].nb_bits = -1; - move16(); - } - free( hCoreCoder->hBstr ); - hCoreCoder->hBstr = NULL; - } - - IF( hCoreCoder->hLPDmem != NULL ) - { - free( hCoreCoder->hLPDmem ); - hCoreCoder->hLPDmem = NULL; - } - - IF( hCoreCoder->hTranDet != NULL ) - { - free( hCoreCoder->hTranDet ); - hCoreCoder->hTranDet = NULL; - } - - IF( hCoreCoder->hNoiseEst != NULL ) - { - free( hCoreCoder->hNoiseEst ); - hCoreCoder->hNoiseEst = NULL; - } - - IF( hCoreCoder->hVAD != NULL ) - { - free( hCoreCoder->hVAD ); - hCoreCoder->hVAD = NULL; - } - - IF( hCoreCoder->hVAD_CLDFB != NULL ) - { - /* This is not required as we are not allocating memory dynamically */ - // free( hCoreCoder->hVAD_CLDFB ); - hCoreCoder->hVAD_CLDFB = NULL; - } - - IF( hCoreCoder->hTdCngEnc != NULL ) - { - free( hCoreCoder->hTdCngEnc ); - hCoreCoder->hTdCngEnc = NULL; - } - - IF( hCoreCoder->hDtxEnc != NULL ) - { - free( hCoreCoder->hDtxEnc ); - hCoreCoder->hDtxEnc = NULL; - } - - IF( hCoreCoder->hSpMusClas != NULL ) - { - free( hCoreCoder->hSpMusClas ); - hCoreCoder->hSpMusClas = NULL; - } - - IF( hCoreCoder->hGSCEnc != NULL ) - { - free( hCoreCoder->hGSCEnc ); - hCoreCoder->hGSCEnc = NULL; - } - - IF( hCoreCoder->hSC_VBR != NULL ) - { - free( hCoreCoder->hSC_VBR ); - hCoreCoder->hSC_VBR = NULL; - } - - IF( hCoreCoder->hAmrwb_IO != NULL ) - { - free( hCoreCoder->hAmrwb_IO ); - hCoreCoder->hAmrwb_IO = NULL; - } - - IF( hCoreCoder->hBWE_TD != NULL ) - { - free( hCoreCoder->hBWE_TD ); - hCoreCoder->hBWE_TD = NULL; + free( hCoreCoder->hBWE_TD ); + hCoreCoder->hBWE_TD = NULL; } IF( hCoreCoder->hBWE_FD != NULL ) @@ -1999,28 +1193,30 @@ void destroy_evs_core_enc_fx( * * Close IVAS encoder handles *-------------------------------------------------------------------------*/ + void ivas_destroy_enc_fx( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) { Word16 i, n, nchan_inp; + nchan_inp = st_ivas->hEncoderConfig->nchan_inp; move16(); /* SCE handles */ - for ( i = 0; i < MAX_SCE; i++ ) + FOR( i = 0; i < MAX_SCE; i++ ) { - if ( st_ivas->hSCE[i] != NULL ) + IF( st_ivas->hSCE[i] != NULL ) { - destroy_sce_enc_fx( st_ivas->hSCE[i], EQ_16( st_ivas->hEncoderConfig->element_mode_init, EVS_MONO ) ); + destroy_sce_enc_fx( st_ivas->hSCE[i] ); st_ivas->hSCE[i] = NULL; } } /* CPE handles */ - for ( i = 0; i < MAX_CPE; i++ ) + FOR( i = 0; i < MAX_CPE; i++ ) { - if ( st_ivas->hCPE[i] != NULL ) + IF( st_ivas->hCPE[i] != NULL ) { destroy_cpe_enc( st_ivas->hCPE[i] ); st_ivas->hCPE[i] = NULL; @@ -2028,11 +1224,11 @@ void ivas_destroy_enc_fx( } /* HP20 filter handles */ - if ( st_ivas->mem_hp20_in_fx != NULL ) + IF( st_ivas->mem_hp20_in_fx != NULL ) { n = getNumChanAnalysis_fx( st_ivas ); /* Q0 */ - for ( i = 0; i < n; i++ ) + FOR( i = 0; i < n; i++ ) { free( st_ivas->mem_hp20_in_fx[i] ); st_ivas->mem_hp20_in_fx[i] = NULL; @@ -2045,7 +1241,7 @@ void ivas_destroy_enc_fx( ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); /* ISM DTX Handle */ - if ( st_ivas->hISMDTX != NULL ) + IF( st_ivas->hISMDTX != NULL ) { free( st_ivas->hISMDTX ); st_ivas->hISMDTX = NULL; @@ -2111,7 +1307,7 @@ void ivas_destroy_enc_fx( free( st_ivas->ind_list_metadata ); } - /* floating-point input audio buffers */ + /* input audio buffers */ FOR( n = 0; n < MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) { IF( st_ivas->p_data_fx[n] != NULL ) @@ -2127,6 +1323,7 @@ void ivas_destroy_enc_fx( return; } + /*------------------------------------------------------------------------- * ivas_initialize_MD_bstr_enc_fx() * diff --git a/lib_enc/ivas_ism_dtx_enc_fx.c b/lib_enc/ivas_ism_dtx_enc_fx.c index 6aba283beac75621190c5b7832817fbe98af8c04..3474b218bd411a2b07bd60a923f32d95a6260c5c 100644 --- a/lib_enc/ivas_ism_dtx_enc_fx.c +++ b/lib_enc/ivas_ism_dtx_enc_fx.c @@ -143,7 +143,7 @@ Word16 ivas_ism_dtx_enc_fx( /* one of the channels is active -> no DTX */ FOR( ch = 0; ch < nchan_transport; ch++ ) { - lp_noise_fx[ch] = hSCE[ch]->hCoreCoder[0]->lp_noise_fx; /*Q8*/ + lp_noise_fx[ch] = extract_h( hSCE[ch]->hCoreCoder[0]->lp_noise_32fx ); /*Q8*/ move16(); } @@ -174,11 +174,7 @@ Word16 ivas_ism_dtx_enc_fx( ( EQ_16( nchan_ism, 2 ) && LE_32( ivas_total_brate, IVAS_48k ) ) || ( EQ_16( nchan_ism, 3 ) && LE_32( ivas_total_brate, IVAS_80k ) ) || ( EQ_16( nchan_ism, 4 ) && LE_32( ivas_total_brate, IVAS_96k ) ) || -#ifdef NONBE_FIX_1277_EVS_DTX_HIGH_RATE_THRESHOLD LT_16( lp_noise_max_fx, ( DTX_THR << 8 ) ) ) ) -#else - LT_16( lp_noise_max_fx, ( 15 << 8 ) ) ) ) -#endif { dtx_flag = 0; move16(); @@ -223,8 +219,8 @@ Word16 ivas_ism_dtx_enc_fx( } /* estimate SID metadata bit-budget */ - nBits = add( nBits, 1 ); /* number of objects Q0*/ - nBits = add( nBits, 1 ); /* SID metadata flag Q0*/ + nBits = add( nBits, 1 ); /* number of objects Q0*/ + nBits = add( nBits, 1 ); /* SID metadata flag Q0*/ IF( EQ_16( md_diff_flag[ch], 1 ) ) { nBits = add( nBits, nBits_azimuth ); /* Q0 */ @@ -244,12 +240,12 @@ Word16 ivas_ism_dtx_enc_fx( FOR( ch = 0; ch < nchan_transport - 1; ch++ ) { - nBits_MD_max = sub( nBits_MD_max, nBits_coh ); /* coherence Q0*/ + nBits_MD_max = sub( nBits_MD_max, nBits_coh ); /* coherence Q0*/ } if ( GT_16( nchan_ism, 3 ) ) { - nBits_MD_max = sub( nBits_MD_max, 1 ); /* ism_mode flag Q0*/ + nBits_MD_max = sub( nBits_MD_max, 1 ); /* ism_mode flag Q0*/ } /* too many metadata bits -> switch to active coding */ @@ -434,10 +430,10 @@ void ivas_ism_get_sce_id_dtx_fx( * *-------------------------------------------------------------------*/ void ivas_ism_coh_estim_dtx_enc_fx( - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ - const Word16 nchan_transport, /* i : number of transport channels Q0*/ - const Word16 input_frame /* i : input frame length Q0*/ + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const Word16 nchan_transport, /* i : number of transport channels Q0*/ + const Word16 input_frame /* i : input frame length Q0*/ ) { Encoder_State *st, *st_id0; diff --git a/lib_enc/ivas_ism_enc_fx.c b/lib_enc/ivas_ism_enc_fx.c index c2f77c159eb6fa180db94e04d81fde15bcda15fb..ea509dd1020653f78a9ad5a0835f270b027a92fe 100644 --- a/lib_enc/ivas_ism_enc_fx.c +++ b/lib_enc/ivas_ism_enc_fx.c @@ -49,12 +49,12 @@ * ISM CoreCoders encoding routine *-------------------------------------------------------------------*/ ivas_error ivas_ism_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - Word32 *data[], /* i : input signal [channels][samples] Q(q_data)*/ - Word16 q_data, /* i : Q-factor of input signal */ - const Word16 input_frame, /* i : input frame length per channel Q0*/ - Word16 *nb_bits_metadata, /* i : number of metadata bits Q0*/ - const Word16 flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag Q0*/ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + Word32 *data[], /* i : input signal [channels][samples] Q(q_data)*/ + Word16 q_data, /* i : Q-factor of input signal */ + const Word16 input_frame, /* i : input frame length per channel Q0*/ + Word16 *nb_bits_metadata, /* i : number of metadata bits Q0*/ + const Word16 flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag Q0*/ ) { SCE_ENC_HANDLE hSCE; @@ -116,12 +116,10 @@ ivas_error ivas_ism_enc_fx( error = IVAS_ERR_OK; move32(); -#ifdef MSAN_FIX FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) { set16_zero_fx( old_inp_12k8_fx[i][0], L_INP_12k8 ); } -#endif set16_fx( q_re_im_buf, 0, MAX_NUM_OBJECTS ); @@ -167,10 +165,16 @@ ivas_error ivas_ism_enc_fx( /*------------------------------------------------------------------* * Initialization - general *-----------------------------------------------------------------*/ - Copy32( data[sce_id], st->input32_fx, input_frame ); // Q(q_data) - q_st_inp_16 = sub( L_norm_arr( st->input32_fx, input_frame ), 16 ); - Copy_Scale_sig_32_16( st->input32_fx, st->input_fx, input_frame, q_st_inp_16 ); // q_data -> Q(q_inp + q_data) - st->q_inp = add( q_st_inp_16, q_data ); + Word16 Q_min = s_min( q_data, add( st->q_inp32, L_norm_arr( st->input32_fx - input_frame, input_frame ) ) ); + scale_sig32( st->input32_fx - input_frame, input_frame, sub( Q_min, st->q_inp32 ) ); + st->q_old_inp32 = Q_min; + move16(); + Copy_Scale_sig32( data[sce_id], st->input32_fx, input_frame, sub( Q_min, q_data ) ); // Q(Q_min) + st->q_inp32 = Q_min; + move16(); + q_st_inp_16 = sub( getScaleFactor32( st->input32_fx, input_frame ), 16 ); + Copy_Scale_sig_32_16( st->input32_fx, st->input_fx, input_frame, q_st_inp_16 ); // Q_min -> Q(q_inp + Q_min) + st->q_inp = add( q_st_inp_16, Q_min ); move16(); st->element_mode = IVAS_SCE; @@ -213,7 +217,7 @@ ivas_error ivas_ism_enc_fx( RunTransientDetection_ivas_fx( st->input_fx, input_frame, st->hTranDet, st->q_inp ); - currFlatness_fx[0] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, 0 ); // Q21 + currFlatness_fx[0] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( st->hTranDet, NSUBBLOCKS, 0 ); // Q21 move16(); /*----------------------------------------------------------------* @@ -247,11 +251,7 @@ ivas_error ivas_ism_enc_fx( error = pre_proc_front_ivas_fx( hSCE, NULL, hSCE->element_brate, nb_bits_metadata[sce_id], input_frame, 0, old_inp_12k8_fx[sce_id][0], old_inp_16k_fx[sce_id][0], &ener_fx[sce_id][0], &relE_fx[sce_id][0], A_fx[sce_id][0], Aw_fx[sce_id][0], epsP_fx[sce_id][0], &epsP_fx_q[sce_id][0], lsp_new_fx[sce_id][0], lsp_mid_fx[sce_id][0], &vad_hover_flag[sce_id][0], &attack_flag[sce_id][0], realBuffer_fx[sce_id][0], imagBuffer_fx[sce_id][0], &q_re_im_buf[sce_id], old_wsp_fx[sce_id][0], &q_old_wsp, pitch_fr_fx[sce_id][0], voicing_fr_fx[sce_id][0], &loc_harm[sce_id][0], &cor_map_sum_fx[sce_id][0], &vad_flag_dtx[sce_id][0], enerBuffer_fx[sce_id][0], &enerBuffer_fx_exp[sce_id][0], -#ifdef NONBE_1211_DTX_BR_SWITCHING fft_buff_fx[sce_id][0], &fft_buff_fx_q[sce_id][0], A_fx[sce_id][0], lsp_new_fx[sce_id][0], currFlatness_fx[0], 0, fr_bands_fx, q_fr_bands, Etot_LR_fx, lf_E_fx, 31, localVAD_HE_SAD, NULL, 31, 0, 0, 0, 0, ISM_FORMAT, 0, st_ivas->hEncoderConfig->last_ivas_total_brate, st_ivas->hEncoderConfig->ivas_total_brate, &Q_new[sce_id][0] -#else - fft_buff_fx[sce_id][0], &fft_buff_fx_q[sce_id][0], A_fx[sce_id][0], lsp_new_fx[sce_id][0], currFlatness_fx[0], 0, fr_bands_fx, q_fr_bands, Etot_LR_fx, lf_E_fx, 31, localVAD_HE_SAD, NULL, 31, 0, 0, 0, 0, ISM_FORMAT, 0, st_ivas->hEncoderConfig->ivas_total_brate, &Q_new[sce_id][0] -#endif #ifdef DEBUG_MODE_INFO , st->id_element @@ -281,20 +281,6 @@ ivas_error ivas_ism_enc_fx( *-----------------------------------------------------------------*/ /* compute the dominant sce_id using long term energy */ - FOR( Word16 j = 0; j < st_ivas->nchan_transport; j++ ) - { - test(); - IF( st_ivas->hSCE[j] && st_ivas->hSCE[j]->hCoreCoder[0] ) - { -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( st_ivas->hSCE[j]->hCoreCoder[0]->input_fx, st_ivas->hSCE[j]->hCoreCoder[0]->input32_fx, input_frame, sub( Q11, st_ivas->hSCE[j]->hCoreCoder[0]->q_inp ) ); /* Q11 */ -#else - Copy_Scale_sig_16_32_DEPREC( st_ivas->hSCE[j]->hCoreCoder[0]->input_fx, st_ivas->hSCE[j]->hCoreCoder[0]->input32_fx, input_frame, sub( Q11, st_ivas->hSCE[j]->hCoreCoder[0]->q_inp ) ); /* Q11 */ -#endif - st_ivas->hSCE[j]->hCoreCoder[0]->q_inp32 = Q11; - move16(); - } - } IF( st_ivas->hEncoderConfig->Opt_DTX_ON ) { @@ -374,9 +360,9 @@ ivas_error ivas_ism_enc_fx( { omasa_stereo_sw_cnt = NULL; } + IF( ( error = ivas_ism_metadata_enc_fx( &ism_total_brate, nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, - nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, lp_noise_CPE_fx, flag_omasa_ener_brate, omasa_stereo_sw_cnt, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != - IVAS_ERR_OK ) + nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, lp_noise_CPE_fx, flag_omasa_ener_brate, omasa_stereo_sw_cnt, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) { return error; } @@ -397,7 +383,8 @@ ivas_error ivas_ism_enc_fx( IF( sid_flag ) { - ivas_write_format_sid_fx( st_ivas->hEncoderConfig->ivas_format, IVAS_SCE, st->hBstr ); + + ivas_write_format_sid_fx( st_ivas->hEncoderConfig->ivas_format, IVAS_SCE, st->hBstr, -1, -1 ); } /*only metadata encoding is needed for this case*/ @@ -490,6 +477,9 @@ ivas_error ivas_ism_enc_fx( Copy( st->input_fx, st->old_input_signal_fx, input_frame ); /* st->q_inp */ st->q_old_inp = st->q_inp; move16(); + Copy32( st->input32_fx, st->old_input_signal32_fx, input_frame ); /* st->q_inp32 */ + st->q_old_inp32 = st->q_inp32; + move16(); hSCE->last_element_brate = hSCE->element_brate; /* Q0 */ move32(); @@ -530,7 +520,6 @@ ivas_error ivas_ism_enc_fx( dbgwrite( &tmpF, sizeof( float ), 1, input_frame, fname( debug_dir, "element_brate", 0, id, ENC ) ); } #endif - pop_wmops(); return error; diff --git a/lib_enc/ivas_ism_metadata_enc_fx.c b/lib_enc/ivas_ism_metadata_enc_fx.c index 8e6e0c93f773a621f921c1fb37a68bed252f81f3..e685566645353a7d5f81aa4b460be74ecaf11502 100644 --- a/lib_enc/ivas_ism_metadata_enc_fx.c +++ b/lib_enc/ivas_ism_metadata_enc_fx.c @@ -41,20 +41,19 @@ #include #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*-----------------------------------------------------------------------* * Local constants *-----------------------------------------------------------------------*/ -#define ISM_NUM_PARAM 5 /* number of coded metadata parameters */ +#define ISM_NUM_PARAM 5 /* number of coded metadata parameters */ +#define ONE_BY_ISM_NUM_PARAM_Q15 6554 /* To be used for shift operation instead of division */ #define ISM_MAX_AZIMUTH_DIFF_IDX ( ISM_AZIMUTH_NBITS - 1 /*zero*/ - 1 /*sign*/ ) #define ISM_MAX_ELEVATION_DIFF_IDX ( ISM_ELEVATION_NBITS - 1 /*zero*/ - 1 /*sign*/ ) #define ISM_MAX_RADIUS_DIFF_IDX ( ISM_RADIUS_NBITS - 1 /*zero*/ - 1 /*sign*/ ) -#define ISM_FEC_MAX 10 #define ISM_MD_FEC_DIFF 10 #define ISM_MD_FEC_DIFF_Q22 41943040 #define ISM_MD_INC_DIFF_CNT_MAX 6 @@ -277,7 +276,7 @@ ivas_error ivas_ism_metadata_enc_fx( /* In case of low level noise for low bitrate inactive frames, do not sent metadata */ test(); test(); - hIsmMeta[ch]->ism_metadata_flag = vad_flag[ch] || GT_16( hSCE[ch]->hCoreCoder[0]->lp_noise_fx, 2560 /*10 Q8*/ ) || hSCE[ch]->hCoreCoder[0]->tcxonly; + hIsmMeta[ch]->ism_metadata_flag = vad_flag[ch] || GT_32( hSCE[ch]->hCoreCoder[0]->lp_noise_32fx, 167772160 /*10 Q24*/ ) || hSCE[ch]->hCoreCoder[0]->tcxonly; move16(); } @@ -314,10 +313,8 @@ ivas_error ivas_ism_metadata_enc_fx( } ELSE IF( EQ_16( hIsmMeta[ch]->ism_md_fec_cnt_enc, ISM_MD_FEC_CNT_MAX ) ) { -#ifdef NONBE_1273_ISM_METADATA_COUNTER hIsmMeta[ch]->ism_md_fec_cnt_enc = 0; move16(); -#endif lowrate_metadata_flag[ch] = 1; move16(); hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; @@ -508,7 +505,6 @@ ivas_error ivas_ism_metadata_enc_fx( { idx_angle1_abs = ism_quant_meta_fx( hIsmMetaData->azimuth_fx, &valQ_fx, ism_azimuth_borders_fx, ISM_Q_STEP_FX, ISM_Q_STEP_BORDER_FX, 1 << ISM_AZIMUTH_NBITS ); idx_angle2_abs = ism_quant_meta_fx( hIsmMetaData->elevation_fx, &valQ_fx, ism_elevation_borders_fx, ISM_Q_STEP_FX, ISM_Q_STEP_BORDER_FX, 1 << ISM_ELEVATION_NBITS ); - // valQ = fixedToFloat( valQ_fx, Q22 ); } ELSE /* ISM_MODE_PARAM */ { @@ -530,7 +526,6 @@ ivas_error ivas_ism_metadata_enc_fx( Word16 valQ_fx_tmp = extract_h( valQ_fx ); // 22 - 16 = 6 idx_radius_abs = usquant_fx( hIsmMetaData->radius_fx, &valQ_fx_tmp, ISM_RADIUS_MIN_Q9, ISM_RADIUS_DELTA_Q8, 1 << ISM_RADIUS_NBITS ); valQ_fx = L_shr( L_deposit_h( valQ_fx_tmp ), 3 ); // Q22 - // valQ = fixedToFloat( valQ_fx, Q22 ); encode_angle_indices_fx( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch] ); encode_radius_fx( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] ); } @@ -615,7 +610,7 @@ ivas_error ivas_ism_metadata_enc_fx( pos_zero = add( pos_zero, 1 ); } - ch = idiv1616( abs_next, ISM_NUM_PARAM ); + ch = mult( abs_next, ONE_BY_ISM_NUM_PARAM_Q15 ); IF( abs_next % ISM_NUM_PARAM == 0 ) { @@ -650,10 +645,8 @@ ivas_error ivas_ism_metadata_enc_fx( { hIsmMeta[ch]->ism_md_fec_cnt_enc = add( hIsmMeta[ch]->ism_md_fec_cnt_enc, 1 ); move16(); -#ifdef NONBE_1273_ISM_METADATA_COUNTER hIsmMeta[ch]->ism_md_fec_cnt_enc = s_min( hIsmMeta[ch]->ism_md_fec_cnt_enc, ISM_MD_FEC_CNT_MAX ); move16(); -#endif } ELSE { @@ -821,10 +814,8 @@ ivas_error ivas_ism_metadata_enc_fx( { hIsmMeta[ch]->ism_md_fec_cnt_enc = add( hIsmMeta[ch]->ism_md_fec_cnt_enc, 1 ); move16(); -#ifdef NONBE_1273_ISM_METADATA_COUNTER hIsmMeta[ch]->ism_md_fec_cnt_enc = s_min( hIsmMeta[ch]->ism_md_fec_cnt_enc, ISM_MD_FEC_CNT_MAX ); move16(); -#endif } ELSE { diff --git a/lib_enc/ivas_ism_param_enc_fx.c b/lib_enc/ivas_ism_param_enc_fx.c index c4698357894c5e38251861ad17770b96360b86f8..973b9443c36abb61a23009bca73c852ecf47c227 100644 --- a/lib_enc/ivas_ism_param_enc_fx.c +++ b/lib_enc/ivas_ism_param_enc_fx.c @@ -40,7 +40,6 @@ #include "ivas_cnst.h" #include "ivas_rom_com.h" #include "wmc_auto.h" -#include "ivas_rom_com_fx.h" /*------------------------------------------------------------------------- * Local function definitions @@ -318,7 +317,7 @@ void ivas_param_ism_stereo_dmx_fx( cardioid_right[i] = sub( ONE_IN_Q14 /* 1.0f in Q14 */, cardioid_left[i] ); /* corresponds to: alpha + ( 1 - alpha ) * cosf( tmp + tmp_1 ); */ move16(); /* Loop over all samples */ - FOR( j = 0; j < input_frame >> 1; j++ ) + FOR( j = 0; j < ( input_frame >> 1 ); j++ ) { tmp = data[i][j]; move32(); @@ -395,7 +394,7 @@ void ivas_param_ism_stereo_dmx_fx( tmp_1 = 15 + 1; move16(); - FOR( i = 0; i < input_frame >> 1; i++ ) + FOR( i = 0; i < ( input_frame >> 1 ); i++ ) { stereo_dmx[0][i] = W_extract_l( W_shr( W_mult_32_32( stereo_dmx[0][i], L_add( tmp, mult0( i, grad ) ) ), tmp_1 ) ); // Qx move32(); diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index da1f836df340575c1183fad83627f59919608aae..5613866ccc57e63116e7c224fcdfba71db62d480 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -40,7 +40,6 @@ #include "prot_fx.h" #include "prot_fx_enc.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*-----------------------------------------------------------------------* @@ -116,6 +115,7 @@ static void masa_metadata_direction_alignment_fx( MASA_ENCODER_HANDLE hMasa ); * * open and initialize MASA encoder *-----------------------------------------------------------------------*/ + ivas_error ivas_masa_enc_open_fx( Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ) @@ -223,10 +223,22 @@ ivas_error ivas_masa_enc_open_fx( hOmasaData->omasa_stereo_sw_cnt = OMASA_STEREO_SW_CNT_MAX; move16(); - FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + IF( NE_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { - set_zero_fx( hOmasaData->energy_ism_fx[i], MASA_FREQUENCY_BANDS ); // hOmasaData->energy_ism_fx_e - set16_fx( hOmasaData->energy_ism_fx_e[i], 0, MASA_FREQUENCY_BANDS ); + IF( ( hOmasaData->hOmasaEnergy = (OMASA_ENCODER_ENERGY_HANDLE) malloc( sizeof( OMASA_ENCODER_ENERGY_STATE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA energy handle\n" ) ); + } + + FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + set_zero_fx( hOmasaData->hOmasaEnergy->energy_ism_fx[i], MASA_FREQUENCY_BANDS ); // hOmasaData->energy_ism_fx_e + set16_fx( hOmasaData->hOmasaEnergy->energy_ism_fx_e[i], 0, MASA_FREQUENCY_BANDS ); + } + } + else + { + hOmasaData->hOmasaEnergy = NULL; } hMasa->data.hOmasaData = hOmasaData; @@ -241,11 +253,13 @@ ivas_error ivas_masa_enc_open_fx( return error; } + /*-----------------------------------------------------------------------* * ivas_masa_enc_close() * * close MASA encoder *-----------------------------------------------------------------------*/ + void ivas_masa_enc_close_fx( MASA_ENCODER_HANDLE *hMasa /* i/o: MASA metadata structure */ ) @@ -260,11 +274,17 @@ void ivas_masa_enc_close_fx( FOR( i = 0; i < ( *hMasa )->data.num_Cldfb_instances; i++ ) { - deleteCldfb_ivas_fx( &( ( *hMasa )->data.cldfbAnaEnc[i] ) ); + deleteCldfb_fx( &( ( *hMasa )->data.cldfbAnaEnc[i] ) ); } IF( ( *hMasa )->data.hOmasaData != NULL ) { + IF( ( *hMasa )->data.hOmasaData->hOmasaEnergy != NULL ) + { + free( ( *hMasa )->data.hOmasaData->hOmasaEnergy ); + ( *hMasa )->data.hOmasaData->hOmasaEnergy = NULL; + } + free( ( *hMasa )->data.hOmasaData ); ( *hMasa )->data.hOmasaData = NULL; } @@ -275,6 +295,7 @@ void ivas_masa_enc_close_fx( return; } + /*-----------------------------------------------------------------------* * ivas_masa_encode() * @@ -533,8 +554,26 @@ ivas_error ivas_masa_encode_fx( } ELSE { - /* write the number of MASA transport channels */ - push_next_indice( hMetaData, sub( nchan_transport, 1 ), MASA_TRANSP_BITS ); + test(); + IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) && EQ_32( ism_mode, ISM_MODE_NONE ) ) + { + /* use the MASA number of transport channels bit to signal if there are 1 or 2 objects */ + test(); + IF( EQ_16( nchan_ism, 1 ) || EQ_16( nchan_ism, 2 ) ) + { + push_next_indice( hMetaData, sub( nchan_ism, 1 ), MASA_TRANSP_BITS ); + } + ELSE + { + /* for 3 or 4 objects write already the number of MASA directions */ + push_next_indice( hMetaData, sub( hQMetaData->no_directions, 1 ), MASA_TRANSP_BITS ); + } + } + ELSE + { + /* write the number of MASA transport channels */ + push_next_indice( hMetaData, sub( nchan_transport, 1 ), MASA_TRANSP_BITS ); + } hQMetaData->metadata_max_bits = sub( hQMetaData->metadata_max_bits, MASA_TRANSP_BITS ); move16(); } @@ -542,10 +581,14 @@ ivas_error ivas_masa_encode_fx( test(); IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) && EQ_32( ism_mode, ISM_MODE_NONE ) ) { - /* signal MASA_ISM_FORMAT to decoder */ - push_next_indice( hMetaData, 1, 1 ); - /* write reserved bit */ - push_next_indice( hMetaData, 0, MASA_HEADER_BITS - 1 ); + IF( GE_16( nchan_ism, 3 ) ) /* if 3 or 4 objects */ + { + push_next_indice( hMetaData, sub( 5, nchan_ism ), MASA_HEADER_BITS ); + } + ELSE + { + push_next_indice( hMetaData, 3, MASA_HEADER_BITS ); + } hQMetaData->metadata_max_bits = sub( hQMetaData->metadata_max_bits, MASA_HEADER_BITS ); move16(); } @@ -557,10 +600,16 @@ ivas_error ivas_masa_encode_fx( hQMetaData->metadata_max_bits = sub( hQMetaData->metadata_max_bits, MASA_HEADER_BITS ); move16(); } - /* write number of directions */ - push_next_indice( hMetaData, sub( hQMetaData->no_directions, 1 ), 1 ); - hQMetaData->metadata_max_bits = sub( hQMetaData->metadata_max_bits, 1 ); - move16(); + test(); + test(); + test(); + IF( !( EQ_32( ivas_format, MASA_ISM_FORMAT ) && EQ_32( ism_mode, ISM_MODE_NONE ) && GT_16( nchan_ism, 2 ) ) ) + { + /* write number of directions */ + push_next_indice( hMetaData, sub( hQMetaData->no_directions, 1 ), 1 ); + hQMetaData->metadata_max_bits = sub( hQMetaData->metadata_max_bits, 1 ); + move16(); + } /* write subframe mode */ IF( EQ_16( hQMetaData->q_direction[0].cfg.nblocks, 1 ) ) @@ -743,7 +792,7 @@ ivas_error ivas_masa_encode_fx( free( h_orig_metadata ); - ivas_qmetadata_enc_sid_encode_fx( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format ); + ivas_qmetadata_enc_sid_encode_fx( hMetaData, hQMetaData, masa_sid_descriptor, 0, ivas_format ); /* restore old values */ hMasa->config.numCodingBands = numCodingBands; @@ -762,6 +811,8 @@ ivas_error ivas_masa_encode_fx( return IVAS_ERR_OK; } + + /*-----------------------------------------------------------------------* * ivas_masa_estimate_energy_fx() * @@ -773,7 +824,7 @@ void ivas_masa_estimate_energy_fx( Word32 *data_fx[], /* i : Input audio channels Q(q_data) */ const Word16 input_frame, /* i : frame length */ const Word16 nchan_transport, /* i : number of MASA input/transport channels */ - Word16 q_data /* i : q for data_fx */ + Word16 q_data /* i : q for data_fx */ ) { Word32 Input_RealBuffer[MASA_MAX_TRANSPORT_CHANNELS][CLDFB_NO_CHANNELS_MAX]; @@ -786,7 +837,7 @@ void ivas_masa_estimate_energy_fx( move16(); Word16 q_buf; maxBin = extract_l( Mpy_32_32( 134217728 /*CLDFB_NO_CHANNELS_MAX / L_FRAME48k in Q31*/, input_frame ) ); - l_ts = idiv1616( input_frame, CLDFB_NO_COL_MAX ); + l_ts = shr( input_frame, CLDFB_NO_COL_MAX_LOG2 ); FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { @@ -946,7 +997,6 @@ ivas_error ivas_masa_enc_config_fx( } } - /* Inspect metadata for parameter changes that affect coding. */ detect_metadata_composition_fx( hMasa, &joinedSubframes, &coherencePresent, &isActualTwoDir ); @@ -987,12 +1037,7 @@ ivas_error ivas_masa_enc_config_fx( /* Setup importance weights for two-direction band selection. */ IF( EQ_16( hMasa->config.numberOfDirections, 2 ) ) { -#ifdef MSAN_FIX set32_fx( hMasa->data.importanceWeight_fx, ONE_IN_Q30 /*1.0f Q30*/, MASA_FREQUENCY_BANDS ); -#else - set32_fx( hMasa->data.importanceWeight_fx, ONE_IN_Q30 /*1.0f Q30*/, hMasa->config.numCodingBands ); -#endif - IF( EQ_16( hMasa->config.numCodingBands, 5 ) ) { @@ -1078,7 +1123,7 @@ ivas_error ivas_masa_enc_config_fx( } ELSE { - hQMetaData->q_direction[i].cfg.nblocks = 4; + hQMetaData->q_direction[i].cfg.nblocks = MAX_PARAM_SPATIAL_SUBFRAMES; } move16(); @@ -1162,10 +1207,8 @@ ivas_error ivas_masa_enc_config_fx( } } - masa_sample_rate_band_correction_fx( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, maxBand, (UWord8) GE_32( masa_total_brate, IVAS_384k ), NULL ); - IF( GE_16( hMasa->config.numTwoDirBands, hMasa->config.numCodingBands ) ) { hMasa->config.numTwoDirBands = hMasa->config.numCodingBands; @@ -1199,22 +1242,26 @@ ivas_error ivas_masa_enc_config_fx( test(); IF( EQ_16( st_ivas->hCPE[0]->element_mode, IVAS_CPE_DFT ) || LT_16( st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt, OMASA_STEREO_SW_CNT_MAX ) ) { - st_ivas->hMasa->data.hOmasaData->lp_noise_CPE_fx = st_ivas->hCPE[0]->hCoreCoder[0]->lp_noise_fx; /*Q8*/ + st_ivas->hMasa->data.hOmasaData->lp_noise_CPE_fx = extract_h( st_ivas->hCPE[0]->hCoreCoder[0]->lp_noise_32fx ); /*Q8*/ } ELSE { /* ( st_ivas->hCPE[0]->hCoreCoder[0]->lp_noise + st_ivas->hCPE[0]->hCoreCoder[1]->lp_noise ) / CPE_CHANNELS; */ - st_ivas->hMasa->data.hOmasaData->lp_noise_CPE_fx = extract_h( L_mac( L_mult( st_ivas->hCPE[0]->hCoreCoder[0]->lp_noise_fx, ONE_IN_Q14 ), st_ivas->hCPE[0]->hCoreCoder[1]->lp_noise_fx, ONE_IN_Q14 ) ); /*Q8*/ + st_ivas->hMasa->data.hOmasaData->lp_noise_CPE_fx = extract_h( L_mac( L_mult( extract_h( st_ivas->hCPE[0]->hCoreCoder[0]->lp_noise_32fx ), ONE_IN_Q14 ), extract_h( st_ivas->hCPE[0]->hCoreCoder[1]->lp_noise_32fx ), ONE_IN_Q14 ) ); /*Q8*/ } move16(); } + return error; } + + /*-----------------------------------------------------------------------* * ivas_masa_surrcoh_signicant() * * Determine if surrounding coherence is significant in this frame and should be encoded *-----------------------------------------------------------------------*/ + UWord8 ivas_masa_surrcoh_signicant_fx( Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Surround coherence Q31 */ Word32 diffuse_to_total_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Diffuse to total ratio Q31 */ @@ -1285,6 +1332,7 @@ UWord8 ivas_masa_surrcoh_signicant_fx( return 0; } + /*-----------------------------------------------------------------------* * Local functions *-----------------------------------------------------------------------*/ @@ -1481,7 +1529,7 @@ static void combine_freqbands_and_subframes_fx( move16(); hMeta->directional_meta[i].energy_ratio_fx[j][k] = - BASOP_Util_Divide3232_Scale_cadence( vecLen, L_add( energySum, EPSILON_FX ), &exp_diff ); /*exp_diff+vecLen_e-energySum_e*/ + BASOP_Util_Divide3232_Scale_newton( vecLen, L_add( energySum, EPSILON_FX ), &exp_diff ); /*exp_diff+vecLen_e-energySum_e*/ move32(); exp_diff = add( exp_diff, sub( vecLen_e, energySum_e ) ); hMeta->directional_meta[i].energy_ratio_fx[j][k] = @@ -1589,7 +1637,7 @@ static void combine_freqbands_and_subframes_fx( { energyRatioSum = BASOP_Util_Add_Mant32Exp( energyRatioSum, energyRatioSum_e, Mpy_32_32( energy[j][k], hMeta->directional_meta[i].energy_ratio_fx[j][k] ), add( energy_e[j][k], 1 ), &energyRatioSum_e ); // 31-energyRatioSum_e } - energyRatioTemp = BASOP_Util_Divide3232_Scale_cadence( energyRatioSum, L_add( energySum, EPSILON_FX ), &exp_diff ); + energyRatioTemp = BASOP_Util_Divide3232_Scale_newton( energyRatioSum, L_add( energySum, EPSILON_FX ), &exp_diff ); exp_diff = add( exp_diff, sub( energyRatioSum_e, energySum_e ) ); energyRatioTemp = L_shl( energyRatioTemp, sub( exp_diff, 1 ) ); // Q30 @@ -1611,6 +1659,7 @@ static void combine_freqbands_and_subframes_fx( * * *-------------------------------------------------------------------*/ + void ivas_masa_combine_directions_fx( MASA_ENCODER_HANDLE hMasa ) { @@ -1861,6 +1910,7 @@ void ivas_masa_combine_directions_fx( hMeta->directional_meta[1].energy_ratio_fx[j][i] = 0; // Q30 move16(); move16(); + hMeta->common_meta.diffuse_to_total_ratio_fx[j][i] = L_sub( ONE_IN_Q30, hMeta->directional_meta[0].energy_ratio_fx[j][i] ); // Q30 IF( computeCoherence ) { @@ -1953,7 +2003,7 @@ static void move_metadata_to_qmetadata_fx( move16(); move16(); move16(); - numSf = 4; + numSf = MAX_PARAM_SPATIAL_SUBFRAMES; if ( EQ_16( hMasa->config.joinedSubframes, TRUE ) ) { numSf = 1; @@ -2108,6 +2158,8 @@ static void detect_metadata_composition_fx( { FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { + hMeta->directional_meta[0].spherical_index[sf][band] = hMeta->directional_meta[1].spherical_index[sf][band]; + move16(); hMeta->directional_meta[0].azimuth_fx[sf][band] = hMeta->directional_meta[1].azimuth_fx[sf][band]; /*q22*/ hMeta->directional_meta[0].elevation_fx[sf][band] = hMeta->directional_meta[1].elevation_fx[sf][band]; /*q22*/ hMeta->directional_meta[0].energy_ratio_fx[sf][band] = hMeta->directional_meta[1].energy_ratio_fx[sf][band]; /*q30*/ @@ -2232,7 +2284,8 @@ static void compensate_energy_ratios_fx( UWord8 numDirs; hMeta = &( hMasa->masaMetadata ); - numDirs = (UWord8) add( hMeta->descriptive_meta.numberOfDirections, 1 ); + numDirs = hMasa->config.numberOfDirections; + move16(); FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { @@ -2268,13 +2321,13 @@ static void compensate_energy_ratios_fx( FOR( dir = 0; dir < numDirs; dir++ ) { hMeta->directional_meta[dir].energy_ratio_fx[sf][band] = - BASOP_Util_Divide3232_Scale_cadence( hMeta->directional_meta[dir].energy_ratio_fx[sf][band], ratioSum, &exp_diff ); + BASOP_Util_Divide3232_Scale_newton( hMeta->directional_meta[dir].energy_ratio_fx[sf][band], ratioSum, &exp_diff ); move32(); hMeta->directional_meta[dir].energy_ratio_fx[sf][band] = L_shl( hMeta->directional_meta[dir].energy_ratio_fx[sf][band], sub( exp_diff, Q1 ) ); // Q30 move32(); } hMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] = - BASOP_Util_Divide3232_Scale_cadence( hMeta->common_meta.diffuse_to_total_ratio_fx[sf][band], ratioSum, &exp_diff ); + BASOP_Util_Divide3232_Scale_newton( hMeta->common_meta.diffuse_to_total_ratio_fx[sf][band], ratioSum, &exp_diff ); move32(); hMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] = L_shl( hMeta->common_meta.diffuse_to_total_ratio_fx[sf][band], sub( exp_diff, Q1 ) ); // Q30 move32(); @@ -2285,6 +2338,7 @@ static void compensate_energy_ratios_fx( return; } + /* If the bit budget is very low, reduce metadata further to either 1 subframe and 5 bands, or 1 band and 4 subframes, based on which works better */ static void reduce_metadata_further_fx( MASA_ENCODER_HANDLE hMasa, @@ -2301,10 +2355,12 @@ static void reduce_metadata_further_fx( UWord8 computeCoherence; Word32 onset_filter; Word16 onset_filter_e, exp; - Word32 bandEnergy; + Word64 bandEnergy; + Word32 bandEnergy32; + Word16 bandEnergy_exp, shift; UWord8 mergeOverFreqBands; Word32 meanRatio; - Word16 tmp, tmp2; + Word16 tmp, tmp2, q_totalEnergySum; numCodingBands = hMasa->config.numCodingBands; test(); @@ -2375,6 +2431,7 @@ static void reduce_metadata_further_fx( tmp2 = s_min( 32, tmp2 ); totalEnergySum = W_extract_h( W_shl( W_tmp, tmp2 ) ); tmp2 = sub( tmp2, 32 ); + q_totalEnergySum = add( hMasa->data.q_energy, tmp2 ); /* Determine onsets */ hMasa->data.onset_detector_1_fx = Mpy_32_32( hMasa->data.onset_detector_1_fx, LOWBITRATE_ONSET_ALPHA_Q31 ); @@ -2382,12 +2439,17 @@ static void reduce_metadata_further_fx( tmp = hMasa->data.q_onset_detector; move16(); - IF( BASOP_Util_Cmp_Mant32Exp( hMasa->data.onset_detector_1_fx, sub( 31, hMasa->data.q_onset_detector ), totalEnergySum, sub( 31, hMasa->data.q_energy ) ) < 0 ) + IF( BASOP_Util_Cmp_Mant32Exp( hMasa->data.onset_detector_1_fx, sub( 31, hMasa->data.q_onset_detector ), totalEnergySum, sub( 31, q_totalEnergySum ) ) < 0 ) { hMasa->data.onset_detector_1_fx = totalEnergySum; // hMasa->data.q_energy hMasa->data.q_onset_detector = add( hMasa->data.q_energy, tmp2 ); move32(); move16(); + + shift = norm_l( hMasa->data.onset_detector_2_fx ); + hMasa->data.onset_detector_2_fx = L_shl( hMasa->data.onset_detector_2_fx, shift ); + move32(); + tmp = add( tmp, shift ); } IF( LT_16( tmp, hMasa->data.q_onset_detector ) ) { @@ -2408,7 +2470,7 @@ static void reduce_metadata_further_fx( IF( hMasa->data.onset_detector_1_fx != 0 ) { - onset_filter = L_max( BASOP_Util_Divide3232_Scale_cadence( hMasa->data.onset_detector_2_fx, hMasa->data.onset_detector_1_fx, &onset_filter_e ), 0 ); + onset_filter = L_max( BASOP_Util_Divide3232_Scale_newton( hMasa->data.onset_detector_2_fx, hMasa->data.onset_detector_1_fx, &onset_filter_e ), 0 ); IF( BASOP_Util_Cmp_Mant32Exp( onset_filter, onset_filter_e, ONE_IN_Q31, 0 ) > 0 ) { @@ -2435,19 +2497,22 @@ static void reduce_metadata_further_fx( Word32 bandRatio; // threshold = totalEnergySum / ( MAX_PARAM_SPATIAL_SUBFRAMES * LOWBITRATE_NUM_BANDS ) * 0.5f; /* Average energy multiplied with energy ratio of 0.5f */ - threshold = BASOP_Util_Divide3232_Scale_cadence( totalEnergySum, ( MAX_PARAM_SPATIAL_SUBFRAMES * LOWBITRATE_NUM_BANDS ) * 2, &exp ); /* Average energy multiplied with energy ratio of 0.5f */ + threshold = BASOP_Util_Divide3232_Scale_newton( totalEnergySum, ( MAX_PARAM_SPATIAL_SUBFRAMES * LOWBITRATE_NUM_BANDS ) * 2, &exp ); /* Average energy multiplied with energy ratio of 0.5f */ exp = add( exp, sub( sub( 31, add( hMasa->data.q_energy, tmp2 ) ), 31 ) ); bandRatio = hqmetadata->q_direction[0].band_data[band].energy_ratio_fx[0]; // Q30 move32(); bandEnergy = 0; - move32(); + move64(); FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { - bandEnergy = L_add( bandEnergy, energy[sf][band] ); + bandEnergy = W_mac_32_32( bandEnergy, energy[sf][band], 1 ); } + shift = W_norm( bandEnergy ); + bandEnergy32 = W_extract_h( W_shl( bandEnergy, shift ) ); + bandEnergy_exp = sub( 63, add( add( hMasa->data.q_energy, 1 ), shift ) ); - IF( BASOP_Util_Cmp_Mant32Exp( Mpy_32_32( L_shr( bandEnergy, 2 ), bandRatio ), sub( 31 + 1, hMasa->data.q_energy ), threshold, exp ) > 0 ) + IF( BASOP_Util_Cmp_Mant32Exp( Mpy_32_32( L_shr( bandEnergy32, 2 ), bandRatio ), add( 1, bandEnergy_exp ), threshold, exp ) > 0 ) { selectedBand = band; move16(); @@ -2456,19 +2521,23 @@ static void reduce_metadata_further_fx( } /* Determine if to merge over frequency instead of time */ - meanRatio = 0; - move32(); + W_tmp = 0; + move64(); FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { FOR( band = 0; band < numCodingBands; band++ ) { - meanRatio = L_add( meanRatio, Mpy_32_32( hqmetadata->q_direction[0].band_data[band].energy_ratio_fx[sf], energy[sf][band] ) ); // hMasa->data.q_energy - 1 + W_tmp = W_mac_32_16( W_tmp, Mpy_32_32( hqmetadata->q_direction[0].band_data[band].energy_ratio_fx[sf], energy[sf][band] ), 1 ); // hMasa->data.q_energy } } + shift = W_norm( W_tmp ); + meanRatio = W_extract_h( W_shl( W_tmp, shift ) ); // Q:sub( add( hMasa->data.q_energy, shift ), 32 ) + shift = sub( 31, sub( add( hMasa->data.q_energy, shift ), 32 ) ); + IF( totalEnergySum != 0 ) { - meanRatio = BASOP_Util_Divide3232_Scale_cadence( meanRatio, totalEnergySum, &exp ); - exp = add( add( exp, 1 ), tmp2 ); // 31 - (hMasa->data.q_energy - 1) - 31 - hMasa->data.q_energy - tmp2 => 1 + tmp2 + meanRatio = BASOP_Util_Divide3232_Scale_newton( meanRatio, totalEnergySum, &exp ); + exp = add( exp, sub( shift, sub( 31, add( hMasa->data.q_energy, tmp2 ) ) ) ); // exp + (shift - (31 - hMasa->data.q_energy - tmp2)) => 1 + tmp2 } ELSE { @@ -2580,11 +2649,8 @@ static void reduce_metadata_further_fx( /* Copy spread coherence to the rest of subframes for the coherence coding algorithm. */ FOR( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { - FOR( band = 0; band < numCodingBands; band++ ) - { - hqmetadata->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hqmetadata->q_direction[0].coherence_band_data[band].spread_coherence[0]; // Q0 - move16(); - } + hqmetadata->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hqmetadata->q_direction[0].coherence_band_data[band].spread_coherence[0]; // Q0 + move16(); } /* Surround coherence is already merged through time */ @@ -2708,7 +2774,7 @@ static Word16 encode_lfe_to_total_energy_ratio_fx( FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { // log2LFEratio[i] = log2f( max( 0.001f, hMasa->data.lfeToTotalEnergyRatio[i] ) ); - maxVal = 2147484 /* 0.001f in Q31 */; + maxVal = INV_1000_Q31; move32(); maxVal_e = 0; move16(); @@ -2831,7 +2897,7 @@ static Word16 encode_lfe_to_total_energy_ratio_fx( IF( VQLevels > 0 ) { - lfeToTotalEnergyRatioIndices[2] = vquant_ivas_fx( log2LFEratio, 0, xqv, McMASA_LFEGain_vectors_fx_q25, 4, VQLevels ); + lfeToTotalEnergyRatioIndices[2] = vquant_ivas_fx( log2LFEratio, 0, xqv, McMASA_LFEGain_vectors_fx, 4, VQLevels ); move16(); } } @@ -2872,6 +2938,7 @@ static Word16 encode_lfe_to_total_energy_ratio_fx( * * Reconfigure IVAS MASA encoder *-------------------------------------------------------------------*/ + void ivas_masa_enc_reconfigure_fx( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) @@ -2880,7 +2947,7 @@ void ivas_masa_enc_reconfigure_fx( Word16 sce_id, cpe_id; Word32 ivas_total_brate; Word32 ism_total_brate; - Word32 tmp_br, tmp_mod; + Word32 tmp_br; ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; move32(); @@ -2901,7 +2968,7 @@ void ivas_masa_enc_reconfigure_fx( IF( NE_32( ivas_total_brate, st_ivas->hEncoderConfig->last_ivas_total_brate ) ) { - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &tmp_br, &tmp_mod, 0 ); + tmp_br = Mpy_32_32_r( ivas_total_brate, one_by_q_level[st_ivas->nchan_transport] ); FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { copy_encoder_config_fx( st_ivas, st_ivas->hSCE[sce_id]->hCoreCoder[0], 0 ); @@ -2951,11 +3018,13 @@ void ivas_masa_enc_reconfigure_fx( return; } + /*-------------------------------------------------------------------* * average_masa_metadata() * * Average MASA metadata frame subframe contents: applies aggregation over time *-------------------------------------------------------------------*/ + static void average_masa_metadata_fx( MASA_METADATA_FRAME *hMeta, Word32 energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /*i Q(31 - energy_e) */ @@ -3118,6 +3187,7 @@ static void average_masa_metadata_fx( * * Copy MASA metadata frame subframe contents *-------------------------------------------------------------------*/ + static void copy_masa_metadata_subframe_fx( const MASA_METADATA_HANDLE hMetaFrom, /* i : MASA frame metdata to be copied */ const UWord8 sfFrom, /* i : subframe index of the copy source */ @@ -3126,10 +3196,16 @@ static void copy_masa_metadata_subframe_fx( ) { UWord8 dir; + UWord8 band; /* directional metadata */ FOR( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) { + FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + hMetaTo->directional_meta[dir].spherical_index[sfTo][band] = hMetaFrom->directional_meta[dir].spherical_index[sfFrom][band]; + move16(); + } Copy32( hMetaFrom->directional_meta[dir].azimuth_fx[sfFrom], hMetaTo->directional_meta[dir].azimuth_fx[sfTo], MASA_FREQUENCY_BANDS ); // Q22 Copy32( hMetaFrom->directional_meta[dir].elevation_fx[sfFrom], hMetaTo->directional_meta[dir].elevation_fx[sfTo], MASA_FREQUENCY_BANDS ); // Q22 Copy32( hMetaFrom->directional_meta[dir].energy_ratio_fx[sfFrom], hMetaTo->directional_meta[dir].energy_ratio_fx[sfTo], MASA_FREQUENCY_BANDS ); // Q30 @@ -3144,11 +3220,13 @@ static void copy_masa_metadata_subframe_fx( return; } + /*-------------------------------------------------------------------* * copy_masa_metadata() * * Copy MASA metada frame contents *-------------------------------------------------------------------*/ + static void copy_masa_metadata_fx( const MASA_METADATA_HANDLE hMetaFrom, /* i : MASA frame metadata to be copied */ MASA_METADATA_HANDLE hMetaTo /* o : MASA frame metadata copy destination */ @@ -3187,6 +3265,7 @@ static void copy_masa_metadata_fx( return; } + /*-------------------------------------------------------------------* * are_masa_subframes_similar() * @@ -3302,6 +3381,7 @@ static UWord8 are_masa_subframes_similar_fx( } } + /*-------------------------------------------------------------------* * detect_framing_async() * @@ -3309,6 +3389,7 @@ static UWord8 are_masa_subframes_similar_fx( * Analysis result is stored in hMasa->data.sync_state, and * potentially hMasa->masaMetadata is modified *-------------------------------------------------------------------*/ + static void detect_framing_async_fx( MASA_ENCODER_HANDLE hMasa /* i/o: MASA encoder structure */ ) @@ -3454,12 +3535,14 @@ static void detect_framing_async_fx( return; } + /*-------------------------------------------------------------------* * masa_metadata_direction_alignment() * * In 2dir MASA metadata, determine the ordering of the directional * fields such that the azi/ele change across time is minimized. *-------------------------------------------------------------------*/ + static void masa_metadata_direction_alignment_fx( MASA_ENCODER_HANDLE hMasa /* i/o: MASA encoder handle */ ) @@ -3711,11 +3794,13 @@ static void masa_metadata_direction_alignment_fx( return; } + /*-------------------------------------------------------------------* * ivas_merge_masa_metadata() * * *-------------------------------------------------------------------*/ + void ivas_merge_masa_metadata_fx( MASA_ENCODER_HANDLE hMasa, /* i/o: MASA enc handle. source for MASA metadata and combined metadata will be here */ OMASA_SPATIAL_META_HANDLE hOMasaMeta /* i : ISM-object metadata to be merged with the MASA metadata */ @@ -3736,6 +3821,7 @@ void ivas_merge_masa_metadata_fx( Word32 eneBand_fx; /*eneBand_e*/ Word16 eneBand_e; Word32 energyMerged_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; /*energyMerged_e*/ + OMASA_ENCODER_ENERGY_HANDLE hOmasaEnergy = hMasa->data.hOmasaData->hOmasaEnergy; Word32 temp1 /*temp1_e*/, temp2 /*temp2_e*/; Word16 temp1_e, temp2_e; @@ -3747,7 +3833,7 @@ void ivas_merge_masa_metadata_fx( } ELSE { - numSf = 4; + numSf = MAX_PARAM_SPATIAL_SUBFRAMES; } move16(); move16(); @@ -3779,7 +3865,7 @@ void ivas_merge_masa_metadata_fx( eneBand_e = hMasa->data.energy_e[sf][band]; move32(); move16(); - energyMerged_fx[sf][band] = BASOP_Util_Add_Mant32Exp( eneBand_fx, eneBand_e, hMasa->data.hOmasaData->energy_ism_fx[sf][band], hMasa->data.hOmasaData->energy_ism_fx_e[sf][band], &energyMerged_e[sf][band] ); + energyMerged_fx[sf][band] = BASOP_Util_Add_Mant32Exp( eneBand_fx, eneBand_e, hOmasaEnergy->energy_ism_fx[sf][band], hOmasaEnergy->energy_ism_fx_e[sf][band], &energyMerged_e[sf][band] ); move32(); /* Compute weights */ @@ -3805,8 +3891,8 @@ void ivas_merge_masa_metadata_fx( total_diff_nrg_e = add( eneBand_e, 1 ); /* criterion is mean of ISM ratio and new ratio */ - temp1 = BASOP_Util_Add_Mant32Exp( L_add( EPSILON_FX, eneBand_fx ), eneBand_e, hMasa->data.hOmasaData->energy_ism_fx[sf][band], hMasa->data.hOmasaData->energy_ism_fx_e[sf][band], &temp1_e ); /* EPSILON + eneBand + hMasa->data.hOmasaData->energy_ism[sf][band]*/ - temp2 = L_deposit_h( BASOP_Util_Divide3232_Scale( total_diff_nrg_fx, temp1, &temp2_e ) ); /*temp2_e*/ /*total_diff_nrg / ( EPSILON + eneBand + hMasa->data.hOmasaData->energy_ism[sf][band] )*/ + temp1 = BASOP_Util_Add_Mant32Exp( L_add( EPSILON_FX, eneBand_fx ), eneBand_e, hOmasaEnergy->energy_ism_fx[sf][band], hOmasaEnergy->energy_ism_fx_e[sf][band], &temp1_e ); /* EPSILON + eneBand + hMasa->data.hOmasaData->energy_ism[sf][band]*/ + temp2 = L_deposit_h( BASOP_Util_Divide3232_Scale( total_diff_nrg_fx, temp1, &temp2_e ) ); /*temp2_e*/ /*total_diff_nrg / ( EPSILON + eneBand + hMasa->data.hOmasaData->energy_ism[sf][band] )*/ temp2_e = add( temp2_e, sub( total_diff_nrg_e, temp1_e ) ); IF( temp2_e < 0 ) { @@ -3814,11 +3900,11 @@ void ivas_merge_masa_metadata_fx( temp2_e = 0; move16(); } - temp2 = L_sub( L_shl_sat( 1, sub( 31, temp2_e ) ), temp2 ); /*( 1.0f - total_diff_nrg / ( EPSILON + eneBand + hMasa->data.hOmasaData->energy_ism[sf][band] ) )*/ - temp2 = BASOP_Util_Add_Mant32Exp( hOMasaMeta->directional_meta[0].energy_ratio_fx[sf][band], 1, temp2, temp2_e, &temp2_e ); /*( 1.0f - total_diff_nrg / ( EPSILON + eneBand + hMasa->data.hOmasaData->energy_ism[sf][band] ) )*/ - energyTimesRatioISM_fx = Mpy_32_32( L_shr( temp2, 1 ), hMasa->data.hOmasaData->energy_ism_fx[sf][band] ); /*energyTimesRatioISM_e*/ - energyTimesRatioISM_e = add( temp2_e, hMasa->data.hOmasaData->energy_ism_fx_e[sf][band] ); - /*energyTimesRatioISM = ( hOMasaMeta->directional_meta[0].energy_ratio[sf][band] + ( 1.0f - total_diff_nrg / ( EPSILON + eneBand + hMasa->data.hOmasaData->energy_ism[sf][band] ) ) ) / 2.0f * hMasa->data.hOmasaData->energy_ism[sf][band];*/ + temp2 = L_sub( L_shl_sat( 1, sub( 31, temp2_e ) ), temp2 ); /*( 1.0f - total_diff_nrg / ( EPSILON + eneBand + hOmasaEnergy->energy_ism[sf][band] ) )*/ + temp2 = BASOP_Util_Add_Mant32Exp( hOMasaMeta->directional_meta[0].energy_ratio_fx[sf][band], 1, temp2, temp2_e, &temp2_e ); /*( 1.0f - total_diff_nrg / ( EPSILON + eneBand + hOmasaEnergy->energy_ism[sf][band] ) )*/ + energyTimesRatioISM_fx = Mpy_32_32( L_shr( temp2, 1 ), hOmasaEnergy->energy_ism_fx[sf][band] ); /*energyTimesRatioISM_e*/ + energyTimesRatioISM_e = add( temp2_e, hOmasaEnergy->energy_ism_fx_e[sf][band] ); + /*energyTimesRatioISM = ( hOMasaMeta->directional_meta[0].energy_ratio[sf][band] + ( 1.0f - total_diff_nrg / ( EPSILON + eneBand + hOmasaEnergy->energy_ism[sf][band] ) ) ) / 2.0f * hOmasaEnergy->energy_ism[sf][band];*/ /* Determine combined metadata based on the weights */ merge_dest = -1; @@ -3853,7 +3939,7 @@ void ivas_merge_masa_metadata_fx( dir_sum_e = temp2_e; move32(); move16(); - /*dir_sum = 1.0f - total_diff_nrg / ( EPSILON + eneBand + hMasa->data.hOmasaData->energy_ism[sf][band] )*/ + /*dir_sum = 1.0f - total_diff_nrg / ( EPSILON + eneBand + hOmasaEnergy->energy_ism[sf][band] )*/ IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( dir_sum_fx, dir_sum_e, hOMasaMeta->directional_meta[0].energy_ratio_fx[sf][band], 1 ), -1 ) ) { hMeta->directional_meta[merge_dest].energy_ratio_fx[sf][band] = L_shl( dir_sum_fx, sub( dir_sum_e, 1 ) ); /*scaling to Q30*/ @@ -3914,6 +4000,8 @@ void ivas_merge_masa_metadata_fx( return; } + + static void quantize_ratio_ism_vector_ivas_fx( const Word16 *ratio_ism, /* ratio_ism_e */ Word16 ratio_ism_e, @@ -3983,9 +4071,7 @@ static void quantize_ratio_ism_vector_ivas_fx( FOR( i = 0; i < no_ism_loc; i++ ) { - idx[i] = mult( ratio_ism_loc[i], max_sum_idx ); // exponent : ratio_ism_e + 15 - move16(); - idx[i] = shl( idx[i], sub( add( ratio_ism_e, 15 ), 15 ) ); // Q0 + idx[i] = extract_l( L_shr( L_mult0( ratio_ism_loc[i], max_sum_idx ), sub( 15, ratio_ism_e ) ) ); // Q0 move16(); part_idx_sum = add( part_idx_sum, idx[i] ); @@ -4101,6 +4187,8 @@ static void quantize_ratio_ism_vector_ivas_fx( return; } + + static Word16 index_slice_enum_fx( const Word16 *ratio_ism_idx, const Word16 nchan_ism ) @@ -4166,6 +4254,8 @@ static void transform_difference_index_ivas_fx( return; } + + static void transform_index_and_GR_encode_ivas_fx( Word16 *diff_idx, /* i : differenc eindex to encode */ const Word16 len, /* i : input length */ @@ -4187,6 +4277,8 @@ static void transform_index_and_GR_encode_ivas_fx( return; } + + static Word16 try_differential_fx( const Word16 numCodingBands, const Word32 *masa_to_total_energy_ratio, /* Q30 */ @@ -4242,6 +4334,7 @@ static Word16 try_differential_fx( return nbits0; } + static void differential_coding_first_subframe_ivas_fx( BSTR_ENC_HANDLE hMetaData, const Word32 *masa_to_total_energy_ratio, // Q30 @@ -4280,6 +4373,8 @@ static void differential_coding_first_subframe_ivas_fx( return; } + + static void independent_coding_ratio_ism_idx_fx( Word16 ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], /* i : ISM ratios */ const Word32 *masa_to_total_energy_ratio, /* i : MASA to total ratios, Q30 */ @@ -4303,6 +4398,7 @@ static void independent_coding_ratio_ism_idx_fx( return; } + static void remove_sep_obj_fx( Word16 *diff_idx, /* i/o: array of difference of indexes */ const Word16 nchan_ism, /* i : number of objects */ @@ -4320,6 +4416,7 @@ static void remove_sep_obj_fx( return; } + static void estimate_bits_subband_ism_ratio_fx( const Word16 *ratio_ism_idx, const Word16 *ratio_ism_idx_ref, /* ( i/o ) */ @@ -4364,6 +4461,7 @@ static void estimate_bits_subband_ism_ratio_fx( return; } + static Word16 encode_ratio_ism_subframe_fx( Word16 ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], const Word16 nchan_ism, @@ -4630,6 +4728,8 @@ static Word16 encode_ratio_ism_subframe_fx( return nbits; } + + static void ivas_encode_masaism_metadata_fx( MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ @@ -4646,7 +4746,9 @@ static void ivas_encode_masaism_metadata_fx( UWord8 numCodingBands; UWord8 numSf; Word16 brange[2]; - Word32 eneBand; + Word64 eneBand; + Word32 eneBand32; + Word16 eneBand_exp, shift; Word16 bin; Word16 obj; Word16 bits_ism[MAX_NUM_OBJECTS]; @@ -4655,11 +4757,11 @@ static void ivas_encode_masaism_metadata_fx( UWord16 index_theta, index_phi; Word16 ratio_ism_fx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; Word16 ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; - Word16 step; Word32 energy_ism, energy_ism_ind[MAX_NUM_OBJECTS]; Word16 tmp, rotate, energy_ism_e, energy_ism_ind_e[MAX_NUM_OBJECTS]; Word16 n_ism_tmp, i; OMASA_ENCODER_DATA_HANDLE hOmasaData = hMasa->data.hOmasaData; + OMASA_ENCODER_ENERGY_HANDLE hOmasaEnergy = hOmasaData->hOmasaEnergy; Word16 nbands_work; Word32 L_tmp; Word16 L_tmp_e; @@ -4680,9 +4782,10 @@ static void ivas_encode_masaism_metadata_fx( move16(); FOR( i = 0; i < omasa_nbands; i++ ) { - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_e, hOmasaData->energy_ism_fx[sf][i], hOmasaData->energy_ism_fx_e[sf][i], &L_tmp_e ); + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_e, hOmasaEnergy->energy_ism_fx[sf][i], hOmasaEnergy->energy_ism_fx_e[sf][i], &L_tmp_e ); } - /* if ( sum_f( hOmasaData->energy_ism[sf], omasa_nbands ) == 0.0f ) */ + + /* if ( sum_f( hOmasaEnergy->energy_ism[sf], omasa_nbands ) == 0.0f ) */ IF( L_tmp == 0 ) { hOmasaData->masa_to_total_energy_ratio_fx[sf][0] = ONE_IN_Q30; // 1.0f in Q30 @@ -4695,11 +4798,14 @@ static void ivas_encode_masaism_metadata_fx( eneBand = 0; move16(); move16(); - move32(); + move64(); FOR( bin = brange[0]; bin < brange[1]; bin++ ) { - eneBand = L_add( eneBand, hMasa->data.energy_fx[sf][bin] ); // hMasa->data.q_energy + eneBand = W_mac_32_32( eneBand, hMasa->data.energy_fx[sf][bin], 1 ); // hMasa->data.q_energy + 1 } + shift = W_norm( eneBand ); + eneBand32 = W_extract_h( W_shl( eneBand, shift ) ); + eneBand_exp = sub( 63, add( add( hMasa->data.q_energy, 1 ), shift ) ); energy_ism = 0; energy_ism_e = 0; @@ -4715,7 +4821,8 @@ static void ivas_encode_masaism_metadata_fx( FOR( band = 0; band < omasa_nbands; band++ ) { - energy_ism = BASOP_Util_Add_Mant32Exp( energy_ism, energy_ism_e, hOmasaData->energy_ism_fx[sf][band], hOmasaData->energy_ism_fx_e[sf][band], &energy_ism_e ); + energy_ism = BASOP_Util_Add_Mant32Exp( energy_ism, energy_ism_e, hOmasaEnergy->energy_ism_fx[sf][band], hOmasaEnergy->energy_ism_fx_e[sf][band], &energy_ism_e ); + FOR( obj = 0; obj < nchan_ism; obj++ ) { @@ -4726,19 +4833,19 @@ static void ivas_encode_masaism_metadata_fx( FOR( obj = 0; obj < nchan_ism; obj++ ) { - hOmasaData->energy_ratio_ism_fx[sf][0][obj] = BASOP_Util_Divide3232_Scale_cadence( energy_ism_ind[obj], energy_ism, &L_tmp_e ); + hOmasaEnergy->energy_ratio_ism_fx[sf][0][obj] = BASOP_Util_Divide3232_Scale_newton( energy_ism_ind[obj], energy_ism, &L_tmp_e ); move32(); L_tmp_e = add( L_tmp_e, sub( energy_ism_ind_e[obj], energy_ism_e ) ); /* Scaling to Q30 */ - hOmasaData->energy_ratio_ism_fx[sf][0][obj] = L_shl( hOmasaData->energy_ratio_ism_fx[sf][0][obj], sub( L_tmp_e, 1 ) ); // Q30 + hOmasaEnergy->energy_ratio_ism_fx[sf][0][obj] = L_shl( hOmasaEnergy->energy_ratio_ism_fx[sf][0][obj], sub( L_tmp_e, 1 ) ); // Q30 move32(); } - L_tmp = BASOP_Util_Add_Mant32Exp( eneBand, sub( 31, hMasa->data.q_energy ), energy_ism, energy_ism_e, &L_tmp_e ); + L_tmp = BASOP_Util_Add_Mant32Exp( eneBand32, eneBand_exp, energy_ism, energy_ism_e, &L_tmp_e ); IF( L_tmp != 0 ) { - hOmasaData->masa_to_total_energy_ratio_fx[sf][0] = BASOP_Util_Divide3232_Scale_cadence( eneBand, L_tmp, &tmp ); + hOmasaData->masa_to_total_energy_ratio_fx[sf][0] = BASOP_Util_Divide3232_Scale_newton( eneBand32, L_tmp, &tmp ); move32(); - tmp = add( tmp, sub( sub( 31, hMasa->data.q_energy ), L_tmp_e ) ); + tmp = add( tmp, sub( eneBand_exp, L_tmp_e ) ); /* Scaling to Q30 */ hOmasaData->masa_to_total_energy_ratio_fx[sf][0] = L_shl( hOmasaData->masa_to_total_energy_ratio_fx[sf][0], sub( tmp, 1 ) ); // Q30 move32(); @@ -4768,11 +4875,12 @@ static void ivas_encode_masaism_metadata_fx( } FOR( sf = 0; sf < omasa_nblocks; sf++ ) { - energy_ism = BASOP_Util_Add_Mant32Exp( energy_ism, energy_ism_e, hOmasaData->energy_ism_fx[sf][band], hOmasaData->energy_ism_fx_e[sf][band], &energy_ism_e ); + energy_ism = BASOP_Util_Add_Mant32Exp( energy_ism, energy_ism_e, hOmasaEnergy->energy_ism_fx[sf][band], hOmasaEnergy->energy_ism_fx_e[sf][band], &energy_ism_e ); + FOR( obj = 0; obj < nchan_ism; obj++ ) { - L_tmp = Mpy_32_32( hOmasaData->energy_ism_fx[sf][band], hOmasaData->energy_ratio_ism_fx[sf][band][obj] ); // Q = (31 - hOmasaData->energy_ism_fx_e[sf][band]) + Q30 - 31 - L_tmp_e = add( 1, hOmasaData->energy_ism_fx_e[sf][band] ); + L_tmp = Mpy_32_32( hOmasaEnergy->energy_ism_fx[sf][band], hOmasaEnergy->energy_ratio_ism_fx[sf][band][obj] ); // Q = (31 - hOmasaEnergy->energy_ism_fx_e[sf][band]) + Q30 - 31 + L_tmp_e = add( 1, hOmasaEnergy->energy_ism_fx_e[sf][band] ); energy_ism_ind[obj] = BASOP_Util_Add_Mant32Exp( energy_ism_ind[obj], energy_ism_ind_e[obj], L_tmp, L_tmp_e, &energy_ism_ind_e[obj] ); move32(); } @@ -4787,11 +4895,11 @@ static void ivas_encode_masaism_metadata_fx( { FOR( obj = 0; obj < nchan_ism; obj++ ) { - hOmasaData->energy_ratio_ism_fx[0][band][obj] = BASOP_Util_Divide3232_Scale_cadence( energy_ism_ind[obj], energy_ism, &L_tmp_e ); + hOmasaEnergy->energy_ratio_ism_fx[0][band][obj] = BASOP_Util_Divide3232_Scale_newton( energy_ism_ind[obj], energy_ism, &L_tmp_e ); move32(); L_tmp_e = add( L_tmp_e, sub( energy_ism_ind_e[obj], energy_ism_e ) ); /* Scaling to Q30 */ - hOmasaData->energy_ratio_ism_fx[0][band][obj] = L_shl( hOmasaData->energy_ratio_ism_fx[0][band][obj], sub( L_tmp_e, 1 ) ); // Q30 + hOmasaEnergy->energy_ratio_ism_fx[0][band][obj] = L_shl( hOmasaEnergy->energy_ratio_ism_fx[0][band][obj], sub( L_tmp_e, 1 ) ); // Q30 move32(); } brange[0] = hMasa->data.band_mapping[band]; @@ -4800,21 +4908,24 @@ static void ivas_encode_masaism_metadata_fx( move16(); eneBand = 0; - move32(); + move64(); FOR( sf = 0; sf < omasa_nblocks; sf++ ) { FOR( bin = brange[0]; bin < brange[1]; bin++ ) { - eneBand = L_add( eneBand, hMasa->data.energy_fx[sf][bin] ); // hMasa->data.q_energy + eneBand = W_mac_32_32( eneBand, hMasa->data.energy_fx[sf][bin], 1 ); // hMasa->data.q_energy + 1 } } + shift = W_norm( eneBand ); + eneBand32 = W_extract_h( W_shl( eneBand, shift ) ); + eneBand_exp = sub( 63, add( add( hMasa->data.q_energy, 1 ), shift ) ); - L_tmp = BASOP_Util_Add_Mant32Exp( eneBand, sub( 31, hMasa->data.q_energy ), energy_ism, energy_ism_e, &L_tmp_e ); + L_tmp = BASOP_Util_Add_Mant32Exp( eneBand32, eneBand_exp, energy_ism, energy_ism_e, &L_tmp_e ); IF( L_tmp != 0 ) { - hOmasaData->masa_to_total_energy_ratio_fx[0][band] = BASOP_Util_Divide3232_Scale_cadence( eneBand, L_tmp, &tmp ); + hOmasaData->masa_to_total_energy_ratio_fx[0][band] = BASOP_Util_Divide3232_Scale_newton( eneBand32, L_tmp, &tmp ); move32(); - tmp = add( tmp, sub( sub( 31, hMasa->data.q_energy ), L_tmp_e ) ); + tmp = add( tmp, sub( eneBand_exp, L_tmp_e ) ); /* Scaling to Q30 */ hOmasaData->masa_to_total_energy_ratio_fx[0][band] = L_shl( hOmasaData->masa_to_total_energy_ratio_fx[0][band], sub( tmp, 1 ) ); // Q30 move32(); @@ -4833,7 +4944,7 @@ static void ivas_encode_masaism_metadata_fx( FOR( obj = 0; obj < nchan_ism; obj++ ) { - hOmasaData->energy_ratio_ism_fx[0][band][obj] = hOmasaData->energy_ratio_ism_fx[0][nbands_work - 1][obj]; + hOmasaEnergy->energy_ratio_ism_fx[0][band][obj] = hOmasaEnergy->energy_ratio_ism_fx[0][nbands_work - 1][obj]; move32(); } } @@ -4844,7 +4955,7 @@ static void ivas_encode_masaism_metadata_fx( { FOR( band = 0; band < nbands_work; band++ ) { - IF( hOmasaData->energy_ism_fx[sf][band] == 0 ) + IF( hOmasaEnergy->energy_ism_fx[sf][band] == 0 ) { hOmasaData->masa_to_total_energy_ratio_fx[sf][band] = ONE_IN_Q30; move32(); @@ -4857,18 +4968,21 @@ static void ivas_encode_masaism_metadata_fx( move16(); eneBand = 0; - move32(); + move64(); FOR( bin = brange[0]; bin < brange[1]; bin++ ) { - eneBand = L_add( eneBand, hMasa->data.energy_fx[sf][bin] ); // hMasa->data.q_energy + eneBand = W_mac_32_32( eneBand, hMasa->data.energy_fx[sf][bin], 1 ); // hMasa->data.q_energy + 1 } + shift = W_norm( eneBand ); + eneBand32 = W_extract_h( W_shl( eneBand, shift ) ); + eneBand_exp = sub( 63, add( add( hMasa->data.q_energy, 1 ), shift ) ); - L_tmp = BASOP_Util_Add_Mant32Exp( eneBand, sub( 31, hMasa->data.q_energy ), hOmasaData->energy_ism_fx[sf][band], hOmasaData->energy_ism_fx_e[sf][band], &L_tmp_e ); + L_tmp = BASOP_Util_Add_Mant32Exp( eneBand32, eneBand_exp, hOmasaEnergy->energy_ism_fx[sf][band], hOmasaEnergy->energy_ism_fx_e[sf][band], &L_tmp_e ); IF( L_tmp != 0 ) { - hOmasaData->masa_to_total_energy_ratio_fx[sf][band] = BASOP_Util_Divide3232_Scale_cadence( eneBand, L_tmp, &tmp ); + hOmasaData->masa_to_total_energy_ratio_fx[sf][band] = BASOP_Util_Divide3232_Scale_newton( eneBand32, L_tmp, &tmp ); move32(); - tmp = add( tmp, sub( sub( 31, hMasa->data.q_energy ), L_tmp_e ) ); + tmp = add( tmp, sub( eneBand_exp, L_tmp_e ) ); /* Scaling to Q30 */ hOmasaData->masa_to_total_energy_ratio_fx[sf][band] = L_shl( hOmasaData->masa_to_total_energy_ratio_fx[sf][band], sub( tmp, 1 ) ); // Q30 move32(); @@ -4887,7 +5001,7 @@ static void ivas_encode_masaism_metadata_fx( FOR( obj = 0; obj < nchan_ism; obj++ ) { - hOmasaData->energy_ratio_ism_fx[sf][band][obj] = hOmasaData->energy_ratio_ism_fx[sf][nbands_work - 1][obj]; + hOmasaEnergy->energy_ratio_ism_fx[sf][band][obj] = hOmasaEnergy->energy_ratio_ism_fx[sf][nbands_work - 1][obj]; move32(); } } @@ -4899,11 +5013,6 @@ static void ivas_encode_masaism_metadata_fx( /* quantize ism_ratios */ IF( GT_16( nchan_ism, 1 ) ) { - /* inv_step = ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ); * - * step = 1.0f / inv_step; */ - step = 4681; // 1.f / ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ) => 1.f / 7 in Q15 - move16(); - rotate = 0; n_ism_tmp = 0; move16(); @@ -4915,8 +5024,8 @@ static void ivas_encode_masaism_metadata_fx( { FOR( obj = 0; obj < nchan_ism; obj++ ) { - assert( ( hOmasaData->energy_ratio_ism_fx[sf][band][obj] >= 0 ) && ( hOmasaData->energy_ratio_ism_fx[sf][band][obj] <= ONE_IN_Q30 ) ); - ratio_ism_fx[band][obj] = extract_h( hOmasaData->energy_ratio_ism_fx[sf][band][obj] ); // Q14 + assert( ( hOmasaEnergy->energy_ratio_ism_fx[sf][band][obj] >= 0 ) && ( hOmasaEnergy->energy_ratio_ism_fx[sf][band][obj] <= ONE_IN_Q30 ) ); + ratio_ism_fx[band][obj] = extract_h( hOmasaEnergy->energy_ratio_ism_fx[sf][band][obj] ); // Q14 move16(); } @@ -4948,8 +5057,9 @@ static void ivas_encode_masaism_metadata_fx( } /* reconstructed values */ - reconstruct_ism_ratios_fx( ratio_ism_idx[band], nchan_ism, step, hMasa->data.hOmasaData->q_energy_ratio_ism_fx[sf][band] ); + reconstruct_ism_ratios_fx( ratio_ism_idx[band], nchan_ism, STEP_PARAM_ISM_POW_RATIO_NBITS_Q31, hOmasaEnergy->q_energy_ratio_ism_fx[sf][band] ); } + test(); IF( GT_16( nchan_ism, 2 ) && EQ_16( idx_separated_object, sub( nchan_ism, 1 ) ) ) { @@ -5033,7 +5143,7 @@ static void ivas_encode_masaism_metadata_fx( } } - calculate_nbits_meta_fx( nchan_ism, hOmasaData->q_energy_ratio_ism_fx, hOmasaData->masa_to_total_energy_ratio_fx, numSf, numCodingBands, bits_ism, idx_separated_object, ism_imp ); + calculate_nbits_meta_fx( nchan_ism, hOmasaEnergy->q_energy_ratio_ism_fx, hOmasaData->masa_to_total_energy_ratio_fx, numSf, numCodingBands, bits_ism, idx_separated_object, ism_imp ); /* quantize directions */ FOR( obj = 0; obj < nchan_ism; obj++ ) @@ -5072,11 +5182,13 @@ static void ivas_encode_masaism_metadata_fx( return; } + /*-------------------------------------------------------------------* * ivas_merge_masa_transports() * * Merge MASA transport channels *-------------------------------------------------------------------*/ + void ivas_merge_masa_transports_fx( Word32 data_in_f1_fx[][L_FRAME48k], // Qx Word32 *data_in_f2_fx[], // Qx diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 17fefec7e780e2ed1ed4ae6b23bbc0d0dc06e6c9..67353a279874abd481163efd96eeaadc75d37759 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -30,6 +30,21 @@ *******************************************************************************************************/ +// helper macros to convert the 64 bitt accumulators into the 48 bit float format +#define CONVERT_CY( x_64, y_fx, y_e ) \ + { \ + Word16 norm; \ + norm = W_norm( x_64 ); \ + y_fx = W_extract_h( W_shl( x_64, norm ) ); \ + y_e = sub( sub62gb, norm ); \ + } +#define CONVERT_DMX( x_64, y_fx, y_e ) \ + { \ + Word16 norm; \ + norm = W_norm( x_64 ); \ + y_fx = W_extract_h( W_shl( x_64, norm ) ); \ + y_e = sub( sub35gb, norm ); \ + } #include #include #include "options.h" @@ -59,17 +74,17 @@ static void ivas_param_mc_range_encoder_fx( const Word16 *seq_in, const Word16 n #define ATTACKTHRESHOLD_E 4 -static void ivas_param_mc_quantize_ilds_fx( PARAM_MC_ENC_HANDLE hParamMC, Word32 Cy_fx[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], Word16 Cy_e[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], Word32 Cx[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], Word16 Cx_fx[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], const Word16 freq_idx, const Word16 nchan_input, const Word16 nchan_transport, Word16 *ILD_idx_out, Word16 ILD_q[PARAM_MC_SZ_ILD_MAP] ); +static void ivas_param_mc_quantize_ilds_fx( PARAM_MC_ENC_HANDLE hParamMC, Word32 Cy_fx[MAX_LS_CHANNELS][MAX_LS_CHANNELS], Word16 Cy_e[MAX_LS_CHANNELS][MAX_LS_CHANNELS], Word32 Cx_fx[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], Word16 Cx_e[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], const Word16 freq_idx, const Word16 nchan_input, const Word16 nchan_transport, Word16 *ILD_idx_out, Word16 ILD_q[PARAM_MC_SZ_ILD_MAP] ); static void ivas_param_mc_parameter_quantizer_fx( const Word32 *x, const Word16 *x_e, const Word16 L, const Word16 sz_quantizer, const Word16 *quantizer_fx, const Word16 Q_quant, Word16 *quant_idx, Word16 *y ); -static void ivas_param_mc_quantize_iccs_fx( PARAM_MC_ENC_HANDLE hParamMC, Word32 Cy_fx[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], Word16 Cy_e[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], const Word16 freq_idx, const Word16 nchan_input, Word16 *ICC_idx_out ); +static void ivas_param_mc_quantize_iccs_fx( PARAM_MC_ENC_HANDLE hParamMC, Word32 Cy_fx[MAX_LS_CHANNELS][MAX_LS_CHANNELS], Word16 Cy_e[MAX_LS_CHANNELS][MAX_LS_CHANNELS], const Word16 freq_idx, const Word16 nchan_input, Word16 *ICC_idx_out ); static void ivas_param_mc_dmx_fx( PARAM_MC_ENC_HANDLE hParamMC, Word32 *data_f_fx[], Word32 data_dmx_fx[][L_FRAME48k], const Word16 input_frame, const Word16 nchan_input, const Word16 nchan_transport ); static void ivas_param_mc_transient_detection_fx( PARAM_MC_ENC_HANDLE hParamMC, TRAN_DET_HANDLE hTranDet, Word16 *bAttackPresent, Word16 *attackIdx ); -static void ivas_param_mc_param_est_enc_fx( PARAM_MC_ENC_HANDLE hParamMC, Word32 *data_f[], Word32 Cy_sum_fx[][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], Word16 Cy_sum_e[][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], Word32 Cx_sum_fx[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], Word16 Cx_sum_e[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], const Word16 input_frame, const Word16 nchan_input, const Word16 nchan_transport ); +static void ivas_param_mc_param_est_enc_fx( PARAM_MC_ENC_HANDLE hParamMC, Word32 *data_f[], Word32 Cy_sum_fx[][MAX_LS_CHANNELS][MAX_LS_CHANNELS], Word16 Cy_sum_e[][MAX_LS_CHANNELS][MAX_LS_CHANNELS], Word32 Cx_sum_fx[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], Word16 Cx_sum_e[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], const Word16 input_frame, const Word16 nchan_input, const Word16 nchan_transport ); /*------------------------------------------------------------------------- @@ -400,8 +415,8 @@ void ivas_param_mc_enc_fx( Word16 data_f_fx16[L_FRAME48k]; Word32 data_dmx_fx[PARAM_MC_MAX_TRANSPORT_CHANS][L_FRAME48k]; Word16 data_dmx_fx16[PARAM_MC_MAX_TRANSPORT_CHANS][L_FRAME48k]; - Word32 Cy_sum_fx[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; - Word16 Cy_sum_e[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; + Word32 Cy_sum_fx[PARAM_MC_MAX_PARAMETER_BANDS][MAX_LS_CHANNELS][MAX_LS_CHANNELS]; + Word16 Cy_sum_e[PARAM_MC_MAX_PARAMETER_BANDS][MAX_LS_CHANNELS][MAX_LS_CHANNELS]; Word32 Cx_sum_fx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS]; Word16 Cx_sum_e[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS]; Word16 ILD_q_fx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_SZ_ILD_MAP]; @@ -423,10 +438,10 @@ void ivas_param_mc_enc_fx( FOR( band = 0; band < PARAM_MC_MAX_PARAMETER_BANDS; band++ ) { - FOR( ch = 0; ch < MAX_CICP_CHANNELS; ch++ ) + FOR( ch = 0; ch < MAX_LS_CHANNELS; ch++ ) { - set32_fx( Cy_sum_fx[band][ch], 0, MAX_CICP_CHANNELS ); - set16_fx( Cy_sum_e[band][ch], 0, MAX_CICP_CHANNELS ); + set32_fx( Cy_sum_fx[band][ch], 0, MAX_LS_CHANNELS ); + set16_fx( Cy_sum_e[band][ch], 0, MAX_LS_CHANNELS ); } FOR( ch = 0; ch < PARAM_MC_MAX_TRANSPORT_CHANS; ch++ ) { @@ -623,8 +638,8 @@ static void ivas_param_mc_dmx_fx( static void ivas_param_mc_param_est_enc_fx( PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder handle */ Word32 *data_f_fx[], /* i : Input frame in the time domain Q11 */ - Word32 Cy_sum_fx[][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], /* o : Covariance matrix for the original frame Cy_sum_e*/ - Word16 Cy_sum_e[][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], /* o : Covariance matrix for the original frame */ + Word32 Cy_sum_fx[][MAX_LS_CHANNELS][MAX_LS_CHANNELS], /* o : Covariance matrix for the original frame Cy_sum_e*/ + Word16 Cy_sum_e[][MAX_LS_CHANNELS][MAX_LS_CHANNELS], /* o : Covariance matrix for the original frame */ Word32 Cx_sum_fx[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], /* o : Covariance matrix for the downmixed frame Cx_sum_e*/ Word16 Cx_sum_e[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], /* o : Covariance matrix for the downmixed frame */ const Word16 input_frame, /* i : Input frame length */ @@ -643,20 +658,20 @@ static void ivas_param_mc_param_est_enc_fx( Word16 idx_ls; Word16 start_ts; - Word32 *pcm_in_fx[MAX_CICP_CHANNELS]; - Word32 slot_frame_f_real_fx[MAX_CICP_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; /* Output of the MDFT FB - real part */ - Word32 slot_frame_f_imag_fx[MAX_CICP_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; /* Output of the MDFT FB - imag part */ - Word32 *p_slot_frame_f_real_fx[MAX_CICP_CHANNELS]; /* Output of the MDFT FB - real part */ - Word32 *p_slot_frame_f_imag_fx[MAX_CICP_CHANNELS]; /* Output of the MDFT FB - imag part */ - - Word32 dmx_real_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; /* Downmix channel - Real Part */ - Word16 dmx_real_e[PARAM_MC_MAX_TRANSPORT_CHANS]; /* Downmix channel - Real Part */ - Word32 dmx_imag_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; /* Downmix channel - Imag Part */ - Word16 dmx_imag_e[PARAM_MC_MAX_TRANSPORT_CHANS]; /* Downmix channel - Imag Part */ - Word32 a_fx, b_fx, c_fx, d_fx; /* Tmp complex values */ - Word16 a_e, b_e, c_e, d_e; /* Tmp complex values */ - Word32 Cy_sum_imag_fx[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; - Word16 Cy_sum_imag_e[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; + Word32 *pcm_in_fx[MAX_LS_CHANNELS]; + Word32 slot_frame_f_real_fx[MAX_LS_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; /* Output of the MDFT FB - real part */ + Word32 slot_frame_f_imag_fx[MAX_LS_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; /* Output of the MDFT FB - imag part */ + Word32 *p_slot_frame_f_real_fx[MAX_LS_CHANNELS]; /* Output of the MDFT FB - real part */ + Word32 *p_slot_frame_f_imag_fx[MAX_LS_CHANNELS]; /* Output of the MDFT FB - imag part */ + + Word64 dmx_real_64[PARAM_MC_MAX_TRANSPORT_CHANS]; + Word64 dmx_imag_64[PARAM_MC_MAX_TRANSPORT_CHANS]; + Word32 a_fx, b_fx, c_fx, d_fx; /* Tmp complex values */ + Word16 a_e, b_e, c_e, d_e; /* Tmp complex values */ + Word64 Cy_sum_real_64[PARAM_MC_MAX_PARAMETER_BANDS][MAX_LS_CHANNELS][MAX_LS_CHANNELS]; + Word64 Cy_sum_imag_64[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][MAX_LS_CHANNELS][MAX_LS_CHANNELS]; + Word16 sub62gb; + Word16 sub35gb; Word32 Cx_sum_imag_fx[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS]; Word16 Cx_sum_imag_e[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS]; Word32 real_part_fx, imag_part_fx; @@ -685,13 +700,19 @@ static void ivas_param_mc_param_est_enc_fx( move16(); band_step = 1; move16(); + FOR( cur_param_band = 0; cur_param_band < PARAM_MC_MAX_PARAMETER_BANDS; cur_param_band++ ) + { + FOR( ch_idx1 = 0; ch_idx1 < MAX_LS_CHANNELS; ch_idx1++ ) + { + set64_fx( Cy_sum_real_64[cur_param_band][ch_idx1], 0, MAX_LS_CHANNELS ); + } + } FOR( cur_param_band = 0; cur_param_band < PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC; cur_param_band++ ) { - FOR( ch_idx1 = 0; ch_idx1 < MAX_CICP_CHANNELS; ch_idx1++ ) + FOR( ch_idx1 = 0; ch_idx1 < MAX_LS_CHANNELS; ch_idx1++ ) { - set32_fx( Cy_sum_imag_fx[cur_param_band][ch_idx1], 0, MAX_CICP_CHANNELS ); - set16_fx( Cy_sum_imag_e[cur_param_band][ch_idx1], 0, MAX_CICP_CHANNELS ); + set64_fx( Cy_sum_imag_64[cur_param_band][ch_idx1], 0, MAX_LS_CHANNELS ); } FOR( ch_idx1 = 0; ch_idx1 < PARAM_MC_MAX_TRANSPORT_CHANS; ch_idx1++ ) @@ -720,9 +741,13 @@ static void ivas_param_mc_param_est_enc_fx( } } + Word16 gb = find_guarded_bits_fx( l_ts ); + + sub35gb = sub( 32, sub( 11, find_guarded_bits_fx( l_ts ) ) ); // 31 - (((11 - gb) + 31 + norm) - 32) + sub62gb = sub( 63, shl( sub( 11, find_guarded_bits_fx( l_ts ) ), 1 ) ); // 31 - ((2*(11 - gb) + norm) - 32) + FOR( ts = start_ts; ts < num_time_slots; ts++ ) { - Word16 gb = find_guarded_bits_fx( l_ts ); ivas_fb_mixer_get_windowed_fr_fx( hParamMC->hFbMixer, pcm_in_fx, p_slot_frame_f_real_fx, p_slot_frame_f_imag_fx, l_ts, l_ts, hParamMC->hFbMixer->fb_cfg->num_in_chans, gb ); ivas_fb_mixer_update_prior_input_fx( hParamMC->hFbMixer, pcm_in_fx, l_ts, hParamMC->hFbMixer->fb_cfg->num_in_chans ); @@ -731,6 +756,7 @@ static void ivas_param_mc_param_est_enc_fx( FOR( i = 0; i < nchan_input; i++ ) { pcm_in_fx[i] += l_ts; + move32(); } /* Computing the downmix */ FOR( cur_param_band = 0; cur_param_band < hParamMC->max_param_band_abs_cov; cur_param_band++ ) @@ -748,47 +774,34 @@ static void ivas_param_mc_param_est_enc_fx( FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { - dmx_real_fx[ch_idx1] = 0; - move32(); - dmx_real_e[ch_idx1] = 0; - move16(); - dmx_imag_fx[ch_idx1] = 0; - move32(); - dmx_imag_e[ch_idx1] = 0; - move16(); + Word64 real_64; + Word64 imag_64; + + real_64 = 0; + imag_64 = 0; + move64(); + move64(); FOR( inp_ch = 0; inp_ch < nchan_input; inp_ch++ ) { - L_tmp = Mpy_32_32( slot_frame_f_real_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); - dmx_real_fx[ch_idx1] = BASOP_Util_Add_Mant32Exp( dmx_real_fx[ch_idx1], dmx_real_e[ch_idx1], L_tmp, add( 20, gb ), &dmx_real_e[ch_idx1] ); - move32(); - L_tmp = Mpy_32_32( slot_frame_f_imag_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); - dmx_imag_fx[ch_idx1] = BASOP_Util_Add_Mant32Exp( dmx_imag_fx[ch_idx1], dmx_imag_e[ch_idx1], L_tmp, add( 20, gb ), &dmx_imag_e[ch_idx1] ); - move32(); + real_64 = W_add( real_64, W_mult0_32_32( slot_frame_f_real_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ) ); + imag_64 = W_add( imag_64, W_mult0_32_32( slot_frame_f_imag_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ) ); p_dmx_fac_fx++; } + dmx_real_64[ch_idx1] = real_64; + dmx_imag_64[ch_idx1] = imag_64; + move64(); + move64(); } /* Cx for transport channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { + CONVERT_DMX( dmx_real_64[ch_idx1], a_fx, a_e ); + CONVERT_DMX( dmx_imag_64[ch_idx1], b_fx, b_e ); FOR( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) { - a_fx = dmx_real_fx[ch_idx1]; - move32(); - a_e = dmx_real_e[ch_idx1]; - move16(); - b_fx = dmx_imag_fx[ch_idx1]; - move32(); - b_e = dmx_imag_e[ch_idx1]; - move16(); - c_fx = dmx_real_fx[ch_idx2]; - move32(); - c_e = dmx_real_e[ch_idx2]; - move16(); - d_fx = dmx_imag_fx[ch_idx2]; - move32(); - d_e = dmx_imag_e[ch_idx2]; - move16(); + CONVERT_DMX( dmx_real_64[ch_idx2], c_fx, c_e ); + CONVERT_DMX( dmx_imag_64[ch_idx2], d_fx, d_e ); /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); @@ -801,26 +814,23 @@ static void ivas_param_mc_param_est_enc_fx( move32(); } } - - /* Cy for input channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { + a_fx = slot_frame_f_real_fx[ch_idx1][cur_cldfb_band]; + b_fx = slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band]; + move32(); FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { - a_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &a_e ); - b_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &b_e ); - c_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &c_e ); - d_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &d_e ); - - /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ - L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); - Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2], - L_tmp, tmp_e, &Cy_sum_e[cur_param_band][ch_idx1][ch_idx2] ); - move32(); - L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, d_fx ), add( a_e, d_e ), L_negate( Mpy_32_32( b_fx, c_fx ) ), add( b_e, c_e ), &tmp_e ); - Cy_sum_imag_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_imag_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_imag_e[cur_param_band][ch_idx1][ch_idx2], - L_tmp, tmp_e, &Cy_sum_imag_e[cur_param_band][ch_idx1][ch_idx2] ); + c_fx = slot_frame_f_real_fx[ch_idx2][cur_cldfb_band]; + d_fx = slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band]; move32(); + // Conjugated complex multiplication (a-ib)(c+id) = ac+bd + i(ad-bc) + Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2] = W_add( Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2], + W_add( W_mult0_32_32( a_fx, c_fx ), W_mult0_32_32( b_fx, d_fx ) ) ); + move64(); + Cy_sum_imag_64[cur_param_band][ch_idx1][ch_idx2] = W_add( Cy_sum_imag_64[cur_param_band][ch_idx1][ch_idx2], + W_sub( W_mult0_32_32( a_fx, d_fx ), W_mult0_32_32( b_fx, c_fx ) ) ); + move64(); } } } @@ -841,48 +851,35 @@ static void ivas_param_mc_param_est_enc_fx( FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { - dmx_real_fx[ch_idx1] = 0; - move32(); - dmx_real_e[ch_idx1] = 0; - move16(); - dmx_imag_fx[ch_idx1] = 0; - move32(); - dmx_imag_e[ch_idx1] = 0; - move16(); + Word64 real_64; + Word64 imag_64; + + real_64 = 0; + imag_64 = 0; + move64(); + move64(); FOR( inp_ch = 0; inp_ch < nchan_input; inp_ch++ ) { - L_tmp = Mpy_32_32( slot_frame_f_real_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); - dmx_real_fx[ch_idx1] = BASOP_Util_Add_Mant32Exp( dmx_real_fx[ch_idx1], dmx_real_e[ch_idx1], L_tmp, add( 20, gb ), &dmx_real_e[ch_idx1] ); - move32(); - L_tmp = Mpy_32_32( slot_frame_f_imag_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); - dmx_imag_fx[ch_idx1] = BASOP_Util_Add_Mant32Exp( dmx_imag_fx[ch_idx1], dmx_imag_e[ch_idx1], L_tmp, add( 20, gb ), &dmx_imag_e[ch_idx1] ); - move32(); + real_64 = W_add( real_64, W_mult0_32_32( slot_frame_f_real_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ) ); + imag_64 = W_add( imag_64, W_mult0_32_32( slot_frame_f_imag_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ) ); p_dmx_fac_fx++; } + dmx_real_64[ch_idx1] = real_64; + dmx_imag_64[ch_idx1] = imag_64; + move64(); + move64(); } /* Cx for transport channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { + CONVERT_DMX( dmx_real_64[ch_idx1], a_fx, a_e ); + CONVERT_DMX( dmx_imag_64[ch_idx1], b_fx, b_e ); FOR( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) { - a_fx = dmx_real_fx[ch_idx1]; - move32(); - a_e = dmx_real_e[ch_idx1]; - move16(); - b_fx = dmx_imag_fx[ch_idx1]; - move32(); - b_e = dmx_imag_e[ch_idx1]; - move16(); - c_fx = dmx_real_fx[ch_idx2]; - move32(); - c_e = dmx_real_e[ch_idx2]; - move16(); - d_fx = dmx_imag_fx[ch_idx2]; - move32(); - d_e = dmx_imag_e[ch_idx2]; - move16(); + CONVERT_DMX( dmx_real_64[ch_idx2], c_fx, c_e ); + CONVERT_DMX( dmx_imag_64[ch_idx2], d_fx, d_e ); /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); @@ -895,18 +892,20 @@ static void ivas_param_mc_param_est_enc_fx( /* Cy for input channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { + a_fx = slot_frame_f_real_fx[ch_idx1][cur_cldfb_band]; + b_fx = slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band]; + move32(); + move32(); FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { - a_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &a_e ); - b_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &b_e ); - c_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &c_e ); - d_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &d_e ); - - /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ - L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); - Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2], L_tmp, tmp_e, - &Cy_sum_e[cur_param_band][ch_idx1][ch_idx2] ); + c_fx = slot_frame_f_real_fx[ch_idx2][cur_cldfb_band]; + d_fx = slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band]; + move32(); move32(); + // Conjugated complex multiplication (a-ib)(c+id) = ac+bd + i(ad-bc) + Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2] = W_add( Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2], + W_add( W_mult0_32_32( a_fx, c_fx ), W_mult0_32_32( b_fx, d_fx ) ) ); + move64(); } } } @@ -921,22 +920,14 @@ static void ivas_param_mc_param_est_enc_fx( { FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { - Cy_sum_fx[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move32(); - Cy_sum_e[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move16(); - Cy_sum_fx[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move32(); - Cy_sum_e[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move16(); - Cy_sum_imag_fx[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move32(); - Cy_sum_imag_e[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move16(); - Cy_sum_imag_fx[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move32(); - Cy_sum_imag_e[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move16(); + Cy_sum_real_64[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; + move64(); + Cy_sum_real_64[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; + move64(); + Cy_sum_imag_64[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; + move64(); + Cy_sum_imag_64[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; + move64(); } } @@ -944,14 +935,10 @@ static void ivas_param_mc_param_est_enc_fx( { FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { - Cy_sum_fx[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move32(); - Cy_sum_e[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move16(); - Cy_sum_fx[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move32(); - Cy_sum_e[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move16(); + Cy_sum_real_64[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; + move64(); + Cy_sum_real_64[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; + move64(); } } } @@ -982,15 +969,14 @@ static void ivas_param_mc_param_est_enc_fx( } IF( NE_16( hParamMC->hMetadataPMC.param_frame_idx, hParamMC->hMetadataPMC.coding_band_mapping[cur_param_band] ) ) { - Word32 Nrg_fx[MAX_CICP_CHANNELS]; - Word16 Nrg_e[MAX_CICP_CHANNELS]; + Word32 Nrg_fx[MAX_LS_CHANNELS]; + Word16 Nrg_e[MAX_LS_CHANNELS]; /* get ICLDs */ FOR( k = 0; k < nchan_input; ++k ) { - Nrg_fx[k] = Cy_sum_fx[cur_param_band][k][k]; + CONVERT_CY( Cy_sum_real_64[cur_param_band][k][k], Nrg_fx[k], Nrg_e[k] ); move32(); - Nrg_e[k] = Cy_sum_e[cur_param_band][k][k]; move16(); } FOR( k = 0; k < num_ilds_to_code; ++k ) @@ -1010,11 +996,7 @@ static void ivas_param_mc_param_est_enc_fx( Cx_sum_e[cur_param_band][ref_channel_idx][ref_channel_idx], &ref_ener_e ); } L_tmp = Mpy_32_16_1( ref_ener_fx, hParamMC->hMetadataPMC.ild_factors_fx[k] ); -#ifdef FIX_ISSUE_1154 L_tmp = L_deposit_h( BASOP_Util_Divide3232_Scale( Nrg_fx[h_ild_mapping->ild_index[k]], L_add( L_tmp, EPSILLON_FX ), &tmp_e ) ); -#else - L_tmp = L_deposit_h( BASOP_Util_Divide3232_Scale( Nrg_fx[h_ild_mapping->ild_index[k]], L_tmp, &tmp_e ) ); -#endif tmp_e = add( sub( Nrg_e[h_ild_mapping->ild_index[k]], ref_ener_e ), tmp_e ); @@ -1062,14 +1044,10 @@ static void ivas_param_mc_param_est_enc_fx( { FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { - Cy_sum_fx[cur_param_band - 1][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_fx[cur_param_band - 1][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band - 1][ch_idx1][ch_idx2], - Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2], - &Cy_sum_e[cur_param_band - 1][ch_idx1][ch_idx2] ); - move32(); - Cy_sum_imag_fx[cur_param_band - 1][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_imag_fx[cur_param_band - 1][ch_idx1][ch_idx2], Cy_sum_imag_e[cur_param_band - 1][ch_idx1][ch_idx2], - Cy_sum_imag_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_imag_e[cur_param_band][ch_idx1][ch_idx2], - &Cy_sum_imag_e[cur_param_band - 1][ch_idx1][ch_idx2] ); - move32(); + Cy_sum_real_64[cur_param_band - 1][ch_idx1][ch_idx2] = W_add( Cy_sum_real_64[cur_param_band - 1][ch_idx1][ch_idx2], Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2] ); + move64(); + Cy_sum_imag_64[cur_param_band - 1][ch_idx1][ch_idx2] = W_add( Cy_sum_imag_64[cur_param_band - 1][ch_idx1][ch_idx2], Cy_sum_imag_64[cur_param_band][ch_idx1][ch_idx2] ); + move64(); } } } @@ -1093,10 +1071,7 @@ static void ivas_param_mc_param_est_enc_fx( { FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { - Cy_sum_fx[cur_param_band - 1][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_fx[cur_param_band - 1][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band - 1][ch_idx1][ch_idx2], - Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2], - &Cy_sum_e[cur_param_band - 1][ch_idx1][ch_idx2] ); - move32(); + Cy_sum_real_64[cur_param_band - 1][ch_idx1][ch_idx2] = W_add( Cy_sum_real_64[cur_param_band - 1][ch_idx1][ch_idx2], Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2] ); } } } @@ -1105,7 +1080,21 @@ static void ivas_param_mc_param_est_enc_fx( band_step = 2; move16(); } - + { + // convert the 64 bit fixpoint back into the 48 bit float format + FOR( cur_param_band = 0; cur_param_band < PARAM_MC_MAX_PARAMETER_BANDS; cur_param_band++ ) + { + FOR( ch_idx1 = 0; ch_idx1 < MAX_LS_CHANNELS; ch_idx1++ ) + { + FOR( ch_idx2 = 0; ch_idx2 < MAX_LS_CHANNELS; ch_idx2++ ) + { + CONVERT_CY( Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2], Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2] ); + move32(); + move16(); + } + } + } + } /* map complex covariances to real values */ FOR( cur_param_band = 0; cur_param_band < hParamMC->max_param_band_abs_cov; cur_param_band += band_step ) @@ -1142,15 +1131,13 @@ static void ivas_param_mc_param_est_enc_fx( { FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ch_idx2++ ) { - real_part_fx = Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2]; + CONVERT_CY( Cy_sum_imag_64[cur_param_band][ch_idx1][ch_idx2], imag_part_fx, imag_part_e ); move32(); - real_part_e = Cy_sum_e[cur_param_band][ch_idx1][ch_idx2]; move16(); - imag_part_fx = Cy_sum_imag_fx[cur_param_band][ch_idx1][ch_idx2]; + real_part_fx = Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2]; move32(); - imag_part_e = Cy_sum_imag_e[cur_param_band][ch_idx1][ch_idx2]; + real_part_e = Cy_sum_e[cur_param_band][ch_idx1][ch_idx2]; move16(); - real_part_fx = Mpy_32_32( real_part_fx, real_part_fx ); imag_part_fx = Mpy_32_32( imag_part_fx, imag_part_fx ); @@ -1189,8 +1176,8 @@ static void ivas_param_mc_param_est_enc_fx( static void ivas_param_mc_quantize_ilds_fx( PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder handle */ - Word32 Cy_fx[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], /* i : Covariance matrix of the input */ - Word16 Cy_e[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], /* i : Covariance matrix of the input */ + Word32 Cy_fx[MAX_LS_CHANNELS][MAX_LS_CHANNELS], /* i : Covariance matrix of the input */ + Word16 Cy_e[MAX_LS_CHANNELS][MAX_LS_CHANNELS], /* i : Covariance matrix of the input */ Word32 Cx_fx[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], /* i : Covariance matrix of the dmx */ Word16 Cx_e[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], /* i : Covariance matrix of the dmx */ const Word16 freq_idx, /* i : frequency index being processed */ @@ -1204,8 +1191,8 @@ static void ivas_param_mc_quantize_ilds_fx( Word16 Ny; Word16 num_ilds_to_code; Word16 ild_map_size; - Word32 Nrg_fx[MAX_CICP_CHANNELS]; - Word16 Nrg_e[MAX_CICP_CHANNELS]; + Word32 Nrg_fx[MAX_LS_CHANNELS]; + Word16 Nrg_e[MAX_LS_CHANNELS]; Word32 ILD_fx[PARAM_MC_SZ_ILD_MAP]; Word16 ILD_e[PARAM_MC_SZ_ILD_MAP]; const PARAM_MC_ILD_MAPPING *h_ild_mapping; @@ -1218,7 +1205,7 @@ static void ivas_param_mc_quantize_ilds_fx( push_wmops( "param_mc_prm_q" ); /* Initialization */ - set32_fx( Nrg_fx, 0, MAX_CICP_CHANNELS ); + set32_fx( Nrg_fx, 0, MAX_LS_CHANNELS ); set32_fx( ILD_fx, 0, PARAM_MC_SZ_ILD_MAP ); Ny = nchan_input; @@ -1280,8 +1267,21 @@ static void ivas_param_mc_quantize_ilds_fx( dmx_ener_fx = BASOP_Util_Add_Mant32Exp( dmx_ener_fx, dmx_ener_e, Cx_fx[k][k], Cx_e[k][k], &dmx_ener_e ); } /*ener_fac = 10.0f * log10f( ( tot_ener + EPSILON ) / ( dmx_ener + EPSILON ) )*/ - tot_ener_fx = BASOP_Util_Add_Mant32Exp( tot_ener_fx, tot_ener_e, EPSILON_FX, 0, &tot_ener_e ); - dmx_ener_fx = BASOP_Util_Add_Mant32Exp( dmx_ener_fx, dmx_ener_e, EPSILON_FX, 0, &dmx_ener_e ); + IF( tot_ener_fx == 0 ) + { + tot_ener_fx = 9223; // 1e-15(EPSILON) in Q63 + tot_ener_e = -32; + move32(); + move16(); + } + IF( dmx_ener_fx == 0 ) + { + dmx_ener_fx = 9223; // 1e-15(EPSILON) in Q63 + dmx_ener_e = -32; + move32(); + move16(); + } + L_tmp = L_deposit_h( BASOP_Util_Divide3232_Scale( tot_ener_fx, dmx_ener_fx, &tmp_e ) ); tmp_e = add( sub( tot_ener_e, dmx_ener_e ), tmp_e ); ener_fac_fx = BASOP_Util_Log10( L_tmp, tmp_e ); // Q25 @@ -1329,9 +1329,22 @@ static void ivas_param_mc_quantize_ilds_fx( { dmx_ener_fx = BASOP_Util_Add_Mant32Exp( dmx_ener_fx, dmx_ener_e, Cx_fx[k][k], Cx_e[k][k], &dmx_ener_e ); } + /* ener_fac = 10.0f * log10f( ( tot_ener + EPSILON ) / ( dmx_ener + EPSILON ) ); */ + IF( tot_ener_fx == 0 ) + { + tot_ener_fx = 9223; // 1e-15(EPSILON) in Q63 + tot_ener_e = -32; + move32(); + move16(); + } + IF( dmx_ener_fx == 0 ) + { + dmx_ener_fx = 9223; // 1e-15(EPSILON) in Q63 + dmx_ener_e = -32; + move32(); + move16(); + } - tot_ener_fx = BASOP_Util_Add_Mant32Exp( tot_ener_fx, tot_ener_e, EPSILON_FX, 0, &tot_ener_e ); - dmx_ener_fx = BASOP_Util_Add_Mant32Exp( dmx_ener_fx, dmx_ener_e, EPSILON_FX, 0, &dmx_ener_e ); L_tmp = L_deposit_h( BASOP_Util_Divide3232_Scale( tot_ener_fx, dmx_ener_fx, &tmp_e ) ); tmp_e = add( sub( tot_ener_e, dmx_ener_e ), tmp_e ); ener_fac_fx = BASOP_Util_Log10( L_tmp, tmp_e ); // Q25 @@ -1392,11 +1405,7 @@ static void ivas_param_mc_quantize_ilds_fx( ref_ener_fx = BASOP_Util_Add_Mant32Exp( ref_ener_fx, ref_ener_e, Cx_fx[ref_channel_idx][ref_channel_idx], Cx_e[ref_channel_idx][ref_channel_idx], &ref_ener_e ); } ref_ener_fx = Mpy_32_16_1( ref_ener_fx, hParamMC->hMetadataPMC.ild_factors_fx[k] ); -#ifdef FIX_ISSUE_1154 L_tmp = L_deposit_h( BASOP_Util_Divide3232_Scale( Nrg_fx[h_ild_mapping->ild_index[k]], L_add( ref_ener_fx, EPSILLON_FX ), &tmp_e ) ); -#else - L_tmp = L_deposit_h( BASOP_Util_Divide3232_Scale( Nrg_fx[h_ild_mapping->ild_index[k]], ref_ener_fx, &tmp_e ) ); -#endif tmp_e = add( sub( Nrg_e[h_ild_mapping->ild_index[k]], ref_ener_e ), tmp_e ); /*10 in Q21 = 1342177280*/ ILD_fx[k] = Mpy_32_32( 1342177280, BASOP_Util_Log10( L_tmp, tmp_e ) ); // Q21 @@ -1433,12 +1442,12 @@ static void ivas_param_mc_quantize_ilds_fx( *------------------------------------------------------------------------*/ static void ivas_param_mc_quantize_iccs_fx( - PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder handle */ - Word32 Cy_fx[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], /* i : Covariance matrix of the input */ - Word16 Cy_e[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], /* i : Covariance matrix of the input */ - const Word16 freq_idx, /* i : frequency index being processed */ - const Word16 nchan_input, /* i : number of input channels */ - Word16 *ICC_idx_out /* o : quantizer indices */ + PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder handle */ + Word32 Cy_fx[MAX_LS_CHANNELS][MAX_LS_CHANNELS], /* i : Covariance matrix of the input */ + Word16 Cy_e[MAX_LS_CHANNELS][MAX_LS_CHANNELS], /* i : Covariance matrix of the input */ + const Word16 freq_idx, /* i : frequency index being processed */ + const Word16 nchan_input, /* i : number of input channels */ + Word16 *ICC_idx_out /* o : quantizer indices */ ) { Word16 i, k; @@ -1450,13 +1459,13 @@ static void ivas_param_mc_quantize_iccs_fx( /* Initialization */ Word32 a_fx; - Word32 Nrg_fx[MAX_CICP_CHANNELS]; + Word32 Nrg_fx[MAX_LS_CHANNELS]; Word16 Nrg_e; Word32 ICC_vect_fx[PARAM_MC_SZ_ICC_MAP]; Word16 ICC_vect_e[PARAM_MC_SZ_ICC_MAP]; Word16 ICC_vect_q_fx[PARAM_MC_SZ_ICC_MAP]; - set32_fx( Nrg_fx, 0, MAX_CICP_CHANNELS ); + set32_fx( Nrg_fx, 0, MAX_LS_CHANNELS ); set32_fx( ICC_vect_fx, 0, PARAM_MC_SZ_ICC_MAP ); set16_fx( ICC_vect_q_fx, 0, PARAM_MC_SZ_ICC_MAP ); @@ -1942,7 +1951,7 @@ static void ivas_param_mc_dec2bin_fx( /* convert value to bitstream, MSB first */ FOR( idx = 0; idx < N; idx++ ) { - bits[idx] = (UWord16) s_and( shr( val, sub( N, sub( 1, idx ) ) ), 1 ); + bits[idx] = (UWord16) s_and( shr( val, sub( sub( N, 1 ), idx ) ), 1 ); move16(); } diff --git a/lib_enc/ivas_mc_paramupmix_enc_fx.c b/lib_enc/ivas_mc_paramupmix_enc_fx.c index fd5cb6217312681796dd7e0a35c92230fb7efc2f..0e8c845e145f04160a57bf7442cb56b6a4251643 100644 --- a/lib_enc/ivas_mc_paramupmix_enc_fx.c +++ b/lib_enc/ivas_mc_paramupmix_enc_fx.c @@ -39,7 +39,6 @@ #include "prot_fx.h" #include "ivas_prot_fx.h" #include "basop_util.h" -#include "ivas_rom_com_fx.h" #include "ivas_cnst.h" #include "ivas_rom_com.h" #include "ivas_rom_enc.h" @@ -855,7 +854,7 @@ static ivas_error ivas_mc_paramupmix_param_est_enc_fx( } // l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; - l_ts = idiv1616( input_frame, MAX_PARAM_SPATIAL_SUBFRAMES ); + l_ts = shr( input_frame, MAX_PARAM_SPATIAL_SUBFRAMES_LOG2 ); move16(); Word16 gb = find_guarded_bits_fx( l_ts ); @@ -1040,12 +1039,6 @@ static ivas_error ivas_mc_paramupmix_param_est_enc_fx( IF( LT_16( maxbands, IVAS_MAX_NUM_BANDS ) ) { -#ifndef FIX_1133_IMPROVE_MC_MLD - *exp_alphas = 0; - move16(); - *exp_betas = 0; - move16(); -#endif FOR( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) { FOR( bnd = maxbands; bnd < IVAS_MAX_NUM_BANDS; bnd++ ) diff --git a/lib_enc/ivas_mcmasa_enc_fx.c b/lib_enc/ivas_mcmasa_enc_fx.c index 22f21dceb020c4852d8d97ed129dbd7a9b48d25b..280da94568e28c042476055c9fef075341e20982 100644 --- a/lib_enc/ivas_mcmasa_enc_fx.c +++ b/lib_enc/ivas_mcmasa_enc_fx.c @@ -39,7 +39,6 @@ #include "options.h" #include "prot_fx.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" #include "ivas_rom_enc.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" @@ -81,7 +80,16 @@ static void compute_cov_mtx_fx( CovarianceMatrix *COVls, /* o : Output matrix, contains upper part of cov mtx */ Word16 inp_exp /*Stores exponent for temp*/ ); -static void computeIntensityVector_enc_fx( const Word16 *band_grouping, Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], Word32 Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], const Word16 enc_param_start_band, const Word16 num_frequency_bands, Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] ); + +static void computeIntensityVector_enc_fx( + const Word16 *band_grouping, + Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], + Word32 Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], + const Word16 enc_param_start_band, /* i : first band to process */ + const Word16 num_frequency_bands, + Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], + Word16 q_intensity_real[MASA_FREQUENCY_BANDS], + Word16 inp_q ); static void computeVerticalDiffuseness_fx( Word32 **buffer_intensity, /* i : Intensity vectors */ @@ -278,7 +286,7 @@ ivas_error ivas_mcmasa_enc_open_fx( bufferSize = (Word16) ( ( input_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES ); FOR( i = 0; i < 2; i++ ) { - IF( ( hMcMasa->lfeAnaRingBuffer[i] = (Word32 *) malloc( bufferSize * sizeof( float ) ) ) == NULL ) + IF( ( hMcMasa->lfeAnaRingBuffer[i] = (Word32 *) malloc( bufferSize * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); } @@ -737,7 +745,7 @@ void ivas_mcmasa_enc_fx( move32(); hQMeta->q_direction[0].band_data[i].elevation_fx[j] = elevation_m_values_fx[j][i]; // Q22 move32(); - hQMeta->q_direction[0].band_data[i].energy_ratio_fx[j] = energyRatio_fx[k][i]; // Q30 + hQMeta->q_direction[0].band_data[i].energy_ratio_fx[j] = energyRatio_fx[k][i]; // Q31 move32(); hQMeta->q_direction[0].band_data[i].distance[j] = fixedDistance; move16(); @@ -939,19 +947,19 @@ void ivas_mcmasa_param_est_enc_fx( Word16 renormalization_factor_coh_e[MASA_FREQUENCY_BANDS]; Word16 surroundingCoherence_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word16 numAnalysisChannels; + Word16 q_intensity_real_fx[MASA_FREQUENCY_BANDS], q_intensity_even_real_fx[MASA_FREQUENCY_BANDS], q_reference_power_fx[DIRAC_NO_FB_BANDS_MAX]; + Word16 c_e, ref_e, shift; -#ifdef MSAN_FIX FOR( i = 0; i < MCMASA_MAX_ANA_CHANS; i++ ) { set_zero_fx( Chnl_RealBuffer_fx[i], DIRAC_NO_FB_BANDS_MAX ); set_zero_fx( Chnl_ImagBuffer_fx[i], DIRAC_NO_FB_BANDS_MAX ); } -#endif - num_freq_bins = idiv1616( input_frame, MDFT_NO_COL_MAX ); + num_freq_bins = shr( input_frame, MDFT_NO_COL_MAX_LOG2 ); num_freq_bands = hMcMasa->nbands; move16(); - l_ts = idiv1616( input_frame, MDFT_NO_COL_MAX ); + l_ts = shr( input_frame, MDFT_NO_COL_MAX_LOG2 ); set16_fx( q_vdv, 31, MASA_FREQUENCY_BANDS ); set16_fx( out_exp, 30, MASA_FREQUENCY_BANDS ); @@ -1031,7 +1039,7 @@ void ivas_mcmasa_param_est_enc_fx( FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { - Word16 cr_q = MAX_16, ci_q = MAX_16, sf, c_e; + Word16 cr_q = MAX_16, ci_q = MAX_16, sf; Word16 inp_q = q_inp; move16(); move16(); @@ -1055,7 +1063,6 @@ void ivas_mcmasa_param_est_enc_fx( scale_sig32( Chnl_ImagBuffer_fx[i], DIRAC_NO_FB_BANDS_MAX, sf ); // Q-> inp_q + sf } inp_q = add( inp_q, sf ); - c_e = sub( 31, inp_q ); /* Compute covariance matrix */ FOR( i = 0; i < num_freq_bands; i++ ) @@ -1101,8 +1108,8 @@ void ivas_mcmasa_param_est_enc_fx( } /* Y */ - v_multc_fixed( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[1][0], Foa_RealBuffer_fx[1], num_freq_bins ); // inp_q - v_multc_fixed( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[1][0], Foa_ImagBuffer_fx[1], num_freq_bins ); // inp_q + v_multc_fx( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[1][0], Foa_RealBuffer_fx[1], num_freq_bins ); // inp_q + v_multc_fx( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[1][0], Foa_ImagBuffer_fx[1], num_freq_bins ); // inp_q FOR( i = 1; i < numAnalysisChannels; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hMcMasa->chnlToFoaMtx_fx[1][i], Foa_RealBuffer_fx[1], num_freq_bins ); // inp_q @@ -1118,8 +1125,8 @@ void ivas_mcmasa_param_est_enc_fx( } ELSE { - v_multc_fixed( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[2][0], Foa_RealBuffer_fx[2], num_freq_bins ); // inp_q - v_multc_fixed( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[2][0], Foa_ImagBuffer_fx[2], num_freq_bins ); // inp_q + v_multc_fx( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[2][0], Foa_RealBuffer_fx[2], num_freq_bins ); // inp_q + v_multc_fx( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[2][0], Foa_ImagBuffer_fx[2], num_freq_bins ); // inp_q FOR( i = 1; i < numAnalysisChannels; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hMcMasa->chnlToFoaMtx_fx[2][i], Foa_RealBuffer_fx[2], num_freq_bins ); // inp_q @@ -1128,8 +1135,8 @@ void ivas_mcmasa_param_est_enc_fx( } /* X */ - v_multc_fixed( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[3][0], Foa_RealBuffer_fx[3], num_freq_bins ); // inp_q - v_multc_fixed( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[3][0], Foa_ImagBuffer_fx[3], num_freq_bins ); // inp_q + v_multc_fx( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[3][0], Foa_RealBuffer_fx[3], num_freq_bins ); // inp_q + v_multc_fx( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[3][0], Foa_ImagBuffer_fx[3], num_freq_bins ); // inp_q FOR( i = 1; i < numAnalysisChannels; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hMcMasa->chnlToFoaMtx_fx[3][i], Foa_RealBuffer_fx[3], num_freq_bins ); // inp_q @@ -1142,8 +1149,8 @@ void ivas_mcmasa_param_est_enc_fx( Copy32( Foa_ImagBuffer_fx[0], FoaEven_ImagBuffer_fx[0], num_freq_bins ); // inp_q /* Y */ - v_multc_fixed( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[1][0], FoaEven_RealBuffer_fx[1], num_freq_bins ); // inp_q - v_multc_fixed( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[1][0], FoaEven_ImagBuffer_fx[1], num_freq_bins ); // inp_q + v_multc_fx( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[1][0], FoaEven_RealBuffer_fx[1], num_freq_bins ); // inp_q + v_multc_fx( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[1][0], FoaEven_ImagBuffer_fx[1], num_freq_bins ); // inp_q FOR( i = 1; i < numAnalysisChannels; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hMcMasa->chnlToFoaEvenMtx_fx[1][i], FoaEven_RealBuffer_fx[1], num_freq_bins ); // inp_q @@ -1155,8 +1162,8 @@ void ivas_mcmasa_param_est_enc_fx( set_zero_fx( FoaEven_ImagBuffer_fx[2], num_freq_bins ); // inp_q /* X */ - v_multc_fixed( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[3][0], FoaEven_RealBuffer_fx[3], num_freq_bins ); // inp_q - v_multc_fixed( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[3][0], FoaEven_ImagBuffer_fx[3], num_freq_bins ); // inp_q + v_multc_fx( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[3][0], FoaEven_RealBuffer_fx[3], num_freq_bins ); // inp_q + v_multc_fx( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[3][0], FoaEven_ImagBuffer_fx[3], num_freq_bins ); // inp_q FOR( i = 1; i < numAnalysisChannels; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hMcMasa->chnlToFoaEvenMtx_fx[3][i], FoaEven_RealBuffer_fx[3], num_freq_bins ); // inp_q @@ -1170,9 +1177,11 @@ void ivas_mcmasa_param_est_enc_fx( Foa_ImagBuffer_fx, 0, num_freq_bands, - intensity_real_fx ); + intensity_real_fx, + q_intensity_real_fx, + inp_q ); - computeDirectionVectors_fixed( + computeDirectionVectors_fx2( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], @@ -1180,12 +1189,9 @@ void ivas_mcmasa_param_est_enc_fx( num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], - direction_vector_fx[2], c_e -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC - , - NULL -#endif - ); + direction_vector_fx[2], + 0, + q_intensity_real_fx ); /* Power and intensity estimation for diffuseness */ computeIntensityVector_enc_fx( @@ -1194,18 +1200,54 @@ void ivas_mcmasa_param_est_enc_fx( FoaEven_ImagBuffer_fx, 0, num_freq_bands, - intensity_even_real_fx ); - Word16 ref_e = 0; - move16(); - computeReferencePower_enc_fx( hMcMasa->band_grouping, - FoaEven_RealBuffer_fx, - FoaEven_ImagBuffer_fx, - reference_power_fx[ts], - 0, - num_freq_bands, - MC_FORMAT, - 0, - FOA_CHANNELS, inp_q, &ref_e ); + intensity_even_real_fx, + q_intensity_even_real_fx, + inp_q ); + + computeReferencePower_enc_fx( + hMcMasa->band_grouping, + FoaEven_RealBuffer_fx, + FoaEven_ImagBuffer_fx, + reference_power_fx[ts], + 0, + num_freq_bands, + MC_FORMAT, + 0, + FOA_CHANNELS, + inp_q, + q_reference_power_fx ); + + minimum_fx( q_intensity_real_fx, num_freq_bands, &c_e ); + minimum_fx( q_intensity_even_real_fx, num_freq_bands, &shift ); + minimum_fx( q_reference_power_fx, num_freq_bands, &ref_e ); + + Word16 tmp; + FOR( i = 0; i < num_freq_bands; i++ ) + { + tmp = sub( c_e, q_intensity_real_fx[i] ); + intensity_real_fx[0][i] = L_shl( intensity_real_fx[0][i], tmp ); + move32(); + intensity_real_fx[1][i] = L_shl( intensity_real_fx[1][i], tmp ); + move32(); + intensity_real_fx[2][i] = L_shl( intensity_real_fx[2][i], tmp ); + move32(); + + tmp = sub( shift, q_intensity_even_real_fx[i] ); + intensity_even_real_fx[0][i] = L_shl( intensity_even_real_fx[0][i], tmp ); + move32(); + intensity_even_real_fx[1][i] = L_shl( intensity_even_real_fx[1][i], tmp ); + move32(); + intensity_even_real_fx[2][i] = L_shl( intensity_even_real_fx[2][i], tmp ); + move32(); + + tmp = sub( ref_e, q_reference_power_fx[i] ); + reference_power_fx[ts][i] = L_shl( reference_power_fx[ts][i], tmp ); + move32(); + } + + c_e = sub( Q31, c_e ); + shift = sub( Q31, shift ); + ref_e = sub( Q31, ref_e ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hMcMasa->index_buffer_intensity = add( ( hMcMasa->index_buffer_intensity % hMcMasa->no_col_avg_diff ), 1 ); /* averaging_length = 32 */ @@ -1217,7 +1259,7 @@ void ivas_mcmasa_param_est_enc_fx( /* only real part needed */ Copy32( intensity_even_real_fx[i], &( hMcMasa->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); // hMcMasa->buffer_intensity_real_q } - hMcMasa->buffer_intensity_real_q[index - 1] = sub( shl( inp_q, 1 ), 31 ); + hMcMasa->buffer_intensity_real_q[index - 1] = sub( 31, shift ); move16(); Copy32( reference_power_fx[ts], &( hMcMasa->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); // ref_e hMcMasa->buffer_energy_q[index - 1] = sub( Q31, ref_e ); @@ -1233,7 +1275,7 @@ void ivas_mcmasa_param_est_enc_fx( IF( !hMcMasa->isHorizontalSetup ) { Copy32( intensity_real_fx[2], &( hMcMasa->buffer_intensity_real_vert_fx[index - 1][0] ), num_freq_bands ); - hMcMasa->buffer_intensity_real_vert_q[index - 1] = sub( shl( inp_q, 1 ), 31 ); + hMcMasa->buffer_intensity_real_vert_q[index - 1] = sub( 31, c_e ); move16(); computeVerticalDiffuseness_fx( hMcMasa->buffer_intensity_real_vert_fx, hMcMasa->buffer_energy_fx, hMcMasa->no_col_avg_diff, num_freq_bands, vertical_diffuseness_vector_fx, hMcMasa->buffer_intensity_real_vert_q, hMcMasa->buffer_energy_q ); v_min_fx( diffuseness_vector_fx, out_exp, vertical_diffuseness_vector_fx, q_vdv, diffuseness_vector_fx, out_exp, num_freq_bands ); @@ -1899,9 +1941,15 @@ static void ivas_mcmasa_dmx_fx( Word32 alpha_fx, L_tmp, L_tmp1; Word16 multiChEne_e, scale, downmixEne_e = 0, prevEQ_e, tmp, currEQ_e, instEQ_e; move16(); + Word16 max_exp, tmp_exp, separateChannelFlag; + Word64 tmp_64; + Word64 multiChEne_64_fx = 0; + Word64 downmixEne_64_fx = 0; + move64(); + move64(); numAnalysisChannels = sub( nchan_inp, 1 ); - IF( hMcMasa->separateChannelEnabled ) + if ( hMcMasa->separateChannelEnabled ) { numAnalysisChannels = sub( nchan_inp, 2 ); } @@ -1914,33 +1962,31 @@ static void ivas_mcmasa_dmx_fx( { FOR( i = 0; i < input_frame; i++ ) { - L_tmp1 = BASOP_Util_Add_Mant32Exp( data_fx[j][i], data_e, 0, 0, &scale ); - L_tmp = Mpy_32_32( L_tmp1, L_tmp1 ); // data_e + data_e - multiChEne_fx = BASOP_Util_Add_Mant32Exp( L_tmp, scale + scale, multiChEne_fx, multiChEne_e, &scale ); - multiChEne_e = scale; - move16(); + multiChEne_64_fx = W_mac_32_32( multiChEne_64_fx, data_fx[j][i], data_fx[j][i] ); // exp: 2*data_e } } - + tmp = shl( data_e, 1 ); IF( EQ_16( nchan_transport, 2 ) ) { Word16 numSideChannels; /* Channels other than left, right, center */ Word16 leftIndex, rightIndex; + Word16 tmp_16; + + separateChannelFlag = 1; + move16(); + if ( hMcMasa->separateChannelEnabled ) + { + separateChannelFlag = 0; + move16(); + } numSideChannels = sub( shr( numAnalysisChannels, 1 ), 1 ); FOR( j = 0; j < numSideChannels; j++ ) { - IF( hMcMasa->separateChannelEnabled ) - { - leftIndex = add( shl( j, 1 ), 2 ); - rightIndex = add( shl( j, 1 ), 3 ); - } - ELSE - { - leftIndex = add( shl( j, 1 ), 3 ); - rightIndex = add( shl( j, 1 ), 4 ); - } + tmp_16 = add( shl( j, 1 ), 2 ); + leftIndex = add( tmp_16, separateChannelFlag ); + rightIndex = add( add( tmp_16, 1 ), separateChannelFlag ); FOR( i = 0; i < input_frame; i++ ) { data_fx[0][i] = L_add( data_fx[0][i], data_fx[leftIndex][i] ); // data_e @@ -1980,15 +2026,20 @@ static void ivas_mcmasa_dmx_fx( { FOR( i = 0; i < input_frame; i++ ) { - L_tmp1 = BASOP_Util_Add_Mant32Exp( data_fx[j][i], data_e, 0, 0, &scale ); - L_tmp = Mpy_32_32( L_tmp1, L_tmp1 ); // data_e + data_e - downmixEne_fx = BASOP_Util_Add_Mant32Exp( L_tmp, scale + scale, downmixEne_fx, downmixEne_e, &downmixEne_e ); + downmixEne_64_fx = W_mac_32_32( downmixEne_64_fx, data_fx[j][i], data_fx[j][i] ); // exp: 2*data_e } } alpha_fx = 214748364; // 0.1 in Q31 move32(); + scale = W_norm( multiChEne_64_fx ); + multiChEne_fx = W_extract_h( W_shl( multiChEne_64_fx, scale ) ); + multiChEne_e = sub( tmp, scale ); + + scale = W_norm( downmixEne_64_fx ); + downmixEne_fx = W_extract_h( W_shl( downmixEne_64_fx, scale ) ); + downmixEne_e = sub( tmp, scale ); L_tmp = Mpy_32_32( alpha_fx, multiChEne_fx ); L_tmp1 = Mpy_32_32( 1932735284 /* 0.9f in Q31 */, hMcMasa->prevMultiChEne_fx ); hMcMasa->prevMultiChEne_fx = BASOP_Util_Add_Mant32Exp( L_tmp, multiChEne_e, L_tmp1, hMcMasa->prevMultiChEne_e, &hMcMasa->prevMultiChEne_e ); @@ -2013,12 +2064,17 @@ static void ivas_mcmasa_dmx_fx( hMcMasa->prevEQ_e = currEQ_e; move16(); + max_exp = s_max( prevEQ_e, currEQ_e ); + prevEQ_fx = L_shl( prevEQ_fx, sub( prevEQ_e, max_exp ) ); // exp:max_exp + currEQ_fx = L_shl( currEQ_fx, sub( currEQ_e, max_exp ) ); // exp:max_exp + tmp_exp = add( max_exp, 16 ); + FOR( i = 0; i < input_frame; i++ ) { - L_tmp = Mpy_32_32( L_deposit_h( hMcMasa->interpolator_fx[i] ), currEQ_fx ); - L_tmp1 = L_sub( 1073741824 /* 1 in Q30 */, L_lshr( L_deposit_h( hMcMasa->interpolator_fx[i] ), 1 ) ); - L_tmp1 = Mpy_32_32( L_tmp1, prevEQ_fx ); - instEQ_fx = BASOP_Util_Add_Mant32Exp( L_tmp, currEQ_e, L_tmp1, add( prevEQ_e, 1 ), &instEQ_e ); + tmp_64 = W_mac_32_32( W_mult_32_16( currEQ_fx, hMcMasa->interpolator_fx[i] ), prevEQ_fx, L_sub( ONE_IN_Q15, hMcMasa->interpolator_fx[i] ) ); // exp:max_exp +16 + scale = W_norm( tmp_64 ); + instEQ_fx = W_extract_h( W_shl( tmp_64, scale ) ); + instEQ_e = sub( tmp_exp, scale ); FOR( j = 0; j < nchan_transport; j++ ) { @@ -2042,70 +2098,71 @@ static void compute_cov_mtx_fx( ) { Word16 i, j; - Word32 a, b, c, d; - Word32 temp; - Word16 norm_a, norm_b, norm_c, norm_d; - Word16 shift; + Word64 temp64_1, temp64_2; + Word16 tmp_16, max_exp; + Word16 temp_exp = shl( inp_exp, 1 ); FOR( i = 0; i < N; i++ ) { - a = sr[i][freq]; - move32(); - b = si[i][freq]; - move32(); - norm_a = norm_l( a ); - norm_b = norm_l( b ); - a = L_shl( a, norm_a ); /*inp_exp-norm_a*/ - b = L_shl( b, norm_b ); /*inp_exp-norm_b*/ FOR( j = i; j < N; j++ ) { - c = sr[j][freq]; - move32(); - d = si[j][freq]; - move32(); - norm_c = norm_l( c ); - norm_d = norm_l( d ); - c = L_shl( c, norm_c ); /*inp_exp-norm_c*/ - d = L_shl( d, norm_d ); /*inp_exp-norm_d*/ - temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( a, c ), sub( shl( inp_exp, 1 ), add( norm_a, norm_c ) ), Mult_32_32( b, d ), sub( shl( inp_exp, 1 ), add( norm_b, norm_d ) ), &shift ); /*exp=inp_exp-norm_ab+inp_exp-norm_cd*/ - COVls->xr_fx[i][j] = BASOP_Util_Add_Mant32Exp( COVls->xr_fx[i][j], COVls->xr_e[i][j], temp, shift, &COVls->xr_e[i][j] ); + temp64_1 = W_mac_32_32( W_mult_32_32( sr[i][freq], sr[j][freq] ), si[i][freq], si[j][freq] ); // exp:2*inp_exp + temp64_2 = W_deposit32_h( COVls->xr_fx[i][j] ); // exp:COVls->xr_e[i][j] + max_exp = s_max( COVls->xr_e[i][j], temp_exp ); + temp64_2 = W_shl( temp64_2, sub( COVls->xr_e[i][j], max_exp ) ); // exp:max_exp + temp64_1 = W_shl( temp64_1, sub( temp_exp, max_exp ) ); // exp:max_exp + temp64_1 = W_add( temp64_1, temp64_2 ); // exp:max_exp + tmp_16 = W_norm( temp64_1 ); + + COVls->xr_fx[i][j] = W_extract_h( W_shl( temp64_1, tmp_16 ) ); // exp:max_exp-tmp_16 + COVls->xr_e[i][j] = sub( max_exp, tmp_16 ); move32(); - temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( b, c ), sub( shl( inp_exp, 1 ), add( norm_b, norm_c ) ), L_negate( Mult_32_32( a, d ) ), sub( shl( inp_exp, 1 ), add( norm_a, norm_d ) ), &shift ); - COVls->xi_fx[i][j] = BASOP_Util_Add_Mant32Exp( COVls->xi_fx[i][j], COVls->xi_e[i][j], temp, shift, &COVls->xi_e[i][j] ); + move16(); + + temp64_1 = W_sub( W_mult_32_32( si[i][freq], sr[j][freq] ), W_mult_32_32( sr[i][freq], si[j][freq] ) ); // exp :2*inp_exp + temp64_2 = W_deposit32_h( COVls->xi_fx[i][j] ); // exp:COVls->xi_e[i][j] + max_exp = s_max( COVls->xi_e[i][j], temp_exp ); + temp64_2 = W_shl( temp64_2, sub( COVls->xi_e[i][j], max_exp ) ); // exp:max_exp + temp64_1 = W_shl( temp64_1, sub( temp_exp, max_exp ) ); // exp:max_exp + temp64_1 = W_add( temp64_1, temp64_2 ); // exp:max_exp + tmp_16 = W_norm( temp64_1 ); + + COVls->xi_fx[i][j] = W_extract_h( W_shl( temp64_1, tmp_16 ) ); // exp:max_exp-tmp_16 + COVls->xi_e[i][j] = sub( max_exp, tmp_16 ); move32(); } } - return; } + static void computeIntensityVector_enc_fx( const Word16 *band_grouping, - Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], - Word32 Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], - const Word16 enc_param_start_band, /* i : first band to process */ + Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], /*inp_q*/ + Word32 Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], /*inp_q*/ + const Word16 enc_param_start_band, /* i : first band to process */ const Word16 num_frequency_bands, - Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] ) + Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /*exp: exp_intensity_real*/ + Word16 q_intensity_real[MASA_FREQUENCY_BANDS], + Word16 inp_q ) { - /* Reminder - * X = a + ib; Y = c + id - * X*Y = ac - bd + i(ad +bc) - */ Word16 i, j; Word32 real, img; Word16 brange[2]; - - FOR( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; i++ ) + Word16 shift_value = add( shl( inp_q, 1 ), 1 ); + Word16 tmp_norm; + FOR( i = 0; i < num_frequency_bands; i++ ) { - brange[0] = band_grouping[i]; + brange[0] = band_grouping[i + enc_param_start_band]; /* Q0 */ move16(); - brange[1] = band_grouping[i + 1]; + brange[1] = band_grouping[i + enc_param_start_band + 1]; /* Q0 */ move16(); + Word16 num_bins = sub( brange[1], brange[0] ); + Word16 gb = find_guarded_bits_fx( num_bins ); + Word16 norm; - intensity_real[0][i] = 0; - move32(); - intensity_real[1][i] = 0; - move32(); - intensity_real[2][i] = 0; - move32(); + Word64 tmp_1 = 0, tmp_2 = 0, tmp_3 = 0; + move64(); + move64(); + move64(); FOR( j = brange[0]; j < brange[1]; j++ ) { @@ -2113,18 +2170,48 @@ static void computeIntensityVector_enc_fx( move32(); img = Cldfb_ImagBuffer[0][j]; move32(); + Word64 t1, t2, t3; + t1 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[3][j], real ), Cldfb_ImagBuffer[3][j], img ); /* 2 * q_cldfb + 1 */ + t2 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[1][j], real ), Cldfb_ImagBuffer[1][j], img ); /* 2 * q_cldfb + 1 */ + t3 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[2][j], real ), Cldfb_ImagBuffer[2][j], img ); /* 2 * q_cldfb + 1 */ + t1 = W_shr( t1, gb ); + t2 = W_shr( t2, gb ); + t3 = W_shr( t3, gb ); /* Intensity is XYZ order, audio is WYZX order. */ - intensity_real[0][i] = L_add( intensity_real[0][i], L_add( Mpy_32_32( Cldfb_RealBuffer[3][j], real ), Mpy_32_32( Cldfb_ImagBuffer[3][j], img ) ) ); // output Q= 2* input_q -31 - move32(); - intensity_real[1][i] = L_add( intensity_real[1][i], L_add( Mpy_32_32( Cldfb_RealBuffer[1][j], real ), Mpy_32_32( Cldfb_ImagBuffer[1][j], img ) ) ); // output Q= 2* input_q -31 - move32(); - intensity_real[2][i] = L_add( intensity_real[2][i], L_add( Mpy_32_32( Cldfb_RealBuffer[2][j], real ), Mpy_32_32( Cldfb_ImagBuffer[2][j], img ) ) ); // output Q= 2* input_q -31 - move32(); + tmp_1 = W_add( tmp_1, t1 ); /* 2 * q_cldfb + 1 */ + tmp_2 = W_add( tmp_2, t2 ); /* 2 * q_cldfb + 1 */ + tmp_3 = W_add( tmp_3, t3 ); /* 2 * q_cldfb + 1 */ } + norm = 63; + move16(); + tmp_norm = W_norm( tmp_1 ); + if ( tmp_1 != 0 ) + { + norm = s_min( norm, tmp_norm ); + } + tmp_norm = W_norm( tmp_2 ); + if ( tmp_2 != 0 ) + { + norm = s_min( norm, tmp_norm ); + } + tmp_norm = W_norm( tmp_3 ); + if ( tmp_3 != 0 ) + { + norm = s_min( norm, tmp_norm ); + } + norm = sub( norm, 32 ); + intensity_real[0][i] = W_shl_sat_l( tmp_1, norm ); // shift_value - (gb - norm) + move32(); + intensity_real[1][i] = W_shl_sat_l( tmp_2, norm ); // shift_value - (gb - norm) + move32(); + intensity_real[2][i] = W_shl_sat_l( tmp_3, norm ); // shift_value - (gb - norm) + q_intensity_real[i] = sub( shift_value, sub( gb, norm ) ); + move16(); } return; } + static void computeVerticalDiffuseness_fx( Word32 **buffer_intensity, /* i : Intensity vectors */ const Word32 *buffer_energy, /* i : Energy */ diff --git a/lib_enc/ivas_mct_core_enc_fx.c b/lib_enc/ivas_mct_core_enc_fx.c index 71515571d02cb289ea4d7438f1370decbcff0162..9bbf1260c8ed61e487b4b01a99eb6c38ebaea869 100644 --- a/lib_enc/ivas_mct_core_enc_fx.c +++ b/lib_enc/ivas_mct_core_enc_fx.c @@ -233,19 +233,23 @@ void ivas_mct_core_enc_fx( Word16 i, cpe_id, n, nAvailBits; Word16 nCPE; Word32 *orig_spectrum_fx[MCT_MAX_CHANNELS][2]; /* Pointers to MDCT output for a short block (L/R) */ - Word32 powerSpec_fx[MCT_MAX_CHANNELS][L_FRAME48k]; + Word32 powerSpecMsInv_long_cpe0_fx[CPE_CHANNELS][L_FRAME_PLUS]; + Word32 inv_spectrum_long_cpe0_fx[CPE_CHANNELS][L_FRAME_PLUS]; + Word32 powerSpec_long_cpe0_fx[CPE_CHANNELS][L_FRAME_PLUS]; + Word32 powerSpec_long_fx[MCT_MAX_CHANNELS - CPE_CHANNELS][L_FRAME48k]; + Word32 inv_spectrum_long_fx[MCT_MAX_CHANNELS - CPE_CHANNELS][L_FRAME48k]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ + Word32 powerSpecMsInv_long_fx[MCT_MAX_CHANNELS - CPE_CHANNELS][L_FRAME48k]; /* MS inv power spectrum, also inverse MDST spectrum */ Word16 exp_powerSpec[MCT_MAX_CHANNELS][N_MAX + L_MDCT_OVLP_MAX]; Word32 mdst_fx; - Word32 powerSpecMsInv_long_fx[MCT_MAX_CHANNELS][L_FRAME48k]; /* MS inv power spectrum, also inverse MDST spectrum */ + Word32 *powerSpec_fx[MCT_MAX_CHANNELS]; Word32 *powerSpecMsInv_fx[MCT_MAX_CHANNELS][2]; Word32 *inv_mdst_spectrum_fx[MCT_MAX_CHANNELS][2]; Word32 *inv_spectrum_fx[MCT_MAX_CHANNELS][2]; Word32 *mdst_spectrum_fx[MCT_MAX_CHANNELS][2] = { { NULL } }; - Word32 inv_spectrum_long_fx[MCT_MAX_CHANNELS][L_FRAME48k]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ Word16 total_side_bits; Word16 chBitRatios[MCT_MAX_CHANNELS]; - Word16 q_powSpec[MCT_MAX_CHANNELS], q_powerSpecMsInv[MCT_MAX_CHANNELS], q_spec, q_origSpec, tmp_s; - Word16 tmp_q_powSpec[L_FRAME48k], tmp_q_powSpecInv[L_FRAME48k], *tmp_q_psi[2]; + Word16 q_powSpec[MCT_MAX_CHANNELS], q_spec, q_origSpec, tmp_s; + Word16 tmp_q_powSpec[L_FRAME_PLUS], tmp_q_powSpecInv[MCT_MAX_CHANNELS][L_FRAME_PLUS], *tmp_q_psi[MCT_MAX_CHANNELS][2]; Word64 W_tmp; Encoder_State *sts[MCT_MAX_CHANNELS]; Encoder_State *st; @@ -270,38 +274,70 @@ void ivas_mct_core_enc_fx( nCPE = add( nCPE, 1 ); } -#ifdef MSAN_FIX - FOR( ch = 0; ch < MCT_MAX_CHANNELS; ch++ ) + /* point first CPE channels to longer buffers where switching from ACELP to TCX may occur in SBA with DTX (total memory saving)*/ + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + set32_fx( inv_spectrum_long_cpe0_fx[ch], 0, L_FRAME_PLUS ); + set32_fx( powerSpec_long_cpe0_fx[ch], 0, L_FRAME_PLUS ); // tmp_q_powSpec + set32_fx( powerSpecMsInv_long_cpe0_fx[ch], 0, L_FRAME_PLUS ); // tmp_q_powSpecInv + + inv_mdst_spectrum_fx[ch][0] = powerSpecMsInv_fx[ch][0] = powerSpecMsInv_long_cpe0_fx[ch]; + inv_mdst_spectrum_fx[ch][1] = powerSpecMsInv_fx[ch][1] = powerSpecMsInv_long_cpe0_fx[ch] + N_TCX10_MAX; + + set16_fx( tmp_q_powSpecInv[ch], 63, L_FRAME_PLUS ); + + tmp_q_psi[ch][0] = tmp_q_powSpecInv[ch]; + tmp_q_psi[ch][1] = &tmp_q_powSpecInv[ch][N_TCX10_MAX]; + + inv_spectrum_fx[ch][0] = inv_spectrum_long_cpe0_fx[ch]; + inv_spectrum_fx[ch][1] = inv_spectrum_long_cpe0_fx[ch] + N_TCX10_MAX; + powerSpec_fx[ch] = powerSpec_long_cpe0_fx[ch]; + } + + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - set32_fx( powerSpecMsInv_long_fx[ch], 0, L_FRAME48k ); q_powSpec[ch] = 0; move16(); set16_fx( exp_powerSpec[ch], 0, N_MAX + L_MDCT_OVLP_MAX ); } -#endif // MSAN_FIX - FOR( ch = 0; ch < nChannels; ch++ ) + + FOR( ch = CPE_CHANNELS; ch < nChannels; ch++ ) { - set32_fx( inv_spectrum_long_fx[ch], 0, L_FRAME48k ); - set32_fx( powerSpec_fx[ch], 0, L_FRAME48k ); // tmp_q_powSpec - set32_fx( powerSpecMsInv_long_fx[ch], 0, L_FRAME48k ); // tmp_q_powSpecInv - - inv_mdst_spectrum_fx[ch][0] = powerSpecMsInv_fx[ch][0] = powerSpecMsInv_long_fx[ch]; - inv_mdst_spectrum_fx[ch][1] = powerSpecMsInv_fx[ch][1] = powerSpecMsInv_long_fx[ch] + N_TCX10_MAX; - inv_spectrum_fx[ch][0] = inv_spectrum_long_fx[ch]; - inv_spectrum_fx[ch][1] = inv_spectrum_long_fx[ch] + N_TCX10_MAX; + set32_fx( inv_spectrum_long_fx[ch - CPE_CHANNELS], 0, L_FRAME48k ); + set32_fx( powerSpec_long_fx[ch - CPE_CHANNELS], 0, L_FRAME48k ); // tmp_q_powSpec + set32_fx( powerSpecMsInv_long_fx[ch - CPE_CHANNELS], 0, L_FRAME48k ); // tmp_q_powSpecInv + + inv_mdst_spectrum_fx[ch][0] = powerSpecMsInv_fx[ch][0] = powerSpecMsInv_long_fx[ch - CPE_CHANNELS]; + inv_mdst_spectrum_fx[ch][1] = powerSpecMsInv_fx[ch][1] = powerSpecMsInv_long_fx[ch - CPE_CHANNELS] + N_TCX10_MAX; + + set16_fx( tmp_q_powSpecInv[ch], 63, L_FRAME48k ); + + tmp_q_psi[ch][0] = tmp_q_powSpecInv[ch]; + tmp_q_psi[ch][1] = &tmp_q_powSpecInv[ch][N_TCX10_MAX]; + + inv_spectrum_fx[ch][0] = inv_spectrum_long_fx[ch - CPE_CHANNELS]; + inv_spectrum_fx[ch][1] = inv_spectrum_long_fx[ch - CPE_CHANNELS] + N_TCX10_MAX; + powerSpec_fx[ch] = powerSpec_long_fx[ch - CPE_CHANNELS]; } - set16_fx( tmp_q_powSpecInv, 63, L_FRAME48k ); - set16_fx( tmp_q_powSpec, 63, L_FRAME48k ); + FOR( ch = CPE_CHANNELS; ch < MCT_MAX_CHANNELS; ch++ ) + { + q_powSpec[ch] = 0; + move16(); + set16_fx( exp_powerSpec[ch], 0, N_MAX + L_MDCT_OVLP_MAX ); + } - tmp_q_psi[0] = tmp_q_powSpecInv; - tmp_q_psi[1] = &tmp_q_powSpecInv[N_TCX10_MAX]; + set16_fx( tmp_q_powSpec, 63, L_FRAME_PLUS ); FOR( ( cpe_id = 0, i = 0 ); cpe_id < nCPE; cpe_id++ ) { FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - sts[i] = hCPE[cpe_id]->hCoreCoder[ch]; + IF( LT_16( add( i_mult( cpe_id, CPE_CHANNELS ), ch ), nChannels ) ) + { + sts[i] = hCPE[cpe_id]->hCoreCoder[ch]; + } + IF( EQ_32( hCPE[cpe_id]->hCoreCoder[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { i = add( i, 1 ); @@ -334,7 +370,6 @@ void ivas_mct_core_enc_fx( IF( switch_bw ) { -#ifdef FIX_USAN_ISSUES IF( sts[ch_core]->hIGFEnc == NULL ) { initMdctStereoEncData_fx( hMCT->hBlockData[ch]->hStereoMdct, ivas_format, sts[ch_core]->element_mode, sts[ch_core]->element_brate, sts[ch_core]->bwidth, @@ -345,10 +380,6 @@ void ivas_mct_core_enc_fx( initMdctStereoEncData_fx( hMCT->hBlockData[ch]->hStereoMdct, ivas_format, sts[ch_core]->element_mode, sts[ch_core]->element_brate, sts[ch_core]->bwidth, sts[ch_core]->igf, sts[ch_core]->hIGFEnc->igfData.igfInfo.grid, 0 ); } -#else - initMdctStereoEncData_fx( hMCT->hBlockData[ch]->hStereoMdct, ivas_format, sts[ch_core]->element_mode, sts[ch_core]->element_brate, sts[ch_core]->bwidth, - sts[ch_core]->igf, sts[ch_core]->hIGFEnc->igfData.igfInfo.grid, 0 ); -#endif } IF( sts[ch_core]->igf ) @@ -458,7 +489,7 @@ void ivas_mct_core_enc_fx( tmp_s = W_norm( W_tmp ); W_tmp = W_shl( W_tmp, tmp_s ); powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_tmp ); - tmp_q_psi[n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + tmp_q_psi[ch][n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 move32(); move16(); } @@ -472,7 +503,7 @@ void ivas_mct_core_enc_fx( tmp_s = W_norm( W_tmp ); W_tmp = W_shl( W_tmp, tmp_s ); powerSpecMsInv_fx[ch][n][0] = W_extract_h( W_tmp ); - tmp_q_psi[n][0] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + tmp_q_psi[ch][n][0] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 move32(); move16(); @@ -484,7 +515,7 @@ void ivas_mct_core_enc_fx( tmp_s = W_norm( W_tmp ); W_tmp = W_shl( W_tmp, tmp_s ); powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_tmp ); - tmp_q_psi[n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + tmp_q_psi[ch][n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 move32(); move16(); } @@ -493,7 +524,7 @@ void ivas_mct_core_enc_fx( tmp_s = W_norm( W_tmp ); W_tmp = W_shl( W_tmp, tmp_s ); powerSpecMsInv_fx[ch][n][L_subframeTCX - 1] = W_extract_h( W_tmp ); - tmp_q_psi[n][L_subframeTCX - 1] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + tmp_q_psi[ch][n][L_subframeTCX - 1] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 move32(); move16(); } @@ -536,8 +567,6 @@ void ivas_mct_core_enc_fx( { q_powSpec[ch] = Q31; move16(); - q_powerSpecMsInv[ch] = Q31; - move16(); /* NOTE: This logic has been added because using a constant headroom while computing `powSpec` and `powSpecMsInv` leads to significant precision loss, which results in poor quality. */ FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -546,18 +575,12 @@ void ivas_mct_core_enc_fx( q_powSpec[ch] = s_min( q_powSpec[ch], add( tmp_q_powSpec[i], norm_l( powerSpec_fx[ch][i] ) ) ); move16(); } - IF( powerSpecMsInv_fx[ch][0][i] != 0 ) - { - q_powerSpecMsInv[ch] = s_min( q_powerSpecMsInv[ch], add( tmp_q_powSpecInv[i], norm_l( powerSpecMsInv_fx[ch][0][i] ) ) ); - move16(); - } } FOR( n = 0; n < nSubframes; n++ ) { FOR( i = 0; i < L_subframeTCX; i++ ) { - powerSpecMsInv_fx[ch][n][i] = L_shr( powerSpecMsInv_fx[ch][n][i], sub( tmp_q_psi[n][i], q_powerSpecMsInv[ch] ) ); powerSpec_fx[ch][( i + ( n * L_subframeTCX ) )] = L_shr( powerSpec_fx[ch][( i + ( n * L_subframeTCX ) )], sub( tmp_q_powSpec[i + ( n * L_subframeTCX )], q_powSpec[ch] ) ); move32(); move32(); @@ -616,7 +639,7 @@ void ivas_mct_core_enc_fx( { IF( hMCT->currBlockDataCnt > 0 ) { - mctStereoIGF_enc_fx( hMCT, sts, orig_spectrum_fx, q_origSpec, powerSpec_fx, q_powSpec, powerSpecMsInv_fx, q_powerSpecMsInv, inv_spectrum_fx, sp_aud_decision0 ); + mctStereoIGF_enc_fx( hMCT, sts, orig_spectrum_fx, q_origSpec, powerSpec_fx, q_powSpec, powerSpecMsInv_fx, tmp_q_psi, inv_spectrum_fx, sp_aud_decision0 ); } ELSE { @@ -653,11 +676,7 @@ void ivas_mct_core_enc_fx( q_spectrum = sub( 31, st->hTcxEnc->spectrum_e[n] ); set16_fx( exp_powerSpec[ch], sub( Q31, q_powSpec[ch] ), N_MAX + L_MDCT_OVLP_MAX ); -#ifndef MSAN_FIX - ProcessIGF_ivas_fx( st, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); -#else - ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); -#endif + ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_origSpec, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); st->hIGFEnc->spec_be_igf_e = sub( 31, q_origSpec ); st->hTcxEnc->spectrum_e[n] = sub( 31, q_spectrum ); @@ -717,8 +736,8 @@ void ivas_mct_core_enc_fx( { nAvailBits = sub( nAvailBits, IVAS_FORMAT_SIGNALING_NBITS_EXTENDED ); nAvailBits = sub( nAvailBits, SBA_ORDER_BITS + SBA_PLANAR_BITS ); - test(); - if ( EQ_32( ivas_format, SBA_ISM_FORMAT ) && GT_16( nChannels, 4 ) ) + /*MCT is used at bitrates > 80 kbps and additional 1 bit is present at these bitrates*/ + if ( EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { nAvailBits = sub( nAvailBits, IVAS_COMBINED_FORMAT_SIGNALLING_BITS ); } diff --git a/lib_enc/ivas_mct_enc_fx.c b/lib_enc/ivas_mct_enc_fx.c index 56f5e44db890533036f9f12cb5adae4d75c8d495..39735ad030624045c49913f5a43e4c28e5f070b0 100644 --- a/lib_enc/ivas_mct_enc_fx.c +++ b/lib_enc/ivas_mct_enc_fx.c @@ -183,7 +183,6 @@ ivas_error ivas_mct_enc_fx( Word32 orig_spectrum_long_fx[MCT_MAX_BLOCKS][CPE_CHANNELS][L_FRAME48k]; Word16 switch_bw; IVAS_FORMAT ivas_format; - Word16 max_bwidth; Word32 ivas_total_brate; ivas_error error; Word32 *pdata_fx[MAX_INPUT_CHANNELS]; @@ -198,7 +197,6 @@ ivas_error ivas_mct_enc_fx( hMCT->hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; /* pointer to write MCT side bits */ ivas_format = st_ivas->hEncoderConfig->ivas_format; - max_bwidth = st_ivas->hEncoderConfig->max_bwidth; ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; move32(); move16(); @@ -252,14 +250,14 @@ ivas_error ivas_mct_enc_fx( { FOR( n = 0; n < shr( hMCT->nchan_out_woLFE, 1 ); n++ ) { - initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid, 0 ); + initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, st_ivas->hCPE[0]->hCoreCoder[0]->bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid, 0 ); } } ELSE { FOR( n = 0; n < shr( hMCT->nchan_out_woLFE, 1 ); n++ ) { - initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, NULL, 0 ); + initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, st_ivas->hCPE[0]->hCoreCoder[0]->bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, NULL, 0 ); } } } @@ -287,11 +285,11 @@ ivas_error ivas_mct_enc_fx( Word16 length, ch, nCPE; IF( ( hMCT->nchan_out_woLFE % 2 ) == 0 ) { - nCPE = idiv1616( hMCT->nchan_out_woLFE, 2 ); + nCPE = shr( hMCT->nchan_out_woLFE, 1 ); } ELSE { - nCPE = add( idiv1616( hMCT->nchan_out_woLFE, 2 ), 1 ); + nCPE = add( shr( hMCT->nchan_out_woLFE, 1 ), 1 ); } FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) @@ -313,12 +311,12 @@ ivas_error ivas_mct_enc_fx( } ELSE { - length = idiv1616( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV ); // st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX / NB_DIV + length = shr( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV_LOG2 ); // st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX / NB_DIV } IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->last_core == ACELP_CORE ) { - length = add( length, idiv1616( length, 4 ) ); + length = add( length, shr( length, 2 ) ); } IF( hMCT->p_orig_spectrum_long_fx[cpe_id][ch] ) { @@ -359,11 +357,11 @@ ivas_error ivas_mct_enc_fx( } ELSE { - length = idiv1616( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV ); + length = shr( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV_LOG2 ); } IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->last_core == ACELP_CORE ) { - length = add( length, idiv1616( length, 4 ) ); + length = add( length, shr( length, 2 ) ); } Word16 norm = L_norm_arr( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_long_fx, N_MAX ); q_spec = s_min( q_spec, add( sub( 31, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_long_e ), norm ) ); @@ -391,7 +389,7 @@ ivas_error ivas_mct_enc_fx( } ELSE { - length = idiv1616( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV ); + length = shr( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV_LOG2 ); } scale_sig32( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_long_fx, N_MAX, sub( q_spec, sub( 31, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_long_e ) ) ); // q_spec @@ -404,7 +402,7 @@ ivas_error ivas_mct_enc_fx( IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->last_core == ACELP_CORE ) { - length = add( length, idiv1616( length, 4 ) ); + length = add( length, shr( length, 2 ) ); } FOR( Word16 k = 0; k <= ( ( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) @@ -433,7 +431,7 @@ ivas_error ivas_mct_enc_fx( } ELSE { - length = idiv1616( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV ); + length = shr( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV_LOG2 ); } Word16 e_spec = sub( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_e[0], L_norm_arr( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_long_fx, N_MAX ) ); IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->last_core == ACELP_CORE ) @@ -484,6 +482,9 @@ ivas_error ivas_mct_enc_fx( Copy( hCPE->hCoreCoder[n]->input_fx, hCPE->hCoreCoder[n]->old_input_signal_fx, input_frame ); hCPE->hCoreCoder[n]->q_old_inp = hCPE->hCoreCoder[n]->q_inp; move16(); + Copy32( hCPE->hCoreCoder[n]->input32_fx, hCPE->hCoreCoder[n]->old_input_signal32_fx, input_frame ); + hCPE->hCoreCoder[n]->q_old_inp32 = hCPE->hCoreCoder[n]->q_inp32; + move16(); /* common encoder updates */ updt_enc_common_ivas_fx( hCPE->hCoreCoder[n], Q_new_out[cpe_id][n] ); @@ -618,6 +619,11 @@ ivas_error create_mct_enc_fx( #ifdef DEBUGGING hMCT->hBlockData[n]->hStereoMdct->mdct_stereo_mode_cmdl = SMDCT_MS_DECISION; +#ifdef DEBUG_FORCE_MDCT_STEREO_MODE + /*set all other members to defined states */ + hMCT->hBlockData[n]->hStereoMdct->fDualMono = 0; + hMCT->hBlockData[n]->hStereoMdct->fMSstereo = 0; +#endif #endif initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, st_ivas->hEncoderConfig->max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->igf ? st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid : NULL, 1 ); @@ -799,6 +805,11 @@ ivas_error mct_enc_reconfigure_fx( #ifdef DEBUGGING hMCT->hBlockData[n]->hStereoMdct->mdct_stereo_mode_cmdl = SMDCT_MS_DECISION; +#ifdef DEBUG_FORCE_MDCT_STEREO_MODE + /*set all other members to defined states */ + hMCT->hBlockData[n]->hStereoMdct->fDualMono = 0; + hMCT->hBlockData[n]->hStereoMdct->fMSstereo = 0; +#endif #endif initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, st_ivas->hEncoderConfig->max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->igf ? st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid : NULL, mem_init ); @@ -1177,7 +1188,7 @@ static ivas_error ivas_mc_enc_reconfig_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Transient Detection\n" ) ); } - InitTransientDetection_ivas_fx( shl( div_l( st->input_Fs, FRAMES_PER_SEC ), 1 ), NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet, 0 ); + InitTransientDetection_ivas_fx( extract_l( Mult_32_16( st->input_Fs, INV_FRAME_PER_SEC_Q15 ) ), NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet, 0 ); } IF( st->hIGFEnc == NULL ) diff --git a/lib_enc/ivas_mct_enc_mct_fx.c b/lib_enc/ivas_mct_enc_mct_fx.c index a8ba9a3202c2f5ad298c482148b2292a7b95ca8b..d402d834f9fa1b5dcbd409f5902e09c25ee907da 100644 --- a/lib_enc/ivas_mct_enc_mct_fx.c +++ b/lib_enc/ivas_mct_enc_mct_fx.c @@ -153,7 +153,7 @@ static void getNextBestCorrelation_fx( tmp_idx = sub( shr( imult1616( nChannels, sub( nChannels, 1 ) ), 1 ), 1 ); /* sort values */ - v_sort_ind_fixed( tmp_corrVals, tmp_org, add( tmp_idx, 1 ) ); + v_sort_ind_fx( tmp_corrVals, tmp_org, add( tmp_idx, 1 ) ); /* get max, or 2nd max and so on depending on sortInd value */ *max_corr = tmp_corrVals[( tmp_idx - sortInd )]; // Qx @@ -236,7 +236,7 @@ static void getCorrelationMatrix_fx( FOR( n = 0; n < nSubframes; n++ ) { res_q = sub( 31, sts[0]->hTcxEnc->spectrum_e[0] ); - L_tmp = dotp_fixed_32( sts[ch1]->hTcxEnc->spectrum_fx[n], sts[ch2]->hTcxEnc->spectrum_fx[n], L_subframe, 1, &res_q ); + L_tmp = dotp_fx32_fac( sts[ch1]->hTcxEnc->spectrum_fx[n], sts[ch2]->hTcxEnc->spectrum_fx[n], L_subframe, 1, &res_q ); xCorrMatrix[ch1][ch2] = BASOP_Util_Add_Mant32Exp( xCorrMatrix[ch1][ch2], xCorrMatrix_exp[ch1][ch2], L_tmp, sub( 31, res_q ), &xCorrMatrix_exp[ch1][ch2] ); move32(); } @@ -385,7 +385,7 @@ static void getBlockValues_fx( p_st[0] = sts[ch1]; p_st[1] = sts[ch2]; - stereo_coder_tcx_fx( hBlock->hStereoMdct, p_st, hBlock->mask, p_mdst_spectrum, p_inv_spectrum, p_inv_mdst_spectrum, 1, q_spec ); + stereo_coder_tcx_fx( hBlock->hStereoMdct, p_st, hBlock->mask, p_mdst_spectrum, p_inv_spectrum, p_inv_mdst_spectrum, 1, sub( 31, q_spec ), sub( 31, q_spec ) ); test(); test(); @@ -607,8 +607,8 @@ static void getGlobalILD_fx( FOR( k = 0; k < nSubframes; k++ ) { - v_multc_fixed( sts[ch]->hTcxEnc->spectrum_fx[k], L_deposit_h( qratio ), sts[ch]->hTcxEnc->spectrum_fx[k], L_subframe ); // sts[ch]->hTcxEnc->spectrum_e - v_multc_fixed( mdst_spectrum[ch][k], L_deposit_h( qratio ), mdst_spectrum[ch][k], L_subframe ); // sts[ch]->hTcxEnc->spectrum_e + v_multc_fx( sts[ch]->hTcxEnc->spectrum_fx[k], L_deposit_h( qratio ), sts[ch]->hTcxEnc->spectrum_fx[k], L_subframe ); // sts[ch]->hTcxEnc->spectrum_e + v_multc_fx( mdst_spectrum[ch][k], L_deposit_h( qratio ), mdst_spectrum[ch][k], L_subframe ); // sts[ch]->hTcxEnc->spectrum_e } } } @@ -874,8 +874,8 @@ void apply_MCT_enc_fx( FOR( k = 0; k < nSubframes; k++ ) { - v_multc_fixed( sts[ch]->hTcxEnc->spectrum_fx[k], L_deposit_h( qratio ), sts[ch]->hTcxEnc->spectrum_fx[k], L_subframeTCX ); - v_multc_fixed( mdst_spectrum[ch][k], L_deposit_h( qratio ), mdst_spectrum[ch][k], L_subframeTCX ); + v_multc_fx( sts[ch]->hTcxEnc->spectrum_fx[k], L_deposit_h( qratio ), sts[ch]->hTcxEnc->spectrum_fx[k], L_subframeTCX ); + v_multc_fx( mdst_spectrum[ch][k], L_deposit_h( qratio ), mdst_spectrum[ch][k], L_subframeTCX ); set32_fx( inv_spectrum[ch][k], 0, L_subframeTCX ); } sts[ch]->hTcxEnc->spectrum_e[1] = add( sts[ch]->hTcxEnc->spectrum_e[0], exp ); @@ -983,28 +983,29 @@ void mctStereoIGF_enc_fx( Encoder_State **sts, /* i/o: encoder state structure */ Word32 *orig_spectrum_fx[MCT_MAX_CHANNELS][2], /* i : MDCT spectrum for ITF */ Word16 q_origSpec, /* i : Q for MDCT spectrum */ - Word32 powerSpec_fx[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate */ + Word32 *powerSpec_fx[MCT_MAX_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate */ Word16 q_powerSpec[MCT_MAX_CHANNELS], /* i : Q for powSpec_fx */ Word32 *powerSpecMsInv_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : same as powerSpec_fx but for inverse spect.*/ - Word16 q_powerSpecMsInv[MCT_MAX_CHANNELS], /* i : Q for powSpecMsInv_fx */ + Word16 *q_powerSpecMsInv[MCT_MAX_CHANNELS][NB_DIV], /* i : Q for powSpecMsInv_fx */ Word32 *inv_spectrum_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ const Word16 sp_aud_decision0[MCT_MAX_CHANNELS] /* i : speech audio decision */ ) { Word32 *p_powerSpecMsInv_fx[CPE_CHANNELS][NB_DIV]; + Word16 *q_p_powerSpecMsInv_fx[CPE_CHANNELS][NB_DIV]; Word32 *p_inv_spectrum_fx[CPE_CHANNELS][NB_DIV]; Word32 *p_orig_spectrum_fx[CPE_CHANNELS][NB_DIV]; Word32 *p_powerSpec_fx[NB_DIV]; + Word16 *p_exp_powerSpec_fx[NB_DIV]; Word16 b, nSubframes, L_subframeTCX; - Word16 p_ch[2], n, ch, ch1, ch2, s = 31; - Word16 q_pSI_ch[2]; + Word16 p_ch[2], n, ch, ch1, ch2; Word16 q_pS_ch[2]; Encoder_State *p_st[NB_DIV]; Encoder_State *st; Word16 singleChEle[MCT_MAX_CHANNELS]; Word16 q_spectrum; - Word16 exp_powerSpec[MCT_MAX_CHANNELS][N_MAX + L_MDCT_OVLP_MAX]; + Word16 exp_powerSpec[MCT_MAX_CHANNELS][L_FRAME48k]; L_subframeTCX = 0; /* to avoid compilation warning */ move16(); @@ -1041,8 +1042,10 @@ void mctStereoIGF_enc_fx( sts[ch2]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; } - p_powerSpec_fx[0] = powerSpec_fx[ch1]; // q_powerSpec + p_powerSpec_fx[0] = powerSpec_fx[ch1]; // q_powerSpec + p_exp_powerSpec_fx[0] = exp_powerSpec[ch1]; // q_powerSpec p_powerSpec_fx[1] = powerSpec_fx[ch2]; + p_exp_powerSpec_fx[1] = exp_powerSpec[ch2]; /* Band-wise M/S for MDST */ nSubframes = NB_DIV; @@ -1059,12 +1062,12 @@ void mctStereoIGF_enc_fx( p_orig_spectrum_fx[1][n] = orig_spectrum_fx[ch2][n]; p_powerSpecMsInv_fx[0][n] = powerSpecMsInv_fx[ch1][n]; // q_powerSpec p_powerSpecMsInv_fx[1][n] = powerSpecMsInv_fx[ch2][n]; + q_p_powerSpecMsInv_fx[0][n] = q_powerSpecMsInv[ch1][n]; // q_powerSpec + q_p_powerSpecMsInv_fx[1][n] = q_powerSpecMsInv[ch2][n]; p_inv_spectrum_fx[0][n] = inv_spectrum_fx[ch1][n]; p_inv_spectrum_fx[1][n] = inv_spectrum_fx[ch2][n]; q_pS_ch[0] = q_powerSpec[ch1]; - q_pSI_ch[0] = q_powerSpecMsInv[ch1]; q_pS_ch[1] = q_powerSpec[ch2]; - q_pSI_ch[1] = q_powerSpecMsInv[ch2]; move16(); move16(); @@ -1072,33 +1075,17 @@ void mctStereoIGF_enc_fx( IF( NE_16( hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[n], hMCT->hBlockData[b]->hStereoMdct->IGFStereoMode[n] ) || EQ_16( hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[n], SMDCT_BW_MS ) ) { + Word16 exp_inv_spectrum_fx[CPE_CHANNELS]; FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - s = s_min( s, sub( 31, p_st[ch]->hTcxEnc->spectrum_e[n] ) ); - s = s_min( s, q_pS_ch[ch] ); - s = s_min( s, q_pSI_ch[ch] ); - } - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - scale_sig32( p_st[ch]->hTcxEnc->spectrum_fx[0], N_MAX, sub( s, sub( 31, p_st[ch]->hTcxEnc->spectrum_e[0] ) ) ); - scale_sig32( p_inv_spectrum_fx[ch][0], L_FRAME48k, sub( s, sub( 31, p_st[ch]->hTcxEnc->spectrum_e[0] ) ) ); - p_st[ch]->hTcxEnc->spectrum_e[0] = sub( 31, s ); - p_st[ch]->hTcxEnc->spectrum_e[1] = sub( 31, s ); - move16(); - move16(); - - scale_sig32( p_powerSpecMsInv_fx[ch][0], L_FRAME48k, sub( s, q_pSI_ch[ch] ) ); - scale_sig32( &p_powerSpec_fx[ch][0], sts[ch]->hTcxEnc->L_frameTCX, sub( s, q_pS_ch[ch] ) ); - q_powerSpec[ch1] = s; - q_powerSpec[ch2] = s; - move16(); + exp_inv_spectrum_fx[ch] = p_st[ch]->hTcxEnc->spectrum_e[n]; move16(); } - - ProcessStereoIGF_fx( hMCT->hBlockData[b]->hStereoMdct, p_st, hMCT->hBlockData[b]->mask, - p_orig_spectrum_fx, q_origSpec, q_origSpec, - p_powerSpec_fx, p_powerSpecMsInv_fx, p_inv_spectrum_fx, n, sp_aud_decision0[ch1], p_st[0]->total_brate, 1 ); + set16_fx( exp_powerSpec[ch1], sub( Q31, q_pS_ch[0] ), L_FRAME48k ); + set16_fx( exp_powerSpec[ch2], sub( Q31, q_pS_ch[1] ), L_FRAME48k ); + ProcessStereoIGF_fx( hMCT->hBlockData[b]->hStereoMdct, p_st, hMCT->hBlockData[b]->mask, p_orig_spectrum_fx, q_origSpec, q_origSpec, p_powerSpec_fx, p_exp_powerSpec_fx, + p_powerSpecMsInv_fx, q_p_powerSpecMsInv_fx, p_inv_spectrum_fx, exp_inv_spectrum_fx, n, sp_aud_decision0[ch1], p_st[0]->total_brate, 1 ); } ELSE { @@ -1115,12 +1102,8 @@ void mctStereoIGF_enc_fx( q_spectrum = sub( 31, st->hTcxEnc->spectrum_e[n] ); - set16_fx( exp_powerSpec[p_ch[ch]], sub( Q31, q_powerSpec[p_ch[ch]] ), N_MAX + L_MDCT_OVLP_MAX ); -#ifndef MSAN_FIX - ProcessIGF_ivas_fx( st, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[p_ch[ch]][n], &q_spectrum, &powerSpec_fx[p_ch[ch]][n * L_subframeTCX], &exp_powerSpec[p_ch[ch]][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); -#else - ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[p_ch[ch]][n], &q_spectrum, &powerSpec_fx[p_ch[ch]][n * L_subframeTCX], &exp_powerSpec[p_ch[ch]][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); -#endif + set16_fx( exp_powerSpec[p_ch[ch]], sub( Q31, q_powerSpec[p_ch[ch]] ), L_FRAME48k ); + ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[p_ch[ch]][n], q_origSpec, &powerSpec_fx[p_ch[ch]][n * L_subframeTCX], &exp_powerSpec[p_ch[ch]][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); st->hTcxEnc->spectrum_e[n] = sub( 31, q_spectrum ); move16(); @@ -1160,12 +1143,8 @@ void mctStereoIGF_enc_fx( { q_spectrum = sub( 31, st->hTcxEnc->spectrum_e[n] ); - set16_fx( exp_powerSpec[ch], sub( Q31, q_powerSpec[ch] ), N_MAX + L_MDCT_OVLP_MAX ); -#ifndef MSAN_FIX - ProcessIGF_ivas_fx( st, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); -#else - ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); -#endif + set16_fx( exp_powerSpec[ch], sub( Q31, q_powerSpec[ch] ), L_FRAME48k ); + ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_origSpec, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); st->hTcxEnc->spectrum_e[n] = sub( 31, q_spectrum ); move16(); diff --git a/lib_enc/ivas_mdct_core_enc_fx.c b/lib_enc/ivas_mdct_core_enc_fx.c index 9f674473ecec6f4e2b009791b04c1debadaf6f7b..b4eba62010700dd4e91a3944c7a4f0b6b936d6f9 100644 --- a/lib_enc/ivas_mdct_core_enc_fx.c +++ b/lib_enc/ivas_mdct_core_enc_fx.c @@ -233,7 +233,7 @@ static Word16 kernel_switch_detect_fx( L_tmp1 = Sqrt32( L_tmp1, &exp_tmp1 ); L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, exp_tmp, L_tmp1, exp_tmp1, &exp_tmp ); L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, exp_tmp, ONE_IN_Q30, 1, &exp_tmp ); - cov00 = BASOP_Util_Divide3232_Scale_cadence( cov00, L_tmp, &exp_tmp1 ); + cov00 = BASOP_Util_Divide3232_Scale_newton( cov00, L_tmp, &exp_tmp1 ); exp_tmp = add( exp_tmp1, sub( sub( Q31, q_com ), exp_tmp ) ); /* Added saturation to handle overflows when value is very close to 1.f */ cov00 = L_shl_sat( cov00, exp_tmp ); // Q31 @@ -247,7 +247,7 @@ static Word16 kernel_switch_detect_fx( L_tmp1 = Sqrt32( L_tmp1, &exp_tmp1 ); L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, exp_tmp, L_tmp1, exp_tmp1, &exp_tmp ); L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, exp_tmp, ONE_IN_Q30, 1, &exp_tmp ); - cov90 = BASOP_Util_Divide3232_Scale_cadence( cov90, L_tmp, &exp_tmp1 ); + cov90 = BASOP_Util_Divide3232_Scale_newton( cov90, L_tmp, &exp_tmp1 ); exp_tmp = add( exp_tmp1, sub( sub( Q31, q_com ), exp_tmp ) ); /* Added saturation to handle overflows when value is very close to 1.f */ cov90 = L_shl_sat( cov90, exp_tmp ); // Q31 @@ -362,23 +362,24 @@ static void kernel_switch_trafo_fx( tmp = BASOP_Util_Divide1616_Scale( NORM_MDCT_FACTOR, add( shr( l, 1 ), add( m, shr( r, 1 ) ) ), &exp_tmp ); tmp = Sqrt16( tmp, &exp_tmp ); - factor = L_shl( L_deposit_h( tmp ), sub( exp_tmp, 1 ) ); // Q30 - v_multc_fixed( y, factor, y, add( shr( l, 1 ), add( m, shr( r, 1 ) ) ) ); // (Q_in, Q30) -> Q_in - 1 + factor = L_shl( L_deposit_h( tmp ), sub( exp_tmp, 1 ) ); // Q30 + v_multc_fx( y, factor, y, add( shr( l, 1 ), add( m, shr( r, 1 ) ) ) ); // (Q_in, Q30) -> Q_in - 1 return; } static void kernel_switch_update_transforms_fx( - Word32 *sigR, /* i/o: MDCT samples of the given channel (*q_sig) */ - Word32 *sigI, /* i/o: MDST samples of the given channel (*q_sig) */ - Word16 *q_sig, /* i/o: Common Q of MDCT and MDST samples of the given channel */ - const Word16 tcxTransType, /* i : TCX transform type, cf also above */ - TCX_CONFIG_HANDLE hTcxCfg, /* i : TCX configuration handle, pointer */ - const Word16 bwidthSwCnt, /* i : bandwidth switching counter in st */ - const UWord16 kernelType, /* i : TCX transform kernel type (0 - 3) */ - Word16 *tcxTimeSignal, /* i : hTcxEnc->new_speech_TCX buf in st */ - const Word16 *speech_TCX, /* i : hTcxEnc->speech_TCX buffer in st */ + Word32 *sigR, /* i/o: MDCT samples of the given channel (*q_sig) */ + Word32 *sigI, /* i/o: MDST samples of the given channel (*q_sig) */ + Word16 *q_sig, /* i/o: Common Q of MDCT and MDST samples of the given channel */ + const Word16 tcxTransType, /* i : TCX transform type, cf also above */ + TCX_CONFIG_HANDLE hTcxCfg, /* i : TCX configuration handle, pointer */ + const Word16 bwidthSwCnt, /* i : bandwidth switching counter in st */ + const UWord16 kernelType, /* i : TCX transform kernel type (0 - 3) */ + Word16 *tcxTimeSignal, /* i : hTcxEnc->new_speech_TCX buf in st */ + const Word16 *speech_TCX, /* i : hTcxEnc->speech_TCX buffer in st */ + const Word16 q_speech, Word32 *windowedTimeSignal, /* i/o: windowed input and scratch buffer (*q_windowedTimeSignal) */ Word16 *q_windowedTimeSignal, /* i/o: Q of windowed input and scratch buffer */ const Word16 L_subframe /* i : transform length (number of bins) */ @@ -429,25 +430,17 @@ static void kernel_switch_update_transforms_fx( Word32 factor; n = extract_l( Mpy_32_32( s, 603979776 /* N_ZERO_MDCT_NS / FRAME_SIZE_NS in Q31 */ ) ); -#ifdef MSAN_FIX - Scale_sig( &tcxTimeSignal[n - s], add( sub( shl( s, 1 ), n ), 1 ), -Q1 ); // Q0 -> Q-1 -#else - Scale_sig( &tcxTimeSignal[n - s], shl( s, 1 ), -Q1 ); // Q0 -> Q-1 -#endif + Scale_sig( &tcxTimeSignal[n - s], add( sub( shl( s, 1 ), n ), 1 ), sub( -Q1, q_speech ) ); // q_speech -> Q-1 wtda_ext_fx( tcxTimeSignal, windowedTimeSignal_16, extract_l( windowedTimeSignal[0] ), extract_l( windowedTimeSignal[1] ), s, kernelType ); // Q-2 -#ifdef MSAN_FIX - Scale_sig( &tcxTimeSignal[n - s], add( sub( shl( s, 1 ), n ), 1 ), Q1 ); // Q-1 -> Q0 -#else - Scale_sig( &tcxTimeSignal[n - s], shl( s, 1 ), Q1 ); // Q-1 -> Q0 -#endif - Copy_Scale_sig_16_32_no_sat( windowedTimeSignal_16 /* Q(-2) */, windowedTimeSignal, s, Q16 ); // Q14 - scale_sig32( windowedTimeSignal, s, -Q8 /* guard bits */ ); // Q6 + Scale_sig( &tcxTimeSignal[n - s], add( sub( shl( s, 1 ), n ), 1 ), sub( q_speech, -Q1 ) ); // Q-1 -> q_speech + Copy_Scale_sig_16_32_no_sat( windowedTimeSignal_16 /* Q(-2) */, windowedTimeSignal, s, Q16 ); // Q14 + scale_sig32( windowedTimeSignal, s, -Q8 /* guard bits */ ); // Q6 edxt_fx( windowedTimeSignal, sigR, s, kernelType, FALSE ); tmp = BASOP_Util_Divide1616_Scale( NORM_MDCT_FACTOR, s, &exp_tmp ); tmp = Sqrt16( tmp, &exp_tmp ); factor = L_shl( L_deposit_h( tmp ), sub( exp_tmp, Q1 ) ); // Q30 - v_multc_fixed( sigR, factor, sigR, s ); // (Q6, Q30) -> Q5 + v_multc_fx( sigR, factor, sigR, s ); // (Q6, Q30) -> Q5 q_com = L_norm_arr( sigR, s ); q_com = s_min( add( q_com, Q5 ), *q_sig ); @@ -473,21 +466,22 @@ static void kernel_switch_update_transforms_fx( { Word16 tmp = shr( hTcxCfg->tcx_mdct_window_min_lengthFB, 1 ); Word32 L_tmp; + Word16 shift = sub( *q_windowedTimeSignal, add( Q16, q_speech ) ); IF( GE_32( kernelType, MDCT_II ) ) { FOR( i = minWindowLen; i >= tmp; i-- ) /* outer left folding of shortened long ALDO slope */ { - L_tmp = L_mult( speech_TCX[-1 - i], hTcxCfg->tcx_aldo_window_1_FB[leftOverlap / 2 + minWindowLen - i] ); // (Q0, Q15) -> Q16 - L_tmp = Mpy_32_16_1( L_tmp, hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i].v.im ); // (Q16, Q15) -> Q16 - L_tmp = L_shl( L_tmp, sub( *q_windowedTimeSignal, Q16 ) ); // *q_windowedTimeSignal + L_tmp = L_mult( speech_TCX[-1 - i], hTcxCfg->tcx_aldo_window_1_FB[leftOverlap / 2 + minWindowLen - i] ); // (q_speech, Q15) -> Q16 + q_speech + L_tmp = Mpy_32_16_1( L_tmp, hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i].v.im ); // (Q16 + q_speech, Q15) -> Q16 + q_speech + L_tmp = L_shl( L_tmp, shift ); // *q_windowedTimeSignal windowedTimeSignal[2 + leftOverlap + i] = L_add( windowedTimeSignal[2 + leftOverlap + i], L_tmp ); // *q_windowedTimeSignal move32(); } FOR( i = tmp - 1; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ { - L_tmp = L_mult( speech_TCX[-1 - i], hTcxCfg->tcx_aldo_window_1_FB[leftOverlap / 2 + minWindowLen - i] ); // (Q0, Q15) -> Q16 - L_tmp = Mpy_32_16_1( L_tmp, hTcxCfg->tcx_mdct_window_minimumFB[i].v.re ); // (Q16, Q15) -> Q16 - L_tmp = L_shl( L_tmp, sub( *q_windowedTimeSignal, Q16 ) ); // *q_windowedTimeSignal + L_tmp = L_mult( speech_TCX[-1 - i], hTcxCfg->tcx_aldo_window_1_FB[leftOverlap / 2 + minWindowLen - i] ); // (q_speech, Q15) -> Q16 + q_speech + L_tmp = Mpy_32_16_1( L_tmp, hTcxCfg->tcx_mdct_window_minimumFB[i].v.re ); // (Q16 + q_speech, Q15) -> Q16 + q_speech + L_tmp = L_shl( L_tmp, shift ); // *q_windowedTimeSignal windowedTimeSignal[2 + leftOverlap + i] = L_add( windowedTimeSignal[2 + leftOverlap + i], L_tmp ); // *q_windowedTimeSignal move32(); } @@ -496,17 +490,17 @@ static void kernel_switch_update_transforms_fx( { FOR( i = minWindowLen; i >= tmp; i-- ) /* outer left folding of shortened long ALDO slope */ { - L_tmp = L_mult( negate( speech_TCX[-1 - i] ), hTcxCfg->tcx_aldo_window_1_FB[leftOverlap / 2 + minWindowLen - i] ); // (Q0, Q15) -> Q16 - L_tmp = Mpy_32_16_1( L_tmp, hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i].v.im ); // (Q16, Q15) -> Q16 - L_tmp = L_shl( L_tmp, sub( *q_windowedTimeSignal, Q16 ) ); // *q_windowedTimeSignal + L_tmp = L_mult( negate( speech_TCX[-1 - i] ), hTcxCfg->tcx_aldo_window_1_FB[leftOverlap / 2 + minWindowLen - i] ); // (q_speech, Q15) -> Q16 + q_speech + L_tmp = Mpy_32_16_1( L_tmp, hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i].v.im ); // (Q16 + q_speech, Q15) -> Q16 + q_speech + L_tmp = L_shl( L_tmp, shift ); // *q_windowedTimeSignal windowedTimeSignal[2 + leftOverlap + i] = L_add( windowedTimeSignal[2 + leftOverlap + i], L_tmp ); // *q_windowedTimeSignal move32(); } FOR( i = tmp - 1; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ { - L_tmp = L_mult( negate( speech_TCX[-1 - i] ), hTcxCfg->tcx_aldo_window_1_FB[leftOverlap / 2 + minWindowLen - i] ); // (Q0, Q15) -> Q16 - L_tmp = Mpy_32_16_1( L_tmp, hTcxCfg->tcx_mdct_window_minimumFB[i].v.re ); // (Q16, Q15) -> Q16 - L_tmp = L_shl( L_tmp, sub( *q_windowedTimeSignal, Q16 ) ); // *q_windowedTimeSignal + L_tmp = L_mult( negate( speech_TCX[-1 - i] ), hTcxCfg->tcx_aldo_window_1_FB[leftOverlap / 2 + minWindowLen - i] ); // (q_speech, Q15) -> Q16 + q_speech + L_tmp = Mpy_32_16_1( L_tmp, hTcxCfg->tcx_mdct_window_minimumFB[i].v.re ); // (Q16 + q_speech, Q15) -> Q16 + q_speech + L_tmp = L_shl( L_tmp, shift ); // *q_windowedTimeSignal windowedTimeSignal[2 + leftOverlap + i] = L_add( windowedTimeSignal[2 + leftOverlap + i], L_tmp ); // *q_windowedTimeSignal move32(); } @@ -545,11 +539,7 @@ static void kernel_switch_update_transforms_fx( Copy_Scale_sig_32_16( windowedTimeSignal + 2, windowedTimeSignal_16 + 2, add( s, shr( add( leftOverlap, rightOverlap ), 1 ) ), -Q16 ); // *q_windowedTimeSignal - Q16 WindowSignal( hTcxCfg, shr( leftOverlap, 1 ), RECTANGULAR_OVERLAP, MIN_OVERLAP, &leftOverlap, &rightOverlap, windowedTimeSignal_16 + 2, &s, tcx5Win, 0, 1 ); // *q_windowedTimeSignal - Q16 Copy_Scale_sig_16_32_no_sat( tcx5Win, tcx5Win_32, add( s, shr( add( leftOverlap, rightOverlap ), 1 ) ), Q16 ); // *q_windowedTimeSignal -#ifdef FIX_ISSUE_1157 q_shift = -Q8; -#else - q_shift = -Q7; -#endif move16(); scale_sig32( tcx5Win_32, add( s /* L_subfr. */, shr( add( leftOverlap, rightOverlap ), 1 ) ), q_shift ); // *q_windowedTimeSignal + q_shift kernel_switch_trafo_fx( tcx5Win_32, sigR, leftOverlap, sub( s /* L_subfr. */, shr( add( leftOverlap, rightOverlap ), 1 ) ), rightOverlap, kernelType ); // *q_windowedTimeSignal + q_shift @@ -579,11 +569,7 @@ static void kernel_switch_update_transforms_fx( ELSE /* tcxTransType != TCX_5 */ { Word16 q_shift, q_com, q_temp; -#ifdef FIX_ISSUE_1157 q_shift = -Q8; -#else - q_shift = -Q7; -#endif move16(); scale_sig32( windowedTimeSignal + 2, add( s /* L_subfr. */, shr( add( leftOverlap, rightOverlap ), 1 ) ), q_shift ); // *q_windowedTimeSignal + q_shift kernel_switch_trafo_fx( windowedTimeSignal + 2, sigR, leftOverlap, sub( s /* L_subfr. */, shr( add( leftOverlap, rightOverlap ), 1 ) ), rightOverlap, kernelType ); // *q_windowedTimeSignal + q_shift @@ -605,8 +591,8 @@ static void kernel_switch_update_transforms_fx( Word16 tmp, exp_tmp; Word32 factor; tmp = BASOP_Util_Divide1616_Scale( bwidthSwCnt, BWS_TRAN_PERIOD, &exp_tmp ); - factor = L_shl( L_deposit_h( tmp ), exp_tmp ); // Q31 - v_multc_fixed( sigR + L_FRAME16k / nSubframes, factor, sigR + L_FRAME16k / nSubframes, sub( s, idiv1616( L_FRAME16k, nSubframes ) ) ); // *q_sig + factor = L_shl( L_deposit_h( tmp ), exp_tmp ); // Q31 + v_multc_fx( sigR + L_FRAME16k / nSubframes, factor, sigR + L_FRAME16k / nSubframes, sub( s, idiv1616( L_FRAME16k, nSubframes ) ) ); // *q_sig } return; @@ -749,7 +735,7 @@ static void applyStereoPreProcessingCplx( d_q = sub( 31, d_q ); deno = L_max( L_shl_sat( 1, d_q ), d_fx ); - sq_imp = BASOP_Util_Divide3232_Scale_cadence( n_fx, deno, &exp ); + sq_imp = BASOP_Util_Divide3232_Scale_newton( n_fx, deno, &exp ); exp = add( exp, sub( d_q, n_q ) ); d_fx = Sqrt32( sq_imp, &exp ); *mdctSample1_fx = Mpy_32_32( dmxR1_fx, d_fx ); @@ -778,7 +764,7 @@ static void applyStereoPreProcessingCplx( d_q = sub( 31, d_q ); deno = L_max( L_shl_sat( 1, d_q ), d_fx ); - sq_imp = BASOP_Util_Divide3232_Scale_cadence( n_fx, deno, &exp ); + sq_imp = BASOP_Util_Divide3232_Scale_newton( n_fx, deno, &exp ); exp = add( exp, sub( d_q, n_q ) ); d_fx = Sqrt32( sq_imp, &exp ); *mdctSample2_fx = Mpy_32_32( dmxR2_fx, d_fx ); @@ -829,6 +815,7 @@ static UWord16 enc_ste_pre_mdct( Word16 mdst_exp1[2 * 960], mdst_exp2[2 * 960]; Word16 x1, x2, x3, x4, ans, tmp; Word32 maxSqrValue_fx; + Word64 sumL_64fx, sumR_64fx; IF( LT_16( nSamplesMax, 512 ) ) { @@ -899,7 +886,9 @@ static UWord16 enc_ste_pre_mdct( { return 0; } - + sumL_64fx = 0, sumR_64fx = 0; + move64(); + move64(); FOR( s = fadeInOff; s < nSampProc; s++ ) { Word32 absMagnL_fx, absMagnR_fx; @@ -912,13 +901,8 @@ static UWord16 enc_ste_pre_mdct( absMagnR_fx = Sqrt32( L_add( Mpy_32_32( sigR1_fx[s], sigR1_fx[s] ), Mpy_32_32( sigI1_fx[s], sigI1_fx[s] ) ), &absMagnR_e ); corr_fx = L_add( corr_fx, L_add( Mpy_32_32( sigR0_fx[s], sigR1_fx[s] ), Mpy_32_32( sigI0_fx[s], sigI1_fx[s] ) ) ); // q_com*2 - 31 -#ifdef FIX_ISSUE_1092 - sumL_fx = L_add( sumL_fx, L_add( L_shr( sigR0_fx[s], 1 ), L_shr( sigI0_fx[s], 1 ) ) ); // q_com -1 - sumR_fx = L_add( sumR_fx, L_add( L_shr( sigR1_fx[s], 1 ), L_shr( sigI1_fx[s], 1 ) ) ); // q_com - 1 -#else - sumL_fx = L_add( sumL_fx, L_add( sigR0_fx[s], sigI0_fx[s] ) ); // q_com - sumR_fx = L_add( sumR_fx, L_add( sigR1_fx[s], sigI1_fx[s] ) ); // q_com -#endif + sumL_64fx = W_add( sumL_64fx, W_add( sigR0_fx[s], sigI0_fx[s] ) ); // q_com + sumR_64fx = W_add( sumR_64fx, W_add( sigR1_fx[s], sigI1_fx[s] ) ); // q_com sumMagnL_fx = BASOP_Util_Add_Mant32Exp( sumMagnL_fx, sumMagnL_e, absMagnL_fx, absMagnL_e, &sumMagnL_e ); sumMagnR_fx = BASOP_Util_Add_Mant32Exp( sumMagnR_fx, sumMagnR_e, absMagnR_fx, absMagnR_e, &sumMagnR_e ); sumPrdLR_fx = BASOP_Util_Add_Mant32Exp( sumPrdLR_fx, sumPrdLR_e, Mpy_32_32( absMagnL_fx, absMagnR_fx ), add( absMagnL_e, absMagnR_e ), &sumPrdLR_e ); @@ -930,11 +914,14 @@ static UWord16 enc_ste_pre_mdct( temp1 = L_shl( preproLen, x1 ); corr_fx = Mpy_32_32( corr_fx, temp1 ); x1 = sub( 62, add( shl( *q_com, 1 ), x1 ) ); -#ifdef FIX_ISSUE_1092 - corr_fx = BASOP_Util_Add_Mant32Exp( corr_fx, x1, Mpy_32_32( sumL_fx, sumR_fx ), sub( 62, shl( sub( *q_com, 1 ), 1 ) ), &x1 ); -#else - corr_fx = BASOP_Util_Add_Mant32Exp( corr_fx, x1, Mpy_32_32( sumL_fx, sumR_fx ), sub( 62, shl( *q_com, 1 ) ), &x1 ); -#endif + + x2 = W_norm( sumL_64fx ); + sumL_fx = W_extract_h( W_shl( sumL_64fx, x2 ) ); + + x3 = W_norm( sumR_64fx ); + sumR_fx = W_extract_h( W_shl( sumR_64fx, x3 ) ); + + corr_fx = BASOP_Util_Add_Mant32Exp( corr_fx, x1, Mpy_32_32( sumL_fx, sumR_fx ), sub( 62, add( sub( add( *q_com, x2 ), 32 ), sub( add( *q_com, x3 ), 32 ) ) ), &x1 ); IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( corr_fx, x1, -maxSqrValue_fx, 52 ), -1 ) ) { @@ -979,7 +966,7 @@ static UWord16 enc_ste_pre_mdct( ELSE { Word16 exp1; - corr_fx = BASOP_Util_Divide3232_Scale_cadence( Mpy_32_32( corr_fx, corr_fx ), Mpy_32_32( sumL_fx, sumR_fx ), &exp1 ); + corr_fx = BASOP_Util_Divide3232_Scale_newton( Mpy_32_32( corr_fx, corr_fx ), Mpy_32_32( sumL_fx, sumR_fx ), &exp1 ); corr_e = add( exp1, sub( shl( corr_e, 1 ), add( sumL_e, sumR_e ) ) ); } test(); @@ -1181,7 +1168,6 @@ void ivas_mdct_core_whitening_enc_fx( push_wmops( "mdct_core_whitening" ); -#ifdef MSAN_FIX FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { FOR( i = 0; i < NB_DIV; i++ ) @@ -1195,7 +1181,6 @@ void ivas_mdct_core_whitening_enc_fx( set16_fx( orig_spectrum_e[ch], 0, NB_DIV ); } set16_fx( q_windowedSignal, Q31, CPE_CHANNELS ); -#endif q_com = Q31; q_min = 0; move16(); @@ -1235,9 +1220,7 @@ void ivas_mdct_core_whitening_enc_fx( orig_spectrum[ch][1] = orig_spectrum_long[ch] + N_TCX10_MAX; mdst_spectrum_fx[ch][0] = mdst_spectrum_long_fx[ch]; mdst_spectrum_fx[ch][1] = mdst_spectrum_long_fx[ch] + N_TCX10_MAX; -#ifdef MSAN_FIX set32_fx( temp_buffer, 0, 15 * L_FRAME48k / 8 ); -#endif } windowedSignal_fx[0] = orig_spectrum_long[0]; /* NOTE temporarily available */ @@ -1280,6 +1263,9 @@ void ivas_mdct_core_whitening_enc_fx( FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; + init_tcx_enc_info_fx( st, &L_subframe, &L_subframeTCX, &tcx_subframe_coded_lines ); + st->hTcxEnc->spectrum_length = L_subframeTCX; + IF( GE_16( add( imult1616( hCPE->cpe_id, CPE_CHANNELS ), ch ), nChannels ) ) { CONTINUE; @@ -1309,16 +1295,17 @@ void ivas_mdct_core_whitening_enc_fx( FOR( n = 0; n < nSubframes; n++ ) { Word16 spect_fx[L_FRAME48k]; - Word16 q_spectrum, l_frame; + Word16 q_spectrum, lshift, l_frame; /*l_frame = (int16_t)(st->input_Fs / FRAMES_PER_SEC); 1 / FRAMES_PER_SEC = 0.2f */ l_frame = extract_l( Mpy_32_32( st->input_Fs, 42949673 /* 0.2f in Q31 */ ) ); if ( EQ_16( st->core, TCX_10_CORE ) ) { l_frame = shr( l_frame, 1 ); } - q_spectrum = L_norm_arr( st->hTcxEnc->spectrum_fx[n], l_frame ); - Copy_Scale_sig32_16( st->hTcxEnc->spectrum_fx[n], spect_fx, l_frame, q_spectrum ); - bw_detect_fx( st, NULL, spect_fx, NULL, NULL, MC_FORMAT /*just cannot be ISM_FORMAT*/, mct_on ); + lshift = L_norm_arr( st->hTcxEnc->spectrum_fx[n], l_frame ); + Copy_Scale_sig32_16( st->hTcxEnc->spectrum_fx[n], spect_fx, l_frame, lshift ); + q_spectrum = sub( add( sub( Q31, st->hTcxEnc->spectrum_e[n] ), lshift ), 16 ); + bw_detect_fx( st, NULL, spect_fx, NULL, NULL, MC_FORMAT /*just cannot be ISM_FORMAT*/, mct_on, q_spectrum ); test(); if ( EQ_16( nSubframes, NB_DIV ) && n == 0 ) @@ -1402,16 +1389,16 @@ void ivas_mdct_core_whitening_enc_fx( q_min = sub( Q31, q_min ); - q_com = s_min( L_norm_arr( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/ ), L_norm_arr( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/ ) ); - q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/ ) ); - q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[1][n], shr( hTcxEnc1->L_frameTCX, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/ ) ); + q_com = s_min( L_norm_arr( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->spectrum_length, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/ ), L_norm_arr( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->spectrum_length, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/ ) ); + q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[0][n], shr( hTcxEnc0->spectrum_length, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/ ) ); + q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[1][n], shr( hTcxEnc1->spectrum_length, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/ ) ); q_com = s_min( Q31, add( q_min, q_com ) ); - Scale_sig32( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEnc0->spectrum_e[n] ) ) ); // q_com - Scale_sig32( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEnc1->spectrum_e[n] ) ) ); // q_com - Scale_sig32( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, mdst_spectrum_e[0][n] ) ) ); // q_com - Scale_sig32( mdst_spectrum_fx[1][n], shr( hTcxEnc1->L_frameTCX, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, mdst_spectrum_e[1][n] ) ) ); // q_com + Scale_sig32( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->spectrum_length, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEnc0->spectrum_e[n] ) ) ); // q_com + Scale_sig32( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->spectrum_length, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEnc1->spectrum_e[n] ) ) ); // q_com + Scale_sig32( mdst_spectrum_fx[0][n], shr( hTcxEnc0->spectrum_length, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, mdst_spectrum_e[0][n] ) ) ); // q_com + Scale_sig32( mdst_spectrum_fx[1][n], shr( hTcxEnc1->spectrum_length, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, mdst_spectrum_e[1][n] ) ) ); // q_com const Word16 switchKernel = /* these 4 transform types can be applied: 0 = MDCT-IV, 1 = MDST-II, 2 = MDCT-II, 3 = MDST-IV */ kernel_switch_detect_fx( hTcxEnc0->spectrum_fx[n], hTcxEnc1->spectrum_fx[n], mdst_spectrum_fx[0][n], mdst_spectrum_fx[1][n], q_com, nSampCore / nSubframes, @@ -1499,11 +1486,11 @@ void ivas_mdct_core_whitening_enc_fx( q_min = s_max( mdst_spectrum_e[0][n], hTcxEnc0->spectrum_e[n] ); q_min = sub( Q31, q_min ); - q_com = s_min( L_norm_arr( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/ ), L_norm_arr( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/ ) ); + q_com = s_min( L_norm_arr( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->spectrum_length, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/ ), L_norm_arr( mdst_spectrum_fx[0][n], shr( hTcxEnc0->spectrum_length, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/ ) ); q_com = s_min( Q31, add( q_min, q_com ) ); - Scale_sig32( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEnc0->spectrum_e[n] ) ) ); // q_com - Scale_sig32( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, mdst_spectrum_e[0][n] ) ) ); // q_com + Scale_sig32( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->spectrum_length, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEnc0->spectrum_e[n] ) ) ); // q_com + Scale_sig32( mdst_spectrum_fx[0][n], shr( hTcxEnc0->spectrum_length, shift ) /*hTcxEnc0->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, mdst_spectrum_e[0][n] ) ) ); // q_com speech = NULL; if ( NE_16( n, 1 ) ) @@ -1511,7 +1498,7 @@ void ivas_mdct_core_whitening_enc_fx( speech = hTcxEnc0->speech_TCX; } kernel_switch_update_transforms_fx( hTcxEnc0->spectrum_fx[n], mdst_spectrum_fx[0][n], &q_com, hTcxEnc0->transform_type[n], sts[0]->hTcxCfg, sts[0]->bwidth_sw_cnt, hTcxEnc0->kernel_type[n], - hTcxEnc0->new_speech_TCX, speech, windowedSignal_fx[0] + i_mult( n, L_FRAME48k ), &q_windowedSignal[0], shr( L_subframeTCX, shift ) /*L_subframeTCX / nSubframes*/ ); + hTcxEnc0->new_speech_TCX, speech, sts[0]->q_inp, windowedSignal_fx[0] + i_mult( n, L_FRAME48k ), &q_windowedSignal[0], shr( L_subframeTCX, shift ) /*L_subframeTCX / nSubframes*/ ); mdst_spectrum_e[0][n] = sub( Q31, q_com ); hTcxEnc0->spectrum_e[n] = sub( Q31, q_com ); move16(); @@ -1520,11 +1507,11 @@ void ivas_mdct_core_whitening_enc_fx( q_min = s_max( mdst_spectrum_e[1][n], hTcxEnc1->spectrum_e[n] ); q_min = sub( Q31, q_min ); - q_com = s_min( L_norm_arr( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/ ), L_norm_arr( mdst_spectrum_fx[1][n], shr( hTcxEnc1->L_frameTCX, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/ ) ); + q_com = s_min( L_norm_arr( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->spectrum_length, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/ ), L_norm_arr( mdst_spectrum_fx[1][n], shr( hTcxEnc1->spectrum_length, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/ ) ); q_com = s_min( Q31, add( q_min, q_com ) ); - Scale_sig32( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEnc1->spectrum_e[n] ) ) ); // q_com - Scale_sig32( mdst_spectrum_fx[1][n], shr( hTcxEnc1->L_frameTCX, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, mdst_spectrum_e[1][n] ) ) ); // q_com + Scale_sig32( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->spectrum_length, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEnc1->spectrum_e[n] ) ) ); // q_com + Scale_sig32( mdst_spectrum_fx[1][n], shr( hTcxEnc1->spectrum_length, shift ) /*hTcxEnc1->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, mdst_spectrum_e[1][n] ) ) ); // q_com speech = NULL; if ( NE_16( n, 1 ) ) @@ -1532,7 +1519,7 @@ void ivas_mdct_core_whitening_enc_fx( speech = hTcxEnc1->speech_TCX; } kernel_switch_update_transforms_fx( hTcxEnc1->spectrum_fx[n], mdst_spectrum_fx[1][n], &q_com, hTcxEnc1->transform_type[n], sts[1]->hTcxCfg, sts[1]->bwidth_sw_cnt, hTcxEnc1->kernel_type[n], - hTcxEnc1->new_speech_TCX, speech, windowedSignal_fx[1] + i_mult( n, L_FRAME48k ), &q_windowedSignal[1], shr( L_subframeTCX, shift ) /*L_subframeTCX / nSubframes*/ ); + hTcxEnc1->new_speech_TCX, speech, sts[1]->q_inp, windowedSignal_fx[1] + i_mult( n, L_FRAME48k ), &q_windowedSignal[1], shr( L_subframeTCX, shift ) /*L_subframeTCX / nSubframes*/ ); mdst_spectrum_e[1][n] = sub( Q31, q_com ); hTcxEnc1->spectrum_e[n] = sub( Q31, q_com ); move16(); @@ -1561,7 +1548,7 @@ void ivas_mdct_core_whitening_enc_fx( move16(); /* length = max(nSampCore / (2 * NB_DIV), L_subframeTCX / (2 * NB_DIV), NB_DIV = 2 */ length = shr( s_max( nSampCore, L_subframeTCX ), 2 ); - len_sbfr = shr( hTcxEnc0->L_frameTCX, shift ); + len_sbfr = shr( hTcxEnc0->spectrum_length, shift ); assert( hTcxEnc0->L_frameTCX == hTcxEnc1->L_frameTCX ); exp_max = s_max( hTcxEnc0->spectrum_e[n], hTcxEnc1->spectrum_e[n] ); exp_max = s_max( exp_max, mdst_spectrum_e[0][n] ); @@ -1653,22 +1640,22 @@ void ivas_mdct_core_whitening_enc_fx( { Word16 length; length = shr( s_max( nSampCore, L_subframeTCX ), shift ); // max(/* nSampCore/nSubframes, L_subframeTCX/nSubframes) */ - Word16 offset2 = sub( shr( hTcxEnc0->L_frameTCX, shift ) /* hTcxEnc0->L_frameTCX/nSubframes */, length ); + Word16 offset2 = sub( shr( hTcxEnc0->spectrum_length, shift ) /* hTcxEnc0->L_frameTCX/nSubframes */, length ); exp_max = s_max( hTcxEnc0->spectrum_e[n], hTcxEnc1->spectrum_e[n] ); exp_max = s_max( exp_max, mdst_spectrum_e[0][n] ); exp_max = s_max( exp_max, mdst_spectrum_e[1][n] ); - exp_com = s_min( L_norm_arr( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ) /* hTcxEnc1->L_frameTCX/nSubframes */ ), L_norm_arr( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ) /* hTcxEnc0->L_frameTCX/nSubframes */ ) ); - exp_com = s_min( exp_com, L_norm_arr( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ) /* hTcxEnc0->L_frameTCX/nSubframes */ ) ); - exp_com = s_min( exp_com, L_norm_arr( mdst_spectrum_fx[1][n], shr( hTcxEnc1->L_frameTCX, shift ) /* hTcxEnc1->L_frameTCX/nSubframes */ ) ); + exp_com = s_min( L_norm_arr( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->spectrum_length, shift ) /* hTcxEnc1->L_frameTCX/nSubframes */ ), L_norm_arr( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->spectrum_length, shift ) /* hTcxEnc0->L_frameTCX/nSubframes */ ) ); + exp_com = s_min( exp_com, L_norm_arr( mdst_spectrum_fx[0][n], shr( hTcxEnc0->spectrum_length, shift ) /* hTcxEnc0->L_frameTCX/nSubframes */ ) ); + exp_com = s_min( exp_com, L_norm_arr( mdst_spectrum_fx[1][n], shr( hTcxEnc1->spectrum_length, shift ) /* hTcxEnc1->L_frameTCX/nSubframes */ ) ); q_com = sub( s_min( Q31, add( sub( Q31, exp_max ), exp_com ) ), 6 ); exp_com = sub( Q31, q_com ); - Scale_sig32( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ) /* hTcxEnc0->L_frameTCX/nSubframes */, sub( hTcxEnc0->spectrum_e[n], exp_com ) ); // hTcxEnc0->spectrum_e - Scale_sig32( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ) /* hTcxEnc1->L_frameTCX/nSubframes */, sub( hTcxEnc1->spectrum_e[n], exp_com ) ); // hTcxEnc0->spectrum_e - Scale_sig32( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ) /* hTcxEnc0->L_frameTCX/nSubframes */, sub( mdst_spectrum_e[0][n], exp_com ) ); // mdst_spectrum_e - Scale_sig32( mdst_spectrum_fx[1][n], shr( hTcxEnc1->L_frameTCX, shift ) /* hTcxEnc1->L_frameTCX/nSubframes */, sub( mdst_spectrum_e[1][n], exp_com ) ); // mdst_spectrum_e + Scale_sig32( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->spectrum_length, shift ) /* hTcxEnc0->L_frameTCX/nSubframes */, sub( hTcxEnc0->spectrum_e[n], exp_com ) ); // hTcxEnc0->spectrum_e + Scale_sig32( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->spectrum_length, shift ) /* hTcxEnc1->L_frameTCX/nSubframes */, sub( hTcxEnc1->spectrum_e[n], exp_com ) ); // hTcxEnc0->spectrum_e + Scale_sig32( mdst_spectrum_fx[0][n], shr( hTcxEnc0->spectrum_length, shift ) /* hTcxEnc0->L_frameTCX/nSubframes */, sub( mdst_spectrum_e[0][n], exp_com ) ); // mdst_spectrum_e + Scale_sig32( mdst_spectrum_fx[1][n], shr( hTcxEnc1->spectrum_length, shift ) /* hTcxEnc1->L_frameTCX/nSubframes */, sub( mdst_spectrum_e[1][n], exp_com ) ); // mdst_spectrum_e Word16 q_com_orig = q_com; move16(); @@ -1753,12 +1740,12 @@ void ivas_mdct_core_whitening_enc_fx( q_min = s_max( mdst_spectrum_e[ch][n], hTcxEncCh->spectrum_e[n] ); q_min = sub( Q31, q_min ); - q_com = s_min( L_norm_arr( mdst_spectrum_fx[ch][n], shr( hTcxEncCh->L_frameTCX, shift ) /*hTcxEncCh->L_frameTCX / nSubframes*/ ), L_norm_arr( hTcxEncCh->spectrum_fx[n], shr( hTcxEncCh->L_frameTCX, shift ) /*hTcxEncCh->L_frameTCX / nSubframes*/ ) ); + q_com = s_min( L_norm_arr( mdst_spectrum_fx[ch][n], shr( hTcxEncCh->spectrum_length, shift ) /*hTcxEncCh->L_frameTCX / nSubframes*/ ), L_norm_arr( hTcxEncCh->spectrum_fx[n], shr( hTcxEncCh->spectrum_length, shift ) /*hTcxEncCh->L_frameTCX / nSubframes*/ ) ); q_com = s_min( Q31, add( q_min, q_com ) ); - Scale_sig32( hTcxEncCh->spectrum_fx[n], shr( hTcxEncCh->L_frameTCX, shift ) /*hTcxEncCh->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEncCh->spectrum_e[n] ) ) ); // q_com - Scale_sig32( mdst_spectrum_fx[ch][n], shr( hTcxEncCh->L_frameTCX, shift ) /*hTcxEncCh->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, mdst_spectrum_e[ch][n] ) ) ); // q_com + Scale_sig32( hTcxEncCh->spectrum_fx[n], shr( hTcxEncCh->spectrum_length, shift ) /*hTcxEncCh->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEncCh->spectrum_e[n] ) ) ); // q_com + Scale_sig32( mdst_spectrum_fx[ch][n], shr( hTcxEncCh->spectrum_length, shift ) /*hTcxEncCh->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, mdst_spectrum_e[ch][n] ) ) ); // q_com speech = hTcxEncCh->speech_TCX; if ( n != 0 ) @@ -1766,7 +1753,7 @@ void ivas_mdct_core_whitening_enc_fx( speech = NULL; } kernel_switch_update_transforms_fx( hTcxEncCh->spectrum_fx[n], mdst_spectrum_fx[ch][n], &q_com, hTcxEncCh->transform_type[n], sts[ch]->hTcxCfg, sts[ch]->bwidth_sw_cnt, hTcxEncCh->kernel_type[n], - hTcxEncCh->new_speech_TCX, speech, windowedSignal_fx[ch] + i_mult( n, L_FRAME48k ), &q_windowedSignal[ch], shr( L_subframeTCX, shift ) /*L_subframeTCX / nSubframes*/ ); + hTcxEncCh->new_speech_TCX, speech, sts[ch]->q_inp, windowedSignal_fx[ch] + i_mult( n, L_FRAME48k ), &q_windowedSignal[ch], shr( L_subframeTCX, shift ) /*L_subframeTCX / nSubframes*/ ); mdst_spectrum_e[ch][n] = sub( Q31, q_com ); move16(); hTcxEncCh->spectrum_e[n] = sub( Q31, q_com ); @@ -1798,7 +1785,7 @@ void ivas_mdct_core_whitening_enc_fx( FOR( n = 0; n < nSubframes; n++ ) { q_min = s_max( q_min, hTcxEnc->spectrum_e[n] ); - q_com = s_min( q_com, L_norm_arr( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->L_frameTCX, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/ ) ); + q_com = s_min( q_com, L_norm_arr( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->spectrum_length, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/ ) ); } } q_min = sub( Q31, q_min ); @@ -1820,7 +1807,7 @@ void ivas_mdct_core_whitening_enc_fx( } FOR( n = 0; n < nSubframes; n++ ) { - Scale_sig32( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->L_frameTCX, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEnc->spectrum_e[n] ) ) ); // q_com + Scale_sig32( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->spectrum_length, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEnc->spectrum_e[n] ) ) ); // q_com hTcxEnc->spectrum_e[n] = sub( Q31, q_com ); move16(); } @@ -1854,8 +1841,8 @@ void ivas_mdct_core_whitening_enc_fx( q_min = s_max( q_min, hTcxEnc->spectrum_e[n] ); q_min = s_max( q_min, mdst_spectrum_e[ch][n] ); - q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[ch][n], shr( hTcxEnc->L_frameTCX, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/ ) ); - q_com = s_min( q_com, L_norm_arr( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->L_frameTCX, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/ ) ); + q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[ch][n], shr( hTcxEnc->spectrum_length, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/ ) ); + q_com = s_min( q_com, L_norm_arr( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->spectrum_length, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/ ) ); } } q_min = sub( Q31, q_min ); @@ -1878,8 +1865,8 @@ void ivas_mdct_core_whitening_enc_fx( } FOR( n = 0; n < nSubframes; n++ ) { - Scale_sig32( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->L_frameTCX, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEnc->spectrum_e[n] ) ) ); // q_com - Scale_sig32( mdst_spectrum_fx[ch][n], shr( hTcxEnc->L_frameTCX, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, mdst_spectrum_e[ch][n] ) ) ); // q_com + Scale_sig32( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->spectrum_length, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, hTcxEnc->spectrum_e[n] ) ) ); // q_com + Scale_sig32( mdst_spectrum_fx[ch][n], shr( hTcxEnc->spectrum_length, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/, sub( q_com, sub( Q31, mdst_spectrum_e[ch][n] ) ) ); // q_com hTcxEnc->spectrum_e[n] = sub( Q31, q_com ); move16(); mdst_spectrum_e[ch][n] = sub( Q31, q_com ); @@ -1977,7 +1964,7 @@ void ivas_mdct_core_whitening_enc_fx( move64(); FOR( i = 0; i < NB_DIV; i++ ) { - chE_tot_fx = W_add( W_shr( chE_fx[i], sub( chE_q[i], q ) ), chE_tot_fx ); + chE_tot_fx = W_add( W_shr( chE_fx[i], s_min( 63, sub( chE_q[i], q ) ) ), chE_tot_fx ); } IF( GT_16( q, Q24 ) ) { @@ -2166,7 +2153,7 @@ void ivas_mdct_core_whitening_enc_fx( { q_min = s_max( q_min, hTcxEnc->spectrum_e[n] ); - q_com = s_min( q_com, L_norm_arr( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->L_frameTCX, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/ ) ); + q_com = s_min( q_com, L_norm_arr( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->spectrum_length, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/ ) ); } } q_min = sub( Q31, q_min ); @@ -2190,7 +2177,7 @@ void ivas_mdct_core_whitening_enc_fx( FOR( n = 0; n < nSubframes; n++ ) { - Scale_sig32( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->L_frameTCX, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/, sub( q_com, sub( 31, hTcxEnc->spectrum_e[n] ) ) ); // q_com + Scale_sig32( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->spectrum_length, shift ) /*hTcxEnc->L_frameTCX / nSubframes*/, sub( q_com, sub( 31, hTcxEnc->spectrum_e[n] ) ) ); // q_com hTcxEnc->spectrum_e[n] = sub( 31, q_com ); move16(); } diff --git a/lib_enc/ivas_omasa_enc_fx.c b/lib_enc/ivas_omasa_enc_fx.c index b5b9102ea14864b937437d538f1953254d1290cb..236d4b20508872b896107a4bf4524c4f8bad6e78 100644 --- a/lib_enc/ivas_omasa_enc_fx.c +++ b/lib_enc/ivas_omasa_enc_fx.c @@ -45,9 +45,17 @@ #endif +/*------------------------------------------------------------------------- + * Local constants + *------------------------------------------------------------------------*/ + +#define OMASA_FEC_MAX 5 + + /*------------------------------------------------------------------------- * Local function prototypes *------------------------------------------------------------------------*/ + static void ivas_omasa_param_est_enc_fx( OMASA_ENC_HANDLE hOMasa, OMASA_ENCODER_DATA_HANDLE hOmasaData, @@ -82,14 +90,19 @@ static void ivas_omasa_dmx_fx( Word16 prev_gains[][MASA_MAX_TRANSPORT_CHANNELS], /*o:q15*/ const Word16 interpolator[L_FRAME48k] /*i:q15*/ ); -static void computeIntensityVector_enc_fx( - const Word16 *band_grouping, /* i : Band grouping for estimation */ - Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ - Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ - const Word16 num_frequency_bands, /* i : Number of frequency bands */ - Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /* o : Intensity vector */ - Word16 guard_bits ); -static void computeReferencePower_omasa_ivas_fx( const Word16 *band_grouping, Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], Word32 *reference_power, const Word16 enc_param_start_band, const Word16 num_freq_bands, Word16 q_Cldfb, Word16 *ref_exp ); + +void computeIntensityVector_enc_fx( + const Word16 *band_grouping, + Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /*inp_q*/ + Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /*inp_q*/ + const Word16 num_frequency_bands, + Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /*exp: exp_intensity_real*/ + Word16 q_intensity_real[MASA_FREQUENCY_BANDS], + Word16 inp_q ); + +static void computeReferencePower_omasa_ivas_fx( const Word16 *band_grouping, Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], Word32 *reference_power, const Word16 enc_param_start_band, const Word16 num_freq_bands, Word16 q_Cldfb, Word16 q_reference_power[CLDFB_NO_CHANNELS_MAX] ); + + /*--------------------------------------------------------------------------* * ivas_omasa_enc_open() * @@ -184,6 +197,8 @@ ivas_error ivas_omasa_enc_open_fx( hOMasa->prev_selected_object = 0; hOMasa->changing_object = 0; + hOMasa->since_obj_change_cnt = 0; + move16(); move16(); move16(); @@ -206,13 +221,13 @@ ivas_error ivas_omasa_enc_open_fx( return error; } + /*--------------------------------------------------------------------------* * ivas_omasa_enc_close() * * Close OMASA handle *--------------------------------------------------------------------------*/ - void ivas_omasa_enc_close_fx( OMASA_ENC_HANDLE *hOMasa /* i/o: encoder OMASA handle */ ) @@ -227,7 +242,7 @@ void ivas_omasa_enc_close_fx( FOR( i = 0; i < ( *hOMasa )->num_Cldfb_instances; i++ ) { - deleteCldfb_ivas_fx( &( ( *hOMasa )->cldfbAnaEnc[i] ) ); + deleteCldfb_fx( &( ( *hOMasa )->cldfbAnaEnc[i] ) ); } FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) @@ -257,11 +272,13 @@ void ivas_omasa_enc_close_fx( return; } + /*--------------------------------------------------------------------------* * ivas_omasa_enc_config() * * oMASA encoder configuration *--------------------------------------------------------------------------*/ + ivas_error ivas_omasa_enc_config_fx( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) @@ -345,6 +362,7 @@ ivas_error ivas_omasa_enc_config_fx( ivas_write_format_fx( st_ivas ); + /* OMASA encoder handle */ test(); test(); IF( NE_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && st_ivas->hOMasa == NULL ) @@ -360,6 +378,22 @@ ivas_error ivas_omasa_enc_config_fx( st_ivas->hOMasa = NULL; } + /* OMASA energy handle */ + test(); + test(); + IF( NE_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && st_ivas->hMasa->data.hOmasaData->hOmasaEnergy == NULL ) + { + IF( ( st_ivas->hMasa->data.hOmasaData->hOmasaEnergy = (OMASA_ENCODER_ENERGY_HANDLE) malloc( sizeof( OMASA_ENCODER_ENERGY_STATE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA energy handle\n" ) ); + } + } + ELSE IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && st_ivas->hMasa->data.hOmasaData->hOmasaEnergy != NULL ) + { + free( st_ivas->hMasa->data.hOmasaData->hOmasaEnergy ); + st_ivas->hMasa->data.hOmasaData->hOmasaEnergy = NULL; + } + st_ivas->hCPE[0]->element_brate = L_sub( ivas_total_brate, ism_total_brate ); move32(); @@ -395,6 +429,7 @@ ivas_error ivas_omasa_enc_config_fx( * * Frame-by-frame config for oMASA *--------------------------------------------------------------------------*/ + void ivas_omasa_set_config_fx( OMASA_ENC_HANDLE hOMasa, /* i/o: OMASA encoder handle */ MASA_ENCODER_HANDLE hMasa, /* i : MASA encoder handle */ @@ -472,11 +507,12 @@ void ivas_omasa_set_config_fx( * * Main OMASA encoding function *--------------------------------------------------------------------------*/ + void ivas_omasa_enc_fx( OMASA_ENC_HANDLE hOMasa, /* i/o: OMASA encoder handle */ MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder handle */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handle */ - Word32 *data_in[], /* i/o: Input / transport audio signals q_data*/ + Word32 *data_in[], /* i/o: Input / transport audio signals q_data*/ Word16 q_data, /* i : Q0 Stores the q for data_in */ const Word16 input_frame, /* i : Input frame size */ const Word16 nchan_transport, /* i : Number of transport channels */ @@ -503,6 +539,7 @@ void ivas_omasa_enc_fx( UWord8 fade_out_separate_object; UWord8 fade_in_separate_object; Word32 temp32; /*temp32_e*/ + /* Estimate broadband energies */ nchan_all_inp = add( nchan_ism, nchan_transport ); set_zero_fx( broadband_energy_fx, nchan_all_inp ); @@ -648,6 +685,25 @@ void ivas_omasa_enc_fx( move32(); move16(); } + + /* force absolute MD coding in case of change of separated object */ + IF( NE_16( hOMasa->prev_selected_object, selected_object ) ) + { + hOMasa->since_obj_change_cnt = 0; + hIsmMeta[0]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; + move16(); + move16(); + } + ELSE + { + hOMasa->since_obj_change_cnt = add( hOMasa->since_obj_change_cnt, 1 ); + hOMasa->since_obj_change_cnt = s_min( OMASA_FEC_MAX, hOMasa->since_obj_change_cnt ); + IF( LT_16( hOMasa->since_obj_change_cnt, OMASA_FEC_MAX ) ) + { + hIsmMeta[0]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; + move16(); + } + } hOMasa->prev_selected_object = selected_object; move16(); @@ -795,7 +851,7 @@ void ivas_set_ism_importance_interformat_fx( IF( active_flag == 0 ) { test(); - if ( GT_16( st->lp_noise_fx, 3840 /* 15 in Q8 */ ) || LT_16( sub( lp_noise_CPE_fx, st->lp_noise_fx ), 7680 /* 30 in Q8 */ ) ) + if ( GT_32( st->lp_noise_32fx, 251658240 /* 15 in Q24 */ ) || LT_16( sub( lp_noise_CPE_fx, extract_h( st->lp_noise_32fx ) ), 7680 /* 30 in Q8 */ ) ) { active_flag = 1; move16(); @@ -848,6 +904,7 @@ void ivas_set_ism_importance_interformat_fx( return; } + /*--------------------------------------------------------------------------* * ivas_set_surplus_brate_enc() * @@ -904,7 +961,6 @@ void ivas_set_surplus_brate_enc( dbgwrite( &tmpF, 4, 1, input_frame, "res/brate_MASA_MD" ); /* == MASA MD bitrate */ } #endif - return; } @@ -917,11 +973,11 @@ void ivas_set_surplus_brate_enc( /*! r: OMASA energy bitrate flag */ Word16 ivas_omasa_ener_brate_fx( - const Word16 nchan_ism, /* i : number of ISMs */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - Word32 *data_f[], /* i : Input / transport audio signals data_e*/ - const Word16 input_frame, /* i : Input frame size */ - Word16 data_e /*i:exponent for data_f */ + const Word16 nchan_ism, /* i : number of ISMs */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + Word32 *data_f[], /* i : Input / transport audio signals data_e*/ + const Word16 input_frame, /* i : Input frame size */ + const Word16 data_e /* i : exponent for data_f */ ) { Word16 i, flag_omasa_ener_brate; @@ -929,6 +985,7 @@ Word16 ivas_omasa_ener_brate_fx( Word16 energy_ism_e, energy_masa_e; Word32 temp_32; Word16 temp, temp_e; + flag_omasa_ener_brate = 0; energy_ism_e = 0; energy_masa_e = 0; @@ -987,6 +1044,7 @@ Word16 ivas_omasa_ener_brate_fx( return flag_omasa_ener_brate; } + /*--------------------------------------------------------------------------* * Local functions *--------------------------------------------------------------------------*/ @@ -1036,13 +1094,15 @@ static void ivas_omasa_param_est_enc_fx( Word16 q; /*stores q for cldfb buffers*/ Word32 temp; Word16 temp_e; + Word16 q_intensity_real_fx[MASA_FREQUENCY_BANDS], q_reference_power_fx[CLDFB_NO_CHANNELS_MAX]; + OMASA_ENCODER_ENERGY_HANDLE hOmasaEnergy = hOmasaData->hOmasaEnergy; ref_exp = 0; norm_buff = MAX16B; dir_v_e = MIN_16; num_freq_bins = hOMasa->cldfbAnaEnc[0]->no_channels; num_freq_bands = hOMasa->nbands; - l_ts = idiv1616( input_frame, CLDFB_NO_COL_MAX ); + l_ts = shr( input_frame, CLDFB_NO_COL_MAX_LOG2 ); move16(); move16(); move16(); @@ -1050,10 +1110,8 @@ static void ivas_omasa_param_est_enc_fx( move16(); /* Need to initialize renormalization_factors, and variables to be normalized */ -#ifdef MSAN_FIX set_zero_fx( &Foa_RealBuffer_fx[0][0], FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ); set_zero_fx( &Foa_ImagBuffer_fx[0][0], FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ); -#endif set_zero_fx( renormalization_factor_diff_fx, hOMasa->nbands ); set_zero_fx( diffuseness_m_fx, hOMasa->nbands ); @@ -1104,8 +1162,9 @@ static void ivas_omasa_param_est_enc_fx( move16(); move16(); } - set_zero_fx( hOmasaData->energy_ism_fx[block_m_idx], num_freq_bands ); - set16_fx( hOmasaData->energy_ism_fx_e[block_m_idx], 0, num_freq_bands ); + set_zero_fx( hOmasaEnergy->energy_ism_fx[block_m_idx], num_freq_bands ); + set16_fx( hOmasaEnergy->energy_ism_fx_e[block_m_idx], 0, num_freq_bands ); + FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { norm_buff = MAX16B; @@ -1114,11 +1173,6 @@ static void ivas_omasa_param_est_enc_fx( { q = q_data; move16(); -#if 0 - scale_sig32( hOMasa->cldfbAnaEnc[i]->cldfb_state_fx, hOMasa->cldfbAnaEnc[i]->cldfb_state_length, sub( q, hOMasa->cldfbAnaEnc[i]->Q_cldfb_state ) ); - hOMasa->cldfbAnaEnc[i]->Q_cldfb_state = q; - move16(); -#endif cldfbAnalysis_ts_fx_var_q( &( data[i][l_ts * ts] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &q ); /*q_data-5*/ norm_buff = s_min( norm_buff, L_norm_arr( Chnl_RealBuffer_fx[i], 60 ) ); norm_buff = s_min( norm_buff, L_norm_arr( Chnl_ImagBuffer_fx[i], 60 ) ); @@ -1150,7 +1204,7 @@ static void ivas_omasa_param_est_enc_fx( { temp = L_add( Mpy_32_32( Chnl_RealBuffer_fx[k][j], Chnl_RealBuffer_fx[k][j] ), Mpy_32_32( Chnl_ImagBuffer_fx[k][j], Chnl_ImagBuffer_fx[k][j] ) ); temp_e = sub( 62, shl( q, 1 ) ); - hOmasaData->energy_ism_fx[block_m_idx][i] = BASOP_Util_Add_Mant32Exp( hOmasaData->energy_ism_fx[block_m_idx][i], hOmasaData->energy_ism_fx_e[block_m_idx][i], temp, temp_e, &hOmasaData->energy_ism_fx_e[block_m_idx][i] ); /*2q-31*/ + hOmasaEnergy->energy_ism_fx[block_m_idx][i] = BASOP_Util_Add_Mant32Exp( hOmasaEnergy->energy_ism_fx[block_m_idx][i], hOmasaEnergy->energy_ism_fx_e[block_m_idx][i], temp, temp_e, &hOmasaEnergy->energy_ism_fx_e[block_m_idx][i] ); /*2q-31*/ move32(); } } @@ -1167,8 +1221,8 @@ static void ivas_omasa_param_est_enc_fx( } /* Y */ - v_multc_fixed( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[1][0], Foa_RealBuffer_fx[1], num_freq_bins ); /*q*/ - v_multc_fixed( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[1][0], Foa_ImagBuffer_fx[1], num_freq_bins ); /*q*/ + v_multc_fx( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[1][0], Foa_RealBuffer_fx[1], num_freq_bins ); /*q*/ + v_multc_fx( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[1][0], Foa_ImagBuffer_fx[1], num_freq_bins ); /*q*/ FOR( i = 1; i < nchan_ism; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[1][i], Foa_RealBuffer_fx[1], num_freq_bins ); /*q*/ @@ -1176,41 +1230,51 @@ static void ivas_omasa_param_est_enc_fx( } /* Z */ - v_multc_fixed( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[2][0], Foa_RealBuffer_fx[2], num_freq_bins ); /*q*/ - v_multc_fixed( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[2][0], Foa_ImagBuffer_fx[2], num_freq_bins ); /*q*/ + v_multc_fx( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[2][0], Foa_RealBuffer_fx[2], num_freq_bins ); /*q*/ + v_multc_fx( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[2][0], Foa_ImagBuffer_fx[2], num_freq_bins ); /*q*/ FOR( i = 1; i < nchan_ism; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[2][i], Foa_RealBuffer_fx[2], num_freq_bins ); /*q*/ v_multc_acc_32_32( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[2][i], Foa_ImagBuffer_fx[2], num_freq_bins ); /*q*/ } - /* X */ - v_multc_fixed( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[3][0], Foa_RealBuffer_fx[3], num_freq_bins ); /*q*/ - v_multc_fixed( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[3][0], Foa_ImagBuffer_fx[3], num_freq_bins ); /*q*/ + v_multc_fx( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[3][0], Foa_RealBuffer_fx[3], num_freq_bins ); /*q*/ + v_multc_fx( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[3][0], Foa_ImagBuffer_fx[3], num_freq_bins ); /*q*/ FOR( i = 1; i < nchan_ism; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_RealBuffer_fx[3], num_freq_bins ); /*q*/ v_multc_acc_32_32( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_ImagBuffer_fx[3], num_freq_bins ); /*q*/ } + /* Direction estimation */ - norm_buff = L_norm_arr( &Foa_RealBuffer_fx[0][0], FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ); - norm_buff = s_min( norm_buff, L_norm_arr( &Foa_ImagBuffer_fx[0][0], FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ) ); - guard_bits = find_guarded_bits_fx( max_band_grouping_diff ); - guard_bits = add( guard_bits, sub( 1, norm_buff ) ); - computeIntensityVector_enc_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, guard_bits ); - intensity_real_e = sub( add( 62, guard_bits ), shl( q, 1 ) ); - - computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], intensity_real_e -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC - , - NULL -#endif - ); + computeIntensityVector_enc_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, q_intensity_real_fx, q ); + + computeDirectionVectors_fx2( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], 0, q_intensity_real_fx ); /* Power estimation for diffuseness */ + computeReferencePower_omasa_ivas_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], 0, num_freq_bands, q, q_reference_power_fx ); + + minimum_fx( q_intensity_real_fx, num_freq_bands, &intensity_real_e ); + minimum_fx( q_reference_power_fx, num_freq_bands, &ref_exp ); + + Word16 tmp; + FOR( i = 0; i < num_freq_bands; i++ ) + { + tmp = sub( intensity_real_e, q_intensity_real_fx[i] ); + intensity_real_fx[0][i] = L_shl( intensity_real_fx[0][i], tmp ); // intensity_real_e + move32(); + intensity_real_fx[1][i] = L_shl( intensity_real_fx[1][i], tmp ); // intensity_real_e + move32(); + intensity_real_fx[2][i] = L_shl( intensity_real_fx[2][i], tmp ); // intensity_real_e + move32(); + + tmp = sub( ref_exp, q_reference_power_fx[i] ); + reference_power_fx[ts][i] = L_shl( reference_power_fx[ts][i], tmp ); // ref_exp + } - computeReferencePower_omasa_ivas_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], 0, num_freq_bands, q, &ref_exp ); + intensity_real_e = sub( Q31, intensity_real_e ); + ref_exp = sub( Q31, ref_exp ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hOMasa->index_buffer_intensity = add( ( hOMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ @@ -1227,7 +1291,7 @@ static void ivas_omasa_param_est_enc_fx( Copy32( reference_power_fx[ts], &( hOMasa->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); hOMasa->buffer_energy_q[( index - 1 )] = sub( 31, ref_exp ); move16(); - computeDiffuseness_fixed( hOMasa->buffer_intensity_real_fx, hOMasa->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hOMasa->buffer_intensity_real_q, hOMasa->buffer_energy_q, &q_diffuseness_vector ); + computeDiffuseness_fx( hOMasa->buffer_intensity_real_fx, hOMasa->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hOMasa->buffer_intensity_real_q, hOMasa->buffer_energy_q, &q_diffuseness_vector ); FOR( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) { @@ -1299,6 +1363,7 @@ static void ivas_omasa_param_est_enc_fx( move32(); move32(); } + return; } @@ -1327,6 +1392,8 @@ static void ivas_omasa_energy_and_ratio_est_fx( Word16 norm_Chnl; Word16 temp_e; /* to store temporary exp*/ Word16 energy_ratio_ism_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; /*q30*/ + OMASA_ENCODER_ENERGY_HANDLE hOmasaEnergy = hOmasaData->hOmasaEnergy; + num_freq_bands = hOMasa->nbands; l_ts = shr( input_frame, 4 ); /*input_frame / CLDFB_NO_COL_MAX*/ q_cldfb = q_data; @@ -1334,6 +1401,7 @@ static void ivas_omasa_energy_and_ratio_est_fx( move16(); /*q_cldfb*/ set_zero_fx( &Chnl_RealBuffer_fx[0][0], MAX_NUM_OBJECTS * CLDFB_NO_CHANNELS_MAX ); set_zero_fx( &Chnl_ImagBuffer_fx[0][0], MAX_NUM_OBJECTS * CLDFB_NO_CHANNELS_MAX ); + /* do processing over all CLDFB time slots */ FOR( block_m_idx = 0; block_m_idx < hOMasa->nSubframes; block_m_idx++ ) { @@ -1345,11 +1413,12 @@ static void ivas_omasa_energy_and_ratio_est_fx( /* Reset variable */ FOR( i = 0; i < hOMasa->nbands; i++ ) { - set_zero_fx( hOmasaData->energy_ratio_ism_fx[block_m_idx][i], nchan_ism ); + set_zero_fx( hOmasaEnergy->energy_ratio_ism_fx[block_m_idx][i], nchan_ism ); set16_fx( energy_ratio_ism_e[block_m_idx][i], 0, nchan_ism ); } - set_zero_fx( hOmasaData->energy_ism_fx[block_m_idx], num_freq_bands ); - set16_fx( hOmasaData->energy_ism_fx_e[block_m_idx], 0, num_freq_bands ); + set_zero_fx( hOmasaEnergy->energy_ism_fx[block_m_idx], num_freq_bands ); + set16_fx( hOmasaEnergy->energy_ism_fx_e[block_m_idx], 0, num_freq_bands ); + /* Compute CLDFB */ FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { @@ -1359,10 +1428,7 @@ static void ivas_omasa_energy_and_ratio_est_fx( { q_cldfb = q_data; move16(); - scale_sig32( hOMasa->cldfbAnaEnc[i]->cldfb_state_fx, hOMasa->cldfbAnaEnc[i]->cldfb_state_length, sub( q_cldfb, hOMasa->cldfbAnaEnc[i]->Q_cldfb_state ) ); - hOMasa->cldfbAnaEnc[i]->Q_cldfb_state = q_cldfb; - move16(); - cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][l_ts * ts] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &q_cldfb ); + cldfbAnalysis_ts_fx_var_q( &( data_fx[i][l_ts * ts] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &q_cldfb ); norm_Chnl = s_min( norm_Chnl, L_norm_arr( Chnl_ImagBuffer_fx[i], 60 ) ); norm_Chnl = s_min( norm_Chnl, L_norm_arr( Chnl_RealBuffer_fx[i], 60 ) ); } @@ -1374,6 +1440,7 @@ static void ivas_omasa_energy_and_ratio_est_fx( scale_sig32( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, norm_Chnl ); } q_cldfb = add( q_cldfb, norm_Chnl ); + /* Compute energy */ FOR( i = 0; i < num_freq_bands; i++ ) { @@ -1393,8 +1460,8 @@ static void ivas_omasa_energy_and_ratio_est_fx( tmp64 = W_shl( tmp64, tmpNorm ); tftile_energy_fx = W_extract_h( tmp64 ); tftile_energy_e = sub( tftile_energy_e, tmpNorm ); - hOmasaData->energy_ism_fx[block_m_idx][i] = BASOP_Util_Add_Mant32Exp( hOmasaData->energy_ism_fx[block_m_idx][i], hOmasaData->energy_ism_fx_e[block_m_idx][i], tftile_energy_fx, tftile_energy_e, &hOmasaData->energy_ism_fx_e[block_m_idx][i] ); - hOmasaData->energy_ratio_ism_fx[block_m_idx][i][k] = BASOP_Util_Add_Mant32Exp( hOmasaData->energy_ratio_ism_fx[block_m_idx][i][k], energy_ratio_ism_e[block_m_idx][i][k], tftile_energy_fx, tftile_energy_e, &energy_ratio_ism_e[block_m_idx][i][k] ); + hOmasaEnergy->energy_ism_fx[block_m_idx][i] = BASOP_Util_Add_Mant32Exp( hOmasaEnergy->energy_ism_fx[block_m_idx][i], hOmasaEnergy->energy_ism_fx_e[block_m_idx][i], tftile_energy_fx, tftile_energy_e, &hOmasaEnergy->energy_ism_fx_e[block_m_idx][i] ); + hOmasaEnergy->energy_ratio_ism_fx[block_m_idx][i][k] = BASOP_Util_Add_Mant32Exp( hOmasaEnergy->energy_ratio_ism_fx[block_m_idx][i][k], energy_ratio_ism_e[block_m_idx][i][k], tftile_energy_fx, tftile_energy_e, &energy_ratio_ism_e[block_m_idx][i][k] ); move32(); move32(); } @@ -1409,20 +1476,20 @@ static void ivas_omasa_energy_and_ratio_est_fx( move64(); FOR( j = 0; j < nchan_ism; j++ ) { - hOmasaData->energy_ratio_ism_fx[block_m_idx][i][j] = L_deposit_h( BASOP_Util_Divide3232_Scale( hOmasaData->energy_ratio_ism_fx[block_m_idx][i][j], L_add( hOmasaData->energy_ism_fx[block_m_idx][i], EPSILON_FX ), &temp_e ) ); + hOmasaEnergy->energy_ratio_ism_fx[block_m_idx][i][j] = L_deposit_h( BASOP_Util_Divide3232_Scale( hOmasaEnergy->energy_ratio_ism_fx[block_m_idx][i][j], L_add( hOmasaEnergy->energy_ism_fx[block_m_idx][i], EPSILON_FX ), &temp_e ) ); move32(); - temp_e = add( temp_e, sub( energy_ratio_ism_e[block_m_idx][i][j], hOmasaData->energy_ism_fx_e[block_m_idx][i] ) ); + temp_e = add( temp_e, sub( energy_ratio_ism_e[block_m_idx][i][j], hOmasaEnergy->energy_ism_fx_e[block_m_idx][i] ) ); - hOmasaData->energy_ratio_ism_fx[block_m_idx][i][j] = L_shl( hOmasaData->energy_ratio_ism_fx[block_m_idx][i][j], sub( temp_e, 1 ) ); /* scaling to q30 */ + hOmasaEnergy->energy_ratio_ism_fx[block_m_idx][i][j] = L_shl( hOmasaEnergy->energy_ratio_ism_fx[block_m_idx][i][j], sub( temp_e, 1 ) ); /* scaling to q30 */ move32(); - ism_ratio_sum_fx = W_add( ism_ratio_sum_fx, hOmasaData->energy_ratio_ism_fx[block_m_idx][i][j] ); + ism_ratio_sum_fx = W_add( ism_ratio_sum_fx, hOmasaEnergy->energy_ratio_ism_fx[block_m_idx][i][j] ); } IF( ism_ratio_sum_fx == 0 ) { Word16 temp_ism_ratio = BASOP_Util_Divide1616_Scale( 1, nchan_ism, &temp_e ); FOR( j = 0; j < nchan_ism; j++ ) { - hOmasaData->energy_ratio_ism_fx[block_m_idx][i][j] = L_shl( temp_ism_ratio, add( temp_e, 15 ) ); /*scaling to q30*/ + hOmasaEnergy->energy_ratio_ism_fx[block_m_idx][i][j] = L_shl( temp_ism_ratio, add( temp_e, 15 ) ); /*scaling to q30*/ move32(); } } @@ -1476,7 +1543,7 @@ static void ivas_omasa_dmx_fx( g1 = interpolator[k]; move16(); g2 = sub( MAX_WORD16, g1 ); /*q15*/ -#ifdef IMPROV_PRECISION_EVSBE +#ifdef IMPROV_COMPLEX_BE data_out[j][k] = L_add( data_out[j][k], Mpy_32_32( L_mac( L_mult( g1, gains[j] ), g2, prev_gains[i][j] ) /*q31*/, data_in[i][k] ) ); /*Qx*/ #else data_out[j][k] = L_add( data_out[j][k], Mpy_32_32( L_add( L_mult( g1, gains[j] ), L_mult( g2, prev_gains[i][j] ) ) /*q31*/, data_in[i][k] ) ); /*Qx*/ @@ -1493,20 +1560,27 @@ static void ivas_omasa_dmx_fx( } void computeIntensityVector_enc_fx( - const Word16 *band_grouping, /* i : Band grouping for estimation */ - Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ - Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ - const Word16 num_frequency_bands, /* i : Number of frequency bands */ - Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /* o : Intensity vector */ - Word16 guard_bits ) + const Word16 *band_grouping, + Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /*inp_q*/ + Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /*inp_q*/ + const Word16 num_frequency_bands, + Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /*exp: exp_intensity_real*/ + Word16 q_intensity_real[MASA_FREQUENCY_BANDS], + Word16 inp_q ) { - /* Reminder - * X = a + ib; Y = c + id - * X*Y = ac - bd + i(ad +bc) - */ Word16 i, j; Word32 real, img; Word16 brange[2]; + Word16 shift_intensity_real, num_bins, guard_bits, norm; + + Word64 intensity_real64[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + set64_fx( intensity_real64[i], 0, MASA_FREQUENCY_BANDS ); + } + + shift_intensity_real = sub( shl( inp_q, 1 ), 32 ); FOR( i = 0; i < num_frequency_bands; i++ ) { @@ -1515,25 +1589,46 @@ void computeIntensityVector_enc_fx( brange[1] = band_grouping[i + 1]; move16(); - intensity_real[0][i] = 0; - move32(); - intensity_real[1][i] = 0; - move32(); - intensity_real[2][i] = 0; - move32(); + num_bins = sub( brange[1], brange[0] ); + guard_bits = find_guarded_bits_fx( num_bins ); FOR( j = brange[0]; j < brange[1]; j++ ) { real = Cldfb_RealBuffer[0][j]; - img = Cldfb_ImagBuffer[0][j]; - /* Intensity is XYZ order, audio is WYZX order. */ - intensity_real[0][i] = L_add( intensity_real[0][i], L_add( L_shr( Mpy_32_32( Cldfb_RealBuffer[3][j], real ), guard_bits ), L_shr( Mpy_32_32( Cldfb_ImagBuffer[3][j], img ), guard_bits ) ) ); // output Q= 2* input_q -31-guard_bits move32(); - intensity_real[1][i] = L_add( intensity_real[1][i], L_add( L_shr( Mpy_32_32( Cldfb_RealBuffer[1][j], real ), guard_bits ), L_shr( Mpy_32_32( Cldfb_ImagBuffer[1][j], img ), guard_bits ) ) ); // output Q= 2* input_q -31-guard_bits - move32(); - intensity_real[2][i] = L_add( intensity_real[2][i], L_add( L_shr( Mpy_32_32( Cldfb_RealBuffer[2][j], real ), guard_bits ), L_shr( Mpy_32_32( Cldfb_ImagBuffer[2][j], img ), guard_bits ) ) ); // output Q= 2* input_q -31-guard_bits + img = Cldfb_ImagBuffer[0][j]; move32(); + /* Intensity is XYZ order, audio is WYZX order. */ + intensity_real64[0][i] = W_add( intensity_real64[0][i], W_shr( W_add( W_mult0_32_32( Cldfb_RealBuffer[3][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[3][j], img ) ), guard_bits ) ); // output Q= 2* input_q -guard_bits + move64(); + intensity_real64[1][i] = W_add( intensity_real64[1][i], W_shr( W_add( W_mult0_32_32( Cldfb_RealBuffer[1][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[1][j], img ) ), guard_bits ) ); // output Q= 2* input_q - guard_bits + move64(); + intensity_real64[2][i] = W_add( intensity_real64[2][i], W_shr( W_add( W_mult0_32_32( Cldfb_RealBuffer[2][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[2][j], img ) ), guard_bits ) ); // output Q= 2* input_q - guard_bits + move64(); } + norm = 63; + move16(); + + IF( intensity_real64[0][i] != 0 ) + { + norm = s_min( norm, W_norm( intensity_real64[0][i] ) ); + } + IF( intensity_real64[1][i] != 0 ) + { + norm = s_min( norm, W_norm( intensity_real64[1][i] ) ); + } + IF( intensity_real64[2][i] != 0 ) + { + norm = s_min( norm, W_norm( intensity_real64[2][i] ) ); + } + intensity_real[0][i] = W_extract_h( W_shl( intensity_real64[0][i], norm ) ); // output Q = 2 * inp_q - guard_bits + norm - 32 + move32(); + intensity_real[1][i] = W_extract_h( W_shl( intensity_real64[1][i], norm ) ); // output Q = 2 * inp_q - guard_bits + norm - 32 + move32(); + intensity_real[2][i] = W_extract_h( W_shl( intensity_real64[2][i], norm ) ); // output Q = 2 * inp_q - guard_bits + norm - 32 + move32(); + q_intensity_real[i] = add( shift_intensity_real, sub( norm, guard_bits ) ); + move16(); } return; @@ -1548,13 +1643,14 @@ static void computeReferencePower_omasa_ivas_fx( const Word16 enc_param_start_band, /* i : first band to process */ const Word16 num_freq_bands, /* i : Number of frequency bands */ Word16 q_Cldfb, - Word16 *ref_exp ) + Word16 q_reference_power[CLDFB_NO_CHANNELS_MAX] ) { Word16 brange[2]; Word16 ch_idx, i, j; Word64 reference_power_tmp[CLDFB_NO_CHANNELS_MAX]; - Word16 ref_Q = 63; - move16(); + Word16 shift_ref_power, num_bins, guard_bits, norm; + + shift_ref_power = sub( shl( q_Cldfb, 1 ), 30 ); FOR( i = 0; i < num_freq_bands; i++ ) { @@ -1567,34 +1663,29 @@ static void computeReferencePower_omasa_ivas_fx( reference_power_tmp[i] = 0; move64(); + num_bins = sub( brange[1], brange[0] ); + guard_bits = find_guarded_bits_fx( num_bins ); + FOR( ch_idx = 0; ch_idx < FOA_CHANNELS; ch_idx++ ) { /* abs()^2 */ FOR( j = brange[0]; j < brange[1]; j++ ) { - reference_power_tmp[i] = W_add( reference_power_tmp[i], W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ) ); // Q13 (Q6+Q6+1) + reference_power_tmp[i] = W_add( reference_power_tmp[i], W_shr( W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ), guard_bits ) ); // output Q = 2 * q_cldfb + 1 - guard_bits move64(); } } - } - // v_multc( reference_power, 0.5f, reference_power, num_freq_bands ); - FOR( i = 0; i < num_freq_bands; i++ ) - { - reference_power_tmp[i] = W_shr( reference_power_tmp[i], 1 ); - move64(); - ref_Q = s_min( ref_Q, W_norm( reference_power_tmp[i] ) ); - } - - FOR( i = 0; i < num_freq_bands; i++ ) - { - reference_power_tmp[i] = W_shl( reference_power_tmp[i], ref_Q ); // Q13 + ref_Q - move64(); - reference_power[i] = W_extract_h( reference_power_tmp[i] ); // Q13 + ref_Q -32 + norm = 63; + move16(); + IF( reference_power_tmp[i] != 0 ) + { + norm = W_norm( reference_power_tmp[i] ); + } + reference_power[i] = W_extract_h( W_shl( reference_power_tmp[i], norm ) ); // output Q = 2 * q_cldfb + 2 - guard_bits + norm - 32 move32(); + q_reference_power[i] = add( shift_ref_power, sub( norm, guard_bits ) ); + move16(); } - // ref_exp = 31- ((13+ref_Q) -32) - *ref_exp = sub( 31, ( sub( add( ref_Q, 2 * q_Cldfb + 1 ), 32 ) ) ); - move16(); return; } diff --git a/lib_enc/ivas_osba_enc_fx.c b/lib_enc/ivas_osba_enc_fx.c index 0ca93e1a1dc16bab0cd8bf2b00d17d1674e9580c..3629b856285ae840e4540f4f21685b290e1d624c 100644 --- a/lib_enc/ivas_osba_enc_fx.c +++ b/lib_enc/ivas_osba_enc_fx.c @@ -77,11 +77,7 @@ static void ivas_merge_sba_transports_fx( { FOR( j = 0; j < input_frame; j++ ) { -#ifdef NONE_BE_FIX_BASOP_1044_OSBA_PRERENDER_MIX_GAINS data_out_f[i][j] = L_shr( L_add( L_shr( data_in_f1[i][j], 1 ), L_shr( data_in_f2[i][j], sub( Q_f2, sub( Q_f1, 1 ) ) ) ), Q1 ); -#else - data_out_f[i][j] = L_add( L_shr( data_in_f1[i][j], 1 ), L_shr( data_in_f2[i][j], sub( Q_f2, sub( Q_f1, 1 ) ) ) ); -#endif move32(); } } @@ -126,10 +122,11 @@ ivas_error ivas_osba_enc_open_fx( { hOSba->input_data_mem_fx[i] = NULL; } + + input_frame = extract_l( Mpy_32_32_r( st_ivas->hEncoderConfig->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + Word16 tmp_e; - Word32 tmp32 = L_deposit_h( BASOP_Util_Divide3216_Scale( st_ivas->hEncoderConfig->input_Fs, FRAMES_PER_SEC, &tmp_e ) ); - tmp32 = L_shr( tmp32, sub( 15, tmp_e ) ); - input_frame = extract_l( tmp32 ); + Word32 tmp32; FOR( i = 0; i < input_frame; i++ ) { @@ -192,6 +189,7 @@ ivas_error ivas_osba_enc_reconfig( hEncoderConfig = st_ivas->hEncoderConfig; ivas_total_brate = hEncoderConfig->ivas_total_brate; move32(); + Word16 nchan_transport; IF( NE_32( ivas_total_brate, hEncoderConfig->last_ivas_total_brate ) ) { @@ -206,16 +204,7 @@ ivas_error ivas_osba_enc_reconfig( move16(); old_ism_mode = st_ivas->ism_mode; move32(); - IF( GE_32( ivas_total_brate, IVAS_256k ) ) - { - st_ivas->ism_mode = ISM_SBA_MODE_DISC; - move32(); - } - ELSE - { - st_ivas->ism_mode = ISM_MODE_NONE; - move32(); - } + st_ivas->ism_mode = ivas_osba_ism_mode_select( ivas_total_brate, st_ivas->hEncoderConfig->nchan_ism ); nchan_transport_old = st_ivas->nchan_transport; nCPE_old = st_ivas->nCPE; nSCE_old = st_ivas->nSCE; @@ -365,27 +354,28 @@ ivas_error ivas_osba_enc_reconfig( /*-----------------------------------------------------------------* * Allocate, initialize, and configure SCE/CPE/MCT handles *-----------------------------------------------------------------*/ + + nchan_transport = st_ivas->nchan_transport; + test(); test(); IF( old_ism_mode == ISM_MODE_NONE && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->hEncoderConfig->nchan_ism, 1 ), 1 ) ); - move16(); + nchan_transport = add( st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_ism ); + st_ivas->nCPE = shr_r( nchan_transport, 1 ); } ELSE IF( EQ_32( old_ism_mode, ISM_SBA_MODE_DISC ) && st_ivas->ism_mode == ISM_MODE_NONE ) { nchan_transport_old = add( nchan_transport_old, st_ivas->hEncoderConfig->nchan_ism ); + nchan_transport = st_ivas->nchan_transport; } ELSE IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->hEncoderConfig->nchan_ism, 1 ), 1 ) ); - move16(); - nCPE_old = st_ivas->nCPE; - move16(); - nchan_transport_old = st_ivas->nchan_transport; - move16(); nchan_transport_old = add( nchan_transport_old, st_ivas->hEncoderConfig->nchan_ism ); + nchan_transport = add( st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_ism ); + st_ivas->nCPE = shr_r( nchan_transport, 1 ); } + Word16 tmp_e; Word32 bitrate_per_chan = L_deposit_h( BASOP_Util_Divide3216_Scale( ivas_total_brate, st_ivas->nchan_transport, &tmp_e ) ); bitrate_per_chan = L_shr( bitrate_per_chan, sub( 15, tmp_e ) ); @@ -479,9 +469,6 @@ static void ivas_osba_render_ism_to_sba_fx( Word16 azimuth_fx, elevation_fx; Word32 gains_fx[MAX_INPUT_CHANNELS]; Word32 g1_fx, g2_fx; -#ifndef NONE_BE_FIX_BASOP_1044_OSBA_PRERENDER_MIX_GAINS - Word32 output_gain_fx; -#endif Word16 nchan_sba; nchan_sba = imult1616( add( sba_analysis_order, 1 ), add( sba_analysis_order, 1 ) ); @@ -524,21 +511,6 @@ static void ivas_osba_render_ism_to_sba_fx( } *Q_data = sub( *Q_data, 2 ); -#ifndef NONE_BE_FIX_BASOP_1044_OSBA_PRERENDER_MIX_GAINS - /* Gain with loudness-matching gains */ - // output_gain = 0.7499f; - output_gain_fx = 1610397988; // 0.7499f in Q31 - move32(); - FOR( j = 0; j < nchan_sba; j++ ) - { - FOR( k = 0; k < input_frame; k++ ) - { - // data_out_f[j][k] *= output_gain; - data_out_fx[j][k] = Mpy_32_32( data_out_fx[j][k], output_gain_fx ); - move32(); - } - } -#endif return; } diff --git a/lib_enc/ivas_pca_enc_fx.c b/lib_enc/ivas_pca_enc_fx.c index 2cb347a026794ad3e32d70cad242c81d02731e86..7eb4f18e71e4fc428d47427a68b9349633fd6667 100644 --- a/lib_enc/ivas_pca_enc_fx.c +++ b/lib_enc/ivas_pca_enc_fx.c @@ -415,9 +415,9 @@ void ivas_pca_enc_fx( { temp_fx32 = r_sm_fx[k * FOA_CHANNELS + k]; // min_q move32(); - IF( LT_32( temp_fx32, L_shr( 64424, sub( 31, hPCA->old_r_sm_q ) ) ) ) // IVAS_PCA_COV_THRES in Q31 + IF( LT_32( temp_fx32, L_shr( 64424, sub( 31, hPCA->old_r_sm_q ) ) ) ) // IVAS_PCA_COV_THRES=3e-5f in Q31 { - temp_fx32 = L_shr( 64424, sub( 31, hPCA->old_r_sm_q ) ); // IVAS_PCA_COV_THRES in Q31 /*hPCA->old_r_sm_q */ + temp_fx32 = L_shr( 64424, sub( 31, hPCA->old_r_sm_q ) ); // IVAS_PCA_COV_THRES=3e-5f in Q31 /*hPCA->old_r_sm_q */ } r_sm_fx[k * FOA_CHANNELS + k] = temp_fx32; /* pointer reuse */ // hPCA->old_r_sm_q move32(); diff --git a/lib_enc/ivas_qmetadata_enc_fx.c b/lib_enc/ivas_qmetadata_enc_fx.c index 7de54c482bf7a2a7b8d8f5153206d76a7c15d822..3f18527746af83315451c5160e22d3e48c496f38 100644 --- a/lib_enc/ivas_qmetadata_enc_fx.c +++ b/lib_enc/ivas_qmetadata_enc_fx.c @@ -40,9 +40,11 @@ #include "ivas_rom_com.h" #include "ivas_stat_enc.h" #include "wmc_auto.h" - #include "basop_util.h" -#include "ivas_rom_com_fx.h" +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) +#include +#endif + /*-----------------------------------------------------------------------* * Local function prototypes @@ -50,40 +52,17 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_fx( IVAS_QMETADATA_HANDLE hQMetaData, Word16 *needed_bits, Word16 *nbits_diff, Word16 *dfRatioBits, const Word16 hodirac_flag ); -static Word16 ivas_qmetadata_entropy_encode_diffuseness_fx( - BSTR_ENC_HANDLE hMetaData, - IVAS_QDIRECTION *q_direction, - UWord16 *diffuseness_index_max_ec_frame ); +static Word16 ivas_qmetadata_entropy_encode_diffuseness_fx( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, UWord16 *diffuseness_index_max_ec_frame ); static void ivas_qmetadata_reorder_2dir_bands_fx( IVAS_QMETADATA_HANDLE hQMetaData ); -static Word16 ivas_qmetadata_entropy_encode_df_ratio_fx( - BSTR_ENC_HANDLE hMetaData, - IVAS_QDIRECTION *q_direction, - Word16 *df_ratio_bits ); +static Word16 ivas_qmetadata_entropy_encode_df_ratio_fx( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, Word16 *df_ratio_bits ); -static Word16 ivas_qmetadata_entropy_encode_dir_fx( - BSTR_ENC_HANDLE hMetaData, - IVAS_QDIRECTION *q_direction, - const UWord16 diffuseness_index_max_ec_frame, - const Word16 nbands, - const Word16 start_band, - const Word16 direction_bits_raw, - Word16 max_bits, - const Word16 hrmasa_flag ); +static Word16 ivas_qmetadata_entropy_encode_dir_fx( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const UWord16 diffuseness_index_max_ec_frame, const Word16 nbands, const Word16 start_band, const Word16 direction_bits_raw, Word16 max_bits, const Word16 hrmasa_flag ); -static Word16 ivas_qmetadata_raw_encode_dir_fx( - BSTR_ENC_HANDLE hMetaData, - IVAS_QDIRECTION *q_direction, - const Word16 nbands, - const Word16 start_band ); +static Word16 ivas_qmetadata_raw_encode_dir_fx( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const Word16 nbands, const Word16 start_band ); - -static Word16 ivas_qmetadata_get_optimal_gr_param_fx( - UWord16 *unsigned_data, - const Word16 count, - const Word16 gr_param_count, - Word16 *opt_gr_size ); +static Word16 ivas_qmetadata_get_optimal_gr_param_fx( UWord16 *unsigned_data, const Word16 count, const Word16 gr_param_count, Word16 *opt_gr_size ); Word16 ivas_qmetadata_encode_extended_gr_length_fx( const UWord16 value, const UWord16 alphabet_size, const Word16 gr_param ); @@ -91,17 +70,11 @@ static Word16 ivas_qmetadata_encode_quasi_uniform_length_fx( const UWord16 value static void ivas_qmetadata_encode_quasi_uniform_fx( BSTR_ENC_HANDLE hMetaData, const UWord16 value, const UWord16 alphabet_size ); -static Word16 ivas_qmetadata_reorder_elevation_index_fx( - const Word16 elevation_index, - const Word16 avg_elevation_index, - const Word16 elevation_alphabet ); +static Word16 ivas_qmetadata_reorder_elevation_index_fx( const Word16 elevation_index, const Word16 avg_elevation_index, const Word16 elevation_alphabet ); -static Word16 ivas_qmetadata_reorder_azimuth_index_fx( - const Word16 azimuth_index, - const Word16 avg_azimuth_index, - const Word16 azimuth_alphabet ); -static ivas_error requantize_direction_EC_3_fx( Word16 *extra_bits, IVAS_QDIRECTION *q_direction, const Word16 coding_subbands, BSTR_ENC_HANDLE hMetaData, Word32 elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], Word32 azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], Word16 *ind_order ); +static Word16 ivas_qmetadata_reorder_azimuth_index_fx( const Word16 azimuth_index, const Word16 avg_azimuth_index, const Word16 azimuth_alphabet ); +static ivas_error requantize_direction_EC_3_fx( Word16 *extra_bits, IVAS_QDIRECTION *q_direction, const Word16 coding_subbands, BSTR_ENC_HANDLE hMetaData, Word32 elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], Word32 azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], Word16 *ind_order ); static void calculate_two_distances_fx( Word32 *el_fx, /* i : elevation values */ @@ -116,7 +89,6 @@ static void joint_encoding_fx( IVAS_QDIRECTION *q_direction, const Word16 j, con static ivas_error write_ec_direction_fx( Word16 *num_bits_written, BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const Word16 j_idx, const Word16 len, const Word16 GR_ord_elevation, const Word16 GR_ord_azimuth, const Word16 use_context, const Word16 same ); static Word16 write_fixed_rate_direction_fx( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const Word16 j_idx, const Word16 len ); - static Word16 ivas_qmetadata_quantize_coherence_fx( IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata */ const Word16 idx_d, /* i : current direction index */ @@ -165,31 +137,17 @@ static Word16 encode_surround_coherence_fx( IVAS_QMETADATA *hQMetaData, /* i : quantized metadata */ BSTR_ENC_HANDLE hMetaData /* i/o: metadata bitstream handle */ ); -static Word16 common_direction_fx( - IVAS_QDIRECTION *q_direction, - const Word16 band_idx, - const Word16 len, - const Word16 bits_allowed, - BSTR_ENC_HANDLE hMetaData, - Word32 *elevation_orig_fx, - Word32 *azimuth_orig_fx ); -static Word16 ivas_diffuseness_huff_ec_encode_fx( - BSTR_ENC_HANDLE hMetaData, - const UWord16 idx ); +static Word16 common_direction_fx( IVAS_QDIRECTION *q_direction, const Word16 band_idx, const Word16 len, const Word16 bits_allowed, BSTR_ENC_HANDLE hMetaData, Word32 *elevation_orig_fx, Word32 *azimuth_orig_fx ); -static void ivas_diffuseness_huff_ec_prepare_fx( - IVAS_QDIRECTION *q_direction, - Word16 *best_av, - UWord16 *avr_idx, - Word16 *diffuseness_bits_huff ); +static Word16 ivas_diffuseness_huff_ec_encode_fx( BSTR_ENC_HANDLE hMetaData, const UWord16 idx ); + +static void ivas_diffuseness_huff_ec_prepare_fx( IVAS_QDIRECTION *q_direction, Word16 *best_av, UWord16 *avr_idx, Word16 *diffuseness_bits_huff ); static Word16 coherence_coding_length( const UWord16 *idx_sur_coh_shift, const UWord8 idx_shift_len, const Word16 coding_subbands, const Word16 *no_cv, UWord16 *mr_idx, Word16 *no_cv_shift, Word16 *p_min_idx, Word16 *GR_ord, Word16 *nbits_fr, Word16 *nbits_fr1 ); static Word16 write_2dir_info( BSTR_ENC_HANDLE hMetaData, UWord8 *twoDirBands, const Word16 n, const Word16 k ); -static void transform_azimuth_dir2_fx( - IVAS_QMETADATA_HANDLE hQMetaData, - Word16 *dir2_bands ); +static void transform_azimuth_dir2_fx( IVAS_QMETADATA_HANDLE hQMetaData, Word16 *dir2_bands ); static Word16 ivas_qmetadata_quantize_coherence_hr_512_fx( IVAS_QMETADATA *hQMetaData, const Word16 idx_d, const Word16 all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const Word16 bits_coh ); @@ -367,7 +325,7 @@ ivas_error ivas_qmetadata_enc_encode_fx( { no_TF = add( imult1616( hQMetaData->q_direction[0].cfg.nbands, hQMetaData->q_direction[0].cfg.nblocks ), imult1616( hQMetaData->q_direction[1].cfg.nbands, hQMetaData->q_direction[1].cfg.nblocks ) ); test(); - IF( EQ_16( all_coherence_zero, 0 ) && GE_16( sub( sub( sub( hQMetaData->metadata_max_bits, bits_no_dirs_coh ), idiv1616( imult1616( 43, no_TF ), 10 ) ), sum16_fx( bits_diff, ndirections ) ), MASA_MIN_BITS_SURR_COH ) ) + IF( EQ_16( all_coherence_zero, 0 ) && GE_16( sub( sub( sub( hQMetaData->metadata_max_bits, bits_no_dirs_coh ), mult( imult1616( 43, no_TF ), ONE_BY_TEN_Q15 ) ), sum16_fx( bits_diff, ndirections ) ), MASA_MIN_BITS_SURR_COH ) ) { bits_surround_coh = encode_surround_coherence_fx( hQMetaData, hMetaData ); } @@ -393,7 +351,7 @@ ivas_error ivas_qmetadata_enc_encode_fx( { no_TF = imult1616( hQMetaData->q_direction[0].cfg.nbands, hQMetaData->q_direction[0].cfg.nblocks ); test(); - IF( EQ_16( all_coherence_zero, 0 ) && GE_16( sub( sub( sub( hQMetaData->metadata_max_bits, bits_no_dirs_coh ), idiv1616( imult1616( 43, no_TF ), 10 ) ), bits_diff[0] ), MASA_MIN_BITS_SURR_COH ) ) + IF( EQ_16( all_coherence_zero, 0 ) && GE_16( sub( sub( sub( hQMetaData->metadata_max_bits, bits_no_dirs_coh ), mult( imult1616( 43, no_TF ), ONE_BY_TEN_Q15 ) ), bits_diff[0] ), MASA_MIN_BITS_SURR_COH ) ) { bits_surround_coh = encode_surround_coherence_fx( hQMetaData, hMetaData ); } @@ -864,6 +822,7 @@ void ivas_qmetadata_enc_sid_encode_fx( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */ const Word16 masa_sid_descriptor, /* i : description of MASA SID coding structure */ + const Word16 nchan_transport, /* i : number of transport channels */ const Word16 ivas_format /* i : IVAS format */ ) { @@ -877,11 +836,13 @@ void ivas_qmetadata_enc_sid_encode_fx( Word32 avg_azimuth_fx[MASA_MAXIMUM_CODING_SUBBANDS]; Word16 bits_dir, bits_diff, bits_delta; Word16 metadata_sid_bits; /* bits allocated to SID for metadata */ + Word16 sba_spar_bitlen; IF( EQ_16( ivas_format, SBA_FORMAT ) ) { - metadata_sid_bits = (Word16) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 2 - SID_FORMAT_NBITS; /* -1 for inactive mode header bit*/ - move16(); + sba_spar_bitlen = ivas_sba_spar_sid_bitlen_fx( nchan_transport ); + metadata_sid_bits = (Word16) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - SBA_ORDER_BITS - SBA_PLANAR_BITS - 1; /* -1 for inactive mode header bit*/ + metadata_sid_bits = sub( metadata_sid_bits, sba_spar_bitlen ); } ELSE { @@ -889,7 +850,6 @@ void ivas_qmetadata_enc_sid_encode_fx( move16(); } - /* Save initial position in bitstream */ bit_pos_start = hMetaData->nb_bits_tot; move16(); @@ -1069,8 +1029,8 @@ void ivas_qmetadata_enc_sid_encode_fx( { /*compute the average direction */ ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( q_direction->band_data[b].azimuth_fx[m], q_direction->band_data[b].elevation_fx[m], direction_vector_fx ); - scale_sig32( direction_vector_fx, 3, Q22 - Q30 ); // Q30 -> Q22 - v_add_fixed( avg_direction_vector_fx, direction_vector_fx, avg_direction_vector_fx, 3, 0 ); // Q22 + scale_sig32( direction_vector_fx, 3, Q22 - Q30 ); // Q30 -> Q22 + v_add_fx_no_hdrm( avg_direction_vector_fx, direction_vector_fx, avg_direction_vector_fx, 3 ); // Q22 } ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( avg_direction_vector_fx, Q22, &avg_azimuth_fx[b], &avg_elevation_fx[b] ); @@ -1159,8 +1119,7 @@ void reset_metadata_spatial_fx( { hMetaData->ind_list[0].value = 1; move16(); - metadata_sid_bits = (Word16) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; - move16(); + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - SBA_PLANAR_BITS - SBA_ORDER_BITS; WHILE( ( hMetaData->nb_bits_tot < metadata_sid_bits ) ) { @@ -1188,14 +1147,23 @@ void reset_metadata_spatial_fx( { hMetaData->ind_list[i].nb_bits = -1; move16(); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + sprintf( hMetaData->ind_list[i].function_name, "RESET in reset_metadata_spatial" ); +#endif } FOR( ( j = 0, i = next_ind_sid ); i < last_ind_sid; ( i++, j++ ) ) { hMetaData->ind_list[j].value = hMetaData->ind_list[i].value; hMetaData->ind_list[j].nb_bits = hMetaData->ind_list[i].nb_bits; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( hMetaData->ind_list[j].function_name, hMetaData->ind_list[i].function_name, 100 ); +#endif hMetaData->nb_bits_tot = add( hMetaData->nb_bits_tot, hMetaData->ind_list[j].nb_bits ); hMetaData->ind_list[i].nb_bits = -1; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + sprintf( hMetaData->ind_list[i].function_name, "RESET in reset_metadata_spatial" ); +#endif move16(); move16(); move16(); @@ -1332,12 +1300,12 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512_fx( ratioSum = L_add( hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k], hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] ); IF( GT_32( ratioSum, ONE_IN_Q30 /*1.0f*/ ) ) { - hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_cadence( hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k], ratioSum, &div_e ); + hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_newton( hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k], ratioSum, &div_e ); hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k] = L_shl( hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k], sub( div_e, 1 ) ); move32(); move32(); - hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_cadence( hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k], ratioSum, &div_e ); + hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_newton( hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k], ratioSum, &div_e ); hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] = L_shl( hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k], sub( div_e, 1 ) ); move32(); move32(); @@ -1385,12 +1353,12 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512_fx( IF( GT_32( ratioSum, ONE_IN_Q30 /*1.0f*/ ) ) { - hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_cadence( hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio_fx[k], ratioSum, &div_e ); + hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_newton( hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio_fx[k], ratioSum, &div_e ); hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio_fx[k] = L_shl( hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio_fx[k], sub( div_e, 1 ) ); move32(); move32(); - hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_cadence( hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k], ratioSum, &div_e ); + hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_newton( hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k], ratioSum, &div_e ); hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] = L_shl( hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k], sub( div_e, 1 ) ); move32(); move32(); @@ -2003,6 +1971,9 @@ void restore_metadata_buffer_fx( { hMetaData->ind_list[i].nb_bits = -1; move16(); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + sprintf( hMetaData->ind_list[i].function_name, "RESET in restore_metadata_buffer" ); +#endif } hMetaData->nb_bits_tot = bit_pos_start; move16(); @@ -2402,7 +2373,7 @@ static Word16 ivas_qmetadata_entropy_encode_dir_fx( /*compute the average direction */ ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( q_direction->band_data[i].azimuth_fx[j], q_direction->band_data[i].elevation_fx[j], direction_vector ); scale_sig32( direction_vector, 3, -8 ); // Q30 -> Q22 - v_add_fixed( avg_direction_vector, direction_vector, avg_direction_vector, 3, 0 ); + v_add_fx_no_hdrm( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); } } } @@ -2500,11 +2471,7 @@ static Word16 ivas_qmetadata_entropy_encode_dir_fx( } ELSE { -#ifdef FIX_USAN_ISSUES avg_elevation_index = (UWord16) L_add( avg_elevation_index_initial, ivas_qmetadata_dereorder_generic_fx( avg_elevation_offset ) ); -#else - avg_elevation_index = u_extract_l( UL_addNsD( avg_elevation_index_initial, ivas_qmetadata_dereorder_generic_fx( avg_elevation_offset ) ) ); -#endif } // avg_elevation_index = (uint16_t) ( ( avg_elevation_index + avg_elevation_alphabet ) % avg_elevation_alphabet ); avg_elevation_index = u_extract_l( UL_addNsD( avg_elevation_index, avg_elevation_alphabet ) % avg_elevation_alphabet ); @@ -2639,13 +2606,8 @@ static Word16 ivas_qmetadata_entropy_encode_dir_fx( FOR( avg_azimuth_offset = 0; avg_azimuth_offset < q_direction->cfg.search_effort; avg_azimuth_offset++ ) { set_zero_fx( avg_direction_vector, 3 ); -#ifdef FIX_USAN_ISSUES avg_azimuth_index = (UWord16) L_add( avg_azimuth_index_initial, ivas_qmetadata_dereorder_generic_fx( avg_azimuth_offset ) ); avg_azimuth_index = (UWord16) ( L_add( avg_azimuth_index, avg_azimuth_alphabet ) % avg_azimuth_alphabet ); -#else - avg_azimuth_index = (UWord16) add( avg_azimuth_index_initial, ivas_qmetadata_dereorder_generic_fx( avg_azimuth_offset ) ); - avg_azimuth_index = (UWord16) ( add( avg_azimuth_index, avg_azimuth_alphabet ) % avg_azimuth_alphabet ); -#endif all_zero_dist_azimuth_indexes = 1; move16(); azimuth_bits_ec = ivas_qmetadata_encode_quasi_uniform_length_fx( ivas_qmetadata_reorder_generic_fx( sub( avg_azimuth_index, shr( avg_azimuth_alphabet, 1 ) ) ), avg_azimuth_alphabet ); @@ -2674,7 +2636,7 @@ static Word16 ivas_qmetadata_entropy_encode_dir_fx( IF( LT_16( idx, 4 ) ) { - v_add_fixed( avg_direction_vector, direction_vector, avg_direction_vector, 3, 0 ); + v_add_fx_no_hdrm( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); } } /* project the quantized average azimuth angle to the same grid as the current sample */ @@ -2705,7 +2667,7 @@ static Word16 ivas_qmetadata_entropy_encode_dir_fx( ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( q_direction->band_data[i].azimuth_fx[j], q_direction->band_data[i].elevation_fx[j], direction_vector ); scale_sig32( direction_vector, 3, -8 ); // Q30 -> Q22 - v_add_fixed( avg_direction_vector, direction_vector, avg_direction_vector, 3, 0 ); + v_add_fx_no_hdrm( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( avg_direction_vector, Q22, &avg_azimuth, &avg_elevation ); avg_azimuth_index_upd = quantize_phi_enc_fx( L_add( avg_azimuth, 180 << Q22 ), 0, &avg_azimuth, avg_azimuth_alphabet ); @@ -5452,11 +5414,7 @@ static Word16 encode_surround_coherence_hr_fx( } ELSE { -#ifdef FIX_USAN_ISSUES no_idx16 = add( shr( nbits_fr, 4 ), 1 ); -#else - no_idx16 = shr_r( nbits_fr, 4 ); -#endif } /* write combined index */ @@ -5478,11 +5436,7 @@ static Word16 encode_surround_coherence_hr_fx( } ELSE { -#ifdef FIX_USAN_ISSUES no_idx16 = add( shr( nbits_fr1, 4 ), 1 ); -#else - no_idx16 = shr_r( nbits_fr1, 4 ); -#endif } assert( no_idx16 <= 4 ); @@ -6636,7 +6590,7 @@ void ivas_omasa_encode_masa_to_total_fx( { j = imult1616( k, len_stream ); /* quantize with fixed common step */ - L_tmp = BASOP_Util_Divide3232_Scale_cadence( dct_data[j], step, &tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( dct_data[j], step, &tmp_e ); tmp_e = add( tmp_e, Q6 ); q_idx[j] = rint_new_fx( L_shr( L_tmp, sub( 15, tmp_e ) ) /* Q16 */ ); // Q0 move16(); @@ -6659,7 +6613,7 @@ void ivas_omasa_encode_masa_to_total_fx( { FOR( i = 1; i < len_stream; i++ ) { - L_tmp = BASOP_Util_Divide3232_Scale_cadence( dct_data[j + i], step, &tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( dct_data[j + i], step, &tmp_e ); tmp_e = add( tmp_e, Q6 ); q_idx[j + i] = rint_new_fx( L_shr( L_tmp, sub( 15, tmp_e ) ) ); move16(); diff --git a/lib_enc/ivas_qspherical_enc_fx.c b/lib_enc/ivas_qspherical_enc_fx.c index 2e7a289f9d38d51dbe634700f0ff7dd66ee23b17..3f17a423e7025e5e4e34de78a2d49c3f5305a7e1 100644 --- a/lib_enc/ivas_qspherical_enc_fx.c +++ b/lib_enc/ivas_qspherical_enc_fx.c @@ -40,7 +40,6 @@ #include "wmc_auto.h" #include "prot_fx.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*-----------------------------------------------------------------------* diff --git a/lib_enc/ivas_rom_enc.h b/lib_enc/ivas_rom_enc.h index 0d0941cc43ce9a1d47dd0bdbe30308779e1d23f8..d1e644a93e45e0ffb4ef355a64c6eb3308e3fc9c 100644 --- a/lib_enc/ivas_rom_enc.h +++ b/lib_enc/ivas_rom_enc.h @@ -111,9 +111,9 @@ extern const UWord16 ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE] /*----------------------------------------------------------------------------------* * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ -extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 4]; -extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 4]; -extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 4]; +extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 2]; +extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 2]; +extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 2]; extern const Word32 Stereo_dmx_wnd_coef_32k_fx[L_FRAME32k]; extern const Word32 Stereo_dmx_wnd_coef_48k_fx[L_FRAME48k]; /*----------------------------------------------------------------------------------* diff --git a/lib_enc/ivas_rom_enc_fx.c b/lib_enc/ivas_rom_enc_fx.c index b26972b8aa56df444edcd9c4cb51e05eaeeba2be..1b7bed2106883a12aa346153477f04f065a94988 100644 --- a/lib_enc/ivas_rom_enc_fx.c +++ b/lib_enc/ivas_rom_enc_fx.c @@ -52,7 +52,7 @@ const Word16 unclr_isel_td[SIZE_UNCLR_ISEL_TD] = /* UNCLR classifier in TD stereo:: mean & scale for feature normalization */ const Word32 unclr_mean_td[SIZE_UNCLR_ISEL_TD] = /*Q15*/ { - 166277, 163748, 209465, 50557, 34744, 239251, 21, 1277892, 44, 19270 + 166277, 163748, 209465, 50557, 34744, 239251, 21, 1277892, 44, 19270 }; const Word32 unclr_scale_td[SIZE_UNCLR_ISEL_TD] = /*Q15*/ @@ -508,27 +508,67 @@ const Word32 ari_bit_estimate_s17_LC_fx[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = // Q /*----------------------------------------------------------------------------------* * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ + + // Q31 -const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 4] = { - 3309988, 29667578, 81733728, 158226416, 257262128, 376402368, 512713184, 662838656, 823081792, 989497088, - 1157986560, 1324401920, 1484645120, 1634770560, 1771081600, 1890221568, 1989257344, 2065750016, 2117816064, 2144173568 -}; -// Q31 -const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 4] = { - 827816, 7442688, 20631648, 40313376, 66366540, 98630536, 136906352, 180958112, 230514208, 285269056, - 344885056, 408994752, 477202848, 549088896, 624209472, 702101440, 782284928, 864265344, 947537088, 1031587008, - 1115896832, 1199946752, 1283218432, 1365198592, 1445382400, 1523274368, 1598395136, 1670280960, 1738488832, 1802598528, - 1862214528, 1916969472, 1966525568, 2010577280, 2048853120, 2081117056, 2107170304, 2126851968, 2140040960, 2146655872 -}; -// Q31 -const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 4] = { - 367944, 3309988, 9186011, 17979908, 29667578, 44216976, 61588232, 81733728, 104598264, 130119136, - 158226416, 188843056, 221885136, 257262128, 294876992, 334626720, 376402368, 420089216, 465567840, 512713184, - 561396544, 611484032, 662838656, 715319488, 768782656, 823081792, 878067904, 933590528, 989497088, 1045634688, - 1101849216, 1157986560, 1213893504, 1269415808, 1324401920, 1378700928, 1432164224, 1484645120, 1535999488, 1586087424, - 1634770560, 1681915904, 1727394560, 1771081600, 1812856960, 1852606720, 1890221568, 1925598592, 1958640640, 1989257344, - 2017364480, 2042885504, 2065750016, 2085895424, 2103266688, 2117816064, 2129503616, 2138297728, 2144173568, 2147115776 -}; + const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 2] = { + 204411, 817566, 1839231, 3269018, 5106382, 7350624, 10000889, 13056168, 16515298, 20376962, + 24639688, 29301856, 34361688, 39817260, 45666492, 51907160, 58536884, 65553148, 72953272, 80734440, + 88893688, 97427912, 106333872, 115608160, 125247248, 135247472, 145605040, 156315968, 167376224, 178781552, + 190527648, 202610016, 215024064, 227765072, 240828160, 254208400, 267900656, 281899744, 296200320, 310796928, + 325684032, 340855968, 356306944, 372031072, 388022368, 404274752, 420782016, 437537920, 454536032, 471769920, + 489232992, 506918624, 524820096, 542930496, 561243072, 579750720, 598446528, 617323264, 636373760, 655590784, + 674967040, 694495104, 714167552, 733976960, 753915712, 773976192, 794150848, 814431936, 834811776, 855282624, + 875836544, 896465920, 917162752, 937919168, 958727360, 979579264, 1000467072, 1021382784, 1042318400, 1063266048 + }; + // Q31 + const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 2] = { + 51423, 205686, 462776, 822667, 1285325, 1850705, 2518754, 3289407, 4162591, 5138222, + 6216206, 7396441, 8678813, 10063200, 11549468, 13137475, 14827070, 16618091, 18510366, 20503712, + 22597942, 24792852, 27088232, 29483864, 31979518, 34574956, 37269924, 40064172, 42957428, 45949412, + 49039844, 52228420, 55514844, 58898792, 62379948, 65957972, 69632528, 73403256, 77269800, 81231792, + 85288840, 89440576, 93686584, 98026464, 102459800, 106986176, 111605144, 116316264, 121119096, 126013168, + 130998016, 136073168, 141238128, 146492400, 151835488, 157266880, 162786064, 168392496, 174085632, 179864960, + 185729888, 191679888, 197714368, 203832752, 210034448, 216318896, 222685456, 229133536, 235662512, 242271760, + 248960656, 255728544, 262574784, 269498720, 276499680, 283577024, 290730048, 297958048, 305260384, 312636288, + 320085120, 327606144, 335198624, 342861856, 350595072, 358397568, 366268576, 374207360, 382213120, 390285152, + 398422624, 406624768, 414890848, 423220000, 431611456, 440064448, 448578112, 457151680, 465784288, 474475136, + 483223360, 492028160, 500888704, 509804096, 518773504, 527796064, 536870912, 545997184, 555174016, 564400512, + 573675776, 582998976, 592369152, 601785472, 611246976, 620752768, 630301952, 639893568, 649526784, 659200640, + 668914176, 678666496, 688456704, 698283776, 708146816, 718044864, 727976960, 737942208, 747939584, 757968192, + 768027072, 778115200, 788231680, 798375424, 808545600, 818741184, 828961216, 839204672, 849470528, 859757952, + 870065856, 880393216, 890739136, 901102592, 911482560, 921878080, 932288192, 942711808, 953147968, 963595648, + 974053952, 984521728, 994998080, 1005481984, 1015972480, 1026468416, 1036968960, 1047472960, 1057979520, 1068487552 + }; + // Q31 + const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 2] = { + 22902, 91608, 206114, 366416, 572507, 824378, 1122018, 1465415, 1854554, 2289418, + 2769989, 3296246, 3868167, 4485728, 5148901, 5857660, 6611973, 7411808, 8257132, 9147909, + 10084099, 11065664, 12092561, 13164746, 14282175, 15444799, 16652568, 17905432, 19203336, 20546226, + 21934042, 23366728, 24844222, 26366462, 27933380, 29544910, 31200986, 32901534, 34646484, 36435760, + 38269288, 40146984, 42068776, 44034576, 46044300, 48097868, 50195188, 52336168, 54520724, 56748756, + 59020172, 61334876, 63692768, 66093744, 68537712, 71024552, 73554176, 76126456, 78741304, 81398592, + 84098208, 86840048, 89623984, 92449904, 95317680, 98227200, 101178336, 104170952, 107204936, 110280144, + 113396456, 116553736, 119751848, 122990656, 126270024, 129589808, 132949864, 136350064, 139790240, 143270256, + 146789968, 150349232, 153947888, 157585760, 161262736, 164978624, 168733280, 172526544, 176358256, 180228256, + 184136368, 188082416, 192066256, 196087712, 200146592, 204242752, 208376000, 212546160, 216753072, 220996528, + 225276352, 229592384, 233944432, 238332288, 242755792, 247214752, 251708960, 256238240, 260802384, 265401216, + 270034528, 274702112, 279403808, 284139392, 288908640, 293711360, 298547360, 303416448, 308318400, 313252960, + 318220000, 323219264, 328250528, 333313632, 338408288, 343534304, 348691488, 353879616, 359098432, 364347744, + 369627296, 374936928, 380276320, 385645312, 391043680, 396471168, 401927520, 407412544, 412925984, 418467616, + 424037216, 429634528, 435259328, 440911328, 446590336, 452296128, 458028416, 463786944, 469571520, 475381856, + 481217728, 487078848, 492965024, 498875968, 504811424, 510771168, 516754912, 522762432, 528793440, 534847712, + 540924928, 547024960, 553147392, 559292032, 565458624, 571646912, 577856640, 584087488, 590339264, 596611584, + 602904320, 609217152, 615549760, 621901888, 628273344, 634663808, 641072960, 647500608, 653946432, 660410176, + 666891520, 673390208, 679906048, 686438592, 692987712, 699553088, 706134400, 712731392, 719343808, 725971328, + 732613696, 739270592, 745941760, 752626880, 759325760, 766038016, 772763456, 779501696, 786252480, 793015488, + 799790528, 806577216, 813375360, 820184576, 827004608, 833835136, 840675968, 847526656, 854387072, 861256832, + 868135616, 875023168, 881919232, 888823488, 895735616, 902655296, 909582336, 916516352, 923457088, 930404224, + 937357504, 944316544, 951281152, 958250944, 965225728, 972205056, 979188800, 986176512, 993168000, 1000162880, + 1007160960, 1014161856, 1021165248, 1028170944, 1035178560, 1042187776, 1049198400, 1056210048, 1063222464, 1070235328 + }; + + // Q31 const Word32 Stereo_dmx_wnd_coef_32k_fx[L_FRAME32k] = { 5270712, 15812011, 26352928, 36893212, 47432604, 57970856, 68507712, 79042912, 89576208, 100107344, diff --git a/lib_enc/ivas_sce_enc_fx.c b/lib_enc/ivas_sce_enc_fx.c index 3a0f19c505c59a7a7e5456edc8e2777e9a727953..fa58f267479a7a380618fd19f7063b0541fa3d30 100644 --- a/lib_enc/ivas_sce_enc_fx.c +++ b/lib_enc/ivas_sce_enc_fx.c @@ -120,14 +120,18 @@ ivas_error ivas_sce_enc_fx( * Initialization - general *-----------------------------------------------------------------*/ -#ifdef MSAN_FIX set16_zero_fx( old_inp_12k8_fx[0], L_INP_12k8 ); -#endif - Copy32( data_fx, st->input32_fx, input_frame ); // Q(q_data_fx) - q_input = sub( add( L_norm_arr( st->input32_fx, input_frame ), q_data_fx ), 16 ); + Word16 Q_min = s_min( q_data_fx, add( st->q_inp32, L_norm_arr( st->input32_fx - input_frame, input_frame ) ) ); + scale_sig32( st->input32_fx - input_frame, input_frame, sub( Q_min, st->q_inp32 ) ); + st->q_old_inp32 = Q_min; + move16(); + Copy_Scale_sig32( data_fx, st->input32_fx, input_frame, sub( Q_min, q_data_fx ) ); // Q(Q_min) + st->q_inp32 = Q_min; + move16(); + q_input = sub( add( L_norm_arr( st->input32_fx, input_frame ), Q_min ), 16 ); - Copy_Scale_sig32_16( st->input32_fx, st->input_fx, input_frame, sub( add( Q16, q_input ), q_data_fx ) ); // Q(q_data_fx) -> Q(q_input) + Copy_Scale_sig32_16( st->input32_fx, st->input_fx, input_frame, sub( add( Q16, q_input ), Q_min ) ); // Q(Q_min) -> Q(q_input) st->q_inp = q_input; move16(); @@ -180,7 +184,7 @@ ivas_error ivas_sce_enc_fx( RunTransientDetection_ivas_fx( st->input_fx, input_frame, st->hTranDet, q_input ); } - currFlatness_fx[0] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, 0 ); // Q21 + currFlatness_fx[0] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( st->hTranDet, NSUBBLOCKS, 0 ); // Q21 move32(); /*----------------------------------------------------------------* @@ -253,11 +257,7 @@ ivas_error ivas_sce_enc_fx( &ener_fx[0], &relE_fx[0], A_fx[0], Aw_fx[0], epsP_fx[0], &epsP_fx_q[0], lsp_new_fx[0], lsp_mid_fx[0], &vad_hover_flag[0], &attack_flag[0], realBuffer_fx[0], imagBuffer_fx[0], &q_re_im_buf, old_wsp_fx[0], &q_old_wsp, pitch_fr_fx[0], voicing_fr_fx[0], &loc_harm[0], &cor_map_sum_fx[0], &vad_flag_dtx[0], enerBuffer_fx[0], &enerBuffer_fx_exp[0], fft_buff_fx[0], &fft_buff_fx_q[0], A_fx[0], lsp_new_fx[0], currFlatness_fx[0], 0, fr_bands_fx, q_fr_bands, Etot_LR_fx, lf_E_fx, 31, localVAD_HE_SAD, NULL, 31, flag_16k_smc, -#ifdef NONBE_1211_DTX_BR_SWITCHING st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->force_front_vad : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_dtx_flag : 0, ivas_format, 0, st_ivas->hEncoderConfig->last_ivas_total_brate, st_ivas->hEncoderConfig->ivas_total_brate, &Q_new[0] -#else - st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->force_front_vad : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_dtx_flag : 0, ivas_format, 0, st_ivas->hEncoderConfig->ivas_total_brate, &Q_new[0] -#endif #ifdef DEBUG_MODE_INFO , st->id_element @@ -309,7 +309,7 @@ ivas_error ivas_sce_enc_fx( IF( EQ_32( st->core_brate, SID_2k40 ) ) { - ivas_write_format_sid_fx( ivas_format, IVAS_SCE, st->hBstr ); + ivas_write_format_sid_fx( ivas_format, IVAS_SCE, st->hBstr, st_ivas->hEncoderConfig->sba_order, st_ivas->hEncoderConfig->sba_planar ); } /*----------------------------------------------------------------* @@ -368,6 +368,9 @@ ivas_error ivas_sce_enc_fx( Copy( st->input_fx, st->old_input_signal_fx, input_frame ); st->q_old_inp = st->q_inp; move16(); + Copy32( st->input32_fx, st->old_input_signal32_fx, input_frame ); /* st->q_inp32 */ + st->q_old_inp32 = st->q_inp32; + move16(); hSCE->last_element_brate = hSCE->element_brate; move32(); @@ -382,17 +385,18 @@ ivas_error ivas_sce_enc_fx( } #endif - pop_wmops(); return error; } + /*------------------------------------------------------------------------- * create_sce_enc() * * Create, allocate and initialize IVAS encoder SCE handle *-------------------------------------------------------------------------*/ + ivas_error create_sce_enc_fx( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ const Word16 sce_id, /* i : SCE # identifier */ @@ -401,7 +405,6 @@ ivas_error create_sce_enc_fx( { SCE_ENC_HANDLE hSCE; Encoder_State *st; - ivas_error error; error = IVAS_ERR_OK; @@ -430,6 +433,7 @@ ivas_error create_sce_enc_fx( /*-----------------------------------------------------------------* * Metadata: allocate and initialize *-----------------------------------------------------------------*/ + test(); IF( NE_16( st_ivas->hEncoderConfig->ivas_format, MONO_FORMAT ) && EQ_16( sce_id, sub( st_ivas->nSCE, 1 ) ) ) { @@ -467,11 +471,14 @@ ivas_error create_sce_enc_fx( st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; move32(); move32(); + st->max_bwidth = st_ivas->hEncoderConfig->max_bwidth; + st->input_Fs = st_ivas->hEncoderConfig->input_Fs; - IF( NE_32( ( error = init_encoder_ivas_fx( st, st_ivas, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode, hSCE->element_brate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = init_encoder_fx( st, st_ivas, 0, 0, st_ivas->ism_mode, hSCE->element_brate ) ), IVAS_ERR_OK ) ) { return error; } + hSCE->hCoreCoder[0] = st; st_ivas->hSCE[sce_id] = hSCE; @@ -479,152 +486,15 @@ ivas_error create_sce_enc_fx( return error; } -/*------------------------------------------------------------------------- - * create_evs_sce_enc_fx() - * - * Create, allocate and initialize EVS encoder SCE handle - *-------------------------------------------------------------------------*/ - -ivas_error create_evs_sce_enc_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const Word16 sce_id, /* i : SCE # identifier */ - const Word32 element_brate /* i : element bitrate */ -) -{ - SCE_ENC_HANDLE hSCE = st_ivas->hSCE[sce_id]; - Encoder_State *st_fx; - - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - /*-----------------------------------------------------------------* - * Allocate SCE handle - *-----------------------------------------------------------------*/ - - IF( ( hSCE = (SCE_ENC_HANDLE) malloc( sizeof( SCE_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SCE\n" ) ); - } - - /*-----------------------------------------------------------------* - * Initialization - general parameters - *-----------------------------------------------------------------*/ - - hSCE->sce_id = sce_id; - move16(); - hSCE->element_brate = element_brate; - move32(); - hSCE->last_element_brate = hSCE->element_brate; - move32(); - /*-----------------------------------------------------------------* - * Metadata: allocate and initialize - *-----------------------------------------------------------------*/ - test(); - IF( NE_32( st_ivas->hEncoderConfig->ivas_format, MONO_FORMAT ) && EQ_16( sce_id, sub( st_ivas->nSCE, 1 ) ) ) - { - IF( NE_32( ( error = ivas_initialize_MD_bstr_enc_fx( &( hSCE->hMetaData ), st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE - { - hSCE->hMetaData = NULL; - } - - /*-----------------------------------------------------------------* - * Core Coder, 1 instance: allocate and initialize - *-----------------------------------------------------------------*/ - IF( ( st_fx = (ENC_CORE_HANDLE) malloc( sizeof( Encoder_State ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CoreCoder structure\n" ) ); - } - memset( st_fx, 0, sizeof( Encoder_State ) ); - st_fx->input_Fs = 16000; - move32(); - st_fx->total_brate = ACELP_12k65; - move32(); - st_fx->Opt_AMR_WB = 0; - move16(); - st_fx->Opt_RF_ON = 0; - move16(); - st_fx->rf_fec_offset = 0; - move16(); - st_fx->rf_fec_indicator = 1; - move16(); - - st_fx->max_bwidth = SWB; - move16(); - st_fx->interval_SID_fx = FIXED_SID_RATE; - move16(); - st_fx->var_SID_rate_flag_fx = 1; - move16(); - st_fx->Opt_HE_SAD_ON_fx = 0; - move16(); - st_fx->Opt_SC_VBR = 0; - move16(); - st_fx->last_Opt_SC_VBR = 0; - move16(); - st_fx->bitstreamformat = G192; - move16(); - - // copy_encoder_config_fx( st_ivas, st_fx, 1 ); - st_fx->max_bwidth = st_ivas->hEncoderConfig->max_bwidth; - move16(); - st_fx->Opt_DTX_ON = st_ivas->hEncoderConfig->Opt_DTX_ON; - move16(); - st_fx->var_SID_rate_flag_fx = st_ivas->hEncoderConfig->var_SID_rate_flag; - move16(); - st_fx->interval_SID_fx = st_ivas->hEncoderConfig->interval_SID; - move16(); - st_fx->Opt_RF_ON = st_ivas->hEncoderConfig->Opt_RF_ON; - move16(); - st_fx->rf_fec_indicator = st_ivas->hEncoderConfig->rf_fec_indicator; - move16(); - st_fx->rf_fec_offset = st_ivas->hEncoderConfig->rf_fec_offset; - move16(); - // st_fx->bitstreamformat = st->bitstreamformat; - st_fx->total_brate = st_ivas->hEncoderConfig->ivas_total_brate; - move32(); - st_fx->Opt_SC_VBR = st_ivas->hEncoderConfig->Opt_SC_VBR; - move16(); - st_fx->last_Opt_SC_VBR = st_ivas->hEncoderConfig->last_Opt_SC_VBR; - move16(); - st_fx->Opt_AMR_WB = st_ivas->hEncoderConfig->Opt_AMR_WB; - move16(); - st_fx->input_Fs = st_ivas->hEncoderConfig->input_Fs; - move32(); - st_fx->codec_mode = st_ivas->codec_mode; - move16(); - st_fx->last_codec_mode = st_ivas->last_codec_mode; - move16(); - st_fx->input_frame_fx = extract_l( Mult_32_16( st_fx->input_Fs, 0x0290 ) ); - move16(); - IF( NE_32( ( error = init_encoder_fx( st_fx ) ), IVAS_ERR_OK ) ) - { - return error; - } - st_fx->hBstr->ind_list = ind_list; - // st_fx->hBstr->ind_list_fx = st->hBstr->ind_list; - reset_indices_enc_fx( st_fx->hBstr, MAX_NUM_INDICES ); - hSCE->hCoreCoder[0] = st_fx; - - st_ivas->hSCE[sce_id] = hSCE; - - return error; -} /*------------------------------------------------------------------------- - * destroy_sce_enc_fx() + * destroy_sce_enc() * * Destroy and deallocate IVAS encoder SCE handle *-------------------------------------------------------------------------*/ void destroy_sce_enc_fx( - SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ - Flag is_evs /* i : Flag to indicate EVS encoder*/ + SCE_ENC_HANDLE hSCE /* i/o: SCE encoder structure */ ) { Encoder_State *st; @@ -633,17 +503,8 @@ void destroy_sce_enc_fx( IF( st != NULL ) { - test(); - IF( ( st->element_mode == EVS_MONO ) && is_evs ) - { - destroy_evs_core_enc_fx( st ); - st = NULL; - } - ELSE - { - destroy_core_enc_fx( st ); - st = NULL; - } + destroy_core_enc_fx( st ); + st = NULL; } ivas_destroy_MD_bstr_enc_fx( &( hSCE->hMetaData ) ); diff --git a/lib_enc/ivas_sns_enc_fx.c b/lib_enc/ivas_sns_enc_fx.c index 22cd98cad50bd82142bd6e1ff364be63b330d256..0e3c0bd405c51fedc3cdc397b35271b23f445391 100644 --- a/lib_enc/ivas_sns_enc_fx.c +++ b/lib_enc/ivas_sns_enc_fx.c @@ -39,11 +39,11 @@ #include "ivas_prot_fx.h" #include "rom_com.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" #include "ivas_cnst.h" #include "wmc_auto.h" #include "prot_fx_enc.h" + /*------------------------------------------------------------------- * sns_1st_cod() * @@ -258,7 +258,7 @@ static Word16 sns_1st_cod_fx( } /* for second split shift by five bits to store both indices as one 10 bit value */ - IF( EQ_16( split, 1 ) ) + if ( EQ_16( split, 1 ) ) { index_split = shl( index_split, 5 ); } @@ -672,7 +672,7 @@ Word16 quantize_sns_fx( Word32 ener_side_fx; Word16 ener_side_q; - v_sub_fixed( snsQ_out_fx[0][k], snsQ_out_fx[1][k], side_fx, M, 0 ); + v_sub_fx_no_hdrm( snsQ_out_fx[0][k], snsQ_out_fx[1][k], side_fx, M ); Word64 L64_sum; L64_sum = 1; @@ -817,15 +817,10 @@ Word16 quantize_sns_fx( FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { -#ifdef MSAN_FIX FOR( k = 0; k < nSubframes; k++ ) { scale_sig32( snsQ_out_fx[ch][k], M, sub( sns_e_tmp[ch][k], sns_e ) ); // Q(31-sns_e_tmp[ch][k]) } -#else - scale_sig32( snsQ_out_fx[ch][0], M, sub( sns_e_tmp[ch][0], *sns_e ) ); - scale_sig32( snsQ_out_fx[ch][1], M, sub( sns_e_tmp[ch][1], *sns_e ) ); -#endif } /* get back to L/F representation */ test(); diff --git a/lib_enc/ivas_spar_encoder_fx.c b/lib_enc/ivas_spar_encoder_fx.c index 3b380f2ebacda088f27ceaa010823af2bd6199b3..cb02abe16b2a64aee428d18c1deb79e6506d432b 100644 --- a/lib_enc/ivas_spar_encoder_fx.c +++ b/lib_enc/ivas_spar_encoder_fx.c @@ -228,7 +228,7 @@ ivas_error ivas_spar_enc_open_fx( hSpar->hCoreCoderVAD->mct_chan_mode = MCT_CHAN_MODE_IGNORE; move32(); move32(); - IF( NE_32( ( error = init_encoder_ivas_fx( hSpar->hCoreCoderVAD, st_ivas, 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode, hSpar->hCoreCoderVAD->total_brate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = init_encoder_fx( hSpar->hCoreCoderVAD, st_ivas, 0, 1, st_ivas->ism_mode, hSpar->hCoreCoderVAD->total_brate ) ), IVAS_ERR_OK ) ) { return error; } @@ -371,9 +371,14 @@ ivas_error ivas_spar_enc_fx( /* hack to indicate OSBA bitstream at VLBR */ push_indice( st0->hBstr, IND_SMODE, 0, SBA_ORDER_BITS ); + + /* additionally code the real SBA order */ + push_indice( st0->hBstr, IND_SMODE, hEncoderConfig->sba_order, SBA_ORDER_BITS ); } ELSE { + /* Write SBA planar flag */ + push_indice( st0->hBstr, IND_SMODE, hEncoderConfig->sba_planar, SBA_PLANAR_BITS ); /* Write SBA order */ push_indice( st0->hBstr, IND_SMODE, hEncoderConfig->sba_order, SBA_ORDER_BITS ); } @@ -710,9 +715,7 @@ static ivas_error ivas_spar_enc_process_fx( num_del_samples = hSpar->hFbMixer->fb_cfg->fb_latency; move16(); - Word32 res_dec, res_frac; - iDiv_and_mod_32( input_Fs, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - input_frame = extract_l( res_dec ); + input_frame = extract_l( Mpy_32_32_r( input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); sba_order = s_min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_inp = ivas_sba_get_nchan_metadata_fx( sba_order, hEncoderConfig->ivas_total_brate ); @@ -727,9 +730,11 @@ static ivas_error ivas_spar_enc_process_fx( { Copy32( data_fx[HOA_keep_ind[i]], data_fx[i], input_frame ); } + /*-----------------------------------------------------------------------------------------* * Transient detector *-----------------------------------------------------------------------------------------*/ + ivas_transient_det_process_fx( hSpar->hTranDet, data_fx[0], input_frame, transient_det ); #ifdef DEBUGGING @@ -740,7 +745,6 @@ static ivas_error ivas_spar_enc_process_fx( dbgwrite_txt( a, 2, "fixed.txt", NULL ); } #endif - if ( LT_32( ivas_total_brate, IVAS_24k4 ) ) { transient_det[1] = 0; @@ -788,7 +792,7 @@ static ivas_error ivas_spar_enc_process_fx( shift = s_min( shift, L_norm_arr( data_fx[i], input_frame ) ); } - l_ts = idiv1616( input_frame, MAX_PARAM_SPATIAL_SUBFRAMES ); + l_ts = shr( input_frame, MAX_PARAM_SPATIAL_SUBFRAMES_LOG2 ); Word16 gb = find_guarded_bits_fx( l_ts ); FOR( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) @@ -859,7 +863,7 @@ static ivas_error ivas_spar_enc_process_fx( } pp_fr_q = add( FR_q, pp_fr_q ); - IF( NE_32( ( error = ivas_dirac_enc_fx( st_ivas->hDirAC, hQMetaData, hMetaData, data_fx, ppIn_FR_real_fx, ppIn_FR_imag_fx, pp_fr_q, input_frame, dtx_vad, hEncoderConfig->ivas_format, hodirac_flag, shift ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_enc_fx( st_ivas->hDirAC, hQMetaData, hMetaData, data_fx, ppIn_FR_real_fx, ppIn_FR_imag_fx, pp_fr_q, input_frame, dtx_vad, hEncoderConfig->ivas_format, nchan_transport, hodirac_flag, shift ) ), IVAS_ERR_OK ) ) { return error; } @@ -887,12 +891,14 @@ static ivas_error ivas_spar_enc_process_fx( /*-----------------------------------------------------------------------------------------* * Covariance and MD processing *-----------------------------------------------------------------------------------------*/ + IF( NE_32( ( error = ivas_spar_cov_md_process_fx( hEncoderConfig, st_ivas->hSpar, st_ivas->hQMetaData, hMetaData, nchan_inp, sba_order, ppIn_FR_real_fx, ppIn_FR_imag_fx, transient_det, dtx_vad, nchan_transport, &dyn_active_w_flag, pp_fr_q ) ), IVAS_ERR_OK ) ) { return error; } set16_fx( q_p_pcm_tmp_fx, pp_fr_q, nchan_fb_in ); + /*-----------------------------------------------------------------------------------------* * FB mixer *-----------------------------------------------------------------------------------------*/ @@ -923,7 +929,7 @@ static ivas_error ivas_spar_enc_process_fx( IF( hSpar->hFbMixer->fb_cfg->active_w_mixing == 0 ) { /*cross fade between new active W channels and old passive W channel*/ - IF( EQ_16( dyn_active_w_flag, 1 ) ) + IF( EQ_16( dyn_active_w_flag, 1 ) || EQ_16( hSpar->hMdEnc->spar_md.prior_dyn_active_w_flag, 1 ) ) { IF( NE_16( hSpar->hMdEnc->spar_md.prior_dyn_active_w_flag, dyn_active_w_flag ) ) { @@ -969,6 +975,7 @@ static ivas_error ivas_spar_enc_process_fx( v_add_fx( data_fx[idx], p_pcm_tmp_fx[i] + num_del_samples, p_pcm_tmp_fx[i] + num_del_samples, sub( input_frame, num_del_samples ) ); } } + /*-----------------------------------------------------------------------------------------* * PCA encoder *-----------------------------------------------------------------------------------------*/ @@ -987,7 +994,6 @@ static ivas_error ivas_spar_enc_process_fx( } } - /*-----------------------------------------------------------------------------------------* * AGC *-----------------------------------------------------------------------------------------*/ diff --git a/lib_enc/ivas_spar_md_enc_fx.c b/lib_enc/ivas_spar_md_enc_fx.c index 9c4fcc937163e672569f913223ec1cce692b2a20..be07b38cbc7a47018b4e88b3523129d0661bf154 100644 --- a/lib_enc/ivas_spar_md_enc_fx.c +++ b/lib_enc/ivas_spar_md_enc_fx.c @@ -37,7 +37,6 @@ #include "ivas_prot_fx.h" #include "math.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" #include #include "wmc_auto.h" @@ -439,7 +438,11 @@ static void write_metadata_buffer_fx( FOR( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ ) { +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + push_next_indice_( hMetaData_tmp->ind_list[i].function_name, hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); +#else push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); +#endif } return; @@ -475,7 +478,7 @@ ivas_error ivas_spar_md_enc_process_fx( Word32 pred_coeffs_re_local_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; Word16 k, bwidth, num_bands, num_bands_full, num_bands_bw; Word16 active_w, nchan_transport, dmx_switch, strat; - Word16 nB, bands_bw, packed_ok = 0; + Word16 nB, bands_bw, bands_bw_log2, packed_ok = 0; move16(); ivas_strats_t cs[MAX_CODING_STRATS]; Word16 code_strat; @@ -486,6 +489,8 @@ ivas_error ivas_spar_md_enc_process_fx( Word16 max_num_indices_tmp; Word32 Wscale_fx[IVAS_MAX_NUM_BANDS]; Word16 q_Wscale[IVAS_MAX_NUM_BANDS]; + Word32 P_quant_re_prior[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS - 1]; + Word16 Q_P_quant_re_prior[SPAR_DIRAC_SPLIT_START_BAND]; /*extra 16 bits for arithmetic coder as overshoot check is after a symbol is written*/ md_indices_allocated = add( hMdEnc->spar_md_cfg.max_bits_per_blk, IVAS_SPAR_ARITH_OVERSHOOT_BITS ); @@ -581,7 +586,7 @@ ivas_error ivas_spar_md_enc_process_fx( { nB = SPAR_DTX_BANDS; move16(); - bands_bw = idiv1616( num_bands, nB ); + bands_bw = shr( num_bands, SPAR_DTX_BANDS_LOG2 ); ivas_band_mixer_fx( cov_real_fx, cov_real_q, num_ch, &num_bands, bands_bw ); } @@ -589,7 +594,9 @@ ivas_error ivas_spar_md_enc_process_fx( { bands_bw = 2; move16(); - nB = idiv1616( num_bands, bands_bw ); + bands_bw_log2 = 1; + move16(); + nB = shr( num_bands, bands_bw_log2 ); ivas_band_mixer_fx( cov_real_fx, cov_real_q, num_ch, &num_bands, bands_bw ); } @@ -600,6 +607,7 @@ ivas_error ivas_spar_md_enc_process_fx( bands_bw = 1; move16(); } + test(); IF( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) { @@ -612,6 +620,16 @@ ivas_error ivas_spar_md_enc_process_fx( } } } + + IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) ) + { + FOR( b = 0; b < i_mult( num_bands, bands_bw ); b++ ) + { + Copy32( hMdEnc->spar_md.band_coeffs[b].P_quant_re_fx, P_quant_re_prior[b], sub( FOA_CHANNELS, 1 ) ); + Q_P_quant_re_prior[b] = hMdEnc->spar_md.band_coeffs[b].q_P_re_fx; + } + } + ivas_compute_spar_params_enc_fx( cov_real_fx, cov_real_q, dm_fv_re_fx, &q_dm_fv_re, 0, hMdEnc->mixer_mat_fx, &hMdEnc->q_mixer_mat_fx, 0, nB, dtx_vad, num_ch, bands_bw, active_w, active_w_vlbr, &hMdEnc->spar_md_cfg, &hMdEnc->spar_md, Wscale_fx, q_Wscale, 0, dyn_active_w_flag ); IF( dirac_mono_flag ) @@ -945,7 +963,21 @@ ivas_error ivas_spar_md_enc_process_fx( *q_prior_mixer = hMdEnc->q_mixer_mat_fx; move16(); } + /* Reuse mixer matrix values for unsent bands */ + IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) ) + { + FOR( k = num_bands - 1; k >= 0; k-- ) + { + FOR( b = bands_bw - 1; b >= 0; b-- ) + { + Copy32( hMdEnc->spar_md.band_coeffs[k].P_quant_re_fx, hMdEnc->spar_md.band_coeffs[add( i_mult( bands_bw, k ), b )].P_quant_re_fx, sub( FOA_CHANNELS, 1 ) ); + hMdEnc->spar_md.band_coeffs[add( i_mult( bands_bw, k ), b )].q_P_re_fx = hMdEnc->spar_md.band_coeffs[k].q_P_re_fx; + move16(); + } + } + } + test(); IF( ( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) ) && GT_16( code_strat, 3 ) ) { @@ -956,6 +988,7 @@ ivas_error ivas_spar_md_enc_process_fx( { b = add( b, 2 ); } + FOR( i = 0; i < 1; i++ ) { FOR( j = 0; j < 4; j++ ) @@ -966,6 +999,13 @@ ivas_error ivas_spar_md_enc_process_fx( move32(); } } + + Copy32( P_quant_re_prior[b], hMdEnc->spar_md.band_coeffs[b].P_quant_re_fx, sub( FOA_CHANNELS, 1 ) ); + Copy32( P_quant_re_prior[b + 1], hMdEnc->spar_md.band_coeffs[b + 1].P_quant_re_fx, sub( FOA_CHANNELS, 1 ) ); + hMdEnc->spar_md.band_coeffs[b].q_P_re_fx = Q_P_quant_re_prior[b]; + hMdEnc->spar_md.band_coeffs[b + 1].q_P_re_fx = Q_P_quant_re_prior[b + 1]; + move16(); + move16(); } } @@ -980,6 +1020,8 @@ ivas_error ivas_spar_md_enc_process_fx( return IVAS_ERR_OK; } + + /*-----------------------------------------------------------------------------------------* * Function ivas_band_mixer() * @@ -1669,6 +1711,8 @@ static void ivas_write_parameter_bitstream_dtx_fx( Word16 idx; Word32 pr_min_max[2]; Word16 zero_pad_bits, sid_bits_len; + Word16 sba_spar_bitlen; + sid_bits_len = hMetaData->nb_bits_tot; move16(); pr_min_max[0] = pSpar_md->min_max_fx[0]; @@ -1744,7 +1788,9 @@ static void ivas_write_parameter_bitstream_dtx_fx( } sid_bits_len = sub( hMetaData->nb_bits_tot, sid_bits_len ); - zero_pad_bits = sub( i_mult( SPAR_DTX_BANDS, SPAR_SID_BITS_TAR_PER_BAND ), sid_bits_len ); + sba_spar_bitlen = ivas_sba_spar_sid_bitlen_fx( num_dmx[0] ); + zero_pad_bits = sub( sba_spar_bitlen, sid_bits_len ); + assert( zero_pad_bits >= 0 ); IF( EQ_16( num_dmx[0], 2 ) ) { diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 918acc41711f5135bfa0ede33d664e6d43363de2..7096198a92d2ebe676848e52bc9f52dd2de1e7e1 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -88,12 +88,8 @@ typedef struct stereo_itd_data_struct Word16 prev_sum_nrg_L_lb_fx_e; Word32 prev_xcorr_lb_fx[STEREO_DFT_XCORR_LB_MAX]; Word16 prev_xcorr_lb_fx_e; -#ifdef FIX_ISSUE_1092 Word32 E_band_n_fx[STEREO_DFT_ITD_VAD_BAND_NUM]; /*E_band_n_exp*/ Word16 E_band_n_exp[STEREO_DFT_ITD_VAD_BAND_NUM]; -#else - Word32 E_band_n_fx[STEREO_DFT_ITD_VAD_BAND_NUM]; /*Q0*/ -#endif Word32 xcorr_smooth_fx[STEREO_DFT_N_32k_ENC]; Word16 xcorr_smooth_fx_e[STEREO_DFT_N_32k_ENC]; Word32 lp_phat_peak_fx; /* low-pass GCC PHAT peak value */ // Q31 @@ -877,18 +873,24 @@ typedef struct ivas_omasa_enc_state_structure Word16 prev_selected_object; UWord8 changing_object; + Word16 since_obj_change_cnt; } OMASA_ENC_STATE, *OMASA_ENC_HANDLE; - -typedef struct ivas_omasa_encoder_one_data_struct +typedef struct ivas_omasa_encoder_energy_struct { Word32 energy_ism_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word16 energy_ism_fx_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word32 energy_ratio_ism_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; /*q30*/ + Word32 energy_ratio_ism_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; Word32 q_energy_ratio_ism_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; /* Q30 */ - Word32 masa_to_total_energy_ratio_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; /* Q30 */ - Word16 lp_noise_CPE_fx; /* LP filtered total noise estimation Q8 */ + +} OMASA_ENCODER_ENERGY_STATE, *OMASA_ENCODER_ENERGY_HANDLE; + +typedef struct ivas_omasa_encoder_data_struct +{ + OMASA_ENCODER_ENERGY_HANDLE hOmasaEnergy; + Word32 masa_to_total_energy_ratio_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; /* Q30 */ + Word16 lp_noise_CPE_fx; /* LP filtered total noise estimation Q8 */ Word16 omasa_stereo_sw_cnt; @@ -1181,10 +1183,13 @@ typedef struct stereo_dmx_evs_phase_only_correlation_structure typedef struct stereo_dmx_evs_correlation_filter_structure { - Word16 init_frmCntr; - Word16 isd_rate_s_fx; // Q15 - Word32 iccr_s_fx; // Q31 + Word32 isd_rate_s_fx; // Q31 + Word32 iccr_s_fx; // Q31 + Word32 phitd_fx; // Q15 + Word32 iccres_s_fx; // Q31 + Word32 lvlin_fx[CPE_CHANNELS]; + Word16 lvlin_fx_e[CPE_CHANNELS]; Word32 ipd_ff_fx[STEREO_DMX_EVS_NB_SUBBAND_MAX]; // Q31 Word32 Pr_fx[STEREO_DMX_EVS_NB_SUBBAND_MAX]; // Q31 Word32 Pi_fx[STEREO_DMX_EVS_NB_SUBBAND_MAX]; // Q31 @@ -1193,7 +1198,6 @@ typedef struct stereo_dmx_evs_correlation_filter_structure Word16 pha_len; Word16 fad_len; - Word16 win_fx[STEREO_DMX_EVS_PHA_LEN_MAX]; // Q14 Word32 fad_g_fx[STEREO_DMX_EVS_FAD_LEN_MAX]; // Q31 Word32 *p_prev_taps_fx[CPE_CHANNELS], prev_taps_fx[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX]; // Q31 @@ -1205,6 +1209,16 @@ typedef struct stereo_dmx_evs_correlation_filter_structure STEREO_DMX_EVS_PHA prev_pha; Word16 pha_hys_cnt; + STEREO_DMX_EVS_PHA proc_pha; + Word16 force_poc; + + Word16 pha_ipd_chan2rephase; + Word16 pha_ipd_previouschan2rephase; + Word16 pha_ipd_chan_cnt; + Word16 pha_ipd_chan_thresh; + Word16 pha_ipd_chanswitch; + Word16 pha_ipd_chanswitch_allowed; + Word16 prc_thres; STEREO_DMX_EVS_PRC curr_prc; STEREO_DMX_EVS_PRC prev_prc; @@ -1212,11 +1226,29 @@ typedef struct stereo_dmx_evs_correlation_filter_structure Word32 fad_g_prc_fx[L_FRAME48k]; // Q31 Word16 fad_len_prc; - Word32 trns_aux_energy_fx[CPE_CHANNELS]; Word16 trns_aux_energy_fx_e[CPE_CHANNELS]; Word32 crst_fctr_fx; // Q0 + Word16 n_fad_g; + Word16 n_fad_cnt; + + Word32 dmx_pha_ener_fx; + Word16 dmx_pha_ener_fx_e; + Word32 dmx_poc_ener_fx; + Word16 dmx_poc_ener_fx_e; + + Word32 dmx_pha_ener_sgc_fx; + Word16 dmx_pha_ener_sgc_fx_e; + Word32 dmx_poc_ener_sgc_fx; + Word16 dmx_poc_ener_sgc_fx_e; + + Word32 dmx_pha_gain_sgc_fx; + Word32 dmx_poc_gain_sgc_fx; + + Word32 low_egy_thres_sgc; + Word16 low_egy_thres_sgc_e; + } STEREO_DMX_EVS_PHA_DATA, *STEREO_DMX_EVS_PHA_HANDLE; typedef struct stereo_dmx_evs_enc_data_structure @@ -1224,8 +1256,7 @@ typedef struct stereo_dmx_evs_enc_data_structure STEREO_DMX_EVS_POC_HANDLE hPOC; STEREO_DMX_EVS_PHA_HANDLE hPHA; - - Word32 itd_fx; // Q16 + Word16 itd_fx; // Q0 Word32 pre_dmx_energy_fx[1]; Word16 pre_dmx_energy_fx_e[1]; diff --git a/lib_enc/ivas_stereo_classifier_fx.c b/lib_enc/ivas_stereo_classifier_fx.c index 3e148a5aeb36fbfe22286463f8f5aa5b1643a9f4..2c1bc0317099125735d2d30683f03a2b4ff13592 100644 --- a/lib_enc/ivas_stereo_classifier_fx.c +++ b/lib_enc/ivas_stereo_classifier_fx.c @@ -890,7 +890,7 @@ void unclr_classifier_td_fx( move16(); /* mean & std removal */ - fvn = BASOP_Util_Divide3232_Scale_cadence( L_sub( hStereoClassif->unclr_fv_fx[ind], unclr_mean_td[i] ), unclr_scale_td[i], &exp ); + fvn = BASOP_Util_Divide3232_Scale_newton( L_sub( hStereoClassif->unclr_fv_fx[ind], unclr_mean_td[i] ), unclr_scale_td[i], &exp ); fvn = Mpy_32_32( fvn, unclr_coef_td[i] ); // Q = 31-exp+15-31 = 15-exp exp = add( exp, 16 ); // exp = 31-(15-exp) = 16+exp @@ -1016,7 +1016,7 @@ void unclr_classifier_dft_fx( /* mean & std removal */ // fvn[i] = (hStereoClassif->unclr_fv[ind] - unclr_mean_dft[i]) / unclr_scale_dft[i]; - fvn[i] = BASOP_Util_Divide3232_Scale_cadence( L_sub( hStereoClassif->unclr_fv_fx[ind], unclr_mean_dft_Q15[i] ), unclr_scale_dft_Q15[i], &fvn_e[i] ); + fvn[i] = BASOP_Util_Divide3232_Scale_newton( L_sub( hStereoClassif->unclr_fv_fx[ind], unclr_mean_dft_Q15[i] ), unclr_scale_dft_Q15[i], &fvn_e[i] ); move32(); /* LR */ @@ -1157,7 +1157,7 @@ void xtalk_classifier_td_fx( move16(); /* mean & std removal */ - fvn = BASOP_Util_Divide3232_Scale_cadence( L_sub( hStereoClassif->xtalk_fv_fx[ind], xtalk_mean_td[i] ), xtalk_scale_td[i], &exp ); + fvn = BASOP_Util_Divide3232_Scale_newton( L_sub( hStereoClassif->xtalk_fv_fx[ind], xtalk_mean_td[i] ), xtalk_scale_td[i], &exp ); fvn = Mpy_32_32( fvn, xtalk_coef_td[i] ); // Q = 31-exp+15-31 = 15-exp exp = add( exp, 16 ); // exp = 31-(15-exp) = 16+exp @@ -1372,7 +1372,7 @@ void xtalk_classifier_dft_fx( // ratio_m1_m2 = fabsf( m1 * m2 ) / fabsf( m1 + m2 + 1.0f ); Word16 exp; - ratio_m1_m2 = BASOP_Util_Divide3232_Scale_cadence( L_abs( Mpy_32_32( m1, m2 ) ), L_abs( L_add( L_add( L_shr( m1, 2 ), L_shr( m2, 2 ) ), ONE_IN_Q29 ) ), &exp ); + ratio_m1_m2 = BASOP_Util_Divide3232_Scale_newton( L_abs( Mpy_32_32( m1, m2 ) ), L_abs( L_add( L_add( L_shr( m1, 2 ), L_shr( m2, 2 ) ), ONE_IN_Q29 ) ), &exp ); exp = sub( exp, 2 ); // m2_m2 = hItd->prev_m2 * m2; m2_m2 = Mpy_32_32( hItd->prev_m2_fx, m2 ); @@ -1406,7 +1406,7 @@ void xtalk_classifier_dft_fx( /* mean & std removal */ // fvn[i] = ( hStereoClassif->xtalk_fv[ind] - xtalk_mean_dft[i] ) / xtalk_scale_dft[i]; - fvn[i] = BASOP_Util_Divide3232_Scale_cadence( L_sub( hStereoClassif->xtalk_fv_fx[ind], xtalk_mean_dft_q15[i] ), xtalk_scale_dft_q15[i], &exp ); // Q15 + fvn[i] = BASOP_Util_Divide3232_Scale_newton( L_sub( hStereoClassif->xtalk_fv_fx[ind], xtalk_mean_dft_q15[i] ), xtalk_scale_dft_q15[i], &exp ); // Q15 move32(); fvn[i] = L_shl_sat( fvn[i], sub( exp, 2 ) ); // Q29 move32(); @@ -1507,7 +1507,7 @@ void xtalk_classifier_dft_fx( hStereoClassif->xtalk_decision = 1; move16(); } - ELSE IF( GE_32( hCPE->element_brate, IVAS_16k4 ) && hStereoClassif->xtalk_decision == 0 && GT_16( abs_s( itd ), STEREO_DFT_ITD_MAX ) && GT_16( sub( hCPE->hCoreCoder[0]->lp_speech_fx, hCPE->hCoreCoder[0]->lp_noise_fx ), 25 << 8 ) ) + ELSE IF( GE_32( hCPE->element_brate, IVAS_16k4 ) && hStereoClassif->xtalk_decision == 0 && GT_16( abs_s( itd ), STEREO_DFT_ITD_MAX ) && GT_32( L_sub( hCPE->hCoreCoder[0]->lp_speech_32fx, hCPE->hCoreCoder[0]->lp_noise_32fx ), 25 << 24 ) ) { hStereoClassif->xtalk_decision = 1; move16(); @@ -1697,11 +1697,7 @@ static void edge_detect_fx( } } -#ifndef FIX_1297_OVERFLOW - *edge_str = extract_l( L_shr( edge_min, 10 ) ); // Q15 -#else *edge_str = extract_h( L_shl_sat( edge_min, 16 - 10 ) ); // Q15 -#endif move16(); *edge_type = et; // Q0 move16(); @@ -1759,7 +1755,7 @@ static Word32 redge_detect_fx( { // edge_slope = ( inp_max - inp_min ) / i; L_temp = BASOP_Util_Add_Mant32Exp( inp_max, 0, L_negate( inp_min ), 0, &L_temp_e ); - edge_slope = BASOP_Util_Divide3232_Scale_cadence( L_temp, i, &edge_slope_e ); + edge_slope = BASOP_Util_Divide3232_Scale_newton( L_temp, i, &edge_slope_e ); edge_slope_e = add( edge_slope_e, sub( L_temp_e, 31 ) ); edge[i] = err0; move32(); @@ -1792,7 +1788,7 @@ static Word32 redge_detect_fx( } // edge[i] /= i + 1; - edge[i] = BASOP_Util_Divide3232_Scale_cadence( edge[i], add( i, 1 ), &L_temp_e ); + edge[i] = BASOP_Util_Divide3232_Scale_newton( edge[i], add( i, 1 ), &L_temp_e ); move32(); edge_e[i] = add( L_temp_e, sub( edge_e[i], 31 ) ); move16(); diff --git a/lib_enc/ivas_stereo_cng_enc_fx.c b/lib_enc/ivas_stereo_cng_enc_fx.c index aa7c2d0aa6d1211a5724d95e60d69deaacbfac59..b73a57f4690c86d566eb94bd7dadab969789f193 100644 --- a/lib_enc/ivas_stereo_cng_enc_fx.c +++ b/lib_enc/ivas_stereo_cng_enc_fx.c @@ -101,7 +101,7 @@ void stereo_dft_enc_sid_calc_coh_fx( L_tmp1_e = sub( add( hStereoDft->Spd_L_smooth_fx_e, hStereoDft->Spd_R_smooth_fx_e ), W_tmp_q ); L_tmp2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( hStereoDft->xspec_smooth_fx[2 * k], hStereoDft->xspec_smooth_fx[2 * k] ), shl( hStereoDft->xspec_smooth_fx_e[2 * k], 1 ), Mpy_32_32( hStereoDft->xspec_smooth_fx[2 * k + 1], hStereoDft->xspec_smooth_fx[2 * k + 1] ), shl( hStereoDft->xspec_smooth_fx_e[2 * k + 1], 1 ), &L_tmp2_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); - L_tmp3 = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &L_tmp3_e ); + L_tmp3 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp3_e ); L_tmp3_e = add( L_tmp3_e, sub( L_tmp1_e, L_tmp2_e ) ); L_tmp3 = Mpy_32_32( prev_cohBand[b], L_tmp3 ); xspec_scale = Sqrt32( L_tmp3, &L_tmp3_e ); @@ -137,7 +137,7 @@ void stereo_dft_enc_sid_calc_coh_fx( L_tmp2 = W_extract_h( W_shl( W_tmp, W_tmp_q ) ); L_tmp2_e = sub( add( hStereoDft->Spd_L_smooth_fx_e, hStereoDft->Spd_R_smooth_fx_e ), W_tmp_q ); L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); - L_tmp3 = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &L_tmp3_e ); + L_tmp3 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp3_e ); L_tmp3_e = add( L_tmp3_e, sub( L_tmp1_e, L_tmp2_e ) ); L_tmp3 = Mpy_32_32( coh_weight, L_tmp3 ); L_tmp3_e = add( coh_weight_e, L_tmp3_e ); @@ -150,7 +150,7 @@ void stereo_dft_enc_sid_calc_coh_fx( IF( coh_weight_sum > 0 ) { // cohBand[b] = cohBand[b] / coh_weight_sum; - cohBand[b] = BASOP_Util_Divide3232_Scale_cadence( cohBand[b], coh_weight_sum, &L_tmp1_e ); + cohBand[b] = BASOP_Util_Divide3232_Scale_newton( cohBand[b], coh_weight_sum, &L_tmp1_e ); move32(); cohBand_e[b] = add( L_tmp1_e, sub( cohBand_e[b], coh_weight_sum_e ) ); move16(); @@ -510,7 +510,7 @@ void stereo_dft_cng_side_gain_fx( hStereoCng->prev_sg_average_fx[b] = hStereoCng->sg_average_fx[b]; move32(); // hStereoCng->sg_average[b] = hStereoCng->sg_average[b] / (float) hStereoCng->sg_average_counter; - hStereoCng->sg_average_fx[b] = BASOP_Util_Divide3232_Scale_cadence( hStereoCng->sg_average_fx[b], hStereoCng->sg_average_counter, &tmp_e ); + hStereoCng->sg_average_fx[b] = BASOP_Util_Divide3232_Scale_newton( hStereoCng->sg_average_fx[b], hStereoCng->sg_average_counter, &tmp_e ); move32(); tmp_e = sub( tmp_e, 31 - 5 ); hStereoCng->sg_average_fx[b] = L_shl_r( hStereoCng->sg_average_fx[b], sub( tmp_e, 5 ) ); // Q31 @@ -535,7 +535,7 @@ void stereo_dft_cng_side_gain_fx( tmp = hStereoCng->sg_average_fx[b]; move32(); // hStereoCng->sg_average[b] = ( hStereoCng->sg_average[b] + prev_weight * hStereoCng->prev_sg_average[b] ) / ( (float) hStereoCng->sg_average_counter + prev_weight * (float) hStereoCng->prev_sg_average_counter ); - hStereoCng->sg_average_fx[b] = BASOP_Util_Divide3232_Scale_cadence( L_add( hStereoCng->sg_average_fx[b], Mpy_32_16_1( hStereoCng->prev_sg_average_fx[b], prev_weight ) ), L_add( L_shl( hStereoCng->sg_average_counter, Q15 ), L_mult0( prev_weight, hStereoCng->prev_sg_average_counter ) ), &tmp_e ); + hStereoCng->sg_average_fx[b] = BASOP_Util_Divide3232_Scale_newton( L_add( hStereoCng->sg_average_fx[b], Mpy_32_16_1( hStereoCng->prev_sg_average_fx[b], prev_weight ) ), L_add( L_shl( hStereoCng->sg_average_counter, Q15 ), L_mult0( prev_weight, hStereoCng->prev_sg_average_counter ) ), &tmp_e ); move32(); tmp_e = sub( tmp_e, 16 - 5 ); hStereoCng->sg_average_fx[b] = L_shl_r( hStereoCng->sg_average_fx[b], sub( tmp_e, 5 ) ); // Q26 @@ -571,7 +571,7 @@ void stereo_dft_cng_side_gain_fx( W_tmp_q = W_norm( W_tmp ); hStereoDft->sidSideGain_fx[b] = W_extract_h( W_shl( W_tmp, W_tmp_q ) ); move32(); - hStereoDft->sidSideGain_fx[b] = BASOP_Util_Divide3232_Scale_cadence( hStereoDft->sidSideGain_fx[b], sgSum, &tmp_e ); + hStereoDft->sidSideGain_fx[b] = BASOP_Util_Divide3232_Scale_newton( hStereoDft->sidSideGain_fx[b], sgSum, &tmp_e ); move32(); tmp_e = sub( tmp_e, W_tmp_q ); hStereoDft->sidSideGain_fx[b] = L_shl_sat( hStereoDft->sidSideGain_fx[b], tmp_e ); // Q31: saturation is fine since stereo_dft_quantize_res_gains_fx limits value to 1.0 diff --git a/lib_enc/ivas_stereo_dft_enc_fx.c b/lib_enc/ivas_stereo_dft_enc_fx.c index 3eb6c0e8232af7ddfc96be1a8625e2dddf501b2b..e5522fb377bf0ab53db392a8fae7c58230c46efa 100644 --- a/lib_enc/ivas_stereo_dft_enc_fx.c +++ b/lib_enc/ivas_stereo_dft_enc_fx.c @@ -41,7 +41,6 @@ #include "ivas_prot_fx.h" #include "ivas_cnst.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" #include "ivas_rom_enc.h" #include "wmc_auto.h" @@ -52,7 +51,7 @@ #define STEREO_DFT_NRG_PAST_MAX_BAND 9 #define STEREO_DFT_NRG_PAST_MAX_BAND_LB 4 -#define STEREO_DFT_DMX_CROSSOVER ( int16_t )( 132 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) + 0.5f ) /* crossover bin between binwise and bandwise DMX */ +#define STEREO_DFT_DMX_CROSSOVER ( Word16 )( 132 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) + 0.5f ) /* crossover bin between binwise and bandwise DMX */ #define ITD_VAD_E_BAND_N_INIT 200000 #define ITD_SID_PREV_FRAMES 5 @@ -593,10 +592,8 @@ void stereo_dft_enc_reset_fx( move16(); hStereoDft->dmx_res_all_prev_fx = 1; move32(); -#ifdef MSAN_FIX hStereoDft->dmx_res_all_prev_fx_e = 31; move16(); -#endif hStereoDft->last_res_cod_mode_modify_flag = 0; move16(); hStereoDft->res_cod_sw_flag = 0; @@ -750,9 +747,7 @@ void stereo_enc_itd_init_fx( hItd->prev_xcorr_lb_fx_e = 0; move16(); set32_fx( hItd->E_band_n_fx, ITD_VAD_E_BAND_N_INIT, STEREO_DFT_ITD_VAD_BAND_NUM ); -#ifdef FIX_ISSUE_1092 set16_fx( hItd->E_band_n_exp, Q31, STEREO_DFT_ITD_VAD_BAND_NUM ); -#endif hItd->vad_frm_cnt = 0; move16(); hItd->pre_vad = 0; @@ -884,7 +879,7 @@ void stereo_dft_enc_update_fx( // hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * hStereoDft->N / (float) ( hStereoDft->NFFT ) ); Word32 tmp = L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), hStereoDft->N ), 1 ); Word16 exp; - tmp = BASOP_Util_Divide3232_Scale_cadence( tmp, hStereoDft->NFFT, &exp ); + tmp = BASOP_Util_Divide3232_Scale_newton( tmp, hStereoDft->NFFT, &exp ); hStereoDft->res_cod_line_max = extract_l( L_shr( tmp, sub( 31, exp ) ) ); move16(); // hStereoDft->res_cod_line_max = 8 * (hStereoDft->res_cod_line_max / 8); @@ -1034,7 +1029,7 @@ void stereo_dft_enc_analyze_fx( FOR( n = 0; n < n_channels; n++ ) { - Scale_sig( &mem[n][0], dft_ovl, sts[n]->q_inp - q_input_mem[n] ); // Q(sts[n]->q_inp) + Scale_sig( &mem[n][0], dft_ovl, sub( sts[n]->q_inp, q_input_mem[n] ) ); // Q(sts[n]->q_inp) q_input_mem[n] = sts[n]->q_inp; move16(); } @@ -1068,23 +1063,14 @@ void stereo_dft_enc_analyze_fx( Word16 q_shift, guarded_bits; guarded_bits = find_guarded_bits_fx( NFFT ); - q_shift = sub( getScaleFactor32( pDFT_L, NFFT ), guarded_bits ); - q_shift = s_min( q_shift, sub( getScaleFactor32( pDFT_R, NFFT ), guarded_bits ) ); - FOR( Word16 j = 0; j < NFFT; j++ ) - { - pDFT_L[j] = L_shl( pDFT_L[j], q_shift ); - move32(); - } + q_shift = sub( L_norm_arr( pDFT_L, NFFT ), guarded_bits ); + scale_sig32( pDFT_L, NFFT, q_shift ); DFT_e[0] = sub( DFT_e[0], q_shift ); move16(); - FOR( Word16 j = 0; j < NFFT; j++ ) - { - pDFT_R[j] = L_shl( pDFT_R[j], q_shift ); - move32(); - } - + q_shift = sub( L_norm_arr( pDFT_R, NFFT ), guarded_bits ); + scale_sig32( pDFT_R, NFFT, q_shift ); DFT_e[1] = sub( DFT_e[1], q_shift ); move16(); @@ -1102,11 +1088,7 @@ void stereo_dft_enc_analyze_fx( { FOR( n = 0; n < n_channels; n++ ) { -#ifdef MSAN_FIX Scale_sig( hStereoDft->input_mem_itd_fx[n], dft_ovl, sub( sts[n]->q_inp, hStereoDft->q_input_mem_itd[n] ) ); // Q(sts[n]->q_inp) -#else - Scale_sig( hStereoDft->input_mem_itd_fx[n], STEREO_DFT_OVL_MAX, sts[n]->q_inp - hStereoDft->q_input_mem_itd[n] ); -#endif // MSAN_FIX hStereoDft->q_input_mem_itd[n] = sts[n]->q_inp; move16(); Copy( hStereoDft->input_mem_itd_fx[n], input_mem[n], dft_ovl ); @@ -1132,8 +1114,7 @@ void stereo_dft_enc_analyze_fx( Word32 stereo_dft_enc_synthesize_fx( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ - // float *output, /* o : output synthesis */ - Word32 *output_fx, /* o : output synthesis Q15 */ + Word32 *output_fx, /* o : output synthesis Q15 */ Word16 *output_start_index, Word16 *output_end_index, const Word16 chan, /* i : channel number */ @@ -1143,25 +1124,18 @@ Word32 stereo_dft_enc_synthesize_fx( Word16 *nrg_out_fx_e ) { Word16 i, j, sign; - // float *pDFT_in; Word32 *pDFT_in_fx; Word16 DFT_in_fx_e; Word16 offset, NFFT, N, ovl, zp; Word16 temp_exp; - // float fac; Word32 fac_fx; - // float *mem; Word32 *mem_fx; - // const float *trigo, *win, *win_ana; const Word16 *trigo_fx; const Word32 *win_fx; const Word16 *win_ana_fx; - // float tmp[STEREO_DFT_N_MAX_ENC]; Word32 tmp_fx[STEREO_DFT_N_MAX_ENC]; - // float nrg; Word32 nrg_fx; Word16 nrg_fx_e; - // float trigo_enc[STEREO_DFT_N_MAX_ENC / 2 + 1]; Word16 trigo_enc_fx[STEREO_DFT_N_MAX_ENC / 2 + 1]; Word16 trigo_step; Word16 scal_fac; @@ -1243,7 +1217,7 @@ Word32 stereo_dft_enc_synthesize_fx( zp = STEREO_DFT_ZP_12k8_ENC; move16(); // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); - fac_fx = BASOP_Util_Divide3232_Scale_cadence( NFFT, hStereoDft->NFFT, &temp_exp ); + fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp ); fac_fx = L_shl( fac_fx, temp_exp ); ovl = STEREO_DFT_OVL_12k8; move16(); @@ -1267,7 +1241,7 @@ Word32 stereo_dft_enc_synthesize_fx( zp = STEREO_DFT_ZP_16k_ENC; move16(); // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); - fac_fx = BASOP_Util_Divide3232_Scale_cadence( NFFT, hStereoDft->NFFT, &temp_exp ); + fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp ); fac_fx = L_shl( fac_fx, temp_exp ); ovl = STEREO_DFT_OVL_16k; move16(); @@ -1300,7 +1274,7 @@ Word32 stereo_dft_enc_synthesize_fx( zp = STEREO_DFT_ZP_32k_ENC; move16(); // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); - fac_fx = BASOP_Util_Divide3232_Scale_cadence( NFFT, hStereoDft->NFFT, &temp_exp ); + fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp ); fac_fx = L_shl( fac_fx, temp_exp ); ovl = STEREO_DFT_OVL_32k; move16(); @@ -1324,7 +1298,7 @@ Word32 stereo_dft_enc_synthesize_fx( zp = STEREO_DFT_ZP_8k_ENC; move16(); // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); - fac_fx = BASOP_Util_Divide3232_Scale_cadence( NFFT, hStereoDft->NFFT, &temp_exp ); + fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp ); fac_fx = L_shl( fac_fx, temp_exp ); ovl = STEREO_DFT_OVL_8k; move16(); @@ -1528,7 +1502,7 @@ Word32 stereo_dft_enc_synthesize_fx( move32(); // output[offset + N + i] = ( tmp[zp + N + i] - ifft_deviation ) / win_ana[ovl - 1 - i] + ifft_deviation; Word16 L_temp_e; - Word32 L_temp = BASOP_Util_Divide3232_Scale_cadence( L_sub_sat( tmp_fx[zp + N + i], ifft_deviation ), L_deposit_h( win_ana_fx[ovl - 1 - i] ), &L_temp_e ); + Word32 L_temp = BASOP_Util_Divide3232_Scale_newton( L_sub_sat( tmp_fx[zp + N + i], ifft_deviation ), L_deposit_h( win_ana_fx[ovl - 1 - i] ), &L_temp_e ); L_temp = L_shl_sat( L_temp, L_temp_e ); output_fx[offset + N + i] = L_add_sat( L_temp, ifft_deviation ); // Q15 move32(); @@ -1657,11 +1631,7 @@ void stereo_dft_enc_process_fx( pDFT_L_fx = hStereoDft->DFT_fx[0]; pDFT_R_fx = hStereoDft->DFT_fx[1]; -#ifdef MSAN_FIX FOR( i = 0; i < hStereoDft->NFFT; i++ ) -#else - FOR( i = 0; i < STEREO_DFT_N_MAX_ENC; i++ ) -#endif // MSAN_FIX { tmp_e = norm_l( hStereoDft->DFT_fx[0][i] ); pDFT_L_fx[i] = L_shl( hStereoDft->DFT_fx[0][i], tmp_e ); @@ -1754,7 +1724,7 @@ void stereo_dft_enc_process_fx( } // if ( fabsf( hStereoDft->hItd->deltaItd[k_offset] * 32000.f / input_Fs ) > 80.0f ) - tmp_32fx = L_abs( BASOP_Util_Divide3232_Scale_cadence( hStereoDft->hItd->deltaItd_fx[k_offset], input_Fs, &tmp_e ) ); + tmp_32fx = L_abs( BASOP_Util_Divide3232_Scale_newton( hStereoDft->hItd->deltaItd_fx[k_offset], input_Fs, &tmp_e ) ); tmp_e = add( tmp_e, 15 - 31 ); IF( BASOP_Util_Cmp_Mant32Exp( tmp_32fx, tmp_e, 5368709 /* 80.0f / 32000.f in Q31 */, 0 ) > 0 ) { @@ -2047,13 +2017,13 @@ void stereo_dft_enc_process_fx( // wR = sqrtf( 0.5f * ( comb_nrgL + comb_nrgR ) + frac_dot_prod ) / sum_abs; L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, sub( L_tmp1_e, 1 ), frac_dot_prod, frac_dot_prod_e, &L_tmp1_e ); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); - wR = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_abs, &wR_e ); + wR = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &wR_e ); wR_e = add( wR_e, sub( L_tmp1_e, sum_abs_e ) ); // wL = wR + sqrtf( 2.f ) * ( 1.f - ( sqrtf( Sr + Si ) / sum_abs ) ); L_tmp1 = BASOP_Util_Add_Mant32Exp( Sr, Sr_e, Si, Si_e, &L_tmp1_e ); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_abs, &L_tmp2_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &L_tmp2_e ); L_tmp2_e = add( L_tmp2_e, sub( L_tmp1_e, sum_abs_e ) ); L_tmp2 = L_shl_sat( L_tmp2, L_tmp2_e ); // Q31 saturation expected L_tmp1 = L_sub( MAX_32, L_tmp2 ); // Q31 @@ -2132,13 +2102,13 @@ void stereo_dft_enc_process_fx( // wR = sqrtf( 0.5f * ( comb_nrgL + comb_nrgR ) + frac_dot_prod ) / sum_abs; L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, sub( L_tmp1_e, 1 ), frac_dot_prod, frac_dot_prod_e, &L_tmp1_e ); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); - wR = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_abs, &wR_e ); + wR = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &wR_e ); wR_e = add( wR_e, sub( L_tmp1_e, sum_abs_e ) ); // wL = wR + sqrtf( 2.f ) * ( 1.f - ( sqrtf( Sr + Si ) / sum_abs ) ); L_tmp1 = BASOP_Util_Add_Mant32Exp( Sr, Sr_e, Si, Si_e, &L_tmp1_e ); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_abs, &L_tmp2_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &L_tmp2_e ); L_tmp2_e = add( L_tmp2_e, sub( L_tmp1_e, sum_abs_e ) ); L_tmp2 = L_shl_sat( L_tmp2, L_tmp2_e ); // Q31 saturation expected L_tmp1 = L_sub( MAX_32, L_tmp2 ); // Q31 @@ -2212,7 +2182,7 @@ void stereo_dft_enc_process_fx( // wR = sqrtf( 0.5f * ( sum_nrg_L2 + sum_nrg_R2 ) + dot_prod_nrg_ratio[b] ) / sum_abs; L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp3, sub( L_tmp3_e, 1 ), dot_prod_nrg_ratio_fx[b], dot_prod_nrg_ratio_fx_e[b], &L_tmp1_e ); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); - wR = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_abs, &wR_e ); + wR = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &wR_e ); wR_e = add( wR_e, sub( L_tmp1_e, sum_abs_e ) ); // wL = wR + sqrtf( 2.f ) * ( 1.f - sqrtf( sum_nrg_Mid ) / sum_abs ); @@ -2221,7 +2191,7 @@ void stereo_dft_enc_process_fx( L_tmp1_e = sum_nrg_Mid_e; move16(); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_abs, &L_tmp2_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &L_tmp2_e ); L_tmp2_e = add( L_tmp2_e, sub( L_tmp1_e, sum_abs_e ) ); L_tmp2 = L_shl_sat( L_tmp2, L_tmp2_e ); // Q31 saturation expected L_tmp1 = L_sub( MAX_32, L_tmp2 ); // Q31 @@ -2499,7 +2469,7 @@ static void stereo_dft_enc_get_res_cod_mode_flag_fx( L_tmp1 = L_sub( MAX_32, g ); // Q31 L_tmp2 = BASOP_Util_Add_Mant32Exp( hStereoDft->res_cod_NRG_S_fx[b], hStereoDft->res_cod_NRG_S_fx_e[b], Mpy_32_32( Mpy_32_32( L_tmp1, L_tmp1 ), hStereoDft->res_cod_NRG_M_fx[b] ), hStereoDft->res_cod_NRG_M_fx_e[b], &L_tmp2_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, MAX_32, 0, &L_tmp2_e ); - L_tmp1 = BASOP_Util_Divide3232_Scale_cadence( hStereoDft->res_cod_NRG_S_fx[b], L_tmp2, &L_tmp1_e ); + L_tmp1 = BASOP_Util_Divide3232_Scale_newton( hStereoDft->res_cod_NRG_S_fx[b], L_tmp2, &L_tmp1_e ); L_tmp1_e = add( L_tmp1_e, sub( hStereoDft->res_cod_NRG_S_fx_e[b], L_tmp2_e ) ); L_tmp1 = L_shl( L_tmp1, L_tmp1_e ); // Q31 *res_dmx_ratio = L_max( L_tmp1, *res_dmx_ratio ); @@ -2515,7 +2485,7 @@ static void stereo_dft_enc_get_res_cod_mode_flag_fx( /*Calculate the energy ratio of the inter-frame */ //*frame_nrg_ratio = dmx_res_all / hStereoDft->dmx_res_all_prev; - *frame_nrg_ratio = BASOP_Util_Divide3232_Scale_cadence( dmx_res_all, hStereoDft->dmx_res_all_prev_fx, &L_tmp1_e ); + *frame_nrg_ratio = BASOP_Util_Divide3232_Scale_newton( dmx_res_all, hStereoDft->dmx_res_all_prev_fx, &L_tmp1_e ); move32(); L_tmp1_e = add( L_tmp1_e, sub( dmx_res_all_e, hStereoDft->dmx_res_all_prev_fx_e ) ); *frame_nrg_ratio = L_shr_r_sat( *frame_nrg_ratio, sub( 3, L_tmp1_e ) ); // Q28 @@ -2762,7 +2732,7 @@ void stereo_dft_enc_res_fx( L_tmp2_e = hStereoDft->res_cod_NRG_M_fx_e[b]; L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, hStereoDft->res_cod_NRG_S_fx[b], hStereoDft->res_cod_NRG_S_fx_e[b], &L_tmp2_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, MAX_32, 0, &L_tmp2_e ); - in_phase_ratio = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &in_phase_ratio_e ); + in_phase_ratio = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &in_phase_ratio_e ); in_phase_ratio_e = add( in_phase_ratio_e, sub( hStereoDft->res_cod_NRG_M_fx_e[b], L_tmp2_e ) ); in_phase_ratio = L_shl_sat( in_phase_ratio, in_phase_ratio_e ); // Q31 : bound from 0.0 to 1.0 in_phase_ratio = L_max( 0, in_phase_ratio ); @@ -3533,7 +3503,7 @@ static void stereo_dft_enc_compute_prm_fx( W_shift = W_norm( W_tmp ); L_tmp2 = W_extract_h( W_shl( W_tmp, W_shift ) ); L_tmp2_e = sub( add( sub_nrg_DMX2_e, 31 ), W_shift ); - L_tmp = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &L_tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) ); L_tmp = L_shl( L_tmp, L_tmp_e ); // Q31hStereoDft->gainIPD_sm_fx = L_add( L_shr( hStereoDft->gainIPD_sm_fx, 1 ), L_ gain_IPD = L_add_sat( gain_IPD, L_tmp ); // Q31: saturation expected @@ -3618,7 +3588,7 @@ static void stereo_dft_enc_compute_prm_fx( // dot_prod_nrg_ratio[b2] = sum_past_dot_prod_abs2 / ( sum_past_nrgL2 + sum_past_nrgR2 + EPSILON ); L_tmp2 = BASOP_Util_Add_Mant32Exp( sum_past_nrgL2, sum_past_nrgL2_e, sum_past_nrgR2, sum_past_nrgR2_e, &L_tmp2_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); - dot_prod_nrg_ratio_fx[b2] = BASOP_Util_Divide3232_Scale_cadence( sum_past_dot_prod_abs2, L_tmp2, &L_tmp_e ); + dot_prod_nrg_ratio_fx[b2] = BASOP_Util_Divide3232_Scale_newton( sum_past_dot_prod_abs2, L_tmp2, &L_tmp_e ); move32(); L_tmp_e = add( L_tmp_e, sub( sum_past_dot_prod_abs2_e, L_tmp2_e ) ); dot_prod_nrg_ratio_fx[b2] = L_shl( dot_prod_nrg_ratio_fx[b2], L_tmp_e ); // Q31 @@ -3645,7 +3615,7 @@ static void stereo_dft_enc_compute_prm_fx( // dot_prod_nrg_ratio[b2] /= ( sum_nrg_L2 + sum_nrg_R2 + EPSILON ); L_tmp2 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, sum_nrg_R2, sum_nrg_R2_e, &L_tmp2_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); - dot_prod_nrg_ratio_fx[b2] = BASOP_Util_Divide3232_Scale_cadence( dot_prod_nrg_ratio_fx[b2], L_tmp2, &L_tmp_e ); + dot_prod_nrg_ratio_fx[b2] = BASOP_Util_Divide3232_Scale_newton( dot_prod_nrg_ratio_fx[b2], L_tmp2, &L_tmp_e ); move32(); L_tmp_e = add( L_tmp_e, sub( dot_prod_nrg_ratio_fx_e[b2], L_tmp2_e ) ); dot_prod_nrg_ratio_fx[b2] = L_shl( dot_prod_nrg_ratio_fx[b2], L_tmp_e ); // Q31 @@ -3712,7 +3682,7 @@ static void stereo_dft_enc_compute_prm_fx( } // c = sqrtf( sum_past_nrgL / sum_past_nrgR ); - c = BASOP_Util_Divide3232_Scale_cadence( sum_past_nrgL, sum_past_nrgR, &c_e ); + c = BASOP_Util_Divide3232_Scale_newton( sum_past_nrgL, sum_past_nrgR, &c_e ); c_e = add( c_e, sub( sum_past_nrgL_e, sum_past_nrgR_e ) ); c = Sqrt32( c, &c_e ); // sum_past_nrg_dmx = sum_past_nrgL + sum_past_nrgR + 2 * sum_past_dot_prod_abs; @@ -3739,7 +3709,7 @@ static void stereo_dft_enc_compute_prm_fx( { // g = ( sum_past_nrgL - sum_past_nrgR ) / ( sum_past_nrg_dmx ); L_tmp1 = BASOP_Util_Add_Mant32Exp( sum_past_nrgL, sum_past_nrgL_e, L_negate( sum_past_nrgR ), sum_past_nrgR_e, &L_tmp1_e ); - L_tmp = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_past_nrg_dmx, &L_tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_past_nrg_dmx, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, sum_past_nrg_dmx_e ) ); g = L_shl_sat( L_tmp, L_tmp_e ); // Q31 saturation expected pSideGain[b] = g; @@ -3752,7 +3722,7 @@ static void stereo_dft_enc_compute_prm_fx( // pSideGain[b] = ( c - 1 ) / ( c + 1 ); L_tmp1 = BASOP_Util_Add_Mant32Exp( c, c_e, MIN_32, 0, &L_tmp1_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( c, c_e, MAX_32, 0, &L_tmp2_e ); - L_tmp = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &L_tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) ); pSideGain[b] = L_shl_sat( L_tmp, L_tmp_e ); // Q31 saturation expected move32(); @@ -3795,7 +3765,7 @@ static void stereo_dft_enc_compute_prm_fx( // pPredGain[b] = sqrtf( pPredGain[b] / ( reg + sum_past_nrg_dmx ) ); L_tmp2 = BASOP_Util_Add_Mant32Exp( reg, reg_e, sum_past_nrg_dmx, sum_past_nrg_dmx_e, &L_tmp2_e ); - L_tmp1 = BASOP_Util_Divide3232_Scale_cadence( L_tmp, L_tmp2, &L_tmp1_e ); + L_tmp1 = BASOP_Util_Divide3232_Scale_newton( L_tmp, L_tmp2, &L_tmp1_e ); L_tmp1_e = add( L_tmp1_e, sub( L_tmp_e, L_tmp2_e ) ); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); pPredGain[b] = L_shl( L_tmp1, L_tmp1_e ); // Q31 @@ -3934,14 +3904,14 @@ static void stereo_dft_enc_compute_prm_fx( } // c = sqrtf( sum_energy_L / sum_energy_R ); - c = BASOP_Util_Divide3232_Scale_cadence( sum_energy_L, sum_energy_R, &c_e ); + c = BASOP_Util_Divide3232_Scale_newton( sum_energy_L, sum_energy_R, &c_e ); c_e = add( c_e, sub( sum_energy_L_e, sum_energy_R_e ) ); c = Sqrt32( c, &c_e ); // g = fabsf( ( c - 1 ) / ( c + 1 ) ); L_tmp1 = BASOP_Util_Add_Mant32Exp( c, c_e, MIN_32, 0, &L_tmp1_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( c, c_e, MAX_32, 0, &L_tmp2_e ); - g = L_abs( BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &L_tmp_e ) ); + g = L_abs( BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e ) ); L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) ); g = L_shl_sat( g, L_tmp_e ); // Q31 saturation expected IF( GT_32( g, 1717986918 /*0.8f in Q31*/ ) ) @@ -4347,7 +4317,7 @@ static Word32 stereo_dft_calc_mean_ipd_change_fx( ipd_mean_change = L_add( ipd_mean_change, ipd_change[b] ); } // ipd_mean_change /= gipd_band_max; - ipd_mean_change = BASOP_Util_Divide3232_Scale_cadence( ipd_mean_change, gipd_band_max, &ipd_mean_change_e ); + ipd_mean_change = BASOP_Util_Divide3232_Scale_newton( ipd_mean_change, gipd_band_max, &ipd_mean_change_e ); ipd_mean_change_e = add( ipd_mean_change_e, 18 - 31 ); ipd_mean_change = L_shr( ipd_mean_change, sub( 18, ipd_mean_change_e ) ); // Q13 @@ -4531,13 +4501,13 @@ static void stereo_dft_enc_get_reverb_flag_fx( FOR( b = 0; b <= s_min( hStereoDft->nbands, 6 ); b++ ) /* choose the subbands used for stereo filling */ { // norm_dmx = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_DMX[b]); - norm_dmx = BASOP_Util_Divide3232_Scale_cadence( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_DMX[b], &norm_dmx_e ); + norm_dmx = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_DMX[b], &norm_dmx_e ); norm_dmx_e = add( norm_dmx_e, sub( 31, sub_nrg_DMX_e[b] ) ); // norm_l = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_L[b]); - norm_l = BASOP_Util_Divide3232_Scale_cadence( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_L[b], &norm_l_e ); + norm_l = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_L[b], &norm_l_e ); norm_l_e = add( norm_l_e, sub( 31, sub_nrg_L_e[b] ) ); // norm_r = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_R[b]); - norm_r = BASOP_Util_Divide3232_Scale_cadence( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_R[b], &norm_r_e ); + norm_r = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_R[b], &norm_r_e ); norm_r_e = add( norm_r_e, sub( 31, sub_nrg_R_e[b] ) ); FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) /* normalization on each subbands */ @@ -4583,13 +4553,13 @@ static void stereo_dft_enc_get_reverb_flag_fx( FOR( ; b < s_min( hStereoDft->nbands, 10 ); b++ ) /* choose the subbands used for stereo filling */ { // norm_dmx = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_DMX[b]); - norm_dmx = BASOP_Util_Divide3232_Scale_cadence( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_DMX[b], &norm_dmx_e ); + norm_dmx = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_DMX[b], &norm_dmx_e ); norm_dmx_e = add( norm_dmx_e, sub( 31, sub_nrg_DMX_e[b] ) ); // norm_l = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_L[b]); - norm_l = BASOP_Util_Divide3232_Scale_cadence( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_L[b], &norm_l_e ); + norm_l = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_L[b], &norm_l_e ); norm_l_e = add( norm_l_e, sub( 31, sub_nrg_L_e[b] ) ); // norm_r = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_R[b]); - norm_r = BASOP_Util_Divide3232_Scale_cadence( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_R[b], &norm_r_e ); + norm_r = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_R[b], &norm_r_e ); norm_r_e = add( norm_r_e, sub( 31, sub_nrg_R_e[b] ) ); FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) /* normalization on each subbands */ @@ -4635,7 +4605,7 @@ static void stereo_dft_enc_get_reverb_flag_fx( FOR( b = 0; b < hStereoDft->nbands; b++ ) /* choose the subbands used for stereo filling */ { // sub_nrg_DMX[b] /= (hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]); - sub_nrg_DMX[b] = BASOP_Util_Divide3232_Scale_cadence( sub_nrg_DMX[b], sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), &L_tmp_e ); + sub_nrg_DMX[b] = BASOP_Util_Divide3232_Scale_newton( sub_nrg_DMX[b], sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), &L_tmp_e ); move32(); sub_nrg_DMX_e[b] = add( L_tmp_e, sub( sub_nrg_DMX_e[b], 31 ) ); move16(); @@ -4756,12 +4726,12 @@ static void stereo_dft_enc_get_reverb_flag_fx( // fac = ((diff_l_l > diff_r_l) ? diff_r_l / diff_l_l : diff_l_l / diff_r_l); IF( BASOP_Util_Cmp_Mant32Exp( diff_l_l, diff_l_l_e, diff_r_l, diff_r_l_e ) > 0 ) { - fac = BASOP_Util_Divide3232_Scale_cadence( diff_r_l, diff_l_l, &L_tmp_e ); + fac = BASOP_Util_Divide3232_Scale_newton( diff_r_l, diff_l_l, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( diff_r_l_e, diff_l_l_e ) ); } ELSE { - fac = BASOP_Util_Divide3232_Scale_cadence( diff_l_l, diff_r_l, &L_tmp_e ); + fac = BASOP_Util_Divide3232_Scale_newton( diff_l_l, diff_r_l, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( diff_l_l_e, diff_r_l_e ) ); } fac = L_shl_sat( fac, L_tmp_e ); // Q31 @@ -4813,7 +4783,7 @@ static Word32 stereo_dft_gain_offset_fx( * function @ 32kHz from which the values are interpolated: */ k0 = shr( tau, 3 ); // alpha = s_and(tau, 7) / 8.f; - alpha = BASOP_Util_Divide3232_Scale_cadence( s_and( tau, 7 ), 8, &alpha_e ); + alpha = BASOP_Util_Divide3232_Scale_newton( s_and( tau, 7 ), 8, &alpha_e ); alpha = L_shl( alpha, alpha_e ); // Q31 // wnt = (1 - alpha) * Wn_table[k0] + alpha * Wn_table[k0 + 1]; wnt = L_add( Mpy_32_32( L_sub( MAX_32, alpha ), Wn_table_fx[k0] ), Mpy_32_32( alpha, Wn_table_fx[k0 + 1] ) ); // Q31 @@ -4824,12 +4794,12 @@ static Word32 stereo_dft_gain_offset_fx( L_tmp1 = BASOP_Util_Add_Mant32Exp( MAX_32, 0, c, c_e, &L_tmp1_e ); L_tmp1 = Mpy_32_32( L_tmp1, L_tmp1 ); L_tmp1_e = shl( L_tmp1_e, 1 ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( L_tmp, L_tmp1, &L_tmp2_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp, L_tmp1, &L_tmp2_e ); L_tmp2_e = add( add( L_tmp2_e, sub( L_tmp_e, L_tmp1_e ) ), 3 /*multiply by 8*/ ); L_tmp2 = Mpy_32_32( L_tmp2, L_sub( MAX_32, wnt ) ); L_tmp1 = BASOP_Util_Add_Mant32Exp( MAX_32, 0, L_tmp, L_tmp_e, &L_tmp1_e ); L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, Mpy_32_32( c, wnt ), add( c_e, 1 ), &L_tmp1_e ); - L_tmp = BASOP_Util_Divide3232_Scale_cadence( L_tmp2, L_tmp1, &L_tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp2, L_tmp1, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( L_tmp2_e, L_tmp1_e ) ); L_tmp = Sqrt32( L_tmp, &L_tmp_e ); go = L_shl( L_tmp, L_tmp_e ); @@ -4859,7 +4829,7 @@ static void stereo_dft_enc_calculate_nrg_for_icbwe_fx( Word32 tmp; // bandResDft = ( (float) input_Fs ) / hStereoDft->NFFT; - bandResDft = BASOP_Util_Divide3232_Scale_cadence( input_Fs, hStereoDft->NFFT, &bandResDft_e ); + bandResDft = BASOP_Util_Divide3232_Scale_newton( input_Fs, hStereoDft->NFFT, &bandResDft_e ); // shbBins[0] = (int16_t) ( 6400 / bandResDft ); shbBins[0] = BASOP_Util_Divide3232_Scale( 6400, bandResDft, &tmp_e ); move16(); diff --git a/lib_enc/ivas_stereo_dft_enc_itd_fx.c b/lib_enc/ivas_stereo_dft_enc_itd_fx.c index af10f7dea96e2cd49be4d2038f452cd834fd09f8..eb23e9d01862638d7789f34c293a2818b55ecdb9 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd_fx.c +++ b/lib_enc/ivas_stereo_dft_enc_itd_fx.c @@ -77,7 +77,7 @@ #define ITD_VAD_NOISE_INIT_FRAMES 30 #define ITD_VAD_THRSHOLD 0.001f -#define ITD_VAD_THRSHOLD_Q31 2147484 +#define ITD_VAD_THRSHOLD_Q31 INV_1000_Q31 #define ITD_VAD_MS_SNR_UPDATE_THRESH 15.0f #define ITD_VAD_MS_SNR_UPDATE_THRESH_FX 15 #define HIGHT_SNR_VOICE_TH 10000.0f @@ -169,7 +169,8 @@ static void stereo_dft_quantize_itd_fx( Word16 *ind ) { Word16 itd; - + Word16 input_fs_by_stereo_dft_itd_fs = 0; + move16(); // itd = (int16_t) ( sign( in ) * 0.5f + in ); itd = in; move16(); @@ -188,9 +189,30 @@ static void stereo_dft_quantize_itd_fx( move16(); } + SWITCH( input_Fs ) + { + case 8000: + input_fs_by_stereo_dft_itd_fs = 1; // Q2 + move16(); + BREAK; + case 16000: + input_fs_by_stereo_dft_itd_fs = 2; // Q2 + move16(); + BREAK; + case 32000: + input_fs_by_stereo_dft_itd_fs = 4; // Q2 + move16(); + BREAK; + case 48000: + input_fs_by_stereo_dft_itd_fs = 6; // Q2 + move16(); + BREAK; + default: + assert( 0 ); + } /*Convert back @ fs*/ //*out = (float) ( itd * input_Fs ) / ( (float) ( STEREO_DFT_ITD_FS ) ); - *out = Mpy_32_32( L_shl( itd * input_Fs, 2 ), 1099511628 /*Q45*/ ); // Q45+Q2-Q31 = Q16 + *out = L_shl( L_mult( itd, input_fs_by_stereo_dft_itd_fs ), Q13 ); // Q16 move32(); return; @@ -203,12 +225,8 @@ static void stereo_dft_quantize_itd_fx( *-------------------------------------------------------------------------*/ static Word32 itd_vad_ms_snr_calc_fx( -#ifdef FIX_ISSUE_1092 Word32 E_band_n[STEREO_DFT_ITD_VAD_BAND_NUM], // E_band_n_exp Word16 E_band_n_exp[STEREO_DFT_ITD_VAD_BAND_NUM], -#else - Word32 E_band_n[STEREO_DFT_ITD_VAD_BAND_NUM], // Q0 -#endif Word32 *Spd, // Q(31-Spd_e) Word16 *Spd_e, Word32 *E_band, // Q(31-E_band_e) @@ -236,7 +254,7 @@ static Word32 itd_vad_ms_snr_calc_fx( move32(); } // E_band[i] = E_band[i] / ( itd_vad_band_tbl[i + 1] - itd_vad_band_tbl[i] ); - E_band[i] = BASOP_Util_Divide3232_Scale_cadence( E_band[i], L_sub( itd_vad_band_tbl[i + 1], itd_vad_band_tbl[i] ), &exp ); + E_band[i] = BASOP_Util_Divide3232_Scale_newton( E_band[i], L_sub( itd_vad_band_tbl[i + 1], itd_vad_band_tbl[i] ), &exp ); move32(); E_band_e[i] = add( exp, sub( E_band_e[i], 31 ) ); move16(); @@ -249,13 +267,9 @@ static Word32 itd_vad_ms_snr_calc_fx( FOR( i = 0; i < STEREO_DFT_ITD_VAD_BAND_NUM; i++ ) { // snr[i] = E_band[i] / E_band_n[i]; - snr[i] = BASOP_Util_Divide3232_Scale_cadence( E_band[i], E_band_n[i], &snr_e[i] ); + snr[i] = BASOP_Util_Divide3232_Scale_newton( E_band[i], E_band_n[i], &snr_e[i] ); move32(); -#ifdef FIX_ISSUE_1092 snr_e[i] = add( snr_e[i], sub( E_band_e[i], E_band_n_exp[i] ) ); -#else - snr_e[i] = add( snr_e[i], sub( E_band_e[i], 31 ) ); -#endif move16(); // if ( snr[i] < 1 ) IF( BASOP_Util_Cmp_Mant32Exp( snr[i], snr_e[i], 1, 31 ) < 0 ) @@ -291,12 +305,8 @@ static Word32 itd_vad_ms_snr_calc_fx( * *-------------------------------------------------------------------------*/ static void itd_vad_background_update_fx( -#ifdef FIX_ISSUE_1092 Word32 E_band_n[STEREO_DFT_ITD_VAD_BAND_NUM], // E_band_n_exp Word16 E_band_n_exp[STEREO_DFT_ITD_VAD_BAND_NUM], -#else - Word32 E_band_n[STEREO_DFT_ITD_VAD_BAND_NUM], // Q0 -#endif Word16 *vad_frm_cnt, const Word32 ms_snr, // Q(31-ms_snr_e) const Word16 ms_snr_e, @@ -338,19 +348,10 @@ static void itd_vad_background_update_fx( Word16 q_temp = norm_l( *vad_frm_cnt ); L_temp = L_shl( *vad_frm_cnt, q_temp ); L_temp_e = sub( 31, q_temp ); -#ifdef FIX_ISSUE_1092 L_temp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( E_band_n[i], L_temp ), add( E_band_n_exp[i], L_temp_e ), E_band[i], E_band_e[i], &L_temp_e ); -#else - L_temp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( E_band_n[i], L_temp ), add( 31, L_temp_e ), E_band[i], E_band_e[i], &L_temp_e ); -#endif - E_band_n[i] = BASOP_Util_Divide3232_Scale_cadence( L_temp, L_add( *vad_frm_cnt, 1 ), &E_band_n_e_tmp ); + E_band_n[i] = BASOP_Util_Divide3232_Scale_newton( L_temp, L_add( *vad_frm_cnt, 1 ), &E_band_n_e_tmp ); move32(); -#ifdef FIX_ISSUE_1092 E_band_n_exp[i] = add( E_band_n_e_tmp, sub( L_temp_e, 31 ) ); -#else - E_band_n_e_tmp = add( E_band_n_e_tmp, sub( L_temp_e, 31 ) ); - E_band_n[i] = L_shr_r( E_band_n[i], sub( 31, E_band_n_e_tmp ) ); // Q31 -#endif move16(); } } @@ -362,7 +363,6 @@ static void itd_vad_background_update_fx( FOR( i = 0; i < STEREO_DFT_ITD_VAD_BAND_NUM; i++ ) { // E_band_n[i] = 0.96f * E_band_n[i] + 0.04f * E_band[i]; -#ifdef FIX_ISSUE_1092 E_band_n[i] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( 2061584302 /*0.96 in Q31*/, E_band_n[i] ), E_band_n_exp[i], Mpy_32_32( 85899346 /*0.04 in Q31*/, E_band[i] ), E_band_e[i], &E_band_n_e_tmp ); move32(); E_band_n_exp[i] = E_band_n_e_tmp; @@ -375,20 +375,6 @@ static void itd_vad_background_update_fx( E_band_n_exp[i] = 0; move16(); } -#else - E_band_n[i] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( 2061584302, E_band_n[i] ), 31, Mpy_32_32( 85899346, E_band[i] ), E_band_e[i], &E_band_n_e_tmp ); - move32(); - // if ( E_band_n[i] < 1.0f ) - IF( BASOP_Util_Cmp_Mant32Exp( E_band_n[i], E_band_n_e_tmp, MAX_32, 0 ) < 0 ) - { - E_band_n[i] = MAX_32; - move32(); - E_band_n_e_tmp = 0; - move16(); - } - E_band_n[i] = L_shr_r( E_band_n[i], sub( 31, E_band_n_e_tmp ) ); // Q31 - move32(); -#endif } } } @@ -402,12 +388,8 @@ static void itd_vad_background_update_fx( *-------------------------------------------------------------------------*/ static Word16 stereo_dft_enc_itd_vad_fx( -#ifdef FIX_ISSUE_1092 Word32 E_band_n[STEREO_DFT_ITD_VAD_BAND_NUM], // E_band_n_exp Word16 E_band_n_exp[STEREO_DFT_ITD_VAD_BAND_NUM], -#else - Word32 E_band_n[STEREO_DFT_ITD_VAD_BAND_NUM], // Q0 -#endif Word16 *vad_frm_cnt, Word32 *Spd_L, // Q(31-Spd_L_e) Word16 *Spd_L_e, @@ -434,17 +416,10 @@ static Word16 stereo_dft_enc_itd_vad_fx( Spd_e[i] = sub( Spd_e[i], 1 ); move16(); } -#ifdef FIX_ISSUE_1092 *mssnr = itd_vad_ms_snr_calc_fx( E_band_n, E_band_n_exp, Spd, Spd_e, E_band, E_band_e, mssnr_e ); move32(); itd_vad_background_update_fx( E_band_n, E_band_n_exp, vad_frm_cnt, *mssnr, *mssnr_e, E_band, E_band_e ); -#else - *mssnr = itd_vad_ms_snr_calc_fx( E_band_n, Spd, Spd_e, E_band, E_band_e, mssnr_e ); - move32(); - - itd_vad_background_update_fx( E_band_n, vad_frm_cnt, *mssnr, *mssnr_e, E_band, E_band_e ); -#endif // if ( *mssnr < ITD_VAD_THRSHOLD ) IF( BASOP_Util_Cmp_Mant32Exp( *mssnr, *mssnr_e, ITD_VAD_THRSHOLD_Q31, 0 ) < 0 ) { @@ -583,7 +558,7 @@ static Word32 calc_mean_E_ratio_fx( L_temp1 = BASOP_Util_Add_Mant32Exp( acorr, acorr_e, fi[b], fi_e[b], &L_temp1_e ); L_temp2 = BASOP_Util_Add_Mant32Exp( acorr, acorr_e, L_negate( fi[b] ), fi_e[b], &L_temp2_e ); L_temp2 = BASOP_Util_Add_Mant32Exp( L_temp2, L_temp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_temp2_e ); - Er[b] = BASOP_Util_Divide3232_Scale_cadence( L_temp1, L_temp2, &Er_e[b] ); + Er[b] = BASOP_Util_Divide3232_Scale_newton( L_temp1, L_temp2, &Er_e[b] ); move32(); Er_e[b] = add( Er_e[b], sub( L_temp1_e, L_temp2_e ) ); move16(); @@ -632,7 +607,7 @@ static Word32 calc_mean_E_ratio_fx( L_temp1 = BASOP_Util_Add_Mant32Exp( acorr, acorr_e, total_fi, total_fi_e, &L_temp1_e ); L_temp2 = BASOP_Util_Add_Mant32Exp( acorr, acorr_e, L_negate( total_fi ), total_fi_e, &L_temp2_e ); L_temp2 = BASOP_Util_Add_Mant32Exp( L_temp2, L_temp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_temp2_e ); - *total_mEr = BASOP_Util_Divide3232_Scale_cadence( L_temp1, L_temp2, total_mEr_e ); + *total_mEr = BASOP_Util_Divide3232_Scale_newton( L_temp1, L_temp2, total_mEr_e ); move32(); *total_mEr_e = add( *total_mEr_e, sub( L_temp1_e, L_temp2_e ) ); move16(); @@ -998,7 +973,8 @@ void stereo_dft_enc_compute_itd_fx( Word32 cng_xcorr_filt; Word16 cng_xcorr_filt_e; - + Word32 sum_nrg_delta; + Word16 sum_nrg_delta_e; Word16 prev_itd_max; Word16 itd_max_flip; @@ -1262,7 +1238,6 @@ void stereo_dft_enc_compute_itd_fx( move32(); xcorr_abs[i] = Sqrt32( xcorr_abs[i], &xcorr_abs_e[i] ); move32(); - /* VM: prod_LL tends to overflow, better to replace with sum(log(prod_L)) and retrain the classifier */ prod_LL = prod_L; move32(); prod_LL_e = prod_L_e; @@ -1349,14 +1324,14 @@ void stereo_dft_enc_compute_itd_fx( // g_ILD = sqrtf( sum_nrg_L / ( sum_nrg_R + 1.0f ) ); L_temp = BASOP_Util_Add_Mant32Exp( sum_nrg_R, sum_nrg_R_e, MAX_32, 0, &L_temp_e ); - g_ILD = BASOP_Util_Divide3232_Scale_cadence( sum_nrg_L, L_temp, &g_ILD_e ); + g_ILD = BASOP_Util_Divide3232_Scale_newton( sum_nrg_L, L_temp, &g_ILD_e ); g_ILD_e = add( g_ILD_e, sub( sum_nrg_L_e, L_temp_e ) ); g_ILD = Sqrt32( g_ILD, &g_ILD_e ); // g_ILD = fabsf( ( g_ILD - 1 ) / ( g_ILD + 1 ) ); L_temp = BASOP_Util_Add_Mant32Exp( g_ILD, g_ILD_e, MIN_32, 0, &L_temp_e ); L_temp2 = BASOP_Util_Add_Mant32Exp( g_ILD, g_ILD_e, MAX_32, 0, &L_temp2_e ); - g_ILD = L_abs( BASOP_Util_Divide3232_Scale_cadence( L_temp, L_temp2, &g_ILD_e ) ); + g_ILD = L_abs( BASOP_Util_Divide3232_Scale_newton( L_temp, L_temp2, &g_ILD_e ) ); g_ILD_e = add( g_ILD_e, sub( L_temp_e, L_temp2_e ) ); g_ILD = L_shl_sat( g_ILD, g_ILD_e ); // Q31 @@ -1386,7 +1361,7 @@ void stereo_dft_enc_compute_itd_fx( // g_IPD = ( sum_nrg_L + sum_nrg_R + 2 * grand_dot_prod_real ) / grand_nrg_DMX; L_temp = BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, sum_nrg_R, sum_nrg_R_e, &L_temp_e ); L_temp = BASOP_Util_Add_Mant32Exp( L_temp, L_temp_e, grand_dot_prod_real, add( grand_dot_prod_real_e, 1 ), &L_temp_e ); - g_IPD = BASOP_Util_Divide3232_Scale_cadence( L_temp, grand_nrg_DMX, &g_IPD_e ); + g_IPD = BASOP_Util_Divide3232_Scale_newton( L_temp, grand_nrg_DMX, &g_IPD_e ); g_IPD_e = add( g_IPD_e, sub( L_temp_e, grand_nrg_DMX_e ) ); // if ( g_IPD >= 1.0f ) IF( BASOP_Util_Cmp_Mant32Exp( g_IPD, g_IPD_e, ONE_IN_Q29 - ONE_IN_Q14 /*Adjusting threshold for precision loss*/, 2 ) >= 0 ) @@ -1410,13 +1385,19 @@ void stereo_dft_enc_compute_itd_fx( hStereoClassif->xtalk_fv_fx[E_gainIPD] = L_shr_r( g_IPD, 10 ); // Q15 move32(); - // angle_rot = fabsf( atanf( 2.0f * ( grand_dot_prod_real ) / ( sum_nrg_L - sum_nrg_R + 1.0f ) ) ); - L_temp = BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, L_negate( sum_nrg_R ), sum_nrg_R_e, &L_temp_e ); - L_temp = BASOP_Util_Add_Mant32Exp( L_temp, L_temp_e, MAX_32, 0, &L_temp_e ); - L_temp2 = BASOP_Util_Divide3232_Scale_cadence( grand_dot_prod_real, L_temp, &L_temp2_e ); - L_temp2_e = add( L_temp2_e, sub( add( grand_dot_prod_real_e, 1 ), L_temp_e ) ); + sum_nrg_delta = BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, L_negate( sum_nrg_R ), sum_nrg_R_e, &sum_nrg_delta_e ); + IF( GE_32( sum_nrg_delta, 0 ) ) + { + sum_nrg_delta = L_max( sum_nrg_delta, L_shl_sat( 1, sum_nrg_delta_e ) ); + } + ELSE + { + sum_nrg_delta = L_min( sum_nrg_delta, L_negate( L_shl_sat( 1, sum_nrg_delta_e ) ) ); + } + // angle_rot = fabsf( atanf( 2.0f * ( grand_dot_prod_real ) / sum_nrg_delta ) ); + L_temp2 = BASOP_Util_Divide3232_Scale_newton( grand_dot_prod_real, sum_nrg_delta, &L_temp2_e ); + L_temp2_e = add( L_temp2_e, sub( add( grand_dot_prod_real_e, 1 ), sum_nrg_delta_e ) ); angle_rot = L_abs( BASOP_util_atan( L_shr_r_sat( L_temp2, ( sub( 6, L_temp2_e ) ) ) ) ); // Q14 - // angle_rot = L_abs( BASOP_util_atan2( grand_dot_prod_real, L_temp, sub( add( grand_dot_prod_real_e, 1 ), L_temp_e ) ) ); // Q13 hStereoClassif->unclr_fv_fx[E_angle_rot] = L_shl( angle_rot, 1 ); // Q15 move32(); @@ -1425,7 +1406,7 @@ void stereo_dft_enc_compute_itd_fx( // g_side = fabsf( sum_nrg_L - sum_nrg_R ) / ( grand_nrg_DMX ); L_temp = L_abs( BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, L_negate( sum_nrg_R ), sum_nrg_R_e, &L_temp_e ) ); - g_side = BASOP_Util_Divide3232_Scale_cadence( L_temp, grand_nrg_DMX, &g_side_e ); + g_side = BASOP_Util_Divide3232_Scale_newton( L_temp, grand_nrg_DMX, &g_side_e ); g_side_e = add( g_side_e, sub( L_temp_e, grand_nrg_DMX_e ) ); g_side = L_shl_sat( g_side, g_side_e ); // Q31 g_side_e = 0; @@ -1476,11 +1457,7 @@ void stereo_dft_enc_compute_itd_fx( } // L_temp = sum2_32_fx( &Spd_L[1], 11, &L_temp_e ); sum_nrg_L_lb = BASOP_Util_Add_Mant32Exp( sum_nrg_L_lb, sum_nrg_L_lb_e, L_temp, L_temp_e, &sum_nrg_L_lb_e ); -#ifdef FIX_ISSUE_1092 vad_flag_itd = stereo_dft_enc_itd_vad_fx( hItd->E_band_n_fx, hItd->E_band_n_exp, &( hItd->vad_frm_cnt ), Spd_L, Spd_L_e, Spd_R, Spd_R_e, &mssnr, &mssnr_e ); -#else - vad_flag_itd = stereo_dft_enc_itd_vad_fx( hItd->E_band_n_fx, &( hItd->vad_frm_cnt ), Spd_L, Spd_L_e, Spd_R, Spd_R_e, &mssnr, &mssnr_e ); -#endif vad_flag_itd = vad_flag_itd && vad_flag_dtx[0]; // if ( sum_nrg_L < EPSILON ) @@ -1494,15 +1471,15 @@ void stereo_dft_enc_compute_itd_fx( ELSE { // sfm_L = expf( log_prod_L / ( NFFT_mid ) ) / ( sum_abs_L / ( NFFT_mid ) ); - L_temp = BASOP_Util_Divide3232_Scale_cadence( log_prod_L, NFFT_mid, &L_temp_e ); + L_temp = BASOP_Util_Divide3232_Scale_newton( log_prod_L, NFFT_mid, &L_temp_e ); L_temp_e = add( L_temp_e, sub( log_prod_L_e, 31 ) ); - L_temp = BASOP_Util_fPow( 1459366444 /*2.718 in Q29*/, 2, L_temp, L_temp_e, &L_temp_e ); + L_temp = BASOP_Util_fPow( 1459215139 /*2.718 in Q29*/, 2, L_temp, L_temp_e, &L_temp_e ); q_temp = norm_l( NFFT_mid ); L_temp2 = L_shl( NFFT_mid, q_temp ); L_temp2_e = sub( 31, q_temp ); L_temp = Mpy_32_32( L_temp, L_temp2 ); L_temp_e = add( L_temp_e, L_temp2_e ); - sfm_L = BASOP_Util_Divide3232_Scale_cadence( L_temp, sum_abs_L, &sfm_L_e ); + sfm_L = BASOP_Util_Divide3232_Scale_newton( L_temp, sum_abs_L, &sfm_L_e ); sfm_L_e = add( sfm_L_e, sub( L_temp_e, sum_abs_L_e ) ); sfm_L = L_shl_sat( sfm_L, sfm_L_e ); // Q31 - should be rechecked for -10dB tests } @@ -1518,7 +1495,7 @@ void stereo_dft_enc_compute_itd_fx( ELSE { // sfm_R = expf( log_prod_R / ( NFFT_mid ) ) / ( sum_abs_R / ( NFFT_mid ) ); - L_temp = BASOP_Util_Divide3232_Scale_cadence( log_prod_R, NFFT_mid, &L_temp_e ); + L_temp = BASOP_Util_Divide3232_Scale_newton( log_prod_R, NFFT_mid, &L_temp_e ); L_temp_e = add( L_temp_e, sub( log_prod_R_e, 31 ) ); L_temp = BASOP_Util_fPow( 1459366444 /*2.718 in Q29*/, 2, L_temp, L_temp_e, &L_temp_e ); q_temp = norm_l( NFFT_mid ); @@ -1526,7 +1503,7 @@ void stereo_dft_enc_compute_itd_fx( L_temp2_e = sub( 31, q_temp ); L_temp = Mpy_32_32( L_temp, L_temp2 ); L_temp_e = add( L_temp_e, L_temp2_e ); - sfm_R = BASOP_Util_Divide3232_Scale_cadence( L_temp, sum_abs_R, &sfm_L_e ); + sfm_R = BASOP_Util_Divide3232_Scale_newton( L_temp, sum_abs_R, &sfm_L_e ); sfm_R_e = add( sfm_L_e, sub( L_temp_e, sum_abs_R_e ) ); // sfm_R = L_shl_r( sfm_R, sfm_R_e ); // Q31 sfm_R = L_shl_sat( sfm_R, sfm_R_e ); // Q31 @@ -1714,7 +1691,7 @@ void stereo_dft_enc_compute_itd_fx( } // cng_xcorr_filt = max( min( CORR_FILT, 10.0f * CORR_FILT / ( hStereoDft->expectedNumUpdates + hStereoDft->currentNumUpdates ) ), sfm_L ); - cng_xcorr_filt = BASOP_Util_Divide3232_Scale_cadence( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); + cng_xcorr_filt = BASOP_Util_Divide3232_Scale_newton( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); cng_xcorr_filt = L_shl_sat( cng_xcorr_filt, cng_xcorr_filt_e ); // Q31 cng_xcorr_filt = L_max( L_min( CORR_FILT_Q31, cng_xcorr_filt ), sfm_L ); // Q31 @@ -1775,7 +1752,7 @@ void stereo_dft_enc_compute_itd_fx( // cng_xcorr_filt = max( min( CORR_FILT, 10.0f * CORR_FILT / ( hStereoDft->expectedNumUpdates + hStereoDft->currentNumUpdates ) ), sfm_L ); IF( add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ) != 0 ) { - cng_xcorr_filt = BASOP_Util_Divide3232_Scale_cadence( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); + cng_xcorr_filt = BASOP_Util_Divide3232_Scale_newton( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); cng_xcorr_filt = L_shl_sat( cng_xcorr_filt, cng_xcorr_filt_e ); // Q31 cng_xcorr_filt = L_max( L_min( CORR_FILT_Q31, cng_xcorr_filt ), sfm_L ); // Q31 } @@ -1968,7 +1945,7 @@ void stereo_dft_enc_compute_itd_fx( } // tmpf1 = (float) ( NFFT / 2 + 1 ) / tmpf3; - tmpf1 = BASOP_Util_Divide3232_Scale_cadence( add( shr( NFFT, 1 ), 1 ), tmpf3, &tmpf1_e ); + tmpf1 = BASOP_Util_Divide3232_Scale_newton( add( shr( NFFT, 1 ), 1 ), tmpf3, &tmpf1_e ); tmpf1_e = add( tmpf1_e, sub( 31, tmpf3_e ) ); FOR( i = 0; i < NFFT; i++ ) { @@ -2046,7 +2023,7 @@ void stereo_dft_enc_compute_itd_fx( L_temp = L_abs( BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, L_negate( sum_nrg_R ), sum_nrg_R_e, &L_temp_e ) ); L_temp2 = BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, sum_nrg_R, sum_nrg_R_e, &L_temp2_e ); L_temp2 = BASOP_Util_Add_Mant32Exp( L_temp2, L_temp2_e, 1407374883, -16, &L_temp2_e ); - es_em = BASOP_Util_Divide3232_Scale_cadence( L_temp, L_temp2, &es_em_e ); + es_em = BASOP_Util_Divide3232_Scale_newton( L_temp, L_temp2, &es_em_e ); es_em_e = add( es_em_e, sub( L_temp_e, L_temp2_e ) ); hStereoClassif->unclr_fv_fx[E_es_em] = L_shr_r( es_em, sub( 16, es_em_e ) ); // Q15 @@ -2078,7 +2055,7 @@ void stereo_dft_enc_compute_itd_fx( move16(); } L_temp2 = BASOP_Util_Add_Mant32Exp( L_temp2, L_temp2_e, 1407374883, -16, &L_temp2_e ); - d_prodL_prodR = BASOP_Util_Divide3232_Scale_cadence( L_temp, L_temp2, &d_prodL_prodR_e ); + d_prodL_prodR = BASOP_Util_Divide3232_Scale_newton( L_temp, L_temp2, &d_prodL_prodR_e ); d_prodL_prodR_e = add( d_prodL_prodR_e, sub( L_temp_e, L_temp2_e ) ); d_prodL_prodR = BASOP_Util_Add_Mant32Exp( d_prodL_prodR, d_prodL_prodR_e, MAX_32, 0, &d_prodL_prodR_e ); d_prodL_prodR = BASOP_Util_Loge( d_prodL_prodR, d_prodL_prodR_e ); // Q25 @@ -2097,7 +2074,7 @@ void stereo_dft_enc_compute_itd_fx( // xcorr_abs[i] = logf( xcorr_abs[i] / ( sum_nrg_L + sum_nrg_R + 1e-5f ) + 1e-5f ); L_temp = BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, sum_nrg_R, sum_nrg_R_e, &L_temp_e ); L_temp = BASOP_Util_Add_Mant32Exp( L_temp, L_temp_e, 1407374883, -16, &L_temp_e ); - L_temp2 = BASOP_Util_Divide3232_Scale_cadence( xcorr_abs[i], L_temp, &L_temp2_e ); + L_temp2 = BASOP_Util_Divide3232_Scale_newton( xcorr_abs[i], L_temp, &L_temp2_e ); L_temp2_e = add( L_temp2_e, sub( xcorr_abs_e[i], L_temp_e ) ); L_temp2 = BASOP_Util_Add_Mant32Exp( L_temp2, L_temp2_e, 1407374883, -16, &L_temp2_e ); xcorr_abs[i] = BASOP_Util_Loge( L_temp2, L_temp2_e ); @@ -2163,12 +2140,12 @@ void stereo_dft_enc_compute_itd_fx( move16(); // hStereoClassif->ave_ener_L = sum_nrg_L / ( NFFT_mid * NFFT_mid ); - hStereoClassif->ave_ener_L_fx = BASOP_Util_Divide3232_Scale_cadence( sum_nrg_L, L_mult0( NFFT_mid, NFFT_mid ), &hStereoClassif->ave_ener_L_fx_e ); + hStereoClassif->ave_ener_L_fx = BASOP_Util_Divide3232_Scale_newton( sum_nrg_L, L_mult0( NFFT_mid, NFFT_mid ), &hStereoClassif->ave_ener_L_fx_e ); move32(); hStereoClassif->ave_ener_L_fx_e = add( hStereoClassif->ave_ener_L_fx_e, sub( sum_nrg_L_e, 31 ) ); move16(); // hStereoClassif->ave_ener_R = sum_nrg_R / ( NFFT_mid * NFFT_mid ); - hStereoClassif->ave_ener_R_fx = BASOP_Util_Divide3232_Scale_cadence( sum_nrg_R, L_mult0( NFFT_mid, NFFT_mid ), &hStereoClassif->ave_ener_R_fx_e ); + hStereoClassif->ave_ener_R_fx = BASOP_Util_Divide3232_Scale_newton( sum_nrg_R, L_mult0( NFFT_mid, NFFT_mid ), &hStereoClassif->ave_ener_R_fx_e ); move32(); hStereoClassif->ave_ener_R_fx_e = add( hStereoClassif->ave_ener_R_fx_e, sub( sum_nrg_R_e, 31 ) ); move16(); @@ -2196,7 +2173,7 @@ void stereo_dft_enc_compute_itd_fx( { // thres *= 1.0f + 1.f * min( 1.f, max( 0.f, ( -1.0f * sfm_L + 0.5f ) / ( 0.5f - 0.2f ) ) ); L_temp = BASOP_Util_Add_Mant32Exp( L_negate( sfm_L ), 0, ONE_IN_Q30, 0, &L_temp_e ); - L_temp2 = BASOP_Util_Divide3232_Scale_cadence( L_temp, 644245094, &L_temp2_e ); + L_temp2 = BASOP_Util_Divide3232_Scale_newton( L_temp, 644245094, &L_temp2_e ); L_temp2_e = add( L_temp2_e, L_temp_e - 0 ); L_temp2 = L_shl_sat( L_temp2, sub( L_temp2_e, 1 ) ); // Q30 L_temp2_e = 1; @@ -2414,7 +2391,7 @@ void stereo_dft_enc_compute_itd_fx( L_temp = Mpy_32_32( den_cor_cur, den_cor_prev ); L_temp_e = add( den_cor_cur_e, den_cor_prev_e ); L_temp = Sqrt32( L_temp, &L_temp_e ); - cor_lb[i] = BASOP_Util_Divide3232_Scale_cadence( num_cor, L_temp, &cor_lb_e[i] ); + cor_lb[i] = BASOP_Util_Divide3232_Scale_newton( num_cor, L_temp, &cor_lb_e[i] ); move32(); cor_lb_e[i] = add( cor_lb_e[i], sub( num_cor_e, L_temp_e ) ); move16(); @@ -2426,7 +2403,7 @@ void stereo_dft_enc_compute_itd_fx( // par_L[i] = xcorr_max / ( sum_nrg_L_tmp + FLT_MIN ); IF( xcorr_max ) { - par_L[i] = BASOP_Util_Divide3232_Scale_cadence( xcorr_max, sum_nrg_L_tmp, &par_L_e[i] ); + par_L[i] = BASOP_Util_Divide3232_Scale_newton( xcorr_max, sum_nrg_L_tmp, &par_L_e[i] ); move32(); par_L_e[i] = add( par_L_e[i], sub( xcorr_max_e, sum_nrg_L_tmp_e ) ); move16(); diff --git a/lib_enc/ivas_stereo_dft_td_itd_fx.c b/lib_enc/ivas_stereo_dft_td_itd_fx.c index df4fe3edd15fe29ac3813dec4130beccfd7487cd..2c044625c9afe432e74c86ab81a9ddde7ce46d14 100644 --- a/lib_enc/ivas_stereo_dft_td_itd_fx.c +++ b/lib_enc/ivas_stereo_dft_td_itd_fx.c @@ -50,9 +50,9 @@ #define STEREO_DFT_CHANNEL_EXTR_LPC_ORDER 10 #define STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT 320 -#define FLR_FX 16384 // Q15 -#define ONE_HALF 24576 // Q14 -const Word16 wac_swb_h_fx[LPC_SHB_ORDER + 1] = { // Q15 +#define FLR_FX 1073741824 // Q31 +#define ONE_HALF 24576 // Q14 +const Word16 wac_swb_h_fx[LPC_SHB_ORDER + 1] = { // Q15 32767, 32758, 32731, @@ -95,7 +95,12 @@ static void stereo_td_get_td_itd_fx( { /* *td_itd is the closest integer to itd that transforms into an integer value * * under the transform x -> (32000/fs) x. */ - Word16 d, d_e; + Word32 inverse_input_fs_by_16k = 0; + move32(); + Word64 tmp64; + Word16 d = 0, shift = 0; + move16(); + move16(); IF( EQ_32( input_Fs, 32000 ) ) { @@ -106,24 +111,51 @@ static void stereo_td_get_td_itd_fx( ELSE { assert( ( input_Fs % 16000 ) == 0 && "sampling frequency should be divisible by 16000" ); - Word16 temp_div, temp_e, temp_add; - d = BASOP_Util_Divide3232_Scale( input_Fs, 16000, &d_e ); - temp_div = BASOP_Util_Divide3232_Scale( itd, L_deposit_h( d ), &temp_e ); - temp_e = add( temp_e, sub( sub( 31, q_itd ), d_e ) ); // e+(e1-e2)// - temp_add = add_sat( temp_div, shr_sat( FLR_FX, temp_e ) ); - - IF( itd != 0 ) + IF( itd == 0 ) { - *td_itd_32 = extract_l( L_shl( L_shr( L_add( temp_add, EPSILON_FX ), sub( 15, temp_e ) ), 1 ) ); + *td_itd_32 = *td_itd = 0; + move16(); + move16(); } ELSE { - *td_itd_32 = shl( shr( temp_add, sub( 15, temp_e ) ), 1 ); - } - move16(); + SWITCH( input_Fs ) + { + case 16000: + inverse_input_fs_by_16k = 1073741824; // Q30 /* This is in Q30, because 2147483648 cannot be represnt in Word32*/ + move32(); + d = 1; // Q0 + move16(); + shift = 1; + move16(); + BREAK; + case 32000: + inverse_input_fs_by_16k = 1073741824; // Q31 + move32(); + d = 2; // Q0 + move16(); + BREAK; + case 48000: + inverse_input_fs_by_16k = 715827883; // Q31 + move32(); + d = 3; // Q0 + move16(); + if ( itd < 0 ) + { + inverse_input_fs_by_16k = 715827882; /* Reducing the precision by 1 to handle multiplication of negative case*/ + move32(); + } + BREAK; + default: + assert( 0 ); + } + tmp64 = W_add( W_mult0_32_32( itd, inverse_input_fs_by_16k ), W_shl( FLR_FX, sub( q_itd, shift ) ) ); // Q: q_itd - shift + 31 + *td_itd_32 = shl( extract_l( W_extract_l( W_shr( tmp64, add( sub( q_itd, shift ), Q31 ) ) ) ), 1 ); // Q0 + move16(); - *td_itd = i_mult( shr( *td_itd_32, 1 ), shr( d, sub( 15, d_e ) ) ); - move16(); + *td_itd = i_mult( shr( *td_itd_32, 1 ), d ); // Q0 + move16(); + } } return; @@ -380,15 +412,6 @@ void stereo_td_itd_fx( move16(); set16_fx( shift_input, 0, input_frame ); - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - - Scale_sig( &input_mem[n][0], dft_ovl, sts[n]->q_inp - q_input_mem[n] ); // Q(sts[n]->q_inp) - // Scale_sig(&sts[n]->old_input_signal_fx, 1965, sts[n]->q_inp - sts[n]->q_old_inp); - // sts[n]->q_old_inp = sts[n]->q_inp; - q_input_mem[n] = sts[n]->q_inp; - move16(); - } IF( EQ_16( sts[0]->element_mode, IVAS_CPE_MDCT ) ) { FOR( n = 0; n < CPE_CHANNELS; n++ ) @@ -508,8 +531,8 @@ void stereo_td_itd_fx( Copy( shift_input, sts[ch]->input_fx, input_frame ); sts[ch]->q_inp = q_new_shift; move16(); - /*sts[ch]->q_old_inp = q_new_shift; - move16();*/ + Copy_Scale_sig_16_32_no_sat( sts[ch]->input_fx, sts[ch]->input32_fx, input_frame, sub( sts[ch]->q_inp32, sts[ch]->q_inp ) ); + IF( EQ_16( sts[0]->element_mode, IVAS_CPE_DFT ) ) { // here shift_mem has same as input_mem, no need to update q // @@ -521,6 +544,7 @@ void stereo_td_itd_fx( sts[ch]->q_old_inp = q_new_shift; move16(); Scale_sig( mdct_mem[ch], input_frame, sub( sts[ch]->q_inp, q_shift_mem ) ); // Q(sts[ch]->q_inp) + Copy_Scale_sig_16_32_no_sat( shift_mem, sts[ch]->old_input_signal32_fx, input_frame, sub( sts[ch]->q_old_inp32, q_shift_mem ) ); } } } @@ -549,6 +573,8 @@ void stereo_td_itd_mdct_stereo_fx( Word16 DFT_e[CPE_CHANNELS]; Word16 DFT_tmp_e[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC]; STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct; + Word16 dft_ovl; + Word16 sf; test(); IF( hCPE->hStereoMdct != NULL && hCPE->hStereoMdct->hItd != NULL ) @@ -587,6 +613,19 @@ void stereo_td_itd_mdct_stereo_fx( /* Time Domain ITD compensation using extrapolation */ stereo_td_itd_fx( hStereoMdct->hItd, NULL, NULL, 1, hStereoMdct->hDft_ana->dft_ovl, hCPE->hCoreCoder, input_frame, hCPE->input_mem_fx, hCPE->q_input_mem ); } + ELSE IF( hCPE->input_mem_fx[0] != NULL ) + { + dft_ovl = extract_l( Mpy_32_32( imult3216( input_frame, STEREO_DFT_OVL_MAX ), 2236963 ) ); // 1/L_FRAME48k = 2236963 (Q31) + + FOR( i = 0; i < CPE_CHANNELS; i++ ) + { + sf = L_norm_arr( hCPE->hCoreCoder[i]->input32_fx + input_frame - dft_ovl, dft_ovl ); + Copy_Scale_sig32_16( hCPE->hCoreCoder[i]->input32_fx + input_frame - dft_ovl, hCPE->input_mem_fx[i], dft_ovl, sf ); + hCPE->q_input_mem[i] = sub( add( hCPE->hCoreCoder[i]->q_inp32, sf ), 16 ); + move16(); + } + } + return; } diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index ae8a8203e815b5597d27cb4d6ffeb44070301274..d68976482a1c46f12c4eabeadb372a05cb60cf62 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -39,7 +39,6 @@ #include "prot_fx.h" #include "ivas_prot_fx.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" #include "ivas_rom_enc.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" @@ -65,17 +64,27 @@ #define Q_BAND_FX 536870912 /*Q31*/ -#define STEREO_DMX_EVS_ISD_FORGETTING_Q15 31129 #define STEREO_DMX_EVS_ISD_THRES_L_Q31 1932735283 #define STEREO_DMX_EVS_ISD_DIST_THRES_IPD_Q15 ONE_IN_Q14 -#define STEREO_DMX_EVS_ISD_DIST_HYST_L_Q15 11796 -#define STEREO_DMX_EVS_ISD_DIST_HYST_H_Q15 14090 +#define STEREO_DMX_EVS_ISD_FORGETTING_Q31 2040109465 +#define STEREO_DMX_EVS_ISD_1MFORGETTING_Q15 1638 +#define STEREO_DMX_EVS_ISD_DIST_HYST_L_Q31 773094113 +#define STEREO_DMX_EVS_ISD_DIST_HYST_H_Q31 923417968 +#define STEREO_DMX_EVS_ISD_INVTHRES_H 1270700383 #define STEREO_DMX_EVS_ICCR_FORGETTING_Q31 1503238554 #define STEREO_DMX_EVS_ICCR_HYST_L_Q31 1610612736 #define STEREO_DMX_EVS_ICCR_HYST_H_Q31 1825361101 +#define STEREO_DMX_EVS_ICCRES_FORGETTING_Q31 1975684956 +#define STEREO_DMX_EVS_LVLU_FORGETTING_Q31 1073741824 +#define STEREO_DMX_EVS_LVLD_FORGETTING_Q31 1975684956 +#define STEREO_DMX_EVS_ICLD_THRESH_FX 1610612736 +#define STEREO_DMX_EVS_ICLD_THRESH_FX_E 2 +#define STEREO_DMX_EVS_ICCRES_THRESH_Q31 858993459 +#define STEREO_DMX_EVS_DICLD_THRESH_Q30 1606570807 + #define STEREO_DMX_EVS_SWTCH_HYS_THRES 1 #define STEREO_DMX_EVS_LR_EGY_Q27 2013265920 #define STEREO_DMX_EVS_ILDS_EGY_Q17 1310720000 @@ -96,32 +105,52 @@ #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 24576 +#define STEREO_DMX_EVS_POC_RENORM_TH 1048576 // 65536 * 16 +#define STEREO_DMX_EVS_POC_RENORM_SHIFT 10 + +#define STEREO_DMX_EVS_FAD_R 3 +#define STEREO_DMX_EVS_FAD_IR 10923 /* 1/3 in Q15 */ +#define STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 29491 // 0.9f +#define STEREO_DMX_EVS_SGC_GR_S 32919 // 1.00461543f +#define STEREO_DMX_EVS_SGC_GIR_S 32617 // 1/1.00461543f +#define STEREO_DMX_EVS_SGC_GL 32391 // 0.9885f +#define STEREO_DMX_EVS_SGC_GH 33148 // 1.0116f +#define STEREO_DMX_EVS_SGC_LEGY_THRES_16 250000000 +#define STEREO_DMX_EVS_SGC_LEGY_THRES_32 300000000 +#define STEREO_DMX_EVS_SGC_LEGY_THRES_48 500000000 +#define STEREO_DMX_EVS_SGC_LEGY_THRES_E 22 +#define STEREO_DMX_EVS_SGC_GMAX 46340 // 1.4142f +#define STEREO_DMX_EVS_SGC_GMIN 23170 // 0.7071f +#define STEREO_DMX_EVS_IPD_ILD_THRES_Q29 1696512082 // 3.16f (5dB) +#define STEREO_DMX_EVS_IPD_SF_THRES_Q31 107374182 // 0.05f + const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { - 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, - 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, - 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, - 2027355264, 2023718656, 2020082048, 2016445440, 2012808832, 2009172224, 2005535616, 2001899008, 1998262400, 1994625664, - 1990989056, 1987352448, 1983715840, 1980079232, 1976442624, 1972806016, 1969169408, 1965532800, 1961896192, 1958259584, - 1954622976, 1950986368, 1947349760, 1943713152, 1940076544, 1936439936, 1932803328, 1929166592, 1925529984, 1921893376, - 1918256768, 1914620160, 1910983552, 1907346944, 1903710336, 1900073728, 1896437120, 1892800512, 1889163904, 1885527296, - 1881890688, 1878254080, 1874617344, 1870980864, 1867344128, 1863707520, 1860070912, 1856434304, 1852797696, 1849161088, - 1845524480, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872 + 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, + 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, + 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, + 2027355520, 2023718912, 2020082304, 2016445696, 2012809088, 2009172480, 2005535872, 2001899264, 1998262656, 1994625920, + 1990989312, 1987352704, 1983716096, 1980079488, 1976442880, 1972806272, 1969169664, 1965533056, 1961896448, 1958259840, + 1954623232, 1950986624, 1947350016, 1943713408, 1940076800, 1936440192, 1932803584, 1929166848, 1925530240, 1921893632, + 1918257024, 1914620416, 1910983808, 1907347200, 1903710592, 1900073984, 1896437376, 1892800768, 1889164160, 1885527552, + 1881890944, 1878254336, 1874617600, 1870981120, 1867344384, 1863707776, 1860071168, 1856434560, 1852797952, 1849161344, + 1845524736, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128 }; + /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ @@ -153,7 +182,7 @@ static ivas_error estimate_itd_fx( STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o: correlation filter structure */ const Word32 srcL[], /* i : Lch input signal Q16 */ const Word32 srcR[], /* i : Rch input signal Q16 */ - Word32 itd[], /* o : estimated itd Q16 */ + Word16 itd[], /* o : estimated itd Q0 */ const Word16 input_frame /* i : input frame length per channel */ ); static void adapt_gain_fx( @@ -178,28 +207,39 @@ static void calc_energy_fx( const Word32 src2_fx[], /* i : Rch input signal */ Word32 energy_fx[], /* o : calculated energy */ Word16 *energy_fx_e, /* o : calculated energy */ + Word32 *lvl_fx, /* i/o: signal level lvl_fx_e */ + Word16 *lvl_fx_e, /* i/o: signal level */ const Word16 input_frame, /* i : input frame length per channel */ const Word32 ratio_float_fx ); - static void create_M_signal_fx( - const Word32 srcL_fx[], /* i : Lch input signal Q16 */ - const Word32 srcR_fx[], /* i : Rch input signal Q16 */ - Word32 dmx_fx[], /* o : output signal Q31 */ - const Word32 w_curr_fx, /* i : adapting weight Q31 */ - const Word16 input_frame, /* i : input frame length per channel */ - const Word32 wnd_fx[], /* i : window coef Q31 */ - Word32 *w_prev_fx, /* i/o: adapting prev weight Q31*/ - Word32 *dmx_energy_fx, /* i/o: downmix signal energy dmx_energy_fx_e */ - Word16 *dmx_energy_fx_e, /* i/o: downmix signal energy */ - Word32 *src_energy_fx, /* i/o: input signal energy src_energy_fx_e */ - Word16 *src_energy_fx_e /* i/o: input signal energy */ + const Word32 srcL_fx[], /* i : Lch input signal Q16 */ + const Word32 srcR_fx[], /* i : Rch input signal Q16 */ + Word32 dmx_fx[], /* o : output signal Q31 */ + const Word32 w_curr_fx, /* i : adapting weight Q31 */ + const Word16 input_frame, /* i : input frame length per channel */ + const Word32 wnd_fx[], /* i : window coef Q31 */ + Word32 *w_prev_fx, /* i/o: adapting prev weight Q31 */ + Word32 *dmx_energy_fx, /* i/o: downmix signal energy dmx_energy_fx_e */ + Word16 *dmx_energy_fx_e, /* i/o: downmix signal energy */ + Word32 *src_energy_fx, /* i/o: input signal energy src_energy_fx_e */ + Word16 *src_energy_fx_e, /* i/o: input signal energy */ + STEREO_DMX_EVS_PHA_HANDLE hPHA /* i/o: correlation filter structure */ ); static Word32 find_poc_peak_fx( STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */ - Word32 itd_fx[], /* o : estimated itd */ + Word16 itd_fx[], /* o : estimated itd */ const Word16 input_frame, /* i : input frame length per channel */ const Word32 ratio_fixed /* i : adapting ratio */ ); +static Word32 spectral_flatness_fx( + const Word32 *sig_fx, /* i : input signal (mantissa) */ + const Word16 *sig_fx_e, /* i : input signal (exponent) - can be NULL */ + const Word16 sig_length /* i : input signal length */ +); +static void renorm_poc_fx( + Word32 *real, /* i/o real-part*/ + Word32 *imag /* i/o imaginary-part */ +); /*-------------------------------------------------------------------* * estimate_itd_wnd_fft() * @@ -305,7 +345,7 @@ static void calc_poc_fx( Word16 cos_step, cos_max; Word32 eps_cos, eps_sin, EPS; - Word16 isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha; + Word16 isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha, pha_ipd_ild_chan2rephase; Word32 Nr, Ni, Dr, Di, tPr, tPi, Pn, energy; Word16 Nr_e, Ni_e, tPr_e, tPi_e, Pn_e, energy_e; Word16 isd_rate, isd_rate_e; @@ -382,7 +422,7 @@ static void calc_poc_fx( mult_angle = 2; /*****/ move16(); } - if ( EQ_16( input_frame, L_FRAME32k ) ) + ELSE IF( EQ_16( input_frame, L_FRAME32k ) ) { mult_angle = 2; move16(); @@ -410,6 +450,9 @@ static void calc_poc_fx( Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); + renorm_poc_fx( &Lr, &Li ); + renorm_poc_fx( &Rr, &Ri ); + specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); specPOi[i] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); // 2*spec_e @@ -422,6 +465,9 @@ static void calc_poc_fx( Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); + renorm_poc_fx( &Lr, &Li ); + renorm_poc_fx( &Rr, &Ri ); + specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); specPOi[j] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); // 2*spec_e @@ -442,6 +488,10 @@ static void calc_poc_fx( Li = L_add( L_sub( specLi[i], Mpy_32_32_r( specRr[i], eps_sin ) ), Mpy_32_32_r( specRi[i], eps_cos ) ); Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); + + renorm_poc_fx( &Lr, &Li ); + renorm_poc_fx( &Rr, &Ri ); + specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); specPOi[i] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); // 2*spec_e @@ -452,6 +502,10 @@ static void calc_poc_fx( Li = L_sub( L_sub( specLi[j], Mpy_32_32_r( specRr[j], eps_sin ) ), Mpy_32_32_r( specRi[j], eps_cos ) ); Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); + + renorm_poc_fx( &Lr, &Li ); + renorm_poc_fx( &Rr, &Ri ); + specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); specPOi[j] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); // 2*spec_e @@ -464,6 +518,10 @@ static void calc_poc_fx( Li = L_sub( specLi[i], Mpy_32_32_r( specRr[i], EPS ) ); Rr = L_add( specRr[i], Mpy_32_32_r( specLi[i], EPS ) ); Ri = L_sub( specRi[i], Mpy_32_32_r( specLr[i], EPS ) ); + + renorm_poc_fx( &Lr, &Li ); + renorm_poc_fx( &Rr, &Ri ); + specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); move32(); specPOi[i] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); @@ -480,7 +538,7 @@ static void calc_poc_fx( move32(); gamma = L_sub( gamma, igamma ); } - FOR( ; i < n0 >> 4; i++ ) /*search from 4 angles */ + FOR( ; i < ( n0 >> 4 ); i++ ) /*search from 4 angles */ { tmp1 = Mpy_32_16_1( Mpy_32_32_r( wnd[i * step + bias], gamma ), 23170 /*0.7071f*/ ); @@ -491,11 +549,11 @@ static void calc_poc_fx( gamma = L_sub( gamma, igamma ); } - FOR( ; i < n0 >> 3; i++ ) /* binary search from 8 angles */ + FOR( ; i < ( n0 >> 3 ); i++ ) /* binary search from 8 angles */ { tmp1 = Mpy_32_32_r( wnd[i * step + bias], gamma ); // Q31 - IF( W_mult0_32_32( L_sub( specPOr[i], specPOi[i] ), L_add( specPOr[i], specPOi[i] ) ) > 0 ) + IF( GT_32( L_abs( specPOr[i] ), L_abs( specPOi[i] ) ) ) { specPOr[i] = Mpy_32_16_1( tmp1, imult1616( sign_fx( specPOr[i] ), /*0.923880f*/ s[120 * mult_angle] ) ); /* cos(PI/8) Q31*/ move32(); @@ -514,9 +572,9 @@ static void calc_poc_fx( FOR( ; i < end; i++ ) /* binary search from 16 angles */ { tmp1 = Mpy_32_32_r( wnd[i * step + bias], gamma ); // Q31 - IF( W_mult0_32_32( L_sub( specPOr[i], specPOi[i] ), L_add( specPOr[i], specPOi[i] ) ) > 0 ) + IF( GT_32( L_abs( specPOr[i] ), L_abs( specPOi[i] ) ) ) { - IF( W_mult0_32_32( L_sub( Mpy_32_16_1( specPOr[i], 13573 /*0.414213f*/ ), specPOi[i] ), L_add( Mpy_32_16_1( specPOr[i], 13573 /*0.414213f*/ ), specPOi[i] ) ) > 0 ) /*tan(PI/8)*/ + IF( GT_32( L_abs( Mpy_32_16_1( specPOr[i], 13573 /*0.414213f*/ ) ), L_abs( specPOi[i] ) ) ) /*tan(PI/8)*/ { specPOr[i] = Mpy_32_16_1( tmp1 /*0.980785f */, imult1616( sign_fx( specPOr[i] ), s[140 * mult_angle] ) ); /* cos(PI/16) Q31*/ move32(); @@ -533,7 +591,7 @@ static void calc_poc_fx( } ELSE { - IF( W_mult0_32_32( L_sub( specPOr[i], Mpy_32_16_1( specPOi[i], 13573 /*0.414213f*/ ) ), L_add( specPOr[i], Mpy_32_16_1( specPOi[i], 13573 /*0.414213f*/ ) ) ) > 0 ) /*tan(PI/8)*/ + IF( GT_32( L_abs( specPOr[i] ), L_abs( Mpy_32_16_1( specPOi[i], 13573 /*0.414213f*/ ) ) ) ) /*tan(PI/8)*/ { specPOr[i] = Mpy_32_16_1( tmp1 /** 0.555570f*/, imult1616( sign_fx( specPOr[i] ), s[60 * mult_angle] ) ); /*cos(PI*5/16) Q31*/ move32(); @@ -565,14 +623,6 @@ static void calc_poc_fx( specPOr[n0] = imult3216( Mpy_32_32_r( wnd[i * step + bias], gamma ), sign_fx( Mpy_32_32_r( specLr[n0], specRr[n0] ) ) ); // Q31 move32(); - - hPHA->init_frmCntr = sub( hPHA->init_frmCntr, 1 ); - move16(); - if ( hPHA->init_frmCntr < 0 ) - { - hPHA->init_frmCntr = 0; - move16(); - } freq_8k = L_FRAME16k / 2; move16(); // freq_ipd_max = (int16_t) ( freq_8k * 5000.0f / ( 8000.0f * STEREO_DMX_EVS_SUBBAND_SIZE ) ); @@ -604,12 +654,13 @@ static void calc_poc_fx( Ni = L_sub( specLi[i], specRi[i] ); // spec_e Dr = L_add( specLr[i], specRr[i] ); // spec_e Di = L_add( specLi[i], specRi[i] ); // spec_e - // if ( ( Nr * Nr + Ni * Ni ) > STEREO_DMX_EVS_ISD_THRES_H * ( Dr * Dr + Di * Di ) ) - IF( GT_32( Mpy_32_32_r( L_add( Mpy_32_32_r( Nr, Nr ), Mpy_32_32_r( Ni, Ni ) ), 1270700383 /*1/STEREO_DMX_EVS_ISD_THRES_H in Q31*/ ), L_add( Mpy_32_32_r( Dr, Dr ), Mpy_32_32_r( Di, Di ) ) ) ) + // if ( ( Nr * Nr + Ni * Ni ) > STEREO_DMX_EVS_ISD_THRES_H * ( Dr * Dr + Di * Di ) ) + IF( GT_32( Mpy_32_32_r( L_add( Mpy_32_32_r( Nr, Nr ), Mpy_32_32_r( Ni, Ni ) ), STEREO_DMX_EVS_ISD_INVTHRES_H ), L_add( Mpy_32_32_r( Dr, Dr ), Mpy_32_32_r( Di, Di ) ) ) ) { isd_cnt_h = add( isd_cnt_h, 1 ); } - IF( LT_32( L_add( Mpy_32_32_r( Nr, Nr ), Mpy_32_32_r( Ni, Ni ) ), Mpy_32_32_r( STEREO_DMX_EVS_ISD_THRES_L_Q31, L_add( Mpy_32_32_r( Dr, Dr ), Mpy_32_32_r( Di, Di ) ) ) ) ) + W_tmp = W_add( W_mult0_32_32( Mpy_32_32_r( Dr, STEREO_DMX_EVS_ISD_THRES_L_Q31 ), Dr ), W_mult0_32_32( Mpy_32_32_r( Di, STEREO_DMX_EVS_ISD_THRES_L_Q31 ), Di ) ); // Q62 + IF( LT_64( W_add( W_mult0_32_32( Nr, Nr ), W_mult0_32_32( Ni, Ni ) ), W_tmp ) ) // Q62 { isd_cnt_l = add( isd_cnt_l, 1 ); } @@ -618,10 +669,10 @@ static void calc_poc_fx( isd_rate = BASOP_Util_Divide1616_Scale( isd_cnt_h, freq_8k, &isd_rate_e ); // Saturation to handle values close to 1.0f isd_rate = shl_sat( isd_rate, isd_rate_e ); // Q15 - hPHA->isd_rate_s_fx = add( mult_r( STEREO_DMX_EVS_ISD_FORGETTING_Q15, hPHA->isd_rate_s_fx ), mult_r( MAX_16 - STEREO_DMX_EVS_ISD_FORGETTING_Q15, isd_rate ) ); - move16(); + hPHA->isd_rate_s_fx = L_add( Mpy_32_32_r( STEREO_DMX_EVS_ISD_FORGETTING_Q31, hPHA->isd_rate_s_fx ), L_mult( STEREO_DMX_EVS_ISD_1MFORGETTING_Q15, isd_rate ) ); + move32(); - IF( GT_16( hPHA->isd_rate_s_fx, STEREO_DMX_EVS_ISD_DIST_HYST_H_Q15 ) ) + IF( GT_32( hPHA->isd_rate_s_fx, STEREO_DMX_EVS_ISD_DIST_HYST_H_Q31 ) ) { IF( NE_32( hPHA->curr_pha, STEREO_DMX_EVS_PHA_IPD ) ) { @@ -635,8 +686,7 @@ static void calc_poc_fx( hPHA->pha_hys_cnt = 0; move16(); } - - if ( GE_32( hPHA->pha_hys_cnt, STEREO_DMX_EVS_SWTCH_HYS_THRES ) ) + IF( GE_32( hPHA->pha_hys_cnt, STEREO_DMX_EVS_SWTCH_HYS_THRES ) ) { hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD; move32(); @@ -646,7 +696,7 @@ static void calc_poc_fx( hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD; move32(); } - ELSE IF( LT_16( hPHA->isd_rate_s_fx, STEREO_DMX_EVS_ISD_DIST_HYST_L_Q15 ) ) + ELSE IF( LT_32( hPHA->isd_rate_s_fx, STEREO_DMX_EVS_ISD_DIST_HYST_L_Q31 ) ) { IF( NE_32( hPHA->curr_pha, STEREO_DMX_EVS_PHA_IPD2 ) ) { @@ -660,8 +710,7 @@ static void calc_poc_fx( hPHA->pha_hys_cnt = 0; move16(); } - - if ( GE_16( hPHA->pha_hys_cnt, STEREO_DMX_EVS_SWTCH_HYS_THRES ) ) + IF( GE_16( hPHA->pha_hys_cnt, STEREO_DMX_EVS_SWTCH_HYS_THRES ) ) { hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD2; move32(); @@ -689,6 +738,11 @@ static void calc_poc_fx( move32(); eneR_e = 0; move16(); + step = sub( n0 >> 3, 1 ); + tmp1 = 0; + tmp2 = 0; + n1 = 0; + n2 = 0; FOR( ( n = 1, i = 1 ); n < nsbd; n++ ) { @@ -711,10 +765,28 @@ static void calc_poc_fx( FOR( j = 0; j < STEREO_DMX_EVS_SUBBAND_SIZE; ( j++, i++ ) ) { + /* Energy */ - tEl[n] = BASOP_Util_Add_Mant32Exp( tEl[n], tEl_e[n], L_add( Mpy_32_32_r( specLr[i], specLr[i] ), Mpy_32_32_r( specLi[i], specLi[i] ) ), shl( spec_e, 1 ), &tEl_e[n] ); + + + // Left + W_tmp = W_add( W_mult0_32_32( specLr[i], specLr[i] ), W_mult0_32_32( specLi[i], specLi[i] ) ); // Q(62-(2*specL_e)) -> Q(63 - ((2*specL_e) +1)) + L_tmp_e = W_norm( W_tmp ); + IF( L_tmp_e != 0 ) + { + W_tmp = W_shl( W_tmp, L_tmp_e ); // Q(63 - ((2*spec_e) - (L_tmp_e - 1)) + } + tEl[n] = BASOP_Util_Add_Mant32Exp( tEl[n], tEl_e[n], W_round64_L( W_tmp ), sub( shl( spec_e, 1 ), sub( L_tmp_e, 1 ) ), &tEl_e[n] ); move32(); - tEr[n] = BASOP_Util_Add_Mant32Exp( tEr[n], tEr_e[n], L_add( Mpy_32_32_r( specRr[i], specRr[i] ), Mpy_32_32_r( specRi[i], specRi[i] ) ), shl( spec_e, 1 ), &tEr_e[n] ); + + // Right + W_tmp = W_add( W_mult0_32_32( specRr[i], specRr[i] ), W_mult0_32_32( specRi[i], specRi[i] ) ); // Q(62-(2*specR_e)) -> Q(63 - ((2*specR_e) +1)) + L_tmp_e = W_norm( W_tmp ); + IF( L_tmp_e != 0 ) + { + W_tmp = W_shl( W_tmp, L_tmp_e ); // Q(63 - ((2*spec_e) - (L_tmp_e - 1)) + } + tEr[n] = BASOP_Util_Add_Mant32Exp( tEr[n], tEr_e[n], W_round64_L( W_tmp ), sub( shl( spec_e, 1 ), sub( L_tmp_e, 1 ) ), &tEr_e[n] ); move32(); /* IPD */ @@ -746,11 +818,35 @@ static void calc_poc_fx( tIPDr = L_sub( Mpy_32_32_r( specRr[i], IPDr ), Mpy_32_32_r( specRi[i], IPDi ) ); // spec_e tIPDi = L_add( Mpy_32_32_r( specRr[i], IPDi ), Mpy_32_32_r( specRi[i], IPDr ) ); // spec_e - Nr = BASOP_Util_Add_Mant32Exp( Nr, Nr_e, L_add( Mpy_32_32_r( specLr[i], tIPDr ), Mpy_32_32_r( specLi[i], tIPDi ) ), shl( spec_e, 1 ), &Nr_e ); - Ni = BASOP_Util_Add_Mant32Exp( Ni, Ni_e, L_sub( Mpy_32_32_r( specLi[i], tIPDr ), Mpy_32_32_r( specLr[i], tIPDi ) ), shl( spec_e, 1 ), &Ni_e ); - eneL = BASOP_Util_Add_Mant32Exp( eneL, eneL_e, L_add( Mpy_32_32_r( specLr[i], specLr[i] ), Mpy_32_32_r( specLi[i], specLi[i] ) ), shl( spec_e, 1 ), &eneL_e ); - eneR = BASOP_Util_Add_Mant32Exp( eneR, eneR_e, L_add( Mpy_32_32_r( specRr[i], specRr[i] ), Mpy_32_32_r( specRi[i], specRi[i] ) ), shl( spec_e, 1 ), &eneR_e ); + Nr = BASOP_Util_Add_Mant32Exp( Nr, Nr_e, L_add( Mpy_32_32_r( specLr[i], tIPDr ), Mpy_32_32_r( specLi[i], tIPDi ) ), 0, &Nr_e ); + Ni = BASOP_Util_Add_Mant32Exp( Ni, Ni_e, L_sub( Mpy_32_32_r( specLi[i], tIPDr ), Mpy_32_32_r( specLr[i], tIPDi ) ), 0, &Ni_e ); + + // eneL = BASOP_Util_Add_Mant32Exp( eneL, eneL_e, L_add( Mpy_32_32_r( specLr[i], specLr[i] ), Mpy_32_32_r( specLi[i], specLi[i] ) ), 0, &eneL_e ); + W_tmp = W_add( W_mult0_32_32( specLr[i], specLr[i] ), W_mult0_32_32( specLi[i], specLi[i] ) ); + L_tmp_e = W_norm( W_tmp ); + IF( L_tmp_e != 0 ) + { + W_tmp = W_shl( W_tmp, L_tmp_e ); + } + eneL = BASOP_Util_Add_Mant32Exp( eneL, eneL_e, W_round64_L( W_tmp ), sub( 1, L_tmp_e ), &eneL_e ); + + // eneR = BASOP_Util_Add_Mant32Exp( eneR, eneR_e, L_add( Mpy_32_32_r( specRr[i], specRr[i] ), Mpy_32_32_r( specRi[i], specRi[i] ) ), 0, &eneR_e ); + W_tmp = W_add( W_mult0_32_32( specRr[i], specRr[i] ), W_mult0_32_32( specRi[i], specRi[i] ) ); + L_tmp_e = W_norm( W_tmp ); + IF( L_tmp_e != 0 ) + { + W_tmp = W_shl( W_tmp, L_tmp_e ); + } + eneR = BASOP_Util_Add_Mant32Exp( eneR, eneR_e, W_round64_L( W_tmp ), sub( 1, L_tmp_e ), &eneR_e ); + + IF( EQ_16( i, step ) ) + { + tmp1 = eneL; + n1 = eneL_e; + tmp2 = eneR; + n2 = eneR_e; + } } // Pn = (float) inv_sqrt( ( tPr * tPr + tPi * tPi ) + EPSILON ); @@ -762,40 +858,40 @@ static void calc_poc_fx( tPr = L_shl_sat( Mpy_32_32_r( tPr, Pn ), add( tPr_e, Pn_e ) ); // Q31 tPi = L_shl_sat( Mpy_32_32_r( tPi, Pn ), add( tPi_e, Pn_e ) ); // Q31 - IF( hPHA->init_frmCntr == 0 ) - { - Pr[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pr[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPr ) ); - move32(); - Pi[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pi[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPi ) ); - move32(); - // Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); - L_tmp = L_add( L_shr( Mpy_32_32_r( Pr[n], Pr[n] ), 1 ), L_shr( Mpy_32_32_r( Pi[n], Pi[n] ), 1 ) ); - L_tmp_e = 1; - move16(); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp_e ); - Pn_e = L_tmp_e; - move16(); - Pn = ISqrt32( L_tmp, &Pn_e ); - Pr[n] = L_shl_sat( Mpy_32_32_r( Pr[n], Pn ), Pn_e ); // Q31 - move32(); - Pi[n] = L_shl_sat( Mpy_32_32_r( Pi[n], Pn ), Pn_e ); // Q31 - move32(); - } - ELSE - { - Pr[n] = tPr; - move32(); - Pi[n] = tPi; - move32(); - } + Pr[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pr[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPr ) ); + move32(); + Pi[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pi[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPi ) ); + move32(); + // Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); + Pn = L_add( L_shr( Mpy_32_32_r( Pr[n], Pr[n] ), 1 ), L_shr( Mpy_32_32_r( Pi[n], Pi[n] ), 1 ) ); + Pn = BASOP_Util_Add_Mant32Exp( Pn, 1, EPSILON_FX_M, EPSILON_FX_E, &Pn_e ); + Pn = Isqrt_lc( Pn, &Pn_e ); + + Pr[n] = L_shl_sat( Mpy_32_32_r( Pr[n], Pn ), Pn_e ); // Q31 + move32(); + Pi[n] = L_shl_sat( Mpy_32_32_r( Pi[n], Pn ), Pn_e ); // Q31 + move32(); // Pr[n] = ( Pr[n] > 1.0f ) ? 1.0f : Pr[n]; // Pr[n] = ( Pr[n] < -1.0f ) ? -1.0f : Pr[n]; } + + /* Computes Spectral flatness on one channel */ + IF( LT_32( spectral_flatness_fx( &tEl[1], &tEl_e[1], sub( nsbd, 1 ) ), STEREO_DMX_EVS_IPD_SF_THRES_Q31 ) ) + { + hPHA->pha_ipd_chanswitch_allowed = 0; + move16(); + } + ELSE + { + hPHA->pha_ipd_chanswitch_allowed = 1; + move16(); + } + // ICCr = (float) sqrt( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) ); L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32_r( Nr, Nr ), shl( Nr_e, 1 ), Mpy_32_32_r( Ni, Ni ), shl( Ni_e, 1 ), &L_tmp1_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32_r( eneL, eneR ), add( eneL_e, eneR_e ), EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); - ICCr = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &L_tmp_e ); + ICCr = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) ); ICCr = Sqrt32( ICCr, &L_tmp_e ); // Saturation to handle values close to 1.0f @@ -805,11 +901,109 @@ static void calc_poc_fx( hPHA->iccr_s_fx = L_add( Mpy_32_32_r( STEREO_DMX_EVS_ICCR_FORGETTING_Q31, hPHA->iccr_s_fx ), Mpy_32_32_r( MAX_32 - STEREO_DMX_EVS_ICCR_FORGETTING_Q31, ICCr ) ); // Q31 move32(); + step = add( step, 1 ); + + eneL = BASOP_Util_Add_Mant32Exp( eneL, eneL_e, -tmp1, n1, &eneL_e ); + eneR = BASOP_Util_Add_Mant32Exp( eneR, eneR_e, -tmp2, n2, &eneR_e ); + + mult_angle = extract_l( imult3216( hPHA->phitd_fx, step ) ); // Remainder in Q15 + tmp1 = L_shr( imult3216( EVS_2PI_FX, mult_angle ), Q15 ); // Q13 + IF( GT_32( tmp1, EVS_PI_FX ) ) + { + tmp1 = L_sub( tmp1, EVS_2PI_FX ); + } + ELSE IF( LT_32( tmp1, -EVS_PI_FX ) ) + { + tmp1 = L_add( tmp1, EVS_2PI_FX ); + } + mult_angle = extract_l( tmp1 ); + IPDr = L_deposit_h( getCosWord16( mult_angle ) ); + IPDr = L_shl_sat( IPDr, 1 ); + IPDi = L_deposit_h( getSinWord16( mult_angle ) ); + + mult_angle = extract_l( hPHA->phitd_fx ); // Remainder in Q15 + tmp1 = L_shr( imult3216( EVS_2PI_FX, mult_angle ), Q15 ); // Q13 + IF( GT_32( tmp1, EVS_PI_FX ) ) + { + tmp1 = L_sub( tmp1, EVS_2PI_FX ); + } + ELSE IF( LT_32( tmp1, -EVS_PI_FX ) ) + { + tmp1 = L_add( tmp1, EVS_2PI_FX ); + } + mult_angle = extract_l( tmp1 ); + L_tmp1 = L_deposit_h( getCosWord16( mult_angle ) ); + L_tmp1 = L_shl_sat( L_tmp1, 1 ); + L_tmp2 = L_deposit_h( getSinWord16( mult_angle ) ); + + Nr = 0; + move32(); + Nr_e = 0; + move16(); + Ni = 0; + move32(); + Ni_e = 0; + + n1 = sub( n0, 1 ); + FOR( i = step; i < n1; i++ ) + { + tIPDr = L_add( Mpy_32_32_r( specRr[i], IPDr ), Mpy_32_32_r( specRi[i], IPDi ) ); + tIPDi = L_sub( Mpy_32_32_r( specRr[i], IPDi ), Mpy_32_32_r( specRi[i], IPDr ) ); + + Nr = BASOP_Util_Add_Mant32Exp( Nr, Nr_e, L_sub( Mpy_32_32_r( specLr[i], tIPDr ), Mpy_32_32_r( specLi[i], tIPDi ) ), 0, &Nr_e ); + Ni = BASOP_Util_Add_Mant32Exp( Ni, Ni_e, L_add( Mpy_32_32_r( specLi[i], tIPDr ), Mpy_32_32_r( specLr[i], tIPDi ) ), 0, &Ni_e ); + + tIPDr = IPDr; + move32(); + IPDr = L_sub_sat( Mpy_32_32_r( tIPDr, L_tmp1 ), Mpy_32_32_r( IPDi, L_tmp2 ) ); + IPDi = L_add_sat( Mpy_32_32_r( tIPDr, L_tmp2 ), Mpy_32_32_r( IPDi, L_tmp1 ) ); + } + + if ( EQ_32( ICCr, 0 ) ) + { + ICCr = ONE_IN_Q31; + move32(); + } + + L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32_r( Nr, Nr ), shl( Nr_e, 1 ), Mpy_32_32_r( Ni, Ni ), shl( Ni_e, 1 ), &L_tmp1_e ); + L_tmp2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32_r( eneL, eneR ), add( eneL_e, eneR_e ), EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); + + L_tmp2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32_r( eneL, eneR ), add( eneL_e, eneR_e ), EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e ); + L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) ); + L_tmp = Sqrt32( L_tmp, &L_tmp_e ); + L_tmp = L_shl_sat( L_tmp, L_tmp_e ); // Q31 + + hPHA->iccres_s_fx = L_add( Mpy_32_32_r( STEREO_DMX_EVS_ICCRES_FORGETTING_Q31, hPHA->iccres_s_fx ), Mpy_32_32_r( L_sub( MAX_32, STEREO_DMX_EVS_ICCRES_FORGETTING_Q31 ), L_add_sat( ICCr >> 1, L_tmp >> 1 ) ) ); // Q31 + IF( EQ_32( hPHA->curr_pha, STEREO_DMX_EVS_PHA_IPD ) ) { - hPHA->p_curr_taps_fx[0] = NULL; - hPHA->p_curr_taps_fx[1] = hPHA->curr_taps_fx[1]; + hPHA->force_poc = FALSE; + hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD; + move16(); + move32(); + } + ELSE + { + test(); + test(); + test(); + IF( LT_32( hPHA->iccr_s_fx, STEREO_DMX_EVS_ICCR_HYST_L_Q31 ) || ( LT_32( hPHA->iccr_s_fx, STEREO_DMX_EVS_ICCR_HYST_H_Q31 ) && EQ_32( hPHA->proc_pha, STEREO_DMX_EVS_PHA_IPD2 ) && EQ_16( hPHA->force_poc, FALSE ) ) ) + { + hPHA->force_poc = FALSE; + hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD2; + move16(); + move32(); + } + ELSE + { + hPHA->force_poc = TRUE; + move16(); + } + } + IF( hPHA->proc_pha == STEREO_DMX_EVS_PHA_IPD ) + { rfft_pha_buf[0] = ONE_IN_Q22; move32(); rfft_pha_buf[1] = ONE_IN_Q22; @@ -856,122 +1050,238 @@ static void calc_poc_fx( } rfft_fx( rfft_pha_buf, hPHA->rfft_ipd_coef_fx, input_frame_pha, +1 ); - // mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len ); - Copy_Scale_sig32( rfft_pha_buf, hPHA->p_curr_taps_fx[1], hPHA->pha_len, 9 ); // Q22->Q31 - } - ELSE - { - test(); - test(); - IF( LT_32( hPHA->iccr_s_fx, STEREO_DMX_EVS_ICCR_HYST_L_Q31 ) || ( LT_32( hPHA->iccr_s_fx, STEREO_DMX_EVS_ICCR_HYST_H_Q31 ) && ( hPHA->p_curr_taps_fx[0] != NULL ) ) ) + + /* Choose best channel to phase align */ + /* Channel selection based on ILD */ + IF( BASOP_Util_Cmp_Mant32Exp( hPHA->trns_aux_energy_fx[0], hPHA->trns_aux_energy_fx_e[0], Mpy_32_32_r( STEREO_DMX_EVS_IPD_ILD_THRES_Q29, hPHA->trns_aux_energy_fx[1] ), add( 2, hPHA->trns_aux_energy_fx_e[1] ) ) > 0 ) + { + pha_ipd_ild_chan2rephase = 1; + } + ELSE IF( BASOP_Util_Cmp_Mant32Exp( hPHA->trns_aux_energy_fx[1], hPHA->trns_aux_energy_fx_e[1], Mpy_32_32_r( STEREO_DMX_EVS_IPD_ILD_THRES_Q29, hPHA->trns_aux_energy_fx[0] ), add( 2, hPHA->trns_aux_energy_fx_e[0] ) ) > 0 ) + { + pha_ipd_ild_chan2rephase = 0; + } + ELSE { - /* IPDn */ + pha_ipd_ild_chan2rephase = -1; + } + move16(); - set32_fx( &( Pr[freq_ipd_max] ), MAX_32, sub( nsbd, freq_ipd_max ) ); - set32_fx( &( Pi[freq_ipd_max] ), 0, sub( nsbd, freq_ipd_max ) ); + /* Channel selection based on spikyness of R2L/L2R impulse responses */ + tmp1 = spectral_flatness_fx( rfft_pha_buf, NULL, hPHA->pha_len ); + rfft_pha_buf[sub( input_frame_pha, hPHA->pha_len )] = rfft_pha_buf[0]; + move32(); + tmp2 = spectral_flatness_fx( &rfft_pha_buf[sub( input_frame_pha, hPHA->pha_len )], NULL, hPHA->pha_len ); - FOR( n = 0; n < CPE_CHANNELS; n++ ) + // /* Combined ILD/SF channel selection with tempo */ + IF( ( GT_32( tmp1, tmp2 ) && ( EQ_16( pha_ipd_ild_chan2rephase, -1 ) ) ) || EQ_16( pha_ipd_ild_chan2rephase, 0 ) ) /* L => R */ + { + IF( EQ_16( hPHA->pha_ipd_previouschan2rephase, 0 ) ) { - hPHA->p_curr_taps_fx[n] = hPHA->curr_taps_fx[n]; + hPHA->pha_ipd_chan_cnt = add( hPHA->pha_ipd_chan_cnt, 1 ); + IF( GE_32( hPHA->pha_ipd_chan_cnt, hPHA->pha_ipd_chan_thresh ) ) + { + /* Avoid channel switch in case of too harmonic signals */ + IF( EQ_16( hPHA->pha_ipd_chanswitch_allowed, 1 ) ) + { + IF( NE_16( hPHA->pha_ipd_chan2rephase, 0 ) ) + { + hPHA->pha_ipd_chanswitch = 1; + move16(); + } + ELSE + { + hPHA->pha_ipd_chanswitch = 0; + move16(); + } + hPHA->pha_ipd_chan2rephase = 0; + move16(); + } + } } - - rfft_pha_buf[0] = ONE_IN_Q22; - move32(); - rfft_pha_buf[1] = ONE_IN_Q22; - move32(); - - ild_cnt = 0; - move16(); - isd_rate = BASOP_Util_Divide1616_Scale( isd_cnt_l, freq_8k, &isd_rate_e ); - // Saturation to handle values close to 1.0f - isd_rate = shl_sat( isd_rate, isd_rate_e ); // Q15 - FOR( i = 1; i < nsbd; i++ ) + ELSE { - // rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + Pr[i] ) / 2.0f ); - L_tmp = L_add( ONE_IN_Q30, L_shr( Pr[i], 1 ) ); - L_tmp_e = 0; + hPHA->pha_ipd_previouschan2rephase = 0; + hPHA->pha_ipd_chan_cnt = 1; + hPHA->pha_ipd_chanswitch = 0; move16(); - L_tmp = Sqrt32( L_tmp, &L_tmp_e ); - rfft_pha_buf[i * 2] = L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ); // Q22 - move32(); - // rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); - L_tmp = L_sub_sat( ONE_IN_Q30, L_shr( Pr[i], 1 ) ); // saturating as Pr does not exceed 1.0f - L_tmp_e = 0; move16(); - L_tmp = Sqrt32( L_tmp, &L_tmp_e ); - rfft_pha_buf[i * 2 + 1] = imult3216( L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ), sign_fx( Pi[i] ) ); // Q22 - move32(); - IF( GT_16( isd_rate, STEREO_DMX_EVS_ISD_DIST_THRES_IPD_Q15 ) ) - { - // rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); - L_tmp = L_sub( ONE_IN_Q21, L_shr( rfft_pha_buf[i * 2], 1 ) ); - L_tmp_e = 9; - move16(); - L_tmp = Sqrt32( L_tmp, &L_tmp_e ); - rfft_pha_buf[i * 2 + 1] = imult3216( L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ), sign_fx( rfft_pha_buf[i * 2 + 1] ) ); // Q22 - move32(); - // rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); - L_tmp = L_add( ONE_IN_Q21, L_shr( rfft_pha_buf[i * 2], 1 ) ); // Q22 - L_tmp_e = 9; - move16(); - L_tmp = Sqrt32( L_tmp, &L_tmp_e ); - rfft_pha_buf[i * 2] = L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ); // Q22 - move32(); - } + move16(); + } + } + ELSE + { + IF( EQ_16( hPHA->pha_ipd_previouschan2rephase, 1 ) ) + { + hPHA->pha_ipd_chan_cnt = add( hPHA->pha_ipd_chan_cnt, 1 ); - // if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) - test(); - IF( BASOP_Util_Cmp_Mant32Exp( tEr[i], tEr_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEl[i] ), add( 4, tEl_e[i] ) ) > 0 || BASOP_Util_Cmp_Mant32Exp( tEl[i], tEl_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEr[i] ), add( 4, tEr_e[i] ) ) > 0 ) - { - ild_cnt = add( ild_cnt, 1 ); - tEr[i] = MAX_32; - move32(); - tEr_e[i] = 0; - move16(); - } - ELSE + IF( GE_16( hPHA->pha_ipd_chan_cnt, hPHA->pha_ipd_chan_thresh ) ) { - tEr[i] = MIN_32; - move32(); - tEr_e[i] = 0; + /* Avoid channel switch in case of too harmonic signals */ + IF( EQ_16( hPHA->pha_ipd_chanswitch_allowed, 1 ) ) + { + IF( NE_16( hPHA->pha_ipd_chan2rephase, 1 ) ) + { + hPHA->pha_ipd_chanswitch = 1; + move16(); + } + ELSE + { + hPHA->pha_ipd_chanswitch = 0; + move16(); + } + hPHA->pha_ipd_chan2rephase = 1; + move16(); + } + hPHA->pha_ipd_chan_cnt = hPHA->pha_ipd_chan_thresh; move16(); } } - IF( GT_16( ild_cnt, mult_r( nsbd, STEREO_DMX_EVS_ILD_PRC_Q15 ) ) ) + ELSE + { + hPHA->pha_ipd_previouschan2rephase = 1; + hPHA->pha_ipd_chan_cnt = 1; + hPHA->pha_ipd_chanswitch = 0; + move16(); + move16(); + move16(); + } + } + + IF( EQ_16( hPHA->pha_ipd_chanswitch, 0 ) ) + { + IF( EQ_16( hPHA->pha_ipd_chan2rephase, 0 ) ) { - FOR( i = 1; i < nsbd; i++ ) + hPHA->p_curr_taps_fx[1] = NULL; + hPHA->p_curr_taps_fx[0] = hPHA->curr_taps_fx[0]; + p_curr_taps = hPHA->p_curr_taps_fx[0]; + + L_tmp = L_shl( 1, 8 ); + p_curr_taps[0] = W_extract_l( W_mult_32_32( L_tmp, rfft_pha_buf[0] ) ); // Q22 -> Q31 + j = sub( input_frame_pha, 1 ); + FOR( i = 1; i < hPHA->pha_len; i++ ) { - IF( tEr[i] > 0 ) - { - rfft_pha_buf[i * 2] = ONE_IN_Q22; - move32(); - rfft_pha_buf[i * 2 + 1] = 0; - move32(); - } + p_curr_taps[i] = W_extract_l( W_mult_32_32( L_tmp, rfft_pha_buf[j] ) ); // Q22 -> Q31 + j = sub( j, 1 ); } } + ELSE + { + hPHA->p_curr_taps_fx[0] = NULL; + hPHA->p_curr_taps_fx[1] = hPHA->curr_taps_fx[1]; + Copy_Scale_sig32( rfft_pha_buf, hPHA->p_curr_taps_fx[1], hPHA->pha_len, 9 ); // Q22->Q31 + } + } + } - rfft_fx( rfft_pha_buf, hPHA->rfft_ipd_coef_fx, input_frame_pha, +1 ); - // mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len ); - Copy_Scale_sig32( rfft_pha_buf, hPHA->p_curr_taps_fx[1], hPHA->pha_len, 9 ); // Q22->Q31 + IF( EQ_16( hPHA->pha_ipd_chanswitch, 1 ) ) + { + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + hPHA->p_curr_taps_fx[n] = NULL; + } + } + ELSE IF( EQ_32( hPHA->proc_pha, STEREO_DMX_EVS_PHA_IPD2 ) ) + { + /* IPDn */ + + set32_fx( &( Pr[freq_ipd_max] ), MAX_32, sub( nsbd, freq_ipd_max ) ); + set32_fx( &( Pi[freq_ipd_max] ), 0, sub( nsbd, freq_ipd_max ) ); + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + hPHA->p_curr_taps_fx[n] = hPHA->curr_taps_fx[n]; + } - /* PHA L2R */ - p_curr_taps = hPHA->p_curr_taps_fx[0]; - p_curr_taps[0] = L_shl( rfft_pha_buf[0], 9 ); // Q22->Q31 + rfft_pha_buf[0] = ONE_IN_Q22; + move32(); + rfft_pha_buf[1] = ONE_IN_Q22; + move32(); + + ild_cnt = 0; + move16(); + isd_rate = BASOP_Util_Divide1616_Scale( isd_cnt_l, freq_8k, &isd_rate_e ); + // Saturation to handle values close to 1.0f + isd_rate = shl_sat( isd_rate, isd_rate_e ); // Q15 + FOR( i = 1; i < nsbd; i++ ) + { + // rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + Pr[i] ) / 2.0f ); + L_tmp = L_add( ONE_IN_Q30, L_shr( Pr[i], 1 ) ); + L_tmp_e = 0; + move16(); + L_tmp = Sqrt32( L_tmp, &L_tmp_e ); + rfft_pha_buf[i * 2] = L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ); // Q22 move32(); - FOR( i = 1; i < hPHA->pha_len; i++ ) + // rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); + L_tmp = L_sub_sat( ONE_IN_Q30, L_shr( Pr[i], 1 ) ); // saturating as Pr does not exceed 1.0f + L_tmp_e = 0; + move16(); + L_tmp = Sqrt32( L_tmp, &L_tmp_e ); + rfft_pha_buf[i * 2 + 1] = imult3216( L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ), sign_fx( Pi[i] ) ); // Q22 + move32(); + IF( GT_16( isd_rate, STEREO_DMX_EVS_ISD_DIST_THRES_IPD_Q15 ) ) + { + // rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); + L_tmp = L_sub( ONE_IN_Q21, L_shr( rfft_pha_buf[i * 2], 1 ) ); + L_tmp_e = 9; + move16(); + L_tmp = Sqrt32( L_tmp, &L_tmp_e ); + rfft_pha_buf[i * 2 + 1] = imult3216( L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ), sign_fx( rfft_pha_buf[i * 2 + 1] ) ); // Q22 + move32(); + // rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); + L_tmp = L_add( ONE_IN_Q21, L_shr( rfft_pha_buf[i * 2], 1 ) ); // Q22 + L_tmp_e = 9; + move16(); + L_tmp = Sqrt32( L_tmp, &L_tmp_e ); + rfft_pha_buf[i * 2] = L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ); // Q22 + move32(); + } + + // if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) + test(); + IF( BASOP_Util_Cmp_Mant32Exp( tEr[i], tEr_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEl[i] ), add( 4, tEl_e[i] ) ) > 0 || BASOP_Util_Cmp_Mant32Exp( tEl[i], tEl_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEr[i] ), add( 4, tEr_e[i] ) ) > 0 ) { - p_curr_taps[i] = L_shl( rfft_pha_buf[input_frame_pha - i], 9 ); // Q22->Q31 + ild_cnt = add( ild_cnt, 1 ); + tEr[i] = MAX_32; move32(); + tEr_e[i] = 0; + move16(); + } + ELSE + { + tEr[i] = MIN_32; + move32(); + tEr_e[i] = 0; + move16(); } } - ELSE + IF( GT_16( ild_cnt, mult_r( nsbd, STEREO_DMX_EVS_ILD_PRC_Q15 ) ) ) { - FOR( n = 0; n < CPE_CHANNELS; n++ ) + FOR( i = 1; i < nsbd; i++ ) { - hPHA->p_curr_taps_fx[n] = NULL; + IF( tEr[i] > 0 ) + { + rfft_pha_buf[i * 2] = ONE_IN_Q22; + move32(); + rfft_pha_buf[i * 2 + 1] = 0; + move32(); + } } } + + rfft_fx( rfft_pha_buf, hPHA->rfft_ipd_coef_fx, input_frame_pha, +1 ); + // mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len ); + Copy_Scale_sig32( rfft_pha_buf, hPHA->p_curr_taps_fx[1], hPHA->pha_len, 9 ); // Q22->Q31 + + /* PHA L2R */ + p_curr_taps = hPHA->p_curr_taps_fx[0]; + p_curr_taps[0] = L_shl( rfft_pha_buf[0], 9 ); // Q22->Q31 + move32(); + FOR( i = 1; i < hPHA->pha_len; i++ ) + { + p_curr_taps[i] = L_shl( rfft_pha_buf[input_frame_pha - i], 9 ); // Q22->Q31 + move32(); + } } FOR( n = 0; n < CPE_CHANNELS; n++ ) @@ -981,11 +1291,7 @@ static void calc_poc_fx( FOR( i = 0; i < hPHA->pha_len; i++ ) { // hPHA->p_curr_taps[n][i] *= hPHA->win[i]; -#ifdef FIX_ISSUE_1153 hPHA->p_curr_taps_fx[n][i] = Mpy_32_16_1( hPHA->p_curr_taps_fx[n][i], hPHA->win_fx[i] ); // Q30 -#else - hPHA->p_curr_taps_fx[n][i] = L_shl( Mpy_32_16_1( hPHA->p_curr_taps_fx[n][i], hPHA->win_fx[i] ), 1 ); // Q31 -#endif move32(); } @@ -993,35 +1299,21 @@ static void calc_poc_fx( move32(); energy_e = 0; move16(); -#ifdef FIX_ISSUE_1153 - Word16 shift = L_norm_arr( hPHA->p_curr_taps_fx[n], hPHA->pha_len ); - IF( shift ) - { - scale_sig32( hPHA->p_curr_taps_fx[n], hPHA->pha_len, 1 ); - shift = 1; - move16(); - } -#endif FOR( i = 0; i < hPHA->pha_len; i++ ) { -#ifdef FIX_ISSUE_1153 - energy = BASOP_Util_Add_Mant32Exp( energy, energy_e, Mpy_32_32_r( hPHA->p_curr_taps_fx[n][i], hPHA->p_curr_taps_fx[n][i] ), shl( sub( 1, shift ), 1 ), &energy_e ); -#else energy = BASOP_Util_Add_Mant32Exp( energy, energy_e, Mpy_32_32_r( hPHA->p_curr_taps_fx[n][i], hPHA->p_curr_taps_fx[n][i] ), 0, &energy_e ); -#endif } // energy = (float) inv_sqrt( energy + EPSILON ); energy = BASOP_Util_Add_Mant32Exp( energy, energy_e, EPSILON_FX_M, EPSILON_FX_E, &energy_e ); energy = ISqrt32( energy, &energy_e ); FOR( i = 0; i < hPHA->pha_len; i++ ) { - hPHA->p_curr_taps_fx[n][i] = L_shl_r( Mpy_32_32_r( hPHA->p_curr_taps_fx[n][i], energy ), energy_e ); // Q31 + hPHA->p_curr_taps_fx[n][i] = L_shl_r( Mpy_32_32_r( hPHA->p_curr_taps_fx[n][i], energy ), sub( energy_e, 1 ) ); // Q30 move32(); } } } - rfft_buf[0] = L_shr_r( specPOr[0], 10 ); // Q31->Q21 move32(); rfft_buf[1] = L_shr_r( specPOr[n0], 10 ); // Q31->Q21 @@ -1118,7 +1410,7 @@ static void calc_poc_fx( *-------------------------------------------------------------------*/ static Word32 find_poc_peak_fx( STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */ - Word32 itd_fx[], /* o : estimated itd Q16 */ + Word16 itd_fx[], /* o : estimated itd Q0 */ const Word16 input_frame, /* i : input frame length per channel */ const Word32 ratio_fixed /* i : adapting ratio Q31 */ ) @@ -1126,6 +1418,7 @@ static Word32 find_poc_peak_fx( Word16 itd_cand[CPE_CHANNELS], i, n, cnt[CPE_CHANNELS], Lh, peak_range, *on, *itdLR, prev_off[CPE_CHANNELS], eps_fx; Word32 Q_fx[CPE_CHANNELS], aQ_fx[CPE_CHANNELS], cQ_fx[CPE_CHANNELS], width_fx, *peak_width_fx, *peakQ_fx, cconfidence_fx, *P_fx, tmpf_fx, eps2_fx; Word16 tmpf_e = 0, eps2_e = 0, Q_e[CPE_CHANNELS], eps_e = 15, peakQ_e[CPE_CHANNELS]; + move16(); move16(); move16(); @@ -1240,7 +1533,7 @@ static Word32 find_poc_peak_fx( move16(); move16(); move16(); - if ( Q_fx[n] == 0 ) + IF( Q_fx[n] == 0 ) { Q_e[n] = 0; move16(); @@ -1398,9 +1691,6 @@ static Word32 find_poc_peak_fx( { Q_fx[i] = L_shr( Q_fx[i], negate( Q_e[i] ) ); // Q31 move32(); - } - FOR( i = 0; i < CPE_CHANNELS; i++ ) - { peakQ_fx[i] = L_shr( peakQ_fx[i], sub( 15, peakQ_e[i] ) ); // Q16 move32(); } @@ -1430,7 +1720,7 @@ static ivas_error estimate_itd_fx( STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o: correlation filter structure */ const Word32 srcL[], /* i : Lch input signal Q16 */ const Word32 srcR[], /* i : Rch input signal Q16 */ - Word32 itd[], /* o : estimated itd Q16 */ + Word16 itd[], /* o : estimated itd Q0 */ const Word16 input_frame /* i : input frame length per channel */ ) { @@ -1515,42 +1805,134 @@ static void weighted_ave_fx( const Word32 wnd_fx[] /* i : window coef Q31 */ ) { - Word16 i, len; + + Word16 i, j, len, len2; Word32 gain_tmp_fx = 0, gain_sub_fx; + move32(); - len = shr( input_frame, 4 ); + + len = shr( input_frame, 1 ); + len2 = shr( input_frame, 2 ); gain_sub_fx = L_sub( gain_fx, old_gain_fx ); - FOR( i = 0; i < len; i++ ) + + FOR( i = 0; i < len2; i++ ) { gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31 dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_tmp_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16 move32(); } + FOR( ; i < len; i++ ) + { + j = add( i, 1 ); + gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, L_sub( MAX_32, wnd_fx[sub( len, j )] ) ) ); // Q31 + dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_tmp_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16 + move32(); + } FOR( ; i < input_frame; i++ ) { dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16 move32(); } + return; } + +/*-------------------------------------------------------------------* + * spectral_flatness_fx() + * + * computes spectral flatness SF + * SF(x) = exp(mean_i(ln(x_i))) / mean_i(x_i) + *-------------------------------------------------------------------*/ +static Word32 spectral_flatness_fx( + const Word32 *sig_fx, /* i : input signal (mantissa) */ + const Word16 *sig_fx_e, /* i : input signal (exponent) */ + const Word16 sig_length /* i : input signal length */ +) +{ + Word32 L_geoMean, L_ariMean, L_tmp; + Word16 i, geoMean, ariMean, geoMean_e, ariMean_e, L_tmp_e, sf; + + L_geoMean = 0; + geoMean_e = 0; + L_ariMean = 0; + ariMean_e = 0; + + IF( sig_fx_e == NULL ) + { + FOR( i = 0; i < sig_length; i++ ) + { + L_tmp = BASOP_Util_Add_Mant32Exp( L_abs( sig_fx[i] ), 0, EPSILON_FX_M, EPSILON_FX_E, &L_tmp_e ); + L_ariMean = BASOP_Util_Add_Mant32Exp( L_ariMean, ariMean_e, L_tmp, L_tmp_e, &ariMean_e ); + L_geoMean = BASOP_Util_Add_Mant32Exp( L_geoMean, geoMean_e, BASOP_Util_Loge( L_tmp, L_tmp_e ), 6, &geoMean_e ); // +6 : compensate result of log /64 + } + } + ELSE + { + FOR( i = 0; i < sig_length; i++ ) + { + L_tmp = BASOP_Util_Add_Mant32Exp( L_abs( sig_fx[i] ), sig_fx_e[i], EPSILON_FX_M, EPSILON_FX_E, &L_tmp_e ); + L_ariMean = BASOP_Util_Add_Mant32Exp( L_ariMean, ariMean_e, L_tmp, L_tmp_e, &ariMean_e ); + L_geoMean = BASOP_Util_Add_Mant32Exp( L_geoMean, geoMean_e, BASOP_Util_Loge( L_tmp, L_tmp_e ), 6, &geoMean_e ); // +6 : compensate result of log /64 + } + } + + ariMean = BASOP_Util_Divide3216_Scale( L_ariMean, sig_length, &L_tmp_e ); + ariMean_e = add( sub( ariMean_e, Q15 ), L_tmp_e ); // (Q16)-1 : compensate result of division + + geoMean = BASOP_Util_Divide3216_Scale( L_geoMean, sig_length, &L_tmp_e ); + geoMean_e = add( sub( geoMean_e, Q15 ), L_tmp_e ); // (Q16)-1 : compensate result of division + geoMean = extract_h( BASOP_Util_fPow( (Word32) 1459366444, (Word16) 2, L_deposit_h( geoMean ), geoMean_e, &geoMean_e ) ); /* e=2,718281828459045 */ + + sf = BASOP_Util_Divide1616_Scale( geoMean, ariMean, &L_tmp_e ); + L_tmp_e = add( sub( geoMean_e, ariMean_e ), L_tmp_e ); + + return L_shl_sat( L_deposit_h( sf ), L_tmp_e ); +} + +/*-------------------------------------------------------------------* + * renorm_poc_fx() + * + * two-stage renormalization of a complex number + *-------------------------------------------------------------------*/ +static void renorm_poc_fx( + Word32 *real, /* i/o real-part*/ + Word32 *imag /* i/o imaginary-part */ +) +{ + IF( ( LT_32( L_abs( *real ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( *imag ), STEREO_DMX_EVS_POC_RENORM_TH ) ) ) + { + *real = L_shl( *real, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + *imag = L_shl( *imag, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + IF( ( LT_32( L_abs( *real ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( *imag ), STEREO_DMX_EVS_POC_RENORM_TH ) ) ) + { + *real = L_shl( *real, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + *imag = L_shl( *imag, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + } + } +} + /*-------------------------------------------------------------------* * calc_energy() * * calculate energy *-------------------------------------------------------------------*/ -static void calc_energy_fx( - const Word32 src1_fx[], /* i : Lch input signal Q16*/ - const Word32 src2_fx[], /* i : Rch input signal Q16 */ - Word32 energy_fx[], /* o : calculated energy energy_fx_e*/ - Word16 *energy_fx_e, /* o : calculated energy */ - const Word16 input_frame, /* i : input frame length per channel */ - const Word32 ratio_float_fx // Q31 -) +void calc_energy_fx( + const Word32 src1_fx[], /* i : Lch input signal */ + const Word32 src2_fx[], /* i : Rch input signal */ + Word32 energy_fx[], /* o : calculated energy */ + Word16 *energy_fx_e, /* o : calculated energy */ + Word32 *lvl_fx, /* i/o: signal level lvl_fx_e */ + Word16 *lvl_fx_e, /* i/o: signal level */ + const Word16 input_frame, /* i : input frame length per channel */ + const Word32 ratio_float_fx ) { - Word32 E_32_fx, wnd_fx, wnd_diff_fx; - Word16 i, adaptlen; + Word32 E_32_fx, wnd_fx, wnd_diff_fx, lvli_fx, lvlff_fx; + Word16 i, adaptlen, lvli_fx_e; Word64 E_fx; + /* Initialization */ E_fx = 0; move32(); @@ -1612,6 +1994,59 @@ static void calc_energy_fx( // *energy = *energy * ratio_float + ( E / (float) input_frame ) * ( 1.0f - ratio_float ); *energy_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( *energy_fx, ratio_float_fx ), *energy_fx_e, Mpy_32_32( temp32, L_sub( MAX_32, ratio_float_fx ) ), sub( 31, q_temp32 ), energy_fx_e ); move32(); + + IF( ( lvl_fx != NULL ) && ( lvl_fx_e != NULL ) ) + { + E_32_fx = BASOP_Util_Add_Mant32Exp( E_32_fx, sub( 31, q_E ), EPSILON_FX_M, EPSILON_FX_E, &temp_e ); + lvli_fx = BASOP_Util_Log10( E_32_fx, temp_e ); + lvli_fx_e = 6; // +6 : compensate result of log in Q25 + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( lvli_fx, lvli_fx_e, *lvl_fx, *lvl_fx_e ), 1 ) ) + { + lvlff_fx = STEREO_DMX_EVS_LVLU_FORGETTING_Q31; + } + ELSE + { + lvlff_fx = STEREO_DMX_EVS_LVLD_FORGETTING_Q31; + } + *lvl_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( *lvl_fx, lvlff_fx ), *lvl_fx_e, Mpy_32_32( lvli_fx, L_sub( MAX_32, lvlff_fx ) ), lvli_fx_e, lvl_fx_e ); // Q(31 - *lvli_fx_e) + } + + return; +} + +/*-------------------------------------------------------------------* + * calc_energy_sgc() + * + * calculate energy for switch gain control + *-------------------------------------------------------------------*/ +static void calc_energy_sgc( + const Word32 src[], /* i : input signal */ + Word32 *energy, /* i/o : calculated energy (mantissa) */ + Word16 *energy_e, /* i/o : calculated energy (exponent) */ + const Word16 input_frame, /* i : input frame length */ + const Word16 ratio /* i : adapting ratio */ +) +{ + Word16 i, l_tmp_e, l_energy_e; + Word32 l_energy; + Word64 w_tmp; + + l_energy = 0; + l_energy_e = 0; + FOR( i = 0; i < input_frame; i++ ) + { + w_tmp = W_mult0_32_32( src[i], src[i] ); + l_tmp_e = W_norm( w_tmp ); + IF( l_tmp_e != 0 ) + { + w_tmp = W_shl( w_tmp, l_tmp_e ); + } + l_energy = BASOP_Util_Add_Mant32Exp( l_energy, l_energy_e, W_round64_L( w_tmp ), sub( 32, l_tmp_e ), &l_energy_e ); // Q(2x26 - l_energy_e) + } + + *energy = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( *energy, ratio ), *energy_e, Mpy_32_16_1( l_energy, sub( MAX_16, ratio ) ), l_energy_e, energy_e ); + move32(); + return; } @@ -1629,27 +2064,34 @@ static void adapt_gain_fx( const Word32 wnd_fx[] /* i : window coef Q31 */ ) { - Word16 i, len; + + Word16 i, j, len, len2; Word32 gain_tmp_fx, gain_sub_fx; - len = shr( input_frame, 4 ); - // gain_sub = gain - old_gain; - gain_sub_fx = L_sub( gain_fx, old_gain_fx ); // Q31 + len = shr( input_frame, 1 ); + len2 = shr( input_frame, 2 ); + gain_sub_fx = L_sub( gain_fx, old_gain_fx ); - FOR( i = 0; i < len; i++ ) + FOR( i = 0; i < len2; i++ ) { - // gain_tmp = old_gain + gain_sub * wnd[i]; - gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31 // dst[i] = src[i] * gain_tmp; + gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31 dst_fx[i] = Mpy_32_32( src_fx[i], gain_tmp_fx ); // Q16 move32(); } + FOR( ; i < len; i++ ) + { + j = add( i, 1 ); + gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, L_sub( MAX_32, wnd_fx[sub( len, j )] ) ) ); // Q31 + dst_fx[i] = Mpy_32_32( src_fx[i], gain_tmp_fx ); // Q16 + move32(); + } FOR( ; i < input_frame; i++ ) { - // dst[i] = src[i] * gain; dst_fx[i] = Mpy_32_32( src_fx[i], gain_fx ); // Q16 move32(); } + return; } @@ -1658,18 +2100,19 @@ static void adapt_gain_fx( * * create downmix signal *-------------------------------------------------------------------*/ -static void create_M_signal_fx( - const Word32 srcL_fx[], /* i : Lch input signal Q16 */ - const Word32 srcR_fx[], /* i : Rch input signal Q16 */ - Word32 dmx_fx[], /* o : output signal Q31 */ - const Word32 w_curr_fx, /* i : adapting weight Q31 */ - const Word16 input_frame, /* i : input frame length per channel */ - const Word32 wnd_fx[], /* i : window coef Q31 */ - Word32 *w_prev_fx, /* i/o: adapting prev weight Q31*/ - Word32 *dmx_energy_fx, /* i/o: downmix signal energy dmx_energy_fx_e */ - Word16 *dmx_energy_fx_e, /* i/o: downmix signal energy */ - Word32 *src_energy_fx, /* i/o: input signal energy src_energy_fx_e */ - Word16 *src_energy_fx_e /* i/o: input signal energy */ +void create_M_signal_fx( + const Word32 srcL_fx[], /* i : Lch input signal Q16 */ + const Word32 srcR_fx[], /* i : Rch input signal Q16 */ + Word32 dmx_fx[], /* o : output signal Q31 */ + const Word32 w_curr_fx, /* i : adapting weight Q31 */ + const Word16 input_frame, /* i : input frame length per channel */ + const Word32 wnd_fx[], /* i : window coef Q31 */ + Word32 *w_prev_fx, /* i/o: adapting prev weight Q31 */ + Word32 *dmx_energy_fx, /* i/o: downmix signal energy dmx_energy_fx_e */ + Word16 *dmx_energy_fx_e, /* i/o: downmix signal energy */ + Word32 *src_energy_fx, /* i/o: input signal energy src_energy_fx_e */ + Word16 *src_energy_fx_e, /* i/o: input signal energy */ + STEREO_DMX_EVS_PHA_HANDLE hPHA /* i/o: correlation filter structure */ ) { Word32 amp_mod_fx[CPE_CHANNELS]; @@ -1678,6 +2121,7 @@ static void create_M_signal_fx( Word32 temp32_1, temp32_2; Word16 temp_e; Word16 temp_e_1, temp_e_2; + /* Initialization */ eps_fx = 1024; // 1024.0f in Q0 move32(); @@ -1692,9 +2136,9 @@ static void create_M_signal_fx( move32(); } weighted_ave_fx( srcL_fx, srcR_fx, dmx_fx, w_curr_fx, w_prev_fx[0], input_frame, wnd_fx ); - calc_energy_fx( srcL_fx, srcL_fx, src_energy_fx, src_energy_fx_e, input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING_FX ); - calc_energy_fx( srcR_fx, srcR_fx, src_energy_fx + 1, src_energy_fx_e + 1, input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING_FX ); - calc_energy_fx( dmx_fx, dmx_fx, dmx_energy_fx, dmx_energy_fx_e, input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING_FX ); + calc_energy_fx( srcL_fx, srcL_fx, src_energy_fx, src_energy_fx_e, hPHA->lvlin_fx, hPHA->lvlin_fx_e, input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING_FX ); + calc_energy_fx( srcR_fx, srcR_fx, src_energy_fx + 1, src_energy_fx_e + 1, hPHA->lvlin_fx + 1, hPHA->lvlin_fx_e + 1, input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING_FX ); + calc_energy_fx( dmx_fx, dmx_fx, dmx_energy_fx, dmx_energy_fx_e, NULL, NULL, input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING_FX ); temp32_1 = Mpy_32_32( src_energy_fx[0], Lbias_fx ); // 31 - src_energy_fx_e + Q28-31 temp_e_1 = add( src_energy_fx_e[0], 3 ); @@ -1746,6 +2190,51 @@ static void create_M_signal_fx( return; } +/*-------------------------------------------------------------------* + * apply_gain_sgc() + * + * Apply gain for switching + *-------------------------------------------------------------------*/ + +static void apply_gain_sgc( + Word32 data[], /* i/o : input signal */ + Word32 *gain, /* i : gain */ + const Word16 input_frame /* i : input frame length */ +) +{ + Word16 n; + Word32 lr; + Word64 W_tmp; + + IF( GT_32( *gain, STEREO_DMX_EVS_SGC_GH ) ) + { + lr = STEREO_DMX_EVS_SGC_GIR_S; + move32(); + } + ELSE IF( LT_32( *gain, STEREO_DMX_EVS_SGC_GL ) ) + { + lr = STEREO_DMX_EVS_SGC_GR_S; + move32(); + } + ELSE + { + return; + } + + FOR( n = 0; n < input_frame; n++ ) + { + W_tmp = W_mult_32_32( data[n], *gain ); + W_tmp = W_shr( W_tmp, 16 ); + data[n] = W_extract_l( W_tmp ); + } + + W_tmp = W_mult_32_32( *gain, lr ); + W_tmp = W_shr( W_tmp, 16 ); + *gain = W_extract_l( W_tmp ); + + return; +} + /*-------------------------------------------------------------------* * stereo_dmx_evs_enc() * @@ -1760,27 +2249,34 @@ void stereo_dmx_evs_enc_fx( ) { Word16 n; - Word16 dmx_weight, corr; // Q15 + Word16 dmx_weight, corr; // Q15 + + Word16 k, m, pha_len, fad_len, sbfad_len; + Word32 data_fx[CPE_CHANNELS][L_FRAME48k]; // Q16/Q11 - Word16 k, m, pha_len, fad_len; Word32 mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX]; // Q11 Word32 *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data; - Word32 dmx_poc_data[L_FRAME48k] /*Q11*/, dmx_pha_data[L_FRAME48k] /*Q11*/, *p_dmx_data, fx_tmp; - Word16 fx_tmp_e; - STEREO_DMX_EVS_PRC curr_prc; - Word16 input_subframe, is_transient; + + Word32 dmx_poc_data[L_FRAME48k] /*Q11*/, dmx_pha_data[L_FRAME48k] /*Q11*/, *p_dmx_data, fx_tmp, *p_dmx_data_fo; + Word16 n_fad_r, n_fad_g, m_fad_g, n_fad_cnt; + + STEREO_DMX_EVS_PRC prev_prc, req_prc; + Word32 L_tmp1, L_tmp2, L_dmx_weight, icld_fx; + Word16 L_tmp1_e, L_tmp2_e, icld_fx_e; + + STEREO_DMX_EVS_PHA_HANDLE hPHA; + + Word16 input_subframe, is_transient, dmx_gain_sgc; Word32 *p_sub_frame, subframe_energy[STEREO_DMX_EVS_NB_SBFRM]; Word16 subframe_energy_e[STEREO_DMX_EVS_NB_SBFRM]; Word16 input_frame; - Word32 L_tmp1, L_tmp2; - Word16 L_tmp1_e, L_tmp2_e; - Word64 W_tmp; Word16 W_tmp_q; + push_wmops( "stereo_dmx_evs_enc" ); if ( is_binaural ) { /* use of is_binaural flag is to be considered */ @@ -1807,6 +2303,7 @@ void stereo_dmx_evs_enc_fx( BREAK; } move16(); + hPHA = hStereoDmxEVS->hPHA; FOR( n = 0; n < input_frame; n++ ) { @@ -1821,7 +2318,6 @@ void stereo_dmx_evs_enc_fx( set32_fx( data_fx[1] + n_samples, 0, sub( input_frame, n_samples ) ); } - // input_subframe = n_samples / STEREO_DMX_EVS_NB_SBFRM; IF( EQ_16( n_samples, L_FRAME16k ) ) { @@ -1849,10 +2345,7 @@ void stereo_dmx_evs_enc_fx( move16(); FOR( k = 0; k < CPE_CHANNELS; k++ ) { - fx_tmp = 0; move32(); - fx_tmp_e = 0; - move16(); FOR( m = 0; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) { p_sub_frame = &( data_fx[k][m * input_subframe] ); @@ -1867,44 +2360,33 @@ void stereo_dmx_evs_enc_fx( W_tmp_q = W_norm( W_tmp ); W_tmp = W_shl( W_tmp, W_tmp_q ); L_tmp1 = W_extract_h( W_tmp ); // Q(31-(30-W_tmp_q)) - L_tmp1_e = sub( 15 * 2, W_tmp_q ); + L_tmp1_e = sub( 15 << 1, W_tmp_q ); subframe_energy[m] = BASOP_Util_Add_Mant32Exp( subframe_energy[m], subframe_energy_e[m], L_tmp1, L_tmp1_e, &subframe_energy_e[m] ); move32(); } L_tmp1 = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->trns_aux_energy_fx[k], hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( subframe_energy[m], L_tmp1, &L_tmp2_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_newton( subframe_energy[m], L_tmp1, &L_tmp2_e ); L_tmp2_e = add( L_tmp2_e, sub( subframe_energy_e[m], L_tmp1_e ) ); - // if ( subframe_energy[m] / ( hStereoDmxEVS->hPHA->trns_aux_energy[k] + EPSILON ) > hStereoDmxEVS->hPHA->crst_fctr ) - if ( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, hStereoDmxEVS->hPHA->crst_fctr_fx, 31 ) > 0 ) + // if ( subframe_energy[m] / ( hPHA->trns_aux_energy[k] + EPSILON ) > hPHA->crst_fctr ) + if ( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, hPHA->crst_fctr_fx, 31 ) > 0 ) { is_transient = 1; move16(); } - IF( hStereoDmxEVS->hPHA->init_frmCntr == 0 ) - { - // hStereoDmxEVS->hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hStereoDmxEVS->hPHA->trns_aux_energy[k] + ( 1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING ) * subframe_energy[m]; - hStereoDmxEVS->hPHA->trns_aux_energy_fx[k] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( hStereoDmxEVS->hPHA->trns_aux_energy_fx[k], STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ), hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k], Mpy_32_16_1( subframe_energy[m], sub( MAX_16, STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ) ), subframe_energy_e[m], &hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k] ); - move32(); - } - ELSE - { - // hStereoDmxEVS->hPHA->trns_aux_energy[k] = 0.5f * hStereoDmxEVS->hPHA->trns_aux_energy[k] + 0.5f * subframe_energy[m]; - hStereoDmxEVS->hPHA->trns_aux_energy_fx[k] = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->trns_aux_energy_fx[k], add( hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k], 1 ), subframe_energy[m], add( subframe_energy_e[m], 1 ), &hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k] ); - move32(); - } - - fx_tmp = BASOP_Util_Add_Mant32Exp( fx_tmp, fx_tmp_e, subframe_energy[m], subframe_energy_e[m], &fx_tmp_e ); + // hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hPHA->trns_aux_energy[k] + ( 1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING ) * subframe_energy[m]; + hPHA->trns_aux_energy_fx[k] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( hPHA->trns_aux_energy_fx[k], STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ), hPHA->trns_aux_energy_fx_e[k], Mpy_32_16_1( subframe_energy[m], sub( MAX_16, STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ) ), subframe_energy_e[m], &hPHA->trns_aux_energy_fx_e[k] ); + move32(); } FOR( m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) { L_tmp1 = BASOP_Util_Add_Mant32Exp( subframe_energy[m - 1], subframe_energy_e[m - 1], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( subframe_energy[m], L_tmp1, &L_tmp2_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_newton( subframe_energy[m], L_tmp1, &L_tmp2_e ); L_tmp2_e = add( L_tmp2_e, sub( subframe_energy_e[m], L_tmp1_e ) ); // if ( subframe_energy[m] / ( subframe_energy[m - 1] + EPSILON ) > STEREO_DMX_EVS_TRNS_DTC_INST ) - if ( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, STEREO_DMX_EVS_TRNS_DTC_INST_Q0, 31 ) > 0 ) + IF( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, STEREO_DMX_EVS_TRNS_DTC_INST_Q0, 31 ) > 0 ) { is_transient = 1; move16(); @@ -1912,14 +2394,14 @@ void stereo_dmx_evs_enc_fx( } } - estimate_itd_fx( &corr, hStereoDmxEVS->hPOC, hStereoDmxEVS->hPHA, data_fx[0], data_fx[1], &hStereoDmxEVS->itd_fx, input_frame ); + estimate_itd_fx( &corr, hStereoDmxEVS->hPOC, hPHA, data_fx[0], data_fx[1], &hStereoDmxEVS->itd_fx, input_frame ); /* poc */ IF( hStereoDmxEVS->itd_fx ) { // dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f; - IF( hStereoDmxEVS->itd_fx > 0 ) + IF( GT_16( hStereoDmxEVS->itd_fx, 0 ) ) { dmx_weight = add( negate( shr( corr, 1 ) ), ONE_IN_Q14 ); } @@ -1934,21 +2416,24 @@ void stereo_dmx_evs_enc_fx( move16(); } - create_M_signal_fx( data_fx[0], data_fx[1], dmx_poc_data, L_deposit_h( dmx_weight ), input_frame, hStereoDmxEVS->s_wnd_fx, - hStereoDmxEVS->dmx_weight_fx, hStereoDmxEVS->pre_dmx_energy_fx, hStereoDmxEVS->pre_dmx_energy_fx_e, hStereoDmxEVS->aux_dmx_energy_fx, hStereoDmxEVS->aux_dmx_energy_fx_e ); + L_dmx_weight = L_deposit_h( dmx_weight ); + L_tmp1 = L_deposit_l( BASOP_Util_Divide1616_Scale( hStereoDmxEVS->itd_fx, input_frame, &L_tmp1_e ) ); + hPHA->phitd_fx = L_shl( L_tmp1, L_tmp1_e ); // Q15 + create_M_signal_fx( data_fx[0], data_fx[1], dmx_poc_data, L_dmx_weight, input_frame, hStereoDmxEVS->s_wnd_fx, + hStereoDmxEVS->dmx_weight_fx, hStereoDmxEVS->pre_dmx_energy_fx, hStereoDmxEVS->pre_dmx_energy_fx_e, hStereoDmxEVS->aux_dmx_energy_fx, hStereoDmxEVS->aux_dmx_energy_fx_e, hPHA ); // Downscaling signals to avoid accumulation overflows - scale_sig32( data_fx[0], input_frame, -5 ); // Q16->Q11 - scale_sig32( data_fx[1], input_frame, -5 ); // Q16->Q11 - scale_sig32( dmx_poc_data, input_frame, -5 ); // Q16->Q11 + scale_sig32( data_fx[0], input_frame, -5 ); // Q31->Q26 + scale_sig32( data_fx[1], input_frame, -5 ); // Q31->Q26 + scale_sig32( dmx_poc_data, input_frame, -5 ); // Q31->Q26 /* pha */ - pha_len = hStereoDmxEVS->hPHA->pha_len; + pha_len = hPHA->pha_len; move16(); - fad_len = hStereoDmxEVS->hPHA->fad_len; + fad_len = hPHA->fad_len; move16(); - fad_g = hStereoDmxEVS->hPHA->fad_g_fx; + fad_g = hPHA->fad_g_fx; set_zero_fx( dmx_pha_data, n_samples ); set_zero_fx( mem_prev, fad_len ); @@ -1956,12 +2441,12 @@ void stereo_dmx_evs_enc_fx( FOR( k = 0; k < CPE_CHANNELS; k++ ) { p_data = data_fx[k]; - Copy32( hStereoDmxEVS->hPHA->data_mem_fx[k], data_mem, pha_len ); - Copy32( &( p_data[n_samples - pha_len] ), hStereoDmxEVS->hPHA->data_mem_fx[k], pha_len ); + Copy32( hPHA->data_mem_fx[k], data_mem, pha_len ); + Copy32( &( p_data[sub( n_samples, pha_len )] ), hPHA->data_mem_fx[k], pha_len ); p_data_mem = &( data_mem[pha_len] ); Copy32( p_data, p_data_mem, n_samples ); - p_prev_taps = hStereoDmxEVS->hPHA->p_prev_taps_fx[k]; + p_prev_taps = hPHA->p_prev_taps_fx[k]; IF( p_prev_taps ) { FOR( n = 0; n < fad_len; n++ ) @@ -1969,9 +2454,9 @@ void stereo_dmx_evs_enc_fx( FOR( ( fx_tmp = 0, m = 0 ); m < pha_len; m++ ) { // ftmp += p_data_mem[n - m] * p_prev_taps[m]; - // fx_tmp = BASOP_Util_Add_Mant32Exp(fx_tmp, fx_tmp_e, Mpy_32_32(p_data_mem[n - m], p_prev_taps[m]),15,&fx_tmp_e); - fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[n - m], p_prev_taps[m] ) ); // Q11 + fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[n - m], p_prev_taps[m] ) ); // Q25 } + fx_tmp = L_shl( fx_tmp, 1 ); // Q26 mem_prev[n] = L_add( mem_prev[n], Mpy_32_32( fx_tmp, INV_SQRT_2_Q31 ) ); move32(); } @@ -1981,12 +2466,12 @@ void stereo_dmx_evs_enc_fx( FOR( n = 0; n < fad_len; n++ ) { // mem_prev[n] += p_data[n] * INV_SQRT_2; - mem_prev[n] = L_add( mem_prev[n], Mpy_32_32( p_data[n], INV_SQRT_2_Q31 ) ); // Q11 + mem_prev[n] = L_add( mem_prev[n], Mpy_32_32( p_data[n], INV_SQRT_2_Q31 ) ); // Q26 move32(); } } - p_curr_taps = hStereoDmxEVS->hPHA->p_curr_taps_fx[k]; + p_curr_taps = hPHA->p_curr_taps_fx[k]; IF( p_curr_taps ) { FOR( n = 0; n < n_samples; n++ ) @@ -1994,10 +2479,11 @@ void stereo_dmx_evs_enc_fx( FOR( ( fx_tmp = 0, m = 0 ); m < pha_len; m++ ) { // ftmp += p_data_mem[n - m] * p_curr_taps[m]; - fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[n - m], p_curr_taps[m] ) ); // Q11 + fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[n - m], p_curr_taps[m] ) ); // Q25 } + fx_tmp = L_shl( fx_tmp, 1 ); // Q26 // dmx_pha_data[n] += ftmp * INV_SQRT_2; - dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( fx_tmp, INV_SQRT_2_Q31 ) ); // Q11 + dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( fx_tmp, INV_SQRT_2_Q31 ) ); // Q26 move32(); } } @@ -2006,7 +2492,7 @@ void stereo_dmx_evs_enc_fx( FOR( n = 0; n < n_samples; n++ ) { // dmx_pha_data[n] += p_data[n] * INV_SQRT_2; - dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( p_data[n], INV_SQRT_2_Q31 ) ); // Q11 + dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( p_data[n], INV_SQRT_2_Q31 ) ); // Q26 move32(); } } @@ -2016,65 +2502,60 @@ void stereo_dmx_evs_enc_fx( { dmx_pha_data[n] = Mpy_32_32( dmx_pha_data[n], fad_g[n] ); move32(); - dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( mem_prev[n], fad_g[m] ) ); // Q11 + dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( mem_prev[n], fad_g[m] ) ); // Q26 move32(); } /* prc switch */ - curr_prc = hStereoDmxEVS->hPHA->curr_prc; + prev_prc = hPHA->curr_prc; move32(); - // if ( abs( (int16_t) hStereoDmxEVS->itd ) > hStereoDmxEVS->hPHA->prc_thres ) - IF( GT_16( abs_s( round_fx( hStereoDmxEVS->itd_fx ) ), hStereoDmxEVS->hPHA->prc_thres ) ) + // if ( abs( (int16_t) hStereoDmxEVS->itd ) > hPHA->prc_thres ) + IF( GT_16( abs_s( hStereoDmxEVS->itd_fx ), hPHA->prc_thres ) ) { - IF( NE_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) - { - IF( EQ_32( hStereoDmxEVS->hPHA->prev_prc, STEREO_DMX_EVS_PRC_POC ) ) - { - hStereoDmxEVS->hPHA->prc_hys_cnt = add( hStereoDmxEVS->hPHA->prc_hys_cnt, 1 ); - move16(); - } - ELSE - { - hStereoDmxEVS->hPHA->prc_hys_cnt = 0; - move16(); - } + req_prc = STEREO_DMX_EVS_PRC_POC; + move32(); - if ( GE_16( hStereoDmxEVS->hPHA->prc_hys_cnt, STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) ) - { - hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; - move32(); - } + icld_fx = L_abs( BASOP_Util_Add_Mant32Exp( hPHA->lvlin_fx[0], hPHA->lvlin_fx_e[0], L_negate( hPHA->lvlin_fx[1] ), hPHA->lvlin_fx_e[1], &( icld_fx_e ) ) ); + L_tmp1 = L_add( L_shr_r( L_dmx_weight, 1 ), L_shr_r( hStereoDmxEVS->dmx_weight_fx[1], 1 ) ); // Q30 + L_tmp2 = L_add( L_sub( ONE_IN_Q30, L_shr_r( L_dmx_weight, 1 ) ), L_shr_r( hStereoDmxEVS->dmx_weight_fx[2], 1 ) ); // Q30 + + IF( ( BASOP_Util_Cmp_Mant32Exp( L_abs( icld_fx ), icld_fx_e, STEREO_DMX_EVS_ICLD_THRESH_FX, STEREO_DMX_EVS_ICLD_THRESH_FX_E ) < 0 ) && LT_32( hPHA->iccres_s_fx, STEREO_DMX_EVS_ICCRES_THRESH_Q31 ) && ( GT_32( L_shr_r( L_tmp1, 1 ), Mpy_32_32( STEREO_DMX_EVS_DICLD_THRESH_Q30, L_tmp2 ) ) || GT_32( L_shr_r( L_tmp2, 1 ), Mpy_32_32( STEREO_DMX_EVS_DICLD_THRESH_Q30, L_tmp1 ) ) ) ) + { + req_prc = STEREO_DMX_EVS_PRC_PHA; + move32(); } - hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; - move32(); } ELSE { - IF( NE_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_PHA ) ) + req_prc = STEREO_DMX_EVS_PRC_PHA; + move32(); + } + + // Set mode with hysteresis + IF( NE_32( hPHA->curr_prc, req_prc ) ) + { + IF( EQ_32( hPHA->prev_prc, req_prc ) ) { - IF( EQ_32( hStereoDmxEVS->hPHA->prev_prc, STEREO_DMX_EVS_PRC_PHA ) ) - { - hStereoDmxEVS->hPHA->prc_hys_cnt = add( hStereoDmxEVS->hPHA->prc_hys_cnt, 1 ); - move16(); - } - ELSE - { - hStereoDmxEVS->hPHA->prc_hys_cnt = 0; - move16(); - } + hPHA->prc_hys_cnt = add( hPHA->prc_hys_cnt, 1 ); + move16(); + } + ELSE + { + hPHA->prc_hys_cnt = 0; + move16(); + } - if ( GE_16( hStereoDmxEVS->hPHA->prc_hys_cnt, STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) ) - { - hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_PHA; - move32(); - } + IF( GE_16( hPHA->prc_hys_cnt, STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) ) + { + hPHA->curr_prc = req_prc; + move32(); } - hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA; - move32(); } + hPHA->prev_prc = req_prc; + move32(); - // if ( ( is_transient == 1 ) || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) || ( ( hStereoDmxEVS->hPHA->p_curr_taps[0] == NULL ) && ( hStereoDmxEVS->hPHA->p_curr_taps[1] == NULL ) ) ) + // if ( ( is_transient == 1 ) || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) || ( ( hPHA->p_curr_taps[0] == NULL ) && ( hPHA->p_curr_taps[1] == NULL ) ) ) test(); test(); test(); @@ -2082,55 +2563,190 @@ void stereo_dmx_evs_enc_fx( IF( EQ_16( is_transient, 1 ) || BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->aux_dmx_energy_fx[0], hStereoDmxEVS->aux_dmx_energy_fx_e[0], Mpy_32_32( STEREO_DMX_EVS_ILDS_EGY_Q17, hStereoDmxEVS->aux_dmx_energy_fx[1] ), add( hStereoDmxEVS->aux_dmx_energy_fx_e[1], 14 ) ) > 0 || BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->aux_dmx_energy_fx[1], hStereoDmxEVS->aux_dmx_energy_fx_e[1], Mpy_32_32( STEREO_DMX_EVS_ILDS_EGY_Q17, hStereoDmxEVS->aux_dmx_energy_fx[0] ), add( hStereoDmxEVS->aux_dmx_energy_fx_e[0], 14 ) ) > 0 || - ( ( hStereoDmxEVS->hPHA->p_curr_taps_fx[0] == NULL ) && ( hStereoDmxEVS->hPHA->p_curr_taps_fx[1] == NULL ) ) ) + EQ_16( hPHA->force_poc, TRUE ) ) { - hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; + hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; move32(); - hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + hPHA->prc_hys_cnt = 0; move16(); } - IF( EQ_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) + calc_energy_sgc( dmx_poc_data, &( hPHA->dmx_poc_ener_fx ), &( hPHA->dmx_poc_ener_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + calc_energy_sgc( dmx_pha_data, &( hPHA->dmx_pha_ener_fx ), &( hPHA->dmx_pha_ener_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + + IF( NE_32( prev_prc, hPHA->curr_prc ) && EQ_16( is_transient, 0 ) && !( ( BASOP_Util_Cmp_Mant32Exp( hPHA->dmx_pha_ener_fx, hPHA->dmx_pha_ener_fx_e, hPHA->low_egy_thres_sgc, hPHA->low_egy_thres_sgc_e ) < 0 ) && ( BASOP_Util_Cmp_Mant32Exp( hPHA->dmx_poc_ener_fx, hPHA->dmx_poc_ener_fx_e, hPHA->low_egy_thres_sgc, hPHA->low_egy_thres_sgc_e ) < 0 ) ) ) + { + IF( EQ_32( hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) + { + apply_gain_sgc( dmx_pha_data, &( hPHA->dmx_pha_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_pha_data, &( hPHA->dmx_pha_ener_sgc_fx ), &( hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + + L_tmp1 = BASOP_Util_Add_Mant32Exp( hPHA->dmx_poc_ener_fx, hPHA->dmx_poc_ener_fx_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + BASOP_Util_Divide_MantExp( extract_h( hPHA->dmx_pha_ener_sgc_fx ), hPHA->dmx_pha_ener_sgc_fx_e, extract_h( L_tmp1 ), L_tmp1_e, &dmx_gain_sgc, &L_tmp2_e ); + dmx_gain_sgc = Sqrt16( dmx_gain_sgc, &L_tmp2_e ); + hPHA->dmx_poc_gain_sgc_fx = L_shl( L_deposit_l( dmx_gain_sgc ), L_tmp2_e ); // Q15 + hPHA->dmx_poc_gain_sgc_fx = L_min( hPHA->dmx_poc_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMAX ); + hPHA->dmx_poc_gain_sgc_fx = L_max( hPHA->dmx_poc_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMIN ); + + apply_gain_sgc( dmx_poc_data, &( hPHA->dmx_poc_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_poc_data, &( hPHA->dmx_poc_ener_sgc_fx ), &( hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + } + ELSE + { + apply_gain_sgc( dmx_poc_data, &( hPHA->dmx_poc_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_poc_data, &( hPHA->dmx_poc_ener_sgc_fx ), &( hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + + L_tmp1 = BASOP_Util_Add_Mant32Exp( hPHA->dmx_pha_ener_fx, hPHA->dmx_pha_ener_fx_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + BASOP_Util_Divide_MantExp( extract_h( hPHA->dmx_poc_ener_sgc_fx ), hPHA->dmx_poc_ener_sgc_fx_e, extract_h( L_tmp1 ), L_tmp1_e, &dmx_gain_sgc, &L_tmp2_e ); + dmx_gain_sgc = Sqrt16( dmx_gain_sgc, &L_tmp2_e ); + hPHA->dmx_pha_gain_sgc_fx = L_shl( L_deposit_l( dmx_gain_sgc ), L_tmp2_e ); // Q15 + hPHA->dmx_pha_gain_sgc_fx = L_min( hPHA->dmx_pha_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMAX ); + hPHA->dmx_pha_gain_sgc_fx = L_max( hPHA->dmx_pha_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMIN ); + + apply_gain_sgc( dmx_pha_data, &( hPHA->dmx_pha_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_pha_data, &( hPHA->dmx_pha_ener_sgc_fx ), &( hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + } + } + ELSE + { + apply_gain_sgc( dmx_poc_data, &( hPHA->dmx_poc_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_poc_data, &( hPHA->dmx_poc_ener_sgc_fx ), &( hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + + apply_gain_sgc( dmx_pha_data, &( hPHA->dmx_pha_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_pha_data, &( hPHA->dmx_pha_ener_sgc_fx ), &( hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + } + + IF( EQ_32( hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) { p_dmx_data = dmx_poc_data; + p_dmx_data_fo = dmx_pha_data; + } + ELSE + { + p_dmx_data = dmx_pha_data; + p_dmx_data_fo = dmx_poc_data; + } + + IF( EQ_16( is_transient, 1 ) ) + { + n_fad_r = 1; + move16(); + } + ELSE + { + n_fad_r = STEREO_DMX_EVS_FAD_R; + move16(); + } - IF( NE_32( curr_prc, hStereoDmxEVS->hPHA->curr_prc ) ) + IF( NE_32( prev_prc, hPHA->curr_prc ) ) + { + IF( EQ_16( hPHA->n_fad_g, input_frame ) ) { - fad_len = hStereoDmxEVS->hPHA->fad_len_prc; + hPHA->n_fad_g = 0; + hPHA->n_fad_cnt = 0; + move16(); + move16(); + } + ELSE + { + hPHA->n_fad_g = sub( input_frame, add( hPHA->n_fad_g, 1 ) ); + hPHA->n_fad_cnt = 0; move16(); - fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; - - FOR( ( n = 0, m = ( fad_len - 1 ) ); n < fad_len; ( n++, m-- ) ) - { - p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n] ); // Q11 - move32(); - p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m], dmx_pha_data[n] ) ); // Q11 - move32(); - } } } - ELSE + ELSE IF( is_transient ) { - p_dmx_data = dmx_pha_data; + hPHA->n_fad_cnt = 0; + move16(); + } + + fad_len = s_min( n_samples, sub( mult0( input_frame, n_fad_r ), add( mult0( hPHA->n_fad_g, n_fad_r ), hPHA->n_fad_cnt ) ) ); + + IF( NE_16( fad_len, 0 ) ) + { + fad_g = hPHA->fad_g_prc_fx; + move32(); + n_fad_g = hPHA->n_fad_g; + n_fad_cnt = hPHA->n_fad_cnt; + move16(); + move16(); + m_fad_g = sub( input_frame, add( n_fad_g, 1 ) ); - IF( NE_32( curr_prc, hStereoDmxEVS->hPHA->curr_prc ) ) + IF( EQ_16( n_fad_r, 1 ) ) { - fad_len = hStereoDmxEVS->hPHA->fad_len_prc; + n_fad_cnt = 0; move16(); - fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; + FOR( n = 0; n < fad_len; n++ ) + { + p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; + n_fad_g = add( n_fad_g, 1 ); - FOR( ( n = 0, m = ( fad_len - 1 ) ); n < fad_len; ( n++, m-- ) ) + p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26 + m_fad_g = sub( m_fad_g, 1 ); + } + } + ELSE + { + n = 0; + sbfad_len = 0; + move16(); + move16(); + IF( NE_16( n_fad_cnt, 0 ) ) { - p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n] ); // Q11 - move32(); - p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m], dmx_poc_data[n] ) ); // Q11 - move32(); + sbfad_len = s_min( fad_len, sub( n_fad_r, n_fad_cnt ) ); + FOR( ; n < sbfad_len; n++ ) + { + p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; + p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26 + } + n_fad_cnt = 0; + move16(); + n_fad_g = add( n_fad_g, 1 ); + m_fad_g = sub( m_fad_g, 1 ); + } + + sbfad_len = sub( fad_len, sbfad_len ); + IF( EQ_16( n_fad_r, STEREO_DMX_EVS_FAD_R ) ) + { + sbfad_len = L_mult( sbfad_len, STEREO_DMX_EVS_FAD_IR ) >> 16; + } + + FOR( k = 0; k < sbfad_len; k++ ) + { + FOR( m = 0; m < n_fad_r; m++ ) + { + p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; + p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26 + n = add( n, 1 ); + } + n_fad_g = add( n_fad_g, 1 ); + m_fad_g = sub( m_fad_g, 1 ); + } + + FOR( ; n < fad_len; n++ ) + { + p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; + p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26 + n_fad_cnt = add( n_fad_cnt, 1 ); + IF( GE_16( n_fad_cnt, n_fad_r ) ) + { + n_fad_cnt = 0; + move16(); + n_fad_g = add( n_fad_g, 1 ); + m_fad_g = sub( m_fad_g, 1 ); + } } } + + hPHA->n_fad_g = n_fad_g; + hPHA->n_fad_cnt = n_fad_cnt; + move16(); + move16(); } - Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q11->Q0 + Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 + pop_wmops(); return; } @@ -2149,9 +2765,9 @@ ivas_error stereo_dmx_evs_init_encoder_fx( STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS; Word16 n, input_frame; - Word16 m, len, pha_len, fad_len, fad_len2, trans_len /*, itrh*/, rfft_ipd_coef_step, n0, input_frame_pha; - Word32 *fad_g, fad_r /*, a_min, a_max, a_step*/, *ipd_ff; - Word16 *win, tmp_r; + Word16 m, len, pha_len, fad_len, fad_len2, rfft_ipd_coef_step, n0, input_frame_pha; + Word32 *fad_g, fad_r; + Word16 *win; const Word16 *p_ipd_w; Word16 tmp_e; @@ -2341,6 +2957,10 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); hStereoDmxEVS->hPHA->crst_fctr_fx = STEREO_DMX_EVS_CRST_FCTR_16_Q0; move32(); + hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_16; + hStereoDmxEVS->hPHA->low_egy_thres_sgc_e = STEREO_DMX_EVS_SGC_LEGY_THRES_E; + move32(); + move16(); } ELSE IF( EQ_32( input_Fs, 32000 ) ) { @@ -2352,6 +2972,10 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); hStereoDmxEVS->hPHA->crst_fctr_fx = STEREO_DMX_EVS_CRST_FCTR_32_Q0; move32(); + hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_32; + hStereoDmxEVS->hPHA->low_egy_thres_sgc_e = STEREO_DMX_EVS_SGC_LEGY_THRES_E; + move32(); + move16(); } ELSE IF( EQ_32( input_Fs, 48000 ) ) { @@ -2363,6 +2987,10 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); hStereoDmxEVS->hPHA->crst_fctr_fx = STEREO_DMX_EVS_CRST_FCTR_48_Q0; move32(); + hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_48; + hStereoDmxEVS->hPHA->low_egy_thres_sgc_e = STEREO_DMX_EVS_SGC_LEGY_THRES_E; + move32(); + move16(); } ELSE { @@ -2371,35 +2999,69 @@ ivas_error stereo_dmx_evs_init_encoder_fx( hStereoDmxEVS->hPHA->pha_len = shr( len, 1 ); move16(); - hStereoDmxEVS->hPHA->init_frmCntr = 10; // (int16_t)(FRAMES_PER_SEC * 0.2f) - move16(); hStereoDmxEVS->hPHA->isd_rate_s_fx = 0; move32(); hStereoDmxEVS->hPHA->iccr_s_fx = 0; move32(); + hStereoDmxEVS->hPHA->phitd_fx = 0; + hStereoDmxEVS->hPHA->iccres_s_fx = 0; + move32(); + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + hStereoDmxEVS->hPHA->lvlin_fx[n] = 0; + move32(); + hStereoDmxEVS->hPHA->lvlin_fx_e[n] = 0; + move16(); + } + pha_len = hStereoDmxEVS->hPHA->pha_len; move16(); fad_len = hStereoDmxEVS->hPHA->fad_len; move16(); - trans_len = idiv1616( pha_len, 20 ); - set16_fx( hStereoDmxEVS->hPHA->win_fx, 29491 /*1.8f in Q15*/, sub( pha_len, trans_len ) ); + set16_fx( hStereoDmxEVS->hPHA->win_fx, 29491 /*1.8f in Q14*/, pha_len ); hStereoDmxEVS->hPHA->win_fx[0] = ONE_IN_Q14; move16(); - // tmp_r = 1.0f / ( ( trans_len * 2 ) + 1 ); - tmp_r = div_s( 1, add( shl( trans_len, 1 ), 1 ) ); - win = &( hStereoDmxEVS->hPHA->win_fx[pha_len - trans_len] ); - FOR( n = 0; n < trans_len; n++ ) + IF( EQ_32( input_Fs, 16000 ) ) { - // win[n] = ( 0.5f * ( 1.0f + cosf( ( PI2 * ( n + 1 ) ) * tmp_r ) ) ) * 1.8f; - win[n] = mult_r( add( ONE_IN_Q14, getCosWord16R2( imult1616( add( n, 1 ), tmp_r ) ) ), 29491 /*1.8/2 in Q15*/ ); + hStereoDmxEVS->hPHA->win_fx[sub( pha_len, 1 )] = 7373; /*0.45f in Q14*/ + move16(); + } + ELSE IF( EQ_32( input_Fs, 32000 ) || EQ_32( input_Fs, 48000 ) ) + { + hStereoDmxEVS->hPHA->win_fx[sub( pha_len, 2 )] = 19302; /*1.1781f in Q14*/ + move16(); + hStereoDmxEVS->hPHA->win_fx[sub( pha_len, 1 )] = 2816; /*0.1718f in Q14*/ move16(); } fad_g = hStereoDmxEVS->hPHA->fad_g_fx; // fad_r = 1.0f / (float) ( fad_len + 1 ); - fad_r = BASOP_Util_Divide3232_Scale_cadence( 1, add( fad_len, 1 ), &tmp_e ); + SWITCH( fad_len ) + { + case STEREO_DMX_EVS_FAD_LEN_16: + fad_r = 853658096; + move32(); + tmp_e = -6; + move16(); + BREAK; + case STEREO_DMX_EVS_FAD_LEN_32: + fad_r = 856317467; + move32(); + tmp_e = -7; + move16(); + BREAK; + case STEREO_DMX_EVS_FAD_LEN_48: + fad_r = 571471740; + move32(); + tmp_e = -7; + move16(); + BREAK; + default: + fad_r = BASOP_Util_Divide3232_Scale_newton( 1, add( fad_len, 1 ), &tmp_e ); + BREAK; + } fad_r = L_shl_r( fad_r, tmp_e ); fad_len2 = shr( fad_len, 1 ); FOR( ( n = 0, m = ( fad_len - 1 ) ); n < fad_len2; ( n++, m-- ) ) @@ -2419,26 +3081,25 @@ ivas_error stereo_dmx_evs_init_encoder_fx( /* Compute the forgetting factor */ // replaced below logic with table as it is same for all frame lengths - ipd_ff = hStereoDmxEVS->hPHA->ipd_ff_fx; - Copy32( ipd_ff_Q31, ipd_ff, STEREO_DMX_EVS_NB_SUBBAND_MAX ); - - // a_min = 0.8576958985908941f; - // a_max = 0.9440608762859234f; - // itrh = (int16_t)((3000 * input_frame) / (input_Fs * STEREO_DMX_EVS_SUBBAND_SIZE)); /* 3kHz */ - // n0 = L_FRAME16k / (2 * STEREO_DMX_EVS_SUBBAND_SIZE); - // a_step = (a_min - a_max) / (n0 + 1 - itrh); - // for (n = 0; n < itrh; n++) - //{ - // ipd_ff[n] = a_max; - // } - // for (; n < (n0 + 1); n++) /* 8kHz */ - //{ - // ipd_ff[n] = a_max + (n - itrh) * a_step; - // } - // for (; n < STEREO_DMX_EVS_NB_SUBBAND_MAX; n++) - //{ - // ipd_ff[n] = a_min; - // } + Copy32( ipd_ff_Q31, hStereoDmxEVS->hPHA->ipd_ff_fx, STEREO_DMX_EVS_NB_SUBBAND_MAX ); + + hStereoDmxEVS->hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD; + hStereoDmxEVS->hPHA->force_poc = FALSE; + move16(); + move32(); + + hStereoDmxEVS->hPHA->pha_ipd_chan_cnt = 0; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_chan_thresh = 10; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_chan2rephase = 1; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_previouschan2rephase = 1; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_chanswitch = 0; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_chanswitch_allowed = 0; + move16(); set32_fx( hStereoDmxEVS->hPHA->Pr_fx, MAX_32, STEREO_DMX_EVS_NB_SUBBAND_MAX ); set_zero_fx( hStereoDmxEVS->hPHA->Pi_fx, STEREO_DMX_EVS_NB_SUBBAND_MAX ); @@ -2477,7 +3138,7 @@ ivas_error stereo_dmx_evs_init_encoder_fx( { win[n] = p_ipd_w[n * len]; move16(); - win[input_frame_pha - n] = p_ipd_w[n * len]; + win[sub( input_frame_pha, n )] = p_ipd_w[n * len]; move16(); } win[n0] = p_ipd_w[n0 * len]; @@ -2490,34 +3151,36 @@ ivas_error stereo_dmx_evs_init_encoder_fx( hStereoDmxEVS->hPHA->prc_hys_cnt = 0; move16(); - // hStereoDmxEVS->hPHA->fad_len_prc = (int16_t) ( STEREO_DMX_EVS_FADE_LEN_PRC * (float) input_Fs / 1000.0f ); - SWITCH( input_Fs ) + fad_len = input_frame; + move16(); + + fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; + move32(); + // fad_r = 1.0f / (float) ( fad_len + 1 ); + SWITCH( fad_len ) { - case 8000: - hStereoDmxEVS->hPHA->fad_len_prc = STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 8; - move16(); - BREAK; - case 16000: - hStereoDmxEVS->hPHA->fad_len_prc = STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 16; + case STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 16: + fad_r = 856317467; + move32(); + tmp_e = -7; move16(); BREAK; - case 32000: - hStereoDmxEVS->hPHA->fad_len_prc = STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 32; + case STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 32: + fad_r = 857653375; + move32(); + tmp_e = -8; move16(); BREAK; - case 48000: - hStereoDmxEVS->hPHA->fad_len_prc = STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 48; + case STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 48: + fad_r = 572066403; + move32(); + tmp_e = -8; move16(); BREAK; default: - IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sample rate\n" ); + fad_r = BASOP_Util_Divide3232_Scale_newton( 1, add( fad_len, 1 ), &tmp_e ); BREAK; } - fad_len = hStereoDmxEVS->hPHA->fad_len_prc; - move16(); - fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; - // fad_r = 1.0f / (float) ( fad_len + 1 ); - fad_r = BASOP_Util_Divide3232_Scale_cadence( 1, add( fad_len, 1 ), &tmp_e ); fad_r = L_shl_r( fad_r, tmp_e ); fad_len2 = shr( fad_len, 1 ); FOR( ( n = 0, m = ( fad_len - 1 ) ); n < fad_len2; ( n++, m-- ) ) @@ -2536,6 +3199,36 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); } + + hStereoDmxEVS->hPHA->dmx_poc_ener_fx = 0; + move32(); + hStereoDmxEVS->hPHA->dmx_poc_ener_fx_e = 0; + move16(); + hStereoDmxEVS->hPHA->dmx_pha_ener_fx = 0; + move32(); + hStereoDmxEVS->hPHA->dmx_pha_ener_fx_e = 0; + move16(); + + hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx = 0; + move32(); + hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e = 0; + move16(); + hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx = 0; + move32(); + hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e = 0; + move16(); + + hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx = ONE_IN_Q15; + hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx = ONE_IN_Q15; + move32(); + move32(); + + hStereoDmxEVS->hPHA->n_fad_g = input_frame; + hStereoDmxEVS->hPHA->n_fad_cnt = 0; + move16(); + move16(); + + *hStereoDmxEVS_out = hStereoDmxEVS; return IVAS_ERR_OK; diff --git a/lib_enc/ivas_stereo_eclvq_enc_fx.c b/lib_enc/ivas_stereo_eclvq_enc_fx.c index 3abc07811450ec80c6e98e508eef739e2d647f27..a09daffe033c27d824800c93d8e8855231389091 100644 --- a/lib_enc/ivas_stereo_eclvq_enc_fx.c +++ b/lib_enc/ivas_stereo_eclvq_enc_fx.c @@ -89,7 +89,7 @@ void ECSQ_quantize_vector_fx( } ELSE { - inv_global_gain = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q15, global_gain, &inv_global_gain_e ); + inv_global_gain = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q15, global_gain, &inv_global_gain_e ); inv_global_gain = L_shl( inv_global_gain, inv_global_gain_e ); // Q31 FOR( i = 0; i < N; ++i ) { @@ -140,7 +140,7 @@ Word32 ECSQ_compute_optimal_gain_fx( // Q15 IF( sum_sq_output != 0 ) { // optimal_global_gain = sum_input_output / sum_sq_output; - optimal_global_gain = BASOP_Util_Divide3232_Scale_cadence( sum_input_output, sum_sq_output, &optimal_global_gain_e ); // 31 - ( sum_input_output_e - 31 + optimal_global_gain_e ) = 62 - ( sum_input_output_e + optimal_global_gain_e ) + optimal_global_gain = BASOP_Util_Divide3232_Scale_newton( sum_input_output, sum_sq_output, &optimal_global_gain_e ); // 31 - ( sum_input_output_e - 31 + optimal_global_gain_e ) = 62 - ( sum_input_output_e + optimal_global_gain_e ) optimal_global_gain = L_shr( optimal_global_gain, sub( sub( 62, add( sum_input_output_e, optimal_global_gain_e ) ), 15 ) ); // Q15 } @@ -427,7 +427,7 @@ static Word16 get_best_param_fx( IF( LE_16( sub( count, count0 ), ECSQ_NONZERO_MAX ) && EQ_32( sum_abs, L_shl( sub( count, count0 ), 10 ) ) ) { //*avg_abs_sum = ( sum_abs + 0.25f * count0 ) / count; - *avg_abs_sum = BASOP_Util_Divide3232_Scale_cadence( L_add( sum_abs, L_shl( count0, 8 ) ), L_shl( count, 10 ), &L_tmp_e ); + *avg_abs_sum = BASOP_Util_Divide3232_Scale_newton( L_add( sum_abs, L_shl( count0, 8 ) ), L_shl( count, 10 ), &L_tmp_e ); move32(); *avg_abs_sum = L_shr_r( *avg_abs_sum, sub( 21, L_tmp_e ) ); // Q10 move32(); @@ -438,7 +438,7 @@ static Word16 get_best_param_fx( } //*avg_abs_sum = ( sum_abs + 0.25f * count0 ) / count; - *avg_abs_sum = BASOP_Util_Divide3232_Scale_cadence( L_add( sum_abs, L_shl( count0, 8 ) ), L_shl( count, 10 ), &L_tmp_e ); + *avg_abs_sum = BASOP_Util_Divide3232_Scale_newton( L_add( sum_abs, L_shl( count0, 8 ) ), L_shl( count, 10 ), &L_tmp_e ); move32(); *avg_abs_sum = L_shr_r( *avg_abs_sum, sub( 21, L_tmp_e ) ); // Q10 move32(); @@ -478,7 +478,7 @@ static Word32 get_est_size_fx( // Q10 // if ( param < 0 ) //{ // //two_to_param = 1.0f / two_to_param; - // two_to_param = BASOP_Util_Divide3232_Scale_cadence( 1, two_to_param,&two_to_param_e); + // two_to_param = BASOP_Util_Divide3232_Scale_newton( 1, two_to_param,&two_to_param_e); // } IF( NE_16( param, ECSQ_ALL_ZERO_PARAM ) ) /* not all values are zeros */ @@ -508,8 +508,8 @@ static Word32 get_est_size_fx( // Q10 nonzero = sub( N, N0 ); // required_avg_abs_sum = ( nonzero + 0.25f * N0 ) / N; /* the vector must have nonzero +-1 and N0 zeros */ - required_avg_abs_sum = BASOP_Util_Divide3232_Scale_cadence( L_add( L_shl( nonzero, 10 ), L_shl( N0, 8 ) ), L_shl( N, 10 ), &required_avg_abs_sum_e ); /* the vector must have nonzero +-1 and N0 zeros */ - required_avg_abs_sum = L_shr_r( required_avg_abs_sum, sub( 21, required_avg_abs_sum_e ) ); // Q10 + required_avg_abs_sum = BASOP_Util_Divide3232_Scale_newton( L_add( L_shl( nonzero, 10 ), L_shl( N0, 8 ) ), L_shl( N, 10 ), &required_avg_abs_sum_e ); /* the vector must have nonzero +-1 and N0 zeros */ + required_avg_abs_sum = L_shr_r( required_avg_abs_sum, sub( 21, required_avg_abs_sum_e ) ); // Q10 test(); IF( EQ_32( avg_abs_sum, required_avg_abs_sum ) && LE_16( nonzero, ECSQ_NONZERO_MAX ) ) @@ -847,18 +847,18 @@ Word32 ECSQ_encode_target_SNR_fx( /* target_ratio is the target ratio between the sum squared values of input and sum squared values of quantization error */ // target_ratio = powf( 10.0f, target_SNR / 10.0f ); - L_tmp1 = BASOP_Util_Divide3232_Scale_cadence( target_SNR, 10, &L_tmp1_e ); + L_tmp1 = BASOP_Util_Divide3232_Scale_newton( target_SNR, 10, &L_tmp1_e ); L_tmp1_e = add( L_tmp1_e, 6 - 31 ); target_ratio = BASOP_Util_fPow( 10 << 27, 4, L_tmp1, L_tmp1_e, &target_ratio_e ); // target_sum_squared_error = sum_squared / target_ratio; - target_sum_squared_error = BASOP_Util_Divide3232_Scale_cadence( sum_squared, target_ratio, &target_sum_squared_error_e ); + target_sum_squared_error = BASOP_Util_Divide3232_Scale_newton( sum_squared, target_ratio, &target_sum_squared_error_e ); target_sum_squared_error_e = add( target_sum_squared_error_e, sub( sum_squared_e, target_ratio_e ) ); /* the mean of squared quantization error for uniform scalar quantization is 1 / 12, approximately 0.0833 */ /* when including global_gain, the relationship is target_sum_squared_error ~ (0.0833 * N) * global_gain ^ 2 */ /* the representable range for global_gain is from 1 (global_gain_index 0) to 29145 (global_gain_index 126) inclusive */ // global_gain = sqrtf( target_sum_squared_error / ( 0.0833f * (float) N ) ); - global_gain = BASOP_Util_Divide3232_Scale_cadence( target_sum_squared_error, L_mult0( 5459 /*0.0833f in Q16*/, N ), &global_gain_e ); + global_gain = BASOP_Util_Divide3232_Scale_newton( target_sum_squared_error, L_mult0( 5459 /*0.0833f in Q16*/, N ), &global_gain_e ); global_gain_e = add( global_gain_e, sub( target_sum_squared_error_e, 15 ) ); global_gain = Sqrt32( global_gain, &global_gain_e ); global_gain = L_shr( global_gain, sub( 16, global_gain_e ) ); // Q15 @@ -885,7 +885,7 @@ Word32 ECSQ_encode_target_SNR_fx( adjust_size = L_sub( test_size, max_bits_fixpt ); /* assume doubling the quantization step size will reduce the entropy with (up to) one bit */ // adjust_global_gain_index = (int16_t) ceil( adjust_size / ( 1024.0f * N * log_base2( global_gain_step ) ) ); - adjust_global_gain_index = BASOP_Util_Divide3232_Scale_cadence( adjust_size, N, &tmp_e ); + adjust_global_gain_index = BASOP_Util_Divide3232_Scale_newton( adjust_size, N, &tmp_e ); adjust_global_gain_index = Mpy_32_32( adjust_global_gain_index, 17816838 /*/ ( 1024.0f * log_base2( global_gain_step ) )*/ ); IF( NE_32( adjust_global_gain_index, L_shl( L_shr( adjust_global_gain_index, sub( 31, tmp_e ) ), sub( 31, tmp_e ) ) ) ) { diff --git a/lib_enc/ivas_stereo_ica_enc_fx.c b/lib_enc/ivas_stereo_ica_enc_fx.c index 0577987067b0619181a31f741ac782884febb4a2..924de4d6595451430d5ab5a91f8c5a96fbd444fa 100644 --- a/lib_enc/ivas_stereo_ica_enc_fx.c +++ b/lib_enc/ivas_stereo_ica_enc_fx.c @@ -40,13 +40,13 @@ #include "wmc_auto.h" #include "rom_com.h" #include "ivas_rom_com.h" - #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" + /*--------------------------------------------------------------- * Local function prototypes * ---------------------------------------------------------------*/ + static void unclr_calc_corr_features_fx( STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier handle */ STEREO_TCA_ENC_HANDLE hStereoTCA, /* i/o: ICA Stereo Encoder handle */ @@ -78,6 +78,7 @@ static void unclr_calc_corr_features_fx( * * Temporal channel adjustment of LA samples in target channel * ---------------------------------------------------------------*/ + static void tcaTargetCh_LA_fx( STEREO_TCA_ENC_HANDLE hStereoTCA, Word32 *ptrChanL, /* q_com */ @@ -150,7 +151,7 @@ static void tcaTargetCh_LA_fx( deno_exp = 0; move16(); } - gAdj = BASOP_Util_Divide3232_Scale_cadence( tempF2, deno, &gAdj_exp ); /* Q31-gAdj_exp */ + gAdj = BASOP_Util_Divide3232_Scale_newton( tempF2, deno, &gAdj_exp ); /* Q31-gAdj_exp */ gAdj_exp = add( gAdj_exp, sub( tempF2_exp, deno_exp ) ); } @@ -408,8 +409,8 @@ static void deEmphResample_fx( /* De-emphasis, 1/(1-mu z^-1), and resample, stage 1 */ - deemph_fx_32( 0, buf1_fx, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim_fx[0] ); - deemph_fx_32( 0, buf2_fx, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim_fx[1] ); + deemph_fx_32( buf1_fx, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim_fx[0] ); + deemph_fx_32( buf2_fx, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim_fx[1] ); FOR( i = 0; i < ( input_frame / dsFac1 ); i++ ) { @@ -420,8 +421,8 @@ static void deEmphResample_fx( } /* De-emphasis, 1/(1-mu z^-1), and resample, stage 2 */ - deemph_fx_32( 0, tempBuf1_fx, PREEMPH_FAC_16k, idiv1616( input_frame, dsFac1 ), &hStereoTCA->memdecim_fx[2] ); - deemph_fx_32( 0, tempBuf2_fx, PREEMPH_FAC_16k, idiv1616( input_frame, dsFac1 ), &hStereoTCA->memdecim_fx[3] ); + deemph_fx_32( tempBuf1_fx, PREEMPH_FAC_16k, idiv1616( input_frame, dsFac1 ), &hStereoTCA->memdecim_fx[2] ); + deemph_fx_32( tempBuf2_fx, PREEMPH_FAC_16k, idiv1616( input_frame, dsFac1 ), &hStereoTCA->memdecim_fx[3] ); FOR( i = 0; i < ( input_frame / dsFactor ); i++ ) { @@ -608,13 +609,13 @@ static void utilCrossCorr_fx( { IF( EQ_16( winSymmFlag, 0 ) ) { - v_mult_fixed( buf1, win, tempBuf1, len ); - v_mult_fixed( buf2, win, tempBuf2, len ); + v_mult_fx( buf1, win, tempBuf1, len ); + v_mult_fx( buf2, win, tempBuf2, len ); } ELSE { - v_mult_fixed( buf1, win, tempBuf1, ( len >> 1 ) ); - v_mult_fixed( buf2, win, tempBuf2, ( len >> 1 ) ); + v_mult_fx( buf1, win, tempBuf1, ( len >> 1 ) ); + v_mult_fx( buf2, win, tempBuf2, ( len >> 1 ) ); FOR( i = shr( len, 1 ); i < len; i++ ) { @@ -703,7 +704,7 @@ static void utilCrossCorr_fx( *corrEst_e = max_e; move16(); - v_multc_fixed( corrEst, scale, corrEst, j ); + v_multc_fx( corrEst, scale, corrEst, j ); *corrEst_e = add( *corrEst_e, temp2_e ); move16(); @@ -884,9 +885,9 @@ static void corrStatsEst_fx( move32(); /* long term corr Stats estimation */ - v_multc_fixed_16( hStereoTCA->corrEstLT_fx, alpha_fx, hStereoTCA->corrEstLT_fx, 2 * L_NCSHIFT_DS + 1 ); /* Q31-hStereoTCA->corrEstLT_exp */ - v_multc_fixed_16( corrEst_fx, sub( MAX_16, alpha_fx ), corrEst_fx, 2 * L_NCSHIFT_DS + 1 ); /* Q31-corrEst_exp */ - v_add_fixed_me( hStereoTCA->corrEstLT_fx, hStereoTCA->corrEstLT_exp, corrEst_fx, corrEst_exp, hStereoTCA->corrEstLT_fx, &hStereoTCA->corrEstLT_exp, 2 * L_NCSHIFT_DS + 1, 0 ); + v_multc_fx_16( hStereoTCA->corrEstLT_fx, alpha_fx, hStereoTCA->corrEstLT_fx, 2 * L_NCSHIFT_DS + 1 ); /* Q31-hStereoTCA->corrEstLT_exp */ + v_multc_fx_16( corrEst_fx, sub( MAX_16, alpha_fx ), corrEst_fx, 2 * L_NCSHIFT_DS + 1 ); /* Q31-corrEst_exp */ + v_add_fx_me( hStereoTCA->corrEstLT_fx, hStereoTCA->corrEstLT_exp, corrEst_fx, corrEst_exp, hStereoTCA->corrEstLT_fx, &hStereoTCA->corrEstLT_exp, 2 * L_NCSHIFT_DS + 1, 0 ); hStereoTCA->ica_envVarLT_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( hStereoTCA->ica_envVarLT_fx, SMOOTH_ENV_FACTOR_FX_Q15 ), hStereoTCA->ica_envVarLT_exp, Mpy_32_16_1( tempF_fx, ONE_IN_Q15 - SMOOTH_ENV_FACTOR_FX_Q15 ), tempF_exp, &hStereoTCA->ica_envVarLT_exp ); // SMOOTH_ENV_FACTOR_FX_Q15 (Q31-hStereoTCA->ica_envVarLT_exp) move32(); @@ -923,7 +924,7 @@ static void corrStatsEst_fx( IF( tempF_fx != 0 ) { temp32 = BASOP_Util_Add_Mant32Exp( XY_hat_fx, XY_hat_exp, L_negate( Mpy_32_32( X_hat_fx, Y_hat_fx ) ), add( X_hat_exp, Y_hat_exp ), &exp ); /* Q31-exp */ - beta_reg_fx = BASOP_Util_Divide3232_Scale_cadence( temp32, tempF_fx, &beta_reg_exp ); /* Q31-beta_reg_exp */ + beta_reg_fx = BASOP_Util_Divide3232_Scale_newton( temp32, tempF_fx, &beta_reg_exp ); /* Q31-beta_reg_exp */ if ( beta_reg_fx ) { beta_reg_exp = add( beta_reg_exp, sub( exp, tempF_exp ) ); @@ -1036,15 +1037,15 @@ static void corrStatsEst_fx( IF( LT_32( hStereoTCA->prevTargetGain_fx, 429496730 /*0.8f in Q29*/ ) && vad_flag1 ) { /* ch 2 is prev reference channel */ - v_multc_fixed( corrEst_fx, 644245095 /*1.2f in Q29*/, corrEst_fx, L_NCSHIFT_DS + 1 ); /* Q31-corrEst_exp */ - v_multc_fixed( corrEst_fx + L_NCSHIFT_DS + 1, 447213470 /* 0.833 in Q29*/, corrEst_fx + L_NCSHIFT_DS + 1, L_NCSHIFT_DS ); /* Q31-corrEst_exp */ + v_multc_fx( corrEst_fx, 644245095 /*1.2f in Q29*/, corrEst_fx, L_NCSHIFT_DS + 1 ); /* Q31-corrEst_exp */ + v_multc_fx( corrEst_fx + L_NCSHIFT_DS + 1, 447213470 /* 0.833 in Q29*/, corrEst_fx + L_NCSHIFT_DS + 1, L_NCSHIFT_DS ); /* Q31-corrEst_exp */ corrEst_exp = add( corrEst_exp, 2 ); } ELSE IF( GT_32( hStereoTCA->prevTargetGain_fx, 644245094 /*1.2f in Q29*/ ) && vad_flag1 ) { /* ch 1 is prev reference channel */ - v_multc_fixed( corrEst_fx, 447213470 /* 0.833 f in Q29*/, corrEst_fx, L_NCSHIFT_DS ); /* Q31-corrEst_exp */ - v_multc_fixed( corrEst_fx + L_NCSHIFT_DS, 644245095 /*1.2f in Q29*/, corrEst_fx + L_NCSHIFT_DS, L_NCSHIFT_DS + 1 ); /* Q31-corrEst_exp */ + v_multc_fx( corrEst_fx, 447213470 /* 0.833 f in Q29*/, corrEst_fx, L_NCSHIFT_DS ); /* Q31-corrEst_exp */ + v_multc_fx( corrEst_fx + L_NCSHIFT_DS, 644245095 /*1.2f in Q29*/, corrEst_fx + L_NCSHIFT_DS, L_NCSHIFT_DS + 1 ); /* Q31-corrEst_exp */ corrEst_exp = add( corrEst_exp, 2 ); } test(); @@ -1054,9 +1055,9 @@ static void corrStatsEst_fx( j = s_min( 2 * L_NCSHIFT_DS, add( hStereoTCA->prevCorrLagStats[0], 1 + L_NCSHIFT_DS ) ); k = add( sub( j, i ), 1 ); - v_multc_fixed( corrEst_fx, ONE_IN_Q29 /*1.0f in Q29*/, corrEst_fx, i ); // to allign in same exp (Q31-corrEst_exp) - v_multc_fixed( corrEst_fx + i, 644245095 /*1.2f in Q29*/, corrEst_fx + i, k ); /* Q31-corrEst_exp */ - v_multc_fixed( corrEst_fx + i + k, ONE_IN_Q29 /*1.0f in Q29*/, corrEst_fx + i + k, sub( 2 * L_NCSHIFT_DS + 1, i + k ) ); // to allign in same exp (Q31-corrEst_exp) + v_multc_fx( corrEst_fx, ONE_IN_Q29 /*1.0f in Q29*/, corrEst_fx, i ); // to allign in same exp (Q31-corrEst_exp) + v_multc_fx( corrEst_fx + i, 644245095 /*1.2f in Q29*/, corrEst_fx + i, k ); /* Q31-corrEst_exp */ + v_multc_fx( corrEst_fx + i + k, ONE_IN_Q29 /*1.0f in Q29*/, corrEst_fx + i + k, sub( 2 * L_NCSHIFT_DS + 1, i + k ) ); // to allign in same exp (Q31-corrEst_exp) corrEst_exp = add( corrEst_exp, 2 ); } @@ -1094,13 +1095,9 @@ static void corrStatsEst_fx( hStereoTCA->delay_0_mem_fx[MAX_DELAYREGLEN - 1] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( hStereoTCA->delay_0_mem_fx[MAX_DELAYREGLEN - 1], 429496730 /* 0.2 in Q31*/ ), hStereoTCA->delay_0_mem_exp, L_mult0( 26214 /* 0.8 in Q15*/, corrLagStats[0] ), Q16, &temp ); /* Q31-temp */ move32(); -#ifdef FIX_USAN_ISSUES Word32 inpp = L_abs( BASOP_Util_Add_Mant32Exp( reg_prv_corr_fx, reg_prv_corr_exp, L_negate( hStereoTCA->delay_0_mem_fx[0] ), hStereoTCA->delay_0_mem_exp, &exp ) ); /* Q31-exp */ -#else - Word32 inpp = L_abs( BASOP_Util_Add_Mant32Exp( reg_prv_corr_fx, reg_prv_corr_exp, -hStereoTCA->delay_0_mem_fx[0], hStereoTCA->delay_0_mem_exp, &exp ) ); /* Q31-exp */ -#endif - inpp = L_shl_sat( inpp, sub( exp, 5 ) ); /* Q26 */ - IF( GT_32( inpp, 1677721600 ) ) // 25 in Q26 + inpp = L_shl_sat( inpp, sub( exp, 5 ) ); /* Q26 */ + IF( GT_32( inpp, 1677721600 ) ) // 25 in Q26 { set32_fx( &( hStereoTCA->delay_0_mem_fx[0] ), hStereoTCA->delay_0_mem_fx[MAX_DELAYREGLEN - 1], MAX_DELAYREGLEN - 1 ); hStereoTCA->delay_0_mem_exp = temp; @@ -1879,17 +1876,17 @@ void stereo_tca_enc_fx( IF( EQ_16( hStereoTCA->prevRefChanIndx, L_CH_INDX ) ) { - v_multc_fixed( bufChanL_fx, ONE_IN_Q29, bufChanL_fx, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX ); /* TO make in common Q bufChan_q - 2*/ - Copy32( ptrChanL_fx - add( lMemRecalc, lMemRecalc_SCh ), input_mem_loc_fx[0], add( lMemRecalc, lMemRecalc_SCh ) ); // bufChan_q - 2 - v_multc_fixed( ptrChanR_fx + sub( prevNCShift, add( lMemRecalc, lMemRecalc_SCh ) ), hStereoTCA->prevTargetGain_fx, input_mem_loc_fx[1], add( lMemRecalc, lMemRecalc_SCh ) ); // bufChan_q-2 - v_multc_fixed( bufChanR_fx, ONE_IN_Q29, bufChanR_fx, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX ); /* TO make in common Q bufChan_q -2*/ + v_multc_fx( bufChanL_fx, ONE_IN_Q29, bufChanL_fx, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX ); /* TO make in common Q bufChan_q - 2*/ + Copy32( ptrChanL_fx - add( lMemRecalc, lMemRecalc_SCh ), input_mem_loc_fx[0], add( lMemRecalc, lMemRecalc_SCh ) ); // bufChan_q - 2 + v_multc_fx( ptrChanR_fx + sub( prevNCShift, add( lMemRecalc, lMemRecalc_SCh ) ), hStereoTCA->prevTargetGain_fx, input_mem_loc_fx[1], add( lMemRecalc, lMemRecalc_SCh ) ); // bufChan_q-2 + v_multc_fx( bufChanR_fx, ONE_IN_Q29, bufChanR_fx, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX ); /* TO make in common Q bufChan_q -2*/ } ELSE { - v_multc_fixed( bufChanL_fx, ONE_IN_Q29, bufChanL_fx, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX ); /* TO make in common Q bufChan_q -2*/ - Copy32( ptrChanL_fx + sub( prevNCShift, add( lMemRecalc, lMemRecalc_SCh ) ), input_mem_loc_fx[0], add( lMemRecalc, lMemRecalc_SCh ) ); // bufChan_q -2 - v_multc_fixed( ptrChanR_fx - add( lMemRecalc, lMemRecalc_SCh ), hStereoTCA->prevTargetGain_fx, input_mem_loc_fx[1], add( lMemRecalc, lMemRecalc_SCh ) ); // bufChan_q -2 - v_multc_fixed( bufChanR_fx, ONE_IN_Q29, bufChanR_fx, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX ); /* TO make in common Q bufChan_q -2*/ + v_multc_fx( bufChanL_fx, ONE_IN_Q29, bufChanL_fx, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX ); /* TO make in common Q bufChan_q -2*/ + Copy32( ptrChanL_fx + sub( prevNCShift, add( lMemRecalc, lMemRecalc_SCh ) ), input_mem_loc_fx[0], add( lMemRecalc, lMemRecalc_SCh ) ); // bufChan_q -2 + v_multc_fx( ptrChanR_fx - add( lMemRecalc, lMemRecalc_SCh ), hStereoTCA->prevTargetGain_fx, input_mem_loc_fx[1], add( lMemRecalc, lMemRecalc_SCh ) ); // bufChan_q -2 + v_multc_fx( bufChanR_fx, ONE_IN_Q29, bufChanR_fx, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX ); /* TO make in common Q bufChan_q -2*/ } bufChan_q = sub( bufChan_q, 2 ); q_com = bufChan_q; @@ -1940,7 +1937,7 @@ void stereo_tca_enc_fx( } ELSE { - v_multc_fixed( target_fx - tempS, hStereoTCA->prevTargetGain_fx, &( input_mem_loc_fx[target_idx][lMemRecalc + lMemRecalc_SCh - tempS - currentNCShift] ), add( currentNCShift, tempS ) ); /* bufChan_q - 2 */ + v_multc_fx( target_fx - tempS, hStereoTCA->prevTargetGain_fx, &( input_mem_loc_fx[target_idx][lMemRecalc + lMemRecalc_SCh - tempS - currentNCShift] ), add( currentNCShift, tempS ) ); /* bufChan_q - 2 */ scale_sig32( input_mem_loc_fx[target_idx], sub( sub( add( lMemRecalc, lMemRecalc_SCh ), tempS ), currentNCShift ), -2 ); scale_sig32( &input_mem_loc_fx[target_idx][lMemRecalc + lMemRecalc_SCh], sub( NS2SA( 48000, L_MEM_RECALC_NS + L_MEM_RECALC_SCH_NS ), add( lMemRecalc, lMemRecalc_SCh ) ), -2 ); scale_sig32( input_mem_loc_fx[0], NS2SA( 48000, L_MEM_RECALC_NS + L_MEM_RECALC_SCH_NS ), -2 ); @@ -1968,22 +1965,8 @@ void stereo_tca_enc_fx( Word16 temp_exp, tempF_16fx; Word16 scalar_value = BASOP_Util_Divide1616_Scale( currentNCShift, dsFactor, &temp_exp ); /* Q15-temp_exp */ -#ifndef FIX_1300_ICA_SHIFT_QUANT_IMPROV - IF( temp_exp < 0 ) - { - scalar_value = shl( scalar_value, sub( temp_exp, Q3 ) ); // Q12 - hStereoTCA->indx_ica_NCShift = usquant_fx( scalar_value, &tempF_16fx, 0, ONE_IN_Q11, ( 1 << STEREO_BITS_TCA_CORRSTATS ) ); /* Q0 */ - move16(); - } - ELSE - { - hStereoTCA->indx_ica_NCShift = usquant_fx( scalar_value, &tempF_16fx, 0, shl( 1, sub( 14, temp_exp ) ), ( 1 << STEREO_BITS_TCA_CORRSTATS ) ); /* Q0 */ - move16(); - } -#else - scalar_value = shl_sat( scalar_value, sub( temp_exp, 5 ) ); /*Q10*/ - hStereoTCA->indx_ica_NCShift = usquant_fx( scalar_value, &tempF_16fx, 0, 512 /* 0.5 in Q10 */, ( 1 << STEREO_BITS_TCA_CORRSTATS ) ); /* Q0 */ -#endif + scalar_value = shl_sat( scalar_value, sub( temp_exp, 5 ) ); /*Q10*/ + hStereoTCA->indx_ica_NCShift = usquant_fx( scalar_value, &tempF_16fx, 0, 512 /* 0.5 in Q10 */, ( 1 << STEREO_BITS_TCA_CORRSTATS ) ); /* Q0 */ tempF_fx = tempF_16fx; move32(); @@ -2006,12 +1989,12 @@ void stereo_tca_enc_fx( target_idx = L_CH_INDX; /* only to avoid compilation warning */ move16(); - v_multc_fixed( bufChanL_fx, ONE_IN_Q29, bufChanL_fx, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX ); /* TO make in common Q bufChan_q -2*/ + v_multc_fx( bufChanL_fx, ONE_IN_Q29, bufChanL_fx, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX ); /* TO make in common Q bufChan_q -2*/ - Copy32( ptrChanL_fx - add( lMemRecalc, lMemRecalc_SCh ), input_mem_loc_fx[0], add( lMemRecalc, lMemRecalc_SCh ) ); // bufChan_q -2 - v_multc_fixed( ptrChanR_fx - add( lMemRecalc, lMemRecalc_SCh ), hStereoTCA->prevTargetGain_fx, input_mem_loc_fx[1], add( lMemRecalc, lMemRecalc_SCh ) ); // bufChan_q -2 + Copy32( ptrChanL_fx - add( lMemRecalc, lMemRecalc_SCh ), input_mem_loc_fx[0], add( lMemRecalc, lMemRecalc_SCh ) ); // bufChan_q -2 + v_multc_fx( ptrChanR_fx - add( lMemRecalc, lMemRecalc_SCh ), hStereoTCA->prevTargetGain_fx, input_mem_loc_fx[1], add( lMemRecalc, lMemRecalc_SCh ) ); // bufChan_q -2 - v_multc_fixed( bufChanR_fx, ONE_IN_Q29, bufChanR_fx, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX ); /* TO make in common Q bufChan_q -2 */ + v_multc_fx( bufChanR_fx, ONE_IN_Q29, bufChanR_fx, L_MEM_RECALC_48K + L_MEM_RECALC_48k_SCH + L_FRAME48k + L_NCSHIFTMAX ); /* TO make in common Q bufChan_q -2 */ bufChan_q = sub( bufChan_q, 2 ); q_com = bufChan_q; move16(); @@ -2106,6 +2089,10 @@ void stereo_tca_enc_fx( move16(); sts[1]->q_inp32 = sub( sts[1]->q_inp32, 2 ); move16(); + sts[0]->q_old_inp32 = sub( sts[0]->q_old_inp32, 2 ); + move16(); + sts[1]->q_old_inp32 = sub( sts[1]->q_old_inp32, 2 ); + move16(); } /* update L/R DS memories */ @@ -2263,7 +2250,6 @@ static void unclr_calc_corr_features_fx( side_i = BASOP_Util_Add_Mant32Exp( L_shr( buf1[i], 1 ), sub( 31, q_com ), L_negate( L_shr( buf2[i], 1 ) ), sub( 31, q_com ), &exp ); /* Q31-exp */ ener_side = BASOP_Util_Add_Mant32Exp( ener_side, ener_side_exp, Mpy_32_32( side_i, side_i ), shl( exp, 1 ), &ener_side_exp ); /* Q31-ener_side_exp */ -#ifdef FIX_ISSUE_1125 Word16 n1, n2, prod_i_exp; Word32 x, y, prod_i; n1 = norm_l( buf1[i] ); @@ -2273,9 +2259,6 @@ static void unclr_calc_corr_features_fx( prod_i = Mpy_32_32( x, y ); // q: q_com * 2 + n1 + n2 - 31 prod_i_exp = sub( 62, add( shl( q_com, 1 ), add( n1, n2 ) ) ); sum_prod = BASOP_Util_Add_Mant32Exp( sum_prod, sum_prod_exp, prod_i, prod_i_exp, &sum_prod_exp ); /* Q31-sum_prod_exp */ -#else - sum_prod = BASOP_Util_Add_Mant32Exp( sum_prod, sum_prod_exp, Mpy_32_32( buf1[i], buf2[i] ), sub( 62, shl( q_com, 1 ) ), &sum_prod_exp ); /* Q31-sum_prod_exp */ -#endif } /* average energy of L and R channels */ @@ -2341,17 +2324,17 @@ static void unclr_calc_corr_features_fx( move32(); } - hStereoClassif->unclr_fv_fx[E_corrEst0] = L_shl( corrEst[abs_s( lagSearchRange[0] )], sub( corrEst_exp, 16 ) ); /* Q15 */ + hStereoClassif->unclr_fv_fx[E_corrEst0] = L_shl_sat( corrEst[abs_s( lagSearchRange[0] )], sub( corrEst_exp, 16 ) ); /* Q15 */ move32(); - hStereoClassif->unclr_fv_fx[E_corrEstMax] = L_shl( corrEstMax, sub( corrEst_exp, 16 ) ); /* Q15 */ + hStereoClassif->unclr_fv_fx[E_corrEstMax] = L_shl_sat( corrEstMax, sub( corrEst_exp, 16 ) ); /* Q15 */ move32(); - hStereoClassif->unclr_fv_fx[E_corrLagMax] = L_shl( corrLagMax, 15 ); /* Q15 */ + hStereoClassif->unclr_fv_fx[E_corrLagMax] = L_shl_sat( corrLagMax, 15 ); /* Q15 */ move32(); - hStereoClassif->xtalk_fv_fx[E_corrEst0] = L_shl( corrEst[abs_s( lagSearchRange[0] )], sub( corrEst_exp, 16 ) ); /* Q15 */ + hStereoClassif->xtalk_fv_fx[E_corrEst0] = L_shl_sat( corrEst[abs_s( lagSearchRange[0] )], sub( corrEst_exp, 16 ) ); /* Q15 */ move32(); - hStereoClassif->xtalk_fv_fx[E_corrEstMax] = L_shl( corrEstMax, sub( corrEst_exp, 16 ) ); /* Q15 */ + hStereoClassif->xtalk_fv_fx[E_corrEstMax] = L_shl_sat( corrEstMax, sub( corrEst_exp, 16 ) ); /* Q15 */ move32(); - hStereoClassif->xtalk_fv_fx[E_corrLagMax] = L_shl( corrLagMax, 15 ); /* Q15 */ + hStereoClassif->xtalk_fv_fx[E_corrLagMax] = L_shl_sat( corrLagMax, 15 ); /* Q15 */ move32(); /* L/M and R/M correlation */ @@ -2367,9 +2350,9 @@ static void unclr_calc_corr_features_fx( move32(); } - ic_Lm = BASOP_Util_Divide3232_Scale_cadence( corrL, ener, &exp1 ); /* Q31-exp1 */ + ic_Lm = BASOP_Util_Divide3232_Scale_newton( corrL, ener, &exp1 ); /* Q31-exp1 */ exp1 = add( exp1, sub( corrL_exp, ener_exp ) ); - ic_Rm = BASOP_Util_Divide3232_Scale_cadence( corrR, ener, &exp2 ); /* Q31-exp2 */ + ic_Rm = BASOP_Util_Divide3232_Scale_newton( corrR, ener, &exp2 ); /* Q31-exp2 */ exp2 = add( exp2, sub( corrR_exp, ener_exp ) ); m_corrL_corrR = L_sub( L_max( L_abs( L_shl( ic_Lm, sub( exp1, s_max( exp1, exp2 ) ) ) ), L_abs( L_shl( ic_Rm, sub( exp2, s_max( exp1, exp2 ) ) ) ) ), L_min( L_abs( L_shl( ic_Lm, sub( exp1, s_max( exp1, exp2 ) ) ) ), L_abs( L_shl( ic_Rm, sub( exp2, s_max( exp1, exp2 ) ) ) ) ) ); // s_max(exp1, exp2) @@ -2427,7 +2410,7 @@ static void unclr_calc_corr_features_fx( } ELSE { - *corrEst_ncorr = BASOP_Util_Divide3232_Scale_cadence( num, den, &exp ); /* Q31-corrEst_ncorr_exp */ + *corrEst_ncorr = BASOP_Util_Divide3232_Scale_newton( num, den, &exp ); /* Q31-corrEst_ncorr_exp */ *corrEst_ncorr_exp = add( exp, sub( num_exp, den_exp ) ); move32(); move16(); diff --git a/lib_enc/ivas_stereo_icbwe_enc_fx.c b/lib_enc/ivas_stereo_icbwe_enc_fx.c index ad038f0fa33392763ccb3751d73ca3deebd2895c..f6bf1a0999fecbf98301544fcca9ad8bb4e2f04d 100644 --- a/lib_enc/ivas_stereo_icbwe_enc_fx.c +++ b/lib_enc/ivas_stereo_icbwe_enc_fx.c @@ -39,15 +39,14 @@ #include "wmc_auto.h" #include "rom_com.h" #include "ivas_rom_com.h" - #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*-------------------------------------------------------------------* * ic_bwe_enc_reset() * * core switching reset of IC BWE memory *-------------------------------------------------------------------*/ + static void ic_bwe_enc_reset_fx( STEREO_ICBWE_ENC_HANDLE hStereoICBWE /* i/o: Stereo ICBWE handle */ ) @@ -102,14 +101,15 @@ static Word16 ic_bwe_enc_specMapping_ivas_fx( const Word32 *shb_frame_target_fx, /* i : target shb Q31-shb_frame_target_e*/ Word16 shb_frame_target_e, Word32 *shb_synth_nonref_fx, /* o : non-ref shb synth Q31-shb_synth_nonref_e*/ - Word16 shb_synth_nonref_e, + Word16 *shb_synth_nonref_e, Word32 *specMapping_fx, /* i/o: current frame's mapping Qx*/ - Word32 *memShbSpecMapping_fx, /* i/o: current frame's mapping Qx*/ - Word32 *memShbSpecXcorr_fx, /* i/o: ic bwe spec mapping scorr memory Q31-memShbSpecXcorr_e*/ + Word32 *memShbSpecMapping_fx, /* i/o: current frame's mapping Q31-memShbSpecMapping_e*/ + Word16 *memShbSpecMapping_e, + Word32 *memShbSpecXcorr_fx, /* i/o: ic bwe spec mapping scorr memory Q31-memShbSpecXcorr_e*/ Word16 *memShbSpecXcorr_e ) { Word16 idx; - + Word16 max_exp; Word16 Txx1_fx = 0, Txx2_fx = 0, Txx3_fx = 0, T_desired_fx = 0; Word16 Txx1_e = 0, Txx2_e = 0, Txx3_e = 0, T_desired_e = 0; Word16 T_nonref_target_fx, temp_fx; @@ -132,14 +132,14 @@ static Word16 ic_bwe_enc_specMapping_ivas_fx( /* Calculate rxx(1)/rxx(0) of the non ref target */ - temp00_fx = dotp_fixed_ivas_fx( shb_frame_target_fx, shb_frame_target_e, shb_frame_target_fx, shb_frame_target_e, L_FRAME16k - 1, &temp00_exp ); /* Q31-temp0_exp */ - temp11_fx = dotp_fixed_ivas_fx( shb_frame_target_fx, shb_frame_target_e, shb_frame_target_fx + 1, shb_frame_target_e, L_FRAME16k - 1, &temp11_exp ); /* Q31-temp1_exp */ + temp00_fx = dotp_fx_ivas_fx( shb_frame_target_fx, shb_frame_target_e, shb_frame_target_fx, shb_frame_target_e, L_FRAME16k - 1, &temp00_exp ); /* Q31-temp0_exp */ + temp11_fx = dotp_fx_ivas_fx( shb_frame_target_fx, shb_frame_target_e, shb_frame_target_fx + 1, shb_frame_target_e, L_FRAME16k - 1, &temp11_exp ); /* Q31-temp1_exp */ /* Calculate rxx(1)/rxx(0) of the non ref synth */ - temp0_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, shb_synth_nonref_e, shb_synth_nonref_fx, shb_synth_nonref_e, L_FRAME16k - 3, &temp0_exp ); /* Q31-temp0_exp */ - temp1_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, shb_synth_nonref_e, shb_synth_nonref_fx + 1, shb_synth_nonref_e, L_FRAME16k - 3, &temp1_exp ); /* Q31-temp1_exp */ - temp2_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, shb_synth_nonref_e, shb_synth_nonref_fx + 2, shb_synth_nonref_e, L_FRAME16k - 3, &temp2_exp ); /* Q31-temp2_exp */ - temp3_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, shb_synth_nonref_e, shb_synth_nonref_fx + 3, shb_synth_nonref_e, L_FRAME16k - 3, &temp3_exp ); /* Q31-temp3_exp */ + temp0_fx = dotp_fx_ivas_fx( shb_synth_nonref_fx, *shb_synth_nonref_e, shb_synth_nonref_fx, *shb_synth_nonref_e, L_FRAME16k - 3, &temp0_exp ); /* Q31-temp0_exp */ + temp1_fx = dotp_fx_ivas_fx( shb_synth_nonref_fx, *shb_synth_nonref_e, shb_synth_nonref_fx + 1, *shb_synth_nonref_e, L_FRAME16k - 3, &temp1_exp ); /* Q31-temp1_exp */ + temp2_fx = dotp_fx_ivas_fx( shb_synth_nonref_fx, *shb_synth_nonref_e, shb_synth_nonref_fx + 2, *shb_synth_nonref_e, L_FRAME16k - 3, &temp2_exp ); /* Q31-temp2_exp */ + temp3_fx = dotp_fx_ivas_fx( shb_synth_nonref_fx, *shb_synth_nonref_e, shb_synth_nonref_fx + 3, *shb_synth_nonref_e, L_FRAME16k - 3, &temp3_exp ); /* Q31-temp3_exp */ exp = s_max( *memShbSpecXcorr_e, s_max( s_max( s_max( temp00_exp, temp11_exp ), s_max( temp0_exp, temp1_exp ) ), s_max( temp2_exp, temp3_exp ) ) ); @@ -291,8 +291,19 @@ static Word16 ic_bwe_enc_specMapping_ivas_fx( *specMapping_fx = L_deposit_h( specMapping16 ); move32(); + max_exp = s_max( sub( *memShbSpecMapping_e, norm_l( *memShbSpecMapping_fx ) ), *shb_synth_nonref_e ); + + *memShbSpecMapping_fx = L_shl( *memShbSpecMapping_fx, sub( *memShbSpecMapping_e, max_exp ) ); // max_exp + move32(); + *memShbSpecMapping_e = max_exp; + move16(); + + scale_sig32( shb_synth_nonref_fx, L_FRAME16k, sub( *shb_synth_nonref_e, max_exp ) ); // max_exp + *shb_synth_nonref_e = max_exp; + move16(); + /* IC-BWE spec mapping */ - deemph_fx_32( 0, shb_synth_nonref_fx, extract_h( *specMapping_fx ), L_FRAME16k, memShbSpecMapping_fx ); + deemph_fx_32( shb_synth_nonref_fx, specMapping16, L_FRAME16k, memShbSpecMapping_fx ); // shb_synth_nonref_e return idx; } @@ -429,7 +440,7 @@ static void icbwe_dft_stereo_param_ivas_fx( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i : */ Encoder_State *st, /* i/o: */ Word32 *shb_synth_nonref_fx, /* i/o: Q31-shb_synth_nonref_e*/ - Word16 shb_synth_nonref_e /* i/o: */ + Word16 *shb_synth_nonref_e /* i/o: */ ) { Word16 slopeILD_fx; @@ -439,7 +450,7 @@ static void icbwe_dft_stereo_param_ivas_fx( Word32 *nrg_L_fx, *nrg_R_fx, *nrg_DMX_fx; Word32 sum_nrg_L_fx, sum_nrg_R_fx, sum_nrg_DMX_fx; const Word32 spec_table_fx[4] = { -1288490189, -858993459, -429496730, 0 }; // Q31 - const Word16 slope_table_fx16[4] = { -17788, -10577, -4822, 0 }; // Q13 + const Word16 slope_table_fx16[4] = { -278, -165, -75, 0 }; // Q7 BSTR_ENC_HANDLE hBstr = st->hBstr; normFac_fx = 1342177280; /* 1000 * (10/((14400+10400)/2 - (6400+10400)/2)) */ // Q29 @@ -505,6 +516,7 @@ static void icbwe_dft_stereo_param_ivas_fx( IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, WB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) ) { /* Spec Mapping Estimate */ + Word16 max_exp; Word16 tmp1, exp1; Word32 L_tmp, L_tmp1; L_tmp = Mpy_32_32( hStereoICBWE->mem_nrg_L_fx[1], hStereoICBWE->mem_nrg_R_fx[0] ); // hStereoICBWE->mem_nrg_L_fx_e[1] + hStereoICBWE->mem_nrg_R_fx_e[1] @@ -527,10 +539,20 @@ static void icbwe_dft_stereo_param_ivas_fx( } hStereoICBWE->prevSpecMapping_fx = spec_table_fx[spIndx]; // q31 - /* ic bwe spec mapping application */ - deemph_fx_32( 0, shb_synth_nonref_fx, extract_l( L_shr( hStereoICBWE->prevSpecMapping_fx, 16 ) ), L_FRAME16k, &hStereoICBWE->memShbSpecMapping_fx ); // shb_synth_nonref_e - hStereoICBWE->memShbSpecMapping_e = shb_synth_nonref_e; + + max_exp = s_max( *shb_synth_nonref_e, sub( hStereoICBWE->memShbSpecMapping_e, norm_l( hStereoICBWE->memShbSpecMapping_fx ) ) ); + + hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, sub( hStereoICBWE->memShbSpecMapping_e, max_exp ) ); // max_exp + move32(); + hStereoICBWE->memShbSpecMapping_e = max_exp; + move16(); + + scale_sig32( shb_synth_nonref_fx, L_FRAME16k, sub( *shb_synth_nonref_e, max_exp ) ); + *shb_synth_nonref_e = max_exp; move16(); + + /* ic bwe spec mapping application */ + deemph_fx_32( shb_synth_nonref_fx, extract_h( hStereoICBWE->prevSpecMapping_fx ), L_FRAME16k, &hStereoICBWE->memShbSpecMapping_fx ); // shb_synth_nonref_e } ELSE { @@ -572,7 +594,7 @@ static void icbwe_dft_stereo_param_ivas_fx( move32(); move16(); - gsIndx = ic_bwe_enc_gsMapping_ivas_fx( hStereoICBWE->gDes_pastFrame_fx, hStereoICBWE->gDes_pastFrame_e, hStereoICBWE->shbSynthRef_fx, hStereoICBWE->shbSynthRef_e, shb_synth_nonref_fx, &shb_synth_nonref_e, &( hStereoICBWE->prevgsMapping_fx ), &( hStereoICBWE->prevgsMapping_e ), hStereoICBWE->memGsEnerMap_fx, &hStereoICBWE->memGsEnerMap_e, st->element_mode ); /* Q0 */ + gsIndx = ic_bwe_enc_gsMapping_ivas_fx( hStereoICBWE->gDes_pastFrame_fx, hStereoICBWE->gDes_pastFrame_e, hStereoICBWE->shbSynthRef_fx, hStereoICBWE->shbSynthRef_e, shb_synth_nonref_fx, shb_synth_nonref_e, &( hStereoICBWE->prevgsMapping_fx ), &( hStereoICBWE->prevgsMapping_e ), hStereoICBWE->memGsEnerMap_fx, &hStereoICBWE->memGsEnerMap_e, st->element_mode ); /* Q0 */ hStereoICBWE->gDes_pastFrame_fx = L_deposit_h( gDes_fx ); /* Q31-exp */ hStereoICBWE->gDes_pastFrame_e = exp; @@ -712,7 +734,7 @@ void stereo_icBWE_enc_ivas_fx( test(); IF( LT_32( gTarget_fx, 268435456 ) || GT_32( gTarget_fx, 1073741824 ) ) // 0.5 in Q29 or 2.0 in Q29 { - v_multc_fixed( voice_factors_fx, 1073741824, nlMixFac_fx, NB_SUBFR16k ); // Q31, 0.5 in Q31 -> 1073741824 + v_multc_fx( voice_factors_fx, 1073741824, nlMixFac_fx, NB_SUBFR16k ); // Q31, 0.5 in Q31 -> 1073741824 } Word16 L_FRAME16k_by_nbSubFr = L_FRAME16k / NB_SUBFR; @@ -800,20 +822,16 @@ void stereo_icBWE_enc_ivas_fx( move16(); } - icbwe_dft_stereo_param_ivas_fx( hStereoICBWE, hStereoDft, st, shb_synth_nonref_fx, shb_synth_nonref_e ); + icbwe_dft_stereo_param_ivas_fx( hStereoICBWE, hStereoDft, st, shb_synth_nonref_fx, &shb_synth_nonref_e ); } ELSE { - max_e = s_max( hStereoICBWE->mem_shb_speech_nonref_e, shb_speech_nonref_e ); + max_e = s_max( hStereoICBWE->mem_shb_speech_ref_e, shb_speech_ref_e ); Copy_Scale_sig( hStereoICBWE->mem_shb_speech_ref_fx, hStereoICBWE->mem_shb_speech_ref_fx, L_LOOK_16k, negate( sub( max_e, hStereoICBWE->mem_shb_speech_ref_e ) ) ); // mem_shb_speech_ref_e set32_fx( shb_frame_ref_fx, 0, L_LOOK_16k + L_FRAME16k ); -#ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( hStereoICBWE->mem_shb_speech_ref_fx, shb_frame_ref_fx, L_LOOK_16k, add( negate( sub( max_e, hStereoICBWE->mem_shb_speech_ref_e ) ), Q16 ) ); // mem_shb_speech_ref_e -#else - Copy_Scale_sig_16_32_DEPREC( hStereoICBWE->mem_shb_speech_ref_fx, shb_frame_ref_fx, L_LOOK_16k, add( negate( sub( max_e, hStereoICBWE->mem_shb_speech_ref_e ) ), Q16 ) ); // mem_shb_speech_ref_e -#endif hStereoICBWE->mem_shb_speech_ref_e = max_e; shb_frame_ref_e = max_e; move16(); @@ -826,21 +844,16 @@ void stereo_icBWE_enc_ivas_fx( set32_fx( shb_frame_nonref_fx, 0, L_LOOK_16k + L_FRAME16k ); max_e = s_max( hStereoICBWE->mem_shb_speech_nonref_e, shb_speech_nonref_e ); - Copy_Scale_sig( hStereoICBWE->mem_shb_speech_nonref_fx, hStereoICBWE->mem_shb_speech_nonref_fx, L_LOOK_16k, negate( sub( max_e, hStereoICBWE->mem_shb_speech_nonref_e ) ) ); // mem_shb_speech_ref_e -#ifdef FIX_ISSUE_1237 + Copy_Scale_sig( hStereoICBWE->mem_shb_speech_nonref_fx, hStereoICBWE->mem_shb_speech_nonref_fx, L_LOOK_16k, negate( sub( max_e, hStereoICBWE->mem_shb_speech_nonref_e ) ) ); // mem_shb_speech_ref_e Copy_Scale_sig_16_32_no_sat( hStereoICBWE->mem_shb_speech_nonref_fx, shb_frame_nonref_fx, L_LOOK_16k, add( negate( sub( max_e, hStereoICBWE->mem_shb_speech_nonref_e ) ), Q16 ) ); // mem_shb_speech_ref_e -#else - Copy_Scale_sig_16_32_DEPREC( hStereoICBWE->mem_shb_speech_nonref_fx, shb_frame_nonref_fx, L_LOOK_16k, add( negate( sub( max_e, hStereoICBWE->mem_shb_speech_nonref_e ) ), Q16 ) ); // mem_shb_speech_ref_e -#endif hStereoICBWE->mem_shb_speech_nonref_e = max_e; shb_frame_nonref_e = max_e; move16(); move16(); /* shb_frame_ref_ICBWE @ (8.75 - shb_speech_delay (=1.25) ms) after shb_speech */ - Copy_Scale_sig32( shb_speech_nonref_fx, shb_frame_nonref_fx + L_LOOK_16k - nonRefMemLen, L_FRAME16k, negate( sub( max_e, shb_speech_nonref_e ) ) ); /* Q31-max_e */ - Copy_Scale_sig_32_16( shb_frame_nonref_fx + L_FRAME16k, hStereoICBWE->mem_shb_speech_nonref_fx, L_LOOK_16k, sub( negate( sub( max_e, hStereoICBWE->mem_shb_speech_ref_e ) ), Q16 ) ); // mem_shb_speech_ref_e - + Copy_Scale_sig32( shb_speech_nonref_fx, shb_frame_nonref_fx + L_LOOK_16k - nonRefMemLen, L_FRAME16k, negate( sub( max_e, shb_speech_nonref_e ) ) ); /* Q31-max_e */ + Copy_Scale_sig_32_16( shb_frame_nonref_fx + L_FRAME16k, hStereoICBWE->mem_shb_speech_nonref_fx, L_LOOK_16k, sub( negate( sub( max_e, hStereoICBWE->mem_shb_speech_nonref_e ) ), Q16 ) ); // mem_shb_speech_ref_e /* core switching reset */ test(); @@ -934,7 +947,7 @@ void stereo_icBWE_enc_ivas_fx( test(); IF( LT_32( gTarget_fx, 268435456 ) || GT_32( gTarget_fx, 1073741824 ) ) // 0.5 in Q29 & 2.0 in Q29 { - v_multc_fixed( voice_factors_fx, 1073741824 /*0.5 in Q31*/, nlMixFac_fx, NB_SUBFR16k ); /* Q31 */ + v_multc_fx( voice_factors_fx, 1073741824 /*0.5 in Q31*/, nlMixFac_fx, NB_SUBFR16k ); /* Q31 */ } Word16 L_FRAME16k_by_nbSubFr = L_FRAME16k / NB_SUBFR; @@ -1028,14 +1041,7 @@ void stereo_icBWE_enc_ivas_fx( IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, WB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) ) { /* IC BWE spectral mapping */ - Word32 max_abs_val; - maximum_abs_32_fx( shb_synth_nonref_fx, L_FRAME16k, &max_abs_val ); - IF( max_abs_val > 0 ) - { - scale_sig32( shb_synth_nonref_fx, L_FRAME16k, -1 ); - shb_synth_nonref_e = sub( shb_synth_nonref_e, -1 ); - } - spIndx = ic_bwe_enc_specMapping_ivas_fx( shb_frame_nonref_fx, shb_frame_nonref_e, shb_synth_nonref_fx, shb_synth_nonref_e, &( hStereoICBWE->prevSpecMapping_fx ), &( hStereoICBWE->memShbSpecMapping_fx ), hStereoICBWE->memShbSpecXcorr_fx, &( hStereoICBWE->memShbSpecXcorr_e ) ); /* Q0 */ + spIndx = ic_bwe_enc_specMapping_ivas_fx( shb_frame_nonref_fx, shb_frame_nonref_e, shb_synth_nonref_fx, &shb_synth_nonref_e, &( hStereoICBWE->prevSpecMapping_fx ), &( hStereoICBWE->memShbSpecMapping_fx ), &( hStereoICBWE->memShbSpecMapping_e ), hStereoICBWE->memShbSpecXcorr_fx, &( hStereoICBWE->memShbSpecXcorr_e ) ); /* Q0 */ } ELSE { @@ -1233,9 +1239,7 @@ void stereo_icBWE_preproc_fx( Word32 gD_fx; Word32 input_Fs; -#ifdef MSAN_FIX set16_fx( temp_inp_fx, 0, L_FRAME48k ); -#endif /* initialization */ hStereoTCA = hCPE->hStereoTCA; /* Stereo TCA encoder handle */ diff --git a/lib_enc/ivas_stereo_mdct_core_enc_fx.c b/lib_enc/ivas_stereo_mdct_core_enc_fx.c index b6857854222703856361681d216a5cddf98fe512..6bb6af1b3e249e69e1fa681a5250b752bf1095ac 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_core_enc_fx.c @@ -135,16 +135,17 @@ void stereo_mdct_core_enc_fx( { Word32 orig_spectrum_long_fx[CPE_CHANNELS][N_MAX]; /* MDCT output (L/R). */ Word32 *orig_spectrum_fx[CPE_CHANNELS][NB_DIV]; /* Pointers to MDCT output for a short block (L/R) */ - Word32 powerSpec_fx[CPE_CHANNELS][N_MAX]; - Word32 powerSpec_fx_tmp[CPE_CHANNELS][N_MAX]; /* This 32 bit buffer is created to preserve the precision for original separate Q calculation of powerSpec_fx buffer ( Related to 3gpp issue #1192 ) */ - Word32 *p_powerSpec_fx[CPE_CHANNELS]; - Word16 exp_powerSpec[CPE_CHANNELS][N_MAX + L_MDCT_OVLP_MAX]; - Word32 powerSpecMsInv_long_fx[CPE_CHANNELS][N_MAX]; /* MS inv power spectrum, also inverse MDST spectrum */ + Word64 powerSpec64[CPE_CHANNELS][N_MAX]; + Word16 exp_powerSpec64[CPE_CHANNELS][NB_DIV]; + Word32 powerSpecMsInv_long_fx[CPE_CHANNELS][N_MAX]; /* MS inv power spectrum, also inverse MDST spectrum */ + Word16 q_powerSpecMsInv_long_fx[CPE_CHANNELS][N_MAX]; /*Q: MS inv power spectrum, also inverse MDST spectrum */ Word32 *powerSpecMsInv_fx[CPE_CHANNELS][NB_DIV]; + Word16 *q_powerSpecMsInv_fx[CPE_CHANNELS][NB_DIV]; Word32 quantized_spectrum_long_fx[CPE_CHANNELS][N_MAX]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ Word32 *quantized_spectrum_fx[CPE_CHANNELS][NB_DIV]; Word32 *inv_mdst_spectrum_fx[CPE_CHANNELS][NB_DIV]; Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV]; + Word16 exp_inv_spectrum[CPE_CHANNELS]; Word16 i, ch, nSubframes, L_subframeTCX; Word16 n, nAvailBits; Word16 tnsSize[CPE_CHANNELS][NB_DIV]; /* number of tns parameters put into prm */ @@ -153,8 +154,6 @@ void stereo_mdct_core_enc_fx( Word32 *p_mdst_spectrum_long_fx[CPE_CHANNELS]; Word32 mdst_spectrum_long_fx[CPE_CHANNELS][N_MAX]; Word32 *mdst_spectrum_fx[CPE_CHANNELS][NB_DIV]; - Word16 q_powSpec[MCT_MAX_CHANNELS], q_powSpecMsInv[MCT_MAX_CHANNELS], q_spec, tmp_s; - Word16 tmp_q_powSpec[N_MAX], tmp_q_powSpecInv[N_MAX], *tmp_q_psi[2]; Word64 W_tmp; Encoder_State *st, **sts; STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct; @@ -178,25 +177,15 @@ void stereo_mdct_core_enc_fx( FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { -#ifdef MSAN_FIX set32_fx( mdst_spectrum_long_fx[ch], 0, N_MAX ); set32_fx( orig_spectrum_long_fx[ch], 0, N_MAX ); -#endif p_mdst_spectrum_long_fx[ch] = mdst_spectrum_long_fx[ch]; p_orig_spectrum_long_fx[ch] = orig_spectrum_long_fx[ch]; orig_spectrum_fx[ch][0] = orig_spectrum_long_fx[ch]; orig_spectrum_fx[ch][1] = orig_spectrum_long_fx[ch] + N_TCX10_MAX; - set16_fx( exp_powerSpec[ch], 0, N_MAX + L_MDCT_OVLP_MAX ); + set16_fx( exp_powerSpec64[ch], 0, NB_DIV ); } - set16_fx( tmp_q_powSpecInv, 63, N_MAX ); - set16_fx( tmp_q_powSpec, 63, N_MAX ); - set16_fx( q_powSpec, 31, MCT_MAX_CHANNELS ); - set16_fx( q_powSpecMsInv, 31, MCT_MAX_CHANNELS ); - - tmp_q_psi[0] = tmp_q_powSpecInv; - tmp_q_psi[1] = &tmp_q_powSpecInv[N_TCX10_MAX]; - sts = hCPE->hCoreCoder; hStereoMdct = hCPE->hStereoMdct; hBstr = sts[0]->hBstr; @@ -252,33 +241,38 @@ void stereo_mdct_core_enc_fx( hCPE->hStereoMdct->stbParamsTCX20.nBandsStereoCore = hCPE->hStereoMdct->stbParamsTCX20.sfbCnt; move16(); } - + Word16 len = extract_l( Mpy_32_32( sts[0]->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + Word16 q_com = s_min( s_min( add( sts[0]->q_inp, getScaleFactor16( sts[0]->input_fx, add( len, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ) ), add( sts[0]->q_old_inp, getScaleFactor16( sts[0]->old_input_signal_fx, len ) ) ), + s_min( add( sts[1]->q_inp, getScaleFactor16( sts[1]->input_fx, add( len, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ) ), add( sts[1]->q_old_inp, getScaleFactor16( sts[1]->old_input_signal_fx, len ) ) ) ); + q_com = sub( q_com, Q1 ); FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { inv_mdst_spectrum_fx[ch][0] = powerSpecMsInv_fx[ch][0] = powerSpecMsInv_long_fx[ch]; inv_mdst_spectrum_fx[ch][1] = powerSpecMsInv_fx[ch][1] = powerSpecMsInv_long_fx[ch] + N_TCX10_MAX; + q_powerSpecMsInv_fx[ch][0] = q_powerSpecMsInv_long_fx[ch]; + q_powerSpecMsInv_fx[ch][1] = q_powerSpecMsInv_long_fx[ch] + N_TCX10_MAX; + set16_fx( q_powerSpecMsInv_long_fx[ch], 63, N_MAX ); quantized_spectrum_fx[ch][0] = quantized_spectrum_long_fx[ch]; quantized_spectrum_fx[ch][1] = quantized_spectrum_long_fx[ch] + N_TCX10_MAX; inv_spectrum_fx[ch][0] = quantized_spectrum_fx[ch][0]; inv_spectrum_fx[ch][1] = quantized_spectrum_fx[ch][1]; mdst_spectrum_fx[ch][0] = mdst_spectrum_long_fx[ch]; mdst_spectrum_fx[ch][1] = mdst_spectrum_long_fx[ch] + N_TCX10_MAX; + set64_fx( powerSpec64[ch], 0, N_MAX ); set32_fx( powerSpecMsInv_long_fx[ch], 0, N_MAX ); set32_fx( quantized_spectrum_long_fx[ch], 0, N_MAX ); set32_fx( mdst_spectrum_long_fx[ch], 0, N_MAX ); - set32_fx( powerSpec_fx[ch], 0, N_MAX ); - set32_fx( powerSpec_fx_tmp[ch], 0, N_MAX ); set32_fx( powerSpecMsInv_long_fx[ch], 0, N_MAX ); sts[ch]->hTcxEnc->tns_ms_flag[0] = 0; move16(); sts[ch]->hTcxEnc->tns_ms_flag[1] = 0; move16(); - Scale_sig( sts[ch]->input_fx, add( extract_l( Mpy_32_32( sts[ch]->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ), NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), negate( sts[ch]->q_inp ) ); /* Q0 */ - Scale_sig( sts[ch]->old_input_signal_fx, extract_l( Mpy_32_32( sts[ch]->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ), negate( sts[ch]->q_old_inp ) ); /* Q0 */ - sts[ch]->q_old_inp = 0; + scale_sig( sts[ch]->input_fx, add( extract_l( Mpy_32_32( sts[ch]->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ), NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), sub( q_com, sts[ch]->q_inp ) ); /* q_com */ + scale_sig( sts[ch]->old_input_signal_fx, extract_l( Mpy_32_32( sts[ch]->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ), sub( q_com, sts[ch]->q_old_inp ) ); /* q_com */ + sts[ch]->q_old_inp = q_com; move16(); - sts[ch]->q_inp = 0; + sts[ch]->q_inp = q_com; move16(); } @@ -347,48 +341,74 @@ void stereo_mdct_core_enc_fx( IF( !hStereoMdct->isSBAStereoMode ) { /* Common q for mdst_spectrum and spectrum */ - Word16 k; - q_spec = 0; + Word16 exp1, exp2; Word16 length; + + /*find headroom to increase precision*/ + exp1 = MIN_16; + exp2 = MIN_16; + move16(); + move16(); FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - FOR( k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + length = sts[ch]->hTcxEnc->spectrum_length; + move16(); + if ( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) { - q_spec = s_max( q_spec, sts[ch]->hTcxEnc->spectrum_e[k] ); - q_spec = s_max( q_spec, mdst_spectrum_e[ch][k] ); + length = shr( length, 1 ); + } + + exp1 = s_max( exp1, sub( sts[ch]->hTcxEnc->spectrum_e[0], L_norm_arr( sts[ch]->hTcxEnc->spectrum_fx[0], length ) ) ); + exp2 = s_max( exp2, sub( mdst_spectrum_e[ch][0], L_norm_arr( mdst_spectrum_fx[ch][0], length ) ) ); + + IF( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) + { + exp1 = s_max( exp1, sub( sts[ch]->hTcxEnc->spectrum_e[1], L_norm_arr( sts[ch]->hTcxEnc->spectrum_fx[1], length ) ) ); + exp2 = s_max( exp2, sub( mdst_spectrum_e[ch][1], L_norm_arr( mdst_spectrum_fx[ch][1], length ) ) ); } } - q_spec = sub( Q31, q_spec ); + + exp1 = add( exp1, 2 ); /* 2 guard bit to avoid over-flows in stereo_coder_tcx_fx */ + exp2 = add( exp2, 2 ); /* 2 guard bit to avoid over-flows in stereo_coder_tcx_fx (ms_processing_fx) */ FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - Word16 n_sb = NB_DIV; + length = sts[ch]->hTcxEnc->spectrum_length; move16(); - if ( EQ_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) + if ( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) { - n_sb = 1; - move16(); + length = shr( length, 1 ); } - length = idiv1616( sts[ch]->hTcxEnc->L_frameTCX, n_sb ); /* Q0 */ - FOR( k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + scale_sig32( sts[ch]->hTcxEnc->spectrum_fx[0], length, sub( sts[ch]->hTcxEnc->spectrum_e[0], exp1 ) ); /* exp1 */ + sts[ch]->hTcxEnc->spectrum_e[0] = exp1; + scale_sig32( mdst_spectrum_fx[ch][0], length, sub( mdst_spectrum_e[ch][0], exp2 ) ); /* exp2 */ + mdst_spectrum_e[ch][0] = exp2; + IF( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) { - Scale_sig32( sts[ch]->hTcxEnc->spectrum_fx[k], length, sub( q_spec, sub( Q31, sts[ch]->hTcxEnc->spectrum_e[k] ) ) ); /* q_spec */ - sts[ch]->hTcxEnc->spectrum_e[k] = sub( Q31, q_spec ); - Scale_sig32( mdst_spectrum_fx[ch][k], length, sub( q_spec, sub( Q31, mdst_spectrum_e[ch][k] ) ) ); /* q_spec */ - mdst_spectrum_e[ch][k] = sub( Q31, q_spec ); + scale_sig32( sts[ch]->hTcxEnc->spectrum_fx[1], length, sub( sts[ch]->hTcxEnc->spectrum_e[1], exp1 ) ); /* exp1 */ + sts[ch]->hTcxEnc->spectrum_e[1] = exp1; + scale_sig32( mdst_spectrum_fx[ch][1], length, sub( mdst_spectrum_e[ch][1], exp2 ) ); /* exp2 */ + mdst_spectrum_e[ch][1] = exp2; } } - stereo_coder_tcx_fx( hStereoMdct, sts, ms_mask, mdst_spectrum_fx, inv_spectrum_fx, inv_mdst_spectrum_fx, 0, q_spec ); + stereo_coder_tcx_fx( hStereoMdct, sts, ms_mask, mdst_spectrum_fx, inv_spectrum_fx, inv_mdst_spectrum_fx, 0, sts[0]->hTcxEnc->spectrum_e[0], mdst_spectrum_e[0][0] ); + exp_inv_spectrum[0] = exp_inv_spectrum[1] = sts[0]->hTcxEnc->spectrum_e[0]; + move16(); + move16(); } /*--------------------------------------------------------------* * Power spectrum calculation *---------------------------------------------------------------*/ - Word16 length; + Word16 length, exp, shift1, shift2, norm; + Word32 mdct, mdst, imdct, imdst; FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { + L_subframeTCX = shr( sts[ch]->hTcxEnc->L_frameTCX, 1 ); /* Q0 */ + nSubframes = NB_DIV; + move16(); IF( EQ_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) { nSubframes = 1; @@ -396,12 +416,6 @@ void stereo_mdct_core_enc_fx( move16(); move16(); } - ELSE - { - nSubframes = NB_DIV; - move16(); - L_subframeTCX = shr( sts[ch]->hTcxEnc->L_frameTCX, 1 ); /* Q0 */ - } /* in MCT only relevant for bitrate switching from non-MCT bitrates */ IF( EQ_16( sts[ch]->last_core, ACELP_CORE ) ) @@ -411,136 +425,89 @@ void stereo_mdct_core_enc_fx( FOR( n = 0; n < nSubframes; n++ ) { - q_spec = sub( 31, sts[ch]->hTcxEnc->spectrum_e[n] ); - IF( sts[ch]->hTcxEnc->tns_ms_flag[n] ) { + exp = add( s_max( mdst_spectrum_e[ch][n], sts[ch]->hTcxEnc->spectrum_e[n] ), 1 ); + shift1 = sub( mdst_spectrum_e[ch][n], exp ); + shift2 = sub( sts[ch]->hTcxEnc->spectrum_e[n], exp ); + /* power spectrum: MDCT^2 + MDST^2 */ FOR( i = 0; i < L_subframeTCX; i++ ) { - W_tmp = W_mac_32_32( W_mult_32_32( mdst_spectrum_fx[ch][n][i], mdst_spectrum_fx[ch][n][i] ), sts[ch]->hTcxEnc->spectrum_fx[n][i], sts[ch]->hTcxEnc->spectrum_fx[n][i] ); /* 2*q_spec+1 */ - tmp_s = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, tmp_s ); /* 2*q_spec+1+tmp_s */ - powerSpec_fx[ch][( i + ( n * L_subframeTCX ) )] = W_extract_h( W_tmp ); /* 2*q_spec+1+tmp_s-32 */ - tmp_q_powSpec[( i + ( n * L_subframeTCX ) )] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + mdst = L_shl( mdst_spectrum_fx[ch][n][i], shift1 ); // exp: exp + mdct = L_shl( sts[ch]->hTcxEnc->spectrum_fx[n][i], shift2 ); // exp: exp + imdst = L_shl( inv_mdst_spectrum_fx[ch][n][i], shift1 ); // exp: exp + imdct = L_shl( inv_spectrum_fx[ch][n][i], shift2 ); // exp: exp + + W_tmp = W_mac_32_32( W_mult_32_32( imdct, imdct ), imdst, imdst ); // exp: 2*exp + norm = W_norm( W_tmp ); + powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*exp-norm + q_powerSpecMsInv_fx[ch][n][i] = sub( 31, sub( shl( exp, 1 ), norm ) ); move32(); move16(); - W_tmp = W_mac_32_32( W_mult_32_32( inv_mdst_spectrum_fx[ch][n][i], inv_mdst_spectrum_fx[ch][n][i] ), inv_spectrum_fx[ch][n][i], inv_spectrum_fx[ch][n][i] ); /* 2*q_spec+1 */ - tmp_s = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, tmp_s ); /* 2*q_spec+1+tmp_s */ - powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_tmp ); /* 2*q_spec+1+tmp_s-32 */ - tmp_q_psi[n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 - move32(); - move16(); + powerSpec64[ch][i + n * L_subframeTCX] = W_mac_32_32( W_mult_32_32( mdct, mdct ), mdst, mdst ); // exp: 2*exp + move64(); } + exp_powerSpec64[ch][n] = shl( exp, 1 ); + move16(); } ELSE { IF( NE_16( hStereoMdct->mdct_stereo_mode[n], SMDCT_DUAL_MONO ) ) { + exp = shl( add( sts[ch]->hTcxEnc->spectrum_e[n], 1 ), 1 ); // 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1) /* power spectrum: MDCT^2 + MDST^2 */ - W_tmp = W_mult_32_32( inv_spectrum_fx[ch][n][0], inv_spectrum_fx[ch][n][0] ); /* 2*q_spec+1 */ - tmp_s = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, tmp_s ); /* 2*q_spec+1+tmp_s */ - powerSpecMsInv_fx[ch][n][0] = W_extract_h( W_tmp ); /* 2*q_spec+1+tmp_s-32 */ - tmp_q_psi[n][0] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + mdct = L_shr( inv_spectrum_fx[ch][n][0], 1 ); // exp: sts[ch]->hTcxEnc->spectrum_e[n]+1 + W_tmp = W_mult_32_32( mdct, mdct ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1) (exp) + norm = W_norm( W_tmp ); + powerSpecMsInv_fx[ch][n][0] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1)-norm (exp-norm) + q_powerSpecMsInv_fx[ch][n][0] = sub( 31, sub( exp, norm ) ); move32(); move16(); FOR( i = 1; i < L_subframeTCX - 1; i++ ) { - Word32 mdst_fx = L_sub( inv_spectrum_fx[ch][n][i + 1], inv_spectrum_fx[ch][n][i - 1] ); /* An MDST estimate q_spec*/ - - W_tmp = W_mac_32_32( W_mult_32_32( mdst_fx, mdst_fx ), inv_spectrum_fx[ch][n][i], inv_spectrum_fx[ch][n][i] ); /* 2*q_spec+1 */ - tmp_s = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, tmp_s ); /* 2*q_spec+1+tmp_s */ - powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_tmp ); /* 2*q_spec+1+tmp_s-32 */ - tmp_q_psi[n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + /* float mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); + powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; */ + mdst = L_sub( L_shr( inv_spectrum_fx[ch][n][i + 1], 1 ), L_shr( inv_spectrum_fx[ch][n][i - 1], 1 ) ); // exp: sts[ch]->hTcxEnc->spectrum_e[n]+1 + mdct = L_shr( inv_spectrum_fx[ch][n][i], 1 ); // exp: sts[ch]->hTcxEnc->spectrum_e[n]+1 + W_tmp = W_mac_32_32( W_mult_32_32( mdst, mdst ), mdct, mdct ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1) (exp) + norm = W_norm( W_tmp ); + powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1)-norm (exp-norm) + q_powerSpecMsInv_fx[ch][n][i] = sub( 31, sub( exp, norm ) ); move32(); move16(); } - W_tmp = W_mult_32_32( inv_spectrum_fx[ch][n][L_subframeTCX - 1], inv_spectrum_fx[ch][n][L_subframeTCX - 1] ); /* 2*q_spec+1 */ - tmp_s = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, tmp_s ); /* 2*q_spec+1+tmp_s */ - powerSpecMsInv_fx[ch][n][L_subframeTCX - 1] = W_extract_h( W_tmp ); /* 2*q_spec+1+tmp_s-32 */ - tmp_q_psi[n][L_subframeTCX - 1] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + mdct = L_shr( inv_spectrum_fx[ch][n][L_subframeTCX - 1], 1 ); // exp: sts[ch]->hTcxEnc->spectrum_e[n]+1 + W_tmp = W_mult_32_32( mdct, mdct ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1) (exp) + norm = W_norm( W_tmp ); + powerSpecMsInv_fx[ch][n][L_subframeTCX - 1] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1)-norm (exp-norm) + q_powerSpecMsInv_fx[ch][n][L_subframeTCX - 1] = sub( 31, sub( exp, norm ) ); move32(); move16(); } /* power spectrum: MDCT^2 + MDST^2 */ - W_tmp = W_mult_32_32( sts[ch]->hTcxEnc->spectrum_fx[n][0], sts[ch]->hTcxEnc->spectrum_fx[n][0] ); /* 2*q_spec+1 */ - tmp_s = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, tmp_s ); /* 2*q_spec+1+tmp_s */ - powerSpec_fx[ch][n * L_subframeTCX] = W_extract_h( W_tmp ); /* 2*q_spec+1+tmp_s-32 */ - tmp_q_powSpec[n * L_subframeTCX] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 - move32(); - move16(); + mdct = L_shr( sts[ch]->hTcxEnc->spectrum_fx[n][0], 1 ); // exp: sts[ch]->hTcxEnc->spectrum_e[n]+1 + powerSpec64[ch][n * L_subframeTCX] = W_mult_32_32( mdct, mdct ); // exp: 2(sts[ch]->hTcxEnc->spectrum_e[n]+1) + move64(); FOR( i = 1; i < L_subframeTCX - 1; i++ ) { - Word32 mdst_fx = L_sub( sts[ch]->hTcxEnc->spectrum_fx[n][i + 1], sts[ch]->hTcxEnc->spectrum_fx[n][i - 1] ); /* An MDST estimate q_spec*/ - - W_tmp = W_mac_32_32( W_mult_32_32( mdst_fx, mdst_fx ), sts[ch]->hTcxEnc->spectrum_fx[n][i], sts[ch]->hTcxEnc->spectrum_fx[n][i] ); /* 2*q_spec+1 */ - tmp_s = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, tmp_s ); /* 2*q_spec+1+tmp_s */ - powerSpec_fx[ch][( i + ( n * L_subframeTCX ) )] = W_extract_h( W_tmp ); /* 2*q_spec+1+tmp_s-32 */ - tmp_q_powSpec[( i + ( n * L_subframeTCX ) )] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 - move32(); - move16(); + mdct = L_shr( sts[ch]->hTcxEnc->spectrum_fx[n][i], 1 ); // exp: sts[ch]->hTcxEnc->spectrum_e[n]+1 + mdst = L_sub( L_shr( sts[ch]->hTcxEnc->spectrum_fx[n][i + 1], 1 ), L_shr( sts[ch]->hTcxEnc->spectrum_fx[n][i - 1], 1 ) ); // exp: sts[ch]->hTcxEnc->spectrum_e[n]+1 + powerSpec64[ch][i + n * L_subframeTCX] = W_mac_32_32( W_mult_32_32( mdct, mdct ), mdst, mdst ); // exp: 2(sts[ch]->hTcxEnc->spectrum_e[n]+1) + move64(); } - W_tmp = W_mult_32_32( sts[ch]->hTcxEnc->spectrum_fx[n][L_subframeTCX - 1], sts[ch]->hTcxEnc->spectrum_fx[n][L_subframeTCX - 1] ); /* 2*q_spec+1 */ - tmp_s = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, tmp_s ); /* 2*q_spec+1+tmp_s */ - powerSpec_fx[ch][( ( L_subframeTCX - 1 ) + ( n * L_subframeTCX ) )] = W_extract_h( W_tmp ); /* 2*q_spec+1+tmp_s-32 */ - tmp_q_powSpec[( ( L_subframeTCX - 1 ) + ( n * L_subframeTCX ) )] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 - move32(); - move16(); - } - } + mdct = L_shr( sts[ch]->hTcxEnc->spectrum_fx[n][L_subframeTCX - 1], 1 ); // exp: sts[ch]->hTcxEnc->spectrum_e[n]+1 + powerSpec64[ch][L_subframeTCX - 1 + n * L_subframeTCX] = W_mult_32_32( mdct, mdct ); // exp: 2(sts[ch]->hTcxEnc->spectrum_e[n]+1) + move64(); - /* Aligning the Q-factors */ - { - q_powSpec[ch] = Q31; - q_powSpecMsInv[ch] = Q31; - move16(); - move16(); - FOR( i = 0; i < N_MAX; i++ ) - { - IF( powerSpec_fx[ch][i] != 0 ) - { - q_powSpec[ch] = s_min( q_powSpec[ch], tmp_q_powSpec[i] ); - move16(); - exp_powerSpec[ch][i] = sub( Q31, tmp_q_powSpec[i] ); - move16(); - } - } - FOR( n = 0; n < nSubframes; n++ ) - { - FOR( i = 0; i < L_subframeTCX; i++ ) - { - IF( powerSpecMsInv_fx[ch][n][i] != 0 ) - { - q_powSpecMsInv[ch] = s_min( q_powSpecMsInv[ch], tmp_q_psi[n][i] ); - move16(); - } - } - } - - FOR( n = 0; n < nSubframes; n++ ) - { - FOR( i = 0; i < L_subframeTCX; i++ ) - { - powerSpecMsInv_fx[ch][n][i] = L_shr_sat( powerSpecMsInv_fx[ch][n][i], sub( tmp_q_psi[n][i], q_powSpecMsInv[ch] ) ); - /* Here precision is preserved for powerSpec_fx buffer by storing the fixed Q copy of same buffer in powerSpec_fx_tmp buffer */ - /* powerSpec_fx implementation has separate Q for each index, powerSpec_fx_tmp has all indices in same Q beyond this point */ - powerSpec_fx_tmp[ch][( i + ( n * L_subframeTCX ) )] = L_shr( powerSpec_fx[ch][( i + ( n * L_subframeTCX ) )], sub( tmp_q_powSpec[i + ( n * L_subframeTCX )], q_powSpec[ch] ) ); /* q_powSpec */ - move32(); - move32(); - } + exp_powerSpec64[ch][n] = shl( add( sts[ch]->hTcxEnc->spectrum_e[n], 1 ), 1 ); + move16(); } } } @@ -574,8 +541,9 @@ void stereo_mdct_core_enc_fx( * and quantization (0: tonal, 1: noise-like). * * Detect low pass if present. * *-----------------------------------------------------------*/ - ComputeSpectrumNoiseMeasure_fx( powerSpec_fx_tmp[ch], L_subframeTCX, i_mult( st->hTcxEnc->nmStartLine, idiv1616( L_subframeTCX, st->hTcxEnc->L_frameTCX ) ), - NE_32( imult3216( st->last_sr_core, st->L_frame ), imult3216( st->sr_core, st->L_frame_past ) ) || NE_16( st->last_core, TCX_20_CORE ), st->hTcxEnc->memQuantZeros, L_subframeTCX ); + ComputeSpectrumNoiseMeasure_ivas_fx( powerSpec64[ch], L_subframeTCX, i_mult( st->hTcxEnc->nmStartLine, idiv1616( L_subframeTCX, st->hTcxEnc->L_frameTCX ) ), + NE_32( imult3216( st->last_sr_core, st->L_frame ), imult3216( st->sr_core, st->L_frame_past ) ) || NE_16( st->last_core, TCX_20_CORE ), + st->hTcxEnc->memQuantZeros, L_subframeTCX ); } st->hTcxEnc->measuredBwRatio = ONE_IN_Q14; /* No bandwidth limit for the noise filling Q14*/ @@ -608,53 +576,95 @@ void stereo_mdct_core_enc_fx( IF( ( NE_16( hStereoMdct->mdct_stereo_mode[n], hStereoMdct->IGFStereoMode[n] ) || EQ_16( hStereoMdct->mdct_stereo_mode[n], SMDCT_BW_MS ) ) && !hStereoMdct->isSBAStereoMode ) { IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS]; - p_powerSpec_fx[0] = powerSpec_fx_tmp[0]; - p_powerSpec_fx[1] = powerSpec_fx_tmp[1]; - hIGFEnc[0] = sts[0]->hIGFEnc; - hIGFEnc[1] = sts[1]->hIGFEnc; - - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + Word32 powerSpec_fx[CPE_CHANNELS][N_MAX], *p_powerSpec_fx[CPE_CHANNELS]; + Word16 exp_powSpec[CPE_CHANNELS][N_MAX], *p_exp_powSpec[CPE_CHANNELS]; + p_powerSpec_fx[0] = powerSpec_fx[0]; + p_exp_powSpec[0] = exp_powSpec[0]; + p_powerSpec_fx[1] = powerSpec_fx[1]; + p_exp_powSpec[1] = exp_powSpec[1]; { - q_spec = sub( Q31, sts[ch]->hTcxEnc->spectrum_e[n] ); - Word16 q_comm = s_min( sub( Q31, sts[ch]->hTcxEnc->spectrum_e[n] ), s_min( q_powSpec[ch], q_powSpecMsInv[ch] ) ); - Word16 n_sb = NB_DIV; - move16(); - if ( EQ_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) + /* Copy powerSpec values from 64 bit buffer to 32 bit buffer */ + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - n_sb = 1; + Word16 n1, nsub = 1; + length = sts[ch]->hTcxEnc->L_frameTCX; move16(); - } - length = idiv1616( sts[ch]->hTcxEnc->L_frameTCX, n_sb ); /* Q0 */ - IF( NE_16( q_spec, q_comm ) ) - { - Scale_sig32( sts[ch]->hTcxEnc->spectrum_fx[n], length, sub( q_comm, q_spec ) ); /* q_powSpec */ - Scale_sig32( inv_spectrum_fx[ch][n], length, sub( q_comm, q_spec ) ); /* q_powSpec */ - sts[ch]->hTcxEnc->spectrum_e[n] = sub( Q31, q_comm ); - move16(); - } - IF( NE_16( q_powSpec[ch], q_comm ) ) - { - Scale_sig32( &p_powerSpec_fx[ch][0], L_subframeTCX, sub( q_comm, q_powSpec[ch] ) ); /* q_spec */ - q_powSpec[ch] = q_comm; - move16(); - } - IF( NE_16( q_powSpecMsInv[ch], q_comm ) ) - { - Scale_sig32( powerSpecMsInv_fx[ch][0], L_subframeTCX, sub( q_comm, q_powSpecMsInv[ch] ) ); /* q_spec */ - q_powSpecMsInv[ch] = q_comm; move16(); + IF( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) + { + length = shr( sts[ch]->hTcxEnc->L_frameTCX, 1 ); + nsub = NB_DIV; + move16(); + } + IF( EQ_16( sts[ch]->last_core, ACELP_CORE ) ) + { + length = add( length, shr( length, 2 ) ); + } + FOR( n1 = 0; n1 < nsub; n1++ ) + { + FOR( i = 0; i < length; i++ ) + { + /* This doesn't result in saturation */ + shift1 = W_norm( powerSpec64[ch][i + n1 * length] ); + powerSpec_fx[ch][i + n1 * length] = W_extract_h( W_shl( powerSpec64[ch][i + n1 * length], shift1 ) ); // exp: exp + move32(); + exp_powSpec[ch][i + n1 * length] = sub( exp_powerSpec64[ch][n1], shift1 ); + } + } + set32_fx( powerSpec_fx[ch] + length, 0, sub( N_MAX, length ) ); + set16_fx( exp_powSpec[ch] + length, 0, sub( N_MAX, length ) ); } } + + hIGFEnc[0] = sts[0]->hIGFEnc; + hIGFEnc[1] = sts[1]->hIGFEnc; hIGFEnc[0]->spec_be_igf_e = p_orig_spectrum_e[0]; - move16(); hIGFEnc[1]->spec_be_igf_e = p_orig_spectrum_e[1]; move16(); - ProcessStereoIGF_fx( hStereoMdct, sts, ms_mask, - orig_spectrum_fx, sub( Q31, p_orig_spectrum_e[0] ), sub( Q31, p_orig_spectrum_e[1] ), - p_powerSpec_fx, powerSpecMsInv_fx, inv_spectrum_fx, n, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->element_brate, 0 ); + move16(); + + ProcessStereoIGF_fx( hStereoMdct, sts, ms_mask, orig_spectrum_fx, sub( Q31, p_orig_spectrum_e[0] ), sub( Q31, p_orig_spectrum_e[1] ), + p_powerSpec_fx, p_exp_powSpec, powerSpecMsInv_fx, q_powerSpecMsInv_fx, inv_spectrum_fx, exp_inv_spectrum, + n, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->element_brate, 0 ); } ELSE { + Word32 powerSpec_fx[CPE_CHANNELS][N_MAX]; // each value has a different exponent + Word16 exp_powerSpec[CPE_CHANNELS][N_MAX]; + { + /* Copy powerSpec values from 64 bit buffer to 32 bit buffer */ + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + Word16 n1, nsub; + nsub = 1; + length = sts[ch]->hTcxEnc->L_frameTCX; + move16(); + move16(); + IF( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) + { + length = shr( sts[ch]->hTcxEnc->L_frameTCX, 1 ); + nsub = NB_DIV; + move16(); + } + IF( EQ_16( sts[ch]->last_core, ACELP_CORE ) ) + { + length = add( length, shr( length, 2 ) ); + } + FOR( n1 = 0; n1 < nsub; n1++ ) + { + FOR( i = 0; i < length; i++ ) + { + norm = W_norm( powerSpec64[ch][i + n1 * length] ); + powerSpec_fx[ch][i + n1 * length] = W_extract_h( W_shl( powerSpec64[ch][i + n1 * length], norm ) ); // exp = exp_powerSpec64[ch][n1]-norm + exp_powerSpec[ch][i + n1 * length] = sub( exp_powerSpec64[ch][n1], norm ); + move32(); + move16(); + } + } + set32_fx( powerSpec_fx[ch] + length, 0, sub( N_MAX, length ) ); + set16_fx( exp_powerSpec[ch] + length, 0, sub( N_MAX, length ) ); + } + } FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; @@ -674,17 +684,49 @@ void stereo_mdct_core_enc_fx( q_spectrum = sub( Q31, st->hTcxEnc->spectrum_e[n] ); Scale_sig32( orig_spectrum_fx[ch][n], st->hIGFEnc->infoStopLine, sub( q_spectrum, sub( Q31, p_orig_spectrum_e[ch] ) ) ); /* q_spectrum */ -#ifndef MSAN_FIX - ProcessIGF_ivas_fx( st, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); -#else - ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); -#endif + ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); } } } } ELSE { + Word32 powerSpec_fx[CPE_CHANNELS][N_MAX]; // each value has a different exponent + Word16 exp_powerSpec[CPE_CHANNELS][N_MAX + L_MDCT_OVLP_MAX]; + { + /* Copy powerSpec values from 64 bit buffer to 32 bit buffer */ + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + Word16 n1, nsub; + nsub = 1; + length = sts[ch]->hTcxEnc->L_frameTCX; + move16(); + move16(); + IF( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) + { + length = shr( sts[ch]->hTcxEnc->L_frameTCX, 1 ); + nsub = NB_DIV; + move16(); + } + IF( EQ_16( sts[ch]->last_core, ACELP_CORE ) ) + { + length = add( length, shr( length, 2 ) ); + } + FOR( n1 = 0; n1 < nsub; n1++ ) + { + FOR( i = 0; i < length; i++ ) + { + norm = W_norm( powerSpec64[ch][i + n1 * length] ); + powerSpec_fx[ch][i + n1 * length] = W_extract_h( W_shl( powerSpec64[ch][i + n1 * length], norm ) ); // exp = exp_powerSpec64[ch][n1]-norm + exp_powerSpec[ch][i + n1 * length] = sub( exp_powerSpec64[ch][n1], norm ); + move32(); + move16(); + } + } + set32_fx( powerSpec_fx[ch] + length, 0, sub( N_MAX, length ) ); + set16_fx( exp_powerSpec[ch] + length, 0, sub( N_MAX + L_MDCT_OVLP_MAX, length ) ); + } + } FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; @@ -719,11 +761,7 @@ void stereo_mdct_core_enc_fx( Scale_sig32( orig_spectrum_fx[ch][n], st->hIGFEnc->infoStopLine, sub( q_spectrum, sub( Q31, p_orig_spectrum_e[ch] ) ) ); /* q_spectrum */ -#ifndef MSAN_FIX - ProcessIGF_ivas_fx( st, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); -#else - ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); -#endif + ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); } } } @@ -754,7 +792,6 @@ void stereo_mdct_core_enc_fx( * Split available bits between channels *---------------------------------------------------------------*/ - Word16 q_com; FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { Word16 n_sb = NB_DIV; diff --git a/lib_enc/ivas_stereo_mdct_igf_enc_fx.c b/lib_enc/ivas_stereo_mdct_igf_enc_fx.c index 851df60d532327c819ce1f4d60abca6127ce0de8..d22e1b885b7791d5cdadd3e62de61d00262b0588 100644 --- a/lib_enc/ivas_stereo_mdct_igf_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_igf_enc_fx.c @@ -80,13 +80,13 @@ static Word16 calcCoh_fx( // Q15 move16(); q_cc = q_ener1; move16(); - ener1_fx = dotp_fixed_o( sig1_fx, sig1_fx, nSamples, gB, &q_ener1 ); /* q_ener1 */ - ener2_fx = dotp_fixed_o( sig2_fx, sig2_fx, nSamples, gB, &q_ener2 ); /* q_ener2 */ - cEner_fx = Mpy_32_32( ener1_fx, ener2_fx ); /* q_ener1+q_ener2-31 */ + ener1_fx = dotp_fx32_o( sig1_fx, sig1_fx, nSamples, gB, &q_ener1 ); /* q_ener1 */ + ener2_fx = dotp_fx32_o( sig2_fx, sig2_fx, nSamples, gB, &q_ener2 ); /* q_ener2 */ + cEner_fx = Mpy_32_32( ener1_fx, ener2_fx ); /* q_ener1+q_ener2-31 */ q_cEner = sub( 62, add( q_ener1, q_ener2 ) ); cEner_fx = Sqrt32( cEner_fx, &q_cEner ); /* Q31-q_cEner */ q_cEner = sub( Q31, q_cEner ); - cc_fx = dotp_fixed_o( sig1_fx, sig2_fx, nSamples, gB, &q_cc ); /* q_cc */ + cc_fx = dotp_fx32_o( sig1_fx, sig2_fx, nSamples, gB, &q_cc ); /* q_cc */ IF( corr != NULL ) { @@ -166,12 +166,10 @@ static void IGF_MsStereoDecision_fx( Word16 pc_target_e, pc_src_e; Word16 tmp1, tmp1_e, tmp2, tmp2_e; -#ifdef MSAN_FIX pc_target_e = 0; pc_src_e = 0; move16(); move16(); -#endif // MSAN_FIX Word16 coh_src = calcCoh_fx( &specL_fx[strt_cpy], &specR_fx[strt_cpy], q_spec, width, &cc_src_fx, &cc_src_e, &pc_src_fx, &pc_src_e ); Word16 coh_target = calcCoh_fx( &specL_fx[hGrid->swb_offset[sfb]], &specR_fx[hGrid->swb_offset[sfb]], q_spec, width, &cc_target_fx, &cc_target_e, &pc_target_fx, &pc_target_e ); diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c b/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c index a61b2b0106170638a85e848080f6176e5ce661d5..d53eb365d3dcca44ca72231143fec4127c002df0 100644 --- a/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c @@ -39,7 +39,6 @@ #include "prot_fx.h" #include "prot_fx_enc.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" #include "ivas_rom_enc.h" #include "wmc_auto.h" #include "stat_enc.h" @@ -190,7 +189,8 @@ void stereo_coder_tcx_fx( Word32 *inv_mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ // Q( q_spec ) (same as spectrum buffer in hTcxEnc) const Word16 mct_on, /* i : flag mct block (1) or stereo (0) Q0*/ - Word16 q_spec ) + Word16 exp_spec, + Word16 exp_mdct_spec ) { STEREO_MDCT_BAND_PARAMETERS *sfbConf = NULL; Word32 nrgRatio_fx[CPE_CHANNELS]; @@ -255,8 +255,8 @@ void stereo_coder_tcx_fx( tmp = Inv16( extract_h( nrgRatio_fx[k] ), &e_tmp ); /* Q15-e_tmp */ tmp = shl( tmp, e_tmp ); /* Q15 */ - v_multc_fixed_16( sts[1]->hTcxEnc->spectrum_fx[k], tmp, sts[1]->hTcxEnc->spectrum_fx[k], L_frameTCX ); /* Q31-spectrum_e[k] */ - v_multc_fixed_16( mdst_spectrum_fx[1][k], tmp, mdst_spectrum_fx[1][k], L_frameTCX ); /* q_spec */ + v_multc_fx_16( sts[1]->hTcxEnc->spectrum_fx[k], tmp, sts[1]->hTcxEnc->spectrum_fx[k], L_frameTCX ); /* exp: exp_spec */ + v_multc_fx_16( mdst_spectrum_fx[1][k], tmp, mdst_spectrum_fx[1][k], L_frameTCX ); /* exp: exp_mdct_spec */ } ELSE IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( nrgRatio_fx[k], nrgRatio_e[k], ONE_IN_Q27, 4 ), -1 ) && LT_16( k, EQ_16( sts[0]->core, TCX_20_CORE ) ? 1 : NB_DIV ) ) { @@ -264,8 +264,8 @@ void stereo_coder_tcx_fx( L_frameTCX = idiv1616( L_frameTCX, ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV ); /* Q0 */ /* This operation is resulting in some high MLDs in fixed point. */ - v_multc_fixed_16( sts[0]->hTcxEnc->spectrum_fx[k], extract_l( L_shr( nrgRatio_fx[k], 16 - nrgRatio_e[k] ) ), sts[0]->hTcxEnc->spectrum_fx[k], L_frameTCX ); /* Q31-spectrum_e[k] */ - v_multc_fixed_16( mdst_spectrum_fx[0][k], extract_l( L_shr( nrgRatio_fx[k], 16 - nrgRatio_e[k] ) ), mdst_spectrum_fx[0][k], L_frameTCX ); /* q_spec */ + v_multc_fx_16( sts[0]->hTcxEnc->spectrum_fx[k], extract_l( L_shr( nrgRatio_fx[k], 16 - nrgRatio_e[k] ) ), sts[0]->hTcxEnc->spectrum_fx[k], L_frameTCX ); /* exp: exp_spec */ + v_multc_fx_16( mdst_spectrum_fx[0][k], extract_l( L_shr( nrgRatio_fx[k], 16 - nrgRatio_e[k] ) ), mdst_spectrum_fx[0][k], L_frameTCX ); /* exp: exp_mdct_spec */ } } } @@ -309,7 +309,7 @@ void stereo_coder_tcx_fx( } for ( k = 0; k < nSubframes; k++ ) { - convertToMS_fx( L_frameTCX, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], SQRT2_OVER_2_FIXED ); + convertToMS_fx( L_frameTCX, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], SQRT2_OVER_2_FX ); /* Make sure that the MDST is processed in the correct way also */ set_s( &ms_mask[k][0], 1, MAX_SFB ); @@ -356,7 +356,7 @@ void stereo_coder_tcx_fx( move16(); const Word16 sfbWidth = sub( endLine, startLine ); - nrgRatio_e[0] = nrgRatio_e[1] = sub( Q31, q_spec ); + nrgRatio_e[0] = nrgRatio_e[1] = exp_spec; move16(); move16(); @@ -370,10 +370,12 @@ void stereo_coder_tcx_fx( { Word32 tmp_fx; Word16 tmp_e; - tmp_e = sub( Q31, q_spec ); + tmp_e = exp_mdct_spec; + move16(); tmp_fx = sum2_32_fx( &mdst_spectrum_fx[0][k][startLine], sfbWidth, &tmp_e ); /* Q31-tmp_e */ nrgRatio_fx[0] = BASOP_Util_Add_Mant32Exp( nrgRatio_fx[0], nrgRatio_e[0], tmp_fx, tmp_e, &nrgRatio_e[0] ); /* Q31-nrgRatio_e[0] */ - tmp_e = sub( Q31, q_spec ); + tmp_e = exp_mdct_spec; + move16(); tmp_fx = sum2_32_fx( &mdst_spectrum_fx[1][k][startLine], sfbWidth, &tmp_e ); /* Q31-tmp_e */ nrgRatio_fx[1] = BASOP_Util_Add_Mant32Exp( nrgRatio_fx[1], nrgRatio_e[1], tmp_fx, tmp_e, &nrgRatio_e[1] ); /* Q31-nrgRatio_e[1] */ } @@ -382,14 +384,14 @@ void stereo_coder_tcx_fx( Word16 fTemp_e, tmp_e; Word32 fTemp_fx = BASOP_Util_Add_Mant32Exp( nrgRatio_fx[0], nrgRatio_e[0], nrgRatio_fx[1], nrgRatio_e[1], &fTemp_e ); /* Q31-fTemp_e */ fTemp_e = sub( fTemp_e, 1 ); - nrgRatio_fx[0] = BASOP_Util_Divide3232_Scale_cadence( fTemp_fx, nrgRatio_fx[0], &tmp_e ); /* Q31 - tmp_e - fTemp_e + nrgRatio_e[0] */ + nrgRatio_fx[0] = BASOP_Util_Divide3232_Scale_newton( fTemp_fx, nrgRatio_fx[0], &tmp_e ); /* Q31 - tmp_e - fTemp_e + nrgRatio_e[0] */ move32(); nrgRatio_e[0] = add( tmp_e, sub( fTemp_e, nrgRatio_e[0] ) ); move16(); nrgRatio_fx[0] = Sqrt32( nrgRatio_fx[0], &nrgRatio_e[0] ); /* Q31-nrgRatio_e[0] */ move32(); - nrgRatio_fx[1] = BASOP_Util_Divide3232_Scale_cadence( fTemp_fx, nrgRatio_fx[1], &tmp_e ); /* Q31 - tmp_e - fTemp_e + nrgRatio_e[1] */ + nrgRatio_fx[1] = BASOP_Util_Divide3232_Scale_newton( fTemp_fx, nrgRatio_fx[1], &tmp_e ); /* Q31 - tmp_e - fTemp_e + nrgRatio_e[1] */ move32(); nrgRatio_e[1] = add( tmp_e, sub( fTemp_e, nrgRatio_e[1] ) ); move16(); @@ -426,15 +428,15 @@ void stereo_coder_tcx_fx( move32(); - v_multc_fixed( &sts[0]->hTcxEnc->spectrum_fx[k][startLine], nrgRatio_fx[0], &sts[0]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth ); /* q_spec+30-31 */ - v_multc_fixed( &mdst_spectrum_fx[0][k][startLine], nrgRatio_fx[0], &mdst_spectrum_fx[0][k][startLine], sfbWidth ); /* q_spec+30-31 */ - scale_sig32( &sts[0]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth, Q1 ); // Scaling back to q_spec - scale_sig32( &mdst_spectrum_fx[0][k][startLine], sfbWidth, Q1 ); // Scaling back to q_spec + v_multc_fx( &sts[0]->hTcxEnc->spectrum_fx[k][startLine], nrgRatio_fx[0], &sts[0]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth ); /* exp: exp_spec+1 */ + v_multc_fx( &mdst_spectrum_fx[0][k][startLine], nrgRatio_fx[0], &mdst_spectrum_fx[0][k][startLine], sfbWidth ); /* exp: exp_mdct_spec+1 */ + scale_sig32( &sts[0]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth, Q1 ); // exp: exp_spec + scale_sig32( &mdst_spectrum_fx[0][k][startLine], sfbWidth, Q1 ); // exp: exp_mdct_spec - v_multc_fixed( &sts[1]->hTcxEnc->spectrum_fx[k][startLine], nrgRatio_fx[1], &sts[1]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth ); /* q_spec+30-31 */ - v_multc_fixed( &mdst_spectrum_fx[1][k][startLine], nrgRatio_fx[1], &mdst_spectrum_fx[1][k][startLine], sfbWidth ); /* q_spec+30-31 */ - scale_sig32( &sts[1]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth, Q1 ); // Scaling back to q_spec - scale_sig32( &mdst_spectrum_fx[1][k][startLine], sfbWidth, Q1 ); // Scaling back to q_spec + v_multc_fx( &sts[1]->hTcxEnc->spectrum_fx[k][startLine], nrgRatio_fx[1], &sts[1]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth ); /* exp: exp_spec+1 */ + v_multc_fx( &mdst_spectrum_fx[1][k][startLine], nrgRatio_fx[1], &mdst_spectrum_fx[1][k][startLine], sfbWidth ); /* exp: exp_mdct_spec+1 */ + scale_sig32( &sts[1]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth, Q1 ); // exp: exp_spec + scale_sig32( &mdst_spectrum_fx[1][k][startLine], sfbWidth, Q1 ); // exp: exp_mdct_spec } } } @@ -469,19 +471,30 @@ void stereo_coder_tcx_fx( nAvailBitsMS[k] = idiv1616( nAvailBitsMS[k], nSubframes ); /* Q0 */ move16(); - MsStereoDecision_fx( sfbConf, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], inv_spectrum_fx[0][k], inv_spectrum_fx[1][k], q_spec, &hStereoMdct->mdct_stereo_mode[k], &ms_mask[k][0], nAvailBitsMS[k] ); - - IF( sts[0]->igf ) + test(); + IF( mct_on && LE_16( nAvailBitsMS[k], 0 ) ) /*Force M/S when bit-budget is low for MCT*/ { - IGFEncStereoEncoder_fx( sfbConf, sts[0]->hIGFEnc, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], q_spec, &ms_mask[k][0], - &hStereoMdct->IGFStereoMode[k], hStereoMdct->mdct_stereo_mode[k], (Word16) EQ_16( sts[0]->core, TCX_20_CORE ), (Word16) EQ_16( sts[0]->last_core, ACELP_CORE ) ); + hStereoMdct->mdct_stereo_mode[k] = 1; + move16(); + hStereoMdct->IGFStereoMode[k] = 1; + move16(); + set16_fx( ms_mask[k], 1, sfbConf->sfbCnt ); } ELSE { - hStereoMdct->IGFStereoMode[k] = hStereoMdct->mdct_stereo_mode[k]; - move16(); - } + MsStereoDecision_fx( sfbConf, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], inv_spectrum_fx[0][k], inv_spectrum_fx[1][k], sub( Q31, exp_spec ), &hStereoMdct->mdct_stereo_mode[k], &ms_mask[k][0], nAvailBitsMS[k] ); + IF( sts[0]->igf ) + { + IGFEncStereoEncoder_fx( sfbConf, sts[0]->hIGFEnc, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], sub( Q31, exp_spec ), &ms_mask[k][0], + &hStereoMdct->IGFStereoMode[k], hStereoMdct->mdct_stereo_mode[k], (Word16) EQ_16( sts[0]->core, TCX_20_CORE ), (Word16) EQ_16( sts[0]->last_core, ACELP_CORE ) ); + } + ELSE + { + hStereoMdct->IGFStereoMode[k] = hStereoMdct->mdct_stereo_mode[k]; + move16(); + } + } IF( NE_16( hStereoMdct->mdct_stereo_mode[k], SMDCT_DUAL_MONO ) || NE_16( hStereoMdct->IGFStereoMode[k], SMDCT_DUAL_MONO ) ) { @@ -571,7 +584,7 @@ void ms_processing_fx( { IF( NE_16( ms_mask[iSubframe][sfb], 0 ) ) { - convertToBwMS_fx( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], x_0_fx, x_1_fx, SQRT2_OVER_2_FIXED ); + convertToBwMS_fx( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], x_0_fx, x_1_fx, SQRT2_OVER_2_FX ); } } @@ -627,7 +640,7 @@ void ms_inv_mask_processing_fx( IF( EQ_16( ms_mask[iSubframe][sfb], 0 ) ) { - convertToBwMS_fx( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], x_inv_0_fx, x_inv_1_fx, SQRT2_OVER_2_FIXED ); + convertToBwMS_fx( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], x_inv_0_fx, x_inv_1_fx, SQRT2_OVER_2_FX ); } } @@ -836,54 +849,69 @@ void convertToMS_fx( /*! r: SQ gain */ static Word32 SQ_gain_estimate_stereo_fx( // e_res - Word32 xL_fx[], /* i : L vector to quantize Q31-e_xL*/ - Word16 e_xL, - Word32 xR_fx[], /* i : R vector to quantize Q31-e_xR*/ - Word16 e_xR, + const Word32 xL_fx[], /* i : L vector to quantize Q31-e_xL*/ + const Word16 e_xL, + const Word32 xR_fx[], /* i : R vector to quantize Q31-e_xR*/ + const Word16 e_xR, const Word16 nbitsSQ, /* i : number of bits targeted Q0*/ const Word16 lg, /* i : vector size (2048 max) Q0*/ Word16 *e_res ) { - Word16 i, q, iter, e_ener, e_tmp; + Word16 i, q, iter, e_ener, e_xL_2, e_xR_2, s; Word32 ener_fx, tmp_32, target_fx, fac_fx, offset_fx; - Word32 en_fx[N_MAX / 2]; // Q(26) + Word32 en_fx[N_MAX / 2]; // Q25 Word16 lg2, lg_4, lg2_4; + Word64 W_tmp, _0_01; lg_4 = shr( lg, 2 ); /* Q0 */ lg2_4 = shl( lg_4, 1 ); /* Q0 */ lg2 = shl( lg2_4, 2 ); /* Q0 */ i = 0; move16(); + e_xL_2 = shl( e_xL, 1 ); + e_xR_2 = shl( e_xR, 1 ); + _0_01 = W_shr( 21474836 /* 0.01 in Q31 */, sub( e_xL_2, 32 ) ); // 0.01 in 2*(Q of specL/R) + 1 - set32_fx( en_fx, 21474836 /* 0.01 in Q31 */, idiv1616( N_MAX, 2 ) ); + set32_fx( en_fx, 335544 /* 0.01 in Q25 */, ( N_MAX / 2 ) ); /* energy of quadruples with 9dB offset */ /* ignore that we may take no all lines into account, max. 3 lines at the upper end of the spectrum can be missed (if lg is not a multiple of 4, happens also in SQGain()*/ FOR( q = 0; q < lg_4; q++ ) { - ener_fx = BASOP_Util_Add_Mant32Exp( 21474836 /*0.01 in Q15*/, 0, Mpy_32_32( xL_fx[i], xL_fx[i] ), e_xL * 2, &e_ener ); /* Q31-e_ener */ - ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xL_fx[i + 1], xL_fx[i + 1] ), e_xL * 2, &e_ener ); /* Q31-e_ener */ - ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xL_fx[i + 2], xL_fx[i + 2] ), e_xL * 2, &e_ener ); /* Q31-e_ener */ - ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xL_fx[i + 3], xL_fx[i + 3] ), e_xL * 2, &e_ener ); /* Q31-e_ener */ - en_fx[q] = BASOP_Util_Log2( ener_fx ); /* saves a MAC */ + W_tmp = W_mac_32_32( _0_01, xL_fx[i], xL_fx[i] ); // 2 * e_xL + W_tmp = W_mac_32_32( W_tmp, xL_fx[i + 1], xL_fx[i + 1] ); // 2 * e_xL + W_tmp = W_mac_32_32( W_tmp, xL_fx[i + 2], xL_fx[i + 2] ); // 2 * e_xL + W_tmp = W_mac_32_32( W_tmp, xL_fx[i + 3], xL_fx[i + 3] ); // 2 * e_xL + + s = W_norm( W_tmp ); + ener_fx = W_extract_h( W_shl( W_tmp, s ) ); + e_ener = sub( e_xL_2, s ); + + en_fx[q] = BASOP_Util_Log2( ener_fx ); /* saves a MAC */ move32(); - en_fx[q] = Mpy_32_16_1( L_add( e_ener * ONE_IN_Q25, en_fx[q] ), 9864 /* log10(2) in Q15 */ ); // Q(25) + en_fx[q] = Mpy_32_16_1( L_add( L_shl( e_ener, Q25 ), en_fx[q] ), 9864 /* log10(2) in Q15 */ ); // Q(25) move32(); - i = add( i, 4 ); + i += 4; } i = 0; + move16(); FOR( ; q < lg2_4; q++ ) { - ener_fx = BASOP_Util_Add_Mant32Exp( 21474836 /*0.01 Q15*/, 0, Mpy_32_32( xR_fx[i], xR_fx[i] ), e_xR * 2, &e_ener ); /* Q31-e_ener */ - ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xR_fx[i + 1], xR_fx[i + 1] ), e_xR * 2, &e_ener ); /* Q31-e_ener */ - ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xR_fx[i + 2], xR_fx[i + 2] ), e_xR * 2, &e_ener ); /* Q31-e_ener */ - ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xR_fx[i + 3], xR_fx[i + 3] ), e_xR * 2, &e_ener ); /* Q31-e_ener */ - en_fx[q] = BASOP_Util_Log2( ener_fx ); /* saves a MAC */ + W_tmp = W_mac_32_32( _0_01, xR_fx[i], xR_fx[i] ); // 2 * e_xR + W_tmp = W_mac_32_32( W_tmp, xR_fx[i + 1], xR_fx[i + 1] ); // 2 * e_xR + W_tmp = W_mac_32_32( W_tmp, xR_fx[i + 2], xR_fx[i + 2] ); // 2 * e_xR + W_tmp = W_mac_32_32( W_tmp, xR_fx[i + 3], xR_fx[i + 3] ); // 2 * e_xR + + s = W_norm( W_tmp ); + ener_fx = W_extract_h( W_shl( W_tmp, s ) ); + e_ener = sub( e_xR_2, s ); + + en_fx[q] = BASOP_Util_Log2( ener_fx ); /* saves a MAC */ move32(); - en_fx[q] = Mpy_32_16_1( L_add( e_ener * ONE_IN_Q25, en_fx[q] ), 9864 /* log10(2) in Q15 */ ); // Q(25) + en_fx[q] = Mpy_32_16_1( L_add( L_shl( e_ener, Q25 ), en_fx[q] ), 9864 /* log10(2) in Q15 */ ); // Q(25) move32(); - i = add( i, 4 ); + i += 4; } /* SQ scale: 4 bits / 6 dB per quadruple */ @@ -893,33 +921,29 @@ static Word32 SQ_gain_estimate_stereo_fx( // e_res offset_fx = fac_fx; /* Q25 */ move32(); + Word64 target_64_fx = W_shl( target_fx, 7 ); // Q25 /* find offset (0 to 128 dB with step of 0.125dB) */ FOR( iter = 0; iter < 10; iter++ ) { fac_fx = L_shr( fac_fx, 1 ); /* Q25 */ offset_fx = L_sub( offset_fx, fac_fx ); /* Q25 */ - ener_fx = 0; - move32(); - e_ener = 0; - move16(); + W_tmp = 0; + move64(); FOR( i = 0; i < lg2_4; i++ ) { tmp_32 = L_sub( en_fx[i], offset_fx ); /* Q25 */ - e_tmp = 6; - move16(); /* avoid SV with 1 bin of amp < 0.5f */ - IF( GT_32( tmp_32, 10066329 /*0.3 Q25*/ ) ) + if ( GT_32( tmp_32, 10066329 /*0.3 Q25*/ ) ) { - ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, tmp_32, e_tmp, &e_ener ); /* Q31-e_ener */ - - /* if ener is above target -> break and increase offset */ - IF( L_shl_sat( ener_fx, sub( e_ener, Q13 ) ) > target_fx ) - { - offset_fx = L_add( offset_fx, fac_fx ); /* Q25 */ - BREAK; - } + W_tmp = W_add( W_tmp, tmp_32 ); /* Q25 */ + } + /* if ener is above target -> break and increase offset */ + IF( GT_64( W_tmp, target_64_fx ) ) + { + offset_fx = L_add( offset_fx, fac_fx ); /* Q25 */ + BREAK; } } } @@ -1161,9 +1185,9 @@ static void MsStereoDecision_fx( FOR( i = 0; i < length; i++ ) { - specM_fx[i] = Mpy_32_32( L_add( specL_fx[i], specR_fx[i] ), SQRT2_OVER_2_FIXED ); // Q( q_spec ) + specM_fx[i] = Mpy_32_32( L_add( specL_fx[i], specR_fx[i] ), SQRT2_OVER_2_FX ); // Q( q_spec ) move32(); - specS_fx[i] = Mpy_32_32( L_sub( specL_fx[i], specR_fx[i] ), SQRT2_OVER_2_FIXED ); // Q( q_spec ) + specS_fx[i] = Mpy_32_32( L_sub( specL_fx[i], specR_fx[i] ), SQRT2_OVER_2_FX ); // Q( q_spec ) move32(); } diff --git a/lib_enc/ivas_stereo_switching_enc_fx.c b/lib_enc/ivas_stereo_switching_enc_fx.c index 0a526561ae7317a3a06d15ea472636f2f3ad12fd..c6fc59283718c838d40673904eceecad903811ad 100644 --- a/lib_enc/ivas_stereo_switching_enc_fx.c +++ b/lib_enc/ivas_stereo_switching_enc_fx.c @@ -35,13 +35,13 @@ #include "cnst.h" #include "rom_com.h" #include "prot_fx.h" -#include "ivas_rom_com_fx.h" #include "ivas_rom_com.h" #include "assert.h" #include "wmc_auto.h" #include "prot_fx_enc.h" #include "ivas_prot_fx.h" + /*-------------------------------------------------------------------* * Function allocate_CoreCoder_enc() * @@ -58,7 +58,7 @@ static ivas_error allocate_CoreCoder_enc_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LPDmem\n" ) ); } - LPDmem_enc_init_ivas_fx( st->hLPDmem ); + LPDmem_enc_init_fx( st->hLPDmem ); } IF( st->hGSCEnc == NULL && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) @@ -85,7 +85,7 @@ static ivas_error allocate_CoreCoder_enc_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VAD\n" ) ); } - wb_vad_init_ivas_fx( st->hVAD ); + wb_vad_init_fx( st->hVAD ); } IF( st->hSpMusClas == NULL ) @@ -183,7 +183,7 @@ static void deallocate_CoreCoder_enc_fx( IF( st->cldfbAnaEnc != NULL ) { - deleteCldfb_ivas_fx( &st->cldfbAnaEnc ); + deleteCldfb_fx( &st->cldfbAnaEnc ); } IF( st->hBWE_TD != NULL ) @@ -194,7 +194,7 @@ static void deallocate_CoreCoder_enc_fx( IF( st->cldfbSynTd != NULL ) { - deleteCldfb_ivas_fx( &st->cldfbSynTd ); + deleteCldfb_fx( &st->cldfbSynTd ); } IF( st->hBWE_FD != NULL ) @@ -239,16 +239,12 @@ ivas_error stereo_memory_enc_fx( test(); IF( hCPE->hStereoTCA != NULL && EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) { -#ifdef FIX_1132_STACK_CORRUPTION Word16 tmp = extract_h( L_abs( hCPE->hStereoDft->hItd->itd_fx[1] ) ); if ( hCPE->hStereoDft->hItd->itd_fx[1] < 0 ) { tmp = negate( tmp ); } set16_fx( hCPE->hStereoTCA->prevCorrLagStats, tmp, 3 ); -#else - set16_fx( hCPE->hStereoTCA->prevCorrLagStats, extract_h( hCPE->hStereoDft->hItd->itd_fx[1] ), 3 ); -#endif IF( hCPE->hStereoDft->hItd->itd_fx[1] >= 0 ) { hCPE->hStereoTCA->prevRefChanIndx = L_CH_INDX; @@ -366,8 +362,8 @@ ivas_error stereo_memory_enc_fx( IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) && ( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) || EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) ) { /* Deallocate MDCT CNG structures */ - deleteCldfb_ivas_fx( &hCPE->hCoreCoder[0]->cldfbAnaEnc ); - deleteCldfb_ivas_fx( &hCPE->hCoreCoder[1]->cldfbAnaEnc ); + deleteCldfb_fx( &hCPE->hCoreCoder[0]->cldfbAnaEnc ); + deleteCldfb_fx( &hCPE->hCoreCoder[1]->cldfbAnaEnc ); IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { @@ -439,8 +435,8 @@ ivas_error stereo_memory_enc_fx( } } - InitSWBencBuffer_ivas_fx( st ); - ResetSHBbuffer_Enc_fx( st ); + InitSWBencBuffer_ivas_fx( st->hBWE_TD ); + ResetSHBbuffer_Enc_fx( st->hBWE_TD ); IF( ( st->hBWE_FD = (FD_BWE_ENC_HANDLE) malloc( sizeof( FD_BWE_ENC_DATA ) ) ) == NULL ) { @@ -448,10 +444,8 @@ ivas_error stereo_memory_enc_fx( } fd_bwe_enc_init_fx( st->hBWE_FD ); -#ifdef MSAN_FIX st->Q_old_wtda = 0; move16(); -#endif } /* allocate stereo CNG structure */ @@ -609,7 +603,10 @@ ivas_error stereo_memory_enc_fx( IF( st->hFdCngEnc == NULL ) { - createFdCngEnc_fx( &st->hFdCngEnc ); + IF( ( error = createFdCngEnc_fx( &st->hFdCngEnc ) ) != IVAS_ERR_OK ) + { + return error; + } initFdCngEnc_fx( st->hFdCngEnc, st->input_Fs, st->cldfbAnaEnc->scale ); configureFdCngEnc_ivas_fx( st->hFdCngEnc, st->bwidth, st->rf_mode && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate ); @@ -634,23 +631,6 @@ ivas_error stereo_memory_enc_fx( return error; } -static void v_multc_fixed_32_16( - const Word16 x[], /* i : Input vector Qx*/ - const Word32 c, /* i : Constant Q31*/ - Word32 y[], /* o : Output vector that contains c*x Qx*/ - const Word16 N /* i : Vector length Q0*/ -) -{ - Word16 i; - - FOR( i = 0; i < N; i++ ) - { - y[i] = Mpy_32_16_1( c, x[i] ); /* Q16+Qx */ - move32(); - } - - return; -} /*-------------------------------------------------------------------* * Function stereo_switching_enc() * @@ -659,7 +639,7 @@ static void v_multc_fixed_32_16( void stereo_switching_enc_fx( CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - Word16 old_input_signal_pri[], /* i : old input signal of primary channel q_inp*/ + Word32 old_input_signal_pri[], /* i : old input signal of primary channel q_inp*/ const Word16 input_frame, /* i : input frame length Q0*/ const Word16 q_inp ) { @@ -672,26 +652,26 @@ void stereo_switching_enc_fx( dft_ovl = extract_l( Mpy_32_32( imult3216( input_frame, STEREO_DFT_OVL_MAX ), 2236963 ) ); // 1/L_FRAME48k = 2236963 (Q31) /* update DFT analysis overlap memory */ + /* note: in MDCT stereo, the update is done in stereo_td_itd_mdct_stereo() */ test(); test(); IF( GT_16( hCPE->element_mode, IVAS_CPE_DFT ) && hCPE->input_mem_fx[0] != NULL && NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { FOR( n = 0; n < CPE_CHANNELS; n++ ) { - Copy( sts[n]->input_fx + input_frame - dft_ovl, hCPE->input_mem_fx[n], dft_ovl ); /* sts[n]->q_inp */ -#ifdef FIX_ISSUE_1327 - hCPE->q_input_mem[n] = sts[n]->q_inp; + Word16 sf = L_norm_arr( sts[n]->input32_fx + input_frame - dft_ovl, dft_ovl ); + Copy_Scale_sig32_16( sts[n]->input32_fx + input_frame - dft_ovl, hCPE->input_mem_fx[n], dft_ovl, sf ); /* sts[n]->q_inp32 - 16 */ + hCPE->q_input_mem[n] = sub( add( sts[n]->q_inp32, sf ), 16 ); move16(); -#endif } } /* save original stereo input (MDCT overlap part) for both channels in unused old input of right channel for possible DFT->MDCT transition */ IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { - Copy( sts[0]->input_fx + sub( (Word16) Mpy_32_32( sts[0]->input_Fs, 42949673 /* 1/50 in Q31*/ ), sts[0]->encoderLookahead_FB ), sts[1]->input_fx - shl( sts[0]->encoderLookahead_FB, 1 ), sts[0]->encoderLookahead_FB ); /* sts[0]->q_inp */ + Copy32( sts[0]->input32_fx + sub( extract_l( Mpy_32_32( sts[0]->input_Fs, 42949673 /* 1/50 in Q31*/ ) ), sts[0]->encoderLookahead_FB ), sts[1]->input32_fx - shl( sts[0]->encoderLookahead_FB, 1 ), sts[0]->encoderLookahead_FB ); /* sts[0]->q_inp32 */ - Copy( sts[1]->input_fx + sub( (Word16) Mpy_32_32( sts[1]->input_Fs, 42949673 /* 1/50 in Q31*/ ), sts[1]->encoderLookahead_FB ), sts[1]->input_fx - sts[1]->encoderLookahead_FB, sts[1]->encoderLookahead_FB ); /* sts[1]->q_inp */ + Copy32( sts[1]->input32_fx + sub( extract_l( Mpy_32_32( sts[1]->input_Fs, 42949673 /* 1/50 in Q31*/ ) ), sts[1]->encoderLookahead_FB ), sts[1]->input32_fx - sts[1]->encoderLookahead_FB, sts[1]->encoderLookahead_FB ); /* sts[1]->q_inp32 */ } @@ -702,7 +682,7 @@ void stereo_switching_enc_fx( /* window DFT synthesis overlap memory @input_Fs, primary channel */ FOR( i = 0; i < dft_ovl; i++ ) { - hCPE->hStereoDft->output_mem_dmx_fx[i] = L_shr( Mpy_32_16_r( hCPE->hStereoDft->win_fx[dft_ovl - 1 - i], old_input_signal_pri[input_frame - dft_ovl + i] ), add( q_inp, 1 ) ); // Q31 + q_inp - Q15 - (q_inp + 1) -> Q15 + hCPE->hStereoDft->output_mem_dmx_fx[i] = L_shl_sat( Mpy_32_32_r( hCPE->hStereoDft->win_fx[dft_ovl - 1 - i], old_input_signal_pri[input_frame - dft_ovl + i] ), sub( 15, q_inp ) ); // Q15 move32(); } /* reset 48kHz BWE overlap memory */ @@ -736,7 +716,7 @@ void stereo_switching_enc_fx( /* update DFT synthesis overlap memory @12.8kHz */ FOR( i = 0; i < STEREO_DFT_OVL_12k8; i++ ) { - hCPE->hStereoDft->output_mem_dmx_12k8_fx[i] = L_shr( Mpy_32_16_r( hCPE->hStereoDft->win_12k8_fx[STEREO_DFT_OVL_12k8 - 1 - i], sts[0]->buf_speech_enc[L_FRAME32k + L_FRAME - STEREO_DFT_OVL_12k8 + i] ), q_inp + 1 ); /* Q15 */ + hCPE->hStereoDft->output_mem_dmx_12k8_fx[i] = L_shr( Mpy_32_16_r( hCPE->hStereoDft->win_12k8_fx[STEREO_DFT_OVL_12k8 - 1 - i], sts[0]->buf_speech_enc[L_FRAME32k + L_FRAME - STEREO_DFT_OVL_12k8 + i] ), sub( 16, sts[0]->exp_buf_speech_enc ) ); /* Q15 */ move32(); } Word16 q_dmx = Q15; @@ -824,10 +804,10 @@ void stereo_switching_enc_fx( offset = sub( sts[0]->cldfbAnaEnc->p_filter_length, sts[0]->cldfbAnaEnc->no_channels ); /* Q0 */ FOR( i = 0; i < offset; i++ ) { - sts[0]->cldfbAnaEnc->cldfb_state_fx[i] = L_deposit_h( old_input_signal_pri[input_frame - offset - NS2SA_FX2( L_mult0( input_frame, FRAMES_PER_SEC ), L_MEM_RECALC_TBE_NS ) + i] ); /* Q16+q_inp */ + sts[0]->cldfbAnaEnc->cldfb_state_fx[i] = old_input_signal_pri[input_frame - offset - NS2SA_FX2( L_mult0( input_frame, FRAMES_PER_SEC ), L_MEM_RECALC_TBE_NS ) + i]; /* q_inp */ move32(); } - sts[0]->cldfbAnaEnc->Q_cldfb_state = add( Q16, q_inp ); + sts[0]->cldfbAnaEnc->Q_cldfb_state = q_inp; move16(); } @@ -846,18 +826,18 @@ void stereo_switching_enc_fx( test(); IF( hCPE->hStereoTD != NULL && EQ_16( hCPE->hStereoTD->tdm_last_ratio_idx, LRTD_STEREO_LEFT_IS_PRIM ) ) { - v_multc_fixed_32_16( hCPE->hCoreCoder[1]->old_input_signal_fx + sub( input_frame, add( offset, NS2SA_FX2( L_mult0( input_frame, FRAMES_PER_SEC ), L_MEM_RECALC_TBE_NS ) ) ), -MAX_32, sts[1]->cldfbAnaEnc->cldfb_state_fx, offset ); /* Q16+q_inp */ - sts[1]->cldfbAnaEnc->Q_cldfb_state = add( Q16, q_inp ); + v_multc_fx( hCPE->hCoreCoder[1]->old_input_signal32_fx + sub( input_frame, add( offset, NS2SA_FX2( L_mult0( input_frame, FRAMES_PER_SEC ), L_MEM_RECALC_TBE_NS ) ) ), -MAX_32, sts[1]->cldfbAnaEnc->cldfb_state_fx, offset ); /* Q16+q_inp */ + sts[1]->cldfbAnaEnc->Q_cldfb_state = q_inp; move16(); } ELSE { FOR( i = 0; i < offset; i++ ) { - sts[1]->cldfbAnaEnc->cldfb_state_fx[i] = L_shr( L_deposit_h( hCPE->hCoreCoder[1]->old_input_signal_fx[input_frame - offset - NS2SA_FX2( L_mult0( input_frame, FRAMES_PER_SEC ), L_MEM_RECALC_TBE_NS ) + i] ), 5 ); /* Q11+q_inp */ + sts[1]->cldfbAnaEnc->cldfb_state_fx[i] = ( hCPE->hCoreCoder[1]->old_input_signal32_fx[input_frame - offset - NS2SA_FX2( L_mult0( input_frame, FRAMES_PER_SEC ), L_MEM_RECALC_TBE_NS ) + i] ); /* q_inp */ move32(); } - sts[1]->cldfbAnaEnc->Q_cldfb_state = add( Q16 - 5, q_inp ); + sts[1]->cldfbAnaEnc->Q_cldfb_state = q_inp; move16(); } @@ -923,23 +903,29 @@ void stereo_switching_enc_fx( IF( sts[0]->hLPDmem != NULL ) { Copy( sts[0]->hLPDmem->old_exc, sts[1]->hLPDmem->old_exc, L_EXC_MEM ); + sts[1]->hLPDmem->q_lpd_old_exc = sts[0]->hLPDmem->q_lpd_old_exc; + move16(); } Copy( sts[0]->lsf_old_fx, sts[1]->lsf_old_fx, M ); /* Qlog2(2.56) */ Copy( sts[0]->lsp_old_fx, sts[1]->lsp_old_fx, M ); /* Q15 */ Copy( sts[0]->lsf_old1_fx, sts[1]->lsf_old1_fx, M ); /* Qlog2(2.56) */ Copy( sts[0]->lsp_old1_fx, sts[1]->lsp_old1_fx, M ); /* Q15 */ + sts[1]->last_core_brate = sts[0]->last_core_brate; + move16(); + sts[1]->GSC_noisy_speech = 0; move16(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { /* cross-fade overlap region of DFT Stereo downmix and original stereo channels */ tmp_fx = div_s( 64, shl( sts[0]->encoderLookahead_FB, Q6 ) ); /* Q15 */ FOR( i = 0; i < sts[0]->encoderLookahead_FB; i++ ) { - sts[1]->input32_fx[-sts[0]->encoderLookahead_FB + i] = L_shr( Mpy_32_16_1( L_add( Mpy_32_16_1( sts[0]->input32_fx[-sts[0]->encoderLookahead_FB + i], sts[0]->encoderLookahead_FB - i ), Mpy_32_16_1( sts[1]->input32_fx[-sts[0]->encoderLookahead_FB + i], i ) ), tmp_fx ), 13 ); /* q_inp32+0-15+15-15-13 */ + sts[1]->input32_fx[-sts[0]->encoderLookahead_FB + i] = ( Mpy_32_16_1( L_add( imult3216( sts[0]->input32_fx[-sts[0]->encoderLookahead_FB + i], sts[0]->encoderLookahead_FB - i ), imult3216( sts[1]->input32_fx[-sts[0]->encoderLookahead_FB + i], i ) ), tmp_fx ) ); /* sts[0]->q_inp32 */ move32(); - sts[0]->input32_fx[-sts[0]->encoderLookahead_FB + i] = L_shr( Mpy_32_16_1( L_add( Mpy_32_16_1( sts[0]->input32_fx[-sts[0]->encoderLookahead_FB + i], sts[0]->encoderLookahead_FB - i ), Mpy_32_16_1( sts[1]->input32_fx[-2 * sts[0]->encoderLookahead_FB + i], i ) ), tmp_fx ), 13 ); /* q_inp32+0-15+15-15-13 */ + sts[0]->input32_fx[-sts[0]->encoderLookahead_FB + i] = ( Mpy_32_16_1( L_add( imult3216( sts[0]->input32_fx[-sts[0]->encoderLookahead_FB + i], sts[0]->encoderLookahead_FB - i ), imult3216( sts[1]->input32_fx[-2 * sts[0]->encoderLookahead_FB + i], i ) ), tmp_fx ) ); /* sts[0]->q_inp32 */ move32(); } /* restore continuous signal in right channel (part of old_output was used to store original left channel) */ diff --git a/lib_enc/ivas_stereo_td_analysis_fx.c b/lib_enc/ivas_stereo_td_analysis_fx.c index 44c08efa8a4fc05b01735b8127d84623b0ef3711..ab28f7f7e4e64c63a8d86c43f1751a5cbc9dd921 100644 --- a/lib_enc/ivas_stereo_td_analysis_fx.c +++ b/lib_enc/ivas_stereo_td_analysis_fx.c @@ -41,7 +41,6 @@ #include "rom_enc.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*-------------------------------------------------------------------* @@ -71,18 +70,13 @@ #define RATIO_MAX 1.5f /* Maximum correlation ratio */ -#define RATIO_MAX_FX_Q30 ( 1610612736 ) /* 1.5f in Q30 */ /* Maximum correlation ratio */ -#ifdef FIX_1301_CORRECT_TD_CNST -#define RATIO_MAX_FX_Q24 ( 25165824 ) /* 1.5f in Q24 */ /* Maximum correlation ratio */ -#define RATIO_MAX_FX_Q23 ( 12582912 ) /* 1.5f in Q23 */ /* Maximum correlation ratio */ -#else -#define RATIO_MAX_FX_Q24 ( 2516582 ) /* 1.5f in Q24 */ /* Maximum correlation ratio */ -#define RATIO_MAX_FX_Q23 ( 1258291 ) /* 1.5f in Q23 */ /* Maximum correlation ratio */ -#endif -#define LIMIT_ADAP_FAC_FX_Q16 ( 9830 ) /* 0.15f in Q16 */ -#define MIN_ADAP_FAC_FX_Q16 ( 6554 ) /*0.1f in Q16*/ -#define M_ADAP_FX_Q31 ( 1932735 ) /* 0.0009f in Q31 */ -#define B_ADAP_FX_Q16 ( 10486 ) /* 0.16f in Q16 */ +#define RATIO_MAX_FX_Q30 ( 1610612736 ) /* 1.5f in Q30 */ /* Maximum correlation ratio */ +#define RATIO_MAX_FX_Q24 ( 25165824 ) /* 1.5f in Q24 */ /* Maximum correlation ratio */ +#define RATIO_MAX_FX_Q23 ( 12582912 ) /* 1.5f in Q23 */ /* Maximum correlation ratio */ +#define LIMIT_ADAP_FAC_FX_Q16 ( 9830 ) /* 0.15f in Q16 */ +#define MIN_ADAP_FAC_FX_Q16 ( 6554 ) /*0.1f in Q16*/ +#define M_ADAP_FX_Q31 ( 1932735 ) /* 0.0009f in Q31 */ +#define B_ADAP_FX_Q16 ( 10486 ) /* 0.16f in Q16 */ #define PC_LIMIT 64 #define RATIO_PG_HR 0.94f @@ -260,11 +254,7 @@ Word16 stereo_tdm_ener_analysis_fx( rms_thd_fx = L_shr( rms_thd_fx, 2 ); /*Q16*/ /*rms_thd_fx *= 0.25f*/ test(); test(); -#ifdef FIX_1301_CORRECT_TD_CNST IF( LE_32( hStereoTD->tdm_lt_rms_L_fx, 4915200 /* 75 in Q16*/ ) || LE_32( hStereoTD->tdm_lt_rms_R_fx, 4915200 /* 75 in Q16*/ ) /*|| sts[0]->last_coder_type == TRANSITION */ ) -#else - IF( LE_32( hStereoTD->tdm_lt_rms_L_fx, 4915200 /* 75 in Q16*/ ) || LE_32( hStereoTD->tdm_lt_rms_R_fx, 75 /* 75 in Q16*/ ) /*|| sts[0]->last_coder_type == TRANSITION */ ) -#endif { rms_thd_fx = L_shr( rms_thd_fx, 5 ); /* Q16*/ /*rms_thd_fx *= 0.03125f*/ } @@ -338,10 +328,8 @@ Word16 stereo_tdm_ener_analysis_fx( move16(); } -#ifdef FIX_1301_CORRECT_TD_CNST rms_L_fx = L_shl( rms_L_fx, sub( Q16, q_rms_L ) ); /* All the following energy comparison are done in Q16 */ rms_R_fx = L_shl( rms_R_fx, sub( Q16, q_rms_R ) ); -#endif test(); IF( EQ_16( hStereoTD->prev_fr_LRTD_TD_dec, 1 ) && side_can_change == 0 ) { @@ -351,8 +339,8 @@ Word16 stereo_tdm_ener_analysis_fx( test(); IF( ( LE_32( hStereoTD->tdm_lt_rms_L_fx, rms_thd_fx ) && LE_32( hStereoTD->tdm_lt_rms_R_fx, L_shl( rms_thd_fx, 1 ) ) ) || ( LE_32( hStereoTD->tdm_lt_rms_R_fx, rms_thd_fx ) && LE_32( hStereoTD->tdm_lt_rms_L_fx, L_shl( rms_thd_fx, 1 ) ) ) || - ( sts[0]->hVAD->hangover_cnt != 0 && LT_16( sts[1]->hNoiseEst->Etot_last_fx, 3072 /*12 in Q8*/ ) ) || - ( sts[1]->hVAD->hangover_cnt != 0 && LT_16( sts[0]->hNoiseEst->Etot_last_fx, 3072 /*12 in Q8*/ ) ) || + ( sts[0]->hVAD->hangover_cnt != 0 && LT_32( sts[1]->hNoiseEst->Etot_last_32fx, 201326592 /*12 in Q24*/ ) ) || + ( sts[1]->hVAD->hangover_cnt != 0 && LT_32( sts[0]->hNoiseEst->Etot_last_32fx, 201326592 /*12 in Q24*/ ) ) || ( NE_16( sts[0]->hSpMusClas->past_dec[0], sts[1]->hSpMusClas->past_dec[0] ) ) ) { test(); @@ -440,11 +428,7 @@ Word16 stereo_tdm_ener_analysis_fx( ELSE { /*ratio_L = ( 1.0f - cosf( EVS_PI * ratio_L / 2.0f ) ) / 2.0f;*/ -#ifdef FIX_1301_CORRECT_TD_CNST ratio_L_fx = L_deposit_h( sub_sat( ONE_IN_Q14, getCosWord16( extract_l( Mpy_32_32( 1647099 /* EVS_PI/2 in Q20 */, ratio_L_fx ) ) ) ) ); // Q31 (Q14 + Q1(division by 2.0f) + Q16) -#else - ratio_L_fx = L_deposit_h( sub( ONE_IN_Q14, getCosWord16( extract_l( Mpy_32_32( 1647099 /* EVS_PI/2 in Q20 */, ratio_L_fx ) ) ) ) ); // Q31 (Q14 + Q1(division by 2.0f) + Q16) -#endif } test(); @@ -579,7 +563,7 @@ Word16 stereo_tdm_ener_analysis_fx( } } - IF( LT_16( sub( sts[1]->lp_speech_fx, sts[1]->lp_noise_fx ), 12800 /*50.0f in Q8*/ ) ) /* likely presence of noisy content */ + IF( LT_32( L_sub( sts[1]->lp_speech_32fx, sts[1]->lp_noise_32fx ), 838860800 /*50.0f in Q24*/ ) ) /* likely presence of noisy content */ { /* pointing in the right direction, inverse it else do nothing */ test(); @@ -650,22 +634,14 @@ Word16 stereo_tdm_ener_analysis_fx( move16(); } -#ifdef FIX_ISSUE_1125 ratio_L_fx = tdm_ratio_tabl_fx_Q30[idx]; // Q30 -#else - ratio_L_fx = tdm_ratio_tabl_fx[idx]; // Q31 -#endif move32(); test(); IF( EQ_16( hStereoTD->tdm_SM_modi_flag, 1 ) && hStereoTD->tdm_LRTD_flag == 0 ) { idx = shr( add( hStereoTD->tdm_last_ratio_idx, add( LRTD_STEREO_MID_IS_PRIM, 1 ) ), 1 ); -#ifdef FIX_ISSUE_1125 ratio_L_fx = tdm_ratio_tabl_fx_Q30[idx]; // Q30 -#else - ratio_L_fx = tdm_ratio_tabl_fx[idx]; // Q31 -#endif move32(); } @@ -756,10 +732,8 @@ Word16 stereo_tdm_ener_analysis_fx( hCPE->hStereoClassif->ratio_L_fx = ratio_L_fx; /* 31 - ratio_L_e */ move32(); -#ifdef FIX_ISSUE_1125 hCPE->hStereoClassif->ratio_L_e = 1; move16(); -#endif return idx; } @@ -898,8 +872,8 @@ static Word16 Get_dt_lt_ener_fx( move32(); *tdm_lt_rms_R = L_shl( Mpy_32_32( 1932735282 /* 0.9f in Q31 */, rms_R ), sub( Q16, q_rms_R ) ); // (Q31, q_rms_R) -> q_rms_R -> Q16 move32(); - L_tmp = Mpy_32_16_1( 1932735282 /* 0.9f in Q31 */, sts[0]->hNoiseEst->Etot_last_fx ); //(Q31, Q8) -> Q24 - sts[1]->hNoiseEst->Etot_last_fx = extract_h( L_tmp ); // (Q24 >> Q16) -> Q8 + L_tmp = Mpy_32_32( 1932735282 /* 0.9f in Q31 */, sts[0]->hNoiseEst->Etot_last_32fx ); //(Q31, Q24) -> Q24 + sts[1]->hNoiseEst->Etot_last_32fx = L_tmp; // (Q24 >> Q16) -> Q8 sts[1]->hVAD->hangover_cnt = 0; move16(); } @@ -1073,11 +1047,7 @@ static void NOOP_decision_fx( } ELSE { -#ifdef FIX_1301_CORRECT_TD_CNST if ( LT_32( sts[0]->ee_old_fx, 320000 /* 5000.f in Q6 */ ) && LT_32( sts[1]->ee_old_fx, 320000 /* 5000.f in Q6 */ ) ) -#else - if ( LT_32( sts[0]->ee_old_fx, 160000 /* 5000.f in Q6 */ ) && LT_32( sts[1]->ee_old_fx, 160000 /* 5000.f in Q6 */ ) ) -#endif { tdm_NOOP_switch_flag = 1; move16(); @@ -2042,7 +2012,7 @@ static void Get_corr_n_fx( } ELSE { - *ic_Lm = BASOP_Util_Divide3232_Scale_cadence( corrL, ener, &exp_diff ); // (Q31 - exp_diff) + *ic_Lm = BASOP_Util_Divide3232_Scale_newton( corrL, ener, &exp_diff ); // (Q31 - exp_diff) move32(); IF( *ic_Lm == 0 ) { @@ -2054,7 +2024,7 @@ static void Get_corr_n_fx( *q_ic_Lm = sub( Q31, exp_diff ); move16(); } - *ic_Rm = BASOP_Util_Divide3232_Scale_cadence( corrR, ener, &exp_diff ); // (Q31 - exp_diff) + *ic_Rm = BASOP_Util_Divide3232_Scale_newton( corrR, ener, &exp_diff ); // (Q31 - exp_diff) move16(); IF( *ic_Rm == 0 ) { @@ -2070,7 +2040,7 @@ static void Get_corr_n_fx( /* *es_em = 10 * ( log10f( sqrtf( ener_side / len ) ) - log10f( sqrtf( ener / len ) ) ); is simplified to *es_em = 10 * ( log10f( sqrtf( ener_side / ener ) ) ); */ - L_tmp = BASOP_Util_Divide3232_Scale_cadence( ener_side, ener, &exp_diff ); // (Q31 - exp_diff) + L_tmp = BASOP_Util_Divide3232_Scale_newton( ener_side, ener, &exp_diff ); // (Q31 - exp_diff) L_tmp = Sqrt32( L_tmp, &exp_diff ); /* (Q31 - exp_diff) */ L_tmp = BASOP_Util_Log2( L_tmp ); /* Q25 */ *es_em = Mpy_32_32( Mpy_32_32( L_add( L_tmp, L_shl( exp_diff, Q25 ) ), LOG10_2_Q31 ), TEN_IN_Q27 ); // (Q25, Q27) -> Q21 diff --git a/lib_enc/ivas_stereo_td_enc_fx.c b/lib_enc/ivas_stereo_td_enc_fx.c index 1618843f08afa6473a4fcc1b33d976bab8be473f..2efdb296153581b7eb685cfa97d0e3611b4b35c0 100644 --- a/lib_enc/ivas_stereo_td_enc_fx.c +++ b/lib_enc/ivas_stereo_td_enc_fx.c @@ -43,7 +43,6 @@ #endif #include "prot_fx_enc.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" /*-------------------------------------------------------------------* @@ -51,6 +50,7 @@ * * Initialize TD stereo encoder *-------------------------------------------------------------------*/ + void stereo_td_init_enc_fx( STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ const Word16 last_element_mode /* i : last element mode */ @@ -263,7 +263,7 @@ ivas_error stereo_set_tdm_fx( /* deallocate CLDFB ana for secondary channel */ IF( st->cldfbAnaEnc != NULL ) { - deleteCldfb_ivas_fx( &st->cldfbAnaEnc ); + deleteCldfb_fx( &st->cldfbAnaEnc ); } /* deallocate BWEs for secondary channel */ @@ -275,7 +275,7 @@ ivas_error stereo_set_tdm_fx( st->hBWE_TD = NULL; } - deleteCldfb_ivas_fx( &st->cldfbSynTd ); + deleteCldfb_fx( &st->cldfbSynTd ); IF( st->hBWE_FD != NULL ) { @@ -327,8 +327,8 @@ ivas_error stereo_set_tdm_fx( return error; } - InitSWBencBuffer_ivas_fx( st ); - ResetSHBbuffer_Enc_fx( st ); + InitSWBencBuffer_ivas_fx( st->hBWE_TD ); + ResetSHBbuffer_Enc_fx( st->hBWE_TD ); IF( ( st->hBWE_FD = (FD_BWE_ENC_HANDLE) malloc( sizeof( FD_BWE_ENC_DATA ) ) ) == NULL ) { @@ -336,10 +336,8 @@ ivas_error stereo_set_tdm_fx( } fd_bwe_enc_init_fx( st->hBWE_FD ); -#ifdef MSAN_FIX st->Q_old_wtda = 0; move16(); -#endif } } diff --git a/lib_enc/ivas_tcx_core_enc_fx.c b/lib_enc/ivas_tcx_core_enc_fx.c index eabfe87b48124b8e97d483242005d0ceada58950..8538f95d1c00e395975a3e95c2a409751952e513 100644 --- a/lib_enc/ivas_tcx_core_enc_fx.c +++ b/lib_enc/ivas_tcx_core_enc_fx.c @@ -41,7 +41,6 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #include "prot_fx_enc.h" -#include "rom_com_fx.h" #include "ivas_prot_fx.h" /*-------------------------------------------------------------------* @@ -205,7 +204,7 @@ void stereo_tcx_core_enc( /*HM*/ Word16 indexBuffer[2 * ( ( N_MAX / 2 ) + 1 )]; - Word16 s, input_frame; + Word16 s; CONTEXT_HM_CONFIG hm_cfg[2]; @@ -371,19 +370,11 @@ void stereo_tcx_core_enc( * Core Signal Analysis: MDCT, TNS, LPC analysis *---------------------------------------------------------------*/ - /* TODO: integrate this. */ st->prev_Q_new = 0; st->Q_old = 0; Q_new = 0; move16(); - input_frame = idiv1616U( extract_l( L_shr( st->input_Fs, 1 ) ), FRAMES_PER_SEC / 2 ); - Scale_sig( st->input_fx, add( input_frame, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), negate( st->q_inp ) ); - Scale_sig( st->old_input_signal_fx, input_frame, negate( st->q_old_inp ) ); - st->q_old_inp = 0; - move16(); - st->q_inp = 0; - move16(); core_signal_analysis_high_bitrate_ivas_fx( p_new_samples, T_op, lsp_new_fx, lsp_mid_fx, st, tnsSize, tnsBits, param_core, <pBits, NULL, st->L_frame, hTcxEnc->L_frameTCX, last_element_mode, vad_hover_flag, NULL, NULL, &Q_new, NULL ); @@ -416,6 +407,10 @@ void stereo_tcx_core_enc( st->hLPDmem->q_lpd_syn = st->Q_syn; move16(); + /*--------------------------------------------------------------* + * LPC Envelope Quantization and FDNS + *---------------------------------------------------------------*/ + IF( !st->enableTcxLpc ) { IF( st->envWeighted ) @@ -440,6 +435,8 @@ void stereo_tcx_core_enc( } } + st->acelp_cfg.midLpc = 0; + move16(); last_core_orig = st->last_core; move16(); @@ -562,9 +559,9 @@ void stereo_tcx_core_enc( } Scale_sig( st->synth, st->L_frame, s ); /* st->Q_syn + s */ Scale_sig( st->hLPDmem->syn, M + 1, s ); /* st->Q_syn + s */ + st->hLPDmem->q_lpd_syn = add( st->hLPDmem->q_lpd_syn, s ); Q_new = add( Q_new, s ); move16(); - move16(); coder_tcx_post_ivas_fx( st, st->hLPDmem, st->hTcxCfg, st->synth, A_q_fx, Aw_fx, st->wspeech_enc, Q_new ); @@ -688,19 +685,7 @@ void stereo_tcx_core_enc( { set16_fx( pitch_buf_fx, L_SUBFR * ONE_IN_Q6, NB_SUBFR16k ); /* Q6 */ } - /* Memory scaling to keep everything in common q */ - Word16 curr_q_syn = sub( shl( Q_new, 1 ), 1 ); - Scale_sig( st->hLPDmem->mem_syn_r, L_SYN_MEM, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), curr_q_syn ) ); /* s_min( curr_q_syn, st->hLPDmem->q_mem_syn ) */ - Scale_sig( st->hLPDmem->mem_syn, M, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), curr_q_syn ) ); /* s_min( curr_q_syn, st->hLPDmem->q_mem_syn ) */ - Scale_sig( st->hLPDmem->mem_syn2, M, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), curr_q_syn ) ); /* s_min( curr_q_syn, st->hLPDmem->q_mem_syn ) */ - st->hLPDmem->mem_w0 = shl_sat( st->hLPDmem->mem_w0, sub( s_min( Q_new, st->hLPDmem->q_mem_syn ), Q_new ) ); /* s_min( Q_new, st->hLPDmem->q_mem_syn ) */ - move16(); - Scale_sig( st->hLPDmem->mem_syn1_fx, M, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), st->hLPDmem->q_mem_syn ) ); /* s_min( curr_q_syn, st->hLPDmem->q_mem_syn ) */ - Scale_sig( st->hLPDmem->mem_syn3, M, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), st->hLPDmem->q_mem_syn ) ); /* s_min( curr_q_syn, st->hLPDmem->q_mem_syn ) */ - st->hLPDmem->q_mem_syn = s_min( curr_q_syn, st->hLPDmem->q_mem_syn ); - move16(); - st->hLPDmem->q_lpd_syn = Q_new; - move16(); + IF( st->hTdCngEnc != NULL ) { FOR( Word16 ii = 0; ii < HO_HIST_SIZE; ii++ ) @@ -734,7 +719,7 @@ Word16 ivas_acelp_tcx20_switching_fx( Word16 *inp_fx, Word16 q_inp, Word16 *wsp, /*q_inp i : input weighted signal */ - Word16 non_staX, /*Q8 i : unbound non-stationarity for sp/mu clas*/ + Word32 non_staX, /*Q20 i : unbound non-stationarity for sp/mu clas*/ Word16 *pitch_fr, /*Q6 i : fraction pitch values */ Word16 *voicing_fr, /*Q15 i : fractional voicing values */ Word32 currFlatness, /*Q21 i : flatness */ @@ -772,7 +757,6 @@ Word16 ivas_acelp_tcx20_switching_fx( Word32 offset_tcx, target; Word32 y_fx[N_MAX]; Word32 tcx_snr; - Flag Overflow; Word32 gain, noise; Word16 noise_e = 0; move16(); @@ -789,7 +773,6 @@ Word16 ivas_acelp_tcx20_switching_fx( L_frame = L_FRAME; move16(); } -#ifdef MSAN_FIX set16_fx( window_fx, 0, L_LOOK_16k ); set16_fx( xn_buf_fx, 0, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX ); FOR( i = 0; i < L_LOOK_16k; i++ ) @@ -799,7 +782,6 @@ Word16 ivas_acelp_tcx20_switching_fx( window_p_fx[i].v.im = 0; move16(); } -#endif L_frame_tmp = L_frame; move16(); @@ -854,7 +836,6 @@ Word16 ivas_acelp_tcx20_switching_fx( overlap = st->hTcxCfg->tcx_mdct_window_delay; move16(); -#ifdef MSAN_FIX FOR( i = 0; i < st->hTcxCfg->tcx_mdct_window_length / 2; i++ ) { window_fx[st->hTcxCfg->tcx_mdct_window_length - 1 - i] = st->hTcxCfg->tcx_mdct_window[i].v.re; // Q15 @@ -862,15 +843,6 @@ Word16 ivas_acelp_tcx20_switching_fx( window_fx[i] = st->hTcxCfg->tcx_mdct_window[i].v.im; // Q15 move16(); } -#else - FOR( i = 0; i < L_LOOK_16k / 2; i++ ) - { - window_fx[L_LOOK_16k / 2 - 1 - i] = st->hTcxCfg->tcx_mdct_window[i].v.re; // Q15 - move16(); - window_fx[i] = st->hTcxCfg->tcx_mdct_window[i].v.im; // Q15 - move16(); - } -#endif } ELSE { @@ -1047,12 +1019,8 @@ Word16 ivas_acelp_tcx20_switching_fx( IF( LE_32( offset, 0xAA153 ) ) /* 0xAA153 -> 32.f * log2(10)/10 */ { -#ifdef FIX_USAN_ISSUES offset = (Word32) 0xFFD57AB5; /* 0xFFD57AB5 -> -128.f * log2(10)/10; */ move32(); -#else - offset = L_add( 0xFFD57AB5, 0 ); /* 0xFFD57AB5 -> -128.f * log2(10)/10; */ -#endif } offset_tcx = offset; move32(); @@ -1121,7 +1089,7 @@ Word16 ivas_acelp_tcx20_switching_fx( nrg_s = BASOP_Util_Add_Mant32Exp( nrg_s, e_num, Mpy_32_32( y_fx[i], y_fx[i] ), shl( e_x, 1 ), &e_num ); /* Q31-e_num */ nrg_n = BASOP_Util_Add_Mant32Exp( nrg_n, e_den, Mpy_32_32( x_fx[i], x_fx[i] ), shl( temp_ene_e, 1 ), &e_den ); /* Q31-e_den */ } - res_cod_SNR_M[iter] = BASOP_Util_Divide3232_Scale_cadence( nrg_s, nrg_n, &temp_e ); /* Q31-res_cod_SNR_M_e[iter] */ + res_cod_SNR_M[iter] = BASOP_Util_Divide3232_Scale_newton( nrg_s, nrg_n, &temp_e ); /* Q31-res_cod_SNR_M_e[iter] */ move32(); res_cod_SNR_M_e[iter] = add( temp_e, sub( e_num, e_den ) ); move16(); @@ -1155,11 +1123,7 @@ Word16 ivas_acelp_tcx20_switching_fx( { *pt_ener_sfr = -668739840; /* 0xFFEC1185 -> log2(1e-6) in 6Q25 */ move32(); -#ifdef FIX_USAN_ISSUES tmp32 = (Word32) 0xFFEC1185; /* 0xFFEC1185 -> log2(1e-6) in 15Q16 */ -#else - tmp32 = 0xFFEC1185; /* 0xFFEC1185 -> log2(1e-6) in 15Q16 */ -#endif move32(); } ELSE @@ -1280,7 +1244,7 @@ Word16 ivas_acelp_tcx20_switching_fx( test(); if ( ( GT_32( snr_acelp, tcx_snr ) ) && ( LT_32( snr_acelp, L_add( tcx_snr, 131072 /*2.0f Q16*/ ) ) ) && - ( LT_32( L_add_o( st->prevTempFlatness_32fx, currFlatness, &Overflow ), 6815744 /*3.25f Q21*/ ) || EQ_16( stab_fac, 0x7fff ) || + ( LT_32( L_add_sat( st->prevTempFlatness_32fx, currFlatness ), 6815744 /*3.25f Q21*/ ) || EQ_16( stab_fac, 0x7fff ) || ( !flag_16k_smc && ( st->sp_aud_decision0 > 0 ) && LT_32( L_add_sat( st->prevTempFlatness_32fx, currFlatness ), 41943040 /*20.f Q21*/ ) ) ) && ( LE_16( st->Nb_ACELP_frames, 6 ) ) ) { @@ -1315,7 +1279,7 @@ Word16 ivas_acelp_tcx20_switching_fx( test(); test(); test(); - if ( ( !flag_16k_smc ) && ( LT_32( offset_tcx, 0x18950F ) ) && GT_16( non_staX, 1280 /*5.0f Q8*/ ) && ( GE_32( snr_acelp, L_sub( tcx_snr, 262144 /*4.0f in Q16*/ ) ) ) && GE_16( st->Nb_ACELP_frames, 1 ) && ( ( GT_16( st->hSpMusClas->lps_fx, st->hSpMusClas->lpm_fx ) && GE_32( mean_voicing_fr, /* 0.3 in Q30 */ 322122547 ) ) || ( GE_16( st->Nb_ACELP_frames, 6 ) && GT_16( st->hSpMusClas->lps_fx, sub( st->hSpMusClas->lpm_fx, 192 /*1.5in Q7*/ ) ) ) ) && ( st->sp_aud_decision0 == 0 ) && st->vad_flag ) + if ( ( !flag_16k_smc ) && ( LT_32( offset_tcx, 0x18950F ) ) && GT_32( non_staX, 5242880 /*5.0f Q20*/ ) && ( GE_32( snr_acelp, L_sub( tcx_snr, 262144 /*4.0f in Q16*/ ) ) ) && GE_16( st->Nb_ACELP_frames, 1 ) && ( ( GT_16( st->hSpMusClas->lps_fx, st->hSpMusClas->lpm_fx ) && GE_32( mean_voicing_fr, /* 0.3 in Q30 */ 322122547 ) ) || ( GE_16( st->Nb_ACELP_frames, 6 ) && GT_16( st->hSpMusClas->lps_fx, sub( st->hSpMusClas->lpm_fx, 192 /*1.5in Q7*/ ) ) ) ) && ( st->sp_aud_decision0 == 0 ) && st->vad_flag ) { /* Fine tuned across various databases based on various metrics to detect TCX frames in speech.*/ dsnr = 262144; /*4.0f Q16*/ diff --git a/lib_enc/ivas_td_low_rate_enc_fx.c b/lib_enc/ivas_td_low_rate_enc_fx.c index a7dd9648607ffcbcee1d08f79169767477655f46..85c6bc41e31701c4f0a50888d703d96aa4f108ba 100644 --- a/lib_enc/ivas_td_low_rate_enc_fx.c +++ b/lib_enc/ivas_td_low_rate_enc_fx.c @@ -157,11 +157,13 @@ void tdm_low_rate_enc( { E_UTIL_synthesis( 0, p_Aq, &exc_wo_nf_fx[i_subfr], &synth[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1, M ); /* Q_new */ p_Aq += ( M + 1 ); + scale_sig( hLPDmem->mem_syn, M, sub( hLPDmem->q_mem_syn, Q_new ) ); // Q_new -> hLPDmem->q_mem_syn } /*--------------------------------------------------------------------------------------* * Updates *--------------------------------------------------------------------------------------*/ + Copy( exc_wo_nf_fx, exc_fx, L_FRAME ); /* Q_new */ return; @@ -221,13 +223,9 @@ void encod_gen_2sbfr( LPD_state_HANDLE hLPDmem = st->hLPDmem; -#ifdef FIX_1320_LOWRATE_ACELP Word16 gcode16; Word32 Lgcode, Ltmp; -#endif -#ifdef MSAN_FIX set16_fx( cn, 0, 2 * L_SUBFR ); /* Target vector in residual domain */ -#endif /*------------------------------------------------------------------* * Initializations @@ -268,11 +266,7 @@ void encod_gen_2sbfr( Copy( &res[i_subfr], &exc[i_subfr], 2 * L_SUBFR ); // Q_new -#ifndef FIX_1320_LOWRATE_ACELP - find_targets_fx( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, 2 * L_SUBFR, p_Aw, st->preemph_fac, xn, cn, h1 ); -#else find_targets_ivas_fx( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, 2 * L_SUBFR, p_Aw, st->preemph_fac, xn, cn, h1 ); -#endif q_h1 = sub( 14, norm_s( h1[0] ) ); Copy_Scale_sig( h1, h2, 2 * L_SUBFR, sub( 11, q_h1 ) ); @@ -281,7 +275,8 @@ void encod_gen_2sbfr( * Close-loop pitch search on the 1st and 3rd subfr only and quantization * Adaptive exc. construction *------------------------------------------------------------------------*/ - *pt_pitch = pit_encode_ivas_fx( st->hBstr, st->acelp_cfg.pitch_bits, st->core_brate, 0, L_frame, coder_type, &pitch_limit_flag, i_subfr, exc, 2 * L_SUBFR, st->pitch, &T0_min, &T0_max, &T0, &T0_frac, h1, xn, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf, Q_new ); + + *pt_pitch = pit_encode_fx( st->hBstr, st->acelp_cfg.pitch_bits, st->core_brate, 0, L_frame, coder_type, &pitch_limit_flag, i_subfr, exc, 2 * L_SUBFR, st->pitch, &T0_min, &T0_max, &T0, &T0_frac, h1, xn, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf, st->element_mode, Q_new ); move16(); Scale_sig( h1, 2 * L_SUBFR, sub( 13, q_h1 ) ); // Q13 @@ -292,27 +287,22 @@ void encod_gen_2sbfr( * Find adaptive exitation *-----------------------------------------------------------------*/ - pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, 2 * L_SUBFR + 1, inter4_2_fx_Q15, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, 2 * L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); /*-----------------------------------------------------------------* * Gain clipping test to avoid unstable synthesis on frame erasure *-----------------------------------------------------------------*/ -#ifndef FIX_1320_LOWRATE_ACELP - clip_gain = gp_clip_fx( st->element_mode, st->core_brate, st->voicing_fx, i_subfr, coder_type, xn, st->clip_var_fx, Q_new ); // Q0 -#else clip_gain = gp_clip_fx( st->element_mode, st->core_brate, st->voicing_fx, i_subfr, coder_type, xn, st->clip_var_fx, sub( Q_new, 1 ) ); // Q0 -#endif + /*-----------------------------------------------------------------* * LP filtering of the adaptive excitation, codebook target computation *-----------------------------------------------------------------*/ + Scale_sig( h1, 2 * L_SUBFR, add( 1, shift ) ); /* set h1[] in Q14 with scaling for convolution */ -#ifndef FIX_1320_LOWRATE_ACELP lp_filt_exc_enc_fx( MODE1, coder_type, i_subfr, exc, h1, xn, y1, xn2, 2 * L_SUBFR, L_frame, g_corr, clip_gain, &gain_pit, &st->acelp_cfg.ltf_mode ); -#else - lp_filt_exc_enc_ivas_fx( MODE1, coder_type, i_subfr, exc, h1, xn, y1, xn2, 2 * L_SUBFR, L_frame, g_corr, clip_gain, &gain_pit, &st->acelp_cfg.ltf_mode ); -#endif + /* update long-term pitch gain for speech/music classifier */ #ifdef IMPROV_PRECISION st->hSpMusClas->lowrate_pitchGain = mac_r( L_mult( 29491, st->hSpMusClas->lowrate_pitchGain ), 3277 /*Q15*/, gain_pit ); // Q14 @@ -331,7 +321,8 @@ void encod_gen_2sbfr( * Gain encoding *-----------------------------------------------------------------*/ - gain_enc_lbr_ivas_fx( st->hBstr, st->acelp_cfg.gains_mode, coder_type, i_subfr, xn, y1, add( sub( Q_new, 1 ), shift ), y2, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, gc_mem, gp_mem, clip_gain, 2 * L_SUBFR ); + gain_enc_lbr_fx( st->hBstr, st->acelp_cfg.gains_mode, coder_type, i_subfr, xn, y1, add( sub( Q_new, 1 ), shift ), y2, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, gc_mem, gp_mem, clip_gain, 2 * L_SUBFR, + st->element_mode ); IF( st->Opt_SC_VBR ) { @@ -349,22 +340,15 @@ void encod_gen_2sbfr( gp_clip_test_gain_pit_fx( st->element_mode, st->core_brate, gain_pit, st->clip_var_fx ); -#ifndef FIX_1320_LOWRATE_ACELP - hLPDmem->tilt_code = est_tilt_ivas_fx( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, Q_new, 2 * L_SUBFR, 0 ); -#else Lgcode = L_shl_sat( gain_code, Q_new ); /* scaled gain_code with Qnew -> Q16*/ gcode16 = round_fx_sat( Lgcode ); /*Q0*/ hLPDmem->tilt_code = est_tilt_ivas_fx( exc + i_subfr, gain_pit, code, Lgcode, &voice_fac, Q_new, 2 * L_SUBFR, 0 ); /* Q15 */ -#endif move16(); /*-----------------------------------------------------------------* * Update memory of the weighting filter *-----------------------------------------------------------------*/ -#ifndef FIX_1320_LOWRATE_ACELP - hLPDmem->mem_w0 = sub( sub( xn[2 * L_SUBFR - 1], mult_r( gain_pit, y1[2 * L_SUBFR - 1] ) ), mult_r( extract_h( gain_code ), y2[2 * L_SUBFR - 1] ) ); -#else Ltmp = L_mult0( gcode16, y2[2 * L_SUBFR - 1] ); /*Q10*/ Ltmp = L_shl( Ltmp, add( 5, shift ) ); /*Q15+shift*/ Ltmp = L_negate( Ltmp ); @@ -372,7 +356,6 @@ void encod_gen_2sbfr( Ltmp = L_msu( Ltmp, y1[2 * L_SUBFR - 1], gain_pit /*Q14*/ ); /* Q_new-1+shift+14+1 */ Ltmp = L_shl_sat( Ltmp, sub( 1, shift ) ); /* 15 + Q_new */ hLPDmem->mem_w0 = round_fx_sat( Ltmp ); /*Q_new-1 */ -#endif move16(); /*-----------------------------------------------------------------* @@ -380,15 +363,6 @@ void encod_gen_2sbfr( * Save the non-enhanced excitation for FEC_exc *-----------------------------------------------------------------*/ -#ifndef FIX_1320_LOWRATE_ACELP - FOR( i = 0; i < 2 * L_SUBFR; i++ ) - { - exc2[i + i_subfr] = mult( gain_pit, exc[i + i_subfr] ); - move16(); - exc[i + i_subfr] = add( exc2[i + i_subfr], mult( extract_h( gain_code ), code[i] ) ); - move16(); - } -#else FOR( i = 0; i < 2 * L_SUBFR; i++ ) { /* code in Q9, gain_pit in Q14 */ @@ -401,12 +375,12 @@ void encod_gen_2sbfr( move16(); move16(); } -#endif + /*-----------------------------------------------------------------* * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, 0, NULL, Q_new, T0, T0_frac, coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, 0, NULL, Q10, Q_new, T0, T0_frac, coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); voice_factors[i_subfr / L_SUBFR + 1] = voice_factors[i_subfr / L_SUBFR]; /* Q15 */ move16(); @@ -415,11 +389,8 @@ void encod_gen_2sbfr( * Synthesize speech to update mem_syn_flt[]. * Update A(z) filters *-----------------------------------------------------------------*/ -#ifndef FIX_1320_LOWRATE_ACELP - E_UTIL_synthesis( 0, p_Aq, &exc[i_subfr], &syn[i_subfr], 2 * L_SUBFR, hLPDmem->mem_syn, 1, M ); -#else + Syn_filt_s( 1, p_Aq, M, &exc[i_subfr], &syn[i_subfr], 2 * L_SUBFR, hLPDmem->mem_syn, 1 ); -#endif p_Aw += 2 * ( M + 1 ); p_Aq += 2 * ( M + 1 ); diff --git a/lib_enc/lead_indexing_fx.c b/lib_enc/lead_indexing_fx.c index 70e0c4796ac2a53ea93ea8b1e7368999f4726e5c..361b2493592b843f2612fa7cfe5d2ea3da2648aa 100644 --- a/lib_enc/lead_indexing_fx.c +++ b/lib_enc/lead_indexing_fx.c @@ -1,11 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "cnst.h" -//#include "prot_fx.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -13,6 +12,7 @@ /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ + static Word16 fcb_encode_pos_fx( const Word16 pos_vector[], const Word16 pulse_num, const Word16 pos_num ); /*-------------------------------------------------------------------* @@ -20,6 +20,7 @@ static Word16 fcb_encode_pos_fx( const Word16 pos_vector[], const Word16 pulse_n * * Compute base index for RE8 *-------------------------------------------------------------------*/ + void re8_compute_base_index_fx( const Word16 *x, /* i : Elemen of Q2, Q3 or Q4 */ const Word16 ka, /* i : Identifier of the absolute leader related to x Q0*/ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc_fx.c similarity index 84% rename from lib_enc/lib_enc.c rename to lib_enc/lib_enc_fx.c index 09e3efc84967a3f1de9618ca78c4c1c079fd4534..eaf16ab5c97e028fc40c813a6299e0e10720388a 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc_fx.c @@ -70,7 +70,7 @@ struct IVAS_ENC * Local functions *---------------------------------------------------------------------*/ -static ivas_error configureEncoder_fx( IVAS_ENC_HANDLE hIvasEnc, const Word32 inputFs, const Word32 initBitrate, const IVAS_ENC_BANDWIDTH initBandwidth, const IVAS_ENC_DTX_CONFIG dtxConfig, const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ); +// static ivas_error configureEncoder_fx( IVAS_ENC_HANDLE hIvasEnc, const Word32 inputFs, const Word32 initBitrate, const IVAS_ENC_BANDWIDTH initBandwidth, const IVAS_ENC_DTX_CONFIG dtxConfig, const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ); static ivas_error setBandwidth_fx( IVAS_ENC_HANDLE hIvasEnc, const IVAS_ENC_BANDWIDTH maxBandwidth ); static ivas_error setChannelAwareConfig_fx( IVAS_ENC_HANDLE hIvasEnc, const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ); static ivas_error sanitizeBandwidth_fx( const IVAS_ENC_HANDLE hIvasEnc ); @@ -540,12 +540,7 @@ ivas_error IVAS_ENC_FeedObjectMetadata( { return IVAS_ERR_INVALID_INDEX; } - Word32 azimuth_fx = float_to_fix( metadata.azimuth, Q22 ); /* Q22 */ - Word32 elevation_fx = float_to_fix( metadata.elevation, Q22 ); /* Q22 */ - Word16 radius_fx = float_to_fix16( metadata.radius, Q9 ); /* Q9 */ - Word32 yaw_fx = float_to_fix( metadata.yaw, Q22 ); /* Q22 */ - Word32 pitch_fx = float_to_fix( metadata.pitch, Q22 ); /* Q22 */ - error = ivas_set_ism_metadata_fx( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], azimuth_fx, elevation_fx, radius_fx, yaw_fx, pitch_fx, metadata.non_diegetic_flag ); + error = ivas_set_ism_metadata_fx( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth_fx, metadata.elevation_fx, metadata.radius_fx, metadata.yaw_fx, metadata.pitch_fx, metadata.non_diegetic_flag ); IF( error != IVAS_ERR_OK ) { @@ -607,51 +602,6 @@ ivas_error IVAS_ENC_ConfigureForAmbisonics( error = configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); - return error; -} -ivas_error IVAS_ENC_ConfigureForAmbisonics_fx( - IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ - const Word32 inputFs, /* i : input sampling frequency */ - const Word32 bitrate, /* i : requested bitrate of the output bitstream */ - const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ - const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ - const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ - const IVAS_ENC_SBA_ORDER order, /* i : order of the Ambisonics input */ - const bool isPlanar, /* i : if true, input is treated as planar Ambisonics */ - const bool Opt_PCA_ON /* i : PCA option flag */ -) -{ - ENCODER_CONFIG_HANDLE hEncoderConfig; - ivas_error error; - - IF( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK ) - { - return error; - } - - hEncoderConfig = hIvasEnc->st_ivas->hEncoderConfig; - - hEncoderConfig->ivas_format = SBA_FORMAT; - hEncoderConfig->element_mode_init = IVAS_SCE; /* Just needs to be something not mono, will be set later */ - hEncoderConfig->sba_planar = isPlanar; - hEncoderConfig->sba_order = order; - move16(); - move16(); - move16(); - - /* Input in ACN/SN3D in all cases (3D and planar): get number of channels */ - hEncoderConfig->nchan_inp = ivas_sba_get_nchan_fx( hEncoderConfig->sba_order, 0 ); /*planar input arg. deliberately set to zero since input always in ACN/SN3D*/ - move16(); - - - hEncoderConfig->Opt_PCA_ON = (Word16) Opt_PCA_ON; - move16(); - - hIvasEnc->maxBandwidthUser = max_bwidth_user; - - error = configureEncoder_fx( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); - - return error; } /*---------------------------------------------------------------------* @@ -1166,343 +1116,7 @@ static ivas_error configureEncoder( test(); test(); test(); -#ifdef NONBE_FIX_708_OSBA_BR_SWITCHING_CRASH IF( hEncoderConfig->Opt_PCA_ON && !( ( EQ_16( hEncoderConfig->ivas_format, SBA_FORMAT ) || EQ_16( hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) ) && EQ_32( hEncoderConfig->ivas_total_brate, PCA_BRATE ) && EQ_16( hEncoderConfig->sba_order, SBA_FOA_ORDER ) ) ) -#else - if ( hEncoderConfig->Opt_PCA_ON && !( hEncoderConfig->ivas_format == SBA_FORMAT && hEncoderConfig->ivas_total_brate == PCA_BRATE && hEncoderConfig->sba_order == SBA_FOA_ORDER ) ) -#endif - { - return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "PCA supported at SBA FOA 256 kbps only." ); - } - - IF( ( error = sanitizeBandwidth_fx( hIvasEnc ) ) != IVAS_ERR_OK ) - { - return error; - } - - test(); - test(); - test(); - IF( hEncoderConfig->is_binaural && !( ( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) && hEncoderConfig->stereo_dmx_evs ) || EQ_16( hEncoderConfig->ivas_format, STEREO_FORMAT ) ) ) - { - return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "'-binaural' option is supported only with '-stereo' or '-stereo_dmx_evs'" ); - } - - /*-----------------------------------------------------------------* - * Finalize initialization - *-----------------------------------------------------------------*/ - - IF( ( error = ivas_init_encoder( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) ) - { - hIvasEnc->hCoreCoder = st_ivas->hSCE[0]->hCoreCoder[0]; /* Note: this is needed for switching in EVS mono */ - } - ELSE - { - hIvasEnc->hCoreCoder = NULL; - } - - hIvasEnc->Opt_RF_ON_loc = hEncoderConfig->Opt_RF_ON; - hIvasEnc->rf_fec_offset_loc = hEncoderConfig->rf_fec_offset; - move16(); - move16(); - - hIvasEnc->isConfigured = true; - - return error; -} -static ivas_error configureEncoder_fx( - IVAS_ENC_HANDLE hIvasEnc, - const Word32 inputFs, - const Word32 initBitrate, - const IVAS_ENC_BANDWIDTH initBandwidth, - const IVAS_ENC_DTX_CONFIG dtxConfig, - const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ) -{ - Encoder_Struct *st_ivas; - ENCODER_CONFIG_HANDLE hEncoderConfig; - ivas_error error; - Word32 cpe_brate; - - error = IVAS_ERR_OK; - - st_ivas = hIvasEnc->st_ivas; - hEncoderConfig = st_ivas->hEncoderConfig; - - /*-----------------------------------------------------------------* - * Bandwidth limitation - *-----------------------------------------------------------------*/ - - IF( ( error = setBandwidth_fx( hIvasEnc, initBandwidth ) ) != IVAS_ERR_OK ) - { - return error; - } - - /*-----------------------------------------------------------------* - * DTX/CNG - *-----------------------------------------------------------------*/ - - IF( dtxConfig.enabled ) - { - hEncoderConfig->Opt_DTX_ON = 1; - move16(); - - IF( dtxConfig.variable_SID_rate ) - { - hEncoderConfig->var_SID_rate_flag = 1; - hEncoderConfig->interval_SID = 0; - move16(); - move16(); - } - ELSE - { - hEncoderConfig->var_SID_rate_flag = 0; - move16(); - test(); - IF( GE_16( dtxConfig.SID_interval, 3 ) && LE_16( dtxConfig.SID_interval, 100 ) ) - { - hEncoderConfig->interval_SID = dtxConfig.SID_interval; - move16(); - } - ELSE - { - return IVAS_ERR_INVALID_DTX_UPDATE_RATE; - } - } - } - ELSE - { - hEncoderConfig->Opt_DTX_ON = 0; - move16(); - } - - /*-----------------------------------------------------------------* - * Bitrate - *-----------------------------------------------------------------*/ - - hEncoderConfig->ivas_total_brate = initBitrate; - move16(); - - /* SC-VBR at 5.90 kbps */ - IF( EQ_32( hEncoderConfig->ivas_total_brate, ACELP_5k90 ) ) - { - hEncoderConfig->ivas_total_brate = ACELP_7k20; - hEncoderConfig->Opt_SC_VBR = 1; - hEncoderConfig->last_Opt_SC_VBR = hEncoderConfig->Opt_SC_VBR; - move32(); - move16(); - move16(); - - IF( ( hEncoderConfig->max_bwidth != NB ) ) - { - hEncoderConfig->max_bwidth = WB; - move16(); - } - } - - /* check if the entered bitrate is supported */ - test(); - IF( NE_16( hEncoderConfig->ivas_format, UNDEFINED_FORMAT ) && NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) ) /* IVAS */ - { - IF( !is_IVAS_bitrate_fx( hEncoderConfig->ivas_total_brate ) ) - { - IF( hEncoderConfig->Opt_SC_VBR ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in IVAS [bps]: %d", ACELP_5k90 ); - } - ELSE - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in IVAS [bps]: %d", hEncoderConfig->ivas_total_brate ); - } - } - - IF( EQ_16( hEncoderConfig->ivas_format, STEREO_FORMAT ) ) - { - { - hEncoderConfig->element_mode_init = IVAS_CPE_DFT; - move16(); - IF( GE_32( hEncoderConfig->ivas_total_brate, MIN_BRATE_MDCT_STEREO ) ) - { - hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - } - - test(); - test(); - IF( ( EQ_16( hEncoderConfig->element_mode_init, IVAS_CPE_TD ) || EQ_32( hEncoderConfig->element_mode_init, IVAS_CPE_DFT ) ) && GT_32( hEncoderConfig->ivas_total_brate, IVAS_48k ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for TD/DFT Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); - } - - test(); - IF( EQ_16( hEncoderConfig->element_mode_init, IVAS_CPE_MDCT ) && LT_32( hEncoderConfig->ivas_total_brate, IVAS_48k ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for MDCT Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); - } - - test(); - IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_256k ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); - } - } - ELSE IF( EQ_16( hEncoderConfig->ivas_format, ISM_FORMAT ) ) - { - IF( ( error = sanitizeBitrateISM_fx( hEncoderConfig, hIvasEnc->extMetadataApi ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE IF( EQ_16( hEncoderConfig->ivas_format, SBA_FORMAT ) ) - { - /* nothing */ - } - ELSE IF( EQ_16( hEncoderConfig->ivas_format, MASA_FORMAT ) ) - { - /* adapt element_mode according to the bitrate */ - test(); - IF( EQ_16( hEncoderConfig->nchan_inp, 2 ) && NE_16( hEncoderConfig->element_mode_init, IVAS_SCE ) ) - { - IF( GE_32( hEncoderConfig->ivas_total_brate, IVAS_48k ) ) - { - hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - ELSE IF( LT_32( hEncoderConfig->ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) - { - hEncoderConfig->element_mode_init = IVAS_CPE_DFT; - move16(); - } - } - } - ELSE IF( EQ_32( hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) ) - { - st_ivas->ism_mode = ivas_omasa_ism_mode_select_fx( st_ivas->hEncoderConfig->ivas_total_brate, hEncoderConfig->nchan_ism ); - - cpe_brate = calculate_cpe_brate_MASA_ISM_fx( st_ivas->ism_mode, st_ivas->hEncoderConfig->ivas_total_brate, hEncoderConfig->nchan_ism ); - - /*adapt element_mode according to the bit-rate*/ - IF( NE_16( hEncoderConfig->element_mode_init, IVAS_SCE ) ) - { - IF( GE_32( cpe_brate, IVAS_48k ) ) - { - hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - } - } - ELSE IF( EQ_16( hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) ) - { - st_ivas->ism_mode = ISM_MODE_NONE; - } - } - ELSE /* EVS mono */ - { - hEncoderConfig->ivas_format = MONO_FORMAT; - hEncoderConfig->element_mode_init = EVS_MONO; - move16(); - - IF( !is_EVS_bitrate( hEncoderConfig->ivas_total_brate, &hEncoderConfig->Opt_AMR_WB ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in EVS mono: %d", hEncoderConfig->ivas_total_brate ); - } - - IF( EQ_16( hEncoderConfig->stereo_dmx_evs, 1 ) ) - { - hEncoderConfig->nchan_inp = 2; - move16(); - } - } - - /*-----------------------------------------------------------------* - * Input sampling frequency - *-----------------------------------------------------------------*/ - test(); - test(); - test(); - IF( NE_32( inputFs, 8000 ) && NE_32( inputFs, 16000 ) && NE_32( inputFs, 32000 ) && NE_32( inputFs, 48000 ) ) - { - return IVAS_ERR_INVALID_SAMPLING_RATE; - } - - hEncoderConfig->input_Fs = inputFs; - move32(); - - /*-----------------------------------------------------------------* - * Channel-aware mode - *-----------------------------------------------------------------*/ - - IF( ( error = setChannelAwareConfig_fx( hIvasEnc, caConfig ) ) != IVAS_ERR_OK ) - { - return error; - } - - /*-----------------------------------------------------------------* - * Set codec mode - *-----------------------------------------------------------------*/ - - st_ivas->codec_mode = MODE1; /* Note: in IVAS, set MODE1 */ - move16(); - - IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) ) - { - IF( hEncoderConfig->Opt_AMR_WB ) - { - st_ivas->codec_mode = MODE1; - move16(); - } - ELSE - { - st_ivas->codec_mode = get_codec_mode( hEncoderConfig->ivas_total_brate ); - move16(); - } - } - - test(); - IF( EQ_32( hEncoderConfig->ivas_total_brate, IVAS_13k2 ) && EQ_16( hEncoderConfig->Opt_RF_ON, 1 ) ) - { - st_ivas->codec_mode = MODE2; - move16(); - } - - st_ivas->last_codec_mode = st_ivas->codec_mode; - move16(); - - /*-----------------------------------------------------------------* - * Sanity checks - *-----------------------------------------------------------------*/ - - assert( hEncoderConfig->ivas_format != UNDEFINED_FORMAT && "\n IVAS format undefined" ); - - test(); - test(); - IF( ( NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) || hEncoderConfig->stereo_dmx_evs ) && EQ_32( hEncoderConfig->input_Fs, 8000 ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz input sampling rate is not supported in IVAS." ); - } - - test(); - test(); - test(); - test(); - test(); - test(); - IF( hEncoderConfig->Opt_DTX_ON && NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) && - ( ( EQ_16( hEncoderConfig->ivas_format, SBA_FORMAT ) && GT_32( ivas_get_sba_num_TCs_fx( hEncoderConfig->ivas_total_brate, 1 ), 2 ) ) || - EQ_16( hEncoderConfig->ivas_format, MC_FORMAT ) || EQ_16( hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) || EQ_16( hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) ) ) - { - return IVAS_ERROR( IVAS_ERR_DTX_NOT_SUPPORTED, "DTX is not supported in this IVAS format and element mode." ); - } - - test(); - test(); - test(); - IF( hEncoderConfig->Opt_PCA_ON && !( EQ_16( hEncoderConfig->ivas_format, SBA_FORMAT ) && EQ_32( hEncoderConfig->ivas_total_brate, PCA_BRATE ) && EQ_16( hEncoderConfig->sba_order, SBA_FOA_ORDER ) ) ) { return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "PCA supported at SBA FOA 256 kbps only." ); } @@ -1572,7 +1186,7 @@ ivas_error IVAS_ENC_GetDelay( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - *delay = NS2SA_FX2( hEncoderConfig->input_Fs, get_delay_fx( ENC, hEncoderConfig->input_Fs, hEncoderConfig->ivas_format, NULL ) ); /*Q0*/ + *delay = NS2SA_FX2( hEncoderConfig->input_Fs, get_delay_fx( ENC, hEncoderConfig->input_Fs, hEncoderConfig->ivas_format, NULL, 0 ) ); move16(); *delay = imult1616( *delay, hEncoderConfig->nchan_inp ); /*Q0*/ @@ -1783,7 +1397,12 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( st_ivas->ind_list[i].nb_bits = -1; move16(); } - +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) + { + memset( st_ivas->ind_list[i].function_name, 'A', 100 * sizeof( char ) ); + } +#endif /* de-allocate old buffer of metadata indices */ IF( st_ivas->ind_list_metadata != NULL ) { @@ -1817,17 +1436,10 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( /* set pointers to the new buffers of indices in each element */ FOR( n = 0; n < st_ivas->nSCE; n++ ) { - test(); - IF( !( hIvasEnc->hCoreCoder == NULL && EQ_32( hEncoderConfig->ivas_format, MONO_FORMAT ) ) ) - { - if ( ( hEncoderConfig->element_mode_init != EVS_MONO ) ) - { - st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; - } - st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; - } + st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; + st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; - IF( st_ivas->hSCE[n]->hMetaData != NULL ) + if ( st_ivas->hSCE[n]->hMetaData != NULL ) { st_ivas->hSCE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata; st_ivas->hSCE[n]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; @@ -1872,51 +1484,63 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( IF( hEncoderConfig->Opt_AMR_WB ) { - amr_wb_enc_fx( hCoreCoder, inputBuffer, inputBufferSize ); + amr_wb_enc_fx( hCoreCoder, inputBuffer, st_ivas->mem_hp20_in_fx[0], inputBufferSize ); } ELSE { #ifdef DEBUG_MODE_INFO dbgwrite( inputBuffer, sizeof( int16_t ), inputBufferSize, 1, strcat( fname( debug_dir, "ivas_input_dmx", 0, 1, ENC ), ".pcm" ) ); #endif - hCoreCoder->input_frame_fx = inputBufferSize; - move32(); - IF( NE_32( ( error = evs_enc_fx( hCoreCoder, inputBuffer, hCoreCoder->mem_hp20_in_fx, inputBufferSize ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = evs_enc_fx( hCoreCoder, inputBuffer, st_ivas->mem_hp20_in_fx[0], inputBufferSize ) ), IVAS_ERR_OK ) ) { return error; } } } ELSE /* IVAS */ - { - IF( NE_32( ( error = ivas_enc_fx( st_ivas, inputBuffer, inputBufferSize ) ), IVAS_ERR_OK ) ) { - return error; - } - } + IF( NE_32( ( error = ivas_enc_fx( st_ivas, inputBuffer, inputBufferSize ) ), IVAS_ERR_OK ) ){ + return error; +} +} - /* write indices into bitstream buffer */ - IF( hEncoderConfig->element_mode_init == EVS_MONO ) - { - test(); - IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) && ( hCoreCoder->element_mode == EVS_MONO ) ) - { - /* write indices into bitstream file */ - UWord8 pFrame[( MAX_BITS_PER_FRAME + 7 ) >> 3]; - Word16 pFrame_size = 0; - move16(); - write_indices_buf_fx( hCoreCoder, hCoreCoder->hBstr, outputBitStream, pFrame, pFrame_size, numOutBits ); - } - } - ELSE +/* write indices into bitstream buffer */ +{ + write_indices_ivas_fx( st_ivas, outputBitStream, numOutBits ); +} +/* Reset switching flag before next call - can be set to "true" by some setters */ +hIvasEnc->switchingActive = false; +move16(); + +return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_ENC_EncodeFrameToCompact() + * + * Main function to encode one frame to a compact bitstream (bytestream) + *---------------------------------------------------------------------*/ + +ivas_error IVAS_ENC_EncodeFrameToCompact( + IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ + Word16 *inputBuffer, /* i : PCM input */ + const Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */ + UWord8 *outputBitStream, /* o : pointer to compact output bitstream. The array must already be allocated. */ + UWord16 *numOutBits /* o : number of bits written to output bitstream */ +) +{ + ivas_error error; + UWord16 bitstream[IVAS_MAX_BITS_PER_FRAME]; + + IF( NE_32( error = IVAS_ENC_EncodeFrameToSerial( hIvasEnc, inputBuffer, inputBufferSize, bitstream, numOutBits ), IVAS_ERR_OK ) ) { - write_indices_ivas_fx( st_ivas, outputBitStream, numOutBits ); + return error; } - /* Reset switching flag before next call - can be set to "true" by some setters */ - hIvasEnc->switchingActive = false; - move16(); - return error; + convertSerialToBytestream_fx( bitstream, *numOutBits, outputBitStream ); + + return IVAS_ERR_OK; } @@ -2637,41 +2261,7 @@ static ivas_error sanitizeBandwidth_fx( } } - IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) ) - { -#if 0 // IVAS_fmToDo: temporary disabled to keep EVS bit-exactness -> to be verified - if (max_bwidth_tmp == FB && hEncoderConfig->ivas_total_brate < ACELP_16k40) - { - if (hEncoderConfig->ivas_total_brate < ACELP_9k60) - { - max_bwidth_tmp = WB; - } - else - { - max_bwidth_tmp = SWB; - } - } - - if (max_bwidth_tmp == SWB && hEncoderConfig->ivas_total_brate < ACELP_9k60) - { - max_bwidth_tmp = WB; - } - - /* in case of 8kHz input sampling or "-max_band NB", require the total bitrate to be below 24.40 kbps */ - if ((max_bwidth_tmp == NB || hEncoderConfig->input_Fs == 8000) && hEncoderConfig->ivas_total_brate > ACELP_24k40) - { - if (hEncoderConfig->input_Fs >= 16000) - { - max_bwidth_tmp = WB; - } - else - { - return IVAS_ERR_INVALID_BITRATE; - } - } -#endif - } - ELSE + IF( NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) ) { Word32 quo = 0, rem; move32(); diff --git a/lib_enc/long_enr_fx.c b/lib_enc/long_enr_fx.c index af57edd3bd4629ef64c1c16842bc91d572fd67c7..0228b6cbeacab739bc3cc11f9ae6a6f67cfc300e 100644 --- a/lib_enc/long_enr_fx.c +++ b/lib_enc/long_enr_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include "options.h" /* Compilation switches */ @@ -16,8 +16,8 @@ * Compute relative energy, long-term average total noise energy and total active speech energy *-------------------------------------------------------------------*/ void ivas_long_enr_fx( - Encoder_State *st_fx, /* i/o: state structure */ - const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) Q8 */ + Encoder_State *st_fx, /* i/o: state structure */ + const Word32 Etot, /* i : total channel E (see lib_enc\analy_sp.c) Q24 */ const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover Q0*/ Word16 high_lpn_flag, /* i : sp/mus LPN flag Q0*/ FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ @@ -28,7 +28,7 @@ void ivas_long_enr_fx( ) { Word16 tmp; - Word16 alpha; + Word32 alpha; NOISE_EST_HANDLE hNoiseEst = st_fx->hNoiseEst; /*-----------------------------------------------------------------* @@ -42,7 +42,7 @@ void ivas_long_enr_fx( { FOR( n = 0; n < n_chan; n++ ) { - hFrontVad[n]->lp_noise_fx = hFrontVad[n]->hNoiseEst->totalNoise_fx; /* Q8 */ + hFrontVad[n]->lp_noise_fx = extract_h( hFrontVad[n]->hNoiseEst->totalNoise_32fx ); /* Q8 */ move16(); tmp = add( hFrontVad[n]->lp_noise_fx, 2560 ); /* Q8 */ @@ -74,7 +74,7 @@ void ivas_long_enr_fx( FOR( n = 0; n < n_chan; n++ ) { - hFrontVad[n]->lp_noise_fx = add( mult_r( smooth_prev, hFrontVad[n]->lp_noise_fx ), mult_r( smooth_curr, hFrontVad[n]->hNoiseEst->totalNoise_fx ) ); /* Q8 */ + hFrontVad[n]->lp_noise_fx = add( mult_r( smooth_prev, hFrontVad[n]->lp_noise_fx ), mult_r( smooth_curr, extract_h( hFrontVad[n]->hNoiseEst->totalNoise_32fx ) ) ); /* Q8 */ move16(); test(); IF( localVAD_HE_SAD_LR[n] && !high_lpn_flag ) @@ -94,7 +94,7 @@ void ivas_long_enr_fx( } FOR( n = 0; n < n_chan; n++ ) { - hFrontVad[n]->hNoiseEst->Etot_last_fx = Etot_LR[n]; /* Q8 */ + hFrontVad[n]->hNoiseEst->Etot_last_32fx = L_deposit_h( Etot_LR[n] ); /* Q24 */ move16(); } } @@ -102,11 +102,11 @@ void ivas_long_enr_fx( { IF( LT_16( st_fx->ini_frame, 4 ) ) { - st_fx->lp_noise_fx = hNoiseEst->totalNoise_fx; /* Q8 */ - move16(); - tmp = add( st_fx->lp_noise_fx, 2560 ); /*10.0 in Q8*/ - st_fx->lp_speech_fx = s_max( st_fx->lp_speech_fx, tmp ); - move16(); + st_fx->lp_noise_32fx = hNoiseEst->totalNoise_32fx; /* Q24 */ + move32(); + Word32 tmp1 = L_add( st_fx->lp_noise_32fx, 167772160 ); /*10.0 in Q24*/ + st_fx->lp_speech_32fx = L_max( st_fx->lp_speech_32fx, tmp1 ); + move32(); } ELSE { @@ -115,34 +115,34 @@ void ivas_long_enr_fx( } else { st->lp_noise = 0.98f * st->lp_noise + 0.02f * st->totalNoise; } */ - alpha = 655; /* 0.02 Q15 */ - move16(); + alpha = 42949673; /* 0.02 Q31 */ + move32(); if ( LT_16( st_fx->ini_frame, 150 ) ) /* should match HE_LT_CNT_INIT_FX */ { - alpha = 1638; - move16(); /* 0.05 Q15 */ + alpha = 107374182; + move32(); /* 0.05 Q31 */ } - st_fx->lp_noise_fx = noise_est_AR1_Qx( hNoiseEst->totalNoise_fx, st_fx->lp_noise_fx, alpha ); /* Q8 state, alpha in Q15 */ - move16(); + st_fx->lp_noise_32fx = noise_est_AR1_Qx_32( hNoiseEst->totalNoise_32fx, st_fx->lp_noise_32fx, alpha ); /* Q24 state, alpha in Q31 */ + move32(); test(); IF( ( localVAD_HE_SAD != 0 ) && ( high_lpn_flag == 0 ) ) { - IF( LT_16( sub( st_fx->lp_speech_fx, Etot ), 2560 ) ) /* 10.0 in Q8 */ + IF( LT_32( L_sub( st_fx->lp_speech_32fx, Etot ), 167772160 ) ) /* 10.0 in Q24 */ { /* st->lp_speech = 0.98f * st->lp_speech + 0.02f * Etot; */ - st_fx->lp_speech_fx = noise_est_AR1_Qx( Etot, st_fx->lp_speech_fx, 655 ); /* Q8 state, 0.02 in Q15 */ - move16(); + st_fx->lp_speech_32fx = noise_est_AR1_Qx_32( Etot, st_fx->lp_speech_32fx, 42949673 ); /* Q24 state, 0.02 in Q31 */ + move32(); } ELSE { - st_fx->lp_speech_fx = sub( st_fx->lp_speech_fx, 13 ); /* st->lp_speech = st->lp_speech - 0.05f; linear decay*/ - move16(); + st_fx->lp_speech_32fx = L_sub( st_fx->lp_speech_32fx, 838861 ); /* st->lp_speech = st->lp_speech - 0.05f; linear decay*/ + move32(); } } } /* Update */ - st_fx->hNoiseEst->Etot_last_fx = Etot; /* Q8 */ - move16(); + st_fx->hNoiseEst->Etot_last_32fx = Etot; /* Q24 */ + move32(); } /*-----------------------------------------------------------------* @@ -153,7 +153,7 @@ void ivas_long_enr_fx( void long_enr_fx( - Encoder_State *st_fx, /* i/o: state structure */ + Encoder_State *st_fx, /* i/o: state structure */ const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) Q8*/ const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover Q0*/ Word16 high_lpn_flag /* i : sp/mus LPN flag Q0*/ diff --git a/lib_enc/lp_exc_e_fx.c b/lib_enc/lp_exc_e_fx.c index 01005f6419fac1fdfb8a1c1dad6f30bdb96f60e1..fca0200f0bd3e05bd6c9160b6bfd35c1204fb704 100644 --- a/lib_enc/lp_exc_e_fx.c +++ b/lib_enc/lp_exc_e_fx.c @@ -1,10 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -174,162 +174,6 @@ Word16 lp_filt_exc_enc_fx( return select; } -Word16 lp_filt_exc_enc_ivas_fx( - const Word16 codec_mode, /* i : MODE1 or MODE2 Q0 */ - const Word16 coder_type, /* i : coding type Q0 */ - const Word16 i_subfr, /* i : subframe index Q0 */ - Word16 *exc, /* i/o: pointer to excitation signal frame Q_new */ - const Word16 *h1, /* i : weighted filter input response Q(15) */ - const Word16 *xn, /* i : target vector Q_new-1+shift */ - Word16 *y1, /* o : zero-memory filtered adaptive excitation Q_new-1+shift */ - Word16 *xn2, /* o : target vector for innovation search Q_new-1+shift */ - const Word16 L_subfr, /* i : length of vectors for gain quantization Q0 */ - const Word16 L_frame, /* i : frame size Q0 */ - Word16 *g_corr, /* o : ACELP correlation values mant/exp */ - const Word16 clip_gain, /* i : adaptive gain clipping flag Q0 */ - Word16 *gain_pit, /* o : adaptive excitation gain Q14 */ - Word16 *lp_flag /* i/o: mode selection Q0 */ -) -{ - Word16 gain1, gain2, g_corr2[4], exc_tmp[5 * L_SUBFR], xn2_tmp[5 * L_SUBFR]; - Word16 y1_tmp[5 * L_SUBFR]; - Word16 select, i, exp_ener, exp_ener1; - Word16 wtmp, wtmp1; - Word32 Ltmp; - - Word16 use_prev_sf_pit_gain = 0; // Q0 - move16(); - - gain1 = 0; - move16(); - gain2 = 0; - move16(); - - /*----------------------------------------------------------------* - * Find the target energy if the adaptive exc. is not filtered - *----------------------------------------------------------------*/ - test(); - IF( EQ_16( codec_mode, MODE2 ) && EQ_16( coder_type, 100 ) ) - { - use_prev_sf_pit_gain = 1; // Q0 - move16(); - } - exp_ener = 0; - move16(); - wtmp = 0; - move16(); - test(); - IF( EQ_16( *lp_flag, FULL_BAND ) || EQ_16( *lp_flag, NORMAL_OPERATION ) ) - { - IF( EQ_16( use_prev_sf_pit_gain, 1 ) ) - { - wtmp = adpt_enr_fx( codec_mode, &exc[i_subfr], h1, y1, L_subfr, gain_pit, g_corr, clip_gain, xn, xn2, &exp_ener, use_prev_sf_pit_gain ); // exp_ener - } - ELSE - { - wtmp = adpt_enr_fx( codec_mode, &exc[i_subfr], h1, y1, L_subfr, &gain1, g_corr, clip_gain, xn, xn2, &exp_ener, use_prev_sf_pit_gain ); // exp_ener - } - } - - /*----------------------------------------------------------------* - * Filter the adaptive excitation - * Find the target energy if the adapt. exc. is filtered - *----------------------------------------------------------------*/ - - exp_ener1 = 0; - move16(); - wtmp1 = 0; - move16(); - test(); - IF( ( ( *lp_flag == LOW_PASS ) ) || ( EQ_16( *lp_flag, NORMAL_OPERATION ) ) ) - { - test(); - IF( EQ_16( codec_mode, MODE2 ) && EQ_16( L_frame, L_FRAME16k ) ) - { - FOR( i = 0; i < L_subfr; i++ ) - { - Ltmp = L_mult( 6881, exc[i - 1 + i_subfr] ); /* constants in Q15 */ - Ltmp = L_mac( Ltmp, 19005, exc[i + i_subfr] ); - Ltmp = L_mac( Ltmp, 6881, exc[i + 1 + i_subfr] ); - exc_tmp[i] = round_fx( Ltmp ); - move16(); - } - } - ELSE - { - FOR( i = 0; i < L_subfr; i++ ) - { - Ltmp = L_mult( 5898, exc[i - 1 + i_subfr] ); /* constants in Q15 */ - Ltmp = L_mac( Ltmp, 20972, exc[i + i_subfr] ); - Ltmp = L_mac( Ltmp, 5898, exc[i + 1 + i_subfr] ); - exc_tmp[i] = round_fx( Ltmp ); - move16(); - } - } - IF( EQ_16( use_prev_sf_pit_gain, 1 ) ) - { - wtmp1 = adpt_enr_fx( codec_mode, exc_tmp, h1, y1_tmp, L_subfr, gain_pit, g_corr2, clip_gain, xn, xn2_tmp, &exp_ener1, use_prev_sf_pit_gain ); // exp_ener1 - } - ELSE - { - wtmp1 = adpt_enr_fx( codec_mode, exc_tmp, h1, y1_tmp, L_subfr, &gain2, g_corr2, clip_gain, xn, xn2_tmp, &exp_ener1, use_prev_sf_pit_gain ); // exp_ener1 - } - } - - if ( LT_16( exp_ener, exp_ener1 ) ) - { - wtmp = shr( wtmp, 1 ); - } - - if ( GT_16( exp_ener, exp_ener1 ) ) - { - wtmp1 = shr( wtmp1, 1 ); - } - - /*-----------------------------------------------------------------* - * use the best prediction (minimize quadratic error) - *-----------------------------------------------------------------*/ - - test(); - test(); - IF( ( ( LT_16( wtmp1, wtmp ) ) && ( EQ_16( *lp_flag, NORMAL_OPERATION ) ) ) || ( ( *lp_flag == LOW_PASS ) ) ) - { - /* use the LP filter for pitch excitation prediction */ - select = LOW_PASS; - move16(); - Copy( exc_tmp, &exc[i_subfr], L_subfr ); // Q_new - Copy( y1_tmp, y1, L_subfr ); // Q_new-1+shift - Copy( xn2_tmp, xn2, L_subfr ); // Q_new-1+shift - - IF( use_prev_sf_pit_gain == 0 ) - { - *gain_pit = gain2; // Q14 - move16(); - g_corr[0] = g_corr2[0]; - move16(); - g_corr[1] = g_corr2[1]; - move16(); - g_corr[2] = g_corr2[2]; - move16(); - g_corr[3] = g_corr2[3]; - move16(); - } - } - ELSE - { - /* no LP filter used for pitch excitation prediction */ - select = FULL_BAND; - move16(); - IF( use_prev_sf_pit_gain == 0 ) - { - *gain_pit = gain1; // Q14 - move16(); - } - } - - return select; -} - /*-------------------------------------------------------------------* * adpt_enr_fx() * @@ -337,28 +181,26 @@ Word16 lp_filt_exc_enc_ivas_fx( * This serves to decide about the filtering of the adaptive excitation *-------------------------------------------------------------------*/ -static Word16 adpt_enr_fx( /* o : adaptive excitation energy mant */ - const Word16 codec_mode, /* i : MODE1 or MODE2 */ - const Word16 *exc, /* i : excitation vector Q_new */ - const Word16 *h1, /* i : impuls response Q15 */ - Word16 *y1, /* o : zero-memory filtered adpt. excitation 12 bits */ - const Word16 L_subfr, /* i : vector length */ - Word16 *gain, /* o : subframe adaptive gain Q14 */ - Word16 *g_corr, /* o : correlations for adptive gain mant/exp*/ - const Word16 clip_gain, /* i : adaptive gain clipping flag Q0 */ - const Word16 *xn, /* i : adaptive codebook target 12 bits Q_new-1+shift*/ - Word16 *xn2, /* o : algebraic codebook target 12 bits Q_new-1+shift*/ - Word16 *exp_ener /* o : adaptive excitation energy exp */ - , - Word16 use_prev_sf_pit_gain /* i : flag to use prev sf pitch gain or not */ +/* o : adaptive excitation energy mant */ +static Word16 adpt_enr_fx( + const Word16 codec_mode, /* i : MODE1 or MODE2 */ + const Word16 *exc, /* i : excitation vector Q_new */ + const Word16 *h1, /* i : impuls response Q15 */ + Word16 *y1, /* o : zero-memory filtered adpt. excitation 12 bits */ + const Word16 L_subfr, /* i : vector length */ + Word16 *gain, /* o : subframe adaptive gain Q14 */ + Word16 *g_corr, /* o : correlations for adptive gain mant/exp */ + const Word16 clip_gain, /* i : adaptive gain clipping flag Q0 */ + const Word16 *xn, /* i : adaptive codebook target 12 bits Q_new-1+shift*/ + Word16 *xn2, /* o : algebraic codebook target 12 bits Q_new-1+shift*/ + Word16 *exp_ener, /* o : adaptive excitation energy exp */ + Word16 use_prev_sf_pit_gain /* i : flag to use prev sf pitch gain or not */ ) { Word16 ener, i; Word16 exc_tmp[L_FRAME16k], xn_tmp[L_FRAME16k]; Word32 Ltmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL /* Critical Overflow */ Flag Overflow = 0; -#endif Overflow = 0; move16(); @@ -431,23 +273,21 @@ static Word16 adpt_enr_fx( /* o : adaptive excitation * codebook excitation y1[]. ( and -2 ) *-------------------------------------------------------------------*/ -Word16 corr_xy1_fx( /* o : pitch gain (0..GAIN_PIT_MAX) */ - const Word16 xn_1[], /* i : target signal Q_new*/ - const Word16 y1_1[], /* i : filtered adaptive codebook excitation 12 bits*/ - Word16 g_corr[], /* o : correlations and -2 mant/exp*/ - const Word16 L_subfr, /* i : vector length */ - const Word16 norm_flag /* i : flag for constraining pitch contribution */ - , - Flag *Overflow_out /* o : propagating the Overflow flag to upper level */ +/* o : pitch gain (0..GAIN_PIT_MAX) */ +Word16 corr_xy1_fx( + const Word16 xn_1[], /* i : target signal Q_new*/ + const Word16 y1_1[], /* i : filtered adaptive codebook excitation 12 bits*/ + Word16 g_corr[], /* o : correlations and -2 mant/exp*/ + const Word16 L_subfr, /* i : vector length */ + const Word16 norm_flag, /* i : flag for constraining pitch contribution */ + Flag *Overflow_out /* o : propagating the Overflow flag to upper level */ ) { Word16 i; Word16 tmp, xx, xy, yy, exp_xy, exp_xx, exp_yy, exp_div, gain, gain_p_snr; Word32 Ltmp1, Ltmp2; Word16 xn[L_FRAME16k], y1[L_FRAME16k]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; -#endif /*----------------------------------------------------------------* * Find the ACELP correlations and the pitch gain diff --git a/lib_enc/lsf_enc_fx.c b/lib_enc/lsf_enc_fx.c index 6761dfb8296d21226261d62f774f892ba973f889..d62b97f1db7151d0069de760c28b827077d2d2d5 100644 --- a/lib_enc/lsf_enc_fx.c +++ b/lib_enc/lsf_enc_fx.c @@ -1,13 +1,11 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ #include "rom_enc.h" -#include "rom_com_fx.h" /* Static table prototypes */ -#include "rom_com.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "ivas_prot_fx.h" /* Function prototypes */ @@ -16,6 +14,7 @@ /*-----------------------------------------------------------------* * Local constants *-----------------------------------------------------------------*/ + #define MIN_LOG_FX 0 #define MIN_LOG_VAL_FX -15360 /* -60.0f in Q8 */ #define MSVQ_MAXCNT 3000 @@ -35,6 +34,7 @@ static void lsf_mid_enc_fx( BSTR_ENC_HANDLE hBstr, Word16 nb_bits, const Word16 static void lsf_mid_enc_ivas_fx( BSTR_ENC_HANDLE hBstr, Word16 nb_bits, const Word32 int_fs, const Word16 qlsp0[], const Word16 qlsp1[], Word16 lsp[], const Word16 coder_type, const Word16 bwidth, Word32 Bin_Ener_old[], Word16 Q_ener, Word16 ppp_mode, Word16 nelp_mode ); + /*===========================================================================*/ /* FUNCTION : lsf_enc_fx() */ /*---------------------------------------------------------------------------*/ @@ -289,13 +289,16 @@ void lsf_enc_fx( { int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid, lsp_new, Aq, M, 0 ); } + /*------------------------------------------------------------------* * Check LSF stability (distance between old LSFs and current LSFs) *------------------------------------------------------------------*/ + IF( NE_32( st_fx->core_brate, SID_2k40 ) ) { st_fx->stab_fac_fx = lsf_stab_fx( lsf_new, st_fx->lsf_old_fx, 0, st_fx->L_frame ); } + return; } @@ -647,11 +650,11 @@ static void lsfq_CNG_fx( Vr_add( qlsf, &CNG_SN1_fx[idx_cv * M], qlsf, M ); /* write the VQ index to the bitstream */ - push_indice_fx( hBstr, IND_ISF_0_0, idx_cv, 4 ); + push_indice( hBstr, IND_ISF_0_0, idx_cv, 4 ); /* write the LVQ index to the bitstream */ - push_indice_fx( hBstr, IND_ISF_0_1, idx_lvq[0], LEN_INDICE ); - push_indice_fx( hBstr, IND_ISF_0_1, idx_lvq[1], LSF_BITS_CNG - 4 - LEN_INDICE ); + push_indice( hBstr, IND_ISF_0_1, idx_lvq[0], LEN_INDICE ); + push_indice( hBstr, IND_ISF_0_1, idx_lvq[1], LSF_BITS_CNG - 4 - LEN_INDICE ); return; } @@ -733,7 +736,7 @@ static void lsfq_CNG_ivas_fx( /* MSVQ_ROM to be updated */ mslvq_cng_ivas_fx( idx_cv, dd, qlsf, ddq, idx_lead_cng, idx_scale_cng, wghts ); - index_lvq_ivas_fx( ddq, idx_lead_cng, idx_scale_cng, START_CNG + idx_cv, idx_lvq, 0 ); + index_lvq_ivas_fx( ddq, idx_lead_cng, idx_scale_cng, START_CNG_IVAS + idx_cv, idx_lvq, 0 ); Vr_add( qlsf, &CNG_SN1_fx[idx_cv * M], qlsf, M ); /* write the VQ index to the bitstream */ @@ -763,9 +766,6 @@ static Word16 qlsf_Mode_Select_fx( Word32 temp32, En = 0; Word16 safety_net; Word16 i, cs, cl; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /* calculate the prediction residual */ cl = 0; @@ -781,7 +781,7 @@ static Word16 qlsf_Mode_Select_fx( { pred_pow2[i] = shl( pred1[i], cs ); move16(); - En = L_mac_o( En, mult( pred_pow2[i], shl_o( w[i], 2, &Overflow ) ), pred_pow2[i], &Overflow ); /* 2.56*2.56 at Q-4 */ + En = L_mac_sat( En, mult( pred_pow2[i], shl_sat( w[i], 2 ) ), pred_pow2[i] ); /* 2.56*2.56 at Q-4 */ } cs = shl( cs, 1 ); @@ -1117,13 +1117,13 @@ void lsf_end_enc_fx( IF( EQ_16( coder_type_org, GENERIC ) && EQ_32( st->sr_core, INT_FS_16k ) ) { /* VOICED =2 and GENERIC=3, so "coder_type-2" means VOICED =0 and GENERIC=1*/ - push_indice_fx( hBstr, IND_LSF_PREDICTOR_SELECT_BIT, sub( coder_type, 2 ), 1 ); + push_indice( hBstr, IND_LSF_PREDICTOR_SELECT_BIT, sub( coder_type, 2 ), 1 ); } /* write predictor selection bit */ IF( EQ_16( predmode, 2 ) ) { - push_indice_fx( st->hBstr, IND_LSF_PREDICTOR_SELECT_BIT, safety_net, 1 ); + push_indice( st->hBstr, IND_LSF_PREDICTOR_SELECT_BIT, safety_net, 1 ); } test(); @@ -1134,7 +1134,7 @@ void lsf_end_enc_fx( Bit_alloc1 = &BC_TCVQ_BIT_ALLOC_40B[1]; FOR( i = 0; i < ( M / 2 ) + 3; i++ ) { - push_indice_fx( hBstr, IND_LSF, TCQIdx[i], Bit_alloc1[i] ); + push_indice( hBstr, IND_LSF, TCQIdx[i], Bit_alloc1[i] ); } } ELSE @@ -1175,7 +1175,7 @@ void lsf_end_enc_fx( move16(); cumleft -= num_bits; move16(); - push_indice_fx( hBstr, IND_LSF, indice[i], num_bits ); + push_indice( hBstr, IND_LSF, indice[i], num_bits ); } WHILE( cumleft > 0 ) @@ -1195,7 +1195,7 @@ void lsf_end_enc_fx( } cumleft = sub( cumleft, num_bits ); - push_indice_fx( hBstr, IND_LSF, indice[i], num_bits ); + push_indice( hBstr, IND_LSF, indice[i], num_bits ); i = add( i, 1 ); } } @@ -1349,9 +1349,11 @@ void lsf_end_enc_fx( /* Update AR-predictor memories */ Copy( qlsf, st->mem_AR_fx, M ); + return; } + void lsf_end_enc_ivas_fx( Encoder_State *st, /* i/o: encoder state structure */ const Word16 *lsf, /* i : LSF in the frequency domain (0..6400) x2.56*/ @@ -1363,8 +1365,7 @@ void lsf_end_enc_ivas_fx( Word16 *lpc_param, Word16 *no_indices, Word16 *bits_param_lpc, - Word16 coder_type_raw /* i : Coder type (LSF coder_type have some special cases)*/ - , + Word16 coder_type_raw, /* i : Coder type (LSF coder_type have some special cases)*/ const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ) { @@ -1435,10 +1436,11 @@ void lsf_end_enc_ivas_fx( move16(); } - /*----------------------------------------------------------------------------------- -* + /*------------------------------------------------------------------------------------* * Calculate the number of stages and levels for each stage based on allowed bit budget * Set absolute threshold for codebook-type decision logic depending on signal bandwidth - *------------------------------------------------------------------------------------ -*/ + *-------------------------------------------------------------------------------------*/ + IF( st->bwidth == NB ) { abs_threshold = SFNETLOWLIMIT_NB / 2; @@ -1455,6 +1457,7 @@ void lsf_end_enc_ivas_fx( /*--------------------------------------------------------------------------------* * LSF quantization of SID frames *--------------------------------------------------------------------------------*/ + IF( EQ_32( st->core_brate, SID_2k40 ) ) { lsfq_CNG_ivas_fx( hBstr, lsf, wghts, qlsf ); @@ -1470,8 +1473,8 @@ void lsf_end_enc_ivas_fx( * Calculate number of stages and levels for each stage based on the allowed bit allocation * (subtract one bit for LSF predictor selection) *----------------------------------------------------------------*/ - lsf_allocate_fx( sub( nBits, shr( predmode, 1 ) ), mode_lvq, mode_lvq_p, &stages0, &stages1, levels0, levels1, bits0, bits1 ); + lsf_allocate_fx( sub( nBits, shr( predmode, 1 ) ), mode_lvq, mode_lvq_p, &stages0, &stages1, levels0, levels1, bits0, bits1 ); /*--------------------------------------------------------------------------------* * LSF quantization of all other frames but SID frames @@ -1537,6 +1540,7 @@ void lsf_end_enc_ivas_fx( pred2[i] = add( pred0[i], mult( Predictors_fx[mode_lvq_p][i], sub( st->mem_AR_fx[i], pred0[i] ) ) ); Tmp2[i] = sub( lsf[i], pred2[i] ); } + /* Adaptive scaling factor (multiplier) is updated in order to reduce the amount of consecutive predictive frames in case of possible frame erasure. AR-predictive usage for VOICED mode is allowed to be higher than other modes. */ test(); @@ -1683,6 +1687,7 @@ void lsf_end_enc_ivas_fx( } } } + /*--------------------------------------------------------------------------* * Write indices to array *--------------------------------------------------------------------------*/ @@ -1868,7 +1873,6 @@ void lsf_end_enc_ivas_fx( } } - /*--------------------------------------------------------------------------* * De-quantize encoded LSF vector *--------------------------------------------------------------------------*/ @@ -1935,9 +1939,11 @@ void lsf_end_enc_ivas_fx( /* Update AR-predictor memories */ Copy( qlsf, st->mem_AR_fx, M ); + return; } + /*-------------------------------------------------------------------* * first_VQstages() * @@ -1961,9 +1967,6 @@ static void first_VQstages( Word16 *pTmp_short, idx_buf[2 * LSFMBEST * MAX_VQ_STAGES], parents[LSFMBEST], counter = 0, j, m, s, c, c2, p_max, *indices[2]; Word16 maxC = LSFMBEST; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /*float dd[16];*/ const Word16 *cb_stage, *cbp; @@ -1989,9 +1992,9 @@ static void first_VQstages( L_tmp = L_deposit_l( 0 ); FOR( j = 0; j < N; j++ ) { - L_tmp1 = L_shl_o( L_mult0( u[j], w[j] ), 7, &Overflow ); /*x2.56 + Q8 + Q7 */ - L_tmp1 = Mult_32_16( L_tmp1, u[j] ); /*x2.56 + Q15 + x2.56 -Q15 */ - L_tmp = L_add( L_tmp, L_tmp1 ); /*Q0 + x2.56 +x2.56 */ + L_tmp1 = L_shl_sat( L_mult0( u[j], w[j] ), 7 ); /*x2.56 + Q8 + Q7 */ + L_tmp1 = Mult_32_16( L_tmp1, u[j] ); /*x2.56 + Q15 + x2.56 -Q15 */ + L_tmp = L_add( L_tmp, L_tmp1 ); /*Q0 + x2.56 +x2.56 */ } set32_fx( dist[1], L_tmp, maxC ); @@ -2110,6 +2113,7 @@ static void first_VQstages( /*------------------------------------------------------------* * Compute error vectors for each node *------------------------------------------------------------*/ + cs = 0; move16(); FOR( c = 0; c < maxC; c++ ) @@ -2134,6 +2138,7 @@ static void first_VQstages( return; } + static void first_VQstages_ivas_fx( const Word16 *const *cb, Word16 u[], /* i : vector to be encoded (prediction and mean removed) */ @@ -2151,9 +2156,6 @@ static void first_VQstages_ivas_fx( Word16 *pTmp_short, idx_buf[2 * LSFMBEST * MAX_VQ_STAGES], parents[LSFMBEST], counter = 0, j, m, s, c, c2, p_max, *indices[2]; Word16 maxC = LSFMBEST; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /*float dd[16];*/ const Word16 *cb_stage, *cbp; @@ -2179,9 +2181,9 @@ static void first_VQstages_ivas_fx( L_tmp = L_deposit_l( 0 ); FOR( j = 0; j < N; j++ ) { - L_tmp1 = L_shl_o( L_mult0( u[j], w[j] ), 7, &Overflow ); /*x2.56 + Q8 + Q7 */ - L_tmp1 = Mult_32_16( L_tmp1, u[j] ); /*x2.56 + Q15 + x2.56 -Q15 */ - L_tmp = L_add( L_tmp, L_tmp1 ); /*Q0 + x2.56 +x2.56 */ + L_tmp1 = L_shl_sat( L_mult0( u[j], w[j] ), 7 ); /*x2.56 + Q8 + Q7 */ + L_tmp1 = Mult_32_16( L_tmp1, u[j] ); /*x2.56 + Q15 + x2.56 -Q15 */ + L_tmp = L_add( L_tmp, L_tmp1 ); /*Q0 + x2.56 +x2.56 */ } set32_fx( dist[1], L_shr( L_tmp, 1 ), maxC ); /*Q-1 + x2.56 +x2.56 */ @@ -2300,6 +2302,7 @@ static void first_VQstages_ivas_fx( /*------------------------------------------------------------* * Compute error vectors for each node *------------------------------------------------------------*/ + cs = 0; move16(); FOR( c = 0; c < maxC; c++ ) @@ -2323,6 +2326,8 @@ static void first_VQstages_ivas_fx( return; } + + /*--------------------------------------------------------------------------- * vq_enc_lsf_lvq() * @@ -2362,9 +2367,6 @@ static Word32 vq_lvq_lsf_enc( Word16 quant[LSFMBEST][M], diff[M], dd[M]; Word16 lat_cv[LSFMBEST][M]; Word16 idx_lead[LSFMBEST][2], idx_scale[LSFMBEST][2]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif stagesVQ = sub( stages, 1 ); /* Codebook selection */ @@ -2386,7 +2388,6 @@ static Word32 vq_lvq_lsf_enc( first_VQstages( cb, u, levels, stagesVQ, w, M, MSVQ_MAXCNT, indices_firstVQ ); } - FOR( i = 0; i < maxC; i++ ) { Copy( pred, cand[i], M ); @@ -2415,13 +2416,13 @@ static Word32 vq_lvq_lsf_enc( Vr_subt( cand[i], lsf, diff, M ); FOR( j = 0; j < M; j++ ) { - diff[j] = shl_o( diff[j], 4, &Overflow ); + diff[j] = shl_sat( diff[j], 4 ); move16(); } - L_tmp = L_mult( mult( diff[0], shl_o( w[0], 1, &Overflow ) ), diff[0] ); /*(2.56+Q5+ Q10 -Q15) + 2.56+ Q5 + Q1 = 2.56 + 2.56 + Q6 */ + L_tmp = L_mult( mult( diff[0], shl_sat( w[0], 1 ) ), diff[0] ); /*(2.56+Q5+ Q10 -Q15) + 2.56+ Q5 + Q1 = 2.56 + 2.56 + Q6 */ FOR( j = 1; j < M; j++ ) { - L_tmp = L_mac( L_tmp, mult( diff[j], shl_o( w[j], 1, &Overflow ) ), diff[j] ); /*(2.56+Q5+ Q10 -Q15) + 2.56+ Q5 + Q1 = 2.56 + 2.56 + Q6 */ + L_tmp = L_mac( L_tmp, mult( diff[j], shl_sat( w[j], 1 ) ), diff[j] ); /*(2.56+Q5+ Q10 -Q15) + 2.56+ Q5 + Q1 = 2.56 + 2.56 + Q6 */ } e[i] = L_tmp; /*(2.56+Q5+ Q10 -Q15) + 2.56+ Q5 + Q1 = 2.56 + 2.56 + Q6 */ move32(); @@ -2446,6 +2447,7 @@ static Word32 vq_lvq_lsf_enc( return e[c2]; } + static Word32 vq_lvq_lsf_enc_ivas_fx( Word16 pred_flag, Word16 mode, @@ -2468,9 +2470,6 @@ static Word32 vq_lvq_lsf_enc_ivas_fx( Word16 quant[LSFMBEST][M], diff[M], dd[M]; Word16 lat_cv[LSFMBEST][M]; Word16 idx_lead[LSFMBEST][2], idx_scale[LSFMBEST][2]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif stagesVQ = sub( stages, 1 ); /* Codebook selection */ @@ -2509,7 +2508,6 @@ static Word32 vq_lvq_lsf_enc_ivas_fx( first_VQstages_ivas_fx( cb, u, levels, stagesVQ, w, M, MSVQ_MAXCNT, indices_firstVQ ); } - FOR( i = 0; i < maxC; i++ ) { Copy( pred, cand[i], M ); @@ -2538,13 +2536,13 @@ static Word32 vq_lvq_lsf_enc_ivas_fx( Vr_subt( cand[i], lsf, diff, M ); FOR( j = 0; j < M; j++ ) { - diff[j] = shl_o( diff[j], 4, &Overflow ); + diff[j] = shl_sat( diff[j], 4 ); move16(); } - L_tmp = L_mult( mult( diff[0], shl_o( w[0], 1, &Overflow ) ), diff[0] ); /*(2.56+Q5+ Q10 -Q15) + 2.56+ Q5 + Q1 = 2.56 + 2.56 + Q6 */ + L_tmp = L_mult( mult( diff[0], shl_sat( w[0], 1 ) ), diff[0] ); /*(2.56+Q5+ Q10 -Q15) + 2.56+ Q5 + Q1 = 2.56 + 2.56 + Q6 */ FOR( j = 1; j < M; j++ ) { - L_tmp = L_mac( L_tmp, mult( diff[j], shl_o( w[j], 1, &Overflow ) ), diff[j] ); /*(2.56+Q5+ Q10 -Q15) + 2.56+ Q5 + Q1 = 2.56 + 2.56 + Q6 */ + L_tmp = L_mac_sat( L_tmp, mult( diff[j], shl_sat( w[j], 1 ) ), diff[j] ); /*(2.56+Q5+ Q10 -Q15) + 2.56+ Q5 + Q1 = 2.56 + 2.56 + Q6 */ } e[i] = L_tmp; move32(); @@ -2567,6 +2565,8 @@ static Word32 vq_lvq_lsf_enc_ivas_fx( return e[c2]; } + + static void BcTcvq_1st_fx( Word16 x_fx[][2], /*x2.56*/ const Word16 CB_fx[][128][2], /*x2.56*/ @@ -2717,7 +2717,6 @@ static void BcTcvq_SubBlock_fx( Word16 stage1, stage2, state, prev_state, branch; Word16 index, bestCode, brCode[N_DIM]; Word16 temp16_fx; - Word32 dist_fx, minDist_fx, brDist_fx[N_DIM]; Word16 pred_fx[N_DIM], target_fx[N_DIM], brQuant_fx[N_DIM][N_DIM]; @@ -2726,7 +2725,6 @@ static void BcTcvq_SubBlock_fx( FOR( state = 0; state < NUM_STATE; state++ ) { - /* 1st branch search */ prev_state = NTRANS[0][state]; move16(); @@ -2924,8 +2922,11 @@ static Word32 BcTcvq_FixSearch_fx( move16(); minDist_fx = L_shr( minDist_fx, 2 ); /*2.56*2.56*Q(-5 - 2)*/ + return minDist_fx; } + + static Word16 optimalPath_fx( Word32 cDist_fx[][16], /*2.56*2.56*Q(-5 - 2)*/ Word32 blockDist_fx[], /*2.56*2.56*Q(-5 - 2)*/ @@ -3065,7 +3066,6 @@ static void buildCode_fx( set16_fx( BrIndex, 0, ( N_STAGE_VQ - 4 ) ); - FOR( stage = N_STAGE_VQ - 4; stage >= 1; stage-- ) { if ( GT_16( s[stage], 7 ) ) @@ -3104,6 +3104,8 @@ static void buildCode_fx( return; } + + static void BcTcvq_fx( Word16 snFlag, const Word16 *x_fx, // x2.65 @@ -3319,9 +3321,7 @@ Word32 qlsf_ARSN_tcvq_Enc_16k_fx( Word16 error_svq_fx[M], error_svq_q_fx[M]; Word16 cl, cs; Word32 temp_l; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif + IF( EQ_16( safety_net, 1 ) ) { indice[0] = 1; @@ -3393,7 +3393,7 @@ Word32 qlsf_ARSN_tcvq_Enc_16k_fx( { yy_fx[i] = shl( yy_fx[i], cs ); move16(); - temp_l = L_mac_o( temp_l, mult( yy_fx[i], shl_o( w_fx[i], 2, &Overflow ) ), yy_fx[i], &Overflow ); + temp_l = L_mac_sat( temp_l, mult( yy_fx[i], shl_sat( w_fx[i], 2 ) ), yy_fx[i] ); } cs = shl( cs, 1 ); temp_l = L_shr( temp_l, cs ); @@ -3412,14 +3412,11 @@ static void FFT_Mid_Interpol_16k_fx( ) { Word16 i; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif FOR( i = 0; i < L_FFT / 2; i++ ) { /* Interpolation */ - Bin_Ener_mid[i] = L_shr( L_add_o( Bin_Ener_old[i], Bin_Ener[i], &Overflow ), 1 ); + Bin_Ener_mid[i] = L_shr( L_add_sat( Bin_Ener_old[i], Bin_Ener[i] ), 1 ); /* Memory update */ Bin_Ener_old[i] = Bin_Ener[i]; @@ -3484,9 +3481,6 @@ static void lsf_mid_enc_fx( Word32 L_tmp; Word16 tmp, k1; const Word16 *ratio = NULL; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /* convert LSPs to LSFs */ lsp2lsf_fx( lsp, lsf, M, int_fs ); @@ -3597,9 +3591,9 @@ static void lsf_mid_enc_fx( tmp = sub( lsf[j], qlsf[j] ); /* err += wghts[j] * ftemp * ftemp; */ /* tmp is usually very small, we can have some extra precision with very rare saturation */ - tmp = shl_o( tmp, 4, &Overflow ); - tmp = mult_ro( tmp, tmp, &Overflow ); - err = L_mac_o( err, tmp, shl_o( wghts[j], 2, &Overflow ), &Overflow ); + tmp = shl_sat( tmp, 4 ); + tmp = mult_r_sat( tmp, tmp ); + err = L_mac_sat( err, tmp, shl_sat( wghts[j], 2 ) ); } /* err = L_shl(err,Wscale); */ err = Mult_32_16( err, LSF_1_OVER_256SQ ); @@ -3636,7 +3630,7 @@ static void lsf_mid_enc_fx( /* convert LSFs back to LSPs */ lsf2lsp_fx( qlsf, lsp, M, int_fs ); - push_indice_fx( hBstr, IND_MID_FRAME_LSF_INDEX, idx, nb_bits ); + push_indice( hBstr, IND_MID_FRAME_LSF_INDEX, idx, nb_bits ); return; } @@ -3661,9 +3655,6 @@ static void lsf_mid_enc_ivas_fx( Word32 L_tmp; Word16 tmp, k1; const Word16 *ratio = NULL; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /* convert LSPs to LSFs */ lsp2lsf_fx( lsp, lsf, M, int_fs ); @@ -3783,9 +3774,9 @@ static void lsf_mid_enc_ivas_fx( tmp = sub( lsf[j], qlsf[j] ); /* err += wghts[j] * ftemp * ftemp; */ /* tmp is usually very small, we can have some extra precision with very rare saturation */ - tmp = shl_o( tmp, 4, &Overflow ); - tmp = mult_ro( tmp, tmp, &Overflow ); - err = L_mac_o( err, tmp, shl_o( wghts[j], 2, &Overflow ), &Overflow ); + tmp = shl_sat( tmp, 4 ); + tmp = mult_r_sat( tmp, tmp ); + err = L_mac_sat( err, tmp, shl_sat( wghts[j], 2 ) ); } /* err = L_shl(err,Wscale); */ err = Mult_32_16( err, LSF_1_OVER_256SQ ); diff --git a/lib_enc/lsf_msvq_ma_enc.c b/lib_enc/lsf_msvq_ma_enc.c deleted file mode 100644 index 60375ddcce113a6c5ac6236fdbd3afd55aec93e9..0000000000000000000000000000000000000000 --- a/lib_enc/lsf_msvq_ma_enc.c +++ /dev/null @@ -1,794 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include "cnst.h" -#include "prot_fx.h" -#include "rom_com.h" -#include "rom_enc.h" -#include "basop_proto_func.h" -#include "wmc_auto.h" - -#ifndef swap -#define swap( x, y, type ) \ - { \ - type u__p; \ - u__p = x; \ - x = y; \ - y = u__p; \ - } -#endif - -/*--------------------------------------------------------------------------* - * Local constants - *--------------------------------------------------------------------------*/ - -#define kMaxC 8 - -/*--------------------------------------------------------------------------* - * msvq_encmsvq_stage1_dct_search() - * - * stage1 search in a segmentwise truncated dct N domain without weights - *--------------------------------------------------------------------------*/ - -/*! r: (p_max , best candidate sofar ) */ -Word16 msvq_stage1_dct_search_fx( - const Word32 *u_fx, /* i : target exp : u_e */ - const Word16 u_e, /* i : exp for target Q0 */ - const Word16 N, /* i : target length and IDCT synthesis length */ - const Word16 maxC_st1, /* i : number of final stage 1 candidates to provide */ - const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */ - const Word16 max_dct_trunc, /* i : maximum of truncation lenghts */ - Word32 *invTrfMatrix_fx, /* i : IDCT synthesis matrix for dim N Q31 */ - const Word16 *midQ_truncQ_fx, /* i : midQ vector */ - const Word32 *dct_scaleF_fx, /* i : global scale factors Q10 */ - const Word16 n_segm, /* i : number of segments */ - const Word16 *cols_per_segment, /* i : remaining length per segment */ - const Word16 *trunc_dct_cols_per_segment, /* i : trunc length per segment */ - const Word16 *entries_per_segment, /* i : number of rows per segment */ - const Word16 *cum_entries_per_segment, /* i : number of cumulative entries */ - const Word8 *const W8Qx_dct_sections[], /* i : Word8(byte) segment table ptrs */ - const Word16 *col_syn_shift[], /* i : columnwise syn shift tables */ - const Word8 *segm_neighbour_fwd, /* i : circular neighbour list fwd */ - const Word8 *segm_neighbour_rev, /* i : circular neighbour list reverse */ - const Word16 npost_check, /* i : number of neigbours to check , should be even */ - Word32 *st1_mse_ptr_fx, /* i : dynRAM buffer for MSEs exp : u_e */ - Word16 *indices_st1_local, /* o : selected cand indices */ - Word32 *st1_syn_vec_ptr_fx, /* i/o: buffer for IDCT24 synthesis i :exp : u_e */ - Word32 *dist1_ptr_fx, /* o : resulting stage 1 MSEs in DCT-N domain */ - Word16 *dist1_ptr_e ) -{ - Word32 dct_target_fx[FDCNG_VQ_DCT_MAXTRUNC]; // Q20 - Word32 u_mr_fx[FDCNG_VQ_MAX_LEN]; - Word16 dist1_ptr_e_buf[2 * LSFMBEST_MAX]; - Word64 mse_trunc_segm_fx[FDCNG_VQ_DCT_NSEGM]; - Word32 tmp_fx, check_mse; - Word16 tmp_e, check_mse_e; - Word64 mse_fx; /* Word64 in BASOP */ - - Word16 p_max, c, c2, segm, j_full, j, i; - Word16 n_ana, p_mins[2], idx_min[2]; - - Word16 st1_mse_ptr_e[128]; - - const Word8 *cbpW8; - const Word16 *dct_col_shift_tab; - - Word32 *st1_mse_pair_fx; - Word16 *st1_mse_pair_e; - Word16 *st1_idx_pair; - - Word32 tmp2_fx; - Word16 check_ind[FDCNG_VQ_DCT_NPOST]; - assert( ( npost_check % 2 == 0 ) && ( npost_check <= FDCNG_VQ_DCT_NPOST ) ); - - assert( n_segm <= FDCNG_VQ_DCT_NSEGM ); - - n_ana = N; /* VQ stage#1 core is currently always using stored DCT N coeffs */ - move16(); - assert( n_ana >= max_dct_trunc ); /* check for FDCNGVQ WB , SWB, FB operation */ - - /* remove mid stage#1 vector, in original input domain */ - tmp_e = s_max( 12, u_e ); - FOR( i = 0; i < n_ana; i++ ) - { - u_mr_fx[i] = L_sub( L_shl( u_fx[i], sub( u_e, tmp_e ) ), L_shl( midQ_truncQ_fx[i], sub( Q31 - Q10, tmp_e ) ) ); // tmp_e - move32(); - } - - dctT2_N_apply_matrix_fx( (const Word32 *) u_mr_fx, dct_target_fx, s_min( max_dct_trunc, n_ana ), n_ana, invTrfMatrix_fx, max_dct_trunc, dcttype ); // exp : tmp_e - - /* init search state ptr's at the top */ - set32_fx( dist1_ptr_fx, MAX_32, maxC_st1 ); - set16_fx( dist1_ptr_e_buf, 32, maxC_st1 ); - st1_mse_pair_fx = &( dist1_ptr_fx[0] ); /* req. ptr post upd +=2 */ // st1_mse_pair_e - st1_mse_pair_e = &( dist1_ptr_e_buf[0] ); /* req. ptr post upd +=2 */ - st1_idx_pair = &( indices_st1_local[0] ); /* req. ptr post upd +=2 */ - set64_fx( mse_trunc_segm_fx, 0, n_segm ); - - // set16_fx( mse_trunc_segm_e, u_e, FDCNG_VQ_DCT_NSEGM ); - - FOR( segm = 0; segm < n_segm; segm++ ) - { /* point to a new paired location for each segment */ - p_max = 0; /* req. to point to one of 1 or 0, this init can potentially be omitted here,as p_max is always 1 or 0 */ - move16(); - - /* compute segment common trunction error in dctN domain */ - - FOR( i = 0; i < trunc_dct_cols_per_segment[segm]; i++ ) - { - mse_trunc_segm_fx[segm] = W_mac_32_32( mse_trunc_segm_fx[segm], dct_target_fx[cols_per_segment[segm] + i], dct_target_fx[cols_per_segment[segm] + i] ); // Q41 - move64(); - } - - cbpW8 = W8Qx_dct_sections[segm]; /* Word8 column variable Qx storage , table ptr init */ - - FOR( j = 0; j < entries_per_segment[segm]; j++ ) - { - /* unweighted segmented search DCT domain loop */ - j_full = add( j, cum_entries_per_segment[segm] ); /* or simply use j_full++ */ - - mse_fx = mse_trunc_segm_fx[segm]; /* init mse with with common mse truncation part, in BASOP a move32() */ // Q41 - move64(); - - dct_col_shift_tab = col_syn_shift[segm]; /* ptr init */ - - FOR( c2 = 0; c2 < cols_per_segment[segm]; c2++ ) - { -#define WMC_TOOL_SKIP - tmp_fx = L_sub( dct_target_fx[c2], Mpy_32_32( L_shl( cbpW8[c2], add( sub( Q31, tmp_e ), dct_col_shift_tab[c2] ) ), dct_scaleF_fx[1] ) ); /* note: BASOP shift left defined for signed integers */ - LOGIC( 1 ); - SHIFT( 1 ); - ADD( 1 ); /* in BASOP: s_and(for W8->W16), shl(), sub()*/ -#undef WMC_TOOL_SKIP - mse_fx = W_mac_32_32( mse_fx, tmp_fx, tmp_fx ); /* L_mac or L_mac0() square Word16 -> Word32*/ // Q41 - } - Word16 L_tmp = W_norm( mse_fx ); - st1_mse_ptr_fx[j_full] = W_extract_h( W_lshl( mse_fx, L_tmp ) ); /* save MSE in shared dynamic RAM, move32() in BASOP */ // st1_mse_ptr_e - move32(); - st1_mse_ptr_e[j_full] = sub( shl( tmp_e, 1 ), L_tmp ); - move16(); - -#define WMC_TOOL_SKIP - cbpW8 += cols_per_segment[segm]; /* fixed pointer increment for each segment */ -#undef WMC_TOOL_SKIP - - /* overwrite with a new worst index at p_max */ - - /* Note: The three inner loop if's below are not 100% properly instrumented by WMC tool */ - // if ( st1_mse_ptr_fx[j_full] < st1_mse_pair_fx[p_max] ) /* L_sub */ - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( st1_mse_ptr_fx[j_full], st1_mse_ptr_e[j_full], st1_mse_pair_fx[p_max], st1_mse_pair_e[p_max] ), -1 ) ) /* L_sub */ - { - st1_idx_pair[p_max] = j_full; /* move16, single BASOP */ - move16(); - } /* BASOP 2 ops */ - - IF( EQ_16( st1_idx_pair[p_max], j_full ) ) - { /* idx updated --> also update mse */ - st1_mse_pair_fx[p_max] = st1_mse_ptr_fx[j_full]; /* move32(), single BASOP */ - move32(); - st1_mse_pair_e[p_max] = st1_mse_ptr_e[j_full]; /* move32(), single BASOP */ - move16(); - } /* BASOP 3 ops */ - - /* avoid WC costly candidate list management by always updating p_max, - as we have only a pair in each segment to maintain */ - p_max = 0; - move16(); - if ( EQ_16( BASOP_Util_Cmp_Mant32Exp( st1_mse_pair_fx[0], st1_mse_pair_e[0], st1_mse_pair_fx[1], st1_mse_pair_e[1] ), -1 ) ) /* L_sub()*/ - { - p_max = 1; /* move16() */ - move16(); - } /* BASOP 3 ops ,Note 2 ops possible in BASOP with L_sub and L_lshr */ - - /* Note: logical shift right not available in ANSI-C */ - /* p_max = (st1_mse_pair[0] - st1_mse_pair[1]) ">>>" 31; */ - /* in java logical shift right is available as >>> , in BASOP it is available as L_lshr */ - - /* Cost: weighted sum with cond moves ('if') => 8 in float , 7 in BASOP with L_lshr */ - } /* j in section */ - - st1_mse_pair_fx += 2; /* req. ptr init */ - st1_mse_pair_e += 2; /* req. ptr init */ - st1_idx_pair += 2; /* req. ptr init */ - - } /* next segment */ - - tmp_e = 0; - move16(); - FOR( j = 0; j < maxC_st1; j++ ) - { - /* compute_full mse using stored DCT24 domain MSE's */ - /* calculate MSE from stage1 inner using existing inner DCT domain variables */ - tmp_e = s_max( dist1_ptr_e_buf[j], tmp_e ); - } - - FOR( j = 0; j < maxC_st1; j++ ) - { - /* compute_full mse using stored DCT24 domain MSE's */ - /* calculate MSE from stage1 inner using existing inner DCT domain variables */ - dist1_ptr_fx[j] = L_shr( dist1_ptr_fx[j], sub( tmp_e, dist1_ptr_e_buf[j] ) ); - move32(); - *dist1_ptr_e = tmp_e; - move16(); - } - - - assert( ( maxC_st1 >= 3 ) ); - assert( ( maxC_st1 <= 8 ) ); - - p_max = maximum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* establish current worst candidate for MSVQ stage#2 among all maxC_st1 candidates so far */ - - p_mins[0] = minimum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* find best entry among all maxC_pre */ - move16(); - tmp_fx = dist1_ptr_fx[p_mins[0]]; - move32(); - dist1_ptr_fx[p_mins[0]] = MAX_32; /* exclude 1st */ - move32(); - - p_mins[1] = minimum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* find 2nd best entry */ - move16(); - tmp2_fx = dist1_ptr_fx[p_mins[1]]; - move32(); - dist1_ptr_fx[p_mins[1]] = MAX_32; /* exclude 2nd */ - move32(); - - dist1_ptr_fx[p_mins[0]] = tmp_fx; /* restore 1st */ - move32(); - dist1_ptr_fx[p_mins[1]] = tmp2_fx; /* restore 2nd */ - move32(); - - idx_min[0] = indices_st1_local[p_mins[0]]; - move16(); - idx_min[1] = indices_st1_local[p_mins[1]]; - move16(); - - - /* use global exclusion list to never reselect the two (best) global MSE values sofar */ - st1_mse_ptr_fx[idx_min[0]] = MAX_32; /* move32() */ - move32(); - st1_mse_ptr_e[idx_min[0]] = MAX_16; - move16(); - st1_mse_ptr_fx[idx_min[1]] = MAX_32; /* move32() */ - move32(); - st1_mse_ptr_e[idx_min[1]] = MAX_16; - move16(); - - /* circular MSE-neigbour list in use to potentially replace some segment search candidates */ - /* using both 1st and 2nd best neighbours in fwd and rev directions */ - check_ind[0] = segm_neighbour_fwd[idx_min[0]]; - move16(); - check_ind[1] = segm_neighbour_rev[idx_min[0]]; - move16(); - - check_ind[2] = segm_neighbour_fwd[idx_min[1]]; - move16(); - check_ind[3] = segm_neighbour_rev[idx_min[1]]; - move16(); - - check_ind[4] = segm_neighbour_fwd[check_ind[0]]; - move16(); - check_ind[5] = segm_neighbour_rev[check_ind[1]]; - move16(); - - check_ind[6] = segm_neighbour_fwd[check_ind[2]]; - move16(); - check_ind[FDCNG_VQ_DCT_NPOST - 1] = segm_neighbour_rev[check_ind[3]]; - move16(); - - FOR( i = 0; i < npost_check; i++ ) - { - /* move MSE from DCT-inner loop search to input synthesis domain */ - /* multiplication by fdcng_dct_scaleF[2] to get the float outer loop scale correct in IDCT synthesis domain */ - check_mse = st1_mse_ptr_fx[check_ind[i]]; - move32(); - check_mse_e = st1_mse_ptr_e[check_ind[i]]; - move16(); - - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( check_mse, check_mse_e, dist1_ptr_fx[p_max], *dist1_ptr_e ), -1 ) ) - { /* new winner , replace worst */ - dist1_ptr_fx[p_max] = L_shl( check_mse, sub( check_mse_e, *dist1_ptr_e ) ); - move32(); - indices_st1_local[p_max] = check_ind[i]; - move16(); - st1_mse_ptr_fx[check_ind[i]] = MAX_32; /* exclude, BASOP: move32() */ - move32(); - st1_mse_ptr_e[check_ind[i]] = MAX_16; - move16(); - p_max = maximum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* establish a new current worst candidate among all maxC */ - } - } - - /* extract the selected stage one vectors in DCT_N domain , apply IDCT_N and scale up */ - /* always extract full length signal(e.g. 24) to be able to update WB(e.g. N_in==21) candidate MSE values */ - /* in the case that only a part of the IDCT N vector is in final use */ - - /* note: synthesis not yet fully parameterized/generalized for other IDCT lengths */ - assert( N == 24 ); - { - FOR( c = 0; c < maxC_st1; c++ ) - { - dec_FDCNG_MSVQ_stage1_fx( indices_st1_local[c], N, invTrfMatrix_fx, dcttype + 1, &( st1_syn_vec_ptr_fx[c * N] ), NULL ); // Q11 : output - scale_sig32( &( st1_syn_vec_ptr_fx[c * N] ), N, sub( 11, s_max( u_e, 12 ) ) ); - } - } - - return p_max; /*ptr to worst performing candidate */ -} - - -/*--------------------------------------------------------------------------* - * msvq_stage1_dct_recalc_candidates_fdcng_wb() - * - * recalc MSE for fdcng WB(0..20) coeffs , - essentially subtract res21^2 ,res22^2, res23^2 that was included in stage1 MSE in the DCT24 domain truncated search, - excludes the waveform contributions at pos 21,22,23 to the MSE, important to keep the WB MSEs update for the subsequent stages - *--------------------------------------------------------------------------*/ - -/*! r: (updated p_max) */ -Word16 msvq_stage1_dct_recalc_candidates_fdcng_wb_fx( - const Word32 *st1_syn_vec_ptr_fx, /* i : IDCT24 synthesis vectors st1_syn_vec_e*/ - const Word16 st1_syn_vec_e, /* i : exp for IDCT24 synthesis vectors */ - const Word32 *u_fx, /* i : target signal u_e*/ - const Word16 u_e, /* i : exp for target signal */ - const Word16 maxC_st1, /* i : number of candidates in stage1 */ - Word32 *dist_ptr_fx, /* i/o: updated MSE vector for stage1 */ - Word16 *dist_ptr_e /* i/o: exp for updated MSE vector for stage1 */ -) -{ - Word16 i; - Word16 p_max_local, c; - const Word32 *p2_fx; - Word16 tmp_e; - Word32 res24_fx, high_diff_fx[FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB]; - Word64 acc; - Word16 res24_e[FD_CNG_maxC_37bits]; - Word16 dist_e; - - dist_e = *dist_ptr_e; - move16(); - FOR( c = 0; c < maxC_st1; c++ ) - { /* point to extended synthesis part */ - p2_fx = (const Word32 *) &( st1_syn_vec_ptr_fx[c * FDCNG_VQ_MAX_LEN + FDCNG_VQ_MAX_LEN_WB] ); /* ptr init to synthesis candidate c */ - tmp_e = s_max( st1_syn_vec_e, u_e ); - tmp_e = add( tmp_e, 1 ); - /* for stage#1 use "u" instead of the shortened resid[0], to access the extended/extrapolated input target */ - FOR( i = 0; i < FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB; i++ ) - { - high_diff_fx[i] = L_sub( L_shr( p2_fx[i], sub( tmp_e, st1_syn_vec_e ) ), L_shr( u_fx[FDCNG_VQ_MAX_LEN_WB + i], sub( tmp_e, u_e ) ) ); // tmp_e - move32(); - } - acc = 0; - move64(); - FOR( i = 0; i < FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB; i++ ) - { - acc = W_mac_32_32( acc, high_diff_fx[i], high_diff_fx[i] ); - } - res24_e[c] = tmp_e; - move16(); - tmp_e = W_norm( acc ); - res24_fx = W_extract_h( W_shl( acc, tmp_e ) ); - - res24_e[c] = sub( shl( res24_e[c], 1 ), tmp_e ); - move16(); - - dist_ptr_fx[c] = BASOP_Util_Add_Mant32Exp( dist_ptr_fx[c], *dist_ptr_e, L_negate( res24_fx ), res24_e[c], &res24_e[c] ); /* remove DCT24 high band error contribution */ - move32(); - dist_e = s_max( dist_e, res24_e[c] ); - move16(); - } - - - FOR( c = 0; c < maxC_st1; c++ ) - { - dist_ptr_fx[c] = L_shl( dist_ptr_fx[c], sub( res24_e[c], dist_e ) ); - move32(); - } - *dist_ptr_e = dist_e; - move16(); - /* finally update p_max, as it may potentially change, - due to the core DCT24 search originally optimizing over the longer basis vectors than DCT21 */ - p_max_local = maximum_32_fx( dist_ptr_fx, maxC_st1, NULL ); - - return p_max_local; -} - - -/*--------------------------------------------------------------------------* - * msvq_enc() - * - * MSVQ encoder - *--------------------------------------------------------------------------*/ - - -void msvq_enc_ivas_fx( - const Word16 *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) Q_cb */ - const Word16 Q_cb, /* i : Codebook Q */ - const Word16 dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ - const Word16 offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ - const Word32 u_fx[], /* i : Vector to be encoded (prediction and mean removed) (exp : u_e) */ - const Word16 u_e, /* i : Exponent for Vector to be encoded */ - const Word16 *levels, /* i : Number of levels in each stage */ - const Word16 maxC, /* i : Tree search size (number of candidates kept from from one stage to the next == M-best) */ - const Word16 stages, /* i : Number of stages */ - const Word16 w[], /* i : Weights Q8 */ - const Word16 N, /* i : Vector dimension */ - const Word16 maxN, /* i : Codebook dimension */ - const Word16 applyDCT_flag, /* i : applyDCT flag */ - Word32 *invTrfMatrix_fx, /* i/o: synthesis matrix Q31 */ - Word16 Idx[] /* o : Indices */ -) -{ - Word16 j; - const Word16 *cbp, *cb_stage; - Word32 resid_buf_fx[2 * LSFMBEST_MAX * M_MAX], *resid_fx[2]; - Word32 *pTmp, *p1, *p2; // pTmp_e - Word16 pTmp_e; - Word16 *indices[2], m, s, c, c2, p_max, i; - Word16 idx_buf[2 * LSFMBEST_MAX * MAX_VQ_STAGES_USED], parents[LSFMBEST_MAX]; - Word32 dist_buf_fx[2 * LSFMBEST_MAX], *dist_fx[2], tmp, en, ss2, Tmp[M_MAX]; - Word16 dist_buf_e[2 * LSFMBEST_MAX], *dist_e[2]; - Word16 tmp_e, tmp_n, en_e; - Word16 resid_e; - Word16 n, maxn, start; - Word64 W_acc; /*64 bit accumulator*/ - - Word32 *st1_syn_vec_ptr_fx = &( resid_buf_fx[1 * LSFMBEST_MAX * M_MAX] ) - FDCNG_VQ_MAX_LEN * maxC; - Word32 *st1_mse_ptr_fx = &( resid_buf_fx[1 * LSFMBEST_MAX * M_MAX] ) - ( levels[0] ); - Word16 indices_st1_local[FDCNG_VQ_DCT_NSEGM * 2]; - - /*----------------------------------------------------------------* - * Allocate memory for previous (parent) and current nodes. - * Parent node is indexed [0], current node is indexed [1]. - *----------------------------------------------------------------*/ - indices[0] = idx_buf; - indices[1] = idx_buf + maxC * stages; /*move16();*/ - /*vr_iset(0, idx_buf, 2*stages*maxC);*/ - set16_fx( idx_buf, 0, (Word16) ( 2 * stages * maxC ) ); - - resid_fx[0] = resid_buf_fx; - resid_fx[1] = resid_buf_fx + maxC * N; /*move16();*/ - - dist_fx[0] = dist_buf_fx; - dist_e[0] = dist_buf_e; - dist_fx[1] = dist_buf_fx + maxC; - dist_e[1] = dist_buf_e + maxC; - - /*vr_iset(0, parents, maxC);*/ - set16_fx( parents, 0, maxC ); - - /*----------------------------------------------------------------* - * LSF weights are normalized, so it is always better to multiply it first - * Set up inital distance vector - *----------------------------------------------------------------*/ - W_acc = W_mult_32_32( Mpy_32_16_1( u_fx[0], shl( w[0], 2 ) ), u_fx[0] ); // 2*Qu - 6 + 1 - FOR( j = 1; j < N; j++ ) - { - W_acc = W_mac_32_32( W_acc, Mpy_32_16_1( u_fx[j], shl( w[j], 2 ) ), u_fx[j] ); // 2*Qu - 6 + 1 - } - - tmp_n = W_norm( W_acc ); - ss2 = W_extract_h( W_shl( W_acc, tmp_n ) ); - tmp_e = sub( add( shl( u_e, 1 ), 5 ), tmp_n ); - - /* Set up inital error (residual) vectors */ - pTmp = resid_fx[1]; /*move16();*/ - resid_e = u_e; - move16(); - IF( applyDCT_flag != 0 ) - { - resid_e = s_max( u_e, 12 ); - } - FOR( c = 0; c < maxC; c++ ) - { - Copy32( u_fx, pTmp + c * N, N ); - test(); - IF( applyDCT_flag != 0 && LT_16( u_e, 12 ) ) - { - scale_sig32( pTmp + c * N, N, sub( u_e, resid_e ) ); - } - dist_fx[1][c] = ss2; - move32(); - dist_e[1][c] = tmp_e; - move16(); - } - - /* Loop over all stages */ - m = 1; - move16(); - FOR( s = 0; s < stages; s++ ) - { - /* codebook pointer is set to point to first stage */ - cbp = cb[s]; /*Q_cb*/ - cb_stage = cbp; - - /* Set up pointers to parent and current nodes */ - swap( indices[0], indices[1], Word16 * ); - move16(); - move16(); - move16(); - swap( resid_fx[0], resid_fx[1], Word32 * ); - move32(); - move32(); - move32(); - swap( dist_fx[0], dist_fx[1], Word32 * ); - swap( dist_e[0], dist_e[1], Word16 * ); - move32(); - move32(); - move32(); - move16(); - move16(); - move16(); - - /* p_max points to maximum distortion node (worst of best) */ - p_max = 0; - move16(); - - n = N; - move16(); - maxn = maxN; - move16(); - if ( dims ) - { - n = dims[s]; - move16(); - } - if ( dims ) - { - maxn = n; - move16(); - } - - assert( ( maxn % 4 ) == 0 ); - - start = 0; - move16(); - if ( offs ) - { - start = offs[s]; - move16(); - } - - set32_fx( Tmp, 0, start ); - set32_fx( Tmp + start + n, 0, sub( N, add( start, n ) ) ); - - /* Set distortions to a large value */ - FOR( j = 0; j < maxC; j++ ) - { - dist_fx[1][j] = MAX_32; - move32(); - dist_e[1][j] = MAX_16 / 2; - move16(); - } - - test(); - IF( !s && applyDCT_flag != 0 ) /* means: m==1 */ - { - /* stage 1 candidates search in truncated dct24 domain without any weights */ - assert( N == FDCNG_VQ_MAX_LEN || N == FDCNG_VQ_MAX_LEN_WB ); /* 21 and 24 allowed */ - assert( maxC == 2 * FDCNG_VQ_DCT_NSEGM ); - p_max = msvq_stage1_dct_search_fx( u_fx, u_e, FDCNG_VQ_MAX_LEN, maxC, DCT_T2_24_XX, FDCNG_VQ_DCT_MAXTRUNC, (Word32 *) invTrfMatrix_fx, cdk1r_tr_midQ_truncQ_fx, fdcng_dct_scaleF_fx, FDCNG_VQ_DCT_NSEGM, - cdk1_ivas_cols_per_segment, cdk1_ivas_trunc_dct_cols_per_segment, cdk1_ivas_entries_per_segment, cdk1_ivas_cum_entries_per_segment, cdk_37bits_ivas_stage1_W8Qx_dct_sections, - stage1_dct_col_syn_shift, cdk1_ivas_segm_neighbour_fwd, cdk1_ivas_segm_neighbour_rev, FDCNG_VQ_DCT_NPOST, st1_mse_ptr_fx, indices_st1_local, st1_syn_vec_ptr_fx, dist_fx[1], &dist_e[1][0] ); - - /* move established stage#1 indices to the global MSVQ list structure */ - set16_fx( dist_e[1], dist_e[1][0], maxC ); - FOR( c = 0; c < maxC; c++ ) - { - indices[1][c * stages] = indices_st1_local[c]; - move16(); - } - } - ELSE - { - FOR( j = 0; j < levels[s]; j++ ) - { - /* Compute weighted codebook element and its energy */ - en = 0; - move32(); - en_e = 0; - move16(); - W_acc = 0; - move64(); - FOR( c2 = 0; c2 < n; c2++ ) - { - Tmp[start + c2] = L_mult0( shl( w[start + c2], 2 ), cbp[c2] ); - move32(); - W_acc = W_mac_32_16( W_acc, Tmp[start + c2], cbp[c2] ); - } - - tmp_n = W_norm( W_acc ); - - en = W_extract_h( W_shl( W_acc, tmp_n ) ); - en_e = sub( sub( 52, shl( Q_cb, 1 ) ), tmp_n ); - - cbp += maxn; /* pointer is incremented */ - - /* Iterate over all parent nodes */ - FOR( c = 0; c < m; c++ ) - { - pTmp = &resid_fx[0][c * N]; - pTmp_e = resid_e; - move16(); - /*tmp = (*pTmp++) * Tmp[0];*/ - W_acc = W_mult_32_32( pTmp[0], Tmp[0] ); - - FOR( i = 1; i < N; i++ ) - { - W_acc = W_mac_32_32( W_acc, pTmp[i], Tmp[i] ); - } - tmp_n = W_norm( W_acc ); - tmp = W_extract_h( W_shl( W_acc, tmp_n ) ); - tmp_e = sub( add( pTmp_e, sub( Q31 - Q10, Q_cb ) ), tmp_n ); - - - tmp_n = s_max( tmp_e, en_e ); - tmp_n = s_max( dist_e[0][c], tmp_n ); - - IF( NE_16( dist_e[0][c], MAX_16 / 2 ) ) - { - tmp_n = add( tmp_n, 2 ); - tmp = L_sub( L_shl( en, sub( en_e, tmp_n ) ), L_shl( tmp, add( sub( tmp_e, tmp_n ), 1 ) ) ); - tmp = L_add( tmp, L_shl( dist_fx[0][c], sub( dist_e[0][c], tmp_n ) ) ); - } - ELSE - { - tmp = MAX_32 - 1; - move32(); - tmp_n = MAX_16 / 2; - move32(); - } - - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tmp, tmp_n, dist_fx[1][p_max], dist_e[1][p_max] ), -1 ) ) - { - /* Replace worst */ - dist_fx[1][p_max] = tmp; - move32(); - dist_e[1][p_max] = tmp_n; - move16(); - indices[1][p_max * stages + s] = j; - move16(); - parents[p_max] = c; - move16(); - - p_max = 0; - move16(); - tmp_e = p_max; - move16(); - - tmp_n = dist_e[1][0]; - move16(); - FOR( c2 = 1; c2 < maxC; c2++ ) - { - if ( EQ_16( BASOP_Util_Cmp_Mant32Exp( dist_fx[1][c2], dist_e[1][c2], dist_fx[1][p_max], dist_e[1][p_max] ), 1 ) ) - { - p_max = c2; - move16(); - } - test(); - if ( GT_16( dist_e[1][c2], tmp_n ) && NE_16( dist_e[1][c2], MAX_16 / 2 ) ) - { - tmp_n = dist_e[1][c2]; - move16(); - } - } - FOR( c2 = 0; c2 < maxC; c2++ ) - { - IF( NE_16( dist_e[1][c2], MAX_16 / 2 ) ) - { - dist_fx[1][c2] = L_shl( dist_fx[1][c2], sub( dist_e[1][c2], tmp_n ) ); - move32(); - dist_e[1][c2] = tmp_n; - move16(); - } - } - } /*IF (L_sub(tmp,dist[1][p_max]) < 0) */ - } /* FOR (c=0; c #include #include "options.h" -//#include "prot_fx.h" #include "cnst.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "rom_enc.h" #include "basop_util.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ +#include "basop_proto_func.h" +#include "wmc_auto.h" /*-------------------------------------------------------------------* * Local constants *-------------------------------------------------------------------*/ +#define kMaxC 8 + #define MAXINT32 2147483647 #ifndef swap #define swap( x, y, type ) \ @@ -35,10 +37,381 @@ val1 = shr( ( cbp )[1], 4 ); \ val2 = shr( ( cbp )[2], 4 ); \ val3 = add( add( shr( lshl( ( cbp )[2], 12 ), 4 ), lshr( lshl( ( cbp )[1], 12 ), 8 ) ), s_and( ( cbp )[0], 0xF ) ); + +/*--------------------------------------------------------------------------* + * msvq_encmsvq_stage1_dct_search() + * + * stage1 search in a segmentwise truncated dct N domain without weights + *--------------------------------------------------------------------------*/ + +/*! r: (p_max , best candidate sofar ) */ +Word16 msvq_stage1_dct_search_fx( + const Word32 *u_fx, /* i : target exp : u_e */ + const Word16 u_e, /* i : exp for target Q0 */ + const Word16 N, /* i : target length and IDCT synthesis length */ + const Word16 maxC_st1, /* i : number of final stage 1 candidates to provide */ + const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */ + const Word16 max_dct_trunc, /* i : maximum of truncation lenghts */ + Word32 *invTrfMatrix_fx, /* i : IDCT synthesis matrix for dim N Q31 */ + const Word16 *midQ_truncQ_fx, /* i : midQ vector */ + const Word32 *dct_scaleF_fx, /* i : global scale factors Q10 */ + const Word16 n_segm, /* i : number of segments */ + const Word16 *cols_per_segment, /* i : remaining length per segment */ + const Word16 *trunc_dct_cols_per_segment, /* i : trunc length per segment */ + const Word16 *entries_per_segment, /* i : number of rows per segment */ + const Word16 *cum_entries_per_segment, /* i : number of cumulative entries */ + const Word8 *const W8Qx_dct_sections[], /* i : Word8(byte) segment table ptrs */ + const Word16 *col_syn_shift[], /* i : columnwise syn shift tables */ + const Word8 *segm_neighbour_fwd, /* i : circular neighbour list fwd */ + const Word8 *segm_neighbour_rev, /* i : circular neighbour list reverse */ + const Word16 npost_check, /* i : number of neigbours to check , should be even */ + Word32 *st1_mse_ptr_fx, /* i : dynRAM buffer for MSEs exp : u_e */ + Word16 *indices_st1_local, /* o : selected cand indices */ + Word32 *st1_syn_vec_ptr_fx, /* i/o: buffer for IDCT24 synthesis i :exp : u_e */ + Word32 *dist1_ptr_fx, /* o : resulting stage 1 MSEs in DCT-N domain */ + Word16 *dist1_ptr_e ) +{ + Word32 dct_target_fx[FDCNG_VQ_DCT_MAXTRUNC]; // Q20 + Word32 u_mr_fx[FDCNG_VQ_MAX_LEN]; + Word16 dist1_ptr_e_buf[2 * LSFMBEST_MAX]; + Word64 mse_trunc_segm_fx[FDCNG_VQ_DCT_NSEGM]; + Word32 tmp_fx, check_mse; + Word16 tmp_e, check_mse_e; + Word64 mse_fx; /* Word64 in BASOP */ + + Word16 p_max, c, c2, segm, j_full, j, i; + Word16 n_ana, p_mins[2], idx_min[2]; + + Word16 st1_mse_ptr_e[128]; + + const Word8 *cbpW8; + const Word16 *dct_col_shift_tab; + + Word32 *st1_mse_pair_fx; + Word16 *st1_mse_pair_e; + Word16 *st1_idx_pair; + + Word32 tmp2_fx; + Word16 check_ind[FDCNG_VQ_DCT_NPOST]; + assert( ( npost_check % 2 == 0 ) && ( npost_check <= FDCNG_VQ_DCT_NPOST ) ); + + assert( n_segm <= FDCNG_VQ_DCT_NSEGM ); + + n_ana = N; /* VQ stage#1 core is currently always using stored DCT N coeffs */ + move16(); + assert( n_ana >= max_dct_trunc ); /* check for FDCNGVQ WB , SWB, FB operation */ + + /* remove mid stage#1 vector, in original input domain */ + tmp_e = s_max( 12, u_e ); + FOR( i = 0; i < n_ana; i++ ) + { + u_mr_fx[i] = L_sub( L_shl( u_fx[i], sub( u_e, tmp_e ) ), L_shl( midQ_truncQ_fx[i], sub( Q31 - Q10, tmp_e ) ) ); // tmp_e + move32(); + } + + dctT2_N_apply_matrix_fx( (const Word32 *) u_mr_fx, dct_target_fx, s_min( max_dct_trunc, n_ana ), n_ana, invTrfMatrix_fx, max_dct_trunc, dcttype ); // exp : tmp_e + + /* init search state ptr's at the top */ + set32_fx( dist1_ptr_fx, MAX_32, maxC_st1 ); + set16_fx( dist1_ptr_e_buf, 32, maxC_st1 ); + st1_mse_pair_fx = &( dist1_ptr_fx[0] ); /* req. ptr post upd +=2 */ // st1_mse_pair_e + st1_mse_pair_e = &( dist1_ptr_e_buf[0] ); /* req. ptr post upd +=2 */ + st1_idx_pair = &( indices_st1_local[0] ); /* req. ptr post upd +=2 */ + set64_fx( mse_trunc_segm_fx, 0, n_segm ); + + // set16_fx( mse_trunc_segm_e, u_e, FDCNG_VQ_DCT_NSEGM ); + + FOR( segm = 0; segm < n_segm; segm++ ) + { /* point to a new paired location for each segment */ + p_max = 0; /* req. to point to one of 1 or 0, this init can potentially be omitted here,as p_max is always 1 or 0 */ + move16(); + + /* compute segment common trunction error in dctN domain */ + + FOR( i = 0; i < trunc_dct_cols_per_segment[segm]; i++ ) + { + mse_trunc_segm_fx[segm] = W_mac_32_32( mse_trunc_segm_fx[segm], dct_target_fx[cols_per_segment[segm] + i], dct_target_fx[cols_per_segment[segm] + i] ); // Q41 + move64(); + } + + cbpW8 = W8Qx_dct_sections[segm]; /* Word8 column variable Qx storage , table ptr init */ + + FOR( j = 0; j < entries_per_segment[segm]; j++ ) + { + /* unweighted segmented search DCT domain loop */ + j_full = add( j, cum_entries_per_segment[segm] ); /* or simply use j_full++ */ + + mse_fx = mse_trunc_segm_fx[segm]; /* init mse with with common mse truncation part, in BASOP a move32() */ // Q41 + move64(); + + dct_col_shift_tab = col_syn_shift[segm]; /* ptr init */ + + FOR( c2 = 0; c2 < cols_per_segment[segm]; c2++ ) + { +#define WMC_TOOL_SKIP + tmp_fx = L_sub( dct_target_fx[c2], Mpy_32_32( L_shl( cbpW8[c2], add( sub( Q31, tmp_e ), dct_col_shift_tab[c2] ) ), dct_scaleF_fx[1] ) ); /* note: BASOP shift left defined for signed integers */ + LOGIC( 1 ); + SHIFT( 1 ); + ADD( 1 ); /* in BASOP: s_and(for W8->W16), shl(), sub()*/ +#undef WMC_TOOL_SKIP + mse_fx = W_mac_32_32( mse_fx, tmp_fx, tmp_fx ); /* L_mac or L_mac0() square Word16 -> Word32*/ // Q41 + } + Word16 L_tmp = W_norm( mse_fx ); + st1_mse_ptr_fx[j_full] = W_extract_h( W_lshl( mse_fx, L_tmp ) ); /* save MSE in shared dynamic RAM, move32() in BASOP */ // st1_mse_ptr_e + move32(); + st1_mse_ptr_e[j_full] = sub( shl( tmp_e, 1 ), L_tmp ); + move16(); + +#define WMC_TOOL_SKIP + cbpW8 += cols_per_segment[segm]; /* fixed pointer increment for each segment */ +#undef WMC_TOOL_SKIP + + /* overwrite with a new worst index at p_max */ + + /* Note: The three inner loop if's below are not 100% properly instrumented by WMC tool */ + // if ( st1_mse_ptr_fx[j_full] < st1_mse_pair_fx[p_max] ) /* L_sub */ + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( st1_mse_ptr_fx[j_full], st1_mse_ptr_e[j_full], st1_mse_pair_fx[p_max], st1_mse_pair_e[p_max] ), -1 ) ) /* L_sub */ + { + st1_idx_pair[p_max] = j_full; /* move16, single BASOP */ + move16(); + } /* BASOP 2 ops */ + + IF( EQ_16( st1_idx_pair[p_max], j_full ) ) + { /* idx updated --> also update mse */ + st1_mse_pair_fx[p_max] = st1_mse_ptr_fx[j_full]; /* move32(), single BASOP */ + move32(); + st1_mse_pair_e[p_max] = st1_mse_ptr_e[j_full]; /* move32(), single BASOP */ + move16(); + } /* BASOP 3 ops */ + + /* avoid WC costly candidate list management by always updating p_max, + as we have only a pair in each segment to maintain */ + p_max = 0; + move16(); + if ( EQ_16( BASOP_Util_Cmp_Mant32Exp( st1_mse_pair_fx[0], st1_mse_pair_e[0], st1_mse_pair_fx[1], st1_mse_pair_e[1] ), -1 ) ) /* L_sub()*/ + { + p_max = 1; /* move16() */ + move16(); + } /* BASOP 3 ops ,Note 2 ops possible in BASOP with L_sub and L_lshr */ + + /* Note: logical shift right not available in ANSI-C */ + /* p_max = (st1_mse_pair[0] - st1_mse_pair[1]) ">>>" 31; */ + /* in java logical shift right is available as >>> , in BASOP it is available as L_lshr */ + + /* Cost: weighted sum with cond moves ('if') => 8 in float , 7 in BASOP with L_lshr */ + } /* j in section */ + + st1_mse_pair_fx += 2; /* req. ptr init */ + st1_mse_pair_e += 2; /* req. ptr init */ + st1_idx_pair += 2; /* req. ptr init */ + + } /* next segment */ + + tmp_e = 0; + move16(); + FOR( j = 0; j < maxC_st1; j++ ) + { + /* compute_full mse using stored DCT24 domain MSE's */ + /* calculate MSE from stage1 inner using existing inner DCT domain variables */ + tmp_e = s_max( dist1_ptr_e_buf[j], tmp_e ); + } + + FOR( j = 0; j < maxC_st1; j++ ) + { + /* compute_full mse using stored DCT24 domain MSE's */ + /* calculate MSE from stage1 inner using existing inner DCT domain variables */ + dist1_ptr_fx[j] = L_shr( dist1_ptr_fx[j], sub( tmp_e, dist1_ptr_e_buf[j] ) ); + move32(); + *dist1_ptr_e = tmp_e; + move16(); + } + + + assert( ( maxC_st1 >= 3 ) ); + assert( ( maxC_st1 <= 8 ) ); + + p_max = maximum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* establish current worst candidate for MSVQ stage#2 among all maxC_st1 candidates so far */ + + p_mins[0] = minimum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* find best entry among all maxC_pre */ + move16(); + tmp_fx = dist1_ptr_fx[p_mins[0]]; + move32(); + dist1_ptr_fx[p_mins[0]] = MAX_32; /* exclude 1st */ + move32(); + + p_mins[1] = minimum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* find 2nd best entry */ + move16(); + tmp2_fx = dist1_ptr_fx[p_mins[1]]; + move32(); + dist1_ptr_fx[p_mins[1]] = MAX_32; /* exclude 2nd */ + move32(); + + dist1_ptr_fx[p_mins[0]] = tmp_fx; /* restore 1st */ + move32(); + dist1_ptr_fx[p_mins[1]] = tmp2_fx; /* restore 2nd */ + move32(); + + idx_min[0] = indices_st1_local[p_mins[0]]; + move16(); + idx_min[1] = indices_st1_local[p_mins[1]]; + move16(); + + + /* use global exclusion list to never reselect the two (best) global MSE values sofar */ + st1_mse_ptr_fx[idx_min[0]] = MAX_32; /* move32() */ + move32(); + st1_mse_ptr_e[idx_min[0]] = MAX_16; + move16(); + st1_mse_ptr_fx[idx_min[1]] = MAX_32; /* move32() */ + move32(); + st1_mse_ptr_e[idx_min[1]] = MAX_16; + move16(); + + /* circular MSE-neigbour list in use to potentially replace some segment search candidates */ + /* using both 1st and 2nd best neighbours in fwd and rev directions */ + check_ind[0] = segm_neighbour_fwd[idx_min[0]]; + move16(); + check_ind[1] = segm_neighbour_rev[idx_min[0]]; + move16(); + + check_ind[2] = segm_neighbour_fwd[idx_min[1]]; + move16(); + check_ind[3] = segm_neighbour_rev[idx_min[1]]; + move16(); + + check_ind[4] = segm_neighbour_fwd[check_ind[0]]; + move16(); + check_ind[5] = segm_neighbour_rev[check_ind[1]]; + move16(); + + check_ind[6] = segm_neighbour_fwd[check_ind[2]]; + move16(); + check_ind[FDCNG_VQ_DCT_NPOST - 1] = segm_neighbour_rev[check_ind[3]]; + move16(); + + FOR( i = 0; i < npost_check; i++ ) + { + /* move MSE from DCT-inner loop search to input synthesis domain */ + /* multiplication by fdcng_dct_scaleF[2] to get the float outer loop scale correct in IDCT synthesis domain */ + check_mse = st1_mse_ptr_fx[check_ind[i]]; + move32(); + check_mse_e = st1_mse_ptr_e[check_ind[i]]; + move16(); + + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( check_mse, check_mse_e, dist1_ptr_fx[p_max], *dist1_ptr_e ), -1 ) ) + { /* new winner , replace worst */ + dist1_ptr_fx[p_max] = L_shl( check_mse, sub( check_mse_e, *dist1_ptr_e ) ); + move32(); + indices_st1_local[p_max] = check_ind[i]; + move16(); + st1_mse_ptr_fx[check_ind[i]] = MAX_32; /* exclude, BASOP: move32() */ + move32(); + st1_mse_ptr_e[check_ind[i]] = MAX_16; + move16(); + p_max = maximum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* establish a new current worst candidate among all maxC */ + } + } + + /* extract the selected stage one vectors in DCT_N domain , apply IDCT_N and scale up */ + /* always extract full length signal(e.g. 24) to be able to update WB(e.g. N_in==21) candidate MSE values */ + /* in the case that only a part of the IDCT N vector is in final use */ + + /* note: synthesis not yet fully parameterized/generalized for other IDCT lengths */ + assert( N == 24 ); + { + FOR( c = 0; c < maxC_st1; c++ ) + { + dec_FDCNG_MSVQ_stage1_fx( indices_st1_local[c], N, invTrfMatrix_fx, dcttype + 1, &( st1_syn_vec_ptr_fx[c * N] ), NULL ); // Q11 : output + scale_sig32( &( st1_syn_vec_ptr_fx[c * N] ), N, sub( 11, s_max( u_e, 12 ) ) ); + } + } + + return p_max; /*ptr to worst performing candidate */ +} + + +/*--------------------------------------------------------------------------* + * msvq_stage1_dct_recalc_candidates_fdcng_wb() + * + * recalc MSE for fdcng WB(0..20) coeffs , + essentially subtract res21^2 ,res22^2, res23^2 that was included in stage1 MSE in the DCT24 domain truncated search, + excludes the waveform contributions at pos 21,22,23 to the MSE, important to keep the WB MSEs update for the subsequent stages + *--------------------------------------------------------------------------*/ + +/*! r: (updated p_max) */ +Word16 msvq_stage1_dct_recalc_candidates_fdcng_wb_fx( + const Word32 *st1_syn_vec_ptr_fx, /* i : IDCT24 synthesis vectors st1_syn_vec_e*/ + const Word16 st1_syn_vec_e, /* i : exp for IDCT24 synthesis vectors */ + const Word32 *u_fx, /* i : target signal u_e*/ + const Word16 u_e, /* i : exp for target signal */ + const Word16 maxC_st1, /* i : number of candidates in stage1 */ + Word32 *dist_ptr_fx, /* i/o: updated MSE vector for stage1 */ + Word16 *dist_ptr_e /* i/o: exp for updated MSE vector for stage1 */ +) +{ + Word16 i; + Word16 p_max_local, c; + const Word32 *p2_fx; + Word16 tmp_e; + Word32 res24_fx, high_diff_fx[FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB]; + Word64 acc; + Word16 res24_e[FD_CNG_maxC_37bits]; + Word16 dist_e; + + dist_e = *dist_ptr_e; + move16(); + FOR( c = 0; c < maxC_st1; c++ ) + { /* point to extended synthesis part */ + p2_fx = (const Word32 *) &( st1_syn_vec_ptr_fx[c * FDCNG_VQ_MAX_LEN + FDCNG_VQ_MAX_LEN_WB] ); /* ptr init to synthesis candidate c */ + tmp_e = s_max( st1_syn_vec_e, u_e ); + tmp_e = add( tmp_e, 1 ); + /* for stage#1 use "u" instead of the shortened resid[0], to access the extended/extrapolated input target */ + FOR( i = 0; i < FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB; i++ ) + { + high_diff_fx[i] = L_sub( L_shr( p2_fx[i], sub( tmp_e, st1_syn_vec_e ) ), L_shr( u_fx[FDCNG_VQ_MAX_LEN_WB + i], sub( tmp_e, u_e ) ) ); // tmp_e + move32(); + } + acc = 0; + move64(); + FOR( i = 0; i < FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB; i++ ) + { + acc = W_mac_32_32( acc, high_diff_fx[i], high_diff_fx[i] ); + } + res24_e[c] = tmp_e; + move16(); + tmp_e = W_norm( acc ); + res24_fx = W_extract_h( W_shl( acc, tmp_e ) ); + + res24_e[c] = sub( shl( res24_e[c], 1 ), tmp_e ); + move16(); + + dist_ptr_fx[c] = BASOP_Util_Add_Mant32Exp( dist_ptr_fx[c], *dist_ptr_e, L_negate( res24_fx ), res24_e[c], &res24_e[c] ); /* remove DCT24 high band error contribution */ + move32(); + dist_e = s_max( dist_e, res24_e[c] ); + move16(); + } + + + FOR( c = 0; c < maxC_st1; c++ ) + { + dist_ptr_fx[c] = L_shl( dist_ptr_fx[c], sub( res24_e[c], dist_e ) ); + move32(); + } + *dist_ptr_e = dist_e; + move16(); + /* finally update p_max, as it may potentially change, + due to the core DCT24 search originally optimizing over the longer basis vectors than DCT21 */ + p_max_local = maximum_32_fx( dist_ptr_fx, maxC_st1, NULL ); + + return p_max_local; +} + + /*--------------------------------------------------------------------------* * depack_mul_values_fx() * *--------------------------------------------------------------------------*/ + static Word32 depack_mul_values_fx( Word16 *Tmp, const Word16 *w, const Word16 *cbp, const Word16 N ) { Word16 i, val0, val1, val2, val3; @@ -65,10 +438,13 @@ static Word32 depack_mul_values_fx( Word16 *Tmp, const Word16 *w, const Word16 * return en; } + + /*--------------------------------------------------------------------------* * depack_sub_values() * *--------------------------------------------------------------------------*/ + static void depack_sub_values_fx( Word16 *pTmp, const Word16 *p1, const Word16 *cbp, const Word16 N ) { Word16 j, val0, val1, val2, val3; @@ -88,11 +464,41 @@ static void depack_sub_values_fx( Word16 *pTmp, const Word16 *p1, const Word16 * move16(); /*3Q12*1.28*/ } } + + +static Word64 depack_mul_values_fx64( Word32 *Tmp, const Word16 *w, const Word16 *cbp, const Word16 N ) +{ + Word16 i, val0, val1, val2, val3; + Word64 en; + + en = 0; + move32(); + FOR( i = 0; i < N; i += 4 ) + { + depack_4_values( cbp + i_mult( shr( i, 2 ), 3 ), val0, val1, val2, val3 ) + Tmp[i + 0] = L_mult0( w[i + 0], val0 ); // Q8 * Q2.56 + move16(); + en = W_mac_32_16( en, Tmp[i + 0], val0 ); // Q8 * Q2.56 * 2.56 * Q1 + Tmp[i + 1] = L_mult0( w[i + 1], val1 ); + move16(); + en = W_mac_32_16( en, Tmp[i + 1], val1 ); + Tmp[i + 2] = L_mult0( w[i + 2], val2 ); + move16(); + en = W_mac_32_16( en, Tmp[i + 2], val2 ); + Tmp[i + 3] = L_mult0( w[i + 3], val3 ); + move16(); + en = W_mac_32_16( en, Tmp[i + 3], val3 ); + } + + return en; // Q8 * Q2.56 * 2.56 * Q1 +} + /*--------------------------------------------------------------------------* * msvq_enc_find_p_max_8() * * Unroll of inner search loop for maxC == 8 *--------------------------------------------------------------------------*/ + static Word16 msvq_enc_find_p_max_8_fx( Word32 dist[] ) { Word16 p_max; @@ -139,11 +545,62 @@ static Word16 msvq_enc_find_p_max_8_fx( Word32 dist[] ) BASOP_SATURATE_WARNING_ON_EVS return p_max; } + + +static Word16 msvq_enc_find_p_max_8_fx64( Word64 dist[] ) +{ + Word16 p_max; + + p_max = 0; + move16(); + + BASOP_SATURATE_WARNING_OFF_EVS + if ( GT_64( dist[1], dist[p_max] ) ) + { + p_max = 1; + move16(); + } + if ( GT_64( dist[2], dist[p_max] ) ) + { + p_max = 2; + move16(); + } + if ( GT_64( dist[3], dist[p_max] ) ) + { + p_max = 3; + move16(); + } + if ( GT_64( dist[4], dist[p_max] ) ) + { + p_max = 4; + move16(); + } + if ( GT_64( dist[5], dist[p_max] ) ) + { + p_max = 5; + move16(); + } + if ( GT_64( dist[6], dist[p_max] ) ) + { + p_max = 6; + move16(); + } + if ( GT_64( dist[7], dist[p_max] ) ) + { + p_max = 7; + move16(); + } + BASOP_SATURATE_WARNING_ON_EVS + return p_max; +} + + /*--------------------------------------------------------------------------* * msvq_enc_find_p_max_6() * * Unroll of inner search loop for maxC == 6 *--------------------------------------------------------------------------*/ + static Word16 msvq_enc_find_p_max_6_fx( Word32 dist[] ) { Word16 p_max; @@ -180,11 +637,51 @@ static Word16 msvq_enc_find_p_max_6_fx( Word32 dist[] ) BASOP_SATURATE_WARNING_ON_EVS return p_max; } + +static Word16 msvq_enc_find_p_max_6_fx64( Word64 dist[] ) +{ + Word16 p_max; + + p_max = 0; + move16(); + + BASOP_SATURATE_WARNING_OFF_EVS + if ( GT_64( dist[1], dist[p_max] ) ) + { + p_max = 1; + move16(); + } + if ( GT_64( dist[2], dist[p_max] ) ) + { + p_max = 2; + move16(); + } + if ( GT_64( dist[3], dist[p_max] ) ) + { + p_max = 3; + move16(); + } + if ( GT_64( dist[4], dist[p_max] ) ) + { + p_max = 4; + move16(); + } + if ( GT_64( dist[5], dist[p_max] ) ) + { + p_max = 5; + move16(); + } + BASOP_SATURATE_WARNING_ON_EVS + return p_max; +} + + /*--------------------------------------------------------------------------* * msvq_enc_fx() * * MSVQ encoder *--------------------------------------------------------------------------*/ + void msvq_enc_fx( const Word16 *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) (0Q15) */ const Word16 dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ @@ -278,10 +775,468 @@ void msvq_enc_fx( move16(); move16(); move16(); - swap( dist[0], dist[1], Word32 * ); + swap( dist[0], dist[1], Word32 * ); + move32(); + move32(); + move32(); + + /* p_max points to maximum distortion node (worst of best) */ + p_max = 0; + move16(); + + n = N; + move16(); + maxn = maxN; + move16(); + if ( dims ) + { + n = dims[s]; + move16(); + } + if ( dims ) + { + maxn = n; + move16(); + } + + assert( ( maxn % 4 ) == 0 ); + N34 = mult( maxn, 24576 /*0.75f Q15*/ ); + + start = 0; + move16(); + if ( offs ) + { + start = offs[s]; + move16(); + } + + set16_fx( Tmp, 0, start ); + set16_fx( Tmp + start + n, 0, sub( N, add( start, n ) ) ); + + /* Set distortions to a large value */ + FOR( j = 0; j < maxC; j++ ) + { + dist[1][j] = MAXINT32; + move32(); + } + + FOR( j = 0; j < levels[s]; j++ ) + { + /* Compute weighted codebook element and its energy */ + en = depack_mul_values_fx( Tmp + start, w + start, cbp, n ); + + cbp += N34; /* pointer is incremented */ + + /* Iterate over all parent nodes */ + FOR( c = 0; c < m; c++ ) + { + pTmp = &resid[0][c * N]; + /*tmp = (*pTmp++) * Tmp[0];*/ + t1 = L_mult( pTmp[0], Tmp[0] ); + + FOR( i = 1; i < N; i++ ) + { + t1 = L_mac( t1, pTmp[i], Tmp[i] ); + } + + BASOP_SATURATE_WARNING_OFF_EVS + /*NOTE: as long as a shorter distance is found, saturation can be accepted.*/ + tmp = L_add_sat( dist[0][c], L_sub_sat( en, L_shl( t1, 1 ) ) ); + t1 = L_sub_sat( tmp, dist[1][p_max] ); + BASOP_SATURATE_WARNING_ON_EVS + + IF( t1 <= 0 ) + { + /* Replace worst */ + dist[1][p_max] = tmp; + move32(); + indices[1][p_max * stages + s] = j; + move16(); + add( 0, 0 ); + mult( 0, 0 ); + parents[p_max] = c; + move16(); + + p_max = ( *func_ptr )( dist[1] ); + + } /*IF (L_sub(tmp,dist[1][p_max]) < 0) */ + } /* FOR (c=0; c> 16 => Qwnorm-15/16 * Q0/16 << 1 => Qwnorm-14/32 * 6.5536 */ + Word64 ss2_64; + ss2_64 = W_mult_32_16( L_mult0( u[0], w[0] ), u[0] ); + // Q8 * Q2.56 * 2.56 * Q1 + FOR( j = 1; j < N; j++ ) + { + ss2_64 = W_mac_32_16( ss2_64, L_mult0( u[j], w[j] ), u[j] ); + } + + /* Set up inital error (residual) vectors */ + pTmp = resid[1]; /*move16();*/ + FOR( c = 0; c < maxC; c++ ) + { + Copy( u, pTmp + c * N, N ); + dist_64[1][c] = ss2_64; + move64(); + } + + /* Loop over all stages */ + m = 1; + move16(); + FOR( s = 0; s < stages; s++ ) + { + /* codebook pointer is set to point to first stage */ + cbp = cb[s]; /*3Q12*1.28*/ + move16(); + + /* Set up pointers to parent and current nodes */ + swap( indices[0], indices[1], Word16 * ); + move16(); + move16(); + move16(); + move16(); + swap( resid[0], resid[1], Word16 * ); + move16(); + move16(); + move16(); + swap( dist_64[0], dist_64[1], Word64 * ); + move64(); + move64(); + move64(); + + /* p_max points to maximum distortion node (worst of best) */ + p_max = 0; + move16(); + + n = N; + move16(); + maxn = maxN; + move16(); + if ( dims ) + { + n = dims[s]; + move16(); + } + if ( dims ) + { + maxn = n; + move16(); + } + + assert( ( maxn % 4 ) == 0 ); + N34 = mult( maxn, 24576 /*0.75f Q15*/ ); + + start = 0; + move16(); + if ( offs ) + { + start = offs[s]; + move16(); + } + + set32_fx( Tmp32, 0, start ); + set32_fx( Tmp32 + start + n, 0, sub( N, add( start, n ) ) ); + + /* Set distortions to a large value */ + FOR( j = 0; j < maxC; j++ ) + { + dist_64[1][j] = LLONG_MAX; + move64(); + } + + FOR( j = 0; j < levels[s]; j++ ) + { + /* Compute weighted codebook element and its energy */ + en64 = depack_mul_values_fx64( Tmp32 + start, w + start, cbp, n ); // Q8 + // en64: Q8 * Q2.56 * Q2.56 * q1 + // Tmp: 2.56 * Q8 + + cbp += N34; /* pointer is incremented */ + + /* Iterate over all parent nodes */ + FOR( c = 0; c < m; c++ ) + { + pTmp = &resid[0][c * N]; // this resid buffer is initial lsf values + /*tmp = (*pTmp++) * Tmp[0];*/ + Word64 t164 = 0; + move64(); + t164 = W_mult_32_16( Tmp32[0], pTmp[0] ); // 2.56 * Q8 * Q2.56 * Q1 + // Tmp32: Q8 * Q2.56 + FOR( i = 1; i < N; i++ ) + { + t164 = W_mac_32_16( t164, Tmp32[i], pTmp[i] ); // 2.56 * Q8 * Q2.56 * Q1 + } + + tmp64 = W_add( dist_64[0][c], W_sub( en64, W_shl( t164, 1 ) ) ); + t164 = W_sub( tmp64, dist_64[1][p_max] ); + IF( t164 <= 0 ) + { + /* Replace worst */ + dist_64[1][p_max] = tmp64; + move64(); + indices[1][p_max * stages + s] = j; + move16(); + parents[p_max] = c; + move16(); + + p_max = ( *func_ptr64 )( dist_64[1] ); + + } /*IF (L_sub(tmp,dist[1][p_max]) < 0) */ + } /* FOR (c=0; c @@ -117,88 +117,10 @@ Word16 mdct_classifier_fx( /* o: MDCT A/B decision Word32 gain1_tmp = 0, gain2_tmp = 0; Word16 exp, exp1, exp2, exp3; Word32 L_tmp, L_tmp1; -#ifdef IVAS_CODE - Word16 gain2_start, gain3_start, gain4_start, H1_start, H2_start, H_length; - Word16 gain2_start_rs, gain3_start_rs; -#endif TCX_ENC_HANDLE hTcxEnc = st_fx->hTcxEnc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - test(); -#ifdef IVAS_CODE - IF( EQ_32( st_fx->input_Fs, 32000 ) || EQ_32( st_fx->input_Fs, 48000 ) ) - { - gain2_start = GAIN2_START_SWB; - gain2_start_rs = GAIN2_START_SWB_RS; - gain3_start = GAIN3_START_SWB; - gain3_start_rs = GAIN3_START_SWB_RS; - gain4_start = GAIN4_START_SWB; - // gain4_start_rs = GAIN4_START_SWB_RS; - H1_start = H1_START_SWB; - H2_start = H2_START_SWB; - H_length = H_LENGTH_SWB; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - ELSE IF( EQ_32( st_fx->input_Fs, 16000 ) ) - { - gain2_start = GAIN2_START_WB; - gain2_start_rs = GAIN2_START_SWB_RS; - gain3_start = GAIN3_START_WB; - gain2_start_rs = GAIN2_START_SWB_RS; - gain4_start = GAIN4_START_WB; - H1_start = H1_START_WB; - H2_start = H2_START_WB; - H_length = H_LENGTH_WB; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - ELSE - { - assert( !"Unknown sampling frequency in MDCT_classifier" ); - H1_start = -1; /* to avoid compilation warning */ - H2_start = -1; /* to avoid compilation warning */ - H_length = -1; /* to avoid compilation warning */ - gain2_start = -1; /* to avoid compilation warning */ - gain3_start = -1; /* to avoid compilation warning */ - gain4_start = -1; /* to avoid compilation warning */ - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } -#endif -#ifdef IVAS_CODE - if ( NE_16( st_fx->element_mode, IVAS_CPE_DFT ) ) -#endif - { - dft_mag_square_fx( fft_buff, magSq, 256 ); - } -#ifdef IVAS_CODE - ELSE - { - float norm_val; + dft_mag_square_fx( fft_buff, magSq, 256 ); - norm_val = ( L_FFT * L_FFT ) / 4.f; - for ( k = 0; k < 128; k++ ) - { - X[k + 1] = st->Bin_E_old[k] * norm_val; - } - X[0] = X[1]; - } -#endif nf = L_add( magSq[0], 0 ); pe = L_add( magSq[0], 0 ); np = 0; @@ -295,10 +217,7 @@ Word16 mdct_classifier_fx( /* o: MDCT A/B decision gain1 = L_deposit_l( 0 ); gain2 = L_deposit_l( 0 ); gain3 = L_deposit_l( 0 ); -#ifdef IVAS_CODE - PMT( "MDCT_classifier needs review for different sampling rate" ) -#endif - // IVAS_CODE to adapt + FOR( k = 0; k < 8; k++ ) { gain1 = L_add( gain1, L_shr( cldfbBuf_Ener[k], 3 ) ); @@ -432,7 +351,7 @@ Word16 mdct_classifier_fx( /* o: MDCT A/B decision test(); test(); test(); - IF( GT_32( Mult_32_16( gain3, 27307 ), gain2 ) || ( GE_32( gain3, Mult_32_16( gain2, 26214 ) ) && GT_32( peak_H1, L_shl_o( avrg_H1, 1, &Overflow ) ) ) || ( LT_32( Mult_32_32( L_shl_o( peak_l, exp, &Overflow ), L_shl_o( avrg_h, exp1, &Overflow ) ), Mult_32_32( L_shl_o( L_tmp, exp, &Overflow ), L_shl_o( avrg_l, exp1, &Overflow ) ) ) || GT_32( Mult_32_32( L_shl_o( L_tmp1, exp2, &Overflow ), L_shl_o( avrg_h, exp1, &Overflow ) ), Mult_32_32( L_shl_o( peak_h, exp2, &Overflow ), L_shl_o( avrg_l, exp1, &Overflow ) ) ) ) ) + IF( GT_32( Mult_32_16( gain3, 27307 ), gain2 ) || ( GE_32( gain3, Mult_32_16( gain2, 26214 ) ) && GT_32( peak_H1, L_shl_sat( avrg_H1, 1 ) ) ) || ( LT_32( Mult_32_32( L_shl( peak_l, exp ), L_shl( avrg_h, exp1 ) ), Mult_32_32( L_shl( L_tmp, exp ), L_shl( avrg_l, exp1 ) ) ) || GT_32( Mult_32_32( L_shl( L_tmp1, exp2 ), L_shl( avrg_h, exp1 ) ), Mult_32_32( L_shl( peak_h, exp2 ), L_shl( avrg_l, exp1 ) ) ) ) ) { condition3 = 1; move16(); @@ -526,7 +445,7 @@ Word16 mdct_classifier_fx( /* o: MDCT A/B decision test(); test(); test(); - IF( ( EQ_16( hTcxEnc->clas_final_old, HQ_CORE ) || EQ_16( hTcxEnc->clas_final_old, TCX_20_CORE ) ) && ( ( GT_32( hTcxEnc->last_gain1, L_shr( gain1_tmp, 1 ) ) && LT_32( hTcxEnc->last_gain1, L_shl_o( gain1_tmp, 1, &Overflow ) ) ) && ( GT_32( hTcxEnc->last_gain2, L_shr( gain2_tmp, 1 ) ) && LT_32( hTcxEnc->last_gain2, L_shl_o( gain2_tmp, 1, &Overflow ) ) ) ) ) + IF( ( EQ_16( hTcxEnc->clas_final_old, HQ_CORE ) || EQ_16( hTcxEnc->clas_final_old, TCX_20_CORE ) ) && ( ( GT_32( hTcxEnc->last_gain1, L_shr( gain1_tmp, 1 ) ) && LT_32( hTcxEnc->last_gain1, L_shl_sat( gain1_tmp, 1 ) ) ) && ( GT_32( hTcxEnc->last_gain2, L_shr( gain2_tmp, 1 ) ) && LT_32( hTcxEnc->last_gain2, L_shl_sat( gain2_tmp, 1 ) ) ) ) ) { clas_final = hTcxEnc->clas_final_old; move16(); @@ -619,8 +538,6 @@ Word16 mdct_classifier_ivas_fx( Word16 exp, exp1, exp2, exp3; Word32 gain1_tmp = 0, gain2_tmp = 0; Word32 L_tmp, L_tmp1; - Flag Overflow = 0; - move16(); move16(); move16(); @@ -964,7 +881,7 @@ Word16 mdct_classifier_ivas_fx( test(); test(); test(); - IF( GT_32( Mult_32_16( gain3, 27307 ), gain2 ) || ( GE_32( gain3, Mult_32_16( gain2, 26214 ) ) && GT_32( peak_H1, L_shl_o( avrg_H1, 1, &Overflow ) ) ) || ( LT_32( Mult_32_32( L_shl_o( peak_l, exp, &Overflow ), L_shl_o( avrg_h, exp1, &Overflow ) ), Mult_32_32( L_shl_o( L_tmp, exp, &Overflow ), L_shl_o( avrg_l, exp1, &Overflow ) ) ) || GT_32( Mult_32_32( L_shl_o( L_tmp1, exp2, &Overflow ), L_shl_o( avrg_h, exp1, &Overflow ) ), Mult_32_32( L_shl_o( peak_h, exp2, &Overflow ), L_shl_o( avrg_l, exp1, &Overflow ) ) ) ) ) + IF( GT_32( Mult_32_16( gain3, 27307 ), gain2 ) || ( GE_32( gain3, Mult_32_16( gain2, 26214 ) ) && GT_32( peak_H1, L_shl_sat( avrg_H1, 1 ) ) ) || ( LT_32( Mult_32_32( L_shl( peak_l, exp ), L_shl( avrg_h, exp1 ) ), Mult_32_32( L_shl( L_tmp, exp ), L_shl( avrg_l, exp1 ) ) ) || GT_32( Mult_32_32( L_shl( L_tmp1, exp2 ), L_shl( avrg_h, exp1 ) ), Mult_32_32( L_shl( peak_h, exp2 ), L_shl( avrg_l, exp1 ) ) ) ) ) { condition3 = 1; move16(); @@ -1065,7 +982,7 @@ Word16 mdct_classifier_ivas_fx( test(); test(); - IF( ( EQ_16( hTcxEnc->clas_final_old, HQ_CORE ) || EQ_16( hTcxEnc->clas_final_old, TCX_20_CORE ) ) && ( ( GT_32( hTcxEnc->last_gain1, L_shr( gain1_tmp, 1 ) ) && LT_32( hTcxEnc->last_gain1, L_shl_o( gain1_tmp, 1, &Overflow ) ) ) && ( GT_32( hTcxEnc->last_gain2, L_shr( gain2_tmp, 1 ) ) && LT_32( hTcxEnc->last_gain2, L_shl_o( gain2_tmp, 1, &Overflow ) ) ) ) ) + IF( ( EQ_16( hTcxEnc->clas_final_old, HQ_CORE ) || EQ_16( hTcxEnc->clas_final_old, TCX_20_CORE ) ) && ( ( GT_32( hTcxEnc->last_gain1, L_shr( gain1_tmp, 1 ) ) && LT_32( hTcxEnc->last_gain1, L_shl_sat( gain1_tmp, 1 ) ) ) && ( GT_32( hTcxEnc->last_gain2, L_shr( gain2_tmp, 1 ) ) && LT_32( hTcxEnc->last_gain2, L_shl_sat( gain2_tmp, 1 ) ) ) ) ) { clas_final = hTcxEnc->clas_final_old; move16(); diff --git a/lib_enc/mdct_selector_fx.c b/lib_enc/mdct_selector_fx.c index c4cc7d0db8bcca97c26af11090363cbb12dfc166..bc502d49fe69a6ca5f7d5ec25f64af4c7795a54e 100644 --- a/lib_enc/mdct_selector_fx.c +++ b/lib_enc/mdct_selector_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -315,11 +315,11 @@ void MDCT_selector_fx( test(); prefer_hq_core = ( LT_16( sub( Etot, sp_floor ), sig_lo_level_thr ) ) || /* noise floor is very high */ ( LT_16( cor_map_sum, cor_thr2 ) && LT_16( frame_voicing, voicing_thr2 ) && LT_16( sparseness, sparseness_thr2 ) ) || /* too weak tonal components */ - ( EQ_16( st->mdct_sw_enable, MODE1 ) && prefer_tcx == 0 && EQ_16( st->transientDetection.transientDetector.bIsAttackPresent, 1 ) ); + ( EQ_16( st->mdct_sw_enable, MODE1 ) && prefer_tcx == 0 && EQ_16( st->hTranDet->transientDetector.bIsAttackPresent, 1 ) ); /* Prefer HQ_CORE on transients */ test(); - IF( EQ_16( st->mdct_sw_enable, MODE2 ) && EQ_16( st->transientDetection.transientDetector.bIsAttackPresent, 1 ) ) + IF( EQ_16( st->mdct_sw_enable, MODE2 ) && EQ_16( st->hTranDet->transientDetector.bIsAttackPresent, 1 ) ) { prefer_tcx = 0; move16(); diff --git a/lib_enc/mslvq_enc_fx.c b/lib_enc/mslvq_enc_fx.c index af5a82b69edc9c96987d221c032b1aa30450ca50..0b2f9703d221bbf631f285d7c1d7b1ced2c959fd 100644 --- a/lib_enc/mslvq_enc_fx.c +++ b/lib_enc/mslvq_enc_fx.c @@ -1,9 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ +#include +#include "options.h" /* Compilation switches */ #include "cnst.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "stl.h" #include "prot_fx.h" /* Function prototypes */ @@ -244,14 +245,14 @@ Word32 mslvq_cng_ivas_fx( /* for CNG there is only one bitrate but several lattice quantizer structures, depending on the previous VQ stage */ - mode_glb = add( START_CNG, idx_cv ); + mode_glb = add( START_CNG_IVAS, idx_cv ); move16(); p_sigma = sigma_MSLVQ_fx[mode]; // x2.56 move16(); p_inv_sigma = inv_sigma_MSLVQ_fx[mode]; // Q15 move16(); - p_scales = scales_fx[mode_glb]; // Q11 + p_scales = scales_ivas_fx[mode_glb]; // Q11 move16(); no_scales[0] = 0; @@ -1221,10 +1222,10 @@ Word32 mslvq_ivas_16( } ELSE { - p_sigma = sigma_p_fx[mode]; + p_sigma = sigma_p_ivas_fx[mode]; /* inverse sigma is precomputed to save complexity */ - p_inv_sigma = inv_sigma_p_fx[mode]; + p_inv_sigma = inv_sigma_p_ivas_fx[mode]; p_scales = scales_p_ivas_fx[mode_glb]; diff --git a/lib_enc/multi_harm_fx.c b/lib_enc/multi_harm_fx.c index 1bae597b6892428a06b6c83e1b0de38121329432..76b465777b13d649fd7d2be99e7eb48933a1085b 100644 --- a/lib_enc/multi_harm_fx.c +++ b/lib_enc/multi_harm_fx.c @@ -1,10 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" @@ -20,19 +20,21 @@ * Perform multi-harmonic analysis, information used for UV and VAD decision *---------------------------------------------------------------------*/ -Word16 multi_harm_fx( /* o : frame multi-harmonicity (1-harmonic, 0-not) */ - const Word16 Bin_E[], /* i : log-energy spectrum of the current frame Q7 */ - Word16 old_S[], /* i/o: prev. log-energy spectrum w. subtracted floor Q7 */ - Word16 cor_map_LT[], /* i/o: LT correlation map Q15 */ - Word16 *multi_harm_limit, /* i/o: multi harminic threshold Q9 */ - const Word32 total_brate, /* i : total bitrate Q0 */ - const Word16 bwidth, /* i : input signal bandwidth Q0 */ - Word16 *cor_strong_limit, /* i/o: HF correlation indicator Q0 */ - Word16 *st_mean_avr_dyn, /* i/o: long term average dynamic Q7 */ - Word16 *st_last_sw_dyn, /* i/o: last dynamic Q7 */ - Word16 *cor_map_sum, /* i : sum of correlation map Q8 */ - Word16 *sp_floor, /* o: noise floor estimate Q7 */ - Word16 S_map[] /* o : short-term correlation map Q7 */ +/* o : frame multi-harmonicity (1-harmonic, 0-not) */ +Word16 multi_harm_fx( + + const Word16 Bin_E[], /* i : log-energy spectrum of the current frame Q7 */ + Word16 old_S[], /* i/o: prev. log-energy spectrum w. subtracted floor Q7 */ + Word16 cor_map_LT[], /* i/o: LT correlation map Q15 */ + Word16 *multi_harm_limit, /* i/o: multi harminic threshold Q9 */ + const Word32 total_brate, /* i : total bitrate Q0 */ + const Word16 bwidth, /* i : input signal bandwidth Q0 */ + Word16 *cor_strong_limit, /* i/o: HF correlation indicator Q0 */ + Word16 *st_mean_avr_dyn, /* i/o: long term average dynamic Q7 */ + Word16 *st_last_sw_dyn, /* i/o: last dynamic Q7 */ + Word16 *cor_map_sum, /* i : sum of correlation map Q8 */ + Word16 *sp_floor, /* o: noise floor estimate Q7 */ + Word16 S_map[] /* o : short-term correlation map Q7 */ ) { Word16 i, j, k, L, stemp, N_mins, ind_mins[L_FFT / 4], *pt_mins, harm; @@ -41,10 +43,6 @@ Word16 multi_harm_fx( /* o : frame multi-harmonicity Word32 L_acc; Word32 Lcorx2, Lcory2, Lcorxy, Lcor_map_LT_sum; Word16 mean_dyn; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*------------------------------------------------------------------* * initialization @@ -212,7 +210,7 @@ Word16 multi_harm_fx( /* o : frame multi-harmonicity IF( EQ_16( i, ind_mins[k] ) ) { /* include the last peak point (new minimum) to the corr. sum */ - Lcory2 = L_mac_o( Lcory2, old_S[i], old_S[i], &Overflow ); + Lcory2 = L_mac_sat( Lcory2, old_S[i], old_S[i] ); /* calculation of the norm. peak correlation */ test(); @@ -238,7 +236,7 @@ Word16 multi_harm_fx( /* o : frame multi-harmonicity corxy = shl( corxy, cor ); /* cor = corxy * corxy / (corx2 * cory2) */ corxy = div_s( corxy, corx2 ); - cor = shr_o( corxy, sub( shl( tmp16, 1 ), Expx2 ), &Overflow ); /* Q15 */ + cor = shr_sat( corxy, sub( shl( tmp16, 1 ), Expx2 ) ); /* Q15 */ } ELSE { @@ -263,9 +261,9 @@ Word16 multi_harm_fx( /* o : frame multi-harmonicity k++; } - Lcorx2 = L_mac_o( Lcorx2, S[i], S[i], &Overflow ); - Lcory2 = L_mac_o( Lcory2, old_S[i], old_S[i], &Overflow ); - Lcorxy = L_mac_o( Lcorxy, S[i], old_S[i], &Overflow ); + Lcorx2 = L_mac_sat( Lcorx2, S[i], S[i] ); + Lcory2 = L_mac_sat( Lcory2, old_S[i], old_S[i] ); + Lcorxy = L_mac_sat( Lcorxy, S[i], old_S[i] ); } Copy( S, old_S, ind_mins[0] ); @@ -362,19 +360,21 @@ Word16 multi_harm_fx( /* o : frame multi-harmonicity return harm; } -Word16 multi_harm_ivas_fx( /* o : frame multi-harmonicity (1-harmonic, 0-not) */ - const Word16 Bin_E[], /* i : log-energy spectrum of the current frame Q7 */ - Word16 old_S[], /* i/o: prev. log-energy spectrum w. subtracted floor Q7 */ - Word16 cor_map_LT[], /* i/o: LT correlation map Q15 */ - Word16 *multi_harm_limit, /* i/o: multi harminic threshold Q9 */ - const Word32 total_brate, /* i : total bitrate Q0 */ - const Word16 bwidth, /* i : input signal bandwidth Q0 */ - Word16 *cor_strong_limit, /* i/o: HF correlation indicator Q0 */ - Word16 *st_mean_avr_dyn, /* i/o: long term average dynamic Q7 */ - Word16 *st_last_sw_dyn, /* i/o: last dynamic Q7 */ - Word16 *cor_map_sum, /* i : sum of correlation map Q8 */ - Word16 *sp_floor, /* o: noise floor estimate Q7 */ - Word16 S_map[] /* o : short-term correlation map Q7 */ + +/* o : frame multi-harmonicity (1-harmonic, 0-not) */ +Word16 multi_harm_ivas_fx( + const Word16 Bin_E[], /* i : log-energy spectrum of the current frame Q7 */ + Word16 old_S[], /* i/o: prev. log-energy spectrum w. subtracted floor Q7 */ + Word16 cor_map_LT[], /* i/o: LT correlation map Q15 */ + Word16 *multi_harm_limit, /* i/o: multi harminic threshold Q9 */ + const Word32 total_brate, /* i : total bitrate Q0 */ + const Word16 bwidth, /* i : input signal bandwidth Q0 */ + Word16 *cor_strong_limit, /* i/o: HF correlation indicator Q0 */ + Word16 *st_mean_avr_dyn, /* i/o: long term average dynamic Q7 */ + Word16 *st_last_sw_dyn, /* i/o: last dynamic Q7 */ + Word16 *cor_map_sum, /* i : sum of correlation map Q8 */ + Word16 *sp_floor, /* o: noise floor estimate Q7 */ + Word16 S_map[] /* o : short-term correlation map Q7 */ ) { Word16 i, j, k, L, stemp, N_mins, ind_mins[L_FFT / 4], *pt_mins, harm; @@ -384,10 +384,6 @@ Word16 multi_harm_ivas_fx( /* o : frame multi-harmoni Word32 L_acc; Word32 Lcorx2, Lcory2, Lcorxy, Lcor_map_LT_sum; Word16 mean_dyn; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*------------------------------------------------------------------* * initialization @@ -549,7 +545,7 @@ Word16 multi_harm_ivas_fx( /* o : frame multi-harmoni IF( EQ_16( i, ind_mins[k] ) ) { /* include the last peak point (new minimum) to the corr. sum */ - Lcory2 = L_mac_o( Lcory2, old_S[i], old_S[i], &Overflow ); + Lcory2 = L_mac_sat( Lcory2, old_S[i], old_S[i] ); /* calculation of the norm. peak correlation */ test(); @@ -575,7 +571,7 @@ Word16 multi_harm_ivas_fx( /* o : frame multi-harmoni corxy = shl( corxy, cor ); /* cor = corxy * corxy / (corx2 * cory2) */ corxy = div_s( corxy, corx2 ); - cor = shr_o( corxy, sub( shl( tmp16, 1 ), Expx2 ), &Overflow ); /* Q15 */ + cor = shr_sat( corxy, sub( shl( tmp16, 1 ), Expx2 ) ); /* Q15 */ } ELSE { @@ -600,9 +596,9 @@ Word16 multi_harm_ivas_fx( /* o : frame multi-harmoni k++; } - Lcorx2 = L_mac_o( Lcorx2, S[i], S[i], &Overflow ); - Lcory2 = L_mac_o( Lcory2, old_S[i], old_S[i], &Overflow ); - Lcorxy = L_mac_o( Lcorxy, S[i], old_S[i], &Overflow ); + Lcorx2 = L_mac_sat( Lcorx2, S[i], S[i] ); + Lcory2 = L_mac_sat( Lcory2, old_S[i], old_S[i] ); + Lcorxy = L_mac_sat( Lcorxy, S[i], old_S[i] ); } Copy( S, old_S, ind_mins[0] ); diff --git a/lib_enc/nelp_enc_fx.c b/lib_enc/nelp_enc_fx.c index a7588283a503b6da73f49adf95eccb3ac0473ace..9122be431e58c675afd23259c8c2f78f30d5892e 100644 --- a/lib_enc/nelp_enc_fx.c +++ b/lib_enc/nelp_enc_fx.c @@ -354,10 +354,6 @@ void nelp_encoder_fx( move32(); Word16 BP1_ORDER; Word16 rf_flag; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; RF_ENC_HANDLE hRF = st_fx->hRF; @@ -422,11 +418,10 @@ void nelp_encoder_fx( E1_fx = L_deposit_l( 0 ); FOR( i = 0; i < L_FRAME; i++ ) { - E1_fx = L_mac0_o( E1_fx, in_fx[i], in_fx[i], &Overflow ); /*Q(qE1+qE1) */ + E1_fx = L_mac0_sat( E1_fx, in_fx[i], in_fx[i] ); /*Q(qE1+qE1) */ } qE1 = shl( qE1, 1 ); - ; qf = qIn; move16(); @@ -438,7 +433,7 @@ void nelp_encoder_fx( EL1_fx = L_deposit_l( 0 ); FOR( i = 0; i < L_FRAME; i++ ) { - EL1_fx = L_mac0_o( EL1_fx, filtRes_fx[i], filtRes_fx[i], &Overflow ); /*Q(2*qIn) */ + EL1_fx = L_mac0_sat( EL1_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qIn) */ } qEL1 = shl( qEL1, 1 ); @@ -454,7 +449,7 @@ void nelp_encoder_fx( EH1_fx = L_deposit_l( 0 ); FOR( i = 0; i < L_FRAME; i++ ) { - EH1_fx = L_mac0_o( EH1_fx, filtRes_fx[i], filtRes_fx[i], &Overflow ); /*Q(2*qEH1) */ + EH1_fx = L_mac0_sat( EH1_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEH1) */ } qEH1 = 2 * qEH1; move16(); @@ -470,7 +465,7 @@ void nelp_encoder_fx( Ltemp = L_deposit_l( 0 ); FOR( j = (Word16) ( i * lag ); j < (Word16) ( ( i + 1 ) * lag ); j++ ) { - Ltemp = L_mac0_o( Ltemp, in_fx[j], in_fx[j], &Overflow ); /*Q(2*qGain) */ + Ltemp = L_mac0_sat( Ltemp, in_fx[j], in_fx[j] ); /*Q(2*qGain) */ } /*Gains[i] = (float) sqrt(Gains[i]/lag); */ @@ -494,7 +489,7 @@ void nelp_encoder_fx( Ltemp = L_deposit_l( 0 ); FOR( j = (Word16) ( i * lag ); j < L_FRAME; j++ ) { - Ltemp = L_mac0_o( Ltemp, in_fx[j], in_fx[j], &Overflow ); /*Q(2*qGain) */ + Ltemp = L_mac0_sat( Ltemp, in_fx[j], in_fx[j] ); /*Q(2*qGain) */ } /*Gains[i] = (float) sqrt(Gains[i]/(L_FRAME-(lag*i))); */ @@ -698,9 +693,9 @@ void nelp_encoder_fx( } ELSE { - push_indice_fx( hBstr, IND_IG1, iG1_fx, 5 ); - push_indice_fx( hBstr, IND_IG2A, iG2_fx[0], 6 ); - push_indice_fx( hBstr, IND_IG2B, iG2_fx[1], 6 ); + push_indice( hBstr, IND_IG1, iG1_fx, 5 ); + push_indice( hBstr, IND_IG2A, iG2_fx[0], 6 ); + push_indice( hBstr, IND_IG2B, iG2_fx[1], 6 ); } test(); @@ -1019,7 +1014,7 @@ void nelp_encoder_fx( } ELSE { - push_indice_fx( hBstr, IND_NELP_FID, fid, 2 ); + push_indice( hBstr, IND_NELP_FID, fid, 2 ); } } @@ -1099,10 +1094,6 @@ void nelp_encoder_ivas_fx( move32(); Word16 BP1_ORDER; Word16 rf_flag; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; RF_ENC_HANDLE hRF = st_fx->hRF; @@ -1169,7 +1160,7 @@ void nelp_encoder_ivas_fx( E1_fx = L_deposit_l( 0 ); FOR( i = 0; i < L_FRAME; i++ ) { - E1_fx = L_mac0_o( E1_fx, in_fx[i], in_fx[i], &Overflow ); /*Q(qE1+qE1) */ + E1_fx = L_mac0_sat( E1_fx, in_fx[i], in_fx[i] ); /*Q(qE1+qE1) */ } qE1 = shl( qE1, 1 ); @@ -1184,7 +1175,7 @@ void nelp_encoder_ivas_fx( EL1_fx = L_deposit_l( 0 ); FOR( i = 0; i < L_FRAME; i++ ) { - EL1_fx = L_mac0_o( EL1_fx, filtRes_fx[i], filtRes_fx[i], &Overflow ); /*Q(2*qIn) */ + EL1_fx = L_mac0_sat( EL1_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qIn) */ } qEL1 = shl( qEL1, 1 ); @@ -1200,7 +1191,7 @@ void nelp_encoder_ivas_fx( EH1_fx = L_deposit_l( 0 ); FOR( i = 0; i < L_FRAME; i++ ) { - EH1_fx = L_mac0_o( EH1_fx, filtRes_fx[i], filtRes_fx[i], &Overflow ); /*Q(2*qEH1) */ + EH1_fx = L_mac0_sat( EH1_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEH1) */ } qEH1 = shl( qEH1, 1 ); move16(); @@ -1215,7 +1206,7 @@ void nelp_encoder_ivas_fx( Ltemp = L_deposit_l( 0 ); FOR( j = (Word16) ( i * lag ); j < (Word16) ( ( i + 1 ) * lag ); j++ ) { - Ltemp = L_mac0_o( Ltemp, in_fx[j], in_fx[j], &Overflow ); /*Q(2*qGain) */ + Ltemp = L_mac0_sat( Ltemp, in_fx[j], in_fx[j] ); /*Q(2*qGain) */ } /*Gains[i] = (float) sqrt(Gains[i]/lag); */ @@ -1239,7 +1230,7 @@ void nelp_encoder_ivas_fx( Ltemp = L_deposit_l( 0 ); FOR( j = i_mult( i, lag ); j < L_FRAME; j++ ) { - Ltemp = L_mac0_o( Ltemp, in_fx[j], in_fx[j], &Overflow ); /*Q(2*qGain) */ + Ltemp = L_mac0_sat( Ltemp, in_fx[j], in_fx[j] ); /*Q(2*qGain) */ } /*Gains[i] = (float) sqrt(Gains[i]/(L_FRAME-(lag*i))); */ diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index 0851e4c1745ea0f780cac567fafdf0f63564bcd9..41078054cea37891352a3551c8538cc8db507a13 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -75,6 +75,20 @@ Word16 noise_est_AR1_Qx( /* o : Qx y(n) */ return mac_r( L_mult( y, alpham1 ), x, alpha ); } +Word32 noise_est_AR1_Qx_32( /* o : Qx y(n) */ + Word32 x, /* i : Qx x(n) */ + Word32 y, /* i : Qx y(n-1) */ + Word32 alpha /*i : Q15 scaling of driving x(n) */ +) +{ + Word32 alpham1; + /*alpham1 = negate(add((Word16)-32768, alpha)); */ + alpham1 = L_sub( MAX_32, alpha ); /* one cycle less */ + alpham1++; + + return Madd_32_32( Mpy_32_32( y, alpham1 ), x, alpha ); +} + /*-----------------------------------------------------------------* * noise_est_ln_q8_fx() * @@ -88,12 +102,8 @@ static Word16 noise_est_ln_q8_fx( { Word16 e_ener, f_ener; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - L_tmp = L_add_o( L_enr, L_shl( (Word32) 1L, q_new_plus_q_scale ), &Overflow ); /* +1.0f */ + L_tmp = L_add_sat( L_enr, L_shl( (Word32) 1L, q_new_plus_q_scale ) ); /* +1.0f */ if ( flag_add1p0 == 0 ) { L_tmp = L_add( L_enr, 0 ); /* +0 , no offset */ @@ -105,9 +115,11 @@ static Word16 noise_est_ln_q8_fx( f_ener = Log2_norm_lc( L_shl( L_tmp, e_ener ) ); e_ener = sub( sub( 30, e_ener ), q_new_plus_q_scale ); L_tmp = Mpy_32_16( e_ener, f_ener, 22713 ); /* Q16 (22713 = Ln(2) in Q15)*/ - return round_fx( L_shl( L_tmp, 8 ) ); /* Q8 */ + + return round_fx( L_shl( L_tmp, 8 ) ); /* Q8 */ } + /*-----------------------------------------------------------------* * eps_quota_fx() * @@ -280,7 +292,7 @@ void noise_est_init_ivas_fx( move32(); /*Q7//E_MIN; */ hNoiseEst->enrO_fx[i] = E_MIN_Q11_FX; move32(); - hNoiseEst->bckr_fx[i] = E_MIN_Q11_FX; + hNoiseEst->bckr_fx[i] = E_MIN_Q27_FX; move32(); hNoiseEst->ave_enr_fx[i] = E_MIN_Q11_FX; move32(); @@ -289,14 +301,14 @@ void noise_est_init_ivas_fx( move16(); /*1e-5f; */ hNoiseEst->q_enrO = Q11; move16(); - hNoiseEst->q_bckr = Q11; + hNoiseEst->q_bckr = Q27; move16(); hNoiseEst->ave_enr_q = Q11; move16(); move16(); - hNoiseEst->totalNoise_fx = 0; - move16(); + hNoiseEst->totalNoise_32fx = 0; + move32(); hNoiseEst->first_noise_updt = 0; move16(); hNoiseEst->first_noise_updt_cnt = 0; @@ -358,18 +370,18 @@ void noise_est_init_ivas_fx( move16(); hNoiseEst->Etot_lp_fx = 0; hNoiseEst->Etot_h_fx = 0; - hNoiseEst->Etot_l_fx = 0; - hNoiseEst->Etot_l_lp_fx = 0; - hNoiseEst->Etot_last_fx = 0; - hNoiseEst->Etot_v_h2_fx = 0; + hNoiseEst->Etot_l_32fx = 0; + hNoiseEst->Etot_l_lp_32fx = 0; + hNoiseEst->Etot_last_32fx = 0; + hNoiseEst->Etot_v_h2_32fx = 0; hNoiseEst->sign_dyn_lp_fx = 0; move16(); move16(); + move32(); move16(); - move16(); - move16(); - move16(); - move16(); + move32(); + move32(); + move32(); return; } @@ -510,12 +522,12 @@ void noise_est_pre_32fx( move32(); Etot_l_32fx = Etot; move32(); - hNoiseEst->Etot_l_lp_fx = extract_h( Etot ); // Q8 - move16(); - hNoiseEst->Etot_last_fx = extract_h( Etot ); // Q8 - move16(); - hNoiseEst->Etot_v_h2_fx = 0; - move16(); + hNoiseEst->Etot_l_lp_32fx = Etot; // Q24 + move32(); + hNoiseEst->Etot_last_32fx = Etot; // Q24 + move32(); + hNoiseEst->Etot_v_h2_32fx = 0; + move32(); Etot_lp_32fx = Etot; move32(); hNoiseEst->sign_dyn_lp_fx = 0; @@ -528,7 +540,7 @@ void noise_est_pre_32fx( Etot_h_32fx = L_sub( L_deposit_h( hNoiseEst->Etot_h_fx ), 671089 ); /* 671089=0.04 in Q24 */ Etot_h_32fx = L_max( Etot_h_32fx, Etot ); - Etot_l_32fx = L_add( L_deposit_h( hNoiseEst->Etot_l_fx ), 1342177 ); /* 1342177 = .08 in Q24 */ + Etot_l_32fx = L_add( hNoiseEst->Etot_l_32fx, 1342177 ); /* 1342177 = .08 in Q24 */ /* Could even be higher but it also delays first entry to DTX */ IF( GT_16( hNoiseEst->harm_cor_cnt, HE_LT_CNT_PRE_FX ) ) @@ -538,20 +550,20 @@ void noise_est_pre_32fx( ) { /* *Etot_l += min(2,(*Etot_last-*Etot_l)*0.1f); */ - tmp = Mpy_32_32( L_sub( L_deposit_h( hNoiseEst->Etot_last_fx ), Etot_l_32fx ), 214748365 ); /* 0.1f factor in Q31 */ - tmp = L_min( 33554432, tmp ); /* 2.0 in Q24 is 33554432 */ - Etot_l_32fx = L_add( Etot_l_32fx, tmp ); /* Q24 */ + tmp = Mpy_32_32( L_sub( ( hNoiseEst->Etot_last_32fx ), Etot_l_32fx ), 214748365 ); /* 0.1f factor in Q31 */ + tmp = L_min( 33554432, tmp ); /* 2.0 in Q24 is 33554432 */ + Etot_l_32fx = L_add( Etot_l_32fx, tmp ); /* Q24 */ } /* Avoids large steps in short active segments */ test(); - IF( ( GT_32( L_sub( L_deposit_h( hNoiseEst->Etot_last_fx ), Etot_l_32fx ), 503316480 ) ) /* 30.0f*Q24 */ + IF( ( GT_32( L_sub( hNoiseEst->Etot_last_32fx, Etot_l_32fx ), 503316480 ) ) /* 30.0f*Q24 */ && ( GT_16( hNoiseEst->harm_cor_cnt, HE_LT_CNT_PRE_SHORT_FX ) ) ) { /* *Etot_l += (*Etot_last-*Etot_l)*0.02f; */ - Etot_l_32fx = L_add( Etot_l_32fx, Mpy_32_32( L_sub( L_deposit_h( hNoiseEst->Etot_last_fx ), Etot_l_32fx ), 42949673 ) ); /* 0.02 in Q24*/ + Etot_l_32fx = L_add( Etot_l_32fx, Mpy_32_32( L_sub( hNoiseEst->Etot_last_32fx, Etot_l_32fx ), 42949673 ) ); /* 0.02 in Q24*/ } - ELSE IF( GT_32( L_sub( L_deposit_h( hNoiseEst->Etot_last_fx ), Etot_l_32fx ), 167772160 ) ) /* 10.0 in Q24*/ + ELSE IF( GT_32( L_sub( hNoiseEst->Etot_last_32fx, Etot_l_32fx ), 167772160 ) ) /* 10.0 in Q24*/ { Etot_l_32fx = L_add( Etot_l_32fx, 1342177 ); /* 0.08 in Q24*/ } @@ -560,10 +572,10 @@ void noise_est_pre_32fx( Etot_l_32fx = L_min( Etot_l_32fx, Etot ); // Q24 test(); - IF( LT_16( ini_frame_fx, 100 ) && LT_32( Etot_l_32fx, L_deposit_h( hNoiseEst->Etot_l_lp_fx ) ) ) + IF( LT_16( ini_frame_fx, 100 ) && LT_32( Etot_l_32fx, ( hNoiseEst->Etot_l_lp_32fx ) ) ) { /**Etot_l_lp = 0.1f * *Etot_l + (1.0f - 0.1) * *Etot_l_lp; */ - hNoiseEst->Etot_l_lp_fx = extract_h( L_add( Mpy_32_32( 214748364 /* 0.1f in Q31*/, Etot_l_32fx ), Mpy_32_32( 1932735283 /* 0.9f in Q31*/, L_deposit_h( hNoiseEst->Etot_l_lp_fx ) ) ) ); // Q8 + hNoiseEst->Etot_l_lp_32fx = W_round64_L( W_add( W_mult_32_32( 214748364 /* 0.1f in Q31*/, Etot_l_32fx ), W_mult_32_32( 1932735283 /* 0.9f in Q31*/, hNoiseEst->Etot_l_lp_32fx ) ) ); // Q8 move16(); } ELSE @@ -572,16 +584,16 @@ void noise_est_pre_32fx( test(); test(); test(); - IF( ( ( GT_16( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) ) && ( GT_32( L_sub_sat( L_deposit_h( hNoiseEst->Etot_last_fx ), Etot_l_32fx ), HE_LT_THR2_Q24 ) ) ) || ( ( sub( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) > 0 ) && ( LT_16( ini_frame_fx, HE_LT_CNT_INIT_FX ) ) ) || ( GT_32( L_sub_sat( L_deposit_h( hNoiseEst->Etot_l_lp_fx ), Etot_l_32fx ), HE_LT_THR2_Q24 ) ) ) + IF( ( ( GT_16( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) ) && ( GT_32( L_sub_sat( hNoiseEst->Etot_last_32fx, Etot_l_32fx ), HE_LT_THR2_Q24 ) ) ) || ( ( sub( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) > 0 ) && ( LT_16( ini_frame_fx, HE_LT_CNT_INIT_FX ) ) ) || ( GT_32( L_sub_sat( hNoiseEst->Etot_l_lp_32fx, Etot_l_32fx ), HE_LT_THR2_Q24 ) ) ) { /**Etot_l_lp = 0.03f * *Etot_l + (1.0f - 0.03f) * *Etot_l_lp; */ - hNoiseEst->Etot_l_lp_fx = extract_h( L_add( Mpy_32_32( 64424509 /* 0.03f in Q31*/, Etot_l_32fx ), Mpy_32_32( 2083059139 /* 0.97f in Q31*/, L_deposit_h( hNoiseEst->Etot_l_lp_fx ) ) ) ); // Q8 + hNoiseEst->Etot_l_lp_32fx = W_extract_h( W_add( W_mult_32_32( 64424509 /* 0.03f in Q31*/, Etot_l_32fx ), W_mult_32_32( 2083059139 /* 0.97f in Q31*/, hNoiseEst->Etot_l_lp_32fx ) ) ); // Q24 move16(); } ELSE { /* *Etot_l_lp = 0.02f * *Etot_l + (1.0f - 0.02f) * *Etot_l_lp; */ - hNoiseEst->Etot_l_lp_fx = extract_h( L_add( Mpy_32_32( 42949673 /* 0.02f in Q31*/, Etot_l_32fx ), Mpy_32_32( 2104533975 /* 0.98f in Q31*/, L_deposit_h( hNoiseEst->Etot_l_lp_fx ) ) ) ); // Q8 + hNoiseEst->Etot_l_lp_32fx = W_extract_h( W_add( W_mult_32_32( 42949673 /* 0.02f in Q31*/, Etot_l_32fx ), W_mult_32_32( 2104533975 /* 0.98f in Q31*/, hNoiseEst->Etot_l_lp_32fx ) ) ); // Q24 move16(); } } @@ -590,10 +602,10 @@ void noise_est_pre_32fx( move16(); } - hNoiseEst->Etot_l_fx = extract_h( Etot_l_32fx ); // Q8 + hNoiseEst->Etot_l_32fx = Etot_l_32fx; // Q24 hNoiseEst->Etot_h_fx = extract_h( Etot_h_32fx ); // Q8 hNoiseEst->Etot_lp_fx = extract_h( Etot_lp_32fx ); // Q8 - move16(); + move32(); move16(); move16(); @@ -650,9 +662,6 @@ void noise_est_down_fx( Word16 scale; Word32 totalNoise_temp; Word32 L_Etot, L_Etot_last, L_Etot_v_h2, L_Etot_v; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif L_Etot = L_shl( Etot, 16 ); /*Q24 for later AR1 computations*/ L_Etot_last = L_shl( *Etot_last, 16 ); @@ -667,11 +676,9 @@ void noise_est_down_fx( totalNoise_temp = L_deposit_l( 0 ); FOR( i = min_band; i <= max_band; i++ ) { - totalNoise_temp = L_add_o( totalNoise_temp, bckr[i], &Overflow ); /*Q_new+QSCALE*/ + totalNoise_temp = L_add_sat( totalNoise_temp, bckr[i] ); /*Q_new+QSCALE*/ } totalNoise_temp = L_max( totalNoise_temp, L_shl( e_min, 4 ) ); - - totalNoise_temp = L_max( totalNoise_temp, (Word32) 1L ); /* make sure log2_norm_lc does not cause table reading out of bounds */ /*totalNoise = 10.0f * (float)log10( *totalNoise );*/ @@ -691,7 +698,7 @@ void noise_est_down_fx( FOR( i = 0; i < NB_BANDS; i++ ) { - Ltmp = L_add_o( L_shr_r( *pt1, 1 ), L_shr_r( *pt2, 1 ), &Overflow ); + Ltmp = L_add_sat( L_shr_r( *pt1, 1 ), L_shr_r( *pt2, 1 ) ); /*Ltmp = L_shr_r(L_add(*pt1,*pt2),1);*/ enr[i] = Ltmp; move32(); /*Q_new+QSCALE*/ @@ -740,14 +747,17 @@ void noise_est_down_ivas_fx( const Word32 fr_bands[], /* i : per band input energy (contains 2 vectors) q_fr_bands */ const Word16 q_fr_bands, /* i : Q of fr_bands */ Word32 bckr[], /* i/o: per band background noise energy estimate q_fr_bands */ - Word32 tmpN[], /* o : temporary noise update q_fr_bands */ - Word32 enr[], /* o : averaged energy over both subframes */ - const Word16 min_band, /* i : minimum critical band */ - const Word16 max_band, /* i : maximum critical band */ - Word16 *totalNoise, /* o : noise estimate over all critical bands */ - Word16 Etot, /* i : Energy of current frame */ - Word16 *Etot_last, /* i/o: Energy of last frame Q8 */ - Word16 *Etot_v_h2 /* i/o: Energy variations of noise frames Q8 */ + Word16 *q_bckr, + Word32 tmpN[], /* o : temporary noise update q_fr_bands */ + Word16 *q_tmpN, + Word32 enr[], /* o : averaged energy over both subframes */ + Word16 *q_enr, + const Word16 min_band, /* i : minimum critical band */ + const Word16 max_band, /* i : maximum critical band */ + Word32 *totalNoise, /* o : noise estimate over all critical bands */ + Word32 Etot, /* i : Energy of current frame Q24*/ + Word32 *Etot_last, /* i/o: Energy of last frame Q24 */ + Word32 *Etot_v_h2 /* i/o: Energy variations of noise frames Q24 */ ) { @@ -755,17 +765,22 @@ void noise_est_down_ivas_fx( const Word32 *pt1, *pt2; Word16 i; Word16 e_Noise, f_Noise; - Word32 e_min; Word32 totalNoise_temp; Word32 L_Etot, L_Etot_last, L_Etot_v_h2, L_Etot_v; Word64 sum; Word16 q_sum; + Word32 enr32[NB_BANDS], bckr32[NB_BANDS], tmpN32[NB_BANDS]; + Word16 enr_q[NB_BANDS], bckr_q[NB_BANDS], tmpN_q[NB_BANDS]; + Word16 shift, shift1, shift2, shift3; + Word64 tmpN64, tmp, enr64; - e_min = L_shl( E_MIN_FXQ31, sub( q_fr_bands, Q31 ) ); // q_fr_bands + Copy32( bckr, bckr32, NB_BANDS ); + set16_fx( bckr_q, *q_bckr, NB_BANDS ); - L_Etot = L_shl( Etot, 16 ); /*Q24 for later AR1 computations*/ - L_Etot_last = L_shl( *Etot_last, 16 ); - L_Etot_v_h2 = L_shl( *Etot_v_h2, 16 ); + L_Etot = Etot; /*Q24 for later AR1 computations*/ + move32(); + L_Etot_last = *Etot_last; + L_Etot_v_h2 = *Etot_v_h2; /*-----------------------------------------------------------------* * Estimate total noise energy @@ -778,7 +793,7 @@ void noise_est_down_ivas_fx( { sum = W_mac_32_16( sum, bckr[i], 1 ); // q_fr_bands+1 } - q_sum = add( q_fr_bands, 1 ); + q_sum = add( *q_bckr, 1 ); IF( sum == 0 ) { sum = W_mult0_32_32( E_MIN_FXQ31, add( sub( max_band, min_band ), 1 ) ); // Q31 @@ -795,8 +810,8 @@ void noise_est_down_ivas_fx( Ltmp = L_mac( L_deposit_h( e_Noise ), f_Noise, 1 ); // Q16 Ltmp = Mpy_32_16_1( Ltmp, LG10 ); // Q14 (16+13-15) Ltmp = L_shl( Ltmp, 10 ); // Q26 - *totalNoise = round_fx( Ltmp ); /*Q8*/ - move16(); + *totalNoise = ( Ltmp ); /*Q24*/ + move32(); /*-----------------------------------------------------------------* * Average energy per frame for each frequency band @@ -808,8 +823,12 @@ void noise_est_down_ivas_fx( FOR( i = 0; i < NB_BANDS; i++ ) { /* enr[i] = 0.5f * ( *pt1++ + *pt2++ ); */ - enr[i] = W_extract_h( W_mac_32_32( W_mult_32_32( *pt1, ONE_IN_Q30 ), *pt2, ONE_IN_Q30 ) ); // q_fr_bands+30+1-32+1 = q_fr_bands + enr64 = W_mac_32_32( W_mult_32_32( *pt1, ONE_IN_Q29 ), *pt2, ONE_IN_Q29 ); // q_fr_bands + 1 + Q29 + 1 (0.5 handle here) + shift = W_norm( enr64 ); + enr32[i] = W_extract_h( W_shl( enr64, shift ) ); move32(); + enr_q[i] = sub( add( q_fr_bands, shift ), 1 ); + move16(); pt1++; pt2++; } @@ -817,20 +836,66 @@ void noise_est_down_ivas_fx( /*-----------------------------------------------------------------* * Background noise energy update *-----------------------------------------------------------------*/ - FOR( i = 0; i < NB_BANDS; i++ ) { /* tmpN[i] = (1-ALPHA) * bckr[i] + ALPHA * enr[i]; */ /* handle div by zero in find_tilt_fx */ - tmpN[i] = L_max( Madd_32_16( Mpy_32_16_1( bckr[i], ALPHAM1_FX ), enr[i], ALPHA_FX ), e_min ); // q_fr_bands - move32(); - /* if( tmpN[i] < bckr[i] ) { bckr[i] = tmpN[i]; }*/ - /* Defend to increase noise estimate: keep as it is or decrease */ - bckr[i] = L_max( L_min( bckr[i], tmpN[i] ), e_min ); // q_fr_bands + tmpN64 = W_mult_32_16( bckr32[i], ALPHAM1_FX ); + tmp = W_mult_32_16( enr32[i], ALPHA_FX ); + + shift = s_min( bckr_q[i], enr_q[i] ); + tmpN64 = W_add( W_shl( tmpN64, sub( shift, bckr_q[i] ) ), W_shl( tmp, sub( shift, enr_q[i] ) ) ); // shift + q16 + shift1 = W_norm( tmpN64 ); + tmpN32[i] = W_extract_h( W_shl( tmpN64, shift1 ) ); // shift + q16 + shift1 - 32 move32(); + tmpN_q[i] = sub( add( add( Q16, shift ), shift1 ), 32 ); + move16(); + + IF( GT_32( E_MIN_FXQ31, L_shl_sat( tmpN32[i], sub( 31, tmpN_q[i] ) ) ) ) + { + tmpN32[i] = E_MIN_FXQ31; + tmpN_q[i] = 31; + move32(); + move16(); + } + + IF( GT_32( bckr32[i], L_shl_sat( tmpN32[i], sub( bckr_q[i], tmpN_q[i] ) ) ) ) + { + bckr32[i] = tmpN32[i]; /* Defend to increase noise estimate: keep as it is or decrease */ + bckr_q[i] = tmpN_q[i]; + move32(); + move16(); + } } + /* Scaling to common Q*/ + shift1 = bckr_q[0], shift2 = enr_q[0], shift3 = tmpN_q[0]; + move16(); + move16(); + move16(); + + FOR( i = 1; i < NB_BANDS; i++ ) + { + shift1 = s_min( shift1, bckr_q[i] ); + shift2 = s_min( shift2, enr_q[i] ); + shift3 = s_min( shift3, tmpN_q[i] ); + } + FOR( i = 0; i < NB_BANDS; i++ ) + { + bckr[i] = L_shl( bckr32[i], sub( shift1, bckr_q[i] ) ); + enr[i] = L_shl( enr32[i], sub( shift2, enr_q[i] ) ); + tmpN[i] = L_shl( tmpN32[i], sub( shift3, tmpN_q[i] ) ); + move32(); + move32(); + move32(); + } + *q_bckr = shift1; + *q_enr = shift2; + *q_tmpN = shift3; + move16(); + move16(); + move16(); /*------------------------------------------------------------------* * Energy variation update *------------------------------------------------------------------*/ @@ -843,7 +908,7 @@ void noise_est_down_ivas_fx( L_Etot_v_h2 = Madd_32_16( L_tmp, L_Etot_v_h2, 32113 /* 0.98 in Q15 */ ); // Q24 /* if (*Etot_v_h2 < 0.1f) { *Etot_v_h2 = 0.1f; } */ - *Etot_v_h2 = s_max( round_fx( L_Etot_v_h2 ), 26 /* 0.1 in Q8*/ ); // Q8 + *Etot_v_h2 = L_max( L_Etot_v_h2, 1677722 /* 0.1 in Q24*/ ); // Q24 move16(); return; @@ -923,20 +988,9 @@ void noise_est_fx( NOISE_EST_HANDLE hNoiseEst; SP_MUS_CLAS_HANDLE hSpMusClas; hSpMusClas = st_fx->hSpMusClas; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) ( ncharX ); -#endif - - /* Check if LR-VAD */ - { - hNoiseEst = st_fx->hNoiseEst; - } - + hNoiseEst = st_fx->hNoiseEst; GSC_ENC_HANDLE hGSCEnc = st_fx->hGSCEnc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*-----------------------------------------------------------------* * Initialization @@ -957,7 +1011,6 @@ void noise_est_fx( { hSpMusClas->ener_RAT_fx = 0; move16(); - // PMT("hSpMusClas->ener_RAT_fx = 0, that should be validated") } ELSE { @@ -987,6 +1040,7 @@ void noise_est_fx( } } } + /*-----------------------------------------------------------------* * Set the threshold for eps & non_sta based on input sampling rate * The reason is that in case of 8kHz sampling input, there is nothing @@ -1018,7 +1072,6 @@ void noise_est_fx( move16(); } - /*-----------------------------------------------------------------* * Estimation of pitch stationarity *-----------------------------------------------------------------*/ @@ -1031,8 +1084,8 @@ void noise_est_fx( Ltmp = L_deposit_h( corr_shift ); Ltmp = L_mac( Ltmp, st_fx->voicing_fx[0], 10923 ); - Ltmp = L_mac_o( Ltmp, st_fx->voicing_fx[1], 10923, &Overflow ); - wtmp = mac_ro( Ltmp, st_fx->voicing_fx[2], 10923, &Overflow ); + Ltmp = L_mac_sat( Ltmp, st_fx->voicing_fx[1], 10923 ); + wtmp = mac_r_sat( Ltmp, st_fx->voicing_fx[2], 10923 ); tmp_pc = pc; move16(); @@ -1048,16 +1101,15 @@ void noise_est_fx( * Multi-harmonic analysis *-----------------------------------------------------------------*/ + IF( st_fx->hSpMusClas != NULL ) { - IF( st_fx->hSpMusClas != NULL ) - { - i = 0; - move16(); - *loc_harm = multi_harm_fx( EspecdB, hNoiseEst->old_S_fx, hNoiseEst->cor_map_fx, &hNoiseEst->multi_harm_limit_fx, st_fx->total_brate, - st_fx->bwidth, ( st_fx->hGSCEnc != NULL ) ? &hGSCEnc->cor_strong_limit : &i, &hSpMusClas->mean_avr_dyn_fx, &hSpMusClas->last_sw_dyn_fx, cor_map_sum, sp_floor, S_map ); - move16(); - } + i = 0; + move16(); + *loc_harm = multi_harm_fx( EspecdB, hNoiseEst->old_S_fx, hNoiseEst->cor_map_fx, &hNoiseEst->multi_harm_limit_fx, st_fx->total_brate, + st_fx->bwidth, ( st_fx->hGSCEnc != NULL ) ? &hGSCEnc->cor_strong_limit : &i, &hSpMusClas->mean_avr_dyn_fx, &hSpMusClas->last_sw_dyn_fx, cor_map_sum, sp_floor, S_map ); + move16(); } + /*-----------------------------------------------------------------* * Detection of frames with non-stationary spectral content *-----------------------------------------------------------------*/ @@ -1085,7 +1137,7 @@ void noise_est_fx( FOR( i = 10; i <= st_fx->max_band; i++ ) { Lnum = L_max( *pt1, *pt2 ); /* Don't need if anymore */ - Lsum_den = L_add_o( Lsum_den, Lnum, &Overflow ); + Lsum_den = L_add_sat( Lsum_den, Lnum ); Ltmpden = L_min( *pt1, *pt2 ); if ( Ltmpden == 0 ) { @@ -1141,7 +1193,7 @@ void noise_est_fx( /* calculation of energy in the rest of bands */ Ltmp2 = sum32_fx( &fr_bands[10], sub( st_fx->max_band, 9 ) ); - wtmp = shl_o( 1, sub( add( Q_new, QSCALE ), 1 ), &Overflow ); + wtmp = shl_sat( 1, sub( add( Q_new, QSCALE ), 1 ) ); test(); IF( L_msu( Ltmp, 100, wtmp ) < 0 || L_msu( Ltmp2, 100, wtmp ) < 0 ) @@ -1158,7 +1210,7 @@ void noise_est_fx( ExpDen = norm_l( Ltmp ); den = extract_h( L_shl( Ltmp, ExpDen ) ); num = div_s( num, den ); - noise_chartmp = extract_h( L_shr_o( num, add( sub( ExpNum, ExpDen ), 4 - 16 ), &Overflow ) ); /* Q11 */ + noise_chartmp = extract_h( L_shr_sat( num, add( sub( ExpNum, ExpDen ), 4 - 16 ) ) ); /* Q11 */ } noise_chartmp = s_min( noise_chartmp, (Word16) 10 << 11 ); /* Q11 */ @@ -1199,9 +1251,9 @@ void noise_est_fx( tmp = s_max( relE, 0 ); /* Q8 */ /* alpha = 0.064f * ftemp + 0.75f; */ - Ltmp = Mult_32_16( (Word32) 137438953L, tmp ); /* Q31(.064)+Q8+1-16 --> Q24 */ - Ltmp = L_mac( Ltmp, 256, 24576 ); /* Q8+Q15(.75)+1 --> Q24 */ - alpha = round_fx_o( L_shl_o( Ltmp, 7, &Overflow ), &Overflow ); /*Q24 +7 --> Q31 Q15*/ + Ltmp = Mult_32_16( (Word32) 137438953L, tmp ); /* Q31(.064)+Q8+1-16 --> Q24 */ + Ltmp = L_mac( Ltmp, 256, 24576 ); /* Q8+Q15(.75)+1 --> Q24 */ + alpha = round_fx_sat( L_shl_sat( Ltmp, 7 ) ); /*Q24 +7 --> Q31 Q15*/ /*if( alpha > 0.999f { alpha = 0.999f;} */ alpha = s_min( alpha, 32735 ); /*.999 in Q15*/ @@ -1236,9 +1288,9 @@ void noise_est_fx( /* + 1.0f added to reduce sensitivity to non stationarity in low energies */ /* tmp_enr = enr[i] + 1.0f; */ tmp_Q = add( Q_new, Q_SCALE ); - Ltmp = L_shl( (Word32) 1L, tmp_Q ); /* 1.0 added in the right dynamic domain */ - L_tmp_enr = L_add_o( enr[i], Ltmp, &Overflow ); /* enr scale dynamic */ - L_tmp_ave_enr = L_add_o( hNoiseEst->ave_enr_fx[i], Ltmp, &Overflow ); /* ave__enr scale dynamic */ + Ltmp = L_shl( (Word32) 1L, tmp_Q ); /* 1.0 added in the right dynamic domain */ + L_tmp_enr = L_add_sat( enr[i], Ltmp ); /* enr scale dynamic */ + L_tmp_ave_enr = L_add_sat( hNoiseEst->ave_enr_fx[i], Ltmp ); /* ave__enr scale dynamic */ IF( LE_32( non_sta, th_sta ) ) /* Just to limit the saturation */ { @@ -1257,7 +1309,7 @@ void noise_est_fx( den = extract_h( L_shl( Lden, ExpDen ) ); num = div_s( num, den ); Ltmp = Mult_32_16( non_sta, num ); - non_sta = L_shr_o( Ltmp, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ + non_sta = L_shr_sat( Ltmp, sub( ExpNum, ExpDen ) ); /* Q10 */ } /* st->ave_enr[i] = alpha * st->ave_enr[i] + (1-alpha) * enr[i];*/ /* update long-term average */ @@ -1277,10 +1329,10 @@ void noise_est_fx( } */ /* ave_enr2:: calculation of another non-stationarity measure (following attacks) */ - Ltmp = L_shl( (Word32) 1L, tmp_Q ); /* 1.0 added in the right dynamic domain */ - /*L_tmp_enr = L_add(enr[i] , Ltmp );*/ /* enr scale dynamic , done above */ - L_tmp_ave_enr2 = L_add_o( hNoiseEst->ave_enr2_fx[i], Ltmp, &Overflow ); /* ave__enr scale dynamic */ - IF( LE_32( Lnon_sta2, th_sta ) ) /* Just to limit the saturation */ + Ltmp = L_shl( (Word32) 1L, tmp_Q ); /* 1.0 added in the right dynamic domain */ + /*L_tmp_enr = L_add(enr[i] , Ltmp );*/ /* enr scale dynamic , done above */ + L_tmp_ave_enr2 = L_add_sat( hNoiseEst->ave_enr2_fx[i], Ltmp ); /* ave__enr scale dynamic */ + IF( LE_32( Lnon_sta2, th_sta ) ) /* Just to limit the saturation */ { Lnum = L_max( L_tmp_enr, L_tmp_ave_enr2 ); Lden = L_min( L_tmp_enr, L_tmp_ave_enr2 ); @@ -1292,7 +1344,7 @@ void noise_est_fx( den = extract_h( L_shl( Lden, ExpDen ) ); num = div_s( num, den ); Ltmp1 = Mult_32_16( Lnon_sta2, num ); - Lnon_sta2 = L_shr_o( Ltmp1, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ + Lnon_sta2 = L_shr_sat( Ltmp1, sub( ExpNum, ExpDen ) ); /* Q10 */ } /* st_ave_enr2[i] = (float)alpha2 * st_ave_enr2[i] @@ -1311,7 +1363,7 @@ void noise_est_fx( /* log_enr = (float)ln_fx(enr[i]); */ log_enr16 = noise_est_ln_q8_fx( enr[i], 0, tmp_Q ); wtmp = abs_s( sub( log_enr16, hSpMusClas->past_log_enr_fx[i - START_BAND_SPMUS] ) ); - *non_staX = add_o( *non_staX, wtmp, &Overflow ); + *non_staX = add_sat( *non_staX, wtmp ); move16(); /* Q8 */ hSpMusClas->past_log_enr_fx[i - START_BAND_SPMUS] = log_enr16; move16(); @@ -1327,7 +1379,7 @@ void noise_est_fx( tmp_floor = LN_E_MIN_PLUS_ONE_FX; move16(); /* non dynamic init constant in Q8 */ tmp_floor = noise_est_ln_q8_fx( hNoiseEst->bckr_fx[i], 1, tmp_Q ); - non_staB = add_o( non_staB, abs_s( sub( tmp_enr, tmp_floor ) ), &Overflow ); /* Q8 */ + non_staB = add_sat( non_staB, abs_s( sub( tmp_enr, tmp_floor ) ) ); /* Q8 */ } ELSE /*ini_frame < 100*/ { @@ -1336,7 +1388,7 @@ void noise_est_fx( tmp_floor = LN_E_MIN_PLUS_ONE_FX; move16(); /* non dynamic init constant in Q8 */ tmp_floor = noise_est_ln_q8_fx( E_MIN_FX, 1, tmp_Q ); - non_staB = add_o( non_staB, abs_s( sub( tmp_enr, tmp_floor ) ), &Overflow ); /* Q8 */ + non_staB = add_sat( non_staB, abs_s( sub( tmp_enr, tmp_floor ) ) ); /* Q8 */ } } @@ -1446,9 +1498,10 @@ void noise_est_fx( /*epsP_0_2 = max(0 , min(8, epsP[0] / epsP[2])); */ Ltmp = eps_quota_fx( epsP_h[0], epsP_l[0], - epsP_h[2], epsP_l[2], 12 ); /* Word32 Q12 */ - BASOP_SATURATE_WARNING_OFF_EVS /* may saturate*/ - epsP_0_2 = round_fx_o( L_shl_o( Ltmp, 16, &Overflow ), &Overflow ); /* Q12+16 -16 -> Q12 , NB saturation in Q12 sets max value to 7,999 */ + epsP_h[2], epsP_l[2], 12 ); /* Word32 Q12 */ + BASOP_SATURATE_WARNING_OFF_EVS /* may saturate*/ + epsP_0_2 = round_fx_sat( L_shl_sat( Ltmp, 16 ) ); + /* Q12+16 -16 -> Q12 , NB saturation in Q12 sets max value to 7,999 */ BASOP_SATURATE_WARNING_ON_EVS epsP_0_2 = s_max( 0, epsP_0_2 ); /* min value is 0 , Q12 */ @@ -1485,10 +1538,10 @@ void noise_est_fx( /* epsP_2_16 = max(0 , min(8, epsP[2] / epsP[16])); */ Ltmp = eps_quota_fx( epsP_h[2], epsP_l[2], - epsP_h[16], epsP_l[16], 12 ); /* Word32 Q12 */ - BASOP_SATURATE_WARNING_OFF_EVS /* may saturate*/ - epsP_2_16 = round_fx_o( L_shl_o( Ltmp, 16, &Overflow ), &Overflow ); /* Q12+16 -16 -> Q12 , - NB saturation in Q12 sets max value to 7,999 */ + epsP_h[16], epsP_l[16], 12 ); /* Word32 Q12 */ + BASOP_SATURATE_WARNING_OFF_EVS /* may saturate*/ + epsP_2_16 = round_fx_sat( L_shl_sat( Ltmp, 16 ) ); /* Q12+16 -16 -> Q12 ,*/ + /*NB saturation in Q12 sets max value to 7,999 */ BASOP_SATURATE_WARNING_ON_EVS epsP_2_16 = s_max( 0, epsP_2_16 ); /* min value is 0 , Q12 */ @@ -1610,8 +1663,7 @@ void noise_est_fx( *-----------------------------------------------------------------*/ Ltmp = L_mult( st_fx->voicing_fx[0], 16384 ); Ltmp = L_mac( Ltmp, st_fx->voicing_fx[1], 16384 ); - cor_tmp = mac_ro( Ltmp, corr_shift, MAX_16, &Overflow ); - + cor_tmp = mac_r_sat( Ltmp, corr_shift, MAX_16 ); LepsP = eps_quota_fx( epsP_h[2], epsP_l[2], epsP_h[16], epsP_l[16], 11 ); /* L_epsP in Q11 */ /* note this epsP2/eps16 is not limited to 8 as, epsP_2_16 is !! */ @@ -2138,7 +2190,8 @@ void noise_est_fx( void noise_est_ivas_fx( Encoder_State *st_fx, /* i/o: state structure */ const Word16 old_pitch1, /* i : previous frame OL pitch[1] */ - const Word32 tmpN[], /* i : temporary noise update Q_new + QSCALE */ + const Word32 tmpN[], /* i : temporary noise update q_tmpN */ + const Word16 q_tmpN, /* i : Q-factor of tmpN buffer */ const Word32 epsP[], /* i : msb prediction error energies Qx */ const Word16 Etot, /* i : total channel E (see find_enr_fx.c) Q8 */ const Word16 relE, /* i : (VA_CHECK addition) relative frame energy Q8? */ @@ -2151,13 +2204,13 @@ void noise_est_ivas_fx( Word16 *ncharX, /* o : Q11 */ Word16 *sp_div, /* o : Q_sp_div */ Word16 *Q_sp_div, /* o : Q factor for sp_div */ - Word16 *non_staX, /* o : non-stationarity for sp/mus classifier Q8 */ + Word32 *non_staX, /* o : non-stationarity for sp/mus classifier */ Word16 *loc_harm, /* o : multi-harmonicity flag for UV classifier */ const Word32 *lf_E, /* i : per bin energy for low frequencies q_lf_E */ const Word16 q_lf_E, /* i : Q of lf_E Q0 */ Word16 *st_harm_cor_cnt, /* i/o : 1st harm correlation timer Q0 */ const Word16 Etot_l_lp, /* i : Smoothed low energy Q8 */ - const Word16 Etot_v_h2, /* i : Energy variations Q8 */ + const Word32 Etot_v_h2, /* i : Energy variations Q24 */ Word16 *bg_cnt, /* i : Background burst length timer Q0 */ Word16 EspecdB[], /* i/o: log E spectrum (with f=0) of the current frame Q7 for multi harm */ Word16 *sp_floor, /* o : noise floor estimate Q7 */ @@ -2194,10 +2247,11 @@ void noise_est_ivas_fx( Word16 non_staB; /* Q8 */ Word32 L_tmp_enr, L_tmp_ave, L_tmp_ave2; - Word16 tmp, tmp2; /* general temp registers */ + Word16 tmp, tmp2, diff; /* general temp registers */ Word16 tmp_enr, tmp_floor; /* constants in Q8 */ Word16 vad_bwidth_fx; /* vad ns control variabel for input bwidth from teh BWD */ /* for DTX operation */ + Word32 L_tmp; Word16 lim_Etot_fx; /* Q8 */ Word32 lim_Etot_sq_fx; /* Q16 */ @@ -2211,10 +2265,6 @@ void noise_est_ivas_fx( Le_min_scaled = L_shl( E_MIN_FXQ31, sub( q_fr_bands, Q31 ) ); // q_fr_bands GSC_ENC_HANDLE hGSCEnc = st_fx->hGSCEnc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* Check if LR-VAD */ IF( hFrontVad != NULL ) @@ -2317,7 +2367,6 @@ void noise_est_ivas_fx( move16(); } - /*-----------------------------------------------------------------* * Estimation of pitch stationarity *-----------------------------------------------------------------*/ @@ -2327,11 +2376,10 @@ void noise_est_ivas_fx( wtmp1 = abs_s( sub( st_fx->pitch[1], st_fx->pitch[0] ) ); pc = add( wtmp, wtmp1 ); - Ltmp = L_deposit_h( corr_shift ); Ltmp = L_mac( Ltmp, st_fx->voicing_fx[0], 10923 ); - Ltmp = L_mac_o( Ltmp, st_fx->voicing_fx[1], 10923, &Overflow ); - wtmp = mac_ro( Ltmp, st_fx->voicing_fx[2], 10923, &Overflow ); + Ltmp = L_mac_sat( Ltmp, st_fx->voicing_fx[1], 10923 ); + wtmp = mac_r_sat( Ltmp, st_fx->voicing_fx[2], 10923 ); tmp_pc = pc; move16(); @@ -2396,8 +2444,8 @@ void noise_est_ivas_fx( ExpDen = sub( add( q_fr_bands, exp ), Q16 ); } - num = div_s( num, den ); // Q15+ExpNum-ExpDen - w_tmp = W_shl( num, sub( q_fr_bands, sub( ExpNum, ExpDen ) ) ); // q_fr_bands+15 + num = div_s( num, den ); // Q15+ExpNum-ExpDen + w_tmp = W_shl( num, s_min( 63, sub( q_fr_bands, sub( ExpNum, ExpDen ) ) ) ); // q_fr_bands+15 w_sum_num = W_add( w_sum_num, w_tmp ); pt1++; @@ -2476,8 +2524,8 @@ void noise_est_ivas_fx( ELSE { /* ftemp2 /= ftemp */ - num = div_s( extract_h( Ltmp2 ), extract_h( Ltmp ) ); // 15+exp2-exp - noise_chartmp = shl_o( num, sub( sub( exp, exp2 ), 4 ), &Overflow ); // 15+exp2-exp1 -> Q11 + num = div_s( extract_h( Ltmp2 ), extract_h( Ltmp ) ); // 15+exp2-exp + noise_chartmp = shl_sat( num, sub( sub( exp, exp2 ), 4 ) ); // 15+exp2-exp1 -> Q11 } if ( ncharX != NULL ) @@ -2543,7 +2591,7 @@ void noise_est_ivas_fx( /* alpha = 0.064f * ftemp + 0.75f; */ Ltmp = Madd_32_16( 12582912 /* 0.75 in Q24*/, 137438953, tmp ); // Q24 - alpha = round_fx_o( L_shl_o( Ltmp, 7, &Overflow ), &Overflow ); /*Q24 +7 --> Q31 Q15*/ + alpha = round_fx_sat( L_shl_sat( Ltmp, 7 ) ); /*Q24 +7 --> Q31 Q15*/ /*if( alpha > 0.999f { alpha = 0.999f;} */ alpha = s_min( alpha, 32735 ); /*.999 in Q15*/ @@ -2605,9 +2653,9 @@ void noise_est_ivas_fx( ExpDen = norm_l( Lden ); den = extract_h( L_shl( Lden, ExpDen ) ); // q_enr+ExpDen-16 - num = div_s( num, den ); // 15+ExpNum-ExpDen - Ltmp1 = Mult_32_16( non_sta, num ); // 15+ExpNum-ExpDen+10-15 - non_sta = L_shr_o( Ltmp1, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ + num = div_s( num, den ); // 15+ExpNum-ExpDen + Ltmp1 = Mult_32_16( non_sta, num ); // 15+ExpNum-ExpDen+10-15 + non_sta = L_shr_sat( Ltmp1, sub( ExpNum, ExpDen ) ); /* Q10 */ } /* st->ave_enr[i] = alpha * st->ave_enr[i] + (1-alpha) * enr[i];*/ /* update long-term average */ @@ -2644,9 +2692,9 @@ void noise_est_ivas_fx( ExpDen = norm_l( Lden ); den = extract_h( L_shl( Lden, ExpDen ) ); // q_enr+ExpDen-16 - num = div_s( num, den ); // 15+ExpNum-ExpDen - Ltmp1 = Mult_32_16( Lnon_sta2, num ); // 15+ExpNum-ExpDen+10-15 - Lnon_sta2 = L_shr_o( Ltmp1, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ + num = div_s( num, den ); // 15+ExpNum-ExpDen + Ltmp1 = Mult_32_16( Lnon_sta2, num ); // 15+ExpNum-ExpDen+10-15 + Lnon_sta2 = L_shr_sat( Ltmp1, sub( ExpNum, ExpDen ) ); /* Q10 */ } /* st_ave_enr2[i] = (float)alpha2 * st_ave_enr2[i] + (1.0f - alpha2) * (enr[i]) */ @@ -2671,7 +2719,7 @@ void noise_est_ivas_fx( Ltmp1 = Mpy_32_16_1( Ltmp1, 22713 ); // Q15 log_enr16 = round_fx( L_shl( Ltmp1, 9 ) ); /* Q8 */ wtmp = abs_s( sub( log_enr16, hSpMusClas->past_log_enr_fx[i - START_BAND_SPMUS] ) ); - *non_staX = add_o( *non_staX, wtmp, &Overflow ); + *non_staX = L_add( *non_staX, wtmp ); move16(); /* Q8 */ hSpMusClas->past_log_enr_fx[i - START_BAND_SPMUS] = log_enr16; move16(); @@ -2696,7 +2744,7 @@ void noise_est_ivas_fx( IF( LT_16( ini_frame, 100 ) ) { - non_staB = add_o( non_staB, abs_s( sub( tmp_enr, LN_E_MIN_PLUS_ONE_FX ) ), &Overflow ); /* Q8 */ + non_staB = add_sat( non_staB, abs_s( sub( tmp_enr, LN_E_MIN_PLUS_ONE_FX ) ) ); /* Q8 */ } ELSE /*ini_frame < 100*/ { @@ -2704,20 +2752,27 @@ void noise_est_ivas_fx( move16(); IF( hNoiseEst->bckr_fx[i] != 0 ) { - Ltmp1 = L_add( hNoiseEst->bckr_fx[i], L_shl( 1, hNoiseEst->q_bckr ) ); // hNoiseEst->q_bckr + diff = 1; + move16(); + IF( GT_16( hNoiseEst->q_bckr, 30 ) ) + { + diff = add( diff, sub( hNoiseEst->q_bckr, 30 ) ); + } + Ltmp1 = L_add( L_shr( hNoiseEst->bckr_fx[i], diff ), L_shl( 1, sub( hNoiseEst->q_bckr, diff ) ) ); // hNoiseEst->q_bckr - diff e_ener = norm_l( Ltmp1 ); f_ener = Log2_norm_lc( L_shl( Ltmp1, e_ener ) ); - e_ener = sub( sub( 30, e_ener ), hNoiseEst->q_bckr ); + e_ener = sub( sub( 30, e_ener ), sub( hNoiseEst->q_bckr, diff ) ); Ltmp1 = L_mac( f_ener, e_ener, ONE_IN_Q14 ); // Q15 Ltmp1 = Mpy_32_16_1( Ltmp1, 22713 ); // Q15 tmp_floor = round_fx( L_shl( Ltmp1, 9 ) ); /* Q8 */ } - non_staB = add_o( non_staB, abs_s( sub( tmp_enr, tmp_floor ) ), &Overflow ); /* Q8 */ + non_staB = add_sat( non_staB, abs_s( sub( tmp_enr, tmp_floor ) ) ); /* Q8 */ } } - } /* end of band loop FOR( i = st_fx->min_band; i <= st_fx->max_band; i++ ) */ - + } /* end of band loop FOR( i = st_fx->min_band; i <= st_fx->max_band; i++ ) */ + *non_staX = L_shl( *non_staX, 12 ); // Q20 + move32(); IF( LT_16( Etot, -1280 /* -5.0f in Q8 */ ) ) { non_sta = L_deposit_l( 1024 ); /* 1.0 in Q10 */ @@ -2917,7 +2972,7 @@ void noise_est_ivas_fx( * long term extensions of frame features *-----------------------------------------------------------------*/ - tmp = sub( Etot, hNoiseEst->totalNoise_fx ); /* Q8 */ + tmp = sub( Etot, extract_h( hNoiseEst->totalNoise_32fx ) ); /* Q8 */ /* st->lt_tn_track = 0.03f* (Etot - st->totalNoise < 10) + 0.97f*st->lt_tn_track; */ tmp2 = 0; move16(); @@ -2934,7 +2989,7 @@ void noise_est_ivas_fx( move16(); /* st->lt_Ellp_dist = 0.03f* (Etot - st->Etot_l_lp) + 0.97f*st->lt_Ellp_dist;*/ - tmp = sub( Etot, hNoiseEst->Etot_l_lp_fx ); /* Q8 */ + tmp = sub( Etot, extract_h( hNoiseEst->Etot_l_lp_32fx ) ); /* Q8 */ hNoiseEst->lt_Ellp_dist_fx = mac_r( L_mult( tmp, 983 /* 0.03 in Q15*/ ), hNoiseEst->lt_Ellp_dist_fx, 31785 /* 0.97 in Q15*/ ); // Q8 move16(); @@ -2946,7 +3001,7 @@ void noise_est_ivas_fx( } */ IF( *st_harm_cor_cnt == 0 ) { - hNoiseEst->lt_haco_ev_fx = mac_r( 64424509 /* 0.03 in Q32*/, hNoiseEst->lt_haco_ev_fx, 31785 /* 0.97 in Q15*/ ); // Q15 + hNoiseEst->lt_haco_ev_fx = mac_r( 64424509 /* 0.03 in Q31*/, hNoiseEst->lt_haco_ev_fx, 31785 /* 0.97 in Q15*/ ); // Q15 move16(); } ELSE @@ -3119,14 +3174,14 @@ void noise_est_ivas_fx( haco_ev_max = s_max( tmp, hNoiseEst->lt_haco_ev_fx ); /* Q15 */ /* Etot_l_lp_thr = st->Etot_l_lp + (1.5f + 1.5f * (st->Etot_lp<50.0f))*st->Etot_v_h2; */ - tmp = 12288; - move16(); /* 1.5 Q13 */ + L_tmp = 49152; /* 1.5 Q15 */ + move32(); if ( LT_16( hNoiseEst->Etot_lp_fx, 12800 ) ) /* 50.0 in Q8 */ { - tmp = shl( tmp, 1 ); /*1.5 + 1.5 Q13 */ + L_tmp = L_shl( L_tmp, 1 ); /*1.5 + 1.5 Q15 */ } - Ltmp = L_deposit_h( hNoiseEst->Etot_l_lp_fx ); - Etot_l_lp_thr = round_fx( L_add( Ltmp, L_shl( L_mult( tmp, Etot_v_h2 ), 2 ) ) ); /* Q13+Q8+1 +2 = Q24 -> Q8*/ + temp = W_mac_32_32( W_mult_32_32( hNoiseEst->Etot_l_lp_32fx, ONE_IN_Q15 ), Etot_v_h2, L_tmp ); // Q40(24+15+1) + Etot_l_lp_thr = W_round32_s( temp ); // Q8 /* enr_bgd = Etot < Etot_l_lp_thr; */ enr_bgd = 0; @@ -3310,8 +3365,8 @@ void noise_est_ivas_fx( move16(); test(); test(); - if ( ( GT_16( hNoiseEst->sign_dyn_lp_fx, 15 * 256 ) ) /* 15 in Q8 */ - && ( LT_16( sub( Etot, hNoiseEst->Etot_l_lp_fx ), shl( Etot_v_h2, 1 ) ) ) /* Q8 , Etot_v_h2 has limited dynmics can be upscaled*/ + if ( ( GT_16( hNoiseEst->sign_dyn_lp_fx, 15 * 256 ) ) /* 15 in Q8 */ + && ( LT_32( L_sub( L_deposit_h( Etot ), hNoiseEst->Etot_l_lp_32fx ), L_shl( Etot_v_h2, 1 ) ) ) /* Q24 , Etot_v_h2 has limited dynmics can be upscaled*/ && ( GT_16( *st_harm_cor_cnt, 20 ) ) ) { sd1_bgd = 1; @@ -3414,7 +3469,7 @@ void noise_est_ivas_fx( test(); test(); IF( ( LT_16( hNoiseEst->act_pred_fx, 27853 /* 0.85 in Q15 */ ) && ( aE_bgd != 0 ) && ( LT_16( hNoiseEst->lt_Ellp_dist_fx, 10 * 256 /* 10 in Q8*/ ) || ( sd1_bgd != 0 ) ) && ( LT_16( hNoiseEst->lt_tn_dist_fx, 40 * 256 ) ) /* 40.0 in Q8*/ - && LT_16( sub( Etot, hNoiseEst->totalNoise_fx ), 10 * 256 /* 10 in Q8 */ ) /* 10.0 in Q8*/ ) || + && LT_16( sub( Etot, extract_h( hNoiseEst->totalNoise_32fx ) ), 10 * 256 /* 10 in Q8 */ ) /* 10.0 in Q8*/ ) || ( ( hNoiseEst->first_noise_updt == 0 ) && GT_16( hNoiseEst->harm_cor_cnt, 80 ) && ( aE_bgd != 0 ) && GT_16( hNoiseEst->lt_aEn_zero_fx, 16384 /* 0.5 in Q15 */ ) ) || ( ( tn_ini != 0 ) && ( ( aE_bgd != 0 ) || LT_16( non_staB, 10 * 256 /* 10 in Q8*/ ) || GT_16( hNoiseEst->harm_cor_cnt, 80 ) ) ) ) { @@ -3427,6 +3482,8 @@ void noise_est_ivas_fx( hNoiseEst->bckr_fx[i] = tmpN[i]; move32(); } + hNoiseEst->q_bckr = q_tmpN; + move16(); } /* else if ( ( ( st->act_pred < 0.80f ) && ( aE_bgd || PAU ) && st->lt_haco_ev < 0.10f ) || ( ( st->act_pred < 0.70f ) && ( aE_bgd || non_staB < 17.0f ) && PAU && st->lt_haco_ev < 0.15f ) @@ -3437,7 +3494,7 @@ void noise_est_ivas_fx( ) */ ELSE IF( ( LT_16( hNoiseEst->act_pred_fx, 26214 /* 0.8 in Q15*/ ) && ( ( aE_bgd != 0 ) || ( PAU != 0 ) ) && ( LT_16( hNoiseEst->lt_haco_ev_fx, 3277 /* 0.1 in q15*/ ) ) ) || ( ( LT_16( hNoiseEst->act_pred_fx, 22938 /* 0.70 in Q15 */ ) ) && ( ( aE_bgd != 0 ) || ( LT_16( non_staB, 17 * 256 /* 17.0 in Q8 */ ) ) ) && ( PAU != 0 ) && ( LT_16( hNoiseEst->lt_haco_ev_fx, 4915 /* 0.15 in Q15 */ ) ) ) || - ( GT_16( hNoiseEst->harm_cor_cnt, 80 ) && GT_16( hNoiseEst->totalNoise_fx, 5 * 256 /* 5.0 in Q8 */ ) && LT_16( Etot, s_max( 1 * 256, add( Etot_l_lp, add( hNoiseEst->Etot_v_h2_fx, shr( hNoiseEst->Etot_v_h2_fx, 1 ) ) /* 1.5= 1.0+.5 */ ) ) ) ) || + ( GT_16( hNoiseEst->harm_cor_cnt, 80 ) && GT_16( extract_h( hNoiseEst->totalNoise_32fx ), 5 * 256 /* 5.0 in Q8 */ ) && LT_16( Etot, s_max( 1 * 256, add( Etot_l_lp, extract_h( L_add( hNoiseEst->Etot_v_h2_32fx, L_shr( hNoiseEst->Etot_v_h2_32fx, 1 ) ) ) /* 1.5= 1.0+.5 */ ) ) ) ) || ( GT_16( hNoiseEst->harm_cor_cnt, 50 ) && GT_16( hNoiseEst->first_noise_updt, 30 ) && ( aE_bgd != 0 ) && GT_16( hNoiseEst->lt_aEn_zero_fx, 16384 /*.5 in Q15*/ ) ) || ( tn_ini != 0 ) ) { updt_step = 3277; @@ -3456,7 +3513,7 @@ void noise_est_ivas_fx( test(); if ( ( aE_bgd == 0 ) && LT_16( hNoiseEst->harm_cor_cnt, 50 ) && ( GT_16( hNoiseEst->act_pred_fx, 19661 /* 0.6 in Q15*/ ) || - ( ( tn_ini == 0 ) && LT_16( sub( Etot_l_lp, hNoiseEst->totalNoise_fx ), 10 * 256 /* 10.0 in Q8 */ ) && GT_16( non_staB, 8 * 256 /* 8.0 in in Q8*/ ) ) ) ) + ( ( tn_ini == 0 ) && LT_16( sub( Etot_l_lp, extract_h( hNoiseEst->totalNoise_32fx ) ), 10 * 256 /* 10.0 in Q8 */ ) && GT_16( non_staB, 8 * 256 /* 8.0 in in Q8*/ ) ) ) ) { updt_step = 328; move16(); /* 0.01 Q15 */ @@ -3464,14 +3521,34 @@ void noise_est_ivas_fx( hNoiseEst->first_noise_updt = 1; move16(); - FOR( i = 0; i < NB_BANDS; i++ ) + IF( LT_16( q_tmpN, hNoiseEst->q_bckr ) ) { - /* st->bckr[i] = st->bckr[i] + updt_step * (tmpN[i]-st->bckr[i]);*/ - /* 32 bit state update */ - Ltmp = L_sub( tmpN[i], hNoiseEst->bckr_fx[i] ); // hNoiseEst->q_bckr - Ltmp = Mult_32_16( Ltmp, updt_step ); - hNoiseEst->bckr_fx[i] = L_add( Ltmp, hNoiseEst->bckr_fx[i] ); // hNoiseEst->q_bckr - move32(); + diff = sub( hNoiseEst->q_bckr, q_tmpN ); + FOR( i = 0; i < NB_BANDS; i++ ) + { + /* st->bckr[i] = st->bckr[i] + updt_step * (tmpN[i]-st->bckr[i]);*/ + /* 32 bit state update */ + Ltmp1 = L_shr( hNoiseEst->bckr_fx[i], diff ); + Ltmp = L_sub( tmpN[i], Ltmp1 ); // q_tmpN + Ltmp = Mult_32_16( Ltmp, updt_step ); + hNoiseEst->bckr_fx[i] = L_add( Ltmp, Ltmp1 ); // q_tmpN + move32(); + } + hNoiseEst->q_bckr = q_tmpN; + move16(); + } + ELSE + { + diff = sub( q_tmpN, hNoiseEst->q_bckr ); + FOR( i = 0; i < NB_BANDS; i++ ) + { + /* st->bckr[i] = st->bckr[i] + updt_step * (tmpN[i]-st->bckr[i]);*/ + /* 32 bit state update */ + Ltmp = L_sub( L_shr( tmpN[i], diff ), hNoiseEst->bckr_fx[i] ); // hNoiseEst->q_bckr + Ltmp = Mult_32_16( Ltmp, updt_step ); + hNoiseEst->bckr_fx[i] = L_add( Ltmp, hNoiseEst->bckr_fx[i] ); // hNoiseEst->q_bckr + move32(); + } } } /*else if (aE_bgd || st->harm_cor_cnt > 100 )*/ @@ -3486,7 +3563,7 @@ void noise_est_ivas_fx( /* If in music lower bckr to drop further */ test(); test(); - IF( GT_16( hNoiseEst->low_tn_track_cnt, 300 ) && GT_16( hNoiseEst->lt_haco_ev_fx, 29491 /* 0.9 in Q15 */ ) && ( hNoiseEst->totalNoise_fx > 0 ) ) + IF( GT_16( hNoiseEst->low_tn_track_cnt, 300 ) && GT_16( hNoiseEst->lt_haco_ev_fx, 29491 /* 0.9 in Q15 */ ) && ( hNoiseEst->totalNoise_32fx > 0 ) ) { updt_step = -655; move16(); /* for debug purposes */ @@ -3503,14 +3580,14 @@ void noise_est_ivas_fx( } /*st->lt_aEn_zero = 0.2f * (st->aEn==0) + (1-0.2f) *st->lt_aEn_zero;*/ /* y(n+1)= alpha*tmp + (1-alpha)*y(n) */ - tmp = 0; - move16(); + L_tmp = 0; + move32(); if ( hNoiseEst->aEn == 0 ) { - tmp = 6554; // 0.2 in Q15 - move16(); + L_tmp = 429496730; // 0.2 in Q31 + move32(); } - hNoiseEst->lt_aEn_zero_fx = mac_r( tmp, hNoiseEst->lt_aEn_zero_fx, 26214 /* 0.8 in Q15*/ ); // Q15 + hNoiseEst->lt_aEn_zero_fx = mac_r( L_tmp, hNoiseEst->lt_aEn_zero_fx, 26214 /* 0.8 in Q15*/ ); // Q15 move16(); IF( st_fx->element_mode > EVS_MONO ) diff --git a/lib_enc/noise_adjust_fx.c b/lib_enc/noise_adjust_fx.c index 1a2e204aea8c14b96a983c05f1eb02cd3a29c09f..ffbcd8b0982e5515735e48cc45a6a87e4ff77ca4 100644 --- a/lib_enc/noise_adjust_fx.c +++ b/lib_enc/noise_adjust_fx.c @@ -1,27 +1,29 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*--------------------------------------------------------------------------* * noise_adjust_fx() * * Calculate attenuation *--------------------------------------------------------------------------*/ -Word16 noise_adjust_fx( /* o : index of noise attenuation Q0 */ - const Word16 *coeffs_norm, /* i : normalized coefficients Qx */ - const Word16 qx, /* i : Q value of coeffs_norm */ - const Word16 *bitalloc, /* i : bit allocation Q0 */ - const Word16 *sfm_start, /* i : band start Q0 */ - const Word16 *sfm_end, /* i : band end Q0 */ - const Word16 core_sfm /* i : index of the end band for core Q0 */ +/* o : index of noise attenuation Q0 */ +Word16 noise_adjust_fx( + const Word16 *coeffs_norm, /* i : normalized coefficients Qx */ + const Word16 qx, /* i : Q value of coeffs_norm */ + const Word16 *bitalloc, /* i : bit allocation Q0 */ + const Word16 *sfm_start, /* i : band start Q0 */ + const Word16 *sfm_end, /* i : band end Q0 */ + const Word16 core_sfm /* i : index of the end band for core Q0 */ ) { Word16 nf_idx, sfm, bin, num_coeffs; diff --git a/lib_enc/normalizecoefs_fx.c b/lib_enc/normalizecoefs_fx.c index ea394f54bd29ca2e04f9320d4a5196335a727b69..89bfadac57e2a19a230c9ce195b1d5134cff34c5 100644 --- a/lib_enc/normalizecoefs_fx.c +++ b/lib_enc/normalizecoefs_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -29,10 +29,7 @@ void normalizecoefs_fx( Word16 *pcoefs16; Word32 *pcoefs; Word16 subvec_start, subvec_end, num_coefs; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif + pcoefs = coefs; pcoefs16 = coefs_norm; @@ -55,7 +52,7 @@ void normalizecoefs_fx( *pcoefs = Mpy_32_16_1( *pcoefs, INV2POWHALF ); move32(); } - *pcoefs16++ = round_fx_o( L_shl_o( *pcoefs++, 16 - k, &Overflow ), &Overflow ); /* Q12 */ + *pcoefs16++ = round_fx_sat( L_shl_sat( *pcoefs++, 16 - k ) ); /* Q12 */ move16(); } } diff --git a/lib_enc/peak_vq_enc_fx.c b/lib_enc/peak_vq_enc_fx.c index aa4763aa63e49e848b61f4c05ecaa63ceeb20dd0..56b591ea56f522acc54e43440906d4a87ed454e4 100644 --- a/lib_enc/peak_vq_enc_fx.c +++ b/lib_enc/peak_vq_enc_fx.c @@ -1,18 +1,17 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -//#include "prot_fx.h" #include "rom_enc.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*-------------------------------------------------------------------------- * Local function prototypes *--------------------------------------------------------------------------*/ @@ -23,7 +22,7 @@ static Word16 sparse_code_pos_fx( const Word16 *inp, const Word16 length, Word16 static Word16 hvq_code_pos_ivas_fx( BSTR_ENC_HANDLE hBstr, const Word16 *inp, const Word16 length, const Word16 num_peaks ); static void quant_peaks_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle*/ const Word32 *vect_in, /* i : Target vector in Q12 */ Word32 *vect_out, /* i/o: Quantized vector in Q12 */ const Word32 *peak_gain, /* i : Peak gain vector in Q12 */ @@ -32,11 +31,14 @@ static void quant_peaks_ivas_fx( const Word32 core_brate, /* i : Core bitrate */ const Word16 Npeaks /* i : Number of peaks */ ); + + /*-------------------------------------------------------------------------- * peak_vq_enc_fx() * * Vector Quantization of MDCT peaks *--------------------------------------------------------------------------*/ + Word16 peak_vq_enc_ivas_fx( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const Word16 bwidth, /* i : audio bandwidth */ @@ -515,7 +517,7 @@ Word16 peak_vq_enc_fx( assert( ( core_brate > HQ_16k40 && core_brate <= HQ_48k ) && "HVQ rate not supported" ); - // PMT("max_peaks equation needs to be converted") + /* max_peaks equation needs to be converted */ max_peaks = (Word16) ( ( core_brate * HVQ_PEAKS_PER_DELTA + HVQ_PEAKS_PER_DELTA_OFFS ) / HVQ_PEAKS_BPS_DELTA ); @@ -559,13 +561,13 @@ Word16 peak_vq_enc_fx( move32(); nf_gains[i] = L_shr( acc, 1 + 2 ); /* nf_gains in Q12. dicn_fx is in Q14. Need extra shift +2. */ move32(); - push_indice_fx( hBstr, IND_HVQ_NF_GAIN, indx, 5 ); + push_indice( hBstr, IND_HVQ_NF_GAIN, indx, 5 ); bits = add( bits, 5 ); } /* Signal number of peaks */ i = sub( max_peaks, vq_peaks ); - push_indice_fx( hBstr, IND_NUM_PEAKS, i, 5 ); + push_indice( hBstr, IND_NUM_PEAKS, i, 5 ); bits = add( bits, 5 ); /* Identify position of first peak and arrange peak gains by position */ @@ -677,8 +679,8 @@ Word16 peak_vq_enc_fx( move16(); } - push_indice_fx( hBstr, IND_FLAGN, FlagN, 1 ); - push_indice_fx( hBstr, IND_PG_IDX, pgain_difidx[0], GAIN0_BITS ); + push_indice( hBstr, IND_FLAGN, FlagN, 1 ); + push_indice( hBstr, IND_PG_IDX, pgain_difidx[0], GAIN0_BITS ); IF( FlagN ) { @@ -692,7 +694,7 @@ Word16 peak_vq_enc_fx( r = pgain_huffsizn[j]; move16(); - push_indice_fx( hBstr, IND_PG_IDX, m, r ); + push_indice( hBstr, IND_PG_IDX, m, r ); } } ELSE @@ -700,7 +702,7 @@ Word16 peak_vq_enc_fx( pPgainDifIdx = &pgain_difidx[1]; FOR( i = 0; i < vqPeaksMinus1; i++ ) { - push_indice_fx( hBstr, IND_PG_IDX, ( *pPgainDifIdx++ ), GAINI_BITS ); + push_indice( hBstr, IND_PG_IDX, ( *pPgainDifIdx++ ), GAINI_BITS ); } } @@ -727,13 +729,13 @@ Word16 peak_vq_enc_fx( num_overlap_bins = sub( 5, sub( vq_peak_idx[i + 1], vq_peak_idx[i] ) ); indx = sub( vq_peak_idx[i], 2 ); quant_peaks_fx( hBstr, &coefs[indx], &coefs_out[indx], &peak_gains[i], &vq_cb_idx, num_overlap_bins, core_brate, vq_peaks ); - push_indice_fx( hBstr, IND_HVQ_PEAKS, vq_cb_idx, 8 ); + push_indice( hBstr, IND_HVQ_PEAKS, vq_cb_idx, 8 ); bits = add( bits, 9 ); } indx = sub( vq_peak_idx[i], 2 ); quant_peaks_fx( hBstr, &coefs[indx], &coefs_out[indx], &peak_gains[i], &vq_cb_idx, 0, core_brate, vq_peaks ); - push_indice_fx( hBstr, IND_HVQ_PEAKS, vq_cb_idx, 8 ); + push_indice( hBstr, IND_HVQ_PEAKS, vq_cb_idx, 8 ); bits = add( bits, 9 ); /* Quantize peak positions and sign with HVQ */ @@ -826,7 +828,7 @@ Word16 peak_vq_enc_fx( move16(); } - push_indice_fx( hBstr, IND_HVQ_PVQ_GAIN, pvq_norm[k], HVQ_PVQ_GAIN_BITS ); + push_indice( hBstr, IND_HVQ_PVQ_GAIN, pvq_norm[k], HVQ_PVQ_GAIN_BITS ); pvq_bits = add( pvq_bits, HVQ_PVQ_GAIN_BITS ); pvq_norm[k] = add( pvq_norm[k], 8 ); @@ -1148,7 +1150,7 @@ static void quant_peaks_fx( { *vq_idx = w_vquant_fx( x, Qx, weights, xq, hvq_peak_cb_fx, cbSize, 0 ); move16(); - push_indice_fx( hBstr, IND_HVQ_PEAKS, 0, 1 ); + push_indice( hBstr, IND_HVQ_PEAKS, 0, 1 ); } ELSE IF( EQ_16( cb_class, 1 ) ) { @@ -1157,7 +1159,7 @@ static void quant_peaks_fx( move16(); *vq_idx = add( *vq_idx, sub( HVQ_CB_SIZE / 2, search_overlap ) ); move16(); - push_indice_fx( hBstr, IND_HVQ_PEAKS, 0, 1 ); + push_indice( hBstr, IND_HVQ_PEAKS, 0, 1 ); } ELSE IF( EQ_16( cb_class, 2 ) ) { @@ -1166,13 +1168,13 @@ static void quant_peaks_fx( move16(); *vq_idx = add( *vq_idx, sub( HVQ_CB_SIZE / 2, search_overlap ) ); move16(); - push_indice_fx( hBstr, IND_HVQ_PEAKS, 1, 1 ); + push_indice( hBstr, IND_HVQ_PEAKS, 1, 1 ); } ELSE { *vq_idx = w_vquant_fx( x, Qx, weights, xq, hvq_peak_cb_fx, cbSize, 1 ); move16(); - push_indice_fx( hBstr, IND_HVQ_PEAKS, 1, 1 ); + push_indice( hBstr, IND_HVQ_PEAKS, 1, 1 ); } FOR( i = 0; i < 4; i++ ) @@ -1458,23 +1460,23 @@ static Word16 hvq_code_pos_fx( test(); IF( GT_16( delta_bits, sparse_bits ) || delta_bits < 0 ) { - push_indice_fx( hBstr, IND_POS_IDX, HVQ_CP_SPARSE, 1 ); + push_indice( hBstr, IND_POS_IDX, HVQ_CP_SPARSE, 1 ); FOR( i = 0; i < sparse_bits; i++ ) { - push_indice_fx( hBstr, IND_POS_IDX, sparse_result[i], 1 ); + push_indice( hBstr, IND_POS_IDX, sparse_result[i], 1 ); } bits = add( add( bits, sparse_bits ), 1 ); } ELSE { - push_indice_fx( hBstr, IND_POS_IDX, HVQ_CP_DELTA, 1 ); + push_indice( hBstr, IND_POS_IDX, HVQ_CP_DELTA, 1 ); FOR( i = 0; i < num_peaks; i++ ) { j = delta[i]; move16(); - push_indice_fx( hBstr, IND_POS_IDX, hvq_cp_huff_val[j], hvq_cp_huff_len[j] ); + push_indice( hBstr, IND_POS_IDX, hvq_cp_huff_val[j], hvq_cp_huff_len[j] ); } bits = add( add( bits, delta_bits ), 1 ); } @@ -1489,7 +1491,7 @@ static Word16 hvq_code_pos_fx( tmp = 0; move16(); } - push_indice_fx( hBstr, IND_POS_IDX, tmp, 1 ); + push_indice( hBstr, IND_POS_IDX, tmp, 1 ); } bits = add( bits, num_peaks ); diff --git a/lib_enc/pit_enc_fx.c b/lib_enc/pit_enc_fx.c index bcf7d33bb2431fb8cfb1709656b8080e40c4150a..b812bd6fc2c3bdc2edbffdd8fd7ccb77e203c857 100644 --- a/lib_enc/pit_enc_fx.c +++ b/lib_enc/pit_enc_fx.c @@ -1,477 +1,88 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_enc.h" /* Encoder static table prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ -#include "rom_com.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_enc.h" /* Encoder static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ #include "rom_basop_util.h" -#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx_enc.h" /* Function prototypes */ -#include "prot_fx_enc.h" /* Function prototypes */ - -#define inv_T0_res InvIntTable - -static void limit_T0_voiced2( Word16 res, const Word16 *T_op, Word16 *T0_min, Word16 *T0_min_frac, Word16 *T0_max, Word16 *T0_max_frac, Word16 pit_min, Word16 pit_max, Word16 i_subfr ); - -/*==============================================================================*/ -/* FUNCTION : pit_encode_fx() */ -/*------------------------------------------------------------------------------*/ -/* PURPOSE : Close-loop pitch lag search and pitch lag quantization */ -/* Adaptive excitation construction */ -/*------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) core_brate: core bitrate Q0 */ -/* _ (Word16) Opt_AMR_WB: flag indicating AMR-WB IO mode Q0 */ -/* _ (Word16) bwidth : input signal bandwidth Q0 */ -/* _ (Word16[]) T_op : open loop pitch estimates in current frame Q0 */ -/* _ (Word16) T0_min : lower limit for close-loop search Q0 */ -/* _ (Word16) T0_max : higher limit for close-loop search Q0 */ -/* _ (Word16) T0 : close loop integer pitch Q0 */ -/* _ (Word16) T0_frac : close loop fractional part of the pitch Q0 */ -/* _ (Word16) L_frame_fx : length of the frame Q0 */ -/* _ (Word16[]) h1 : weighted filter input response Q15 */ -/* _ (Word16[]) xn : target vector Q_new */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) i_subfr : current sub frame indicator Q0 */ -/* _ (Word16[]) exc_fx : pointer to excitation signal frame Q_new */ -/* _ (Word16[]) L_subfr : subframe length Q0 */ -/*------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q0) */ -/* _ (Word16) T0_min : lower limit for close-loop search Q0 */ -/* _ (Word16) T0_max : higher limit for close-loop search Q0 */ -/* _ (Word16) T0 : close loop integer pitch Q0 */ -/* _ (Word16) T0_frac : close loop fractional part of the pitch Q0 */ -/*------------------------------------------------------------------------------*/ - -/*------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*==============================================================================*/ - -Word16 pit_encode_fx( /* o : Fractional pitch for each subframe */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 pitch_bits[], /* i : pitch bits */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 coder_type, /* i : coding type */ - Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ - const Word16 i_subfr, /* i : subframe index */ - Word16 *exc, /* i/o: pointer to excitation signal frame */ - const Word16 L_subfr, /* i : subframe length */ - const Word16 *pitch, /* i : open loop pitch estimates in current frame */ - Word16 *T0_min, /* i/o: lower limit for close-loop search */ - Word16 *T0_max, /* i/o: higher limit for close-loop search */ - Word16 *T0, /* i/o: close loop integer pitch */ - Word16 *T0_frac, /* i/o: close loop fractional part of the pitch */ - const Word16 *h1, /* i : weighted filter input response */ - const Word16 *xn, /* i : target vector */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ -) -{ - Word16 pitch_cl; - Word16 pit_flag, delta, mult_Top, nBits; - Word16 L_sufr_sft; - Word16 T_op[2]; /* values for two half-frames */ -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING - (void) tdm_Pitch_reuse_flag; -#endif - - L_sufr_sft = 6; - move16(); - if ( EQ_16( L_subfr, 2 * L_SUBFR ) ) - { - L_sufr_sft = 7; - move16(); - } - - /*----------------------------------------------------------------* - * convert pitch values to 16kHz domain - *----------------------------------------------------------------*/ - test(); - test(); - IF( EQ_16( L_frame, L_FRAME ) || ( tdm_Pri_pitch_buf != NULL && tdm_Pri_pitch_buf[0] < 0 ) ) - { - Copy( pitch, T_op, 2 ); - } - ELSE /* L_frame == L_FRAME16k */ - { - /*T_op[0] = (int16_t)(pitch[0] * 1.25f + 0.5f); - T_op[1] = (int16_t)(pitch[1] * 1.25f + 0.5f);*/ - T_op[0] = shr( add( round_fx( L_shl( L_mult( 20480, pitch[0] ), 2 ) ), 1 ), 1 ); - move16(); - T_op[1] = shr( add( round_fx( L_shl( L_mult( 20480, pitch[1] ), 2 ) ), 1 ), 1 ); - move16(); - } - - /*----------------------------------------------------------------* - * Set pit_flag to 0 for every subframe with absolute pitch search - *----------------------------------------------------------------*/ - pit_flag = i_subfr; - move16(); - if ( EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - pit_flag = 0; - move16(); - } - - /*-----------------------------------------------------------------* - * Limit range of pitch search - * Fractional pitch search - * Pitch quantization - *-----------------------------------------------------------------*/ - mult_Top = 1; - move16(); - - IF( !Opt_AMR_WB ) - { - /*----------------------------------------------------------------* - * pitch Q: Set limit_flag to 0 for restrained limits, and 1 for extended limits - *----------------------------------------------------------------*/ - test(); - test(); - IF( i_subfr == 0 ) - { - *limit_flag = 1; - move16(); - if ( EQ_16( coder_type, VOICED ) ) - { - *limit_flag = 2; - move16(); /* double-extended limits */ - } - test(); - if ( EQ_16( coder_type, GENERIC ) && EQ_32( core_brate, ACELP_7k20 ) ) - { - *limit_flag = 0; - move16(); - } - } - ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) && EQ_16( coder_type, GENERIC ) && LE_32( core_brate, ACELP_13k20 ) ) - { - /*if( *T0 > (PIT_FR1_EXTEND_8b + PIT_MIN)>>1 )*/ - if ( GT_16( *T0, shr( add( PIT_FR1_EXTEND_8b, PIT_MIN ), 1 ) ) ) - { - *limit_flag = 0; - move16(); - } - } - - IF( *limit_flag == 0 ) - { - test(); - test(); - IF( i_subfr == 0 && LT_16( T_op[0], PIT_MIN ) ) - { - mult_Top = 2; - move16(); - } - ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) && LT_16( T_op[1], PIT_MIN ) ) - { - mult_Top = 2; - move16(); - } - } - /*-------------------------------------------------------* - * Retrieve the number of Q bits - *-------------------------------------------------------*/ - nBits = 0; - move16(); - IF( NE_16( coder_type, AUDIO ) ) - { - nBits = pitch_bits[i_subfr >> L_sufr_sft]; - move16(); - } - IF( EQ_16( coder_type, AUDIO ) ) - { - /*-------------------------------------------------------* - * Pitch encoding in AUDIO coder type - * (both ACELP@12k8 and ACELP@16k cores) - *-------------------------------------------------------*/ - - delta = 4; - move16(); - test(); - test(); - if ( EQ_16( L_subfr, shr( L_frame, 1 ) ) && i_subfr != 0 && EQ_16( L_frame, L_FRAME ) ) - { - pit_flag = L_SUBFR; - move16(); - } - IF( pit_flag == 0 ) - { - nBits = 10; - move16(); - } - ELSE - { - nBits = 6; - move16(); - } - - /* pitch lag search limitation */ - test(); - IF( i_subfr == 0 ) - { - limit_T0_fx( L_frame, delta, pit_flag, *limit_flag, mult_Top * T_op[0], 0, T0_min, T0_max ); - } - ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) && pit_flag == 0 ) - { - limit_T0_fx( L_frame, delta, pit_flag, *limit_flag, mult_Top * T_op[1], 0, T0_min, T0_max ); - } - - /* search and encode the closed loop pitch period */ - *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MAX, PIT_MAX, L_FRAME, L_subfr ); - move16(); - pit_Q_enc_fx( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); - } - ELSE IF( EQ_16( coder_type, VOICED ) ) - { - /*-------------------------------------------------------* - * Pitch encoding in VOICED code type (ACELP@12k8 core only) - *-------------------------------------------------------*/ - - delta = 4; - move16(); - if ( EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - pit_flag = i_subfr; - move16(); - } - - /* pitch lag search limitation */ - IF( i_subfr == 0 ) - { - limit_T0_fx( L_FRAME, delta, pit_flag, *limit_flag, mult_Top * T_op[0], 0, T0_min, T0_max ); - } - - /* search and encode the closed loop pitch period */ - - test(); - IF( EQ_16( nBits, 9 ) || EQ_16( nBits, 5 ) ) - { - *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_DOUBLEEXTEND_9b, PIT_FR1_DOUBLEEXTEND_9b, L_FRAME, L_SUBFR ); - move16(); - } - ELSE IF( EQ_16( nBits, 10 ) ) - { - *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MAX, PIT_MAX, L_FRAME, L_SUBFR ); - move16(); - } - - pit_Q_enc_fx( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); - } - ELSE - { - /*-------------------------------------------------------* - * Pitch encoding in GENERIC coder type - * (both ACELP@12k8 and ACELP@16k cores) - *-------------------------------------------------------*/ - - delta = 8; - move16(); - - /* pitch lag search limitation */ - IF( i_subfr == 0 ) - { - limit_T0_fx( L_frame, delta, pit_flag, *limit_flag, mult_Top * T_op[0], 0, T0_min, T0_max ); - } - ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - limit_T0_fx( L_frame, delta, pit_flag, *limit_flag, mult_Top * T_op[1], 0, T0_min, T0_max ); - } - - /* search and encode the closed loop pitch period */ - IF( EQ_16( L_frame, L_FRAME ) ) - { - test(); - test(); - IF( EQ_16( nBits, 8 ) || EQ_16( nBits, 5 ) ) - { - IF( *limit_flag == 0 ) - { - *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); - move16(); - } - ELSE - { - *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN_EXTEND, PIT_FR1_EXTEND_8b, L_FRAME, L_SUBFR ); - move16(); - } - } - ELSE IF( EQ_16( nBits, 9 ) || EQ_16( nBits, 6 ) ) - { - IF( *limit_flag == 0 ) - { - *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR ); - move16(); - } - ELSE - { - *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_EXTEND_9b, PIT_FR1_EXTEND_9b, L_FRAME, L_SUBFR ); - move16(); - } - } - ELSE IF( EQ_16( nBits, 10 ) ) - { - *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MAX, PIT_MAX, L_FRAME, L_SUBFR ); - move16(); - } - - pit_Q_enc_fx( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); - } - ELSE /* L_frame == L_FRAME16k */ - { - test(); - IF( EQ_16( nBits, 9 ) || EQ_16( nBits, 6 ) ) - { - *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT16k_FR2_EXTEND_9b, PIT16k_FR1_EXTEND_9b, L_FRAME16k, L_SUBFR ); - move16(); - } - ELSE IF( EQ_16( nBits, 10 ) ) - { - *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, L_FRAME16k, L_SUBFR ); - move16(); - } - - pit16k_Q_enc_fx( hBstr, nBits, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); - } - } - } - - /*-------------------------------------------------------* - * Pitch encoding in AMR-WB IO mode - *-------------------------------------------------------*/ - - ELSE - { - delta = 8; - move16(); - *limit_flag = 0; - move16(); - - IF( EQ_32( core_brate, ACELP_6k60 ) ) - { - nBits = 5; - move16(); - - /* pitch lag search limitation */ - IF( i_subfr == 0 ) - { - limit_T0_fx( L_FRAME, delta, pit_flag, *limit_flag, i_mult2( mult_Top, T_op[0] ), 0, T0_min, T0_max ); - nBits = 8; - move16(); - } - - if ( EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - /* rewrite pit_flag - it must not be zero */ - pit_flag = i_subfr; - move16(); - } - - /* search and encode the closed loop pitch period */ - *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); - move16(); - } - ELSE IF( EQ_32( core_brate, ACELP_8k85 ) ) - { - nBits = 5; - move16(); - - /* pitch lag search limitation */ - IF( i_subfr == 0 ) - { - limit_T0_fx( L_FRAME, delta, pit_flag, *limit_flag, i_mult2( mult_Top, T_op[0] ), 0, T0_min, T0_max ); - nBits = 8; - move16(); - } - ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - limit_T0_fx( L_FRAME, delta, pit_flag, *limit_flag, i_mult2( mult_Top, T_op[1] ), 0, T0_min, T0_max ); - nBits = 8; - move16(); - } - - /* search and encode the closed loop pitch period */ - *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); - move16(); - } - ELSE - { - nBits = 6; - move16(); - - /* pitch lag search limitation */ - IF( i_subfr == 0 ) - { - limit_T0_fx( L_FRAME, delta, pit_flag, *limit_flag, i_mult2( mult_Top, T_op[0] ), 0, T0_min, T0_max ); - nBits = 9; - move16(); - } - ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - limit_T0_fx( L_FRAME, delta, pit_flag, *limit_flag, i_mult2( mult_Top, T_op[1] ), 0, T0_min, T0_max ); - nBits = 9; - move16(); - } - ELSE - { - limit_T0_fx( L_FRAME, delta, pit_flag, 0, *T0, 0, T0_min, T0_max ); /* T0_frac==0 to keep IO with AMR-WB */ - } +#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx_enc.h" /* Function prototypes */ +#include "prot_fx_enc.h" /* Function prototypes */ - /* search and encode the closed loop pitch period */ - *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR ); - move16(); - } - pit_Q_enc_fx( hBstr, 1, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); - } +#define inv_T0_res InvIntTable - /*-------------------------------------------------------* - * Compute floating pitch output - *-------------------------------------------------------*/ +static void limit_T0_voiced2( Word16 res, const Word16 *T_op, Word16 *T0_min, Word16 *T0_min_frac, Word16 *T0_max, Word16 *T0_max_frac, Word16 pit_min, Word16 pit_max, Word16 i_subfr ); - /*pitch = (float)(*T0) + (float)(*T0_frac)/4.0f;*/ /* save subframe pitch values */ - pitch_cl = shl( add( shl( *T0, 2 ), *T0_frac ), 4 ); /* save subframe pitch values Q6 */ +/*==============================================================================*/ +/* FUNCTION : pit_encode_fx() */ +/*------------------------------------------------------------------------------*/ +/* PURPOSE : Close-loop pitch lag search and pitch lag quantization */ +/* Adaptive excitation construction */ +/*------------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* _ (Word16) core_brate: core bitrate Q0 */ +/* _ (Word16) Opt_AMR_WB: flag indicating AMR-WB IO mode Q0 */ +/* _ (Word16) bwidth : input signal bandwidth Q0 */ +/* _ (Word16[]) T_op : open loop pitch estimates in current frame Q0 */ +/* _ (Word16) T0_min : lower limit for close-loop search Q0 */ +/* _ (Word16) T0_max : higher limit for close-loop search Q0 */ +/* _ (Word16) T0 : close loop integer pitch Q0 */ +/* _ (Word16) T0_frac : close loop fractional part of the pitch Q0 */ +/* _ (Word16) L_frame_fx: length of the frame Q0 */ +/* _ (Word16[]) h1 : weighted filter input response Q15 */ +/* _ (Word16[]) xn : target vector Q_new */ +/* _ (Word16) coder_type: coding type Q0 */ +/* _ (Word16) i_subfr : current sub frame indicator Q0 */ +/* _ (Word16[]) exc_fx : pointer to excitation signal frame Q_new */ +/* _ (Word16[]) L_subfr : subframe length Q0 */ +/*------------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) exc_fx : adapt. excitation exc (Q0) */ +/* _ (Word16) T0_min : lower limit for close-loop search Q0 */ +/* _ (Word16) T0_max : higher limit for close-loop search Q0 */ +/* _ (Word16) T0 : close loop integer pitch Q0 */ +/* _ (Word16) T0_frac : close loop fractional part of the pitch Q0 */ +/*------------------------------------------------------------------------------*/ - return pitch_cl; -} +/*------------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*==============================================================================*/ -Word16 pit_encode_ivas_fx( /* o : Fractional pitch for each subframe */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 pitch_bits[], /* i : pitch bits */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 coder_type, /* i : coding type */ - Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ - const Word16 i_subfr, /* i : subframe index */ - Word16 *exc, /* i/o: pointer to excitation signal frame Q_new */ - const Word16 L_subfr, /* i : subframe length */ - const Word16 *pitch, /* i : open loop pitch estimates in current frame */ - Word16 *T0_min, /* i/o: lower limit for close-loop search */ - Word16 *T0_max, /* i/o: higher limit for close-loop search */ - Word16 *T0, /* i/o: close loop integer pitch */ - Word16 *T0_frac, /* i/o: close loop fractional part of the pitch */ - const Word16 *h1, /* i : weighted filter input response Q(14 - norm_s(h1[0]) */ - const Word16 *xn, /* i : target vector Q_new */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer */ - Word16 Q_new /* i */ +/* o : Fractional pitch for each subframe */ +Word16 pit_encode_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 pitch_bits[], /* i : pitch bits */ + const Word32 core_brate, /* i : core bitrate */ + const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const Word16 L_frame, /* i : length of the frame */ + const Word16 coder_type, /* i : coding type */ + Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ + const Word16 i_subfr, /* i : subframe index */ + Word16 *exc, /* i/o: pointer to excitation signal frame */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 *pitch, /* i : open loop pitch estimates in current frame */ + Word16 *T0_min, /* i/o: lower limit for close-loop search */ + Word16 *T0_max, /* i/o: higher limit for close-loop search */ + Word16 *T0, /* i/o: close loop integer pitch */ + Word16 *T0_frac, /* i/o: close loop fractional part of the pitch */ + const Word16 *h1, /* i : weighted filter input response */ + const Word16 *xn, /* i : target vector */ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer */ + const Word16 element_mode, /* i : mode element */ + const Word16 Q_new /* i : scaling factor */ ) { Word16 pitch_cl; Word16 pit_flag, delta, mult_Top, nBits; Word16 L_sufr_sft; Word16 T_op[2]; /* values for two half-frames */ - L_sufr_sft = 6; move16(); if ( EQ_16( L_subfr, 2 * L_SUBFR ) ) @@ -502,6 +113,7 @@ Word16 pit_encode_ivas_fx( /* o : Fractional /*----------------------------------------------------------------* * Set pit_flag to 0 for every subframe with absolute pitch search *----------------------------------------------------------------*/ + pit_flag = i_subfr; move16(); if ( EQ_16( i_subfr, 2 * L_SUBFR ) ) @@ -515,6 +127,7 @@ Word16 pit_encode_ivas_fx( /* o : Fractional * Fractional pitch search * Pitch quantization *-----------------------------------------------------------------*/ + mult_Top = 1; move16(); @@ -566,16 +179,18 @@ Word16 pit_encode_ivas_fx( /* o : Fractional move16(); } } + /*-------------------------------------------------------* * Retrieve the number of Q bits *-------------------------------------------------------*/ + nBits = 0; move16(); IF( NE_16( coder_type, AUDIO ) ) { nBits = pitch_bits[i_subfr >> L_sufr_sft]; + move16(); } - test(); IF( EQ_16( coder_type, AUDIO ) ) { /*-------------------------------------------------------* @@ -615,9 +230,10 @@ Word16 pit_encode_ivas_fx( /* o : Fractional } /* search and encode the closed loop pitch period */ - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MAX, PIT_MAX, L_FRAME, L_subfr, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MAX, PIT_MAX, L_FRAME, L_subfr, element_mode, Q_new ); move16(); - pit_Q_enc_ivas_fx( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); + + pit_Q_enc_fx( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); } ELSE IF( EQ_16( coder_type, VOICED ) ) { @@ -640,19 +256,20 @@ Word16 pit_encode_ivas_fx( /* o : Fractional } /* search and encode the closed loop pitch period */ + test(); IF( EQ_16( nBits, 9 ) || EQ_16( nBits, 5 ) ) { - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_DOUBLEEXTEND_9b, PIT_FR1_DOUBLEEXTEND_9b, L_FRAME, L_SUBFR, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_DOUBLEEXTEND_9b, PIT_FR1_DOUBLEEXTEND_9b, L_FRAME, L_SUBFR, element_mode, Q_new ); move16(); } ELSE IF( EQ_16( nBits, 10 ) ) { - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MAX, PIT_MAX, L_FRAME, L_SUBFR, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MAX, PIT_MAX, L_FRAME, L_SUBFR, element_mode, Q_new ); move16(); } - pit_Q_enc_ivas_fx( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); + pit_Q_enc_fx( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); } ELSE IF( EQ_16( tdm_Pitch_reuse_flag, 1 ) || EQ_16( nBits, 4 ) ) { @@ -685,17 +302,20 @@ Word16 pit_encode_ivas_fx( /* o : Fractional /* pitch lag search limitation */ limit_T0_fx( L_FRAME, delta, pit_flag, *limit_flag, loc_T0, loc_frac, T0_min, T0_max ); + IF( nBits > 0 ) { /* search and encode the closed loop pitch period */ - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, element_mode, Q_new ); move16(); + IF( EQ_16( delta, 8 ) ) { *T0_frac = 0; move16(); } - pit_Q_enc_ivas_fx( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); + + pit_Q_enc_fx( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); } ELSE { @@ -734,12 +354,12 @@ Word16 pit_encode_ivas_fx( /* o : Fractional { IF( *limit_flag == 0 ) { - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, element_mode, Q_new ); move16(); } ELSE { - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN_EXTEND, PIT_FR1_EXTEND_8b, L_FRAME, L_SUBFR, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN_EXTEND, PIT_FR1_EXTEND_8b, L_FRAME, L_SUBFR, element_mode, Q_new ); move16(); } } @@ -747,37 +367,38 @@ Word16 pit_encode_ivas_fx( /* o : Fractional { IF( *limit_flag == 0 ) { - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR, element_mode, Q_new ); move16(); } ELSE { - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_EXTEND_9b, PIT_FR1_EXTEND_9b, L_FRAME, L_SUBFR, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_EXTEND_9b, PIT_FR1_EXTEND_9b, L_FRAME, L_SUBFR, element_mode, Q_new ); move16(); } } ELSE IF( EQ_16( nBits, 10 ) ) { - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MAX, PIT_MAX, L_FRAME, L_SUBFR, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MAX, PIT_MAX, L_FRAME, L_SUBFR, element_mode, Q_new ); + move16(); } - pit_Q_enc_ivas_fx( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); + pit_Q_enc_fx( hBstr, 0, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); } ELSE /* L_frame == L_FRAME16k */ { test(); IF( EQ_16( nBits, 9 ) || EQ_16( nBits, 6 ) ) { - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT16k_FR2_EXTEND_9b, PIT16k_FR1_EXTEND_9b, L_FRAME16k, L_SUBFR, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT16k_FR2_EXTEND_9b, PIT16k_FR1_EXTEND_9b, L_FRAME16k, L_SUBFR, element_mode, Q_new ); move16(); } ELSE IF( EQ_16( nBits, 10 ) ) { - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, L_FRAME16k, L_SUBFR, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, L_FRAME16k, L_SUBFR, element_mode, Q_new ); move16(); } - pit16k_Q_enc_ivas_fx( hBstr, nBits, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); + pit16k_Q_enc_fx( hBstr, nBits, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); } } } @@ -814,7 +435,7 @@ Word16 pit_encode_ivas_fx( /* o : Fractional } /* search and encode the closed loop pitch period */ - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, element_mode, Q_new ); move16(); } ELSE IF( EQ_32( core_brate, ACELP_8k85 ) ) @@ -837,7 +458,7 @@ Word16 pit_encode_ivas_fx( /* o : Fractional } /* search and encode the closed loop pitch period */ - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, element_mode, Q_new ); move16(); } ELSE @@ -864,11 +485,11 @@ Word16 pit_encode_ivas_fx( /* o : Fractional } /* search and encode the closed loop pitch period */ - *T0 = pitch_fr4_ivas_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR, Q_new ); + *T0 = pitch_fr4_fx( &exc[i_subfr], xn, h1, *T0_min, *T0_max, T0_frac, pit_flag, *limit_flag, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR, element_mode, Q_new ); move16(); } - pit_Q_enc_ivas_fx( hBstr, 1, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); + pit_Q_enc_fx( hBstr, 1, nBits, delta, pit_flag, *limit_flag, *T0, *T0_frac, T0_min, T0_max ); } /*-------------------------------------------------------* @@ -881,6 +502,7 @@ Word16 pit_encode_ivas_fx( /* o : Fractional return pitch_cl; } + /*-------------------------------------------------------------------* * abs_pit_enc() * @@ -890,11 +512,12 @@ Word16 pit_encode_ivas_fx( /* o : Fractional * fr_step = 4: pitch range encoded with 8 bits *-------------------------------------------------------------------*/ -Word16 abs_pit_enc_fx( /* o : pitch index */ - const Word16 fr_steps, /* i : fractional resolution steps (2 or 4) for shortest pitches*/ - const Word16 limit_flag, /* i : restrained(0) or extended(1) limits */ - const Word16 T0, /* i : integer pitch lag */ - const Word16 T0_frac /* i : pitch fraction */ +/* o : pitch index */ +Word16 abs_pit_enc_fx( + const Word16 fr_steps, /* i : fractional resolution steps (2 or 4) for shortest pitches*/ + const Word16 limit_flag, /* i : restrained(0) or extended(1) limits */ + const Word16 T0, /* i : integer pitch lag */ + const Word16 T0_frac /* i : pitch fraction */ ) { Word16 pitch_index = 0; @@ -1039,284 +662,97 @@ Word16 abs_pit_enc_fx( /* o : pitch index * PIT_MIN_DOUBLEEXTEND to PIT_FR2_DOUBLEEXTEND9b-1 resolution 1/4 (frac = 0,1,2 or 3) * PIT_FR2_DOUBLEEXTEND_9b to PIT_FR1_DOOBLEEXTEND9b-1 resolution 1/2 (frac = 0 or 2) * PIT_FR1_DOUBLEEXTEND_9b to PIT_MAX_EXTEND resolution 1 (frac = 0) - *-------------------------------------------------------------------*/ - - IF( LT_16( T0, PIT_FR2_DOUBLEEXTEND_9b ) ) - { - /*pitch_index = T0*4 + T0_frac - (PIT_MIN_DOUBLEEXTEND*4);*/ - pitch_index = add( shl( T0, 2 ), sub( T0_frac, ( PIT_MIN_DOUBLEEXTEND * 4 ) ) ); - } - ELSE IF( LT_16( T0, PIT_FR1_DOUBLEEXTEND_9b ) ) - { - /*pitch_index = T0*2 + (T0_frac>>1) - (PIT_FR2_DOUBLEEXTEND_9b*2) + ((PIT_FR2_DOUBLEEXTEND_9b-PIT_MIN_DOUBLEEXTEND)*4);*/ - pitch_index = add( sub( add( shl( T0, 1 ), shr( T0_frac, 1 ) ), ( PIT_FR2_DOUBLEEXTEND_9b * 2 ) ), ( ( PIT_FR2_DOUBLEEXTEND_9b - PIT_MIN_DOUBLEEXTEND ) * 4 ) ); - } - ELSE - { - /*pitch_index = T0 - PIT_FR1_DOUBLEEXTEND_9b + ((PIT_FR2_DOUBLEEXTEND_9b-PIT_MIN_DOUBLEEXTEND)*4) + ((PIT_FR1_DOUBLEEXTEND_9b-PIT_FR2_DOUBLEEXTEND_9b)*2);*/ - pitch_index = add( add( sub( T0, PIT_FR1_DOUBLEEXTEND_9b ), ( ( PIT_FR2_DOUBLEEXTEND_9b - PIT_MIN_DOUBLEEXTEND ) * 4 ) ), ( ( PIT_FR1_DOUBLEEXTEND_9b - PIT_FR2_DOUBLEEXTEND_9b ) * 2 ) ); - } - } - ELSE /* fr_step == 0 */ - { - /* not used in the codec */ - pitch_index = 0; - move16(); - } - } - - return pitch_index; -} - - -/*-------------------------------------------------------------------* - * delta_pit_enc: - * - * Encode pitch lag differentially from T0_min to T0_max - * with resolution depending on parameter 'fr_step': - * fr_step = 0: resolusion 1 (frac = 0), or - * fr_step = 2: resolusion 1/2 (frac = 0 or 2), or - * fr_step = 4: resolution 1/4 (frac = 0, 1, 2, or 3) - *-------------------------------------------------------------------*/ - -Word16 delta_pit_enc_fx( /* o : pitch index */ - const Word16 fr_steps, /* i : fractional resolution steps (2 or 4)*/ - const Word16 T0, /* i : integer pitch lag */ - const Word16 T0_frac, /* i : pitch fraction */ - const Word16 T0_min /* i : delta search min */ -) -{ - Word16 pitch_index = 0; - move16(); - - IF( fr_steps == 0 ) - { - pitch_index = sub( T0, T0_min ); - } - ELSE IF( EQ_16( fr_steps, 2 ) ) - { - /* pitch_index = (T0 - T0_min) * 2 + (T0_frac>>1);*/ - pitch_index = add( shl( sub( T0, T0_min ), 1 ), shr( T0_frac, 1 ) ); - } - ELSE IF( EQ_16( fr_steps, 4 ) ) - { - /*pitch_index = (T0 - T0_min) * 4 + T0_frac;*/ - pitch_index = add( shl( sub( T0, T0_min ), 2 ), T0_frac ); - } - - return pitch_index; -} - -/*-------------------------------------------------------------------* - * pitch_fr4() - * - * Find the closed loop pitch period with 1/4 subsample resolution. - *-------------------------------------------------------------------*/ -Word16 pitch_fr4_ivas_fx( /* o : chosen integer pitch lag */ - const Word16 exc[], /* i : excitation buffer Q_new */ - const Word16 xn[], /* i : target signal Q_new-1 */ - const Word16 h[], /* i : weighted synthesis filter impulse response Q(14 - norm_s[h[0]) */ - const Word16 t0_min, /* i : minimum value in the searched range. Q0 */ - const Word16 t0_max, /* i : maximum value in the searched range. Q0 */ - Word16 *pit_frac, /* o : chosen fraction (0, 1, 2 or 3) */ - const Word16 i_subfr, /* i : flag to first subframe */ - const Word16 limit_flag, /* i : flag for limits (0=restrained, 1=extended) */ - const Word16 t0_fr2, /* i : minimum value for resolution 1/2 */ - const Word16 t0_fr1, /* i : minimum value for resolution 1 */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 L_subfr, /* i : size of subframe */ - Word16 Q_new /* i */ -) -{ - Word16 i; - Word16 t_min, t_max; - Word16 max_val, t0, t1, fraction, step, temp; - Word16 *corr; - Word16 corr_v[15 + 2 * L_INTERPOL1 + 1]; /* Total length = t0_max-t0_min+1+2*L_inter */ - Word16 pit_min; - Word16 cor_max; - - /* initialization */ - IF( limit_flag == 0 ) - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - pit_min = PIT_MIN; - move16(); - } - ELSE /* L_frame == L_FRAME16k */ - { - pit_min = PIT16k_MIN; - move16(); - } - } - ELSE - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - pit_min = PIT_MIN_EXTEND; - move16(); - IF( EQ_16( limit_flag, 2 ) ) - { - pit_min = PIT_MIN_DOUBLEEXTEND; - move16(); - } - } - ELSE /* L_frame == L_FRAME16k */ - { - pit_min = PIT16k_MIN_EXTEND; - move16(); - } - } - - /*-----------------------------------------------------------------* - * - Find interval to compute normalized correlation - * - allocate memory to normalized correlation vector - * - Compute normalized correlation between target and filtered - * excitation - *-----------------------------------------------------------------*/ - - t_min = sub( t0_min, L_INTERPOL1 ); - t_max = add( t0_max, L_INTERPOL1 ); - corr = &corr_v[-t_min]; - move16(); - move16(); /* corr[t_min..t_max] */ - - norm_corr_ivas_fx( exc, xn, h, t_min, t_max, corr, L_subfr, Q_new ); - - /*-----------------------------------------------------------------* - * Find integer pitch - *-----------------------------------------------------------------*/ - - max_val = corr[t0_min]; - move16(); - t0 = t0_min; - move16(); - - FOR( i = add( t0_min, 1 ); i <= t0_max; i++ ) - { - if ( GE_16( corr[i], max_val ) ) - { - t0 = i; - move16(); - } - max_val = s_max( corr[i], max_val ); - } - - IF( EQ_16( t0_fr1, pit_min ) ) - { - /* don't search fraction (for 7b/4b quant) */ - test(); - IF( ( i_subfr == 0 ) && ( GE_16( t0, t0_fr2 ) ) ) - { - i = shl( shr( t0, 1 ), 1 ); /* 2 samples resolution */ - if ( GT_16( add( i, 2 ), PIT_MAX ) ) - { - i = sub( i, 2 ); - } - IF( GT_16( corr[i], corr[i + 2] ) ) - { - t0 = i; - move16(); - } - ELSE - { - t0 = add( i, 2 ); - } - } - *pit_frac = 0; - move16(); - - return ( t0 ); - } - - test(); - IF( ( i_subfr == 0 ) && ( GE_16( t0, t0_fr1 ) ) ) - { - *pit_frac = 0; - move16(); - - return ( t0 ); - } - - /*------------------------------------------------------------------* - * Search fractionnal pitch with 1/4 subsample resolution. - * search the fractions around t0 and choose the one which maximizes - * the interpolated normalized correlation. - *-----------------------------------------------------------------*/ - - t1 = t0; - move16(); - step = 1; - move16(); /* 1/4 subsample resolution */ - fraction = 1; - move16(); - test(); - test(); - IF( ( ( i_subfr == 0 ) && ( GE_16( t0, t0_fr2 ) ) ) || ( EQ_16( t0_fr2, pit_min ) ) ) - { - step = 2; - move16(); /* 1/2 subsample resolution */ - fraction = 2; - move16(); - } - - IF( EQ_16( t0, t0_min ) ) /* Limit case */ - { - fraction = 0; - move16(); - cor_max = Interpol_4( &corr[t0], fraction ); - } - ELSE - { - t0 = sub( t0, 1 ); - cor_max = Interpol_4( &corr[t0], fraction ); - FOR( i = add( fraction, step ); i <= 3; i = (Word16) ( i + step ) ) - { - temp = Interpol_4( &corr[t0], i ); - IF( GT_16( temp, cor_max ) ) + *-------------------------------------------------------------------*/ + + IF( LT_16( T0, PIT_FR2_DOUBLEEXTEND_9b ) ) { - cor_max = temp; - move16(); - fraction = i; - move16(); + /*pitch_index = T0*4 + T0_frac - (PIT_MIN_DOUBLEEXTEND*4);*/ + pitch_index = add( shl( T0, 2 ), sub( T0_frac, ( PIT_MIN_DOUBLEEXTEND * 4 ) ) ); + } + ELSE IF( LT_16( T0, PIT_FR1_DOUBLEEXTEND_9b ) ) + { + /*pitch_index = T0*2 + (T0_frac>>1) - (PIT_FR2_DOUBLEEXTEND_9b*2) + ((PIT_FR2_DOUBLEEXTEND_9b-PIT_MIN_DOUBLEEXTEND)*4);*/ + pitch_index = add( sub( add( shl( T0, 1 ), shr( T0_frac, 1 ) ), ( PIT_FR2_DOUBLEEXTEND_9b * 2 ) ), ( ( PIT_FR2_DOUBLEEXTEND_9b - PIT_MIN_DOUBLEEXTEND ) * 4 ) ); + } + ELSE + { + /*pitch_index = T0 - PIT_FR1_DOUBLEEXTEND_9b + ((PIT_FR2_DOUBLEEXTEND_9b-PIT_MIN_DOUBLEEXTEND)*4) + ((PIT_FR1_DOUBLEEXTEND_9b-PIT_FR2_DOUBLEEXTEND_9b)*2);*/ + pitch_index = add( add( sub( T0, PIT_FR1_DOUBLEEXTEND_9b ), ( ( PIT_FR2_DOUBLEEXTEND_9b - PIT_MIN_DOUBLEEXTEND ) * 4 ) ), ( ( PIT_FR1_DOUBLEEXTEND_9b - PIT_FR2_DOUBLEEXTEND_9b ) * 2 ) ); } } - } - - FOR( i = 0; i <= 3; i = (Word16) ( i + step ) ) - { - temp = Interpol_4( &corr[t1], i ); - IF( GT_16( temp, cor_max ) ) + ELSE /* fr_step == 0 */ { - cor_max = temp; - move16(); - fraction = i; - move16(); - t0 = t1; + /* not used in the codec */ + pitch_index = 0; move16(); } } - *pit_frac = fraction; + return pitch_index; +} + + +/*-------------------------------------------------------------------* + * delta_pit_enc: + * + * Encode pitch lag differentially from T0_min to T0_max + * with resolution depending on parameter 'fr_step': + * fr_step = 0: resolusion 1 (frac = 0), or + * fr_step = 2: resolusion 1/2 (frac = 0 or 2), or + * fr_step = 4: resolution 1/4 (frac = 0, 1, 2, or 3) + *-------------------------------------------------------------------*/ + +/* o : pitch index */ +Word16 delta_pit_enc_fx( + const Word16 fr_steps, /* i : fractional resolution steps (2 or 4)*/ + const Word16 T0, /* i : integer pitch lag */ + const Word16 T0_frac, /* i : pitch fraction */ + const Word16 T0_min /* i : delta search min */ +) +{ + Word16 pitch_index = 0; move16(); - return ( t0 ); + IF( fr_steps == 0 ) + { + pitch_index = sub( T0, T0_min ); + } + ELSE IF( EQ_16( fr_steps, 2 ) ) + { + /* pitch_index = (T0 - T0_min) * 2 + (T0_frac>>1);*/ + pitch_index = add( shl( sub( T0, T0_min ), 1 ), shr( T0_frac, 1 ) ); + } + ELSE IF( EQ_16( fr_steps, 4 ) ) + { + /*pitch_index = (T0 - T0_min) * 4 + T0_frac;*/ + pitch_index = add( shl( sub( T0, T0_min ), 2 ), T0_frac ); + } + + return pitch_index; } -Word16 pitch_fr4_fx( /* o : chosen integer pitch lag */ - const Word16 exc[], /* i : excitation buffer Q_new*/ - const Word16 xn[], /* i : target signal Q_new-1+shift*/ - const Word16 h[], /* i : weighted synthesis filter impulse response Q(14+shift)*/ - const Word16 t0_min, /* i : minimum value in the searched range. Q0*/ - const Word16 t0_max, /* i : maximum value in the searched range. Q0*/ - Word16 *pit_frac, /* o : chosen fraction (0, 1, 2 or 3) */ - const Word16 i_subfr, /* i : flag to first subframe */ - const Word16 limit_flag, /* i : flag for limits (0=restrained, 1=extended) */ - const Word16 t0_fr2, /* i : minimum value for resolution 1/2 */ - const Word16 t0_fr1, /* i : minimum value for resolution 1 */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 L_subfr /* i : size of subframe */ +/*-------------------------------------------------------------------* + * pitch_fr4() + * + * Find the closed loop pitch period with 1/4 subsample resolution. + *-------------------------------------------------------------------*/ + +/* o : chosen integer pitch lag */ +Word16 pitch_fr4_fx( + const Word16 exc[], /* i : excitation buffer Q_new*/ + const Word16 xn[], /* i : target signal Q_new-1+shift*/ + const Word16 h[], /* i : weighted synthesis filter impulse response Q(14+shift)*/ + const Word16 t0_min, /* i : minimum value in the searched range. Q0*/ + const Word16 t0_max, /* i : maximum value in the searched range. Q0*/ + Word16 *pit_frac, /* o : chosen fraction (0, 1, 2 or 3) */ + const Word16 i_subfr, /* i : flag to first subframe */ + const Word16 limit_flag, /* i : flag for limits (0=restrained, 1=extended) */ + const Word16 t0_fr2, /* i : minimum value for resolution 1/2 */ + const Word16 t0_fr1, /* i : minimum value for resolution 1 */ + const Word16 L_frame, /* i : length of the frame */ + const Word16 L_subfr, /* i : size of subframe */ + const Word16 element_mode, /* i : mode element */ + const Word16 Q_new /* i : scaling factor */ ) { Word16 i; @@ -1371,8 +807,14 @@ Word16 pitch_fr4_fx( /* o : chosen integer pitch lag t_max = add( t0_max, L_INTERPOL1 ); corr = &corr_v[-t_min]; /* corr[t_min..t_max] */ - - norm_corr_fx( exc, xn, h, t_min, t_max, corr, L_subfr ); + if ( element_mode > EVS_MONO ) + { + norm_corr_ivas_fx( exc, xn, h, t_min, t_max, corr, L_subfr, Q_new ); + } + else + { + norm_corr_fx( exc, xn, h, t_min, t_max, corr, L_subfr ); + } /*-----------------------------------------------------------------* * Find integer pitch @@ -1494,6 +936,7 @@ Word16 pitch_fr4_fx( /* o : chosen integer pitch lag return ( t0 ); } + /*-------------------------------------------------------------------* * norm_corr() * @@ -1502,6 +945,7 @@ Word16 pitch_fr4_fx( /* o : chosen integer pitch lag * excitation divided by the square root of energy of filtered * excitation) *---------------------------------------------------------------------*/ + void norm_corr_ivas_fx( const Word16 exc[], /* i : excitation buffer Q_new */ const Word16 xn[], /* i : target signal Q_new-1 */ @@ -1520,13 +964,10 @@ void norm_corr_ivas_fx( Word16 h_e, e_max; Word32 L_tmp; Word64 W_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif k = negate( t_min ); h_e = add( 1, norm_s( h[0] ) ); // exponent of h + /*-----------------------------------------------------------------* * compute the filtered excitation for the first delay t_min *-----------------------------------------------------------------*/ @@ -1540,11 +981,10 @@ void norm_corr_ivas_fx( FOR( t = t_min; t <= t_max; t++ ) { /* Compute correlation between xn[] and excf[] */ - L_tmp = L_mac( 0, xn[0], excf[0] ); FOR( i = 1; i < L_subfr; i++ ) { - L_tmp = L_mac_o( L_tmp, xn[i], excf[i], &Overflow ); // (Q_new - 1) + (Q_new - h_e) + 1 + L_tmp = L_mac_sat( L_tmp, xn[i], excf[i] ); // (Q_new - 1) + (Q_new - h_e) + 1 } exp = norm_l( L_tmp ); L_tmp = L_shl( L_tmp, exp ); @@ -1615,10 +1055,6 @@ void norm_corr_fx( Word16 corr, exp_corr, norm, exp_norm, exp, scale; Word16 excf[L_FRAME16k]; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif k = negate( t_min ); @@ -1629,10 +1065,10 @@ void norm_corr_fx( conv_fx( &exc[k], h, excf, L_subfr ); /* Compute rounded down 1/sqrt(energy of xn[]) */ - L_tmp = L_mac_o( 1, xn[0], xn[0], &Overflow ); + L_tmp = L_mac_sat( 1, xn[0], xn[0] ); FOR( i = 1; i < L_subfr; i++ ) { - L_tmp = L_mac_o( L_tmp, xn[i], xn[i], &Overflow ); + L_tmp = L_mac_sat( L_tmp, xn[i], xn[i] ); } exp = norm_l( L_tmp ); exp = sub( 30, exp ); @@ -1647,11 +1083,10 @@ void norm_corr_fx( FOR( t = t_min; t <= t_max; t++ ) { /* Compute correlation between xn[] and excf[] */ - L_tmp = L_mac( 1, xn[0], excf[0] ); FOR( i = 1; i < L_subfr; i++ ) { - L_tmp = L_mac_o( L_tmp, xn[i], excf[i], &Overflow ); + L_tmp = L_mac_sat( L_tmp, xn[i], excf[i] ); } exp = norm_l( L_tmp ); L_tmp = L_shl( L_tmp, exp ); @@ -1662,7 +1097,7 @@ void norm_corr_fx( L_tmp = L_mac( 1, excf[0], excf[0] ); FOR( i = 1; i < L_subfr; i++ ) { - L_tmp = L_mac_o( L_tmp, excf[i], excf[i], &Overflow ); + L_tmp = L_mac_sat( L_tmp, excf[i], excf[i] ); } exp = norm_l( L_tmp ); @@ -1696,6 +1131,7 @@ void norm_corr_fx( return; } + /*-------------------------------------------------------------------* * pit_Q_enc() * @@ -1712,100 +1148,7 @@ void pit_Q_enc_fx( const Word16 T0, /* i : integer pitch lag */ const Word16 T0_frac, /* i : pitch fraction */ Word16 *T0_min, /* i/o: delta search min */ - Word16 *T0_max /* o : delta search max_val */ -) -{ - Word16 pitch_index; - - IF( EQ_16( nBits, 10 ) ) /* absolute encoding with 10 bits */ - { - IF( limit_flag == 0 ) - { - /* pitch_index = T0*4 + T0_frac - (PIT_MIN*4);*/ - pitch_index = sub( add( shl( T0, 2 ), T0_frac ), ( PIT_MIN * 4 ) ); - } - ELSE IF( EQ_16( limit_flag, 1 ) ) - { - /*pitch_index = T0*4 + T0_frac - (PIT_MIN_EXTEND*4);*/ - pitch_index = sub( add( shl( T0, 2 ), T0_frac ), ( PIT_MIN_EXTEND * 4 ) ); - } - ELSE /* limit_flag == 2 */ - { - /*pitch_index = T0*4 + T0_frac - (PIT_MIN_DOUBLEEXTEND*4);*/ - pitch_index = sub( add( shl( T0, 2 ), T0_frac ), ( PIT_MIN_DOUBLEEXTEND * 4 ) ); - } - } - ELSE IF( EQ_16( nBits, 9 ) ) /* absolute encoding with 9 bits */ - { - pitch_index = abs_pit_enc_fx( 4, limit_flag, T0, T0_frac ); - - /* find T0_min and T0_max for delta search */ - IF( Opt_AMR_WB ) - { - limit_T0_fx( L_FRAME, delta, pit_flag, 0, T0, 0, T0_min, T0_max ); /* T0_frac==0 to keep IO with AMR-WB */ - } - } - ELSE IF( EQ_16( nBits, 8 ) ) /* absolute encoding with 8 bits */ - { - pitch_index = abs_pit_enc_fx( 2, limit_flag, T0, T0_frac ); - - /* find T0_min and T0_max for delta search */ - IF( Opt_AMR_WB ) - { - limit_T0_fx( L_FRAME, delta, pit_flag, 0, T0, 0, T0_min, T0_max ); /* T0_frac==0 to keep IO with AMR-WB */ - } - } - ELSE IF( EQ_16( nBits, 6 ) ) /* relative encoding with 6 bits */ - { - pitch_index = delta_pit_enc_fx( 4, T0, T0_frac, *T0_min ); - } - ELSE IF( EQ_16( nBits, 5 ) ) /* relative encoding with 5 bits */ - { - IF( EQ_16( delta, 8 ) ) - { - pitch_index = delta_pit_enc_fx( 2, T0, T0_frac, *T0_min ); - } - ELSE /* delta == 4 */ - { - pitch_index = delta_pit_enc_fx( 4, T0, T0_frac, *T0_min ); - } - } - ELSE /* nBits == 4 ) */ /* relative encoding with 4 bits */ - { - IF( EQ_16( delta, 8 ) ) - { - pitch_index = delta_pit_enc_fx( 0, T0, T0_frac, *T0_min ); - } - ELSE /* delta == 4 */ - { - pitch_index = delta_pit_enc_fx( 2, T0, T0_frac, *T0_min ); - } - } - - IF( !Opt_AMR_WB ) - { - /* find T0_min and T0_max for delta search */ - limit_T0_fx( L_FRAME, delta, L_SUBFR, limit_flag, T0, T0_frac, T0_min, T0_max ); - } - - { - push_indice_fx( hBstr, IND_PITCH, pitch_index, nBits ); - } - - return; -} - -void pit_Q_enc_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 nBits, /* i : # of Q bits */ - const Word16 delta, /* i : Half the CL searched interval */ - const Word16 pit_flag, /* i : absolute(0) or delta(1) pitch Q */ - const Word16 limit_flag, /* i : restrained(0) or extended(1) Q limits */ - const Word16 T0, /* i : integer pitch lag */ - const Word16 T0_frac, /* i : pitch fraction */ - Word16 *T0_min, /* i/o: delta search min */ - Word16 *T0_max /* o : delta search max_val */ + Word16 *T0_max /* o : delta search max_val */ ) { Word16 pitch_index; @@ -1888,6 +1231,7 @@ void pit_Q_enc_ivas_fx( return; } + /*-------------------------------------------------------------------* * pit16k_Q_enc() * @@ -1895,85 +1239,13 @@ void pit_Q_enc_ivas_fx( *-------------------------------------------------------------------*/ void pit16k_Q_enc_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 nBits, /* i : # of Q bits */ - const Word16 limit_flag, /* i : restrained(0) or extended(1) Q limits */ - const Word16 T0, /* i : integer pitch lag */ - const Word16 T0_frac, /* i : pitch fraction */ - Word16 *T0_min, /* i/o: delta search min */ - Word16 *T0_max /* o : delta search max_val */ -) -{ - Word16 pitch_index; - - IF( EQ_16( nBits, 10 ) ) /* absolute encoding with 10 bits */ - { - { - IF( LT_16( T0, PIT16k_FR2_EXTEND_10b ) ) - { - /*pitch_index = T0*4 + T0_frac - (PIT16k_MIN_EXTEND*4);*/ - pitch_index = add( shl( T0, 2 ), sub( T0_frac, ( PIT16k_MIN_EXTEND * 4 ) ) ); - } - ELSE - { - /*pitch_index = T0*2 + (T0_frac>>1) - (PIT16k_FR2_EXTEND_10b*2) + ((PIT16k_FR2_EXTEND_10b-PIT16k_MIN_EXTEND)*4);*/ - pitch_index = add( sub( add( shl( T0, 1 ), shr( T0_frac, 1 ) ), ( PIT16k_FR2_EXTEND_10b * 2 ) ), ( ( PIT16k_FR2_EXTEND_10b - PIT16k_MIN_EXTEND ) * 4 ) ); - } - } - - push_indice_fx( hBstr, IND_PITCH, pitch_index, nBits ); - } - ELSE IF( EQ_16( nBits, 9 ) ) /* absolute encoding with 9 bits */ - { - { - /*-------------------------------------------------------------------* - * The pitch range is encoded absolutely with 9 bits - * and is divided as follows: - * PIT16k_EXTEND_MIN to PIT16k_FR2_EXTEND_9b-1 resolution 1/4 (frac = 0,1,2 or 3) - * PIT16k_FR2_EXTEND_9b to PIT16k_FR1_EXTEND_9b-1 resolution 1/2 (frac = 0 or 2) - * PIT16k_FR1_EXTEND_9b to PIT16k_MAX_EXTEND resolution 1 (frac = 0) - *-------------------------------------------------------------------*/ - - IF( LT_16( T0, PIT16k_FR2_EXTEND_9b ) ) - { - /*pitch_index = T0*4 + T0_frac - (PIT16k_MIN_EXTEND*4);*/ - pitch_index = add( shl( T0, 2 ), sub( T0_frac, ( PIT16k_MIN_EXTEND * 4 ) ) ); - } - ELSE IF( LT_16( T0, PIT16k_FR1_EXTEND_9b ) ) - { - /*pitch_index = T0*2 + (T0_frac>>1) - (PIT16k_FR2_EXTEND_9b*2) + ((PIT16k_FR2_EXTEND_9b-PIT16k_MIN_EXTEND)*4);*/ - pitch_index = add( sub( add( shl( T0, 1 ), shr( T0_frac, 1 ) ), ( PIT16k_FR2_EXTEND_9b * 2 ) ), ( ( PIT16k_FR2_EXTEND_9b - PIT16k_MIN_EXTEND ) * 4 ) ); - } - ELSE - { - /*pitch_index = T0 - PIT16k_FR1_EXTEND_9b + ((PIT16k_FR2_EXTEND_9b-PIT16k_MIN_EXTEND)*4) + ((PIT16k_FR1_EXTEND_9b-PIT16k_FR2_EXTEND_9b)*2);*/ - pitch_index = add( add( sub( T0, PIT16k_FR1_EXTEND_9b ), ( ( PIT16k_FR2_EXTEND_9b - PIT16k_MIN_EXTEND ) * 4 ) ), ( ( PIT16k_FR1_EXTEND_9b - PIT16k_FR2_EXTEND_9b ) * 2 ) ); - } - } - - push_indice_fx( hBstr, IND_PITCH, pitch_index, 9 ); - } - ELSE /* nBits == 6 */ /* relative encoding with 6 bits */ - { - /*pitch_index = (T0 - *T0_min) * 4 + T0_frac;*/ - pitch_index = add( shl( sub( T0, *T0_min ), 2 ), T0_frac ); - - push_indice_fx( hBstr, IND_PITCH, pitch_index, nBits ); - } - - limit_T0_fx( L_FRAME16k, 8, L_SUBFR, limit_flag, T0, T0_frac, T0_min, T0_max ); - - return; -} - -void pit16k_Q_enc_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const Word16 nBits, /* i : # of Q bits */ const Word16 limit_flag, /* i : restrained(0) or extended(1) Q limits */ const Word16 T0, /* i : integer pitch lag */ const Word16 T0_frac, /* i : pitch fraction */ Word16 *T0_min, /* i/o: delta search min */ - Word16 *T0_max /* o : delta search max_val */ + Word16 *T0_max /* o : delta search max_val */ ) { Word16 pitch_index; @@ -2038,12 +1310,14 @@ void pit16k_Q_enc_ivas_fx( return; } + /*------------------------------------------------------------------* * pit_encode: * * Close-loop pitch lag search and pitch lag quantization * Adaptive excitation construction *------------------------------------------------------------------*/ + void Mode2_pit_encode_fx( const Word16 coder_type, /* i : coding model */ const Word16 i_subfr, /* i : subframe index */ @@ -2084,6 +1358,7 @@ void Mode2_pit_encode_fx( * - Fractional pitch search * - Pitch quantization *-----------------------------------------------------------------*/ + IF( coder_type == 0 ) /*Unvoiced Coding do nothing*/ { *T0 = L_SUBFR; @@ -2253,6 +1528,7 @@ void Mode2_pit_encode_fx( return; } + static void limit_T0_voiced2( Word16 res, const Word16 *T_op, @@ -2367,8 +1643,11 @@ static void limit_T0_voiced2( *T0_min_frac = sub( temp1, i_mult2( temp2, res ) ); move16(); } + + return; } + /*-------------------------------------------------------------------* * abs_pit_enc: * @@ -2406,6 +1685,8 @@ void Mode2_abs_pit_enc_fx( } ( *pt_indice )++; + + return; } @@ -2425,8 +1706,9 @@ void Mode2_delta_pit_enc_fx( ) { /***pt_indice = (T0 - T0_min) * T0_res + T0_frac - T0_min_frac;*/ - **pt_indice = add( i_mult2( sub( T0, T0_min ), T0_res ), sub( T0_frac, T0_min_frac ) ); move16(); ( *pt_indice )++; + + return; } diff --git a/lib_enc/pitch_ol2_fx.c b/lib_enc/pitch_ol2_fx.c index 7ca13171ea309caea5710891b929962bcc6914b9..c28c4c5aa6507323e306d9875822eca570a98663 100644 --- a/lib_enc/pitch_ol2_fx.c +++ b/lib_enc/pitch_ol2_fx.c @@ -1,17 +1,17 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_enc.h" /* Encoder static table prototypes */ -#include "rom_com_fx.h" /* Encoder static table prototypes */ -#include "rom_com.h" /* Encoder static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_enc.h" /* Encoder static table prototypes */ +#include "rom_com.h" /* Encoder static table prototypes */ #include "rom_dec.h" -//#include "prot_fx.h" /* Function prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*-------------------------------------------------------------------* * Local constants *-------------------------------------------------------------------*/ @@ -36,7 +36,8 @@ void pitch_ol2_fx( const Word16 pos, /* i : position in frame where to calculate the improv. */ const Word16 *wsp_fx, /* i : weighted speech for current frame and look-ahead */ /*Q_new-1+shift*/ - const Word16 delta /* i : delta for pitch search (2 or 7) */ + const Word16 delta, /* i : delta for pitch search (2 or 7) */ + const Word16 element_mode /* i : EVS or IVAS */ ) { Word16 i, t, step, fraction, t0_min, t0_max, t_min, t_max; @@ -49,10 +50,6 @@ void pitch_ol2_fx( Word32 R1, R2; Word16 R0, exp_R0, exp_R1, exp_R2, j; Word16 pit_max; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* initialization */ pit_max = PIT_MAX; @@ -81,8 +78,8 @@ void pitch_ol2_fx( pt_cor_fx = cor_fx; FOR( t = t_min; t <= t_max; t++ ) { - t0 = L_shl_o( *pt_cor_32++, exp3, &Overflow ); - *pt_cor_fx++ = round_fx_o( t0, &Overflow ); + t0 = L_shl_sat( *pt_cor_32++, exp3 ); + *pt_cor_fx++ = round_fx_sat( t0 ); move16(); } @@ -158,7 +155,14 @@ void pitch_ol2_fx( IF( NE_32( t1, 1L ) ) { - pred_lt4( pt_wsp_fx, wsp_fr_fx, t0s, fraction, L_SUBFR, pitch_inter4_1, 4, PIT_UP_SAMP ); + IF( element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( pt_wsp_fx, wsp_fr_fx, t0s, fraction, L_SUBFR, L_pitch_inter4_1, 4, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( pt_wsp_fx, wsp_fr_fx, t0s, fraction, L_SUBFR, pitch_inter4_1, 4, PIT_UP_SAMP ); + } R0 = cor_max_fx; move16(); @@ -181,7 +185,7 @@ void pitch_ol2_fx( exp_R2 = norm_l( R2 ); R2 = L_shl( R2, exp_R2 ); - R1 = L_mult_o( round_fx_o( R1, &Overflow ), round_fx_o( R2, &Overflow ), &Overflow ); + R1 = L_mult_sat( round_fx_sat( R1 ), round_fx_sat( R2 ) ); i = norm_l( R1 ); R1 = L_shl( R1, i ); @@ -191,11 +195,11 @@ void pitch_ol2_fx( R1 = Isqrt_lc( R1, &exp_R1 ); - R1 = L_mult( R0, round_fx_o( R1, &Overflow ) ); + R1 = L_mult( R0, round_fx_sat( R1 ) ); exp_R0 = sub( 31, exp_R0 ); exp_R0 = sub( add( exp_R0, exp_R1 ), exp3 ); - *voicing_fr_fx = round_fx_o( L_shl_o( R1, exp_R0, &Overflow ), &Overflow ); /*Q15*/ + *voicing_fr_fx = round_fx_sat( L_shl_sat( R1, exp_R0 ) ); /*Q15*/ move16(); } ELSE @@ -235,10 +239,6 @@ void StableHighPitchDetect_fx( Word16 tmp, tmp1, exp, diff16, cor_max16, exp1, exp2, pit_min_up; Word32 L_tmp, L_tmp1; Word16 Top; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*voicing = (voicing[0] + voicing[1] + voicing[2] )/3;*/ L_tmp = L_mult( voicing[0], 10923 /*1/3 in Q15*/ ); @@ -286,22 +286,22 @@ void StableHighPitchDetect_fx( tmp = abs_s( tmp ); tmp = div_s( 16384, tmp ); /*Q(15+exp)*/ BASOP_SATURATE_WARNING_OFF_EVS - diff = L_negate( L_shr_o( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ), &Overflow ) ); + diff = L_negate( L_shr_sat( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ) ) ); BASOP_SATURATE_WARNING_ON_EVS - diff16 = round_fx_o( diff, &Overflow ); + diff16 = round_fx_sat( diff ); } ELSE { tmp = div_s( 16384, tmp ); /*Q(15+exp)*/ BASOP_SATURATE_WARNING_OFF_EVS - diff = L_shr_o( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ), &Overflow ); + diff = L_shr_sat( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ) ); BASOP_SATURATE_WARNING_ON_EVS - diff16 = round_fx_o( diff, &Overflow ); + diff16 = round_fx_sat( diff ); } } ELSE { - diff16 = round_fx_o( L_shl_o( diff, 25, &Overflow ), &Overflow ); + diff16 = round_fx_sat( L_shl_sat( diff, 25 ) ); } test(); test(); @@ -378,7 +378,7 @@ void StableHighPitchDetect_fx( L_tmp1 = Isqrt_lc( L_tmp1, &exp ); /*Q(31-exp)*/ cor_max = Mult_32_32( cor_max, L_tmp1 ); exp = 31 - ( shl( Q_new, 1 ) + 1 ) - ( 31 - exp ) + 31; - cor_max16 = round_fx_o( L_shl_o( cor_max, exp, &Overflow ), &Overflow ); /*Q15*/ + cor_max16 = round_fx_sat( L_shl_sat( cor_max, exp ) ); /*Q15*/ /**voicing0_sm = add(mult_r(24576 ,(*voicing0_sm)) , mult_r(8192 , cor_max16));*/ *voicing0_sm = round_fx( L_mac( L_mult( 24576 /*.75f Q15*/, *voicing0_sm ), 8192 /*.25f Q15*/, cor_max16 ) ); move16(); @@ -443,10 +443,6 @@ void StableHighPitchDetect_ivas_fx( Word16 tmp, tmp1, exp, diff16, cor_max16, exp1, exp2, pit_min_up; Word32 L_tmp, L_tmp1; Word16 Top; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*voicing = (voicing[0] + voicing[1] + voicing[2] )/3;*/ L_tmp = L_mult( voicing[0], 10923 /*1/3 in Q15*/ ); @@ -501,22 +497,22 @@ void StableHighPitchDetect_ivas_fx( tmp = abs_s( tmp ); tmp = div_s( 16384, tmp ); /*Q(15+exp)*/ BASOP_SATURATE_WARNING_OFF_EVS - diff = L_negate( L_shr_o( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ), &Overflow ) ); + diff = L_negate( L_shr_sat( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ) ) ); BASOP_SATURATE_WARNING_ON_EVS - diff16 = round_fx_o( diff, &Overflow ); + diff16 = round_fx_sat( diff ); } ELSE { tmp = div_s( 16384, tmp ); /*Q(15+exp)*/ BASOP_SATURATE_WARNING_OFF_EVS - diff = L_shr_o( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ), &Overflow ); + diff = L_shr_sat( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ) ); BASOP_SATURATE_WARNING_ON_EVS - diff16 = round_fx_o( diff, &Overflow ); + diff16 = round_fx_sat( diff ); } } ELSE { - diff16 = round_fx_o( L_shl_o( diff, 25, &Overflow ), &Overflow ); + diff16 = round_fx_sat( L_shl_sat( diff, 25 ) ); } test(); test(); @@ -602,7 +598,7 @@ void StableHighPitchDetect_ivas_fx( L_tmp1 = Isqrt_lc( L_tmp1, &exp ); /*Q(31-exp)*/ cor_max = Mult_32_32( cor_max, L_tmp1 ); exp = add( sub( sub( 31, add( shl( Q_new, 1 ), 1 ) ), sub( 31, exp ) ), 31 ); - cor_max16 = round_fx_o( L_shl_o( cor_max, exp, &Overflow ), &Overflow ); /*Q15*/ + cor_max16 = round_fx_sat( L_shl_sat( cor_max, exp ) ); /*Q15*/ /**voicing0_sm = add(mult_r(24576 ,(*voicing0_sm)) , mult_r(8192 , cor_max16));*/ *voicing0_sm = round_fx( L_mac( L_mult( 24576 /*.75f Q15*/, *voicing0_sm ), 8192 /*.25f Q15*/, cor_max16 ) ); move16(); diff --git a/lib_enc/pitch_ol_fx.c b/lib_enc/pitch_ol_fx.c index 91181714af9242f49697b8f221c167f31d525faf..ab58b31bf72c982784571d6aba066143b4cead9f 100644 --- a/lib_enc/pitch_ol_fx.c +++ b/lib_enc/pitch_ol_fx.c @@ -1,18 +1,17 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" #include "cnst.h" -// #include "prot_fx.h" #include "basop_util.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "rom_enc.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*-----------------------------------------------------------------* * Local Constants *-----------------------------------------------------------------*/ @@ -183,9 +182,6 @@ void pitch_ol_fx( const Word16 *len, *len1, *sublen, *sublen1, *pit_max, *sec_length, *sec_length1; Word16 pit_min_coding; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif /*--------------------------------------------------------------* * Initialization @@ -737,7 +733,7 @@ void pitch_ol_fx( enr1_exp = 0; move16(); - enr1 = add_o( extract_h( dotp_fx( pt2, pt2, len[j], &enr1_exp ) ), 1, &Overflow ); + enr1 = add_sat( extract_h( dotp_fx( pt2, pt2, len[j], &enr1_exp ) ), 1 ); enr2 = L_mult( enr0[j], enr1 ); enr2_exp = norm_l( enr2 ); @@ -751,7 +747,7 @@ void pitch_ol_fx( Ltmp = L_mult0( cor_buf[ind], enr1 ); qCorX = add( sub( 15, enr1_exp ), sub( 14, pt_exp1[ind] ) ); - corX[i][j] = extract_h( L_shr_o( Ltmp, sub( qCorX, 31 ), &Overflow ) ); + corX[i][j] = extract_h( L_shr_sat( Ltmp, sub( qCorX, 31 ) ) ); qCorX = 31; move16(); @@ -773,7 +769,7 @@ void pitch_ol_fx( move16(); /* selected moving vector */ enr1_exp = 0; move16(); - enr1 = add_o( extract_h( dotp_fx( pt4, pt4, len1[j], &enr1_exp ) ), 1, &Overflow ); + enr1 = add_sat( extract_h( dotp_fx( pt4, pt4, len1[j], &enr1_exp ) ), 1 ); enr2 = L_mult( enr0_1[j], enr1 ); enr2_exp = norm_l( enr2 ); @@ -788,7 +784,7 @@ void pitch_ol_fx( Ltmp = L_mult0( cor_buf[ind1 + len_x], enr1 ); qCorX = add( sub( 15, enr1_exp ), sub( 14, pt_exp3[ind1] ) ); - corX[i][j + NSECT] = extract_h( L_shr_o( Ltmp, qCorX - 31, &Overflow ) ); + corX[i][j + NSECT] = extract_h( L_shr_sat( Ltmp, qCorX - 31 ) ); qCorX = 31; move16(); @@ -868,7 +864,7 @@ void pitch_ol_fx( move16(); pitch_tmp[i] = pitchX[i][ind]; move16(); - cor_tmp[i] = add_o( corX[i][ind], corr_shift, &Overflow ); + cor_tmp[i] = add_sat( corX[i][ind], corr_shift ); move16(); /* Higher is the neighbour's correlation, higher is the weighting */ @@ -882,7 +878,7 @@ void pitch_ol_fx( move16(); pitch_tmp[i + NHFR] = pitchX[i][ind1]; move16(); - cor_tmp[i + NHFR] = add_o( corX[i][ind1], corr_shift, &Overflow ); + cor_tmp[i + NHFR] = add_sat( corX[i][ind1], corr_shift ); move16(); /* Higher is the neighbour's correlation, higher is the weighting */ @@ -1103,9 +1099,6 @@ void pitch_ol_ivas_fx( const Word16 *len, *len1, *sublen, *sublen1, *pit_max, *sec_length, *sec_length1; Word16 pit_min_coding; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif Word16 new_q; new_q = sub( 63, shl( qwsp, 1 ) ); @@ -1686,13 +1679,17 @@ void pitch_ol_ivas_fx( move16(); /* enr1 = dotp( pt2, pt2, len[j] ) + 0.01f; */ - temp = 167772 /*0.01f in Q24*/; + temp = 0; move64(); FOR( m = 0; m < len[j]; m++ ) { temp = W_mac0_16_16( temp, pt2[m], pt2[m] ); // 2*qwsp } + temp = W_shl( temp, sub( Q24, shl( qwsp, 1 ) ) ); // Q24 + + temp = W_add( temp, 167772 ); /*0.01f in Q24*/ + enr1_exp = W_norm( temp ); enr1 = W_extract_h( W_shl( temp, enr1_exp ) ); // enr1_exp+24-32 enr1_exp = sub( 39, enr1_exp ); // 31-(enr1_exp+24-32) @@ -1703,7 +1700,7 @@ void pitch_ol_ivas_fx( enr1 = ISqrt32( enr1, &enr1_exp ); /* 1/sqrt(energy) */ /*31-enr2_exp*/ Ltmp = Mpy_32_16_1( enr1, cor_buf[ind] ); - corX[i][j] = extract_h( L_shl_o( Ltmp, add( enr1_exp, cor_buf_exp[ind] ), &Overflow ) ); // Q15 + corX[i][j] = extract_h( L_shl_sat( Ltmp, add( enr1_exp, cor_buf_exp[ind] ) ) ); // Q15 move16(); Ltmp = Mpy_32_16_1( enr1, pt_cor0[ind] ); @@ -1724,13 +1721,18 @@ void pitch_ol_ivas_fx( move16(); /* enr1 = dotp(pt4, pt4, len1[j]) + 0.01f; */ - temp = 167772 /*0.01f in Q24*/; + temp = 0; + move64(); move64(); FOR( m = 0; m < len1[j]; m++ ) { temp = W_mac0_16_16( temp, pt4[m], pt4[m] ); // 2*qwsp } + temp = W_shl( temp, sub( Q24, shl( qwsp, 1 ) ) ); // Q24 + + temp = W_add( temp, 167772 ); /*0.01f in Q24*/ + enr1_exp = W_norm( temp ); enr1 = W_extract_h( W_shl( temp, enr1_exp ) ); // enr1_exp+24-32 enr1_exp = sub( 39, enr1_exp ); // 31-(enr1_exp+24-32) @@ -1741,7 +1743,7 @@ void pitch_ol_ivas_fx( enr1 = ISqrt32( enr1, &enr1_exp ); /* 1/sqrt(energy) */ /*31-enr1_exp*/ Ltmp = Mpy_32_16_1( enr1, cor_buf[ind1 + len_x] ); - corX[i][j + NSECT] = extract_h( L_shl_o( Ltmp, add( enr1_exp, cor_buf_exp[ind1 + len_x] ), &Overflow ) ); // Q15 + corX[i][j + NSECT] = extract_h( L_shl_sat( Ltmp, add( enr1_exp, cor_buf_exp[ind1 + len_x] ) ) ); // Q15 move16(); Ltmp = Mpy_32_16_1( enr1, pt_cor0[ind1 + ( DELTA_COH - 1 ) + len_x] ); @@ -1818,7 +1820,7 @@ void pitch_ol_ivas_fx( move16(); pitch_tmp[i] = pitchX[i][ind]; move16(); - cor_tmp[i] = add_o( corX[i][ind], corr_shift, &Overflow ); + cor_tmp[i] = add_sat( corX[i][ind], corr_shift ); move16(); /* Higher is the neighbour's correlation, higher is the weighting */ @@ -1832,7 +1834,7 @@ void pitch_ol_ivas_fx( move16(); pitch_tmp[i + NHFR] = pitchX[i][ind1]; move16(); - cor_tmp[i + NHFR] = add_o( corX[i][ind1], corr_shift, &Overflow ); + cor_tmp[i + NHFR] = add_sat( corX[i][ind1], corr_shift ); move16(); /* Higher is the neighbour's correlation, higher is the weighting */ @@ -2416,8 +2418,8 @@ void pitchDoubling_det_fx( IF( GE_16( T, PIT_MIN_12k8 ) ) { - pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[0] ), &new_voicing[0], 0, wspeech, 2 ); - pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[1] ), &new_voicing[1], L_SUBFR, wspeech, 2 ); + pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[0] ), &new_voicing[0], 0, wspeech, 2, EVS_MONO ); + pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[1] ), &new_voicing[1], L_SUBFR, wspeech, 2, EVS_MONO ); /* IF(sub(add(new_voicing[0],new_voicing[1]),add(voicing_fr[0],voicing_fr[1]))>0 */ IF( L_msu( L_msu( L_mac( L_mult( new_voicing[0], 8192 ), new_voicing[1], 8192 ), voicing_fr[0], 8192 ), voicing_fr[1], 8192 ) > 0 ) { @@ -2439,8 +2441,8 @@ void pitchDoubling_det_fx( IF( GE_16( T, PIT_MIN_12k8 ) ) { - pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[0] ), &new_voicing[0], 2 * L_SUBFR, wspeech, 2 ); - pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[1] ), &new_voicing[1], 3 * L_SUBFR, wspeech, 2 ); + pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[0] ), &new_voicing[0], 2 * L_SUBFR, wspeech, 2, EVS_MONO ); + pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[1] ), &new_voicing[1], 3 * L_SUBFR, wspeech, 2, EVS_MONO ); /* IF(sub(add(new_voicing[0],new_voicing[1]),add(voicing_fr[2],voicing_fr[3]))>0) */ IF( L_msu( L_msu( L_mac( L_mult( new_voicing[0], 8192 ), new_voicing[1], 8192 ), voicing_fr[2], 8192 ), voicing_fr[3], 8192 ) > 0 ) { diff --git a/lib_enc/plc_enc_ext_fx.c b/lib_enc/plc_enc_ext_fx.c index 97e3fd4bc44ca91ab63acb69b5f914d01f747e93..6e9571442c42a0ad30931c3511d36f1c17164ac0 100644 --- a/lib_enc/plc_enc_ext_fx.c +++ b/lib_enc/plc_enc_ext_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ diff --git a/lib_enc/ppp_enc_fx.c b/lib_enc/ppp_enc_fx.c index 9afb27065559b4746745352c09b11dace1f3ed88..15b013a4b9c309c5085e1a5e4002f81f46b35c2c 100644 --- a/lib_enc/ppp_enc_fx.c +++ b/lib_enc/ppp_enc_fx.c @@ -1,19 +1,20 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" #include "cnst.h" -#include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ + /*-------------------------------------------------------------------* * Local constants *-------------------------------------------------------------------*/ + #define ERB_CBSIZE1 64 #define ERB_CBSIZE2 64 #define P_CBSIZE 64 @@ -21,6 +22,7 @@ /*-------------------------------------------------------------------* * Local functions *--------------------------------------------------------------------*/ + static Word16 DTFS_quant_cw_fx( DTFS_STRUCTURE *X_fx, Word16 pl, const Word16 *curr_lpc_fx, Word16 *POWER_IDX, Word16 *AMP_IDX, Word16 *lastLgainE_fx, Word16 *lastHgainE_fx, Word16 *lasterbE_fx, Word16 *sin_tab, Word16 *cos_tab ); static Word16 DTFS_alignment_fine_new_fx( DTFS_STRUCTURE X1_fx, DTFS_STRUCTURE X2_fx, Word16 *S_fx, Word16 *C_fx ); static void erb_diff_fx( const Word16 *prev_erb, Word16 pl, const Word16 *curr_erb, Word16 l, const Word16 *curr_lsp, Word16 *index, Word16 num_erb ); @@ -34,40 +36,40 @@ static void erb_diff_fx( const Word16 *prev_erb, Word16 pl, const Word16 *curr_e /* INPUT ARGUMENTS : */ /* _ (Word16 []) curr_lpc_fx: LPC coefficients, Q12 */ /* _ (struct DTFS_STRUCTURE_FX) CURRCW_NQ_FX : prototype in Cartesian domain */ -/* (Word16) lag_fx: length of prototype */ -/* (Word16 []) a/b: harmonics, normalized */ -/* (Word16) Q: norm factor of a */ +/* (Word16) lag_fx: length of prototype */ +/* (Word16 []) a/b: harmonics, normalized */ +/* (Word16) Q: norm factor of a */ /* _ (struct DTFS_STRUCTURE_FX) PREV_CW_E_FX : past dtfs in Cartesian domain */ -/* (Word16) lag: length of prototype */ -/* (Word16 []) a/b: harmonics, normalized */ -/* (Word16) Q: norm factor of a */ -/* _ (Word16) prevCW_lag_fx: Previous lag, Q0 */ -/* _ (Word16 *) exc : Global input (Q0) */ +/* (Word16) lag: length of prototype */ +/* (Word16 []) a/b: harmonics, normalized */ +/* (Word16) Q: norm factor of a */ +/* _ (Word16) prevCW_lag_fx: Previous lag, Q0 */ +/* _ (Word16 *) exc : Global input (Q0) */ /* _ (Word16 []) sinTab, Q15 : sin(2pi/4L*n), n=0,1,...,4L-1 */ /* _ (Word16 []) cosTab, Q15 : cos(2pi/4L*n), n=0,1,...,4L-1 */ /*---------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16) pidx: Power index */ -/* _ (Word16[]) aidx: Amplitude indices, 2 words */ -/* _ (struct DTFS_fx *) CURRCW_Q_FX : quantized prototype in Cartesian domain */ -/* (Word16) lag_fx: length of prototype in time domain */ -/* (Word16 []) a/b: harmonics, normalized */ -/* (Word16) Q: norm factor of a */ -/* _ (struct DTFS_fx *) TARGETCW_FX : Target prototype in Cartesian domain */ -/* (Word16) lag_fx: length of prototype in time domain */ -/* (Word16 []) a/b: harmonics, normalized */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16) pidx: Power index */ +/* _ (Word16[]) aidx: Amplitude indices, 2 words */ +/* _ (struct DTFS_fx *) CURRCW_Q_FX : quantized prototype in Cartesian domain */ +/* (Word16) lag_fx: length of prototype in time domain */ +/* (Word16 []) a/b: harmonics, normalized */ +/* (Word16) Q: norm factor of a */ +/* _ (struct DTFS_fx *) TARGETCW_FX : Target prototype in Cartesian domain */ +/* (Word16) lag_fx: length of prototype in time domain */ +/* (Word16 []) a/b: harmonics, normalized */ /* (Word16) Q: norm factor of a */ /*---------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ +/* INPUT/OUTPUT ARGUMENTS : */ /* _ (Word16[]) lasterbE_fx: ERB history for differential */ /* quantization, Q13 */ -/* _ (Word16) lastLgainE_fx: low band power history, log domain, */ +/* _ (Word16) lastLgainE_fx: low band power history, log domain, */ /* Q11 */ -/* _ (Word16) lastHgainE_fx: high band power history, log domain, */ +/* _ (Word16) lastHgainE_fx: high band power history, log domain, */ /* Q11 */ /*---------------------------------------------------------------------------------------*/ /* RETURN ARGUMENTS : */ -/* _ (Word16) returnFlag: flag indicating success/failure */ +/* _ (Word16) returnFlag: flag indicating success/failure */ /* (TRUE/FALSE) */ /*---------------------------------------------------------------------------------------*/ /* CALLED FROM : TX */ @@ -75,15 +77,15 @@ static void erb_diff_fx( const Word16 *prev_erb, Word16 pl, const Word16 *curr_e ivas_error ppp_quarter_encoder_fx( Word16 *returnFlag, /* o : return value */ - DTFS_STRUCTURE *CURRCW_Q_FX, /* o : Quantized (amp/phase) DTFS */ - DTFS_STRUCTURE *TARGETCW_FX, /* o : DTFS with quant phase but unquant Amp */ - Word16 prevCW_lag, /* i : previous lag */ - DTFS_STRUCTURE vCURRCW_NQ_FX, /* i : Unquantized DTFS */ - const Word16 *curr_lpc_fx, /* i : LPCS */ - Word16 *lastLgainE_fx, /* i/o: last low band gain */ - Word16 *lastHgainE_fx, /* i/o: last high band gain */ - Word16 *lasterbE_fx, /* i/o: last ERB vector */ - DTFS_STRUCTURE PREV_CW_E_FX, /* i : past DTFS */ + DTFS_STRUCTURE *CURRCW_Q_FX, /* o : Quantized (amp/phase) DTFS */ + DTFS_STRUCTURE *TARGETCW_FX, /* o : DTFS with quant phase but unquant Amp */ + Word16 prevCW_lag, /* i : previous lag */ + DTFS_STRUCTURE vCURRCW_NQ_FX, /* i : Unquantized DTFS */ + const Word16 *curr_lpc_fx, /* i : LPCS */ + Word16 *lastLgainE_fx, /* i/o: last low band gain */ + Word16 *lastHgainE_fx, /* i/o: last high band gain */ + Word16 *lasterbE_fx, /* i/o: last ERB vector */ + DTFS_STRUCTURE PREV_CW_E_FX, /* i : past DTFS */ Word16 *S_fx, /* i : sin table, Q15 */ Word16 *C_fx, /* i : cos table, Q15 */ BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ @@ -171,9 +173,9 @@ ivas_error ppp_quarter_encoder_fx( CURRCW_Q_FX->upper_cut_off_freq_of_interest_fx = (Word16) find_remd( Ltempn, 20971, &Ltempd ); move16(); - push_indice_fx( hBstr, IND_AMP0, AMP_IDX_fx[0], 6 ); - push_indice_fx( hBstr, IND_AMP1, AMP_IDX_fx[1], 6 ); - push_indice_fx( hBstr, IND_POWER, POWER_IDX_FX, 6 ); + push_indice( hBstr, IND_AMP0, AMP_IDX_fx[0], 6 ); + push_indice( hBstr, IND_AMP1, AMP_IDX_fx[1], 6 ); + push_indice( hBstr, IND_POWER, POWER_IDX_FX, 6 ); /*Phase copying is done through copy_phase instead of car2pol and pol2car */ copy_phase_fx( TARGETCW_FX, *CURRCW_Q_FX, TARGETCW_FX ); @@ -199,7 +201,7 @@ ivas_error ppp_quarter_encoder_fx( /*DTFS_phaseShift( CURRCW_Q,(float)(PI2*tmp/CURRCW_Q->lag) ); */ Q2phaseShift_fx( CURRCW_Q_FX, tmp_fx, CURRCW_Q_FX->lag_fx, S_fx, C_fx ); - push_indice_fx( hBstr, IND_GLOBAL_ALIGNMENT, shr( add( tmp_fx, 12 ), 2 ), 3 ); + push_indice( hBstr, IND_GLOBAL_ALIGNMENT, shr( add( tmp_fx, 12 ), 2 ), 3 ); free( PREVDTFS_FX ); return error; @@ -616,16 +618,17 @@ static Word16 DTFS_quant_cw_fx( /* CALLED FROM : TX */ /*===================================================================*/ -static Word16 DTFS_alignment_fine_new_fx( DTFS_STRUCTURE X1_fx, DTFS_STRUCTURE X2_fx, Word16 *S_fx, Word16 *C_fx ) +static Word16 DTFS_alignment_fine_new_fx( + DTFS_STRUCTURE X1_fx, + DTFS_STRUCTURE X2_fx, + Word16 *S_fx, + Word16 *C_fx ) { Word16 temp, temp1, k, Qcorr, Qmaxcorr; Word16 n, fshift_fx, HalfLag, ab1[MAXLAG_WI], ab2[MAXLAG_WI]; Word32 corr_fx; Word32 maxcorr_fx, wcorr_fx, diff_corr; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif + IF( LT_16( X1_fx.lag_fx, X2_fx.lag_fx ) ) { DTFS_zeroPadd_fx( X2_fx.lag_fx, &X1_fx ); @@ -663,9 +666,9 @@ static Word16 DTFS_alignment_fine_new_fx( DTFS_STRUCTURE X1_fx, DTFS_STRUCTURE X FOR( k = 0; k <= HalfLag; k++ ) { - corr_fx = L_mac_o( corr_fx, ab1[k], C_fx[temp % ( 4 * X2_fx.lag_fx )], &Overflow ); - corr_fx = L_mac_o( corr_fx, ab2[k], S_fx[temp % ( 4 * X2_fx.lag_fx )], &Overflow ); - temp = add_o( temp, temp1, &Overflow ); + corr_fx = L_mac_sat( corr_fx, ab1[k], C_fx[temp % ( 4 * X2_fx.lag_fx )] ); + corr_fx = L_mac_sat( corr_fx, ab2[k], S_fx[temp % ( 4 * X2_fx.lag_fx )] ); + temp = add_sat( temp, temp1 ); } temp = sub( 32767, extract_l( L_shr( L_mult( 82, abs_s( n ) ), 1 ) ) ); /* Q15 */ Qcorr = norm_l( corr_fx ); @@ -675,23 +678,23 @@ static Word16 DTFS_alignment_fine_new_fx( DTFS_STRUCTURE X1_fx, DTFS_STRUCTURE X move16(); } - temp1 = round_fx_o( (Word32) L_shl_o( corr_fx, Qcorr, &Overflow ), &Overflow ); /* Q(Qcorr-16) */ - wcorr_fx = L_mult_o( temp1, temp, &Overflow ); /* Q(Qcorr-16+15+1)=Q(Qcorr) */ + temp1 = round_fx_sat( (Word32) L_shl_sat( corr_fx, Qcorr ) ); /* Q(Qcorr-16) */ + wcorr_fx = L_mult_sat( temp1, temp ); /* Q(Qcorr-16+15+1)=Q(Qcorr) */ IF( GE_16( Qmaxcorr, Qcorr ) ) { - diff_corr = L_sub_o( wcorr_fx, L_shl_o( maxcorr_fx, sub( Qcorr, Qmaxcorr ), &Overflow ), &Overflow ); /* Qcorr */ + diff_corr = L_sub_sat( wcorr_fx, L_shl_sat( maxcorr_fx, sub( Qcorr, Qmaxcorr ) ) ); /* Qcorr */ } ELSE { - diff_corr = L_sub_o( L_shl_o( wcorr_fx, sub( Qmaxcorr, Qcorr ), &Overflow ), maxcorr_fx, &Overflow ); /* Qmaxcorr */ + diff_corr = L_sub_sat( L_shl_sat( wcorr_fx, sub( Qmaxcorr, Qcorr ) ), maxcorr_fx ); /* Qmaxcorr */ } if ( diff_corr > 0 ) { fshift_fx = n; move16(); - maxcorr_fx = (Word32) L_shl_o( corr_fx, Qcorr, &Overflow ); /* Qcorr */ + maxcorr_fx = (Word32) L_shl_sat( corr_fx, Qcorr ); /* Qcorr */ Qmaxcorr = Qcorr; move16(); } @@ -699,6 +702,8 @@ static Word16 DTFS_alignment_fine_new_fx( DTFS_STRUCTURE X1_fx, DTFS_STRUCTURE X return fshift_fx; } + + /*===================================================================*/ /* FUNCTION : LPCPowSpect_fx () */ /*-------------------------------------------------------------------*/ @@ -739,10 +744,7 @@ static void LPCPowSpect_fx( Word32 Ltemp, Lw; Word32 Lacc; Word16 tmp, exp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif + FOR( k = 0; k < Nf; k++ ) { @@ -773,9 +775,9 @@ static void LPCPowSpect_fx( t1 = add( t1, (Word16) L_shr( Ltemp, 16 ) ); /* t1 is interpolated cos(w) */ Ltemp = L_shr( L_mult( LPC[i], t1 ), 1 ); /* Ltemp in Q27 */ - Re = L_add_o( Re, Ltemp, &Overflow ); /* Re=1-sum(LPC[i]*cos(Lw)); */ - Ltemp = L_add_o( Lw, 0x6000, &Overflow ); /* add 0.75, which is 3pi/2 to convert sin to cos */ - Ltemp = L_shl_o( Ltemp, 10, &Overflow ); /* Q25 */ + Re = L_add_sat( Re, Ltemp ); /* Re=1-sum(LPC[i]*cos(Lw)); */ + Ltemp = L_add_sat( Lw, 0x6000 ); /* add 0.75, which is 3pi/2 to convert sin to cos */ + Ltemp = L_shl_sat( Ltemp, 10 ); /* Q25 */ w = extract_h( Ltemp ); /* w is equivalent cos index */ dl = extract_l( Ltemp ); /* dl is 6 bit left-over for interpolation */ w = s_and( w, 511 ); @@ -797,8 +799,8 @@ static void LPCPowSpect_fx( t1 = add( t1, (Word16) L_shr( Ltemp, 16 ) ); /* t1 is interpolated cos(w) */ Ltemp = L_shr( L_mult( LPC[i], t1 ), 1 ); /* Ltemp in Q27 */ - Im = L_sub_o( Im, Ltemp, &Overflow ); /* Im=sum(LPC[i]*sin(Lw)) */ - Lw = L_add_o( Lw, freq[k], &Overflow ); /* Lw=(i+1)*freq[k] */ + Im = L_sub_sat( Im, Ltemp ); /* Im=sum(LPC[i]*sin(Lw)) */ + Lw = L_add_sat( Lw, freq[k] ); /* Lw=(i+1)*freq[k] */ } /* If necessary, we can block-normalize Re and Im to improve precision */ dh = extract_h( Re ); @@ -813,7 +815,7 @@ static void LPCPowSpect_fx( ELSE Lacc = L_mult0( dh, dl ); - Lacc = L_add_o( L_shr( Lacc, 15 ), L_shr( L_mult_o( dh, dh, &Overflow ), 1 ), &Overflow ); /* Lacc=Re*Re */ + Lacc = L_add_sat( L_shr( Lacc, 15 ), L_shr( L_mult_sat( dh, dh ), 1 ) ); /* Lacc=Re*Re */ dh = extract_h( Im ); dl = extract_l( Im ); @@ -830,7 +832,7 @@ static void LPCPowSpect_fx( Lacc = L_add( Lacc, L_shr( L_mult( dh, dh ), 1 ) ); /* Lacc=Re^2+Im^2, Q22 */ exp = norm_l( Lacc ); - tmp = round_fx( L_shl( Lacc, exp ) ); + tmp = round_fx_sat( L_shl( Lacc, exp ) ); exp = sub( sub( 30, exp ), 22 ); /* tmp may potentially become negative, when Lacc is a very large value */ @@ -844,14 +846,16 @@ static void LPCPowSpect_fx( move16(); } Ltemp = L_deposit_h( tmp ); - out[k] = round_fx_o( L_shl_o( Ltemp, negate( add( exp, 8 ) ), &Overflow ), &Overflow ); + out[k] = round_fx_sat( L_shl_sat( Ltemp, negate( add( exp, 8 ) ) ) ); move16(); /* out[k] = shl(tmp,-exp-8); in Q7 */ } + return; } + /*===================================================================*/ /* FUNCTION : erb_diff_fx () */ /*-------------------------------------------------------------------*/ diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c index 6844945c02ec3ae13ff255a68e215ba0ef0cfa5d..3b5892975fecf61422142597378eee6f427d8655 100644 --- a/lib_enc/pre_proc_fx.c +++ b/lib_enc/pre_proc_fx.c @@ -1,16 +1,16 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" #include "cnst.h" -#include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ + /*-------------------------------------------------------------------* * pre_proc() * @@ -126,10 +126,6 @@ void pre_proc_fx( LPD_state_HANDLE hLPDmem = st->hLPDmem; FD_BWE_ENC_HANDLE hBWE_FD = st->hBWE_FD; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif /*------------------------------------------------------------------* * Initializations @@ -268,7 +264,7 @@ void pre_proc_fx( st->vad_flag = wb_vad_fx( st, fr_bands, &noisy_speech_HO, &clean_speech_HO, &NB_speech_HO, &snr_sum_he, &localVAD_HE_SAD, &( st->flag_noisy_speech_snr ), *Q_new, hVAD, hNoiseEst, st->lp_speech_fx, st->lp_noise_fx ); - vad_flag_cldfb = vad_proc_fx( &( st->vad_st ), realBuffer, imagBuffer, cldfbScale->lb_scale, &cldfb_addition, + vad_flag_cldfb = vad_proc_fx( st->hVAD_CLDFB, realBuffer, imagBuffer, cldfbScale->lb_scale, &cldfb_addition, enerBuffer, enerBuffer_exp, st->cldfbAnaEnc->no_channels, st->vad_flag ); IF( LT_16( st->Pos_relE_cnt, 20 ) ) /* Ensure the level is high enough and cldfb decision is reliable */ @@ -298,7 +294,7 @@ void pre_proc_fx( move16(); } - bw_detect_fx( st, signal_in, NULL, enerBuffer, sf_energySum, MONO_FORMAT, 0 ); + bw_detect_fx( st, signal_in, NULL, enerBuffer, sf_energySum, MONO_FORMAT, 0, 0 ); /*----------------------------------------------------------------* * Noise energy down-ward update and total noise energy estimation @@ -397,8 +393,8 @@ void pre_proc_fx( test(); IF( st->tcx10Enabled || st->tcx20Enabled ) { - RunTransientDetection_fx( signal_in, input_frame, &st->transientDetection ); - currFlatness = GetTCXAvgTemporalFlatnessMeasure_fx( &st->transientDetection, NSUBBLOCKS, 0 ); + RunTransientDetection_fx( signal_in, input_frame, st->hTranDet ); + currFlatness = GetTCXAvgTemporalFlatnessMeasure_fx( st->hTranDet, NSUBBLOCKS, 0 ); } /*----------------------------------------------------------------* @@ -414,7 +410,7 @@ void pre_proc_fx( alw_voicing[1] = st->voicing_fx[2]; move16(); - analy_lp_fx( inp_12k8, L_FRAME, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, -1 /*IVAS_CODE !! LowRateFlag*/, *Q_new, Q_r ); + analy_lp_fx( inp_12k8, L_FRAME, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, EVS_MONO, 0, *Q_new, Q_r ); lsp2lsf_fx( lsp_new, lsf_new, M, INT_FS_12k8 ); stab_fac = lsf_stab_fx( lsf_new, st->lsf_old1_fx, 0, L_FRAME ); @@ -458,10 +454,10 @@ void pre_proc_fx( IF( LE_32( st->total_brate, ACELP_24k40 ) ) { /* 1/4 pitch precision improvement */ - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[0], &voicing_fr[0], 0, wsp, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[1], &voicing_fr[1], L_SUBFR, wsp, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[2], &voicing_fr[2], 2 * L_SUBFR, wsp, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[3], &voicing_fr[3], 3 * L_SUBFR, wsp, 7 ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[0], &voicing_fr[0], 0, wsp, 7, EVS_MONO ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[1], &voicing_fr[1], L_SUBFR, wsp, 7, EVS_MONO ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[2], &voicing_fr[2], 2 * L_SUBFR, wsp, 7, EVS_MONO ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[3], &voicing_fr[3], 3 * L_SUBFR, wsp, 7, EVS_MONO ); } ELSE { @@ -1046,7 +1042,7 @@ void pre_proc_fx( test(); IF( ( ( st->tcxonly == 0 ) || ( EQ_16( st->codec_mode, MODE1 ) ) ) && GT_32( st->input_Fs, 8000 ) ) { - st->mem_preemph_enc = shl_o( new_inp_16k[sub( L_frame_tmp, 1 )], 1, &Overflow ); + st->mem_preemph_enc = shl_sat( new_inp_16k[sub( L_frame_tmp, 1 )], 1 ); move16(); } @@ -1104,11 +1100,7 @@ void pre_proc_fx( test(); test(); test(); -#ifndef CR_2109_to_2112_cd0_ce0 - IF( ( ( ( st->tcxonly == 0 ) || !( st->core_brate != FRAME_NO_DATA || NE_32( st->core_brate, SID_2k40 ) ) ) && EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->codec_mode, MODE2 ) ) || ( EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->codec_mode, MODE1 ) ) ) -#else IF( ( ( ( st->tcxonly == 0 ) || !( st->core_brate != FRAME_NO_DATA && NE_32( st->core_brate, SID_2k40 ) ) ) && EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->codec_mode, MODE2 ) ) || ( EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->codec_mode, MODE1 ) ) ) -#endif { /* update signal buffers */ Copy( new_inp_resamp16k, st->buf_speech_enc + L_FRAME16k, L_FRAME16k ); @@ -1131,7 +1123,7 @@ void pre_proc_fx( Copy( st->lsp_old1_fx, st->lspold_enc_fx, M ); } - analy_lp_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch, st->voicing_fx, 16000, -1 /*IVAS_CODE !! LowRateFlag*/, *Q_new, Q_r ); + analy_lp_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch, st->voicing_fx, 16000, EVS_MONO, 0, *Q_new, Q_r ); /*--------------------------------------------------------------* * Compute Weighted Input @@ -1269,7 +1261,7 @@ void pre_proc_fx( * TCX mode decision *---------------------------------------------------------------*/ - SetTCXModeInfo_fx( st, &st->transientDetection, &st->hTcxCfg->tcx_curr_overlap_mode ); + SetTCXModeInfo_fx( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); } /*-----------------------------------------------------------------* diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 042b5af903a5232182b25de39971113d21f37e61..9d7de9eeb9dad7116aab710365b94565958e5bfe 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -33,102 +33,69 @@ #ifndef PROT_FX_ENC_H #define PROT_FX_ENC_H +#include "options.h" #include "ivas_cnst.h" #include "stat_enc.h" #include "stat_dec.h" #include "ivas_stat_dec.h" -#include "ivas_error.h" -#include "ivas_error_utils.h" -#include "complex_basop.h" #include "ivas_stat_enc.h" -/*----------------------------------------------------------------------------------* - * Prototypes of RAM counting tool macros - *----------------------------------------------------------------------------------*/ + + ivas_error acelp_core_enc_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 inp_fx[], /* i : input signal of the current frame Q_new*/ - const Word32 ener_fx, /* i : residual energy from Levinson-Durbin Q6*/ - Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ - Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes Q12*/ - const Word16 epsP_h_fx[M + 1], /* i : LP prediction errors Qx*/ - const Word16 epsP_l_fx[M + 1], /* i : LP prediction errors Qx*/ - Word16 lsp_new_fx[M], /* i : LSPs at the end of the frame Q15*/ - Word16 lsp_mid_fx[M], /* i : LSPs in the middle of the frame Q15*/ - Word16 vad_hover_flag_fx, /* i : VAD hangover flag Q0*/ - const Word16 attack_flag, /* i : attack flag (GSC or TC) Q0*/ - Word32 bwe_exc_extended_fx[], /* i/o: bandwidth extended excitation st->prev_Q_bwe_exc*/ - Word16 *voice_factors_fx, /* o : voicing factors Q15*/ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 inp_fx[], /* i : input signal of the current frame Q_new*/ + const Word32 ener_fx, /* i : residual energy from Levinson-Durbin Q6*/ + Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ + Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes Q12*/ + const Word16 epsP_h_fx[M + 1], /* i : LP prediction errors Qx*/ + const Word16 epsP_l_fx[M + 1], /* i : LP prediction errors Qx*/ + Word16 lsp_new_fx[M], /* i : LSPs at the end of the frame Q15*/ + Word16 lsp_mid_fx[M], /* i : LSPs in the middle of the frame 15*/ + Word16 vad_hover_flag_fx, /* i : VAD hangover flag Q0*/ + const Word16 attack_flag, /* i : attack flag (GSC or TC) Q0*/ + Word32 bwe_exc_extended_fx[], /* i/o: bandwidth extended excitation st->prev_Q_bwe_exc*/ + Word16 *voice_factors_fx, /* o : voicing factors Q15*/ Word16 old_syn_12k8_16k_fx[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE q_old_syn*/ - Word16 pitch_buf_fx[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ - Word16 *unbits_fx, /* o : number of unused bits Q0*/ - STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - const float tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ + Word16 pitch_buf_fx[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ + Word16 *unbits_fx, /* o : number of unused bits Q0*/ + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ const Word16 Q_new, - const Word16 shift - -); - -void analy_lp_ivas_fx( - const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ - const Word16 L_frame, /* i :(q0) length of the frame */ - const Word16 L_look, /* i :(q0) look-ahead */ - Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ - Word16 A[], /* o :(q14) A(z) filter coefficients */ - Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 lsp_new[], /* o :(q15) current frame LSPs */ - Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ - Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ - const Word16 Top[2], /* i :(q0) open loop pitch lag */ - const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ - const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ - const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ - Word16 Q_new, /*i: stores Q for speech*/ - Word16 *Q_r /*stores q for ener*/ ); + const Word16 shift ); void analy_lp_fx( - const Word16 speech[], /* i : pointer to the speech frame Q_new*/ - const Word16 L_frame, /* i : length of the frame Q0*/ - const Word16 L_look, /* i : look-ahead Q0*/ - Word32 *ener, /* o : residual energy from Levinson-Durbin Q_r*/ - Word16 A[], /* o : A(z) filter coefficients Q14*/ - Word16 epsP_h[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 epsP_l[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 lsp_new[], /* o : current frame LSPs Q15*/ - Word16 lsp_mid[], /* o : current mid-frame LSPs Q15*/ - Word16 lsp_old[], /* i/o: previous frame unquantized LSPs Q15*/ - const Word16 Top[2], /* i : open loop pitch lag Q0*/ - const Word16 Tnc[2], /* i : open loop pitch gain Q15*/ - const Word32 Core_sr, /* i : Internal core sampling rate Q0*/ - const Word16 sec_chan_low_rate, /* i : flag to signal second channel Q0*/ - Word16 Q_new, - Word16 *Q_r ); - -void AVQ_cod_fx( /* o: comfort noise gain factor */ - const Word16 xri[], /* i: vector to quantize */ - Word16 xriq[], /* o: quantized normalized vector (assuming the bit budget is enough) */ - const Word16 NB_BITS, /* i: number of allocated bits */ - const Word16 Nsv, /* i: number of subvectors (lg=Nsv*8) */ - const Word16 Q_in_ref /* i: Scaling i */ + const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ + const Word16 L_frame, /* i :(q0) length of the frame */ + const Word16 L_look, /* i :(q0) look-ahead */ + Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ + Word16 A[], /* o :(q14) A(z) filter coefficients */ + Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 lsp_new[], /* o :(q15) current frame LSPs */ + Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ + Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ + const Word16 Top[2], /* i :(q0) open loop pitch lag */ + const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ + const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ + const Word16 element_mode, /* i : element mode */ + const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ + Word16 Q_new, /* i : stores Q for speech */ + Word16 *Q_r /*stores q for ener*/ +); + +/*1 r: comfort noise gain factor */ +void AVQ_cod_fx( + const Word16 xri[], /* i: vector to quantize */ + Word16 xriq[], /* o: quantized normalized vector (assuming the bit budget is enough) */ + const Word16 NB_BITS, /* i: number of allocated bits */ + const Word16 Nsv, /* i: number of subvectors (lg=Nsv*8) */ + const Word16 Q_in_ref /* i: Scaling i */ ); void AVQ_encmux_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - const Word16 extl, /* i : extension layer */ - Word16 xriq[], /* i/o: rounded subvectors [0..8*Nsv-1] followed - by rounded bit allocations [8*Nsv..8*Nsv+Nsv-1] */ - Word16 *nb_bits, /* i/o: number of allocated bits */ - const Word16 Nsv, /* i: number of subvectors */ - Word16 nq_out[], /* o : AVQ nq index */ - Word16 avq_bit_sFlag, /* i : flag for AVQ bit saving solution */ - Word16 trgtSvPos /* i : target SV for AVQ bit savings */ -); - -void AVQ_encmux_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ const Word16 extl, /* i : extension layer */ Word16 xriq[], /* i/o: rounded subvectors [0..8*Nsv-1] followed - by rounded bit allocations [8*Nsv..8*Nsv+Nsv-1] */ + by rounded bit allocations [8*Nsv..8*Nsv+Nsv-1] */ Word16 *nb_bits, /* i/o: number of allocated bits */ const Word16 Nsv, /* i: number of subvectors */ Word16 nq_out[], /* o : AVQ nq index */ @@ -138,53 +105,52 @@ void AVQ_encmux_ivas_fx( void bw_detect_fx( Encoder_State *st, /* i/o: Encoder State */ - const Word16 signal_in[], /* i : i signal */ - Word16 *spectrum, /* i : MDCT spectrum */ - const Word32 *enerBuffer, /* i : CLDFB Energy Q31 */ - const Word16 *cldfbBuf_Ener_Exp, /* i : CLDFB Energy Exponent */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word16 mct_on /* i : flag MCT mode */ -); - -void core_switching_post_enc_fx( /*done */ - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 inp12k8[], /* i : i signal @12.8 kHz Qinp*/ - const Word16 inp16k[], /* i : i signal @16 kHz Qinp*/ - const Word16 A[], /* i : unquant. LP filter coefs. (Q12) */ - Word16 Qshift, - Word16 Q_new, - const Word16 Qsp, /* i/o : Q from acelp synthsis */ - Word16 *Qmus /* i/o : Q from mdct synthsis / Q of output synthesis */ + const Word16 signal_in[], /* i : input signal */ + Word16 *spectrum, /* i : MDCT spectrum Q_spec */ + const Word32 *enerBuffer, /* i : CLDFB Energy Q31 */ + const Word16 *cldfbBuf_Ener_Exp, /* i : CLDFB Energy Exponent */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const Word16 mct_on, /* i : flag MCT mode */ + const Word16 Q_spec ); + +void core_switching_post_enc_fx( + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 inp12k8[], /* i : i signal @12.8 kHz Qinp*/ + const Word16 inp16k[], /* i : i signal @16 kHz Qinp*/ + const Word16 A[], /* i : unquant. LP filter coefs. (Q12) */ + Word16 Qshift, + Word16 Q_new, + const Word16 Qsp, /* i/o : Q from acelp synthsis */ + Word16 *Qmus /* i/o : Q from mdct synthsis / Q of output synthesis */ ); void core_switching_pre_enc_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 *old_inp_12k8, /* i : old i signal @12.8kHz Qx*/ - const Word16 *old_inp_16k, /* i : old i signal @16kHz Qx*/ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 *old_inp_12k8, /* i : old i signal @12.8kHz Qx*/ + const Word16 *old_inp_16k, /* i : old i signal @16kHz Qx*/ const Word16 active_cnt, /* i : active frame counter Q0*/ const Word16 last_element_mode /* i : last_element_mode Q0*/ ); -Word16 correlation_shift_fx( /* o : noise dependent voicing correction Q15 */ - const Word16 totalNoise_fx /* i/o: noise estimate over all critical bands Q8 */ +/*! r: noise dependent voicing correction Q15 */ +Word16 correlation_shift_fx( + const Word16 totalNoise_fx /* i/o: noise estimate over all critical bands Q8 */ ); void dtx_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ + Encoder_State *st_fx, /* i/o: encoder state structure */ const Word16 vad, /* i : vad flag Q0*/ - const Word16 speech[], /* i : Pointer to the speech frame Q_speech*/ - Word16 Q_speech /* i : Q factor for speech */ + const Word16 speech[], /* i : Pointer to the speech frame Q_speech*/ + Word16 Q_speech /* i : Q factor for speech */ ); void dtx_ivas_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ -#ifdef NONBE_1211_DTX_BR_SWITCHING + Encoder_State *st_fx, /* i/o: encoder state structure */ const Word32 last_ivas_total_brate, /* i : last IVAS total bitrate Q0*/ -#endif - const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ - const Word16 vad, /* i : vad flag for DTX Q0*/ - const Word16 speech[], /* i : Pointer to the speech frame Q_speech*/ - Word16 Q_speech /* i : Q factor for speech */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ + const Word16 vad, /* i : vad flag for DTX Q0*/ + const Word16 speech[], /* i : Pointer to the speech frame Q_speech*/ + Word16 Q_speech /* i : Q factor for speech */ ); Word16 dtx_hangover_addition_fx( @@ -193,29 +159,32 @@ Word16 dtx_hangover_addition_fx( const Word16 lp_snr, /* i Q8 */ const Word16 cldfb_subtraction, /* i Q0 number of DTX-HO frames CLDFB wants to reduce */ Word16 *vad_hover_flag_ptr, - VAD_HANDLE hVAD, /* i/o: VAD data handle */ + VAD_HANDLE hVAD, /* i/o: VAD data handle */ NOISE_EST_HANDLE hNoiseEst /* i : Noise estimation handle */ ); + Word16 ivas_dtx_hangover_addition_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ const Word16 vad_flag, /* i Q0 */ const Word16 lp_snr, /* i Q8 */ const Word16 cldfb_subtraction, /* i Q0 number of DTX-HO frames CLDFB wants to reduce */ Word16 *vad_hover_flag_ptr, - VAD_HANDLE hVAD, /* i/o: VAD data handle */ + VAD_HANDLE hVAD, /* i/o: VAD data handle */ NOISE_EST_HANDLE hNoiseEst, /* i : Noise estimation handle */ Word16 *rem_dtx_ho ); + void fb_tbe_enc_fx( - Encoder_State *st, /* i/o: encoder state structure */ + Encoder_State *st, /* i/o: encoder state structure */ const Word16 new_input[], /* i : i speech at 48 kHz sample rate */ - const Word16 fb_exc[], /* i : FB excitation from the SWB part */ + const Word16 fb_exc[], /* i : FB excitation from the SWB part */ Word16 Q_fb_exc ); void fb_tbe_enc_ivas_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 new_input[], /* i : i speech at 48 kHz sample rate Q0*/ - const Word16 fb_exc[], /* i : FB excitation from the SWB part Q_fb_exc*/ - Word16 Q_fb_exc ); + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 new_input[], /* i : i speech at 48 kHz sample rate Q_new_input*/ + const Word16 fb_exc[], /* i : FB excitation from the SWB part Q_fb_exc*/ + Word16 Q_fb_exc, + Word16 Q_new_input ); void fb_tbe_reset_enc_fx( Word32 elliptic_bpf_2_48k_mem_fx[][4], @@ -227,77 +196,79 @@ Word16 ffr_getSfWord32( const Word32 *vector, /*!< Pointer to i vector */ const Word16 len /*!< Length of i vector */ ); + void find_tilt_ivas_fx( - const Word32 fr_bands[], /* i : energy in frequency bands q_fr_bands*/ - const Word16 q_fr_bands, /* i : Q of fr_bands Q0*/ - const Word32 bckr[], /* i : per band background noise energy estimate q_bckr*/ - const Word16 q_bckr, /* i : Q of bckr Q0*/ + const Word32 fr_bands[], /* i : energy in frequency bands q_fr_bands*/ + const Word16 q_fr_bands, /* i : Q of fr_bands Q0*/ + const Word32 bckr[], /* i : per band background noise energy estimate q_bckr*/ + const Word16 q_bckr, /* i : Q of bckr Q0*/ Word32 ee[2], /* o : lf/hf E ration for present frame Q_bckr*/ const Word16 pitch[3], /* i : open loop pitch values for 3 half-frames Q0*/ const Word16 voicing[3], /* i : normalized correlation for 3 half-frames Q15*/ - const Word32 *lf_E, /* i : per bin energy for low frequencies q_lf_E*/ - const Word16 q_lf_E, /* i : Q of lf_E */ - const Word16 corr_shift, /* i : normalized correlation correction Q15*/ - const Word16 bwidth, /* i : i signal bandwidth */ - const Word16 max_band, /* i : maximum critical band */ + const Word32 *lf_E, /* i : per bin energy for low frequencies q_lf_E*/ + const Word16 q_lf_E, /* i : Q of lf_E */ + const Word16 corr_shift, /* i : normalized correlation correction Q15*/ + const Word16 bwidth, /* i : i signal bandwidth */ + const Word16 max_band, /* i : maximum critical band */ Word32 hp_E[], /* o : energy in HF Q_new*/ - const Word16 codec_mode, /* i : MODE1 or MODE2 */ + const Word16 codec_mode, /* i : MODE1 or MODE2 */ Word32 *bckr_tilt_lt, Word16 Opt_vbr_mode ); void find_tilt_fx( - const Word32 fr_bands[], /* i : energy in frequency bands Q_new + Q_SCALE*/ - const Word32 bckr[], /* i : per band background noise energy estimate Q_new + Q_SCALE*/ - Word32 ee[2], /* o : lf/hf E ration for present frame Q6*/ - const Word16 pitch[3], /* i : open loop pitch values for 3 half-frames Q0*/ - const Word16 voicing[3], /* i : normalized correlation for 3 half-frames Q15*/ + const Word32 fr_bands[], /* i : energy in frequency bands Q_new + Q_SCALE*/ + const Word32 bckr[], /* i : per band background noise energy estimate Q_new + Q_SCALE*/ + Word32 ee[2], /* o : lf/hf E ration for present frame Q6*/ + const Word16 pitch[3], /* i : open loop pitch values for 3 half-frames Q0*/ + const Word16 voicing[3], /* i : normalized correlation for 3 half-frames Q15*/ const Word32 *lf_E, /* i : per bin energy for low frequencies Q_new + Q_SCALE - 2*/ - const Word16 corr_shift, /* i : normalized correlation correction Q15*/ + const Word16 corr_shift, /* i : normalized correlation correction Q15*/ const Word16 bwidth, /* i : input signal bandwidth Q0*/ const Word16 max_band, /* i : maximum critical band Q0*/ Word32 hp_E[], /* o : energy in HF Q_new + Q_SCALE*/ - const Word16 codec_mode, /* i : MODE1 or MODE2 Q0*/ - const Word16 Q_new, /* i : scaling factor */ - Word32 *bckr_tilt_lt /* i/o: lf/hf E ratio of background noise Q16*/ - , - Word16 Opt_vbr_mode /* Q0 */ -); - -Word16 find_uv_ivas_fx( /* o : coding type */ - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 *T_op_fr, /* i : pointer to adjusted fractional pitch (4 val.) Q6*/ - const Word16 *voicing_fr, /* i : refined correlation for each subframes Q15*/ - const Word16 *speech, /* i : pointer to speech signal for E computation Q_new*/ - const Word32 *ee, /* i : lf/hf Energy ratio for present frame Q6*/ - Word32 *dE1X, /* o : sudden energy increase for S/M classifier Q13*/ - const Word16 corr_shift, /* i : normalized correlation correction in noise Q15*/ - const Word16 relE, /* i : relative frame energy Q8*/ - const Word16 Etot, /* i : total energy Q8*/ - const Word32 hp_E[], /* i : energy in HF q_hp_E*/ - Word16 *flag_spitch, /* i/o: flag to indicate very short stable pitch and high correlation Q0*/ - const Word16 last_core_orig, /* i : original last core Q0*/ - STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ - const Word16 Q_new, - const Word16 q_hp_E ); - -Word16 find_uv_fx( /* o : coding type */ - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 *T_op_fr, /* i : pointer to adjusted fractional pitch (4 val.) Q6*/ - const Word16 *voicing_fr, /* i : refined correlation for each subframes Q15*/ - const Word16 *speech, /* i : pointer to speech signal for E computation Q_new*/ - const Word32 *ee, /* i : lf/hf Energy ratio for present frame Q6*/ - const Word16 corr_shift, /* i : normalized correlation correction in noise Q15*/ - const Word16 relE, /* i : relative frame energy Q8*/ - const Word16 Etot, /* i : total energy Q8*/ - const Word32 hp_E[], /* i : energy in HF Q_new + Q_SCALE*/ - const Word16 Q_new, - Word16 *flag_spitch, /* i/o: flag to indicate very short stable pitch and high correlation Q0*/ - const Word16 shift, - const Word16 last_core_orig /* i : original last core Q0*/ + const Word16 codec_mode, /* i : MODE1 or MODE2 Q0*/ + const Word16 Q_new, /* i : scaling factor */ + Word32 *bckr_tilt_lt, /* i/o: lf/hf E ratio of background noise Q16*/ + Word16 Opt_vbr_mode /* Q0 */ +); + +/* o : coding type */ +Word16 find_uv_ivas_fx( + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 *T_op_fr, /* i : pointer to adjusted fractional pitch (4 val.) Q6*/ + const Word16 *voicing_fr, /* i : refined correlation for each subframes Q15*/ + const Word16 *speech, /* i : pointer to speech signal for E computation Q_new*/ + const Word32 *ee, /* i : lf/hf Energy ratio for present frame Q6*/ + Word32 *dE1X, /* o : sudden energy increase for S/M classifier Q13*/ + const Word16 corr_shift, /* i : normalized correlation correction in noise Q15*/ + const Word16 relE, /* i : relative frame energy Q8*/ + const Word16 Etot, /* i : total energy Q8*/ + const Word32 hp_E[], /* i : energy in HF q_hp_E*/ + Word16 *flag_spitch, /* i/o: flag to indicate very short stable pitch and high correlation Q0*/ + const Word16 last_core_orig, /* i : original last core Q0*/ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + const Word16 Q_new, + const Word16 q_hp_E ); + +/* o : coding type */ +Word16 find_uv_fx( + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 *T_op_fr, /* i : pointer to adjusted fractional pitch (4 val.) Q6*/ + const Word16 *voicing_fr, /* i : refined correlation for each subframes Q15*/ + const Word16 *speech, /* i : pointer to speech signal for E computation Q_new*/ + const Word32 *ee, /* i : lf/hf Energy ratio for present frame Q6*/ + const Word16 corr_shift, /* i : normalized correlation correction in noise Q15*/ + const Word16 relE, /* i : relative frame energy Q8*/ + const Word16 Etot, /* i : total energy Q8*/ + const Word32 hp_E[], /* i : energy in HF Q_new + Q_SCALE*/ + const Word16 Q_new, + Word16 *flag_spitch, /* i/o: flag to indicate very short stable pitch and high correlation Q0*/ + const Word16 shift, + const Word16 last_core_orig /* i : original last core Q0*/ ); void fine_gain_quant_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const Word16 *ord, /* i : Indices for energy order */ const Word16 num_sfm, /* i : Number of bands */ const Word16 *gain_bits, /* i : Gain adjustment bits per sub band */ @@ -307,35 +278,37 @@ void fine_gain_quant_fx( void hq_core_enc_fx( Encoder_State *st_fx, - const Word16 *audio, /* i : i audio signal Q0 */ - const Word16 input_frame_orig, /* i : frame length Q0*/ - const Word16 hq_core_type, /* i : HQ core type Q0*/ + const Word16 *audio, /* i : i audio signal Q0*/ + const Word16 input_frame_orig, /* i : frame length Q0*/ + const Word16 hq_core_type, /* i : HQ core type Q0*/ const Word16 Voicing_flag, /* i : Voicing flag for FER method selection Q0*/ - const Word16 vad_hover_flag /* i : VAD hangover flag Q0*/ + const Word16 vad_hover_flag /* i : VAD hangover flag Q0*/ ); void long_enr_fx( - Encoder_State *st_fx, /* i/o: state structure */ + Encoder_State *st_fx, /* i/o: state structure */ const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) */ const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ Word16 high_lpn_flag ); + void ivas_long_enr_fx( - Encoder_State *st_fx, /* i/o: state structure */ - const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) Q=8*/ + Encoder_State *st_fx, /* i/o: state structure */ + const Word32 Etot, /* i : total channel E (see lib_enc\analy_sp.c) Q=24*/ const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ Word16 high_lpn_flag, /* i : sp/mus LPN flag */ FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ const Word16 n_chan, /* i : number of channels */ const Word16 localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover LR channels */ const Word16 Etot_LR[] /* i : total channel energy LR channels Q=8*/ - ); -Word16 mdct_classifier_fx( /* o: MDCT A/B decision */ - const Word16 *Y, /* i: re[0], re[1], ..., re[n/2], im[n/2 - 1], im[n/2 - 2], ..., im[1] */ - Encoder_State *st_fx, /* i/o: Encoder state variable */ - Word32 *cldfbBuf_Ener, - Word16 enerBuffer_exp, - const Word32 brate /* i : current brate, IVAS: nominal bitrate, EVS: st->total_brate */ + +/* o: MDCT A/B decision */ +Word16 mdct_classifier_fx( + const Word16 *Y, /* i: re[0], re[1], ..., re[n/2], im[n/2 - 1], im[n/2 - 2], ..., im[1] */ + Encoder_State *st_fx, /* i/o: Encoder state variable */ + Word32 *cldfbBuf_Ener, + Word16 enerBuffer_exp, + const Word32 brate /* i : current brate, IVAS: nominal bitrate, EVS: st->total_brate */ ); void noise_est_down_fx( @@ -357,14 +330,17 @@ void noise_est_down_ivas_fx( const Word32 fr_bands[], /* i : per band i energy (contains 2 vectors) */ const Word16 q_fr_bands, /* i : Q of fr_bands */ Word32 bckr[], /* i/o: per band background noise energy estimate */ - Word32 tmpN[], /* o : temporary noise update */ - Word32 enr[], /* o : averaged energy over both subframes */ - const Word16 min_band, /* i : minimum critical band */ - const Word16 max_band, /* i : maximum critical band */ - Word16 *totalNoise, /* o : noise estimate over all critical bands */ - Word16 Etot, /* i : Energy of current frame */ - Word16 *Etot_last, /* i/o: Energy of last frame Q8 */ - Word16 *Etot_v_h2 /* i/o: Energy variations of noise frames Q8 */ + Word16 *q_bckr, + Word32 tmpN[], /* o : temporary noise update */ + Word16 *q_tmpN, + Word32 enr[], /* o : averaged energy over both subframes */ + Word16 *q_enr, + const Word16 min_band, /* i : minimum critical band */ + const Word16 max_band, /* i : maximum critical band */ + Word32 *totalNoise, /* o : noise estimate over all critical bands */ + Word32 Etot, /* i : Energy of current frame Q24*/ + Word32 *Etot_last, /* i/o: Energy of last frame Q24 */ + Word32 *Etot_v_h2 /* i/o: Energy variations of noise frames Q24 */ ); void noise_est_fx( @@ -394,12 +370,14 @@ void noise_est_fx( const Word32 Le_min_scaled, /*i : Minimum energy value in Q_new + Q_SCALE */ Word16 *sp_floor, /* o : noise floor estimate Q7 */ Word16 S_map[], /* o : short-term correlation map Q7 */ - const Word16 ini_frame /* i : Frame number (init) */ + const Word16 ini_frame /* i : Frame number (init) */ ); + void noise_est_ivas_fx( Encoder_State *st_fx, /* i/o: state structure */ const Word16 old_pitch1, /* i : previous frame OL pitch[1] */ - const Word32 tmpN[], /* i : temporary noise update Q_new + QSCALE */ + const Word32 tmpN[], /* i : temporary noise update q_tmpN */ + const Word16 q_tmpN, /* i : Q-factor of tmpN buffer */ const Word32 epsP[], /* i : msb prediction error energies Qx */ const Word16 Etot, /* i : total channel E (see find_enr_fx.c) Q8 */ const Word16 relE, /* i : (VA_CHECK addition) relative frame energy Q8? */ @@ -412,29 +390,29 @@ void noise_est_ivas_fx( Word16 *ncharX, /* o : Q11 */ Word16 *sp_div, /* o : Q_sp_div */ Word16 *Q_sp_div, /* o : Q factor for sp_div */ - Word16 *non_staX, /* o : non-stationarity for sp/mus classifier */ + Word32 *non_staX, /* o : non-stationarity for sp/mus classifier */ Word16 *loc_harm, /* o : multi-harmonicity flag for UV classifier */ const Word32 *lf_E, /* i : per bin energy for low frequencies q_lf_E */ const Word16 q_lf_E, /* i : Q of lf_E Q0 */ Word16 *st_harm_cor_cnt, /* i/o : 1st harm correlation timer Q0 */ const Word16 Etot_l_lp, /* i : Smoothed low energy Q8 */ - const Word16 Etot_v_h2, /* i : Energy variations Q8 */ + const Word32 Etot_v_h2, /* i : Energy variations Q24 */ Word16 *bg_cnt, /* i : Background burst length timer Q0 */ Word16 EspecdB[], /* i/o: log E spectrum (with f=0) of the current frame Q7 for multi harm */ Word16 *sp_floor, /* o : noise floor estimate Q7 */ Word16 S_map[], /* o : short-term correlation map Q7 */ - STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ - FRONT_VAD_ENC_HANDLE hFrontVad, /* i/o: front-VAD handle */ - const Word16 ini_frame /* i : Frame number (init) */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + FRONT_VAD_ENC_HANDLE hFrontVad, /* i/o: front-VAD handle */ + const Word16 ini_frame /* i : Frame number (init) */ ); + void noise_est_pre_fx( const Word16 Etot, /* i : Energy of current frame */ const Word16 ini_frame_fx, /* i : Frame number (init) */ - NOISE_EST_HANDLE hNoiseEst, /* i/o: Noise estimation handle */ - const Word16 idchan, /* i : channel ID */ - const Word16 element_mode, /* i : element mode */ - const Word16 last_element_mode /* i : last element mode */ - + NOISE_EST_HANDLE hNoiseEst, /* i/o: Noise estimation handle */ + const Word16 idchan, /* i : channel ID */ + const Word16 element_mode, /* i : element mode */ + const Word16 last_element_mode /* i : last element mode */ ); void noise_est_pre_32fx( @@ -444,20 +422,17 @@ void noise_est_pre_32fx( const Word16 idchan, /* i : channel ID */ const Word16 element_mode, /* i : element mode */ const Word16 last_element_mode /* i : last element mode */ - ); void pitch_ol2_fx( - const Word16 pit_min, /* i : minimum pitch value (20 or 29) */ - const Word16 pitch_ol, /* i : pitch to be improved */ - Word16 *pitch_fr_fx, - /* o : adjusted 1/4 fractional pitch */ /*Q7 */ - Word16 *voicing_fr_fx, - /* o : adjusted 1/4 fractional voicing */ /*Q15 */ - const Word16 pos, /* i : position in frame where to calculate the improv. */ - const Word16 *wsp_fx, - /* i : weighted speech for current frame and look-ahead */ /*Q_new-1+shift*/ - const Word16 delta /* i : delta for pitch search (2 or 7) */ + const Word16 pit_min, /* i : minimum pitch value (20 or 29) */ + const Word16 pitch_ol, /* i : pitch to be improved */ + Word16 *pitch_fr_fx, /* o : adjusted 1/4 fractional pitch Q7*/ + Word16 *voicing_fr_fx, /* o : adjusted 1/4 fractional voicing Q15*/ + const Word16 pos, /* i : position in frame where to calculate the improv. */ + const Word16 *wsp_fx, /* i : weighted speech for current frame and look-ahead Q_new-1+shift*/ + const Word16 delta, /* i : delta for pitch search (2 or 7) */ + const Word16 element_mode /* i : EVS or IVAS */ ); void pitch_ol_ivas_fx( @@ -503,17 +478,17 @@ void pitch_ol_init_fx( ); void Preemph_scaled( - Word16 new_speech[], /* i : Speech to scale already on 14 bits Q_new*/ - Word16 *Q_new, /* o : Scaling factor */ - Word16 *mem_preemph, /* i/o: Preemph memory Q(-1)*/ - Word16 *Q_max, /* i/o: Q_new limitation */ - const Word16 Preemph_factor, /* i : Preemphasis factor Q15*/ - const Word16 bits, /* i : Bit to remove from the output to (15-bits) */ - const Word16 bit1, /* i : Limit the output scaling to ((15-bits)-bit1) bits */ - const Word16 L_Q_mem, /* i : Number of old scaling to take into account Q0*/ - const Word16 Lframe, /* i : Frame length Q0*/ - const Word16 last_coder_type, /* i : coder_type Q0*/ - const Word16 Search_scaling /* i : enable the search of a proper scaling factor Q0*/ + Word16 new_speech[], /* i : Speech to scale already on 14 bits Q_new*/ + Word16 *Q_new, /* o : Scaling factor */ + Word16 *mem_preemph, /* i/o: Preemph memory Q(-1)*/ + Word16 *Q_max, /* i/o: Q_new limitation */ + const Word16 Preemph_factor, /* i : Preemphasis factor Q15*/ + const Word16 bits, /* i : Bit to remove from the output to (15-bits) */ + const Word16 bit1, /* i : Limit the output scaling to ((15-bits)-bit1) bits */ + const Word16 L_Q_mem, /* i : Number of old scaling to take into account Q0*/ + const Word16 Lframe, /* i : Frame length Q0*/ + const Word16 last_coder_type, /* i : coder_type Q0*/ + const Word16 Search_scaling /* i : enable the search of a proper scaling factor Q0*/ ); void Scale_mem_enc( @@ -528,19 +503,20 @@ void Scale_mem_enc( Word16 *last_exc_dct_in, Word16 *old_input_lp ); -Word32 Scale_mem_pre_proc( /* o : Min energy scaled */ - Word16 ini_frame_fx, /* i : Frame number Q0*/ - Word16 Q_exp, /* i : Diff scaling factor */ - Word16 *Q_new, /* i/o: Absolute scaling factor */ - Word16 *old_speech, /* i/o: Speech memory */ - Word16 *mem_wsp, /* i/o: wsp vector memory st->mem_wsp_q*/ - Word32 *enrO, /* i/o: Enr mem q_enrO*/ - Word32 *bckr, /* i/o: Back ground_fx ener mem q_bckr*/ - Word32 *ave_enr, /* i/o: Ave_enr mem Q_new + QSCALE*/ - Word32 *ave_enr2, /* i/o: Ave_enr2 mem Q_new + QSCALE*/ - Word32 *st_fr_bands1, /* i/o: spectrum per critical bands of the previous frame Q_new + QSCALE*/ - Word32 *st_fr_bands2, /* i/o: spectrum per critical bands 2 frames ago Q_new + QSCALE*/ - Word32 *st_Bin_E_old ); +/* o : Min energy scaled */ +Word32 Scale_mem_pre_proc( + Word16 ini_frame_fx, /* i : Frame number Q0*/ + Word16 Q_exp, /* i : Diff scaling factor */ + Word16 *Q_new, /* i/o: Absolute scaling factor */ + Word16 *old_speech, /* i/o: Speech memory */ + Word16 *mem_wsp, /* i/o: wsp vector memory st->mem_wsp_q*/ + Word32 *enrO, /* i/o: Enr mem q_enrO*/ + Word32 *bckr, /* i/o: Back ground_fx ener mem q_bckr*/ + Word32 *ave_enr, /* i/o: Ave_enr mem Q_new + QSCALE*/ + Word32 *ave_enr2, /* i/o: Ave_enr2 mem Q_new + QSCALE*/ + Word32 *st_fr_bands1, /* i/o: spectrum per critical bands of the previous frame Q_new + QSCALE*/ + Word32 *st_fr_bands2, /* i/o: spectrum per critical bands 2 frames ago Q_new + QSCALE*/ + Word32 *st_Bin_E_old ); void Scale_wsp( Word16 *wsp, /* i : Weigthed speech */ @@ -551,40 +527,51 @@ void Scale_wsp( Word16 *old_wsp, /* i/o: Old weighted speech buffer */ Word16 *mem_decim2, /* i/o: Decimation buffer */ Word16 *old_wsp12k8, /* i/o: wsp memory @ 12.8 kHz used in pitol2 */ - const Word16 Len_p_look /* i : L_frame + look ahead Q0*/ + const Word16 Len_p_look /* i : L_frame + look ahead Q0*/ ); -Word16 signal_clas_fx( /* o : classification for current frames */ - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 *speech, /* i : pointer to speech signal for E computation */ - const Word32 *ee, /* i : lf/hf E ration for 2 half-frames */ - const Word16 relE, /* i : frame relative E to the long term average */ - const Word16 L_look, /* i : look-ahead */ - Word16 *uc_clas /* o : temporary classification used in music/speech class*/ +/* o : classification for current frames */ +Word16 signal_clas_fx( + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 *speech, /* i : pointer to speech signal for E computation */ + const Word32 *ee, /* i : lf/hf E ration for 2 half-frames */ + const Word16 relE, /* i : frame relative E to the long term average */ + const Word16 L_look, /* i : look-ahead */ + Word16 *uc_clas /* o : temporary classification used in music/speech class*/ +); + +/* o : classification for current frames */ +Word16 signal_clas_ivas_fx( + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 *speech, /* i : pointer to speech signal for E computation */ + const Word32 *ee, /* i : lf/hf E ration for 2 half-frames */ + const Word16 relE, /* i : frame relative E to the long term average */ + const Word16 L_look, /* i : look-ahead */ + Word16 *uc_clas /* o : temporary classification used in music/speech class*/ ); void speech_music_classif_fx( - Encoder_State *st, /* i/o: state structure */ - const Word16 *new_inp, /* i : new input signal */ - const Word16 *inp, /* i : input signal to locate attach position */ - const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ - const Word16 lsp_new[M], /* i : LSPs in current frame Q15 */ - const Word16 cor_map_sum, /* i : correlation map sum (from multi-harmonic anal.)Q8*/ - const Word32 epsP[M + 1], /* i : LP prediciton error Q_esp*/ - const Word32 PS[], /* i : energy spectrum Q_new+QSCALE*/ - const Word16 Etot, /* i : total frame energy Q8 */ - const Word16 old_cor, /* i : max correlation from previous frame Q15 */ + Encoder_State *st, /* i/o: state structure */ + const Word16 *new_inp, /* i : new input signal */ + const Word16 *inp, /* i : input signal to locate attach position */ + const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + const Word16 lsp_new[M], /* i : LSPs in current frame Q15 */ + const Word16 cor_map_sum, /* i : correlation map sum (from multi-harmonic anal.) Q8*/ + const Word32 epsP[M + 1], /* i : LP prediciton error Q_esp*/ + const Word32 PS[], /* i : energy spectrum Q_new+QSCALE*/ + const Word16 Etot, /* i : total frame energy Q8 */ + const Word16 old_cor, /* i : max correlation from previous frame Q15 */ Word16 *attack_flag, /* o : flag to indicate if attack is to be treated by TC or GSC */ - Word16 non_sta, /* i : unbound non-stationarity for sp/mus classifier */ - Word16 relE, /* i : relative frame energy */ - Word16 Q_esp, /* i : scaling of esP */ - Word16 Q_inp, /* i : scaling of input */ - Word16 *high_lpn_flag_ptr, /* o : noise log prob flag for NOISE_EST */ - Word16 flag_spitch /* i : flag to indicate very short stable pitch */ + Word16 non_sta, /* i : unbound non-stationarity for sp/mus classifier */ + Word16 relE, /* i : relative frame energy */ + Word16 Q_esp, /* i : scaling of esP */ + Word16 Q_inp, /* i : scaling of input */ + Word16 *high_lpn_flag_ptr, /* o : noise log prob flag for NOISE_EST */ + Word16 flag_spitch /* i : flag to indicate very short stable pitch */ ); void StableHighPitchDetect_fx( - Word16 *flag_spitch, /* o : flag to indicate very short stable pitch */ + Word16 *flag_spitch, /* o : flag to indicate very short stable pitch*/ Word16 pitch[], /* i/o: OL pitch buffer */ const Word16 voicing[], /* i : OL pitch gains */ const Word16 wsp[], /* i : weighted speech */ @@ -616,10 +603,10 @@ void StableHighPitchDetect_ivas_fx( void swb_bwe_enc_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ - Word16 *old_input_12k8_fx, /* i : i signal @12.8kHz for SWB BWE */ - Word16 *old_input_16k_fx, /* i : i signal @16kHz for SWB BWE */ + Word16 *old_input_12k8_fx, /* i : i signal @12.8kHz for SWB BWE */ + Word16 *old_input_16k_fx, /* i : i signal @16kHz for SWB BWE */ const Word16 *old_syn_12k8_16k_fx, /* i : ACELP core synthesis at 12.8kHz or 16kHz */ - const Word16 *new_swb_speech_fx, /* i : original i signal at 32kHz */ + const Word16 *new_swb_speech_fx, /* i : original i signal at 32kHz */ Word16 *shb_speech_fx, /* i : SHB target signal (6-14kHz) at 16kHz */ const Word16 coder_type, /* i : coding type */ Word16 Q_shb_speech, @@ -627,11 +614,12 @@ void swb_bwe_enc_fx( void swb_bwe_enc_ivas_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 last_element_mode, /* i : last element mode */ - Word16 *old_input_12k8_fx, /* i : input signal @12.8kHz for SWB BWE */ - Word16 *old_input_16k_fx, /* i : input signal @16kHz for SWB BWE */ + const Word16 last_element_mode, /* i : last element mode */ + Word16 *old_input_12k8_fx, /* i : input signal @12.8kHz for SWB BWE */ + Word16 *old_input_16k_fx, /* i : input signal @16kHz for SWB BWE */ const Word16 *old_syn_12k8_16k_fx, /* i : ACELP core synthesis at 12.8kHz or 16kHz */ const Word16 *new_swb_speech_fx, /* i : original input signal at 32kHz */ + const Word16 Q_new_swb_speech, /* i : Q for new_swb_speech_fx */ Word16 *shb_speech_fx, /* i : SHB target signal (6-14kHz) at 16kHz */ Word16 Q_shb_speech, Word16 Q_slb_speech ); @@ -644,22 +632,19 @@ void swb_CNG_enc_fx( void swb_CNG_enc_ivas_fx( Encoder_State *st, /* i/o: State structure */ - const Word16 *shb_speech_fx, /* i : SHB target signal (6-14kHz) at 16kHz Q0 */ + const Word16 *shb_speech_fx, /* i : SHB target signal (6-14kHz) at 16kHz Q0 */ const Word16 *syn_12k8_16k_fx /* i : ACELP core synthesis at 12.8kHz or 16kHz Q0 */ ); void swb_pre_proc_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 *input_fx, /* i : original i signal */ - Word16 *new_swb_speech_fx, /* o : original i signal at 32kHz */ - Word16 *shb_speech_fx, /* o : SHB target signal (6-14kHz) at 16kHz */ - Word16 *Q_shb_spch /* o : shb target signal Q factor */ - , - Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] /* i : real buffer */ - , - Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] /* i : imag buffer */ - , - const CLDFB_SCALE_FACTOR *cldfbScale /* i : scale data of real and imag CLDFB buffers */ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 *input_fx, /* i : original i signal */ + Word16 *new_swb_speech_fx, /* o : original i signal at 32kHz */ + Word16 *shb_speech_fx, /* o : SHB target signal (6-14kHz) at 16kHz */ + Word16 *Q_shb_spch, /* o : shb target signal Q factor */ + Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : real buffer */ + Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : imag buffer */ + const CLDFB_SCALE_FACTOR *cldfbScale /* i : scale data of real and imag CLDFB buffers*/ ); void InitSWBencBufferStates_fx( @@ -670,19 +655,19 @@ void InitSWBencBufferStates_fx( void swb_tbe_enc_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ const Word16 coder_type, /* i : coding type */ - Word16 *new_speech_fx, /* i : original i signal */ + Word16 *new_speech_fx, /* i : original i signal */ Word32 *bwe_exc_extended_fx, /* i : bandwidth extended excitation */ const Word16 voice_factors_fx[], /* i : voicing factors */ Word16 *White_exc16k_fx, /* o : shaped white excitation for the FB TBE */ Word16 *Q_white_exc, /* o : generated white noise for FB Q factor */ Word16 Q_bwe_exc, /* i : bandwidth extended excitation Q factor */ - Word16 Q_shb, /* i : SHB target Q factor */ + Word16 Q_shb, /* i : SHB target Q factor */ Word16 *voicing_fx, /* i : OL maximum normalized correlation */ const Word16 pitch_buf[] /* i : pitch for each subframe */ ); void swb_tbe_enc_ivas_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ + Encoder_State *st_fx, /* i/o: encoder state structure */ STEREO_ICBWE_ENC_HANDLE hStereoICBWE, /* i/o: IC-BWE state structure */ Word16 *shb_speech_fx, /* i : SHB target signal (6-14kHz) at 16kHz Q_shb */ Word32 *bwe_exc_extended, /* i : bandwidth extended exciatation 2 * Q_new */ @@ -706,45 +691,48 @@ Word16 tfaEnc_TBE_fx( const Word16 *pitch_buf, /* Q6 */ const Word16 Q_enr ); -Word32 VAD_Log2( Word32 i_s32Val, - Word16 i_s16Q ); +Word32 VAD_Log2( + Word32 i_s32Val, + Word16 i_s16Q ); -Word32 VAD_L_ADD( Word32 s32Mantissa1, - Word16 i_tExp1, - Word32 s32Mantissa2, - Word16 i_tExp2, - Word16 *s16Exp ); +Word32 VAD_L_ADD( + Word32 s32Mantissa1, + Word16 i_tExp1, + Word32 s32Mantissa2, + Word16 i_tExp2, + Word16 *s16Exp ); -Word32 VAD_L_div( Word32 L_var1, - Word32 L_var2, - Word16 Q_L_var1, - Word16 Q_L_var2, - Word16 *Q_OUT ); +Word32 VAD_L_div( + Word32 L_var1, + Word32 L_var2, + Word16 Q_L_var1, + Word16 Q_L_var2, + Word16 *Q_OUT ); void vad_param_updt_fx( Encoder_State *st_fx, /* i/o: state structure */ const Word16 old_pitch1, /* i : OL pitch value from last frame */ const Word16 corr_shift, /* i : correlation shift Q15*/ - const Word16 corr_shiftR, /* i : correlation shift */ + const Word16 corr_shiftR, /* i : correlation shift */ const Word16 Az[], /* i: a coeffs Q12 */ - FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ - const Word16 n_channels /* i : number of channels */ + FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ + const Word16 n_channels /* i : number of channels */ ); void wb_bwe_enc_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 *new_wb_speech_fx, /* i : original i signal at 16kHz */ + const Word16 *new_wb_speech_fx, /* i : original i signal at 16kHz */ Word16 coder_type /* i : coding type */ ); void wb_bwe_enc_ivas_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 *new_wb_speech_fx /* i : original i signal at 16kHz */ + const Word16 *new_wb_speech_fx /* i : original i signal at 16kHz */ ); void wb_pre_proc_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 *new_inp_resamp16k, /* i : original i signal */ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 *new_inp_resamp16k, /* i : original i signal */ Word16 *hb_speech /* o : HB target signal (6-8kHz) at 16kHz */ ); @@ -775,47 +763,47 @@ void wb_tbe_enc_ivas_fx( const Word16 pitch_buf[] /* i : pitch for each subframe Q6 */ ); - Word16 wb_vad_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word32 fr_bands[], /* i : per band i energy (contains 2 vectors) Q_new+QSCALE*/ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word32 fr_bands[], /* i : per band i energy (contains 2 vectors) Q_new+QSCALE*/ Word16 *noisy_speech_HO, /* o : SC-VBR noisy speech HO flag */ Word16 *clean_speech_HO, /* o : SC-VBR clean speech HO flag */ Word16 *NB_speech_HO, /* o : SC-VBR NB speech HO flag */ Word16 *snr_sum_he, /* o : Output snr_sum as weighted spectral measure*/ Word16 *localVAD_HE_SAD, Word16 *flag_noisy_speech_snr, /* o : */ - const Word16 Q_new, /* i : scaling factor Q0 */ - VAD_HANDLE hVAD, /* i/o: VAD data handle */ - NOISE_EST_HANDLE hNoiseEst, /* i : Noise estimation handle */ + const Word16 Q_new, /* i : scaling factor Q0 */ + VAD_HANDLE hVAD, /* i/o: VAD data handle */ + NOISE_EST_HANDLE hNoiseEst, /* i : Noise estimation handle */ Word16 lp_speech, /* i : long term active speech energy average */ Word16 lp_noise /* i : long term noise energy */ ); Word16 wb_vad_ivas_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word32 fr_bands[], /* i : per band i energy (contains 2 vectors) q_fr_bands*/ - const Word16 q_fr_bands, /* i : Q of fr_bands */ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word32 fr_bands[], /* i : per band i energy (contains 2 vectors) q_fr_bands*/ + const Word16 q_fr_bands, /* i : Q of fr_bands */ Word16 *noisy_speech_HO, /* o : SC-VBR noisy speech HO flag */ Word16 *clean_speech_HO, /* o : SC-VBR clean speech HO flag */ Word16 *NB_speech_HO, /* o : SC-VBR NB speech HO flag */ Word16 *snr_sum_he, /* o : Output snr_sum as weighted spectral measure*/ Word16 *localVAD_HE_SAD, Word16 *flag_noisy_speech_snr, /* o : */ - VAD_HANDLE hVAD, /* i/o: VAD data handle */ - NOISE_EST_HANDLE hNoiseEst, /* i : Noise estimation handle */ + VAD_HANDLE hVAD, /* i/o: VAD data handle */ + NOISE_EST_HANDLE hNoiseEst, /* i : Noise estimation handle */ Word16 lp_speech, /* i : long term active speech energy average */ Word16 lp_noise /* i : long term noise energy */ ); -Word32 construct_snr_thresh_fx( Word16 sp_center[], /*(i) spectral center Q10*/ - Word32 snr_flux, /*(i) snr flux Q25*/ - Word32 lt_snr, /*(i) long time time domain snr Q25*/ - Word32 l_snr, /*(i) long time frequency domain snr Q25*/ - Word32 continuous_speech_num, /*(i) amount of continuous speech frames Q0*/ - Word16 continuous_noise_num, /*(i) amount of continuous noise frames Q0*/ - Word32 fg_energy_est_start, /*(i) whether if estimated energy Q0*/ - Word16 bw_index /*(i) band width index Q0*/ +Word32 construct_snr_thresh_fx( + Word16 sp_center[], /*(i) spectral center Q10*/ + Word32 snr_flux, /*(i) snr flux Q25*/ + Word32 lt_snr, /*(i) long time time domain snr Q25*/ + Word32 l_snr, /*(i) long time frequency domain snr Q25*/ + Word32 continuous_speech_num, /*(i) amount of continuous speech frames Q0*/ + Word16 continuous_noise_num, /*(i) amount of continuous noise frames Q0*/ + Word32 fg_energy_est_start, /*(i) whether if estimated energy Q0*/ + Word16 bw_index /*(i) band width index Q0*/ ); void sc_vbr_enc_init_fx( @@ -828,31 +816,45 @@ void updt_enc_common_fx( const Word16 Q_new /* i : CUrrent frame scaling */ ); -void attenuateNbSpectrum_fx( Word16 L_frame, Word32 *spectrum ); +void attenuateNbSpectrum_fx( + Word16 L_frame, + Word32 *spectrum ); -Word16 corr_xy1_fx( /* o : pitch gain (0..GAIN_PIT_MAX) */ - const Word16 xn_1[], /* i : target signal */ - const Word16 y1_1[], /* i : filtered adaptive codebook excitation */ - Word16 g_corr[], /* o : correlations and -2 */ - const Word16 L_subfr, /* i : vector length */ - const Word16 norm_flag /* i : flag for constraining pitch contribution */ - , - Flag *Overflow_out /* o : propagating the Overflow flag to upper level */ +/* o : pitch gain (0..GAIN_PIT_MAX) */ +Word16 corr_xy1_fx( + const Word16 xn_1[], /* i : target signal */ + const Word16 y1_1[], /* i : filtered adaptive codebook excitation */ + Word16 g_corr[], /* o : correlations and -2 */ + const Word16 L_subfr, /* i : vector length */ + const Word16 norm_flag, /* i : flag for constraining pitch contribution */ + Flag *Overflow_out /* o : propagating the Overflow flag to upper level */ ); -Word16 E_ACELP_indexing_fx( const Word16 code[] /*Q9*/, const PulseConfig *config, Word16 num_tracks /*Q0*/, Word16 prm[] /*Q(shift_bits)*/ ); -void fcb_pulse_track_joint_fx( UWord16 *idxs /*Q0*/, Word16 wordcnt /*Q0*/, UWord32 *index_n /*Q0*/, Word16 *pulse_num /*Q0*/, Word16 track_num /*Q0*/ ); +Word16 E_ACELP_indexing_fx( + const Word16 code[] /*Q9*/, + const PulseConfig *config, + Word16 num_tracks /*Q0*/, + Word16 prm[] /*Q(shift_bits)*/ ); + +void fcb_pulse_track_joint_fx( + UWord16 *idxs /*Q0*/, + Word16 wordcnt /*Q0*/, + UWord32 *index_n /*Q0*/, + Word16 *pulse_num /*Q0*/, + Word16 track_num /*Q0*/ ); + +/* o: quantization index */ +Word16 gain_quant_fx( + Word32 *gain, /* i/o: quantized gain */ + Word16 *gain16, + const Word16 c_min, /* i: log10 of lower limit in Q14 */ + const Word16 c_max, /* i: log10 of upper limit in Q13 */ + const Word16 bits, /* i: number of bits to quantize */ + Word16 *expg ); -Word16 gain_quant_fx( /* o: quantization index */ - Word32 *gain, /* i/o: quantized gain */ - Word16 *gain16, - const Word16 c_min, /* i: log10 of lower limit in Q14 */ - const Word16 c_max, /* i: log10 of upper limit in Q13 */ - const Word16 bits, /* i: number of bits to quantize */ - Word16 *expg ); void gsc_enc_fx( - Encoder_State *st_fx, /* i/o: State structure */ - Word16 res_dct_in[], /* i : dct of residual signal */ + Encoder_State *st_fx, /* i/o: State structure */ + Word16 res_dct_in[], /* i : dct of residual signal */ Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation */ const Word16 Diff_len, const Word16 bits_used, @@ -878,15 +880,11 @@ void LPDmem_enc_init_fx( LPD_state_HANDLE hLPDmem /* i/o: LP memories */ ); -void LPDmem_enc_init_ivas_fx( - LPD_state_HANDLE hLPDmem /* i/o: LP memories */ -); - void lsf_end_enc_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 *lsf, /* i : LSF in the frequency domain (0..6400) */ - Word16 *qlsf, /* o : quantized LSF */ - const Word16 nBits_in, /* i : number of bits to spend on ISF quantization */ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 *lsf, /* i : LSF in the frequency domain (0..6400) */ + Word16 *qlsf, /* o : quantized LSF */ + const Word16 nBits_in, /* i : number of bits to spend on ISF quantization */ const Word16 coder_type_org, /* i : coding type */ Word16 Q_ener, /* i : Q valuen for Bin_Ener */ Word16 force_sf, /* i : Force safety-net usage if coding type supports */ @@ -897,10 +895,10 @@ void lsf_end_enc_fx( ); void lsf_end_enc_ivas_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 *lsf, /* i : LSF in the frequency domain (0..6400) */ - Word16 *qlsf, /* o : quantized LSF */ - const Word16 nBits_in, /* i : number of bits to spend on ISF quantization */ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 *lsf, /* i : LSF in the frequency domain (0..6400) */ + Word16 *qlsf, /* o : quantized LSF */ + const Word16 nBits_in, /* i : number of bits to spend on ISF quantization */ const Word16 coder_type_org, /* i : coding type */ Word16 Q_ener, /* i : Q valuen for Bin_Ener */ Word16 force_sf, /* i : Force safety-net usage if coding type supports */ @@ -908,7 +906,7 @@ void lsf_end_enc_ivas_fx( Word16 *no_indices, Word16 *bits_param_lpc, Word16 coder_type_raw, /* i : Coder type (LSF coder_type have some special cases)*/ - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ + const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ); void Mode2_abs_pit_enc_fx( @@ -952,11 +950,12 @@ void norm_corr_ivas_fx( Word16 peak_avrg_ratio_fx( const Word32 total_brate, /* Q0 */ - const Word32 *input_hi_fx, /* i : i signal Q_coeff*/ + const Word32 *input_hi_fx, /* i : i signal Q_coeff*/ const Word16 length, /* i : number of coefficients Q0*/ Word16 *mode_count, /* i/o: HQ_HARMONIC mode count Q0*/ Word16 *mode_count1, /* i/o: HQ_NORMAL mode count Q0*/ Word16 Q_coeff ); + Word16 peak_avrg_ratio_ivas_fx( const Word32 total_brate, /* Q0 */ const Word32 *input_hi_fx, /* i : i signal Q_coeff*/ @@ -964,6 +963,7 @@ Word16 peak_avrg_ratio_ivas_fx( Word16 *mode_count, /* i/o: HQ_HARMONIC mode count Q0*/ Word16 *mode_count1, /* i/o: HQ_NORMAL mode count Q0*/ Word16 Q_coeff ); + void hvq_classifier_ivas_fx( const Word32 *input, /* i : input signal Q12 */ Word16 *prev_Npeaks, /* i/o: Peak number memory Q0 */ @@ -977,8 +977,9 @@ void hvq_classifier_ivas_fx( Word16 *hvq_hangover, /* i/o: Mode-switch hangover Q0 */ Word32 *L_pe_gains /* o : peak gains Q12 */ ); + void pit16k_Q_enc_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const Word16 nBits, /* i : # of Q bits */ const Word16 limit_flag, /* i : restrained(0) or extended(1) Q limits */ const Word16 T0, /* i : integer pitch lag */ @@ -987,45 +988,22 @@ void pit16k_Q_enc_fx( Word16 *T0_max /* o : delta search max */ ); -void pit16k_Q_enc_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 nBits, /* i : # of Q bits */ - const Word16 limit_flag, /* i : restrained(0) or extended(1) Q limits */ - const Word16 T0, /* i : integer pitch lag */ - const Word16 T0_frac, /* i : pitch fraction */ - Word16 *T0_min, /* i/o: delta search min */ - Word16 *T0_max /* o : delta search max_val */ -); - -Word16 pitch_fr4_fx( /* o : chosen integer pitch lag */ - const Word16 exc[], /* i : excitation buffer Q_new*/ - const Word16 xn[], /* i : target signal Q_new-1+shift*/ - const Word16 h[], /* i : weighted synthesis filter impulse response Q(14+shift)*/ - const Word16 t0_min, /* i : minimum value in the searched range. Q0*/ - const Word16 t0_max, /* i : maximum value in the searched range. Q0*/ - Word16 *pit_frac, /* o : chosen fraction (0, 1, 2 or 3) */ - const Word16 i_subfr, /* i : flag to first subframe */ - const Word16 limit_flag, /* i : flag for limits (0=restrained, 1=extended) */ - const Word16 t0_fr2, /* i : minimum value for resolution 1/2 */ - const Word16 t0_fr1, /* i : minimum value for resolution 1 */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 L_subfr /* i : size of subframe */ -); - -Word16 pitch_fr4_ivas_fx( /* o : chosen integer pitch lag */ - const Word16 exc[], /* i : excitation buffer Q_new */ - const Word16 xn[], /* i : target signal Q_new-1 */ - const Word16 h[], /* i : weighted synthesis filter impulse response Q(14 - norm_s[h[0]) */ - const Word16 t0_min, /* i : minimum value in the searched range. Q0 */ - const Word16 t0_max, /* i : maximum value in the searched range. Q0 */ - Word16 *pit_frac, /* o : chosen fraction (0, 1, 2 or 3) */ - const Word16 i_subfr, /* i : flag to first subframe */ - const Word16 limit_flag, /* i : flag for limits (0=restrained, 1=extended) */ - const Word16 t0_fr2, /* i : minimum value for resolution 1/2 */ - const Word16 t0_fr1, /* i : minimum value for resolution 1 */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 L_subfr, /* i : size of subframe */ - Word16 Q_new /* i */ +/* o : chosen integer pitch lag */ +Word16 pitch_fr4_fx( + const Word16 exc[], /* i : excitation buffer Q_new*/ + const Word16 xn[], /* i : target signal Q_new-1+shift*/ + const Word16 h[], /* i : weighted synthesis filter impulse response Q(14+shift)*/ + const Word16 t0_min, /* i : minimum value in the searched range. Q0*/ + const Word16 t0_max, /* i : maximum value in the searched range. Q0*/ + Word16 *pit_frac, /* o : chosen fraction (0, 1, 2 or 3) */ + const Word16 i_subfr, /* i : flag to first subframe */ + const Word16 limit_flag, /* i : flag for limits (0=restrained, 1=extended) */ + const Word16 t0_fr2, /* i : minimum value for resolution 1/2 */ + const Word16 t0_fr1, /* i : minimum value for resolution 1 */ + const Word16 L_frame, /* i : length of the frame */ + const Word16 L_subfr, /* i : size of subframe */ + const Word16 element_mode, /* i : mode element */ + const Word16 Q_new /* i : scaling factor */ ); void pit_Q_enc_fx( @@ -1041,22 +1019,11 @@ void pit_Q_enc_fx( Word16 *T0_max /* o : delta search max */ ); -void pit_Q_enc_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 nBits, /* i : # of Q bits */ - const Word16 delta, /* i : Half the CL searched interval */ - const Word16 pit_flag, /* i : absolute(0) or delta(1) pitch Q */ - const Word16 limit_flag, /* i : restrained(0) or extended(1) Q limits */ - const Word16 T0, /* i : integer pitch lag */ - const Word16 T0_frac, /* i : pitch fraction */ - Word16 *T0_min, /* i/o: delta search min */ - Word16 *T0_max /* o : delta search max_val */ -); +void PsychAdaptLowFreqEmph_fx( + Word32 x[], + const Word16 lpcGains[], + const Word16 lpcGains_e[] ); -void PsychAdaptLowFreqEmph_fx( Word32 x[], - const Word16 lpcGains[], - const Word16 lpcGains_e[] ); void set_bw_fx( const Word16 element_mode, /* i : element mode */ const Word32 element_brate, /* i : element bitrate */ @@ -1068,25 +1035,27 @@ void set_bw_stereo_fx( CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structures */ ); -Word16 WB_BWE_encoding_fx( /* o : classification of wb signal */ - const Word16 coder_type, /* i : coder type */ - const Word16 *yos_fx, /* i : MDCT coefficients of weighted original */ - Word16 *WB_fenv_fx, /* i/o: energy of WB envelope */ - Encoder_State *st_fx, /* i/o: Encoder structure */ - Word16 Q_synth, - Word16 Q_synth_lf ); +/* o : classification of wb signal */ +Word16 WB_BWE_encoding_fx( + const Word16 coder_type, /* i : coder type */ + const Word16 *yos_fx, /* i : MDCT coefficients of weighted original */ + Word16 *WB_fenv_fx, /* i/o: energy of WB envelope */ + Encoder_State *st_fx, /* i/o: Encoder structure */ + Word16 Q_synth, + Word16 Q_synth_lf ); -Word16 WB_BWE_encoding_ivas_fx( /* o : classification of wb signal */ - Encoder_State *st_fx, /* i/o: Encoder structure */ - const Word32 *yos_fx, /* i : MDCT coefficients of weighted original */ - Word16 *WB_fenv_fx, /* i/o: energy of WB envelope */ - Word16 Q_synth, - Word16 Q_synth_lf ); +/* o : classification of wb signal */ +Word16 WB_BWE_encoding_ivas_fx( + Encoder_State *st_fx, /* i/o: Encoder structure */ + const Word32 *yos_fx, /* i : MDCT coefficients of weighted original */ + Word16 *WB_fenv_fx, /* i/o: energy of WB envelope */ + Word16 Q_synth, + Word16 Q_synth_lf ); void calculate_hangover_attenuation_gain_fx( Encoder_State *st, /* i : encoder state structure */ Word16 *att, /* o : attenuation factor */ - const Word16 vad_hover_flag /* i : VAD hangover flag */ + const Word16 vad_hover_flag /* i : VAD hangover flag */ ); /*transient_detection.h*/ @@ -1097,14 +1066,16 @@ void calculate_hangover_attenuation_gain_fx( * Don't include the delay of the MDCT overlap. * @param pTransientDetection Structure to be initialized. It contains all transient detectors to be used. */ -void InitTransientDetection_fx( Word16 nFrameLength, - Word16 nTCXDelay, - struct TransientDetection *pTransientDetection ); +void InitTransientDetection_fx( + const Word16 nFrameLength, + const Word16 nTCXDelay, + TRAN_DET_HANDLE hTranDet ); -void InitTransientDetection_ivas_fx( Word16 nFrameLength, - Word16 nTCXDelay, - TRAN_DET_HANDLE pTransientDetection, - const Word16 ext_mem_flag ); +void InitTransientDetection_ivas_fx( + const Word16 nFrameLength, + const Word16 nTCXDelay, + TRAN_DET_HANDLE hTranDet, + const Word16 ext_mem_flag ); /** Runs transient detection. * Runs all transient detectors defined in pTransientDetection @@ -1113,14 +1084,16 @@ void InitTransientDetection_ivas_fx( Word16 nFrameLength, * @param nSamplesAvailable Number of new i samples available. * @param pTransientDetection Structure that contains transient detectors to be run. */ -void RunTransientDetection_fx( Word16 const *i, Word16 nSamplesAvailable, struct TransientDetection *pTransientDetection ); - +void RunTransientDetection_fx( + Word16 const *i, + const Word16 nSamplesAvailable, + TRAN_DET_HANDLE hTranDet ); void RunTransientDetection_ivas_fx( - Word16 *input_fx, /* i : input signal Q: q_input */ + Word16 *input_fx, /* i : input signal Q: q_input */ const Word16 length, /* i : frame length */ TRAN_DET_HANDLE hTranDet, /* i/o: transient detection handle */ - Word16 q_input /*i: stores q for input_fx*/ + Word16 q_input /* i : stores q for input_fx */ ); /** Get the average temporal flatness measure using subblock energies aligned with the TCX. @@ -1130,8 +1103,15 @@ void RunTransientDetection_ivas_fx( * @param nPrevSubblocks Number of subblocks from the previous frames to use for the calculation. * @return average temporal flatness measure with exponent AVG_FLAT_E */ -Word16 GetTCXAvgTemporalFlatnessMeasure_fx( struct TransientDetection const *pTransientDetection, Word16 nCurrentSubblocks, Word16 nPrevSubblocks ); -Word32 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( struct TransientDetection const *pTransientDetection, Word16 nCurrentSubblocks, Word16 nPrevSubblocks ); +Word16 GetTCXAvgTemporalFlatnessMeasure_fx( + TRAN_DET_HANDLE hTranDet, + const Word16 nCurrentSubblocks, + const Word16 nPrevSubblocks ); + +Word32 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( + TRAN_DET_HANDLE hTranDet, + const Word16 nCurrentSubblocks, + const Word16 nPrevSubblocks ); /** Get the maximum energy change using subblock energies aligned with the TCX. * @param pTransientDetection Structure that contains transient detectors to be run. @@ -1140,16 +1120,17 @@ Word32 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( struct TransientDetection const * @param nPrevSubblocks Number of subblocks from the previous frames to use for the calculation. * @param maximum energy change with exponent NRG_CHANGE_E */ -Word16 GetTCXMaxenergyChange_fx( struct TransientDetection const *pTransientDetection, - const Word8 isTCX10, - const Word16 nCurrentSubblocks, - const Word16 nPrevSubblocks ); - - -Word16 GetTCXMaxenergyChange_ivas_fx( TRAN_DET_HANDLE hTranDet, - const Word8 isTCX10, - const Word16 nCurrentSubblocks, - const Word16 nPrevSubblocks ); +Word16 GetTCXMaxenergyChange_fx( + TRAN_DET_HANDLE hTranDet, + const Word8 isTCX10, + const Word16 nCurrentSubblocks, + const Word16 nPrevSubblocks ); + +Word16 GetTCXMaxenergyChange_ivas_fx( + TRAN_DET_HANDLE hTranDet, + const Word8 isTCX10, + const Word16 nCurrentSubblocks, + const Word16 nPrevSubblocks ); /** Set TCX window length and overlap configuration * @param prevEnergyHF previous HF energy. Exponent must be the same as for currEnergyHF. @@ -1165,13 +1146,15 @@ void SetTCXModeInfo_ivas_fx( * @param prevEnergyHF previous HF energy. Exponent must be the same as for currEnergyHF. * @param currEnergyHF current HF energy. Exponent must be the same as for prevEnergyHF. */ -void SetTCXModeInfo_fx( Encoder_State *st, - struct TransientDetection const *pTransientDetection, - Word16 *tcxModeOverlap ); +void SetTCXModeInfo_fx( + Encoder_State *st, + TRAN_DET_HANDLE hTranDet, + Word16 *tcxModeOverlap ); void GSC_enc_init_fx( GSC_ENC_HANDLE hGSCEnc /* i/o: GSC data handle */ ); + void td_cng_enc_init_fx( TD_CNG_ENC_HANDLE hTdCngEnc, /* i/o: DTX/TD CNG data handle */ const Word16 Opt_DTX_ON, /* i : flag indicating DTX operation Q0*/ @@ -1189,6 +1172,7 @@ void dtx_enc_init_fx( const Word16 var_SID_rate_flag, /* i : flag for variable SID update rate Q0*/ const Word16 interval_SID /* i : interval for SID update Q0*/ ); + void select_TC_fx( const Word16 codec_mode, /* i : codec mode */ const Word16 tc_cnt, /* i : TC frame counter */ @@ -1218,6 +1202,7 @@ void pitchDoubling_det_fx( Word16 *pitch_ol, Word16 *T_op_fr, Word16 *voicing_fr ); + void fd_bwe_enc_init_fx( FD_BWE_ENC_HANDLE hBWE_FD /* i/o: FD BWE data handle */ ); @@ -1228,25 +1213,24 @@ void HQ_core_enc_init_fx( void AVQ_cod_lpc_fx( Word16 *nvec, /* i : vector to quantize (normalized) */ - Word16 *nvecq, /* o : quantized vector */ - Word16 *indx, /* o : index[] (4 bits per words) */ + Word16 *nvecq, /* o : quantized vector */ + Word16 *indx, /* o : index[] (4 bits per words) */ Word16 Nsv /* i : number of subvectors (lg=Nsv*8) */ ); void ProcessIGF_ivas_fx( - Encoder_State *st, /* i : Encoder state */ -#ifdef MSAN_FIX - Word16 powerSpec_len, /* i : length of pPowerSpectrum buffer */ -#endif + Encoder_State *st, /* i : Encoder state */ + Word16 powerSpec_len, /* i : length of pPowerSpectrum buffer */ Word32 *pMDCTSpectrum, /* i : MDCT spectrum */ + Word16 *q_spectrum, /* i/o: Q of spectrum */ const Word32 *pITFMDCTSpectrum, /* i : MDCT spectrum fir ITF */ - Word16 *q_spectrum, /* i/o: Q of spectrum */ + const Word16 q_ITFMDCTSpectrum, /* i : Q of MDCT spectrum fir ITF */ Word32 *pPowerSpectrum, /* i : MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 *q_powerSpec, /* i/o: Q of power spectrum */ + Word16 *q_powerSpec, /* i/o: Q of power spectrum */ const Word16 isTCX20, /* i : flag indicating if the input is TCX20 or TCX10/2xTCX5 */ const Word16 frameno, /* i : flag indicating index of current subframe */ - const Word16 sp_aud_decision0, /* i : first stage switching decision */ - const Word16 vad_hover_flag /* i : VAD hangover flag */ + const Word16 sp_aud_decision0, /* i : first stage switching decision */ + const Word16 vad_hover_flag /* i : VAD hangover flag */ ); void ProcessIGF_fx( @@ -1261,8 +1245,9 @@ void ProcessIGF_fx( Word16 isTransition, /**< in: flag indicating if the i is the transition from from ACELP to TCX20/TCX10 */ Word16 frameno /**< in: flag indicating index of current subframe */ ); + void AnalyzePowerSpectrum_fx( - Encoder_State *st, /* i/o: encoder states */ + Encoder_State *st, /* i/o: encoder states */ Word16 L_frame, /* i : frame length */ Word16 L_frameTCX, /* i : full band frame length */ Word16 left_overlap, /* i : left overlap length */ @@ -1274,7 +1259,7 @@ void AnalyzePowerSpectrum_fx( Word16 *powerSpec_e ); void AnalyzePowerSpectrum_ivas_fx( - Encoder_State *st, /* i/o: encoder states */ + Encoder_State *st, /* i/o: encoder states */ Word16 L_frame, /* i : frame length */ Word16 L_frameTCX, /* i : full band frame length */ Word16 left_overlap, /* i : left overlap length */ @@ -1282,41 +1267,50 @@ void AnalyzePowerSpectrum_ivas_fx( Word32 const mdctSpectrum[], /* i : MDCT spectrum */ Word16 mdctSpectrum_e, Word16 const signal[], /* i : windowed signal corresponding to mdctSpectrum */ - Word32 powerSpec[], /* o : Power spectrum. Can point to signal */ + const Word16 q_signal, + Word32 powerSpec[], /* o : Power spectrum. Can point to signal */ Word16 powerSpec_e[] ); -void AdaptLowFreqEmph_fx( Word32 x[], - Word16 x_e, - Word16 xq[], - Word16 invGain, - Word16 invGain_e, - Word16 tcx_lpc_shaped_ari, - Word16 lpcGains[], - Word16 lpcGains_e[], - const Word16 lg ); -Word16 SQ_gain_fx( /* o : SQ gain */ - Word32 x[], /* i : vector to quantize */ - Word16 x_e, /* i : exponent */ - Word16 nbitsSQ, /* i : number of bits targeted */ - Word16 lg, /* i : vector size (2048 max) */ - Word16 *gain_e ); /* o : SQ gain exponent */ - -Word16 SQ_gain_ivas_fx( /* o : SQ gain */ - Word32 x[], /* i : vector to quantize */ - Word16 x_e, /* i : exponent */ - Word16 nbitsSQ, /* i : number of bits targeted */ - Word16 lg, /* i : vector size (2048 max) */ - Word16 *gain_e ); /* o : SQ gain exponent */ - -Word16 SQ_gain_estimate_fx( /* o : SQ gain */ - Word32 x[], /* i : vector to quantize */ - Word16 x_e, /* i : exponent */ - Word16 nbitsSQ, /* i : number of bits targeted */ - Word16 lg, /* i : vector size (2048 max) */ - Word16 *gain_e ); /* o : SQ gain exponent */ +void AdaptLowFreqEmph_fx( + Word32 x[], + Word16 x_e, + Word16 xq[], + Word16 invGain, + Word16 invGain_e, + Word16 tcx_lpc_shaped_ari, + Word16 lpcGains[], + Word16 lpcGains_e[], + const Word16 lg ); + +/* o : SQ gain */ +Word16 SQ_gain_fx( + Word32 x[], /* i : vector to quantize */ + Word16 x_e, /* i : exponent */ + Word16 nbitsSQ, /* i : number of bits targeted */ + Word16 lg, /* i : vector size (2048 max) */ + Word16 *gain_e /* o : SQ gain exponent */ +); + +/* o : SQ gain */ +Word16 SQ_gain_ivas_fx( + Word32 x[], /* i : vector to quantize */ + Word16 x_e, /* i : exponent */ + Word16 nbitsSQ, /* i : number of bits targeted */ + Word16 lg, /* i : vector size (2048 max) */ + Word16 *gain_e /* o : SQ gain exponent */ +); + +/* o : SQ gain */ +Word16 SQ_gain_estimate_fx( + Word32 x[], /* i : vector to quantize */ + Word16 x_e, /* i : exponent */ + Word16 nbitsSQ, /* i : number of bits targeted */ + Word16 lg, /* i : vector size (2048 max) */ + Word16 *gain_e /* o : SQ gain exponent */ +); void tcx_scalar_quantization_fx( - Word32 *x, /* i: i coefficients */ + Word32 *x, /* i: i coefficients */ Word16 x_e, /* i: exponent */ Word16 *xq, /* o: quantized coefficients */ Word16 L_frame, /* i: frame length */ @@ -1327,7 +1321,7 @@ void tcx_scalar_quantization_fx( const Word16 alfe_flag ); Word16 tcx_scalar_quantization_rateloop_fx( - Word32 *x, /* i : i coefficients */ + Word32 *x, /* i : i coefficients */ Word16 x_e, /* i : exponent */ Word16 *xq, /* o : quantized coefficients */ Word16 L_frame, /* i : frame length */ @@ -1399,29 +1393,30 @@ void tcx_noise_factor_ivas_fx( ); void tcx_encoder_memory_update_ivas_fx( - Word16 *wsig, /* i : target weighted signal, Q_new */ - Word16 *xn_buf, /* i/o: mdct output buffer/time domain weigthed synthesis, Q_new */ - Word16 L_frame_glob, /* i: global frame length */ - const Word16 *Ai, /* i: Unquantized (interpolated) LPC coefficients, Q12 */ - const Word16 *A, /* i: Quantized LPC coefficients, Q = 14 - norm_s(A[0]) */ - Word16 preemph, /* i: preemphasis factor, Q15 */ - LPD_state *LPDmem, /* i/o: coder memory state */ + Word16 *wsig, /* i : target weighted signal, Q_new */ + Word16 *xn_buf, /* i/o: mdct output buffer/time domain weigthed synthesis, Q_new */ + Word16 L_frame_glob, /* i : global frame length */ + const Word16 *Ai, /* i : Unquantized (interpolated) LPC coefficients, Q12 */ + const Word16 *A, /* i : Quantized LPC coefficients, Q = 14 - norm_s(A[0]) */ + Word16 preemph, /* i : preemphasis factor, Q15 */ + LPD_state *LPDmem, /* i/o: coder memory state */ Encoder_State *st, Word16 *synthout, /* Q_new */ Word16 Q_new ); void tcx_encoder_memory_update_fx( - Word16 *wsig, /* i: targert weighted signal */ + Word16 *wsig, /* i: targert weighted signal */ Word16 *xn_buf, /* i/o: mdct output buffer/TD weigthed synthesis */ Word16 L_frame_glob, /* i: global frame length */ const Word16 *Ai, /* i: Unquantized (interpolated) LPC coefficients */ const Word16 *A, /* i: Quantized LPC coefficients */ - Word16 preemph, /* i: preemphasis factor*/ + Word16 preemph, /* i: preemphasis factor */ LPD_state *LPDmem, /* i/o: coder memory state */ Encoder_State *st, Word16 *synthout, /* o: synthesis signal */ Word16 Q_new, Word16 shift ); + Word16 tcx_ari_res_Q_spec_fx( const Word32 x_orig[], /* i: original spectrum Q31-e */ Word16 x_orig_e, /* i: original spectrum exponent Q0 */ @@ -1491,12 +1486,22 @@ Word16 tcx_res_Q_spec_ivas_fx( const Word16 lf_deemph_factors[] ); /* compute noise-measure flags for spectrum filling and quantization (0: tonal, 1: noise-like) */ -void ComputeSpectrumNoiseMeasure_fx( const Word32 *powerSpec, - Word16 L_frame, - Word16 startLine, - Word8 resetMemory, - Word8 *noiseFlags, - Word16 lowpassLine ); +void ComputeSpectrumNoiseMeasure_fx( + const Word32 *powerSpec, + Word16 L_frame, + Word16 startLine, + Word8 resetMemory, + Word8 *noiseFlags, + Word16 lowpassLine ); + +void ComputeSpectrumNoiseMeasure_ivas_fx( + Word64 *powerSpec, /* Qx */ + Word16 L_frame, /* Q0 */ + Word16 startLine, /* Q0 */ + Word8 resetMemory, /* Q0 */ + Word8 *noiseFlags, /* Q0 */ + Word16 lowpassLine /* Q0 */ +); void lpc_quantization_fx( Encoder_State *st, @@ -1551,28 +1556,18 @@ void Mode2_pit_encode_fx( Word16 pit_fr2, Word16 pit_max, Word16 pit_res_max ); -void E_ACELP_4tsearch_fx( Word16 dn[] /*Qdn*/, const Word16 cn[] /*Q_xn*/, const Word16 H[] /*Q12*/, Word16 code[] /*Q9*/, const PulseConfig *config, Word16 ind[] /*Q0*/, Word16 y[] /*Qy*/ ); -#ifdef FIX_ISSUE_1165 -void E_ACELP_4tsearch_ivas_fx( Word16 dn[] /*Qdn*/, const Word16 cn[] /*Q_xn*/, const Word16 H[] /*Q12*/, Word16 code[] /*Q9*/, const PulseConfig *config, Word16 ind[] /*Q0*/, Word16 y[] /*Qy*/ ); -#endif +void E_ACELP_4tsearch_fx( + Word16 dn[] /*Qdn*/, + const Word16 cn[] /*Q_xn*/, + const Word16 H[] /*Q12*/, + Word16 code[] /*Q9*/, + const PulseConfig *config, + Word16 ind[] /*Q0*/, + Word16 y[] /*Qy*/, + const Word16 element_mode ); void E_ACELP_4t_fx( - Word16 dn[], /* Qdn */ - Word16 cn[] /* Q_xn */, - Word16 H[], /* Q12 */ - Word16 R[], /* Qx */ - Word8 acelpautoc, - Word16 code[], /* Q9 */ - Word16 cdk_index, - Word16 _index[], - const Word16 L_frame, - const Word16 last_L_frame, - const Word32 total_brate, - const Word16 i_subfr, - const Word16 cmpl_flag ); - -void E_ACELP_4t_ivas_fx( Word16 dn[], /* Qdn */ Word16 cn[] /* Q_xn */, Word16 H[], /* Q12 */ @@ -1586,16 +1581,17 @@ void E_ACELP_4t_ivas_fx( const Word32 total_brate, const Word16 i_subfr, const Word16 cmpl_flag, - Word16 element_mode ); + const Word16 element_mode /*Q0*/ +); void E_ACELP_innovative_codebook_fx( - Word16 *exc, /* i : pointer to the excitation frame Q_new */ + Word16 *exc, /* i : pointer to the excitation frame Q_new */ Word16 T0, /* i : integer pitch lag Q0 */ Word16 T0_frac, /* i : fraction of lag Q0 */ Word16 T0_res, /* i : pitch resolution Q0 */ Word16 pitch_gain, /* i : adaptive codebook gain 1Q14 */ Word16 tilt_code, /* i : tilt factor Q15 */ - ACELP_config *acelp_cfg, /* i/o: configuration of the ACELP */ + ACELP_config *acelp_cfg, /* i/o: configuration of the ACELP */ Word16 i_subfr, /* i : subframe index */ const Word16 *Aq, /* i : quantized LPC coefficients 3Q12 */ Word16 *h1, /* i : impulse response of weighted synthesis filter 1Q14+shift */ @@ -1614,79 +1610,47 @@ void E_ACELP_innovative_codebook_fx( void CalculateTnsFilt_fx( STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ - const Word32 pSpectrum[], /* i : MDCT spectrum Qx*/ + const Word32 pSpectrum[], /* i : MDCT spectrum Qx*/ const Word16 pSpectrum_e, STnsData *pTnsData /* o : TNS data struct */ ); -/** Detect TNS parameters. - * Detects if TNS should be used and fills TNS data in pTnsData. - * @param pTnsConfig TNS configuration. - * @param pSpectrum Spectrum lines. - TNS is tested on the spectrum defined by pSpectrum. - * @param sbCnt Number of active subbands. - * @param pTnsData TNS data is filled with sensible information. - * @return Returns 1 if Tns should be used, otherwise 0. - */ -Word16 DetectTnsFilt_fx( STnsConfig const *pTnsConfig, - Word32 const pSpectrum[], - STnsData *pTnsData, - Word16 *predictionGain ); - -/** Detect TNS parameters. -* Detects if TNS should be used and fills TNS data in pTnsData. -* @param pTnsConfig TNS configuration. -* @param pSpectrum Spectrum lines. -TNS is tested on the spectrum defined by pSpectrum. -* @param sbCnt Number of active subbands. -* @param pTnsData TNS data is filled with sensible information. -* @return Returns 1 if Tns should be used, otherwise 0. -*/ -Word16 DetectTnsFilt_ivas_fx( STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ - Word32 const pSpectrum[], /* i : MDCT spectrum Q=Qx */ - STnsData *pTnsData, /* o : TNS data struct */ - TRAN_DET_HANDLE hTranDet, /* i : transient detection handle */ - Word8 isTCX10, /* i : TCX10 or TCX20? */ - Word16 ltp_gain, /* i : LTP gain Q=15 */ - Word16 *predictionGain /* o : TNS prediction gain Q=7 */ -); - - -/** Write TNS data into a stream of integers. - * Writes TNS data into a stream of integers. - * @param pTnsConfig TNS configuration. - * @param pTnsData TNS data to be written to a bitstream. - * @param stream Output stream of integers. - * @param pnSize Set to the number of elements written to the stream. - * @param pnBits Set to the number of required. - * @return 0 on success, otherwise 1. - */ -Word16 EncodeTnsData_fx( STnsConfig const *pTnsConfig, - STnsData const *pTnsData, - Word16 *stream, - Word16 *pnSize, - Word16 *pnBits ); - -/** Write TNS data into a bitstream. - * Writes TNS data into a bitstream. - * @param pTnsConfig TNS configuration. - * @param stream Contains TNS data written with EncodeTnsData. - * @param pnSize Set to the number of used elements from stream. - * @param st Encoder state. - * @param pnBits Set to the number of bits written. - * @return 0 on success, otherwise 1. - */ -Word16 WriteTnsData_fx( STnsConfig const *pTnsConfig, - Word16 const *stream, - Word16 *pnSize, - Encoder_State *st, - Word16 *pnBits ); - -Word16 WriteTnsData_ivas_fx( STnsConfig const *pTnsConfig, - Word16 const *stream, - Word16 *pnSize, - BSTR_ENC_HANDLE hBstr, - Word16 *pnBits ); +Word16 DetectTnsFilt_fx( + STnsConfig const *pTnsConfig, + Word32 const pSpectrum[], + STnsData *pTnsData, + Word16 *predictionGain ); + +Word16 DetectTnsFilt_ivas_fx( + STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ + Word32 const pSpectrum[], /* i : MDCT spectrum Q=Qx */ + STnsData *pTnsData, /* o : TNS data struct */ + TRAN_DET_HANDLE hTranDet, /* i : transient detection handle */ + Word8 isTCX10, /* i : TCX10 or TCX20? */ + Word16 ltp_gain, /* i : LTP gain Q=15 */ + Word16 *predictionGain /* o : TNS prediction gain Q=7 */ +); + +Word16 EncodeTnsData_fx( + STnsConfig const *pTnsConfig, + STnsData const *pTnsData, + Word16 *stream, + Word16 *pnSize, + Word16 *pnBits ); + +Word16 WriteTnsData_fx( + STnsConfig const *pTnsConfig, + Word16 const *stream, + Word16 *pnSize, + Encoder_State *st, + Word16 *pnBits ); + +Word16 WriteTnsData_ivas_fx( + STnsConfig const *pTnsConfig, + Word16 const *stream, + Word16 *pnSize, + BSTR_ENC_HANDLE hBstr, + Word16 *pnBits ); void subband_FFT_fx( Word32 **Sr, /*(i) real part of the CLDFB*/ @@ -1695,6 +1659,7 @@ void subband_FFT_fx( Word32 Offset, /*(i) offset of the CLDFB*/ Word16 *fftoQ /*(o) the Scaling */ ); + Word16 E_ACELP_toeplitz_mul_fx( const Word16 R[], /* Q9 */ const Word16 c[], /* Qx */ @@ -1702,7 +1667,13 @@ Word16 E_ACELP_toeplitz_mul_fx( const Word16 L_subfr, /* Q0 */ const Word16 highrate /* Q0 */ ); -Word16 E_ACELP_code43bit_fx( const Word16 code[], UWord32 *ps, Word16 *p, UWord16 idxs[] ); + +Word16 E_ACELP_code43bit_fx( + const Word16 code[], + UWord32 *ps, + Word16 *p, + UWord16 idxs[] ); + void tc_classif_enc_fx( const Word16 Q_new, /* i : scaling factor */ const Word16 L_frame, /* i : length of the frame */ @@ -1725,8 +1696,9 @@ Word16 gain_enc_uv_fx( Word16 mean_ener, /*0=rel */ - const Word32 sr_core /* i : internal sampling rate */ +/* o : number of allocated bits */ +Word16 vlpc_2st_cod_fx( + const Word16 *lsf, /* i : normalized vector to quantize */ + Word16 *lsfq, /* i/o: i:1st stage o:1st+2nd stage */ + Word16 *indx, /* o : index[] (4 bits per words) */ + const Word16 mode, /* i : 0=abs, >0=rel */ + const Word32 sr_core /* i : internal sampling rate */ ); Word16 update_decision_fx( @@ -3204,9 +3266,10 @@ void spec_center_fx( const Word16 Q_sb_p /* i : the Scaling of sb_power*/ ); -void spec_flatness_fx( Word32 *spec_amp, /*(i) spectral amplitude*/ - Word32 smooth_spec_amp[], /*(i) smoothed spectral amplitude*/ - Word16 sSFM[SFM_NUM] /*(o) spectral flatness rate*/ +void spec_flatness_fx( + Word32 *spec_amp, /*(i) spectral amplitude*/ + Word32 smooth_spec_amp[], /*(i) smoothed spectral amplitude*/ + Word16 sSFM[SFM_NUM] /*(o) spectral flatness rate*/ ); void SetModeIndex_fx( @@ -3227,6 +3290,7 @@ void MDCT_selector_fx( void MDCT_selector_reset_fx( TCX_ENC_HANDLE hTcxEnc ); + void MDCT_classifier_reset_fx( TCX_ENC_HANDLE hTcxEnc /* i/o: TCX Encoder Handle */ ); @@ -3238,6 +3302,7 @@ void ltd_stable_fx( const Word16 frameloop, /* i : amount of frames*/ const Word16 Q_frames_power /* i : the Scaling of frames_power*/ ); + /* IGFSCFEncoder.c */ void IGFSCFEncoderOpen_fx( IGFSCFENC_INSTANCE_HANDLE hPublicData, /* i/o: handle to public data */ @@ -3272,53 +3337,54 @@ void IGFSCFEncoderRestoreContextState_fx( ); void frame_spec_dif_cor_rate_fx( - VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ - Word32 *spec_amp, /* i : spectral amplitude scale*/ - Word16 sacle, /* i : the scaling of spec_amp */ - Word16 f_tonality_rate[3] /* o : tonality rate Qx*/ + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + Word32 *spec_amp, /* i : spectral amplitude scale*/ + Word16 sacle, /* i : the scaling of spec_amp */ + Word16 f_tonality_rate[3] /* o : tonality rate Qx*/ ); void est_energy_fx( - Word32 enerBuffer[CLDFB_NO_CHANNELS_MAX], /* i : energy vector per band enerBuffer_exp*/ - Word16 enerBuffer_exp, /* i : exponent of energy vector */ - Word32 *frame_sb_energy, /* o : energy of sub-band divided non-uniformly frame_sb_energy_scale*/ - Word32 *frame_energy2_p, /* o : frame energy 2 frame_energy2_Q*/ - Word32 *HB_Power_p, /* o : high frequency energy HB_Power_Q*/ - Word32 *frame_energy_p, /* o : frame energy 1 frame_energy_Q*/ - Word16 *sb_power_Q, /* o : the scaling of sb_power */ - Word16 *frame_energy2_Q, /* o : the scaling of frame_energy */ - Word16 *HB_Power_Q, /* o : the scaling of HB_Power */ - Word16 *frame_energy_Q, /* o : the Scaling of frame_energy */ - Word16 *frame_sb_energy_scale, /* o : the Scaling of frame_sb_energy[] */ - const Word32 bandwidth /* i : band width Q0*/ + Word32 enerBuffer[CLDFB_NO_CHANNELS_MAX], /* i : energy vector per band enerBuffer_exp*/ + Word16 enerBuffer_exp, /* i : exponent of energy vector */ + Word32 *frame_sb_energy, /* o : energy of sub-band divided non-uniformly frame_sb_energy_scale*/ + Word32 *frame_energy2_p, /* o : frame energy 2 frame_energy2_Q*/ + Word32 *HB_Power_p, /* o : high frequency energy HB_Power_Q*/ + Word32 *frame_energy_p, /* o : frame energy 1 frame_energy_Q*/ + Word16 *sb_power_Q, /* o : the scaling of sb_power */ + Word16 *frame_energy2_Q, /* o : the scaling of frame_energy */ + Word16 *HB_Power_Q, /* o : the scaling of HB_Power */ + Word16 *frame_energy_Q, /* o : the Scaling of frame_energy */ + Word16 *frame_sb_energy_scale, /* o : the Scaling of frame_sb_energy[] */ + const Word32 bandwidth /* i : band width Q0*/ ); void background_update_fx( - VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ - Word16 scale, /* i : the scaling of frame energy */ - Word32 frame_energy, /* i : current frame energy scale*/ - Word32 update_flag, /* i : update flag Q0*/ - Word16 music_backgound_f, /* i : background music flag Q0*/ + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + Word16 scale, /* i : the scaling of frame energy */ + Word32 frame_energy, /* i : current frame energy scale*/ + Word32 update_flag, /* i : update flag Q0*/ + Word16 music_backgound_f, /* i : background music flag Q0*/ Word32 snr /* Q25 */ ); /* enc_gain.c */ -Word16 E_GAIN_closed_loop_search_fx( Word16 exc[], /*Q_new*/ - Word16 xn[], /*Q_xn*/ - Word16 h[], /* Q14+shift */ - Word16 t0_min, - Word16 t0_min_frac, - Word16 t0_max, - Word16 t0_max_frac, - Word16 t0_min_max_res, - Word16 *pit_frac, - Word16 *pit_res, - Word16 pit_res_max, - Word16 i_subfr, - Word16 pit_min, - Word16 pit_fr2, - Word16 pit_fr1, - Word16 L_subfr ); +Word16 E_GAIN_closed_loop_search_fx( + Word16 exc[], /*Q_new*/ + Word16 xn[], /*Q_xn*/ + Word16 h[], /* Q14+shift */ + Word16 t0_min, + Word16 t0_min_frac, + Word16 t0_max, + Word16 t0_max_frac, + Word16 t0_min_max_res, + Word16 *pit_frac, + Word16 *pit_res, + Word16 pit_res_max, + Word16 i_subfr, + Word16 pit_min, + Word16 pit_fr2, + Word16 pit_fr1, + Word16 L_subfr ); void core_acelp_tcx20_switching_fx( Encoder_State *st, /* i/o: encoder state structure */ @@ -3344,31 +3410,33 @@ Word16 comvad_decision_fx( const Word16 frame_energy_Q, /*(i) the Scaling of current frame energy*/ Word16 *cldfb_addition, /*(o) adjust the harmonized hangover */ const Word16 vada_flag ); + void amr_wb_enc_init_fx( AMRWB_IO_ENC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO encoder handle */ ); void snr_calc( - VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ - const Word16 sacle_sbpower, /* i : the Scaling of sbpower */ - Word32 *snr, /* o : frequency domain SNR Q25*/ - Word32 *tsnr, /* o : time domain SNR Q25*/ - const Word32 frame_energy, /* i : current frame energy sacle_sbpower*/ - const Word32 bwidth /* i : audio band width Q0*/ + VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */ + const Word16 sacle_sbpower, /* i : the Scaling of sbpower */ + Word32 *snr, /* o : frequency domain SNR Q25*/ + Word32 *tsnr, /* o : time domain SNR Q25*/ + const Word32 frame_energy, /* i : current frame energy scale_sbpower*/ + const Word32 bwidth /* i : audio band width Q0*/ ); + void FEC_encode_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const ACELP_config acelp_cfg, /* i/o: configuration of the ACELP */ - const Word16 *synth, /* i : pointer to synthesized speech for E computation Q_synth*/ - const Word16 coder_type, /* i : type of coder Q0*/ - Word16 clas, /* i : signal clas for current frame Q0*/ - const Word16 *fpit, /* i : close loop fractional pitch buffer Q6*/ - const Word16 *res, /* i : LP residual signal frame Qx*/ - Word16 *last_pulse_pos, /* i/o: Position of the last pulse Q0*/ - const Word16 L_frame, /* i : Frame length Q0*/ - const Word32 total_brate, /* i : total codec bitrate Q0*/ - const Word16 Q_new, /* i : i scaling */ - const Word16 shift /* i : scaling to get 12bits */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const ACELP_config acelp_cfg, /* i/o: configuration of the ACELP */ + const Word16 *synth, /* i : pointer to synthesized speech for E computation Q_synth*/ + const Word16 coder_type, /* i : type of coder Q0*/ + Word16 clas, /* i : signal clas for current frame Q0*/ + const Word16 *fpit, /* i : close loop fractional pitch buffer Q6*/ + const Word16 *res, /* i : LP residual signal frame Qx*/ + Word16 *last_pulse_pos, /* i/o: Position of the last pulse Q0*/ + const Word16 L_frame, /* i : Frame length Q0*/ + const Word32 total_brate, /* i : total codec bitrate Q0*/ + const Word16 Q_new, /* i : i scaling */ + const Word16 shift /* i : scaling to get 12bits */ ); void updt_enc_fx( @@ -3384,56 +3452,37 @@ void updt_enc_fx( void dtx_hangover_control_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 lsp_new_fx[M] /* i : current frame LSPs Q15*/ + const Word16 lsp_new_fx[M] /* i : current frame LSPs Q15*/ ); void update_average_rate_fx( SC_VBR_ENC_HANDLE hSC_VBR, /* i/o: SC-VBR state structure */ const Word32 core_brate_fx /* i : core bitrate */ ); -Word16 pit_encode_fx( /* o : Fractional pitch for each subframe */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 pitch_bits[], /* i : pitch bits */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 coder_type, /* i : coding type */ - Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ - const Word16 i_subfr, /* i : subframe index */ - Word16 *exc, /* i/o: pointer to excitation signal frame */ - const Word16 L_subfr, /* i : subframe length */ - const Word16 *T_op, /* i : open loop pitch estimates in current frame */ - Word16 *T0_min, /* i/o: lower limit for close-loop search */ - Word16 *T0_max, /* i/o: higher limit for close-loop search */ - Word16 *T0, /* i/o: close loop integer pitch */ - Word16 *T0_frac, /* i/o: close loop fractional part of the pitch */ - const Word16 *h1, /* i : weighted filter i response */ - const Word16 *xn, /* i : target vector */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ -); - -Word16 pit_encode_ivas_fx( /* o : Fractional pitch for each subframe */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 pitch_bits[], /* i : pitch bits */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 coder_type, /* i : coding type */ - Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ - const Word16 i_subfr, /* i : subframe index */ - Word16 *exc, /* i/o: pointer to excitation signal frame Q_new */ - const Word16 L_subfr, /* i : subframe length */ - const Word16 *pitch, /* i : open loop pitch estimates in current frame */ - Word16 *T0_min, /* i/o: lower limit for close-loop search */ - Word16 *T0_max, /* i/o: higher limit for close-loop search */ - Word16 *T0, /* i/o: close loop integer pitch */ - Word16 *T0_frac, /* i/o: close loop fractional part of the pitch */ - const Word16 *h1, /* i : weighted filter input response Q(14 - norm_s(h1[0]) */ - const Word16 *xn, /* i : target vector Q_new */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer */ - Word16 Q_new /* i */ + +/* o : Fractional pitch for each subframe */ +Word16 pit_encode_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 pitch_bits[], /* i : pitch bits */ + const Word32 core_brate, /* i : core bitrate */ + const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const Word16 L_frame, /* i : length of the frame */ + const Word16 coder_type, /* i : coding type */ + Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ + const Word16 i_subfr, /* i : subframe index */ + Word16 *exc, /* i/o: pointer to excitation signal frame */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 *T_op, /* i : open loop pitch estimates in current frame */ + Word16 *T0_min, /* i/o: lower limit for close-loop search */ + Word16 *T0_max, /* i/o: higher limit for close-loop search */ + Word16 *T0, /* i/o: close loop integer pitch */ + Word16 *T0_frac, /* i/o: close loop fractional part of the pitch */ + const Word16 *h1, /* i : weighted filter i response */ + const Word16 *xn, /* i : target vector */ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer */ + const Word16 element_mode, /* i : mode element */ + const Word16 Q_new /* i : scaling factor */ ); Word16 lp_filt_exc_enc_fx( @@ -3453,23 +3502,6 @@ Word16 lp_filt_exc_enc_fx( Word16 *lp_flag /* i/o: mode selection Q0 */ ); -Word16 lp_filt_exc_enc_ivas_fx( - const Word16 codec_mode, /* i : MODE1 or MODE2 Q0 */ - const Word16 coder_type, /* i : coding type Q0 */ - const Word16 i_subfr, /* i : subframe index Q0 */ - Word16 *exc, /* i/o: pointer to excitation signal frame Q_new */ - const Word16 *h1, /* i : weighted filter i response Q(15) */ - const Word16 *xn, /* i : target vector Q_new-1+shift */ - Word16 *y1, /* o : zero-memory filtered adaptive excitation Q_new-1+shift */ - Word16 *xn2, /* o : target vector for innovation search Q_new-1+shift */ - const Word16 L_subfr, /* i : length of vectors for gain quantization Q0 */ - const Word16 L_frame, /* i : frame size Q0 */ - Word16 *g_corr, /* o : ACELP correlation values mant/exp */ - const Word16 clip_gain, /* i : adaptive gain clipping flag Q0 */ - Word16 *gain_pit, /* o : adaptive excitation gain Q14 */ - Word16 *lp_flag /* i/o: mode selection Q0 */ -); - Word16 inov_encode_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ const Word32 core_brate, /* i : core bitrate */ @@ -3477,7 +3509,7 @@ Word16 inov_encode_fx( const Word16 L_frame, /* i : length of the frame */ const Word16 last_L_frame, /* i : length of the last frame */ const Word16 coder_type, /* i : coding type */ - const Word16 bwidth, /* i : i signal bandwidth */ + const Word16 bwidth, /* i : i signal bandwidth */ const Word16 sharpFlag, /* i : formant sharpening flag */ const Word16 i_subfr, /* i : subframe index */ const Word16 tc_subfr, /* i : TC subframe index */ @@ -3522,48 +3554,28 @@ Word16 inov_encode_ivas_fx( Word16 Q_new ); void gain_enc_mless_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 gains_mode[], /* i : gain bits Q0*/ - const Word16 element_mode, /* i : element mode Q0*/ - const Word16 L_frame, /* i : length of the frame Q0*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - const Word16 *xn, /* i : target vector Q_xn*/ - const Word16 *y1, /* i : zero-memory filtered adaptive excitation Q_xn*/ - const Word16 Q_xn, /* i : xn and y1 scaling */ - const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ - const Word16 *code, /* i : algebraic excitation Q9*/ - const Word16 Es_pred, /* i : predicted scaled innovation energy Q8*/ - Word16 *gain_pit, /* o : quantized pitch gain Q14*/ - Word32 *gain_code, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ - Word16 *g_corr, /* i/o: correlations , -2,, -2 and 2 Qx*/ - const Word16 clip_gain /* i : gain pitch clipping flag (1 = clipping) Q0*/ -); - -void gain_enc_mless_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 gains_mode[], /* i : gain bits Q0*/ - const Word16 element_mode, /* i : element mode Q0*/ - const Word16 L_frame, /* i : length of the frame Q0*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - const Word16 *xn, /* i : target vector Q_xn*/ - const Word16 *y1, /* i : zero-memory filtered adaptive excitation Q_xn*/ - const Word16 Q_xn, /* i : xn and y1 scaling */ - const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ - const Word16 *code, /* i : algebraic excitation Q9*/ - const Word16 Es_pred, /* i : predicted scaled innovation energy Q8*/ - Word16 *gain_pit, /* o : quantized pitch gain Q14*/ - Word32 *gain_code, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ - Word16 *g_corr, /* i/o: correlations , -2,, -2 and 2 Qx*/ - const Word16 clip_gain /* i : gain pitch clipping flag (1 = clipping) Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 gains_mode[], /* i : gain bits Q0*/ + const Word16 element_mode, /* i : element mode Q0*/ + const Word16 L_frame, /* i : length of the frame Q0*/ + const Word16 i_subfr, /* i : subframe index Q0*/ + const Word16 tc_subfr, /* i : TC subframe index Q0*/ + const Word16 *xn, /* i : target vector Q_xn*/ + const Word16 *y1, /* i : zero-memory filtered adaptive excitation Q_xn*/ + const Word16 Q_xn, /* i : xn and y1 scaling */ + const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ + const Word16 *code, /* i : algebraic excitation Q9*/ + const Word16 Es_pred, /* i : predicted scaled innovation energy Q8*/ + Word16 *gain_pit, /* o : quantized pitch gain Q14*/ + Word32 *gain_code, /* o : quantized codebook gain Q16*/ + Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ + Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ + Word16 *g_corr, /* i/o: correlations , -2,, -2 and 2 Qx*/ + const Word16 clip_gain /* i : gain pitch clipping flag (1 = clipping) Q0*/ ); + void updt_IO_switch_enc_fx( - Encoder_State *st, /* i/o: state structure */ + Encoder_State *st, /* i/o: state structure */ const Word16 input_frame /* i : i frame length */ ); @@ -3576,31 +3588,31 @@ void hf_cod_init_fx( ); void analy_lp_AMR_WB_fx( - const Word16 speech[], /* i : pointer to the speech frame Q_new*/ - Word32 *ener, /* o : residual energy from Levinson-Durbin Q_r*/ - Word16 A[], /* o : A(z) filter coefficients Q14*/ - Word16 epsP_h[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 epsP_l[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 isp_new[], /* o : current frame ISPs Q15*/ - Word16 isp_old[], /* i/o: previous frame unquantized ISPs Q15*/ - Word16 isf_new[], /* o : current frame ISPs Q15*/ - Word16 Top, /* i : open loop pitch lag Q0*/ - Word16 Tnc, /* i : open loop pitch gain Qx*/ + const Word16 speech[], /* i : pointer to the speech frame Q_new*/ + Word32 *ener, /* o : residual energy from Levinson-Durbin Q_r*/ + Word16 A[], /* o : A(z) filter coefficients Q14*/ + Word16 epsP_h[], /* o : LP analysis residual energies for each iteration Q_r*/ + Word16 epsP_l[], /* o : LP analysis residual energies for each iteration Q_r*/ + Word16 isp_new[], /* o : current frame ISPs Q15*/ + Word16 isp_old[], /* i/o: previous frame unquantized ISPs Q15*/ + Word16 isf_new[], /* o : current frame ISPs Q15*/ + Word16 Top, /* i : open loop pitch lag Q0*/ + Word16 Tnc, /* i : open loop pitch gain Qx*/ Word16 Q_new, Word16 *Q_r ); void encod_amr_wb_fx( - Encoder_State *st, /* i/o: state structure */ - const Word16 speech[], /* i : i speech Q_new-1*/ - const Word16 Aw[], /* i : weighted A(z) unquantized for subframes Q12*/ - const Word16 Aq[], /* i : 12k8 Lp coefficient Q12*/ - const Word16 *res, /* i : residual signal Q_new*/ - Word16 *syn, /* i/o: core synthesis st->Q_syn*/ - Word16 *exc, /* i/o: current non-enhanced excitation Q_new*/ - Word16 *exc2, /* i/o: current enhanced excitation Q_new*/ - Word16 *pitch_buf, /* i/o: floating pitch values for each subframe Q6*/ - Word16 hf_gain_fx[NB_SUBFR], /* o : decoded HF gain Q0*/ - const Word16 *speech16k_fx, /* i : i speech @16kHz Qx*/ + Encoder_State *st, /* i/o: state structure */ + const Word16 speech[], /* i : i speech Q_new-1*/ + const Word16 Aw[], /* i : weighted A(z) unquantized for subframes Q12*/ + const Word16 Aq[], /* i : 12k8 Lp coefficient Q12*/ + const Word16 *res, /* i : residual signal Q_new*/ + Word16 *syn, /* i/o: core synthesis st->Q_syn*/ + Word16 *exc, /* i/o: current non-enhanced excitation Q_new*/ + Word16 *exc2, /* i/o: current enhanced excitation Q_new*/ + Word16 *pitch_buf, /* i/o: floating pitch values for each subframe Q6*/ + Word16 hf_gain_fx[NB_SUBFR], /* o : decoded HF gain Q0*/ + const Word16 *speech16k_fx, /* i : i speech @16kHz Qx*/ Word16 shift, Word16 Q_new ); @@ -3612,44 +3624,44 @@ void re8_cod_fx( ); void TBEreset_enc_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - Word16 bandwidth /* i : bandwidth mode */ + TD_BWE_ENC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + const Word16 last_core, /* i : last core */ + Word16 bandwidth /* i : bandwidth mode */ ); void acelp_core_switch_enc_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 inp12k8[], /* i : i signal @12.8 kHz Q0 */ - const Word16 inp16k[], /* i : i signal @16 kHz Q0 */ - const Word16 A[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 inp12k8[], /* i : i signal @12.8 kHz Q0 */ + const Word16 inp16k[], /* i : i signal @16 kHz Q0 */ + const Word16 A[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12 */ Word16 shift, Word16 Q_new ); void acelp_core_switch_enc_ivas_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 inp12k8[], /* i : i signal @12.8 kHz Q0 */ - const Word16 inp16k[], /* i : i signal @16 kHz Q0 */ - const Word16 A[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 inp12k8[], /* i : i signal @12.8 kHz Q0 */ + const Word16 inp16k[], /* i : i signal @16 kHz Q0 */ + const Word16 A[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12 */ Word16 shift, Word16 Q_new ); void gain_enc_amr_wb_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 *xn, /* i : target vector Q_xn*/ - const Word16 Q_xn, /* i : xn and yy1 format */ - const Word16 *yy1, /* i : zero-memory filtered adaptive excitation Q_xn*/ - const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ - const Word16 *code, /* i : algebraic excitation Q9*/ - const Word32 core_brate, /* i : core bitrate Q0*/ - Word16 *gain_pit, /* i/o: pitch gain / Quantized pitch gain Q14*/ - Word32 *gain_code, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ - Word16 *g_coeff, /* i/o: correlations , -2,, -2 and 2 Qx*/ - const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ - Word16 *past_qua_en /* i/o: gain quantization memory (4 words) Q10*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 *xn, /* i : target vector Q_xn*/ + const Word16 Q_xn, /* i : xn and yy1 format */ + const Word16 *yy1, /* i : zero-memory filtered adaptive excitation Q_xn*/ + const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ + const Word16 *code, /* i : algebraic excitation Q9*/ + const Word32 core_brate, /* i : core bitrate Q0*/ + Word16 *gain_pit, /* i/o: pitch gain / Quantized pitch gain Q14*/ + Word32 *gain_code, /* o : quantized codebook gain Q16*/ + Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ + Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ + Word16 *g_coeff, /* i/o: correlations , -2,, -2 and 2 Qx*/ + const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ + Word16 *past_qua_en /* i/o: gain quantization memory (4 words) Q10*/ ); - void hf_cod_fx( const Word32 core_brate_fx, /* i : core bitrate */ const Word16 *speech16k_fx, /* i : original speech at 16 kHz */ @@ -3718,13 +3730,13 @@ void transf_cdbk_enc_ivas_fx( ); void gain_enc_lbr_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const Word16 gains_mode[], /* i : gain bits Q0*/ const Word16 coder_type, /* i : coding type Q0*/ const Word16 i_subfr, /* i : subframe index Q0*/ const Word16 *xn, /* i : target vector Q_xn*/ const Word16 *y1, /* i : zero-memory filtered adaptive excitation Q_xn*/ - const Word16 Q_xn, /* i : xn and y1 format */ + const Word16 Q_xn, /* i : xn and y1 format */ const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ const Word16 *code, /* i : algebraic excitation Q9*/ Word16 *gain_pit, /* o : quantized pitch gain Q14*/ @@ -3734,65 +3746,27 @@ void gain_enc_lbr_fx( Word16 *g_corr, /* i/o: correlations , -2,, -2 and 2 mant/exp*/ Word32 gc_mem[], /* i/o: gain_code from previous subframes Q16*/ Word16 gp_mem[], /* i/o: gain_pitch from previous subframes Q14*/ - const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ - const Word16 L_subfr /* i : subframe length Q0*/ + const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ + const Word16 L_subfr, /* i : subframe length Q0*/ + const Word16 element_mode /* i : mode element Q0*/ ); -void gain_enc_lbr_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 gains_mode[], /* i : gain bits Q0*/ - const Word16 coder_type, /* i : coding type Q0*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 *xn, /* i : target vector Q_xn*/ - const Word16 *y1, /* i : zero-memory filtered adaptive excitation Q_xn*/ - const Word16 Q_xn, /* i : xn and y1 format */ - const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ - const Word16 *code, /* i : algebraic excitation Q9*/ +void gain_enc_SQ_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 gains_mode[], /* i : gain bits Q0*/ + const Word16 i_subfr, /* i : subframe index Q0*/ + const Word16 *xn, /* i : target vector Q_xn*/ + const Word16 *yy1, /* i : zero-memory filtered adaptive excitation Q_xn*/ + const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ + const Word16 *code, /* i : algebraic excitation Q9*/ + const Word16 Es_pred, /* i : predicted scaled innovation energy Q8*/ Word16 *gain_pit, /* o : quantized pitch gain Q14*/ Word32 *gain_code, /* o : quantized codebook gain Q16*/ Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ - Word16 *g_corr, /* i/o: correlations , -2,, -2 and 2 mant/exp*/ - Word32 gc_mem[], /* i/o: gain_code from previous subframes Q16*/ - Word16 gp_mem[], /* i/o: gain_pitch from previous subframes Q14*/ - const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ - const Word16 L_subfr /* i : subframe length Q0*/ -); - -void gain_enc_SQ_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 gains_mode[], /* i : gain bits Q0*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 *xn, /* i : target vector Q_xn*/ - const Word16 *yy1, /* i : zero-memory filtered adaptive excitation Q_xn*/ - const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ - const Word16 *code, /* i : algebraic excitation Q9*/ - const Word16 Es_pred, /* i : predicted scaled innovation energy Q8*/ - Word16 *gain_pit, /* o : quantized pitch gain Q14*/ - Word32 *gain_code, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ - Word16 *g_corr, /* i/o: correlations , ,, -2 and 2 Qx*/ - const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ - const Word16 Q_xn /* i : xn and y1 scaling */ -); - -void gain_enc_SQ_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 gains_mode[], /* i : gain bits Q0*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 *xn, /* i : target vector Q_xn*/ - const Word16 *yy1, /* i : zero-memory filtered adaptive excitation Q_xn*/ - const Word16 *y2, /* i : zero-memory filtered algebraic codebook excitation Q9*/ - const Word16 *code, /* i : algebraic excitation Q9*/ - const Word16 Es_pred, /* i : predicted scaled innovation energy Q8*/ - Word16 *gain_pit, /* o : quantized pitch gain Q14*/ - Word32 *gain_code, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ - Word16 *g_corr, /* i/o: correlations , ,, -2 and 2 Qx*/ - const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ - const Word16 Q_xn /* i : xn and y1 scaling */ + Word16 *g_corr, /* i/o: correlations , ,, -2 and 2 Qx*/ + const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ + const Word16 Q_xn /* i : xn and y1 scaling */ ); void updt_tar_fx( @@ -3802,20 +3776,21 @@ void updt_tar_fx( const Word16 gain, /* i : adaptive codebook gain */ const Word16 L /* i : subframe size */ ); + void updt_tar_HR_fx( - const Word16 *x, /* i : old target (for pitch search) */ - Word16 *x2, /* o : new target (for codebook search) */ - const Word16 *y, /* i : filtered adaptive codebook vector */ - const Word16 gain, /* i : adaptive codebook gain */ - const Word16 Qx, /* i : Scaling factor to adapt output to i */ - const Word16 L /* i : subframe size */ + const Word16 *x, /* i : old target (for pitch search) */ + Word16 *x2, /* o : new target (for codebook search) */ + const Word16 *y, /* i : filtered adaptive codebook vector */ + const Word16 gain, /* i : adaptive codebook gain */ + const Word16 Qx, /* i : Scaling factor to adapt output to i */ + const Word16 L /* i : subframe size */ ); Flag conv_fx( - const Word16 x[], /* i : i vector Q_new*/ - const Word16 h[], /* i : impulse response (or second i vector) Q(15)*/ - Word16 y[], /* o : output vetor (result of convolution) 12 bits*/ - const Word16 L /* i : vector size */ + const Word16 x[], /* i : i vector Q_new*/ + const Word16 h[], /* i : impulse response (or second i vector) Q(15)*/ + Word16 y[], /* o : output vetor (result of convolution) 12 bits*/ + const Word16 L /* i : vector size */ ); ivas_error ppp_voiced_encoder_fx( @@ -3824,13 +3799,13 @@ ivas_error ppp_voiced_encoder_fx( const Word16 bwidth, /* i : audio bandwidth */ const Word16 last_coder_type_raw, /* i : raw last_coder_type */ const Word16 old_pitch_buf[], /* i : buffer of old subframe pitch values */ - Word16 *in_fx, /* i : residual signal */ - Word16 *out_fx, /* o : Quantized residual signal */ - Word16 delay_fx, /* i : open loop pitch */ - Word16 *lpc1_fx, /* i : prev frame de-emphasized LPC */ - Word16 *lpc2_fx, /* i : current frame de-emphasized LPC */ - Word16 *exc_fx, /* i: previous frame quantized excitation */ - Word16 *pitch_fx, /* o: floating pitch values for each subframe */ + Word16 *in_fx, /* i : residual signal */ + Word16 *out_fx, /* o : Quantized residual signal */ + Word16 delay_fx, /* i : open loop pitch */ + Word16 *lpc1_fx, /* i : prev frame de-emphasized LPC */ + Word16 *lpc2_fx, /* i : current frame de-emphasized LPC */ + Word16 *exc_fx, /* i: previous frame quantized excitation */ + Word16 *pitch_fx, /* o: floating pitch values for each subframe */ Word16 Qres ); void signalling_enc_fx( @@ -3838,7 +3813,7 @@ void signalling_enc_fx( ); void transition_enc_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ + Encoder_State *st_fx, /* i/o: encoder state structure */ const Word16 i_subfr, /* i : subframe index */ Word16 *tc_subfr, /* i/o: TC subframe index */ Word16 *Jopt_flag, /* i : joint optimization flag */ @@ -3849,7 +3824,7 @@ void transition_enc_fx( Word16 *T0_max, /* i/o: higher limit for close-loop search Q0*/ Word16 *exc_fx, /* i/o: pointer to excitation signal frame Q_new*/ Word16 *y1_fx, /* o : zero-memory filtered adaptive excitation Q_new-1+shift*/ - const Word16 *h1_fx, /* i : weighted filter i response Q(14+shift)*/ + const Word16 *h1_fx, /* i : weighted filter i response Q(14+shift)*/ const Word16 *xn_fx, /* i : target vector Q_new-1+shift*/ Word16 *xn2_fx, /* o : target vector for innovation search Q_new-1+shift*/ Word16 *gp_cl_fx, /* i/o: memory of gain of pitch clipping algorithm */ @@ -3859,13 +3834,12 @@ void transition_enc_fx( Word16 **pt_pitch_fx, /* o : floating pitch values */ Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_new*/ Word16 *unbits_ACELP, /* i/o: unused bits */ - Word16 Q_new, /* i : Current scaling */ - Word16 shift /* i : downscaling needs for 12 bits convolutions */ - + Word16 Q_new, /* i : Current scaling */ + Word16 shift /* i : downscaling needs for 12 bits convolutions */ ); void transition_enc_ivas_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ + Encoder_State *st_fx, /* i/o: encoder state structure */ const Word16 i_subfr, /* i : subframe index */ Word16 *tc_subfr, /* i/o: TC subframe index */ Word16 *Jopt_flag, /* i : joint optimization flag */ @@ -3886,13 +3860,12 @@ void transition_enc_ivas_fx( Word16 **pt_pitch_fx, /* o : floating pitch values */ Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_new*/ Word16 *unbits_ACELP, /* i/o: unused bits */ - Word16 Q_new, /* i : Current scaling */ - Word16 shift /* i : downscaling needs for 12 bits convolutions */ - + Word16 Q_new, /* i : Current scaling */ + Word16 shift /* i : downscaling needs for 12 bits convolutions */ ); void gain_enc_tc_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const Word16 gains_mode[], /* i : gain bits Q0*/ const Word16 i_subfr, /* i : subframe index Q0*/ const Word16 xn_fx[], /* i : target vector Q_xn*/ @@ -3903,69 +3876,69 @@ void gain_enc_tc_fx( Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ Word16 *gain_inov_fx, /* o : innovation gain Q12*/ Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ - const Word16 Q_xn /* i : xn and y1 scaling */ + const Word16 Q_xn /* i : xn and y1 scaling */ ); void gain_enc_tc_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 gains_mode[], /* i : gain bits Q0*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 xn_fx[], /* i : target vector Q_xn*/ - const Word16 y2_fx[], /* i : zero-memory filtered algebraic codebook excitation Q_xn*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 Es_pred_fx, /* i : predicted scaled innovation energy Q8*/ - Word16 *gain_pit_fx, /* o : Pitch gain / Quantized pitch gain Q14*/ - Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov_fx, /* o : innovation gain Q12*/ - Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q6*/ - const Word16 Q_xn /* i : xn and y1 scaling */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 gains_mode[], /* i : gain bits Q0*/ + const Word16 i_subfr, /* i : subframe index Q0*/ + const Word16 xn_fx[], /* i : target vector Q_xn*/ + const Word16 y2_fx[], /* i : zero-memory filtered algebraic codebook excitation Q_xn*/ + const Word16 code_fx[], /* i : algebraic excitation Q9*/ + const Word16 Es_pred_fx, /* i : predicted scaled innovation energy Q8*/ + Word16 *gain_pit_fx, /* o : Pitch gain / Quantized pitch gain Q14*/ + Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ + Word16 *gain_inov_fx, /* o : innovation gain Q12*/ + Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q6*/ + const Word16 Q_xn /* i : xn and y1 scaling */ ); Word16 gaus_encode_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 *h1, /* i : weighted filter input response Q14*/ - const Word16 *xn, /* i : target vector Q12*/ - Word16 *exc, /* o : pointer to excitation signal frame Q_new*/ - Word16 *mem_w0, /* o : weighting filter denominator memory Q_new*/ - Word16 *clip_gain, /* o : memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ - Word16 *tilt_code, /* o : synthesis excitation spectrum tilt Q15*/ - Word16 *code, /* o : algebraic excitation Q9*/ - Word32 *gain_code, /* o : Code gain. Q16*/ - Word16 *y2, /* o : zero-memory filtered adaptive excitation Q9*/ - Word16 *gain_inov, /* o : innovation gain Q12*/ - Word16 *voice_fac, /* o : voicing factor Q15*/ - Word16 *gain_pit, /* o : adaptive excitation gain Q14*/ - const Word16 Q_new, /* i : scaling factor */ - const Word16 shift, /* i : scaling factor */ - Word32 *norm_gain_code /* o : normalized innovative cb. gain Q16*/ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 i_subfr, /* i : subframe index Q0*/ + const Word16 *h1, /* i : weighted filter input response Q14*/ + const Word16 *xn, /* i : target vector Q12*/ + Word16 *exc, /* o : pointer to excitation signal frame Q_new*/ + Word16 *mem_w0, /* o : weighting filter denominator memory Q_new*/ + Word16 *clip_gain, /* o : memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ + Word16 *tilt_code, /* o : synthesis excitation spectrum tilt Q15*/ + Word16 *code, /* o : algebraic excitation Q9*/ + Word32 *gain_code, /* o : Code gain. Q16*/ + Word16 *y2, /* o : zero-memory filtered adaptive excitation Q9*/ + Word16 *gain_inov, /* o : innovation gain Q12*/ + Word16 *voice_fac, /* o : voicing factor Q15*/ + Word16 *gain_pit, /* o : adaptive excitation gain Q14*/ + const Word16 Q_new, /* i : scaling factor */ + const Word16 shift, /* i : scaling factor */ + Word32 *norm_gain_code /* o : normalized innovative cb. gain Q16*/ ); Word16 gaus_encode_ivas_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 i_subfr, /* i : subframe index Q0*/ - const Word16 *h1, /* i : weighted filter input response Q14*/ - const Word16 *xn, /* i : target vector Q12*/ - Word16 *exc, /* o : pointer to excitation signal frame Q_new*/ - Word16 *mem_w0, /* o : weighting filter denominator memory Q_new*/ - Word16 *clip_gain, /* o : memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ - Word16 *tilt_code, /* o : synthesis excitation spectrum tilt Q15*/ - Word16 *code, /* o : algebraic excitation Q9*/ - Word32 *gain_code, /* o : Code gain. Q16*/ - Word16 *y2, /* o : zero-memory filtered adaptive excitation Q9*/ - Word16 *gain_inov, /* o : innovation gain Q12*/ - Word16 *voice_fac, /* o : voicing factor Q15*/ - Word16 *gain_pit, /* o : adaptive excitation gain Q14*/ - const Word16 Q_new, /* i : scaling factor */ - const Word16 shift, /* i : scaling factor */ - Word32 *norm_gain_code /* o : normalized innovative cb. gain Q16*/ + const Word16 i_subfr, /* i : subframe index Q0*/ + const Word16 *h1, /* i : weighted filter input response Q14*/ + const Word16 *xn, /* i : target vector Q12*/ + Word16 *exc, /* o : pointer to excitation signal frame Q_new*/ + Word16 *mem_w0, /* o : weighting filter denominator memory Q_new*/ + Word16 *clip_gain, /* o : memory of gain of pitch clipping algorithm [2.56x,Q14,Q8,Q0,Q14,Q14]*/ + Word16 *tilt_code, /* o : synthesis excitation spectrum tilt Q15*/ + Word16 *code, /* o : algebraic excitation Q9*/ + Word32 *gain_code, /* o : Code gain. Q16*/ + Word16 *y2, /* o : zero-memory filtered adaptive excitation Q9*/ + Word16 *gain_inov, /* o : innovation gain Q12*/ + Word16 *voice_fac, /* o : voicing factor Q15*/ + Word16 *gain_pit, /* o : adaptive excitation gain Q14*/ + const Word16 Q_new, /* i : scaling factor */ + const Word16 shift, /* i : scaling factor */ + Word32 *norm_gain_code /* o : normalized innovative cb. gain Q16*/ ); void pre_proc_fx( Encoder_State *st, /* i/o: encoder state structure */ const Word16 input_frame, /* i : frame length */ - Word16 old_inp_12k8[], /* i/o: buffer of old i signal */ - Word16 old_inp_16k[], /* i/o: buffer of old i signal @ 16kHz */ + Word16 old_inp_12k8[], /* i/o: buffer of old i signal */ + Word16 old_inp_16k[], /* i/o: buffer of old i signal @ 16kHz */ Word16 **inp, /* o : ptr. to inp. signal in the current frame */ Word32 fr_bands[2 * NB_BANDS], /* o : energy in frequency bands */ Word16 *Etot, /* o : total energy */ @@ -3981,33 +3954,35 @@ void pre_proc_fx( Word16 lsp_new[M], /* o : LSPs at the end of the frame */ Word16 lsp_mid[M], /* o : LSPs in the middle of the frame */ Word16 *vad_hover_flag, - Word16 *attack_flag, /* o : flag signalling attack encoded by AC mode (GSC) */ + Word16 *attack_flag, /* o : flag signalling attack encoded by AC mode (GSC) */ Word16 *new_inp_resamp16k, /* o : new i signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ - Word16 *Voicing_flag, /* o : voicing flag for HQ FEC */ - Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o : cldfb real buffer */ - Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o : cldfb imag buffer */ - CLDFB_SCALE_FACTOR *cldfbScale, /* o : cldfb scale */ - Word16 *old_exc, /* i/o: static excitation memory */ - Word16 *hq_core_type, /* o : HQ core type */ + Word16 *Voicing_flag, /* o : voicing flag for HQ FEC */ + Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o : cldfb real buffer */ + Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o : cldfb imag buffer */ + CLDFB_SCALE_FACTOR *cldfbScale, /* o : cldfb scale */ + Word16 *old_exc, /* i/o: static excitation memory */ + Word16 *hq_core_type, /* o : HQ core type */ Word16 *Q_new, Word16 *shift, Word16 *Q_r ); void swb_bwe_enc_hr_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ - Word16 *new_input_fx, /* i : i signal */ - Word16 new_input_fx_exp, /* i : Exponent of i signal */ + Word16 *new_input_fx, /* i : i signal */ + Word16 new_input_fx_exp, /* i : Exponent of i signal */ const Word16 input_frame, /* i : frame length */ const Word16 unbits /* i : number of core unused bits */ ); -Word16 gain_enc_gaus_fx( /* o : Return index of quantization */ - Word32 *gain, /* i/o: Code gain to quantize Q16*/ - const Word16 bits, /* i : number of bits to quantize Q0*/ - const Word16 lowBound, /* i : lower bound of quantizer (dB) Q8*/ - const Word16 stepSize, /* i : Step size choice Q14*/ - const Word16 inv_stepSize /* i : Step size choice Q15*/ +/* o : Return index of quantization */ +Word16 gain_enc_gaus_fx( + Word32 *gain, /* i/o: Code gain to quantize Q16*/ + const Word16 bits, /* i : number of bits to quantize Q0*/ + const Word16 lowBound, /* i : lower bound of quantizer (dB) Q8*/ + const Word16 stepSize, /* i : Step size choice Q14*/ + const Word16 inv_stepSize /* i : Step size choice Q15*/ ); + void enc_pit_exc_fx( Encoder_State *st_fx, /* i/o: State structure */ const Word16 *speech, /* i : Input speech Q_new-1*/ @@ -4022,9 +3997,9 @@ void enc_pit_exc_fx( Word16 *pitch_buf, /* i/o: Fractionnal per subframe pitch Q6*/ const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ Word16 *gpit, /* o : pitch mean gpit Q15*/ - Word16 *saved_bit_pos, /* o : saved position in the bitstream before pitch contribution Q0*/ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ - const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer Q6*/ + Word16 *saved_bit_pos, /* o : saved position in the bitstream before pitch contribution Q0*/ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ + const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer Q6*/ Word16 Q_new, Word16 shift ); @@ -4042,29 +4017,31 @@ void enc_pit_exc_ivas_fx( Word16 *pitch_buf, /* i/o: Fractionnal per subframe pitch Q6*/ const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ Word16 *gpit, /* o : pitch mean gpit Q15*/ - Word16 *saved_bit_pos, /* o : saved position in the bitstream before pitch contribution Q0*/ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ - const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer Q6*/ + Word16 *saved_bit_pos, /* o : saved position in the bitstream before pitch contribution Q0*/ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ + const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer Q6*/ Word16 Q_new, Word16 shift ); -Word16 Pit_exc_contribution_len_fx( /* o : bin where pitch contribution is significant */ - Encoder_State *st_fx, /* i/o: state structure */ - const Word16 *dct_res, /* i : DCT of residual Qnew*/ - Word16 *dct_pitex, /* i/o: DCT of pitch contribution Qnew*/ - Word16 *pitch_buf, /* i/o: Pitch per subframe Q6*/ - const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ - Word16 *hangover, /* i : hangover for the time contribution switching Q0*/ - Word16 Qnew ); - -Word16 Pit_exc_contribution_len_ivas_fx( /* o : bin where pitch contribution is significant */ - Encoder_State *st_fx, /* i/o: state structure */ - const Word16 *dct_res, /* i : DCT of residual Qnew*/ - Word16 *dct_pitex, /* i/o: DCT of pitch contribution Qnew*/ - Word16 *pitch_buf, /* i/o: Pitch per subframe Q6*/ - const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ - Word16 *hangover, /* i : hangover for the time contribution switching Q0*/ - Word16 Qnew ); +/* o : bin where pitch contribution is significant */ +Word16 Pit_exc_contribution_len_fx( + Encoder_State *st_fx, /* i/o: state structure */ + const Word16 *dct_res, /* i : DCT of residual Qnew*/ + Word16 *dct_pitex, /* i/o: DCT of pitch contribution Qnew*/ + Word16 *pitch_buf, /* i/o: Pitch per subframe Q6*/ + const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ + Word16 *hangover, /* i : hangover for the time contribution switching Q0*/ + Word16 Qnew ); + +/* o : bin where pitch contribution is significant */ +Word16 Pit_exc_contribution_len_ivas_fx( + Encoder_State *st_fx, /* i/o: state structure */ + const Word16 *dct_res, /* i : DCT of residual Qnew*/ + Word16 *dct_pitex, /* i/o: DCT of pitch contribution Qnew*/ + Word16 *pitch_buf, /* i/o: Pitch per subframe Q6*/ + const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ + Word16 *hangover, /* i : hangover for the time contribution switching Q0*/ + Word16 Qnew ); Word16 pvq_core_enc_fx( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ @@ -4082,6 +4059,7 @@ Word16 pvq_core_enc_fx( Word16 *maxpulse, /* i : maximum pulse per band */ const Word16 core /* i : number of bands */ ); + Word16 pvq_core_enc_ivas_fx( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ Word16 coefs_norm[], /* i/o: normalized coefficients to encode */ @@ -4121,7 +4099,6 @@ void hq_lr_enc_ivas_fx( const Word16 is_transient_fx /* i : Q0 : transient flag */ ); - void hq_hr_enc_fx( Encoder_State *st_fx, /* i/o: encoder state structure fx */ Word32 *t_audio, /* i/o: transform-domain coefficients Q12 */ @@ -4154,28 +4131,32 @@ void diffcod_fx( Word16 *difidx /* (o) differential code Q0*/ ); -Word16 hq_classifier_enc_fx( /* o : Consumed bits Q0 */ - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 length, /* i : Frame length Q0 */ - const Word32 *coefs, /* i : Spectral coefficients Q12 */ - const Word16 is_transient, /* i : Transient flag Q0 */ - Word16 *Npeaks, /* o : Number of identified peaks Q0 */ - Word16 *peaks, /* o : Peak indices Q0 */ - Word32 *pe_gains, /* o : Peak gains Q12 */ - Word32 *nf_gains, /* o : Noise-fill gains Q12 */ - Word16 *hqswb_clas /* o : HQ class Q0 */ -); -Word16 hq_classifier_enc_ivas_fx( /* o : Consumed bits Q0 */ - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 length, /* i : Frame length Q0 */ - const Word32 *coefs, /* i : Spectral coefficients Q12 */ - const Word16 is_transient, /* i : Transient flag Q0 */ - Word16 *Npeaks, /* o : Number of identified peaks Q0 */ - Word16 *peaks, /* o : Peak indices Q0 */ - Word32 *pe_gains, /* o : Peak gains Q12 */ - Word32 *nf_gains, /* o : Noise-fill gains Q12 */ - Word16 *hqswb_clas /* o : HQ class Q0 */ +/* o : Consumed bits Q0 */ +Word16 hq_classifier_enc_fx( + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 length, /* i : Frame length Q0 */ + const Word32 *coefs, /* i : Spectral coefficients Q12 */ + const Word16 is_transient, /* i : Transient flag Q0 */ + Word16 *Npeaks, /* o : Number of identified peaks Q0 */ + Word16 *peaks, /* o : Peak indices Q0 */ + Word32 *pe_gains, /* o : Peak gains Q12 */ + Word32 *nf_gains, /* o : Noise-fill gains Q12 */ + Word16 *hqswb_clas /* o : HQ class Q0 */ +); + +/* o : Consumed bits Q0 */ +Word16 hq_classifier_enc_ivas_fx( + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 length, /* i : Frame length Q0 */ + const Word32 *coefs, /* i : Spectral coefficients Q12 */ + const Word16 is_transient, /* i : Transient flag Q0 */ + Word16 *Npeaks, /* o : Number of identified peaks Q0 */ + Word16 *peaks, /* o : Peak indices Q0 */ + Word32 *pe_gains, /* o : Peak gains Q12 */ + Word32 *nf_gains, /* o : Noise-fill gains Q12 */ + Word16 *hqswb_clas /* o : HQ class Q0 */ ); + void diff_envelope_coding_fx( const Word16 is_transient, /* i : transient indicator Q0 */ const Word16 num_env_bands, /* i : number of envelope bands to code Q0 */ @@ -4185,16 +4166,16 @@ void diff_envelope_coding_fx( Word16 *difidx /* o : differential code Q0 */ ); -Word16 encode_envelope_indices_ivas_fx( /* o : Number of bits if flag_pack=0,0 if flag_pack=1 Q0 */ - BSTR_ENC_HANDLE hBstr, /* i : handle to the bitstream Q0 */ - const Word16 num_sfm, /* i : Number of subbands Q0 */ - const Word16 numnrmibits, /* i : Bitrate of fall-back coding mode Q0 */ - Word16 *difidx, /* i/o: Diff indices/encoded diff indices Q0 */ - Word16 *LCmode, /* o : Coding mode if flag_pack=0, i : if flag_pack=1 Q0 */ - const Word16 flag_pack, /* i : indicator of packing or estimating bits Q0 */ - const Word16 flag_HQ2 /* i : indicator of HQ2 core Q0 */ - , - const Word16 is_transient /* i : indicator of HQ_TRANSIENT Q0 */ +/* o : Number of bits if flag_pack=0,0 if flag_pack=1 Q0 */ +Word16 encode_envelope_indices_ivas_fx( + BSTR_ENC_HANDLE hBstr, /* i : handle to the bitstream Q0 */ + const Word16 num_sfm, /* i : Number of subbands Q0 */ + const Word16 numnrmibits, /* i : Bitrate of fall-back coding mode Q0 */ + Word16 *difidx, /* i/o: Diff indices/encoded diff indices Q0 */ + Word16 *LCmode, /* o : Coding mode if flag_pack=0, i : if flag_pack=1 Q0 */ + const Word16 flag_pack, /* i : indicator of packing or estimating bits Q0 */ + const Word16 flag_HQ2, /* i : indicator of HQ2 core Q0 */ + const Word16 is_transient /* i : indicator of HQ_TRANSIENT Q0 */ ); void hq_generic_encoding_fx( @@ -4214,34 +4195,38 @@ void normalizecoefs_fx( Word16 *coefs_norm /* o : Normalized output vector (Q12) */ ); -Word16 hvq_enc_fx( /* o : Consumed bits */ - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word32 brate, /* i : Total bit rate */ - const Word16 hvq_bits, /* i : HVQ bit budget */ - const Word16 Npeaks, /* i : Number of peaks */ - const Word16 *ynrm, /* i : Envelope coefficients */ - Word16 *R, /* i/o: Bit allocation/updated bit allocation */ - Word16 *peaks, /* i : Peak pos. / Encoded peak pos. */ - Word32 *nf_gains, /* i/o: Noise fill gains / Quant. nf gains */ - Word16 *noise_level, /* o : Quantized noise level */ - const Word32 *pe_gains, /* i : Peak gains */ - const Word32 *coefs, /* i : spectrum coefficients in Q14 */ - Word32 *coefs_out /* o : encoded spectrum coefficients in Q14 */ -); -Word16 hvq_enc_ivas_fx( /*o : Consumed bits */ - Encoder_State *st_fx, /*i/o: encoder state structure */ - const Word32 core_brate, /*i : Total bit rate */ - const Word16 hvq_bits, /*i : HVQ bit budget */ - const Word16 Npeaks, /*i : Number of peaks */ - const Word16 *ynrm, /* i : Envelope coefficients */ - Word16 *R, /* i/o: Bit allocation/updated bit allocation */ - Word16 *peaks, /* i : Peak pos. / Encoded peak pos. */ - Word32 *nf_gains, /* i/o: Noise fill gains / Quant. nf gains Q12 */ - Word16 *noise_level, /* o : Quantized noise level Q15 */ - const Word32 *pe_gains, /* i : Peak gains */ - const Word32 *coefs, /* i : spectrum coefficients in Q12 */ - Word32 *coefs_out /* o : encoded spectrum coefficients in Q12 */ +/* o : Consumed bits */ +Word16 hvq_enc_fx( + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word32 brate, /* i : Total bit rate */ + const Word16 hvq_bits, /* i : HVQ bit budget */ + const Word16 Npeaks, /* i : Number of peaks */ + const Word16 *ynrm, /* i : Envelope coefficients */ + Word16 *R, /* i/o: Bit allocation/updated bit allocation */ + Word16 *peaks, /* i : Peak pos. / Encoded peak pos. */ + Word32 *nf_gains, /* i/o: Noise fill gains / Quant. nf gains */ + Word16 *noise_level, /* o : Quantized noise level */ + const Word32 *pe_gains, /* i : Peak gains */ + const Word32 *coefs, /* i : spectrum coefficients in Q14 */ + Word32 *coefs_out /* o : encoded spectrum coefficients in Q14 */ +); + +/* o : Consumed bits */ +Word16 hvq_enc_ivas_fx( + Encoder_State *st_fx, /*i/o: encoder state structure */ + const Word32 core_brate, /*i : Total bit rate */ + const Word16 hvq_bits, /*i : HVQ bit budget */ + const Word16 Npeaks, /*i : Number of peaks */ + const Word16 *ynrm, /* i : Envelope coefficients */ + Word16 *R, /* i/o: Bit allocation/updated bit allocation */ + Word16 *peaks, /* i : Peak pos. / Encoded peak pos. */ + Word32 *nf_gains, /* i/o: Noise fill gains / Quant. nf gains Q12 */ + Word16 *noise_level, /* o : Quantized noise level Q15 */ + const Word32 *pe_gains, /* i : Peak gains */ + const Word32 *coefs, /* i : spectrum coefficients in Q12 */ + Word32 *coefs_out /* o : encoded spectrum coefficients in Q12 */ ); + Word16 pvq_core_enc_fx( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ Word16 coefs_norm[], /* i/o: normalized coefficients to encode */ @@ -4259,14 +4244,16 @@ Word16 pvq_core_enc_fx( const Word16 core /* i : number of bands */ ); -Word16 noise_adjust_fx( /* o : index of noise attenuation Q0 */ - const Word16 *coeffs_norm, /* i : normalized coefficients Qx */ - const Word16 qx, /* i : Q value of coeffs_norm */ - const Word16 *bitalloc, /* i : bit allocation Q0 */ - const Word16 *sfm_start, /* i : band start Q0 */ - const Word16 *sfm_end, /* i : band end Q0 */ - const Word16 core_sfm /* i : index of the end band for core Q0 */ +/* o : index of noise attenuation Q0 */ +Word16 noise_adjust_fx( + const Word16 *coeffs_norm, /* i : normalized coefficients Qx */ + const Word16 qx, /* i : Q value of coeffs_norm */ + const Word16 *bitalloc, /* i : bit allocation Q0 */ + const Word16 *sfm_start, /* i : band start Q0 */ + const Word16 *sfm_end, /* i : band end Q0 */ + const Word16 core_sfm /* i : index of the end band for core Q0 */ ); + ivas_error tcq_core_LR_enc_fx( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ Word16 inp_vector_fx[], /* x5 */ @@ -4287,7 +4274,6 @@ ivas_error tcq_core_LR_enc_fx( const Word16 adjustFlag, const Word16 is_transient ); - ivas_error tcq_core_LR_enc_ivas_fx( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ Word32 inp_vector[], @@ -4308,17 +4294,18 @@ ivas_error tcq_core_LR_enc_ivas_fx( const Word16 adjustFlag, const Word16 is_transient ); -Word16 encode_envelope_indices_fx( /* o : Number of bits if flag_pack=0,0 if flag_pack=1 Q0 */ - BSTR_ENC_HANDLE hBstr, /* i : handle to the bitstream Q0 */ - const Word16 num_sfm, /* i : Number of subbands Q0 */ - const Word16 numnrmibits, /* i : Bitrate of fall-back coding mode Q0 */ - Word16 *difidx, /* i/o: Diff indices/encoded diff indices Q0 */ - Word16 *LCmode, /* o : Coding mode if flag_pack=0, i : if flag_pack=1 Q0 */ - const Word16 flag_pack, /* i : indicator of packing or estimating bits Q0 */ - const Word16 flag_HQ2 /* i : indicator of HQ2 core Q0 */ - , - const Word16 is_transient /* i : indicator of HQ_TRANSIENT Q0 */ +/* o : Number of bits if flag_pack=0,0 if flag_pack=1 Q0 */ +Word16 encode_envelope_indices_fx( + BSTR_ENC_HANDLE hBstr, /* i : handle to the bitstream Q0 */ + const Word16 num_sfm, /* i : Number of subbands Q0 */ + const Word16 numnrmibits, /* i : Bitrate of fall-back coding mode Q0 */ + Word16 *difidx, /* i/o: Diff indices/encoded diff indices Q0 */ + Word16 *LCmode, /* o : Coding mode if flag_pack=0, i : if flag_pack=1 Q0 */ + const Word16 flag_pack, /* i : indicator of packing or estimating bits Q0 */ + const Word16 flag_HQ2, /* i : indicator of HQ2 core Q0 */ + const Word16 is_transient /* i : indicator of HQ_TRANSIENT Q0 */ ); + void diffcod_lrmdct_fx( const Word16 N, /* i : number of sub-vectors Q0*/ const Word16 be_ref, /* i : band energy reference Q0*/ @@ -4326,9 +4313,10 @@ void diffcod_lrmdct_fx( Word16 *difidx, /* o : differential code Q0*/ const Word16 is_transient /* i : transient flag Q0*/ ); + Word16 peak_vq_enc_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 bwidth, /* i : audio bandwidth */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 bwidth, /* i : audio bandwidth */ const Word32 *coefs, /* i : Input coefficient vector Q12 */ Word32 *coefs_out, /* o : Quantized output vector Q12 */ const Word32 core_brate, /* i : Core bitrate */ @@ -4339,9 +4327,10 @@ Word16 peak_vq_enc_ivas_fx( Word16 *vq_peak_idx, /* i : Peak index vector */ Word32 *nf_gains /* i : Estimated noise floor gains Q12 */ ); + Word16 peak_vq_enc_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 bwidth, /* i : audio bandwidth */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 bwidth, /* i : audio bandwidth */ const Word32 *coefs, /* i : Input coefficient vector Q12 */ Word32 *coefs_out, /* o : Quantized output vector Q12 */ const Word32 brate, /* i : Core bitrate */ @@ -4357,10 +4346,6 @@ void wb_vad_init_fx( VAD_HANDLE hVAD /* i/o: VAD data handle */ ); -void wb_vad_init_ivas_fx( - VAD_HANDLE hVAD /* i/o: VAD data handle */ -); - void noise_est_init_fx( NOISE_EST_HANDLE hNoiseEst /* i/o: Noise estimation handle */ ); @@ -4370,28 +4355,27 @@ void noise_est_init_ivas_fx( ); void InitSWBencBuffer_fx( - Encoder_State *st_fx /* i/o: SHB encoder structure */ + TD_BWE_ENC_HANDLE hBWE_TD /* i/o: TD BWE data handle */ ); void InitSWBencBuffer_ivas_fx( - Encoder_State *st_fx /* i/o: SHB encoder structure */ + TD_BWE_ENC_HANDLE hBWE_TD /* i/o: TD BWE data handle */ ); void ResetSHBbuffer_Enc_fx( - Encoder_State *st_fx /* i/o: SHB encoder structure */ + TD_BWE_ENC_HANDLE hBWE_TD /* i/o: TD BWE data handle */ ); + Word16 E_ACELP_hh_corr( Word16 *x /*Q11*/, Word16 *y /*Qy*/, Word16 L_subfr /*Q0*/, Word16 bits /*Q0*/ ); -void acelp_1t64_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 dn[], /* i : corr. between target and h[]. */ - const Word16 h[], /* i : impulse response of weighted synthesis filter */ - Word16 code[], /* o : algebraic (fixed) codebook excitation */ - Word16 y[], /* o : filtered fixed codebook excitation */ - const Word16 L_subfr /* i : subframe length */ +Word16 E_ACELP_hh_corr( + Word16 *x /*Q11*/, + Word16 *y /*Qy*/, + Word16 L_subfr /*Q0*/, + Word16 bits /*Q0*/ ); -void acelp_1t64_ivas_fx( +void acelp_1t64_fx( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const Word16 dn[], /* i : corr. between target and h[]. */ const Word16 h[], /* i : impulse response of weighted synthesis filter */ @@ -4408,16 +4392,8 @@ void acelp_2t32_fx( Word16 y[] /* o : filtered fixed codebook excitation */ ); -void acelp_2t32_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 dn[], /* i : corr. between target and h[]. */ - const Word16 h[], /* i : impulse response of weighted synthesis filter */ - Word16 code[], /* o : algebraic (fixed) codebook excitation */ - Word16 y[] /* o : filtered fixed codebook excitation */ -); - Word16 acelp_4t64_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ Word16 dn[], /* i : corr. between target and h[]. */ const Word16 cn[], /* i : residual after long term prediction Q_new*/ const Word16 H[], /* i : impulse response of weighted synthesis filter Q12*/ @@ -4427,249 +4403,257 @@ Word16 acelp_4t64_fx( Word16 y[], /* o : filtered fixed codebook excitation Q9*/ Word16 nbbits, /* i : number of bits per codebook */ const Word16 cmpl_flag, /* i : coomplexity reduction flag */ - const Word16 Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ -); - -Word16 acelp_4t64_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 dn[], /* i : corr. between target and h[]. */ - const Word16 cn[], /* i : residual after long term prediction Q_new*/ - const Word16 H[], /* i : impulse response of weighted synthesis filter Q12*/ - Word16 R[], /* i : autocorrelation values */ - const Word16 acelpautoc, /* i : autocorrealtion flag */ - Word16 code[], /* o : algebraic (fixed) codebook excitation Q9*/ - Word16 y[], /* o : filtered fixed codebook excitation Q9*/ - Word16 nbbits, /* i : number of bits per codebook */ - const Word16 cmpl_flag, /* i : complexity reduction flag */ const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - Word16 element_mode ); + const Word16 element_mode ); ivas_error evs_enc_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 *data, /* i : input signal Q0*/ - Word32 *mem_hp20_in_fx, /* i/o: hp20 filter memory Qx*/ - const Word16 n_samples /* i : number of input samples Q0*/ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 *data, /* i : input signal Q0*/ + Word32 *mem_hp20_in_fx, /* i/o: hp20 filter memory Qx*/ + const Word16 n_samples /* i : number of input samples Q0*/ ); +/* o: Qx y(n) */ /* y(n)(Qx) = alpha(Q15) * x(Qx) + (1.0f-alpha)* y(n-1) (Qx) */ -Word16 noise_est_AR1_Qx( /* o: Qx y(n) */ - Word16 x, /* i : Qx x(n) */ - Word16 y, /* i : Qx y(n-1) */ - Word16 alpha /*i : Q15 scaling of driving x(n) */ +Word16 noise_est_AR1_Qx( + Word16 x, /* i : Qx x(n) */ + Word16 y, /* i : Qx y(n-1) */ + Word16 alpha /* i : Q15 scaling of driving x(n) */ ); + +/*o : Qx y( n ) */ +Word32 noise_est_AR1_Qx_32( + Word32 x, /* i : Qx x(n) */ + Word32 y, /* i : Qx y(n-1) */ + Word32 alpha /* i : Q15 scaling of driving x(n) */ +); + void FEC_lsf_estim_enc_fx( - Encoder_State *st_fx, /* i : Encoder static memory */ + Encoder_State *st_fx, /* i : Encoder static memory */ Word16 *lsf /* o : estimated LSF vector Qlog2(2.56)*/ ); Word32 mslvq_cng_fx( - Word16 idx_cv, /* i : index of cv from previous stage */ - Word16 *pTmp, /* i : 16 dimensional i vector x2.56*/ - Word16 *quant, /* o : quantized vector x2.56*/ + Word16 idx_cv, /* i : index of cv from previous stage */ + Word16 *pTmp, /* i : 16 dimensional i vector x2.56*/ + Word16 *quant, /* o : quantized vector x2.56*/ Word16 *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) Q13*/ - Word16 *idx_lead, /* o : leader index for each 8-dim subvector */ - Word16 *idx_scale, /* o : scale index for each subvector */ - const Word16 *w, /* i : weights for LSF quantization Q10*/ + Word16 *idx_lead, /* o : leader index for each 8-dim subvector */ + Word16 *idx_scale, /* o : scale index for each subvector */ + const Word16 *w, /* i : weights for LSF quantization Q10*/ Word16 *no_scales ); Word32 mslvq_cng_ivas_fx( - Word16 idx_cv, /* i : index of cv from previous stage */ - Word16 *pTmp, /* i : 16 dimensional i vector x2.56*/ - Word16 *quant, /* o : quantized vector x2.56*/ + Word16 idx_cv, /* i : index of cv from previous stage */ + Word16 *pTmp, /* i : 16 dimensional i vector x2.56*/ + Word16 *quant, /* o : quantized vector x2.56*/ Word16 *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) Q13*/ - Word16 *idx_lead, /* o : leader index for each 8-dim subvector */ - Word16 *idx_scale, /* o : scale index for each subvector */ - const Word16 *w /* i : weights for LSF quantization Q10*/ + Word16 *idx_lead, /* o : leader index for each 8-dim subvector */ + Word16 *idx_scale, /* o : scale index for each subvector */ + const Word16 *w /* i : weights for LSF quantization Q10*/ ); void Unified_weighting_fx( - const Word32 Bin_Ener_128_fx[], /* i : FFT Bin energy 128 bins in two sets Q_ener */ + const Word32 Bin_Ener_128_fx[], /* i : FFT Bin energy 128 bins in two sets Q_ener */ Word16 Q_ener, - const Word16 lsf_fx[], /* i : LSF vector x2.56 */ - Word16 w_fx[], /* o : LP weighting filter (numerator) Q8 */ - const Word16 narrowBand, /* i : flag for Narrowband Q0*/ - const Word16 unvoiced, /* i : flag for Unvoiced frame Q0*/ - const Word32 sr_core, /* i : sampling rate of core-coder Q0*/ - const Word16 order /* i : LP order Q0*/ + const Word16 lsf_fx[], /* i : LSF vector x2.56 */ + Word16 w_fx[], /* o : LP weighting filter (numerator) Q8 */ + const Word16 narrowBand, /* i : flag for Narrowband Q0*/ + const Word16 unvoiced, /* i : flag for Unvoiced frame Q0*/ + const Word32 sr_core, /* i : sampling rate of core-coder Q0*/ + const Word16 order /* i : LP order Q0*/ ); Word32 qlsf_ARSN_tcvq_Enc_16k_fx( const Word16 *x_fx, /* i : Vector to be encoded x2.65 */ Word16 *y_fx, /* o : Quantized LSF vector x2.65 */ - Word16 *indice, /* o : Indices */ - const Word16 *w_fx, /* i : LSF Weights Q10 */ - const Word16 nBits, /* i : number of bits */ - Word16 safety_net /* i : safety_net flag */ + Word16 *indice, /* o : Indices */ + const Word16 *w_fx, /* i : LSF Weights Q10 */ + const Word16 nBits, /* i : number of bits */ + Word16 safety_net /* i : safety_net flag */ ); Word32 mslvq_fx( - Word16 *pTmp, /* i : M-dimensional i vector */ - Word16 *quant, /* o : quantized vector */ - Word16 *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) */ - Word16 *idx_lead, /* o : leader index for each 8-dim subvector */ - Word16 *idx_scale, /* o : scale index for each subvector */ - Word16 *w, /* i : weights for LSF quantization */ - Word16 mode, /* i : number indicating the coding type (V/UV/G...)*/ - Word16 mode_glb, /* i : LVQ coding mode */ - Word16 pred_flag, /* i : prediction flag (0: safety net, 1 - predictive )*/ + Word16 *pTmp, /* i : M-dimensional i vector */ + Word16 *quant, /* o : quantized vector */ + Word16 *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) */ + Word16 *idx_lead, /* o : leader index for each 8-dim subvector */ + Word16 *idx_scale, /* o : scale index for each subvector */ + Word16 *w, /* i : weights for LSF quantization */ + Word16 mode, /* i : number indicating the coding type (V/UV/G...) */ + Word16 mode_glb, /* i : LVQ coding mode */ + Word16 pred_flag, /* i : prediction flag (0: safety net, 1 - predictive ) */ Word16 no_scales[][2] ); - -Word16 multi_harm_fx( /* o : frame multi-harmonicity (1-harmonic, 0-not) */ - const Word16 Bin_E[], /* i : log-energy spectrum of the current frame Q7 */ - Word16 old_S[], /* i/o: prev. log-energy spectrum w. subtracted floor Q7 */ - Word16 cor_map_LT[], /* i/o: LT correlation map Q15 */ - Word16 *multi_harm_limit, /* i/o: multi harminic threshold Q9 */ - const Word32 total_brate, /* i : total bitrate Q0 */ - const Word16 bwidth, /* i : i signal bandwidth Q0 */ - Word16 *cor_strong_limit, /* i/o: HF correlation indicator Q0 */ - Word16 *st_mean_avr_dyn, /* i/o: long term average dynamic Q7 */ - Word16 *st_last_sw_dyn, /* i/o: last dynamic Q7 */ - Word16 *cor_map_sum, /* i : sum of correlation map Q8 */ - Word16 *sp_floor, /* o: noise floor estimate Q7 */ - Word16 S_map[] /* o : short-term correlation map Q7 */ -); - -Word16 multi_harm_ivas_fx( /* o : frame multi-harmonicity (1-harmonic, 0-not) */ - const Word16 Bin_E[], /* i : log-energy spectrum of the current frame Q7 */ - Word16 old_S[], /* i/o: prev. log-energy spectrum w. subtracted floor Q7 */ - Word16 cor_map_LT[], /* i/o: LT correlation map Q15 */ - Word16 *multi_harm_limit, /* i/o: multi harminic threshold Q9 */ - const Word32 total_brate, /* i : total bitrate Q0 */ - const Word16 bwidth, /* i : i signal bandwidth Q0 */ - Word16 *cor_strong_limit, /* i/o: HF correlation indicator Q0 */ - Word16 *st_mean_avr_dyn, /* i/o: long term average dynamic Q7 */ - Word16 *st_last_sw_dyn, /* i/o: last dynamic Q7 */ - Word16 *cor_map_sum, /* i : sum of correlation map Q8 */ - Word16 *sp_floor, /* o: noise floor estimate Q7 */ - Word16 S_map[] /* o : short-term correlation map Q7 */ +/* o : frame multi-harmonicity (1-harmonic, 0-not) */ +Word16 multi_harm_fx( + const Word16 Bin_E[], /* i : log-energy spectrum of the current frame Q7 */ + Word16 old_S[], /* i/o: prev. log-energy spectrum w. subtracted floor Q7 */ + Word16 cor_map_LT[], /* i/o: LT correlation map Q15 */ + Word16 *multi_harm_limit, /* i/o: multi harminic threshold Q9 */ + const Word32 total_brate, /* i : total bitrate Q0 */ + const Word16 bwidth, /* i : i signal bandwidth Q0 */ + Word16 *cor_strong_limit, /* i/o: HF correlation indicator Q0 */ + Word16 *st_mean_avr_dyn, /* i/o: long term average dynamic Q7 */ + Word16 *st_last_sw_dyn, /* i/o: last dynamic Q7 */ + Word16 *cor_map_sum, /* i : sum of correlation map Q8 */ + Word16 *sp_floor, /* o: noise floor estimate Q7 */ + Word16 S_map[] /* o : short-term correlation map Q7 */ +); + +/* o : frame multi-harmonicity (1-harmonic, 0-not) */ +Word16 multi_harm_ivas_fx( + const Word16 Bin_E[], /* i : log-energy spectrum of the current frame Q7 */ + Word16 old_S[], /* i/o: prev. log-energy spectrum w. subtracted floor Q7 */ + Word16 cor_map_LT[], /* i/o: LT correlation map Q15 */ + Word16 *multi_harm_limit, /* i/o: multi harminic threshold Q9 */ + const Word32 total_brate, /* i : total bitrate Q0 */ + const Word16 bwidth, /* i : i signal bandwidth Q0 */ + Word16 *cor_strong_limit, /* i/o: HF correlation indicator Q0 */ + Word16 *st_mean_avr_dyn, /* i/o: long term average dynamic Q7 */ + Word16 *st_last_sw_dyn, /* i/o: last dynamic Q7 */ + Word16 *cor_map_sum, /* i : sum of correlation map Q8 */ + Word16 *sp_floor, /* o: noise floor estimate Q7 */ + Word16 S_map[] /* o : short-term correlation map Q7 */ ); void pvq_encode_frame_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 *coefs_norm, /* i : normalized coefficients to encode */ - Word16 Q_coefs, /* i : Q-point of coefs_norm[] */ - Word16 *coefs_quant, /* o : quantized coefficients */ - Word16 *gopt, /* o : optimal shape gains */ - Word16 *npulses, /* o : number of pulses per band */ - Word16 *pulse_vector, /* o : non-normalized pulse shapes */ - const Word16 *sfm_start, /* i : indices of first coefficients in the bands */ - const Word16 *sfm_end, /* i : indices of last coefficients in the bands */ - const Word16 *sfmsize, /* i : band sizes */ - const Word16 nb_sfm, /* i : total number of bands */ - const Word16 *R, /* i : bitallocation per band Q3 */ - const Word16 pvq_bits, /* i : number of bits avaiable */ - const Word16 core /* i : core */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 *coefs_norm, /* i : normalized coefficients to encode */ + Word16 Q_coefs, /* i : Q-point of coefs_norm[] */ + Word16 *coefs_quant, /* o : quantized coefficients */ + Word16 *gopt, /* o : optimal shape gains */ + Word16 *npulses, /* o : number of pulses per band */ + Word16 *pulse_vector, /* o : non-normalized pulse shapes */ + const Word16 *sfm_start, /* i : indices of first coefficients in the bands */ + const Word16 *sfm_end, /* i : indices of last coefficients in the bands */ + const Word16 *sfmsize, /* i : band sizes */ + const Word16 nb_sfm, /* i : total number of bands */ + const Word16 *R, /* i : bitallocation per band Q3 */ + const Word16 pvq_bits, /* i : number of bits avaiable */ + const Word16 core /* i : core */ ); + void pvq_encode_frame_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 *coefs_norm, /* i : normalized coefficients to encode */ - Word16 Q_coefs, /* i : Q-point of coefs_norm[] */ - Word16 *coefs_quant, /* o : quantized coefficients */ - Word16 *gopt, /* o : optimal shape gains */ - Word16 *npulses, /* o : number of pulses per band */ - Word16 *pulse_vector, /* o : non-normalized pulse shapes */ - const Word16 *sfm_start, /* i : indices of first coefficients in the bands */ - const Word16 *sfm_end, /* i : indices of last coefficients in the bands */ - const Word16 *sfmsize, /* i : band sizes */ - const Word16 nb_sfm, /* i : total number of bands */ - const Word16 *R, /* i : bitallocation per band Q3 */ - const Word16 pvq_bits, /* i : number of bits avaiable */ - const Word16 core /* i : core */ -); -Word16 Interpol_4( /*Qx o : interpolated value */ - Word16 *x, /*Qx i : i vector */ - Word16 frac /* i : fraction (-4..+3) */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 *coefs_norm, /* i : normalized coefficients to encode */ + Word16 Q_coefs, /* i : Q-point of coefs_norm[] */ + Word16 *coefs_quant, /* o : quantized coefficients */ + Word16 *gopt, /* o : optimal shape gains */ + Word16 *npulses, /* o : number of pulses per band */ + Word16 *pulse_vector, /* o : non-normalized pulse shapes */ + const Word16 *sfm_start, /* i : indices of first coefficients in the bands */ + const Word16 *sfm_end, /* i : indices of last coefficients in the bands */ + const Word16 *sfmsize, /* i : band sizes */ + const Word16 nb_sfm, /* i : total number of bands */ + const Word16 *R, /* i : bitallocation per band Q3 */ + const Word16 pvq_bits, /* i : number of bits avaiable */ + const Word16 core /* i : core */ +); + +/*Qx o : interpolated value */ +Word16 Interpol_4( + Word16 *x, /*Qx i : i vector */ + Word16 frac /* i : fraction (-4..+3) */ ); void set_ppp_mode_fx( - Encoder_State *st_fx, /* i/o: state structure */ - const Word16 noisy_speech_HO, /* i : SC-VBR noisy speech HO flag */ - const Word16 clean_speech_HO, /* i : SC-VBR clean speech HO flag */ - const Word16 NB_speech_HO, /* i : SC-VBR NB speech HO flag */ - const Word16 localVAD_he /* i : HE-SAD flag without hangover */ + Encoder_State *st_fx, /* i/o: state structure */ + const Word16 noisy_speech_HO, /* i : SC-VBR noisy speech HO flag */ + const Word16 clean_speech_HO, /* i : SC-VBR clean speech HO flag */ + const Word16 NB_speech_HO, /* i : SC-VBR NB speech HO flag */ + const Word16 localVAD_he /* i : HE-SAD flag without hangover */ ); void decision_matrix_enc_fx( - Encoder_State *st_fx, /* i : encoder state structure */ + Encoder_State *st_fx, /* i : encoder state structure */ Word16 *hq_core_type /* o : HQ core_fx type Q0*/ ); void pvq_encode_fx( BSTR_ENC_HANDLE hBstr, - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - const Word16 *x, /* i: vector to quantize Q15-3=>Q12 */ - Word16 *y, /* o: raw pulses (non-scaled short) Q0 */ - Word16 *xq, /* o: quantized vector Q15 */ - Word32 *L_xq, /* o: quantized vector Q31 */ - const Word16 pulses, /* i: number of allocated pulses */ - const Word16 dim, /* i: Length of vector */ - const Word16 neg_gain /* i: - Gain use - negative gain in Q15 0 ..1 */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + const Word16 *x, /* i : vector to quantize Q15-3=>Q12 */ + Word16 *y, /* o : raw pulses (non-scaled short) Q0 */ + Word16 *xq, /* o : quantized vector Q15 */ + Word32 *L_xq, /* o : quantized vector Q31 */ + const Word16 pulses, /* i : number of allocated pulses */ + const Word16 dim, /* i : Length of vector */ + const Word16 neg_gain /* i : Gain use - negative gain in Q15 0 ..1 */ ); + void pvq_encode_ivas_fx( BSTR_ENC_HANDLE hBstr, - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - const Word16 *x, /* i: vector to quantize Q15-3=>Q12 */ - Word16 *y, /* o: raw pulses (non-scaled short) Q0 */ - Word16 *xq, /* o: quantized vector Q15 */ - Word32 *L_xq, /* o: quantized vector Q31 */ - const Word16 pulses, /* i: number of allocated pulses */ - const Word16 dim, /* i: Length of vector */ - const Word16 neg_gain /* i: - Gain use - negative gain in Q15 0 ..1 */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + const Word16 *x, /* i : vector to quantize Q15-3=>Q12 */ + Word16 *y, /* o : raw pulses (non-scaled short) Q0 */ + Word16 *xq, /* o : quantized vector Q15 */ + Word32 *L_xq, /* o : quantized vector Q31 */ + const Word16 pulses, /* i : number of allocated pulses */ + const Word16 dim, /* i : Length of vector */ + const Word16 neg_gain /* i : Gain use - negative gain in Q15 0 ..1 */ ); + void rc_enc_init_fx( - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - Word16 tot_bits /* i : Total bit budget Q0*/ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + Word16 tot_bits /* i : Total bit budget Q0*/ ); void rc_enc_finish_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: Encoder state */ + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder state */ PVQ_ENC_HANDLE hPVQ /* i/o: PVQ encoder handle */ ); + void rc_enc_finish_ivas_fx( BSTR_ENC_HANDLE hBstr, PVQ_ENC_HANDLE hPVQ /* i/o: PVQ encoder handle */ ); + void rc_encode_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - UWord32 cum_freq, /* i : Cumulative frequency up to symbol Q0*/ - UWord32 sym_freq, /* i : Symbol probability Q0*/ - UWord32 tot /* i : Total cumulative frequency Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + UWord32 cum_freq, /* i : Cumulative frequency up to symbol Q0*/ + UWord32 sym_freq, /* i : Symbol probability Q0*/ + UWord32 tot /* i : Total cumulative frequency Q0*/ ); + void rc_encode_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - UWord32 cum_freq, /* i : Cumulative frequency up to symbol Q0*/ - UWord32 sym_freq, /* i : Symbol probability Q0*/ - UWord32 tot /* i : Total cumulative frequency Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + UWord32 cum_freq, /* i : Cumulative frequency up to symbol Q0*/ + UWord32 sym_freq, /* i : Symbol probability Q0*/ + UWord32 tot /* i : Total cumulative frequency Q0*/ ); + void rc_enc_uniform_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - UWord32 value, /* i : Value to encode Q0*/ - UWord32 tot /* i : Maximum value Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + UWord32 value, /* i : Value to encode Q0*/ + UWord32 tot /* i : Maximum value Q0*/ ); + void rc_enc_uniform_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - UWord32 value, /* i : Value to encode Q0*/ - UWord32 tot /* i : Maximum value Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + UWord32 value, /* i : Value to encode Q0*/ + UWord32 tot /* i : Maximum value Q0*/ ); void rc_enc_bits_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - UWord32 value, /* i : Value to encode Q0*/ - Word16 bits /* i : Number of bits used Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + UWord32 value, /* i : Value to encode Q0*/ + Word16 bits /* i : Number of bits used Q0*/ ); + void rc_enc_bits_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - UWord32 value, /* i : Value to encode Q0*/ - Word16 bits /* i : Number of bits used Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + UWord32 value, /* i : Value to encode Q0*/ + Word16 bits /* i : Number of bits used Q0*/ ); + void re8_compute_base_index_fx( const Word16 *x, /* i : Elemen of Q2, Q3 or Q4 */ const Word16 ka, /* i : Identifier of the absolute leader related to x */ @@ -4680,45 +4664,47 @@ void tfaCalcEnv_fx( const Word16 *shb_speech, Word32 *enr ); -Word16 delta_pit_enc_fx( /* o : pitch index */ - const Word16 fr_steps, /* i : fractional resolution steps (2 or 4)*/ - const Word16 T0, /* i : integer pitch lag */ - const Word16 T0_frac, /* i : pitch fraction */ - const Word16 T0_min /* i : delta search min */ +/* o : pitch index */ +Word16 delta_pit_enc_fx( + const Word16 fr_steps, /* i : fractional resolution steps (2 or 4)*/ + const Word16 T0, /* i : integer pitch lag */ + const Word16 T0_frac, /* i : pitch fraction */ + const Word16 T0_min /* i : delta search min */ ); void set_impulse_fx( - const Word16 xn_fx[], /* i : target signal Q_new-1+shift*/ - const Word16 h_orig_fx[], /* i : impulse response of weighted synthesis filter Q(14+shift)*/ - Word16 exc_fx[], /* o : adaptive codebook excitation Q_new*/ - Word16 yy1_fx[], /* o : filtered adaptive codebook excitation Q_new*/ - Word16 *imp_shape, /* o : adaptive codebook index Q0*/ - Word16 *imp_pos, /* o : position of the glottal impulse center index Q0*/ - Word32 *gain_trans_fx, /* o : transition gain Q7*/ - Word16 Q_new /* i : Current scaling */ + const Word16 xn_fx[], /* i : target signal Q_new-1+shift*/ + const Word16 h_orig_fx[], /* i : impulse response of weighted synthesis filter Q(14+shift)*/ + Word16 exc_fx[], /* o : adaptive codebook excitation Q_new*/ + Word16 yy1_fx[], /* o : filtered adaptive codebook excitation Q_new*/ + Word16 *imp_shape, /* o : adaptive codebook index Q0*/ + Word16 *imp_pos, /* o : position of the glottal impulse center index Q0*/ + Word32 *gain_trans_fx, /* o : transition gain Q7*/ + Word16 Q_new /* i : Current scaling */ ); -Word16 abs_pit_enc_fx( /* o : pitch index */ - const Word16 fr_steps, /* i : fractional resolution steps (2 or 4) for shortest pitches*/ - const Word16 limit_flag, /* i : restrained(0) or extended(1) limits */ - const Word16 T0, /* i : integer pitch lag */ - const Word16 T0_frac /* i : pitch fraction */ +/* o : pitch index */ +Word16 abs_pit_enc_fx( + const Word16 fr_steps, /* i : fractional resolution steps (2 or 4) for shortest pitches*/ + const Word16 limit_flag, /* i : restrained(0) or extended(1) limits */ + const Word16 T0, /* i : integer pitch lag */ + const Word16 T0_frac /* i : pitch fraction */ ); ivas_error ppp_quarter_encoder_fx( - Word16 *returnFlag, /* o : return value */ - DTFS_STRUCTURE *CURRCW_Q_FX, /* o : Quantized (amp/phase) DTFS */ - DTFS_STRUCTURE *TARGETCW_FX, /* o : DTFS with quant phase but unquant Amp */ - Word16 prevCW_lag, /* i : previous lag */ - DTFS_STRUCTURE vCURRCW_NQ_FX, /* i : Unquantized DTFS */ - const Word16 *curr_lpc_fx, /* i : LPCS */ - Word16 *lastLgainE_fx, /* i/o: last low band gain */ - Word16 *lastHgainE_fx, /* i/o: last high band gain */ - Word16 *lasterbE_fx, /* i/o: last ERB vector */ - DTFS_STRUCTURE PREV_CW_E_FX, /* i : past DTFS */ - Word16 *S_fx, /* i : sin table, Q15 */ - Word16 *C_fx, /* i : cos table, Q15 */ - BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ + Word16 *returnFlag, /* o : return value */ + DTFS_STRUCTURE *CURRCW_Q_FX, /* o : Quantized (amp/phase) DTFS */ + DTFS_STRUCTURE *TARGETCW_FX, /* o : DTFS with quant phase but unquant Amp */ + Word16 prevCW_lag, /* i : previous lag */ + DTFS_STRUCTURE vCURRCW_NQ_FX, /* i : Unquantized DTFS */ + const Word16 *curr_lpc_fx, /* i : LPCS */ + Word16 *lastLgainE_fx, /* i/o: last low band gain */ + Word16 *lastHgainE_fx, /* i/o: last high band gain */ + Word16 *lasterbE_fx, /* i/o: last ERB vector */ + DTFS_STRUCTURE PREV_CW_E_FX, /* i : past DTFS */ + Word16 *S_fx, /* i : sin table, Q15 */ + Word16 *C_fx, /* i : cos table, Q15 */ + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ ); void index_lvq_fx( @@ -4739,24 +4725,17 @@ void index_lvq_ivas_fx( Word16 *index, /* o : encoded index (represented on 3 short each with 15 bits ) */ const Word16 prediction_flag ); -ivas_error init_encoder_fx( - Encoder_State *st_fx /* i/o: Encoder static variables structure */ -); - void copy_encoder_config_fx( - Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ - Encoder_State *st, /* o : encoder state structure */ - const Word16 flag_all /* i : flag 1==update all, 0=partial update Q0*/ -); - -void destroy_encoder_fx( - Encoder_State *st_fx /* i/o: Encoder static variables structure */ + Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ + Encoder_State *st, /* o : encoder state structure */ + const Word16 flag_all /* i : flag 1==update all, 0=partial update Q0*/ ); void amr_wb_enc_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 input_sp[], /* i : i signal Q0*/ - const Word16 n_samples /* i : number of i samples Q0*/ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 input_sp[], /* i : i signal Q0*/ + Word32 *mem_hp20_in_fx, /* i/o: hp20 filter memory Qx*/ + const Word16 n_samples /* i : number of i samples Q0*/ ); void writeLPCparam_fx( @@ -4778,9 +4757,10 @@ Word16 cng_energy_ivas_fx( const Word16 Q_new /* i : Input scaling */ ); -void generate_comfort_noise_enc_ivas_fx( Encoder_State *stcod, - Word16 Q_new, - Word16 gen_exc ); +void generate_comfort_noise_enc_ivas_fx( + Encoder_State *stcod, + Word16 Q_new, + Word16 gen_exc ); void SynthesisSTFT_enc_ivas_fx( Word32 *fftBuffer, /* i : pointer to FFT bins */ diff --git a/lib_enc/pvq_core_enc_fx.c b/lib_enc/pvq_core_enc_fx.c index 214522126120348426c0f9a7d5bc2569f584a903..47da82beca7737f0cbbbe73051dd5085ebae862e 100644 --- a/lib_enc/pvq_core_enc_fx.c +++ b/lib_enc/pvq_core_enc_fx.c @@ -1,19 +1,20 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ #include "cnst.h" -#include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "ivas_prot_fx.h" + /*-------------------------------------------------------------------* * Local function prototypes *--------------------------------------------------------------------*/ + static Word16 calc_pvq_splits_fx( BSTR_ENC_HANDLE hBstr, PVQ_ENC_HANDLE hPVQ, const Word16 band_bits, const Word16 sfmsize, const Word16 *y, const Word16 Q_y, Word16 *bits ); static Word16 calc_pvq_splits_ivas_fx( /* o : Number of segments */ BSTR_ENC_HANDLE hBstr, /* i/o: Encoder state */ @@ -44,7 +45,6 @@ static void pvq_encode_band_ivas_fx( const Word16 strict_bits /* i : conservative rounding flag */ ) { - Word16 K_val; Word16 j, Np; Word32 enr, E_part[MAX_SPLITS + 1]; @@ -267,10 +267,6 @@ void pvq_encode_frame_ivas_fx( Word32 xy_corr, yy_corr; PVQ_ENC_DATA pvq_enc; PVQ_ENC_HANDLE hPVQ = &pvq_enc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif rc_enc_init_fx( hPVQ, pvq_bits ); @@ -331,7 +327,7 @@ void pvq_encode_frame_ivas_fx( } tmp = ratio( xy_corr, yy_corr, &exp ); - gopt[is] = shl_o( tmp, sub( sub( sub( 14, Q_coefs ), shift ), exp ), &Overflow ); + gopt[is] = shl_sat( tmp, sub( sub( sub( 14, Q_coefs ), shift ), exp ) ); move16(); if ( gopt[is] == 0 ) @@ -391,10 +387,6 @@ void pvq_encode_frame_fx( Word32 xy_corr, yy_corr; PVQ_ENC_DATA pvq_enc; PVQ_ENC_HANDLE hPVQ = &pvq_enc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif rc_enc_init_fx( hPVQ, pvq_bits ); @@ -455,7 +447,7 @@ void pvq_encode_frame_fx( } tmp = ratio( xy_corr, yy_corr, &exp ); - gopt[is] = shl_o( tmp, sub( sub( sub( 14, Q_coefs ), shift ), exp ), &Overflow ); + gopt[is] = shl_sat( tmp, sub( sub( sub( 14, Q_coefs ), shift ), exp ) ); move16(); if ( gopt[is] == 0 ) { @@ -553,10 +545,10 @@ Word16 pvq_core_enc_ivas_fx( ivas_fine_gain_pred_fx( sfm_start, sfm_end, sfmsize, ord, npulses, maxpulse, R, nb_sfm, coefs_quant, pulse_vector, fg_pred, core ); - fine_gain_quant_ivas_fx( hBstr, ord, nb_sfm, gain_bits_array, fg_pred, gopt ); + fine_gain_quant_fx( hBstr, ord, nb_sfm, gain_bits_array, fg_pred, gopt ); apply_gain_fx( ord, sfm_start, sfm_end, nb_sfm, fg_pred, coefs_quant ); - *Q_coefs = 11; + *Q_coefs = 12; move16(); return add( pvq_bits, gain_bits_tot ); } @@ -931,17 +923,13 @@ static void densityIndexSymbolEncode_ivas_fx( Word32 sym_freq, cum_freq, tot; Word32 acc; UWord16 lsb; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif sym_freq = L_deposit_l( 1 ); IF( s_and( (Word16) 0xFFFE, density ) != 0 ) /* even */ { angle = atan2_fx( SQRT_DIM_fx[r_dim], SQRT_DIM_fx[l_dim] ); - angle = shl_o( angle, 1, &Overflow ); + angle = shl_sat( angle, 1 ); angle = mult_r( angle, 20861 ); c = mult_r( density, angle ); @@ -1008,17 +996,13 @@ static void densityIndexSymbolEncode_fx( Word32 sym_freq, cum_freq, tot; Word32 acc; UWord16 lsb; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif sym_freq = L_deposit_l( 1 ); IF( s_and( (Word16) 0xFFFE, density ) != 0 ) /* even */ { angle = atan2_fx( SQRT_DIM_fx[r_dim], SQRT_DIM_fx[l_dim] ); - angle = shl_o( angle, 1, &Overflow ); + angle = shl_sat( angle, 1 ); angle = mult_r( angle, 20861 ); c = mult_r( density, angle ); diff --git a/lib_enc/pvq_encode_fx.c b/lib_enc/pvq_encode_fx.c index 749a39ed91243268b64f71275ce5106e00cf9749..840455f72b43aecaffd5ed16ba30ce915f9812cc 100644 --- a/lib_enc/pvq_encode_fx.c +++ b/lib_enc/pvq_encode_fx.c @@ -1,23 +1,24 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ #include "cnst.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ -#include "rom_com_fx.h" #include "rom_com.h" + /* PVQ MIXED_SEARCH_LOOP: low precision 16/32 + energy selective high precision 32/64, mixed perf , 10 dB SEGSNR better than the low precision loop only, active if k>=128 and accumulated energy is high enough, comes at a controlled complexity cost, as dimensions decrease for high k's*/ -static Word16 max_val_fx( /* o : maximum value in the input vector */ - const Word16 *vec, /* i : input vector */ - const Word16 lvec /* i : length of input vector */ +/* o : maximum value in the input vector */ +static Word16 max_val_fx( + const Word16 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ ) { Word16 j, tmp; @@ -31,7 +32,9 @@ static Word16 max_val_fx( /* o : maximum value in the input return tmp; } -static Word16 pyramidSearchProjInit_fx( Word16 L, Word16 Ptot ) +static Word16 pyramidSearchProjInit_fx( + const Word16 L, + const Word16 Ptot ) { return ( sub( Ptot, extract_l( L_shr( L_mult0( 8223, (Word32) L ), 14 ) ) ) > 0 ); } @@ -60,15 +63,11 @@ static Word16 one_pulse_search( UWord32 UL_left_l, UL_right_l, UL_dummy; Word32 L_tmp; UWord16 u_sgn; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif en_tmp = en_dn_shift; /* dummy assignment to avoid compiler warning for unused parameter */ /* maximize correlation precision, prior to every unit pulse addition in the vector */ - corr_up_shift = norm_l( L_mac( *L_xy_ptr, 1, max_xabs ) ); /* pre analyze worst case L_xy update in the dim loop , 2 ops */ + corr_up_shift = norm_l( L_mac( *L_xy_ptr, 1, max_xabs ) ); /* pre analyze worst case L_xy update in the dim loop, 2 ops */ imax = -1; /* not needed for search, only added to avoid compiler warning */ /* clean BE code, with split out low/high precision loops */ @@ -85,9 +84,9 @@ static Word16 one_pulse_search( FOR( i = 0; i < dim; i++ ) /* FOR 3 ops */ { - L_tmp_corr = L_shl_o( L_mac_o( *L_xy_ptr, 1, x_abs[i], &Overflow ), corr_up_shift, &Overflow ); /* actual in-loop target value, 2 ops */ - corr_tmp = round_fx_o( L_tmp_corr, &Overflow ); /* 1 op */ - corr_sq_tmp = mult( corr_tmp, corr_tmp ); /* CorrSq, is a 16bit for low compelxity cross multiplication 1 op */ + L_tmp_corr = L_shl_sat( L_mac_sat( *L_xy_ptr, 1, x_abs[i] ), corr_up_shift ); /* actual in-loop target value, 2 ops */ + corr_tmp = round_fx_sat( L_tmp_corr ); /* 1 op */ + corr_sq_tmp = mult( corr_tmp, corr_tmp ); /* CorrSq, is a 16bit for low compelxity cross multiplication 1 op */ L_tmp_en_lc = L_mac( *L_yy_ptr, 1, y[i] ); /*Q1 result , energy may span up to ~14+1(Q1)+1(sign)=16 bits, 1 op */ /* extract_l without shift can always be used for this section as energy is guaranteed to stay in the lower word, 1 op */ @@ -202,10 +201,6 @@ void pvq_encode_ivas_fx( Word16 neg_gain_norm, shift_tot; Word16 high_pulse_density_flag; PvqEntry entry; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif L_proj_fac = 4096; move32(); @@ -359,8 +354,8 @@ void pvq_encode_ivas_fx( } Mpy_32_16_ss( L_isqrt, tmp, &L_tmp, &u16_tmp ); /* Q31*Q(0+x) +1 */ Mpy_32_16_ss( L_tmp, neg_gain_norm, &L_tmp, &u16_tmp ); /* Q31*Q(0+x) *Q15 +1 */ - L_tmp = L_shr_o( L_tmp, shift_tot, &Overflow ); /* Q31+x */ - xq[i] = round_fx_o( L_tmp, &Overflow ); /* Q15, array move */ + L_tmp = L_shr_sat( L_tmp, shift_tot ); /* Q31+x */ + xq[i] = round_fx_sat( L_tmp ); /* Q15, array move */ move16(); L_xq[i] = L_tmp; /* Q31 currently unused */ move32(); @@ -410,10 +405,6 @@ void pvq_encode_fx( Word16 neg_gain_norm, shift_tot; Word16 high_pulse_density_flag; PvqEntry entry; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif L_proj_fac = 4096; move32(); @@ -567,8 +558,8 @@ void pvq_encode_fx( } Mpy_32_16_ss( L_isqrt, tmp, &L_tmp, &u16_tmp ); /* Q31*Q(0+x) +1 */ Mpy_32_16_ss( L_tmp, neg_gain_norm, &L_tmp, &u16_tmp ); /* Q31*Q(0+x) *Q15 +1 */ - L_tmp = L_shr_o( L_tmp, shift_tot, &Overflow ); /* Q31+x */ - xq[i] = round_fx_o( L_tmp, &Overflow ); /* Q15, array move */ + L_tmp = L_shr_sat( L_tmp, shift_tot ); /* Q31+x */ + xq[i] = round_fx_sat( L_tmp ); /* Q15, array move */ move16(); L_xq[i] = L_tmp; /* Q31 currently unused */ move32(); diff --git a/lib_enc/q_gain2p_fx.c b/lib_enc/q_gain2p_fx.c index 4618483d26b649a5e066f1dc307655f4bec5c505..b0f681120e6be2b31b7fbd9b1b02d6497a9e64b4 100644 --- a/lib_enc/q_gain2p_fx.c +++ b/lib_enc/q_gain2p_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -7,12 +7,12 @@ #include "options.h" #include "cnst.h" /* Common constants */ #include "basop_util.h" -#include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ + static Word16 gain_enc( /* o : quantization pitch index */ const Word16 *code, /* i : algebraic excitation */ Word16 lcode, /* i : Subframe size in range: 40,64,80 */ @@ -145,11 +145,6 @@ static Word16 gain_enc( /* o : quantization pitch index const Word16 *p; const Word16 *t_qua_gain; Word32 L_tmp, dist_min, L_tmp1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif - assert( ( func_type != FUNC_GAIN_ENC_UV ) && ( func_type != FUNC_GAIN_ENC_GACELP_UV ) ); @@ -165,11 +160,13 @@ static Word16 gain_enc( /* o : quantization pitch index /* gain_inov = 1.0f / sqrt((dot_product(code, code, L_SUBFR) + 0.01) / L_SUBFR) */ L_tmp = calc_gain_inov( code, lcode, &L_tmp1, &exp_L_tmp1 ); move16(); - *gain_inov = round_fx_o( L_shl_o( L_tmp, 15 - 3, &Overflow ), &Overflow ); /* gain_inov in Q12 */ + *gain_inov = round_fx_sat( L_shl_sat( L_tmp, 15 - 3 ) ); /* gain_inov in Q12 */ move16(); + /*----------------------------------------------------------------* * calculate the predicted gain code *----------------------------------------------------------------*/ + IF( func_type == FUNC_GAIN_ENC_MLESS ) { /*j = 10 * log10((dot_product(code, code, lcode) + 0.01) / lcode) */ @@ -377,7 +374,7 @@ static Word16 gain_enc( /* o : quantization pitch index /* Here, we use L_mult0 to compensate the factor 0.5 applied to coeff[1..4] before */ L_tmp = L_add( L_tmp, L_shr( L_mult0( p[2 * i + 0], p[2 * i + 0] ), shr_coeff0 ) ); L_tmp = L_sub( L_tmp, L_shr( L_mult( p[2 * i + 0], coeff1 ), shr_coeff1 ) ); - L_tmp1 = L_sub_o( L_tmp, dist_min, &Overflow ); + L_tmp1 = L_sub_sat( L_tmp, dist_min ); BASOP_SATURATE_WARNING_ON_EVS if ( L_tmp1 < 0 ) { @@ -397,18 +394,19 @@ static Word16 gain_enc( /* o : quantization pitch index L_tmp = L_mult( g_code, gcode0 ); /* Q11*Q15 -> Q27 */ exp_gcode0 = add( exp_gcode0, -11 ); - L_tmp = L_shl_o( L_tmp, exp_gcode0, &Overflow ); /* Q27 -> Q16 */ + L_tmp = L_shl_sat( L_tmp, exp_gcode0 ); /* Q27 -> Q16 */ *gain_code = L_tmp; move32(); /* Q16/Q12 => Q5 */ L_tmp = L_deposit_h( BASOP_Util_Divide3216_Scale( L_tmp, *gain_inov, &i ) ); - *past_gcode = L_shl_o( L_tmp, sub( i, 15 - 12 ), &Overflow ); + *past_gcode = L_shl_sat( L_tmp, sub( i, 15 - 12 ) ); move16(); return index; } + Word16 gain_enc_uv_fx( /* o : quantization pitch index */ const Word16 *code, /* i : algebraic excitation */ const Word16 *code2, /* i : gaussian excitation */ @@ -436,10 +434,6 @@ Word16 gain_enc_uv_fx( /* o : quantization pitch ind Word16 index2; const Word16 log2_scale = 16; move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif pred_nrg_frame = 0; /* to suppress compilation warnings */ g_code2 = 0; /* to suppress compilation warnings */ exp_gcode2 = 0; /* to suppress compilation warnings */ @@ -447,7 +441,6 @@ Word16 gain_enc_uv_fx( /* o : quantization pitch ind move16(); move16(); - assert( ( func_type != FUNC_GAIN_ENC_MLESS ) ); /* Debug check value (not instrumented) */ @@ -595,7 +588,7 @@ Word16 gain_enc_uv_fx( /* o : quantization pitch ind } s1 = norm_l( *gain_code ); - tmp1 = round_fx_o( L_shl_o( *gain_code, s1, &Overflow ), &Overflow ); + tmp1 = round_fx_sat( L_shl( *gain_code, s1 ) ); s1 = sub( 15, s1 ); tmp1 = mult_r( mult_r( tmp1, tmp1 ), g_coeff->y2y2 ); @@ -608,7 +601,7 @@ Word16 gain_enc_uv_fx( /* o : quantization pitch ind L_tmp1 = L_add( L_tmp, 0 ); s1 = norm_l( *gain_code ); - tmp1 = round_fx_o( L_shl_o( *gain_code, s1, &Overflow ), &Overflow ); + tmp1 = round_fx_sat( L_shl( *gain_code, s1 ) ); s1 = sub( 15, s1 ); c_index2 = 0x7FFF; diff --git a/lib_enc/qlpc_avq_fx.c b/lib_enc/qlpc_avq_fx.c index 13e0a3cf7e196cb86b31882c04a719a52bd8d1f0..67b481ea03c203f6a55ab87978a5ed64efc7ae08 100644 --- a/lib_enc/qlpc_avq_fx.c +++ b/lib_enc/qlpc_avq_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -27,7 +27,7 @@ void qlpc_avq_fx( Word16 *nb_indices, /* o : Number of quantization indices Q0 */ Word16 *nbbits, /* o : Number of quantization bits Q0 */ const Word16 core, /* i : TCX10 or TCX20 Q0 */ - const Word32 sr_core /* i : internal sampling rate Q0 */ + const Word32 sr_core /* i : internal sampling rate Q0 */ ) { Word16 i; @@ -143,12 +143,12 @@ static Word16 unary_code( FOR( ; ind > 0; ind-- ) { - push_next_indice_fx( hBstr, 1, 1 ); + push_next_indice( hBstr, 1, 1 ); nb_bits = add( nb_bits, 1 ); // Q0 } /* Stop bit */ - push_next_indice_fx( hBstr, 0, 1 ); + push_next_indice( hBstr, 0, 1 ); return ( nb_bits ); } @@ -195,7 +195,7 @@ static Word16 unpack4bits( IF( nbits == 0 ) { - push_next_indice_fx( hBstr, 0, 0 ); + push_next_indice( hBstr, 0, 0 ); i = 1; move16(); } @@ -206,10 +206,10 @@ static Word16 unpack4bits( FOR( ; nbits > 4; nbits -= 4 ) { - push_next_indice_fx( hBstr, prm[i], 4 ); + push_next_indice( hBstr, prm[i], 4 ); i = add( i, 1 ); } - push_next_indice_fx( hBstr, prm[i], nbits ); + push_next_indice( hBstr, prm[i], nbits ); i = add( i, 1 ); } @@ -330,7 +330,7 @@ Word16 encode_lpc_avq_fx( { nb = 1; move16(); - push_next_indice_fx( hBstr, q_type, nb ); + push_next_indice( hBstr, q_type, nb ); } nb_bits = add( nb_bits, nb ); // Q0 @@ -342,7 +342,7 @@ Word16 encode_lpc_avq_fx( IF( ( ( q_type == 0 ) && NE_16( element_mode, IVAS_CPE_MDCT ) ) || ( ( q_type == 0 ) && ( GE_16( st1, 0 ) ) && EQ_16( element_mode, IVAS_CPE_MDCT ) ) ) { /* Absolute quantizer with 1st stage stochastic codebook */ - push_next_indice_fx( hBstr, st1, bits_for_abs_quant ); + push_next_indice( hBstr, st1, bits_for_abs_quant ); nb_bits = add( nb_bits, bits_for_abs_quant ); // Q0 } @@ -350,7 +350,7 @@ Word16 encode_lpc_avq_fx( test(); IF( EQ_16( element_mode, IVAS_CPE_MDCT ) && EQ_16( stereo_mode, 3 ) && st1 < 0 ) { - push_next_indice_fx( hBstr, add( st1, 2 ), 1 ); + push_next_indice( hBstr, add( st1, 2 ), 1 ); nb_bits = add( nb_bits, 1 ); // Q0 } @@ -368,7 +368,7 @@ Word16 encode_lpc_avq_fx( move16(); i = 3; } - push_next_indice_fx( hBstr, i, 2 ); + push_next_indice( hBstr, i, 2 ); i = sub( qn2, 2 ); @@ -377,7 +377,7 @@ Word16 encode_lpc_avq_fx( move16(); i = 3; } - push_next_indice_fx( hBstr, i, 2 ); + push_next_indice( hBstr, i, 2 ); /* Unary code for abs and rel LPC0/LPC2 */ /* Q5 = 0, Q6=10, Q0=110, Q7=1110, ... */ diff --git a/lib_enc/qlpc_stoch_fx.c b/lib_enc/qlpc_stoch_fx.c index d6f0b504f8f2c5ebc0aea689ff87b5eaac0a7ad0..0964d7421b26fa9036127c67b2dc4e23b6cf6094 100644 --- a/lib_enc/qlpc_stoch_fx.c +++ b/lib_enc/qlpc_stoch_fx.c @@ -1,16 +1,13 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ - #include #include #include "options.h" #include "cnst.h" #include "rom_enc.h" -#include "rom_com_fx.h" #include "rom_com.h" -//#include "prot_fx.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" @@ -59,11 +56,8 @@ void lpc_quantization_fx( IF( st->lpcQuantization == 0 ) { - if ( st->sr_core != 12800 ) - { - // PMT("from the comment in E_LPC_isp_isf_conversion, it seems built for 12.8kHz, current sampling rate is NOT 12800, is it ok?") - /*_DIFF_FLOAT_FIX_ E_LPC_lsp_lsf_conversion, does it work for 16kHz as well ?*/ - } + /* from the comment in E_LPC_isp_isf_conversion, it seems built for 12.8kHz only, if current sampling rate is NOT 12800, is it ok? , float takes into account Fs */ + /* _DIFF_FLOAT_FIX_EVS_IVAS */ E_LPC_lsp_lsf_conversion( lsp, lsf, M ); /* check resonance for pitch clipping algorithm */ @@ -376,14 +370,14 @@ void lpc_quantization_ivas_fx( *-------------------------------------------------------------------*/ void Unified_weighting_fx( - const Word32 Bin_Ener_128_fx[], /* i : FFT Bin energy 128 bins in two sets Q_ener */ + const Word32 Bin_Ener_128_fx[], /* i : FFT Bin energy 128 bins in two sets Q_ener */ Word16 Q_ener, - const Word16 lsf_fx[], /* i : LSF vector x2.56 */ - Word16 w_fx[], /* o : LP weighting filter (numerator) Q8 */ - const Word16 narrowBand, /* i : flag for Narrowband Q0*/ - const Word16 unvoiced, /* i : flag for Unvoiced frame Q0*/ - const Word32 sr_core, /* i : sampling rate of core-coder Q0*/ - const Word16 order /* i : LP order Q0*/ + const Word16 lsf_fx[], /* i : LSF vector x2.56 */ + Word16 w_fx[], /* o : LP weighting filter (numerator) Q8 */ + const Word16 narrowBand, /* i : flag for Narrowband Q0*/ + const Word16 unvoiced, /* i : flag for Unvoiced frame Q0*/ + const Word32 sr_core, /* i : sampling rate of core-coder Q0*/ + const Word16 order /* i : LP order Q0*/ ) { Word16 i; @@ -399,10 +393,6 @@ void Unified_weighting_fx( Word16 nf_fx; Word32 Bin_Ener_160_fx[160]; const Word32 *Freq_w_Table_fx, *Bin_Ener_fx; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*Config. weighting*/ IF( narrowBand ) @@ -441,7 +431,7 @@ void Unified_weighting_fx( L_tmp = L_deposit_l( 0 ); FOR( i = 95; i < 127; i++ ) { - L_tmp = L_add_o( L_tmp, Bin_Ener_160_fx[i], &Overflow ); /* Q_ener */ + L_tmp = L_add_sat( L_tmp, Bin_Ener_160_fx[i] ); /* Q_ener */ } L_tmp = L_shr( L_tmp, 5 ); @@ -522,7 +512,7 @@ void Unified_weighting_fx( } ELSE { - L_tmp = L_shl_o( L_deposit_l( sub_o( w_fft_fx[i], min_fx, &Overflow ) ), 13, &Overflow ); /* Q21 */ + L_tmp = L_shl_sat( L_deposit_l( sub_sat( w_fft_fx[i], min_fx ) ), 13 ); /* Q21 */ exp = norm_l( L_tmp ); frac = round_fx( L_shl( L_tmp, exp ) ); exp = sub( add( exp, 21 ), 30 ); diff --git a/lib_enc/range_enc_fx.c b/lib_enc/range_enc_fx.c index 689b313d8f2da140d0419f59704d676dfa48621b..0c465575b09842b81cfaf5c986d242b4738aec2c 100644 --- a/lib_enc/range_enc_fx.c +++ b/lib_enc/range_enc_fx.c @@ -1,14 +1,12 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ -#include "rom_com.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -17,6 +15,7 @@ static void rc_enc_shift_fx( BSTR_ENC_HANDLE hBstr, PVQ_ENC_HANDLE hPVQ ); static void rc_enc_write_fx( BSTR_ENC_HANDLE hBstr, Word16 byte, Word16 bits ); static void rc_enc_shift_ivas_fx( BSTR_ENC_HANDLE hBstr, PVQ_ENC_HANDLE hPVQ ); static void rc_enc_write_ivas_fx( BSTR_ENC_HANDLE hBstr, Word16 byte, Word16 bits ); + /*-------------------------------------------------------------------* * rc_enc_init() * @@ -25,7 +24,7 @@ static void rc_enc_write_ivas_fx( BSTR_ENC_HANDLE hBstr, Word16 byte, Word16 bit void rc_enc_init_fx( PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - Word16 tot_bits /* i : Total bit budget Q0*/ + Word16 tot_bits /* i : Total bit budget Q0*/ ) { hPVQ->rc_low = L_deposit_l( 0 ); @@ -53,11 +52,11 @@ void rc_enc_init_fx( * Encode symbol with range coder *-------------------------------------------------------------------*/ void rc_encode_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - UWord32 cum_freq, /* i : Cumulative frequency up to symbol Q0*/ - UWord32 sym_freq, /* i : Symbol probability Q0*/ - UWord32 tot /* i : Total cumulative frequency Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + UWord32 cum_freq, /* i : Cumulative frequency up to symbol Q0*/ + UWord32 sym_freq, /* i : Symbol probability Q0*/ + UWord32 tot /* i : Total cumulative frequency Q0*/ ) { UWord32 r, tmp, inv_tot, lsb; @@ -91,11 +90,11 @@ void rc_encode_ivas_fx( return; } void rc_encode_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - UWord32 cum_freq, /* i : Cumulative frequency up to symbol Q0*/ - UWord32 sym_freq, /* i : Symbol probability Q0*/ - UWord32 tot /* i : Total cumulative frequency Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + UWord32 cum_freq, /* i : Cumulative frequency up to symbol Q0*/ + UWord32 sym_freq, /* i : Symbol probability Q0*/ + UWord32 tot /* i : Total cumulative frequency Q0*/ ) { UWord32 r, tmp, inv_tot, lsb; @@ -378,10 +377,10 @@ static void rc_enc_shift_fx( * *-------------------------------------------------------------------*/ void rc_enc_bits_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - UWord32 value, /* i : Value to encode Q0*/ - Word16 bits /* i : Number of bits used Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + UWord32 value, /* i : Value to encode Q0*/ + Word16 bits /* i : Number of bits used Q0*/ ) { IF( LE_16( add( rc_get_bits2_fx( hPVQ->rc_num_bits, hPVQ->rc_range ), bits ), hPVQ->rc_tot_bits ) ) @@ -411,10 +410,10 @@ void rc_enc_bits_ivas_fx( return; } void rc_enc_bits_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - UWord32 value, /* i : Value to encode Q0*/ - Word16 bits /* i : Number of bits used Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + UWord32 value, /* i : Value to encode Q0*/ + Word16 bits /* i : Number of bits used Q0*/ ) { IF( LE_16( add( rc_get_bits2_fx( hPVQ->rc_num_bits, hPVQ->rc_range ), bits ), hPVQ->rc_tot_bits ) ) @@ -423,14 +422,14 @@ void rc_enc_bits_fx( IF( GT_16( bits, 16 ) ) { - push_indice_fx( hBstr, sub( IND_RC_END, hPVQ->rc_offset ), u_extract_l( UL_lshr( value, 16 ) ), sub( bits, 16 ) ); + push_indice( hBstr, sub( IND_RC_END, hPVQ->rc_offset ), u_extract_l( UL_lshr( value, 16 ) ), sub( bits, 16 ) ); hPVQ->rc_offset = add( hPVQ->rc_offset, 1 ); // Q0 - push_indice_fx( hBstr, sub( IND_RC_END, hPVQ->rc_offset ), u_extract_l( UL_and( value, 0x0000ffff ) ), 16 ); + push_indice( hBstr, sub( IND_RC_END, hPVQ->rc_offset ), u_extract_l( UL_and( value, 0x0000ffff ) ), 16 ); hPVQ->rc_offset = add( hPVQ->rc_offset, 1 ); // Q0 } ELSE { - push_indice_fx( hBstr, sub( IND_RC_END, hPVQ->rc_offset ), u_extract_l( value ), bits ); + push_indice( hBstr, sub( IND_RC_END, hPVQ->rc_offset ), u_extract_l( value ), bits ); hPVQ->rc_offset = add( hPVQ->rc_offset, 1 ); // Q0 } } @@ -447,10 +446,10 @@ void rc_enc_bits_fx( * Encode with uniform distribution *-------------------------------------------------------------------*/ void rc_enc_uniform_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - UWord32 value, /* i : Value to encode Q0*/ - UWord32 tot /* i : Maximum value Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + UWord32 value, /* i : Value to encode Q0*/ + UWord32 tot /* i : Maximum value Q0*/ ) { Word16 n; @@ -471,10 +470,10 @@ void rc_enc_uniform_ivas_fx( return; } void rc_enc_uniform_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ - UWord32 value, /* i : Value to encode Q0*/ - UWord32 tot /* i : Maximum value Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + PVQ_ENC_HANDLE hPVQ, /* i/o: PVQ encoder handle */ + UWord32 value, /* i : Value to encode Q0*/ + UWord32 tot /* i : Maximum value Q0*/ ) { Word16 n; @@ -501,9 +500,9 @@ void rc_enc_uniform_fx( * Write a byte to bitstream *-------------------------------------------------------------------*/ static void rc_enc_write_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 byte, /* i : Byte to write Q0*/ - Word16 bits /* i : Number of bits Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 byte, /* i : Byte to write Q0*/ + Word16 bits /* i : Number of bits Q0*/ ) { push_indice( hBstr, IND_RC_START, byte, bits ); @@ -511,12 +510,12 @@ static void rc_enc_write_ivas_fx( return; } static void rc_enc_write_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 byte, /* i : Byte to write Q0*/ - Word16 bits /* i : Number of bits Q0*/ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 byte, /* i : Byte to write Q0*/ + Word16 bits /* i : Number of bits Q0*/ ) { - push_indice_fx( hBstr, IND_RC_START, byte, bits ); + push_indice( hBstr, IND_RC_START, byte, bits ); return; } diff --git a/lib_enc/re8_cod_fx.c b/lib_enc/re8_cod_fx.c index d43dbbf57aa184d18022f519071e0e3df1c0a9b8..ea1990b63bfeaf9e54b4d2ededa320ddd4cc6ef2 100644 --- a/lib_enc/re8_cod_fx.c +++ b/lib_enc/re8_cod_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ diff --git a/lib_enc/reordernorm_fx.c b/lib_enc/reordernorm_fx.c index 176b54f8e586150bc57f8f4e6f404d3c9724d994..149c499d18fb85dcec99848355a6c971d226a9af 100644 --- a/lib_enc/reordernorm_fx.c +++ b/lib_enc/reordernorm_fx.c @@ -1,15 +1,15 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" #include "rom_com.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*--------------------------------------------------------------------------*/ /* Function reordernorm_fx */ /* ~~~~~~~~~~~~~~~~~~~~~ */ diff --git a/lib_enc/rom_enc.h b/lib_enc/rom_enc.h index 35fd3027d58538bd9b81b5120e1530337cbd9060..f92243a5ab15987662be04399979d1d03fb820c9 100644 --- a/lib_enc/rom_enc.h +++ b/lib_enc/rom_enc.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef ROM_ENC_H @@ -45,15 +45,14 @@ /*----------------------------------------------------------------------------------* * General tables *----------------------------------------------------------------------------------*/ -extern const Word16 sqrt_han_window_fx[]; /* Half of the square root hanning window Q15*/ -extern const Word16 tipos[]; /* Starting points for pulse position search in Algebraic innovation codebook Q0*/ -extern const Word16 W_HIST_FX[DTX_HIST_SIZE]; /* CNG & DTX - table for calculation of average excitation energy Q16*/ -extern const Word16 W_HIST_S_FX[DTX_HIST_SIZE]; /* CNG & DTX - table for calculation of average excitation energy Q12*/ +extern const Word16 sqrt_han_window_fx[]; /* Half of the square root hanning window Q15*/ +extern const Word16 tipos[]; /* Starting points for pulse position search in Algebraic innovation codebook Q0*/ +extern const Word16 W_HIST_FX[DTX_HIST_SIZE]; /* CNG & DTX - table for calculation of average excitation energy Q16*/ +extern const Word16 W_HIST_S_FX[DTX_HIST_SIZE]; /* CNG & DTX - table for calculation of average excitation energy Q12*/ extern const Word16 bwd_start_bin[]; // Q0 extern const Word16 bwd_end_bin[]; // Q0 -extern const float h_fir[]; /* 2nd order fir filter for wsp, decimation by 2 */ -extern const Word16 h_fir_fx[]; /* 2nd order fir filter for wsp, decimation by 2 Q15*/ +extern const Word16 h_fir_fx[]; /* 2nd order fir filter for wsp, decimation by 2 Q15*/ extern const Word16 preemphCompensation_fx[]; // Q11 /*----------------------------------------------------------------------------------* @@ -175,7 +174,7 @@ extern const Word32 LS_MIN_SILENCE_SNR[4]; // Q25 extern const Word16 SNR_SUB_BAND_NUM[4]; // Q0 extern const Word16 BAND_MUL[4]; // Q15 -extern const UWord8 E_ROM_tipos[]; /* ACELP indexing Q0*/ +extern const UWord8 E_ROM_tipos[]; /* ACELP indexing Q0*/ extern const Word16 Weight[86]; extern const Word16 BAND_SCALE_AJ[5]; // Q0 diff --git a/lib_enc/rom_enc.c b/lib_enc/rom_enc_fx.c similarity index 55% rename from lib_enc/rom_enc.c rename to lib_enc/rom_enc_fx.c index abdb1249d12cdc3c9eb1ddb4e4640998de8fa641..4af957800648f7314f145808d5cb17dd1c888e60 100644 --- a/lib_enc/rom_enc.c +++ b/lib_enc/rom_enc_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -46,12 +46,12 @@ * VAD ROM tables *----------------------------------------------------------------------------------*/ -const Word16 hangover_hd_tbl[3] = {1, 1, 3}; // Q0 -const Word16 hangover_sf_tbl[6] = {1, 3, 4, 1, 1, 2}; // Q0 -const Word16 bwd_start_bin[BWD_N_BINS_MAX] = {1, 3, 6, 11}; // Q0 -const Word16 bwd_end_bin[BWD_N_BINS_MAX] = {1, 4, 9, 12}; // Q0 +const Word16 hangover_hd_tbl[3] = {1, 1, 3}; // Q0 +const Word16 hangover_sf_tbl[6] = {1, 3, 4, 1, 1, 2}; // Q0 +const Word16 bwd_start_bin[BWD_N_BINS_MAX] = {1, 3, 6, 11}; // Q0 +const Word16 bwd_end_bin[BWD_N_BINS_MAX] = {1, 4, 9, 12}; // Q0 -const Word16 BAND_NUM_TAB[5] = {10,10,20,40,60}; /* {OFFSET, NB, WB, SWB, FB} Q0*/ +const Word16 BAND_NUM_TAB[5] = {10,10,20,40,60}; /* {OFFSET, NB, WB, SWB, FB} Q0*/ typedef struct { Word16 r; @@ -76,16 +76,16 @@ const Word16 M_Wi_fix16[16] = 32609/* 9.9518473e-001f Q15 */,31356/* 9.5694034e-001f Q15 */,28898/* 8.8192126e-001f Q15 */,25329/* 7.7301045e-001f Q15 */,20787/* 6.3439328e-001f Q15 */,15446/* 4.7139674e-001f Q15 */, 9512/* 2.9028468e-001f Q15 */, 3212/* 9.8017140e-002f Q15 */ }; -const Word16 SP_CENTER_BAND_NUM_TAB[5] = {10, 10, 20, 24, 24}; // Q0 +const Word16 SP_CENTER_BAND_NUM_TAB[5] = {10, 10, 20, 24, 24}; // Q0 /* 107374184.f = 32768.f * 32768.f * 0.1 */ -const Word16 NREGION_INDEX_NB[9] = {0,1,2,3,4,5,6,7, 9}; // Q0 -const Word16 NREGION_INDEX_WB[13] = {0,1,2,3,4,5,6,8,10,12,16}; // Q0 -const Word16 NREGION_INDEX_SWB[16] = {0,1,2,3,4,5,6,8,10,12,16,24,36}; // Q0 -const Word16 NREGION_INDEX_FB[16] = {0,1,2,3,4,5,6,8,10,12,16,24,36}; // Q0 +const Word16 NREGION_INDEX_NB[9] = {0,1,2,3,4,5,6,7, 9}; // Q0 +const Word16 NREGION_INDEX_WB[13] = {0,1,2,3,4,5,6,8,10,12,16}; // Q0 +const Word16 NREGION_INDEX_SWB[16] = {0,1,2,3,4,5,6,8,10,12,16,24,36}; // Q0 +const Word16 NREGION_INDEX_FB[16] = {0,1,2,3,4,5,6,8,10,12,16,24,36}; // Q0 const Word16 NREGION_PREOFF[12] = { 0,0,0,0,0,0,1,1,1,2,3,4 }; -const Word16 ENERGY_BAND_NUM[4] = {8,10,12,MAX_SUBBAND_NUM}; // Q0 -const Word16 * const REGION_INDEX[4] = {NREGION_INDEX_NB, NREGION_INDEX_WB,NREGION_INDEX_SWB,NREGION_INDEX_FB}; // Q0 +const Word16 ENERGY_BAND_NUM[4] = {8,10,12,MAX_SUBBAND_NUM}; // Q0 +const Word16 * const REGION_INDEX[4] = {NREGION_INDEX_NB, NREGION_INDEX_WB,NREGION_INDEX_SWB,NREGION_INDEX_FB}; // Q0 const Word32 MAX_LF_SNR_TAB_FX[5] = { 26843545/* 0.8 Q25 */,26843545/* 0.8 Q25 */,53687090/* 1.6 Q25 */,26843545/* 0.8 Q25 */,26843545/* 0.8 Q25 */ }; const Word32 COMVAD_INIT_SNR_DELTA_FX[5] = { 33554431/* 1.0 Q25 */, 20132659/* 0.6 Q25 */, 28856811/* 0.86 Q25 */, 38923139/* 1.16 Q25 */, 33554431/* 1.0 Q25 */ }; const Word32 LT_MIN_SILENCE_SNR_FX[4] = { 150994940/* 4.5 Q25 */, 150994940/* 4.5 Q25 */, 150994940/* 4.5 Q25 */,150994940/* 4.5 Q25 */ }; @@ -106,7 +106,7 @@ const Word16 sqrt_han_window_fx[L_FFT / 2 + 1] = 31785, 31880, 31971, 32057, 32137, 32213, 32285, 32351, 32412, 32469, 32521, 32567, 32609, 32646, 32678, 32705, 32728, 32745, 32757, 32765, 32767 -}; // Q15 +}; // Q15 /*----------------------------------------------------------------------------------* * Starting points for pulse position search in Algebraic innovation codebook @@ -123,22 +123,22 @@ const Word16 tipos[40] = 3, 0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 0 /* end point for 28 pulses &ipos[39], 4th iter */ -}; // Q0 +}; // Q0 /*----------------------------------------------------------------------------------* * Open-loop pitch tables *----------------------------------------------------------------------------------*/ -const Word16 nb_sect_12k8[3] = { 4, 4, 4 }; // Q0 -const Word16 nb_subsect_12k8[3] = { 7, 7, 7 }; // Q0 -const Word16 pit_max_12k8[8] = { 11, 16, 21, 31, 40, 61, 77, 115}; // Q0 +const Word16 nb_sect_12k8[3] = { 4, 4, 4 }; // Q0 +const Word16 nb_subsect_12k8[3] = { 7, 7, 7 }; // Q0 +const Word16 pit_max_12k8[8] = { 11, 16, 21, 31, 40, 61, 77, 115}; // Q0 -const Word16 len_12k8[4] = { 40, 40, 62, 115 }; // Q0 -const Word16 len1_12k8[4] = { 40, 50, 80, 115 }; // Q0 -const Word16 sublen_12k8[7] = { 40, 40, 40, 62, 62, 115, 115 }; // Q0 -const Word16 sublen1_12k8[7] = { 40, 40, 50, 50, 80, 80, 115 }; // Q0 -const Word16 sec_length_12k8[4] = { 7, 15, 30, 54 }; // Q0 -const Word16 sec_length1_12k8[4] = { 10, 19, 37, 38 }; // Q0 -const Word16 h_fir_fx[] = { 4260, 7536, 9175, 7536, 4260 }; // Q15 +const Word16 len_12k8[4] = { 40, 40, 62, 115 }; // Q0 +const Word16 len1_12k8[4] = { 40, 50, 80, 115 }; // Q0 +const Word16 sublen_12k8[7] = { 40, 40, 40, 62, 62, 115, 115 }; // Q0 +const Word16 sublen1_12k8[7] = { 40, 40, 50, 50, 80, 80, 115 }; // Q0 +const Word16 sec_length_12k8[4] = { 7, 15, 30, 54 }; // Q0 +const Word16 sec_length1_12k8[4] = { 10, 19, 37, 38 }; // Q0 +const Word16 h_fir_fx[] = { 4260, 7536, 9175, 7536, 4260 }; // Q15 const Word16 W_HIST_FX[DTX_HIST_SIZE] = { 13107, 10486, 8389, 6711, 5369, 4295, 3436, 687 }; /* Q16 */ const Word16 W_HIST_S_FX[DTX_HIST_SIZE] = { 20480, 11378, 8393, 6938, 6092, 5551, 5183, 5115 }; /* Q12 */ @@ -148,8 +148,8 @@ const Word16 preemphCompensation_fx[NB_BANDS] = { 19960/*9.7461f Q11*/, 19493/* * LSF quantizer *----------------------------------------------------------------------------------*/ -const Word16 lsf_numlevels[TCXLPC_NUMSTAGES] = { 32, 16, 16 }; // Q0 -const Word16 lsf_ind_numlevels[TCXLPC_IND_NUMSTAGES] = { 4 }; // Q0 +const Word16 lsf_numlevels[TCXLPC_NUMSTAGES] = { 32, 16, 16 }; // Q0 +const Word16 lsf_ind_numlevels[TCXLPC_IND_NUMSTAGES] = { 4 }; // Q0 const Word16 lsf_unified_fit_model_nb[4][16] = { @@ -157,7 +157,7 @@ const Word16 lsf_unified_fit_model_nb[4][16] = {20383 , 18855 , 8494 , 8062 , 8105 , 6211 , 5068 , 4408 , 3741 , 3458 , 2732 , 3174 , 2412 , 17421 , -21717 , 0}, {-717 , -617 , -144 , -117 , -229 , -144 , -141 , -98 , -92 , -69 , -51 , -87 , -37 , -3019 , 19864 , 8034}, {-2424 , 8999 , 5723 , 5629 , 4239 , 3423 , 2507 , 2019 , 1245 , 736 , -907 , -2237 , -2558 , -1979 , -652 , 1657} -}; // Q0 +}; // Q0 const Word16 lsf_unified_fit_model_wb[4][16] = { @@ -165,7 +165,7 @@ const Word16 lsf_unified_fit_model_wb[4][16] = {24635 , 19605 , 9294 , 7407 , 6419 , 5459 , 4966 , 4189 , 3394 , 2964 , 2425 , 2110 , 2140 , 1972 , 1540 , 2252}, {-867 , -666 , -168 , -114 , -90 , -122 , -129 , -101 , -65 , -56 , -39 , -35 , -40 , -42 , -35 , -56}, {-2313 , 3035 , 1677 , 2854 , 2334 , 1232 , 1347 , 1034 , 863 , 707 , 886 , 891 , 432 , 357 , 206 , -310} -}; // Q0 +}; // Q0 const Word16 lsf_unified_fit_model_wbhb[4][16] = { @@ -173,52 +173,52 @@ const Word16 lsf_unified_fit_model_wbhb[4][16] = {28135 , 16053 , 10129 , 7366 , 5898 , 5341 , 3290 , 2780 , 3146 , 2423 , 1613 , 1370 , 1294 , 1635 , 1105 , 1431}, {-615 , -308 , -147 , -119 , -104 , -105 , -30 , -28 , -50 , -39 , -15 , -14 , -14 , -21 , -19 , -29}, {1534 , 3569 , 3138 , 4023 , 2105 , 2023 , 2046 , 1264 , 1340 , 1067 , 780 , 547 , 188 , -540 , -722 , -479} -}; // Q0 +}; // Q0 const Word32 Freq_Weight_Com_fx[160] = /*Q31 */ { - 1073741824, 1351646720, 1610612736, 1832992000, 2003629568, 2110896768, 2147483647, 2147483647, - 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, - 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2088915968, 2033457920, 1980868480, - 1930930688, 1883448832, 1838246016, 1795162112, 1754051584, 1714781696, 1677231744, 1641291136, - 1606858368, 1573840768, 1542152704, 1511715456, 1482456448, 1454308608, 1427209600, 1401102080, - 1375932672, 1351651456, 1328212480, 1305572480, 1283691392, 1262531584, 1242058112, 1222238080, - 1203040640, 1184436864, 1166399744, 1148903808, 1131924864, 1115440512, 1099429376, 1083871488, - 1068747648, 1054040128, 1039731904, 1025806912, 1012249984, 999046720, 986183488, 973647232, - 961425728, 949507264, 937880640, 926535296, 915461184, 904648640, 894088512, 883772096, - 873691072, 863837376, 854203520, 844782144, 835566336, 826549440, 817725120, 809087168, - 800629824, 792347392, 784234624, 776286336, 768497472, 760863424, 753379520, 746041408, - 738844864, 731785856, 724860416, 718064832, 711395520, 704848896, 698421760, 692110720, - 685912704, 679824704, 673843840, 667967296, 662192384, 656516416, 650936960, 645451520, - 640057792, 634753472, 629536320, 624404224, 619355136, 614387008, 609497984, 604686208, - 599949760, 595286912, 590696000, 586175360, 581723392, 577338560, 573019328, 568764224, - 564571840, 560440832, 556369856, 552357568, 548402752, 544504128, 540660608, 536870912, - 533133984, 529448736, 525814080, 522228992, 518692448, 515203488, 511761152, 508364480, - 505012640, 501704704, 498439808, 495217120, 492035872, 488895200, 485794400, 482732672, - 479709280, 476723552, 473774752, 470862208, 467985248, 465143232, 462335520, 459561504, - 456820576, 454112160, 451435648, 448790528, 446176224, 443592192, 441037920, 438512896 + 1073741824, 1351646720, 1610612736, 1832992000, 2003629568, 2110896768, 2147483647, 2147483647, + 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, + 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2088915968, 2033457920, 1980868480, + 1930930688, 1883448832, 1838246016, 1795162112, 1754051584, 1714781696, 1677231744, 1641291136, + 1606858368, 1573840768, 1542152704, 1511715456, 1482456448, 1454308608, 1427209600, 1401102080, + 1375932672, 1351651456, 1328212480, 1305572480, 1283691392, 1262531584, 1242058112, 1222238080, + 1203040640, 1184436864, 1166399744, 1148903808, 1131924864, 1115440512, 1099429376, 1083871488, + 1068747648, 1054040128, 1039731904, 1025806912, 1012249984, 999046720, 986183488, 973647232, + 961425728, 949507264, 937880640, 926535296, 915461184, 904648640, 894088512, 883772096, + 873691072, 863837376, 854203520, 844782144, 835566336, 826549440, 817725120, 809087168, + 800629824, 792347392, 784234624, 776286336, 768497472, 760863424, 753379520, 746041408, + 738844864, 731785856, 724860416, 718064832, 711395520, 704848896, 698421760, 692110720, + 685912704, 679824704, 673843840, 667967296, 662192384, 656516416, 650936960, 645451520, + 640057792, 634753472, 629536320, 624404224, 619355136, 614387008, 609497984, 604686208, + 599949760, 595286912, 590696000, 586175360, 581723392, 577338560, 573019328, 568764224, + 564571840, 560440832, 556369856, 552357568, 548402752, 544504128, 540660608, 536870912, + 533133984, 529448736, 525814080, 522228992, 518692448, 515203488, 511761152, 508364480, + 505012640, 501704704, 498439808, 495217120, 492035872, 488895200, 485794400, 482732672, + 479709280, 476723552, 473774752, 470862208, 467985248, 465143232, 462335520, 459561504, + 456820576, 454112160, 451435648, 448790528, 446176224, 443592192, 441037920, 438512896 }; const Word32 Freq_Weight_UV_fx[160] = /*Q31 */ { - 1073741824, 1351646720, 1610612736, 1832992000, 2003629568, 2110896768, 2147483647, 2129881344, - 2112565248, 2095528448, 2078764160, 2062265984, 2046027776, 2030043136, 2014306304, 1998811648, - 1983553536, 1968526720, 1953725696, 1939145728, 1924781696, 1910628864, 1896682624, 1882938624, - 1869392256, 1856039424, 1842876032, 1829897984, 1817101568, 1804482816, 1792038016, 1779763840, - 1767656576, 1755713024, 1743929728, 1732303488, 1720831232, 1709510016, 1698336768, 1687308544, - 1676422656, 1665676416, 1655067008, 1644591872, 1634248576, 1624034560, 1613947392, 1603984640, - 1594144256, 1584423936, 1574821376, 1565334528, 1555961216, 1546699520, 1537547520, 1528503040, - 1519564416, 1510729728, 1501997184, 1493365120, 1484831488, 1476395008, 1468053760, 1459806336, - 1451650944, 1443586176, 1435610624, 1427722624, 1419920896, 1412203904, 1404570368, 1397018880, - 1389548288, 1382157056, 1374844032, 1367608064, 1360447744, 1353362048, 1346349824, 1339409920, - 1332541184, 1325742464, 1319012736, 1312351104, 1305756416, 1299227648, 1292763776, 1286363904, - 1280027136, 1273752576, 1267539072, 1261385984, 1255292416, 1249257344, 1243280000, 1237359616, - 1231495424, 1225686400, 1219932032, 1214231424, 1208583808, 1202988544, 1197444736, 1191951872, - 1186509184, 1181116032, 1175771648, 1170475264, 1165226496, 1160024704, 1154868992, 1149758976, - 1144693888, 1139673344, 1134696576, 1129763200, 1124872448, 1120023808, 1115216768, 1110450944, - 1105725568, 1101040384, 1096394624, 1091787904, 1087219712, 1082689664, 1078197248, 1073741824, - 1069323136, 1064940672, 1060593984, 1056282624, 1052006144, 1047764224, 1043556288, 1039382080, - 1035241152, 1031132992, 1027057408, 1023013888, 1019002048, 1015021568, 1011072064, 1007153152, - 1003264576, 999405824, 995576704, 991776768, 988005760, 984263360, 980549120, 976862848, - 973204224, 969572864, 965968512, 962390848, 958839552, 955314432, 951815104, 948341312, + 1073741824, 1351646720, 1610612736, 1832992000, 2003629568, 2110896768, 2147483647, 2129881344, + 2112565248, 2095528448, 2078764160, 2062265984, 2046027776, 2030043136, 2014306304, 1998811648, + 1983553536, 1968526720, 1953725696, 1939145728, 1924781696, 1910628864, 1896682624, 1882938624, + 1869392256, 1856039424, 1842876032, 1829897984, 1817101568, 1804482816, 1792038016, 1779763840, + 1767656576, 1755713024, 1743929728, 1732303488, 1720831232, 1709510016, 1698336768, 1687308544, + 1676422656, 1665676416, 1655067008, 1644591872, 1634248576, 1624034560, 1613947392, 1603984640, + 1594144256, 1584423936, 1574821376, 1565334528, 1555961216, 1546699520, 1537547520, 1528503040, + 1519564416, 1510729728, 1501997184, 1493365120, 1484831488, 1476395008, 1468053760, 1459806336, + 1451650944, 1443586176, 1435610624, 1427722624, 1419920896, 1412203904, 1404570368, 1397018880, + 1389548288, 1382157056, 1374844032, 1367608064, 1360447744, 1353362048, 1346349824, 1339409920, + 1332541184, 1325742464, 1319012736, 1312351104, 1305756416, 1299227648, 1292763776, 1286363904, + 1280027136, 1273752576, 1267539072, 1261385984, 1255292416, 1249257344, 1243280000, 1237359616, + 1231495424, 1225686400, 1219932032, 1214231424, 1208583808, 1202988544, 1197444736, 1191951872, + 1186509184, 1181116032, 1175771648, 1170475264, 1165226496, 1160024704, 1154868992, 1149758976, + 1144693888, 1139673344, 1134696576, 1129763200, 1124872448, 1120023808, 1115216768, 1110450944, + 1105725568, 1101040384, 1096394624, 1091787904, 1087219712, 1082689664, 1078197248, 1073741824, + 1069323136, 1064940672, 1060593984, 1056282624, 1052006144, 1047764224, 1043556288, 1039382080, + 1035241152, 1031132992, 1027057408, 1023013888, 1019002048, 1015021568, 1011072064, 1007153152, + 1003264576, 999405824, 995576704, 991776768, 988005760, 984263360, 980549120, 976862848, + 973204224, 969572864, 965968512, 962390848, 958839552, 955314432, 951815104, 948341312, }; /*----------------------------------------------------------------------------------* @@ -227,20 +227,20 @@ const Word32 Freq_Weight_UV_fx[160] = /*Q31 */ const Word16 w_spmus_fx[HANG_LEN][HANG_LEN] = { /*Q15*/ - {32767, 0, 0, 0, 0, 0, 0, 0,}, - {19661, 13107, 0, 0, 0, 0, 0, 0,}, - {15401, 10813, 6554, 0, 0, 0, 0, 0,}, - {13107, 9830, 6554, 3277, 0, 0, 0, 0,}, - { 9830, 8192, 6554, 4915, 3277, 0, 0, 0,}, - { 7635, 6783, 5898, 5014, 4162, 3277, 0, 0,}, - { 7700, 6717, 5702, 4686, 3670, 2654, 1638, 0,}, - { 6554, 5865, 5145, 4456, 3736, 3047, 2327, 1638} + {32767, 0, 0, 0, 0, 0, 0, 0,}, + {19661, 13107, 0, 0, 0, 0, 0, 0,}, + {15401, 10813, 6554, 0, 0, 0, 0, 0,}, + {13107, 9830, 6554, 3277, 0, 0, 0, 0,}, + { 9830, 8192, 6554, 4915, 3277, 0, 0, 0,}, + { 7635, 6783, 5898, 5014, 4162, 3277, 0, 0,}, + { 7700, 6717, 5702, 4686, 3670, 2654, 1638, 0,}, + { 6554, 5865, 5145, 4456, 3736, 3047, 2327, 1638} }; const Word32 sm_means_fx[N_SMC_FEATURES] = { 114371648, 762918, 258533, 305622, 877131, 1071555, 1272603, 67350312, 1296274, -2461829, 1882791, -41135, -306269, 641721, 5859343, -}; // Q20 +}; // Q20 const Word32 sm_scale_fx[N_SMC_FEATURES] = {//Q20 46789116, 166914, 66905, 70898, 117576, 108472, 96226, 17324576, @@ -257,12 +257,12 @@ const Word32 bcox_add_cnst_fx[N_SMC_FEATURES] = { 0, 0, -1886955264, -1559167616, 0, 0, 0, 0, -1672874752, 0, 0, 0, 0, 0, 0, -}; // Q31 +}; // Q31 const Word32 bcox_lmbd_fx[N_SMC_FEATURES] = { 0, 0, -1426534784, -907320448, 0, 0, 0, 0, -1362524672, 0, 0, 0, 0, 0, 0, -}; // Q31 +}; // Q31 const Word32 pca_mean_fx[N_SMC_FEATURES] = { 0, 0, 0, 0, 0, 0, 0, 0, @@ -541,287 +541,287 @@ const Word32 prec_chol_noise_fx[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_CO const Word16 m_speech_fx[N_MIXTURES*N_FEATURES] = { /*Q15*/ - 9436, 29987, 4795, 7076, 11050, 13645, 15206, 15194, 1936, 27952, 25172, 10301, - 10057, 30685, 8381, 9965, 10762, 8680, 11589, 15788, 1641, 26751, 27163, 10992, - 7927, 31230, 7191, 8505, 14304, 16336, 14972, 16077, 2052, 27271, 27694, 10859, - 13914, 17323, 10682, 16458, 17807, 18403, 19368, 12665, 2205, 29598, 29213, 11285, - 12468, 23848, 6880, 10301, 13824, 13066, 14647, 13189, 3451, 28442, 28766, 10410, - 11304, 21566, 7894, 11411, 14194, 15739, 16351, 13744, 6130, 28445, 28034, 11380 + 9436, 29987, 4795, 7076, 11050, 13645, 15206, 15194, 1936, 27952, 25172, 10301, + 10057, 30685, 8381, 9965, 10762, 8680, 11589, 15788, 1641, 26751, 27163, 10992, + 7927, 31230, 7191, 8505, 14304, 16336, 14972, 16077, 2052, 27271, 27694, 10859, + 13914, 17323, 10682, 16458, 17807, 18403, 19368, 12665, 2205, 29598, 29213, 11285, + 12468, 23848, 6880, 10301, 13824, 13066, 14647, 13189, 3451, 28442, 28766, 10410, + 11304, 21566, 7894, 11411, 14194, 15739, 16351, 13744, 6130, 28445, 28034, 11380 }; const Word32 invV_speech_fx[N_MIXTURES*N_FEATURES*N_FEATURES] = { /*Q10*/ - -40443, -14756, -39560, -18113, 8983, -11676, 450, -10588, -49908, 358, 17222, 32914, - -14756, -200610, -27679, -28092, -16846, -6393, 5954, 13058, -67051, -47861, -8575, 18740, - -39560, -27679, -772035, 118158, -48299, 27758, -37782, 74336, -305470, -23323, 181510, 91957, - -18113, -28092, 118158, -228070, 41104, -46248, 21977, 8161, -27789, 78357, 26088, 39736, - 8983, -16846, -48299, 41104, -96670, 41164, -18208, 3995, -14774, 23704, 13802, 17925, - -11676, -6393, 27758, -46248, 41164, -95654, 58562, 3668, 103, 5952, 9479, 11083, - 450, 5954, -37782, 21977, -18208, 58562, -91964, -5597, -47161, -15941, 14870, 11028, - -10588, 13058, 74336, 8161, 3995, 3668, -5597, -102767, 25363, -21490, -48411, 13509, - -49908, -67051, -305470, -27789, -14774, 103, -47161, 25363, -1410848, -57997, 238792, -117641, - 358, -47861, -23323, 78357, 23704, 5952, -15941, -21490, -57997, -221932, -936, 40579, - 17222, -8575, 181510, 26088, 13802, 9479, 14870, -48411, 238792, -936, -157118, -49202, - 32914, 18740, 91957, 39736, 17925, 11083, 11028, 13509, -117641, 40579, -49202, -321159, - -54755, -48603, -918, -25735, 31634, -27972, 23305, -18449, -68162, -3670, -7982, 35965, - -48603, -449238, -11496, -14811, 12790, -11453, 2686, -3752, -86924, -30083, -54695, 17457, - -918, -11496, -258042, 157642, 4617, 27546, -22677, 7281, -221085, -48457, 80126, 16406, - -25735, -14811, 157642, -334462, 64217, 7724, 24309, 20322, -99420, 2896, 76924, 35785, - 31634, 12790, 4617, 64217, -296101, 182629, -27282, 11581, -10495, 16901, 50011, 20823, - -27972, -11453, 27546, 7724, 182629, -274190, 15505, 4345, -7824, 79496, -2218, 12832, - 23305, 2686, -22677, 24309, -27282, 15505, -73195, 2055, -4690, 31413, 15447, 8774, - -18449, -3752, 7281, 20322, 11581, 4345, 2055, -77913, 57514, -8586, -106171, 6233, - -68162, -86924, -221085, -99420, -10495, -7824, -4690, 57514, -1966183, -9074, 512909, -17375, - -3670, -30083, -48457, 2896, 16901, 79496, 31413, -8586, -9074, -185355, -15990, 8445, - -7982, -54695, 80126, 76924, 50011, -2218, 15447, -106171, 512909, -15990, -444405, -71821, - 35965, 17457, 16406, 35785, 20823, 12832, 8774, 6233, -17375, 8445, -71821, -222292, - -96397, -65745, 316, -47258, 43061, -42973, 10442, -19582, -43973, -19682, -21732, 48029, - -65745, -838575, 30816, -43250, 6642, -4487, 11239, 338, -17329, -59741, -114530, -1706, - 316, 30816, -351192, 207585, -68100, 60838, -83672, 14796, -158998, 13313, 122647, 38113, - -47258, -43250, 207585, -322741, 76525, -99711, 59838, 20166, -63534, 7136, 76247, 22923, - 43061, 6642, -68100, 76525, -96244, 54110, -21689, 2401, -36455, -19725, 38782, 6802, - -42973, -4487, 60838, -99711, 54110, -284964, 220150, -642, -44874, -21815, 16040, 3963, - 10442, 11239, -83672, 59838, -21689, 220150, -239817, 2018, -17214, -1904, 16387, 4095, - -19582, 338, 14796, 20166, 2401, -642, 2018, -58537, 20742, -9245, -85094, 8867, - -43973, -17329, -158998, -63534, -36455, -44874, -17214, 20742, -1009892, 28181, 407531, -10963, - -19682, -59741, 13313, 7136, -19725, -21815, -1904, -9245, 28181, -186118, -32487, 5665, - -21732, -114530, 122647, 76248, 38782, 16040, 16387, -85094, 407531, -32487, -511009, -66277, - 48029, -1706, 38113, 22923, 6802, 3963, 4095, 8867, -10963, 5665, -66277, -251113, - -21146, 1393, -2365, 3756, -4538, -1528, 2298, -6668, -7599, -2720, -5226, 3049, - 1393, -46612, -28502, 11801, -5967, 8395, -4182, 13773, 18586, -9799, -6696, -3522, - -2365, -28502, -77446, 55688, -10615, 10476, -6282, 5520, -19365, 8818, -4576, 2603, - 3756, 11801, 55688, -152293, 104577, -8742, 15278, -2773, 16622, -12382, -2828, 5452, - -4538, -5967, -10615, 104577, -245151, 117173, -5020, 3412, -2855, -19929, 9729, 1888, - -1528, 8395, 10476, -8742, 117173, -258943, 136249, -2960, -8257, -20123, -6735, -6316, - 2298, -4182, -6282, 15278, -5020, 136249, -192889, 889, -6047, -74906, 15861, 4026, - -6668, 13773, 5520, -2773, 3412, -2960, 889, -298321, 8558, 5827, -66886, -3080, - -7599, 18586, -19365, 16622, -2855, -8257, -6047, 8558, -837495, -36576, 477123, -58582, - -2720, -9799, 8818, -12382, -19929, -20123, -74906, 5827, -36576, -279826, 29479, 36566, - -5226, -6696, -4576, -2828, 9729, -6735, 15861, -66886, 477123, 29479, -1017755, -75828, - 3049, -3522, 2603, 5452, 1888, -6316, 4026, -3080, -58582, 36566, -75828, -193453, - -30403, -6761, -6085, -8388, 12841, -17600, 8289, -11817, -4054, -3000, -13322, 14944, - -6761, -28452, -12326, -8945, 10515, -8369, -520, 2242, -3287, -20124, 179, 12354, - -6085, -12326, -180408, 89468, -19908, 3017, -41552, 4204, -31158, -23783, 87004, 44784, - -8388, -8945, 89468, -146434, 53166, -28645, 29987, -2506, -12242, 28411, 11874, 403, - 12841, 10515, -19908, 53166, -182342, 131104, -3630, 7016, -11031, -43497, 35570, 41136, - -17600, -8369, 3017, -28645, 131104, -169537, 52490, -4955, 3848, 41489, -7925, -19614, - 8289, -520, -41552, 29987, -3630, 52490, -111006, -916, 3418, 2295, 3395, 1491, - -11817, 2242, 4204, -2506, 7016, -4955, -916, -219477, -4965, -3871, -77054, -1199, - -4054, -3287, -31158, -12242, -11031, 3848, 3418, -4965, -272588, 2948, 184352, -45153, - -3000, -20124, -23783, 28411, -43497, 41489, 2295, -3871, 2948, -160538, -11875, 4491, - -13322, 179, 87004, 11874, 35570, -7925, 3395, -77054, 184352, -11875, -501251, -59166, - 14944, 12354, 44784, 403, 41136, -19614, 1491, -1199, -45153, 4491, -59166, -256669, - -24496, -5820, -2150, 131, 5291, -10279, 6605, -749, -2301, -4257, 6742, 4179, - -5820, -30866, -8866, -12879, -1341, 2042, -4488, 6991, -847, -21654, 3707, 11359, - -2150, -8866, -123923, 90609, -28405, 24864, -28222, 3814, 6439, -12821, 2736, 12974, - 131, -12879, 90609, -147490, 86712, -38319, 26159, 1048, -7654, 17099, 8973, 1271, - 5291, -1341, -28405, 86712, -147877, 74296, -14561, 2055, 18062, 1238, -4181, 14726, - -10279, 2042, 24864, -38319, 74296, -168459, 117891, -874, -17255, 675, 13174, -13101, - 6605, -4488, -28222, 26159, -14561, 117891, -147764, -13296, 2771, -4243, -4809, 1608, - -749, 6991, 3814, 1048, 2055, -874, -13296, -77582, -32335, -4868, 9778, -6784, - -2301, -847, 6439, -7654, 18062, -17255, 2771, -32335, -69840, 11490, 21385, -23633, - -4257, -21654, -12821, 17099, 1238, 675, -4243, -4868, 11490, -151841, -2520, 12898, - 6742, 3707, 2736, 8973, -4181, 13174, -4809, 9778, 21385, -2520, -60529, -3814, - 4179, 11359, 12974, 1271, 14726, -13101, 1608, -6784, -23633, 12898, -3814, -63927 + -40443, -14756, -39560, -18113, 8983, -11676, 450, -10588, -49908, 358, 17222, 32914, + -14756, -200610, -27679, -28092, -16846, -6393, 5954, 13058, -67051, -47861, -8575, 18740, + -39560, -27679, -772035, 118158, -48299, 27758, -37782, 74336, -305470, -23323, 181510, 91957, + -18113, -28092, 118158, -228070, 41104, -46248, 21977, 8161, -27789, 78357, 26088, 39736, + 8983, -16846, -48299, 41104, -96670, 41164, -18208, 3995, -14774, 23704, 13802, 17925, + -11676, -6393, 27758, -46248, 41164, -95654, 58562, 3668, 103, 5952, 9479, 11083, + 450, 5954, -37782, 21977, -18208, 58562, -91964, -5597, -47161, -15941, 14870, 11028, + -10588, 13058, 74336, 8161, 3995, 3668, -5597, -102767, 25363, -21490, -48411, 13509, + -49908, -67051, -305470, -27789, -14774, 103, -47161, 25363, -1410848, -57997, 238792, -117641, + 358, -47861, -23323, 78357, 23704, 5952, -15941, -21490, -57997, -221932, -936, 40579, + 17222, -8575, 181510, 26088, 13802, 9479, 14870, -48411, 238792, -936, -157118, -49202, + 32914, 18740, 91957, 39736, 17925, 11083, 11028, 13509, -117641, 40579, -49202, -321159, + -54755, -48603, -918, -25735, 31634, -27972, 23305, -18449, -68162, -3670, -7982, 35965, + -48603, -449238, -11496, -14811, 12790, -11453, 2686, -3752, -86924, -30083, -54695, 17457, + -918, -11496, -258042, 157642, 4617, 27546, -22677, 7281, -221085, -48457, 80126, 16406, + -25735, -14811, 157642, -334462, 64217, 7724, 24309, 20322, -99420, 2896, 76924, 35785, + 31634, 12790, 4617, 64217, -296101, 182629, -27282, 11581, -10495, 16901, 50011, 20823, + -27972, -11453, 27546, 7724, 182629, -274190, 15505, 4345, -7824, 79496, -2218, 12832, + 23305, 2686, -22677, 24309, -27282, 15505, -73195, 2055, -4690, 31413, 15447, 8774, + -18449, -3752, 7281, 20322, 11581, 4345, 2055, -77913, 57514, -8586, -106171, 6233, + -68162, -86924, -221085, -99420, -10495, -7824, -4690, 57514, -1966183, -9074, 512909, -17375, + -3670, -30083, -48457, 2896, 16901, 79496, 31413, -8586, -9074, -185355, -15990, 8445, + -7982, -54695, 80126, 76924, 50011, -2218, 15447, -106171, 512909, -15990, -444405, -71821, + 35965, 17457, 16406, 35785, 20823, 12832, 8774, 6233, -17375, 8445, -71821, -222292, + -96397, -65745, 316, -47258, 43061, -42973, 10442, -19582, -43973, -19682, -21732, 48029, + -65745, -838575, 30816, -43250, 6642, -4487, 11239, 338, -17329, -59741, -114530, -1706, + 316, 30816, -351192, 207585, -68100, 60838, -83672, 14796, -158998, 13313, 122647, 38113, + -47258, -43250, 207585, -322741, 76525, -99711, 59838, 20166, -63534, 7136, 76247, 22923, + 43061, 6642, -68100, 76525, -96244, 54110, -21689, 2401, -36455, -19725, 38782, 6802, + -42973, -4487, 60838, -99711, 54110, -284964, 220150, -642, -44874, -21815, 16040, 3963, + 10442, 11239, -83672, 59838, -21689, 220150, -239817, 2018, -17214, -1904, 16387, 4095, + -19582, 338, 14796, 20166, 2401, -642, 2018, -58537, 20742, -9245, -85094, 8867, + -43973, -17329, -158998, -63534, -36455, -44874, -17214, 20742, -1009892, 28181, 407531, -10963, + -19682, -59741, 13313, 7136, -19725, -21815, -1904, -9245, 28181, -186118, -32487, 5665, + -21732, -114530, 122647, 76248, 38782, 16040, 16387, -85094, 407531, -32487, -511009, -66277, + 48029, -1706, 38113, 22923, 6802, 3963, 4095, 8867, -10963, 5665, -66277, -251113, + -21146, 1393, -2365, 3756, -4538, -1528, 2298, -6668, -7599, -2720, -5226, 3049, + 1393, -46612, -28502, 11801, -5967, 8395, -4182, 13773, 18586, -9799, -6696, -3522, + -2365, -28502, -77446, 55688, -10615, 10476, -6282, 5520, -19365, 8818, -4576, 2603, + 3756, 11801, 55688, -152293, 104577, -8742, 15278, -2773, 16622, -12382, -2828, 5452, + -4538, -5967, -10615, 104577, -245151, 117173, -5020, 3412, -2855, -19929, 9729, 1888, + -1528, 8395, 10476, -8742, 117173, -258943, 136249, -2960, -8257, -20123, -6735, -6316, + 2298, -4182, -6282, 15278, -5020, 136249, -192889, 889, -6047, -74906, 15861, 4026, + -6668, 13773, 5520, -2773, 3412, -2960, 889, -298321, 8558, 5827, -66886, -3080, + -7599, 18586, -19365, 16622, -2855, -8257, -6047, 8558, -837495, -36576, 477123, -58582, + -2720, -9799, 8818, -12382, -19929, -20123, -74906, 5827, -36576, -279826, 29479, 36566, + -5226, -6696, -4576, -2828, 9729, -6735, 15861, -66886, 477123, 29479, -1017755, -75828, + 3049, -3522, 2603, 5452, 1888, -6316, 4026, -3080, -58582, 36566, -75828, -193453, + -30403, -6761, -6085, -8388, 12841, -17600, 8289, -11817, -4054, -3000, -13322, 14944, + -6761, -28452, -12326, -8945, 10515, -8369, -520, 2242, -3287, -20124, 179, 12354, + -6085, -12326, -180408, 89468, -19908, 3017, -41552, 4204, -31158, -23783, 87004, 44784, + -8388, -8945, 89468, -146434, 53166, -28645, 29987, -2506, -12242, 28411, 11874, 403, + 12841, 10515, -19908, 53166, -182342, 131104, -3630, 7016, -11031, -43497, 35570, 41136, + -17600, -8369, 3017, -28645, 131104, -169537, 52490, -4955, 3848, 41489, -7925, -19614, + 8289, -520, -41552, 29987, -3630, 52490, -111006, -916, 3418, 2295, 3395, 1491, + -11817, 2242, 4204, -2506, 7016, -4955, -916, -219477, -4965, -3871, -77054, -1199, + -4054, -3287, -31158, -12242, -11031, 3848, 3418, -4965, -272588, 2948, 184352, -45153, + -3000, -20124, -23783, 28411, -43497, 41489, 2295, -3871, 2948, -160538, -11875, 4491, + -13322, 179, 87004, 11874, 35570, -7925, 3395, -77054, 184352, -11875, -501251, -59166, + 14944, 12354, 44784, 403, 41136, -19614, 1491, -1199, -45153, 4491, -59166, -256669, + -24496, -5820, -2150, 131, 5291, -10279, 6605, -749, -2301, -4257, 6742, 4179, + -5820, -30866, -8866, -12879, -1341, 2042, -4488, 6991, -847, -21654, 3707, 11359, + -2150, -8866, -123923, 90609, -28405, 24864, -28222, 3814, 6439, -12821, 2736, 12974, + 131, -12879, 90609, -147490, 86712, -38319, 26159, 1048, -7654, 17099, 8973, 1271, + 5291, -1341, -28405, 86712, -147877, 74296, -14561, 2055, 18062, 1238, -4181, 14726, + -10279, 2042, 24864, -38319, 74296, -168459, 117891, -874, -17255, 675, 13174, -13101, + 6605, -4488, -28222, 26159, -14561, 117891, -147764, -13296, 2771, -4243, -4809, 1608, + -749, 6991, 3814, 1048, 2055, -874, -13296, -77582, -32335, -4868, 9778, -6784, + -2301, -847, 6439, -7654, 18062, -17255, 2771, -32335, -69840, 11490, 21385, -23633, + -4257, -21654, -12821, 17099, 1238, 675, -4243, -4868, 11490, -151841, -2520, 12898, + 6742, 3707, 2736, 8973, -4181, 13174, -4809, 9778, 21385, -2520, -60529, -3814, + 4179, 11359, 12974, 1271, 14726, -13101, 1608, -6784, -23633, 12898, -3814, -63927 }; const Word32 lvm_speech_fx[N_MIXTURES] = { /*Q10*/ - 32765, 33549, 33755, 32747, 31627, 26814 + 32765, 33549, 33755, 32747, 31627, 26814 }; const Word16 m_music_fx[N_MIXTURES*N_FEATURES] = { /*Q15*/ - 14804, 25446, 8882, 11624, 12963, 13563, 14794, 20567, 1033, 27373, 23772, 11713, - 15975, 20612, 7737, 12728, 14424, 15237, 16190, 15239, 2277, 30096, 28120, 11522, - 17631, 19827, 9280, 14111, 15555, 16289, 17009, 17271, 1132, 31186, 27733, 12469, - 15863, 24390, 7804, 11176, 11734, 11986, 12857, 23015, 713, 28823, 23782, 13779, - 10022, 22691, 12397, 15249, 15957, 16382, 17058, 15509, 4107, 23807, 22701, 12269, - 16842, 22819, 8062, 11248, 12283, 12978, 13722, 21178, 867, 30480, 25501, 12111 + 14804, 25446, 8882, 11624, 12963, 13563, 14794, 20567, 1033, 27373, 23772, 11713, + 15975, 20612, 7737, 12728, 14424, 15237, 16190, 15239, 2277, 30096, 28120, 11522, + 17631, 19827, 9280, 14111, 15555, 16289, 17009, 17271, 1132, 31186, 27733, 12469, + 15863, 24390, 7804, 11176, 11734, 11986, 12857, 23015, 713, 28823, 23782, 13779, + 10022, 22691, 12397, 15249, 15957, 16382, 17058, 15509, 4107, 23807, 22701, 12269, + 16842, 22819, 8062, 11248, 12283, 12978, 13722, 21178, 867, 30480, 25501, 12111 }; const Word32 invV_music_fx[N_MIXTURES*N_FEATURES*N_FEATURES] = { /*Q10*/ - -7878, -673, -2037, -885, -236, -667, 749, -1726, -20424, -859, 2463, 4011, - -673, -31356, -1591, -3048, -1872, 1277, -3806, 8836, 5555, -2031, -11076, -7329, - -2037, -1591, -65556, 42935, -11408, 12166, 751, 8792, 24077, -15804, -2546, -2517, - -885, -3048, 42935, -88483, 42957, -13081, 4776, 14411, 23734, -5735, 15306, 15210, - -236, -1872, -11408, 42957, -90738, 37950, -1795, 4021, -35266, 12445, 13655, 17403, - -667, 1277, 12166, -13081, 37950, -86289, 37943, 3429, -5655, 5664, 8658, -11, - 749, -3806, 751, 4776, -1795, 37943, -77863, -8515, -74265, 22313, 3842, 645, - -1726, 8836, 8792, 14411, 4021, 3429, -8515, -59311, -121235, 1622, -8500, 4967, - -20424, 5555, 24077, 23734, -35266, -5655, -74265, -121235, -5534279, 175865, 247781, -296138, - -859, -2031, -15804, -5735, 12445, 5664, 22313, 1622, 175865, -104343, -1168, 32220, - 2463, -11076, -2546, 15306, 13655, 8658, 3842, -8500, 247781, -1168, -79522, -45571, - 4011, -7329, -2517, 15210, 17403, -11, 645, 4967, -296138, 32220, -45571, -249005, - -10115, 613, -4406, -403, 731, 898, 350, -1995, -8975, -169, -1296, 1233, - 613, -30663, -12425, -1115, -1862, 2906, -2485, 12887, -8842, -12067, 4833, 3070, - -4406, -12425, -86550, 49625, -11519, 15386, -20054, 20873, -13684, 28341, 23152, -807, - -403, -1115, 49625, -131210, 81002, 1045, 3085, 8149, -11887, -3094, 43855, 14533, - 731, -1862, -11519, 81002, -226160, 115669, 9052, -6427, -19605, -20406, 7481, 6064, - 898, 2906, 15386, 1045, 115669, -281745, 150559, -5530, 271, -5717, 1673, 7674, - 350, -2485, -20054, 3085, 9052, 150559, -200735, -21872, -9366, 10471, -2190, 3083, - -1995, 12887, 20873, 8149, -6427, -5530, -21872, -111299, -29613, -27611, -54741, -9432, - -8975, -8842, -13684, -11887, -19605, 271, -9366, -29613, -616730, 74872, 189453, -79618, - -169, -12067, 28341, -3094, -20406, -5717, 10471, -27611, 74872, -359342, -12919, 29609, - -1296, 4833, 23152, 43855, 7481, 1673, -2190, -54741, 189453, -12919, -407670, -16961, - 1233, 3070, -807, 14533, 6064, 7674, 3083, -9432, -79618, 29609, -16961, -180700, - -12411, 5539, -1902, 92, 2813, 339, -114, -1078, -24097, -2938, -1812, 399, - 5539, -36224, -7229, -766, -2442, 2066, -2896, 8507, 16429, -11423, -12067, -191, - -1902, -7230, -115426, 44336, 11635, 13946, -3573, 22728, -73099, 119214, 70165, 4686, - 92, -766, 44336, -187908, 81624, 24838, 12765, 1471, -43322, -24066, 44669, 3543, - 2813, -2442, 11635, 81624, -295220, 104190, 52986, -3246, -146322, -78690, 34365, -2814, - 339, 2066, 13946, 24838, 104190, -347659, 169287, -4458, -127093, -94499, 42989, 5700, - -114, -2896, -3573, 12765, 52986, 169287, -310084, -18605, -27182, -19113, -2714, 11, - -1078, 8507, 22728, 1471, -3246, -4458, -18605, -69283, 40578, -47905, -135760, -6645, - -24097, 16429, -73099, -43322, -146322, -127093, -27182, 40578, -8241631, -71531, 1853193, -175523, - -2938, -11423, 119214, -24066, -78690, -94499, -19113, -47905, -71531, -1361618, -36609, 26675, - -1812, -12067, 70165, 44669, 34365, 42989, -2714, -135760, 1853193, -36609, -1337597, -83909, - 399, -191, 4686, 3543, -2814, 5700, 11, -6645, -175523, 26675, -83909, -223653, - -8809, 3326, -1275, -1509, 1423, 1222, -767, -3923, -65513, -5992, 9965, 3853, - 3326, -31906, -1905, 4114, -4704, 1138, -584, 10709, 104184, 6118, -30358, -5240, - -1275, -1905, -184413, 67973, -17415, 32246, -7121, 16051, -2994, -52989, 23547, 27770, - -1509, 4114, 67973, -160389, 86351, -8947, 13772, 8224, 3480, 2626, 24337, 1870, - 1423, -4704, -17415, 86351, -198772, 68001, 7361, 14025, 11152, 23137, 12598, 9972, - 1222, 1138, 32246, -8947, 68001, -166130, 57911, 17629, 118765, 39472, 1806, 7267, - -767, -584, -7121, 13772, 7361, 57911, -123203, 2059, 47920, 59494, 10484, -5066, - -3923, 10709, 16051, 8224, 14025, 17629, 2059, -90332, -367027, -30259, -20438, -3054, - -65513, 104184, -2994, 3480, 11152, 118765, 47920, -367027, -16854832, -181537, 903929, -95027, - -5992, 6118, -52989, 2626, 23137, 39472, 59494, -30259, -181537, -320917, -11497, 56536, - 9965, -30358, 23547, 24337, 12598, 1806, 10484, -20438, 903929, -11497, -197437, -16106, - 3853, -5240, 27770, 1870, 9972, 7267, -5066, -3054, -95027, 56536, -16106, -107942, - -14599, -2426, -4488, 2252, 20, -696, -2636, 5531, 1097, 109, 1359, 2742, - -2426, -22977, 1326, -4413, -6555, 199, -2249, 16239, 6914, -6267, 1335, -319, - -4488, 1326, -38846, 40605, -16372, -138, 6341, 2358, -5859, 1498, -1344, -3917, - 2252, -4413, 40605, -94592, 69176, -3799, -16812, -5416, -11189, -3107, 2060, -3508, - 20, -6555, -16372, 69176, -121278, 55283, 86, 3716, 11782, -9657, 3416, 549, - -696, 199, -138, -3799, 55283, -105539, 62225, 5299, 3619, 1933, -2511, 609, - -2636, -2249, 6341, -16812, 86, 62225, -79693, -7236, -9729, -2907, 2795, 57, - 5531, 16239, 2358, -5416, 3716, 5299, -7236, -52597, -40766, -5195, 2995, 11158, - 1097, 6914, -5859, -11189, 11782, 3619, -9729, -40766, -95884, 18462, 2795, -18509, - 109, -6267, 1498, -3107, -9657, 1933, -2907, -5195, 18462, -29138, 3027, 17268, - 1359, 1335, -1344, 2060, 3416, -2511, 2795, 2995, 2795, 3027, -10878, -6828, - 2742, -319, -3917, -3508, 549, 609, 57, 11158, -18509, 17268, -6828, -48324, - -9462, 2969, -1087, -1924, 1418, -350, 396, -3124, -35326, 682, 3248, 5848, - 2969, -29148, -2662, 2400, -3059, 2772, 847, 8375, 60040, -6778, -23223, -7694, - -1087, -2662, -172602, 83798, 2597, 33012, 3851, 12397, 81998, -81017, 15831, 35467, - -1924, 2400, 83798, -204141, 66003, 2928, 18028, 14706, 8557, 16030, 44283, 36177, - 1418, -3059, 2597, 66003, -202589, 47215, 19493, 10544, -4664, 46480, 10895, 18165, - -350, 2772, 33012, 2928, 47215, -198011, 76335, 14223, 123301, 70945, 1870, 8265, - 396, 847, 3851, 18028, 19493, 76335, -177594, -5345, 78880, 114804, -171, 3539, - -3124, 8375, 12397, 14706, 10544, 14223, -5345, -67596, -251454, -55035, -21890, 7263, - -35326, 60040, 81998, 8557, -4664, 123301, 78880, -251454, -12784658, -217014, 810245, -725111, - 682, -6778, -81017, 16030, 46480, 70945, 114804, -55035, -217014, -793758, -8106, 74886, - 3248, -23223, 15831, 44283, 10895, 1870, -171, -21890, 810245, -8106, -319630, -77833, - 5848, -7694, 35467, 36177, 18165, 8265, 3539, 7263, -725111, 74886, -77832, -481222 + -7878, -673, -2037, -885, -236, -667, 749, -1726, -20424, -859, 2463, 4011, + -673, -31356, -1591, -3048, -1872, 1277, -3806, 8836, 5555, -2031, -11076, -7329, + -2037, -1591, -65556, 42935, -11408, 12166, 751, 8792, 24077, -15804, -2546, -2517, + -885, -3048, 42935, -88483, 42957, -13081, 4776, 14411, 23734, -5735, 15306, 15210, + -236, -1872, -11408, 42957, -90738, 37950, -1795, 4021, -35266, 12445, 13655, 17403, + -667, 1277, 12166, -13081, 37950, -86289, 37943, 3429, -5655, 5664, 8658, -11, + 749, -3806, 751, 4776, -1795, 37943, -77863, -8515, -74265, 22313, 3842, 645, + -1726, 8836, 8792, 14411, 4021, 3429, -8515, -59311, -121235, 1622, -8500, 4967, + -20424, 5555, 24077, 23734, -35266, -5655, -74265, -121235, -5534279, 175865, 247781, -296138, + -859, -2031, -15804, -5735, 12445, 5664, 22313, 1622, 175865, -104343, -1168, 32220, + 2463, -11076, -2546, 15306, 13655, 8658, 3842, -8500, 247781, -1168, -79522, -45571, + 4011, -7329, -2517, 15210, 17403, -11, 645, 4967, -296138, 32220, -45571, -249005, + -10115, 613, -4406, -403, 731, 898, 350, -1995, -8975, -169, -1296, 1233, + 613, -30663, -12425, -1115, -1862, 2906, -2485, 12887, -8842, -12067, 4833, 3070, + -4406, -12425, -86550, 49625, -11519, 15386, -20054, 20873, -13684, 28341, 23152, -807, + -403, -1115, 49625, -131210, 81002, 1045, 3085, 8149, -11887, -3094, 43855, 14533, + 731, -1862, -11519, 81002, -226160, 115669, 9052, -6427, -19605, -20406, 7481, 6064, + 898, 2906, 15386, 1045, 115669, -281745, 150559, -5530, 271, -5717, 1673, 7674, + 350, -2485, -20054, 3085, 9052, 150559, -200735, -21872, -9366, 10471, -2190, 3083, + -1995, 12887, 20873, 8149, -6427, -5530, -21872, -111299, -29613, -27611, -54741, -9432, + -8975, -8842, -13684, -11887, -19605, 271, -9366, -29613, -616730, 74872, 189453, -79618, + -169, -12067, 28341, -3094, -20406, -5717, 10471, -27611, 74872, -359342, -12919, 29609, + -1296, 4833, 23152, 43855, 7481, 1673, -2190, -54741, 189453, -12919, -407670, -16961, + 1233, 3070, -807, 14533, 6064, 7674, 3083, -9432, -79618, 29609, -16961, -180700, + -12411, 5539, -1902, 92, 2813, 339, -114, -1078, -24097, -2938, -1812, 399, + 5539, -36224, -7229, -766, -2442, 2066, -2896, 8507, 16429, -11423, -12067, -191, + -1902, -7230, -115426, 44336, 11635, 13946, -3573, 22728, -73099, 119214, 70165, 4686, + 92, -766, 44336, -187908, 81624, 24838, 12765, 1471, -43322, -24066, 44669, 3543, + 2813, -2442, 11635, 81624, -295220, 104190, 52986, -3246, -146322, -78690, 34365, -2814, + 339, 2066, 13946, 24838, 104190, -347659, 169287, -4458, -127093, -94499, 42989, 5700, + -114, -2896, -3573, 12765, 52986, 169287, -310084, -18605, -27182, -19113, -2714, 11, + -1078, 8507, 22728, 1471, -3246, -4458, -18605, -69283, 40578, -47905, -135760, -6645, + -24097, 16429, -73099, -43322, -146322, -127093, -27182, 40578, -8241631, -71531, 1853193, -175523, + -2938, -11423, 119214, -24066, -78690, -94499, -19113, -47905, -71531, -1361618, -36609, 26675, + -1812, -12067, 70165, 44669, 34365, 42989, -2714, -135760, 1853193, -36609, -1337597, -83909, + 399, -191, 4686, 3543, -2814, 5700, 11, -6645, -175523, 26675, -83909, -223653, + -8809, 3326, -1275, -1509, 1423, 1222, -767, -3923, -65513, -5992, 9965, 3853, + 3326, -31906, -1905, 4114, -4704, 1138, -584, 10709, 104184, 6118, -30358, -5240, + -1275, -1905, -184413, 67973, -17415, 32246, -7121, 16051, -2994, -52989, 23547, 27770, + -1509, 4114, 67973, -160389, 86351, -8947, 13772, 8224, 3480, 2626, 24337, 1870, + 1423, -4704, -17415, 86351, -198772, 68001, 7361, 14025, 11152, 23137, 12598, 9972, + 1222, 1138, 32246, -8947, 68001, -166130, 57911, 17629, 118765, 39472, 1806, 7267, + -767, -584, -7121, 13772, 7361, 57911, -123203, 2059, 47920, 59494, 10484, -5066, + -3923, 10709, 16051, 8224, 14025, 17629, 2059, -90332, -367027, -30259, -20438, -3054, + -65513, 104184, -2994, 3480, 11152, 118765, 47920, -367027, -16854832, -181537, 903929, -95027, + -5992, 6118, -52989, 2626, 23137, 39472, 59494, -30259, -181537, -320917, -11497, 56536, + 9965, -30358, 23547, 24337, 12598, 1806, 10484, -20438, 903929, -11497, -197437, -16106, + 3853, -5240, 27770, 1870, 9972, 7267, -5066, -3054, -95027, 56536, -16106, -107942, + -14599, -2426, -4488, 2252, 20, -696, -2636, 5531, 1097, 109, 1359, 2742, + -2426, -22977, 1326, -4413, -6555, 199, -2249, 16239, 6914, -6267, 1335, -319, + -4488, 1326, -38846, 40605, -16372, -138, 6341, 2358, -5859, 1498, -1344, -3917, + 2252, -4413, 40605, -94592, 69176, -3799, -16812, -5416, -11189, -3107, 2060, -3508, + 20, -6555, -16372, 69176, -121278, 55283, 86, 3716, 11782, -9657, 3416, 549, + -696, 199, -138, -3799, 55283, -105539, 62225, 5299, 3619, 1933, -2511, 609, + -2636, -2249, 6341, -16812, 86, 62225, -79693, -7236, -9729, -2907, 2795, 57, + 5531, 16239, 2358, -5416, 3716, 5299, -7236, -52597, -40766, -5195, 2995, 11158, + 1097, 6914, -5859, -11189, 11782, 3619, -9729, -40766, -95884, 18462, 2795, -18509, + 109, -6267, 1498, -3107, -9657, 1933, -2907, -5195, 18462, -29138, 3027, 17268, + 1359, 1335, -1344, 2060, 3416, -2511, 2795, 2995, 2795, 3027, -10878, -6828, + 2742, -319, -3917, -3508, 549, 609, 57, 11158, -18509, 17268, -6828, -48324, + -9462, 2969, -1087, -1924, 1418, -350, 396, -3124, -35326, 682, 3248, 5848, + 2969, -29148, -2662, 2400, -3059, 2772, 847, 8375, 60040, -6778, -23223, -7694, + -1087, -2662, -172602, 83798, 2597, 33012, 3851, 12397, 81998, -81017, 15831, 35467, + -1924, 2400, 83798, -204141, 66003, 2928, 18028, 14706, 8557, 16030, 44283, 36177, + 1418, -3059, 2597, 66003, -202589, 47215, 19493, 10544, -4664, 46480, 10895, 18165, + -350, 2772, 33012, 2928, 47215, -198011, 76335, 14223, 123301, 70945, 1870, 8265, + 396, 847, 3851, 18028, 19493, 76335, -177594, -5345, 78880, 114804, -171, 3539, + -3124, 8375, 12397, 14706, 10544, 14223, -5345, -67596, -251454, -55035, -21890, 7263, + -35326, 60040, 81998, 8557, -4664, 123301, 78880, -251454, -12784658, -217014, 810245, -725111, + 682, -6778, -81017, 16030, 46480, 70945, 114804, -55035, -217014, -793758, -8106, 74886, + 3248, -23223, 15831, 44283, 10895, 1870, -171, -21890, 810245, -8106, -319630, -77833, + 5848, -7694, 35467, 36177, 18165, 8265, 3539, 7263, -725111, 74886, -77832, -481222 }; const Word32 lvm_music_fx[N_MIXTURES] = { /*Q10*/ - 28603, 31076, 35357, 31989, 20938, 34395 + 28603, 31076, 35357, 31989, 20938, 34395 }; const Word16 m_noise_fx[N_MIXTURES*N_FEATURES] = { /*Q15*/ - 14825, 18681, 7930, 11230, 13228, 13602, 14556, 14377, 1133, 29263, 26842, 13270, - 14312, 14992, 9378, 12891, 14075, 14581, 15548, 12386, 1050, 32143, 28322, 12379, - 18179, 16617, 8015, 13153, 13932, 14462, 15329, 11848, 1033, 31841, 28406, 12222, - 15822, 17883, 3231, 8086, 9983, 9933, 11537, 11904, 1018, 29549, 27473, 11111, - 13821, 16109, 8734, 12035, 13351, 13603, 15024, 12957, 1163, 31179, 28243, 11865, - 13845, 15577, 10545, 14292, 15353, 15784, 16567, 12750, 1589, 31695, 28796, 13420 + 14825, 18681, 7930, 11230, 13228, 13602, 14556, 14377, 1133, 29263, 26842, 13270, + 14312, 14992, 9378, 12891, 14075, 14581, 15548, 12386, 1050, 32143, 28322, 12379, + 18179, 16617, 8015, 13153, 13932, 14462, 15329, 11848, 1033, 31841, 28406, 12222, + 15822, 17883, 3231, 8086, 9983, 9933, 11537, 11904, 1018, 29549, 27473, 11111, + 13821, 16109, 8734, 12035, 13351, 13603, 15024, 12957, 1163, 31179, 28243, 11865, + 13845, 15577, 10545, 14292, 15353, 15784, 16567, 12750, 1589, 31695, 28796, 13420 }; const Word32 invV_noise_fx[N_MIXTURES*N_FEATURES*N_FEATURES] = { /*Q10*/ - -11129, -775, -807, 4750, -4310, -1632, 1694, 530, -25134, -2399, 1632, 1938, - -775, -43700, -5296, -23144, -4086, -2008, 9445, 12956, 17119, 10623, -18169, -14373, - -807, -5296, -117924, 78859, -23526, 22681, -7637, 52382, 20661, -1131, 18004, -18669, - 4750, -23144, 78859, -165973, 70704, -954, 10160, 6713, 50481, 19307, -10190, 16924, - -4310, -4086, -23526, 70704, -186160, 114906, -28994, 9999, 17677, -18372, -20805, -12577, - -1632, -2008, 22681, -954, 114906, -235840, 123708, -3753, 21616, 9200, 15641, -10616, - 1694, 9445, -7637, 10160, -28994, 123708, -156081, -1564, -7627, 5159, 14184, -12573, - 530, 12956, 52382, 6713, 9999, -3753, -1564, -116541, -130257, -2892, -51260, -1433, - -25134, 17119, 20661, 50481, 17677, 21616, -7627, -130257, -6857531, -23164, 425725, -172307, - -2399, 10623, -1131, 19307, -18372, 9200, 5159, -2892, -23164, -157605, 9307, 20639, - 1632, -18169, 18004, -10190, -20805, 15641, 14184, -51260, 425725, 9307, -184817, -2232, - 1938, -14373, -18669, 16924, -12577, -10616, -12573, -1433, -172307, 20639, -2232, -94498, - -23585, -1283, 2220, 5814, -1063, -5524, 5040, -408, -7744, 65700, -4948, 1221, - -1283, -102238, 18435, -18156, -6216, 17104, -1870, 25097, 97427, 32242, -77595, -4567, - 2220, 18435, -305438, 139861, 24123, 32851, -45614, 45538, 124040, 301172, -22649, 3625, - 5814, -18156, 139861, -565373, 242575, 46852, 50718, -18774, -159188, 141029, 89911, 9768, - -1063, -6216, 24123, 242575, -798475, 256535, 104095, 9375, -84525, -408528, 98204, 4495, - -5524, 17104, 32851, 46852, 256535, -845586, 312678, -6990, 50242, -543393, -42629, 99, - 5040, -1870, -45614, 50718, 104095, 312678, -732093, 14409, 83177, -140864, -2169, -2321, - -408, 25097, 45538, -18774, 9375, -6990, 14409, -314037, 273543, -30059, -253352, -3462, - -7744, 97427, 124040, -159188, -84525, 50242, 83177, 273543, -19301626, -952154, 3668367, -93870, - 65700, 32242, 301172, 141029, -408528, -543393, -140864, -30059, -952154, -16033274, -164405, -24189, - -4948, -77595, -22649, 89911, 98204, -42629, -2169, -253352, 3668367, -164405, -2501887, -105127, - 1221, -4567, 3625, 9768, 4495, 99, -2321, -3462, -93870, -24189, -105127, -252171, - -11556, 5444, 1053, 1823, -1754, -6509, 3535, -483, 5751, 22898, -4369, 2503, - 5444, -61418, -46603, 523, -4221, 5377, -14703, 2336, 4414, 4601, 17795, 5358, - 1053, -46603, -197022, 61944, 30015, 11139, -14163, 4583, 14704, 174734, 105587, 3797, - 1823, 523, 61944, -579713, 310766, -24876, -8601, -1522, -38055, -308764, 10254, 11526, - -1754, -4221, 30015, 310766, -873205, 294102, 7806, 2338, -28081, -507955, -5526, -1671, - -6509, 5377, 11139, -24876, 294102, -740664, 309186, -19342, -50840, -143800, 27527, 4324, - 3535, -14703, -14163, -8601, 7806, 309186, -508227, 24986, 208442, -230010, -48336, -9651, - -483, 2336, 4583, -1522, 2338, -19342, 24986, -362502, 140055, -118693, -134546, 982, - 5751, 4414, 14704, -38055, -28081, -50840, 208442, 140055, -20820834, -328791, 3081671, -99923, - 22898, 4601, 174734, -308764, -507955, -143800, -230010, -118693, -328791, -7236926, -225976, -47887, - -4369, 17795, 105587, 10254, -5526, 27527, -48336, -134546, 3081671, -225976, -2500626, -124929, - 2503, 5358, 3797, 11526, -1671, 4324, -9651, 982, -99923, -47887, -124929, -277469, - -14533, 3263, -8141, 13301, 5586, 1808, -5289, 472, 7371, -21379, -2460, 596, - 3263, -46002, -56596, 9198, -765, 13994, 5247, 2629, -14758, -21574, 5644, 3817, - -8141, -56596, -895669, 406276, -247505, 72418, -246462, 32532, -190899, -74267, 59747, 10271, - 13301, 9198, 406276, -551172, 137309, 34772, -5367, 41269, 67372, 262339, 42457, 60892, - 5586, -765, -247505, 137309, -964866, 393695, 36960, 5148, 114354, 66434, -19640, 18501, - 1808, 13994, 72418, 34772, 393695, -906317, 366933, 14058, 76374, 284422, 16253, 32973, - -5289, 5247, -246462, -5367, 36960, 366933, -711303, 23465, 84856, 157990, 2319, 21580, - 472, 2629, 32532, 41269, 5148, 14058, 23465, -349612, -74011, -89655, -17686, 7616, - 7371, -14758, -190899, 67372, 114354, 76374, 84856, -74011, -17027780, -264311, 396822, -266476, - -21379, -21574, -74267, 262339, 66434, 284422, 157990, -89655, -264311, -871539, 3553, 2308, - -2460, 5644, 59747, 42457, -19640, 16253, 2319, -17686, 396822, 3553, -334956, -46272, - 596, 3817, 10271, 60892, 18501, 32973, 21580, 7616, -266476, 2308, -46272, -357254, - -21040, -1263, -6696, 8169, -1272, -4427, 4142, -8459, -63196, -17218, 710, 2270, - -1263, -83196, -34319, -27267, 2213, -240, -783, 22287, 136898, 9589, -27942, -6781, - -6696, -34319, -329281, 107754, 677, -33332, -46218, 43055, -204958, -43031, 204918, 20438, - 8169, -27267, 107754, -371373, 103141, 10674, 46337, -3299, -65216, -42038, -5280, 13005, - -1272, 2213, 677, 103141, -420124, 194457, 1575, 22157, -26994, 36729, 47504, 13852, - -4427, -240, -33332, 10674, 194457, -368592, 152851, 14172, 107043, 44274, -23917, -8922, - 4142, -783, -46218, 46337, 1575, 152851, -280668, -8210, 40158, 24389, 13385, 8410, - -8459, 22287, 43055, -3299, 22157, 14172, -8210, -256064, 79772, -1255, -101174, 759, - -63196, 136898, -204958, -65216, -26994, 107043, 40158, 79772, -13100212, 263557, 2000831, -242675, - -17218, 9589, -43031, -42038, 36729, 44274, 24389, -1255, 263557, -1223057, -216580, -23199, - 710, -27942, 204918, -5280, 47504, -23917, 13385, -101174, 2000831, -216580, -1303910, -90175, - 2270, -6781, 20438, 13005, 13852, -8922, 8410, 759, -242675, -23199, -90175, -372746, - -24335, -321, -1426, 1524, 1959, -4164, 7012, -3148, -7859, 9391, 3193, 2194, - -321, -90890, -9068, -27277, 5303, 10922, 2298, 22512, 17201, 4798, 13388, -2773, - -1426, -9068, -180137, 85478, 42242, 14714, -12908, 34197, 67246, 40663, 36965, -9792, - 1524, -27277, 85478, -392290, 221884, 12492, 33161, -14359, 7950, -103145, -29210, -5361, - 1959, 5303, 42242, 221884, -600963, 259592, 30301, 7895, -32577, -115360, 20766, -7273, - -4164, 10922, 14714, 12492, 259592, -611459, 304095, 6323, -42968, -37072, -21092, -15235, - 7012, 2298, -12908, 33161, 30301, 304095, -467758, 26953, -35709, 29107, 35819, -8754, - -3148, 22512, 34197, -14359, 7895, 6323, 26953, -271919, 2988, 852, -128460, -11407, - -7859, 17201, 67246, 7950, -32577, -42968, -35709, 2988, -1773460, -215853, 756954, -99883, - 9391, 4798, 40663, -103145, -115360, -37072, 29107, 852, -215853, -2382074, -108833, 1061, - 3193, 13388, 36965, -29210, 20766, -21092, 35819, -128460, 756954, -108833, -1923617, -116204, - 2194, -2773, -9792, -5361, -7273, -15235, -8754, -11407, -99883, 1061, -116204, -103840 + -11129, -775, -807, 4750, -4310, -1632, 1694, 530, -25134, -2399, 1632, 1938, + -775, -43700, -5296, -23144, -4086, -2008, 9445, 12956, 17119, 10623, -18169, -14373, + -807, -5296, -117924, 78859, -23526, 22681, -7637, 52382, 20661, -1131, 18004, -18669, + 4750, -23144, 78859, -165973, 70704, -954, 10160, 6713, 50481, 19307, -10190, 16924, + -4310, -4086, -23526, 70704, -186160, 114906, -28994, 9999, 17677, -18372, -20805, -12577, + -1632, -2008, 22681, -954, 114906, -235840, 123708, -3753, 21616, 9200, 15641, -10616, + 1694, 9445, -7637, 10160, -28994, 123708, -156081, -1564, -7627, 5159, 14184, -12573, + 530, 12956, 52382, 6713, 9999, -3753, -1564, -116541, -130257, -2892, -51260, -1433, + -25134, 17119, 20661, 50481, 17677, 21616, -7627, -130257, -6857531, -23164, 425725, -172307, + -2399, 10623, -1131, 19307, -18372, 9200, 5159, -2892, -23164, -157605, 9307, 20639, + 1632, -18169, 18004, -10190, -20805, 15641, 14184, -51260, 425725, 9307, -184817, -2232, + 1938, -14373, -18669, 16924, -12577, -10616, -12573, -1433, -172307, 20639, -2232, -94498, + -23585, -1283, 2220, 5814, -1063, -5524, 5040, -408, -7744, 65700, -4948, 1221, + -1283, -102238, 18435, -18156, -6216, 17104, -1870, 25097, 97427, 32242, -77595, -4567, + 2220, 18435, -305438, 139861, 24123, 32851, -45614, 45538, 124040, 301172, -22649, 3625, + 5814, -18156, 139861, -565373, 242575, 46852, 50718, -18774, -159188, 141029, 89911, 9768, + -1063, -6216, 24123, 242575, -798475, 256535, 104095, 9375, -84525, -408528, 98204, 4495, + -5524, 17104, 32851, 46852, 256535, -845586, 312678, -6990, 50242, -543393, -42629, 99, + 5040, -1870, -45614, 50718, 104095, 312678, -732093, 14409, 83177, -140864, -2169, -2321, + -408, 25097, 45538, -18774, 9375, -6990, 14409, -314037, 273543, -30059, -253352, -3462, + -7744, 97427, 124040, -159188, -84525, 50242, 83177, 273543, -19301626, -952154, 3668367, -93870, + 65700, 32242, 301172, 141029, -408528, -543393, -140864, -30059, -952154, -16033274, -164405, -24189, + -4948, -77595, -22649, 89911, 98204, -42629, -2169, -253352, 3668367, -164405, -2501887, -105127, + 1221, -4567, 3625, 9768, 4495, 99, -2321, -3462, -93870, -24189, -105127, -252171, + -11556, 5444, 1053, 1823, -1754, -6509, 3535, -483, 5751, 22898, -4369, 2503, + 5444, -61418, -46603, 523, -4221, 5377, -14703, 2336, 4414, 4601, 17795, 5358, + 1053, -46603, -197022, 61944, 30015, 11139, -14163, 4583, 14704, 174734, 105587, 3797, + 1823, 523, 61944, -579713, 310766, -24876, -8601, -1522, -38055, -308764, 10254, 11526, + -1754, -4221, 30015, 310766, -873205, 294102, 7806, 2338, -28081, -507955, -5526, -1671, + -6509, 5377, 11139, -24876, 294102, -740664, 309186, -19342, -50840, -143800, 27527, 4324, + 3535, -14703, -14163, -8601, 7806, 309186, -508227, 24986, 208442, -230010, -48336, -9651, + -483, 2336, 4583, -1522, 2338, -19342, 24986, -362502, 140055, -118693, -134546, 982, + 5751, 4414, 14704, -38055, -28081, -50840, 208442, 140055, -20820834, -328791, 3081671, -99923, + 22898, 4601, 174734, -308764, -507955, -143800, -230010, -118693, -328791, -7236926, -225976, -47887, + -4369, 17795, 105587, 10254, -5526, 27527, -48336, -134546, 3081671, -225976, -2500626, -124929, + 2503, 5358, 3797, 11526, -1671, 4324, -9651, 982, -99923, -47887, -124929, -277469, + -14533, 3263, -8141, 13301, 5586, 1808, -5289, 472, 7371, -21379, -2460, 596, + 3263, -46002, -56596, 9198, -765, 13994, 5247, 2629, -14758, -21574, 5644, 3817, + -8141, -56596, -895669, 406276, -247505, 72418, -246462, 32532, -190899, -74267, 59747, 10271, + 13301, 9198, 406276, -551172, 137309, 34772, -5367, 41269, 67372, 262339, 42457, 60892, + 5586, -765, -247505, 137309, -964866, 393695, 36960, 5148, 114354, 66434, -19640, 18501, + 1808, 13994, 72418, 34772, 393695, -906317, 366933, 14058, 76374, 284422, 16253, 32973, + -5289, 5247, -246462, -5367, 36960, 366933, -711303, 23465, 84856, 157990, 2319, 21580, + 472, 2629, 32532, 41269, 5148, 14058, 23465, -349612, -74011, -89655, -17686, 7616, + 7371, -14758, -190899, 67372, 114354, 76374, 84856, -74011, -17027780, -264311, 396822, -266476, + -21379, -21574, -74267, 262339, 66434, 284422, 157990, -89655, -264311, -871539, 3553, 2308, + -2460, 5644, 59747, 42457, -19640, 16253, 2319, -17686, 396822, 3553, -334956, -46272, + 596, 3817, 10271, 60892, 18501, 32973, 21580, 7616, -266476, 2308, -46272, -357254, + -21040, -1263, -6696, 8169, -1272, -4427, 4142, -8459, -63196, -17218, 710, 2270, + -1263, -83196, -34319, -27267, 2213, -240, -783, 22287, 136898, 9589, -27942, -6781, + -6696, -34319, -329281, 107754, 677, -33332, -46218, 43055, -204958, -43031, 204918, 20438, + 8169, -27267, 107754, -371373, 103141, 10674, 46337, -3299, -65216, -42038, -5280, 13005, + -1272, 2213, 677, 103141, -420124, 194457, 1575, 22157, -26994, 36729, 47504, 13852, + -4427, -240, -33332, 10674, 194457, -368592, 152851, 14172, 107043, 44274, -23917, -8922, + 4142, -783, -46218, 46337, 1575, 152851, -280668, -8210, 40158, 24389, 13385, 8410, + -8459, 22287, 43055, -3299, 22157, 14172, -8210, -256064, 79772, -1255, -101174, 759, + -63196, 136898, -204958, -65216, -26994, 107043, 40158, 79772, -13100212, 263557, 2000831, -242675, + -17218, 9589, -43031, -42038, 36729, 44274, 24389, -1255, 263557, -1223057, -216580, -23199, + 710, -27942, 204918, -5280, 47504, -23917, 13385, -101174, 2000831, -216580, -1303910, -90175, + 2270, -6781, 20438, 13005, 13852, -8922, 8410, 759, -242675, -23199, -90175, -372746, + -24335, -321, -1426, 1524, 1959, -4164, 7012, -3148, -7859, 9391, 3193, 2194, + -321, -90890, -9068, -27277, 5303, 10922, 2298, 22512, 17201, 4798, 13388, -2773, + -1426, -9068, -180137, 85478, 42242, 14714, -12908, 34197, 67246, 40663, 36965, -9792, + 1524, -27277, 85478, -392290, 221884, 12492, 33161, -14359, 7950, -103145, -29210, -5361, + 1959, 5303, 42242, 221884, -600963, 259592, 30301, 7895, -32577, -115360, 20766, -7273, + -4164, 10922, 14714, 12492, 259592, -611459, 304095, 6323, -42968, -37072, -21092, -15235, + 7012, 2298, -12908, 33161, 30301, 304095, -467758, 26953, -35709, 29107, 35819, -8754, + -3148, 22512, 34197, -14359, 7895, 6323, 26953, -271919, 2988, 852, -128460, -11407, + -7859, 17201, 67246, 7950, -32577, -42968, -35709, 2988, -1773460, -215853, 756954, -99883, + 9391, 4798, 40663, -103145, -115360, -37072, 29107, 852, -215853, -2382074, -108833, 1061, + 3193, 13388, 36965, -29210, 20766, -21092, 35819, -128460, 756954, -108833, -1923617, -116204, + 2194, -2773, -9792, -5361, -7273, -15235, -8754, -11407, -99883, 1061, -116204, -103840 }; const Word32 lvm_noise_fx[N_MIXTURES] = { /*Q10*/ - 29413, 42169, 40240, 39433, 37918, 36348 + 29413, 42169, 40240, 39433, 37918, 36348 }; /* Mel filterbank */ const Word16 mel_fb_start[NB_MEL_BANDS] = { 1, 1, 2, 3, 4, 5, 5, 7, 8, 9, 10, 11, 13, 14, 16, 17, 19, 21, 23, 25, 28, 30, 33, 35, 38, 41, 45, 48, 52, 56, 60, 65, 69, 74, 80, 86, 92, 98, 105, 112 -}; // Q0 +}; // Q0 const Word16 mel_fb_len[NB_MEL_BANDS] = { 1, 2, 2, 2, 1, 2, 3, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 11, 12, 12, 12, 13, 14, 15, 16 -}; // Q0 +}; // Q0 const Word32 mel_fb_fx[246] = { 1306887040, 840596608, 701826176, 1445657472, 297866656, 1849617024, 67613584, 2079870080, @@ -855,7 +855,7 @@ const Word32 mel_fb_fx[246] = 1556051584, 1278092800, 1002327744, 728722176, 457242624, 187856208, 28791110, 311244128, 591432000, 869390912, 1145155968, 1418761472, 1690241024, 1959627392, 2068014592, 1802719104, 1539422848, 1278095872, 1018709056, 761233728, 505641920, 251906256, -}; // Q30 +}; // Q30 const Word32 dct_mtx_fx[NB_MEL_BANDS * NB_MEL_COEF] = { //Q31 479821728, 476863456, 470965184, 462163232, 450511904, 436083040, 418965536, 399264992, @@ -977,56 +977,56 @@ const Word16 huffnorm_e[32] = 1062, 550, 314, 274, 273, 272, 156, 79, 69, 38, 18, 40, 5, 3, 0, 1, 3, 4, 11, 21, 41, 32, 35, 67, 133, 264, 530, 315, 551, 2126, 4254, 4255 -}; // Q0 +}; // Q0 const Word16 huffnorm_n[32] = { 14831, 14830, 7414, 3706, 593, 927, 462, 297, 230, 116, 50, 36, 13, 8, 5, 1, 0, 2, 6, 7, 15, 19, 24, 56, 59, 51, 114, 117, 75, 149, 592, 1852 -}; // Q0 +}; // Q0 const Word16 huffsizn_e[32] = { 13, 12, 11, 11, 11, 11, 10, 9, 9, 8, 7, 6, 5, 4, 3, 2, 2, 3, 4, 5, 6, 8, 8, 9, 10, 11, 12, 11, 12, 14, 15, 15 -}; // Q0 +}; // Q0 const Word16 huffsizn_n[32] = { 14, 14, 13, 12, 10, 10, 9, 9, 8, 7, 7, 6, 5, 4, 3, 3, 3, 3, 3, 4, 4, 5, 6, 6, 6, 7, 7, 7, 7, 8, 10, 11 -}; // Q0 +}; // Q0 const Word16 resize_huffnorm[32] = { 0, 0, 0, 0, 0, 1023, 511, 255, 127, 63, 31, 15, 7, 3, 1, 0, 2, 5, 11, 23, 47, 95, 191, 383, 767, 2047, 0, 0, 0, 0, 0, 0 -}; // Q0 +}; // Q0 const Word16 huffnorm[32] = { 26, 58, 90, 122, 27, 59, 91, 123, 12, 28, 44, 60, 2, 6, 4, 6, 0, 2, 10, 14, 14, 30, 46, 62, 30, 62, 94, 126, 31, 63, 95, 127 -}; // Q0 +}; // Q0 const Word16 pgain_huffnorm[32] = { 1, 1, 2, 3, 3, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 4, 5, 3, 2, 3, 3, 4, 5, 0, 1 -}; // Q0 +}; // Q0 const Word16 hessize[8]= { 7, 5, 3, 2, 1, 4, 6, 7 -}; // Q0 +}; // Q0 const Word16 hescode[8]= { 11, 3, 1, 1, 1, 0, 4, 10 -}; // Q0 +}; // Q0 /*----------------------------------------------------------------------------------* * BWD @@ -1053,15 +1053,15 @@ const Word16 hann_window_320_fx[BWD_TOTAL_WIDTH / 2] = 7761, 7796, 7830, 7863, 7894, 7923, 7951, 7978, 8003, 8026, 8048, 8068, 8087, 8105, 8121, 8135, 8147, 8158, 8168, 8176, 8182, 8187, 8190, 8192 -}; // Q13 +}; // Q13 /*----------------------------------------------------------------------------------* * Starting line for the noise measurement in TCX. *----------------------------------------------------------------------------------*/ -const Word16 startLineWB[N_TCX_STARTLINE_NOISE_WB] = { 8, 23, 36, 45, 66, 128 /* 13.2kbps */, 200, 320, 320, 320 /* 48kbps */, 320 }; // Q0 +const Word16 startLineWB[N_TCX_STARTLINE_NOISE_WB] = { 8, 23, 36, 45, 66, 128 /* 13.2kbps */, 200, 320, 320, 320 /* 48kbps */, 320 }; // Q0 -const Word16 startLineSWB[N_TCX_STARTLINE_NOISE_SWB] = { 8, 44, 96 /* 13.2kbps */, 160, 320, 320, 256 /* 48kbps */, 341, 640 }; // Q0 +const Word16 startLineSWB[N_TCX_STARTLINE_NOISE_SWB] = { 8, 44, 96 /* 13.2kbps */, 160, 320, 320, 256 /* 48kbps */, 341, 640 }; // Q0 const Word32 LS_MIN_SILENCE_SNR[4] = { 251658233/* 7.5 Q25 */, 251658233/* 7.5 Q25 */, 228170137/* 6.8 Q25 */,228170137/* 6.8 Q25 */ }; @@ -1081,7 +1081,7 @@ const UWord8 E_ROM_tipos[40] = 3, 0, 1, 2, 0, 1, 2, 3, /* end point for 24 pulses &ipos[35], 4th iter */ 1, 2, 3, 0 /* end point for 36 pulses &ipos[39], 2nd iter */ -}; // Q0 +}; // Q0 /* pow(3 * i + 1, 0.3) / pow(256 - 1, 0.3) */ const Word16 Weight[86] = @@ -1094,7 +1094,7 @@ const Word16 Weight[86] = 0x7D61, 0x7DDA, 0x7E51, 0x7EC8, 0x7F3E, 0x7FB3, 0x7FFF }; -const Word16 BAND_SCALE_AJ[5] = { 3,3,5,6,6 }; /* {OFFSET, NB, WB, SWB, FB} Q0*/ +const Word16 BAND_SCALE_AJ[5] = { 3,3,5,6,6 }; /* {OFFSET, NB, WB, SWB, FB} Q0*/ /* Inv possible delta used in gaus_enc (1.0/(1.0+delta*delta)) and delta = [1,7] */ const Word16 inv_delta_tab[7] = /*Q15*/ diff --git a/lib_enc/rst_enc_fx.c b/lib_enc/rst_enc_fx.c index d519bc12f9db4e464b977c66e13b329713fb216e..38b8e5ff29966b43c61531758a39f470886ffce4 100644 --- a/lib_enc/rst_enc_fx.c +++ b/lib_enc/rst_enc_fx.c @@ -1,16 +1,15 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ -#include "rom_com.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stl.h" + /*-------------------------------------------------------------------* * CNG_reset_enc() * @@ -43,7 +42,6 @@ void CNG_reset_enc_fx( set16_fx( hLPDmem->dm_fx.prev_gain_pit, 0, 6 ); hLPDmem->dm_fx.prev_gain_code = L_deposit_l( 0 ); hLPDmem->dm_fx.prev_state = 0; - // PMTE() move16(); /* last good received frame for FEC in ACELP */ @@ -53,11 +51,11 @@ void CNG_reset_enc_fx( /* reset the pitch buffer in case of FRAME_NO_DATA or SID frames */ IF( EQ_16( st_fx->L_frame, L_FRAME ) ) { - set16_fx( pitch_buf, L_SUBFR, NB_SUBFR ); + set16_fx( pitch_buf, L_SUBFR << 6, NB_SUBFR ); } ELSE /* st->L_frame == L_FRAME16k */ { - set16_fx( pitch_buf, L_SUBFR16k, NB_SUBFR16k ); + set16_fx( pitch_buf, L_SUBFR16k << 6, NB_SUBFR16k ); } set16_fx( voice_factors, 1, NB_SUBFR16k ); diff --git a/lib_enc/scale_enc_fx.c b/lib_enc/scale_enc_fx.c index 76eae22b7b1f21cc40f7593b1cf4e5fcff81da16..c7420e8ba57a92c6de77e382d28b6e4059eedbe1 100644 --- a/lib_enc/scale_enc_fx.c +++ b/lib_enc/scale_enc_fx.c @@ -1,20 +1,21 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stl.h" + /*-------------------------------------------------------------------* * Scale_wsp * * Find scaling factor for weighted speech input *-------------------------------------------------------------------*/ + void Scale_wsp( Word16 *wsp, /* i : Weigthed speech */ Word16 *old_wsp_max, /* i : Last weigthed speech maximal valu */ @@ -24,7 +25,7 @@ void Scale_wsp( Word16 *old_wsp, /* i/o: Old weighted speech buffer */ Word16 *mem_decim2, /* i/o: Decimation buffer */ Word16 *old_wsp12k8, /* i/o: wsp memory @ 12.8 kHz used in pitol2 */ - const Word16 Len_p_look /* i : L_frame + look ahead Q0*/ + const Word16 Len_p_look /* i : L_frame + look ahead Q0*/ ) { Word16 max, i, tmp; @@ -61,6 +62,8 @@ void Scale_wsp( Scale_sig( mem_decim2, 3, *Q_exp ); Copy( old_wsp12k8, wsp - L_WSP_MEM, L_WSP_MEM ); /* Now memory and wsp vector have the same scaling */ + + return; } /*-------------------------------------------------------------------* @@ -69,27 +72,23 @@ void Scale_wsp( * Find scaled preemphasis vector and its scaling factor *-------------------------------------------------------------------*/ void Preemph_scaled( - Word16 new_speech[], /* i : Speech to scale already on 14 bits Q_new*/ - Word16 *Q_new, /* o : Scaling factor */ - Word16 *mem_preemph, /* i/o: Preemph memory Q(-1)*/ - Word16 *Q_max, /* i/o: Q_new limitation */ - const Word16 Preemph_factor, /* i : Preemphasis factor Q15*/ - const Word16 bits, /* i : Bit to remove from the output to (15-bits) */ - const Word16 bit1, /* i : Limit the output scaling to ((15-bits)-bit1) bits */ - const Word16 L_Q_mem, /* i : Number of old scaling to take into account Q0*/ - const Word16 Lframe, /* i : Frame length Q0*/ - const Word16 last_coder_type, /* i : coder_type Q0*/ - const Word16 Search_scaling /* i : enable the search of a proper scaling factor Q0*/ + Word16 new_speech[], /* i : Speech to scale already on 14 bits Q_new*/ + Word16 *Q_new, /* o : Scaling factor */ + Word16 *mem_preemph, /* i/o: Preemph memory Q(-1)*/ + Word16 *Q_max, /* i/o: Q_new limitation */ + const Word16 Preemph_factor, /* i : Preemphasis factor Q15*/ + const Word16 bits, /* i : Bit to remove from the output to (15-bits) */ + const Word16 bit1, /* i : Limit the output scaling to ((15-bits)-bit1) bits */ + const Word16 L_Q_mem, /* i : Number of old scaling to take into account Q0*/ + const Word16 Lframe, /* i : Frame length Q0*/ + const Word16 last_coder_type, /* i : coder_type Q0*/ + const Word16 Search_scaling /* i : enable the search of a proper scaling factor Q0*/ ) { Word16 i, tmp_fixed; Word16 mu, shift, QVal; Word32 L_tmp, L_maxloc; Word16 Q_min; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /*---------------------------------------------------------------* * Perform fixed preemphasis through 1 - g z^-1 * @@ -97,8 +96,7 @@ void Preemph_scaled( *---------------------------------------------------------------*/ BASOP_SATURATE_WARNING_OFF_EVS - Overflow = 0; - QVal = shl_o( 1, sub( 15, bits ), &Overflow ); + QVal = shl_sat( 1, sub( 15, bits ) ); //?sat BASOP_SATURATE_WARNING_ON_EVS mu = shr( Preemph_factor, bits ); /* Q15 --> Q(15-bits) */ @@ -115,7 +113,7 @@ void Preemph_scaled( /* Equivalent to tmp = max((abs(x[i] - mu*x[i-1]),tmp) * finds the max of preemphasized signal */ L_tmp = L_mult( new_speech[i], QVal ); - L_tmp = L_msu_o( L_tmp, new_speech[i - 1], mu, &Overflow ); + L_tmp = L_msu_sat( L_tmp, new_speech[i - 1], mu ); L_tmp = L_abs( L_tmp ); L_maxloc = L_max( L_tmp, L_maxloc ); } @@ -165,7 +163,7 @@ void Preemph_scaled( FOR( i = sub( Lframe, 1 ); i > 0; i-- ) { L_tmp = L_mult( new_speech[i], QVal ); - L_tmp = L_msu_o( L_tmp, new_speech[i - 1], mu, &Overflow ); + L_tmp = L_msu_sat( L_tmp, new_speech[i - 1], mu ); L_tmp = L_shl( L_tmp, *Q_new ); new_speech[i] = round_fx_sat( L_tmp ); // Q_new } @@ -176,7 +174,11 @@ void Preemph_scaled( new_speech[0] = round_fx_sat( L_tmp ); *mem_preemph = tmp_fixed; move16(); + + return; } + + /*-------------------------------------------------------------------* * Scale_mem * @@ -198,9 +200,6 @@ Word32 Scale_mem_pre_proc( /* o : Min energy scaled { Word16 i; Word32 e_min_scaled; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif e_min_scaled = L_shr_r( L_add( L_shr( E_MIN_FXQ15, sub( 14, add( *Q_new, QSCALE ) ) ), 1 ), 1 ); @@ -229,12 +228,12 @@ Word32 Scale_mem_pre_proc( /* o : Min energy scaled /* Do scaling and valide minimum energy value */ FOR( i = 0; i < NB_BANDS; i++ ) { - enrO[i] = L_max( L_shl_o( enrO[i], Q_exp, &Overflow ), e_min_scaled ); - bckr[i] = L_max( L_shl_o( bckr[i], Q_exp, &Overflow ), e_min_scaled ); - ave_enr[i] = L_max( L_shl_o( ave_enr[i], Q_exp, &Overflow ), e_min_scaled ); - ave_enr2[i] = L_max( L_shl_o( ave_enr2[i], Q_exp, &Overflow ), e_min_scaled ); - st_fr_bands1[i] = L_max( L_shl_o( st_fr_bands1[i], Q_exp, &Overflow ), e_min_scaled ); - st_fr_bands2[i] = L_max( L_shl_o( st_fr_bands2[i], Q_exp, &Overflow ), e_min_scaled ); + enrO[i] = L_max( L_shl_sat( enrO[i], Q_exp ), e_min_scaled ); + bckr[i] = L_max( L_shl_sat( bckr[i], Q_exp ), e_min_scaled ); + ave_enr[i] = L_max( L_shl_sat( ave_enr[i], Q_exp ), e_min_scaled ); + ave_enr2[i] = L_max( L_shl_sat( ave_enr2[i], Q_exp ), e_min_scaled ); + st_fr_bands1[i] = L_max( L_shl_sat( st_fr_bands1[i], Q_exp ), e_min_scaled ); + st_fr_bands2[i] = L_max( L_shl_sat( st_fr_bands2[i], Q_exp ), e_min_scaled ); move32(); move32(); move32(); @@ -244,9 +243,11 @@ Word32 Scale_mem_pre_proc( /* o : Min energy scaled } } } + return e_min_scaled; } + void Scale_mem_enc( Word16 Q_exp, /* i : Diff scaling factor */ Word16 *old_speech16k, /* i/o: Speech memory */ diff --git a/lib_enc/set_impulse_fx.c b/lib_enc/set_impulse_fx.c index 9ad5f4a2cdb9a4bab773a1008a6b70cb948771af..3ee47938446f08090fed1158c832946d166eadb6 100644 --- a/lib_enc/set_impulse_fx.c +++ b/lib_enc/set_impulse_fx.c @@ -1,27 +1,32 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" -#include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ -#include "rom_com.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*-----------------------------------------------------------------* * Local constant + *-----------------------------------------------------------------*/ + #define INPOL 4 /* +- range in samples for impulse position searching */ + /*-----------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------*/ + static void convolve_tc_fx( const Word16 g[], const Word16 h[], Word16 y[], const Word16 L_1, const Word16 L_2 ); static void correlate_tc_fx( const Word16 *x, Word16 *y, const Word16 *h, const Word16 start, const Word16 L_1, const Word16 L_2 ); static void convolve_tc2_fx( const Word16 g[], const Word16 h[], Word16 y[], const Word16 pos_max ); + /*---------------------------------------------------------------------------------------* * Function set_impulse() for TC * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * @@ -47,14 +52,14 @@ static void convolve_tc2_fx( const Word16 g[], const Word16 h[], Word16 y[], con * * *---------------------------------------------------------------------------------------*/ void set_impulse_fx( - const Word16 xn_fx[], /* i : target signal Q_new-1+shift*/ - const Word16 h_orig_fx[], /* i : impulse response of weighted synthesis filter Q(14+shift)*/ - Word16 exc_fx[], /* o : adaptive codebook excitation Q_new*/ - Word16 yy1_fx[], /* o : filtered adaptive codebook excitation Q_new*/ - Word16 *imp_shape, /* o : adaptive codebook index Q0*/ - Word16 *imp_pos, /* o : position of the glottal impulse center index Q0*/ - Word32 *gain_trans_fx, /* o : transition gain Q7*/ - Word16 Q_new /* i : Current scaling */ + const Word16 xn_fx[], /* i : target signal Q_new-1+shift*/ + const Word16 h_orig_fx[], /* i : impulse response of weighted synthesis filter Q(14+shift)*/ + Word16 exc_fx[], /* o : adaptive codebook excitation Q_new*/ + Word16 yy1_fx[], /* o : filtered adaptive codebook excitation Q_new*/ + Word16 *imp_shape, /* o : adaptive codebook index Q0*/ + Word16 *imp_pos, /* o : position of the glottal impulse center index Q0*/ + Word32 *gain_trans_fx, /* o : transition gain Q7*/ + Word16 Q_new /* i : Current scaling */ ) { Word16 i, j, m; @@ -65,10 +70,7 @@ void set_impulse_fx( Word16 krit_fx, krit_max_fx, gain16; Word32 Lrr, Ldd, Ltmp, Ltmp1; const Word16 *pt_Glt; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + krit_max_fx = -32768; move16(); @@ -119,12 +121,12 @@ void set_impulse_fx( /* nominator & DEnominator row <0> */ FOR( i = 0; i < L_SUBFR; i++ ) { - Lrr = L_mac_o( Lrr, gh_fx[i], gh_fx[i], &Overflow ); // Q27 - Ldd = L_mac_o( Ldd, gh_fx[i], xn_fx[i], &Overflow ); // Q27 + Lrr = L_mac_sat( Lrr, gh_fx[i], gh_fx[i] ); // Q27 + Ldd = L_mac_sat( Ldd, gh_fx[i], xn_fx[i] ); // Q27 } rr_fx[start1] = Lrr; move32(); - dd_fx[start1] = round_fx_o( Ldd, &Overflow ); // Q11 + dd_fx[start1] = round_fx_sat( Ldd ); // Q11 rr_fx[start1] = L_max( rr_fx[start1], 1 ); FOR( i = add( start1, 1 ); i < L_IMPULSE2; i++ ) @@ -138,15 +140,15 @@ void set_impulse_fx( gh_fx[j] = mac_r( L_deposit_h( gh_fx[j - 1] ), Glottal_cdbk_fx[m * L_IMPULSE + L_IMPULSE2 - i], h_orig_fx[j] ); // Q13 move16(); - Lrr = L_mac_o( Lrr, gh_fx[j], gh_fx[j], &Overflow ); // Q27 - Ldd = L_mac_o( Ldd, gh_fx[j], xn_fx[j], &Overflow ); // Q27 + Lrr = L_mac_sat( Lrr, gh_fx[j], gh_fx[j] ); // Q27 + Ldd = L_mac_sat( Ldd, gh_fx[j], xn_fx[j] ); // Q27 } gh_fx[0] = mult_r( Glottal_cdbk_fx[m * L_IMPULSE + L_IMPULSE2 - i], h_orig_fx[0] ); // Q13 move16(); - Lrr = L_mac_o( Lrr, gh_fx[0], gh_fx[0], &Overflow ); // Q27 - Ldd = L_mac_o( Ldd, gh_fx[0], xn_fx[0], &Overflow ); // Q27 - dd_fx[i] = round_fx_sat( Ldd ); // Q11 + Lrr = L_mac_sat( Lrr, gh_fx[0], gh_fx[0] ); // Q27 + Ldd = L_mac_sat( Ldd, gh_fx[0], xn_fx[0] ); // Q27 + dd_fx[i] = round_fx_sat( Ldd ); // Q11 rr_fx[i] = L_max( Lrr, 1 ); move32(); /* move rr and dd into rr[i] and dd[i] */ @@ -179,8 +181,7 @@ void set_impulse_fx( FOR( i = L_SUBFR - 2; i >= start2; i-- ) { /*rr[i] = rr[i+1] + gh[L_SUBFR+L_IMPULSE2-1-i]*gh[L_SUBFR+L_IMPULSE2-1-i];*/ - rr_fx[i] = L_mac_o( rr_fx[i + 1], gh_fx[L_SUBFR + L_IMPULSE2 - 1 - i], - gh_fx[L_SUBFR + L_IMPULSE2 - 1 - i], &Overflow ); // Q27 + rr_fx[i] = L_mac_sat( rr_fx[i + 1], gh_fx[L_SUBFR + L_IMPULSE2 - 1 - i], gh_fx[L_SUBFR + L_IMPULSE2 - 1 - i] ); // Q27 move32(); } /* nominator rows */ @@ -201,7 +202,8 @@ void set_impulse_fx( den = extract_h( L_shl( rr_fx[i], exp_den ) ); num = div_s( num, den ); - krit_fx = shr_o( num, sub( sub( shl_o( exp_num, 1, &Overflow ), exp_den ), 2 ), &Overflow ); /* Q18 */ + + krit_fx = shr_sat( num, sub( sub( shl_sat( exp_num, 1 ), exp_den ), 2 ) ); /* Q18 */ IF( GT_16( krit_fx, krit_max_fx ) ) { @@ -285,10 +287,10 @@ static void convolve_tc_fx( L_sum = L_mult( g[0], h[n] ); /* Qx */ FOR( i = 1; i < len; i++ ) { - L_sum = L_mac( L_sum, g[i], h[n - i] ); /* Qx + 16 */ + L_sum = L_mac_sat( L_sum, g[i], h[n - i] ); /* Qx + 16 */ } - y[n] = round_fx( L_sum ); /* Qx */ + y[n] = round_fx_sat( L_sum ); /* Qx */ } } /*-------------------------------------------------------------------* @@ -331,12 +333,12 @@ static void convolve_tc2_fx( * correlation for different vectors' lengths *-------------------------------------------------------------------*/ static void correlate_tc_fx( - const Word16 *x, /* i: target signal Qx*/ - Word16 *y, /* o: correlation between x[] and h[] -Q3*/ - const Word16 *h, /* i: impulse response (of weighted synthesis filter) Q15*/ - const Word16 start, /* i: index of iterest Q0*/ - const Word16 L_1, /* i: vector size Q0*/ - const Word16 L_2 /* i: index of interest Q0*/ + const Word16 *x, /* i: target signal Qx*/ + Word16 *y, /* o: correlation between x[] and h[] -Q3*/ + const Word16 *h, /* i: impulse response (of weighted synthesis filter) Q15*/ + const Word16 start, /* i: index of iterest Q0*/ + const Word16 L_1, /* i: vector size Q0*/ + const Word16 L_2 /* i: index of interest Q0*/ ) { Word16 i, j; diff --git a/lib_enc/setmodeindex_fx.c b/lib_enc/setmodeindex_fx.c index 012c5757f2b9ea041c5bb4541e580f11fd27e656..6c34efb0f914e00a1d8ba810db6c4ab1fba7a964 100644 --- a/lib_enc/setmodeindex_fx.c +++ b/lib_enc/setmodeindex_fx.c @@ -1,15 +1,16 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" #include "cnst.h" -#include "rom_com_fx.h" +#include "rom_com.h" #include "rom_enc.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*--------------------------------------------------------------------------- function name: SetModeIndex_fx diff --git a/lib_enc/sig_clas_fx.c b/lib_enc/sig_clas_fx.c index cf5d31d22001c277a70040332e8c73383e4be02a..990fad0db6851a9f6e6b3358c594b1c1058ffcd9 100644 --- a/lib_enc/sig_clas_fx.c +++ b/lib_enc/sig_clas_fx.c @@ -1,11 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -56,10 +55,8 @@ Word16 signal_clas_fx( /* o : classification for current Word16 i, clas, pc, zc, lo, lo2, hi, hi2, exp_ee, frac_ee; Word16 tmp16, tmpS; const Word16 *pt1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif /*----------------------------------------------------------------* * Calculate average voicing @@ -100,7 +97,236 @@ Word16 signal_clas_fx( /* o : classification for current een = round_fx( L_shl( Ltmp, 16 - 5 ) ); /* Q14 -> Q9 */ een = mac_r( C_EE_FX, een, K_EE_FX ); } + /* compute zero crossing rate */ + pt1 = speech + sub( L_look, 1 ); + tmpS = shr( *pt1, 15 ); /* sets 'tmpS to -1 if *pt1 < 0 */ + Ltmp = L_deposit_l( 0 ); + FOR( i = 0; i < L_FRAME; i++ ) + { + tmp16 = add( 1, tmpS ); + pt1++; + tmpS = shr( *pt1, 15 ); /* pt1 >=0 ---> 0 OTHERWISE -1 */ + Ltmp = L_msu0( Ltmp, tmpS, tmp16 ); + } + zc = extract_l( Ltmp ); + + /* compute pitch stability */ + pc = add( abs_s( sub( st->pitch[1], st->pitch[0] ) ), abs_s( sub( st->pitch[2], st->pitch[1] ) ) ); + st->tdm_pc = pc; + move16(); + /*-----------------------------------------------------------------* + * Transform parameters to the range <0:1> + * Compute the merit function + *-----------------------------------------------------------------*/ + + /* corn = K_COR * mean_voi2 + C_COR */ + Ltmp = L_mult( C_COR_FX, 32767 ); + corn = round_fx( L_shl( L_mac( Ltmp, mean_voi2, K_COR_FX ), -4 ) ); /*Q13+Q13*Q15 =>Q13->Q9*/ + /* Limit [0, 1] */ + corn = s_max( corn, 0 ); + corn = s_min( corn, 512 ); + + Ltmp = L_mult( C_ZC_FX, 4 ); /*Q13*Q2 -> Q16*/ + zcn = round_fx( L_shl( L_mac( Ltmp, zc, K_ZC_FX ), 16 - 7 ) ); /*Q0*Q15 + Q16*/ + /* Limit [0, 1] */ + zcn = s_max( zcn, 0 ); + zcn = s_min( zcn, 512 ); + + Ltmp = L_mult( C_RELE_FX, 256 ); /*Q15*Q8 ->Q24*/ + relEn = round_fx( L_shl( L_mac( Ltmp, relE, K_RELE_FX ), 1 ) ); /*relE in Q8 but relEn in Q9*/ + /* Limit [0.5, 1] */ + relEn = s_max( relEn, 256 ); + relEn = s_min( relEn, 512 ); + + Ltmp = L_mult( C_PC_FX, 2 ); /*Q14*Q1 -> Q16*/ + pcn = round_fx( L_shl( L_mac( Ltmp, pc, K_PC_FX ), 16 - 7 ) ); /*Q16 + Q0*Q15*/ + /* Limit [0, 1] */ + pcn = s_max( pcn, 0 ); + pcn = s_min( pcn, 512 ); + + Ltmp = L_mult( een, 10923 ); + Ltmp = L_mac( Ltmp, corn, 21845 ); + Ltmp = L_mac( Ltmp, zcn, 10923 ); + Ltmp = L_mac( Ltmp, relEn, 10923 ); + Ltmp = L_mac( Ltmp, pcn, 10923 ); + + fmerit1 = round_fx_o( L_shl_o( Ltmp, 16 - 10 - 1, &Overflow ), &Overflow ); /* fmerit1 ->Q15 */ + + /*-----------------------------------------------------------------* + * FEC classification + *-----------------------------------------------------------------*/ + + st->fmerit_dt = sub( st->prev_fmerit, fmerit1 ); /*Q15*/ + move16(); + st->prev_fmerit = fmerit1; + move16(); + + /* FEC classification */ + test(); + test(); + IF( st->localVAD == 0 || EQ_16( st->coder_type, UNVOICED ) || LT_16( relE, -1536 ) ) + { + clas = UNVOICED_CLAS; + *clas_mod = clas; + move16(); + move16(); + } + ELSE + { + SWITCH( st->last_clas ) + { + case VOICED_CLAS: + case ONSET: + case VOICED_TRANSITION: + + IF( LT_16( fmerit1, 16056 ) ) /*0.49f*/ + { + clas = UNVOICED_CLAS; + move16(); + } + ELSE IF( LT_16( fmerit1, 21626 ) ) /*0.66*/ + { + clas = VOICED_TRANSITION; + move16(); + } + ELSE + { + clas = VOICED_CLAS; + move16(); + } + IF( LT_16( fmerit1, 14745 /* 0.45f*/ ) ) + { + *clas_mod = UNVOICED_CLAS; + move16(); + } + ELSE IF( LT_16( fmerit1, 21626 /* 0.66f*/ ) ) + { + *clas_mod = VOICED_TRANSITION; + move16(); + } + ELSE + { + *clas_mod = VOICED_CLAS; + move16(); + } + BREAK; + case UNVOICED_CLAS: + case UNVOICED_TRANSITION: + IF( GT_16( fmerit1, 20643 ) ) /*0.63*/ + { + clas = ONSET; + move16(); + } + ELSE IF( GT_16( fmerit1, 19169 ) ) /*0.585*/ + { + clas = UNVOICED_TRANSITION; + move16(); + } + ELSE + { + clas = UNVOICED_CLAS; + move16(); + } + *clas_mod = clas; + move16(); + + BREAK; + + default: + clas = UNVOICED_CLAS; + *clas_mod = clas; + move16(); + move16(); + BREAK; + } + } + /* Onset classification */ + + /* tc_cnt == -1: frame after TC frame in continuous block of GC/VC frames */ + /* tc_cnt == 0: UC frame */ + /* tc_cnt == 1: onset/transition frame, coded by GC coder type */ + /* tc_cnt == 2: frame after onset/transition frame, coded by TC coder type */ + + if ( clas == 0 ) + { + st->tc_cnt = 0; + move16(); + } + + test(); + IF( GE_16( clas, VOICED_TRANSITION ) && st->tc_cnt >= 0 ) + { + st->tc_cnt = add( st->tc_cnt, 1 ); + move16(); + } + + if ( GT_16( st->tc_cnt, 2 ) ) + { + st->tc_cnt = -1; + move16(); + } + return clas; +} + +Word16 signal_clas_ivas_fx( /* o : classification for current frames */ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 *speech, /* i : pointer to speech signal for E computation in Qx */ + const Word32 *ee, /* i : lf/hf E ration for 2 half-frames in Q6 */ + const Word16 relE, /* i : frame relative E to the long term average in Q8 */ + const Word16 L_look, /* i : look-ahead */ + Word16 *clas_mod /* o : class flag for NOOP detection */ +) +{ + Word32 Ltmp; + Word16 mean_voi2, een, corn, zcn, relEn, pcn, fmerit1; + Word16 i, clas, pc, zc, exp_ee; + Word16 tmp16, tmpS; + const Word16 *pt1; + Word64 tmp64; + Flag Overflow = 0; + move32(); + + /*----------------------------------------------------------------* + * Calculate average voicing + * Calculate average spectral tilt + * Calculate zero-crossing rate + * Calculate pitch stability + *----------------------------------------------------------------*/ + + /* average voicing on second half-frame and look-ahead */ + Ltmp = L_mult( st->voicing_fx[1], 16384 ); /* Q15*Q14->Q30 */ + mean_voi2 = mac_r( Ltmp, st->voicing_fx[2], 16384 ); + + /* average spectral tilt in dB */ + tmp64 = W_mult0_32_32( ee[0], ee[1] ); + exp_ee = W_norm( tmp64 ); + Ltmp = W_extract_h( W_shl( tmp64, exp_ee ) ); // Q = Q6+Q6 + exp_ee - 32 + exp_ee = sub( 31, sub( add( Q12, exp_ee ), 32 ) ); + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( Ltmp, exp_ee, ONE_IN_Q31, 0 ), -1 ) ) + { + een = 0; + move16(); + } + ELSE + { + /* mean_ee2 = 0.5f * 20.0f * (float)log10( tmp ); */ + /* een = K_EE_ENC * mean_ee2 + C_EE_ENC; */ + Ltmp = BASOP_Util_Log10( Ltmp, exp_ee ); // Q25 + Ltmp = Mpy_32_32( Ltmp, 671088640 /*20.f in Q25*/ ); // Q25 + Q25 -Q31 = Q19 * 0.5 = Q20 + een = extract_l( L_shl( Mpy_32_16_1( Ltmp, K_EE_FX ), Q9 - Q20 ) ); // Q9 + + IF( GT_16( een, 512 ) ) + { + een = 512; + move16(); + } + ELSE IF( een < 0 ) + { + een = 0; + move16(); + } + } /* compute zero crossing rate */ pt1 = speech + sub( L_look, 1 ); tmpS = shr( *pt1, 15 ); /* sets 'tmpS to -1 if *pt1 < 0 */ @@ -272,6 +498,7 @@ Word16 signal_clas_fx( /* o : classification for current } return clas; } + /*-------------------------------------------------------------------* * select_TC_fx() * @@ -409,8 +636,7 @@ void coder_type_modif_fx( hSC_VBR->vbr_generic_ho = 0; move16(); } - } //_DIFF_FLOAT_FIX_ see below - // PMT("Verify if EVS or IVAS is right about last_7k2_coder_type update") + } hSC_VBR->last_7k2_coder_type = st->coder_type; move16(); test(); @@ -419,7 +645,6 @@ void coder_type_modif_fx( hSC_VBR->last_7k2_coder_type = GENERIC; move16(); } - //} closing bracket here in IVAS float, but not in EVS float. currently affects BE for switching bitrate on Linux 20220929 _DIFF_FLOAT_FIX_ !! IF( st->element_mode == 0 ) { diff --git a/lib_enc/spec_center_fx.c b/lib_enc/spec_center_fx.c index 1e908d0c388682b49e1d71d6807d6deb2e3be89e..78af3cda39a85549120dfe211d4fdcaf79a268de 100644 --- a/lib_enc/spec_center_fx.c +++ b/lib_enc/spec_center_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -18,9 +18,9 @@ *-------------------------------------------------------------------*/ void spec_center_fx( - Word32 *sb_power, /* i : energy of sub-band divided uniformly Q31 */ - Word16 *sp_center, /* o : spectral center Q10 */ - const Word32 bw_index, /* i : band width Q0 */ + Word32 *sb_power, /* i : energy of sub-band divided uniformly Q31 */ + Word16 *sp_center, /* o : spectral center Q10 */ + const Word32 bw_index, /* i : band width Q0 */ const Word16 Q_sb_p /* i : the Scaling of sb_power*/ ) { @@ -64,7 +64,7 @@ void spec_center_fx( frame_power_nb = frame_power; move32(); - /*+0.1 */ + /*+0.1 */ Q_t_sc = sub( Q_sb_p, 10 ); IF( GE_16( Q_t_sc, 34 ) ) { @@ -144,7 +144,7 @@ void spec_center_fx( t_sp_center = L_add( L_shr( sb_power_mlt, 8 ), t_sp_center ); frame_power = L_add( sb_power_shr[i], frame_power ); /*1-19 */ } - /*+0.1 */ + /*+0.1 */ Q_t_sc = sub( Q_sb_p, 13 ); IF( GE_16( Q_t_sc, 34 ) ) @@ -218,7 +218,7 @@ void spec_center_fx( frame_power = L_add( sb_power_shr[i], frame_power ); /*1-23 */ } - /*+0.1 */ + /*+0.1 */ Q_t_sc = sub( Q_sb_p, 14 ); IF( GE_16( Q_t_sc, 34 ) ) @@ -314,7 +314,7 @@ void spec_center_fx( { sb_power_mlt = Mpy_32_16_1( sb_power[i], i_t_1[i - 1] ); t_sp_center = L_add( L_shr( sb_power_mlt, 6 ), t_sp_center ); - frame_power = L_add( sb_power_shr[i], frame_power ); /*1-9 */ + frame_power = L_add( sb_power_shr[i], frame_power ); /*1-9 */ } IF( frame_power == 0 ) { diff --git a/lib_enc/spec_flatness_fx.c b/lib_enc/spec_flatness_fx.c index c2451886dac977208e677dc5ca833459b53afa5e..ba8838e05795761df22c46872e17effe7353ed1f 100644 --- a/lib_enc/spec_flatness_fx.c +++ b/lib_enc/spec_flatness_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -100,7 +100,7 @@ void spec_flatness_fx( } sums = MUL_F( sums, 0x0888 ); - /*+0.1 */ + /*+0.1 */ IF( GE_16( prods_Q, 34 ) ) { prods = L_shr( prods, sub( prods_Q, 33 ) ); @@ -186,7 +186,7 @@ void spec_flatness_fx( } sums = MUL_F( sums, 0x0666 ); - /*+0.1 */ + /*+0.1 */ IF( GE_16( prods_Q, 34 ) ) { prods = L_shr( prods, sub( prods_Q, 33 ) ); @@ -221,11 +221,7 @@ void spec_flatness_fx( SFM_Qtmp = sub( SFM_Qtmp, SPEC_AMP_Q ); SFM_Qtmp = sub( SFM_Qtmp, SFM_Q ); -#ifdef FIX_ISSUE_1209 sSFM[1] = add_sat( mult( sSFM[1], 0x6ccc ), shr( mult( SFM, 0x1333 ), SFM_Qtmp ) ); -#else - sSFM[1] = add( mult( sSFM[1], 0x6ccc ), shr( mult( SFM, 0x1333 ), SFM_Qtmp ) ); -#endif move16(); /*sSFM3*/ @@ -276,7 +272,7 @@ void spec_flatness_fx( sums = MUL_F( sums, 0x051e ); - /*+0.1 */ + /*+0.1 */ IF( GE_16( prods_Q, 34 ) ) { prods = L_shr( prods, sub( prods_Q, 33 ) ); diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index e04f5172b54a7022360d2afada7514b3e9e49624..d3cc666f6b30b81aaff7b4330c35b046776f99fc 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -1,14 +1,12 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include #include "options.h" #include "cnst.h" -// #include "prot_fx.h" #include "rom_enc.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "stl.h" #include "prot_fx.h" /* Function prototypes */ @@ -23,6 +21,7 @@ /*---------------------------------------------------------------------* * Local constants *---------------------------------------------------------------------*/ + #define ATT_NSEG 32 #define ATT_SEG_LEN ( L_FRAME / ATT_NSEG ) #define ATT_3LSUB_POS ( 3 * ATT_NSEG / NB_SUBFR ) @@ -44,7 +43,6 @@ static Word16 sp_mus_classif_gmm_fx( Encoder_State *st_fx, const Word16 localVAD_HE_SAD, const Word16 lsp_new[M], const Word16 cor_map_sum, const Word32 epsP[M + 1], const Word32 PS[], Word16 non_sta, Word16 relE, Word16 *voi_fv, Word16 *cor_map_sum_fv, Word16 *LPCErr, Word16 Q_esp, Word16 *high_lpn_flag_ptr ); - static void sp_mus_classif_2nd_fx( Encoder_State *st, const Word16 Etot, Word16 *attack_flag, const Word16 *inp, const Word16 Qx ); static void music_mixed_classif_improv_fx( Encoder_State *st, const Word16 *new_inp, const Word32 *epsP, Word16 Q_epsP, Word16 etot, Word16 old_cor, Word16 cor_map_sum ); @@ -662,10 +660,6 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis Word16 tmp1, tmp2, exp2, scale, exp3; SP_MUS_CLAS_HANDLE hSpMusClas = st_fx->hSpMusClas; HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif /*------------------------------------------------------------------* * Initialization @@ -794,10 +788,10 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis sum_PS = L_deposit_l( 0 ); FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { - sum_PS = L_add_o( sum_PS, PS[i], &Overflow ); + sum_PS = L_add_sat( sum_PS, PS[i] ); } exp1 = norm_l( sum_PS ); - tmp1 = round_fx_o( L_shl( sum_PS, exp1 ), &Overflow ); + tmp1 = round_fx_sat( L_shl( sum_PS, exp1 ) ); exp1 = sub( 30, exp1 ); FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) @@ -805,7 +799,7 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis /*PS_norm[i] = PS[i] / sum_PS;*/ /*dPS[i] = (float)fabs(PS_norm[i] - st->past_PS[i]);*/ exp2 = norm_l( PS[i] ); - tmp2 = round_fx_o( L_shl( PS[i], exp2 ), &Overflow ); + tmp2 = round_fx_sat( L_shl( PS[i], exp2 ) ); exp2 = sub( 30, exp2 ); scale = shr( sub( tmp1, tmp2 ), 15 ); @@ -856,16 +850,7 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { /*mx = PS_norm[i] > st->past_PS[i] ? PS_norm[i] : st->past_PS[i];*/ - IF( GT_32( PS_norm[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ) ) - { - mx = PS_norm[i]; - move16(); /*Q25 */ - } - ELSE - { - mx = hSpMusClas->past_PS_fx[i - LOWEST_FBIN]; - move16(); /*Q25 */ - } + mx = L_max( PS_norm[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ); /*Q25 */ /*ps_sta += mx / (dPS[i] + 1e-5f);*/ IF( !dPS[i] ) @@ -875,7 +860,7 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis ELSE { exp1 = norm_l( L_add( dPS[i], 336 ) ); - tmp1 = round_fx_o( L_shl_o( L_add( dPS[i], 336 ), exp1, &Overflow ), &Overflow ); + tmp1 = round_fx_sat( L_shl_sat( L_add( dPS[i], 336 ), exp1 ) ); exp1 = sub( 30, exp1 ); exp2 = norm_l( mx ); @@ -890,20 +875,12 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis tmp = div_s( tmp2, tmp1 ); /*Q(15+exp3) */ L_tmp = L_shl( tmp, sub( 1, exp3 ) ); /*Q16 */ -#ifdef FIX_ISSUE_1151 - ps_sta = L_add_sat( ps_sta, L_tmp ); /*Q16 */ -#else - ps_sta = L_add( ps_sta, L_tmp ); /*Q16 */ -#endif + ps_sta = L_add_sat( ps_sta, L_tmp ); /*Q16 */ } } /**pFV++ = (float)log(ps_sta + 1e-5f);*/ -#ifdef FIX_ISSUE_1151 ps_sta = L_add_sat( ps_sta, 336 ); -#else - ps_sta = L_add( ps_sta, 336 ); -#endif e_tmp = norm_l( ps_sta ); f_tmp = Log2_norm_lc( L_shl( ps_sta, e_tmp ) ); e_tmp = sub( 30 - 16, e_tmp ); @@ -940,7 +917,7 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis FOR( i = 0; i < N_FEATURES; i++ ) { /**pFV = pSF[0] * *pFV + pSF[1];*/ - *pFV = round_fx_o( L_shl_o( L_mac( pSF_a[i], *pFV, pSF_m[i] ), ishift[i], &Overflow ), &Overflow ); + *pFV = round_fx_sat( L_shl_sat( L_mac( pSF_a[i], *pFV, pSF_m[i] ), ishift[i] ) ); move16(); pFV++; } @@ -971,7 +948,7 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis FOR( p = 0; p < N_FEATURES; p++ ) { /* xm[p] = FV[p] - m_speech[k*N_FEATURES+p];*/ - xm[p] = sub_o( FV[p], m_speech_fx[k * N_FEATURES + p], &Overflow ); + xm[p] = sub_sat( FV[p], m_speech_fx[k * N_FEATURES + p] ); move16(); /*Q15 */ } @@ -987,7 +964,7 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis FOR( p = 0; p < N_FEATURES; p++ ) { /*xm[p] = FV[p] - m_noise[k*N_FEATURES+p];*/ - xm[p] = sub_o( FV[p], m_noise_fx[k * N_FEATURES + p], &Overflow ); + xm[p] = sub_sat( FV[p], m_noise_fx[k * N_FEATURES + p] ); move16(); /*Q15 */ } @@ -1002,7 +979,7 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis FOR( p = 0; p < N_FEATURES; p++ ) { /*xm[p] = FV[p] - m_music[k*N_FEATURES+p];*/ - xm[p] = sub_o( FV[p], m_music_fx[k * N_FEATURES + p], &Overflow ); + xm[p] = sub_sat( FV[p], m_music_fx[k * N_FEATURES + p] ); move16(); /*Q15 */ } @@ -1016,7 +993,7 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis /* calculate log-probability */ /*log(0.0001)-0.5f * N_FEATURES * LOG_PI2 in Q9 */ - lps = extract_h( L_shl_o( L_sub( max_s, LOG_PROB_CONST ), 16 - 1, &Overflow ) ); /*Q9 */ + lps = extract_h( L_shl_sat( L_sub( max_s, LOG_PROB_CONST ), 16 - 1 ) ); /*Q9 */ lps = s_max( lps, -10832 ); lpm = extract_h( L_shl( L_sub( max_m, LOG_PROB_CONST ), 16 - 1 ) ); /*Q9 */ @@ -1024,7 +1001,7 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis /* lpn = (float)log(pyn) - 0.5f * N_FEATURES * (float)log(2*PI); */ - lpn = extract_h( L_shl_o( L_sub( max_n, LOG_PROB_CONST ), 16 - 1, &Overflow ) ); /*Q9 */ + lpn = extract_h( L_shl_sat( L_sub( max_n, LOG_PROB_CONST ), 16 - 1 ) ); /*Q9 */ lpn = s_max( lpn, -10832 ); *high_lpn_flag_ptr = 0; @@ -1476,10 +1453,6 @@ static Word16 attack_det_fx( /* o : attack flag Word16 i, j, tmp, tmp1, attack, exp1; Word32 L_tmp, etmp, etmp2, finc[ATT_NSEG]; Word16 att_3lsub_pos; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif att_3lsub_pos = ATT_3LSUB_POS; move16(); @@ -1496,7 +1469,7 @@ static Word16 attack_det_fx( /* o : attack flag FOR( j = 1; j < ATT_SEG_LEN; j++ ) { - L_tmp = L_mac0_o( L_tmp, inp[i * ATT_SEG_LEN + j], inp[i * ATT_SEG_LEN + j], &Overflow ); /*2*Qx */ + L_tmp = L_mac0_sat( L_tmp, inp[i * ATT_SEG_LEN + j], inp[i * ATT_SEG_LEN + j] ); /*2*Qx */ } finc[i] = L_tmp; @@ -1517,11 +1490,11 @@ static Word16 attack_det_fx( /* o : attack flag exp1 = norm_s( att_3lsub_pos ); tmp = div_s( shl( 1, sub( 14, exp1 ) ), att_3lsub_pos ); /*Q(29-exp1) */ - L_tmp = L_shr_o( finc[0], Qx, &Overflow ); /*Qx */ + L_tmp = L_shr_sat( finc[0], Qx ); /*Qx */ FOR( i = 1; i < att_3lsub_pos; i++ ) { - L_tmp = L_add_o( L_tmp, L_shr_o( finc[i], Qx, &Overflow ), &Overflow ); /*Qx */ + L_tmp = L_add_sat( L_tmp, L_shr_sat( finc[i], Qx ) ); /*Qx */ } L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(14-exp1+Qx) */ etmp = L_shl( L_tmp, sub( exp1, 14 ) ); /*Qx */ @@ -1530,10 +1503,10 @@ static Word16 attack_det_fx( /* o : attack flag exp1 = norm_s( tmp1 ); tmp = div_s( shl( 1, sub( 14, exp1 ) ), tmp1 ); /*Q(29-exp1) */ - L_tmp = L_shr_o( finc[attack], Qx, &Overflow ); /*Qx */ + L_tmp = L_shr_sat( finc[attack], Qx ); /*Qx */ FOR( i = 1; i < tmp1; i++ ) { - L_tmp = L_add_o( L_tmp, L_shr_o( finc[i + attack], Qx, &Overflow ), &Overflow ); /*Qx */ + L_tmp = L_add_sat( L_tmp, L_shr_sat( finc[i + attack], Qx ) ); /*Qx */ } L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(14-exp1+Qx) */ etmp2 = L_shl( L_tmp, sub( exp1, 14 ) ); /*Qx */ @@ -1605,7 +1578,7 @@ Word16 ivas_smc_gmm_fx( const Word16 cor_map_sum_fx, /* i : correlation map sum (from multi-harmonic anal.) Q8 */ const Word32 epsP_fx[M + 1], /* i : LP prediciton error */ const Word32 PS_fx[], /* i : energy spectrum */ - const Word16 non_sta_fx, /* i : unbound non-stationarity Q8 */ + const Word32 non_sta_fx, /* i : unbound non-stationarity Q20 */ const Word16 relE_fx, /* i : relative frame energy Q8 */ Word16 *high_lpn_flag, /* i/o: sp/mus LPN flag */ const Word16 flag_spitch, /* i : flag to indicate very short stable pitch */ @@ -1617,17 +1590,9 @@ Word16 ivas_smc_gmm_fx( Word16 flag_odv; Word32 lps_fx, lpm_fx, lpn_fx; Word32 ps_fx[N_SMC_MIXTURES], pm_fx[N_SMC_MIXTURES], pn_fx[N_SMC_MIXTURES]; -#ifndef DOT_PROD_CHOLESKY_64BIT - Word32 lprob_fx; - Word16 lprob_exp = 0; -#else Word64 wprob_fx; -#endif Word32 fvm_fx[N_PCA_COEF]; -#ifndef DOT_PROD_CHOLESKY_64BIT - Word16 fvm_exp = 0; -#endif - Word32 sum_PS_fx, ps_diff_fx, ps_sta_fx; + Word32 sum_PS_fx, ps_diff_fx; Word32 dlp_fx, wrelE_fx, wdrop_fx, wght_fx; Word32 wrise_fx; Word16 dlp_mean2var_fx; @@ -1904,7 +1869,7 @@ Word16 ivas_smc_gmm_fx( move32(); /* [8] non_sta */ - *pFV_fx++ = L_shl( non_sta_fx, Q12 ); /*scaling from Q8 to Q20*/ + *pFV_fx++ = non_sta_fx; /*Q20*/ move32(); /* [9] epsP */ @@ -1948,8 +1913,8 @@ Word16 ivas_smc_gmm_fx( Word16 guard_bits = find_guarded_bits_fx( NB_MEL_BANDS ); move16(); - v_mult_mat_fixed( mfcc_fx, melS_fx, dct_mtx_fx, NB_MEL_BANDS, NB_MEL_COEF, guard_bits ); // Q19 - *pFV_fx++ = L_shl( mfcc_fx[2], 1 ); // Q20 + v_mult_mat_fx( mfcc_fx, melS_fx, dct_mtx_fx, NB_MEL_BANDS, NB_MEL_COEF, guard_bits ); // Q19 + *pFV_fx++ = L_shl( mfcc_fx[2], 1 ); // Q20 move32(); *pFV_fx++ = L_shl( mfcc_fx[6], 1 ); move32(); @@ -1962,6 +1927,7 @@ Word16 ivas_smc_gmm_fx( /* calculation of differential normalized power spectrum */ sum_PS_fx = 0; move32(); + Word16 q_temp32; Word16 sum_PS_e = 0; move16(); Word64 sum = W_shl( 21475 /* 1e-5 in Q31 */, sub( Qfact_PS, 30 ) ); // Qfact_PS+1 @@ -1986,8 +1952,22 @@ Word16 ivas_smc_gmm_fx( FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { - temp32 = BASOP_Util_Divide3232_Scale_cadence( PS_fx[i], sum_PS_fx, &temp_exp ); // 31-temp_exp - PS_norm_fx[i] = L_shl( temp32, sub( Qfact_PS_past, add( sub( 31, temp_exp ), sub( Qfact_PS, sub( 31, sum_PS_e ) ) ) ) ); // Qfact_PS_past + temp32 = BASOP_Util_Divide3232_Scale_newton( PS_fx[i], sum_PS_fx, &temp_exp ); // 31-temp_exp + q_temp32 = add( sub( 31, temp_exp ), sub( Qfact_PS, sub( 31, sum_PS_e ) ) ); + test(); + if ( temp32 == 0 ) + { + q_temp32 = 31; + move16(); + } + IF( LT_16( q_temp32, 31 ) && EQ_32( temp32, L_shl( 1, q_temp32 ) ) ) + { + temp32 = ONE_IN_Q31; + move32(); + q_temp32 = Q31; + move16(); + } + PS_norm_fx[i] = L_shl( temp32, sub( Qfact_PS_past, q_temp32 ) ); // Qfact_PS_past move32(); dPS_fx[i] = L_abs( L_sub( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ) ); move32(); @@ -2005,27 +1985,21 @@ Word16 ivas_smc_gmm_fx( move32(); /* [14] ps_sta (spectral stationarity) */ - ps_sta_fx = 0; + Word32 ps_sta_fx = 0; move32(); Word16 ps_sta_exp = 0; move16(); + Word32 avoid_divide_by_zero; + avoid_divide_by_zero = L_shr( 21475, sub( 31, Qfact_PS_past ) ); // 21475 = 1e-5 in Q31 + FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { - IF( GT_32( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ) ) - { - temp32 = BASOP_Util_Divide3232_Scale_cadence( PS_norm_fx[i], ( L_add( dPS_fx[i], L_shr( 21475, sub( 31, Qfact_PS_past ) ) ) ), &temp_exp ); // 31-temp_exp - move32(); - ps_sta_fx = BASOP_Util_Add_Mant32Exp( temp32, temp_exp, ps_sta_fx, ps_sta_exp, &ps_sta_exp ); - move32(); - } - ELSE - { - // ps_sta += hSpMusClas->past_PS[i - LOWEST_FBIN] / ( dPS[i] + 1e-5f ); - temp32 = BASOP_Util_Divide3232_Scale_cadence( hSpMusClas->past_PS_fx[i - LOWEST_FBIN], ( L_add( dPS_fx[i], L_shr( 21475, sub( 31, Qfact_PS_past ) ) ) ), &temp_exp ); // 31-temp_exp - ps_sta_fx = BASOP_Util_Add_Mant32Exp( temp32, temp_exp, ps_sta_fx, ps_sta_exp, &ps_sta_exp ); - } + Word32 tmp_max; + tmp_max = L_max( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ); + /* Saturation doesn't have a significant impact here, as a value of 1e-5 in Q31 format is added to prevent division by zero */ + temp32 = BASOP_Util_Divide3232_Scale_newton( tmp_max, L_add_sat( dPS_fx[i], avoid_divide_by_zero ), &temp_exp ); // 31-temp_exp + ps_sta_fx = BASOP_Util_Add_Mant32Exp( temp32, temp_exp, ps_sta_fx, ps_sta_exp, &ps_sta_exp ); } - // temp32_log = L_add( BASOP_Util_Log2( L_add( ps_sta_fx, L_shr( 21475, ps_sta_exp ) ) ), L_shl( ps_sta_exp, Q25 ) ); temp32_log = L_add( BASOP_Util_Log2( L_add_sat( ps_sta_fx, L_shr( 21475, ps_sta_exp ) ) ), L_shl( ps_sta_exp, Q25 ) ); temp32_log = Mpy_32_32( temp32_log, 1488522239 ); /*logf(x) = log2(x)*logf(2)*/ *pFV_fx++ = L_shr( temp32_log, Q5 ); // logf( ps_sta + 1e-5f ); @@ -2197,8 +2171,9 @@ Word16 ivas_smc_gmm_fx( } /* PCA */ - v_sub_fixed( FV_fx, pca_mean_fx, FV_fx, N_SMC_FEATURES, 0 ); - v_mult_mat_fixed( FV_fx, FV_fx, pca_components_fx, N_SMC_FEATURES, N_PCA_COEF, 0 ); + v_sub_fx_no_hdrm( FV_fx, pca_mean_fx, FV_fx, N_SMC_FEATURES ); + v_mult_mat_fx( FV_fx, FV_fx, pca_components_fx, N_SMC_FEATURES, N_PCA_COEF, 0 ); + /*------------------------------------------------------------------* * Calculation of posterior probability * Log-probability @@ -2213,38 +2188,16 @@ Word16 ivas_smc_gmm_fx( FOR( m = 0; m < N_SMC_MIXTURES; m++ ) { v_sub32_fx( FV_fx, &means_speech_fx[m * N_PCA_COEF], fvm_fx, N_PCA_COEF ); -#ifndef DOT_PROD_CHOLESKY_64BIT - fvm_exp = sub( 31, Qfact_FV ); - lprob_exp = 0; - move16(); - lprob_fx = dot_product_cholesky_fixed( fvm_fx, &prec_chol_speech_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF, fvm_exp, 31 - 28, &lprob_exp ); - ps_fx[m] = L_sub( L_sub( L_add( log_weights_speech_compute[m], log_det_chol_speech_fx[m] ), L_shl( lprob_fx, sub( Q18 - 1, sub( Q31, lprob_exp ) ) ) ), HALF_N_PCA_COEF_LOG_P12_Q18 ); // Q18 -#else - wprob_fx = dot_product_cholesky_fixed( fvm_fx, &prec_chol_speech_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); // Q10 + wprob_fx = dot_product_cholesky_fx( fvm_fx, &prec_chol_speech_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); // Q10 ps_fx[m] = L_sub( L_sub( L_add( log_weights_speech_compute[m], log_det_chol_speech_fx[m] ), W_extract_l( W_shr( wprob_fx, Q10 ) ) ), HALF_N_PCA_COEF_LOG_P12_Q18 ); // Q18 -#endif move32(); v_sub32_fx( FV_fx, &means_music_fx[m * N_PCA_COEF], fvm_fx, N_PCA_COEF ); -#ifndef DOT_PROD_CHOLESKY_64BIT - lprob_exp = 0; - move16(); - lprob_fx = dot_product_cholesky_fixed( fvm_fx, &prec_chol_music_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF, fvm_exp, 31 - 28, &lprob_exp ); - pm_fx[m] = L_sub( L_sub( L_add( log_weights_music_compute[m], log_det_chol_music_fx[m] ), L_shl( lprob_fx, sub( Q18 - 1, sub( Q31, lprob_exp ) ) ) ), HALF_N_PCA_COEF_LOG_P12_Q18 ); // Q18 -#else - wprob_fx = dot_product_cholesky_fixed( fvm_fx, &prec_chol_music_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); // Q10 - pm_fx[m] = L_sub( L_sub( L_add( log_weights_music_compute[m], log_det_chol_music_fx[m] ), W_extract_l( W_shr( wprob_fx, Q10 ) ) ), HALF_N_PCA_COEF_LOG_P12_Q18 ); // Q18 -#endif + wprob_fx = dot_product_cholesky_fx( fvm_fx, &prec_chol_music_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); // Q10 + pm_fx[m] = L_sub( L_sub( L_add( log_weights_music_compute[m], log_det_chol_music_fx[m] ), W_extract_l( W_shr( wprob_fx, Q10 ) ) ), HALF_N_PCA_COEF_LOG_P12_Q18 ); // Q18 move32(); v_sub32_fx( FV_fx, &means_noise_fx[m * N_PCA_COEF], fvm_fx, N_PCA_COEF ); -#ifndef DOT_PROD_CHOLESKY_64BIT - lprob_exp = 0; - move16(); - lprob_fx = dot_product_cholesky_fixed( fvm_fx, &prec_chol_noise_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF, fvm_exp, 31 - 28, &lprob_exp ); - pn_fx[m] = L_sub( L_sub( L_add( log_weights_noise_compute[m], log_det_chol_noise_fx[m] ), L_shl( lprob_fx, sub( Q18 - 1, sub( Q31, lprob_exp ) ) ) ), HALF_N_PCA_COEF_LOG_P12_Q18 ); // Q18 -#else - wprob_fx = dot_product_cholesky_fixed( fvm_fx, &prec_chol_noise_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); // Q10 - pn_fx[m] = L_sub( L_sub( L_add( log_weights_noise_compute[m], log_det_chol_noise_fx[m] ), W_extract_l( W_shr( wprob_fx, Q10 ) ) ), HALF_N_PCA_COEF_LOG_P12_Q18 ); // Q18 -#endif + wprob_fx = dot_product_cholesky_fx( fvm_fx, &prec_chol_noise_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); // Q10 + pn_fx[m] = L_sub( L_sub( L_add( log_weights_noise_compute[m], log_det_chol_noise_fx[m] ), W_extract_l( W_shr( wprob_fx, Q10 ) ) ), HALF_N_PCA_COEF_LOG_P12_Q18 ); // Q18 move32(); } @@ -2258,21 +2211,12 @@ Word16 ivas_smc_gmm_fx( *high_lpn_flag = 1; move32(); } -#ifndef FIX_1297_OVERFLOW - hSpMusClas->lpm_fx = extract_l( L_shr( lpm_fx, 11 ) ); // Q7 - move16(); - hSpMusClas->lps_fx = extract_l( L_shr( lps_fx, 11 ) ); // Q7 - move16(); - hSpMusClas->lpn_fx = extract_l( L_shr( lpn_fx, 11 ) ); // Q7 - move16(); -#else - hSpMusClas->lpm_fx = extract_h( L_shl_sat( lpm_fx, 16 - 11 ) ); // Q7 + hSpMusClas->lpm_fx = extract_h( L_shl_sat( lpm_fx, 16 - 11 ) ); // Q7 move16(); hSpMusClas->lps_fx = extract_h( L_shl_sat( lps_fx, 16 - 11 ) ); // Q7 move16(); hSpMusClas->lpn_fx = extract_h( L_shl_sat( lpn_fx, 16 - 11 ) ); // Q7 move16(); -#endif /* determine HQ Generic speech class */ IF( st->hHQ_core != NULL ) { @@ -2655,18 +2599,13 @@ static Word16 attack_det_ivas_fx( /* o : attack flag Word16 *last_strong_attack /* i/o: last strong attack flag */ ) { - Word16 i, j, tmp, tmp1, attack, exp1; + Word16 i, j, tmp, tmp1, attack, exp1, etmp_e, etmp2_e, s; Word32 L_tmp, etmp, etmp2, finc[ATT_NSEG], mean_finc; Word16 att_3lsub_pos; Word16 attack1; Word64 W_tmp; Word16 q_diff; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - att_3lsub_pos = ATT_3LSUB_POS; move16(); if ( GE_32( total_brate, ACELP_24k40 ) ) @@ -2682,7 +2621,7 @@ static Word16 attack_det_ivas_fx( /* o : attack flag FOR( j = 1; j < ATT_SEG_LEN; j++ ) { - L_tmp = L_mac0_o( L_tmp, inp[i * ATT_SEG_LEN + j], inp[i * ATT_SEG_LEN + j], &Overflow ); /*2*Qx */ + L_tmp = L_mac0_sat( L_tmp, inp[i * ATT_SEG_LEN + j], inp[i * ATT_SEG_LEN + j] ); /*2*Qx */ } finc[i] = L_tmp; @@ -2708,29 +2647,42 @@ static Word16 attack_det_ivas_fx( /* o : attack flag exp1 = norm_s( att_3lsub_pos ); tmp = div_s( shl( 1, sub( 14, exp1 ) ), att_3lsub_pos ); /*Q(29-exp1) */ - L_tmp = L_shr_o( finc[0], Qx, &Overflow ); /*Qx */ - - FOR( i = 1; i < att_3lsub_pos; i++ ) + W_tmp = 0; + move64(); + FOR( i = 0; i < att_3lsub_pos; i++ ) { - L_tmp = L_add_o( L_tmp, L_shr_o( finc[i], Qx, &Overflow ), &Overflow ); /*Qx */ + W_tmp = W_add( W_tmp, finc[i] ); /* *q_ finc_prev */ } - L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(14-exp1+Qx) */ - etmp = L_shl( L_tmp, sub( exp1, 14 ) ); /*Qx */ + s = W_norm( W_tmp ); + L_tmp = W_extract_h( W_shl( W_tmp, s ) ); // *q_finc_prev + s - 32 + + L_tmp = Mpy_32_16_1( L_tmp, tmp ); /* *q_finc_prev + s - 32 + Q29 - exp1 - 15 => *q_finc_prev + s - exp1 - 18 */ + etmp = L_tmp; + move32(); + etmp_e = sub( 31, add( *q_finc_prev, sub( s, add( exp1, 18 ) ) ) ); + tmp1 = sub( ATT_NSEG, attack ); exp1 = norm_s( tmp1 ); tmp = div_s( shl( 1, sub( 14, exp1 ) ), tmp1 ); /*Q(29-exp1) */ - L_tmp = L_shr_o( finc[attack], Qx, &Overflow ); /*Qx */ - FOR( i = 1; i < tmp1; i++ ) + W_tmp = 0; + move64(); + FOR( i = 0; i < tmp1; i++ ) { - L_tmp = L_add_o( L_tmp, L_shr_o( finc[i + attack], Qx, &Overflow ), &Overflow ); /*Qx */ + W_tmp = W_add( W_tmp, finc[i + attack] ); /* *q_finc_prev */ } - L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(14-exp1+Qx) */ - etmp2 = L_shl( L_tmp, sub( exp1, 14 ) ); /*Qx */ + s = W_norm( W_tmp ); + L_tmp = W_extract_h( W_shl( W_tmp, s ) ); // *q_finc_prev + s - 32 + + L_tmp = Mpy_32_16_1( L_tmp, tmp ); /* *q_finc_prev + s - 32 + Q29 - exp1 - 15 => *q_finc_prev + s - exp1 - 18 */ + etmp2 = L_tmp; + move32(); + etmp2_e = sub( 31, add( *q_finc_prev, sub( s, add( exp1, 18 ) ) ) ); /* and compare them */ - if ( GT_32( etmp, L_shr( etmp2, 3 ) ) ) + /* if ( etmp * 8 > etmp2 ) */ + if ( BASOP_Util_Cmp_Mant32Exp( etmp, add( etmp_e, 3 ), etmp2, etmp2_e ) > 0 ) { /* stop, if the attack is not sufficiently strong */ attack = 0; @@ -2738,7 +2690,8 @@ static Word16 attack_det_ivas_fx( /* o : attack flag } test(); - if ( EQ_16( last_clas, VOICED_CLAS ) && GT_32( L_add( L_shl( etmp, 4 ), L_shl( etmp, 2 ) ), etmp2 ) ) + /* if ( last_clas == VOICED_CLAS && etmp * 20 > etmp2 ) */ + if ( EQ_16( last_clas, VOICED_CLAS ) && BASOP_Util_Cmp_Mant32Exp( etmp, etmp_e, Mpy_32_16_1( etmp2, 1638 /* 1/20 in Q15 */ ), etmp2_e ) > 0 ) { /* stop, if the signal was voiced and the attack is not sufficiently strong */ attack = 0; @@ -2995,11 +2948,11 @@ void ivas_smc_mode_selection_fx( ton = tonal_det_fx( S_map, st->vad_flag, hSpMusClas->tod_S_map_lt_fx, &hSpMusClas->tod_thr_lt_fx, &hSpMusClas->tod_weight_fx, &hSpMusClas->tod_S_mass_prev_fx, &hSpMusClas->tod_S_mass_lt_fx ); // Q22 /* calculate spectral peak-to-average ratio */ - Word16 shift = sub( add( Q_new, Q_SCALE - 2 ), st->hSpMusClas->Q_tod_lt_Bin_E ); + Word16 shift = sub( st->q_Bin_E, st->hSpMusClas->Q_tod_lt_Bin_E ); FOR( i = 0; i < TOD_NSPEC; i++ ) { // st->hSpMusClas->tod_lt_Bin_E[i] = P2A_FACT * st->hSpMusClas->tod_lt_Bin_E[i] + ( 1 - P2A_FACT ) * st->Bin_E[i]; - st->hSpMusClas->tod_lt_Bin_E_fx[i] = Madd_32_16( L_shl( Mpy_32_16_1( st->hSpMusClas->tod_lt_Bin_E_fx[i], P2A_FACT_FX_Q15 ), shift ), st->Bin_E_fx[i], ( 32767 - P2A_FACT_FX_Q15 ) ); // Q = Q_new + Q_SCALE - 2 + st->hSpMusClas->tod_lt_Bin_E_fx[i] = Madd_32_16( L_shl( Mpy_32_16_1( st->hSpMusClas->tod_lt_Bin_E_fx[i], P2A_FACT_FX_Q15 ), shift ), st->Bin_E_fx[i], ( 32767 - P2A_FACT_FX_Q15 ) ); // Q = st->q_Bin_E + Q_SCALE - 2 move32(); } st->hSpMusClas->Q_tod_lt_Bin_E = add( st->hSpMusClas->Q_tod_lt_Bin_E, shift ); @@ -3016,11 +2969,11 @@ void ivas_smc_mode_selection_fx( IF( LE_32( element_brate, IVAS_16k4 ) ) { - thr_sp2a = L_shl( THR_P2A_HIGH_FX, add( Q_new, Q_SCALE - 2 ) ); // Q = Q_new + Q_SCALE - 2 + thr_sp2a = L_shl( THR_P2A_HIGH_FX, st->q_Bin_E ); // Q = st->q_Bin_E } ELSE { - thr_sp2a = L_shl( THR_P2A_FX, add( Q_new, Q_SCALE - 2 ) ); // Q = Q_new + Q_SCALE - 2 + thr_sp2a = L_shl( THR_P2A_FX, st->q_Bin_E ); // Q = st->q_Bin_E } /* initial 3-way selection of coding modes (ACELP/GSC/TCX) */ @@ -3190,7 +3143,7 @@ void ivas_smc_mode_selection_fx( test(); test(); test(); - if ( EQ_16( st->vad_flag, 1 ) && LE_32( element_brate, IVAS_16k4 ) && GT_16( st->lp_noise_fx, 7680 /* 30.0f in Q8 */ ) && st->sp_aud_decision1 == 0 && GE_16( st->bwidth, SWB ) && EQ_16( st->coder_type_raw, UNVOICED ) ) + if ( EQ_16( st->vad_flag, 1 ) && LE_32( element_brate, IVAS_16k4 ) && GT_32( st->lp_noise_32fx, 503316480 /* 30.0f in Q24 */ ) && st->sp_aud_decision1 == 0 && GE_16( st->bwidth, SWB ) && EQ_16( st->coder_type_raw, UNVOICED ) ) { st->GSC_noisy_speech = 1; move16(); @@ -3709,10 +3662,6 @@ static void spec_analysis_fx( Word16 peak_idx[65]; Word16 valey_idx[65]; Word16 p2v[65]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* find spectral peaks */ k = 0; @@ -3795,7 +3744,7 @@ static void spec_analysis_fx( test(); IF( GT_16( peak_idx[k], valey_idx[i] ) && LT_16( peak_idx[k], valey_idx[i + 1] ) ) { - p2v[k] = sub_o( shl_o( peak[k], 1, &Overflow ), add_o( valley[i], valley[i + 1], &Overflow ), &Overflow ); + p2v[k] = sub_sat( shl_sat( peak[k], 1 ), add_sat( valley[i], valley[i + 1] ) ); move16(); k = add( k, 1 ); } @@ -4197,10 +4146,8 @@ static void tonal_context_improv_fx( Word32 L_tmp, tonality, tonality1, tonality2, tonality3, sort_max, sort_avg, sort_val[80]; VAD_HANDLE hVAD = st_fx->hVAD; SP_MUS_CLAS_HANDLE hSpMusClas = st_fx->hSpMusClas; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move16(); -#endif IF( EQ_16( st_fx->last_codec_mode, MODE2 ) ) { @@ -4649,7 +4596,7 @@ static void detect_sparseness_fx( Msp = shl( Msp, 5 ); /* Q8 */ /* find long-term smoothed sparseness */ - IF( st_fx->last_vad_spa_fx == 0 ) + IF( hSpMusClas->last_vad_spa == 0 ) { set16_fx( &hSpMusClas->sparse_buf_fx[0], sparse, HANG_LEN_INIT - 1 ); hSpMusClas->LT_sparse_fx = sparse; @@ -4904,7 +4851,7 @@ static void detect_sparseness_fx( move16(); } - st_fx->last_vad_spa_fx = localVAD_HE_SAD; + hSpMusClas->last_vad_spa = localVAD_HE_SAD; move16(); return; diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 7ca996af53c7db6dd4a011f7a13181b070cd564f..bcd7ed72cc1b9ced61ed6a65a5d2497184c9bea9 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef STAT_ENC_H @@ -54,6 +54,9 @@ typedef struct Word16 id; /* id of the indice */ UWord16 value; /* value of the quantized indice */ Word16 nb_bits; /* number of bits used for the quantization of the indice */ +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + char function_name[100]; +#endif } Indice, *INDICE_HANDLE; typedef struct @@ -92,9 +95,6 @@ typedef struct bitstream_enc_data_structure void *st_ivas; /* IVAS encoder structure */ // Word16 nb_bits_tot_fx; /* total number of bits already written */ // Indice *ind_list_fx; /* list of indices */ - Word16 next_ind_fx; /* pointer to the next empty slot in the list of indices */ - Word16 last_ind_fx; /* last written indice */ - } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; /*----------------------------------------------------------------------------------* @@ -223,7 +223,8 @@ typedef struct vad_structure Word16 trigger_SID; Word16 snr_sum_vad_fx; /*Q15 */ Word16 running_avg_fx; /*Q15 */ - Word32 L_snr_sum_vad_fx; /*Q4*/ + Word32 L_snr_sum_vad_fx; // EVS:Q4, IVAS:q_L_snr_sum_vad + Word16 q_L_snr_sum_vad; Word16 hangover_terminate_flag; /* CNG and DTX - flag indicating whether to early terminate DTX hangover */ Word16 vad_flag; /* VAD flag */ @@ -376,8 +377,9 @@ typedef struct fd_cng_enc_structure Word16 msNewMinFlag[NPART]; Word16 msPsdFirstMoment_fx[NPART]; Word32 msPsdSecondMoment_fx[NPART]; - Word16 msNoiseFloor_fx[NPART]; /* Estimated noise floor */ - Word32 msNoiseEst_fx[NPART]; /* Estimated noise level */ + Word16 msNoiseFloor_fx[NPART]; /* Estimated noise floor */ + Word32 msNoiseFloor_32fx[NPART]; /* Estimated noise floor IVAS: Q25*/ + Word32 msNoiseEst_fx[NPART]; /* Estimated noise level */ Word16 msNoiseEst_fx_exp; Word32 energy_ho_fx[NPART]; Word16 energy_ho_fx_exp; @@ -394,8 +396,9 @@ typedef struct fd_cng_enc_structure Word16 partDec[NPART]; Word16 msLogPeriodog_fx[NPART]; Word16 msLogNoiseEst_fx[NPART]; - Word32 mem_coherence_fx[4]; - Word16 mem_coherence_exp[4]; + Word32 msLogNoiseEst_32fx[NPART]; /*IVAS: Q25*/ + Word32 mem_coherence_fx[MDCT_ST_DTX_NUM_COHERENCE_BANDS][4]; + Word16 mem_coherence_exp[MDCT_ST_DTX_NUM_COHERENCE_BANDS][4]; } FD_CNG_ENC, *HANDLE_FD_CNG_ENC; @@ -535,8 +538,9 @@ typedef struct noise_estimation_structure Word32 ave_enr_fx[NB_BANDS]; /* Q_new + Q_SCALE Noise estimator - long-term average energy per critical band ave_enr_q */ Word16 ave_enr_q; - Word16 aEn; /* Noise estimator - noise estimator adaptation flag */ - Word16 totalNoise_fx; /* Q8 Noise estimator - total noise energy */ + Word16 aEn; /* Noise estimator - noise estimator adaptation flag */ + Word16 totalNoise_fx; /* Q8 Noise estimator - total noise energy */ + Word32 totalNoise_32fx; /* Q24 Noise estimator - total noise energy */ Word16 first_noise_updt; /* Noise estimator - flag used to determine if the first noise update frame */ Word16 first_noise_updt_cnt; /* Noise estimator - counter of frame after first noise update */ @@ -544,8 +548,11 @@ typedef struct noise_estimation_structure Word16 bg_cnt; /* Noise estimator - pause length counter */ Word16 Etot_l_fx; /* Q8 Noise estimator - Track energy from below */ Word16 Etot_h_fx; /* Q8 Noise estimator - Track energy from above */ - Word16 Etot_l_lp_fx; /* Q8 Noise estimator - Smoothed low energy */ - Word16 Etot_last_fx; /*Q8*/ + Word32 Etot_l_32fx; /* Q24 Noise estimator - Track energy from below */ + Word16 Etot_l_lp_fx; /* EVS- Q8 Noise estimator - Smoothed low energy */ + Word32 Etot_l_lp_32fx; /* IVAS-Q24 Noise estimator - Smoothed low energy */ + Word16 Etot_last_fx; /*EVS- Q8*/ + Word32 Etot_last_32fx; /* IVAS - Q24*/ Word16 Etot_lp_fx; /* Q8 Noise estimator - Filtered input energy */ Word16 lt_tn_track_fx; /* Q15 */ @@ -561,6 +568,7 @@ typedef struct noise_estimation_structure Word16 lt_aEn_zero_fx; /* Q15 */ Word16 Etot_v_h2_fx; + Word32 Etot_v_h2_32fx; /* Q24 */ Word16 sign_dyn_lp_fx; /*Q8*/ Word16 Etot_st_est_fx; /* Q8 Noise estimation - short term estimate of E{ Etot } */ @@ -700,11 +708,6 @@ typedef struct sp_mus_clas_structure typedef struct lpd_state_structure { - -#ifndef MSAN_FIX - Word16 nbits; /* number of bits used by ACELP or TCX */ -#endif - /* signal memory */ Word16 syn[1 + M]; /* Synthesis memory (non-pe) */ Word16 q_lpd_syn; @@ -798,7 +801,6 @@ typedef struct hq_enc_structure Word16 last_env_fx[BANDS_MAX]; /* Q1 */ Word16 last_max_pos_pulse; - } HQ_ENC_DATA, *HQ_ENC_HANDLE; /* PVQ range coder state */ @@ -1002,6 +1004,13 @@ typedef struct td_bwe_enc_structure Word16 gain_prec_swb_fx; /* Q14 */ Word16 mem_zero_swb_fx[LPC_SHB_ORDER]; + Word16 prev_lsp_wb_fx[LPC_SHB_ORDER_WB]; + Word16 prev_lpc_wb_fx[LPC_SHB_ORDER_WB]; + Word16 prev_lsp_wb_temp_fx[LPC_SHB_ORDER_WB]; + + Word16 prev_Q_bwe_exc; + Word16 prev_Q_bwe_syn; + } TD_BWE_ENC_DATA, *TD_BWE_ENC_HANDLE; @@ -1012,10 +1021,8 @@ typedef struct td_bwe_enc_structure typedef struct fd_bwe_enc_structure { Word16 new_input_hp_fx[NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS )]; // Q_new_input_hp -#ifdef FIX_ISSUE_1230 Word16 Q_new_input_hp; -#endif - Word16 old_input_fx[NS2SA( 48000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS )]; // q0 + Word16 old_input_fx[NS2SA( 48000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS )]; // st->q_inp Word16 old_input_wb_fx[NS2SA( 16000, DELAY_FD_BWE_ENC_NS )]; /* Q(-1) */ Word16 old_input_lp_fx[NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS )]; // st->hBWE_FD->prev_Q_input_lp Word16 old_syn_12k8_16k_fx[NS2SA( 16000, DELAY_FD_BWE_ENC_NS )]; // st->Q_syn @@ -1149,20 +1156,17 @@ typedef struct tcx_enc_structure Word16 transform_type[2]; /* TCX20/10/5 mode in each subframe */ /* Core Signal Analysis Outputs */ - Word16 noiseTiltFactor; /* compensation for LPC tilt in noise filling Q15 */ Word16 noiseLevelMemory_cnt; /* counter of consecutive low TCX noise levels */ Word16 ltpGainMemory_fx[N_LTP_GAIN_MEMS]; /* for smoothing noiseTransWidth Q15 */ STnsData tnsData[2]; - // Word16 fUseTns[2]; + Word8 fUseTns[2]; Word16 bTnsOnWhithenedSpectra[2]; - // Word16 memQuantZeros[L_FRAME_PLUS]; /* Quantization deadzone flags */ Word8 memQuantZeros[L_FRAME_PLUS]; /* Quantization deadzone flags */ Word16 *speech_TCX; Word16 *new_speech_TCX; - // Word16 q_speech_TCX; Word16 tcxltp; Word16 tcxltp_pitch_int; @@ -1215,17 +1219,10 @@ typedef struct tcx_enc_structure Word32 spectrum_long_fx[N_MAX]; /* MDCT output for a long block. Points to spectrum */ Word16 spectrum_long_e; /* MDCT output for a long block. Points to spectrum */ Word16 q_spectrum_long_fx; + Word16 spectrum_length; /* corresponds to L_frameTCX, used for scaling of MDCT/MDST buffers */ + } TCX_ENC_DATA, *TCX_ENC_HANDLE; -typedef struct TransientDetection -{ - /** Transient detector. */ - TransientDetector transientDetector; - /** Delay buffer used by the transient detectors. */ - DelayBuffer delayBuffer; - /** Subblock energies used by the transient detector. */ - SubblockEnergies subblockEnergies; -} TransientDetection; /*----------------------------------------------------------------------------------* * @@ -1239,13 +1236,12 @@ typedef struct enc_core_structure * Common parameters *----------------------------------------------------------------------------------*/ - Word16 idchan; /* channel ID (audio channel number) */ - Word16 id_element; /* element ID */ + Word16 idchan; /* channel ID (audio channel number) */ +#ifdef DEBUGGING + Word16 id_element; /* element ID */ +#endif Word16 element_mode; /* element mode */ - Word16 last_element_mode; /* element mode */ Word32 element_brate; /* element bitrate */ - Word16 extl_orig; /* extension layer */ - Word32 extl_brate_orig; /* extension layer bitrate */ Word16 codec_mode; /* Mode1 or Mode2 */ Word16 last_codec_mode; /* previous frame Mode 1 or 2 */ Word16 last_codec_mode_cng; /* previous inactive frame Mode 1 or 2 */ @@ -1254,9 +1250,7 @@ typedef struct enc_core_structure Word16 mdct_sw_enable; /* MDCT switching enable flag */ Word16 mdct_sw; /* MDCT switching indicator */ - BSTR_ENC_HANDLE hBstr; /* encoder bitstream handle */ - Word16 last_enerBuffer_exp; - + BSTR_ENC_HANDLE hBstr; /* encoder bitstream handle */ Word16 bitstreamformat; /* Bitstream format flag (G.192/MIME) */ Word16 next_bit_pos_fx; /* position of the next bit to be written in the bitstream */ @@ -1295,35 +1289,8 @@ typedef struct enc_core_structure char *force_dir; /* directory containing external binary files for modes/parameters enforcement (empty string indicates no enforcement) */ #endif #endif - Word16 nTimeSlots; /* for CLDFB */ - Word16 ini_frame; /* initialization frames counter */ - // Word32 input_Fs_fx; /* input signal sampling frequency in Hz */ - // Word32 total_brate_fx; /* total bitrate in kbps of the codec */ - // Word32 last_total_brate_fx; /* total bitrate in kbps of the codec */ - // Word32 last_total_brate_cng_fx; /* total bitrate in kbps of the last inactive frame */ - // Word16 core_fx; /* core (ACELP_CORE, TCX_20_CORE, TCX_10_CORE, HQ_CORE, AMR_WB_CORE) */ - // Word32 core_brate_fx; /* core bitrate */ - // Word32 last_core_brate_fx; /* previous frame core bitrate */ - Word16 input_frame_fx; /* Frame lenght (function of input_Fs) */ - // Word16 extl_fx; /* extension layer */ - // Word16 last_extl_fx; /* previous extension layer */ - // Word32 extl_brate_fx; /* extension layer bitrate */ - // Word16 input_bwidth_fx; /* input signal bandwidth */ - // Word16 last_input_bwidth_fx; /* input signal bandwidth in the previous frame */ - // Word16 bwidth_fx; /* encoded bandwidth NB, WB, SWB or FB */ - // Word16 max_bwidth_fx; /* maximum encoded bandwidth */ - // Word16 last_bwidth_fx; /* input signal bandwidth in the previous frame */ - // Word16 last_bwidth_cng_fx; /* input signal bandwidth in the previous inactive frame */ - // Word16 L_frame_fx; /* ACELP core internal frame length */ - // Word16 Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ - // Word16 Opt_DTX_ON_fx; /* flag indicating DTX operation */ - // Word16 cng_type; /* flag indicating LP or CLDFB based SID/CNG */ - Word16 active_fr_cnt_fx; /* counter of active frames */ - // Word16 Opt_SC_VBR_fx; /* flag indicating SC-VBR mode */ - // Word16 last_Opt_SC_VBR_fx; /* flag indicating SC-VBR mode in the last frame */ - /*----------------------------------------------------------------------------------* * ACELP core parameters *----------------------------------------------------------------------------------*/ @@ -1334,27 +1301,25 @@ typedef struct enc_core_structure Word16 fmerit_dt; /* signal classification score difference Q15 */ Word16 Nb_ACELP_frames; - Word16 pitch[3]; /* open-loop pitch values @12.8 kHz for three half-frames */ - // Word16 pitch_fx[3]; + Word16 pitch[3]; /* open-loop pitch values @12.8 kHz for three half-frames */ Word16 voicing_fx[3]; /* open-loop normalized correlation values for three half-frames Q15 */ LPD_state_HANDLE hLPDmem; /* ACELP LPDmem memories */ - Word32 Bin_E_fx[L_FFT]; /* Q_new + Q_SCALE -2 per bin energy of two frames */ - Word16 q_Bin_E; /* Q_new + Q_SCALE -2 per bin energy of two frames */ - Word16 lsp_old1_fx[M]; /* old unquantized LSP vector at the end of the frame Q15 */ - Word16 lsf_old1_fx[M]; /* old LSF vector at the end of the frame Qlog2(2.56) */ - Word16 lsp_old_fx[M]; /* old LSP vector at the end of the frame Q15 */ - Word16 lsf_old_fx[M]; /* old LSF vector at the end of the frame Qlog2(2.56) */ - Word16 lsp_old16k_fx[M]; /* old LSP vector at the end of the frame @16kHz Q15 */ - Word16 lspold_enc_fx[M]; /* old LSP vector at the end of the frame @16kHz Q15 */ - Word16 pstreaklen; /* LSF quantizer */ - Word16 streaklimit_fx; /* LSF quantizer Q15 */ - Word16 stab_fac_fx; /* LSF stability factor Q15 */ - Word16 clip_var_fx[6]; /* pitch gain clipping memory [2.56x,Q14,Q8,Q0,Q14,Q14] */ - Word16 mem_AR_fx[M]; /* AR memory of LSF quantizer (past quantized LSFs without mean) Qlog2(2.56) */ - Word16 mem_MA_fx[M]; /* MA memory of LSF quantizer (past quantized residual) (used also in AMR-WB IO mode) Qlog2(2.56) */ - // Word16 pstreaklen_fx; /* LSF quantizer */ + Word32 Bin_E_fx[L_FFT]; /* Q_new + Q_SCALE -2 per bin energy of two frames */ + Word16 q_Bin_E; /* Q_new + Q_SCALE -2 per bin energy of two frames */ + Word16 lsp_old1_fx[M]; /* old unquantized LSP vector at the end of the frame Q15 */ + Word16 lsf_old1_fx[M]; /* old LSF vector at the end of the frame Qlog2(2.56) */ + Word16 lsp_old_fx[M]; /* old LSP vector at the end of the frame Q15 */ + Word16 lsf_old_fx[M]; /* old LSF vector at the end of the frame Qlog2(2.56) */ + Word16 lsp_old16k_fx[M]; /* old LSP vector at the end of the frame @16kHz Q15 */ + Word16 lspold_enc_fx[M]; /* old LSP vector at the end of the frame @16kHz Q15 */ + Word16 pstreaklen; /* LSF quantizer */ + Word16 streaklimit_fx; /* LSF quantizer Q15 */ + Word16 stab_fac_fx; /* LSF stability factor Q15 */ + Word16 clip_var_fx[6]; /* pitch gain clipping memory [2.56x,Q14,Q8,Q0,Q14,Q14] */ + Word16 mem_AR_fx[M]; /* AR memory of LSF quantizer (past quantized LSFs without mean) Qlog2(2.56) */ + Word16 mem_MA_fx[M]; /* MA memory of LSF quantizer (past quantized residual) (used also in AMR-WB IO mode) Qlog2(2.56) */ Word32 offset_scale1_fx[MAX_NO_MODES + 1][MAX_NO_SCALES + 1]; /* offsets for LSF LVQ structure 1st 8-dim subvector*/ Word32 offset_scale2_fx[MAX_NO_MODES + 1][MAX_NO_SCALES + 1]; /* offsets for LSF LVQ structure 2nd 8-dim subvector*/ Word32 offset_scale1_p_fx[MAX_NO_MODES_p + 1][MAX_NO_SCALES + 1]; /* offsets for LSF LVQ structure, pred. case, 1st 8-dim subvector*/ @@ -1362,20 +1327,20 @@ typedef struct enc_core_structure Word16 no_scales_fx[MAX_NO_MODES][2]; /* LSF LVQ structure Q0*/ Word16 no_scales_p_fx[MAX_NO_MODES_p][2]; /* LSF LVQ structure Q0*/ - Word16 mem_preemph_fx; /* preemphasis filter memory Q(-1) */ + Word16 mem_preemph_fx; /* preemphasis filter memory Q(-1) */ + Word16 mem_q; /* preemphasis filter memory Q(-1) */ + Word16 mem_preemph_q; /* preemphasis filter memory Q(-1) */ + Word16 mem_preemph_fx_q_inp; /* preemphasis filter memory Q(-1) */ Word16 old_wsp_fx[L_WSP_MEM]; /* old weighted signal vector */ Word16 exp_old_wsp; Word16 Q_old_wsp2; - /*Word16 old_exc_fx[L_EXC_MEM];*/ /* old excitation vector */ Word16 old_wsp2_fx[( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM]; /* old decimated weighted signal vector qwsp */ Word16 mem_wsp_fx; /* weighted signal vector memory */ Word16 mem_wsp_q; - Word16 mem_decim2_fx[3]; /* weighted signal decimation filter memory qwsp */ - Word16 mem_deemph_fx; /* deemphasis filter memory */ - Word32 mem_hp20_in_fx[5]; /* HP filter memory for AMR-WB IO */ - Word16 mCb1_fx; /* LSF quantizer - counter of stationary frames after a transition frame */ - Word16 GSC_noisy_speech; /* AC mode (GSC) - flag to indicate GSC on SWB noisy speech */ + Word16 mem_decim2_fx[3]; /* weighted signal decimation filter memory qwsp */ + Word16 mCb1_fx; /* LSF quantizer - counter of stationary frames after a transition frame */ + Word16 GSC_noisy_speech; /* AC mode (GSC) - flag to indicate GSC on SWB noisy speech */ Word16 GSC_IVAS_mode; GSC_ENC_HANDLE hGSCEnc; @@ -1384,7 +1349,6 @@ typedef struct enc_core_structure Word16 lsfoldbfi1_fx[M]; /* FEC - LSF vector of the past previous frame Qlog2(2.56) */ Word16 lsf_adaptive_mean_fx[M]; /* FEC - adaptive mean LSF vector for FEC Qlog2(2.56) */ Word16 next_force_safety_net; /* FEC - flag to force safety net in next frame */ - // Word16 next_force_safety_net_fx; /* FEC - flag to force safety net in next frame */ Word16 uv_count; /* Stationary noise UV modification - unvoiced counter */ Word16 act_count; /* Stationary noise UV modification - activation counter */ @@ -1414,7 +1378,6 @@ typedef struct enc_core_structure Word16 old_Aq_12_8_fx[M + 1]; /* Q12 old Aq[] for core switching */ Word16 old_Es_pred_fx; /* old Es_pred for core switching Q8 */ Word16 music_hysteresis_fx; /* Counter of frames after AUDIO coding mode to prevent UC */ - Word16 last_vad_spa_fx; Word16 last_L_frame; /* ACELP@16kHz - last L_frame value */ Word16 mem_preemph16k_fx; /* ACELP@16kHz - preemphasis filter memory @16kHz Q-1 */ @@ -1437,8 +1400,8 @@ typedef struct enc_core_structure Word32 diff_sm_fx; /* Q7 */ Word32 energy_sm_fx; /* Q7 */ + Word16 sharpFlag; - Word16 finalVAD; Word16 flag_noisy_speech_snr; /* encoder detector for noisy speech */ Word16 Pos_relE_cnt; /* Number of frames between relE */ @@ -1455,19 +1418,22 @@ typedef struct enc_core_structure Word16 q_inp32; Word16 q_inp; Word16 *old_input_signal_fx; + Word32 *old_input_signal32_fx; Word16 q_old_inp; + Word16 q_old_inp32; Word16 Q_old_wtda; SIGNAL_BUFFERS_ENC_HANDLE hSignalBuf; Word32 *Bin_E_old_fx; /* per bin energy of old 2nd frames */ Word16 q_Bin_E_old; - Word16 *mem_decim_fx; /* decimation filter memory Q(-1) */ - Word16 *mem_decim16k_fx; /* ACELP@16kHz - decimation filter memory @16kHz Q(-1) */ - Word16 *old_inp_12k8_fx; /* memory of input signal at 12.8kHz */ - Word16 *old_inp_16k_fx; /* ACELP@16kHz - memory of input signal @16 kHz */ + Word16 *mem_decim_fx; /* decimation filter memory Q(-1) */ + Word16 mem_decim_fx_q_inp[2 * L_FILT_MAX]; /* decimation filter memory Q(-1) */ + Word16 *mem_decim16k_fx; /* ACELP@16kHz - decimation filter memory @16kHz Q(-1) */ + Word16 *old_inp_12k8_fx; /* memory of input signal at 12.8kHz */ + Word16 *old_inp_16k_fx; /* ACELP@16kHz - memory of input signal @16 kHz */ Word16 *buf_speech_enc_pe; // exp_buf_speech_enc_pe - Word16 *buf_synth; /*can be reduced to PIT_MAX_MAX+L_FRAME_MAX if no rate switching*/ + Word16 *buf_synth; /* can be reduced to PIT_MAX_MAX+L_FRAME_MAX if no rate switching*/ Word16 *buf_speech_enc; // exp_buf_speech_enc Word16 *buf_wspeech_enc; // exp_buf_wspeech_enc @@ -1478,6 +1444,8 @@ typedef struct enc_core_structure Word16 exp_buf_wspeech_enc; Word16 exp_buf_synth; + Word16 lgBin_E_fx[L_FFT / 2]; /* Q8 per bin energy of two frames */ + /*----------------------------------------------------------------------------------* * Noise estimation *----------------------------------------------------------------------------------*/ @@ -1490,8 +1458,6 @@ typedef struct enc_core_structure SP_MUS_CLAS_HANDLE hSpMusClas; - Word16 lgBin_E_fx[L_FFT / 2]; /* Q8 per bin energy of two frames */ - Word16 sp_aud_decision0; /* 1st stage speech/music decision flag */ Word16 sp_aud_decision1; /* 1st stage speech/music classification flag */ Word16 sp_aud_decision2; /* 2nd stage speech/music classification flag */ @@ -1503,21 +1469,16 @@ typedef struct enc_core_structure VAD_HANDLE hVAD; VAD_CLDFB_HANDLE hVAD_CLDFB; - T_CldfbVadState vad_st; Word16 vad_flag; /* i : VAD flag */ - Word16 sharpFlag; Word16 localVAD; /* i : local VAD flag */ - Word32 bckr_tilt_lt; /* Q16 */ - Word16 lp_speech_fx; /* Q8 */ - Word16 lp_noise_fx; /* CNG and DTX - LP filtered total noise estimation Q8 */ - Word16 Opt_HE_SAD_ON_fx; - Word16 nb_active_frames_HE_SAD_fx; - Word16 voicing_old_fx; - Word16 var_SID_rate_flag_fx; /* CNG and DTX - flag for variable SID rate */ - Word16 interval_SID_fx; - Word16 active_cnt; /* counter of active frames */ + Word32 bckr_tilt_lt; /* Q16 */ + Word16 lp_speech_fx; /* Q8 */ + Word16 lp_noise_fx; /* CNG and DTX - LP filtered total noise estimation Q24 */ + Word32 lp_speech_32fx; /* Q24 */ + Word32 lp_noise_32fx; /* CNG and DTX - LP filtered total noise estimation Q24 */ + Word16 active_cnt; /* counter of active frames */ TD_CNG_ENC_HANDLE hTdCngEnc; @@ -1535,9 +1496,6 @@ typedef struct enc_core_structure HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc; /* main analysis filter bank handle */ HANDLE_CLDFB_FILTER_BANK cldfbSynTd; /* synthesis filterbank - used for HB signal generation */ - // HANDLE_CLDFB_FILTER_BANK cldfbAna_Fx; - - // HANDLE_CLDFB_FILTER_BANK cldfbSyn_Fx; /*----------------------------------------------------------------------------------* * FD CNG handle @@ -1568,7 +1526,6 @@ typedef struct enc_core_structure HQ_ENC_HANDLE hHQ_core; /* HQ core encoder handle */ - PVQ_ENC_HANDLE hPVQ; /*----------------------------------------------------------------------------------* * TD BWE parameters *----------------------------------------------------------------------------------*/ @@ -1667,13 +1624,11 @@ typedef struct enc_core_structure Word16 inv_gamma; /* Q14 */ TRAN_DET_HANDLE hTranDet; - TransientDetection transientDetection; - Word16 transient_info[3]; + Word16 acelpFramesCount; Word16 prevTempFlatness_fx; /* exponent is AVG_FLAT_E Q7 in EVS */ /* Q4 in IVAS */ Word32 prevTempFlatness_32fx; /* Q21 in IVAS */ - // float currEnergyLookAhead; Word32 currEnergyLookAhead_fx; // Q31 Word32 prevEnergyHF_fx; Word32 currEnergyHF_fx; @@ -1692,7 +1647,6 @@ typedef struct enc_core_structure Word16 encoderLookahead_FB; /* pitch_ol for adaptive lag window */ - Word16 old_pitch_la; /* past open loop pitch lag from look-ahead before very short stable pitch detection */ Word16 old_voicing_la; /* past open loop pitch gain from look-ahead */ @@ -1769,11 +1723,11 @@ typedef struct enc_core_structure * IVAS parameters *---------------------------------------------------------------*/ - Word16 tdm_LRTD_flag; /* LRTD stereo mode flag */ - Word16 cna_dirac_flag; /* CNA in DirAC flag */ + Word16 tdm_LRTD_flag; /* LRTD stereo mode flag */ /* stereo switching memories */ Word16 mem_preemph_DFT_fx; /* Q(-1) */ + Word16 mem_preemph_DFT_fx_q_inp; /* Q(-1) */ Word16 inp_12k8_mem_stereo_sw_fx[STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT]; /* Q(-1) */ Word16 mem_preemph16k_DFT_fx; /* Q(-1) */ Word16 inp_16k_mem_stereo_sw_fx[STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k]; /* Q(-1) */ @@ -1785,16 +1739,13 @@ typedef struct enc_core_structure Word16 dtx_sce_sba; /* enable use of FD CNG with transform domain cores in SCE SBA */ + Word16 sba_br_sw_while_no_data; /* Indicator for SBA bitrate switch while in FRAME_NO_DATA mode */ + /*----------------------------------------------------------------------------------* * Fixed point only variables *----------------------------------------------------------------------------------*/ - Word16 last_ener_fx; /* AC mode (GSC) - previous energy */ - Word16 Q_exc; - - Word16 prev_Q_bwe_exc; - Word16 prev_Q_bwe_syn; Word16 Q_stat_noise_ge; Word16 Q_stat_noise; Word16 Q_syn2; @@ -1808,13 +1759,8 @@ typedef struct enc_core_structure Word16 prev_Q_new; Word16 prev_Q_shb; Word16 Q_max_enc[2]; - Word16 EnergyLT_fx_exp; - Word16 prev_lsp_wb_fx[LPC_SHB_ORDER_WB]; - Word16 prev_lpc_wb_fx[LPC_SHB_ORDER_WB]; - Word16 prev_lsp_wb_temp_fx[LPC_SHB_ORDER_WB]; - - Word16 sba_br_sw_while_no_data; /* Indicator for SBA bitrate switch while in FRAME_NO_DATA mode */ + Word16 last_enerBuffer_exp; } Encoder_State, *ENC_CORE_HANDLE; diff --git a/lib_enc/stat_noise_uv_enc_fx.c b/lib_enc/stat_noise_uv_enc_fx.c index 0a20db8edddf25e93b17485f43ff53037422e996..126e5cf8e2a63c6b37f53f29b04bc9ffb2d358e2 100644 --- a/lib_enc/stat_noise_uv_enc_fx.c +++ b/lib_enc/stat_noise_uv_enc_fx.c @@ -1,12 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" #include "cnst.h" -//#include "prot_fx.h" /* Function prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -37,6 +35,7 @@ /* RETURN ARGUMENTS : */ /* _ None */ /*=======================================================================*/ + void stat_noise_uv_enc_fx( Encoder_State *st_fx, /* i/o: state structure */ const Word32 *LepsP, /* i : LP prediction errors */ @@ -50,27 +49,24 @@ void stat_noise_uv_enc_fx( Word16 noisiness = 0; move16(); Word16 num, den, expn, expd; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif + test(); test(); test(); IF( ( EQ_16( st_fx->coder_type, UNVOICED ) && uc_two_stage_flag == 0 ) || ( EQ_16( st_fx->coder_type, INACTIVE ) && LE_32( st_fx->core_brate, ACELP_9k60 ) ) ) { - /*-----------------------------------------------------------------* * Calculate and write the noisiness parameter *-----------------------------------------------------------------*/ + /* epsP[2] is located in LepsP[0] and epsP[16] in LepsP[1] */ expn = sub( norm_l( LepsP[0] ), 1 ); - num = extract_h( L_shl_o( LepsP[0], expn, &Overflow ) ); /*expn-16*/ + num = extract_h( L_shl( LepsP[0], expn ) ); /*expn-16*/ expd = norm_l( LepsP[1] ); - den = extract_h( L_shl_o( LepsP[1], expd, &Overflow ) ); /*expd-16*/ - num = div_s( num, den ); /*expn-expd+15*/ - num = shr_o( num, add( sub( expn, expd ), 5 ), &Overflow ); /*Q10*/ - num = sub( num, 1024 ); /*num - 1*/ + den = extract_h( L_shl( LepsP[1], expd ) ); /*expd-16*/ + num = div_s( num, den ); /*expn-expd+15*/ + num = shr_sat( num, add( sub( expn, expd ), 5 ) ); /*Q10*/ + num = sub( num, 1024 ); /*num - 1*/ test(); IF( NE_16( st_fx->bwidth, NB ) ) @@ -94,7 +90,7 @@ void stat_noise_uv_enc_fx( noisiness = s_max( noisiness, 0 ); noisiness = s_min( noisiness, 31 ); - push_indice_fx( st_fx->hBstr, IND_NOISINESS, noisiness, 5 ); + push_indice( st_fx->hBstr, IND_NOISINESS, noisiness, 5 ); } /*-----------------------------------------------------------------* @@ -111,39 +107,36 @@ void stat_noise_uv_enc_fx( void stat_noise_uv_enc_ivas_fx( - Encoder_State *st_fx, /* i/o: state structure */ + Encoder_State *st_fx, /* i/o: state structure */ const Word32 *LepsP, /* i : LP prediction errors Q=Qx*/ const Word16 *isp_new, /* i : immittance spectral pairs at 4th sfr Q=15*/ const Word16 *isp_mid, /* i : immittance spectral pairs at 2nd sfr Q=15*/ Word16 *Aq, /* i : A(z) quantized for the 4 subframes Q=12 */ Word16 *exc2, /* i/o: excitation buffer Q=Q_stat_noise */ - const Word16 uc_two_stage_flag, /* o : flag undicating two-stage UC */ - Word16 Q_new ) + const Word16 uc_two_stage_flag, /* o : flag undicating two-stage UC */ + Word16 *Q_new ) { Word16 noisiness = 0; move16(); Word16 num, den, expn, expd; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + test(); test(); test(); IF( ( EQ_16( st_fx->coder_type, UNVOICED ) && uc_two_stage_flag == 0 ) || ( EQ_16( st_fx->coder_type, INACTIVE ) && LE_32( st_fx->core_brate, ACELP_9k60 ) ) ) { - /*-----------------------------------------------------------------* * Calculate and write the noisiness parameter *-----------------------------------------------------------------*/ + /* epsP[2] is located in LepsP[0] and epsP[16] in LepsP[1] */ expn = sub( norm_l( LepsP[0] ), 1 ); - num = extract_h( L_shl_o( LepsP[0], expn, &Overflow ) ); /*expn-16*/ + num = extract_h( L_shl( LepsP[0], expn ) ); /*expn-16*/ expd = norm_l( LepsP[1] ); - den = extract_h( L_shl_o( LepsP[1], expd, &Overflow ) ); /*expd-16*/ - num = div_s( num, den ); /*expn-expd+15*/ - num = shr_o( num, add( sub( expn, expd ), 5 ), &Overflow ); /*Q10*/ - num = sub( num, 1024 ); /*num - 1*/ + den = extract_h( L_shl( LepsP[1], expd ) ); /*expd-16*/ + num = div_s( num, den ); /*expn-expd+15*/ + num = shr_sat( num, add( sub( expn, expd ), 5 ) ); /*Q10*/ + num = sub( num, 1024 ); /*num - 1*/ test(); IF( NE_16( st_fx->bwidth, NB ) ) diff --git a/lib_enc/subband_fft_fx.c b/lib_enc/subband_fft_fx.c index 8a6ee47abf132ef5e1d260b9325c8d8e13e4ecd0..daf9048a4df248ddea1a4ef5fb511142632fcba0 100644 --- a/lib_enc/subband_fft_fx.c +++ b/lib_enc/subband_fft_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -35,17 +35,10 @@ static void ComplexMult_16( const Word16 c1, const Word16 c2 ) { -#ifdef IMPROV_PRECISION_EVSBE - *y1 = mac_r( L_mult( x1, c1 ), x2, c2 ); - move16(); - *y2 = msu_r( L_mult( x2, c1 ), x1, c2 ); - move16(); -#else *y1 = add( mult( x1, c1 ), mult( x2, c2 ) ); move16(); *y2 = sub( mult( x2, c1 ), mult( x1, c2 ) ); move16(); -#endif } /*-------------------------------------------------------------------* * ffr_getSfWord32() diff --git a/lib_enc/swb_bwe_enc_fx.c b/lib_enc/swb_bwe_enc_fx.c index e0d84645895236cce9f93b1eaa9062c56a794ec2..6e4e8b391b18c386157accd005f101464f2bfe68 100644 --- a/lib_enc/swb_bwe_enc_fx.c +++ b/lib_enc/swb_bwe_enc_fx.c @@ -1,12 +1,11 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" #include "prot_fx.h" #include "cnst.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "stl.h" #include "prot_fx_enc.h" /* Function prototypes */ @@ -186,7 +185,7 @@ void wb_bwe_enc_fx( Q_synth = sub( add( sub( new_input_fx_exp, 16 ), scl ), 1 ); mode = WB_BWE_encoding_fx( coder_type, yorig_fx, WB_fenv_fx, st_fx, Q_synth, Q_synth ); - push_indice_fx( st_fx->hBstr, IND_WB_CLASS, sub( mode, 2 ), 1 ); + push_indice( st_fx->hBstr, IND_WB_CLASS, sub( mode, 2 ), 1 ); } hBWE_FD->prev_mode = mode; @@ -270,6 +269,7 @@ void swb_bwe_enc_ivas_fx( Word16 *old_input_16k_fx, /* i : input signal @16kHz for SWB BWE */ const Word16 *old_syn_12k8_16k_fx, /* i : ACELP core synthesis at 12.8kHz or 16kHz */ const Word16 *new_swb_speech_fx, /* i : original input signal at 32kHz */ + const Word16 Q_new_swb_speech, /* i : Q for new_swb_speech_fx */ Word16 *shb_speech_fx, /* i : SHB target signal (6-14kHz) at 16kHz */ Word16 Q_shb_speech, Word16 Q_slb_speech ) @@ -287,7 +287,7 @@ void swb_bwe_enc_ivas_fx( Word16 old_input_lp_fx[L_FRAME16k]; Word16 new_input_hp_fx[L_FRAME16k]; Word16 yorig_fx[L_FRAME48k]; - Word16 scl, new_input_fx_exp; + Word16 scl, new_input_fx_q; Word16 max; Word16 Sample_Delay_SWB_BWE; Word16 Sample_Delay_HP; @@ -302,14 +302,8 @@ void swb_bwe_enc_ivas_fx( Word16 fb_ener_adjust_fx; Word16 ener_adjust_quan_fx = 0; move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif Word16 fb_band_begin; -#ifdef FIX_ISSUE_1230 Word16 q_new_input_hp; -#endif FD_BWE_ENC_HANDLE hBWE_FD = st_fx->hBWE_FD; TD_BWE_ENC_HANDLE hBWE_TD = st_fx->hBWE_TD; @@ -385,7 +379,6 @@ void swb_bwe_enc_ivas_fx( Copy( old_input_16k_fx + L_INP_MEM + L_FRAME16k - Sample_Delay_LP, hBWE_FD->old_input_lp_fx, Sample_Delay_LP ); } -#ifdef FIX_ISSUE_1230 q_new_input_hp = s_min( Q_shb_speech, hBWE_FD->Q_new_input_hp ); IF( LT_16( Q_shb_speech, hBWE_FD->Q_new_input_hp ) ) { @@ -400,10 +393,6 @@ void swb_bwe_enc_ivas_fx( hBWE_FD->Q_new_input_hp = Q_shb_speech; move16(); -#else - Copy( hBWE_FD->new_input_hp_fx, new_input_hp_fx, Sample_Delay_HP ); - Copy( shb_speech_fx, &new_input_hp_fx[Sample_Delay_HP], L_FRAME16k - Sample_Delay_HP ); -#endif Copy( shb_speech_fx + L_FRAME16k - Sample_Delay_HP, hBWE_FD->new_input_hp_fx, Sample_Delay_HP ); new_input_fx = old_input_fx + Sample_Delay_SWB_BWE; Copy( hBWE_FD->old_input_fx, old_input_fx, Sample_Delay_SWB_BWE ); @@ -414,12 +403,13 @@ void swb_bwe_enc_ivas_fx( *----------------------------------------------------------------------*/ /* tilt returned in Q24 goto to Q11 */ - tilt_nb_fx = round_fx_o( L_shl_o( calc_tilt_bwe_fx( old_input_lp_fx, Q_slb_speech, st_fx->L_frame ), 3, &Overflow ), &Overflow ); + tilt_nb_fx = round_fx_sat( L_shl_sat( calc_tilt_bwe_fx( old_input_lp_fx, Q_slb_speech, st_fx->L_frame ), 3 ) ); + /*---------------------------------------------------------------------* * SWB BWE encoding * FB BWE encoding *---------------------------------------------------------------------*/ - new_input_fx_exp = 0; + new_input_fx_q = Q_new_swb_speech; move16(); test(); IF( ( EQ_16( st_fx->idchan, 1 ) ) && ( EQ_16( last_element_mode, IVAS_CPE_DFT ) ) ) @@ -431,21 +421,21 @@ void swb_bwe_enc_ivas_fx( } } /* MDCT of the core synthesis signal */ - wtda_fx( old_input_fx, &new_input_fx_exp, L_old_input_fx, hBWE_FD->L_old_wtda_swb_fx, + wtda_fx( old_input_fx, &new_input_fx_q, L_old_input_fx, hBWE_FD->L_old_wtda_swb_fx, &st_fx->Q_old_wtda, ALDO_WINDOW, ALDO_WINDOW, /* window overlap of current frame (0: full, 2: none, or 3: half) */ inner_frame ); /* DCT of the ACELP core synthesis */ - direct_transform_fx( L_old_input_fx, yorig_32, 0, inner_frame, &new_input_fx_exp, st_fx->element_mode ); + direct_transform_fx( L_old_input_fx, yorig_32, 0, inner_frame, &new_input_fx_q, st_fx->element_mode ); /* high-band gain control in case of BWS */ IF( st_fx->bwidth_sw_cnt > 0 ) { - v_multc_fixed_16( &yorig_32[L_FRAME16k], div_s( st_fx->bwidth_sw_cnt, BWS_TRAN_PERIOD ), &yorig_32[L_FRAME16k], sub( inner_frame, L_FRAME16k ) ); + v_multc_fx_16( &yorig_32[L_FRAME16k], div_s( st_fx->bwidth_sw_cnt, BWS_TRAN_PERIOD ), &yorig_32[L_FRAME16k], sub( inner_frame, L_FRAME16k ) ); } /* Convert to 16 Bits (Calc Shift Required to Stay within MAX_Q_NEW_INPUT) */ - scl = sub( 16 + 8, new_input_fx_exp ); + scl = sub( 16 + 8, new_input_fx_q ); /* Possible to Upscale? */ IF( scl > 0 ) { @@ -456,7 +446,7 @@ void swb_bwe_enc_ivas_fx( scl = s_min( Q_synth, scl ); } Copy_Scale_sig32_16( yorig_32, yorig_fx, inner_frame, scl ); - Q_synth = add( sub( new_input_fx_exp, 16 ), scl ); + Q_synth = add( sub( new_input_fx_q, 16 ), scl ); max = 0; move16(); Q_synth_hf = 0; @@ -513,11 +503,7 @@ void swb_bwe_enc_ivas_fx( { Q_shb = sub( Q_synth_hf, 4 ); } -#ifdef FIX_ISSUE_1230 Copy_Scale_sig( new_input_hp_fx, new_input_hp_fx, L_FRAME16k, sub( Q_shb, q_new_input_hp ) ); -#else - Copy_Scale_sig( new_input_hp_fx, new_input_hp_fx, L_FRAME16k, sub( Q_shb, Q_shb_speech ) ); -#endif /* FB BWE encoding */ IF( EQ_16( st_fx->extl, FB_BWE ) ) @@ -552,8 +538,8 @@ void swb_bwe_enc_ivas_fx( exp1 = norm_l( L_tmp ); L_tmp = L_shl( L_tmp, exp1 ); exp = sub( sub( 31, exp1 ), sub( 30, exp ) ); - L_tmp = Isqrt_lc( L_tmp, &exp ); /*31-exp */ - fb_ener_adjust_fx = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */ + L_tmp = Isqrt_lc( L_tmp, &exp ); /*31-exp */ + fb_ener_adjust_fx = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ } ELSE { @@ -569,12 +555,12 @@ void swb_bwe_enc_ivas_fx( IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) { SWB_BWE_encoding_ivas_fx( st_fx, old_input_fx, old_input_lp_fx, new_input_hp_fx, old_syn_12k8_16k_fx, yorig_32, - SWB_fenv_fx, tilt_nb_fx, 80, Q_slb_speech, Q_shb, new_input_fx_exp, new_input_fx_exp ); + SWB_fenv_fx, tilt_nb_fx, 80, Q_slb_speech, Q_shb, new_input_fx_q, new_input_fx_q ); } ELSE { SWB_BWE_encoding_ivas_fx( st_fx, old_input_fx, old_input_lp_fx, new_input_hp_fx, old_syn_12k8_16k_fx, yorig_32, - SWB_fenv_fx, tilt_nb_fx, 6, Q_slb_speech, Q_shb, new_input_fx_exp, new_input_fx_exp ); + SWB_fenv_fx, tilt_nb_fx, 6, Q_slb_speech, Q_shb, new_input_fx_q, new_input_fx_q ); } @@ -633,14 +619,8 @@ void swb_bwe_enc_fx( Word16 fb_ener_adjust_fx; Word16 ener_adjust_quan_fx = 0; move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - FD_BWE_ENC_HANDLE hBWE_FD = st_fx->hBWE_FD; - /*---------------------------------------------------------------------* * Delay the original input signal to be synchronized with ACELP core synthesis *---------------------------------------------------------------------*/ @@ -693,11 +673,13 @@ void swb_bwe_enc_fx( *----------------------------------------------------------------------*/ /* tilt returned in Q24 goto to Q11 */ - tilt_nb_fx = round_fx_o( L_shl_o( calc_tilt_bwe_fx( old_input_lp_fx, Q_slb_speech, st_fx->L_frame ), 3, &Overflow ), &Overflow ); + tilt_nb_fx = round_fx_sat( L_shl_sat( calc_tilt_bwe_fx( old_input_lp_fx, Q_slb_speech, st_fx->L_frame ), 3 ) ); + /*---------------------------------------------------------------------* * SWB BWE encoding * FB BWE encoding *---------------------------------------------------------------------*/ + new_input_fx_exp = 0; move16(); /* MDCT of the core synthesis signal */ @@ -815,8 +797,8 @@ void swb_bwe_enc_fx( L_tmp = L_shl( L_tmp, exp1 ); // exp = 31 - exp1 - ( 30 - exp ); exp = add( 31 - 30, sub( exp, exp1 ) ); - L_tmp = Isqrt_lc( L_tmp, &exp ); /*31-exp */ - fb_ener_adjust_fx = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */ + L_tmp = Isqrt_lc( L_tmp, &exp ); /*31-exp */ + fb_ener_adjust_fx = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ } ELSE { @@ -831,11 +813,13 @@ void swb_bwe_enc_fx( /* write FB BWE frame gain to the bitstream */ IF( EQ_16( st_fx->extl, FB_BWE ) ) { - push_indice_fx( st_fx->hBstr, IND_FB_SLOPE, idxGain, NUM_BITS_FB_FRAMEGAIN ); + push_indice( st_fx->hBstr, IND_FB_SLOPE, idxGain, NUM_BITS_FB_FRAMEGAIN ); } return; } + + /*==========================================================================*/ /* FUNCTION : static Word16 WB_BWE_fenv_q_fx() */ /*--------------------------------------------------------------------------*/ @@ -1017,11 +1001,6 @@ static Word16 FD_BWE_class_fx( /* o : FD BWE class Word16 sharplimit; Word16 numsharp, num, den; Word16 numharmonic, tmp, expn, expd, scale; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif - FD_BWE_ENC_HANDLE hBWE_FD = st_fx->hBWE_FD; mode = NORMAL; @@ -1056,25 +1035,25 @@ static Word16 FD_BWE_class_fx( /* o : FD BWE class { IF( hBWE_FD->prev_global_gain_fx == 0 ) { - gain_tmp = round_fx_o( L_shl_o( fGain, 30, &Overflow ), &Overflow ); /*Q14 */ + gain_tmp = round_fx_sat( L_shl_sat( fGain, 30 ) ); /*Q14 */ } ELSE { expn = norm_l( fGain ); - num = extract_h( L_shl_o( fGain, expn, &Overflow ) ); + num = extract_h( L_shl( fGain, expn ) ); expn = sub( sub( 30, expn ), shl( Q_shb, 1 ) ); expd = norm_l( hBWE_FD->prev_global_gain_fx ); - den = extract_h( L_shl_o( hBWE_FD->prev_global_gain_fx, expd, &Overflow ) ); + den = extract_h( L_shl( hBWE_FD->prev_global_gain_fx, expd ) ); expd = sub( sub( 30, expd ), shl( st_fx->prev_Q_shb, 1 ) ); scale = shr( sub( den, num ), 15 ); - num = shl_o( num, scale, &Overflow ); + num = shl_sat( num, scale ); expn = sub( expn, scale ); tmp = div_s( num, den ); expn = sub( expn, expd ); - gain_tmp = shl_o( tmp, sub( expn, 1 ), &Overflow ); /*Q14 */ + gain_tmp = shl_sat( tmp, sub( expn, 1 ) ); /*Q14 */ } test(); IF( EQ_16( hBWE_FD->prev_mode, TRANSIENT ) ) @@ -1163,9 +1142,9 @@ static Word16 FD_BWE_class_fx( /* o : FD BWE class move16(); } expd = norm_s( den ); - tmp = div_s( shl( 1, sub( 14, expd ) ), den ); /*Q(29-expd-Q_syn) */ - L_tmp = L_mult( tmp, peak ); /*Q(30-expd) */ - sharp = round_fx_o( L_shl_o( L_tmp, sub( expd, 4 ), &Overflow ), &Overflow ); /*Q10 */ + tmp = div_s( shl( 1, sub( 14, expd ) ), den ); /*Q(29-expd-Q_syn) */ + L_tmp = L_mult( tmp, peak ); /*Q(30-expd) */ + sharp = round_fx_sat( L_shl_sat( L_tmp, sub( expd, 4 ) ) ); /*Q10 */ } ELSE { @@ -1174,7 +1153,7 @@ static Word16 FD_BWE_class_fx( /* o : FD BWE class } test(); - IF( GT_16( sharp, 4608 ) && GT_16( peak, shl_o( 1, add( Q_syn, 3 ), &Overflow ) ) ) + IF( GT_16( sharp, 4608 ) && GT_16( peak, shl_sat( 1, add( Q_syn, 3 ) ) ) ) { k = add( k, 1 ); move16(); @@ -1361,10 +1340,7 @@ static void vqWithCand_w_fx( const Word16 *p_E_ROM_dico; Word16 dist, temp1; Word32 L_dist, L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + IF( flag ) { set32_fx( dist_min, MAX_32, surv ); /* FLT_MAX */ @@ -1380,14 +1356,14 @@ static void vqWithCand_w_fx( FOR( i = 0; i < E_ROM_dico_size; i++ ) { - dist = sub_o( x[0], *p_E_ROM_dico++, &Overflow ); /*Q8 */ - L_dist = L_mult( dist, w[0] ); /*Q22 */ - L_dist = Mult_32_16( L_dist, dist ); /*Q15 */ - L_dist = L_shr( L_dist, 10 ); /*Q5 */ + dist = sub_sat( x[0], *p_E_ROM_dico++ ); /*Q8 */ + L_dist = L_mult( dist, w[0] ); /*Q22 */ + L_dist = Mult_32_16( L_dist, dist ); /*Q15 */ + L_dist = L_shr( L_dist, 10 ); /*Q5 */ FOR( j = 1; j < dim; j++ ) { - temp1 = sub_o( x[j], *p_E_ROM_dico++, &Overflow ); + temp1 = sub_sat( x[j], *p_E_ROM_dico++ ); L_tmp = L_mult( temp1, w[j] ); /*Q22 */ L_tmp = Mult_32_16( L_tmp, temp1 ); /*Q15 */ L_dist = L_add( L_dist, L_shr( L_tmp, 10 ) ); /*Q5 */ @@ -1662,10 +1638,6 @@ static void msvq_interpol_fx( Word16 quant_select[SWB_FENV], w_env11[SWB_FENV / 2], w_env12[SWB_FENV / 2], tmp; Word32 L_tmp, distCand[N_CAND], L_dist, L_minDist; Word16 synth_energy[SWB_FENV]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* Extract target vector */ FOR( n_band = 0; n_band < DIM11; n_band++ ) @@ -1705,13 +1677,13 @@ static void msvq_interpol_fx( /* Extract vector for odd position */ FOR( n_band = 0; n_band < DIM11; n_band++ ) { - quant_tmp[n_band] = add_o( quant_tmp1[n_band], quant_tmp2[n_band], &Overflow ); + quant_tmp[n_band] = add_sat( quant_tmp1[n_band], quant_tmp2[n_band] ); move16(); } FOR( n_band = 0; n_band < DIM12 - 1; n_band++ ) { - tmp = add_o( quant_tmp[n_band], quant_tmp[n_band + 1], &Overflow ); /*Q8 */ + tmp = add_sat( quant_tmp[n_band], quant_tmp[n_band + 1] ); /*Q8 */ tmp = shr( tmp, 1 ); quant_tmp2[n_band] = sub( env_temp12[n_band], tmp ); move16(); /*Q8 */ @@ -1734,7 +1706,7 @@ static void msvq_interpol_fx( FOR( n_band = 0; n_band < DIM12 - 1; n_band++ ) { - tmp = add_o( quant_tmp[n_band], quant_tmp[n_band + 1], &Overflow ); + tmp = add_sat( quant_tmp[n_band], quant_tmp[n_band + 1] ); tmp = shr( tmp, 1 ); quant_select[( n_band << 1 ) + 1] = add( tmp, quant_tmp2[n_band] ); move16(); /*Q8 */ @@ -1794,10 +1766,7 @@ static void msvq_interpol_2_fx( Word16 quant_select[SWB_FENV], w_env11[SWB_FENV / 2], w_env12[SWB_FENV / 2]; Word32 L_tmp, distCand[N_CAND], L_dist, L_minDist; Word16 synth_energy[SWB_FENV]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + /* Extract target vector */ FOR( n_band = 0; n_band < DIM11 - 1; n_band++ ) { @@ -1854,9 +1823,9 @@ static void msvq_interpol_2_fx( move16(); FOR( n_band = 1; n_band < DIM12 - 1; n_band++ ) { - tmp_q = add_o( quant_tmp[n_band - 1], quant_tmp[n_band], &Overflow ); + tmp_q = add_sat( quant_tmp[n_band - 1], quant_tmp[n_band] ); tmp_q = shr( tmp_q, 1 ); - quant_tmp2[n_band] = sub_o( env_temp12[n_band], tmp_q, &Overflow ); + quant_tmp2[n_band] = sub_sat( env_temp12[n_band], tmp_q ); move16(); } @@ -1877,9 +1846,9 @@ static void msvq_interpol_2_fx( move16(); /*Q8 */ FOR( n_band = 1; n_band < DIM12 - 1; n_band++ ) { - tmp_q = add_o( quant_tmp[n_band - 1], quant_tmp[n_band], &Overflow ); + tmp_q = add_sat( quant_tmp[n_band - 1], quant_tmp[n_band] ); tmp_q = shr( tmp_q, 1 ); - quant_select[( n_band << 1 ) - 1] = add_o( quant_tmp2[n_band], tmp_q, &Overflow ); + quant_select[( n_band << 1 ) - 1] = add_sat( quant_tmp2[n_band], tmp_q ); } L_dist = L_deposit_l( 0 ); @@ -1941,10 +1910,6 @@ static void calculate_Tonality_fx( Word16 org_spec[80], gen_spec[80]; Word32 L_log_gm_org, L_log_gm_gen; Word16 l_shift; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* to reduce dynamic range of original spectrum */ max = 0; @@ -2049,7 +2014,7 @@ static void calculate_Tonality_fx( L_tmp2 = Mpy_32_16_1( L_log_gm_org, inv_len ); /* Q14 */ L_tmp = L_sub( L_tmp1, L_tmp2 ); - *SFM_org = round_fx_o( L_shl_o( L_tmp, 14, &Overflow ), &Overflow ); /*Q12 */ + *SFM_org = round_fx_sat( L_shl_sat( L_tmp, 14 ) ); /*Q12 */ move16(); *SFM_org = s_max( 0, s_min( *SFM_org, 24547 ) ); move16(); /*0.0001 and 5.993 in Q12 */ @@ -2070,7 +2035,7 @@ static void calculate_Tonality_fx( L_tmp2 = Mpy_32_16_1( L_log_gm_gen, inv_len ); /* Q14 */ L_tmp = L_sub( L_tmp1, L_tmp2 ); - *SFM_gen = round_fx_o( L_shl_o( L_tmp, 14, &Overflow ), &Overflow ); /*Q12 */ + *SFM_gen = round_fx_sat( L_shl_sat( L_tmp, 14 ) ); /*Q12 */ move16(); *SFM_gen = s_max( 0, s_min( *SFM_gen, 24547 ) ); move16(); /*0.0001 and 5.993 in Q12 */ @@ -2099,10 +2064,6 @@ static void calculate_Tonality_ivas_fx( Word16 org_spec[80], gen_spec[80]; Word32 L_log_gm_org, L_log_gm_gen; Word16 l_shift; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif /* to reduce dynamic range of original spectrum */ max = 0; @@ -2207,7 +2168,7 @@ static void calculate_Tonality_ivas_fx( L_tmp2 = Mpy_32_16_1( L_log_gm_org, inv_len ); /* Q14 */ L_tmp = L_sub( L_tmp1, L_tmp2 ); - *SFM_org = round_fx_o( L_shl_o( L_tmp, 14, &Overflow ), &Overflow ); /*Q12 */ + *SFM_org = round_fx_sat( L_shl_sat( L_tmp, 14 ) ); /*Q12 */ move16(); *SFM_org = s_max( 0, s_min( *SFM_org, 24547 ) ); move16(); /*0.0001 and 5.993 in Q12 */ @@ -2228,7 +2189,7 @@ static void calculate_Tonality_ivas_fx( L_tmp2 = Mpy_32_16_1( L_log_gm_gen, inv_len ); /* Q14 */ L_tmp = L_sub( L_tmp1, L_tmp2 ); - *SFM_gen = round_fx_o( L_shl_o( L_tmp, 14, &Overflow ), &Overflow ); /*Q12 */ + *SFM_gen = round_fx_sat( L_shl_sat( L_tmp, 14 ) ); /*Q12 */ move16(); *SFM_gen = s_max( 0, s_min( *SFM_gen, 24547 ) ); move16(); /*0.0001 and 5.993 in Q12 */ @@ -2487,7 +2448,7 @@ Word16 WB_BWE_encoding_fx( /* o : classification of wb index = WB_BWE_fenv_q_fx( WB_fenv_fx, F_2_5_fx, 32, 2 ); - push_indice_fx( st_fx->hBstr, IND_WB_FENV, index, 5 ); + push_indice( st_fx->hBstr, IND_WB_FENV, index, 5 ); return ( mode ); } @@ -2616,11 +2577,6 @@ static Word16 SWB_BWE_encoding_fx( Word16 SWB_tenv_tmp_fx[SWB_TENV]; Word16 max_fx; Word16 energy_factor_fx[SWB_FENV], w_env_fx[SWB_FENV]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif - FD_BWE_ENC_HANDLE hBWE_FD = st_fx->hBWE_FD; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; @@ -2661,7 +2617,8 @@ static Word16 SWB_BWE_encoding_fx( } /* tilt returned in Q24 go to Q11 */ - tilt_fx = round_fx_o( L_shl_o( calc_tilt_bwe_fx( insig_fx, 0, L_FRAME32k ), 3, &Overflow ), &Overflow ); + tilt_fx = round_fx_sat( L_shl_sat( calc_tilt_bwe_fx( insig_fx, 0, L_FRAME32k ), 3 ) ); + test(); test(); IF( EQ_16( IsTransient, 1 ) && ( GT_16( tilt_fx, 16384 ) || GT_16( st_fx->clas, 1 ) ) ) @@ -2676,7 +2633,7 @@ static Word16 SWB_BWE_encoding_fx( { mode = IsTransient; move16(); - push_indice_fx( hBstr, IND_SWB_CLASS, mode, 2 ); + push_indice( hBstr, IND_SWB_CLASS, mode, 2 ); /* Energy for the different bands and global energies */ global_gain_fx = L_deposit_l( 0 ); @@ -2765,7 +2722,7 @@ static Word16 SWB_BWE_encoding_fx( L_tmp = L_deposit_h( tmp ); L_tmp = Isqrt_lc( L_tmp, &expn ); /*31-expn */ - Rat_tenv_fx = round_fx_o( L_shl_o( L_tmp, sub( expn, 1 ), &Overflow ), &Overflow ); /*Q14 */ + Rat_tenv_fx = round_fx_sat( L_shl_sat( L_tmp, sub( expn, 1 ) ) ); /*Q14 */ } ELSE { @@ -2777,7 +2734,7 @@ static Word16 SWB_BWE_encoding_fx( { L_tmp = L_mult( Rat_tenv_fx, 19661 ); /*Q29 */ - Rat_tenv_fx = round_fx_o( L_shl_o( L_tmp, 2, &Overflow ), &Overflow ); /*Q15 */ + Rat_tenv_fx = round_fx_sat( L_shl_sat( L_tmp, 2 ) ); /*Q15 */ } ELSE IF( GT_16( Rat_tenv_fx, 16384 ) ) { @@ -2935,13 +2892,13 @@ static Word16 SWB_BWE_encoding_fx( index = shr( add( SWB_tenv_tmp_fx[n_band], 1024 ), 11 ); } - push_indice_fx( hBstr, IND_SWB_TENV, index, 4 ); + push_indice( hBstr, IND_SWB_TENV, index, 4 ); } MSVQ_Interpol_Tran_fx( SWB_fenv_fx, indice ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[0], 7 ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[1], 6 ); + push_indice( hBstr, IND_SWB_FENV, indice[0], 7 ); + push_indice( hBstr, IND_SWB_FENV, indice[1], 6 ); } ELSE { @@ -2966,7 +2923,7 @@ static Word16 SWB_BWE_encoding_fx( global_gain_fx = L_shr( global_gain_fx, 1 ); /*2*Q_shb */ mode = FD_BWE_class_fx( yos_fx, global_gain_fx, tilt_nb_fx, Q_synth, Q_shb, st_fx ); - push_indice_fx( hBstr, IND_SWB_CLASS, mode, 2 ); + push_indice( hBstr, IND_SWB_CLASS, mode, 2 ); energy_control_fx( st_fx, ACELP_CORE, mode, -1, yos_fx, st_offset, energy_factor_fx, Q_synth_lf ); @@ -3001,11 +2958,11 @@ static Word16 SWB_BWE_encoding_fx( /* Energy VQ */ msvq_interpol_fx( SWB_fenv_fx, w_env_fx, indice ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[0], 5 ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[1], 7 ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[2], 6 ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[3], 5 ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[4], 6 ); + push_indice( hBstr, IND_SWB_FENV, indice[0], 5 ); + push_indice( hBstr, IND_SWB_FENV, indice[1], 7 ); + push_indice( hBstr, IND_SWB_FENV, indice[2], 6 ); + push_indice( hBstr, IND_SWB_FENV, indice[3], 5 ); + push_indice( hBstr, IND_SWB_FENV, indice[4], 6 ); } hBWE_FD->prev_mode = mode; move16(); @@ -3061,10 +3018,6 @@ static Word16 SWB_BWE_encoding_ivas_fx( Word16 SWB_tenv_tmp_fx[SWB_TENV]; Word16 max_fx; Word16 energy_factor_fx[SWB_FENV], w_env_fx[SWB_FENV]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif Word16 inner_frame; Word16 q_shift; Word16 yos_fx_16[L_FRAME_MAX]; @@ -3124,7 +3077,7 @@ static Word16 SWB_BWE_encoding_ivas_fx( } /* tilt returned in Q24 go to Q11 */ - tilt_fx = round_fx_o( L_shl_o( calc_tilt_bwe_fx( insig_fx, 0, L_FRAME32k ), 3, &Overflow ), &Overflow ); + tilt_fx = round_fx_sat( L_shl_sat( calc_tilt_bwe_fx( insig_fx, 0, L_FRAME32k ), 3 ) ); test(); test(); IF( EQ_16( IsTransient, 1 ) && ( GT_16( tilt_fx, 16384 ) || GT_16( st_fx->clas, 1 ) ) ) @@ -3229,11 +3182,7 @@ static Word16 SWB_BWE_encoding_ivas_fx( expn = sub( sub( 30, expn ), sub( shl( Q_insig_lp, 1 ), 7 ) ); expd = norm_l( WB_tenv_syn_fx ); -#ifdef FIX_ISSUE_1156 - den = round_fx_o( L_shl( WB_tenv_syn_fx, expd ), &Overflow ); -#else - den = round_fx( L_shl( WB_tenv_syn_fx, expd ) ); -#endif + den = round_fx_sat( L_shl( WB_tenv_syn_fx, expd ) ); expd = sub( sub( 30, expd ), sub( shl( Q_insig_lp, 1 ), 7 ) ); scale = shr( sub( den, num ), 15 ); @@ -3246,7 +3195,7 @@ static Word16 SWB_BWE_encoding_ivas_fx( L_tmp = L_deposit_h( tmp ); L_tmp = Isqrt_lc( L_tmp, &expn ); /*31-expn */ - Rat_tenv_fx = round_fx_o( L_shl_o( L_tmp, sub( expn, 1 ), &Overflow ), &Overflow ); /*Q14 */ + Rat_tenv_fx = round_fx_sat( L_shl_sat( L_tmp, sub( expn, 1 ) ) ); /*Q14 */ } ELSE { @@ -3256,8 +3205,8 @@ static Word16 SWB_BWE_encoding_ivas_fx( IF( LT_16( Rat_tenv_fx, 8192 ) ) { - L_tmp = L_mult( Rat_tenv_fx, 19661 ); /*Q29 */ - Rat_tenv_fx = round_fx_o( L_shl_o( L_tmp, 2, &Overflow ), &Overflow ); /*Q15 */ + L_tmp = L_mult( Rat_tenv_fx, 19661 ); /*Q29 */ + Rat_tenv_fx = round_fx_sat( L_shl_sat( L_tmp, 2 ) ); /*Q15 */ } ELSE IF( GT_16( Rat_tenv_fx, 16384 ) ) { @@ -3954,7 +3903,7 @@ void hq_generic_encoding_fx( IF( EQ_16( hHQ_core->hq_generic_speech_class, 1 ) ) { - push_indice_fx( hBstr, IND_HQ_SWB_EXC_SP_CLAS, 1, 1 ); + push_indice( hBstr, IND_HQ_SWB_EXC_SP_CLAS, 1, 1 ); *hq_generic_exc_clas = HQ_GENERIC_SP_EXC; move16(); } @@ -3962,8 +3911,8 @@ void hq_generic_encoding_fx( { *hq_generic_exc_clas = decision_hq_generic_class_fx_32( coefs_fx, hq_generic_offset ); move16(); - push_indice_fx( hBstr, IND_HQ_SWB_EXC_SP_CLAS, 0, 1 ); - push_indice_fx( hBstr, IND_HQ_SWB_EXC_CLAS, *hq_generic_exc_clas, 1 ); + push_indice( hBstr, IND_HQ_SWB_EXC_SP_CLAS, 0, 1 ); + push_indice( hBstr, IND_HQ_SWB_EXC_CLAS, *hq_generic_exc_clas, 1 ); } FOR( n_band = 0; n_band < nenv; n_band++ ) @@ -4084,23 +4033,23 @@ void hq_generic_encoding_fx( move16(); } - push_indice_fx( hBstr, IND_SWB_FENV_HQ, indice[0], 5 ); - push_indice_fx( hBstr, IND_SWB_FENV_HQ, indice[1], 7 ); - push_indice_fx( hBstr, IND_SWB_FENV_HQ, indice[2], 6 ); - push_indice_fx( hBstr, IND_SWB_FENV_HQ, indice[3], 5 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[0], 5 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[1], 7 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[2], 6 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[3], 5 ); IF( LE_16( hq_generic_offset, HQ_GENERIC_FOFFSET_24K4 ) ) { - push_indice_fx( hBstr, IND_SWB_FENV_HQ, indice[4], 6 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[4], 6 ); } ELSE { - push_indice_fx( hBstr, IND_SWB_FENV_HQ, indice[4], 5 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[4], 5 ); } IF( EQ_16( st_fx->bwidth, FB ) ) { - push_indice_fx( hBstr, IND_FB_FENV_HQ, indice[5], 5 ); + push_indice( hBstr, IND_FB_FENV_HQ, indice[5], 5 ); } FOR( n_band = 0; n_band < nenv; n_band++ ) @@ -4145,17 +4094,11 @@ void fd_bwe_enc_init_fx( ) { set16_fx( hBWE_FD->new_input_hp_fx, 0, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS ) ); -#ifdef FIX_ISSUE_1230 hBWE_FD->Q_new_input_hp = 0; move16(); -#endif set16_fx( hBWE_FD->old_input_fx, 0, NS2SA( 48000, DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) ); set16_fx( hBWE_FD->old_input_wb_fx, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_12k8_NS ) ); -#ifndef MSAN_FIX - set16_fx( hBWE_FD->old_input_lp_fx, 0, NS2SA( 16000, ACELP_LOOK_NS + DELAY_SWB_TBE_16k_NS ) ); -#else set16_fx( hBWE_FD->old_input_lp_fx, 0, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS ) ); -#endif set16_fx( hBWE_FD->old_syn_12k8_16k_fx, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); hBWE_FD->prev_mode = NORMAL; move16(); diff --git a/lib_enc/swb_bwe_enc_hr_fx.c b/lib_enc/swb_bwe_enc_hr_fx.c index fd4a9f1259669e751e5164a7814c623739939c11..094310cdfb97aaed16f1acfc09f11105c0741451 100644 --- a/lib_enc/swb_bwe_enc_hr_fx.c +++ b/lib_enc/swb_bwe_enc_hr_fx.c @@ -1,12 +1,12 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include #include "options.h" #include "cnst.h" /* Common constants */ #include "rom_enc.h" /* Encoder static table prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -38,10 +38,11 @@ * Quantize the band envelop *-------------------------------------------------------------------*/ -static Word16 en_band_quant_fx( /* o : quantization index */ - Word16 *en_band, /* i/o: (un)quantized envelope value */ - const Word16 *env_code, /* i : envelope codebook */ - const Word16 N /* i : codebook dimension */ +/* o : quantization index */ +static Word16 en_band_quant_fx( + Word16 *en_band, /* i/o: (un)quantized envelope value */ + const Word16 *env_code, /* i : envelope codebook */ + const Word16 N /* i : codebook dimension */ ) { Word16 i, ind, tmp16; @@ -116,10 +117,6 @@ void swb_bwe_enc_hr_fx( Word32 L_t_audio_tmp_fx[N_BANDS_BWE_HR * WIDTH_NONTRANS_FREQ_COEF]; #else Word32 L_t_audio_tmp_fx[L_FRAME48k]; -#endif -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); #endif FD_BWE_ENC_HANDLE hBWE_FD = st_fx->hBWE_FD; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; @@ -189,7 +186,7 @@ void swb_bwe_enc_hr_fx( st_fx->EnergyLT_fx_exp = exp1; move16(); - push_indice_fx( hBstr, IND_HR_IS_TRANSIENT, is_transient, 1 ); + push_indice( hBstr, IND_HR_IS_TRANSIENT, is_transient, 1 ); /*---------------------------------------------------------------------* * OLA and MDCT @@ -309,7 +306,7 @@ void swb_bwe_enc_hr_fx( ind1 = gain_quant_fx( &L_gain_fx, &gain1_fx, LG10_MIN_GLOB_GAIN_BWE_HR_Q14, LG10_MAX_GLOB_GAIN_BWE_HR_Q13, NBITS_GLOB_GAIN_BWE_HR, &exp1 ); - push_indice_fx( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); + push_indice( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); nBits = sub( nBits, NBITS_GLOB_GAIN_BWE_HR ); /* normalization with global gain */ @@ -353,7 +350,7 @@ void swb_bwe_enc_hr_fx( { ind1 = en_band_quant_fx( en_band_fx, swb_hr_env_code3_fx, NUM_ENVLOPE_CODE_HR_TR ); - push_indice_fx( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR_TR ); + push_indice( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR_TR ); nBits = sub( nBits, NBITS_ENVELOPE_BWE_HR_TR ); ind2 = ind1; move16(); @@ -369,7 +366,7 @@ void swb_bwe_enc_hr_fx( ind1 = en_band_quant_fx( en_band_fx, swb_hr_env_code3_fx + ( NUM_ENVLOPE_CODE_HR_TR2 * 2 ), NUM_ENVLOPE_CODE_HR_TR2 ); } - push_indice_fx( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR_TR - 1 ); + push_indice( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR_TR - 1 ); nBits = sub( nBits, NBITS_ENVELOPE_BWE_HR_TR - 1 ); } @@ -439,7 +436,7 @@ void swb_bwe_enc_hr_fx( L_en_noncoded_fx = L_deposit_h( en_band_fx[N_BANDS_TRANS_BWE_HR - 1] ); /* to Put in Q16+9 */ } - push_indice_fx( hBstr, IND_HR_HF_GAIN, ind1, NBITS_HF_GAIN_BWE_HR ); + push_indice( hBstr, IND_HR_HF_GAIN, ind1, NBITS_HF_GAIN_BWE_HR ); nBits = sub( nBits, NBITS_HF_GAIN_BWE_HR ); } ELSE @@ -507,7 +504,7 @@ void swb_bwe_enc_hr_fx( L_gain_fx = L_shr( L_tmp, sub( 31 - 16, exp2 ) ); /* 31: 'L_tmp' is already in Q31 */ ind1 = gain_quant_fx( &L_gain_fx, &gain1_fx, LG10_MIN_GLOB_GAIN_BWE_HR_Q14, LG10_MAX_GLOB_GAIN_BWE_HR_Q13, NBITS_GLOB_GAIN_BWE_HR, &exp1 ); - push_indice_fx( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); + push_indice( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); nBits = sub( nBits, NBITS_GLOB_GAIN_BWE_HR ); /* normalization with global gain */ @@ -547,8 +544,8 @@ void swb_bwe_enc_hr_fx( ind1 = en_band_quant_fx( en_band_fx, swb_hr_env_code1_fx, NUM_ENVLOPE_CODE_HR1 ); ind2 = en_band_quant_fx( en_band_fx + 2, swb_hr_env_code2_fx, NUM_ENVLOPE_CODE_HR2 ); - push_indice_fx( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR1 ); - push_indice_fx( hBstr, IND_HR_ENVELOPE, ind2, NBITS_ENVELOPE_BWE_HR2 ); + push_indice( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR1 ); + push_indice( hBstr, IND_HR_ENVELOPE, ind2, NBITS_ENVELOPE_BWE_HR2 ); nBits = sub( nBits, NBITS_ENVELOPE_BWE_HR1 + NBITS_ENVELOPE_BWE_HR2 ); @@ -673,7 +670,7 @@ void swb_bwe_enc_hr_fx( L_en_noncoded_fx = L_mult0( min_env_fx, 16384 ); } - push_indice_fx( hBstr, IND_HR_HF_GAIN, ind1, NBITS_HF_GAIN_BWE_HR ); + push_indice( hBstr, IND_HR_HF_GAIN, ind1, NBITS_HF_GAIN_BWE_HR ); nBits = sub( nBits, NBITS_HF_GAIN_BWE_HR ); } ELSE @@ -758,7 +755,7 @@ void swb_bwe_enc_hr_fx( /* Put in Q16 */ L_gain_fx = L_shr( L_temp, sub( 31 - 16, temp2 ) ); /* 31: 'L_temp' is already in Q31 */ ind1 = gain_quant_fx( &L_gain_fx, &gain2_fx, LG10_MIN_GLOB_GAIN_BWE_HR_Q14, LG10_MAX_GLOB_GAIN_BWE_HR_Q13, NBITS_GLOB_GAIN_BWE_HR, &exp2 ); - push_indice_fx( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); + push_indice( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); nBits = sub( nBits, NBITS_GLOB_GAIN_BWE_HR ); /* normalize with global gain */ @@ -767,8 +764,8 @@ void swb_bwe_enc_hr_fx( FOR( i = 0; i < Nsv2 * WIDTH_BAND; i++ ) { L_tmp = L_mult( temp, t_audio_fx[i] ); - L_tmp = L_shr_o( L_tmp, temp2, &Overflow ); - t_audio_fx[i] = round_fx_o( L_tmp, &Overflow ); + L_tmp = L_shr_sat( L_tmp, temp2 ); + t_audio_fx[i] = round_fx_sat( L_tmp ); move16(); } @@ -784,7 +781,7 @@ void swb_bwe_enc_hr_fx( WHILE( nBits > 0 ) { i = s_min( nBits, 16 ); - push_indice_fx( hBstr, IND_UNUSED, 0, i ); + push_indice( hBstr, IND_UNUSED, 0, i ); nBits = sub( nBits, i ); } return; diff --git a/lib_enc/swb_bwe_enc_lr_fx.c b/lib_enc/swb_bwe_enc_lr_fx.c index 1a397c514951163ef7f4a99dd9c5143283e0a601..7d31b853227d173efe2dc852d87cb0d33b3d8369 100644 --- a/lib_enc/swb_bwe_enc_lr_fx.c +++ b/lib_enc/swb_bwe_enc_lr_fx.c @@ -89,10 +89,8 @@ static Word16 GetSubbandCorrIndex2_har_fx( /* o : Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move16(); -#endif exp_safe_e = 4; move16(); @@ -174,14 +172,15 @@ static Word16 GetSubbandCorrIndex2_har_fx( /* o : L_corr_sq = L_mult_o( corr_sq_hi_fx, corr_sq_hi_fx, &Overflow ); /* (((Qhi:Qsh+exp_norm_hi-16)+Qss+1)+exp_norm-16)*2+1 */ L_corr_sq = L_shr_o( L_corr_sq, s_min( shl( exp_norm, 1 ), 31 ), &Overflow ); /* (QCorr-16)*2+1 */ - IF( Overflow != 0 ) + if ( Overflow != 0 ) { L_corr_sq = 0x0L; - move16(); - Overflow = 0; - move16(); + move32(); } + Overflow = 0; + move16(); + /* normalize for L_lagCorr_sq and L_corr_sq */ L_buf = L_or( L_lagCorr_sq, L_corr_sq ); exp_corr = norm_l( L_buf ); @@ -697,10 +696,7 @@ static void gethar_noisegn_fx( Word16 temp_lo, temp_hi; Word16 Qg; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif + /*Generate HF noise*/ genhf_noise_fx( noise_flr_fx, Qss, L_xSynth_har, QsL, sspectra_fx, bands, har_bands, har_freq_est2, pos_max_hfe2, pul_res_fx, pk_sf_fx, fLenLow, fLenHigh, sbWidth, lagIndices, subband_offsets, subband_search_offset ); @@ -781,9 +777,9 @@ static void gethar_noisegn_fx( exp = sub( exp, Qsqrt ); L_temp = L_Comp( exp, frac ); - L_temp = Mpy_32_16_1( L_temp, 19728 ); /* log(2)/log(10)=.30102999566398119521 = 19728.3(Q16) Q(0+16+1)=Q17 */ - L_temp = L_shl_o( L_temp, 13, &Overflow ); /* Q17+13=30 30-16=14 */ - g_fx = round_fx_o( L_temp, &Overflow ); + L_temp = Mpy_32_16_1( L_temp, 19728 ); /* log(2)/log(10)=.30102999566398119521 = 19728.3(Q16) Q(0+16+1)=Q17 */ + L_temp = L_shl_sat( L_temp, 13 ); /* Q17+13=30 30-16=14 */ + g_fx = round_fx_sat( L_temp ); } gqlevs_fx = 4; @@ -806,7 +802,7 @@ static void gethar_noisegn_fx( } } - push_indice_fx( hBstr, IND_NOISEG, imin_fx, 2 ); + push_indice( hBstr, IND_NOISEG, imin_fx, 2 ); /*g=(float) pow (10.0f,gain_table[imin]);*/ L_temp = L_mult( gain_table_SWB_BWE_fx[imin_fx], 27213 ); /* Q14+Q13+1=Q28 log(10)/log(2)=3.3219 27213.23(Q13) */ @@ -909,7 +905,7 @@ static void EncodeSWBSubbands_fx( /* Write the indices into the bitstream */ FOR( k = 0; k < nBands_search_fx; k++ ) { - push_indice_fx( st_fx->hBstr, IND_LAGINDICES, lagIndices_fx[k], bits_lagIndices_mode0_Har[k] ); + push_indice( st_fx->hBstr, IND_LAGINDICES, lagIndices_fx[k], bits_lagIndices_mode0_Har[k] ); } IF( flag_dis == 0 ) @@ -974,7 +970,7 @@ static void EncodeSWBSubbands_fx( } ELSE { - push_indice_fx( st_fx->hBstr, IND_LAGINDICES, lagIndices_fx[k], bits_lagIndices_modeNormal[k] ); + push_indice( st_fx->hBstr, IND_LAGINDICES, lagIndices_fx[k], bits_lagIndices_modeNormal[k] ); } } diff --git a/lib_enc/swb_pre_proc_fx.c b/lib_enc/swb_pre_proc_fx.c index b73b0f992cc83d72151d977510880ec6e87e893c..a966f70cc61a085e6badc5da51a6e3695af3eccf 100644 --- a/lib_enc/swb_pre_proc_fx.c +++ b/lib_enc/swb_pre_proc_fx.c @@ -1,12 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" #include "cnst.h" -//#include "prot_fx.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "stl.h" #include "prot_fx.h" /* Function prototypes */ @@ -14,30 +12,30 @@ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" #include "ivas_rom_enc.h" - #include + /*========================================================================*/ -/* FUNCTION : wb_pre_proc_fx() */ +/* FUNCTION : wb_pre_proc_fx() */ /*------------------------------------------------------------------------*/ /* PURPOSE : Resampling of input signal when input signal sample rate */ -/* is above 16kHz */ +/* is above 16kHz */ /*------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* Encoder_State *st_fx : Encoder State Structure */ -/* _ (Word16*) input : original input signal */ +/* INPUT ARGUMENTS : */ +/* Encoder_State *st_fx : Encoder State Structure */ +/* _ (Word16*) input : original input signal */ /*------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _None */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _None */ /*------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /* _ (Word16*) new_wb_speech : original input signal at 16kHz Q-1 */ /*------------------------------------------------------------------------*/ /* st_fx->old_wtda_wb_fx */ /*------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*========================================================================*/ void wb_pre_proc_fx( @@ -172,26 +170,26 @@ void wb_pre_proc_fx( /*========================================================================*/ -/* FUNCTION : wb_pre_proc_ivas_fx() */ +/* FUNCTION : wb_pre_proc_ivas_fx() */ /*------------------------------------------------------------------------*/ /* PURPOSE : Resampling of input signal when input signal sample rate */ -/* is above 16kHz */ +/* is above 16kHz */ /*------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* Encoder_State *st_fx : Encoder State Structure */ -/* _ (Word16*) input : original input signal */ +/* INPUT ARGUMENTS : */ +/* Encoder_State *st_fx : Encoder State Structure */ +/* _ (Word16*) input : original input signal */ /*------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _None */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _None */ /*------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /* _ (Word16*) new_wb_speech : original input signal at 16kHz Q-1 */ /*------------------------------------------------------------------------*/ /* st_fx->old_wtda_wb_fx */ /*------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*========================================================================*/ void wb_pre_proc_ivas_fx( @@ -471,29 +469,29 @@ void wb_pre_proc_ivas_fx( /*========================================================================*/ -/* FUNCTION : swb_pre_proc_fx() */ +/* FUNCTION : swb_pre_proc_fx() */ /*------------------------------------------------------------------------*/ -/* PURPOSE : Calculate the 6 to 14 kHz (or 7.5 - 15.5 kHz) */ +/* PURPOSE : Calculate the 6 to 14 kHz (or 7.5 - 15.5 kHz) */ /* SHB target signal for SWB TBE or SWB BWE coding */ -/* Common SWB TBE and SWB BWE pre-processing */ +/* Common SWB TBE and SWB BWE pre-processing */ /*------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* Encoder_State *st_fx : Encoder State Structure Q0 */ +/* INPUT ARGUMENTS : */ +/* Encoder_State *st_fx : Encoder State Structure Q0 */ /* _ (Word16*) input_fx : original input signal Q0 */ /*------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _None */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _None */ /*------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ +/* OUTPUT ARGUMENTS : */ /* _ (Word16*) new_swb_speech_fx : original input signal at 16kHz Q0 */ -/* _ (Word16*) shb_speech_fx : original input signal at 16kHz Q0 */ +/* _ (Word16*) shb_speech_fx : original input signal at 16kHz Q0 */ /*------------------------------------------------------------------------*/ -/* st_fx->old_input_fx */ +/* st_fx->old_input_fx */ /* st_fx->old_wtda_shb_fx */ /*------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*========================================================================*/ void swb_pre_proc_fx( @@ -523,10 +521,8 @@ void swb_pre_proc_fx( Word16 ts, nB, uB; /* Highband energy computation using CLDFB */ Word32 CldfbHB_ener; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move16(); -#endif Word16 realQ_neg1, imagQ_neg1, exp, Cldfbtemp1; TD_BWE_ENC_HANDLE hBWE_TD = st_fx->hBWE_TD; FD_BWE_ENC_HANDLE hBWE_FD = st_fx->hBWE_FD; @@ -583,7 +579,7 @@ void swb_pre_proc_fx( IF( NE_16( st_fx->last_extl, SWB_BWE ) && NE_16( st_fx->last_extl, FB_BWE ) ) { /* resample 48 kHz to 32kHz */ - IF( EQ_16( st_fx->last_bwidth, FB ) ) + IF( ( st_fx->last_bwidth == FB && st_fx->element_mode == EVS_MONO ) || ( EQ_16( st_fx->bwidth, FB ) && st_fx->element_mode > EVS_MONO ) ) // note: once EVS i CR fixed, the condition will simplify to "if ( st->bwidth == FB )" only { inner_frame = L_FRAME48k; inner_Fs = 48000; @@ -778,7 +774,7 @@ void swb_pre_proc_fx( /*full implementation pending*/ void swb_pre_proc_ivas_fx( Encoder_State *st, /* i/o: encoder state structure */ - Word16 *new_swb_speech, /* o : original input signal at 32kHz - Q0 */ + Word16 *new_swb_speech, /* o : original input signal at 32kHz - st->q_inp */ Word32 *new_swb_speech_fx, /* o : original input signal at 32kHz - Q - q_reImBuffer */ Word16 *shb_speech, /* o : SHB target signal (6-14kHz) at 16kHz- Q(Q_shb_spch) */ Word16 *Q_shb_spch, @@ -846,6 +842,9 @@ void swb_pre_proc_ivas_fx( test(); test(); + scale_sig( hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, sub( st->q_inp, st->Q_old_wtda ) ); // st->Q_old_wtda -> st->q_inp + st->Q_old_wtda = st->q_inp; + move16(); IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && GE_16( st->bwidth, SWB ) ) { Copy( st->input_fx - hCPE->hStereoTCA->lMemRecalc, hBWE_FD->L_old_wtda_swb_fx + L_FRAME32k - sub( hCPE->hStereoTCA->lMemRecalc, Sample_Delay_SWB_BWE ), sub( hCPE->hStereoTCA->lMemRecalc, Sample_Delay_SWB_BWE ) ); @@ -880,6 +879,8 @@ void swb_pre_proc_ivas_fx( IF( NE_16( st->extl, WB_BWE ) ) { Copy( old_input_fx, hBWE_FD->L_old_wtda_swb_fx, L_FRAME32k ); + st->Q_old_wtda = st->q_inp; + move16(); } } @@ -929,6 +930,10 @@ void swb_pre_proc_ivas_fx( test(); test(); + scale_sig( hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, sub( st->q_inp, st->Q_old_wtda ) ); // st->Q_old_wtda -> st->q_inp + st->Q_old_wtda = st->q_inp; + move16(); + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && GE_16( st->bwidth, SWB ) ) { IF( EQ_16( st->bwidth, SWB ) ) @@ -977,7 +982,7 @@ void swb_pre_proc_ivas_fx( IF( NE_16( st->last_extl, SWB_BWE ) && NE_16( st->last_extl, FB_BWE ) ) { /* resample 48 kHz to 32kHz */ - IF( EQ_16( st->last_bwidth, FB ) ) + IF( ( st->last_bwidth == FB && st->element_mode == EVS_MONO ) || ( EQ_16( st->bwidth, FB ) && st->element_mode > EVS_MONO ) ) // note: once EVS i CR fixed, the condition will simplify to "if ( st->bwidth == FB )" only { inner_frame = L_FRAME48k; move16(); @@ -1029,6 +1034,8 @@ void swb_pre_proc_ivas_fx( set16_fx( old_input_fx, 0, Sample_Delay_SWB_BWE ); Copy( new_swb_speech + inner_frame - Sample_Delay_SWB_BWE, hBWE_FD->old_input_fx, Sample_Delay_SWB_BWE ); Copy( old_input_fx, hBWE_FD->L_old_wtda_swb_fx, inner_frame ); + st->Q_old_wtda = st->q_inp; + move16(); } /* resample 48 kHz to 32kHz */ @@ -1057,8 +1064,9 @@ void swb_pre_proc_ivas_fx( { Word16 out_start_ind, out_end_ind; stereo_dft_enc_synthesize_fx( hCPE->hStereoDft, new_swb_speech_fx, &out_start_ind, &out_end_ind, st->idchan, input_Fs, 32000, 0, NULL ); - Copy_Scale_sig32_16( new_swb_speech_fx - STEREO_DFT_OVL_MAX, new_swb_speech - STEREO_DFT_OVL_MAX, L_FRAME48k + STEREO_DFT_OVL_MAX, add( q_reImBuffer, 1 ) ); // Q0 - Copy( new_swb_speech - Sample_Delay_SWB_BWE32k, hBWE_FD->old_input_fx, Sample_Delay_SWB_BWE32k ); // Q0 + Copy_Scale_sig32_16( new_swb_speech_fx - STEREO_DFT_OVL_MAX, new_swb_speech - STEREO_DFT_OVL_MAX, L_FRAME48k + STEREO_DFT_OVL_MAX, add( st->q_inp, add( q_reImBuffer, 1 ) ) ); // st->q_inp + + Copy( new_swb_speech - Sample_Delay_SWB_BWE32k, hBWE_FD->old_input_fx, Sample_Delay_SWB_BWE32k ); // st->q_inp } } } @@ -1086,12 +1094,12 @@ void swb_pre_proc_ivas_fx( IF( ( ( st->core == ACELP_CORE ) && NE_16( st->extl, SWB_BWE_HIGHRATE ) && NE_16( st->extl, FB_BWE_HIGHRATE ) ) || ( ( EQ_32( st->total_brate, ACELP_9k60 ) || st->rf_mode ) && EQ_16( st->bwidth, SWB ) && ( st->element_mode == EVS_MONO ) ) ) { + Word64 CldfbHB64_fx = 0; + move64(); Word32 CldfbHB_fx = 0; // fixed counterpart Word16 CldfbHB_fx_e = 0; // fixed counterpart -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move16(); -#endif Word16 realQ_neg1, imagQ_neg1, exp = 0, Cldfbtemp1; move32(); move16(); @@ -1196,16 +1204,15 @@ void swb_pre_proc_ivas_fx( { FOR( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) { - realQ_neg1 = extract_l( L_shr( realBufferFlipped[ts][nB], 16 ) ); - imagQ_neg1 = extract_l( L_shr( imagBufferFlipped[ts][nB], 16 ) ); /* Q(-1), headroom needed */ - - CldfbHB_fx = L_mac0_o( CldfbHB_fx, realQ_neg1, realQ_neg1, &Overflow ); - CldfbHB_fx = L_mac0_o( CldfbHB_fx, imagQ_neg1, imagQ_neg1, &Overflow ); /* Q(-2) */ + CldfbHB64_fx = W_mac_32_32( CldfbHB64_fx, realBufferFlipped[ts][nB], realBufferFlipped[ts][nB] ); + CldfbHB64_fx = W_mac_32_32( CldfbHB64_fx, imagBufferFlipped[ts][nB], imagBufferFlipped[ts][nB] ); } } - CldfbHB_fx_e = sub( Q31, shl( sub( q_reImBuffer, Q16 ), 1 ) ); - exp = norm_l( CldfbHB_fx ); - CldfbHB_fx = L_shl( CldfbHB_fx, exp ); /* CldfbHB_ener = CldfbHB_fl*2^(exp) */ + + Word16 scf = W_norm( CldfbHB64_fx ); + CldfbHB64_fx = W_shl( CldfbHB64_fx, scf ); + CldfbHB_fx = W_extract_h( CldfbHB64_fx ); + CldfbHB_fx_e = sub( Q31, add( shl( q_reImBuffer, 1 ), sub( scf, Q31 ) ) ); Cldfbtemp1 = Log2_norm_lc( CldfbHB_fx ); /* Log2_norm_lc(t) = 2^15*(log2(t/2^30)) */ Cldfbtemp1 = sub( shr( Cldfbtemp1, 6 ), shl( add( sub( Q31 - Q30, CldfbHB_fx_e ), exp ), 9 ) ); CldfbHB_fx = L_mult( Cldfbtemp1, 9864 ); /* Q9 + Q15 + Q1 = Q25 */ @@ -1263,11 +1270,7 @@ void swb_pre_proc_ivas_fx( thr = icbwe_thr_TDM_fx; regV = icbwe_regressionValuesTDM_fx; -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( realBufferFlipped, imagBufferFlipped, shb_speech_fx_32, -1, 0, st->cldfbSynTd ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( realBufferFlipped, imagBufferFlipped, shb_speech_fx_32, -1, st->cldfbSynTd ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ + cldfbSynthesis_ivas_fx( realBufferFlipped, imagBufferFlipped, shb_speech_fx_32, -1, 0, 0, st->cldfbSynTd ); Copy_Scale_sig_32_16( shb_speech_fx_32, shb_speech, L_FRAME16k, negate( sub( q_reImBuffer, 1 ) ) ); *Q_shb_spch = 0; move16(); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 65422e0899bd534f54b0b4bcbff8be438931de5b..7695cfbca116d093687646ecdbdb7ac7ae78d38c 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -1,12 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ - #include #include "options.h" #include "cnst.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -24,16 +22,11 @@ /*-----------------------------------------------------------------* * Local functions *-----------------------------------------------------------------*/ -static void return_M_Least_fx_GainFrame( const Word32 *inp, - const Word32 *codebook, - const Word16 num_grp, - const Word16 interNum, - Word16 *least ); +static void return_M_Least_fx_GainFrame( const Word32 *inp, const Word32 *codebook, const Word16 num_grp, const Word16 interNum, Word16 *least ); static void singlevectortest_gain_fx( const Word32 *inp, const Word16 dimen, const Word16 cb_size, Word16 *index, Word32 *recon, const Word32 *codebook ); - static void determine_gain_weights_fx( const Word32 *gain, Word16 *weights, const Word16 dims ); static void QuantizeSHBsubgains_fx( Encoder_State *st_fx, Word16 *subgains, const Word16 extl ); @@ -48,52 +41,28 @@ static Word16 closest_centroid_fx( const Word16 *data, const Word16 *weights, co static Word16 closest_centroid_lc_fx( const Word16 *data, const Word16 *quantizer, const Word16 centroids ); -static void EstimateSHBFrameGain_fx( const Word16 length, - const Word16 *oriSHB, - const Word16 Q_oriSHB, - const Word16 *synSHB, - const Word16 Q_synSHB, - Word16 *subgain, - Word32 *GainFrame, - const Word16 *win_shb, - const Word16 *subwin_shb, - const Word16 n_subfr_saturation ); - -static void EstimateSHBFrameGain_ivas_fx( const Word16 length, - const Word16 *oriSHB, - const Word16 Q_oriSHB, - const Word16 *synSHB, - const Word16 Q_synSHB, - Word16 *subgain, - Word32 *GainFrame, - const Word16 *win_shb, - const Word16 *subwin_shb, - const Word16 n_subfr_saturation ); - -static void EstimateSHBGainShape_fx( const Word16 length, - const Word16 *oriSHB, - const Word16 Q_oriSHB, - const Word16 *synSHB, - const Word16 Q_synSHB, - Word16 *subgain, - const Word16 *subwin, - Word16 *n_subfr_saturation ); +static void EstimateSHBFrameGain_fx( const Word16 length, const Word16 *oriSHB, const Word16 Q_oriSHB, const Word16 *synSHB, const Word16 Q_synSHB, Word16 *subgain, Word32 *GainFrame, const Word16 *win_shb, const Word16 *subwin_shb, const Word16 n_subfr_saturation ); + +static void EstimateSHBFrameGain_ivas_fx( const Word16 length, const Word16 *oriSHB, const Word16 Q_oriSHB, const Word16 *synSHB, const Word16 Q_synSHB, Word16 *subgain, Word32 *GainFrame, const Word16 *win_shb, const Word16 *subwin_shb, const Word16 n_subfr_saturation ); +static void EstimateSHBGainShape_fx( const Word16 length, const Word16 *oriSHB, const Word16 Q_oriSHB, const Word16 *synSHB, const Word16 Q_synSHB, Word16 *subgain, const Word16 *subwin, Word16 *n_subfr_saturation, const Flag limit_min_gain ); static Word32 pow_off_pk_fx( Word16 a[], Word16 len, Word16 step ); static Word32 pow_off_pk_corrected_fx( Word16 a[], Word16 len, Word16 step ); static void find_max_mem_enc( Encoder_State *st_fx, Word16 *n_mem, Word16 *n_mem2 ); + static void rescale_genSHB_mem_enc( Encoder_State *st_fx, Word16 sf ); + static void find_max_mem_wb_enc( Encoder_State *st_fx, Word16 *n_mem ); + static void rescale_genWB_mem_enc( Encoder_State *st_fx, Word16 sf ); -static void Quant_lower_LSF_fx( const Word16 lsf[], - Word16 lsf_q[], - Word16 lsf_idx[] ); +static void Quant_lower_LSF_fx( const Word16 lsf[], Word16 lsf_q[], Word16 lsf_idx[] ); static Word16 Quant_mirror_point_fx( const Word16 lsf[], const Word16 lsf_q[], Word16 *m ); + static Word16 Find_LSF_grid_fx( const Word16 lsf[], Word16 lsf_q[], const Word16 m ); static void Quant_BWE_LSF_fx( Encoder_State *st_fx, const Word16 lsp_shb[], Word16 Q_lsfs[] ); @@ -108,21 +77,9 @@ static void Quant_shb_res_gshape_fx( Encoder_State *st_fx, Word16 *shb_res_gshap static void Quant_shb_res_gshape_ivas_fx( Encoder_State *st, Word16 shb_res_gshape_fx[] ); -static void gainFrSmooth_En_fx( Encoder_State *st_fx, - Word16 *shb_frame_fx, - const Word16 *lpc_shb_fx, - const Word16 *lsp_shb_fx, - Word16 *MA_lsp_shb_spacing, - Word16 *frGainAttenuate, - Word16 *frGainSmoothEn ); +static void gainFrSmooth_En_fx( Encoder_State *st_fx, Word16 *shb_frame_fx, const Word16 *lpc_shb_fx, const Word16 *lsp_shb_fx, Word16 *MA_lsp_shb_spacing, Word16 *frGainAttenuate, Word16 *frGainSmoothEn ); -static void gainFrSmooth_En_ivas_fx( Encoder_State *st_fx, - Word16 *shb_frame_fx /* Q_in */, - const Word16 *lpc_shb_fx /* Q12 */, - const Word16 *lsp_shb_fx /* Q15 */, - Word16 *MA_lsp_shb_spacing /* Q15 */, - Word16 *frGainAttenuate /* Q0 */, - Word16 *frGainSmoothEn /* Q0 */ ); +static void gainFrSmooth_En_ivas_fx( Encoder_State *st_fx, Word16 *shb_frame_fx /* Q_in */, const Word16 *lpc_shb_fx /* Q12 */, const Word16 *lsp_shb_fx /* Q15 */, Word16 *MA_lsp_shb_spacing /* Q15 */, Word16 *frGainAttenuate /* Q0 */, Word16 *frGainSmoothEn /* Q0 */ ); /*-------------------------------------------------------------------* @@ -130,6 +87,7 @@ static void gainFrSmooth_En_ivas_fx( Encoder_State *st_fx, * * Find norm and max in TBE memories and past buffers *-------------------------------------------------------------------*/ + void find_max_mem_enc( Encoder_State *st_fx, Word16 *n_mem, @@ -235,6 +193,8 @@ void find_max_mem_enc( tempQ15 = sub( s_min( *n_mem, n_mem_32 ), 1 ); *n_mem = s_max( tempQ15, 0 ); move16(); + + return; } @@ -243,7 +203,10 @@ void find_max_mem_enc( * * Rescale genSHB memories *-------------------------------------------------------------------*/ -void rescale_genSHB_mem_enc( Encoder_State *st_fx, Word16 sf ) + +void rescale_genSHB_mem_enc( + Encoder_State *st_fx, + Word16 sf ) { Word16 i; TD_BWE_ENC_HANDLE hBWE_TD = st_fx->hBWE_TD; @@ -416,12 +379,12 @@ void rescale_genWB_mem_enc( Encoder_State *st_fx, Word16 sf ) * * Initialize SWB buffers *-------------------------------------------------------------------*/ + void InitSWBencBuffer_fx( - Encoder_State *st_fx /* i/o: SHB encoder structure */ + TD_BWE_ENC_HANDLE hBWE_TD /* i/o: TD BWE data handle */ ) { Word16 i; - TD_BWE_ENC_HANDLE hBWE_TD = st_fx->hBWE_TD; set16_fx( hBWE_TD->old_bwe_exc_fx, 0, ( PIT16k_MAX * 2 ) ); hBWE_TD->bwe_seed[0] = 23; @@ -445,15 +408,8 @@ void InitSWBencBuffer_fx( set16_fx( hBWE_TD->old_input_fhb_fx, 0, NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2 ); // IVAS_CODE - // set_f(hBWE_TD->mem_shb_res, 0.0f, MAX_LEN_MA_FILTER); - // set_f(hBWE_TD->old_EnvSHBres, 0.0f, L_FRAME4k); - // hBWE_TD->old_mean_EnvSHBres = 0.0f; - // hBWE_TD->prev_enr_EnvSHBres = 1.0f; - // hBWE_TD->prev_shb_env_tilt = 0.0f; - // hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; - // hBWE_TD->prev_mix_factor = 1.0f; - // hBWE_TD->prev_Env_error = 0.0f; - set16_fx( hBWE_TD->prev_lsp_shb_fx, 0, 10 ); + // InitSWBencBufferStates_fx(hBWE_TD, NULL ); + set16_fx( hBWE_TD->prev_lsp_shb_fx, 0, LPC_SHB_ORDER ); hBWE_TD->cldfbHBLT = 8192 /*1.0f Q13*/; move16(); @@ -503,25 +459,29 @@ void InitSWBencBuffer_fx( hBWE_TD->prev_fb_energy_fx_Q = 0; move16(); - - // TV2TV IVAS_CODE -> To be verify if it has to be moved to hBWE_TD - st_fx->prev_Q_bwe_exc = 31; + hBWE_TD->prev_Q_bwe_exc = 31; move16(); - st_fx->prev_Q_bwe_syn = 31; + hBWE_TD->prev_Q_bwe_syn = 31; move16(); - set16_fx( st_fx->prev_lsp_wb_fx, 0, 6 ); - set16_fx( st_fx->prev_lsp_wb_temp_fx, 0, 6 ); - set16_fx( st_fx->prev_lpc_wb_fx, 0, LPC_SHB_ORDER_WB ); + set16_fx( hBWE_TD->prev_lsp_wb_fx, 0, 6 ); + set16_fx( hBWE_TD->prev_lsp_wb_temp_fx, 0, 6 ); + set16_fx( hBWE_TD->prev_lpc_wb_fx, 0, LPC_SHB_ORDER_WB ); return; } + +/*-------------------------------------------------------------------* + * InitSWBencBufferStates() + * + * Initialize SWB buffer states + *-------------------------------------------------------------------*/ + void InitSWBencBuffer_ivas_fx( - Encoder_State *st_fx /* i/o: SHB encoder structure */ + TD_BWE_ENC_HANDLE hBWE_TD /* i/o: TD BWE data handle */ ) { Word16 i; - TD_BWE_ENC_HANDLE hBWE_TD = st_fx->hBWE_TD; set16_fx( hBWE_TD->old_bwe_exc_fx, 0, ( PIT16k_MAX * 2 ) ); hBWE_TD->bwe_seed[0] = 23; @@ -598,33 +558,30 @@ void InitSWBencBuffer_ivas_fx( set16_fx( hBWE_TD->dec_2_over_3_mem_fx, 0, 12 ); set16_fx( hBWE_TD->dec_2_over_3_mem_lp_fx, 0, 6 ); - hBWE_TD->prev_fb_energy_fx_Q = 0; move16(); - - // TV2TV IVAS_CODE -> To be verify if it has to be moved to hBWE_TD - st_fx->prev_Q_bwe_exc = 15; + hBWE_TD->prev_Q_bwe_exc = 15; move16(); - st_fx->prev_Q_bwe_syn = 15; + hBWE_TD->prev_Q_bwe_syn = 15; move16(); - set16_fx( st_fx->prev_lsp_wb_fx, 0, 6 ); - set16_fx( st_fx->prev_lsp_wb_temp_fx, 0, 6 ); - set16_fx( st_fx->prev_lpc_wb_fx, 0, LPC_SHB_ORDER_WB ); + set16_fx( hBWE_TD->prev_lsp_wb_fx, 0, 6 ); + set16_fx( hBWE_TD->prev_lsp_wb_temp_fx, 0, 6 ); + set16_fx( hBWE_TD->prev_lpc_wb_fx, 0, LPC_SHB_ORDER_WB ); return; } + /*-------------------------------------------------------------------* * ResetSHBbuffer_Enc() * *-------------------------------------------------------------------*/ + void ResetSHBbuffer_Enc_fx( - Encoder_State *st_fx /* i/o: SHB encoder structure */ + TD_BWE_ENC_HANDLE hBWE_TD /* i/o: TD BWE data handle */ ) { - TD_BWE_ENC_HANDLE hBWE_TD = st_fx->hBWE_TD; - /* states for the filters used in generating SHB excitation from WB excitation*/ set16_fx( hBWE_TD->mem_genSHBexc_filt_down_shb_fx, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); set32_fx( hBWE_TD->mem_csfilt_fx, 0, 2 ); @@ -632,13 +589,10 @@ void ResetSHBbuffer_Enc_fx( /* states for the filters used in generating SHB signal from SHB excitation*/ set16_fx( hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD ); set16_fx( hBWE_TD->state_lpc_syn_fx, 0, LPC_SHB_ORDER ); + set16_fx( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER ); + hBWE_TD->fb_tbe_demph_fx = 0; + move16(); - // IF( EQ_16(st_fx->extl, FB_TBE)) _DIFF_FLOAT_FIX_ - { - set16_fx( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER ); - hBWE_TD->fb_tbe_demph_fx = 0; - move16(); - } /* states for the filters used in generating WB signal from WB excitation*/ set16_fx( hBWE_TD->decim_state1_fx, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); set16_fx( hBWE_TD->decim_state2_fx, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); @@ -655,7 +609,6 @@ void ResetSHBbuffer_Enc_fx( hBWE_TD->tbe_premph_fx = 0; move16(); - return; } @@ -744,10 +697,6 @@ void wb_tbe_enc_fx( Word16 avg_voice_fac; TD_BWE_ENC_HANDLE hBWE_TD = st_fx->hBWE_TD; RF_ENC_HANDLE hRF = st_fx->hRF; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif /*Word16 att = 32767;*/ @@ -783,6 +732,13 @@ void wb_tbe_enc_fx( autocorr_fx( hb_old_speech, LPC_SHB_ORDER_WB + 1, R_h, R_l, &Q_R, WBTBE_LPCWIN_LENGTH, win_lpc_hb_wb_fx, 0, 1 ); + if ( st_fx->element_mode > EVS_MONO ) + { + /* Ensure R[0] isn't zero when entering Levinson-Durbin */ + R_l[0] = s_max( R_l[0], 1 ); + move16(); + } + E_LPC_lev_dur( R_h, R_l, lpc_wb_temp_fx, LepsP, LPC_SHB_ORDER_WB, NULL ); Copy_Scale_sig( lpc_wb_temp_fx, lpc_wb_temp_fx, LPC_SHB_ORDER_WB + 1, sub( norm_s( lpc_wb_temp_fx[0] ), 2 ) ); @@ -794,11 +750,11 @@ void wb_tbe_enc_fx( move32(); } - lpc2lsp_fx( &lpc_wb_32_fx[1], lsp_wb_temp_fx, st_fx->prev_lsp_wb_temp_fx, LPC_SHB_ORDER_WB ); + lpc2lsp_fx( &lpc_wb_32_fx[1], lsp_wb_temp_fx, hBWE_TD->prev_lsp_wb_temp_fx, LPC_SHB_ORDER_WB ); FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ ) { - st_fx->prev_lsp_wb_temp_fx[i] = lsp_wb_temp_fx[i]; + hBWE_TD->prev_lsp_wb_temp_fx[i] = lsp_wb_temp_fx[i]; move16(); } @@ -847,11 +803,11 @@ void wb_tbe_enc_fx( lpc_wb_32_fx[i] = L_negate( L_shr( L_deposit_h( lpc_wb[i] ), 1 ) ); move32(); /*Q27 */ } - lpc2lsp_fx( &lpc_wb_32_fx[1], lsp_wb, st_fx->prev_lsp_wb_fx, LPC_SHB_ORDER_LBR_WB ); + lpc2lsp_fx( &lpc_wb_32_fx[1], lsp_wb, hBWE_TD->prev_lsp_wb_fx, LPC_SHB_ORDER_LBR_WB ); FOR( i = 0; i < LPC_SHB_ORDER_LBR_WB; i++ ) { - st_fx->prev_lsp_wb_fx[i] = lsp_wb[i]; + hBWE_TD->prev_lsp_wb_fx[i] = lsp_wb[i]; move16(); } @@ -866,17 +822,17 @@ void wb_tbe_enc_fx( } ELSE { - push_indice_fx( st_fx->hBstr, IND_SHB_LSF, i, NUM_BITS_LBR_WB_LSF ); + push_indice( st_fx->hBstr, IND_SHB_LSF, i, NUM_BITS_LBR_WB_LSF ); } Copy( lbr_wb_bwe_lsfvq_cbook_2bit_fx + i * LPC_SHB_ORDER_LBR_WB, lsp_wb, LPC_SHB_ORDER_LBR_WB ); - lsp2lpc_fx( &lpc_wb[1], lsp_wb, st_fx->prev_lpc_wb_fx, LPC_SHB_ORDER_LBR_WB ); + lsp2lpc_fx( &lpc_wb[1], lsp_wb, hBWE_TD->prev_lpc_wb_fx, LPC_SHB_ORDER_LBR_WB ); set16_fx( lpc_wb + LPC_SHB_ORDER_LBR_WB + 1, 0, ( LPC_SHB_ORDER_WB - LPC_SHB_ORDER_LBR_WB ) ); FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ ) { - st_fx->prev_lpc_wb_fx[i] = lpc_wb[i + 1]; + hBWE_TD->prev_lpc_wb_fx[i] = lpc_wb[i + 1]; move16(); } @@ -907,12 +863,11 @@ void wb_tbe_enc_fx( move32(); /*Q27 */ } - lpc2lsp_fx( &lpc_wb_32_fx[1], lsp_wb, st_fx->prev_lsp_wb_fx, LPC_SHB_ORDER_WB ); - + lpc2lsp_fx( &lpc_wb_32_fx[1], lsp_wb, hBWE_TD->prev_lsp_wb_fx, LPC_SHB_ORDER_WB ); FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ ) { - st_fx->prev_lsp_wb_fx[i] = lsp_wb[i]; + hBWE_TD->prev_lsp_wb_fx[i] = lsp_wb[i]; move16(); } @@ -928,16 +883,15 @@ void wb_tbe_enc_fx( } ELSE { - push_indice_fx( st_fx->hBstr, IND_SHB_LSF, i, NUM_BITS_WB_LSF ); + push_indice( st_fx->hBstr, IND_SHB_LSF, i, NUM_BITS_WB_LSF ); } Copy( wb_bwe_lsfvq_cbook_8bit_fx + i * LPC_SHB_ORDER_WB, lsp_wb, LPC_SHB_ORDER_WB ); - lsp2lpc_fx( &lpc_wb[1], lsp_wb, st_fx->prev_lpc_wb_fx, LPC_SHB_ORDER_WB ); - + lsp2lpc_fx( &lpc_wb[1], lsp_wb, hBWE_TD->prev_lpc_wb_fx, LPC_SHB_ORDER_WB ); FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ ) { - st_fx->prev_lpc_wb_fx[i] = lpc_wb[i + 1]; + hBWE_TD->prev_lpc_wb_fx[i] = lpc_wb[i + 1]; move16(); } FOR( i = 1; i < LPC_SHB_ORDER_WB + 1; i++ ) @@ -990,9 +944,9 @@ void wb_tbe_enc_fx( find_max_mem_wb_enc( st_fx, &n_mem ); - IF( GT_16( sub( Q_bwe_exc, st_fx->prev_Q_bwe_exc ), n_mem ) ) + IF( GT_16( sub( Q_bwe_exc, hBWE_TD->prev_Q_bwe_exc ), n_mem ) ) { - Q_bwe_exc = add( st_fx->prev_Q_bwe_exc, n_mem ); + Q_bwe_exc = add( hBWE_TD->prev_Q_bwe_exc, n_mem ); } IF( uv_flag ) @@ -1008,7 +962,7 @@ void wb_tbe_enc_fx( move32(); IF( st_fx->element_mode > EVS_MONO ) { - tmp = sub( shl( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ), 31 + 16 ); + tmp = sub( shl( sub( hBWE_TD->prev_Q_bwe_exc, 16 ), 1 ), 31 + 16 ); prev_pow = L_shl_sat( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ } FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ ) @@ -1016,7 +970,7 @@ void wb_tbe_enc_fx( prev_pow = L_mac0( prev_pow, hBWE_TD->state_syn_shbexc_fx[i], hBWE_TD->state_syn_shbexc_fx[i] ); /* Q(2*st_fx->prev_Q_bwe_exc) */ } - rescale_genWB_mem_enc( st_fx, sub( Q_bwe_exc, st_fx->prev_Q_bwe_exc ) ); + rescale_genWB_mem_enc( st_fx, sub( Q_bwe_exc, hBWE_TD->prev_Q_bwe_exc ) ); Copy( hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_16, NL_BUFF_OFFSET ); sc = sub( Q_bwe_exc, add( Q_new, Q_new ) ); @@ -1027,11 +981,9 @@ void wb_tbe_enc_fx( } Copy( bwe_exc_extended_16 + L_FRAME32k, hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET ); - Copy( hBWE_TD->state_syn_shbexc_fx, shaped_wb_excitation, L_SHB_LAHEAD / 4 ); Q_bwe_exc_ext = sub( Q_bwe_exc, 16 ); - GenShapedWBExcitation_fx( shaped_wb_excitation + L_SHB_LAHEAD / 4, lpc_wb, exc4kWhtnd, hBWE_TD->mem_csfilt_fx, hBWE_TD->mem_genSHBexc_filt_down_shb_fx, hBWE_TD->mem_genSHBexc_filt_down_wb2_fx, hBWE_TD->mem_genSHBexc_filt_down_wb3_fx, hBWE_TD->state_lpc_syn_fx, coder_type, bwe_exc_extended_16, Q_bwe_exc_ext, hBWE_TD->bwe_seed, @@ -1054,8 +1006,7 @@ void wb_tbe_enc_fx( curr_pow = L_shr( curr_pow, 2 ); /* Q(2*Q_bwe_exc_ext) */ } - Lscale = root_a_over_b_fx( curr_pow, shl_r( Q_bwe_exc_ext, 1 ), prev_pow, shl_r( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ), &exp ); - + Lscale = root_a_over_b_fx( curr_pow, shl_r( Q_bwe_exc_ext, 1 ), prev_pow, shl_r( sub( hBWE_TD->prev_Q_bwe_exc, 16 ), 1 ), &exp ); FOR( i = 0; i < L_SHB_LAHEAD / 4 - 1; i++ ) { @@ -1072,7 +1023,7 @@ void wb_tbe_enc_fx( Copy( shaped_wb_excitation + L_FRAME16k / 4, hBWE_TD->state_syn_shbexc_fx, L_SHB_LAHEAD / 4 ); EstimateSHBGainShape_fx( SHB_OVERLAP_LEN / 2, hb_frame, Q_ns, - shaped_wb_excitation, Q_bwe_exc_ext, GainShape, subwin_wb_fx, NULL ); + shaped_wb_excitation, Q_bwe_exc_ext, GainShape, subwin_wb_fx, NULL, 1 ); /* Gain frame adjustment factor */ test(); @@ -1136,7 +1087,6 @@ void wb_tbe_enc_fx( move16(); /* Q15 */ } - temp_wb_fac_fx = hBWE_TD->prev_wb_GainShape; move16(); FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) @@ -1162,7 +1112,7 @@ void wb_tbe_enc_fx( } ELSE { - push_indice_fx( st_fx->hBstr, IND_UV_FLAG, uv_flag, 1 ); + push_indice( st_fx->hBstr, IND_UV_FLAG, uv_flag, 1 ); /* Quantization of the subframe gain parameter */ QuantizeSHBsubgains_fx( st_fx, GainShape, st_fx->extl ); @@ -1175,7 +1125,6 @@ void wb_tbe_enc_fx( EstimateSHBFrameGain_fx( SHB_OVERLAP_LEN / 2, hb_frame, Q_ns, shaped_wb_excitation, Q_bwe_exc_ext, GainShape, &GainFrame, window_wb_fx, subwin_wb_fx, 0 ); - /* If there's a big difference in the power of gains away from the peak gain */ /* due to poor quantization then suppress energy of the high band. */ @@ -1206,8 +1155,8 @@ void wb_tbe_enc_fx( exp = norm_s( voicingBufAvg_fx ); tmp = div_s( shl( 1, sub( 14, exp ) ), voicingBufAvg_fx ); /* (14-exp) */ L_tmp = L_mult( pitBufAvg_fx, tmp ); /* (21-exp) */ - L_tmp = L_shl_o( L_tmp, add( exp, 10 ), &Overflow ); - tmp = round_fx_o( L_tmp, &Overflow ); /* Q15 */ + L_tmp = L_shl_sat( L_tmp, add( exp, 10 ) ); + tmp = round_fx_sat( L_tmp ); /* Q15 */ } tmp = s_max( s_min( tmp, 32767 ), 22938 ); /* Q15 */ @@ -1224,7 +1173,6 @@ void wb_tbe_enc_fx( /*wbbwe_em_factor = add( mult_r( 29491, st_fx->prev_wbbwe_em_factor_fx ), mult_r( 3277, wbbwe_em_factor ) ); */ /* Q15 */ } - /*0.25f*sum_f(voice_factors, NB_SUBFR)*/ L_tmp = L_mult( voice_factors[0], 8192 ); FOR( i = 1; i < NB_SUBFR; i++ ) @@ -1256,7 +1204,7 @@ void wb_tbe_enc_fx( ScaleShapedSHB_fx( SHB_OVERLAP_LEN / 2, shaped_wb_excitation, hBWE_TD->syn_overlap_fx, GainShape, GainFrame, window_wb_fx, subwin_wb_fx, &Q_bwe_exc_ext, &dummy, dummy, dummy ); - st_fx->prev_Q_bwe_exc = Q_bwe_exc; + hBWE_TD->prev_Q_bwe_exc = Q_bwe_exc; move16(); return; @@ -1337,10 +1285,6 @@ void wb_tbe_enc_ivas_fx( Word16 dummy = 0; Word16 avg_voice_fac; TD_BWE_ENC_HANDLE hBWE_TD = st_fx->hBWE_TD; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif move16(); /*Word16 att = 32767;*/ @@ -1371,7 +1315,7 @@ void wb_tbe_enc_ivas_fx( FOR( j = 0; j < L_SUBFR16k; j = j + 4 ) { L_tmp = L_mult( hb_old_speech[i], ola_win_shb_switch_fold_fx[j] ); - hb_old_speech[i] = mac_ro( L_tmp, hb_speech[k], ola_win_shb_switch_fold_fx[L_SUBFR16k - 4 - j], &Overflow ); + hb_old_speech[i] = mac_r_sat( L_tmp, hb_speech[k], ola_win_shb_switch_fold_fx[L_SUBFR16k - 4 - j] ); move16(); i--; k++; @@ -1380,6 +1324,10 @@ void wb_tbe_enc_ivas_fx( autocorr_fx( hb_old_speech, LPC_SHB_ORDER_WB + 1, R_h, R_l, &Q_R, ( ( NS2SA( INT_FS_12k8, 5000000L ) + L_SUBFR + L_FRAME ) * 5 / 16 ), win_lpc_hb_wb_ivas_fx, 0, 1 ); + /* Ensure R[0] isn't zero when entering Levinson-Durbin */ + R_l[0] = s_max( R_l[0], 1 ); + move16(); + E_LPC_lev_dur( R_h, R_l, lpc_wb_temp_fx, LepsP, LPC_SHB_ORDER_WB, NULL ); // Since 0th index will be 1 in floating point buffer, in fixed point one has to take norm of 0th index to identify the Q-factor Copy_Scale_sig( lpc_wb_temp_fx, lpc_wb_temp_fx, LPC_SHB_ORDER_WB + 1, sub( norm_s( lpc_wb_temp_fx[0] ), 2 ) ); // Q12 @@ -1391,15 +1339,11 @@ void wb_tbe_enc_ivas_fx( move32(); } -#ifdef FIX_ISSUE_1165 - lpc2lsp_ivas_fx( &lpc_wb_32_fx[1], lsp_wb_temp_fx, st_fx->prev_lsp_wb_temp_fx, LPC_SHB_ORDER_WB ); -#else - lpc2lsp_fx( &lpc_wb_32_fx[1], lsp_wb_temp_fx, st_fx->prev_lsp_wb_temp_fx, LPC_SHB_ORDER_WB ); -#endif + lpc2lsp_ivas_fx( &lpc_wb_32_fx[1], lsp_wb_temp_fx, hBWE_TD->prev_lsp_wb_temp_fx, LPC_SHB_ORDER_WB ); FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ ) { - st_fx->prev_lsp_wb_temp_fx[i] = lsp_wb_temp_fx[i]; + hBWE_TD->prev_lsp_wb_temp_fx[i] = lsp_wb_temp_fx[i]; move16(); } @@ -1448,11 +1392,11 @@ void wb_tbe_enc_ivas_fx( lpc_wb_32_fx[i] = L_negate( L_shr( L_deposit_h( lpc_wb[i] ), 1 ) ); move32(); /*Q27 */ } - lpc2lsp_fx( &lpc_wb_32_fx[1], lsp_wb, st_fx->prev_lsp_wb_fx, LPC_SHB_ORDER_LBR_WB ); + lpc2lsp_fx( &lpc_wb_32_fx[1], lsp_wb, hBWE_TD->prev_lsp_wb_fx, LPC_SHB_ORDER_LBR_WB ); FOR( i = 0; i < LPC_SHB_ORDER_LBR_WB; i++ ) { - st_fx->prev_lsp_wb_fx[i] = lsp_wb[i]; + hBWE_TD->prev_lsp_wb_fx[i] = lsp_wb[i]; move16(); } @@ -1472,12 +1416,12 @@ void wb_tbe_enc_ivas_fx( Copy( lbr_wb_bwe_lsfvq_cbook_2bit_fx + i * LPC_SHB_ORDER_LBR_WB, lsp_wb, LPC_SHB_ORDER_LBR_WB ); - lsp2lpc_fx( &lpc_wb[1], lsp_wb, st_fx->prev_lpc_wb_fx, LPC_SHB_ORDER_LBR_WB ); + lsp2lpc_fx( &lpc_wb[1], lsp_wb, hBWE_TD->prev_lpc_wb_fx, LPC_SHB_ORDER_LBR_WB ); set16_fx( lpc_wb + LPC_SHB_ORDER_LBR_WB + 1, 0, ( LPC_SHB_ORDER_WB - LPC_SHB_ORDER_LBR_WB ) ); FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ ) { - st_fx->prev_lpc_wb_fx[i] = lpc_wb[i + 1]; + hBWE_TD->prev_lpc_wb_fx[i] = lpc_wb[i + 1]; move16(); } @@ -1508,12 +1452,11 @@ void wb_tbe_enc_ivas_fx( move32(); /*Q27 */ } - lpc2lsp_fx( &lpc_wb_32_fx[1], lsp_wb, st_fx->prev_lsp_wb_fx, LPC_SHB_ORDER_WB ); - + lpc2lsp_fx( &lpc_wb_32_fx[1], lsp_wb, hBWE_TD->prev_lsp_wb_fx, LPC_SHB_ORDER_WB ); FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ ) { - st_fx->prev_lsp_wb_fx[i] = lsp_wb[i]; + hBWE_TD->prev_lsp_wb_fx[i] = lsp_wb[i]; move16(); } @@ -1525,11 +1468,11 @@ void wb_tbe_enc_ivas_fx( push_indice( st_fx->hBstr, IND_SHB_LSF, i, NUM_BITS_WB_LSF ); Copy( wb_bwe_lsfvq_cbook_8bit_fx + i * LPC_SHB_ORDER_WB, lsp_wb, LPC_SHB_ORDER_WB ); - lsp2lpc_fx( &lpc_wb[1], lsp_wb, st_fx->prev_lpc_wb_fx, LPC_SHB_ORDER_WB ); + lsp2lpc_fx( &lpc_wb[1], lsp_wb, hBWE_TD->prev_lpc_wb_fx, LPC_SHB_ORDER_WB ); FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ ) { - st_fx->prev_lpc_wb_fx[i] = lpc_wb[i + 1]; + hBWE_TD->prev_lpc_wb_fx[i] = lpc_wb[i + 1]; move16(); } FOR( i = 1; i < LPC_SHB_ORDER_WB + 1; i++ ) @@ -1584,9 +1527,9 @@ void wb_tbe_enc_ivas_fx( find_max_mem_wb_enc( st_fx, &n_mem ); - IF( GT_16( sub( Q_bwe_exc, st_fx->prev_Q_bwe_exc ), n_mem ) ) + IF( GT_16( sub( Q_bwe_exc, hBWE_TD->prev_Q_bwe_exc ), n_mem ) ) { - Q_bwe_exc = add( st_fx->prev_Q_bwe_exc, n_mem ); + Q_bwe_exc = add( hBWE_TD->prev_Q_bwe_exc, n_mem ); } IF( uv_flag ) @@ -1611,7 +1554,7 @@ void wb_tbe_enc_ivas_fx( shaped_wb_exc_scale[i] = shr( hBWE_TD->state_syn_shbexc_fx[i], 3 ); move16(); } - Q_prev_pow = shl_r( sub( sub( st_fx->prev_Q_bwe_exc, 16 ), 3 ), 1 ); + Q_prev_pow = shl_r( sub( sub( hBWE_TD->prev_Q_bwe_exc, 16 ), 3 ), 1 ); move16(); } ELSE @@ -1621,7 +1564,7 @@ void wb_tbe_enc_ivas_fx( shaped_wb_exc_scale[i] = hBWE_TD->state_syn_shbexc_fx[i]; move16(); } - Q_prev_pow = shl_r( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ); + Q_prev_pow = shl_r( sub( hBWE_TD->prev_Q_bwe_exc, 16 ), 1 ); move16(); } @@ -1635,7 +1578,7 @@ void wb_tbe_enc_ivas_fx( prev_pow = L_mac0( prev_pow, shaped_wb_exc_scale[i], shaped_wb_exc_scale[i] ); /* Q_prev_pow */ } - rescale_genWB_mem_enc( st_fx, sub( Q_bwe_exc, st_fx->prev_Q_bwe_exc ) ); + rescale_genWB_mem_enc( st_fx, sub( Q_bwe_exc, hBWE_TD->prev_Q_bwe_exc ) ); sc = sub( Q_bwe_exc, add( Q_new, Q_new ) ); FOR( i = 0; i < L_FRAME32k; i++ ) @@ -1711,7 +1654,7 @@ void wb_tbe_enc_ivas_fx( Copy( shaped_wb_excitation + L_FRAME16k / 4, hBWE_TD->state_syn_shbexc_fx, L_SHB_LAHEAD / 4 ); EstimateSHBGainShape_fx( SHB_OVERLAP_LEN / 2, hb_frame, Q_ns, - shaped_wb_excitation, Q_bwe_exc_ext, GainShape, subwin_wb_fx, NULL ); + shaped_wb_excitation, Q_bwe_exc_ext, GainShape, subwin_wb_fx, NULL, 1 ); /* Gain frame adjustment factor */ test(); @@ -1774,7 +1717,6 @@ void wb_tbe_enc_ivas_fx( move16(); /* Q15 */ } - temp_wb_fac_fx = hBWE_TD->prev_wb_GainShape; move16(); FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) @@ -1859,8 +1801,8 @@ void wb_tbe_enc_ivas_fx( exp = norm_s( voicingBufAvg_fx ); tmp = div_s( shl( 1, sub( 14, exp ) ), voicingBufAvg_fx ); /* (14-exp) */ L_tmp = L_mult( pitBufAvg_fx, tmp ); /* (21-exp) */ - L_tmp = L_shl_o( L_tmp, add( exp, 10 ), &Overflow ); - tmp = round_fx_o( L_tmp, &Overflow ); /* Q15 */ + L_tmp = L_shl_sat( L_tmp, add( exp, 10 ) ); + tmp = round_fx_sat( L_tmp ); /* Q15 */ } tmp = s_max( s_min( tmp, 32767 ), 22938 ); /* Q15 */ @@ -1904,7 +1846,6 @@ void wb_tbe_enc_ivas_fx( /* Adjust the subframe and frame gain of the synthesized SHB signal */ /* Scale the shaped excitation*/ - scale_sig( shaped_wb_excitation, ( L_FRAME16k + L_SHB_LAHEAD ) / 4, -1 ); scale_sig( hBWE_TD->syn_overlap_fx, L_SHB_LAHEAD, -1 ); Q_bwe_exc_ext = sub( Q_bwe_exc_ext, 1 ); @@ -1912,7 +1853,7 @@ void wb_tbe_enc_ivas_fx( &Q_bwe_exc_ext, &dummy, dummy, dummy ); Scale_sig( hBWE_TD->syn_overlap_fx, L_SHB_LAHEAD, 1 ); - st_fx->prev_Q_bwe_exc = Q_bwe_exc; + hBWE_TD->prev_Q_bwe_exc = Q_bwe_exc; move16(); return; @@ -2041,10 +1982,6 @@ void swb_tbe_enc_fx( Word16 tilt_para; Word16 Q_bwe_exc_fb; Word16 n_subfr_saturation; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif TD_BWE_ENC_HANDLE hBWE_TD = st_fx->hBWE_TD; RF_ENC_HANDLE hRF = st_fx->hRF; @@ -2409,7 +2346,7 @@ void swb_tbe_enc_fx( /* Account for any outliers in the memories from previous frame for rescaling to avoid saturation */ find_max_mem_enc( st_fx, &n_mem, &n_mem2 ); - tmp2 = add( st_fx->prev_Q_bwe_exc, n_mem ); + tmp2 = add( hBWE_TD->prev_Q_bwe_exc, n_mem ); if ( GT_16( Q_bwe_exc, tmp2 ) ) { Q_bwe_exc = tmp2; @@ -2417,7 +2354,7 @@ void swb_tbe_enc_fx( } /* rescale the memories if Q_bwe_exc is different from previous frame */ - sc = sub( Q_bwe_exc, st_fx->prev_Q_bwe_exc ); + sc = sub( Q_bwe_exc, hBWE_TD->prev_Q_bwe_exc ); IF( sc != 0 ) { rescale_genSHB_mem_enc( st_fx, sc ); @@ -2438,7 +2375,7 @@ void swb_tbe_enc_fx( Copy( hBWE_TD->state_syn_shbexc_fx, shaped_shb_excitation_fx, L_SHB_LAHEAD ); /* save the previous Q factor of the buffer */ - st_fx->prev_Q_bwe_exc = Q_bwe_exc; + hBWE_TD->prev_Q_bwe_exc = Q_bwe_exc; move16(); Q_bwe_exc = sub( Q_bwe_exc, 16 ); /* Q_bwe_exc reflecting the single precision dynamic norm-ed buffers from here */ @@ -2459,7 +2396,7 @@ void swb_tbe_enc_fx( coder_type, bwe_exc_extended_16, hBWE_TD->bwe_seed, vf_modified_fx, st_fx->extl, &( hBWE_TD->tbe_demph_fx ), &( hBWE_TD->tbe_premph_fx ), lpc_shb_sf_fx, shb_ener_sf_Q31, shb_res_gshape_fx, shb_res_fx, &vf_ind_fx, formant_fac_fx, hBWE_TD->fb_state_lpc_syn_fx, - &( hBWE_TD->fb_tbe_demph_fx ), &Q_bwe_exc, &Q_bwe_exc_fb, Q_shb, n_mem2, st_fx->prev_Q_bwe_syn, st_fx->total_brate, 0 ); + &( hBWE_TD->fb_tbe_demph_fx ), &Q_bwe_exc, &Q_bwe_exc_fb, Q_shb, n_mem2, hBWE_TD->prev_Q_bwe_syn, st_fx->total_brate, 0 ); *Q_white_exc = Q_bwe_exc_fb; move16(); @@ -2486,13 +2423,13 @@ void swb_tbe_enc_fx( } ELSE { - push_indice_fx( st_fx->hBstr, IND_SHB_VF, vf_ind_fx, NUM_BITS_SHB_VF ); + push_indice( st_fx->hBstr, IND_SHB_VF, vf_ind_fx, NUM_BITS_SHB_VF ); } } FOR( i = 0; i < LPC_SHB_ORDER; i++ ) { - hBWE_TD->mem_stp_swb_fx[i] = shl( hBWE_TD->mem_stp_swb_fx[i], sub( Q_bwe_exc, st_fx->prev_Q_bwe_syn ) ); + hBWE_TD->mem_stp_swb_fx[i] = shl( hBWE_TD->mem_stp_swb_fx[i], sub( Q_bwe_exc, hBWE_TD->prev_Q_bwe_syn ) ); move16(); } @@ -2500,19 +2437,16 @@ void swb_tbe_enc_fx( { PostShortTerm_fx( &shaped_shb_excitation_fx[L_SHB_LAHEAD + i], lpc_shb_fx, &shaped_shb_excitationTemp_fx[i], hBWE_TD->mem_stp_swb_fx, hBWE_TD->ptr_mem_stp_swb_fx, &( hBWE_TD->gain_prec_swb_fx ), hBWE_TD->mem_zero_swb_fx, formant_fac_fx ); - /* i: shaped_shb_excitation_fx in Q_bwe_exc */ - /* i: lpc_shb_fx in Q12 */ } Copy( shaped_shb_excitationTemp_fx, &shaped_shb_excitation_fx[L_SHB_LAHEAD], L_FRAME16k ); - tmp = sub( shl( Q_bwe_exc, 1 ), 31 ); prev_pow_fx = L_shl( 21475l /*0.00001f Q31*/, tmp ); /* 2*(Q_bwe_exc) */ curr_pow_fx = L_shl( 21475l /*0.00001f Q31*/, tmp ); /* 2*(Q_bwe_exc) */ FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ ) { - prev_pow_fx = L_mac0_o( prev_pow_fx, shaped_shb_excitation_fx[i], shaped_shb_excitation_fx[i], &Overflow ); /* 2*Q_bwe_exc */ - curr_pow_fx = L_mac0_o( curr_pow_fx, shaped_shb_excitation_fx[i + L_SHB_LAHEAD + 10], shaped_shb_excitation_fx[i + L_SHB_LAHEAD + 10], &Overflow ); /* 2*Q_bwe_exc */ + prev_pow_fx = L_mac0_sat( prev_pow_fx, shaped_shb_excitation_fx[i], shaped_shb_excitation_fx[i] ); /* 2*Q_bwe_exc */ + curr_pow_fx = L_mac0_sat( curr_pow_fx, shaped_shb_excitation_fx[i + L_SHB_LAHEAD + 10], shaped_shb_excitation_fx[i + L_SHB_LAHEAD + 10] ); /* 2*Q_bwe_exc */ } if ( GT_16( voice_factors_fx[0], 24576 /*0.75f Q15*/ ) ) @@ -2538,15 +2472,35 @@ void swb_tbe_enc_fx( exp = 0; move16(); } - FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + /* + code for EVS and IVAS are basically identical with the exception of i_mult_sat() which has precision issues + thus is was replaced for IVAS and kept for EVS, in order to keep EVS BE to test sequences and legacy implementations + */ + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { - tmp = i_mult_o( sub( i, 19 ), 3277 /*0.1f Q15*/, &Overflow ); /* Q15 */ - L_tmp1 = Mult_32_16( L_shl_o( 1, sub( 31, exp ), &Overflow ), tmp ); /* Q31-exp */ - tmp = sub( 32767 /*1.0f Q15*/, tmp ); - Lscale = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); - L_tmp = Mult_32_16( Lscale, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ - shaped_shb_excitation_fx[i] = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /* Q_bwe_exc */ - move16(); + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + tmp = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ + L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), tmp ); /* Q31-exp */ + tmp = sub( 32767 /*1.0f Q15*/, tmp ); + Lscale = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation_fx[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); + } + } + ELSE + { + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + tmp = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); + L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), tmp ); /* Q31-exp */ + tmp = sub( 32767 /*1.0f Q15*/, tmp ); + Lscale = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation_fx[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); + } } /* Update SHB excitation */ @@ -2556,7 +2510,7 @@ void swb_tbe_enc_fx( n_subfr_saturation = 0; move16(); EstimateSHBGainShape_fx( SHB_OVERLAP_LEN, shb_frame_fx, Q_shb, shaped_shb_excitation_fx, - Q_bwe_exc, GainShape_fx, subwin_shb_fx, &n_subfr_saturation ); + Q_bwe_exc, GainShape_fx, subwin_shb_fx, &n_subfr_saturation, 1 ); /* Gain shape BWS/high band low energy fix */ IF( LT_16( hBWE_TD->cldfbHBLT, 8192 /*1.0f Q13*/ ) ) /* cldfbHBLT in Q13 */ @@ -2773,9 +2727,9 @@ void swb_tbe_enc_fx( tmp = div_s( shl( 1, sub( 14, exp ) ), voicingBufAvg_fx ); /* (14-exp) */ /* sd_uq_q*pitBufAvg */ - L_tmp = Mult_32_16( L_tmp, pitBufAvg_fx ); /* Q13 * Q10 + 1 -16 => Q8 */ - L_tmp = Mult_32_16( L_tmp, tmp ); /* Q8 + (14 - exp) - 15 => Q7 - exp */ - tmp = round_fx_o( L_shl_o( L_tmp, 31 - ( 7 - exp ), &Overflow ), &Overflow ); /* Q15 */ + L_tmp = Mult_32_16( L_tmp, pitBufAvg_fx ); /* Q13 * Q10 + 1 -16 => Q8 */ + L_tmp = Mult_32_16( L_tmp, tmp ); /* Q8 + (14 - exp) - 15 => Q7 - exp */ + tmp = round_fx_sat( L_shl_sat( L_tmp, 31 - ( 7 - exp ) ) ); /* Q15 */ } tmp = s_min( tmp, 32767 /*1.0f Q15*/ ); @@ -2836,7 +2790,7 @@ void swb_tbe_enc_fx( } /* *Q_white_exc = Q_bwe_exc_mod; move16(); output Qwhiteexc_FB from the GenShapedSHB function*/ - st_fx->prev_Q_bwe_syn = Q_bwe_exc; + hBWE_TD->prev_Q_bwe_syn = Q_bwe_exc; move16(); return; @@ -2963,10 +2917,6 @@ void swb_tbe_enc_ivas_fx( Word16 tilt_para_fx; Word16 Q_bwe_exc_fb; Word16 n_subfr_saturation; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif Env_error_fx = 0; move16(); @@ -3065,7 +3015,7 @@ void swb_tbe_enc_ivas_fx( { FOR( i = 1; i <= LPC_SHB_ORDER; i++ ) { - L_tmp = Mpy_32( R_h[i], R_l[i], wac_swb_h[i - 1], wac_swb_l[i - 1] ); + L_tmp = Mpy_32( R_h[i], R_l[i], wac_swb_ivas_h[i - 1], wac_swb_ivas_l[i - 1] ); L_Extract( L_tmp, &R_h[i], &R_l[i] ); } } @@ -3086,7 +3036,21 @@ void swb_tbe_enc_ivas_fx( enerG = Enr_1_Az_fx( lpc_shb1, 2 * L_SUBFR ); /* Q3 */ /* if the LP gain is greater than a threshold, avoid saturation */ - IF( GT_16( enerG, 256 /*32 Q3*/ ) ) + Word16 flag_sat = 0; + Word16 lpc_shb_fx0_req_shift = sub( norm_s( lpc_shb_fx[0] ), 2 ); + IF( GT_16( lpc_shb_fx0_req_shift, 0 ) ) + { + FOR( i = 1; i <= LPC_SHB_ORDER; i++ ) + { + IF( LT_16( norm_s( lpc_shb_fx[i] ), lpc_shb_fx0_req_shift ) ) + { + flag_sat = 1; + break; + } + } + } + + IF( GT_16( enerG, 256 /* 32.0 in Q3 */ ) || flag_sat ) { set16_fx( lpc_shb_fx, 0, LPC_SHB_ORDER + 1 ); E_LPC_lev_dur( R_h, R_l, lpc_shb_fx, LepsP, 2, NULL ); /* LPC in Q14 */ @@ -3094,7 +3058,7 @@ void swb_tbe_enc_ivas_fx( } /* this is needed as the E_LPC_lev_dur function outputs lpc in Q14 */ - Copy_Scale_sig( lpc_shb_fx, lpc_shb_fx, LPC_SHB_ORDER + 1, sub( norm_s( lpc_shb_fx[0] ), 2 ) ); + scale_sig( lpc_shb_fx, LPC_SHB_ORDER + 1, sub( norm_s( lpc_shb_fx[0] ), 2 ) ); /* Expand bandwidth of the LP coeffs */ test(); @@ -3110,6 +3074,14 @@ void swb_tbe_enc_ivas_fx( /* stab_check = a2lsp( lsf_shb, lpc_shb, LPC_SHB_ORDER ); */ + /* LPC to LSP conversion */ + /* LPC: Q12, LSP: Q15 */ + E_LPC_a_lsp_conversion( lpc_shb_fx, lsp_shb_fx, hBWE_TD->prev_lsp_shb_fx, LPC_SHB_ORDER ); + + /* LSP to LSF conversion */ + /* LSP: Q15, LSF: Q15 */ + E_LPC_lsp_lsf_conversion( lsp_shb_fx, lsf_shb_fx, LPC_SHB_ORDER ); + test(); test(); IF( ( NE_16( st_fx->last_extl, SWB_TBE ) && NE_16( st_fx->last_extl, FB_TBE ) ) || st_fx->ini_frame == 0 ) @@ -3127,14 +3099,6 @@ void swb_tbe_enc_ivas_fx( // mvr2r( hBWE_TD->prev_lsp_shb, lsf_shb, LPC_SHB_ORDER ); // } - /* LPC to LSP conversion */ - /* LPC: Q12, LSP: Q15 */ - E_LPC_a_lsp_conversion( lpc_shb_fx, lsp_shb_fx, hBWE_TD->prev_lsp_shb_fx, LPC_SHB_ORDER ); - - /* LSP to LSF conversion */ - /* LSP: Q15, LSF: Q15 */ - E_LPC_lsp_lsf_conversion( lsp_shb_fx, lsf_shb_fx, LPC_SHB_ORDER ); - Copy( lsp_shb_fx, hBWE_TD->prev_lsp_shb_fx, LPC_SHB_ORDER ); Copy( lsf_shb_fx, lsf_shb_orig_fx, LPC_SHB_ORDER ); @@ -3669,7 +3633,7 @@ void swb_tbe_enc_ivas_fx( /* Account for any outliers in the memories from previous frame for rescaling to avoid saturation */ find_max_mem_enc( st_fx, &n_mem, &n_mem2 ); - tmp2 = add( st_fx->prev_Q_bwe_exc, n_mem ); + tmp2 = add( hBWE_TD->prev_Q_bwe_exc, n_mem ); if ( GT_16( Q_bwe_exc, tmp2 ) ) { Q_bwe_exc = tmp2; @@ -3677,7 +3641,7 @@ void swb_tbe_enc_ivas_fx( } /* rescale the memories if Q_bwe_exc is different from previous frame */ - sc = sub( Q_bwe_exc, st_fx->prev_Q_bwe_exc ); + sc = sub( Q_bwe_exc, hBWE_TD->prev_Q_bwe_exc ); IF( sc != 0 ) { rescale_genSHB_mem_enc( st_fx, sc ); @@ -3695,7 +3659,7 @@ void swb_tbe_enc_ivas_fx( Copy( hBWE_TD->state_syn_shbexc_fx, shaped_shb_excitation_fx, L_SHB_LAHEAD ); /* save the previous Q factor of the buffer */ - st_fx->prev_Q_bwe_exc = Q_bwe_exc; + hBWE_TD->prev_Q_bwe_exc = Q_bwe_exc; move16(); Q_bwe_exc = sub( Q_bwe_exc, 16 ); /* Q_bwe_exc reflecting the single precision dynamic norm-ed buffers from here */ @@ -3708,7 +3672,7 @@ void swb_tbe_enc_ivas_fx( hBWE_TD->mem_genSHBexc_filt_down_shb_fx, hBWE_TD->state_lpc_syn_fx, st_fx->coder_type, bwe_exc_extended_16, hBWE_TD->bwe_seed, vf_modified_fx, st_fx->extl, &( hBWE_TD->tbe_demph_fx ), &( hBWE_TD->tbe_premph_fx ), lpc_shb_sf_fx, shb_ener_sf_Q31, shb_res_gshape_fx, shb_res_fx, &vf_ind_fx, formant_fac_fx, hBWE_TD->fb_state_lpc_syn_fx, &( hBWE_TD->fb_tbe_demph_fx ), &Q_bwe_exc, - &Q_bwe_exc_fb, Q_shb, n_mem2, st_fx->prev_Q_bwe_syn, st_fx->total_brate, 0, st_fx->element_mode, st_fx->flag_ACELP16k, nlExc16k_fx, + &Q_bwe_exc_fb, Q_shb, n_mem2, hBWE_TD->prev_Q_bwe_syn, st_fx->total_brate, 0, st_fx->element_mode, st_fx->flag_ACELP16k, nlExc16k_fx, nlExc16k_e, mixExc16k_fx, mixExc16k_e, st_fx->extl_brate, MSFlag, EnvSHBres_4k_norm_fx, Q_EnvSHBres_4k_norm, &( hBWE_TD->prev_pow_exc16kWhtnd_fx32 ), &( hBWE_TD->prev_mix_factor_fx ), &Env_error_fx, Env_error_part_fx ); @@ -3760,7 +3724,7 @@ void swb_tbe_enc_ivas_fx( FOR( i = 0; i < LPC_SHB_ORDER; i++ ) { - hBWE_TD->mem_stp_swb_fx[i] = shl_sat( hBWE_TD->mem_stp_swb_fx[i], sub( Q_bwe_exc, st_fx->prev_Q_bwe_syn ) ); + hBWE_TD->mem_stp_swb_fx[i] = shl_sat( hBWE_TD->mem_stp_swb_fx[i], sub( Q_bwe_exc, hBWE_TD->prev_Q_bwe_syn ) ); move16(); } @@ -3824,8 +3788,8 @@ void swb_tbe_enc_ivas_fx( FOR( i = 0; i < L_SHB_LAHEAD; i++ ) { - L_tmp = Mult_32_16( Lscale, shaped_shb_excitation_fx[i] ); /* Q(16-exp+Q_bwe_exc) */ - shaped_shb_excitation_fx[i] = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /* Q_bwe_exc */ + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation_fx[i] ); /* Q(16-exp+Q_bwe_exc) */ + shaped_shb_excitation_fx[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ move16(); } IF( exp < 0 ) @@ -3834,15 +3798,35 @@ void swb_tbe_enc_ivas_fx( exp = 0; move16(); } - FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + /* + code for EVS and IVAS are basically identical with the exception of i_mult_sat() which has precision issues + thus is was replaced for IVAS and kept for EVS, in order to keep EVS BE to test sequences and legacy implementations + */ + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { - tmp = i_mult_o( sub( i, 19 ), 3277 /*0.1f Q15*/, &Overflow ); /* Q15 */ - L_tmp1 = Mult_32_16( L_shl_o( 1, sub( 31, exp ), &Overflow ), tmp ); /* Q31-exp */ - tmp = sub( 32767 /*1.0f Q15*/, tmp ); - Lscale = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); - L_tmp = Mult_32_16( Lscale, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ - shaped_shb_excitation_fx[i] = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /* Q_bwe_exc */ - move16(); + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + tmp = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ + L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), tmp ); /* Q31-exp */ + tmp = sub( 32767 /*1.0f Q15*/, tmp ); + L_tmp = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); + L_tmp = Mult_32_16( L_tmp, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation_fx[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); + } + } + ELSE + { + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + tmp = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); + L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), tmp ); /* Q31-exp */ + tmp = sub( 32767 /*1.0f Q15*/, tmp ); + L_tmp = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); + L_tmp = Mult_32_16( L_tmp, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation_fx[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); + } } } ELSE @@ -3861,7 +3845,7 @@ void swb_tbe_enc_ivas_fx( n_subfr_saturation = 0; move16(); EstimateSHBGainShape_fx( SHB_OVERLAP_LEN, shb_frame_fx, Q_shb, shaped_shb_excitation_fx, - Q_bwe_exc, GainShape_fx, subwin_shb_fx, &n_subfr_saturation ); + Q_bwe_exc, GainShape_fx, subwin_shb_fx, &n_subfr_saturation, 0 ); test(); IF( EQ_32( st_fx->extl_brate, SWB_TBE_1k10 ) || EQ_32( st_fx->extl_brate, SWB_TBE_1k75 ) ) @@ -4002,7 +3986,7 @@ void swb_tbe_enc_ivas_fx( FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) { // GainShape[i] = ( 1 - feedback ) * GainShape[i] + feedback * GainShape_Interp[i]; -#ifdef IMPROV_PRECISION_EVSBE +#ifdef IMPROV_COMPLEX_BE GainShape_fx[i] = extract_h( L_mac( L_mult( sub( MAX16B, feedback ), GainShape_fx[i] ), feedback, GainShape_Interp_fx[i] ) ); #else GainShape_fx[i] = extract_h( L_add( L_mult( sub( MAX16B, feedback ), GainShape_fx[i] ), L_mult( feedback, GainShape_Interp_fx[i] ) ) ); @@ -4073,7 +4057,6 @@ void swb_tbe_enc_ivas_fx( } } - hBWE_TD->prev_swb_GainShape_fx = GainShape_fx[3]; move16(); @@ -4089,7 +4072,6 @@ void swb_tbe_enc_ivas_fx( /* Quantization of the gain shape parameter */ QuantizeSHBsubgains_ivas_fx( st_fx, GainShape_fx, st_fx->extl ); - /* o: GainShape_fx in Q15 */ /* Compute the power of gains away from the peak gain after quantization */ IF( st_fx->element_mode > EVS_MONO ) @@ -4122,7 +4104,7 @@ void swb_tbe_enc_ivas_fx( FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) { // GainShape[i] = ( 1 - feedback ) * GainShape[i * NUM_SHB_SUBGAINS] + feedback * GainShape_Interp[i]; -#ifdef IMPROV_PRECISION_EVSBE +#ifdef IMPROV_COMPLEX_BE GainShape_fx[i] = extract_h( L_mac( L_mult( sub( MAX16B, feedback ), GainShape_fx[i * NUM_SHB_SUBGAINS] ), feedback, GainShape_Interp_fx[i] ) ); // Q15 #else GainShape_fx[i] = extract_h( L_add( L_mult( sub( MAX16B, feedback ), GainShape_fx[i * NUM_SHB_SUBGAINS] ), L_mult( feedback, GainShape_Interp_fx[i] ) ) ); // Q15 @@ -4355,9 +4337,9 @@ void swb_tbe_enc_ivas_fx( tmp = div_s( shl( 1, sub( 14, exp ) ), voicingBufAvg_fx ); /* (14-exp) */ /* sd_uq_q*pitBufAvg */ - L_tmp = Mult_32_16( L_tmp, pitBufAvg_fx ); /* Q13 * Q10 + 1 -16 => Q8 */ - L_tmp = Mult_32_16( L_tmp, tmp ); /* Q8 + (14 - exp) - 15 => Q7 - exp */ - tmp = round_fx_o( L_shl_o( L_tmp, 31 - ( 7 - exp ), &Overflow ), &Overflow ); /* Q15 */ + L_tmp = Mult_32_16( L_tmp, pitBufAvg_fx ); /* Q13 * Q10 + 1 -16 => Q8 */ + L_tmp = Mult_32_16( L_tmp, tmp ); /* Q8 + (14 - exp) - 15 => Q7 - exp */ + tmp = round_fx_sat( L_shl_sat( L_tmp, 31 - ( 7 - exp ) ) ); /* Q15 */ } tmp = s_min( tmp, 32767 /*1.0f Q15*/ ); tmp = s_max( tmp, 19661 /*0.6f Q15*/ ); @@ -4457,7 +4439,7 @@ void swb_tbe_enc_ivas_fx( move16(); /* *Q_white_exc = Q_bwe_exc_mod; move16(); output Qwhiteexc_FB from the GenShapedSHB function*/ - st_fx->prev_Q_bwe_syn = Q_bwe_exc; + hBWE_TD->prev_Q_bwe_syn = Q_bwe_exc; move16(); return; @@ -4512,10 +4494,6 @@ static void EstimateSHBFrameGain_fx( Word16 exp_out; Word16 tmp; Word16 scaling = 0; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif move16(); /* initilaization */ @@ -4625,27 +4603,26 @@ static void EstimateSHBFrameGain_fx( FOR( i = 0; i < l_shb_lahead; i++ ) { - sig = mult_ro( oriSHB[i], win_shb[i], &Overflow ); /* Q_oriSHB */ - oriNrg = L_mac0_o( oriNrg, sig, sig, &Overflow ); /* 2*Q_orisHB*/ - sig = round_fx_o( Mult_32_16( mod_syn[i], win_shb[i] ), &Overflow ); /*Q_synSHB */ - synNrg = L_mac0_o( synNrg, sig, sig, &Overflow ); /* 2*Q_synSHB */ + sig = mult_r_sat( oriSHB[i], win_shb[i] ); /* Q_oriSHB */ + oriNrg = L_mac0_sat( oriNrg, sig, sig ); /* 2*Q_orisHB*/ + sig = round_fx_sat( Mult_32_16( mod_syn[i], win_shb[i] ) ); /*Q_synSHB */ + synNrg = L_mac0_sat( synNrg, sig, sig ); /* 2*Q_synSHB */ } FOR( ; i < l_frame; i++ ) { - oriNrg = L_mac0_o( oriNrg, oriSHB[i], oriSHB[i], &Overflow ); /* 2*Q_oriSHB */ - sig = round_fx_o( mod_syn[i], &Overflow ); /* Q_oriSHB */ - synNrg = L_mac0_o( synNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB */ + oriNrg = L_mac0_sat( oriNrg, oriSHB[i], oriSHB[i] ); /* 2*Q_oriSHB */ + sig = round_fx_sat( mod_syn[i] ); /* Q_oriSHB */ + synNrg = L_mac0_sat( synNrg, sig, sig ); /* 2*Q_oriSHB */ } tmp = add( l_frame, l_shb_lahead ); FOR( ; i < tmp; i++ ) { - sig = mult_ro( oriSHB[i], win_shb[l_frame + l_shb_lahead - 1 - i], &Overflow ); /* Q_oriSHB */ - oriNrg = L_mac0_o( oriNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB */ - - sig = round_fx_o( Mult_32_16( mod_syn[i], win_shb[l_frame + l_shb_lahead - 1 - i] ), &Overflow ); /* Q_oriSHB */ - synNrg = L_mac0_o( synNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB */ + sig = mult_r_sat( oriSHB[i], win_shb[l_frame + l_shb_lahead - 1 - i] ); /* Q_oriSHB */ + oriNrg = L_mac0_sat( oriNrg, sig, sig ); /* 2*Q_oriSHB */ + sig = round_fx_sat( Mult_32_16( mod_syn[i], win_shb[l_frame + l_shb_lahead - 1 - i] ) ); /* Q_oriSHB */ + synNrg = L_mac0_sat( synNrg, sig, sig ); /* 2*Q_oriSHB */ } IF( EQ_32( oriNrg, MAX_32 ) ) { @@ -4654,18 +4631,18 @@ static void EstimateSHBFrameGain_fx( move32(); FOR( i = 0; i < l_shb_lahead; i++ ) { - sig = mult_r( shl_o( oriSHB[i], scaling, &Overflow ), win_shb[i] ); - oriNrg = L_mac0_o( oriNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB + 2*scaling */ + sig = mult_r( shl_sat( oriSHB[i], scaling ), win_shb[i] ); + oriNrg = L_mac0_sat( oriNrg, sig, sig ); /* 2*Q_oriSHB + 2*scaling */ } FOR( ; i < l_frame; i++ ) { - sig = shl_o( oriSHB[i], scaling, &Overflow ); - oriNrg = L_mac0_o( oriNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB + 2*scaling */ + sig = shl_sat( oriSHB[i], scaling ); + oriNrg = L_mac0_sat( oriNrg, sig, sig ); /* 2*Q_oriSHB + 2*scaling */ } FOR( ; i < tmp; i++ ) { - sig = mult_r( shl_o( oriSHB[i], scaling, &Overflow ), win_shb[l_frame + l_shb_lahead - 1 - i] ); - oriNrg = L_mac0_o( oriNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB + 2*scaling */ + sig = mult_r( shl_sat( oriSHB[i], scaling ), win_shb[l_frame + l_shb_lahead - 1 - i] ); + oriNrg = L_mac0_sat( oriNrg, sig, sig ); /* 2*Q_oriSHB + 2*scaling */ } } L_tmp = root_a_over_b_fx( oriNrg, 2 * Q_oriSHB, synNrg, 2 * Q_synSHB, &exp_out ); @@ -4701,10 +4678,6 @@ static void EstimateSHBFrameGain_ivas_fx( Word16 exp_out; Word16 tmp; Word16 scaling = 0; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif move16(); /* initilaization */ @@ -4814,27 +4787,26 @@ static void EstimateSHBFrameGain_ivas_fx( FOR( i = 0; i < l_shb_lahead; i++ ) { - sig = mult_ro( oriSHB[i], win_shb[i], &Overflow ); /* Q_oriSHB */ - oriNrg = L_mac0_o( oriNrg, sig, sig, &Overflow ); /* 2*Q_orisHB*/ - sig = round_fx_o( Mult_32_16( mod_syn[i], win_shb[i] ), &Overflow ); /*Q_synSHB */ - synNrg = L_mac0_o( synNrg, sig, sig, &Overflow ); /* 2*Q_synSHB - 2*/ + sig = mult_r_sat( oriSHB[i], win_shb[i] ); /* Q_oriSHB */ + oriNrg = L_mac0_sat( oriNrg, sig, sig ); /* 2*Q_orisHB*/ + sig = round_fx_sat( Mult_32_16( mod_syn[i], win_shb[i] ) ); /*Q_synSHB */ + synNrg = L_mac0_sat( synNrg, sig, sig ); /* 2*Q_synSHB - 2*/ } FOR( ; i < l_frame; i++ ) { - oriNrg = L_mac0_o( oriNrg, oriSHB[i], oriSHB[i], &Overflow ); /* 2*Q_oriSHB */ - sig = round_fx_o( mod_syn[i], &Overflow ); /* Q_oriSHB */ - synNrg = L_mac0_o( synNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB - 2*/ + oriNrg = L_mac0_sat( oriNrg, oriSHB[i], oriSHB[i] ); /* 2*Q_oriSHB */ + sig = round_fx_sat( mod_syn[i] ); /* Q_oriSHB */ + synNrg = L_mac0_sat( synNrg, sig, sig ); /* 2*Q_oriSHB - 2*/ } tmp = add( l_frame, l_shb_lahead ); FOR( ; i < tmp; i++ ) { - sig = mult_ro( oriSHB[i], win_shb[l_frame + l_shb_lahead - 1 - i], &Overflow ); /* Q_oriSHB */ - oriNrg = L_mac0_o( oriNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB */ - - sig = round_fx_o( Mult_32_16( mod_syn[i], win_shb[l_frame + l_shb_lahead - 1 - i] ), &Overflow ); /* Q_oriSHB */ - synNrg = L_mac0_o( synNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB - 2*/ + sig = mult_r_sat( oriSHB[i], win_shb[l_frame + l_shb_lahead - 1 - i] ); /* Q_oriSHB */ + oriNrg = L_mac0_sat( oriNrg, sig, sig ); /* 2*Q_oriSHB */ + sig = round_fx_sat( Mult_32_16( mod_syn[i], win_shb[l_frame + l_shb_lahead - 1 - i] ) ); /* Q_oriSHB */ + synNrg = L_mac0_sat( synNrg, sig, sig ); /* 2*Q_oriSHB - 2*/ } IF( EQ_32( oriNrg, MAX_32 ) ) { @@ -4843,18 +4815,18 @@ static void EstimateSHBFrameGain_ivas_fx( move32(); FOR( i = 0; i < l_shb_lahead; i++ ) { - sig = mult_r( shl_o( oriSHB[i], scaling, &Overflow ), win_shb[i] ); - oriNrg = L_mac0_o( oriNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB + 2*scaling */ + sig = mult_r( shl_sat( oriSHB[i], scaling ), win_shb[i] ); + oriNrg = L_mac0_sat( oriNrg, sig, sig ); /* 2*Q_oriSHB + 2*scaling */ } FOR( ; i < l_frame; i++ ) { - sig = shl_o( oriSHB[i], scaling, &Overflow ); - oriNrg = L_mac0_o( oriNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB + 2*scaling */ + sig = shl_sat( oriSHB[i], scaling ); + oriNrg = L_mac0_sat( oriNrg, sig, sig ); /* 2*Q_oriSHB + 2*scaling */ } FOR( ; i < tmp; i++ ) { - sig = mult_r( shl_o( oriSHB[i], scaling, &Overflow ), win_shb[l_frame + l_shb_lahead - 1 - i] ); - oriNrg = L_mac0_o( oriNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB + 2*scaling */ + sig = mult_r( shl_sat( oriSHB[i], scaling ), win_shb[l_frame + l_shb_lahead - 1 - i] ); + oriNrg = L_mac0_sat( oriNrg, sig, sig ); /* 2*Q_oriSHB + 2*scaling */ } } L_tmp = root_a_over_b_fx( oriNrg, shl( Q_oriSHB, 1 ), synNrg, sub( shl( Q_synSHB, 1 ), 2 ), &exp_out ); @@ -4943,14 +4915,15 @@ static Word32 pow_off_pk_corrected_fx( Word16 a[], Word16 len, Word16 step ) /*--------------------------------------------------------------------------*/ static void EstimateSHBGainShape_fx( - const Word16 length, /* i : SHB overlap length */ - const Word16 *oriSHB, /* i : target original SHB frame Q(Q_oriSHB) */ - const Word16 Q_oriSHB, /* i : Q of target original SHB frame */ - const Word16 *synSHB, /* i : shaped SHB excitation Q(Q_synSHB) */ - const Word16 Q_synSHB, /* i : Q of shaped SHB excitation */ - Word16 *subgain, /* o : estimate of gain shape Q15 */ - const Word16 *subwin, /* i : SHB subframe window Q15 */ - Word16 *n_subfr_saturation /* o : Number of subframes which saturated while calculating oriNrg */ + const Word16 length, /* i : SHB overlap length */ + const Word16 *oriSHB, /* i : target original SHB frame Q(Q_oriSHB) */ + const Word16 Q_oriSHB, /* i : Q of target original SHB frame */ + const Word16 *synSHB, /* i : shaped SHB excitation Q(Q_synSHB) */ + const Word16 Q_synSHB, /* i : Q of shaped SHB excitation */ + Word16 *subgain, /* o : estimate of gain shape Q15 */ + const Word16 *subwin, /* i : SHB subframe window Q15 */ + Word16 *n_subfr_saturation, /* o : Number of subframes which saturated while calculating oriNrg */ + const Flag limit_min_gain /* i : gain shape limiting flag */ ) { const Word16 *skip; @@ -4967,10 +4940,6 @@ static void EstimateSHBGainShape_fx( Word16 length_tmp; Word32 L_tmp, normFact; Word16 scaling = 0; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif move32(); move16(); move16(); @@ -5087,26 +5056,26 @@ static void EstimateSHBGainShape_fx( j = i_mult2( join_length, i ); FOR( k = 0; k < length; k++ ) { - sig = mult_r( oriSHB[j + k], subwin[k + 1] ); /* Q_oriSHB */ - oriNrg = L_mac0_o( oriNrg, sig, sig, &Overflow ); /* 2* Q_oriSHB */ - sig = mult_r( synSHB[j + k], subwin[k + 1] ); /* Q_oriSHB */ - synNrg = L_mac0_o( synNrg, sig, sig, &Overflow ); /* 2* Q_oriSHB */ + sig = mult_r( oriSHB[j + k], subwin[k + 1] ); /* Q_oriSHB */ + oriNrg = L_mac0_sat( oriNrg, sig, sig ); /* 2* Q_oriSHB */ + sig = mult_r( synSHB[j + k], subwin[k + 1] ); /* Q_oriSHB */ + synNrg = L_mac0_sat( synNrg, sig, sig ); /* 2* Q_oriSHB */ } FOR( k = 0; k < ( join_length - length ); k++ ) { - sig = mult_r( oriSHB[length + j + k], 32767 ); /* Q_oriSHB */ - oriNrg = L_mac0_o( oriNrg, sig, sig, &Overflow ); /* 2* Q_oriSHB */ - sig = mult_r( synSHB[length + j + k], 32767 ); /* Q_oriSHB */ - synNrg = L_mac0_o( synNrg, sig, sig, &Overflow ); /* 2* Q_oriSHB */ + sig = mult_r( oriSHB[length + j + k], 32767 ); /* Q_oriSHB */ + oriNrg = L_mac0_sat( oriNrg, sig, sig ); /* 2* Q_oriSHB */ + sig = mult_r( synSHB[length + j + k], 32767 ); /* Q_oriSHB */ + synNrg = L_mac0_sat( synNrg, sig, sig ); /* 2* Q_oriSHB */ } FOR( k = 0; k < length; k++ ) { sig = mult_r( oriSHB[j + join_length + k], subwin[length - k - 1] ); /* Q_oriSHB */ - oriNrg = L_mac0_o( oriNrg, sig, sig, &Overflow ); /* 2* Q_oriSHB */ + oriNrg = L_mac0_sat( oriNrg, sig, sig ); /* 2* Q_oriSHB */ sig = mult_r( synSHB[j + join_length + k], subwin[length - k - 1] ); /* Q_oriSHB */ - synNrg = L_mac0_o( synNrg, sig, sig, &Overflow ); /* 2* Q_oriSHB */ + synNrg = L_mac0_sat( synNrg, sig, sig ); /* 2* Q_oriSHB */ } /* Only implemented in SWB because the length of samples in SWB frame is longer, more likely to saturate */ scaling = 0; @@ -5153,8 +5122,8 @@ static void EstimateSHBGainShape_fx( FOR( i = 0; i < num_gains; i++ ) { - subgain[i] = round_fx_o( L_shl_o( L_subgain[i], sub( norm[i], n_max + 1 ), &Overflow ), &Overflow ); /* Q(14-n_max) */ - L_sum_gain = L_mac0_o( L_sum_gain, subgain[i], subgain[i], &Overflow ); /* Q(28-2*n_max) */ + subgain[i] = round_fx_sat( L_shl_sat( L_subgain[i], sub( norm[i], n_max + 1 ) ) ); /* Q(14-n_max) */ + L_sum_gain = L_mac0_sat( L_sum_gain, subgain[i], subgain[i] ); /* Q(28-2*n_max) */ move16(); } @@ -5164,11 +5133,23 @@ static void EstimateSHBGainShape_fx( n = sub( 31, add( n, ( sub( 28, shl( n_max, 1 ) ) ) ) ); normFact = Isqrt_lc( L_sum_gain, &n ); - FOR( i = 0; i < num_gains; i++ ) + IF( limit_min_gain ) { - L_tmp = Mpy_32_16_1( normFact, subgain[i] ); /*Q(31-n) * Q(31-norm[i]) */ /* Q(30-n-n_max) */ - subgain[i] = s_max( round_fx_o( L_shl_o( L_tmp, add( n, n_max + 1 ), &Overflow ), &Overflow ), 3277 /*0.1f Q15*/ ); /* Q15 */ - move16(); + FOR( i = 0; i < num_gains; i++ ) + { + L_tmp = Mpy_32_16_1( normFact, subgain[i] ); /*Q(31-n) * Q(31-norm[i]) */ /* Q(30-n-n_max) */ + subgain[i] = s_max( round_fx_sat( L_shl_sat( L_tmp, add( n, n_max + 1 ) ) ), 3277 /*0.1f Q15*/ ); /* Q15 */ + move16(); + } + } + ELSE + { + FOR( i = 0; i < num_gains; i++ ) + { + L_tmp = Mpy_32_16_1( normFact, subgain[i] ); /*Q(31-n) * Q(31-norm[i]) */ /* Q(30-n-n_max) */ + subgain[i] = round_fx_sat( L_shl_sat( L_tmp, add( n, n_max + 1 ) ) ); /* Q15 */ + move16(); + } } return; @@ -5342,7 +5323,7 @@ static void QuantizeSHBsubgains_fx( idxSubGain = closest_centroid_lc_fx( subgains + NUM_SHB_SUBFR / 4, HBCB_SubGain5bit_fx, 1 << NUM_BITS_SHB_SUBGAINS ); Copy( HBCB_SubGain5bit_fx + idxSubGain * NUM_SHB_SUBFR / 4, subgains, NUM_SHB_SUBFR / 4 ); - push_indice_fx( hBstr, IND_SHB_SUBGAIN, idxSubGain, NUM_BITS_SHB_SUBGAINS ); + push_indice( hBstr, IND_SHB_SUBGAIN, idxSubGain, NUM_BITS_SHB_SUBGAINS ); FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) { @@ -5413,7 +5394,7 @@ static void QuantizeSHBsubgains_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( hBstr, IND_SHB_SUBGAIN, idxSubGain, NUM_BITS_SHB_SUBGAINS ); + push_indice( hBstr, IND_SHB_SUBGAIN, idxSubGain, NUM_BITS_SHB_SUBGAINS ); } } @@ -5608,8 +5589,9 @@ static void Quant_shb_ener_sf_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( st_fx->hBstr, IND_SHB_ENER_SF, idxSubEner_fx, NUM_BITS_SHB_ENER_SF ); + push_indice( st_fx->hBstr, IND_SHB_ENER_SF, idxSubEner_fx, NUM_BITS_SHB_ENER_SF ); } + return; } @@ -5664,6 +5646,7 @@ static void Quant_shb_ener_sf_ivas_fx( { push_indice( st_fx->hBstr, IND_SHB_ENER_SF, idxSubEner_fx, NUM_BITS_SHB_ENER_SF ); } + return; } @@ -5695,9 +5678,11 @@ static void Quant_shb_res_gshape_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( st_fx->hBstr, IND_SHB_RES_GS1 + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); + push_indice( st_fx->hBstr, IND_SHB_RES_GS + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); } } + + return; } @@ -5731,9 +5716,11 @@ static void Quant_shb_res_gshape_ivas_fx( } ELSE { - push_indice( st->hBstr, IND_SHB_RES_GS1 + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); + push_indice( st->hBstr, IND_SHB_RES_GS + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); } } + + return; } @@ -5761,8 +5748,7 @@ static void QuantizeSHBframegain_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ Word32 *GainFrame, /* i/o: Gain Q18 */ const Word16 extl, /* i : extension layer */ - Word32 extl_brate /* i : extension layer bitrate */ - , + Word32 extl_brate, /* i : extension layer bitrate */ Word16 *rf_gainFrame_ind ) { Word16 idxFrameGain; @@ -5799,7 +5785,7 @@ static void QuantizeSHBframegain_fx( 1 << NUM_BITS_SHB_FrameGain, &idxFrameGain, &Q_GainFrame, SHBCB_FrameGain64_fx ); - push_indice_fx( st_fx->hBstr, IND_SHB_FRAMEGAIN, idxFrameGain, NUM_BITS_SHB_FrameGain ); + push_indice( st_fx->hBstr, IND_SHB_FRAMEGAIN, idxFrameGain, NUM_BITS_SHB_FrameGain ); *rf_gainFrame_ind = idxFrameGain; move16(); /* Q18 */ } @@ -5864,7 +5850,7 @@ static void QuantizeSHBframegain_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( st_fx->hBstr, IND_SHB_FRAMEGAIN, idxFrameGain, NUM_BITS_SHB_FRAMEGAIN ); + push_indice( st_fx->hBstr, IND_SHB_FRAMEGAIN, idxFrameGain, NUM_BITS_SHB_FRAMEGAIN ); } *rf_gainFrame_ind = idxFrameGain; move16(); @@ -6172,10 +6158,6 @@ static void determine_gain_weights_fx( Word16 j; Word16 exp, exp1, frac, tmp, exp2; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif FOR( j = 0; j < dims; j++ ) { @@ -6196,7 +6178,7 @@ static void determine_gain_weights_fx( { exp2 = sub( exp, 2 ); } - weights[j] = shl_o( tmp, exp2, &Overflow ); + weights[j] = shl_sat( tmp, exp2 ); move16(); /* Q12 */ } ELSE @@ -6645,7 +6627,7 @@ static void gainFrSmooth_En_fx( Encoder_State *st_fx, } test(); - if ( LT_32( lsp_slow_evol_rate, 2147484l /*0.001f Q31*/ ) && LT_32( lsp_fast_evol_rate, 2147484l /*0.001f Q31*/ ) ) + if ( LT_32( lsp_slow_evol_rate, INV_1000_Q31 ) && LT_32( lsp_fast_evol_rate, 2147484l /*0.001f Q31*/ ) ) { *frGainSmoothEn = 1; move16(); @@ -6772,7 +6754,7 @@ static void gainFrSmooth_En_ivas_fx( Encoder_State *st_fx, } test(); - if ( ( BASOP_Util_Cmp_Mant32Exp( lsp_slow_evol_rate, lsp_slow_evol_rate_e, 2147484l /*0.001f in Q31*/, 0 ) < 0 ) && ( BASOP_Util_Cmp_Mant32Exp( lsp_fast_evol_rate, lsp_fast_evol_rate_e, 2147484l /*0.001f in Q31*/, 0 ) < 0 ) ) + if ( ( BASOP_Util_Cmp_Mant32Exp( lsp_slow_evol_rate, lsp_slow_evol_rate_e, INV_1000_Q31, 0 ) < 0 ) && ( BASOP_Util_Cmp_Mant32Exp( lsp_fast_evol_rate, lsp_fast_evol_rate_e, 2147484l /*0.001f in Q31*/, 0 ) < 0 ) ) { *frGainSmoothEn = 1; move16(); @@ -6800,10 +6782,6 @@ static void first_VQstages_fx( move16(); Word16 maxC = LSFMBEST; move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif /*float dd[16];*/ const Word16 *cb_stage, *cbp; @@ -6829,9 +6807,9 @@ static void first_VQstages_fx( L_tmp = L_deposit_l( 0 ); FOR( j = 0; j < N; j++ ) { - L_tmp1 = L_shl_o( L_mult0( u[j], w[j] ), 7, &Overflow ); /*x2.56 + Q8 + Q7 */ - L_tmp1 = Mult_32_16( L_tmp1, u[j] ); /*x2.56 + Q15 + x2.56 -Q15 */ - L_tmp = L_add( L_tmp, L_tmp1 ); /*Q0 + x2.56 +x2.56 */ + L_tmp1 = L_shl_sat( L_mult0( u[j], w[j] ), 7 ); /*x2.56 + Q8 + Q7 */ + L_tmp1 = Mult_32_16( L_tmp1, u[j] ); /*x2.56 + Q15 + x2.56 -Q15 */ + L_tmp = L_add( L_tmp, L_tmp1 ); /*Q0 + x2.56 +x2.56 */ } set32_fx( dist[1], L_tmp, maxC ); @@ -7188,7 +7166,7 @@ static void Quant_BWE_LSF_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( hBstr, IND_SHB_LSF, lsf_idx[i], lsf_q_num_bits[i] ); + push_indice( hBstr, IND_SHB_LSF, lsf_idx[i], lsf_q_num_bits[i] ); } } @@ -7198,7 +7176,7 @@ static void Quant_BWE_LSF_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( hBstr, IND_SHB_MIRROR, m_idx, MIRROR_POINT_BITS ); + push_indice( hBstr, IND_SHB_MIRROR, m_idx, MIRROR_POINT_BITS ); } grid_idx = Find_LSF_grid_fx( lsf, lsf_q, m ); @@ -7206,7 +7184,7 @@ static void Quant_BWE_LSF_fx( hBWE_TD->grid_idx = grid_idx; IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( hBstr, IND_SHB_GRID, grid_idx, NUM_LSF_GRID_BITS ); + push_indice( hBstr, IND_SHB_GRID, grid_idx, NUM_LSF_GRID_BITS ); } FOR( i = 0; i < LPC_SHB_ORDER; i++ ) @@ -7311,17 +7289,15 @@ void fb_tbe_enc_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; - Word16 input_fhb[L_FRAME48k]; + Word16 input_fhb_buffer[L_FRAME48k + 4]; + Word16 *input_fhb = &input_fhb_buffer[0] + 4; Word16 Sample_Delay_HP; Word32 fb_exc_energy, temp2; Word32 L_tmp; Word16 tmp, tmp1, tmp2, exp, exp2, exp_norm; Word16 s_max_value, exp_temp, i; TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif + s_max_value = 0; FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -7337,7 +7313,10 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); - elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( + st->element_mode, + 0, // IsUpsampled3 + input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7352,9 +7331,9 @@ void fb_tbe_enc_fx( Copy( hBWE_TD->old_input_fhb_fx, input_fhb, Sample_Delay_HP ); Copy( tmp_vec, input_fhb + Sample_Delay_HP, L_FRAME48k - Sample_Delay_HP ); Copy( tmp_vec + L_FRAME48k - Sample_Delay_HP, hBWE_TD->old_input_fhb_fx, Sample_Delay_HP ); - temp2 = sum2_fx_mod( input_fhb, L_FRAME48k / 2 ); /* Q11 */ - temp2 = L_add_o( temp2, L_shl_o( hBWE_TD->prev_fb_energy_fx, sub( sub( add( exp_temp, exp_temp ), 6 ), hBWE_TD->prev_fb_energy_fx_Q ), &Overflow ), &Overflow ); /* Q11 */ - hBWE_TD->prev_fb_energy_fx = sum2_fx_mod( input_fhb + L_FRAME48k / 2, L_FRAME48k / 2 ); /*Q11*/ + temp2 = sum2_fx_mod( input_fhb, L_FRAME48k / 2 ); /* Q11 */ + temp2 = L_add_sat( temp2, L_shl_sat( hBWE_TD->prev_fb_energy_fx, sub( sub( add( exp_temp, exp_temp ), 6 ), hBWE_TD->prev_fb_energy_fx_Q ) ) ); /* Q11 */ + hBWE_TD->prev_fb_energy_fx = sum2_fx_mod( input_fhb + L_FRAME48k / 2, L_FRAME48k / 2 ); /*Q11*/ hBWE_TD->prev_fb_energy_fx_Q = sub( add( exp_temp, exp_temp ), 6 ); fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* Q(2*Q_fb_exc+1 -7) */ @@ -7379,8 +7358,8 @@ void fb_tbe_enc_fx( { tmp = div_s( tmp2, tmp ); L_tmp = L_deposit_h( tmp ); - L_tmp = Isqrt_lc( L_tmp, &exp ); /*Q(31-exp)*/ - L_tmp = L_max( L_shr_o( L_tmp, sub( 31, exp ), &Overflow ), 0x1 ); /* Q0 */ + L_tmp = Isqrt_lc( L_tmp, &exp ); /*Q(31-exp)*/ + L_tmp = L_max( L_shr_sat( L_tmp, sub( 31, exp ) ), 0x1 ); /* Q0 */ } ELSE { @@ -7419,7 +7398,7 @@ void fb_tbe_enc_fx( } ELSE { - push_indice_fx( st->hBstr, IND_FB_SLOPE, idxGain, 4 ); + push_indice( st->hBstr, IND_FB_SLOPE, idxGain, 4 ); } return; @@ -7427,14 +7406,16 @@ void fb_tbe_enc_fx( void fb_tbe_enc_ivas_fx( Encoder_State *st, /* i/o: encoder state structure */ - const Word16 new_input[], /* i : input speech at 48 kHz sample rate Q0 */ + const Word16 new_input[], /* i : input speech at 48 kHz sample rate Q_new_input */ const Word16 fb_exc[], /* i : FB excitation from the SWB part Q_fb_exc */ - Word16 Q_fb_exc ) + Word16 Q_fb_exc, + Word16 Q_new_input ) { Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; - Word16 input_fhb_new[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS )]; + Word16 input_fhb_new_buffer[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) + 4]; + Word16 *input_fhb_new = &input_fhb_new_buffer[0] + 4; Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word64 fb_exc_energy; @@ -7458,14 +7439,20 @@ void fb_tbe_enc_ivas_fx( } Copy_Scale_sig( new_input - NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_fhb_new, L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), exp_temp ); - + exp_temp = add( exp_temp, Q_new_input ); IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( + st->element_mode, + 0, // IsUpsampled3 + input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } ELSE { - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( + st->element_mode, + 0, // IsUpsampled3 + input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } test(); @@ -7513,8 +7500,8 @@ void fb_tbe_enc_ivas_fx( hBWE_TD->old_input_fhb_fx_Q = exp_temp; move16(); - temp2 = sum2_fx_no_sat( input_fhb, L_FRAME48k / 2 ); // 2*q_input_fhb /* Q(2*Q_input_fhb-8) */ - temp2 = W_add( temp2, W_shl( hBWE_TD->prev_fb_energy_fx, sub( q_input_fhb, hBWE_TD->prev_fb_energy_fx_Q ) ) ); // 2*q_input_fhb + temp2 = sum2_fx_no_sat( input_fhb, L_FRAME48k / 2 ); // 2*q_input_fhb /* Q(2*Q_input_fhb-8) */ + temp2 = W_add( temp2, W_shl( hBWE_TD->prev_fb_energy_fx, sub( shl( q_input_fhb, 1 ), hBWE_TD->prev_fb_energy_fx_Q ) ) ); // 2*q_input_fhb temp1 = sum2_fx_no_sat( input_fhb + L_FRAME48k / 2, L_FRAME48k / 2 ); // 2*q_input_fhb exp = W_norm( temp1 ); @@ -7571,7 +7558,6 @@ void fb_tbe_enc_ivas_fx( { push_indice( st->hBstr, IND_FB_SLOPE, idxGain, 4 ); } - return; } void tbe_write_bitstream_fx( @@ -7591,10 +7577,10 @@ void tbe_write_bitstream_fx( IF( ( st_fx->rf_mode || EQ_32( st_fx->total_brate, ACELP_9k60 ) ) && ( EQ_16( st_fx->bwidth, WB ) ) ) { /* WB LSF */ - push_next_indice_fx( hBstr, hBWE_TD->lsf_WB, NUM_BITS_LBR_WB_LSF ); + push_next_indice( hBstr, hBWE_TD->lsf_WB, NUM_BITS_LBR_WB_LSF ); /* WB frame */ - push_next_indice_fx( hBstr, hBWE_TD->gFrame_WB, NUM_BITS_SHB_FrameGain_LBR_WB ); + push_next_indice( hBstr, hBWE_TD->gFrame_WB, NUM_BITS_SHB_FrameGain_LBR_WB ); } ELSE IF( ( GE_32( st_fx->total_brate, ACELP_9k60 ) ) && ( LE_32( st_fx->total_brate, ACELP_32k ) ) && ( ( EQ_16( st_fx->bwidth, SWB ) ) || ( EQ_16( st_fx->bwidth, FB ) ) ) ) @@ -7604,70 +7590,71 @@ void tbe_write_bitstream_fx( test(); IF( ( EQ_16( st_fx->rf_mode, 1 ) ) || EQ_32( st_fx->total_brate, ACELP_9k60 ) ) { - push_next_indice_fx( hBstr, hBWE_TD->lsf_idx[0], 8 ); + push_next_indice( hBstr, hBWE_TD->lsf_idx[0], 8 ); } ELSE { FOR( i = 0; i < NUM_Q_LSF; i++ ) { - push_next_indice_fx( hBstr, hBWE_TD->lsf_idx[i], lsf_q_num_bits[i] ); + push_next_indice( hBstr, hBWE_TD->lsf_idx[i], lsf_q_num_bits[i] ); } /* LSF mirror points */ - push_next_indice_fx( hBstr, hBWE_TD->m_idx, MIRROR_POINT_BITS ); + push_next_indice( hBstr, hBWE_TD->m_idx, MIRROR_POINT_BITS ); /* LSF grid points */ - push_next_indice_fx( hBstr, hBWE_TD->grid_idx, NUM_LSF_GRID_BITS ); + push_next_indice( hBstr, hBWE_TD->grid_idx, NUM_LSF_GRID_BITS ); } /* Gain shape */ - push_next_indice_fx( hBstr, hBWE_TD->idxSubGains, NUM_BITS_SHB_SUBGAINS ); + push_next_indice( hBstr, hBWE_TD->idxSubGains, NUM_BITS_SHB_SUBGAINS ); /* frame gain */ - push_next_indice_fx( hBstr, hBWE_TD->idxFrameGain, NUM_BITS_SHB_FRAMEGAIN ); + push_next_indice( hBstr, hBWE_TD->idxFrameGain, NUM_BITS_SHB_FRAMEGAIN ); IF( GE_32( st_fx->total_brate, ACELP_24k40 ) ) { /* sub frame energy*/ - push_next_indice_fx( hBstr, hBWE_TD->idx_shb_fr_gain, NUM_BITS_SHB_ENER_SF ); + push_next_indice( hBstr, hBWE_TD->idx_shb_fr_gain, NUM_BITS_SHB_ENER_SF ); /* gain shapes residual */ FOR( i = 0; i < NB_SUBFR16k; i++ ) { - push_next_indice_fx( hBstr, hBWE_TD->idx_res_gs[i], NUM_BITS_SHB_RES_GS ); + push_next_indice( hBstr, hBWE_TD->idx_res_gs[i], NUM_BITS_SHB_RES_GS ); } /* voicing factor */ - push_next_indice_fx( hBstr, hBWE_TD->idx_mixFac, NUM_BITS_SHB_VF ); + push_next_indice( hBstr, hBWE_TD->idx_mixFac, NUM_BITS_SHB_VF ); } IF( EQ_16( st_fx->tec_tfa, 1 ) ) { - push_next_indice_fx( hBstr, st_fx->tec_flag, BITS_TEC ); - push_next_indice_fx( hBstr, st_fx->tfa_flag, BITS_TFA ); + push_next_indice( hBstr, st_fx->tec_flag, BITS_TEC ); + push_next_indice( hBstr, st_fx->tfa_flag, BITS_TFA ); } } IF( EQ_16( st_fx->bwidth, FB ) ) { - push_next_indice_fx( hBstr, hBWE_TD->idxGain, 4 ); + push_next_indice( hBstr, hBWE_TD->idxGain, 4 ); } + + return; } void TBEreset_enc_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - Word16 bandwidth /* i : bandwidth mode */ + TD_BWE_ENC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + const Word16 last_core, /* i : last core */ + Word16 bandwidth /* i : bandwidth mode */ ) { - TD_BWE_ENC_HANDLE hBWE_TD = st_fx->hBWE_TD; - - IF( NE_16( st_fx->last_core, ACELP_CORE ) ) + IF( NE_16( last_core, ACELP_CORE ) ) { set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 ); hBWE_TD->bwe_non_lin_prev_scale_fx = L_deposit_l( 0 ); move32(); - st_fx->prev_Q_bwe_exc = 31; + hBWE_TD->prev_Q_bwe_exc = 31; move16(); } @@ -7697,6 +7684,8 @@ void TBEreset_enc_fx( fb_tbe_reset_enc_fx( hBWE_TD->elliptic_bpf_2_48k_mem_fx, &hBWE_TD->prev_fb_energy_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, &hBWE_TD->prev_fb_energy_fx_Q ); } } + + return; } /*-------------------------------------------------------------------* diff --git a/lib_enc/tcq_core_enc_fx.c b/lib_enc/tcq_core_enc_fx.c index 82088be5088b04dcb55b92c2b5fb48aee23dd3e9..a3d355a2da492724869d59daabca37cbac2ba4db 100644 --- a/lib_enc/tcq_core_enc_fx.c +++ b/lib_enc/tcq_core_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include @@ -449,11 +449,11 @@ ivas_error tcq_core_LR_enc_fx( j = sub( bit_budget, shl( nb_bytes, 3 ) ); FOR( i = 0; i < nb_bytes; i++ ) { - push_indice_fx( hBstr, IND_HQ2_SUBBAND_TCQ, pbs_fx->buf[i], 8 ); + push_indice( hBstr, IND_HQ2_SUBBAND_TCQ, pbs_fx->buf[i], 8 ); } IF( j > 0 ) { - push_indice_fx( hBstr, IND_HQ2_SUBBAND_TCQ, shr( pbs_fx->buf[nb_bytes], ( 8 - j ) ), j ); + push_indice( hBstr, IND_HQ2_SUBBAND_TCQ, shr( pbs_fx->buf[nb_bytes], ( 8 - j ) ), j ); } /* Clear decoding buffer */ set32_fx( coefs_quant_fx, 0, sfm_end[BANDS - 1] + 1 ); diff --git a/lib_enc/tcx_ltp_enc_fx.c b/lib_enc/tcx_ltp_enc_fx.c index 19afa82437d68511599f10d0d4a0a796ed7f0a50..012d6fa0260cd2cc1886c848bf04930652dd80df 100644 --- a/lib_enc/tcx_ltp_enc_fx.c +++ b/lib_enc/tcx_ltp_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -8,12 +8,15 @@ #include "stl.h" #include "cnst.h" #include "basop_util.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ -static Word32 dot( const Word16 *X, const Word16 *Y, Word16 n ) + +static Word32 dot( + const Word16 *X, + const Word16 *Y, + Word16 n ) { Word32 acc; Word16 i; @@ -30,20 +33,22 @@ static Word32 dot( const Word16 *X, const Word16 *Y, Word16 n ) return acc; } -static Word32 interpolate_corr( /* o : interpolated value */ - const Word32 *x, /* i : input vector */ - const Word16 frac, /* i : fraction of lag */ - const Word16 frac_max /* i : max fraction */ + +/* o : interpolated value */ +static Word32 interpolate_corr( + const Word32 *x, /* i : input vector */ + const Word16 frac, /* i : fraction of lag */ + const Word16 frac_max /* i : max fraction */ ) { Word32 s; const Word16 *c, *win; - win = E_ROM_inter4_1_fx; if ( EQ_16( frac_max, 6 ) ) + { win = E_ROM_inter6_1_fx; - + } s = L_deposit_l( 0 ); @@ -86,11 +91,6 @@ static void tcx_ltp_pitch_search( Word16 i, t, t0, t1, step, fraction, t0_min, t0_max, t_min, t_max, delta, temp_m, temp_e, s, s_wsp; Word32 cor_max, cor[256], *pt_cor, temp; Word16 wsp2[L_FRAME_PLUS + PIT_MAX_MAX + L_INTERPOL1]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - delta = 16; move16(); @@ -181,7 +181,7 @@ static void tcx_ltp_pitch_search( temp_m = divide1616( extract_h( L_shl( cor_max, s ) ), temp_m ); temp_e = sub( negate( s ), temp_e ); - *norm_corr = shl_o( temp_m, temp_e, &Overflow ); + *norm_corr = shl_sat( temp_m, temp_e ); IF( GE_16( t1, pitfr1 ) ) { @@ -295,10 +295,6 @@ static void tcx_ltp_pitch_search_ivas_fx( Word16 i, t, t0, t1, step, fraction, t0_min, t0_max, t_min, t_max, delta, temp_m, temp_e, s, s_wsp; Word32 cor_max, cor[256], *pt_cor, temp; Word16 wsp2[L_FRAME_PLUS + PIT_MAX_MAX + L_INTERPOL1]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif delta = 16; move16(); @@ -385,7 +381,7 @@ static void tcx_ltp_pitch_search_ivas_fx( temp_m = divide1616( extract_h( L_shl( cor_max, s ) ), temp_m ); temp_e = sub( negate( s ), temp_e ); - *norm_corr = shl_o( temp_m, temp_e, &Overflow ); + *norm_corr = shl_sat( temp_m, temp_e ); test(); IF( check_border_case && EQ_16( t1, t0_min ) ) @@ -499,11 +495,6 @@ static void tcx_ltp_find_gain( Word16 *speech, Word16 *pred_speech, Word16 L_fra { Word32 corr, ener; Word16 i, g, s1, s2, tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - s1 = sub( getScaleFactor16( speech, L_frame ), 4 ); s2 = sub( getScaleFactor16( pred_speech, L_frame ), 4 ); @@ -530,17 +521,13 @@ static void tcx_ltp_find_gain( Word16 *speech, Word16 *pred_speech, Word16 L_fra ener = L_shl( ener, tmp ); s2 = sub( s2, tmp ); - g = divide1616( round_fx_o( corr, &Overflow ), round_fx_o( ener, &Overflow ) ); + g = divide1616( round_fx_sat( corr ), round_fx_sat( ener ) ); BASOP_SATURATE_WARNING_OFF_EVS - g = shl_o( g, sub( s1, s2 ), &Overflow ); + g = shl_sat( g, sub( s1, s2 ) ); BASOP_SATURATE_WARNING_ON_EVS /* Quantize gain */ -#ifdef FIX_ISSUE_1150 - g = shr( sub_o( g, 0x1000, &Overflow ), 13 ); -#else - g = shr( sub( g, 0x1000 ), 13 ); -#endif + g = shr( sub_sat( g, 0x1000 ), 13 ); g = s_max( g, -1 ); *gain_index = g; @@ -555,10 +542,6 @@ static void tcx_ltp_find_gain_ivas_fx( Word16 *speech /*Qx*/, Word16 *pred_speec { Word32 corr, ener; Word16 i, g, s1, s2, tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif s1 = sub( getScaleFactor16( speech, L_frame ), 4 ); s2 = sub( getScaleFactor16( pred_speech, L_frame ), 4 ); @@ -585,9 +568,9 @@ static void tcx_ltp_find_gain_ivas_fx( Word16 *speech /*Qx*/, Word16 *pred_speec ener = L_shl( ener, tmp ); s2 = sub( s2, tmp ); - g = divide1616( round_fx_o( corr, &Overflow ), round_fx_o( ener, &Overflow ) ); + g = divide1616( round_fx_sat( corr ), round_fx_sat( ener ) ); BASOP_SATURATE_WARNING_OFF_EVS - g = shl_o( g, sub( s1, s2 ), &Overflow ); /*Q15*/ + g = shl_sat( g, sub( s1, s2 ) ); /*Q15*/ BASOP_SATURATE_WARNING_ON_EVS /* Quantize gain */ @@ -600,36 +583,39 @@ static void tcx_ltp_find_gain_ivas_fx( Word16 *speech /*Qx*/, Word16 *pred_speec /* Dequantize gain */ *gain = imult1616( add( g, 1 ), 0x1400 ); /*Q15*/ move16(); + + return; } -void tcx_ltp_encode_fx( Word16 tcxltp_on, - Word8 tcxOnly, - Word16 tcxMode, - Word16 L_frame, - Word16 L_subfr, - Word16 *speech, - Word16 *speech_ltp, - Word16 *wsp, - Word16 Top, - Word16 *ltp_param, - Word16 *ltp_bits, - Word16 *pitch_int, - Word16 *pitch_fr, - Word16 *gain, - Word16 *pitch_int_past, - Word16 *pitch_fr_past, - Word16 *gain_past, - Word16 *norm_corr_past, - Word16 last_core, - Word16 pitmin, - Word16 pitfr1, - Word16 pitfr2, - Word16 pitmax, - Word16 pitres, - struct TransientDetection const *pTransientDetection, - Word8 SideInfoOnly, - Word16 *A, - Word16 lpcorder ) +void tcx_ltp_encode_fx( + Word16 tcxltp_on, + Word8 tcxOnly, + Word16 tcxMode, + Word16 L_frame, + Word16 L_subfr, + Word16 *speech, + Word16 *speech_ltp, + Word16 *wsp, + Word16 Top, + Word16 *ltp_param, + Word16 *ltp_bits, + Word16 *pitch_int, + Word16 *pitch_fr, + Word16 *gain, + Word16 *pitch_int_past, + Word16 *pitch_fr_past, + Word16 *gain_past, + Word16 *norm_corr_past, + Word16 last_core, + Word16 pitmin, + Word16 pitfr1, + Word16 pitfr2, + Word16 pitmax, + Word16 pitres, + TRAN_DET_HANDLE hTranDet, + Word8 SideInfoOnly, + Word16 *A, + Word16 lpcorder ) { Word16 n; Word16 norm_corr; @@ -639,11 +625,6 @@ void tcx_ltp_encode_fx( Word16 tcxltp_on, Word16 buf_zir[M + L_SUBFR], *zir; Word16 Aest[M + 1]; Word16 alpha, step; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - norm_corr = 0; move16(); @@ -681,11 +662,9 @@ void tcx_ltp_encode_fx( Word16 tcxltp_on, nPrevSubblocks = extract_h( L_mac( 0x17fff, NSUBBLOCKS, div_s( *pitch_int, L_frame ) ) ); nPrevSubblocks = add( s_min( nPrevSubblocks, NSUBBLOCKS ), 1 ); - tempFlatness = GetTCXAvgTemporalFlatnessMeasure_fx( pTransientDetection, NSUBBLOCKS, nPrevSubblocks ); + tempFlatness = GetTCXAvgTemporalFlatnessMeasure_fx( hTranDet, NSUBBLOCKS, nPrevSubblocks ); - maxEnergyChange = GetTCXMaxenergyChange_fx( pTransientDetection, - (const Word8) isTCX10, - NSUBBLOCKS, nPrevSubblocks ); + maxEnergyChange = GetTCXMaxenergyChange_fx( hTranDet, (const Word8) isTCX10, NSUBBLOCKS, nPrevSubblocks ); /* Switch LTP on */ test(); @@ -803,10 +782,10 @@ void tcx_ltp_encode_fx( Word16 tcxltp_on, FOR( n = 0; n < L_subfr; n++ ) { - speech_ltp[n] = sub_o( speech[n], mult_ro( *gain, mult_ro( alpha, pred_speech[n], &Overflow ), &Overflow ), &Overflow ); + speech_ltp[n] = sub_sat( speech[n], mult_r_sat( *gain, mult_r_sat( alpha, pred_speech[n] ) ) ); move16(); BASOP_SATURATE_WARNING_OFF_EVS; - alpha = add_o( alpha, step, &Overflow ); + alpha = add_sat( alpha, step ); BASOP_SATURATE_WARNING_ON_EVS; } } @@ -857,7 +836,7 @@ void tcx_ltp_encode_fx( Word16 tcxltp_on, FOR( n = 0; n < L_subfr; n++ ) { - speech_ltp[n] = add_o( sub_o( speech[n], mult_ro( *gain, pred_speech[n], &Overflow ), &Overflow ), zir[n], &Overflow ); + speech_ltp[n] = add_sat( sub_sat( speech[n], mult_r_sat( *gain, pred_speech[n] ) ), zir[n] ); move16(); } } @@ -875,7 +854,7 @@ void tcx_ltp_encode_fx( Word16 tcxltp_on, { FOR( n = L_subfr; n < L_frame; n++ ) { - speech_ltp[n] = sub_o( speech[n], mult( *gain, pred_speech[n] ), &Overflow ); + speech_ltp[n] = sub_sat( speech[n], mult( *gain, pred_speech[n] ) ); move16(); } } @@ -889,8 +868,11 @@ void tcx_ltp_encode_fx( Word16 tcxltp_on, move16(); *norm_corr_past = norm_corr; move16(); + + return; } + void tcx_ltp_encode_ivas_fx( Encoder_State *st, const Word16 tcxMode, @@ -918,9 +900,6 @@ void tcx_ltp_encode_ivas_fx( Word16 Aest_fx[M + 1]; Word16 exponent; Word16 sqr; - Flag Overflow = 0; - move32(); - TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; tcxOnly = st->tcxonly; @@ -935,9 +914,9 @@ void tcx_ltp_encode_ivas_fx( { hTcxEnc->tcxltp_pitch_int_past = L_frame; move16(); - hTcxEnc->tcxltp_pitch_int_past = 0; + hTcxEnc->tcxltp_pitch_fr_past = 0; move16(); - hTcxEnc->tcxltp_pitch_int_past = 0; + hTcxEnc->tcxltp_gain_past = 0; move16(); } @@ -1035,15 +1014,13 @@ void tcx_ltp_encode_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - tempFlatness_fx = extract_l( L_shr( GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS - NSUBBLOCKS_SHIFT, add( nPrevSubblocks, NSUBBLOCKS_SHIFT ) ), 14 ) ); // Q7 - maxEnergyChange_fx = GetTCXMaxenergyChange_ivas_fx( st->hTranDet, (const Word8) isTCX10, - NSUBBLOCKS - NSUBBLOCKS_SHIFT, add( nPrevSubblocks, NSUBBLOCKS_SHIFT ) ); // Q3 + tempFlatness_fx = extract_l( L_shr( GetTCXAvgTemporalFlatnessMeasure_ivas_fx( st->hTranDet, NSUBBLOCKS - NSUBBLOCKS_SHIFT, add( nPrevSubblocks, NSUBBLOCKS_SHIFT ) ), 14 ) ); // Q7 + maxEnergyChange_fx = GetTCXMaxenergyChange_ivas_fx( st->hTranDet, (const Word8) isTCX10, NSUBBLOCKS - NSUBBLOCKS_SHIFT, add( nPrevSubblocks, NSUBBLOCKS_SHIFT ) ); // Q3 } ELSE { - tempFlatness_fx = extract_l( L_shr( ( GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, nPrevSubblocks ) ), 14 ) ); // Q7 - maxEnergyChange_fx = GetTCXMaxenergyChange_ivas_fx( st->hTranDet, (const Word8) isTCX10, - NSUBBLOCKS, nPrevSubblocks ); // Q3 + tempFlatness_fx = extract_l( L_shr( ( GetTCXAvgTemporalFlatnessMeasure_ivas_fx( st->hTranDet, NSUBBLOCKS, nPrevSubblocks ) ), 14 ) ); // Q7 + maxEnergyChange_fx = GetTCXMaxenergyChange_ivas_fx( st->hTranDet, (const Word8) isTCX10, NSUBBLOCKS, nPrevSubblocks ); // Q3 } /* Switch LTP on */ @@ -1214,7 +1191,7 @@ void tcx_ltp_encode_ivas_fx( FOR( n = 0; n < L_subfr; n++ ) { - speech_ltp_fx[n] = sub_o( speech_fx[n], mult_ro( hTcxEnc->tcxltp_gain, mult_ro( alpha_fx, pred_speech_fx[n], &Overflow ), &Overflow ), &Overflow ); + speech_ltp_fx[n] = sub_sat( speech_fx[n], mult_r_sat( hTcxEnc->tcxltp_gain, mult_r_sat( alpha_fx, pred_speech_fx[n] ) ) ); move16(); alpha_fx = add_sat( alpha_fx, step_fx ); } @@ -1264,7 +1241,7 @@ void tcx_ltp_encode_ivas_fx( FOR( n = 0; n < L_subfr; n++ ) { - speech_ltp_fx[n] = add_o( sub_o( speech_fx[n], mult_ro( hTcxEnc->tcxltp_gain, pred_speech_fx[n], &Overflow ), &Overflow ), zir_fx[n], &Overflow ); + speech_ltp_fx[n] = add_sat( sub_sat( speech_fx[n], mult_r_sat( hTcxEnc->tcxltp_gain, pred_speech_fx[n] ) ), zir_fx[n] ); move16(); } } @@ -1282,7 +1259,7 @@ void tcx_ltp_encode_ivas_fx( { FOR( n = L_subfr; n < L_frame; n++ ) { - speech_ltp_fx[n] = sub_o( speech_fx[n], mult( hTcxEnc->tcxltp_gain, pred_speech_fx[n] ), &Overflow ); + speech_ltp_fx[n] = sub_sat( speech_fx[n], mult( hTcxEnc->tcxltp_gain, pred_speech_fx[n] ) ); move16(); } } diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index ce7f0e6a6e446c94e058f7d9f2336cda1d28a8a7..9765655ba4d880bab90ca7e255273a39d60d3b79 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -172,25 +172,131 @@ void ComputeSpectrumNoiseMeasure_fx( const Word32 *powerSpec, } } +void ComputeSpectrumNoiseMeasure_ivas_fx( Word64 *powerSpec, /* Qx */ + Word16 L_frame, /* Q0 */ + Word16 startLine, /* Q0 */ + Word8 resetMemory, /* Q0 */ + Word8 *noiseFlags, /* Q0 */ + Word16 lowpassLine /* Q0 */ +) +{ + Word16 i, lastTone, j, exp; + Word32 c; + Word64 s, temp; + + IF( resetMemory != 0 ) + { + FOR( i = 0; i < lowpassLine; i++ ) + { + noiseFlags[i] = 0; + move16(); + } + } + + FOR( i = lowpassLine; i < L_frame; i++ ) + { + noiseFlags[i] = 1; + move16(); + } + + test(); + IF( powerSpec != NULL && LT_16( add( startLine, 6 ), L_frame ) ) + { + lastTone = 0; + move16(); + + /* noise-measure flags for spectrum filling and quantization (0: tonal, 1: noise-like) */ + i = sub( startLine, 1 ); + /* s = powerSpec[i - 7] + powerSpec[i - 6] + powerSpec[i - 5] + + powerSpec[i - 4] + powerSpec[i - 3] + powerSpec[i - 2] + + powerSpec[i - 1] + powerSpec[i] + powerSpec[i + 1] + + powerSpec[i + 2] + powerSpec[i + 3] + powerSpec[i + 4] + + powerSpec[i + 5] + powerSpec[i + 6] + powerSpec[i + 7]; */ + + s = powerSpec[i - 7]; // Qx + move64(); + FOR( j = -6; j < 8; j++ ) + { + s = W_add( s, powerSpec[i + j] ); // Qx + } + + FOR( i = i + 1; i < lowpassLine - 7; i++ ) + { + /* c = powerSpec[i - 1] + powerSpec[i] + powerSpec[i + 1]; */ + temp = W_add( W_add( powerSpec[i - 1], powerSpec[i] ), powerSpec[i + 1] ); + exp = W_norm( temp ); + c = W_extract_h( W_shl( temp, exp ) ); // Qx+exp-32 + + /* s += powerSpec[i + 7] - powerSpec[i - 8]; */ + s = W_sub( s, powerSpec[i - 8] ); // Qx + s = W_add( s, powerSpec[i + 7] ); // Qx + + /* ( 1.75f - 0.5f * noiseFlags[i] ) * c */ + temp = W_mult_32_32( c, L_msu0( 28672 /* 1.75 in Q14*/, 8192 /* 0.5 in Q14 */, noiseFlags[i] ) ); // Qx+exp-32+14+1 = Qx+exp-17 + + IF( GE_64( W_shl( s, sub( exp, Q17 ) ), temp ) /* s >= ( 1.75f - 0.5f * noiseFlags[i] ) * c */ ) // Qx+exp-17 + { + noiseFlags[i] = 1; + move16(); + } + ELSE + { + noiseFlags[i] = 0; + lastTone = i; + move16(); + move16(); + } + } + + /* lower L_frame*startRatio lines are tonal (0), upper 7 lines are processed separately */ + FOR( ; i < lowpassLine - 1; i++ ) + { + /* c = powerSpec[i - 1] + powerSpec[i] + powerSpec[i + 1]; */ + temp = W_add( W_add( powerSpec[i - 1], powerSpec[i] ), powerSpec[i + 1] ); + exp = W_norm( temp ); + c = W_extract_h( W_shl( temp, exp ) ); // Qx+exp-32 + + /* ( 1.75f - 0.5f * noiseFlags[i] ) * c */ + temp = W_mult_32_32( c, L_msu0( 28672 /* 1.75 in Q14*/, 8192 /* 0.5 in Q14 */, noiseFlags[i] ) ); // Qx+exp-32+14+1 = Qx+exp-17 + + IF( GE_64( W_shl( s, sub( exp, Q17 ) ), temp ) /* s >= ( 1.75f - 0.5f * noiseFlags[i] ) * c */ ) // Qx+exp-17 + { + noiseFlags[i] = 1; + move16(); + } + ELSE + { + noiseFlags[i] = 0; + lastTone = i; + move16(); + move16(); + } + } + noiseFlags[i] = 1; /* uppermost line is defined as noise-like (1) */ + move16(); + + if ( lastTone > 0 ) /* spread uppermost tonal line one line upward */ + { + noiseFlags[lastTone + 1] = 0; + move16(); + } + } +} + static void detectLowpassFac( const Word32 *powerSpec, Word16 powerSpec_e, Word16 L_frame, Word8 rectWin, Word16 *pLpFac, Word16 lowpassLine ) { Word16 i, tmp; Word32 threshold; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - threshold = 256l /*0.1f * 2*NORM_MDCT_FACTOR Q3*/; /* Q3 */ move32(); BASOP_SATURATE_WARNING_OFF_EVS /* Allow saturation, because threshold is being compared to powerSpec[i] below. */ - threshold = L_shl_o( threshold, sub( 28, powerSpec_e ), &Overflow ); + threshold = L_shl_sat( threshold, sub( 28, powerSpec_e ) ); IF( rectWin != 0 ) { /* compensate for bad side-lobe attenuation with asymmetric windows */ - threshold = L_shl_o( threshold, 1, &Overflow ); + threshold = L_shl_sat( threshold, 1 ); } BASOP_SATURATE_WARNING_ON_EVS @@ -330,7 +436,8 @@ void AnalyzePowerSpectrum_ivas_fx( Word32 const mdctSpectrum[], /* input: MDCT spectrum */ Word16 mdctSpectrum_e, Word16 const signal[], /* input: windowed signal corresponding to mdctSpectrum */ - Word32 powerSpec[], /* output: Power spectrum. Can point to signal */ + const Word16 q_signal, + Word32 powerSpec[], /* output: Power spectrum. Can point to signal */ Word16 powerSpec_e[] ) { Word16 i, iStart, iEnd, lowpassLine; @@ -342,8 +449,7 @@ void AnalyzePowerSpectrum_ivas_fx( lowpassLine = L_frameTCX; move16(); - Word16 temp_powerSpec_e = 16; - move16(); + Word16 temp_powerSpec_e = sub( 16, q_signal ); TCX_MDST( signal, powerSpec, &temp_powerSpec_e, left_overlap, sub( L_frameTCX, shr( add( left_overlap, right_overlap ), 1 ) ), right_overlap, st->element_mode ); shift = L_norm_arr( powerSpec, N_MAX + L_MDCT_OVLP_MAX ); @@ -942,6 +1048,8 @@ Word16 SQ_gain_estimate_fx( /* output: SQ gain Word32 tmp = 0, tmpp = 0; move32(); move32(); + Word64 ener64_fx; + Word16 tmp_exp; /* tmp = 0.5f * (float) log10( (float) lg / (float) NORM_MDCT_FACTOR ) + + 0.94f; lowest gain + expected value of the quantization noise energy per quadruple (log10(4/12)) in Q16*/ /* tmpp = 0.5f * (float) log10( (float) lg / (float) NORM_MDCT_FACTOR ) * log2(10) in Q16 */ @@ -1055,56 +1163,17 @@ Word16 SQ_gain_estimate_fx( /* output: SQ gain lg_4 = shr( lg, 2 ); + tmp_exp = shl( x_e, 1 ); /* SNR of quadruples for unit step quantizer and lowest possible gain */ FOR( i = 0; i < lg_4; i++ ) { - /* normalization */ - s = 15; - move16(); - - tmp16 = norm_l( x[0] ); - IF( x[0] != 0 ) - { - s = s_min( s, tmp16 ); - } - - tmp16 = norm_l( x[1] ); - IF( x[1] != 0 ) - { - s = s_min( s, tmp16 ); - } - - tmp16 = norm_l( x[2] ); - IF( x[2] != 0 ) - { - s = s_min( s, tmp16 ); - } - - tmp16 = norm_l( x[3] ); - IF( x[3] != 0 ) - { - s = s_min( s, tmp16 ); - } - - s = sub( s, 2 ); /* 2 bits headroom */ - - /* calc quadruple energy */ - ener = L_deposit_l( 1 ); - - tmp16 = extract_h( L_shl( x[0], s ) ); - ener = L_mac( ener, tmp16, tmp16 ); - - tmp16 = extract_h( L_shl( x[1], s ) ); - ener = L_mac( ener, tmp16, tmp16 ); - - tmp16 = extract_h( L_shl( x[2], s ) ); - ener = L_mac( ener, tmp16, tmp16 ); - - tmp16 = extract_h( L_shl( x[3], s ) ); - ener = L_mac( ener, tmp16, tmp16 ); - - s = shl( sub( x_e, s ), 1 ); - + ener64_fx = W_mac_32_32( 1, x[0], x[0] ); // exp:2*x_e + ener64_fx = W_mac_32_32( ener64_fx, x[1], x[1] ); // exp:2*x_e + ener64_fx = W_mac_32_32( ener64_fx, x[2], x[2] ); // exp:2*x_e + ener64_fx = W_mac_32_32( ener64_fx, x[3], x[3] ); // exp:2*x_e + s = W_norm( ener64_fx ); + ener = W_extract_h( W_shl( ener64_fx, s ) ); + s = sub( tmp_exp, s ); /* log */ tmp32 = L_add_sat( BASOP_Util_Log2( ener ), L_shl_sat( L_deposit_l( s ), 25 ) ); /* log2, 6Q25 */ en[i] = L_add_sat( L_shr( tmp32, 9 ), tmp ); /* 15Q16 */ @@ -1131,7 +1200,7 @@ Word16 SQ_gain_estimate_fx( /* output: SQ gain tmp32 = L_sub( en[i], offset ); /* avoid SV with 1 bin of amp < 0.5f */ - IF( GT_32( tmp32, 0xFF20 ) ) /* 0xFF20 -> 0.3*log2(10); */ + if ( GT_32( tmp32, 0xFF20 ) ) /* 0xFF20 -> 0.3*log2(10); */ { ener = L_add( ener, tmp32 ); } @@ -1244,23 +1313,23 @@ void tcx_scalar_quantization_ivas_fx( { Word16 i, tmp16, s; Word32 tmp32, offs32; + Word32 offs32_1; + Word32 offset_Q16 = L_shl( offset, 1 ); // Q16 /* common exponent for x and gain for comparison */ tmp16 = sub( gain_e, x_e ); - tmp32 = L_shl( L_deposit_h( gain ), s_max( -31, s_min( tmp16, 0 ) ) ); - tmp16 = negate( s_max( tmp16, 0 ) ); + tmp32 = L_shl_sat( L_deposit_h( gain ), tmp16 ); // exp:x_e i = sub( L_frame, 1 ); IF( memQuantZeros_fx != NULL ) { test(); - WHILE( ( memQuantZeros_fx[i] != 0 ) && ( LT_32( L_abs( L_shl( x[i], tmp16 ) ), tmp32 ) ) ) + FOR( ; ( ( memQuantZeros_fx[i] != 0 ) && ( L_abs( x[i] ) < tmp32 ) ); i-- ) { test(); xq[i] = 0; move16(); - i = sub( i, 1 ); } } @@ -1281,25 +1350,27 @@ void tcx_scalar_quantization_ivas_fx( s = sub( add( x_e, gain_e ), 15 ); } - /* substract 0x8000 to affect the mac_r in the following loop - so it acts like extract_h. the 0x4000 will be multiplied by 2 - by the mac_r to get to 0x8000 and disable the round. */ - offset = sub( offset, 0x4000 ); - FOR( ; i >= 0; i-- ) { - offs32 = Mpy_32_16_1( L_abs( x[i] ), gain ); /* multiply */ - offs32 = L_shl_sat( offs32, s ); /* convert to 15Q16 */ - tmp16 = mac_r_sat( offs32, offset, 1 ); /* add offset and truncate */ + offs32 = Mpy_32_16_1( x[i], gain ); + offs32 = L_shl_sat( offs32, s ); /* convert to 15Q16 */ + + offs32_1 = L_add_sat( offs32, offset_Q16 ); /*15Q16 */ + tmp16 = extract_h( offs32_1 ); IF( x[i] < 0 ) { - tmp16 = negate( tmp16 ); /* restore sign */ + offs32 = L_sub_sat( offs32, offset_Q16 ); /*15Q16 */ + tmp16 = extract_h( offs32 ); + if ( L_mac_sat( offs32, tmp16, -ONE_IN_Q15 ) > 0 ) + { + tmp16 = add( tmp16, 1 ); + } } - xq[i] = tmp16; move16(); } + IF( alfe_flag == 0 ) { AdaptLowFreqEmph_fx( x, x_e, xq, gain, gain_e, @@ -1996,12 +2067,8 @@ void QuantizeGain( Word16 n, Word16 *pGain, Word16 *pGain_e, Word16 *pQuantizedG Word16 ener, ener_e, enerInv, enerInv_e, gain, gain_e; Word16 quantizedGain; Word32 tmp32; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - ener = mult_r( shl_o( n, 5, &Overflow ), 26214 /*128.f/NORM_MDCT_FACTOR Q15*/ ); + ener = mult_r( shl_sat( n, 5 ), 26214 /*128.f/NORM_MDCT_FACTOR Q15*/ ); ener_e = 15 - 5 - 7; move16(); IF( GE_16( n, 1024 ) ) @@ -2071,10 +2138,6 @@ void tcx_noise_factor_fx( Word16 c1, c2; Word16 att; /* noise level attenuation factor for transient windows */ Word32 xMax; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif assert( nTransWidth <= 16 ); @@ -2170,7 +2233,7 @@ void tcx_noise_factor_fx( att = BASOP_Util_Divide3232_Scale( L_shl( L_min( accu1, accu2 ), 1 ), L_add( accu1, accu2 ), &s ); att = Sqrt16( att, &s ); BASOP_SATURATE_WARNING_OFF_EVS; /* att is always <= 1.0 */ - att = shl_o( att, s, &Overflow ); + att = shl_sat( att, s ); BASOP_SATURATE_WARNING_ON_EVS; } ELSE @@ -2373,7 +2436,7 @@ void tcx_noise_factor_fx( tmp1 = BASOP_Util_Divide3232_Scale( Mpy_32_16_1( sqErrorNrg, att ), n, &s ); s = add( add( add( s, x_orig_e ), inv_gain2_e ), 7 - 15 ); BASOP_SATURATE_WARNING_OFF_EVS; - tmp1 = shl_o( tmp1, s, &Overflow ); + tmp1 = shl_sat( tmp1, s ); BASOP_SATURATE_WARNING_ON_EVS; } ELSE @@ -2417,7 +2480,8 @@ void tcx_noise_factor_ivas_fx( Word16 i, k, win, segmentOffset, j; Word32 sqErrorNrg = 0, n; move32(); - Word16 inv_gain2, inv_gain2_e, tilt_factor, nTransWidth_1, exp_sqErrorNrg = 0; + Word32 inv_gain2, tilt_factor; + Word16 inv_gain2_e, nTransWidth_1, exp_sqErrorNrg = 0; move16(); Word32 accu1, accu2, tmp32; Word16 tmp1, tmp2, s; @@ -2425,10 +2489,6 @@ void tcx_noise_factor_ivas_fx( Word16 att; /* noise level attenuation factor for transient windows */ Word32 xMax; Word16 exp_spQ[N_MAX]; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif assert( nTransWidth <= 16 ); @@ -2447,13 +2507,13 @@ void tcx_noise_factor_ivas_fx( /* tilt_factor = 1.0f /(float)pow(max(0.375f, tiltCompFactor), 1.0f/(float)L_frame); */ tmp32 = BASOP_Util_Log2( L_deposit_h( s_max( 0x3000, tiltCompFactor ) ) ); /* 6Q25 */ tmp32 = L_shr( Mpy_32_16_1( tmp32, negate( tmp1 ) ), 6 ); - tilt_factor = round_fx( BASOP_Util_InvLog2( L_sub( tmp32, 0x2000000 ) ) ); /* 1Q14 */ + tilt_factor = BASOP_Util_InvLog2( L_sub( tmp32, 0x2000000 ) ); /* 1Q30 */ /* inv_gain2 = 1.0f / ((float)(nTransWidth * nTransWidth) * gain_tcx); */ tmp32 = L_mult( imult1616( nTransWidth, nTransWidth ), gain_tcx ); /* 15Q16 */ - inv_gain2 = BASOP_Util_Divide3232_Scale( MAX_32, tmp32, &inv_gain2_e ); + inv_gain2 = BASOP_Util_Divide3232_Scale_newton( MAX_32, tmp32, &inv_gain2_e ); inv_gain2_e = add( inv_gain2_e, sub( 0, add( 15, gain_tcx_e ) ) ); - inv_gain2 = shr( inv_gain2, 2 ); /* 2 bits headroom */ + inv_gain2 = L_shr( inv_gain2, 2 ); /* 2 bits headroom */ inv_gain2_e = add( inv_gain2_e, 2 ); /* find last nonzero line below iFirstLine, use it as start offset */ @@ -2479,7 +2539,7 @@ void tcx_noise_factor_ivas_fx( /* inv_gain2 *= (float)pow(tilt_factor, (float)i); */ FOR( k = 0; k < i; k++ ) { - inv_gain2 = shl( mult( inv_gain2, tilt_factor ), 1 ); + inv_gain2 = L_shl( Mpy_32_32( inv_gain2, tilt_factor ), 1 ); } i = add( i, 1 ); @@ -2529,7 +2589,7 @@ void tcx_noise_factor_ivas_fx( att = BASOP_Util_Divide3232_Scale( L_shl( L_min( accu1, accu2 ), 1 ), L_add( accu1, accu2 ), &s ); att = Sqrt16( att, &s ); BASOP_SATURATE_WARNING_OFF_EVS; /* att is always <= 1.0 */ - att = shl_o( att, s, &Overflow ); + att = shl_sat( att, s ); BASOP_SATURATE_WARNING_ON_EVS; } ELSE @@ -2543,7 +2603,7 @@ void tcx_noise_factor_ivas_fx( FOR( ; i < lowpassLine; i++ ) { - inv_gain2 = shl( mult( inv_gain2, tilt_factor ), 1 ); + inv_gain2 = L_shl( Mpy_32_32( inv_gain2, tilt_factor ), 1 ); IF( sqQ[i] != 0 ) /* current line is not zero, so reset pointers */ { @@ -2554,15 +2614,15 @@ void tcx_noise_factor_ivas_fx( IF( LE_16( nTransWidth, 3 ) ) { tmp2 = sub( k, c1 ); - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_msu( n, k, (Word16) 0x8000 ); } - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_mac( n, nTransWidth_1, (Word16) 0x8000 ); } - IF( tmp2 <= 0 ) + if ( tmp2 <= 0 ) { n = L_mac( n, int_sqr[k], c2 ); } @@ -2570,15 +2630,15 @@ void tcx_noise_factor_ivas_fx( ELSE { tmp2 = sub( k, 12 ); - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_msu( n, k, (Word16) 0x8000 ); } - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_sub( n, 0x70000 ); } - IF( tmp2 <= 0 ) + if ( tmp2 <= 0 ) { n = L_mac( n, int_sqr[k], 1152 /*0.03515625f Q15*/ ); } @@ -2606,13 +2666,12 @@ void tcx_noise_factor_ivas_fx( } ELSE /* current line is zero, so update pointers & segment sum */ { - IF( LT_16( win, nTransWidth ) ) + if ( LT_16( win, nTransWidth ) ) { win = add( win, 1 ); } /* update segment sum: magnitudes scaled by smoothing function */ - sqQ[i] = Mpy_32_16_1( imult3216( L_abs( x_orig[i] ), win ), inv_gain2 ); - move32(); + sqQ[i] = Mpy_32_32( imult3216( L_abs( x_orig[i] ), win ), inv_gain2 ); exp_spQ[i] = add( x_orig_e, inv_gain2_e ); move16(); } @@ -2623,15 +2682,15 @@ void tcx_noise_factor_ivas_fx( IF( LE_16( nTransWidth, 3 ) ) { tmp2 = sub( k, c1 ); - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_msu( n, k, (Word16) 0x8000 ); } - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_mac( n, nTransWidth_1, (Word16) 0x8000 ); } - IF( tmp2 <= 0 ) + if ( tmp2 <= 0 ) { n = L_mac( n, int_sqr[k], c2 ); } @@ -2639,15 +2698,15 @@ void tcx_noise_factor_ivas_fx( ELSE { tmp2 = sub( k, 12 ); - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_msu( n, k, (Word16) 0x8000 ); } - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_sub( n, 0x70000 ); } - IF( tmp2 <= 0 ) + if ( tmp2 <= 0 ) { n = L_mac( n, int_sqr[k], 1152 /*0.03515625f Q15*/ ); } @@ -2675,10 +2734,10 @@ void tcx_noise_factor_ivas_fx( /* noise level factor: average of segment magnitudes of noise bins */ IF( n > 0 ) { - tmp4 = BASOP_Util_Divide3232_Scale_cadence( Mpy_32_16_1( sqErrorNrg, att ), n, &s ); + tmp4 = BASOP_Util_Divide3232_Scale_newton( Mpy_32_16_1( sqErrorNrg, att ), n, &s ); s = add( add( exp_sqErrorNrg, -15 ), s ); BASOP_SATURATE_WARNING_OFF_EVS; - tmp4 = L_shl_o( tmp4, s, &Overflow ); + tmp4 = L_shl_sat( tmp4, s ); BASOP_SATURATE_WARNING_ON_EVS; } ELSE @@ -2799,12 +2858,14 @@ void tcx_encoder_memory_update_ivas_fx( Copy( xn_buf, synth, L_frame_glob ); Copy( synth + sub( L_frame_glob, M + 1 ), LPDmem->syn, M + 1 ); + LPDmem->q_lpd_syn = Q_new; + move16(); IF( st->tcxonly == 0 ) { /* Update weighted synthesis */ Residu3_fx( Ai + imult1616( sub( st->nb_subfr, 1 ), ( M + 1 ) ), synth + sub( L_frame_glob, 1 ), &tmp, 1, 0 ); - LPDmem->mem_w0 = sub_sat( wsig[sub( L_frame_glob, 1 )], tmp ); + LPDmem->mem_w0 = sub_sat( wsig[L_frame_glob - 1], tmp ); move16(); } @@ -2817,6 +2878,11 @@ void tcx_encoder_memory_update_ivas_fx( Copy( synth + sub( L_frame_glob, M ), LPDmem->mem_syn, M ); Copy( synth + sub( L_frame_glob, M ), LPDmem->mem_syn2, M ); Copy( synth + sub( L_frame_glob, L_SYN_MEM ), LPDmem->mem_syn_r, L_SYN_MEM ); + + /* Aligning the Q-factor of the remaining synthesis memory buffers */ + Scale_sig( LPDmem->mem_syn1_fx, M, sub( Q_new, LPDmem->q_mem_syn ) ); + Scale_sig( LPDmem->mem_syn3, M, sub( Q_new, LPDmem->q_mem_syn ) ); + LPDmem->q_mem_syn = Q_new; // resultant q of synth after E_UTIL_f_preemph2 move16(); @@ -3485,7 +3551,8 @@ Word16 tcx_res_Q_spec_ivas_fx( Word16 s, s2, lf_deemph_factor; Word16 c; Word32 thres; - + Word16 cmp_1, cmp_2; + Word32 tmp32_1, tmp32_2; /* Limit the number of residual bits */ sqTargetBits = s_min( sqTargetBits, NPRM_RESQ ); @@ -3501,16 +3568,18 @@ Word16 tcx_res_Q_spec_ivas_fx( move16(); s2 = sub( x_Q_e, 1 ); + cmp_1 = sub( sqTargetBits, kMaxEstimatorUndershoot ); + cmp_2 = s_min( NPRM_RESQ, add( sqTargetBits, kMaxEstimatorOvershoot ) ); FOR( i = 0; i < L_frame; i++ ) { - IF( GE_16( bits, sub( sqTargetBits, kMaxEstimatorUndershoot ) ) ) + IF( GE_16( bits, cmp_1 ) ) { fac_m = 0; move16(); fac_p = 0; move16(); - IF( GE_16( bits, s_min( NPRM_RESQ, add( sqTargetBits, kMaxEstimatorOvershoot ) ) ) ) + IF( GE_16( bits, cmp_2 ) ) { BREAK; } @@ -3522,11 +3591,11 @@ Word16 tcx_res_Q_spec_ivas_fx( { tmp1 = L_add( x_orig[i], 0 ); tmp2 = Mpy_32_16_1( x_Q[i], sqGain ); - IF( s > 0 ) + if ( s > 0 ) { tmp2 = L_shr( tmp2, s ); } - IF( s < 0 ) + if ( s < 0 ) { tmp1 = L_shl( tmp1, s ); } @@ -3543,11 +3612,11 @@ Word16 tcx_res_Q_spec_ivas_fx( move16(); bits = add( bits, 1 ); - IF( x_Q[i] > 0 ) + if ( x_Q[i] > 0 ) { tmp1 = L_mult( fac_m, lf_deemph_factor ); } - IF( x_Q[i] < 0 ) + if ( x_Q[i] < 0 ) { tmp1 = L_mult( fac_p, lf_deemph_factor ); } @@ -3560,11 +3629,11 @@ Word16 tcx_res_Q_spec_ivas_fx( move16(); bits = add( bits, 1 ); - IF( x_Q[i] > 0 ) + if ( x_Q[i] > 0 ) { tmp1 = L_mult( fac_p, lf_deemph_factor ); } - IF( x_Q[i] < 0 ) + if ( x_Q[i] < 0 ) { tmp1 = L_mult( fac_m, lf_deemph_factor ); } @@ -3577,12 +3646,8 @@ Word16 tcx_res_Q_spec_ivas_fx( /*Quantize zeroed-line of the spectrum*/ c = sub( 21627 /*0.66f Q15*/, mult_r( sq_round, 21627 /*0.66f Q15*/ ) ); - FOR( i = 0; i < L_frame; i++ ) + FOR( i = 0; ( i < L_frame ) && ( bits < ( sqTargetBits - 2 ) ); i++ ) { - IF( GE_16( bits, sub( sqTargetBits, 2 ) ) ) - { - BREAK; - } test(); test(); @@ -3599,7 +3664,9 @@ Word16 tcx_res_Q_spec_ivas_fx( tmp1 = Mpy_32_16_1( thres, sqGain ); - IF( GT_32( L_shl( x_orig[i], sub( x_orig_e, shift_tmp ) ), L_shl( tmp1, sub( sqGain_e, shift_tmp ) ) ) ) + tmp32_1 = L_shl( x_orig[i], sub( x_orig_e, shift_tmp ) ); + tmp32_2 = L_shl( tmp1, sub( sqGain_e, shift_tmp ) ); + IF( GT_32( tmp32_1, tmp32_2 ) ) { prm[bits] = 1; move16(); @@ -3612,7 +3679,7 @@ Word16 tcx_res_Q_spec_ivas_fx( x_Q[i] = L_shl( thres, sub( 1, x_Q_e ) ); move32(); } - ELSE IF( L_add( L_shl( x_orig[i], sub( x_orig_e, shift_tmp ) ), L_shl( tmp1, sub( sqGain_e, shift_tmp ) ) ) < 0 ) + ELSE IF( L_add( tmp32_1, tmp32_2 ) < 0 ) { prm[bits] = 1; move16(); @@ -3660,8 +3727,9 @@ void ProcessIGF_fx( Word16 igfGridIdx; Word16 isIndepFlag; Word16 bsBits; - Word16 bsStart; + Word16 pBsStart; BSTR_ENC_HANDLE hBstr = st->hBstr; + IGF_ENC_INSTANCE_HANDLE hIGFEnc = st->hIGFEnc; isIndepFlag = 1; @@ -3714,6 +3782,8 @@ void ProcessIGF_fx( Word16 Q_A; Word16 predictionGain = 0; Word16 *flatteningTrigger = &( st->hIGFEnc->flatteningTrigger ); + + move32(); move16(); move16(); @@ -3734,8 +3804,6 @@ void ProcessIGF_fx( } } - bsStart = hBstr->next_ind_fx; - move16(); hInstance->infoTotalBitsPerFrameWritten = 0; move16(); @@ -3745,13 +3813,13 @@ void ProcessIGF_fx( } ELSE { - IGFEncWriteBitstream_fx( hInstance, st->hBstr, &hInstance->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); - } + pBsStart = hBstr->nb_ind_tot; + move16(); - bsBits = sub( hBstr->next_ind_fx, bsStart ); - IF( !isTCX20 ) - { - IGFEncConcatenateBitstream_fx( hInstance, bsBits, &hBstr->next_ind_fx, &hBstr->nb_bits_tot, hBstr->ind_list ); + IGFEncWriteBitstream_ivas_fx( hIGFEnc, hBstr, &hIGFEnc->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); + + bsBits = sub( hBstr->nb_ind_tot, pBsStart ); + IGFEncConcatenateBitstream_ivas_fx( hIGFEnc, bsBits, hBstr ); } } @@ -3784,13 +3852,12 @@ void attenuateNbSpectrum_fx( Word16 L_frame, Word32 *spectrum ) * *---------------------------------------------------------------------*/ void ProcessIGF_ivas_fx( - Encoder_State *st, /* i : Encoder state */ -#ifdef MSAN_FIX - Word16 powerSpec_len, /* i : length of pPowerSpectrum buffer */ -#endif + Encoder_State *st, /* i : Encoder state */ + Word16 powerSpec_len, /* i : length of pPowerSpectrum buffer */ Word32 *pMDCTSpectrum, /* i : MDCT spectrum (*q_spectrum) */ - const Word32 *pITFMDCTSpectrum, /* i : MDCT spectrum fir ITF */ Word16 *q_spectrum, /* i/o: Q of spectrum */ + const Word32 *pITFMDCTSpectrum, /* i : MDCT spectrum fir ITF */ + const Word16 q_ITFMDCTSpectrum, /* i : Q of MDCT spectrum fir ITF */ Word32 *pPowerSpectrum, /* i : MDCT^2 + MDST^2 spectrum, or estimate (*q_powerSpec) */ Word16 *exp_powerSpec, /* i/o: Q of power spectrum */ const Word16 isTCX20, /* i : flag indicating if the input is TCX20 or TCX10/2xTCX5 */ @@ -3832,13 +3899,9 @@ void ProcessIGF_ivas_fx( } } - IGFSaveSpectrumForITF_ivas_fx( hIGFEnc, igfGridIdx, pITFMDCTSpectrum, sub( Q31, *q_spectrum ) ); + IGFSaveSpectrumForITF_ivas_fx( hIGFEnc, igfGridIdx, pITFMDCTSpectrum, sub( Q31, q_ITFMDCTSpectrum ) ); -#ifndef MSAN_FIX - IGFEncApplyMono_ivas_fx( st, igfGridIdx, pMDCTSpectrum, sub( Q31, *q_spectrum ), pPowerSpectrum, exp_powerSpec, isTCX20, st->hTcxEnc->fUseTns[frameno], sp_aud_decision0, vad_hover_flag ); -#else IGFEncApplyMono_ivas_fx( st, powerSpec_len, igfGridIdx, pMDCTSpectrum, sub( Q31, *q_spectrum ), pPowerSpectrum, exp_powerSpec, isTCX20, st->hTcxEnc->fUseTns[frameno], sp_aud_decision0, vad_hover_flag ); -#endif curr_order = 0; move16(); @@ -3876,7 +3939,7 @@ void ProcessIGF_ivas_fx( IGFEncWriteBitstream_ivas_fx( hIGFEnc, hBstr, &hIGFEnc->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); bsBits = sub( hBstr->nb_ind_tot, pBsStart ); - IGFEncConcatenateBitstream( hIGFEnc, bsBits, hBstr ); + IGFEncConcatenateBitstream_ivas_fx( hIGFEnc, bsBits, hBstr ); } return; @@ -3895,12 +3958,15 @@ void ProcessStereoIGF_fx( Word32 *pITFMDCTSpectrum_fx[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ Word16 q_pITFMDCTSpectrum_1, Word16 q_pITFMDCTSpectrum_2, - Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ - Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ - const Word16 frameno, /* i : flag indicating index of current subfr. */ - const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ - const Word32 element_brate, /* i : element bitrate */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ + Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + Word16 exp_inv_spectrum_fx[CPE_CHANNELS], /* i/o: exp of inv_spectrum_fx */ + const Word16 frameno, /* i : flag indicating index of current subfr. */ + const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ + const Word32 element_brate, /* i : element bitrate */ const Word16 mct_on ) { Word16 ch, igfGridIdx, isIndepFlag, bsBits, pBsStart, curr_order; @@ -3941,7 +4007,8 @@ void ProcessStereoIGF_fx( IGFSaveSpectrumForITF_ivas_fx( hIGFEnc[1], igfGridIdx, pITFMDCTSpectrum_fx[1][frameno], sub( Q31, q_pITFMDCTSpectrum_2 ) ); - IGFEncApplyStereo_fx( hStereoMdct, ms_mask, hIGFEnc, igfGridIdx, sts, pPowerSpectrum_fx, pPowerSpectrumMsInv_fx, inv_spectrum_fx, frameno, sp_aud_decision0, element_brate, mct_on ); + IGFEncApplyStereo_fx( hStereoMdct, ms_mask, hIGFEnc, igfGridIdx, sts, pPowerSpectrum_fx, exp_pPowerSpectrum_fx, pPowerSpectrumMsInv_fx, q_pPowerSpectrumMsInv_fx, + inv_spectrum_fx, exp_inv_spectrum_fx, frameno, sp_aud_decision0, element_brate, mct_on ); FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -3980,7 +4047,7 @@ void ProcessStereoIGF_fx( IGFEncWriteBitstream_ivas_fx( hIGFEnc[ch], hBstr, &hIGFEnc[ch]->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); bsBits = sub( hBstr->nb_ind_tot, pBsStart ); - IGFEncConcatenateBitstream( hIGFEnc[ch], bsBits, hBstr ); + IGFEncConcatenateBitstream_ivas_fx( hIGFEnc[ch], bsBits, hBstr ); } } return; diff --git a/lib_enc/tfa_enc_fx.c b/lib_enc/tfa_enc_fx.c index a6a1eaa8501e54e4fca18402b1ee6c759fbd53da..60427f792b0877bc47e79a7bf6087f6161ca2fb2 100644 --- a/lib_enc/tfa_enc_fx.c +++ b/lib_enc/tfa_enc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_enc/tns_base_enc_fx.c b/lib_enc/tns_base_enc_fx.c index cf6e5dd6417827061efc67503270a95395ab65a2..d8e5899da1124e8c1744c354533115af3d07153e 100644 --- a/lib_enc/tns_base_enc_fx.c +++ b/lib_enc/tns_base_enc_fx.c @@ -1,8 +1,8 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ - +#include "options.h" #include "cnst.h" #include "stl.h" //#include "prot_fx.h" @@ -10,11 +10,11 @@ #include "stl.h" #include #include -#include "rom_com_fx.h" #include "rom_com.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + #define HLM_MIN_NRG_FX 858993459 // ( 32768.0f * 2 * NORM_MDCT_FACTOR / ( 640 * 640 ) ) in Q26 /** Get TNS filter parameters from autocorrelation. @@ -76,10 +76,6 @@ Word16 DetectTnsFilt_fx( STnsConfig const *pTnsConfig, Word16 idx1; Word16 nSubdivisions; Word16 iSubdivisions; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif move16(); move16(); @@ -125,7 +121,7 @@ Word16 DetectTnsFilt_fx( STnsConfig const *pTnsConfig, /* Check threshold HLM_MIN_NRG */ BASOP_SATURATE_WARNING_OFF_EVS; - tmp32 = L_sub( L_shl_o( L_tmp, s_min( 31, sub( shift, 24 - 31 * 2 ) ), &Overflow ), 3277l /*HLM_MIN_NRG Q7*/ ); + tmp32 = L_sub( L_shl_sat( L_tmp, s_min( 31, sub( shift, 24 - 31 * 2 ) ) ), 3277l /*HLM_MIN_NRG Q7*/ ); BASOP_SATURATE_WARNING_ON_EVS; /* get pre-shift for autocorrelation */ @@ -229,11 +225,7 @@ Word16 DetectTnsFilt_fx( STnsConfig const *pTnsConfig, assert( n < (Word16) ( sizeof( tmpbuf ) / sizeof( Word16 ) ) ); FOR( i = 0; i < n; i++ ) { -#ifdef FIX_ISSUE_1147 tmpbuf[i] = round_fx_sat( L_shl( pSpectrum[iStartLine + i], shift ) ); -#else - tmpbuf[i] = round_fx( L_shl( pSpectrum[iStartLine + i], shift ) ); -#endif move16(); } @@ -417,13 +409,13 @@ void CalculateTnsFilt_fx( return; } -Word16 DetectTnsFilt_ivas_fx( STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ - Word32 const pSpectrum[], /* i : MDCT spectrum Q=Qx */ - STnsData *pTnsData, /* o : TNS data struct */ - TRAN_DET_HANDLE hTranDet, /* i : transient detection handle */ - Word8 isTCX10, /* i : TCX10 or TCX20? */ - Word16 ltp_gain, /* i : LTP gain Q=15 */ - Word16 *predictionGain /* o : TNS prediction gain Q=7 */ +Word16 DetectTnsFilt_ivas_fx( STnsConfig const *pTnsConfig, /* i : TNS Configuration struct */ + Word32 const pSpectrum[], /* i : MDCT spectrum Q=Qx */ + STnsData *pTnsData, /* o : TNS data struct */ + TRAN_DET_HANDLE hTranDet, /* i : transient detection handle */ + Word8 isTCX10, /* i : TCX10 or TCX20? */ + Word16 ltp_gain, /* i : LTP gain Q=15 */ + Word16 *predictionGain /* o : TNS prediction gain Q=7 */ ) { Word16 facs[TNS_MAX_NUM_OF_FILTERS][MAX_SUBDIVISIONS]; @@ -445,10 +437,6 @@ Word16 DetectTnsFilt_ivas_fx( STnsConfig const *pTnsConfig, /* i : TNS Configur Word16 idx1; Word16 nSubdivisions; Word16 iSubdivisions; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif move16(); move16(); @@ -494,7 +482,7 @@ Word16 DetectTnsFilt_ivas_fx( STnsConfig const *pTnsConfig, /* i : TNS Configur /* Check threshold HLM_MIN_NRG */ BASOP_SATURATE_WARNING_OFF_EVS; - tmp32 = L_sub( L_shl_o( L_tmp, s_min( 31, sub( shift, 24 - 31 * 2 ) ), &Overflow ), 3277l /*HLM_MIN_NRG Q7*/ ); + tmp32 = L_sub( L_shl_sat( L_tmp, s_min( 31, sub( shift, 24 - 31 * 2 ) ) ), 3277l /*HLM_MIN_NRG Q7*/ ); BASOP_SATURATE_WARNING_ON_EVS; /* get pre-shift for autocorrelation */ diff --git a/lib_enc/transient_detection_fx.c b/lib_enc/transient_detection_fx.c index 44bd8cc3c27dd144a8dac786fd0ee211a3259405..f671b8d9eef275a7c27505c68bbdf9f21f422b5a 100644 --- a/lib_enc/transient_detection_fx.c +++ b/lib_enc/transient_detection_fx.c @@ -1,12 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ - #include "options.h" #include "stl.h" #include "basop_util.h" -// #include "prot_fx.h" #include "rom_com.h" #include #include @@ -36,26 +34,26 @@ #define THR_LOW_STEP_FX ONE_IN_Q11 /* 1 in Q11 */ #define MIN_BLOCK_ENERGY_IVAS_FX_Q7 13743 /* 107.37f in Q7 */ + /************************************************/ /* */ /* Internal functions prototypes */ /* */ /************************************************/ -static void InitDelayBuffer( Word16 nFrameLength, Word16 nDelay, DelayBuffer *pDelayBuffer ); -static void InitSubblockEnergies( Word16 nFrameLength, Word16 nDelay, DelayBuffer *pDelayBuffer, SubblockEnergies *pSubblockEnergies ); -static void InitSubblockEnergies_ivas_fx( Word16 nFrameLength, Word16 nDelay, DelayBuffer *pDelayBuffer, SubblockEnergies *pSubblockEnergies ); -static void InitTransientDetector_fx( SubblockEnergies *pSubblockEnergies, Word16 nDelay, Word16 nSubblocksToCheck, TCheckSubblocksForAttack_fx pCheckSubblocksForAttack, Word16 attackRatioThreshold, TransientDetector *pTransientDetector ); -static void InitTransientDetector_ivas_fx( SubblockEnergies *pSubblockEnergies, Word16 nDelay, Word16 nSubblocksToCheck, TCheckSubblocksForAttack_fx pCheckSubblocksForAttack, Word16 attackRatioThreshold, TransientDetector *pTransientDetector ); -static void UpdateDelayBuffer( Word16 const *input, Word16 nSamplesAvailable, DelayBuffer *pDelayBuffer ); -static void HighPassFilter_fx( Word16 const *input, Word16 length, Word16 *pFirState1, Word16 *pFirState2, Word16 *output ); -static void UpdateSubblockEnergies( Word16 const *input, Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ); -static void CalculateSubblockEnergies( Word16 const *input, Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ); +static void InitDelayBuffer( const Word16 nFrameLength, const Word16 nDelay, DelayBuffer *pDelayBuffer ); +static void InitSubblockEnergies( const Word16 nFrameLength, const Word16 nDelay, DelayBuffer *pDelayBuffer, SubblockEnergies *pSubblockEnergies ); +static void InitSubblockEnergies_ivas_fx( const Word16 nFrameLength, const Word16 nDelay, DelayBuffer *pDelayBuffer, SubblockEnergies *pSubblockEnergies ); +static void InitTransientDetector_fx( SubblockEnergies *pSubblockEnergies, const Word16 nDelay, const Word16 nSubblocksToCheck, const TCheckSubblocksForAttack_fx pCheckSubblocksForAttack, const Word16 attackRatioThreshold, TransientDetector *pTransientDetector ); +static void InitTransientDetector_ivas_fx( SubblockEnergies *pSubblockEnergies, const Word16 nDelay, const Word16 nSubblocksToCheck, const TCheckSubblocksForAttack_fx pCheckSubblocksForAttack, const Word16 attackRatioThreshold, TransientDetector *pTransientDetector ); +static void UpdateDelayBuffer( Word16 const *input, const Word16 nSamplesAvailable, DelayBuffer *pDelayBuffer ); +static void HighPassFilter_fx( Word16 const *input, const Word16 length, Word16 *pFirState1, Word16 *pFirState2, Word16 *output ); +static void UpdateSubblockEnergies( Word16 const *input, const Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ); +static void CalculateSubblockEnergies( Word16 const *input, const Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ); static void RunTransientDetector_fx( TransientDetector *pTransientDetector ); +static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, const Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ); +static void UpdateSubblockEnergies_ivas_fx( Word16 const *input, const Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ); -static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ); - -static void UpdateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ); /************************************************/ /* */ @@ -68,14 +66,19 @@ static void UpdateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamples * See TCheckSubblocksForAttack_fx FOR definition of parameters. * It is assumed that the delay of MDCT overlap was not taken into account, so that the last subblock corresponds to the newest input subblock. */ -static void GetAttackForTCXDecision( Word32 const *pSubblockNrg, Word32 const *pAccSubblockNrg, Word16 nSubblocks, Word16 nPastSubblocks, Word16 attackRatioThreshold, Word16 *pbIsAttackPresent, Word16 *pAttackIndex ) +static void GetAttackForTCXDecision( + Word32 const *pSubblockNrg, + Word32 const *pAccSubblockNrg, + Word16 nSubblocks, + Word16 nPastSubblocks, + Word16 attackRatioThreshold, + Word16 *pbIsAttackPresent, + Word16 *pAttackIndex ) { Word16 i; Word16 bIsAttackPresent, attackIndex; Word16 attackRatioThreshold_1_5; - (void) nPastSubblocks; - (void) nSubblocks; assert( nSubblocks >= NSUBBLOCKS ); assert( nPastSubblocks >= 2 ); @@ -140,17 +143,26 @@ static void GetAttackForTCXDecision( Word32 const *pSubblockNrg, Word32 const *p move16(); *pAttackIndex = attackIndex; *pbIsAttackPresent = bIsAttackPresent; + + return; } -static void GetAttackForTCXDecision_ivas_fx( Word32 const *pSubblockNrg, Word32 const *pAccSubblockNrg, Word16 nSubblocks, Word16 nPastSubblocks, Word16 attackRatioThreshold, Word16 *pbIsAttackPresent, Word16 *pAttackIndex ) + +/* GetAttackForTCXDecision() version using 32-bit for energy change values */ +static void GetAttackForTCXDecision_ivas_fx( + Word32 const *pSubblockNrg, + Word32 const *pAccSubblockNrg, + Word16 nSubblocks, + Word16 nPastSubblocks, + Word16 attackRatioThreshold, + Word16 *pbIsAttackPresent, + Word16 *pAttackIndex ) { Word16 i; Word16 bIsAttackPresent, attackIndex; Word16 attackRatioThreshold_1_5; Word64 W_tmp1, W_tmp2, W_tmp3; - (void) nPastSubblocks; - (void) nSubblocks; assert( nSubblocks >= NSUBBLOCKS ); assert( nPastSubblocks >= 2 ); @@ -242,88 +254,22 @@ static void GetAttackForTCXDecision_ivas_fx( Word32 const *pSubblockNrg, Word32 move16(); *pAttackIndex = attackIndex; *pbIsAttackPresent = bIsAttackPresent; -} - -void GetAttackForTCXDecision_fx( Word32 const *pSubblockNrg, Word32 const *pAccSubblockNrg, Word16 nSubblocks, Word16 nPastSubblocks, Word16 attackRatioThreshold, Word16 *pbIsAttackPresent, Word16 *pAttackIndex ) -{ - Word16 i; - Word16 bIsAttackPresent, attackIndex; - Word16 attackRatioThreshold_1_5; - - (void) nPastSubblocks; - (void) nSubblocks; - assert( nSubblocks >= NSUBBLOCKS ); - assert( nPastSubblocks >= 2 ); - - /* attackRatioThreshold_1_5 = attackRatioThreshold * 1.5, exponent is ATTACKTHRESHOLD_E+1 */ - attackRatioThreshold_1_5 = add( shr( attackRatioThreshold, 2 ), shr( attackRatioThreshold, 1 ) ); - - move16(); - move16(); - bIsAttackPresent = FALSE; - attackIndex = 0; - /* Search for the last attack in the subblocks */ - if ( s_or( (Word16) GT_32( L_shr( pSubblockNrg[-1], ATTACKTHRESHOLD_E ), Mpy_32_16_1( pAccSubblockNrg[-1], attackRatioThreshold ) ), - L_sub( L_shr( pSubblockNrg[-2], ATTACKTHRESHOLD_E ), Mpy_32_16_1( pAccSubblockNrg[-2], attackRatioThreshold ) ) > 0 ) ) - { - move16(); - bIsAttackPresent = TRUE; - } - - FOR( i = 0; i < NSUBBLOCKS; i++ ) - { - IF( GT_32( L_shr( pSubblockNrg[i], ATTACKTHRESHOLD_E ), Mpy_32_16_1( pAccSubblockNrg[i], attackRatioThreshold ) ) ) - { - if ( i < 6 ) - { - move16(); - bIsAttackPresent = TRUE; - } - - if ( s_and( (Word16) NE_16( attackIndex, 2 ), (Word16) NE_16( attackIndex, 6 ) ) ) - { - move16(); - attackIndex = i; - } - } - ELSE /* no attack, but set index anyway in case of strong energy increase */ - { - IF( s_and( ( (Word16) GT_32( L_shr( pSubblockNrg[i], 1 + ATTACKTHRESHOLD_E ), Mpy_32_16_1( pSubblockNrg[sub( i, 1 )], attackRatioThreshold_1_5 ) ) ), - ( L_sub( L_shr( pSubblockNrg[i], 1 + ATTACKTHRESHOLD_E ), Mpy_32_16_1( pSubblockNrg[sub( i, 2 )], attackRatioThreshold_1_5 ) ) > 0 ) ) ) - { - - if ( s_and( (Word16) NE_16( attackIndex, 2 ), (Word16) NE_16( attackIndex, 6 ) ) ) - { - move16(); - attackIndex = i; - } - } - } - } - /* avoid post-echos on click sounds (very short transients) due to TNS aliasing */ - if ( EQ_16( attackIndex, 4 ) ) - { - move16(); - attackIndex = 7; - } - if ( EQ_16( attackIndex, 5 ) ) - { - move16(); - attackIndex = 6; - } - move16(); - move16(); - *pAttackIndex = attackIndex; - *pbIsAttackPresent = bIsAttackPresent; + return; } + /** Initialize TCX transient detector. * See InitTransientDetector_fx for definition of parameters. */ -static void InitTCXTransientDetector( Word16 nDelay, SubblockEnergies *pSubblockEnergies, TransientDetector *pTransientDetector ) +static void InitTCXTransientDetector( + Word16 nDelay, + SubblockEnergies *pSubblockEnergies, + TransientDetector *pTransientDetector ) { InitTransientDetector_fx( pSubblockEnergies, nDelay, NSUBBLOCKS, GetAttackForTCXDecision, 17408 /*8.5f/(1<delayBuffer ); + InitDelayBuffer( nFrameLength, nTCXDelay, &hTranDet->delayBuffer ); + /* Init a subblock energies buffer used for the TCX Short/Long decision. */ - InitSubblockEnergies( nFrameLength, nTCXDelay, &pTransientDetection->delayBuffer, &pTransientDetection->subblockEnergies ); + InitSubblockEnergies( nFrameLength, nTCXDelay, &hTranDet->delayBuffer, &hTranDet->subblockEnergies ); + /* Init the TCX Short/Long transient detector. */ - InitTCXTransientDetector( nTCXDelay, &pTransientDetection->subblockEnergies, &pTransientDetection->transientDetector ); + InitTCXTransientDetector( nTCXDelay, &hTranDet->subblockEnergies, &hTranDet->transientDetector ); + /* We need two past subblocks for the TCX TD and NSUBBLOCKS+1 for the temporal flatness measure FOR the TCX LTP. */ - pTransientDetection->transientDetector.pSubblockEnergies->nDelay = - add( pTransientDetection->transientDetector.pSubblockEnergies->nDelay, NSUBBLOCKS + 1 ); + hTranDet->transientDetector.pSubblockEnergies->nDelay = + add( hTranDet->transientDetector.pSubblockEnergies->nDelay, NSUBBLOCKS + 1 ); + + return; } -void InitTransientDetection_ivas_fx( Word16 nFrameLength, - Word16 nTCXDelay, - TRAN_DET_HANDLE pTransientDetection, - const Word16 ext_mem_flag ) + +void InitTransientDetection_ivas_fx( + const Word16 nFrameLength, + const Word16 nTCXDelay, + TRAN_DET_HANDLE hTranDet, + const Word16 ext_mem_flag ) { /* Init the delay buffer. */ - InitDelayBuffer( nFrameLength, nTCXDelay, &pTransientDetection->delayBuffer ); + InitDelayBuffer( nFrameLength, nTCXDelay, &hTranDet->delayBuffer ); + + /* Init a subblock energies buffer used for the TCX Short/Long decision. */ - InitSubblockEnergies_ivas_fx( nFrameLength, nTCXDelay, &pTransientDetection->delayBuffer, &pTransientDetection->subblockEnergies ); + InitSubblockEnergies_ivas_fx( nFrameLength, nTCXDelay, &hTranDet->delayBuffer, &hTranDet->subblockEnergies ); + + /* Init the TCX Short/Long transient detector. */ - InitTransientDetector_ivas_fx( &pTransientDetection->subblockEnergies, nTCXDelay, NSUBBLOCKS, GetAttackForTCXDecision_ivas_fx, 17408 /*8.5f/(1<transientDetector ); + InitTransientDetector_ivas_fx( &hTranDet->subblockEnergies, nTCXDelay, NSUBBLOCKS, GetAttackForTCXDecision_ivas_fx, 17408 /*8.5f/(1<transientDetector ); + + /* We need two past subblocks for the TCX TD and NSUBBLOCKS+1 for the temporal flatness measure FOR the TCX LTP. */ IF( ext_mem_flag ) { - pTransientDetection->transientDetector.pSubblockEnergies->nDelay = - add( pTransientDetection->transientDetector.pSubblockEnergies->nDelay, add( ( NSUBBLOCKS + 1 ), ( NSUBBLOCKS_SHIFT + 1 ) ) ); + hTranDet->transientDetector.pSubblockEnergies->nDelay = + add( hTranDet->transientDetector.pSubblockEnergies->nDelay, add( ( NSUBBLOCKS + 1 ), ( NSUBBLOCKS_SHIFT + 1 ) ) ); move16(); } ELSE { - pTransientDetection->transientDetector.pSubblockEnergies->nDelay = - add( pTransientDetection->transientDetector.pSubblockEnergies->nDelay, NSUBBLOCKS + 1 ); + hTranDet->transientDetector.pSubblockEnergies->nDelay = + add( hTranDet->transientDetector.pSubblockEnergies->nDelay, NSUBBLOCKS + 1 ); move16(); } + + return; } + /** * \brief Calculate average of temporal energy change. * \return average temporal energy change with exponent = 8 */ -Word16 GetTCXAvgTemporalFlatnessMeasure_fx( struct TransientDetection const *pTransientDetection, Word16 nCurrentSubblocks, Word16 nPrevSubblocks ) +Word16 GetTCXAvgTemporalFlatnessMeasure_fx( + TRAN_DET_HANDLE hTranDet, + const Word16 nCurrentSubblocks, + const Word16 nPrevSubblocks ) { Word16 i; TransientDetector const *pTransientDetector; @@ -389,9 +355,8 @@ Word16 GetTCXAvgTemporalFlatnessMeasure_fx( struct TransientDetection const *pTr Word32 sumTempFlatness; Word16 nTotBlocks; - /* Initialization */ - pTransientDetector = &pTransientDetection->transientDetector; + pTransientDetector = &hTranDet->transientDetector; pSubblockEnergies = pTransientDetector->pSubblockEnergies; move16(); nDelay = pTransientDetector->nDelay; @@ -419,7 +384,11 @@ Word16 GetTCXAvgTemporalFlatnessMeasure_fx( struct TransientDetection const *pTr return i; } -Word32 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( struct TransientDetection const *pTransientDetection, Word16 nCurrentSubblocks, Word16 nPrevSubblocks ) + +Word32 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( + TRAN_DET_HANDLE hTranDet, + const Word16 nCurrentSubblocks, + const Word16 nPrevSubblocks ) { Word32 i; TransientDetector const *pTransientDetector; @@ -432,7 +401,7 @@ Word32 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( struct TransientDetection const Word16 nTotBlocks, sumTempFlatness_exp, exp; /* Initialization */ - pTransientDetector = &pTransientDetection->transientDetector; + pTransientDetector = &hTranDet->transientDetector; pSubblockEnergies = pTransientDetector->pSubblockEnergies; nDelay = pTransientDetector->nDelay; move16(); @@ -458,16 +427,18 @@ Word32 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( struct TransientDetection const } /* exponent = AVG_FLAT_E */ - i = BASOP_Util_Divide3232_Scale_cadence( sumTempFlatness, nTotBlocks, &exp ); + i = BASOP_Util_Divide3232_Scale_newton( sumTempFlatness, nTotBlocks, &exp ); exp = add( exp, sub( sumTempFlatness_exp, 31 ) ); i = L_shl_sat( i, sub( exp, 10 ) ); // Can be saturated, since it is used for comparision againt 3.25/20.0f, Q21 + return i; } -Word16 GetTCXMaxenergyChange_fx( struct TransientDetection const *pTransientDetection, - const Word8 isTCX10, - const Word16 nCurrentSubblocks, - const Word16 nPrevSubblocks ) +Word16 GetTCXMaxenergyChange_fx( + TRAN_DET_HANDLE hTranDet, + const Word8 isTCX10, + const Word16 nCurrentSubblocks, + const Word16 nPrevSubblocks ) { Word16 i; TransientDetector const *pTransientDetector; @@ -478,8 +449,7 @@ Word16 GetTCXMaxenergyChange_fx( struct TransientDetection const *pTransientDete Word16 maxEnergyChange; Word16 nTotBlocks; - - pTransientDetector = &pTransientDetection->transientDetector; + pTransientDetector = &hTranDet->transientDetector; pSubblockEnergies = pTransientDetector->pSubblockEnergies; move16(); nDelay = pTransientDetector->nDelay; @@ -500,7 +470,6 @@ Word16 GetTCXMaxenergyChange_fx( struct TransientDetection const *pTransientDete Word32 const *pSubblockNrg = &pSubblockEnergies->subblockNrg[sub( nRelativeDelay, nPrevSubblocks )]; Word32 nrgMin, nrgMax; Word16 idxMax = 0; - move16(); nrgMax = L_add( pSubblockNrg[0], 0 ); @@ -543,10 +512,11 @@ Word16 GetTCXMaxenergyChange_fx( struct TransientDetection const *pTransientDete } -Word16 GetTCXMaxenergyChange_ivas_fx( TRAN_DET_HANDLE hTranDet, - const Word8 isTCX10, - const Word16 nCurrentSubblocks, - const Word16 nPrevSubblocks ) +Word16 GetTCXMaxenergyChange_ivas_fx( + TRAN_DET_HANDLE hTranDet, + const Word8 isTCX10, + const Word16 nCurrentSubblocks, + const Word16 nPrevSubblocks ) { Word16 i; TransientDetector const *pTransientDetector; @@ -558,7 +528,6 @@ Word16 GetTCXMaxenergyChange_ivas_fx( TRAN_DET_HANDLE hTranDet, Word16 maxEnergyChange; Word16 nTotBlocks; - pTransientDetector = &hTranDet->transientDetector; pSubblockEnergies = pTransientDetector->pSubblockEnergies; move16(); @@ -620,13 +589,17 @@ Word16 GetTCXMaxenergyChange_ivas_fx( TRAN_DET_HANDLE hTranDet, return i; } -void RunTransientDetection_fx( Word16 const *input, Word16 nSamplesAvailable, TransientDetection *pTransientDetection ) + +void RunTransientDetection_fx( + Word16 const *input, + const Word16 nSamplesAvailable, + TRAN_DET_HANDLE hTranDet ) { Word16 filteredInput[L_FRAME48k]; - SubblockEnergies *pSubblockEnergies = &pTransientDetection->subblockEnergies; - TransientDetector *pTransientDetector = &pTransientDetection->transientDetector; + SubblockEnergies *pSubblockEnergies = &hTranDet->subblockEnergies; + TransientDetector *pTransientDetector = &hTranDet->transientDetector; - assert( ( input != NULL ) && ( pTransientDetection != NULL ) && ( pSubblockEnergies != NULL ) && ( pTransientDetector != NULL ) ); + assert( ( input != NULL ) && ( hTranDet != NULL ) && ( pSubblockEnergies != NULL ) && ( pTransientDetector != NULL ) ); HighPassFilter_fx( input, nSamplesAvailable, &pSubblockEnergies->firState1, &pSubblockEnergies->firState2, filteredInput ); @@ -637,28 +610,19 @@ void RunTransientDetection_fx( Word16 const *input, Word16 nSamplesAvailable, Tr RunTransientDetector_fx( pTransientDetector ); /* Update the delay buffer. */ - UpdateDelayBuffer( filteredInput, nSamplesAvailable, &pTransientDetection->delayBuffer ); -#ifdef IVAS_CODE - /* compute ramp up flag */ - pSubblockEnergies->ramp_up_flag = ( ( pSubblockEnergies->ramp_up_flag << 1 ) & 0x0003 ); - e0 = dotp( filteredInput + length / 2, filteredInput + length / 2, pSubblockEnergies->pDelayBuffer->nSubblockSize / 2 ) + 0.5f * MIN_BLOCK_ENERGY; - e1 = pSubblockEnergies->subblockNrg[pSubblockEnergies->nDelay + 4] - e0; - if ( e1 > e0 ) - { - pSubblockEnergies->ramp_up_flag |= 0x0001; - } -#endif + UpdateDelayBuffer( filteredInput, nSamplesAvailable, &hTranDet->delayBuffer ); + + return; } void RunTransientDetection_ivas_fx( - Word16 *input_fx, /* i : input signal Q: q_input */ + Word16 *input_fx, /* i : input signal Q: q_input */ const Word16 length, /* i : frame length */ TRAN_DET_HANDLE hTranDet, /* i/o: transient detection handle */ - Word16 q_input /*i: stores q for input_fx*/ + Word16 q_input /* i : stores q for input_fx */ ) { - Word16 filteredInput_fx[L_FRAME_MAX]; SubblockEnergies *pSubblockEnergies = &hTranDet->subblockEnergies; TransientDetector *pTransientDetector = &hTranDet->transientDetector; @@ -678,18 +642,13 @@ void RunTransientDetection_ivas_fx( IF( GT_16( sub( q_input, pSubblockEnergies->q_firState ), shift ) ) { Scale_sig( input_fx, length, add( sub( pSubblockEnergies->q_firState, q_input ), shift ) ); // q_firState + shift -#ifdef FIX_ISSUE_1186 - q_input = add( pSubblockEnergies->q_firState, shift ); // q_firState + shift -#endif - pSubblockEnergies->firState1 = shl( pSubblockEnergies->firState1, shift ); // q_firState + shift + q_input = add( pSubblockEnergies->q_firState, shift ); // q_firState + shift + pSubblockEnergies->firState1 = shl( pSubblockEnergies->firState1, shift ); // q_firState + shift move16(); pSubblockEnergies->firState2 = shl( pSubblockEnergies->firState2, shift ); // q_firState + shift move16(); pSubblockEnergies->q_firState = add( pSubblockEnergies->q_firState, shift ); // q_firState + shift move16(); -#ifndef FIX_ISSUE_1186 - q_input = add( pSubblockEnergies->q_firState, shift ); // q_firState + shift -#endif } ELSE { @@ -715,11 +674,7 @@ void RunTransientDetection_ivas_fx( } /* Update subblock energies. */ -#ifdef MSAN_FIX Scale_sig( filteredInput_fx, length, sub( 0, q_input ) ); // q0 -#else - Scale_sig( filteredInput_fx, L_FRAME_MAX, 8 ); -#endif UpdateSubblockEnergies_ivas_fx( filteredInput_fx, length, pSubblockEnergies ); /* Run transient detectors. */ @@ -745,11 +700,13 @@ void RunTransientDetection_ivas_fx( return; } + /*-------------------------------------------------------------------* * isLongTermTransient_fx() * * *-------------------------------------------------------------------*/ + static Word16 isLongTermTransient_fx( const Word32 frameTFM, Word32 *lastTFM ) @@ -773,6 +730,7 @@ static Word16 isLongTermTransient_fx( { return 1; } + return 0; } @@ -833,7 +791,6 @@ void SetTCXModeInfo_ivas_fx( move16(); } } - #ifdef SUPPORT_FORCE_TCX10_TCX20 #ifdef DEBUGGING if ( st->force == FORCE_TCX10 ) @@ -884,7 +841,7 @@ void SetTCXModeInfo_ivas_fx( move16(); } } - tmp = BASOP_Util_Divide3232_Scale( ONE_IN_Q21, GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) hTranDet, NSUBBLOCKS, 0 ), &exp_diff ); + tmp = BASOP_Util_Divide3232_Scale( ONE_IN_Q21, GetTCXAvgTemporalFlatnessMeasure_ivas_fx( hTranDet, NSUBBLOCKS, 0 ), &exp_diff ); tmp = shl_sat( tmp, exp_diff ); // Q15 test(); IF( isLongTermTransient_fx( L_deposit_h( tmp ), &hTcxEnc->tfm_mem_fx ) && EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) @@ -914,7 +871,7 @@ void SetTCXModeInfo_ivas_fx( *tcxModeOverlap = ALDO_WINDOW; move16(); } - tmp = BASOP_Util_Divide3232_Scale( ONE_IN_Q21, GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) hTranDet, NSUBBLOCKS, 0 ), &exp_diff ); + tmp = BASOP_Util_Divide3232_Scale( ONE_IN_Q21, GetTCXAvgTemporalFlatnessMeasure_ivas_fx( hTranDet, NSUBBLOCKS, 0 ), &exp_diff ); tmp = shl_sat( tmp, exp_diff ); // Q15 test(); IF( isLongTermTransient_fx( L_deposit_h( tmp ), &hTcxEnc->tfm_mem_fx ) && EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) @@ -952,19 +909,24 @@ void SetTCXModeInfo_ivas_fx( } -void SetTCXModeInfo_fx( Encoder_State *st, - TransientDetection const *pTransientDetection, - Word16 *tcxModeOverlap ) +/*-------------------------------------------------------------------* + * SetTCXModeInfo() + * + * + *-------------------------------------------------------------------*/ + +void SetTCXModeInfo_fx( + Encoder_State *st, + TRAN_DET_HANDLE hTranDet, + Word16 *tcxModeOverlap ) { TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; - assert( pTransientDetection != NULL ); + assert( hTranDet != NULL ); IF( EQ_16( st->codec_mode, MODE2 ) ) { - /* determine window sequence (1 long or 2 short windows) */ - test(); IF( st->tcx10Enabled != 0 && st->tcx20Enabled != 0 ) { @@ -972,7 +934,7 @@ void SetTCXModeInfo_fx( Encoder_State *st, test(); test(); test(); - IF( ( ( pTransientDetection->transientDetector.bIsAttackPresent != 0 ) || ( GT_32( Mpy_32_16_1( st->currEnergyHF_fx, 840 /*1.0f/39.0f Q15*/ ), st->prevEnergyHF_fx ) ) ) && ( ( NE_16( st->last_core, ACELP_CORE ) ) && ( NE_16( st->last_core, AMR_WB_CORE ) ) ) ) + IF( ( ( hTranDet->transientDetector.bIsAttackPresent != 0 ) || ( GT_32( Mpy_32_16_1( st->currEnergyHF_fx, 840 /*1.0f/39.0f Q15*/ ), st->prevEnergyHF_fx ) ) ) && ( ( NE_16( st->last_core, ACELP_CORE ) ) && ( NE_16( st->last_core, AMR_WB_CORE ) ) ) ) { move16(); hTcxEnc->tcxMode = TCX_10; @@ -1021,10 +983,9 @@ void SetTCXModeInfo_fx( Encoder_State *st, } /* determine window overlaps (0 full, 2 none, or 3 half) */ - IF( EQ_16( hTcxEnc->tcxMode, TCX_10 ) ) { - IF( pTransientDetection->transientDetector.attackIndex < 0 ) + IF( hTranDet->transientDetector.attackIndex < 0 ) { move16(); *tcxModeOverlap = HALF_OVERLAP; @@ -1032,7 +993,7 @@ void SetTCXModeInfo_fx( Encoder_State *st, ELSE { move16(); - *tcxModeOverlap = s_and( pTransientDetection->transientDetector.attackIndex, 3 ); + *tcxModeOverlap = s_and( hTranDet->transientDetector.attackIndex, 3 ); if ( EQ_16( *tcxModeOverlap, 1 ) ) { move16(); @@ -1042,12 +1003,12 @@ void SetTCXModeInfo_fx( Encoder_State *st, } ELSE IF( EQ_16( hTcxEnc->tcxMode, TCX_20 ) ) { - IF( EQ_16( pTransientDetection->transientDetector.attackIndex, 7 ) ) + IF( EQ_16( hTranDet->transientDetector.attackIndex, 7 ) ) { move16(); *tcxModeOverlap = HALF_OVERLAP; } - ELSE IF( EQ_16( pTransientDetection->transientDetector.attackIndex, 6 ) ) + ELSE IF( EQ_16( hTranDet->transientDetector.attackIndex, 6 ) ) { move16(); *tcxModeOverlap = MIN_OVERLAP; @@ -1073,19 +1034,24 @@ void SetTCXModeInfo_fx( Encoder_State *st, /* Sanity check */ assert( *tcxModeOverlap != 1 ); } + + return; } + /************************************************/ /* */ /* Internal functions */ /* */ /************************************************/ -static void InitDelayBuffer( Word16 nFrameLength, Word16 nDelay, DelayBuffer *pDelayBuffer ) +static void InitDelayBuffer( + const Word16 nFrameLength, + const Word16 nDelay, + DelayBuffer *pDelayBuffer ) { Word16 const nMaxBuffSize = sizeof( pDelayBuffer->buffer ) / sizeof( pDelayBuffer->buffer[0] ); - move16(); move16(); assert( ( nFrameLength > NSUBBLOCKS ) && ( nFrameLength % NSUBBLOCKS == 0 ) && ( nDelay >= 0 ) && ( pDelayBuffer != NULL ) ); @@ -1094,14 +1060,19 @@ static void InitDelayBuffer( Word16 nFrameLength, Word16 nDelay, DelayBuffer *pD set16_fx( pDelayBuffer->buffer, 0, nMaxBuffSize ); pDelayBuffer->nDelay = nDelay % pDelayBuffer->nSubblockSize; assert( pDelayBuffer->nDelay <= nMaxBuffSize ); + + return; } -static void InitSubblockEnergies( Word16 nFrameLength, Word16 nDelay, DelayBuffer *pDelayBuffer, SubblockEnergies *pSubblockEnergies ) + +static void InitSubblockEnergies( + const Word16 nFrameLength, + const Word16 nDelay, + DelayBuffer *pDelayBuffer, + SubblockEnergies *pSubblockEnergies ) { Word16 const nMaxBuffSize = sizeof( pSubblockEnergies->subblockNrg ) / sizeof( pSubblockEnergies->subblockNrg[0] ); move16(); - (void) nFrameLength; - assert( ( pDelayBuffer != NULL ) && ( pSubblockEnergies != NULL ) && ( pDelayBuffer->nSubblockSize * NSUBBLOCKS == nFrameLength ) && ( pDelayBuffer->nSubblockSize > 0 ) ); @@ -1122,9 +1093,16 @@ static void InitSubblockEnergies( Word16 nFrameLength, Word16 nDelay, DelayBuffe pSubblockEnergies->pDelayBuffer = pDelayBuffer; pDelayBuffer->nDelay = s_max( pDelayBuffer->nDelay, pSubblockEnergies->nPartialDelay ); + + return; } -static void InitSubblockEnergies_ivas_fx( Word16 nFrameLength, Word16 nDelay, DelayBuffer *pDelayBuffer, SubblockEnergies *pSubblockEnergies ) + +static void InitSubblockEnergies_ivas_fx( + const Word16 nFrameLength, + const Word16 nDelay, + DelayBuffer *pDelayBuffer, + SubblockEnergies *pSubblockEnergies ) { Word16 const nMaxBuffSize = NSUBBLOCKS + MAX_TD_DELAY; move16(); @@ -1160,8 +1138,11 @@ static void InitSubblockEnergies_ivas_fx( Word16 nFrameLength, Word16 nDelay, De pSubblockEnergies->pDelayBuffer = pDelayBuffer; pDelayBuffer->nDelay = s_max( pDelayBuffer->nDelay, pSubblockEnergies->nPartialDelay ); move16(); + + return; } + /** Init transient detector. * Fills TransientDetector structure with sensible content and enable it. * @param pSubblockEnergies Subblock energies used in this transient detector. @@ -1172,7 +1153,13 @@ static void InitSubblockEnergies_ivas_fx( Word16 nFrameLength, Word16 nDelay, De * @param attackRatioThreshold Attack ratio threshold with exponent ATTACKTHRESHOLD_E. * @param pTransientDetector Structure to be initialized. */ -static void InitTransientDetector_fx( SubblockEnergies *pSubblockEnergies, Word16 nDelay, Word16 nSubblocksToCheck, TCheckSubblocksForAttack_fx pCheckSubblocksForAttack, Word16 attackRatioThreshold, TransientDetector *pTransientDetector ) +static void InitTransientDetector_fx( + SubblockEnergies *pSubblockEnergies, + const Word16 nDelay, + const Word16 nSubblocksToCheck, + const TCheckSubblocksForAttack_fx pCheckSubblocksForAttack, + const Word16 attackRatioThreshold, + TransientDetector *pTransientDetector ) { Word16 nMaxBuffSize; @@ -1198,9 +1185,18 @@ static void InitTransientDetector_fx( SubblockEnergies *pSubblockEnergies, Word1 move16(); pTransientDetector->attackIndex = -1; move16(); + + return; } -static void InitTransientDetector_ivas_fx( SubblockEnergies *pSubblockEnergies, Word16 nDelay, Word16 nSubblocksToCheck, TCheckSubblocksForAttack_fx pCheckSubblocksForAttack, Word16 attackRatioThreshold, TransientDetector *pTransientDetector ) + +static void InitTransientDetector_ivas_fx( + SubblockEnergies *pSubblockEnergies, + const Word16 nDelay, + const Word16 nSubblocksToCheck, + const TCheckSubblocksForAttack_fx pCheckSubblocksForAttack, + const Word16 attackRatioThreshold, + TransientDetector *pTransientDetector ) { const Word16 nMaxBuffSize = NSUBBLOCKS + MAX_TD_DELAY; move16(); @@ -1235,17 +1231,29 @@ static void InitTransientDetector_ivas_fx( SubblockEnergies *pSubblockEnergies, move16(); pTransientDetector->pSubblockEnergies->ramp_up_flag = 0x0; move16(); + + return; } + /* This function should be inlined and WMOPS instrumentation takes that into account, meaning that all references are considered as local variables */ -static Word32 InlineFilter( Word16 inValue, Word16 firState1, Word16 firState2 ) +static Word32 InlineFilter( + const Word16 inValue, + const Word16 firState1, + const Word16 firState2 ) { /* 0.375f * inValue - 0.5f * firState1 + 0.125f * firState2 */ return L_msu( L_mac( L_mult( firState2, 4096 /*0.125f Q15*/ ), inValue, 12288 /*0.375f Q15*/ ), firState1, 16384 /*0.5f Q15*/ ); } -static void HighPassFilter_fx( Word16 const *input, Word16 length, Word16 *pFirState1, Word16 *pFirState2, Word16 *output ) + +static void HighPassFilter_fx( + Word16 const *input, + const Word16 length, + Word16 *pFirState1, + Word16 *pFirState2, + Word16 *output ) { Word16 i; @@ -1265,9 +1273,13 @@ static void HighPassFilter_fx( Word16 const *input, Word16 length, Word16 *pFirS move16(); *pFirState2 = input[length - 2]; *pFirState1 = input[length - 1]; + + return; } -static void RunTransientDetector_fx( TransientDetector *pTransientDetector ) + +static void RunTransientDetector_fx( + TransientDetector *pTransientDetector ) { Word16 const attackRatioThreshold = pTransientDetector->attackRatioThreshold; move16(); @@ -1287,14 +1299,19 @@ static void RunTransientDetector_fx( TransientDetector *pTransientDetector ) attackRatioThreshold, &pTransientDetector->bIsAttackPresent, &pTransientDetector->attackIndex ); #undef WMC_TOOL_SKIP + + return; } -static void UpdateDelayBuffer( Word16 const *input, Word16 nSamplesAvailable, DelayBuffer *pDelayBuffer ) + +static void UpdateDelayBuffer( + Word16 const *input, + const Word16 nSamplesAvailable, + DelayBuffer *pDelayBuffer ) { Word16 i; Word16 nDelay; - move16(); nDelay = pDelayBuffer->nDelay; @@ -1310,13 +1327,18 @@ static void UpdateDelayBuffer( Word16 const *input, Word16 nSamplesAvailable, De pDelayBuffer->buffer[i] = input[i + nSamplesAvailable - nDelay]; } } + + return; } -static void UpdateSubblockEnergies( Word16 const *input, Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ) + +static void UpdateSubblockEnergies( + Word16 const *input, + const Word16 nSamplesAvailable, + SubblockEnergies *pSubblockEnergies ) { Word16 i; - assert( ( pSubblockEnergies->nDelay >= 0 ) && ( pSubblockEnergies->nDelay + NSUBBLOCKS <= (Word32) sizeof( pSubblockEnergies->subblockNrg ) / (Word32) sizeof( pSubblockEnergies->subblockNrg[0] ) ) ); assert( pSubblockEnergies->nPartialDelay <= pSubblockEnergies->pDelayBuffer->nDelay ); /* At least one block delay is required when subblock energy change is required */ @@ -1335,13 +1357,19 @@ static void UpdateSubblockEnergies( Word16 const *input, Word16 nSamplesAvailabl /* Compute filtered subblock energies for the new samples */ CalculateSubblockEnergies( input, nSamplesAvailable, pSubblockEnergies ); + + return; } -static void UpdateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ) + +/* UpdateSubblockEnergies() version using 32-bit for energy change values */ +static void UpdateSubblockEnergies_ivas_fx( + Word16 const *input, + const Word16 nSamplesAvailable, + SubblockEnergies *pSubblockEnergies ) { Word16 i; - assert( ( pSubblockEnergies->nDelay >= 0 ) && ( pSubblockEnergies->nDelay + NSUBBLOCKS <= (Word32) sizeof( pSubblockEnergies->subblockNrg ) / (Word32) sizeof( pSubblockEnergies->subblockNrg[0] ) ) ); assert( pSubblockEnergies->nPartialDelay <= pSubblockEnergies->pDelayBuffer->nDelay ); /* At least one block delay is required when subblock energy change is required */ @@ -1362,10 +1390,17 @@ static void UpdateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamples /* Compute filtered subblock energies for the new samples */ CalculateSubblockEnergies_ivas_fx( input, nSamplesAvailable, pSubblockEnergies ); + + return; } + /* This function should be inlined and WMOPS instrumentation takes that into account, meaning that all references are considered as local variables */ -static void UpdatedAndStoreAccWindowNrg( Word32 newWindowNrgF, Word32 *pAccSubblockNrg, Word16 facAccSubblockNrg, Word32 *pOutAccWindowNrgF ) +static void UpdatedAndStoreAccWindowNrg( + Word32 newWindowNrgF, + Word32 *pAccSubblockNrg, + const Word16 facAccSubblockNrg, + Word32 *pOutAccWindowNrgF ) { /* Store the accumulated energy */ move32(); @@ -1378,9 +1413,15 @@ static void UpdatedAndStoreAccWindowNrg( Word32 newWindowNrgF, Word32 *pAccSubbl move32(); *pAccSubblockNrg = newWindowNrgF; } + + return; } -static void CalculateSubblockEnergies( Word16 const *input, Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ) + +static void CalculateSubblockEnergies( + Word16 const *input, + const Word16 nSamplesAvailable, + SubblockEnergies *pSubblockEnergies ) { DelayBuffer *pDelayBuffer; Word16 nSubblockSize; @@ -1492,9 +1533,16 @@ static void CalculateSubblockEnergies( Word16 const *input, Word16 nSamplesAvail move16(); pSubblockEnergies->firState1 = firState1; pSubblockEnergies->firState2 = firState2; + + return; } -static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ) + +/* CalculateSubblockEnergies() version using 32-bit energy change values */ +static void CalculateSubblockEnergies_ivas_fx( + Word16 const *input, + const Word16 nSamplesAvailable, + SubblockEnergies *pSubblockEnergies ) { DelayBuffer *pDelayBuffer; Word16 nSubblockSize; @@ -1578,85 +1626,23 @@ static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamp IF( GT_32( w0, w1 ) ) { - pSubblockNrgChange[w] = BASOP_Util_Divide3232_Scale_cadence( w0, w1, &k ); + pSubblockNrgChange[w] = BASOP_Util_Divide3232_Scale_newton( w0, w1, &k ); pSubblockNrgChange_exp[w] = k; } ELSE { - pSubblockNrgChange[w] = BASOP_Util_Divide3232_Scale_cadence( w1, w0, &k ); + pSubblockNrgChange[w] = BASOP_Util_Divide3232_Scale_newton( w1, w0, &k ); pSubblockNrgChange_exp[w] = k; } move32(); move16(); } } -} -#ifdef IVAS_CODE -/*-------------------------------------------------------------------* - * set_transient_stereo() - * - * - *-------------------------------------------------------------------*/ - -void set_transient_stereo( - CPE_ENC_HANDLE hCPE, /* i : CPE structure */ - float currFlatness[] /* i/o: current flatness */ -) -{ - int16_t n, attackIsPresent; - float currFlatnessMax; - Encoder_State **sts; - - sts = hCPE->hCoreCoder; - - /* for DFT/TD based stereo ,map avg. flatness to individual stereo channels (M/S or X/Y) */ - maximum( currFlatness, CPE_CHANNELS, &currFlatnessMax ); - attackIsPresent = 0; - - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - attackIsPresent = max( attackIsPresent, sts[n]->hTranDet->transientDetector.bIsAttackPresent ); - } - - set_f( currFlatness, currFlatnessMax, CPE_CHANNELS ); - - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - sts[n]->hTranDet->transientDetector.bIsAttackPresent = attackIsPresent; - } - - if ( hCPE->hStereoDft != NULL ) - { - if ( hCPE->hStereoDft->attackPresent ) - { - hCPE->hStereoDft->wasTransient = 1; - } - else if ( hCPE->hStereoDft->wasTransient ) - { - hCPE->hStereoDft->wasTransient = 0; - } - - hCPE->hStereoDft->attackPresent = attackIsPresent; - - hCPE->hStereoDft->hItd->currFlatness = 0; - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - hCPE->hStereoDft->hItd->currFlatness = max( hCPE->hStereoDft->hItd->currFlatness, currFlatness[n] ); - } - } - - if ( hCPE->hStereoMdct != NULL ) - { - hCPE->hStereoMdct->hItd->currFlatness = 0; - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - hCPE->hStereoMdct->hItd->currFlatness = max( hCPE->hStereoMdct->hItd->currFlatness, currFlatness[n] ); - } - } return; } -#endif + + /*-------------------------------------------------------------------* * transient_analysis() * @@ -1667,9 +1653,9 @@ void set_transient_stereo( Word16 transient_analysis_ivas_fx( TRAN_DET_HANDLE hTranDet, /* i : handle transient detection */ const Word16 cor_map_LT[], /* i : LT correlation map Q_cor_map */ - Word16 Q_cor_map, + const Word16 Q_cor_map, const Word16 multi_harm_limit, /* i : multi harmonic threshold Q_multi_harm_limit */ - Word16 Q_multi_harm_limit ) + const Word16 Q_multi_harm_limit ) { const Word32 *pSubblockNrg; Word32 accSubblockNrgRev_fx[NSUBBLOCKS]; @@ -1760,7 +1746,6 @@ Word16 transient_analysis_ivas_fx( FOR( i = NSUBBLOCKS - 1; i > -1; i-- ) { - IF( EQ_16( i, NSUBBLOCKS - 1 ) ) { accSubblockNrgRev_fx[i] = pSubblockNrg[i + offset]; @@ -1803,15 +1788,16 @@ Word16 transient_analysis_ivas_fx( } } - return prel_force_td != 0; } + /*-------------------------------------------------------------------* * set_transient_stereo() * * *-------------------------------------------------------------------*/ + void set_transient_stereo_fx( CPE_ENC_HANDLE hCPE, /* i : CPE structure */ Word32 currFlatness[] /* i/o: current flatness */ diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index 9911d766ae7790b70d3e26b7a5cbe1b37b0d5063..547502eab143cc2523cafebe01e169a2474fb28d 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -1,11 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -21,40 +20,40 @@ static void tc_enc_ivas_fx( Encoder_State *st_fx, const Word16 i_subfr, Word16 * /*==========================================================================*/ -/* FUNCTION : void transition_enc_fx () */ +/* FUNCTION : void transition_enc_fx () */ /*--------------------------------------------------------------------------*/ /* PURPOSE :Principal function for adaptive excitation construction in TC*/ /*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* (Word32) core_brate : core bitrate Q0 */ -/* (Word16) bwidth : input signal bandwidth Q0 */ -/* (Word16) i_subfr : subrame index Q0 */ -/* (Word16*) Jopt_flag : joint optimization flag Q0 */ -/* (Word16*) h1_fx : weighted filter input response Q14 */ -/* (Word16*) xn_fx : target signal Q_new*/ -/* (Word16) Q_new : input scaling */ +/* INPUT ARGUMENTS : */ +/* (Word32) core_brate : core bitrate Q0 */ +/* (Word16) bwidth : input signal bandwidth Q0 */ +/* (Word16) i_subfr : subrame index Q0 */ +/* (Word16*) Jopt_flag : joint optimization flag Q0 */ +/* (Word16*) h1_fx : weighted filter input response Q14 */ +/* (Word16*) xn_fx : target signal Q_new */ +/* (Word16) Q_new : input scaling */ /*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* (Word16*) y1_fx : zero-memory filtered adaptive excitation Q12*/ -/* (Word16*) xn2_fx : target vector for innovation search Qnew */ -/* (Word16*) gain_pit_fx : pitch gain (0..GAIN_PIT_MAX) Q14*/ -/* (Word16[])g_corr_fx : correlations and -2 */ -/* (Word16**)pt_pitch_fx : floating pitch values Q6 */ -/* (Word16*) bwe_exc_fx : excitation for SWB TBE Q0 */ +/* OUTPUT ARGUMENTS : */ +/* (Word16*) y1_fx : zero-memory filtered adaptive excitation Q12*/ +/* (Word16*) xn2_fx : target vector for innovation search Qnew */ +/* (Word16*) gain_pit_fx : pitch gain (0..GAIN_PIT_MAX) Q14*/ +/* (Word16[])g_corr_fx : correlations and -2 */ +/* (Word16**)pt_pitch_fx : floating pitch values Q6 */ +/* (Word16*) bwe_exc_fx : excitation for SWB TBE Q0 */ /*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* (Word16*) tc_subfr : TC subframe index Q0 */ -/* (Word16*) position : index of the residual signal maximum Q0 */ -/* (Word16*) T0_min : lower pitch limit Q0 */ -/* (Word16*) T0_max : higher pitch limit Q0 */ -/* (Word16*) T0 : close loop integer pitch Q0 */ -/* (Word16*) T0_frac : close loop fractional part of the pitch Q0*/ -/* (Word16*) exc_fx : pointer to excitation signal frame */ -/* (Word16*) gp_cl_fx : memory of gain of pitch clipping algorithm*/ -/* (Word16*) clip_gain : adaptive gain clipping flag Q0 */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* (Word16*) tc_subfr : TC subframe index Q0 */ +/* (Word16*) position : index of the residual signal maximum Q0 */ +/* (Word16*) T0_min : lower pitch limit Q0 */ +/* (Word16*) T0_max : higher pitch limit Q0 */ +/* (Word16*) T0 : close loop integer pitch Q0 */ +/* (Word16*) T0_frac : close loop fractional part of the pitch Q0*/ +/* (Word16*) exc_fx : pointer to excitation signal frame */ +/* (Word16*) gp_cl_fx : memory of gain of pitch clipping algorithm*/ +/* (Word16*) clip_gain : adaptive gain clipping flag Q0 */ /*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*--------------------------------------------------------------------------*/ void transition_enc_fx( @@ -120,6 +119,7 @@ void transition_enc_fx( lp_flag = st_fx->acelp_cfg.ltf_mode; move16(); + /*-----------------------------------------------------------------* * TC: subrame determination for glottal shape search * ------------------------------------------------------- @@ -152,9 +152,11 @@ void transition_enc_fx( limit_T0_fx( st_fx->L_frame, 8, 0, limit_flag, mult_Top * T_op[1], 0, T0_min, T0_max ); } + /*-----------------------------------------------------------------* * zero adaptive excitation signal construction *-----------------------------------------------------------------*/ + IF( GT_16( *tc_subfr, i_subfr ) ) { *gain_pit_fx = 0; @@ -212,15 +214,9 @@ void transition_enc_fx( IF( EQ_16( *tc_subfr, TC_0_0 ) ) { /* this is called only to compute unused bits */ - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#ifdef NONBE_FIX_GSC_BSTR - L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, TC_0_0, 3, NULL, unbits_ACELP, -#else - L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, -#endif - st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ - ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, TC_0_0, 3, NULL, unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } + *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, sub( shift_wsp, 1 ) ); move16(); updt_tar_fx( xn_fx, xn2_fx, y1_fx, *gain_pit_fx, L_SUBFR ); @@ -238,6 +234,7 @@ void transition_enc_fx( * in the 1st subframe and the second one in 2nd subframe * and later *--------------------------------------------------------------*/ + ELSE IF( LT_16( *tc_subfr, i_subfr ) ) { IF( EQ_16( st_fx->L_frame, L_FRAME ) ) @@ -271,6 +268,7 @@ void transition_enc_fx( * if tc_subfr==0, change tc_subfr corresponding to the * second glot. impulse position *----------------------------------------------------------*/ + test(); IF( ( *tc_subfr == 0 ) && ( EQ_16( i_subfr, L_SUBFR ) ) ) { @@ -288,8 +286,7 @@ void transition_enc_fx( pit_limit = add( shl( pit_start, 1 ), *position ); /* Find the closed loop pitch period */ - - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, pit_start, pit_limit, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, pit_start, pit_limit, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); offset = tbe_celp_exc_offset( *T0, *T0_frac, st_fx->L_frame ); @@ -328,14 +325,9 @@ void transition_enc_fx( IF( LE_16( sub( i_subfr, *tc_subfr ), L_SUBFR ) ) { - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#ifdef NONBE_FIX_GSC_BSTR - st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, *tc_subfr, 2, NULL, -#else - st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, -#endif - unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, *tc_subfr, 2, NULL, unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } + /*-----------------------------------------------------------------* * get number of bits for pitch encoding *-----------------------------------------------------------------*/ @@ -346,6 +338,7 @@ void transition_enc_fx( /*-----------------------------------------------------------------* * Find adaptive part of excitation, encode pitch period *-----------------------------------------------------------------*/ + test(); test(); test(); @@ -359,6 +352,7 @@ void transition_enc_fx( * second glottal impulse is in the 3rd or 4th subframe * - build exc[] in 2nd subframe *--------------------------------------------------------*/ + *T0 = 2 * L_SUBFR; move16(); *T0_frac = 0; @@ -375,6 +369,7 @@ void transition_enc_fx( * - build exc[] in 2nd subframe *--------------------------------------------------------*/ + IF( LT_16( add( *T0, *position ), L_SUBFR ) ) { /* impulse must be in the 2nd subframe (not in 1st) */ @@ -397,12 +392,11 @@ void transition_enc_fx( /* 7bit ENCODER */ /* index = (*T0-pit_start)*2 + *T0_frac/2;*/ index = add( shl( sub( *T0, pit_start ), 1 ), shr( *T0_frac, 1 ) ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); - offset = tbe_celp_exc_offset( *T0, *T0_frac, st_fx->L_frame ); FOR( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) @@ -422,7 +416,7 @@ void transition_enc_fx( pit_flag = 0; move16(); - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, pit_start, 3 * L_SUBFR, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, pit_start, 3 * L_SUBFR, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); IF( LT_16( add( ( *T0 ), ( *position ) ), 2 * L_SUBFR ) ) @@ -446,7 +440,7 @@ void transition_enc_fx( limit_T0_fx( L_FRAME, 8, pit_flag, limit_flag, *T0, 0, T0_min, T0_max ); /* find T0_min and T0_max for delta search */ index = add( shl( sub( *T0, pit_start ), 1 ), shr( *T0_frac, 1 ) ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); @@ -481,11 +475,12 @@ void transition_enc_fx( * second glottal impulse is in the 4th subframe * - build exc[] in 4th subframe *--------------------------------------------------------*/ + /* always T0_frac = 0 */ pit_flag = 0; move16(); - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); IF( LT_16( add( *T0, *position ), 3 * L_SUBFR ) ) @@ -510,7 +505,7 @@ void transition_enc_fx( *T0_frac = 0; move16(); } - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); @@ -529,12 +524,13 @@ void transition_enc_fx( * second glottal impulse in the 3rd subframe * build exc[] in 4th subframe *--------------------------------------------------------*/ + pit_flag = L_SUBFR; move16(); - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); index = delta_pit_enc_fx( 2, *T0, *T0_frac, *T0_min ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); @@ -553,6 +549,7 @@ void transition_enc_fx( * first glottal impulse is NOT in the 1st subframe, * or two impulses are in the 1st subframe *------------------------------------------------------------*/ + ELSE { test(); @@ -562,13 +559,13 @@ void transition_enc_fx( test(); IF( !( ( *tc_subfr == 0 ) && ( EQ_16( i_subfr, L_SUBFR ) ) ) ) { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); } } ELSE { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); } pit_Q_enc_fx( hBstr, 0, nBits, 8, pit_flag, limit_flag, *T0, *T0_frac, T0_min, T0_max ); @@ -590,6 +587,7 @@ void transition_enc_fx( * - LP filtering of the adaptive excitation (if non-zero) * - codebook target computation *-----------------------------------------------------------------*/ + IF( *Jopt_flag == 0 ) { /* adaptive/TC excitation is zero */ @@ -615,15 +613,17 @@ void transition_enc_fx( IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { - push_indice_fx( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); } } **pt_pitch_fx = shl( add( shl( *T0, 2 ), *T0_frac ), 4 ); move16(); + /*---------------------------------------------------------------------* * fill the pitch buffer - needed for post-processing *---------------------------------------------------------------------*/ + test(); test(); test(); @@ -711,6 +711,7 @@ void transition_enc_fx( limit_flag = 1; move16(); } + IF( LE_16( i_subfr, 2 * L_SUBFR ) ) { IF( LT_16( i_subfr, 2 * L_SUBFR ) ) @@ -744,7 +745,7 @@ void transition_enc_fx( IF( EQ_16( nBits, 10 ) ) { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, limit_flag, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, st_fx->L_frame, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, limit_flag, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, st_fx->L_frame, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); pit16k_Q_enc_fx( hBstr, nBits, limit_flag, *T0, *T0_frac, T0_min, T0_max ); } @@ -755,7 +756,8 @@ void transition_enc_fx( * PIT16k_MIN to PIT16k_FR2_TC0_2SUBFR-1 resolution 1/4 (frac = 0,1,2 or 3) * PIT16k_FR2_TC0_2SUBFR to 2*L_SUBFR resolution 1/2 (frac = 0 or 2) *-----------------------------------------------------------------------------*/ - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, limit_flag, PIT16k_FR2_TC0_2SUBFR, 2 * L_SUBFR, st_fx->L_frame, L_SUBFR ); + + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, limit_flag, PIT16k_FR2_TC0_2SUBFR, 2 * L_SUBFR, st_fx->L_frame, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); IF( GT_16( *T0_max, 2 * L_SUBFR ) ) @@ -776,16 +778,16 @@ void transition_enc_fx( /*index = (*T0)*2 + ((*T0_frac)>>1) - (PIT16k_FR2_TC0_2SUBFR*2) + ((PIT16k_FR2_TC0_2SUBFR-PIT16k_MIN)*4);*/ index = add( sub( add( shl( *T0, 1 ), shr( *T0_frac, 1 ) ), ( PIT16k_FR2_TC0_2SUBFR * 2 ) ), ( PIT16k_FR2_TC0_2SUBFR - PIT16k_MIN ) * 4 ); } - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); } ELSE IF( EQ_16( nBits, 6 ) ) { /* delta search */ - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, L_SUBFR, limit_flag, PIT16k_FR2_EXTEND_9b, PIT16k_FR1_EXTEND_9b, st_fx->L_frame, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, L_SUBFR, limit_flag, PIT16k_FR2_EXTEND_9b, PIT16k_FR1_EXTEND_9b, st_fx->L_frame, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); index = delta_pit_enc_fx( 4, *T0, *T0_frac, *T0_min ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); } IF( EQ_16( nBits, 6 ) ) { @@ -797,6 +799,7 @@ void transition_enc_fx( * - LP filtering of the adaptive excitation * - codebook target computation *-----------------------------------------------------------------*/ + test(); IF( ( EQ_16( i_subfr, L_SUBFR ) ) && ( EQ_16( *T0, 2 * L_SUBFR ) ) ) { @@ -811,8 +814,8 @@ void transition_enc_fx( *Jopt_flag = 0; move16(); - set16_fx( &exc_fx[i_subfr], 0, L_SUBFR + 1 ); /* set excitation for current subrame to 0 */ - push_indice_fx( hBstr, IND_LP_FILT_SELECT, 0, 1 ); /* this bit is actually not needed */ + set16_fx( &exc_fx[i_subfr], 0, L_SUBFR + 1 ); /* set excitation for current subrame to 0 */ + push_indice( hBstr, IND_LP_FILT_SELECT, 0, 1 ); /* this bit is actually not needed */ Copy( xn_fx, xn2_fx, L_SUBFR ); /* target vector for codebook search */ set16_fx( y1_fx, 0, L_SUBFR ); /* set filtered adaptive excitation to 0 */ @@ -847,7 +850,7 @@ void transition_enc_fx( IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { - push_indice_fx( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); } *Jopt_flag = 1; @@ -863,6 +866,7 @@ void transition_enc_fx( /*---------------------------------------------------------------------* * fill the pitch buffer - needed for post-processing *---------------------------------------------------------------------*/ + test(); test(); IF( ( EQ_16( sub( i_subfr, *tc_subfr ), L_SUBFR ) ) || ( *tc_subfr == 0 && EQ_16( i_subfr, 2 * L_SUBFR ) ) ) @@ -909,7 +913,6 @@ void transition_enc_ivas_fx( Word16 *unbits_ACELP, /* i/o: unused bits */ Word16 Q_new, /* i : Current scaling */ Word16 shift /* i : downscaling needs for 12 bits convolutions */ - ) { Word16 pit_flag, pit_start, pit_limit, index, nBits; @@ -923,8 +926,6 @@ void transition_enc_ivas_fx( /* set limit_flag to 0 for restrained limits, and 1 for extended limits */ limit_flag = 0; move16(); - Word16 h1_fx_q15[L_SUBFR + ( M + 1 )]; - Copy_Scale_sig( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ), 0 ); pit_start = PIT_MIN; move16(); @@ -949,6 +950,7 @@ void transition_enc_ivas_fx( lp_flag = st_fx->acelp_cfg.ltf_mode; move16(); + /*-----------------------------------------------------------------* * TC: subrame determination for glottal shape search * ------------------------------------------------------- @@ -981,9 +983,11 @@ void transition_enc_ivas_fx( limit_T0_fx( st_fx->L_frame, 8, 0, limit_flag, mult_Top * T_op[1], 0, T0_min, T0_max ); } + /*-----------------------------------------------------------------* * zero adaptive excitation signal construction *-----------------------------------------------------------------*/ + IF( GT_16( *tc_subfr, i_subfr ) ) { *gain_pit_fx = 0; @@ -1024,6 +1028,7 @@ void transition_enc_ivas_fx( /*-----------------------------------------------------------------* * glottal codebook contribution construction *-----------------------------------------------------------------*/ + ELSE IF( EQ_16( *tc_subfr, i_subfr ) ) { IF( EQ_16( st_fx->L_frame, L_FRAME ) ) @@ -1041,15 +1046,9 @@ void transition_enc_ivas_fx( IF( EQ_16( *tc_subfr, TC_0_0 ) ) { /* this is called only to compute unused bits */ - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#ifdef NONBE_FIX_GSC_BSTR - L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, TC_0_0, 3, NULL, unbits_ACELP, -#else - L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, -#endif - st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ - ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, TC_0_0, 3, NULL, unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } + *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, sub( shift_wsp, 1 ) ); move16(); updt_tar_fx( xn_fx, xn2_fx, y1_fx, *gain_pit_fx, L_SUBFR ); @@ -1067,6 +1066,7 @@ void transition_enc_ivas_fx( * in the 1st subframe and the second one in 2nd subframe * and later *--------------------------------------------------------------*/ + ELSE IF( LT_16( *tc_subfr, i_subfr ) ) { IF( EQ_16( st_fx->L_frame, L_FRAME ) ) @@ -1100,6 +1100,7 @@ void transition_enc_ivas_fx( * if tc_subfr==0, change tc_subfr corresponding to the * second glot. impulse position *----------------------------------------------------------*/ + test(); IF( ( *tc_subfr == 0 ) && ( EQ_16( i_subfr, L_SUBFR ) ) ) { @@ -1117,20 +1118,17 @@ void transition_enc_ivas_fx( pit_limit = add( shl( pit_start, 1 ), *position ); /* Find the closed loop pitch period */ - - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, pit_start, pit_limit, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, pit_start, pit_limit, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); offset = tbe_celp_exc_offset( *T0, *T0_frac, st_fx->L_frame ); - FOR( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) { bwe_exc_fx[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc_fx[i + i_subfr * HIBND_ACB_L_FAC - offset]; move16(); } - test(); IF( GT_16( ( *T0 ), sub( 2 * L_SUBFR, ( *position ) ) ) ) { @@ -1157,14 +1155,9 @@ void transition_enc_ivas_fx( IF( LE_16( sub( i_subfr, *tc_subfr ), L_SUBFR ) ) { - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#ifdef NONBE_FIX_GSC_BSTR - st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, *tc_subfr, 2, NULL, -#else - st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, -#endif - unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, *tc_subfr, 2, NULL, unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } + /*-----------------------------------------------------------------* * get number of bits for pitch encoding *-----------------------------------------------------------------*/ @@ -1175,6 +1168,7 @@ void transition_enc_ivas_fx( /*-----------------------------------------------------------------* * Find adaptive part of excitation, encode pitch period *-----------------------------------------------------------------*/ + test(); test(); test(); @@ -1188,6 +1182,7 @@ void transition_enc_ivas_fx( * second glottal impulse is in the 3rd or 4th subframe * - build exc[] in 2nd subframe *--------------------------------------------------------*/ + *T0 = 2 * L_SUBFR; move16(); *T0_frac = 0; @@ -1202,8 +1197,8 @@ void transition_enc_ivas_fx( /*--------------------------------------------------------* * second glottal impulse is in the 2nd subframe, * - build exc[] in 2nd subframe + *--------------------------------------------------------*/ - *--------------------------------------------------------*/ IF( LT_16( add( *T0, *position ), L_SUBFR ) ) { /* impulse must be in the 2nd subframe (not in 1st) */ @@ -1229,7 +1224,7 @@ void transition_enc_ivas_fx( push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); offset = tbe_celp_exc_offset( *T0, *T0_frac, st_fx->L_frame ); @@ -1251,7 +1246,7 @@ void transition_enc_ivas_fx( pit_flag = 0; move16(); - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, pit_start, 3 * L_SUBFR, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, pit_start, 3 * L_SUBFR, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); IF( LT_16( add( ( *T0 ), ( *position ) ), 2 * L_SUBFR ) ) @@ -1278,7 +1273,7 @@ void transition_enc_ivas_fx( push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); offset = tbe_celp_exc_offset( *T0, *T0_frac, st_fx->L_frame ); @@ -1295,6 +1290,7 @@ void transition_enc_ivas_fx( * second glottal impulse is in the 4th subframe * - build exc[] in 3rd subframe *--------------------------------------------------------*/ + *T0 = 4 * L_SUBFR; move16(); *T0_frac = 0; @@ -1310,11 +1306,12 @@ void transition_enc_ivas_fx( * second glottal impulse is in the 4th subframe * - build exc[] in 4th subframe *--------------------------------------------------------*/ + /* always T0_frac = 0 */ pit_flag = 0; move16(); - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); IF( LT_16( add( *T0, *position ), 3 * L_SUBFR ) ) @@ -1342,7 +1339,7 @@ void transition_enc_ivas_fx( push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); offset = tbe_celp_exc_offset( *T0, *T0_frac, st_fx->L_frame ); @@ -1358,20 +1355,20 @@ void transition_enc_ivas_fx( * second glottal impulse in the 3rd subframe * build exc[] in 4th subframe *--------------------------------------------------------*/ + pit_flag = L_SUBFR; move16(); - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); index = delta_pit_enc_fx( 2, *T0, *T0_frac, *T0_min ); push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); offset = tbe_celp_exc_offset( *T0, *T0_frac, st_fx->L_frame ); - FOR( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) { bwe_exc_fx[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc_fx[i + i_subfr * HIBND_ACB_L_FAC - offset]; @@ -1383,6 +1380,7 @@ void transition_enc_ivas_fx( * first glottal impulse is NOT in the 1st subframe, * or two impulses are in the 1st subframe *------------------------------------------------------------*/ + ELSE { test(); @@ -1391,19 +1389,18 @@ void transition_enc_ivas_fx( test(); IF( !( ( *tc_subfr == 0 ) && ( EQ_16( i_subfr, L_SUBFR ) ) ) ) { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); } } ELSE { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); } - pit_Q_enc_ivas_fx( hBstr, 0, nBits, 8, pit_flag, limit_flag, *T0, *T0_frac, T0_min, T0_max ); - + pit_Q_enc_fx( hBstr, 0, nBits, 8, pit_flag, limit_flag, *T0, *T0_frac, T0_min, T0_max ); /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); offset = tbe_celp_exc_offset( *T0, *T0_frac, st_fx->L_frame ); @@ -1419,6 +1416,7 @@ void transition_enc_ivas_fx( * - LP filtering of the adaptive excitation (if non-zero) * - codebook target computation *-----------------------------------------------------------------*/ + IF( *Jopt_flag == 0 ) { /* adaptive/TC excitation is zero */ @@ -1439,10 +1437,8 @@ void transition_enc_ivas_fx( *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, ( Q_new + shift - 1 ) ); move16(); - Copy_Scale_sig( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ), 1 ); - lp_select = lp_filt_exc_enc_ivas_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx_q15, - xn_fx, y1_fx, xn2_fx, L_SUBFR, st_fx->L_frame, g_corr_fx, *clip_gain, gain_pit_fx, &lp_flag ); - + lp_select = lp_filt_exc_enc_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx, + xn_fx, y1_fx, xn2_fx, L_SUBFR, st_fx->L_frame, g_corr_fx, *clip_gain, gain_pit_fx, &lp_flag ); IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); @@ -1451,9 +1447,11 @@ void transition_enc_ivas_fx( **pt_pitch_fx = shl( add( shl( *T0, 2 ), *T0_frac ), 4 ); move16(); + /*---------------------------------------------------------------------* * fill the pitch buffer - needed for post-processing *---------------------------------------------------------------------*/ + test(); test(); test(); @@ -1574,9 +1572,9 @@ void transition_enc_ivas_fx( IF( EQ_16( nBits, 10 ) ) { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, limit_flag, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, st_fx->L_frame, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, limit_flag, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, st_fx->L_frame, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); - pit16k_Q_enc_ivas_fx( hBstr, nBits, limit_flag, *T0, *T0_frac, T0_min, T0_max ); + pit16k_Q_enc_fx( hBstr, nBits, limit_flag, *T0, *T0_frac, T0_min, T0_max ); } ELSE IF( EQ_16( nBits, 8 ) ) /* tc_subfr==0 && i_subfr==L_SUBFR */ { @@ -1585,7 +1583,8 @@ void transition_enc_ivas_fx( * PIT16k_MIN to PIT16k_FR2_TC0_2SUBFR-1 resolution 1/4 (frac = 0,1,2 or 3) * PIT16k_FR2_TC0_2SUBFR to 2*L_SUBFR resolution 1/2 (frac = 0 or 2) *-----------------------------------------------------------------------------*/ - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, limit_flag, PIT16k_FR2_TC0_2SUBFR, 2 * L_SUBFR, st_fx->L_frame, L_SUBFR ); + + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, limit_flag, PIT16k_FR2_TC0_2SUBFR, 2 * L_SUBFR, st_fx->L_frame, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); IF( GT_16( *T0_max, 2 * L_SUBFR ) ) @@ -1611,12 +1610,13 @@ void transition_enc_ivas_fx( ELSE IF( EQ_16( nBits, 6 ) ) { /* delta search */ - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, L_SUBFR, limit_flag, PIT16k_FR2_EXTEND_9b, PIT16k_FR1_EXTEND_9b, st_fx->L_frame, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, L_SUBFR, limit_flag, PIT16k_FR2_EXTEND_9b, PIT16k_FR1_EXTEND_9b, st_fx->L_frame, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); index = delta_pit_enc_fx( 4, *T0, *T0_frac, *T0_min ); push_indice( hBstr, IND_PITCH, index, nBits ); } + IF( EQ_16( nBits, 6 ) ) { limit_T0_fx( L_FRAME16k, 8, L_SUBFR, limit_flag, *T0, *T0_frac, T0_min, T0_max ); @@ -1655,7 +1655,7 @@ void transition_enc_ivas_fx( ELSE { /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); offset = L_deposit_l( 0 ); tmp = extract_l( L_mult( *T0_frac, 32 ) ); /*Q8, 0.25 in Q7*/ @@ -1676,9 +1676,8 @@ void transition_enc_ivas_fx( *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, Q_new ); move16(); - Copy_Scale_sig( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ), 1 ); - lp_select = lp_filt_exc_enc_ivas_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx_q15, - xn_fx, y1_fx, xn2_fx, L_SUBFR, st_fx->L_frame, g_corr_fx, *clip_gain, gain_pit_fx, &lp_flag ); + lp_select = lp_filt_exc_enc_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx, + xn_fx, y1_fx, xn2_fx, L_SUBFR, st_fx->L_frame, g_corr_fx, *clip_gain, gain_pit_fx, &lp_flag ); IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); @@ -1719,6 +1718,7 @@ void transition_enc_ivas_fx( return; } + /*-------------------------------------------------------------------------------------------* * tc_enc() * @@ -1758,10 +1758,8 @@ static void tc_enc_fx( Word16 pitch_index, pitch_sign_fx; Word32 gain_trans32; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif imp_pos = sub( *position, i_subfr ); FOR( i = 0; i < L_SUBFR; i++ ) { @@ -1789,17 +1787,17 @@ static void tc_enc_fx( { IF( EQ_16( nBits, 9 ) ) { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, 0, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, 0, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); } ELSE IF( EQ_16( nBits, 6 ) ) { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, 0, PIT_MIN, L_SUBFR, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, 0, PIT_MIN, L_SUBFR, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); } ELSE { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, 0, PIT_MAX, PIT_MIN, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, 0, PIT_MAX, PIT_MIN, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); } } @@ -1808,6 +1806,7 @@ static void tc_enc_fx( *T0 = L_SUBFR; move16(); } + test(); if ( EQ_16( *tc_subfr, L_SUBFR ) && LT_16( *T0, L_SUBFR ) ) { @@ -1819,13 +1818,13 @@ static void tc_enc_fx( { IF( EQ_16( nBits, 10 ) ) { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, 1, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, L_FRAME16k, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, 1, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, L_FRAME16k, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); } ELSE IF( EQ_16( nBits, 6 ) ) { /* T0_frac with 1/2 sample resolution */ - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, 0, PIT16k_MIN, L_SUBFR, L_FRAME16k, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, 0, 0, PIT16k_MIN, L_SUBFR, L_FRAME16k, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); IF( *T0 > L_SUBFR ) { @@ -1837,7 +1836,6 @@ static void tc_enc_fx( } } - /* set tc_subfr to TC_0_0 */ test(); test(); @@ -1862,6 +1860,7 @@ static void tc_enc_fx( /* set past excitation buffer to zeros */ set16_fx( exc_fx - L_EXC_MEM, 0, L_EXC_MEM ); + /*--------------------------------------------------------------* * adapt. search of the second impulse in the same subframe * (when appears) @@ -1879,6 +1878,7 @@ static void tc_enc_fx( interp_code_4over2_fx( &exc_fx[i_subfr], &bwe_exc_fx[i_subfr * 2], L_SUBFR ); } } + /*--------------------------------------------------------------* * compute glottal-shape codebook excitation *--------------------------------------------------------------*/ @@ -1889,9 +1889,11 @@ static void tc_enc_fx( /* gain_pit computation */ *gain_pit_fx = corr_xy1_fx( xn_fx, yy1_fx, g_corr_fx, L_SUBFR, 0, &Overflow ); move16(); + /*--------------------------------------------------------------* * Encode parameters and write indices *--------------------------------------------------------------*/ + IF( EQ_16( st_fx->L_frame, L_FRAME ) ) { test(); @@ -1902,7 +1904,7 @@ static void tc_enc_fx( /* write pitch index */ IF( ( GE_16( *T0, L_SUBFR ) ) && ( NE_16( *tc_subfr, 3 * L_SUBFR ) ) ) { - push_indice_fx( hBstr, IND_PITCH, 0, nBits ); + push_indice( hBstr, IND_PITCH, 0, nBits ); } ELSE IF( EQ_16( *tc_subfr, 3 * L_SUBFR ) ) { @@ -1914,7 +1916,7 @@ static void tc_enc_fx( { index = abs_pit_enc_fx( 2, 0, *T0, *T0_frac ); } - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); limit_T0_fx( L_FRAME, 8, 0, 0, *T0, 0, T0_min, T0_max ); } @@ -1923,12 +1925,12 @@ static void tc_enc_fx( IF( EQ_16( nBits, 6 ) ) { index = delta_pit_enc_fx( 2, *T0, *T0_frac, PIT_MIN - 1 ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); } ELSE { index = delta_pit_enc_fx( 0, *T0, *T0_frac, PIT_MIN - 1 ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); } } } @@ -1942,19 +1944,22 @@ static void tc_enc_fx( ELSE IF( EQ_16( nBits, 6 ) ) { index = add( shl( sub( *T0, PIT16k_MIN ), 1 ), shr( *T0_frac, 1 ) ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); } } - push_indice_fx( hBstr, IND_TC_IMP_SHAPE, imp_shape, 3 ); - push_indice_fx( hBstr, IND_TC_IMP_POS, imp_pos, 6 ); - push_indice_fx( hBstr, IND_TC_IMP_SIGN, pitch_sign_fx, 1 ); - push_indice_fx( hBstr, IND_TC_IMP_GAIN, pitch_index, 3 ); + + push_indice( hBstr, IND_TC_IMP_SHAPE, imp_shape, 3 ); + push_indice( hBstr, IND_TC_IMP_POS, imp_pos, 6 ); + push_indice( hBstr, IND_TC_IMP_SIGN, pitch_sign_fx, 1 ); + push_indice( hBstr, IND_TC_IMP_GAIN, pitch_index, 3 ); *position = add( imp_pos, i_subfr ); move16(); + return; } + static void tc_enc_ivas_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ const Word16 i_subfr, /* i : subrame index */ @@ -1980,10 +1985,8 @@ static void tc_enc_ivas_fx( Word16 pitch_index, pitch_sign_fx; Word32 gain_trans32; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif imp_pos = sub( *position, i_subfr ); /*-----------------------------------------------------------------* * get number of bits for pitch encoding @@ -2006,17 +2009,17 @@ static void tc_enc_ivas_fx( { IF( EQ_16( nBits, 9 ) ) { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1, *T0_min, *T0_max, T0_frac, 0, 0, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1, *T0_min, *T0_max, T0_frac, 0, 0, PIT_FR2_9b, PIT_FR1_9b, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); } ELSE IF( EQ_16( nBits, 6 ) ) { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1, *T0_min, *T0_max, T0_frac, 0, 0, PIT_MIN, L_SUBFR, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1, *T0_min, *T0_max, T0_frac, 0, 0, PIT_MIN, L_SUBFR, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); } ELSE { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1, *T0_min, *T0_max, T0_frac, 0, 0, PIT_MAX, PIT_MIN, L_FRAME, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1, *T0_min, *T0_max, T0_frac, 0, 0, PIT_MAX, PIT_MIN, L_FRAME, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); } } @@ -2025,6 +2028,7 @@ static void tc_enc_ivas_fx( *T0 = L_SUBFR; move16(); } + test(); if ( EQ_16( *tc_subfr, L_SUBFR ) && LT_16( *T0, L_SUBFR ) ) { @@ -2036,13 +2040,15 @@ static void tc_enc_ivas_fx( { IF( EQ_16( nBits, 10 ) ) { - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1, *T0_min, *T0_max, T0_frac, 0, 1, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, L_FRAME16k, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1, *T0_min, *T0_max, T0_frac, 0, 1, PIT16k_FR2_EXTEND_10b, PIT16k_MAX, L_FRAME16k, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); move16(); } ELSE IF( EQ_16( nBits, 6 ) ) { /* T0_frac with 1/2 sample resolution */ - *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1, *T0_min, *T0_max, T0_frac, 0, 0, PIT16k_MIN, L_SUBFR, L_FRAME16k, L_SUBFR ); + *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1, *T0_min, *T0_max, T0_frac, 0, 0, PIT16k_MIN, L_SUBFR, L_FRAME16k, L_SUBFR, 0 /*st_fx->element_mode*/, Q_new ); + move16(); + IF( *T0 > L_SUBFR ) { *T0 = L_SUBFR; @@ -2053,7 +2059,6 @@ static void tc_enc_ivas_fx( } } - /* set tc_subfr to TC_0_0 */ test(); test(); @@ -2078,12 +2083,14 @@ static void tc_enc_ivas_fx( /* set past excitation buffer to zeros */ set16_fx( exc_fx - L_EXC_MEM, 0, L_EXC_MEM ); + /*--------------------------------------------------------------* * adapt. search of the second impulse in the same subframe * (when appears) *--------------------------------------------------------------*/ pred_lt4_tc_fx( exc_fx, *T0, *T0_frac, inter4_2_fx, imp_pos, i_subfr ); + IF( st_fx->hBWE_TD != NULL ) { IF( EQ_16( st_fx->L_frame, L_FRAME ) ) @@ -2095,16 +2102,19 @@ static void tc_enc_ivas_fx( interp_code_4over2_fx( &exc_fx[i_subfr], &bwe_exc_fx[i_subfr * 2], L_SUBFR ); } } + /*--------------------------------------------------------------* * compute glottal-shape codebook excitation *--------------------------------------------------------------*/ - Copy_Scale_sig( h1, h1_fx, L_SUBFR + ( M + 1 ), 1 ); + + Copy( h1, h1_fx, L_SUBFR + ( M + 1 ) ); /* create filtered glottal codebook contribution */ conv_fx( &exc_fx[i_subfr], h1_fx, yy1_fx, L_SUBFR ); /* gain_pit computation */ *gain_pit_fx = corr_xy1_fx( xn_fx, yy1_fx, g_corr_fx, L_SUBFR, 0, &Overflow ); move16(); + /*--------------------------------------------------------------* * Encode parameters and write indices *--------------------------------------------------------------*/ @@ -2153,7 +2163,7 @@ static void tc_enc_ivas_fx( { IF( EQ_16( nBits, 10 ) ) { - pit16k_Q_enc_ivas_fx( hBstr, nBits, 1, *T0, *T0_frac, T0_min, T0_max ); + pit16k_Q_enc_fx( hBstr, nBits, 1, *T0, *T0_frac, T0_min, T0_max ); } ELSE IF( EQ_16( nBits, 6 ) ) { @@ -2179,6 +2189,7 @@ static void tc_enc_ivas_fx( * - Uses scalar quantization prototypes tbl_gain_trans_tc[N_GAIN_TC]. * - Gains the glottal codebook contibution signal. *-----------------------------------------------------------------*/ + static void gain_trans_enc_fx( Word32 gain_trans32, /* i : gain for mode Tc Q7 */ Word16 exc[], /* i/o: glottal codebook contribution i:Q13 o:Q_new*gain_trans */ @@ -2188,10 +2199,6 @@ static void gain_trans_enc_fx( ) { Word16 i, imax, istart, tmp16, gain_trans, gscale; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif istart = 0; move16(); @@ -2199,11 +2206,11 @@ static void gain_trans_enc_fx( move16(); gscale = 7; move16(); - gain_trans = extract_h( L_shl_o( gain_trans32, 16, &Overflow ) ); /* Q7 */ + gain_trans = extract_h( L_shl_sat( gain_trans32, 16 ) ); /* Q7 */ IF( GT_32( L_abs( gain_trans32 ), 29862L ) ) { - gain_trans = extract_h( L_shl_o( gain_trans32, 16 - 3, &Overflow ) ); /* Q4 */ + gain_trans = extract_h( L_shl_sat( gain_trans32, 16 - 3 ) ); /* Q4 */ istart = 4; move16(); imax = N_GAIN_TC - 1; @@ -2236,9 +2243,11 @@ static void gain_trans_enc_fx( FOR( i = 0; i < L_SUBFR; i++ ) { /*exc[i] *= (*gain_trans);*/ - exc[i] = round_fx_o( L_shl_o( L_mult( exc[i], gain_trans ), tmp16, &Overflow ), &Overflow ); + exc[i] = round_fx_sat( L_shl_sat( L_mult( exc[i], gain_trans ), tmp16 ) ); move16(); } + + return; } @@ -2247,6 +2256,7 @@ static void gain_trans_enc_fx( * * TC subframe determination *-----------------------------------------------------------------*/ + void tc_classif_enc_fx( const Word16 Q_new, /* i : scaling factor */ const Word16 L_frame, /* i : length of the frame */ @@ -2259,10 +2269,6 @@ void tc_classif_enc_fx( { Word32 temp; Word16 T_op, i; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif T_op = pitch; move16(); @@ -2337,7 +2343,7 @@ void tc_classif_enc_fx( L_sum = L_mac_sat( 1L, res[0], res[0] ); FOR( i = 1; i < len; i++ ) { - L_sum = L_mac0_o( L_sum, res[i], res[i], &Overflow ); + L_sum = L_mac0_sat( L_sum, res[i], res[i] ); } aver = L_sum; /*Q = 2*Q_new */ move32(); @@ -2350,8 +2356,8 @@ void tc_classif_enc_fx( L_temp1 = Mult_32_16( temp, 8192 ); /* Q=31-exp */ test(); - IF( GT_32( temp2, L_shl_o( L_temp2, ( 31 - exp2 ) - ( 31 - exp ), &Overflow ) ) && - LT_32( aver, L_shl_o( L_temp1, ( 31 - exp_aver ) - ( 31 - exp ), &Overflow ) ) ) + IF( GT_32( temp2, L_shl_sat( L_temp2, ( 31 - exp2 ) - ( 31 - exp ) ) ) && + LT_32( aver, L_shl_sat( L_temp1, ( 31 - exp_aver ) - ( 31 - exp ) ) ) ) { *position = position_tmp; move16(); diff --git a/lib_enc/update_decision_fx.c b/lib_enc/update_decision_fx.c index 315adcf819d9061691879a2b3c4c3f4752bdba94..67476f993d40d0b86101138e67942b60fcb152df 100644 --- a/lib_enc/update_decision_fx.c +++ b/lib_enc/update_decision_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ diff --git a/lib_enc/updt_enc_fx.c b/lib_enc/updt_enc_fx.c index fb2a6215b4509732b14ab9dcada955c97c4b8e3d..62af228a0c75fac8ba24e23c64a406ec0c29b2d5 100644 --- a/lib_enc/updt_enc_fx.c +++ b/lib_enc/updt_enc_fx.c @@ -1,11 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -204,20 +203,6 @@ void updt_IO_switch_enc_fx( set16_fx( hBWE_TD->old_speech_wb_fx, 0, ( L_LOOK_12k8 + L_SUBFR ) * 5 / 16 ); set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 ); set16_fx( hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); -#ifdef IVAS_CODE - set16_fx( st->hBWE_TD->mem_shb_res, 0, MAX_LEN_MA_FILTER ); - set16_fx( st->hBWE_TD->old_EnvSHBres, 0, L_FRAME4k ); - st->hBWE_TD->old_mean_EnvSHBres = 0; - st->hBWE_TD->prev_enr_EnvSHBres = 32767; - st->hBWE_TD->prev_pow_exc16kWhtnd = 32767; - st->hBWE_TD->prev_mix_factor = 32767; - st->hBWE_TD->prev_Env_error = 0; - move16(); - move16(); - move16(); - move16(); - move16(); -#endif hBWE_TD->bwe_non_lin_prev_scale_fx = 0; move16(); set16_fx( hBWE_TD->decim_state1_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); @@ -251,23 +236,6 @@ void updt_IO_switch_enc_fx( st->use_acelp_preq = 0; move16(); -#ifdef IVAS_CODE - set16_fx( st->hSpMusClas->finc_prev, 0, ATT_NSEG ); - set16_fx( st->hSpMusClas->tod_lt_Bin_E, 0, TOD_NSPEC ); - set16_fx( st->hSpMusClas->tod_S_map_lt, 0, TOD_NSPEC ); - st->hSpMusClas->lt_finc = 0; - st->hSpMusClas->last_strong_attack = 0; - st->hSpMusClas->tod_thr_lt = TOD_THR_MASS; - st->hSpMusClas->tod_weight = 0; - st->hSpMusClas->tod_S_mass_prev = TOD_THR_MASS; - st->hSpMusClas->tod_S_mass_lt = TOD_THR_MASS; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); -#endif } ELSE /* switching to AMR-WB IO mode */ { @@ -298,7 +266,7 @@ void updt_IO_switch_enc_fx( hSC_VBR->nelp_mode = 0; move16(); } - st->hGSCEnc->seed_tcx = 15687; /* the re-init here was present only in float _DIFF_FLOAT_FIX_*/ + st->hGSCEnc->seed_tcx = 15687; move16(); } @@ -362,7 +330,14 @@ void updt_enc_common_fx( move16(); st->last_bwidth = st->bwidth; move16(); - st->hNoiseEst->Etot_last_fx = Etot; + IF( GT_16( st->element_mode, EVS_MONO ) ) + { + st->hNoiseEst->Etot_last_32fx = L_deposit_h( Etot ); + } + ELSE + { + st->hNoiseEst->Etot_last_fx = Etot; + } move16(); st->last_coder_type_raw = st->coder_type_raw; move16(); @@ -474,7 +449,7 @@ void updt_enc_common_fx( st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, 0 ); move32(); - // st->L_frame = extract_l(Mult_32_16(st->sr_core, 0x0290)); /*(int16_t)(st->sr_core / FRAMES_PER_SEC);*/ + // st->L_frame = extract_l(Mult_32_16(st->sr_core, INV_FRAME_PER_SEC_Q15)); /*(int16_t)(st->sr_core / FRAMES_PER_SEC);*/ IF( EQ_32( st->sr_core, INT_FS_12k8 ) ) { @@ -699,10 +674,7 @@ void updt_enc_common_ivas_fx( st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, 0 ); move16(); - Word16 exp; - st->L_frame = BASOP_Util_Divide3232_Scale( st->sr_core, FRAMES_PER_SEC, &exp ); - move16(); - st->L_frame = shr( st->L_frame, sub( 15, exp ) ); + st->L_frame = extract_l( Mpy_32_32_r( st->sr_core, ONE_BY_FRAMES_PER_SEC_Q31 ) ); move16(); IF( EQ_32( st->sr_core, INT_FS_12k8 ) ) diff --git a/lib_enc/updt_tar_fx.c b/lib_enc/updt_tar_fx.c index 9d6b5d2d6751c852216a6801f7aa9d4af97801d2..b379f24ef12bf213da0b25001f10d716d6a2c5f9 100644 --- a/lib_enc/updt_tar_fx.c +++ b/lib_enc/updt_tar_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* Compilation switches */ @@ -23,10 +23,8 @@ void updt_tar_fx( { Word16 i; Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif FOR( i = 0; i < L; i++ ) @@ -55,10 +53,8 @@ void updt_tar_HR_fx( { Word16 i; Word32 L_tmp, L_tmp1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); -#endif FOR( i = 0; i < L; i++ ) { diff --git a/lib_enc/vad_basop.h b/lib_enc/vad_basop.h index 2437317849895d206e5b0fc7e6a42cec5f568a22..f6a0fed342357d0b1fe10f1d654305ddd85a607d 100644 --- a/lib_enc/vad_basop.h +++ b/lib_enc/vad_basop.h @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef __VAD_BASOP_H__ diff --git a/lib_enc/vad_basop_fx.c b/lib_enc/vad_basop_fx.c index d6d0783105621e70b314ab8a971be27bd4d60434..3436a1d681e79b4d9822da261aa0f76414c293e3 100644 --- a/lib_enc/vad_basop_fx.c +++ b/lib_enc/vad_basop_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_enc/vad_fx.c b/lib_enc/vad_fx.c index 1fdcb94fac335e5852dc782acc3a47dd2c9705c3..4335225cac66e2b1e65e986785a76cbebd14ab0e 100644 --- a/lib_enc/vad_fx.c +++ b/lib_enc/vad_fx.c @@ -1,10 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include "options.h" #include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ #include "rom_enc.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -75,9 +75,10 @@ /* snr_sum = "scale" * (float)log10( L_snr_sum ) ;*/ -static Word16 vad_snr_log_fx( /* o: Q8 */ - Word32 L_snr, /* i: Q4 */ - Word16 scale /* i: scale Q13 , 10.0*log10(2) or 1.0*log10(2) */ +/* o: Q8 */ +static Word16 vad_snr_log_fx( + Word32 L_snr, /* i: Q4 */ + Word16 scale /* i: scale Q13 , 10.0*log10(2) or 1.0*log10(2) */ ) { Word16 e_snr, f_snr; @@ -91,57 +92,20 @@ static Word16 vad_snr_log_fx( /* o: Q8 */ } -void wb_vad_init_fx( - VAD_HANDLE hVAD /* i/o: VAD data handle */ -) -{ - hVAD->hangover_cnt = 0; - move16(); /* Hangover counter initialized to 0 */ - hVAD->nb_active_frames = ACTIVE_FRAMES_FX; - move16(); /* The counter of SPEECH frames necessary to trigger HO */ - /* is set to max (-> start with hangover) */ - - hVAD->vad_flag_reg_H = L_deposit_l( 0 ); - move32(); - hVAD->vad_flag_reg_L = L_deposit_l( 0 ); - move32(); - hVAD->vad_prim_reg = L_deposit_l( 0 ); - move32(); - hVAD->vad_flag_cnt_50 = 0; - move16(); - hVAD->vad_prim_cnt_16 = 0; - move16(); - - hVAD->hangover_cnt_dtx = HANGOVER_LONG_FX; - move16(); /* hangover for DTX */ - hVAD->hangover_cnt_music = HANGOVER_LONG_MUSIC_FX; - move16(); /* hangover for MUSIC DTX */ - - hVAD->hangover_cnt_he = 0; - move16(); /* Hangover counter initialized to 0 */ - hVAD->nb_active_frames_he = ACTIVE_FRAMES_FX; - move16(); /* The counter of SPEECH frames necessary to trigger HO */ - hVAD->bcg_flux_fx = 1120; - move16(); /*70 in Q4 */ - hVAD->soft_hangover = 0; - move16(); - hVAD->voiced_burst = 0; - move16(); - hVAD->bcg_flux_init = 50; - move16(); - hVAD->nb_active_frames_he1 = ACTIVE_FRAMES_FX; - move16(); - hVAD->hangover_cnt_he1 = 0; - move16(); - return; -} +/*-----------------------------------------------------------------* + * wb_vad_init_fx() + * + * + *-----------------------------------------------------------------*/ -void wb_vad_init_ivas_fx( +void wb_vad_init_fx( VAD_HANDLE hVAD /* i/o: VAD data handle */ ) { hVAD->L_snr_sum_vad_fx = 0; move32(); + hVAD->q_L_snr_sum_vad = Q31; + move16(); hVAD->hangover_cnt = 0; move16(); /* Hangover counter initialized to 0 */ hVAD->nb_active_frames = ACTIVE_FRAMES_FX; @@ -213,6 +177,30 @@ void wb_vad_init_ivas_fx( * * accumulate snr_sum with significance thresholds *-----------------------------------------------------------------*/ +static void sign_thr_snr_acc_ivas_fx( + Word32 *L_snr_sum, /* o: q_snr_sum */ + Word16 *q_snr_sum, + Word32 L_snr, /* i: q_snr */ + Word16 q_snr, + Word32 sign_thr, /* i: q_snr */ + Word32 min_snr /* i: q_snr */ +) +{ + /*if( snr >= sign_thr ) */ + Word32 L_tmp; + Word16 exp_snr_sum = sub( 31, *q_snr_sum ); + L_tmp = min_snr; + move32(); + IF( GE_32( L_snr, sign_thr ) ) + { + L_tmp = L_add( L_snr, 0 ); /* q_snr */ + } + *L_snr_sum = BASOP_Util_Add_Mant32Exp( *L_snr_sum, exp_snr_sum, L_tmp, sub( 31, q_snr ), &exp_snr_sum ); /* q_snr */ + *q_snr_sum = sub( 31, exp_snr_sum ); + move32(); + move32(); +} + static void sign_thr_snr_acc_fx( Word32 *L_snr_sum, /* o: Q4 */ Word32 L_snr, /* i: Q4 */ @@ -222,18 +210,15 @@ static void sign_thr_snr_acc_fx( { /*if( snr >= sign_thr ) */ Word32 L_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif L_tmp = L_deposit_l( min_snr ); IF( GE_32( L_snr, L_deposit_l( sign_thr ) ) ) { L_tmp = L_add( L_snr, 0 ); /* Q4 */ } - BASOP_SATURATE_WARNING_OFF_EVS /* may saturate in BASOP */ - *L_snr_sum = L_add_o( *L_snr_sum, L_tmp, &Overflow ); /* Q4 */ + BASOP_SATURATE_WARNING_OFF_EVS /* may saturate in BASOP */ + *L_snr_sum = L_add_sat( *L_snr_sum, L_tmp ); + /* Q4 */ move32(); BASOP_SATURATE_WARNING_ON_EVS } @@ -647,15 +632,15 @@ Word16 ivas_dtx_hangover_addition_fx( *-----------------------------------------------------------------*/ /* new simplified and harmonized code */ Word16 wb_vad_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word32 fr_bands[], /* i : per band input energy (contains 2 vectors) Q_new+QSCALE*/ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word32 fr_bands[], /* i : per band input energy (contains 2 vectors) Q_new+QSCALE*/ Word16 *noisy_speech_HO, /* o : SC-VBR noisy speech HO flag */ Word16 *clean_speech_HO, /* o : SC-VBR clean speech HO flag */ Word16 *NB_speech_HO, /* o : SC-VBR NB speech HO flag */ Word16 *snr_sum_he, /* o : Output snr_sum as weighted spectral measure*/ Word16 *localVAD_HE_SAD, Word16 *flag_noisy_speech_snr, /* o : */ - const Word16 Q_new, /* i : scaling factor Q0 */ + const Word16 Q_new, /* i : scaling factor Q0 */ VAD_HANDLE hVAD, /* i/o: VAD data handle */ NOISE_EST_HANDLE hNoiseEst, /* i : Noise estimation handle */ Word16 lp_speech_fx, /* i : long term active speech energy average Q8 */ @@ -709,10 +694,6 @@ Word16 wb_vad_fx( Word32 L_accum_ener_H; Word16 vad_bwidth_fx; Word16 last_7k2_coder_type; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif if ( hNoiseEst == NULL ) { @@ -764,16 +745,8 @@ Word16 wb_vad_fx( st_fx->max_band = 19; move16(); } - /*_DIFF_FLOAT_FIX_ -> see around Ln1570, inversion in if conditions compared to float*/ - // PMT("Error in EVS fixed point ?") - /*FIXED EVS */ - /* ELSE IF(((LE_16(st_fx->last_coder_type, UNVOICED)) && (LT_32(L_snr_outlier, MAX_SNR_OUTLIER_2_FX)) && (st_fx->Opt_SC_VBR != 0)) || - ((LE_16(last_7k2_coder_type, UNVOICED)) && (LT_32(L_snr_outlier, MAX_SNR_OUTLIER_2_FX)) && (st_fx->Opt_SC_VBR == 0)))*/ - /*FLOAT both IVAS and EVS */ - /*if ((snr_outlier_index <= 4 && (st->last_coder_type > UNVOICED) && !st->Opt_SC_VBR) || - (snr_outlier_index <= 4 && (last_7k2_coder_type > UNVOICED) && st->Opt_SC_VBR))*/ - IF( 1 ) // st_fx->Opt_SC_VBR) + IF( 1 ) // st_fx->Opt_SC_VBR ) /* this keep 26.444 BE */ { last_7k2_coder_type = st_fx->hSC_VBR->last_7k2_coder_type; move16(); @@ -989,7 +962,7 @@ Word16 wb_vad_fx( m_num = shr( m_num, 1 ); shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); snr_tmp = div_s( m_num, m_noise_local ); - L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ + L_snr = L_shr_sat( snr_tmp, shift_snr ); /* L_snr in Q4 */ } ELSE { @@ -1022,7 +995,7 @@ Word16 wb_vad_fx( shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); snr_tmp = div_s( m_num, m_noise_local ); - L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ + L_snr = L_shr_sat( snr_tmp, shift_snr ); /* L_snr in Q4 */ } ELSE { @@ -1054,22 +1027,22 @@ Word16 wb_vad_fx( snr_sumt = add( snr_sumt, shr( snr, 4 ) ); /*Q4 */ - tmp = shl_o( snr, 5, &Overflow ); /* Q8 -> Q13 */ + tmp = shl_sat( snr, 5 ); /* Q8 -> Q13 */ IF( LT_16( i, 2 ) ) { - tmp = add_o( tmp, delta1, &Overflow ); /*Q13 */ + tmp = add_sat( tmp, delta1 ); /*Q13 */ } ELSE IF( LT_16( i, 7 ) ) { - tmp = add_o( tmp, delta2, &Overflow ); /*Q13 */ + tmp = add_sat( tmp, delta2 ); /*Q13 */ } ELSE IF( LT_16( i, 18 ) ) { - tmp = add_o( tmp, delta3, &Overflow ); /*Q13 */ + tmp = add_sat( tmp, delta3 ); /*Q13 */ } ELSE { - tmp = add_o( tmp, delta4, &Overflow ); /*Q13 */ + tmp = add_sat( tmp, delta4 ); /*Q13 */ } tmp1 = tmp; @@ -1077,7 +1050,7 @@ Word16 wb_vad_fx( sub( 0, 0 ); if ( LT_16( i, 7 ) ) { - tmp1 = add_o( tmp, 3277, &Overflow ); /*.4 in Q13 ftmp1 = ftmp + 0.4f; */ + tmp1 = add_sat( tmp, 3277 ); /*.4 in Q13 ftmp1 = ftmp + 0.4f; */ } tmp = s_min( tmp, 16384 ); /* Q13, ftmp = min(ftmp, 2.0f); */ @@ -1123,7 +1096,7 @@ Word16 wb_vad_fx( shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); snr_tmp = div_s( m_num, m_noise_local ); - L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ + L_snr = L_shr_sat( snr_tmp, shift_snr ); /* L_snr in Q4 */ } ELSE { @@ -1161,11 +1134,11 @@ Word16 wb_vad_fx( /* accumulate background noise energy in bands [0-2] and in bands [3-19]*/ IF( LT_16( i, 3 ) ) { - L_accum_ener_L = L_add_o( L_accum_ener_L, hNoiseEst->bckr_fx[i], &Overflow ); /*Q_new+QSCALE */ + L_accum_ener_L = L_add_sat( L_accum_ener_L, hNoiseEst->bckr_fx[i] ); /*Q_new+QSCALE */ } ELSE { - L_accum_ener_H = L_add_o( L_accum_ener_H, hNoiseEst->bckr_fx[i], &Overflow ); /*Q_new+QSCALE */ + L_accum_ener_H = L_add_sat( L_accum_ener_H, hNoiseEst->bckr_fx[i] ); /*Q_new+QSCALE */ } /* Identify the outlier band */ @@ -1259,7 +1232,7 @@ Word16 wb_vad_fx( } } /*st_fx->snr_sum_vad_fx = 0.5f * st->snr_sum_vad + 0.5f * snr_sum_ol;*/ - hVAD->L_snr_sum_vad_fx = L_shr( L_add_o( hVAD->L_snr_sum_vad_fx, L_snr_sum_ol, &Overflow ), 1 ); /*Q4*/ + hVAD->L_snr_sum_vad_fx = L_shr( L_add_sat( hVAD->L_snr_sum_vad_fx, L_snr_sum_ol ), 1 ); /*Q4*/ move32(); /* snr_sum_ol = 10.0f * (float)log10( snr_sum_ol ); */ @@ -1346,7 +1319,7 @@ Word16 wb_vad_fx( test(); test(); test(); - test(); /*_DIFF_FLOAT_FIX_ -> the conditions around Opt_SC_VBR_fx are invertered compared to float + test(); /*_DIFF_FLOAT_FIX_EVS -> the conditions around Opt_SC_VBR_fx are invertered compared to float ### st_fx->Opt_SC_VBR!=0 vs !st_fx->Opt_SC_VBR #####*/ // test(); IF( LE_16( snr_outlier_index, 4 ) && ( ( GT_16( st_fx->last_coder_type, UNVOICED ) && ( st_fx->Opt_SC_VBR != 0 ) ) || @@ -1373,7 +1346,7 @@ Word16 wb_vad_fx( thr1_ol = thr1; move16(); L_tmp2 = Msub_32_16( (Word32) 614, L_snr_outlier, 20972 ); /* .6*1024= */ /* 0.6 Q26(Q10 in high word) - Q4*Q21+1 */ - tmp2 = round_fx( L_shl_o( L_tmp2, 14, &Overflow ) ); /* Q10(high word)+ 14 -16 --> Q8*/ + tmp2 = round_fx( L_shl_sat( L_tmp2, 14 ) ); /* Q10(high word)+ 14 -16 --> Q8*/ IF( L_tmp2 > 0 ) { thr1_ol = add( thr1_ol, tmp2 ); /* Q24 >>16 + Q8 */ @@ -1749,7 +1722,7 @@ Word16 wb_vad_fx( /* *flag_noisy_speech_snr is a Word8 parameter */ - *flag_noisy_speech_snr = 0; /*_DIFF_FLOAT_FIX_ -> this initialisation is not done here in float */ + *flag_noisy_speech_snr = 0; /*_DIFF_FLOAT_FIX_IVAS -> this initialisation is not done here in float */ move16(); IF( vad_bwidth_fx != NB ) { @@ -1879,8 +1852,8 @@ Word16 wb_vad_fx( } Word16 wb_vad_ivas_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word32 fr_bands[], /* i : per band i energy (contains 2 vectors) Qx + QSCALE */ + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word32 fr_bands[], /* i : per band i energy (contains 2 vectors) Qx + QSCALE */ const Word16 q_fr_bands, /* i : Q of fr_bands */ Word16 *noisy_speech_HO, /* o : SC-VBR noisy speech HO flag */ Word16 *clean_speech_HO, /* o : SC-VBR clean speech HO flag */ @@ -1895,7 +1868,8 @@ Word16 wb_vad_ivas_fx( ) { Word16 i, flag = 0, hangover_short; - Word16 snr_sum, thr1 = 0, thr1_nb_mod, thr2 = 0, nk = 0, nc = 0, th_clean = 0; + Word16 snr_sum, thr1 = 0, thr1_nb_mod, thr2 = 0, nk = 0, th_clean = 0; + Word32 nc; Word16 lp_snr; /* Q8 */ const Word32 *pt1; const Word32 *pt2; @@ -1904,8 +1878,8 @@ Word16 wb_vad_ivas_fx( Word16 min_snr, sign_thr; Word32 L_snr, L_snr_sum; - Word32 ftmp, ftmp1, ftmp2; - Word16 m_noise_local, e_noise, e_num, m_num, snr_tmp, shift_snr, q_snr_tmp, q_snr; + Word32 ener, fr_enr, ftmp, ftmp1; + Word16 m_noise_local, e_noise, e_num, m_num, q_snr_tmp, q_snr; Word32 L_snr_tmp; Word16 snr_sumt; Word32 L_vad_thr; @@ -1924,7 +1898,7 @@ Word16 wb_vad_ivas_fx( Word16 nb_sig_snr; /* Q0 */ Word16 nv; - Word16 nv_ofs; /* Q8 */ + Word32 nv_ofs; /* Q24 */ Word32 L_snr_sum_HE_SAD; /* Q4 */ Word16 snr_sum_HE_SAD; /*Q8 log */ Word16 sign_thr_HE_SAD, min_snr_HE_SAD; @@ -1934,17 +1908,14 @@ Word16 wb_vad_ivas_fx( Word32 L_snr_sum_ol; Word16 snr_sum_ol; /* Q8 log */ - Word32 L_snr_outlier; + Word32 L_snr_outlier, L_snr_outlier_Q4; Word16 snr_outlier_index; Word32 L_accum_ener_L; Word32 L_accum_ener_H; Word16 vad_bwidth_fx; Word16 last_7k2_coder_type; - Word16 q_shift; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + Word16 q_shift, q_ener, q_diff1, q_diff2; + Word16 q_L_snr_sum_ol, e_snr, f_snr; Word16 L_msnr_e = 0, L_mssnr_e = 0, L_mssnr_hov_e = 0, L_msnr18_e = 0, L_msnr19_e = 0; move16(); /*L_msnr_e*/ move16(); /*L_mssnr_e*/ @@ -1955,7 +1926,7 @@ Word16 wb_vad_ivas_fx( move16(); /*thr1*/ move16(); /*thr2*/ move16(); /*nk*/ - move16(); /*nc*/ + move32(); /*nc*/ move16(); /*th_clean*/ move16(); /*flag*/ @@ -1970,13 +1941,13 @@ Word16 wb_vad_ivas_fx( } if ( LT_16( lp_speech_fx, -100 * 256 ) ) { - lp_speech_fx = st_fx->lp_speech_fx; /*Q8*/ + lp_speech_fx = extract_h( st_fx->lp_speech_32fx ); /*Q8*/ move16(); } if ( LT_16( lp_noise_fx, -100 * 256 ) ) { - lp_noise_fx = st_fx->lp_noise_fx; /*Q8*/ + lp_noise_fx = extract_h( st_fx->lp_noise_32fx ); /*Q8*/ move16(); } @@ -2028,12 +1999,12 @@ Word16 wb_vad_ivas_fx( { nk = 3277; move16(); /*0.1 Q15 */ - nc = 4122; - move16(); /*16.1 Q8 */ - nv = 525; - move16(); /* 2.05 Q8*/ - nv_ofs = 422; - move16(); /* 1.65 Q8*/ + nc = 270113178; + move32(); /*16.1 Q24 */ + nv = 8397; + move16(); /* 2.05 Q12*/ + nv_ofs = 27682406; + move32(); /* 1.65 Q24*/ th_clean = TH16_2_FX; move16(); /* 35 Q8 */ sign_thr = 21; @@ -2062,12 +2033,12 @@ Word16 wb_vad_ivas_fx( // move16(); nk = 3277; move16(); /* 0.1 Q15 */ - nc = 4096; - move16(); /* 16.0 Q8 */ - nv = 1024; - move16(); /* 4.0 Q8 */ - nv_ofs = 294; - move16(); /*1.15 Q8*/ + nc = 268435456; + move32(); /* 16.0 Q24 */ + nv = 16384; + move16(); /* 4.0 Q12 */ + nv_ofs = 19293798; + move32(); /*1.15 Q24*/ th_clean = TH8_1_FX; move16(); /*20 Q8 */ sign_thr = 28; @@ -2180,12 +2151,12 @@ Word16 wb_vad_ivas_fx( nb_sig_snr = 20; move16(); - pt1 = fr_bands; - pt2 = fr_bands + NB_BANDS; - pt3 = hNoiseEst->bckr_fx; - L_snr_sum = L_deposit_l( 0 ); L_snr_sum_HE_SAD = L_deposit_l( 0 ); + Word16 q_snr_sum = 0; + Word16 q_snr_sum_HE_SAD = 0; + move16(); + move16(); snr_sumt = 0; move16(); L_mssnr_hov = L_deposit_l( 0 ); @@ -2199,81 +2170,89 @@ Word16 wb_vad_ivas_fx( q_snr = 0; move16(); move16(); - q_shift = add( sub( q_fr_bands, hNoiseEst->q_bckr ), 15 - 4 ); + + pt1 = fr_bands; + pt2 = fr_bands + NB_BANDS; + pt3 = hNoiseEst->bckr_fx; + + q_ener = s_min( q_fr_bands, hNoiseEst->q_enrO ); + q_diff1 = sub( q_ener, hNoiseEst->q_enrO ); + q_diff2 = sub( q_ener, q_fr_bands ); + q_shift = add( Q31 + Q1, sub( q_ener, hNoiseEst->q_bckr ) ); + FOR( i = st_fx->min_band; i <= st_fx->max_band; i++ ) { - ftmp = L_add( *pt1++, 0 ); - ftmp1 = L_add( *pt2++, 0 ); - ftmp2 = L_add( *pt3++, 0 ); + ener = L_shl( hNoiseEst->enrO_fx[i], q_diff1 ); // q_ener + ftmp = L_shl( *pt1++, q_diff2 ); // q_ener + ftmp1 = L_shl( *pt2++, q_diff2 ); // q_ener /*fr_enr = ( 0.2f * st->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 );*/ - L_tmp = Mult_32_16( hNoiseEst->enrO_fx[i], 13107 ); /* L_tmp(high word) = Qenr0fx*Q16+1 -16 -> Qener0+1 */ - L_tmp1 = Madd_32_16( L_tmp, ftmp, 26214 ); /* 26214 = .4 in Q16 */ - L_tmp1 = Madd_32_16( L_tmp1, ftmp1, 26214 ); /* L_tmp1 re_used a bit later for final snr[i]*/ - - L_tmp2 = Madd_32_16( L_tmp, ftmp, 19661 ); /* 19661 = 0.3 in Q16 */ - L_tmp2 = Msub_32_16( L_tmp2, ftmp1, -32768 ); /* -32768= -0.5 in Q16 */ + L_tmp = Mpy_32_16_1( ener, 13107 /* 0.2 in Q16 */ ); // q_ener+1 + fr_enr = Madd_32_16( Madd_32_16( L_tmp, ftmp, 26214 /* 0.4 in Q16 */ ), ftmp1, 26214 /* 0.4 in Q16 */ ); // q_ener+1 IF( GT_32( ftmp, ftmp1 ) ) { - /*snr[i] = ( 0.2f * st->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 ) / ftmp2 ;*/ - /*snr[i] = L_tmp1/(ftmp2) */ - IF( ftmp2 != 0 ) + /* snr[i] = ( 0.2f * hNoiseEst->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 ) / *pt3++; */ + IF( *pt3 != 0 ) { - e_num = norm_l( L_tmp1 ); - m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+1+e_num-16 - - e_noise = norm_l( ftmp2 ); - m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 + /* Since fr_enr = 0.2f * hNoiseEst->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 */ + e_num = sub( norm_l( fr_enr ), 1 ); + m_num = extract_h( L_shl( fr_enr, e_num ) ); // q_ener+1+e_num-16 - m_num = shr( m_num, 1 ); // q_fr_bands+e_num-16 - shift_snr = add( sub( e_num, e_noise ), q_shift ); + e_noise = norm_l( *pt3 ); + m_noise_local = extract_h( L_shl( *pt3++, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 - snr_tmp = div_s( m_num, m_noise_local ); // q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise - L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ + L_snr = L_deposit_h( div_s( m_num, m_noise_local ) ); // 31+(q_ener+1+e_num-16)-(hNoiseEst->q_bckr+e_noise-16) + q_snr_tmp = add( q_shift, sub( e_num, e_noise ) ); } ELSE { - L_snr = L_shr_o( L_tmp1, sub( Q3, q_fr_bands ), &Overflow ); // q_fr_bands+1 -> Q4 + L_snr = Mpy_32_16_1( fr_enr, 18286 /* (1/E_MIN) in Q6 */ ); // q_ener+1+6-15 + q_snr_tmp = sub( q_ener, 8 ); } } ELSE { - /*snr[i] = ( 0.2f * st->enrO[i] + 0.3f * ftmp + 0.5f * ftmp1 ) / ftmp2 ;*/ - /*snr[i] =L_tmp2/( ftmp2 ) */ - IF( ftmp2 != 0 ) - { - e_num = norm_l( L_tmp2 ); - m_num = extract_h( L_shl( L_tmp2, e_num ) ); // q_fr_bands+1+e_num-16 + /* snr[i] = ( 0.2f * hNoiseEst->enrO[i] + 0.3f * ftmp + 0.5f * ftmp1 ) / *pt3++; */ + /* Since, L_tmp = 0.2f * hNoiseEst->enrO[i] */ + L_tmp = Msub_32_16( Madd_32_16( L_tmp, ftmp, 19661 /* 0.3 in Q16 */ ), ftmp1, -32768 /* -0.5 in Q16 */ ); // q_ener+1 - e_noise = norm_l( ftmp2 ); - m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 + IF( *pt3 != 0 ) + { + e_num = sub( norm_l( L_tmp ), 1 ); + m_num = extract_h( L_shl( L_tmp, e_num ) ); // q_ener+1+e_num-16 - m_num = shr( m_num, 1 ); // q_fr_bands+e_num-16 - shift_snr = add( sub( e_num, e_noise ), q_shift ); + e_noise = norm_l( *pt3 ); + m_noise_local = extract_h( L_shl( *pt3++, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 - snr_tmp = div_s( m_num, m_noise_local ); // q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise - L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ + L_snr = L_deposit_h( div_s( m_num, m_noise_local ) ); // 31+(q_ener+1+e_num-16)-(hNoiseEst->q_bckr+e_noise-16) + q_snr_tmp = add( q_shift, sub( e_num, e_noise ) ); } ELSE { - L_snr = L_shr_o( L_tmp2, sub( Q3, q_fr_bands ), &Overflow ); // q_fr_bands+1 -> Q4 + L_snr = Mpy_32_16_1( L_tmp, 18286 /* (1/E_MIN) in Q6 */ ); // q_ener+1+6-15 + q_snr_tmp = sub( q_ener, 8 ); } } - IF( LT_32( L_snr, 2 * ( 1 << 4 ) ) ) + if ( LT_32( L_snr, L_shl_sat( 2, q_snr_tmp ) ) ) { nb_sig_snr = sub( nb_sig_snr, 1 ); /* nb_sig_snr--; */ } - L_snr = L_max( L_snr, 1 * ( 1 << 4 ) ); /* if ( snr[i] < 1 ){snr[i] = 1;}*/ - + IF( LT_32( L_snr, L_shl_sat( 1, q_snr_tmp ) ) ) + { + L_snr = ONE_IN_Q30; + q_snr_tmp = Q30; + move32(); + move16(); + } /* snr[i] = (float)log10(snr[i]); */ Word16 exp = norm_l( L_snr ); Word16 val = Log2_norm_lc( L_shl( L_snr, exp ) ); - exp = sub( sub( 30, exp ), Q4 ); - L_snr = L_mac( L_deposit_h( exp ), val, 1 ); // Q16 - L_snr = Mpy_32_16_1( L_snr, 9864 /* log2 in Q15 */ ); // Q16 + exp = sub( sub( 30, exp ), q_snr_tmp ); + L_snr = L_mac( val, exp, ONE_IN_Q14 ); // Q15 + L_snr = Mpy_32_16_1( L_snr, 19728 /* log2 in Q16 */ ); // Q16 /* snr_sumt += snr[i];*/ L_snr_sumt = L_add( L_snr_sumt, L_snr ); // Q16 @@ -2334,10 +2313,10 @@ Word16 wb_vad_ivas_fx( } norm_tmp = norm_l( ftmp1 ); - scaled_tmp = L_shl( ftmp1, norm_tmp ); /*13+norm_tmp*/ + scaled_tmp = L_shl( ftmp1, norm_tmp ); /*16+norm_tmp*/ L_msnr = scaled_tmp; move32(); - L_msnr_e = sub( 18, norm_tmp ); + L_msnr_e = sub( 15, norm_tmp ); FOR( j = 1; j < stmp; j++ ) { L_msnr = Mult_32_32( L_msnr, scaled_tmp ); /*L_msnr_e msnr *= ftmp1;*/ @@ -2346,29 +2325,35 @@ Word16 wb_vad_ivas_fx( L_mssnr_hov = BASOP_Util_Add_Mant32Exp( L_mssnr_hov, L_mssnr_hov_e, L_msnr, L_msnr_e, &L_mssnr_hov_e ); /*L_mssnr_hov_e mssnr_hov += msnr; */ /* recompute after he1 modifications */ - /* snr[i] = fr_enr / st->bckr[i] = L_tmp1/st->bckr[i];*/ + /* snr[i] = fr_enr / st->bckr[i] ;*/ IF( hNoiseEst->bckr_fx[i] != 0 ) { - e_num = sub( norm_l( L_tmp1 ), 1 ); - m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+1+e_num-16 + e_num = sub( norm_l( fr_enr ), 1 ); + m_num = extract_h( L_shl( fr_enr, e_num ) ); // q_ener+1+e_num-16 e_noise = norm_l( hNoiseEst->bckr_fx[i] ); m_noise_local = extract_h( L_shl( hNoiseEst->bckr_fx[i], e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 - L_snr_tmp = L_deposit_h( div_s( m_num, m_noise_local ) ); // 32+q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise - q_snr_tmp = add( 32, sub( add( q_fr_bands, e_num ), add( hNoiseEst->q_bckr, e_noise ) ) ); + L_snr_tmp = L_deposit_h( div_s( m_num, m_noise_local ) ); // 31+q_ener+1+e_num-hNoiseEst->q_bckr-e_noise + q_snr_tmp = add( 32, sub( add( q_ener, e_num ), add( hNoiseEst->q_bckr, e_noise ) ) ); } ELSE { - L_snr_tmp = Mpy_32_16_1( L_tmp1, 18286 /* 1/E_MIN in Q6 */ ); // q_fr_bands-8 - q_snr_tmp = sub( q_fr_bands, 8 ); + L_snr_tmp = Mpy_32_16_1( fr_enr, 18286 /* 1/E_MIN in Q6 */ ); // q_ener+1+6-15 + q_snr_tmp = sub( q_ener, 8 ); } /* conditional snrsum, snr_sum = snr_sum + snr[i];*/ + IF( GT_16( q_snr_tmp, 28 ) ) // added to avoid overflow while scaling sign_thr_HE_SAD,min_snr_HE_SAD,sign_thr and min_snr while scaling to q_snr_tmp + { + L_snr_tmp = L_shl( L_snr_tmp, sub( 28, q_snr_tmp ) ); + q_snr_tmp = 28; + move16(); + } exp = sub( Q4, q_snr_tmp ); L_snr = L_shl_sat( L_snr_tmp, exp ); // Q4 - sign_thr_snr_acc_fx( &L_snr_sum_HE_SAD, L_snr, sign_thr_HE_SAD, min_snr_HE_SAD ); - sign_thr_snr_acc_fx( &L_snr_sum, L_snr, sign_thr, min_snr ); + sign_thr_snr_acc_ivas_fx( &L_snr_sum_HE_SAD, &q_snr_sum_HE_SAD, L_snr_tmp, q_snr_tmp, L_shl( sign_thr_HE_SAD, sub( q_snr_tmp, 4 ) ), L_shl( min_snr_HE_SAD, sub( q_snr_tmp, 4 ) ) ); + sign_thr_snr_acc_ivas_fx( &L_snr_sum, &q_snr_sum, L_snr_tmp, q_snr_tmp, L_shl( sign_thr, sub( q_snr_tmp, 4 ) ), L_shl( min_snr, sub( q_snr_tmp, 4 ) ) ); /* if( snr[i] < 1.0f ) { snr[i] = 1.0f;} */ IF( LT_32( L_snr, 16 /* 1.0 in Q4 */ ) ) @@ -2395,11 +2380,11 @@ Word16 wb_vad_ivas_fx( /* accumulate background noise energy in bands [0-2] and in bands [3-19]*/ IF( LT_16( i, 3 ) ) { - L_accum_ener_L = L_add_o( L_accum_ener_L, hNoiseEst->bckr_fx[i], &Overflow ); /* hNoiseEst->q_bckr */ + L_accum_ener_L = L_add_sat( L_accum_ener_L, hNoiseEst->bckr_fx[i] ); /* hNoiseEst->q_bckr */ } ELSE { - L_accum_ener_H = L_add_o( L_accum_ener_H, hNoiseEst->bckr_fx[i], &Overflow ); /*hNoiseEst->q_bckr */ + L_accum_ener_H = L_add_sat( L_accum_ener_H, hNoiseEst->bckr_fx[i] ); /*hNoiseEst->q_bckr */ } /* Identify the outlier band */ @@ -2414,8 +2399,9 @@ Word16 wb_vad_ivas_fx( } } /* end of band loop */ - L_snr_outlier = L_shl_sat( L_snr_outlier, sub( Q4, q_snr ) ); // q_snr -> Q4 - snr_sumt = extract_h( L_shl( L_snr_sumt, Q4 ) ); // Q16 -> Q4 + L_snr_sum_HE_SAD = L_shl_sat( L_snr_sum_HE_SAD, sub( 4, q_snr_sum_HE_SAD ) ); // q_snr_sum_HE_SAD->q4 + + snr_sumt = extract_h( L_shl( L_snr_sumt, Q4 ) ); // Q16 -> Q4 test(); test(); @@ -2447,51 +2433,66 @@ Word16 wb_vad_ivas_fx( } } + L_snr_outlier_Q4 = L_shl_sat( L_snr_outlier, sub( Q4, q_snr ) ); // Q4 /* Separated SNR_SUM outlier modification */ - L_snr_sum_ol = L_snr_sum; /* snr_sum_ol = snr_sum; */ + /* snr_sum_ol = snr_sum; */ + L_snr_sum_ol = L_snr_sum; // q_snr_sum + q_L_snr_sum_ol = q_snr_sum; move32(); + move16(); test(); test(); test(); - IF( ( EQ_16( st_fx->max_band, 19 ) ) && LT_32( L_snr_outlier, MAX_SNR_OUTLIER_3_FX ) && GT_16( snr_outlier_index, 3 ) && LT_16( snr_outlier_index, MAX_SNR_OUTLIER_IND_FX ) ) + IF( ( EQ_16( st_fx->max_band, 19 ) ) && LT_32( L_snr_outlier_Q4, MAX_SNR_OUTLIER_3_FX ) && GT_16( snr_outlier_index, 3 ) && LT_16( snr_outlier_index, MAX_SNR_OUTLIER_IND_FX ) ) { + q_L_snr_sum_ol = s_min( add( norm_l( L_snr_sum_ol ), q_snr_sum ), add( norm_l( L_snr_outlier ), q_snr ) ); + L_tmp1 = L_shl( L_snr_sum_ol, sub( q_L_snr_sum_ol, q_snr_sum ) ); // q_L_snr_sum_ol + L_tmp2 = L_shl( L_snr_outlier, sub( q_L_snr_sum_ol, q_snr ) ); // q_L_snr_sum_ol test(); test(); IF( LT_32( L_accum_ener_H, Mult_32_16( L_accum_ener_L, INV_OUTLIER_THR_1_FX ) ) /* float:: (accum_ener_L*INV_OUTLIER_THR_1 > accum_ener_H ) !!! */ - || LT_32( L_snr_outlier, MAX_SNR_OUTLIER_1_FX ) ) + || LT_32( L_snr_outlier_Q4, MAX_SNR_OUTLIER_1_FX ) ) { - /* as weight1 is 1.0 we do not need to multiply here , i.e. no need to loose any precisison */ - L_snr_sum_ol = L_sub( L_snr_sum_ol, L_snr_outlier ); /*Q4 */ + /* snr_sum_ol = SNR_OUTLIER_WGHT_1 * ( snr_sum_ol - snr_outlier ); + As SNR_OUTLIER_WGHT_1 is 1.0f we do not need to multiply here , i.e. no need to loose any precisison */ + L_snr_sum_ol = L_sub( L_tmp1, L_tmp2 ); // q_L_snr_sum_ol } ELSE IF( LT_32( L_accum_ener_H, Mult_32_16( L_accum_ener_L, INV_OUTLIER_THR_2_FX ) ) /* float:: (accum_ener_L *INV_OUTLIER_THR_2 > accum_ener_H ) !!! */ - || LT_32( L_snr_outlier, MAX_SNR_OUTLIER_2_FX ) ) + || LT_32( L_snr_outlier_Q4, MAX_SNR_OUTLIER_2_FX ) ) { - /* L_snr_sum = SNR_OUTLIER_WGHT_2 * (snr_sum - snr_outlier); */ - - /* 1.01*x -> (1*x + 0.01*x) to not drop down to Q3 */ - L_tmp = L_sub( L_snr_sum_ol, L_snr_outlier ); - L_tmp2 = Mult_32_16( L_tmp, 20972 ); /* 0.01(in Q21)= 20972 Q4*Q21+1-16 -> Q10 */ - L_snr_sum_ol = L_add( L_tmp, L_shr( L_tmp2, 6 ) ); /* Q4 */ + /* snr_sum_ol = SNR_OUTLIER_WGHT_2 * (snr_sum_ol - snr_outlier); */ + L_snr_sum_ol = Mpy_32_32( 1084479242 /* 1.01f in Q30 */, L_sub( L_tmp1, L_tmp2 ) ); // q_L_snr_sum_ol+30-31 + q_L_snr_sum_ol = sub( q_L_snr_sum_ol, 1 ); } ELSE { - /* L_snr_sum = SNR_OUTLIER_WGHT_3 * (snr_sum - snr_outlier);*/ - /* 1.02*x -> (1*x + 0.02*x) to not drop down to Q3 */ - L_tmp = L_sub( L_snr_sum_ol, L_snr_outlier ); - L_tmp2 = Mult_32_16( L_tmp, 20972 ); /* 0.02(in Q20)= 20972 Q4*Q20+1-16 -> Q9 */ - L_snr_sum_ol = L_add( L_tmp, L_shr( L_tmp2, 5 ) ); /* Q4 */ + /* snr_sum_ol = SNR_OUTLIER_WGHT_2 * (snr_sum_ol - snr_outlier); */ + L_snr_sum_ol = Mpy_32_32( 1095216660 /* 1.02f in Q30 */, L_sub( L_tmp1, L_tmp2 ) ); // q_L_snr_sum_ol+30-31 + q_L_snr_sum_ol = sub( q_L_snr_sum_ol, 1 ); } } /*st_fx->snr_sum_vad_fx = 0.5f * st->snr_sum_vad + 0.5f * snr_sum_ol;*/ - hVAD->L_snr_sum_vad_fx = L_shr( L_add_o( hVAD->L_snr_sum_vad_fx, L_snr_sum_ol, &Overflow ), 1 ); /*Q4*/ + q_snr_tmp = s_min( add( hVAD->q_L_snr_sum_vad, norm_l( hVAD->L_snr_sum_vad_fx ) ), add( norm_l( L_snr_sum_ol ), q_L_snr_sum_ol ) ); + /* 0.5f * st->snr_sum_vad */ + L_tmp1 = L_shl( hVAD->L_snr_sum_vad_fx, sub( sub( q_snr_tmp, 1 ), hVAD->q_L_snr_sum_vad ) ); // q_snr_tmp + /* 0.5f * snr_sum_ol */ + L_tmp2 = L_shl( L_snr_sum_ol, sub( sub( q_snr_tmp, 1 ), q_L_snr_sum_ol ) ); // q_snr_tmp + hVAD->L_snr_sum_vad_fx = L_add( L_tmp1, L_tmp2 ); // q_snr_tmp + hVAD->q_L_snr_sum_vad = q_snr_tmp; move32(); + move16(); /* snr_sum_ol = 10.0f * (float)log10( snr_sum_ol ); */ - snr_sum_ol = vad_snr_log_fx( L_snr_sum_ol, LG10 ); + e_snr = norm_l( L_snr_sum_ol ); + f_snr = Log2_norm_lc( L_shl( L_snr_sum_ol, e_snr ) ); // Q15 + e_snr = sub( sub( 30, e_snr ), q_L_snr_sum_ol ); + L_tmp = L_mac( f_snr, e_snr, ONE_IN_Q14 ); // Q15 + L_snr_sum_ol = Mpy_32_16_1( L_tmp, 24660 /* 10*log(2) in Q13 */ ); // Q13 + snr_sum_ol = extract_h( L_shl( L_snr_sum_ol, Q24 - Q13 ) ); // Q8 snr_sum = snr_sum_ol; move16(); /* note for NB no outlier modification */ @@ -2520,9 +2521,9 @@ Word16 wb_vad_ivas_fx( /*thr1 = nk * lp_snr + nc*1.0 + nv * ( st->Etot_v_h2 - nv_ofs); */ /* Linear function for noisy speech */ - L_tmp = L_shl( L_mult( sub( hNoiseEst->Etot_v_h2_fx, nv_ofs ), nv ), 7 ); /* Q8+Q8+1 +7 --> Q24 */ - L_tmp = L_mac( L_tmp, nc, (Word16) 32767 ); /* Q8+Q15+1 = Q24 */ - thr1 = mac_r( L_tmp, lp_snr, nk ); /* Q8+Q15+1 - 16 --> Q8 */ + L_tmp = L_shl( Mpy_32_16_1( L_sub( hNoiseEst->Etot_v_h2_32fx, nv_ofs ), nv ), 3 ); // Q24 (24+12-15+3) + L_tmp = L_add( L_tmp, nc ); // Q24 + thr1 = mac_r( L_tmp, lp_snr, nk ); // Q24 test(); IF( st_fx->element_mode > EVS_MONO && LT_16( hNoiseEst->first_noise_updt_cnt, 100 ) ) @@ -2584,38 +2585,42 @@ Word16 wb_vad_ivas_fx( test(); test(); test(); - test(); /*_DIFF_FLOAT_FIX_ -> the conditions around Opt_SC_VBR_fx are invertered compared to float - ### st_fx->Opt_SC_VBR!=0 vs !st_fx->Opt_SC_VBR #####*/ + test(); test(); IF( ( LE_16( snr_outlier_index, 4 ) && ( st_fx->last_coder_type > UNVOICED ) && !st_fx->Opt_SC_VBR ) || ( LE_16( snr_outlier_index, 4 ) && ( last_7k2_coder_type > UNVOICED ) && st_fx->Opt_SC_VBR ) ) - - { - thr1_ol = sub( thr1_ol, (Word16) ( 1 << 8 ) ); /*thr1_ol = thr1 - 1.0f ; */ + /*thr1_ol = thr1 - 1.0f ; */ + thr1_ol = sub( thr1, ONE_IN_Q8 ); // Q8 + /*snr_sum_ol = 10.0f * (float)log10( hVAD->L_snr_sum_vad_fx );*/ - snr_sum_ol = vad_snr_log_fx( hVAD->L_snr_sum_vad_fx, LG10 ); /* snr in Q8 */ + e_snr = norm_l( hVAD->L_snr_sum_vad_fx ); + f_snr = Log2_norm_lc( L_shl( hVAD->L_snr_sum_vad_fx, e_snr ) ); // Q15 + e_snr = sub( sub( 30, e_snr ), hVAD->q_L_snr_sum_vad ); + L_tmp = L_mac( f_snr, e_snr, ONE_IN_Q14 ); // Q15 + L_snr_sum_ol = Mpy_32_16_1( L_tmp, 24660 /* 10*log(2) in Q13 */ ); // Q13 + snr_sum_ol = round_fx( L_shl( L_snr_sum_ol, Q24 - Q13 ) ); // Q8 } - ELSE IF( ( ( LE_16( st_fx->last_coder_type, UNVOICED ) ) && ( LT_32( L_snr_outlier, MAX_SNR_OUTLIER_2_FX ) ) && ( st_fx->Opt_SC_VBR == 0 ) ) || - ( ( LE_16( last_7k2_coder_type, UNVOICED ) ) && ( LT_32( L_snr_outlier, MAX_SNR_OUTLIER_2_FX ) ) && ( st_fx->Opt_SC_VBR != 0 ) ) ) - + ELSE IF( ( ( LE_16( st_fx->last_coder_type, UNVOICED ) ) && ( LT_32( L_snr_outlier_Q4, MAX_SNR_OUTLIER_2_FX ) ) && ( st_fx->Opt_SC_VBR == 0 ) ) || + ( ( LE_16( last_7k2_coder_type, UNVOICED ) ) && ( LT_32( L_snr_outlier_Q4, MAX_SNR_OUTLIER_2_FX ) ) && ( st_fx->Opt_SC_VBR != 0 ) ) ) { /* thr1_ol = thr1 + (float)(1.0f - 0.04f * snr_outlier); */ - L_tmp2 = Msub_32_16( (Word32) ( 1 << ( 24 - 16 ) ), L_snr_outlier, 20972 ); /* (1.0)Q24(Q8 in high 32bit word) - Q4*Q19+1 */ - tmp2 = round_fx( L_shl( L_tmp2, 16 ) ); /* high word is in Q8 */ - thr1_ol = add( thr1_ol, tmp2 ); /* (Q8 , Q8) */ + L_tmp = Mpy_32_16_1( L_snr_outlier, 20972 /*0.04f in Q19*/ ); // q_snr+19-15 + L_tmp = L_shl( L_tmp, sub( Q24 - 4, q_snr ) ); // Q24 (24-(q_nsr+4)) + tmp2 = round_fx( L_sub( ONE_IN_Q24, L_tmp ) ); // Q8 + thr1_ol = add( thr1, tmp2 ); // Q8 } ELSE { - /*thr1_ol = thr1 + max(0, (float)(0.6f - 0.01f * L_snr_outlier)); */ - thr1_ol = thr1; - move16(); - L_tmp2 = Msub_32_16( (Word32) 614, L_snr_outlier, 20972 ); /* .6*1024= */ /* 0.6 Q26(Q10 in high word) - Q4*Q21+1 */ - tmp2 = round_fx( L_shl_o( L_tmp2, 14, &Overflow ) ); /* Q10(high word)+ 14 -16 --> Q8*/ - IF( L_tmp2 > 0 ) - { - thr1_ol = add( thr1_ol, tmp2 ); /* Q24 >>16 + Q8 */ - } + /*thr1_ol = thr1 + max(0, (float)(0.6f - 0.01f * snr_outlier)); */ + /* Saturation is added in the below step for 0.04f * snr_outlier in Q24. + In case of saturation, 0.04f * snr_outlier will be much greater than 0.6f and (0.6f - 0.01f * snr_outlier) becomes negative. + max(0, (float)(0.6f - 0.01f * snr_outlier)) gives zero. Hence addition of saturation has no impact */ + L_tmp = Mpy_32_16_1( L_snr_outlier, 20972 /*0.04f in Q21*/ ); // q_snr+21-15 + L_tmp = L_shl_sat( L_tmp, sub( Q24 - 6, q_snr ) ); // Q24 (24-(q_nsr+6)) + tmp2 = round_fx( L_sub( 10066330 /* 0.6 in Q24*/, L_tmp ) ); // Q8 + tmp2 = s_max( 0, tmp2 ); // Q8 + thr1_ol = add( thr1, tmp2 ); // Q8 } } @@ -2992,7 +2997,7 @@ Word16 wb_vad_ivas_fx( /* *flag_noisy_speech_snr is a Word8 parameter */ - *flag_noisy_speech_snr = 0; /*_DIFF_FLOAT_FIX_ -> this initialisation is not done here in float */ + *flag_noisy_speech_snr = 0; /*_DIFF_FLOAT_FIX_IVAS -> this initialisation is not done here in float */ move16(); IF( vad_bwidth_fx != NB ) { diff --git a/lib_enc/vad_param_updt_fx.c b/lib_enc/vad_param_updt_fx.c index 464903a03a6b45a7e9e241b4c900901bd290b801..9677fd2ebb8518c874b3cf8b0287bdbb7988b201 100644 --- a/lib_enc/vad_param_updt_fx.c +++ b/lib_enc/vad_param_updt_fx.c @@ -1,11 +1,11 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ + #include #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "ivas_stat_enc.h" /* Function prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -34,10 +34,6 @@ void vad_param_updt_fx( Word16 i, ini_frame, corr_shift_temp[2]; VAD_HANDLE hVAD; DTX_ENC_HANDLE hDtxEnc = st_fx->hDtxEnc; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif corr_shift_temp[0] = corr_shift; /*Q15*/ corr_shift_temp[1] = corr_shiftR; /*Q15*/ @@ -62,8 +58,7 @@ void vad_param_updt_fx( } IF( !st_fx->Opt_AMR_WB ) { - /* fix explanation - , after function dtx_fx, the "vad_flag" parameter can not be used for SID scheduling purposes any longer + /* fix explanation, after function dtx_fx, the "vad_flag" parameter can not be used for SID scheduling purposes any longer as dtx_fx can schedules active frames even if the initial analyzed vad_flag is 0 ) in the worst case without the fix an active frame could be classified as SID frame, quite/very unlikley though */ @@ -160,13 +155,12 @@ void vad_param_updt_fx( } } - /* (voicing[0] + voicing[1] + voicing[2]) / 3 + corr_shift */ L_tmp = L_mult( st_fx->voicing_fx[0], 10923 ); L_tmp = L_mac( L_tmp, st_fx->voicing_fx[1], 10923 ); - L_tmp = L_mac( L_tmp, st_fx->voicing_fx[2], 10923 ); /*Q15 */ - L_tmp = L_mac_o( L_tmp, corr_shift_temp[i], 32767, &Overflow ); /*Q15 */ - voice_tmp = round_fx_o( L_tmp, &Overflow ); /*Q15 */ + L_tmp = L_mac( L_tmp, st_fx->voicing_fx[2], 10923 ); /*Q15 */ + L_tmp = L_mac_sat( L_tmp, corr_shift_temp[i], 32767 ); /*Q15 */ + voice_tmp = round_fx_sat( L_tmp ); /*Q15 */ /* abs(pitch[0] - *pitO) + abs(pitch[1] - pitch[0]) + abs(pitch[2] - pitch[1]) */ pitch_tmp = abs_s( sub( st_fx->pitch[0], old_pitch1 ) ); /*Q0 */ diff --git a/lib_enc/vad_proc_fx.c b/lib_enc/vad_proc_fx.c index 2c9273ff54824969fec1d5297c9bf322fd20cee4..62469f3a7f522f8dcb9db781f9fdc334c46e5225 100644 --- a/lib_enc/vad_proc_fx.c +++ b/lib_enc/vad_proc_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ @@ -15,6 +15,7 @@ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ + /*-------------------------------------------------------------------* * vad_init_fx() * diff --git a/lib_enc/vbr_average_rate_fx.c b/lib_enc/vbr_average_rate_fx.c index 28371b2d716d2cd26f8cba81e5bdc40929ed02cb..fd1092104eebfa09456f6f7bbc4b8f7c229d2703 100644 --- a/lib_enc/vbr_average_rate_fx.c +++ b/lib_enc/vbr_average_rate_fx.c @@ -1,12 +1,10 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ -#include "rom_com_fx.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "stat_enc.h" /* Static table prototypes */ #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ @@ -17,27 +15,27 @@ #define RATEWIN 600 /* length of the rate control window. This is 600 active speech frames. This equals roughly 12s of active speech */ /*=================================================================================*/ -/* FUNCTION : update_average_rate_fx */ +/* FUNCTION : update_average_rate_fx */ /*---------------------------------------------------------------------------------*/ -/* PURPOSE : SC-VBR update average data rate */ +/* PURPOSE : SC-VBR update average data rate */ /*---------------------------------------------------------------------------------*/ /* INPUT ARGUMENTS : */ -/* _ (struct DTFS_STRUCTURE_FX) */ +/* _ (struct DTFS_STRUCTURE_FX) */ /*---------------------------------------------------------------------------------*/ /* INPUT/OUTPUT ARGUMENTS : */ -/* hSC_VBR->global_avr_rate_fx Q13 */ -/* hSC_VBR->sum_of_rates_fx Q13 */ -/* hSC_VBR->SNR_THLD_fx Q8 */ -/* hSC_VBR->Q_to_F_fx Q0 */ -/* hSC_VBR->pattern_m_fx Q0 */ -/* hSC_VBR->rate_control_fx Q0 */ +/* hSC_VBR->global_avr_rate_fx Q13 */ +/* hSC_VBR->sum_of_rates_fx Q13 */ +/* hSC_VBR->SNR_THLD_fx Q8 */ +/* hSC_VBR->Q_to_F_fx Q0 */ +/* hSC_VBR->pattern_m_fx Q0 */ +/* hSC_VBR->rate_control_fx Q0 */ /*---------------------------------------------------------------------------------*/ -/*/* OUTPUT ARGUMENTS : */ +/*/* OUTPUT ARGUMENTS : */ /* _ None */ /*---------------------------------------------------------------------------------*/ /* RETURN ARGUMENTS : _ None. */ /*---------------------------------------------------------------------------------*/ -/* CALLED FROM : */ +/* CALLED FROM : */ /*=================================================================================*/ void update_average_rate_fx( SC_VBR_ENC_HANDLE hSC_VBR, /* i/o: SC-VBR state structure */ @@ -49,11 +47,6 @@ void update_average_rate_fx( Word16 tmp; Word32 L_tmp; Word32 L_tmp1, L_tmp2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - Word16 exp, recip, Qrecip; IF( EQ_16( hSC_VBR->numactive, RATEWIN ) ) /* goes into rate control only the numactive ==RATEWIN. So rate control is triggered after each RATEWIN avtive frames */ @@ -258,7 +251,8 @@ void update_average_rate_fx( /* sum the total number of bits (in kbytes) * 10 here */ /*st->sum_of_rates += (hSC_VBR->core_brate / 1000.0f) * 10; */ L_tmp = L_shl( Mult_32_16( core_brate_fx, 20972 ), 7 ); /*Q13*/ - hSC_VBR->sum_of_rates_fx = L_add_o( hSC_VBR->sum_of_rates_fx, L_tmp, &Overflow ); + hSC_VBR->sum_of_rates_fx = L_add_sat( hSC_VBR->sum_of_rates_fx, L_tmp ); move32(); + return; } diff --git a/lib_enc/vlpc_1st_cod_fx.c b/lib_enc/vlpc_1st_cod_fx.c index 9bfe0d8ae90c59aa69f96b024678e1fbd341760a..f9b5ebbb321233c91cfc5fd889cc9c10f7276bf9 100644 --- a/lib_enc/vlpc_1st_cod_fx.c +++ b/lib_enc/vlpc_1st_cod_fx.c @@ -1,16 +1,15 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" #include "cnst.h" -//#include "prot_fx.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + #define ISF_ONE 3 /*1.0f*1.28f Q1*/ /*=1.0f in 14Q1*1.28*/ /*------------------------------------------------------------------* diff --git a/lib_enc/vlpc_2st_cod_fx.c b/lib_enc/vlpc_2st_cod_fx.c index 2ea4df5a991b85e437dfbd9b55c4367637077a2d..32ab21877f844b8b1876a310dab6ee8ba590e645 100644 --- a/lib_enc/vlpc_2st_cod_fx.c +++ b/lib_enc/vlpc_2st_cod_fx.c @@ -1,5 +1,5 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include @@ -17,7 +17,7 @@ * *------------------------------------------------------------------*/ -Word16 vlpc_2st_cod_fx( /* output: number of allocated bits */ +Word16 vlpc_2st_cod_fx( /* output: number of allocated bits */ const Word16 *lsf, /* i : normalized vector to quantize (14Q1*1.28) */ Word16 *lsfq, /* i/o: i:1st stage o:1st+2nd stage (14Q1*1.28) */ Word16 *indx, /* o : index[] (4 bits per words) Q0 */ @@ -30,11 +30,6 @@ Word16 vlpc_2st_cod_fx( /* output: number of allocated bits Word16 nq, xq[M]; Word32 L_tmp; Word16 gap; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - /* 0 bit with true weighting: save 0.5 bit */ lsf_weight_2st( lsf, w, 1 ); /*w:0Q15*1.28*/ @@ -57,7 +52,7 @@ Word16 vlpc_2st_cod_fx( /* output: number of allocated bits BASOP_SATURATE_WARNING_OFF_EVS /* Allow saturate because we only need to know if the result is smaller than 8.0f */ FOR( i = 1; i < M; i++ ) { - L_tmp = L_mac_o( L_tmp, x[i], x[i], &Overflow ); /*10Q21*/ + L_tmp = L_mac_sat( L_tmp, x[i], x[i] ); /*10Q21*/ } BASOP_SATURATE_WARNING_ON_EVS diff --git a/lib_enc/voiced_enc_fx.c b/lib_enc/voiced_enc_fx.c index b0dba61de4752b160164a6ad70f5612adcc6a100..fc3b81724aedeea77fa7fbfa06f01bf235fac865 100644 --- a/lib_enc/voiced_enc_fx.c +++ b/lib_enc/voiced_enc_fx.c @@ -1,25 +1,26 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" #include "cnst.h" -//#include "prot_fx.h" -#include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ + /*-------------------------------------------------------------------* * Local functions *--------------------------------------------------------------------*/ + static void synthesis_filter_fx( Word16 b[], Word16 x[], Word16 y[], Word16 buf[], Word16 P, Word16 N ); static Word32 DTFS_freq_corr_fx( DTFS_STRUCTURE X1_DTFS_fx, DTFS_STRUCTURE X2_DTFS_fx, Word16 lband, Word16 hband, Word16 *Qout ); static Word16 DTFS_alignment_extract_td_fx( Word16 *x1, Word16 *x2, Word16 lag ); static Word32 DTFS_getEngy_band_fx( DTFS_STRUCTURE X_fx, const Word16 lband, const Word16 hband ); + /*=======================================================================================*/ /* FUNCTION : ppp_voiced_encoder_fx() */ /*---------------------------------------------------------------------------------------*/ @@ -122,10 +123,6 @@ ivas_error ppp_voiced_encoder_fx( Word32 low_band_en_fx; Word32 curr_Engy, prev_Engy; Word16 temp_Fs; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif DTFS_STRUCTURE *CURRP_NQ_FX; DTFS_STRUCTURE *TMPDTFS_FX; DTFS_STRUCTURE *TMPDTFS2_FX; @@ -558,12 +555,12 @@ ivas_error ppp_voiced_encoder_fx( } /* Bump up if big change between the previous and the current CWs */ - IF( LT_16( shl_o( hSC_VBR->vadsnr_fx, 1, &Overflow ), hSC_VBR->SNR_THLD_fx ) ) /*Q8 */ + IF( LT_16( shl_sat( hSC_VBR->vadsnr_fx, 1 ), hSC_VBR->SNR_THLD_fx ) ) /*Q8 */ { /*if ( res_enratio > 5.0 && tmp < 0.65 ) */ /* 5 in Q11, 0.65 in Q15 // L_shl(tmp_fx,sub(31,Qtmp)) makes tmp_fx FIXED Q31 */ test(); - if ( ( GT_32( res_enratio_fx, 10240 ) ) && ( LT_16( extract_h( L_shl_o( tmp_fx, sub( 31, Qtmp ), &Overflow ) ), 21299 ) ) ) + if ( ( GT_32( res_enratio_fx, 10240 ) ) && ( LT_16( extract_h( L_shl_sat( tmp_fx, sub( 31, Qtmp ) ) ), 21299 ) ) ) { PPP_MODE_E = 'B'; move16(); @@ -574,7 +571,7 @@ ivas_error ppp_voiced_encoder_fx( /* if ( res_enratio > 3.0 && tmp < 1.2 ) */ /*3 in Q11, 1.2 in Q14 // L_shl(tmp_fx,sub(31,Qtmp)) makes tmp_fx FIXED Q14 */ test(); - if ( ( GT_32( res_enratio_fx, 6144 ) ) && ( LT_16( extract_h( L_shl_o( tmp_fx, sub( 30, Qtmp ), &Overflow ) ), 19661 ) ) ) + if ( ( GT_32( res_enratio_fx, 6144 ) ) && ( LT_16( extract_h( L_shl_sat( tmp_fx, sub( 30, Qtmp ) ) ), 19661 ) ) ) { PPP_MODE_E = 'B'; move16(); @@ -585,10 +582,10 @@ ivas_error ppp_voiced_encoder_fx( /* Rapid rampdown frame where time resolution is important */ /* Not a suitable PPP frame -> Bump to CELP */ - IF( LT_16( shl_o( hSC_VBR->vadsnr_fx, 1, &Overflow ), hSC_VBR->SNR_THLD_fx ) ) /*Q8 */ + IF( LT_16( shl_sat( hSC_VBR->vadsnr_fx, 1 ), hSC_VBR->SNR_THLD_fx ) ) /*Q8 */ { /* if (res_enratio < 0.025) */ - IF( LT_32( L_shl_o( res_enratio_fx, 4, &Overflow ), 819 ) ) /*0x0333 = 0.025 in Q15, res_enratio_fx in Q15 after shl 4 */ + IF( LT_32( L_shl_sat( res_enratio_fx, 4 ), 819 ) ) /*0x0333 = 0.025 in Q15, res_enratio_fx in Q15 after shl 4 */ { hSC_VBR->bump_up = 1; move16(); @@ -604,7 +601,7 @@ ivas_error ppp_voiced_encoder_fx( ELSE { /* if ( res_enratio < 0.092f) */ - if ( LT_32( L_shl_o( res_enratio_fx, 4, &Overflow ), 3015 ) ) /*3015 = 0.092 in Q15, res_enratio_fx in Q15 after shl 4 */ + if ( LT_32( L_shl_sat( res_enratio_fx, 4 ), 3015 ) ) /*3015 = 0.092 in Q15, res_enratio_fx in Q15 after shl 4 */ { hSC_VBR->bump_up = 1; move16(); @@ -613,7 +610,7 @@ ivas_error ppp_voiced_encoder_fx( /* if (min(res_enratio, sp_enratio) < 0.075 && tmp < -0.5f)) : 2458 = 0.075 in Q15 */ test(); - if ( LT_32( L_min( L_shl_o( res_enratio_fx, 4, &Overflow ), sp_enratio_fx ), 2458 ) && LT_32( tmp_fx, shl_o( -1, sub( Qtmp, 1 ), &Overflow ) ) ) + if ( LT_32( L_min( L_shl_sat( res_enratio_fx, 4 ), sp_enratio_fx ), 2458 ) && LT_32( tmp_fx, shl_sat( -1, sub( Qtmp, 1 ) ) ) ) { hSC_VBR->bump_up = 1; move16(); @@ -621,7 +618,7 @@ ivas_error ppp_voiced_encoder_fx( /* Rapid rampup frame where time resolution is important */ /* Not a suitable PPP frame -> Bump to CELP */ - IF( LT_16( shl_o( hSC_VBR->vadsnr_fx, 1, &Overflow ), hSC_VBR->SNR_THLD_fx ) ) /*Q8 */ + IF( LT_16( shl_sat( hSC_VBR->vadsnr_fx, 1 ), hSC_VBR->SNR_THLD_fx ) ) /*Q8 */ { IF( GT_32( res_enratio_fx, 29696 ) ) /*14.5 in Q11 */ { @@ -732,7 +729,7 @@ ivas_error ppp_voiced_encoder_fx( Ltemp1 = L_negate( Ltemp1 ); } expa = norm_l( Ltemp2 ); - fraca = extract_h( L_shl_o( Ltemp2, expa, &Overflow ) ); + fraca = extract_h( L_shl( Ltemp2, expa ) ); expa = sub( 30, expa ); expb = norm_l( Ltemp1 ); @@ -740,12 +737,12 @@ ivas_error ppp_voiced_encoder_fx( expb = sub( 30, add( expb, Qadj ) ); scale = shr( sub( fraca, fracb ), 15 ); - fracb = shl_o( fracb, scale, &Overflow ); + fracb = shl_sat( fracb, scale ); expb = sub( expb, scale ); tmp = div_s( fracb, fraca ); exp = sub( expb, expa ); - Ltemp_fx = L_shl_o( tmp, add( exp, 14 ), &Overflow ); + Ltemp_fx = L_shl_sat( tmp, add( exp, 14 ) ); /*-------------------------------------------*/ sp_hb_enratio_fx = L_add( Ltemp_fx, 0 ); /* Q29 */ } @@ -769,11 +766,11 @@ ivas_error ppp_voiced_encoder_fx( move32(); Qadj = sub( hSC_VBR->Q_prev_cw_en_fx, shl( CURRP_NQ_FX->Q, 1 ) ); - Ltmp_32 = L_shl_o( Ltmp_32, Qadj, &Overflow ); /* shift left required to adjust Q of CURRP_NQ_FX = Q_prev_cw_en_fx */ + Ltmp_32 = L_shl_sat( Ltmp_32, Qadj ); /* shift left required to adjust Q of CURRP_NQ_FX = Q_prev_cw_en_fx */ /* Ltmp1_32 = 0.8f * st->prev_cw_en */ Ltmp1_32 = Mult_32_16( hSC_VBR->prev_cw_en_fx, 26214 ); /* Q = (Q_prev_cw_en_fx + Q15+1)-Q16 = Q_prev_cw_en_fx */ - IF( LT_16( shl_o( hSC_VBR->vadsnr_fx, 1, &Overflow ), hSC_VBR->SNR_THLD_fx ) ) /*Q8 */ + IF( LT_16( shl_sat( hSC_VBR->vadsnr_fx, 1 ), hSC_VBR->SNR_THLD_fx ) ) /*Q8 */ { /* if ( DTFS_getEngy(*CURRP_NQ) > 0.8f * st->prev_cw_en && max(pos_nq, neg_nq) > 3.0f && st->rate_control ) */ /* pos_nq_fx and neg_nq_fx in Q28 ???? */ @@ -874,7 +871,7 @@ ivas_error ppp_voiced_encoder_fx( /* compute energy of impz */ FOR( x_fx = 0; x_fx < 160; x_fx++ ) { - energy_impz_fx = L_add_o( energy_impz_fx, L_mult0( impzo_fx[x_fx], impzo_fx[x_fx] ), &Overflow ); + energy_impz_fx = L_add_sat( energy_impz_fx, L_mult0( impzo_fx[x_fx], impzo_fx[x_fx] ) ); } /*energy_impz = (float)(10*log10((float)energy_impz)); */ @@ -888,12 +885,12 @@ ivas_error ppp_voiced_encoder_fx( Ltmp_32 = DTFS_getEngy_fx( CURRP_Q_E_FX ); /*Q = 2*(CURRP_Q_E_FX->Q) */ move32(); Qadj = sub( hSC_VBR->Q_prev_cw_en_fx, shl( CURRP_Q_E_FX->Q, 1 ) ); - Ltmp_32 = L_shl_o( Ltmp_32, Qadj, &Overflow ); /* shift left required to adjust Q of CURRP_Q_E_FX = Q_prev_cw_en_fx */ + Ltmp_32 = L_shl_sat( Ltmp_32, Qadj ); /* shift left required to adjust Q of CURRP_Q_E_FX = Q_prev_cw_en_fx */ /* if ((DTFS_getEngy(*CURRP_Q_E) > st->prev_cw_en)&&(max(pos_q,neg_q)>3.5) && energy_impz>15.0 && tmpres>0.7) */ test(); test(); test(); - IF( ( GT_32( Ltmp_32, hSC_VBR->prev_cw_en_fx ) ) && ( GT_32( L_max( pos_q_fx, neg_q_fx ), 939524096 ) ) && ( GT_32( energy_impz_fx, 30720 ) ) && ( GT_32( Mult_32_16( tmpres_fx, 23265 ), shl_o( 1, sub( Qtmpres, 1 ), &Overflow ) ) ) ) + IF( ( GT_32( Ltmp_32, hSC_VBR->prev_cw_en_fx ) ) && ( GT_32( L_max( pos_q_fx, neg_q_fx ), 939524096 ) ) && ( GT_32( energy_impz_fx, 30720 ) ) && ( GT_32( Mult_32_16( tmpres_fx, 23265 ), shl_sat( 1, sub( Qtmpres, 1 ) ) ) ) ) { /* if ((pos_q > neg_q) && ((pos_q>3.0*pos_nq0) || ((pos_q > 1.5*pos_nq0) && (neg_q < 1.5*neg_nq0)))) */ test(); @@ -950,9 +947,9 @@ ivas_error ppp_voiced_encoder_fx( fracb = shl( fracb, scale ); expb = sub( expb, scale ); - tmp = div_s( fracb, fraca ); /* tmp in Q15 */ - exp = sub( expb, expa ); /* ans = tmp*2^(exp) */ - Ltemp_fx = L_shl_o( tmp, add( exp, 12 ), &Overflow ); /* make tmp Q27 */ + tmp = div_s( fracb, fraca ); /* tmp in Q15 */ + exp = sub( expb, expa ); /* ans = tmp*2^(exp) */ + Ltemp_fx = L_shl_sat( tmp, add( exp, 12 ) ); /* make tmp Q27 */ } test(); IF( GT_32( Ltemp_fx, 6710886 ) && ( !hSC_VBR->rate_control ) ) /* 0.05 in Q27 = 6710886 */ @@ -988,7 +985,7 @@ ivas_error ppp_voiced_encoder_fx( tmp = div_s( fracb, fraca ); exp = sub( expb, expa ); - Ltemp_fx = L_shl_o( tmp, add( exp, 14 ), &Overflow ); /* answer in Q29 */ + Ltemp_fx = L_shl_sat( tmp, add( exp, 14 ) ); /* answer in Q29 */ } /*-------------------------------------------*/ @@ -1055,8 +1052,8 @@ ivas_error ppp_voiced_encoder_fx( L_tmp = L_shl( L_tmp, expa ); exp = sub( 30, add( expa, sub( 31, exp ) ) ); frac = Log2_norm_lc( L_tmp ); - L_tmp = Mpy_32_16( exp, frac, 12330 ); /* L_tmp is always Q13 */ - Ltemp = L_shl_o( L_tmp, 10, &Overflow ); /* Ltemp is always Q23 */ + L_tmp = Mpy_32_16( exp, frac, 12330 ); /* L_tmp is always Q13 */ + Ltemp = L_shl_sat( L_tmp, 10 ); /* Ltemp is always Q23 */ } ELSE { @@ -1070,7 +1067,7 @@ ivas_error ppp_voiced_encoder_fx( move16(); } - IF( LT_16( shl_o( hSC_VBR->vadsnr_fx, 1, &Overflow ), hSC_VBR->SNR_THLD_fx ) ) /* Q8 */ + IF( LT_16( shl_sat( hSC_VBR->vadsnr_fx, 1 ), hSC_VBR->SNR_THLD_fx ) ) /* Q8 */ { /* if ((( tmp < 3.05 && max(res_enratio,sp_enratio) > 0.8 ) && (st->rate_control))|| (( tmp < 2.8 && max(res_enratio,sp_enratio) > 0.65 ) && (!st->rate_control))) */ @@ -1156,7 +1153,7 @@ ivas_error ppp_voiced_encoder_fx( { Q_delta_lag = add( delta_lag_E, 11 ); /* to make it positive always */ - push_indice_fx( hBstr, IND_DELTALAG, Q_delta_lag, 5 ); + push_indice( hBstr, IND_DELTALAG, Q_delta_lag, 5 ); } WIsyn_fx( *dtfs_temp_fx, CURRP_Q_E_FX, lpc2_fx, &( hSC_VBR->ph_offset_E_fx ), out_fx, L_FRAME, 0, S_fx, C_fx, @@ -1239,10 +1236,7 @@ static void synthesis_filter_fx( Word16 b[], Word16 x[], Word16 y[], Word16 buf[ { Word32 acc; Word16 i, j; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + FOR( i = 0; i < N; i++ ) { acc = L_deposit_h( *x++ ); /*Q16 */ @@ -1251,17 +1245,16 @@ static void synthesis_filter_fx( Word16 b[], Word16 x[], Word16 y[], Word16 buf[ FOR( j = P - 1; j > 0; j-- ) { /* acc = L_sub(acc, L_mult(memory[j], coef[j])); */ - acc = L_msu_o( acc, buf[j], b[j], &Overflow ); /*Q13 */ + acc = L_msu_sat( acc, buf[j], b[j] ); /*Q13 */ buf[j] = buf[j - 1]; move16(); } /* acc = L_sub(acc, L_mult(memory[0], coef[0])); */ - acc = L_msu_o( acc, buf[0], b[0], &Overflow ); - acc = L_shl_o( acc, 3, &Overflow ); - - *y++ = round_fx_o( acc, &Overflow ); + acc = L_msu_sat( acc, buf[0], b[0] ); + acc = L_shl_sat( acc, 3 ); + *y++ = round_fx_sat( acc ); + buf[0] = round_fx_sat( acc ); move16(); - buf[0] = round_fx_o( acc, &Overflow ); move16(); } } @@ -1305,10 +1298,7 @@ static Word32 DTFS_freq_corr_fx( Word16 exp, tmp; Word32 L_tmp; Word16 Q_num, Q_den; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + IF( LT_16( X1_DTFS_fx.lag_fx, X2_DTFS_fx.lag_fx ) ) { DTFS_zeroPadd_fx( X2_DTFS_fx.lag_fx, &X1_DTFS_fx ); @@ -1343,8 +1333,8 @@ static Word32 DTFS_freq_corr_fx( FOR( k = lk; k < hk; k++ ) { - corr_fx = L_mac0_o( corr_fx, X1_DTFS_fx.a_fx[k], X2_DTFS_fx.a_fx[k], &Overflow ); /* Q(1) */ - corr_fx = L_mac0_o( corr_fx, X1_DTFS_fx.b_fx[k], X2_DTFS_fx.b_fx[k], &Overflow ); /* Q(1) */ + corr_fx = L_mac0_sat( corr_fx, X1_DTFS_fx.a_fx[k], X2_DTFS_fx.a_fx[k] ); /* Q(1) */ + corr_fx = L_mac0_sat( corr_fx, X1_DTFS_fx.b_fx[k], X2_DTFS_fx.b_fx[k] ); /* Q(1) */ } Qr = norm_l( corr_fx ); @@ -1354,8 +1344,8 @@ static Word32 DTFS_freq_corr_fx( move16(); } - E1_fx = round_fx_o( L_shl_o( corr_fx, Qr, &Overflow ), &Overflow ); /* Q(Qr-16) */ - Num = L_mult0( E1_fx, E1_fx ); /* Q(2+2*Qr-32+1) */ + E1_fx = round_fx_sat( L_shl_sat( corr_fx, Qr ) ); /* Q(Qr-16) */ + Num = L_mult0( E1_fx, E1_fx ); /* Q(2+2*Qr-32+1) */ Q_num = sub( shl( add( add( X1_DTFS_fx.Q, X2_DTFS_fx.Q ), Qr ), 1 ), 32 ); /* PORTING: Handling the functions with variable no. of arguments */ @@ -1368,7 +1358,7 @@ static Word32 DTFS_freq_corr_fx( move16(); } - E1_fx = round_fx_o( L_shl_o( E_fx, q1, &Overflow ), &Overflow ); /* Q(1+q1-16) */ + E1_fx = round_fx_sat( L_shl_sat( E_fx, q1 ) ); /* Q(1+q1-16) */ /* PORTING: Handling the functions with variable no. of arguments */ E_fx = DTFS_getEngy_band_fx( X2_DTFS_fx, lband, hband ); /* Q(1) */ q2 = norm_l( E_fx ); @@ -1378,8 +1368,8 @@ static Word32 DTFS_freq_corr_fx( move16(); } - E2_fx = round_fx_o( L_shl_o( E_fx, q2, &Overflow ), &Overflow ); /* Q(1+q2-16) */ - Den = L_mult0( E1_fx, E2_fx ); /* Q(2+q1+q2-32+1) */ + E2_fx = round_fx_sat( L_shl_sat( E_fx, q2 ) ); /* Q(1+q2-16) */ + Den = L_mult0( E1_fx, E2_fx ); /* Q(2+q1+q2-32+1) */ Q_den = sub( add( shl( add( X2_DTFS_fx.Q, X1_DTFS_fx.Q ), 1 ), add( q1, q2 ) ), 32 ); Num = L_max( Num, 1 ); @@ -1393,19 +1383,16 @@ static Word32 DTFS_freq_corr_fx( } ELSE { - expa = norm_l( Num ); - fraca = extract_h( L_shl_o( Num, expa, &Overflow ) ); + fraca = extract_h( L_shl_sat( Num, expa ) ); expa = sub( 30, add( expa, Q_num ) ); - expb = norm_l( Den ); - fracb = round_fx_o( L_shl_o( Den, expb, &Overflow ), &Overflow ); + fracb = round_fx_sat( L_shl( Den, expb ) ); expb = sub( 30, add( expb, Q_den ) ); - scale = shr( sub( fraca, fracb ), 15 ); - fracb = shl_o( fracb, scale, &Overflow ); + fracb = shl_sat( fracb, scale ); expb = sub( expb, scale ); tmp = div_s( fracb, fraca ); @@ -1423,8 +1410,11 @@ static Word32 DTFS_freq_corr_fx( *Qout = sub( 30, exp ); move16(); } + return Result; } + + /*===================================================================*/ /* FUNCTION : DTFS_alignment_extract_td_fx () */ /*-------------------------------------------------------------------*/ @@ -1449,10 +1439,7 @@ static Word16 DTFS_alignment_extract_td_fx( Word16 *x1, Word16 *x2, Word16 lag ) { Word16 j, k, idx, Adiff_fx; Word32 maxcorr, corr; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + maxcorr = L_add( MIN_32, 0 ); Adiff_fx = (Word16) ( s_max( 4, shr( lag, 3 ) ) ); @@ -1463,7 +1450,7 @@ static Word16 DTFS_alignment_extract_td_fx( Word16 *x1, Word16 *x2, Word16 lag ) corr = L_deposit_l( 0 ); FOR( k = 0; k < lag; k++ ) { - corr = L_mac_o( corr, x1[k], x2[( k - j + lag ) % lag], &Overflow ); + corr = L_mac_sat( corr, x1[k], x2[( k - j + lag ) % lag] ); } IF( GT_32( corr, maxcorr ) ) { @@ -1506,13 +1493,11 @@ static Word32 DTFS_getEngy_band_fx( Word32 freq_fx, L_lband, L_hband; Word32 en_fx = 0; move32(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif + L_lband = L_mult( lband, X_fx.lag_fx ); /* Q0 * Q0 -> Q1 */ L_hband = L_mult( hband, X_fx.lag_fx ); /* Q0 * Q0 -> Q1 */ HalfLag = s_min( shr( sub( X_fx.lag_fx, 1 ), 1 ), X_fx.nH_4kHz_fx ); + /* get lband and hband */ FOR( k = 1; k <= HalfLag; k++ ) { @@ -1537,8 +1522,8 @@ static Word32 DTFS_getEngy_band_fx( FOR( k = lk; k < hk; k++ ) { - en_fx = L_mac0_o( en_fx, X_fx.a_fx[k], X_fx.a_fx[k], &Overflow ); /* 2*X1.Q+1 */ - en_fx = L_mac0_o( en_fx, X_fx.b_fx[k], X_fx.b_fx[k], &Overflow ); + en_fx = L_mac0_sat( en_fx, X_fx.a_fx[k], X_fx.a_fx[k] ); /* 2*X1.Q+1 */ + en_fx = L_mac0_sat( en_fx, X_fx.b_fx[k], X_fx.b_fx[k] ); } if ( lband == 0 ) @@ -1550,12 +1535,14 @@ static Word32 DTFS_getEngy_band_fx( test(); IF( ( s_and( X_fx.lag_fx, 1 ) == 0 ) && ( hband == X_fx.upper_cut_off_freq_fx ) ) { - en_fx = L_mac0_o( en_fx, X_fx.a_fx[k], X_fx.a_fx[k], &Overflow ); - en_fx = L_mac0_o( en_fx, X_fx.b_fx[k], X_fx.b_fx[k], &Overflow ); + en_fx = L_mac0_sat( en_fx, X_fx.a_fx[k], X_fx.a_fx[k] ); + en_fx = L_mac0_sat( en_fx, X_fx.b_fx[k], X_fx.b_fx[k] ); } return en_fx; /* 2*X1.Q */ } + + /*---------------------------------------------------------------------* * sc_vbr_enc_init_fx() * diff --git a/lib_enc/waveadjust_fec_cod_fx.c b/lib_enc/waveadjust_fec_cod_fx.c index f10a1bd0b2d1fff339dc2c8f93ef7ffdbbee9067..07fa26b5b7857b408733df7778c2a916c368b493 100644 --- a/lib_enc/waveadjust_fec_cod_fx.c +++ b/lib_enc/waveadjust_fec_cod_fx.c @@ -1,17 +1,16 @@ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include "options.h" /* for wmc_tool */ #include "cnst.h" -//#include "prot_fx.h" -#include "rom_com_fx.h" #include "rom_com.h" #include "stat_com.h" #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ + /*-------------------------------------------------------------------* * SFM_Cal_fx() * diff --git a/lib_isar/isar_MSPred.c b/lib_isar/isar_MSPred.c new file mode 100644 index 0000000000000000000000000000000000000000..aaa26903b5bb6700c23542d1a0d2d9953a41dcc1 --- /dev/null +++ b/lib_isar/isar_MSPred.c @@ -0,0 +1,490 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include "isar_rom_lcld_tables.h" +#include "isar_lcld_prot.h" +#include "isar_prot.h" +#include "wmc_auto.h" +#include "basop_util.h" +#include "enh64.h" +#include + + +/*-------------------------------------------------------------------* + * Function cplxmult() + * + * + *-------------------------------------------------------------------*/ + +void cplxmult_fx( + Word32 *pr1, + Word32 *pi1, + const Word32 r2, + const Word32 i2 ) +{ + Word32 r1 = *pr1, i1 = *pi1; + + *pr1 = L_sub( Mpy_32_32( r1, r2 ), Mpy_32_32( i1, i2 ) ); + *pi1 = L_add( Mpy_32_32( r1, i2 ), Mpy_32_32( i1, r2 ) ); + + return; +} + + +/*-------------------------------------------------------------------* + * Function quantPhase() + * + * + *-------------------------------------------------------------------*/ + +Word32 quantPhase_fx( + const Word32 phase, + const Word16 exp ) // i:31? +{ + Word32 phaseQ; + + // phaseQ = _round(phase * PHASE_QUANT_FACTOR); + phaseQ = L_shr_r( Mpy_32_32( phase, PHASE_QUANT_FACTOR_FX_Q29 ), 29 - exp ); // Q60 + if ( phaseQ == PHASE_MAX_VAL ) + { + phaseQ = PHASE_MIN_VAL; + } + return phaseQ; +} + + +/*-------------------------------------------------------------------* + * Function requantPhase() + * + * + *-------------------------------------------------------------------*/ + +Word32 requantPhase( + Word32 phaseQ ) +{ + + IF( GE_32( phaseQ, PHASE_MAX_VAL ) ) + { + phaseQ = L_add( phaseQ, PHASE_MAX_VAL ); + phaseQ %= ( L_shl( PHASE_MAX_VAL, 1 ) ); + phaseQ = L_sub( phaseQ, PHASE_MAX_VAL ); + } + ELSE IF( LT_32( phaseQ, PHASE_MIN_VAL ) ) + { + phaseQ = L_sub( phaseQ, PHASE_MAX_VAL ); + phaseQ %= ( L_shl( PHASE_MAX_VAL, 1 ) ); + phaseQ = L_add( phaseQ, PHASE_MAX_VAL ); + IF( EQ_32( phaseQ, PHASE_MAX_VAL ) ) + { + phaseQ = PHASE_MIN_VAL; + move32(); + } + } + + return phaseQ; +} + + +/*-------------------------------------------------------------------* + * Function quantPred() + * + * + *-------------------------------------------------------------------*/ + +Word32 quantPred_fx( + const Word32 pred, + const Word16 exp ) // i:Q31 +{ + // int32_t predQ = _round(pred * PRED_QUANT_FACTOR); + Word32 predQ = W_round32_s( W_shl( W_mult_32_32( pred, (Word32) PRED_QUANT_FACTOR ), exp ) ); + predQ = predQ > PRED_MAX_VAL ? PRED_MAX_VAL : predQ; + predQ = predQ < PRED_MIN_VAL ? PRED_MIN_VAL : predQ; + + return predQ; +} + + +/*-------------------------------------------------------------------* + * Function dequantPred() + * + * + *-------------------------------------------------------------------*/ + +Word32 dequantPred_fx( + const Word32 predQ ) +{ + if ( predQ == 12 ) + { + return MAX_32; + } + Word16 tmp_e; + Word32 tmp, value; + if ( predQ == 0 ) + { + return predQ; + } + tmp = BASOP_Util_Divide3216_Scale( predQ, PRED_QUANT_FACTOR_FX, &tmp_e ); + value = L_shl( tmp, sub( 31, negate( add( 1, tmp_e ) ) ) ); // Q31 + return value; +} + + +/*-------------------------------------------------------------------* + * Function PrepEncode() + * + * + *-------------------------------------------------------------------*/ + +Word32 PrepEncode( + Word32 *piQuant, + const Word32 *piMSFlags, + const Word32 numBands ) +{ + Word32 b, numMSBands; + numMSBands = 0; + move32(); + + FOR( b = 0; b < numBands; b++ ) + { + IF( piMSFlags[b] ) + { + piQuant[numMSBands++] = piQuant[b]; + move32(); + } + } + + FOR( b = numMSBands; b < numBands; b++ ) + { + piQuant[b] = 0; + move32(); + } + + return numMSBands; +} + + +/*-------------------------------------------------------------------* + * Function EncodePhase() + * + * + *-------------------------------------------------------------------*/ + +void EncodePhase( + Word32 *phaseQuant, + const Word32 numMSBands, + const Word32 diffDim ) +{ + Word32 b; + + IF( GT_32( diffDim, 0 ) ) + { + Word32 tmp1, tmp2; + tmp1 = phaseQuant[0]; + move32(); + FOR( b = 1; b < numMSBands; b++ ) + { + tmp2 = phaseQuant[b]; + move32(); + phaseQuant[b] = L_sub( phaseQuant[b], tmp1 ); + tmp1 = tmp2; + move32(); + } + } + + IF( GT_32( diffDim, 1 ) ) + { + Word32 tmp1, tmp2; + tmp1 = phaseQuant[1]; + move32(); + FOR( b = 2; b < numMSBands; b++ ) + { + tmp2 = phaseQuant[b]; + move32(); + phaseQuant[b] = L_sub( phaseQuant[b], tmp1 ); + tmp1 = tmp2; + move32(); + } + } + FOR( b = 1; b < numMSBands; b++ ) + { + phaseQuant[b] = requantPhase( phaseQuant[b] ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function DecodePhase() + * + * + *-------------------------------------------------------------------*/ + +void DecodePhase( + Word32 *phaseQuant, + const Word32 numMSBands, + const Word32 diffDim ) +{ + Word32 b; + + IF( GT_32( diffDim, 1 ) ) + { + FOR( b = 2; b < numMSBands; b++ ) + { + phaseQuant[b] = L_add( phaseQuant[b], phaseQuant[b - 1] ); + move32(); + } + } + + IF( GT_32( diffDim, 0 ) ) + { + FOR( b = 1; b < numMSBands; b++ ) + { + phaseQuant[b] = L_add( phaseQuant[b], phaseQuant[b - 1] ); + move32(); + } + } + + FOR( b = 1; b < numMSBands; b++ ) + { + phaseQuant[b] = requantPhase( phaseQuant[b] ); + move32(); + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function EncodePredCoef() + * + * + *-------------------------------------------------------------------*/ + +Word32 EncodePredCoef( + Word32 *predQuant, + const Word32 numMSBands ) +{ + Word32 b, tmp1, tmp2; + + tmp1 = predQuant[0]; + move32(); + FOR( b = 1; b < numMSBands; b++ ) + { + tmp2 = predQuant[b]; + move32(); + predQuant[b] = L_sub( predQuant[b], tmp1 ); + tmp1 = tmp2; + move32(); + } + + return numMSBands; +} + + +/*-------------------------------------------------------------------* + * Function DecodePredCoef() + * + * + *-------------------------------------------------------------------*/ + +void DecodePredCoef( + Word32 *phaseQuant, + const Word32 numMSBands ) +{ + Word32 b; + + FOR( b = 1; b < numMSBands; b++ ) + { + phaseQuant[b] = L_add( phaseQuant[b], phaseQuant[b - 1] ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function CountMSBits() + * + * + *-------------------------------------------------------------------*/ + +Word32 CountMSBits( + Word32 iNumBands, + const Word32 iMSMode, + const Word32 *piMSFlags, + const Word32 *piLRPhaseDiff, + const Word32 *piMSPredCoef ) +{ + Word32 iBitsWritten = 0; + move32(); + Word32 b; + Word32 anyNonZero; + Word32 iNumMSBands = 0; + move32(); + Word32 piPhaseCopy[MAX_BANDS_48]; + Word32 piPredCopy[MAX_BANDS_48]; + + FOR( b = 0; b < MAX_BANDS_48; b++ ) + { + piPhaseCopy[b] = 0; + move32(); + piPredCopy[b] = 0; + move32(); + } + + iBitsWritten = L_add( iBitsWritten, 2 ); /* iMSMode */ + FOR( b = 0; b < iNumBands; b++ ) + { + iNumMSBands = L_add( iNumMSBands, NE_32( piMSFlags[b], 0 ) ); + } + + IF( EQ_32( iNumMSBands, 0 ) ) + { + return iBitsWritten; + } + + IF( LT_32( iNumMSBands, iNumBands ) ) + { + iBitsWritten = L_add( iBitsWritten, iNumBands ); /* piMSFlags */ + } + + IF( LT_32( iMSMode, 3 ) ) + { + return iBitsWritten; + } + + /* prepare arrays for coding evaluation */ + FOR( b = 0; b < iNumBands; b++ ) + { + piPhaseCopy[b] = piLRPhaseDiff[b]; + move32(); + piPredCopy[b] = piMSPredCoef[b]; + move32(); + } + + /* Differential Coding of Phase Data*/ + PrepEncode( piPhaseCopy, piMSFlags, iNumBands ); + PrepEncode( piPredCopy, piMSFlags, iNumBands ); + EncodePhase( piPhaseCopy, iNumMSBands, PHASE_DIFF_DIM ); + EncodePredCoef( piPredCopy, iNumMSBands ); + + iBitsWritten = L_add( iBitsWritten, 1 ); /* iMSPredAll */ + anyNonZero = 0; /* phase */ + move32(); + FOR( b = 0; b < iNumMSBands; b++ ) + { + IF( NE_32( piPhaseCopy[b], 0 ) ) + { + anyNonZero = 1; + move32(); + BREAK; + } + } + iBitsWritten = L_add( iBitsWritten, 1 ); /*anyNonZero Phase*/ + IF( anyNonZero ) + { + iBitsWritten = L_add( iBitsWritten, PHASE_BAND0_BITS ); + FOR( b = 1; b < iNumMSBands; b++ ) + { + Word32 tabIdx = L_sub( piPhaseCopy[b], ENV_DELTA_MIN ); + iBitsWritten = L_add( iBitsWritten, c_aaiRMSEnvHuffEnc[tabIdx][0] ); + } + } + anyNonZero = 0; /* prediction */ + move32(); + FOR( b = 0; b < iNumMSBands; b++ ) + { + IF( NE_32( piPredCopy[b], 0 ) ) + { + anyNonZero = 1; + move32(); + break; + } + } + + iBitsWritten = L_add( iBitsWritten, 1 ); /* any nonZero Pred */ + IF( anyNonZero ) + { + iBitsWritten = L_add( iBitsWritten, PRED_BAND0_BITS ); + FOR( b = 1; b < iNumMSBands; b++ ) + { + Word32 tabIdx = L_sub( piPredCopy[b], ENV_DELTA_MIN ); + iBitsWritten = L_add( iBitsWritten, c_aaiRMSEnvHuffEnc[tabIdx][0] ); + } + } + + return iBitsWritten; +} + + +#ifdef DEBUG_WRITE_MS_PRED +void writeMSPred( + int32_t *phaseQuant, + int32_t *predQuant, + int32_t MSMode, + int32_t numMSBands, + int32_t numBands, + void *fid, + int32_t *piMsFlags ) +{ + int32_t b; + + fid = (FILE *) fid; + fprintf( fid, "%d %d", MSMode, numMSBands ); + for ( b = 0; b < numMSBands; b++ ) + { + fprintf( fid, " %d", phaseQuant[b] ); + } + for ( b = numMSBands; b < numBands; b++ ) + { + fprintf( fid, " %d", 0 ); + } + for ( b = 0; b < numMSBands; b++ ) + { + fprintf( fid, " %d", predQuant[b] ); + } + for ( b = numMSBands; b < numBands; b++ ) + { + fprintf( fid, " %d", 0 ); + } + for ( b = 0; b < numBands; b++ ) + { + fprintf( fid, " %d", piMsFlags[b] ); + } + fprintf( fid, "\n" ); + + return; +} +#endif diff --git a/lib_util/test_fft.c b/lib_isar/isar_NoiseGen.c similarity index 82% rename from lib_util/test_fft.c rename to lib_isar/isar_NoiseGen.c index 1b52fe3512080b239eba547175ecc7bd3e758bfc..363e758fffbdd642dc3aa4061bd3ee6ac13e2853 100644 --- a/lib_util/test_fft.c +++ b/lib_isar/isar_NoiseGen.c @@ -30,22 +30,26 @@ *******************************************************************************************************/ -#include -#include -#include #include +#include "options.h" #include -#include -#include "assert.h" -#include "basop32.h" +#include "prot_fx.h" +#include "isar_lcld_prot.h" +#include "wmc_auto.h" -#define ALLOWED_DEVIATION ( 0.005 ) -#define Q31 ( 2147483647.0f ) -#ifndef min -#define min( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) -#endif +/*------------------------------------------------------------------------------------------* + * Function DeleteNoiseGen() + * + * + *------------------------------------------------------------------------------------------*/ -#ifndef max -#define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) -#endif +void DeleteNoiseGen( NoiseGen *psNoiseGen ) +{ + free( psNoiseGen->pfNoiseBuffer ); + free( psNoiseGen ); + + return; +} + +extern Word32 GetNoise_fx( NoiseGen *psNoiseGen ); diff --git a/lib_isar/isar_PerceptualModel.c b/lib_isar/isar_PerceptualModel.c new file mode 100644 index 0000000000000000000000000000000000000000..54265bc5ee5e06f9c14e79296fa5db35f42cb592 --- /dev/null +++ b/lib_isar/isar_PerceptualModel.c @@ -0,0 +1,473 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "isar_lcld_prot.h" +#include "prot_fx.h" +#include "isar_rom_lcld_tables.h" +#include +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ +#define PERCEPTUAL_MODEL_SCALE_SHIFT ( 6 ) +#define PERCEPTUAL_MODEL_SCALE ( 64 ) +#define PERCEPTUAL_MODEL_SCALE_SHIFT ( 6 ) +#define PERCEPTUAL_MODEL_ALPHA_SCALE ( 614 ) +#define PERCEPTUAL_MODEL_ALPHA_INV_SCALE ( 6827 ) +#define PERCEPTUAL_MODEL_ALPHA_SHIFT ( 11 ) + +/*------------------------------------------------------------------------------------------* + * Function LogAdd() + * + * + *------------------------------------------------------------------------------------------*/ + +static inline Word16 LogAdd_fx( + const Word16 iVal1, + const Word16 iVal2 ) +{ + Word16 iRetVal; + + IF( iVal1 > iVal2 ) + { + iRetVal = sub( iVal1, iVal2 ); + move16(); + iRetVal = ( iRetVal < sub( LOG_ADD_TABLE_LENGTH, 1 ) ) ? iRetVal : sub( LOG_ADD_TABLE_LENGTH, 1 ); + move16(); + iRetVal = add( iVal1, c_aiLogAddTable_fx[iRetVal] ); + move16(); + } + ELSE + { + iRetVal = sub( iVal2, iVal1 ); + move16(); + iRetVal = ( iRetVal < sub( LOG_ADD_TABLE_LENGTH, 1 ) ) ? iRetVal : sub( LOG_ADD_TABLE_LENGTH, 1 ); + move16(); + iRetVal = add( iVal2, c_aiLogAddTable_fx[iRetVal] ); + move16(); + } + + return iRetVal; +} + + +/*------------------------------------------------------------------------------------------* + * Function LogAdd() + * + * + *------------------------------------------------------------------------------------------*/ + +static inline Word32 LogAdd( + const Word32 iVal1, + const Word32 iVal2 ) +{ + Word32 iRetVal; + + if ( iVal1 > iVal2 ) + { + iRetVal = iVal1 - iVal2; + iRetVal = ( iRetVal < ( LOG_ADD_TABLE_LENGTH - 1 ) ) ? iRetVal : ( LOG_ADD_TABLE_LENGTH - 1 ); + iRetVal = iVal1 + c_aiLogAddTable[iRetVal]; + } + else + { + iRetVal = iVal2 - iVal1; + iRetVal = ( iRetVal < ( LOG_ADD_TABLE_LENGTH - 1 ) ) ? iRetVal : ( LOG_ADD_TABLE_LENGTH - 1 ); + iRetVal = iVal2 + c_aiLogAddTable[iRetVal]; + } + + return iRetVal; +} + + +/*------------------------------------------------------------------------------------------* + * Function PerceptualModel() + * + * + *------------------------------------------------------------------------------------------*/ + +void PerceptualModel_fx( + const Word32 iMaxQuantBands, + const Word32 *piRMSEnvelope, + Word32 *piExcitation, + Word32 *piSMR ) +{ + Word16 n; + + FOR( n = 0; n < iMaxQuantBands; n++ ) + { + Word16 iSLOffset; + + piExcitation[n] = shl( add( extract_l( piRMSEnvelope[n] ), c_aiBandwidthAdjust48_fx[n] ), PERCEPTUAL_MODEL_SCALE_SHIFT ); // shift instead of multiplying by PERCEPTUAL_MODEL_SCALE + move16(); + /* Calculate sensation level offset */ + iSLOffset = (Word16) extract_l( L_shr( L_mult0( c_aiDefaultTheta48_fx[n], sub( extract_l( piExcitation[n] ), c_aiAbsoluteThresh48_fx[n] ) ), PERCEPTUAL_MODEL_SLGAIN_SHIFT ) ); + // iSLOffset = (iSLOffset > 0) ? iSLOffset : 0; + move16(); + /* Offset envelope by sensation level offset */ + piExcitation[n] = sub( extract_l( piExcitation[n] ), iSLOffset ); + move16(); + /* Convert to loudness domain (x^0.3) */ + piExcitation[n] = extract_l( L_shr( L_mult0( PERCEPTUAL_MODEL_ALPHA_SCALE, extract_l( piExcitation[n] ) ), PERCEPTUAL_MODEL_ALPHA_SHIFT ) ); + move16(); + } + + /* Spread excitation function */ + FOR( n = 0; n < iMaxQuantBands; n++ ) + { + Word16 k; + const Word16 *piSpread; + + piSpread = &c_aaiSpreadFunction48_fx[n * MAX_BANDS_48]; + move16(); + piSMR[n] = add( extract_l( piExcitation[n] ), piSpread[n] ); + move16(); + FOR( k = 0; k < iMaxQuantBands; k++ ) + { + IF( NE_16( k, n ) ) + { + piSMR[n] = L_deposit_l( LogAdd_fx( extract_l( piSMR[n] ), add( extract_l( piExcitation[k] ), piSpread[k] ) ) ); + move16(); + } + } + } + + FOR( n = 0; n < iMaxQuantBands; n++ ) + { + piSMR[n] = extract_l( L_shr( L_mult0( PERCEPTUAL_MODEL_ALPHA_INV_SCALE, extract_l( piSMR[n] ) ), PERCEPTUAL_MODEL_ALPHA_SHIFT ) ); + move16(); + piSMR[n] = shl( sub( add( extract_l( piRMSEnvelope[n] ), c_aiBandwidthAdjust48_fx[n] ), extract_l( piSMR[n] ) ), PERCEPTUAL_MODEL_SCALE_SHIFT ); + move16(); + } + + return; +} +/*------------------------------------------------------------------------------------------* + * Function PerceptualModel() + * + * + *------------------------------------------------------------------------------------------*/ + +void PerceptualModel( + const Word32 iMaxQuantBands, + const Word32 *piRMSEnvelope, + Word32 *piExcitation, + Word32 *piSMR ) +{ + Word32 n; + + for ( n = 0; n < iMaxQuantBands; n++ ) + { + Word32 iSLOffset; + + piExcitation[n] = PERCEPTUAL_MODEL_SCALE * piRMSEnvelope[n] + c_aiBandwidthAdjust48[n]; + + /* Calculate sensation level offset */ + iSLOffset = c_aiDefaultTheta48[n] * ( piExcitation[n] - c_aiAbsoluteThresh48[n] ) >> PERCEPTUAL_MODEL_SLGAIN_SHIFT; + // iSLOffset = (iSLOffset > 0) ? iSLOffset : 0; + + /* Offset envelope by sensation level offset */ + piExcitation[n] -= iSLOffset; + + /* Convert to loudness domain (x^0.3) */ + piExcitation[n] = PERCEPTUAL_MODEL_ALPHA_SCALE * piExcitation[n] >> PERCEPTUAL_MODEL_ALPHA_SHIFT; + } + + /* Spread excitation function */ + for ( n = 0; n < iMaxQuantBands; n++ ) + { + Word32 k; + const Word32 *piSpread; + + piSpread = &c_aaiSpreadFunction48[n * MAX_BANDS_48]; + piSMR[n] = piExcitation[n] + piSpread[n]; + for ( k = 0; k < iMaxQuantBands; k++ ) + { + if ( k != n ) + { + piSMR[n] = LogAdd( piSMR[n], piExcitation[k] + piSpread[k] ); + } + } + } + + for ( n = 0; n < iMaxQuantBands; n++ ) + { + piSMR[n] = PERCEPTUAL_MODEL_ALPHA_INV_SCALE * piSMR[n] >> PERCEPTUAL_MODEL_ALPHA_SHIFT; + piSMR[n] = PERCEPTUAL_MODEL_SCALE * piRMSEnvelope[n] + c_aiBandwidthAdjust48[n] - piSMR[n]; + } + + return; +} + + +/*------------------------------------------------------------------------------------------* + * Function PerceptualModelStereo() + * + * + *------------------------------------------------------------------------------------------*/ + +void PerceptualModelStereo( + const Word32 iMaxQuantBands, + const Word32 *piMSFlags, + const Word32 *piRMSEnvelope0, + const Word32 *piRMSEnvelope1, + Word32 *piExcitation0, + Word32 *piExcitation1, + Word32 *piSMR0, + Word32 *piSMR1 ) +{ + Word32 n; + + for ( n = 0; n < iMaxQuantBands; n++ ) + { + Word32 iMaxRMSEnv; + Word32 iSLOffset; + + iMaxRMSEnv = piRMSEnvelope0[n]; + + piExcitation0[n] = PERCEPTUAL_MODEL_SCALE * iMaxRMSEnv + c_aiBandwidthAdjust48[n]; /* piRMSEnvelope0[n] */ + + /* Calculate sensation level offset */ + iSLOffset = c_aiDefaultTheta48[n] * ( piExcitation0[n] - c_aiAbsoluteThresh48[n] ) >> PERCEPTUAL_MODEL_SLGAIN_SHIFT; + // iSLOffset = (iSLOffset > 0) ? iSLOffset : 0; + + /* Offset envelope by sensation level offset */ + piExcitation0[n] -= iSLOffset; + + /* Convert to loudness domain (x^0.3) */ + piExcitation0[n] = PERCEPTUAL_MODEL_ALPHA_SCALE * piExcitation0[n] >> PERCEPTUAL_MODEL_ALPHA_SHIFT; + } + + /* Spread excitation function */ + for ( n = 0; n < iMaxQuantBands; n++ ) + { + Word32 k; + const Word32 *piSpread; + + piSpread = &c_aaiSpreadFunction48[n * MAX_BANDS_48]; + piSMR0[n] = piExcitation0[n] + piSpread[n]; + for ( k = 0; k < iMaxQuantBands; k++ ) + { + if ( k != n ) + { + piSMR0[n] = LogAdd( piSMR0[n], piExcitation0[k] + piSpread[k] ); + } + } + } + + for ( n = 0; n < iMaxQuantBands; n++ ) + { + Word32 iMaxRMSEnv; + Word32 iSLOffset; + + iMaxRMSEnv = piRMSEnvelope1[n]; + + piExcitation1[n] = PERCEPTUAL_MODEL_SCALE * iMaxRMSEnv + c_aiBandwidthAdjust48[n]; /* piRMSEnvelope1[n] */ + + /* Calculate sensation level offset */ + iSLOffset = c_aiDefaultTheta48[n] * ( piExcitation1[n] - c_aiAbsoluteThresh48[n] ) >> PERCEPTUAL_MODEL_SLGAIN_SHIFT; + // iSLOffset = (iSLOffset > 0) ? iSLOffset : 0; + + /* Offset envelope by sensation level offset */ + piExcitation1[n] -= iSLOffset; + + /* Convert to loudness domain (x^0.3) */ + piExcitation1[n] = PERCEPTUAL_MODEL_ALPHA_SCALE * piExcitation1[n] >> PERCEPTUAL_MODEL_ALPHA_SHIFT; + } + + /* Spread excitation function */ + for ( n = 0; n < iMaxQuantBands; n++ ) + { + Word32 k; + const Word32 *piSpread; + + piSpread = &c_aaiSpreadFunction48[n * MAX_BANDS_48]; + piSMR1[n] = piExcitation1[n] + piSpread[n]; + for ( k = 0; k < iMaxQuantBands; k++ ) + { + if ( k != n ) + { + piSMR1[n] = LogAdd( piSMR1[n], piExcitation1[k] + piSpread[k] ); + } + } + } + + for ( n = 0; n < iMaxQuantBands; n++ ) + { + if ( piMSFlags[n] == 1 ) + { + piSMR0[n] = ( piSMR0[n] > piSMR1[n] ) ? piSMR0[n] : piSMR1[n]; + piSMR1[n] = piSMR0[n]; + } + } + + for ( n = 0; n < iMaxQuantBands; n++ ) + { + piSMR0[n] = PERCEPTUAL_MODEL_ALPHA_INV_SCALE * piSMR0[n] >> PERCEPTUAL_MODEL_ALPHA_SHIFT; + piSMR0[n] = PERCEPTUAL_MODEL_SCALE * piRMSEnvelope0[n] + c_aiBandwidthAdjust48[n] - piSMR0[n]; + } + + for ( n = 0; n < iMaxQuantBands; n++ ) + { + piSMR1[n] = PERCEPTUAL_MODEL_ALPHA_INV_SCALE * piSMR1[n] >> PERCEPTUAL_MODEL_ALPHA_SHIFT; + piSMR1[n] = PERCEPTUAL_MODEL_SCALE * piRMSEnvelope1[n] + c_aiBandwidthAdjust48[n] - piSMR1[n]; + } + + return; +} +void PerceptualModelStereo_fx( + const Word32 iMaxQuantBands, + const Word32 *piMSFlags, + const Word32 *piRMSEnvelope0, + const Word32 *piRMSEnvelope1, + Word32 *piExcitation0, + Word32 *piExcitation1, + Word32 *piSMR0, + Word32 *piSMR1 ) +{ + Word16 n; + + FOR( n = 0; n < iMaxQuantBands; n++ ) + { + Word16 iMaxRMSEnv; + Word16 iSLOffset; + + iMaxRMSEnv = extract_l( piRMSEnvelope0[n] ); + move16(); + piExcitation0[n] = add( shl( iMaxRMSEnv, PERCEPTUAL_MODEL_SCALE_SHIFT ), c_aiBandwidthAdjust48_fx[n] ); /* piRMSEnvelope0[n] */ + move16(); + /* Calculate sensation level offset */ + iSLOffset = extract_l( L_shr( L_mult0( c_aiDefaultTheta48_fx[n], sub( extract_l( piExcitation0[n] ), c_aiAbsoluteThresh48_fx[n] ) ), PERCEPTUAL_MODEL_SLGAIN_SHIFT ) ); + // iSLOffset = (iSLOffset > 0) ? iSLOffset : 0; + move16(); + /* Offset envelope by sensation level offset */ + piExcitation0[n] = sub( extract_l( piExcitation0[n] ), iSLOffset ); + move16(); + /* Convert to loudness domain (x^0.3) */ + piExcitation0[n] = extract_l( L_shr( L_mult0( PERCEPTUAL_MODEL_ALPHA_SCALE, extract_l( piExcitation0[n] ) ), PERCEPTUAL_MODEL_ALPHA_SHIFT ) ); + move16(); + } + + /* Spread excitation function */ + for ( n = 0; n < iMaxQuantBands; n++ ) + { + Word16 k; + const Word16 *piSpread; + + piSpread = &c_aaiSpreadFunction48_fx[n * MAX_BANDS_48]; + move16(); + piSMR0[n] = add( extract_l( piExcitation0[n] ), piSpread[n] ); + move16(); + FOR( k = 0; k < iMaxQuantBands; k++ ) + { + IF( NE_16( k, n ) ) + { + piSMR0[n] = L_deposit_l( LogAdd_fx( extract_l( piSMR0[n] ), add( extract_l( piExcitation0[k] ), piSpread[k] ) ) ); + move16(); + } + } + } + + FOR( n = 0; n < iMaxQuantBands; n++ ) + { + Word16 iMaxRMSEnv; + Word16 iSLOffset; + + iMaxRMSEnv = extract_l( piRMSEnvelope1[n] ); + move16(); + piExcitation1[n] = add( shl( iMaxRMSEnv, PERCEPTUAL_MODEL_SCALE_SHIFT ), c_aiBandwidthAdjust48_fx[n] ); /* piRMSEnvelope1[n] */ + move16(); + /* Calculate sensation level offset */ + iSLOffset = extract_l( L_shr( L_mult0( c_aiDefaultTheta48_fx[n], sub( extract_l( piExcitation1[n] ), c_aiAbsoluteThresh48_fx[n] ) ), PERCEPTUAL_MODEL_SLGAIN_SHIFT ) ); + // iSLOffset = (iSLOffset > 0) ? iSLOffset : 0; + move16(); + /* Offset envelope by sensation level offset */ + piExcitation1[n] = sub( extract_l( piExcitation1[n] ), iSLOffset ); + move16(); + /* Convert to loudness domain (x^0.3) */ + piExcitation1[n] = extract_l( L_shr( L_mult0( PERCEPTUAL_MODEL_ALPHA_SCALE, extract_l( piExcitation1[n] ) ), PERCEPTUAL_MODEL_ALPHA_SHIFT ) ); + move16(); + } + + /* Spread excitation function */ + FOR( n = 0; n < iMaxQuantBands; n++ ) + { + Word16 k; + const Word16 *piSpread; + + piSpread = &c_aaiSpreadFunction48_fx[n * MAX_BANDS_48]; + move16(); + piSMR1[n] = add( extract_l( piExcitation1[n] ), piSpread[n] ); + move16(); + FOR( k = 0; k < iMaxQuantBands; k++ ) + { + IF( NE_16( k, n ) ) + { + piSMR1[n] = LogAdd_fx( extract_l( piSMR1[n] ), add( extract_l( piExcitation1[k] ), piSpread[k] ) ); + move16(); + } + } + } + + FOR( n = 0; n < iMaxQuantBands; n++ ) + { + IF( EQ_16( extract_l( piMSFlags[n] ), 1 ) ) + { + piSMR0[n] = ( piSMR0[n] > piSMR1[n] ) ? piSMR0[n] : piSMR1[n]; + move16(); + piSMR1[n] = piSMR0[n]; + move16(); + } + } + + FOR( n = 0; n < iMaxQuantBands; n++ ) + { + piSMR0[n] = extract_l( L_shr( L_mult0( PERCEPTUAL_MODEL_ALPHA_INV_SCALE, extract_l( piSMR0[n] ) ), PERCEPTUAL_MODEL_ALPHA_SHIFT ) ); + move16(); + piSMR0[n] = sub( add( shl( extract_l( piRMSEnvelope0[n] ), PERCEPTUAL_MODEL_SCALE_SHIFT ), c_aiBandwidthAdjust48_fx[n] ), extract_l( piSMR0[n] ) ); + move16(); + } + + FOR( n = 0; n < iMaxQuantBands; n++ ) + { + piSMR1[n] = extract_l( L_shr( L_mult0( PERCEPTUAL_MODEL_ALPHA_INV_SCALE, extract_l( piSMR1[n] ) ), PERCEPTUAL_MODEL_ALPHA_SHIFT ) ); + move16(); + piSMR1[n] = sub( add( shl( extract_l( piRMSEnvelope1[n] ), PERCEPTUAL_MODEL_SCALE_SHIFT ), c_aiBandwidthAdjust48_fx[n] ), extract_l( piSMR1[n] ) ); + move16(); + } + + return; +} diff --git a/lib_isar/isar_PredDecoder.c b/lib_isar/isar_PredDecoder.c new file mode 100644 index 0000000000000000000000000000000000000000..f6e031e451b2619942131ef3c62dc3609f0c66b9 --- /dev/null +++ b/lib_isar/isar_PredDecoder.c @@ -0,0 +1,516 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "prot_fx.h" +#include "isar_prot.h" +#include "isar_lcld_prot.h" +#include "isar_rom_lcld_tables.h" +#include "wmc_auto.h" + +/*-------------------------------------------------------------------* + * Function CreatePredictionDecoder() + * + * + *-------------------------------------------------------------------*/ + +ivas_error CreatePredictionDecoder_fx( + PredictionDecoder **psPredictionDecoder_out, + const Word32 iChannels, + const Word32 iNumBlocks ) +{ + Word16 n; + Word16 m; + PredictionDecoder *psPredictionDecoder = NULL; + + IF( ( psPredictionDecoder = (PredictionDecoder *) malloc( sizeof( PredictionDecoder ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + psPredictionDecoder->iChannels = iChannels; + move32(); + psPredictionDecoder->iNumBlocks = iNumBlocks; + move32(); + psPredictionDecoder->iNumSubSets = LCLD_BLOCKS_PER_FRAME / psPredictionDecoder->iNumBlocks; + move32(); + psPredictionDecoder->iSubSetId = 0; + move32(); + /* PLC_IMPROVEMENT */ + IF( ( psPredictionDecoder->ppiDecodingFailedPrev = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppiDecodingFailed = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppiDecodingUnresolved = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + FOR( n = 0; n < iChannels; n++ ) + { + Word32 k; + IF( ( psPredictionDecoder->ppiDecodingUnresolved[n] = (Word32 *) malloc( sizeof( Word32 ) * LCLD_MAX_NUM_PRED_SUBSETS ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppiDecodingFailed[n] = (Word32 *) malloc( sizeof( Word32 ) * LCLD_MAX_NUM_PRED_SUBSETS ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppiDecodingFailedPrev[n] = (Word32 *) malloc( sizeof( Word32 ) * LCLD_MAX_NUM_PRED_SUBSETS ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + FOR( k = 0; k < LCLD_MAX_NUM_PRED_SUBSETS; k++ ) + { + psPredictionDecoder->ppiDecodingUnresolved[n][k] = 0; + move32(); + psPredictionDecoder->ppiDecodingFailed[n][k] = 0; + move32(); + psPredictionDecoder->ppiDecodingFailedPrev[n][k] = 0; + move32(); + } + } + IF( ( psPredictionDecoder->piPredChanEnable = (Word32 *) malloc( sizeof( Word32 ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppiPredBandEnable = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppfA1Real_fx = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppfA1Imag_fx = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppiA1Mag = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppiA1Phase = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppfPredStateReal_fx = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppfPredStateImag_fx = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + + FOR( n = 0; n < psPredictionDecoder->iChannels; n++ ) + { + psPredictionDecoder->piPredChanEnable[n] = 0; + move32(); + IF( ( psPredictionDecoder->ppiPredBandEnable[n] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + FOR( m = 0; m < LCLD_BANDS; m++ ) + { + psPredictionDecoder->ppiPredBandEnable[n][m] = 0; + move32(); + } + IF( ( psPredictionDecoder->ppfA1Real_fx[n] = (Word32 *) malloc( sizeof( Word32 ) * LCLD_BANDS ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppfA1Imag_fx[n] = (Word32 *) malloc( sizeof( Word32 ) * LCLD_BANDS ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppiA1Mag[n] = (Word32 *) malloc( sizeof( Word32 ) * LCLD_BANDS ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppiA1Phase[n] = (Word32 *) malloc( sizeof( Word32 ) * LCLD_BANDS ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppfPredStateReal_fx[n] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionDecoder Module \n" ) ); + } + IF( ( psPredictionDecoder->ppfPredStateImag_fx[n] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionDecoder Module \n" ) ); + } + FOR( m = 0; m < LCLD_BANDS; m++ ) + { + psPredictionDecoder->ppfPredStateReal_fx[n][m] = 0; + move32(); + psPredictionDecoder->ppfPredStateImag_fx[n][m] = 0; + move32(); + } + } + + /* pre-define these tables? */ + + FOR( n = 0; n < ( 1 << PRED_QUNAT_FILTER_MAG_BITS ); n++ ) + { + psPredictionDecoder->pfMagLUT_fx[n] = c_pfMagLUT[n]; /* Q31 */ + move32(); + } + + FOR( n = 0; n < ( 1 << PRED_QUANT_FILTER_PHASE_BITS ); n++ ) + { + psPredictionDecoder->pfP2RRealLUT_fx[n] = c_pfP2RRealLUT[n]; /* Q31 */ + move32(); + psPredictionDecoder->pfP2RImagLUT_fx[n] = c_pfP2RImagLUT[n]; /* Q31 */ + move32(); + } + + *psPredictionDecoder_out = psPredictionDecoder; + + return IVAS_ERR_OK; +} + +/*-------------------------------------------------------------------* + * Function DeletePredictionDecoder() + * + * + *-------------------------------------------------------------------*/ + +void DeletePredictionDecoder_fx( + PredictionDecoder *psPredictionDecoder ) +{ + Word32 n; + + FOR( n = 0; n < psPredictionDecoder->iChannels; n++ ) + { + free( psPredictionDecoder->ppiPredBandEnable[n] ); + free( psPredictionDecoder->ppfA1Real_fx[n] ); + free( psPredictionDecoder->ppfA1Imag_fx[n] ); + free( psPredictionDecoder->ppiA1Mag[n] ); + free( psPredictionDecoder->ppiA1Phase[n] ); + free( psPredictionDecoder->ppfPredStateReal_fx[n] ); + free( psPredictionDecoder->ppfPredStateImag_fx[n] ); + free( psPredictionDecoder->ppiDecodingUnresolved[n] ); + free( psPredictionDecoder->ppiDecodingFailed[n] ); + free( psPredictionDecoder->ppiDecodingFailedPrev[n] ); + } + free( psPredictionDecoder->piPredChanEnable ); + free( psPredictionDecoder->ppiPredBandEnable ); + free( psPredictionDecoder->ppfA1Real_fx ); + free( psPredictionDecoder->ppfA1Imag_fx ); + free( psPredictionDecoder->ppiA1Mag ); + free( psPredictionDecoder->ppiA1Phase ); + free( psPredictionDecoder->ppfPredStateReal_fx ); + free( psPredictionDecoder->ppfPredStateImag_fx ); + /* PLC_IMPROVEMENT */ + free( psPredictionDecoder->ppiDecodingUnresolved ); + free( psPredictionDecoder->ppiDecodingFailed ); + free( psPredictionDecoder->ppiDecodingFailedPrev ); + + free( psPredictionDecoder ); + psPredictionDecoder = NULL; + + return; +} + + +/*-------------------------------------------------------------------* + * Function ReadPredictors() + * + * + *-------------------------------------------------------------------*/ + +Word16 ReadPredictors_fx( + PredictionDecoder *psPredictionDecoder, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word16 iBitsRead = 0; + Word32 c; + Word32 b; + Word16 iNumPredBandBits = 6; + const Word16 iSubSetBits = ( GT_32( LCLD_MAX_NUM_PRED_SUBSETS, 4 ) ? 3 : 2 ); + move16(); + move16(); + move16(); + + psPredictionDecoder->iNumSubSets = L_add( ISAR_SPLIT_REND_BITStream_read_int32( pBits, iSubSetBits ), 1 ); + iBitsRead = add( iBitsRead, iSubSetBits ); + + IF( GT_32( psPredictionDecoder->iNumSubSets, 1 ) ) + { + psPredictionDecoder->iSubSetId = ISAR_SPLIT_REND_BITStream_read_int32( pBits, iSubSetBits ); + iBitsRead = add( iBitsRead, iSubSetBits ); + iNumPredBandBits = ( GE_32( psPredictionDecoder->iNumSubSets, 4 ) ? 4 : 5 ); + move16(); + } + ELSE + { + psPredictionDecoder->iSubSetId = 0; + move32(); + } + FOR( c = 0; c < psPredictionDecoder->iChannels; c++ ) + { + psPredictionDecoder->piPredChanEnable[c] = ISAR_SPLIT_REND_BITStream_read_int32( pBits, psPredictionDecoder->iNumSubSets ); + move32(); + iBitsRead = add( iBitsRead, (Word16) psPredictionDecoder->iNumSubSets ); + + IF( get_bit( psPredictionDecoder->piPredChanEnable[c], psPredictionDecoder->iSubSetId ) ) + { + Word32 b0 = psPredictionDecoder->iSubSetId; + Word32 bstep = psPredictionDecoder->iNumSubSets; + Word32 iNumPredBands; + move32(); + move32(); + + FOR( b = b0; b < LCLD_BANDS; b = L_add( b, bstep ) ) + { + psPredictionDecoder->ppiPredBandEnable[c][b] = 0; + move32(); + } + iNumPredBands = ISAR_SPLIT_REND_BITStream_read_int32( pBits, iNumPredBandBits ); + iBitsRead = add( iBitsRead, iNumPredBandBits ); + iNumPredBands = L_add( L_mult0( (Word16) iNumPredBands, (Word16) psPredictionDecoder->iNumSubSets ), b0 ); + + FOR( b = b0; b < iNumPredBands; b = L_add( b, bstep ) ) + { + psPredictionDecoder->ppiPredBandEnable[c][b] = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); + move32(); + iBitsRead = add( iBitsRead, 1 ); + + IF( EQ_32( psPredictionDecoder->ppiPredBandEnable[c][b], 1 ) ) + { + Word32 iA1Mag; + Word32 iA1Phase; + Word32 fA1Real; + Word32 fA1Imag; + iA1Mag = ISAR_SPLIT_REND_BITStream_read_int32( pBits, PRED_QUNAT_FILTER_MAG_BITS ); + iBitsRead = add( iBitsRead, PRED_QUNAT_FILTER_MAG_BITS ); + iA1Phase = ISAR_SPLIT_REND_BITStream_read_int32( pBits, PRED_QUANT_FILTER_PHASE_BITS ); + iBitsRead = add( iBitsRead, PRED_QUANT_FILTER_PHASE_BITS ); + + psPredictionDecoder->ppiA1Mag[c][b] = iA1Mag; + move32(); + psPredictionDecoder->ppiA1Phase[c][b] = L_add( iA1Phase, PRED_QUANT_FILTER_PHASE_MIN ); + move32(); + + fA1Real = Mpy_32_32( psPredictionDecoder->pfMagLUT_fx[iA1Mag], psPredictionDecoder->pfP2RRealLUT_fx[iA1Phase] ); /* Q31 */ + fA1Imag = Mpy_32_32( psPredictionDecoder->pfMagLUT_fx[iA1Mag], psPredictionDecoder->pfP2RImagLUT_fx[iA1Phase] ); /* Q31 */ + + psPredictionDecoder->ppfA1Real_fx[c][b] = fA1Real; /* Q31 */ + move32(); + psPredictionDecoder->ppfA1Imag_fx[c][b] = fA1Imag; /* Q31 */ + move32(); + } + } + } + } + + /* disable any inactive prediction bands */ + FOR( c = 0; c < psPredictionDecoder->iChannels; c++ ) + { + Word32 set; + FOR( set = 0; set < psPredictionDecoder->iNumSubSets; set++ ) + { + IF( !get_bit( psPredictionDecoder->piPredChanEnable[c], set ) ) + { + FOR( b = set; b < LCLD_BANDS; b = L_add( b, psPredictionDecoder->iNumSubSets ) ) + { + psPredictionDecoder->ppiPredBandEnable[c][b] = 0; + move32(); + } + } + } + } + + return iBitsRead; +} + + +/* PLC_IMPROVEMENT */ +void SetDecodingPassed( + PredictionDecoder *psPredictionDecoder ) +{ + Word32 n, ch; + + for ( ch = 0; ch < psPredictionDecoder->iChannels; ch++ ) + { + for ( n = 0; n < psPredictionDecoder->iNumSubSets; n++ ) + { + psPredictionDecoder->ppiDecodingFailed[ch][n] = 0; + } + } + + return; +} + + +Word32 AnyDecodingUnresolved( + PredictionDecoder *psPredictionDecoder ) +{ + Word32 n, ch; + + for ( ch = 0; ch < psPredictionDecoder->iChannels; ch++ ) + { + for ( n = 0; n < psPredictionDecoder->iNumSubSets; n++ ) + { + if ( psPredictionDecoder->ppiDecodingUnresolved[ch][n] == 1 ) + { + return 1; + } + } + } + + return 0; +} + + +void UpdateDecodingFailedStatus( + PredictionDecoder *psPredictionDecoder ) +{ + Word32 n, ch; + + for ( ch = 0; ch < psPredictionDecoder->iChannels; ch++ ) + { + for ( n = 0; n < psPredictionDecoder->iNumSubSets; n++ ) + { + psPredictionDecoder->ppiDecodingFailedPrev[ch][n] = psPredictionDecoder->ppiDecodingFailed[ch][n]; + } + } + + return; +} + + +void UpdateDecodingUnresolved( + PredictionDecoder *psPredictionDecoder ) +{ + Word32 n, ch; + + Word32 iCurrentSubSet = psPredictionDecoder->iSubSetId; + + for ( ch = 0; ch < psPredictionDecoder->iChannels; ch++ ) + { + /* Prediction data always available for current subset */ + psPredictionDecoder->ppiDecodingUnresolved[ch][iCurrentSubSet] = 0; + + for ( n = 0; n < psPredictionDecoder->iNumSubSets; n++ ) + { + Word32 iSubSetActive = get_bit( psPredictionDecoder->piPredChanEnable[ch], n ); + if ( iSubSetActive == 0 ) + { + /* Prediction information available inactive subsets (e.g. no Prediction) */ + psPredictionDecoder->ppiDecodingUnresolved[ch][n] = 0; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function ApplyInversePredictors() + * + * + *-------------------------------------------------------------------*/ + +void ApplyInversePredictors_fx( + PredictionDecoder *psPredictionDecoder, + Word32 ***pppfReal, + Word32 ***pppfImag ) +{ + Word32 c; + FOR( c = 0; c < psPredictionDecoder->iChannels; c++ ) + { + IF( GT_32( psPredictionDecoder->piPredChanEnable[c], 0 ) ) + { + Word32 b; + FOR( b = 0; b < LCLD_BANDS; b++ ) + { + IF( EQ_32( psPredictionDecoder->ppiPredBandEnable[c][b], 1 ) ) + { + Word32 n; + Word32 fA1Real; + Word32 fA1Imag; + Word32 fPrevReal = 0; + move32(); + Word32 fPrevImag = 0; + move32(); + Word32 iSubset = b % psPredictionDecoder->iNumSubSets; + + IF( NE_32( iSubset, psPredictionDecoder->iSubSetId ) ) + { + fPrevReal = psPredictionDecoder->ppfPredStateReal_fx[c][b]; + move32(); + fPrevImag = psPredictionDecoder->ppfPredStateImag_fx[c][b]; + move32(); + } + + fA1Real = psPredictionDecoder->ppfA1Real_fx[c][b]; + move32(); + fA1Imag = psPredictionDecoder->ppfA1Imag_fx[c][b]; + move32(); + FOR( n = 0; n < psPredictionDecoder->iNumBlocks; n++ ) + { + Word32 fReal; + Word32 fImag; + + fReal = L_add( L_sub( pppfReal[c][n][b], Mpy_32_32( fA1Real, fPrevReal ) ), Mpy_32_32( fA1Imag, fPrevImag ) ); + fImag = L_sub( L_sub( pppfImag[c][n][b], Mpy_32_32( fA1Real, fPrevImag ) ), Mpy_32_32( fA1Imag, fPrevReal ) ); + + pppfReal[c][n][b] = fReal; + move32(); + pppfImag[c][n][b] = fImag; + move32(); + + fPrevReal = fReal; + move32(); + fPrevImag = fImag; + move32(); + } + psPredictionDecoder->ppfPredStateReal_fx[c][b] = fPrevReal; + move32(); + psPredictionDecoder->ppfPredStateImag_fx[c][b] = fPrevImag; + move32(); + } + } + } + } + + return; +} diff --git a/lib_isar/isar_PredEncoder.c b/lib_isar/isar_PredEncoder.c new file mode 100644 index 0000000000000000000000000000000000000000..769ae86a5f78418932da5d3d2224c92c1899a741 --- /dev/null +++ b/lib_isar/isar_PredEncoder.c @@ -0,0 +1,819 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "isar_lcld_prot.h" +#include "isar_rom_lcld_tables.h" +#include "prot_fx.h" +#include "isar_prot.h" +#include "wmc_auto.h" +#include "prot_fx.h" +#include "basop_util.h" +#include "enh64.h" +#include "basop32.h" + + +/*-------------------------------------------------------------------* + * Function activate_bit() + * + * + *-------------------------------------------------------------------*/ + +static void activate_bit( + Word32 *state, + const Word32 bit_id ) +{ + ( *state ) = L_or( ( *state ), L_shl( 1, extract_l( bit_id ) ) ); + + return; +} + +/*-------------------------------------------------------------------* + * Function deactivate_bit() + * + * + *-------------------------------------------------------------------*/ + +static void deactivate_bit( + Word32 *state, + const Word32 bit_id ) +{ + ( *state ) = L_and( ( *state ), ~L_shl( 1, extract_l( bit_id ) ) ); + + return; +} + + +void UpdatePredictionSubSetId( + PredictionEncoder *psPredictionEncoder ) +{ + IF( EQ_32( ++psPredictionEncoder->iSubSetId, psPredictionEncoder->iNumSubSets ) ) + { + psPredictionEncoder->iSubSetId = 0; + move32(); + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function CreatePredictionEncoder() + * + * + *-------------------------------------------------------------------*/ + +ivas_error CreatePredictionEncoder_fx( + PredictionEncoder **psPredictionEncoder_out, + const Word32 iChannels, + const Word32 iNumBlocks, + const Word32 iNumSubSets, + const Word32 iMaxNumPredBands ) +{ + Word32 k, n; + PredictionEncoder *psPredictionEncoder = NULL; + + IF( ( psPredictionEncoder = (PredictionEncoder *) malloc( sizeof( PredictionEncoder ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + + psPredictionEncoder->iChannels = iChannels; + move32(); + psPredictionEncoder->iNumBlocks = iNumBlocks; + move32(); + psPredictionEncoder->iSubSetId = 0; + move32(); + psPredictionEncoder->iMaxNumPredBands = iMaxNumPredBands; + move32(); + psPredictionEncoder->iNumSubSets = iNumSubSets; + move32(); + IF( ( psPredictionEncoder->piPredChanEnable = (Word32 *) malloc( sizeof( Word32 ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + + IF( ( psPredictionEncoder->piNumPredBands = (Word32 *) malloc( sizeof( Word32 ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + FOR( n = 0; n < psPredictionEncoder->iChannels; n++ ) + { + psPredictionEncoder->piPredChanEnable[n] = 0; + move32(); + psPredictionEncoder->piNumPredBands[n] = 40; // Will need to be set correctly + move32(); + } + + IF( ( psPredictionEncoder->ppiPredBandEnable = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppfA1Real_fx = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppfA1Imag_fx = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppiA1Mag = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppiA1Phase = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->pppfInpBufReal_fx = (Word32 ***) malloc( sizeof( Word32 ** ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->pppfInpBufImag_fx = (Word32 ***) malloc( sizeof( Word32 ** ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppfInpPrevReal_fx = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppfInpPrevImag_fx = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppfPredStateReal_fx = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppfPredStateImag_fx = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppfPredStateRealTmp_fx = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppfPredStateImagTmp_fx = (Word32 **) malloc( sizeof( Word32 * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + + FOR( n = 0; n < psPredictionEncoder->iChannels; n++ ) + { + IF( ( psPredictionEncoder->ppiPredBandEnable[n] = (Word32 *) malloc( sizeof( Word32 ) * LCLD_BANDS ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppfA1Real_fx[n] = (Word32 *) malloc( sizeof( Word32 ) * LCLD_BANDS ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppfA1Imag_fx[n] = (Word32 *) malloc( sizeof( Word32 ) * LCLD_BANDS ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppiA1Mag[n] = (Word32 *) malloc( sizeof( Word32 ) * LCLD_BANDS ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppiA1Phase[n] = (Word32 *) malloc( sizeof( Word32 ) * LCLD_BANDS ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->pppfInpBufReal_fx[n] = (Word32 **) malloc( sizeof( Word32 * ) * LCLD_PRED_WIN_LEN ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->pppfInpBufImag_fx[n] = (Word32 **) malloc( sizeof( Word32 * ) * LCLD_PRED_WIN_LEN ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + FOR( k = 0; k < LCLD_PRED_WIN_LEN; k++ ) + { + IF( ( psPredictionEncoder->pppfInpBufReal_fx[n][k] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->pppfInpBufImag_fx[n][k] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + set32_fx( psPredictionEncoder->pppfInpBufReal_fx[n][k], 0, LCLD_BANDS ); + set32_fx( psPredictionEncoder->pppfInpBufImag_fx[n][k], 0, LCLD_BANDS ); + } + IF( ( psPredictionEncoder->ppfPredStateReal_fx[n] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppfPredStateImag_fx[n] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + set32_fx( psPredictionEncoder->ppfPredStateReal_fx[n], 0, LCLD_BANDS ); + set32_fx( psPredictionEncoder->ppfPredStateImag_fx[n], 0, LCLD_BANDS ); + + IF( ( psPredictionEncoder->ppfInpPrevReal_fx[n] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppfInpPrevImag_fx[n] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + + set32_fx( psPredictionEncoder->ppfInpPrevReal_fx[n], 0, LCLD_BANDS ); + set32_fx( psPredictionEncoder->ppfInpPrevImag_fx[n], 0, LCLD_BANDS ); + + IF( ( psPredictionEncoder->ppfPredStateRealTmp_fx[n] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + IF( ( psPredictionEncoder->ppfPredStateImagTmp_fx[n] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + set32_fx( psPredictionEncoder->ppfPredStateRealTmp_fx[n], 0, LCLD_BANDS ); + set32_fx( psPredictionEncoder->ppfPredStateImagTmp_fx[n], 0, LCLD_BANDS ); + FOR( k = 0; k < LCLD_BANDS; k++ ) + { + psPredictionEncoder->ppiPredBandEnable[n][k] = 0; + move32(); + psPredictionEncoder->ppfA1Real_fx[n][k] = 0; + move32(); + psPredictionEncoder->ppfA1Imag_fx[n][k] = 0; + move32(); + } + } + + *psPredictionEncoder_out = psPredictionEncoder; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * Function DeletePredictionEncoder() + * + * + *-------------------------------------------------------------------*/ + +void DeletePredictionEncoder_fx( + PredictionEncoder *psPredictionEncoder ) +{ + Word32 n; + FOR( n = 0; n < psPredictionEncoder->iChannels; n++ ) + { + Word32 k; + free( psPredictionEncoder->ppiPredBandEnable[n] ); + free( psPredictionEncoder->ppfA1Real_fx[n] ); + free( psPredictionEncoder->ppfA1Imag_fx[n] ); + free( psPredictionEncoder->ppiA1Mag[n] ); + free( psPredictionEncoder->ppiA1Phase[n] ); + FOR( k = 0; k < LCLD_PRED_WIN_LEN; k++ ) + { + free( psPredictionEncoder->pppfInpBufReal_fx[n][k] ); + free( psPredictionEncoder->pppfInpBufImag_fx[n][k] ); + } + free( psPredictionEncoder->pppfInpBufReal_fx[n] ); + free( psPredictionEncoder->pppfInpBufImag_fx[n] ); + free( psPredictionEncoder->ppfInpPrevReal_fx[n] ); + free( psPredictionEncoder->ppfInpPrevImag_fx[n] ); + free( psPredictionEncoder->ppfPredStateReal_fx[n] ); + free( psPredictionEncoder->ppfPredStateImag_fx[n] ); + free( psPredictionEncoder->ppfPredStateRealTmp_fx[n] ); + free( psPredictionEncoder->ppfPredStateImagTmp_fx[n] ); + } + free( psPredictionEncoder->piPredChanEnable ); + free( psPredictionEncoder->piNumPredBands ); + free( psPredictionEncoder->ppiPredBandEnable ); + free( psPredictionEncoder->ppfA1Real_fx ); + free( psPredictionEncoder->ppfA1Imag_fx ); + free( psPredictionEncoder->ppiA1Mag ); + free( psPredictionEncoder->ppiA1Phase ); + free( psPredictionEncoder->pppfInpBufReal_fx ); + free( psPredictionEncoder->pppfInpBufImag_fx ); + free( psPredictionEncoder->ppfInpPrevReal_fx ); + free( psPredictionEncoder->ppfInpPrevImag_fx ); + free( psPredictionEncoder->ppfPredStateReal_fx ); + free( psPredictionEncoder->ppfPredStateImag_fx ); + free( psPredictionEncoder->ppfPredStateRealTmp_fx ); + free( psPredictionEncoder->ppfPredStateImagTmp_fx ); + + free( psPredictionEncoder ); + + return; +} + + +/*-------------------------------------------------------------------* + * Function ComputePredictors() + * + * + *-------------------------------------------------------------------*/ + + +void ComputePredictors_fx( + PredictionEncoder *psPredictionEncoder, + Word32 ***pppfReal_fx, // Q12? + Word32 ***pppfImag_fx ) // Q12? +{ + Word32 c; + Word32 b0 = psPredictionEncoder->iSubSetId; + Word32 bstep = psPredictionEncoder->iNumSubSets; + Word32 iNumBlocks = psPredictionEncoder->iNumBlocks; + /*float ***pppfRealBuf; + float ***pppfImagBuf;*/ + Word32 ***pppfRealBuf_fx; + Word32 ***pppfImagBuf_fx; + // float pfEstPredBitGain[LCLD_BANDS] = { 0 }; + Word32 pfEstPredBitGain_fx[LCLD_BANDS] = { 0 }; + + IF( LT_32( iNumBlocks, LCLD_PRED_WIN_LEN ) ) + { + /*pppfRealBuf = psPredictionEncoder->pppfInpBufReal; + pppfImagBuf = psPredictionEncoder->pppfInpBufImag;*/ + pppfRealBuf_fx = psPredictionEncoder->pppfInpBufReal_fx; + move32(); + pppfImagBuf_fx = psPredictionEncoder->pppfInpBufImag_fx; + move32(); + FOR( c = 0; c < psPredictionEncoder->iChannels; c++ ) + { + Word32 n; + FOR( n = 0; n < L_sub( LCLD_PRED_WIN_LEN, iNumBlocks ); n++ ) + { + /*mvr2r(pppfRealBuf[c][n + iNumBlocks], pppfRealBuf[c][n], LCLD_BANDS); + mvr2r(pppfImagBuf[c][n + iNumBlocks], pppfImagBuf[c][n], LCLD_BANDS);*/ + mvl2l( pppfRealBuf_fx[c][n + iNumBlocks], pppfRealBuf_fx[c][n], LCLD_BANDS ); + mvl2l( pppfImagBuf_fx[c][n + iNumBlocks], pppfImagBuf_fx[c][n], LCLD_BANDS ); + } + FOR( n = 0; n < iNumBlocks; n++ ) + { + /*mvr2r(pppfReal[c][n], pppfRealBuf[c][n + LCLD_PRED_WIN_LEN - iNumBlocks], LCLD_BANDS); + mvr2r(pppfImag[c][n], pppfImagBuf[c][n + LCLD_PRED_WIN_LEN - iNumBlocks], LCLD_BANDS);*/ + mvl2l( pppfReal_fx[c][n], pppfRealBuf_fx[c][n + LCLD_PRED_WIN_LEN - iNumBlocks], LCLD_BANDS ); + mvl2l( pppfImag_fx[c][n], pppfImagBuf_fx[c][n + LCLD_PRED_WIN_LEN - iNumBlocks], LCLD_BANDS ); + } + } + } + ELSE + { + /*pppfRealBuf = pppfReal; + pppfImagBuf = pppfImag;*/ + pppfRealBuf_fx = pppfReal_fx; + move32(); + pppfImagBuf_fx = pppfImag_fx; + move32(); + } + + FOR( c = 0; c < psPredictionEncoder->iChannels; c++ ) + { + Word32 b; + FOR( b = b0; b < psPredictionEncoder->iMaxNumPredBands; b += bstep ) + { + Word32 n; + /*float fGain = 0.0; + float fBitGain = 0.0; + float *pfRxxReal; + float *pfRxxImag; + float fA1Real; + float fA1Imag;*/ + Word32 fGain_fx = 0; + Word32 fBitGain_fx = 0; + Word32 *pfRxxReal_fx; + Word32 *pfRxxImag_fx; + Word32 fA1Real_fx; + Word32 fA1Imag_fx; + Word32 L_temp; + Word64 W_temp1, W_temp2; + Word32 iA1Mag; + Word32 iA1Phase; + + /*pfRxxReal = psPredictionEncoder->pfRxxReal; + pfRxxImag = psPredictionEncoder->pfRxxImag;*/ + pfRxxReal_fx = psPredictionEncoder->pfRxxReal_fx; + move32(); + pfRxxImag_fx = psPredictionEncoder->pfRxxImag_fx; + move32(); + /*pfRxxReal[0] = 0.0; + pfRxxImag[0] = 0.0;*/ + pfRxxReal_fx[0] = 0; + move32(); + pfRxxImag_fx[0] = 0; + move32(); + W_temp1 = 0; + FOR( n = 0; n < LCLD_PRED_WIN_LEN; n++ ) + { + // pfRxxReal[0] += (pppfRealBuf[c][n][b] * pppfRealBuf[c][n][b] + pppfImagBuf[c][n][b] * pppfImagBuf[c][n][b]); + W_temp1 = W_add( W_temp1, W_add( W_mult0_32_32( pppfRealBuf_fx[c][n][b], pppfRealBuf_fx[c][n][b] ), + W_mult0_32_32( pppfImagBuf_fx[c][n][b], pppfImagBuf_fx[c][n][b] ) ) ); // Q40 + } + Word16 w_norm1 = W_norm( W_temp1 ); + W_temp1 = W_shr( W_temp1, 32 - w_norm1 ); + pfRxxReal_fx[0] = W_extract_l( W_temp1 ); + /*pfRxxReal[1] = 0.0; + pfRxxImag[1] = 0.0;*/ + pfRxxReal_fx[1] = 0; + move32(); + pfRxxImag_fx[1] = 0; + move32(); + W_temp1 = 0; + W_temp2 = 0; + FOR( n = 1; n < LCLD_PRED_WIN_LEN; n++ ) + { + /*pfRxxReal[1] += (pppfRealBuf[c][n][b] * pppfRealBuf[c][n - 1][b] + pppfImagBuf[c][n][b] * pppfImagBuf[c][n - 1][b]); + pfRxxImag[1] += (pppfImagBuf[c][n][b] * pppfRealBuf[c][n - 1][b] - pppfRealBuf[c][n][b] * pppfImagBuf[c][n - 1][b]);*/ + W_temp1 = W_add( W_temp1, W_add( W_mult0_32_32( pppfRealBuf_fx[c][n][b], pppfRealBuf_fx[c][n - 1][b] ), + W_mult0_32_32( pppfImagBuf_fx[c][n][b], pppfImagBuf_fx[c][n - 1][b] ) ) ); // Q40 + W_temp2 = W_add( W_temp2, W_sub( W_mult0_32_32( pppfImagBuf_fx[c][n][b], pppfRealBuf_fx[c][n - 1][b] ), + W_mult0_32_32( pppfRealBuf_fx[c][n][b], pppfImagBuf_fx[c][n - 1][b] ) ) ); // Q40 + } + + Word16 w_norm2 = W_norm( W_temp1 ); + W_temp1 = W_shr( W_temp1, 32 - w_norm2 ); + pfRxxReal_fx[1] = W_extract_l( W_temp1 ); + Word16 w_norm3 = W_norm( W_temp2 ); + W_temp2 = W_shr( W_temp2, 32 - w_norm3 ); + pfRxxImag_fx[1] = W_extract_l( W_temp2 ); + Word16 final_w_norm = min( w_norm1, min( w_norm2, w_norm3 ) ); + pfRxxReal_fx[0] = L_shr( pfRxxReal_fx[0], w_norm1 - final_w_norm ); // Q8 + final_w_norm + pfRxxReal_fx[1] = L_shr( pfRxxReal_fx[1], w_norm2 - final_w_norm ); // Q8 + final_w_norm + pfRxxImag_fx[1] = L_shr( pfRxxImag_fx[1], w_norm3 - final_w_norm ); // Q8 + final_w_norm + // if (pfRxxReal[0] > 1e-12f) + IF( GT_32( pfRxxReal_fx[0], 0 ) ) + { + /*float fA1Mag; + float fA1Phase; + float fGain2; + float fBitGain2;*/ + Word32 fA1Mag_fx; + Word32 fA1Phase_fx; + Word32 fGain2_fx; + Word32 fBitGain2_fx; + Word32 iNumBlocksPerPredCoef = L_min( iNumBlocks * psPredictionEncoder->iNumSubSets, LCLD_PRED_WIN_LEN ); + const Word32 fMagScale_fx32 = 1452576210; // Q28 + move32(); + // const float fInvMagScale = M_PI / (2.0f * (float)(1 << (PRED_QUNAT_FILTER_MAG_BITS)) + 1.0f); + const Word16 fInvMagScale_fx = 6055; // Q15 + move16(); + // const float fPhaseScale = (float)(1 << (PRED_QUANT_FILTER_PHASE_BITS - 1)) / M_PI + const Word32 fPhaseScale_fx32 = 1367130551; // Q28 + // const float fInvPhaseScale = M_PI / (float)(1 << (PRED_QUANT_FILTER_PHASE_BITS - 1)); + const Word16 fInvPhaseScale_fx = 6434; // Q15 + move16(); + + /* Compute filter coefficeints */ + // fA1Real = -pfRxxReal[1] / pfRxxReal[0]; + Word16 sf_r, sf_i; + fA1Real_fx = BASOP_Util_Divide3232_Scale( -pfRxxReal_fx[1], pfRxxReal_fx[0], &sf_r ); + // fA1Imag = -pfRxxImag[1] / pfRxxReal[0]; + fA1Imag_fx = BASOP_Util_Divide3232_Scale( -pfRxxImag_fx[1], pfRxxReal_fx[0], &sf_i ); + + IF( GT_16( sf_r, sf_i ) ) + { + fA1Imag_fx = L_shr( fA1Imag_fx, sub( sf_r, sf_i ) ); + sf_i = sf_r; + move16(); + } + ELSE IF( LT_16( sf_r, sf_i ) ) + { + fA1Real_fx = L_shr( fA1Real_fx, sub( sf_i, sf_r ) ); + sf_r = sf_i; + move16(); + } + Word32 L_temp_1; + IF( LT_16( sf_r, -7 ) ) + { + fA1Real_fx = L_shr( fA1Real_fx, sub( -8, sf_r ) ); + fA1Imag_fx = L_shr( fA1Imag_fx, sub( -8, sf_i ) ); + sf_r = sf_i = -8; + move16(); + L_temp_1 = MAX_32; + move32(); + } + ELSE + { + L_temp_1 = L_shl( 1, sub( 15, shl( sf_r, 1 ) ) ); + } + /* compute these before quant */ + /* Compute est coding gain based on quantized filter coefficients */ + // fGain = 1.0f / (1.0f - fA1Real * fA1Real - fA1Imag * fA1Imag); + L_temp = L_sub( L_sub( L_temp_1, mult_r( extract_l( fA1Real_fx ), extract_l( fA1Real_fx ) ) ), mult_r( extract_l( fA1Imag_fx ), extract_l( fA1Imag_fx ) ) ); + Word16 exp = norm_l( L_temp ); + IF( LT_16( exp, 16 ) ) + { + L_temp = L_shr( L_temp, sub( 16, exp ) ); + exp = add( sub( 16, exp ), shl( sf_r, 1 ) ); + } + else + { + exp = shl( sf_r, 1 ); + } + // fGain_fx = sub(sub(32767, extract_h(Mpy_32_32(fA1Real_fx, fA1Real_fx))), extract_h(Mpy_32_32(fA1Imag_fx, fA1Imag_fx))); + // fGain_fx = extract_l(L_shl(L_temp, 2*sf_r)); + fGain_fx = extract_l( L_temp ); + fGain_fx = max( 1, fGain_fx ); + fGain_fx = Inv16( extract_l( fGain_fx ), &exp ); // Q15 - exp + // fGain_fx = L_shl(fGain_fx, exp); //Q15 + // fBitGain = 0.65f * log2f(fGain) * (float)(iNumBlocksPerPredCoef)-(float)(PRED_QUNAT_FILTER_MAG_BITS + PRED_QUANT_FILTER_PHASE_BITS); // Wrong fix (iNumBlocks-1) + // fBitGain_fx = L_sub(L_mult0(L_shr(L_mult0(21299, L_shr(L_add(BASOP_Util_Log2(fGain_fx), 335544320), 10)), 15), (Word16)iNumBlocksPerPredCoef), 262144); // Wrong fix (iNumBlocks-1) Q15 + W_temp1 = W_mult0_32_32( L_shr( Mpy_32_32( 1395864371, L_add( BASOP_Util_Log2( fGain_fx ), L_shl( add( 16, exp ), 25 ) ) ), 10 ), iNumBlocksPerPredCoef ); + Word16 w_norm4 = W_norm( W_temp1 ); + IF( LT_16( w_norm4, 32 ) ) + { + W_temp1 = W_shr( W_temp1, 32 - w_norm4 ); + w_norm4 = sub( 32, w_norm4 ); + } + ELSE + { + w_norm4 = 0; + move16(); + } + fBitGain_fx = L_sub( W_extract_l( W_temp1 ), L_shr( 262144, w_norm4 ) ); // Wrong fix (iNumBlocks-1) Q15 + // fA1Mag = sqrtf(fA1Real * fA1Real + fA1Imag * fA1Imag); + fA1Mag_fx = L_add( mult_r( extract_l( fA1Real_fx ), extract_l( fA1Real_fx ) ), mult_r( extract_l( fA1Imag_fx ), extract_l( fA1Imag_fx ) ) ); // Q15 - 2*sf_r + // fA1Mag = fMagScale * asinf(fA1Mag); + exp = 0; + move16(); + L_temp = L_sub( L_temp_1, fA1Mag_fx ); // Q15 - 2*sf_r + IF( NE_32( L_temp, 0 ) ) + { + fA1Mag_fx = BASOP_Util_Divide3232_Scale( fA1Mag_fx, L_temp, &exp ); + } + ELSE + { + fA1Mag_fx = 0; + move32(); + exp = 0; + move16(); + } + fA1Mag_fx = L_shl( fA1Mag_fx, 16 ); + IF( fA1Mag_fx > 0 ) + { + fA1Mag_fx = Sqrt32( fA1Mag_fx, &exp ); + } + ELSE + { + fA1Mag_fx = 0; + move32(); + exp = 0; + move16(); + } + + fA1Mag_fx = BASOP_util_atan( L_shr_r_sat( fA1Mag_fx, 6 - exp ) ); // Q14 + fA1Mag_fx = Mpy_32_16_1( fMagScale_fx32, extract_l( fA1Mag_fx ) ); // Q27 + + // iA1Mag = (int32_t)(fA1Mag + 0.5f); + IF( GE_32( fA1Mag_fx, 0 ) ) + { + iA1Mag = L_shr( L_add( fA1Mag_fx, 67108864 ), Q27 ); // Q27 -> Q0 + } + ELSE + { + fA1Mag_fx = L_negate( fA1Mag_fx ); + iA1Mag = L_shr( L_add( fA1Mag_fx, 67108864 ), Q27 ); // Q27 -> Q0 + iA1Mag = L_negate( iA1Mag ); + } + iA1Mag = ( iA1Mag > PRED_QUANT_FILTER_MAG_MIN ) ? iA1Mag : PRED_QUANT_FILTER_MAG_MIN; + iA1Mag = ( iA1Mag < PRED_QUANT_FILTER_MAG_MAX ) ? iA1Mag : PRED_QUANT_FILTER_MAG_MAX; + // fA1Mag = sinf(fInvMagScale * (float)iA1Mag); + fA1Mag_fx = L_deposit_l( shr( getSinWord16( extract_l( L_shr( L_mult0( extract_l( fInvMagScale_fx ), extract_l( iA1Mag ) ), 2 ) ) ), 1 ) ); // Q14 + + // fA1Phase = atan2f(fA1Imag, fA1Real); + fA1Phase_fx = BASOP_util_atan2( fA1Imag_fx, fA1Real_fx, 0 ); // Q13 + // fA1Phase = fPhaseScale * fA1Phase; + fA1Phase_fx = Mpy_32_16_1( fPhaseScale_fx32, extract_l( fA1Phase_fx ) ); // Q26 + // iA1Phase = (fA1Phase > 0.0f) ? (int32_t)(fA1Phase + 0.5f) : (int32_t)(fA1Phase - 0.5f); + // iA1Phase = (fA1Phase_fx > 0) ? shr(add(fA1Phase_fx, 512), 10) : shr(sub(fA1Phase_fx, 512), 10); + IF( GE_32( fA1Phase_fx, 0 ) ) + { + iA1Phase = L_shr( L_add( fA1Phase_fx, 33554432 ), Q26 ); // Q26 -> Q0 + } + ELSE + { + fA1Phase_fx = L_negate( fA1Phase_fx ); + iA1Phase = L_shr( L_add( fA1Phase_fx, 33554432 ), Q26 ); // Q26 -> Q0 + iA1Phase = L_negate( iA1Phase ); + } + iA1Phase = ( iA1Phase > PRED_QUANT_FILTER_PHASE_MIN ) ? iA1Phase : PRED_QUANT_FILTER_PHASE_MIN; + iA1Phase = ( iA1Phase < PRED_QUANT_FILTER_PHASE_MAX ) ? iA1Phase : PRED_QUANT_FILTER_PHASE_MAX; // Is this the correct way to deal with this? should wrap? + // fA1Phase = fInvPhaseScale * (float)iA1Phase; + L_temp = L_mult0( fInvPhaseScale_fx, (Word16) iA1Phase ); // Q15 + + // fA1Real = fA1Mag * cosf(fA1Phase); + fA1Real_fx = L_mult0( extract_l( fA1Mag_fx ), getCosWord16( extract_l( L_shr( L_temp, 2 ) ) ) ); // Q28 + // fA1Imag = fA1Mag * sinf(fA1Phase); + fA1Imag_fx = L_mult0( extract_l( fA1Mag_fx ), shr( getSinWord16( extract_l( L_shr( L_temp, 2 ) ) ), 1 ) ); // Q28 + + // fGain2 = 1.0f / (1.0f - fA1Real * fA1Real - fA1Imag * fA1Imag); + exp = 0; + fGain2_fx = sub( sub( 32767, mult_r( extract_l( L_shr( fA1Real_fx, 13 ) ), extract_l( L_shr( fA1Real_fx, 13 ) ) ) ), mult_r( extract_l( L_shr( fA1Imag_fx, 13 ) ), extract_l( L_shr( fA1Imag_fx, 13 ) ) ) ); + fGain2_fx = L_max( 1, fGain2_fx ); + fGain2_fx = Inv16( extract_l( fGain2_fx ), &exp ); // Q15-exp + fGain2_fx = L_shl( fGain2_fx, exp ); + // fBitGain2 = 0.65f * log2f(fGain) * (float)(iNumBlocksPerPredCoef)-(float)(PRED_QUNAT_FILTER_MAG_BITS + PRED_QUANT_FILTER_PHASE_BITS); // Wrong fix (iNumBlocks-1) + // fBitGain2_fx = L_sub(L_mult0(L_shr(L_mult0(21299, L_shr(L_add(BASOP_Util_Log2(fGain_fx), 335544320), 10)), 15), (Word16)iNumBlocksPerPredCoef), 262144); // Wrong fix (iNumBlocks-1) Q15 + fBitGain2_fx = L_sub( W_extract_l( W_temp1 ), L_shr( 262144, w_norm4 ) ); // Wrong fix (iNumBlocks-1) Q15 + // fGain = (fGain < fGain2) ? fGain : fGain2; + fGain_fx = ( fGain_fx < fGain2_fx ) ? fGain_fx : fGain2_fx; + // fBitGain = (fBitGain < fBitGain2) ? fBitGain : fBitGain2; + fBitGain_fx = ( fBitGain_fx < fBitGain2_fx ) ? fBitGain_fx : fBitGain2_fx; + } + ELSE + { + /*fA1Real = 0.0f; + fA1Imag = 0.0f;*/ + fA1Real_fx = 0; + move32(); + fA1Imag_fx = 0; + move32(); + iA1Mag = 0; + move32(); + iA1Phase = 0; + move32(); + // fGain = -10.0f; // Fix this + fGain_fx = -327680; // Fix this + move32(); + } + + // pfEstPredBitGain[b] = fBitGain; + // psPredictionEncoder->ppiPredBandEnable[c][b] = (fBitGain > 0.0f); // Initial prediction enable + // psPredictionEncoder->ppfA1Real[c][b] = fA1Real; + // psPredictionEncoder->ppfA1Imag[c][b] = fA1Imag; + pfEstPredBitGain_fx[b] = fBitGain_fx; // Q15 + move32(); + // printf("\n %d %d %f %f %f ", iA1Mag, iA1Phase, (float)fBitGain_fx / 32768, (float)fA1Real_fx / ONE_IN_Q28, (float)fA1Imag_fx / ONE_IN_Q28); + psPredictionEncoder->ppiPredBandEnable[c][b] = ( fBitGain_fx > 0 ); // Initial prediction enable + psPredictionEncoder->ppfA1Real_fx[c][b] = L_shl( fA1Real_fx, Q3 ); // Q31 + psPredictionEncoder->ppfA1Imag_fx[c][b] = L_shl( fA1Imag_fx, Q3 ); // Q31 + psPredictionEncoder->ppiA1Mag[c][b] = iA1Mag; + move32(); + psPredictionEncoder->ppiA1Phase[c][b] = iA1Phase; + move32(); + } + + { + // float fBestCost; + Word32 fBestCost_fx; + Word32 iPredBands; + // float fBitGain; + Word32 fBitGain_fx; + Word32 iPredChanEnable = 0; + + // fBestCost = 0.0; + fBestCost_fx = 0; + move32(); + iPredBands = 0; + move32(); + // fBitGain = -7.0; + fBitGain_fx = -229376; // Q15 + move32(); + FOR( b = b0; b < psPredictionEncoder->iMaxNumPredBands; b += bstep ) + { // still getting this decision wrong! + // fBitGain -= 1.0; + fBitGain_fx = L_sub( fBitGain_fx, 32768 ); + IF( EQ_32( psPredictionEncoder->ppiPredBandEnable[c][b], 1 ) ) + { + // fBitGain += pfEstPredBitGain[b]; + fBitGain_fx = L_add( fBitGain_fx, pfEstPredBitGain_fx[b] ); + } + // if (fBitGain > fBestCost) + IF( GT_32( fBitGain_fx, fBestCost_fx ) ) + { + fBestCost_fx = fBitGain_fx; + iPredBands = b; + iPredChanEnable = 1; + } + } + + IF( EQ_32( iPredChanEnable, 1 ) ) + { + FOR( b = iPredBands + bstep; b < LCLD_BANDS; b += bstep ) + { + psPredictionEncoder->ppiPredBandEnable[c][b] = 0; + } + activate_bit( &psPredictionEncoder->piPredChanEnable[c], psPredictionEncoder->iSubSetId ); + psPredictionEncoder->piNumPredBands[c] = iPredBands + bstep; + } + ELSE + { + FOR( b = b0; b < LCLD_BANDS; b += bstep ) + { + psPredictionEncoder->ppiPredBandEnable[c][b] = 0; + } + deactivate_bit( &psPredictionEncoder->piPredChanEnable[c], psPredictionEncoder->iSubSetId ); + psPredictionEncoder->piNumPredBands[c] = 0; + move32(); + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function WritePredictors() + * + * + *-------------------------------------------------------------------*/ + +Word32 WritePredictors( + PredictionEncoder *psPredictionEncoder, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word32 iBitsWritten = 0; + Word32 c; + Word32 iNumSubSets = psPredictionEncoder->iNumSubSets; + Word32 iSubSetId = psPredictionEncoder->iSubSetId; + Word32 iNumPredBandBits = 6; + const Word16 iSubSetBits = ( GT_16( LCLD_MAX_NUM_PRED_SUBSETS, 4 ) ? 3 : 2 ); + move32(); + move32(); + move16(); + + /* number of subsets */ + ISAR_SPLIT_REND_BITStream_write_int32( pBits, L_sub( iNumSubSets, 1 ), iSubSetBits ); /* otherwise use default */ + iBitsWritten = L_add( iBitsWritten, iSubSetBits ); + + IF( GT_32( iNumSubSets, 1 ) ) + { + /* write current subset */ + ISAR_SPLIT_REND_BITStream_write_int32( pBits, iSubSetId, iSubSetBits ); + iBitsWritten = L_add( iBitsWritten, iSubSetBits ); + iNumPredBandBits = ( GE_32( iNumSubSets, 4 ) ? 4 : 5 ); + move32(); + } + + FOR( c = 0; c < psPredictionEncoder->iChannels; c++ ) + { + Word32 b; + Word32 b0 = iSubSetId; + move32(); + + ISAR_SPLIT_REND_BITStream_write_int32( pBits, psPredictionEncoder->piPredChanEnable[c], iNumSubSets ); + iBitsWritten = L_add( iBitsWritten, iNumSubSets ); + + IF( get_bit( psPredictionEncoder->piPredChanEnable[c], iSubSetId ) ) + { + Word32 iNumPredBands = L_sub( psPredictionEncoder->piNumPredBands[c], b0 ) / iNumSubSets; + + ISAR_SPLIT_REND_BITStream_write_int32( pBits, iNumPredBands, iNumPredBandBits ); + iBitsWritten = L_add( iBitsWritten, iNumPredBandBits ); + + FOR( b = b0; b < psPredictionEncoder->piNumPredBands[c]; b += iNumSubSets ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, psPredictionEncoder->ppiPredBandEnable[c][b], 1 ); + iBitsWritten = L_add( iBitsWritten, 1 ); + + IF( EQ_32( psPredictionEncoder->ppiPredBandEnable[c][b], 1 ) ) + { + Word32 iA1Mag; + Word32 iA1Phase; + + iA1Mag = psPredictionEncoder->ppiA1Mag[c][b]; + move32(); + iA1Phase = L_sub( psPredictionEncoder->ppiA1Phase[c][b], PRED_QUANT_FILTER_PHASE_MIN ); + + ISAR_SPLIT_REND_BITStream_write_int32( pBits, iA1Mag, PRED_QUNAT_FILTER_MAG_BITS ); + iBitsWritten = L_add( iBitsWritten, PRED_QUNAT_FILTER_MAG_BITS ); + + ISAR_SPLIT_REND_BITStream_write_int32( pBits, iA1Phase, PRED_QUANT_FILTER_PHASE_BITS ); + iBitsWritten = L_add( iBitsWritten, PRED_QUANT_FILTER_PHASE_BITS ); + } + } + } + } + + return iBitsWritten; +} diff --git a/lib_isar/isar_RMSEnvGrouping.c b/lib_isar/isar_RMSEnvGrouping.c new file mode 100644 index 0000000000000000000000000000000000000000..428cc66b3637aa064bcc8d7655080ce96400530d --- /dev/null +++ b/lib_isar/isar_RMSEnvGrouping.c @@ -0,0 +1,981 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/* Double check cost function calculation */ + +#include +#include "options.h" +#include +#include "prot_fx.h" +#include "isar_lcld_prot.h" +#include "isar_rom_lcld_tables.h" +#include "wmc_auto.h" +#include "prot_fx.h" +#include "basop_util.h" +#include "enh64.h" + + +/*-------------------------------------------------------------------* + * Local ROM tables + * + * + *-------------------------------------------------------------------*/ + +Word32 Inv_grp_length[17] = { + // Q31 + 0, + 2147483647, + 1073741823, + 715827882, + 536870911, + 429496729, + 357913941, + 306783378, + 268435455, + 238609294, + 214748364, + 195225786, + 178956970, + 165191049, + 153391689, + 143165576, + 134217727, + +}; + +static const Word32 c_afThreshQuiet48_fx[23] = { + // Q23 + -705191424, + -705191424, + -705191424, + -705191424, + -705191424, + -705191424, + -705191424, + -705191424, + -703021824, + -694920256, + -685375488, + -662531840, + -646432768, + -636262784, + -627448000, + -618652544, + -598245120, + -575579520, + -550540736, + -508787360, + -264583456, + -161516096, + -158042848, +}; +static const Word32 c_fiDefaultTheta48_fx[MAX_BANDS_48] = { + // Q31 + 939524096, + 939524096, + 805306368, + 671088640, + 671088640, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, + 536870912, +}; +typedef struct GMNODE +{ + Word32 iGroupStart; + Word32 iGroupLength; + Word32 *pfMergedEnergydB_fx; + Word32 *piQRMSEnvelope; + + Word32 iGroupRMSEnvelopeCost; + Word32 fGroupSNRPenalty_fx; + Word16 fGroupSNRPenalty_exp; + struct GMNODE *psNext; +} GMNode; + +struct RMS_ENVELOPE_GROUPING +{ + Word32 iNumBlocks; + Word32 iMaxGroups; + Word32 **ppfWeight_man; + Word16 **ppfWeight_exp; + Word32 **ppfBandEnergy_man; + Word16 **ppfBandEnergy_exp; + Word32 **ppfBandEnergydB_fx; + // Word32 **ppfWeight_fx; + GMNode *psGMNodes; +}; + + +/*-------------------------------------------------------------------* + * Function CreateRMSEnvelopeGrouping() + * + * + *-------------------------------------------------------------------*/ + +RMSEnvelopeGrouping *CreateRMSEnvelopeGrouping( + const Word32 iNumBlocks ) +{ + Word32 n; + + RMSEnvelopeGrouping *psRMSEnvelopeGrouping; + + psRMSEnvelopeGrouping = (RMSEnvelopeGrouping *) malloc( sizeof( RMSEnvelopeGrouping ) ); + psRMSEnvelopeGrouping->iNumBlocks = iNumBlocks; + + psRMSEnvelopeGrouping->iMaxGroups = iNumBlocks >> 1; + psRMSEnvelopeGrouping->ppfBandEnergy_man = (Word32 **) malloc( psRMSEnvelopeGrouping->iNumBlocks * sizeof( Word32 * ) ); + psRMSEnvelopeGrouping->ppfBandEnergy_exp = (Word16 **) malloc( psRMSEnvelopeGrouping->iNumBlocks * sizeof( Word16 * ) ); + psRMSEnvelopeGrouping->ppfBandEnergydB_fx = (Word32 **) malloc( psRMSEnvelopeGrouping->iNumBlocks * sizeof( Word32 * ) ); + psRMSEnvelopeGrouping->ppfWeight_man = (Word32 **) malloc( psRMSEnvelopeGrouping->iNumBlocks * sizeof( Word32 * ) ); + psRMSEnvelopeGrouping->ppfWeight_exp = (Word16 **) malloc( psRMSEnvelopeGrouping->iNumBlocks * sizeof( Word16 * ) ); + + FOR( n = 0; n < psRMSEnvelopeGrouping->iNumBlocks; n++ ) + { + psRMSEnvelopeGrouping->ppfBandEnergy_man[n] = (Word32 *) malloc( MAX_BANDS * 2 * sizeof( Word32 ) ); /* 2 for stereo joint group calc */ + psRMSEnvelopeGrouping->ppfBandEnergy_exp[n] = (Word16 *) malloc( MAX_BANDS * 2 * sizeof( Word16 ) ); /* 2 for stereo joint group calc */ + psRMSEnvelopeGrouping->ppfBandEnergydB_fx[n] = (Word32 *) malloc( MAX_BANDS * 2 * sizeof( Word32 ) ); + psRMSEnvelopeGrouping->ppfWeight_man[n] = (Word32 *) malloc( MAX_BANDS * 2 * sizeof( Word32 ) ); + psRMSEnvelopeGrouping->ppfWeight_exp[n] = (Word16 *) malloc( MAX_BANDS * 2 * sizeof( Word16 ) ); + } + + psRMSEnvelopeGrouping->psGMNodes = (GMNode *) malloc( psRMSEnvelopeGrouping->iNumBlocks * sizeof( GMNode ) ); + + for ( n = 0; n < psRMSEnvelopeGrouping->iNumBlocks; n++ ) + { + psRMSEnvelopeGrouping->psGMNodes[n].pfMergedEnergydB_fx = (Word32 *) malloc( MAX_BANDS * 2 * sizeof( Word32 ) ); + psRMSEnvelopeGrouping->psGMNodes[n].piQRMSEnvelope = (Word32 *) malloc( MAX_BANDS * 2 * sizeof( Word32 ) ); + psRMSEnvelopeGrouping->psGMNodes[n].iGroupRMSEnvelopeCost = -1; + psRMSEnvelopeGrouping->psGMNodes[n].fGroupSNRPenalty_fx = L_negate( ONE_IN_Q30 ); + psRMSEnvelopeGrouping->psGMNodes[n].fGroupSNRPenalty_exp = 1; + } + + return psRMSEnvelopeGrouping; +} + + +/*-------------------------------------------------------------------* + * Function DeleteRMSEnvelopeGrouping() + * + * + *-------------------------------------------------------------------*/ + +void DeleteRMSEnvelopeGrouping( + RMSEnvelopeGrouping *psRMSEnvelopeGrouping ) +{ + Word32 n; + + FOR( n = 0; n < psRMSEnvelopeGrouping->iNumBlocks; n++ ) + { + free( psRMSEnvelopeGrouping->ppfBandEnergy_man[n] ); + free( psRMSEnvelopeGrouping->ppfBandEnergy_exp[n] ); + free( psRMSEnvelopeGrouping->ppfBandEnergydB_fx[n] ); + free( psRMSEnvelopeGrouping->ppfWeight_man[n] ); + free( psRMSEnvelopeGrouping->ppfWeight_exp[n] ); + } + free( psRMSEnvelopeGrouping->ppfBandEnergy_man ); + free( psRMSEnvelopeGrouping->ppfBandEnergy_exp ); + free( psRMSEnvelopeGrouping->ppfBandEnergydB_fx ); + free( psRMSEnvelopeGrouping->ppfWeight_man ); + free( psRMSEnvelopeGrouping->ppfWeight_exp ); + + FOR( n = 0; n < psRMSEnvelopeGrouping->iNumBlocks; n++ ) + { + free( psRMSEnvelopeGrouping->psGMNodes[n].pfMergedEnergydB_fx ); + free( psRMSEnvelopeGrouping->psGMNodes[n].piQRMSEnvelope ); + } + free( psRMSEnvelopeGrouping->psGMNodes ); + + free( psRMSEnvelopeGrouping ); + + return; +} + + +/*-------------------------------------------------------------------* + * Function ComputeBandEnergy() + * + * + *-------------------------------------------------------------------*/ + +static void ComputeBandEnergy( + const Word32 iChannels, + const Word32 iNumBlocks, + const Word32 iNumBands, + const Word32 *piBandwidths, + Word32 ***pppfReal_fx, + Word32 ***pppfImag_fx, + Word32 **ppfBandEnergy_man, + Word16 **ppfBandEnergy_exp, + Word32 **ppfBandEnergydB_fx, + Word32 **ppfWeight_man, + Word16 **ppfWeight_exp, + Word16 q_final ) +{ + Word32 n; + Word32 constant = 1616142483; // Q29 of(1/log2(10))*10 + Word32 const_comp3, const_comp1; + Word16 exp3 = 0, exp1 = 0, Flag1, Flag2, Flag3; + Word16 div_exp; + /*For 0.33f*/ + const_comp3 = 1417339264; + move32(); + exp3 = -1; + move16(); + // f2me( 0.33, &const_comp3, &exp3 );// + // f2me( 1.0, &const_comp1, &exp1 );// + /*For 1.0f*/ + Word32 mul_32; + Word16 mul_exp; + const_comp1 = 1073741824; + move32(); + exp1 = 1; + move16(); + FOR( n = 0; n < iChannels; n++ ) + { + Word32 k; + Word32 iChanOffset; + + iChanOffset = L_mult0( extract_l( n ), extract_l( iNumBands ) ); + FOR( k = 0; k < iNumBlocks; k++ ) + { + Word32 b; + Word32 iFBOffset; + Word32 fMaxWeight_fx = 0; + move32(); + Word16 fMaxWeight_exp = 0; + move16(); + iFBOffset = 0; + move32(); + FOR( b = 0; b < iNumBands; b++ ) + { + Word32 m; + Word16 fEnergy_exp; + Word32 fEnergy_fx, fWeight_temp; + Word16 shift_value; + Word32 fEnergy_log_fx, fEnergy_log_fx1; + fEnergy_exp = 0; + move16(); + /*For 1e-12f in Q63*/ + Word32 fWeight_fx; + Word64 Wmult_value; + Word16 exp_pow = 0; + move16(); + Word16 guard_bits = find_guarded_bits_fx( piBandwidths[b] + 1 ); + // fEnergy_f64 = W_shr( fEnergy_f64, ( 63 - ( 2 * ( q_final - guard_bits ) + 1 ) ) ); + fEnergy_fx = 1180591616; + fEnergy_exp = -39; + FOR( m = 0; m < piBandwidths[b]; m++ ) + { + Wmult_value = W_add( W_mult_32_32( L_shr( pppfReal_fx[n][k][iFBOffset], guard_bits ), L_shr( pppfReal_fx[n][k][iFBOffset], guard_bits ) ), W_mult_32_32( L_shr( pppfImag_fx[n][k][iFBOffset], guard_bits ), L_shr( pppfImag_fx[n][k][iFBOffset], guard_bits ) ) ); + shift_value = W_norm( Wmult_value ); + mul_32 = W_extract_h( W_shl( Wmult_value, shift_value ) ); + mul_exp = 31 - ( 2 * ( q_final - guard_bits ) + 1 + shift_value - 32 ); + fEnergy_fx = BASOP_Util_Add_Mant32Exp( fEnergy_fx, fEnergy_exp, mul_32, mul_exp, &fEnergy_exp ); // Some large number to prevent clipping + iFBOffset++; + } + IF( EQ_32( fEnergy_fx, 0 ) ) + { + // f2me( 1e-12f, &fEnergy_fx, &fEnergy_exp ); // + fEnergy_fx = 1180591616; + fEnergy_exp = -39; + fEnergy_fx = Mpy_32_32( fEnergy_fx, Inv_grp_length[piBandwidths[b]] ); // Correction removed normalization by 2 + ppfBandEnergy_man[k][iChanOffset + b] = fEnergy_fx; + move32(); + ppfBandEnergy_exp[k][iChanOffset + b] = fEnergy_exp; + move16(); + fEnergy_fx = Mpy_32_32( fEnergy_fx, Inv_grp_length[piBandwidths[b]] ); // Correction removed normalization by 2 + ppfBandEnergy_man[k][iChanOffset + b] = fEnergy_fx; + move32(); + ppfBandEnergy_exp[k][iChanOffset + b] = fEnergy_exp; + move16(); + fEnergy_log_fx1 = -1006632960; // Q23 + fWeight_fx = 403727488; // Q31 + exp_pow = 0; + } + ELSE + { + fEnergy_fx = Mpy_32_32( fEnergy_fx, Inv_grp_length[piBandwidths[b]] ); // Correction removed normalization by 2 + ppfBandEnergy_man[k][iChanOffset + b] = fEnergy_fx; + move32(); + ppfBandEnergy_exp[k][iChanOffset + b] = fEnergy_exp; + move16(); + fEnergy_fx = BASOP_Util_Log2( fEnergy_fx ); + move32(); + fEnergy_log_fx = L_add( fEnergy_fx, L_shl( L_deposit_l( fEnergy_exp ), WORD32_BITS - 1 - LD_DATA_SCALE ) ); /*Q25*/ // log2f( fEnergy ) + fEnergy_log_fx1 = Mpy_32_32( fEnergy_log_fx, constant ); + fEnergy_log_fx = L_sub( fEnergy_log_fx1, c_afThreshQuiet48_fx[b] ); // Q23 of ( 10.0f * log10f( fEnergy ) - c_afThreshQuiet48[b] ) ) + fWeight_fx = Mpy_32_32( 48509336, fEnergy_log_fx ); // 0.0068f*3.3219 in Q31, result in Q23 + fWeight_temp = BASOP_util_Pow2( fWeight_fx, 8, &exp_pow ); + fWeight_fx = Mpy_32_32( 708669604, fWeight_temp ); // 708669604 = Q31 0f 0.33 + } + Flag1 = BASOP_Util_Cmp_Mant32Exp( fWeight_fx, exp_pow, const_comp3, exp3 ); + IF( NE_16( Flag1, 1 ) ) + { + fWeight_fx = const_comp3; + move32(); + exp_pow = exp3; + move16(); + } + Flag2 = BASOP_Util_Cmp_Mant32Exp( const_comp1, exp1, fWeight_fx, exp_pow ); + IF( NE_16( Flag2, 1 ) ) + { + fWeight_fx = const_comp1; + move32(); + exp_pow = exp1; + move16(); + } + Flag3 = BASOP_Util_Cmp_Mant32Exp( fMaxWeight_fx, fMaxWeight_exp, fWeight_fx, exp_pow ); + IF( NE_16( Flag3, 1 ) ) + { + fMaxWeight_fx = fWeight_fx; + move32(); + fMaxWeight_exp = exp_pow; + move16(); + } +#ifdef APPLY_TEMPORAL_SMOOTHING + if ( k > 0 ) + { + float fSmoothEnergy; + fSmoothEnergy = 0.7f * ppfBandEnergy[k - 1][iChanOffset + b] + 0.3f * fEnergy; + + fEnergy = ( fEnergy > fSmoothEnergy ) ? fEnergy : fSmoothEnergy; + } +#endif + ppfWeight_man[k][iChanOffset + b] = fWeight_fx; + ppfWeight_exp[k][iChanOffset + b] = exp_pow; + ppfBandEnergydB_fx[k][iChanOffset + b] = fEnergy_log_fx1; // Q23 + } + FOR( b = 0; b < iNumBands; b++ ) + { + ppfWeight_man[k][iChanOffset + b] = L_deposit_h( BASOP_Util_Divide3232_Scale( ppfWeight_man[k][iChanOffset + b], fMaxWeight_fx, &div_exp ) ); + ppfWeight_exp[k][iChanOffset + b] = div_exp + ppfWeight_exp[k][iChanOffset + b] - fMaxWeight_exp; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function ComputeMergeRMS() + * + * + *-------------------------------------------------------------------*/ + +static void ComputeMergeRMS( + const Word32 iNumBands, + const Word32 iStartBlock, + const Word32 iGroupLength, + Word32 *pfMergedEnergydB, + Word32 *piQRMSEnvelope, + Word32 **ppfBandEnergy_man, + Word16 **ppfBandEnergy_exp ) +{ + Word32 b; + Word32 constant = 1616142483; // Q29 of(1/log2(10))*10 // Note epsolon was added when computing BandEnergy; + move32(); + Word32 fGroupEnergy32_fx; + + FOR( b = 0; b < iNumBands; b++ ) + { + Word32 n; + Word32 fGroupEnergy_fx = 0; + move32(); + Word16 fGroupEnergy_exp = 0; + move16(); + Word32 fRMSEnvelope_fx; + Word32 iQRMSEnvelope_fx; + FOR( n = iStartBlock; n < ( iStartBlock + iGroupLength ); n++ ) + { + fGroupEnergy_fx = BASOP_Util_Add_Mant32Exp( ppfBandEnergy_man[n][b], ppfBandEnergy_exp[n][b], fGroupEnergy_fx, fGroupEnergy_exp, &fGroupEnergy_exp ); + } + fGroupEnergy_fx = Mpy_32_32( fGroupEnergy_fx, Inv_grp_length[iGroupLength] ); // Division by iGroupLength + move32(); + IF( NE_32( fGroupEnergy_fx, 0 ) ) + { + fRMSEnvelope_fx = BASOP_Util_Log2( fGroupEnergy_fx ); + move32(); + fRMSEnvelope_fx = L_add( fRMSEnvelope_fx, L_shl( L_deposit_l( fGroupEnergy_exp ), WORD32_BITS - 1 - LD_DATA_SCALE ) ); /*Q25*/ + } + ELSE + { + fRMSEnvelope_fx = 0; + fGroupEnergy_exp = 0; + } + iQRMSEnvelope_fx = ( fRMSEnvelope_fx > 0 ) ? L_add( fRMSEnvelope_fx, ONE_IN_Q24 ) : L_negate( L_add( L_negate( fRMSEnvelope_fx ), ONE_IN_Q24 ) ); + iQRMSEnvelope_fx = L_shr( iQRMSEnvelope_fx, 25 ); + + fGroupEnergy32_fx = fRMSEnvelope_fx; /*Q25*/ // BASOP_Util_Log2( fGroupEnergy_fx ); + fGroupEnergy32_fx = Mpy_32_32( fGroupEnergy32_fx, constant ); // Q23 + pfMergedEnergydB[b] = fGroupEnergy32_fx; // Q23 + piQRMSEnvelope[b] = iQRMSEnvelope_fx; // Q25 + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function ComputeRMSEnvelopeBits() + * + * + *-------------------------------------------------------------------*/ + +static Word32 ComputeRMSEnvelopeBits( + const Word32 iChannels, + const Word32 iNumBands, + const Word32 *piQRMSEnevelope ) +{ + Word32 n; + Word32 iRMSEnvelopeBits = 0; + move32(); + Word32 iChanOffset = 0; + move32(); + + FOR( n = 0; n < iChannels; n++ ) + { + Word32 b; + Word32 iLastRMSVal; + + iRMSEnvelopeBits = L_add( iRMSEnvelopeBits, ENV0_BITS ); + iLastRMSVal = piQRMSEnevelope[iChanOffset]; + move32(); + FOR( b = 1; b < iNumBands; b++ ) + { + Word32 iDelta; + + iDelta = L_sub( piQRMSEnevelope[iChanOffset + b], iLastRMSVal ); + iDelta = ( iDelta > ENV_DELTA_MIN ) ? iDelta : ENV_DELTA_MIN; + iDelta = ( iDelta < ENV_DELTA_MAX ) ? iDelta : ENV_DELTA_MAX; + iDelta = L_sub( iDelta, ENV_DELTA_MIN ); + iRMSEnvelopeBits = L_add( iRMSEnvelopeBits, c_aaiRMSEnvHuffEnc[iDelta][0] ); + + iLastRMSVal = piQRMSEnevelope[iChanOffset + b]; + move32(); + } + + iChanOffset = L_add( iChanOffset, iNumBands ); + } + + return iRMSEnvelopeBits; +} + + +/*-------------------------------------------------------------------* + * Function ComputeSNRPenalty() + * + * + *-------------------------------------------------------------------*/ + +static Word32 ComputeSNRPenalty( + const Word32 iChannels, + const Word32 iNumBands, + const Word32 *piBandwidths, + const Word32 iStartBlock, + const Word32 iGroupLength, + Word32 **ppfBandEnergy_dB_fx, + const Word32 *piRMSEnvelope, + Word16 *fSNRPenalty_exp ) +{ + Word32 n; + Word32 iChanOffset; + Word32 temp; + Word32 fSNRPenalty_fx = 0; + move32(); + Word32 fSNRPenaltyconst_fx = 0; + move32(); + Word32 mul_temp; + Word16 fSNRPenaltycnst_exp = 0, exp = 0; + + fSNRPenaltyconst_fx = 1250000000; + fSNRPenaltycnst_exp = 34; + iChanOffset = 0; + move32(); + FOR( n = 0; n < iChannels; n++ ) + { + Word32 b; + FOR( b = 0; b < iNumBands; b++ ) + { + Word32 k; + Word32 fRMSVal_fx; + Word32 RMS_value_fx; + // RMS_value = piRMSEnvelope[iChanOffset + b]; + RMS_value_fx = L_shl( piRMSEnvelope[iChanOffset + b], 25 ); + move32(); + // fRMSVal = 3.0103f * (float) RMS_value; + fRMSVal_fx = Mpy_32_32( 1616142506, RMS_value_fx ); // Q23 + move32(); + FOR( k = iStartBlock; k < ( iStartBlock + iGroupLength ); k++ ) + { + Word32 fDeltadB_fx; + fDeltadB_fx = L_sub( fRMSVal_fx, ppfBandEnergy_dB_fx[k][iChanOffset + b] ); + IF( LT_32( fDeltadB_fx, -75756680 ) ) + { + fSNRPenalty_fx = BASOP_Util_Add_Mant32Exp( fSNRPenalty_fx, *fSNRPenalty_exp, fSNRPenaltyconst_fx, fSNRPenaltycnst_exp, fSNRPenalty_exp ); // Some large number to prevent clipping + } + ELSE + { + mul_temp = L_abs( L_sub( Mpy_32_32( c_fiDefaultTheta48_fx[b], fDeltadB_fx ), fDeltadB_fx ) ); + temp = Mpy_32_32( mul_temp, Mpy_32_32( 715827883, L_shl( piBandwidths[b], 27 ) ) ); // Q27+23 -31=19 + exp = Q12; // Q31 - Q19 + fSNRPenalty_fx = BASOP_Util_Add_Mant32Exp( fSNRPenalty_fx, *fSNRPenalty_exp, temp, exp, fSNRPenalty_exp ); + } + } + } + + iChanOffset = L_add( iChanOffset, iNumBands ); + } + + return fSNRPenalty_fx; +} + + +/*-------------------------------------------------------------------* + * Function TryMerge2() + * + * + *-------------------------------------------------------------------*/ + +static Word32 TryMerge2( + const Word32 iChannels, + const Word32 iNumBands, + const Word32 *piBandwidths, + Word32 **ppfBandEnergy_man, + Word16 **ppfBandEnergy_exp, + Word32 **ppfBandEnergydB_fx, + GMNode *psGMNode1, + GMNode *psGMNode2, + Word16 *fMergedCost_exp ) +{ + Word32 iRMSEnvBits1; + Word32 iRMSEnvBits2; + Word32 iRMSEnvBitsMerged; + Word32 temp = 0; + move32(); + Word16 temp_exp = 0; + move16(); + Word32 fMergedCost_fx = 0; + move32(); + Word32 RMSEnvBits_fx; + Word32 fSNRPenalty1_fx; + Word32 fSNRPenalty2_fx; + Word32 fSNRPenaltyMerged_fx; + Word16 fSNRPenalty1_exp = 0; + move16(); + Word16 fSNRPenalty2_exp = 0; + move16(); + Word16 fSNRPenaltyMerged_exp = 0; + move16(); + Word32 one_in_mant = L_negate( ONE_IN_Q30 ); + Word16 one_in_exp = 1; + move16(); + *fMergedCost_exp = 0; + move16(); + Word16 flag = 0; + move16(); + + IF( EQ_32( psGMNode1->fGroupSNRPenalty_fx, one_in_mant ) && EQ_16( psGMNode1->fGroupSNRPenalty_exp, one_in_exp ) ) + { + flag = 1; + move16(); + } + + /* First compute current RMS Envelope for each group */ + IF( EQ_32( psGMNode1->iGroupRMSEnvelopeCost, -1 ) || flag ) + { + ComputeMergeRMS( iNumBands * iChannels, psGMNode1->iGroupStart, psGMNode1->iGroupLength, psGMNode1->pfMergedEnergydB_fx, psGMNode1->piQRMSEnvelope, ppfBandEnergy_man, ppfBandEnergy_exp ); + iRMSEnvBits1 = ComputeRMSEnvelopeBits( iChannels, iNumBands, psGMNode1->piQRMSEnvelope ); + fSNRPenalty1_fx = ComputeSNRPenalty( iChannels, iNumBands, piBandwidths, psGMNode1->iGroupStart, psGMNode1->iGroupLength, ppfBandEnergydB_fx, psGMNode1->piQRMSEnvelope, &fSNRPenalty1_exp ); + psGMNode1->iGroupRMSEnvelopeCost = iRMSEnvBits1; + move32(); + psGMNode1->fGroupSNRPenalty_fx = fSNRPenalty1_fx; + move32(); + psGMNode1->fGroupSNRPenalty_exp = fSNRPenalty1_exp; + move16(); + } + ELSE + { + iRMSEnvBits1 = psGMNode1->iGroupRMSEnvelopeCost; + move32(); + fSNRPenalty1_fx = psGMNode1->fGroupSNRPenalty_fx; + move32(); + fSNRPenalty1_exp = psGMNode1->fGroupSNRPenalty_exp; + move16(); + } + IF( EQ_32( psGMNode2->fGroupSNRPenalty_fx, one_in_mant ) && EQ_16( psGMNode2->fGroupSNRPenalty_exp, one_in_exp ) ) + { + flag = 1; + move16(); + } + + IF( EQ_32( psGMNode2->iGroupRMSEnvelopeCost, -1 ) || flag ) + { + + ComputeMergeRMS( iNumBands * iChannels, psGMNode2->iGroupStart, psGMNode2->iGroupLength, psGMNode2->pfMergedEnergydB_fx, psGMNode2->piQRMSEnvelope, ppfBandEnergy_man, ppfBandEnergy_exp ); + iRMSEnvBits2 = ComputeRMSEnvelopeBits( iChannels, iNumBands, psGMNode2->piQRMSEnvelope ); + fSNRPenalty2_fx = ComputeSNRPenalty( iChannels, iNumBands, piBandwidths, psGMNode2->iGroupStart, psGMNode2->iGroupLength, ppfBandEnergydB_fx, psGMNode2->piQRMSEnvelope, &fSNRPenalty2_exp ); + psGMNode2->iGroupRMSEnvelopeCost = iRMSEnvBits2; + move32(); + psGMNode2->fGroupSNRPenalty_fx = fSNRPenalty2_fx; + move32(); + psGMNode2->fGroupSNRPenalty_exp = fSNRPenalty2_exp; + move16(); + } + ELSE + { + iRMSEnvBits2 = psGMNode2->iGroupRMSEnvelopeCost; + move32(); + fSNRPenalty2_fx = psGMNode2->fGroupSNRPenalty_fx; + move32(); + fSNRPenalty2_exp = psGMNode2->fGroupSNRPenalty_exp; + move16(); + } + + ComputeMergeRMS( iNumBands * iChannels, psGMNode1->iGroupStart, psGMNode1->iGroupLength + psGMNode2->iGroupLength, psGMNode1->pfMergedEnergydB_fx, psGMNode1->piQRMSEnvelope, ppfBandEnergy_man, ppfBandEnergy_exp ); + + /* Compute the RMS Envelope cost for merged group */ + iRMSEnvBitsMerged = ComputeRMSEnvelopeBits( iChannels, iNumBands, psGMNode1->piQRMSEnvelope ); + // fSNRPenalty_exp = 0; + /* Compute an approximation of the bit cost based on SNR increase/decrease due to merging */ + fSNRPenaltyMerged_fx = ComputeSNRPenalty( iChannels, iNumBands, piBandwidths, psGMNode1->iGroupStart, psGMNode1->iGroupLength + psGMNode2->iGroupLength, ppfBandEnergydB_fx, psGMNode1->piQRMSEnvelope, &fSNRPenaltyMerged_exp ); + RMSEnvBits_fx = L_sub( L_sub( iRMSEnvBitsMerged, iRMSEnvBits1 ), iRMSEnvBits2 ); + RMSEnvBits_fx = L_shl( RMSEnvBits_fx, 10 ); // Converting to Q10 + temp = BASOP_Util_Add_Mant32Exp( fSNRPenaltyMerged_fx, fSNRPenaltyMerged_exp, L_negate( fSNRPenalty1_fx ), fSNRPenalty1_exp, &temp_exp ); + fMergedCost_fx = BASOP_Util_Add_Mant32Exp( temp, temp_exp, L_negate( fSNRPenalty2_fx ), fSNRPenalty2_exp, fMergedCost_exp ); + fMergedCost_fx = BASOP_Util_Add_Mant32Exp( fMergedCost_fx, *fMergedCost_exp, RMSEnvBits_fx, 21, fMergedCost_exp ); + // fMergedCost = fSNRPenaltyMerged - fSNRPenalty1 - fSNRPenalty2 + (float) iRMSEnvBitsMerged - (float) iRMSEnvBits1 - (float) iRMSEnvBits2; + + return fMergedCost_fx; +} + + +/*-------------------------------------------------------------------* + * Function ComputeGreedyGroups3() + * + * + *-------------------------------------------------------------------*/ + +static void ComputeGreedyGroups3( + RMSEnvelopeGrouping *psRMSEnvelopeGrouping, + const Word32 iChannels, + const Word32 iNumBands, + const Word32 *piBandwidths, + const Word32 iMaxGroups ) +{ + + Word32 iDone = 0; + Word32 iNumGroups = psRMSEnvelopeGrouping->iMaxGroups; + WHILE( EQ_32( iDone, 0 ) ) + { + GMNode *psGMNode; + GMNode *psBestGMNode; + /* Instead of 1e20f*/ + Word32 fBestMergeCost_fx = 1455191552; // mantissa of 1e20f + move32(); + Word16 fBestMergeCost_exp = 67; // exp of 1e20f + move16(); + Word16 Flag = 0; + move16(); + psGMNode = &psRMSEnvelopeGrouping->psGMNodes[0]; + psBestGMNode = NULL; + WHILE( psGMNode->psNext != NULL ) + { + Word32 fMergeCost_fx = 0; + move32(); + Word16 fMergeCost_exp = 0; + move16(); + fMergeCost_fx = TryMerge2( iChannels, iNumBands, piBandwidths, psRMSEnvelopeGrouping->ppfBandEnergy_man, psRMSEnvelopeGrouping->ppfBandEnergy_exp, psRMSEnvelopeGrouping->ppfBandEnergydB_fx, psGMNode, psGMNode->psNext, &fMergeCost_exp ); + IF( LT_32( fMergeCost_fx, 0 ) && ( GT_32( fBestMergeCost_fx, 0 ) ) ) + { + + Flag = 1; + move16(); + } + ELSE IF( ( GT_32( fMergeCost_fx, 0 ) && ( LT_32( fBestMergeCost_fx, 0 ) ) ) ) + { + Flag = -1; + move16(); + } + ELSE + { + Flag = BASOP_Util_Cmp_Mant32Exp( fBestMergeCost_fx, fBestMergeCost_exp, fMergeCost_fx, fMergeCost_exp ); + } + IF( EQ_32( Flag, 1 ) ) + { + fBestMergeCost_fx = fMergeCost_fx; + move32(); + fBestMergeCost_exp = fMergeCost_exp; + move16(); + psBestGMNode = psGMNode; + } + + psGMNode = psGMNode->psNext; + } + + IF( ( GT_32( fBestMergeCost_fx, 0 ) && ( LE_32( iNumGroups, iMaxGroups ) ) ) ) + { + iDone++; + } + ELSE IF( ( psBestGMNode != NULL ) && ( psBestGMNode->psNext != NULL ) ) + { + psBestGMNode->iGroupLength = L_add( psBestGMNode->psNext->iGroupLength, psBestGMNode->iGroupLength ); + psBestGMNode->fGroupSNRPenalty_fx = L_negate( ONE_IN_Q30 ); + psBestGMNode->fGroupSNRPenalty_exp = 1; + move16(); + psBestGMNode->psNext = psBestGMNode->psNext->psNext; + iNumGroups--; + } + ELSE + { + iDone++; // This only catches a problem + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function ComputeRMSEnvelope() + * + * + *-------------------------------------------------------------------*/ + +static void ComputeRMSEnvelope( + const Word32 iChannels, + const Word32 iNumBands, + const Word32 iNumGroups, + const Word32 *piGroupLengths, + Word32 **ppfBandEnergy_man, + Word16 **ppfBandEnergy_exp, + Word32 ***pppiRMSEnvelope ) +{ + Word32 n; + Word32 fGroupEnergy_fx; + Word16 fGroupEnergy_exp; + Word32 temp; + + FOR( n = 0; n < iChannels; n++ ) + { + Word32 b; + Word32 iChanOffset; + + iChanOffset = L_mult0( extract_l( n ), extract_l( iNumBands ) ); + + FOR( b = 0; b < iNumBands; b++ ) + { + Word32 k; + Word32 iBlockOffset; + iBlockOffset = 0; + FOR( k = 0; k < iNumGroups; k++ ) + { + Word32 m; + fGroupEnergy_exp = 0; + move16(); + fGroupEnergy_fx = 0; + move32(); + FOR( m = 0; m < piGroupLengths[k]; m++ ) + { + fGroupEnergy_fx = BASOP_Util_Add_Mant32Exp( ppfBandEnergy_man[iBlockOffset][b + iChanOffset], ppfBandEnergy_exp[iBlockOffset][b + iChanOffset], fGroupEnergy_fx, fGroupEnergy_exp, &fGroupEnergy_exp ); + iBlockOffset++; + } + fGroupEnergy_fx = Mpy_32_32( fGroupEnergy_fx, Inv_grp_length[piGroupLengths[k]] ); // Division by iGroupLength + fGroupEnergy_fx = BASOP_Util_Log2( fGroupEnergy_fx ); + move32(); + fGroupEnergy_fx = L_add( fGroupEnergy_fx, L_shl( L_deposit_l( fGroupEnergy_exp ), WORD32_BITS - 1 - LD_DATA_SCALE ) ); /*Q25*/ + temp = ( fGroupEnergy_fx > 0 ) ? L_add( fGroupEnergy_fx, ONE_IN_Q24 ) : L_negate( L_add( L_negate( fGroupEnergy_fx ), ONE_IN_Q24 ) ); // Q25 + temp = L_shr( temp, 25 ); + temp = ( temp > ENV_MIN ) ? temp : ENV_MIN; + temp = ( temp < ENV_MAX ) ? temp : ENV_MAX; + pppiRMSEnvelope[n][k][b] = temp; + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function LimitRMSEnvelope() + * + * + *-------------------------------------------------------------------*/ + +static void LimitRMSEnvelope( + const Word32 iBandCount, + const Word32 iRMSDeltaMax, + const Word32 iRMSDeltaMin, + Word32 *piRMSEnvelope ) +{ + Word32 iBand; + Word32 iLastSCF; + + /* Increase low envelope values to ensure that the scale factors traces the large values correctly (checking for max deltas) */ + iLastSCF = piRMSEnvelope[iBandCount - 1]; + move32(); + for ( iBand = iBandCount - 2; iBand > -1; iBand-- ) + { + Word32 iDelta; + + iDelta = L_sub( iLastSCF, piRMSEnvelope[iBand] ); + + IF( GT_32( iDelta, iRMSDeltaMax ) ) + { +#ifdef DEBUG_VERBOSE + printf( "WARNING RMS envelope delta limited\n" ); +#endif + piRMSEnvelope[iBand] = L_add( L_sub( iDelta, iRMSDeltaMax ), piRMSEnvelope[iBand] ); + } + + iLastSCF = piRMSEnvelope[iBand]; + move32(); + } + + /* Increase low envelope values to ensure that the envelope traces the large values correctly (checking for min deltas)*/ + iLastSCF = piRMSEnvelope[0]; + FOR( iBand = 1; iBand < iBandCount; iBand++ ) + { + Word32 iDelta; + + iDelta = L_sub( piRMSEnvelope[iBand], iLastSCF ); + + IF( LT_32( iDelta, iRMSDeltaMin ) ) + { +#ifdef DEBUG_VERBOSE + printf( "WARNING RMS envelope delta limited\n" ); +#endif + piRMSEnvelope[iBand] = L_add( piRMSEnvelope[iBand], L_sub( iRMSDeltaMin, iDelta ) ); + } + + iLastSCF = piRMSEnvelope[iBand]; + move32(); + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function ComputeEnvelopeGrouping() + * + * + *-------------------------------------------------------------------*/ + +void ComputeEnvelopeGrouping( + RMSEnvelopeGrouping *psRMSEnvelopeGrouping, + const Word32 iChannels, + const Word32 iNumBands, + const Word32 *piBandwidths, + Word32 ***pppfReal_fx, + Word32 ***pppfImag_fx, + Word32 *piNumGroups, + Word32 *piGroupLengths, + Word32 ***pppiRMSEnvelope, + Word16 q_final ) +{ + Word32 n; + GMNode *psGMNode; + + /* Compute Band Energies */ + ComputeBandEnergy( iChannels, psRMSEnvelopeGrouping->iNumBlocks, iNumBands, piBandwidths, pppfReal_fx, pppfImag_fx, psRMSEnvelopeGrouping->ppfBandEnergy_man, psRMSEnvelopeGrouping->ppfBandEnergy_exp, psRMSEnvelopeGrouping->ppfBandEnergydB_fx, psRMSEnvelopeGrouping->ppfWeight_man, psRMSEnvelopeGrouping->ppfWeight_exp, q_final ); + /* Init GMNodes */ + psRMSEnvelopeGrouping->psGMNodes[0].iGroupStart = 0; + move32(); + psRMSEnvelopeGrouping->psGMNodes[0].iGroupLength = 2; + move32(); + psRMSEnvelopeGrouping->psGMNodes[0].psNext = NULL; + psRMSEnvelopeGrouping->psGMNodes[0].iGroupRMSEnvelopeCost = -1; + move32(); + psRMSEnvelopeGrouping->psGMNodes[0].fGroupSNRPenalty_fx = L_negate( ONE_IN_Q30 ); + psRMSEnvelopeGrouping->psGMNodes[0].fGroupSNRPenalty_exp = 1; + move16(); + FOR( n = 1; n < psRMSEnvelopeGrouping->iMaxGroups; n++ ) + { + psRMSEnvelopeGrouping->psGMNodes[n - 1].psNext = &psRMSEnvelopeGrouping->psGMNodes[n]; + psRMSEnvelopeGrouping->psGMNodes[n].iGroupStart = L_shl( n, 1 ); + move32(); + psRMSEnvelopeGrouping->psGMNodes[n].iGroupLength = 2; + move32(); + psRMSEnvelopeGrouping->psGMNodes[n].iGroupRMSEnvelopeCost = -1; + move32(); + psRMSEnvelopeGrouping->psGMNodes[n].fGroupSNRPenalty_fx = L_negate( ONE_IN_Q30 ); + psRMSEnvelopeGrouping->psGMNodes[n].fGroupSNRPenalty_exp = 1; + move16(); + psRMSEnvelopeGrouping->psGMNodes[n].psNext = NULL; + } + /* Perform grouping via Greedy Merge */ + /* Allows control over max groups can call using 16 if want same as previous call */ + ComputeGreedyGroups3( psRMSEnvelopeGrouping, iChannels, iNumBands, piBandwidths, psRMSEnvelopeGrouping->iNumBlocks ); + /* Calc Groups from Merge Results */ + *piNumGroups = 0; + move32(); + psGMNode = &psRMSEnvelopeGrouping->psGMNodes[0]; + WHILE( psGMNode != NULL ) + { + piGroupLengths[*piNumGroups] = psGMNode->iGroupLength; + move32(); + *piNumGroups = L_add( *piNumGroups, 1 ); + psGMNode = psGMNode->psNext; + } + /* Compute RMS Envelope given group lengths */ + ComputeRMSEnvelope( iChannels, iNumBands, *piNumGroups, piGroupLengths, psRMSEnvelopeGrouping->ppfBandEnergy_man, psRMSEnvelopeGrouping->ppfBandEnergy_exp, pppiRMSEnvelope ); + + /* Envelope Tenting */ + FOR( n = 0; n < iChannels; n++ ) + { + Word32 k; + FOR( k = 0; k < *piNumGroups; k++ ) + { + LimitRMSEnvelope( iNumBands, ENV_DELTA_MAX, ENV_DELTA_MIN, pppiRMSEnvelope[n][k] ); + } + } + + return; +} diff --git a/lib_isar/isar_cnst.h b/lib_isar/isar_cnst.h new file mode 100644 index 0000000000000000000000000000000000000000..40d6c393857ee28145728999a52dfded680ec8db --- /dev/null +++ b/lib_isar/isar_cnst.h @@ -0,0 +1,156 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef ISAR_CNST_H +#define ISAR_CNST_H + +#include +#include "options.h" + +/* clang-format off */ +/*----------------------------------------------------------------------------------* + * Split Binaural Rendering Constants + *----------------------------------------------------------------------------------*/ + +typedef enum +{ + PCM_INT16, + PCM_FLOAT32, + PCM_NOT_KNOW = 0xffff +} PCM_RESOLUTION; + +typedef enum +{ + ANY_YAW, + PITCH_ONLY, + ANY_ROLL, + PRED_ONLY, + PRED_ROLL_ONLY, + COM_GAIN_ONLY, + LR_GAIN_ONLY +} ISAR_SPLIT_REND_POSE_TYPE; + + +#define CLDFB_PLC_XF 2 /* Length of cross-fade into first good frame after frame loss in CLDFB cols. */ + +#define SPLIT_REND_MAX_YAW_ONLY_POSES 2 +#define SPLIT_REND_MAX_PITCH_ONLY_POSES 2 +#define SPLIT_REND_MAX_ROLL_ONLY_POSES 2 +#define SPLIT_REND_MAX_ONE_AXIS_MD_POSES 2 +#define MAX_EXTRAPOLATION_ANGLE 15.0f /* this means additional 15 degrees can be extrapolated on top of MD probing poses*/ +#define MAX_EXTRAPOLATION_ANGLE_Q22 (62914560) /* this means additional 15 degrees can be extrapolated on top of MD probing poses*/ + +#define MAX_HEAD_ROT_POSES ( 2 + SPLIT_REND_MAX_YAW_ONLY_POSES + SPLIT_REND_MAX_PITCH_ONLY_POSES + SPLIT_REND_MAX_ROLL_ONLY_POSES ) +#define MAX_SPLIT_REND_MD_BANDS 20 +#define MAX_SPLIT_MD_SUBFRAMES 1 +#define COMPLEX_MD_BAND_THRESH MAX_SPLIT_REND_MD_BANDS +#define COMPLEX_MD_BAND_THRESH_LOW 4 +#define COMPLEX_MD_BAND_THRESH_HIGH 10 +#define SPLIT_REND_RO_MD_BAND_THRESH 4 + +#define ISAR_SPLIT_REND_PRED_63QUANT_PNTS_LOG2_CEIL 6 +#define ISAR_SPLIT_REND_PRED_31QUANT_PNTS_LOG2_CEIL 5 +#define ISAR_SPLIT_REND_ROLL_PRED_QUANT_PNTS_LOG2_CEIL 5 +#define ISAR_SPLIT_REND_D_QUANT_PNTS_LOG2_CEIL 4 + +#define ISAR_SPLIT_REND_PRED_MIN_VAL_Q30 -1503238553 //Q30 +#define ISAR_SPLIT_REND_PRED_MAX_VAL_Q30 1503238553 //Q30 + +#define ISAR_SPLIT_REND_NUM_QUANT_STRATS 4 +#define ISAR_SPLIT_REND_PRED_63QUANT_PNTS 63 +#define ISAR_SPLIT_REND_PRED_31QUANT_PNTS 31 +#define ISAR_SPLIT_REND_ROLL_PRED_QUANT_PNTS 31 +#define ISAR_SPLIT_REND_D_QUANT_PNTS 15 +#ifdef DEBUG_QUANT_MD_FX +#define ISAR_SPLIT_REND_PRED_MIN_VAL -1.4f +#define ISAR_SPLIT_REND_PRED_MAX_VAL 1.4f +#endif + +#ifdef DEBUG_QUANT_MD_FX +#define ISAR_SPLIT_REND_PITCH_G_MIN_VAL 0.5f +#define ISAR_SPLIT_REND_PITCH_G_MAX_VAL 1.5f +#endif +#define ISAR_SPLIT_REND_PITCH_G_MIN_VAL_Q30 (1<<29) //0.5f in Q30 +#define ISAR_SPLIT_REND_PITCH_G_MAX_VAL_Q30 1610612736 //1.5f in Q30 +#define ISAR_SPLIT_REND_PITCH_G_QUANT_PNTS ISAR_SPLIT_REND_D_QUANT_PNTS +#ifdef DEBUG_QUANT_MD_FX +#define ISAR_SPLIT_REND_D_MIN_VAL 0.0f +#define ISAR_SPLIT_REND_D_MAX_VAL 1.0f +#endif +#define ISAR_SPLIT_REND_D_MIN_VAL_FX 0 //Q31 +#define ISAR_SPLIT_REND_D_MAX_VAL_FX MAX_32 //Q31 + +#define ISAR_SPLIT_REND_PRED_ROLL_Q_STEP ( ( ISAR_SPLIT_REND_PRED_MAX_VAL - ISAR_SPLIT_REND_PRED_MIN_VAL ) / ( ISAR_SPLIT_REND_ROLL_PRED_QUANT_PNTS - 1 ) ) +#define ISAR_SPLIT_REND_PRED_ROLL_Q_STEP_Q31 200431807 +#define ISAR_SPLIT_REND_PRED_ROLL_1BYQ_STEP_Q26 719023543 +#define ISAR_SPLIT_REND_PRED_ROLL_1BYQ_STEP ( ( ISAR_SPLIT_REND_ROLL_PRED_QUANT_PNTS - 1 ) / ( ISAR_SPLIT_REND_PRED_MAX_VAL - ISAR_SPLIT_REND_PRED_MIN_VAL ) ) +#define ISAR_SPLIT_REND_PRED31_Q_STEP ( ( ISAR_SPLIT_REND_PRED_MAX_VAL - ISAR_SPLIT_REND_PRED_MIN_VAL ) / ( ISAR_SPLIT_REND_PRED_31QUANT_PNTS - 1 ) ) +#define ISAR_SPLIT_REND_PRED31_1BYQ_STEP ( ( ISAR_SPLIT_REND_PRED_31QUANT_PNTS - 1 ) / ( ISAR_SPLIT_REND_PRED_MAX_VAL - ISAR_SPLIT_REND_PRED_MIN_VAL ) ) +#define ISAR_SPLIT_REND_PRED63_Q_STEP ( ( ISAR_SPLIT_REND_PRED_MAX_VAL - ISAR_SPLIT_REND_PRED_MIN_VAL ) / ( ISAR_SPLIT_REND_PRED_63QUANT_PNTS - 1 ) ) +#define ISAR_SPLIT_REND_PRED63_1BYQ_STEP ( ( ISAR_SPLIT_REND_PRED_63QUANT_PNTS - 1 ) / ( ISAR_SPLIT_REND_PRED_MAX_VAL - ISAR_SPLIT_REND_PRED_MIN_VAL ) ) + +#define ISAR_SPLIT_REND_PRED31_Q_STEP_FX_Q31 200431807 +#define ISAR_SPLIT_REND_PRED31_1BYQ_STEP_FX_Q26 719023543 +#define ISAR_SPLIT_REND_PRED63_Q_STEP_FX_Q31 96983132 +#define ISAR_SPLIT_REND_PRED63_1BYQ_STEP_FX_Q26 1485981989 + +#define ISAR_SPLIT_REND_D_Q_STEP ( ( ISAR_SPLIT_REND_D_MAX_VAL - ISAR_SPLIT_REND_D_MIN_VAL ) / ( ISAR_SPLIT_REND_D_QUANT_PNTS - 1 ) ) +#define ISAR_SPLIT_REND_D_1BYQ_STEP ( ( ISAR_SPLIT_REND_D_QUANT_PNTS - 1 ) / ( ISAR_SPLIT_REND_D_MAX_VAL - ISAR_SPLIT_REND_D_MIN_VAL ) ) +#define ISAR_SPLIT_REND_PITCH_G_Q_STEP ( ( ISAR_SPLIT_REND_PITCH_G_MAX_VAL - ISAR_SPLIT_REND_PITCH_G_MIN_VAL ) / ( ISAR_SPLIT_REND_PITCH_G_QUANT_PNTS - 1 ) ) +#define ISAR_SPLIT_REND_PITCH_G_1BYQ_STEP ( ( ISAR_SPLIT_REND_PITCH_G_QUANT_PNTS - 1 ) / ( ISAR_SPLIT_REND_PITCH_G_MAX_VAL - ISAR_SPLIT_REND_PITCH_G_MIN_VAL ) ) +#define ISAR_SPLIT_REND_D_Q_STEP_Q31 153391689 +#define ISAR_SPLIT_REND_D_1BYQ_STEP_Q27 (14 << 27) //Q27 +#define ISAR_SPLIT_REND_PITCH_G_Q_STEP_Q31 153391689 +#define ISAR_SPLIT_REND_PITCH_G_1BYQ_STEP_Q27 (14 << 27) //Q27 + + +#define ISAR_SPLIT_REND_HEAD_POSE_BITS 9 +#define ISAR_SPLIT_REND_DOF_BITS 2 +#define ISAR_SPLIT_REND_HQ_MODE_BITS 1 +#define ISAR_SPLIT_REND_ROT_AXIS_BITS 3 +#define ISAR_SPLIT_REND_RO_FLAG_BITS 1 + +#define ISAR_LC3PLUS_MAX_NUM_DECODERS 2 + +/*----------------------------------------------------------------------------------* + * Split rendering bitrate constants + *----------------------------------------------------------------------------------*/ + +#define SPLIT_REND_256k 256000 +#define SPLIT_REND_320k 320000 +#define SPLIT_REND_384k 384000 +#define SPLIT_REND_512k 512000 +#define SPLIT_REND_768k 768000 + + +#endif /*ISAR_CNST_H */ +/* clang-format on */ diff --git a/lib_isar/isar_lc3plus_common.c b/lib_isar/isar_lc3plus_common.c new file mode 100644 index 0000000000000000000000000000000000000000..f7fe0db32ebeba38eeec378a57c47154a8031046 --- /dev/null +++ b/lib_isar/isar_lc3plus_common.c @@ -0,0 +1,118 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include "isar_lc3plus_common.h" +#include "ivas_error.h" +#include "lc3plus.h" + +/*-----------------------------------------------------------------------------------------* + * Function ISAR_LC3PLUS_LC3plusErrToIvasErr() + * + * + *-----------------------------------------------------------------------------------------*/ + +ivas_error ISAR_LC3PLUS_LC3plusErrToIvasErr( + const LC3PLUS_Error lc3PlusError ) +{ + switch ( lc3PlusError ) + { + case LC3PLUS_OK: + return IVAS_ERR_OK; + case LC3PLUS_BITRATE_ERROR: + return IVAS_ERR_LC3PLUS_INVALID_BITRATE; + default: + break; + } + + return IVAS_ERR_INTERNAL; +} + + +/*-----------------------------------------------------------------------------------------* + * Function IVAS_LC3PLUS_LC3plusRtpErrToIvasErr() + * + * + *-----------------------------------------------------------------------------------------*/ + +ivas_error IVAS_LC3PLUS_LC3plusRtpErrToIvasErr( + const LC3PLUS_RTP_ERR lc3PlusRtpError ) +{ + switch ( lc3PlusRtpError ) + { + case LC3PLUS_RTP_ERR_NO_ERROR: + return IVAS_ERR_OK; + case LC3PLUS_RTP_ERR_NULL_PTR: + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + case LC3PLUS_RTP_ERR_INVALID_PARAMETERS: + return IVAS_ERR_WRONG_PARAMS; + case LC3PLUS_RTP_ERR_NOT_IMPLEMENTED: + return IVAS_ERR_NOT_IMPLEMENTED; + case LC3PLUS_RTP_ERR_UNSUPPORTED_CONFIGURATION: + return IVAS_ERR_INTERNAL; + case LC3PLUS_RTP_ERR_INVALID_BITSTREAM: + return IVAS_ERR_UNEXPECTED_LC3PLUS_BITSTREAM; + case LC3PLUS_RTP_ERR_INVALID_BITSTREAM_SIZE: + return IVAS_ERR_INVALID_BUFFER_SIZE; + case LC3PLUS_RTP_ERR_NOT_ENOUGH_FTDS_ALLOCATED: + return IVAS_ERR_INTERNAL; + case LC3PLUS_RTP_ERR_GENERIC_ERROR: + default: + break; + } + + return IVAS_ERR_UNKNOWN; +} + +/*-----------------------------------------------------------------------------------------* + * Function IVAS_LC3PLUS_UsToLC3plusFrameDuration() + * + * + *-----------------------------------------------------------------------------------------*/ + +LC3PLUS_FrameDuration IVAS_LC3PLUS_UsToLC3plusFrameDuration( + const int16_t lc3PlusFrameDurationUs ) +{ + switch ( lc3PlusFrameDurationUs ) + { + case 2500: + return LC3PLUS_FRAME_DURATION_2p5MS; + case 5000: + return LC3PLUS_FRAME_DURATION_5MS; + case 10000: + return LC3PLUS_FRAME_DURATION_10MS; + default: + break; + } + + return LC3PLUS_FRAME_DURATION_UNDEFINED; +} diff --git a/lib_isar/isar_lc3plus_common.h b/lib_isar/isar_lc3plus_common.h new file mode 100644 index 0000000000000000000000000000000000000000..3b52e5b3f15c0ce29c25f7d640140530db05afb6 --- /dev/null +++ b/lib_isar/isar_lc3plus_common.h @@ -0,0 +1,67 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef ISAR_LC3PLUS_COM_H +#define ISAR_LC3PLUS_COM_H + + +#include +#include "options.h" +#include "ivas_error.h" +#include "lc3plus.h" +#include "isar_lc3plus_payload.h" + +/*! common configuration parameters between encoder and decoder */ +typedef struct LC3PLUS_CONFIG +{ + /*! frame duration in microseconds [10000, 5000, 2500] */ + int16_t lc3plus_frame_duration_us; + /*! ISAR frame duration in microseconds [20000, 10000, 5000] */ + int16_t isar_frame_duration_us; + /*! sampling rate*/ + int32_t samplerate; + /*! number of channels */ + int16_t channels; + /*! high resolution mode enabled (1) or disabled (0)*/ + int16_t high_res_mode_enabled; +} LC3PLUS_CONFIG; + +/*! utility function to convert LC3PLUS_Errors to the suitable ivas_error */ +ivas_error ISAR_LC3PLUS_LC3plusErrToIvasErr( const LC3PLUS_Error lc3PlusError ); + +/*! utility function to convert LC3PLUS_Errors to the suitable ivas_error */ +ivas_error IVAS_LC3PLUS_LC3plusRtpErrToIvasErr( const LC3PLUS_RTP_ERR lc3PlusRtpError ); + +/*! utility function to convert a value in microseconds to an LC3PLUS_FrameDuration */ +LC3PLUS_FrameDuration IVAS_LC3PLUS_UsToLC3plusFrameDuration( const int16_t lc3PlusFrameDuration ); + +#endif /* ISAR_LC3PLUS_COM_H */ diff --git a/lib_isar/isar_lc3plus_dec.c b/lib_isar/isar_lc3plus_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..2ac21e4d3670fa1542c9e0752ef448eefa0b8933 --- /dev/null +++ b/lib_isar/isar_lc3plus_dec.c @@ -0,0 +1,557 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "prot_fx.h" +#include "ivas_prot_fx.h" +#include "isar_lc3plus_dec.h" +#include "isar_lc3plus_common.h" +#include "lc3plus.h" +#include "ivas_error_utils.h" +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * ISAR_LC3PLUS_DEC_Open() + * + * + *------------------------------------------------------------------------*/ + +ivas_error ISAR_LC3PLUS_DEC_Open( + const LC3PLUS_CONFIG config, /* i : LC3plus decoder configuration */ + ISAR_LC3PLUS_DEC_HANDLE *handle /* o : decoder handle */ +) +{ + LC3PLUS_Error err; + int32_t decoder_size; + Word32 scratch_size; + int16_t i; + + if ( 0 == config.lc3plus_frame_duration_us ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid lc3plus_frame_duration_us (0)\n" ); + } + + if ( ( *handle = malloc( sizeof( struct ISAR_LC3PLUS_DEC_HANDLE ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus wrapper handle\n" ); + } + + if ( config.channels > ISAR_LC3PLUS_MAX_NUM_DECODERS ) + { + return IVAS_ERROR( IVAS_ERR_INIT_ERROR, "Maximum number of channels exceeds ISAR_LC3PLUS_MAX_NUM_DECODERS\n" ); + } + + + ( *handle )->num_decs = 0; + ( *handle )->pcm_conversion_buffer = NULL; + ( *handle )->handles = NULL; + ( *handle )->selective_decoding_states = NULL; + ( *handle )->bitstream_caches = NULL; + ( *handle )->scratch = NULL; + + if ( ( ( *handle )->handles = malloc( config.channels * sizeof( ISAR_LC3PLUS_DEC_HANDLE ) ) ) == NULL ) + { + ISAR_LC3PLUS_DEC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus wrapper handle\n" ); + } + + if ( ( ( *handle )->selective_decoding_states = malloc( config.channels * sizeof( ISAR_LC3PLUS_DEC_SELECTIVE_DECODING_STATE * ) ) ) == NULL ) + { + ISAR_LC3PLUS_DEC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus wrapper handle\n" ); + } + + for ( i = 0; i < config.channels; ++i ) + { + ( *handle )->handles[i] = NULL; + ( *handle )->selective_decoding_states[i] = NULL; + } + + if ( ( ( *handle )->bitstream_caches = malloc( config.channels * sizeof( ISAR_LC3PLUS_DEC_BITSTREAM_CACHE * ) ) ) == NULL ) + { + ISAR_LC3PLUS_DEC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus wrapper handle\n" ); + } + for ( i = 0; i < config.channels; ++i ) + { + ( *handle )->bitstream_caches[i] = NULL; + } + + ( *handle )->num_decs = config.channels; + for ( int32_t iCh = 0; iCh < config.channels; iCh++ ) + { + ( *handle )->selective_decoding_states[iCh] = NULL; + if ( NULL != ( *handle )->bitstream_caches ) + { + ( *handle )->bitstream_caches[iCh] = NULL; + } + /* allocate and configure LC3plus decoder */ + decoder_size = lc3plus_dec_get_size( config.samplerate, 1, LC3PLUS_PLC_ADVANCED ); + if ( 0 == decoder_size ) + { + ISAR_LC3PLUS_DEC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_INTERNAL, "lc3plus_dec_get_size failed\n" ); + } + + if ( ( ( *handle )->handles[iCh] = malloc( decoder_size ) ) == NULL ) + { + ISAR_LC3PLUS_DEC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus decoder\n" ); + } + + err = lc3plus_dec_init( ( *handle )->handles[iCh], config.samplerate, 1, LC3PLUS_PLC_ADVANCED, config.high_res_mode_enabled ); + if ( LC3PLUS_OK != err ) + { + ISAR_LC3PLUS_DEC_Close( handle ); + return IVAS_ERROR( ISAR_LC3PLUS_LC3plusErrToIvasErr( err ), "lc3plus_dec_init failed\n" ); + } + + err = lc3plus_dec_set_frame_dms( ( *handle )->handles[iCh], IVAS_LC3PLUS_UsToLC3plusFrameDuration( config.lc3plus_frame_duration_us ) ); + if ( LC3PLUS_OK != err ) + { + ISAR_LC3PLUS_DEC_Close( handle ); + return IVAS_ERROR( ISAR_LC3PLUS_LC3plusErrToIvasErr( err ), "lc3plus_dec_set_frame_dms failed\n" ); + } + + /* allocate and configure per LC3plus decoder skip state */ + if ( ( ( *handle )->selective_decoding_states[iCh] = malloc( sizeof( ISAR_LC3PLUS_DEC_SELECTIVE_DECODING_STATE ) ) ) == NULL ) + { + ISAR_LC3PLUS_DEC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus decoder\n" ); + } + + + ( *handle )->selective_decoding_states[iCh]->has_skipped_a_frame = 0; + ( *handle )->selective_decoding_states[iCh]->shall_decode_cached_frame = 0; + ( *handle )->selective_decoding_states[iCh]->frame_action = DEC_ACTION_DECODE_AND_USE; + + /* allocate and configure per LC3plus decoder bitstream cache */ + if ( ( ( *handle )->bitstream_caches[iCh] = malloc( sizeof( ISAR_LC3PLUS_DEC_BITSTREAM_CACHE ) ) ) == NULL ) + { + ISAR_LC3PLUS_DEC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus decoder\n" ); + } + ( *handle )->bitstream_caches[iCh]->bitstream_cache_capacity = 400 /*LC3plus max non-HR octet count*/; + if ( ( ( *handle )->bitstream_caches[iCh]->bitstream_cache = malloc( ( *handle )->bitstream_caches[iCh]->bitstream_cache_capacity ) ) == NULL ) + { + ISAR_LC3PLUS_DEC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus decoder\n" ); + } + ( *handle )->bitstream_caches[iCh]->bitstream_cache_size = 0; + } + + ( *handle )->config = config; + if ( config.isar_frame_duration_us < config.lc3plus_frame_duration_us || config.isar_frame_duration_us % config.lc3plus_frame_duration_us != 0 ) + { + ISAR_LC3PLUS_DEC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "Current pcm_conversion_buffer sizing requires that lc3plus uses a shorter or equal frame duration than ivas\n" ); + } + + if ( ( ( *handle )->pcm_conversion_buffer = malloc( sizeof( int16_t ) * config.samplerate * config.lc3plus_frame_duration_us / 1000000 ) ) == NULL ) + { + ISAR_LC3PLUS_DEC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus decoder wrapper pcm_conversion_buffer\n" ); + } + + scratch_size = lc3plus_dec_get_scratch_size( ( *handle )->handles[0] ); + if ( ( ( *handle )->scratch = malloc( sizeof( uint8_t ) * scratch_size ) ) == NULL ) + { + ISAR_LC3PLUS_DEC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus decoder wrapper scratch\n" ); + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ISAR_LC3PLUS_DEC_GetDelay() + * + * + *------------------------------------------------------------------------*/ + +ivas_error ISAR_LC3PLUS_DEC_GetDelay( + ISAR_LC3PLUS_DEC_HANDLE handle, /* i : LC3plus decoder handle */ + int32_t *delayInSamples /* o : decoder delay in number of samples per channel */ +) +{ + int32_t tmpDelayInSamples; + + if ( NULL == handle ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "ISAR_LC3PLUS_DEC_HANDLE is NULL\n" ); + } + if ( NULL == delayInSamples ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "delayInSamples is NULL\n" ); + } + + *delayInSamples = 0; + /* sanity check whether all encoders are actually configured identically */ + for ( uint32_t iDec = 0; iDec < handle->num_decs; iDec++ ) + { + if ( NULL == handle->handles[iDec] ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "LC3plus decoder handle is NULL\n" ); + } + + tmpDelayInSamples = lc3plus_dec_get_delay( handle->handles[iDec] ); + if ( 0 != *delayInSamples && tmpDelayInSamples != *delayInSamples ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Not all mono LC3plus decoders are configured identically\n" ); + } + + *delayInSamples = tmpDelayInSamples; + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ISAR_LC3PLUS_DEC_Close() + * + * + *------------------------------------------------------------------------*/ + +void ISAR_LC3PLUS_DEC_Close( + ISAR_LC3PLUS_DEC_HANDLE *handle /* i/o: Pointer to LC3plus decoder handle */ +) +{ + if ( NULL == handle || NULL == *handle ) + { + return; + } + for ( uint32_t iDec = 0; iDec < ( *handle )->num_decs; iDec++ ) + { + if ( NULL != ( *handle )->handles && NULL != ( *handle )->handles[iDec] ) + { + free( ( *handle )->handles[iDec] ); + } + + if ( NULL != ( *handle )->selective_decoding_states && NULL != ( *handle )->selective_decoding_states[iDec] ) + { + free( ( *handle )->selective_decoding_states[iDec] ); + } + + if ( NULL != ( *handle )->bitstream_caches && NULL != ( *handle )->bitstream_caches[iDec] ) + { + free( ( *handle )->bitstream_caches[iDec]->bitstream_cache ); + free( ( *handle )->bitstream_caches[iDec] ); + } + } + + if ( NULL != ( *handle )->pcm_conversion_buffer ) + { + free( ( *handle )->pcm_conversion_buffer ); + } + if ( NULL != ( *handle )->scratch ) + { + free( ( *handle )->scratch ); + } + + free( ( *handle )->handles ); + + if ( NULL != ( *handle )->bitstream_caches ) + { + free( ( *handle )->bitstream_caches ); + } + free( ( *handle )->selective_decoding_states ); + + free( *handle ); + *handle = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * decode_or_conceal_one_lc3plus_frame() + * + * + *------------------------------------------------------------------------*/ + +static ivas_error decode_or_conceal_one_lc3plus_frame( + LC3PLUS_Dec *dec, + uint8_t *bitstream_in, + const int32_t bitstream_in_length, + int16_t **pcm_out_buffer, + const int32_t badFrameIndicator, + uint8_t *scratch ) +{ + LC3PLUS_Error err; + + push_wmops( "lc3plus_dec16" ); + err = lc3plus_dec16( dec, bitstream_in, bitstream_in_length, pcm_out_buffer, scratch, badFrameIndicator ); + pop_wmops(); + + if ( err == LC3PLUS_DECODE_ERROR && 1 == badFrameIndicator ) + { + /* LC3PLUS_DECODE_ERROR && badFrameIndicator means that the decoder has successfully concealed, which is actually OK. */ + err = LC3PLUS_OK; + } + + if ( err != LC3PLUS_OK ) + { + return IVAS_ERROR( ISAR_LC3PLUS_LC3plusErrToIvasErr( err ), "lc3plus_dec16 failed\n" ); + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * isar_LC3PLUS_DEC_Decode_or_Conceal_internal() + * + * + *------------------------------------------------------------------------*/ + +static ivas_error isar_LC3PLUS_DEC_Decode_or_Conceal_internal( + ISAR_LC3PLUS_DEC_HANDLE handle, /* i : LC3plus decoder configuration */ + uint8_t *bitstream_in, /* i : pointer to input bitstream */ + int32_t bitstream_in_size, /* i : size of bitstream_in */ + const int16_t badFrameIndicator, /* i : bad frame indicator. If set to 1, triggers concealment */ + Word32 **pcm_out /* o : decoded samples */ +) +{ + uint32_t iDec; + int32_t config_num_media_times; + int32_t iMediaTime; + int32_t iFtd; + LC3PLUS_RTP_PAYLOAD payload; + int32_t ivasSampleIndex; + int16_t numSamplesPerLC3plusChannel; + ivas_error err; + + if ( NULL == handle ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "LC3PLUS_Dec_Wrap_Handle is NULL\n" ); + } + if ( NULL == bitstream_in ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "bitstream_in is NULL\n" ); + } + if ( NULL == pcm_out ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "pcm_out is NULL\n" ); + } + if ( badFrameIndicator != 0 && badFrameIndicator != 1 ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "badFrameIndicator must be 1 or 0\n" ); + } + if ( badFrameIndicator == 0 && bitstream_in_size <= 0 ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "bitstream_in_size must be positive\n" ); + } + + if ( handle->config.isar_frame_duration_us % handle->config.lc3plus_frame_duration_us != 0 ) + { + return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "isar_frame_duration_us must be equal or multiple of lc3plus_frame_duration_us \n" ); + } + + config_num_media_times = handle->config.isar_frame_duration_us / handle->config.lc3plus_frame_duration_us; + if ( !badFrameIndicator ) + { + if ( LC3PLUS_RTP_payload_deserialize( &payload, bitstream_in, bitstream_in_size ) != LC3PLUS_RTP_ERR_NO_ERROR ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "LC3PLUS_RTP_payload_deserialize failed\n" ); + } + if ( payload.sampling_rate_hz != handle->config.samplerate ) + { + return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "LC3plus config change (samplerate) in bitstream is not supported\n" ); + } + if ( payload.num_channels != handle->config.channels ) + { + return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "LC3plus config change (number of channels) in bitstream is not supported\n" ); + } + if ( payload.frame_duration_us != handle->config.lc3plus_frame_duration_us ) + { + return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "LC3plus config change (frame duration) in bitstream is not supported\n" ); + } + if ( payload.high_resolution_enabled != handle->config.high_res_mode_enabled ) + { + return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "LC3plus config change (high resolution mode) in bitstream is not supported\n" ); + } + if ( payload.num_media_times != config_num_media_times ) + { + return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "LC3plus config change (number of media times per frame data block) in bitstream is not supported\n" ); + } + } + + numSamplesPerLC3plusChannel = (int16_t) ( handle->config.samplerate / ( 1000000 / handle->config.isar_frame_duration_us ) / config_num_media_times ); + for ( iDec = 0; iDec < handle->num_decs; iDec++ ) + { + for ( iMediaTime = 0; iMediaTime < config_num_media_times; iMediaTime++ ) + { + iFtd = iDec + iMediaTime * handle->num_decs; + if ( handle->selective_decoding_states[iDec]->shall_decode_cached_frame ) + { + if ( 0 == handle->bitstream_caches[iDec]->bitstream_cache_size ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "LC3plus cache is empty\n" ); + } + + err = decode_or_conceal_one_lc3plus_frame( handle->handles[iDec], handle->bitstream_caches[iDec]->bitstream_cache, handle->bitstream_caches[iDec]->bitstream_cache_size, &handle->pcm_conversion_buffer, badFrameIndicator, handle->scratch ); + if ( err != IVAS_ERR_OK ) + { + return IVAS_ERROR( err, "lc3plus decoding failed\n" ); + } + handle->selective_decoding_states[iDec]->shall_decode_cached_frame = 0; + handle->selective_decoding_states[iDec]->has_skipped_a_frame = 0; + } + + /* reset cache if caching is enabled - it has either been decoded or is not needed */ + if ( NULL != handle->bitstream_caches ) + { + handle->bitstream_caches[iDec]->bitstream_cache_size = 0; + } + + switch ( handle->selective_decoding_states[iDec]->frame_action ) + { + case DEC_ACTION_DECODE_AND_USE: + { + if ( badFrameIndicator ) + { + err = decode_or_conceal_one_lc3plus_frame( handle->handles[iDec], bitstream_in, bitstream_in_size, &handle->pcm_conversion_buffer, badFrameIndicator, handle->scratch ); + } + else if ( payload.ftds[iFtd].frame_data_length == LC3PLUS_RTP_FDL_SPEECH_BAD ) + { + return IVAS_ERR_NOT_IMPLEMENTED; + /* Untested therefore disabled. Would probably only need to call concealment, + * but the LC3plus API requires a non-NULL ptr for this which is not available here */ + } + else + { + err = decode_or_conceal_one_lc3plus_frame( handle->handles[iDec], payload.ftds[iFtd].frame_data, payload.ftds[iFtd].frame_data_length, &handle->pcm_conversion_buffer, badFrameIndicator, handle->scratch ); + } + if ( err != IVAS_ERR_OK ) + { + return IVAS_ERROR( err, "lc3plus decoding failed\n" ); + } + + for ( int16_t iSampleInt16 = 0; iSampleInt16 < numSamplesPerLC3plusChannel; iSampleInt16++ ) + { + ivasSampleIndex = iSampleInt16 + iMediaTime * numSamplesPerLC3plusChannel; + pcm_out[iDec][ivasSampleIndex] = handle->pcm_conversion_buffer[iSampleInt16]; + } + handle->selective_decoding_states[iDec]->has_skipped_a_frame = 0; + break; + } + case DEC_ACTION_CACHE: + { + if ( handle->bitstream_caches[iDec]->bitstream_cache_capacity < (int32_t) payload.ftds[iFtd].frame_data_length ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "bitstream_cache_capacity is too low for LC3plus frame size\n" ); + } + /* store bit rate of cached frame */ + mvc2c( payload.ftds[iFtd].frame_data, handle->bitstream_caches[iDec]->bitstream_cache, (int16_t) payload.ftds[iFtd].frame_data_length ); + handle->bitstream_caches[iDec]->bitstream_cache_size = payload.ftds[iFtd].frame_data_length; + /* log that this instance has skipped a frame and must decode twice once reactivated */ + handle->selective_decoding_states[iDec]->has_skipped_a_frame = 1; + break; + } + case DEC_ACTION_NUM_ENUMS: + default: + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid LC3plus decoder state\n" ); + } + } /* for each media time */ + /* reset skipping state, must be set by the user before each decode call*/ + handle->selective_decoding_states[iDec]->frame_action = DEC_ACTION_DECODE_AND_USE; + } /* for each dec/channel */ + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ISAR_LC3PLUS_DEC_Decode() + * + * + *------------------------------------------------------------------------*/ + +ivas_error ISAR_LC3PLUS_DEC_Decode( + ISAR_LC3PLUS_DEC_HANDLE handle, /* i : LC3plus decoder configuration */ + uint8_t *bitstream_in, /* i : pointer to input bitstream */ + const int32_t bitstream_in_size, /* i : size of bitstream_in */ + Word32 **pcm_out /* o : decoded samples */ +) +{ + int16_t badFrameIndicator; + + if ( NULL == handle ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "LC3PLUS_Dec_Wrap_Handle is NULL\n" ); + } + if ( NULL == bitstream_in ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "bitstream_in is NULL\n" ); + } + if ( NULL == pcm_out ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "pcm_out is NULL\n" ); + } + badFrameIndicator = 0; + + return isar_LC3PLUS_DEC_Decode_or_Conceal_internal( handle, bitstream_in, bitstream_in_size, badFrameIndicator, pcm_out ); +} + + +/*------------------------------------------------------------------------- + * ISAR_LC3PLUS_DEC_Conceal() + * + * + *------------------------------------------------------------------------*/ + +ivas_error ISAR_LC3PLUS_DEC_Conceal( + ISAR_LC3PLUS_DEC_HANDLE handle, /* i : LC3plus decoder handle */ + Word32 **pcm_out /* o : decoded samples */ +) +{ + uint8_t bitstream_in[LC3PLUS_MAX_BYTES]; + int16_t badFrameIndicator; + + if ( NULL == handle ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "LC3PLUS_Dec_Wrap_Handle is NULL\n" ); + } + + if ( NULL == pcm_out ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "pcm_out is NULL\n" ); + } + + /* LC3plus API requires a non-NULL bitstream pointer, even when triggering concealment */ + badFrameIndicator = 1; + + return isar_LC3PLUS_DEC_Decode_or_Conceal_internal( handle, bitstream_in, 0, badFrameIndicator, pcm_out ); +} diff --git a/lib_isar/isar_lc3plus_dec.h b/lib_isar/isar_lc3plus_dec.h new file mode 100644 index 0000000000000000000000000000000000000000..8328b1fa767274db5be43ed4a8bcdc64d4a79cee --- /dev/null +++ b/lib_isar/isar_lc3plus_dec.h @@ -0,0 +1,109 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef ISAR_LC3PLUS_DEC_H +#define ISAR_LC3PLUS_DEC_H + +#include +#include "options.h" +#include "lc3plus.h" +#include "ivas_error.h" +#include "ivas_cnst.h" +#include "isar_lc3plus_common.h" + + +typedef enum +{ + DEC_ACTION_DECODE_AND_USE, + DEC_ACTION_CACHE, + DEC_ACTION_NUM_ENUMS +} SelectiveDecAction; + + +typedef struct ISAR_LC3PLUS_DEC_SELECTIVE_DECODING_STATE +{ + /*! indicates that the decoder has skipped one or more frames. This means it must decode two frames to flush algorithmic delay when re-activated */ + int16_t has_skipped_a_frame; + /*! action to execute for the next frame */ + SelectiveDecAction frame_action; + /*! if set to 1, decoder will decode the cache before decoding any of current frames */ + int16_t shall_decode_cached_frame; +} ISAR_LC3PLUS_DEC_SELECTIVE_DECODING_STATE; + +typedef struct ISAR_LC3PLUS_DEC_BITSTREAM_CACHE +{ + uint8_t *bitstream_cache; + int32_t bitstream_cache_capacity; + int32_t bitstream_cache_size; +} ISAR_LC3PLUS_DEC_BITSTREAM_CACHE; + +/* decoder wrapper */ +typedef struct ISAR_LC3PLUS_DEC_HANDLE +{ + LC3PLUS_Dec **handles; + ISAR_LC3PLUS_DEC_SELECTIVE_DECODING_STATE **selective_decoding_states; + ISAR_LC3PLUS_DEC_BITSTREAM_CACHE **bitstream_caches; + uint32_t num_decs; + int16_t *pcm_conversion_buffer; + uint8_t *scratch; + LC3PLUS_CONFIG config; +} * ISAR_LC3PLUS_DEC_HANDLE; + +ivas_error ISAR_LC3PLUS_DEC_Open( + const LC3PLUS_CONFIG config, /* i : decoder configuration */ + ISAR_LC3PLUS_DEC_HANDLE *handle /* o : decoder handle */ +); + +ivas_error ISAR_LC3PLUS_DEC_GetDelay( + ISAR_LC3PLUS_DEC_HANDLE handle, /* i : decoder handle */ + int32_t *delayInSamples /* o : algorithmic delay of encoding and decoding in number of samples per channel */ +); + +void ISAR_LC3PLUS_DEC_Close( + ISAR_LC3PLUS_DEC_HANDLE *handle /* i/o: pointer to decoder handle */ +); + + +ivas_error ISAR_LC3PLUS_DEC_Decode( + ISAR_LC3PLUS_DEC_HANDLE handle, /* i : decoder handle */ + uint8_t *bitstream_in, /* i : pointer to input bitstream */ + const int32_t bitstream_in_size, /* i : size of bitstream_in */ + Word32 **pcm_out /* o : decoded samples */ +); + +ivas_error ISAR_LC3PLUS_DEC_Conceal( + ISAR_LC3PLUS_DEC_HANDLE handle, /* i : decoder handle */ + Word32 **pcm_out /* o : decoded samples */ +); + + +#endif /* ISAR_LC3PLUS_DEC_H */ diff --git a/lib_isar/isar_lc3plus_enc.c b/lib_isar/isar_lc3plus_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..60121a11f7e96c8bbb219bfdf1897513d0f1575f --- /dev/null +++ b/lib_isar/isar_lc3plus_enc.c @@ -0,0 +1,587 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "isar_lc3plus_enc.h" +#include "isar_lc3plus_common.h" +#include "lc3plus.h" +#include "ivas_error_utils.h" +#include "prot_fx.h" +#include "wmc_auto.h" +#include "options.h" + +static const LC3PLUS_RTP_FDL s_fdl_request = LC3PLUS_RTP_FDL_NO_REQ_OR_NO_DATA; + +static int32_t limit_per_channel_bitrate( LC3PLUS_CONFIG config, + int32_t per_channel_bitrate ) +{ + if ( config.high_res_mode_enabled ) + { + switch ( config.lc3plus_frame_duration_us ) + { + case 10000: + return min( per_channel_bitrate, 500000 ); + case 5000: + return min( per_channel_bitrate, 600000 ); + case 2500: + return min( per_channel_bitrate, 672000 ); + default: + assert( false && "unreachable" ); + } + } + + switch ( config.samplerate ) + { + case 48000: + case 32000: + return min( per_channel_bitrate, 320000 ); + case 24000: + return min( per_channel_bitrate, 314400 ); + case 16000: + return min( per_channel_bitrate, 221600 ); + case 8000: + return min( per_channel_bitrate, 114400 ); + default: + assert( false && "unreachable" ); + } + + assert( false && "unreachable" ); + return -1; +} + +/*-------------------------------------------------------------------* + * Function ISAR_LC3PLUS_ENC_Open() + * + * + *-------------------------------------------------------------------*/ +ivas_error ISAR_LC3PLUS_ENC_Open( + const LC3PLUS_CONFIG config, /* i : LC3plus encoder configuration */ + const UWord32 bitsPerSecond, /* i : bit rate */ + ISAR_LC3PLUS_ENC_HANDLE *handle /* o : encoder handle */ +) +{ + int32_t num_lc3plus_media_times_per_ivas_frame; + bool is_last_media_time, is_last_channel; + ivas_error ivas_err; + Word32 scratch_size; + int32_t encoder_size; + LC3PLUS_Error err; + int32_t lfeChans[1]; + int16_t i; + + lfeChans[0] = 0; + + if ( 0U == config.channels ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Invalid number of channels\n" ); + } + if ( config.lc3plus_frame_duration_us != 2500 && config.lc3plus_frame_duration_us != 5000 && config.lc3plus_frame_duration_us != 10000 ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Invalid lc3plus_frame_duration_us\n" ); + } + if ( config.isar_frame_duration_us != 20000 && config.isar_frame_duration_us != 10000 && config.isar_frame_duration_us != 5000 ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Invalid isar_frame_duration_us\n" ); + } + encoder_size = lc3plus_enc_get_size( config.samplerate, 1 ); + if ( 0 == encoder_size ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "lc3plus_enc_get_size failed\n" ); + } + + if ( ( *handle = malloc( sizeof( struct ISAR_LC3PLUS_ENC_HANDLE ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus wrapper handle\n" ); + } + ( *handle )->config = config; + ( *handle )->frame_type_descriptors = NULL; + + ( *handle )->pcm_conversion_buffer = NULL; + ( *handle )->scratch = NULL; + ( *handle )->num_encs = 0; + if ( ( ( *handle )->handles = malloc( config.channels * sizeof( ISAR_LC3PLUS_ENC_HANDLE ) ) ) == NULL ) + { + ISAR_LC3PLUS_ENC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus wrapper handle\n" ); + } + + for ( i = 0; i < config.channels; ++i ) + { + ( *handle )->handles[i] = NULL; + } + ( *handle )->num_encs = config.channels; + num_lc3plus_media_times_per_ivas_frame = config.isar_frame_duration_us / config.lc3plus_frame_duration_us; + ( *handle )->fdl_request = s_fdl_request; + ( *handle )->num_ftds = config.channels * num_lc3plus_media_times_per_ivas_frame; + ( *handle )->frame_type_descriptors = malloc( ( *handle )->num_ftds * sizeof( LC3PLUS_RTP_FTD ) ); + if ( NULL == ( *handle )->frame_type_descriptors ) + { + ISAR_LC3PLUS_ENC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus frame_type_descriptors\n" ); + } + + for ( int32_t iCh = 0; iCh < config.channels; iCh++ ) + { + if ( ( ( *handle )->handles[iCh] = malloc( encoder_size ) ) == NULL ) + { + ISAR_LC3PLUS_ENC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus encoder\n" ); + } + + err = lc3plus_enc_init( ( *handle )->handles[iCh], config.samplerate, 1, config.high_res_mode_enabled, lfeChans ); + if ( err != LC3PLUS_OK ) + { + ISAR_LC3PLUS_ENC_Close( handle ); + return IVAS_ERROR( ISAR_LC3PLUS_LC3plusErrToIvasErr( err ), "lc3plus_enc_init failed\n" ); + } + + err = lc3plus_enc_set_frame_dms( ( *handle )->handles[iCh], IVAS_LC3PLUS_UsToLC3plusFrameDuration( config.lc3plus_frame_duration_us ) ); + if ( err != LC3PLUS_OK ) + { + ISAR_LC3PLUS_ENC_Close( handle ); + return IVAS_ERROR( ISAR_LC3PLUS_LC3plusErrToIvasErr( err ), "lc3plus_enc_set_frame_dms failed\n" ); + } + } + + if ( config.isar_frame_duration_us < config.lc3plus_frame_duration_us || config.isar_frame_duration_us % config.lc3plus_frame_duration_us != 0 ) + { + ISAR_LC3PLUS_ENC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "Current pcm_conversion_buffer sizing requires that lc3plus uses a shorter or equal frame duration than ivas\n" ); + } + + ( *handle )->pcm_conversion_buffer = malloc( sizeof( int16_t ) * config.samplerate * config.lc3plus_frame_duration_us / 1000000 ); + if ( NULL == ( *handle )->pcm_conversion_buffer ) + { + ISAR_LC3PLUS_ENC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus encoder wrapper pcm_conversion_buffer\n" ); + } + + /* update FDI fields */ + for ( int32_t iMediaTime = 0; iMediaTime < num_lc3plus_media_times_per_ivas_frame; ++iMediaTime ) + { + for ( uint32_t iEnc = 0; iEnc < ( *handle )->num_encs; ++iEnc ) + { + int32_t ftd_index = iEnc + iMediaTime * ( *handle )->num_encs; + ( *handle )->frame_type_descriptors[ftd_index].frame_data_length = 0; /* will be set to the correct value in IVAS_LC3PLUS_ENC_SetBitrate */ + if ( 0 != LC3PLUS_RTP_ftd_bwr_from_samplerate( &( *handle )->frame_type_descriptors[ftd_index].bwr, config.samplerate, config.high_res_mode_enabled ) ) + { + ISAR_LC3PLUS_ENC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_INTERNAL, "LC3PLUS_RTP_ftd_bwr_from_samplerate failed\n" ); + } + if ( 0 != LC3PLUS_RTP_ftd_fdi_from_frame_duration_us( &( *handle )->frame_type_descriptors[ftd_index].fdi, config.lc3plus_frame_duration_us ) ) + { + ISAR_LC3PLUS_ENC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_INTERNAL, "LC3PLUS_RTP_ftd_fdi_from_frame_duration_us failed\n" ); + } + ( *handle )->frame_type_descriptors[ftd_index].h = LC3PLUS_RTP_FTD_H_PRIMARY; + ( *handle )->frame_type_descriptors[ftd_index].frame_data = NULL; + + /* The FTDs in the ToC are included in the following order: + * 1) First the FTD for the first channel of the first FDB (oldest frame) + * 2) Then the FTDs for the remaining channels for the first FDB in increasing CC order + * 3) Then the FTD for the first channel of the second FDB + * 4) Then the FTDs for the remaining channels for the second FDB + * 5) Etc. to the last FDB */ + is_last_media_time = num_lc3plus_media_times_per_ivas_frame - 1 == iMediaTime; + is_last_channel = ( *handle )->num_encs - 1 == iEnc; + if ( is_last_media_time && is_last_channel ) + { + ( *handle )->frame_type_descriptors[ftd_index].fc = LC3PLUS_RTP_FTD_FC_LAST_OVERALL; + } + else if ( !is_last_media_time && is_last_channel ) + { + ( *handle )->frame_type_descriptors[ftd_index].fc = LC3PLUS_RTP_FTD_FC_LAST_IN_MEDIATIME; + } + else + { + ( *handle )->frame_type_descriptors[ftd_index].fc = LC3PLUS_RTP_FTD_FC_SUBSEQUENT_CHANNEL; + } + } + } + + ivas_err = IVAS_LC3PLUS_ENC_SetBitrate( *handle, bitsPerSecond ); + if ( ivas_err != IVAS_ERR_OK ) + { + ISAR_LC3PLUS_ENC_Close( handle ); + return ivas_err; + } + scratch_size = lc3plus_enc_get_scratch_size( ( *handle )->handles[0] ); + ( *handle )->scratch = malloc( sizeof( uint8_t ) * scratch_size ); + IF( NULL == ( *handle )->scratch ) + { + ISAR_LC3PLUS_ENC_Close( handle ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus encoder wrapper scratch\n" ); + } + + return IVAS_ERR_OK; +} + +/*-------------------------------------------------------------------* + * Function IVAS_LC3PLUS_ENC_SetBitrate() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_LC3PLUS_ENC_SetBitrate( + ISAR_LC3PLUS_ENC_HANDLE handle, /* o : LC3plus encoder handle */ + const UWord32 bitsPerSecond /* i : new target bit rate */ +) +{ + Word32 numLc3plusMediaTimesPerIvasFrame; + Word32 lc3plus_num_bytes_per_frame; + Word32 availableOctetsPerIsarFrame; + Word32 actualOctetsPerFrame; + LC3PLUS_Error err; + ivas_error ivas_err; + Word32 iFtd; + Word32 fdrLength; + Word32 lc3plusPacketRate; + Word32 numSubframes; + Word32 minPayloadOverhead; + Word32 targetLc3PlusBitratePerChannel; + Word32 targetLc3PlusOctetCount; + Word32 lc3plusFdlLength; + + if ( NULL == handle ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "LC3PLUS_Enc_Wrap_Handle is NULL\n" ); + } + + availableOctetsPerIsarFrame = bitsPerSecond / ( 1000000 / handle->config.isar_frame_duration_us ) / 8; + lc3plusPacketRate = 1000 * 1000 / handle->config.lc3plus_frame_duration_us; + numLc3plusMediaTimesPerIvasFrame = handle->config.isar_frame_duration_us / handle->config.lc3plus_frame_duration_us; + numSubframes = numLc3plusMediaTimesPerIvasFrame * handle->config.channels; + + /* subtract minimum required payload bytes & calculate a first per-channel target bit rate */ + if ( LC3PLUS_RTP_frame_data_length_get_size( &fdrLength, s_fdl_request ) != LC3PLUS_RTP_ERR_NO_ERROR ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "LC3PLUS_RTP_frame_data_length_get_size failed\n" ); + } + minPayloadOverhead = fdrLength + ( numSubframes * LC3PLUS_RTP_FTD_MIN_SIZE ); + targetLc3PlusBitratePerChannel = ( availableOctetsPerIsarFrame - minPayloadOverhead ) / handle->config.channels * 8 * lc3plusPacketRate / numLc3plusMediaTimesPerIvasFrame; + if ( targetLc3PlusBitratePerChannel <= 0 ) + { + return IVAS_ERROR( IVAS_ERR_LC3PLUS_INVALID_BITRATE, "available LC3plus bitrate <= 0\n" ); + } + targetLc3PlusBitratePerChannel = limit_per_channel_bitrate( handle->config, targetLc3PlusBitratePerChannel ); + targetLc3PlusOctetCount = targetLc3PlusBitratePerChannel / 8 / lc3plusPacketRate; + /* check resulting octet count. If it requires larger than 1-byte length fields, decrease the bitrate by enough to make room for the additional length field */ + if ( LC3PLUS_RTP_frame_data_length_get_size( &lc3plusFdlLength, targetLc3PlusOctetCount ) != LC3PLUS_RTP_ERR_NO_ERROR ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "LC3PLUS_RTP_frame_data_length_get_size failed\n" ); + } + if ( lc3plusFdlLength != LC3PLUS_RTP_FDL_MIN_LENGTH ) + { + /* reduce bitrate to allow for the required fdl field */ + targetLc3PlusBitratePerChannel = ( targetLc3PlusOctetCount - ( lc3plusFdlLength - LC3PLUS_RTP_FDL_MIN_LENGTH ) ) / handle->config.channels * 8 * lc3plusPacketRate; + } + + for ( Word32 iCh = 0; iCh < handle->config.channels; iCh++ ) + { + err = lc3plus_enc_set_bitrate( handle->handles[iCh], targetLc3PlusBitratePerChannel ); + if ( err != LC3PLUS_OK ) + { + return IVAS_ERROR( ISAR_LC3PLUS_LC3plusErrToIvasErr( err ), "lc3plus_enc_set_bitrate failed\n" ); + } + } + + /* update FTD settings after bitrate change */ + for ( int32_t iMediaTime = 0; iMediaTime < numLc3plusMediaTimesPerIvasFrame; ++iMediaTime ) + { + for ( UWord32 iEnc = 0; iEnc < handle->num_encs; ++iEnc ) + { + iFtd = iEnc + iMediaTime * handle->num_encs; + lc3plus_num_bytes_per_frame = lc3plus_enc_get_num_bytes( handle->handles[iEnc] ); + if ( lc3plus_num_bytes_per_frame <= 0 ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "lc3plus_enc_get_num_bytes reported invalid result failed\n" ); + } + handle->frame_type_descriptors[iFtd].frame_data_length = lc3plus_num_bytes_per_frame; + } + } + + if ( ( ivas_err = ISAR_LC3PLUS_ENC_GetOutputBitstreamSize( handle, &actualOctetsPerFrame ) ) != IVAS_ERR_OK ) + { + return ivas_err; + } + + if ( actualOctetsPerFrame > availableOctetsPerIsarFrame ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Bitrate reduction logic failed\n" ); + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * Function ISAR_LC3PLUS_ENC_GetDelay() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_LC3PLUS_ENC_GetDelay( + ISAR_LC3PLUS_ENC_HANDLE handle, /* i : LC3plus encoder handle */ + Word32 *delayInSamples /* o : encoder delay in number of samples per channel */ +) +{ + Word32 tmpDelayInSamples; + + if ( NULL == handle ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "LC3PLUS_Enc_Wrap_Handle is NULL\n" ); + } + if ( NULL == delayInSamples ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "delayInSamples is NULL\n" ); + } + + *delayInSamples = 0; + /* sanity check whether all encoders are actually configured identically */ + for ( UWord32 iEnc = 0; iEnc < handle->num_encs; iEnc++ ) + { + if ( NULL == handle->handles[iEnc] ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "LC3plus encoder handle is NULL\n" ); + } + + tmpDelayInSamples = lc3plus_enc_get_delay( handle->handles[iEnc] ); + if ( 0 != *delayInSamples && tmpDelayInSamples != *delayInSamples ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Not all mono LC3plus encoders are configured identically\n" ); + } + *delayInSamples = tmpDelayInSamples; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * Function ISAR_LC3PLUS_ENC_GetOutputBitstreamSize() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_LC3PLUS_ENC_GetOutputBitstreamSize( + ISAR_LC3PLUS_ENC_HANDLE handle, /* i : LC3plus encoder handle */ + Word32 *bsSize /* o : size of each bitstream frame in bytes */ +) +{ + LC3PLUS_RTP_ERR rtp_err; + int32_t num_lc3plus_media_times_per_ivas_frame; + int32_t iMediaTime; + int32_t ftd_frame_data_length_size, lc3plus_frame_data_length; + int32_t ftd_index; + if ( NULL == handle ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "LC3PLUS_Enc_Wrap_Handle is NULL\n" ); + } + if ( NULL == bsSize ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "bsSize is NULL\n" ); + } + + if ( 0 == handle->config.lc3plus_frame_duration_us ) + { + return IVAS_ERROR( IVAS_ERR_INIT_ERROR, "lc3plus_frame_duration_us is 0\n" ); + } + if ( handle->config.isar_frame_duration_us % handle->config.lc3plus_frame_duration_us != 0 ) + { + return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "isar_frame_duration_us must be equal or multiple of lc3plus_frame_duration_us \n" ); + } + + num_lc3plus_media_times_per_ivas_frame = handle->config.isar_frame_duration_us / handle->config.lc3plus_frame_duration_us; + *bsSize = 0; + int32_t fdl_request_length; + rtp_err = LC3PLUS_RTP_frame_data_length_get_size( &fdl_request_length, handle->fdl_request ); + if ( rtp_err != LC3PLUS_RTP_ERR_NO_ERROR ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid LC3plus frame_data_length request\n" ); + } + *bsSize += fdl_request_length; + for ( uint32_t iEnc = 0; iEnc < handle->num_encs; iEnc++ ) + { + if ( NULL == handle->handles[iEnc] ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "LC3plus encoder handle is NULL\n" ); + } + lc3plus_frame_data_length = lc3plus_enc_get_num_bytes( handle->handles[iEnc] ); + for ( iMediaTime = 0; iMediaTime < num_lc3plus_media_times_per_ivas_frame; ++iMediaTime ) + { + ftd_index = iEnc + iMediaTime * handle->num_encs; + if ( lc3plus_frame_data_length != (int32_t) handle->frame_type_descriptors[ftd_index].frame_data_length ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "LC3plus FTD data not synchronised with encoder bitrate\n" ); + } + rtp_err = LC3PLUS_RTP_frame_data_length_get_size( &ftd_frame_data_length_size, handle->frame_type_descriptors[ftd_index].frame_data_length ); + if ( rtp_err != LC3PLUS_RTP_ERR_NO_ERROR ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid LC3plus frame_data_length\n" ); + } + *bsSize += LC3PLUS_RTP_FTD_LENGTH_EXCLUDING_FDL; + *bsSize += handle->frame_type_descriptors[ftd_index].frame_data_length; + *bsSize += ftd_frame_data_length_size; + } + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * Function ISAR_LC3PLUS_ENC_Close() + * + * + *-------------------------------------------------------------------*/ + +void ISAR_LC3PLUS_ENC_Close( + ISAR_LC3PLUS_ENC_HANDLE *handle /* i/o: pointer to LC3plus encoder handle */ +) +{ + if ( NULL == handle || NULL == *handle ) + { + return; + } + if ( NULL != ( *handle )->frame_type_descriptors ) + { + free( ( *handle )->frame_type_descriptors ); + } + for ( UWord32 iEnc = 0; iEnc < ( *handle )->num_encs; iEnc++ ) + { + if ( NULL != ( *handle )->handles[iEnc] ) + { + free( ( *handle )->handles[iEnc] ); + } + } + if ( NULL != ( *handle )->pcm_conversion_buffer ) + { + free( ( *handle )->pcm_conversion_buffer ); + } + + if ( NULL != ( *handle )->scratch ) + { + free( ( *handle )->scratch ); + } + + free( ( *handle )->handles ); + free( *handle ); + + *handle = NULL; + + return; +} + + +/*-------------------------------------------------------------------* + * Function ISAR_LC3PLUS_ENC_Encode() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_LC3PLUS_ENC_Encode( + ISAR_LC3PLUS_ENC_HANDLE handle, /* i : LC3plus encoder handle */ + Word32 **pcm_in, /* i : pointer input samples */ + void *bitstream_out, /* o : pointer to bitstream frame */ + const Word32 bitstream_out_size, /* i : size of the bitstream_out buffer in bytes. Must be equal to ISAR_LC3PLUS_ENC_GetOutputBitstreamSize. */ + Word16 q_in[16] ) +{ + Word32 ftdIndex; + LC3PLUS_RTP_ERR rtpErr; + UWord32 num_media_times; + UWord32 numSamplesPerLC3plusChannel; + Word32 ivasSampleIndex; + Word32 num_bytes = 0; + LC3PLUS_Error err; + + push_wmops( "ISAR_LC3PLUS_ENC_Encode" ); + + if ( NULL == handle ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "LC3PLUS_Enc_Wrap_Handle is NULL\n" ); + } + if ( NULL == pcm_in ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "pcm_in is NULL\n" ); + } + if ( NULL == bitstream_out ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "bitstream_out is NULL\n" ); + } + + if ( handle->config.isar_frame_duration_us % handle->config.lc3plus_frame_duration_us != 0 ) + { + return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "isar_frame_duration_us must be equal or multiple of lc3plus_frame_duration_us \n" ); + } + num_media_times = handle->config.isar_frame_duration_us / handle->config.lc3plus_frame_duration_us; + numSamplesPerLC3plusChannel = handle->config.samplerate / ( 1000000 / handle->config.isar_frame_duration_us ) / num_media_times; + + size_t actual_size; + rtpErr = LC3PLUS_RTP_payload_serialize( bitstream_out, bitstream_out_size, &actual_size, s_fdl_request, handle->frame_type_descriptors, handle->num_ftds ); + if ( rtpErr != LC3PLUS_RTP_ERR_NO_ERROR ) + { + return IVAS_ERROR( IVAS_LC3PLUS_LC3plusRtpErrToIvasErr( rtpErr ), "LC3PLUS_RTP_payload_serialize failed\n" ); + } + + FOR( UWord32 iEnc = 0; iEnc < handle->num_encs; iEnc++ ) + { + FOR( UWord32 iMediaTime = 0; iMediaTime < num_media_times; iMediaTime++ ) + { + FOR( UWord32 iSampleInt16 = 0; iSampleInt16 < numSamplesPerLC3plusChannel; iSampleInt16++ ) + { + ivasSampleIndex = iSampleInt16 + iMediaTime * numSamplesPerLC3plusChannel; + handle->pcm_conversion_buffer[iSampleInt16] = (Word16) max( INT16_MIN, min( L_shr( pcm_in[iEnc][ivasSampleIndex], q_in[iEnc] ), INT16_MAX ) ); + } + + ftdIndex = iMediaTime * handle->num_encs + iEnc; + num_bytes = 0; + push_wmops( "lc3plus_enc16" ); + err = lc3plus_enc16( handle->handles[iEnc], &handle->pcm_conversion_buffer, handle->frame_type_descriptors[ftdIndex].frame_data, &num_bytes, handle->scratch ); + pop_wmops(); + if ( err != LC3PLUS_OK ) + { + return IVAS_ERROR( ISAR_LC3PLUS_LC3plusErrToIvasErr( err ), "lc3plus_enc16 failed\n" ); + } + if ( 0 == num_bytes ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "lc3plus_enc16 did not produce output\n" ); + } + if ( num_bytes != (int32_t) handle->frame_type_descriptors[ftdIndex].frame_data_length ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "payload format and lc3plus enc bitrate are not aligned\n" ); + } + } + } + + pop_wmops(); + + return IVAS_ERR_OK; +} diff --git a/lib_isar/isar_lc3plus_enc.h b/lib_isar/isar_lc3plus_enc.h new file mode 100644 index 0000000000000000000000000000000000000000..6dd08733fa2deeae01a83473ffa1854e65009713 --- /dev/null +++ b/lib_isar/isar_lc3plus_enc.h @@ -0,0 +1,88 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef ISAR_LC3PLUS_ENC_H +#define ISAR_LC3PLUS_ENC_H + +#include +#include "ivas_error.h" +#include "lc3plus.h" +#include "isar_lc3plus_common.h" +#include "typedef.h" +#include "isar_lc3plus_payload.h" + +/* encoder wrapper */ +typedef struct ISAR_LC3PLUS_ENC_HANDLE +{ + LC3PLUS_CONFIG config; + LC3PLUS_Enc **handles; + uint32_t num_encs; + int16_t *pcm_conversion_buffer; + LC3PLUS_RTP_FTD *frame_type_descriptors; + int32_t num_ftds; + LC3PLUS_RTP_FDL fdl_request; + uint8_t *scratch; +} * ISAR_LC3PLUS_ENC_HANDLE; + +ivas_error ISAR_LC3PLUS_ENC_Open( + const LC3PLUS_CONFIG config, /* i : encoder configuration */ + const uint32_t initialBitsPerSecond, /* i : initial target bit rate */ + ISAR_LC3PLUS_ENC_HANDLE *handle /* o : LC3plus encoder handle */ +); + +ivas_error IVAS_LC3PLUS_ENC_SetBitrate( + ISAR_LC3PLUS_ENC_HANDLE handle, /* o : LC3plus encoder handle */ + const uint32_t bitsPerSecond /* i : new target bit rate */ +); + +ivas_error ISAR_LC3PLUS_ENC_GetDelay( + ISAR_LC3PLUS_ENC_HANDLE handle, /* i : LC3plus encoder handle */ + int32_t *delayInSamples /* o : algorithmic delay of encoding and decoding in number of samples per channel */ +); + +ivas_error ISAR_LC3PLUS_ENC_GetOutputBitstreamSize( + ISAR_LC3PLUS_ENC_HANDLE handle, /* i : LC3plus encoder handle */ + int32_t *bsSize /* o : size of next bitstream frame in bytes */ +); + +void ISAR_LC3PLUS_ENC_Close( + ISAR_LC3PLUS_ENC_HANDLE *handle /* i/o: pointer to LC3plus encoder handle */ +); + +ivas_error ISAR_LC3PLUS_ENC_Encode( + ISAR_LC3PLUS_ENC_HANDLE handle, /* i : LC3plus encoder handle */ + Word32 **pcm_in, /* i : pointer input samples */ + void *bitstream_out, /* o : pointer to bitstream frame */ + const Word32 bitstream_out_size, /* i : size of the bitstream_out buffer in bytes. Must be equal to ISAR_LC3PLUS_ENC_GetOutputBitstreamSize. */ + Word16 q_in[16] ); + +#endif /* ISAR_LC3PLUS_ENC_H */ diff --git a/lib_isar/isar_lc3plus_payload.c b/lib_isar/isar_lc3plus_payload.c new file mode 100644 index 0000000000000000000000000000000000000000..2493aa6a30eb9ca3ab8f493dc1dad4e057666b98 --- /dev/null +++ b/lib_isar/isar_lc3plus_payload.c @@ -0,0 +1,818 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include "isar_lc3plus_payload.h" +#include "options.h" + +static LC3PLUS_RTP_ERR s_frame_duration_ms_from_fdi( int32_t *frame_duration_us, const LC3PLUS_RTP_FTD_FDI fdi ) +{ + if ( NULL == frame_duration_us ) + { + return LC3PLUS_RTP_ERR_NULL_PTR; + } + switch ( fdi ) + { + case LC3PLUS_RTP_FTD_FDI_2500_US: + *frame_duration_us = 2500; + break; + case LC3PLUS_RTP_FTD_FDI_5000_US: + *frame_duration_us = 5000; + break; + case LC3PLUS_RTP_FTD_FDI_10000_US: + *frame_duration_us = 10000; + break; + case LC3PLUS_RTP_FTD_FDI_RESERVED: + default: + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + return LC3PLUS_RTP_ERR_NO_ERROR; +} + +static LC3PLUS_RTP_ERR s_sampling_rate_hz_from_bwr( int32_t *sample_rate_hz, const LC3PLUS_RTP_FTD_BWR bwr ) +{ + if ( NULL == sample_rate_hz ) + { + return LC3PLUS_RTP_ERR_NULL_PTR; + } + switch ( bwr ) + { + case LC3PLUS_RTP_FTD_BWR_NB: + *sample_rate_hz = 8000; + break; + case LC3PLUS_RTP_FTD_BWR_WB: + *sample_rate_hz = 16000; + break; + case LC3PLUS_RTP_FTD_BWR_SSWB: + *sample_rate_hz = 24000; + break; + case LC3PLUS_RTP_FTD_BWR_SWB: + *sample_rate_hz = 32000; + break; + case LC3PLUS_RTP_FTD_BWR_FBCD: + *sample_rate_hz = 44100; + break; + case LC3PLUS_RTP_FTD_BWR_FB: + *sample_rate_hz = 48000; + break; + case LC3PLUS_RTP_FTD_BWR_FBHR: + *sample_rate_hz = 48000; + break; + case LC3PLUS_RTP_FTD_BWR_UBHR: + *sample_rate_hz = 96000; + break; + default: + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + return LC3PLUS_RTP_ERR_NO_ERROR; +} + +static LC3PLUS_RTP_ERR s_high_resolution_flag_from_bwr( int16_t *high_resolution_flag, const LC3PLUS_RTP_FTD_BWR bwr ) +{ + if ( NULL == high_resolution_flag ) + { + return LC3PLUS_RTP_ERR_NULL_PTR; + } + switch ( bwr ) + { + case LC3PLUS_RTP_FTD_BWR_NB: + *high_resolution_flag = 0; + break; + case LC3PLUS_RTP_FTD_BWR_WB: + *high_resolution_flag = 0; + break; + case LC3PLUS_RTP_FTD_BWR_SSWB: + *high_resolution_flag = 0; + break; + case LC3PLUS_RTP_FTD_BWR_SWB: + *high_resolution_flag = 0; + break; + case LC3PLUS_RTP_FTD_BWR_FBCD: + *high_resolution_flag = 0; + break; + case LC3PLUS_RTP_FTD_BWR_FB: + *high_resolution_flag = 0; + break; + case LC3PLUS_RTP_FTD_BWR_FBHR: + *high_resolution_flag = 1; + break; + case LC3PLUS_RTP_FTD_BWR_UBHR: + *high_resolution_flag = 1; + break; + default: + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + return LC3PLUS_RTP_ERR_NO_ERROR; +} + +LC3PLUS_RTP_ERR LC3PLUS_RTP_frame_data_length_get_size( int32_t *length, const LC3PLUS_RTP_FDL frameDataLengthValue ) +{ + if ( frameDataLengthValue == LC3PLUS_RTP_FDL_NO_REQ_OR_NO_DATA || frameDataLengthValue == LC3PLUS_RTP_FDL_SPEECH_BAD || frameDataLengthValue == LC3PLUS_RTP_FDL_SPEECH_SID ) + { + *length = 1; + } + else if ( frameDataLengthValue >= LC3PLUS_RTP_FDL_LENGTH_1_MIN && frameDataLengthValue <= LC3PLUS_RTP_FDL_LENGTH_1_MAX ) + { + *length = 1; + } + else if ( frameDataLengthValue >= LC3PLUS_RTP_FDL_LENGTH_2_MIN && frameDataLengthValue <= LC3PLUS_RTP_FDL_LENGTH_2_MAX ) + { + *length = 2; + } + else if ( frameDataLengthValue >= LC3PLUS_RTP_FDL_LENGTH_3_MIN && frameDataLengthValue <= LC3PLUS_RTP_FDL_LENGTH_3_MAX ) + { + *length = 3; + } + else + { + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + return LC3PLUS_RTP_ERR_NO_ERROR; +} + +static LC3PLUS_RTP_ERR s_frame_data_length_pack( const LC3PLUS_RTP_FDL frameDataLengthValue, uint8_t *dst ) +{ + int32_t frame_data_length_size; + LC3PLUS_RTP_ERR err; + + if ( NULL == dst ) + { + return LC3PLUS_RTP_ERR_NULL_PTR; + } + + err = LC3PLUS_RTP_frame_data_length_get_size( &frame_data_length_size, frameDataLengthValue ); + if ( err != LC3PLUS_RTP_ERR_NO_ERROR ) + { + return err; + } + if ( 1 == frame_data_length_size ) + { + *dst++ = frameDataLengthValue >> 0 & LC3PLUS_RTP_FDL_EXTENSION_VALUE; + } + else if ( 2 == frame_data_length_size ) + { + const int32_t frameDataLengthValueToWrite = frameDataLengthValue - LC3PLUS_RTP_FDL_EXTENSION_VALUE; + *dst++ = LC3PLUS_RTP_FDL_EXTENSION_VALUE; + *dst = frameDataLengthValueToWrite >> 0 & LC3PLUS_RTP_FDL_EXTENSION_VALUE; + } + else if ( 3 == frame_data_length_size ) + { + const int32_t frameDataLengthValueToWrite = frameDataLengthValue - ( 2 * LC3PLUS_RTP_FDL_EXTENSION_VALUE ); + *dst++ = LC3PLUS_RTP_FDL_EXTENSION_VALUE; + *dst++ = LC3PLUS_RTP_FDL_EXTENSION_VALUE; + *dst = frameDataLengthValueToWrite >> 0 & LC3PLUS_RTP_FDL_EXTENSION_VALUE; + } + return LC3PLUS_RTP_ERR_NO_ERROR; +} + +static int32_t s_get_size_from_fdl( const LC3PLUS_RTP_FDL fdl ) +{ + if ( fdl >= LC3PLUS_RTP_FDL_LENGTH_1_MIN && fdl <= LC3PLUS_RTP_FDL_LENGTH_3_MAX ) + { + return fdl; + } + return 0; +} + +static bool s_fdl_is_magic_value( const LC3PLUS_RTP_FDL fdl ) +{ + if ( fdl == LC3PLUS_RTP_FDL_NO_REQ_OR_NO_DATA || fdl == LC3PLUS_RTP_FDL_SPEECH_SID || fdl == LC3PLUS_RTP_FDL_SPEECH_BAD ) + { + return true; + } + return false; +} + +static bool s_fdl_value_is_valid_request( const LC3PLUS_RTP_FDL fdl_request ) +{ + /* LC3PLUS_RTP_FDL_SPEECH_SID && LC3PLUS_RTP_FDL_SPEECH_SID are not valid values for the FDL request */ + if ( fdl_request == LC3PLUS_RTP_FDL_NO_REQ_OR_NO_DATA || ( fdl_request >= LC3PLUS_RTP_FDL_LENGTH_1_MIN && fdl_request <= LC3PLUS_RTP_FDL_LENGTH_3_MAX ) ) + { + return true; + } + return false; +} + +static LC3PLUS_RTP_ERR s_frame_data_length_parse( LC3PLUS_RTP_FDL *frame_data_length_value, const uint8_t *src, const size_t remaining_capacity ) +{ + int32_t frame_data_length_size; + LC3PLUS_RTP_ERR err; + if ( NULL == src || NULL == frame_data_length_value || remaining_capacity < 1 ) + { + return LC3PLUS_RTP_ERR_NULL_PTR; + } + + if ( remaining_capacity > 2 && LC3PLUS_RTP_FDL_EXTENSION_VALUE == *src && LC3PLUS_RTP_FDL_EXTENSION_VALUE == *( src + 1 ) ) + { + *frame_data_length_value = *( src + 2 ) + 2 * LC3PLUS_RTP_FDL_EXTENSION_VALUE; + } + else if ( remaining_capacity > 1 && LC3PLUS_RTP_FDL_EXTENSION_VALUE == *src ) + { + *frame_data_length_value = *( src + 1 ) + 1 * LC3PLUS_RTP_FDL_EXTENSION_VALUE; + } + else if ( remaining_capacity > 0 ) + { + *frame_data_length_value = *src << 0; + } + else + { + return LC3PLUS_RTP_ERR_INVALID_BITSTREAM_SIZE; + } + + /* sanity check */ + err = LC3PLUS_RTP_frame_data_length_get_size( &frame_data_length_size, *frame_data_length_value ); + if ( err != LC3PLUS_RTP_ERR_NO_ERROR ) + { + return err; + } + return LC3PLUS_RTP_ERR_NO_ERROR; +} + +static LC3PLUS_RTP_ERR s_parse_ftd( const uint8_t *p_read, LC3PLUS_RTP_FTD *receiver_ftd, int32_t *num_bytes_read, const size_t remaining_capacity ) +{ + int32_t frame_data_block_size; + LC3PLUS_RTP_FDL fdl; + LC3PLUS_RTP_ERR err; + if ( NULL == p_read || NULL == receiver_ftd || NULL == num_bytes_read || remaining_capacity < LC3PLUS_RTP_FTD_MIN_SIZE ) + { + return LC3PLUS_RTP_ERR_NULL_PTR; + } + + *num_bytes_read = 0; + receiver_ftd->fc = 0; + receiver_ftd->fdi = 0; + receiver_ftd->bwr = 0; + receiver_ftd->h = 0; + receiver_ftd->fc |= *p_read & LC3PLUS_RTP_FTD_FC_MASK; + receiver_ftd->fdi |= ( *p_read & LC3PLUS_RTP_FTD_FDI_MASK ); + receiver_ftd->bwr |= ( *p_read & LC3PLUS_RTP_FTD_BWR_MASK ); + receiver_ftd->h |= ( *p_read & LC3PLUS_RTP_FTD_H_MASK ); + p_read++; + *num_bytes_read = 1; + + err = s_frame_data_length_parse( &fdl, p_read, remaining_capacity - *num_bytes_read ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + frame_data_block_size = s_get_size_from_fdl( fdl ); + + receiver_ftd->frame_data_length = frame_data_block_size; + int32_t length_field_size; + err = LC3PLUS_RTP_frame_data_length_get_size( &length_field_size, receiver_ftd->frame_data_length ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + *num_bytes_read += length_field_size; + return LC3PLUS_RTP_ERR_NO_ERROR; +} + +LC3PLUS_RTP_ERR LC3PLUS_RTP_payload_serialize( + uint8_t *serialized_buffer, + const size_t serialized_buffer_capacity, + size_t *packed_buffer_actual_size, + const LC3PLUS_RTP_FDL fdl_request, + LC3PLUS_RTP_FTD *sender_ftds, + const size_t sender_ftds_num ) +{ + LC3PLUS_RTP_ERR err; + uint8_t *p_write = serialized_buffer; + uint32_t i; + int32_t bytes_written = 0; + int32_t lc3plus_frame_size_sum; + uint8_t *p_frame_data; + int32_t fdl_request_length; + + if ( NULL == serialized_buffer || NULL == packed_buffer_actual_size || NULL == sender_ftds ) + { + return LC3PLUS_RTP_ERR_NULL_PTR; + } + + *packed_buffer_actual_size = 0; + err = LC3PLUS_RTP_frame_data_length_get_size( &fdl_request_length, fdl_request ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + if ( !s_fdl_value_is_valid_request( fdl_request ) ) + { + return LC3PLUS_RTP_ERR_INVALID_FDL_REQUEST; + } + if ( (int32_t) serialized_buffer_capacity < bytes_written + fdl_request_length ) + { + return LC3PLUS_RTP_ERR_INVALID_BITSTREAM_SIZE; + } + err = s_frame_data_length_pack( fdl_request, p_write ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + bytes_written += fdl_request_length; + p_write += bytes_written; + + for ( i = 0; i < sender_ftds_num; ++i ) + { + /* only the last ftd may have the LC3PLUS_RTP_FTD_FC_LAST_OVERALL value */ + if ( sender_ftds[i].fc == LC3PLUS_RTP_FTD_FC_LAST_OVERALL && i != ( sender_ftds_num - 1 ) ) + { + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + /* the last ftd must have the LC3PLUS_RTP_FTD_FC_LAST_OVERALL value */ + if ( sender_ftds[i].fc != LC3PLUS_RTP_FTD_FC_LAST_OVERALL && i == ( sender_ftds_num - 1 ) ) + { + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + if ( (int32_t) serialized_buffer_capacity < bytes_written + LC3PLUS_RTP_FTD_LENGTH_EXCLUDING_FDL ) + { + return LC3PLUS_RTP_ERR_INVALID_BITSTREAM_SIZE; + } + *p_write = 0x00; + *p_write |= LC3PLUS_RTP_FTD_FC_MASK & (uint8_t) sender_ftds[i].fc; + *p_write |= LC3PLUS_RTP_FTD_FDI_MASK & (uint8_t) sender_ftds[i].fdi; + *p_write |= LC3PLUS_RTP_FTD_BWR_MASK & (uint8_t) sender_ftds[i].bwr; + *p_write |= LC3PLUS_RTP_FTD_H_MASK & (uint8_t) sender_ftds[i].h; + p_write++; + bytes_written += LC3PLUS_RTP_FTD_LENGTH_EXCLUDING_FDL; + + int32_t fdl_length; + err = LC3PLUS_RTP_frame_data_length_get_size( &fdl_length, sender_ftds[i].frame_data_length ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + if ( (int32_t) serialized_buffer_capacity < bytes_written + fdl_length ) + { + return LC3PLUS_RTP_ERR_INVALID_BITSTREAM_SIZE; + } + err = s_frame_data_length_pack( sender_ftds[i].frame_data_length, p_write ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + p_write += fdl_length; + bytes_written += fdl_length; + } + + lc3plus_frame_size_sum = 0; + p_frame_data = serialized_buffer + bytes_written; + for ( i = 0; i < sender_ftds_num; ++i ) + { + sender_ftds[i].frame_data = p_frame_data; + p_frame_data += sender_ftds[i].frame_data_length; + lc3plus_frame_size_sum += sender_ftds[i].frame_data_length; + } + *packed_buffer_actual_size = bytes_written + lc3plus_frame_size_sum; + assert( *packed_buffer_actual_size <= serialized_buffer_capacity ); + return LC3PLUS_RTP_ERR_NO_ERROR; +} + +static LC3PLUS_RTP_ERR s_ftds_parse( + LC3PLUS_RTP_FTD *receiver_ftds, + const int32_t receiver_ftds_num_max, + int16_t *receiver_ftds_num, + uint8_t *serialized_buffer, + const size_t serialized_buffer_size ) +{ + int32_t diff; + uint8_t *p_read; + uint32_t ftds_offset_sum = 0; + int16_t i; + LC3PLUS_RTP_ERR error; + int32_t frame_offset_counter; + int32_t size; + + p_read = serialized_buffer; + if ( NULL == receiver_ftds || NULL == receiver_ftds_num || NULL == serialized_buffer ) + { + return LC3PLUS_RTP_ERR_NULL_PTR; + } + if ( 0 == serialized_buffer_size ) + { + return LC3PLUS_RTP_ERR_EMPTY_TOC; + } + if ( receiver_ftds_num_max <= 0 ) + { + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + { + int32_t num_bytes_read_sum = 0; + const int32_t min_num_bytes_per_ftd = 2; + int16_t receiver_ftds_index = 0; + bool another_ftd = true; + int32_t num_bytes_read_per_ftd; + + while ( another_ftd ) + { + if ( (int32_t) serialized_buffer_size < min_num_bytes_per_ftd ) + { + return LC3PLUS_RTP_ERR_INVALID_BITSTREAM_SIZE; + } + if ( num_bytes_read_sum >= (int32_t) serialized_buffer_size - min_num_bytes_per_ftd ) + { + return LC3PLUS_RTP_ERR_INVALID_BITSTREAM_SIZE; + } + num_bytes_read_per_ftd = 0; + error = s_parse_ftd( p_read, &receiver_ftds[receiver_ftds_index], &num_bytes_read_per_ftd, serialized_buffer_size - num_bytes_read_sum ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != error ) + { + return error; + } + p_read += num_bytes_read_per_ftd; + num_bytes_read_sum += num_bytes_read_per_ftd; + + if ( receiver_ftds[receiver_ftds_index].fc == LC3PLUS_RTP_FTD_FC_RESERVED ) + { + return LC3PLUS_RTP_ERR_INVALID_BITSTREAM; + } + else if ( receiver_ftds[receiver_ftds_index].fc == LC3PLUS_RTP_FTD_FC_LAST_OVERALL ) + { + another_ftd = false; + } + + if ( another_ftd ) + { + if ( receiver_ftds_index >= receiver_ftds_num_max ) + { + return LC3PLUS_RTP_ERR_NOT_ENOUGH_FTDS_ALLOCATED; + } + ( receiver_ftds_index )++; + } + } + *receiver_ftds_num = receiver_ftds_index + 1; + } + + /* set frame-data pointers into serialized_buffer */ + for ( i = 0; i < *receiver_ftds_num; ++i ) + { + error = LC3PLUS_RTP_frame_data_length_get_size( &size, receiver_ftds[i].frame_data_length ); + if ( error != LC3PLUS_RTP_ERR_NO_ERROR ) + { + return error; + } + ftds_offset_sum += LC3PLUS_RTP_FTD_LENGTH_EXCLUDING_FDL + size; + } + + frame_offset_counter = 0; + for ( i = 0; i < *receiver_ftds_num; ++i ) + { + if ( s_fdl_is_magic_value( receiver_ftds[i].frame_data_length ) ) + { + receiver_ftds[i].frame_data = NULL; + } + else + { + receiver_ftds[i].frame_data = serialized_buffer + ftds_offset_sum + frame_offset_counter; + frame_offset_counter += receiver_ftds[i].frame_data_length; + } + } + + if ( ftds_offset_sum + frame_offset_counter != serialized_buffer_size ) + { + /* parsed content & size n bytes of input buffer do not line up */ + /* if the buffer capacity is larger and the remaining bytes are zero, we don't treat this as an error since it's due to the IVAS-Split rendering zero padding */ + diff = serialized_buffer_size - ( ftds_offset_sum + frame_offset_counter ); + if ( diff < 0 ) + { + return LC3PLUS_RTP_ERR_INVALID_BITSTREAM_SIZE; + } + /* verify that all bytes are zero */ + p_read += frame_offset_counter; + for ( i = 0; i < diff; ++i ) + { + if ( *p_read != 0 ) + { + /* non-zero byte in padding region */ + return LC3PLUS_RTP_ERR_NONZERO_PADDING_BYTES; + } + p_read++; + } + } + return LC3PLUS_RTP_ERR_NO_ERROR; +} + +LC3PLUS_RTP_ERR LC3PLUS_RTP_payload_deserialize( + LC3PLUS_RTP_PAYLOAD *payload, + uint8_t *serialized_buffer, + const size_t serialized_buffer_size ) +{ + int32_t new_frame_duration_us; + int32_t new_sampling_rate_hz; + int16_t new_high_resolution_flag; + int16_t i = 0; + int16_t channel_id = 0; + int16_t media_time_id = 0; + const int16_t invalid_value = -1; + int16_t media_times_per_channel[LC3PLUS_RTP_PAYLOAD_MAX_NUM_CHANNELS]; + int16_t channels_per_media_time[LC3PLUS_RTP_PAYLOAD_MAX_NUM_MEDIA_TIMES]; + LC3PLUS_RTP_ERR err; + + if ( NULL == payload || NULL == serialized_buffer ) + { + return LC3PLUS_RTP_ERR_NULL_PTR; + } + if ( 0 == serialized_buffer_size ) + { + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + + for ( media_time_id = 0; media_time_id < LC3PLUS_RTP_PAYLOAD_MAX_NUM_MEDIA_TIMES; ++media_time_id ) + { + channels_per_media_time[media_time_id] = invalid_value; + } + media_time_id = 0; + for ( channel_id = 0; channel_id < LC3PLUS_RTP_PAYLOAD_MAX_NUM_CHANNELS; ++channel_id ) + { + media_times_per_channel[channel_id] = invalid_value; + } + channel_id = 0; + + err = s_frame_data_length_parse( &payload->fdl_request, serialized_buffer, serialized_buffer_size ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + int32_t fdl_request_length; + err = LC3PLUS_RTP_frame_data_length_get_size( &fdl_request_length, payload->fdl_request ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + if ( !s_fdl_value_is_valid_request( payload->fdl_request ) ) + { + return LC3PLUS_RTP_ERR_INVALID_FDL_REQUEST; + } + + err = s_ftds_parse( payload->ftds, sizeof( payload->ftds ) / sizeof( LC3PLUS_RTP_FTD ), &payload->num_ftds, serialized_buffer + fdl_request_length, serialized_buffer_size - fdl_request_length ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + if ( 0 == payload->num_ftds ) + { + return LC3PLUS_RTP_ERR_GENERIC_ERROR; + } + /* verify shared setting between all FTDs [samplerate, frame_duration, channel count] */ + + /* initialize on the first FTD, use this as reference */ + err = s_frame_duration_ms_from_fdi( &payload->frame_duration_us, payload->ftds[0].fdi ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + err = s_sampling_rate_hz_from_bwr( &payload->sampling_rate_hz, payload->ftds[0].bwr ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + err = s_high_resolution_flag_from_bwr( &payload->high_resolution_enabled, payload->ftds[0].bwr ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + payload->num_channels = 0; + payload->num_media_times = 0; + for ( i = 0; i < payload->num_ftds; ++i ) + { + if ( payload->ftds[i].h != LC3PLUS_RTP_FTD_H_PRIMARY ) + { + /* not implemented */ + return LC3PLUS_RTP_ERR_NOT_IMPLEMENTED; + } + + err = s_frame_duration_ms_from_fdi( &new_frame_duration_us, payload->ftds[i].fdi ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + if ( payload->frame_duration_us != new_frame_duration_us ) + { + /* mixed frame durations not supported */ + return LC3PLUS_RTP_ERR_UNSUPPORTED_CONFIGURATION; + } + + err = s_sampling_rate_hz_from_bwr( &new_sampling_rate_hz, payload->ftds[i].bwr ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + if ( payload->sampling_rate_hz != new_sampling_rate_hz ) + { + /* mixed sampling frequencies not supported */ + return LC3PLUS_RTP_ERR_UNSUPPORTED_CONFIGURATION; + } + + + err = s_high_resolution_flag_from_bwr( &new_high_resolution_flag, payload->ftds[i].bwr ); + if ( LC3PLUS_RTP_ERR_NO_ERROR != err ) + { + return err; + } + if ( payload->high_resolution_enabled != new_high_resolution_flag ) + { + /* mixed high resolution mode not supported */ + return LC3PLUS_RTP_ERR_UNSUPPORTED_CONFIGURATION; + } + + switch ( payload->ftds[i].fc ) + { + case LC3PLUS_RTP_FTD_FC_LAST_OVERALL: + channels_per_media_time[media_time_id]++; + media_times_per_channel[channel_id]++; + channel_id = 0; + media_time_id = 0; + break; + case LC3PLUS_RTP_FTD_FC_SUBSEQUENT_CHANNEL: + media_times_per_channel[channel_id]++; + channels_per_media_time[media_time_id]++; + channel_id++; + break; + case LC3PLUS_RTP_FTD_FC_LAST_IN_MEDIATIME: + media_times_per_channel[channel_id]++; + channels_per_media_time[media_time_id]++; + channel_id = 0; + media_time_id++; + break; + case LC3PLUS_RTP_FTD_FC_RESERVED: + default: + return LC3PLUS_RTP_ERR_INVALID_BITSTREAM; + } + } + + { + int32_t valid_num_media_times_per_channel; + int32_t iCh; + /* check whether all channels exist for each media time */ + if ( media_times_per_channel[0] == invalid_value ) + { + return LC3PLUS_RTP_ERR_NOT_IMPLEMENTED; + } + valid_num_media_times_per_channel = media_times_per_channel[0]; + for ( iCh = 0; iCh < LC3PLUS_RTP_PAYLOAD_MAX_NUM_CHANNELS; ++iCh ) + { + if ( media_times_per_channel[iCh] == invalid_value ) + { + break; + } + if ( valid_num_media_times_per_channel != media_times_per_channel[iCh] ) + { + return LC3PLUS_RTP_ERR_NOT_IMPLEMENTED; + } + } + } + { + /* whether all media times exist for each channel */ + int32_t iMediaTime; + int32_t valid_num_channels_per_media_time; + if ( channels_per_media_time[0] == invalid_value ) + { + return LC3PLUS_RTP_ERR_NOT_IMPLEMENTED; + } + valid_num_channels_per_media_time = channels_per_media_time[0]; + for ( iMediaTime = 0; iMediaTime < LC3PLUS_RTP_PAYLOAD_MAX_NUM_MEDIA_TIMES; ++iMediaTime ) + { + if ( channels_per_media_time[iMediaTime] == invalid_value ) + { + break; + } + if ( valid_num_channels_per_media_time != channels_per_media_time[iMediaTime] ) + { + return LC3PLUS_RTP_ERR_NOT_IMPLEMENTED; + } + } + } + + /* convert zero-index to count */ + payload->num_channels = channels_per_media_time[0] + 1; + payload->num_media_times = media_times_per_channel[0] + 1; + + /* verify that all media times have the same number of channels, partial packets are not supported */ + if ( payload->num_ftds != payload->num_channels * payload->num_media_times ) + { + return LC3PLUS_RTP_ERR_GENERIC_ERROR; + } + return LC3PLUS_RTP_ERR_NO_ERROR; +} + +LC3PLUS_RTP_ERR LC3PLUS_RTP_ftd_bwr_from_samplerate( LC3PLUS_RTP_FTD_BWR *bwr, const int32_t sampling_rate, const int32_t high_res_enabled ) +{ + if ( NULL == bwr ) + { + return LC3PLUS_RTP_ERR_NULL_PTR; + } + switch ( sampling_rate ) + { + case 8000: + if ( high_res_enabled ) + { + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + *bwr = LC3PLUS_RTP_FTD_BWR_NB; + return LC3PLUS_RTP_ERR_NO_ERROR; + case 16000: + if ( high_res_enabled ) + { + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + *bwr = LC3PLUS_RTP_FTD_BWR_WB; + return LC3PLUS_RTP_ERR_NO_ERROR; + case 24000: + if ( high_res_enabled ) + { + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + *bwr = LC3PLUS_RTP_FTD_BWR_SSWB; + return LC3PLUS_RTP_ERR_NO_ERROR; + case 32000: + if ( high_res_enabled ) + { + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + *bwr = LC3PLUS_RTP_FTD_BWR_SWB; + return LC3PLUS_RTP_ERR_NO_ERROR; + case 44100: + if ( high_res_enabled ) + { + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + *bwr = LC3PLUS_RTP_FTD_BWR_FBCD; + return LC3PLUS_RTP_ERR_NO_ERROR; + case 48000: + if ( 0 == high_res_enabled ) + { + *bwr = LC3PLUS_RTP_FTD_BWR_FB; + return LC3PLUS_RTP_ERR_NO_ERROR; + } + else + { + *bwr = LC3PLUS_RTP_FTD_BWR_FBHR; + return LC3PLUS_RTP_ERR_NO_ERROR; + } + case 96000: + if ( 0 == high_res_enabled ) + { + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; + } + *bwr = LC3PLUS_RTP_FTD_BWR_UBHR; + return LC3PLUS_RTP_ERR_NO_ERROR; + default: + break; + } + + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; +} + +LC3PLUS_RTP_ERR LC3PLUS_RTP_ftd_fdi_from_frame_duration_us( LC3PLUS_RTP_FTD_FDI *fdi, const int32_t frame_duration_us ) +{ + if ( NULL == fdi ) + { + return LC3PLUS_RTP_ERR_NULL_PTR; + } + switch ( frame_duration_us ) + { + case 2500: + *fdi = LC3PLUS_RTP_FTD_FDI_2500_US; + return LC3PLUS_RTP_ERR_NO_ERROR; + case 5000: + *fdi = LC3PLUS_RTP_FTD_FDI_5000_US; + return LC3PLUS_RTP_ERR_NO_ERROR; + case 10000: + *fdi = LC3PLUS_RTP_FTD_FDI_10000_US; + return LC3PLUS_RTP_ERR_NO_ERROR; + default: + break; + } + + return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; +} diff --git a/lib_isar/isar_lc3plus_payload.h b/lib_isar/isar_lc3plus_payload.h new file mode 100644 index 0000000000000000000000000000000000000000..580a58ca651defe96eeb84229b8f07b3407a756c --- /dev/null +++ b/lib_isar/isar_lc3plus_payload.h @@ -0,0 +1,212 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef ISAR_LC3PLUS_PAYLOAD_H +#define ISAR_LC3PLUS_PAYLOAD_H + +#include +#include +#include "lc3plus.h" +#include "options.h" + + +/* Implementation of the "B.2.6 Table of contents" part of the RTP payload format + * for LC3plus as specified in ETSI TS 103 634. */ + +typedef enum LC3PLUS_RTP_ERR +{ + LC3PLUS_RTP_ERR_NO_ERROR, + LC3PLUS_RTP_ERR_NULL_PTR, + LC3PLUS_RTP_ERR_INVALID_PARAMETERS, + LC3PLUS_RTP_ERR_EMPTY_TOC, + LC3PLUS_RTP_ERR_NOT_IMPLEMENTED, + LC3PLUS_RTP_ERR_UNSUPPORTED_CONFIGURATION, + LC3PLUS_RTP_ERR_INVALID_BITSTREAM, + LC3PLUS_RTP_ERR_INVALID_BITSTREAM_SIZE, + LC3PLUS_RTP_ERR_NOT_ENOUGH_FTDS_ALLOCATED, + LC3PLUS_RTP_ERR_INVALID_FDL_REQUEST, + LC3PLUS_RTP_ERR_NONZERO_PADDING_BYTES, + LC3PLUS_RTP_ERR_GENERIC_ERROR +} LC3PLUS_RTP_ERR; + +/* + * The content of the FTD is shown in Figure B.6. + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |FC |FDI| BWR |H| FDL1 | (FDL2) | (FDL3) | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + +/* FC (2 bits): + * Frame and Channel (FC) indicator for subsequent frame data (if available). The meaning of the FC + * indicator is shown in Table B.2. The FC value defines the media time stamp (in integer increments + * of TSI) and the channel counter (CC, starting from 1 for the first channel) for the subsequent + * FTD (if available). */ +typedef enum LC3PLUS_RTP_FTD_FC +{ + LC3PLUS_RTP_FTD_FC_LAST_OVERALL = 0x00, /* Last FDL in ToC, no FDL follows the current FDL */ + LC3PLUS_RTP_FTD_FC_SUBSEQUENT_CHANNEL = 0x01, /* The next FDL is for the next channel for the same media time */ + LC3PLUS_RTP_FTD_FC_LAST_IN_MEDIATIME = 0x02, /* The next FDL is for first channel for next media time, channel counter is reset */ + LC3PLUS_RTP_FTD_FC_RESERVED = 0x03, /* Reserved */ +} LC3PLUS_RTP_FTD_FC; +#define LC3PLUS_RTP_FTD_FC_MASK 0x03 + +/* FDI (2 bits): + * Frame Duration Index, with encoding as shown in Table B.3. The FDI shall be static for a given + * payload type during the session. The FDI also dictates the TSI, needed for deriving the media + * time in case of more than one frame in the payload. */ +typedef enum LC3PLUS_RTP_FTD_FDI +{ + LC3PLUS_RTP_FTD_FDI_2500_US = 0x00, + LC3PLUS_RTP_FTD_FDI_5000_US = 0x04, + LC3PLUS_RTP_FTD_FDI_10000_US = 0x08, + LC3PLUS_RTP_FTD_FDI_RESERVED = 0x0C, +} LC3PLUS_RTP_FTD_FDI; +#define LC3PLUS_RTP_FTD_FDI_MASK 0x0C +LC3PLUS_RTP_ERR LC3PLUS_RTP_ftd_fdi_from_frame_duration_us( LC3PLUS_RTP_FTD_FDI *fdi, const int32_t frame_duration_us ); + +/* BWR (3 bits): + * Bandwidth and resolution combination used by the codec is jointly encoded into a bandwidth and + * resolution (BWR) index. The BWR index is encoded as shown in Table B.4. The BWR encoding is + * defined in Table B.4. The BWR index shall be static for a given payload type during the session. */ +typedef enum LC3PLUS_RTP_FTD_BWR +{ + LC3PLUS_RTP_FTD_BWR_NB = 0x00, + LC3PLUS_RTP_FTD_BWR_WB = 0x10, + LC3PLUS_RTP_FTD_BWR_SSWB = 0x20, + LC3PLUS_RTP_FTD_BWR_SWB = 0x30, + LC3PLUS_RTP_FTD_BWR_FBCD = 0x40, + LC3PLUS_RTP_FTD_BWR_FB = 0x50, + LC3PLUS_RTP_FTD_BWR_FBHR = 0x60, + LC3PLUS_RTP_FTD_BWR_UBHR = 0x70, +} LC3PLUS_RTP_FTD_BWR; +#define LC3PLUS_RTP_FTD_BWR_MASK 0x70 +LC3PLUS_RTP_ERR LC3PLUS_RTP_ftd_bwr_from_samplerate( LC3PLUS_RTP_FTD_BWR *bwr, const int32_t sampling_rate, const int32_t high_res_enabled ); + +/* H (1 bit): + * Indicates whether the corresponding frame is a normal frame (primary encoding) or a helper frame + * (secondary encoding). 0 indicates a primary frame, 1 indicates secondary (redundant) frame */ +typedef enum LC3PLUS_RTP_FTD_H +{ + LC3PLUS_RTP_FTD_H_PRIMARY = 0x00, + LC3PLUS_RTP_FTD_H_SECONDARY = 0x80, +} LC3PLUS_RTP_FTD_H; +#define LC3PLUS_RTP_FTD_H_MASK 0x80 + +typedef enum LC3PLUS_RTP_FDL +{ + LC3PLUS_RTP_FDL_NO_REQ_OR_NO_DATA = 0, + LC3PLUS_RTP_FDL_SPEECH_BAD = 1, + LC3PLUS_RTP_FDL_SPEECH_SID = 2, + LC3PLUS_RTP_FDL_RESERVED_MIN = 3, + LC3PLUS_RTP_FDL_RESERVED_MAX = 19, + LC3PLUS_RTP_FDL_LENGTH_1_MIN = 20, + LC3PLUS_RTP_FDL_LENGTH_1_MAX = 254, + LC3PLUS_RTP_FDL_LENGTH_2_MIN = 255, + LC3PLUS_RTP_FDL_LENGTH_2_MAX = 509, + LC3PLUS_RTP_FDL_LENGTH_3_MIN = 510, + LC3PLUS_RTP_FDL_LENGTH_3_MAX = 765 +} LC3PLUS_RTP_FDL; +/* value used to indicate that the Frame Data Length (FDL) extends to the next byte */ +#define LC3PLUS_RTP_FDL_EXTENSION_VALUE 0xFF + +typedef struct LC3PLUS_RTP_FTD +{ + LC3PLUS_RTP_FTD_FC fc; + LC3PLUS_RTP_FTD_FDI fdi; + LC3PLUS_RTP_FTD_BWR bwr; + LC3PLUS_RTP_FTD_H h; + uint8_t *frame_data; + LC3PLUS_RTP_FDL frame_data_length; +} LC3PLUS_RTP_FTD; +#define LC3PLUS_RTP_FTD_LENGTH_EXCLUDING_FDL 1 +#define LC3PLUS_RTP_FDL_MIN_LENGTH 1 +#define LC3PLUS_RTP_FTD_MIN_SIZE ( LC3PLUS_RTP_FTD_LENGTH_EXCLUDING_FDL + LC3PLUS_RTP_FDL_MIN_LENGTH ) + +/*! Serialize the sender_ftds structs and fdl_request into a linear compact buffer + * @param[out] serialized_buffer pointer to the start of the memory location where the serialized buffer will be written to + * @param[in] serialized_buffer_capacity capacity of the serialized_buffer in bytes + * @param[out] packed_buffer_actual_size actually used size of in bytes of the packed_buffer (<=serialized_buffer_capacity) + * @param[in] fdl_request frame data length request + * @param[in,out] sender_ftds the function will overwrite the frame_data pointer with the correct memory location in + * the packed_buffer (so it can subsequently be used as input for the LC3plus encode call) + * @param[in] sender_ftds_num number of sender_ftds + * @return LC3PLUS_RTP_ERR_NO_ERROR in case of success */ +LC3PLUS_RTP_ERR LC3PLUS_RTP_payload_serialize( + uint8_t *serialized_buffer, + const size_t serialized_buffer_capacity, + size_t *packed_buffer_actual_size, + const LC3PLUS_RTP_FDL fdl_request, + LC3PLUS_RTP_FTD *sender_ftds, + const size_t sender_ftds_num ); + +/*! Get size of the frame data length field for a certain frame data length value in bytes. + * @param[out] length size of the frame data length field in bytes [1,2,3] + * @param[in] frameDataLengthValue frame data length value + * @return LC3PLUS_RTP_ERR_NO_ERROR in case of success */ +LC3PLUS_RTP_ERR LC3PLUS_RTP_frame_data_length_get_size( int32_t *length, const LC3PLUS_RTP_FDL frameDataLengthValue ); + +#define LC3PLUS_RTP_PAYLOAD_MAX_NUM_CHANNELS 16 +#define LC3PLUS_RTP_PAYLOAD_MAX_NUM_MEDIA_TIMES 8 /* max ivas frame duration/min lc3plus frame duration: 20000/2500 */ +#define LC3PLUS_RTP_PAYLOAD_MAX_NUM_FTDS LC3PLUS_RTP_PAYLOAD_MAX_NUM_CHANNELS *LC3PLUS_RTP_PAYLOAD_MAX_NUM_MEDIA_TIMES + +typedef struct LC3PLUS_RTP_PAYLOAD_CONFIG +{ + /* frame duration in us shared among all FTDs */ + int32_t frame_duration_us; + /* high resolution flag shared among all FTDs */ + int16_t high_resolution_enabled; + /* sampling frequency shared among all FTDs */ + int32_t sampling_rate_hz; + /* number of individual channels in the payload */ + int16_t num_channels; + /* number of individual media times in the payload */ + int16_t num_media_times; + /* frame data length request */ + LC3PLUS_RTP_FDL fdl_request; + /* FTD data with pointer to raw frame data */ + LC3PLUS_RTP_FTD ftds[LC3PLUS_RTP_PAYLOAD_MAX_NUM_FTDS]; + /* actual number of ftds */ + int16_t num_ftds; +} LC3PLUS_RTP_PAYLOAD; + +/*! Deserialized a serialized buffer into a LC3PLUS_RTP_PAYLOAD struct + * @param payload pointer to target LC3PLUS_RTP_PAYLOAD object. Note: frame_data pointers in the struct will point to the respective memory locations in the serialized_buffer. + * @param serialized_buffer pointer to the start of the serialized input buffer + * @param serialized_buffer_size size of the serialized input buffer in bytes + * @return LC3PLUS_RTP_ERR_NO_ERROR in case of success */ +LC3PLUS_RTP_ERR LC3PLUS_RTP_payload_deserialize( + LC3PLUS_RTP_PAYLOAD *payload, + uint8_t *serialized_buffer, + const size_t serialized_buffer_size ); + +#endif /* ISAR_LC3PLUS_PAYLOAD_H */ diff --git a/lib_isar/isar_lcld_decoder.c b/lib_isar/isar_lcld_decoder.c new file mode 100644 index 0000000000000000000000000000000000000000..8bb931e3f7e6f23e1d26a6b8b2370691942ae692 --- /dev/null +++ b/lib_isar/isar_lcld_decoder.c @@ -0,0 +1,2044 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "isar_lcld_prot.h" +#include "isar_rom_lcld_tables.h" +#include "prot_fx.h" +#include +#include "isar_prot.h" +#include "wmc_auto.h" +#include "basop_util.h" +#include "prot_fx.h" +// #define DEBUG_WRITE +#include "debug.h" +#include "enh64.h" + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define HUFF_READ_SIZE ( 4 ) + +/*------------------------------------------------------------------------------------------* + * Local structures + *------------------------------------------------------------------------------------------*/ + +typedef struct TableNode +{ + struct TableNode **ppoNextTable; + struct TableNode *poOrderedNext; + + Word32 *piCodeIndex; + Word32 *piDifference; + Word32 *piLength; +} TableNode; + +typedef struct TableList +{ + TableNode *poOrderedTop; + TableNode *poOrderedBottom; + +} TableList; + +struct LCLD_DECODER +{ + Word32 iSampleRate; + Word32 iChannels; + Word32 iNumBlocks; + + Word32 iNumBands; + const Word32 *piBandwidths; + + Word32 iMSMode; + Word32 *piMSFlags; + TableList *ptable_list; + UWord32 ( *c_apauiHuffDecTable_RAM[2 * ALLOC_TABLE_SIZE] )[HUFF_DEC_TABLE_SIZE]; + UWord32 num_decode_table[2 * ALLOC_TABLE_SIZE]; + Word32 piMSPredCoefs[MAX_BANDS]; + Word32 piLRPhaseDiffs[MAX_BANDS]; + Word32 iCommonGrouping; + Word32 *piNumGroups; + Word32 **ppiGroupLengths; + + Word32 ***pppiRMSEnvelope; + Word32 ***pppiSMR; + Word32 ***pppiExcitation; + Word32 ***pppiAlloc; + + Word32 iAllocOffset; + Word32 iRealOnlyOut; + + Word32 ***pppiLCLDSignReal; + Word32 ***pppiLCLDSignImag; + Word32 ***pppiQLCLDReal; + Word32 ***pppiQLCLDImag; + + PredictionDecoder *psPredictionDecoder; + + + NoiseGen *psNoiseGen; +}; + +static void CreateDecodeTable( LCLDDecoder *psLCLDDecoder, Word32 num, const UWord16 ( *ppuiEncTable )[2], Word32 iSize, Word32 iReadLength, UWord32 *iTables ); +static TableNode *CreateTableList( Word32 iReadLength ); +static void DeleteTableList( TableList *ptable_list, Word32 iTables ); +static TableNode *GetNextTable( Word32 iIndex, TableList *table_list, TableNode *poParent, Word32 iReadLength, UWord32 *iTablesCreated ); +static void AddcodeTableList( TableList *ptable_list, Word32 iLength, Word32 iCode, Word32 iCodeIndex, Word32 iReadLength, UWord32 *iTables ); +static void CompleteTables( LCLDDecoder *psLCLDDecoder, Word32 n, TableList *ptable_list, Word32 iReadLength, Word32 iTablesCreated ); + +static TableNode *CreateTableList( Word32 iReadLength ) +{ + Word32 n; + Word32 iMaxTables; + TableNode *ptable_top; + iMaxTables = L_shl( 1, (Word16) iReadLength ); + ptable_top = (TableNode *) malloc( sizeof( TableNode ) ); + ptable_top->ppoNextTable = (TableNode **) malloc( iMaxTables * sizeof( TableNode * ) ); + ptable_top->piCodeIndex = (Word32 *) malloc( iMaxTables * sizeof( Word32 ) ); + ptable_top->piDifference = (Word32 *) malloc( iMaxTables * sizeof( Word32 ) ); + ptable_top->piLength = (Word32 *) malloc( iMaxTables * sizeof( Word32 ) ); + FOR( n = 0; n < iMaxTables; n++ ) + { + ptable_top->ppoNextTable[n] = NULL; + ptable_top->piCodeIndex[n] = 0xffff; + move32(); + ptable_top->piDifference[n] = 0; + move32(); + ptable_top->piLength[n] = 0; + move32(); + } + + return ptable_top; +} + + +static void DeleteTableList( + TableList *ptable_list, + Word32 iTables ) +{ + + TableNode *node; + node = ptable_list->poOrderedTop; + + WHILE( ( iTables ) ) + { + + TableNode *node1 = node; + node = node1->poOrderedNext; + IF( node1->piCodeIndex != NULL ) + { + free( node1->piCodeIndex ); + } + IF( node1->piLength != NULL ) + { + free( node1->piLength ); + } + IF( node1->piDifference != NULL ) + { + free( node1->piDifference ); + } + IF( node1->ppoNextTable != NULL ) + { + free( node1->ppoNextTable ); + } + IF( node1 != NULL ) + { + free( node1 ); + } + iTables--; + } + + IF( ptable_list != NULL ) + { + free( ptable_list ); + } + + return; +} + + +static TableNode *GetNextTable( + Word32 iIndex, + TableList *table_list, + TableNode *poParent, + Word32 iReadLength, + UWord32 *iTablesCreated ) +{ + TableNode *poNextNode; + + IF( poParent->ppoNextTable[iIndex] == NULL ) + { + poNextNode = CreateTableList( iReadLength ); + poParent->ppoNextTable[iIndex] = poNextNode; + poParent->piDifference[iIndex] = *iTablesCreated; /* this is a link to the next table rather than the difference */ + move32(); + table_list->poOrderedBottom->poOrderedNext = poNextNode; + table_list->poOrderedBottom = poNextNode; + + ( *iTablesCreated )++; + } + ELSE + { + poNextNode = poParent->ppoNextTable[iIndex]; + } + + return poNextNode; +} + + +static void CompleteTables( + LCLDDecoder *psLCLDDecoder, + Word32 n, + TableList *ptable_list, + Word32 iReadLength, + Word32 iTablesCreated ) +{ + + Word32 iMaxTables; + Word32 j; + TableNode *poNode; + + iMaxTables = L_shl( 1, (Word16) iReadLength ); + psLCLDDecoder->c_apauiHuffDecTable_RAM[n] = + malloc( iTablesCreated * iMaxTables * sizeof( UWord32 * ) ); + + poNode = ptable_list->poOrderedTop; + FOR( j = 0; j < iTablesCreated; j++ ) + { + Word32 k; + IF( poNode != NULL ) + { + FOR( k = 0; k < iMaxTables; k++ ) + { + UWord32 uiCode; + uiCode = poNode->piDifference[k]; + move32(); + uiCode = (UWord32) L_shl( (Word32) uiCode, 16 ); + uiCode = (UWord32) L_or( (Word32) uiCode, poNode->piCodeIndex[k] ); + psLCLDDecoder->c_apauiHuffDecTable_RAM[n][j][k] = uiCode; + move32(); + } + } + poNode = poNode->poOrderedNext; + } + + return; +} + + +static void AddcodeTableList( + TableList *ptable_list, + Word32 iLength, + Word32 iCode, + Word32 iCodeIndex, + Word32 iReadLength, + UWord32 *iTables ) +{ + Word32 iDifference; + Word32 iMask; + Word32 iCurrentLength; + Word32 iIndex; + Word32 iCodeLow; + Word32 iCodeHigh; + + TableNode *poNode; + poNode = ptable_list->poOrderedTop; + iMask = L_sub( L_shl( 1, (Word16) iReadLength ), 1 ); + iCurrentLength = iLength; + move32(); + WHILE( GT_32( iCurrentLength, iReadLength ) ) + { + iDifference = L_sub( iCurrentLength, iReadLength ); + iIndex = L_shr( iCode, (Word16) iDifference ); + iIndex = L_and( iIndex, iMask ); + poNode = GetNextTable( iIndex, ptable_list, poNode, iReadLength, iTables ); + iCurrentLength = L_sub( iCurrentLength, iReadLength ); + } + + iMask = L_sub( L_shl( 1, (Word16) iCurrentLength ), 1 ); + iDifference = L_sub( iReadLength, iCurrentLength ); + iCodeLow = L_shl( L_and( iCode, iMask ), (Word16) iDifference ); + iMask = L_sub( L_shl( 1, (Word16) iDifference ), 1 ); + iCodeHigh = L_or( iCodeLow, iMask ); + FOR( iIndex = iCodeLow; iIndex <= iCodeHigh; iIndex++ ) + { + poNode->piCodeIndex[iIndex] = iCodeIndex; + move32(); + poNode->piDifference[iIndex] = iDifference; + move32(); + poNode->piLength[iIndex] = iLength; + move32(); + } +} + +static void CreateDecodeTable( + LCLDDecoder *psLCLDDecoder, + Word32 num, + const UWord16 ( *ppuiEncTable )[2], + Word32 iSize, + Word32 iReadLength, + UWord32 *iTables ) +{ + Word32 n; + UWord32 **ppsort_enc_table; + TableList *ptable_list; + ptable_list = (TableList *) malloc( sizeof( TableList ) ); + + ppsort_enc_table = (UWord32 **) malloc( iSize * sizeof( Word32 * ) ); + FOR( n = 0; n < iSize; n++ ) + { + ppsort_enc_table[n] = (UWord32 *) malloc( 3 * sizeof( Word32 ) ); + ppsort_enc_table[n][0] = (UWord32) ppuiEncTable[n][0]; + move32(); + ppsort_enc_table[n][1] = (UWord32) ppuiEncTable[n][1]; + move32(); + ppsort_enc_table[n][2] = (UWord32) n; + move32(); + } + + FOR( n = 0; n < iSize; n++ ) + { + UWord32 iMin; + Word32 iMinIndex; + Word32 k; + + iMin = ppsort_enc_table[n][0]; + move32(); + iMinIndex = n; + move32(); + FOR( k = n; k < iSize; k++ ) + { + IF( ppsort_enc_table[k][0] < iMin ) + { + iMin = ppsort_enc_table[k][0]; + move32(); + iMinIndex = k; + move32(); + } + } + + IF( NE_32( iMinIndex, n ) ) + { + UWord32 uiLength; + UWord32 uiCode; + UWord32 uiCodeIndex; + + uiLength = ppsort_enc_table[n][0]; + move32(); + uiCode = ppsort_enc_table[n][1]; + move32(); + uiCodeIndex = ppsort_enc_table[n][2]; + move32(); + + ppsort_enc_table[n][0] = ppsort_enc_table[iMinIndex][0]; + move32(); + ppsort_enc_table[n][1] = ppsort_enc_table[iMinIndex][1]; + move32(); + ppsort_enc_table[n][2] = ppsort_enc_table[iMinIndex][2]; + move32(); + + ppsort_enc_table[iMinIndex][0] = uiLength; + move32(); + ppsort_enc_table[iMinIndex][1] = uiCode; + move32(); + ppsort_enc_table[iMinIndex][2] = uiCodeIndex; + move32(); + } + } + ptable_list->poOrderedTop = CreateTableList( iReadLength ); + ptable_list->poOrderedBottom = ptable_list->poOrderedTop; + FOR( n = 0; n < iSize; n++ ) + { + Word32 iLength; + Word32 iCode; + Word32 iCodeIndex; + + iLength = ppsort_enc_table[n][0]; + move32(); + iCode = ppsort_enc_table[n][1]; + move32(); + iCodeIndex = ppsort_enc_table[n][2]; + move32(); + AddcodeTableList( ptable_list, iLength, iCode, iCodeIndex, iReadLength, + iTables ); + } + + CompleteTables( psLCLDDecoder, num, ptable_list, iReadLength, *iTables ); + DeleteTableList( ptable_list, *iTables ); + FOR( n = 0; n < iSize; n++ ) + { + free( ppsort_enc_table[n] ); + } + free( ppsort_enc_table ); + + return; +} + + +/*------------------------------------------------------------------------------------------* + * Function CreateLCLDDecoder() + * + * + *------------------------------------------------------------------------------------------*/ + +ivas_error CreateLCLDDecoder( + LCLDDecoder **psLCLDDecoder_out, + const Word32 iSampleRate, + const Word32 iChannels, + const Word32 iNumBlocks, + const Word32 iRealOnlyOut ) +{ + Word32 n; + Word32 read_length; + ivas_error error; + LCLDDecoder *psLCLDDecoder = NULL; + + assert( iSampleRate == 48000 ); + assert( iNumBlocks == 16 || iNumBlocks == 8 || iNumBlocks == 4 ); + IF( ( psLCLDDecoder = (LCLDDecoder *) malloc( sizeof( LCLDDecoder ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + psLCLDDecoder->iSampleRate = iSampleRate; + move32(); + psLCLDDecoder->iChannels = iChannels; + psLCLDDecoder->iAllocOffset = 0; + psLCLDDecoder->iRealOnlyOut = iRealOnlyOut; + if ( iRealOnlyOut == 1 ) + { + psLCLDDecoder->iNumBlocks = L_shr( iNumBlocks, 1 ); + } + else + { + psLCLDDecoder->iNumBlocks = iNumBlocks; + } + psLCLDDecoder->iNumBands = 0; /* read from bitstream*/ + move32(); + psLCLDDecoder->piBandwidths = c_aiBandwidths48; + + psLCLDDecoder->iMSMode = 0; + move32(); + IF( ( psLCLDDecoder->piMSFlags = (Word32 *) malloc( MAX_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + FOR( n = 0; n < MAX_BANDS; n++ ) + { + psLCLDDecoder->piLRPhaseDiffs[n] = 0; + move32(); + psLCLDDecoder->piMSPredCoefs[n] = 0; + move32(); + } + + psLCLDDecoder->iCommonGrouping = 1; /* Common grouping always on only impacts stereo */ + move32(); + IF( ( psLCLDDecoder->piNumGroups = (Word32 *) malloc( psLCLDDecoder->iChannels * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->ppiGroupLengths = (Word32 **) malloc( psLCLDDecoder->iChannels * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiRMSEnvelope = (Word32 ***) malloc( psLCLDDecoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiSMR = (Word32 ***) malloc( psLCLDDecoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiExcitation = (Word32 ***) malloc( psLCLDDecoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiAlloc = (Word32 ***) malloc( psLCLDDecoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDDecoder->pppiLCLDSignReal = (Word32 ***) malloc( psLCLDDecoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiLCLDSignImag = (Word32 ***) malloc( psLCLDDecoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiQLCLDReal = (Word32 ***) malloc( psLCLDDecoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiQLCLDImag = (Word32 ***) malloc( psLCLDDecoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + FOR( n = 0; n < iChannels; n++ ) + { + Word16 k; + IF( ( psLCLDDecoder->ppiGroupLengths[n] = (Word32 *) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiRMSEnvelope[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiSMR[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiExcitation[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiAlloc[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDDecoder->pppiLCLDSignReal[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiLCLDSignImag[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiQLCLDReal[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiQLCLDImag[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + IF( ( psLCLDDecoder->pppiRMSEnvelope[n][k] = (Word32 *) malloc( MAX_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiSMR[n][k] = (Word32 *) malloc( MAX_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiExcitation[n][k] = (Word32 *) malloc( MAX_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiAlloc[n][k] = (Word32 *) malloc( MAX_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDDecoder->pppiLCLDSignReal[n][k] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiLCLDSignImag[n][k] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiQLCLDReal[n][k] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( psLCLDDecoder->pppiQLCLDImag[n][k] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + } + } + + read_length = READ_LENGTH; + move32(); + FOR( n = 0; n < shl( ALLOC_TABLE_SIZE, 1 ); n++ ) + { + psLCLDDecoder->num_decode_table[n] = 1; + move32(); + IF( c_apauiHuffEncTabels[n] != NULL ) + { + CreateDecodeTable( psLCLDDecoder, n, c_apauiHuffEncTabels[n], num_row_aauiLCLDHuff[n], read_length, &psLCLDDecoder->num_decode_table[n] ); + } + ELSE + { + psLCLDDecoder->c_apauiHuffDecTable_RAM[n] = NULL; + } + } + + IF( ( error = CreatePredictionDecoder_fx( &psLCLDDecoder->psPredictionDecoder, iChannels, psLCLDDecoder->iNumBlocks ) ) != IVAS_ERR_OK ) + { + return error; + } + psLCLDDecoder->psNoiseGen = NULL; /* CreateNoiseGen(); No noise fill for now*/ + *psLCLDDecoder_out = psLCLDDecoder; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------------------------* + * Function DeleteLCLDDecoder() + * + * + *------------------------------------------------------------------------------------------*/ + +void DeleteLCLDDecoder( + LCLDDecoder *psLCLDDecoder ) +{ + Word32 k, n; + + IF( psLCLDDecoder != NULL ) + { + IF( psLCLDDecoder->piMSFlags != NULL ) + { + free( psLCLDDecoder->piMSFlags ); + } + + IF( psLCLDDecoder->piNumGroups != NULL ) + { + free( psLCLDDecoder->piNumGroups ); + } + + IF( psLCLDDecoder->ppiGroupLengths != NULL ) + { + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + free( psLCLDDecoder->ppiGroupLengths[n] ); + } + free( psLCLDDecoder->ppiGroupLengths ); + } + + IF( psLCLDDecoder->pppiRMSEnvelope != NULL ) + { + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDDecoder->pppiRMSEnvelope[n][k] ); + } + free( psLCLDDecoder->pppiRMSEnvelope[n] ); + } + free( psLCLDDecoder->pppiRMSEnvelope ); + } + + IF( psLCLDDecoder->pppiSMR != NULL ) + { + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDDecoder->pppiSMR[n][k] ); + } + free( psLCLDDecoder->pppiSMR[n] ); + } + free( psLCLDDecoder->pppiSMR ); + } + + IF( psLCLDDecoder->pppiExcitation != NULL ) + { + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDDecoder->pppiExcitation[n][k] ); + } + free( psLCLDDecoder->pppiExcitation[n] ); + } + free( psLCLDDecoder->pppiExcitation ); + } + + + IF( psLCLDDecoder->pppiAlloc != NULL ) + { + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDDecoder->pppiAlloc[n][k] ); + } + free( psLCLDDecoder->pppiAlloc[n] ); + } + free( psLCLDDecoder->pppiAlloc ); + } + + IF( psLCLDDecoder->pppiLCLDSignReal != NULL ) + { + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDDecoder->pppiLCLDSignReal[n][k] ); + } + free( psLCLDDecoder->pppiLCLDSignReal[n] ); + } + free( psLCLDDecoder->pppiLCLDSignReal ); + } + + IF( psLCLDDecoder->pppiLCLDSignImag != NULL ) + { + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDDecoder->pppiLCLDSignImag[n][k] ); + } + free( psLCLDDecoder->pppiLCLDSignImag[n] ); + } + free( psLCLDDecoder->pppiLCLDSignImag ); + } + + IF( psLCLDDecoder->pppiQLCLDReal != NULL ) + { + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDDecoder->pppiQLCLDReal[n][k] ); + } + free( psLCLDDecoder->pppiQLCLDReal[n] ); + } + free( psLCLDDecoder->pppiQLCLDReal ); + } + + IF( psLCLDDecoder->pppiQLCLDImag != NULL ) + { + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDDecoder->pppiQLCLDImag[n][k] ); + } + free( psLCLDDecoder->pppiQLCLDImag[n] ); + } + free( psLCLDDecoder->pppiQLCLDImag ); + } + + FOR( n = 0; n < ALLOC_TABLE_SIZE * 2; n++ ) + { + IF( psLCLDDecoder->num_decode_table[n] > 1 ) + { + + IF( psLCLDDecoder->c_apauiHuffDecTable_RAM[n] != NULL ) + { + free( psLCLDDecoder->c_apauiHuffDecTable_RAM[n] ); + } + } + } + + IF( psLCLDDecoder->psPredictionDecoder != NULL ) + { + DeletePredictionDecoder_fx( psLCLDDecoder->psPredictionDecoder ); + psLCLDDecoder->psPredictionDecoder = NULL; + } + + IF( psLCLDDecoder->psNoiseGen != NULL ) + { + DeleteNoiseGen( psLCLDDecoder->psNoiseGen ); + } + + free( psLCLDDecoder ); + } + + return; +} + + +/*------------------------------------------------------------------------------------------* + * Local function declarations + * + * + *------------------------------------------------------------------------------------------*/ + +static void ApplyRMSEnvelope_fx( const Word32 iNumBands, const Word32 *piBandwidths, const Word32 iNumGroups, const Word32 *piGroupLengths, Word32 **ppiRMSEnvelope, Word32 **ppfReal_fx, Word32 **ppfImag_fx ); + +static void ReplaceSign_fx( const Word32 iNumBlocks, const Word32 iNumLCLDBands, Word32 **ppiSignReal, Word32 **ppiSignImag, Word32 **ppfReal, Word32 **ppfImag, const Word32 *piBandwidths ); + +static void InvQuantizeSpectrum_fx( const Word32 iNumGroups, const Word32 *piGroupLengths, const Word32 iNumBands, const Word32 *piBandwidths, Word32 **ppiAlloc, Word32 **ppiQReal, Word32 **ppiQImag, Word32 **ppfReal, Word32 **ppfImag, NoiseGen *psNoiseGen ); + +static void InvMSCoding_fx( const Word32 iNumBlocks, const Word32 iNumBands, const Word32 *piBandwidths, const Word32 iMSMode, const Word32 *piMSFlags, const Word32 *piLRPhaseDiffs, const Word32 *piMSPredCoefs, Word32 ***pppfReal, Word32 ***pppfImag ); + +static Word32 ReadHeaderInformation( Word32 *piNumBands, ISAR_SPLIT_REND_BITS_HANDLE pBits ); + +static Word32 ReadMSInformation( const Word32 iNumBands, Word32 *piMSMode, Word32 *piMSFlags, Word32 *piLRPhaseDiffs, Word32 *piMSPredCoefs, ISAR_SPLIT_REND_BITS_HANDLE pBits ); + +static Word32 ReadGroupInformation( const Word32 iChannels, const Word32 iNumBlocks, Word32 *piCommonGrouping, Word32 *piNumGroups, Word32 **ppiGroupLengths, ISAR_SPLIT_REND_BITS_HANDLE pBits ); + +static Word32 ReadHuff( const UWord32 ( *pauiHuffDecTable )[HUFF_DEC_TABLE_SIZE], Word32 *piSymbol, ISAR_SPLIT_REND_BITS_HANDLE pBits ); + +static Word32 ReadRMSEnvelope( const Word32 iChannels, const Word32 *piNumGroups, const Word32 iNumBands, Word32 ***pppiRMSEnvelope, ISAR_SPLIT_REND_BITS_HANDLE pBits ); + +static Word32 ReadAllocInformation( Word32 *piAllocOffset, ISAR_SPLIT_REND_BITS_HANDLE pBits ); + +static Word32 ReadLCLDData_fx( const Word32 *piNumGroups, Word32 **ppiGroupLengths, const Word32 iNumBands, const Word32 iNumChannels, Word32 **ppiDecodingUnresolved, Word32 **ppiPredEnable, const Word32 iNumSubSets, const Word32 iSubSetId, Word32 ***pppiAlloc, Word32 ***pppiSignReal, Word32 ***pppiSignImag, Word32 ***pppiQReal, Word32 ***pppiQImag, Word32 **ppiDecodingFailed, ISAR_SPLIT_REND_BITS_HANDLE pBits, UWord32 ( *c_apauiHuffDecTables[2 * ALLOC_TABLE_SIZE] )[HUFF_DEC_TABLE_SIZE] ); + +static void ComputeAllocation( const Word32 iChannels, const Word32 *piNumGroups, const Word32 iNumBands, Word32 ***pppiSMR, const Word32 iAllocOffset, Word32 ***pppiAlloc ); + + +void SetDecodingUnresolved( + LCLDDecoder *psLCLDDecoder ) +{ + Word32 n, ch; + PredictionDecoder *psPredictionDecoder = psLCLDDecoder->psPredictionDecoder; + + for ( ch = 0; ch < psPredictionDecoder->iChannels; ch++ ) + { + for ( n = 0; n < psPredictionDecoder->iNumSubSets; n++ ) + { + psPredictionDecoder->ppiDecodingUnresolved[ch][n] = 1; + psPredictionDecoder->ppiDecodingFailed[ch][n] = 1; + psPredictionDecoder->ppiDecodingFailedPrev[ch][n] = 1; + } + } + + return; +} + + +Word16 AnyDecodingFailedPrev( + LCLDDecoder *psLCLDDecoder ) +{ + Word32 n, ch; + PredictionDecoder *psPredictionDecoder = psLCLDDecoder->psPredictionDecoder; + + FOR( ch = 0; ch < psPredictionDecoder->iChannels; ch++ ) + { + FOR( n = 0; n < psPredictionDecoder->iNumSubSets; n++ ) + { + if ( psPredictionDecoder->ppiDecodingFailedPrev[ch][n] == 1 ) + { + return 1; + } + } + } + + return 0; +} + + +Word16 AnyDecodingFailed( + LCLDDecoder *psLCLDDecoder ) +{ + Word32 n, ch; + PredictionDecoder *psPredictionDecoder = psLCLDDecoder->psPredictionDecoder; + + FOR( ch = 0; ch < psPredictionDecoder->iChannels; ch++ ) + { + FOR( n = 0; n < psPredictionDecoder->iNumSubSets; n++ ) + { + if ( psPredictionDecoder->ppiDecodingFailed[ch][n] == 1 ) + { + return 1; + } + } + } + + return 0; +} + + +Word32 **GetDecodingFailedStatus( + LCLDDecoder *psLCLDDecoder ) +{ + return psLCLDDecoder->psPredictionDecoder->ppiDecodingFailed; +} + + +Word16 GetNumSubSets( + LCLDDecoder *psLCLDDecoder ) +{ + return (Word16) psLCLDDecoder->psPredictionDecoder->iNumSubSets; +} + + +Word32 **GetDecodingFailedPrevStatus( + LCLDDecoder *psLCLDDecoder ) +{ + return psLCLDDecoder->psPredictionDecoder->ppiDecodingFailedPrev; +} + + +static void UnpackReal_fx( + const Word32 iChannels, + const Word32 iNumBlocks, + Word32 ***pppfReal_fx, + Word32 ***pppfImag_fx ) +{ + Word32 ch, b, n; + + FOR( ch = 0; ch < iChannels; ch++ ) + { + FOR( b = 0; b < LCLD_BANDS; b++ ) + { + Word32 iRealBlock = iNumBlocks - 1; + FOR( n = iNumBlocks / 2 - 1; n >= 0; n-- ) + { + pppfReal_fx[ch][iRealBlock][b] = L_shl( pppfImag_fx[ch][n][b], 1 ); + pppfReal_fx[ch][iRealBlock - 1][b] = L_shl( pppfReal_fx[ch][n][b], 1 ); + pppfImag_fx[ch][iRealBlock][b] = 0; + pppfImag_fx[ch][iRealBlock - 1][b] = 0; + iRealBlock -= 2; + } + } + } + + return; +} + + +/*------------------------------------------------------------------------------------------* + * Function DecodeLCLDFrame() + * + * + *------------------------------------------------------------------------------------------*/ + +Word32 DecodeLCLDFrame( + LCLDDecoder *psLCLDDecoder, + ISAR_SPLIT_REND_BITS_HANDLE pBits, + Word32 ***pppfLCLDReal_fx, + Word32 ***pppfLCLDImag_fx, + Word16 Q_in, + Word16 *Q_out ) +{ + Word32 k, n; + // FILE *ptr = fopen( "cldfb_real.txt", "ab+" ); + // FILE *ptr1 = fopen( "cldfb_imag.txt", "ab+" ); + ReadHeaderInformation( &psLCLDDecoder->iNumBands, pBits ); + + IF( EQ_32( psLCLDDecoder->iChannels, 2 ) ) + { + ReadMSInformation( psLCLDDecoder->iNumBands, &psLCLDDecoder->iMSMode, psLCLDDecoder->piMSFlags, psLCLDDecoder->piLRPhaseDiffs, psLCLDDecoder->piMSPredCoefs, pBits ); + } + + Word16 i, j; + + ReadPredictors_fx( psLCLDDecoder->psPredictionDecoder, pBits ); + + UpdateDecodingUnresolved( psLCLDDecoder->psPredictionDecoder ); + UpdateDecodingFailedStatus( psLCLDDecoder->psPredictionDecoder ); + + ReadGroupInformation( psLCLDDecoder->iChannels, psLCLDDecoder->iNumBlocks, &psLCLDDecoder->iCommonGrouping, psLCLDDecoder->piNumGroups, psLCLDDecoder->ppiGroupLengths, pBits ); + + ReadRMSEnvelope( psLCLDDecoder->iChannels, (const Word32 *) psLCLDDecoder->piNumGroups, psLCLDDecoder->iNumBands, psLCLDDecoder->pppiRMSEnvelope, pBits ); + + ReadAllocInformation( &psLCLDDecoder->iAllocOffset, pBits ); + + IF( EQ_32( psLCLDDecoder->iChannels, 2 ) && EQ_32( psLCLDDecoder->iCommonGrouping, 1 ) ) + { /* MS Mode? */ + FOR( k = 0; k < psLCLDDecoder->piNumGroups[0]; k++ ) + { + PerceptualModelStereo_fx( psLCLDDecoder->iNumBands, psLCLDDecoder->piMSFlags, + psLCLDDecoder->pppiRMSEnvelope[0][k], + psLCLDDecoder->pppiRMSEnvelope[1][k], + psLCLDDecoder->pppiExcitation[0][k], + psLCLDDecoder->pppiExcitation[1][k], + psLCLDDecoder->pppiSMR[0][k], + psLCLDDecoder->pppiSMR[1][k] ); + } + } + ELSE + { + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { /* This will be updated to support multiple sample rates*/ + FOR( k = 0; k < psLCLDDecoder->piNumGroups[n]; k++ ) + { + PerceptualModel_fx( (Word16) psLCLDDecoder->iNumBands, psLCLDDecoder->pppiRMSEnvelope[n][k], psLCLDDecoder->pppiExcitation[n][k], psLCLDDecoder->pppiSMR[n][k] ); + } + } + } + + ComputeAllocation( psLCLDDecoder->iChannels, (const Word32 *) psLCLDDecoder->piNumGroups, psLCLDDecoder->iNumBands, psLCLDDecoder->pppiSMR, psLCLDDecoder->iAllocOffset, psLCLDDecoder->pppiAlloc ); + + ReadLCLDData_fx( + psLCLDDecoder->piNumGroups, + psLCLDDecoder->ppiGroupLengths, + psLCLDDecoder->iNumBands, + psLCLDDecoder->iChannels, + psLCLDDecoder->psPredictionDecoder->ppiDecodingUnresolved, + psLCLDDecoder->psPredictionDecoder->ppiPredBandEnable, + psLCLDDecoder->psPredictionDecoder->iNumSubSets, + psLCLDDecoder->psPredictionDecoder->iSubSetId, + psLCLDDecoder->pppiAlloc, + psLCLDDecoder->pppiLCLDSignReal, + psLCLDDecoder->pppiLCLDSignImag, + psLCLDDecoder->pppiQLCLDReal, + psLCLDDecoder->pppiQLCLDImag, + psLCLDDecoder->psPredictionDecoder->ppiDecodingFailed, + pBits, + psLCLDDecoder->c_apauiHuffDecTable_RAM ); + Word16 q_LCLD = Q_in; + + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + InvQuantizeSpectrum_fx( psLCLDDecoder->piNumGroups[n], + (const Word32 *) psLCLDDecoder->ppiGroupLengths[n], + psLCLDDecoder->iNumBands, psLCLDDecoder->piBandwidths, + psLCLDDecoder->pppiAlloc[n], + psLCLDDecoder->pppiQLCLDReal[n], + psLCLDDecoder->pppiQLCLDImag[n], + pppfLCLDReal_fx[n], pppfLCLDImag_fx[n], + psLCLDDecoder->psNoiseGen ); + + ReplaceSign_fx( psLCLDDecoder->iNumBlocks, psLCLDDecoder->iNumBands, + psLCLDDecoder->pppiLCLDSignReal[n], + psLCLDDecoder->pppiLCLDSignImag[n], + pppfLCLDReal_fx[n], pppfLCLDImag_fx[n], psLCLDDecoder->piBandwidths ); + } +#ifdef DEBUG_WRITE_PREDICTORS + { + static FILE *fid; + if ( !fid ) + fid = fopen( "pred_dec.txt", "wt" ); + for ( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + int16_t b; + for ( b = 0; b < 60; b++ ) + fprintf( fid, "%.5f ", (float) psLCLDDecoder->psPredictionDecoder->ppiPredBandEnable[n][b] * psLCLDDecoder->psPredictionDecoder->ppfA1Imag[n][b] ); + } + fprintf( fid, "%d %d\n", psLCLDDecoder->psPredictionDecoder->iSubSetId, psLCLDDecoder->psPredictionDecoder->piPredChanEnable[n] ); + } +#endif + + ApplyInversePredictors_fx( psLCLDDecoder->psPredictionDecoder, pppfLCLDReal_fx, pppfLCLDImag_fx ); + +#ifdef DEBUG_WRITE + FOR( n = 0; n < psLCLDDecoder->psPredictionDecoder->iChannels; ++n ) + { + FOR( Word16 i = 0; i < psLCLDDecoder->iNumBlocks; i++ ) + { + dbgwrite_txt( pppfLCLDReal[n][i], LCLD_BANDS, "LCLD_real_ApplyInversePredictors_fix.txt", NULL ); + dbgwrite_txt( pppfLCLDImag[n][i], LCLD_BANDS, "LCLD_imag_ApplyInversePredictors_fix.txt", NULL ); + } + } + + FOR( i = 0; i < psLCLDDecoder->psPredictionDecoder->iChannels; ++i ) + { + dbgwrite_txt( psLCLDDecoder->psPredictionDecoder->ppfPredStateReal[i], LCLD_BANDS, "LCLD_Pred_stat_real_ApplyInversePredictors_fix.txt", NULL ); + dbgwrite_txt( psLCLDDecoder->psPredictionDecoder->ppfPredStateImag[i], LCLD_BANDS, "LCLD_Pred_stat_imag_ApplyInversePredictors_fix.txt", NULL ); + } + +#endif + + Word16 Q = 7; + *Q_out = Q; + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + FOR( i = 0; i < psLCLDDecoder->iNumBlocks; i++ ) + { + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + pppfLCLDReal_fx[n][i][j] = L_shl( pppfLCLDReal_fx[n][i][j], Q - q_LCLD ); + pppfLCLDImag_fx[n][i][j] = L_shl( pppfLCLDImag_fx[n][i][j], Q - q_LCLD ); + } + } + ApplyRMSEnvelope_fx( psLCLDDecoder->iNumBands, psLCLDDecoder->piBandwidths, + psLCLDDecoder->piNumGroups[n], + (const Word32 *) psLCLDDecoder->ppiGroupLengths[n], + psLCLDDecoder->pppiRMSEnvelope[n], + pppfLCLDReal_fx[n], pppfLCLDImag_fx[n] ); + } + + IF( EQ_32( psLCLDDecoder->iChannels, 2 ) && GT_32( psLCLDDecoder->iMSMode, 0 ) ) + { + Word16 exp1 = Q31 - *Q_out; + Word16 exp2 = Q31 - *Q_out; + Word32 real_max = 0; + Word32 imag_max = 0; + Word16 exp; + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + FOR( i = 0; i < psLCLDDecoder->iNumBlocks; i++ ) + { + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + real_max = L_max( real_max, L_abs( pppfLCLDReal_fx[n][i][j] ) ); + imag_max = L_max( imag_max, L_abs( pppfLCLDImag_fx[n][i][j] ) ); + } + } + } + IF( NE_32( real_max, 0 ) ) + { + exp1 = s_min( exp1, norm_l( real_max ) ); + } + IF( NE_32( imag_max, 0 ) ) + { + exp2 = s_min( exp2, norm_l( imag_max ) ); + } + IF( NE_32( real_max, 0 ) || NE_32( imag_max, 0 ) ) + { + exp = min( exp2, exp1 ); + *Q_out = add( *Q_out, sub( exp, 3 ) ); + FOR( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + FOR( i = 0; i < psLCLDDecoder->iNumBlocks; i++ ) + { + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + pppfLCLDReal_fx[n][i][j] = L_shl( pppfLCLDReal_fx[n][i][j], exp - 3 ); + pppfLCLDImag_fx[n][i][j] = L_shl( pppfLCLDImag_fx[n][i][j], exp - 3 ); + } + } + } + } + + InvMSCoding_fx( psLCLDDecoder->iNumBlocks, psLCLDDecoder->iNumBands, + psLCLDDecoder->piBandwidths, psLCLDDecoder->iMSMode, + (const Word32 *) psLCLDDecoder->piMSFlags, + (const Word32 *) psLCLDDecoder->piLRPhaseDiffs, + (const Word32 *) psLCLDDecoder->piMSPredCoefs, + pppfLCLDReal_fx, pppfLCLDImag_fx ); + +#ifdef DEBUG_WRITE + for ( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + Word32 pppfLCLDReal_dbg[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 pppfLCLDImag_dbg[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + for ( i = 0; i < psLCLDDecoder->iNumBlocks; i++ ) + { + for ( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + pppfLCLDReal_dbg[n][i][j] = (float) pppfLCLDReal_fx[n][i][j] / ( 1 << ( exp - 3 ) ); + pppfLCLDImag_dbg[n][i][j] = (float) pppfLCLDImag_fx[n][i][j] / ( 1 << ( exp - 3 ) ); + } + } + { + for ( Word16 i = 0; i < psLCLDDecoder->iNumBlocks; i++ ) + { + dbgwrite_txt( pppfLCLDReal_dbg[n][i], CLDFB_NO_CHANNELS_MAX, "LCLD_real_Inv_MS.txt", NULL ); + dbgwrite_txt( pppfLCLDImag_dbg[n][i], CLDFB_NO_CHANNELS_MAX, "LCLD_imag_Inv_MS.txt", NULL ); + } + } + } +#endif + } + + IF( EQ_32( psLCLDDecoder->iRealOnlyOut, 1 ) ) + { + UnpackReal_fx( psLCLDDecoder->iChannels, psLCLDDecoder->iNumBlocks * 2, pppfLCLDReal_fx, pppfLCLDImag_fx ); + } + + return AnyDecodingUnresolved( psLCLDDecoder->psPredictionDecoder ); +} + + +/*------------------------------------------------------------------------------------------* + * Local functions + * + * + *------------------------------------------------------------------------------------------*/ + +static void ApplyRMSEnvelope_fx( + const Word32 iNumBands, + const Word32 *piBandwidths, + const Word32 iNumGroups, + const Word32 *piGroupLengths, + Word32 **ppiRMSEnvelope, + Word32 **ppfReal_fx, + Word32 **ppfImag_fx ) +{ + Word32 b, k, n; + Word32 iBlockOffset, iFBOffset; + + iBlockOffset = 0; + FOR( n = 0; n < iNumGroups; n++ ) + { + FOR( k = 0; k < piGroupLengths[n]; k++ ) + { + iFBOffset = 0; + FOR( b = 0; b < iNumBands; b++ ) + { + Word32 m; + Word32 iRMSEnv; + Word32 fGain_fx; + Word16 fGain_exp; + + iRMSEnv = ppiRMSEnvelope[n][b]; + IF( ( ENV_RECONSTRUCT_TABLE_CENTER + iRMSEnv ) % 2 == 0 ) + { + fGain_fx = 1073741824; // 2 ^ 30 + } + ELSE + { + fGain_fx = 1518500249; // sqrt(2) * 2 ^ 30 + } + fGain_exp = c_afRMSEnvReconstructTable_exp[ENV_RECONSTRUCT_TABLE_CENTER + iRMSEnv]; + FOR( m = 0; m < piBandwidths[b]; m++ ) + { + Word64 tmp; +#ifdef DEBUG + fprintf( fp_real_inp, "%.6f\n", ppfReal[iBlockOffset][iFBOffset] ); + fprintf( fp_imag_inp, "%.6f\n", ppfImag[iBlockOffset][iFBOffset] ); +#endif + +#ifdef DEBUG + fprintf( fp_real, "%.6f\n", ppfReal[iBlockOffset][iFBOffset] ); + fprintf( fp_imag, "%.6f\n", ppfImag[iBlockOffset][iFBOffset] ); +#endif + tmp = W_mult_32_32( fGain_fx, ppfReal_fx[iBlockOffset][iFBOffset] ); + tmp = W_shr( tmp, fGain_exp + 1 ); + ppfReal_fx[iBlockOffset][iFBOffset] = W_extract_l( tmp ); + + tmp = W_mult_32_32( fGain_fx, ppfImag_fx[iBlockOffset][iFBOffset] ); + tmp = W_shr( tmp, fGain_exp + 1 ); + ppfImag_fx[iBlockOffset][iFBOffset] = W_extract_l( tmp ); + +#ifdef DEBUG + fprintf( fp_real_fx, "%.6f\n", (float) ppfReal_fx[iBlockOffset][iFBOffset] / ( 1 << Q ) ); + fprintf( fp_imag_fx, "%.6f\n", (float) ppfImag_fx[iBlockOffset][iFBOffset] / ( 1 << Q ) ); +#endif + + iFBOffset++; + } + } + iBlockOffset++; + } + } + + return; +} + + +static void ReplaceSign_fx( + const Word32 iNumBlocks, + const Word32 iNumLCLDBands, + Word32 **ppiSignReal, + Word32 **ppiSignImag, + Word32 **ppfReal, + Word32 **ppfImag, + const Word32 *piBandwidths ) +{ + Word32 b, n; + Word32 m, idx; + + FOR( n = 0; n < iNumBlocks; n++ ) + { + idx = 0; + move32(); + FOR( b = 0; b < iNumLCLDBands; b++ ) + { + FOR( m = 0; m < piBandwidths[b]; m++ ) + { + IF( EQ_32( ppiSignReal[n][idx], 1 ) ) + { + ppfReal[n][idx] = L_negate( ppfReal[n][idx] ); + move32(); + } + + IF( EQ_32( ppiSignImag[n][idx], 1 ) ) + { + ppfImag[n][idx] = L_negate( ppfImag[n][idx] ); + move32(); + } + idx++; + } + } + } + + return; +} + + +static void InvQuantizeSpectrum_fx( + const Word32 iNumGroups, + const Word32 *piGroupLengths, + const Word32 iNumBands, + const Word32 *piBandwidths, + Word32 **ppiAlloc, + Word32 **ppiQReal, + Word32 **ppiQImag, + Word32 **ppfReal, + Word32 **ppfImag, + NoiseGen *psNoiseGen /* Pass in NULL to switch off noise gen */ +) +{ + Word32 b, k, n; + Word32 iBlockOffest, iFBOffset; + + iBlockOffest = 0; + move32(); + FOR( n = 0; n < iNumGroups; n++ ) + { + FOR( k = 0; k < piGroupLengths[n]; k++ ) + { + iFBOffset = 0; + FOR( b = 0; b < iNumBands; b++ ) + { + Word32 m; + Word32 iAlloc; + Word32 fInvSCFGain; + + iAlloc = ppiAlloc[n][b]; + move32(); + fInvSCFGain = c_afInvScaleFactor_fx[iAlloc]; // Q29 + move32(); + IF( GT_32( iAlloc, 0 ) ) + { + FOR( m = 0; m < piBandwidths[b]; m++ ) + { + Word16 iQuantValue; + + iQuantValue = (Word16) ppiQReal[iBlockOffest][iFBOffset]; + move16(); + ppfReal[iBlockOffest][iFBOffset] = Mpy_32_16_1( fInvSCFGain, iQuantValue ); // Q14 + move32(); + iQuantValue = (Word16) ppiQImag[iBlockOffest][iFBOffset]; + move16(); + ppfImag[iBlockOffest][iFBOffset] = Mpy_32_16_1( fInvSCFGain, iQuantValue ); // Q14 + move32(); + iFBOffset++; + } + } + ELSE IF( psNoiseGen != NULL ) + { + FOR( m = 0; m < piBandwidths[b]; m++ ) + { + ppfReal[iBlockOffest][iFBOffset] = Mpy_32_16_1( GetNoise_fx( psNoiseGen ), 22938 ); // Q(14 + 15 -15 )=Q14 + move32(); + ppfImag[iBlockOffest][iFBOffset] = Mpy_32_16_1( GetNoise_fx( psNoiseGen ), 22938 ); // Q(14+ 15 -15 )=Q14 + move32(); + iFBOffset++; + } + } + ELSE + { + iFBOffset = L_add( iFBOffset, piBandwidths[b] ); + move32(); + } + } + + iBlockOffest++; + } + } + + return; +} + + +static void InvMSCoding_fx( + const Word32 iNumBlocks, + const Word32 iNumBands, + const Word32 *piBandwidths, + const Word32 iMSMode, + const Word32 *piMSFlags, + const Word32 *piLRPhaseDiffs, + const Word32 *piMSPredCoefs, + Word32 ***pppfReal, + Word32 ***pppfImag ) +{ + IF( GT_32( iMSMode, 0 ) ) + { + Word32 b; + Word32 iFBOffset; + Word32 bMSPred = 0; + move32(); + + iFBOffset = 0; + move32(); + FOR( b = 0; b < iNumBands; b++ ) + { + IF( EQ_32( piMSFlags[b], 1 ) ) + { + Word32 n; + Word32 phaseIdx; + Word32 fPred; + + phaseIdx = piLRPhaseDiffs[bMSPred] - PHASE_MIN_VAL; + move32(); + fPred = dequantPred_fx( piMSPredCoefs[bMSPred] ); + move32(); + FOR( n = 0; n < piBandwidths[b]; n++ ) + { + Word32 k; + FOR( k = 0; k < iNumBlocks; k++ ) + { + Word32 fLeftReal; + Word32 fLeftImag; + Word32 fRightReal; + Word32 fRightImag; + + IF( EQ_32( iMSMode, 3 ) ) + { + pppfReal[1][k][iFBOffset] = L_add( pppfReal[1][k][iFBOffset], Mpy_32_32( fPred, pppfReal[0][k][iFBOffset] ) ); + move32(); + pppfImag[1][k][iFBOffset] = L_add( pppfImag[1][k][iFBOffset], Mpy_32_32( fPred, pppfImag[0][k][iFBOffset] ) ); + move32(); + } + + fLeftReal = L_add( pppfReal[0][k][iFBOffset], pppfReal[1][k][iFBOffset] ); + fLeftImag = L_add( pppfImag[0][k][iFBOffset], pppfImag[1][k][iFBOffset] ); + fRightReal = L_sub( pppfReal[0][k][iFBOffset], pppfReal[1][k][iFBOffset] ); + fRightImag = L_sub( pppfImag[0][k][iFBOffset], pppfImag[1][k][iFBOffset] ); + + IF( EQ_32( iMSMode, 3 ) ) + { + cplxmult_fx( &fRightReal, &fRightImag, c_afRotRealImag_fx[phaseIdx][0], -c_afRotRealImag_fx[phaseIdx][1] ); + } + + pppfReal[0][k][iFBOffset] = fLeftReal; + move32(); + pppfReal[1][k][iFBOffset] = fRightReal; + move32(); + pppfImag[0][k][iFBOffset] = fLeftImag; + move32(); + pppfImag[1][k][iFBOffset] = fRightImag; + move32(); + } + iFBOffset++; + } + bMSPred++; + } + ELSE + { + iFBOffset = L_add( iFBOffset, piBandwidths[b] ); + move32(); + } + } + } + + return; +} + + +/* Currently only the number of bands in frame */ +static Word32 ReadHeaderInformation( + Word32 *piNumBands, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word32 iBitsRead; + + iBitsRead = 0; + move32(); + *piNumBands = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 5 ); + iBitsRead = L_add( iBitsRead, 5 ); + + return iBitsRead; +} + + +static Word32 ReadMSInformation( + const Word32 iNumBands, + Word32 *piMSMode, + Word32 *piMSFlags, + Word32 *piLRPhaseDiffs, + Word32 *piMSPredCoefs, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word32 iBitsRead; + + iBitsRead = 0; + move32(); + *piMSMode = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 2 ); + iBitsRead = L_add( iBitsRead, 2 ); + + IF( EQ_32( *piMSMode, 0 ) ) + { + Word32 n; + FOR( n = 0; n < iNumBands; n++ ) + { + piMSFlags[n] = 0; + move32(); + } + } + ELSE IF( EQ_32( *piMSMode, 1 ) ) + { + Word32 n; + FOR( n = 0; n < iNumBands; n++ ) + { + piMSFlags[n] = 1; + move32(); + } + } + ELSE IF( EQ_32( *piMSMode, 2 ) ) + { + Word32 n; + FOR( n = 0; n < iNumBands; n++ ) + { + piMSFlags[n] = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); + move32(); + iBitsRead = L_add( iBitsRead, 1 ); + } + } + ELSE IF( EQ_32( *piMSMode, 3 ) ) + { + Word32 n; + Word32 iMSPredAll; + Word32 iNumMSPredBands = 0; + Word32 anyNonZero; + move32(); + iMSPredAll = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); + iBitsRead = L_add( iBitsRead, 1 ); + IF( iMSPredAll ) + { + iNumMSPredBands = iNumBands; + move32(); + FOR( n = 0; n < iNumBands; n++ ) + { + piMSFlags[n] = 1; + move32(); + } + } + ELSE + { + FOR( n = 0; n < iNumBands; n++ ) + { + piMSFlags[n] = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); + move32(); + iBitsRead = L_add( iBitsRead, 1 ); + IF( piMSFlags[n] ) + { + iNumMSPredBands++; + } + } + } + anyNonZero = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); + IF( anyNonZero ) + { + piLRPhaseDiffs[0] = ISAR_SPLIT_REND_BITStream_read_int32( pBits, PHASE_BAND0_BITS ); + move32(); + piLRPhaseDiffs[0] = L_add( piLRPhaseDiffs[0], PHASE_MIN_VAL ); + move32(); + iBitsRead = L_add( iBitsRead, PHASE_BAND0_BITS ); + FOR( n = 1; n < iNumMSPredBands; n++ ) + { + Word32 tabIdx; + iBitsRead = L_add( iBitsRead, ReadHuff( c_aaiRMSEnvHuffDec, &tabIdx, pBits ) ); + piLRPhaseDiffs[n] = L_add( tabIdx, ENV_DELTA_MIN ); + move32(); + } + DecodePhase( piLRPhaseDiffs, iNumMSPredBands, PHASE_DIFF_DIM ); + } + ELSE + { + FOR( n = 0; n < iNumMSPredBands; n++ ) + { + piLRPhaseDiffs[n] = 0; + move32(); + } + } + anyNonZero = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); + IF( anyNonZero ) + { + piMSPredCoefs[0] = ISAR_SPLIT_REND_BITStream_read_int32( pBits, PRED_BAND0_BITS ); + move32(); + piMSPredCoefs[0] = L_add( piMSPredCoefs[0], PRED_MIN_VAL ); + move32(); + iBitsRead = L_add( iBitsRead, PRED_BAND0_BITS ); + FOR( n = 1; n < iNumMSPredBands; n++ ) + { + Word32 tabIdx; + iBitsRead = L_add( iBitsRead, ReadHuff( c_aaiRMSEnvHuffDec, &tabIdx, pBits ) ); + piMSPredCoefs[n] = L_add( tabIdx, ENV_DELTA_MIN ); + move32(); + } + DecodePredCoef( piMSPredCoefs, iNumMSPredBands ); + } + ELSE + { + FOR( n = 0; n < iNumMSPredBands; n++ ) + { + piMSPredCoefs[n] = 0; + move32(); + } + } +#ifdef DEBUG_WRITE_MS_PRED + { + static FILE *fid; + IF( !fid ) + fid = fopen( "ms_pred_dec.txt", "wt" ); + writeMSPred( piLRPhaseDiffs, piMSPredCoefs, *piMSMode, iNumMSPredBands, iNumBands, fid, piMSFlags ); + } +#endif + } + ELSE + { + printf( "ERROR UNSUPPORTED MS MODE\n" ); + } + + return iBitsRead; +} + + +static Word32 ReadGroupInformation( + const Word32 iChannels, + const Word32 iNumBlocks, + Word32 *piCommonGrouping, + Word32 *piNumGroups, + Word32 **ppiGroupLengths, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word32 c, k, iBitsRead; + + iBitsRead = 0; + move32(); + IF( EQ_32( iChannels, 2 ) ) + { + *piCommonGrouping = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); + move32(); + iBitsRead = L_add( iBitsRead, 1 ); + + IF( EQ_32( *piCommonGrouping, 1 ) ) + { + piNumGroups[0] = 0; + move32(); + ppiGroupLengths[0][piNumGroups[0]] = 1; + move32(); + FOR( k = 0; k < L_sub( iNumBlocks, 1 ); k++ ) + { + Word32 iGroupStart; + + iGroupStart = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); + iBitsRead = L_add( iBitsRead, 1 ); + + IF( EQ_32( iGroupStart, 1 ) ) + { + piNumGroups[0] = L_add( piNumGroups[0], 1 ); + move32(); + ppiGroupLengths[0][piNumGroups[0]] = 1; + move32(); + } + ELSE + { + ppiGroupLengths[0][piNumGroups[0]] = L_add( ppiGroupLengths[0][piNumGroups[0]], 1 ); + move32(); + } + } + piNumGroups[0] = L_add( piNumGroups[0], 1 ); + move32(); + + piNumGroups[1] = piNumGroups[0]; + move32(); + FOR( k = 0; k < piNumGroups[1]; k++ ) + { + ppiGroupLengths[1][k] = ppiGroupLengths[0][k]; + move32(); + } + } + ELSE + { + FOR( c = 0; c < iChannels; c++ ) + { + piNumGroups[c] = 0; + move32(); + ppiGroupLengths[c][piNumGroups[c]] = 1; + move32(); + FOR( k = 0; k < L_sub( iNumBlocks, 1 ); k++ ) + { + Word32 iGroupStart; + + iGroupStart = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); + iBitsRead = L_add( iBitsRead, 1 ); + + IF( EQ_32( iGroupStart, 1 ) ) + { + piNumGroups[c] = L_add( piNumGroups[c], 1 ); + move32(); + ppiGroupLengths[c][piNumGroups[c]] = 1; + move32(); + } + ELSE + { + ppiGroupLengths[c][piNumGroups[c]] = L_add( ppiGroupLengths[c][piNumGroups[c]], 1 ); + move32(); + } + } + piNumGroups[c] = L_add( piNumGroups[c], 1 ); + move32(); + } + } + } + ELSE + { + FOR( c = 0; c < iChannels; c++ ) + { + piNumGroups[c] = 0; + move32(); + ppiGroupLengths[c][piNumGroups[c]] = 1; + move32(); + FOR( k = 0; k < L_sub( iNumBlocks, 1 ); k++ ) + { + Word32 iGroupStart; + + iGroupStart = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); + iBitsRead = L_add( iBitsRead, 1 ); + + IF( EQ_32( iGroupStart, 1 ) ) + { + piNumGroups[c] = L_add( piNumGroups[c], 1 ); + move32(); + ppiGroupLengths[c][piNumGroups[c]] = 1; + move32(); + } + ELSE + { + ppiGroupLengths[c][piNumGroups[c]] = L_add( ppiGroupLengths[c][piNumGroups[c]], 1 ); + } + } + piNumGroups[c] = L_add( piNumGroups[c], 1 ); + } + } + + return iBitsRead; +} + + +static Word32 BSForceBack( + ISAR_SPLIT_REND_BITS_HANDLE pBits, + Word32 iValue, + Word32 iBitCount ) +{ + pBits->bits_read = L_sub( pBits->bits_read, iBitCount ); + + return ( L_shr( iValue, (Word16) iBitCount ) ); +} + + +static Word32 ReadHuff( + const UWord32 ( *pauiHuffDecTable )[HUFF_DEC_TABLE_SIZE], + Word32 *piSymbol, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word32 iBitsRead; + Word32 iSymbol; + Word32 iIndex; + Word32 iVal; + + iVal = 0; + move32(); + iIndex = 0; + move32(); + iSymbol = 0xFFFF; + move32(); + iBitsRead = 0; + move32(); + WHILE( iSymbol == 0xFFFF ) + { + iIndex = ISAR_SPLIT_REND_BITStream_read_int32( pBits, HUFF_READ_SIZE ); + iBitsRead = L_add( iBitsRead, HUFF_READ_SIZE ); + + iIndex = pauiHuffDecTable[iVal][iIndex]; + iSymbol = ( L_and( iIndex, 0xFFFF ) ); + + iVal = ( L_shr( iIndex, 16 ) ); + } + + IF( iVal ) + { + BSForceBack( pBits, iIndex, iVal ); + iBitsRead = L_sub( iBitsRead, iVal ); + } + + *piSymbol = iSymbol; + move32(); + + return iBitsRead; +} + + +static Word32 ReadRMSEnvelope( + const Word32 iChannels, + const Word32 *piNumGroups, + const Word32 iNumBands, + Word32 ***pppiRMSEnvelope, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word32 b, k, n; + Word32 iBitsRead, iLastRMSVal; + + iBitsRead = 0; + move32(); + FOR( n = 0; n < iChannels; n++ ) + { + FOR( k = 0; k < piNumGroups[n]; k++ ) + { + iLastRMSVal = ISAR_SPLIT_REND_BITStream_read_int32( pBits, ENV0_BITS ); + iBitsRead = L_add( iBitsRead, ENV0_BITS ); + + iLastRMSVal = L_add( iLastRMSVal, ENV_MIN ); + pppiRMSEnvelope[n][k][0] = iLastRMSVal; + move32(); + FOR( b = 1; b < iNumBands; b++ ) + { + Word32 iDelta; + + iBitsRead = L_add( iBitsRead, ReadHuff( c_aaiRMSEnvHuffDec, &iDelta, pBits ) ); + + iDelta = L_add( iDelta, ENV_DELTA_MIN ); + iLastRMSVal = L_add( iDelta, iLastRMSVal ); + pppiRMSEnvelope[n][k][b] = iLastRMSVal; + move32(); + } + } + } + + return iBitsRead; +} + + +static Word32 ReadAllocInformation( + Word32 *piAllocOffset, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word32 iBitsRead; + + iBitsRead = 0; + move32(); + *piAllocOffset = ISAR_SPLIT_REND_BITStream_read_int32( pBits, ALLOC_OFFSET_BITS ); + *piAllocOffset = L_add( *piAllocOffset, MIN_ALLOC_OFFSET ); + iBitsRead = L_add( iBitsRead, ALLOC_OFFSET_BITS ); + + return iBitsRead; +} + + +static Word32 ReadLCLDData_fx( + const Word32 *piNumGroups, + Word32 **ppiGroupLengths, + const Word32 iNumBands, + const Word32 iNumChannels, + Word32 **ppiDecodingUnresolved, + Word32 **ppiPredEnable, + const Word32 iNumSubSets, + const Word32 iSubSetId, + Word32 ***pppiAlloc, + Word32 ***pppiSignReal, + Word32 ***pppiSignImag, + Word32 ***pppiQReal, + Word32 ***pppiQImag, + Word32 **ppiDecodingFailed, + ISAR_SPLIT_REND_BITS_HANDLE pBits, + UWord32 ( *c_apauiHuffDecTables[2 * ALLOC_TABLE_SIZE] )[HUFF_DEC_TABLE_SIZE] ) +{ + Word32 iBitsRead; + Word32 iDecodingStopped = 0; + Word32 iNumLcldBands = c_aiNumLcldBandsPerBand[iNumBands - 1]; + Word32 s; + Word32 iSet = iSubSetId; + Word16 tmp, tmp_e; + iBitsRead = 0; + for ( s = 0; s < iNumSubSets; s++, iSet-- ) + { + Word32 ch; + + IF( LT_32( iSet, 0 ) ) + { + iSet = L_sub( iNumSubSets, 1 ); + } + + FOR( ch = 0; ch < iNumChannels; ch++ ) + { + Word32 n; + Word32 iBlockOffest; + + IF( EQ_32( ppiDecodingUnresolved[ch][iSet], 1 ) ) + { + iDecodingStopped = 1; + ppiDecodingFailed[ch][iSet] = 1; /* mark as not decoded (is also initialized like that when a frame is lost */ + } + ELSE + { + ppiDecodingFailed[ch][iSet] = 0; /* mark as correctly decoded */ + } + iBlockOffest = 0; + FOR( n = 0; n < piNumGroups[ch]; n++ ) + { + Word32 k; + FOR( k = 0; k < ppiGroupLengths[ch][n]; k++ ) + { + Word32 iFBOffset; + + FOR( iFBOffset = iSet; iFBOffset < iNumLcldBands; iFBOffset += iNumSubSets ) + { + Word32 b; + Word32 iAlloc; + Word32 iHuffDim; + Word32 iHuffMod; + + b = c_aiBandIdPerLcldBand[iFBOffset]; + + iAlloc = pppiAlloc[ch][n][b]; + + iHuffDim = c_aiHuffmanDim_fx[iAlloc]; + iHuffMod = c_aiHuffmanMod_fx[iAlloc]; + + IF( EQ_32( iDecodingStopped, 1 ) ) + { + pppiQReal[ch][iBlockOffest][iFBOffset] = 0; + pppiQImag[ch][iBlockOffest][iFBOffset] = 0; + pppiSignReal[ch][iBlockOffest][iFBOffset] = 0; + pppiSignImag[ch][iBlockOffest][iFBOffset] = 0; + } + ELSE IF( GT_32( iAlloc, 0 ) ) + { + const UWord32( *pauiHuffmanTable )[HUFF_DEC_TABLE_SIZE] = NULL; + const UWord32( *pauiHuffmanTableDPCM )[HUFF_DEC_TABLE_SIZE] = NULL; + Word32 iQuantValue1 = 0; + Word32 iQuantValue2 = 0; +#ifdef USE_DEMOD_TABLES + const Word32( *paiDemodTable )[2] = NULL; +#endif +#define WMC_TOOL_SKIP + pauiHuffmanTable = (const UWord32( * )[HUFF_DEC_TABLE_SIZE]) c_apauiHuffDecTables[iAlloc]; + pauiHuffmanTableDPCM = (const UWord32( * )[HUFF_DEC_TABLE_SIZE]) c_apauiHuffDecTables[ALLOC_TABLE_SIZE + iAlloc]; +#undef WMC_TOOL_SKIP +#ifdef USE_DEMOD_TABLES + paiDemodTable = c_apaiDemodTables[iAlloc]; +#endif +#ifdef LCLD_HANDLE_PRED_START_SAMPLE + if ( ppiPredEnable[ch][iFBOffset] == 1 && ( iBlockOffest > 0 || iSet != iSubSetId ) ) +#else + IF( EQ_32( ppiPredEnable[ch][iFBOffset], 1 ) ) +#endif + { + IF( EQ_32( iHuffDim, 2 ) ) + { + Word32 iSymbol; + iBitsRead = L_add( iBitsRead, ReadHuff( pauiHuffmanTableDPCM, &iSymbol, pBits ) ); +#ifdef USE_DEMOD_TABLES + iQuantValue1 = paiDemodTable[iSymbol][0]; + iQuantValue2 = paiDemodTable[iSymbol][1]; +#else + tmp = BASOP_Util_Divide1616_Scale( (Word16) iSymbol, (Word16) iHuffMod, &tmp_e ); + iQuantValue1 = L_deposit_l( shr( tmp, add( 15, negate( tmp_e ) ) ) ); + // iQuantValue1 = iSymbol / iHuffMod; + iQuantValue2 = iSymbol % iHuffMod; +#endif + } + ELSE + { + iBitsRead = L_add( iBitsRead, ReadHuff( pauiHuffmanTableDPCM, &iQuantValue1, pBits ) ); + iBitsRead = L_add( iBitsRead, ReadHuff( pauiHuffmanTableDPCM, &iQuantValue2, pBits ) ); + } + } + ELSE + { + IF( EQ_32( iHuffDim, 2 ) ) + { + Word32 iSymbol; + + iBitsRead = L_add( iBitsRead, ReadHuff( pauiHuffmanTable, &iSymbol, pBits ) ); +#ifdef USE_DEMOD_TABLES + iQuantValue1 = paiDemodTable[iSymbol][0]; + iQuantValue2 = paiDemodTable[iSymbol][1]; +#else + tmp = BASOP_Util_Divide1616_Scale( (Word16) iSymbol, (Word16) iHuffMod, &tmp_e ); + iQuantValue1 = L_deposit_l( shr( tmp, add( 15, negate( tmp_e ) ) ) ); + iQuantValue2 = iSymbol % iHuffMod; +#endif + } + ELSE + { + iBitsRead = L_add( iBitsRead, ReadHuff( pauiHuffmanTable, &iQuantValue1, pBits ) ); + move32(); + iBitsRead = L_add( iBitsRead, ReadHuff( pauiHuffmanTable, &iQuantValue2, pBits ) ); + move32(); + /*iBitsRead += ReadHuff( pauiHuffmanTable, &iQuantValue1, pBits ); + iBitsRead += ReadHuff( pauiHuffmanTable, &iQuantValue2, pBits );*/ + } + } + + pppiQReal[ch][iBlockOffest][iFBOffset] = iQuantValue1; + move32(); + pppiQImag[ch][iBlockOffest][iFBOffset] = iQuantValue2; + move32(); + IF( GT_32( iQuantValue1, 0 ) ) + { + pppiSignReal[ch][iBlockOffest][iFBOffset] = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); + move32(); + iBitsRead = L_add( iBitsRead, 1 ); + move32(); + } + ELSE + { + pppiSignReal[ch][iBlockOffest][iFBOffset] = 0; + } + IF( GT_32( iQuantValue2, 0 ) ) + { + pppiSignImag[ch][iBlockOffest][iFBOffset] = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); + move32(); + iBitsRead = L_add( iBitsRead, 1 ); + move32(); + } + ELSE + { + pppiSignImag[ch][iBlockOffest][iFBOffset] = 0; + } + } + ELSE + { + pppiSignReal[ch][iBlockOffest][iFBOffset] = 0; + move32(); + pppiSignImag[ch][iBlockOffest][iFBOffset] = 0; + move32(); + } + } + iBlockOffest++; + } + } + } + } + + return iBitsRead; +} + + +static void ComputeAllocation( + const Word32 iChannels, + const Word32 *piNumGroups, + const Word32 iNumBands, + Word32 ***pppiSMR, + const Word32 iAllocOffset, + Word32 ***pppiAlloc ) +{ + Word32 b, k, n, iAlloc; + + FOR( n = 0; n < iChannels; n++ ) + { + FOR( k = 0; k < piNumGroups[n]; k++ ) + { + FOR( b = 0; b < iNumBands; b++ ) + { + iAlloc = L_shr( L_add( pppiSMR[n][k][b], L_mult0( (Word16) iAllocOffset, ALLOC_OFFSET_SCALE ) ), 5 ); + iAlloc = ( iAlloc > MIN_ALLOC ) ? iAlloc : MIN_ALLOC; + iAlloc = ( iAlloc < MAX_ALLOC ) ? iAlloc : MAX_ALLOC; + pppiAlloc[n][k][b] = iAlloc; + move32(); + } + } + } + + return; +} diff --git a/lib_isar/isar_lcld_encoder.c b/lib_isar/isar_lcld_encoder.c new file mode 100644 index 0000000000000000000000000000000000000000..915e2a5e493fcba3e3ca3f860c64c9a937e6fcd3 --- /dev/null +++ b/lib_isar/isar_lcld_encoder.c @@ -0,0 +1,2141 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include +#include "isar_lcld_prot.h" +#include "isar_rom_lcld_tables.h" +#include "prot_fx.h" +#include "prot_fx.h" +#include "isar_prot.h" +#include "wmc_auto.h" +#include "basop_util.h" +#include "enh64.h" +#include "basop32.h" + +#define LOG10_2_FX ( 646456993 ) +/*------------------------------------------------------------------------------------------* + * Local structures + *------------------------------------------------------------------------------------------*/ +struct LCLD_ENCODER +{ + Word32 iSampleRate; + Word32 iChannels; + Word32 iNumBlocks; + + Word32 iTargetBitRate; + + Word32 iNumBands; + const Word32 *piBandwidths; + + Word32 iMSMode; + Word32 *piMSFlags; + Word32 piMSPredCoefs[MAX_BANDS]; + Word32 piLRPhaseDiffs[MAX_BANDS]; + Word32 iAllowSidePred; + + Word32 iRealOnlyOut; + + RMSEnvelopeGrouping *psRMSEnvelopeGrouping; + + Word32 iCommonGrouping; + Word32 *piNumGroups; + Word32 **ppiGroupLengths; + + Word32 ***pppiRMSEnvelope; + Word32 ***pppiSMR; + Word32 ***pppiExcitation; + Word32 ***pppiAlloc; + + Word32 iAllocOffset; + + Word32 ***pppiLCLDSignReal; + Word32 ***pppiLCLDSignImag; + Word32 ***pppiQLCLDReal; + Word32 ***pppiQLCLDImag; + + + PredictionEncoder *psPredictionEncoder; +}; +/*------------------------------------------------------------------------------------------* + * Function Quantize() + * + * + *------------------------------------------------------------------------------------------*/ +static Word32 Quantize_fx( + const Word32 fVal_fx, + const Word32 fScale_fx, + Word32 *iSign, + const Word32 iMaxVal ) +{ + Word32 iVal_fx; + IF( GT_32( fVal_fx, 0 ) ) + { + iVal_fx = (Word32) L_add( Mpy_32_32( fScale_fx, fVal_fx ), ONE_IN_Q20 ); + *iSign = 0; + } + ELSE + { + iVal_fx = (Word32) L_add( Mpy_32_32( -fScale_fx, fVal_fx ), ONE_IN_Q20 ); + *iSign = 1; + } + iVal_fx = ( iVal_fx < iMaxVal ) ? iVal_fx : iMaxVal; + + return iVal_fx; +} +/*------------------------------------------------------------------------------------------* + * Function UnQuantize() + * + * + *------------------------------------------------------------------------------------------*/ +static Word32 UnQuantize_fx( + const Word32 iVal_fx, + const Word32 fScale_fx, + const Word32 iSign ) +{ + + Word32 fVal_fx; + IF( EQ_32( iSign, 0 ) ) + { + fVal_fx = Mpy_32_32( fScale_fx, iVal_fx ); // Q19 + } + ELSE + { + fVal_fx = Mpy_32_32( -fScale_fx, iVal_fx ); // Q19 + } + return fVal_fx; +} +static void PackReal( + const Word32 iChannels, + const Word32 iNumBlocks, + Word32 ***pppfReal, + Word32 ***pppfImag ) +{ + Word32 ch, b, n; + FOR( ch = 0; ch < iChannels; ch++ ) + { + FOR( b = 0; b < LCLD_BANDS; b++ ) + { + Word32 iRealBlock = 0; + move32(); + FOR( n = 0; n < iNumBlocks; n += 2 ) + { + pppfImag[ch][iRealBlock][b] = pppfReal[ch][n + 1][b]; + move32(); + pppfReal[ch][iRealBlock][b] = pppfReal[ch][n][b]; + move32(); + iRealBlock++; + } + } + } +} +/*------------------------------------------------------------------------------------------* + * Function CreateLCLDEncoder() + * + * + *------------------------------------------------------------------------------------------*/ + +ivas_error CreateLCLDEncoder( + LCLDEncoder **psLCLDEncoder_out, + const Word32 iSampleRate, + const Word32 iChannels, + const Word32 iTargetBitRate, + const Word32 iAllowSidePred, + const Word16 iNumBlocks, + const Word16 iNumSubSets, + const Word32 iRealOnlyOut ) +{ + Word32 n; + LCLDEncoder *psLCLDEncoder; + ivas_error error; + Word32 iMaxNumPredBands = 0; + move32(); + + assert( iSampleRate == 48000 ); // Fix + assert( iNumBlocks == 16 || iNumBlocks == 8 || iNumBlocks == 4 ); + assert( iNumSubSets > 0 && iNumSubSets <= LCLD_MAX_NUM_PRED_SUBSETS ); + + IF( ( psLCLDEncoder = (LCLDEncoder *) malloc( sizeof( LCLDEncoder ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + psLCLDEncoder->iSampleRate = iSampleRate; + move32(); + psLCLDEncoder->iChannels = iChannels; + move32(); + psLCLDEncoder->iRealOnlyOut = iRealOnlyOut; + move32(); + psLCLDEncoder->iAllocOffset = 0; + move32(); + + psLCLDEncoder->iTargetBitRate = iTargetBitRate; + move32(); + + psLCLDEncoder->piBandwidths = c_aiBandwidths48; + psLCLDEncoder->iNumBands = DEF_BANDS_48; /* 22 bands = 50 CLDFB bands (rather than 23 bands) */ + move32(); + iMaxNumPredBands = L_min( c_aiNumLcldBandsPerBand[psLCLDEncoder->iNumBands - 1], 50 ); + IF( EQ_32( iRealOnlyOut, 1 ) ) + { + iMaxNumPredBands = 0; + move32(); + assert( iNumSubSets == 1 ); + psLCLDEncoder->iNumBlocks = L_deposit_l( shr( iNumBlocks, 1 ) ); + } + ELSE + { + psLCLDEncoder->iNumBlocks = iNumBlocks; + move32(); + } + + psLCLDEncoder->iMSMode = 0; + move32(); + IF( ( psLCLDEncoder->piMSFlags = (Word32 *) malloc( MAX_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + FOR( n = 0; n < MAX_BANDS; n++ ) + { + psLCLDEncoder->piLRPhaseDiffs[n] = 0; + move32(); + psLCLDEncoder->piMSPredCoefs[n] = 0; + move32(); + } + psLCLDEncoder->iAllowSidePred = iAllowSidePred; + move32(); + + psLCLDEncoder->psRMSEnvelopeGrouping = CreateRMSEnvelopeGrouping( psLCLDEncoder->iNumBlocks ); + + psLCLDEncoder->iCommonGrouping = 1; //*Common grouping always on only impacts stereo */ + move32(); + IF( ( psLCLDEncoder->piNumGroups = (Word32 *) malloc( psLCLDEncoder->iChannels * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->ppiGroupLengths = (Word32 **) malloc( psLCLDEncoder->iChannels * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiRMSEnvelope = (Word32 ***) malloc( psLCLDEncoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiSMR = (Word32 ***) malloc( psLCLDEncoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiExcitation = (Word32 ***) malloc( psLCLDEncoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiAlloc = (Word32 ***) malloc( psLCLDEncoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + + IF( ( psLCLDEncoder->pppiLCLDSignReal = (Word32 ***) malloc( psLCLDEncoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiLCLDSignImag = (Word32 ***) malloc( psLCLDEncoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiQLCLDReal = (Word32 ***) malloc( psLCLDEncoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiQLCLDImag = (Word32 ***) malloc( psLCLDEncoder->iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + + FOR( n = 0; n < iChannels; n++ ) + { + Word32 k; + IF( ( psLCLDEncoder->ppiGroupLengths[n] = (Word32 *) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiRMSEnvelope[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiSMR[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiExcitation[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiAlloc[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + + IF( ( psLCLDEncoder->pppiLCLDSignReal[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiLCLDSignImag[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiQLCLDReal[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiQLCLDImag[n] = (Word32 **) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + IF( ( psLCLDEncoder->pppiRMSEnvelope[n][k] = (Word32 *) malloc( MAX_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiSMR[n][k] = (Word32 *) malloc( MAX_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiExcitation[n][k] = (Word32 *) malloc( MAX_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiAlloc[n][k] = (Word32 *) malloc( MAX_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + + IF( ( psLCLDEncoder->pppiLCLDSignReal[n][k] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiLCLDSignImag[n][k] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiQLCLDReal[n][k] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + IF( ( psLCLDEncoder->pppiQLCLDImag[n][k] = (Word32 *) malloc( LCLD_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + } + } + + IF( ( error = CreatePredictionEncoder_fx( &( psLCLDEncoder->psPredictionEncoder ), iChannels, psLCLDEncoder->iNumBlocks, L_deposit_l( iNumSubSets ), iMaxNumPredBands ) ) != IVAS_ERR_OK ) + { + return error; + } + + *psLCLDEncoder_out = psLCLDEncoder; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------------------------* + * Function DeleteLCLDEncoder() + * + * + *------------------------------------------------------------------------------------------*/ + +void DeleteLCLDEncoder( + LCLDEncoder *psLCLDEncoder ) +{ + Word32 k, n; + + IF( psLCLDEncoder != NULL ) + { + + IF( psLCLDEncoder->piMSFlags != NULL ) + { + free( psLCLDEncoder->piMSFlags ); + } + + IF( psLCLDEncoder->piNumGroups != NULL ) + { + free( psLCLDEncoder->piNumGroups ); + } + + IF( psLCLDEncoder->psRMSEnvelopeGrouping != NULL ) + { + DeleteRMSEnvelopeGrouping( psLCLDEncoder->psRMSEnvelopeGrouping ); + } + + IF( psLCLDEncoder->ppiGroupLengths != NULL ) + { + FOR( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + free( psLCLDEncoder->ppiGroupLengths[n] ); + } + free( psLCLDEncoder->ppiGroupLengths ); + } + IF( psLCLDEncoder->pppiRMSEnvelope != NULL ) + { + FOR( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDEncoder->pppiRMSEnvelope[n][k] ); + } + free( psLCLDEncoder->pppiRMSEnvelope[n] ); + } + free( psLCLDEncoder->pppiRMSEnvelope ); + } + + IF( psLCLDEncoder->pppiSMR != NULL ) + { + FOR( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDEncoder->pppiSMR[n][k] ); + } + free( psLCLDEncoder->pppiSMR[n] ); + } + free( psLCLDEncoder->pppiSMR ); + } + + IF( psLCLDEncoder->pppiExcitation != NULL ) + { + FOR( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDEncoder->pppiExcitation[n][k] ); + } + free( psLCLDEncoder->pppiExcitation[n] ); + } + free( psLCLDEncoder->pppiExcitation ); + } + + IF( psLCLDEncoder->pppiAlloc != NULL ) + { + FOR( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDEncoder->pppiAlloc[n][k] ); + } + free( psLCLDEncoder->pppiAlloc[n] ); + } + free( psLCLDEncoder->pppiAlloc ); + } + + IF( psLCLDEncoder->pppiLCLDSignReal != NULL ) + { + FOR( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDEncoder->pppiLCLDSignReal[n][k] ); + } + free( psLCLDEncoder->pppiLCLDSignReal[n] ); + } + free( psLCLDEncoder->pppiLCLDSignReal ); + } + + IF( psLCLDEncoder->pppiLCLDSignImag != NULL ) + { + FOR( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDEncoder->pppiLCLDSignImag[n][k] ); + } + free( psLCLDEncoder->pppiLCLDSignImag[n] ); + } + free( psLCLDEncoder->pppiLCLDSignImag ); + } + + IF( psLCLDEncoder->pppiQLCLDReal != NULL ) + { + FOR( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDEncoder->pppiQLCLDReal[n][k] ); + } + free( psLCLDEncoder->pppiQLCLDReal[n] ); + } + free( psLCLDEncoder->pppiQLCLDReal ); + } + + IF( psLCLDEncoder->pppiQLCLDImag != NULL ) + { + FOR( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + FOR( k = 0; k < LCLD_BLOCKS_PER_FRAME; k++ ) + { + free( psLCLDEncoder->pppiQLCLDImag[n][k] ); + } + free( psLCLDEncoder->pppiQLCLDImag[n] ); + } + free( psLCLDEncoder->pppiQLCLDImag ); + } + + DeletePredictionEncoder_fx( psLCLDEncoder->psPredictionEncoder ); + free( psLCLDEncoder ); + } + + return; +} + +/*------------------------------------------------------------------------------------------* + * Local function declarations + *------------------------------------------------------------------------------------------*/ + +static Word32 MSModeCalculation_fx( const Word32 iNumBlocks, const Word32 iNumBands, const Word32 *piBandwidths, Word32 ***pppfReal_fx, Word32 ***pppfImag_fx, Word16 Q_in, Word32 *piMSMode, Word32 *piLRPhaseDiff, Word32 *piMSPredCoef, const Word32 iAllowSidePred, const Word32 iRealOnlyOut, Word32 *piMSFlags ); +static void RemoveRMSEnvelope( const Word32 iNumBands, const Word32 *piBandwidths, const Word32 iNumGroups, const Word32 *piGroupLengths, Word32 **ppiRMSEnvelope, Word32 **ppfReal_fx, Word32 **ppfImag_fx ); +static Word32 CountLCLDBits( const Word32 iNumGroups, const Word32 *piGroupLengths, const Word32 iNumBands, const Word32 *piBandwidths, const Word32 *piPredEnable, Word32 **ppiAlloc, Word32 **ppiQReal, Word32 **ppiQImag ); + +static Word32 WriteHeaderInformation( const Word32 iNumBands, ISAR_SPLIT_REND_BITS_HANDLE pBits ); + +static Word32 WriteMSInformation( const Word32 iNumBands, const Word32 iMSMode, const Word32 *piMSFlags, const Word32 *piLRPhaseDiff, const Word32 *piMSPredCoef, Word32 iNumMSPredBands, ISAR_SPLIT_REND_BITS_HANDLE pBits ); + +static Word32 WriteGroupInformation( const Word32 iChannels, const Word32 iCommonGrouping, const Word32 *piNumGroups, Word32 **ppiGroupLengths, ISAR_SPLIT_REND_BITS_HANDLE pBits ); + +static Word32 WriteRMSEnvelope( const Word32 iChannels, const Word32 *piNumGroups, const Word32 iNumBands, Word32 ***pppiRMSEnvelope, ISAR_SPLIT_REND_BITS_HANDLE pBits ); + +static Word32 WriteAllocInformation( const Word32 iAllocOffset, ISAR_SPLIT_REND_BITS_HANDLE pBits ); + +static Word32 WriteLCLDData( const Word32 *piNumGroups, Word32 **ppiGroupLengths, const Word32 iNumBands, const Word32 iNumChannels, Word32 **ppiPredEnable, const Word32 iNumSubSets, const Word32 iSubSetId, Word32 ***pppiAlloc, Word32 ***pppiSignReal, Word32 ***pppiSignImag, Word32 ***pppiQReal, Word32 ***pppiQImag, ISAR_SPLIT_REND_BITS_HANDLE pBits ); +static Word32 ComputeAllocation( const Word32 iChannels, const Word32 *piNumGroups, Word32 **ppiGroupLengths, const Word32 iNumBands, const Word32 *piBandwidths, Word32 ***pppfReal_fx, Word32 ***pppfImag_fx, Word16 q_final, Word32 ***pppiSMR, const Word32 iAvailableBits, Word32 *piAllocOffset, Word32 ***pppiAlloc, Word32 ***pppiQReal, Word32 ***pppiQImag, Word32 ***pppiSignReal, Word32 ***pppiSignImag, PredictionEncoder *psPredictionEncoder ); +/*------------------------------------------------------------------------------------------* + * Function EncodeLCLDFrame() + * + * + *------------------------------------------------------------------------------------------*/ +Word32 EncodeLCLDFrame( + LCLDEncoder *psLCLDEncoder, + Word32 ***pppfLCLDReal_fx, + Word32 ***pppfLCLDImag_fx, + Word32 *piBitsWritten, + const Word32 available_bits, + ISAR_SPLIT_REND_BITS_HANDLE pBits, + Word16 *q_final ) +{ + Word32 n; + Word32 iAvailableBits, iBitsWritten; + Word32 iNumMSBands = 0; + Word32 iAudioBitsWritten; + + iAvailableBits = available_bits; // HCBR for now + iBitsWritten = 0; + assert( available_bits <= pBits->buf_len * 8 ); + IF( EQ_32( psLCLDEncoder->iRealOnlyOut, 1 ) ) + { + PackReal( psLCLDEncoder->iChannels, psLCLDEncoder->iNumBlocks * 2, pppfLCLDReal_fx, pppfLCLDImag_fx ); + } + /* Do MS calc here */ + IF( EQ_32( psLCLDEncoder->iChannels, 2 ) ) + { + iNumMSBands = MSModeCalculation_fx( psLCLDEncoder->iNumBlocks, + psLCLDEncoder->iNumBands, + psLCLDEncoder->piBandwidths, + pppfLCLDReal_fx, + pppfLCLDImag_fx, + *q_final, + &psLCLDEncoder->iMSMode, + psLCLDEncoder->piLRPhaseDiffs, + psLCLDEncoder->piMSPredCoefs, + psLCLDEncoder->iAllowSidePred, + psLCLDEncoder->iRealOnlyOut, + psLCLDEncoder->piMSFlags ); + IF( GT_32( psLCLDEncoder->iMSMode, 0 ) ) + { + psLCLDEncoder->iCommonGrouping = 1; // Make sure common grouping is enabled when MS is in use + } + } + /* Compute Grouping and RMS Envelopes */ + IF( EQ_32( psLCLDEncoder->iChannels, 2 ) && EQ_32( psLCLDEncoder->iCommonGrouping, 1 ) ) + { + ComputeEnvelopeGrouping( psLCLDEncoder->psRMSEnvelopeGrouping, + psLCLDEncoder->iChannels, + psLCLDEncoder->iNumBands, + psLCLDEncoder->piBandwidths, + pppfLCLDReal_fx, + pppfLCLDImag_fx, + &psLCLDEncoder->piNumGroups[0], + psLCLDEncoder->ppiGroupLengths[0], + psLCLDEncoder->pppiRMSEnvelope, + *q_final ); + psLCLDEncoder->piNumGroups[1] = psLCLDEncoder->piNumGroups[0]; + FOR( n = 0; n < psLCLDEncoder->piNumGroups[0]; n++ ) + { + psLCLDEncoder->ppiGroupLengths[1][n] = psLCLDEncoder->ppiGroupLengths[0][n]; + move32(); + } + } + ELSE + { + FOR( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + ComputeEnvelopeGrouping( psLCLDEncoder->psRMSEnvelopeGrouping, + psLCLDEncoder->iChannels, + psLCLDEncoder->iNumBands, + psLCLDEncoder->piBandwidths, + &pppfLCLDReal_fx[n], + &pppfLCLDImag_fx[n], + &psLCLDEncoder->piNumGroups[n], + psLCLDEncoder->ppiGroupLengths[n], + &psLCLDEncoder->pppiRMSEnvelope[n], *q_final ); + } + } + + FOR( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + RemoveRMSEnvelope( psLCLDEncoder->iNumBands, + psLCLDEncoder->piBandwidths, + psLCLDEncoder->piNumGroups[n], + (const Word32 *) psLCLDEncoder->ppiGroupLengths[n], + psLCLDEncoder->pppiRMSEnvelope[n], + pppfLCLDReal_fx[n], + pppfLCLDImag_fx[n] ); + } + *q_final = add( *q_final, 9 ); // Increasing the Q as it has changed inside the RemoveRMSEnvelope + + ComputePredictors_fx( psLCLDEncoder->psPredictionEncoder, pppfLCLDReal_fx, pppfLCLDImag_fx ); + + iBitsWritten = L_add( iBitsWritten, WriteHeaderInformation( psLCLDEncoder->iNumBands, pBits ) ); + + IF( EQ_32( psLCLDEncoder->iChannels, 2 ) ) + { + iBitsWritten = L_add( iBitsWritten, WriteMSInformation( psLCLDEncoder->iNumBands, + psLCLDEncoder->iMSMode, + (const Word32 *) psLCLDEncoder->piMSFlags, + (const Word32 *) psLCLDEncoder->piLRPhaseDiffs, + (const Word32 *) psLCLDEncoder->piMSPredCoefs, + iNumMSBands, + pBits ) ); + } + + + iBitsWritten = L_add( iBitsWritten, WritePredictors( psLCLDEncoder->psPredictionEncoder, pBits ) ); + + iBitsWritten = L_add( iBitsWritten, WriteGroupInformation( psLCLDEncoder->iChannels, psLCLDEncoder->iCommonGrouping, (const Word32 *) psLCLDEncoder->piNumGroups, psLCLDEncoder->ppiGroupLengths, pBits ) ); + + iBitsWritten = L_add( iBitsWritten, WriteRMSEnvelope( psLCLDEncoder->iChannels, (const Word32 *) psLCLDEncoder->piNumGroups, psLCLDEncoder->iNumBands, psLCLDEncoder->pppiRMSEnvelope, pBits ) ); + + + IF( EQ_32( psLCLDEncoder->iChannels, 2 ) && EQ_32( psLCLDEncoder->iCommonGrouping, 1 ) ) + { + Word32 k; + FOR( k = 0; k < psLCLDEncoder->piNumGroups[0]; k++ ) + { + PerceptualModelStereo_fx( psLCLDEncoder->iNumBands, + psLCLDEncoder->piMSFlags, + psLCLDEncoder->pppiRMSEnvelope[0][k], + psLCLDEncoder->pppiRMSEnvelope[1][k], + psLCLDEncoder->pppiExcitation[0][k], + psLCLDEncoder->pppiExcitation[1][k], + psLCLDEncoder->pppiSMR[0][k], + psLCLDEncoder->pppiSMR[1][k] ); + } + } + ELSE + { + FOR( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + Word32 k; + FOR( k = 0; k < psLCLDEncoder->piNumGroups[n]; k++ ) + { + PerceptualModel_fx( psLCLDEncoder->iNumBands, + psLCLDEncoder->pppiRMSEnvelope[n][k], + psLCLDEncoder->pppiExcitation[n][k], + psLCLDEncoder->pppiSMR[n][k] ); + } + } + } +#ifdef DEBUG_WRITE_PREDICTORS + { + static FILE *fid; + if ( !fid ) + fid = fopen( "pred_enc.txt", "wt" ); + for ( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + int16_t b; + for ( b = 0; b < 60; b++ ) + fprintf( fid, "%.5f ", (float) psLCLDEncoder->psPredictionEncoder->ppiPredBandEnable[n][b] * psLCLDEncoder->psPredictionEncoder->ppfA1Imag[n][b] ); + } + fprintf( fid, "%d %d\n", psLCLDEncoder->psPredictionEncoder->iSubSetId, psLCLDEncoder->psPredictionEncoder->piPredChanEnable[n] ); + } +#endif + iAvailableBits = L_sub( iAvailableBits, iBitsWritten ); + + ComputeAllocation( psLCLDEncoder->iChannels, + (const Word32 *) psLCLDEncoder->piNumGroups, + psLCLDEncoder->ppiGroupLengths, + psLCLDEncoder->iNumBands, + psLCLDEncoder->piBandwidths, + pppfLCLDReal_fx, + pppfLCLDImag_fx, + *q_final, + psLCLDEncoder->pppiSMR, + iAvailableBits, + &psLCLDEncoder->iAllocOffset, + psLCLDEncoder->pppiAlloc, + psLCLDEncoder->pppiQLCLDReal, + psLCLDEncoder->pppiQLCLDImag, + psLCLDEncoder->pppiLCLDSignReal, + psLCLDEncoder->pppiLCLDSignImag, + psLCLDEncoder->psPredictionEncoder ); + + iBitsWritten = L_add( iBitsWritten, WriteAllocInformation( psLCLDEncoder->iAllocOffset, + pBits ) ); + iAudioBitsWritten = iBitsWritten; + iBitsWritten = L_add( iBitsWritten, WriteLCLDData( psLCLDEncoder->piNumGroups, + psLCLDEncoder->ppiGroupLengths, + psLCLDEncoder->iNumBands, + psLCLDEncoder->iChannels, + psLCLDEncoder->psPredictionEncoder->ppiPredBandEnable, + psLCLDEncoder->psPredictionEncoder->iNumSubSets, + psLCLDEncoder->psPredictionEncoder->iSubSetId, + psLCLDEncoder->pppiAlloc, + psLCLDEncoder->pppiLCLDSignReal, + psLCLDEncoder->pppiLCLDSignImag, + psLCLDEncoder->pppiQLCLDReal, + psLCLDEncoder->pppiQLCLDImag, + pBits ) ); + *piBitsWritten = iBitsWritten; + move32(); + iAudioBitsWritten = L_sub( iBitsWritten, iAudioBitsWritten ); + + UpdatePredictionSubSetId( psLCLDEncoder->psPredictionEncoder ); + + return 0; +} + +/*------------------------------------------------------------------------------------------* + * Function GetNumGroups() + * + * + *------------------------------------------------------------------------------------------*/ + +Word32 GetNumGroups( LCLDEncoder *psLCLDEncoder ) +{ + return psLCLDEncoder->piNumGroups[0]; +} + + +/*------------------------------------------------------------------------------------------* + * Local functions + * + * + *------------------------------------------------------------------------------------------*/ + +enum MSPred_Types +{ + MS_PHASE_AND_PRED = 0, /* LR phase alignment + real-valued M/S prediction */ + MS_PRED_ONLY = 1, /* real-valued M/S prediction */ + MS_PHASE_ONLY = 2 /* LR phase alignment + M/S */ +}; + +enum MS_BS_TYPES +{ + MS_OFF = 0, + MS_ALL = 1, + MS_SOME = 2, + MS_PRED = 3 +}; + +static Word32 MSModeCalculation_fx( + const Word32 iNumBlocks, + const Word32 iNumBands, + const Word32 *piBandwidths, + /*float ***pppfReal, + float ***pppfImag,*/ + Word32 ***pppfReal_fx, + Word32 ***pppfImag_fx, + Word16 Q_in, + Word32 *piMSMode, + Word32 *piLRPhaseDiffs, + Word32 *piMSPredCoefs, + const Word32 iAllowSidePred, + const Word32 iRealOnlyOut, + Word32 *piMSFlags ) +{ + Word32 b; + Word32 iFBOffset; + Word32 iNumMSBands; + Word32 iMSPredType; + /*float fMSBitGain = 0.0f; + float pfMSPredBitGain[3] = { 0.0f }; + float fPred;*/ + Word32 fMSBitGain_fx = 0; + Word32 pfMSPredBitGain_fx[3] = { 0 }; + Word32 fPred_fx; + Word32 piMSPredFlags0[MAX_BANDS] = { 0 }; + Word32 piMSPredFlags1[MAX_BANDS] = { 0 }; + Word32 piMSPredFlags2[MAX_BANDS] = { 0 }; + Word32 *ppiMSPredFlags[3]; + Word32 piMSPredCoefs0[MAX_BANDS] = { 0 }; + Word32 piMSPredCoefs1[MAX_BANDS] = { 0 }; + Word32 piMSPredCoefs2[MAX_BANDS] = { 0 }; + Word32 *ppiMSPredCoefs[3]; + Word32 piMSPredPhase0[MAX_BANDS] = { 0 }; + Word32 piMSPredPhase1[MAX_BANDS] = { 0 }; + Word32 piMSPredPhase2[MAX_BANDS] = { 0 }; + Word32 *ppiMSPredPhase[3]; + Word32 iMsInfoBits; + Word32 piMsPredInfoBits[3] = { 0 }; + + // const float feps = 1e-12f; + // float fBitsFactor = 3.32192809488736f; /* = 1/log10(2), from dB/10 to bits assuming 1 bit per log2(SNR) or 1 bit per 3dB SNR */ + const Word32 feps_fx = 1; // is this correct? + move32(); + Word32 fBitsFactor_fx = 1783446565; /* = 1/log10(2) (Q29), from dB/10 to bits assuming 1 bit per log2(SNR) or 1 bit per 3dB SNR */ + move32(); + IF( LT_32( iNumBlocks, LCLD_BLOCKS_PER_FRAME ) ) + { + // fBitsFactor *= ( 0.7f + (float) ( iNumBlocks - 4 ) / (float) ( LCLD_BLOCKS_PER_FRAME - 4 ) * ( 1.0f - 0.7f ) ); /* Tuning for relatively higher side rate due to shorter frame length */ + fBitsFactor_fx = Mpy_32_32( fBitsFactor_fx, L_add( 1503238553, W_extract_l( W_mult0_32_32( L_sub( iNumBlocks, 4 ), 596523235 ) ) ) ); /* Tuning for relatively higher side rate due to shorter frame length */ + } + + ppiMSPredFlags[0] = piMSPredFlags0; + move32(); + ppiMSPredFlags[1] = piMSPredFlags1; + move32(); + ppiMSPredFlags[2] = piMSPredFlags2; + move32(); + ppiMSPredCoefs[0] = piMSPredCoefs0; + move32(); + ppiMSPredCoefs[1] = piMSPredCoefs1; + move32(); + ppiMSPredCoefs[2] = piMSPredCoefs2; + move32(); + ppiMSPredPhase[0] = piMSPredPhase0; + move32(); + ppiMSPredPhase[1] = piMSPredPhase1; + move32(); + ppiMSPredPhase[2] = piMSPredPhase2; + move32(); + *piMSMode = MS_OFF; + move32(); + iFBOffset = 0; + move32(); + iNumMSBands = 0; + move32(); + FOR( b = 0; b < iNumBands; b++ ) + { + Word32 n; + /*float fLeftEnergy; + float fRightEnergy; + float fMidEnergy; + float fSideEnergy; + float fLRRatio; + float fMSRatio; + float pfMSPredRatio[3] = { 0.0f }; + float fMidEnergyPred; + float fSideEnergyPred; + float fLRCovReal = 0.0f; + float fLRCovImag = 0.0f;*/ + Word32 fLeftEnergy_fx; + Word32 fRightEnergy_fx; + Word32 fMidEnergy_fx; + Word32 fSideEnergy_fx; + Word64 fLeftEnergy_fx64; + Word64 fRightEnergy_fx64; + Word64 fMidEnergy_fx64; + Word64 fSideEnergy_fx64; + Word32 fLRRatio_fx; + Word32 fMSRatio_fx; + Word32 pfMSPredRatio_fx[3] = { 0 }; + Word32 fMidEnergyPred_fx; + Word32 fSideEnergyPred_fx; + Word32 fLRCovReal_fx = 0; + Word32 fLRCovImag_fx = 0; + Word64 fLRCovReal_fx64 = 0; + Word64 fLRCovImag_fx64 = 0; + Word32 iPhase; + Word32 iPred; + Word32 tabIdx = 0; + // float fNumLines = (float)(iRealOnlyOut == 1 ? iNumBlocks * piBandwidths[b] * 4 : iNumBlocks * piBandwidths[b] * 2); /* per band per channel */ + // float fLevelToSMRdBFactor = (float) c_aiDefaultTheta48[b] / (float) ( 1 << PERCEPTUAL_MODEL_SLGAIN_SHIFT ); /* frequency dependent SMR slope in psy model */ + Word32 fNumLines_fx = iRealOnlyOut == 1 ? L_shl( iNumBlocks * piBandwidths[b], 2 ) : L_shl( iNumBlocks * piBandwidths[b], 1 ); /* per band per channel */ + Word32 fLevelToSMRdBFactor_fx = L_shl( c_aiDefaultTheta48[b], 23 ); /* frequency dependent SMR slope in psy model Q23:sub(Q31, PERCEPTUAL_MODEL_SLGAIN_SHIFT) */ + fLeftEnergy_fx = 0; + fRightEnergy_fx = 0; + fMidEnergy_fx = 0; + fSideEnergy_fx = 0; + fLeftEnergy_fx64 = 0; + fRightEnergy_fx64 = 0; + fMidEnergy_fx64 = 0; + fSideEnergy_fx64 = 0; + Word16 Q_en_tmp = 63; + + FOR( n = 0; n < piBandwidths[b]; n++ ) + { + Word32 k; + FOR( k = 0; k < iNumBlocks; k++ ) + { + /*float fMidReal; + float fMidImag; + float fSideReal; + float fSideImag;*/ + Word32 fMidReal_fx; + Word32 fMidImag_fx; + Word32 fSideReal_fx; + Word32 fSideImag_fx; + + // fMidReal = 0.5f * ( pppfReal[0][k][iFBOffset] + pppfReal[1][k][iFBOffset] ); + fMidReal_fx = L_shr( L_add( pppfReal_fx[0][k][iFBOffset], pppfReal_fx[1][k][iFBOffset] ), 1 ); + // fMidImag = 0.5f * ( pppfImag[0][k][iFBOffset] + pppfImag[1][k][iFBOffset] ); + fMidImag_fx = L_shr( L_add( pppfImag_fx[0][k][iFBOffset], pppfImag_fx[1][k][iFBOffset] ), 1 ); + // fSideReal = 0.5f * ( pppfReal[0][k][iFBOffset] - pppfReal[1][k][iFBOffset] ); + fSideReal_fx = L_shr( L_sub( pppfReal_fx[0][k][iFBOffset], pppfReal_fx[1][k][iFBOffset] ), 1 ); + // fSideImag = 0.5f * ( pppfImag[0][k][iFBOffset] - pppfImag[1][k][iFBOffset] ); + fSideImag_fx = L_shr( L_sub( pppfImag_fx[0][k][iFBOffset], pppfImag_fx[1][k][iFBOffset] ), 1 ); + + // fLeftEnergy += ( pppfReal[0][k][iFBOffset] * pppfReal[0][k][iFBOffset] + pppfImag[0][k][iFBOffset] * pppfImag[0][k][iFBOffset] ); + fLeftEnergy_fx64 = W_add( fLeftEnergy_fx64, W_add( W_mult0_32_32( pppfReal_fx[0][k][iFBOffset], pppfReal_fx[0][k][iFBOffset] ), W_mult0_32_32( pppfImag_fx[0][k][iFBOffset], pppfImag_fx[0][k][iFBOffset] ) ) ); + // fRightEnergy += ( pppfReal[1][k][iFBOffset] * pppfReal[1][k][iFBOffset] + pppfImag[1][k][iFBOffset] * pppfImag[1][k][iFBOffset] ); + fRightEnergy_fx64 = W_add( fRightEnergy_fx64, W_add( W_mult0_32_32( pppfReal_fx[1][k][iFBOffset], pppfReal_fx[1][k][iFBOffset] ), W_mult0_32_32( pppfImag_fx[1][k][iFBOffset], pppfImag_fx[1][k][iFBOffset] ) ) ); + // fMidEnergy += ( fMidReal * fMidReal + fMidImag * fMidImag ); + fMidEnergy_fx64 = W_add( fMidEnergy_fx64, W_add( W_mult0_32_32( fMidReal_fx, fMidReal_fx ), W_mult0_32_32( fMidImag_fx, fMidImag_fx ) ) ); + // fSideEnergy += ( fSideReal * fSideReal + fSideImag * fSideImag ); + fSideEnergy_fx64 = W_add( fSideEnergy_fx64, W_add( W_mult0_32_32( fSideReal_fx, fSideReal_fx ), W_mult0_32_32( fSideImag_fx, fSideImag_fx ) ) ); + + // fLRCovReal += ( pppfReal[0][k][iFBOffset] * pppfReal[1][k][iFBOffset] + pppfImag[0][k][iFBOffset] * pppfImag[1][k][iFBOffset] ); + fLRCovReal_fx64 = W_add( fLRCovReal_fx64, W_add( W_mult0_32_32( pppfReal_fx[0][k][iFBOffset], pppfReal_fx[1][k][iFBOffset] ), W_mult0_32_32( pppfImag_fx[0][k][iFBOffset], pppfImag_fx[1][k][iFBOffset] ) ) ); + // fLRCovImag += ( pppfImag[0][k][iFBOffset] * pppfReal[1][k][iFBOffset] - pppfImag[1][k][iFBOffset] * pppfReal[0][k][iFBOffset] ); + fLRCovImag_fx64 = W_add( fLRCovImag_fx64, W_sub( W_mult0_32_32( pppfImag_fx[0][k][iFBOffset], pppfReal_fx[1][k][iFBOffset] ), W_mult0_32_32( pppfImag_fx[1][k][iFBOffset], pppfReal_fx[0][k][iFBOffset] ) ) ); + } + + iFBOffset++; + } + Q_en_tmp = min( Q_en_tmp, W_norm( fLeftEnergy_fx64 ) ); + Q_en_tmp = min( Q_en_tmp, W_norm( fRightEnergy_fx64 ) ); + Q_en_tmp = min( Q_en_tmp, W_norm( fMidEnergy_fx64 ) ); + Q_en_tmp = min( Q_en_tmp, W_norm( fSideEnergy_fx64 ) ); + Q_en_tmp = min( Q_en_tmp, W_norm( fLRCovReal_fx64 ) ); + Q_en_tmp = min( Q_en_tmp, W_norm( fLRCovImag_fx64 ) ); + Q_en_tmp = sub( Q_en_tmp, 2 ); + fLeftEnergy_fx = W_extract_h( W_shl( fLeftEnergy_fx64, Q_en_tmp ) ); + fRightEnergy_fx = W_extract_h( W_shl( fRightEnergy_fx64, Q_en_tmp ) ); + fMidEnergy_fx = W_extract_h( W_shl( fMidEnergy_fx64, Q_en_tmp ) ); + fSideEnergy_fx = W_extract_h( W_shl( fSideEnergy_fx64, Q_en_tmp ) ); + fLRCovReal_fx = W_extract_h( W_shl( fLRCovReal_fx64, Q_en_tmp ) ); + fLRCovImag_fx = W_extract_h( W_shl( fLRCovImag_fx64, Q_en_tmp ) ); + Word16 Q_en = add( shl( Q_in, 1 ), sub( Q_en_tmp, 32 ) ) /*2 * Q_in - 31 - 2*/; + /* M/S prediction without phase alignment*/ + // fPred = 0.25f * ( fLeftEnergy - fRightEnergy ) / ( fMidEnergy + feps ); + // iPred = quantPred(fPred); + // fPred = dequantPred(iPred); + Word16 exp; + fPred_fx = BASOP_Util_Divide3232_Scale( L_sub( fLeftEnergy_fx, fRightEnergy_fx ), L_add( fMidEnergy_fx, feps_fx ), &exp ); + exp = sub( exp, 2 ); //*0.25f + fPred_fx = L_shl( fPred_fx, 16 ); + iPred = quantPred_fx( fPred_fx, exp ); + fPred_fx = dequantPred_fx( iPred ); // Q31 + // fSideEnergyPred = fSideEnergy + ( fPred * fPred * fMidEnergy - 2.0f * fPred * 0.25f * ( fLeftEnergy - fRightEnergy ) ); + fSideEnergyPred_fx = L_add( fSideEnergy_fx, + L_sub( Mpy_32_32( Mpy_32_32( fPred_fx, fPred_fx ), fMidEnergy_fx ), + L_shr( Mpy_32_32( fPred_fx, L_sub( fLeftEnergy_fx, fRightEnergy_fx ) ), 1 ) ) ); + fSideEnergyPred_fx = max( fSideEnergyPred_fx, 0 ); + + ppiMSPredCoefs[MS_PRED_ONLY][b] = iPred; + move32(); + ppiMSPredPhase[MS_PRED_ONLY][b] = 0; + move32(); + // pfMSPredRatio[MS_PRED_ONLY] = log10f( ( fMidEnergy + feps ) / ( fSideEnergyPred + feps ) ); + pfMSPredRatio_fx[MS_PRED_ONLY] = Mpy_32_32( L_sub( BASOP_Util_Log2( L_add( fMidEnergy_fx, feps_fx ) ), BASOP_Util_Log2( L_add( fSideEnergyPred_fx, feps_fx ) ) ), LOG10_2_FX ); // Q25 + // printf("%f ", (float)pfMSPredRatio_fx[MS_PRED_ONLY] / (1 << 25)); + + /* Phase alignment*/ + iPhase = 0; + move32(); + // if ( fLRCovReal * fLRCovReal + fLRCovImag * fLRCovImag > 0.5f * fLeftEnergy * fRightEnergy ) + IF( GT_32( L_add( Mpy_32_32( fLRCovReal_fx, fLRCovReal_fx ), Mpy_32_32( fLRCovImag_fx, fLRCovImag_fx ) ), L_shr( Mpy_32_32( fLeftEnergy_fx, fRightEnergy_fx ), 1 ) ) ) + { + // float fPhase = atan2f( fLRCovImag, fLRCovReal ); + Word32 fPhase_fx = BASOP_util_atan2( fLRCovImag_fx, fLRCovReal_fx, 0 ); + exp = sub( 18, norm_l( fPhase_fx ) ); + fPhase_fx = L_shl( fPhase_fx, norm_l( fPhase_fx ) ); // Q31 + // iPhase = quantPhase( fPhase ); + iPhase = quantPhase_fx( fPhase_fx, exp ); + } + + /* adjust covariance */ + tabIdx = L_sub( iPhase, PHASE_MIN_VAL ); + // cplxmult( &fLRCovReal, &fLRCovImag, c_afRotRealImag[tabIdx][0], -c_afRotRealImag[tabIdx][1] ); + cplxmult_fx( &fLRCovReal_fx, &fLRCovImag_fx, c_afRotRealImag_fx[tabIdx][0], -c_afRotRealImag_fx[tabIdx][1] ); + + /* compute MS prediction coefficient based on adjusted covariance */ + // fMidEnergyPred = 0.25f * ( fLeftEnergy + fRightEnergy + 2.0f * fLRCovReal ); + fMidEnergyPred_fx = L_add( L_add( L_shr_r( fLeftEnergy_fx, 2 ), L_shr_r( fRightEnergy_fx, 2 ) ), L_shr( fLRCovReal_fx, 1 ) ); // Q_en + // fSideEnergyPred = 0.25f * ( fLeftEnergy + fRightEnergy - 2.0f * fLRCovReal ); + fSideEnergyPred_fx = L_sub( L_add( L_shr_r( fLeftEnergy_fx, 2 ), L_shr_r( fRightEnergy_fx, 2 ) ), L_shr( fLRCovReal_fx, 1 ) ); // Q_en + fSideEnergyPred_fx = L_max( fSideEnergyPred_fx, 0 ); + + /* M/S with LR phase alignment but without prediction */ + ppiMSPredCoefs[MS_PHASE_ONLY][b] = 0; + move32(); + ppiMSPredPhase[MS_PHASE_ONLY][b] = iPhase; + move32(); + // pfMSPredRatio[MS_PHASE_ONLY] = log10f( ( fMidEnergyPred + feps ) / ( fSideEnergyPred + feps ) ); + pfMSPredRatio_fx[MS_PHASE_ONLY] = Mpy_32_32( L_sub( BASOP_Util_Log2( L_add( fMidEnergyPred_fx, feps_fx ) ), BASOP_Util_Log2( L_add( fSideEnergyPred_fx, feps_fx ) ) ), LOG10_2_FX ); // Q25 + // printf("%f ", (float)pfMSPredRatio_fx[MS_PHASE_ONLY] / (1 << 25)); + + /* M/S with LR phase alignment and prediction */ + // fPred = fMidEnergyPred == 0.0f ? 0.0f : 0.25f * ( fLeftEnergy - fRightEnergy ) / fMidEnergyPred; + fPred_fx = fMidEnergyPred_fx == 0 ? 0 : BASOP_Util_Divide3232_Scale( L_sub( fLeftEnergy_fx, fRightEnergy_fx ), fMidEnergyPred_fx, &exp ); + exp = sub( exp, 2 ); //*0.25f + fPred_fx = L_shl( fPred_fx, 16 ); + // iPred = quantPred( fPred ); + iPred = quantPred_fx( fPred_fx, exp ); + // fPred = dequantPred( iPred ); + fPred_fx = dequantPred_fx( iPred ); + // fSideEnergyPred += ( fPred * fPred * fMidEnergyPred - 2.0f * fPred * 0.25f * ( fLeftEnergy - fRightEnergy ) ); + fSideEnergyPred_fx = L_add( fSideEnergyPred_fx, + L_sub( Mpy_32_32( Mpy_32_32( fPred_fx, fPred_fx ), fMidEnergyPred_fx ), + L_shr( Mpy_32_32( fPred_fx, L_sub( fLeftEnergy_fx, fRightEnergy_fx ) ), 1 ) ) ); + fSideEnergyPred_fx = max( fSideEnergyPred_fx, 0 ); + /* -= fPred * fPred * fMidEnergyPred doesn't work because fPred is quantized and does not match MS/MM exactly */ + ppiMSPredCoefs[MS_PHASE_AND_PRED][b] = iPred; + move32(); + ppiMSPredPhase[MS_PHASE_AND_PRED][b] = iPhase; + move32(); + // pfMSPredRatio[MS_PHASE_AND_PRED] = log10f( ( fMidEnergyPred + feps ) / ( fSideEnergyPred + feps ) ); + pfMSPredRatio_fx[MS_PHASE_AND_PRED] = Mpy_32_32( L_sub( BASOP_Util_Log2( L_add( fMidEnergyPred_fx, feps_fx ) ), BASOP_Util_Log2( L_add( fSideEnergyPred_fx, feps_fx ) ) ), LOG10_2_FX ); // Q25 + // printf("%f ", (float)pfMSPredRatio_fx[MS_PHASE_AND_PRED] / (1 << 25)); + + /* Plain M/S */ + // fLeftEnergy = log10f( fLeftEnergy + feps ); + exp = sub( 31, Q_en ); // 31 - Q + fLeftEnergy_fx = Mpy_32_32( L_add( BASOP_Util_Log2( L_add( fLeftEnergy_fx, feps_fx ) ), L_shl( exp, 25 ) ), LOG10_2_FX ); // Q25 + // fRightEnergy = log10f( fRightEnergy + feps ); + fRightEnergy_fx = Mpy_32_32( L_add( BASOP_Util_Log2( L_add( fRightEnergy_fx, feps_fx ) ), L_shl( exp, 25 ) ), LOG10_2_FX ); // Q25 + // fMidEnergy = log10f( fMidEnergy + feps ); + fMidEnergy_fx = Mpy_32_32( L_add( BASOP_Util_Log2( L_add( fMidEnergy_fx, feps_fx ) ), L_shl( exp, 25 ) ), LOG10_2_FX ); // Q25 + // fSideEnergy = log10f( fSideEnergy + feps ); + fSideEnergy_fx = Mpy_32_32( L_add( BASOP_Util_Log2( L_add( fSideEnergy_fx, feps_fx ) ), L_shl( exp, 25 ) ), LOG10_2_FX ); // Q25 + + // fLRRatio = ( fLeftEnergy > fRightEnergy ? fLeftEnergy - fRightEnergy : fRightEnergy - fLeftEnergy ); + fLRRatio_fx = ( fLeftEnergy_fx > fRightEnergy_fx ? L_sub( fLeftEnergy_fx, fRightEnergy_fx ) : L_sub( fRightEnergy_fx, fLeftEnergy_fx ) ); // Q25 + // fMSRatio = ( fMidEnergy > fSideEnergy ? fMidEnergy - fSideEnergy : fSideEnergy - fMidEnergy ); + fMSRatio_fx = ( fMidEnergy_fx > fSideEnergy_fx ? L_sub( fMidEnergy_fx, fSideEnergy_fx ) : L_sub( fSideEnergy_fx, fMidEnergy_fx ) ); // Q25 + + // if ( fMSRatio > fLRRatio ) + IF( GT_32( fMSRatio_fx, fLRRatio_fx ) ) + { + iNumMSBands++; + piMSFlags[b] = 1; + move32(); + // fMSBitGain += fNumLines * ( fMSRatio - fLRRatio ) * fLevelToSMRdBFactor * fBitsFactor; + fMSBitGain_fx = L_add( fMSBitGain_fx, W_extract_l( W_shr( W_mult0_32_32( fNumLines_fx, Mpy_32_32( Mpy_32_32( L_sub( fMSRatio_fx, fLRRatio_fx ), fLevelToSMRdBFactor_fx ), fBitsFactor_fx ) ), 7 ) ) ); // Q16 + } + ELSE + { + piMSFlags[b] = 0; + move32(); + } + piLRPhaseDiffs[b] = 0; + move32(); + piMSPredCoefs[b] = 0; + move32(); + + /* MSPred bit gains based on increase of level ratio compared to L/R ratio and the level dependent psy-model */ + FOR( iMSPredType = 0; iMSPredType < 3; iMSPredType++ ) + { + // if ( pfMSPredRatio[iMSPredType] > fLRRatio ) + IF( GT_32( pfMSPredRatio_fx[iMSPredType], fLRRatio_fx ) ) + { + ppiMSPredFlags[iMSPredType][b] = 1; + move32(); + // pfMSPredBitGain[iMSPredType] += fNumLines * ( pfMSPredRatio[iMSPredType] - fLRRatio ) * fLevelToSMRdBFactor * fBitsFactor; + pfMSPredBitGain_fx[iMSPredType] = L_add( pfMSPredBitGain_fx[iMSPredType], + W_extract_l( W_shr( W_mult0_32_32( fNumLines_fx, + Mpy_32_32( Mpy_32_32( L_sub( pfMSPredRatio_fx[iMSPredType], fLRRatio_fx ), fLevelToSMRdBFactor_fx ), + fBitsFactor_fx ) ), + 7 ) ) ); // Q16 + } + } + } + Word16 q_fMSBitGain_fx = Q16; + move16(); + Word16 q_pfMSPredBitGain_fx = Q16; // Q23-7 + move16(); + /* remove signalling cost from bit gains */ + FOR( iMSPredType = 0; iMSPredType < 3; iMSPredType++ ) + { + piMsPredInfoBits[iMSPredType] = CountMSBits( iNumBands, MS_PRED, ppiMSPredFlags[iMSPredType], ppiMSPredPhase[iMSPredType], ppiMSPredCoefs[iMSPredType] ); + // pfMSPredBitGain[iMSPredType] = max( pfMSPredBitGain[iMSPredType] - piMsPredInfoBits[iMSPredType], 0.0f ); + pfMSPredBitGain_fx[iMSPredType] = max( pfMSPredBitGain_fx[iMSPredType] - L_shl( piMsPredInfoBits[iMSPredType], q_pfMSPredBitGain_fx ), 0 ); + } + + /* find the best M/S Pred type */ + IF( EQ_32( iRealOnlyOut, 1 ) ) + { + iMSPredType = MS_PRED_ONLY; + move32(); + } + ELSE + { + iMSPredType = MS_PHASE_AND_PRED; + move32(); + // iMSPredType = ( pfMSPredBitGain[MS_PRED_ONLY] > pfMSPredBitGain[iMSPredType] ? MS_PRED_ONLY : iMSPredType ); + iMSPredType = ( pfMSPredBitGain_fx[MS_PRED_ONLY] > pfMSPredBitGain_fx[iMSPredType] ? MS_PRED_ONLY : iMSPredType ); + // iMSPredType = ( pfMSPredBitGain[MS_PHASE_ONLY] > pfMSPredBitGain[iMSPredType] ? MS_PHASE_ONLY : iMSPredType ); + iMSPredType = ( pfMSPredBitGain_fx[MS_PHASE_ONLY] > pfMSPredBitGain_fx[iMSPredType] ? MS_PHASE_ONLY : iMSPredType ); + } + + /* plain M/S */ + iMsInfoBits = CountMSBits( iNumBands, MS_SOME, piMSFlags, NULL, NULL ); + // fMSBitGain = max( fMSBitGain - iMsInfoBits, 0.0f ); + fMSBitGain_fx = L_max( L_sub( fMSBitGain_fx, L_shl( iMsInfoBits, q_fMSBitGain_fx ) ), 0 ); // Q_en -2 + // if ( iAllowSidePred && pfMSPredBitGain[iMSPredType] > 1.1f * fMSBitGain ) + test(); + IF( iAllowSidePred && GT_32( L_shr_r( pfMSPredBitGain_fx[iMSPredType], sub( q_pfMSPredBitGain_fx, q_fMSBitGain_fx ) ), L_add( fMSBitGain_fx, Mpy_32_32( fMSBitGain_fx, 214748364 ) ) ) ) + { + *piMSMode = MS_PRED; + move32(); + iNumMSBands = 0; + move32(); + FOR( b = 0; b < iNumBands; b++ ) + { + piMSFlags[b] = ppiMSPredFlags[iMSPredType][b]; + IF( EQ_32( piMSFlags[b], 1 ) ) + { + piMSPredCoefs[b] = ppiMSPredCoefs[iMSPredType][b]; + move32(); + piLRPhaseDiffs[b] = ppiMSPredPhase[iMSPredType][b]; + move32(); + iNumMSBands++; + } + ELSE + { + piMSPredCoefs[b] = 0; + move32(); + piLRPhaseDiffs[b] = 0; + move32(); + } + } + } + ELSE IF( EQ_32( iNumMSBands, iNumBands ) ) + { + *piMSMode = MS_ALL; + move32(); + } + ELSE IF( GT_32( iNumMSBands, 0 ) ) + { + *piMSMode = MS_SOME; + move32(); + } + ELSE + { + *piMSMode = MS_OFF; + move32(); + } +#ifdef DEBUG_WRITE_MS_PRED + { + static FILE *fid; + int32_t iActualInfoBits = CountMSBits( iNumBands, *piMSMode, piMSFlags, piLRPhaseDiffs, piMSPredCoefs ); + if ( !fid ) + fid = fopen( "ms_info_bits.txt", "wt" ); + fprintf( fid, "%d %d %d %d %d\n", iMsInfoBits, piMsPredInfoBits[MS_PHASE_AND_PRED], piMsPredInfoBits[MS_PRED_ONLY], piMsPredInfoBits[MS_PHASE_ONLY], iActualInfoBits ); + } +#endif + IF( NE_32( *piMSMode, MS_OFF ) ) + { + iFBOffset = 0; + move32(); + FOR( b = 0; b < iNumBands; b++ ) + { + IF( EQ_32( piMSFlags[b], 1 ) ) + { + Word32 n; + Word32 phaseIdx; + phaseIdx = L_sub( piLRPhaseDiffs[b], PHASE_MIN_VAL ); + // fPred = dequantPred( piMSPredCoefs[b] ); + fPred_fx = dequantPred_fx( piMSPredCoefs[b] ); // Q31 + FOR( n = 0; n < piBandwidths[b]; n++ ) + { + Word32 k; + FOR( k = 0; k < iNumBlocks; k++ ) + { + /*float fMidReal; + float fMidImag; + float fSideReal; + float fSideImag;*/ + Word32 fMidReal_fx; + Word32 fMidImag_fx; + Word32 fSideReal_fx; + Word32 fSideImag_fx; + + IF( EQ_32( *piMSMode, MS_PRED ) ) + { + // cplxmult( &pppfReal[1][k][iFBOffset], &pppfImag[1][k][iFBOffset], c_afRotRealImag[phaseIdx][0], c_afRotRealImag[phaseIdx][1] ); + cplxmult_fx( &pppfReal_fx[1][k][iFBOffset], &pppfImag_fx[1][k][iFBOffset], c_afRotRealImag_fx[phaseIdx][0], c_afRotRealImag_fx[phaseIdx][1] ); + } + + // fMidReal = 0.5f * ( pppfReal[0][k][iFBOffset] + pppfReal[1][k][iFBOffset] ); + fMidReal_fx = L_shr( L_add( pppfReal_fx[0][k][iFBOffset], pppfReal_fx[1][k][iFBOffset] ), 1 ); + // fMidImag = 0.5f * ( pppfImag[0][k][iFBOffset] + pppfImag[1][k][iFBOffset] ); + fMidImag_fx = L_shr( L_add( pppfImag_fx[0][k][iFBOffset], pppfImag_fx[1][k][iFBOffset] ), 1 ); + // fSideReal = 0.5f * ( pppfReal[0][k][iFBOffset] - pppfReal[1][k][iFBOffset] ); + fSideReal_fx = L_shr( L_sub( pppfReal_fx[0][k][iFBOffset], pppfReal_fx[1][k][iFBOffset] ), 1 ); + // fSideImag = 0.5f * ( pppfImag[0][k][iFBOffset] - pppfImag[1][k][iFBOffset] ); + fSideImag_fx = L_shr( L_sub( pppfImag_fx[0][k][iFBOffset], pppfImag_fx[1][k][iFBOffset] ), 1 ); + + IF( EQ_32( *piMSMode, MS_PRED ) ) + { + // fSideReal -= fPred * fMidReal; + fSideReal_fx = L_sub( fSideReal_fx, Mpy_32_32( fPred_fx, fMidReal_fx ) ); + // fSideImag -= fPred * fMidImag; + fSideImag_fx = L_sub( fSideImag_fx, Mpy_32_32( fPred_fx, fMidImag_fx ) ); + } + + pppfReal_fx[0][k][iFBOffset] = fMidReal_fx; + move32(); + pppfReal_fx[1][k][iFBOffset] = fSideReal_fx; + move32(); + pppfImag_fx[0][k][iFBOffset] = fMidImag_fx; + move32(); + pppfImag_fx[1][k][iFBOffset] = fSideImag_fx; + move32(); + } + iFBOffset++; + } + } + ELSE + { + iFBOffset = L_add( iFBOffset, piBandwidths[b] ); + } + } + } +#ifdef DEBUG_WRITE_MS_PRED + { + static FILE *fid; + if ( !fid ) + fid = fopen( "ms_enc.txt", "wt" ); + writeMSPred( piLRPhaseDiffs, piMSPredCoefs, *piMSMode, iNumMSBands, iNumBands, fid, piMSFlags ); + } +#endif + IF( EQ_32( *piMSMode, MS_PRED ) ) + { + /* Differential Coding of Phase Data*/ + PrepEncode( piLRPhaseDiffs, piMSFlags, iNumBands ); + PrepEncode( piMSPredCoefs, piMSFlags, iNumBands ); +#ifdef DEBUG_WRITE_MS_PRED + { + static FILE *fid; + if ( !fid ) + fid = fopen( "ms_pred_enc.txt", "wt" ); + writeMSPred( piLRPhaseDiffs, piMSPredCoefs, *piMSMode, iNumMSBands, iNumBands, fid, piMSFlags ); + } +#endif + /* Differential Coding*/ + EncodePhase( piLRPhaseDiffs, iNumMSBands, PHASE_DIFF_DIM ); + EncodePredCoef( piMSPredCoefs, iNumMSBands ); + } + + return iNumMSBands; +} +static void RemoveRMSEnvelope( + const Word32 iNumBands, + const Word32 *piBandwidths, + const Word32 iNumGroups, + const Word32 *piGroupLengths, + Word32 **ppiRMSEnvelope, + Word32 **ppfReal_fx, + Word32 **ppfImag_fx ) +{ + Word32 k, n, b, iFBOffset, m, iRMSEnv; + Word32 iBlockOffset; + Word32 fGain_fx; + Word16 fGain_exp; + iBlockOffset = 0; + move32(); + Word64 tmp; + FOR( n = 0; n < iNumGroups; n++ ) + { + FOR( k = 0; k < piGroupLengths[n]; k++ ) + { + iFBOffset = 0; + move32(); + FOR( b = 0; b < iNumBands; b++ ) + { + iRMSEnv = ppiRMSEnvelope[n][b]; + IF( EQ_32( L_add( ENV_RECONSTRUCT_TABLE_CENTER, iRMSEnv ) % 2, 0 ) ) + { + fGain_fx = 1073741824; // 2 ^ 30 + move32(); + } + ELSE + { + fGain_fx = 1518500249; // sqrt(2) * 2 ^ 30 + move32(); + } + fGain_exp = c_afRMSEnvReconstructTable_exp[ENV_RECONSTRUCT_TABLE_CENTER - iRMSEnv]; + move16(); + FOR( m = 0; m < piBandwidths[b]; m++ ) + { + tmp = W_mult_32_32( fGain_fx, ppfReal_fx[iBlockOffset][iFBOffset] ); + tmp = W_shr( tmp, sub( fGain_exp, 8 ) ); // Q to (input_q -9) + ppfReal_fx[iBlockOffset][iFBOffset] = W_extract_l( tmp ); + move32(); + tmp = W_mult_32_32( fGain_fx, ppfImag_fx[iBlockOffset][iFBOffset] ); + tmp = W_shr( tmp, sub( fGain_exp, 8 ) ); // Q to (input_q -9) + ppfImag_fx[iBlockOffset][iFBOffset] = W_extract_l( tmp ); + move32(); + iFBOffset++; + } + } + iBlockOffset++; + } + } + + return; +} +static void QuantizeSpectrumDPCM_Opt( + const Word32 iNumGroups, + const Word32 *piGroupLengths, + const Word32 iNumBands, + const Word32 *piBandwidths, + Word32 **ppiAlloc, + Word32 **ppfReal_fx, + Word32 **ppfImag_fx, + Word16 q_final, + Word32 **ppiQReal, + Word32 **ppiQImag, + Word32 **ppiSignReal, + Word32 **ppiSignImag, + Word32 iNumSubSets, + Word32 iSubSetId, + Word32 *piPredEnable, + Word32 *pfA1Real_fx, + Word32 *pfA1Imag_fx, + Word32 *pfPredStateReal_fx, + Word32 *pfPredStateImag_fx ) +{ + Word32 b, n; + Word32 iFBOffset; + Word32 k, iAlloc; + Word32 iMaxQuantVal_fx; + Word32 fSCFGain_fx, fInvSCFGain_fx; + iFBOffset = 0; + Word32 ppiQReal_fx, ppiQImag_fx; + FOR( b = 0; b < iNumBands; b++ ) + { + Word32 m; + FOR( m = 0; m < piBandwidths[b]; m++ ) + { + Word32 iBlockOffset = 0; + IF( EQ_32( piPredEnable[iFBOffset], 1 ) ) + { + Word32 fReal_fx; + Word32 fImag_fx; + Word32 iSubset = iFBOffset % iNumSubSets; + Word32 fPrevReal_fx = 0; + Word32 fPrevImag_fx = 0; + IF( NE_32( iSubset, iSubSetId ) ) + { + /* run predictors across sub-frames */ + fPrevReal_fx = pfPredStateReal_fx[iFBOffset]; + move32(); + fPrevImag_fx = pfPredStateImag_fx[iFBOffset]; + move32(); + } + FOR( n = 0; n < iNumGroups; n++ ) + { + iAlloc = ppiAlloc[n][b]; + iMaxQuantVal_fx = c_aiQuantMaxValues_fx[iAlloc]; + fSCFGain_fx = c_afScaleFactor_fx[iAlloc]; + fInvSCFGain_fx = c_afInvScaleFactor_fx[iAlloc]; + FOR( k = 0; k < piGroupLengths[n]; k++ ) + { + /* prediction */ + fReal_fx = L_sub( Mpy_32_32( pfA1Real_fx[iFBOffset], fPrevReal_fx ), Mpy_32_32( pfA1Imag_fx[iFBOffset], fPrevImag_fx ) ); + fImag_fx = L_add( Mpy_32_32( pfA1Real_fx[iFBOffset], fPrevImag_fx ), Mpy_32_32( pfA1Imag_fx[iFBOffset], fPrevReal_fx ) ); + ppiQReal_fx = Quantize_fx( L_add_sat( L_shr_r_sat( ppfReal_fx[iBlockOffset][iFBOffset], sub( q_final, Q28 ) ), fReal_fx ), /* quantize residual */ + fSCFGain_fx, + &ppiSignReal[iBlockOffset][iFBOffset], + iMaxQuantVal_fx ); + ppiQImag_fx = Quantize_fx( L_add_sat( L_shr_r_sat( ppfImag_fx[iBlockOffset][iFBOffset], sub( q_final, Q28 ) ), fImag_fx ), + fSCFGain_fx, + &ppiSignImag[iBlockOffset][iFBOffset], + iMaxQuantVal_fx ); + ppiQReal[iBlockOffset][iFBOffset] = L_shr( ppiQReal_fx, 21 ); + + ppiQImag[iBlockOffset][iFBOffset] = L_shr( ppiQImag_fx, 21 ); + + ppiQReal_fx = L_shl( ppiQReal[iBlockOffset][iFBOffset], 21 ); + fPrevReal_fx = L_sub( L_shl( UnQuantize_fx( ppiQReal_fx, + fInvSCFGain_fx, + ppiSignReal[iBlockOffset][iFBOffset] ), + 9 ), + fReal_fx ); + /* add prediction to quantized residual = reconstructed sample */ + + ppiQImag_fx = L_shl( ppiQImag[iBlockOffset][iFBOffset], 21 ); + fPrevImag_fx = L_sub( L_shl( UnQuantize_fx( ppiQImag_fx, + fInvSCFGain_fx, + ppiSignImag[iBlockOffset][iFBOffset] ), + 9 ), + fImag_fx ); + iBlockOffset++; + } /* group length */ + } /* groups */ + pfPredStateReal_fx[iFBOffset] = fPrevReal_fx; + move32(); + pfPredStateImag_fx[iFBOffset] = fPrevImag_fx; + move32(); + } /* predEnable */ + ELSE + { /* no prediction */ + FOR( n = 0; n < iNumGroups; n++ ) + { + iAlloc = ppiAlloc[n][b]; + move32(); + iMaxQuantVal_fx = c_aiQuantMaxValues_fx[iAlloc]; + move32(); + fSCFGain_fx = c_afScaleFactor_fx[iAlloc]; + move32(); + fInvSCFGain_fx = c_afInvScaleFactor_fx[iAlloc]; + move32(); + FOR( k = 0; k < piGroupLengths[n]; k++ ) + { + ppiQReal_fx = Quantize_fx( L_shr_r_sat( ppfReal_fx[iBlockOffset][iFBOffset], sub( q_final, Q28 ) ), + fSCFGain_fx, + &ppiSignReal[iBlockOffset][iFBOffset], + iMaxQuantVal_fx ); + ppiQImag_fx = Quantize_fx( L_shr_r_sat( ppfImag_fx[iBlockOffset][iFBOffset], sub( q_final, Q28 ) ), + fSCFGain_fx, + &ppiSignImag[iBlockOffset][iFBOffset], + iMaxQuantVal_fx ); + + ppiQReal[iBlockOffset][iFBOffset] = L_shr( ppiQReal_fx, 21 ); + + ppiQImag[iBlockOffset][iFBOffset] = L_shr( ppiQImag_fx, 21 ); + + iBlockOffset++; + } /* group length */ + } /* groups */ + } /* predEnable */ + iFBOffset++; + } /* bandwidth */ + } +} +static Word32 CountLCLDBits( + const Word32 iNumGroups, + const Word32 *piGroupLengths, + const Word32 iNumBands, + const Word32 *piBandwidths, + const Word32 *piPredEnable, + Word32 **ppiAlloc, + Word32 **ppiQReal, + Word32 **ppiQImag ) +{ + Word32 k, n, b, iFBOffset; + Word32 iBits, iBlockOffest; + Word32 m, iAlloc, iHuffDim, iHuffMod; + + iBits = 0; + move32(); + iBlockOffest = 0; + move32(); + FOR( n = 0; n < iNumGroups; n++ ) + { + FOR( k = 0; k < piGroupLengths[n]; k++ ) + { + iFBOffset = 0; + move32(); + FOR( b = 0; b < iNumBands; b++ ) + { + iAlloc = ppiAlloc[n][b]; + move32(); + + iHuffDim = c_aiHuffmanDim[iAlloc]; + move32(); + iHuffMod = c_aiHuffmanMod[iAlloc]; + move32(); + + IF( GT_32( iAlloc, 0 ) ) + { + const UWord16( *pauiHuffmanTable )[2] = NULL; + const UWord16( *pauiHuffmanTableDPCM )[2] = NULL; + pauiHuffmanTable = c_apauiHuffEncTabels[iAlloc]; + pauiHuffmanTableDPCM = c_apauiHuffEncTabels[ALLOC_TABLE_SIZE + iAlloc]; + FOR( m = 0; m < piBandwidths[b]; m++ ) + { + Word32 iQuantValue1; + Word32 iQuantValue2; + + iQuantValue1 = ppiQReal[iBlockOffest][iFBOffset]; + move32(); + iQuantValue2 = ppiQImag[iBlockOffest][iFBOffset]; + move32(); + + iBits = L_add( iBits, GT_32( iQuantValue1, 0 ) ? 1 : 0 ); /* Sign bit for vals > 0 */ + iBits = L_add( iBits, GT_32( iQuantValue2, 0 ) ? 1 : 0 ); /* Sign bit for vals > 0 */ + + IF( EQ_32( piPredEnable[iFBOffset], 1 ) ) + { + IF( EQ_32( iHuffDim, 2 ) ) + { + iQuantValue1 *= iHuffMod; + iQuantValue1 = L_add( iQuantValue1, iQuantValue2 ); + iBits = L_add( iBits, pauiHuffmanTableDPCM[iQuantValue1][0] ); + } + ELSE + { + iBits = L_add( iBits, pauiHuffmanTableDPCM[iQuantValue1][0] ); + iBits = L_add( iBits, pauiHuffmanTableDPCM[iQuantValue2][0] ); + } + } + ELSE + { + IF( EQ_32( iHuffDim, 2 ) ) + { + iQuantValue1 *= iHuffMod; + iQuantValue1 = L_add( iQuantValue1, iQuantValue2 ); + iBits = L_add( iBits, pauiHuffmanTable[iQuantValue1][0] ); + } + ELSE + { + iBits = L_add( iBits, pauiHuffmanTable[iQuantValue1][0] ); + iBits = L_add( iBits, pauiHuffmanTable[iQuantValue2][0] ); + } + } + + iFBOffset++; + } + } + ELSE + { + iFBOffset = L_add( iFBOffset, piBandwidths[b] ); + } + } + + iBlockOffest++; + } + } + + return iBits; +} + + +/* Currently only the number of bands in frame */ +static Word32 WriteHeaderInformation( + const Word32 iNumBands, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word32 iBitsWritten; + + iBitsWritten = 0; + move32(); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, iNumBands, 5 ); + iBitsWritten = L_add( iBitsWritten, 5 ); + + return iBitsWritten; +} + + +static Word32 WriteMSInformation( + const Word32 iNumBands, + const Word32 iMSMode, + const Word32 *piMSFlags, + const Word32 *piLRPhaseDiff, + const Word32 *piMSPredCoef, + Word32 iNumMSPredBands, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word32 iBitsWritten; + Word32 iMSPredAll = (Word32) EQ_32( iNumMSPredBands, iNumBands ); + move32(); +#ifdef DEBUG_WRITE_MS_PRED + Word32 iBitsWrittenTmp = 0; + move32(); +#endif + iBitsWritten = 0; + move32(); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, iMSMode, 2 ); + iBitsWritten = L_add( iBitsWritten, 2 ); + + IF( EQ_32( iMSMode, 3 ) ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, iMSPredAll, 1 ); + iBitsWritten = L_add( iBitsWritten, 1 ); + } + + test(); + test(); + IF( EQ_32( iMSMode, 2 ) || ( EQ_32( iMSMode, 3 ) && !iMSPredAll ) ) + { + Word32 n; + FOR( n = 0; n < iNumBands; n++ ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, piMSFlags[n], 1 ); + iBitsWritten = L_add( iBitsWritten, 1 ); + } + } + +#ifdef DEBUG_WRITE_MS_PRED + iBitsWrittenTmp = iBitsWritten; +#endif + IF( EQ_32( iMSMode, 3 ) ) + { + Word32 b; + Word32 anyNonZero; + anyNonZero = 0; + move32(); + FOR( b = 0; b < iNumMSPredBands; b++ ) + { + IF( NE_32( piLRPhaseDiff[b], 0 ) ) + { + anyNonZero = 1; + move32(); + BREAK; + } + } + ISAR_SPLIT_REND_BITStream_write_int32( pBits, anyNonZero, 1 ); + iBitsWritten++; + + IF( anyNonZero ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, L_sub( piLRPhaseDiff[0], PHASE_MIN_VAL ), PHASE_BAND0_BITS ); + iBitsWritten = L_add( iBitsWritten, PHASE_BAND0_BITS ); + FOR( b = 1; b < iNumMSPredBands; b++ ) + { + Word32 tabIdx = L_sub( piLRPhaseDiff[b], ENV_DELTA_MIN ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, c_aaiRMSEnvHuffEnc[tabIdx][1], c_aaiRMSEnvHuffEnc[tabIdx][0] ); + iBitsWritten = L_add( iBitsWritten, c_aaiRMSEnvHuffEnc[tabIdx][0] ); + } + } + + anyNonZero = 0; + move32(); + FOR( b = 0; b < iNumMSPredBands; b++ ) + { + IF( NE_32( piMSPredCoef[b], 0 ) ) + { + anyNonZero = 1; + move32(); + BREAK; + } + } + + ISAR_SPLIT_REND_BITStream_write_int32( pBits, anyNonZero, 1 ); + iBitsWritten++; + + IF( anyNonZero ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, L_sub( piMSPredCoef[0], PRED_MIN_VAL ), PRED_BAND0_BITS ); + iBitsWritten = L_add( iBitsWritten, PRED_BAND0_BITS ); + FOR( b = 1; b < iNumMSPredBands; b++ ) + { + Word32 tabIdx = L_sub( piMSPredCoef[b], ENV_DELTA_MIN ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, c_aaiRMSEnvHuffEnc[tabIdx][1], c_aaiRMSEnvHuffEnc[tabIdx][0] ); + iBitsWritten = L_add( iBitsWritten, c_aaiRMSEnvHuffEnc[tabIdx][0] ); + } + } + } +#ifdef DEBUG_WRITE_MS_PRED + { + static FILE *fid = 0; + IF( !fid ) + { + fid = fopen( "ms_pred_bitrate.txt", "wt" ); + } + fprintf( fid, "%f\n", (float) ( ( iBitsWritten - iBitsWrittenTmp ) * ( iMSMode == 3 ) * 50 ) / 1000.0f ); /*kb/s*/ + } +#endif + + return iBitsWritten; +} + + +static Word32 WriteGroupInformation( + const Word32 iChannels, + const Word32 iCommonGrouping, + const Word32 *piNumGroups, + Word32 **ppiGroupLengths, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word32 c, k, n, iBitsWritten; + + iBitsWritten = 0; + move32(); + test(); + IF( EQ_32( iChannels, 2 ) && EQ_32( iCommonGrouping, 1 ) ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, iCommonGrouping, 1 ); + iBitsWritten = L_add( iBitsWritten, 1 ); + + FOR( n = 0; n < piNumGroups[0]; n++ ) + { + FOR( k = 1; k < ppiGroupLengths[0][n]; k++ ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, 0, 1 ); + iBitsWritten = L_add( iBitsWritten, 1 ); + } + IF( LT_32( n, L_sub( piNumGroups[0], 1 ) ) ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, 1, 1 ); + iBitsWritten = L_add( iBitsWritten, 1 ); + } + } + } + ELSE IF( EQ_32( iChannels, 2 ) ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, iCommonGrouping, 1 ); + iBitsWritten = L_add( iBitsWritten, 1 ); + + FOR( c = 0; c < iChannels; c++ ) + { + FOR( n = 0; n < piNumGroups[c]; n++ ) + { + FOR( k = 1; k < ppiGroupLengths[c][n]; k++ ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, 0, 1 ); + iBitsWritten = L_add( iBitsWritten, 1 ); + } + IF( LT_32( n, L_sub( piNumGroups[c], 1 ) ) ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, 1, 1 ); + iBitsWritten = L_add( iBitsWritten, 1 ); + } + } + } + } + ELSE + { + FOR( c = 0; c < iChannels; c++ ) + { + FOR( n = 0; n < piNumGroups[c]; n++ ) + { + FOR( k = 1; k < ppiGroupLengths[c][n]; k++ ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, 0, 1 ); + iBitsWritten = L_add( iBitsWritten, 1 ); + } + + IF( LT_32( n, L_sub( piNumGroups[c], 1 ) ) ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, 1, 1 ); + iBitsWritten = L_add( iBitsWritten, 1 ); + } + } + } + } + + return iBitsWritten; +} + + +static Word32 WriteRMSEnvelope( + const Word32 iChannels, + const Word32 *piNumGroups, + const Word32 iNumBands, + Word32 ***pppiRMSEnvelope, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word32 k, n; + Word32 iBitsWritten; + + iBitsWritten = 0; + move32(); + FOR( n = 0; n < iChannels; n++ ) + { + FOR( k = 0; k < piNumGroups[n]; k++ ) + { + Word32 b; + Word32 iLastRMSVal; + + iLastRMSVal = pppiRMSEnvelope[n][k][0]; + move32(); + iLastRMSVal = GT_32( iLastRMSVal, ENV_MIN ) ? iLastRMSVal : ENV_MIN; + move32(); + iLastRMSVal = LT_32( iLastRMSVal, ENV_MAX ) ? iLastRMSVal : ENV_MAX; + move32(); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, L_sub( iLastRMSVal, ENV_MIN ), ENV0_BITS ); + iBitsWritten = L_add( iBitsWritten, ENV0_BITS ); + + FOR( b = 1; b < iNumBands; b++ ) + { + Word32 iDelta; + + iDelta = L_sub( pppiRMSEnvelope[n][k][b], iLastRMSVal ); + iDelta = GT_32( iDelta, ENV_DELTA_MIN ) ? iDelta : ENV_DELTA_MIN; + move32(); + iDelta = LT_32( iDelta, ENV_DELTA_MAX ) ? iDelta : ENV_DELTA_MAX; + move32(); + iDelta = L_sub( iDelta, ENV_DELTA_MIN ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, c_aaiRMSEnvHuffEnc[iDelta][1], c_aaiRMSEnvHuffEnc[iDelta][0] ); + iBitsWritten = L_add( iBitsWritten, c_aaiRMSEnvHuffEnc[iDelta][0] ); + + iLastRMSVal = pppiRMSEnvelope[n][k][b]; + move32(); + } + } + } + + return iBitsWritten; +} + + +static Word32 WriteAllocInformation( + const Word32 iAllocOffset, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word32 iBitsWritten; + + iBitsWritten = 0; + move32(); + + IF( LT_32( iAllocOffset, MIN_ALLOC_OFFSET ) || GT_32( iAllocOffset, MAX_ALLOC_OFFSET ) ) + { + printf( "Serious error\n" ); + } + + ISAR_SPLIT_REND_BITStream_write_int32( pBits, L_sub( iAllocOffset, MIN_ALLOC_OFFSET ), ALLOC_OFFSET_BITS ); + iBitsWritten = L_add( iBitsWritten, ALLOC_OFFSET_BITS ); + + return iBitsWritten; +} + + +static Word32 WriteLCLDData( + const Word32 *piNumGroups, + Word32 **ppiGroupLengths, + const Word32 iNumBands, + const Word32 iNumChannels, + Word32 **ppiPredEnable, + const Word32 iNumSubSets, + const Word32 iSubSetId, + Word32 ***pppiAlloc, + Word32 ***pppiSignReal, + Word32 ***pppiSignImag, + Word32 ***pppiQReal, + Word32 ***pppiQImag, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word32 iBitsWritten; + Word32 iNumLcldBands = c_aiNumLcldBandsPerBand[iNumBands - 1]; + Word32 s; + Word32 iSet = iSubSetId; + + iBitsWritten = 0; + move32(); + FOR( s = 0; s < iNumSubSets; ( s++, iSet-- ) ) + { + Word32 ch; + IF( LT_32( iSet, 0 ) ) + { + iSet = L_sub( iNumSubSets, 1 ); + } + + FOR( ch = 0; ch < iNumChannels; ch++ ) + { + Word32 iBlockOffest = 0; + move32(); + Word32 n; + FOR( n = 0; n < piNumGroups[ch]; n++ ) + { + Word32 k; + FOR( k = 0; k < ppiGroupLengths[ch][n]; k++ ) + { + Word32 iFBOffset; + FOR( iFBOffset = iSet; iFBOffset < iNumLcldBands; iFBOffset += iNumSubSets ) + { + Word32 b; + Word32 iAlloc; + Word32 iHuffDim; + Word32 iHuffMod; + + b = c_aiBandIdPerLcldBand[iFBOffset]; + move32(); + + iAlloc = pppiAlloc[ch][n][b]; + move32(); + + iHuffDim = c_aiHuffmanDim[iAlloc]; + move32(); + iHuffMod = c_aiHuffmanMod[iAlloc]; + move32(); + + IF( GT_32( iAlloc, 0 ) ) + { + const UWord16( *pauiHuffmanTable )[2] = NULL; + const UWord16( *pauiHuffmanTableDPCM )[2] = NULL; + Word32 iQuantValue1; + Word32 iQuantValue2; + pauiHuffmanTable = c_apauiHuffEncTabels[iAlloc]; + pauiHuffmanTableDPCM = c_apauiHuffEncTabels[ALLOC_TABLE_SIZE + iAlloc]; + + iQuantValue1 = pppiQReal[ch][iBlockOffest][iFBOffset]; + move32(); + iQuantValue2 = pppiQImag[ch][iBlockOffest][iFBOffset]; + move32(); +#ifdef LCLD_HANDLE_PRED_START_SAMPLE + IF( ppiPredEnable[ch][iFBOffset] == 1 && ( iBlockOffest > 0 || iSet != iSubSetId ) ) +#else + IF( EQ_32( ppiPredEnable[ch][iFBOffset], 1 ) ) +#endif + { + IF( EQ_32( iHuffDim, 2 ) ) + { + Word32 iSymbol; + iSymbol = iQuantValue1; + move32(); + iSymbol *= iHuffMod; + iSymbol = L_add( iSymbol, iQuantValue2 ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, pauiHuffmanTableDPCM[iSymbol][1], pauiHuffmanTableDPCM[iSymbol][0] ); + iBitsWritten = L_add( iBitsWritten, pauiHuffmanTableDPCM[iSymbol][0] ); + } + ELSE + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, pauiHuffmanTableDPCM[iQuantValue1][1], pauiHuffmanTableDPCM[iQuantValue1][0] ); + iBitsWritten = L_add( iBitsWritten, pauiHuffmanTableDPCM[iQuantValue1][0] ); + + ISAR_SPLIT_REND_BITStream_write_int32( pBits, pauiHuffmanTableDPCM[iQuantValue2][1], pauiHuffmanTableDPCM[iQuantValue2][0] ); + iBitsWritten = L_add( iBitsWritten, pauiHuffmanTableDPCM[iQuantValue2][0] ); + } + } + ELSE + { + IF( EQ_32( iHuffDim, 2 ) ) + { + Word32 iSymbol; + iSymbol = iQuantValue1; + move32(); + iSymbol *= iHuffMod; + iSymbol = L_add( iSymbol, iQuantValue2 ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, pauiHuffmanTable[iSymbol][1], pauiHuffmanTable[iSymbol][0] ); + iBitsWritten = L_add( iBitsWritten, pauiHuffmanTable[iSymbol][0] ); + } + ELSE + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, pauiHuffmanTable[iQuantValue1][1], pauiHuffmanTable[iQuantValue1][0] ); + iBitsWritten = L_add( iBitsWritten, pauiHuffmanTable[iQuantValue1][0] ); + + ISAR_SPLIT_REND_BITStream_write_int32( pBits, pauiHuffmanTable[iQuantValue2][1], pauiHuffmanTable[iQuantValue2][0] ); + iBitsWritten = L_add( iBitsWritten, pauiHuffmanTable[iQuantValue2][0] ); + } + } + + IF( GT_32( iQuantValue1, 0 ) ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, pppiSignReal[ch][iBlockOffest][iFBOffset], 1 ); + iBitsWritten = L_add( iBitsWritten, 1 ); + } + IF( GT_32( iQuantValue2, 0 ) ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, pppiSignImag[ch][iBlockOffest][iFBOffset], 1 ); + iBitsWritten = L_add( iBitsWritten, 1 ); + } + } + } + iBlockOffest++; + } + } + } + } + + return iBitsWritten; +} +static Word32 ComputeAllocation( + const Word32 iChannels, + const Word32 *piNumGroups, + Word32 **ppiGroupLengths, + const Word32 iNumBands, + const Word32 *piBandwidths, + Word32 ***pppfReal_fx, + Word32 ***pppfImag_fx, + Word16 q_final, + Word32 ***pppiSMR, + const Word32 iAvailableBits, + Word32 *piAllocOffset, + Word32 ***pppiAlloc, + Word32 ***pppiQReal, + Word32 ***pppiQImag, + Word32 ***pppiSignReal, + Word32 ***pppiSignImag, + PredictionEncoder *psPredictionEncoder ) +{ + Word32 iBitsUsed, iDone, iDelta; + Word32 b, k, n; + Word32 iLimitAllocOffset; + + iBitsUsed = ALLOC_OFFSET_BITS; /* Bits used for Alloc Offset */ + move32(); + iDone = 0; + move32(); + iDelta = -MIN_ALLOC_OFFSET; + move32(); + *piAllocOffset = 0; + move32(); + WHILE( EQ_32( iDone, 0 ) ) + { + iBitsUsed = ALLOC_OFFSET_BITS; + move32(); + iLimitAllocOffset = *piAllocOffset; + move32(); + iLimitAllocOffset = GT_32( iLimitAllocOffset, MIN_ALLOC_OFFSET ) ? iLimitAllocOffset : MIN_ALLOC_OFFSET; + iLimitAllocOffset = LT_32( iLimitAllocOffset, MAX_ALLOC_OFFSET ) ? iLimitAllocOffset : MAX_ALLOC_OFFSET; + + FOR( n = 0; n < iChannels; n++ ) + { + FOR( k = 0; k < piNumGroups[n]; k++ ) + { + FOR( b = 0; b < iNumBands; b++ ) + { + Word32 iAlloc; + iAlloc = ( L_shr( L_add( pppiSMR[n][k][b], L_mult0( extract_l( iLimitAllocOffset ), ALLOC_OFFSET_SCALE ) ), 5 ) ); + iAlloc = GT_32( iAlloc, MIN_ALLOC ) ? iAlloc : MIN_ALLOC; + iAlloc = LT_32( iAlloc, MAX_ALLOC ) ? iAlloc : MAX_ALLOC; + pppiAlloc[n][k][b] = iAlloc; + move32(); + } + } + IF( psPredictionEncoder->iNumSubSets > 1 ) + { + mvl2l( psPredictionEncoder->ppfPredStateReal_fx[n], psPredictionEncoder->ppfPredStateRealTmp_fx[n], LCLD_BANDS ); + mvl2l( psPredictionEncoder->ppfPredStateImag_fx[n], psPredictionEncoder->ppfPredStateImagTmp_fx[n], LCLD_BANDS ); + } + + QuantizeSpectrumDPCM_Opt( piNumGroups[n], + (const Word32 *) ppiGroupLengths[n], + iNumBands, + piBandwidths, + pppiAlloc[n], + pppfReal_fx[n], + pppfImag_fx[n], + q_final, + pppiQReal[n], + pppiQImag[n], + pppiSignReal[n], + pppiSignImag[n], + psPredictionEncoder->iNumSubSets, + psPredictionEncoder->iSubSetId, + psPredictionEncoder->ppiPredBandEnable[n], + psPredictionEncoder->ppfA1Real_fx[n], + psPredictionEncoder->ppfA1Imag_fx[n], + psPredictionEncoder->ppfPredStateRealTmp_fx[n], + psPredictionEncoder->ppfPredStateImagTmp_fx[n] ); + iBitsUsed = L_add( iBitsUsed, CountLCLDBits( piNumGroups[n], + (const Word32 *) ppiGroupLengths[n], + iNumBands, + piBandwidths, + (const Word32 *) psPredictionEncoder->ppiPredBandEnable[n], + pppiAlloc[n], + pppiQReal[n], + pppiQImag[n] ) ); + } + + IF( LE_32( *piAllocOffset, MIN_ALLOC_OFFSET ) && GT_32( iBitsUsed, iAvailableBits ) ) + { +#ifdef DEBUG_VERBOSE + printf( "Frame can not be coded with the number of bits available\n" ); +#endif + // iLastError = ENC_ERROR_STREAM_FAILURE; + return -1; + } + ELSE IF( GE_32( *piAllocOffset, MAX_ALLOC_OFFSET ) && LT_32( iBitsUsed, iAvailableBits ) ) + { + *piAllocOffset = MAX_ALLOC_OFFSET; + iDone++; + } + ELSE + { + IF( EQ_32( iDelta, 0 ) && GT_32( iBitsUsed, iAvailableBits ) ) + { + iDelta = 1; + } + ELSE IF( EQ_32( iDelta, 0 ) && LT_32( iBitsUsed, iAvailableBits ) ) + { + iDone++; + } + ELSE IF( EQ_32( iBitsUsed, iAvailableBits ) ) + { + iDone++; + } + + IF( GT_32( iBitsUsed, iAvailableBits ) ) + { + *piAllocOffset -= iDelta; + iDelta = L_shr( iDelta, 1 ); + } + ELSE IF( LT_32( iBitsUsed, iAvailableBits ) ) + { + *piAllocOffset += iDelta; + iDelta = L_shr( iDelta, 1 ); + } + } + } + IF( GT_32( psPredictionEncoder->iNumSubSets, 1 ) ) + { + FOR( n = 0; n < iChannels; n++ ) + { + mvl2l( psPredictionEncoder->ppfPredStateRealTmp_fx[n], psPredictionEncoder->ppfPredStateReal_fx[n], LCLD_BANDS ); + mvl2l( psPredictionEncoder->ppfPredStateImagTmp_fx[n], psPredictionEncoder->ppfPredStateImag_fx[n], LCLD_BANDS ); + } + } + return iBitsUsed; +} diff --git a/lib_isar/isar_lcld_prot.h b/lib_isar/isar_lcld_prot.h new file mode 100644 index 0000000000000000000000000000000000000000..00c1859014ae7a13afb5017d758721c0b235eef8 --- /dev/null +++ b/lib_isar/isar_lcld_prot.h @@ -0,0 +1,424 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef ISAR_LCLD_PROT_H +#define ISAR_LCLD_PROT_H + +#include "options.h" +#include "typedef.h" +#include "common_api_types.h" +#include "isar_rom_lcld_tables.h" +/* clang-format off */ + +typedef struct LCLD_ENCODER LCLDEncoder; + +ivas_error CreateLCLDEncoder( + LCLDEncoder **psLCLDEncoder_out, + const Word32 iSampleRate, + const Word32 iChannels, + const Word32 iTargetBitRate, + const Word32 iAllowSidePred, + const Word16 iNumBlocks, + const Word16 iNumSubSets, + const Word32 iRealOnlyOut); + +void DeleteLCLDEncoder( + LCLDEncoder *psLCLDEncoder +); + +Word32 EncodeLCLDFrame( + LCLDEncoder *psLCLDEncoder, + Word32 ***pppfLCLDReal_fx, + Word32 ***pppfLCLDImag_fx, + Word32 *piNumiBites, + const Word32 available_bits, + ISAR_SPLIT_REND_BITS_HANDLE pBits, + Word16 *q_final +); + +Word32 GetNumGroups( + LCLDEncoder *psLCLDEncoder +); + + +typedef struct LCLD_DECODER LCLDDecoder; + +ivas_error CreateLCLDDecoder( + LCLDDecoder **psLCLDDecoder_out, + const Word32 iSampleRate, + const Word32 iChannels, + const Word32 iNumBlocks, + const Word32 iRealOnlyOut + +); + +void DeleteLCLDDecoder( + LCLDDecoder *psLCLDDecoder +); + +Word32 DecodeLCLDFrame( + LCLDDecoder *psLCLDDecoder, + ISAR_SPLIT_REND_BITS_HANDLE pBits, + Word32 ***pppfLCLDReal_fx, + Word32 ***pppfLCLDImag_fx, + Word16 Q_in, + Word16 *Q_out +); + +/*----------------------------------------------------------------------------------* + * MSPred prototypes + *----------------------------------------------------------------------------------*/ + +Word32 quantPhase_fx( + const Word32 phase, + const Word16 exp +); + +void cplxmult_fx( + Word32 *pr1, + Word32 *pi1, + const Word32 r2, + const Word32 i2 +); + +Word32 requantPhase( + Word32 phaseQ +); + +Word32 quantPred_fx( + const Word32 pred, + const Word16 exp +); + +Word32 dequantPred_fx( + const Word32 predQ +); + +Word32 PrepEncode( + Word32 *piQuant, + const Word32 *piMSFlags, + const Word32 numBands +); + +void EncodePhase( + Word32 *phaseQuant, + const Word32 numMSBands, + const Word32 diffDim +); + +void DecodePhase( + Word32 *phaseQuant, + const Word32 numMSBands, + const Word32 diffDim +); + +Word32 EncodePredCoef( + Word32 *predQuant, + const Word32 numMSBands +); + +void DecodePredCoef( + Word32 *phaseQuant, + const Word32 numMSBands +); + +void writeMSPred( + Word32 *phaseQuant, + Word32 *predQuant, + const Word32 MSMode, + const Word32 numMSBands, + Word32 numBands, + void *fid, + Word32 *piMsFlags +); + +Word32 CountMSBits( + Word32 iNumBands, + const Word32 iMSMode, + const Word32 *piMSFlags, + const Word32 *piLRPhaseDiff, + const Word32 *piMSPredCoef +); + + +/*----------------------------------------------------------------------------------* + * NoiseGen prototypes + *----------------------------------------------------------------------------------*/ + +typedef struct NOISE_GEN +{ + Word32 iNoiseBufferLength; + Word32 iNoiseBufferMask; + Word32 iNoiseBufferIndex; + float *pfNoiseBuffer; +} NoiseGen; + +void DeleteNoiseGen( + NoiseGen *psNoiseGen +); + +inline Word32 GetNoise_fx( NoiseGen *psNoiseGen ) +{ + Word32 fNoiseSample; + + fNoiseSample = (Word32) (psNoiseGen->pfNoiseBuffer[psNoiseGen->iNoiseBufferIndex]* (1<<14)); + psNoiseGen->iNoiseBufferIndex++; + psNoiseGen->iNoiseBufferIndex &= psNoiseGen->iNoiseBufferMask; + + return fNoiseSample; +} + + +/*----------------------------------------------------------------------------------* + * PereptualModel prototypes + *----------------------------------------------------------------------------------*/ + +extern void PerceptualModel( + const Word32 iMaxQuantBands, + const Word32 *piRMSEnvelope, + Word32 *piExcitation, + Word32 *piSMR +); + +extern void PerceptualModel_fx( + const Word32 iMaxQuantBands, + const Word32 *piRMSEnvelope, + Word32 *piExcitation, + Word32 *piSMR +); + +extern void PerceptualModelStereo_fx( + const Word32 iMaxQuantBands, + const Word32 *piMSFlags, + const Word32 *piRMSEnvelope0, + const Word32 *piRMSEnvelope1, + Word32 *piExcitation0, + Word32 *piExcitation1, + Word32 *piSMR0, + Word32 *piSMR1 +); + +extern void PerceptualModelStereo( + const Word32 iMaxQuantBands, + const Word32 *piMSFlags, + const Word32 *piRMSEnvelope0, + const Word32 *piRMSEnvelope1, + Word32 *piExcitation0, + Word32 *piExcitation1, + Word32 *piSMR0, + Word32 *piSMR1 +); + + +/*----------------------------------------------------------------------------------* + * PredEncoder/PredDecoder prototypes + *----------------------------------------------------------------------------------*/ + +typedef struct PREDICTION_ENCODER +{ + Word32 iChannels; + Word32 iNumBlocks; + + Word32 iSubSetId; + Word32 iNumSubSets; + Word32 iMaxNumPredBands; + Word32 ***pppfInpBufReal_fx; /* channels, LCLD_PRED_WIN_LEN, bands */ + Word32 ***pppfInpBufImag_fx; + Word32 **ppfPredStateReal_fx; /* channels, bands */ + Word32 **ppfPredStateImag_fx; + Word32 **ppfPredStateRealTmp_fx; + Word32 **ppfPredStateImagTmp_fx; + Word32 **ppfInpPrevReal_fx; /* channels, bands */ + Word32 **ppfInpPrevImag_fx; + Word32 pfRxxReal_fx[2]; + Word32 pfRxxImag_fx[2]; + + Word32 *piPredChanEnable; + Word32 *piNumPredBands; + Word32 **ppiPredBandEnable; + + Word32 **ppfA1Real_fx; + Word32 **ppfA1Imag_fx; + + Word32 **ppiA1Mag; + Word32 **ppiA1Phase; +} PredictionEncoder; + +ivas_error CreatePredictionEncoder_fx( + PredictionEncoder **psPredictionEncoder_out, + const Word32 iChannels, + const Word32 iNumBlocks, + const Word32 iNumSubSets, + const Word32 iMaxNumPredBands +); + +void DeletePredictionEncoder_fx( + PredictionEncoder *psPredictionEncoder +); + +void ComputePredictors_fx( + PredictionEncoder *psPredictionEncoder, + Word32 ***pppfReal_fx, //Q12? + Word32 ***pppfImag_fx //Q12? +); + +Word32 WritePredictors( + PredictionEncoder *psPredictionEncoder, + ISAR_SPLIT_REND_BITS_HANDLE pBits +); + +typedef struct PREDICTION_DECODER +{ + Word32 iChannels; + Word32 iNumBlocks; + Word32 iSubSetId; + Word32 iNumSubSets; + Word32 **ppfPredStateReal_fx; + Word32 **ppfPredStateImag_fx; + + Word32 *piPredChanEnable; + Word32 **ppiPredBandEnable; + + /* PLC_IMPROVEMENT */ + Word32 **ppiDecodingUnresolved; + Word32 **ppiDecodingFailed; + Word32 **ppiDecodingFailedPrev; + Word32 **ppfA1Real_fx; /* Q31 */ + Word32 **ppfA1Imag_fx; /* Q31 */ + + Word32 **ppiA1Mag; + Word32 **ppiA1Phase; + + Word32 pfMagLUT_fx[1 << PRED_QUNAT_FILTER_MAG_BITS]; /* Q31 */ + Word32 pfP2RRealLUT_fx[1 << PRED_QUANT_FILTER_PHASE_BITS]; /* Q31 */ + Word32 pfP2RImagLUT_fx[1 << PRED_QUANT_FILTER_PHASE_BITS]; /* Q31 */ + +} PredictionDecoder; + + +ivas_error CreatePredictionDecoder_fx( + PredictionDecoder **psPredictionDecoder_out, + const Word32 iChannels, + const Word32 iNumBlocks +); + +void DeletePredictionDecoder_fx( + PredictionDecoder *psPredictionDecoder +); + +Word16 ReadPredictors_fx( + PredictionDecoder *psPredictionDecoder, + ISAR_SPLIT_REND_BITS_HANDLE pBits +); + +/* PLC_IMPROVEMENT */ +void UpdatePredictionSubSetId( + PredictionEncoder *psPredictionEncoder +); + +void SetDecodingUnresolved( + LCLDDecoder *psLCLDDecoder +); + +Word16 AnyDecodingFailedPrev( + LCLDDecoder *psLCLDDecoder +); + +Word16 AnyDecodingFailed( + LCLDDecoder *psLCLDDecoder +); + +Word32 **GetDecodingFailedStatus( + LCLDDecoder *psLCLDDecoder +); + +Word16 GetNumSubSets( + LCLDDecoder *psLCLDDecoder +); + +Word32 **GetDecodingFailedPrevStatus( + LCLDDecoder *psLCLDDecoder +); + +void SetDecodingPassed( + PredictionDecoder *psPredictionDecoder +); + +void UpdateDecodingUnresolved( + PredictionDecoder *psPredictionDecoder +); + +void UpdateDecodingFailedStatus( + PredictionDecoder *psPredictionDecoder +); + +Word32 AnyDecodingUnresolved( + PredictionDecoder *psPredictionDecoder +); + +void ApplyInversePredictors_fx( + PredictionDecoder *psPredictionDecoder, + Word32 ***pppfReal, + Word32 ***pppfImag +); + + +/*----------------------------------------------------------------------------------* + * RMSEnvGrouping prototypes + *----------------------------------------------------------------------------------*/ + +typedef struct RMS_ENVELOPE_GROUPING RMSEnvelopeGrouping; + +RMSEnvelopeGrouping *CreateRMSEnvelopeGrouping( + const Word32 iNumBlocks +); + +void DeleteRMSEnvelopeGrouping( + RMSEnvelopeGrouping *psRMSEnvelopeGrouping +); + +void ComputeEnvelopeGrouping( + RMSEnvelopeGrouping *psRMSEnvelopeGrouping, + const Word32 iChannels, + const Word32 iNumBands, + const Word32 *piBandwidths, + Word32 ***pppfReal_fx, + Word32 ***pppfImag_fx, + Word32 *piNumGroups, + Word32 *piGroupLengths, + Word32 ***pppiRMSEnvelope , + Word16 q_final +); + +/* clang-format on */ + +#endif /* _LCLD_ENCODER_H_ */ diff --git a/lib_isar/isar_prot.h b/lib_isar/isar_prot.h new file mode 100644 index 0000000000000000000000000000000000000000..10aaa6db52cdb10e25a11801839c47542a38965e --- /dev/null +++ b/lib_isar/isar_prot.h @@ -0,0 +1,476 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef ISAR_PROT_H +#define ISAR_PROT_H + +#include "isar_stat.h" +#include +#include "options.h" +#include "ivas_error.h" +#include "lib_isar_post_rend.h" +#include "enh64.h" + +/* clang-format off */ +/*----------------------------------------------------------------------------------* + * General ISAR prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error isar_splitBinPreRendOpen( + ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE *hBinHrSplitPreRend, /* i/o: binaural pre-renderer handle */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData /* i/o: pose correction data handle */ +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + , + const Word32 output_Fs +#endif +); + +ivas_error split_renderer_open_lc3plus( + SPLIT_REND_WRAPPER *hSplitRendWrapper, /* i/o: Split renderer pre-renderer handle */ + const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, /* i : Split renderer pre-renderer config */ + const Word32 output_Fs, /* i : output sampling rate */ + const IVAS_RENDER_FRAMESIZE ivas_frame_size /* i : IVAS frame size */ +); + +void isar_splitBinPreRendClose( + ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE *hBinHrSplitPreRend /* i/o: binaural pre-renderer handle */ +); + +void lc3plusTimeAlignCldfbPoseCorr( + SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renderer handle */ + Word32 *Cldfb_In_BinReal_fx[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, real part */ + Word32 *Cldfb_In_BinImag_fx[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, imag. part */ + Word16 *Q_in +); + +ivas_error splitRendLc3plusEncodeAndWrite( + SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renderer handle */ + ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits handle */ + const Word32 available_bits, /* i : available bit-budget */ + Word32 *in[], /* i/o: PCM in/out buffer */ + Word16 Q_sig +); + +/*! r: parameter value */ +Word32 ISAR_SPLIT_REND_BITStream_read_int32( + ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits handle */ + const Word32 bits /* i : number of bits to be read */ +); + +void ISAR_SPLIT_REND_BITStream_write_int32( + ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits handle */ + const Word32 val, /* i : parameter value */ + const Word32 bits /* i : number of bits to be written */ +); + +ivas_error isar_splitBinLCLDEncOpen( + ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc, /* o : ISAR LCLD encoder handle */ + const Word32 iSampleRate, + const Word16 iChannels, + const Word32 iDataRate, + const Word16 iNumBlocks, + const Word16 iNumIterations +); + +ivas_error isar_splitBinRendPLCOpen( + ISAR_SPLIT_REND_PLC_HANDLE *phSplitRendPLC, /* i/o: ISAR PLC handle */ + const Word16 iNumSubSets +); + +void isar_splitBinRendPLCClose( + ISAR_SPLIT_REND_PLC_HANDLE *phSplitRendPLC /* i/o: ISAR PLC handle */ +); + +ivas_error isar_splitBinLCLDDecOpen( + ISAR_BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec, /* i/o: ISAR LCLD decoder handle */ + const Word32 iSampleRate, + const Word16 iChannels, + const Word16 iNumBlocks, + const Word16 iNumIterations +); + +void isar_splitBinLCLDDecClose( + ISAR_BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec /* o : ISAR LCLD decoder handle */ +); + +void isar_splitBinRendPLCsaveState( + ISAR_SPLIT_REND_PLC_HANDLE hSplitRendPLC, + Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const Word16 num_chs, + const Word16 iNumBlocks, + const Word16 iNumIterations +); + +void isar_splitBinRendPLC_xf_fx( + ISAR_SPLIT_REND_PLC_HANDLE hSplitRendPLC, + Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const Word16 num_chs, + const Word16 iNumBlocks, + const Word16 iNumIterations, + Word32 **ppiDecodingFailed, + Word32 **ppiDecodingFailedPrev, + Word16 exp +); + +void isar_splitBinRendPLC( + ISAR_SPLIT_REND_PLC_HANDLE hSplitRendPLC, + Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const Word16 num_chs, + const Word16 iNumBlocks, + const Word16 iNumIterations, + Word32 **ppiDecodingFailed, + Word16 exp +); + +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG +void isar_log_cldfb2wav_data( + float Cldfb_In_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float Cldfb_In_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + HANDLE_CLDFB_FILTER_BANK *cldfbSyn, + const Word16 num_chs, + const Word16 num_freq_bands, + const Word32 output_Fs, + const Word16 start_slot_idx, + const Word16 md_band_idx, + const char *filename +); + +#endif +void isar_splitBinLCLDDecProcess( + ISAR_BIN_HR_SPLIT_LCLD_DEC_HANDLE hSplitBinLCLDDec, /* i/o: ISAR LCLD decoder handle */ + ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits handle */ + Word32 Cldfb_Out_Real_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Binaural signals, real part */ + Word32 Cldfb_Out_Imag_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Binaural signals, imag. part */ + Word16 *Q_cldfb_final, + const Word16 bfi /* i : BFI flag */ +); + +void set_fix_rotation_mat_fx( + Word32 fix_pos_rot_mat[][BINAURAL_CHANNELS][BINAURAL_CHANNELS], + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData /* i/o: pose correction data handle */ +); + +void isar_splitBinLCLDEncClose( + ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc /* i/o: ISAR LCLD encoder handle */ +); + +void isar_splitBinLCLDEncProcess( + ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE hSplitBinLCLDEnc, /* i/o: ISAR LCLD encoder handle */ + Word32 *Cldfb_In_Real_fx[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, real part */ + Word32 *Cldfb_In_Imag_fx[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, imag. part */ + const Word32 available_bits, /* i : available bit-budget */ + ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits handle */ + Word16 *q_final +); + +void set_pose_types_fx( + ISAR_SPLIT_REND_POSE_TYPE pose_type[MAX_HEAD_ROT_POSES - 1],/* o : ISAR pose type */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData /* i/o: pose correction data handle */ +); + +void isar_split_rend_init_huff_cfg( + ISAR_BIN_HR_SPLIT_REND_HUFF_HANDLE pHuff_cfg +); + +ivas_error isar_splitBinPostRendOpen( + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE *hBinHrSplitPostRend, /* i/o: binaural post-renderer handle */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ + const Word32 output_Fs /* i : output sampling rate */ +); + +void isar_splitBinPostRendClose( + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE *hBinHrSplitPostRend /* i/o: binaural post-renderer handle */ +); + +void isar_SplitRenderer_getdiagdiff( + Word16 in_idx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 out_idx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + const Word16 sign, + const Word16 min_val, + const Word16 max_val +); + +void isar_split_rend_get_quant_params_fx( + const Word16 num_md_bands, + Word16 pred_real_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word16 pred_imag_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word16 pred_quant_pnts_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word32 pred_quantstep_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word32 pred_1byquantstep_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word16 d_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word16 bands_pitch[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word16 pred_real_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word16 pred_imag_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + const Word16 ro_flag, + Word16 *num_quant_strats +); + +void isar_splitBinPostRendMdDec_fx( + ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits handle */ + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinHrSplitPostRend, /* i/o: binaural post-renderer handle */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData /* i/o: pose correction data handle */ +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + , + BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend /* i/o: binaural pre-renderer handle */ +#endif +); + +void Quat2EulerDegree( + const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ + float *yaw, /* o : yaw */ + float *pitch, /* o : pitch */ + float *roll /* o : roll */ +); + +void isar_mat_mult_2by2_complex_fx( + Word32 in_re1_fx[2][2], + Word16 exp_re1, + Word32 in_im1_fx[2][2], + Word16 exp_im1, + Word32 in_re2_fx[2][2], + Word16 exp_re2, + Word32 in_im2_fx[2][2], + Word16 exp_im2, + Word32 out_re2_fx[2][2], + Word16 *final_exp_re_1, + Word32 out_im2_fx[2][2], + Word16 *final_exp_im_1 +); + +void isar_rend_CldfbSplitPostRendProcess( + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinHrSplitPostRend, /* i/o: binaural post-renderer handle */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ + const IVAS_QUATERNION QuaternionPost, + Word32 Cldfb_RealBuffer_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_ImagBuffer_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + Word16 Q_cldfb_in, + Word32 output_fx[][L_FRAME48k], + Word16 *Q_out, + const Word16 cldfb_in_flag +); + +void isar_rend_CldfbSplitPreRendProcess( + const ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, /* i : binaural pre-renderer handle */ + const IVAS_QUATERNION headPosition, /* i : head rotation QUATERNION */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ + Word32* Cldfb_In_BinReal_fx[][CLDFB_NO_COL_MAX], /* i : Binaural signals, real part */ + Word16 exp_cldfb_re, + Word32* Cldfb_In_BinImag_fx[][CLDFB_NO_COL_MAX], /* i : Binaural signals, imag. part */ + Word16 exp_cldfb_im, + ISAR_SPLIT_REND_BITS_HANDLE pBits, + const Word32 target_md_bits, + const Word16 low_res_pre_rend_rot, + const Word16 ro_md_flag +); + +ivas_error isar_renderMultiTDBinToSplitBinaural( + SPLIT_REND_WRAPPER *hSplitBin, + const IVAS_QUATERNION headPosition, + const Word32 SplitRendBitRate, + const Word16 isar_frame_size_ms, + const Word16 codec_frame_size_ms, + ISAR_SPLIT_REND_BITS_HANDLE pBits, + const Word16 max_bands, + // float *in[], + Word32 *in_fx[], // Q11 + Word16 Q_sig, + const Word16 low_res_pre_rend_rot, + const Word16 pcm_out_flag, + const Word16 ro_md_flag +); + +void isar_init_multi_bin_pose_data_fx( + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData /* i/o: pose correction data handle */ +); + +void isar_renderSplitGetMultiBinPoseData_fx( + const ISAR_SPLIT_REND_CONFIG_DATA *pSplit_rend_config, /* i : Split renderer pre-renderer config */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ + const ISAR_SPLIT_REND_ROT_AXIS rot_axis /* i : external control for rotation axis for split rendering */ +); + +Word16 isar_renderSplitGetRot_axisNumBits( + const Word16 dof +); + +ISAR_SPLIT_REND_ROT_AXIS isar_renderSplitGetRot_axisFromCode( + const Word16 dof, + const Word16 code +); + +Word16 isar_renderSplitGetCodeFromRot_axis( + const Word16 dof, + const ISAR_SPLIT_REND_ROT_AXIS rot_axis, + Word16 *num_bits +); + +void isar_init_split_post_rend_handles( + ISAR_SPLIT_POST_REND_WRAPPER *hSplitRendWrapper /* i/o: Split renderer post-renderer handle */ +); + +void isar_set_split_rend_ht_setup_fx( + SPLIT_REND_WRAPPER *hSplitrend, /* i/o: Split renderer pre-renderer handle */ + IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES], /* i/o: External orientation in quaternions */ + Word32 Rmat_fx[MAX_PARAM_SPATIAL_SUBFRAMES][3][3] /* o : real-space rotation matrix */ +); + +Word32 isar_get_lc3plus_bitrate( + const Word32 SplitRendBitRate, /* i : ISAR bitrate */ + const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode, /* i : ISAR pose correction mode */ + const Word32 nChannels, /* i : number of channels */ + const Word32 lc3plus_frame_duration_us /* i : ISAR frame length in us */ +); + +ivas_error isar_split_rend_validate_config( + const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, /* i : Split renderer pre-renderer config */ + const Word16 is_pcm_out /* i : flag to indicate PCM output */ +); + +/*! r: LCLD codec bitrate */ +Word32 isar_get_lcld_bitrate( + const Word32 SplitRendBitRate, /* i : ISAR bitrate */ + const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode /* i : ISAR pose correction mode */ +); + +/*! r: ISAR MD bitrate */ +Word32 isar_get_split_rend_md_target_brate( + const Word32 SplitRendBitRate, /* i : ISAR bitrate */ + const Word16 pcm_out_flag /* i : flag to indicate PCM output */ +); + +ivas_error isar_framesize_to_ms( + const IVAS_RENDER_FRAMESIZE frame_size, /* i : frame size enum */ + Word16 *ms /* o : frame size in ms */ +); + +ivas_error isar_split_rend_choose_default_codec( + ISAR_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ + Word16 *pIsar_frame_size_ms, /* i/o: pointer to ISAR frame size setting */ + Word16 *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ + const Word16 cldfb_in_flag, /* i : flag indicating rendering in TD */ + const Word16 pcm_out_flag, /* i : flag to indicate PCM output */ + const Word16 num_subframes /* i : number of subframes */ +); + +void isar_renderSplitUpdateNoCorrectionPoseData( + const ISAR_SPLIT_REND_CONFIG_DATA *pSplit_rend_config, /* i : Split renderer pre-renderer config */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData /* i/o: pose correction data handle */ +); + +Word32 get_bit( + const Word32 state, + const Word32 bit_id +); + +/*! r: ISAR audio type */ +ISAR_POST_REND_AudioConfigType isar_getAudioConfigType( + const IVAS_AUDIO_CONFIG config /* i : audio configuration */ +); + +void isar_init_split_rend_handles( + SPLIT_REND_WRAPPER *hSplitRendWrapper /* i/o: Split renderer pre-renderer handle */ +); + +/*----------------------------------------------------------------------------------* + * BASOP-only + *----------------------------------------------------------------------------------*/ + +/* Copy for encoder, to be removed */ +void isar_init_multi_bin_pose_data_fx_enc( + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData +); + + +Word16 wrap_a( + Word16 val, + const Word16 min_val, + const Word16 max_val +); + +void isar_renderSplitGetMultiBinPoseData( + const ISAR_SPLIT_REND_CONFIG_DATA *pSplit_rend_config, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const ISAR_SPLIT_REND_ROT_AXIS rot_axis +); + + +void isar_SplitRenderer_PostRenderer( + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinPostRenderer, /* i/o: binaural renderer handle */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + Word32 Cldfb_RealBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ + Word32 Cldfb_ImagBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ + const IVAS_QUATERNION Quaternion_act, + Word16 *Q_in +); + +void ivas_cmult_fix( + Word32 in1_re_fx, + Word16 exp_re1, + Word32 in1_im_fx, + Word16 exp_im1, + Word32 in2_re_fx, + Word16 exp_re2, + Word32 in2_im_fx, + Word16 exp_im2, + Word32 *out1_re_fx, + Word32 *out1_im_fx, + Word16 *exp_out1_re, + Word16 *exp_out1_im +); + +void ivas_calculate_abs_fx( + Word32 re_fx, + Word16 exp_re, + Word32 im_fx, + Word16 exp_im, + Word32 *out_fx, + Word16 *exp_out +); + +void ivas_calculate_rabs_fx( + Word32 re_fx, + Word16 exp_re, + Word32 *out_fx, + Word16 *exp_out +); + +#ifdef SPLIT_POSE_CORRECTION_DEBUG +#define IVAS_CALCULATE_ABS( re, im, out ) \ + out = sqrtf( ( re * re ) + ( im * im ) ); +#endif + +/* clang-format on */ + +#endif /* IVAS_PROT_REND_H */ diff --git a/lib_isar/isar_rom_lcld_tables.c b/lib_isar/isar_rom_lcld_tables.c new file mode 100644 index 0000000000000000000000000000000000000000..5fd334447fa8e2aa60061ae8d0ef5a8add1eda91 --- /dev/null +++ b/lib_isar/isar_rom_lcld_tables.c @@ -0,0 +1,20999 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "isar_rom_lcld_tables.h" +#include "options.h" +#include "wmc_auto.h" +#include "prot_fx.h" +#include "isar_lcld_prot.h" +#include + +/*----------------------------------------------------------------------* + * ISAR binaural rendering LCLD ROM tables + *-----------------------------------------------------------------------*/ + +const Word32 c_aiNumLcldBandsPerBand[MAX_BANDS_48] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 21, 24, 27, 31, 37, 43, 50, 60 +}; + +const Word32 c_aiBandIdPerLcldBand[LCLD_BANDS] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, + 18, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22 +}; + +const Word32 c_afRotRealImag_fx[PHASE_MAX_VAL - PHASE_MIN_VAL + 1][2] = /*Q31*/ + { + { + -2147483647, + 0, + }, + { + -2074309888, + -555809664, + }, + { + -1859775360, + -1073741824, + }, + { + -1518500224, + -1518500224, + }, + { + -1073741824, + -1859775360, + }, + { + -555809664, + -2074309888, + }, + { + 0, + -2147483647, + }, + { + 555809664, + -2074309888, + }, + { + 1073741824, + -1859775360, + }, + { + 1518500224, + -1518500224, + }, + { + 1859775360, + -1073741824, + }, + { + 2074309888, + -555809664, + }, + { + 2147483647, + 0, + }, + { + 2074309888, + 555809664, + }, + { + 1859775360, + 1073741824, + }, + { + 1518500224, + 1518500224, + }, + { + 1073741824, + 1859775360, + }, + { + 555809664, + 2074309888, + }, + { + 0, + 2147483647, + }, + { + -555809664, + 2074309888, + }, + { + -1073741824, + 1859775360, + }, + { + -1518500224, + 1518500224, + }, + { + -1859775360, + 1073741824, + }, + { + -2074309888, + 555809664, + }, + { + -2147483647, + 0, + }, + + }; + +/* Move this to perceptual model ? */ +const Word32 c_aiBandwidths48[MAX_BANDS_48] = { + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 4, + 6, + 6, + 7, + 10, +}; + +const Word32 c_afScaleFactor_fx[ALLOC_TABLE_SIZE] = { + // Q24 + 0, + 5931641, + 7053950, + 8388608, + 9975792, + 11863283, + 14107901, + 16777216, + 19951584, + 23726566, + 28215802, + 33554432, + 39903168, + 47453132, + 56431604, + 67108864, + 79806336, + 94906264, + 112863208, + 134217728, + 159612672, + 189812528, + 225726416, + 268435456, + 319225344, + 379625056, + 451452832, + 536870912, + 638450688, + 759250112, + 902905664, + 1073741824, +}; + +const Word32 c_afInvScaleFactor_fx[ALLOC_TABLE_SIZE] = { + // Q29 + 0, + 1271049216, + 1098656512, + 953429056, + 824873408, + 710310720, + 608222976, + 518509920, + 440957952, + 373180800, + 315573664, + 266180592, + 224478672, + 189073424, + 159021648, + 133895608, + 112641984, + 94778304, + 79738992, + 67055176, + 56401524, + 47453132, + 39903168, + 33554432, + 28215802, + 23726566, + 19951584, + 16777216, + 14107901, + 11863283, + 9975792, + 8388608, +}; + +const Word16 c_afRMSEnvReconstructTable_exp[ENV_RECONSTRUCT_TABLE_SIZE] = { + 62, 62, 61, 61, 60, 60, 59, 59, 58, 58, 57, 57, 56, 56, 55, 55, 54, 54, 53, 53, 52, 52, 51, 51, 50, 50, 49, 49, 48, 48, 47, 47, 46, 46, 45, 45, 44, 44, 43, 43, 42, 42, 41, 41, 40, 40, 39, 39, 38, 38, 37, 37, 36, 36, 35, 35, 34, 34, 33, 33, 32, 32, 31, 31, 30, 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 17, 17, 16, 16, 15, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0, -1, -1, -2 +}; + +const Word32 c_aiQuantMaxValues_fx[ALLOC_TABLE_SIZE] = { + // Q21 + 0, + 6291456, + 6291456, + 8388608, + 10485760, + 10485760, + 12582912, + 14680064, + 16777216, + 18874368, + 25165824, + 27262976, + 33554432, + 35651584, + 39845888, + 48234496, + 54525952, + 54525952, + 56623104, + 58720256, + 65011712, + 75497472, + 79691776, + 94371840, + 113246208, + 134217728, + 159383552, + 188743680, + 226492416, + 268435456, + 318767104, + 377487360, +}; + +const Word32 c_aiQuantMaxValues[ALLOC_TABLE_SIZE] = { + 0, + 3, + 3, + 4, + 5, + 5, + 6, + 7, + 8, + 9, + 12, + 13, + 16, + 17, + 19, + 23, + 26, + 26, + 27, + 28, + 31, + 36, + 38, + 45, + 54, + 64, + 76, + 90, + 108, + 128, + 152, + 180, +}; + +const Word32 c_aiHuffmanDim_fx[ALLOC_TABLE_SIZE] = { + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, +}; + +const Word32 c_aiHuffmanMod_fx[ALLOC_TABLE_SIZE] = { + 0, + 4, + 4, + 5, + 6, + 6, + 7, + 8, + 9, + 10, + 13, + 14, + 17, + 18, + 20, + 24, + 27, + 27, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, +}; + +const Word32 c_aiHuffmanDim[ALLOC_TABLE_SIZE] = { + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, +}; + +const Word32 c_aiHuffmanMod[ALLOC_TABLE_SIZE] = { + 0, + 4, + 4, + 5, + 6, + 6, + 7, + 8, + 9, + 10, + 13, + 14, + 17, + 18, + 20, + 24, + 27, + 27, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, +}; +const Word32 c_aiHuffmanSize[ALLOC_TABLE_SIZE] = { + 1, + 16, + 16, + 25, + 36, + 36, + 49, + 64, + 81, + 100, + 169, + 196, + 289, + 324, + 400, + 576, + 729, + 729, + 28, + 29, + 32, + 37, + 39, + 46, + 55, + 65, + 77, + 91, + 109, + 129, + 153, + 181, +}; + +const UWord32 c_aaiRMSEnvHuffEnc[64][2] = { + { 0x0014, 0x0000 }, + { 0x0014, 0x0001 }, + { 0x0014, 0x0002 }, + { 0x0014, 0x0003 }, + { 0x0014, 0x0004 }, + { 0x0014, 0x0005 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0012, 0x000b }, + { 0x000d, 0x0002 }, + { 0x000e, 0x0001 }, + { 0x000e, 0x0002 }, + { 0x000d, 0x0003 }, + { 0x000b, 0x0002 }, + { 0x000a, 0x0003 }, + { 0x000a, 0x0004 }, + { 0x000a, 0x0005 }, + { 0x0009, 0x0004 }, + { 0x0009, 0x0005 }, + { 0x0009, 0x0006 }, + { 0x0008, 0x0005 }, + { 0x0008, 0x0006 }, + { 0x0007, 0x0004 }, + { 0x0006, 0x0003 }, + { 0x0006, 0x0004 }, + { 0x0005, 0x0003 }, + { 0x0004, 0x0002 }, + { 0x0003, 0x0002 }, + { 0x0002, 0x0002 }, + { 0x0002, 0x0003 }, + { 0x0003, 0x0003 }, + { 0x0004, 0x0003 }, + { 0x0006, 0x0005 }, + { 0x0007, 0x0005 }, + { 0x0008, 0x0007 }, + { 0x0009, 0x0007 }, + { 0x0009, 0x0008 }, + { 0x0009, 0x0009 }, + { 0x000a, 0x0006 }, + { 0x000a, 0x0007 }, + { 0x000b, 0x0003 }, + { 0x000c, 0x0002 }, + { 0x000c, 0x0003 }, + { 0x000b, 0x0004 }, + { 0x000b, 0x0005 }, + { 0x000e, 0x0003 }, + { 0x0010, 0x0003 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0013, 0x000a }, + { 0x0013, 0x000b }, + { 0x0013, 0x000c }, + { 0x0013, 0x000d }, + { 0x0013, 0x000e }, + { 0x0013, 0x000f }, + { 0x0013, 0x0010 }, + { 0x0013, 0x0011 }, + { 0x0013, 0x0012 }, + { 0x0013, 0x0013 }, + { 0x0013, 0x0014 }, + { 0x0013, 0x0015 }, +}; + +const UWord32 c_aaiRMSEnvHuffDec[13][HUFF_DEC_TABLE_SIZE] = { + { + 0x0002ffff, + 0x0001ffff, + 0x0000001d, + 0x00000022, + 0x0001001e, + 0x0001001e, + 0x00010021, + 0x00010021, + 0x0002001f, + 0x0002001f, + 0x0002001f, + 0x0002001f, + 0x00020020, + 0x00020020, + 0x00020020, + 0x00020020, + }, + { + 0x0002001b, + 0x0002001b, + 0x0002001b, + 0x0002001b, + 0x00020023, + 0x00020023, + 0x00020023, + 0x00020023, + 0x0003001c, + 0x0003001c, + 0x0003001c, + 0x0003001c, + 0x0003001c, + 0x0003001c, + 0x0003001c, + 0x0003001c, + }, + { + 0x0006ffff, + 0x0007ffff, + 0x0003ffff, + 0x0004ffff, + 0x0005ffff, + 0x00000017, + 0x00000018, + 0x00000025, + 0x00010019, + 0x00010019, + 0x00010024, + 0x00010024, + 0x0002001a, + 0x0002001a, + 0x0002001a, + 0x0002001a, + }, + { + 0x00030014, + 0x00030014, + 0x00030014, + 0x00030014, + 0x00030014, + 0x00030014, + 0x00030014, + 0x00030014, + 0x00030015, + 0x00030015, + 0x00030015, + 0x00030015, + 0x00030015, + 0x00030015, + 0x00030015, + 0x00030015, + }, + { + 0x00030016, + 0x00030016, + 0x00030016, + 0x00030016, + 0x00030016, + 0x00030016, + 0x00030016, + 0x00030016, + 0x00030026, + 0x00030026, + 0x00030026, + 0x00030026, + 0x00030026, + 0x00030026, + 0x00030026, + 0x00030026, + }, + { + 0x00030027, + 0x00030027, + 0x00030027, + 0x00030027, + 0x00030027, + 0x00030027, + 0x00030027, + 0x00030027, + 0x00030028, + 0x00030028, + 0x00030028, + 0x00030028, + 0x00030028, + 0x00030028, + 0x00030028, + 0x00030028, + }, + { + 0x0009ffff, + 0x0008ffff, + 0x0000002c, + 0x0000002d, + 0x00010010, + 0x00010010, + 0x0001002b, + 0x0001002b, + 0x0001002e, + 0x0001002e, + 0x0001002f, + 0x0001002f, + 0x00020011, + 0x00020011, + 0x00020011, + 0x00020011, + }, + { + 0x00020012, + 0x00020012, + 0x00020012, + 0x00020012, + 0x00020013, + 0x00020013, + 0x00020013, + 0x00020013, + 0x00020029, + 0x00020029, + 0x00020029, + 0x00020029, + 0x0002002a, + 0x0002002a, + 0x0002002a, + 0x0002002a, + }, + { + 0x0003000c, + 0x0003000c, + 0x0003000c, + 0x0003000c, + 0x0003000c, + 0x0003000c, + 0x0003000c, + 0x0003000c, + 0x0003000f, + 0x0003000f, + 0x0003000f, + 0x0003000f, + 0x0003000f, + 0x0003000f, + 0x0003000f, + 0x0003000f, + }, + { + 0x000bffff, + 0x000cffff, + 0x000affff, + 0x00000031, + 0x0002000d, + 0x0002000d, + 0x0002000d, + 0x0002000d, + 0x0002000e, + 0x0002000e, + 0x0002000e, + 0x0002000e, + 0x00020030, + 0x00020030, + 0x00020030, + 0x00020030, + }, + { + 0x0001003a, + 0x0001003a, + 0x0001003b, + 0x0001003b, + 0x0001003c, + 0x0001003c, + 0x0001003d, + 0x0001003d, + 0x0001003e, + 0x0001003e, + 0x0001003f, + 0x0001003f, + 0x0002000b, + 0x0002000b, + 0x0002000b, + 0x0002000b, + }, + { + 0x00000000, + 0x00000001, + 0x00000002, + 0x00000003, + 0x00000004, + 0x00000005, + 0x00010006, + 0x00010006, + 0x00010007, + 0x00010007, + 0x00010008, + 0x00010008, + 0x00010009, + 0x00010009, + 0x0001000a, + 0x0001000a, + }, + { + 0x00010032, + 0x00010032, + 0x00010033, + 0x00010033, + 0x00010034, + 0x00010034, + 0x00010035, + 0x00010035, + 0x00010036, + 0x00010036, + 0x00010037, + 0x00010037, + 0x00010038, + 0x00010038, + 0x00010039, + 0x00010039, + }, +}; + +const UWord16 c_aauiLCLDHuffEnc1[16][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0005, 0x0001 }, + { 0x000b, 0x0000 }, + { 0x0002, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x000b, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x0008, 0x0001 }, + { 0x000b, 0x0002 }, + { 0x000b, 0x0003 }, + { 0x000b, 0x0004 }, + { 0x000b, 0x0005 }, + { 0x000b, 0x0006 }, + { 0x000b, 0x0007 }, +}; + +const UWord16 c_aauiLCLDHuffEnc2[16][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0005, 0x0001 }, + { 0x000c, 0x0000 }, + { 0x0002, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x000c, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x0008, 0x0001 }, + { 0x0009, 0x0001 }, + { 0x000c, 0x0002 }, + { 0x000c, 0x0003 }, + { 0x000c, 0x0004 }, + { 0x000c, 0x0005 }, + { 0x000b, 0x0003 }, +}; + +const UWord16 c_aauiLCLDHuffEnc3[25][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x000d, 0x0000 }, + { 0x000d, 0x0001 }, + { 0x0002, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x000d, 0x0002 }, + { 0x000d, 0x0003 }, + { 0x0006, 0x0002 }, + { 0x0006, 0x0003 }, + { 0x0008, 0x0001 }, + { 0x000d, 0x0004 }, + { 0x000d, 0x0005 }, + { 0x0009, 0x0001 }, + { 0x000c, 0x0007 }, + { 0x000d, 0x0006 }, + { 0x000d, 0x0007 }, + { 0x000d, 0x0008 }, + { 0x000d, 0x0009 }, + { 0x000d, 0x000a }, + { 0x000d, 0x000b }, + { 0x000d, 0x000c }, + { 0x000d, 0x000d }, + +}; + +const UWord16 c_aauiLCLDHuffEnc4[36][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x000b, 0x0001 }, + { 0x0010, 0x0000 }, + { 0x0010, 0x0001 }, + { 0x0002, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x000a, 0x0001 }, + { 0x0010, 0x0002 }, + { 0x0010, 0x0003 }, + { 0x0006, 0x0002 }, + { 0x0006, 0x0003 }, + { 0x0008, 0x0001 }, + { 0x000e, 0x0006 }, + { 0x0010, 0x0004 }, + { 0x0010, 0x0005 }, + { 0x000a, 0x0002 }, + { 0x000a, 0x0003 }, + { 0x000e, 0x0007 }, + { 0x0010, 0x0006 }, + { 0x0010, 0x0007 }, + { 0x0010, 0x0008 }, + { 0x0010, 0x0009 }, + { 0x0010, 0x000a }, + { 0x0010, 0x000b }, + { 0x0010, 0x000c }, + { 0x0010, 0x000d }, + { 0x0010, 0x000e }, + { 0x0010, 0x000f }, + { 0x0010, 0x0010 }, + { 0x0010, 0x0011 }, + { 0x000f, 0x0009 }, + { 0x000f, 0x000a }, + { 0x000f, 0x000b }, + +}; + +const UWord16 c_aauiLCLDHuffEnc5[36][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x000a, 0x0001 }, + { 0x000f, 0x0003 }, + { 0x0012, 0x0000 }, + { 0x0002, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x000b, 0x0001 }, + { 0x0011, 0x0008 }, + { 0x0012, 0x0001 }, + { 0x0006, 0x0002 }, + { 0x0006, 0x0003 }, + { 0x0008, 0x0001 }, + { 0x000c, 0x0001 }, + { 0x0012, 0x0002 }, + { 0x0012, 0x0003 }, + { 0x000a, 0x0002 }, + { 0x000a, 0x0003 }, + { 0x000d, 0x0001 }, + { 0x0012, 0x0004 }, + { 0x0012, 0x0005 }, + { 0x0012, 0x0006 }, + { 0x0011, 0x0009 }, + { 0x0011, 0x000a }, + { 0x0012, 0x0007 }, + { 0x0012, 0x0008 }, + { 0x0012, 0x0009 }, + { 0x0012, 0x000a }, + { 0x0012, 0x000b }, + { 0x0012, 0x000c }, + { 0x0012, 0x000d }, + { 0x0012, 0x000e }, + { 0x0012, 0x000f }, + { 0x0011, 0x000b }, + +}; + +const UWord16 c_aauiLCLDHuffEnc6[49][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x000a, 0x0001 }, + { 0x0010, 0x0003 }, + { 0x0014, 0x0000 }, + { 0x0014, 0x0001 }, + { 0x0002, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x000a, 0x0002 }, + { 0x0010, 0x0004 }, + { 0x0014, 0x0002 }, + { 0x0014, 0x0003 }, + { 0x0006, 0x0002 }, + { 0x0006, 0x0003 }, + { 0x0008, 0x0001 }, + { 0x000d, 0x0001 }, + { 0x0012, 0x0007 }, + { 0x0014, 0x0004 }, + { 0x0014, 0x0005 }, + { 0x000a, 0x0003 }, + { 0x000b, 0x0001 }, + { 0x000c, 0x0001 }, + { 0x0011, 0x0004 }, + { 0x0014, 0x0006 }, + { 0x0014, 0x0007 }, + { 0x0014, 0x0008 }, + { 0x0010, 0x0005 }, + { 0x000f, 0x0003 }, + { 0x0011, 0x0005 }, + { 0x0014, 0x0009 }, + { 0x0014, 0x000a }, + { 0x0014, 0x000b }, + { 0x0014, 0x000c }, + { 0x0014, 0x000d }, + { 0x0013, 0x000d }, + { 0x0014, 0x000e }, + { 0x0014, 0x000f }, + { 0x0014, 0x0010 }, + { 0x0014, 0x0011 }, + { 0x0014, 0x0012 }, + { 0x0014, 0x0013 }, + { 0x0014, 0x0014 }, + { 0x0014, 0x0015 }, + { 0x0014, 0x0016 }, + { 0x0014, 0x0017 }, + { 0x0014, 0x0018 }, + { 0x0014, 0x0019 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc7[64][2] = { + { 0x0002, 0x0001 }, + { 0x0002, 0x0002 }, + { 0x0005, 0x0001 }, + { 0x0009, 0x0001 }, + { 0x000f, 0x0002 }, + { 0x0015, 0x0000 }, + { 0x0015, 0x0001 }, + { 0x0015, 0x0002 }, + { 0x0002, 0x0003 }, + { 0x0003, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x0009, 0x0002 }, + { 0x000f, 0x0003 }, + { 0x0014, 0x0011 }, + { 0x0015, 0x0003 }, + { 0x0015, 0x0004 }, + { 0x0005, 0x0002 }, + { 0x0005, 0x0003 }, + { 0x0007, 0x0001 }, + { 0x000b, 0x0001 }, + { 0x0010, 0x0002 }, + { 0x0015, 0x0005 }, + { 0x0015, 0x0006 }, + { 0x0015, 0x0007 }, + { 0x000a, 0x0001 }, + { 0x0009, 0x0003 }, + { 0x000c, 0x0001 }, + { 0x000f, 0x0004 }, + { 0x0012, 0x0006 }, + { 0x0015, 0x0008 }, + { 0x0015, 0x0009 }, + { 0x0015, 0x000a }, + { 0x000f, 0x0005 }, + { 0x000e, 0x0003 }, + { 0x0010, 0x0003 }, + { 0x0012, 0x0007 }, + { 0x0014, 0x0012 }, + { 0x0015, 0x000b }, + { 0x0015, 0x000c }, + { 0x0015, 0x000d }, + { 0x0014, 0x0013 }, + { 0x0014, 0x0014 }, + { 0x0013, 0x000b }, + { 0x0014, 0x0015 }, + { 0x0015, 0x000e }, + { 0x0015, 0x000f }, + { 0x0015, 0x0010 }, + { 0x0015, 0x0011 }, + { 0x0015, 0x0012 }, + { 0x0015, 0x0013 }, + { 0x0015, 0x0014 }, + { 0x0015, 0x0015 }, + { 0x0015, 0x0016 }, + { 0x0015, 0x0017 }, + { 0x0015, 0x0018 }, + { 0x0015, 0x0019 }, + { 0x0015, 0x001a }, + { 0x0015, 0x001b }, + { 0x0015, 0x001c }, + { 0x0015, 0x001d }, + { 0x0015, 0x001e }, + { 0x0015, 0x001f }, + { 0x0015, 0x0020 }, + { 0x0015, 0x0021 }, +}; + +const UWord16 c_aauiLCLDHuffEnc8[81][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x000a, 0x0001 }, + { 0x000f, 0x0002 }, + { 0x0014, 0x0008 }, + { 0x0017, 0x0000 }, + { 0x0017, 0x0001 }, + { 0x0017, 0x0002 }, + { 0x0003, 0x0002 }, + { 0x0003, 0x0003 }, + { 0x0005, 0x0001 }, + { 0x0009, 0x0001 }, + { 0x000f, 0x0003 }, + { 0x0012, 0x0004 }, + { 0x0015, 0x000d }, + { 0x0017, 0x0003 }, + { 0x0017, 0x0004 }, + { 0x0005, 0x0002 }, + { 0x0005, 0x0003 }, + { 0x0007, 0x0001 }, + { 0x000c, 0x0001 }, + { 0x0010, 0x0002 }, + { 0x0013, 0x0005 }, + { 0x0017, 0x0005 }, + { 0x0017, 0x0006 }, + { 0x0017, 0x0007 }, + { 0x0009, 0x0002 }, + { 0x0009, 0x0003 }, + { 0x000b, 0x0001 }, + { 0x000f, 0x0004 }, + { 0x0012, 0x0005 }, + { 0x0016, 0x0015 }, + { 0x0017, 0x0008 }, + { 0x0017, 0x0009 }, + { 0x0017, 0x000a }, + { 0x000f, 0x0005 }, + { 0x000e, 0x0003 }, + { 0x0010, 0x0003 }, + { 0x0012, 0x0006 }, + { 0x0014, 0x0009 }, + { 0x0017, 0x000b }, + { 0x0017, 0x000c }, + { 0x0017, 0x000d }, + { 0x0017, 0x000e }, + { 0x0013, 0x0006 }, + { 0x0012, 0x0007 }, + { 0x0013, 0x0007 }, + { 0x0015, 0x000e }, + { 0x0017, 0x000f }, + { 0x0017, 0x0010 }, + { 0x0017, 0x0011 }, + { 0x0017, 0x0012 }, + { 0x0017, 0x0013 }, + { 0x0016, 0x0016 }, + { 0x0016, 0x0017 }, + { 0x0015, 0x000f }, + { 0x0016, 0x0018 }, + { 0x0017, 0x0014 }, + { 0x0017, 0x0015 }, + { 0x0017, 0x0016 }, + { 0x0017, 0x0017 }, + { 0x0017, 0x0018 }, + { 0x0017, 0x0019 }, + { 0x0017, 0x001a }, + { 0x0017, 0x001b }, + { 0x0017, 0x001c }, + { 0x0017, 0x001d }, + { 0x0017, 0x001e }, + { 0x0017, 0x001f }, + { 0x0017, 0x0020 }, + { 0x0017, 0x0021 }, + { 0x0017, 0x0022 }, + { 0x0017, 0x0023 }, + { 0x0017, 0x0024 }, + { 0x0017, 0x0025 }, + { 0x0017, 0x0026 }, + { 0x0017, 0x0027 }, + { 0x0017, 0x0028 }, + { 0x0017, 0x0029 }, + { 0x0016, 0x0019 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc9[100][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x0009, 0x0001 }, + { 0x000d, 0x0002 }, + { 0x0011, 0x0004 }, + { 0x0014, 0x000a }, + { 0x0017, 0x0000 }, + { 0x0017, 0x0001 }, + { 0x0017, 0x0002 }, + { 0x0003, 0x0002 }, + { 0x0003, 0x0003 }, + { 0x0005, 0x0001 }, + { 0x0009, 0x0002 }, + { 0x000d, 0x0003 }, + { 0x0010, 0x0004 }, + { 0x0013, 0x0007 }, + { 0x0016, 0x0018 }, + { 0x0017, 0x0003 }, + { 0x0017, 0x0004 }, + { 0x0005, 0x0002 }, + { 0x0005, 0x0003 }, + { 0x0008, 0x0002 }, + { 0x000b, 0x0002 }, + { 0x000e, 0x0002 }, + { 0x0011, 0x0005 }, + { 0x0014, 0x000b }, + { 0x0016, 0x0019 }, + { 0x0017, 0x0005 }, + { 0x0017, 0x0006 }, + { 0x0009, 0x0003 }, + { 0x0008, 0x0003 }, + { 0x000b, 0x0003 }, + { 0x000d, 0x0004 }, + { 0x0010, 0x0005 }, + { 0x0012, 0x0006 }, + { 0x0015, 0x000f }, + { 0x0017, 0x0007 }, + { 0x0017, 0x0008 }, + { 0x0017, 0x0009 }, + { 0x000d, 0x0005 }, + { 0x000c, 0x0003 }, + { 0x000e, 0x0003 }, + { 0x0010, 0x0006 }, + { 0x0012, 0x0007 }, + { 0x0014, 0x000c }, + { 0x0017, 0x000a }, + { 0x0016, 0x001a }, + { 0x0017, 0x000b }, + { 0x0017, 0x000c }, + { 0x0011, 0x0006 }, + { 0x0010, 0x0007 }, + { 0x0011, 0x0007 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0015, 0x0010 }, + { 0x0017, 0x000d }, + { 0x0017, 0x000e }, + { 0x0017, 0x000f }, + { 0x0017, 0x0010 }, + { 0x0013, 0x000a }, + { 0x0013, 0x000b }, + { 0x0014, 0x000d }, + { 0x0015, 0x0011 }, + { 0x0017, 0x0011 }, + { 0x0016, 0x001b }, + { 0x0017, 0x0012 }, + { 0x0017, 0x0013 }, + { 0x0017, 0x0014 }, + { 0x0017, 0x0015 }, + { 0x0017, 0x0016 }, + { 0x0015, 0x0012 }, + { 0x0015, 0x0013 }, + { 0x0017, 0x0017 }, + { 0x0016, 0x001c }, + { 0x0017, 0x0018 }, + { 0x0017, 0x0019 }, + { 0x0017, 0x001a }, + { 0x0017, 0x001b }, + { 0x0017, 0x001c }, + { 0x0017, 0x001d }, + { 0x0017, 0x001e }, + { 0x0017, 0x001f }, + { 0x0017, 0x0020 }, + { 0x0017, 0x0021 }, + { 0x0017, 0x0022 }, + { 0x0017, 0x0023 }, + { 0x0017, 0x0024 }, + { 0x0017, 0x0025 }, + { 0x0017, 0x0026 }, + { 0x0017, 0x0027 }, + { 0x0017, 0x0028 }, + { 0x0017, 0x0029 }, + { 0x0017, 0x002a }, + { 0x0017, 0x002b }, + { 0x0017, 0x002c }, + { 0x0017, 0x002d }, + { 0x0017, 0x002e }, + { 0x0017, 0x002f }, + { 0x0016, 0x001d }, + +}; + +const UWord16 c_aauiLCLDHuffEnc10[169][2] = { + { 0x0001, 0x0001 }, + { 0x0004, 0x0002 }, + { 0x0005, 0x0002 }, + { 0x0007, 0x0002 }, + { 0x000a, 0x0002 }, + { 0x000e, 0x0004 }, + { 0x0011, 0x0007 }, + { 0x0013, 0x0012 }, + { 0x0016, 0x0000 }, + { 0x0016, 0x0001 }, + { 0x0016, 0x0002 }, + { 0x0016, 0x0003 }, + { 0x0016, 0x0004 }, + { 0x0004, 0x0003 }, + { 0x0003, 0x0003 }, + { 0x0004, 0x0004 }, + { 0x0007, 0x0003 }, + { 0x000a, 0x0003 }, + { 0x000d, 0x0004 }, + { 0x0010, 0x0007 }, + { 0x0013, 0x0013 }, + { 0x0015, 0x0035 }, + { 0x0016, 0x0005 }, + { 0x0016, 0x0006 }, + { 0x0016, 0x0007 }, + { 0x0016, 0x0008 }, + { 0x0005, 0x0003 }, + { 0x0004, 0x0005 }, + { 0x0006, 0x0003 }, + { 0x0008, 0x0002 }, + { 0x000b, 0x0002 }, + { 0x000e, 0x0005 }, + { 0x0010, 0x0008 }, + { 0x0013, 0x0014 }, + { 0x0014, 0x001d }, + { 0x0016, 0x0009 }, + { 0x0016, 0x000a }, + { 0x0016, 0x000b }, + { 0x0016, 0x000c }, + { 0x0007, 0x0004 }, + { 0x0007, 0x0005 }, + { 0x0008, 0x0003 }, + { 0x000a, 0x0004 }, + { 0x000d, 0x0005 }, + { 0x000f, 0x0005 }, + { 0x0011, 0x0008 }, + { 0x0014, 0x001e }, + { 0x0014, 0x001f }, + { 0x0016, 0x000d }, + { 0x0016, 0x000e }, + { 0x0016, 0x000f }, + { 0x0016, 0x0010 }, + { 0x000a, 0x0005 }, + { 0x0009, 0x0003 }, + { 0x000b, 0x0003 }, + { 0x000d, 0x0006 }, + { 0x000f, 0x0006 }, + { 0x0011, 0x0009 }, + { 0x0013, 0x0015 }, + { 0x0014, 0x0020 }, + { 0x0016, 0x0011 }, + { 0x0016, 0x0012 }, + { 0x0016, 0x0013 }, + { 0x0016, 0x0014 }, + { 0x0016, 0x0015 }, + { 0x000e, 0x0006 }, + { 0x000d, 0x0007 }, + { 0x000e, 0x0007 }, + { 0x000f, 0x0007 }, + { 0x0011, 0x000a }, + { 0x0012, 0x000c }, + { 0x0016, 0x0016 }, + { 0x0016, 0x0017 }, + { 0x0016, 0x0018 }, + { 0x0016, 0x0019 }, + { 0x0016, 0x001a }, + { 0x0016, 0x001b }, + { 0x0016, 0x001c }, + { 0x0011, 0x000b }, + { 0x0010, 0x0009 }, + { 0x0011, 0x000c }, + { 0x0011, 0x000d }, + { 0x0013, 0x0016 }, + { 0x0016, 0x001d }, + { 0x0016, 0x001e }, + { 0x0016, 0x001f }, + { 0x0016, 0x0020 }, + { 0x0016, 0x0021 }, + { 0x0016, 0x0022 }, + { 0x0016, 0x0023 }, + { 0x0016, 0x0024 }, + { 0x0014, 0x0021 }, + { 0x0014, 0x0022 }, + { 0x0012, 0x000d }, + { 0x0013, 0x0017 }, + { 0x0016, 0x0025 }, + { 0x0016, 0x0026 }, + { 0x0016, 0x0027 }, + { 0x0016, 0x0028 }, + { 0x0016, 0x0029 }, + { 0x0016, 0x002a }, + { 0x0016, 0x002b }, + { 0x0016, 0x002c }, + { 0x0016, 0x002d }, + { 0x0015, 0x0036 }, + { 0x0015, 0x0037 }, + { 0x0014, 0x0023 }, + { 0x0015, 0x0038 }, + { 0x0016, 0x002e }, + { 0x0016, 0x002f }, + { 0x0016, 0x0030 }, + { 0x0016, 0x0031 }, + { 0x0016, 0x0032 }, + { 0x0016, 0x0033 }, + { 0x0016, 0x0034 }, + { 0x0016, 0x0035 }, + { 0x0016, 0x0036 }, + { 0x0016, 0x0037 }, + { 0x0016, 0x0038 }, + { 0x0016, 0x0039 }, + { 0x0016, 0x003a }, + { 0x0016, 0x003b }, + { 0x0016, 0x003c }, + { 0x0016, 0x003d }, + { 0x0016, 0x003e }, + { 0x0016, 0x003f }, + { 0x0016, 0x0040 }, + { 0x0016, 0x0041 }, + { 0x0016, 0x0042 }, + { 0x0016, 0x0043 }, + { 0x0016, 0x0044 }, + { 0x0016, 0x0045 }, + { 0x0016, 0x0046 }, + { 0x0016, 0x0047 }, + { 0x0016, 0x0048 }, + { 0x0016, 0x0049 }, + { 0x0016, 0x004a }, + { 0x0016, 0x004b }, + { 0x0016, 0x004c }, + { 0x0016, 0x004d }, + { 0x0016, 0x004e }, + { 0x0016, 0x004f }, + { 0x0016, 0x0050 }, + { 0x0016, 0x0051 }, + { 0x0016, 0x0052 }, + { 0x0016, 0x0053 }, + { 0x0016, 0x0054 }, + { 0x0016, 0x0055 }, + { 0x0016, 0x0056 }, + { 0x0016, 0x0057 }, + { 0x0016, 0x0058 }, + { 0x0016, 0x0059 }, + { 0x0016, 0x005a }, + { 0x0016, 0x005b }, + { 0x0016, 0x005c }, + { 0x0016, 0x005d }, + { 0x0016, 0x005e }, + { 0x0016, 0x005f }, + { 0x0016, 0x0060 }, + { 0x0016, 0x0061 }, + { 0x0016, 0x0062 }, + { 0x0016, 0x0063 }, + { 0x0016, 0x0064 }, + { 0x0016, 0x0065 }, + { 0x0016, 0x0066 }, + { 0x0016, 0x0067 }, + { 0x0016, 0x0068 }, + { 0x0016, 0x0069 }, + { 0x0015, 0x0039 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc11[196][2] = { + { 0x0001, 0x0001 }, + { 0x0004, 0x0003 }, + { 0x0005, 0x0003 }, + { 0x0007, 0x0002 }, + { 0x0009, 0x0003 }, + { 0x000c, 0x0004 }, + { 0x000f, 0x0005 }, + { 0x0012, 0x000d }, + { 0x0014, 0x001f }, + { 0x0016, 0x0000 }, + { 0x0016, 0x0001 }, + { 0x0016, 0x0002 }, + { 0x0016, 0x0003 }, + { 0x0016, 0x0004 }, + { 0x0004, 0x0004 }, + { 0x0003, 0x0003 }, + { 0x0005, 0x0004 }, + { 0x0006, 0x0003 }, + { 0x0009, 0x0004 }, + { 0x000b, 0x0004 }, + { 0x000e, 0x0005 }, + { 0x0010, 0x0007 }, + { 0x0012, 0x000e }, + { 0x0014, 0x0020 }, + { 0x0016, 0x0005 }, + { 0x0016, 0x0006 }, + { 0x0016, 0x0007 }, + { 0x0016, 0x0008 }, + { 0x0005, 0x0005 }, + { 0x0004, 0x0005 }, + { 0x0006, 0x0004 }, + { 0x0007, 0x0003 }, + { 0x000a, 0x0004 }, + { 0x000c, 0x0005 }, + { 0x000e, 0x0006 }, + { 0x0011, 0x000a }, + { 0x0012, 0x000f }, + { 0x0015, 0x003b }, + { 0x0016, 0x0009 }, + { 0x0016, 0x000a }, + { 0x0016, 0x000b }, + { 0x0016, 0x000c }, + { 0x0007, 0x0004 }, + { 0x0006, 0x0005 }, + { 0x0007, 0x0005 }, + { 0x0009, 0x0005 }, + { 0x000b, 0x0005 }, + { 0x000d, 0x0005 }, + { 0x000f, 0x0006 }, + { 0x0012, 0x0010 }, + { 0x0014, 0x0021 }, + { 0x0016, 0x000d }, + { 0x0016, 0x000e }, + { 0x0016, 0x000f }, + { 0x0016, 0x0010 }, + { 0x0016, 0x0011 }, + { 0x0009, 0x0006 }, + { 0x0009, 0x0007 }, + { 0x000a, 0x0005 }, + { 0x000b, 0x0006 }, + { 0x000d, 0x0006 }, + { 0x000f, 0x0007 }, + { 0x0011, 0x000b }, + { 0x0013, 0x0017 }, + { 0x0014, 0x0022 }, + { 0x0016, 0x0012 }, + { 0x0016, 0x0013 }, + { 0x0016, 0x0014 }, + { 0x0016, 0x0015 }, + { 0x0016, 0x0016 }, + { 0x000c, 0x0006 }, + { 0x000b, 0x0007 }, + { 0x000c, 0x0007 }, + { 0x000d, 0x0007 }, + { 0x000e, 0x0007 }, + { 0x0010, 0x0008 }, + { 0x0012, 0x0011 }, + { 0x0014, 0x0023 }, + { 0x0015, 0x003c }, + { 0x0016, 0x0017 }, + { 0x0016, 0x0018 }, + { 0x0016, 0x0019 }, + { 0x0016, 0x001a }, + { 0x0016, 0x001b }, + { 0x000f, 0x0008 }, + { 0x000e, 0x0008 }, + { 0x000e, 0x0009 }, + { 0x000f, 0x0009 }, + { 0x0011, 0x000c }, + { 0x0013, 0x0018 }, + { 0x0014, 0x0024 }, + { 0x0016, 0x001c }, + { 0x0016, 0x001d }, + { 0x0016, 0x001e }, + { 0x0016, 0x001f }, + { 0x0016, 0x0020 }, + { 0x0016, 0x0021 }, + { 0x0016, 0x0022 }, + { 0x0011, 0x000d }, + { 0x0010, 0x0009 }, + { 0x0012, 0x0012 }, + { 0x0012, 0x0013 }, + { 0x0014, 0x0025 }, + { 0x0015, 0x003d }, + { 0x0014, 0x0026 }, + { 0x0016, 0x0023 }, + { 0x0016, 0x0024 }, + { 0x0016, 0x0025 }, + { 0x0016, 0x0026 }, + { 0x0016, 0x0027 }, + { 0x0016, 0x0028 }, + { 0x0016, 0x0029 }, + { 0x0014, 0x0027 }, + { 0x0013, 0x0019 }, + { 0x0014, 0x0028 }, + { 0x0014, 0x0029 }, + { 0x0014, 0x002a }, + { 0x0016, 0x002a }, + { 0x0016, 0x002b }, + { 0x0016, 0x002c }, + { 0x0016, 0x002d }, + { 0x0016, 0x002e }, + { 0x0016, 0x002f }, + { 0x0016, 0x0030 }, + { 0x0016, 0x0031 }, + { 0x0016, 0x0032 }, + { 0x0014, 0x002b }, + { 0x0014, 0x002c }, + { 0x0014, 0x002d }, + { 0x0016, 0x0033 }, + { 0x0016, 0x0034 }, + { 0x0016, 0x0035 }, + { 0x0016, 0x0036 }, + { 0x0016, 0x0037 }, + { 0x0016, 0x0038 }, + { 0x0016, 0x0039 }, + { 0x0016, 0x003a }, + { 0x0016, 0x003b }, + { 0x0016, 0x003c }, + { 0x0016, 0x003d }, + { 0x0016, 0x003e }, + { 0x0016, 0x003f }, + { 0x0016, 0x0040 }, + { 0x0016, 0x0041 }, + { 0x0016, 0x0042 }, + { 0x0016, 0x0043 }, + { 0x0016, 0x0044 }, + { 0x0016, 0x0045 }, + { 0x0016, 0x0046 }, + { 0x0016, 0x0047 }, + { 0x0016, 0x0048 }, + { 0x0016, 0x0049 }, + { 0x0016, 0x004a }, + { 0x0016, 0x004b }, + { 0x0016, 0x004c }, + { 0x0016, 0x004d }, + { 0x0016, 0x004e }, + { 0x0016, 0x004f }, + { 0x0016, 0x0050 }, + { 0x0016, 0x0051 }, + { 0x0016, 0x0052 }, + { 0x0016, 0x0053 }, + { 0x0016, 0x0054 }, + { 0x0016, 0x0055 }, + { 0x0016, 0x0056 }, + { 0x0016, 0x0057 }, + { 0x0016, 0x0058 }, + { 0x0016, 0x0059 }, + { 0x0016, 0x005a }, + { 0x0016, 0x005b }, + { 0x0016, 0x005c }, + { 0x0016, 0x005d }, + { 0x0016, 0x005e }, + { 0x0016, 0x005f }, + { 0x0016, 0x0060 }, + { 0x0016, 0x0061 }, + { 0x0016, 0x0062 }, + { 0x0016, 0x0063 }, + { 0x0016, 0x0064 }, + { 0x0016, 0x0065 }, + { 0x0016, 0x0066 }, + { 0x0016, 0x0067 }, + { 0x0016, 0x0068 }, + { 0x0016, 0x0069 }, + { 0x0016, 0x006a }, + { 0x0016, 0x006b }, + { 0x0016, 0x006c }, + { 0x0016, 0x006d }, + { 0x0016, 0x006e }, + { 0x0016, 0x006f }, + { 0x0016, 0x0070 }, + { 0x0016, 0x0071 }, + { 0x0016, 0x0072 }, + { 0x0016, 0x0073 }, + { 0x0016, 0x0074 }, + { 0x0016, 0x0075 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc12[289][2] = { + { 0x0001, 0x0001 }, + { 0x0004, 0x0004 }, + { 0x0005, 0x0004 }, + { 0x0007, 0x0004 }, + { 0x0008, 0x0002 }, + { 0x000b, 0x0004 }, + { 0x000e, 0x0006 }, + { 0x0010, 0x0009 }, + { 0x0012, 0x0014 }, + { 0x0013, 0x001f }, + { 0x0016, 0x0000 }, + { 0x0016, 0x0001 }, + { 0x0016, 0x0002 }, + { 0x0016, 0x0003 }, + { 0x0016, 0x0004 }, + { 0x0016, 0x0005 }, + { 0x0016, 0x0006 }, + { 0x0004, 0x0005 }, + { 0x0004, 0x0006 }, + { 0x0005, 0x0005 }, + { 0x0006, 0x0003 }, + { 0x0008, 0x0003 }, + { 0x000a, 0x0004 }, + { 0x000d, 0x0006 }, + { 0x000f, 0x0008 }, + { 0x0011, 0x000c }, + { 0x0013, 0x0020 }, + { 0x0016, 0x0007 }, + { 0x0015, 0x0063 }, + { 0x0016, 0x0008 }, + { 0x0016, 0x0009 }, + { 0x0016, 0x000a }, + { 0x0016, 0x000b }, + { 0x0016, 0x000c }, + { 0x0005, 0x0006 }, + { 0x0004, 0x0007 }, + { 0x0005, 0x0007 }, + { 0x0006, 0x0004 }, + { 0x0008, 0x0004 }, + { 0x000b, 0x0005 }, + { 0x000d, 0x0007 }, + { 0x0010, 0x000a }, + { 0x0012, 0x0015 }, + { 0x0015, 0x0064 }, + { 0x0016, 0x000d }, + { 0x0016, 0x000e }, + { 0x0016, 0x000f }, + { 0x0016, 0x0010 }, + { 0x0016, 0x0011 }, + { 0x0016, 0x0012 }, + { 0x0016, 0x0013 }, + { 0x0006, 0x0005 }, + { 0x0006, 0x0006 }, + { 0x0006, 0x0007 }, + { 0x0008, 0x0005 }, + { 0x000a, 0x0005 }, + { 0x000c, 0x0005 }, + { 0x000e, 0x0007 }, + { 0x0010, 0x000b }, + { 0x0012, 0x0016 }, + { 0x0014, 0x0037 }, + { 0x0015, 0x0065 }, + { 0x0016, 0x0014 }, + { 0x0016, 0x0015 }, + { 0x0016, 0x0016 }, + { 0x0016, 0x0017 }, + { 0x0016, 0x0018 }, + { 0x0016, 0x0019 }, + { 0x0008, 0x0006 }, + { 0x0007, 0x0005 }, + { 0x0008, 0x0007 }, + { 0x000a, 0x0006 }, + { 0x000c, 0x0006 }, + { 0x000e, 0x0008 }, + { 0x0010, 0x000c }, + { 0x0011, 0x000d }, + { 0x0013, 0x0021 }, + { 0x0015, 0x0066 }, + { 0x0016, 0x001a }, + { 0x0016, 0x001b }, + { 0x0016, 0x001c }, + { 0x0016, 0x001d }, + { 0x0016, 0x001e }, + { 0x0016, 0x001f }, + { 0x0016, 0x0020 }, + { 0x000b, 0x0006 }, + { 0x000a, 0x0007 }, + { 0x000b, 0x0007 }, + { 0x000c, 0x0007 }, + { 0x000e, 0x0009 }, + { 0x000f, 0x0009 }, + { 0x0011, 0x000e }, + { 0x0013, 0x0022 }, + { 0x0015, 0x0067 }, + { 0x0015, 0x0068 }, + { 0x0016, 0x0021 }, + { 0x0016, 0x0022 }, + { 0x0016, 0x0023 }, + { 0x0016, 0x0024 }, + { 0x0016, 0x0025 }, + { 0x0016, 0x0026 }, + { 0x0016, 0x0027 }, + { 0x000e, 0x000a }, + { 0x000d, 0x0008 }, + { 0x000d, 0x0009 }, + { 0x000e, 0x000b }, + { 0x000f, 0x000a }, + { 0x0011, 0x000f }, + { 0x0013, 0x0023 }, + { 0x0014, 0x0038 }, + { 0x0016, 0x0028 }, + { 0x0016, 0x0029 }, + { 0x0016, 0x002a }, + { 0x0016, 0x002b }, + { 0x0016, 0x002c }, + { 0x0016, 0x002d }, + { 0x0016, 0x002e }, + { 0x0016, 0x002f }, + { 0x0016, 0x0030 }, + { 0x0010, 0x000d }, + { 0x000f, 0x000b }, + { 0x0010, 0x000e }, + { 0x0010, 0x000f }, + { 0x0012, 0x0017 }, + { 0x0013, 0x0024 }, + { 0x0014, 0x0039 }, + { 0x0016, 0x0031 }, + { 0x0016, 0x0032 }, + { 0x0016, 0x0033 }, + { 0x0016, 0x0034 }, + { 0x0016, 0x0035 }, + { 0x0016, 0x0036 }, + { 0x0016, 0x0037 }, + { 0x0016, 0x0038 }, + { 0x0016, 0x0039 }, + { 0x0016, 0x003a }, + { 0x0013, 0x0025 }, + { 0x0011, 0x0010 }, + { 0x0011, 0x0011 }, + { 0x0013, 0x0026 }, + { 0x0013, 0x0027 }, + { 0x0014, 0x003a }, + { 0x0014, 0x003b }, + { 0x0016, 0x003b }, + { 0x0016, 0x003c }, + { 0x0016, 0x003d }, + { 0x0016, 0x003e }, + { 0x0016, 0x003f }, + { 0x0016, 0x0040 }, + { 0x0016, 0x0041 }, + { 0x0016, 0x0042 }, + { 0x0016, 0x0043 }, + { 0x0016, 0x0044 }, + { 0x0015, 0x0069 }, + { 0x0014, 0x003c }, + { 0x0014, 0x003d }, + { 0x0015, 0x006a }, + { 0x0015, 0x006b }, + { 0x0015, 0x006c }, + { 0x0016, 0x0045 }, + { 0x0016, 0x0046 }, + { 0x0016, 0x0047 }, + { 0x0016, 0x0048 }, + { 0x0016, 0x0049 }, + { 0x0016, 0x004a }, + { 0x0016, 0x004b }, + { 0x0016, 0x004c }, + { 0x0016, 0x004d }, + { 0x0016, 0x004e }, + { 0x0016, 0x004f }, + { 0x0016, 0x0050 }, + { 0x0016, 0x0051 }, + { 0x0015, 0x006d }, + { 0x0016, 0x0052 }, + { 0x0016, 0x0053 }, + { 0x0016, 0x0054 }, + { 0x0016, 0x0055 }, + { 0x0016, 0x0056 }, + { 0x0016, 0x0057 }, + { 0x0016, 0x0058 }, + { 0x0016, 0x0059 }, + { 0x0016, 0x005a }, + { 0x0016, 0x005b }, + { 0x0016, 0x005c }, + { 0x0016, 0x005d }, + { 0x0016, 0x005e }, + { 0x0016, 0x005f }, + { 0x0016, 0x0060 }, + { 0x0016, 0x0061 }, + { 0x0016, 0x0062 }, + { 0x0016, 0x0063 }, + { 0x0016, 0x0064 }, + { 0x0016, 0x0065 }, + { 0x0016, 0x0066 }, + { 0x0016, 0x0067 }, + { 0x0016, 0x0068 }, + { 0x0016, 0x0069 }, + { 0x0016, 0x006a }, + { 0x0016, 0x006b }, + { 0x0016, 0x006c }, + { 0x0016, 0x006d }, + { 0x0016, 0x006e }, + { 0x0016, 0x006f }, + { 0x0016, 0x0070 }, + { 0x0016, 0x0071 }, + { 0x0016, 0x0072 }, + { 0x0016, 0x0073 }, + { 0x0016, 0x0074 }, + { 0x0016, 0x0075 }, + { 0x0016, 0x0076 }, + { 0x0016, 0x0077 }, + { 0x0016, 0x0078 }, + { 0x0016, 0x0079 }, + { 0x0016, 0x007a }, + { 0x0016, 0x007b }, + { 0x0016, 0x007c }, + { 0x0016, 0x007d }, + { 0x0016, 0x007e }, + { 0x0016, 0x007f }, + { 0x0016, 0x0080 }, + { 0x0016, 0x0081 }, + { 0x0016, 0x0082 }, + { 0x0016, 0x0083 }, + { 0x0016, 0x0084 }, + { 0x0016, 0x0085 }, + { 0x0016, 0x0086 }, + { 0x0016, 0x0087 }, + { 0x0016, 0x0088 }, + { 0x0016, 0x0089 }, + { 0x0016, 0x008a }, + { 0x0016, 0x008b }, + { 0x0016, 0x008c }, + { 0x0016, 0x008d }, + { 0x0016, 0x008e }, + { 0x0016, 0x008f }, + { 0x0016, 0x0090 }, + { 0x0016, 0x0091 }, + { 0x0016, 0x0092 }, + { 0x0016, 0x0093 }, + { 0x0016, 0x0094 }, + { 0x0016, 0x0095 }, + { 0x0016, 0x0096 }, + { 0x0016, 0x0097 }, + { 0x0016, 0x0098 }, + { 0x0016, 0x0099 }, + { 0x0016, 0x009a }, + { 0x0016, 0x009b }, + { 0x0016, 0x009c }, + { 0x0016, 0x009d }, + { 0x0016, 0x009e }, + { 0x0016, 0x009f }, + { 0x0016, 0x00a0 }, + { 0x0016, 0x00a1 }, + { 0x0016, 0x00a2 }, + { 0x0016, 0x00a3 }, + { 0x0016, 0x00a4 }, + { 0x0016, 0x00a5 }, + { 0x0016, 0x00a6 }, + { 0x0016, 0x00a7 }, + { 0x0016, 0x00a8 }, + { 0x0016, 0x00a9 }, + { 0x0016, 0x00aa }, + { 0x0016, 0x00ab }, + { 0x0016, 0x00ac }, + { 0x0016, 0x00ad }, + { 0x0016, 0x00ae }, + { 0x0016, 0x00af }, + { 0x0016, 0x00b0 }, + { 0x0016, 0x00b1 }, + { 0x0016, 0x00b2 }, + { 0x0016, 0x00b3 }, + { 0x0016, 0x00b4 }, + { 0x0016, 0x00b5 }, + { 0x0016, 0x00b6 }, + { 0x0016, 0x00b7 }, + { 0x0016, 0x00b8 }, + { 0x0016, 0x00b9 }, + { 0x0016, 0x00ba }, + { 0x0016, 0x00bb }, + { 0x0016, 0x00bc }, + { 0x0016, 0x00bd }, + { 0x0016, 0x00be }, + { 0x0016, 0x00bf }, + { 0x0016, 0x00c0 }, + { 0x0016, 0x00c1 }, + { 0x0016, 0x00c2 }, + { 0x0016, 0x00c3 }, + { 0x0016, 0x00c4 }, + { 0x0016, 0x00c5 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc13[324][2] = { + { 0x0004, 0x0006 }, + { 0x0004, 0x0007 }, + { 0x0005, 0x0005 }, + { 0x0005, 0x0006 }, + { 0x0006, 0x0004 }, + { 0x0008, 0x0005 }, + { 0x000a, 0x0005 }, + { 0x000c, 0x0007 }, + { 0x000e, 0x000b }, + { 0x0010, 0x0011 }, + { 0x0012, 0x002d }, + { 0x0015, 0x0000 }, + { 0x0014, 0x0035 }, + { 0x0015, 0x0001 }, + { 0x0015, 0x0002 }, + { 0x0015, 0x0003 }, + { 0x0015, 0x0004 }, + { 0x0015, 0x0005 }, + { 0x0004, 0x0008 }, + { 0x0003, 0x0007 }, + { 0x0004, 0x0009 }, + { 0x0004, 0x000a }, + { 0x0006, 0x0005 }, + { 0x0008, 0x0006 }, + { 0x0009, 0x0006 }, + { 0x000c, 0x0008 }, + { 0x000d, 0x0009 }, + { 0x0010, 0x0012 }, + { 0x0011, 0x001a }, + { 0x0015, 0x0006 }, + { 0x0015, 0x0007 }, + { 0x0015, 0x0008 }, + { 0x0015, 0x0009 }, + { 0x0015, 0x000a }, + { 0x0015, 0x000b }, + { 0x0015, 0x000c }, + { 0x0005, 0x0007 }, + { 0x0004, 0x000b }, + { 0x0004, 0x000c }, + { 0x0005, 0x0008 }, + { 0x0006, 0x0006 }, + { 0x0008, 0x0007 }, + { 0x000a, 0x0006 }, + { 0x000c, 0x0009 }, + { 0x000e, 0x000c }, + { 0x0010, 0x0013 }, + { 0x0012, 0x002e }, + { 0x0015, 0x000d }, + { 0x0015, 0x000e }, + { 0x0015, 0x000f }, + { 0x0015, 0x0010 }, + { 0x0015, 0x0011 }, + { 0x0015, 0x0012 }, + { 0x0015, 0x0013 }, + { 0x0005, 0x0009 }, + { 0x0004, 0x000d }, + { 0x0005, 0x000a }, + { 0x0006, 0x0007 }, + { 0x0007, 0x0005 }, + { 0x0009, 0x0007 }, + { 0x000b, 0x0008 }, + { 0x000d, 0x000a }, + { 0x000f, 0x000e }, + { 0x0010, 0x0014 }, + { 0x0011, 0x001b }, + { 0x0014, 0x0036 }, + { 0x0015, 0x0014 }, + { 0x0015, 0x0015 }, + { 0x0015, 0x0016 }, + { 0x0015, 0x0017 }, + { 0x0015, 0x0018 }, + { 0x0015, 0x0019 }, + { 0x0006, 0x0008 }, + { 0x0005, 0x000b }, + { 0x0006, 0x0009 }, + { 0x0007, 0x0006 }, + { 0x0009, 0x0008 }, + { 0x000a, 0x0007 }, + { 0x000c, 0x000a }, + { 0x000e, 0x000d }, + { 0x0010, 0x0015 }, + { 0x0011, 0x001c }, + { 0x0013, 0x0053 }, + { 0x0015, 0x001a }, + { 0x0015, 0x001b }, + { 0x0015, 0x001c }, + { 0x0015, 0x001d }, + { 0x0015, 0x001e }, + { 0x0015, 0x001f }, + { 0x0015, 0x0020 }, + { 0x0008, 0x0008 }, + { 0x0007, 0x0007 }, + { 0x0008, 0x0009 }, + { 0x0009, 0x0009 }, + { 0x000a, 0x0008 }, + { 0x000c, 0x000b }, + { 0x000d, 0x000b }, + { 0x000f, 0x000f }, + { 0x0010, 0x0016 }, + { 0x0011, 0x001d }, + { 0x0014, 0x0037 }, + { 0x0015, 0x0021 }, + { 0x0015, 0x0022 }, + { 0x0015, 0x0023 }, + { 0x0015, 0x0024 }, + { 0x0015, 0x0025 }, + { 0x0015, 0x0026 }, + { 0x0015, 0x0027 }, + { 0x000a, 0x0009 }, + { 0x000a, 0x000a }, + { 0x000a, 0x000b }, + { 0x000b, 0x0009 }, + { 0x000c, 0x000c }, + { 0x000d, 0x000c }, + { 0x000f, 0x0010 }, + { 0x0010, 0x0017 }, + { 0x0012, 0x002f }, + { 0x0015, 0x0028 }, + { 0x0015, 0x0029 }, + { 0x0015, 0x002a }, + { 0x0015, 0x002b }, + { 0x0015, 0x002c }, + { 0x0015, 0x002d }, + { 0x0015, 0x002e }, + { 0x0015, 0x002f }, + { 0x0015, 0x0030 }, + { 0x000c, 0x000d }, + { 0x000c, 0x000e }, + { 0x000c, 0x000f }, + { 0x000d, 0x000d }, + { 0x000e, 0x000e }, + { 0x000f, 0x0011 }, + { 0x0010, 0x0018 }, + { 0x0011, 0x001e }, + { 0x0014, 0x0038 }, + { 0x0015, 0x0031 }, + { 0x0015, 0x0032 }, + { 0x0015, 0x0033 }, + { 0x0015, 0x0034 }, + { 0x0015, 0x0035 }, + { 0x0015, 0x0036 }, + { 0x0015, 0x0037 }, + { 0x0015, 0x0038 }, + { 0x0015, 0x0039 }, + { 0x000f, 0x0012 }, + { 0x000e, 0x000f }, + { 0x000e, 0x0010 }, + { 0x000e, 0x0011 }, + { 0x000f, 0x0013 }, + { 0x0010, 0x0019 }, + { 0x0011, 0x001f }, + { 0x0013, 0x0054 }, + { 0x0015, 0x003a }, + { 0x0014, 0x0039 }, + { 0x0015, 0x003b }, + { 0x0015, 0x003c }, + { 0x0015, 0x003d }, + { 0x0015, 0x003e }, + { 0x0015, 0x003f }, + { 0x0015, 0x0040 }, + { 0x0015, 0x0041 }, + { 0x0015, 0x0042 }, + { 0x0010, 0x001a }, + { 0x000f, 0x0014 }, + { 0x000f, 0x0015 }, + { 0x0010, 0x001b }, + { 0x0011, 0x0020 }, + { 0x0012, 0x0030 }, + { 0x0013, 0x0055 }, + { 0x0015, 0x0043 }, + { 0x0015, 0x0044 }, + { 0x0014, 0x003a }, + { 0x0015, 0x0045 }, + { 0x0015, 0x0046 }, + { 0x0015, 0x0047 }, + { 0x0015, 0x0048 }, + { 0x0015, 0x0049 }, + { 0x0015, 0x004a }, + { 0x0015, 0x004b }, + { 0x0015, 0x004c }, + { 0x0012, 0x0031 }, + { 0x0011, 0x0021 }, + { 0x0013, 0x0056 }, + { 0x0013, 0x0057 }, + { 0x0012, 0x0032 }, + { 0x0015, 0x004d }, + { 0x0015, 0x004e }, + { 0x0015, 0x004f }, + { 0x0015, 0x0050 }, + { 0x0015, 0x0051 }, + { 0x0015, 0x0052 }, + { 0x0015, 0x0053 }, + { 0x0015, 0x0054 }, + { 0x0015, 0x0055 }, + { 0x0015, 0x0056 }, + { 0x0015, 0x0057 }, + { 0x0015, 0x0058 }, + { 0x0015, 0x0059 }, + { 0x0015, 0x005a }, + { 0x0014, 0x003b }, + { 0x0012, 0x0033 }, + { 0x0013, 0x0058 }, + { 0x0013, 0x0059 }, + { 0x0015, 0x005b }, + { 0x0015, 0x005c }, + { 0x0015, 0x005d }, + { 0x0015, 0x005e }, + { 0x0015, 0x005f }, + { 0x0015, 0x0060 }, + { 0x0015, 0x0061 }, + { 0x0015, 0x0062 }, + { 0x0015, 0x0063 }, + { 0x0015, 0x0064 }, + { 0x0015, 0x0065 }, + { 0x0015, 0x0066 }, + { 0x0015, 0x0067 }, + { 0x0015, 0x0068 }, + { 0x0015, 0x0069 }, + { 0x0014, 0x003c }, + { 0x0014, 0x003d }, + { 0x0014, 0x003e }, + { 0x0014, 0x003f }, + { 0x0014, 0x0040 }, + { 0x0014, 0x0041 }, + { 0x0014, 0x0042 }, + { 0x0014, 0x0043 }, + { 0x0014, 0x0044 }, + { 0x0014, 0x0045 }, + { 0x0014, 0x0046 }, + { 0x0014, 0x0047 }, + { 0x0014, 0x0048 }, + { 0x0014, 0x0049 }, + { 0x0014, 0x004a }, + { 0x0014, 0x004b }, + { 0x0014, 0x004c }, + { 0x0014, 0x004d }, + { 0x0014, 0x004e }, + { 0x0014, 0x004f }, + { 0x0014, 0x0050 }, + { 0x0014, 0x0051 }, + { 0x0014, 0x0052 }, + { 0x0014, 0x0053 }, + { 0x0014, 0x0054 }, + { 0x0014, 0x0055 }, + { 0x0014, 0x0056 }, + { 0x0014, 0x0057 }, + { 0x0014, 0x0058 }, + { 0x0014, 0x0059 }, + { 0x0014, 0x005a }, + { 0x0014, 0x005b }, + { 0x0014, 0x005c }, + { 0x0014, 0x005d }, + { 0x0014, 0x005e }, + { 0x0014, 0x005f }, + { 0x0014, 0x0060 }, + { 0x0014, 0x0061 }, + { 0x0014, 0x0062 }, + { 0x0014, 0x0063 }, + { 0x0014, 0x0064 }, + { 0x0014, 0x0065 }, + { 0x0014, 0x0066 }, + { 0x0014, 0x0067 }, + { 0x0014, 0x0068 }, + { 0x0014, 0x0069 }, + { 0x0014, 0x006a }, + { 0x0014, 0x006b }, + { 0x0014, 0x006c }, + { 0x0014, 0x006d }, + { 0x0014, 0x006e }, + { 0x0014, 0x006f }, + { 0x0014, 0x0070 }, + { 0x0014, 0x0071 }, + { 0x0014, 0x0072 }, + { 0x0014, 0x0073 }, + { 0x0014, 0x0074 }, + { 0x0014, 0x0075 }, + { 0x0014, 0x0076 }, + { 0x0014, 0x0077 }, + { 0x0014, 0x0078 }, + { 0x0014, 0x0079 }, + { 0x0014, 0x007a }, + { 0x0014, 0x007b }, + { 0x0014, 0x007c }, + { 0x0014, 0x007d }, + { 0x0014, 0x007e }, + { 0x0014, 0x007f }, + { 0x0014, 0x0080 }, + { 0x0014, 0x0081 }, + { 0x0014, 0x0082 }, + { 0x0014, 0x0083 }, + { 0x0014, 0x0084 }, + { 0x0014, 0x0085 }, + { 0x0014, 0x0086 }, + { 0x0014, 0x0087 }, + { 0x0014, 0x0088 }, + { 0x0014, 0x0089 }, + { 0x0014, 0x008a }, + { 0x0014, 0x008b }, + { 0x0014, 0x008c }, + { 0x0014, 0x008d }, + { 0x0014, 0x008e }, + { 0x0014, 0x008f }, + { 0x0014, 0x0090 }, + { 0x0014, 0x0091 }, + { 0x0014, 0x0092 }, + { 0x0014, 0x0093 }, + { 0x0014, 0x0094 }, + { 0x0014, 0x0095 }, + { 0x0014, 0x0096 }, + { 0x0014, 0x0097 }, + { 0x0014, 0x0098 }, + { 0x0014, 0x0099 }, + { 0x0014, 0x009a }, + { 0x0014, 0x009b }, + { 0x0014, 0x009c }, + { 0x0014, 0x009d }, + { 0x0014, 0x009e }, + { 0x0014, 0x009f }, + { 0x0014, 0x00a0 }, + { 0x0014, 0x00a1 }, + { 0x0014, 0x00a2 }, + { 0x0014, 0x00a3 }, + { 0x0014, 0x00a4 }, + { 0x0014, 0x00a5 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc14[400][2] = { + { 0x0005, 0x0007 }, + { 0x0004, 0x0009 }, + { 0x0005, 0x0008 }, + { 0x0005, 0x0009 }, + { 0x0006, 0x0006 }, + { 0x0007, 0x0006 }, + { 0x0009, 0x0007 }, + { 0x000b, 0x0008 }, + { 0x000d, 0x000c }, + { 0x000f, 0x0013 }, + { 0x0010, 0x001b }, + { 0x0013, 0x0082 }, + { 0x0013, 0x0083 }, + { 0x0014, 0x0000 }, + { 0x0014, 0x0001 }, + { 0x0014, 0x0002 }, + { 0x0014, 0x0003 }, + { 0x0014, 0x0004 }, + { 0x0014, 0x0005 }, + { 0x0014, 0x0006 }, + { 0x0004, 0x000a }, + { 0x0004, 0x000b }, + { 0x0004, 0x000c }, + { 0x0005, 0x000a }, + { 0x0005, 0x000b }, + { 0x0006, 0x0007 }, + { 0x0008, 0x0006 }, + { 0x000a, 0x0007 }, + { 0x000c, 0x000a }, + { 0x000e, 0x000e }, + { 0x000f, 0x0014 }, + { 0x0011, 0x002a }, + { 0x0012, 0x004a }, + { 0x0013, 0x0084 }, + { 0x0014, 0x0007 }, + { 0x0014, 0x0008 }, + { 0x0014, 0x0009 }, + { 0x0014, 0x000a }, + { 0x0014, 0x000b }, + { 0x0014, 0x000c }, + { 0x0005, 0x000c }, + { 0x0004, 0x000d }, + { 0x0004, 0x000e }, + { 0x0005, 0x000d }, + { 0x0006, 0x0008 }, + { 0x0007, 0x0007 }, + { 0x0008, 0x0007 }, + { 0x000a, 0x0008 }, + { 0x000c, 0x000b }, + { 0x000e, 0x000f }, + { 0x000f, 0x0015 }, + { 0x0012, 0x004b }, + { 0x0013, 0x0085 }, + { 0x0014, 0x000d }, + { 0x0014, 0x000e }, + { 0x0014, 0x000f }, + { 0x0014, 0x0010 }, + { 0x0014, 0x0011 }, + { 0x0014, 0x0012 }, + { 0x0014, 0x0013 }, + { 0x0005, 0x000e }, + { 0x0004, 0x000f }, + { 0x0005, 0x000f }, + { 0x0005, 0x0010 }, + { 0x0006, 0x0009 }, + { 0x0008, 0x0008 }, + { 0x0009, 0x0008 }, + { 0x000b, 0x0009 }, + { 0x000d, 0x000d }, + { 0x000e, 0x0010 }, + { 0x0010, 0x001c }, + { 0x0011, 0x002b }, + { 0x0014, 0x0014 }, + { 0x0014, 0x0015 }, + { 0x0014, 0x0016 }, + { 0x0014, 0x0017 }, + { 0x0014, 0x0018 }, + { 0x0014, 0x0019 }, + { 0x0014, 0x001a }, + { 0x0014, 0x001b }, + { 0x0006, 0x000a }, + { 0x0005, 0x0011 }, + { 0x0006, 0x000b }, + { 0x0006, 0x000c }, + { 0x0007, 0x0008 }, + { 0x0008, 0x0009 }, + { 0x000a, 0x0009 }, + { 0x000c, 0x000c }, + { 0x000e, 0x0011 }, + { 0x000f, 0x0016 }, + { 0x0010, 0x001d }, + { 0x0012, 0x004c }, + { 0x0014, 0x001c }, + { 0x0014, 0x001d }, + { 0x0014, 0x001e }, + { 0x0014, 0x001f }, + { 0x0014, 0x0020 }, + { 0x0014, 0x0021 }, + { 0x0014, 0x0022 }, + { 0x0014, 0x0023 }, + { 0x0007, 0x0009 }, + { 0x0006, 0x000d }, + { 0x0007, 0x000a }, + { 0x0007, 0x000b }, + { 0x0009, 0x0009 }, + { 0x000a, 0x000a }, + { 0x000b, 0x000a }, + { 0x000d, 0x000e }, + { 0x000f, 0x0017 }, + { 0x0011, 0x002c }, + { 0x0010, 0x001e }, + { 0x0014, 0x0024 }, + { 0x0014, 0x0025 }, + { 0x0014, 0x0026 }, + { 0x0014, 0x0027 }, + { 0x0014, 0x0028 }, + { 0x0014, 0x0029 }, + { 0x0014, 0x002a }, + { 0x0014, 0x002b }, + { 0x0014, 0x002c }, + { 0x0009, 0x000a }, + { 0x0008, 0x000a }, + { 0x0008, 0x000b }, + { 0x0009, 0x000b }, + { 0x000a, 0x000b }, + { 0x000b, 0x000b }, + { 0x000d, 0x000f }, + { 0x000e, 0x0012 }, + { 0x000f, 0x0018 }, + { 0x0011, 0x002d }, + { 0x0011, 0x002e }, + { 0x0013, 0x0086 }, + { 0x0014, 0x002d }, + { 0x0014, 0x002e }, + { 0x0014, 0x002f }, + { 0x0014, 0x0030 }, + { 0x0014, 0x0031 }, + { 0x0014, 0x0032 }, + { 0x0014, 0x0033 }, + { 0x0014, 0x0034 }, + { 0x000b, 0x000c }, + { 0x000a, 0x000c }, + { 0x000a, 0x000d }, + { 0x000b, 0x000d }, + { 0x000c, 0x000d }, + { 0x000d, 0x0010 }, + { 0x000e, 0x0013 }, + { 0x000f, 0x0019 }, + { 0x0010, 0x001f }, + { 0x0013, 0x0087 }, + { 0x0014, 0x0035 }, + { 0x0014, 0x0036 }, + { 0x0013, 0x0088 }, + { 0x0014, 0x0037 }, + { 0x0014, 0x0038 }, + { 0x0014, 0x0039 }, + { 0x0014, 0x003a }, + { 0x0014, 0x003b }, + { 0x0014, 0x003c }, + { 0x0014, 0x003d }, + { 0x000d, 0x0011 }, + { 0x000c, 0x000e }, + { 0x000c, 0x000f }, + { 0x000d, 0x0012 }, + { 0x000d, 0x0013 }, + { 0x000e, 0x0014 }, + { 0x0010, 0x0020 }, + { 0x0010, 0x0021 }, + { 0x0012, 0x004d }, + { 0x0011, 0x002f }, + { 0x0014, 0x003e }, + { 0x0014, 0x003f }, + { 0x0014, 0x0040 }, + { 0x0014, 0x0041 }, + { 0x0014, 0x0042 }, + { 0x0014, 0x0043 }, + { 0x0014, 0x0044 }, + { 0x0014, 0x0045 }, + { 0x0014, 0x0046 }, + { 0x0014, 0x0047 }, + { 0x000f, 0x001a }, + { 0x000e, 0x0015 }, + { 0x000e, 0x0016 }, + { 0x000e, 0x0017 }, + { 0x000f, 0x001b }, + { 0x0011, 0x0030 }, + { 0x0011, 0x0031 }, + { 0x0013, 0x0089 }, + { 0x0013, 0x008a }, + { 0x0013, 0x008b }, + { 0x0014, 0x0048 }, + { 0x0014, 0x0049 }, + { 0x0014, 0x004a }, + { 0x0014, 0x004b }, + { 0x0014, 0x004c }, + { 0x0014, 0x004d }, + { 0x0014, 0x004e }, + { 0x0014, 0x004f }, + { 0x0014, 0x0050 }, + { 0x0014, 0x0051 }, + { 0x0010, 0x0022 }, + { 0x0010, 0x0023 }, + { 0x0010, 0x0024 }, + { 0x0010, 0x0025 }, + { 0x0011, 0x0032 }, + { 0x0011, 0x0033 }, + { 0x0012, 0x004e }, + { 0x0012, 0x004f }, + { 0x0014, 0x0052 }, + { 0x0013, 0x008c }, + { 0x0013, 0x008d }, + { 0x0014, 0x0053 }, + { 0x0014, 0x0054 }, + { 0x0014, 0x0055 }, + { 0x0014, 0x0056 }, + { 0x0014, 0x0057 }, + { 0x0014, 0x0058 }, + { 0x0014, 0x0059 }, + { 0x0014, 0x005a }, + { 0x0014, 0x005b }, + { 0x0011, 0x0034 }, + { 0x0011, 0x0035 }, + { 0x0012, 0x0050 }, + { 0x0012, 0x0051 }, + { 0x0013, 0x008e }, + { 0x0014, 0x005c }, + { 0x0014, 0x005d }, + { 0x0014, 0x005e }, + { 0x0014, 0x005f }, + { 0x0014, 0x0060 }, + { 0x0014, 0x0061 }, + { 0x0014, 0x0062 }, + { 0x0014, 0x0063 }, + { 0x0014, 0x0064 }, + { 0x0014, 0x0065 }, + { 0x0014, 0x0066 }, + { 0x0014, 0x0067 }, + { 0x0014, 0x0068 }, + { 0x0014, 0x0069 }, + { 0x0014, 0x006a }, + { 0x0012, 0x0052 }, + { 0x0013, 0x008f }, + { 0x0013, 0x0090 }, + { 0x0014, 0x006b }, + { 0x0013, 0x0091 }, + { 0x0014, 0x006c }, + { 0x0014, 0x006d }, + { 0x0014, 0x006e }, + { 0x0014, 0x006f }, + { 0x0014, 0x0070 }, + { 0x0014, 0x0071 }, + { 0x0014, 0x0072 }, + { 0x0014, 0x0073 }, + { 0x0014, 0x0074 }, + { 0x0014, 0x0075 }, + { 0x0014, 0x0076 }, + { 0x0014, 0x0077 }, + { 0x0014, 0x0078 }, + { 0x0014, 0x0079 }, + { 0x0014, 0x007a }, + { 0x0014, 0x007b }, + { 0x0014, 0x007c }, + { 0x0013, 0x0092 }, + { 0x0012, 0x0053 }, + { 0x0014, 0x007d }, + { 0x0014, 0x007e }, + { 0x0014, 0x007f }, + { 0x0014, 0x0080 }, + { 0x0014, 0x0081 }, + { 0x0014, 0x0082 }, + { 0x0014, 0x0083 }, + { 0x0014, 0x0084 }, + { 0x0014, 0x0085 }, + { 0x0014, 0x0086 }, + { 0x0014, 0x0087 }, + { 0x0014, 0x0088 }, + { 0x0014, 0x0089 }, + { 0x0014, 0x008a }, + { 0x0014, 0x008b }, + { 0x0014, 0x008c }, + { 0x0014, 0x008d }, + { 0x0014, 0x008e }, + { 0x0013, 0x0093 }, + { 0x0014, 0x008f }, + { 0x0014, 0x0090 }, + { 0x0014, 0x0091 }, + { 0x0014, 0x0092 }, + { 0x0014, 0x0093 }, + { 0x0014, 0x0094 }, + { 0x0014, 0x0095 }, + { 0x0014, 0x0096 }, + { 0x0014, 0x0097 }, + { 0x0014, 0x0098 }, + { 0x0014, 0x0099 }, + { 0x0014, 0x009a }, + { 0x0014, 0x009b }, + { 0x0014, 0x009c }, + { 0x0014, 0x009d }, + { 0x0014, 0x009e }, + { 0x0014, 0x009f }, + { 0x0014, 0x00a0 }, + { 0x0014, 0x00a1 }, + { 0x0014, 0x00a2 }, + { 0x0014, 0x00a3 }, + { 0x0014, 0x00a4 }, + { 0x0014, 0x00a5 }, + { 0x0014, 0x00a6 }, + { 0x0014, 0x00a7 }, + { 0x0014, 0x00a8 }, + { 0x0014, 0x00a9 }, + { 0x0014, 0x00aa }, + { 0x0014, 0x00ab }, + { 0x0014, 0x00ac }, + { 0x0014, 0x00ad }, + { 0x0014, 0x00ae }, + { 0x0014, 0x00af }, + { 0x0014, 0x00b0 }, + { 0x0014, 0x00b1 }, + { 0x0014, 0x00b2 }, + { 0x0014, 0x00b3 }, + { 0x0014, 0x00b4 }, + { 0x0014, 0x00b5 }, + { 0x0014, 0x00b6 }, + { 0x0014, 0x00b7 }, + { 0x0014, 0x00b8 }, + { 0x0014, 0x00b9 }, + { 0x0014, 0x00ba }, + { 0x0014, 0x00bb }, + { 0x0014, 0x00bc }, + { 0x0014, 0x00bd }, + { 0x0014, 0x00be }, + { 0x0014, 0x00bf }, + { 0x0014, 0x00c0 }, + { 0x0014, 0x00c1 }, + { 0x0014, 0x00c2 }, + { 0x0014, 0x00c3 }, + { 0x0014, 0x00c4 }, + { 0x0014, 0x00c5 }, + { 0x0014, 0x00c6 }, + { 0x0014, 0x00c7 }, + { 0x0014, 0x00c8 }, + { 0x0014, 0x00c9 }, + { 0x0014, 0x00ca }, + { 0x0014, 0x00cb }, + { 0x0014, 0x00cc }, + { 0x0014, 0x00cd }, + { 0x0014, 0x00ce }, + { 0x0014, 0x00cf }, + { 0x0014, 0x00d0 }, + { 0x0014, 0x00d1 }, + { 0x0014, 0x00d2 }, + { 0x0014, 0x00d3 }, + { 0x0014, 0x00d4 }, + { 0x0014, 0x00d5 }, + { 0x0014, 0x00d6 }, + { 0x0014, 0x00d7 }, + { 0x0014, 0x00d8 }, + { 0x0014, 0x00d9 }, + { 0x0014, 0x00da }, + { 0x0014, 0x00db }, + { 0x0014, 0x00dc }, + { 0x0014, 0x00dd }, + { 0x0014, 0x00de }, + { 0x0014, 0x00df }, + { 0x0014, 0x00e0 }, + { 0x0014, 0x00e1 }, + { 0x0014, 0x00e2 }, + { 0x0014, 0x00e3 }, + { 0x0014, 0x00e4 }, + { 0x0014, 0x00e5 }, + { 0x0014, 0x00e6 }, + { 0x0014, 0x00e7 }, + { 0x0014, 0x00e8 }, + { 0x0014, 0x00e9 }, + { 0x0014, 0x00ea }, + { 0x0014, 0x00eb }, + { 0x0014, 0x00ec }, + { 0x0014, 0x00ed }, + { 0x0014, 0x00ee }, + { 0x0014, 0x00ef }, + { 0x0014, 0x00f0 }, + { 0x0014, 0x00f1 }, + { 0x0014, 0x00f2 }, + { 0x0014, 0x00f3 }, + { 0x0014, 0x00f4 }, + { 0x0014, 0x00f5 }, + { 0x0014, 0x00f6 }, + { 0x0014, 0x00f7 }, + { 0x0014, 0x00f8 }, + { 0x0014, 0x00f9 }, + { 0x0014, 0x00fa }, + { 0x0014, 0x00fb }, + { 0x0014, 0x00fc }, + { 0x0014, 0x00fd }, + { 0x0014, 0x00fe }, + { 0x0014, 0x00ff }, + { 0x0014, 0x0100 }, + { 0x0014, 0x0101 }, + { 0x0014, 0x0102 }, + { 0x0014, 0x0103 }, +}; + +const UWord16 c_aauiLCLDHuffEnc15[576][2] = { + { 0x0005, 0x000a }, + { 0x0005, 0x000b }, + { 0x0005, 0x000c }, + { 0x0006, 0x0009 }, + { 0x0006, 0x000a }, + { 0x0007, 0x0008 }, + { 0x0008, 0x0009 }, + { 0x0009, 0x0008 }, + { 0x000b, 0x000b }, + { 0x000d, 0x000e }, + { 0x000e, 0x0011 }, + { 0x000f, 0x001a }, + { 0x0012, 0x006e }, + { 0x0014, 0x0000 }, + { 0x0013, 0x00cc }, + { 0x0014, 0x0001 }, + { 0x0014, 0x0002 }, + { 0x0014, 0x0003 }, + { 0x0014, 0x0004 }, + { 0x0014, 0x0005 }, + { 0x0014, 0x0006 }, + { 0x0014, 0x0007 }, + { 0x0014, 0x0008 }, + { 0x0014, 0x0009 }, + { 0x0005, 0x000d }, + { 0x0004, 0x000c }, + { 0x0004, 0x000d }, + { 0x0005, 0x000e }, + { 0x0005, 0x000f }, + { 0x0006, 0x000b }, + { 0x0007, 0x0009 }, + { 0x0008, 0x000a }, + { 0x000a, 0x000a }, + { 0x000c, 0x000c }, + { 0x000d, 0x000f }, + { 0x000f, 0x001b }, + { 0x0011, 0x003d }, + { 0x0011, 0x003e }, + { 0x0013, 0x00cd }, + { 0x0014, 0x000a }, + { 0x0014, 0x000b }, + { 0x0014, 0x000c }, + { 0x0014, 0x000d }, + { 0x0014, 0x000e }, + { 0x0014, 0x000f }, + { 0x0014, 0x0010 }, + { 0x0014, 0x0011 }, + { 0x0014, 0x0012 }, + { 0x0005, 0x0010 }, + { 0x0004, 0x000e }, + { 0x0004, 0x000f }, + { 0x0005, 0x0011 }, + { 0x0005, 0x0012 }, + { 0x0006, 0x000c }, + { 0x0007, 0x000a }, + { 0x0009, 0x0009 }, + { 0x000a, 0x000b }, + { 0x000c, 0x000d }, + { 0x000e, 0x0012 }, + { 0x0010, 0x0027 }, + { 0x0011, 0x003f }, + { 0x0012, 0x006f }, + { 0x0014, 0x0013 }, + { 0x0014, 0x0014 }, + { 0x0014, 0x0015 }, + { 0x0014, 0x0016 }, + { 0x0014, 0x0017 }, + { 0x0014, 0x0018 }, + { 0x0014, 0x0019 }, + { 0x0014, 0x001a }, + { 0x0014, 0x001b }, + { 0x0014, 0x001c }, + { 0x0006, 0x000d }, + { 0x0005, 0x0013 }, + { 0x0005, 0x0014 }, + { 0x0005, 0x0015 }, + { 0x0006, 0x000e }, + { 0x0007, 0x000b }, + { 0x0008, 0x000b }, + { 0x0009, 0x000a }, + { 0x000b, 0x000c }, + { 0x000c, 0x000e }, + { 0x000e, 0x0013 }, + { 0x000f, 0x001c }, + { 0x0011, 0x0040 }, + { 0x0012, 0x0070 }, + { 0x0014, 0x001d }, + { 0x0014, 0x001e }, + { 0x0014, 0x001f }, + { 0x0014, 0x0020 }, + { 0x0014, 0x0021 }, + { 0x0014, 0x0022 }, + { 0x0014, 0x0023 }, + { 0x0014, 0x0024 }, + { 0x0014, 0x0025 }, + { 0x0014, 0x0026 }, + { 0x0006, 0x000f }, + { 0x0005, 0x0016 }, + { 0x0005, 0x0017 }, + { 0x0006, 0x0010 }, + { 0x0006, 0x0011 }, + { 0x0007, 0x000c }, + { 0x0009, 0x000b }, + { 0x000a, 0x000c }, + { 0x000b, 0x000d }, + { 0x000d, 0x0010 }, + { 0x000e, 0x0014 }, + { 0x0010, 0x0028 }, + { 0x0011, 0x0041 }, + { 0x0013, 0x00ce }, + { 0x0014, 0x0027 }, + { 0x0014, 0x0028 }, + { 0x0014, 0x0029 }, + { 0x0014, 0x002a }, + { 0x0014, 0x002b }, + { 0x0014, 0x002c }, + { 0x0014, 0x002d }, + { 0x0014, 0x002e }, + { 0x0014, 0x002f }, + { 0x0014, 0x0030 }, + { 0x0007, 0x000d }, + { 0x0006, 0x0012 }, + { 0x0006, 0x0013 }, + { 0x0007, 0x000e }, + { 0x0007, 0x000f }, + { 0x0008, 0x000c }, + { 0x0009, 0x000c }, + { 0x000b, 0x000e }, + { 0x000c, 0x000f }, + { 0x000e, 0x0015 }, + { 0x0010, 0x0029 }, + { 0x0011, 0x0042 }, + { 0x0014, 0x0031 }, + { 0x0014, 0x0032 }, + { 0x0014, 0x0033 }, + { 0x0014, 0x0034 }, + { 0x0014, 0x0035 }, + { 0x0014, 0x0036 }, + { 0x0014, 0x0037 }, + { 0x0014, 0x0038 }, + { 0x0014, 0x0039 }, + { 0x0014, 0x003a }, + { 0x0014, 0x003b }, + { 0x0014, 0x003c }, + { 0x0008, 0x000d }, + { 0x0007, 0x0010 }, + { 0x0007, 0x0011 }, + { 0x0008, 0x000e }, + { 0x0009, 0x000d }, + { 0x0009, 0x000e }, + { 0x000b, 0x000f }, + { 0x000c, 0x0010 }, + { 0x000d, 0x0011 }, + { 0x000f, 0x001d }, + { 0x0010, 0x002a }, + { 0x0011, 0x0043 }, + { 0x0014, 0x003d }, + { 0x0013, 0x00cf }, + { 0x0014, 0x003e }, + { 0x0014, 0x003f }, + { 0x0014, 0x0040 }, + { 0x0014, 0x0041 }, + { 0x0014, 0x0042 }, + { 0x0014, 0x0043 }, + { 0x0014, 0x0044 }, + { 0x0014, 0x0045 }, + { 0x0014, 0x0046 }, + { 0x0014, 0x0047 }, + { 0x0009, 0x000f }, + { 0x0008, 0x000f }, + { 0x0009, 0x0010 }, + { 0x0009, 0x0011 }, + { 0x000a, 0x000d }, + { 0x000b, 0x0010 }, + { 0x000c, 0x0011 }, + { 0x000d, 0x0012 }, + { 0x000e, 0x0016 }, + { 0x0010, 0x002b }, + { 0x0011, 0x0044 }, + { 0x0012, 0x0071 }, + { 0x0014, 0x0048 }, + { 0x0014, 0x0049 }, + { 0x0014, 0x004a }, + { 0x0014, 0x004b }, + { 0x0014, 0x004c }, + { 0x0014, 0x004d }, + { 0x0014, 0x004e }, + { 0x0014, 0x004f }, + { 0x0014, 0x0050 }, + { 0x0014, 0x0051 }, + { 0x0014, 0x0052 }, + { 0x0014, 0x0053 }, + { 0x000b, 0x0011 }, + { 0x000a, 0x000e }, + { 0x000a, 0x000f }, + { 0x000b, 0x0012 }, + { 0x000b, 0x0013 }, + { 0x000c, 0x0012 }, + { 0x000d, 0x0013 }, + { 0x000e, 0x0017 }, + { 0x0010, 0x002c }, + { 0x0012, 0x0072 }, + { 0x0011, 0x0045 }, + { 0x0013, 0x00d0 }, + { 0x0013, 0x00d1 }, + { 0x0014, 0x0054 }, + { 0x0014, 0x0055 }, + { 0x0014, 0x0056 }, + { 0x0014, 0x0057 }, + { 0x0014, 0x0058 }, + { 0x0014, 0x0059 }, + { 0x0014, 0x005a }, + { 0x0014, 0x005b }, + { 0x0014, 0x005c }, + { 0x0014, 0x005d }, + { 0x0014, 0x005e }, + { 0x000c, 0x0013 }, + { 0x000c, 0x0014 }, + { 0x000c, 0x0015 }, + { 0x000d, 0x0014 }, + { 0x000d, 0x0015 }, + { 0x000e, 0x0018 }, + { 0x000f, 0x001e }, + { 0x0010, 0x002d }, + { 0x0011, 0x0046 }, + { 0x0011, 0x0047 }, + { 0x0011, 0x0048 }, + { 0x0014, 0x005f }, + { 0x0014, 0x0060 }, + { 0x0014, 0x0061 }, + { 0x0014, 0x0062 }, + { 0x0014, 0x0063 }, + { 0x0014, 0x0064 }, + { 0x0014, 0x0065 }, + { 0x0014, 0x0066 }, + { 0x0014, 0x0067 }, + { 0x0014, 0x0068 }, + { 0x0014, 0x0069 }, + { 0x0014, 0x006a }, + { 0x0014, 0x006b }, + { 0x000e, 0x0019 }, + { 0x000d, 0x0016 }, + { 0x000d, 0x0017 }, + { 0x000e, 0x001a }, + { 0x000e, 0x001b }, + { 0x000f, 0x001f }, + { 0x0010, 0x002e }, + { 0x0011, 0x0049 }, + { 0x0012, 0x0073 }, + { 0x0014, 0x006c }, + { 0x0014, 0x006d }, + { 0x0014, 0x006e }, + { 0x0014, 0x006f }, + { 0x0014, 0x0070 }, + { 0x0014, 0x0071 }, + { 0x0014, 0x0072 }, + { 0x0014, 0x0073 }, + { 0x0014, 0x0074 }, + { 0x0014, 0x0075 }, + { 0x0014, 0x0076 }, + { 0x0014, 0x0077 }, + { 0x0014, 0x0078 }, + { 0x0014, 0x0079 }, + { 0x0014, 0x007a }, + { 0x0010, 0x002f }, + { 0x000f, 0x0020 }, + { 0x0010, 0x0030 }, + { 0x000f, 0x0021 }, + { 0x0010, 0x0031 }, + { 0x0011, 0x004a }, + { 0x0011, 0x004b }, + { 0x0012, 0x0074 }, + { 0x0014, 0x007b }, + { 0x0014, 0x007c }, + { 0x0013, 0x00d2 }, + { 0x0014, 0x007d }, + { 0x0014, 0x007e }, + { 0x0014, 0x007f }, + { 0x0014, 0x0080 }, + { 0x0014, 0x0081 }, + { 0x0014, 0x0082 }, + { 0x0014, 0x0083 }, + { 0x0014, 0x0084 }, + { 0x0014, 0x0085 }, + { 0x0014, 0x0086 }, + { 0x0014, 0x0087 }, + { 0x0014, 0x0088 }, + { 0x0014, 0x0089 }, + { 0x0012, 0x0075 }, + { 0x0010, 0x0032 }, + { 0x0010, 0x0033 }, + { 0x0011, 0x004c }, + { 0x0011, 0x004d }, + { 0x0013, 0x00d3 }, + { 0x0013, 0x00d4 }, + { 0x0012, 0x0076 }, + { 0x0013, 0x00d5 }, + { 0x0014, 0x008a }, + { 0x0014, 0x008b }, + { 0x0014, 0x008c }, + { 0x0014, 0x008d }, + { 0x0014, 0x008e }, + { 0x0014, 0x008f }, + { 0x0014, 0x0090 }, + { 0x0014, 0x0091 }, + { 0x0014, 0x0092 }, + { 0x0014, 0x0093 }, + { 0x0014, 0x0094 }, + { 0x0014, 0x0095 }, + { 0x0014, 0x0096 }, + { 0x0014, 0x0097 }, + { 0x0014, 0x0098 }, + { 0x0013, 0x00d6 }, + { 0x0013, 0x00d7 }, + { 0x0012, 0x0077 }, + { 0x0012, 0x0078 }, + { 0x0014, 0x0099 }, + { 0x0014, 0x009a }, + { 0x0013, 0x00d8 }, + { 0x0014, 0x009b }, + { 0x0014, 0x009c }, + { 0x0014, 0x009d }, + { 0x0014, 0x009e }, + { 0x0014, 0x009f }, + { 0x0014, 0x00a0 }, + { 0x0014, 0x00a1 }, + { 0x0014, 0x00a2 }, + { 0x0014, 0x00a3 }, + { 0x0014, 0x00a4 }, + { 0x0014, 0x00a5 }, + { 0x0014, 0x00a6 }, + { 0x0014, 0x00a7 }, + { 0x0014, 0x00a8 }, + { 0x0014, 0x00a9 }, + { 0x0014, 0x00aa }, + { 0x0014, 0x00ab }, + { 0x0014, 0x00ac }, + { 0x0014, 0x00ad }, + { 0x0014, 0x00ae }, + { 0x0014, 0x00af }, + { 0x0012, 0x0079 }, + { 0x0014, 0x00b0 }, + { 0x0014, 0x00b1 }, + { 0x0014, 0x00b2 }, + { 0x0014, 0x00b3 }, + { 0x0014, 0x00b4 }, + { 0x0014, 0x00b5 }, + { 0x0014, 0x00b6 }, + { 0x0014, 0x00b7 }, + { 0x0014, 0x00b8 }, + { 0x0014, 0x00b9 }, + { 0x0014, 0x00ba }, + { 0x0014, 0x00bb }, + { 0x0014, 0x00bc }, + { 0x0014, 0x00bd }, + { 0x0014, 0x00be }, + { 0x0014, 0x00bf }, + { 0x0014, 0x00c0 }, + { 0x0014, 0x00c1 }, + { 0x0014, 0x00c2 }, + { 0x0014, 0x00c3 }, + { 0x0014, 0x00c4 }, + { 0x0014, 0x00c5 }, + { 0x0014, 0x00c6 }, + { 0x0013, 0x00d9 }, + { 0x0013, 0x00da }, + { 0x0014, 0x00c7 }, + { 0x0014, 0x00c8 }, + { 0x0014, 0x00c9 }, + { 0x0014, 0x00ca }, + { 0x0014, 0x00cb }, + { 0x0014, 0x00cc }, + { 0x0014, 0x00cd }, + { 0x0014, 0x00ce }, + { 0x0014, 0x00cf }, + { 0x0014, 0x00d0 }, + { 0x0014, 0x00d1 }, + { 0x0014, 0x00d2 }, + { 0x0014, 0x00d3 }, + { 0x0014, 0x00d4 }, + { 0x0014, 0x00d5 }, + { 0x0014, 0x00d6 }, + { 0x0014, 0x00d7 }, + { 0x0014, 0x00d8 }, + { 0x0014, 0x00d9 }, + { 0x0014, 0x00da }, + { 0x0014, 0x00db }, + { 0x0014, 0x00dc }, + { 0x0014, 0x00dd }, + { 0x0014, 0x00de }, + { 0x0014, 0x00df }, + { 0x0014, 0x00e0 }, + { 0x0014, 0x00e1 }, + { 0x0014, 0x00e2 }, + { 0x0014, 0x00e3 }, + { 0x0014, 0x00e4 }, + { 0x0014, 0x00e5 }, + { 0x0014, 0x00e6 }, + { 0x0014, 0x00e7 }, + { 0x0014, 0x00e8 }, + { 0x0014, 0x00e9 }, + { 0x0014, 0x00ea }, + { 0x0014, 0x00eb }, + { 0x0014, 0x00ec }, + { 0x0014, 0x00ed }, + { 0x0014, 0x00ee }, + { 0x0014, 0x00ef }, + { 0x0014, 0x00f0 }, + { 0x0014, 0x00f1 }, + { 0x0014, 0x00f2 }, + { 0x0014, 0x00f3 }, + { 0x0014, 0x00f4 }, + { 0x0014, 0x00f5 }, + { 0x0014, 0x00f6 }, + { 0x0014, 0x00f7 }, + { 0x0014, 0x00f8 }, + { 0x0014, 0x00f9 }, + { 0x0014, 0x00fa }, + { 0x0014, 0x00fb }, + { 0x0014, 0x00fc }, + { 0x0014, 0x00fd }, + { 0x0014, 0x00fe }, + { 0x0014, 0x00ff }, + { 0x0014, 0x0100 }, + { 0x0014, 0x0101 }, + { 0x0014, 0x0102 }, + { 0x0014, 0x0103 }, + { 0x0014, 0x0104 }, + { 0x0014, 0x0105 }, + { 0x0014, 0x0106 }, + { 0x0014, 0x0107 }, + { 0x0014, 0x0108 }, + { 0x0014, 0x0109 }, + { 0x0014, 0x010a }, + { 0x0014, 0x010b }, + { 0x0014, 0x010c }, + { 0x0014, 0x010d }, + { 0x0014, 0x010e }, + { 0x0014, 0x010f }, + { 0x0014, 0x0110 }, + { 0x0014, 0x0111 }, + { 0x0014, 0x0112 }, + { 0x0014, 0x0113 }, + { 0x0014, 0x0114 }, + { 0x0014, 0x0115 }, + { 0x0014, 0x0116 }, + { 0x0014, 0x0117 }, + { 0x0014, 0x0118 }, + { 0x0014, 0x0119 }, + { 0x0014, 0x011a }, + { 0x0014, 0x011b }, + { 0x0014, 0x011c }, + { 0x0014, 0x011d }, + { 0x0014, 0x011e }, + { 0x0014, 0x011f }, + { 0x0014, 0x0120 }, + { 0x0014, 0x0121 }, + { 0x0014, 0x0122 }, + { 0x0014, 0x0123 }, + { 0x0014, 0x0124 }, + { 0x0014, 0x0125 }, + { 0x0014, 0x0126 }, + { 0x0014, 0x0127 }, + { 0x0014, 0x0128 }, + { 0x0014, 0x0129 }, + { 0x0014, 0x012a }, + { 0x0014, 0x012b }, + { 0x0014, 0x012c }, + { 0x0014, 0x012d }, + { 0x0014, 0x012e }, + { 0x0014, 0x012f }, + { 0x0014, 0x0130 }, + { 0x0014, 0x0131 }, + { 0x0014, 0x0132 }, + { 0x0014, 0x0133 }, + { 0x0014, 0x0134 }, + { 0x0014, 0x0135 }, + { 0x0014, 0x0136 }, + { 0x0014, 0x0137 }, + { 0x0014, 0x0138 }, + { 0x0014, 0x0139 }, + { 0x0014, 0x013a }, + { 0x0014, 0x013b }, + { 0x0014, 0x013c }, + { 0x0014, 0x013d }, + { 0x0014, 0x013e }, + { 0x0014, 0x013f }, + { 0x0014, 0x0140 }, + { 0x0014, 0x0141 }, + { 0x0014, 0x0142 }, + { 0x0014, 0x0143 }, + { 0x0014, 0x0144 }, + { 0x0014, 0x0145 }, + { 0x0014, 0x0146 }, + { 0x0014, 0x0147 }, + { 0x0014, 0x0148 }, + { 0x0014, 0x0149 }, + { 0x0014, 0x014a }, + { 0x0014, 0x014b }, + { 0x0014, 0x014c }, + { 0x0014, 0x014d }, + { 0x0014, 0x014e }, + { 0x0014, 0x014f }, + { 0x0014, 0x0150 }, + { 0x0014, 0x0151 }, + { 0x0014, 0x0152 }, + { 0x0014, 0x0153 }, + { 0x0014, 0x0154 }, + { 0x0014, 0x0155 }, + { 0x0014, 0x0156 }, + { 0x0014, 0x0157 }, + { 0x0014, 0x0158 }, + { 0x0014, 0x0159 }, + { 0x0014, 0x015a }, + { 0x0014, 0x015b }, + { 0x0014, 0x015c }, + { 0x0014, 0x015d }, + { 0x0014, 0x015e }, + { 0x0014, 0x015f }, + { 0x0014, 0x0160 }, + { 0x0014, 0x0161 }, + { 0x0014, 0x0162 }, + { 0x0014, 0x0163 }, + { 0x0014, 0x0164 }, + { 0x0014, 0x0165 }, + { 0x0014, 0x0166 }, + { 0x0014, 0x0167 }, + { 0x0014, 0x0168 }, + { 0x0014, 0x0169 }, + { 0x0014, 0x016a }, + { 0x0014, 0x016b }, + { 0x0014, 0x016c }, + { 0x0014, 0x016d }, + { 0x0014, 0x016e }, + { 0x0014, 0x016f }, + { 0x0014, 0x0170 }, + { 0x0014, 0x0171 }, + { 0x0014, 0x0172 }, + { 0x0014, 0x0173 }, + { 0x0014, 0x0174 }, + { 0x0014, 0x0175 }, + { 0x0014, 0x0176 }, + { 0x0014, 0x0177 }, + { 0x0014, 0x0178 }, + { 0x0014, 0x0179 }, + { 0x0014, 0x017a }, + { 0x0014, 0x017b }, + { 0x0014, 0x017c }, + { 0x0014, 0x017d }, + { 0x0014, 0x017e }, + { 0x0014, 0x017f }, + { 0x0014, 0x0180 }, + { 0x0014, 0x0181 }, + { 0x0014, 0x0182 }, + { 0x0014, 0x0183 }, + { 0x0014, 0x0184 }, + { 0x0014, 0x0185 }, + { 0x0014, 0x0186 }, + { 0x0014, 0x0187 }, + { 0x0014, 0x0188 }, + { 0x0014, 0x0189 }, + { 0x0014, 0x018a }, + { 0x0014, 0x018b }, + { 0x0014, 0x018c }, + { 0x0014, 0x018d }, + { 0x0014, 0x018e }, + { 0x0014, 0x018f }, + { 0x0014, 0x0190 }, + { 0x0014, 0x0191 }, + { 0x0014, 0x0192 }, + { 0x0014, 0x0193 }, + { 0x0014, 0x0194 }, + { 0x0014, 0x0195 }, + { 0x0014, 0x0196 }, + { 0x0014, 0x0197 }, + { 0x0013, 0x00db }, +}; + +const UWord16 c_aauiLCLDHuffEnc16[729][2] = { + { 0x0006, 0x000d }, + { 0x0005, 0x0010 }, + { 0x0006, 0x000e }, + { 0x0006, 0x000f }, + { 0x0006, 0x0010 }, + { 0x0007, 0x000a }, + { 0x0007, 0x000b }, + { 0x0008, 0x000a }, + { 0x0009, 0x000b }, + { 0x000b, 0x000d }, + { 0x000c, 0x000e }, + { 0x000e, 0x0016 }, + { 0x0010, 0x002d }, + { 0x0011, 0x0051 }, + { 0x0012, 0x008c }, + { 0x0014, 0x0000 }, + { 0x0014, 0x0001 }, + { 0x0014, 0x0002 }, + { 0x0014, 0x0003 }, + { 0x0014, 0x0004 }, + { 0x0014, 0x0005 }, + { 0x0014, 0x0006 }, + { 0x0014, 0x0007 }, + { 0x0014, 0x0008 }, + { 0x0014, 0x0009 }, + { 0x0014, 0x000a }, + { 0x0014, 0x000b }, + { 0x0005, 0x0011 }, + { 0x0004, 0x000f }, + { 0x0005, 0x0012 }, + { 0x0005, 0x0013 }, + { 0x0005, 0x0014 }, + { 0x0006, 0x0011 }, + { 0x0006, 0x0012 }, + { 0x0007, 0x000c }, + { 0x0008, 0x000b }, + { 0x000a, 0x000c }, + { 0x000b, 0x000e }, + { 0x000d, 0x0010 }, + { 0x000e, 0x0017 }, + { 0x000f, 0x001c }, + { 0x0013, 0x010b }, + { 0x0013, 0x010c }, + { 0x0014, 0x000c }, + { 0x0014, 0x000d }, + { 0x0014, 0x000e }, + { 0x0014, 0x000f }, + { 0x0014, 0x0010 }, + { 0x0014, 0x0011 }, + { 0x0014, 0x0012 }, + { 0x0014, 0x0013 }, + { 0x0014, 0x0014 }, + { 0x0014, 0x0015 }, + { 0x0014, 0x0016 }, + { 0x0006, 0x0013 }, + { 0x0005, 0x0015 }, + { 0x0005, 0x0016 }, + { 0x0005, 0x0017 }, + { 0x0005, 0x0018 }, + { 0x0006, 0x0014 }, + { 0x0007, 0x000d }, + { 0x0007, 0x000e }, + { 0x0009, 0x000c }, + { 0x000a, 0x000d }, + { 0x000c, 0x000f }, + { 0x000d, 0x0011 }, + { 0x000f, 0x001d }, + { 0x0011, 0x0052 }, + { 0x0012, 0x008d }, + { 0x0012, 0x008e }, + { 0x0014, 0x0017 }, + { 0x0014, 0x0018 }, + { 0x0014, 0x0019 }, + { 0x0014, 0x001a }, + { 0x0014, 0x001b }, + { 0x0014, 0x001c }, + { 0x0014, 0x001d }, + { 0x0014, 0x001e }, + { 0x0014, 0x001f }, + { 0x0014, 0x0020 }, + { 0x0014, 0x0021 }, + { 0x0006, 0x0015 }, + { 0x0005, 0x0019 }, + { 0x0005, 0x001a }, + { 0x0005, 0x001b }, + { 0x0006, 0x0016 }, + { 0x0006, 0x0017 }, + { 0x0007, 0x000f }, + { 0x0008, 0x000c }, + { 0x0009, 0x000d }, + { 0x000b, 0x000f }, + { 0x000c, 0x0010 }, + { 0x000d, 0x0012 }, + { 0x000f, 0x001e }, + { 0x0012, 0x008f }, + { 0x0014, 0x0022 }, + { 0x0014, 0x0023 }, + { 0x0014, 0x0024 }, + { 0x0014, 0x0025 }, + { 0x0014, 0x0026 }, + { 0x0014, 0x0027 }, + { 0x0014, 0x0028 }, + { 0x0014, 0x0029 }, + { 0x0014, 0x002a }, + { 0x0014, 0x002b }, + { 0x0014, 0x002c }, + { 0x0014, 0x002d }, + { 0x0014, 0x002e }, + { 0x0006, 0x0018 }, + { 0x0005, 0x001c }, + { 0x0005, 0x001d }, + { 0x0006, 0x0019 }, + { 0x0006, 0x001a }, + { 0x0007, 0x0010 }, + { 0x0007, 0x0011 }, + { 0x0008, 0x000d }, + { 0x000a, 0x000e }, + { 0x000b, 0x0010 }, + { 0x000c, 0x0011 }, + { 0x000e, 0x0018 }, + { 0x0010, 0x002e }, + { 0x0012, 0x0090 }, + { 0x0013, 0x010d }, + { 0x0013, 0x010e }, + { 0x0014, 0x002f }, + { 0x0014, 0x0030 }, + { 0x0014, 0x0031 }, + { 0x0014, 0x0032 }, + { 0x0014, 0x0033 }, + { 0x0014, 0x0034 }, + { 0x0014, 0x0035 }, + { 0x0014, 0x0036 }, + { 0x0014, 0x0037 }, + { 0x0014, 0x0038 }, + { 0x0014, 0x0039 }, + { 0x0007, 0x0012 }, + { 0x0006, 0x001b }, + { 0x0006, 0x001c }, + { 0x0006, 0x001d }, + { 0x0007, 0x0013 }, + { 0x0007, 0x0014 }, + { 0x0008, 0x000e }, + { 0x0009, 0x000e }, + { 0x000b, 0x0011 }, + { 0x000c, 0x0012 }, + { 0x000d, 0x0013 }, + { 0x000e, 0x0019 }, + { 0x0010, 0x002f }, + { 0x0012, 0x0091 }, + { 0x0014, 0x003a }, + { 0x0014, 0x003b }, + { 0x0014, 0x003c }, + { 0x0014, 0x003d }, + { 0x0014, 0x003e }, + { 0x0014, 0x003f }, + { 0x0014, 0x0040 }, + { 0x0014, 0x0041 }, + { 0x0014, 0x0042 }, + { 0x0014, 0x0043 }, + { 0x0014, 0x0044 }, + { 0x0014, 0x0045 }, + { 0x0014, 0x0046 }, + { 0x0007, 0x0015 }, + { 0x0006, 0x001e }, + { 0x0006, 0x001f }, + { 0x0007, 0x0016 }, + { 0x0007, 0x0017 }, + { 0x0008, 0x000f }, + { 0x0009, 0x000f }, + { 0x000a, 0x000f }, + { 0x000b, 0x0012 }, + { 0x000d, 0x0014 }, + { 0x000e, 0x001a }, + { 0x000f, 0x001f }, + { 0x0013, 0x010f }, + { 0x0011, 0x0053 }, + { 0x0014, 0x0047 }, + { 0x0014, 0x0048 }, + { 0x0014, 0x0049 }, + { 0x0014, 0x004a }, + { 0x0014, 0x004b }, + { 0x0014, 0x004c }, + { 0x0014, 0x004d }, + { 0x0014, 0x004e }, + { 0x0014, 0x004f }, + { 0x0014, 0x0050 }, + { 0x0014, 0x0051 }, + { 0x0014, 0x0052 }, + { 0x0014, 0x0053 }, + { 0x0008, 0x0010 }, + { 0x0007, 0x0018 }, + { 0x0007, 0x0019 }, + { 0x0008, 0x0011 }, + { 0x0008, 0x0012 }, + { 0x0009, 0x0010 }, + { 0x000a, 0x0010 }, + { 0x000b, 0x0013 }, + { 0x000c, 0x0013 }, + { 0x000e, 0x001b }, + { 0x000f, 0x0020 }, + { 0x0010, 0x0030 }, + { 0x0012, 0x0092 }, + { 0x0014, 0x0054 }, + { 0x0014, 0x0055 }, + { 0x0014, 0x0056 }, + { 0x0014, 0x0057 }, + { 0x0014, 0x0058 }, + { 0x0014, 0x0059 }, + { 0x0014, 0x005a }, + { 0x0014, 0x005b }, + { 0x0014, 0x005c }, + { 0x0014, 0x005d }, + { 0x0014, 0x005e }, + { 0x0014, 0x005f }, + { 0x0014, 0x0060 }, + { 0x0014, 0x0061 }, + { 0x0009, 0x0011 }, + { 0x0008, 0x0013 }, + { 0x0009, 0x0012 }, + { 0x0009, 0x0013 }, + { 0x000a, 0x0011 }, + { 0x000a, 0x0012 }, + { 0x000b, 0x0014 }, + { 0x000c, 0x0014 }, + { 0x000d, 0x0015 }, + { 0x000e, 0x001c }, + { 0x000f, 0x0021 }, + { 0x0013, 0x0110 }, + { 0x0012, 0x0093 }, + { 0x0012, 0x0094 }, + { 0x0014, 0x0062 }, + { 0x0014, 0x0063 }, + { 0x0014, 0x0064 }, + { 0x0014, 0x0065 }, + { 0x0014, 0x0066 }, + { 0x0014, 0x0067 }, + { 0x0014, 0x0068 }, + { 0x0014, 0x0069 }, + { 0x0014, 0x006a }, + { 0x0014, 0x006b }, + { 0x0014, 0x006c }, + { 0x0014, 0x006d }, + { 0x0014, 0x006e }, + { 0x000b, 0x0015 }, + { 0x000a, 0x0013 }, + { 0x000a, 0x0014 }, + { 0x000a, 0x0015 }, + { 0x000b, 0x0016 }, + { 0x000c, 0x0015 }, + { 0x000d, 0x0016 }, + { 0x000d, 0x0017 }, + { 0x000f, 0x0022 }, + { 0x0010, 0x0031 }, + { 0x0012, 0x0095 }, + { 0x0012, 0x0096 }, + { 0x0014, 0x006f }, + { 0x0013, 0x0111 }, + { 0x0014, 0x0070 }, + { 0x0014, 0x0071 }, + { 0x0014, 0x0072 }, + { 0x0014, 0x0073 }, + { 0x0014, 0x0074 }, + { 0x0014, 0x0075 }, + { 0x0014, 0x0076 }, + { 0x0014, 0x0077 }, + { 0x0014, 0x0078 }, + { 0x0014, 0x0079 }, + { 0x0014, 0x007a }, + { 0x0014, 0x007b }, + { 0x0014, 0x007c }, + { 0x000c, 0x0016 }, + { 0x000b, 0x0017 }, + { 0x000c, 0x0017 }, + { 0x000c, 0x0018 }, + { 0x000c, 0x0019 }, + { 0x000d, 0x0018 }, + { 0x000e, 0x001d }, + { 0x000f, 0x0023 }, + { 0x000f, 0x0024 }, + { 0x0011, 0x0054 }, + { 0x0012, 0x0097 }, + { 0x0014, 0x007d }, + { 0x0014, 0x007e }, + { 0x0014, 0x007f }, + { 0x0014, 0x0080 }, + { 0x0014, 0x0081 }, + { 0x0014, 0x0082 }, + { 0x0014, 0x0083 }, + { 0x0014, 0x0084 }, + { 0x0014, 0x0085 }, + { 0x0014, 0x0086 }, + { 0x0014, 0x0087 }, + { 0x0014, 0x0088 }, + { 0x0014, 0x0089 }, + { 0x0014, 0x008a }, + { 0x0014, 0x008b }, + { 0x0014, 0x008c }, + { 0x000e, 0x001e }, + { 0x000d, 0x0019 }, + { 0x000d, 0x001a }, + { 0x000d, 0x001b }, + { 0x000e, 0x001f }, + { 0x000f, 0x0025 }, + { 0x000f, 0x0026 }, + { 0x0010, 0x0032 }, + { 0x0010, 0x0033 }, + { 0x0012, 0x0098 }, + { 0x0013, 0x0112 }, + { 0x0014, 0x008d }, + { 0x0014, 0x008e }, + { 0x0014, 0x008f }, + { 0x0014, 0x0090 }, + { 0x0014, 0x0091 }, + { 0x0014, 0x0092 }, + { 0x0014, 0x0093 }, + { 0x0014, 0x0094 }, + { 0x0014, 0x0095 }, + { 0x0014, 0x0096 }, + { 0x0014, 0x0097 }, + { 0x0014, 0x0098 }, + { 0x0014, 0x0099 }, + { 0x0014, 0x009a }, + { 0x0014, 0x009b }, + { 0x0014, 0x009c }, + { 0x000f, 0x0027 }, + { 0x000f, 0x0028 }, + { 0x000f, 0x0029 }, + { 0x000f, 0x002a }, + { 0x0010, 0x0034 }, + { 0x000f, 0x002b }, + { 0x0011, 0x0055 }, + { 0x0012, 0x0099 }, + { 0x0012, 0x009a }, + { 0x0012, 0x009b }, + { 0x0014, 0x009d }, + { 0x0013, 0x0113 }, + { 0x0014, 0x009e }, + { 0x0014, 0x009f }, + { 0x0014, 0x00a0 }, + { 0x0014, 0x00a1 }, + { 0x0014, 0x00a2 }, + { 0x0014, 0x00a3 }, + { 0x0014, 0x00a4 }, + { 0x0014, 0x00a5 }, + { 0x0014, 0x00a6 }, + { 0x0014, 0x00a7 }, + { 0x0014, 0x00a8 }, + { 0x0014, 0x00a9 }, + { 0x0014, 0x00aa }, + { 0x0014, 0x00ab }, + { 0x0014, 0x00ac }, + { 0x0011, 0x0056 }, + { 0x0010, 0x0035 }, + { 0x0010, 0x0036 }, + { 0x0010, 0x0037 }, + { 0x0011, 0x0057 }, + { 0x0012, 0x009c }, + { 0x0012, 0x009d }, + { 0x0012, 0x009e }, + { 0x0014, 0x00ad }, + { 0x0014, 0x00ae }, + { 0x0014, 0x00af }, + { 0x0014, 0x00b0 }, + { 0x0014, 0x00b1 }, + { 0x0014, 0x00b2 }, + { 0x0014, 0x00b3 }, + { 0x0014, 0x00b4 }, + { 0x0014, 0x00b5 }, + { 0x0014, 0x00b6 }, + { 0x0014, 0x00b7 }, + { 0x0014, 0x00b8 }, + { 0x0014, 0x00b9 }, + { 0x0014, 0x00ba }, + { 0x0014, 0x00bb }, + { 0x0014, 0x00bc }, + { 0x0014, 0x00bd }, + { 0x0014, 0x00be }, + { 0x0014, 0x00bf }, + { 0x0012, 0x009f }, + { 0x0011, 0x0058 }, + { 0x0012, 0x00a0 }, + { 0x0014, 0x00c0 }, + { 0x0011, 0x0059 }, + { 0x0013, 0x0114 }, + { 0x0012, 0x00a1 }, + { 0x0014, 0x00c1 }, + { 0x0013, 0x0115 }, + { 0x0014, 0x00c2 }, + { 0x0014, 0x00c3 }, + { 0x0014, 0x00c4 }, + { 0x0014, 0x00c5 }, + { 0x0014, 0x00c6 }, + { 0x0014, 0x00c7 }, + { 0x0014, 0x00c8 }, + { 0x0014, 0x00c9 }, + { 0x0014, 0x00ca }, + { 0x0014, 0x00cb }, + { 0x0014, 0x00cc }, + { 0x0014, 0x00cd }, + { 0x0014, 0x00ce }, + { 0x0014, 0x00cf }, + { 0x0014, 0x00d0 }, + { 0x0014, 0x00d1 }, + { 0x0014, 0x00d2 }, + { 0x0014, 0x00d3 }, + { 0x0014, 0x00d4 }, + { 0x0014, 0x00d5 }, + { 0x0014, 0x00d6 }, + { 0x0014, 0x00d7 }, + { 0x0014, 0x00d8 }, + { 0x0014, 0x00d9 }, + { 0x0014, 0x00da }, + { 0x0014, 0x00db }, + { 0x0014, 0x00dc }, + { 0x0014, 0x00dd }, + { 0x0014, 0x00de }, + { 0x0014, 0x00df }, + { 0x0014, 0x00e0 }, + { 0x0014, 0x00e1 }, + { 0x0014, 0x00e2 }, + { 0x0014, 0x00e3 }, + { 0x0014, 0x00e4 }, + { 0x0014, 0x00e5 }, + { 0x0014, 0x00e6 }, + { 0x0014, 0x00e7 }, + { 0x0014, 0x00e8 }, + { 0x0014, 0x00e9 }, + { 0x0014, 0x00ea }, + { 0x0014, 0x00eb }, + { 0x0014, 0x00ec }, + { 0x0014, 0x00ed }, + { 0x0014, 0x00ee }, + { 0x0014, 0x00ef }, + { 0x0014, 0x00f0 }, + { 0x0014, 0x00f1 }, + { 0x0014, 0x00f2 }, + { 0x0014, 0x00f3 }, + { 0x0014, 0x00f4 }, + { 0x0014, 0x00f5 }, + { 0x0014, 0x00f6 }, + { 0x0014, 0x00f7 }, + { 0x0014, 0x00f8 }, + { 0x0014, 0x00f9 }, + { 0x0014, 0x00fa }, + { 0x0014, 0x00fb }, + { 0x0014, 0x00fc }, + { 0x0014, 0x00fd }, + { 0x0014, 0x00fe }, + { 0x0014, 0x00ff }, + { 0x0014, 0x0100 }, + { 0x0014, 0x0101 }, + { 0x0014, 0x0102 }, + { 0x0014, 0x0103 }, + { 0x0014, 0x0104 }, + { 0x0014, 0x0105 }, + { 0x0014, 0x0106 }, + { 0x0014, 0x0107 }, + { 0x0014, 0x0108 }, + { 0x0014, 0x0109 }, + { 0x0014, 0x010a }, + { 0x0014, 0x010b }, + { 0x0014, 0x010c }, + { 0x0014, 0x010d }, + { 0x0014, 0x010e }, + { 0x0014, 0x010f }, + { 0x0014, 0x0110 }, + { 0x0014, 0x0111 }, + { 0x0014, 0x0112 }, + { 0x0014, 0x0113 }, + { 0x0014, 0x0114 }, + { 0x0014, 0x0115 }, + { 0x0014, 0x0116 }, + { 0x0014, 0x0117 }, + { 0x0014, 0x0118 }, + { 0x0014, 0x0119 }, + { 0x0014, 0x011a }, + { 0x0014, 0x011b }, + { 0x0014, 0x011c }, + { 0x0014, 0x011d }, + { 0x0014, 0x011e }, + { 0x0014, 0x011f }, + { 0x0014, 0x0120 }, + { 0x0014, 0x0121 }, + { 0x0014, 0x0122 }, + { 0x0014, 0x0123 }, + { 0x0014, 0x0124 }, + { 0x0014, 0x0125 }, + { 0x0013, 0x0116 }, + { 0x0014, 0x0126 }, + { 0x0014, 0x0127 }, + { 0x0014, 0x0128 }, + { 0x0014, 0x0129 }, + { 0x0014, 0x012a }, + { 0x0014, 0x012b }, + { 0x0014, 0x012c }, + { 0x0014, 0x012d }, + { 0x0014, 0x012e }, + { 0x0014, 0x012f }, + { 0x0014, 0x0130 }, + { 0x0014, 0x0131 }, + { 0x0014, 0x0132 }, + { 0x0014, 0x0133 }, + { 0x0014, 0x0134 }, + { 0x0014, 0x0135 }, + { 0x0014, 0x0136 }, + { 0x0014, 0x0137 }, + { 0x0014, 0x0138 }, + { 0x0014, 0x0139 }, + { 0x0014, 0x013a }, + { 0x0014, 0x013b }, + { 0x0014, 0x013c }, + { 0x0014, 0x013d }, + { 0x0014, 0x013e }, + { 0x0014, 0x013f }, + { 0x0014, 0x0140 }, + { 0x0014, 0x0141 }, + { 0x0014, 0x0142 }, + { 0x0014, 0x0143 }, + { 0x0014, 0x0144 }, + { 0x0014, 0x0145 }, + { 0x0014, 0x0146 }, + { 0x0014, 0x0147 }, + { 0x0014, 0x0148 }, + { 0x0014, 0x0149 }, + { 0x0014, 0x014a }, + { 0x0014, 0x014b }, + { 0x0014, 0x014c }, + { 0x0014, 0x014d }, + { 0x0014, 0x014e }, + { 0x0014, 0x014f }, + { 0x0014, 0x0150 }, + { 0x0014, 0x0151 }, + { 0x0014, 0x0152 }, + { 0x0014, 0x0153 }, + { 0x0014, 0x0154 }, + { 0x0014, 0x0155 }, + { 0x0014, 0x0156 }, + { 0x0014, 0x0157 }, + { 0x0014, 0x0158 }, + { 0x0014, 0x0159 }, + { 0x0014, 0x015a }, + { 0x0014, 0x015b }, + { 0x0014, 0x015c }, + { 0x0014, 0x015d }, + { 0x0014, 0x015e }, + { 0x0014, 0x015f }, + { 0x0014, 0x0160 }, + { 0x0014, 0x0161 }, + { 0x0014, 0x0162 }, + { 0x0014, 0x0163 }, + { 0x0014, 0x0164 }, + { 0x0014, 0x0165 }, + { 0x0014, 0x0166 }, + { 0x0014, 0x0167 }, + { 0x0014, 0x0168 }, + { 0x0014, 0x0169 }, + { 0x0014, 0x016a }, + { 0x0014, 0x016b }, + { 0x0014, 0x016c }, + { 0x0014, 0x016d }, + { 0x0014, 0x016e }, + { 0x0014, 0x016f }, + { 0x0014, 0x0170 }, + { 0x0014, 0x0171 }, + { 0x0014, 0x0172 }, + { 0x0014, 0x0173 }, + { 0x0014, 0x0174 }, + { 0x0014, 0x0175 }, + { 0x0014, 0x0176 }, + { 0x0014, 0x0177 }, + { 0x0014, 0x0178 }, + { 0x0014, 0x0179 }, + { 0x0014, 0x017a }, + { 0x0014, 0x017b }, + { 0x0014, 0x017c }, + { 0x0014, 0x017d }, + { 0x0014, 0x017e }, + { 0x0014, 0x017f }, + { 0x0014, 0x0180 }, + { 0x0014, 0x0181 }, + { 0x0014, 0x0182 }, + { 0x0014, 0x0183 }, + { 0x0014, 0x0184 }, + { 0x0014, 0x0185 }, + { 0x0014, 0x0186 }, + { 0x0014, 0x0187 }, + { 0x0014, 0x0188 }, + { 0x0014, 0x0189 }, + { 0x0014, 0x018a }, + { 0x0014, 0x018b }, + { 0x0014, 0x018c }, + { 0x0014, 0x018d }, + { 0x0014, 0x018e }, + { 0x0014, 0x018f }, + { 0x0014, 0x0190 }, + { 0x0014, 0x0191 }, + { 0x0014, 0x0192 }, + { 0x0014, 0x0193 }, + { 0x0014, 0x0194 }, + { 0x0014, 0x0195 }, + { 0x0014, 0x0196 }, + { 0x0014, 0x0197 }, + { 0x0014, 0x0198 }, + { 0x0014, 0x0199 }, + { 0x0014, 0x019a }, + { 0x0014, 0x019b }, + { 0x0014, 0x019c }, + { 0x0014, 0x019d }, + { 0x0014, 0x019e }, + { 0x0014, 0x019f }, + { 0x0014, 0x01a0 }, + { 0x0014, 0x01a1 }, + { 0x0014, 0x01a2 }, + { 0x0014, 0x01a3 }, + { 0x0014, 0x01a4 }, + { 0x0014, 0x01a5 }, + { 0x0014, 0x01a6 }, + { 0x0014, 0x01a7 }, + { 0x0014, 0x01a8 }, + { 0x0014, 0x01a9 }, + { 0x0014, 0x01aa }, + { 0x0014, 0x01ab }, + { 0x0014, 0x01ac }, + { 0x0014, 0x01ad }, + { 0x0014, 0x01ae }, + { 0x0014, 0x01af }, + { 0x0014, 0x01b0 }, + { 0x0014, 0x01b1 }, + { 0x0014, 0x01b2 }, + { 0x0014, 0x01b3 }, + { 0x0014, 0x01b4 }, + { 0x0014, 0x01b5 }, + { 0x0014, 0x01b6 }, + { 0x0014, 0x01b7 }, + { 0x0014, 0x01b8 }, + { 0x0014, 0x01b9 }, + { 0x0014, 0x01ba }, + { 0x0014, 0x01bb }, + { 0x0014, 0x01bc }, + { 0x0014, 0x01bd }, + { 0x0014, 0x01be }, + { 0x0014, 0x01bf }, + { 0x0014, 0x01c0 }, + { 0x0014, 0x01c1 }, + { 0x0014, 0x01c2 }, + { 0x0014, 0x01c3 }, + { 0x0014, 0x01c4 }, + { 0x0014, 0x01c5 }, + { 0x0014, 0x01c6 }, + { 0x0014, 0x01c7 }, + { 0x0014, 0x01c8 }, + { 0x0014, 0x01c9 }, + { 0x0014, 0x01ca }, + { 0x0014, 0x01cb }, + { 0x0014, 0x01cc }, + { 0x0014, 0x01cd }, + { 0x0014, 0x01ce }, + { 0x0014, 0x01cf }, + { 0x0014, 0x01d0 }, + { 0x0014, 0x01d1 }, + { 0x0014, 0x01d2 }, + { 0x0014, 0x01d3 }, + { 0x0014, 0x01d4 }, + { 0x0014, 0x01d5 }, + { 0x0014, 0x01d6 }, + { 0x0014, 0x01d7 }, + { 0x0014, 0x01d8 }, + { 0x0014, 0x01d9 }, + { 0x0014, 0x01da }, + { 0x0014, 0x01db }, + { 0x0014, 0x01dc }, + { 0x0014, 0x01dd }, + { 0x0014, 0x01de }, + { 0x0014, 0x01df }, + { 0x0014, 0x01e0 }, + { 0x0014, 0x01e1 }, + { 0x0014, 0x01e2 }, + { 0x0014, 0x01e3 }, + { 0x0014, 0x01e4 }, + { 0x0014, 0x01e5 }, + { 0x0014, 0x01e6 }, + { 0x0014, 0x01e7 }, + { 0x0014, 0x01e8 }, + { 0x0014, 0x01e9 }, + { 0x0014, 0x01ea }, + { 0x0014, 0x01eb }, + { 0x0014, 0x01ec }, + { 0x0014, 0x01ed }, + { 0x0014, 0x01ee }, + { 0x0014, 0x01ef }, + { 0x0014, 0x01f0 }, + { 0x0014, 0x01f1 }, + { 0x0014, 0x01f2 }, + { 0x0014, 0x01f3 }, + { 0x0014, 0x01f4 }, + { 0x0014, 0x01f5 }, + { 0x0014, 0x01f6 }, + { 0x0014, 0x01f7 }, + { 0x0014, 0x01f8 }, + { 0x0014, 0x01f9 }, + { 0x0014, 0x01fa }, + { 0x0014, 0x01fb }, + { 0x0014, 0x01fc }, + { 0x0014, 0x01fd }, + { 0x0014, 0x01fe }, + { 0x0014, 0x01ff }, + { 0x0014, 0x0200 }, + { 0x0014, 0x0201 }, + { 0x0014, 0x0202 }, + { 0x0014, 0x0203 }, + { 0x0014, 0x0204 }, + { 0x0014, 0x0205 }, + { 0x0014, 0x0206 }, + { 0x0014, 0x0207 }, + { 0x0014, 0x0208 }, + { 0x0014, 0x0209 }, + { 0x0014, 0x020a }, + { 0x0014, 0x020b }, + { 0x0014, 0x020c }, + { 0x0014, 0x020d }, + { 0x0014, 0x020e }, + { 0x0014, 0x020f }, + { 0x0014, 0x0210 }, + { 0x0014, 0x0211 }, + { 0x0014, 0x0212 }, + { 0x0014, 0x0213 }, + { 0x0014, 0x0214 }, + { 0x0014, 0x0215 }, + { 0x0013, 0x0117 }, + +}; + + +const UWord16 c_aauiLCLDHuffEnc17[729][2] = { + { 0x0006, 0x0012 }, + { 0x0006, 0x0013 }, + { 0x0006, 0x0014 }, + { 0x0006, 0x0015 }, + { 0x0007, 0x000f }, + { 0x0007, 0x0010 }, + { 0x0007, 0x0011 }, + { 0x0008, 0x000e }, + { 0x0008, 0x000f }, + { 0x0009, 0x000f }, + { 0x000a, 0x000f }, + { 0x000c, 0x0011 }, + { 0x000d, 0x0014 }, + { 0x000e, 0x0017 }, + { 0x0010, 0x002d }, + { 0x0011, 0x004c }, + { 0x0012, 0x008a }, + { 0x0014, 0x0000 }, + { 0x0014, 0x0001 }, + { 0x0014, 0x0002 }, + { 0x0014, 0x0003 }, + { 0x0014, 0x0004 }, + { 0x0014, 0x0005 }, + { 0x0014, 0x0006 }, + { 0x0014, 0x0007 }, + { 0x0014, 0x0008 }, + { 0x0014, 0x0009 }, + { 0x0006, 0x0016 }, + { 0x0005, 0x0018 }, + { 0x0005, 0x0019 }, + { 0x0005, 0x001a }, + { 0x0006, 0x0017 }, + { 0x0006, 0x0018 }, + { 0x0006, 0x0019 }, + { 0x0007, 0x0012 }, + { 0x0007, 0x0013 }, + { 0x0008, 0x0010 }, + { 0x000a, 0x0010 }, + { 0x000b, 0x0011 }, + { 0x000c, 0x0012 }, + { 0x000e, 0x0018 }, + { 0x000f, 0x0020 }, + { 0x0011, 0x004d }, + { 0x0013, 0x00e4 }, + { 0x0014, 0x000a }, + { 0x0014, 0x000b }, + { 0x0014, 0x000c }, + { 0x0014, 0x000d }, + { 0x0014, 0x000e }, + { 0x0014, 0x000f }, + { 0x0014, 0x0010 }, + { 0x0014, 0x0011 }, + { 0x0014, 0x0012 }, + { 0x0014, 0x0013 }, + { 0x0006, 0x001a }, + { 0x0005, 0x001b }, + { 0x0005, 0x001c }, + { 0x0005, 0x001d }, + { 0x0006, 0x001b }, + { 0x0006, 0x001c }, + { 0x0006, 0x001d }, + { 0x0007, 0x0014 }, + { 0x0008, 0x0011 }, + { 0x0009, 0x0010 }, + { 0x000a, 0x0011 }, + { 0x000b, 0x0012 }, + { 0x000c, 0x0013 }, + { 0x000e, 0x0019 }, + { 0x000f, 0x0021 }, + { 0x0010, 0x002e }, + { 0x0013, 0x00e5 }, + { 0x0013, 0x00e6 }, + { 0x0014, 0x0014 }, + { 0x0014, 0x0015 }, + { 0x0014, 0x0016 }, + { 0x0014, 0x0017 }, + { 0x0014, 0x0018 }, + { 0x0014, 0x0019 }, + { 0x0014, 0x001a }, + { 0x0014, 0x001b }, + { 0x0014, 0x001c }, + { 0x0006, 0x001e }, + { 0x0005, 0x001e }, + { 0x0005, 0x001f }, + { 0x0006, 0x001f }, + { 0x0006, 0x0020 }, + { 0x0006, 0x0021 }, + { 0x0006, 0x0022 }, + { 0x0007, 0x0015 }, + { 0x0008, 0x0012 }, + { 0x0009, 0x0011 }, + { 0x000a, 0x0012 }, + { 0x000b, 0x0013 }, + { 0x000c, 0x0014 }, + { 0x000e, 0x001a }, + { 0x000f, 0x0022 }, + { 0x0010, 0x002f }, + { 0x0013, 0x00e7 }, + { 0x0013, 0x00e8 }, + { 0x0014, 0x001d }, + { 0x0014, 0x001e }, + { 0x0014, 0x001f }, + { 0x0014, 0x0020 }, + { 0x0014, 0x0021 }, + { 0x0014, 0x0022 }, + { 0x0014, 0x0023 }, + { 0x0014, 0x0024 }, + { 0x0014, 0x0025 }, + { 0x0006, 0x0023 }, + { 0x0006, 0x0024 }, + { 0x0006, 0x0025 }, + { 0x0006, 0x0026 }, + { 0x0006, 0x0027 }, + { 0x0006, 0x0028 }, + { 0x0007, 0x0016 }, + { 0x0007, 0x0017 }, + { 0x0008, 0x0013 }, + { 0x0009, 0x0012 }, + { 0x000a, 0x0013 }, + { 0x000c, 0x0015 }, + { 0x000d, 0x0015 }, + { 0x000f, 0x0023 }, + { 0x0010, 0x0030 }, + { 0x0011, 0x004e }, + { 0x0014, 0x0026 }, + { 0x0014, 0x0027 }, + { 0x0014, 0x0028 }, + { 0x0014, 0x0029 }, + { 0x0014, 0x002a }, + { 0x0014, 0x002b }, + { 0x0014, 0x002c }, + { 0x0014, 0x002d }, + { 0x0014, 0x002e }, + { 0x0014, 0x002f }, + { 0x0014, 0x0030 }, + { 0x0007, 0x0018 }, + { 0x0006, 0x0029 }, + { 0x0006, 0x002a }, + { 0x0006, 0x002b }, + { 0x0006, 0x002c }, + { 0x0007, 0x0019 }, + { 0x0007, 0x001a }, + { 0x0008, 0x0014 }, + { 0x0009, 0x0013 }, + { 0x000a, 0x0014 }, + { 0x000b, 0x0014 }, + { 0x000c, 0x0016 }, + { 0x000d, 0x0016 }, + { 0x000f, 0x0024 }, + { 0x0010, 0x0031 }, + { 0x0011, 0x004f }, + { 0x0014, 0x0031 }, + { 0x0014, 0x0032 }, + { 0x0014, 0x0033 }, + { 0x0014, 0x0034 }, + { 0x0014, 0x0035 }, + { 0x0014, 0x0036 }, + { 0x0014, 0x0037 }, + { 0x0014, 0x0038 }, + { 0x0014, 0x0039 }, + { 0x0014, 0x003a }, + { 0x0014, 0x003b }, + { 0x0007, 0x001b }, + { 0x0006, 0x002d }, + { 0x0006, 0x002e }, + { 0x0006, 0x002f }, + { 0x0007, 0x001c }, + { 0x0007, 0x001d }, + { 0x0008, 0x0015 }, + { 0x0009, 0x0014 }, + { 0x000a, 0x0015 }, + { 0x000a, 0x0016 }, + { 0x000c, 0x0017 }, + { 0x000d, 0x0017 }, + { 0x000e, 0x001b }, + { 0x000f, 0x0025 }, + { 0x0011, 0x0050 }, + { 0x0011, 0x0051 }, + { 0x0014, 0x003c }, + { 0x0014, 0x003d }, + { 0x0014, 0x003e }, + { 0x0014, 0x003f }, + { 0x0014, 0x0040 }, + { 0x0014, 0x0041 }, + { 0x0014, 0x0042 }, + { 0x0014, 0x0043 }, + { 0x0014, 0x0044 }, + { 0x0014, 0x0045 }, + { 0x0014, 0x0046 }, + { 0x0008, 0x0016 }, + { 0x0007, 0x001e }, + { 0x0007, 0x001f }, + { 0x0007, 0x0020 }, + { 0x0007, 0x0021 }, + { 0x0008, 0x0017 }, + { 0x0008, 0x0018 }, + { 0x0009, 0x0015 }, + { 0x000a, 0x0017 }, + { 0x000b, 0x0015 }, + { 0x000c, 0x0018 }, + { 0x000e, 0x001c }, + { 0x000e, 0x001d }, + { 0x0010, 0x0032 }, + { 0x0012, 0x008b }, + { 0x0012, 0x008c }, + { 0x0014, 0x0047 }, + { 0x0014, 0x0048 }, + { 0x0014, 0x0049 }, + { 0x0014, 0x004a }, + { 0x0014, 0x004b }, + { 0x0014, 0x004c }, + { 0x0014, 0x004d }, + { 0x0014, 0x004e }, + { 0x0014, 0x004f }, + { 0x0014, 0x0050 }, + { 0x0014, 0x0051 }, + { 0x0008, 0x0019 }, + { 0x0007, 0x0022 }, + { 0x0007, 0x0023 }, + { 0x0008, 0x001a }, + { 0x0008, 0x001b }, + { 0x0009, 0x0016 }, + { 0x0009, 0x0017 }, + { 0x000a, 0x0018 }, + { 0x000b, 0x0016 }, + { 0x000c, 0x0019 }, + { 0x000d, 0x0018 }, + { 0x000e, 0x001e }, + { 0x0010, 0x0033 }, + { 0x0011, 0x0052 }, + { 0x0014, 0x0052 }, + { 0x0013, 0x00e9 }, + { 0x0014, 0x0053 }, + { 0x0014, 0x0054 }, + { 0x0014, 0x0055 }, + { 0x0014, 0x0056 }, + { 0x0014, 0x0057 }, + { 0x0014, 0x0058 }, + { 0x0014, 0x0059 }, + { 0x0014, 0x005a }, + { 0x0014, 0x005b }, + { 0x0014, 0x005c }, + { 0x0014, 0x005d }, + { 0x0009, 0x0018 }, + { 0x0008, 0x001c }, + { 0x0008, 0x001d }, + { 0x0009, 0x0019 }, + { 0x0009, 0x001a }, + { 0x000a, 0x0019 }, + { 0x000a, 0x001a }, + { 0x000b, 0x0017 }, + { 0x000c, 0x001a }, + { 0x000d, 0x0019 }, + { 0x000e, 0x001f }, + { 0x000f, 0x0026 }, + { 0x0010, 0x0034 }, + { 0x0012, 0x008d }, + { 0x0013, 0x00ea }, + { 0x0014, 0x005e }, + { 0x0014, 0x005f }, + { 0x0014, 0x0060 }, + { 0x0014, 0x0061 }, + { 0x0014, 0x0062 }, + { 0x0014, 0x0063 }, + { 0x0014, 0x0064 }, + { 0x0014, 0x0065 }, + { 0x0014, 0x0066 }, + { 0x0014, 0x0067 }, + { 0x0014, 0x0068 }, + { 0x0014, 0x0069 }, + { 0x000b, 0x0018 }, + { 0x0009, 0x001b }, + { 0x000a, 0x001b }, + { 0x000a, 0x001c }, + { 0x000a, 0x001d }, + { 0x000b, 0x0019 }, + { 0x000b, 0x001a }, + { 0x000c, 0x001b }, + { 0x000d, 0x001a }, + { 0x000e, 0x0020 }, + { 0x000f, 0x0027 }, + { 0x0012, 0x008e }, + { 0x0011, 0x0053 }, + { 0x0013, 0x00eb }, + { 0x0014, 0x006a }, + { 0x0014, 0x006b }, + { 0x0014, 0x006c }, + { 0x0014, 0x006d }, + { 0x0014, 0x006e }, + { 0x0014, 0x006f }, + { 0x0014, 0x0070 }, + { 0x0014, 0x0071 }, + { 0x0014, 0x0072 }, + { 0x0014, 0x0073 }, + { 0x0014, 0x0074 }, + { 0x0014, 0x0075 }, + { 0x0014, 0x0076 }, + { 0x000c, 0x001c }, + { 0x000b, 0x001b }, + { 0x000b, 0x001c }, + { 0x000b, 0x001d }, + { 0x000c, 0x001d }, + { 0x000c, 0x001e }, + { 0x000d, 0x001b }, + { 0x000d, 0x001c }, + { 0x000e, 0x0021 }, + { 0x0010, 0x0035 }, + { 0x0010, 0x0036 }, + { 0x0011, 0x0054 }, + { 0x0013, 0x00ec }, + { 0x0014, 0x0077 }, + { 0x0014, 0x0078 }, + { 0x0014, 0x0079 }, + { 0x0014, 0x007a }, + { 0x0014, 0x007b }, + { 0x0014, 0x007c }, + { 0x0014, 0x007d }, + { 0x0014, 0x007e }, + { 0x0014, 0x007f }, + { 0x0014, 0x0080 }, + { 0x0014, 0x0081 }, + { 0x0014, 0x0082 }, + { 0x0014, 0x0083 }, + { 0x0014, 0x0084 }, + { 0x000d, 0x001d }, + { 0x000c, 0x001f }, + { 0x000c, 0x0020 }, + { 0x000c, 0x0021 }, + { 0x000d, 0x001e }, + { 0x000d, 0x001f }, + { 0x000e, 0x0022 }, + { 0x000f, 0x0028 }, + { 0x0010, 0x0037 }, + { 0x0010, 0x0038 }, + { 0x0010, 0x0039 }, + { 0x0012, 0x008f }, + { 0x0013, 0x00ed }, + { 0x0014, 0x0085 }, + { 0x0014, 0x0086 }, + { 0x0014, 0x0087 }, + { 0x0014, 0x0088 }, + { 0x0014, 0x0089 }, + { 0x0014, 0x008a }, + { 0x0014, 0x008b }, + { 0x0014, 0x008c }, + { 0x0014, 0x008d }, + { 0x0014, 0x008e }, + { 0x0014, 0x008f }, + { 0x0014, 0x0090 }, + { 0x0014, 0x0091 }, + { 0x0014, 0x0092 }, + { 0x000e, 0x0023 }, + { 0x000d, 0x0020 }, + { 0x000d, 0x0021 }, + { 0x000e, 0x0024 }, + { 0x000e, 0x0025 }, + { 0x000e, 0x0026 }, + { 0x000f, 0x0029 }, + { 0x0010, 0x003a }, + { 0x0010, 0x003b }, + { 0x0012, 0x0090 }, + { 0x0014, 0x0093 }, + { 0x0014, 0x0094 }, + { 0x0014, 0x0095 }, + { 0x0014, 0x0096 }, + { 0x0014, 0x0097 }, + { 0x0014, 0x0098 }, + { 0x0014, 0x0099 }, + { 0x0014, 0x009a }, + { 0x0014, 0x009b }, + { 0x0014, 0x009c }, + { 0x0014, 0x009d }, + { 0x0014, 0x009e }, + { 0x0014, 0x009f }, + { 0x0014, 0x00a0 }, + { 0x0014, 0x00a1 }, + { 0x0014, 0x00a2 }, + { 0x0014, 0x00a3 }, + { 0x000f, 0x002a }, + { 0x000e, 0x0027 }, + { 0x000f, 0x002b }, + { 0x000f, 0x002c }, + { 0x000f, 0x002d }, + { 0x0010, 0x003c }, + { 0x0010, 0x003d }, + { 0x0011, 0x0055 }, + { 0x0011, 0x0056 }, + { 0x0014, 0x00a4 }, + { 0x0014, 0x00a5 }, + { 0x0014, 0x00a6 }, + { 0x0014, 0x00a7 }, + { 0x0014, 0x00a8 }, + { 0x0014, 0x00a9 }, + { 0x0014, 0x00aa }, + { 0x0014, 0x00ab }, + { 0x0014, 0x00ac }, + { 0x0014, 0x00ad }, + { 0x0014, 0x00ae }, + { 0x0014, 0x00af }, + { 0x0014, 0x00b0 }, + { 0x0014, 0x00b1 }, + { 0x0014, 0x00b2 }, + { 0x0014, 0x00b3 }, + { 0x0014, 0x00b4 }, + { 0x0014, 0x00b5 }, + { 0x0012, 0x0091 }, + { 0x0010, 0x003e }, + { 0x0010, 0x003f }, + { 0x0011, 0x0057 }, + { 0x0011, 0x0058 }, + { 0x0011, 0x0059 }, + { 0x0012, 0x0092 }, + { 0x0013, 0x00ee }, + { 0x0013, 0x00ef }, + { 0x0012, 0x0093 }, + { 0x0014, 0x00b6 }, + { 0x0014, 0x00b7 }, + { 0x0014, 0x00b8 }, + { 0x0014, 0x00b9 }, + { 0x0014, 0x00ba }, + { 0x0014, 0x00bb }, + { 0x0014, 0x00bc }, + { 0x0014, 0x00bd }, + { 0x0014, 0x00be }, + { 0x0014, 0x00bf }, + { 0x0014, 0x00c0 }, + { 0x0014, 0x00c1 }, + { 0x0014, 0x00c2 }, + { 0x0014, 0x00c3 }, + { 0x0014, 0x00c4 }, + { 0x0014, 0x00c5 }, + { 0x0014, 0x00c6 }, + { 0x0013, 0x00f0 }, + { 0x0012, 0x0094 }, + { 0x0012, 0x0095 }, + { 0x0012, 0x0096 }, + { 0x0014, 0x00c7 }, + { 0x0014, 0x00c8 }, + { 0x0014, 0x00c9 }, + { 0x0014, 0x00ca }, + { 0x0014, 0x00cb }, + { 0x0014, 0x00cc }, + { 0x0014, 0x00cd }, + { 0x0014, 0x00ce }, + { 0x0014, 0x00cf }, + { 0x0014, 0x00d0 }, + { 0x0014, 0x00d1 }, + { 0x0014, 0x00d2 }, + { 0x0014, 0x00d3 }, + { 0x0014, 0x00d4 }, + { 0x0014, 0x00d5 }, + { 0x0014, 0x00d6 }, + { 0x0014, 0x00d7 }, + { 0x0014, 0x00d8 }, + { 0x0014, 0x00d9 }, + { 0x0014, 0x00da }, + { 0x0014, 0x00db }, + { 0x0014, 0x00dc }, + { 0x0014, 0x00dd }, + { 0x0014, 0x00de }, + { 0x0012, 0x0097 }, + { 0x0014, 0x00df }, + { 0x0014, 0x00e0 }, + { 0x0014, 0x00e1 }, + { 0x0014, 0x00e2 }, + { 0x0014, 0x00e3 }, + { 0x0014, 0x00e4 }, + { 0x0014, 0x00e5 }, + { 0x0014, 0x00e6 }, + { 0x0014, 0x00e7 }, + { 0x0014, 0x00e8 }, + { 0x0014, 0x00e9 }, + { 0x0014, 0x00ea }, + { 0x0014, 0x00eb }, + { 0x0014, 0x00ec }, + { 0x0014, 0x00ed }, + { 0x0014, 0x00ee }, + { 0x0014, 0x00ef }, + { 0x0014, 0x00f0 }, + { 0x0014, 0x00f1 }, + { 0x0014, 0x00f2 }, + { 0x0014, 0x00f3 }, + { 0x0014, 0x00f4 }, + { 0x0014, 0x00f5 }, + { 0x0014, 0x00f6 }, + { 0x0014, 0x00f7 }, + { 0x0014, 0x00f8 }, + { 0x0014, 0x00f9 }, + { 0x0014, 0x00fa }, + { 0x0014, 0x00fb }, + { 0x0014, 0x00fc }, + { 0x0014, 0x00fd }, + { 0x0014, 0x00fe }, + { 0x0014, 0x00ff }, + { 0x0014, 0x0100 }, + { 0x0014, 0x0101 }, + { 0x0014, 0x0102 }, + { 0x0014, 0x0103 }, + { 0x0014, 0x0104 }, + { 0x0014, 0x0105 }, + { 0x0014, 0x0106 }, + { 0x0014, 0x0107 }, + { 0x0014, 0x0108 }, + { 0x0014, 0x0109 }, + { 0x0014, 0x010a }, + { 0x0014, 0x010b }, + { 0x0014, 0x010c }, + { 0x0014, 0x010d }, + { 0x0014, 0x010e }, + { 0x0014, 0x010f }, + { 0x0014, 0x0110 }, + { 0x0014, 0x0111 }, + { 0x0014, 0x0112 }, + { 0x0014, 0x0113 }, + { 0x0014, 0x0114 }, + { 0x0014, 0x0115 }, + { 0x0014, 0x0116 }, + { 0x0014, 0x0117 }, + { 0x0014, 0x0118 }, + { 0x0014, 0x0119 }, + { 0x0014, 0x011a }, + { 0x0014, 0x011b }, + { 0x0014, 0x011c }, + { 0x0014, 0x011d }, + { 0x0014, 0x011e }, + { 0x0014, 0x011f }, + { 0x0014, 0x0120 }, + { 0x0014, 0x0121 }, + { 0x0014, 0x0122 }, + { 0x0014, 0x0123 }, + { 0x0014, 0x0124 }, + { 0x0014, 0x0125 }, + { 0x0014, 0x0126 }, + { 0x0014, 0x0127 }, + { 0x0014, 0x0128 }, + { 0x0014, 0x0129 }, + { 0x0014, 0x012a }, + { 0x0014, 0x012b }, + { 0x0014, 0x012c }, + { 0x0014, 0x012d }, + { 0x0014, 0x012e }, + { 0x0014, 0x012f }, + { 0x0014, 0x0130 }, + { 0x0014, 0x0131 }, + { 0x0014, 0x0132 }, + { 0x0014, 0x0133 }, + { 0x0014, 0x0134 }, + { 0x0014, 0x0135 }, + { 0x0014, 0x0136 }, + { 0x0014, 0x0137 }, + { 0x0014, 0x0138 }, + { 0x0014, 0x0139 }, + { 0x0014, 0x013a }, + { 0x0014, 0x013b }, + { 0x0014, 0x013c }, + { 0x0014, 0x013d }, + { 0x0014, 0x013e }, + { 0x0014, 0x013f }, + { 0x0014, 0x0140 }, + { 0x0014, 0x0141 }, + { 0x0014, 0x0142 }, + { 0x0014, 0x0143 }, + { 0x0014, 0x0144 }, + { 0x0014, 0x0145 }, + { 0x0014, 0x0146 }, + { 0x0014, 0x0147 }, + { 0x0014, 0x0148 }, + { 0x0014, 0x0149 }, + { 0x0014, 0x014a }, + { 0x0014, 0x014b }, + { 0x0014, 0x014c }, + { 0x0014, 0x014d }, + { 0x0014, 0x014e }, + { 0x0014, 0x014f }, + { 0x0014, 0x0150 }, + { 0x0014, 0x0151 }, + { 0x0014, 0x0152 }, + { 0x0014, 0x0153 }, + { 0x0014, 0x0154 }, + { 0x0014, 0x0155 }, + { 0x0014, 0x0156 }, + { 0x0014, 0x0157 }, + { 0x0014, 0x0158 }, + { 0x0014, 0x0159 }, + { 0x0014, 0x015a }, + { 0x0014, 0x015b }, + { 0x0014, 0x015c }, + { 0x0014, 0x015d }, + { 0x0014, 0x015e }, + { 0x0014, 0x015f }, + { 0x0014, 0x0160 }, + { 0x0014, 0x0161 }, + { 0x0014, 0x0162 }, + { 0x0014, 0x0163 }, + { 0x0014, 0x0164 }, + { 0x0014, 0x0165 }, + { 0x0014, 0x0166 }, + { 0x0014, 0x0167 }, + { 0x0014, 0x0168 }, + { 0x0014, 0x0169 }, + { 0x0014, 0x016a }, + { 0x0014, 0x016b }, + { 0x0014, 0x016c }, + { 0x0014, 0x016d }, + { 0x0014, 0x016e }, + { 0x0014, 0x016f }, + { 0x0014, 0x0170 }, + { 0x0014, 0x0171 }, + { 0x0014, 0x0172 }, + { 0x0014, 0x0173 }, + { 0x0014, 0x0174 }, + { 0x0014, 0x0175 }, + { 0x0014, 0x0176 }, + { 0x0014, 0x0177 }, + { 0x0014, 0x0178 }, + { 0x0014, 0x0179 }, + { 0x0014, 0x017a }, + { 0x0014, 0x017b }, + { 0x0014, 0x017c }, + { 0x0014, 0x017d }, + { 0x0014, 0x017e }, + { 0x0014, 0x017f }, + { 0x0014, 0x0180 }, + { 0x0014, 0x0181 }, + { 0x0014, 0x0182 }, + { 0x0014, 0x0183 }, + { 0x0014, 0x0184 }, + { 0x0014, 0x0185 }, + { 0x0014, 0x0186 }, + { 0x0014, 0x0187 }, + { 0x0014, 0x0188 }, + { 0x0014, 0x0189 }, + { 0x0014, 0x018a }, + { 0x0014, 0x018b }, + { 0x0014, 0x018c }, + { 0x0014, 0x018d }, + { 0x0014, 0x018e }, + { 0x0014, 0x018f }, + { 0x0014, 0x0190 }, + { 0x0014, 0x0191 }, + { 0x0014, 0x0192 }, + { 0x0014, 0x0193 }, + { 0x0014, 0x0194 }, + { 0x0014, 0x0195 }, + { 0x0014, 0x0196 }, + { 0x0014, 0x0197 }, + { 0x0014, 0x0198 }, + { 0x0014, 0x0199 }, + { 0x0014, 0x019a }, + { 0x0014, 0x019b }, + { 0x0014, 0x019c }, + { 0x0014, 0x019d }, + { 0x0014, 0x019e }, + { 0x0014, 0x019f }, + { 0x0014, 0x01a0 }, + { 0x0014, 0x01a1 }, + { 0x0014, 0x01a2 }, + { 0x0014, 0x01a3 }, + { 0x0014, 0x01a4 }, + { 0x0014, 0x01a5 }, + { 0x0014, 0x01a6 }, + { 0x0014, 0x01a7 }, + { 0x0014, 0x01a8 }, + { 0x0014, 0x01a9 }, + { 0x0014, 0x01aa }, + { 0x0014, 0x01ab }, + { 0x0014, 0x01ac }, + { 0x0014, 0x01ad }, + { 0x0014, 0x01ae }, + { 0x0014, 0x01af }, + { 0x0014, 0x01b0 }, + { 0x0014, 0x01b1 }, + { 0x0014, 0x01b2 }, + { 0x0014, 0x01b3 }, + { 0x0014, 0x01b4 }, + { 0x0014, 0x01b5 }, + { 0x0014, 0x01b6 }, + { 0x0014, 0x01b7 }, + { 0x0014, 0x01b8 }, + { 0x0014, 0x01b9 }, + { 0x0014, 0x01ba }, + { 0x0014, 0x01bb }, + { 0x0014, 0x01bc }, + { 0x0014, 0x01bd }, + { 0x0014, 0x01be }, + { 0x0014, 0x01bf }, + { 0x0014, 0x01c0 }, + { 0x0014, 0x01c1 }, + { 0x0014, 0x01c2 }, + { 0x0014, 0x01c3 }, + { 0x0014, 0x01c4 }, + { 0x0014, 0x01c5 }, + { 0x0014, 0x01c6 }, + { 0x0014, 0x01c7 }, + { 0x0013, 0x00f1 }, + { 0x0013, 0x00f2 }, + { 0x0013, 0x00f3 }, + { 0x0013, 0x00f4 }, + { 0x0013, 0x00f5 }, + { 0x0013, 0x00f6 }, + { 0x0013, 0x00f7 }, + { 0x0013, 0x00f8 }, + { 0x0013, 0x00f9 }, + { 0x0013, 0x00fa }, + { 0x0013, 0x00fb }, + { 0x0013, 0x00fc }, + { 0x0013, 0x00fd }, + { 0x0013, 0x00fe }, + { 0x0013, 0x00ff }, + { 0x0013, 0x0100 }, + { 0x0013, 0x0101 }, + { 0x0013, 0x0102 }, + { 0x0013, 0x0103 }, + { 0x0013, 0x0104 }, + { 0x0013, 0x0105 }, + { 0x0013, 0x0106 }, + { 0x0013, 0x0107 }, + { 0x0013, 0x0108 }, + { 0x0013, 0x0109 }, + { 0x0013, 0x010a }, + { 0x0013, 0x010b }, + { 0x0013, 0x010c }, + { 0x0013, 0x010d }, + { 0x0013, 0x010e }, + { 0x0013, 0x010f }, + { 0x0013, 0x0110 }, + { 0x0013, 0x0111 }, + { 0x0013, 0x0112 }, + { 0x0013, 0x0113 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc18[28][2] = { + { 0x0004, 0x0001 }, + { 0x0003, 0x0002 }, + { 0x0003, 0x0003 }, + { 0x0003, 0x0004 }, + { 0x0003, 0x0005 }, + { 0x0003, 0x0006 }, + { 0x0003, 0x0007 }, + { 0x0004, 0x0002 }, + { 0x0004, 0x0003 }, + { 0x0005, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x0008, 0x0001 }, + { 0x0009, 0x0001 }, + { 0x000a, 0x0001 }, + { 0x000b, 0x0001 }, + { 0x000c, 0x0001 }, + { 0x000d, 0x0001 }, + { 0x000e, 0x0001 }, + { 0x000f, 0x0001 }, + { 0x0011, 0x0003 }, + { 0x0012, 0x0001 }, + { 0x0012, 0x0002 }, + { 0x0012, 0x0003 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0012, 0x0004 }, + { 0x0012, 0x0005 }, + +}; + + +const UWord16 c_aauiLCLDHuffEnc19[29][2] = { + { 0x0004, 0x0002 }, + { 0x0003, 0x0003 }, + { 0x0003, 0x0004 }, + { 0x0003, 0x0005 }, + { 0x0003, 0x0006 }, + { 0x0003, 0x0007 }, + { 0x0004, 0x0003 }, + { 0x0004, 0x0004 }, + { 0x0004, 0x0005 }, + { 0x0005, 0x0001 }, + { 0x0005, 0x0002 }, + { 0x0005, 0x0003 }, + { 0x0006, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x0008, 0x0001 }, + { 0x0009, 0x0001 }, + { 0x000a, 0x0001 }, + { 0x000b, 0x0001 }, + { 0x000c, 0x0001 }, + { 0x000d, 0x0001 }, + { 0x000e, 0x0001 }, + { 0x000f, 0x0001 }, + { 0x0010, 0x0001 }, + { 0x0012, 0x0002 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0012, 0x0003 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc20[32][2] = { + { 0x0004, 0x0002 }, + { 0x0003, 0x0005 }, + { 0x0003, 0x0006 }, + { 0x0003, 0x0007 }, + { 0x0004, 0x0003 }, + { 0x0004, 0x0004 }, + { 0x0004, 0x0005 }, + { 0x0004, 0x0006 }, + { 0x0004, 0x0007 }, + { 0x0004, 0x0008 }, + { 0x0004, 0x0009 }, + { 0x0005, 0x0002 }, + { 0x0005, 0x0003 }, + { 0x0006, 0x0001 }, + { 0x0006, 0x0002 }, + { 0x0006, 0x0003 }, + { 0x0007, 0x0001 }, + { 0x0008, 0x0001 }, + { 0x0009, 0x0001 }, + { 0x000a, 0x0001 }, + { 0x000b, 0x0001 }, + { 0x000c, 0x0001 }, + { 0x000d, 0x0001 }, + { 0x000e, 0x0001 }, + { 0x000f, 0x0001 }, + { 0x0010, 0x0001 }, + { 0x0011, 0x0001 }, + { 0x0014, 0x0000 }, + { 0x0014, 0x0001 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, +}; + +const UWord16 c_aauiLCLDHuffEnc21[37][2] = { + { 0x0005, 0x0002 }, + { 0x0003, 0x0006 }, + { 0x0003, 0x0007 }, + { 0x0004, 0x0003 }, + { 0x0004, 0x0004 }, + { 0x0004, 0x0005 }, + { 0x0004, 0x0006 }, + { 0x0004, 0x0007 }, + { 0x0004, 0x0008 }, + { 0x0004, 0x0009 }, + { 0x0004, 0x000a }, + { 0x0004, 0x000b }, + { 0x0005, 0x0003 }, + { 0x0005, 0x0004 }, + { 0x0005, 0x0005 }, + { 0x0006, 0x0002 }, + { 0x0006, 0x0003 }, + { 0x0007, 0x0002 }, + { 0x0007, 0x0003 }, + { 0x0008, 0x0001 }, + { 0x0008, 0x0002 }, + { 0x0008, 0x0003 }, + { 0x0009, 0x0001 }, + { 0x000b, 0x0001 }, + { 0x000b, 0x0002 }, + { 0x000b, 0x0003 }, + { 0x000c, 0x0001 }, + { 0x000d, 0x0001 }, + { 0x000e, 0x0001 }, + { 0x000f, 0x0001 }, + { 0x0010, 0x0001 }, + { 0x0011, 0x0001 }, + { 0x0014, 0x0000 }, + { 0x0014, 0x0001 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc22[39][2] = { + { 0x0005, 0x0002 }, + { 0x0004, 0x0004 }, + { 0x0004, 0x0005 }, + { 0x0004, 0x0006 }, + { 0x0004, 0x0007 }, + { 0x0004, 0x0008 }, + { 0x0004, 0x0009 }, + { 0x0004, 0x000a }, + { 0x0004, 0x000b }, + { 0x0004, 0x000c }, + { 0x0004, 0x000d }, + { 0x0004, 0x000e }, + { 0x0004, 0x000f }, + { 0x0005, 0x0003 }, + { 0x0005, 0x0004 }, + { 0x0005, 0x0005 }, + { 0x0005, 0x0006 }, + { 0x0005, 0x0007 }, + { 0x0006, 0x0002 }, + { 0x0006, 0x0003 }, + { 0x0007, 0x0002 }, + { 0x0007, 0x0003 }, + { 0x0008, 0x0002 }, + { 0x0008, 0x0003 }, + { 0x0009, 0x0002 }, + { 0x0009, 0x0003 }, + { 0x000a, 0x0001 }, + { 0x000a, 0x0002 }, + { 0x000a, 0x0003 }, + { 0x000c, 0x0001 }, + { 0x000c, 0x0002 }, + { 0x000c, 0x0003 }, + { 0x000e, 0x0001 }, + { 0x000e, 0x0002 }, + { 0x000f, 0x0001 }, + { 0x000e, 0x0003 }, + { 0x0011, 0x0000 }, + { 0x0010, 0x0001 }, + { 0x0011, 0x0001 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc23[46][2] = { + { 0x0005, 0x0003 }, + { 0x0004, 0x0006 }, + { 0x0004, 0x0007 }, + { 0x0004, 0x0008 }, + { 0x0004, 0x0009 }, + { 0x0004, 0x000a }, + { 0x0004, 0x000b }, + { 0x0004, 0x000c }, + { 0x0004, 0x000d }, + { 0x0004, 0x000e }, + { 0x0004, 0x000f }, + { 0x0005, 0x0004 }, + { 0x0005, 0x0005 }, + { 0x0005, 0x0006 }, + { 0x0005, 0x0007 }, + { 0x0005, 0x0008 }, + { 0x0005, 0x0009 }, + { 0x0005, 0x000a }, + { 0x0005, 0x000b }, + { 0x0006, 0x0003 }, + { 0x0006, 0x0004 }, + { 0x0006, 0x0005 }, + { 0x0007, 0x0002 }, + { 0x0007, 0x0003 }, + { 0x0007, 0x0004 }, + { 0x0007, 0x0005 }, + { 0x0008, 0x0002 }, + { 0x0008, 0x0003 }, + { 0x0009, 0x0002 }, + { 0x0009, 0x0003 }, + { 0x000a, 0x0002 }, + { 0x000a, 0x0003 }, + { 0x000b, 0x0002 }, + { 0x000b, 0x0003 }, + { 0x000c, 0x0002 }, + { 0x000c, 0x0003 }, + { 0x000d, 0x0002 }, + { 0x000d, 0x0003 }, + { 0x000e, 0x0001 }, + { 0x000e, 0x0002 }, + { 0x000e, 0x0003 }, + { 0x000f, 0x0001 }, + { 0x0010, 0x0001 }, + { 0x0012, 0x0000 }, + { 0x0012, 0x0001 }, + { 0x0011, 0x0001 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc24[55][2] = { + { 0x0005, 0x0004 }, + { 0x0004, 0x0009 }, + { 0x0004, 0x000a }, + { 0x0004, 0x000b }, + { 0x0004, 0x000c }, + { 0x0004, 0x000d }, + { 0x0004, 0x000e }, + { 0x0004, 0x000f }, + { 0x0005, 0x0005 }, + { 0x0005, 0x0006 }, + { 0x0005, 0x0007 }, + { 0x0005, 0x0008 }, + { 0x0005, 0x0009 }, + { 0x0005, 0x000a }, + { 0x0005, 0x000b }, + { 0x0005, 0x000c }, + { 0x0005, 0x000d }, + { 0x0005, 0x000e }, + { 0x0005, 0x000f }, + { 0x0005, 0x0010 }, + { 0x0005, 0x0011 }, + { 0x0006, 0x0003 }, + { 0x0006, 0x0004 }, + { 0x0006, 0x0005 }, + { 0x0006, 0x0006 }, + { 0x0006, 0x0007 }, + { 0x0007, 0x0003 }, + { 0x0007, 0x0004 }, + { 0x0007, 0x0005 }, + { 0x0008, 0x0003 }, + { 0x0008, 0x0004 }, + { 0x0008, 0x0005 }, + { 0x0009, 0x0002 }, + { 0x0009, 0x0003 }, + { 0x0009, 0x0004 }, + { 0x0009, 0x0005 }, + { 0x000a, 0x0002 }, + { 0x000a, 0x0003 }, + { 0x000b, 0x0002 }, + { 0x000b, 0x0003 }, + { 0x000c, 0x0003 }, + { 0x000d, 0x0002 }, + { 0x000d, 0x0003 }, + { 0x000d, 0x0004 }, + { 0x000d, 0x0005 }, + { 0x000e, 0x0002 }, + { 0x000e, 0x0003 }, + { 0x000f, 0x0001 }, + { 0x000f, 0x0002 }, + { 0x000f, 0x0003 }, + { 0x0010, 0x0001 }, + { 0x0011, 0x0001 }, + { 0x0013, 0x0000 }, + { 0x0012, 0x0001 }, + { 0x0013, 0x0001 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc25[65][2] = { + { 0x0005, 0x0005 }, + { 0x0004, 0x000c }, + { 0x0004, 0x000d }, + { 0x0004, 0x000e }, + { 0x0005, 0x0006 }, + { 0x0004, 0x000f }, + { 0x0005, 0x0007 }, + { 0x0005, 0x0008 }, + { 0x0005, 0x0009 }, + { 0x0005, 0x000a }, + { 0x0005, 0x000b }, + { 0x0005, 0x000c }, + { 0x0005, 0x000d }, + { 0x0005, 0x000e }, + { 0x0005, 0x000f }, + { 0x0005, 0x0010 }, + { 0x0005, 0x0011 }, + { 0x0005, 0x0012 }, + { 0x0005, 0x0013 }, + { 0x0005, 0x0014 }, + { 0x0005, 0x0015 }, + { 0x0005, 0x0016 }, + { 0x0005, 0x0017 }, + { 0x0006, 0x0004 }, + { 0x0006, 0x0005 }, + { 0x0006, 0x0006 }, + { 0x0006, 0x0007 }, + { 0x0006, 0x0008 }, + { 0x0006, 0x0009 }, + { 0x0007, 0x0003 }, + { 0x0007, 0x0004 }, + { 0x0007, 0x0005 }, + { 0x0007, 0x0006 }, + { 0x0007, 0x0007 }, + { 0x0008, 0x0003 }, + { 0x0008, 0x0004 }, + { 0x0008, 0x0005 }, + { 0x0009, 0x0003 }, + { 0x0009, 0x0004 }, + { 0x0009, 0x0005 }, + { 0x000a, 0x0003 }, + { 0x000a, 0x0004 }, + { 0x000a, 0x0005 }, + { 0x000b, 0x0003 }, + { 0x000b, 0x0004 }, + { 0x000b, 0x0005 }, + { 0x000c, 0x0002 }, + { 0x000c, 0x0003 }, + { 0x000c, 0x0004 }, + { 0x000c, 0x0005 }, + { 0x000d, 0x0003 }, + { 0x000e, 0x0003 }, + { 0x000e, 0x0004 }, + { 0x000f, 0x0003 }, + { 0x000e, 0x0005 }, + { 0x000f, 0x0004 }, + { 0x0010, 0x0001 }, + { 0x000f, 0x0005 }, + { 0x0010, 0x0002 }, + { 0x0010, 0x0003 }, + { 0x0010, 0x0004 }, + { 0x0010, 0x0005 }, + { 0x0011, 0x0001 }, + { 0x0012, 0x0000 }, + { 0x0012, 0x0001 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc26[77][2] = { + { 0x0006, 0x0004 }, + { 0x0005, 0x0007 }, + { 0x0005, 0x0008 }, + { 0x0005, 0x0009 }, + { 0x0005, 0x000a }, + { 0x0005, 0x000b }, + { 0x0005, 0x000c }, + { 0x0005, 0x000d }, + { 0x0005, 0x000e }, + { 0x0005, 0x000f }, + { 0x0005, 0x0010 }, + { 0x0005, 0x0011 }, + { 0x0005, 0x0012 }, + { 0x0005, 0x0013 }, + { 0x0005, 0x0014 }, + { 0x0005, 0x0015 }, + { 0x0005, 0x0016 }, + { 0x0005, 0x0017 }, + { 0x0005, 0x0018 }, + { 0x0005, 0x0019 }, + { 0x0005, 0x001a }, + { 0x0005, 0x001b }, + { 0x0005, 0x001c }, + { 0x0005, 0x001d }, + { 0x0005, 0x001e }, + { 0x0005, 0x001f }, + { 0x0006, 0x0005 }, + { 0x0006, 0x0006 }, + { 0x0006, 0x0007 }, + { 0x0006, 0x0008 }, + { 0x0006, 0x0009 }, + { 0x0006, 0x000a }, + { 0x0006, 0x000b }, + { 0x0006, 0x000c }, + { 0x0006, 0x000d }, + { 0x0007, 0x0004 }, + { 0x0007, 0x0005 }, + { 0x0007, 0x0006 }, + { 0x0007, 0x0007 }, + { 0x0008, 0x0004 }, + { 0x0008, 0x0005 }, + { 0x0008, 0x0006 }, + { 0x0008, 0x0007 }, + { 0x0009, 0x0003 }, + { 0x0009, 0x0004 }, + { 0x0009, 0x0005 }, + { 0x0009, 0x0006 }, + { 0x0009, 0x0007 }, + { 0x000a, 0x0003 }, + { 0x000a, 0x0004 }, + { 0x000a, 0x0005 }, + { 0x000b, 0x0004 }, + { 0x000b, 0x0005 }, + { 0x000c, 0x0003 }, + { 0x000c, 0x0004 }, + { 0x000c, 0x0005 }, + { 0x000c, 0x0006 }, + { 0x000c, 0x0007 }, + { 0x000d, 0x0003 }, + { 0x000d, 0x0004 }, + { 0x000e, 0x0002 }, + { 0x000d, 0x0005 }, + { 0x000e, 0x0003 }, + { 0x000e, 0x0004 }, + { 0x000f, 0x0003 }, + { 0x000e, 0x0005 }, + { 0x0010, 0x0002 }, + { 0x0010, 0x0003 }, + { 0x0010, 0x0004 }, + { 0x0011, 0x0002 }, + { 0x0012, 0x0001 }, + { 0x0010, 0x0005 }, + { 0x0012, 0x0002 }, + { 0x0011, 0x0003 }, + { 0x0012, 0x0003 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + +}; + + +const UWord16 c_aauiLCLDHuffEnc27[91][2] = { + { 0x0006, 0x0006 }, + { 0x0005, 0x000b }, + { 0x0005, 0x000c }, + { 0x0005, 0x000d }, + { 0x0005, 0x000e }, + { 0x0005, 0x000f }, + { 0x0005, 0x0010 }, + { 0x0005, 0x0011 }, + { 0x0005, 0x0012 }, + { 0x0005, 0x0013 }, + { 0x0005, 0x0014 }, + { 0x0005, 0x0015 }, + { 0x0005, 0x0016 }, + { 0x0005, 0x0017 }, + { 0x0005, 0x0018 }, + { 0x0005, 0x0019 }, + { 0x0005, 0x001a }, + { 0x0005, 0x001b }, + { 0x0005, 0x001c }, + { 0x0005, 0x001d }, + { 0x0005, 0x001e }, + { 0x0005, 0x001f }, + { 0x0006, 0x0007 }, + { 0x0006, 0x0008 }, + { 0x0006, 0x0009 }, + { 0x0006, 0x000a }, + { 0x0006, 0x000b }, + { 0x0006, 0x000c }, + { 0x0006, 0x000d }, + { 0x0006, 0x000e }, + { 0x0006, 0x000f }, + { 0x0006, 0x0010 }, + { 0x0006, 0x0011 }, + { 0x0006, 0x0012 }, + { 0x0006, 0x0013 }, + { 0x0006, 0x0014 }, + { 0x0006, 0x0015 }, + { 0x0007, 0x0005 }, + { 0x0007, 0x0006 }, + { 0x0007, 0x0007 }, + { 0x0007, 0x0008 }, + { 0x0007, 0x0009 }, + { 0x0007, 0x000a }, + { 0x0007, 0x000b }, + { 0x0008, 0x0004 }, + { 0x0008, 0x0005 }, + { 0x0008, 0x0006 }, + { 0x0008, 0x0007 }, + { 0x0008, 0x0008 }, + { 0x0008, 0x0009 }, + { 0x0009, 0x0004 }, + { 0x0009, 0x0005 }, + { 0x0009, 0x0006 }, + { 0x0009, 0x0007 }, + { 0x000a, 0x0004 }, + { 0x000a, 0x0005 }, + { 0x000a, 0x0006 }, + { 0x000a, 0x0007 }, + { 0x000b, 0x0004 }, + { 0x000b, 0x0005 }, + { 0x000b, 0x0006 }, + { 0x000b, 0x0007 }, + { 0x000c, 0x0004 }, + { 0x000c, 0x0005 }, + { 0x000c, 0x0006 }, + { 0x000c, 0x0007 }, + { 0x000d, 0x0004 }, + { 0x000d, 0x0005 }, + { 0x000d, 0x0006 }, + { 0x000d, 0x0007 }, + { 0x000e, 0x0003 }, + { 0x000e, 0x0004 }, + { 0x000e, 0x0005 }, + { 0x000e, 0x0006 }, + { 0x000e, 0x0007 }, + { 0x000f, 0x0003 }, + { 0x000f, 0x0004 }, + { 0x0010, 0x0003 }, + { 0x000f, 0x0005 }, + { 0x0012, 0x0000 }, + { 0x0010, 0x0004 }, + { 0x0010, 0x0005 }, + { 0x0012, 0x0001 }, + { 0x0012, 0x0002 }, + { 0x0011, 0x0004 }, + { 0x0011, 0x0005 }, + { 0x0012, 0x0003 }, + { 0x0012, 0x0004 }, + { 0x0012, 0x0005 }, + { 0x0012, 0x0006 }, + { 0x0012, 0x0007 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc28[109][2] = { + { 0x0006, 0x0008 }, + { 0x0005, 0x0010 }, + { 0x0005, 0x0011 }, + { 0x0005, 0x0012 }, + { 0x0005, 0x0013 }, + { 0x0005, 0x0014 }, + { 0x0005, 0x0015 }, + { 0x0005, 0x0016 }, + { 0x0005, 0x0017 }, + { 0x0005, 0x0018 }, + { 0x0005, 0x0019 }, + { 0x0005, 0x001a }, + { 0x0005, 0x001b }, + { 0x0005, 0x001c }, + { 0x0005, 0x001d }, + { 0x0005, 0x001e }, + { 0x0006, 0x0009 }, + { 0x0005, 0x001f }, + { 0x0006, 0x000a }, + { 0x0006, 0x000b }, + { 0x0006, 0x000c }, + { 0x0006, 0x000d }, + { 0x0006, 0x000e }, + { 0x0006, 0x000f }, + { 0x0006, 0x0010 }, + { 0x0006, 0x0011 }, + { 0x0006, 0x0012 }, + { 0x0006, 0x0013 }, + { 0x0006, 0x0014 }, + { 0x0006, 0x0015 }, + { 0x0006, 0x0016 }, + { 0x0006, 0x0017 }, + { 0x0006, 0x0018 }, + { 0x0006, 0x0019 }, + { 0x0006, 0x001a }, + { 0x0006, 0x001b }, + { 0x0006, 0x001c }, + { 0x0006, 0x001d }, + { 0x0006, 0x001e }, + { 0x0006, 0x001f }, + { 0x0007, 0x0006 }, + { 0x0007, 0x0007 }, + { 0x0007, 0x0008 }, + { 0x0007, 0x0009 }, + { 0x0007, 0x000a }, + { 0x0007, 0x000b }, + { 0x0007, 0x000c }, + { 0x0007, 0x000d }, + { 0x0007, 0x000e }, + { 0x0007, 0x000f }, + { 0x0008, 0x0005 }, + { 0x0008, 0x0006 }, + { 0x0008, 0x0007 }, + { 0x0008, 0x0008 }, + { 0x0008, 0x0009 }, + { 0x0008, 0x000a }, + { 0x0008, 0x000b }, + { 0x0009, 0x0004 }, + { 0x0009, 0x0005 }, + { 0x0009, 0x0006 }, + { 0x0009, 0x0007 }, + { 0x0009, 0x0008 }, + { 0x0009, 0x0009 }, + { 0x000a, 0x0005 }, + { 0x000a, 0x0006 }, + { 0x000a, 0x0007 }, + { 0x000b, 0x0005 }, + { 0x000b, 0x0006 }, + { 0x000b, 0x0007 }, + { 0x000b, 0x0008 }, + { 0x000b, 0x0009 }, + { 0x000c, 0x0004 }, + { 0x000c, 0x0005 }, + { 0x000c, 0x0006 }, + { 0x000c, 0x0007 }, + { 0x000c, 0x0008 }, + { 0x000c, 0x0009 }, + { 0x000d, 0x0004 }, + { 0x000d, 0x0005 }, + { 0x000d, 0x0006 }, + { 0x000d, 0x0007 }, + { 0x000e, 0x0004 }, + { 0x000e, 0x0005 }, + { 0x000e, 0x0006 }, + { 0x000e, 0x0007 }, + { 0x0010, 0x0004 }, + { 0x000f, 0x0005 }, + { 0x0010, 0x0005 }, + { 0x000f, 0x0006 }, + { 0x000f, 0x0007 }, + { 0x0010, 0x0006 }, + { 0x0011, 0x0006 }, + { 0x0010, 0x0007 }, + { 0x0013, 0x0000 }, + { 0x0010, 0x0008 }, + { 0x0010, 0x0009 }, + { 0x0013, 0x0001 }, + { 0x0011, 0x0007 }, + { 0x0012, 0x0001 }, + { 0x0012, 0x0002 }, + { 0x0012, 0x0003 }, + { 0x0012, 0x0004 }, + { 0x0012, 0x0005 }, + { 0x0012, 0x0006 }, + { 0x0012, 0x0007 }, + { 0x0012, 0x0008 }, + { 0x0012, 0x0009 }, + { 0x0012, 0x000a }, + { 0x0012, 0x000b }, + +}; + +const UWord16 c_aauiLCLDHuffEnc29[129][2] = { + { 0x0006, 0x0009 }, + { 0x0005, 0x0019 }, + { 0x0006, 0x000a }, + { 0x0005, 0x001a }, + { 0x0005, 0x001b }, + { 0x0005, 0x001c }, + { 0x0006, 0x000b }, + { 0x0005, 0x001d }, + { 0x0005, 0x001e }, + { 0x0006, 0x000c }, + { 0x0006, 0x000d }, + { 0x0005, 0x001f }, + { 0x0006, 0x000e }, + { 0x0006, 0x000f }, + { 0x0006, 0x0010 }, + { 0x0006, 0x0011 }, + { 0x0006, 0x0012 }, + { 0x0006, 0x0013 }, + { 0x0006, 0x0014 }, + { 0x0006, 0x0015 }, + { 0x0006, 0x0016 }, + { 0x0006, 0x0017 }, + { 0x0006, 0x0018 }, + { 0x0006, 0x0019 }, + { 0x0006, 0x001a }, + { 0x0006, 0x001b }, + { 0x0006, 0x001c }, + { 0x0006, 0x001d }, + { 0x0006, 0x001e }, + { 0x0006, 0x001f }, + { 0x0006, 0x0020 }, + { 0x0006, 0x0021 }, + { 0x0006, 0x0022 }, + { 0x0006, 0x0023 }, + { 0x0006, 0x0024 }, + { 0x0006, 0x0025 }, + { 0x0006, 0x0026 }, + { 0x0006, 0x0027 }, + { 0x0006, 0x0028 }, + { 0x0006, 0x0029 }, + { 0x0006, 0x002a }, + { 0x0006, 0x002b }, + { 0x0006, 0x002c }, + { 0x0006, 0x002d }, + { 0x0006, 0x002e }, + { 0x0006, 0x002f }, + { 0x0006, 0x0030 }, + { 0x0006, 0x0031 }, + { 0x0007, 0x0007 }, + { 0x0007, 0x0008 }, + { 0x0007, 0x0009 }, + { 0x0007, 0x000a }, + { 0x0007, 0x000b }, + { 0x0007, 0x000c }, + { 0x0007, 0x000d }, + { 0x0007, 0x000e }, + { 0x0007, 0x000f }, + { 0x0007, 0x0010 }, + { 0x0007, 0x0011 }, + { 0x0008, 0x0006 }, + { 0x0008, 0x0007 }, + { 0x0008, 0x0008 }, + { 0x0008, 0x0009 }, + { 0x0008, 0x000a }, + { 0x0008, 0x000b }, + { 0x0008, 0x000c }, + { 0x0008, 0x000d }, + { 0x0009, 0x0006 }, + { 0x0009, 0x0007 }, + { 0x0009, 0x0008 }, + { 0x0009, 0x0009 }, + { 0x0009, 0x000a }, + { 0x0009, 0x000b }, + { 0x000a, 0x0005 }, + { 0x000a, 0x0006 }, + { 0x000a, 0x0007 }, + { 0x000a, 0x0008 }, + { 0x000a, 0x0009 }, + { 0x000a, 0x000a }, + { 0x000a, 0x000b }, + { 0x000b, 0x0006 }, + { 0x000b, 0x0007 }, + { 0x000b, 0x0008 }, + { 0x000b, 0x0009 }, + { 0x000c, 0x0006 }, + { 0x000c, 0x0007 }, + { 0x000c, 0x0008 }, + { 0x000c, 0x0009 }, + { 0x000c, 0x000a }, + { 0x000c, 0x000b }, + { 0x000d, 0x0005 }, + { 0x000d, 0x0006 }, + { 0x000d, 0x0007 }, + { 0x000d, 0x0008 }, + { 0x000d, 0x0009 }, + { 0x000d, 0x000a }, + { 0x000d, 0x000b }, + { 0x000e, 0x0006 }, + { 0x000e, 0x0007 }, + { 0x000e, 0x0008 }, + { 0x000e, 0x0009 }, + { 0x000f, 0x0004 }, + { 0x000f, 0x0005 }, + { 0x000f, 0x0006 }, + { 0x000f, 0x0007 }, + { 0x0011, 0x0007 }, + { 0x000f, 0x0008 }, + { 0x0012, 0x0000 }, + { 0x000f, 0x0009 }, + { 0x0010, 0x0005 }, + { 0x000f, 0x000a }, + { 0x000f, 0x000b }, + { 0x0012, 0x0001 }, + { 0x0010, 0x0006 }, + { 0x0010, 0x0007 }, + { 0x0012, 0x0002 }, + { 0x0012, 0x0003 }, + { 0x0012, 0x0004 }, + { 0x0012, 0x0005 }, + { 0x0012, 0x0006 }, + { 0x0012, 0x0007 }, + { 0x0012, 0x0008 }, + { 0x0011, 0x0008 }, + { 0x0012, 0x0009 }, + { 0x0012, 0x000a }, + { 0x0012, 0x000b }, + { 0x0012, 0x000c }, + { 0x0012, 0x000d }, + { 0x0011, 0x0009 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc30[153][2] = { + { 0x0007, 0x0009 }, + { 0x0006, 0x000e }, + { 0x0006, 0x000f }, + { 0x0006, 0x0010 }, + { 0x0006, 0x0011 }, + { 0x0006, 0x0012 }, + { 0x0006, 0x0013 }, + { 0x0006, 0x0014 }, + { 0x0006, 0x0015 }, + { 0x0006, 0x0016 }, + { 0x0006, 0x0017 }, + { 0x0006, 0x0018 }, + { 0x0006, 0x0019 }, + { 0x0006, 0x001a }, + { 0x0006, 0x001b }, + { 0x0006, 0x001c }, + { 0x0006, 0x001d }, + { 0x0006, 0x001e }, + { 0x0006, 0x001f }, + { 0x0006, 0x0020 }, + { 0x0006, 0x0021 }, + { 0x0006, 0x0022 }, + { 0x0006, 0x0023 }, + { 0x0006, 0x0024 }, + { 0x0006, 0x0025 }, + { 0x0006, 0x0026 }, + { 0x0006, 0x0027 }, + { 0x0006, 0x0028 }, + { 0x0006, 0x0029 }, + { 0x0006, 0x002a }, + { 0x0006, 0x002b }, + { 0x0006, 0x002c }, + { 0x0006, 0x002d }, + { 0x0006, 0x002e }, + { 0x0006, 0x002f }, + { 0x0006, 0x0030 }, + { 0x0006, 0x0031 }, + { 0x0006, 0x0032 }, + { 0x0006, 0x0033 }, + { 0x0006, 0x0034 }, + { 0x0006, 0x0035 }, + { 0x0006, 0x0036 }, + { 0x0006, 0x0037 }, + { 0x0006, 0x0038 }, + { 0x0006, 0x0039 }, + { 0x0006, 0x003a }, + { 0x0006, 0x003b }, + { 0x0006, 0x003c }, + { 0x0006, 0x003d }, + { 0x0006, 0x003e }, + { 0x0006, 0x003f }, + { 0x0007, 0x000a }, + { 0x0007, 0x000b }, + { 0x0007, 0x000c }, + { 0x0007, 0x000d }, + { 0x0007, 0x000e }, + { 0x0007, 0x000f }, + { 0x0007, 0x0010 }, + { 0x0007, 0x0011 }, + { 0x0007, 0x0012 }, + { 0x0007, 0x0013 }, + { 0x0007, 0x0014 }, + { 0x0007, 0x0015 }, + { 0x0007, 0x0016 }, + { 0x0007, 0x0017 }, + { 0x0007, 0x0018 }, + { 0x0007, 0x0019 }, + { 0x0007, 0x001a }, + { 0x0007, 0x001b }, + { 0x0008, 0x0008 }, + { 0x0008, 0x0009 }, + { 0x0008, 0x000a }, + { 0x0008, 0x000b }, + { 0x0008, 0x000c }, + { 0x0008, 0x000d }, + { 0x0008, 0x000e }, + { 0x0008, 0x000f }, + { 0x0008, 0x0010 }, + { 0x0008, 0x0011 }, + { 0x0009, 0x0007 }, + { 0x0009, 0x0008 }, + { 0x0009, 0x0009 }, + { 0x0009, 0x000a }, + { 0x0009, 0x000b }, + { 0x0009, 0x000c }, + { 0x0009, 0x000d }, + { 0x0009, 0x000e }, + { 0x000a, 0x0008 }, + { 0x0009, 0x000f }, + { 0x000a, 0x0009 }, + { 0x000a, 0x000a }, + { 0x000a, 0x000b }, + { 0x000a, 0x000c }, + { 0x000a, 0x000d }, + { 0x000b, 0x0007 }, + { 0x000b, 0x0008 }, + { 0x000b, 0x0009 }, + { 0x000b, 0x000a }, + { 0x000b, 0x000b }, + { 0x000b, 0x000c }, + { 0x000b, 0x000d }, + { 0x000c, 0x0008 }, + { 0x000b, 0x000e }, + { 0x000b, 0x000f }, + { 0x000c, 0x0009 }, + { 0x000c, 0x000a }, + { 0x000d, 0x0008 }, + { 0x000c, 0x000b }, + { 0x000c, 0x000c }, + { 0x000d, 0x0009 }, + { 0x000c, 0x000d }, + { 0x000d, 0x000a }, + { 0x000d, 0x000b }, + { 0x000d, 0x000c }, + { 0x000d, 0x000d }, + { 0x000e, 0x0008 }, + { 0x000d, 0x000e }, + { 0x000d, 0x000f }, + { 0x000e, 0x0009 }, + { 0x000e, 0x000a }, + { 0x000e, 0x000b }, + { 0x000e, 0x000c }, + { 0x000f, 0x0006 }, + { 0x000f, 0x0007 }, + { 0x000f, 0x0008 }, + { 0x0010, 0x0006 }, + { 0x000e, 0x000d }, + { 0x000e, 0x000e }, + { 0x000e, 0x000f }, + { 0x0010, 0x0007 }, + { 0x000f, 0x0009 }, + { 0x0010, 0x0008 }, + { 0x000f, 0x000a }, + { 0x000f, 0x000b }, + { 0x000f, 0x000c }, + { 0x000f, 0x000d }, + { 0x0010, 0x0009 }, + { 0x0011, 0x0000 }, + { 0x0011, 0x0001 }, + { 0x0011, 0x0002 }, + { 0x000f, 0x000e }, + { 0x0010, 0x000a }, + { 0x0011, 0x0003 }, + { 0x0011, 0x0004 }, + { 0x0011, 0x0005 }, + { 0x000f, 0x000f }, + { 0x0011, 0x0006 }, + { 0x0011, 0x0007 }, + { 0x0011, 0x0008 }, + { 0x0011, 0x0009 }, + { 0x0011, 0x000a }, + { 0x0011, 0x000b }, + { 0x0010, 0x000b }, + +}; + +const UWord16 c_aauiLCLDHuffEnc31[181][2] = { + { 0x0007, 0x000b }, + { 0x0006, 0x0015 }, + { 0x0006, 0x0016 }, + { 0x0006, 0x0017 }, + { 0x0006, 0x0018 }, + { 0x0006, 0x0019 }, + { 0x0006, 0x001a }, + { 0x0006, 0x001b }, + { 0x0006, 0x001c }, + { 0x0006, 0x001d }, + { 0x0006, 0x001e }, + { 0x0006, 0x001f }, + { 0x0006, 0x0020 }, + { 0x0006, 0x0021 }, + { 0x0006, 0x0022 }, + { 0x0006, 0x0023 }, + { 0x0006, 0x0024 }, + { 0x0006, 0x0025 }, + { 0x0006, 0x0026 }, + { 0x0006, 0x0027 }, + { 0x0006, 0x0028 }, + { 0x0006, 0x0029 }, + { 0x0006, 0x002a }, + { 0x0006, 0x002b }, + { 0x0006, 0x002c }, + { 0x0006, 0x002d }, + { 0x0006, 0x002e }, + { 0x0006, 0x002f }, + { 0x0006, 0x0030 }, + { 0x0006, 0x0031 }, + { 0x0006, 0x0032 }, + { 0x0006, 0x0033 }, + { 0x0006, 0x0034 }, + { 0x0006, 0x0035 }, + { 0x0006, 0x0036 }, + { 0x0006, 0x0037 }, + { 0x0006, 0x0038 }, + { 0x0006, 0x0039 }, + { 0x0006, 0x003a }, + { 0x0006, 0x003b }, + { 0x0006, 0x003c }, + { 0x0006, 0x003d }, + { 0x0006, 0x003e }, + { 0x0007, 0x000c }, + { 0x0006, 0x003f }, + { 0x0007, 0x000d }, + { 0x0007, 0x000e }, + { 0x0007, 0x000f }, + { 0x0007, 0x0010 }, + { 0x0007, 0x0011 }, + { 0x0007, 0x0012 }, + { 0x0007, 0x0013 }, + { 0x0007, 0x0014 }, + { 0x0007, 0x0015 }, + { 0x0007, 0x0016 }, + { 0x0007, 0x0017 }, + { 0x0007, 0x0018 }, + { 0x0007, 0x0019 }, + { 0x0007, 0x001a }, + { 0x0007, 0x001b }, + { 0x0007, 0x001c }, + { 0x0007, 0x001d }, + { 0x0007, 0x001e }, + { 0x0007, 0x001f }, + { 0x0007, 0x0020 }, + { 0x0007, 0x0021 }, + { 0x0007, 0x0022 }, + { 0x0007, 0x0023 }, + { 0x0007, 0x0024 }, + { 0x0007, 0x0025 }, + { 0x0007, 0x0026 }, + { 0x0007, 0x0027 }, + { 0x0007, 0x0028 }, + { 0x0007, 0x0029 }, + { 0x0008, 0x0009 }, + { 0x0008, 0x000a }, + { 0x0008, 0x000b }, + { 0x0008, 0x000c }, + { 0x0008, 0x000d }, + { 0x0008, 0x000e }, + { 0x0008, 0x000f }, + { 0x0008, 0x0010 }, + { 0x0008, 0x0011 }, + { 0x0008, 0x0012 }, + { 0x0008, 0x0013 }, + { 0x0008, 0x0014 }, + { 0x0008, 0x0015 }, + { 0x0009, 0x0008 }, + { 0x0009, 0x0009 }, + { 0x0009, 0x000a }, + { 0x0009, 0x000b }, + { 0x0009, 0x000c }, + { 0x0009, 0x000d }, + { 0x0009, 0x000e }, + { 0x0009, 0x000f }, + { 0x0009, 0x0010 }, + { 0x0009, 0x0011 }, + { 0x000a, 0x0008 }, + { 0x000a, 0x0009 }, + { 0x000a, 0x000a }, + { 0x000a, 0x000b }, + { 0x000a, 0x000c }, + { 0x000a, 0x000d }, + { 0x000a, 0x000e }, + { 0x000a, 0x000f }, + { 0x000b, 0x0008 }, + { 0x000b, 0x0009 }, + { 0x000b, 0x000a }, + { 0x000b, 0x000b }, + { 0x000b, 0x000c }, + { 0x000b, 0x000d }, + { 0x000b, 0x000e }, + { 0x000c, 0x0008 }, + { 0x000c, 0x0009 }, + { 0x000b, 0x000f }, + { 0x000c, 0x000a }, + { 0x000c, 0x000b }, + { 0x000c, 0x000c }, + { 0x000c, 0x000d }, + { 0x000d, 0x0008 }, + { 0x000c, 0x000e }, + { 0x000d, 0x0009 }, + { 0x000d, 0x000a }, + { 0x000c, 0x000f }, + { 0x000d, 0x000b }, + { 0x000d, 0x000c }, + { 0x000d, 0x000d }, + { 0x000d, 0x000e }, + { 0x000d, 0x000f }, + { 0x000e, 0x0008 }, + { 0x000e, 0x0009 }, + { 0x000e, 0x000a }, + { 0x000e, 0x000b }, + { 0x000e, 0x000c }, + { 0x000e, 0x000d }, + { 0x000e, 0x000e }, + { 0x000e, 0x000f }, + { 0x000f, 0x0009 }, + { 0x000f, 0x000a }, + { 0x000f, 0x000b }, + { 0x000f, 0x000c }, + { 0x0010, 0x0009 }, + { 0x000f, 0x000d }, + { 0x000f, 0x000e }, + { 0x0010, 0x000a }, + { 0x0010, 0x000b }, + { 0x0010, 0x000c }, + { 0x0010, 0x000d }, + { 0x0011, 0x000a }, + { 0x0010, 0x000e }, + { 0x000f, 0x000f }, + { 0x0010, 0x000f }, + { 0x0012, 0x0000 }, + { 0x0012, 0x0001 }, + { 0x0011, 0x000b }, + { 0x0011, 0x000c }, + { 0x0010, 0x0010 }, + { 0x0012, 0x0002 }, + { 0x0012, 0x0003 }, + { 0x0011, 0x000d }, + { 0x0011, 0x000e }, + { 0x0011, 0x000f }, + { 0x0011, 0x0010 }, + { 0x0011, 0x0011 }, + { 0x0010, 0x0011 }, + { 0x0012, 0x0004 }, + { 0x0012, 0x0005 }, + { 0x0012, 0x0006 }, + { 0x0012, 0x0007 }, + { 0x0012, 0x0008 }, + { 0x0012, 0x0009 }, + { 0x0012, 0x000a }, + { 0x0012, 0x000b }, + { 0x0012, 0x000c }, + { 0x0012, 0x000d }, + { 0x0012, 0x000e }, + { 0x0012, 0x000f }, + { 0x0012, 0x0010 }, + { 0x0012, 0x0011 }, + { 0x0012, 0x0012 }, + { 0x0012, 0x0013 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc33[16][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0008, 0x0000 }, + { 0x0008, 0x0001 }, + { 0x0002, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0008, 0x0002 }, + { 0x0008, 0x0003 }, + { 0x0008, 0x0004 }, + { 0x0008, 0x0005 }, + { 0x0008, 0x0006 }, + { 0x0008, 0x0007 }, + { 0x0007, 0x0004 }, + { 0x0007, 0x0005 }, + { 0x0007, 0x0006 }, + { 0x0007, 0x0007 }, +}; + +const UWord16 c_aauiLCLDHuffEnc34[16][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0008, 0x0000 }, + { 0x0008, 0x0001 }, + { 0x0002, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0008, 0x0002 }, + { 0x0008, 0x0003 }, + { 0x0008, 0x0004 }, + { 0x0008, 0x0005 }, + { 0x0008, 0x0006 }, + { 0x0008, 0x0007 }, + { 0x0007, 0x0004 }, + { 0x0007, 0x0005 }, + { 0x0007, 0x0006 }, + { 0x0007, 0x0007 }, +}; + +const UWord16 c_aauiLCLDHuffEnc35[25][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0007, 0x0006 }, + { 0x0009, 0x0000 }, + { 0x0009, 0x0001 }, + { 0x0002, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0009, 0x0002 }, + { 0x0009, 0x0003 }, + { 0x0009, 0x0004 }, + { 0x0007, 0x0007 }, + { 0x0009, 0x0005 }, + { 0x0009, 0x0006 }, + { 0x0009, 0x0007 }, + { 0x0009, 0x0008 }, + { 0x0009, 0x0009 }, + { 0x0009, 0x000a }, + { 0x0009, 0x000b }, + { 0x0009, 0x000c }, + { 0x0009, 0x000d }, + { 0x0008, 0x0007 }, + { 0x0008, 0x0008 }, + { 0x0008, 0x0009 }, + { 0x0008, 0x000a }, + { 0x0008, 0x000b }, + +}; + +const UWord16 c_aauiLCLDHuffEnc36[36][2] = { + { 0x0001, 0x0001 }, + { 0x0002, 0x0001 }, + { 0x0006, 0x0002 }, + { 0x000b, 0x0000 }, + { 0x000b, 0x0001 }, + { 0x000b, 0x0002 }, + { 0x0003, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0008, 0x0005 }, + { 0x000b, 0x0003 }, + { 0x000b, 0x0004 }, + { 0x000b, 0x0005 }, + { 0x0006, 0x0003 }, + { 0x0007, 0x0003 }, + { 0x000b, 0x0006 }, + { 0x000b, 0x0007 }, + { 0x000b, 0x0008 }, + { 0x000b, 0x0009 }, + { 0x000b, 0x000a }, + { 0x000b, 0x000b }, + { 0x000b, 0x000c }, + { 0x000b, 0x000d }, + { 0x000b, 0x000e }, + { 0x000b, 0x000f }, + { 0x000a, 0x0008 }, + { 0x000a, 0x0009 }, + { 0x000a, 0x000a }, + { 0x000a, 0x000b }, + { 0x000a, 0x000c }, + { 0x000a, 0x000d }, + { 0x000a, 0x000e }, + { 0x000a, 0x000f }, + { 0x000a, 0x0010 }, + { 0x000a, 0x0011 }, + { 0x000a, 0x0012 }, + { 0x000a, 0x0013 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc37[36][2] = { + { 0x0001, 0x0001 }, + { 0x0002, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x000c, 0x0000 }, + { 0x000c, 0x0001 }, + { 0x000c, 0x0002 }, + { 0x0003, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0006, 0x0002 }, + { 0x000c, 0x0003 }, + { 0x000c, 0x0004 }, + { 0x000c, 0x0005 }, + { 0x0006, 0x0003 }, + { 0x0007, 0x0001 }, + { 0x000a, 0x0007 }, + { 0x000c, 0x0006 }, + { 0x000c, 0x0007 }, + { 0x000c, 0x0008 }, + { 0x000c, 0x0009 }, + { 0x000c, 0x000a }, + { 0x000c, 0x000b }, + { 0x000c, 0x000c }, + { 0x000c, 0x000d }, + { 0x000c, 0x000e }, + { 0x000c, 0x000f }, + { 0x000c, 0x0010 }, + { 0x000c, 0x0011 }, + { 0x000c, 0x0012 }, + { 0x000c, 0x0013 }, + { 0x000c, 0x0014 }, + { 0x000c, 0x0015 }, + { 0x000c, 0x0016 }, + { 0x000c, 0x0017 }, + { 0x000c, 0x0018 }, + { 0x000c, 0x0019 }, + { 0x000b, 0x000d }, + +}; + +const UWord16 c_aauiLCLDHuffEnc38[49][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x000c, 0x0012 }, + { 0x000d, 0x0000 }, + { 0x000d, 0x0001 }, + { 0x000d, 0x0002 }, + { 0x0002, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x000b, 0x000a }, + { 0x000d, 0x0003 }, + { 0x000d, 0x0004 }, + { 0x000d, 0x0005 }, + { 0x0006, 0x0002 }, + { 0x0006, 0x0003 }, + { 0x0009, 0x0003 }, + { 0x000d, 0x0006 }, + { 0x000d, 0x0007 }, + { 0x000d, 0x0008 }, + { 0x000d, 0x0009 }, + { 0x000c, 0x0013 }, + { 0x000b, 0x000b }, + { 0x000d, 0x000a }, + { 0x000d, 0x000b }, + { 0x000d, 0x000c }, + { 0x000d, 0x000d }, + { 0x000d, 0x000e }, + { 0x000d, 0x000f }, + { 0x000d, 0x0010 }, + { 0x000d, 0x0011 }, + { 0x000d, 0x0012 }, + { 0x000d, 0x0013 }, + { 0x000d, 0x0014 }, + { 0x000d, 0x0015 }, + { 0x000d, 0x0016 }, + { 0x000d, 0x0017 }, + { 0x000d, 0x0018 }, + { 0x000d, 0x0019 }, + { 0x000d, 0x001a }, + { 0x000d, 0x001b }, + { 0x000d, 0x001c }, + { 0x000d, 0x001d }, + { 0x000d, 0x001e }, + { 0x000d, 0x001f }, + { 0x000d, 0x0020 }, + { 0x000d, 0x0021 }, + { 0x000d, 0x0022 }, + { 0x000d, 0x0023 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc39[64][2] = { + { 0x0001, 0x0001 }, + { 0x0002, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x000a, 0x0002 }, + { 0x000f, 0x0000 }, + { 0x000f, 0x0001 }, + { 0x000f, 0x0002 }, + { 0x000f, 0x0003 }, + { 0x0003, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x000a, 0x0003 }, + { 0x000f, 0x0004 }, + { 0x000f, 0x0005 }, + { 0x000f, 0x0006 }, + { 0x000f, 0x0007 }, + { 0x0006, 0x0002 }, + { 0x0006, 0x0003 }, + { 0x0009, 0x0003 }, + { 0x000d, 0x000e }, + { 0x000f, 0x0008 }, + { 0x000f, 0x0009 }, + { 0x000f, 0x000a }, + { 0x000f, 0x000b }, + { 0x000a, 0x0004 }, + { 0x000a, 0x0005 }, + { 0x000d, 0x000f }, + { 0x000f, 0x000c }, + { 0x000f, 0x000d }, + { 0x000f, 0x000e }, + { 0x000f, 0x000f }, + { 0x000f, 0x0010 }, + { 0x000f, 0x0011 }, + { 0x000f, 0x0012 }, + { 0x000f, 0x0013 }, + { 0x000f, 0x0014 }, + { 0x000f, 0x0015 }, + { 0x000f, 0x0016 }, + { 0x000f, 0x0017 }, + { 0x000f, 0x0018 }, + { 0x000f, 0x0019 }, + { 0x000f, 0x001a }, + { 0x000f, 0x001b }, + { 0x000f, 0x001c }, + { 0x000f, 0x001d }, + { 0x000f, 0x001e }, + { 0x000f, 0x001f }, + { 0x000f, 0x0020 }, + { 0x000f, 0x0021 }, + { 0x000f, 0x0022 }, + { 0x000f, 0x0023 }, + { 0x000f, 0x0024 }, + { 0x000f, 0x0025 }, + { 0x000f, 0x0026 }, + { 0x000f, 0x0027 }, + { 0x000f, 0x0028 }, + { 0x000f, 0x0029 }, + { 0x000e, 0x0015 }, + { 0x000e, 0x0016 }, + { 0x000e, 0x0017 }, + { 0x000e, 0x0018 }, + { 0x000e, 0x0019 }, + { 0x000e, 0x001a }, + { 0x000e, 0x001b }, +}; + +const UWord16 c_aauiLCLDHuffEnc40[81][2] = { + { 0x0001, 0x0001 }, + { 0x0002, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x000b, 0x0002 }, + { 0x000f, 0x0011 }, + { 0x0011, 0x0000 }, + { 0x0011, 0x0001 }, + { 0x0011, 0x0002 }, + { 0x0011, 0x0003 }, + { 0x0003, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x000a, 0x0002 }, + { 0x000e, 0x0009 }, + { 0x0011, 0x0004 }, + { 0x0011, 0x0005 }, + { 0x0011, 0x0006 }, + { 0x0011, 0x0007 }, + { 0x0006, 0x0002 }, + { 0x0006, 0x0003 }, + { 0x0008, 0x0001 }, + { 0x000d, 0x0005 }, + { 0x0011, 0x0008 }, + { 0x0011, 0x0009 }, + { 0x0011, 0x000a }, + { 0x0011, 0x000b }, + { 0x0011, 0x000c }, + { 0x000b, 0x0003 }, + { 0x000a, 0x0003 }, + { 0x000c, 0x0003 }, + { 0x0011, 0x000d }, + { 0x0011, 0x000e }, + { 0x0011, 0x000f }, + { 0x0011, 0x0010 }, + { 0x0011, 0x0011 }, + { 0x0011, 0x0012 }, + { 0x0011, 0x0013 }, + { 0x0011, 0x0014 }, + { 0x0011, 0x0015 }, + { 0x0011, 0x0016 }, + { 0x0011, 0x0017 }, + { 0x0011, 0x0018 }, + { 0x0011, 0x0019 }, + { 0x0011, 0x001a }, + { 0x0011, 0x001b }, + { 0x0011, 0x001c }, + { 0x0011, 0x001d }, + { 0x0011, 0x001e }, + { 0x0011, 0x001f }, + { 0x0011, 0x0020 }, + { 0x0011, 0x0021 }, + { 0x0011, 0x0022 }, + { 0x0011, 0x0023 }, + { 0x0011, 0x0024 }, + { 0x0011, 0x0025 }, + { 0x0011, 0x0026 }, + { 0x0011, 0x0027 }, + { 0x0011, 0x0028 }, + { 0x0011, 0x0029 }, + { 0x0011, 0x002a }, + { 0x0011, 0x002b }, + { 0x0011, 0x002c }, + { 0x0011, 0x002d }, + { 0x0011, 0x002e }, + { 0x0011, 0x002f }, + { 0x0011, 0x0030 }, + { 0x0011, 0x0031 }, + { 0x0011, 0x0032 }, + { 0x0011, 0x0033 }, + { 0x0011, 0x0034 }, + { 0x0011, 0x0035 }, + { 0x0011, 0x0036 }, + { 0x0011, 0x0037 }, + { 0x0011, 0x0038 }, + { 0x0011, 0x0039 }, + { 0x0011, 0x003a }, + { 0x0011, 0x003b }, + { 0x0010, 0x001e }, + { 0x0010, 0x001f }, + { 0x0010, 0x0020 }, + { 0x0010, 0x0021 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc41[100][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x000b, 0x0001 }, + { 0x0011, 0x0014 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0002, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x000a, 0x0001 }, + { 0x0010, 0x000b }, + { 0x0013, 0x0005 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0006, 0x0002 }, + { 0x0006, 0x0003 }, + { 0x0008, 0x0001 }, + { 0x000d, 0x0002 }, + { 0x0011, 0x0015 }, + { 0x0013, 0x000a }, + { 0x0013, 0x000b }, + { 0x0013, 0x000c }, + { 0x0013, 0x000d }, + { 0x0013, 0x000e }, + { 0x000a, 0x0002 }, + { 0x000a, 0x0003 }, + { 0x000d, 0x0003 }, + { 0x0010, 0x000c }, + { 0x0013, 0x000f }, + { 0x0013, 0x0010 }, + { 0x0013, 0x0011 }, + { 0x0013, 0x0012 }, + { 0x0013, 0x0013 }, + { 0x0013, 0x0014 }, + { 0x0010, 0x000d }, + { 0x000f, 0x0007 }, + { 0x0012, 0x0027 }, + { 0x0013, 0x0015 }, + { 0x0013, 0x0016 }, + { 0x0013, 0x0017 }, + { 0x0013, 0x0018 }, + { 0x0013, 0x0019 }, + { 0x0013, 0x001a }, + { 0x0013, 0x001b }, + { 0x0013, 0x001c }, + { 0x0013, 0x001d }, + { 0x0013, 0x001e }, + { 0x0013, 0x001f }, + { 0x0013, 0x0020 }, + { 0x0013, 0x0021 }, + { 0x0013, 0x0022 }, + { 0x0013, 0x0023 }, + { 0x0013, 0x0024 }, + { 0x0013, 0x0025 }, + { 0x0013, 0x0026 }, + { 0x0013, 0x0027 }, + { 0x0013, 0x0028 }, + { 0x0013, 0x0029 }, + { 0x0013, 0x002a }, + { 0x0013, 0x002b }, + { 0x0013, 0x002c }, + { 0x0013, 0x002d }, + { 0x0013, 0x002e }, + { 0x0013, 0x002f }, + { 0x0013, 0x0030 }, + { 0x0013, 0x0031 }, + { 0x0013, 0x0032 }, + { 0x0013, 0x0033 }, + { 0x0013, 0x0034 }, + { 0x0013, 0x0035 }, + { 0x0013, 0x0036 }, + { 0x0013, 0x0037 }, + { 0x0013, 0x0038 }, + { 0x0013, 0x0039 }, + { 0x0013, 0x003a }, + { 0x0013, 0x003b }, + { 0x0013, 0x003c }, + { 0x0013, 0x003d }, + { 0x0013, 0x003e }, + { 0x0013, 0x003f }, + { 0x0013, 0x0040 }, + { 0x0013, 0x0041 }, + { 0x0013, 0x0042 }, + { 0x0013, 0x0043 }, + { 0x0013, 0x0044 }, + { 0x0013, 0x0045 }, + { 0x0013, 0x0046 }, + { 0x0013, 0x0047 }, + { 0x0013, 0x0048 }, + { 0x0013, 0x0049 }, + { 0x0013, 0x004a }, + { 0x0013, 0x004b }, + { 0x0013, 0x004c }, + { 0x0013, 0x004d }, + +}; + +const UWord16 c_aauiLCLDHuffEnc42[169][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x0009, 0x0001 }, + { 0x000e, 0x0006 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0003, 0x0002 }, + { 0x0003, 0x0003 }, + { 0x0005, 0x0001 }, + { 0x0009, 0x0002 }, + { 0x000d, 0x0004 }, + { 0x0010, 0x0013 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0013, 0x000a }, + { 0x0013, 0x000b }, + { 0x0013, 0x000c }, + { 0x0013, 0x000d }, + { 0x0013, 0x000e }, + { 0x0005, 0x0002 }, + { 0x0005, 0x0003 }, + { 0x0008, 0x0002 }, + { 0x000b, 0x0002 }, + { 0x000f, 0x000b }, + { 0x0011, 0x0025 }, + { 0x0013, 0x000f }, + { 0x0013, 0x0010 }, + { 0x0013, 0x0011 }, + { 0x0013, 0x0012 }, + { 0x0013, 0x0013 }, + { 0x0013, 0x0014 }, + { 0x0013, 0x0015 }, + { 0x0009, 0x0003 }, + { 0x0008, 0x0003 }, + { 0x000b, 0x0003 }, + { 0x000d, 0x0005 }, + { 0x0010, 0x0014 }, + { 0x0013, 0x0016 }, + { 0x0013, 0x0017 }, + { 0x0013, 0x0018 }, + { 0x0013, 0x0019 }, + { 0x0013, 0x001a }, + { 0x0013, 0x001b }, + { 0x0013, 0x001c }, + { 0x0013, 0x001d }, + { 0x000d, 0x0006 }, + { 0x000d, 0x0007 }, + { 0x000e, 0x0007 }, + { 0x0010, 0x0015 }, + { 0x0013, 0x001e }, + { 0x0013, 0x001f }, + { 0x0013, 0x0020 }, + { 0x0013, 0x0021 }, + { 0x0013, 0x0022 }, + { 0x0013, 0x0023 }, + { 0x0013, 0x0024 }, + { 0x0013, 0x0025 }, + { 0x0013, 0x0026 }, + { 0x0012, 0x0045 }, + { 0x0013, 0x0027 }, + { 0x0013, 0x0028 }, + { 0x0013, 0x0029 }, + { 0x0013, 0x002a }, + { 0x0013, 0x002b }, + { 0x0013, 0x002c }, + { 0x0013, 0x002d }, + { 0x0013, 0x002e }, + { 0x0013, 0x002f }, + { 0x0013, 0x0030 }, + { 0x0013, 0x0031 }, + { 0x0013, 0x0032 }, + { 0x0013, 0x0033 }, + { 0x0013, 0x0034 }, + { 0x0013, 0x0035 }, + { 0x0013, 0x0036 }, + { 0x0013, 0x0037 }, + { 0x0013, 0x0038 }, + { 0x0013, 0x0039 }, + { 0x0013, 0x003a }, + { 0x0013, 0x003b }, + { 0x0013, 0x003c }, + { 0x0013, 0x003d }, + { 0x0013, 0x003e }, + { 0x0013, 0x003f }, + { 0x0013, 0x0040 }, + { 0x0013, 0x0041 }, + { 0x0013, 0x0042 }, + { 0x0013, 0x0043 }, + { 0x0013, 0x0044 }, + { 0x0013, 0x0045 }, + { 0x0013, 0x0046 }, + { 0x0013, 0x0047 }, + { 0x0013, 0x0048 }, + { 0x0013, 0x0049 }, + { 0x0013, 0x004a }, + { 0x0013, 0x004b }, + { 0x0013, 0x004c }, + { 0x0013, 0x004d }, + { 0x0013, 0x004e }, + { 0x0013, 0x004f }, + { 0x0013, 0x0050 }, + { 0x0013, 0x0051 }, + { 0x0013, 0x0052 }, + { 0x0013, 0x0053 }, + { 0x0013, 0x0054 }, + { 0x0013, 0x0055 }, + { 0x0013, 0x0056 }, + { 0x0013, 0x0057 }, + { 0x0013, 0x0058 }, + { 0x0013, 0x0059 }, + { 0x0013, 0x005a }, + { 0x0013, 0x005b }, + { 0x0013, 0x005c }, + { 0x0013, 0x005d }, + { 0x0013, 0x005e }, + { 0x0013, 0x005f }, + { 0x0013, 0x0060 }, + { 0x0013, 0x0061 }, + { 0x0013, 0x0062 }, + { 0x0013, 0x0063 }, + { 0x0013, 0x0064 }, + { 0x0013, 0x0065 }, + { 0x0013, 0x0066 }, + { 0x0013, 0x0067 }, + { 0x0013, 0x0068 }, + { 0x0013, 0x0069 }, + { 0x0013, 0x006a }, + { 0x0013, 0x006b }, + { 0x0013, 0x006c }, + { 0x0013, 0x006d }, + { 0x0013, 0x006e }, + { 0x0013, 0x006f }, + { 0x0013, 0x0070 }, + { 0x0013, 0x0071 }, + { 0x0013, 0x0072 }, + { 0x0013, 0x0073 }, + { 0x0013, 0x0074 }, + { 0x0013, 0x0075 }, + { 0x0013, 0x0076 }, + { 0x0013, 0x0077 }, + { 0x0013, 0x0078 }, + { 0x0013, 0x0079 }, + { 0x0013, 0x007a }, + { 0x0013, 0x007b }, + { 0x0013, 0x007c }, + { 0x0013, 0x007d }, + { 0x0013, 0x007e }, + { 0x0013, 0x007f }, + { 0x0013, 0x0080 }, + { 0x0013, 0x0081 }, + { 0x0013, 0x0082 }, + { 0x0013, 0x0083 }, + { 0x0013, 0x0084 }, + { 0x0013, 0x0085 }, + { 0x0013, 0x0086 }, + { 0x0013, 0x0087 }, + { 0x0013, 0x0088 }, + { 0x0013, 0x0089 }, + { 0x0012, 0x0046 }, + { 0x0012, 0x0047 }, + { 0x0012, 0x0048 }, + { 0x0012, 0x0049 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc43[196][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x0009, 0x0002 }, + { 0x000c, 0x0003 }, + { 0x0010, 0x0017 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0003, 0x0002 }, + { 0x0003, 0x0003 }, + { 0x0005, 0x0001 }, + { 0x0009, 0x0003 }, + { 0x000c, 0x0004 }, + { 0x0010, 0x0018 }, + { 0x0012, 0x0050 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0013, 0x000a }, + { 0x0013, 0x000b }, + { 0x0013, 0x000c }, + { 0x0013, 0x000d }, + { 0x0013, 0x000e }, + { 0x0005, 0x0002 }, + { 0x0005, 0x0003 }, + { 0x0008, 0x0003 }, + { 0x000a, 0x0002 }, + { 0x000d, 0x0004 }, + { 0x0011, 0x002a }, + { 0x0013, 0x000f }, + { 0x0013, 0x0010 }, + { 0x0013, 0x0011 }, + { 0x0013, 0x0012 }, + { 0x0013, 0x0013 }, + { 0x0013, 0x0014 }, + { 0x0013, 0x0015 }, + { 0x0013, 0x0016 }, + { 0x0009, 0x0004 }, + { 0x0009, 0x0005 }, + { 0x000a, 0x0003 }, + { 0x000c, 0x0005 }, + { 0x000f, 0x000d }, + { 0x0012, 0x0051 }, + { 0x0013, 0x0017 }, + { 0x0013, 0x0018 }, + { 0x0013, 0x0019 }, + { 0x0013, 0x001a }, + { 0x0013, 0x001b }, + { 0x0013, 0x001c }, + { 0x0013, 0x001d }, + { 0x0013, 0x001e }, + { 0x000c, 0x0006 }, + { 0x000c, 0x0007 }, + { 0x000d, 0x0005 }, + { 0x000f, 0x000e }, + { 0x0011, 0x002b }, + { 0x0013, 0x001f }, + { 0x0013, 0x0020 }, + { 0x0013, 0x0021 }, + { 0x0013, 0x0022 }, + { 0x0013, 0x0023 }, + { 0x0013, 0x0024 }, + { 0x0013, 0x0025 }, + { 0x0013, 0x0026 }, + { 0x0013, 0x0027 }, + { 0x0011, 0x002c }, + { 0x000f, 0x000f }, + { 0x0010, 0x0019 }, + { 0x0012, 0x0052 }, + { 0x0012, 0x0053 }, + { 0x0013, 0x0028 }, + { 0x0013, 0x0029 }, + { 0x0013, 0x002a }, + { 0x0013, 0x002b }, + { 0x0013, 0x002c }, + { 0x0013, 0x002d }, + { 0x0013, 0x002e }, + { 0x0013, 0x002f }, + { 0x0013, 0x0030 }, + { 0x0013, 0x0031 }, + { 0x0011, 0x002d }, + { 0x0013, 0x0032 }, + { 0x0013, 0x0033 }, + { 0x0013, 0x0034 }, + { 0x0013, 0x0035 }, + { 0x0013, 0x0036 }, + { 0x0013, 0x0037 }, + { 0x0013, 0x0038 }, + { 0x0013, 0x0039 }, + { 0x0013, 0x003a }, + { 0x0013, 0x003b }, + { 0x0013, 0x003c }, + { 0x0013, 0x003d }, + { 0x0013, 0x003e }, + { 0x0013, 0x003f }, + { 0x0013, 0x0040 }, + { 0x0013, 0x0041 }, + { 0x0013, 0x0042 }, + { 0x0013, 0x0043 }, + { 0x0013, 0x0044 }, + { 0x0013, 0x0045 }, + { 0x0013, 0x0046 }, + { 0x0013, 0x0047 }, + { 0x0013, 0x0048 }, + { 0x0013, 0x0049 }, + { 0x0013, 0x004a }, + { 0x0013, 0x004b }, + { 0x0013, 0x004c }, + { 0x0013, 0x004d }, + { 0x0013, 0x004e }, + { 0x0013, 0x004f }, + { 0x0013, 0x0050 }, + { 0x0013, 0x0051 }, + { 0x0013, 0x0052 }, + { 0x0013, 0x0053 }, + { 0x0013, 0x0054 }, + { 0x0013, 0x0055 }, + { 0x0013, 0x0056 }, + { 0x0013, 0x0057 }, + { 0x0013, 0x0058 }, + { 0x0013, 0x0059 }, + { 0x0013, 0x005a }, + { 0x0013, 0x005b }, + { 0x0013, 0x005c }, + { 0x0013, 0x005d }, + { 0x0013, 0x005e }, + { 0x0013, 0x005f }, + { 0x0013, 0x0060 }, + { 0x0013, 0x0061 }, + { 0x0013, 0x0062 }, + { 0x0013, 0x0063 }, + { 0x0013, 0x0064 }, + { 0x0013, 0x0065 }, + { 0x0013, 0x0066 }, + { 0x0013, 0x0067 }, + { 0x0013, 0x0068 }, + { 0x0013, 0x0069 }, + { 0x0013, 0x006a }, + { 0x0013, 0x006b }, + { 0x0013, 0x006c }, + { 0x0013, 0x006d }, + { 0x0013, 0x006e }, + { 0x0013, 0x006f }, + { 0x0013, 0x0070 }, + { 0x0013, 0x0071 }, + { 0x0013, 0x0072 }, + { 0x0013, 0x0073 }, + { 0x0013, 0x0074 }, + { 0x0013, 0x0075 }, + { 0x0013, 0x0076 }, + { 0x0013, 0x0077 }, + { 0x0013, 0x0078 }, + { 0x0013, 0x0079 }, + { 0x0013, 0x007a }, + { 0x0013, 0x007b }, + { 0x0013, 0x007c }, + { 0x0013, 0x007d }, + { 0x0013, 0x007e }, + { 0x0013, 0x007f }, + { 0x0013, 0x0080 }, + { 0x0013, 0x0081 }, + { 0x0013, 0x0082 }, + { 0x0013, 0x0083 }, + { 0x0013, 0x0084 }, + { 0x0013, 0x0085 }, + { 0x0013, 0x0086 }, + { 0x0013, 0x0087 }, + { 0x0013, 0x0088 }, + { 0x0013, 0x0089 }, + { 0x0013, 0x008a }, + { 0x0013, 0x008b }, + { 0x0013, 0x008c }, + { 0x0013, 0x008d }, + { 0x0013, 0x008e }, + { 0x0013, 0x008f }, + { 0x0013, 0x0090 }, + { 0x0013, 0x0091 }, + { 0x0013, 0x0092 }, + { 0x0013, 0x0093 }, + { 0x0013, 0x0094 }, + { 0x0013, 0x0095 }, + { 0x0013, 0x0096 }, + { 0x0013, 0x0097 }, + { 0x0013, 0x0098 }, + { 0x0013, 0x0099 }, + { 0x0013, 0x009a }, + { 0x0013, 0x009b }, + { 0x0013, 0x009c }, + { 0x0013, 0x009d }, + { 0x0013, 0x009e }, + { 0x0013, 0x009f }, + +}; + +const UWord16 c_aauiLCLDHuffEnc44[289][2] = { + { 0x0001, 0x0001 }, + { 0x0003, 0x0001 }, + { 0x0006, 0x0002 }, + { 0x0008, 0x0002 }, + { 0x000b, 0x0002 }, + { 0x000f, 0x000a }, + { 0x0011, 0x0022 }, + { 0x0014, 0x0000 }, + { 0x0014, 0x0001 }, + { 0x0014, 0x0002 }, + { 0x0014, 0x0003 }, + { 0x0014, 0x0004 }, + { 0x0014, 0x0005 }, + { 0x0014, 0x0006 }, + { 0x0014, 0x0007 }, + { 0x0014, 0x0008 }, + { 0x0014, 0x0009 }, + { 0x0003, 0x0002 }, + { 0x0003, 0x0003 }, + { 0x0005, 0x0002 }, + { 0x0008, 0x0003 }, + { 0x000b, 0x0003 }, + { 0x000e, 0x0007 }, + { 0x0012, 0x003f }, + { 0x0014, 0x000a }, + { 0x0014, 0x000b }, + { 0x0014, 0x000c }, + { 0x0014, 0x000d }, + { 0x0014, 0x000e }, + { 0x0014, 0x000f }, + { 0x0014, 0x0010 }, + { 0x0014, 0x0011 }, + { 0x0014, 0x0012 }, + { 0x0014, 0x0013 }, + { 0x0006, 0x0003 }, + { 0x0005, 0x0003 }, + { 0x0007, 0x0003 }, + { 0x0009, 0x0002 }, + { 0x000c, 0x0003 }, + { 0x000f, 0x000b }, + { 0x0012, 0x0040 }, + { 0x0014, 0x0014 }, + { 0x0014, 0x0015 }, + { 0x0014, 0x0016 }, + { 0x0014, 0x0017 }, + { 0x0014, 0x0018 }, + { 0x0014, 0x0019 }, + { 0x0014, 0x001a }, + { 0x0014, 0x001b }, + { 0x0014, 0x001c }, + { 0x0014, 0x001d }, + { 0x0008, 0x0004 }, + { 0x0008, 0x0005 }, + { 0x0009, 0x0003 }, + { 0x000b, 0x0004 }, + { 0x000d, 0x0005 }, + { 0x0010, 0x0013 }, + { 0x0014, 0x001e }, + { 0x0014, 0x001f }, + { 0x0014, 0x0020 }, + { 0x0014, 0x0021 }, + { 0x0014, 0x0022 }, + { 0x0014, 0x0023 }, + { 0x0014, 0x0024 }, + { 0x0014, 0x0025 }, + { 0x0014, 0x0026 }, + { 0x0014, 0x0027 }, + { 0x0014, 0x0028 }, + { 0x000b, 0x0005 }, + { 0x000b, 0x0006 }, + { 0x000b, 0x0007 }, + { 0x000e, 0x0008 }, + { 0x0011, 0x0023 }, + { 0x0012, 0x0041 }, + { 0x0014, 0x0029 }, + { 0x0014, 0x002a }, + { 0x0013, 0x007b }, + { 0x0014, 0x002b }, + { 0x0014, 0x002c }, + { 0x0014, 0x002d }, + { 0x0014, 0x002e }, + { 0x0014, 0x002f }, + { 0x0014, 0x0030 }, + { 0x0014, 0x0031 }, + { 0x0014, 0x0032 }, + { 0x000f, 0x000c }, + { 0x000e, 0x0009 }, + { 0x000f, 0x000d }, + { 0x0011, 0x0024 }, + { 0x0012, 0x0042 }, + { 0x0014, 0x0033 }, + { 0x0014, 0x0034 }, + { 0x0014, 0x0035 }, + { 0x0014, 0x0036 }, + { 0x0014, 0x0037 }, + { 0x0014, 0x0038 }, + { 0x0014, 0x0039 }, + { 0x0014, 0x003a }, + { 0x0014, 0x003b }, + { 0x0014, 0x003c }, + { 0x0014, 0x003d }, + { 0x0014, 0x003e }, + { 0x0013, 0x007c }, + { 0x0011, 0x0025 }, + { 0x0012, 0x0043 }, + { 0x0014, 0x003f }, + { 0x0014, 0x0040 }, + { 0x0014, 0x0041 }, + { 0x0014, 0x0042 }, + { 0x0014, 0x0043 }, + { 0x0014, 0x0044 }, + { 0x0014, 0x0045 }, + { 0x0014, 0x0046 }, + { 0x0014, 0x0047 }, + { 0x0014, 0x0048 }, + { 0x0014, 0x0049 }, + { 0x0014, 0x004a }, + { 0x0014, 0x004b }, + { 0x0014, 0x004c }, + { 0x0014, 0x004d }, + { 0x0014, 0x004e }, + { 0x0014, 0x004f }, + { 0x0014, 0x0050 }, + { 0x0014, 0x0051 }, + { 0x0014, 0x0052 }, + { 0x0014, 0x0053 }, + { 0x0014, 0x0054 }, + { 0x0014, 0x0055 }, + { 0x0014, 0x0056 }, + { 0x0014, 0x0057 }, + { 0x0014, 0x0058 }, + { 0x0014, 0x0059 }, + { 0x0014, 0x005a }, + { 0x0014, 0x005b }, + { 0x0014, 0x005c }, + { 0x0014, 0x005d }, + { 0x0014, 0x005e }, + { 0x0014, 0x005f }, + { 0x0014, 0x0060 }, + { 0x0014, 0x0061 }, + { 0x0014, 0x0062 }, + { 0x0014, 0x0063 }, + { 0x0014, 0x0064 }, + { 0x0014, 0x0065 }, + { 0x0014, 0x0066 }, + { 0x0014, 0x0067 }, + { 0x0014, 0x0068 }, + { 0x0014, 0x0069 }, + { 0x0014, 0x006a }, + { 0x0014, 0x006b }, + { 0x0014, 0x006c }, + { 0x0014, 0x006d }, + { 0x0014, 0x006e }, + { 0x0014, 0x006f }, + { 0x0014, 0x0070 }, + { 0x0014, 0x0071 }, + { 0x0014, 0x0072 }, + { 0x0014, 0x0073 }, + { 0x0014, 0x0074 }, + { 0x0014, 0x0075 }, + { 0x0014, 0x0076 }, + { 0x0014, 0x0077 }, + { 0x0014, 0x0078 }, + { 0x0014, 0x0079 }, + { 0x0014, 0x007a }, + { 0x0014, 0x007b }, + { 0x0014, 0x007c }, + { 0x0014, 0x007d }, + { 0x0014, 0x007e }, + { 0x0014, 0x007f }, + { 0x0014, 0x0080 }, + { 0x0014, 0x0081 }, + { 0x0014, 0x0082 }, + { 0x0014, 0x0083 }, + { 0x0014, 0x0084 }, + { 0x0014, 0x0085 }, + { 0x0014, 0x0086 }, + { 0x0014, 0x0087 }, + { 0x0014, 0x0088 }, + { 0x0014, 0x0089 }, + { 0x0014, 0x008a }, + { 0x0014, 0x008b }, + { 0x0014, 0x008c }, + { 0x0014, 0x008d }, + { 0x0014, 0x008e }, + { 0x0014, 0x008f }, + { 0x0014, 0x0090 }, + { 0x0014, 0x0091 }, + { 0x0014, 0x0092 }, + { 0x0014, 0x0093 }, + { 0x0014, 0x0094 }, + { 0x0014, 0x0095 }, + { 0x0014, 0x0096 }, + { 0x0014, 0x0097 }, + { 0x0014, 0x0098 }, + { 0x0014, 0x0099 }, + { 0x0014, 0x009a }, + { 0x0014, 0x009b }, + { 0x0014, 0x009c }, + { 0x0014, 0x009d }, + { 0x0014, 0x009e }, + { 0x0014, 0x009f }, + { 0x0014, 0x00a0 }, + { 0x0014, 0x00a1 }, + { 0x0014, 0x00a2 }, + { 0x0014, 0x00a3 }, + { 0x0014, 0x00a4 }, + { 0x0014, 0x00a5 }, + { 0x0014, 0x00a6 }, + { 0x0014, 0x00a7 }, + { 0x0014, 0x00a8 }, + { 0x0014, 0x00a9 }, + { 0x0014, 0x00aa }, + { 0x0014, 0x00ab }, + { 0x0014, 0x00ac }, + { 0x0014, 0x00ad }, + { 0x0014, 0x00ae }, + { 0x0014, 0x00af }, + { 0x0014, 0x00b0 }, + { 0x0014, 0x00b1 }, + { 0x0014, 0x00b2 }, + { 0x0014, 0x00b3 }, + { 0x0014, 0x00b4 }, + { 0x0014, 0x00b5 }, + { 0x0014, 0x00b6 }, + { 0x0014, 0x00b7 }, + { 0x0014, 0x00b8 }, + { 0x0014, 0x00b9 }, + { 0x0014, 0x00ba }, + { 0x0014, 0x00bb }, + { 0x0014, 0x00bc }, + { 0x0014, 0x00bd }, + { 0x0014, 0x00be }, + { 0x0014, 0x00bf }, + { 0x0014, 0x00c0 }, + { 0x0014, 0x00c1 }, + { 0x0014, 0x00c2 }, + { 0x0014, 0x00c3 }, + { 0x0014, 0x00c4 }, + { 0x0014, 0x00c5 }, + { 0x0014, 0x00c6 }, + { 0x0014, 0x00c7 }, + { 0x0014, 0x00c8 }, + { 0x0014, 0x00c9 }, + { 0x0014, 0x00ca }, + { 0x0014, 0x00cb }, + { 0x0014, 0x00cc }, + { 0x0014, 0x00cd }, + { 0x0014, 0x00ce }, + { 0x0014, 0x00cf }, + { 0x0014, 0x00d0 }, + { 0x0014, 0x00d1 }, + { 0x0014, 0x00d2 }, + { 0x0014, 0x00d3 }, + { 0x0014, 0x00d4 }, + { 0x0014, 0x00d5 }, + { 0x0014, 0x00d6 }, + { 0x0014, 0x00d7 }, + { 0x0014, 0x00d8 }, + { 0x0014, 0x00d9 }, + { 0x0014, 0x00da }, + { 0x0014, 0x00db }, + { 0x0014, 0x00dc }, + { 0x0014, 0x00dd }, + { 0x0014, 0x00de }, + { 0x0014, 0x00df }, + { 0x0014, 0x00e0 }, + { 0x0014, 0x00e1 }, + { 0x0014, 0x00e2 }, + { 0x0014, 0x00e3 }, + { 0x0014, 0x00e4 }, + { 0x0014, 0x00e5 }, + { 0x0014, 0x00e6 }, + { 0x0014, 0x00e7 }, + { 0x0014, 0x00e8 }, + { 0x0014, 0x00e9 }, + { 0x0014, 0x00ea }, + { 0x0014, 0x00eb }, + { 0x0014, 0x00ec }, + { 0x0014, 0x00ed }, + { 0x0014, 0x00ee }, + { 0x0014, 0x00ef }, + { 0x0014, 0x00f0 }, + { 0x0014, 0x00f1 }, + { 0x0014, 0x00f2 }, + { 0x0014, 0x00f3 }, + { 0x0014, 0x00f4 }, + { 0x0014, 0x00f5 }, + { 0x0013, 0x007d }, + +}; + + +const UWord16 c_aauiLCLDHuffEnc45[324][2] = { + { 0x0002, 0x0002 }, + { 0x0003, 0x0002 }, + { 0x0005, 0x0003 }, + { 0x0007, 0x0002 }, + { 0x0009, 0x0003 }, + { 0x000c, 0x0005 }, + { 0x0010, 0x0025 }, + { 0x0012, 0x0088 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0002, 0x0003 }, + { 0x0003, 0x0003 }, + { 0x0005, 0x0004 }, + { 0x0006, 0x0003 }, + { 0x0009, 0x0004 }, + { 0x000b, 0x0004 }, + { 0x000f, 0x0014 }, + { 0x0011, 0x0048 }, + { 0x0013, 0x000a }, + { 0x0013, 0x000b }, + { 0x0013, 0x000c }, + { 0x0013, 0x000d }, + { 0x0013, 0x000e }, + { 0x0013, 0x000f }, + { 0x0013, 0x0010 }, + { 0x0013, 0x0011 }, + { 0x0013, 0x0012 }, + { 0x0013, 0x0013 }, + { 0x0005, 0x0005 }, + { 0x0004, 0x0003 }, + { 0x0006, 0x0004 }, + { 0x0007, 0x0003 }, + { 0x000a, 0x0004 }, + { 0x000d, 0x0007 }, + { 0x000f, 0x0015 }, + { 0x0013, 0x0014 }, + { 0x0013, 0x0015 }, + { 0x0013, 0x0016 }, + { 0x0013, 0x0017 }, + { 0x0013, 0x0018 }, + { 0x0013, 0x0019 }, + { 0x0013, 0x001a }, + { 0x0013, 0x001b }, + { 0x0013, 0x001c }, + { 0x0013, 0x001d }, + { 0x0013, 0x001e }, + { 0x0007, 0x0004 }, + { 0x0006, 0x0005 }, + { 0x0007, 0x0005 }, + { 0x0009, 0x0005 }, + { 0x000b, 0x0005 }, + { 0x000d, 0x0008 }, + { 0x0010, 0x0026 }, + { 0x0012, 0x0089 }, + { 0x0012, 0x008a }, + { 0x0013, 0x001f }, + { 0x0013, 0x0020 }, + { 0x0013, 0x0021 }, + { 0x0013, 0x0022 }, + { 0x0013, 0x0023 }, + { 0x0013, 0x0024 }, + { 0x0013, 0x0025 }, + { 0x0013, 0x0026 }, + { 0x0013, 0x0027 }, + { 0x0009, 0x0006 }, + { 0x0009, 0x0007 }, + { 0x000a, 0x0005 }, + { 0x000b, 0x0006 }, + { 0x000d, 0x0009 }, + { 0x000f, 0x0016 }, + { 0x0011, 0x0049 }, + { 0x0013, 0x0028 }, + { 0x0013, 0x0029 }, + { 0x0013, 0x002a }, + { 0x0013, 0x002b }, + { 0x0013, 0x002c }, + { 0x0013, 0x002d }, + { 0x0013, 0x002e }, + { 0x0013, 0x002f }, + { 0x0013, 0x0030 }, + { 0x0013, 0x0031 }, + { 0x0013, 0x0032 }, + { 0x000c, 0x0006 }, + { 0x000b, 0x0007 }, + { 0x000c, 0x0007 }, + { 0x000e, 0x000d }, + { 0x0010, 0x0027 }, + { 0x0012, 0x008b }, + { 0x0012, 0x008c }, + { 0x0013, 0x0033 }, + { 0x0013, 0x0034 }, + { 0x0013, 0x0035 }, + { 0x0013, 0x0036 }, + { 0x0013, 0x0037 }, + { 0x0013, 0x0038 }, + { 0x0013, 0x0039 }, + { 0x0013, 0x003a }, + { 0x0013, 0x003b }, + { 0x0013, 0x003c }, + { 0x0013, 0x003d }, + { 0x000f, 0x0017 }, + { 0x000f, 0x0018 }, + { 0x000f, 0x0019 }, + { 0x0012, 0x008d }, + { 0x0013, 0x003e }, + { 0x0013, 0x003f }, + { 0x0013, 0x0040 }, + { 0x0013, 0x0041 }, + { 0x0013, 0x0042 }, + { 0x0013, 0x0043 }, + { 0x0013, 0x0044 }, + { 0x0013, 0x0045 }, + { 0x0013, 0x0046 }, + { 0x0013, 0x0047 }, + { 0x0013, 0x0048 }, + { 0x0013, 0x0049 }, + { 0x0013, 0x004a }, + { 0x0013, 0x004b }, + { 0x0013, 0x004c }, + { 0x0012, 0x008e }, + { 0x0012, 0x008f }, + { 0x0013, 0x004d }, + { 0x0013, 0x004e }, + { 0x0013, 0x004f }, + { 0x0013, 0x0050 }, + { 0x0013, 0x0051 }, + { 0x0013, 0x0052 }, + { 0x0013, 0x0053 }, + { 0x0013, 0x0054 }, + { 0x0013, 0x0055 }, + { 0x0013, 0x0056 }, + { 0x0013, 0x0057 }, + { 0x0013, 0x0058 }, + { 0x0013, 0x0059 }, + { 0x0013, 0x005a }, + { 0x0013, 0x005b }, + { 0x0013, 0x005c }, + { 0x0013, 0x005d }, + { 0x0013, 0x005e }, + { 0x0013, 0x005f }, + { 0x0013, 0x0060 }, + { 0x0013, 0x0061 }, + { 0x0013, 0x0062 }, + { 0x0013, 0x0063 }, + { 0x0013, 0x0064 }, + { 0x0013, 0x0065 }, + { 0x0013, 0x0066 }, + { 0x0013, 0x0067 }, + { 0x0013, 0x0068 }, + { 0x0013, 0x0069 }, + { 0x0013, 0x006a }, + { 0x0013, 0x006b }, + { 0x0013, 0x006c }, + { 0x0013, 0x006d }, + { 0x0013, 0x006e }, + { 0x0013, 0x006f }, + { 0x0013, 0x0070 }, + { 0x0013, 0x0071 }, + { 0x0013, 0x0072 }, + { 0x0013, 0x0073 }, + { 0x0013, 0x0074 }, + { 0x0013, 0x0075 }, + { 0x0013, 0x0076 }, + { 0x0013, 0x0077 }, + { 0x0013, 0x0078 }, + { 0x0013, 0x0079 }, + { 0x0013, 0x007a }, + { 0x0013, 0x007b }, + { 0x0013, 0x007c }, + { 0x0013, 0x007d }, + { 0x0013, 0x007e }, + { 0x0013, 0x007f }, + { 0x0013, 0x0080 }, + { 0x0013, 0x0081 }, + { 0x0013, 0x0082 }, + { 0x0013, 0x0083 }, + { 0x0013, 0x0084 }, + { 0x0013, 0x0085 }, + { 0x0013, 0x0086 }, + { 0x0013, 0x0087 }, + { 0x0013, 0x0088 }, + { 0x0013, 0x0089 }, + { 0x0013, 0x008a }, + { 0x0013, 0x008b }, + { 0x0013, 0x008c }, + { 0x0013, 0x008d }, + { 0x0013, 0x008e }, + { 0x0013, 0x008f }, + { 0x0013, 0x0090 }, + { 0x0013, 0x0091 }, + { 0x0013, 0x0092 }, + { 0x0013, 0x0093 }, + { 0x0013, 0x0094 }, + { 0x0013, 0x0095 }, + { 0x0013, 0x0096 }, + { 0x0013, 0x0097 }, + { 0x0013, 0x0098 }, + { 0x0013, 0x0099 }, + { 0x0013, 0x009a }, + { 0x0013, 0x009b }, + { 0x0013, 0x009c }, + { 0x0013, 0x009d }, + { 0x0013, 0x009e }, + { 0x0013, 0x009f }, + { 0x0013, 0x00a0 }, + { 0x0013, 0x00a1 }, + { 0x0013, 0x00a2 }, + { 0x0013, 0x00a3 }, + { 0x0013, 0x00a4 }, + { 0x0013, 0x00a5 }, + { 0x0013, 0x00a6 }, + { 0x0013, 0x00a7 }, + { 0x0013, 0x00a8 }, + { 0x0013, 0x00a9 }, + { 0x0013, 0x00aa }, + { 0x0013, 0x00ab }, + { 0x0013, 0x00ac }, + { 0x0013, 0x00ad }, + { 0x0013, 0x00ae }, + { 0x0013, 0x00af }, + { 0x0013, 0x00b0 }, + { 0x0013, 0x00b1 }, + { 0x0013, 0x00b2 }, + { 0x0013, 0x00b3 }, + { 0x0013, 0x00b4 }, + { 0x0013, 0x00b5 }, + { 0x0013, 0x00b6 }, + { 0x0013, 0x00b7 }, + { 0x0013, 0x00b8 }, + { 0x0013, 0x00b9 }, + { 0x0013, 0x00ba }, + { 0x0013, 0x00bb }, + { 0x0013, 0x00bc }, + { 0x0013, 0x00bd }, + { 0x0013, 0x00be }, + { 0x0013, 0x00bf }, + { 0x0013, 0x00c0 }, + { 0x0013, 0x00c1 }, + { 0x0013, 0x00c2 }, + { 0x0013, 0x00c3 }, + { 0x0013, 0x00c4 }, + { 0x0013, 0x00c5 }, + { 0x0013, 0x00c6 }, + { 0x0013, 0x00c7 }, + { 0x0013, 0x00c8 }, + { 0x0013, 0x00c9 }, + { 0x0013, 0x00ca }, + { 0x0013, 0x00cb }, + { 0x0013, 0x00cc }, + { 0x0013, 0x00cd }, + { 0x0013, 0x00ce }, + { 0x0013, 0x00cf }, + { 0x0013, 0x00d0 }, + { 0x0013, 0x00d1 }, + { 0x0013, 0x00d2 }, + { 0x0013, 0x00d3 }, + { 0x0013, 0x00d4 }, + { 0x0013, 0x00d5 }, + { 0x0013, 0x00d6 }, + { 0x0013, 0x00d7 }, + { 0x0013, 0x00d8 }, + { 0x0013, 0x00d9 }, + { 0x0013, 0x00da }, + { 0x0013, 0x00db }, + { 0x0013, 0x00dc }, + { 0x0013, 0x00dd }, + { 0x0013, 0x00de }, + { 0x0013, 0x00df }, + { 0x0013, 0x00e0 }, + { 0x0013, 0x00e1 }, + { 0x0013, 0x00e2 }, + { 0x0013, 0x00e3 }, + { 0x0013, 0x00e4 }, + { 0x0013, 0x00e5 }, + { 0x0013, 0x00e6 }, + { 0x0013, 0x00e7 }, + { 0x0013, 0x00e8 }, + { 0x0013, 0x00e9 }, + { 0x0013, 0x00ea }, + { 0x0013, 0x00eb }, + { 0x0013, 0x00ec }, + { 0x0013, 0x00ed }, + { 0x0013, 0x00ee }, + { 0x0013, 0x00ef }, + { 0x0013, 0x00f0 }, + { 0x0013, 0x00f1 }, + { 0x0013, 0x00f2 }, + { 0x0013, 0x00f3 }, + { 0x0013, 0x00f4 }, + { 0x0013, 0x00f5 }, + { 0x0013, 0x00f6 }, + { 0x0013, 0x00f7 }, + { 0x0013, 0x00f8 }, + { 0x0013, 0x00f9 }, + { 0x0013, 0x00fa }, + { 0x0013, 0x00fb }, + { 0x0013, 0x00fc }, + { 0x0013, 0x00fd }, + { 0x0013, 0x00fe }, + { 0x0013, 0x00ff }, + { 0x0013, 0x0100 }, + { 0x0013, 0x0101 }, + { 0x0013, 0x0102 }, + { 0x0013, 0x0103 }, + { 0x0013, 0x0104 }, + { 0x0013, 0x0105 }, + { 0x0013, 0x0106 }, + { 0x0013, 0x0107 }, + { 0x0013, 0x0108 }, + { 0x0013, 0x0109 }, + { 0x0013, 0x010a }, + { 0x0013, 0x010b }, + { 0x0013, 0x010c }, + { 0x0013, 0x010d }, + { 0x0013, 0x010e }, + { 0x0013, 0x010f }, + +}; + +const UWord16 c_aauiLCLDHuffEnc46[400][2] = { + { 0x0002, 0x0002 }, + { 0x0003, 0x0002 }, + { 0x0005, 0x0003 }, + { 0x0007, 0x0004 }, + { 0x0009, 0x0005 }, + { 0x000b, 0x0006 }, + { 0x000d, 0x000a }, + { 0x000f, 0x0018 }, + { 0x0012, 0x00a6 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0013, 0x000a }, + { 0x0002, 0x0003 }, + { 0x0003, 0x0003 }, + { 0x0005, 0x0004 }, + { 0x0006, 0x0004 }, + { 0x0008, 0x0004 }, + { 0x000a, 0x0006 }, + { 0x000c, 0x0008 }, + { 0x000e, 0x0011 }, + { 0x0012, 0x00a7 }, + { 0x0013, 0x000b }, + { 0x0013, 0x000c }, + { 0x0013, 0x000d }, + { 0x0013, 0x000e }, + { 0x0013, 0x000f }, + { 0x0013, 0x0010 }, + { 0x0013, 0x0011 }, + { 0x0013, 0x0012 }, + { 0x0013, 0x0013 }, + { 0x0013, 0x0014 }, + { 0x0013, 0x0015 }, + { 0x0005, 0x0005 }, + { 0x0005, 0x0006 }, + { 0x0005, 0x0007 }, + { 0x0007, 0x0005 }, + { 0x0009, 0x0006 }, + { 0x000b, 0x0007 }, + { 0x000d, 0x000b }, + { 0x000f, 0x0019 }, + { 0x0013, 0x0016 }, + { 0x0013, 0x0017 }, + { 0x0013, 0x0018 }, + { 0x0013, 0x0019 }, + { 0x0013, 0x001a }, + { 0x0013, 0x001b }, + { 0x0013, 0x001c }, + { 0x0013, 0x001d }, + { 0x0013, 0x001e }, + { 0x0013, 0x001f }, + { 0x0013, 0x0020 }, + { 0x0013, 0x0021 }, + { 0x0007, 0x0006 }, + { 0x0006, 0x0005 }, + { 0x0007, 0x0007 }, + { 0x0008, 0x0005 }, + { 0x000a, 0x0007 }, + { 0x000c, 0x0009 }, + { 0x000e, 0x0012 }, + { 0x000f, 0x001a }, + { 0x0012, 0x00a8 }, + { 0x0013, 0x0022 }, + { 0x0013, 0x0023 }, + { 0x0013, 0x0024 }, + { 0x0013, 0x0025 }, + { 0x0013, 0x0026 }, + { 0x0013, 0x0027 }, + { 0x0013, 0x0028 }, + { 0x0013, 0x0029 }, + { 0x0013, 0x002a }, + { 0x0013, 0x002b }, + { 0x0013, 0x002c }, + { 0x0009, 0x0007 }, + { 0x0008, 0x0006 }, + { 0x0008, 0x0007 }, + { 0x000a, 0x0008 }, + { 0x000b, 0x0008 }, + { 0x000d, 0x000c }, + { 0x000e, 0x0013 }, + { 0x0010, 0x002c }, + { 0x0013, 0x002d }, + { 0x0013, 0x002e }, + { 0x0013, 0x002f }, + { 0x0013, 0x0030 }, + { 0x0013, 0x0031 }, + { 0x0013, 0x0032 }, + { 0x0013, 0x0033 }, + { 0x0013, 0x0034 }, + { 0x0013, 0x0035 }, + { 0x0013, 0x0036 }, + { 0x0013, 0x0037 }, + { 0x0013, 0x0038 }, + { 0x000b, 0x0009 }, + { 0x000a, 0x0009 }, + { 0x000b, 0x000a }, + { 0x000b, 0x000b }, + { 0x000d, 0x000d }, + { 0x000f, 0x001b }, + { 0x0010, 0x002d }, + { 0x0013, 0x0039 }, + { 0x0013, 0x003a }, + { 0x0013, 0x003b }, + { 0x0013, 0x003c }, + { 0x0013, 0x003d }, + { 0x0013, 0x003e }, + { 0x0013, 0x003f }, + { 0x0013, 0x0040 }, + { 0x0013, 0x0041 }, + { 0x0013, 0x0042 }, + { 0x0013, 0x0043 }, + { 0x0013, 0x0044 }, + { 0x0013, 0x0045 }, + { 0x000d, 0x000e }, + { 0x000c, 0x000a }, + { 0x000c, 0x000b }, + { 0x000d, 0x000f }, + { 0x000f, 0x001c }, + { 0x000f, 0x001d }, + { 0x0013, 0x0046 }, + { 0x0013, 0x0047 }, + { 0x0013, 0x0048 }, + { 0x0013, 0x0049 }, + { 0x0013, 0x004a }, + { 0x0013, 0x004b }, + { 0x0013, 0x004c }, + { 0x0013, 0x004d }, + { 0x0013, 0x004e }, + { 0x0013, 0x004f }, + { 0x0013, 0x0050 }, + { 0x0013, 0x0051 }, + { 0x0013, 0x0052 }, + { 0x0013, 0x0053 }, + { 0x000f, 0x001e }, + { 0x000f, 0x001f }, + { 0x000f, 0x0020 }, + { 0x000f, 0x0021 }, + { 0x0010, 0x002e }, + { 0x0012, 0x00a9 }, + { 0x0013, 0x0054 }, + { 0x0013, 0x0055 }, + { 0x0012, 0x00aa }, + { 0x0013, 0x0056 }, + { 0x0013, 0x0057 }, + { 0x0013, 0x0058 }, + { 0x0013, 0x0059 }, + { 0x0013, 0x005a }, + { 0x0013, 0x005b }, + { 0x0013, 0x005c }, + { 0x0013, 0x005d }, + { 0x0013, 0x005e }, + { 0x0013, 0x005f }, + { 0x0013, 0x0060 }, + { 0x0013, 0x0061 }, + { 0x0010, 0x002f }, + { 0x0013, 0x0062 }, + { 0x0011, 0x0057 }, + { 0x0013, 0x0063 }, + { 0x0013, 0x0064 }, + { 0x0013, 0x0065 }, + { 0x0013, 0x0066 }, + { 0x0013, 0x0067 }, + { 0x0013, 0x0068 }, + { 0x0013, 0x0069 }, + { 0x0013, 0x006a }, + { 0x0013, 0x006b }, + { 0x0013, 0x006c }, + { 0x0013, 0x006d }, + { 0x0013, 0x006e }, + { 0x0013, 0x006f }, + { 0x0013, 0x0070 }, + { 0x0013, 0x0071 }, + { 0x0013, 0x0072 }, + { 0x0013, 0x0073 }, + { 0x0013, 0x0074 }, + { 0x0013, 0x0075 }, + { 0x0013, 0x0076 }, + { 0x0013, 0x0077 }, + { 0x0013, 0x0078 }, + { 0x0013, 0x0079 }, + { 0x0013, 0x007a }, + { 0x0013, 0x007b }, + { 0x0013, 0x007c }, + { 0x0013, 0x007d }, + { 0x0013, 0x007e }, + { 0x0013, 0x007f }, + { 0x0013, 0x0080 }, + { 0x0013, 0x0081 }, + { 0x0013, 0x0082 }, + { 0x0013, 0x0083 }, + { 0x0013, 0x0084 }, + { 0x0013, 0x0085 }, + { 0x0013, 0x0086 }, + { 0x0013, 0x0087 }, + { 0x0013, 0x0088 }, + { 0x0013, 0x0089 }, + { 0x0013, 0x008a }, + { 0x0013, 0x008b }, + { 0x0013, 0x008c }, + { 0x0013, 0x008d }, + { 0x0013, 0x008e }, + { 0x0013, 0x008f }, + { 0x0013, 0x0090 }, + { 0x0013, 0x0091 }, + { 0x0013, 0x0092 }, + { 0x0013, 0x0093 }, + { 0x0013, 0x0094 }, + { 0x0013, 0x0095 }, + { 0x0013, 0x0096 }, + { 0x0013, 0x0097 }, + { 0x0013, 0x0098 }, + { 0x0013, 0x0099 }, + { 0x0013, 0x009a }, + { 0x0013, 0x009b }, + { 0x0013, 0x009c }, + { 0x0013, 0x009d }, + { 0x0013, 0x009e }, + { 0x0013, 0x009f }, + { 0x0013, 0x00a0 }, + { 0x0013, 0x00a1 }, + { 0x0013, 0x00a2 }, + { 0x0013, 0x00a3 }, + { 0x0013, 0x00a4 }, + { 0x0013, 0x00a5 }, + { 0x0013, 0x00a6 }, + { 0x0013, 0x00a7 }, + { 0x0013, 0x00a8 }, + { 0x0013, 0x00a9 }, + { 0x0013, 0x00aa }, + { 0x0013, 0x00ab }, + { 0x0013, 0x00ac }, + { 0x0013, 0x00ad }, + { 0x0013, 0x00ae }, + { 0x0013, 0x00af }, + { 0x0013, 0x00b0 }, + { 0x0013, 0x00b1 }, + { 0x0013, 0x00b2 }, + { 0x0013, 0x00b3 }, + { 0x0013, 0x00b4 }, + { 0x0013, 0x00b5 }, + { 0x0013, 0x00b6 }, + { 0x0013, 0x00b7 }, + { 0x0013, 0x00b8 }, + { 0x0013, 0x00b9 }, + { 0x0013, 0x00ba }, + { 0x0013, 0x00bb }, + { 0x0013, 0x00bc }, + { 0x0013, 0x00bd }, + { 0x0013, 0x00be }, + { 0x0013, 0x00bf }, + { 0x0013, 0x00c0 }, + { 0x0013, 0x00c1 }, + { 0x0013, 0x00c2 }, + { 0x0013, 0x00c3 }, + { 0x0013, 0x00c4 }, + { 0x0013, 0x00c5 }, + { 0x0013, 0x00c6 }, + { 0x0013, 0x00c7 }, + { 0x0013, 0x00c8 }, + { 0x0013, 0x00c9 }, + { 0x0013, 0x00ca }, + { 0x0013, 0x00cb }, + { 0x0013, 0x00cc }, + { 0x0013, 0x00cd }, + { 0x0013, 0x00ce }, + { 0x0013, 0x00cf }, + { 0x0013, 0x00d0 }, + { 0x0013, 0x00d1 }, + { 0x0013, 0x00d2 }, + { 0x0013, 0x00d3 }, + { 0x0013, 0x00d4 }, + { 0x0013, 0x00d5 }, + { 0x0013, 0x00d6 }, + { 0x0013, 0x00d7 }, + { 0x0013, 0x00d8 }, + { 0x0013, 0x00d9 }, + { 0x0013, 0x00da }, + { 0x0013, 0x00db }, + { 0x0013, 0x00dc }, + { 0x0013, 0x00dd }, + { 0x0013, 0x00de }, + { 0x0013, 0x00df }, + { 0x0013, 0x00e0 }, + { 0x0013, 0x00e1 }, + { 0x0013, 0x00e2 }, + { 0x0013, 0x00e3 }, + { 0x0013, 0x00e4 }, + { 0x0013, 0x00e5 }, + { 0x0013, 0x00e6 }, + { 0x0013, 0x00e7 }, + { 0x0013, 0x00e8 }, + { 0x0013, 0x00e9 }, + { 0x0013, 0x00ea }, + { 0x0013, 0x00eb }, + { 0x0013, 0x00ec }, + { 0x0013, 0x00ed }, + { 0x0013, 0x00ee }, + { 0x0013, 0x00ef }, + { 0x0013, 0x00f0 }, + { 0x0013, 0x00f1 }, + { 0x0013, 0x00f2 }, + { 0x0013, 0x00f3 }, + { 0x0013, 0x00f4 }, + { 0x0013, 0x00f5 }, + { 0x0013, 0x00f6 }, + { 0x0013, 0x00f7 }, + { 0x0013, 0x00f8 }, + { 0x0013, 0x00f9 }, + { 0x0013, 0x00fa }, + { 0x0013, 0x00fb }, + { 0x0013, 0x00fc }, + { 0x0013, 0x00fd }, + { 0x0013, 0x00fe }, + { 0x0013, 0x00ff }, + { 0x0013, 0x0100 }, + { 0x0013, 0x0101 }, + { 0x0013, 0x0102 }, + { 0x0013, 0x0103 }, + { 0x0013, 0x0104 }, + { 0x0013, 0x0105 }, + { 0x0013, 0x0106 }, + { 0x0013, 0x0107 }, + { 0x0013, 0x0108 }, + { 0x0013, 0x0109 }, + { 0x0013, 0x010a }, + { 0x0013, 0x010b }, + { 0x0013, 0x010c }, + { 0x0013, 0x010d }, + { 0x0013, 0x010e }, + { 0x0013, 0x010f }, + { 0x0013, 0x0110 }, + { 0x0013, 0x0111 }, + { 0x0013, 0x0112 }, + { 0x0013, 0x0113 }, + { 0x0013, 0x0114 }, + { 0x0013, 0x0115 }, + { 0x0013, 0x0116 }, + { 0x0013, 0x0117 }, + { 0x0013, 0x0118 }, + { 0x0013, 0x0119 }, + { 0x0013, 0x011a }, + { 0x0013, 0x011b }, + { 0x0013, 0x011c }, + { 0x0013, 0x011d }, + { 0x0013, 0x011e }, + { 0x0013, 0x011f }, + { 0x0013, 0x0120 }, + { 0x0013, 0x0121 }, + { 0x0013, 0x0122 }, + { 0x0013, 0x0123 }, + { 0x0013, 0x0124 }, + { 0x0013, 0x0125 }, + { 0x0013, 0x0126 }, + { 0x0013, 0x0127 }, + { 0x0013, 0x0128 }, + { 0x0013, 0x0129 }, + { 0x0013, 0x012a }, + { 0x0013, 0x012b }, + { 0x0013, 0x012c }, + { 0x0013, 0x012d }, + { 0x0013, 0x012e }, + { 0x0013, 0x012f }, + { 0x0013, 0x0130 }, + { 0x0013, 0x0131 }, + { 0x0013, 0x0132 }, + { 0x0013, 0x0133 }, + { 0x0013, 0x0134 }, + { 0x0013, 0x0135 }, + { 0x0013, 0x0136 }, + { 0x0013, 0x0137 }, + { 0x0013, 0x0138 }, + { 0x0013, 0x0139 }, + { 0x0013, 0x013a }, + { 0x0013, 0x013b }, + { 0x0013, 0x013c }, + { 0x0013, 0x013d }, + { 0x0013, 0x013e }, + { 0x0013, 0x013f }, + { 0x0013, 0x0140 }, + { 0x0013, 0x0141 }, + { 0x0013, 0x0142 }, + { 0x0013, 0x0143 }, + { 0x0013, 0x0144 }, + { 0x0013, 0x0145 }, + { 0x0013, 0x0146 }, + { 0x0013, 0x0147 }, + { 0x0013, 0x0148 }, + { 0x0013, 0x0149 }, + { 0x0013, 0x014a }, + { 0x0013, 0x014b }, + { 0x0012, 0x00ab }, + { 0x0012, 0x00ac }, + { 0x0012, 0x00ad }, +}; + +const UWord16 c_aauiLCLDHuffEnc47[576][2] = { + { 0x0002, 0x0003 }, + { 0x0003, 0x0003 }, + { 0x0005, 0x0005 }, + { 0x0006, 0x0004 }, + { 0x0008, 0x0006 }, + { 0x000a, 0x0007 }, + { 0x000c, 0x000b }, + { 0x000d, 0x000d }, + { 0x0010, 0x0041 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0013, 0x000a }, + { 0x0013, 0x000b }, + { 0x0013, 0x000c }, + { 0x0013, 0x000d }, + { 0x0013, 0x000e }, + { 0x0003, 0x0004 }, + { 0x0003, 0x0005 }, + { 0x0004, 0x0004 }, + { 0x0006, 0x0005 }, + { 0x0007, 0x0005 }, + { 0x0009, 0x0006 }, + { 0x000b, 0x0007 }, + { 0x000d, 0x000e }, + { 0x000f, 0x0025 }, + { 0x000f, 0x0026 }, + { 0x0012, 0x00f6 }, + { 0x0013, 0x000f }, + { 0x0013, 0x0010 }, + { 0x0013, 0x0011 }, + { 0x0013, 0x0012 }, + { 0x0013, 0x0013 }, + { 0x0013, 0x0014 }, + { 0x0013, 0x0015 }, + { 0x0013, 0x0016 }, + { 0x0013, 0x0017 }, + { 0x0013, 0x0018 }, + { 0x0013, 0x0019 }, + { 0x0013, 0x001a }, + { 0x0013, 0x001b }, + { 0x0005, 0x0006 }, + { 0x0004, 0x0005 }, + { 0x0005, 0x0007 }, + { 0x0006, 0x0006 }, + { 0x0008, 0x0007 }, + { 0x0009, 0x0007 }, + { 0x000b, 0x0008 }, + { 0x000d, 0x000f }, + { 0x000f, 0x0027 }, + { 0x0012, 0x00f7 }, + { 0x0013, 0x001c }, + { 0x0013, 0x001d }, + { 0x0013, 0x001e }, + { 0x0013, 0x001f }, + { 0x0013, 0x0020 }, + { 0x0013, 0x0021 }, + { 0x0013, 0x0022 }, + { 0x0013, 0x0023 }, + { 0x0013, 0x0024 }, + { 0x0013, 0x0025 }, + { 0x0013, 0x0026 }, + { 0x0013, 0x0027 }, + { 0x0013, 0x0028 }, + { 0x0013, 0x0029 }, + { 0x0006, 0x0007 }, + { 0x0006, 0x0008 }, + { 0x0006, 0x0009 }, + { 0x0007, 0x0006 }, + { 0x0009, 0x0008 }, + { 0x000a, 0x0008 }, + { 0x000c, 0x000c }, + { 0x000e, 0x0017 }, + { 0x0010, 0x0042 }, + { 0x0012, 0x00f8 }, + { 0x0013, 0x002a }, + { 0x0013, 0x002b }, + { 0x0013, 0x002c }, + { 0x0013, 0x002d }, + { 0x0013, 0x002e }, + { 0x0013, 0x002f }, + { 0x0013, 0x0030 }, + { 0x0013, 0x0031 }, + { 0x0013, 0x0032 }, + { 0x0013, 0x0033 }, + { 0x0013, 0x0034 }, + { 0x0013, 0x0035 }, + { 0x0013, 0x0036 }, + { 0x0013, 0x0037 }, + { 0x0008, 0x0008 }, + { 0x0007, 0x0007 }, + { 0x0008, 0x0009 }, + { 0x0009, 0x0009 }, + { 0x000a, 0x0009 }, + { 0x000b, 0x0009 }, + { 0x000d, 0x0010 }, + { 0x000f, 0x0028 }, + { 0x000f, 0x0029 }, + { 0x0011, 0x007f }, + { 0x0013, 0x0038 }, + { 0x0013, 0x0039 }, + { 0x0013, 0x003a }, + { 0x0013, 0x003b }, + { 0x0013, 0x003c }, + { 0x0013, 0x003d }, + { 0x0013, 0x003e }, + { 0x0013, 0x003f }, + { 0x0013, 0x0040 }, + { 0x0013, 0x0041 }, + { 0x0013, 0x0042 }, + { 0x0013, 0x0043 }, + { 0x0013, 0x0044 }, + { 0x0013, 0x0045 }, + { 0x000a, 0x000a }, + { 0x0009, 0x000a }, + { 0x0009, 0x000b }, + { 0x000a, 0x000b }, + { 0x000b, 0x000a }, + { 0x000d, 0x0011 }, + { 0x000f, 0x002a }, + { 0x0010, 0x0043 }, + { 0x0012, 0x00f9 }, + { 0x0013, 0x0046 }, + { 0x0013, 0x0047 }, + { 0x0013, 0x0048 }, + { 0x0013, 0x0049 }, + { 0x0013, 0x004a }, + { 0x0013, 0x004b }, + { 0x0013, 0x004c }, + { 0x0013, 0x004d }, + { 0x0013, 0x004e }, + { 0x0013, 0x004f }, + { 0x0013, 0x0050 }, + { 0x0013, 0x0051 }, + { 0x0013, 0x0052 }, + { 0x0013, 0x0053 }, + { 0x0013, 0x0054 }, + { 0x000b, 0x000b }, + { 0x000b, 0x000c }, + { 0x000b, 0x000d }, + { 0x000c, 0x000d }, + { 0x000d, 0x0012 }, + { 0x000e, 0x0018 }, + { 0x0010, 0x0044 }, + { 0x0013, 0x0055 }, + { 0x0013, 0x0056 }, + { 0x0013, 0x0057 }, + { 0x0013, 0x0058 }, + { 0x0013, 0x0059 }, + { 0x0013, 0x005a }, + { 0x0013, 0x005b }, + { 0x0013, 0x005c }, + { 0x0013, 0x005d }, + { 0x0013, 0x005e }, + { 0x0013, 0x005f }, + { 0x0013, 0x0060 }, + { 0x0013, 0x0061 }, + { 0x0013, 0x0062 }, + { 0x0013, 0x0063 }, + { 0x0013, 0x0064 }, + { 0x0013, 0x0065 }, + { 0x000e, 0x0019 }, + { 0x000d, 0x0013 }, + { 0x000d, 0x0014 }, + { 0x000d, 0x0015 }, + { 0x000f, 0x002b }, + { 0x0010, 0x0045 }, + { 0x0013, 0x0066 }, + { 0x0012, 0x00fa }, + { 0x0013, 0x0067 }, + { 0x0013, 0x0068 }, + { 0x0013, 0x0069 }, + { 0x0013, 0x006a }, + { 0x0013, 0x006b }, + { 0x0013, 0x006c }, + { 0x0013, 0x006d }, + { 0x0013, 0x006e }, + { 0x0013, 0x006f }, + { 0x0013, 0x0070 }, + { 0x0013, 0x0071 }, + { 0x0013, 0x0072 }, + { 0x0013, 0x0073 }, + { 0x0013, 0x0074 }, + { 0x0013, 0x0075 }, + { 0x0013, 0x0076 }, + { 0x0010, 0x0046 }, + { 0x000f, 0x002c }, + { 0x000f, 0x002d }, + { 0x0010, 0x0047 }, + { 0x0011, 0x0080 }, + { 0x0013, 0x0077 }, + { 0x0013, 0x0078 }, + { 0x0013, 0x0079 }, + { 0x0013, 0x007a }, + { 0x0013, 0x007b }, + { 0x0013, 0x007c }, + { 0x0013, 0x007d }, + { 0x0013, 0x007e }, + { 0x0013, 0x007f }, + { 0x0013, 0x0080 }, + { 0x0013, 0x0081 }, + { 0x0013, 0x0082 }, + { 0x0013, 0x0083 }, + { 0x0013, 0x0084 }, + { 0x0013, 0x0085 }, + { 0x0013, 0x0086 }, + { 0x0013, 0x0087 }, + { 0x0013, 0x0088 }, + { 0x0013, 0x0089 }, + { 0x0013, 0x008a }, + { 0x0010, 0x0048 }, + { 0x0010, 0x0049 }, + { 0x0011, 0x0081 }, + { 0x0013, 0x008b }, + { 0x0012, 0x00fb }, + { 0x0013, 0x008c }, + { 0x0013, 0x008d }, + { 0x0013, 0x008e }, + { 0x0013, 0x008f }, + { 0x0013, 0x0090 }, + { 0x0013, 0x0091 }, + { 0x0013, 0x0092 }, + { 0x0013, 0x0093 }, + { 0x0013, 0x0094 }, + { 0x0013, 0x0095 }, + { 0x0013, 0x0096 }, + { 0x0013, 0x0097 }, + { 0x0013, 0x0098 }, + { 0x0013, 0x0099 }, + { 0x0013, 0x009a }, + { 0x0013, 0x009b }, + { 0x0013, 0x009c }, + { 0x0013, 0x009d }, + { 0x0013, 0x009e }, + { 0x0013, 0x009f }, + { 0x0013, 0x00a0 }, + { 0x0012, 0x00fc }, + { 0x0013, 0x00a1 }, + { 0x0013, 0x00a2 }, + { 0x0013, 0x00a3 }, + { 0x0013, 0x00a4 }, + { 0x0013, 0x00a5 }, + { 0x0013, 0x00a6 }, + { 0x0013, 0x00a7 }, + { 0x0013, 0x00a8 }, + { 0x0013, 0x00a9 }, + { 0x0013, 0x00aa }, + { 0x0013, 0x00ab }, + { 0x0013, 0x00ac }, + { 0x0013, 0x00ad }, + { 0x0013, 0x00ae }, + { 0x0013, 0x00af }, + { 0x0013, 0x00b0 }, + { 0x0013, 0x00b1 }, + { 0x0013, 0x00b2 }, + { 0x0013, 0x00b3 }, + { 0x0013, 0x00b4 }, + { 0x0013, 0x00b5 }, + { 0x0013, 0x00b6 }, + { 0x0013, 0x00b7 }, + { 0x0013, 0x00b8 }, + { 0x0013, 0x00b9 }, + { 0x0013, 0x00ba }, + { 0x0013, 0x00bb }, + { 0x0013, 0x00bc }, + { 0x0013, 0x00bd }, + { 0x0013, 0x00be }, + { 0x0013, 0x00bf }, + { 0x0013, 0x00c0 }, + { 0x0013, 0x00c1 }, + { 0x0013, 0x00c2 }, + { 0x0013, 0x00c3 }, + { 0x0013, 0x00c4 }, + { 0x0013, 0x00c5 }, + { 0x0013, 0x00c6 }, + { 0x0013, 0x00c7 }, + { 0x0013, 0x00c8 }, + { 0x0013, 0x00c9 }, + { 0x0013, 0x00ca }, + { 0x0013, 0x00cb }, + { 0x0013, 0x00cc }, + { 0x0013, 0x00cd }, + { 0x0013, 0x00ce }, + { 0x0013, 0x00cf }, + { 0x0013, 0x00d0 }, + { 0x0013, 0x00d1 }, + { 0x0013, 0x00d2 }, + { 0x0013, 0x00d3 }, + { 0x0013, 0x00d4 }, + { 0x0013, 0x00d5 }, + { 0x0013, 0x00d6 }, + { 0x0013, 0x00d7 }, + { 0x0013, 0x00d8 }, + { 0x0013, 0x00d9 }, + { 0x0013, 0x00da }, + { 0x0013, 0x00db }, + { 0x0013, 0x00dc }, + { 0x0013, 0x00dd }, + { 0x0013, 0x00de }, + { 0x0013, 0x00df }, + { 0x0013, 0x00e0 }, + { 0x0013, 0x00e1 }, + { 0x0013, 0x00e2 }, + { 0x0013, 0x00e3 }, + { 0x0013, 0x00e4 }, + { 0x0013, 0x00e5 }, + { 0x0013, 0x00e6 }, + { 0x0013, 0x00e7 }, + { 0x0013, 0x00e8 }, + { 0x0013, 0x00e9 }, + { 0x0013, 0x00ea }, + { 0x0013, 0x00eb }, + { 0x0013, 0x00ec }, + { 0x0013, 0x00ed }, + { 0x0013, 0x00ee }, + { 0x0013, 0x00ef }, + { 0x0013, 0x00f0 }, + { 0x0013, 0x00f1 }, + { 0x0013, 0x00f2 }, + { 0x0013, 0x00f3 }, + { 0x0013, 0x00f4 }, + { 0x0013, 0x00f5 }, + { 0x0013, 0x00f6 }, + { 0x0013, 0x00f7 }, + { 0x0013, 0x00f8 }, + { 0x0013, 0x00f9 }, + { 0x0013, 0x00fa }, + { 0x0013, 0x00fb }, + { 0x0013, 0x00fc }, + { 0x0013, 0x00fd }, + { 0x0013, 0x00fe }, + { 0x0013, 0x00ff }, + { 0x0013, 0x0100 }, + { 0x0013, 0x0101 }, + { 0x0013, 0x0102 }, + { 0x0013, 0x0103 }, + { 0x0013, 0x0104 }, + { 0x0013, 0x0105 }, + { 0x0013, 0x0106 }, + { 0x0013, 0x0107 }, + { 0x0013, 0x0108 }, + { 0x0013, 0x0109 }, + { 0x0013, 0x010a }, + { 0x0013, 0x010b }, + { 0x0013, 0x010c }, + { 0x0013, 0x010d }, + { 0x0013, 0x010e }, + { 0x0013, 0x010f }, + { 0x0013, 0x0110 }, + { 0x0013, 0x0111 }, + { 0x0013, 0x0112 }, + { 0x0013, 0x0113 }, + { 0x0013, 0x0114 }, + { 0x0013, 0x0115 }, + { 0x0013, 0x0116 }, + { 0x0013, 0x0117 }, + { 0x0013, 0x0118 }, + { 0x0013, 0x0119 }, + { 0x0013, 0x011a }, + { 0x0013, 0x011b }, + { 0x0013, 0x011c }, + { 0x0013, 0x011d }, + { 0x0013, 0x011e }, + { 0x0013, 0x011f }, + { 0x0013, 0x0120 }, + { 0x0013, 0x0121 }, + { 0x0013, 0x0122 }, + { 0x0013, 0x0123 }, + { 0x0013, 0x0124 }, + { 0x0013, 0x0125 }, + { 0x0013, 0x0126 }, + { 0x0013, 0x0127 }, + { 0x0013, 0x0128 }, + { 0x0013, 0x0129 }, + { 0x0013, 0x012a }, + { 0x0013, 0x012b }, + { 0x0013, 0x012c }, + { 0x0013, 0x012d }, + { 0x0013, 0x012e }, + { 0x0013, 0x012f }, + { 0x0013, 0x0130 }, + { 0x0013, 0x0131 }, + { 0x0013, 0x0132 }, + { 0x0013, 0x0133 }, + { 0x0013, 0x0134 }, + { 0x0013, 0x0135 }, + { 0x0013, 0x0136 }, + { 0x0013, 0x0137 }, + { 0x0013, 0x0138 }, + { 0x0013, 0x0139 }, + { 0x0013, 0x013a }, + { 0x0013, 0x013b }, + { 0x0013, 0x013c }, + { 0x0013, 0x013d }, + { 0x0013, 0x013e }, + { 0x0013, 0x013f }, + { 0x0013, 0x0140 }, + { 0x0013, 0x0141 }, + { 0x0013, 0x0142 }, + { 0x0013, 0x0143 }, + { 0x0013, 0x0144 }, + { 0x0013, 0x0145 }, + { 0x0013, 0x0146 }, + { 0x0013, 0x0147 }, + { 0x0013, 0x0148 }, + { 0x0013, 0x0149 }, + { 0x0013, 0x014a }, + { 0x0013, 0x014b }, + { 0x0013, 0x014c }, + { 0x0013, 0x014d }, + { 0x0013, 0x014e }, + { 0x0013, 0x014f }, + { 0x0013, 0x0150 }, + { 0x0013, 0x0151 }, + { 0x0013, 0x0152 }, + { 0x0013, 0x0153 }, + { 0x0013, 0x0154 }, + { 0x0013, 0x0155 }, + { 0x0013, 0x0156 }, + { 0x0013, 0x0157 }, + { 0x0013, 0x0158 }, + { 0x0013, 0x0159 }, + { 0x0013, 0x015a }, + { 0x0013, 0x015b }, + { 0x0013, 0x015c }, + { 0x0013, 0x015d }, + { 0x0013, 0x015e }, + { 0x0013, 0x015f }, + { 0x0013, 0x0160 }, + { 0x0013, 0x0161 }, + { 0x0013, 0x0162 }, + { 0x0013, 0x0163 }, + { 0x0013, 0x0164 }, + { 0x0013, 0x0165 }, + { 0x0013, 0x0166 }, + { 0x0013, 0x0167 }, + { 0x0013, 0x0168 }, + { 0x0013, 0x0169 }, + { 0x0013, 0x016a }, + { 0x0013, 0x016b }, + { 0x0013, 0x016c }, + { 0x0013, 0x016d }, + { 0x0013, 0x016e }, + { 0x0013, 0x016f }, + { 0x0013, 0x0170 }, + { 0x0013, 0x0171 }, + { 0x0013, 0x0172 }, + { 0x0013, 0x0173 }, + { 0x0013, 0x0174 }, + { 0x0013, 0x0175 }, + { 0x0013, 0x0176 }, + { 0x0013, 0x0177 }, + { 0x0013, 0x0178 }, + { 0x0013, 0x0179 }, + { 0x0013, 0x017a }, + { 0x0013, 0x017b }, + { 0x0013, 0x017c }, + { 0x0013, 0x017d }, + { 0x0013, 0x017e }, + { 0x0013, 0x017f }, + { 0x0013, 0x0180 }, + { 0x0013, 0x0181 }, + { 0x0013, 0x0182 }, + { 0x0013, 0x0183 }, + { 0x0013, 0x0184 }, + { 0x0013, 0x0185 }, + { 0x0013, 0x0186 }, + { 0x0013, 0x0187 }, + { 0x0013, 0x0188 }, + { 0x0013, 0x0189 }, + { 0x0013, 0x018a }, + { 0x0013, 0x018b }, + { 0x0013, 0x018c }, + { 0x0013, 0x018d }, + { 0x0013, 0x018e }, + { 0x0013, 0x018f }, + { 0x0013, 0x0190 }, + { 0x0013, 0x0191 }, + { 0x0013, 0x0192 }, + { 0x0013, 0x0193 }, + { 0x0013, 0x0194 }, + { 0x0013, 0x0195 }, + { 0x0013, 0x0196 }, + { 0x0013, 0x0197 }, + { 0x0013, 0x0198 }, + { 0x0013, 0x0199 }, + { 0x0013, 0x019a }, + { 0x0013, 0x019b }, + { 0x0013, 0x019c }, + { 0x0013, 0x019d }, + { 0x0013, 0x019e }, + { 0x0013, 0x019f }, + { 0x0013, 0x01a0 }, + { 0x0013, 0x01a1 }, + { 0x0013, 0x01a2 }, + { 0x0013, 0x01a3 }, + { 0x0013, 0x01a4 }, + { 0x0013, 0x01a5 }, + { 0x0013, 0x01a6 }, + { 0x0013, 0x01a7 }, + { 0x0013, 0x01a8 }, + { 0x0013, 0x01a9 }, + { 0x0013, 0x01aa }, + { 0x0013, 0x01ab }, + { 0x0013, 0x01ac }, + { 0x0013, 0x01ad }, + { 0x0013, 0x01ae }, + { 0x0013, 0x01af }, + { 0x0013, 0x01b0 }, + { 0x0013, 0x01b1 }, + { 0x0013, 0x01b2 }, + { 0x0013, 0x01b3 }, + { 0x0013, 0x01b4 }, + { 0x0013, 0x01b5 }, + { 0x0013, 0x01b6 }, + { 0x0013, 0x01b7 }, + { 0x0013, 0x01b8 }, + { 0x0013, 0x01b9 }, + { 0x0013, 0x01ba }, + { 0x0013, 0x01bb }, + { 0x0013, 0x01bc }, + { 0x0013, 0x01bd }, + { 0x0013, 0x01be }, + { 0x0013, 0x01bf }, + { 0x0013, 0x01c0 }, + { 0x0013, 0x01c1 }, + { 0x0013, 0x01c2 }, + { 0x0013, 0x01c3 }, + { 0x0013, 0x01c4 }, + { 0x0013, 0x01c5 }, + { 0x0013, 0x01c6 }, + { 0x0013, 0x01c7 }, + { 0x0013, 0x01c8 }, + { 0x0013, 0x01c9 }, + { 0x0013, 0x01ca }, + { 0x0013, 0x01cb }, + { 0x0013, 0x01cc }, + { 0x0013, 0x01cd }, + { 0x0013, 0x01ce }, + { 0x0013, 0x01cf }, + { 0x0013, 0x01d0 }, + { 0x0013, 0x01d1 }, + { 0x0013, 0x01d2 }, + { 0x0013, 0x01d3 }, + { 0x0013, 0x01d4 }, + { 0x0013, 0x01d5 }, + { 0x0013, 0x01d6 }, + { 0x0013, 0x01d7 }, + { 0x0013, 0x01d8 }, + { 0x0013, 0x01d9 }, + { 0x0013, 0x01da }, + { 0x0013, 0x01db }, + { 0x0013, 0x01dc }, + { 0x0013, 0x01dd }, + { 0x0013, 0x01de }, + { 0x0013, 0x01df }, + { 0x0013, 0x01e0 }, + { 0x0013, 0x01e1 }, + { 0x0013, 0x01e2 }, + { 0x0013, 0x01e3 }, + { 0x0013, 0x01e4 }, + { 0x0013, 0x01e5 }, + { 0x0013, 0x01e6 }, + { 0x0013, 0x01e7 }, + { 0x0013, 0x01e8 }, + { 0x0013, 0x01e9 }, + { 0x0013, 0x01ea }, + { 0x0013, 0x01eb }, + { 0x0012, 0x00fd }, +}; + +const UWord16 c_aauiLCLDHuffEnc48[729][2] = { + { 0x0002, 0x0003 }, + { 0x0003, 0x0003 }, + { 0x0005, 0x0006 }, + { 0x0006, 0x0006 }, + { 0x0008, 0x0006 }, + { 0x0009, 0x0007 }, + { 0x000b, 0x000b }, + { 0x000c, 0x000d }, + { 0x000f, 0x0030 }, + { 0x0010, 0x0055 }, + { 0x0012, 0x0136 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0013, 0x000a }, + { 0x0013, 0x000b }, + { 0x0013, 0x000c }, + { 0x0013, 0x000d }, + { 0x0013, 0x000e }, + { 0x0013, 0x000f }, + { 0x0003, 0x0004 }, + { 0x0003, 0x0005 }, + { 0x0005, 0x0007 }, + { 0x0006, 0x0007 }, + { 0x0007, 0x0007 }, + { 0x0008, 0x0007 }, + { 0x000a, 0x0008 }, + { 0x000c, 0x000e }, + { 0x000d, 0x0012 }, + { 0x000f, 0x0031 }, + { 0x0011, 0x00a0 }, + { 0x0013, 0x0010 }, + { 0x0013, 0x0011 }, + { 0x0013, 0x0012 }, + { 0x0013, 0x0013 }, + { 0x0013, 0x0014 }, + { 0x0013, 0x0015 }, + { 0x0013, 0x0016 }, + { 0x0013, 0x0017 }, + { 0x0013, 0x0018 }, + { 0x0013, 0x0019 }, + { 0x0013, 0x001a }, + { 0x0013, 0x001b }, + { 0x0013, 0x001c }, + { 0x0013, 0x001d }, + { 0x0013, 0x001e }, + { 0x0013, 0x001f }, + { 0x0005, 0x0008 }, + { 0x0004, 0x0005 }, + { 0x0005, 0x0009 }, + { 0x0006, 0x0008 }, + { 0x0007, 0x0008 }, + { 0x0008, 0x0008 }, + { 0x000a, 0x0009 }, + { 0x000c, 0x000f }, + { 0x000d, 0x0013 }, + { 0x000f, 0x0032 }, + { 0x0011, 0x00a1 }, + { 0x0013, 0x0020 }, + { 0x0013, 0x0021 }, + { 0x0013, 0x0022 }, + { 0x0013, 0x0023 }, + { 0x0013, 0x0024 }, + { 0x0013, 0x0025 }, + { 0x0013, 0x0026 }, + { 0x0013, 0x0027 }, + { 0x0013, 0x0028 }, + { 0x0013, 0x0029 }, + { 0x0013, 0x002a }, + { 0x0013, 0x002b }, + { 0x0013, 0x002c }, + { 0x0013, 0x002d }, + { 0x0013, 0x002e }, + { 0x0013, 0x002f }, + { 0x0006, 0x0009 }, + { 0x0006, 0x000a }, + { 0x0006, 0x000b }, + { 0x0007, 0x0009 }, + { 0x0008, 0x0009 }, + { 0x0009, 0x0008 }, + { 0x000b, 0x000c }, + { 0x000d, 0x0014 }, + { 0x000e, 0x001d }, + { 0x000f, 0x0033 }, + { 0x0012, 0x0137 }, + { 0x0013, 0x0030 }, + { 0x0013, 0x0031 }, + { 0x0013, 0x0032 }, + { 0x0013, 0x0033 }, + { 0x0013, 0x0034 }, + { 0x0013, 0x0035 }, + { 0x0013, 0x0036 }, + { 0x0013, 0x0037 }, + { 0x0013, 0x0038 }, + { 0x0013, 0x0039 }, + { 0x0013, 0x003a }, + { 0x0013, 0x003b }, + { 0x0013, 0x003c }, + { 0x0013, 0x003d }, + { 0x0013, 0x003e }, + { 0x0013, 0x003f }, + { 0x0008, 0x000a }, + { 0x0007, 0x000a }, + { 0x0007, 0x000b }, + { 0x0008, 0x000b }, + { 0x0009, 0x0009 }, + { 0x000a, 0x000a }, + { 0x000c, 0x0010 }, + { 0x000d, 0x0015 }, + { 0x000f, 0x0034 }, + { 0x0010, 0x0056 }, + { 0x0012, 0x0138 }, + { 0x0013, 0x0040 }, + { 0x0013, 0x0041 }, + { 0x0013, 0x0042 }, + { 0x0013, 0x0043 }, + { 0x0013, 0x0044 }, + { 0x0013, 0x0045 }, + { 0x0013, 0x0046 }, + { 0x0013, 0x0047 }, + { 0x0013, 0x0048 }, + { 0x0013, 0x0049 }, + { 0x0013, 0x004a }, + { 0x0013, 0x004b }, + { 0x0013, 0x004c }, + { 0x0013, 0x004d }, + { 0x0013, 0x004e }, + { 0x0013, 0x004f }, + { 0x0009, 0x000a }, + { 0x0008, 0x000c }, + { 0x0008, 0x000d }, + { 0x0009, 0x000b }, + { 0x000a, 0x000b }, + { 0x000c, 0x0011 }, + { 0x000d, 0x0016 }, + { 0x000e, 0x001e }, + { 0x0010, 0x0057 }, + { 0x0011, 0x00a2 }, + { 0x0011, 0x00a3 }, + { 0x0013, 0x0050 }, + { 0x0013, 0x0051 }, + { 0x0013, 0x0052 }, + { 0x0013, 0x0053 }, + { 0x0013, 0x0054 }, + { 0x0013, 0x0055 }, + { 0x0013, 0x0056 }, + { 0x0013, 0x0057 }, + { 0x0013, 0x0058 }, + { 0x0013, 0x0059 }, + { 0x0013, 0x005a }, + { 0x0013, 0x005b }, + { 0x0013, 0x005c }, + { 0x0013, 0x005d }, + { 0x0013, 0x005e }, + { 0x0013, 0x005f }, + { 0x000b, 0x000d }, + { 0x000a, 0x000c }, + { 0x000a, 0x000d }, + { 0x000b, 0x000e }, + { 0x000c, 0x0012 }, + { 0x000d, 0x0017 }, + { 0x000e, 0x001f }, + { 0x0010, 0x0058 }, + { 0x0012, 0x0139 }, + { 0x0011, 0x00a4 }, + { 0x0012, 0x013a }, + { 0x0013, 0x0060 }, + { 0x0013, 0x0061 }, + { 0x0013, 0x0062 }, + { 0x0013, 0x0063 }, + { 0x0013, 0x0064 }, + { 0x0013, 0x0065 }, + { 0x0013, 0x0066 }, + { 0x0013, 0x0067 }, + { 0x0013, 0x0068 }, + { 0x0013, 0x0069 }, + { 0x0013, 0x006a }, + { 0x0013, 0x006b }, + { 0x0013, 0x006c }, + { 0x0013, 0x006d }, + { 0x0013, 0x006e }, + { 0x0013, 0x006f }, + { 0x000c, 0x0013 }, + { 0x000b, 0x000f }, + { 0x000c, 0x0014 }, + { 0x000c, 0x0015 }, + { 0x000d, 0x0018 }, + { 0x000e, 0x0020 }, + { 0x000f, 0x0035 }, + { 0x0012, 0x013b }, + { 0x0013, 0x0070 }, + { 0x0013, 0x0071 }, + { 0x0013, 0x0072 }, + { 0x0013, 0x0073 }, + { 0x0013, 0x0074 }, + { 0x0013, 0x0075 }, + { 0x0013, 0x0076 }, + { 0x0013, 0x0077 }, + { 0x0013, 0x0078 }, + { 0x0013, 0x0079 }, + { 0x0013, 0x007a }, + { 0x0013, 0x007b }, + { 0x0013, 0x007c }, + { 0x0013, 0x007d }, + { 0x0013, 0x007e }, + { 0x0013, 0x007f }, + { 0x0013, 0x0080 }, + { 0x0013, 0x0081 }, + { 0x0013, 0x0082 }, + { 0x000e, 0x0021 }, + { 0x000d, 0x0019 }, + { 0x000e, 0x0022 }, + { 0x000e, 0x0023 }, + { 0x000f, 0x0036 }, + { 0x0010, 0x0059 }, + { 0x0011, 0x00a5 }, + { 0x0013, 0x0083 }, + { 0x0011, 0x00a6 }, + { 0x0012, 0x013c }, + { 0x0013, 0x0084 }, + { 0x0013, 0x0085 }, + { 0x0013, 0x0086 }, + { 0x0013, 0x0087 }, + { 0x0013, 0x0088 }, + { 0x0013, 0x0089 }, + { 0x0013, 0x008a }, + { 0x0013, 0x008b }, + { 0x0013, 0x008c }, + { 0x0013, 0x008d }, + { 0x0013, 0x008e }, + { 0x0013, 0x008f }, + { 0x0013, 0x0090 }, + { 0x0013, 0x0091 }, + { 0x0013, 0x0092 }, + { 0x0013, 0x0093 }, + { 0x0013, 0x0094 }, + { 0x0010, 0x005a }, + { 0x000f, 0x0037 }, + { 0x000f, 0x0038 }, + { 0x000f, 0x0039 }, + { 0x0010, 0x005b }, + { 0x0010, 0x005c }, + { 0x0013, 0x0095 }, + { 0x0011, 0x00a7 }, + { 0x0013, 0x0096 }, + { 0x0013, 0x0097 }, + { 0x0013, 0x0098 }, + { 0x0013, 0x0099 }, + { 0x0013, 0x009a }, + { 0x0013, 0x009b }, + { 0x0013, 0x009c }, + { 0x0013, 0x009d }, + { 0x0013, 0x009e }, + { 0x0013, 0x009f }, + { 0x0013, 0x00a0 }, + { 0x0013, 0x00a1 }, + { 0x0013, 0x00a2 }, + { 0x0013, 0x00a3 }, + { 0x0013, 0x00a4 }, + { 0x0013, 0x00a5 }, + { 0x0013, 0x00a6 }, + { 0x0013, 0x00a7 }, + { 0x0013, 0x00a8 }, + { 0x0010, 0x005d }, + { 0x0010, 0x005e }, + { 0x0013, 0x00a9 }, + { 0x0010, 0x005f }, + { 0x0013, 0x00aa }, + { 0x0012, 0x013d }, + { 0x0013, 0x00ab }, + { 0x0013, 0x00ac }, + { 0x0013, 0x00ad }, + { 0x0013, 0x00ae }, + { 0x0013, 0x00af }, + { 0x0013, 0x00b0 }, + { 0x0013, 0x00b1 }, + { 0x0013, 0x00b2 }, + { 0x0013, 0x00b3 }, + { 0x0013, 0x00b4 }, + { 0x0013, 0x00b5 }, + { 0x0013, 0x00b6 }, + { 0x0013, 0x00b7 }, + { 0x0013, 0x00b8 }, + { 0x0013, 0x00b9 }, + { 0x0013, 0x00ba }, + { 0x0013, 0x00bb }, + { 0x0013, 0x00bc }, + { 0x0013, 0x00bd }, + { 0x0013, 0x00be }, + { 0x0013, 0x00bf }, + { 0x0013, 0x00c0 }, + { 0x0011, 0x00a8 }, + { 0x0013, 0x00c1 }, + { 0x0011, 0x00a9 }, + { 0x0013, 0x00c2 }, + { 0x0013, 0x00c3 }, + { 0x0013, 0x00c4 }, + { 0x0013, 0x00c5 }, + { 0x0013, 0x00c6 }, + { 0x0013, 0x00c7 }, + { 0x0013, 0x00c8 }, + { 0x0013, 0x00c9 }, + { 0x0013, 0x00ca }, + { 0x0013, 0x00cb }, + { 0x0013, 0x00cc }, + { 0x0013, 0x00cd }, + { 0x0013, 0x00ce }, + { 0x0013, 0x00cf }, + { 0x0013, 0x00d0 }, + { 0x0013, 0x00d1 }, + { 0x0013, 0x00d2 }, + { 0x0013, 0x00d3 }, + { 0x0013, 0x00d4 }, + { 0x0013, 0x00d5 }, + { 0x0013, 0x00d6 }, + { 0x0013, 0x00d7 }, + { 0x0013, 0x00d8 }, + { 0x0013, 0x00d9 }, + { 0x0013, 0x00da }, + { 0x0012, 0x013e }, + { 0x0013, 0x00db }, + { 0x0013, 0x00dc }, + { 0x0013, 0x00dd }, + { 0x0013, 0x00de }, + { 0x0013, 0x00df }, + { 0x0013, 0x00e0 }, + { 0x0013, 0x00e1 }, + { 0x0013, 0x00e2 }, + { 0x0013, 0x00e3 }, + { 0x0013, 0x00e4 }, + { 0x0013, 0x00e5 }, + { 0x0013, 0x00e6 }, + { 0x0013, 0x00e7 }, + { 0x0013, 0x00e8 }, + { 0x0013, 0x00e9 }, + { 0x0013, 0x00ea }, + { 0x0013, 0x00eb }, + { 0x0013, 0x00ec }, + { 0x0013, 0x00ed }, + { 0x0013, 0x00ee }, + { 0x0013, 0x00ef }, + { 0x0013, 0x00f0 }, + { 0x0013, 0x00f1 }, + { 0x0013, 0x00f2 }, + { 0x0013, 0x00f3 }, + { 0x0013, 0x00f4 }, + { 0x0013, 0x00f5 }, + { 0x0013, 0x00f6 }, + { 0x0013, 0x00f7 }, + { 0x0013, 0x00f8 }, + { 0x0013, 0x00f9 }, + { 0x0013, 0x00fa }, + { 0x0013, 0x00fb }, + { 0x0013, 0x00fc }, + { 0x0013, 0x00fd }, + { 0x0013, 0x00fe }, + { 0x0013, 0x00ff }, + { 0x0013, 0x0100 }, + { 0x0013, 0x0101 }, + { 0x0013, 0x0102 }, + { 0x0013, 0x0103 }, + { 0x0013, 0x0104 }, + { 0x0013, 0x0105 }, + { 0x0013, 0x0106 }, + { 0x0013, 0x0107 }, + { 0x0013, 0x0108 }, + { 0x0013, 0x0109 }, + { 0x0013, 0x010a }, + { 0x0013, 0x010b }, + { 0x0013, 0x010c }, + { 0x0013, 0x010d }, + { 0x0013, 0x010e }, + { 0x0013, 0x010f }, + { 0x0013, 0x0110 }, + { 0x0013, 0x0111 }, + { 0x0013, 0x0112 }, + { 0x0013, 0x0113 }, + { 0x0013, 0x0114 }, + { 0x0013, 0x0115 }, + { 0x0013, 0x0116 }, + { 0x0013, 0x0117 }, + { 0x0013, 0x0118 }, + { 0x0013, 0x0119 }, + { 0x0013, 0x011a }, + { 0x0013, 0x011b }, + { 0x0013, 0x011c }, + { 0x0013, 0x011d }, + { 0x0013, 0x011e }, + { 0x0013, 0x011f }, + { 0x0013, 0x0120 }, + { 0x0013, 0x0121 }, + { 0x0013, 0x0122 }, + { 0x0013, 0x0123 }, + { 0x0013, 0x0124 }, + { 0x0013, 0x0125 }, + { 0x0013, 0x0126 }, + { 0x0013, 0x0127 }, + { 0x0013, 0x0128 }, + { 0x0013, 0x0129 }, + { 0x0013, 0x012a }, + { 0x0013, 0x012b }, + { 0x0013, 0x012c }, + { 0x0013, 0x012d }, + { 0x0013, 0x012e }, + { 0x0013, 0x012f }, + { 0x0013, 0x0130 }, + { 0x0013, 0x0131 }, + { 0x0013, 0x0132 }, + { 0x0013, 0x0133 }, + { 0x0013, 0x0134 }, + { 0x0013, 0x0135 }, + { 0x0013, 0x0136 }, + { 0x0013, 0x0137 }, + { 0x0013, 0x0138 }, + { 0x0013, 0x0139 }, + { 0x0013, 0x013a }, + { 0x0013, 0x013b }, + { 0x0013, 0x013c }, + { 0x0013, 0x013d }, + { 0x0013, 0x013e }, + { 0x0013, 0x013f }, + { 0x0013, 0x0140 }, + { 0x0013, 0x0141 }, + { 0x0013, 0x0142 }, + { 0x0013, 0x0143 }, + { 0x0013, 0x0144 }, + { 0x0013, 0x0145 }, + { 0x0013, 0x0146 }, + { 0x0013, 0x0147 }, + { 0x0013, 0x0148 }, + { 0x0013, 0x0149 }, + { 0x0013, 0x014a }, + { 0x0013, 0x014b }, + { 0x0013, 0x014c }, + { 0x0013, 0x014d }, + { 0x0013, 0x014e }, + { 0x0013, 0x014f }, + { 0x0013, 0x0150 }, + { 0x0013, 0x0151 }, + { 0x0013, 0x0152 }, + { 0x0013, 0x0153 }, + { 0x0013, 0x0154 }, + { 0x0013, 0x0155 }, + { 0x0013, 0x0156 }, + { 0x0013, 0x0157 }, + { 0x0013, 0x0158 }, + { 0x0013, 0x0159 }, + { 0x0013, 0x015a }, + { 0x0013, 0x015b }, + { 0x0013, 0x015c }, + { 0x0013, 0x015d }, + { 0x0013, 0x015e }, + { 0x0013, 0x015f }, + { 0x0013, 0x0160 }, + { 0x0013, 0x0161 }, + { 0x0013, 0x0162 }, + { 0x0013, 0x0163 }, + { 0x0013, 0x0164 }, + { 0x0013, 0x0165 }, + { 0x0013, 0x0166 }, + { 0x0013, 0x0167 }, + { 0x0013, 0x0168 }, + { 0x0013, 0x0169 }, + { 0x0013, 0x016a }, + { 0x0013, 0x016b }, + { 0x0013, 0x016c }, + { 0x0013, 0x016d }, + { 0x0013, 0x016e }, + { 0x0013, 0x016f }, + { 0x0013, 0x0170 }, + { 0x0013, 0x0171 }, + { 0x0013, 0x0172 }, + { 0x0013, 0x0173 }, + { 0x0013, 0x0174 }, + { 0x0013, 0x0175 }, + { 0x0013, 0x0176 }, + { 0x0013, 0x0177 }, + { 0x0013, 0x0178 }, + { 0x0013, 0x0179 }, + { 0x0013, 0x017a }, + { 0x0013, 0x017b }, + { 0x0013, 0x017c }, + { 0x0013, 0x017d }, + { 0x0013, 0x017e }, + { 0x0013, 0x017f }, + { 0x0013, 0x0180 }, + { 0x0013, 0x0181 }, + { 0x0013, 0x0182 }, + { 0x0013, 0x0183 }, + { 0x0013, 0x0184 }, + { 0x0013, 0x0185 }, + { 0x0013, 0x0186 }, + { 0x0013, 0x0187 }, + { 0x0013, 0x0188 }, + { 0x0013, 0x0189 }, + { 0x0013, 0x018a }, + { 0x0013, 0x018b }, + { 0x0013, 0x018c }, + { 0x0013, 0x018d }, + { 0x0013, 0x018e }, + { 0x0013, 0x018f }, + { 0x0013, 0x0190 }, + { 0x0013, 0x0191 }, + { 0x0013, 0x0192 }, + { 0x0013, 0x0193 }, + { 0x0013, 0x0194 }, + { 0x0013, 0x0195 }, + { 0x0013, 0x0196 }, + { 0x0013, 0x0197 }, + { 0x0013, 0x0198 }, + { 0x0013, 0x0199 }, + { 0x0013, 0x019a }, + { 0x0013, 0x019b }, + { 0x0013, 0x019c }, + { 0x0013, 0x019d }, + { 0x0013, 0x019e }, + { 0x0013, 0x019f }, + { 0x0013, 0x01a0 }, + { 0x0013, 0x01a1 }, + { 0x0013, 0x01a2 }, + { 0x0013, 0x01a3 }, + { 0x0013, 0x01a4 }, + { 0x0013, 0x01a5 }, + { 0x0013, 0x01a6 }, + { 0x0013, 0x01a7 }, + { 0x0013, 0x01a8 }, + { 0x0013, 0x01a9 }, + { 0x0013, 0x01aa }, + { 0x0013, 0x01ab }, + { 0x0013, 0x01ac }, + { 0x0013, 0x01ad }, + { 0x0013, 0x01ae }, + { 0x0013, 0x01af }, + { 0x0013, 0x01b0 }, + { 0x0013, 0x01b1 }, + { 0x0013, 0x01b2 }, + { 0x0013, 0x01b3 }, + { 0x0013, 0x01b4 }, + { 0x0013, 0x01b5 }, + { 0x0013, 0x01b6 }, + { 0x0013, 0x01b7 }, + { 0x0013, 0x01b8 }, + { 0x0013, 0x01b9 }, + { 0x0013, 0x01ba }, + { 0x0013, 0x01bb }, + { 0x0013, 0x01bc }, + { 0x0013, 0x01bd }, + { 0x0013, 0x01be }, + { 0x0013, 0x01bf }, + { 0x0013, 0x01c0 }, + { 0x0013, 0x01c1 }, + { 0x0013, 0x01c2 }, + { 0x0013, 0x01c3 }, + { 0x0013, 0x01c4 }, + { 0x0013, 0x01c5 }, + { 0x0013, 0x01c6 }, + { 0x0013, 0x01c7 }, + { 0x0013, 0x01c8 }, + { 0x0013, 0x01c9 }, + { 0x0013, 0x01ca }, + { 0x0013, 0x01cb }, + { 0x0013, 0x01cc }, + { 0x0013, 0x01cd }, + { 0x0013, 0x01ce }, + { 0x0013, 0x01cf }, + { 0x0013, 0x01d0 }, + { 0x0013, 0x01d1 }, + { 0x0013, 0x01d2 }, + { 0x0013, 0x01d3 }, + { 0x0013, 0x01d4 }, + { 0x0013, 0x01d5 }, + { 0x0013, 0x01d6 }, + { 0x0013, 0x01d7 }, + { 0x0013, 0x01d8 }, + { 0x0013, 0x01d9 }, + { 0x0013, 0x01da }, + { 0x0013, 0x01db }, + { 0x0013, 0x01dc }, + { 0x0013, 0x01dd }, + { 0x0013, 0x01de }, + { 0x0013, 0x01df }, + { 0x0013, 0x01e0 }, + { 0x0013, 0x01e1 }, + { 0x0013, 0x01e2 }, + { 0x0013, 0x01e3 }, + { 0x0013, 0x01e4 }, + { 0x0013, 0x01e5 }, + { 0x0013, 0x01e6 }, + { 0x0013, 0x01e7 }, + { 0x0013, 0x01e8 }, + { 0x0013, 0x01e9 }, + { 0x0013, 0x01ea }, + { 0x0013, 0x01eb }, + { 0x0013, 0x01ec }, + { 0x0013, 0x01ed }, + { 0x0013, 0x01ee }, + { 0x0013, 0x01ef }, + { 0x0013, 0x01f0 }, + { 0x0013, 0x01f1 }, + { 0x0013, 0x01f2 }, + { 0x0013, 0x01f3 }, + { 0x0013, 0x01f4 }, + { 0x0013, 0x01f5 }, + { 0x0013, 0x01f6 }, + { 0x0013, 0x01f7 }, + { 0x0013, 0x01f8 }, + { 0x0013, 0x01f9 }, + { 0x0013, 0x01fa }, + { 0x0013, 0x01fb }, + { 0x0013, 0x01fc }, + { 0x0013, 0x01fd }, + { 0x0013, 0x01fe }, + { 0x0013, 0x01ff }, + { 0x0013, 0x0200 }, + { 0x0013, 0x0201 }, + { 0x0013, 0x0202 }, + { 0x0013, 0x0203 }, + { 0x0013, 0x0204 }, + { 0x0013, 0x0205 }, + { 0x0013, 0x0206 }, + { 0x0013, 0x0207 }, + { 0x0013, 0x0208 }, + { 0x0013, 0x0209 }, + { 0x0013, 0x020a }, + { 0x0013, 0x020b }, + { 0x0013, 0x020c }, + { 0x0013, 0x020d }, + { 0x0013, 0x020e }, + { 0x0013, 0x020f }, + { 0x0013, 0x0210 }, + { 0x0013, 0x0211 }, + { 0x0013, 0x0212 }, + { 0x0013, 0x0213 }, + { 0x0013, 0x0214 }, + { 0x0013, 0x0215 }, + { 0x0013, 0x0216 }, + { 0x0013, 0x0217 }, + { 0x0013, 0x0218 }, + { 0x0013, 0x0219 }, + { 0x0013, 0x021a }, + { 0x0013, 0x021b }, + { 0x0013, 0x021c }, + { 0x0013, 0x021d }, + { 0x0013, 0x021e }, + { 0x0013, 0x021f }, + { 0x0013, 0x0220 }, + { 0x0013, 0x0221 }, + { 0x0013, 0x0222 }, + { 0x0013, 0x0223 }, + { 0x0013, 0x0224 }, + { 0x0013, 0x0225 }, + { 0x0013, 0x0226 }, + { 0x0013, 0x0227 }, + { 0x0013, 0x0228 }, + { 0x0013, 0x0229 }, + { 0x0013, 0x022a }, + { 0x0013, 0x022b }, + { 0x0013, 0x022c }, + { 0x0013, 0x022d }, + { 0x0013, 0x022e }, + { 0x0013, 0x022f }, + { 0x0013, 0x0230 }, + { 0x0013, 0x0231 }, + { 0x0013, 0x0232 }, + { 0x0013, 0x0233 }, + { 0x0013, 0x0234 }, + { 0x0013, 0x0235 }, + { 0x0013, 0x0236 }, + { 0x0013, 0x0237 }, + { 0x0013, 0x0238 }, + { 0x0013, 0x0239 }, + { 0x0013, 0x023a }, + { 0x0013, 0x023b }, + { 0x0013, 0x023c }, + { 0x0013, 0x023d }, + { 0x0013, 0x023e }, + { 0x0013, 0x023f }, + { 0x0013, 0x0240 }, + { 0x0013, 0x0241 }, + { 0x0013, 0x0242 }, + { 0x0013, 0x0243 }, + { 0x0013, 0x0244 }, + { 0x0013, 0x0245 }, + { 0x0013, 0x0246 }, + { 0x0013, 0x0247 }, + { 0x0013, 0x0248 }, + { 0x0013, 0x0249 }, + { 0x0013, 0x024a }, + { 0x0013, 0x024b }, + { 0x0013, 0x024c }, + { 0x0013, 0x024d }, + { 0x0013, 0x024e }, + { 0x0013, 0x024f }, + { 0x0013, 0x0250 }, + { 0x0013, 0x0251 }, + { 0x0013, 0x0252 }, + { 0x0013, 0x0253 }, + { 0x0013, 0x0254 }, + { 0x0013, 0x0255 }, + { 0x0013, 0x0256 }, + { 0x0013, 0x0257 }, + { 0x0013, 0x0258 }, + { 0x0013, 0x0259 }, + { 0x0013, 0x025a }, + { 0x0013, 0x025b }, + { 0x0013, 0x025c }, + { 0x0013, 0x025d }, + { 0x0013, 0x025e }, + { 0x0013, 0x025f }, + { 0x0013, 0x0260 }, + { 0x0013, 0x0261 }, + { 0x0013, 0x0262 }, + { 0x0013, 0x0263 }, + { 0x0013, 0x0264 }, + { 0x0013, 0x0265 }, + { 0x0013, 0x0266 }, + { 0x0013, 0x0267 }, + { 0x0013, 0x0268 }, + { 0x0013, 0x0269 }, + { 0x0013, 0x026a }, + { 0x0013, 0x026b }, + { 0x0012, 0x013f }, + +}; + +const UWord16 c_aauiLCLDHuffEnc49[729][2] = { + { 0x0002, 0x0003 }, + { 0x0003, 0x0003 }, + { 0x0005, 0x0007 }, + { 0x0007, 0x000a }, + { 0x0008, 0x0009 }, + { 0x0008, 0x000a }, + { 0x0009, 0x0009 }, + { 0x000b, 0x000d }, + { 0x000d, 0x0014 }, + { 0x000d, 0x0015 }, + { 0x0010, 0x0052 }, + { 0x0011, 0x0098 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0013, 0x000a }, + { 0x0013, 0x000b }, + { 0x0013, 0x000c }, + { 0x0013, 0x000d }, + { 0x0013, 0x000e }, + { 0x0003, 0x0004 }, + { 0x0003, 0x0005 }, + { 0x0005, 0x0008 }, + { 0x0006, 0x000a }, + { 0x0007, 0x000b }, + { 0x0008, 0x000b }, + { 0x0008, 0x000c }, + { 0x000a, 0x000a }, + { 0x000b, 0x000e }, + { 0x000d, 0x0016 }, + { 0x000f, 0x0031 }, + { 0x0010, 0x0053 }, + { 0x0012, 0x012a }, + { 0x0013, 0x000f }, + { 0x0013, 0x0010 }, + { 0x0013, 0x0011 }, + { 0x0013, 0x0012 }, + { 0x0013, 0x0013 }, + { 0x0013, 0x0014 }, + { 0x0013, 0x0015 }, + { 0x0013, 0x0016 }, + { 0x0013, 0x0017 }, + { 0x0013, 0x0018 }, + { 0x0013, 0x0019 }, + { 0x0013, 0x001a }, + { 0x0013, 0x001b }, + { 0x0013, 0x001c }, + { 0x0005, 0x0009 }, + { 0x0005, 0x000a }, + { 0x0005, 0x000b }, + { 0x0006, 0x000b }, + { 0x0007, 0x000c }, + { 0x0008, 0x000d }, + { 0x0009, 0x000a }, + { 0x000a, 0x000b }, + { 0x000c, 0x000f }, + { 0x000d, 0x0017 }, + { 0x000f, 0x0032 }, + { 0x0010, 0x0054 }, + { 0x0013, 0x001d }, + { 0x0013, 0x001e }, + { 0x0013, 0x001f }, + { 0x0013, 0x0020 }, + { 0x0013, 0x0021 }, + { 0x0013, 0x0022 }, + { 0x0013, 0x0023 }, + { 0x0013, 0x0024 }, + { 0x0013, 0x0025 }, + { 0x0013, 0x0026 }, + { 0x0013, 0x0027 }, + { 0x0013, 0x0028 }, + { 0x0013, 0x0029 }, + { 0x0013, 0x002a }, + { 0x0013, 0x002b }, + { 0x0007, 0x000d }, + { 0x0006, 0x000c }, + { 0x0006, 0x000d }, + { 0x0007, 0x000e }, + { 0x0007, 0x000f }, + { 0x0008, 0x000e }, + { 0x0009, 0x000b }, + { 0x000b, 0x000f }, + { 0x000c, 0x0010 }, + { 0x000e, 0x001d }, + { 0x000f, 0x0033 }, + { 0x0011, 0x0099 }, + { 0x0013, 0x002c }, + { 0x0013, 0x002d }, + { 0x0013, 0x002e }, + { 0x0013, 0x002f }, + { 0x0013, 0x0030 }, + { 0x0013, 0x0031 }, + { 0x0013, 0x0032 }, + { 0x0013, 0x0033 }, + { 0x0013, 0x0034 }, + { 0x0013, 0x0035 }, + { 0x0013, 0x0036 }, + { 0x0013, 0x0037 }, + { 0x0013, 0x0038 }, + { 0x0013, 0x0039 }, + { 0x0013, 0x003a }, + { 0x0008, 0x000f }, + { 0x0007, 0x0010 }, + { 0x0007, 0x0011 }, + { 0x0007, 0x0012 }, + { 0x0008, 0x0010 }, + { 0x0009, 0x000c }, + { 0x000a, 0x000c }, + { 0x000c, 0x0011 }, + { 0x000d, 0x0018 }, + { 0x000e, 0x001e }, + { 0x0011, 0x009a }, + { 0x0011, 0x009b }, + { 0x0013, 0x003b }, + { 0x0013, 0x003c }, + { 0x0013, 0x003d }, + { 0x0013, 0x003e }, + { 0x0013, 0x003f }, + { 0x0013, 0x0040 }, + { 0x0013, 0x0041 }, + { 0x0013, 0x0042 }, + { 0x0013, 0x0043 }, + { 0x0013, 0x0044 }, + { 0x0013, 0x0045 }, + { 0x0013, 0x0046 }, + { 0x0013, 0x0047 }, + { 0x0013, 0x0048 }, + { 0x0013, 0x0049 }, + { 0x0008, 0x0011 }, + { 0x0007, 0x0013 }, + { 0x0008, 0x0012 }, + { 0x0008, 0x0013 }, + { 0x0009, 0x000d }, + { 0x000a, 0x000d }, + { 0x000b, 0x0010 }, + { 0x000c, 0x0012 }, + { 0x000e, 0x001f }, + { 0x000e, 0x0020 }, + { 0x0010, 0x0055 }, + { 0x0011, 0x009c }, + { 0x0013, 0x004a }, + { 0x0013, 0x004b }, + { 0x0013, 0x004c }, + { 0x0013, 0x004d }, + { 0x0013, 0x004e }, + { 0x0013, 0x004f }, + { 0x0013, 0x0050 }, + { 0x0013, 0x0051 }, + { 0x0013, 0x0052 }, + { 0x0013, 0x0053 }, + { 0x0013, 0x0054 }, + { 0x0013, 0x0055 }, + { 0x0013, 0x0056 }, + { 0x0013, 0x0057 }, + { 0x0013, 0x0058 }, + { 0x0009, 0x000e }, + { 0x0009, 0x000f }, + { 0x0009, 0x0010 }, + { 0x0009, 0x0011 }, + { 0x000a, 0x000e }, + { 0x000b, 0x0011 }, + { 0x000c, 0x0013 }, + { 0x000d, 0x0019 }, + { 0x000e, 0x0021 }, + { 0x0010, 0x0056 }, + { 0x0010, 0x0057 }, + { 0x0013, 0x0059 }, + { 0x0013, 0x005a }, + { 0x0013, 0x005b }, + { 0x0013, 0x005c }, + { 0x0013, 0x005d }, + { 0x0013, 0x005e }, + { 0x0013, 0x005f }, + { 0x0013, 0x0060 }, + { 0x0013, 0x0061 }, + { 0x0013, 0x0062 }, + { 0x0013, 0x0063 }, + { 0x0013, 0x0064 }, + { 0x0013, 0x0065 }, + { 0x0013, 0x0066 }, + { 0x0013, 0x0067 }, + { 0x0013, 0x0068 }, + { 0x000b, 0x0012 }, + { 0x000a, 0x000f }, + { 0x000a, 0x0010 }, + { 0x000a, 0x0011 }, + { 0x000c, 0x0014 }, + { 0x000c, 0x0015 }, + { 0x000d, 0x001a }, + { 0x000e, 0x0022 }, + { 0x0010, 0x0058 }, + { 0x0010, 0x0059 }, + { 0x0013, 0x0069 }, + { 0x0013, 0x006a }, + { 0x0013, 0x006b }, + { 0x0013, 0x006c }, + { 0x0013, 0x006d }, + { 0x0013, 0x006e }, + { 0x0013, 0x006f }, + { 0x0013, 0x0070 }, + { 0x0013, 0x0071 }, + { 0x0013, 0x0072 }, + { 0x0013, 0x0073 }, + { 0x0013, 0x0074 }, + { 0x0013, 0x0075 }, + { 0x0013, 0x0076 }, + { 0x0013, 0x0077 }, + { 0x0013, 0x0078 }, + { 0x0013, 0x0079 }, + { 0x000c, 0x0016 }, + { 0x000b, 0x0013 }, + { 0x000c, 0x0017 }, + { 0x000c, 0x0018 }, + { 0x000c, 0x0019 }, + { 0x000e, 0x0023 }, + { 0x000e, 0x0024 }, + { 0x000f, 0x0034 }, + { 0x0010, 0x005a }, + { 0x0011, 0x009d }, + { 0x0013, 0x007a }, + { 0x0013, 0x007b }, + { 0x0013, 0x007c }, + { 0x0013, 0x007d }, + { 0x0013, 0x007e }, + { 0x0013, 0x007f }, + { 0x0013, 0x0080 }, + { 0x0013, 0x0081 }, + { 0x0013, 0x0082 }, + { 0x0013, 0x0083 }, + { 0x0013, 0x0084 }, + { 0x0013, 0x0085 }, + { 0x0013, 0x0086 }, + { 0x0013, 0x0087 }, + { 0x0013, 0x0088 }, + { 0x0013, 0x0089 }, + { 0x0013, 0x008a }, + { 0x000e, 0x0025 }, + { 0x000d, 0x001b }, + { 0x000d, 0x001c }, + { 0x000d, 0x001d }, + { 0x000e, 0x0026 }, + { 0x000f, 0x0035 }, + { 0x0010, 0x005b }, + { 0x0011, 0x009e }, + { 0x0011, 0x009f }, + { 0x0012, 0x012b }, + { 0x0013, 0x008b }, + { 0x0013, 0x008c }, + { 0x0013, 0x008d }, + { 0x0013, 0x008e }, + { 0x0013, 0x008f }, + { 0x0013, 0x0090 }, + { 0x0013, 0x0091 }, + { 0x0013, 0x0092 }, + { 0x0013, 0x0093 }, + { 0x0013, 0x0094 }, + { 0x0013, 0x0095 }, + { 0x0013, 0x0096 }, + { 0x0013, 0x0097 }, + { 0x0013, 0x0098 }, + { 0x0013, 0x0099 }, + { 0x0013, 0x009a }, + { 0x0013, 0x009b }, + { 0x0010, 0x005c }, + { 0x000f, 0x0036 }, + { 0x000e, 0x0027 }, + { 0x000f, 0x0037 }, + { 0x000f, 0x0038 }, + { 0x0010, 0x005d }, + { 0x0011, 0x00a0 }, + { 0x0013, 0x009c }, + { 0x0012, 0x012c }, + { 0x0013, 0x009d }, + { 0x0013, 0x009e }, + { 0x0013, 0x009f }, + { 0x0013, 0x00a0 }, + { 0x0013, 0x00a1 }, + { 0x0013, 0x00a2 }, + { 0x0013, 0x00a3 }, + { 0x0013, 0x00a4 }, + { 0x0013, 0x00a5 }, + { 0x0013, 0x00a6 }, + { 0x0013, 0x00a7 }, + { 0x0013, 0x00a8 }, + { 0x0013, 0x00a9 }, + { 0x0013, 0x00aa }, + { 0x0013, 0x00ab }, + { 0x0013, 0x00ac }, + { 0x0013, 0x00ad }, + { 0x0013, 0x00ae }, + { 0x0010, 0x005e }, + { 0x000f, 0x0039 }, + { 0x0010, 0x005f }, + { 0x0010, 0x0060 }, + { 0x0011, 0x00a1 }, + { 0x0010, 0x0061 }, + { 0x0013, 0x00af }, + { 0x0013, 0x00b0 }, + { 0x0012, 0x012d }, + { 0x0013, 0x00b1 }, + { 0x0013, 0x00b2 }, + { 0x0013, 0x00b3 }, + { 0x0013, 0x00b4 }, + { 0x0013, 0x00b5 }, + { 0x0013, 0x00b6 }, + { 0x0013, 0x00b7 }, + { 0x0013, 0x00b8 }, + { 0x0013, 0x00b9 }, + { 0x0013, 0x00ba }, + { 0x0013, 0x00bb }, + { 0x0013, 0x00bc }, + { 0x0013, 0x00bd }, + { 0x0013, 0x00be }, + { 0x0013, 0x00bf }, + { 0x0013, 0x00c0 }, + { 0x0013, 0x00c1 }, + { 0x0013, 0x00c2 }, + { 0x0012, 0x012e }, + { 0x0011, 0x00a2 }, + { 0x0011, 0x00a3 }, + { 0x0013, 0x00c3 }, + { 0x0013, 0x00c4 }, + { 0x0013, 0x00c5 }, + { 0x0013, 0x00c6 }, + { 0x0013, 0x00c7 }, + { 0x0013, 0x00c8 }, + { 0x0013, 0x00c9 }, + { 0x0013, 0x00ca }, + { 0x0013, 0x00cb }, + { 0x0013, 0x00cc }, + { 0x0013, 0x00cd }, + { 0x0013, 0x00ce }, + { 0x0013, 0x00cf }, + { 0x0013, 0x00d0 }, + { 0x0013, 0x00d1 }, + { 0x0013, 0x00d2 }, + { 0x0013, 0x00d3 }, + { 0x0013, 0x00d4 }, + { 0x0013, 0x00d5 }, + { 0x0013, 0x00d6 }, + { 0x0013, 0x00d7 }, + { 0x0013, 0x00d8 }, + { 0x0013, 0x00d9 }, + { 0x0013, 0x00da }, + { 0x0013, 0x00db }, + { 0x0013, 0x00dc }, + { 0x0013, 0x00dd }, + { 0x0013, 0x00de }, + { 0x0013, 0x00df }, + { 0x0012, 0x012f }, + { 0x0013, 0x00e0 }, + { 0x0013, 0x00e1 }, + { 0x0013, 0x00e2 }, + { 0x0013, 0x00e3 }, + { 0x0013, 0x00e4 }, + { 0x0013, 0x00e5 }, + { 0x0013, 0x00e6 }, + { 0x0013, 0x00e7 }, + { 0x0013, 0x00e8 }, + { 0x0013, 0x00e9 }, + { 0x0013, 0x00ea }, + { 0x0013, 0x00eb }, + { 0x0013, 0x00ec }, + { 0x0013, 0x00ed }, + { 0x0013, 0x00ee }, + { 0x0013, 0x00ef }, + { 0x0013, 0x00f0 }, + { 0x0013, 0x00f1 }, + { 0x0013, 0x00f2 }, + { 0x0013, 0x00f3 }, + { 0x0013, 0x00f4 }, + { 0x0013, 0x00f5 }, + { 0x0013, 0x00f6 }, + { 0x0013, 0x00f7 }, + { 0x0013, 0x00f8 }, + { 0x0013, 0x00f9 }, + { 0x0013, 0x00fa }, + { 0x0013, 0x00fb }, + { 0x0013, 0x00fc }, + { 0x0013, 0x00fd }, + { 0x0013, 0x00fe }, + { 0x0013, 0x00ff }, + { 0x0013, 0x0100 }, + { 0x0013, 0x0101 }, + { 0x0013, 0x0102 }, + { 0x0013, 0x0103 }, + { 0x0013, 0x0104 }, + { 0x0013, 0x0105 }, + { 0x0013, 0x0106 }, + { 0x0013, 0x0107 }, + { 0x0013, 0x0108 }, + { 0x0013, 0x0109 }, + { 0x0013, 0x010a }, + { 0x0013, 0x010b }, + { 0x0013, 0x010c }, + { 0x0013, 0x010d }, + { 0x0013, 0x010e }, + { 0x0013, 0x010f }, + { 0x0013, 0x0110 }, + { 0x0013, 0x0111 }, + { 0x0013, 0x0112 }, + { 0x0013, 0x0113 }, + { 0x0013, 0x0114 }, + { 0x0013, 0x0115 }, + { 0x0013, 0x0116 }, + { 0x0013, 0x0117 }, + { 0x0013, 0x0118 }, + { 0x0013, 0x0119 }, + { 0x0013, 0x011a }, + { 0x0013, 0x011b }, + { 0x0013, 0x011c }, + { 0x0013, 0x011d }, + { 0x0013, 0x011e }, + { 0x0013, 0x011f }, + { 0x0013, 0x0120 }, + { 0x0013, 0x0121 }, + { 0x0013, 0x0122 }, + { 0x0013, 0x0123 }, + { 0x0013, 0x0124 }, + { 0x0013, 0x0125 }, + { 0x0013, 0x0126 }, + { 0x0013, 0x0127 }, + { 0x0013, 0x0128 }, + { 0x0013, 0x0129 }, + { 0x0013, 0x012a }, + { 0x0013, 0x012b }, + { 0x0013, 0x012c }, + { 0x0013, 0x012d }, + { 0x0013, 0x012e }, + { 0x0013, 0x012f }, + { 0x0013, 0x0130 }, + { 0x0013, 0x0131 }, + { 0x0013, 0x0132 }, + { 0x0013, 0x0133 }, + { 0x0013, 0x0134 }, + { 0x0013, 0x0135 }, + { 0x0013, 0x0136 }, + { 0x0013, 0x0137 }, + { 0x0013, 0x0138 }, + { 0x0013, 0x0139 }, + { 0x0013, 0x013a }, + { 0x0013, 0x013b }, + { 0x0013, 0x013c }, + { 0x0013, 0x013d }, + { 0x0013, 0x013e }, + { 0x0013, 0x013f }, + { 0x0013, 0x0140 }, + { 0x0013, 0x0141 }, + { 0x0013, 0x0142 }, + { 0x0013, 0x0143 }, + { 0x0013, 0x0144 }, + { 0x0013, 0x0145 }, + { 0x0013, 0x0146 }, + { 0x0013, 0x0147 }, + { 0x0013, 0x0148 }, + { 0x0013, 0x0149 }, + { 0x0013, 0x014a }, + { 0x0013, 0x014b }, + { 0x0013, 0x014c }, + { 0x0013, 0x014d }, + { 0x0013, 0x014e }, + { 0x0013, 0x014f }, + { 0x0013, 0x0150 }, + { 0x0013, 0x0151 }, + { 0x0013, 0x0152 }, + { 0x0013, 0x0153 }, + { 0x0013, 0x0154 }, + { 0x0013, 0x0155 }, + { 0x0013, 0x0156 }, + { 0x0013, 0x0157 }, + { 0x0013, 0x0158 }, + { 0x0013, 0x0159 }, + { 0x0013, 0x015a }, + { 0x0013, 0x015b }, + { 0x0013, 0x015c }, + { 0x0013, 0x015d }, + { 0x0013, 0x015e }, + { 0x0013, 0x015f }, + { 0x0013, 0x0160 }, + { 0x0013, 0x0161 }, + { 0x0013, 0x0162 }, + { 0x0013, 0x0163 }, + { 0x0013, 0x0164 }, + { 0x0013, 0x0165 }, + { 0x0013, 0x0166 }, + { 0x0013, 0x0167 }, + { 0x0013, 0x0168 }, + { 0x0013, 0x0169 }, + { 0x0013, 0x016a }, + { 0x0013, 0x016b }, + { 0x0013, 0x016c }, + { 0x0013, 0x016d }, + { 0x0013, 0x016e }, + { 0x0013, 0x016f }, + { 0x0013, 0x0170 }, + { 0x0013, 0x0171 }, + { 0x0013, 0x0172 }, + { 0x0013, 0x0173 }, + { 0x0013, 0x0174 }, + { 0x0013, 0x0175 }, + { 0x0013, 0x0176 }, + { 0x0013, 0x0177 }, + { 0x0013, 0x0178 }, + { 0x0013, 0x0179 }, + { 0x0013, 0x017a }, + { 0x0013, 0x017b }, + { 0x0013, 0x017c }, + { 0x0013, 0x017d }, + { 0x0013, 0x017e }, + { 0x0013, 0x017f }, + { 0x0013, 0x0180 }, + { 0x0013, 0x0181 }, + { 0x0013, 0x0182 }, + { 0x0013, 0x0183 }, + { 0x0013, 0x0184 }, + { 0x0013, 0x0185 }, + { 0x0013, 0x0186 }, + { 0x0013, 0x0187 }, + { 0x0013, 0x0188 }, + { 0x0013, 0x0189 }, + { 0x0013, 0x018a }, + { 0x0013, 0x018b }, + { 0x0013, 0x018c }, + { 0x0013, 0x018d }, + { 0x0013, 0x018e }, + { 0x0013, 0x018f }, + { 0x0013, 0x0190 }, + { 0x0013, 0x0191 }, + { 0x0013, 0x0192 }, + { 0x0013, 0x0193 }, + { 0x0013, 0x0194 }, + { 0x0013, 0x0195 }, + { 0x0013, 0x0196 }, + { 0x0013, 0x0197 }, + { 0x0013, 0x0198 }, + { 0x0013, 0x0199 }, + { 0x0013, 0x019a }, + { 0x0013, 0x019b }, + { 0x0013, 0x019c }, + { 0x0013, 0x019d }, + { 0x0013, 0x019e }, + { 0x0013, 0x019f }, + { 0x0013, 0x01a0 }, + { 0x0013, 0x01a1 }, + { 0x0013, 0x01a2 }, + { 0x0013, 0x01a3 }, + { 0x0013, 0x01a4 }, + { 0x0013, 0x01a5 }, + { 0x0013, 0x01a6 }, + { 0x0013, 0x01a7 }, + { 0x0013, 0x01a8 }, + { 0x0013, 0x01a9 }, + { 0x0013, 0x01aa }, + { 0x0013, 0x01ab }, + { 0x0013, 0x01ac }, + { 0x0013, 0x01ad }, + { 0x0013, 0x01ae }, + { 0x0013, 0x01af }, + { 0x0013, 0x01b0 }, + { 0x0013, 0x01b1 }, + { 0x0013, 0x01b2 }, + { 0x0013, 0x01b3 }, + { 0x0013, 0x01b4 }, + { 0x0013, 0x01b5 }, + { 0x0013, 0x01b6 }, + { 0x0013, 0x01b7 }, + { 0x0013, 0x01b8 }, + { 0x0013, 0x01b9 }, + { 0x0013, 0x01ba }, + { 0x0013, 0x01bb }, + { 0x0013, 0x01bc }, + { 0x0013, 0x01bd }, + { 0x0013, 0x01be }, + { 0x0013, 0x01bf }, + { 0x0013, 0x01c0 }, + { 0x0013, 0x01c1 }, + { 0x0013, 0x01c2 }, + { 0x0013, 0x01c3 }, + { 0x0013, 0x01c4 }, + { 0x0013, 0x01c5 }, + { 0x0013, 0x01c6 }, + { 0x0013, 0x01c7 }, + { 0x0013, 0x01c8 }, + { 0x0013, 0x01c9 }, + { 0x0013, 0x01ca }, + { 0x0013, 0x01cb }, + { 0x0013, 0x01cc }, + { 0x0013, 0x01cd }, + { 0x0013, 0x01ce }, + { 0x0013, 0x01cf }, + { 0x0013, 0x01d0 }, + { 0x0013, 0x01d1 }, + { 0x0013, 0x01d2 }, + { 0x0013, 0x01d3 }, + { 0x0013, 0x01d4 }, + { 0x0013, 0x01d5 }, + { 0x0013, 0x01d6 }, + { 0x0013, 0x01d7 }, + { 0x0013, 0x01d8 }, + { 0x0013, 0x01d9 }, + { 0x0013, 0x01da }, + { 0x0013, 0x01db }, + { 0x0013, 0x01dc }, + { 0x0013, 0x01dd }, + { 0x0013, 0x01de }, + { 0x0013, 0x01df }, + { 0x0013, 0x01e0 }, + { 0x0013, 0x01e1 }, + { 0x0013, 0x01e2 }, + { 0x0013, 0x01e3 }, + { 0x0013, 0x01e4 }, + { 0x0013, 0x01e5 }, + { 0x0013, 0x01e6 }, + { 0x0013, 0x01e7 }, + { 0x0013, 0x01e8 }, + { 0x0013, 0x01e9 }, + { 0x0013, 0x01ea }, + { 0x0013, 0x01eb }, + { 0x0013, 0x01ec }, + { 0x0013, 0x01ed }, + { 0x0013, 0x01ee }, + { 0x0013, 0x01ef }, + { 0x0013, 0x01f0 }, + { 0x0013, 0x01f1 }, + { 0x0013, 0x01f2 }, + { 0x0013, 0x01f3 }, + { 0x0013, 0x01f4 }, + { 0x0013, 0x01f5 }, + { 0x0013, 0x01f6 }, + { 0x0013, 0x01f7 }, + { 0x0013, 0x01f8 }, + { 0x0013, 0x01f9 }, + { 0x0013, 0x01fa }, + { 0x0013, 0x01fb }, + { 0x0013, 0x01fc }, + { 0x0013, 0x01fd }, + { 0x0013, 0x01fe }, + { 0x0013, 0x01ff }, + { 0x0013, 0x0200 }, + { 0x0013, 0x0201 }, + { 0x0013, 0x0202 }, + { 0x0013, 0x0203 }, + { 0x0013, 0x0204 }, + { 0x0013, 0x0205 }, + { 0x0013, 0x0206 }, + { 0x0013, 0x0207 }, + { 0x0013, 0x0208 }, + { 0x0013, 0x0209 }, + { 0x0013, 0x020a }, + { 0x0013, 0x020b }, + { 0x0013, 0x020c }, + { 0x0013, 0x020d }, + { 0x0013, 0x020e }, + { 0x0013, 0x020f }, + { 0x0013, 0x0210 }, + { 0x0013, 0x0211 }, + { 0x0013, 0x0212 }, + { 0x0013, 0x0213 }, + { 0x0013, 0x0214 }, + { 0x0013, 0x0215 }, + { 0x0013, 0x0216 }, + { 0x0013, 0x0217 }, + { 0x0013, 0x0218 }, + { 0x0013, 0x0219 }, + { 0x0013, 0x021a }, + { 0x0013, 0x021b }, + { 0x0013, 0x021c }, + { 0x0013, 0x021d }, + { 0x0013, 0x021e }, + { 0x0013, 0x021f }, + { 0x0013, 0x0220 }, + { 0x0013, 0x0221 }, + { 0x0013, 0x0222 }, + { 0x0013, 0x0223 }, + { 0x0013, 0x0224 }, + { 0x0013, 0x0225 }, + { 0x0013, 0x0226 }, + { 0x0013, 0x0227 }, + { 0x0013, 0x0228 }, + { 0x0013, 0x0229 }, + { 0x0013, 0x022a }, + { 0x0013, 0x022b }, + { 0x0013, 0x022c }, + { 0x0013, 0x022d }, + { 0x0013, 0x022e }, + { 0x0013, 0x022f }, + { 0x0013, 0x0230 }, + { 0x0013, 0x0231 }, + { 0x0013, 0x0232 }, + { 0x0013, 0x0233 }, + { 0x0013, 0x0234 }, + { 0x0013, 0x0235 }, + { 0x0013, 0x0236 }, + { 0x0013, 0x0237 }, + { 0x0013, 0x0238 }, + { 0x0013, 0x0239 }, + { 0x0013, 0x023a }, + { 0x0013, 0x023b }, + { 0x0013, 0x023c }, + { 0x0013, 0x023d }, + { 0x0013, 0x023e }, + { 0x0013, 0x023f }, + { 0x0013, 0x0240 }, + { 0x0013, 0x0241 }, + { 0x0013, 0x0242 }, + { 0x0013, 0x0243 }, + { 0x0013, 0x0244 }, + { 0x0013, 0x0245 }, + { 0x0013, 0x0246 }, + { 0x0013, 0x0247 }, + { 0x0013, 0x0248 }, + { 0x0013, 0x0249 }, + { 0x0013, 0x024a }, + { 0x0013, 0x024b }, + { 0x0013, 0x024c }, + { 0x0013, 0x024d }, + { 0x0013, 0x024e }, + { 0x0013, 0x024f }, + { 0x0013, 0x0250 }, + { 0x0013, 0x0251 }, + { 0x0013, 0x0252 }, + { 0x0013, 0x0253 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc50[28][2] = { + { 0x0002, 0x0001 }, + { 0x0002, 0x0002 }, + { 0x0002, 0x0003 }, + { 0x0003, 0x0001 }, + { 0x0004, 0x0001 }, + { 0x0005, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x0008, 0x0001 }, + { 0x0009, 0x0001 }, + { 0x000a, 0x0001 }, + { 0x000b, 0x0001 }, + { 0x000c, 0x0001 }, + { 0x000d, 0x0001 }, + { 0x000e, 0x0001 }, + { 0x000f, 0x0001 }, + { 0x0011, 0x0003 }, + { 0x0012, 0x0005 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc51[29][2] = { + { 0x0002, 0x0002 }, + { 0x0002, 0x0003 }, + { 0x0003, 0x0002 }, + { 0x0003, 0x0003 }, + { 0x0004, 0x0001 }, + { 0x0004, 0x0002 }, + { 0x0004, 0x0003 }, + { 0x0005, 0x0001 }, + { 0x0006, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x0008, 0x0001 }, + { 0x0009, 0x0001 }, + { 0x000a, 0x0001 }, + { 0x000b, 0x0001 }, + { 0x000c, 0x0001 }, + { 0x000d, 0x0001 }, + { 0x000e, 0x0001 }, + { 0x0010, 0x0002 }, + { 0x0010, 0x0003 }, + { 0x0012, 0x0002 }, + { 0x0012, 0x0003 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0012, 0x0004 }, + { 0x0012, 0x0005 }, + { 0x0012, 0x0006 }, + { 0x0012, 0x0007 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc52[32][2] = { + { 0x0002, 0x0002 }, + { 0x0002, 0x0003 }, + { 0x0003, 0x0002 }, + { 0x0003, 0x0003 }, + { 0x0004, 0x0002 }, + { 0x0004, 0x0003 }, + { 0x0005, 0x0001 }, + { 0x0005, 0x0002 }, + { 0x0005, 0x0003 }, + { 0x0006, 0x0001 }, + { 0x0007, 0x0001 }, + { 0x0008, 0x0001 }, + { 0x0009, 0x0001 }, + { 0x000a, 0x0001 }, + { 0x000b, 0x0001 }, + { 0x000c, 0x0001 }, + { 0x000e, 0x0001 }, + { 0x000e, 0x0002 }, + { 0x000e, 0x0003 }, + { 0x000f, 0x0001 }, + { 0x0011, 0x0002 }, + { 0x0011, 0x0003 }, + { 0x0012, 0x0003 }, + { 0x0014, 0x0000 }, + { 0x0013, 0x0003 }, + { 0x0014, 0x0001 }, + { 0x0014, 0x0002 }, + { 0x0014, 0x0003 }, + { 0x0014, 0x0004 }, + { 0x0014, 0x0005 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, +}; + +const UWord16 c_aauiLCLDHuffEnc53[37][2] = { + { 0x0002, 0x0002 }, + { 0x0002, 0x0003 }, + { 0x0003, 0x0002 }, + { 0x0003, 0x0003 }, + { 0x0004, 0x0002 }, + { 0x0004, 0x0003 }, + { 0x0005, 0x0002 }, + { 0x0005, 0x0003 }, + { 0x0006, 0x0002 }, + { 0x0006, 0x0003 }, + { 0x0007, 0x0001 }, + { 0x0007, 0x0002 }, + { 0x0007, 0x0003 }, + { 0x0008, 0x0001 }, + { 0x0009, 0x0001 }, + { 0x000b, 0x0002 }, + { 0x000b, 0x0003 }, + { 0x000c, 0x0002 }, + { 0x000c, 0x0003 }, + { 0x000d, 0x0002 }, + { 0x000d, 0x0003 }, + { 0x000e, 0x0002 }, + { 0x000e, 0x0003 }, + { 0x000f, 0x0002 }, + { 0x000f, 0x0003 }, + { 0x0011, 0x0004 }, + { 0x0010, 0x0003 }, + { 0x0011, 0x0005 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0012, 0x0001 }, + { 0x0012, 0x0002 }, + { 0x0012, 0x0003 }, + { 0x0012, 0x0004 }, + { 0x0012, 0x0005 }, + { 0x0012, 0x0006 }, + { 0x0012, 0x0007 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc54[39][2] = { + { 0x0002, 0x0002 }, + { 0x0002, 0x0003 }, + { 0x0003, 0x0002 }, + { 0x0003, 0x0003 }, + { 0x0004, 0x0003 }, + { 0x0005, 0x0003 }, + { 0x0005, 0x0004 }, + { 0x0005, 0x0005 }, + { 0x0006, 0x0002 }, + { 0x0006, 0x0003 }, + { 0x0006, 0x0004 }, + { 0x0006, 0x0005 }, + { 0x0007, 0x0002 }, + { 0x0007, 0x0003 }, + { 0x0008, 0x0001 }, + { 0x0008, 0x0002 }, + { 0x0008, 0x0003 }, + { 0x000a, 0x0002 }, + { 0x000a, 0x0003 }, + { 0x000b, 0x0002 }, + { 0x000b, 0x0003 }, + { 0x000c, 0x0002 }, + { 0x000c, 0x0003 }, + { 0x000d, 0x0002 }, + { 0x000d, 0x0003 }, + { 0x000e, 0x0002 }, + { 0x000e, 0x0003 }, + { 0x000f, 0x0002 }, + { 0x000f, 0x0003 }, + { 0x0011, 0x0002 }, + { 0x0010, 0x0002 }, + { 0x0010, 0x0003 }, + { 0x0011, 0x0003 }, + { 0x0012, 0x0002 }, + { 0x0012, 0x0003 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc55[46][2] = { + { 0x0003, 0x0003 }, + { 0x0002, 0x0003 }, + { 0x0003, 0x0004 }, + { 0x0003, 0x0005 }, + { 0x0004, 0x0003 }, + { 0x0004, 0x0004 }, + { 0x0004, 0x0005 }, + { 0x0005, 0x0003 }, + { 0x0005, 0x0004 }, + { 0x0005, 0x0005 }, + { 0x0006, 0x0003 }, + { 0x0006, 0x0004 }, + { 0x0006, 0x0005 }, + { 0x0007, 0x0002 }, + { 0x0007, 0x0003 }, + { 0x0007, 0x0004 }, + { 0x0007, 0x0005 }, + { 0x0008, 0x0002 }, + { 0x0008, 0x0003 }, + { 0x0009, 0x0002 }, + { 0x0009, 0x0003 }, + { 0x000a, 0x0002 }, + { 0x000a, 0x0003 }, + { 0x000b, 0x0002 }, + { 0x000b, 0x0003 }, + { 0x000c, 0x0002 }, + { 0x000c, 0x0003 }, + { 0x000d, 0x0002 }, + { 0x000d, 0x0003 }, + { 0x000e, 0x0002 }, + { 0x000e, 0x0003 }, + { 0x000f, 0x0003 }, + { 0x0010, 0x0002 }, + { 0x0010, 0x0003 }, + { 0x0010, 0x0004 }, + { 0x0010, 0x0005 }, + { 0x0011, 0x0003 }, + { 0x0012, 0x0003 }, + { 0x0012, 0x0004 }, + { 0x0012, 0x0005 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc56[55][2] = { + { 0x0003, 0x0003 }, + { 0x0002, 0x0003 }, + { 0x0003, 0x0004 }, + { 0x0003, 0x0005 }, + { 0x0004, 0x0004 }, + { 0x0004, 0x0005 }, + { 0x0005, 0x0003 }, + { 0x0005, 0x0004 }, + { 0x0005, 0x0005 }, + { 0x0005, 0x0006 }, + { 0x0005, 0x0007 }, + { 0x0006, 0x0003 }, + { 0x0006, 0x0004 }, + { 0x0006, 0x0005 }, + { 0x0007, 0x0003 }, + { 0x0007, 0x0004 }, + { 0x0007, 0x0005 }, + { 0x0008, 0x0002 }, + { 0x0008, 0x0003 }, + { 0x0008, 0x0004 }, + { 0x0008, 0x0005 }, + { 0x0009, 0x0002 }, + { 0x0009, 0x0003 }, + { 0x000a, 0x0002 }, + { 0x000a, 0x0003 }, + { 0x000b, 0x0003 }, + { 0x000c, 0x0003 }, + { 0x000c, 0x0004 }, + { 0x000c, 0x0005 }, + { 0x000d, 0x0003 }, + { 0x000d, 0x0004 }, + { 0x000d, 0x0005 }, + { 0x000e, 0x0003 }, + { 0x000e, 0x0004 }, + { 0x000e, 0x0005 }, + { 0x000f, 0x0004 }, + { 0x000f, 0x0005 }, + { 0x0010, 0x0002 }, + { 0x0010, 0x0003 }, + { 0x0010, 0x0004 }, + { 0x0010, 0x0005 }, + { 0x0010, 0x0006 }, + { 0x0010, 0x0007 }, + { 0x0013, 0x0000 }, + { 0x0011, 0x0003 }, + { 0x0012, 0x0005 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc57[65][2] = { + { 0x0003, 0x0004 }, + { 0x0002, 0x0003 }, + { 0x0003, 0x0005 }, + { 0x0004, 0x0004 }, + { 0x0004, 0x0005 }, + { 0x0004, 0x0006 }, + { 0x0004, 0x0007 }, + { 0x0005, 0x0004 }, + { 0x0005, 0x0005 }, + { 0x0005, 0x0006 }, + { 0x0005, 0x0007 }, + { 0x0006, 0x0004 }, + { 0x0006, 0x0005 }, + { 0x0006, 0x0006 }, + { 0x0006, 0x0007 }, + { 0x0007, 0x0003 }, + { 0x0007, 0x0004 }, + { 0x0007, 0x0005 }, + { 0x0007, 0x0006 }, + { 0x0007, 0x0007 }, + { 0x0008, 0x0003 }, + { 0x0008, 0x0004 }, + { 0x0008, 0x0005 }, + { 0x0009, 0x0003 }, + { 0x0009, 0x0004 }, + { 0x0009, 0x0005 }, + { 0x000a, 0x0003 }, + { 0x000a, 0x0004 }, + { 0x000a, 0x0005 }, + { 0x000b, 0x0003 }, + { 0x000b, 0x0004 }, + { 0x000b, 0x0005 }, + { 0x000c, 0x0003 }, + { 0x000c, 0x0004 }, + { 0x000d, 0x0003 }, + { 0x000c, 0x0005 }, + { 0x000d, 0x0004 }, + { 0x000d, 0x0005 }, + { 0x000e, 0x0003 }, + { 0x000e, 0x0004 }, + { 0x000e, 0x0005 }, + { 0x000f, 0x0003 }, + { 0x0010, 0x0003 }, + { 0x000f, 0x0004 }, + { 0x000f, 0x0005 }, + { 0x0010, 0x0004 }, + { 0x0010, 0x0005 }, + { 0x0013, 0x0000 }, + { 0x0011, 0x0005 }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0012, 0x0007 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0012, 0x0008 }, + { 0x0012, 0x0009 }, + { 0x0013, 0x0005 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0013, 0x000a }, + { 0x0013, 0x000b }, + { 0x0013, 0x000c }, + { 0x0013, 0x000d }, + +}; + +const UWord16 c_aauiLCLDHuffEnc58[77][2] = { + { 0x0004, 0x0005 }, + { 0x0003, 0x0005 }, + { 0x0003, 0x0006 }, + { 0x0003, 0x0007 }, + { 0x0004, 0x0006 }, + { 0x0004, 0x0007 }, + { 0x0004, 0x0008 }, + { 0x0004, 0x0009 }, + { 0x0005, 0x0005 }, + { 0x0005, 0x0006 }, + { 0x0005, 0x0007 }, + { 0x0005, 0x0008 }, + { 0x0005, 0x0009 }, + { 0x0006, 0x0004 }, + { 0x0006, 0x0005 }, + { 0x0006, 0x0006 }, + { 0x0006, 0x0007 }, + { 0x0006, 0x0008 }, + { 0x0006, 0x0009 }, + { 0x0007, 0x0004 }, + { 0x0007, 0x0005 }, + { 0x0007, 0x0006 }, + { 0x0007, 0x0007 }, + { 0x0008, 0x0003 }, + { 0x0008, 0x0004 }, + { 0x0008, 0x0005 }, + { 0x0008, 0x0006 }, + { 0x0008, 0x0007 }, + { 0x0009, 0x0003 }, + { 0x0009, 0x0004 }, + { 0x0009, 0x0005 }, + { 0x000a, 0x0003 }, + { 0x000a, 0x0004 }, + { 0x000a, 0x0005 }, + { 0x000b, 0x0004 }, + { 0x000b, 0x0005 }, + { 0x000c, 0x0004 }, + { 0x000c, 0x0005 }, + { 0x000c, 0x0006 }, + { 0x000c, 0x0007 }, + { 0x000d, 0x0004 }, + { 0x000d, 0x0005 }, + { 0x000d, 0x0006 }, + { 0x000d, 0x0007 }, + { 0x000e, 0x0004 }, + { 0x000e, 0x0005 }, + { 0x000e, 0x0006 }, + { 0x000e, 0x0007 }, + { 0x000f, 0x0004 }, + { 0x000f, 0x0005 }, + { 0x000f, 0x0006 }, + { 0x0010, 0x0004 }, + { 0x000f, 0x0007 }, + { 0x0010, 0x0005 }, + { 0x0010, 0x0006 }, + { 0x0010, 0x0007 }, + { 0x0013, 0x0000 }, + { 0x0013, 0x0001 }, + { 0x0012, 0x0006 }, + { 0x0011, 0x0007 }, + { 0x0013, 0x0002 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + { 0x0012, 0x0007 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0013, 0x000a }, + { 0x0013, 0x000b }, + { 0x0012, 0x0008 }, + { 0x0012, 0x0009 }, + { 0x0012, 0x000a }, + { 0x0012, 0x000b }, + { 0x0012, 0x000c }, + { 0x0012, 0x000d }, + +}; + +const UWord16 c_aauiLCLDHuffEnc59[91][2] = { + { 0x0003, 0x0005 }, + { 0x0003, 0x0006 }, + { 0x0003, 0x0007 }, + { 0x0004, 0x0006 }, + { 0x0004, 0x0007 }, + { 0x0004, 0x0008 }, + { 0x0004, 0x0009 }, + { 0x0005, 0x0006 }, + { 0x0005, 0x0007 }, + { 0x0005, 0x0008 }, + { 0x0005, 0x0009 }, + { 0x0005, 0x000a }, + { 0x0005, 0x000b }, + { 0x0006, 0x0006 }, + { 0x0006, 0x0007 }, + { 0x0006, 0x0008 }, + { 0x0006, 0x0009 }, + { 0x0006, 0x000a }, + { 0x0006, 0x000b }, + { 0x0007, 0x0005 }, + { 0x0007, 0x0006 }, + { 0x0007, 0x0007 }, + { 0x0007, 0x0008 }, + { 0x0007, 0x0009 }, + { 0x0007, 0x000a }, + { 0x0007, 0x000b }, + { 0x0008, 0x0003 }, + { 0x0008, 0x0004 }, + { 0x0008, 0x0005 }, + { 0x0008, 0x0006 }, + { 0x0008, 0x0007 }, + { 0x0008, 0x0008 }, + { 0x0008, 0x0009 }, + { 0x0009, 0x0004 }, + { 0x0009, 0x0005 }, + { 0x000a, 0x0004 }, + { 0x000a, 0x0005 }, + { 0x000a, 0x0006 }, + { 0x000a, 0x0007 }, + { 0x000b, 0x0004 }, + { 0x000b, 0x0005 }, + { 0x000b, 0x0006 }, + { 0x000b, 0x0007 }, + { 0x000c, 0x0004 }, + { 0x000c, 0x0005 }, + { 0x000c, 0x0006 }, + { 0x000c, 0x0007 }, + { 0x000d, 0x0003 }, + { 0x000d, 0x0004 }, + { 0x000d, 0x0005 }, + { 0x000d, 0x0006 }, + { 0x000d, 0x0007 }, + { 0x000e, 0x0003 }, + { 0x000e, 0x0004 }, + { 0x000e, 0x0005 }, + { 0x000f, 0x0003 }, + { 0x000f, 0x0004 }, + { 0x000f, 0x0005 }, + { 0x0011, 0x0008 }, + { 0x0011, 0x0009 }, + { 0x0013, 0x0000 }, + { 0x0011, 0x000a }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0012, 0x000d }, + { 0x0012, 0x000e }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + { 0x0011, 0x000b }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0013, 0x000a }, + { 0x0013, 0x000b }, + { 0x0013, 0x000c }, + { 0x0013, 0x000d }, + { 0x0013, 0x000e }, + { 0x0013, 0x000f }, + { 0x0013, 0x0010 }, + { 0x0013, 0x0011 }, + { 0x0013, 0x0012 }, + { 0x0013, 0x0013 }, + { 0x0013, 0x0014 }, + { 0x0013, 0x0015 }, + { 0x0013, 0x0016 }, + { 0x0013, 0x0017 }, + { 0x0013, 0x0018 }, + { 0x0013, 0x0019 }, + { 0x0012, 0x000f }, + +}; + +const UWord16 c_aauiLCLDHuffEnc60[109][2] = { + { 0x0004, 0x0007 }, + { 0x0002, 0x0003 }, + { 0x0003, 0x0005 }, + { 0x0004, 0x0008 }, + { 0x0004, 0x0009 }, + { 0x0005, 0x0007 }, + { 0x0005, 0x0008 }, + { 0x0005, 0x0009 }, + { 0x0005, 0x000a }, + { 0x0005, 0x000b }, + { 0x0005, 0x000c }, + { 0x0005, 0x000d }, + { 0x0006, 0x0007 }, + { 0x0006, 0x0008 }, + { 0x0006, 0x0009 }, + { 0x0006, 0x000a }, + { 0x0006, 0x000b }, + { 0x0006, 0x000c }, + { 0x0006, 0x000d }, + { 0x0007, 0x0006 }, + { 0x0007, 0x0007 }, + { 0x0007, 0x0008 }, + { 0x0007, 0x0009 }, + { 0x0007, 0x000a }, + { 0x0007, 0x000b }, + { 0x0007, 0x000c }, + { 0x0007, 0x000d }, + { 0x0008, 0x0006 }, + { 0x0008, 0x0007 }, + { 0x0008, 0x0008 }, + { 0x0008, 0x0009 }, + { 0x0008, 0x000a }, + { 0x0008, 0x000b }, + { 0x0009, 0x0004 }, + { 0x0009, 0x0005 }, + { 0x0009, 0x0006 }, + { 0x0009, 0x0007 }, + { 0x0009, 0x0008 }, + { 0x0009, 0x0009 }, + { 0x0009, 0x000a }, + { 0x0009, 0x000b }, + { 0x000a, 0x0004 }, + { 0x000a, 0x0005 }, + { 0x000a, 0x0006 }, + { 0x000a, 0x0007 }, + { 0x000b, 0x0004 }, + { 0x000b, 0x0005 }, + { 0x000b, 0x0006 }, + { 0x000b, 0x0007 }, + { 0x000c, 0x0004 }, + { 0x000c, 0x0005 }, + { 0x000c, 0x0006 }, + { 0x000d, 0x0005 }, + { 0x000d, 0x0006 }, + { 0x000d, 0x0007 }, + { 0x000c, 0x0007 }, + { 0x000e, 0x0005 }, + { 0x000e, 0x0006 }, + { 0x000e, 0x0007 }, + { 0x000e, 0x0008 }, + { 0x000f, 0x0005 }, + { 0x000e, 0x0009 }, + { 0x000f, 0x0006 }, + { 0x0010, 0x0006 }, + { 0x000f, 0x0007 }, + { 0x000f, 0x0008 }, + { 0x000f, 0x0009 }, + { 0x0010, 0x0007 }, + { 0x0010, 0x0008 }, + { 0x0010, 0x0009 }, + { 0x0011, 0x000a }, + { 0x0013, 0x0000 }, + { 0x0011, 0x000b }, + { 0x0013, 0x0001 }, + { 0x0013, 0x0002 }, + { 0x0012, 0x0011 }, + { 0x0012, 0x0012 }, + { 0x0013, 0x0003 }, + { 0x0013, 0x0004 }, + { 0x0013, 0x0005 }, + { 0x0013, 0x0006 }, + { 0x0013, 0x0007 }, + { 0x0013, 0x0008 }, + { 0x0013, 0x0009 }, + { 0x0013, 0x000a }, + { 0x0013, 0x000b }, + { 0x0013, 0x000c }, + { 0x0013, 0x000d }, + { 0x0013, 0x000e }, + { 0x0013, 0x000f }, + { 0x0013, 0x0010 }, + { 0x0013, 0x0011 }, + { 0x0013, 0x0012 }, + { 0x0013, 0x0013 }, + { 0x0013, 0x0014 }, + { 0x0013, 0x0015 }, + { 0x0013, 0x0016 }, + { 0x0013, 0x0017 }, + { 0x0013, 0x0018 }, + { 0x0013, 0x0019 }, + { 0x0013, 0x001a }, + { 0x0013, 0x001b }, + { 0x0013, 0x001c }, + { 0x0013, 0x001d }, + { 0x0013, 0x001e }, + { 0x0013, 0x001f }, + { 0x0013, 0x0020 }, + { 0x0013, 0x0021 }, + { 0x0012, 0x0013 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc61[129][2] = { + { 0x0004, 0x0008 }, + { 0x0003, 0x0006 }, + { 0x0003, 0x0007 }, + { 0x0004, 0x0009 }, + { 0x0004, 0x000a }, + { 0x0004, 0x000b }, + { 0x0005, 0x0008 }, + { 0x0005, 0x0009 }, + { 0x0005, 0x000a }, + { 0x0005, 0x000b }, + { 0x0005, 0x000c }, + { 0x0005, 0x000d }, + { 0x0005, 0x000e }, + { 0x0005, 0x000f }, + { 0x0006, 0x0008 }, + { 0x0006, 0x0009 }, + { 0x0006, 0x000a }, + { 0x0006, 0x000b }, + { 0x0006, 0x000c }, + { 0x0006, 0x000d }, + { 0x0006, 0x000e }, + { 0x0006, 0x000f }, + { 0x0007, 0x0008 }, + { 0x0007, 0x0009 }, + { 0x0007, 0x000a }, + { 0x0007, 0x000b }, + { 0x0007, 0x000c }, + { 0x0007, 0x000d }, + { 0x0007, 0x000e }, + { 0x0007, 0x000f }, + { 0x0008, 0x0006 }, + { 0x0008, 0x0007 }, + { 0x0008, 0x0008 }, + { 0x0008, 0x0009 }, + { 0x0008, 0x000a }, + { 0x0008, 0x000b }, + { 0x0008, 0x000c }, + { 0x0008, 0x000d }, + { 0x0008, 0x000e }, + { 0x0008, 0x000f }, + { 0x0009, 0x0006 }, + { 0x0009, 0x0007 }, + { 0x0009, 0x0008 }, + { 0x0009, 0x0009 }, + { 0x0009, 0x000a }, + { 0x0009, 0x000b }, + { 0x000a, 0x0005 }, + { 0x000a, 0x0006 }, + { 0x000a, 0x0007 }, + { 0x000a, 0x0008 }, + { 0x000a, 0x0009 }, + { 0x000a, 0x000a }, + { 0x000a, 0x000b }, + { 0x000b, 0x0005 }, + { 0x000b, 0x0006 }, + { 0x000b, 0x0007 }, + { 0x000b, 0x0008 }, + { 0x000b, 0x0009 }, + { 0x000c, 0x0006 }, + { 0x000c, 0x0007 }, + { 0x000c, 0x0008 }, + { 0x000c, 0x0009 }, + { 0x000d, 0x0005 }, + { 0x000d, 0x0006 }, + { 0x000d, 0x0007 }, + { 0x000d, 0x0008 }, + { 0x000d, 0x0009 }, + { 0x000d, 0x000a }, + { 0x000e, 0x0008 }, + { 0x000d, 0x000b }, + { 0x000e, 0x0009 }, + { 0x000f, 0x0009 }, + { 0x000f, 0x000a }, + { 0x000f, 0x000b }, + { 0x000f, 0x000c }, + { 0x000f, 0x000d }, + { 0x000f, 0x000e }, + { 0x0010, 0x000c }, + { 0x0011, 0x0015 }, + { 0x0010, 0x000d }, + { 0x000f, 0x000f }, + { 0x0010, 0x000e }, + { 0x0010, 0x000f }, + { 0x0012, 0x0000 }, + { 0x0011, 0x0016 }, + { 0x0010, 0x0010 }, + { 0x0010, 0x0011 }, + { 0x0011, 0x0017 }, + { 0x0012, 0x0001 }, + { 0x0012, 0x0002 }, + { 0x0012, 0x0003 }, + { 0x0012, 0x0004 }, + { 0x0012, 0x0005 }, + { 0x0012, 0x0006 }, + { 0x0012, 0x0007 }, + { 0x0012, 0x0008 }, + { 0x0012, 0x0009 }, + { 0x0012, 0x000a }, + { 0x0012, 0x000b }, + { 0x0012, 0x000c }, + { 0x0012, 0x000d }, + { 0x0012, 0x000e }, + { 0x0012, 0x000f }, + { 0x0012, 0x0010 }, + { 0x0012, 0x0011 }, + { 0x0012, 0x0012 }, + { 0x0012, 0x0013 }, + { 0x0012, 0x0014 }, + { 0x0012, 0x0015 }, + { 0x0012, 0x0016 }, + { 0x0012, 0x0017 }, + { 0x0012, 0x0018 }, + { 0x0012, 0x0019 }, + { 0x0012, 0x001a }, + { 0x0012, 0x001b }, + { 0x0012, 0x001c }, + { 0x0012, 0x001d }, + { 0x0012, 0x001e }, + { 0x0012, 0x001f }, + { 0x0012, 0x0020 }, + { 0x0012, 0x0021 }, + { 0x0012, 0x0022 }, + { 0x0012, 0x0023 }, + { 0x0012, 0x0024 }, + { 0x0012, 0x0025 }, + { 0x0012, 0x0026 }, + { 0x0012, 0x0027 }, + { 0x0012, 0x0028 }, + { 0x0012, 0x0029 }, + +}; + +const UWord16 c_aauiLCLDHuffEnc62[153][2] = { + { 0x0004, 0x0009 }, + { 0x0003, 0x0006 }, + { 0x0003, 0x0007 }, + { 0x0004, 0x000a }, + { 0x0004, 0x000b }, + { 0x0005, 0x000a }, + { 0x0005, 0x000b }, + { 0x0005, 0x000c }, + { 0x0005, 0x000d }, + { 0x0005, 0x000e }, + { 0x0005, 0x000f }, + { 0x0005, 0x0010 }, + { 0x0005, 0x0011 }, + { 0x0006, 0x000a }, + { 0x0006, 0x000b }, + { 0x0006, 0x000c }, + { 0x0006, 0x000d }, + { 0x0006, 0x000e }, + { 0x0006, 0x000f }, + { 0x0006, 0x0010 }, + { 0x0006, 0x0011 }, + { 0x0006, 0x0012 }, + { 0x0006, 0x0013 }, + { 0x0007, 0x0009 }, + { 0x0007, 0x000a }, + { 0x0007, 0x000b }, + { 0x0007, 0x000c }, + { 0x0007, 0x000d }, + { 0x0007, 0x000e }, + { 0x0007, 0x000f }, + { 0x0007, 0x0010 }, + { 0x0007, 0x0011 }, + { 0x0007, 0x0012 }, + { 0x0007, 0x0013 }, + { 0x0008, 0x0009 }, + { 0x0008, 0x000a }, + { 0x0008, 0x000b }, + { 0x0008, 0x000c }, + { 0x0008, 0x000d }, + { 0x0008, 0x000e }, + { 0x0008, 0x000f }, + { 0x0008, 0x0010 }, + { 0x0008, 0x0011 }, + { 0x0009, 0x0007 }, + { 0x0009, 0x0008 }, + { 0x0009, 0x0009 }, + { 0x0009, 0x000a }, + { 0x0009, 0x000b }, + { 0x0009, 0x000c }, + { 0x0009, 0x000d }, + { 0x0009, 0x000e }, + { 0x0009, 0x000f }, + { 0x0009, 0x0010 }, + { 0x0009, 0x0011 }, + { 0x000a, 0x0004 }, + { 0x000a, 0x0005 }, + { 0x000a, 0x0006 }, + { 0x000a, 0x0007 }, + { 0x000a, 0x0008 }, + { 0x000a, 0x0009 }, + { 0x000a, 0x000a }, + { 0x000a, 0x000b }, + { 0x000a, 0x000c }, + { 0x000a, 0x000d }, + { 0x000b, 0x0007 }, + { 0x000c, 0x0007 }, + { 0x000c, 0x0008 }, + { 0x000c, 0x0009 }, + { 0x000c, 0x000a }, + { 0x000c, 0x000b }, + { 0x000c, 0x000c }, + { 0x000d, 0x0007 }, + { 0x000c, 0x000d }, + { 0x000d, 0x0008 }, + { 0x000d, 0x0009 }, + { 0x000d, 0x000a }, + { 0x000d, 0x000b }, + { 0x000e, 0x0008 }, + { 0x000d, 0x000c }, + { 0x000d, 0x000d }, + { 0x000e, 0x0009 }, + { 0x000e, 0x000a }, + { 0x000e, 0x000b }, + { 0x000e, 0x000c }, + { 0x000f, 0x000c }, + { 0x000e, 0x000d }, + { 0x000f, 0x000d }, + { 0x000f, 0x000e }, + { 0x000f, 0x000f }, + { 0x0010, 0x000f }, + { 0x0010, 0x0010 }, + { 0x0011, 0x0019 }, + { 0x0010, 0x0011 }, + { 0x0010, 0x0012 }, + { 0x0010, 0x0013 }, + { 0x0010, 0x0014 }, + { 0x0010, 0x0015 }, + { 0x0012, 0x0000 }, + { 0x0010, 0x0016 }, + { 0x0011, 0x001a }, + { 0x0010, 0x0017 }, + { 0x0012, 0x0001 }, + { 0x0012, 0x0002 }, + { 0x0012, 0x0003 }, + { 0x0011, 0x001b }, + { 0x0012, 0x0004 }, + { 0x0012, 0x0005 }, + { 0x0012, 0x0006 }, + { 0x0012, 0x0007 }, + { 0x0012, 0x0008 }, + { 0x0012, 0x0009 }, + { 0x0012, 0x000a }, + { 0x0012, 0x000b }, + { 0x0012, 0x000c }, + { 0x0012, 0x000d }, + { 0x0012, 0x000e }, + { 0x0012, 0x000f }, + { 0x0012, 0x0010 }, + { 0x0012, 0x0011 }, + { 0x0012, 0x0012 }, + { 0x0012, 0x0013 }, + { 0x0012, 0x0014 }, + { 0x0012, 0x0015 }, + { 0x0012, 0x0016 }, + { 0x0012, 0x0017 }, + { 0x0012, 0x0018 }, + { 0x0011, 0x001c }, + { 0x0012, 0x0019 }, + { 0x0012, 0x001a }, + { 0x0012, 0x001b }, + { 0x0012, 0x001c }, + { 0x0012, 0x001d }, + { 0x0012, 0x001e }, + { 0x0012, 0x001f }, + { 0x0012, 0x0020 }, + { 0x0012, 0x0021 }, + { 0x0012, 0x0022 }, + { 0x0012, 0x0023 }, + { 0x0012, 0x0024 }, + { 0x0012, 0x0025 }, + { 0x0012, 0x0026 }, + { 0x0012, 0x0027 }, + { 0x0012, 0x0028 }, + { 0x0012, 0x0029 }, + { 0x0012, 0x002a }, + { 0x0012, 0x002b }, + { 0x0012, 0x002c }, + { 0x0012, 0x002d }, + { 0x0012, 0x002e }, + { 0x0012, 0x002f }, + { 0x0012, 0x0030 }, + { 0x0012, 0x0031 }, + { 0x0011, 0x001d }, + +}; + +const UWord16 c_aauiLCLDHuffEnc63[181][2] = { + { 0x0004, 0x0008 }, + { 0x0003, 0x0005 }, + { 0x0002, 0x0003 }, + { 0x0004, 0x0009 }, + { 0x0005, 0x000c }, + { 0x0005, 0x000d }, + { 0x0005, 0x000e }, + { 0x0005, 0x000f }, + { 0x0006, 0x000c }, + { 0x0006, 0x000d }, + { 0x0006, 0x000e }, + { 0x0006, 0x000f }, + { 0x0006, 0x0010 }, + { 0x0006, 0x0011 }, + { 0x0006, 0x0012 }, + { 0x0006, 0x0013 }, + { 0x0006, 0x0014 }, + { 0x0006, 0x0015 }, + { 0x0006, 0x0016 }, + { 0x0006, 0x0017 }, + { 0x0007, 0x000b }, + { 0x0007, 0x000c }, + { 0x0007, 0x000d }, + { 0x0007, 0x000e }, + { 0x0007, 0x000f }, + { 0x0007, 0x0010 }, + { 0x0007, 0x0011 }, + { 0x0007, 0x0012 }, + { 0x0007, 0x0013 }, + { 0x0007, 0x0014 }, + { 0x0007, 0x0015 }, + { 0x0007, 0x0016 }, + { 0x0007, 0x0017 }, + { 0x0008, 0x000c }, + { 0x0008, 0x000d }, + { 0x0008, 0x000e }, + { 0x0008, 0x000f }, + { 0x0008, 0x0010 }, + { 0x0008, 0x0011 }, + { 0x0008, 0x0012 }, + { 0x0008, 0x0013 }, + { 0x0008, 0x0014 }, + { 0x0008, 0x0015 }, + { 0x0009, 0x0008 }, + { 0x0009, 0x0009 }, + { 0x0009, 0x000a }, + { 0x0009, 0x000b }, + { 0x0009, 0x000c }, + { 0x0009, 0x000d }, + { 0x0009, 0x000e }, + { 0x0009, 0x000f }, + { 0x0009, 0x0010 }, + { 0x0009, 0x0011 }, + { 0x0009, 0x0012 }, + { 0x0009, 0x0013 }, + { 0x0009, 0x0014 }, + { 0x0009, 0x0015 }, + { 0x000a, 0x0007 }, + { 0x0009, 0x0016 }, + { 0x0009, 0x0017 }, + { 0x000a, 0x0008 }, + { 0x000a, 0x0009 }, + { 0x000a, 0x000a }, + { 0x000a, 0x000b }, + { 0x000a, 0x000c }, + { 0x000a, 0x000d }, + { 0x000a, 0x000e }, + { 0x000b, 0x0008 }, + { 0x000b, 0x0009 }, + { 0x000b, 0x000a }, + { 0x000a, 0x000f }, + { 0x000b, 0x000b }, + { 0x000b, 0x000c }, + { 0x000b, 0x000d }, + { 0x000c, 0x0009 }, + { 0x000c, 0x000a }, + { 0x000c, 0x000b }, + { 0x000c, 0x000c }, + { 0x000c, 0x000d }, + { 0x000c, 0x000e }, + { 0x000c, 0x000f }, + { 0x000d, 0x0008 }, + { 0x000d, 0x0009 }, + { 0x000d, 0x000a }, + { 0x000d, 0x000b }, + { 0x000d, 0x000c }, + { 0x000d, 0x000d }, + { 0x000d, 0x000e }, + { 0x000d, 0x000f }, + { 0x000d, 0x0010 }, + { 0x000d, 0x0011 }, + { 0x000e, 0x0007 }, + { 0x000e, 0x0008 }, + { 0x000e, 0x0009 }, + { 0x000e, 0x000a }, + { 0x000e, 0x000b }, + { 0x000e, 0x000c }, + { 0x000e, 0x000d }, + { 0x000e, 0x000e }, + { 0x000e, 0x000f }, + { 0x000f, 0x0008 }, + { 0x000f, 0x0009 }, + { 0x000f, 0x000a }, + { 0x000f, 0x000b }, + { 0x000f, 0x000c }, + { 0x0010, 0x0009 }, + { 0x0010, 0x000a }, + { 0x000f, 0x000d }, + { 0x0010, 0x000b }, + { 0x0010, 0x000c }, + { 0x0010, 0x000d }, + { 0x0011, 0x000e }, + { 0x0011, 0x000f }, + { 0x0010, 0x000e }, + { 0x0011, 0x0010 }, + { 0x0011, 0x0011 }, + { 0x0012, 0x0014 }, + { 0x0014, 0x0000 }, + { 0x0010, 0x000f }, + { 0x0012, 0x0015 }, + { 0x0012, 0x0016 }, + { 0x0014, 0x0001 }, + { 0x0012, 0x0017 }, + { 0x0012, 0x0018 }, + { 0x0012, 0x0019 }, + { 0x0013, 0x0010 }, + { 0x0012, 0x001a }, + { 0x0014, 0x0002 }, + { 0x0012, 0x001b }, + { 0x0014, 0x0003 }, + { 0x0014, 0x0004 }, + { 0x0014, 0x0005 }, + { 0x0013, 0x0011 }, + { 0x0014, 0x0006 }, + { 0x0013, 0x0012 }, + { 0x0014, 0x0007 }, + { 0x0014, 0x0008 }, + { 0x0014, 0x0009 }, + { 0x0014, 0x000a }, + { 0x0014, 0x000b }, + { 0x0014, 0x000c }, + { 0x0014, 0x000d }, + { 0x0014, 0x000e }, + { 0x0013, 0x0013 }, + { 0x0014, 0x000f }, + { 0x0014, 0x0010 }, + { 0x0014, 0x0011 }, + { 0x0014, 0x0012 }, + { 0x0014, 0x0013 }, + { 0x0014, 0x0014 }, + { 0x0014, 0x0015 }, + { 0x0014, 0x0016 }, + { 0x0014, 0x0017 }, + { 0x0014, 0x0018 }, + { 0x0014, 0x0019 }, + { 0x0014, 0x001a }, + { 0x0014, 0x001b }, + { 0x0014, 0x001c }, + { 0x0014, 0x001d }, + { 0x0014, 0x001e }, + { 0x0014, 0x001f }, + { 0x0013, 0x0014 }, + { 0x0013, 0x0015 }, + { 0x0013, 0x0016 }, + { 0x0013, 0x0017 }, + { 0x0013, 0x0018 }, + { 0x0013, 0x0019 }, + { 0x0013, 0x001a }, + { 0x0013, 0x001b }, + { 0x0013, 0x001c }, + { 0x0013, 0x001d }, + { 0x0013, 0x001e }, + { 0x0013, 0x001f }, + { 0x0013, 0x0020 }, + { 0x0013, 0x0021 }, + { 0x0013, 0x0022 }, + { 0x0013, 0x0023 }, + { 0x0013, 0x0024 }, + { 0x0013, 0x0025 }, + { 0x0013, 0x0026 }, + { 0x0013, 0x0027 }, + +}; + +const UWord16 ( *c_apauiHuffEncTabels[2 * ALLOC_TABLE_SIZE] )[2] = { + NULL, + c_aauiLCLDHuffEnc1, + c_aauiLCLDHuffEnc2, + c_aauiLCLDHuffEnc3, + c_aauiLCLDHuffEnc4, + c_aauiLCLDHuffEnc5, + c_aauiLCLDHuffEnc6, + c_aauiLCLDHuffEnc7, + c_aauiLCLDHuffEnc8, + c_aauiLCLDHuffEnc9, + c_aauiLCLDHuffEnc10, + c_aauiLCLDHuffEnc11, + c_aauiLCLDHuffEnc12, + c_aauiLCLDHuffEnc13, + c_aauiLCLDHuffEnc14, + c_aauiLCLDHuffEnc15, + c_aauiLCLDHuffEnc16, + c_aauiLCLDHuffEnc17, + c_aauiLCLDHuffEnc18, + c_aauiLCLDHuffEnc19, + c_aauiLCLDHuffEnc20, + c_aauiLCLDHuffEnc21, + c_aauiLCLDHuffEnc22, + c_aauiLCLDHuffEnc23, + c_aauiLCLDHuffEnc24, + c_aauiLCLDHuffEnc25, + c_aauiLCLDHuffEnc26, + c_aauiLCLDHuffEnc27, + c_aauiLCLDHuffEnc28, + c_aauiLCLDHuffEnc29, + c_aauiLCLDHuffEnc30, + c_aauiLCLDHuffEnc31, + NULL, + c_aauiLCLDHuffEnc33, + c_aauiLCLDHuffEnc34, + c_aauiLCLDHuffEnc35, + c_aauiLCLDHuffEnc36, + c_aauiLCLDHuffEnc37, + c_aauiLCLDHuffEnc38, + c_aauiLCLDHuffEnc39, + c_aauiLCLDHuffEnc40, + c_aauiLCLDHuffEnc41, + c_aauiLCLDHuffEnc42, + c_aauiLCLDHuffEnc43, + c_aauiLCLDHuffEnc44, + c_aauiLCLDHuffEnc45, + c_aauiLCLDHuffEnc46, + c_aauiLCLDHuffEnc47, + c_aauiLCLDHuffEnc48, + c_aauiLCLDHuffEnc49, + c_aauiLCLDHuffEnc50, + c_aauiLCLDHuffEnc51, + c_aauiLCLDHuffEnc52, + c_aauiLCLDHuffEnc53, + c_aauiLCLDHuffEnc54, + c_aauiLCLDHuffEnc55, + c_aauiLCLDHuffEnc56, + c_aauiLCLDHuffEnc57, + c_aauiLCLDHuffEnc58, + c_aauiLCLDHuffEnc59, + c_aauiLCLDHuffEnc60, + c_aauiLCLDHuffEnc61, + c_aauiLCLDHuffEnc62, + c_aauiLCLDHuffEnc63, +}; + +const UWord32 num_row_aauiLCLDHuff[2 * ALLOC_TABLE_SIZE] = { + 0, 16, 16, 25, 36, 36, 49, 64, 81, 100, + 169, 196, 289, 324, 400, 576, 729, 729, 28, 29, + 32, 37, 39, 46, 55, 65, 77, 91, 109, 129, + 153, 181, 0, 16, 16, 25, 36, 36, 49, 64, 81, + 100, 169, 196, 289, 324, 400, 576, 729, 729, 28, + 29, 32, 37, 39, 46, 55, 65, 77, 91, 109, + 129, 153, 181 +}; +#ifdef USE_DEMOD_TABLES +const Word32 c_aaiHuffDemod1[16][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, +}; + +const Word32 c_aaiHuffDemod2[16][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, +}; + +const Word32 c_aaiHuffDemod3[25][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, +}; + +const Word32 c_aaiHuffDemod4[36][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, +}; + +const Word32 c_aaiHuffDemod5[36][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, +}; + +const Word32 c_aaiHuffDemod6[49][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 0, + 6, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 1, + 6, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 2, + 6, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 3, + 6, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 4, + 6, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, + 5, + 6, + 6, + 0, + 6, + 1, + 6, + 2, + 6, + 3, + 6, + 4, + 6, + 5, + 6, + 6, +}; + +const Word32 c_aaiHuffDemod7[64][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 0, + 6, + 0, + 7, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 1, + 6, + 1, + 7, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 2, + 6, + 2, + 7, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 3, + 6, + 3, + 7, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 4, + 6, + 4, + 7, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, + 5, + 6, + 5, + 7, + 6, + 0, + 6, + 1, + 6, + 2, + 6, + 3, + 6, + 4, + 6, + 5, + 6, + 6, + 6, + 7, + 7, + 0, + 7, + 1, + 7, + 2, + 7, + 3, + 7, + 4, + 7, + 5, + 7, + 6, + 7, + 7, +}; + +const Word32 c_aaiHuffDemod8[81][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 0, + 6, + 0, + 7, + 0, + 8, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 1, + 6, + 1, + 7, + 1, + 8, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 2, + 6, + 2, + 7, + 2, + 8, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 3, + 6, + 3, + 7, + 3, + 8, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 4, + 6, + 4, + 7, + 4, + 8, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 8, + 6, + 0, + 6, + 1, + 6, + 2, + 6, + 3, + 6, + 4, + 6, + 5, + 6, + 6, + 6, + 7, + 6, + 8, + 7, + 0, + 7, + 1, + 7, + 2, + 7, + 3, + 7, + 4, + 7, + 5, + 7, + 6, + 7, + 7, + 7, + 8, + 8, + 0, + 8, + 1, + 8, + 2, + 8, + 3, + 8, + 4, + 8, + 5, + 8, + 6, + 8, + 7, + 8, + 8, +}; + +const Word32 c_aaiHuffDemod9[100][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 0, + 6, + 0, + 7, + 0, + 8, + 0, + 9, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 1, + 6, + 1, + 7, + 1, + 8, + 1, + 9, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 2, + 6, + 2, + 7, + 2, + 8, + 2, + 9, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 3, + 6, + 3, + 7, + 3, + 8, + 3, + 9, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 4, + 6, + 4, + 7, + 4, + 8, + 4, + 9, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 8, + 5, + 9, + 6, + 0, + 6, + 1, + 6, + 2, + 6, + 3, + 6, + 4, + 6, + 5, + 6, + 6, + 6, + 7, + 6, + 8, + 6, + 9, + 7, + 0, + 7, + 1, + 7, + 2, + 7, + 3, + 7, + 4, + 7, + 5, + 7, + 6, + 7, + 7, + 7, + 8, + 7, + 9, + 8, + 0, + 8, + 1, + 8, + 2, + 8, + 3, + 8, + 4, + 8, + 5, + 8, + 6, + 8, + 7, + 8, + 8, + 8, + 9, + 9, + 0, + 9, + 1, + 9, + 2, + 9, + 3, + 9, + 4, + 9, + 5, + 9, + 6, + 9, + 7, + 9, + 8, + 9, + 9, +}; + +const Word32 c_aaiHuffDemod10[169][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 0, + 6, + 0, + 7, + 0, + 8, + 0, + 9, + 0, + 10, + 0, + 11, + 0, + 12, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 1, + 6, + 1, + 7, + 1, + 8, + 1, + 9, + 1, + 10, + 1, + 11, + 1, + 12, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 2, + 6, + 2, + 7, + 2, + 8, + 2, + 9, + 2, + 10, + 2, + 11, + 2, + 12, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 3, + 6, + 3, + 7, + 3, + 8, + 3, + 9, + 3, + 10, + 3, + 11, + 3, + 12, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 4, + 6, + 4, + 7, + 4, + 8, + 4, + 9, + 4, + 10, + 4, + 11, + 4, + 12, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 8, + 5, + 9, + 5, + 10, + 5, + 11, + 5, + 12, + 6, + 0, + 6, + 1, + 6, + 2, + 6, + 3, + 6, + 4, + 6, + 5, + 6, + 6, + 6, + 7, + 6, + 8, + 6, + 9, + 6, + 10, + 6, + 11, + 6, + 12, + 7, + 0, + 7, + 1, + 7, + 2, + 7, + 3, + 7, + 4, + 7, + 5, + 7, + 6, + 7, + 7, + 7, + 8, + 7, + 9, + 7, + 10, + 7, + 11, + 7, + 12, + 8, + 0, + 8, + 1, + 8, + 2, + 8, + 3, + 8, + 4, + 8, + 5, + 8, + 6, + 8, + 7, + 8, + 8, + 8, + 9, + 8, + 10, + 8, + 11, + 8, + 12, + 9, + 0, + 9, + 1, + 9, + 2, + 9, + 3, + 9, + 4, + 9, + 5, + 9, + 6, + 9, + 7, + 9, + 8, + 9, + 9, + 9, + 10, + 9, + 11, + 9, + 12, + 10, + 0, + 10, + 1, + 10, + 2, + 10, + 3, + 10, + 4, + 10, + 5, + 10, + 6, + 10, + 7, + 10, + 8, + 10, + 9, + 10, + 10, + 10, + 11, + 10, + 12, + 11, + 0, + 11, + 1, + 11, + 2, + 11, + 3, + 11, + 4, + 11, + 5, + 11, + 6, + 11, + 7, + 11, + 8, + 11, + 9, + 11, + 10, + 11, + 11, + 11, + 12, + 12, + 0, + 12, + 1, + 12, + 2, + 12, + 3, + 12, + 4, + 12, + 5, + 12, + 6, + 12, + 7, + 12, + 8, + 12, + 9, + 12, + 10, + 12, + 11, + 12, + 12, +}; + +const Word32 c_aaiHuffDemod11[196][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 0, + 6, + 0, + 7, + 0, + 8, + 0, + 9, + 0, + 10, + 0, + 11, + 0, + 12, + 0, + 13, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 1, + 6, + 1, + 7, + 1, + 8, + 1, + 9, + 1, + 10, + 1, + 11, + 1, + 12, + 1, + 13, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 2, + 6, + 2, + 7, + 2, + 8, + 2, + 9, + 2, + 10, + 2, + 11, + 2, + 12, + 2, + 13, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 3, + 6, + 3, + 7, + 3, + 8, + 3, + 9, + 3, + 10, + 3, + 11, + 3, + 12, + 3, + 13, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 4, + 6, + 4, + 7, + 4, + 8, + 4, + 9, + 4, + 10, + 4, + 11, + 4, + 12, + 4, + 13, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 8, + 5, + 9, + 5, + 10, + 5, + 11, + 5, + 12, + 5, + 13, + 6, + 0, + 6, + 1, + 6, + 2, + 6, + 3, + 6, + 4, + 6, + 5, + 6, + 6, + 6, + 7, + 6, + 8, + 6, + 9, + 6, + 10, + 6, + 11, + 6, + 12, + 6, + 13, + 7, + 0, + 7, + 1, + 7, + 2, + 7, + 3, + 7, + 4, + 7, + 5, + 7, + 6, + 7, + 7, + 7, + 8, + 7, + 9, + 7, + 10, + 7, + 11, + 7, + 12, + 7, + 13, + 8, + 0, + 8, + 1, + 8, + 2, + 8, + 3, + 8, + 4, + 8, + 5, + 8, + 6, + 8, + 7, + 8, + 8, + 8, + 9, + 8, + 10, + 8, + 11, + 8, + 12, + 8, + 13, + 9, + 0, + 9, + 1, + 9, + 2, + 9, + 3, + 9, + 4, + 9, + 5, + 9, + 6, + 9, + 7, + 9, + 8, + 9, + 9, + 9, + 10, + 9, + 11, + 9, + 12, + 9, + 13, + 10, + 0, + 10, + 1, + 10, + 2, + 10, + 3, + 10, + 4, + 10, + 5, + 10, + 6, + 10, + 7, + 10, + 8, + 10, + 9, + 10, + 10, + 10, + 11, + 10, + 12, + 10, + 13, + 11, + 0, + 11, + 1, + 11, + 2, + 11, + 3, + 11, + 4, + 11, + 5, + 11, + 6, + 11, + 7, + 11, + 8, + 11, + 9, + 11, + 10, + 11, + 11, + 11, + 12, + 11, + 13, + 12, + 0, + 12, + 1, + 12, + 2, + 12, + 3, + 12, + 4, + 12, + 5, + 12, + 6, + 12, + 7, + 12, + 8, + 12, + 9, + 12, + 10, + 12, + 11, + 12, + 12, + 12, + 13, + 13, + 0, + 13, + 1, + 13, + 2, + 13, + 3, + 13, + 4, + 13, + 5, + 13, + 6, + 13, + 7, + 13, + 8, + 13, + 9, + 13, + 10, + 13, + 11, + 13, + 12, + 13, + 13, +}; + +const Word32 c_aaiHuffDemod12[289][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 0, + 6, + 0, + 7, + 0, + 8, + 0, + 9, + 0, + 10, + 0, + 11, + 0, + 12, + 0, + 13, + 0, + 14, + 0, + 15, + 0, + 16, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 1, + 6, + 1, + 7, + 1, + 8, + 1, + 9, + 1, + 10, + 1, + 11, + 1, + 12, + 1, + 13, + 1, + 14, + 1, + 15, + 1, + 16, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 2, + 6, + 2, + 7, + 2, + 8, + 2, + 9, + 2, + 10, + 2, + 11, + 2, + 12, + 2, + 13, + 2, + 14, + 2, + 15, + 2, + 16, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 3, + 6, + 3, + 7, + 3, + 8, + 3, + 9, + 3, + 10, + 3, + 11, + 3, + 12, + 3, + 13, + 3, + 14, + 3, + 15, + 3, + 16, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 4, + 6, + 4, + 7, + 4, + 8, + 4, + 9, + 4, + 10, + 4, + 11, + 4, + 12, + 4, + 13, + 4, + 14, + 4, + 15, + 4, + 16, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 8, + 5, + 9, + 5, + 10, + 5, + 11, + 5, + 12, + 5, + 13, + 5, + 14, + 5, + 15, + 5, + 16, + 6, + 0, + 6, + 1, + 6, + 2, + 6, + 3, + 6, + 4, + 6, + 5, + 6, + 6, + 6, + 7, + 6, + 8, + 6, + 9, + 6, + 10, + 6, + 11, + 6, + 12, + 6, + 13, + 6, + 14, + 6, + 15, + 6, + 16, + 7, + 0, + 7, + 1, + 7, + 2, + 7, + 3, + 7, + 4, + 7, + 5, + 7, + 6, + 7, + 7, + 7, + 8, + 7, + 9, + 7, + 10, + 7, + 11, + 7, + 12, + 7, + 13, + 7, + 14, + 7, + 15, + 7, + 16, + 8, + 0, + 8, + 1, + 8, + 2, + 8, + 3, + 8, + 4, + 8, + 5, + 8, + 6, + 8, + 7, + 8, + 8, + 8, + 9, + 8, + 10, + 8, + 11, + 8, + 12, + 8, + 13, + 8, + 14, + 8, + 15, + 8, + 16, + 9, + 0, + 9, + 1, + 9, + 2, + 9, + 3, + 9, + 4, + 9, + 5, + 9, + 6, + 9, + 7, + 9, + 8, + 9, + 9, + 9, + 10, + 9, + 11, + 9, + 12, + 9, + 13, + 9, + 14, + 9, + 15, + 9, + 16, + 10, + 0, + 10, + 1, + 10, + 2, + 10, + 3, + 10, + 4, + 10, + 5, + 10, + 6, + 10, + 7, + 10, + 8, + 10, + 9, + 10, + 10, + 10, + 11, + 10, + 12, + 10, + 13, + 10, + 14, + 10, + 15, + 10, + 16, + 11, + 0, + 11, + 1, + 11, + 2, + 11, + 3, + 11, + 4, + 11, + 5, + 11, + 6, + 11, + 7, + 11, + 8, + 11, + 9, + 11, + 10, + 11, + 11, + 11, + 12, + 11, + 13, + 11, + 14, + 11, + 15, + 11, + 16, + 12, + 0, + 12, + 1, + 12, + 2, + 12, + 3, + 12, + 4, + 12, + 5, + 12, + 6, + 12, + 7, + 12, + 8, + 12, + 9, + 12, + 10, + 12, + 11, + 12, + 12, + 12, + 13, + 12, + 14, + 12, + 15, + 12, + 16, + 13, + 0, + 13, + 1, + 13, + 2, + 13, + 3, + 13, + 4, + 13, + 5, + 13, + 6, + 13, + 7, + 13, + 8, + 13, + 9, + 13, + 10, + 13, + 11, + 13, + 12, + 13, + 13, + 13, + 14, + 13, + 15, + 13, + 16, + 14, + 0, + 14, + 1, + 14, + 2, + 14, + 3, + 14, + 4, + 14, + 5, + 14, + 6, + 14, + 7, + 14, + 8, + 14, + 9, + 14, + 10, + 14, + 11, + 14, + 12, + 14, + 13, + 14, + 14, + 14, + 15, + 14, + 16, + 15, + 0, + 15, + 1, + 15, + 2, + 15, + 3, + 15, + 4, + 15, + 5, + 15, + 6, + 15, + 7, + 15, + 8, + 15, + 9, + 15, + 10, + 15, + 11, + 15, + 12, + 15, + 13, + 15, + 14, + 15, + 15, + 15, + 16, + 16, + 0, + 16, + 1, + 16, + 2, + 16, + 3, + 16, + 4, + 16, + 5, + 16, + 6, + 16, + 7, + 16, + 8, + 16, + 9, + 16, + 10, + 16, + 11, + 16, + 12, + 16, + 13, + 16, + 14, + 16, + 15, + 16, + 16, +}; + +const Word32 c_aaiHuffDemod13[324][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 0, + 6, + 0, + 7, + 0, + 8, + 0, + 9, + 0, + 10, + 0, + 11, + 0, + 12, + 0, + 13, + 0, + 14, + 0, + 15, + 0, + 16, + 0, + 17, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 1, + 6, + 1, + 7, + 1, + 8, + 1, + 9, + 1, + 10, + 1, + 11, + 1, + 12, + 1, + 13, + 1, + 14, + 1, + 15, + 1, + 16, + 1, + 17, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 2, + 6, + 2, + 7, + 2, + 8, + 2, + 9, + 2, + 10, + 2, + 11, + 2, + 12, + 2, + 13, + 2, + 14, + 2, + 15, + 2, + 16, + 2, + 17, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 3, + 6, + 3, + 7, + 3, + 8, + 3, + 9, + 3, + 10, + 3, + 11, + 3, + 12, + 3, + 13, + 3, + 14, + 3, + 15, + 3, + 16, + 3, + 17, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 4, + 6, + 4, + 7, + 4, + 8, + 4, + 9, + 4, + 10, + 4, + 11, + 4, + 12, + 4, + 13, + 4, + 14, + 4, + 15, + 4, + 16, + 4, + 17, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 8, + 5, + 9, + 5, + 10, + 5, + 11, + 5, + 12, + 5, + 13, + 5, + 14, + 5, + 15, + 5, + 16, + 5, + 17, + 6, + 0, + 6, + 1, + 6, + 2, + 6, + 3, + 6, + 4, + 6, + 5, + 6, + 6, + 6, + 7, + 6, + 8, + 6, + 9, + 6, + 10, + 6, + 11, + 6, + 12, + 6, + 13, + 6, + 14, + 6, + 15, + 6, + 16, + 6, + 17, + 7, + 0, + 7, + 1, + 7, + 2, + 7, + 3, + 7, + 4, + 7, + 5, + 7, + 6, + 7, + 7, + 7, + 8, + 7, + 9, + 7, + 10, + 7, + 11, + 7, + 12, + 7, + 13, + 7, + 14, + 7, + 15, + 7, + 16, + 7, + 17, + 8, + 0, + 8, + 1, + 8, + 2, + 8, + 3, + 8, + 4, + 8, + 5, + 8, + 6, + 8, + 7, + 8, + 8, + 8, + 9, + 8, + 10, + 8, + 11, + 8, + 12, + 8, + 13, + 8, + 14, + 8, + 15, + 8, + 16, + 8, + 17, + 9, + 0, + 9, + 1, + 9, + 2, + 9, + 3, + 9, + 4, + 9, + 5, + 9, + 6, + 9, + 7, + 9, + 8, + 9, + 9, + 9, + 10, + 9, + 11, + 9, + 12, + 9, + 13, + 9, + 14, + 9, + 15, + 9, + 16, + 9, + 17, + 10, + 0, + 10, + 1, + 10, + 2, + 10, + 3, + 10, + 4, + 10, + 5, + 10, + 6, + 10, + 7, + 10, + 8, + 10, + 9, + 10, + 10, + 10, + 11, + 10, + 12, + 10, + 13, + 10, + 14, + 10, + 15, + 10, + 16, + 10, + 17, + 11, + 0, + 11, + 1, + 11, + 2, + 11, + 3, + 11, + 4, + 11, + 5, + 11, + 6, + 11, + 7, + 11, + 8, + 11, + 9, + 11, + 10, + 11, + 11, + 11, + 12, + 11, + 13, + 11, + 14, + 11, + 15, + 11, + 16, + 11, + 17, + 12, + 0, + 12, + 1, + 12, + 2, + 12, + 3, + 12, + 4, + 12, + 5, + 12, + 6, + 12, + 7, + 12, + 8, + 12, + 9, + 12, + 10, + 12, + 11, + 12, + 12, + 12, + 13, + 12, + 14, + 12, + 15, + 12, + 16, + 12, + 17, + 13, + 0, + 13, + 1, + 13, + 2, + 13, + 3, + 13, + 4, + 13, + 5, + 13, + 6, + 13, + 7, + 13, + 8, + 13, + 9, + 13, + 10, + 13, + 11, + 13, + 12, + 13, + 13, + 13, + 14, + 13, + 15, + 13, + 16, + 13, + 17, + 14, + 0, + 14, + 1, + 14, + 2, + 14, + 3, + 14, + 4, + 14, + 5, + 14, + 6, + 14, + 7, + 14, + 8, + 14, + 9, + 14, + 10, + 14, + 11, + 14, + 12, + 14, + 13, + 14, + 14, + 14, + 15, + 14, + 16, + 14, + 17, + 15, + 0, + 15, + 1, + 15, + 2, + 15, + 3, + 15, + 4, + 15, + 5, + 15, + 6, + 15, + 7, + 15, + 8, + 15, + 9, + 15, + 10, + 15, + 11, + 15, + 12, + 15, + 13, + 15, + 14, + 15, + 15, + 15, + 16, + 15, + 17, + 16, + 0, + 16, + 1, + 16, + 2, + 16, + 3, + 16, + 4, + 16, + 5, + 16, + 6, + 16, + 7, + 16, + 8, + 16, + 9, + 16, + 10, + 16, + 11, + 16, + 12, + 16, + 13, + 16, + 14, + 16, + 15, + 16, + 16, + 16, + 17, + 17, + 0, + 17, + 1, + 17, + 2, + 17, + 3, + 17, + 4, + 17, + 5, + 17, + 6, + 17, + 7, + 17, + 8, + 17, + 9, + 17, + 10, + 17, + 11, + 17, + 12, + 17, + 13, + 17, + 14, + 17, + 15, + 17, + 16, + 17, + 17, +}; + +const Word32 c_aaiHuffDemod14[400][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 0, + 6, + 0, + 7, + 0, + 8, + 0, + 9, + 0, + 10, + 0, + 11, + 0, + 12, + 0, + 13, + 0, + 14, + 0, + 15, + 0, + 16, + 0, + 17, + 0, + 18, + 0, + 19, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 1, + 6, + 1, + 7, + 1, + 8, + 1, + 9, + 1, + 10, + 1, + 11, + 1, + 12, + 1, + 13, + 1, + 14, + 1, + 15, + 1, + 16, + 1, + 17, + 1, + 18, + 1, + 19, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 2, + 6, + 2, + 7, + 2, + 8, + 2, + 9, + 2, + 10, + 2, + 11, + 2, + 12, + 2, + 13, + 2, + 14, + 2, + 15, + 2, + 16, + 2, + 17, + 2, + 18, + 2, + 19, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 3, + 6, + 3, + 7, + 3, + 8, + 3, + 9, + 3, + 10, + 3, + 11, + 3, + 12, + 3, + 13, + 3, + 14, + 3, + 15, + 3, + 16, + 3, + 17, + 3, + 18, + 3, + 19, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 4, + 6, + 4, + 7, + 4, + 8, + 4, + 9, + 4, + 10, + 4, + 11, + 4, + 12, + 4, + 13, + 4, + 14, + 4, + 15, + 4, + 16, + 4, + 17, + 4, + 18, + 4, + 19, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 8, + 5, + 9, + 5, + 10, + 5, + 11, + 5, + 12, + 5, + 13, + 5, + 14, + 5, + 15, + 5, + 16, + 5, + 17, + 5, + 18, + 5, + 19, + 6, + 0, + 6, + 1, + 6, + 2, + 6, + 3, + 6, + 4, + 6, + 5, + 6, + 6, + 6, + 7, + 6, + 8, + 6, + 9, + 6, + 10, + 6, + 11, + 6, + 12, + 6, + 13, + 6, + 14, + 6, + 15, + 6, + 16, + 6, + 17, + 6, + 18, + 6, + 19, + 7, + 0, + 7, + 1, + 7, + 2, + 7, + 3, + 7, + 4, + 7, + 5, + 7, + 6, + 7, + 7, + 7, + 8, + 7, + 9, + 7, + 10, + 7, + 11, + 7, + 12, + 7, + 13, + 7, + 14, + 7, + 15, + 7, + 16, + 7, + 17, + 7, + 18, + 7, + 19, + 8, + 0, + 8, + 1, + 8, + 2, + 8, + 3, + 8, + 4, + 8, + 5, + 8, + 6, + 8, + 7, + 8, + 8, + 8, + 9, + 8, + 10, + 8, + 11, + 8, + 12, + 8, + 13, + 8, + 14, + 8, + 15, + 8, + 16, + 8, + 17, + 8, + 18, + 8, + 19, + 9, + 0, + 9, + 1, + 9, + 2, + 9, + 3, + 9, + 4, + 9, + 5, + 9, + 6, + 9, + 7, + 9, + 8, + 9, + 9, + 9, + 10, + 9, + 11, + 9, + 12, + 9, + 13, + 9, + 14, + 9, + 15, + 9, + 16, + 9, + 17, + 9, + 18, + 9, + 19, + 10, + 0, + 10, + 1, + 10, + 2, + 10, + 3, + 10, + 4, + 10, + 5, + 10, + 6, + 10, + 7, + 10, + 8, + 10, + 9, + 10, + 10, + 10, + 11, + 10, + 12, + 10, + 13, + 10, + 14, + 10, + 15, + 10, + 16, + 10, + 17, + 10, + 18, + 10, + 19, + 11, + 0, + 11, + 1, + 11, + 2, + 11, + 3, + 11, + 4, + 11, + 5, + 11, + 6, + 11, + 7, + 11, + 8, + 11, + 9, + 11, + 10, + 11, + 11, + 11, + 12, + 11, + 13, + 11, + 14, + 11, + 15, + 11, + 16, + 11, + 17, + 11, + 18, + 11, + 19, + 12, + 0, + 12, + 1, + 12, + 2, + 12, + 3, + 12, + 4, + 12, + 5, + 12, + 6, + 12, + 7, + 12, + 8, + 12, + 9, + 12, + 10, + 12, + 11, + 12, + 12, + 12, + 13, + 12, + 14, + 12, + 15, + 12, + 16, + 12, + 17, + 12, + 18, + 12, + 19, + 13, + 0, + 13, + 1, + 13, + 2, + 13, + 3, + 13, + 4, + 13, + 5, + 13, + 6, + 13, + 7, + 13, + 8, + 13, + 9, + 13, + 10, + 13, + 11, + 13, + 12, + 13, + 13, + 13, + 14, + 13, + 15, + 13, + 16, + 13, + 17, + 13, + 18, + 13, + 19, + 14, + 0, + 14, + 1, + 14, + 2, + 14, + 3, + 14, + 4, + 14, + 5, + 14, + 6, + 14, + 7, + 14, + 8, + 14, + 9, + 14, + 10, + 14, + 11, + 14, + 12, + 14, + 13, + 14, + 14, + 14, + 15, + 14, + 16, + 14, + 17, + 14, + 18, + 14, + 19, + 15, + 0, + 15, + 1, + 15, + 2, + 15, + 3, + 15, + 4, + 15, + 5, + 15, + 6, + 15, + 7, + 15, + 8, + 15, + 9, + 15, + 10, + 15, + 11, + 15, + 12, + 15, + 13, + 15, + 14, + 15, + 15, + 15, + 16, + 15, + 17, + 15, + 18, + 15, + 19, + 16, + 0, + 16, + 1, + 16, + 2, + 16, + 3, + 16, + 4, + 16, + 5, + 16, + 6, + 16, + 7, + 16, + 8, + 16, + 9, + 16, + 10, + 16, + 11, + 16, + 12, + 16, + 13, + 16, + 14, + 16, + 15, + 16, + 16, + 16, + 17, + 16, + 18, + 16, + 19, + 17, + 0, + 17, + 1, + 17, + 2, + 17, + 3, + 17, + 4, + 17, + 5, + 17, + 6, + 17, + 7, + 17, + 8, + 17, + 9, + 17, + 10, + 17, + 11, + 17, + 12, + 17, + 13, + 17, + 14, + 17, + 15, + 17, + 16, + 17, + 17, + 17, + 18, + 17, + 19, + 18, + 0, + 18, + 1, + 18, + 2, + 18, + 3, + 18, + 4, + 18, + 5, + 18, + 6, + 18, + 7, + 18, + 8, + 18, + 9, + 18, + 10, + 18, + 11, + 18, + 12, + 18, + 13, + 18, + 14, + 18, + 15, + 18, + 16, + 18, + 17, + 18, + 18, + 18, + 19, + 19, + 0, + 19, + 1, + 19, + 2, + 19, + 3, + 19, + 4, + 19, + 5, + 19, + 6, + 19, + 7, + 19, + 8, + 19, + 9, + 19, + 10, + 19, + 11, + 19, + 12, + 19, + 13, + 19, + 14, + 19, + 15, + 19, + 16, + 19, + 17, + 19, + 18, + 19, + 19, +}; + +const Word32 c_aaiHuffDemod15[576][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 0, + 6, + 0, + 7, + 0, + 8, + 0, + 9, + 0, + 10, + 0, + 11, + 0, + 12, + 0, + 13, + 0, + 14, + 0, + 15, + 0, + 16, + 0, + 17, + 0, + 18, + 0, + 19, + 0, + 20, + 0, + 21, + 0, + 22, + 0, + 23, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 1, + 6, + 1, + 7, + 1, + 8, + 1, + 9, + 1, + 10, + 1, + 11, + 1, + 12, + 1, + 13, + 1, + 14, + 1, + 15, + 1, + 16, + 1, + 17, + 1, + 18, + 1, + 19, + 1, + 20, + 1, + 21, + 1, + 22, + 1, + 23, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 2, + 6, + 2, + 7, + 2, + 8, + 2, + 9, + 2, + 10, + 2, + 11, + 2, + 12, + 2, + 13, + 2, + 14, + 2, + 15, + 2, + 16, + 2, + 17, + 2, + 18, + 2, + 19, + 2, + 20, + 2, + 21, + 2, + 22, + 2, + 23, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 3, + 6, + 3, + 7, + 3, + 8, + 3, + 9, + 3, + 10, + 3, + 11, + 3, + 12, + 3, + 13, + 3, + 14, + 3, + 15, + 3, + 16, + 3, + 17, + 3, + 18, + 3, + 19, + 3, + 20, + 3, + 21, + 3, + 22, + 3, + 23, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 4, + 6, + 4, + 7, + 4, + 8, + 4, + 9, + 4, + 10, + 4, + 11, + 4, + 12, + 4, + 13, + 4, + 14, + 4, + 15, + 4, + 16, + 4, + 17, + 4, + 18, + 4, + 19, + 4, + 20, + 4, + 21, + 4, + 22, + 4, + 23, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 8, + 5, + 9, + 5, + 10, + 5, + 11, + 5, + 12, + 5, + 13, + 5, + 14, + 5, + 15, + 5, + 16, + 5, + 17, + 5, + 18, + 5, + 19, + 5, + 20, + 5, + 21, + 5, + 22, + 5, + 23, + 6, + 0, + 6, + 1, + 6, + 2, + 6, + 3, + 6, + 4, + 6, + 5, + 6, + 6, + 6, + 7, + 6, + 8, + 6, + 9, + 6, + 10, + 6, + 11, + 6, + 12, + 6, + 13, + 6, + 14, + 6, + 15, + 6, + 16, + 6, + 17, + 6, + 18, + 6, + 19, + 6, + 20, + 6, + 21, + 6, + 22, + 6, + 23, + 7, + 0, + 7, + 1, + 7, + 2, + 7, + 3, + 7, + 4, + 7, + 5, + 7, + 6, + 7, + 7, + 7, + 8, + 7, + 9, + 7, + 10, + 7, + 11, + 7, + 12, + 7, + 13, + 7, + 14, + 7, + 15, + 7, + 16, + 7, + 17, + 7, + 18, + 7, + 19, + 7, + 20, + 7, + 21, + 7, + 22, + 7, + 23, + 8, + 0, + 8, + 1, + 8, + 2, + 8, + 3, + 8, + 4, + 8, + 5, + 8, + 6, + 8, + 7, + 8, + 8, + 8, + 9, + 8, + 10, + 8, + 11, + 8, + 12, + 8, + 13, + 8, + 14, + 8, + 15, + 8, + 16, + 8, + 17, + 8, + 18, + 8, + 19, + 8, + 20, + 8, + 21, + 8, + 22, + 8, + 23, + 9, + 0, + 9, + 1, + 9, + 2, + 9, + 3, + 9, + 4, + 9, + 5, + 9, + 6, + 9, + 7, + 9, + 8, + 9, + 9, + 9, + 10, + 9, + 11, + 9, + 12, + 9, + 13, + 9, + 14, + 9, + 15, + 9, + 16, + 9, + 17, + 9, + 18, + 9, + 19, + 9, + 20, + 9, + 21, + 9, + 22, + 9, + 23, + 10, + 0, + 10, + 1, + 10, + 2, + 10, + 3, + 10, + 4, + 10, + 5, + 10, + 6, + 10, + 7, + 10, + 8, + 10, + 9, + 10, + 10, + 10, + 11, + 10, + 12, + 10, + 13, + 10, + 14, + 10, + 15, + 10, + 16, + 10, + 17, + 10, + 18, + 10, + 19, + 10, + 20, + 10, + 21, + 10, + 22, + 10, + 23, + 11, + 0, + 11, + 1, + 11, + 2, + 11, + 3, + 11, + 4, + 11, + 5, + 11, + 6, + 11, + 7, + 11, + 8, + 11, + 9, + 11, + 10, + 11, + 11, + 11, + 12, + 11, + 13, + 11, + 14, + 11, + 15, + 11, + 16, + 11, + 17, + 11, + 18, + 11, + 19, + 11, + 20, + 11, + 21, + 11, + 22, + 11, + 23, + 12, + 0, + 12, + 1, + 12, + 2, + 12, + 3, + 12, + 4, + 12, + 5, + 12, + 6, + 12, + 7, + 12, + 8, + 12, + 9, + 12, + 10, + 12, + 11, + 12, + 12, + 12, + 13, + 12, + 14, + 12, + 15, + 12, + 16, + 12, + 17, + 12, + 18, + 12, + 19, + 12, + 20, + 12, + 21, + 12, + 22, + 12, + 23, + 13, + 0, + 13, + 1, + 13, + 2, + 13, + 3, + 13, + 4, + 13, + 5, + 13, + 6, + 13, + 7, + 13, + 8, + 13, + 9, + 13, + 10, + 13, + 11, + 13, + 12, + 13, + 13, + 13, + 14, + 13, + 15, + 13, + 16, + 13, + 17, + 13, + 18, + 13, + 19, + 13, + 20, + 13, + 21, + 13, + 22, + 13, + 23, + 14, + 0, + 14, + 1, + 14, + 2, + 14, + 3, + 14, + 4, + 14, + 5, + 14, + 6, + 14, + 7, + 14, + 8, + 14, + 9, + 14, + 10, + 14, + 11, + 14, + 12, + 14, + 13, + 14, + 14, + 14, + 15, + 14, + 16, + 14, + 17, + 14, + 18, + 14, + 19, + 14, + 20, + 14, + 21, + 14, + 22, + 14, + 23, + 15, + 0, + 15, + 1, + 15, + 2, + 15, + 3, + 15, + 4, + 15, + 5, + 15, + 6, + 15, + 7, + 15, + 8, + 15, + 9, + 15, + 10, + 15, + 11, + 15, + 12, + 15, + 13, + 15, + 14, + 15, + 15, + 15, + 16, + 15, + 17, + 15, + 18, + 15, + 19, + 15, + 20, + 15, + 21, + 15, + 22, + 15, + 23, + 16, + 0, + 16, + 1, + 16, + 2, + 16, + 3, + 16, + 4, + 16, + 5, + 16, + 6, + 16, + 7, + 16, + 8, + 16, + 9, + 16, + 10, + 16, + 11, + 16, + 12, + 16, + 13, + 16, + 14, + 16, + 15, + 16, + 16, + 16, + 17, + 16, + 18, + 16, + 19, + 16, + 20, + 16, + 21, + 16, + 22, + 16, + 23, + 17, + 0, + 17, + 1, + 17, + 2, + 17, + 3, + 17, + 4, + 17, + 5, + 17, + 6, + 17, + 7, + 17, + 8, + 17, + 9, + 17, + 10, + 17, + 11, + 17, + 12, + 17, + 13, + 17, + 14, + 17, + 15, + 17, + 16, + 17, + 17, + 17, + 18, + 17, + 19, + 17, + 20, + 17, + 21, + 17, + 22, + 17, + 23, + 18, + 0, + 18, + 1, + 18, + 2, + 18, + 3, + 18, + 4, + 18, + 5, + 18, + 6, + 18, + 7, + 18, + 8, + 18, + 9, + 18, + 10, + 18, + 11, + 18, + 12, + 18, + 13, + 18, + 14, + 18, + 15, + 18, + 16, + 18, + 17, + 18, + 18, + 18, + 19, + 18, + 20, + 18, + 21, + 18, + 22, + 18, + 23, + 19, + 0, + 19, + 1, + 19, + 2, + 19, + 3, + 19, + 4, + 19, + 5, + 19, + 6, + 19, + 7, + 19, + 8, + 19, + 9, + 19, + 10, + 19, + 11, + 19, + 12, + 19, + 13, + 19, + 14, + 19, + 15, + 19, + 16, + 19, + 17, + 19, + 18, + 19, + 19, + 19, + 20, + 19, + 21, + 19, + 22, + 19, + 23, + 20, + 0, + 20, + 1, + 20, + 2, + 20, + 3, + 20, + 4, + 20, + 5, + 20, + 6, + 20, + 7, + 20, + 8, + 20, + 9, + 20, + 10, + 20, + 11, + 20, + 12, + 20, + 13, + 20, + 14, + 20, + 15, + 20, + 16, + 20, + 17, + 20, + 18, + 20, + 19, + 20, + 20, + 20, + 21, + 20, + 22, + 20, + 23, + 21, + 0, + 21, + 1, + 21, + 2, + 21, + 3, + 21, + 4, + 21, + 5, + 21, + 6, + 21, + 7, + 21, + 8, + 21, + 9, + 21, + 10, + 21, + 11, + 21, + 12, + 21, + 13, + 21, + 14, + 21, + 15, + 21, + 16, + 21, + 17, + 21, + 18, + 21, + 19, + 21, + 20, + 21, + 21, + 21, + 22, + 21, + 23, + 22, + 0, + 22, + 1, + 22, + 2, + 22, + 3, + 22, + 4, + 22, + 5, + 22, + 6, + 22, + 7, + 22, + 8, + 22, + 9, + 22, + 10, + 22, + 11, + 22, + 12, + 22, + 13, + 22, + 14, + 22, + 15, + 22, + 16, + 22, + 17, + 22, + 18, + 22, + 19, + 22, + 20, + 22, + 21, + 22, + 22, + 22, + 23, + 23, + 0, + 23, + 1, + 23, + 2, + 23, + 3, + 23, + 4, + 23, + 5, + 23, + 6, + 23, + 7, + 23, + 8, + 23, + 9, + 23, + 10, + 23, + 11, + 23, + 12, + 23, + 13, + 23, + 14, + 23, + 15, + 23, + 16, + 23, + 17, + 23, + 18, + 23, + 19, + 23, + 20, + 23, + 21, + 23, + 22, + 23, + 23, +}; + +const Word32 c_aaiHuffDemod16[729][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 0, + 6, + 0, + 7, + 0, + 8, + 0, + 9, + 0, + 10, + 0, + 11, + 0, + 12, + 0, + 13, + 0, + 14, + 0, + 15, + 0, + 16, + 0, + 17, + 0, + 18, + 0, + 19, + 0, + 20, + 0, + 21, + 0, + 22, + 0, + 23, + 0, + 24, + 0, + 25, + 0, + 26, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 1, + 6, + 1, + 7, + 1, + 8, + 1, + 9, + 1, + 10, + 1, + 11, + 1, + 12, + 1, + 13, + 1, + 14, + 1, + 15, + 1, + 16, + 1, + 17, + 1, + 18, + 1, + 19, + 1, + 20, + 1, + 21, + 1, + 22, + 1, + 23, + 1, + 24, + 1, + 25, + 1, + 26, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 2, + 6, + 2, + 7, + 2, + 8, + 2, + 9, + 2, + 10, + 2, + 11, + 2, + 12, + 2, + 13, + 2, + 14, + 2, + 15, + 2, + 16, + 2, + 17, + 2, + 18, + 2, + 19, + 2, + 20, + 2, + 21, + 2, + 22, + 2, + 23, + 2, + 24, + 2, + 25, + 2, + 26, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 3, + 6, + 3, + 7, + 3, + 8, + 3, + 9, + 3, + 10, + 3, + 11, + 3, + 12, + 3, + 13, + 3, + 14, + 3, + 15, + 3, + 16, + 3, + 17, + 3, + 18, + 3, + 19, + 3, + 20, + 3, + 21, + 3, + 22, + 3, + 23, + 3, + 24, + 3, + 25, + 3, + 26, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 4, + 6, + 4, + 7, + 4, + 8, + 4, + 9, + 4, + 10, + 4, + 11, + 4, + 12, + 4, + 13, + 4, + 14, + 4, + 15, + 4, + 16, + 4, + 17, + 4, + 18, + 4, + 19, + 4, + 20, + 4, + 21, + 4, + 22, + 4, + 23, + 4, + 24, + 4, + 25, + 4, + 26, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 8, + 5, + 9, + 5, + 10, + 5, + 11, + 5, + 12, + 5, + 13, + 5, + 14, + 5, + 15, + 5, + 16, + 5, + 17, + 5, + 18, + 5, + 19, + 5, + 20, + 5, + 21, + 5, + 22, + 5, + 23, + 5, + 24, + 5, + 25, + 5, + 26, + 6, + 0, + 6, + 1, + 6, + 2, + 6, + 3, + 6, + 4, + 6, + 5, + 6, + 6, + 6, + 7, + 6, + 8, + 6, + 9, + 6, + 10, + 6, + 11, + 6, + 12, + 6, + 13, + 6, + 14, + 6, + 15, + 6, + 16, + 6, + 17, + 6, + 18, + 6, + 19, + 6, + 20, + 6, + 21, + 6, + 22, + 6, + 23, + 6, + 24, + 6, + 25, + 6, + 26, + 7, + 0, + 7, + 1, + 7, + 2, + 7, + 3, + 7, + 4, + 7, + 5, + 7, + 6, + 7, + 7, + 7, + 8, + 7, + 9, + 7, + 10, + 7, + 11, + 7, + 12, + 7, + 13, + 7, + 14, + 7, + 15, + 7, + 16, + 7, + 17, + 7, + 18, + 7, + 19, + 7, + 20, + 7, + 21, + 7, + 22, + 7, + 23, + 7, + 24, + 7, + 25, + 7, + 26, + 8, + 0, + 8, + 1, + 8, + 2, + 8, + 3, + 8, + 4, + 8, + 5, + 8, + 6, + 8, + 7, + 8, + 8, + 8, + 9, + 8, + 10, + 8, + 11, + 8, + 12, + 8, + 13, + 8, + 14, + 8, + 15, + 8, + 16, + 8, + 17, + 8, + 18, + 8, + 19, + 8, + 20, + 8, + 21, + 8, + 22, + 8, + 23, + 8, + 24, + 8, + 25, + 8, + 26, + 9, + 0, + 9, + 1, + 9, + 2, + 9, + 3, + 9, + 4, + 9, + 5, + 9, + 6, + 9, + 7, + 9, + 8, + 9, + 9, + 9, + 10, + 9, + 11, + 9, + 12, + 9, + 13, + 9, + 14, + 9, + 15, + 9, + 16, + 9, + 17, + 9, + 18, + 9, + 19, + 9, + 20, + 9, + 21, + 9, + 22, + 9, + 23, + 9, + 24, + 9, + 25, + 9, + 26, + 10, + 0, + 10, + 1, + 10, + 2, + 10, + 3, + 10, + 4, + 10, + 5, + 10, + 6, + 10, + 7, + 10, + 8, + 10, + 9, + 10, + 10, + 10, + 11, + 10, + 12, + 10, + 13, + 10, + 14, + 10, + 15, + 10, + 16, + 10, + 17, + 10, + 18, + 10, + 19, + 10, + 20, + 10, + 21, + 10, + 22, + 10, + 23, + 10, + 24, + 10, + 25, + 10, + 26, + 11, + 0, + 11, + 1, + 11, + 2, + 11, + 3, + 11, + 4, + 11, + 5, + 11, + 6, + 11, + 7, + 11, + 8, + 11, + 9, + 11, + 10, + 11, + 11, + 11, + 12, + 11, + 13, + 11, + 14, + 11, + 15, + 11, + 16, + 11, + 17, + 11, + 18, + 11, + 19, + 11, + 20, + 11, + 21, + 11, + 22, + 11, + 23, + 11, + 24, + 11, + 25, + 11, + 26, + 12, + 0, + 12, + 1, + 12, + 2, + 12, + 3, + 12, + 4, + 12, + 5, + 12, + 6, + 12, + 7, + 12, + 8, + 12, + 9, + 12, + 10, + 12, + 11, + 12, + 12, + 12, + 13, + 12, + 14, + 12, + 15, + 12, + 16, + 12, + 17, + 12, + 18, + 12, + 19, + 12, + 20, + 12, + 21, + 12, + 22, + 12, + 23, + 12, + 24, + 12, + 25, + 12, + 26, + 13, + 0, + 13, + 1, + 13, + 2, + 13, + 3, + 13, + 4, + 13, + 5, + 13, + 6, + 13, + 7, + 13, + 8, + 13, + 9, + 13, + 10, + 13, + 11, + 13, + 12, + 13, + 13, + 13, + 14, + 13, + 15, + 13, + 16, + 13, + 17, + 13, + 18, + 13, + 19, + 13, + 20, + 13, + 21, + 13, + 22, + 13, + 23, + 13, + 24, + 13, + 25, + 13, + 26, + 14, + 0, + 14, + 1, + 14, + 2, + 14, + 3, + 14, + 4, + 14, + 5, + 14, + 6, + 14, + 7, + 14, + 8, + 14, + 9, + 14, + 10, + 14, + 11, + 14, + 12, + 14, + 13, + 14, + 14, + 14, + 15, + 14, + 16, + 14, + 17, + 14, + 18, + 14, + 19, + 14, + 20, + 14, + 21, + 14, + 22, + 14, + 23, + 14, + 24, + 14, + 25, + 14, + 26, + 15, + 0, + 15, + 1, + 15, + 2, + 15, + 3, + 15, + 4, + 15, + 5, + 15, + 6, + 15, + 7, + 15, + 8, + 15, + 9, + 15, + 10, + 15, + 11, + 15, + 12, + 15, + 13, + 15, + 14, + 15, + 15, + 15, + 16, + 15, + 17, + 15, + 18, + 15, + 19, + 15, + 20, + 15, + 21, + 15, + 22, + 15, + 23, + 15, + 24, + 15, + 25, + 15, + 26, + 16, + 0, + 16, + 1, + 16, + 2, + 16, + 3, + 16, + 4, + 16, + 5, + 16, + 6, + 16, + 7, + 16, + 8, + 16, + 9, + 16, + 10, + 16, + 11, + 16, + 12, + 16, + 13, + 16, + 14, + 16, + 15, + 16, + 16, + 16, + 17, + 16, + 18, + 16, + 19, + 16, + 20, + 16, + 21, + 16, + 22, + 16, + 23, + 16, + 24, + 16, + 25, + 16, + 26, + 17, + 0, + 17, + 1, + 17, + 2, + 17, + 3, + 17, + 4, + 17, + 5, + 17, + 6, + 17, + 7, + 17, + 8, + 17, + 9, + 17, + 10, + 17, + 11, + 17, + 12, + 17, + 13, + 17, + 14, + 17, + 15, + 17, + 16, + 17, + 17, + 17, + 18, + 17, + 19, + 17, + 20, + 17, + 21, + 17, + 22, + 17, + 23, + 17, + 24, + 17, + 25, + 17, + 26, + 18, + 0, + 18, + 1, + 18, + 2, + 18, + 3, + 18, + 4, + 18, + 5, + 18, + 6, + 18, + 7, + 18, + 8, + 18, + 9, + 18, + 10, + 18, + 11, + 18, + 12, + 18, + 13, + 18, + 14, + 18, + 15, + 18, + 16, + 18, + 17, + 18, + 18, + 18, + 19, + 18, + 20, + 18, + 21, + 18, + 22, + 18, + 23, + 18, + 24, + 18, + 25, + 18, + 26, + 19, + 0, + 19, + 1, + 19, + 2, + 19, + 3, + 19, + 4, + 19, + 5, + 19, + 6, + 19, + 7, + 19, + 8, + 19, + 9, + 19, + 10, + 19, + 11, + 19, + 12, + 19, + 13, + 19, + 14, + 19, + 15, + 19, + 16, + 19, + 17, + 19, + 18, + 19, + 19, + 19, + 20, + 19, + 21, + 19, + 22, + 19, + 23, + 19, + 24, + 19, + 25, + 19, + 26, + 20, + 0, + 20, + 1, + 20, + 2, + 20, + 3, + 20, + 4, + 20, + 5, + 20, + 6, + 20, + 7, + 20, + 8, + 20, + 9, + 20, + 10, + 20, + 11, + 20, + 12, + 20, + 13, + 20, + 14, + 20, + 15, + 20, + 16, + 20, + 17, + 20, + 18, + 20, + 19, + 20, + 20, + 20, + 21, + 20, + 22, + 20, + 23, + 20, + 24, + 20, + 25, + 20, + 26, + 21, + 0, + 21, + 1, + 21, + 2, + 21, + 3, + 21, + 4, + 21, + 5, + 21, + 6, + 21, + 7, + 21, + 8, + 21, + 9, + 21, + 10, + 21, + 11, + 21, + 12, + 21, + 13, + 21, + 14, + 21, + 15, + 21, + 16, + 21, + 17, + 21, + 18, + 21, + 19, + 21, + 20, + 21, + 21, + 21, + 22, + 21, + 23, + 21, + 24, + 21, + 25, + 21, + 26, + 22, + 0, + 22, + 1, + 22, + 2, + 22, + 3, + 22, + 4, + 22, + 5, + 22, + 6, + 22, + 7, + 22, + 8, + 22, + 9, + 22, + 10, + 22, + 11, + 22, + 12, + 22, + 13, + 22, + 14, + 22, + 15, + 22, + 16, + 22, + 17, + 22, + 18, + 22, + 19, + 22, + 20, + 22, + 21, + 22, + 22, + 22, + 23, + 22, + 24, + 22, + 25, + 22, + 26, + 23, + 0, + 23, + 1, + 23, + 2, + 23, + 3, + 23, + 4, + 23, + 5, + 23, + 6, + 23, + 7, + 23, + 8, + 23, + 9, + 23, + 10, + 23, + 11, + 23, + 12, + 23, + 13, + 23, + 14, + 23, + 15, + 23, + 16, + 23, + 17, + 23, + 18, + 23, + 19, + 23, + 20, + 23, + 21, + 23, + 22, + 23, + 23, + 23, + 24, + 23, + 25, + 23, + 26, + 24, + 0, + 24, + 1, + 24, + 2, + 24, + 3, + 24, + 4, + 24, + 5, + 24, + 6, + 24, + 7, + 24, + 8, + 24, + 9, + 24, + 10, + 24, + 11, + 24, + 12, + 24, + 13, + 24, + 14, + 24, + 15, + 24, + 16, + 24, + 17, + 24, + 18, + 24, + 19, + 24, + 20, + 24, + 21, + 24, + 22, + 24, + 23, + 24, + 24, + 24, + 25, + 24, + 26, + 25, + 0, + 25, + 1, + 25, + 2, + 25, + 3, + 25, + 4, + 25, + 5, + 25, + 6, + 25, + 7, + 25, + 8, + 25, + 9, + 25, + 10, + 25, + 11, + 25, + 12, + 25, + 13, + 25, + 14, + 25, + 15, + 25, + 16, + 25, + 17, + 25, + 18, + 25, + 19, + 25, + 20, + 25, + 21, + 25, + 22, + 25, + 23, + 25, + 24, + 25, + 25, + 25, + 26, + 26, + 0, + 26, + 1, + 26, + 2, + 26, + 3, + 26, + 4, + 26, + 5, + 26, + 6, + 26, + 7, + 26, + 8, + 26, + 9, + 26, + 10, + 26, + 11, + 26, + 12, + 26, + 13, + 26, + 14, + 26, + 15, + 26, + 16, + 26, + 17, + 26, + 18, + 26, + 19, + 26, + 20, + 26, + 21, + 26, + 22, + 26, + 23, + 26, + 24, + 26, + 25, + 26, + 26, +}; + +const Word32 c_aaiHuffDemod17[729][2] = { + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 0, + 6, + 0, + 7, + 0, + 8, + 0, + 9, + 0, + 10, + 0, + 11, + 0, + 12, + 0, + 13, + 0, + 14, + 0, + 15, + 0, + 16, + 0, + 17, + 0, + 18, + 0, + 19, + 0, + 20, + 0, + 21, + 0, + 22, + 0, + 23, + 0, + 24, + 0, + 25, + 0, + 26, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 3, + 1, + 4, + 1, + 5, + 1, + 6, + 1, + 7, + 1, + 8, + 1, + 9, + 1, + 10, + 1, + 11, + 1, + 12, + 1, + 13, + 1, + 14, + 1, + 15, + 1, + 16, + 1, + 17, + 1, + 18, + 1, + 19, + 1, + 20, + 1, + 21, + 1, + 22, + 1, + 23, + 1, + 24, + 1, + 25, + 1, + 26, + 2, + 0, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 4, + 2, + 5, + 2, + 6, + 2, + 7, + 2, + 8, + 2, + 9, + 2, + 10, + 2, + 11, + 2, + 12, + 2, + 13, + 2, + 14, + 2, + 15, + 2, + 16, + 2, + 17, + 2, + 18, + 2, + 19, + 2, + 20, + 2, + 21, + 2, + 22, + 2, + 23, + 2, + 24, + 2, + 25, + 2, + 26, + 3, + 0, + 3, + 1, + 3, + 2, + 3, + 3, + 3, + 4, + 3, + 5, + 3, + 6, + 3, + 7, + 3, + 8, + 3, + 9, + 3, + 10, + 3, + 11, + 3, + 12, + 3, + 13, + 3, + 14, + 3, + 15, + 3, + 16, + 3, + 17, + 3, + 18, + 3, + 19, + 3, + 20, + 3, + 21, + 3, + 22, + 3, + 23, + 3, + 24, + 3, + 25, + 3, + 26, + 4, + 0, + 4, + 1, + 4, + 2, + 4, + 3, + 4, + 4, + 4, + 5, + 4, + 6, + 4, + 7, + 4, + 8, + 4, + 9, + 4, + 10, + 4, + 11, + 4, + 12, + 4, + 13, + 4, + 14, + 4, + 15, + 4, + 16, + 4, + 17, + 4, + 18, + 4, + 19, + 4, + 20, + 4, + 21, + 4, + 22, + 4, + 23, + 4, + 24, + 4, + 25, + 4, + 26, + 5, + 0, + 5, + 1, + 5, + 2, + 5, + 3, + 5, + 4, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 8, + 5, + 9, + 5, + 10, + 5, + 11, + 5, + 12, + 5, + 13, + 5, + 14, + 5, + 15, + 5, + 16, + 5, + 17, + 5, + 18, + 5, + 19, + 5, + 20, + 5, + 21, + 5, + 22, + 5, + 23, + 5, + 24, + 5, + 25, + 5, + 26, + 6, + 0, + 6, + 1, + 6, + 2, + 6, + 3, + 6, + 4, + 6, + 5, + 6, + 6, + 6, + 7, + 6, + 8, + 6, + 9, + 6, + 10, + 6, + 11, + 6, + 12, + 6, + 13, + 6, + 14, + 6, + 15, + 6, + 16, + 6, + 17, + 6, + 18, + 6, + 19, + 6, + 20, + 6, + 21, + 6, + 22, + 6, + 23, + 6, + 24, + 6, + 25, + 6, + 26, + 7, + 0, + 7, + 1, + 7, + 2, + 7, + 3, + 7, + 4, + 7, + 5, + 7, + 6, + 7, + 7, + 7, + 8, + 7, + 9, + 7, + 10, + 7, + 11, + 7, + 12, + 7, + 13, + 7, + 14, + 7, + 15, + 7, + 16, + 7, + 17, + 7, + 18, + 7, + 19, + 7, + 20, + 7, + 21, + 7, + 22, + 7, + 23, + 7, + 24, + 7, + 25, + 7, + 26, + 8, + 0, + 8, + 1, + 8, + 2, + 8, + 3, + 8, + 4, + 8, + 5, + 8, + 6, + 8, + 7, + 8, + 8, + 8, + 9, + 8, + 10, + 8, + 11, + 8, + 12, + 8, + 13, + 8, + 14, + 8, + 15, + 8, + 16, + 8, + 17, + 8, + 18, + 8, + 19, + 8, + 20, + 8, + 21, + 8, + 22, + 8, + 23, + 8, + 24, + 8, + 25, + 8, + 26, + 9, + 0, + 9, + 1, + 9, + 2, + 9, + 3, + 9, + 4, + 9, + 5, + 9, + 6, + 9, + 7, + 9, + 8, + 9, + 9, + 9, + 10, + 9, + 11, + 9, + 12, + 9, + 13, + 9, + 14, + 9, + 15, + 9, + 16, + 9, + 17, + 9, + 18, + 9, + 19, + 9, + 20, + 9, + 21, + 9, + 22, + 9, + 23, + 9, + 24, + 9, + 25, + 9, + 26, + 10, + 0, + 10, + 1, + 10, + 2, + 10, + 3, + 10, + 4, + 10, + 5, + 10, + 6, + 10, + 7, + 10, + 8, + 10, + 9, + 10, + 10, + 10, + 11, + 10, + 12, + 10, + 13, + 10, + 14, + 10, + 15, + 10, + 16, + 10, + 17, + 10, + 18, + 10, + 19, + 10, + 20, + 10, + 21, + 10, + 22, + 10, + 23, + 10, + 24, + 10, + 25, + 10, + 26, + 11, + 0, + 11, + 1, + 11, + 2, + 11, + 3, + 11, + 4, + 11, + 5, + 11, + 6, + 11, + 7, + 11, + 8, + 11, + 9, + 11, + 10, + 11, + 11, + 11, + 12, + 11, + 13, + 11, + 14, + 11, + 15, + 11, + 16, + 11, + 17, + 11, + 18, + 11, + 19, + 11, + 20, + 11, + 21, + 11, + 22, + 11, + 23, + 11, + 24, + 11, + 25, + 11, + 26, + 12, + 0, + 12, + 1, + 12, + 2, + 12, + 3, + 12, + 4, + 12, + 5, + 12, + 6, + 12, + 7, + 12, + 8, + 12, + 9, + 12, + 10, + 12, + 11, + 12, + 12, + 12, + 13, + 12, + 14, + 12, + 15, + 12, + 16, + 12, + 17, + 12, + 18, + 12, + 19, + 12, + 20, + 12, + 21, + 12, + 22, + 12, + 23, + 12, + 24, + 12, + 25, + 12, + 26, + 13, + 0, + 13, + 1, + 13, + 2, + 13, + 3, + 13, + 4, + 13, + 5, + 13, + 6, + 13, + 7, + 13, + 8, + 13, + 9, + 13, + 10, + 13, + 11, + 13, + 12, + 13, + 13, + 13, + 14, + 13, + 15, + 13, + 16, + 13, + 17, + 13, + 18, + 13, + 19, + 13, + 20, + 13, + 21, + 13, + 22, + 13, + 23, + 13, + 24, + 13, + 25, + 13, + 26, + 14, + 0, + 14, + 1, + 14, + 2, + 14, + 3, + 14, + 4, + 14, + 5, + 14, + 6, + 14, + 7, + 14, + 8, + 14, + 9, + 14, + 10, + 14, + 11, + 14, + 12, + 14, + 13, + 14, + 14, + 14, + 15, + 14, + 16, + 14, + 17, + 14, + 18, + 14, + 19, + 14, + 20, + 14, + 21, + 14, + 22, + 14, + 23, + 14, + 24, + 14, + 25, + 14, + 26, + 15, + 0, + 15, + 1, + 15, + 2, + 15, + 3, + 15, + 4, + 15, + 5, + 15, + 6, + 15, + 7, + 15, + 8, + 15, + 9, + 15, + 10, + 15, + 11, + 15, + 12, + 15, + 13, + 15, + 14, + 15, + 15, + 15, + 16, + 15, + 17, + 15, + 18, + 15, + 19, + 15, + 20, + 15, + 21, + 15, + 22, + 15, + 23, + 15, + 24, + 15, + 25, + 15, + 26, + 16, + 0, + 16, + 1, + 16, + 2, + 16, + 3, + 16, + 4, + 16, + 5, + 16, + 6, + 16, + 7, + 16, + 8, + 16, + 9, + 16, + 10, + 16, + 11, + 16, + 12, + 16, + 13, + 16, + 14, + 16, + 15, + 16, + 16, + 16, + 17, + 16, + 18, + 16, + 19, + 16, + 20, + 16, + 21, + 16, + 22, + 16, + 23, + 16, + 24, + 16, + 25, + 16, + 26, + 17, + 0, + 17, + 1, + 17, + 2, + 17, + 3, + 17, + 4, + 17, + 5, + 17, + 6, + 17, + 7, + 17, + 8, + 17, + 9, + 17, + 10, + 17, + 11, + 17, + 12, + 17, + 13, + 17, + 14, + 17, + 15, + 17, + 16, + 17, + 17, + 17, + 18, + 17, + 19, + 17, + 20, + 17, + 21, + 17, + 22, + 17, + 23, + 17, + 24, + 17, + 25, + 17, + 26, + 18, + 0, + 18, + 1, + 18, + 2, + 18, + 3, + 18, + 4, + 18, + 5, + 18, + 6, + 18, + 7, + 18, + 8, + 18, + 9, + 18, + 10, + 18, + 11, + 18, + 12, + 18, + 13, + 18, + 14, + 18, + 15, + 18, + 16, + 18, + 17, + 18, + 18, + 18, + 19, + 18, + 20, + 18, + 21, + 18, + 22, + 18, + 23, + 18, + 24, + 18, + 25, + 18, + 26, + 19, + 0, + 19, + 1, + 19, + 2, + 19, + 3, + 19, + 4, + 19, + 5, + 19, + 6, + 19, + 7, + 19, + 8, + 19, + 9, + 19, + 10, + 19, + 11, + 19, + 12, + 19, + 13, + 19, + 14, + 19, + 15, + 19, + 16, + 19, + 17, + 19, + 18, + 19, + 19, + 19, + 20, + 19, + 21, + 19, + 22, + 19, + 23, + 19, + 24, + 19, + 25, + 19, + 26, + 20, + 0, + 20, + 1, + 20, + 2, + 20, + 3, + 20, + 4, + 20, + 5, + 20, + 6, + 20, + 7, + 20, + 8, + 20, + 9, + 20, + 10, + 20, + 11, + 20, + 12, + 20, + 13, + 20, + 14, + 20, + 15, + 20, + 16, + 20, + 17, + 20, + 18, + 20, + 19, + 20, + 20, + 20, + 21, + 20, + 22, + 20, + 23, + 20, + 24, + 20, + 25, + 20, + 26, + 21, + 0, + 21, + 1, + 21, + 2, + 21, + 3, + 21, + 4, + 21, + 5, + 21, + 6, + 21, + 7, + 21, + 8, + 21, + 9, + 21, + 10, + 21, + 11, + 21, + 12, + 21, + 13, + 21, + 14, + 21, + 15, + 21, + 16, + 21, + 17, + 21, + 18, + 21, + 19, + 21, + 20, + 21, + 21, + 21, + 22, + 21, + 23, + 21, + 24, + 21, + 25, + 21, + 26, + 22, + 0, + 22, + 1, + 22, + 2, + 22, + 3, + 22, + 4, + 22, + 5, + 22, + 6, + 22, + 7, + 22, + 8, + 22, + 9, + 22, + 10, + 22, + 11, + 22, + 12, + 22, + 13, + 22, + 14, + 22, + 15, + 22, + 16, + 22, + 17, + 22, + 18, + 22, + 19, + 22, + 20, + 22, + 21, + 22, + 22, + 22, + 23, + 22, + 24, + 22, + 25, + 22, + 26, + 23, + 0, + 23, + 1, + 23, + 2, + 23, + 3, + 23, + 4, + 23, + 5, + 23, + 6, + 23, + 7, + 23, + 8, + 23, + 9, + 23, + 10, + 23, + 11, + 23, + 12, + 23, + 13, + 23, + 14, + 23, + 15, + 23, + 16, + 23, + 17, + 23, + 18, + 23, + 19, + 23, + 20, + 23, + 21, + 23, + 22, + 23, + 23, + 23, + 24, + 23, + 25, + 23, + 26, + 24, + 0, + 24, + 1, + 24, + 2, + 24, + 3, + 24, + 4, + 24, + 5, + 24, + 6, + 24, + 7, + 24, + 8, + 24, + 9, + 24, + 10, + 24, + 11, + 24, + 12, + 24, + 13, + 24, + 14, + 24, + 15, + 24, + 16, + 24, + 17, + 24, + 18, + 24, + 19, + 24, + 20, + 24, + 21, + 24, + 22, + 24, + 23, + 24, + 24, + 24, + 25, + 24, + 26, + 25, + 0, + 25, + 1, + 25, + 2, + 25, + 3, + 25, + 4, + 25, + 5, + 25, + 6, + 25, + 7, + 25, + 8, + 25, + 9, + 25, + 10, + 25, + 11, + 25, + 12, + 25, + 13, + 25, + 14, + 25, + 15, + 25, + 16, + 25, + 17, + 25, + 18, + 25, + 19, + 25, + 20, + 25, + 21, + 25, + 22, + 25, + 23, + 25, + 24, + 25, + 25, + 25, + 26, + 26, + 0, + 26, + 1, + 26, + 2, + 26, + 3, + 26, + 4, + 26, + 5, + 26, + 6, + 26, + 7, + 26, + 8, + 26, + 9, + 26, + 10, + 26, + 11, + 26, + 12, + 26, + 13, + 26, + 14, + 26, + 15, + 26, + 16, + 26, + 17, + 26, + 18, + 26, + 19, + 26, + 20, + 26, + 21, + 26, + 22, + 26, + 23, + 26, + 24, + 26, + 25, + 26, + 26, +}; + +const Word32 ( *c_apaiDemodTables[ALLOC_TABLE_SIZE] )[2] = { + NULL, + c_aaiHuffDemod1, + c_aaiHuffDemod2, + c_aaiHuffDemod3, + c_aaiHuffDemod4, + c_aaiHuffDemod5, + c_aaiHuffDemod6, + c_aaiHuffDemod7, + c_aaiHuffDemod8, + c_aaiHuffDemod9, + c_aaiHuffDemod10, + c_aaiHuffDemod11, + c_aaiHuffDemod12, + c_aaiHuffDemod13, + c_aaiHuffDemod14, + c_aaiHuffDemod15, + c_aaiHuffDemod16, + c_aaiHuffDemod17, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, +}; +#endif + +const Word16 c_aiLogAddTable_fx[LOG_ADD_TABLE_LENGTH] = { + 0x40, + 0x40, + 0x3F, + 0x3F, + 0x3E, + 0x3E, + 0x3D, + 0x3D, + 0x3C, + 0x3C, + 0x3B, + 0x3B, + 0x3A, + 0x3A, + 0x39, + 0x39, + 0x38, + 0x38, + 0x37, + 0x37, + 0x37, + 0x36, + 0x36, + 0x35, + 0x35, + 0x34, + 0x34, + 0x33, + 0x33, + 0x33, + 0x32, + 0x32, + 0x31, + 0x31, + 0x31, + 0x30, + 0x30, + 0x2F, + 0x2F, + 0x2F, + 0x2E, + 0x2E, + 0x2D, + 0x2D, + 0x2D, + 0x2C, + 0x2C, + 0x2B, + 0x2B, + 0x2B, + 0x2A, + 0x2A, + 0x2A, + 0x29, + 0x29, + 0x29, + 0x28, + 0x28, + 0x27, + 0x27, + 0x27, + 0x26, + 0x26, + 0x26, + 0x25, + 0x25, + 0x25, + 0x24, + 0x24, + 0x24, + 0x23, + 0x23, + 0x23, + 0x23, + 0x22, + 0x22, + 0x22, + 0x21, + 0x21, + 0x21, + 0x20, + 0x20, + 0x20, + 0x20, + 0x1F, + 0x1F, + 0x1F, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1D, + 0x1D, + 0x1D, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1B, + 0x1B, + 0x1B, + 0x1B, + 0x1A, + 0x1A, + 0x1A, + 0x1A, + 0x19, + 0x19, + 0x19, + 0x19, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x17, + 0x17, + 0x17, + 0x17, + 0x16, + 0x16, + 0x16, + 0x16, + 0x16, + 0x15, + 0x15, + 0x15, + 0x15, + 0x15, + 0x14, + 0x14, + 0x14, + 0x14, + 0x14, + 0x13, + 0x13, + 0x13, + 0x13, + 0x13, + 0x13, + 0x12, + 0x12, + 0x12, + 0x12, + 0x12, + 0x11, + 0x11, + 0x11, + 0x11, + 0x11, + 0x11, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0D, + 0x0D, + 0x0D, + 0x0D, + 0x0D, + 0x0D, + 0x0D, + 0x0D, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0B, + 0x0B, + 0x0B, + 0x0B, + 0x0B, + 0x0B, + 0x0B, + 0x0B, + 0x0B, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x09, + 0x09, + 0x09, + 0x09, + 0x09, + 0x09, + 0x09, + 0x09, + 0x09, + 0x09, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, +}; + +const Word32 c_aiLogAddTable[LOG_ADD_TABLE_LENGTH] = { + 0x40, + 0x40, + 0x3F, + 0x3F, + 0x3E, + 0x3E, + 0x3D, + 0x3D, + 0x3C, + 0x3C, + 0x3B, + 0x3B, + 0x3A, + 0x3A, + 0x39, + 0x39, + 0x38, + 0x38, + 0x37, + 0x37, + 0x37, + 0x36, + 0x36, + 0x35, + 0x35, + 0x34, + 0x34, + 0x33, + 0x33, + 0x33, + 0x32, + 0x32, + 0x31, + 0x31, + 0x31, + 0x30, + 0x30, + 0x2F, + 0x2F, + 0x2F, + 0x2E, + 0x2E, + 0x2D, + 0x2D, + 0x2D, + 0x2C, + 0x2C, + 0x2B, + 0x2B, + 0x2B, + 0x2A, + 0x2A, + 0x2A, + 0x29, + 0x29, + 0x29, + 0x28, + 0x28, + 0x27, + 0x27, + 0x27, + 0x26, + 0x26, + 0x26, + 0x25, + 0x25, + 0x25, + 0x24, + 0x24, + 0x24, + 0x23, + 0x23, + 0x23, + 0x23, + 0x22, + 0x22, + 0x22, + 0x21, + 0x21, + 0x21, + 0x20, + 0x20, + 0x20, + 0x20, + 0x1F, + 0x1F, + 0x1F, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1D, + 0x1D, + 0x1D, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1B, + 0x1B, + 0x1B, + 0x1B, + 0x1A, + 0x1A, + 0x1A, + 0x1A, + 0x19, + 0x19, + 0x19, + 0x19, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x17, + 0x17, + 0x17, + 0x17, + 0x16, + 0x16, + 0x16, + 0x16, + 0x16, + 0x15, + 0x15, + 0x15, + 0x15, + 0x15, + 0x14, + 0x14, + 0x14, + 0x14, + 0x14, + 0x13, + 0x13, + 0x13, + 0x13, + 0x13, + 0x13, + 0x12, + 0x12, + 0x12, + 0x12, + 0x12, + 0x11, + 0x11, + 0x11, + 0x11, + 0x11, + 0x11, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0D, + 0x0D, + 0x0D, + 0x0D, + 0x0D, + 0x0D, + 0x0D, + 0x0D, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0B, + 0x0B, + 0x0B, + 0x0B, + 0x0B, + 0x0B, + 0x0B, + 0x0B, + 0x0B, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x09, + 0x09, + 0x09, + 0x09, + 0x09, + 0x09, + 0x09, + 0x09, + 0x09, + 0x09, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x05, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x02, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, +}; + +const Word16 c_aiBandwidthAdjust48_fx[MAX_BANDS_48] = { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 64, + 64, + 64, + 64, + 64, + 101, + 101, + 128, + 165, + 165, + 180, + 213, +}; + +const Word32 c_aiBandwidthAdjust48[MAX_BANDS_48] = { + + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 64, + 64, + 64, + 64, + 64, + 101, + 101, + 128, + 165, + 165, + 180, + 213, +}; + +const Word16 c_aiAbsoluteThresh48_fx[MAX_BANDS_48] = { + -1787, + -1787, + -1787, + -1787, + -1787, + -1787, + -1787, + -1787, + -1782, + -1761, + -1737, + -1679, + -1638, + -1613, + -1590, + -1568, + -1516, + -1459, + -1395, + -1289, + -671, + -409, + -401, +}; + +const Word32 c_aiAbsoluteThresh48[MAX_BANDS_48] = { + -1787, + -1787, + -1787, + -1787, + -1787, + -1787, + -1787, + -1787, + -1782, + -1761, + -1737, + -1679, + -1638, + -1613, + -1590, + -1568, + -1516, + -1459, + -1395, + -1289, + -671, + -409, + -401, +}; + +#if PERCEPTUAL_MODEL_SLGAIN_SHIFT == 4 +const Word32 c_aiDefaultTheta48[MAX_BANDS_48] = { + 7, + 7, + 6, + 5, + 5, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, +}; +#elif PERCEPTUAL_MODEL_SLGAIN_SHIFT == 8 +const Word16 c_aiDefaultTheta48_fx[MAX_BANDS_48] = { + + 112, + 112, + 96, + 80, + 80, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, +}; +#endif +const Word32 c_aiDefaultTheta48[MAX_BANDS_48] = { + + 112, + 112, + 96, + 80, + 80, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, + 64, +}; +const Word16 c_aaiSpreadFunction48_fx[MAX_BANDS_48 * MAX_BANDS_48] = { + 0, + -1561, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -289, + -4, + -1234, + -2295, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -569, + -229, + -8, + -905, + -1705, + -2324, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -789, + -445, + -173, + -16, + -656, + -1271, + -1765, + -2172, + -2520, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -961, + -616, + -340, + -136, + -28, + -488, + -976, + -1382, + -1729, + -2032, + -2305, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -1088, + -743, + -465, + -257, + -148, + -31, + -371, + -769, + -1114, + -1417, + -1689, + -2054, + -2483, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -1198, + -852, + -574, + -364, + -209, + -148, + -42, + -300, + -635, + -936, + -1207, + -1572, + -2000, + -2376, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -1293, + -948, + -669, + -458, + -301, + -183, + -145, + -56, + -258, + -547, + -816, + -1179, + -1606, + -1982, + -2311, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -1375, + -1029, + -750, + -539, + -381, + -260, + -180, + -142, + -68, + -231, + -487, + -846, + -1272, + -1647, + -1976, + -2261, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -1444, + -1099, + -820, + -608, + -449, + -328, + -233, + -194, + -138, + -77, + -213, + -555, + -978, + -1352, + -1681, + -1966, + -2268, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -1501, + -1155, + -876, + -665, + -505, + -383, + -287, + -210, + -193, + -130, + -79, + -298, + -711, + -1083, + -1411, + -1696, + -1997, + -2288, + -2550, + -2552, + -2552, + -2552, + -2552, + -1567, + -1221, + -942, + -730, + -570, + -448, + -351, + -272, + -206, + -189, + -151, + -72, + -349, + -713, + -1039, + -1324, + -1625, + -1915, + -2177, + -2448, + -2552, + -2552, + -2552, + -1650, + -1304, + -1025, + -813, + -653, + -530, + -432, + -352, + -285, + -227, + -177, + -163, + -69, + -297, + -613, + -895, + -1195, + -1485, + -1746, + -2017, + -2238, + -2401, + -2545, + -1727, + -1381, + -1102, + -890, + -730, + -607, + -509, + -428, + -360, + -301, + -249, + -180, + -153, + -72, + -257, + -527, + -824, + -1112, + -1373, + -1643, + -1865, + -2028, + -2171, + -1798, + -1452, + -1173, + -960, + -800, + -677, + -579, + -498, + -430, + -370, + -317, + -246, + -192, + -145, + -76, + -224, + -505, + -790, + -1050, + -1320, + -1540, + -1703, + -1847, + -1860, + -1514, + -1234, + -1022, + -862, + -738, + -640, + -559, + -490, + -430, + -377, + -306, + -224, + -197, + -136, + -81, + -242, + -515, + -771, + -1040, + -1260, + -1422, + -1566, + -1923, + -1577, + -1297, + -1085, + -925, + -801, + -703, + -621, + -553, + -492, + -439, + -367, + -284, + -213, + -198, + -144, + -83, + -235, + -479, + -744, + -963, + -1125, + -1268, + -1986, + -1640, + -1360, + -1148, + -988, + -864, + -766, + -684, + -615, + -555, + -501, + -429, + -345, + -273, + -211, + -204, + -146, + -89, + -216, + -465, + -680, + -841, + -984, + -2043, + -1697, + -1417, + -1205, + -1044, + -921, + -822, + -741, + -672, + -611, + -557, + -485, + -401, + -328, + -264, + -211, + -205, + -140, + -93, + -227, + -430, + -588, + -729, + -2104, + -1758, + -1479, + -1266, + -1106, + -982, + -884, + -802, + -733, + -673, + -619, + -546, + -461, + -388, + -324, + -269, + -212, + -211, + -151, + -100, + -195, + -336, + -472, + -2163, + -1817, + -1537, + -1324, + -1164, + -1040, + -942, + -860, + -791, + -731, + -676, + -604, + -519, + -445, + -380, + -325, + -268, + -226, + -219, + -147, + -114, + -167, + -280, + -2203, + -1857, + -1577, + -1365, + -1205, + -1081, + -982, + -901, + -831, + -771, + -717, + -644, + -559, + -485, + -420, + -364, + -306, + -252, + -239, + -206, + -132, + -122, + -163, + -2224, + -1878, + -1598, + -1386, + -1225, + -1102, + -1003, + -921, + -852, + -792, + -737, + -665, + -580, + -505, + -441, + -385, + -326, + -271, + -222, + -224, + -176, + -121, + -114, +}; + +const Word32 c_aaiSpreadFunction48[MAX_BANDS_48 * MAX_BANDS_48] = { + 0, + -1561, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -289, + -4, + -1234, + -2295, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -569, + -229, + -8, + -905, + -1705, + -2324, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -789, + -445, + -173, + -16, + -656, + -1271, + -1765, + -2172, + -2520, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -961, + -616, + -340, + -136, + -28, + -488, + -976, + -1382, + -1729, + -2032, + -2305, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -1088, + -743, + -465, + -257, + -148, + -31, + -371, + -769, + -1114, + -1417, + -1689, + -2054, + -2483, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -1198, + -852, + -574, + -364, + -209, + -148, + -42, + -300, + -635, + -936, + -1207, + -1572, + -2000, + -2376, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -1293, + -948, + -669, + -458, + -301, + -183, + -145, + -56, + -258, + -547, + -816, + -1179, + -1606, + -1982, + -2311, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -1375, + -1029, + -750, + -539, + -381, + -260, + -180, + -142, + -68, + -231, + -487, + -846, + -1272, + -1647, + -1976, + -2261, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -1444, + -1099, + -820, + -608, + -449, + -328, + -233, + -194, + -138, + -77, + -213, + -555, + -978, + -1352, + -1681, + -1966, + -2268, + -2552, + -2552, + -2552, + -2552, + -2552, + -2552, + -1501, + -1155, + -876, + -665, + -505, + -383, + -287, + -210, + -193, + -130, + -79, + -298, + -711, + -1083, + -1411, + -1696, + -1997, + -2288, + -2550, + -2552, + -2552, + -2552, + -2552, + -1567, + -1221, + -942, + -730, + -570, + -448, + -351, + -272, + -206, + -189, + -151, + -72, + -349, + -713, + -1039, + -1324, + -1625, + -1915, + -2177, + -2448, + -2552, + -2552, + -2552, + -1650, + -1304, + -1025, + -813, + -653, + -530, + -432, + -352, + -285, + -227, + -177, + -163, + -69, + -297, + -613, + -895, + -1195, + -1485, + -1746, + -2017, + -2238, + -2401, + -2545, + -1727, + -1381, + -1102, + -890, + -730, + -607, + -509, + -428, + -360, + -301, + -249, + -180, + -153, + -72, + -257, + -527, + -824, + -1112, + -1373, + -1643, + -1865, + -2028, + -2171, + -1798, + -1452, + -1173, + -960, + -800, + -677, + -579, + -498, + -430, + -370, + -317, + -246, + -192, + -145, + -76, + -224, + -505, + -790, + -1050, + -1320, + -1540, + -1703, + -1847, + -1860, + -1514, + -1234, + -1022, + -862, + -738, + -640, + -559, + -490, + -430, + -377, + -306, + -224, + -197, + -136, + -81, + -242, + -515, + -771, + -1040, + -1260, + -1422, + -1566, + -1923, + -1577, + -1297, + -1085, + -925, + -801, + -703, + -621, + -553, + -492, + -439, + -367, + -284, + -213, + -198, + -144, + -83, + -235, + -479, + -744, + -963, + -1125, + -1268, + -1986, + -1640, + -1360, + -1148, + -988, + -864, + -766, + -684, + -615, + -555, + -501, + -429, + -345, + -273, + -211, + -204, + -146, + -89, + -216, + -465, + -680, + -841, + -984, + -2043, + -1697, + -1417, + -1205, + -1044, + -921, + -822, + -741, + -672, + -611, + -557, + -485, + -401, + -328, + -264, + -211, + -205, + -140, + -93, + -227, + -430, + -588, + -729, + -2104, + -1758, + -1479, + -1266, + -1106, + -982, + -884, + -802, + -733, + -673, + -619, + -546, + -461, + -388, + -324, + -269, + -212, + -211, + -151, + -100, + -195, + -336, + -472, + -2163, + -1817, + -1537, + -1324, + -1164, + -1040, + -942, + -860, + -791, + -731, + -676, + -604, + -519, + -445, + -380, + -325, + -268, + -226, + -219, + -147, + -114, + -167, + -280, + -2203, + -1857, + -1577, + -1365, + -1205, + -1081, + -982, + -901, + -831, + -771, + -717, + -644, + -559, + -485, + -420, + -364, + -306, + -252, + -239, + -206, + -132, + -122, + -163, + -2224, + -1878, + -1598, + -1386, + -1225, + -1102, + -1003, + -921, + -852, + -792, + -737, + -665, + -580, + -505, + -441, + -385, + -326, + -271, + -222, + -224, + -176, + -121, + -114, +}; + +const Word32 c_pfMagLUT[8] = /* Q31 */ { + 0, 394599072, 775760576, 1130504448, 1446750336, 1713728896, 1922348544, 2065504896 +}; + +const Word32 c_pfP2RRealLUT[32] = /* Q31 */ { + INT_MIN, -2106220416, -1984016384, -1785567488, -1518500224, -1193078272, + -821806592, -418953280, -94, 418953088, 821806400, 1193077888, + 1518500224, 1785567360, 1984016128, 2106220288, 2147483647, 2106220288, + 1984016128, 1785567360, 1518500224, 1193077888, 821806400, 418953088, + -94, -418953280, -821806592, -1193078272, -1518500224, -1785567488, + -1984016384, -2106220416 +}; + +const Word32 c_pfP2RImagLUT[32] = /* Q31 */ { + 188, -418953248, -821806080, -1193077888, -1518500224, -1785567232, + -1984016128, -2106220288, INT_MIN, -2106220416, -1984016128, -1785567488, + -1518500224, -1193078016, -821806464, -418953280, 0, 418953280, + 821806464, 1193078016, 1518500224, 1785567488, 1984016128, 2106220416, + 2147483647, 2106220288, 1984016128, 1785567232, 1518500224, 1193077888, + 821806080, 418953248 +}; + +const Word32 c_pfWindowLUT[LCLD_PRED_WIN_LEN] = /* Q31 */ { + 190779840, 338280192, 610825408, 966922816, 1352359680, 1708457216, 1981002240, 2128502656, 2128502528, 1981002240, 1708456960, 1352359808, 966922624, 610825152, 338280192, 190779776 +}; diff --git a/lib_isar/isar_rom_lcld_tables.h b/lib_isar/isar_rom_lcld_tables.h new file mode 100644 index 0000000000000000000000000000000000000000..a2cbe5f25c4888d9658a51c3e017332441981fa4 --- /dev/null +++ b/lib_isar/isar_rom_lcld_tables.h @@ -0,0 +1,244 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef ISAR_ROM_LCLD_TABLES_H +#define ISAR_ROM_LCLD_TABLES_H + +#include +#include "options.h" +#include "typedef.h" +#ifndef M_PI + +#define M_PI 3.14159265358979323846264338327950288f // todo: replace by EVS_PI +#define M_ONE_BY_PI_FX 10430 // 1/pi in Q15 + +#endif + +#define LCLD_BLOCKS_PER_FRAME ( 16 ) +#define LCLD_MAX_BLOCKS_PER_FRAME ( 16 ) +#define LCLD_BANDS ( 60 ) +#define LCLD_PRED_WIN_LEN ( 16 ) +#define LCLD_MAX_NUM_PRED_SUBSETS ( 8 ) +#define MAX_BANDS ( 23 ) +#define MAX_BANDS_48 ( 23 ) +#define DEF_BANDS_48 ( 22 ) + +#define ENV_MIN ( -64 ) +#define ENV_MAX ( 64 ) + +#define ENV0_BITS ( 7 ) + +#define ENV_DELTA_MIN ( -32 ) +#define ENV_DELTA_MIN_FX ( -1073741824 ) +#define ENV_DELTA_MAX ( 31 ) +#define ENV_DELTA_MAX_FX ( 1040187392 ) + +#define ENV_RECONSTRUCT_TABLE_SIZE ( 129 ) + +#define ENV_RECONSTRUCT_TABLE_CENTER ( 64 ) + +#define MIN_ALLOC ( 0 ) +#define MAX_ALLOC ( 31 ) + +#define ALLOC_OFFSET_SCALE ( 8 ) + +#define ALLOC_OFFSET_BITS ( 8 ) + +#define MIN_ALLOC_OFFSET ( -128 ) +#define MAX_ALLOC_OFFSET ( 127 ) +#define READ_LENGTH ( 4 ) + +#define ALLOC_TABLE_SIZE ( 32 ) + +#ifndef _PI_ +#define _PI_ ( 3.14159265358979f ) +#endif +#define PRED_MAX_VAL ( 12 ) +#define PRED_MIN_VAL ( -PRED_MAX_VAL ) +#define PRED_QUANT_FACTOR ( (float) PRED_MAX_VAL ) +#define PRED_QUANT_FACTOR_FX ( PRED_MAX_VAL ) +#define PRED_BAND0_BITS ( 5 ) + +#define PHASE_MAX_VAL ( 12 ) +#define PHASE_MIN_VAL ( -PHASE_MAX_VAL ) +#define PHASE_QUANT_FACTOR_FX_Q29 ( 2050695826 ) +#define PHASE_DIFF_DIM ( 2 ) +#define PHASE_BAND0_BITS ( 5 ) + +#define PERCEPTUAL_MODEL_SLGAIN_SHIFT ( 8 ) + +// #define USE_DEMOD_TABLES + +#define HUFF_DEC_TABLE_SIZE ( 16 ) + +/*----------------------------------------------------------------------* + * ISAR binaural rendering LCLD ROM tables + *-----------------------------------------------------------------------*/ + +extern const Word32 c_aiNumLcldBandsPerBand[MAX_BANDS_48]; +extern const Word32 c_aiBandIdPerLcldBand[LCLD_BANDS]; +extern const Word32 c_afRotRealImag_fx[PRED_MAX_VAL - PRED_MIN_VAL + 1][2]; +extern const Word16 c_aiDefaultTheta48_fx[MAX_BANDS_48]; +extern const Word32 c_aiDefaultTheta48[MAX_BANDS_48]; + +extern const Word32 c_afInvScaleFactor_fx[ALLOC_TABLE_SIZE]; +extern const Word16 c_afRMSEnvReconstructTable_exp[ENV_RECONSTRUCT_TABLE_SIZE]; +extern const Word32 c_aiQuantMaxValues[ALLOC_TABLE_SIZE]; +extern const Word32 c_aiHuffmanDim[ALLOC_TABLE_SIZE]; +extern const Word32 c_aiHuffmanMod[ALLOC_TABLE_SIZE]; +extern const Word32 c_aiHuffmanDim_fx[ALLOC_TABLE_SIZE]; +extern const Word32 c_aiHuffmanMod_fx[ALLOC_TABLE_SIZE]; +extern const Word32 c_afScaleFactor_fx[ALLOC_TABLE_SIZE]; +extern const Word32 c_aiQuantMaxValues_fx[ALLOC_TABLE_SIZE]; +extern const Word32 c_aiHuffmanSize[ALLOC_TABLE_SIZE]; + + +#define LOG_ADD_TABLE_LENGTH ( 512 ) + +extern const Word32 c_aiBandwidths48[MAX_BANDS_48]; +extern const Word16 c_aiLogAddTable_fx[LOG_ADD_TABLE_LENGTH]; +extern const Word16 c_aiBandwidthAdjust48_fx[MAX_BANDS_48]; +extern const Word32 c_aiLogAddTable[LOG_ADD_TABLE_LENGTH]; +extern const Word32 c_aiBandwidthAdjust48[MAX_BANDS_48]; + + +extern const Word16 c_aiAbsoluteThresh48_fx[MAX_BANDS_48]; +extern const Word16 c_aiDefaultTheta48_fx[MAX_BANDS_48]; +extern const Word16 c_aaiSpreadFunction48_fx[MAX_BANDS_48 * MAX_BANDS_48]; +extern const Word32 c_aiAbsoluteThresh48[MAX_BANDS_48]; +extern const Word32 c_aiDefaultTheta48[MAX_BANDS_48]; +extern const Word32 c_aaiSpreadFunction48[MAX_BANDS_48 * MAX_BANDS_48]; + + +#define PRED_QUNAT_FILTER_MAG_BITS ( 3 ) +#define PRED_QUANT_FILTER_PHASE_BITS ( 5 ) +#define PRED_QUANT_FILTER_MAG_MIN ( 0 ) +#define PRED_QUANT_FILTER_MAG_MAX ( 7 ) +#define PRED_QUANT_FILTER_PHASE_MIN ( -16 ) +#define PRED_QUANT_FILTER_PHASE_MAX ( 15 ) + +extern const UWord16 c_aauiLCLDHuffEnc1[16][2]; +extern const UWord16 c_aauiLCLDHuffEnc2[16][2]; +extern const UWord16 c_aauiLCLDHuffEnc3[25][2]; +extern const UWord16 c_aauiLCLDHuffEnc4[36][2]; +extern const UWord16 c_aauiLCLDHuffEnc5[36][2]; +extern const UWord16 c_aauiLCLDHuffEnc6[49][2]; +extern const UWord16 c_aauiLCLDHuffEnc7[64][2]; +extern const UWord16 c_aauiLCLDHuffEnc8[81][2]; +extern const UWord16 c_aauiLCLDHuffEnc9[100][2]; +extern const UWord16 c_aauiLCLDHuffEnc10[169][2]; +extern const UWord16 c_aauiLCLDHuffEnc11[196][2]; +extern const UWord16 c_aauiLCLDHuffEnc12[289][2]; +extern const UWord16 c_aauiLCLDHuffEnc13[324][2]; +extern const UWord16 c_aauiLCLDHuffEnc14[400][2]; +extern const UWord16 c_aauiLCLDHuffEnc15[576][2]; +extern const UWord16 c_aauiLCLDHuffEnc16[729][2]; +extern const UWord16 c_aauiLCLDHuffEnc17[729][2]; +extern const UWord16 c_aauiLCLDHuffEnc18[28][2]; +extern const UWord16 c_aauiLCLDHuffEnc19[29][2]; +extern const UWord16 c_aauiLCLDHuffEnc20[32][2]; +extern const UWord16 c_aauiLCLDHuffEnc21[37][2]; +extern const UWord16 c_aauiLCLDHuffEnc22[39][2]; +extern const UWord16 c_aauiLCLDHuffEnc23[46][2]; +extern const UWord16 c_aauiLCLDHuffEnc24[55][2]; +extern const UWord16 c_aauiLCLDHuffEnc25[65][2]; +extern const UWord16 c_aauiLCLDHuffEnc26[77][2]; +extern const UWord16 c_aauiLCLDHuffEnc27[91][2]; +extern const UWord16 c_aauiLCLDHuffEnc28[109][2]; +extern const UWord16 c_aauiLCLDHuffEnc29[129][2]; +extern const UWord16 c_aauiLCLDHuffEnc30[153][2]; +extern const UWord16 c_aauiLCLDHuffEnc31[181][2]; +extern const UWord16 c_aauiLCLDHuffEnc33[16][2]; +extern const UWord16 c_aauiLCLDHuffEnc34[16][2]; +extern const UWord16 c_aauiLCLDHuffEnc35[25][2]; +extern const UWord16 c_aauiLCLDHuffEnc36[36][2]; +extern const UWord16 c_aauiLCLDHuffEnc37[36][2]; +extern const UWord16 c_aauiLCLDHuffEnc38[49][2]; +extern const UWord16 c_aauiLCLDHuffEnc39[64][2]; +extern const UWord16 c_aauiLCLDHuffEnc40[81][2]; +extern const UWord16 c_aauiLCLDHuffEnc41[100][2]; +extern const UWord16 c_aauiLCLDHuffEnc42[169][2]; +extern const UWord16 c_aauiLCLDHuffEnc43[196][2]; +extern const UWord16 c_aauiLCLDHuffEnc44[289][2]; +extern const UWord16 c_aauiLCLDHuffEnc45[324][2]; +extern const UWord16 c_aauiLCLDHuffEnc46[400][2]; +extern const UWord16 c_aauiLCLDHuffEnc47[576][2]; +extern const UWord16 c_aauiLCLDHuffEnc48[729][2]; +extern const UWord16 c_aauiLCLDHuffEnc49[729][2]; +extern const UWord16 c_aauiLCLDHuffEnc50[28][2]; +extern const UWord16 c_aauiLCLDHuffEnc51[29][2]; +extern const UWord16 c_aauiLCLDHuffEnc52[32][2]; +extern const UWord16 c_aauiLCLDHuffEnc53[37][2]; +extern const UWord16 c_aauiLCLDHuffEnc54[39][2]; +extern const UWord16 c_aauiLCLDHuffEnc55[46][2]; +extern const UWord16 c_aauiLCLDHuffEnc56[55][2]; +extern const UWord16 c_aauiLCLDHuffEnc57[65][2]; +extern const UWord16 c_aauiLCLDHuffEnc58[77][2]; +extern const UWord16 c_aauiLCLDHuffEnc59[91][2]; +extern const UWord16 c_aauiLCLDHuffEnc60[109][2]; +extern const UWord16 c_aauiLCLDHuffEnc61[129][2]; +extern const UWord16 c_aauiLCLDHuffEnc62[153][2]; +extern const UWord16 c_aauiLCLDHuffEnc63[181][2]; +extern const UWord16 ( *c_apauiHuffEncTabels[2 * ALLOC_TABLE_SIZE] )[2]; +extern const UWord32 num_row_aauiLCLDHuff[2 * ALLOC_TABLE_SIZE]; + +#ifdef USE_DEMOD_TABLES +extern const Word32 c_aaiHuffDemod1[16][2]; +extern const Word32 c_aaiHuffDemod2[16][2]; +extern const Word32 c_aaiHuffDemod3[25][2]; +extern const Word32 c_aaiHuffDemod4[36][2]; +extern const Word32 c_aaiHuffDemod5[36][2]; +extern const Word32 c_aaiHuffDemod6[49][2]; +extern const Word32 c_aaiHuffDemod7[64][2]; +extern const Word32 c_aaiHuffDemod8[81][2]; +extern const Word32 c_aaiHuffDemod9[100][2]; +extern const Word32 c_aaiHuffDemod10[169][2]; +extern const Word32 c_aaiHuffDemod11[196][2]; +extern const Word32 c_aaiHuffDemod12[289][2]; +extern const Word32 c_aaiHuffDemod13[324][2]; +extern const Word32 c_aaiHuffDemod14[400][2]; +extern const Word32 c_aaiHuffDemod15[576][2]; +extern const Word32 c_aaiHuffDemod16[729][2]; +extern const Word32 c_aaiHuffDemod17[729][2]; +extern const Word32 ( *c_apaiDemodTables[ALLOC_TABLE_SIZE] )[2]; +#endif + +extern const UWord32 c_aaiRMSEnvHuffEnc[64][2]; +extern const UWord32 c_aaiRMSEnvHuffDec[13][HUFF_DEC_TABLE_SIZE]; + +extern const Word32 c_pfMagLUT[8]; /* Q31 */ +extern const Word32 c_pfP2RRealLUT[32]; /* Q31 */ +extern const Word32 c_pfP2RImagLUT[32]; /* Q31 */ +extern const Word32 c_pfWindowLUT[LCLD_PRED_WIN_LEN]; /* Q31 */ + + +#endif /* ISAR_ROM_LCLD_TABLES_H_ */ diff --git a/lib_isar/isar_rom_post_rend.c b/lib_isar/isar_rom_post_rend.c new file mode 100644 index 0000000000000000000000000000000000000000..954d89f639892eb743b15adc3dc29aac4e70c91f --- /dev/null +++ b/lib_isar/isar_rom_post_rend.c @@ -0,0 +1,273 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "cnst.h" +#include "isar_cnst.h" +#include +#include "wmc_auto.h" + + +/*----------------------------------------------------------------------* + * ISAR binaural split post-rendering ROM table + *-----------------------------------------------------------------------*/ + +/* rotations in this array are relative to ref rotation */ +const Word32 ivas_split_rend_relative_yaw_pos_angles_fx[SPLIT_REND_MAX_YAW_ONLY_POSES] = { + -62914560, 62914560 +}; /* Q22 */ + +const Word32 ivas_split_rend_relative_pitch_pos_angles_fx[SPLIT_REND_MAX_PITCH_ONLY_POSES] = { + 41943040, 41943040 +}; /* Q22 */ + +const Word32 ivas_split_rend_relative_roll_pos_angles_fx[SPLIT_REND_MAX_PITCH_ONLY_POSES] = { + 41943040, 41943040 +}; /* Q22 */ + +const Word32 ivas_split_rend_relative_yaw_pos_angles_hq_fx[SPLIT_REND_MAX_YAW_ONLY_POSES] = { + -62914560, 62914560 +}; /* Q22 */ + +const Word32 ivas_split_rend_relative_pitch_pos_angles_hq_fx[SPLIT_REND_MAX_PITCH_ONLY_POSES] = { + -62914560, 62914560 +}; /* Q22 */ + +const Word32 ivas_split_rend_relative_roll_pos_angles_hq_fx[SPLIT_REND_MAX_PITCH_ONLY_POSES] = { + -62914560, 62914560 +}; /* Q22 */ + +/* Values in degrees : -30, -22.5, -15, 0, 15, 22.5 and 30 */ +const Word32 ivas_split_rend_fix_pos_rot_mat_cos_fx[4] = { + ONE_IN_Q31, 2074309917, 1984016189, 1859775393 +}; /* Q31 */ + +const Word16 isar_split_rend_band_grouping[MAX_SPLIT_REND_MD_BANDS + 1] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 20, 25, 30, 35, 40, 50, 60 +}; + +const Word32 ivas_split_rend_huff_p_d_consts[ISAR_SPLIT_REND_D_QUANT_PNTS][3] = { + { 0, 8, 252 }, + { 1, 8, 253 }, + { 2, 7, 124 }, + { 3, 6, 60 }, + { 4, 5, 28 }, + { 5, 4, 12 }, + { 6, 3, 4 }, + { 7, 1, 0 }, + { 8, 3, 5 }, + { 9, 4, 13 }, + { 10, 5, 29 }, + { 11, 6, 61 }, + { 12, 7, 125 }, + { 13, 8, 254 }, + { 14, 8, 255 } +}; + +const Word32 ivas_split_rend_huff_p_d_diff_consts[ISAR_SPLIT_REND_D_QUANT_PNTS][3] = { + { 0, 1, 0 }, + { 1, 2, 2 }, + { 2, 3, 6 }, + { 3, 4, 14 }, + { 4, 5, 30 }, + { 5, 6, 62 }, + { 6, 7, 126 }, + { 7, 8, 254 }, + { 8, 9, 510 }, + { 9, 10, 1022 }, + { 10, 11, 2046 }, + { 11, 12, 4094 }, + { 12, 13, 8190 }, + { 13, 14, 16382 }, + { 14, 14, 16383 } +}; + +const Word32 ivas_split_rend_huff_d_consts[ISAR_SPLIT_REND_D_QUANT_PNTS][3] = { + { 0, 1, 0 }, + { 1, 2, 2 }, + { 2, 3, 6 }, + { 3, 4, 14 }, + { 4, 5, 30 }, + { 5, 6, 62 }, + { 6, 7, 126 }, + { 7, 8, 254 }, + { 8, 9, 510 }, + { 9, 10, 1022 }, + { 10, 11, 2046 }, + { 11, 12, 4094 }, + { 12, 13, 8190 }, + { 13, 14, 16382 }, + { 14, 14, 16383 } +}; + +const Word32 ivas_split_rend_huff_pred63_consts[ISAR_SPLIT_REND_PRED_63QUANT_PNTS][3] = { + { -31, 11, 2040 }, + { -30, 11, 2041 }, + { -29, 11, 2042 }, + { -28, 11, 2043 }, + { -27, 10, 1012 }, + { -26, 10, 1013 }, + { -25, 10, 1014 }, + { -24, 10, 1015 }, + { -23, 9, 498 }, + { -22, 9, 499 }, + { -21, 9, 500 }, + { -20, 9, 501 }, + { -19, 8, 242 }, + { -18, 8, 243 }, + { -17, 8, 244 }, + { -16, 8, 245 }, + { -15, 7, 112 }, + { -14, 7, 113 }, + { -13, 7, 114 }, + { -12, 7, 115 }, + { -11, 6, 48 }, + { -10, 6, 49 }, + { -9, 6, 50 }, + { -8, 6, 51 }, + { -7, 5, 16 }, + { -6, 5, 17 }, + { -5, 5, 18 }, + { -4, 5, 19 }, + { -3, 4, 2 }, + { -2, 4, 3 }, + { -1, 4, 4 }, + { 0, 3, 0 }, + { 1, 4, 5 }, + { 2, 4, 6 }, + { 3, 4, 7 }, + { 4, 5, 20 }, + { 5, 5, 21 }, + { 6, 5, 22 }, + { 7, 5, 23 }, + { 8, 6, 52 }, + { 9, 6, 53 }, + { 10, 6, 54 }, + { 11, 6, 55 }, + { 12, 7, 116 }, + { 13, 7, 117 }, + { 14, 7, 118 }, + { 15, 7, 119 }, + { 16, 7, 120 }, + { 17, 8, 246 }, + { 18, 8, 247 }, + { 19, 8, 248 }, + { 20, 9, 502 }, + { 21, 9, 503 }, + { 22, 9, 504 }, + { 23, 9, 505 }, + { 24, 10, 1016 }, + { 25, 10, 1017 }, + { 26, 10, 1018 }, + { 27, 10, 1019 }, + { 28, 11, 2044 }, + { 29, 11, 2045 }, + { 30, 11, 2046 }, + { 31, 11, 2047 }, +}; + +const Word32 ivas_split_rend_huff_pred31_consts[ISAR_SPLIT_REND_PRED_31QUANT_PNTS][3] = { + { -15, 10, 1020 }, + { -14, 10, 1021 }, + { -13, 9, 506 }, + { -12, 9, 507 }, + { -11, 8, 250 }, + { -10, 8, 251 }, + { -9, 7, 120 }, + { -8, 7, 121 }, + { -7, 6, 56 }, + { -6, 6, 57 }, + { -5, 5, 24 }, + { -4, 5, 25 }, + { -3, 4, 8 }, + { -2, 4, 9 }, + { -1, 3, 2 }, + { 0, 2, 0 }, + { 1, 3, 3 }, + { 2, 4, 10 }, + { 3, 4, 11 }, + { 4, 5, 26 }, + { 5, 5, 27 }, + { 6, 6, 58 }, + { 7, 6, 59 }, + { 8, 7, 122 }, + { 9, 7, 123 }, + { 10, 7, 124 }, + { 11, 8, 252 }, + { 12, 9, 508 }, + { 13, 9, 509 }, + { 14, 10, 1022 }, + { 15, 10, 1023 }, +}; + +const Word32 ivas_split_rend_huff_roll_pred_consts[ISAR_SPLIT_REND_ROLL_PRED_QUANT_PNTS][3] = { + { -15, 10, 1020 }, + { -14, 10, 1021 }, + { -13, 9, 506 }, + { -12, 9, 507 }, + { -11, 8, 250 }, + { -10, 8, 251 }, + { -9, 7, 120 }, + { -8, 7, 121 }, + { -7, 6, 56 }, + { -6, 6, 57 }, + { -5, 5, 24 }, + { -4, 5, 25 }, + { -3, 4, 8 }, + { -2, 4, 9 }, + { -1, 3, 2 }, + { 0, 2, 0 }, + { 1, 3, 3 }, + { 2, 4, 10 }, + { 3, 4, 11 }, + { 4, 5, 26 }, + { 5, 5, 27 }, + { 6, 6, 58 }, + { 7, 6, 59 }, + { 8, 7, 122 }, + { 9, 7, 123 }, + { 10, 7, 124 }, + { 11, 8, 252 }, + { 12, 9, 508 }, + { 13, 9, 509 }, + { 14, 10, 1022 }, + { 15, 10, 1023 }, +}; + +/* Tables for split renderer fixed converison */ +const Word16 fade_table_fx[4] = { + 8192, 16384, 24576, 32767 +}; diff --git a/lib_isar/isar_rom_post_rend.h b/lib_isar/isar_rom_post_rend.h new file mode 100644 index 0000000000000000000000000000000000000000..a08bb174f70461578c389b55d40f63897084cb00 --- /dev/null +++ b/lib_isar/isar_rom_post_rend.h @@ -0,0 +1,71 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef ISAR_ROM_POST_REND_H +#define ISAR_ROM_POST_REND_H + +#include +#include "options.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "cnst.h" +#include "isar_cnst.h" + +/*----------------------------------------------------------------------* + * ISAR binaural split post-rendering ROM table + *-----------------------------------------------------------------------*/ + +extern const Word32 ivas_split_rend_relative_yaw_pos_angles_fx[SPLIT_REND_MAX_YAW_ONLY_POSES]; +extern const Word32 ivas_split_rend_relative_pitch_pos_angles_fx[SPLIT_REND_MAX_PITCH_ONLY_POSES]; +extern const Word32 ivas_split_rend_relative_roll_pos_angles_fx[SPLIT_REND_MAX_PITCH_ONLY_POSES]; + +extern const Word32 ivas_split_rend_relative_yaw_pos_angles_hq_fx[SPLIT_REND_MAX_YAW_ONLY_POSES]; +extern const Word32 ivas_split_rend_relative_pitch_pos_angles_hq_fx[SPLIT_REND_MAX_PITCH_ONLY_POSES]; +extern const Word32 ivas_split_rend_relative_roll_pos_angles_hq_fx[SPLIT_REND_MAX_PITCH_ONLY_POSES]; + +/* Values in degrees : -30, -22.5, -15, 0, 15, 22.5 and 30 */ +extern const Word32 ivas_split_rend_fix_pos_rot_mat_cos_fx[4]; /* Q31 */ + +extern const Word16 isar_split_rend_band_grouping[MAX_SPLIT_REND_MD_BANDS + 1]; +extern const Word32 ivas_split_rend_huff_d_consts[ISAR_SPLIT_REND_D_QUANT_PNTS][3]; +extern const Word32 ivas_split_rend_huff_pred63_consts[ISAR_SPLIT_REND_PRED_31QUANT_PNTS][3]; +extern const Word32 ivas_split_rend_huff_pred31_consts[ISAR_SPLIT_REND_PRED_31QUANT_PNTS][3]; +extern const Word32 ivas_split_rend_huff_roll_pred_consts[ISAR_SPLIT_REND_ROLL_PRED_QUANT_PNTS][3]; +extern const Word32 ivas_split_rend_huff_p_d_consts[ISAR_SPLIT_REND_D_QUANT_PNTS][3]; +extern const Word32 ivas_split_rend_huff_p_d_diff_consts[ISAR_SPLIT_REND_D_QUANT_PNTS][3]; +extern const Word32 split_rend_brate_tbl[]; + +/* Tables for fixed point conversion */ +extern const Word16 fade_table_fx[4]; + +#endif diff --git a/lib_isar/isar_splitRend_lcld_dec.c b/lib_isar/isar_splitRend_lcld_dec.c new file mode 100644 index 0000000000000000000000000000000000000000..6f4512d9e191f3fadd9e59fd6a42c9e2d4537795 --- /dev/null +++ b/lib_isar/isar_splitRend_lcld_dec.c @@ -0,0 +1,273 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "isar_prot.h" +#include "ivas_prot_fx.h" +#include "prot_fx.h" +#include "prot_fx.h" +//#include "control.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Function isar_splitBinLCLDDecOpen() + * + * + *------------------------------------------------------------------------*/ + +ivas_error isar_splitBinLCLDDecOpen( + ISAR_BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec, + const Word32 iSampleRate, + const Word16 iChannels, + const Word16 iNumBlocks, + const Word16 iNumIterations ) +{ + Word16 n; + ISAR_BIN_HR_SPLIT_LCLD_DEC_HANDLE splitBinLCLDDec; + ivas_error error; + + IF( ( splitBinLCLDDec = (ISAR_BIN_HR_SPLIT_LCLD_DEC_HANDLE) malloc( sizeof( ISAR_BIN_HR_SPLIT_LCLD_DEC ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + + splitBinLCLDDec->pLcld_dec = NULL; /* place holder for CLDFB decoder handle */ + + splitBinLCLDDec->iChannels = iChannels; + + IF( ( error = CreateLCLDDecoder( &splitBinLCLDDec->psLCLDDecoder, iSampleRate, iChannels, iNumBlocks, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF( ( splitBinLCLDDec->pppfDecLCLDReal_fx = (Word32 ***) malloc( iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + IF( ( splitBinLCLDDec->pppfDecLCLDImag_fx = (Word32 ***) malloc( iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + + FOR( n = 0; n < splitBinLCLDDec->iChannels; n++ ) + { + IF( ( splitBinLCLDDec->pppfDecLCLDReal_fx[n] = (Word32 **) malloc( CLDFB_NO_COL_MAX * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + IF( ( splitBinLCLDDec->pppfDecLCLDImag_fx[n] = (Word32 **) malloc( CLDFB_NO_COL_MAX * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + } +#ifdef CLDFB_DEBUG + splitBinLCLDDec->numFrame = 0; + char cldfbFilename[50] = "cldfb_out.bin"; + if ( ( splitBinLCLDDec->cldfbOut = fopen( cldfbFilename, "wb" ) ) == NULL ) + { + fprintf( stderr, "Error: CLDFB bitstream file %s could not be opened\n\n", cldfbFilename ); + exit( -1 ); + } + int16_t num_bands = CLDFB_NO_CHANNELS_MAX; + fwrite( &iChannels, sizeof( int16_t ), 1, splitBinLCLDDec->cldfbOut ); + fwrite( &num_bands, sizeof( int16_t ), 1, splitBinLCLDDec->cldfbOut ); +#endif + + IF( ( error = isar_splitBinRendPLCOpen( &splitBinLCLDDec->hSplitRendPLC, GetNumSubSets( splitBinLCLDDec->psLCLDDecoder ) ) ) != IVAS_ERR_OK ) + { + return error; + } + splitBinLCLDDec->iNumBlocks = iNumBlocks; + splitBinLCLDDec->iNumIterations = iNumIterations; + + *hSplitBinLCLDDec = splitBinLCLDDec; + + return IVAS_ERR_OK; +} + +/*------------------------------------------------------------------------- + * Function isar_splitBinLCLDDecClose() + * + * + *------------------------------------------------------------------------*/ + +void isar_splitBinLCLDDecClose( + ISAR_BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec ) +{ + Word16 n; + + IF( ( *hSplitBinLCLDDec ) != NULL ) + { + IF( ( *hSplitBinLCLDDec )->psLCLDDecoder != NULL ) + { + DeleteLCLDDecoder( ( *hSplitBinLCLDDec )->psLCLDDecoder ); + } + + FOR( n = 0; n < ( *hSplitBinLCLDDec )->iChannels; n++ ) + { + free( ( *hSplitBinLCLDDec )->pppfDecLCLDReal_fx[n] ); + free( ( *hSplitBinLCLDDec )->pppfDecLCLDImag_fx[n] ); + } + free( ( *hSplitBinLCLDDec )->pppfDecLCLDReal_fx ); + free( ( *hSplitBinLCLDDec )->pppfDecLCLDImag_fx ); + +#ifdef CLDFB_DEBUG + if ( ( *hSplitBinLCLDDec )->cldfbOut != NULL ) + { + fclose( ( *hSplitBinLCLDDec )->cldfbOut ); + } +#endif + isar_splitBinRendPLCClose( &( *hSplitBinLCLDDec )->hSplitRendPLC ); + + free( *hSplitBinLCLDDec ); + *hSplitBinLCLDDec = NULL; + } + + return; +} + +/*------------------------------------------------------------------------- + * Function isar_splitBinLCLDDecProcess() + * + * + *------------------------------------------------------------------------*/ +void isar_splitBinLCLDDecProcess( + ISAR_BIN_HR_SPLIT_LCLD_DEC_HANDLE hSplitBinLCLDDec, + ISAR_SPLIT_REND_BITS_HANDLE pBits, + Word32 Cldfb_Out_Real_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_Out_Imag_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word16 *Q_cldfb_final, + const Word16 bfi ) +{ + Word16 k, n; + Word16 itr; + *Q_cldfb_final = 11; + push_wmops( "isar_splitBinLCLDDecProcess" ); + + assert( hSplitBinLCLDDec != NULL ); + assert( Cldfb_Out_Real_fx != NULL ); + assert( Cldfb_Out_Imag_fx != NULL ); + assert( pBits != NULL ); +#ifdef CLDFB_DEBUG + printf( "Bytes read = %d\n", iBytesWritten ); +#endif + IF( !bfi ) + { + FOR( itr = 0; itr < hSplitBinLCLDDec->iNumIterations; itr++ ) + { + /* Initialized with zeros....... */ + FOR( n = 0; n < hSplitBinLCLDDec->iChannels; n++ ) + { + FOR( k = 0; k < hSplitBinLCLDDec->iNumBlocks; k++ ) + { + hSplitBinLCLDDec->pppfDecLCLDReal_fx[n][k] = Cldfb_Out_Real_fx[n][hSplitBinLCLDDec->iNumBlocks * itr + k]; + hSplitBinLCLDDec->pppfDecLCLDImag_fx[n][k] = Cldfb_Out_Imag_fx[n][hSplitBinLCLDDec->iNumBlocks * itr + k]; + set_l( hSplitBinLCLDDec->pppfDecLCLDReal_fx[n][k], 0, CLDFB_NO_CHANNELS_MAX ); + set_l( hSplitBinLCLDDec->pppfDecLCLDImag_fx[n][k], 0, CLDFB_NO_CHANNELS_MAX ); + } + } + + Word16 Q_in = 14; + DecodeLCLDFrame( hSplitBinLCLDDec->psLCLDDecoder, pBits, hSplitBinLCLDDec->pppfDecLCLDReal_fx, hSplitBinLCLDDec->pppfDecLCLDImag_fx, Q_in, Q_cldfb_final ); + +#ifdef CLDFB_DEBUG + printf( "Frame Decoded = %d\n", ++hSplitBinLCLDDec->numFrame ); + int16_t writeByte = 0; + for ( k = 0; k < CLDFB_NO_COL_MAX; k++ ) + { + for ( int16_t b = 0; b < CLDFB_NO_CHANNELS_MAX; b++ ) + { + for ( n = 0; n < hSplitBinLCLDDec->iChannels; n++ ) + { + writeByte = fwrite( &hSplitBinLCLDDec->pppfDecLCLDReal[n][k][b], sizeof( float ), 1, hSplitBinLCLDDec->cldfbOut ); + if ( writeByte != 1 ) + exit( -1 ); + writeByte = fwrite( &hSplitBinLCLDDec->pppfDecLCLDImag[n][k][b], sizeof( float ), 1, hSplitBinLCLDDec->cldfbOut ); + if ( writeByte != 1 ) + exit( -1 ); + } + } + } +#endif + IF( AnyDecodingFailed( hSplitBinLCLDDec->psLCLDDecoder ) ) + { + *Q_cldfb_final = hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx; + + /* continue concealing */ + isar_splitBinRendPLC( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real_fx, Cldfb_Out_Imag_fx, (Word16) hSplitBinLCLDDec->iChannels, hSplitBinLCLDDec->iNumBlocks, hSplitBinLCLDDec->iNumIterations, GetDecodingFailedStatus( hSplitBinLCLDDec->psLCLDDecoder ), *Q_cldfb_final ); + } + IF( AnyDecodingFailedPrev( hSplitBinLCLDDec->psLCLDDecoder ) ) + { + IF( GT_16( *Q_cldfb_final, hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx ) ) + { + FOR( n = 0; n < hSplitBinLCLDDec->iChannels; n++ ) + { + FOR( k = 0; k < hSplitBinLCLDDec->iNumBlocks; k++ ) + { + FOR( Word16 j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + hSplitBinLCLDDec->pppfDecLCLDReal_fx[n][k][j] = L_shl_r( hSplitBinLCLDDec->pppfDecLCLDReal_fx[n][k][j], sub( hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx, *Q_cldfb_final ) ); // hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx + hSplitBinLCLDDec->pppfDecLCLDImag_fx[n][k][j] = L_shl_r( hSplitBinLCLDDec->pppfDecLCLDImag_fx[n][k][j], sub( hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx, *Q_cldfb_final ) ); // hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx + } + } + } + *Q_cldfb_final = hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx; + } + /* cross-fade recovered frame into good frame */ + isar_splitBinRendPLC_xf_fx( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real_fx, Cldfb_Out_Imag_fx, (Word16) hSplitBinLCLDDec->iChannels, hSplitBinLCLDDec->iNumBlocks, hSplitBinLCLDDec->iNumIterations, GetDecodingFailedStatus( hSplitBinLCLDDec->psLCLDDecoder ), GetDecodingFailedPrevStatus( hSplitBinLCLDDec->psLCLDDecoder ), *Q_cldfb_final ); + } + } + } + ELSE + { + /* set states in decoder */ + SetDecodingUnresolved( hSplitBinLCLDDec->psLCLDDecoder ); + + *Q_cldfb_final = hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx; + + /* do PLC for lost split renderer frame */ + isar_splitBinRendPLC( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real_fx, Cldfb_Out_Imag_fx, (Word16) hSplitBinLCLDDec->iChannels, hSplitBinLCLDDec->iNumBlocks, hSplitBinLCLDDec->iNumIterations, GetDecodingFailedStatus( hSplitBinLCLDDec->psLCLDDecoder ), *Q_cldfb_final ); + } + + /* save PLC state */ + isar_splitBinRendPLCsaveState( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real_fx, Cldfb_Out_Imag_fx, (Word16) hSplitBinLCLDDec->iChannels, hSplitBinLCLDDec->iNumBlocks, hSplitBinLCLDDec->iNumIterations ); + hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx = *Q_cldfb_final; + move16(); + pop_wmops(); + + return; +} diff --git a/lib_isar/isar_splitRend_lcld_enc.c b/lib_isar/isar_splitRend_lcld_enc.c new file mode 100644 index 0000000000000000000000000000000000000000..93e70c24f93472ab388272820dd4f7455a98bfa2 --- /dev/null +++ b/lib_isar/isar_splitRend_lcld_enc.c @@ -0,0 +1,237 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "isar_prot.h" +#include "ivas_prot_fx.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" + +/*------------------------------------------------------------------------- + * Function isar_splitBinLCLDEncOpen() + * + * + *------------------------------------------------------------------------*/ +ivas_error isar_splitBinLCLDEncOpen( + ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc, + const Word32 iSampleRate, + const Word16 iChannels, + const Word32 iDataRate, + const Word16 iNumBlocks, + const Word16 iNumIterations ) +{ + ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE splitBinLCLDEnc; + ivas_error error; + + IF( ( splitBinLCLDEnc = (ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE) malloc( sizeof( ISAR_BIN_HR_SPLIT_LCLD_ENC ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + splitBinLCLDEnc->pLcld_enc = NULL; /* place holder for CLDFB encoder handle*/ + + splitBinLCLDEnc->iChannels = iChannels; + IF( ( error = CreateLCLDEncoder( &( splitBinLCLDEnc->psLCLDEncoder ), iSampleRate, iChannels, iDataRate, 1, iNumBlocks, (Word16) CLDFB_NO_COL_MAX / iNumBlocks, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF( ( splitBinLCLDEnc->pppfLCLDReal_fx = (Word32 ***) malloc( iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( splitBinLCLDEnc->pppfLCLDImag_fx = (Word32 ***) malloc( iChannels * sizeof( Word32 ** ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + + FOR( Word16 n = 0; n < splitBinLCLDEnc->iChannels; n++ ) + { + IF( ( splitBinLCLDEnc->pppfLCLDReal_fx[n] = (Word32 **) malloc( CLDFB_NO_COL_MAX * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + IF( ( splitBinLCLDEnc->pppfLCLDImag_fx[n] = (Word32 **) malloc( CLDFB_NO_COL_MAX * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); + } + } + + splitBinLCLDEnc->iNumIterations = iNumIterations; + splitBinLCLDEnc->iNumBlocks = iNumBlocks; + +#ifdef CLDFB_DEBUG + splitBinLCLDEnc->numFrame = 0; + char cldfbFilename[50] = "cldfb_in_ref.qmf"; + if ( ( splitBinLCLDEnc->cldfbIn = fopen( cldfbFilename, "rb" ) ) == NULL ) + { + fprintf( stderr, "Error: CLDFB bitstream file %s could not be opened\n\n", cldfbFilename ); + exit( -1 ); + } + int16_t chan, band; + fread( &chan, sizeof( int16_t ), 1, splitBinLCLDEnc->cldfbIn ); + fread( &band, sizeof( int16_t ), 1, splitBinLCLDEnc->cldfbIn ); +#endif + + *hSplitBinLCLDEnc = splitBinLCLDEnc; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * Function isar_splitBinLCLDEncClose() + * + * + *------------------------------------------------------------------------*/ + +void isar_splitBinLCLDEncClose( + ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc ) +{ + IF( ( *hSplitBinLCLDEnc ) != NULL ) + { + DeleteLCLDEncoder( ( *hSplitBinLCLDEnc )->psLCLDEncoder ); + + FOR( Word16 n = 0; n < ( *hSplitBinLCLDEnc )->iChannels; n++ ) + { + free( ( *hSplitBinLCLDEnc )->pppfLCLDReal_fx[n] ); + free( ( *hSplitBinLCLDEnc )->pppfLCLDImag_fx[n] ); + } + free( ( *hSplitBinLCLDEnc )->pppfLCLDReal_fx ); + free( ( *hSplitBinLCLDEnc )->pppfLCLDImag_fx ); +#ifdef CLDFB_DEBUG + if ( ( *hSplitBinLCLDEnc )->cldfbIn != NULL ) + { + fclose( ( *hSplitBinLCLDEnc )->cldfbIn ); + } +#endif + + free( *hSplitBinLCLDEnc ); + *hSplitBinLCLDEnc = NULL; + } + + return; +} + +/*------------------------------------------------------------------------- + * Function isar_splitBinLCLDEncProcess() + * + * + *------------------------------------------------------------------------*/ +void isar_splitBinLCLDEncProcess( + ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE hSplitBinLCLDEnc, + Word32 *Cldfb_In_Real_fx[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, real part */ + Word32 *Cldfb_In_Imag_fx[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, imag part */ + const Word32 available_bits, /* i : available bit-budget */ + ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits handle */ + Word16 *q_final ) +{ + Word32 iBitsWritten, itr, available_bits_itr, rem_itr, available_bits_local; + push_wmops( "isar_splitBinLCLDEncProcess" ); + assert( hSplitBinLCLDEnc != NULL ); + assert( Cldfb_In_Real_fx != NULL ); + assert( Cldfb_In_Imag_fx != NULL ); + assert( pBits != NULL ); + + available_bits_local = available_bits; + move32(); + Word16 tmp, tmp_e; + /* A conversion is needed for the 3d pointer interface here ........ */ + FOR( itr = 0; itr < hSplitBinLCLDEnc->iNumIterations; itr++ ) + { + + rem_itr = L_sub( hSplitBinLCLDEnc->iNumIterations, itr ); + tmp = BASOP_Util_Divide3232_Scale( available_bits_local, rem_itr, &tmp_e ); + available_bits_itr = shr( tmp, sub( 15, tmp_e ) ); // Q0 + // available_bits_itr = available_bits_local / rem_itr; + FOR( Word32 n = 0; n < hSplitBinLCLDEnc->iChannels; n++ ) + { + FOR( Word32 k = 0; k < hSplitBinLCLDEnc->iNumBlocks; k++ ) + { + hSplitBinLCLDEnc->pppfLCLDReal_fx[n][k] = Cldfb_In_Real_fx[n][hSplitBinLCLDEnc->iNumBlocks * itr + k]; + hSplitBinLCLDEnc->pppfLCLDImag_fx[n][k] = Cldfb_In_Imag_fx[n][hSplitBinLCLDEnc->iNumBlocks * itr + k]; + } + } +#ifdef CLDFB_DEBUG + int16_t readByte = 0; + for ( int16_t k = 0; k < hSplitBinLCLDEnc->iNumBlocks; k++ ) + { + for ( int16_t b = 0; b < CLDFB_NO_CHANNELS_MAX; b++ ) + { + for ( int16_t n = 0; n < hSplitBinLCLDEnc->iChannels; n++ ) + { + readByte = fread( &hSplitBinLCLDEnc->pppfLCLDReal[n][k][b], sizeof( float ), 1, hSplitBinLCLDEnc->cldfbIn ); + if ( readByte != 1 ) + break; + readByte = fread( &hSplitBinLCLDEnc->pppfLCLDReal[n][k][b], sizeof( float ), 1, hSplitBinLCLDEnc->cldfbIn ); + } + } + } + + if ( readByte == 1 ) + { + printf( "Frame Read = %d\n", ++hSplitBinLCLDEnc->numFrame ); + } + else + { + printf( "Writing zeroes...\n" ); + for ( int16_T k = 0; k < hSplitBinLCLDEnc->iNumBlocks; k++ ) + { + for ( int16_t b = 0; b < CLDFB_NO_CHANNELS_MAX; b++ ) + { + for ( int16_t n = 0; n < hSplitBinLCLDEnc->iChannels; n++ ) + { + hSplitBinLCLDEnc->pppfLCLDReal[n][k][b] = 0.f; + hSplitBinLCLDEnc->pppfLCLDImag[n][k][b] = 0.f; + } + } + } + } +#endif + EncodeLCLDFrame( hSplitBinLCLDEnc->psLCLDEncoder, hSplitBinLCLDEnc->pppfLCLDReal_fx, hSplitBinLCLDEnc->pppfLCLDImag_fx, &iBitsWritten, available_bits_itr, pBits, q_final ); + + available_bits_local = L_sub( available_bits_local, iBitsWritten ); +#ifdef DEBUGGING + assert( available_bits_local >= 0 ); +#endif + +#ifdef CLDFB_DEBUG + printf( "Bits written = %d\n", iBitsWritten ); +#endif + } + pop_wmops(); + + return; +} diff --git a/lib_isar/isar_splitRendererPLC.c b/lib_isar/isar_splitRendererPLC.c new file mode 100644 index 0000000000000000000000000000000000000000..d807a26e6ea2eebbd5a35efbadce5d281a56e74c --- /dev/null +++ b/lib_isar/isar_splitRendererPLC.c @@ -0,0 +1,1300 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "ivas_prot_fx.h" +#include "prot_fx.h" +#include "isar_cnst.h" +#include "isar_prot.h" +#include "enh64.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" +#include "prot_fx.h" +#include "basop_util.h" +#include "enh64.h" + +/*------------------------------------------------------------------------- + * Local constants + *------------------------------------------------------------------------*/ + +#define PI_CONST ( 341782638 ) // Q31 +#define DO_PERTURB 1 +#define PH_PERT_ONLY 1 +#define START_VAL_AVG_LEN 2 +#define SR_PLC_FADE_START 10 /* start fading at this number of bad frames in row */ +#define SR_PLC_MUTE 30 /* Total mute at this number of bad frames in row */ +#define SR_PLC_FADE_DEGREE -3 /* fading degree per frame in dB */ +#define SRHO_THRESH ( 2.f / 3.f * 0.1f ) +#define SRHO_THRESH_FX ( 143165584 ) +#define STH_THRESH_FX ( 749613227 ) +#define STH_THRESH ( 2.f / 3.f * PI2 / 12 ) +#define PLC_FADE_CNST SR_PLC_FADE_START *CLDFB_NO_COL_MAX +#define PLC_MUTE_CNST SR_PLC_MUTE *CLDFB_NO_COL_MAX + +static Word32 xf_alp_tab[CLDFB_PLC_XF] = { 1431655680, 715827840 }; + + +/*------------------------------------------------------------------------- + * Function adaptive_polar_ext_plc() + * + * + *------------------------------------------------------------------------*/ + +static void adaptive_polar_ext_plc_fx( + const Word32 *prev_real_fx, + const Word32 *prev_imag_fx, + Word32 *rec_real_fx, + Word32 *rec_imag_fx, + Word16 *rec_real_exp, + Word16 *rec_imag_exp, +#if CLDFB_PLC_XF > 0 + Word32 xf_alp_fx[CLDFB_PLC_XF], + Word32 xf_bet_fx[CLDFB_PLC_XF], +#endif + Word16 exp, + const Word16 iNumCols ) + +{ + /*TODO: Add basops and instrumentation where ever possible*/ + Word32 uth_fx[CLDFB_NO_COL_MAX], urh_fx[CLDFB_NO_COL_MAX]; + Word64 uthu_fx[CLDFB_NO_COL_MAX], drho_fx, srho_fx, diff_fx, dth_fx, sth_fx, ph_adj_fx, rat_real_fx, rat_imag_fx; + Word32 ph_diff_fx, ph_adj_t_fx, quot_fx, dth32, fac_real_fx, fac_imag_fx, rat_real32_fx, rat_imag32_fx, abs2inv_fx; + Word16 srho_q, sth_q, dth16, drho_q, rat_real_q, rat_imag_q, temp_16, rat_real_sum_q, rat_imag_sum_q, start_q, fac_real_q, fac_imag_q; + Word64 Ruu_real_fx[2], Ruu_imag_fx[2], abs_fac_fx; + Word32 Ruu_real_fx_1, Ruu_imag_fx_1, Ruu_real_fx_0, abs_fac_32, abs_fac_powj_32, comp_fac_fx; + Word16 Ruu_real_fx_1_q, Ruu_imag_fx_1_q, Ruu_real_fx_0_q, dth_q, urh_exp[CLDFB_NO_COL_MAX]; + Word32 fac_ph_real_fx, fac_ph_imag_fx, abs_temp_fx; + Word32 start_real_fx, start_imag_fx, fac_powj_real_fx, fac_powj_imag_fx, temp_fx; + Word32 k, j; + Word16 quot_exp[CLDFB_NO_COL_MAX]; + Word16 drho_exp[CLDFB_NO_COL_MAX]; + Word16 srho_exp[CLDFB_NO_COL_MAX]; + /* Word16 rec_real_exp[CLDFB_NO_COL_MAX + CLDFB_PLC_XF]; + Word16 rec_imag_exp[CLDFB_NO_COL_MAX + CLDFB_PLC_XF];*/ + /* reset of accumulators */ + ph_adj_fx = 0; + drho_fx = 0; + srho_fx = 0; + dth_fx = 0; + sth_fx = 0; + Word16 sqrt_exp = 0, sqrt_exp1; + Word32 temp_32; + Word16 lshift; + Word64 temp_64, real_sum, imag_sum; + /* calculate per-sample phase and magnitude evolution in preceding frame */ + FOR( k = 0; k < iNumCols; k++ ) + { + real_sum = W_mult_32_32( prev_real_fx[k], prev_real_fx[k] ); + rat_real_sum_q = add( shl( exp, 1 ), 1 ); + imag_sum = W_mult_32_32( prev_imag_fx[k], prev_imag_fx[k] ); + rat_imag_sum_q = add( shl( exp, 1 ), 1 ); + temp_64 = W_add( real_sum, imag_sum ); + lshift = W_norm( temp_64 ); + temp_32 = W_extract_h( W_shl( temp_64, lshift ) ); + sqrt_exp = sub( add( shl( exp, 1 ), lshift ), 31 ); + sqrt_exp = sub( 31, sqrt_exp ); + urh_fx[k] = Sqrt32( temp_32, &sqrt_exp ); + urh_exp[k] = sub( 31, sqrt_exp ); + // In Float the condition is if ( urh[k] < EPSILON ) + IF( EQ_32( urh_fx[k], 0 ) ) + { + /* zero encountered */ + BREAK; + } + + uth_fx[k] = L_shl( BASOP_util_atan2( prev_imag_fx[k], prev_real_fx[k], 0 ), 15 ); // Q28 + /* phase unwrap */ + IF( EQ_32( k, 0 ) ) + { + uthu_fx[0] = uth_fx[0]; + } + ELSE + { + /* phase unwrap */ + ph_diff_fx = L_sub( uth_fx[k], uth_fx[k - 1] ); + + uthu_fx[k] = uth_fx[k]; + Word32 quot_fx_durho; + Word16 s = 0, s_diff; + Word32 add_fact, quo_sq; + IF( GE_32( L_abs( ph_diff_fx ), L_shr( PI2_FX, 2 ) ) ) + { + temp_32 = L_deposit_h( BASOP_Util_Divide3232_Scale( ph_diff_fx, PI2_FX, &s ) ); // Q(31) + ph_adj_t_fx = ( temp_32 == ONE_IN_Q30 ) ? L_sub( ONE_IN_Q31, 1 ) : L_shl( temp_32, s ); + IF( EQ_32( L_abs( L_sub( L_add( ph_adj_t_fx, 1 ), L_shr( ph_adj_t_fx, 31 ) ) ), ONE_IN_Q30 ) ) + { + ph_adj_t_fx = L_shr( ph_adj_t_fx, 31 ); + } + add_fact = ( L_abs( ph_adj_t_fx ) >= ONE_IN_Q30 ) ? ( ( ph_adj_t_fx < 0 ) ? 1686629713 : -1686629713 ) : 0; + ph_adj_fx = W_add( add_fact, ph_adj_fx ); // Q28 + } + /* unwrapped phase in uthu */ + uthu_fx[k] = W_add( uthu_fx[k], ph_adj_fx ); // Q28 + /* mean and stdev of per-sample magnitude ratios */ + s_diff = sub( urh_exp[k - 1], urh_exp[k] ); + temp_16 = BASOP_Util_Divide3232_Scale( urh_fx[k], urh_fx[k - 1], &s ); + quot_fx = L_shl( temp_16, 16 ); // Q(31-s) + quot_exp[k] = sub( sub( 31, s_diff ), s ); + quot_fx_durho = quot_fx; + drho_exp[k] = quot_exp[k]; + IF( GE_32( k, 2 ) ) + { + IF( LT_16( drho_exp[k - 1], drho_exp[k] ) ) + { + quot_fx_durho = L_shr( quot_fx_durho, sub( drho_exp[k], drho_exp[k - 1] ) ); + drho_exp[k] = drho_exp[k - 1]; + } + ELSE IF( GT_16( drho_exp[k - 1], drho_exp[k] ) ) + { + drho_fx = W_shr( drho_fx, sub( drho_exp[k - 1], drho_exp[k] ) ); + } + } + drho_fx = W_add( quot_fx_durho, drho_fx ); // Q(31-s) + srho_exp[k] = sub( 31, shl( add( s_diff, s ), 1 ) ); + quo_sq = Mpy_32_32( quot_fx, quot_fx ); + IF( GE_32( k, 2 ) ) + { + IF( LT_16( srho_exp[k - 1], srho_exp[k] ) ) + { + quo_sq = L_shr( quo_sq, sub( srho_exp[k], srho_exp[k - 1] ) ); + srho_exp[k] = srho_exp[k - 1]; + } + ELSE IF( GT_16( srho_exp[k - 1], srho_exp[k] ) ) + { + srho_fx = W_shr( srho_fx, sub( srho_exp[k - 1], srho_exp[k] ) ); + } + } + srho_fx = W_add( srho_fx, quo_sq ); // Q(31-s) + diff_fx = W_sub( uthu_fx[k], uthu_fx[k - 1] ); // Q28 /* the mean value calculation could be optimized */ + + dth_fx = W_add( dth_fx, diff_fx ); // Q28 + temp_32 = W_extract_l( diff_fx ); + sth_fx = W_add( sth_fx, (Word64) Mpy_32_32( temp_32, temp_32 ) ); // Q25 + + /* mean and stdev of per-sample phase differences */ + } + } + + Word16 tmp_e, tmp, drho_sqr_q, temp_q; + Word32 divide_fact, drho_32, drho_sqr, dth_sqr; + IF( EQ_32( k, iNumCols ) ) + { + + tmp = BASOP_Util_Divide1616_Scale( 1, sub( iNumCols, 1 ), &tmp_e ); + divide_fact = L_shl( tmp, sub( 31, add( 15, negate( tmp_e ) ) ) ); // Q31 + /* mean and stdev of per-sample magnitude ratios */ + lshift = W_norm( drho_fx ); + tmp_e = drho_exp[k - 1]; + IF( LT_16( lshift, 32 ) ) + { + drho_fx = W_shl( drho_fx, lshift ); + tmp_e = add( tmp_e, lshift ); + } + drho_32 = W_extract_h( drho_fx ); // Qtmp_e-32 + drho_32 = Mpy_32_32( drho_32, divide_fact ); + drho_sqr = Mpy_32_32( drho_32, drho_32 ); // Q(2*(tmp_e -32) - 31) + temp_64 = W_mult_32_32( sub( iNumCols, 1 ), drho_sqr ); // Q(2*(tmp_e -32) - 30) + drho_sqr_q = sub( shl( sub( tmp_e, 32 ), 1 ), 30 ); + temp_q = srho_exp[k - 1]; + IF( GT_16( srho_exp[k - 1], drho_sqr_q ) ) + { + temp_64 = W_shl( temp_64, sub( srho_exp[k - 1], drho_sqr_q ) ); + temp_q = srho_exp[k - 1]; + } + ELSE IF( GT_16( drho_sqr_q, srho_exp[k - 1] ) ) + { + srho_fx = W_shl( srho_fx, sub( drho_sqr_q, srho_exp[k - 1] ) ); + temp_q = drho_sqr_q; + } + temp_64 = W_sub( srho_fx, temp_64 ); + drho_q = sub( tmp_e, 32 ); + IF( GT_64( temp_64, 0 ) ) + { + lshift = W_norm( temp_64 ); + temp_32 = W_extract_h( W_shl( temp_64, lshift ) ); + sqrt_exp = sub( add( temp_q, lshift ), 32 ); + tmp = BASOP_Util_Divide1616_Scale( 1, sub( iNumCols, 2 ), &tmp_e ); + divide_fact = L_shl( tmp, sub( 31, add( 15, negate( tmp_e ) ) ) ); // Q31 + temp_32 = Mpy_32_32( temp_32, divide_fact ); // Qsqrt_exp + sqrt_exp1 = sub( 31, sqrt_exp ); + srho_fx = Sqrt32( temp_32, &sqrt_exp1 ); + srho_q = sub( 31, sqrt_exp1 ); + } + ELSE + { + srho_q = 31; + srho_fx = 0; + } + /* mean and stdev of per-sample phase differences */ + tmp = BASOP_Util_Divide1616_Scale( 1, sub( iNumCols, 1 ), &tmp_e ); + divide_fact = L_shl( tmp, sub( 31, add( 15, negate( tmp_e ) ) ) ); // Q31 + /* mean and stdev of per-sample phase differences */ + lshift = W_norm( dth_fx ); + dth_fx = W_shl( dth_fx, lshift ); // Q28+lshift + dth32 = W_extract_h( dth_fx ); // Q28+lshift-32 + dth_q = sub( add( 28, lshift ), 32 ); + dth32 = Mpy_32_32( dth32, divide_fact ); + dth_sqr = Mpy_32_32( dth32, dth32 ); // Q28+lshift-32 + temp_64 = W_mult_32_32( sub( iNumCols, 1 ), dth_sqr ); // Q(2*lshift-39) + temp_q = sub( sub( shl( lshift, 1 ), 8 ), 30 ); + // printf( "%f \t", temp ); + IF( GT_16( temp_q, 25 ) ) + { + + sth_fx = W_shl( sth_fx, sub( temp_q, 25 ) ); + } + ELSE IF( GT_16( 25, temp_q ) ) + { + temp_64 = W_shl( temp_64, sub( 25, temp_q ) ); + temp_q = 25; + } + + temp_64 = W_sub( sth_fx, temp_64 ); + IF( GT_64( temp_64, 0 ) ) + { + lshift = W_norm( temp_64 ); + temp_32 = W_extract_h( W_shl( temp_64, lshift ) ); + sqrt_exp = sub( add( temp_q, lshift ), 32 ); + tmp = BASOP_Util_Divide1616_Scale( 1, sub( iNumCols, 2 ), &tmp_e ); + divide_fact = L_shl( tmp, sub( 31, add( 15, negate( tmp_e ) ) ) ); // Q31 + temp_32 = Mpy_32_32( temp_32, divide_fact ); // Qsqrt_exp + sqrt_exp1 = sub( 31, sqrt_exp ); + sth_fx = Sqrt32( temp_32, &sqrt_exp1 ); + sth_q = sub( 31, sqrt_exp1 ); + } + ELSE + { + sth_fx = 0; + sth_q = 31; + } + + /* do phase extension only IF the std deviations are small */ + IF( LT_64( srho_fx, W_shl( SRHO_THRESH_FX, sub( srho_q, 31 ) ) ) || LT_64( sth_fx, W_shl( STH_THRESH_FX, sub( sth_q, 31 ) ) ) ) + { + dth32 = L_shl( Mpy_32_32( dth32, PI_CONST ), sub( 31, dth_q ) ); // Q28+lshift-32-16 + dth16 = extract_h( dth32 ); + fac_ph_real_fx = L_deposit_h( getCosWord16R2( dth16 ) ); + fac_ph_imag_fx = L_deposit_h( getSineWord16R2( dth16 ) ); + ///* calculate complex evolution factor */ + fac_real_fx = Mpy_32_32( min( L_shl( 1, drho_q ), drho_32 ), fac_ph_real_fx ); // Qdrho_exp + fac_imag_fx = Mpy_32_32( min( L_shl( 1, drho_q ), drho_32 ), fac_ph_imag_fx ); // Qdrho_exp +#if START_VAL_AVG_LEN > 1 + /* Calculate start value FOR evolution from last samples of previous frame */ + fac_powj_real_fx = fac_real_fx; + fac_powj_imag_fx = fac_imag_fx; + start_real_fx = prev_real_fx[iNumCols - 1]; + start_imag_fx = prev_imag_fx[iNumCols - 1]; + FOR( j = 1; j < START_VAL_AVG_LEN; j++ ) + { + start_real_fx = L_add( L_shr( start_real_fx, sub( exp, sub( add( drho_q, exp ), 31 ) ) ), L_sub( Mpy_32_32( fac_powj_real_fx, prev_real_fx[iNumCols - j - 1] ), Mpy_32_32( fac_powj_imag_fx, prev_imag_fx[iNumCols - j - 1] ) ) ); // Q(drho_q+exp-31) + start_imag_fx = L_add( L_shr( start_imag_fx, sub( exp, sub( add( drho_q, exp ), 31 ) ) ), L_add( Mpy_32_32( fac_powj_imag_fx, prev_real_fx[iNumCols - j - 1] ), Mpy_32_32( fac_powj_real_fx, prev_imag_fx[iNumCols - j - 1] ) ) ); // Q(drho_q+exp-31) + temp_fx = L_shl( L_sub( Mpy_32_32( fac_powj_real_fx, fac_real_fx ), Mpy_32_32( fac_powj_imag_fx, fac_imag_fx ) ), sub( sub( drho_q, shl( drho_q, 1 ) ), 31 ) ); // Qdrho_q + fac_powj_imag_fx = L_shl( L_add( Mpy_32_32( fac_powj_imag_fx, fac_real_fx ), Mpy_32_32( fac_powj_real_fx, fac_imag_fx ) ), sub( sub( drho_q, shl( drho_q, 1 ) ), 31 ) ); // Qdrho_q + fac_powj_real_fx = temp_fx; + } + start_q = sub( add( drho_q, exp ), 30 ); +#else + /* take last sample of previous frame as start value */ + start_real = prev_real[iNumCols - 1]; + start_imag = prev_imag[iNumCols - 1]; +#endif + +#if DO_PERTURB != 0 + + /* make evolution less static: apply per samples differences as in preceding frame */ + rat_real_fx = W_add( W_mult_32_32( prev_real_fx[1], prev_real_fx[0] ), W_mult_32_32( prev_imag_fx[1], prev_imag_fx[0] ) ); // 2*exp + rat_imag_fx = W_add( W_mult_32_32( -prev_real_fx[1], prev_imag_fx[0] ), W_mult_32_32( prev_imag_fx[1], prev_real_fx[0] ) ); // 2*exp + +#if PH_PERT_ONLY != 0 + + lshift = W_norm( rat_real_fx ); + temp_64 = W_shl( rat_real_fx, lshift ); // Q2*exp+lshift + rat_real32_fx = W_extract_h( temp_64 ); // Q2*exp+lshift-31 + rat_real_q = sub( add( shl( exp, 1 ), lshift ), 31 ); + lshift = W_norm( rat_imag_fx ); + temp_64 = W_shl( rat_imag_fx, lshift ); // Q2*exp+lshift + rat_imag32_fx = W_extract_h( temp_64 ); // Q2*exp+lshift-31 + rat_imag_q = sub( add( shl( exp, 1 ), lshift ), 31 ); + real_sum = W_mult_32_32( rat_real32_fx, rat_real32_fx ); + rat_real_sum_q = add( shl( rat_real_q, 1 ), 1 ); + imag_sum = W_mult_32_32( rat_imag32_fx, rat_imag32_fx ); + rat_imag_sum_q = add( shl( rat_imag_q, 1 ), 1 ); + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + sqrt_exp = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + sqrt_exp = rat_real_sum_q; + } + temp_64 = W_add( W_shr( real_sum, 1 ), W_shr( imag_sum, 1 ) ); + lshift = W_norm( temp_64 ); + temp_64 = W_shl( temp_64, lshift ); + temp_32 = W_extract_h( temp_64 ); + sqrt_exp = sub( add( sub( sqrt_exp, 1 ), lshift ), 32 ); + /* only phase perturbation */ + sqrt_exp = sub( 31, sqrt_exp ); + tmp_e = 0; + abs_temp_fx = Sqrt32( temp_32, &sqrt_exp ); // Q(31-sqrt_exp) + + lshift = norm_l( drho_32 ); + drho_32 = L_shl( drho_32, lshift ); + drho_q = add( drho_q, lshift ); + IF( EQ_16( drho_q, 31 ) ) + { + abs2inv_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( L_min( ONE_IN_Q31, drho_32 ), L_max( 1, abs_temp_fx ), &tmp_e ) ); // +drho_q +sqrt_exp-tmp_e + } + ELSE + { + abs2inv_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( L_min( L_shl( 1, drho_q ), drho_32 ), L_max( 1, abs_temp_fx ), &tmp_e ) ); // +drho_q +sqrt_exp-tmp_e + } + temp_16 = sub( add( drho_q, sqrt_exp ), tmp_e ); + + rat_real_fx = W_mult_32_32( rat_real32_fx, abs2inv_fx ); + + rat_imag_fx = W_mult_32_32( rat_imag32_fx, abs2inv_fx ); + rat_real_q = add( add( rat_real_q, temp_16 ), 1 ); + + rat_imag_q = add( add( rat_imag_q, temp_16 ), 1 ); + +#else + /* phase and magnitude perturbation */ + abs2inv = 1 / ( max( 1, drho ) * ( SQR( prev_real[0] ) + SQR( prev_imag[0] ) ) ); + rat_real *= abs2inv; + rat_imag *= abs2inv; +#endif + lshift = W_norm( rat_real_fx ); + temp_64 = W_shl( rat_real_fx, lshift ); // Q2*exp+lshift + rat_real32_fx = W_extract_h( temp_64 ); // Q2*exp+lshift-31 + rat_real_q = sub( add( rat_real_q, lshift ), 32 ); + lshift = W_norm( rat_imag_fx ); + temp_64 = W_shl( rat_imag_fx, lshift ); // Q2*exp+lshift + rat_imag32_fx = W_extract_h( temp_64 ); // Q2*exp+lshift-31 + rat_imag_q = sub( add( rat_imag_q, lshift ), 32 ); + + /* apply complex evolution FOR first substitution sample */ + + real_sum = W_mult_32_32( rat_real32_fx, start_real_fx ); + rat_real_sum_q = add( add( rat_real_q, start_q ), 1 ); + imag_sum = W_mult_32_32( rat_imag32_fx, start_imag_fx ); + rat_imag_sum_q = add( add( rat_imag_q, start_q ), 1 ); + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + sqrt_exp = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + sqrt_exp = rat_real_sum_q; + } + temp_64 = W_sub( real_sum, imag_sum ); + lshift = W_norm( temp_64 ); + temp_64 = W_shl( temp_64, lshift ); + rec_real_fx[0] = W_extract_h( temp_64 ); // sqrt_exp + lshift-32 + rec_real_exp[0] = sub( add( sqrt_exp, lshift ), 32 ); + + real_sum = W_mult_32_32( rat_imag32_fx, start_real_fx ); + rat_real_sum_q = add( add( rat_imag_q, start_q ), 1 ); + imag_sum = W_mult_32_32( rat_real32_fx, start_imag_fx ); + rat_imag_sum_q = add( add( rat_real_q, start_q ), 1 ); + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + sqrt_exp = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + sqrt_exp = rat_real_sum_q; + } + temp_64 = W_add( real_sum, imag_sum ); + lshift = W_norm( temp_64 ); + temp_64 = W_shl( temp_64, lshift ); + rec_imag_fx[0] = W_extract_h( temp_64 ); // sqrt_exp + lshift-32 + rec_imag_exp[0] = sub( add( sqrt_exp, lshift ), 32 ); + FOR( j = 2; j < iNumCols; j++ ) + { + rat_real_fx = W_add( W_mult_32_32( prev_real_fx[j], prev_real_fx[j - 1] ), W_mult_32_32( prev_imag_fx[j], prev_imag_fx[j - 1] ) ); // 2*exp + rat_imag_fx = W_add( W_mult_32_32( -prev_real_fx[j], prev_imag_fx[j - 1] ), W_mult_32_32( prev_imag_fx[j], prev_real_fx[j - 1] ) ); // 2*exp +#if PH_PERT_ONLY != 0 + lshift = W_norm( rat_real_fx ); + temp_64 = W_shl( rat_real_fx, lshift ); // Q2*exp+lshift + rat_real32_fx = W_extract_h( temp_64 ); // Q2*exp+lshift-31 + rat_real_q = sub( add( shl( exp, 1 ), lshift ), 31 ); + lshift = W_norm( rat_imag_fx ); + temp_64 = W_shl( rat_imag_fx, lshift ); // Q2*exp+lshift + rat_imag32_fx = W_extract_h( temp_64 ); // Q2*exp+lshift-31 + rat_imag_q = sub( add( shl( exp, 1 ), lshift ), 31 ); + real_sum = W_mult_32_32( rat_real32_fx, rat_real32_fx ); + rat_real_sum_q = add( shl( rat_real_q, 1 ), 1 ); + imag_sum = W_mult_32_32( rat_imag32_fx, rat_imag32_fx ); + rat_imag_sum_q = add( shl( rat_imag_q, 1 ), 1 ); + + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + sqrt_exp = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + sqrt_exp = rat_real_sum_q; + } + + temp_64 = W_add( W_shr( real_sum, 1 ), W_shr( imag_sum, 1 ) ); + lshift = W_norm( temp_64 ); + temp_64 = W_shl( temp_64, lshift ); + temp_32 = W_extract_h( temp_64 ); + sqrt_exp = sub( add( sub( sqrt_exp, 1 ), lshift ), 32 ); + /* only phase perturbation */ + sqrt_exp = sub( 31, sqrt_exp ); + tmp_e = 0; + abs_temp_fx = Sqrt32( temp_32, &sqrt_exp ); // Q(31-sqrt_exp) + + IF( EQ_16( drho_q, 31 ) ) + { + abs2inv_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( min( ONE_IN_Q31, drho_32 ), max( 1, abs_temp_fx ), &tmp_e ) ); // +drho_q +sqrt_exp-tmp_e + } + ELSE + { + abs2inv_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( min( L_shl( 1, drho_q ), drho_32 ), max( 1, abs_temp_fx ), &tmp_e ) ); // +drho_q +sqrt_exp-tmp_e + } + temp_16 = sub( add( drho_q, sqrt_exp ), tmp_e ); + + rat_real_fx = W_mult_32_32( rat_real32_fx, abs2inv_fx ); + rat_imag_fx = W_mult_32_32( rat_imag32_fx, abs2inv_fx ); + rat_real_q = add( add( rat_real_q, temp_16 ), 1 ); + rat_imag_q = add( add( rat_imag_q, temp_16 ), 1 ); + +#else + /* phase and magnitude perturbation */ + abs2inv = 1 / ( max( 1, drho ) * ( SQR( prev_real[j - 1] ) + SQR( prev_imag[j - 1] ) ) ); +#endif + + lshift = W_norm( rat_real_fx ); + temp_64 = W_shl( rat_real_fx, lshift ); // Q2*exp+lshift + rat_real32_fx = W_extract_h( temp_64 ); // Q2*exp+lshift-31 + rat_real_q = sub( add( rat_real_q, lshift ), 32 ); + lshift = W_norm( rat_imag_fx ); + temp_64 = W_shl( rat_imag_fx, lshift ); // Q2*exp+lshift + rat_imag32_fx = W_extract_h( temp_64 ); // Q2*exp+lshift-31 + rat_imag_q = sub( add( rat_imag_q, lshift ), 32 ); + + + real_sum = W_mult_32_32( rat_real32_fx, rec_real_fx[j - 2] ); + rat_real_sum_q = add( add( rat_real_q, rec_real_exp[j - 2] ), 1 ); + imag_sum = W_mult_32_32( rat_imag32_fx, rec_imag_fx[j - 2] ); + rat_imag_sum_q = add( add( rat_imag_q, rec_imag_exp[j - 2] ), 1 ); + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + sqrt_exp = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + sqrt_exp = rat_real_sum_q; + } + temp_64 = W_sub( W_shr( real_sum, 1 ), W_shr( imag_sum, 1 ) ); + lshift = W_norm( temp_64 ); + temp_64 = W_shl( temp_64, lshift ); + rec_real_fx[j - 1] = W_extract_h( temp_64 ); // sqrt_exp + lshift-32 + rec_real_exp[j - 1] = sub( add( sub( sqrt_exp, 1 ), lshift ), 32 ); + + real_sum = W_mult_32_32( rat_imag32_fx, rec_real_fx[j - 2] ); + rat_real_sum_q = add( add( rat_imag_q, rec_real_exp[j - 2] ), 1 ); + imag_sum = W_mult_32_32( rat_real32_fx, rec_imag_fx[j - 2] ); + rat_imag_sum_q = add( add( rat_real_q, rec_imag_exp[j - 2] ), 1 ); + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + sqrt_exp = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + sqrt_exp = rat_real_sum_q; + } + temp_64 = W_add( W_shr( real_sum, 1 ), W_shr( imag_sum, 1 ) ); + lshift = W_norm( temp_64 ); + temp_64 = W_shl( temp_64, lshift ); + rec_imag_fx[j - 1] = W_extract_h( temp_64 ); // sqrt_exp + lshift-32 + rec_imag_exp[j - 1] = sub( add( sub( sqrt_exp, 1 ), lshift ), 32 ); + } + + /* do the same FOR samples of crossfade region */ + FOR( j = 1; j < CLDFB_PLC_XF + 2; j++ ) + { + rat_real_fx = W_add( W_mult_32_32( prev_real_fx[j], prev_real_fx[j - 1] ), W_mult_32_32( prev_imag_fx[j], prev_imag_fx[j - 1] ) ); // 2*exp + rat_imag_fx = W_add( W_mult_32_32( -prev_real_fx[j], prev_imag_fx[j - 1] ), W_mult_32_32( prev_imag_fx[j], prev_real_fx[j - 1] ) ); // 2*exp + +#if PH_PERT_ONLY != 0 + + lshift = W_norm( rat_real_fx ); + temp_64 = W_shl( rat_real_fx, lshift ); // Q2*exp+lshift + rat_real32_fx = W_extract_h( temp_64 ); // Q2*exp+lshift-31 + rat_real_q = sub( add( shl( exp, 1 ), lshift ), 31 ); + lshift = W_norm( rat_imag_fx ); + temp_64 = W_shl( rat_imag_fx, lshift ); // Q2*exp+lshift + rat_imag32_fx = W_extract_h( temp_64 ); // Q2*exp+lshift-31 + rat_imag_q = sub( add( shl( exp, 1 ), lshift ), 31 ); + real_sum = W_mult_32_32( rat_real32_fx, rat_real32_fx ); + rat_real_sum_q = add( shl( rat_real_q, 1 ), 1 ); + imag_sum = W_mult_32_32( rat_imag32_fx, rat_imag32_fx ); + rat_imag_sum_q = add( shl( rat_imag_q, 1 ), 1 ); + + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + sqrt_exp = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + sqrt_exp = rat_real_sum_q; + } + temp_64 = W_add( W_shr( real_sum, 1 ), W_shr( imag_sum, 1 ) ); + lshift = W_norm( temp_64 ); + temp_64 = W_shl( temp_64, lshift ); + temp_32 = W_extract_h( temp_64 ); + sqrt_exp = sub( add( sub( sqrt_exp, 1 ), lshift ), 32 ); + /* only phase perturbation */ + sqrt_exp = sub( 31, sqrt_exp ); + tmp_e = 0; + abs_temp_fx = Sqrt32( temp_32, &sqrt_exp ); // Q(31-sqrt_exp) + + IF( EQ_16( drho_q, 31 ) ) + { + abs2inv_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( min( ONE_IN_Q31, drho_32 ), max( 1, abs_temp_fx ), &tmp_e ) ); // +drho_q +sqrt_exp-tmp_e + } + ELSE + { + abs2inv_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( min( L_shl( 1, drho_q ), drho_32 ), max( 1, abs_temp_fx ), &tmp_e ) ); // +drho_q +sqrt_exp-tmp_e + } + temp_16 = sub( add( drho_q, sqrt_exp ), tmp_e ); + rat_real_fx = W_mult_32_32( rat_real32_fx, abs2inv_fx ); + rat_imag_fx = W_mult_32_32( rat_imag32_fx, abs2inv_fx ); + rat_real_q = add( add( rat_real_q, temp_16 ), 1 ); + rat_imag_q = add( add( rat_imag_q, temp_16 ), 1 ); +#else + abs2inv = 1 / ( max( 1, drho ) * ( SQR( prev_real[j - 1] ) + SQR( prev_imag[j - 1] ) ) ); +#endif + lshift = W_norm( rat_real_fx ); + temp_64 = W_shl( rat_real_fx, lshift ); // Q2*exp+lshift + rat_real32_fx = W_extract_h( temp_64 ); // Q2*exp+lshift-31 + rat_real_q = sub( add( rat_real_q, lshift ), 32 ); + lshift = W_norm( rat_imag_fx ); + temp_64 = W_shl( rat_imag_fx, lshift ); // Q2*exp+lshift + rat_imag32_fx = W_extract_h( temp_64 ); // Q2*exp+lshift-31 + rat_imag_q = sub( add( rat_imag_q, lshift ), 32 ); + + + real_sum = W_mult_32_32( rat_real32_fx, rec_real_fx[j + iNumCols - 3] ); + rat_real_sum_q = add( add( rat_real_q, rec_real_exp[j + iNumCols - 3] ), 1 ); + imag_sum = W_mult_32_32( rat_imag32_fx, rec_imag_fx[j + iNumCols - 3] ); + rat_imag_sum_q = add( add( rat_imag_q, rec_imag_exp[j + iNumCols - 3] ), 1 ); + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + sqrt_exp = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + sqrt_exp = rat_real_sum_q; + } + temp_64 = W_sub( W_shr( real_sum, 1 ), W_shr( imag_sum, 1 ) ); + lshift = W_norm( temp_64 ); + temp_64 = W_shl( temp_64, lshift ); + rec_real_fx[j + iNumCols - 2] = W_extract_h( temp_64 ); // sqrt_exp + lshift-32 + rec_real_exp[j + iNumCols - 2] = sub( add( sub( sqrt_exp, 1 ), lshift ), 32 ); + + real_sum = W_mult_32_32( rat_imag32_fx, rec_real_fx[j + iNumCols - 3] ); + rat_real_sum_q = add( add( rat_imag_q, rec_real_exp[j + iNumCols - 3] ), 1 ); + imag_sum = W_mult_32_32( rat_real32_fx, rec_imag_fx[j + iNumCols - 3] ); + rat_imag_sum_q = add( add( rat_real_q, rec_imag_exp[j + iNumCols - 3] ), 1 ); + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + sqrt_exp = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + sqrt_exp = rat_real_sum_q; + } + temp_64 = W_add( W_shr( real_sum, 1 ), W_shr( imag_sum, 1 ) ); + lshift = W_norm( temp_64 ); + temp_64 = W_shl( temp_64, lshift ); + rec_imag_fx[j + iNumCols - 2] = W_extract_h( temp_64 ); // sqrt_exp + lshift-32 + rec_imag_exp[j + iNumCols - 2] = sub( add( sub( sqrt_exp, 1 ), lshift ), 32 ); + } +#else + rec_real[0] = fac_real * start_real - fac_imag * start_imag; + rec_imag[0] = fac_imag * start_real + fac_real * start_imag; + FOR( j = 1; j < iNumCols + CLDFB_PLC_XF; j++ ) + { + rec_real[j] = fac_real * rec_real[j - 1] - fac_imag * rec_imag[j - 1]; + rec_imag[j] = fac_imag * rec_real[j - 1] + fac_real * rec_imag[j - 1]; + } +#endif + +#if CLDFB_PLC_XF > 0 + /* apply crossfade */ + FOR( j = 0; j < CLDFB_PLC_XF; j++ ) + { + rec_real_fx[iNumCols + j] = Mpy_32_32( xf_alp_fx[j], rec_real_fx[iNumCols + j] ); + rec_imag_fx[iNumCols + j] = Mpy_32_32( xf_alp_fx[j], rec_imag_fx[iNumCols + j] ); + xf_bet_fx[j] = L_sub( ONE_IN_Q31, xf_alp_fx[j] ); + } +#endif + } + ELSE + { + Word16 guard_bits = find_guarded_bits_fx( iNumCols ); + /* do complex lpc combined with frame repetition */ + Ruu_real_fx[0] = W_add( W_shr( W_mult_32_32( prev_real_fx[0], prev_real_fx[0] ), guard_bits ), W_shr( W_mult_32_32( prev_imag_fx[0], prev_imag_fx[0] ), guard_bits ) ); + Ruu_real_fx[1] = 0; + Ruu_imag_fx[1] = 0; + FOR( j = 1; j < iNumCols; j++ ) + { + Ruu_real_fx[0] = W_add( Ruu_real_fx[0], W_add( W_shr( W_mult_32_32( prev_real_fx[j], prev_real_fx[j] ), guard_bits ), W_shr( W_mult_32_32( prev_imag_fx[j], prev_imag_fx[j] ), guard_bits ) ) ); + Ruu_real_fx[1] = W_add( Ruu_real_fx[1], W_add( W_shr( W_mult_32_32( prev_real_fx[j], prev_real_fx[j - 1] ), guard_bits ), W_shr( W_mult_32_32( prev_imag_fx[j], prev_imag_fx[j - 1] ), guard_bits ) ) ); + Ruu_imag_fx[1] = W_add( Ruu_imag_fx[1], W_sub( W_shr( W_mult_32_32( prev_imag_fx[j], prev_real_fx[j - 1] ), guard_bits ), W_shr( W_mult_32_32( prev_real_fx[j], prev_imag_fx[j - 1] ), guard_bits ) ) ); + } + // printf( "%.7f \t", Ruu_real[1] + lshift = W_norm( Ruu_real_fx[0] ); + Ruu_real_fx_0 = W_extract_h( W_shl( Ruu_real_fx[0], lshift ) ); + Ruu_real_fx_0_q = sub( add( sub( add( shl( exp, 1 ), 1 ), guard_bits ), lshift ), 32 ); + lshift = W_norm( Ruu_real_fx[0] ); + Ruu_real_fx_1 = W_extract_h( W_shl( Ruu_real_fx[1], lshift ) ); + Ruu_real_fx_1_q = sub( add( sub( add( shl( exp, 1 ), 1 ), guard_bits ), lshift ), 32 ); + lshift = W_norm( Ruu_real_fx[0] ); + Ruu_imag_fx_1 = W_extract_h( W_shl( Ruu_imag_fx[1], lshift ) ); + Ruu_imag_fx_1_q = sub( add( sub( add( shl( exp, 1 ), 1 ), guard_bits ), lshift ), 32 ); + IF( GT_64( Ruu_real_fx[0], 0 ) ) + { + /* prediction coefficient */ + fac_real_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( Ruu_real_fx_1, Ruu_real_fx_0, &tmp_e ) ); + fac_real_q = sub( add( sub( 31, tmp_e ), Ruu_real_fx_1_q ), Ruu_real_fx_0_q ); + fac_imag_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( Ruu_imag_fx_1, Ruu_real_fx_0, &tmp_e ) ); + fac_imag_q = sub( add( sub( 31, tmp_e ), Ruu_imag_fx_1_q ), Ruu_real_fx_0_q ); + } + ELSE + { + fac_imag_fx = 0; + fac_imag_q = 31; + fac_real_fx = 0; + fac_real_q = 31; + } + + /* apply prediction using last sample of preceding frame as start value and combine with previous frame samples */ + fac_powj_real_fx = fac_real_fx; + fac_powj_imag_fx = fac_imag_fx; + + Word16 powj_real_q = fac_real_q; + Word16 powj_imag_q = fac_imag_q; + + real_sum = W_mult_32_32( fac_real_fx, fac_real_fx ); + rat_real_sum_q = add( shl( fac_real_q, 1 ), 1 ); + imag_sum = W_mult_32_32( fac_imag_fx, fac_imag_fx ); + rat_imag_sum_q = add( shl( fac_imag_q, 1 ), 1 ); + + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + sqrt_exp = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + sqrt_exp = rat_real_sum_q; + } + abs_fac_fx = W_add( W_shr( real_sum, 1 ), W_shr( imag_sum, 1 ) ); + lshift = W_norm( abs_fac_fx ); + abs_fac_32 = W_extract_h( W_shl( abs_fac_fx, lshift ) ); + sqrt_exp = sub( 31, ( sub( add( sub( sqrt_exp, 1 ), lshift ), 32 ) ) ); + abs_fac_32 = Sqrt32( abs_fac_32, &sqrt_exp ); + sqrt_exp = sub( 31, sqrt_exp ); + abs_fac_32 = L_shr( abs_fac_32, sub( sqrt_exp, 31 ) ); // Q31 + sqrt_exp = 31; + abs_fac_powj_32 = L_shr( abs_fac_32, 1 ); // Q30 + sqrt_exp = 30; + + FOR( j = 0; j < iNumCols; j++ ) + { + comp_fac_fx = L_sub( L_shl( 1, sqrt_exp ), abs_fac_powj_32 ); + real_sum = W_mult_32_32( prev_real_fx[iNumCols - 1], fac_powj_real_fx ); + rat_real_sum_q = add( add( exp, powj_real_q ), 1 ); + imag_sum = W_mult_32_32( prev_imag_fx[iNumCols - 1], fac_powj_imag_fx ); + rat_imag_sum_q = add( add( exp, powj_imag_q ), 1 ); + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + rat_real_sum_q = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + /*sqrt_exp = rat_real_sum_q;*/ + } + real_sum = W_sub( W_shr( real_sum, guard_bits ), W_shr( imag_sum, guard_bits ) ); + rat_real_sum_q = sub( rat_real_sum_q, guard_bits ); + imag_sum = W_mult_32_32( prev_real_fx[j], comp_fac_fx ); + rat_imag_sum_q = add( add( exp, sqrt_exp ), 1 ); + + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + rat_real_sum_q = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + /*sqrt_exp = rat_real_sum_q;*/ + } + real_sum = W_add( W_shr( real_sum, guard_bits ), W_shr( imag_sum, guard_bits ) ); + lshift = W_norm( real_sum ); + rec_real_fx[j] = W_extract_h( W_shl( real_sum, lshift ) ); + rec_real_exp[j] = sub( add( sub( rat_real_sum_q, guard_bits ), lshift ), 32 ); + real_sum = W_mult_32_32( prev_real_fx[iNumCols - 1], fac_powj_imag_fx ); + rat_real_sum_q = add( add( exp, powj_imag_q ), 1 ); + imag_sum = W_mult_32_32( prev_imag_fx[iNumCols - 1], fac_powj_real_fx ); + rat_imag_sum_q = add( add( exp, powj_real_q ), 1 ); + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + rat_real_sum_q = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + /*sqrt_exp = rat_real_sum_q;*/ + } + real_sum = W_add( W_shr( real_sum, guard_bits ), W_shr( imag_sum, guard_bits ) ); + rat_real_sum_q = sub( rat_real_sum_q, guard_bits ); + imag_sum = W_mult_32_32( prev_imag_fx[j], comp_fac_fx ); + rat_imag_sum_q = add( add( exp, sqrt_exp ), 1 ); + + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + rat_real_sum_q = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + /*sqrt_exp = rat_real_sum_q;*/ + } + real_sum = W_add( W_shr( real_sum, guard_bits ), W_shr( imag_sum, guard_bits ) ); + + lshift = W_norm( real_sum ); + rec_imag_fx[j] = W_extract_h( W_shl( real_sum, lshift ) ); + rec_imag_exp[j] = sub( add( sub( rat_real_sum_q, guard_bits ), lshift ), 32 ); + + abs_fac_powj_32 = Mpy_32_32( abs_fac_powj_32, abs_fac_32 ); + + + real_sum = W_mult_32_32( fac_powj_real_fx, fac_real_fx ); + rat_real_sum_q = add( add( fac_real_q, powj_real_q ), 1 ); + imag_sum = W_mult_32_32( fac_powj_imag_fx, fac_imag_fx ); + rat_imag_sum_q = add( add( fac_imag_q, powj_imag_q ), 1 ); + + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + rat_real_sum_q = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + /*sqrt_exp = rat_real_sum_q;*/ + } + real_sum = W_sub( W_shr( real_sum, guard_bits ), W_shr( imag_sum, guard_bits ) ); + // rat_real_sum_q = rat_real_sum_q - 1; + lshift = W_norm( real_sum ); + temp_32 = W_extract_h( W_shl( real_sum, lshift ) ); + temp_16 = sub( add( sub( rat_real_sum_q, guard_bits ), lshift ), 32 ); + + real_sum = W_mult_32_32( fac_powj_real_fx, fac_imag_fx ); + rat_real_sum_q = fac_imag_q + powj_real_q + 1; + imag_sum = W_mult_32_32( fac_powj_imag_fx, fac_real_fx ); + rat_imag_sum_q = fac_real_q + powj_imag_q + 1; + + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + rat_real_sum_q = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + /*sqrt_exp = rat_real_sum_q;*/ + } + real_sum = W_add( W_shr( real_sum, guard_bits ), W_shr( imag_sum, guard_bits ) ); + // rat_real_sum_q = rat_real_sum_q - 1; + lshift = W_norm( real_sum ); + fac_powj_imag_fx = W_extract_h( W_shl( real_sum, lshift ) ); + powj_imag_q = sub( add( sub( rat_real_sum_q, guard_bits ), lshift ), 32 ); + + fac_powj_real_fx = temp_32; + powj_real_q = temp_16; + } + + + /* prepare XF to next frame using prediction */ + fac_powj_real_fx = fac_real_fx; + fac_powj_imag_fx = fac_imag_fx; + powj_real_q = fac_real_q; + powj_imag_q = fac_imag_q; + abs_fac_powj_32 = abs_fac_32; // Q30 + sqrt_exp = 31; +#if CLDFB_PLC_XF > 0 + guard_bits = find_guarded_bits_fx( CLDFB_PLC_XF ); + FOR( j = 0; j < CLDFB_PLC_XF; j++ ) + { + + + xf_bet_fx[j] = L_sub( ONE_IN_Q31, abs_fac_powj_32 ); + real_sum = W_mult_32_32( rec_real_fx[iNumCols - 1], fac_powj_real_fx ); + rat_real_sum_q = add( add( rec_real_exp[iNumCols - 1], powj_real_q ), 1 ); + imag_sum = W_mult_32_32( rec_imag_fx[iNumCols - 1], fac_powj_imag_fx ); + rat_imag_sum_q = add( add( rec_imag_exp[iNumCols - 1], powj_imag_q ), 1 ); + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + rat_real_sum_q = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + /*sqrt_exp = rat_real_sum_q;*/ + } + real_sum = W_sub( W_shr( real_sum, guard_bits ), W_shr( imag_sum, guard_bits ) ); + rat_real_sum_q = sub( rat_real_sum_q, guard_bits ); + + lshift = W_norm( real_sum ); + rec_real_fx[j + iNumCols] = W_extract_h( W_shl( real_sum, lshift ) ); + rec_real_exp[j + iNumCols] = sub( add( rat_real_sum_q, lshift ), 32 ); + + real_sum = W_mult_32_32( rec_real_fx[iNumCols - 1], fac_powj_imag_fx ); + rat_real_sum_q = add( add( rec_real_exp[iNumCols - 1], powj_imag_q ), 1 ); + imag_sum = W_mult_32_32( rec_imag_fx[iNumCols - 1], fac_powj_real_fx ); + rat_imag_sum_q = add( add( rec_imag_exp[iNumCols - 1], powj_real_q ), 1 ); + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + rat_real_sum_q = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + /*sqrt_exp = rat_real_sum_q;*/ + } + real_sum = W_add( W_shr( real_sum, guard_bits ), W_shr( imag_sum, guard_bits ) ); + rat_real_sum_q = sub( rat_real_sum_q, guard_bits ); + + lshift = W_norm( real_sum ); + rec_imag_fx[j + iNumCols] = W_extract_h( W_shl( real_sum, lshift ) ); + rec_imag_exp[j + iNumCols] = sub( add( rat_real_sum_q, lshift ), 32 ); + + abs_fac_powj_32 = W_extract_h( W_mult_32_32( abs_fac_powj_32, abs_fac_32 ) ); // Q31 + + real_sum = W_mult_32_32( fac_powj_real_fx, fac_real_fx ); + rat_real_sum_q = add( add( fac_real_q, powj_real_q ), 1 ); + imag_sum = W_mult_32_32( fac_powj_imag_fx, fac_imag_fx ); + rat_imag_sum_q = add( add( fac_imag_q, powj_imag_q ), 1 ); + + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + rat_real_sum_q = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + } + real_sum = W_sub( W_shr( real_sum, guard_bits ), W_shr( imag_sum, guard_bits ) ); + lshift = W_norm( real_sum ); + temp_32 = W_extract_h( W_shl( real_sum, lshift ) ); + temp_16 = sub( add( sub( rat_real_sum_q, guard_bits ), lshift ), 32 ); + + real_sum = W_mult_32_32( fac_powj_real_fx, fac_imag_fx ); + rat_real_sum_q = add( add( fac_imag_q, powj_real_q ), 1 ); + imag_sum = W_mult_32_32( fac_powj_imag_fx, fac_real_fx ); + rat_imag_sum_q = add( add( fac_real_q, powj_imag_q ), 1 ); + + IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) + { + real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); + rat_real_sum_q = rat_imag_sum_q; + } + ELSE + { + imag_sum = W_shr( imag_sum, sub( rat_imag_sum_q, rat_real_sum_q ) ); + } + real_sum = W_add( W_shr( real_sum, guard_bits ), W_shr( imag_sum, guard_bits ) ); + lshift = W_norm( real_sum ); + fac_powj_imag_fx = W_extract_h( W_shl( real_sum, lshift ) ); + powj_imag_q = sub( add( sub( rat_real_sum_q, guard_bits ), lshift ), 32 ); + + fac_powj_real_fx = temp_32; + powj_real_q = temp_16; + } +#endif + } + } + ELSE + { + FOR( j = 0; j < iNumCols; j++ ) + { + rec_real_fx[j] = prev_real_fx[j]; + rec_real_exp[j] = exp; + rec_imag_fx[j] = prev_imag_fx[j]; + rec_imag_exp[j] = exp; + } +#if CLDFB_PLC_XF > 0 + FOR( j = 0; j < CLDFB_PLC_XF; j++ ) + { + xf_bet_fx[j] = ONE_IN_Q31; + rec_real_fx[j + iNumCols] = 0; + rec_real_exp[j + iNumCols] = 31; + rec_imag_fx[j + iNumCols] = 0; + rec_imag_exp[j + iNumCols] = 31; + } +#endif + } + return; +} + + +/*------------------------------------------------------------------------- + * Function isar_splitBinRendPLCOpen() + * + * + *------------------------------------------------------------------------*/ + +ivas_error isar_splitBinRendPLCOpen( + ISAR_SPLIT_REND_PLC_HANDLE *phSplitRendPLC, + const Word16 iNumSubSets ) +{ + ivas_error error; + ISAR_SPLIT_REND_PLC_HANDLE hSplitRendPLC; + + error = IVAS_ERR_OK; + IF( ( hSplitRendPLC = (ISAR_SPLIT_REND_PLC_HANDLE) malloc( sizeof( ISAR_SPLIT_REND_PLC_STRUCT ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for bin split renderer PLC Module \n" ) ); + } + + hSplitRendPLC->prev_bfi = 0; + hSplitRendPLC->bf_count = 0; + hSplitRendPLC->iNumSubSets = iNumSubSets; + + set_l( &hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal_fx[0][0][0], 0, 2 * ( CLDFB_NO_COL_MAX + CLDFB_PLC_XF ) * CLDFB_NO_CHANNELS_MAX ); + set_l( &hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag_fx[0][0][0], 0, 2 * ( CLDFB_NO_COL_MAX + CLDFB_PLC_XF ) * CLDFB_NO_CHANNELS_MAX ); + + *phSplitRendPLC = hSplitRendPLC; + + return error; +} + +/*------------------------------------------------------------------------- + * Function isar_splitBinRendPLCClose() + * + * + *------------------------------------------------------------------------*/ + +void isar_splitBinRendPLCClose( + ISAR_SPLIT_REND_PLC_HANDLE *phSplitRendPLC ) +{ + if ( ( *phSplitRendPLC ) != NULL ) + { + free( ( *phSplitRendPLC ) ); + ( *phSplitRendPLC ) = NULL; + } + + return; +} + + +/*------------------------------------------------------------------------- + * Function isar_splitBinRendPLCsaveState() + * + * + *------------------------------------------------------------------------*/ + +void isar_splitBinRendPLCsaveState( + ISAR_SPLIT_REND_PLC_HANDLE hSplitRendPLC, + Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const Word16 num_chs, + const Word16 iNumBlocks, + const Word16 iNumIterations ) +{ + Word16 k, n; + + /* Save Cldfb frame */ + FOR( k = 0; k < ( iNumBlocks * iNumIterations ); k++ ) + { + FOR( n = 0; n < num_chs; n++ ) + { + mvl2l( &Cldfb_RealBuffer_Binaural_fx[n][k][0], &hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal_fx[n][k][0], CLDFB_NO_CHANNELS_MAX ); + mvl2l( &Cldfb_ImagBuffer_Binaural_fx[n][k][0], &hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag_fx[n][k][0], CLDFB_NO_CHANNELS_MAX ); + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * Function isar_splitBinRendPLC_xf() + * + * Cross-fade of preceding bad frame into good frame + *------------------------------------------------------------------------*/ + +void isar_splitBinRendPLC_xf_fx( + ISAR_SPLIT_REND_PLC_HANDLE hSplitRendPLC, + Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const Word16 num_chs, + const Word16 iNumBlocks, + const Word16 iNumIterations, + Word32 **ppiDecodingFailed, + Word32 **ppiDecodingFailedPrev, + Word16 exp ) +{ + Word16 n, i, k; + /* Indicate that next transition will be from a good frame */ + hSplitRendPLC->prev_bfi = 0; + move16(); + + /* Reset bf conter */ + hSplitRendPLC->bf_count = 0; + move16(); + + /* Do the cross fade */ + FOR( n = 0; n < num_chs; n++ ) + { + FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + { + Word32 iSubSet = i % hSplitRendPLC->iNumSubSets; + test(); + IF( EQ_32( ppiDecodingFailedPrev[n][iSubSet], 1 ) && EQ_32( ppiDecodingFailed[n][iSubSet], 0 ) ) + { +#if CLDFB_PLC_XF > 0 + FOR( k = 0; k < CLDFB_PLC_XF; k++ ) + { + Word32 L_tmp; + Word64 W_tmp; + Word16 shift; + W_tmp = W_shr( W_mult_32_32( hSplitRendPLC->CldfbPLC_state.xf_bet_fx[n][i][k], Cldfb_RealBuffer_Binaural_fx[n][k][i] ), 1 ); + W_tmp = W_add( W_tmp, W_shl( L_shl_r( hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal_fx[n][k + ( iNumBlocks * iNumIterations )][i], exp - hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx ), 31 ) ); + + shift = W_norm( W_tmp ); + W_tmp = W_shl( W_tmp, shift ); + L_tmp = W_extract_h( W_tmp ); + L_tmp = L_shr( L_tmp, 31 + shift - 32 ); + Cldfb_RealBuffer_Binaural_fx[n][k][i] = L_tmp; + + W_tmp = W_shr( W_mult_32_32( hSplitRendPLC->CldfbPLC_state.xf_bet_fx[n][i][k], Cldfb_ImagBuffer_Binaural_fx[n][k][i] ), 1 ); + W_tmp = W_add( W_tmp, W_shl( L_shl_r( hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag_fx[n][k + ( iNumBlocks * iNumIterations )][i], exp - hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx ), 31 ) ); + + shift = W_norm( W_tmp ); + W_tmp = W_shl( W_tmp, shift ); + L_tmp = W_extract_h( W_tmp ); + L_tmp = L_shr( L_tmp, 31 + shift - 32 ); + Cldfb_ImagBuffer_Binaural_fx[n][k][i] = L_tmp; + } +#endif + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * Function isar_splitBinRendPLC() + * + * Conceal bad frame + *------------------------------------------------------------------------*/ + +void isar_splitBinRendPLC( + ISAR_SPLIT_REND_PLC_HANDLE hSplitRendPLC, + Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const Word16 num_chs, + const Word16 iNumBlocks, + const Word16 iNumIterations, + Word32 **ppiDecodingFailed, + Word16 exp ) +{ + Word32 i, n, k; + Word32 temp_32, fade_fac_fx; + Word16 div_exp = 0, tmp, exp_fade, frac; + Word32 prev_real_fx[CLDFB_NO_COL_MAX], prev_imag_fx[CLDFB_NO_COL_MAX], rec_real_fx[CLDFB_NO_COL_MAX + CLDFB_PLC_XF], rec_imag_fx[CLDFB_NO_COL_MAX + CLDFB_PLC_XF]; + Word16 rec_real_exp[CLDFB_NO_COL_MAX + CLDFB_PLC_XF], rec_imag_exp[CLDFB_NO_COL_MAX + CLDFB_PLC_XF]; +#if CLDFB_PLC_XF > 0 + Word32 xf_alp_fx[CLDFB_PLC_XF]; +#endif + Word16 iNumCols, fade_start_cntr, mute_cntr, fade_val; + + iNumCols = extract_l( L_mult0( iNumBlocks, iNumIterations ) ); + + /* Indicate that next transition will be from a bad frame */ + hSplitRendPLC->prev_bfi = 1; + + +#if CLDFB_PLC_XF > 0 + FOR( i = 0; i < CLDFB_PLC_XF; i++ ) + { + xf_alp_fx[i] = xf_alp_tab[i]; + } +#endif + Word16 exp1 = exp; + + FOR( n = 0; n < num_chs; n++ ) + { + FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + { + Word32 iSubSet = i % hSplitRendPLC->iNumSubSets; + FOR( k = 0; k < iNumCols; k++ ) + { + prev_real_fx[k] = L_shl_r( hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal_fx[n][k][i], exp - hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx ); + prev_imag_fx[k] = L_shl_r( hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag_fx[n][k][i], exp - hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx ); + } + adaptive_polar_ext_plc_fx( + prev_real_fx, prev_imag_fx, rec_real_fx, rec_imag_fx, + rec_real_exp, rec_imag_exp +#if CLDFB_PLC_XF > 0 + , + xf_alp_fx, hSplitRendPLC->CldfbPLC_state.xf_bet_fx[n][i], +#endif + exp, + iNumCols ); + + Word16 temp16; + + FOR( k = 0; k < iNumCols; k++ ) + { + temp16 = sub( rec_real_exp[k], exp1 ); + rec_real_fx[k] = L_shr_r_sat( rec_real_fx[k], temp16 ); + rec_real_exp[k] = sub( rec_real_exp[k], temp16 ); + + temp16 = sub( rec_imag_exp[k], exp1 ); + rec_imag_fx[k] = L_shr_r_sat( rec_imag_fx[k], temp16 ); + rec_imag_exp[k] = sub( rec_imag_exp[k], temp16 ); + // Cldfb_RealBuffer_Binaural_fx[n][k][i] = rec_real_fx[k]; + hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal_fx[n][k][i] = rec_real_fx[k]; // exp + // Cldfb_ImagBuffer_Binaural_fx[n][k][i] = rec_imag_fx[k] ; + hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag_fx[n][k][i] = rec_imag_fx[k]; // exp + if ( ppiDecodingFailed[n][iSubSet] == 1 ) + { /* only then copy to output */ + Cldfb_RealBuffer_Binaural_fx[n][k][i] = rec_real_fx[k]; + Cldfb_ImagBuffer_Binaural_fx[n][k][i] = rec_imag_fx[k]; + } + } + +#if CLDFB_PLC_XF > 0 + FOR( k = iNumCols; k < iNumCols + CLDFB_PLC_XF; k++ ) + { + + temp16 = sub( rec_real_exp[k], exp1 ); + rec_real_fx[k] = L_shr_r_sat( rec_real_fx[k], temp16 ); + rec_real_exp[k] = sub( rec_real_exp[k], temp16 ); + + temp16 = sub( rec_imag_exp[k], exp1 ); + rec_imag_fx[k] = L_shr_r_sat( rec_imag_fx[k], temp16 ); + rec_imag_exp[k] = sub( rec_imag_exp[k], temp16 ); + /*TODO: Will remove the inter conversion later*/ + hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal_fx[n][k][i] = rec_real_fx[k]; // exp + hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag_fx[n][k][i] = rec_imag_fx[k]; // exp + } +#endif + } + } + + + /* Check bf counter */ + tmp = BASOP_Util_Divide1616_Scale( PLC_FADE_CNST, iNumCols, &div_exp ); + fade_start_cntr = shr( tmp, ( 15 - div_exp ) ); + tmp = BASOP_Util_Divide1616_Scale( PLC_MUTE_CNST, iNumCols, &div_exp ); + mute_cntr = shr( tmp, ( 15 - div_exp ) ); + + IF( GE_16( hSplitRendPLC->bf_count++, fade_start_cntr ) ) + { + IF( LT_16( hSplitRendPLC->bf_count, mute_cntr ) ) + { + fade_val = extract_l( L_shr( L_mult0( sub( hSplitRendPLC->bf_count, fade_start_cntr ), iNumCols ), 4 ) ); // Q0 + temp_32 = L_mult( -16328, fade_val ); // Q15 + temp_32 = L_shl( temp_32, 1 ); // Q16 + + frac = L_Extract_lc( temp_32, &exp_fade ); /* Extract exponent of temp_32 */ + fade_fac_fx = Pow2( 14, frac ); /* Put 14 as exponent so that */ + exp_fade = 31 - add( sub( exp_fade, 14 ), 16 ); + fade_fac_fx = L_shl( fade_fac_fx, 31 - exp_fade ); // Q31 + + FOR( n = 0; n < num_chs; n++ ) + { + FOR( k = 0; k < iNumCols; k++ ) + { + v_multc_fx( &Cldfb_RealBuffer_Binaural_fx[n][k][0], fade_fac_fx, &Cldfb_RealBuffer_Binaural_fx[n][k][0], (Word16) CLDFB_NO_CHANNELS_MAX ); + v_multc_fx( &Cldfb_ImagBuffer_Binaural_fx[n][k][0], fade_fac_fx, &Cldfb_ImagBuffer_Binaural_fx[n][k][0], (Word16) CLDFB_NO_CHANNELS_MAX ); + } + } + } + ELSE + { + FOR( n = 0; n < num_chs; n++ ) + { + FOR( k = 0; k < iNumCols; k++ ) + { + set_val_Word32( &Cldfb_RealBuffer_Binaural_fx[n][k][0], 0, (Word16) CLDFB_NO_CHANNELS_MAX ); + set_val_Word32( &Cldfb_ImagBuffer_Binaural_fx[n][k][0], 0, (Word16) CLDFB_NO_CHANNELS_MAX ); + } + } + hSplitRendPLC->bf_count = mute_cntr; + } + } + + return; +} diff --git a/lib_isar/isar_splitRendererPost.c b/lib_isar/isar_splitRendererPost.c new file mode 100644 index 0000000000000000000000000000000000000000..ce04691f1715b7fdd43b7c5d4253fed24e2a5701 --- /dev/null +++ b/lib_isar/isar_splitRendererPost.c @@ -0,0 +1,1922 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG +#include +#endif +#include "ivas_prot_fx.h" +#include "prot_fx.h" +#include "isar_rom_post_rend.h" +#include "isar_prot.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "prot_fx.h" +#include "wmc_auto.h" +#include "basop_util.h" +#define Q31_BY_360 ( 5965232 ) // Q31 + + +/*------------------------------------------------------------------------- + * isar_splitBinPostRendOpen() + * + * + *------------------------------------------------------------------------*/ +ivas_error isar_splitBinPostRendOpen( + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE *hBinHrSplitPostRend, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const Word32 output_Fs ) +{ + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinRend; + ivas_error error; + Word16 ch; + + IF( ( hBinRend = (ISAR_BIN_HR_SPLIT_POST_REND_HANDLE) malloc( sizeof( ISAR_BIN_HR_SPLIT_POST_REND ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for bin split post renderer Module \n" ) ); + } + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + hBinRend->cldfbSyn[ch] = NULL; + hBinRend->cldfbAna[ch] = NULL; + } +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + for ( int16_t i = 0; i < MAX_HEAD_ROT_POSES; i++ ) + { + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + hBinRend->cldfbSynReconsBinDec[i][ch] = NULL; + } + } +#endif + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + IF( ( error = openCldfb_ivas_fx( &( hBinRend->cldfbSyn[ch] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) + { + return error; + } + IF( ( error = openCldfb_ivas_fx( &( hBinRend->cldfbAna[ch] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) + { + return error; + } + } + +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + for ( int16_t i = 0; i < MAX_HEAD_ROT_POSES; i++ ) + { + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + if ( ( error = openCldfb_ivas_fx( &( hBinRend->cldfbSynReconsBinDec[i][ch] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } +#endif + hBinRend->cf_flag = 0; + set_fix_rotation_mat_fx( hBinRend->fix_pos_rot_mat_fx, pMultiBinPoseData ); + set_pose_types_fx( hBinRend->pose_type, pMultiBinPoseData ); + isar_split_rend_init_huff_cfg( &hBinRend->huff_cfg ); + *hBinHrSplitPostRend = hBinRend; + + return IVAS_ERR_OK; +} + +/*------------------------------------------------------------------------- + * isar_splitBinPostRendClose() + * + * + *------------------------------------------------------------------------*/ + +void isar_splitBinPostRendClose( + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE *hBinHrSplitPostRend ) +{ + Word16 ch; + + IF( ( *hBinHrSplitPostRend ) != NULL ) + { + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + IF( ( *hBinHrSplitPostRend )->cldfbSyn[ch] != NULL ) + { + deleteCldfb_fx( &( ( *hBinHrSplitPostRend )->cldfbSyn[ch] ) ); + ( *hBinHrSplitPostRend )->cldfbSyn[ch] = NULL; + } + IF( ( *hBinHrSplitPostRend )->cldfbAna[ch] != NULL ) + { + deleteCldfb_fx( &( ( *hBinHrSplitPostRend )->cldfbAna[ch] ) ); + ( *hBinHrSplitPostRend )->cldfbAna[ch] = NULL; + } + } +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + for ( int16_t i = 0; i < MAX_HEAD_ROT_POSES; i++ ) + { + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + if ( ( *hBinHrSplitPostRend )->cldfbSynReconsBinDec[i][ch] != NULL ) + { + deleteCldfb_fx( &( ( *hBinHrSplitPostRend )->cldfbSynReconsBinDec[i][ch] ) ); + ( *hBinHrSplitPostRend )->cldfbSynReconsBinDec[i][ch] = NULL; + } + } + } +#endif + + free( ( *hBinHrSplitPostRend ) ); + ( *hBinHrSplitPostRend ) = NULL; + } + + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function ivas_split_rend_huffman_decode_opt() + * + * + *-----------------------------------------------------------------------------------------*/ + +static Word16 ivas_split_rend_huffman_decode_opt( + isar_split_rend_huffman_cfg_t *huff_cfg, + ISAR_SPLIT_REND_BITS_HANDLE pBits, + const Word16 *idx_trav_list ) +{ + Word32 i, ind, code, num_bits, code_b, num_bits_read; + const Word32 *codebook; + + codebook = huff_cfg->codebook; + num_bits_read = 0; + move32(); + ind = L_sub( huff_cfg->codebook[0], 1 ); + code = 0; + move32(); + FOR( i = 0; i < huff_cfg->sym_len; i++ ) + { + codebook = codebook + idx_trav_list[i] * 3; + num_bits = codebook[1]; + move32(); + code_b = codebook[2]; + move32(); + num_bits_read = L_sub( num_bits, num_bits_read ); + code = L_shl( code, extract_l( num_bits_read ) ); + IF( GT_32( num_bits_read, 0 ) ) + { + code = L_or( code, ISAR_SPLIT_REND_BITStream_read_int32( pBits, num_bits_read ) ); + } + + IF( EQ_32( code, code_b ) ) + { + ind = codebook[0]; + move32(); + BREAK; + } + + num_bits_read = num_bits; + move32(); + codebook = huff_cfg->codebook; + } + +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + assert( ind >= huff_cfg->codebook[0] ); +#endif + return extract_l( ind ); +} + +/*-----------------------------------------------------------------------------------------* + * Function ivas_split_rend_unquant_md() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void ivas_split_rend_unquant_md_fx( + ISAR_BIN_HR_SPLIT_REND_MD_HANDLE hMd, + ISAR_SPLIT_REND_POSE_TYPE pose_type, + Word16 real_only, + Word32 fix_pos_rot_mat[][BINAURAL_CHANNELS], + const Word32 pred_quant_step ) +{ + Word16 ch1, ch2; + Word16 gd_idx_min; + + test(); + IF( EQ_32( pose_type, PRED_ONLY ) || EQ_32( pose_type, PRED_ROLL_ONLY ) ) + { + Word32 quantstep; + + quantstep = pred_quant_step; + move32(); + + IF( real_only ) + { + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + hMd->pred_mat_re_fx[ch1][ch2] = Mpy_32_16_1( quantstep, extract_l( L_shl( hMd->pred_mat_re_idx[ch1][ch2], Q9 ) ) ); /* Q25 */ + move32(); + hMd->pred_mat_re_fx[ch1][ch2] = L_add( hMd->pred_mat_re_fx[ch1][ch2], L_shr( ( ch1 == ch2 ) ? ONE_IN_Q31 : 0, Q6 ) ); /* Q25 */ + move32(); + } + } + + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + hMd->pred_mat_im_fx[ch1][ch2] = 0; /* Q25 */ + move32(); + } + } + } + ELSE + { + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + hMd->pred_mat_re_fx[ch1][ch2] = Mpy_32_16_1( quantstep, extract_l( L_shl( hMd->pred_mat_re_idx[ch1][ch2], Q9 ) ) ); /* Q25 */ + move32(); + hMd->pred_mat_re_fx[ch1][ch2] = L_add( hMd->pred_mat_re_fx[ch1][ch2], L_shr( fix_pos_rot_mat[ch1][ch2], Q6 ) ); /* Q25 */ + move32(); + } + } + + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + hMd->pred_mat_im_fx[ch1][ch2] = Mpy_32_16_1( quantstep, extract_l( L_shl( hMd->pred_mat_im_idx[ch1][ch2], Q9 ) ) ); /* Q25 */ + move32(); + } + } + } + } + ELSE IF( EQ_32( pose_type, COM_GAIN_ONLY ) ) + { + gd_idx_min = 0; + move16(); + hMd->gd_idx = add( hMd->gd_idx, gd_idx_min ); + hMd->gd_fx = Mpy_32_16_1( ISAR_SPLIT_REND_D_Q_STEP_Q31, extract_l( L_shl( hMd->gd_idx, Q9 ) ) ); /* Q25 */ + } + ELSE IF( EQ_32( pose_type, LR_GAIN_ONLY ) ) + { + gd_idx_min = 7; + move16(); + hMd->gd_idx = add( hMd->gd_idx, gd_idx_min ); + hMd->gd_fx = Mpy_32_16_1( ISAR_SPLIT_REND_PITCH_G_Q_STEP_Q31, extract_l( L_shl( hMd->gd_idx, Q9 ) ) ); /* Q25 */ + + hMd->gd2_idx = add( hMd->gd2_idx, gd_idx_min ); + hMd->gd2_fx = Mpy_32_16_1( ISAR_SPLIT_REND_PITCH_G_Q_STEP_Q31, extract_l( L_shl( hMd->gd2_idx, Q9 ) ) ); /* Q25 */ + } + ELSE + { + hMd->gd_fx = 0; /* Q25 */ + move32(); + } + + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function isar_splitBinPostRendMdBase2Dec() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void isar_splitBinPostRendMdBase2Dec( + ISAR_SPLIT_REND_BITS_HANDLE pBits, + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinHrSplitPostRend, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const Word16 num_subframes, + const Word16 pred_real_bands_yaw, + const Word16 pred_imag_bands_yaw, + const Word16 pred_quant_pnts_yaw, + const Word16 d_bands_yaw, + const Word16 bands_pitch, + const Word16 pred_real_bands_roll, + const Word16 pred_imag_bands_roll ) +{ + Word16 sf_idx, pos_idx, b, ch1, ch2; + Word16 min_pred_idx, min_gd_idx, min_p_gd_idx, pred_code_len, gd_code_len, p_gd_code_len; + Word16 min_pred_roll_idx, pred_roll_code_len; + Word16 pred_cb_idx; + Word16 code; + ISAR_BIN_HR_SPLIT_REND_MD_HANDLE hMd; + ISAR_BIN_HR_SPLIT_REND_HUFF_HANDLE pHuff_cfg; + + pHuff_cfg = &hBinHrSplitPostRend->huff_cfg; + + IF( EQ_16( pred_quant_pnts_yaw, ISAR_SPLIT_REND_PRED_63QUANT_PNTS ) ) + { + pred_cb_idx = 1; + move16(); + } + ELSE + { + pred_cb_idx = 0; + move16(); + } + min_pred_idx = extract_l( pHuff_cfg->pred[pred_cb_idx].codebook[0] ); + min_pred_roll_idx = extract_l( pHuff_cfg->pred_roll.codebook[0] ); + min_gd_idx = extract_l( pHuff_cfg->gd.codebook[0] ); + min_p_gd_idx = extract_l( pHuff_cfg->p_gd.codebook[0] ); + pred_code_len = pHuff_cfg->pred_base2_code_len[pred_cb_idx]; + move16(); + pred_roll_code_len = pHuff_cfg->pred_roll_base2_code_len; + move16(); + gd_code_len = pHuff_cfg->gd_base2_code_len; + move16(); + p_gd_code_len = pHuff_cfg->p_gd_base2_code_len; + move16(); + + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + FOR( pos_idx = 0; pos_idx < sub( pMultiBinPoseData->num_poses, 1 ); pos_idx++ ) + { + IF( EQ_32( hBinHrSplitPostRend->pose_type[pos_idx], ANY_YAW ) ) + { + FOR( b = 0; b < pred_imag_bands_yaw; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + code = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, pred_code_len ) ); + hMd->pred_mat_re_idx[ch1][ch2] = add( code, min_pred_idx ); + move16(); + } + } + + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + code = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, pred_code_len ) ); + hMd->pred_mat_im_idx[ch1][ch2] = add( code, min_pred_idx ); + move16(); + } + } + } + FOR( ; b < pred_real_bands_yaw; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + code = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, pred_code_len ) ); + hMd->pred_mat_re_idx[ch1][ch1] = add( code, min_pred_idx ); + move16(); + } + hMd->pred_mat_re_idx[0][1] = 0; + move16(); + hMd->pred_mat_re_idx[1][0] = 0; + move16(); + } + FOR( b = 0; b < d_bands_yaw; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + code = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, gd_code_len ) ); + hMd->gd_idx = add( code, min_gd_idx ); + move16(); + } + } + ELSE IF( EQ_32( hBinHrSplitPostRend->pose_type[pos_idx], PITCH_ONLY ) ) + { + FOR( b = 0; b < bands_pitch; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + code = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, p_gd_code_len ) ); + hMd->gd_idx = add( code, min_p_gd_idx ); + move16(); + code = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, p_gd_code_len ) ); + hMd->gd2_idx = add( code, min_p_gd_idx ); + move16(); + } + } + ELSE + { + FOR( b = 0; b < pred_imag_bands_roll; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + code = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, pred_roll_code_len ) ); + hMd->pred_mat_re_idx[ch1][ch2] = add( code, min_pred_roll_idx ); + move16(); + } + } + + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + code = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, pred_roll_code_len ) ); + hMd->pred_mat_im_idx[ch1][ch2] = add( code, min_pred_roll_idx ); + move16(); + } + } + } + FOR( ; b < pred_real_bands_roll; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + code = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, pred_roll_code_len ) ); + hMd->pred_mat_re_idx[ch1][ch1] = add( code, min_pred_roll_idx ); + move16(); + } + hMd->pred_mat_re_idx[0][1] = 0; + move16(); + hMd->pred_mat_re_idx[1][0] = 0; + move16(); + } + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_splitBinPostRendMdHuffDec() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void ivas_splitBinPostRendMdHuffDec( + ISAR_SPLIT_REND_BITS_HANDLE pBits, + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinHrSplitPostRend, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const Word16 num_subframes, + const Word16 pred_real_bands_yaw, + const Word16 pred_imag_bands_yaw, + const Word16 pred_quant_pnts_yaw, + const Word16 d_bands_yaw, + const Word16 bands_pitch, + const Word16 pred_real_bands_roll, + const Word16 pred_imag_bands_roll ) +{ + Word16 pos_idx, b, sf_idx; + Word16 ch1, ch2; + Word16 sym_adj_idx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 min_pred_idx, max_pred_idx; + Word16 min_pred_roll_idx, max_pred_roll_idx, pred_cb_idx; + ISAR_BIN_HR_SPLIT_REND_MD_HANDLE hMd; + ISAR_BIN_HR_SPLIT_REND_HUFF_HANDLE pHuff_cfg; + + pHuff_cfg = &hBinHrSplitPostRend->huff_cfg; + + IF( EQ_16( pred_quant_pnts_yaw, ISAR_SPLIT_REND_PRED_63QUANT_PNTS ) ) + { + pred_cb_idx = 1; + move16(); + } + ELSE + { + pred_cb_idx = 0; + move16(); + } + min_pred_idx = extract_l( pHuff_cfg->pred[pred_cb_idx].codebook[0] ); + max_pred_idx = extract_l( pHuff_cfg->pred[pred_cb_idx].codebook[( pred_quant_pnts_yaw - 1 ) * 3] ); + + min_pred_roll_idx = extract_l( pHuff_cfg->pred_roll.codebook[0] ); + max_pred_roll_idx = extract_l( pHuff_cfg->pred_roll.codebook[( ISAR_SPLIT_REND_ROLL_PRED_QUANT_PNTS - 1 ) * 3] ); + + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + FOR( pos_idx = 0; pos_idx < sub( pMultiBinPoseData->num_poses, 1 ); pos_idx++ ) + { + IF( EQ_32( hBinHrSplitPostRend->pose_type[pos_idx], ANY_YAW ) ) + { + FOR( b = 0; b < pred_imag_bands_yaw; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode_opt( &pHuff_cfg->pred[pred_cb_idx], pBits, pHuff_cfg->pred_idx_trav[pred_cb_idx] ); + move16(); + // sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode( &pHuff_cfg->pred, pBits ); + } + } + isar_SplitRenderer_getdiagdiff( sym_adj_idx, hMd->pred_mat_re_idx, 1, min_pred_idx, max_pred_idx ); + + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode_opt( &pHuff_cfg->pred[pred_cb_idx], pBits, pHuff_cfg->pred_idx_trav[pred_cb_idx] ); + move16(); + // sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode( &pHuff_cfg->pred, pBits ); + } + } + isar_SplitRenderer_getdiagdiff( sym_adj_idx, hMd->pred_mat_im_idx, -1, min_pred_idx, max_pred_idx ); + } + FOR( ; b < pred_real_bands_yaw; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + sym_adj_idx[ch1][ch1] = ivas_split_rend_huffman_decode_opt( &pHuff_cfg->pred[pred_cb_idx], pBits, pHuff_cfg->pred_idx_trav[pred_cb_idx] ); + move16(); + } + sym_adj_idx[1][0] = 0; + move16(); + sym_adj_idx[0][1] = 0; + move16(); + isar_SplitRenderer_getdiagdiff( sym_adj_idx, hMd->pred_mat_re_idx, -1, min_pred_idx, max_pred_idx ); + } + FOR( b = 0; b < d_bands_yaw; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + hMd->gd_idx = ivas_split_rend_huffman_decode_opt( &pHuff_cfg->gd, pBits, pHuff_cfg->gd_idx_trav ); + // hMd->gd_idx = ivas_split_rend_huffman_decode( &pHuff_cfg->gd, pBits ); + } + } + ELSE IF( hBinHrSplitPostRend->pose_type[pos_idx] == PITCH_ONLY ) + { + FOR( b = 0; b < bands_pitch; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + hMd->gd_idx = ivas_split_rend_huffman_decode_opt( &pHuff_cfg->p_gd, pBits, pHuff_cfg->p_gd_idx_trav ); + // hMd->gd_idx = ivas_split_rend_huffman_decode( &pHuff_cfg->gd, pBits ); + + hMd->gd2_idx = ivas_split_rend_huffman_decode_opt( &pHuff_cfg->p_gd, pBits, pHuff_cfg->p_gd_idx_trav ); + } + } + ELSE + { + FOR( b = 0; b < pred_imag_bands_roll; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode_opt( &pHuff_cfg->pred_roll, pBits, pHuff_cfg->pred_roll_idx_trav ); + move16(); + // sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode( &pHuff_cfg->pred_roll, pBits ); + } + } + isar_SplitRenderer_getdiagdiff( sym_adj_idx, hMd->pred_mat_re_idx, 1, min_pred_roll_idx, max_pred_roll_idx ); + + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode_opt( &pHuff_cfg->pred_roll, pBits, pHuff_cfg->pred_roll_idx_trav ); + move16(); + // sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode( &pHuff_cfg->pred_roll, pBits ); + } + } + isar_SplitRenderer_getdiagdiff( sym_adj_idx, hMd->pred_mat_im_idx, -1, min_pred_roll_idx, max_pred_roll_idx ); + } + FOR( ; b < pred_real_bands_roll; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + sym_adj_idx[ch1][ch1] = ivas_split_rend_huffman_decode_opt( &pHuff_cfg->pred_roll, pBits, pHuff_cfg->pred_roll_idx_trav ); + move16(); + } + sym_adj_idx[1][0] = 0; + move16(); + sym_adj_idx[0][1] = 0; + move16(); + isar_SplitRenderer_getdiagdiff( sym_adj_idx, hMd->pred_mat_re_idx, -1, min_pred_roll_idx, max_pred_roll_idx ); + } + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function isar_splitBinPostRendMdDec() + * + * + *-----------------------------------------------------------------------------------------*/ + +void isar_splitBinPostRendMdDec_fx( + ISAR_SPLIT_REND_BITS_HANDLE pBits, + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinHrSplitPostRend, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + , + BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend +#endif +) +{ + Word16 pos_idx, b, sf_idx, num_subframes, ch1; + Word16 pred_real_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], pred_real_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; + Word16 pred_imag_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], pred_imag_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; + Word16 d_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], bands_pitch[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; + Word16 num_quant_strats; + Word32 quant_strat_bits, is_huff_coding, quant_strat; + Word16 pred_quant_pnts_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; + Word32 pred_1byquantstep_yaw_fx[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; // Q26 + Word32 pred_quantstep_yaw_fx[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; // Q31 +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + Word16 ch1, ch2; +#endif + ISAR_BIN_HR_SPLIT_REND_MD_HANDLE hMd; + ISAR_SPLIT_REND_CONFIG_DATA split_rend_config; + ISAR_SPLIT_REND_ROT_AXIS rot_axis; + Word16 ro_md_flag, num_bits, axis_code; + + hBinHrSplitPostRend->low_Res = 1; + move16(); + + split_rend_config.dof = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, ISAR_SPLIT_REND_DOF_BITS ) ); + split_rend_config.hq_mode = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, ISAR_SPLIT_REND_HQ_MODE_BITS ) ); + + num_bits = isar_renderSplitGetRot_axisNumBits( split_rend_config.dof ); + if ( num_bits > 0 ) + { + axis_code = (Word16) ISAR_SPLIT_REND_BITStream_read_int32( pBits, (Word32) num_bits ); + } + else + { + axis_code = 0; + } + rot_axis = isar_renderSplitGetRot_axisFromCode( split_rend_config.dof, axis_code ); + ro_md_flag = (Word16) ISAR_SPLIT_REND_BITStream_read_int32( pBits, ISAR_SPLIT_REND_RO_FLAG_BITS ); + isar_renderSplitGetMultiBinPoseData_fx( &split_rend_config, pMultiBinPoseData, rot_axis ); + + set_fix_rotation_mat_fx( hBinHrSplitPostRend->fix_pos_rot_mat_fx, pMultiBinPoseData ); + set_pose_types_fx( hBinHrSplitPostRend->pose_type, pMultiBinPoseData ); + + num_subframes = EQ_16( hBinHrSplitPostRend->low_Res, 0 ) ? MAX_PARAM_SPATIAL_SUBFRAMES : 1; + move16(); + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + Word16 angle; + + hBinHrSplitPostRend->QuaternionsPre[sf_idx].w_fx = -12582912; /* -3.0f in Q22 */ + move32(); + + angle = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, ISAR_SPLIT_REND_HEAD_POSE_BITS ) ); + angle = sub( angle, 180 ); + hBinHrSplitPostRend->QuaternionsPre[sf_idx].x_fx = L_shl( angle, Q22 ); /* Q22 */ + move32(); + + angle = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, ISAR_SPLIT_REND_HEAD_POSE_BITS ) ); + angle = sub( angle, 180 ); + hBinHrSplitPostRend->QuaternionsPre[sf_idx].y_fx = L_shl( angle, Q22 ); /* Q22 */ + move32(); + + angle = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, ISAR_SPLIT_REND_HEAD_POSE_BITS ) ); + angle = sub( angle, 180 ); + hBinHrSplitPostRend->QuaternionsPre[sf_idx].z_fx = L_shl( angle, Q22 ); /* Q22 */ + move32(); + + hBinHrSplitPostRend->QuaternionsPre[sf_idx].q_fact = Q22; + move32(); + } + + isar_split_rend_get_quant_params_fx( + MAX_SPLIT_REND_MD_BANDS, + pred_real_bands_yaw, + pred_imag_bands_yaw, + pred_quant_pnts_yaw, + pred_quantstep_yaw_fx, + pred_1byquantstep_yaw_fx, + d_bands_yaw, + bands_pitch, + pred_real_bands_roll, + pred_imag_bands_roll, + ro_md_flag, + &num_quant_strats ); + + quant_strat_bits = L_deposit_l( ceil_log_2( num_quant_strats ) ); + + is_huff_coding = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); + + quant_strat = ISAR_SPLIT_REND_BITStream_read_int32( pBits, quant_strat_bits ); + + IF( EQ_32( is_huff_coding, 0 ) ) + { + isar_splitBinPostRendMdBase2Dec( + pBits, hBinHrSplitPostRend, + pMultiBinPoseData, + num_subframes, + pred_real_bands_yaw[quant_strat], + pred_imag_bands_yaw[quant_strat], + pred_quant_pnts_yaw[quant_strat], + d_bands_yaw[quant_strat], + bands_pitch[quant_strat], + pred_real_bands_roll[quant_strat], + pred_imag_bands_roll[quant_strat] ); + } + ELSE + { + ivas_splitBinPostRendMdHuffDec( + pBits, hBinHrSplitPostRend, + pMultiBinPoseData, + num_subframes, + pred_real_bands_yaw[quant_strat], + pred_imag_bands_yaw[quant_strat], + pred_quant_pnts_yaw[quant_strat], + d_bands_yaw[quant_strat], + bands_pitch[quant_strat], + pred_real_bands_roll[quant_strat], + pred_imag_bands_roll[quant_strat] ); + } +#ifdef SPLIT_MD_CODING_DEBUG + for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + int16_t val, ch2, val_ref; + char filename[200] = "split_md_debug_indices.bin"; + for ( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses - 1; pos_idx++ ) + { + if ( hBinHrSplitPostRend->pose_type[pos_idx] == ANY_YAW ) + { + for ( b = 0; b < pred_real_bands_yaw[quant_strat]; b++ ) + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + val = hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b].pred_mat_re_idx[ch1][ch2]; + dbgread( &val_ref, sizeof( int16_t ), 1, filename ); + if ( abs( val_ref - val ) > 0 ) + { + assert( 0 ); + } + } + } + } + for ( b = 0; b < pred_imag_bands_yaw[quant_strat]; b++ ) + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + val = hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b].pred_mat_im_idx[ch1][ch2]; + dbgread( &val_ref, sizeof( int16_t ), 1, filename ); + if ( abs( val_ref - val ) > 0 ) + { + assert( 0 ); + } + } + } + } + for ( b = 0; b < d_bands_yaw[quant_strat]; b++ ) + { + val = hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b].gd_idx; + dbgread( &val_ref, sizeof( int16_t ), 1, filename ); + if ( abs( val_ref - val ) > 0 ) + { + assert( 0 ); + } + } + } + else if ( hBinHrSplitPostRend->pose_type[pos_idx] == PITCH_ONLY ) + { + for ( b = 0; b < bands_pitch[quant_strat]; b++ ) + { + val = hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b].gd_idx; + dbgread( &val_ref, sizeof( int16_t ), 1, filename ); + if ( abs( val_ref - val ) > 0 ) + { + assert( 0 ); + } + val = hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b].gd2_idx; + dbgread( &val_ref, sizeof( int16_t ), 1, filename ); + if ( abs( val_ref - val ) > 0 ) + { + assert( 0 ); + } + } + } + else + { + for ( b = 0; b < pred_real_bands_roll[quant_strat]; b++ ) + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + val = hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b].pred_mat_re_idx[ch1][ch2]; + dbgread( &val_ref, sizeof( int16_t ), 1, filename ); + if ( abs( val_ref - val ) > 0 ) + { + assert( 0 ); + } + } + } + } + for ( b = 0; b < pred_imag_bands_roll[quant_strat]; b++ ) + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + val = hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b].pred_mat_im_idx[ch1][ch2]; + dbgread( &val_ref, sizeof( int16_t ), 1, filename ); + if ( abs( val_ref - val ) > 0 ) + { + assert( 0 ); + } + } + } + } + } + } + } +#endif + + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + FOR( pos_idx = 0; pos_idx < sub( pMultiBinPoseData->num_poses, 1 ); pos_idx++ ) + { + IF( EQ_32( hBinHrSplitPostRend->pose_type[pos_idx], ANY_YAW ) ) + { + FOR( b = 0; b < pred_imag_bands_yaw[quant_strat]; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + ivas_split_rend_unquant_md_fx( hMd, PRED_ONLY, 0, hBinHrSplitPostRend->fix_pos_rot_mat_fx[pos_idx], pred_quantstep_yaw_fx[quant_strat] ); + } + FOR( ; b < pred_real_bands_yaw[quant_strat]; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + ivas_split_rend_unquant_md_fx( hMd, PRED_ONLY, 1, hBinHrSplitPostRend->fix_pos_rot_mat_fx[pos_idx], pred_quantstep_yaw_fx[quant_strat] ); + } + FOR( ; b < MAX_SPLIT_REND_MD_BANDS; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + set32_fx( hMd->pred_mat_re_fx[ch1], 0, BINAURAL_CHANNELS ); + set32_fx( hMd->pred_mat_im_fx[ch1], 0, BINAURAL_CHANNELS ); + hMd->pred_mat_re_fx[ch1][ch1] = L_shl( 1, Q25 ); /* 1.0f in Q25 */ + move32(); + } + } + FOR( b = 0; b < d_bands_yaw[quant_strat]; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + ivas_split_rend_unquant_md_fx( hMd, COM_GAIN_ONLY, 1, hBinHrSplitPostRend->fix_pos_rot_mat_fx[pos_idx], 0 ); + } + FOR( ; b < MAX_SPLIT_REND_MD_BANDS; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + hMd->gd_fx = 0; + move32(); + } + } + ELSE IF( EQ_32( hBinHrSplitPostRend->pose_type[pos_idx], PITCH_ONLY ) ) + { + FOR( b = 0; b < bands_pitch[quant_strat]; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + ivas_split_rend_unquant_md_fx( hMd, LR_GAIN_ONLY, 1, hBinHrSplitPostRend->fix_pos_rot_mat_fx[pos_idx], 0 ); + } + FOR( ; b < MAX_SPLIT_REND_MD_BANDS; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + hMd->gd_fx = L_shl( 1, Q25 ); /* 1.0f in Q25 */ + move32(); + hMd->gd2_fx = L_shl( 1, Q25 ); /* 1.0f in Q25 */ + move32(); + } + } + ELSE + { + FOR( b = 0; b < pred_imag_bands_roll[quant_strat]; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + ivas_split_rend_unquant_md_fx( hMd, PRED_ROLL_ONLY, 0, hBinHrSplitPostRend->fix_pos_rot_mat_fx[pos_idx], ISAR_SPLIT_REND_PRED_ROLL_Q_STEP_Q31 ); + } + FOR( ; b < pred_real_bands_roll[quant_strat]; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + ivas_split_rend_unquant_md_fx( hMd, PRED_ROLL_ONLY, 1, hBinHrSplitPostRend->fix_pos_rot_mat_fx[pos_idx], ISAR_SPLIT_REND_PRED_ROLL_Q_STEP_Q31 ); + } + FOR( ; b < MAX_SPLIT_REND_MD_BANDS; b++ ) + { + hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + set32_fx( hMd->pred_mat_re_fx[ch1], 0, BINAURAL_CHANNELS ); + set32_fx( hMd->pred_mat_im_fx[ch1], 0, BINAURAL_CHANNELS ); + hMd->pred_mat_re_fx[ch1][ch1] = L_shl( 1, Q25 ); /* 1.0f in Q25 */ + move32(); + } + } + } + } + } +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + float val; + for ( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses - 1; pos_idx++ ) + { + if ( hBinHrSplitPostRend->pose_type[pos_idx] == ANY_YAW ) + { + for ( b = 0; b < pred_real_bands_yaw[quant_strat]; b++ ) + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re_idx[ch1][ch2]; + if ( fabsf( hMd->pred_mat_re_idx[ch1][ch2] - val ) > 1e-20 ) + { + assert( 0 ); + } + } + } + } + for ( b = 0; b < pred_imag_bands_yaw[quant_strat]; b++ ) + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im_idx[ch1][ch2]; + if ( fabsf( hMd->pred_mat_im_idx[ch1][ch2] - val ) > 1e-20 ) + { + assert( 0 ); + } + } + } + } + for ( b = 0; b < d_bands_yaw[quant_strat]; b++ ) + { + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd_idx; + if ( fabsf( hMd->gd_idx - val ) > 1e-20 ) + { + assert( 0 ); + } + } + } + else if ( hBinHrSplitPostRend->pose_type[pos_idx] == PITCH_ONLY ) + { + for ( b = 0; b < bands_pitch[quant_strat]; b++ ) + { + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd_idx; + if ( fabsf( hMd->gd_idx - val ) > 1e-20 ) + { + assert( 0 ); + } + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd2_idx; + if ( fabsf( hMd->gd2_idx - val ) > 1e-20 ) + { + assert( 0 ); + } + } + } + else + { + for ( b = 0; b < pred_real_bands_roll[quant_strat]; b++ ) + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re_idx[ch1][ch2]; + if ( fabsf( hMd->pred_mat_re_idx[ch1][ch2] - val ) > 1e-20 ) + { + assert( 0 ); + } + } + } + } + for ( b = 0; b < pred_imag_bands_roll[quant_strat]; b++ ) + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im_idx[ch1][ch2]; + if ( fabsf( hMd->pred_mat_im_idx[ch1][ch2] - val ) > 1e-20 ) + { + assert( 0 ); + } + } + } + } + } + } + } +#endif + + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function wrap_around_angle() + * + * + *-----------------------------------------------------------------------------------------*/ +static void wrap_around_angle_fx( + Word32 *a_fx ) +{ + IF( GT_32( ( *a_fx ), 754974720 /*180.f in Q22*/ ) ) + { + *a_fx = L_sub( ( *a_fx ), 1509949440 /*360.f in Q22*/ ); + } + ELSE IF( LT_32( ( *a_fx ), L_negate( 754974720 /*180.f in Q22*/ ) ) ) + { + *a_fx = L_add( *a_fx, 1509949440 /*360.f in Q22*/ ); + } + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function wrap_around_angle() + * + * + *-----------------------------------------------------------------------------------------*/ +static void wrap_around_ypr_fx( + IVAS_QUATERNION *Quaternions ) +{ + /*only if quat is actually yaw, pitch , roll angles*/ + IF( EQ_32( Quaternions->w_fx, L_negate( 12582912 /*3.0f in Q22*/ ) ) ) + { + wrap_around_angle_fx( &Quaternions->x_fx ); + wrap_around_angle_fx( &Quaternions->y_fx ); + wrap_around_angle_fx( &Quaternions->z_fx ); + } + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function wrap_around_angle() + * + * + *-----------------------------------------------------------------------------------------*/ + +static Word32 get_interp_fact_fx( + Word32 p_fx[MAX_HEAD_ROT_POSES], + const Word32 p_t_fx, + const Word16 ind[2], + Word16 *exp ) +{ + Word32 n_fx, d_fx, interp_fact_fx; + + *exp = 31; + move16(); + IF( NE_16( ind[0], ind[1] ) ) + { + n_fx = L_sub( p_fx[ind[0]], p_fx[ind[1]] ); + move32(); + d_fx = L_sub( p_fx[ind[0]], p_t_fx ); + move32(); + interp_fact_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( d_fx, n_fx, exp ) ); // Q31-exp + move32(); + + IF( LT_32( interp_fact_fx, 0 ) ) + { + d_fx = max( -( MAX_EXTRAPOLATION_ANGLE_Q22 ), ( min( ( MAX_EXTRAPOLATION_ANGLE_Q22 ), d_fx ) ) ); + move32(); + n_fx = L_deposit_h( getSineWord16R2( extract_l( L_shr( Mpy_32_32( n_fx, Q31_BY_360 ), 7 ) ) ) ); + move32(); + d_fx = L_deposit_h( getSineWord16R2( extract_l( L_shr( Mpy_32_32( d_fx, Q31_BY_360 ), 7 ) ) ) ); + move32(); + interp_fact_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( d_fx, n_fx, exp ) ); // Q31-exp + move32(); + } + } + ELSE + { + interp_fact_fx = 0; + move32(); + } + + return interp_fact_fx; +} + + +/*-----------------------------------------------------------------------------------------* + * Function get_nearest_pose_ind() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void get_nearest_pose_ind_fx( + Word32 p[MAX_HEAD_ROT_POSES], + const Word32 p_t, + Word16 ind[2], + const Word16 num_poses ) +{ + Word32 min_diff, diff; + Word16 pos_idx; + + ind[0] = 0; + ind[1] = 0; + min_diff = 1509949440; // 360 in Q22 + + /*find the closest pose from assumed poses*/ + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) + { + diff = L_abs( L_sub( p_t, p[pos_idx] ) ); + IF( LT_32( diff, min_diff ) ) + { + ind[0] = pos_idx; + min_diff = diff; + } + } + + min_diff = 1509949440; // 360 in Q22 + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) + { + diff = L_abs( L_sub( p_t, p[pos_idx] ) ); + IF( LT_32( diff, min_diff ) && + GT_32( L_abs( L_sub( p[pos_idx], p[ind[0]] ) ), EPSILON_FX ) ) + { + ind[1] = pos_idx; + min_diff = diff; + } + } + + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function get_interpolation_vars() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void get_interpolation_vars( + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const IVAS_QUATERNION *Quaternions_ref, + const IVAS_QUATERNION *Quaternions_act, + Word16 interp_yaw_pose_idx[2], + Word16 interp_pitch_pose_idx[2], + Word16 interp_roll_pose_idx[2], + Word32 *interp_yaw_fact_fx, + Word32 *interp_pitch_fact_fx, + Word32 *interp_roll_fact_fx, + Word16 *q_yaw, + Word16 *q_pitch, + Word16 *q_roll ) +{ + IVAS_QUATERNION quaternions_diff, quaternions_ref_euler, quaternions_act_euler, quaternions_ref_q22, quaternions_act_q22; + Word32 y_fx[MAX_HEAD_ROT_POSES], p_fx[MAX_HEAD_ROT_POSES], r_fx[MAX_HEAD_ROT_POSES]; + + Word16 pos_idx, num_poses; + Word16 exp; + + quaternions_diff.x_fx = 0; + quaternions_diff.y_fx = 0; + quaternions_diff.z_fx = 0; + + num_poses = pMultiBinPoseData->num_poses; + + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) + { + quaternions_diff.x_fx = pMultiBinPoseData->relative_head_poses_fx[pos_idx][0]; + quaternions_diff.y_fx = pMultiBinPoseData->relative_head_poses_fx[pos_idx][1]; + quaternions_diff.z_fx = pMultiBinPoseData->relative_head_poses_fx[pos_idx][2]; + y_fx[pos_idx] = quaternions_diff.x_fx; + p_fx[pos_idx] = quaternions_diff.y_fx; + r_fx[pos_idx] = quaternions_diff.z_fx; + } + + /*interpolation if actual pose is not same as one of assumed poses*/ + /*get the deviation*/ + modify_Quat_q_fx( Quaternions_ref, &quaternions_ref_q22, Q22 ); + modify_Quat_q_fx( Quaternions_act, &quaternions_act_q22, Q22 ); + Quat2EulerDegree_fx( quaternions_ref_q22, &quaternions_ref_euler.z_fx, &quaternions_ref_euler.y_fx, &quaternions_ref_euler.x_fx ); /*order in Quat2Euler seems to be reversed ?*/ + Quat2EulerDegree_fx( quaternions_act_q22, &quaternions_act_euler.z_fx, &quaternions_act_euler.y_fx, &quaternions_act_euler.x_fx ); + + /*order in Quat2Euler seems to be reversed ?*/ + quaternions_diff.w_fx = -12582912; /*euler*/ //-3 in Q22 + quaternions_diff.x_fx = L_sub( quaternions_act_euler.x_fx, quaternions_ref_euler.x_fx ); + quaternions_diff.y_fx = L_sub( quaternions_act_euler.y_fx, quaternions_ref_euler.y_fx ); + quaternions_diff.z_fx = L_sub( quaternions_act_euler.z_fx, quaternions_ref_euler.z_fx ); + wrap_around_ypr_fx( &quaternions_diff ); + interp_yaw_pose_idx[0] = 0; + interp_yaw_pose_idx[1] = 0; + IF( GT_32( L_abs( quaternions_diff.x_fx ), EPSILON_FX ) ) + { + get_nearest_pose_ind_fx( y_fx, quaternions_diff.x_fx, interp_yaw_pose_idx, num_poses ); + } + *interp_yaw_fact_fx = get_interp_fact_fx( y_fx, quaternions_diff.x_fx, interp_yaw_pose_idx, &exp ); + *q_yaw = Q31 - exp; + + interp_pitch_pose_idx[0] = 0; + interp_pitch_pose_idx[1] = 0; + IF( GT_32( L_abs( quaternions_diff.y_fx ), EPSILON_FX ) ) + { + get_nearest_pose_ind_fx( p_fx, quaternions_diff.y_fx, interp_pitch_pose_idx, num_poses ); + } + *interp_pitch_fact_fx = get_interp_fact_fx( p_fx, quaternions_diff.y_fx, interp_pitch_pose_idx, &exp ); + *q_pitch = Q31 - exp; + + interp_roll_pose_idx[0] = 0; + interp_roll_pose_idx[1] = 0; + IF( GT_32( L_abs( quaternions_diff.z_fx ), EPSILON_FX ) ) + { + get_nearest_pose_ind_fx( r_fx, quaternions_diff.z_fx, interp_roll_pose_idx, num_poses ); + } + *interp_roll_fact_fx = get_interp_fact_fx( r_fx, quaternions_diff.z_fx, interp_roll_pose_idx, &exp ); + *q_roll = Q31 - exp; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function interpolate_pred_matrix() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void interpolate_pred_matrix_fx( + ISAR_BIN_HR_SPLIT_REND_MD rot_md[][MAX_SPLIT_MD_SUBFRAMES][MAX_SPLIT_REND_MD_BANDS], + const Word16 sf_idx, + const Word16 band_idx, + const Word16 ind[2], + const Word32 interp_fact_fx, + Word16 intrep_norm, + Word32 mat_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 *exp_mat_re, + Word32 mat_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 *exp_mat_im ) +{ + Word16 ch_idx1, ch_idx2; + ISAR_BIN_HR_SPLIT_REND_MD *pRot_md; + // ord16 intrep_norm = Q_factor_L(interp_fact); + // ord32 interp_fact_fx = floatToFixed(interp_fact, intrep_norm); + Word32 diff_fx; + Word32 mix_mat_re1_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 mix_mat_im1_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 mix_mat_re2_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 mix_mat_im2_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 buff_exp_re[BINAURAL_CHANNELS][BINAURAL_CHANNELS], buff_exp_im[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + + FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) + { + set32_fx( mix_mat_re1_fx[ch_idx1], 0, BINAURAL_CHANNELS ); + set32_fx( mix_mat_im1_fx[ch_idx1], 0, BINAURAL_CHANNELS ); + mix_mat_re1_fx[ch_idx1][ch_idx1] = ONE_IN_Q25; + + set32_fx( mix_mat_re2_fx[ch_idx1], 0, BINAURAL_CHANNELS ); + set32_fx( mix_mat_im2_fx[ch_idx1], 0, BINAURAL_CHANNELS ); + mix_mat_re2_fx[ch_idx1][ch_idx1] = ONE_IN_Q25; + } + + IF( ind[0] != 0 ) + { + pRot_md = &rot_md[ind[0] - 1][sf_idx][band_idx]; + + FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) + { + FOR( ch_idx2 = 0; ch_idx2 < BINAURAL_CHANNELS; ch_idx2++ ) + { + mix_mat_re1_fx[ch_idx1][ch_idx2] = pRot_md->pred_mat_re_fx[ch_idx1][ch_idx2]; + mix_mat_im1_fx[ch_idx1][ch_idx2] = pRot_md->pred_mat_im_fx[ch_idx1][ch_idx2]; + } + } + } + + IF( ind[1] != 0 ) + { + pRot_md = &rot_md[ind[1] - 1][sf_idx][band_idx]; + + FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) + { + FOR( ch_idx2 = 0; ch_idx2 < BINAURAL_CHANNELS; ch_idx2++ ) + { + mix_mat_re2_fx[ch_idx1][ch_idx2] = pRot_md->pred_mat_re_fx[ch_idx1][ch_idx2]; + mix_mat_im2_fx[ch_idx1][ch_idx2] = pRot_md->pred_mat_im_fx[ch_idx1][ch_idx2]; + } + } + } + + Word16 final_exp = 0, mat_re_exp = 0, mat_im_exp = 0; + FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) + { + FOR( ch_idx2 = 0; ch_idx2 < BINAURAL_CHANNELS; ch_idx2++ ) + { + final_exp = 0; + diff_fx = BASOP_Util_Add_Mant32Exp( mix_mat_re1_fx[ch_idx1][ch_idx2], 31 - Q25, L_negate( mix_mat_re2_fx[ch_idx1][ch_idx2] ), 31 - Q25, &final_exp ); + Word64 tmp1 = W_mult_32_32( diff_fx, interp_fact_fx ); // final_exp + (31 - intrep_norm) + Word16 tmp1_nrm = W_norm( tmp1 ); + Word32 tmp1_final = W_extract_h( W_shl( tmp1, tmp1_nrm ) ); // final_exp + (31 - intrep_norm) - tmp1_nrm + mat_re_exp = 0; + mat_re_fx[ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( mix_mat_re1_fx[ch_idx1][ch_idx2], 31 - Q25, L_negate( tmp1_final ), final_exp + ( 31 - intrep_norm ) - tmp1_nrm, &mat_re_exp ); + buff_exp_re[ch_idx1][ch_idx2] = mat_re_exp; + + final_exp = 0; + diff_fx = BASOP_Util_Add_Mant32Exp( mix_mat_im1_fx[ch_idx1][ch_idx2], 31 - Q25, L_negate( mix_mat_im2_fx[ch_idx1][ch_idx2] ), 31 - Q25, &final_exp ); + Word64 tmp2 = W_mult_32_32( diff_fx, interp_fact_fx ); // final_exp + (31 - intrep_norm) + Word16 tmp2_nrm = W_norm( tmp2 ); + Word32 tmp2_final = W_extract_h( W_shl( tmp2, tmp2_nrm ) ); // final_exp + (31 - intrep_norm) - tmp1_nrm + mat_im_exp = 0; + mat_im_fx[ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( mix_mat_im1_fx[ch_idx1][ch_idx2], 31 - Q25, L_negate( tmp2_final ), final_exp + ( 31 - intrep_norm ) - tmp2_nrm, &mat_im_exp ); + buff_exp_im[ch_idx1][ch_idx2] = mat_im_exp; + } + } + + Word16 max_exp_re = MIN16B; + Word16 max_exp_im = MIN16B; + FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < BINAURAL_CHANNELS; j++ ) + { + max_exp_re = max( max_exp_re, buff_exp_re[i][j] ); + max_exp_im = max( max_exp_im, buff_exp_im[i][j] ); + } + } + FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < BINAURAL_CHANNELS; j++ ) + { + mat_re_fx[i][j] = L_shr( mat_re_fx[i][j], max_exp_re - buff_exp_re[i][j] ); + mat_im_fx[i][j] = L_shr( mat_im_fx[i][j], max_exp_im - buff_exp_im[i][j] ); + } + } + + *exp_mat_re = max_exp_re; + *exp_mat_im = max_exp_im; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function interpolate_rend_md() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void interpolate_rend_md_fx( + ISAR_BIN_HR_SPLIT_REND_MD rot_md[][MAX_SPLIT_MD_SUBFRAMES][MAX_SPLIT_REND_MD_BANDS], + Word32 mix_mat_re_fx[][BINAURAL_CHANNELS], + Word16 *exp_mix_mat_re, + Word32 mix_mat_im_fx[][BINAURAL_CHANNELS], + Word16 *exp_mix_mat_im, + Word32 *gd_int_fx, + Word16 *exp_gd_int, + const Word16 sf_idx, + const Word16 band_idx, + const Word16 interp_yaw_pose_idx[2], + const Word16 interp_pitch_pose_idx[2], + const Word16 interp_roll_pose_idx[2], + const Word32 interp_yaw_fact_fx, + Word16 Q_yaw, + const Word32 interp_pitch_fact_fx, + Word16 Q_pitch, + const Word32 interp_roll_fact_fx, + Word16 Q_roll ) +{ + Word16 ch_idx1, idx1, idx2; + + Word32 mix_mat_re1_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 mix_mat_im1_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 mix_mat_re3_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 mix_mat_im3_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + + Word16 exp_mix_mat_re1 = 0; + Word16 exp_mix_mat_im1 = 0; + Word16 exp_mix_mat_re3 = 0; + Word16 exp_mix_mat_im3 = 0; + + Word16 ch_idx2; + Word16 exp_pitch_gain_r, exp_pitch_gain_l; + Word32 gd1_fx = 0, gd2_fx = 0; + Word32 gd3_fx = 0, gd4_fx = 0; + Word32 pitch_gain_r_fx, pitch_gain_l_fx; + Word32 diff_fx; + + Word16 exp_mat_re[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 exp_mat_im[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + + idx1 = interp_yaw_pose_idx[0]; + idx2 = interp_yaw_pose_idx[1]; + + + IF( NE_16( idx1, 0 ) || NE_16( idx2, 0 ) ) + { + interpolate_pred_matrix_fx( rot_md, sf_idx, band_idx, interp_yaw_pose_idx, interp_yaw_fact_fx, Q_yaw, mix_mat_re_fx, exp_mix_mat_re, mix_mat_im_fx, exp_mix_mat_im ); + + IF( NE_16( idx1, 0 ) ) + { + gd1_fx = rot_md[idx1 - 1][sf_idx][band_idx].gd_fx; // Q25 + } + + IF( NE_16( idx2, 0 ) ) + { + gd2_fx = rot_md[idx2 - 1][sf_idx][band_idx].gd_fx; + } + diff_fx = L_sub( gd1_fx, gd2_fx ); // Q25 + Word32 tmp1 = Mpy_32_32( diff_fx, interp_yaw_fact_fx ); // 6+Q_yaw + Word16 exp_tmp2 = 0; + Word32 tmp2 = BASOP_Util_Add_Mant32Exp( diff_fx, 31 - Q25, L_negate( tmp1 ), 6 + Q_yaw, &exp_tmp2 ); + *gd_int_fx = tmp2; + *exp_gd_int = exp_tmp2; + } + ELSE + { + /*P = P'*/ + FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) + { + FOR( Word16 j = 0; j < BINAURAL_CHANNELS; j++ ) + { + mix_mat_re_fx[ch_idx1][j] = 0; + mix_mat_im_fx[ch_idx1][j] = 0; + mix_mat_re_fx[ch_idx1][ch_idx1] = ONE_IN_Q25; + } + } + + *exp_mix_mat_re = 6; + *exp_mix_mat_im = 6; + + *gd_int_fx = 0; + *exp_gd_int = 0; + } + + idx1 = interp_pitch_pose_idx[0]; + idx2 = interp_pitch_pose_idx[1]; + IF( NE_16( idx1, 0 ) || NE_16( idx2, 0 ) ) + { + gd1_fx = ONE_IN_Q25; + gd2_fx = ONE_IN_Q25; + + gd3_fx = ONE_IN_Q25; + gd4_fx = ONE_IN_Q25; + + IF( NE_16( idx1, 0 ) ) + { + gd1_fx = rot_md[idx1 - 1][sf_idx][band_idx].gd_fx; + gd3_fx = rot_md[idx1 - 1][sf_idx][band_idx].gd2_fx; + } + IF( NE_16( idx2, 0 ) ) + { + gd2_fx = rot_md[idx2 - 1][sf_idx][band_idx].gd_fx; + gd4_fx = rot_md[idx2 - 1][sf_idx][band_idx].gd2_fx; + } + + diff_fx = L_sub( gd1_fx, gd2_fx ); // Q25 + IF( EQ_32( diff_fx, -1 ) ) + { + diff_fx = 0; + } + Word32 tmp = Mpy_32_32( diff_fx, interp_pitch_fact_fx ); // 6 + Q_pitch + Word16 exp_tmp1 = 0; + Word32 tmp1 = BASOP_Util_Add_Mant32Exp( gd1_fx, 31 - Q25, L_negate( tmp ), 6 + 31 - Q_pitch, &exp_tmp1 ); + pitch_gain_l_fx = tmp1; + pitch_gain_l_fx = max( 0, pitch_gain_l_fx ); + exp_pitch_gain_l = exp_tmp1; + + diff_fx = L_sub( gd3_fx, gd4_fx ); + IF( EQ_32( diff_fx, -1 ) ) + { + diff_fx = 0; + } + tmp = Mpy_32_32( diff_fx, interp_pitch_fact_fx ); + exp_tmp1 = 0; + tmp1 = BASOP_Util_Add_Mant32Exp( gd3_fx, 31 - Q25, L_negate( tmp ), 6 + 31 - Q_pitch, &exp_tmp1 ); + pitch_gain_r_fx = tmp1; + pitch_gain_r_fx = max( 0, pitch_gain_r_fx ); + exp_pitch_gain_r = exp_tmp1; + + FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) + { + mix_mat_re_fx[ch_idx1][0] = Mpy_32_32( mix_mat_re_fx[ch_idx1][0], pitch_gain_l_fx ); // exp_mix_mat_re + exp_pitch_gain_l + exp_mat_re[ch_idx1][0] = *exp_mix_mat_re + exp_pitch_gain_l; + mix_mat_re_fx[ch_idx1][1] = Mpy_32_32( mix_mat_re_fx[ch_idx1][1], pitch_gain_r_fx ); // exp_mix_mat_re + exp_pitch_gain_r + exp_mat_re[ch_idx1][1] = *exp_mix_mat_re + exp_pitch_gain_r; + mix_mat_im_fx[ch_idx1][0] = Mpy_32_32( mix_mat_im_fx[ch_idx1][0], pitch_gain_l_fx ); // exp_mix_mat_im + exp_pitch_gain_l + exp_mat_im[ch_idx1][0] = *exp_mix_mat_im + exp_pitch_gain_l; + mix_mat_im_fx[ch_idx1][1] = Mpy_32_32( mix_mat_im_fx[ch_idx1][1], pitch_gain_r_fx ); // exp_mix_mat_im + exp_pitch_gain_r + exp_mat_im[ch_idx1][1] = *exp_mix_mat_im + exp_pitch_gain_r; + } + + Word16 max_exp_re = MIN16B, max_exp_im = MIN16B; + FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < BINAURAL_CHANNELS; j++ ) + { + max_exp_re = max( max_exp_re, exp_mat_re[i][j] ); + max_exp_im = max( max_exp_im, exp_mat_im[i][j] ); + } + } + + FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < BINAURAL_CHANNELS; j++ ) + { + mix_mat_re_fx[i][j] = L_shr( mix_mat_re_fx[i][j], max_exp_re - exp_mat_re[i][j] ); + mix_mat_im_fx[i][j] = L_shr( mix_mat_im_fx[i][j], max_exp_im - exp_mat_im[i][j] ); + } + } + + *exp_mix_mat_re = max_exp_re; + *exp_mix_mat_im = max_exp_im; + } + ELSE + { + pitch_gain_l_fx = ONE_IN_Q25; + pitch_gain_r_fx = ONE_IN_Q25; + } + + + idx1 = interp_roll_pose_idx[0]; + idx2 = interp_roll_pose_idx[1]; + IF( NE_16( idx1, 0 ) || NE_16( idx2, 0 ) ) + { + interpolate_pred_matrix_fx( rot_md, sf_idx, band_idx, interp_roll_pose_idx, interp_roll_fact_fx, Q_roll, mix_mat_re3_fx, &exp_mix_mat_re3, mix_mat_im3_fx, &exp_mix_mat_im3 ); + + isar_mat_mult_2by2_complex_fx( mix_mat_re_fx, *exp_mix_mat_re, mix_mat_im_fx, *exp_mix_mat_im, mix_mat_re3_fx, exp_mix_mat_re3, + mix_mat_im3_fx, exp_mix_mat_im3, mix_mat_re1_fx, &exp_mix_mat_re1, mix_mat_im1_fx, &exp_mix_mat_im1 ); + + FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) + { + FOR( ch_idx2 = 0; ch_idx2 < BINAURAL_CHANNELS; ch_idx2++ ) + { + mix_mat_re_fx[ch_idx1][ch_idx2] = mix_mat_re1_fx[ch_idx1][ch_idx2]; + mix_mat_im_fx[ch_idx1][ch_idx2] = mix_mat_im1_fx[ch_idx1][ch_idx2]; + } + } + *exp_mix_mat_re = exp_mix_mat_re1; + *exp_mix_mat_im = exp_mix_mat_im1; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function isar_SplitRenderer_PostRenderer() + * + * + *-----------------------------------------------------------------------------------------*/ + +void isar_SplitRenderer_PostRenderer( + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinPostRenderer, /* i/o: binaural renderer handle */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + Word32 Cldfb_RealBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ + Word32 Cldfb_ImagBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ + const IVAS_QUATERNION Quaternion_act, + Word16 *Q_in ) +{ + Word16 pos_idx, b, brange[2], ch_idx1; + Word16 num_md_bands, slot_idx, b2, index_slot, num_slots, sf_idx_md; + Word32 gd_int_fx; + Word64 pred_out_re_fx64[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], pred_out_im_fx64[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word64 tmp_re_fx64, tmp_im_fx64, out64_re, out64_im; + Word16 shift64 = 63; + ISAR_BIN_HR_SPLIT_REND_MD rot_md_act[1][MAX_SPLIT_REND_MD_BANDS]; + Word16 interp_yaw_pose_idx[2], interp_pitch_pose_idx[2], interp_roll_pose_idx[2]; + Word32 interp_yaw_fact_fx, interp_pitch_fact_fx, interp_roll_fact_fx; + Word16 Q_yaw = Q31, Q_pitch = Q31, Q_roll = Q31; + Word32 mix_mat_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 mix_mat_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 fade_fx; + Word32 *pMix_mat_re_prev_fx[BINAURAL_CHANNELS]; + Word32 *pMix_mat_im_prev_fx[BINAURAL_CHANNELS]; + const Word16 *pBand_grouping = isar_split_rend_band_grouping; + + num_md_bands = MAX_SPLIT_REND_MD_BANDS; + + push_wmops( "isar_SplitRenderer_PostRenderer" ); + + num_slots = MAX_PARAM_SPATIAL_SUBFRAMES; + pos_idx = 0; + sf_idx_md = 0; + + get_interpolation_vars( pMultiBinPoseData, &hBinPostRenderer->QuaternionsPre[sf_idx_md], &Quaternion_act, interp_yaw_pose_idx, interp_pitch_pose_idx, interp_roll_pose_idx, &interp_yaw_fact_fx, &interp_pitch_fact_fx, &interp_roll_fact_fx, &Q_yaw, &Q_pitch, &Q_roll ); + + FOR( b = 0; b < num_md_bands; b++ ) + { + FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) + { + set_l( mix_mat_re_fx[ch_idx1], 0, BINAURAL_CHANNELS ); + set_l( mix_mat_im_fx[ch_idx1], 0, BINAURAL_CHANNELS ); + mix_mat_re_fx[ch_idx1][ch_idx1] = L_shl( 1, Q25 ); + } + + Word16 exp_gd_int = 0; + + Word16 exp_mix_mat_re = 6, exp_mix_mat_im = 6; + + interpolate_rend_md_fx( hBinPostRenderer->rot_md, mix_mat_re_fx, &exp_mix_mat_re, mix_mat_im_fx, &exp_mix_mat_im, &gd_int_fx, &exp_gd_int, sf_idx_md, b, interp_yaw_pose_idx, + interp_pitch_pose_idx, interp_roll_pose_idx, interp_yaw_fact_fx, Q_yaw, interp_pitch_fact_fx, Q_pitch, interp_roll_fact_fx, Q_roll ); + + FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) + { + /*update the prediction matrix with interpolated matrix*/ + rot_md_act[pos_idx][b].pred_mat_re_fx[ch_idx1][0] = L_shl( mix_mat_re_fx[ch_idx1][0], exp_mix_mat_re - 6 ); // Q25 + rot_md_act[pos_idx][b].pred_mat_re_fx[ch_idx1][1] = L_shl( mix_mat_re_fx[ch_idx1][1], exp_mix_mat_re - 6 ); // Q25 + rot_md_act[pos_idx][b].pred_mat_im_fx[ch_idx1][0] = L_shl( mix_mat_im_fx[ch_idx1][0], exp_mix_mat_im - 6 ); // Q25 + rot_md_act[pos_idx][b].pred_mat_im_fx[ch_idx1][1] = L_shl( mix_mat_im_fx[ch_idx1][1], exp_mix_mat_im - 6 ); // Q25 + rot_md_act[pos_idx][b].gd_fx = L_shl( gd_int_fx, exp_gd_int - 6 ); // Q25 + } + } + + pos_idx = 0; + { + FOR( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) + { + index_slot = slot_idx; /* TODO: can be cleaned up */ + fade_fx = fade_table_fx[slot_idx]; + fade_fx = min( fade_fx, MAX_16 ); + FOR( b = 0; b < num_md_bands; b++ ) + { + FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) + { + IF( hBinPostRenderer->cf_flag ) + { + pMix_mat_re_prev_fx[ch_idx1] = hBinPostRenderer->mixer_mat_re_fx[pos_idx][b][ch_idx1]; + pMix_mat_im_prev_fx[ch_idx1] = hBinPostRenderer->mixer_mat_im_fx[pos_idx][b][ch_idx1]; + mix_mat_re_fx[ch_idx1][0] = L_add( Mpy_32_16_1( rot_md_act[pos_idx][b].pred_mat_re_fx[ch_idx1][0], fade_fx ), + Mpy_32_16_1( pMix_mat_re_prev_fx[ch_idx1][0], sub( 32767, fade_fx ) ) ); + mix_mat_re_fx[ch_idx1][1] = L_add( Mpy_32_16_1( rot_md_act[pos_idx][b].pred_mat_re_fx[ch_idx1][1], fade_fx ), + Mpy_32_16_1( pMix_mat_re_prev_fx[ch_idx1][1], sub( 32767, fade_fx ) ) ); + + mix_mat_im_fx[ch_idx1][0] = L_add( Mpy_32_16_1( rot_md_act[pos_idx][b].pred_mat_im_fx[ch_idx1][0], fade_fx ), + Mpy_32_16_1( pMix_mat_im_prev_fx[ch_idx1][0], sub( 32767, fade_fx ) ) ); + mix_mat_im_fx[ch_idx1][1] = L_add( Mpy_32_16_1( rot_md_act[pos_idx][b].pred_mat_im_fx[ch_idx1][1], fade_fx ), + Mpy_32_16_1( pMix_mat_im_prev_fx[ch_idx1][1], sub( 32767, fade_fx ) ) ); + } + ELSE + { + mix_mat_re_fx[ch_idx1][0] = rot_md_act[pos_idx][b].pred_mat_re_fx[ch_idx1][0]; + mix_mat_re_fx[ch_idx1][1] = rot_md_act[pos_idx][b].pred_mat_re_fx[ch_idx1][1]; + mix_mat_im_fx[ch_idx1][0] = rot_md_act[pos_idx][b].pred_mat_im_fx[ch_idx1][0]; + mix_mat_im_fx[ch_idx1][1] = rot_md_act[pos_idx][b].pred_mat_im_fx[ch_idx1][1]; + } + } + + brange[0] = pBand_grouping[b]; + brange[1] = pBand_grouping[b + 1]; + FOR( b2 = brange[0]; b2 < brange[1]; b2++ ) + { + FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) + { + /* Apply prediction matrix */ + tmp_re_fx64 = W_mult_32_32( Cldfb_RealBuffer_Ref_Binaural_fx[0][index_slot][b2], mix_mat_re_fx[0][ch_idx1] ); + tmp_im_fx64 = W_mult_32_32( Cldfb_ImagBuffer_Ref_Binaural_fx[0][index_slot][b2], mix_mat_im_fx[0][ch_idx1] ); + out64_re = W_sub( tmp_re_fx64, tmp_im_fx64 ); + tmp_re_fx64 = W_mult_32_32( Cldfb_RealBuffer_Ref_Binaural_fx[0][index_slot][b2], mix_mat_im_fx[0][ch_idx1] ); + tmp_im_fx64 = W_mult_32_32( Cldfb_ImagBuffer_Ref_Binaural_fx[0][index_slot][b2], mix_mat_re_fx[0][ch_idx1] ); + out64_im = W_add( tmp_re_fx64, tmp_im_fx64 ); + move64(); + move64(); + move64(); + move64(); + move64(); + move64(); + + + tmp_re_fx64 = W_mult_32_32( Cldfb_RealBuffer_Ref_Binaural_fx[1][index_slot][b2], mix_mat_re_fx[1][ch_idx1] ); + tmp_im_fx64 = W_mult_32_32( Cldfb_ImagBuffer_Ref_Binaural_fx[1][index_slot][b2], mix_mat_im_fx[1][ch_idx1] ); + out64_re = W_add( out64_re, W_sub( tmp_re_fx64, tmp_im_fx64 ) ); + tmp_re_fx64 = W_mult_32_32( Cldfb_RealBuffer_Ref_Binaural_fx[1][index_slot][b2], mix_mat_im_fx[1][ch_idx1] ); + tmp_im_fx64 = W_mult_32_32( Cldfb_ImagBuffer_Ref_Binaural_fx[1][index_slot][b2], mix_mat_re_fx[1][ch_idx1] ); + out64_im = W_add( out64_im, W_add( tmp_re_fx64, tmp_im_fx64 ) ); + move64(); + move64(); + move64(); + move64(); + move64(); + move64(); + + + shift64 = s_min( shift64, s_min( W_norm( out64_im ), W_norm( out64_re ) ) ); + pred_out_re_fx64[ch_idx1][index_slot][b2] = out64_re; + pred_out_im_fx64[ch_idx1][index_slot][b2] = out64_im; + move16(); + move64(); + move64(); + } + } + } + } + + FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) + { + FOR( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) + { + FOR( b2 = pBand_grouping[0]; b2 < pBand_grouping[num_md_bands]; b2++ ) + { + Cldfb_RealBuffer_Ref_Binaural_fx[ch_idx1][slot_idx][b2] = W_extract_h( W_shl( pred_out_re_fx64[ch_idx1][slot_idx][b2], shift64 ) ); + Cldfb_ImagBuffer_Ref_Binaural_fx[ch_idx1][slot_idx][b2] = W_extract_h( W_shl( pred_out_im_fx64[ch_idx1][slot_idx][b2], shift64 ) ); + move32(); + move32(); + } + } + } + *Q_in = sub( add( *Q_in, shift64 ), Q6 ); + move16(); + } + + pos_idx = 0; + { + FOR( b = 0; b < num_md_bands; b++ ) + { + FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) + { + hBinPostRenderer->mixer_mat_re_fx[pos_idx][b][ch_idx1][0] = rot_md_act[pos_idx][b].pred_mat_re_fx[ch_idx1][0]; // Q25 + hBinPostRenderer->mixer_mat_re_fx[pos_idx][b][ch_idx1][1] = rot_md_act[pos_idx][b].pred_mat_re_fx[ch_idx1][1]; // Q25 + hBinPostRenderer->mixer_mat_im_fx[pos_idx][b][ch_idx1][0] = rot_md_act[pos_idx][b].pred_mat_im_fx[ch_idx1][0]; // Q25 + hBinPostRenderer->mixer_mat_im_fx[pos_idx][b][ch_idx1][1] = rot_md_act[pos_idx][b].pred_mat_im_fx[ch_idx1][1]; // Q25 + } + hBinPostRenderer->gd_mem_fx[pos_idx][b] = rot_md_act[pos_idx][b].gd_fx; // Q25 + } + } + hBinPostRenderer->cf_flag = 1; + + pop_wmops(); + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function isar_rend_CldfbSplitPostRendProcessTdIn() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void isar_rend_CldfbSplitPostRendProcessTdIn( + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinHrSplitPostRend, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const IVAS_QUATERNION QuaternionPost, + Word32 output_fx[][L_FRAME48k], + Word16 *Q_out ) +{ + Word16 ch_idx, slot_idx, num_cldfb_bands; + Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] = { 0 }; + Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] = { 0 }; + num_cldfb_bands = hBinHrSplitPostRend->cldfbSyn[0]->no_channels; + Word16 Q_output = Q11; + Word16 Q_in = Q6; + + /* Implement CLDFB analysis */ + FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) + { + Scale_sig32( output_fx[ch_idx], L_FRAME48k, Q_output - Q_out[ch_idx] ); + FOR( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + Word16 Q_cldfb = Q_output; + cldfbAnalysis_ts_fx_fixed_q( &( output_fx[ch_idx][num_cldfb_bands * slot_idx] ), + Cldfb_RealBuffer_Binaural_fx[ch_idx][slot_idx], + Cldfb_ImagBuffer_Binaural_fx[ch_idx][slot_idx], + num_cldfb_bands, + hBinHrSplitPostRend->cldfbAna[ch_idx], + &Q_cldfb ); // Q_cldfb - 5 + } + } + + isar_SplitRenderer_PostRenderer( hBinHrSplitPostRend, pMultiBinPoseData, Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, QuaternionPost, &Q_in ); + + /* Implement CLDFB synthesis */ + FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) + { + Word32 *RealBuffer_fx[CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 *ImagBuffer_fx[CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES]; + Word16 scaleFactor = 31, Q_cldfb; + + FOR( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + RealBuffer_fx[slot_idx] = Cldfb_RealBuffer_Binaural_fx[ch_idx][slot_idx]; + ImagBuffer_fx[slot_idx] = Cldfb_ImagBuffer_Binaural_fx[ch_idx][slot_idx]; + scaleFactor = s_min( scaleFactor, s_min( L_norm_arr( RealBuffer_fx[slot_idx], num_cldfb_bands ), L_norm_arr( ImagBuffer_fx[slot_idx], num_cldfb_bands ) ) ); + scaleFactor = s_min( scaleFactor, L_norm_arr( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_length ) ); + } + scaleFactor = s_min( sub( scaleFactor, 6 ), Q24 ); // guarded bits + FOR( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + Scale_sig32( RealBuffer_fx[slot_idx], num_cldfb_bands, scaleFactor ); + Scale_sig32( ImagBuffer_fx[slot_idx], num_cldfb_bands, scaleFactor ); + } + Q_cldfb = add( scaleFactor, Q_in ); + Scale_sig32( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( sub( Q_cldfb, 1 ), Q11 ) ); + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch_idx][0] ), num_cldfb_bands * CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, 0, 0, hBinHrSplitPostRend->cldfbSyn[ch_idx] ); // Q_cldfb - 1 + Scale_sig32( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( Q11, sub( Q_cldfb, 1 ) ) ); + Q_out[ch_idx] = sub( Q_cldfb, 1 ); + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function isar_rend_CldfbSplitPostRendProcess() + * + * + *-----------------------------------------------------------------------------------------*/ + +void isar_rend_CldfbSplitPostRendProcess( + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinHrSplitPostRend, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const IVAS_QUATERNION QuaternionPost, + Word32 Cldfb_RealBuffer_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_ImagBuffer_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], + Word16 Q_cldfb_in, + Word32 output_fx[][L_FRAME48k], + Word16 *Q_out, + const Word16 cldfb_in_flag ) +{ + Word16 ch_idx, slot_idx, num_cldfb_bands; + + push_wmops( "isar_rend_CldfbSplitPostRendProcess" ); + + num_cldfb_bands = hBinHrSplitPostRend->cldfbSyn[0]->no_channels; + + IF( EQ_16( cldfb_in_flag, 0 ) ) + { + isar_rend_CldfbSplitPostRendProcessTdIn( hBinHrSplitPostRend, pMultiBinPoseData, QuaternionPost, output_fx, Q_out ); + pop_wmops(); + return; + } + + isar_SplitRenderer_PostRenderer( hBinHrSplitPostRend, pMultiBinPoseData, Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, QuaternionPost, &Q_cldfb_in ); + + /* Implement CLDFB synthesis */ + FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) + { + Word32 *RealBuffer_fx[CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 *ImagBuffer_fx[CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES]; + Word16 scaleFactor = 31, Q_cldfb; + + FOR( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + RealBuffer_fx[slot_idx] = Cldfb_RealBuffer_Binaural_fx[ch_idx][slot_idx]; + ImagBuffer_fx[slot_idx] = Cldfb_ImagBuffer_Binaural_fx[ch_idx][slot_idx]; + scaleFactor = s_min( scaleFactor, s_min( L_norm_arr( RealBuffer_fx[slot_idx], num_cldfb_bands ), L_norm_arr( ImagBuffer_fx[slot_idx], num_cldfb_bands ) ) ); + scaleFactor = s_min( scaleFactor, L_norm_arr( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_length ) ); + } + + scaleFactor = s_min( sub( scaleFactor, 6 ), Q24 ); // guarded bits + FOR( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + Scale_sig32( RealBuffer_fx[slot_idx], num_cldfb_bands, scaleFactor ); + Scale_sig32( ImagBuffer_fx[slot_idx], num_cldfb_bands, scaleFactor ); + } + Q_cldfb = scaleFactor + Q_cldfb_in; + Scale_sig32( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( sub( Q_cldfb, 1 ), Q11 ) ); + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch_idx][0] ), num_cldfb_bands * CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, 0, 0, hBinHrSplitPostRend->cldfbSyn[ch_idx] ); // Q_cldfb - 1 + Scale_sig32( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( Q11, sub( Q_cldfb, 1 ) ) ); + Q_out[ch_idx] = sub( Q_cldfb, 1 ); + } + + pop_wmops(); + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function isar_init_split_post_rend_handles() + * + * + *-----------------------------------------------------------------------------------------*/ + +void isar_init_split_post_rend_handles( + ISAR_SPLIT_POST_REND_WRAPPER *hSplitRendWrapper ) +{ + hSplitRendWrapper->hBinHrSplitPostRend = NULL; + hSplitRendWrapper->hSplitBinLCLDDec = NULL; + hSplitRendWrapper->hLc3plusDec = NULL; + isar_init_multi_bin_pose_data_fx( &hSplitRendWrapper->multiBinPoseData ); + hSplitRendWrapper->first_good_frame_received = 0; + + return; +} diff --git a/lib_isar/isar_splitRendererPre.c b/lib_isar/isar_splitRendererPre.c new file mode 100644 index 0000000000000000000000000000000000000000..2e5c0236c2febe2bf09dda804bbf641699fb1a9b --- /dev/null +++ b/lib_isar/isar_splitRendererPre.c @@ -0,0 +1,3210 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG +#include +#endif +#include "ivas_prot_fx.h" +#include "prot_fx.h" +#include "lib_isar_pre_rend.h" +#include "isar_rom_post_rend.h" +#include "isar_prot.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" +#ifdef DBG_WAV_WRITER +#include "string.h" +#endif +#ifdef DEBUG_QUANT_CODE_OUT +#include "float_to_fix_ops.h" +#endif +#include "basop_util.h" + +/*---------------------------------------------------------------------* + * Local function declarations + *---------------------------------------------------------------------*/ + +static void isar_SplitRenderer_GetRotMd_fx( ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + Word32 *Cldfb_RealBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX], + Word16 exp_cldfb_re, + Word32 *Cldfb_ImagBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX], + Word16 exp_cldfb_im, + const Word16 low_res, + const Word16 ro_md_flag ); + +/*------------------------------------------------------------------------- + * Local functions + * + * + *------------------------------------------------------------------------*/ + +static void isar_calc_mat_det_2by2_complex_fx( + Word32 in_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 exp_in_re, + Word32 in_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 exp_in_im, + Word32 *det_re, + Word16 *exp_det_re, + Word32 *det_im, + Word16 *exp_det_im ) +{ + Word32 re1_fx, im1_fx, re2_fx, im2_fx; + + Word16 exp_re_1 = 0, exp_re_2 = 0; + Word16 exp_im_1 = 0, exp_im_2 = 0; + ivas_cmult_fix( in_re_fx[0][0], exp_in_re, in_im_fx[0][0], exp_in_im, in_re_fx[1][1], exp_in_re, in_im_fx[1][1], exp_in_im, &re1_fx, &im1_fx, &exp_re_1, &exp_im_1 ); + ivas_cmult_fix( in_re_fx[0][1], exp_in_re, in_im_fx[0][1], exp_in_im, in_re_fx[1][0], exp_in_re, in_im_fx[1][0], exp_in_im, &re2_fx, &im2_fx, &exp_re_2, &exp_im_2 ); + + Word16 exp_re_final = 0, exp_im_final = 0; + *det_re = BASOP_Util_Add_Mant32Exp( re1_fx, exp_re_1, L_negate( re2_fx ), exp_re_2, &exp_re_final ); + *det_im = BASOP_Util_Add_Mant32Exp( im1_fx, exp_im_1, L_negate( im2_fx ), exp_im_2, &exp_im_final ); + *exp_det_re = exp_re_final; + *exp_det_im = exp_im_final; + + return; +} + + +static Word16 isar_is_mat_inv_2by2_complex_fx( + Word32 in_re[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 exp_in_re, + Word32 in_im[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 exp_in_im ) +{ + Word16 is_det_zero = 1; + Word32 det, det_re, det_im; + Word16 exp_det = 0, exp_det_re = 0, exp_det_im = 0; + isar_calc_mat_det_2by2_complex_fx( in_re, exp_in_re, in_im, exp_in_im, &det_re, &exp_det_re, &det_im, &exp_det_im ); + + Word64 det_re_sq = W_mult_32_32( det_re, det_re ); + Word16 det_sq_re_nrm = W_norm( det_re_sq ); + Word32 tmp1 = W_extract_h( W_shl( det_re_sq, det_sq_re_nrm ) ); + + Word64 det_im_sq = W_mult_32_32( det_im, det_im ); + Word16 det_im_nrm = W_norm( det_im_sq ); + Word32 tmp2 = W_extract_h( W_shl( det_im_sq, det_im_nrm ) ); + + det = BASOP_Util_Add_Mant32Exp( tmp1, exp_det_re + exp_det_re - det_sq_re_nrm, tmp2, exp_det_im + exp_det_im - det_im_nrm, &exp_det ); + + Word16 res = BASOP_Util_Cmp_Mant32Exp( det, exp_det, EPSILON_FX, 31 ); + IF( EQ_16( res, -1 ) ) + { + is_det_zero = 0; + } + + return is_det_zero; +} + + +static void isar_calc_mat_inv_2by2_complex_fx( + Word32 in_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 exp_in_re, + Word32 in_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 exp_in_im, + Word32 out_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 *exp_out_re, + Word32 out_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 *exp_out_im ) +{ + Word16 exp_buffer_re[BINAURAL_CHANNELS][BINAURAL_CHANNELS], exp_buffer_im[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + + FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < BINAURAL_CHANNELS; j++ ) + { + exp_buffer_re[i][j] = MIN16B; + move16(); + exp_buffer_im[i][j] = MIN16B; + move16(); + } + } + Word32 det_re_fx, det_im_fx; + Word16 exp_det_re = 0, exp_det_im = 0; + move16(); + move16(); + Word32 re_fx, im_fx, det_fx; + Word16 exp_re = 0, exp_im = 0; + move16(); + move16(); + + isar_calc_mat_det_2by2_complex_fx( in_re_fx, exp_in_re, in_im_fx, exp_in_im, &det_re_fx, &exp_det_re, &det_im_fx, &exp_det_im ); + + Word16 tmp1 = W_norm( W_mult_32_32( det_re_fx, det_re_fx ) ); + Word32 tmp2 = W_extract_h( W_shl( W_mult_32_32( det_re_fx, det_re_fx ), tmp1 ) ); // 2*exp_det_re - tmp1 + Word16 tmp3 = W_norm( W_mult_32_32( det_im_fx, det_im_fx ) ); + Word32 tmp4 = W_extract_h( W_shl( W_mult_32_32( det_im_fx, det_im_fx ), tmp3 ) ); // 2*exp_im_re - tmp3 + Word16 exp_det = 0; + det_fx = BASOP_Util_Add_Mant32Exp( tmp2, 2 * exp_det_re - tmp1, tmp4, 2 * exp_det_im - tmp3, &exp_det ); + + Word16 exp_tmp5 = 0; + Word16 tmp5 = BASOP_Util_Divide3232_Scale( ONE_IN_Q30, det_fx, &exp_tmp5 ); + exp_det = add( exp_tmp5, sub( 1, exp_det ) ); + det_fx = L_deposit_h( tmp5 ); + +#ifdef DEBUGGING + /* assert to catch cases when input is singular matrix */ + assert( GT_32( det_fx, 0 ) ); +#endif + + exp_re = 0; + exp_im = 0; + move16(); + move16(); + ivas_cmult_fix( det_re_fx, exp_det_re, L_negate( det_im_fx ), exp_det_im, in_re_fx[1][1], exp_in_re, in_im_fx[1][1], exp_in_im, &re_fx, &im_fx, &exp_re, &exp_im ); + + Word64 tmp7 = W_mult_32_32( re_fx, det_fx ); + Word16 tmp7_nrm = W_norm( tmp7 ); + out_re_fx[0][0] = W_extract_h( W_shl( tmp7, tmp7_nrm ) ); // exp_re + exp_det - tmp7_nrm + move32(); + Word64 tmp8 = W_mult_32_32( im_fx, det_fx ); + Word16 tmp8_nrm = W_norm( tmp8 ); + out_im_fx[0][0] = W_extract_h( W_shl( tmp8, tmp8_nrm ) ); // exp_im + exp_det - tmp8_nrm + move32(); + + exp_buffer_re[0][0] = add( exp_re, sub( exp_det, tmp7_nrm ) ); + move16(); + exp_buffer_im[0][0] = add( exp_im, sub( exp_det, tmp8_nrm ) ); + move16(); + + ivas_cmult_fix( det_re_fx, exp_det_re, L_negate( det_im_fx ), exp_det_im, in_re_fx[0][1], exp_in_re, in_im_fx[0][1], exp_in_im, &re_fx, &im_fx, &exp_re, &exp_im ); + + Word64 tmp9 = W_mult_32_32( L_negate( re_fx ), det_fx ); + Word16 tmp9_nrm = W_norm( tmp9 ); + out_re_fx[0][1] = W_extract_h( W_shl( tmp9, tmp9_nrm ) ); + Word64 tmp10 = W_mult_32_32( L_negate( im_fx ), det_fx ); + Word16 tmp10_nrm = W_norm( tmp10 ); + out_im_fx[0][1] = W_extract_h( W_shl( tmp10, tmp10_nrm ) ); + + exp_buffer_re[0][1] = add( exp_re, sub( exp_det, tmp9_nrm ) ); + exp_buffer_im[0][1] = add( exp_im, sub( exp_det, tmp10_nrm ) ); + + ivas_cmult_fix( det_re_fx, exp_det_re, L_negate( det_im_fx ), exp_det_im, in_re_fx[1][0], exp_in_re, in_im_fx[1][0], exp_in_im, &re_fx, &im_fx, &exp_re, &exp_im ); + + Word64 tmp11 = W_mult_32_32( L_negate( re_fx ), det_fx ); + Word16 tmp11_nrm = W_norm( tmp11 ); + out_re_fx[1][0] = W_extract_h( W_shl( tmp11, tmp11_nrm ) ); + Word64 tmp12 = W_mult_32_32( L_negate( im_fx ), det_fx ); + Word16 tmp12_nrm = W_norm( tmp12 ); + out_im_fx[1][0] = W_extract_h( W_shl( tmp12, tmp12_nrm ) ); + + exp_buffer_re[1][0] = add( exp_re, sub( exp_det, tmp11_nrm ) ); + move16(); + exp_buffer_im[1][0] = add( exp_im, sub( exp_det, tmp12_nrm ) ); + move16(); + + ivas_cmult_fix( det_re_fx, exp_det_re, L_negate( det_im_fx ), exp_det_im, in_re_fx[0][0], exp_in_re, in_im_fx[0][0], exp_in_im, &re_fx, &im_fx, &exp_re, &exp_im ); + + Word64 tmp13 = W_mult_32_32( re_fx, det_fx ); + Word16 tmp13_nrm = W_norm( tmp13 ); + out_re_fx[1][1] = W_extract_h( W_shl( tmp13, tmp13_nrm ) ); + move32(); + + Word64 tmp14 = W_mult_32_32( im_fx, det_fx ); + Word16 tmp14_nrm = W_norm( tmp14 ); + out_im_fx[1][1] = W_extract_h( W_shl( tmp14, tmp14_nrm ) ); + move32(); + + exp_buffer_re[1][1] = add( exp_re, sub( exp_det, tmp13_nrm ) ); + move16(); + exp_buffer_im[1][1] = add( exp_im, sub( exp_det, tmp14_nrm ) ); + move16(); + + Word16 max_exp_re = MIN16B, max_exp_im = MIN16B; + FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < BINAURAL_CHANNELS; j++ ) + { + max_exp_re = s_max( max_exp_re, exp_buffer_re[i][j] ); + max_exp_im = s_max( max_exp_im, exp_buffer_im[i][j] ); + } + } + + FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < BINAURAL_CHANNELS; j++ ) + { + out_re_fx[i][j] = L_shr( out_re_fx[i][j], max_exp_re - exp_buffer_re[i][j] ); + move32(); + out_im_fx[i][j] = L_shr( out_im_fx[i][j], max_exp_im - exp_buffer_im[i][j] ); + move32(); + } + } + + *exp_out_re = max_exp_re; + move16(); + *exp_out_im = max_exp_im; + move16(); + + return; +} + + +static void ComputePredMat_fx( + Word32 cov_ii_re_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_ii_re, + Word32 cov_ii_im_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_ii_im, + Word32 cov_io_re_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_io_re, + Word32 cov_io_im_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_io_im, + Word32 pred_mat_re_fx[][BINAURAL_CHANNELS], + Word16 *exp_pred_mat_re, + Word32 pred_mat_im_fx[][BINAURAL_CHANNELS], + Word16 *exp_pred_mat_im, + const Word16 num_chs, + const Word16 real_only ) +{ + Word32 cov_ii_local_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 cov_ii_inv_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 cov_ii_inv_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 exp_cov_ii_local_re = 0, exp_cov_ii_inv_re = 0, exp_cov_ii_inv_im = 0; + Word32 trace_cov_fx; + + Word16 i, j; + + trace_cov_fx = 0; + Word16 exp_trace_cov = 0; + FOR( i = 0; i < num_chs; i++ ) + { + trace_cov_fx = L_add( trace_cov_fx, L_shr( cov_ii_re_fx[i][i], 1 ) ); + } + exp_trace_cov = add( exp_cov_ii_re, 1 ); + + trace_cov_fx = L_max( 0, trace_cov_fx ); + Word16 flag = BASOP_Util_Cmp_Mant32Exp( trace_cov_fx, exp_cov_ii_re, EPSILON_FX, 0 ); + IF( EQ_16( flag, negate( 1 ) ) ) + { + FOR( i = 0; i < num_chs; i++ ) + { + /* protection from cases when variance of ref channels is very small */ + set32_fx( pred_mat_re_fx[i], 0, BINAURAL_CHANNELS ); + set32_fx( pred_mat_im_fx[i], 0, BINAURAL_CHANNELS ); + } + return; + } + + Word16 buff_exp[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + buff_exp[i][j] = 0; + move16(); + } + } + + FOR( i = 0; i < num_chs; i++ ) + { + Copy32( cov_ii_re_fx[i], cov_ii_local_re_fx[i], num_chs ); + set16_fx( buff_exp[i], exp_cov_ii_re, num_chs ); + } + + Word32 tmp = 0; + FOR( i = 0; i < num_chs; i++ ) + { + tmp = Mpy_32_32( trace_cov_fx, 214748 ); // exp_trace_cov + Word16 exp_tmp = 0; + cov_ii_local_re_fx[i][i] = BASOP_Util_Add_Mant32Exp( cov_ii_re_fx[i][i], exp_cov_ii_re, tmp, exp_trace_cov, &exp_tmp ); + move32(); + buff_exp[i][i] = exp_tmp; + move16(); + } + + Word16 max_exp = MIN16B; + FOR( i = 0; i < 2; i++ ) + { + FOR( j = 0; j < 2; j++ ) + { + max_exp = max( max_exp, buff_exp[i][j] ); + } + } + + FOR( i = 0; i < num_chs; i++ ) + { + FOR( j = 0; j < num_chs; j++ ) + { + cov_ii_local_re_fx[i][j] = L_shr( cov_ii_local_re_fx[i][j], max_exp - buff_exp[i][j] ); + move32(); + } + } + + exp_cov_ii_local_re = max_exp; + move16(); + + IF( isar_is_mat_inv_2by2_complex_fx( cov_ii_local_re_fx, exp_cov_ii_local_re, cov_ii_im_fx, exp_cov_ii_im ) ) + { + isar_calc_mat_inv_2by2_complex_fx( cov_ii_local_re_fx, exp_cov_ii_local_re, cov_ii_im_fx, exp_cov_ii_im, cov_ii_inv_re_fx, &exp_cov_ii_inv_re, cov_ii_inv_im_fx, &exp_cov_ii_inv_im ); + isar_mat_mult_2by2_complex_fx( cov_ii_inv_re_fx, exp_cov_ii_inv_re, cov_ii_inv_im_fx, exp_cov_ii_inv_im, cov_io_re_fx, exp_cov_io_re, cov_io_im_fx, exp_cov_io_im, pred_mat_re_fx, exp_pred_mat_re, pred_mat_im_fx, exp_pred_mat_im ); + } + ELSE + { + Word16 max_var_idx; + FOR( i = 0; i < num_chs; i++ ) + { + set32_fx( pred_mat_re_fx[i], 0, BINAURAL_CHANNELS ); + set32_fx( pred_mat_im_fx[i], 0, BINAURAL_CHANNELS ); + } + + max_var_idx = 0; + move16(); + IF( GT_32( cov_ii_local_re_fx[1][1], cov_ii_local_re_fx[0][0] ) ) + { + max_var_idx = 1; + } + + Word16 tmp1 = 0, exp_tmp1 = 0; + move16(); + move16(); + Word16 tmp2 = 0, exp_tmp2 = 0; + move16(); + move16(); + Word16 flag1 = BASOP_Util_Cmp_Mant32Exp( cov_ii_local_re_fx[max_var_idx][max_var_idx], exp_cov_ii_local_re, EPSILON_FX, 0 ); + IF( EQ_16( flag1, 1 ) ) + { + Word16 pred_mat_buf_re[BINAURAL_CHANNELS][BINAURAL_CHANNELS], pred_mat_buf_im[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + set16_fx( pred_mat_buf_re[i], *exp_pred_mat_re, BINAURAL_CHANNELS ); + set16_fx( pred_mat_buf_im[i], *exp_pred_mat_im, BINAURAL_CHANNELS ); + } + FOR( j = 0; j < num_chs; j++ ) + { + tmp1 = BASOP_Util_Divide3232_Scale( cov_io_re_fx[max_var_idx][j], cov_ii_local_re_fx[max_var_idx][max_var_idx], &exp_tmp1 ); + exp_tmp1 = exp_tmp1 + ( exp_cov_io_re - exp_cov_ii_local_re ); + tmp2 = BASOP_Util_Divide3232_Scale( cov_io_im_fx[max_var_idx][j], cov_ii_local_re_fx[max_var_idx][max_var_idx], &exp_tmp2 ); + exp_tmp2 = exp_tmp2 + ( exp_cov_io_im - exp_cov_ii_local_re ); + pred_mat_re_fx[max_var_idx][j] = tmp1; + move32(); + pred_mat_im_fx[max_var_idx][j] = tmp2; + move32(); + pred_mat_buf_re[max_var_idx][j] = exp_tmp1; + move16(); + pred_mat_buf_im[max_var_idx][j] = exp_tmp2; + move16(); + } + + Word16 max_re = MIN16B, max_im = MIN16B; + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + + max_re = s_max( max_re, pred_mat_buf_re[i][j] ); + move16(); + max_im = s_max( max_im, pred_mat_buf_im[i][j] ); + move16(); + } + } + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + + pred_mat_re_fx[i][j] = L_shr( pred_mat_re_fx[i][j], max_re - pred_mat_buf_re[i][j] ); + move32(); + pred_mat_im_fx[i][j] = L_shr( pred_mat_im_fx[i][j], max_im - pred_mat_buf_im[i][j] ); + move32(); + } + } + + *exp_pred_mat_re = max_re; + move16(); + *exp_pred_mat_im = max_im; + move16(); + } + } + + IF( real_only ) + { + FOR( i = 0; i < num_chs; i++ ) + { + set32_fx( pred_mat_im_fx[i], 0, BINAURAL_CHANNELS ); + } + } + + return; +} + + +static void ComputePostPredCov_fx( + Word32 cov_ii_re_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_ii_re, + Word32 cov_ii_im_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_ii_im, + Word32 pred_mat_re_fx[][BINAURAL_CHANNELS], + Word16 exp_pred_mat_re, + Word32 pred_mat_im_fx[][BINAURAL_CHANNELS], + Word16 exp_pred_mat_im, + Word32 postpred_cov_re_fx[][BINAURAL_CHANNELS], + Word16 *exp_postpred_cov_re, + Word16 num_chs ) +{ + Word16 i, j; + Word32 dmx_mat_conj_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 dmx_mat_conj_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 temp_mat_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 temp_mat_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 postpred_cov_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 exp_postpred_cov_im = 0; + Word16 exp_temp_mat_re = 0, exp_temp_mat_im = 0; + + assert( num_chs == BINAURAL_CHANNELS ); + + FOR( i = 0; i < num_chs; i++ ) + { + FOR( j = 0; j < num_chs; j++ ) + { + dmx_mat_conj_re_fx[i][j] = pred_mat_re_fx[j][i]; + move32(); + dmx_mat_conj_im_fx[i][j] = L_negate( pred_mat_im_fx[j][i] ); + move32(); + + temp_mat_re_fx[i][j] = pred_mat_re_fx[i][j]; + move32(); + temp_mat_im_fx[i][j] = pred_mat_im_fx[i][j]; + move32(); + } + set32_fx( postpred_cov_re_fx[i], 0, BINAURAL_CHANNELS ); + } + isar_mat_mult_2by2_complex_fx( dmx_mat_conj_re_fx, exp_pred_mat_re, dmx_mat_conj_im_fx, exp_pred_mat_im, cov_ii_re_fx, exp_cov_ii_re, cov_ii_im_fx, exp_cov_ii_im, temp_mat_re_fx, &exp_temp_mat_re, temp_mat_im_fx, &exp_temp_mat_im ); + isar_mat_mult_2by2_complex_fx( temp_mat_re_fx, exp_temp_mat_re, temp_mat_im_fx, exp_temp_mat_im, pred_mat_re_fx, exp_pred_mat_re, pred_mat_im_fx, exp_pred_mat_im, postpred_cov_re_fx, exp_postpred_cov_re, postpred_cov_im_fx, &exp_postpred_cov_im ); + + /* 2x2 mult */ + + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < i; j++ ) + { + postpred_cov_re_fx[i][j] = postpred_cov_re_fx[j][i]; + move32(); + } + } + + return; +} + + +static void ComputeBandedCrossCov_fx( + Word32 *Cldfb_RealBuffer1_fx[][CLDFB_NO_COL_MAX], + Word16 exp_cldfb_re_1, + Word32 *Cldfb_ImagBuffer1_fx[][CLDFB_NO_COL_MAX], + Word16 exp_cldfb_im_1, + const Word16 ch_start_idx1, + Word32 *Cldfb_RealBuffer2_fx[][CLDFB_NO_COL_MAX], + Word16 exp_cldfb_re_2, + Word32 *Cldfb_ImagBuffer2_fx[][CLDFB_NO_COL_MAX], + Word16 exp_cldfb_im_2, + const Word16 ch_start_idx2, + Word32 out_cov_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 *exp_out_cov_re, + Word32 out_cov_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 *exp_out_cov_im, + const Word16 num_chs, + const Word16 *pBand_grouping, + const Word16 num_slots, + const Word16 start_slot_idx, + const Word16 md_band_idx, + const Word16 real_only ) +{ + Word16 sf, cldfb_band_idx, ch_idx1, ch_idx2; + Word16 brange[2]; + + FOR( ch_idx1 = 0; ch_idx1 < num_chs; ch_idx1++ ) + { + set_l( out_cov_re_fx[ch_idx1], 0, num_chs ); + set_l( out_cov_im_fx[ch_idx1], 0, num_chs ); + } + + brange[0] = pBand_grouping[md_band_idx]; + move16(); + brange[1] = pBand_grouping[md_band_idx + 1]; + move16(); + Word16 exp_buff_re[BINAURAL_CHANNELS][BINAURAL_CHANNELS], exp_buff_im[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + FOR( ch_idx1 = 0; ch_idx1 < num_chs; ch_idx1++ ) + { + FOR( ch_idx2 = 0; ch_idx2 < num_chs; ch_idx2++ ) + { + Word32 tmp_a = out_cov_re_fx[ch_idx1][ch_idx2], tmp_b = out_cov_im_fx[ch_idx1][ch_idx2]; + Word16 exp_tmp_a = 0, exp_tmp_b = 0; + IF( EQ_16( real_only, 0 ) ) + { + FOR( sf = start_slot_idx; sf < add( start_slot_idx, num_slots ); sf++ ) + { + FOR( cldfb_band_idx = brange[0]; cldfb_band_idx < brange[1]; cldfb_band_idx++ ) + { + Word64 tmp1 = W_mult_32_32( Cldfb_RealBuffer1_fx[ch_start_idx1 + ch_idx1][sf][cldfb_band_idx], Cldfb_RealBuffer2_fx[ch_start_idx2 + ch_idx2][sf][cldfb_band_idx] ); + Word16 tmp1_nrm = W_norm( tmp1 ); + Word32 tmp1_final = W_extract_h( W_shl( tmp1, tmp1_nrm ) ); + + Word64 tmp2 = W_mult_32_32( Cldfb_ImagBuffer1_fx[ch_start_idx1 + ch_idx1][sf][cldfb_band_idx], Cldfb_ImagBuffer2_fx[ch_start_idx2 + ch_idx2][sf][cldfb_band_idx] ); + Word16 tmp2_nrm = W_norm( tmp2 ); + Word32 tmp2_final = W_extract_h( W_shl( tmp2, tmp2_nrm ) ); + + Word16 exp_tmp3 = 0; + Word32 tmp3 = BASOP_Util_Add_Mant32Exp( tmp1_final, exp_cldfb_re_1 + exp_cldfb_re_2 - tmp1_nrm, tmp2_final, exp_cldfb_im_1 + exp_cldfb_im_2 - tmp2_nrm, &exp_tmp3 ); + Word16 exp_tmp_a_tmp = 0; + tmp_a = BASOP_Util_Add_Mant32Exp( tmp_a, exp_tmp_a, tmp3, exp_tmp3, &exp_tmp_a_tmp ); + exp_tmp_a = exp_tmp_a_tmp; + + Word64 tmp4 = W_mult_32_32( Cldfb_RealBuffer1_fx[ch_start_idx1 + ch_idx1][sf][cldfb_band_idx], Cldfb_ImagBuffer2_fx[ch_start_idx2 + ch_idx2][sf][cldfb_band_idx] ); + Word16 tmp4_nrm = W_norm( tmp4 ); + Word32 tmp4_final = W_extract_h( W_shl( tmp4, tmp4_nrm ) ); // exp_cldfb_re_1 + exp_cldfb_im_2 - tmp4_nrm + + Word64 tmp5 = W_mult_32_32( Cldfb_ImagBuffer1_fx[ch_start_idx1 + ch_idx1][sf][cldfb_band_idx], Cldfb_RealBuffer2_fx[ch_start_idx2 + ch_idx2][sf][cldfb_band_idx] ); + Word16 tmp5_nrm = W_norm( tmp5 ); + Word32 tmp5_final = W_extract_h( W_shl( tmp5, tmp5_nrm ) ); // exp_cldfb_im_1 + exp_cldfb_re_2 - tmp5_nrm + + Word16 exp_tmp6 = 0; + Word32 tmp6 = BASOP_Util_Add_Mant32Exp( tmp4_final, exp_cldfb_re_1 + exp_cldfb_im_2 - tmp4_nrm, L_negate( tmp5_final ), exp_cldfb_im_1 + exp_cldfb_re_2 - tmp5_nrm, &exp_tmp6 ); + Word16 exp_tmp_b_tmp = 0; + tmp_b = BASOP_Util_Add_Mant32Exp( tmp_b, exp_tmp_b, tmp6, exp_tmp6, &exp_tmp_b_tmp ); + exp_tmp_b = exp_tmp_b_tmp; + } + } + } + ELSE + { + FOR( sf = start_slot_idx; sf < add( start_slot_idx, num_slots ); sf++ ) + { + FOR( cldfb_band_idx = brange[0]; cldfb_band_idx < brange[1]; cldfb_band_idx++ ) + { + Word64 tmp1 = W_mult_32_32( Cldfb_RealBuffer1_fx[ch_start_idx1 + ch_idx1][sf][cldfb_band_idx], Cldfb_RealBuffer2_fx[ch_start_idx2 + ch_idx2][sf][cldfb_band_idx] ); + Word16 tmp1_nrm = W_norm( tmp1 ); + Word32 tmp1_final = W_extract_h( W_shl( tmp1, tmp1_nrm ) ); + + Word64 tmp2 = W_mult_32_32( Cldfb_ImagBuffer1_fx[ch_start_idx1 + ch_idx1][sf][cldfb_band_idx], Cldfb_ImagBuffer2_fx[ch_start_idx2 + ch_idx2][sf][cldfb_band_idx] ); + Word16 tmp2_nrm = W_norm( tmp2 ); + Word32 tmp2_final = W_extract_h( W_shl( tmp2, tmp2_nrm ) ); + + Word16 exp_tmp3 = 0; + Word32 tmp3 = BASOP_Util_Add_Mant32Exp( tmp1_final, exp_cldfb_re_1 + exp_cldfb_re_2 - tmp1_nrm, tmp2_final, exp_cldfb_im_1 + exp_cldfb_im_2 - tmp2_nrm, &exp_tmp3 ); + Word16 exp_tmp_a_tmp = 0; + tmp_a = BASOP_Util_Add_Mant32Exp( tmp_a, exp_tmp_a, tmp3, exp_tmp3, &exp_tmp_a_tmp ); + exp_tmp_a = exp_tmp_a_tmp; + + tmp_b = 0; + exp_tmp_b = 0; + } + } + } + out_cov_re_fx[ch_idx1][ch_idx2] = tmp_a; + move32(); + out_cov_im_fx[ch_idx1][ch_idx2] = tmp_b; + move32(); + exp_buff_re[ch_idx1][ch_idx2] = exp_tmp_a; + move32(); + exp_buff_im[ch_idx1][ch_idx2] = exp_tmp_b; + move32(); + } + } + /*make common exponent*/ + Word16 max_cov_re = 0, max_cov_im = 0; + FOR( Word16 i = 0; i < num_chs; i++ ) + { + FOR( Word16 j = 0; j < num_chs; j++ ) + { + max_cov_re = max( max_cov_re, exp_buff_re[i][j] ); + max_cov_im = max( max_cov_im, exp_buff_im[i][j] ); + } + } + FOR( Word16 i = 0; i < num_chs; i++ ) + { + FOR( Word16 j = 0; j < num_chs; j++ ) + { + out_cov_re_fx[i][j] = L_shr( out_cov_re_fx[i][j], max_cov_re - exp_buff_re[i][j] ); + move32(); + out_cov_im_fx[i][j] = L_shr( out_cov_im_fx[i][j], max_cov_im - exp_buff_im[i][j] ); + move32(); + } + } + + *exp_out_cov_re = max_cov_re; + *exp_out_cov_im = max_cov_im; + + return; +} + + +static void ComputeBandedCov_fx( + Word32 *Cldfb_RealBuffer_fx[][CLDFB_NO_COL_MAX], + Word16 exp_cldfb_re, + Word32 *Cldfb_ImagBuffer_fx[][CLDFB_NO_COL_MAX], + Word16 exp_cldfb_im, + const Word16 ch_start_idx, + Word32 out_cov_re_fx[][BINAURAL_CHANNELS], + Word16 *exp_cov_re, + Word32 out_cov_im_fx[][BINAURAL_CHANNELS], + Word16 *exp_cov_im, + const Word16 num_chs, + const Word16 *pBand_grouping, + const Word16 num_slots, + const Word16 start_slot_idx, + const Word16 md_band_idx, + const Word16 real_only ) +{ + Word16 sf, cldfb_band_idx, ch_idx1, ch_idx2; + Word16 brange[2]; + + FOR( ch_idx1 = 0; ch_idx1 < num_chs; ch_idx1++ ) + { + set32_fx( out_cov_re_fx[ch_idx1], 0, num_chs ); + set32_fx( out_cov_im_fx[ch_idx1], 0, num_chs ); + } + + brange[0] = pBand_grouping[md_band_idx]; + move16(); + brange[1] = pBand_grouping[md_band_idx + 1]; + move16(); + + Word16 exp_buff_re[BINAURAL_CHANNELS][BINAURAL_CHANNELS], exp_buff_im[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < BINAURAL_CHANNELS; j++ ) + { + exp_buff_re[i][j] = 0; + move16(); + exp_buff_im[i][j] = 0; + move16(); + } + } + + FOR( ch_idx1 = 0; ch_idx1 < num_chs; ch_idx1++ ) + { + FOR( ch_idx2 = 0; ch_idx2 <= ch_idx1; ch_idx2++ ) + { + Word32 tmp_a = out_cov_re_fx[ch_idx1][ch_idx2]; + Word32 tmp_b = out_cov_im_fx[ch_idx1][ch_idx2]; + Word16 exp_tmp_a = 0, exp_tmp_b = 0; + test(); + IF( ( NE_16( ch_idx2, ch_idx1 ) ) && ( EQ_16( real_only, 0 ) ) ) + { + FOR( sf = start_slot_idx; sf < add( start_slot_idx, num_slots ); sf++ ) + { + FOR( cldfb_band_idx = brange[0]; cldfb_band_idx < brange[1]; cldfb_band_idx++ ) + { + Word64 tmp1 = W_mult_32_32( Cldfb_RealBuffer_fx[ch_start_idx + ch_idx1][sf][cldfb_band_idx], Cldfb_RealBuffer_fx[ch_start_idx + ch_idx2][sf][cldfb_band_idx] ); + Word16 tmp1_nrm = W_norm( tmp1 ); + Word32 tmp1_final = W_extract_h( W_shl( tmp1, tmp1_nrm ) ); // exp_cldfb_re + exp_cldfb_re - tmp1_nrm + + Word64 tmp2 = W_mult_32_32( Cldfb_ImagBuffer_fx[ch_start_idx + ch_idx1][sf][cldfb_band_idx], Cldfb_ImagBuffer_fx[ch_start_idx + ch_idx2][sf][cldfb_band_idx] ); + Word16 tmp2_nrm = W_norm( tmp2 ); + Word32 tmp2_final = W_extract_h( W_shl( tmp2, tmp2_nrm ) ); // exp_cldfb_im + exp_cldfb_im - tmp2_nrm + + Word16 exp_tmp3 = 0; + Word32 tmp3 = BASOP_Util_Add_Mant32Exp( tmp1_final, exp_cldfb_re + exp_cldfb_re - tmp1_nrm, tmp2_final, exp_cldfb_im + exp_cldfb_im - tmp2_nrm, &exp_tmp3 ); + Word16 exp_tmp_a_tmp = 0; + tmp_a = BASOP_Util_Add_Mant32Exp( tmp_a, exp_tmp_a, tmp3, exp_tmp3, &exp_tmp_a_tmp ); + exp_tmp_a = exp_tmp_a_tmp; + + Word64 tmp4 = W_mult_32_32( Cldfb_RealBuffer_fx[ch_start_idx + ch_idx1][sf][cldfb_band_idx], Cldfb_ImagBuffer_fx[ch_start_idx + ch_idx2][sf][cldfb_band_idx] ); + Word16 tmp4_nrm = W_norm( tmp4 ); + Word32 tmp4_final = W_extract_h( W_shl( tmp4, tmp4_nrm ) ); // exp_cldfb_re + exp_cldfb_im - tmp4_nrm + + Word64 tmp5 = W_mult_32_32( Cldfb_ImagBuffer_fx[ch_start_idx + ch_idx1][sf][cldfb_band_idx], Cldfb_RealBuffer_fx[ch_start_idx + ch_idx2][sf][cldfb_band_idx] ); + Word16 tmp5_nrm = W_norm( tmp5 ); + Word32 tmp5_final = W_extract_h( W_shl( tmp5, tmp5_nrm ) ); // exp_cldfb_im + exp_cldfb_re - tmp5_nrm + + Word16 exp_tmp6 = 0; + Word32 tmp6 = BASOP_Util_Add_Mant32Exp( tmp4_final, exp_cldfb_re + exp_cldfb_im - tmp4_nrm, L_negate( tmp5_final ), exp_cldfb_im + exp_cldfb_re - tmp5_nrm, &exp_tmp6 ); + Word16 exp_tmp_b_tmp = 0; + tmp_b = BASOP_Util_Add_Mant32Exp( tmp_b, exp_tmp_b, tmp6, exp_tmp6, &exp_tmp_b_tmp ); + exp_tmp_b = exp_tmp_b_tmp; + } + } + } + ELSE + { + FOR( sf = start_slot_idx; sf < add( start_slot_idx, num_slots ); sf++ ) + { + FOR( cldfb_band_idx = brange[0]; cldfb_band_idx < brange[1]; cldfb_band_idx++ ) + { + Word64 tmp1 = W_mult_32_32( Cldfb_RealBuffer_fx[ch_start_idx + ch_idx1][sf][cldfb_band_idx], Cldfb_RealBuffer_fx[ch_start_idx + ch_idx2][sf][cldfb_band_idx] ); + Word16 tmp1_nrm = W_norm( tmp1 ); + Word32 tmp1_final = W_extract_h( W_shl( tmp1, tmp1_nrm ) ); // exp_cldfb_re + exp_cldfb_re - tmp1_nrm + + Word64 tmp2 = W_mult_32_32( Cldfb_ImagBuffer_fx[ch_start_idx + ch_idx1][sf][cldfb_band_idx], Cldfb_ImagBuffer_fx[ch_start_idx + ch_idx2][sf][cldfb_band_idx] ); + Word16 tmp2_nrm = W_norm( tmp2 ); + Word32 tmp2_final = W_extract_h( W_shl( tmp2, tmp2_nrm ) ); // exp_cldfb_im + exp_cldfb_im - tmp2_nrm + + Word16 exp_tmp3 = 0; + Word32 tmp3 = BASOP_Util_Add_Mant32Exp( tmp1_final, exp_cldfb_re + exp_cldfb_re - tmp1_nrm, tmp2_final, exp_cldfb_im + exp_cldfb_im - tmp2_nrm, &exp_tmp3 ); + + Word16 exp_tmp_a_tmp = 0; + tmp_a = BASOP_Util_Add_Mant32Exp( tmp_a, exp_tmp_a, tmp3, exp_tmp3, &exp_tmp_a_tmp ); + exp_tmp_a = exp_tmp_a_tmp; + + tmp_b = 0; + exp_tmp_b = 0; + } + } + } + out_cov_re_fx[ch_idx1][ch_idx2] = tmp_a; + move32(); + exp_buff_re[ch_idx1][ch_idx2] = exp_tmp_a; + move32(); + + out_cov_im_fx[ch_idx1][ch_idx2] = tmp_b; + move32(); + exp_buff_im[ch_idx1][ch_idx2] = exp_tmp_b; + move32(); + } + } + + Word16 exp_max_re = MIN16B, exp_max_im = MIN16B; + FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < BINAURAL_CHANNELS; j++ ) + { + exp_max_re = max( exp_max_re, exp_buff_re[i][j] ); + exp_max_im = max( exp_max_im, exp_buff_im[i][j] ); + } + } + + FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < BINAURAL_CHANNELS; j++ ) + { + out_cov_re_fx[i][j] = L_shr( out_cov_re_fx[i][j], exp_max_re - exp_buff_re[i][j] ); + move32(); + out_cov_im_fx[i][j] = L_shr( out_cov_im_fx[i][j], exp_max_im - exp_buff_im[i][j] ); + move32(); + } + } + + FOR( ch_idx1 = 0; ch_idx1 < num_chs; ch_idx1++ ) + { + FOR( ch_idx2 = add( ch_idx1, 1 ); ch_idx2 < num_chs; ch_idx2++ ) + { + out_cov_re_fx[ch_idx1][ch_idx2] = out_cov_re_fx[ch_idx2][ch_idx1]; + move32(); + out_cov_im_fx[ch_idx1][ch_idx2] = L_negate( out_cov_im_fx[ch_idx2][ch_idx1] ); + move32(); + } + } + + *exp_cov_re = exp_max_re; + *exp_cov_im = exp_max_im; + + return; +} + + +static Word32 GetNormFact_fx( + Word32 cov_ii_re_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_ii_re, + Word32 cov_ii_im_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_ii_im, + Word32 cov_io_re_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_io_re, + Word32 cov_io_im_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_io_im, + Word32 cov_oo_re_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_oo_re, + Word16 *exp_norm_fact_fx ) +{ + Word16 i, j; + Word32 norm_fact_fx = 0, abs_val_fx; + Word16 exp_abs_val = 0, exp_norm_fact = 0; + + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + ivas_calculate_abs_fx( cov_ii_re_fx[i][j], exp_cov_ii_re, cov_ii_im_fx[i][j], exp_cov_ii_im, &abs_val_fx, &exp_abs_val ); + Word16 res_1 = BASOP_Util_Cmp_Mant32Exp( norm_fact_fx, exp_norm_fact, abs_val_fx, exp_abs_val ); + IF( EQ_16( res_1, negate( 1 ) ) ) + { + norm_fact_fx = abs_val_fx; + exp_norm_fact = exp_abs_val; + } + + ivas_calculate_abs_fx( cov_io_re_fx[i][j], exp_cov_io_re, cov_io_im_fx[i][j], exp_cov_io_im, &abs_val_fx, &exp_abs_val ); + res_1 = BASOP_Util_Cmp_Mant32Exp( norm_fact_fx, exp_norm_fact, abs_val_fx, exp_abs_val ); + IF( EQ_16( res_1, negate( 1 ) ) ) + { + norm_fact_fx = abs_val_fx; + exp_norm_fact = exp_abs_val; + } + ivas_calculate_rabs_fx( cov_oo_re_fx[i][j], exp_cov_oo_re, &abs_val_fx, &exp_abs_val ); + res_1 = BASOP_Util_Cmp_Mant32Exp( norm_fact_fx, exp_norm_fact, abs_val_fx, exp_abs_val ); + IF( EQ_16( res_1, negate( 1 ) ) ) + { + norm_fact_fx = abs_val_fx; + exp_norm_fact = exp_abs_val; + } + } + } + + Word16 flag = BASOP_Util_Cmp_Mant32Exp( norm_fact_fx, exp_norm_fact, EPSILON_FX, 0 ); + IF( EQ_16( flag, negate( 1 ) ) ) + { + norm_fact_fx = ONE_IN_Q30; + exp_norm_fact = 1; + } + + Word16 exp_tmp = 0; + Word16 tmp = BASOP_Util_Divide3232_Scale( PCM16_TO_FLT_FAC_FX_Q15, norm_fact_fx, &exp_tmp ); + exp_tmp = add( exp_tmp, sub( 16, exp_norm_fact ) ); + norm_fact_fx = L_deposit_h( tmp ); + exp_norm_fact = exp_tmp; + + *exp_norm_fact_fx = exp_norm_fact; + + return norm_fact_fx; +} + +static void isar_split_rend_huffman_encode( + isar_split_rend_huffman_cfg_t *huff_cfg, + const Word16 in, + Word32 *hcode, + Word32 *hlen ) +{ + Word32 min_sym_val; + const Word32 *codebook; + + min_sym_val = huff_cfg->codebook[0]; + move32(); + + codebook = &huff_cfg->codebook[3 * ( in - min_sym_val )]; + *hlen = codebook[1]; + move32(); + *hcode = codebook[2]; + move32(); + + return; +} + + +static void isar_split_rend_quant_md_fx( + ISAR_BIN_HR_SPLIT_REND_MD_HANDLE hMd, + const ISAR_SPLIT_REND_POSE_TYPE pose_type, + const Word16 real_only, + Word32 fix_pos_rot_mat[][BINAURAL_CHANNELS], + const Word32 pred_1byquantstep, // Q26 + const Word16 Q_frame +#ifdef DEBUG_QUANT_MD_FX + , + float fix_pos_rot_mat_flt[][BINAURAL_CHANNELS], + const float pred_1byquantstep_flt // Q26 +#endif +) +{ + Word16 ch1, ch2; + Word16 gd_idx_min; + Word32 quant_val; +#ifdef DEBUG_QUANT_MD_FX + float quant_val_flt; + Word16 tmp; +#endif + + if ( pose_type == PRED_ONLY || pose_type == PRED_ROLL_ONLY ) + { + Word32 onebyquantstep; + + onebyquantstep = pred_1byquantstep; +#ifdef DEBUG_QUANT_MD_FX + float onebyquantstep_flt = pred_1byquantstep_flt; +#endif + IF( real_only == 1 ) + { + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + hMd->pred_mat_re_fx[ch1][ch1] = hMd->pred_mat_re2[ch1]; + } + hMd->pred_mat_re_fx[1][0] = 0; + hMd->pred_mat_re_fx[0][1] = 0; + + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + quant_val = L_sub_sat( hMd->pred_mat_re_fx[ch1][ch2], L_shr_r( ( ch1 == ch2 ) ? ONE_IN_Q31 : 0, sub( Q31, Q_frame ) ) ); + quant_val = L_min( L_shr_r( ISAR_SPLIT_REND_PRED_MAX_VAL_Q30, sub( Q30, Q_frame ) ), L_max( quant_val, L_shr_r( ISAR_SPLIT_REND_PRED_MIN_VAL_Q30, sub( Q30, Q_frame ) ) ) ); + hMd->pred_mat_re_idx[ch1][ch2] = (Word16) L_shr_r( Mpy_32_32( onebyquantstep, quant_val ), sub( Q_frame, 5 ) ); // Q25*Q26 = Q20 -> Q16 -> Q0 + } + } + } + else + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + quant_val = L_sub_sat( hMd->pred_mat_re_fx[ch1][ch2], L_shr_r( fix_pos_rot_mat[ch1][ch2], sub( Q31, Q_frame ) ) ); + quant_val = L_min( L_shr_r( ISAR_SPLIT_REND_PRED_MAX_VAL_Q30, sub( Q30, Q_frame ) ), L_max( quant_val, L_shr_r( ISAR_SPLIT_REND_PRED_MIN_VAL_Q30, sub( Q30, Q_frame ) ) ) ); + hMd->pred_mat_re_idx[ch1][ch2] = (Word16) L_shr_r( Mpy_32_32( onebyquantstep, quant_val ), sub( Q_frame, 5 ) ); // Q25*Q26 = Q20 -> Q16 -> Q0 + +#ifdef DEBUG_QUANT_MD_FX + quant_val_flt = hMd->pred_mat_re[ch1][ch2] - fix_pos_rot_mat_flt[ch1][ch2]; + quant_val_flt = min( ISAR_SPLIT_REND_PRED_MAX_VAL, max( quant_val_flt, ISAR_SPLIT_REND_PRED_MIN_VAL ) ); + tmp = (int16_t) roundf( onebyquantstep_flt * quant_val_flt ); + if ( hMd->pred_mat_re_idx[ch1][ch2] != tmp ) + { + printf( "\nUNEQUAL INDEX\n" ); + } +#endif + } + } + } + + if ( real_only == 0 ) + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + quant_val = L_min( L_shr_r( ISAR_SPLIT_REND_PRED_MAX_VAL_Q30, sub( Q30, Q_frame ) ), L_max( hMd->pred_mat_im_fx[ch1][ch2], L_shr_r( ISAR_SPLIT_REND_PRED_MIN_VAL_Q30, sub( Q30, Q_frame ) ) ) ); + hMd->pred_mat_im_idx[ch1][ch2] = (Word16) L_shr_r( Mpy_32_32( onebyquantstep, quant_val ), sub( Q_frame, 5 ) ); + // hMd->pred_mat_im[ch1][ch2] = hMd->pred_mat_im_idx[ch1][ch2] * IVAS_SPLIT_REND_PRED_Q_STEP; + + +#ifdef DEBUG_QUANT_MD_FX + quant_val_flt = min( ISAR_SPLIT_REND_PRED_MAX_VAL, max( hMd->pred_mat_im[ch1][ch2], ISAR_SPLIT_REND_PRED_MIN_VAL ) ); + tmp = (int16_t) roundf( onebyquantstep_flt * quant_val_flt ); + if ( hMd->pred_mat_im_idx[ch1][ch2] != tmp ) + { + printf( "\nUNEQUAL INDEX\n" ); + } +#endif + } + } + } + } + else if ( pose_type == COM_GAIN_ONLY ) + { + quant_val = L_min( L_shl_r( 1, Q_frame ) /*ISAR_SPLIT_REND_D_MAX_VAL_FX*/, L_max( hMd->gd_fx, ISAR_SPLIT_REND_D_MIN_VAL_FX ) ); //_frame + gd_idx_min = 0; //(int16_t)roundf(ISAR_SPLIT_REND_D_1BYQ_STEP * ISAR_SPLIT_REND_D_MIN_VAL) + hMd->gd_idx = (Word16) L_shr_r( Mpy_32_32( ISAR_SPLIT_REND_D_1BYQ_STEP_Q27, quant_val ), sub( Q_frame, 4 ) ); + hMd->gd_fx = W_extract_l( W_shr( W_mult0_32_32( hMd->gd_idx, ISAR_SPLIT_REND_D_Q_STEP_Q31 ), sub( Q31, Q_frame ) ) ); + hMd->gd_idx = sub( hMd->gd_idx, gd_idx_min ); + +#ifdef DEBUG_QUANT_MD_FX + quant_val_flt = min( ISAR_SPLIT_REND_D_MAX_VAL, max( hMd->gd, ISAR_SPLIT_REND_D_MIN_VAL ) ); + gd_idx_min = (int16_t) roundf( ISAR_SPLIT_REND_D_1BYQ_STEP * ISAR_SPLIT_REND_D_MIN_VAL ); + tmp = (int16_t) roundf( ISAR_SPLIT_REND_D_1BYQ_STEP * quant_val_flt ); + tmp = tmp - gd_idx_min; + if ( hMd->gd_idx != tmp ) + { + printf( "\nUNEQUAL INDEX\n" ); + } +#endif + } + else if ( pose_type == LR_GAIN_ONLY ) + { + quant_val = L_min( L_shr_r( ISAR_SPLIT_REND_PITCH_G_MAX_VAL_Q30, sub( Q30, Q_frame ) ), L_max( L_add( hMd->gd_fx, shr( 20, sub( Q30, Q_frame ) ) ), L_shr_r( ISAR_SPLIT_REND_PITCH_G_MIN_VAL_Q30, sub( Q30, Q_frame ) ) ) ); // Q25 + gd_idx_min = 7; // (int16_t)roundf(ISAR_SPLIT_REND_PITCH_G_1BYQ_STEP * ISAR_SPLIT_REND_PRED_MAX_VAL) + hMd->gd_idx = (Word16) L_shr_r( Mpy_32_32( ISAR_SPLIT_REND_PITCH_G_1BYQ_STEP_Q27, quant_val ), sub( Q_frame, 4 ) ); + hMd->gd_idx = sub( hMd->gd_idx, gd_idx_min ); + +#ifdef DEBUG_QUANT_MD_FX + quant_val_flt = min( ISAR_SPLIT_REND_PITCH_G_MAX_VAL, max( hMd->gd, ISAR_SPLIT_REND_PRED_MAX_VAL ) ); + gd_idx_min = (int16_t) roundf( ISAR_SPLIT_REND_PITCH_G_1BYQ_STEP * ISAR_SPLIT_REND_PRED_MAX_VAL ); + tmp = (int16_t) roundf( ISAR_SPLIT_REND_PITCH_G_1BYQ_STEP * quant_val_flt ); + tmp = tmp - gd_idx_min; + if ( hMd->gd_idx != tmp ) + { + printf( "\nUNEQUAL INDEX\n" ); + } +#endif + quant_val = L_min( L_shr_r( ISAR_SPLIT_REND_PITCH_G_MAX_VAL_Q30, sub( Q30, Q_frame ) ), L_max( L_add( hMd->gd2_fx, shr( 20, sub( Q30, Q_frame ) ) ), L_shr_r( ISAR_SPLIT_REND_PITCH_G_MIN_VAL_Q30, sub( Q30, Q_frame ) ) ) ); // Q25 + hMd->gd2_idx = (Word16) L_shr_r( Mpy_32_32( ISAR_SPLIT_REND_PITCH_G_1BYQ_STEP_Q27, quant_val ), sub( Q_frame, 4 ) ); + hMd->gd2_idx = sub( hMd->gd2_idx, gd_idx_min ); + +#ifdef DEBUG_QUANT_MD_FX + quant_val_flt = min( ISAR_SPLIT_REND_PITCH_G_MAX_VAL, max( hMd->gd2, ISAR_SPLIT_REND_PRED_MAX_VAL ) ); + tmp = (int16_t) roundf( ISAR_SPLIT_REND_PITCH_G_1BYQ_STEP * quant_val_flt ); + tmp = tmp - gd_idx_min; + if ( hMd->gd2_idx != tmp ) + { + printf( "\nUNEQUAL INDEX\n" ); + } +#endif + } + + return; +} + + +static void get_lr_gains( + Word32 cov_ii_re_fx[][BINAURAL_CHANNELS], + const Word16 exp_cov_ii_re, + Word32 cov_oo_re_fx[][BINAURAL_CHANNELS], + const Word16 exp_cov_oo_re, + Word32 gains_fx[BINAURAL_CHANNELS], + Word16 *exp_gains_fx ) +{ + Word16 exp_gd_tmp_buf[BINAURAL_CHANNELS] = { 0 }; + Word16 exp_gd_tmp = 0, i; + + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + gains_fx[i] = cov_ii_re_fx[i][i]; + move32(); + exp_gd_tmp_buf[i] = exp_cov_ii_re; + move16(); + + Word16 flag = BASOP_Util_Cmp_Mant32Exp( gains_fx[i], exp_gd_tmp_buf[i], EPSILON_FX, 0 ); + IF( EQ_16( flag, negate( 1 ) ) ) + { + gains_fx[i] = ONE_IN_Q25; + move32(); + exp_gd_tmp_buf[i] = 6; + move16(); + } + ELSE + { + Word16 tmp, tmp_sqrt, exp_tmp = 0; + tmp = BASOP_Util_Divide3232_Scale( cov_oo_re_fx[i][i], gains_fx[i], &exp_tmp ); + exp_tmp = exp_tmp + ( exp_cov_oo_re - exp_gd_tmp_buf[i] ); + tmp_sqrt = Sqrt16( tmp, &exp_tmp ); + gains_fx[i] = L_deposit_h( tmp_sqrt ); + move32(); + exp_gd_tmp_buf[i] = exp_tmp; + move16(); + } + } + + Word16 max_gd_exp = MIN16B; + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + max_gd_exp = max( max_gd_exp, exp_gd_tmp_buf[i] ); + } + exp_gd_tmp = max_gd_exp; + + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + gains_fx[i] = L_shr( gains_fx[i], max_gd_exp - exp_gd_tmp_buf[i] ); + move32(); + } + + *exp_gains_fx = exp_gd_tmp; + move16(); + + return; +} + + +static void ComputeCoeffs_fx( + Word32 cov_ii_re_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_ii_re, + Word32 cov_ii_im_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_ii_im, + Word32 cov_io_re_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_io_re, + Word32 cov_io_im_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_io_im, + Word32 cov_oo_re_fx[][BINAURAL_CHANNELS], + Word16 exp_cov_oo_re, + ISAR_BIN_HR_SPLIT_REND_MD_HANDLE hMd, + const ISAR_SPLIT_REND_POSE_TYPE pose_type, + const Word16 real_only ) +{ + Word16 i, j; + Word32 gd_fx, gl2_fx, gr2_fx, cov_norm_fact_fx; + Word16 exp_gd = 0; + + Word32 postpred_cov_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 exp_postpred_cov_re = 0; + + Word32 cov_ii_norm_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 cov_ii_norm_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 cov_io_norm_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 cov_io_norm_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 cov_oo_norm_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + + Word16 exp_cov_ii_norm_re = 0, exp_cov_ii_norm_im = 0, exp_cov_io_norm_re = 0, exp_cov_io_norm_im = 0, exp_cov_oo_norm_re = 0; + Word16 exp_pred_re = 0, exp_pred_im = 0; + + IF( EQ_16( pose_type, PITCH_ONLY ) ) + { + Word32 gd_tmp_fx[BINAURAL_CHANNELS]; + Word16 exp_gd_tmp_buf[BINAURAL_CHANNELS] = { 0 }; + Word16 exp_gd_tmp = 0; + + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + gd_tmp_fx[i] = cov_ii_re_fx[i][i]; + move32(); + exp_gd_tmp_buf[i] = exp_cov_ii_re; + move16(); + exp_gd_tmp = exp_cov_ii_re; + + Word16 flag = BASOP_Util_Cmp_Mant32Exp( gd_tmp_fx[i], exp_gd_tmp, EPSILON_FX, 0 ); + IF( EQ_16( flag, negate( 1 ) ) ) + { + gd_tmp_fx[i] = ONE_IN_Q25; + move32(); + exp_gd_tmp_buf[i] = 6; + move16(); + } + ELSE + { + Word16 tmp, tmp_sqrt, exp_tmp = 0; + tmp = BASOP_Util_Divide3232_Scale( cov_oo_re_fx[i][i], gd_tmp_fx[i], &exp_tmp ); + exp_tmp = add( exp_tmp, sub( exp_cov_oo_re, exp_gd_tmp ) ); + tmp_sqrt = Sqrt16( tmp, &exp_tmp ); + gd_tmp_fx[i] = L_deposit_h( tmp_sqrt ); + move32(); + exp_gd_tmp_buf[i] = exp_tmp; + move16(); + } + } + + Word16 max_gd_exp = MIN16B; + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + max_gd_exp = s_max( max_gd_exp, exp_gd_tmp_buf[i] ); + } + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + gd_tmp_fx[i] = L_shr( gd_tmp_fx[i], max_gd_exp - exp_gd_tmp_buf[i] ); + move32(); + } + exp_gd_tmp = max_gd_exp; + move16(); + hMd->gd_fx = gd_tmp_fx[0]; + move16(); + hMd->gd2_fx = gd_tmp_fx[1]; + move16(); + hMd->exp_gd = exp_gd_tmp; + move16(); + hMd->exp_gd2 = exp_gd_tmp; + move16(); + } + ELSE + { + IF( real_only ) + { + Word32 gd_tmp_fx[BINAURAL_CHANNELS]; + get_lr_gains( cov_ii_re_fx, exp_cov_ii_re, + cov_oo_re_fx, exp_cov_oo_re, + gd_tmp_fx, &hMd->exp_pred_mat_re2 ); + hMd->pred_mat_re_fx[1][0] = 0; + move32(); + hMd->pred_mat_re_fx[0][1] = 0; + move32(); + hMd->exp_pred_mat_re = hMd->exp_pred_mat_re2; + move16(); + hMd->exp_pred_mat_im = hMd->exp_pred_mat_re; + move16(); + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + hMd->pred_mat_re_fx[i][i] = gd_tmp_fx[i]; + hMd->pred_mat_re2[i] = gd_tmp_fx[i]; + set32_fx( hMd->pred_mat_im_fx[i], 0, BINAURAL_CHANNELS ); + } + } + ELSE + { + get_lr_gains( cov_ii_re_fx, exp_cov_ii_re, + cov_oo_re_fx, exp_cov_oo_re, + hMd->pred_mat_re2, &hMd->exp_pred_mat_re2 ); + Word16 exp_norm_fact = 0; + cov_norm_fact_fx = GetNormFact_fx( cov_ii_re_fx, exp_cov_ii_re, cov_ii_im_fx, exp_cov_ii_im, cov_io_re_fx, exp_cov_io_re, cov_io_im_fx, exp_cov_io_im, cov_oo_re_fx, exp_cov_oo_re, &exp_norm_fact ); + + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + cov_ii_norm_re_fx[i][j] = Mpy_32_32( cov_ii_re_fx[i][j], cov_norm_fact_fx ); + move32(); + cov_ii_norm_im_fx[i][j] = Mpy_32_32( cov_ii_im_fx[i][j], cov_norm_fact_fx ); + move32(); + cov_io_norm_re_fx[i][j] = Mpy_32_32( cov_io_re_fx[i][j], cov_norm_fact_fx ); + move32(); + cov_io_norm_im_fx[i][j] = Mpy_32_32( cov_io_im_fx[i][j], cov_norm_fact_fx ); + move32(); + cov_oo_norm_re_fx[i][j] = Mpy_32_32( cov_oo_re_fx[i][j], cov_norm_fact_fx ); + move32(); + } + } + + exp_cov_ii_norm_re = add( exp_cov_ii_re, exp_norm_fact ); + exp_cov_ii_norm_im = add( exp_cov_ii_im, exp_norm_fact ); + exp_cov_io_norm_re = add( exp_cov_io_re, exp_norm_fact ); + exp_cov_io_norm_im = add( exp_cov_io_im, exp_norm_fact ); + exp_cov_oo_norm_re = add( exp_cov_oo_re, exp_norm_fact ); + + ComputePredMat_fx( cov_ii_norm_re_fx, exp_cov_ii_norm_re, cov_ii_norm_im_fx, exp_cov_ii_norm_im, cov_io_norm_re_fx, exp_cov_io_norm_re, cov_io_norm_im_fx, exp_cov_io_norm_im, hMd->pred_mat_re_fx, &exp_pred_re, hMd->pred_mat_im_fx, &exp_pred_im, BINAURAL_CHANNELS, real_only ); + hMd->exp_pred_mat_re = exp_pred_re; + move16(); + hMd->exp_pred_mat_im = exp_pred_im; + move16(); + + /*TODO : change this function to real only as thats what is needed*/ + ComputePostPredCov_fx( cov_ii_norm_re_fx, exp_cov_ii_norm_re, cov_ii_norm_im_fx, exp_cov_ii_norm_im, hMd->pred_mat_re_fx, exp_pred_re, hMd->pred_mat_im_fx, exp_pred_im, postpred_cov_re_fx, &exp_postpred_cov_re, BINAURAL_CHANNELS ); + + /* normalize everything to +-1 range */ + Word16 gd_16_fx = BASOP_Util_Divide3232_Scale( ONE_IN_Q30, PCM16_TO_FLT_FAC_FX_Q15, &exp_gd ); + gd_fx = L_deposit_h( gd_16_fx ); + exp_gd = add( exp_gd, sub( 1, 16 ) ); + + Word16 tmp_buff_2[BINAURAL_CHANNELS][BINAURAL_CHANNELS], tmp_buff_3[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + Word64 tmp_2 = W_mult_32_32( cov_ii_norm_re_fx[i][j], gd_fx ); + Word64 tmp_3 = W_mult_32_32( cov_oo_norm_re_fx[i][j], gd_fx ); + Word16 shift_2 = W_norm( tmp_2 ); + Word16 shift_3 = W_norm( tmp_3 ); + + postpred_cov_re_fx[i][j] = Mpy_32_32( postpred_cov_re_fx[i][j], gd_fx ); + move32(); + cov_ii_norm_re_fx[i][j] = W_extract_h( W_shl( tmp_2, shift_2 ) ); + move32(); + cov_oo_norm_re_fx[i][j] = W_extract_h( W_shl( tmp_3, shift_3 ) ); + move32(); + + tmp_buff_2[i][j] = exp_cov_ii_norm_re + exp_gd - shift_2; + move16(); + tmp_buff_3[i][j] = exp_cov_oo_norm_re + exp_gd - shift_3; + move16(); + } + } + Word16 max_2 = MIN16B, max_3 = MIN16B; + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + max_2 = s_max( max_2, tmp_buff_2[i][j] ); + max_3 = s_max( max_3, tmp_buff_3[i][j] ); + } + } + + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + cov_ii_norm_re_fx[i][j] = L_shr( cov_ii_norm_re_fx[i][j], max_2 - tmp_buff_2[i][j] ); + move32(); + cov_oo_norm_re_fx[i][j] = L_shr( cov_oo_norm_re_fx[i][j], max_3 - tmp_buff_3[i][j] ); + move32(); + } + } + + exp_postpred_cov_re = add( exp_postpred_cov_re, exp_gd ); + exp_cov_ii_norm_re = max_2; + move16(); + exp_cov_oo_norm_re = max_3; + move16(); + + hMd->gd_fx = 0; + move16(); + Word16 exp_gl2 = 0; + move16(); + Word16 check_postPred = BASOP_Util_Cmp_Mant32Exp( postpred_cov_re_fx[0][0], exp_postpred_cov_re, EPSILON_FX, 0 ); + IF( EQ_16( check_postPred, 1 ) ) + { + Word16 exp_div_res = 0; + Word16 div_res = BASOP_Util_Divide3232_Scale( cov_oo_norm_re_fx[0][0], postpred_cov_re_fx[0][0], &exp_div_res ); + exp_div_res = exp_div_res + ( exp_cov_oo_norm_re - exp_postpred_cov_re ); + gl2_fx = L_deposit_h( div_res ); + exp_gl2 = exp_div_res; + move16(); + + Word16 Cmp1 = BASOP_Util_Cmp_Mant32Exp( gl2_fx, exp_gl2, ONE_IN_Q30, 1 ); + IF( EQ_16( Cmp1, negate( 1 ) ) ) + { + gl2_fx = ONE_IN_Q30; + exp_gl2 = 1; + move16(); + move16(); + } + + gl2_fx = Sqrt32( gl2_fx, &exp_gl2 ); + } + ELSE + { + gl2_fx = ONE_IN_Q30; + exp_gl2 = 1; + move16(); + move16(); + } + + Word16 exp_gr2 = 0; + check_postPred = BASOP_Util_Cmp_Mant32Exp( postpred_cov_re_fx[1][1], exp_postpred_cov_re, EPSILON_FX, 0 ); + IF( EQ_16( check_postPred, 1 ) ) + { + Word16 exp_div_res = 0; + Word16 div_res = BASOP_Util_Divide3232_Scale( cov_oo_norm_re_fx[1][1], postpred_cov_re_fx[1][1], &exp_div_res ); + exp_div_res = exp_div_res + ( exp_cov_oo_norm_re - exp_postpred_cov_re ); + gr2_fx = L_deposit_h( div_res ); + exp_gr2 = exp_div_res; + + Word16 Cmp1 = BASOP_Util_Cmp_Mant32Exp( gr2_fx, exp_gr2, ONE_IN_Q30, 1 ); + IF( EQ_16( Cmp1, negate( 1 ) ) ) + { + gr2_fx = ONE_IN_Q30; + move16(); + exp_gr2 = 1; + move16(); + } + + gr2_fx = Sqrt32( gr2_fx, &exp_gr2 ); + } + ELSE + { + gr2_fx = ONE_IN_Q30; + move16(); + exp_gr2 = 1; + move16(); + } + + Word16 pred_mat_buf_re[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 pred_mat_buf_im[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + pred_mat_buf_re[i][j] = exp_pred_re; + move16(); + pred_mat_buf_im[i][j] = exp_pred_im; + move16(); + } + } + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + hMd->pred_mat_re_fx[i][0] = Mpy_32_32( hMd->pred_mat_re_fx[i][0], gl2_fx ); + move32(); + hMd->pred_mat_re_fx[i][1] = Mpy_32_32( hMd->pred_mat_re_fx[i][1], gr2_fx ); + move32(); + pred_mat_buf_re[i][0] = add( exp_pred_re, exp_gl2 ); + move16(); + pred_mat_buf_re[i][1] = add( exp_pred_re, exp_gr2 ); + move16(); + } + + IF( EQ_16( real_only, 0 ) ) + { + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + hMd->pred_mat_im_fx[i][0] = Mpy_32_32( hMd->pred_mat_im_fx[i][0], gl2_fx ); + move32(); + hMd->pred_mat_im_fx[i][1] = Mpy_32_32( hMd->pred_mat_im_fx[i][1], gr2_fx ); + move32(); + + pred_mat_buf_im[i][0] = add( exp_pred_im, exp_gl2 ); + move16(); + pred_mat_buf_im[i][1] = add( exp_pred_im, exp_gr2 ); + move16(); + } + } + + Word16 max_exp_pred_re = MIN16B, max_exp_pred_im = MIN16B; + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + max_exp_pred_re = s_max( max_exp_pred_re, pred_mat_buf_re[i][j] ); + max_exp_pred_im = s_max( max_exp_pred_im, pred_mat_buf_im[i][j] ); + } + } + + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hMd->pred_mat_re_fx[i][j] = L_shr( hMd->pred_mat_re_fx[i][j], max_exp_pred_re - pred_mat_buf_re[i][j] ); + move32(); + hMd->pred_mat_im_fx[i][j] = L_shr( hMd->pred_mat_im_fx[i][j], max_exp_pred_im - pred_mat_buf_im[i][j] ); + move32(); + } + } + + hMd->exp_pred_mat_re = max_exp_pred_re; + move16(); + hMd->exp_pred_mat_im = max_exp_pred_im; + move16(); + } + } + + return; +} + + +static void get_base2_bits( + const ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const Word16 num_subframes, + const Word16 num_quant_strats, + const Word16 pred_real_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + const Word16 pred_imag_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word16 pred_quant_pnts_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + const Word16 d_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + const Word16 bands_pitch[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + const Word16 pred_real_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + const Word16 pred_imag_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word32 base2bits[ISAR_SPLIT_REND_NUM_QUANT_STRATS] ) +{ + Word16 pred_roll_bits; + Word16 d_gain_bits, pitch_gain_bits, pose_idx, q; + Word16 pred_yaw_bits[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; + Word16 bin_ch_2, bin_ch_2_num_sf, bin_ch_num_sf; + + ISAR_SPLIT_REND_POSE_TYPE pose_type; + + FOR( q = 0; q < num_quant_strats; q++ ) + { + pred_yaw_bits[q] = ceil_log_2( pred_quant_pnts_yaw[q] ); + move16(); + } + pred_roll_bits = ceil_log_2( ISAR_SPLIT_REND_ROLL_PRED_QUANT_PNTS ); + + d_gain_bits = ceil_log_2( ISAR_SPLIT_REND_D_QUANT_PNTS ); + pitch_gain_bits = d_gain_bits; + move16(); + + FOR( q = 0; q < num_quant_strats; q++ ) + { + base2bits[q] = 0; + move32(); + } + + bin_ch_2 = DEPR_i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ); + bin_ch_2_num_sf = DEPR_i_mult( bin_ch_2, num_subframes ); + bin_ch_num_sf = DEPR_i_mult( BINAURAL_CHANNELS, num_subframes ); + + FOR( q = 0; q < num_quant_strats; q++ ) + { + FOR( pose_idx = 0; pose_idx < sub( pMultiBinPoseData->num_poses, 1 ); pose_idx++ ) + { + pose_type = hBinHrSplitPreRend->pose_type[pose_idx]; + IF( EQ_32( pose_type, ANY_YAW ) ) + { + base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_yaw_bits[q], pred_real_bands_yaw[q] ), bin_ch_num_sf ) ); + move32(); + base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_yaw_bits[q], pred_imag_bands_yaw[q] ), bin_ch_num_sf ) ); + move32(); + base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_yaw_bits[q], pred_imag_bands_yaw[q] ), bin_ch_2_num_sf ) ); + move32(); + + + base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( d_gain_bits, d_bands_yaw[q] ), num_subframes ) ); + move32(); + } + ELSE IF( EQ_32( pose_type, PITCH_ONLY ) ) + { + base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pitch_gain_bits, bands_pitch[q] ), num_subframes ) ); + move32(); + base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pitch_gain_bits, bands_pitch[q] ), num_subframes ) ); + move32(); + } + ELSE + { + base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_roll_bits, pred_real_bands_roll[q] ), bin_ch_num_sf ) ); + move32(); + base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_roll_bits, pred_imag_bands_roll[q] ), bin_ch_num_sf ) ); + move32(); + base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_roll_bits, pred_imag_bands_roll[q] ), bin_ch_2_num_sf ) ); + move32(); + } + } + } + + return; +} + + +static void isar_SplitRenderer_code_md_base2( + const ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const Word16 num_subframes, + const Word16 pred_real_bands_yaw, + const Word16 pred_imag_bands_yaw, + const Word16 pred_quant_pnts_yaw, + const Word16 d_bands_yaw, + const Word16 bands_pitch, + const Word16 pred_real_bands_roll, + const Word16 pred_imag_bands_roll, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word16 pos_idx, b, ch1, ch2, sf_idx; + Word16 min_pred_idx, min_gd_idx, min_p_gd_idx, pred_code_len, gd_code_len, p_gd_code_len, num_poses; + Word16 min_pred_roll_idx, pred_roll_code_len; + Word16 pred_cb_idx; + Word32 code; + ISAR_BIN_HR_SPLIT_REND_MD_HANDLE hMd; + ISAR_BIN_HR_SPLIT_REND_HUFF_HANDLE pHuff_cfg; + + pHuff_cfg = &hBinHrSplitPreRend->huff_cfg; + IF( EQ_16( pred_quant_pnts_yaw, ISAR_SPLIT_REND_PRED_63QUANT_PNTS ) ) + { + pred_cb_idx = 1; + move16(); + } + ELSE + { + pred_cb_idx = 0; + move16(); + } + min_pred_idx = extract_l( pHuff_cfg->pred[pred_cb_idx].codebook[0] ); + min_pred_roll_idx = extract_l( pHuff_cfg->pred_roll.codebook[0] ); + min_gd_idx = extract_l( pHuff_cfg->gd.codebook[0] ); + min_p_gd_idx = extract_l( pHuff_cfg->p_gd.codebook[0] ); + + pred_code_len = pHuff_cfg->pred_base2_code_len[pred_cb_idx]; + move16(); + pred_roll_code_len = pHuff_cfg->pred_roll_base2_code_len; + move16(); + gd_code_len = pHuff_cfg->gd_base2_code_len; + move16(); + p_gd_code_len = pHuff_cfg->p_gd_base2_code_len; + move16(); + + num_poses = pMultiBinPoseData->num_poses; + move16(); + + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + FOR( pos_idx = 0; pos_idx < sub( num_poses, 1 ); pos_idx++ ) + { + IF( EQ_32( hBinHrSplitPreRend->pose_type[pos_idx], ANY_YAW ) ) + { + FOR( b = 0; b < pred_imag_bands_yaw; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + code = L_sub( hMd->pred_mat_re_idx[ch1][ch2], min_pred_idx ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, pred_code_len ); + } + } + + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + code = L_sub( hMd->pred_mat_im_idx[ch1][ch2], min_pred_idx ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, pred_code_len ); + } + } + } + FOR( ; b < pred_real_bands_yaw; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + code = L_sub( hMd->pred_mat_re_idx[ch1][ch1], min_pred_idx ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, pred_code_len ); + } + } + FOR( b = 0; b < d_bands_yaw; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + code = L_sub( hMd->gd_idx, min_gd_idx ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, gd_code_len ); + } + } + ELSE IF( EQ_32( hBinHrSplitPreRend->pose_type[pos_idx], PITCH_ONLY ) ) + { + FOR( b = 0; b < bands_pitch; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + code = L_sub( hMd->gd_idx, min_p_gd_idx ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, p_gd_code_len ); + + code = L_sub( hMd->gd2_idx, min_p_gd_idx ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, p_gd_code_len ); + } + } + ELSE + { + FOR( b = 0; b < pred_imag_bands_roll; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + code = L_sub( hMd->pred_mat_re_idx[ch1][ch2], min_pred_roll_idx ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, pred_roll_code_len ); + } + } + + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + code = L_sub( hMd->pred_mat_im_idx[ch1][ch2], min_pred_roll_idx ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, pred_roll_code_len ); + } + } + } + FOR( ; b < pred_real_bands_roll; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + code = L_sub( hMd->pred_mat_re_idx[ch1][ch1], min_pred_roll_idx ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, pred_roll_code_len ); + } + } + } + } + } + +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + { + static int16_t num_bits = 0; + static int16_t cntr = 0; + float fnum_bits; + + cntr++; + + num_bits += pBits->bits_written; + /* collect bits for every second */ + if ( cntr == 50 ) + { + cntr = 0; + fnum_bits = (float) num_bits / 1000.0f; + dbgwrite_txt( &fnum_bits, 1, "split_rend_MD_bitrate.txt", "MD bitrate (kbps)" ); + num_bits = 0; + } + } +#endif + return; +} + + +static void isar_SplitRenderer_code_md_huff( + const ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const Word16 num_subframes, + const Word16 pred_real_bands_yaw, + const Word16 pred_imag_bands_yaw, + const Word16 pred_quant_pnts_yaw, + const Word16 d_bands_yaw, + const Word16 bands_pitch, + const Word16 pred_real_bands_roll, + const Word16 pred_imag_bands_roll, + ISAR_SPLIT_REND_BITS_HANDLE pBits ) +{ + Word16 pos_idx, b, ch1, ch2, sf_idx, num_poses; + Word16 sym_adj_idx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 min_pred_idx, max_pred_idx; + Word16 min_pred_roll_idx, max_pred_roll_idx, pred_cb_idx; + Word32 code, len; + ISAR_BIN_HR_SPLIT_REND_MD_HANDLE hMd; + ISAR_BIN_HR_SPLIT_REND_HUFF_HANDLE pHuff_cfg; + + pHuff_cfg = &hBinHrSplitPreRend->huff_cfg; + + IF( EQ_16( pred_quant_pnts_yaw, ISAR_SPLIT_REND_PRED_63QUANT_PNTS ) ) + { + pred_cb_idx = 1; + move16(); + } + ELSE + { + pred_cb_idx = 0; + move16(); + } + + min_pred_idx = extract_l( pHuff_cfg->pred[pred_cb_idx].codebook[0] ); + max_pred_idx = extract_l( pHuff_cfg->pred[pred_cb_idx].codebook[DEPR_i_mult( sub( pred_quant_pnts_yaw, 1 ), 3 )] ); + min_pred_roll_idx = extract_l( pHuff_cfg->pred_roll.codebook[0] ); + max_pred_roll_idx = extract_l( pHuff_cfg->pred_roll.codebook[DEPR_i_mult( sub( ISAR_SPLIT_REND_ROLL_PRED_QUANT_PNTS, 1 ), 3 )] ); + + num_poses = pMultiBinPoseData->num_poses; + move16(); + + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + FOR( pos_idx = 0; pos_idx < sub( num_poses, 1 ); pos_idx++ ) + { + IF( EQ_32( hBinHrSplitPreRend->pose_type[pos_idx], ANY_YAW ) ) + { + FOR( b = 0; b < pred_imag_bands_yaw; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + isar_SplitRenderer_getdiagdiff( hMd->pred_mat_re_idx, sym_adj_idx, -1, min_pred_idx, max_pred_idx ); + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + isar_split_rend_huffman_encode( &pHuff_cfg->pred[pred_cb_idx], sym_adj_idx[ch1][ch2], &code, &len ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); + } + } + + isar_SplitRenderer_getdiagdiff( hMd->pred_mat_im_idx, sym_adj_idx, 1, min_pred_idx, max_pred_idx ); + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + isar_split_rend_huffman_encode( &pHuff_cfg->pred[pred_cb_idx], sym_adj_idx[ch1][ch2], &code, &len ); + + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); + } + } + } + FOR( ; b < pred_real_bands_yaw; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + isar_SplitRenderer_getdiagdiff( hMd->pred_mat_re_idx, sym_adj_idx, 1, min_pred_idx, max_pred_idx ); + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + isar_split_rend_huffman_encode( &pHuff_cfg->pred[pred_cb_idx], sym_adj_idx[ch1][ch1], &code, &len ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); + } + } + FOR( b = 0; b < d_bands_yaw; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + isar_split_rend_huffman_encode( &pHuff_cfg->gd, hMd->gd_idx, &code, &len ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); + } + } + ELSE IF( EQ_32( hBinHrSplitPreRend->pose_type[pos_idx], PITCH_ONLY ) ) + { + FOR( b = 0; b < bands_pitch; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + isar_split_rend_huffman_encode( &pHuff_cfg->p_gd, hMd->gd_idx, &code, &len ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); + + isar_split_rend_huffman_encode( &pHuff_cfg->p_gd, hMd->gd2_idx, &code, &len ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); + } + } + ELSE + { + FOR( b = 0; b < pred_imag_bands_roll; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + isar_SplitRenderer_getdiagdiff( hMd->pred_mat_re_idx, sym_adj_idx, -1, min_pred_roll_idx, max_pred_roll_idx ); + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + isar_split_rend_huffman_encode( &pHuff_cfg->pred_roll, sym_adj_idx[ch1][ch2], &code, &len ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); + } + } + + isar_SplitRenderer_getdiagdiff( hMd->pred_mat_im_idx, sym_adj_idx, 1, min_pred_roll_idx, max_pred_roll_idx ); + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + isar_split_rend_huffman_encode( &pHuff_cfg->pred_roll, sym_adj_idx[ch1][ch2], &code, &len ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); + } + } + } + FOR( ; b < pred_real_bands_roll; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + isar_SplitRenderer_getdiagdiff( hMd->pred_mat_re_idx, sym_adj_idx, 1, min_pred_roll_idx, max_pred_roll_idx ); + FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + isar_split_rend_huffman_encode( &pHuff_cfg->pred_roll, sym_adj_idx[ch1][ch1], &code, &len ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); + } + } + } + } + } + +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + { + static int16_t num_bits = 0; + static int16_t cntr = 0; + float fnum_bits; + + cntr++; + num_bits += pBits->bits_written; + /* collect bits for every second */ + IF( cntr == 50 ) + { + cntr = 0; + fnum_bits = (float) num_bits / 1000.0f; + dbgwrite_txt( &fnum_bits, 1, "split_rend_MD_bitrate.txt", "MD bitrate (kbps)" ); + num_bits = 0; + } + } +#endif + return; +} + + +static void isar_SplitRenderer_quant_code( + const ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, + const IVAS_QUATERNION headPosition, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + ISAR_SPLIT_REND_BITS_HANDLE pBits, + const Word16 low_res_pre_rend_rot, + const Word16 ro_md_flag, + const Word32 target_md_bits, + const Word16 Q_frame ) +{ + Word16 q, num_subframes, sf_idx, pos_idx, b, num_quant_strats; + Word32 overhead_bits, quant_strat_bits, huff_bits, start_bit; + Word16 pred_real_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], pred_real_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; + Word16 pred_imag_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], pred_imag_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; + Word16 d_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], bands_pitch[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; + Word32 base2bits[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; + Word16 pred_quant_pnts_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; + Word32 pred_1byquantstep_yaw_fx[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; + Word32 pred_quantstep_yaw_fx[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; +#ifdef DEBUG_QUANT_MD_FX + float pred_1byquantstep_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; + float pred_quantstep_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; +#endif + ISAR_BIN_HR_SPLIT_REND_MD_HANDLE hMd; + Word16 rot_axis_code, num_bits; + + IF( low_res_pre_rend_rot ) + { + num_subframes = 1; + } + ELSE + { + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + } + + overhead_bits = pBits->bits_written; + + ISAR_SPLIT_REND_BITStream_write_int32( pBits, pMultiBinPoseData->dof, ISAR_SPLIT_REND_DOF_BITS ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, pMultiBinPoseData->hq_mode, ISAR_SPLIT_REND_HQ_MODE_BITS ); + rot_axis_code = isar_renderSplitGetCodeFromRot_axis( pMultiBinPoseData->dof, pMultiBinPoseData->rot_axis, &num_bits ); + if ( num_bits > 0 ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, (Word32) rot_axis_code, num_bits ); + } + ISAR_SPLIT_REND_BITStream_write_int32( pBits, (Word32) ro_md_flag, ISAR_SPLIT_REND_RO_FLAG_BITS ); + + /* code ref pose*/ + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + Word16 angle; + IVAS_QUATERNION head_pos_euler, headPosition_q22; + + modify_Quat_q_fx( &headPosition, &headPosition_q22, Q22 ); + Quat2EulerDegree_fx( headPosition_q22, &head_pos_euler.z_fx, &head_pos_euler.y_fx, &head_pos_euler.x_fx ); + angle = (Word16) L_shr_r( head_pos_euler.x_fx, Q22 ); + angle = add( angle, 180 ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, angle, ISAR_SPLIT_REND_HEAD_POSE_BITS ); + + angle = (Word16) L_shr_r( head_pos_euler.y_fx, Q22 ); + angle = add( angle, 180 ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, angle, ISAR_SPLIT_REND_HEAD_POSE_BITS ); + + angle = (Word16) L_shr_r( head_pos_euler.z_fx, Q22 ); + angle = add( angle, 180 ); + + ISAR_SPLIT_REND_BITStream_write_int32( pBits, angle, ISAR_SPLIT_REND_HEAD_POSE_BITS ); + } + + isar_split_rend_get_quant_params_fx( MAX_SPLIT_REND_MD_BANDS, pred_real_bands_yaw, pred_imag_bands_yaw, + pred_quant_pnts_yaw, pred_quantstep_yaw_fx, pred_1byquantstep_yaw_fx, + d_bands_yaw, bands_pitch, pred_real_bands_roll, pred_imag_bands_roll, ro_md_flag, &num_quant_strats ); +#ifdef DEBUG_QUANT_MD_FX + fixedToFloat_arrL( pred_quantstep_yaw_fx, pred_quantstep_yaw, Q31, ISAR_SPLIT_REND_NUM_QUANT_STRATS ); + fixedToFloat_arrL( pred_1byquantstep_yaw_fx, pred_1byquantstep_yaw, Q26, ISAR_SPLIT_REND_NUM_QUANT_STRATS ); +#endif + + quant_strat_bits = ceil_log_2( num_quant_strats ); + + overhead_bits = L_add( L_add( L_sub( pBits->bits_written, overhead_bits ), quant_strat_bits ), 1 ); /* 1 for base2 vs huff */ + + get_base2_bits( hBinHrSplitPreRend, pMultiBinPoseData, num_subframes, num_quant_strats, pred_real_bands_yaw, pred_imag_bands_yaw, + pred_quant_pnts_yaw, + d_bands_yaw, bands_pitch, pred_real_bands_roll, pred_imag_bands_roll, base2bits ); + + FOR( q = 0; q < num_quant_strats; q++ ) + { + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + FOR( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses - 1; pos_idx++ ) + { + IF( hBinHrSplitPreRend->pose_type[pos_idx] == ANY_YAW ) + { + FOR( b = 0; b < pred_imag_bands_yaw[q]; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + isar_split_rend_quant_md_fx( hMd, PRED_ONLY, 0, hBinHrSplitPreRend->fix_pos_rot_mat_fx[pos_idx], pred_1byquantstep_yaw_fx[q], Q_frame +#ifdef DEBUG_QUANT_MD_FX + , + hBinHrSplitPreRend->fix_pos_rot_mat[pos_idx], pred_1byquantstep_yaw[q] +#endif + ); + } + FOR( ; b < pred_real_bands_yaw[q]; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + isar_split_rend_quant_md_fx( hMd, PRED_ONLY, 1, hBinHrSplitPreRend->fix_pos_rot_mat_fx[pos_idx], pred_1byquantstep_yaw_fx[q], Q_frame +#ifdef DEBUG_QUANT_MD_FX + , + hBinHrSplitPreRend->fix_pos_rot_mat[pos_idx], pred_1byquantstep_yaw[q] +#endif + ); + } + + FOR( b = 0; b < d_bands_yaw[q]; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + isar_split_rend_quant_md_fx( hMd, COM_GAIN_ONLY, 1, hBinHrSplitPreRend->fix_pos_rot_mat_fx[pos_idx], 0, Q_frame +#ifdef DEBUG_QUANT_MD_FX + , + hBinHrSplitPreRend->fix_pos_rot_mat[pos_idx], 0.0f +#endif + ); + } + } + ELSE IF( hBinHrSplitPreRend->pose_type[pos_idx] == PITCH_ONLY ) + { + FOR( b = 0; b < bands_pitch[q]; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + isar_split_rend_quant_md_fx( hMd, LR_GAIN_ONLY, 1, hBinHrSplitPreRend->fix_pos_rot_mat_fx[pos_idx], 0, Q_frame +#ifdef DEBUG_QUANT_MD_FX + , + hBinHrSplitPreRend->fix_pos_rot_mat[pos_idx], 0.0f +#endif + ); + } + } + ELSE + { + FOR( b = 0; b < pred_imag_bands_roll[q]; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + isar_split_rend_quant_md_fx( hMd, PRED_ROLL_ONLY, 0, hBinHrSplitPreRend->fix_pos_rot_mat_fx[pos_idx], ISAR_SPLIT_REND_PRED_ROLL_1BYQ_STEP_Q26, Q_frame +#ifdef DEBUG_QUANT_MD_FX + , + hBinHrSplitPreRend->fix_pos_rot_mat[pos_idx], ISAR_SPLIT_REND_PRED_ROLL_1BYQ_STEP +#endif + ); + } + FOR( ; b < pred_real_bands_roll[q]; b++ ) + { + hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + isar_split_rend_quant_md_fx( hMd, PRED_ROLL_ONLY, 1, hBinHrSplitPreRend->fix_pos_rot_mat_fx[pos_idx], ISAR_SPLIT_REND_PRED_ROLL_1BYQ_STEP_Q26, Q_frame +#ifdef DEBUG_QUANT_MD_FX + , + hBinHrSplitPreRend->fix_pos_rot_mat[pos_idx], ISAR_SPLIT_REND_PRED_ROLL_1BYQ_STEP +#endif + ); + } + } + } + } + + /*get base2 bits and check if its within target. if yes then code with base2 to save complexity on post renderer*/ + start_bit = pBits->bits_written; + + ISAR_SPLIT_REND_BITStream_write_int32( pBits, 1, 1 ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, q, quant_strat_bits ); + + huff_bits = pBits->bits_written; + isar_SplitRenderer_code_md_huff( + hBinHrSplitPreRend, + pMultiBinPoseData, + num_subframes, + pred_real_bands_yaw[q], + pred_imag_bands_yaw[q], + pred_quant_pnts_yaw[q], + d_bands_yaw[q], + bands_pitch[q], + pred_real_bands_roll[q], + pred_imag_bands_roll[q], + pBits ); + + huff_bits = L_sub( pBits->bits_written, huff_bits ); + test(); + test(); + test(); + IF( GE_32( target_md_bits, ( base2bits[q] + overhead_bits ) ) || GE_32( target_md_bits, ( huff_bits + overhead_bits ) ) || EQ_16( q, sub( num_quant_strats, 1 ) ) ) + { + IF( GT_32( huff_bits, base2bits[q] ) ) + { + pBits->bits_written = start_bit; + + ISAR_SPLIT_REND_BITStream_write_int32( pBits, 0, 1 ); + ISAR_SPLIT_REND_BITStream_write_int32( pBits, q, quant_strat_bits ); + + isar_SplitRenderer_code_md_base2( hBinHrSplitPreRend, pMultiBinPoseData, num_subframes, pred_real_bands_yaw[q], pred_imag_bands_yaw[q], + pred_quant_pnts_yaw[q], d_bands_yaw[q], bands_pitch[q], pred_real_bands_roll[q], pred_imag_bands_roll[q], pBits ); + } + BREAK; + } + + pBits->bits_written = start_bit; + } + +#ifdef SPLIT_MD_CODING_DEBUG + for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + int16_t val, quant_strat, ch1, ch2; + char filename[200] = "split_md_debug_indices.bin"; + quant_strat = q; + for ( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses - 1; pos_idx++ ) + { + if ( hBinHrSplitPreRend->pose_type[pos_idx] == ANY_YAW ) + { + for ( b = 0; b < pred_real_bands_yaw[quant_strat]; b++ ) + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re_idx[ch1][ch2]; + dbgwrite( &val, sizeof( int16_t ), 1, 1, filename ); + } + } + } + for ( b = 0; b < pred_imag_bands_yaw[quant_strat]; b++ ) + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im_idx[ch1][ch2]; + dbgwrite( &val, sizeof( int16_t ), 1, 1, filename ); + } + } + } + for ( b = 0; b < d_bands_yaw[quant_strat]; b++ ) + { + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd_idx; + dbgwrite( &val, sizeof( int16_t ), 1, 1, filename ); + } + } + else if ( hBinHrSplitPreRend->pose_type[pos_idx] == PITCH_ONLY ) + { + for ( b = 0; b < bands_pitch[quant_strat]; b++ ) + { + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd_idx; + dbgwrite( &val, sizeof( int16_t ), 1, 1, filename ); + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd2_idx; + dbgwrite( &val, sizeof( int16_t ), 1, 1, filename ); + } + } + else + { + for ( b = 0; b < pred_real_bands_roll[quant_strat]; b++ ) + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re_idx[ch1][ch2]; + dbgwrite( &val, sizeof( int16_t ), 1, 1, filename ); + } + } + } + for ( b = 0; b < pred_imag_bands_roll[quant_strat]; b++ ) + { + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + val = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im_idx[ch1][ch2]; + dbgwrite( &val, sizeof( int16_t ), 1, 1, filename ); + } + } + } + } + } + } +#endif + + return; +} + + +/*------------------------------------------------------------------------- + * Function isar_SplitRenderer_GetRotMd() + * + * + *------------------------------------------------------------------------*/ +static void isar_SplitRenderer_GetRotMd_fx( + ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, /* i/o: binaural renderer handle */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ + Word32 *Cldfb_RealBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX], /* o : Reference Binaural signals */ + Word16 exp_cldfb_re, + Word32 *Cldfb_ImagBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX], /* o : Reference Binaural signals */ + Word16 exp_cldfb_im, + const Word16 low_res, + const Word16 ro_md_flag ) +{ + Word32 cov_ii_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] = { 0 }; + Word32 cov_oo_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] = { 0 }; + Word32 cov_io_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] = { 0 }; + Word32 cov_ii_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] = { 0 }; + Word32 cov_oo_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] = { 0 }; + Word32 cov_io_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] = { 0 }; + Word16 exp_cov_io_re = 0, exp_cov_io_im = 0; + Word16 exp_cov_ii_re = 0, exp_cov_ii_im = 0; + Word16 exp_cov_oo_re = 0, exp_cov_oo_im = 0; + + Word16 real_only = 0; + Word16 pos_idx, b, sf_idx, start_slot_idx, num_slots, num_subframes, ch_s_idx1, ch_s_idx2; + Word16 num_md_bands, num_poses; + const Word16 *pBand_grouping = isar_split_rend_band_grouping; + + push_wmops( "isar_SplitRenderer_GetRotMd_fx" ); + + num_md_bands = MAX_SPLIT_REND_MD_BANDS; + move16(); + num_poses = pMultiBinPoseData->num_poses; + move16(); + + IF( low_res ) + { + num_slots = CLDFB_NO_COL_MAX; + move16(); + num_subframes = 1; + move16(); + } + ELSE + { + num_slots = MAX_PARAM_SPATIAL_SUBFRAMES; + move16(); + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + move16(); + } + + /* compute reference signal covariance */ + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + start_slot_idx = imult1616( sf_idx, num_slots ); + FOR( b = 0; b < num_md_bands; b++ ) + { + test(); + IF( LT_16( b, SPLIT_REND_RO_MD_BAND_THRESH ) || ( !ro_md_flag && b < COMPLEX_MD_BAND_THRESH ) ) + { + real_only = 0; + move16(); + } + ELSE + { + real_only = 1; + move16(); + } + + ch_s_idx1 = 0; + + ComputeBandedCov_fx( Cldfb_RealBuffer_Ref_Binaural_fx, exp_cldfb_re, Cldfb_ImagBuffer_Ref_Binaural_fx, exp_cldfb_im, ch_s_idx1, cov_ii_re_fx, &exp_cov_ii_re, cov_ii_im_fx, &exp_cov_ii_im, BINAURAL_CHANNELS, pBand_grouping, num_slots, start_slot_idx, b, real_only ); + + /* compute rotated signal covariance */ + FOR( pos_idx = 0; pos_idx < num_poses - 1; pos_idx++ ) + { + IF( hBinHrSplitPreRend->pose_type[pos_idx] == ANY_ROLL ) + { + IF( GE_16( b, SPLIT_REND_RO_MD_BAND_THRESH ) ) + { + real_only = 1; + } + } + ch_s_idx2 = imult1616( add( pos_idx, 1 ), BINAURAL_CHANNELS ); + + ComputeBandedCrossCov_fx( Cldfb_RealBuffer_Ref_Binaural_fx, exp_cldfb_re, Cldfb_ImagBuffer_Ref_Binaural_fx, exp_cldfb_im, ch_s_idx1, Cldfb_RealBuffer_Ref_Binaural_fx, exp_cldfb_re, Cldfb_ImagBuffer_Ref_Binaural_fx, exp_cldfb_im, ch_s_idx2, cov_io_re_fx, &exp_cov_io_re, cov_io_im_fx, &exp_cov_io_im, BINAURAL_CHANNELS, pBand_grouping, num_slots, start_slot_idx, b, real_only ); + + ComputeBandedCov_fx( Cldfb_RealBuffer_Ref_Binaural_fx, exp_cldfb_re, Cldfb_ImagBuffer_Ref_Binaural_fx, exp_cldfb_im, ch_s_idx2, cov_oo_re_fx, &exp_cov_oo_re, cov_oo_im_fx, &exp_cov_oo_im, BINAURAL_CHANNELS, pBand_grouping, num_slots, start_slot_idx, b, real_only ); + + ComputeCoeffs_fx( cov_ii_re_fx, exp_cov_ii_re, cov_ii_im_fx, exp_cov_ii_im, cov_io_re_fx, exp_cov_io_re, cov_io_im_fx, exp_cov_io_im, cov_oo_re_fx, exp_cov_oo_re, &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b], hBinHrSplitPreRend->pose_type[pos_idx], real_only ); + } + } + } + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * Function isar_rend_CldfbSplitPreRendProcess() + * + * + *------------------------------------------------------------------------*/ + +void isar_rend_CldfbSplitPreRendProcess( + const ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, /* i : binaural pre-renderer handle */ + const IVAS_QUATERNION headPosition, /* i : head rotation QUATERNION */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ + Word32 *Cldfb_In_BinReal_fx[][CLDFB_NO_COL_MAX], /* i : Binaural signals, real part */ + Word16 exp_cldfb_re, + Word32 *Cldfb_In_BinImag_fx[][CLDFB_NO_COL_MAX], + Word16 exp_cldfb_im, + ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits handle */ + const Word32 target_md_bits, /* i : ISAR MD bitrate */ + const Word16 low_res_pre_rend_rot, /* i : low time resolution pre-renderer flag */ + const Word16 ro_md_flag /* i : real only metadata for yaw flag */ +) +{ + push_wmops( "isar_rend_CldfbSplitPreRendProcess" ); + + isar_SplitRenderer_GetRotMd_fx( hBinHrSplitPreRend, pMultiBinPoseData, Cldfb_In_BinReal_fx, exp_cldfb_re, Cldfb_In_BinImag_fx, exp_cldfb_im, low_res_pre_rend_rot, ro_md_flag ); + + Word16 num_md_bands, num_poses; + Word16 pos_idx, b, sf_idx, num_subframes; + + num_md_bands = MAX_SPLIT_REND_MD_BANDS; + num_poses = pMultiBinPoseData->num_poses; + + IF( low_res_pre_rend_rot ) + { + num_subframes = 1; + } + ELSE + { + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + } + + /*FILE *filePointer_gd, *filePointer_gd2; + FILE *filePointer_re, *filePointer_im; + filePointer_gd = fopen("Fixed_code_cov_gd_complete.txt", "a"); + filePointer_gd2 = fopen("Fixed_code_cov_gd2_complete.txt", "a"); + filePointer_re = fopen("Fixed_code_re_complete.txt", "a"); + filePointer_im = fopen("Fixed_code_im_complete.txt", "a");*/ + +#ifdef DUMP_GETROTMD_OUTPUT + for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + for ( b = 0; b < num_md_bands; b++ ) + { + for ( pos_idx = 0; pos_idx < num_poses - 1; pos_idx++ ) + { + if ( hBinHrSplitPreRend->pose_type[pos_idx] == PITCH_ONLY ) + { + hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd = me2f( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd_fx, hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_gd ); + hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd2 = me2f( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd2_fx, hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_gd2 ); + /*fprintf(filePointer_gd, "%f\n", hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd); + fprintf(filePointer_gd2, "%f\n", hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd2);*/ + } + else + { + for ( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + for ( Word16 j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re[i][j] = me2f( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re_fx[i][j], hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_re ); + hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im[i][j] = me2f( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im_fx[i][j], hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_im ); + /*fprintf(filePointer_re, "%f\n", hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re[i][j]); + fprintf(filePointer_im, "%f\n", hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im[i][j]);*/ + } + } + } + } + } + } +#endif + + /*fclose(filePointer_gd); + fclose(filePointer_gd2); + fclose(filePointer_re); + fclose(filePointer_im);*/ + + /* Check if rescaling can be simplified/avoid */ + + Word16 exp_frame = 0; + // Word32 L_temp_max = 0; + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + FOR( b = 0; b < num_md_bands; b++ ) + { + FOR( pos_idx = 0; pos_idx < num_poses - 1; pos_idx++ ) + { + IF( hBinHrSplitPreRend->pose_type[pos_idx] == PITCH_ONLY ) + { + exp_frame = s_max( exp_frame, hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_gd ); + exp_frame = s_max( exp_frame, hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_gd2 ); + } + ELSE + { + exp_frame = s_max( exp_frame, hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_re ); + exp_frame = s_max( exp_frame, hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_re2 ); + exp_frame = s_max( exp_frame, hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_im ); + } + } + } + } + // exp_frame = s_min( exp_frame, sub( 31, norm_l( L_temp_max ) ) ); + exp_frame = s_min( exp_frame, 15 ); // Considering the max value as of prediction matrices as 300 + + Word16 Q_frame = sub( Q31, exp_frame ); + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + FOR( b = 0; b < num_md_bands; b++ ) + { + FOR( pos_idx = 0; pos_idx < num_poses - 1; pos_idx++ ) + { + IF( hBinHrSplitPreRend->pose_type[pos_idx] == PITCH_ONLY ) + { + hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd_fx = L_shr_r( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd_fx, sub( exp_frame, hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_gd ) ); + hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd2_fx = L_shr_r( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd2_fx, sub( exp_frame, hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_gd2 ) ); + /*fprintf(filePointer_gd, "%f\n", hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd); + fprintf(filePointer_gd2, "%f\n", hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd2);*/ + } + ELSE + { + FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + Scale_sig32( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re_fx[i], BINAURAL_CHANNELS, sub( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_re, exp_frame ) ); + Scale_sig32( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im_fx[i], BINAURAL_CHANNELS, sub( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_im, exp_frame ) ); + } + Scale_sig32( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re2, BINAURAL_CHANNELS, sub( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_re2, exp_frame ) ); + } + } + } + } + + isar_SplitRenderer_quant_code( hBinHrSplitPreRend, headPosition, pMultiBinPoseData, pBits, low_res_pre_rend_rot, ro_md_flag, target_md_bits, Q_frame ); +#ifdef DEBUG_QUANT_CODE_OUT + for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + for ( b = 0; b < num_md_bands; b++ ) + { + for ( pos_idx = 0; pos_idx < num_poses - 1; pos_idx++ ) + { + if ( hBinHrSplitPreRend->pose_type[pos_idx] == PITCH_ONLY ) + { + hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd = fixedToFloat( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd_fx, Q_frame ); + hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd2 = fixedToFloat( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd2_fx, Q_frame ); + /*fprintf(filePointer_gd, "%f\n", hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd); + fprintf(filePointer_gd2, "%f\n", hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].gd2);*/ + } + else + { + for ( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + fixedToFloat_arrL( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re_fx[i], hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re[i], Q_frame, BINAURAL_CHANNELS ); + fixedToFloat_arrL( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im_fx[i], hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im[i], Q_frame, BINAURAL_CHANNELS ); + // for ( Word16 j = 0; j < BINAURAL_CHANNELS; j++ ) + //{ + // hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re[i][j] = me2f( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re_fx[i][j], Q6 ); + // hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im[i][j] = me2f( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im_fx[i][j], Q6 ); + // /*fprintf(filePointer_re, "%f\n", hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re[i][j]); + // fprintf(filePointer_im, "%f\n", hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im[i][j]);*/ + // } + } + } + } + } + } +#endif +#ifdef SPLIT_POSE_CORRECTION_DEBUG + float tmpCrendBuffer[2][L_FRAME48k], quant_val, step, minv, maxv; + IVAS_QUATERNION QuaternionsPost[MAX_PARAM_SPATIAL_SUBFRAMES], head_pos_euler; + float Cldfb_RealBuffer_Binaural_5ms[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural_5ms[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + int16_t sf_idx, pos_idx, b, ch1, ch2; + int32_t read_off, write_off; + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + QuaternionsPost[sf_idx].w = -3.0f; + QuaternionsPost[sf_idx].x = 0.0f; + QuaternionsPost[sf_idx].y = 0.0f; + QuaternionsPost[sf_idx].z = 0.0f; + } + + hBinHrSplitPreRend->hBinHrSplitPostRend->low_Res = 1; + set_fix_rotation_mat( hBinHrSplitPreRend->hBinHrSplitPostRend->fix_pos_rot_mat, pMultiBinPoseData ); + set_pose_types( hBinHrSplitPreRend->hBinHrSplitPostRend->pose_type, pMultiBinPoseData ); + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + Quat2EulerDegree( headPosition, &head_pos_euler.z, &head_pos_euler.y, &head_pos_euler.x ); + hBinHrSplitPreRend->hBinHrSplitPostRend->QuaternionsPre[sf_idx].w = -3.0f; + hBinHrSplitPreRend->hBinHrSplitPostRend->QuaternionsPre[sf_idx].x = roundf( head_pos_euler.x ); + hBinHrSplitPreRend->hBinHrSplitPostRend->QuaternionsPre[sf_idx].y = roundf( head_pos_euler.y ); + hBinHrSplitPreRend->hBinHrSplitPostRend->QuaternionsPre[sf_idx].z = roundf( head_pos_euler.z ); + } + for ( sf_idx = 0; sf_idx < 1; sf_idx++ ) + { + for ( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses - 1; pos_idx++ ) + { + for ( b = 0; b < MAX_SPLIT_REND_MD_BANDS; b++ ) + { + hBinHrSplitPreRend->hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b] = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; + BIN_HR_SPLIT_REND_MD_HANDLE hMd; + hMd = &hBinHrSplitPreRend->hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; + minv = -1.4f; + maxv = 1.4f; + step = ( maxv - minv ) / 62.0f; + if ( b >= 20 ) + { + float sign; + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + sign = ( hMd->pred_mat_re[ch1][ch2] >= 0.0f ) ? 1.0f : -1.0f; + IVAS_CALCULATE_ABS( hMd->pred_mat_re[ch1][ch2], hMd->pred_mat_im[ch1][ch2], hMd->pred_mat_re[ch1][ch2] ); + hMd->pred_mat_re[ch1][ch2] *= sign; + hMd->pred_mat_im[ch1][ch2] = 0.0f; + } + } + } + + for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) + { + for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) + { + quant_val = hMd->pred_mat_re[ch1][ch2] - hBinHrSplitPreRend->fix_pos_rot_mat[pos_idx][ch1][ch2]; + quant_val = min( maxv, max( quant_val, minv ) ); + quant_val = (int16_t) roundf( quant_val / step ); + hMd->pred_mat_re[ch1][ch2] = quant_val * step; + hMd->pred_mat_re[ch1][ch2] += hBinHrSplitPreRend->fix_pos_rot_mat[pos_idx][ch1][ch2]; + + quant_val = hMd->pred_mat_im[ch1][ch2]; + quant_val = min( maxv, max( quant_val, minv ) ); + quant_val = (int16_t) roundf( quant_val / step ); + hMd->pred_mat_im[ch1][ch2] = quant_val * step; + } + } + } + } + } + + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + mvr2r( (float *) Cldfb_In_BinReal[0][sf_idx * MAX_PARAM_SPATIAL_SUBFRAMES], (float *) Cldfb_RealBuffer_Binaural_5ms[0], MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); + mvr2r( (float *) Cldfb_In_BinReal[1][sf_idx * MAX_PARAM_SPATIAL_SUBFRAMES], (float *) Cldfb_RealBuffer_Binaural_5ms[1], MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); + mvr2r( (float *) Cldfb_In_BinImag[0][sf_idx * MAX_PARAM_SPATIAL_SUBFRAMES], (float *) Cldfb_ImagBuffer_Binaural_5ms[0], MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); + mvr2r( (float *) Cldfb_In_BinImag[1][sf_idx * MAX_PARAM_SPATIAL_SUBFRAMES], (float *) Cldfb_ImagBuffer_Binaural_5ms[1], MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); + isar_rend_CldfbSplitPostRendProcess( hBinHrSplitPreRend->hBinHrSplitPostRend, pMultiBinPoseData, QuaternionsPost[0], Cldfb_RealBuffer_Binaural_5ms, Cldfb_ImagBuffer_Binaural_5ms, tmpCrendBuffer, 1 ); + + { + float *pOut[2]; + char fname[200] = "ref_act_pos.wav"; + pOut[0] = tmpCrendBuffer[0]; + pOut[1] = tmpCrendBuffer[1]; + dbgwrite_wav( pOut, CLDFB_NO_COL_MAX * hBinHrSplitPreRend->hBinHrSplitPostRend->cldfbSyn[0]->no_channels, fname, 48000, 2 ); + } + } +#endif + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * Function isar_splitBinPreRendOpen() + * + * + *------------------------------------------------------------------------*/ + +ivas_error isar_splitBinPreRendOpen( + ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE *hBinHrSplitPreRend, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + , + const int32_t output_Fs +#endif +) +{ + ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinRend; +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + ivas_error error; + int16_t ch; +#endif + Word16 pos_idx, sf_idx, bandIdx; + + IF( ( hBinRend = (ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE) malloc( sizeof( ISAR_BIN_HR_SPLIT_PRE_REND ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for bin split pre renderer Module \n" ) ); + } + +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + for ( int16_t i = 0; i < MAX_HEAD_ROT_POSES + 1; i++ ) + { + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + hBinRend->cldfbSynRotBinDec[i][ch] = NULL; + } + } + + for ( int16_t i = 0; i < MAX_HEAD_ROT_POSES + 1; i++ ) + { + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + if ( ( error = openCldfb_ivas_fx( &( hBinRend->cldfbSynRotBinDec[i][ch] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } +#endif + + FOR( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses - 1; pos_idx++ ) + { + FOR( sf_idx = 0; sf_idx < MAX_SPLIT_MD_SUBFRAMES; sf_idx++ ) + { + FOR( bandIdx = 0; bandIdx < MAX_SPLIT_REND_MD_BANDS; bandIdx++ ) + { + hBinRend->rot_md[pos_idx][sf_idx][bandIdx].gd_fx = 0; + } + } + } + set_fix_rotation_mat_fx( hBinRend->fix_pos_rot_mat_fx, pMultiBinPoseData ); + set_pose_types_fx( hBinRend->pose_type, pMultiBinPoseData ); + + isar_split_rend_init_huff_cfg( &hBinRend->huff_cfg ); + +#ifdef SPLIT_POSE_CORRECTION_DEBUG + ivas_error error; + if ( ( error = isar_splitBinPostRendOpen( &hBinRend->hBinHrSplitPostRend, pMultiBinPoseData, 48000 ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + + *hBinHrSplitPreRend = hBinRend; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * Function isar_splitBinPreRendClose() + * + * + *------------------------------------------------------------------------*/ + +void isar_splitBinPreRendClose( + ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE *hBinHrSplitPreRend ) +{ + IF( ( *hBinHrSplitPreRend ) != NULL ) + { +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + { + Word16 i, n; + FOR( i = 0; i < MAX_HEAD_ROT_POSES + 1; i++ ) + { + FOR( n = 0; n < BINAURAL_CHANNELS; n++ ) + { + IF( ( *hBinHrSplitPreRend )->cldfbSynRotBinDec[i][n] != NULL ) + { + deleteCldfb_fx( &( ( *hBinHrSplitPreRend )->cldfbSynRotBinDec[i][n] ) ); + ( *hBinHrSplitPreRend )->cldfbSynRotBinDec[i][n] = NULL; + } + } + } + } +#endif +#ifdef SPLIT_POSE_CORRECTION_DEBUG + isar_splitBinPostRendClose( &( *hBinHrSplitPreRend )->hBinHrSplitPostRend ); +#endif + + free( ( *hBinHrSplitPreRend ) ); + ( *hBinHrSplitPreRend ) = NULL; + } + + return; +} + + +/*-------------------------------------------------------------------------* + * isar_set_split_rend_ht_setup() + * + * + *-------------------------------------------------------------------------*/ + +void isar_set_split_rend_ht_setup_fx( + SPLIT_REND_WRAPPER *hSplitrend, + IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES], + Word32 Rmat_fx[MAX_PARAM_SPATIAL_SUBFRAMES][3][3] ) +{ + Word16 sf, i, j; + + IF( hSplitrend->multiBinPoseData.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) + { + FOR( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + Quaternions[sf] = Quaternions[0]; + + FOR( i = 0; i < 3; i++ ) + { + FOR( j = 0; j < 3; j++ ) + { + Rmat_fx[sf][i][j] = Rmat_fx[0][i][j]; + move32(); + } + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * Function isar_init_split_rend_handles() + * + * + *------------------------------------------------------------------------*/ + +void isar_init_split_rend_handles( + SPLIT_REND_WRAPPER *hSplitRendWrapper ) +{ + Word16 i; + + hSplitRendWrapper->hBinHrSplitPreRend = NULL; + hSplitRendWrapper->hCldfbHandles = NULL; + hSplitRendWrapper->hSplitBinLCLDEnc = NULL; + hSplitRendWrapper->hLc3plusEnc = NULL; + + FOR( i = 0; i < MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; ++i ) + { + hSplitRendWrapper->lc3plusDelayBuffers_fx[i] = NULL; + } + hSplitRendWrapper->lc3plusDelaySamples = 0; + move32(); + + isar_init_multi_bin_pose_data_fx_enc( &hSplitRendWrapper->multiBinPoseData ); + + return; +} + + +/*------------------------------------------------------------------------- + * Function split_renderer_open_lc3plus() + * + * + *------------------------------------------------------------------------*/ + +ivas_error split_renderer_open_lc3plus( + SPLIT_REND_WRAPPER *hSplitRendWrapper, + const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, + const Word32 OutSampleRate, + const IVAS_RENDER_FRAMESIZE isar_frame_size ) +{ + ivas_error error; + Word16 i, delayBufferLength; + LC3PLUS_CONFIG config; + Word16 isar_frame_size_ms; + + IF( ( error = isar_framesize_to_ms( isar_frame_size, &isar_frame_size_ms ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Check configuration validity */ + IF( isar_frame_size_ms < pSplitRendConfig->codec_frame_size_ms ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "SR codec frame doesn't fit in one output frame" ); + } + + config.lc3plus_frame_duration_us = pSplitRendConfig->codec_frame_size_ms * 1000; + config.samplerate = OutSampleRate; + config.isar_frame_duration_us = isar_frame_size_ms * 1000; + config.high_res_mode_enabled = ( pSplitRendConfig->lc3plus_highres != 0 ); + config.channels = BINAURAL_CHANNELS; + + if ( ( error = ISAR_LC3PLUS_ENC_Open( config, + isar_get_lc3plus_bitrate( pSplitRendConfig->splitRendBitRate, pSplitRendConfig->poseCorrectionMode, config.channels, config.lc3plus_frame_duration_us ), + &hSplitRendWrapper->hLc3plusEnc ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* This returns delay of entire LC3plus chain (enc + dec) */ + IF( ( error = ISAR_LC3PLUS_ENC_GetDelay( hSplitRendWrapper->hLc3plusEnc, &hSplitRendWrapper->lc3plusDelaySamples ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Alocate buffers for delay compensation */ + IF( pSplitRendConfig->codec == ISAR_SPLIT_REND_CODEC_LC3PLUS ) + { + delayBufferLength = (Word16) ( OutSampleRate / (Word32) FRAMES_PER_SEC + hSplitRendWrapper->lc3plusDelaySamples ); + FOR( i = 0; i < hSplitRendWrapper->multiBinPoseData.num_poses * BINAURAL_CHANNELS; ++i ) + { + IF( ( hSplitRendWrapper->lc3plusDelayBuffers_fx[i] = malloc( delayBufferLength * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for multiBinPoseData handle\n" ) ); + } + + set32_fx( hSplitRendWrapper->lc3plusDelayBuffers_fx[i], 0, delayBufferLength ); + } + hSplitRendWrapper->lc3plusDelayBuffers_q = 31; + } + ELSE + { + /* Delay is always expected to be exactly 2 CLDFB columns */ + assert( hSplitRendWrapper->lc3plusDelaySamples % ( OutSampleRate / FRAMES_PER_SEC / CLDFB_NO_COL_MAX ) == 0 ); + assert( hSplitRendWrapper->lc3plusDelaySamples / ( OutSampleRate / FRAMES_PER_SEC / CLDFB_NO_COL_MAX ) == 2 ); + + delayBufferLength = 2 /* Columns */ * 2 /* real and imag */ * CLDFB_NO_CHANNELS_MAX; + FOR( i = 0; i < hSplitRendWrapper->multiBinPoseData.num_poses * BINAURAL_CHANNELS; ++i ) + { + IF( ( hSplitRendWrapper->lc3plusDelayBuffers_fx[i] = malloc( delayBufferLength * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for multiBinPoseData handle\n" ) ); + } + + set32_fx( hSplitRendWrapper->lc3plusDelayBuffers_fx[i], 0, delayBufferLength ); + } + hSplitRendWrapper->lc3plusDelayBuffers_q = 31; + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * Function splitRendLc3plusEncodeAndWrite() + * + * + *------------------------------------------------------------------------*/ + +ivas_error splitRendLc3plusEncodeAndWrite( + SPLIT_REND_WRAPPER *hSplitBin, + ISAR_SPLIT_REND_BITS_HANDLE pBits, + const Word32 available_bits, + Word32 *in[], + Word16 Q_sig ) +{ + ivas_error error; + Word16 i; + Word32 lc3plusBitstreamSize; + Word32 *channel_ptrs[MAX_HEAD_ROT_POSES * 2]; + Word16 Q_in[16]; + assert( hSplitBin->hLc3plusEnc != NULL ); + + /* Find next byte boundary and zero-pad to it */ + while ( pBits->bits_written % 8 != 0 ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, 0L, 1 ); + } + + for ( i = 0; i < BINAURAL_CHANNELS * hSplitBin->multiBinPoseData.num_poses; ++i ) + { + channel_ptrs[i] = in[i]; + } + + IF( ( error = IVAS_LC3PLUS_ENC_SetBitrate( hSplitBin->hLc3plusEnc, available_bits * FRAMES_PER_SEC ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF( ( error = ISAR_LC3PLUS_ENC_GetOutputBitstreamSize( hSplitBin->hLc3plusEnc, &lc3plusBitstreamSize ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Write bitstream */ + set16_fx( Q_in, Q_sig, 16 ); + move16(); + IF( ( error = ISAR_LC3PLUS_ENC_Encode( hSplitBin->hLc3plusEnc, channel_ptrs, &pBits->bits_buf[pBits->bits_written / 8], lc3plusBitstreamSize, Q_in ) ) != IVAS_ERR_OK ) + { + return error; + } + + pBits->bits_written += 8 * lc3plusBitstreamSize; + pBits->codec = ISAR_SPLIT_REND_CODEC_LC3PLUS; + pBits->pose_correction = hSplitBin->multiBinPoseData.poseCorrectionMode; + pBits->codec_frame_size_ms = (Word16) ( hSplitBin->hLc3plusEnc->config.lc3plus_frame_duration_us / 1000 ); + pBits->isar_frame_size_ms = (Word16) ( hSplitBin->hLc3plusEnc->config.isar_frame_duration_us / 1000 ); + pBits->lc3plus_highres = hSplitBin->hLc3plusEnc->config.high_res_mode_enabled; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * Function isar_renderMultiTDBinToSplitBinaural() + * + * + *------------------------------------------------------------------------*/ + +ivas_error isar_renderMultiTDBinToSplitBinaural( + SPLIT_REND_WRAPPER *hSplitBin, + const IVAS_QUATERNION headPosition, + const Word32 SplitRendBitRate, + const Word16 isar_frame_size_ms, + const Word16 codec_frame_size_ms, + ISAR_SPLIT_REND_BITS_HANDLE pBits, + const Word16 max_bands, + // float *in[], + Word32 *in_fx[], // Q11 + Word16 Q_sig, + const Word16 low_res_pre_rend_rot, + const Word16 pcm_out_flag, + const Word16 ro_md_flag ) +{ + ivas_error error; + Word32 bit_len, available_bits, target_md_bits, tmp_32; + Word16 num_cldfb_bands, ch, slot_idx, pos_idx, num_poses; + Word16 tmp, tmp_e; + Word32 Cldfb_In_BinReal_fx[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] = { 0 }; + Word32 Cldfb_In_BinImag_fx[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] = { 0 }; + Word16 Q_in = Q_sig, q_final = 0; + move16(); + move16(); + UWord8 useLc3plus; + Word32 *in_delayed_fx[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; + Word16 i; + Word16 j; + Word32 *p_Cldfb_In_BinReal[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; + Word32 *p_Cldfb_In_BinImag[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; + Word32 num_slots; + + push_wmops( "isar_renderMultiTDBinToSplitBinaural" ); + + error = IVAS_ERR_OK; + num_poses = hSplitBin->multiBinPoseData.num_poses; + + useLc3plus = hSplitBin->hLc3plusEnc != NULL; + + FOR( i = 0; i < MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; ++i ) + { + FOR( j = 0; j < CLDFB_NO_COL_MAX; ++j ) + { + p_Cldfb_In_BinReal[i][j] = Cldfb_In_BinReal_fx[i][j]; + p_Cldfb_In_BinImag[i][j] = Cldfb_In_BinImag_fx[i][j]; + } + } + + IF( useLc3plus ) + { + /*this should always have the time resolution of pose correction MD. Note that this does not change frame size of LC3plus*/ + // Word16 frame_size = (Word16) ( hSplitBin->hLc3plusEnc->config.samplerate / (Word32) FRAMES_PER_SECOND ); + tmp_e = 0; + tmp = BASOP_Util_Divide3232_Scale( hSplitBin->hLc3plusEnc->config.samplerate, FRAMES_PER_SEC, &tmp_e ); + Word16 frame_size = shr( tmp, sub( 15, tmp_e ) ); // Q0 + FOR( i = 0; i < num_poses * BINAURAL_CHANNELS; ++i ) + { + /* Artificially delay input to head pose correction analysis by LC3plus coding delay, so that audio and metadata are in sync after decoding */ + mvl2l( hSplitBin->lc3plusDelayBuffers_fx[i] + frame_size, hSplitBin->lc3plusDelayBuffers_fx[i], (Word16) hSplitBin->lc3plusDelaySamples ); + in_delayed_fx[i] = hSplitBin->lc3plusDelayBuffers_fx[i]; + Scale_sig32( hSplitBin->lc3plusDelayBuffers_fx[i], (Word16) hSplitBin->lc3plusDelaySamples, sub( Q_in, hSplitBin->lc3plusDelayBuffers_q ) ); + mvl2l( in_fx[i], hSplitBin->lc3plusDelayBuffers_fx[i] + hSplitBin->lc3plusDelaySamples, frame_size ); + } + hSplitBin->lc3plusDelayBuffers_q = Q_in; + } + ELSE + { + FOR( i = 0; i < num_poses * BINAURAL_CHANNELS; ++i ) + { + in_delayed_fx[i] = in_fx[i]; + move32(); + } + } + + test(); + test(); + IF( ( hSplitBin->multiBinPoseData.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) || ( !useLc3plus && !pcm_out_flag ) ) + { + Word32 in_delayed_cldfb[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][L_FRAME48k] = { 0 }; + Word16 gd_bits = sub( Q_sig, Q11 ); + FOR( i = 0; i < num_poses * BINAURAL_CHANNELS; i++ ) + { + Copy32( in_delayed_fx[i], in_delayed_cldfb[i], L_FRAME48k ); + Scale_sig32( in_delayed_cldfb[i], L_FRAME48k, -gd_bits ); + } + Q_sig = sub( Q_sig, gd_bits ); + num_slots = ( hSplitBin->multiBinPoseData.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) ? CLDFB_NO_COL_MAX : ( hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ); + move32(); + num_cldfb_bands = hSplitBin->hCldfbHandles->cldfbAna[0]->no_channels; + move16(); + /* CLDFB Analysis*/ + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) + { +#ifdef SPLIT_POSE_CORRECTION_DEBUG + { + float *pOut[2]; + char fname[200] = "ref_out_pos"; + char tag[2]; + tag[0] = (char) ( '0' + pos_idx ); + tag[1] = '\0'; + strcat( fname, tag ); + strcat( fname, ".wav" ); + + pOut[0] = in_delayed[2 * pos_idx]; + pOut[1] = in_delayed[2 * pos_idx + 1]; + dbgwrite_wav( pOut, CLDFB_NO_COL_MAX * max_bands, fname, 48000, 2 ); + } + +#endif + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + HANDLE_CLDFB_FILTER_BANK temp_cldfbAna = hSplitBin->hCldfbHandles->cldfbAna[pos_idx * BINAURAL_CHANNELS + ch]; + Scale_sig32( temp_cldfbAna->cldfb_state_fx, + sub( temp_cldfbAna->p_filter_length, temp_cldfbAna->no_channels ), sub( Q_sig, temp_cldfbAna->Q_cldfb_state ) ); + temp_cldfbAna->Q_cldfb_state = Q_sig; + move16(); + FOR( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) + { + Word16 Q_cldfb = Q_sig; + // floatToFixed_arrL(hSplitBin->hCldfbHandles->cldfbAna[pos_idx * BINAURAL_CHANNELS + ch]->cldfb_state, hSplitBin->hCldfbHandles->cldfbAna[pos_idx * BINAURAL_CHANNELS + ch]->cldfb_state_fx, Q_output, hSplitBin->hCldfbHandles->cldfbAna[pos_idx * BINAURAL_CHANNELS + ch]->p_filter_length - hSplitBin->hCldfbHandles->cldfbAna[pos_idx * BINAURAL_CHANNELS + ch]->no_channels); + cldfbAnalysis_ts_fx_fixed_q( &( in_delayed_cldfb[pos_idx * BINAURAL_CHANNELS + ch][num_cldfb_bands * slot_idx] ), + Cldfb_In_BinReal_fx[pos_idx * BINAURAL_CHANNELS + ch][slot_idx], + Cldfb_In_BinImag_fx[pos_idx * BINAURAL_CHANNELS + ch][slot_idx], + max_bands, + temp_cldfbAna, + &Q_cldfb ); + /*fixedToFloat_arrL(hSplitBin->hCldfbHandles->cldfbAna[pos_idx * BINAURAL_CHANNELS + ch]->cldfb_state_fx, hSplitBin->hCldfbHandles->cldfbAna[pos_idx * BINAURAL_CHANNELS + ch]->cldfb_state, Q_output, hSplitBin->hCldfbHandles->cldfbAna[pos_idx * BINAURAL_CHANNELS + ch]->p_filter_length - hSplitBin->hCldfbHandles->cldfbAna[pos_idx * BINAURAL_CHANNELS + ch]->no_channels); + fixedToFloat_arrL(Cldfb_In_BinReal_fx[pos_idx * BINAURAL_CHANNELS + ch][slot_idx], Cldfb_In_BinReal[pos_idx * BINAURAL_CHANNELS + ch][slot_idx], Q_cldfb, max_bands); + fixedToFloat_arrL(Cldfb_In_BinImag_fx[pos_idx * BINAURAL_CHANNELS + ch][slot_idx], Cldfb_In_BinImag[pos_idx * BINAURAL_CHANNELS + ch][slot_idx], Q_cldfb, max_bands);*/ + /*for (int k = 0; k < max_bands; k++) { + printf("\n%f %f ", Cldfb_In_BinReal[pos_idx * BINAURAL_CHANNELS + ch][slot_idx][k], Cldfb_In_BinImag[pos_idx * BINAURAL_CHANNELS + ch][slot_idx][k]); + }*/ + } + } + } + q_final = sub( Q_sig, 5 ); + } + + IF( hSplitBin->multiBinPoseData.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) + { + // target_md_bits = isar_get_split_rend_md_target_brate( SplitRendBitRate, pcm_out_flag ) * L_FRAME48k / 48000; + target_md_bits = W_extract_l( W_mult0_32_32( isar_get_split_rend_md_target_brate( SplitRendBitRate, pcm_out_flag ), L_FRAME48k ) ); + tmp_e = 0; + tmp_32 = BASOP_Util_Divide3232_Scale_newton( target_md_bits, 48000, &tmp_e ); + target_md_bits = L_shr( tmp_32, sub( 31, tmp_e ) ); // Q0 + + /*scaling to max Q*/ + Word16 scale_factor = 31; + move32(); + FOR( i = 0; i < num_poses * BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < CLDFB_NO_COL_MAX; j++ ) + { + scale_factor = s_min( scale_factor, s_min( getScaleFactor32( Cldfb_In_BinReal_fx[i][j], CLDFB_NO_CHANNELS_MAX ), getScaleFactor32( Cldfb_In_BinImag_fx[i][j], CLDFB_NO_CHANNELS_MAX ) ) ); + } + } + scale_factor = sub( scale_factor, 2 ); + FOR( i = 0; i < num_poses * BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < CLDFB_NO_COL_MAX; j++ ) + { + Scale_sig32( Cldfb_In_BinReal_fx[i][j], CLDFB_NO_CHANNELS_MAX, scale_factor ); + Scale_sig32( Cldfb_In_BinImag_fx[i][j], CLDFB_NO_CHANNELS_MAX, scale_factor ); + } + } + q_final = add( q_final, scale_factor ); + Word16 exp_cldfb_re = sub( 31, q_final ); + Word16 exp_cldfb_im = sub( 31, q_final ); + isar_rend_CldfbSplitPreRendProcess( + hSplitBin->hBinHrSplitPreRend, + headPosition, + &hSplitBin->multiBinPoseData, + p_Cldfb_In_BinReal, + exp_cldfb_re, + p_Cldfb_In_BinImag, + exp_cldfb_im, + pBits, + target_md_bits, + low_res_pre_rend_rot, + ro_md_flag ); + } + + IF( EQ_16( pcm_out_flag, 0 ) ) + { + pBits->pose_correction = hSplitBin->multiBinPoseData.poseCorrectionMode; + pBits->codec = useLc3plus ? ISAR_SPLIT_REND_CODEC_LC3PLUS : ISAR_SPLIT_REND_CODEC_LCLD; + + IF( !useLc3plus ) + { + // available_bits = ( SplitRendBitRate * hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ) / ( 16 * FRAMES_PER_SEC ); + available_bits = W_extract_l( W_mult0_32_32( SplitRendBitRate, L_mult0( hSplitBin->hSplitBinLCLDEnc->iNumBlocks, hSplitBin->hSplitBinLCLDEnc->iNumIterations ) ) ); + tmp_e = 0; + tmp_32 = BASOP_Util_Divide3232_Scale_newton( available_bits, L_mult0( 16, FRAMES_PER_SEC ), &tmp_e ); + available_bits = L_shr( tmp_32, sub( 31, tmp_e ) ); // Q0 + available_bits = L_sub( available_bits, pBits->bits_written ); + pBits->codec_frame_size_ms = codec_frame_size_ms; + move16(); + pBits->isar_frame_size_ms = isar_frame_size_ms; + move16(); + isar_splitBinLCLDEncProcess( + hSplitBin->hSplitBinLCLDEnc, + p_Cldfb_In_BinReal, + p_Cldfb_In_BinImag, + available_bits, + pBits, + &q_final ); + } + ELSE + { + IF( EQ_32( pBits->pose_correction, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ) + { + available_bits = isar_get_lc3plus_bitrate( SplitRendBitRate, hSplitBin->multiBinPoseData.poseCorrectionMode, hSplitBin->hLc3plusEnc->config.channels, hSplitBin->hLc3plusEnc->config.lc3plus_frame_duration_us ); + available_bits = Mpy_32_32( available_bits, ONE_BY_FRAMES_PER_SEC_Q31 ); + } + ELSE + { + available_bits = L_sub( Mpy_32_32( SplitRendBitRate, ONE_BY_FRAMES_PER_SEC_Q31 ), pBits->bits_written ); + } + IF( ( error = splitRendLc3plusEncodeAndWrite( hSplitBin, pBits, available_bits, in_fx, Q_in ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + ELSE + { + pBits->pose_correction = hSplitBin->multiBinPoseData.poseCorrectionMode; + pBits->codec = ISAR_SPLIT_REND_CODEC_NONE; + } + + /*zero pad*/ + IF( pcm_out_flag ) + { + tmp_e = 0; + tmp = BASOP_Util_Divide3232_Scale( SplitRendBitRate, FRAMES_PER_SEC, &tmp_e ); + bit_len = L_deposit_l( shr( tmp, sub( 15, tmp_e ) ) ); // Q0 + // bit_len = SplitRendBitRate / FRAMES_PER_SEC; + } + ELSE + { + IF( !useLc3plus ) + { + // bit_len = ( SplitRendBitRate * hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ) / ( 16 * FRAMES_PER_SEC ); + + bit_len = W_extract_l( W_mult0_32_32( SplitRendBitRate, L_mult0( hSplitBin->hSplitBinLCLDEnc->iNumBlocks, hSplitBin->hSplitBinLCLDEnc->iNumIterations ) ) ); + tmp_e = 0; + tmp_32 = BASOP_Util_Divide3232_Scale_newton( bit_len, L_mult0( 16, FRAMES_PER_SEC ), &tmp_e ); + bit_len = L_shr( tmp_32, sub( 31, tmp_e ) ); // Q0 + } + ELSE + { + tmp_e = 0; + tmp = BASOP_Util_Divide3232_Scale( (Word32) hSplitBin->hLc3plusEnc->config.isar_frame_duration_us, 1000, &tmp_e ); + bit_len = L_deposit_l( shr( tmp, sub( 15, tmp_e ) ) ); // Q0 + // bit_len = hSplitBin->hLc3plusEnc->config.ivas_frame_duration_us / 1000; + // bit_len = SplitRendBitRate * bit_len / 1000; + tmp_e = 0; + tmp_32 = BASOP_Util_Divide3232_Scale_newton( W_extract_l( W_mult0_32_32( SplitRendBitRate, bit_len ) ), 1000, &tmp_e ); + bit_len = L_shr( tmp_32, sub( 31, tmp_e ) ); // Q0 + } + } + + + WHILE( LT_32( pBits->bits_written, bit_len ) ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, 0L, 1 ); + } + + pop_wmops(); + + return error; +} + + +/*------------------------------------------------------------------------- + * Function lc3plusTimeAlignCldfbPoseCorr() + * + * + *------------------------------------------------------------------------*/ + +void lc3plusTimeAlignCldfbPoseCorr( + SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renderer handle */ + Word32 *Cldfb_In_BinReal_fx[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, real part */ + Word32 *Cldfb_In_BinImag_fx[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, imag. part */ + Word16 *Q_in ) +{ + Word32 Cldfb_In_BinReal_tmp_fx[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][2][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_In_BinImag_tmp_fx[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][2][CLDFB_NO_CHANNELS_MAX]; + Word16 pose, ch, slot_idx; + Word32 *bufRead_fx, *bufWrite_fx; + + IF( GT_16( hSplitBin->lc3plusDelayBuffers_q, *Q_in ) ) + { + // hSplitBin->lc3plusDelayBuffers_q[0] = *Q_in; + FOR( Word16 i = 0; i < hSplitBin->multiBinPoseData.num_poses * BINAURAL_CHANNELS; i++ ) + { + + Scale_sig32( hSplitBin->lc3plusDelayBuffers_fx[i], 4 * CLDFB_NO_CHANNELS_MAX, sub( *Q_in, hSplitBin->lc3plusDelayBuffers_q ) ); + } + hSplitBin->lc3plusDelayBuffers_q = *Q_in; + } + ELSE + { + FOR( Word16 i = 0; i < i_mult( hSplitBin->multiBinPoseData.num_poses, BINAURAL_CHANNELS ); i++ ) + + { + for ( Word16 j = 0; j < CLDFB_NO_COL_MAX; j++ ) + { + Scale_sig32( Cldfb_In_BinReal_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( hSplitBin->lc3plusDelayBuffers_q, *Q_in ) ); + Scale_sig32( Cldfb_In_BinImag_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( hSplitBin->lc3plusDelayBuffers_q, *Q_in ) ); + } + } + *Q_in = hSplitBin->lc3plusDelayBuffers_q; + } + + FOR( pose = 0; pose < hSplitBin->multiBinPoseData.num_poses; ++pose ) + { + FOR( ch = 0; ch < BINAURAL_CHANNELS; ++ch ) + { + bufRead_fx = hSplitBin->lc3plusDelayBuffers_fx[pose * BINAURAL_CHANNELS + ch]; + bufWrite_fx = bufRead_fx; + + /* Save last 2 columns for next frame */ + FOR( slot_idx = 0; slot_idx < 2; ++slot_idx ) + { + Copy32( Cldfb_In_BinReal_fx[pose * BINAURAL_CHANNELS + ch][CLDFB_NO_COL_MAX - 2 + slot_idx], Cldfb_In_BinReal_tmp_fx[pose][ch][slot_idx], CLDFB_NO_CHANNELS_MAX ); + Copy32( Cldfb_In_BinImag_fx[pose * BINAURAL_CHANNELS + ch][CLDFB_NO_COL_MAX - 2 + slot_idx], Cldfb_In_BinImag_tmp_fx[pose][ch][slot_idx], CLDFB_NO_CHANNELS_MAX ); + } + + /* Delay existing columns by 2 slots */ + /*TODO : shouldnt the delay be 7.5 ms ? 5ms + LC3plus delay */ + FOR( slot_idx = CLDFB_NO_COL_MAX - 2 - 1; slot_idx >= 0; --slot_idx ) + { + Copy32( Cldfb_In_BinReal_fx[pose * BINAURAL_CHANNELS + ch][slot_idx], Cldfb_In_BinReal_fx[pose * BINAURAL_CHANNELS + ch][slot_idx + 2], CLDFB_NO_CHANNELS_MAX ); + Copy32( Cldfb_In_BinImag_fx[pose * BINAURAL_CHANNELS + ch][slot_idx], Cldfb_In_BinImag_fx[pose * BINAURAL_CHANNELS + ch][slot_idx + 2], CLDFB_NO_CHANNELS_MAX ); + } + + /* Fill 2 first columns from buffer */ + FOR( slot_idx = 0; slot_idx < 2; ++slot_idx ) + { + Copy32( bufRead_fx, Cldfb_In_BinReal_fx[pose * BINAURAL_CHANNELS + ch][slot_idx], CLDFB_NO_CHANNELS_MAX ); + bufRead_fx += CLDFB_NO_CHANNELS_MAX; + Copy32( bufRead_fx, Cldfb_In_BinImag_fx[pose * BINAURAL_CHANNELS + ch][slot_idx], CLDFB_NO_CHANNELS_MAX ); + bufRead_fx += CLDFB_NO_CHANNELS_MAX; + } + + /* Copy last 2 columns to buffer */ + FOR( slot_idx = 0; slot_idx < 2; ++slot_idx ) + { + Copy32( Cldfb_In_BinReal_tmp_fx[pose][ch][slot_idx], bufWrite_fx, CLDFB_NO_CHANNELS_MAX ); + bufWrite_fx += CLDFB_NO_CHANNELS_MAX; + Copy32( Cldfb_In_BinImag_tmp_fx[pose][ch][slot_idx], bufWrite_fx, CLDFB_NO_CHANNELS_MAX ); + bufWrite_fx += CLDFB_NO_CHANNELS_MAX; + } + } + } + + return; +} diff --git a/lib_isar/isar_splitRenderer_utils.c b/lib_isar/isar_splitRenderer_utils.c new file mode 100644 index 0000000000000000000000000000000000000000..6f72ce6516262d58689f0dcccb78e689db370068 --- /dev/null +++ b/lib_isar/isar_splitRenderer_utils.c @@ -0,0 +1,1372 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "ivas_prot_fx.h" +#include "prot_fx.h" +#include "cnst.h" +#include "isar_cnst.h" +#include "ivas_rom_rend.h" +#include "ivas_rom_com.h" +#include "isar_rom_post_rend.h" +#include "ivas_rom_binauralRenderer.h" +#include "lib_isar_post_rend.h" +#include "isar_prot.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" +#include "basop_settings.h" +#include "prot_fx.h" + +#include "basop_util.h" + + +/*------------------------------------------------------------------------- + * Function ivas_cmult_fix() + * + * + *------------------------------------------------------------------------*/ + +void ivas_cmult_fix( + Word32 in1_re_fx, + Word16 exp_re1, + Word32 in1_im_fx, + Word16 exp_im1, + Word32 in2_re_fx, + Word16 exp_re2, + Word32 in2_im_fx, + Word16 exp_im2, + Word32 *out1_re_fx, + Word32 *out1_im_fx, + Word16 *exp_out1_re, + Word16 *exp_out1_im ) +{ + Word16 shift_1 = W_norm( W_mult_32_32( in1_re_fx, in2_re_fx ) ); + Word16 shift_2 = W_norm( W_mult_32_32( in1_im_fx, in2_im_fx ) ); + Word32 tmp1 = W_extract_h( W_shl( W_mult_32_32( in1_re_fx, in2_re_fx ), shift_1 ) ); + Word32 tmp2 = W_extract_h( W_shl( W_mult_32_32( in1_im_fx, in2_im_fx ), shift_2 ) ); + Word16 exp_tmp1 = 0; + move16(); + *out1_re_fx = BASOP_Util_Add_Mant32Exp( tmp1, exp_re1 + exp_re2 - shift_1, L_negate( tmp2 ), exp_im1 + exp_im2 - shift_2, &exp_tmp1 ); + *exp_out1_re = exp_tmp1; + Word16 shift_3 = W_norm( W_mult_32_32( in1_re_fx, in2_im_fx ) ); + Word16 shift_4 = W_norm( W_mult_32_32( in2_re_fx, in1_im_fx ) ); + Word32 tmp3 = W_extract_h( W_shl( W_mult_32_32( in1_re_fx, in2_im_fx ), shift_3 ) ); + Word32 tmp4 = W_extract_h( W_shl( W_mult_32_32( in2_re_fx, in1_im_fx ), shift_4 ) ); + Word16 exp_tmp2 = 0; + move16(); + *out1_im_fx = BASOP_Util_Add_Mant32Exp( tmp3, exp_re1 + exp_im2 - shift_3, tmp4, exp_re2 + exp_im1 - shift_4, &exp_tmp2 ); + *exp_out1_im = exp_tmp2; + move16(); + + return; +} + + +void ivas_calculate_abs_fx( + Word32 re_fx, + Word16 exp_re, + Word32 im_fx, + Word16 exp_im, + Word32 *out_fx, + Word16 *exp_out ) +{ + Word16 shift_1 = W_norm( W_mult_32_32( re_fx, re_fx ) ); + Word16 shift_2 = W_norm( W_mult_32_32( im_fx, im_fx ) ); + Word32 tmp1 = W_extract_h( W_shl( W_mult_32_32( re_fx, re_fx ), shift_1 ) ); + Word32 tmp2 = W_extract_h( W_shl( W_mult_32_32( im_fx, im_fx ), shift_2 ) ); + Word16 exp_tmp1 = 0; + Word32 tmp3 = BASOP_Util_Add_Mant32Exp( tmp1, exp_re + exp_re - shift_1, tmp2, exp_im + exp_im - shift_2, &exp_tmp1 ); + *out_fx = Sqrt32( tmp3, &exp_tmp1 ); + *exp_out = exp_tmp1; + + return; +} + + +void ivas_calculate_rabs_fx( + Word32 re_fx, + Word16 exp_re, + Word32 *out_fx, + Word16 *exp_out ) +{ + Word16 shift_1 = W_norm( W_mult_32_32( re_fx, re_fx ) ); + Word32 tmp1 = W_extract_h( W_shl( W_mult_32_32( re_fx, re_fx ), shift_1 ) ); + Word16 exp_tmp1 = exp_re + exp_re - shift_1; + Word32 tmp2 = Sqrt32( tmp1, &exp_tmp1 ); + *out_fx = tmp2; + *exp_out = exp_tmp1; + + return; +} + + +void isar_mat_mult_2by2_complex_fx( + Word32 in_re1_fx[2][2], + Word16 exp_re1, + Word32 in_im1_fx[2][2], + Word16 exp_im1, + Word32 in_re2_fx[2][2], + Word16 exp_re2, + Word32 in_im2_fx[2][2], + Word16 exp_im2, + Word32 out_re2_fx[2][2], + Word16 *final_exp_re_1, + Word32 out_im2_fx[2][2], + Word16 *final_exp_im_1 ) +{ + Word16 i, j; + Word32 tmp_re_fx, tmp_im_fx; + + Word16 exp_tmp1 = 0, exp_tmp2 = 0, exp_tmp3 = 0, exp_tmp4 = 0; + Word16 final_exp_re = 0, final_exp_im = 0; + Word16 BuffExp_re[2][2]; + Word16 BuffExp_im[2][2]; + + FOR( i = 0; i < 2; i++ ) + { + FOR( j = 0; j < 2; j++ ) + { + ivas_cmult_fix( in_re1_fx[i][0], exp_re1, in_im1_fx[i][0], exp_im1, in_re2_fx[0][j], exp_re2, in_im2_fx[0][j], exp_im2, &tmp_re_fx, &tmp_im_fx, &exp_tmp1, &exp_tmp2 ); + + out_re2_fx[i][j] = tmp_re_fx; + move32(); + out_im2_fx[i][j] = tmp_im_fx; + move32(); + + ivas_cmult_fix( in_re1_fx[i][1], exp_re1, in_im1_fx[i][1], exp_im1, in_re2_fx[1][j], exp_re2, in_im2_fx[1][j], exp_im2, &tmp_re_fx, &tmp_im_fx, &exp_tmp3, &exp_tmp4 ); + + out_re2_fx[i][j] = BASOP_Util_Add_Mant32Exp( out_re2_fx[i][j], exp_tmp1, tmp_re_fx, exp_tmp3, &final_exp_re ); + move32(); + out_im2_fx[i][j] = BASOP_Util_Add_Mant32Exp( out_im2_fx[i][j], exp_tmp2, tmp_im_fx, exp_tmp4, &final_exp_im ); + move32(); + + BuffExp_re[i][j] = final_exp_re; + move16(); + BuffExp_im[i][j] = final_exp_im; + move16(); + } + } + + Word16 max_exp_re = 0; + Word16 max_exp_im = 0; + move16(); + move16(); + FOR( i = 0; i < 2; i++ ) + { + FOR( j = 0; j < 2; j++ ) + { + max_exp_re = s_max( max_exp_re, BuffExp_re[i][j] ); + max_exp_im = s_max( max_exp_im, BuffExp_im[i][j] ); + } + } + + FOR( i = 0; i < 2; i++ ) + { + FOR( j = 0; j < 2; j++ ) + { + out_re2_fx[i][j] = L_shr( out_re2_fx[i][j], max_exp_re - BuffExp_re[i][j] ); + move32(); + out_im2_fx[i][j] = L_shr( out_im2_fx[i][j], max_exp_im - BuffExp_im[i][j] ); + move32(); + } + } + *final_exp_re_1 = max_exp_re; + move16(); + *final_exp_im_1 = max_exp_im; + move16(); + + return; +} + + +/*------------------------------------------------------------------------- + * Function isar_split_rend_huffman_dec_init_min_max_len() + * + * + *------------------------------------------------------------------------*/ + +static void isar_split_rend_huffman_dec_init_min_max_len( + isar_split_rend_huffman_cfg_t *p_huff_cfg ) +{ + Word16 i, code_len; + const Word32 *codebook; + + codebook = p_huff_cfg->codebook; + + p_huff_cfg->min_len = p_huff_cfg->sym_len; + move16(); + p_huff_cfg->max_len = 0; + move16(); + + FOR( i = 0; i < p_huff_cfg->sym_len; i++ ) + { + code_len = extract_l( codebook[1] ); + IF( GT_16( p_huff_cfg->min_len, code_len ) ) + { + p_huff_cfg->min_len = code_len; + move16(); + } + IF( LT_16( p_huff_cfg->max_len, code_len ) ) + { + p_huff_cfg->max_len = code_len; + move16(); + } + codebook = codebook + 3; + } + + return; +} + + +/*------------------------------------------------------------------------- + * Function is_idx_present() + * + * + *------------------------------------------------------------------------*/ + +static Word16 is_idx_present( + Word16 *idx_list, + const Word16 idx, + const Word16 len ) +{ + Word16 i; + + FOR( i = 0; i < len; i++ ) + { + IF( EQ_16( idx_list[i], idx ) ) + { + return 1; + } + } + + return 0; +} + + +/*------------------------------------------------------------------------- + * Function ivas_split_huff_get_idx_trav_list() + * + * + *------------------------------------------------------------------------*/ + +static void ivas_split_huff_get_idx_trav_list( + Word16 *idx_list, + isar_split_rend_huffman_cfg_t *p_huff_cfg ) +{ + Word16 i, j, min_idx; + Word32 min_bits; + const Word32 *codebook; + + FOR( i = 0; i < p_huff_cfg->sym_len; i++ ) + { + idx_list[i] = -1; + move16(); + } + + FOR( i = 0; i < p_huff_cfg->sym_len; i++ ) + { + codebook = p_huff_cfg->codebook; + min_bits = p_huff_cfg->max_len; + move16(); + min_idx = -1; + move16(); + FOR( j = 0; j < p_huff_cfg->sym_len; j++ ) + { + test(); + IF( GE_32( min_bits, codebook[1] ) && EQ_16( is_idx_present( idx_list, j, i + 1 ), 0 ) ) + { + min_bits = codebook[1]; + move16(); + min_idx = j; + move16(); + } + codebook += 3; + } + idx_list[i] = min_idx; + move16(); + } + + return; +} + + +/*------------------------------------------------------------------------- + * Function isar_split_rend_init_huff_cfg() + * + * + *------------------------------------------------------------------------*/ + +void isar_split_rend_init_huff_cfg( + ISAR_BIN_HR_SPLIT_REND_HUFF_HANDLE pHuff_cfg ) +{ + pHuff_cfg->pred[0].codebook = &ivas_split_rend_huff_pred31_consts[0][0]; + pHuff_cfg->pred[0].sym_len = ISAR_SPLIT_REND_PRED_31QUANT_PNTS; + move16(); + isar_split_rend_huffman_dec_init_min_max_len( &pHuff_cfg->pred[0] ); + ivas_split_huff_get_idx_trav_list( pHuff_cfg->pred_idx_trav[0], &pHuff_cfg->pred[0] ); + pHuff_cfg->pred_base2_code_len[0] = ISAR_SPLIT_REND_PRED_31QUANT_PNTS_LOG2_CEIL; + move16(); + + pHuff_cfg->pred[1].codebook = &ivas_split_rend_huff_pred63_consts[0][0]; + pHuff_cfg->pred[1].sym_len = ISAR_SPLIT_REND_PRED_63QUANT_PNTS; + move16(); + isar_split_rend_huffman_dec_init_min_max_len( &pHuff_cfg->pred[1] ); + ivas_split_huff_get_idx_trav_list( pHuff_cfg->pred_idx_trav[1], &pHuff_cfg->pred[1] ); + pHuff_cfg->pred_base2_code_len[1] = ISAR_SPLIT_REND_PRED_63QUANT_PNTS_LOG2_CEIL; + move16(); + + + pHuff_cfg->pred_roll.codebook = &ivas_split_rend_huff_roll_pred_consts[0][0]; + pHuff_cfg->pred_roll.sym_len = ISAR_SPLIT_REND_ROLL_PRED_QUANT_PNTS; + move16(); + isar_split_rend_huffman_dec_init_min_max_len( &pHuff_cfg->pred_roll ); + ivas_split_huff_get_idx_trav_list( pHuff_cfg->pred_roll_idx_trav, &pHuff_cfg->pred_roll ); + pHuff_cfg->pred_roll_base2_code_len = ISAR_SPLIT_REND_ROLL_PRED_QUANT_PNTS_LOG2_CEIL; + move16(); + + pHuff_cfg->gd.codebook = &ivas_split_rend_huff_d_consts[0][0]; + pHuff_cfg->gd.sym_len = ISAR_SPLIT_REND_D_QUANT_PNTS; + move16(); + isar_split_rend_huffman_dec_init_min_max_len( &pHuff_cfg->gd ); + ivas_split_huff_get_idx_trav_list( pHuff_cfg->gd_idx_trav, &pHuff_cfg->gd ); + pHuff_cfg->gd_base2_code_len = ISAR_SPLIT_REND_D_QUANT_PNTS_LOG2_CEIL; + move16(); + + pHuff_cfg->p_gd.codebook = &ivas_split_rend_huff_p_d_consts[0][0]; + pHuff_cfg->p_gd.sym_len = ISAR_SPLIT_REND_D_QUANT_PNTS; + move16(); + isar_split_rend_huffman_dec_init_min_max_len( &pHuff_cfg->p_gd ); + ivas_split_huff_get_idx_trav_list( pHuff_cfg->p_gd_idx_trav, &pHuff_cfg->p_gd ); + pHuff_cfg->p_gd_base2_code_len = ISAR_SPLIT_REND_D_QUANT_PNTS_LOG2_CEIL; + move16(); + + pHuff_cfg->p_gd_diff.codebook = &ivas_split_rend_huff_p_d_diff_consts[0][0]; + pHuff_cfg->p_gd_diff.sym_len = ISAR_SPLIT_REND_D_QUANT_PNTS; + move16(); + isar_split_rend_huffman_dec_init_min_max_len( &pHuff_cfg->p_gd_diff ); + ivas_split_huff_get_idx_trav_list( pHuff_cfg->p_gd_diff_idx_trav, &pHuff_cfg->p_gd_diff ); + pHuff_cfg->p_gd_diff_base2_code_len = ISAR_SPLIT_REND_D_QUANT_PNTS_LOG2_CEIL; + move16(); + + return; +} + + +/*------------------------------------------------------------------------- + * Function set_fix_rotation_mat() + * + * + *------------------------------------------------------------------------*/ + +void set_fix_rotation_mat_fx( + Word32 fix_pos_rot_mat[][BINAURAL_CHANNELS][BINAURAL_CHANNELS], + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData ) +{ + Word32 cos_yaw, sin_yaw; + Word16 pos_idx; + Word16 ind = 0; + + // pMultiBinPoseData->relative_head_poses can take only take -30, -22.5, -15, 0, 15, 22.5 and 30 degrees. + // cos(180 - theta) = cos(theta). + // Need only 4 values in LUT + + FOR( pos_idx = 0; pos_idx < sub( pMultiBinPoseData->num_poses, 1 ); pos_idx++ ) + { + ind = extract_l( L_shr( L_abs( pMultiBinPoseData->relative_head_poses_fx[pos_idx + 1][0] ), Q22 ) ); + + ind = shr( ind, 3 ); /* Values: 0, 1, 2 and 3 */ + cos_yaw = ivas_split_rend_fix_pos_rot_mat_cos_fx[ind]; /* Q31 */ + sin_yaw = 0; + + fix_pos_rot_mat[pos_idx][0][0] = cos_yaw; /* Q31 */ + fix_pos_rot_mat[pos_idx][1][1] = cos_yaw; /* Q31 */ + fix_pos_rot_mat[pos_idx][0][1] = sin_yaw; /* Q31 */ + fix_pos_rot_mat[pos_idx][1][0] = L_negate( sin_yaw ); /* Q31 */ + } + + return; +} + +/*------------------------------------------------------------------------- + * Function set_pose_types() + * + * + *------------------------------------------------------------------------*/ + +void set_pose_types_fx( + ISAR_SPLIT_REND_POSE_TYPE pose_type[MAX_HEAD_ROT_POSES - 1], + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData ) +{ + Word16 pos_idx; + + FOR( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses - 1; pos_idx++ ) + { + IF( GT_32( L_abs( pMultiBinPoseData->relative_head_poses_fx[pos_idx + 1][0] ), EPSILON_FX ) ) + { + pose_type[pos_idx] = ANY_YAW; + move32(); + } + ELSE IF( GT_32( L_abs( pMultiBinPoseData->relative_head_poses_fx[pos_idx + 1][2] ), EPSILON_FX ) ) + { + pose_type[pos_idx] = ANY_ROLL; + move32(); + } + ELSE + { + pose_type[pos_idx] = PITCH_ONLY; + move32(); + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * Function wrap_a() + * + * + *------------------------------------------------------------------------*/ + +Word16 wrap_a( + Word16 val, + const Word16 min_val, + const Word16 max_val ) +{ + IF( LT_16( val, min_val ) ) + { + val = add( add( sub( max_val, min_val ), val ), 1 ); + } + + IF( GT_16( val, max_val ) ) + { + val = sub( sub( add( min_val, val ), max_val ), 1 ); + } + + return val; +} + + +/*------------------------------------------------------------------------- + * Function isar_SplitRenderer_getdiagdiff() + * + * + *------------------------------------------------------------------------*/ + +void isar_SplitRenderer_getdiagdiff( + Word16 in_idx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 out_idx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + const Word16 sign, + const Word16 min_val, + const Word16 max_val ) +{ + out_idx[0][0] = in_idx[0][0]; + move16(); + out_idx[0][1] = in_idx[0][1]; + move16(); + // DEPR_i_mult used instead of i_mult becuase it is not available + out_idx[1][1] = add( in_idx[1][1], DEPR_i_mult( sign, out_idx[0][0] ) ); + move16(); + out_idx[1][1] = wrap_a( out_idx[1][1], min_val, max_val ); + move16(); + out_idx[1][0] = add( in_idx[1][0], DEPR_i_mult( sign, out_idx[0][1] ) ); + move16(); + out_idx[1][0] = wrap_a( out_idx[1][0], min_val, max_val ); + move16(); + + return; +} + + +/*------------------------------------------------------------------------- + * Function ISAR_SPLIT_REND_BITStream_read_int32() + * + * + *------------------------------------------------------------------------*/ + +Word32 ISAR_SPLIT_REND_BITStream_read_int32( + ISAR_SPLIT_REND_BITS_HANDLE pBits, + const Word32 bits ) +{ + Word32 val, k, bit_val; + +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + assert( ( pBits->bits_written - pBits->bits_read ) >= bits ); + assert( bits <= 32 ); +#endif + + /* write bit by bit */ + val = 0; + move32(); + FOR( k = L_sub( bits, 1 ); k >= 0; k-- ) + { + bit_val = NE_32( L_and( pBits->bits_buf[L_shr( pBits->bits_read, 3 )], ( L_shl( 1, (Word16) ( L_and( pBits->bits_read, 7 ) ) ) ) ), 0 ); + val = L_or( val, L_shl( bit_val, (Word16) k ) ); + pBits->bits_read = L_add( pBits->bits_read, 1 ); + } + + return val; +} + + +/*------------------------------------------------------------------------- + * Function ISAR_SPLIT_REND_BITStream_write_int32() + * + * + *------------------------------------------------------------------------*/ + +void ISAR_SPLIT_REND_BITStream_write_int32( + ISAR_SPLIT_REND_BITS_HANDLE pBits, + const Word32 val, + const Word32 bits ) +{ + Word32 mask, k; + +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + /*protection check*/ + if ( ( pBits->buf_len << 3 ) < ( pBits->bits_written + bits ) ) + { + assert( 0 ); + } +#endif + + mask = L_shl( 1, extract_l( L_sub( bits, 1 ) ) ); + /* write bit by bit */ + FOR( k = 0; k < bits; k++ ) + { + IF( L_and( val, mask ) ) + { + pBits->bits_buf[L_shr( pBits->bits_written, 3 )] = (UWord8) L_or( pBits->bits_buf[L_shr( pBits->bits_written, 3 )], L_shl( 1, extract_l( L_and( pBits->bits_written, 7 ) ) ) ); + } + ELSE + { + pBits->bits_buf[L_shr( pBits->bits_written, 3 )] = (UWord8) L_and( pBits->bits_buf[L_shr( pBits->bits_written, 3 )], ~L_shl( 1, extract_l( L_and( pBits->bits_written, 7 ) ) ) ); + } + pBits->bits_written++; + mask = L_shr( mask, 1 ); + } + + return; +} + + +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG +/*------------------------------------------------------------------------- + * isar_log_cldfb2wav_data() + * + * + *------------------------------------------------------------------------*/ + +void isar_log_cldfb2wav_data( + float Cldfb_In_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float Cldfb_In_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + HANDLE_CLDFB_FILTER_BANK *cldfbSyn, + const int16_t num_chs, + const int16_t num_freq_bands, + const int32_t output_Fs, + const int16_t num_slots, + const int16_t start_slot_idx, + const char *filename ) +{ + float *RealBuffer[CLDFB_NO_COL_MAX]; + float *ImagBuffer[CLDFB_NO_COL_MAX]; + float pcm_out[BINAURAL_CHANNELS][L_FRAME48k]; + float *pPcm[BINAURAL_CHANNELS]; + float Cldfb_local_Real[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_local_Imag[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t sf, ch; + + assert( num_chs <= BINAURAL_CHANNELS ); + for ( ch = 0; ch < num_chs; ch++ ) + { + for ( sf = start_slot_idx; sf < start_slot_idx + num_slots; sf++ ) + { + mvr2r( Cldfb_In_Real[ch][sf], Cldfb_local_Real[ch][sf], num_freq_bands ); + mvr2r( Cldfb_In_Imag[ch][sf], Cldfb_local_Imag[ch][sf], num_freq_bands ); + RealBuffer[sf - start_slot_idx] = Cldfb_local_Real[ch][sf]; + ImagBuffer[sf - start_slot_idx] = Cldfb_local_Imag[ch][sf]; + } + cldfbSynthesis( RealBuffer, ImagBuffer, &( pcm_out[ch][0] ), num_freq_bands * num_slots, cldfbSyn[ch] ); + pPcm[ch] = pcm_out[ch]; + } + dbgwrite_wav( pPcm, num_freq_bands * num_slots, filename, output_Fs, num_chs ); + + return; +} +#endif + + +/*------------------------------------------------------------------------- + * Function isar_get_split_rend_md_target_brate() + * + * + *------------------------------------------------------------------------*/ + +Word32 isar_get_split_rend_md_target_brate( + const Word32 SplitRendBitRate, + const Word16 pcm_out_flag ) +{ + Word32 md_bitrate; + + IF( EQ_16( pcm_out_flag, 1 ) ) + { + md_bitrate = SplitRendBitRate; + move32(); + } + ELSE + { + SWITCH( SplitRendBitRate ) + { + case SPLIT_REND_768k: + { + md_bitrate = 256000; + move32(); + BREAK; + } + case SPLIT_REND_512k: + { + md_bitrate = 128000; + move32(); + BREAK; + } + case SPLIT_REND_384k: + { + md_bitrate = 128000; + move32(); + BREAK; + } + default: + { + return -1; + } + } + } + + return md_bitrate; +} + + +/*------------------------------------------------------------------------- + * Function isar_get_lcld_bitrate() + * + * + *------------------------------------------------------------------------*/ + +Word32 isar_get_lcld_bitrate( + const Word32 SplitRendBitRate, + const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode ) +{ + IF( EQ_32( poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) ) + { + SWITCH( SplitRendBitRate ) + { + case SPLIT_REND_768k: + { + return IVAS_512k; + } + case SPLIT_REND_512k: + { + return IVAS_384k; + } + case SPLIT_REND_384k: + { + return IVAS_256k; + } + default: + { + assert( 0 ); + } + } + } + ELSE + { + return SplitRendBitRate; + } + + return -1; +} + +/*------------------------------------------------------------------------- + * Function isar_get_lc3plus_bitrate() + * + * + *------------------------------------------------------------------------*/ + +Word32 isar_get_lc3plus_bitrate( + const Word32 SplitRendBitRate, + const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode, + const Word32 nChannels, + const Word32 codecFrameDurationUs ) +{ + Word32 bitrate; + bitrate = isar_get_lcld_bitrate( SplitRendBitRate, poseCorrectionMode ); + /* Check for LC3plus LEA 48_6 LC3 compatibility mode signalling */ + test(); + test(); + test(); + if ( EQ_32( ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE, poseCorrectionMode ) && EQ_32( bitrate, 256000 ) && EQ_32( nChannels, 2 ) && EQ_32( codecFrameDurationUs, 10000 ) ) + { + bitrate = 2 * 126000; + move32(); + } + + return bitrate; +} + + +/*------------------------------------------------------------------------- + * Function isar_split_rend_validate_config() + * + * + *------------------------------------------------------------------------*/ + +ivas_error isar_split_rend_validate_config( + const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, + const Word16 is_pcm_out ) +{ + /* Valid DOF range is 0-3 */ + test(); + IF( LT_16( pSplitRendConfig->dof, 0 ) || GT_16( pSplitRendConfig->dof, 3 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "Valid DOF range is 0-3" ); + } + + /* Only CLDFB pose correction supports HQ mode */ + test(); + IF( NE_32( pSplitRendConfig->poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) && NE_16( pSplitRendConfig->hq_mode, 0 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "Only CLDFB pose correction supports HQ mode" ); + } + + /* Split rendering with no pose correction - 0 DOF and pose correction NONE must only ever be set together */ + test(); + test(); + test(); + IF( ( EQ_32( pSplitRendConfig->poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) && NE_16( pSplitRendConfig->dof, 0 ) ) || + ( NE_32( pSplitRendConfig->poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) && EQ_16( pSplitRendConfig->dof, 0 ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "0 DOF and pose correction NONE must only ever be set together" ); + } + + IF( NE_16( pSplitRendConfig->codec_frame_size_ms, 0 ) ) /* 0 means "default for current codec", will be set to actual value at a later stage */ + { + test(); + test(); + test(); + IF( EQ_32( pSplitRendConfig->codec, ISAR_SPLIT_REND_CODEC_LCLD ) && NE_16( pSplitRendConfig->codec_frame_size_ms, 5 ) && NE_16( pSplitRendConfig->codec_frame_size_ms, 10 ) && NE_16( pSplitRendConfig->codec_frame_size_ms, 20 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "Invalid framing for LCLD codec" ); + } + + test(); + test(); + IF( EQ_32( pSplitRendConfig->codec, ISAR_SPLIT_REND_CODEC_LC3PLUS ) && NE_16( pSplitRendConfig->codec_frame_size_ms, 5 ) && NE_16( pSplitRendConfig->codec_frame_size_ms, 10 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "Invalid framing for LC3plus codec" ); + } + } + + /* Validate bitrate */ + IF( EQ_16( is_pcm_out, 0 ) ) + { + SWITCH( pSplitRendConfig->splitRendBitRate ) + { + case SPLIT_REND_256k: + IF( NE_16( pSplitRendConfig->dof, 0 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "Bitrates of 320 kbps and lower are only valid with 0 DOF" ); + } + BREAK; + case SPLIT_REND_320k: + /* Only valid with 0 DOF */ + IF( NE_16( pSplitRendConfig->dof, 0 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "Bitrates of 320 kbps and lower are only valid with 0 DOF" ); + } + BREAK; + case SPLIT_REND_384k: + case SPLIT_REND_512k: + case SPLIT_REND_768k: + /* Always valid */ + BREAK; + default: + return IVAS_ERR_LC3PLUS_INVALID_BITRATE; + } + } + ELSE + { + IF( EQ_16( pSplitRendConfig->dof, 1 ) ) + { + IF( LT_32( pSplitRendConfig->splitRendBitRate, 34000 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "1DOF metadata needs atleast 34 kbps" ); + } + } + ELSE IF( EQ_16( pSplitRendConfig->dof, 2 ) ) + { + IF( LT_32( pSplitRendConfig->splitRendBitRate, 50000 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "2DOF metadata needs atleast 50 kbps" ); + } + } + ELSE IF( EQ_16( pSplitRendConfig->dof, 3 ) ) + { + IF( LT_32( pSplitRendConfig->splitRendBitRate, 82000 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "3DOF metadata needs atleast 128 kbps" ); + } + } + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * Function isar_split_rend_get_quant_params() + * + * + *------------------------------------------------------------------------*/ + +void isar_split_rend_get_quant_params_fx( + const Word16 num_md_bands, + Word16 pred_real_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word16 pred_imag_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word16 pred_quant_pnts_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word32 pred_quantstep_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word32 pred_1byquantstep_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word16 d_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word16 bands_pitch[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word16 pred_real_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + Word16 pred_imag_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], + const Word16 ro_flag, + Word16 *num_quant_strats ) +{ + Word16 q; + + *num_quant_strats = ISAR_SPLIT_REND_NUM_QUANT_STRATS; + move16(); + + pred_quant_pnts_yaw[0] = ISAR_SPLIT_REND_PRED_63QUANT_PNTS; + move16(); + pred_quantstep_yaw[0] = ISAR_SPLIT_REND_PRED63_Q_STEP_FX_Q31; + move32(); + pred_1byquantstep_yaw[0] = ISAR_SPLIT_REND_PRED63_1BYQ_STEP_FX_Q26; + move32(); + FOR( q = 1; q < *num_quant_strats; q++ ) + { + pred_quant_pnts_yaw[q] = ISAR_SPLIT_REND_PRED_31QUANT_PNTS; + move16(); + pred_quantstep_yaw[q] = ISAR_SPLIT_REND_PRED31_Q_STEP_FX_Q31; + move32(); + pred_1byquantstep_yaw[q] = ISAR_SPLIT_REND_PRED31_1BYQ_STEP_FX_Q26; + move32(); + } + + FOR( q = 0; q < *num_quant_strats; q++ ) + { + pred_real_bands_yaw[q] = num_md_bands; + move16(); + pred_real_bands_roll[q] = num_md_bands; + move16(); + } + + IF( ro_flag ) + { + FOR( q = 0; q < *num_quant_strats; q++ ) + { + pred_imag_bands_yaw[q] = SPLIT_REND_RO_MD_BAND_THRESH; + move16(); + } + } + ELSE + { + FOR( q = 0; q < *num_quant_strats - 2; q++ ) + { + pred_imag_bands_yaw[q] = num_md_bands; + move16(); + } + pred_imag_bands_yaw[( *num_quant_strats - 2 )] = COMPLEX_MD_BAND_THRESH_HIGH; + move16(); + pred_imag_bands_yaw[( *num_quant_strats - 1 )] = COMPLEX_MD_BAND_THRESH_LOW; + move16(); + } + + FOR( q = 0; q < *num_quant_strats; q++ ) + { + pred_imag_bands_roll[q] = SPLIT_REND_RO_MD_BAND_THRESH; + move16(); + } + + FOR( q = 0; q < *num_quant_strats; q++ ) + { + d_bands_yaw[q] = 0; + move16(); + bands_pitch[q] = num_md_bands; + move16(); + } + + return; +} + +/*------------------------------------------------------------------------- + * Function isar_renderSplitGetRot_axisNumBits() + * + * + *------------------------------------------------------------------------*/ + +Word16 isar_renderSplitGetRot_axisNumBits( + const Word16 dof ) +{ + Word16 num_bits; + IF( dof < 3 ) + { + num_bits = 2; + } + ELSE + { + num_bits = 0; + } + return num_bits; +} + +/*------------------------------------------------------------------------- + * Function isar_renderSplitGetRot_axisFromCode() + * + * + *------------------------------------------------------------------------*/ + +ISAR_SPLIT_REND_ROT_AXIS isar_renderSplitGetRot_axisFromCode( + const Word16 dof, + const Word16 code ) +{ + ISAR_SPLIT_REND_ROT_AXIS rot_axis; + + IF( dof == 1 ) + { + rot_axis = (ISAR_SPLIT_REND_ROT_AXIS) code; + } + else if ( dof == 2 ) + { + IF( code == 0 ) + { + rot_axis = (ISAR_SPLIT_REND_ROT_AXIS) code; + } + ELSE + { + rot_axis = (ISAR_SPLIT_REND_ROT_AXIS) ( code - 1 ) + YAW_PITCH; + } + } + ELSE + { + rot_axis = (ISAR_SPLIT_REND_ROT_AXIS) DEFAULT_AXIS; + } + + return rot_axis; +} + +/*------------------------------------------------------------------------- + * Function isar_renderSplitGetCodeFromRot_axis() + * + * + *------------------------------------------------------------------------*/ + +Word16 isar_renderSplitGetCodeFromRot_axis( + const Word16 dof, + const ISAR_SPLIT_REND_ROT_AXIS rot_axis, + Word16 *num_bits ) +{ + Word16 code = 0; + IF( dof == 1 ) + { + code = (Word16) rot_axis; + } + else if ( dof == 2 ) + { + IF( rot_axis == DEFAULT_AXIS ) + { + code = (Word16) rot_axis; + } + ELSE + { + code = (Word16) ( rot_axis - YAW_PITCH ) + 1; + } + } + ELSE + { + code = (Word16) DEFAULT_AXIS; + } + *num_bits = isar_renderSplitGetRot_axisNumBits( dof ); + + return code; +} + +/*------------------------------------------------------------------------- + * Function isar_renderSplitGetMultiBinPoseData() + * + * + *------------------------------------------------------------------------*/ + +void isar_renderSplitGetMultiBinPoseData_fx( + const ISAR_SPLIT_REND_CONFIG_DATA *pSplit_rend_config, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const ISAR_SPLIT_REND_ROT_AXIS rot_axis ) +{ + Word16 pos_idx, num_yaw_poses, num_pitch_poses, num_roll_poses; + const Word32 *relative_yaw_angles; + const Word32 *relative_pitch_angles; + const Word32 *relative_roll_angles; + + FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) + { + pMultiBinPoseData->relative_head_poses_fx[pos_idx][0] = 0; + move32(); + pMultiBinPoseData->relative_head_poses_fx[pos_idx][1] = 0; + move32(); + pMultiBinPoseData->relative_head_poses_fx[pos_idx][2] = 0; + move32(); + } + + /* 0 DOF defaults */ + num_yaw_poses = 0; + move16(); + num_pitch_poses = 0; + move16(); + num_roll_poses = 0; + move16(); + + /* defaults for all DOF except 3DOF HQ */ + relative_yaw_angles = ivas_split_rend_relative_yaw_pos_angles_hq_fx; + relative_pitch_angles = ivas_split_rend_relative_pitch_pos_angles_hq_fx; + relative_roll_angles = ivas_split_rend_relative_roll_pos_angles_hq_fx; + + IF( EQ_16( pSplit_rend_config->dof, 1 ) ) + { + SWITCH( rot_axis ) + { + case DEFAULT_AXIS: + case YAW: + { + num_yaw_poses = SPLIT_REND_MAX_YAW_ONLY_POSES; + move16(); + BREAK; + } + case PITCH: + { + num_pitch_poses = SPLIT_REND_MAX_PITCH_ONLY_POSES; + move16(); + BREAK; + } + case ROLL: + { + num_roll_poses = SPLIT_REND_MAX_ROLL_ONLY_POSES; + move16(); + BREAK; + } + default: + { + assert( 0 && "unsupported rotation axis value" ); + } + } + } + ELSE IF( EQ_16( pSplit_rend_config->dof, 2 ) ) + { + SWITCH( rot_axis ) + { + case DEFAULT_AXIS: + case YAW_PITCH: + { + num_yaw_poses = SPLIT_REND_MAX_YAW_ONLY_POSES; + move16(); + num_pitch_poses = SPLIT_REND_MAX_PITCH_ONLY_POSES; + move16(); + BREAK; + } + case YAW_ROLL: + { + num_yaw_poses = SPLIT_REND_MAX_YAW_ONLY_POSES; + move16(); + num_roll_poses = SPLIT_REND_MAX_ROLL_ONLY_POSES; + move16(); + BREAK; + } + case PITCH_ROLL: + { + num_pitch_poses = SPLIT_REND_MAX_PITCH_ONLY_POSES; + move16(); + num_roll_poses = SPLIT_REND_MAX_ROLL_ONLY_POSES; + move16(); + BREAK; + } + default: + { + assert( 0 && "unsupported rotation axis value" ); + } + } + } + ELSE IF( EQ_16( pSplit_rend_config->dof, 3 ) ) + { + IF( EQ_16( pSplit_rend_config->hq_mode, 1 ) ) + { + relative_yaw_angles = ivas_split_rend_relative_yaw_pos_angles_hq_fx; + relative_pitch_angles = ivas_split_rend_relative_pitch_pos_angles_hq_fx; + relative_roll_angles = ivas_split_rend_relative_roll_pos_angles_hq_fx; + num_yaw_poses = SPLIT_REND_MAX_YAW_ONLY_POSES; + move16(); + num_pitch_poses = SPLIT_REND_MAX_PITCH_ONLY_POSES; + move16(); + num_roll_poses = SPLIT_REND_MAX_ROLL_ONLY_POSES; + move16(); + } + ELSE + { + relative_yaw_angles = ivas_split_rend_relative_yaw_pos_angles_fx; + relative_pitch_angles = ivas_split_rend_relative_pitch_pos_angles_fx; + relative_roll_angles = ivas_split_rend_relative_roll_pos_angles_fx; + num_yaw_poses = SPLIT_REND_MAX_YAW_ONLY_POSES; + move16(); + num_pitch_poses = 1; + move16(); + num_roll_poses = 1; + move16(); + } + } + + pMultiBinPoseData->num_poses = add( add( num_yaw_poses, num_pitch_poses ), add( num_roll_poses, 1 ) ); + assert( LE_16( pMultiBinPoseData->num_poses, MAX_HEAD_ROT_POSES ) ); + + FOR( pos_idx = 0; pos_idx < num_yaw_poses; pos_idx++ ) + { + pMultiBinPoseData->relative_head_poses_fx[pos_idx + 1][0] = relative_yaw_angles[pos_idx]; + move32(); + } + + FOR( pos_idx = 0; pos_idx < num_pitch_poses; pos_idx++ ) + { + pMultiBinPoseData->relative_head_poses_fx[pos_idx + num_yaw_poses + 1][1] = relative_pitch_angles[pos_idx]; + move32(); + } + + FOR( pos_idx = 0; pos_idx < num_roll_poses; pos_idx++ ) + { + pMultiBinPoseData->relative_head_poses_fx[pos_idx + num_yaw_poses + num_pitch_poses + 1][2] = relative_roll_angles[pos_idx]; + move32(); + } + pMultiBinPoseData->dof = pSplit_rend_config->dof; + move16(); + pMultiBinPoseData->hq_mode = pSplit_rend_config->hq_mode; + move16(); + pMultiBinPoseData->rot_axis = rot_axis; + move32(); + pMultiBinPoseData->poseCorrectionMode = pSplit_rend_config->poseCorrectionMode; + move32(); + + return; +} + +/*------------------------------------------------------------------------- + * Function isar_renderSplitUpdateNoCorrectionPoseData() + * + * + *------------------------------------------------------------------------*/ + +void isar_renderSplitUpdateNoCorrectionPoseData( + const ISAR_SPLIT_REND_CONFIG_DATA *pSplit_rend_config, + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData ) +{ + pMultiBinPoseData->num_poses = 1; + move16(); + assert( pSplit_rend_config->dof == 0 ); + pMultiBinPoseData->dof = pSplit_rend_config->dof; + move16(); + assert( pSplit_rend_config->poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ); + pMultiBinPoseData->poseCorrectionMode = pSplit_rend_config->poseCorrectionMode; + move32(); + + return; +} + + +/*------------------------------------------------------------------------- + * Function isar_init_multi_bin_pose_data() + * + * + *------------------------------------------------------------------------*/ + +void isar_init_multi_bin_pose_data_fx( + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData ) +{ + Word16 pos_idx; + + FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) + { + pMultiBinPoseData->relative_head_poses_fx[pos_idx][0] = 0; + move32(); + pMultiBinPoseData->relative_head_poses_fx[pos_idx][1] = 0; + move32(); + pMultiBinPoseData->relative_head_poses_fx[pos_idx][2] = 0; + move32(); + } + pMultiBinPoseData->num_poses = 1; + move16(); + pMultiBinPoseData->dof = 3; + move16(); + pMultiBinPoseData->hq_mode = 0; + move16(); + pMultiBinPoseData->rot_axis = DEFAULT_AXIS; + move32(); + + return; +} + +/* Copy for encoder, to be removed */ +void isar_init_multi_bin_pose_data_fx_enc( + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData ) +{ + Word16 pos_idx; + + FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) + { + pMultiBinPoseData->relative_head_poses_fx[pos_idx][0] = 0; + move32(); + pMultiBinPoseData->relative_head_poses_fx[pos_idx][1] = 0; + move32(); + pMultiBinPoseData->relative_head_poses_fx[pos_idx][2] = 0; + move32(); + } + pMultiBinPoseData->num_poses = 1; + move16(); + pMultiBinPoseData->dof = 3; + move16(); + pMultiBinPoseData->hq_mode = 0; + move16(); + pMultiBinPoseData->rot_axis = DEFAULT_AXIS; + move32(); + + return; +} + +ivas_error isar_framesize_to_ms( + const IVAS_RENDER_FRAMESIZE frame_size, /* i : frame size enum */ + Word16 *ms /* o : frame size in ms */ +) +{ + switch ( frame_size ) + { + case IVAS_RENDER_FRAMESIZE_5MS: + *ms = 5; + break; + case IVAS_RENDER_FRAMESIZE_10MS: + *ms = 10; + break; + case IVAS_RENDER_FRAMESIZE_20MS: + *ms = 20; + break; + default: + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported ISAR frame size" ); + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * Function isar_split_rend_choose_default_codec() + * + * + *------------------------------------------------------------------------*/ + +ivas_error isar_split_rend_choose_default_codec( + ISAR_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ + Word16 *pIsar_frame_size_ms, /* i/o: pointer to ISAR frame size setting */ + Word16 *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ + const Word16 cldfb_in_flag, /* i : flag indicating rendering in TD */ + const Word16 pcm_out_flag, /* i : flag to indicate PCM output */ + const Word16 num_subframes /* i : number of subframes */ +) +{ + IF( EQ_16( pcm_out_flag, 0 ) ) + { + IF( EQ_32( *pCodec, ISAR_SPLIT_REND_CODEC_DEFAULT ) ) + { + *pCodec = cldfb_in_flag ? ISAR_SPLIT_REND_CODEC_LCLD : ISAR_SPLIT_REND_CODEC_LC3PLUS; + move32(); + } + } + ELSE + { + *pCodec = ISAR_SPLIT_REND_CODEC_NONE; + move32(); + } + + IF( EQ_16( *pCodec_frame_size_ms, 0 ) ) /* codec frame size hasn't been set yet - use default for current configuration */ + { + SWITCH( *pCodec ) + { + case ISAR_SPLIT_REND_CODEC_LCLD: + *pCodec_frame_size_ms = DEPR_i_mult( num_subframes, 5 ); + BREAK; + case ISAR_SPLIT_REND_CODEC_LC3PLUS: + case ISAR_SPLIT_REND_CODEC_NONE: + *pCodec_frame_size_ms = 5; + move16(); + BREAK; + default: + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Unknown split codec value" ); + } + } + + IF( *pIsar_frame_size_ms == 0 ) /* ISAR frame size hasn't been set yet - use default for current configuration */ + { + *pIsar_frame_size_ms = 20; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * Function get_bit() + * + * + *-------------------------------------------------------------------*/ + +Word32 get_bit( + const Word32 state, + const Word32 bit_id ) +{ + return L_and( state, ( L_shl( 1, (Word16) bit_id ) ) ); +} diff --git a/lib_isar/isar_stat.h b/lib_isar/isar_stat.h new file mode 100644 index 0000000000000000000000000000000000000000..4b0b5ccda9a295ec7ab3d303a25e4d08798570f7 --- /dev/null +++ b/lib_isar/isar_stat.h @@ -0,0 +1,270 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef ISAR_STAT_H +#define ISAR_STAT_H + + +#include +#include "options.h" +#include "stat_com.h" +#include "ivas_stat_com.h" +#include "isar_lcld_prot.h" +#include "isar_lc3plus_enc.h" +#include "isar_lc3plus_dec.h" +#include "isar_cnst.h" + + +/*-------------------------------------------------------------------* + * ISAR post rend constants + *-------------------------------------------------------------------*/ + +#define MAX_CLDFB_BUFFER_LENGTH_PER_CHANNEL ( L_FRAME_MAX * 2 ) +#define MAX_CLDFB_BUFFER_LENGTH ( MAX_CLDFB_BUFFER_LENGTH_PER_CHANNEL * MAX_INPUT_CHANNELS ) +#define MAX_BIN_BUFFER_LENGTH ( L_FRAME_MAX * BINAURAL_CHANNELS ) +#define MAX_CLDFB_BIN_BUFFER_LENGTH ( MAX_CLDFB_BUFFER_LENGTH_PER_CHANNEL * BINAURAL_CHANNELS ) + +/*-------------------------------------------------------------------* + * ISAR post rend structs + *-------------------------------------------------------------------*/ + +typedef struct +{ + Word8 headRotEnabled; + IVAS_QUATERNION headPositions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + IVAS_VECTOR3 Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 crossfade_fx[L_FRAME48k / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis; + +} ISAR_POST_REND_HeadRotData; + +typedef struct +{ +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + HANDLE_CLDFB_FILTER_BANK cldfbAna[( 1 + MAX_HEAD_ROT_POSES ) * BINAURAL_CHANNELS]; +#else + HANDLE_CLDFB_FILTER_BANK cldfbAna[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; +#endif + HANDLE_CLDFB_FILTER_BANK cldfbSyn[BINAURAL_CHANNELS]; + +} CLDFB_HANDLES_WRAPPER, *CLDFB_HANDLES_WRAPPER_HANDLE; + +typedef struct isar_split_rend_huffman_cfg_t +{ + const int32_t *codebook; + Word16 min_len; + Word16 max_len; + Word16 sym_len; + +} isar_split_rend_huffman_cfg_t; + +typedef struct isar_binaural_head_rot_split_rendering_huff_struct +{ + isar_split_rend_huffman_cfg_t pred[2]; + Word16 pred_idx_trav[2][ISAR_SPLIT_REND_PRED_63QUANT_PNTS]; + Word16 pred_base2_code_len[2]; + isar_split_rend_huffman_cfg_t pred_roll; + Word16 pred_roll_idx_trav[ISAR_SPLIT_REND_ROLL_PRED_QUANT_PNTS]; + Word16 pred_roll_base2_code_len; + isar_split_rend_huffman_cfg_t gd; + Word16 gd_base2_code_len; + Word16 gd_idx_trav[ISAR_SPLIT_REND_D_QUANT_PNTS]; + isar_split_rend_huffman_cfg_t p_gd; + Word16 p_gd_base2_code_len; + Word16 p_gd_idx_trav[ISAR_SPLIT_REND_D_QUANT_PNTS]; + isar_split_rend_huffman_cfg_t p_gd_diff; + Word16 p_gd_diff_base2_code_len; + Word16 p_gd_diff_idx_trav[ISAR_SPLIT_REND_D_QUANT_PNTS]; + +} ISAR_BIN_HR_SPLIT_REND_HUFF, *ISAR_BIN_HR_SPLIT_REND_HUFF_HANDLE; + +/* binaural split rendering head rotation data structure */ +typedef struct isar_binaural_head_rot_split_rendering_md_struct +{ + Word32 pred_mat_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; /* Q25 */ + Word16 exp_pred_mat_re; + Word32 pred_mat_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; /* Q25 */ + Word16 exp_pred_mat_im; + Word32 pred_mat_re2[BINAURAL_CHANNELS]; + Word16 exp_pred_mat_re2; + Word32 gd_fx; /* Q25 */ + Word32 gd2_fx; /* Q25 */ + Word16 exp_gd; + Word16 exp_gd2; + Word16 pred_mat_re_idx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 pred_mat_im_idx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 gd_idx; + Word16 gd2_idx; + +} ISAR_BIN_HR_SPLIT_REND_MD, *ISAR_BIN_HR_SPLIT_REND_MD_HANDLE; + +typedef struct isar_binaural_head_rot_split_pre_rendering_struct +{ + ISAR_BIN_HR_SPLIT_REND_MD rot_md[MAX_HEAD_ROT_POSES - 1][MAX_SPLIT_MD_SUBFRAMES][MAX_SPLIT_REND_MD_BANDS]; + Word32 fix_pos_rot_mat_fx[MAX_HEAD_ROT_POSES - 1][BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + float fix_pos_rot_mat[MAX_HEAD_ROT_POSES - 1][BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + ISAR_SPLIT_REND_POSE_TYPE pose_type[MAX_HEAD_ROT_POSES - 1]; + ISAR_BIN_HR_SPLIT_REND_HUFF huff_cfg; + +} ISAR_BIN_HR_SPLIT_PRE_REND, *ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE; + + +/*----------------------------------------------------------------------------------* + * Output configuration for renderer (e.g. DirAC, MASA, Binaural Renderer...) + *----------------------------------------------------------------------------------*/ + +typedef struct isar_binaural_head_rot_split_rendering_lcld_enc_struct +{ + void *pLcld_enc; + Word16 iChannels; + LCLDEncoder *psLCLDEncoder; + Word32 ***pppfLCLDReal_fx; + Word32 ***pppfLCLDImag_fx; +#ifdef CLDFB_DEBUG + FILE *cldfbIn; + int16_t numFrame; +#endif + Word16 iNumIterations; + Word16 iNumBlocks; + +} ISAR_BIN_HR_SPLIT_LCLD_ENC, *ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE; + +typedef struct +{ + Word32 Cldfb_Prev_BinReal_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX + CLDFB_PLC_XF][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_Prev_BinImag_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX + CLDFB_PLC_XF][CLDFB_NO_CHANNELS_MAX]; + Word16 Q_Prev_Bin_fx; + Word32 xf_bet_fx[2][CLDFB_NO_CHANNELS_MAX][CLDFB_PLC_XF]; + +} ISAR_CLDFB_PLC, *ISAR_CLDFB_PLC_HANDLE; +typedef struct +{ + ISAR_CLDFB_PLC CldfbPLC_state; + Word16 prev_bfi; + Word16 bf_count; + Word16 iNumSubSets; + +} ISAR_SPLIT_REND_PLC_STRUCT, *ISAR_SPLIT_REND_PLC_HANDLE; +typedef struct isar_binaural_head_rot_split_rendering_lcld_dec_struct +{ + void *pLcld_dec; + Word32 iChannels; + LCLDDecoder *psLCLDDecoder; + Word32 ***pppfDecLCLDReal_fx; + Word32 ***pppfDecLCLDImag_fx; +#ifdef CLDFB_DEBUG + FILE *cldfbOut; + int16_t numFrame; +#endif + ISAR_SPLIT_REND_PLC_HANDLE hSplitRendPLC; + + Word16 iNumBlocks; + Word16 iNumIterations; + +} ISAR_BIN_HR_SPLIT_LCLD_DEC, *ISAR_BIN_HR_SPLIT_LCLD_DEC_HANDLE; +typedef struct isar_binaural_head_rot_split_post_rendering_struct +{ + ISAR_BIN_HR_SPLIT_REND_MD rot_md[MAX_HEAD_ROT_POSES][MAX_SPLIT_MD_SUBFRAMES][MAX_SPLIT_REND_MD_BANDS]; + IVAS_QUATERNION QuaternionsPre[MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t low_Res; + + float fix_pos_rot_mat[MAX_HEAD_ROT_POSES - 1][BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 fix_pos_rot_mat_fx[MAX_HEAD_ROT_POSES - 1][BINAURAL_CHANNELS][BINAURAL_CHANNELS]; /* Q31 */ + ISAR_SPLIT_REND_POSE_TYPE pose_type[MAX_HEAD_ROT_POSES - 1]; + ISAR_BIN_HR_SPLIT_REND_HUFF huff_cfg; +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + Word32 mixer_mat_re_fx[MAX_HEAD_ROT_POSES][MAX_SPLIT_REND_MD_BANDS][BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 mixer_mat_im_fx[MAX_HEAD_ROT_POSES][MAX_SPLIT_REND_MD_BANDS][BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 gd_mem_fx[MAX_HEAD_ROT_POSES][MAX_SPLIT_REND_MD_BANDS]; +#else + Word32 mixer_mat_re_fx[1][MAX_SPLIT_REND_MD_BANDS][BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 mixer_mat_im_fx[1][MAX_SPLIT_REND_MD_BANDS][BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word32 gd_mem_fx[1][MAX_SPLIT_REND_MD_BANDS]; +#endif + int16_t cf_flag; + HANDLE_CLDFB_FILTER_BANK cldfbAna[BINAURAL_CHANNELS]; + HANDLE_CLDFB_FILTER_BANK cldfbSyn[BINAURAL_CHANNELS]; +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + HANDLE_CLDFB_FILTER_BANK cldfbSynReconsBinDec[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS]; +#endif + +} ISAR_BIN_HR_SPLIT_POST_REND, *ISAR_BIN_HR_SPLIT_POST_REND_HANDLE; + +typedef struct +{ + int16_t num_poses; + // float relative_head_poses[MAX_HEAD_ROT_POSES][3]; + Word32 relative_head_poses_fx[MAX_HEAD_ROT_POSES][3]; /* Q22 */ + int16_t dof; + int16_t hq_mode; + ISAR_SPLIT_REND_ROT_AXIS rot_axis; + ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode; + +} MULTI_BIN_REND_POSE_DATA; + +typedef struct +{ + MULTI_BIN_REND_POSE_DATA multiBinPoseData; + ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinHrSplitPostRend; + ISAR_BIN_HR_SPLIT_LCLD_DEC_HANDLE hSplitBinLCLDDec; + int16_t first_good_frame_received; + ISAR_LC3PLUS_DEC_HANDLE hLc3plusDec; + Word16 Q_last; + +} ISAR_SPLIT_POST_REND_WRAPPER; + + +typedef struct +{ + MULTI_BIN_REND_POSE_DATA multiBinPoseData; + ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend; + ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE hSplitBinLCLDEnc; + CLDFB_HANDLES_WRAPPER_HANDLE hCldfbHandles; + ISAR_LC3PLUS_ENC_HANDLE hLc3plusEnc; + // float *lc3plusDelayBuffers[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; /* Used to time-align head pose correction metadata with LC3plus-coded reference audio */ + Word32 *lc3plusDelayBuffers_fx[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; /* Used to time-align head pose correction metadata with LC3plus-coded reference audio */ + Word16 lc3plusDelayBuffers_q; + Word32 lc3plusDelaySamples; +} SPLIT_REND_WRAPPER; + +typedef struct +{ + Word32 *real; + Word32 *imag; + Word16 capacity; + Word16 write_pos; + Word16 read_pos; + Word16 is_full; + +} ISAR_CLDFB_RINGBUF, *ISAR_CLDFB_RINGBUF_HANDLE; + +#endif /* ISAR_STAT_H */ diff --git a/lib_isar/lib_isar_post_rend.c b/lib_isar/lib_isar_post_rend.c new file mode 100644 index 0000000000000000000000000000000000000000..2dcf72622e89ac12d0a4649654e56d8c1a7425d4 --- /dev/null +++ b/lib_isar/lib_isar_post_rend.c @@ -0,0 +1,1866 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include "lib_isar_post_rend.h" +#include "isar_stat.h" +#include "isar_prot.h" +#include "prot_fx.h" +#include "ivas_prot_fx.h" +#include "ivas_prot_rend_fx.h" +#include +#include +#include "wmc_auto.h" + + +/*-------------------------------------------------------------------* + * Local types + *-------------------------------------------------------------------*/ + +/* EFAP wrapper to simplify writing panning gains to a vector that includes LFE channels */ +typedef struct +{ + EFAP_HANDLE hEfap; + AUDIO_CONFIG speakerConfig; + const LSSETUP_CUSTOM_STRUCT *pCustomLsSetup; /* Pointer to main custom LS struct from renderer handle - doesn't need freeing */ +} EFAP_WRAPPER; + +/* Lightweight helper struct that gathers all information required for rendering + * any config to any other config. Used to simplify signatures of rendering functions. + * + * This struct should store ONLY CONST POINTERS to data existing elsewhere. + * Storing pointers instead of data itself ensures that no additional updates + * are required when any of these are changed in the renderer. Making the pointers + * const ensures that this data is only read, but not modified by the rendering functions. */ +typedef struct +{ + const Word32 *pOutSampleRate; + const AUDIO_CONFIG *pOutConfig; + const ISAR_POST_REND_HeadRotData *pHeadRotData; + const Word16 *pSplitRendBFI; + const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRenderConfig; +} rendering_context_isar; + +/* Common base for input structs */ +typedef struct +{ + AUDIO_CONFIG inConfig; + ISAR_POST_REND_InputId id; + IVAS_REND_AudioBuffer inputBuffer; + Word32 gain_fx; /* Linear, not in dB */ + rendering_context_isar ctx; + Word32 numNewSamplesPerChannel; /* Used to keep track how much new audio was fed before rendering current frame */ +} input_base_isar; + +typedef struct +{ + input_base_isar base; + ISAR_SPLIT_POST_REND_WRAPPER splitPostRendWrapper; + Word32 *bufferData_fx; + Word16 numCachedSamples; /* Number of decoded samples in bufferData that have not yet been played out */ + ISAR_POST_REND_BitstreamBuffer *hBits; +} input_split_post_rend; + +struct ISAR_POST_REND +{ + Word32 sampleRateOut; + + IVAS_LIMITER_HANDLE hLimiter; +#ifdef DEBUGGING + Word32 numClipping; /* Counter of clipped output samples */ +#endif + + input_split_post_rend inputsSplitPost[RENDERER_MAX_BIN_INPUTS]; + + AUDIO_CONFIG inputConfig; + AUDIO_CONFIG outputConfig; + + ISAR_POST_REND_HeadRotData headRotData; + Word16 splitRendBFI; + + Word8 rendererConfigEnabled; + ISAR_SPLIT_REND_CONFIG_DATA splitRenderConfig; + + Word16 num_subframes; +}; + + +/*-------------------------------------------------------------------* + * isar_getAudioConfigType() + * + * + *-------------------------------------------------------------------*/ + +/*! r: ISAR audio type */ +ISAR_POST_REND_AudioConfigType isar_getAudioConfigType( + const AUDIO_CONFIG config ) +{ + ISAR_POST_REND_AudioConfigType type; + + SWITCH( config ) + { + case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + type = ISAR_POST_REND_AUDIO_CONFIG_TYPE_BINAURAL; + BREAK; + default: + type = ISAR_POST_REND_AUDIO_CONFIG_TYPE_UNKNOWN; + BREAK; + } + + return type; +} + + +/*-------------------------------------------------------------------* + * Local functions + *-------------------------------------------------------------------*/ + +static ivas_error allocateInputBaseBufferData_fx( + Word32 **data, + const Word16 data_size ) +{ + *data = (Word32 *) malloc( data_size * sizeof( Word32 ) ); + IF( *data == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for input base buffer data" ); + } + + return IVAS_ERR_OK; +} + + +static void freeInputBaseBufferData_fx( + Word32 **data ) +{ + IF( *data != NULL ) + { + free( *data ); + *data = NULL; + } + + return; +} + + +static IVAS_QUATERNION quaternionInit( + void ) +{ + IVAS_QUATERNION q; + q.w_fx = ONE_IN_Q22; + q.x_fx = q.y_fx = q.z_fx = 0; + return q; +} + + +static void convertBitsBufferToInternalBitsBuff( + const ISAR_POST_REND_BitstreamBuffer outBits, + ISAR_SPLIT_REND_BITS_HANDLE hBits ) +{ + hBits->bits_buf = outBits.bits; + hBits->bits_read = outBits.config.bitsRead; + hBits->bits_written = outBits.config.bitsWritten; + hBits->buf_len = outBits.config.bufLenInBytes; + hBits->codec = outBits.config.codec; + hBits->pose_correction = outBits.config.poseCorrection; + hBits->codec_frame_size_ms = outBits.config.codec_frame_size_ms; + hBits->isar_frame_size_ms = outBits.config.isar_frame_size_ms; + hBits->lc3plus_highres = outBits.config.lc3plusHighRes; + + return; +} + + +static void convertInternalBitsBuffToBitsBuffer( + ISAR_POST_REND_BitstreamBuffer *hOutBits, + const ISAR_SPLIT_REND_BITS_DATA bits ) +{ + hOutBits->bits = bits.bits_buf; + hOutBits->config.bitsRead = bits.bits_read; + hOutBits->config.bitsWritten = bits.bits_written; + hOutBits->config.bufLenInBytes = bits.buf_len; + hOutBits->config.codec = bits.codec; + hOutBits->config.poseCorrection = bits.pose_correction; + hOutBits->config.codec_frame_size_ms = bits.codec_frame_size_ms; + hOutBits->config.isar_frame_size_ms = bits.isar_frame_size_ms; + hOutBits->config.lc3plusHighRes = bits.lc3plus_highres; + + return; +} + + +static void copyBufferTo2dArray_fx( + const IVAS_REND_AudioBuffer buffer, + Word32 array[][L_FRAME48k] ) +{ + UWord32 smplIdx; + UWord32 chnlIdx; + const Word32 *readPtr; + + assert( ( buffer.config.is_cldfb == 0 ) && "for CLDFB input call copyBufferToCLDFBarray()" ); + readPtr = buffer.data_fx; + + FOR( chnlIdx = 0; chnlIdx < (UWord32) buffer.config.numChannels; ++chnlIdx ) + { + FOR( smplIdx = 0; smplIdx < (UWord32) buffer.config.numSamplesPerChannel; ++smplIdx ) + { + array[chnlIdx][smplIdx] = *readPtr++; + } + } + + return; +} + + +static void accumulate2dArrayToBuffer_fx( + Word32 array[][L_FRAME48k], + Word16 Q_out[][BINAURAL_CHANNELS], + Word16 Q_max, + const IVAS_REND_AudioBuffer *buffer, + Word16 num_subframes, + Word16 subframe_length ) +{ + Word16 smplIdx, chnlIdx; + Word32 *writePtr; + + writePtr = buffer->data_fx; + FOR( chnlIdx = 0; chnlIdx < buffer->config.numChannels; ++chnlIdx ) + { + FOR( Word16 sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + FOR( smplIdx = 0; smplIdx < subframe_length; ++smplIdx ) + { + //*writePtr++ += (float) array[chnlIdx][( sf_idx * subframe_length ) + smplIdx] / powf( 2, Q_out[sf_idx][chnlIdx] ); + *writePtr++ += L_shl( array[chnlIdx][( sf_idx * subframe_length ) + smplIdx], sub( Q_max, Q_out[sf_idx][chnlIdx] ) ); + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * limitRendererOutput() + * + * In-place saturation control for multichannel buffers with adaptive release time + *-------------------------------------------------------------------*/ + +#ifndef DISABLE_LIMITER +/*! r: number of clipped output samples */ +static Word32 limitRendererOutput_fx( + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + Word32 *output, /* i/o: I/O buffer */ + const Word16 output_frame, /* i : number of samples per channel in the buffer */ + const Word32 threshold, /* i : signal amplitude above which limiting starts to be applied */ + Word16 q_factor ) /* i : q factor of output samples */ +{ + Word16 i; + Word32 **channels; + Word16 num_channels; + Word32 numClipping = 0; + + /* return early if given bad parameters */ + test(); + test(); + IF( hLimiter == NULL || output == NULL || output_frame <= 0 ) + { + return 0; + } + + channels = hLimiter->channel_ptrs_fx; + num_channels = hLimiter->num_channels; + + FOR( i = 0; i < num_channels; ++i ) + { + channels[i] = output + i * output_frame; + } + + limiter_process_fx( hLimiter, output_frame, threshold, 0, NULL, q_factor ); + + /* Apply clipping to buffer in case the limiter let through some samples > 1.0f */ + FOR( i = 0; i < output_frame * num_channels; ++i ) + { + + output[i] = min( max( L_shl( INT16_MIN, q_factor ), output[i] ), L_shl( INT16_MAX, q_factor ) ); + } + + return numClipping; +} +#endif + + +/*-------------------------------------------------------------------* + * validateOutputSampleRate() + * + * + *-------------------------------------------------------------------*/ + +static ivas_error validateOutputSampleRate( + const Word32 sampleRate, + const AUDIO_CONFIG outConfig ) +{ + IF( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) && NE_32( sampleRate, 48000 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Error: Only 48kHz output sampling rate is supported for split rendering." ); + } + ELSE + { + /* Otherwise rendering to binaural, support the same set as IVAS decoder */ + SWITCH( sampleRate ) + { + case 8000: + case 16000: + case 32000: + case 48000: + return IVAS_ERR_OK; + } + + return IVAS_ERR_INVALID_SAMPLING_RATE; + } +} + + +/*-------------------------------------------------------------------* + * Local functions + *-------------------------------------------------------------------*/ + +static ivas_error initLimiter( + IVAS_LIMITER_HANDLE *phLimiter, + const Word16 numChannels, + const Word32 sampleRate ) +{ + ivas_error error; + + /* If re-initializing with unchanged values, return early */ + IF( *phLimiter != NULL && ( *phLimiter )->num_channels == numChannels && ( *phLimiter )->sampling_rate == sampleRate ) + { + return IVAS_ERR_OK; + } + + /* Support re-init: close if already allocated */ + IF( *phLimiter != NULL ) + { + ivas_limiter_close_fx( phLimiter ); + } + + IF( ( error = ivas_limiter_open_fx( phLimiter, numChannels, sampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +static ivas_error initHeadRotation( + ISAR_POST_REND_HANDLE hIvasRend ) +{ + Word16 i, crossfade_len; + Word32 tmp; + + /* Head rotation is enabled by default */ + hIvasRend->headRotData.headRotEnabled = 1; + + /* Initialize 5ms crossfade */ + crossfade_len = 240 /*L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES*/; + tmp = 8985287 /*1.f / ( crossfade_len - 1 )*/; + FOR( i = 0; i < crossfade_len; i++ ) + { + hIvasRend->headRotData.crossfade_fx[i] = W_extract_l( W_mult0_32_32( i, tmp ) ); + } + + /* Initialize with unit quaternions */ + FOR( i = 0; i < hIvasRend->num_subframes; ++i ) + { + hIvasRend->headRotData.headPositions[i] = quaternionInit(); + } + + hIvasRend->headRotData.sr_pose_pred_axis = DEFAULT_AXIS; + + return IVAS_ERR_OK; +} + + +static void initRendInputBase_fx( + input_base_isar *inputBase, + const AUDIO_CONFIG inConfig, + const IVAS_REND_InputId id, + const rendering_context_isar rendCtx, + Word32 *dataBuf, + const Word16 dataBufSize ) +{ + inputBase->inConfig = inConfig; + inputBase->id = id; + inputBase->gain_fx = MAX_32; + inputBase->ctx = rendCtx; + inputBase->numNewSamplesPerChannel = 0; + + inputBase->inputBuffer.config.numSamplesPerChannel = 0; + inputBase->inputBuffer.config.numChannels = 0; + inputBase->inputBuffer.data_fx = dataBuf; + IF( inputBase->inputBuffer.data_fx != NULL ) + { + set_l( inputBase->inputBuffer.data_fx, 0, dataBufSize ); + } + + return; +} + +static rendering_context_isar getRendCtx( + ISAR_POST_REND_HANDLE hIvasRend ) +{ + rendering_context_isar ctx; + + /* Note: when refactoring this, always take the ADDRESS of a member of the + * renderer struct, so that the context stores a POINTER to the member, even + * if the member is a pointer or handle itself. */ + ctx.pOutConfig = &hIvasRend->outputConfig; + ctx.pOutSampleRate = &hIvasRend->sampleRateOut; + ctx.pHeadRotData = &hIvasRend->headRotData; + ctx.pSplitRendBFI = &hIvasRend->splitRendBFI; + ctx.pSplitRenderConfig = &hIvasRend->splitRenderConfig; + + return ctx; +} + + +static ivas_error getRendInputNumChannels( + const void *rendInput, + Word16 *numInChannels ) +{ + /* Using a void pointer for this function to be reusable for any input type (input_ism, input_mc, input_sba). + Assumptions: - input_base is always the first member in the input struct */ + (void) rendInput; + + *numInChannels = 2; + + return IVAS_ERR_OK; +} + + +static ivas_error updateSplitPostRendPanGains( + input_split_post_rend *inputSplitPostRend, + const AUDIO_CONFIG outConfig, + ISAR_SPLIT_REND_CONFIG_DATA *hRendCfg ) +{ + ivas_error error; + rendering_context_isar rendCtx; + LC3PLUS_CONFIG config; + Word16 iNumBlocksPerFrame, iNumLCLDIterationsPerFrame; + + (void) outConfig; + + rendCtx = inputSplitPostRend->base.ctx; + isar_renderSplitGetMultiBinPoseData_fx( hRendCfg, &inputSplitPostRend->splitPostRendWrapper.multiBinPoseData, rendCtx.pHeadRotData->sr_pose_pred_axis ); + + config.high_res_mode_enabled = ( hRendCfg->lc3plus_highres != 0 ); + config.lc3plus_frame_duration_us = hRendCfg->codec_frame_size_ms * 1000; + config.isar_frame_duration_us = hRendCfg->isar_frame_size_ms * 1000; + + IF( GT_16( hRendCfg->codec_frame_size_ms, 0 ) ) + { + iNumLCLDIterationsPerFrame = (Word16) config.isar_frame_duration_us / ( 1000 * hRendCfg->codec_frame_size_ms ); + iNumLCLDIterationsPerFrame = max( 1, iNumLCLDIterationsPerFrame ); + iNumBlocksPerFrame = CLDFB_NO_COL_MAX * hRendCfg->codec_frame_size_ms / 20; + } + ELSE + { + iNumLCLDIterationsPerFrame = 1; + iNumBlocksPerFrame = CLDFB_NO_COL_MAX; + } + + config.channels = BINAURAL_CHANNELS; + config.samplerate = *inputSplitPostRend->base.ctx.pOutSampleRate; + + IF( hRendCfg->codec == ISAR_SPLIT_REND_CODEC_LCLD ) + { + IF( ( error = isar_splitBinLCLDDecOpen( &inputSplitPostRend->splitPostRendWrapper.hSplitBinLCLDDec, *inputSplitPostRend->base.ctx.pOutSampleRate, BINAURAL_CHANNELS, iNumBlocksPerFrame, iNumLCLDIterationsPerFrame ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE IF( hRendCfg->codec == ISAR_SPLIT_REND_CODEC_LC3PLUS ) + { + IF( ( error = ISAR_LC3PLUS_DEC_Open( config, &inputSplitPostRend->splitPostRendWrapper.hLc3plusDec ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + IF( ( error = isar_splitBinPostRendOpen( &inputSplitPostRend->splitPostRendWrapper.hBinHrSplitPostRend, &inputSplitPostRend->splitPostRendWrapper.multiBinPoseData, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +static ivas_error setRendInputActiveSplitPostRend( + void *input, + const AUDIO_CONFIG inConfig, + const IVAS_REND_InputId id, + ISAR_SPLIT_REND_CONFIG_DATA *hRendCfg ) +{ + ivas_error error; + rendering_context_isar rendCtx; + AUDIO_CONFIG outConfig; + input_split_post_rend *inputSplitPostRend; + + inputSplitPostRend = (input_split_post_rend *) input; + rendCtx = inputSplitPostRend->base.ctx; + outConfig = *rendCtx.pOutConfig; + + IF( ( error = allocateInputBaseBufferData_fx( &inputSplitPostRend->bufferData_fx, MAX_CLDFB_BIN_BUFFER_LENGTH ) ) != IVAS_ERR_OK ) + { + return error; + } + + initRendInputBase_fx( &inputSplitPostRend->base, inConfig, id, rendCtx, inputSplitPostRend->bufferData_fx, MAX_CLDFB_BIN_BUFFER_LENGTH ); + + inputSplitPostRend->numCachedSamples = 0; + + if ( ( error = updateSplitPostRendPanGains( inputSplitPostRend, outConfig, hRendCfg ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +static void clearInputSplitRend( + input_split_post_rend *inputSplitRend ) +{ + rendering_context_isar rendCtx; + + rendCtx = inputSplitRend->base.ctx; + + freeInputBaseBufferData_fx( &inputSplitRend->bufferData_fx ); + + initRendInputBase_fx( &inputSplitRend->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); + + IF( inputSplitRend->splitPostRendWrapper.hBinHrSplitPostRend != NULL ) + { + isar_splitBinPostRendClose( &inputSplitRend->splitPostRendWrapper.hBinHrSplitPostRend ); + } + + IF( inputSplitRend->splitPostRendWrapper.hSplitBinLCLDDec != NULL ) + { + isar_splitBinLCLDDecClose( &inputSplitRend->splitPostRendWrapper.hSplitBinLCLDDec ); + } + + IF( inputSplitRend->splitPostRendWrapper.hLc3plusDec != NULL ) + { + ISAR_LC3PLUS_DEC_Close( &inputSplitRend->splitPostRendWrapper.hLc3plusDec ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ISAR_POST_REND_open() + * + * + *------------------------------------------------------------------------*/ + +ivas_error ISAR_POST_REND_open( + ISAR_POST_REND_HANDLE *phIvasRend, /* i/o: Pointer to renderer handle */ + const Word32 outputSampleRate, /* i : output sampling rate */ + const AUDIO_CONFIG outConfig, /* i : output audio config */ + const bool asHrtfBinary, /* i : load hrtf binary file */ + const Word16 nonDiegeticPan, /* i : non-diegetic object flag */ + const Word32 nonDiegeticPanGain, /* i : non-diegetic panning gain */ + const Word16 num_subframes ) /* i : number of subframes */ +{ + Word16 i; + ISAR_POST_REND_HANDLE hIvasRend; + ivas_error error; + Word16 numOutChannels; + + (void) asHrtfBinary; + (void) nonDiegeticPan; + (void) nonDiegeticPanGain; + + /* Validate function arguments */ + IF( phIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( ( error = validateOutputSampleRate( outputSampleRate, outConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + *phIvasRend = (ISAR_POST_REND_HANDLE) malloc( sizeof( struct ISAR_POST_REND ) ); + IF( *phIvasRend == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + hIvasRend = *phIvasRend; + hIvasRend->sampleRateOut = outputSampleRate; + hIvasRend->outputConfig = outConfig; + hIvasRend->hLimiter = NULL; + hIvasRend->num_subframes = 1; +#ifdef DEBUGGING + hIvasRend->numClipping = 0; +#endif + hIvasRend->num_subframes = num_subframes; + + /* Initialize limiter */ + IF( ( error = ISAR_POST_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF( ( error = initLimiter( &hIvasRend->hLimiter, numOutChannels, outputSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Initialize headrotation data */ + IF( ( error = initHeadRotation( hIvasRend ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Initialize inputs */ + FOR( i = 0; i < RENDERER_MAX_BIN_INPUTS; ++i ) + { + initRendInputBase_fx( &hIvasRend->inputsSplitPost[i].base, IVAS_AUDIO_CONFIG_INVALID, 0, getRendCtx( hIvasRend ), NULL, 0 ); + + isar_init_split_post_rend_handles( &hIvasRend->inputsSplitPost[i].splitPostRendWrapper ); + + hIvasRend->splitRendBFI = 0; + hIvasRend->inputsSplitPost[i].bufferData_fx = NULL; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_NumOutChannels() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_POST_REND_NumOutChannels( + ISAR_POST_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + Word16 *numOutChannels /* o : number of output channels */ +) +{ + /* Validate function arguments */ + IF( hIvasRend == NULL || numOutChannels == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *numOutChannels = 2; + + return IVAS_ERR_OK; +} + + +static IVAS_REND_InputId makeInputId( + AUDIO_CONFIG config, + const Word32 inputIndex ) +{ + /* Put config type in second byte (from LSB), put index + 1 in first byte + * + * Index is incremented here so that a valid ID can never be 0. */ + return (IVAS_REND_InputId) ( ( ( (UWord32) isar_getAudioConfigType( config ) ) << 8 ) | ( inputIndex + 1 ) ); +} + + +static ivas_error getInputById( + ISAR_POST_REND_HANDLE hIvasRend, + const IVAS_REND_InputId inputId, + void **ppInput ) +{ + Word32 inputIndex; + IVAS_REND_AudioConfigType configType; + input_base_isar *pInputBase; + + /* Reverse makeInputId() */ + inputIndex = ( inputId & 0xFF ) - 1; + configType = ( inputId & 0xFF00 ) >> 8; + + /* Validate values derived from input ID */ + IF( inputIndex < 0 ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + + SWITCH( configType ) + { + case ISAR_POST_REND_AUDIO_CONFIG_TYPE_BINAURAL: + if ( inputIndex > RENDERER_MAX_BIN_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsSplitPost[inputIndex].base; + BREAK; + default: + return IVAS_ERR_INVALID_INPUT_ID; + } + + /* Ensure input ID matches and that input is active */ + IF( pInputBase->id != inputId || pInputBase->inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + + /* Validation done, set value via output parameter */ + *ppInput = pInputBase; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_SetInputGain() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_POST_REND_SetInputGain( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const ISAR_POST_REND_InputId inputId, /* i : ID of the input */ + const Word32 gain /* i : linear gain (not in dB) */ +) +{ + input_base_isar *inputBase; + ivas_error error; + + /* Validate function arguments */ + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + { + printf( "Hoo\n" ); + return error; + } + + inputBase->gain_fx = gain; + + return IVAS_ERR_OK; +} + + +static ivas_error getConstInputById( + ISAR_POST_REND_CONST_HANDLE hIvasRend, + const ISAR_POST_REND_InputId inputId, + const void **ppInput ) +{ + Word32 inputIndex; + IVAS_REND_AudioConfigType configType; + const input_base_isar *pInputBase; + + /* Reverse makeInputId() */ + inputIndex = ( inputId & 0xFF ) - 1; + configType = ( inputId & 0xFF00 ) >> 8; + + /* Validate values derived from input ID */ + IF( inputIndex < 0 ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + SWITCH( configType ) + { + case ISAR_POST_REND_AUDIO_CONFIG_TYPE_BINAURAL: + IF( inputIndex > RENDERER_MAX_BIN_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsSplitPost[inputIndex].base; + BREAK; + default: + return IVAS_ERR_INVALID_INPUT_ID; + } + + /* Ensure input ID matches and that input is active */ + IF( pInputBase->id != inputId || pInputBase->inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + + /* Validation done, set value via output parameter */ + *ppInput = pInputBase; + + return IVAS_ERR_OK; +} + + +static ivas_error findFreeInputSlot( + const void *inputs, + const Word32 inputStructSize, + const Word32 maxInputs, + Word32 *inputIndex ) +{ + /* Using a void pointer and a separately provided size is a hack for this function + to be reusable for arrays of any input type (input_ism, input_mc, input_sba, input_masa). + Assumptions: + - input_base is always the first member in the input struct + - provided size is correct + */ + + Word32 i; + bool canAddInput; + const UWord8 *pByte; + const input_base_isar *pInputBase; + + canAddInput = false; + pByte = inputs; + /* Find first unused input in array */ + FOR( i = 0; i < maxInputs; ++i ) + { + pInputBase = (const input_base_isar *) pByte; + + IF( pInputBase->inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + *inputIndex = i; + canAddInput = true; + BREAK; + } + pByte += inputStructSize; + } + + IF( !canAddInput ) + { + return IVAS_ERR_TOO_MANY_INPUTS; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_AddInput() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_POST_REND_AddInput( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_AUDIO_CONFIG inConfig, /* i : audio config for a new input */ + ISAR_POST_REND_InputId *inputId /* o : ID of the new input */ +) +{ + ivas_error error; + Word32 maxNumInputsOfType; + void *inputsArray; + Word32 inputStructSize; + ivas_error ( *activateInput )( void *, AUDIO_CONFIG, IVAS_REND_InputId, ISAR_SPLIT_REND_CONFIG_DATA * ); + Word32 inputIndex; + + /* Validate function arguments */ + IF( hIvasRend == NULL || inputId == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + SWITCH( isar_getAudioConfigType( inConfig ) ) + { + case ISAR_POST_REND_AUDIO_CONFIG_TYPE_BINAURAL: + maxNumInputsOfType = RENDERER_MAX_BIN_INPUTS; + inputsArray = hIvasRend->inputsSplitPost; + inputStructSize = sizeof( *hIvasRend->inputsSplitPost ); + activateInput = setRendInputActiveSplitPostRend; + BREAK; + default: + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + + /* Find first free input in array corresponding to input type */ + IF( ( error = findFreeInputSlot( inputsArray, inputStructSize, maxNumInputsOfType, &inputIndex ) ) != IVAS_ERR_OK ) + { + return error; + } + + *inputId = makeInputId( inConfig, inputIndex ); + IF( ( error = activateInput( (UWord8 *) inputsArray + inputStructSize * inputIndex, inConfig, *inputId, &hIvasRend->splitRenderConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_GetInputNumChannels() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_POST_REND_GetInputNumChannels( + ISAR_POST_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + const ISAR_POST_REND_InputId inputId, /* i : ID of the input */ + Word16 *numChannels /* o : number of channels of the input */ +) +{ + ivas_error error; + const input_base_isar *pInput; + + /* Validate function arguments */ + IF( hIvasRend == NULL || numChannels == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( ( error = getConstInputById( hIvasRend, inputId, (const void **) &pInput ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF( ( error = getRendInputNumChannels( pInput, numChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_GetDelay() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_POST_REND_GetDelay( + ISAR_POST_REND_CONST_HANDLE hIvasRend, /* i : Renderer state */ + Word16 *nSamples, /* o : Renderer delay in samples */ + Word32 *timeScale /* o : Time scale of the delay, equal to renderer output sampling rate */ +) +{ + Word16 i; + Word32 latency_ns; + Word32 max_latency_ns; + + /* Validate function arguments */ + IF( hIvasRend == NULL || nSamples == NULL || timeScale == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *timeScale = hIvasRend->sampleRateOut; + *nSamples = 0; + max_latency_ns = 0; + + /* Compute the maximum delay across all inputs */ + FOR( i = 0; i < RENDERER_MAX_BIN_INPUTS; i++ ){ + IF( hIvasRend->inputsSplitPost[i].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ){ + latency_ns = 0; + IF( hIvasRend->inputsSplitPost[i].splitPostRendWrapper.hLc3plusDec != NULL ) + { + Word32 lc3plusDelaySamples; + ISAR_LC3PLUS_DEC_GetDelay( hIvasRend->inputsSplitPost[i].splitPostRendWrapper.hLc3plusDec, &lc3plusDelaySamples ); + latency_ns = (Word32) ( ( ( (Word64) lc3plusDelaySamples * 1000000000 ) + ( *timeScale / 2 ) ) / *timeScale ); + } + IF( hIvasRend->inputsSplitPost[i].splitPostRendWrapper.multiBinPoseData.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) + { + latency_ns += IVAS_FB_DEC_DELAY_NS; + } + ELSE IF( hIvasRend->inputsSplitPost[i].splitPostRendWrapper.hSplitBinLCLDDec != NULL ) + { + latency_ns += IVAS_FB_DEC_DELAY_NS; + } + max_latency_ns = max( max_latency_ns, latency_ns ); +} +} + +*nSamples = (Word16) ( ( ( (Word64) max_latency_ns * *timeScale ) + 500000000 ) / 1000000000 ); + +return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_FeedInputAudio() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_POST_REND_FeedInputAudio( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const ISAR_POST_REND_InputId inputId, /* i : ID of the input */ + const ISAR_POST_REND_ReadOnlyAudioBuffer inputAudio /* i : buffer with input audio */ +) +{ + ivas_error error; + input_base_isar *inputBase; + Word16 numInputChannels; + Word16 cldfb2tdSampleFact; + + /* Validate function arguments */ + IF( hIvasRend == NULL || inputAudio.data_fx == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + cldfb2tdSampleFact = ( inputAudio.config.is_cldfb ) ? 2 : 1; + + test(); + test(); + test(); + test(); + IF( LE_16( inputAudio.config.numSamplesPerChannel, 0 ) || ( LT_16( L_FRAME_MAX, inputAudio.config.numSamplesPerChannel ) && EQ_16( inputAudio.config.is_cldfb, 0 ) ) || + ( LT_16( DEPR_i_mult( L_FRAME_MAX, cldfb2tdSampleFact ), inputAudio.config.numSamplesPerChannel ) && EQ_16( inputAudio.config.is_cldfb, 1 ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Buffer size outside of supported range" ); + } + + IF( LE_16( inputAudio.config.numChannels, 0 ) || LT_16( MAX_INPUT_CHANNELS, inputAudio.config.numChannels ) ) + { + return IVAS_ERR_WRONG_NUM_CHANNELS; + } + + IF( isar_getAudioConfigType( hIvasRend->outputConfig ) == ISAR_POST_REND_AUDIO_CONFIG_TYPE_BINAURAL && + hIvasRend->outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && + hIvasRend->outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM && + ( inputAudio.config.numSamplesPerChannel * 1000 / cldfb2tdSampleFact ) != ( BINAURAL_RENDERING_FRAME_SIZE_MS * hIvasRend->num_subframes ) * hIvasRend->sampleRateOut ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Binaural rendering requires specific frame size" ); + } + + IF( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + { + printf( "Foo\n" ); + return error; + } + + IF( ( error = getRendInputNumChannels( inputBase, &numInputChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF( numInputChannels != inputAudio.config.numChannels ) + { + return IVAS_ERR_WRONG_NUM_CHANNELS; + } + + inputBase->inputBuffer.config = inputAudio.config; + + mvl2l( inputAudio.data_fx, inputBase->inputBuffer.data_fx, inputAudio.config.numSamplesPerChannel * inputAudio.config.numChannels ); + + inputBase->numNewSamplesPerChannel = inputAudio.config.numSamplesPerChannel / cldfb2tdSampleFact; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_InitConfig() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_POST_REND_InitConfig( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const AUDIO_CONFIG outAudioConfig /* i : output audioConfig */ +) +{ + bool rendererConfigEnabled; + + rendererConfigEnabled = ( isar_getAudioConfigType( outAudioConfig ) == ISAR_POST_REND_AUDIO_CONFIG_TYPE_BINAURAL ); + + IF( rendererConfigEnabled ) + { + hIvasRend->rendererConfigEnabled = 1; + } + ELSE + { + hIvasRend->rendererConfigEnabled = 0; + } + + IF( rendererConfigEnabled ) + { + hIvasRend->splitRenderConfig.splitRendBitRate = SPLIT_REND_768k; + hIvasRend->splitRenderConfig.dof = 3; + hIvasRend->splitRenderConfig.hq_mode = 0; + hIvasRend->splitRenderConfig.codec_delay_ms = 0; + hIvasRend->splitRenderConfig.codec_frame_size_ms = 0; /* 0 means "use default for selected codec" */ + hIvasRend->splitRenderConfig.isar_frame_size_ms = 0; /* 0 means "use default for selected codec" */ + hIvasRend->splitRenderConfig.codec = ISAR_SPLIT_REND_CODEC_DEFAULT; + hIvasRend->splitRenderConfig.poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB; + hIvasRend->splitRenderConfig.rendererSelection = IVAS_BIN_RENDERER_TYPE_DEFAULT; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_GetRenderConfig() + * + * + *-------------------------------------------------------------------*/ + +Word16 ISAR_POST_REND_GetRenderConfig( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + const ISAR_SPLIT_REND_CONFIG_HANDLE splitRenderConfig /* o : Render configuration handle */ +) +{ + ISAR_SPLIT_REND_CONFIG_DATA hRCin; + + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hRCin = hIvasRend->splitRenderConfig; + + splitRenderConfig->splitRendBitRate = SPLIT_REND_768k; + splitRenderConfig->dof = 3; + splitRenderConfig->hq_mode = 0; + splitRenderConfig->codec_delay_ms = 0; + splitRenderConfig->codec_frame_size_ms = 0; /* 0 means "use default for selected codec" */ + splitRenderConfig->isar_frame_size_ms = 0; /* 0 means "use default for selected codec" */ + splitRenderConfig->codec = ISAR_SPLIT_REND_CODEC_DEFAULT; + splitRenderConfig->poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB; + splitRenderConfig->rendererSelection = hRCin.rendererSelection; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_FeedSplitBinauralBitstream() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_POST_REND_FeedSplitBinauralBitstream( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + ISAR_POST_REND_BitstreamBuffer *hBits /* i : buffer for input bitstream */ +) +{ + ivas_error error; + input_base_isar *inputBase; + input_split_post_rend *inputSplitPostRend; + + /* Validate function arguments */ + IF( hIvasRend == NULL || hBits == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + { + printf( "Goo\n" ); + return error; + } + + inputSplitPostRend = (input_split_post_rend *) inputBase; + inputSplitPostRend->hBits = hBits; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_SetHeadRotation() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_POST_REND_SetHeadRotation( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ + const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ + const ISAR_SPLIT_REND_ROT_AXIS rot_axis, /* i : external control for rotation axis for split rendering */ + const Word16 sf_idx /* i : subframe index */ +) +{ + IVAS_QUATERNION rotQuat; + + /* Validate function arguments */ + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( isar_getAudioConfigType( hIvasRend->outputConfig ) != ISAR_POST_REND_AUDIO_CONFIG_TYPE_BINAURAL ) + { + /* Head rotation can be set only with binaural output */ + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + + hIvasRend->headRotData.headRotEnabled = 1; + + /* check for Euler angle signaling */ + IF( EQ_32( headRot.w_fx, -12582912 ) && EQ_32( headRot.q_fact, Q22 ) ) + { + Euler2Quat_fx( deg2rad_fx( headRot.x_fx ), deg2rad_fx( headRot.y_fx ), deg2rad_fx( headRot.z_fx ), &rotQuat ); + modify_Quat_q_fx( &rotQuat, &rotQuat, Q29 ); + } + ELSE + { + rotQuat = headRot; + } + + hIvasRend->headRotData.headPositions[sf_idx] = rotQuat; + hIvasRend->headRotData.Pos[sf_idx] = Pos; + hIvasRend->headRotData.sr_pose_pred_axis = rot_axis; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_SetSplitRendBFI() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_POST_REND_SetSplitRendBFI( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const Word16 bfi /* i : BFI flag */ +) +{ + hIvasRend->splitRendBFI = bfi; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * Local functions + *-------------------------------------------------------------------*/ + +static ivas_error splitBinLc3plusDecode( + ISAR_SPLIT_POST_REND_WRAPPER *hSplitBin, + ISAR_SPLIT_REND_BITS_HANDLE bits, + Word32 outputBuffer[BINAURAL_CHANNELS][L_FRAME48k], + const Word16 SplitRendBFI ) +{ + ivas_error error; + Word32 *channel_ptrs[MAX_HEAD_ROT_POSES * 2]; + Word32 lc3plusBitstreamSize; + + push_wmops( "splitBinLc3plusDecode" ); + assert( hSplitBin->hLc3plusDec != NULL ); + + for ( Word16 i = 0; i < BINAURAL_CHANNELS * hSplitBin->multiBinPoseData.num_poses; ++i ) + { + channel_ptrs[i] = outputBuffer[i]; + } + + if ( SplitRendBFI == 0 ) + { + /* Find next byte boundary */ + while ( bits->bits_read % 8 != 0 ) + { + ++bits->bits_read; + } + /* Size is in bytes */ + assert( ( bits->bits_written - bits->bits_read ) % 8 == 0 ); + lc3plusBitstreamSize = ( bits->bits_written - bits->bits_read ) / 8; + + if ( ( error = ISAR_LC3PLUS_DEC_Decode( hSplitBin->hLc3plusDec, &bits->bits_buf[bits->bits_read / 8], lc3plusBitstreamSize, channel_ptrs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = ISAR_LC3PLUS_DEC_Conceal( hSplitBin->hLc3plusDec, channel_ptrs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + pop_wmops(); + return IVAS_ERR_OK; +} + + +static ivas_error renderSplitBinauralWithPostRot( + input_split_post_rend *splitBinInput, + IVAS_REND_AudioBuffer outAudio, + const Word16 SplitRendBFI, + const Word16 num_subframes ) +{ + Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + ivas_error error; + Word32 Cldfb_RealBuffer_Binaural_5ms_fx[MAX_PARAM_SPATIAL_SUBFRAMES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] = { 0 }; + Word32 Cldfb_ImagBuffer_Binaural_5ms_fx[MAX_PARAM_SPATIAL_SUBFRAMES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] = { 0 }; + + IVAS_QUATERNION QuaternionsPost[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word16 sf_idx, ch_idx; + ISAR_SPLIT_REND_BITS_DATA bits; + Word32 tmpCrendBuffer_fx[BINAURAL_CHANNELS][L_FRAME48k] = { 0 }; + Word32 tmpCrendBuffer_sf_fx[BINAURAL_CHANNELS][L_FRAME48k] = { 0 }; + + ISAR_SPLIT_POST_REND_WRAPPER *hSplitBin; + Word8 isPostRendInputCldfb; + Word16 chnlIdx, slotIdx, smplIdx; + Word16 preRendFrameSize_ms; + Word16 outBufNumSamplesPerChannel, outBufNumColPerChannel; + Word16 numSamplesPerChannelCacheSize, numColPerChannelCacheSize; + + Word32 *readPtr_fx, *writePtr_fx; + Word16 Q_cldfb_final[MAX_PARAM_SPATIAL_SUBFRAMES] = { 0 }; + Word16 Q_out[MAX_PARAM_SPATIAL_SUBFRAMES][BINAURAL_CHANNELS] = { 0 }; + + Word16 iNumBlocksPerFrame, iNumLCLDIterationsPerFrame; + const ISAR_POST_REND_HeadRotData *pHeadRotData; + + isPostRendInputCldfb = 0; + push_wmops( "renderSplitBinauralWithPostRot" ); + error = IVAS_ERR_OK; + + if ( outAudio.config.numSamplesPerChannel / *splitBinInput->base.ctx.pOutSampleRate > splitBinInput->hBits->config.isar_frame_size_ms ) + { + return IVAS_ERR_INTERNAL_FATAL; + } + + pHeadRotData = splitBinInput->base.ctx.pHeadRotData; + hSplitBin = &splitBinInput->splitPostRendWrapper; + convertBitsBufferToInternalBitsBuff( *splitBinInput->hBits, &bits ); + + + iNumLCLDIterationsPerFrame = 1; + iNumBlocksPerFrame = CLDFB_NO_COL_MAX; + IF( splitBinInput->splitPostRendWrapper.hSplitBinLCLDDec != NULL ) + { + iNumBlocksPerFrame = splitBinInput->splitPostRendWrapper.hSplitBinLCLDDec->iNumBlocks; + iNumLCLDIterationsPerFrame = splitBinInput->splitPostRendWrapper.hSplitBinLCLDDec->iNumIterations; + } + + outBufNumSamplesPerChannel = outAudio.config.numSamplesPerChannel / num_subframes; + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + QuaternionsPost[sf_idx] = pHeadRotData->headPositions[sf_idx]; + } + + IF( !SplitRendBFI ) + { + hSplitBin->first_good_frame_received = 1; + } + + IF( EQ_16( hSplitBin->first_good_frame_received, 1 ) ) + { + IF( bits.pose_correction == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) + { + IF( !SplitRendBFI ) + { +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + isar_splitBinPostRendMdDec_fx( &bits, hSplitBin->hBinHrSplitPostRend, &hSplitBin->multiBinPoseData, hSplitBin->hBinHrSplitPreRend ); +#else + isar_splitBinPostRendMdDec_fx( &bits, hSplitBin->hBinHrSplitPostRend, &hSplitBin->multiBinPoseData ); +#endif + } + } + + /*copy pose correction after MD is parsed*/ + hSplitBin->multiBinPoseData.poseCorrectionMode = bits.pose_correction; + + /* decode audio */ + IF( splitBinInput->base.inConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) + { + IF( bits.codec == ISAR_SPLIT_REND_CODEC_LCLD ) + { + isPostRendInputCldfb = 1; + } + numSamplesPerChannelCacheSize = (Word16) ( *splitBinInput->base.ctx.pOutSampleRate * bits.isar_frame_size_ms / 1000 ) - outBufNumSamplesPerChannel; + + outBufNumColPerChannel = MAX_PARAM_SPATIAL_SUBFRAMES; + numColPerChannelCacheSize = sub( DEPR_i_mult( iNumBlocksPerFrame, iNumLCLDIterationsPerFrame ), outBufNumColPerChannel ); + + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + IF( splitBinInput->numCachedSamples == 0 ) + { + IF( bits.codec == ISAR_SPLIT_REND_CODEC_LCLD ) + { + isar_splitBinLCLDDecProcess( hSplitBin->hSplitBinLCLDDec, &bits, Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, &Q_cldfb_final[sf_idx], SplitRendBFI ); // Q_cldfb_final + + hSplitBin->Q_last = Q_cldfb_final[sf_idx]; + /* copy data over to 5ms buffer */ + FOR( chnlIdx = 0; chnlIdx < BINAURAL_CHANNELS; ++chnlIdx ) + { + FOR( slotIdx = 0; slotIdx < 4 /*CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES*/; ++slotIdx ) + { + mvl2l( Cldfb_RealBuffer_Binaural_fx[chnlIdx][slotIdx], Cldfb_RealBuffer_Binaural_5ms_fx[sf_idx][chnlIdx][slotIdx], CLDFB_NO_CHANNELS_MAX ); + mvl2l( Cldfb_ImagBuffer_Binaural_fx[chnlIdx][slotIdx], Cldfb_ImagBuffer_Binaural_5ms_fx[sf_idx][chnlIdx][slotIdx], CLDFB_NO_CHANNELS_MAX ); + } + } + + /* cache the remaining 15ms */ + splitBinInput->numCachedSamples = numColPerChannelCacheSize; + writePtr_fx = splitBinInput->bufferData_fx; + FOR( slotIdx = 4 /*CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES*/; slotIdx < DEPR_i_mult( iNumBlocksPerFrame, iNumLCLDIterationsPerFrame ); ++slotIdx ) + { + FOR( chnlIdx = 0; chnlIdx < BINAURAL_CHANNELS; ++chnlIdx ) + { + FOR( smplIdx = 0; smplIdx < CLDFB_NO_CHANNELS_MAX; ++smplIdx ) + { + *writePtr_fx++ = Cldfb_RealBuffer_Binaural_fx[chnlIdx][slotIdx][smplIdx]; + } + FOR( smplIdx = 0; smplIdx < CLDFB_NO_CHANNELS_MAX; ++smplIdx ) + { + *writePtr_fx++ = Cldfb_ImagBuffer_Binaural_fx[chnlIdx][slotIdx][smplIdx]; + } + } + } + } + ELSE + { + Q_out[sf_idx][0] = 0; + Q_out[sf_idx][1] = 0; + if ( ( error = splitBinLc3plusDecode( hSplitBin, &bits, tmpCrendBuffer_fx, + SplitRendBFI ) ) != IVAS_ERR_OK ) // Q0 + { + return error; + } + hSplitBin->Q_last = Q_out[sf_idx][0]; + + /* cache the remaining 15ms */ + splitBinInput->numCachedSamples = numSamplesPerChannelCacheSize; + mvl2l( &tmpCrendBuffer_fx[0][outBufNumSamplesPerChannel], splitBinInput->bufferData_fx, numSamplesPerChannelCacheSize ); + mvl2l( &tmpCrendBuffer_fx[1][outBufNumSamplesPerChannel], splitBinInput->bufferData_fx + numSamplesPerChannelCacheSize, numSamplesPerChannelCacheSize ); + } + } + ELSE + { + /* copy from cache */ + IF( bits.codec == ISAR_SPLIT_REND_CODEC_LCLD ) + { + Word16 readOffset = sub( numColPerChannelCacheSize, splitBinInput->numCachedSamples ); + readPtr_fx = splitBinInput->bufferData_fx; + Q_cldfb_final[sf_idx] = hSplitBin->Q_last; + isPostRendInputCldfb = 1; + + readPtr_fx += 2 * readOffset * CLDFB_NO_CHANNELS_MAX * BINAURAL_CHANNELS; + FOR( slotIdx = 0; slotIdx < 4 /*CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES*/; ++slotIdx ) + { + FOR( chnlIdx = 0; chnlIdx < BINAURAL_CHANNELS; ++chnlIdx ) + { + FOR( smplIdx = 0; smplIdx < CLDFB_NO_CHANNELS_MAX; ++smplIdx ) + { + Cldfb_RealBuffer_Binaural_5ms_fx[sf_idx][chnlIdx][slotIdx][smplIdx] = *readPtr_fx++; + } + FOR( smplIdx = 0; smplIdx < CLDFB_NO_CHANNELS_MAX; ++smplIdx ) + { + Cldfb_ImagBuffer_Binaural_5ms_fx[sf_idx][chnlIdx][slotIdx][smplIdx] = *readPtr_fx++; + } + } + } + + splitBinInput->numCachedSamples -= outBufNumColPerChannel; + } + ELSE + { + Word16 readOffset = numSamplesPerChannelCacheSize - splitBinInput->numCachedSamples; + mvl2l( splitBinInput->bufferData_fx + readOffset, &tmpCrendBuffer_fx[0][sf_idx * outBufNumSamplesPerChannel], outBufNumSamplesPerChannel ); + mvl2l( splitBinInput->bufferData_fx + readOffset + numSamplesPerChannelCacheSize, &tmpCrendBuffer_fx[1][sf_idx * outBufNumSamplesPerChannel], outBufNumSamplesPerChannel ); + Q_out[sf_idx][0] = hSplitBin->Q_last; + Q_out[sf_idx][1] = hSplitBin->Q_last; + splitBinInput->numCachedSamples -= outBufNumSamplesPerChannel; + } + } + } + } + ELSE + { + copyBufferTo2dArray_fx( splitBinInput->base.inputBuffer, tmpCrendBuffer_fx ); + IF( splitBinInput->numCachedSamples == 0 ) + { + preRendFrameSize_ms = splitBinInput->base.ctx.pSplitRenderConfig->isar_frame_size_ms; + numSamplesPerChannelCacheSize = (Word16) ( *splitBinInput->base.ctx.pOutSampleRate * preRendFrameSize_ms / 1000 ); + numSamplesPerChannelCacheSize -= outAudio.config.numSamplesPerChannel; + splitBinInput->numCachedSamples = numSamplesPerChannelCacheSize; + } + ELSE + { + splitBinInput->numCachedSamples -= outAudio.config.numSamplesPerChannel; + } + } + + /* apply pose correction if enabled */ + FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) + { + IF( bits.pose_correction == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE && isPostRendInputCldfb ) + { + /* 0DOF with LCLD codec requires CLDFB synthesis */ + Word16 slot_idx; + + FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) + { + Word32 *RealBuffer_fx[CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 *ImagBuffer_fx[CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES]; + Word16 scaleFactor = 31, Q_cldfb; + + FOR( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + RealBuffer_fx[slot_idx] = Cldfb_RealBuffer_Binaural_5ms_fx[sf_idx][ch_idx][slot_idx]; + ImagBuffer_fx[slot_idx] = Cldfb_ImagBuffer_Binaural_5ms_fx[sf_idx][ch_idx][slot_idx]; + + scaleFactor = s_min( scaleFactor, s_min( getScaleFactor32( RealBuffer_fx[slot_idx], CLDFB_NO_CHANNELS_MAX ), getScaleFactor32( ImagBuffer_fx[slot_idx], CLDFB_NO_CHANNELS_MAX ) ) ); + } + scaleFactor = sub( scaleFactor, 6 ); // guarded bits + + FOR( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) + { + Scale_sig32( RealBuffer_fx[slot_idx], CLDFB_NO_CHANNELS_MAX, scaleFactor ); + Scale_sig32( ImagBuffer_fx[slot_idx], CLDFB_NO_CHANNELS_MAX, scaleFactor ); + } + Q_cldfb = scaleFactor + Q_cldfb_final[sf_idx]; + Scale_sig32( hSplitBin->hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hSplitBin->hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( sub( Q_cldfb, 1 ), Q11 ) ); + cldfbSynthesis_ivas_fx( RealBuffer_fx, + ImagBuffer_fx, + &( tmpCrendBuffer_fx[ch_idx][sf_idx * outBufNumSamplesPerChannel] ), + hSplitBin->hBinHrSplitPostRend->cldfbSyn[0]->no_channels * CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, + 0, + 0, + hSplitBin->hBinHrSplitPostRend->cldfbSyn[ch_idx] ); // Q_cldfb - 1 + Scale_sig32( hSplitBin->hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hSplitBin->hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( Q11, sub( Q_cldfb, 1 ) ) ); + Q_out[sf_idx][ch_idx] = sub( Q_cldfb, 1 ); + } + } + ELSE IF( bits.pose_correction == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) + { + mvl2l( &tmpCrendBuffer_fx[0][sf_idx * outBufNumSamplesPerChannel], tmpCrendBuffer_sf_fx[0], outBufNumSamplesPerChannel ); + mvl2l( &tmpCrendBuffer_fx[1][sf_idx * outBufNumSamplesPerChannel], tmpCrendBuffer_sf_fx[1], outBufNumSamplesPerChannel ); + + isar_rend_CldfbSplitPostRendProcess( hSplitBin->hBinHrSplitPostRend, &hSplitBin->multiBinPoseData, QuaternionsPost[sf_idx], Cldfb_RealBuffer_Binaural_5ms_fx[sf_idx], Cldfb_ImagBuffer_Binaural_5ms_fx[sf_idx], Q_cldfb_final[sf_idx], tmpCrendBuffer_sf_fx, Q_out[sf_idx], isPostRendInputCldfb ); // Q_out[2] + + mvl2l( tmpCrendBuffer_sf_fx[0], &tmpCrendBuffer_fx[0][sf_idx * outBufNumSamplesPerChannel], outBufNumSamplesPerChannel ); + mvl2l( tmpCrendBuffer_sf_fx[1], &tmpCrendBuffer_fx[1][sf_idx * outBufNumSamplesPerChannel], outBufNumSamplesPerChannel ); + } + } + } + ELSE + { + + IF( splitBinInput->numCachedSamples == 0 ) + { + numSamplesPerChannelCacheSize = (Word16) ( *splitBinInput->base.ctx.pOutSampleRate * bits.isar_frame_size_ms / 1000 ) - outAudio.config.numSamplesPerChannel; + splitBinInput->numCachedSamples = numSamplesPerChannelCacheSize; + move16(); + } + ELSE + { + splitBinInput->numCachedSamples = sub( splitBinInput->numCachedSamples, outAudio.config.numSamplesPerChannel ); + } + + IF( splitBinInput->base.inConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) + { + FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) + { + set_l( tmpCrendBuffer_fx[ch_idx], 0, outAudio.config.numSamplesPerChannel ); + } + } + ELSE + { + copyBufferTo2dArray_fx( splitBinInput->base.inputBuffer, tmpCrendBuffer_fx ); + } + } + + convertInternalBitsBuffToBitsBuffer( splitBinInput->hBits, bits ); + + Word16 Q_max = 0, Q_temp; + FOR( Word16 i = 0; i < num_subframes; i++ ) + { + maximum_s( Q_out[i], BINAURAL_CHANNELS, &Q_temp ); + Q_max = s_max( Q_max, Q_temp ); + } + Q_max = s_min( Q_max, Q13 ); + accumulate2dArrayToBuffer_fx( tmpCrendBuffer_fx, Q_out, Q_max, &outAudio, num_subframes, outBufNumSamplesPerChannel ); + *outAudio.pq_fact = Q_max; + + pop_wmops(); + return error; +} + + +static ivas_error renderInputSplitBin( + input_split_post_rend *splitBinInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio, + const Word16 SplitRendBFI, + const Word16 num_subframes ) +{ + ivas_error error; + IVAS_REND_AudioBuffer inAudio; + + inAudio = splitBinInput->base.inputBuffer; + + splitBinInput->base.numNewSamplesPerChannel = 0; + + /* Apply input gain to new audio */ + v_multc_fx( inAudio.data_fx, + splitBinInput->base.gain_fx, + inAudio.data_fx, + inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); + + SWITCH( outConfig ) + { + case IVAS_AUDIO_CONFIG_BINAURAL: + error = renderSplitBinauralWithPostRot( splitBinInput, outAudio, SplitRendBFI, num_subframes ); + BREAK; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + + return error; +} + + +static ivas_error renderActiveInputsSplitBin( + ISAR_POST_REND_HANDLE hIvasRend, + IVAS_REND_AudioBuffer outAudio ) +{ + Word16 i; + input_split_post_rend *pCurrentInput; + ivas_error error; + + pCurrentInput = hIvasRend->inputsSplitPost; + FOR( i = 0; i < RENDERER_MAX_BIN_INPUTS; ++i ) + { + IF( pCurrentInput->base.inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + /* Skip inactive inputs */ + ++pCurrentInput; + continue; + } + + IF( ( error = renderInputSplitBin( pCurrentInput, hIvasRend->outputConfig, outAudio, hIvasRend->splitRendBFI, hIvasRend->num_subframes ) ) != IVAS_ERR_OK ) + { + return error; + } + ++pCurrentInput; + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_getSamples() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_POST_REND_getSamples( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ +) +{ + ivas_error error; + Word16 numOutChannels; + Word16 cldfb2tdSampleFact; + + /* Validate function arguments */ + IF( hIvasRend == NULL || outAudio.data_fx == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + cldfb2tdSampleFact = ( outAudio.config.is_cldfb ) ? 2 : 1; + + test(); + test(); + test(); + test(); + IF( outAudio.config.numSamplesPerChannel <= 0 || ( L_FRAME_MAX < outAudio.config.numSamplesPerChannel && outAudio.config.is_cldfb == 0 ) || + ( ( L_FRAME_MAX * cldfb2tdSampleFact ) < outAudio.config.numSamplesPerChannel && outAudio.config.is_cldfb == 1 ) ) + { + return IVAS_ERR_INVALID_BUFFER_SIZE; + } + + IF( LT_16( outAudio.config.numChannels, 0 ) || LT_16( MAX_OUTPUT_CHANNELS, outAudio.config.numChannels ) ) + { + return IVAS_ERR_WRONG_NUM_CHANNELS; + } + + IF( isar_getAudioConfigType( hIvasRend->outputConfig ) == ISAR_POST_REND_AUDIO_CONFIG_TYPE_BINAURAL && + ( outAudio.config.numSamplesPerChannel * 1000 / cldfb2tdSampleFact ) != ( hIvasRend->num_subframes * BINAURAL_RENDERING_FRAME_SIZE_MS ) * hIvasRend->sampleRateOut ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Binaural rendering requires specific frame size" ); + } + + IF( ( error = ISAR_POST_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF( numOutChannels != outAudio.config.numChannels && hIvasRend->outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && hIvasRend->outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + { + return IVAS_ERR_WRONG_NUM_CHANNELS; + } + + /* Clear original output buffer */ + set_l( outAudio.data_fx, 0, outAudio.config.numChannels * outAudio.config.numSamplesPerChannel ); + + IF( ( error = renderActiveInputsSplitBin( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + +#ifndef DISABLE_LIMITER + Word32 limiter_threshold; +#ifdef DEBUGGING + hIvasRend->numClipping += +#endif + limiter_threshold = L_shl( IVAS_LIMITER_THRESHOLD, *outAudio.pq_fact ); + limitRendererOutput_fx( hIvasRend->hLimiter, outAudio.data_fx, outAudio.config.numSamplesPerChannel, limiter_threshold, *outAudio.pq_fact ); +#endif + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_GetSplitBinauralSamples() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ISAR_POST_REND_GetSplitBinauralSamples( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_AudioBuffer outAudio, /* i/o: buffer for output audio */ + bool *needNewFrame ) +{ + ivas_error error; + + IF( ( error = ISAR_POST_REND_getSamples( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + *needNewFrame = hIvasRend->inputsSplitPost[0].numCachedSamples == 0; + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ISAR_POST_REND_Close() + * + * + *-------------------------------------------------------------------*/ + +void ISAR_POST_REND_Close( + ISAR_POST_REND_HANDLE *phIvasRend /* i/o: Pointer to renderer handle */ +) +{ + UWord16 i; + ISAR_POST_REND_HANDLE hIvasRend; + + /* Validate function arguments */ + IF( phIvasRend == NULL || *phIvasRend == NULL ) + { + return; + } + hIvasRend = *phIvasRend; + + FOR( i = 0; i < RENDERER_MAX_BIN_INPUTS; ++i ) + { + clearInputSplitRend( &hIvasRend->inputsSplitPost[i] ); + } + + ivas_limiter_close_fx( &hIvasRend->hLimiter ); + + free( hIvasRend ); + *phIvasRend = NULL; + + return; +} + + +/*-------------------------------------------------------------------* + * ISAR_REND_SetSplitRendBitstreamHeader() + * + * + + *-------------------------------------------------------------------*/ + +ivas_error ISAR_REND_SetSplitRendBitstreamHeader( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const ISAR_SPLIT_REND_CODEC codec, /* o : codec setting */ + const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection, /* o : pose correction mode */ + const Word16 codec_frame_size_ms, /* i : codec frame size setting */ + const Word16 isar_frame_size_ms, /* i : ISAR codec frame size setting */ + const Word16 lc3plus_highres /* i : LC3plus Hig-Res setting. Ignored if codec is not LC3plus */ +) +{ + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hIvasRend->splitRenderConfig.codec = codec; + hIvasRend->splitRenderConfig.isar_frame_size_ms = isar_frame_size_ms; + hIvasRend->splitRenderConfig.codec_frame_size_ms = codec_frame_size_ms; + hIvasRend->splitRenderConfig.poseCorrectionMode = poseCorrection; + hIvasRend->splitRenderConfig.lc3plus_highres = lc3plus_highres; + + return IVAS_ERR_OK; +} + +#ifdef DEBUGGING +/*-------------------------------------------------------------------* + * ISAR_POST_REND_GetNoCLipping() + * + * + *-------------------------------------------------------------------*/ + +int32_t ISAR_POST_REND_GetNoCLipping( + ISAR_POST_REND_HANDLE hIvasRend ) +{ + return hIvasRend->numClipping; +} + +int32_t ISAR_POST_REND_GetCntFramesLimited( + ISAR_POST_REND_CONST_HANDLE hIvasRend ) +{ + if ( hIvasRend->hLimiter == NULL ) + { + return 0; + } + + return hIvasRend->hLimiter->cnt_frames_limited; +} +#endif diff --git a/lib_isar/lib_isar_post_rend.h b/lib_isar/lib_isar_post_rend.h new file mode 100644 index 0000000000000000000000000000000000000000..ba22fba6ab50ed2a8ae65a56477921c1e56f2f4e --- /dev/null +++ b/lib_isar/lib_isar_post_rend.h @@ -0,0 +1,215 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef LIB_ISAR_POST_REND_H +#define LIB_ISAR_POST_REND_H + +#include "common_api_types.h" +#include + + +/*---------------------------------------------------------------------* + * ISAR post-renderer constants + *---------------------------------------------------------------------*/ + +#define RENDERER_MAX_ISAR_MD_INPUTS 1 +#define RENDERER_MAX_BIN_INPUTS 1 + +/*---------------------------------------------------------------------* + * ISAR post-renderer structures + *---------------------------------------------------------------------*/ + +typedef struct +{ + Word32 bufLenInBytes; + Word32 bitsWritten; + Word32 bitsRead; + ISAR_SPLIT_REND_CODEC codec; + ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection; + Word16 codec_frame_size_ms; + Word16 isar_frame_size_ms; + Word16 lc3plusHighRes; +} ISAR_POST_REND_BitstreamBufferConfig; + +typedef struct +{ + ISAR_POST_REND_BitstreamBufferConfig config; + UWord8 *bits; +} ISAR_POST_REND_BitstreamBuffer; + +typedef enum +{ + ISAR_POST_REND_AUDIO_CONFIG_TYPE_BINAURAL = 0, + ISAR_POST_REND_AUDIO_CONFIG_TYPE_UNKNOWN, +} ISAR_POST_REND_AudioConfigType; + +typedef struct +{ + IVAS_REND_AudioBufferConfig config; + const Word32 *data_fx; +} ISAR_POST_REND_ReadOnlyAudioBuffer; + +typedef struct ISAR_POST_REND *ISAR_POST_REND_HANDLE; +typedef struct ISAR_POST_REND const *ISAR_POST_REND_CONST_HANDLE; + +typedef UWord16 ISAR_POST_REND_InputId; + +typedef enum _ISAR_POST_REND_COMPLEXITY_LEVEL +{ + ISAR_POST_REND_COMPLEXITY_LEVEL_ONE = 1, + ISAR_POST_REND_COMPLEXITY_LEVEL_TWO = 2, + ISAR_POST_REND_COMPLEXITY_LEVEL_THREE = 3 +} ISAR_POST_REND_COMPLEXITY_LEVEL; + + +/* clang-format off */ +/*----------------------------------------------------------------------------------* + * ISAR post-renderer function prototypes + *----------------------------------------------------------------------------------*/ + +/* Functions to be called before rendering */ +ivas_error ISAR_POST_REND_open( + ISAR_POST_REND_HANDLE *phIvasRend, /* i/o: Pointer to renderer handle */ + const Word32 outputSampleRate, /* i : output sampling rate */ + const IVAS_AUDIO_CONFIG outConfig, /* i : output audio config */ + const bool asHrtfBinary, /* i : load hrtf binary file */ + const Word16 nonDiegeticPan, /* i : non-diegetic object flag */ + const Word32 nonDiegeticPanGain, /* i : non-diegetic panning gain */ + const Word16 num_subframes /* i : number of subframes */ +); + +/* Functions to be called before/during rendering */ +ivas_error ISAR_POST_REND_NumOutChannels( + ISAR_POST_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + Word16 *numOutChannels /* o : number of output channels */ +); + +ivas_error ISAR_POST_REND_AddInput( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_AUDIO_CONFIG inConfig, /* i : audio config for a new input */ + ISAR_POST_REND_InputId *inputId /* o : ID of the new input */ +); + +ivas_error ISAR_POST_REND_SetInputGain( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const ISAR_POST_REND_InputId inputId, /* i : ID of the input */ + const Word32 gain /* i : linear gain (not in dB) */ +); + +ivas_error ISAR_POST_REND_GetInputNumChannels( + ISAR_POST_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + const ISAR_POST_REND_InputId inputId, /* i : ID of the input */ + Word16 *numChannels /* o : number of channels of the input */ +); + +ivas_error ISAR_POST_REND_GetDelay( + ISAR_POST_REND_CONST_HANDLE hIvasRend, /* i : Renderer state */ + Word16 *nSamples, /* o : Renderer delay in samples */ + Word32 *timeScale /* o : Time scale of the delay, equal to renderer output sampling rate */ +); + +/* Functions to be called during rendering */ + +ivas_error ISAR_POST_REND_FeedInputAudio( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const ISAR_POST_REND_InputId inputId, /* i : ID of the input */ + const ISAR_POST_REND_ReadOnlyAudioBuffer inputAudio /* i : buffer with input audio */ +); + +ivas_error ISAR_POST_REND_InitConfig( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_AUDIO_CONFIG outAudioConfig /* i : output audioConfig */ +); + +Word16 ISAR_POST_REND_GetRenderConfig( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + const ISAR_SPLIT_REND_CONFIG_HANDLE splitRenderConfig /* o : Render configuration handle */ +); + +ivas_error ISAR_POST_REND_FeedSplitBinauralBitstream( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const ISAR_POST_REND_InputId inputId, /* i : ID of the input */ + ISAR_POST_REND_BitstreamBuffer *hBits /* i : buffer for input bitstream */ +); + +ivas_error ISAR_POST_REND_GetSplitBinauralSamples( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_AudioBuffer outAudio, /* i/o: buffer for output audio */ + bool* needNewFrame +); + +ivas_error ISAR_POST_REND_SetHeadRotation( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ + const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ + const ISAR_SPLIT_REND_ROT_AXIS rot_axis, /* i : external control for rotation axis for split rendering */ + const Word16 sf_idx /* i : subframe index */ +); + +ivas_error ISAR_POST_REND_SetSplitRendBFI( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const Word16 bfi /* i : BFI flag */ +); + +ivas_error ISAR_POST_REND_getSamples( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ +); + +/* Functions to be called after rendering */ + +void ISAR_POST_REND_Close( + ISAR_POST_REND_HANDLE* phIvasRend /* i/o: Pointer to renderer handle */ +); + +ivas_error ISAR_REND_SetSplitRendBitstreamHeader( + ISAR_POST_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const ISAR_SPLIT_REND_CODEC codec, /* o : codec setting */ + const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection, /* o : pose correction mode */ + const Word16 codec_frame_size_ms, /* i : codec frame size setting */ + const Word16 isar_frame_size_ms, /* i : ISAR frame size setting */ + const Word16 lc3plus_highres /* i : LC3plus Hig-Res setting. Ignored if codec is not LC3plus */ +); + +#ifdef DEBUGGING +int32_t ISAR_POST_REND_GetNoCLipping( + ISAR_POST_REND_HANDLE hIvasRend /* i : Renderer handle */ +); + +int32_t ISAR_POST_REND_GetCntFramesLimited( + ISAR_POST_REND_CONST_HANDLE hIvasRend /* i : Renderer handle */ +); +#endif + +/* clang-format on */ + +#endif /* LIB_ISAR_POST_REND_H */ diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c new file mode 100644 index 0000000000000000000000000000000000000000..f926b65a453f6dc78c4a8a461e56459e0851d3f9 --- /dev/null +++ b/lib_isar/lib_isar_pre_rend.c @@ -0,0 +1,570 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "ivas_prot_fx.h" +#include "prot_fx.h" +#include "isar_cnst.h" +#include "isar_rom_post_rend.h" +#include "lib_isar_pre_rend.h" +#include "isar_prot.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" + + +/*------------------------------------------------------------------------- + * Function ISAR_PRE_REND_open() + * + * + *------------------------------------------------------------------------*/ + +ivas_error ISAR_PRE_REND_open( + SPLIT_REND_WRAPPER *hSplitRendWrapper, + ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, + const Word32 OutSampleRate, + const Word16 cldfb_in_flag, + const Word16 pcm_out_flag, + const IVAS_RENDER_FRAMESIZE ivas_frame_size, /* i: IVAS frame size */ + const Word16 mixed_td_cldfb_flag ) +{ + ivas_error error, ch, num_ch; + UWord8 isCldfbNeeded = 0; + Word16 cldfb_in_flag_local = cldfb_in_flag; + + IF( ( error = isar_split_rend_choose_default_codec( &( pSplitRendConfig->codec ), + &pSplitRendConfig->isar_frame_size_ms, + &pSplitRendConfig->codec_frame_size_ms, + cldfb_in_flag_local, + pcm_out_flag, (Word16) ivas_frame_size ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( mixed_td_cldfb_flag ) + { + cldfb_in_flag_local = 0; + } + + IF( ( error = isar_split_rend_validate_config( pSplitRendConfig, pcm_out_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF( EQ_16( cldfb_in_flag_local, 0 ) ) + { + isCldfbNeeded = 1; + } + ELSE IF( EQ_16( pSplitRendConfig->codec, ISAR_SPLIT_REND_CODEC_LC3PLUS ) && cldfb_in_flag_local ) + { + isCldfbNeeded = 1; + } + ELSE IF( pcm_out_flag && cldfb_in_flag_local ) + { + isCldfbNeeded = 1; + } + + test(); + IF( isCldfbNeeded && hSplitRendWrapper->hCldfbHandles == NULL ) + { + IF( ( hSplitRendWrapper->hCldfbHandles = (CLDFB_HANDLES_WRAPPER_HANDLE) malloc( sizeof( CLDFB_HANDLES_WRAPPER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB handles\n" ) ); + } + num_ch = MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; + FOR( ch = 0; ch < num_ch; ch++ ) + { + hSplitRendWrapper->hCldfbHandles->cldfbAna[ch] = NULL; + } + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + hSplitRendWrapper->hCldfbHandles->cldfbSyn[ch] = NULL; + } + + num_ch = hSplitRendWrapper->multiBinPoseData.num_poses * BINAURAL_CHANNELS; + + FOR( ch = 0; ch < num_ch; ch++ ) + { + IF( ( error = openCldfb_ivas_fx( &( hSplitRendWrapper->hCldfbHandles->cldfbAna[ch] ), + CLDFB_ANALYSIS, OutSampleRate, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + IF( ( error = openCldfb_ivas_fx( &( hSplitRendWrapper->hCldfbHandles->cldfbSyn[ch] ), CLDFB_SYNTHESIS, OutSampleRate, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + IF( EQ_16( pSplitRendConfig->poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) ) + { + if ( ( error = isar_splitBinPreRendOpen( &hSplitRendWrapper->hBinHrSplitPreRend, &hSplitRendWrapper->multiBinPoseData +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + , + OutSampleRate +#endif + ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + IF( EQ_16( pcm_out_flag, 0 ) ) + { + IF( EQ_16( pSplitRendConfig->codec, ISAR_SPLIT_REND_CODEC_LC3PLUS ) ) + { + IF( ( error = split_renderer_open_lc3plus( hSplitRendWrapper, pSplitRendConfig, OutSampleRate, ivas_frame_size ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE + { + Word16 iNumBlocksPerFrame; + iNumBlocksPerFrame = ( CLDFB_NO_COL_MAX * pSplitRendConfig->codec_frame_size_ms ) / 20; + + IF( ( error = isar_splitBinLCLDEncOpen( &hSplitRendWrapper->hSplitBinLCLDEnc, OutSampleRate, BINAURAL_CHANNELS, isar_get_lcld_bitrate( pSplitRendConfig->splitRendBitRate, hSplitRendWrapper->multiBinPoseData.poseCorrectionMode ), iNumBlocksPerFrame, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * Function ISAR_PRE_REND_close() + * + * + *------------------------------------------------------------------------*/ + +void ISAR_PRE_REND_close( + SPLIT_REND_WRAPPER *hSplitBinRend, /* i/o: Split renderer pre-renerer handle */ + IVAS_REND_AudioBuffer *pSplitRendEncBuffer /* i/o: Split renderer data buffer */ +) +{ + Word16 i; + + IF( hSplitBinRend->hBinHrSplitPreRend != NULL ) + { + isar_splitBinPreRendClose( &hSplitBinRend->hBinHrSplitPreRend ); + } + + IF( hSplitBinRend->hSplitBinLCLDEnc != NULL ) + { + isar_splitBinLCLDEncClose( &hSplitBinRend->hSplitBinLCLDEnc ); + } + + IF( hSplitBinRend->hCldfbHandles != NULL ) + { + Word16 num_ch, ch; + num_ch = MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; + FOR( ch = 0; ch < num_ch; ch++ ) + { + IF( hSplitBinRend->hCldfbHandles->cldfbAna[ch] != NULL ) + { + deleteCldfb_fx( &hSplitBinRend->hCldfbHandles->cldfbAna[ch] ); + hSplitBinRend->hCldfbHandles->cldfbAna[ch] = NULL; + } + } + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + IF( hSplitBinRend->hCldfbHandles->cldfbSyn[ch] != NULL ) + { + deleteCldfb_fx( &hSplitBinRend->hCldfbHandles->cldfbSyn[ch] ); + hSplitBinRend->hCldfbHandles->cldfbSyn[ch] = NULL; + } + } + + free( hSplitBinRend->hCldfbHandles ); + hSplitBinRend->hCldfbHandles = NULL; + } + + IF( hSplitBinRend->hLc3plusEnc != NULL ) + { + ISAR_LC3PLUS_ENC_Close( &hSplitBinRend->hLc3plusEnc ); + } + + FOR( i = 0; i < MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; ++i ) + { + if ( hSplitBinRend->lc3plusDelayBuffers_fx[i] != NULL ) + { + free( hSplitBinRend->lc3plusDelayBuffers_fx[i] ); + hSplitBinRend->lc3plusDelayBuffers_fx[i] = NULL; + } + } + + IF( pSplitRendEncBuffer != NULL ) + { + + IF( pSplitRendEncBuffer->data_fx != NULL ) + { + free( pSplitRendEncBuffer->data_fx ); + pSplitRendEncBuffer->data_fx = NULL; + } + + pSplitRendEncBuffer->config.numChannels = 0; + pSplitRendEncBuffer->config.numSamplesPerChannel = 0; + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ISAR_PRE_REND_GetMultiBinPoseData() + * + * + *-------------------------------------------------------------------------*/ + +void ISAR_PRE_REND_GetMultiBinPoseData( + const ISAR_SPLIT_REND_CONFIG_DATA *pSplit_rend_config, /* i : Split renderer pre-renerer config */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ + const ISAR_SPLIT_REND_ROT_AXIS rot_axis /* i : Rotation axis */ +) +{ + isar_renderSplitGetMultiBinPoseData_fx( pSplit_rend_config, pMultiBinPoseData, rot_axis ); + + return; +} + + +/*------------------------------------------------------------------------- + * Function ISAR_PRE_REND_MultiBinToSplitBinaural() + * + * + *------------------------------------------------------------------------*/ + +ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( + SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renerer handle */ + const IVAS_QUATERNION headPosition, /* i : head rotation QUATERNION */ + const Word32 SplitRendBitRate, /* i : Split renderer bitrate */ + ISAR_SPLIT_REND_CODEC splitCodec, /* i/o: Split renderer codec */ + const Word16 isar_frame_size_ms, /* i : ISAR framesize */ + Word16 codec_frame_size_ms, /* i/o: ISAR transport codec framesize */ + ISAR_SPLIT_REND_BITS_HANDLE pBits, + Word32 *Cldfb_In_BinReal_fx[][CLDFB_NO_COL_MAX], /* i/o: CLDFB real buffer */ + Word32 *Cldfb_In_BinImag_fx[][CLDFB_NO_COL_MAX], /* i/o: CLDFB imag buffer */ + const Word16 max_bands, /* i : CLDFB bands */ + Word32 *pOutput_fx[], /* i/o: PCM in/out buffer */ + const Word16 low_res_pre_rend_rot, /* i : low time resolution pre-renderer flag */ + const Word16 cldfb_in_flag, /* i : Flag to indicate CLDFB or time domain input */ + const Word16 pcm_out_flag, /* i : Flag to indicate PCM output */ + const Word16 ro_md_flag, /* i : Flag to indicate real only metadata for yaw */ + Word16 Q_buff, + Word16 *Q_out ) +{ + ivas_error error; + Word32 bit_len, target_md_bits, available_bits, tmp_32; + Word16 q1 = 31, q2 = 31, q_final, Q_cldfb, tmp, tmp_e; + Word16 i, j; + error = IVAS_ERR_OK; + Word16 Q_buff_re, Q_buff_im; + + push_wmops( "ISAR_PRE_REND_MultiBinToSplitBinaural" ); + + Q_buff_re = Q_buff; + move16(); + Q_buff_im = Q_buff; + move16(); + IF( hSplitBin->multiBinPoseData.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) + { + set_fix_rotation_mat_fx( hSplitBin->hBinHrSplitPreRend->fix_pos_rot_mat_fx, &hSplitBin->multiBinPoseData ); + set_pose_types_fx( hSplitBin->hBinHrSplitPreRend->pose_type, &hSplitBin->multiBinPoseData ); + } + + IF( EQ_16( cldfb_in_flag, 0 ) ) + { + error = isar_renderMultiTDBinToSplitBinaural( hSplitBin, headPosition, SplitRendBitRate, isar_frame_size_ms, codec_frame_size_ms, pBits, max_bands, pOutput_fx, Q_out[0], low_res_pre_rend_rot, pcm_out_flag, ro_md_flag ); + + Q_out[1] = Q_out[0]; + move16(); + pop_wmops(); + return error; + } + + IF( splitCodec == ISAR_SPLIT_REND_CODEC_LC3PLUS && hSplitBin->multiBinPoseData.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) + { + /* Time-align pose correction to delay of LC3plus */ + lc3plusTimeAlignCldfbPoseCorr( hSplitBin, Cldfb_In_BinReal_fx, Cldfb_In_BinImag_fx, &Q_buff ); + Q_buff_re = Q_buff; + move16(); + Q_buff_im = Q_buff; + move16(); + } + + IF( hSplitBin->multiBinPoseData.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) + { + target_md_bits = isar_get_split_rend_md_target_brate( SplitRendBitRate, pcm_out_flag ) * L_FRAME48k / 48000; + + /*float2fix, to be removed*/ + Word16 Q_Cldfb_re = 31, Q_Cldfb_im = 31; + move16(); + move16(); + FOR( i = 0; i < hSplitBin->multiBinPoseData.num_poses * BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < CLDFB_NO_COL_MAX; j++ ) + { + Q_Cldfb_re = s_min( getScaleFactor32( Cldfb_In_BinReal_fx[i][j], CLDFB_NO_CHANNELS_MAX ), Q_Cldfb_re ); + Q_Cldfb_im = s_min( getScaleFactor32( Cldfb_In_BinImag_fx[i][j], CLDFB_NO_CHANNELS_MAX ), Q_Cldfb_im ); + } + } + FOR( i = 0; i < hSplitBin->multiBinPoseData.num_poses * BINAURAL_CHANNELS; i++ ) + { + FOR( j = 0; j < CLDFB_NO_COL_MAX; j++ ) + { + Scale_sig32( Cldfb_In_BinReal_fx[i][j], CLDFB_NO_CHANNELS_MAX, Q_Cldfb_re ); + Scale_sig32( Cldfb_In_BinImag_fx[i][j], CLDFB_NO_CHANNELS_MAX, Q_Cldfb_im ); + } + } + Q_buff_re = add( Q_Cldfb_re, Q_buff ); + Q_buff_im = add( Q_Cldfb_im, Q_buff ); + Word16 exp_cldfb_re = sub( 31, Q_buff_re ); + Word16 exp_cldfb_im = sub( 31, Q_buff_im ); + isar_rend_CldfbSplitPreRendProcess( hSplitBin->hBinHrSplitPreRend, headPosition, &hSplitBin->multiBinPoseData, Cldfb_In_BinReal_fx, exp_cldfb_re, Cldfb_In_BinImag_fx, exp_cldfb_im, pBits, target_md_bits, low_res_pre_rend_rot, ro_md_flag ); + } + + IF( EQ_16( pcm_out_flag, 0 ) ) + { + pBits->codec = splitCodec; + pBits->pose_correction = hSplitBin->multiBinPoseData.poseCorrectionMode; + + IF( splitCodec == ISAR_SPLIT_REND_CODEC_LCLD ) + { + // available_bits = ( SplitRendBitRate * hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ) / ( 16 * FRAMES_PER_SEC ); + available_bits = W_extract_l( W_mult0_32_32( SplitRendBitRate, L_mult0( hSplitBin->hSplitBinLCLDEnc->iNumBlocks, hSplitBin->hSplitBinLCLDEnc->iNumIterations ) ) ); + tmp_e = 0; + tmp_32 = BASOP_Util_Divide3232_Scale_newton( available_bits, L_mult0( 16, FRAMES_PER_SEC ), &tmp_e ); + available_bits = L_shr( tmp_32, sub( 31, tmp_e ) ); // Q0 + available_bits = L_sub( available_bits, pBits->bits_written ); + pBits->codec_frame_size_ms = codec_frame_size_ms; + q_final = sub( s_min( Q_buff_re, Q_buff_im ), 2 ); + FOR( i = 0; i < hSplitBin->hSplitBinLCLDEnc->iChannels; i++ ) + { + FOR( j = 0; j < hSplitBin->hSplitBinLCLDEnc->iNumBlocks; j++ ) + { + Scale_sig32( Cldfb_In_BinReal_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( q_final, Q_buff_re ) ); + Scale_sig32( Cldfb_In_BinImag_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( q_final, Q_buff_im ) ); + } + } + isar_splitBinLCLDEncProcess( hSplitBin->hSplitBinLCLDEnc, Cldfb_In_BinReal_fx, Cldfb_In_BinImag_fx, available_bits, pBits, &q_final ); + Q_buff_re = q_final; + move16(); + Q_buff_im = q_final; + move16(); + } + ELSE + { + Word16 ch, slot_idx, num_slots, ivas_fs; + tmp_e = 0; + tmp = BASOP_Util_Divide3232_Scale( hSplitBin->hLc3plusEnc->config.isar_frame_duration_us, 1000, &tmp_e ); + ivas_fs = shr( tmp, sub( 15, tmp_e ) ); // Q0 + // ivas_fs = (Word16) hSplitBin->hLc3plusEnc->config.ivas_frame_duration_us / 1000; + + tmp_e = 0; + tmp = BASOP_Util_Divide3232_Scale( L_mult0( CLDFB_NO_COL_MAX, ivas_fs ), 20, &tmp_e ); + num_slots = shr( tmp, sub( 15, tmp_e ) ); // Q0 + // num_slots = (Word16) CLDFB_NO_COL_MAX * ivas_fs / 20; + /* CLDFB synthesis of main pose */ + { + q1 = 31; + q2 = 31; + move16(); + move16(); + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( j = 0; j < num_slots; j++ ) + { + q1 = s_min( getScaleFactor32( Cldfb_In_BinReal_fx[ch][j], CLDFB_NO_CHANNELS_MAX ), q1 ); + q2 = s_min( getScaleFactor32( Cldfb_In_BinImag_fx[ch][j], CLDFB_NO_CHANNELS_MAX ), q2 ); + } + } + + q_final = s_min( q1, q2 ); + q_final = s_min( add( Q_buff_re, q_final ), add( Q_buff_im, q_final ) ); + q_final = sub( q_final, 6 ); // guard bits + q_final = s_min( q_final, Q25 ); + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( j = 0; j < num_slots; j++ ) + { + Scale_sig32( Cldfb_In_BinReal_fx[ch][j], CLDFB_NO_CHANNELS_MAX, sub( q_final, Q_buff_re ) ); + Scale_sig32( Cldfb_In_BinImag_fx[ch][j], CLDFB_NO_CHANNELS_MAX, sub( q_final, Q_buff_im ) ); + } + } + } + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + Word32 *Cldfb_In_BinReal_p_fx[CLDFB_NO_COL_MAX]; + Word32 *Cldfb_In_BinImag_p_fx[CLDFB_NO_COL_MAX]; + + + FOR( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) + { + Cldfb_In_BinReal_p_fx[slot_idx] = Cldfb_In_BinReal_fx[ch][slot_idx]; + move32(); + Cldfb_In_BinImag_p_fx[slot_idx] = Cldfb_In_BinImag_fx[ch][slot_idx]; + move32(); + } + + Q_cldfb = q_final; + move16(); + Scale_sig32( hSplitBin->hCldfbHandles->cldfbSyn[ch]->cldfb_state_fx, hSplitBin->hCldfbHandles->cldfbSyn[ch]->p_filter_length, sub( sub( Q_cldfb, 1 ), hSplitBin->hCldfbHandles->cldfbSyn[ch]->Q_cldfb_state ) ); + cldfbSynthesis_ivas_fx( Cldfb_In_BinReal_p_fx, Cldfb_In_BinImag_p_fx, pOutput_fx[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * num_slots, 0, 0, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); // Q_cldfb - 1 + Q_out[ch] = sub( Q_cldfb, 1 ); + move16(); + hSplitBin->hCldfbHandles->cldfbSyn[ch]->Q_cldfb_state = Q_out[ch]; + move16(); + } + assert( Q_out[0] == Q_out[1] ); + + + IF( EQ_32( pBits->pose_correction, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ) + { + available_bits = isar_get_lc3plus_bitrate( SplitRendBitRate, hSplitBin->multiBinPoseData.poseCorrectionMode, hSplitBin->hLc3plusEnc->config.channels, hSplitBin->hLc3plusEnc->config.lc3plus_frame_duration_us ); + available_bits = Mpy_32_32( available_bits, ONE_BY_FRAMES_PER_SEC_Q31 ); + } + ELSE + { + available_bits = L_sub( Mpy_32_32( SplitRendBitRate, ONE_BY_FRAMES_PER_SEC_Q31 ), pBits->bits_written ); + } + IF( ( error = splitRendLc3plusEncodeAndWrite( hSplitBin, pBits, available_bits, pOutput_fx, Q_out[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + ELSE + { + Word16 ch, slot_idx, num_slots; + num_slots = int_div_s_x( shl( isar_frame_size_ms, 3 ), 10 ); + + /* CLDFB synthesis of main pose */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + Word32 *Cldfb_In_BinReal_p_fx[CLDFB_NO_COL_MAX]; + Word32 *Cldfb_In_BinImag_p_fx[CLDFB_NO_COL_MAX]; + q1 = 31; + move16(); + q2 = 31; + move16(); + FOR( j = 0; j < num_slots; j++ ) + { + q1 = s_min( getScaleFactor32( Cldfb_In_BinReal_fx[ch][j], CLDFB_NO_CHANNELS_MAX ), q1 ); + q2 = s_min( getScaleFactor32( Cldfb_In_BinImag_fx[ch][j], CLDFB_NO_CHANNELS_MAX ), q2 ); + } + q_final = s_min( q1, q2 ); + q_final = s_min( add( Q_buff_re, q_final ), add( Q_buff_im, q_final ) ); + q_final = sub( q_final, 6 ); // guard bits + q_final = s_min( q_final, Q25 ); + FOR( j = 0; j < num_slots; j++ ) + { + Scale_sig32( Cldfb_In_BinReal_fx[ch][j], CLDFB_NO_CHANNELS_MAX, sub( q_final, Q_buff_re ) ); + Scale_sig32( Cldfb_In_BinImag_fx[ch][j], CLDFB_NO_CHANNELS_MAX, sub( q_final, Q_buff_im ) ); + } + + FOR( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) + { + Cldfb_In_BinReal_p_fx[slot_idx] = Cldfb_In_BinReal_fx[ch][slot_idx]; + move32(); + Cldfb_In_BinImag_p_fx[slot_idx] = Cldfb_In_BinImag_fx[ch][slot_idx]; + move32(); + } + + Q_cldfb = q_final; + move16(); + Scale_sig32( hSplitBin->hCldfbHandles->cldfbSyn[ch]->cldfb_state_fx, hSplitBin->hCldfbHandles->cldfbSyn[ch]->p_filter_length, sub( sub( Q_cldfb, 1 ), hSplitBin->hCldfbHandles->cldfbSyn[ch]->Q_cldfb_state ) ); + cldfbSynthesis_ivas_fx( Cldfb_In_BinReal_p_fx, Cldfb_In_BinImag_p_fx, pOutput_fx[ch], i_mult( hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels, num_slots ), 0, 0, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); // Q_cldfb - 1 + Q_out[ch] = sub( Q_cldfb, 1 ); + move16(); + hSplitBin->hCldfbHandles->cldfbSyn[ch]->Q_cldfb_state = Q_out[ch]; + move16(); + } + + pBits->pose_correction = hSplitBin->multiBinPoseData.poseCorrectionMode; + pBits->codec = ISAR_SPLIT_REND_CODEC_NONE; + } + + /*zero pad*/ + IF( pcm_out_flag ) + { + tmp_e = 0; + tmp = BASOP_Util_Divide3232_Scale( SplitRendBitRate, FRAMES_PER_SEC, &tmp_e ); + bit_len = L_deposit_l( shr( tmp, sub( 15, tmp_e ) ) ); // Q0 + // bit_len = SplitRendBitRate / FRAMES_PER_SEC; + } + ELSE + { + IF( splitCodec == ISAR_SPLIT_REND_CODEC_LCLD ) + { + // bit_len = ( SplitRendBitRate * hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ) / ( 16 * FRAMES_PER_SEC ); + + bit_len = W_extract_l( W_mult0_32_32( SplitRendBitRate, L_mult0( hSplitBin->hSplitBinLCLDEnc->iNumBlocks, hSplitBin->hSplitBinLCLDEnc->iNumIterations ) ) ); + tmp_e = 0; + tmp_32 = BASOP_Util_Divide3232_Scale_newton( bit_len, L_mult0( 16, FRAMES_PER_SEC ), &tmp_e ); + bit_len = L_shr( tmp_32, sub( 31, tmp_e ) ); // Q0 + } + ELSE + { + tmp_e = 0; + tmp = BASOP_Util_Divide3232_Scale( hSplitBin->hLc3plusEnc->config.isar_frame_duration_us, 1000, &tmp_e ); + bit_len = L_deposit_l( shr( tmp, sub( 15, tmp_e ) ) ); // Q0 + // bit_len = hSplitBin->hLc3plusEnc->config.ivas_frame_duration_us / 1000; + // bit_len = SplitRendBitRate * bit_len / 1000; + tmp_e = 0; + tmp_32 = BASOP_Util_Divide3232_Scale_newton( W_extract_l( W_mult0_32_32( SplitRendBitRate, bit_len ) ), 1000, &tmp_e ); + bit_len = L_shr( tmp_32, sub( 31, tmp_e ) ); // Q0 + } + } + + WHILE( LT_32( pBits->bits_written, bit_len ) ) + { + ISAR_SPLIT_REND_BITStream_write_int32( pBits, 0L, 1 ); + } + + pop_wmops(); + return error; +} diff --git a/lib_isar/lib_isar_pre_rend.h b/lib_isar/lib_isar_pre_rend.h new file mode 100644 index 0000000000000000000000000000000000000000..0e1ca56724bb72b0090cca75890fc39e93396eed --- /dev/null +++ b/lib_isar/lib_isar_pre_rend.h @@ -0,0 +1,87 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef LIB_ISAR_PRE_REND_H +#define LIB_ISAR_PRE_REND_H + +#include "isar_stat.h" +#include "isar_prot.h" + +/* clang-format off */ +/*----------------------------------------------------------------------------------* + * Renderer function prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ISAR_PRE_REND_open( + SPLIT_REND_WRAPPER *hSplitBinRend, /* i/o: Split renderer pre-renerer handle */ + ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, /* i/o: Split renderer pre-renerer config */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 cldfb_in_flag, /* i : Flag to indicate CLDFB or time doamin input */ + const Word16 pcm_out_flag, /* i : Flag to indicate PCM output */ + const IVAS_RENDER_FRAMESIZE ivas_frame_size, /* i : IVAS frame size */ + const Word16 mixed_td_cldfb_flag /* i : Flag to indicate combined TD and CLDFB input */ +); + +void ISAR_PRE_REND_close( + SPLIT_REND_WRAPPER *hSplitBinRend, /* i/o: Split renderer pre-renerer handle */ + IVAS_REND_AudioBuffer *pSplitRendEncBuffer /* i/o: Split renderer data buffer */ +); + +void ISAR_PRE_REND_GetMultiBinPoseData( + const ISAR_SPLIT_REND_CONFIG_DATA *pSplit_rend_config, /* i : Split renderer pre-renerer config */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ + const ISAR_SPLIT_REND_ROT_AXIS rot_axis /* i : Rotation axis */ +); + +ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( + SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renerer handle */ + const IVAS_QUATERNION headPosition, /* i : head rotation QUATERNION */ + const Word32 SplitRendBitRate, /* i : Split renderer bitrate */ + ISAR_SPLIT_REND_CODEC splitCodec, /* i/o: Split renderer codec */ + const Word16 isar_frame_size_ms, /* i : ISAR framesize */ + Word16 codec_frame_size_ms, /* i/o: Split renderer codec framesize */ + ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: Split renderer bitstream handle */ + Word32* Cldfb_In_BinReal_fx[][CLDFB_NO_COL_MAX], /* i/o: CLDFB real buffer */ + Word32* Cldfb_In_BinImag_fx[][CLDFB_NO_COL_MAX], /* i/o: CLDFB imag buffer */ + const Word16 max_bands, /* i : CLDFB bands */ + Word32 *pOutput_fx[], /* i : low time resolution pre-renderer flag */ + const Word16 low_res_pre_rend_rot, /* i : low time resolution pre-renderer flag */ + const Word16 cldfb_in_flag, /* i : Flag to indicate CLDFB or time doamin input */ + const Word16 pcm_out_flag, /* i : Flag to indicate PCM output */ + const Word16 ro_md_flag, /* i : Flag to indicate real only metadata for yaw */ + Word16 Q_buff, + Word16 *Q_out +); + +/* clang-format off */ + +#endif /* LIB_ISAR_PRE_REND_H */ diff --git a/lib_lc3plus/.clang-format b/lib_lc3plus/.clang-format new file mode 100644 index 0000000000000000000000000000000000000000..47a38a93f2dbdd6d944f9dddc3465e3fb65aec29 --- /dev/null +++ b/lib_lc3plus/.clang-format @@ -0,0 +1,2 @@ +DisableFormat: true +SortIncludes: Never diff --git a/lib_lc3plus/adjust_global_gain_fx.c b/lib_lc3plus/adjust_global_gain_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..5edf9b9fcef1321ba40195a0057f62df6d74e90d --- /dev/null +++ b/lib_lc3plus/adjust_global_gain_fx.c @@ -0,0 +1,180 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + + + +void processAdjustGlobalGain_fx(Word16 *gg_idx, Word16 gg_idx_min, Word16 gg_idx_off, +#ifdef ENABLE_HR_MODE + Word32 *gain, +#else + Word16 *gain, +#endif + Word16 *gain_e, + Word16 target, Word16 nBits, Word16 *gainChange, Word16 fs_idx +#ifdef ENABLE_HR_MODE + , Word16 hrmode, LC3PLUS_FrameDuration frame_dms +#endif + ) +{ + + Word32 L_tmp; + Word16 delta, delta2; +#ifdef ENABLE_HR_MODE + Word16 gg_idx_inc; + Word16 gg_idx_inc_max; + Word16 gg_idx_inc_s; + Word32 factor; +#endif + +#ifdef DYNMEM_COUNT +#if defined(ENABLE_HR_MODE) + Dyn_Mem_In("processAdjustGlobalGain_fx", sizeof(struct { + Word32 L_tmp; + Word16 delta, delta2; + Word16 gg_idx_inc; + Word16 gg_idx_inc_max; + Word16 gg_idx_inc_s; + Word16 factor; + })); +#else + Dyn_Mem_In("processAdjustGlobalGain_fx", sizeof(struct { + Word32 L_tmp; + Word16 delta, delta2; + })); +#endif /* ENABLE_HR_MODE */ +#endif /* DYNMEM_COUNT */ + +#ifdef ENABLE_HR_MODE + IF (sub(frame_dms, LC3PLUS_FRAME_DURATION_2p5MS) == 0) + { + IF (sub(target, 520) < 0) + { + factor = 3; move16(); + gg_idx_inc_max = 30; move16(); + } ELSE { + factor = 4; move16(); + gg_idx_inc_max = 40; move16(); + } + } + ELSE IF (sub(frame_dms, LC3PLUS_FRAME_DURATION_5MS) == 0) + { + factor = 2; move16(); + gg_idx_inc_max = 20; move16(); + } + ELSE IF (sub(frame_dms, LC3PLUS_FRAME_DURATION_7p5MS) == 0) + { + factor = 40265318; move16(); /* factor = 1.2 * 2^25 */ + gg_idx_inc_max = 12 ; move16(); + } + ELSE + { + factor = 1; move16(); + gg_idx_inc_max = 10; move16(); + } +#endif + + IF (sub(nBits, adjust_global_gain_tables[0][fs_idx]) < 0) + { + delta = mult_r(add(nBits, 48), 2048); + } + ELSE IF (sub(nBits, adjust_global_gain_tables[1][fs_idx]) < 0) + { + delta = mult_r(add(nBits, adjust_global_gain_tables[4][fs_idx]), adjust_global_gain_tables[3][fs_idx]); + } + ELSE IF (sub(nBits, adjust_global_gain_tables[2][fs_idx]) < 0) + { + delta = mult_r(nBits, 683); + } + ELSE + { + delta = mult_r(adjust_global_gain_tables[2][fs_idx], 683); + } + delta2 = add(delta, 2); + + *gainChange = 0; move16(); + + test(); + IF (sub(*gg_idx, 255) == 0 && sub(nBits, target) > 0) + { + *gainChange = 1; move16(); + } + + test(); test(); test(); + IF ((sub(*gg_idx, 255) < 0 && sub(nBits, target) > 0) || (*gg_idx > 0 && sub(nBits, sub(target, delta2)) < 0)) + { +#ifdef ENABLE_HR_MODE + IF (hrmode) + { + IF (sub(nBits, target) > 0) + { + gg_idx_inc = sub(nBits, target); + IF (sub(frame_dms, LC3PLUS_FRAME_DURATION_7p5MS) == 0) + { + gg_idx_inc = extract_l(L_shr_pos(Mpy_32_16_lc3plus(factor, gg_idx_inc), 10)); + gg_idx_inc = BASOP_Util_Divide1616_Scale(gg_idx_inc, delta, &gg_idx_inc_s); + gg_idx_inc = shr_sat(gg_idx_inc, sub(15, gg_idx_inc_s)); + gg_idx_inc = add(gg_idx_inc, 1); + } + ELSE + { + gg_idx_inc = extract_l(L_mult0(gg_idx_inc, factor)); + gg_idx_inc = BASOP_Util_Divide1616_Scale(gg_idx_inc, delta, &gg_idx_inc_s); + gg_idx_inc = shr_sat(gg_idx_inc, sub(15, gg_idx_inc_s)); + gg_idx_inc = add(gg_idx_inc, factor); + } + gg_idx_inc = s_min(gg_idx_inc, gg_idx_inc_max); + + *gg_idx = add(*gg_idx, gg_idx_inc); move16(); + } + + *gg_idx = s_min(*gg_idx, 255); move16(); + } + ELSE +#endif + { + test(); + IF (sub(nBits, sub(target, delta2)) < 0) + { + *gg_idx = sub(*gg_idx, 1); move16(); + } + ELSE IF (sub(*gg_idx, 254) == 0 || sub(nBits, add(target, delta)) < 0) + { + *gg_idx = add(*gg_idx, 1); move16(); + } + ELSE + { + *gg_idx = add(*gg_idx, 2); move16(); + } + } + + *gg_idx = s_max(*gg_idx, sub(gg_idx_min, gg_idx_off)); move16(); + +#ifdef ENABLE_HR_MODE + L_tmp = Mpy_32_16_lc3plus(0x3CBE6B83, L_shl_pos(add(*gg_idx, gg_idx_off), 7)); +#else + L_tmp = L_shl_pos(L_mult0(add(*gg_idx, gg_idx_off), 0x797D), 7); /* 6Q25; 0x797D -> log2(10)/28 (Q18) */ +#endif + *gain_e = add(extract_l(L_shr_pos(L_tmp, 25)), 1); /* get exponent */ +#ifdef ENABLE_HR_MODE + *gain = BASOP_Util_InvLog2(L_or(L_tmp, (Word32)0xFE000000)); +#else + *gain = round_fx(BASOP_Util_InvLog2(L_or(L_tmp, (Word32)0xFE000000))); +#endif + *gainChange = 1; move16(); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + diff --git a/lib_lc3plus/al_fec.c b/lib_lc3plus/al_fec.c new file mode 100644 index 0000000000000000000000000000000000000000..f8f1ee3b8b0298fc411317b505a989cdbd42d233 --- /dev/null +++ b/lib_lc3plus/al_fec.c @@ -0,0 +1,2382 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" + + +#include "functions.h" +#include "rom_basop_util_lc3plus.h" +#include +#include +#include +#include + +/* channel coder specific constants and macros */ +#define RS16_CW_LEN_MAX 15 + +#define FEC_N_MODES 4 +#define FEC_N_SYNDROMES_MAX 6 +#define FEC_N_ERR_POS_MAX 3 +#define FEC_N_ELP_COEFF_MAX 4 +#define FEC_N_ERR_SYMB_MAX 3 +#define FEC_N_MODE_DETECTION_CW 6 + +#define SYNDROME_IDX(mode_index, cw_index) (((mode_index)*FEC_N_MODE_DETECTION_CW + (cw_index)) * FEC_N_SYNDROMES_MAX) +#define ELP_IDX(mode_index, cw_index) (((mode_index)*FEC_N_MODE_DETECTION_CW + (cw_index)) * FEC_N_ELP_COEFF_MAX) +#define ERR_POS_IDX(mode_index, cw_index) (((mode_index)*FEC_N_MODE_DETECTION_CW + (cw_index)) * FEC_N_ERR_POS_MAX) +#define ERR_SYMB_IDX(mode_index, cw_index) (((mode_index)*FEC_N_MODE_DETECTION_CW + (cw_index)) * FEC_N_ERR_SYMB_MAX) +#define DEG_ELP_IDX(mode_index, cw_index) ((mode_index)*FEC_N_MODE_DETECTION_CW + (cw_index)) + +#define FEC_TOTAL_SYNDROME_SIZE (FEC_N_SYNDROMES_MAX * FEC_N_MODES * FEC_N_MODE_DETECTION_CW) +#define FEC_TOTAL_ELP_SIZE (FEC_N_ELP_COEFF_MAX * FEC_N_MODES * FEC_N_MODE_DETECTION_CW) +#define FEC_TOTAL_ERR_POS_SIZE (FEC_N_ERR_POS_MAX * FEC_N_MODES * FEC_N_MODE_DETECTION_CW) +#define FEC_TOTAL_ERROR_SIZE (FEC_N_ERR_SYMB_MAX * FEC_N_MODES * FEC_N_MODE_DETECTION_CW) +#define FEC_TOTAL_DEG_ELP_SIZE (FEC_N_MODES * FEC_N_MODE_DETECTION_CW) + +#define ERROR_REPORT_BEC_MASK ((0x0FFF)>>1) +#define ERROR_REPORT_EP1_OK ((0x1000)>>1) +#define ERROR_REPORT_EP2_OK ((0x2000)>>1) +#define ERROR_REPORT_EP3_OK ((0x4000)>>1) +#define ERROR_REPORT_EP4_OK ((0x8000)>>1) +#define ERROR_REPORT_ALL_OK (ERROR_REPORT_EP1_OK | ERROR_REPORT_EP2_OK | ERROR_REPORT_EP3_OK | ERROR_REPORT_EP4_OK) + +/* debugging switches */ + +/* constants concerning mode detection */ +#define EP_RISK_THRESH_NS_M 21990 +#define EP_RISK_THRESH_NS_E -23 +#define EP_RISK_THRESH_OS_M 25166 +#define EP_RISK_THRESH_OS_E -10 + +#define SIMPLE_FLOAT_1_MANTISSA 16384 + +#define FEC_STATIC static + +/* DISCLAIMER: Strict instrumentation of GF16 arithmetic would have to take into account + * the initial conversion of the arguments from UWord8 to Word16 (one move16() per argument). + * Behind this is the assumption that one would store GF16 elements in Word16 for strict BASOP + * implementation. + */ + +#define GF16_MUL(a, b) (UWord8)(move16(), gf16_mult_table[s_or((a), shl((b), 4))]) +#define GF16_MUL0(a, b) (UWord8)(move16(), gf16_mult_table[s_or((a), (b))]) +#define GF16_ADD(a, b) (UWord8) s_xor((a), (b)) + +/* tables for finite field arithmetic */ +/* tables for arithmetic in GF(16) * + * generator polynomial: 19 + * unit group generator (g): 2 + */ + +static const UWord8 gf16_g_pow[16] = {1, 2, 4, 8, 3, 6, 12, 11, 5, 10, 7, 14, 15, 13, 9, 1}; +/* g_pow[i] contains g^i*/ + +static const UWord8 gf16_log_g[16] = {255, 0, 1, 4, 2, 8, 5, 10, 3, 14, 9, 7, 6, 13, 11, 12}; +/* log_g[n] contains contains the value i such that g^i = n for n=1, 2, ..., 15, log_g[0] is set to 255 */ + +static const UWord8 gf16_inv_table[16] = {255, 1, 9, 14, 13, 11, 7, 6, 15, 2, 12, 5, 10, 4, 3, 8}; +/* gf16_inv_table[n] contains the multiplicative inverse of n in GF(16) (1/0 is set to 255)*/ + +/* RS16 generating polynomials (from lowest to highest coefficient without leading 1)*/ + +static const UWord8 rs16_gp_d3[] = {8, 6}; +static const UWord8 rs16_gp_d5[] = {7, 8, 12, 13}; +static const UWord8 rs16_gp_d7[] = {12, 10, 12, 3, 9, 7}; + +/* FEC mode signaling polynomials */ + +#define EP_SIG_POLY_DEG 12 + +static const UWord8 sig_polys[4][15] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {7, 15, 5, 6, 14, 9, 1, 3, 12, 10, 13, 3, 2, 0, 0}, + {7, 11, 14, 1, 2, 3, 12, 11, 6, 15, 7, 6, 12, 0, 0}, + {6, 15, 12, 2, 9, 15, 2, 8, 12, 3, 10, 5, 4, 0, 0}}; + +static const UWord8 sig_poly_syndr[4][6] = { + {0, 0, 0, 0, 0, 0}, {0, 4, 5, 11, 5, 8}, {0, 5, 9, 0, 1, 7}, {0, 12, 5, 12, 9, 8}}; + +/* bit count table for error report (0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111) */ + +static const UWord8 rs16_bit_count_table[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4}; + +/* List of RS16 generators by Hamming distance */ + +static const UWord8 *const rs16_gp_by_hd[8] = {NULL, NULL, NULL, rs16_gp_d3, NULL, rs16_gp_d5, NULL, rs16_gp_d7}; + +/* fec config data */ + +static const UWord8 hamming_distance_by_mode0[] = {1, 3, 3, 5, 7}; +static const UWord8 hamming_distance_by_mode1[] = {1, 1, 3, 5, 7}; + +static const UWord8 crc1_bytes_by_mode0[] = {0, 3, 2, 2, 2}; +static const UWord8 crc1_bytes_by_mode1[] = {0, 3, 3, 3, 3}; +static const UWord8 crc2_bytes_by_mode[] = {0, 0, 2, 2, 2}; + +/* fec mode risk table */ +typedef struct +{ + UWord32 mantissa; + Word16 exponent; +} simple_float; + +static const simple_float risk_table_f[4][4] = {{{16384, 0}, {16384, 0}, {16384, 0}, {16384, 0}}, + {{16384, -8}, {26880, -1}, {16384, 0}, {16384, 0}}, + {{16384, -16}, {26880, -9}, {20475, -2}, {16384, 0}}, + {{16384, -24}, {26880, -17}, {20475, -10}, {19195, -4}}}; +/* bit error limits for slot size 40 */ +static Word16 const low_br_max_bit_errors_by_mode[] = {0, 0, 3, 9, 18}; + +/* +corresponding float values: + {1.f, 1.f, 1.f, 1.f}, + {0.00390625f, 0.820312f, 1.f, 1.f}, + {1.52588e-05f, 0.00320435f, 0.312424f, 1.f}, + {5.96046e-08f, 1.2517e-05f, 0.00122041f, 0.0732243f} +*/ + +/* internal encoder routines */ + +FEC_STATIC void fec_interleave_pack(UWord8 *out, UWord8 *in, Word16 n_nibbles, Word16 n_codewords); + +FEC_STATIC void rs16_enc(UWord8 *iobuf, Word16 codeword_length, Word16 hamming_distance, Word16 fec_mode, + Word16 signal_mode); + +/* internal decoder routines */ + +FEC_STATIC void fec_deinterleave_unpack(UWord8 *out, UWord8 *in, Word16 n_nibbles, Word16 n_codewords); + +FEC_STATIC Word16 fec_data_preproc(Word16 mode, Word16 epmr, UWord8 *iobuf, UWord8 *cw_buf, Word16 data_bytes, + Word16 slot_bytes, Word16 pc_split); + +FEC_STATIC void fec_data_postproc(Word16 mode, Word16 *epmr, UWord8 *iobuf, Word16 data_bytes, UWord8 *cw_buf, + Word16 slot_bytes, Word16 pc_split, int *bfi); + +FEC_STATIC int rs16_detect_and_correct(UWord8 *iobuf, int n_symb, int n_codewords, Word16 *epmr, Word16 *error_report, + int *bfi, UWord8 *array_of_trust, int ccc_flag_flag, Word16 *n_pccw, void *scratch); + +FEC_STATIC void rs16_calculate_six_syndromes(UWord8 *syndromes, UWord8 *cw, int cw_poly_deg); + +FEC_STATIC void rs16_calculate_four_syndromes(UWord8 *syndromes, UWord8 *cw, int cw_poly_deg); + +FEC_STATIC void rs16_calculate_two_syndromes(UWord8 *syndromes, UWord8 *cw, int cw_poly_deg); + +FEC_STATIC Word8 rs16_calculate_elp(UWord8 *elp, UWord8 *syndromes, Word16 hamming_distance); + +FEC_STATIC Word16 rs16_factorize_elp(UWord8 *error_locations, UWord8 *elp, Word16 deg_elp, Word16 max_pos); + +FEC_STATIC void rs16_calculate_errors(UWord8 *errors, UWord8 *err_pos, UWord8 *syndromes, Word8 deg_elp, Word8 t); + +/* auxiliary routines */ + +FEC_STATIC Word16 crc1(UWord8 *data, Word16 data_size, Word16 epmr, UWord8 *hash, Word16 hash_size, Word16 check); + +FEC_STATIC Word16 fec_estimate_epmr_from_cw0(UWord8 *cw0, Word8 *t, UWord8 *syndromes, UWord8 *elp, Word8 *deg_elp, + UWord8 *err_pos, UWord8 *err_symb, Word16 n_codewords, Word16 n_symb); + +FEC_STATIC void dw0_bitswap(UWord8 *dw0, Word16 mode, Word16 slot_bytes); + +FEC_STATIC Word16 cw0_get_epmr(UWord8 *cw0, Word16 epmr_position); + +FEC_STATIC Word16 dw0_get_epmr(UWord8 *dw0, Word16 mode, Word16 slot_size); + +FEC_STATIC Word16 crc2(UWord8 *data, Word16 data_size, UWord8 *hash, Word16 hash_size, Word16 check); + +FEC_STATIC simple_float simple_float_mul(simple_float op1, simple_float op2); + +FEC_STATIC Word16 simple_float_cmp(simple_float op1, simple_float op2); + +FEC_STATIC Word16 get_total_crc_size(Word16 slot_bytes, Word16 fec_mode, Word16 pc_split); + +FEC_STATIC Word16 get_n_codewords(Word16 slot_bytes); + +FEC_STATIC Word16 get_codeword_length(Word16 n_codewords, Word16 slot_nibbles, Word16 codeword_index); + + + +Word16 fec_get_n_pccw(Word16 slot_bytes, Word16 fec_mode, Word16 ccc_flag) +{ + Dyn_Mem_Deluxe_In( + Word16 n_pccw; + ); + + IF (sub(fec_mode, 3) == 0) + { + n_pccw = round_fx(L_sub(L_mult(2636, slot_bytes), 117377)); + } + ELSE IF (sub(fec_mode, 4) == 0) + { + n_pccw = round_fx(L_sub(L_mult(2178, slot_bytes), 129115)); + } + ELSE + { + n_pccw = 0; move16(); + } + + if (ccc_flag == 1 || sub(slot_bytes, 80) < 0) + { + n_pccw = 0; move16(); + } + + Dyn_Mem_Deluxe_Out(); + return n_pccw; +} + +FEC_STATIC Word16 get_total_crc_size(Word16 slot_bytes, Word16 fec_mode, Word16 pc_split) +{ + Dyn_Mem_Deluxe_In( + Word16 n_crc; + ); + + n_crc = crc1_bytes_by_mode1[fec_mode]; move16(); + if (sub(slot_bytes, 40) == 0) + { + n_crc = crc1_bytes_by_mode0[fec_mode]; move16(); + } + + IF (pc_split > 0) + { + n_crc = add(n_crc, crc2_bytes_by_mode[fec_mode]); + } + Dyn_Mem_Deluxe_Out(); + return n_crc; +} + +FEC_STATIC Word16 get_n_codewords(Word16 slot_bytes) +{ + Dyn_Mem_Deluxe_In( + Word16 i; + ); + + slot_bytes = shl(slot_bytes, 1); + + FOR (i = 0; slot_bytes > 0; i++) + { + slot_bytes = sub(slot_bytes, RS16_CW_LEN_MAX); + } + + Dyn_Mem_Deluxe_Out(); + return i; +} + +FEC_STATIC Word16 get_codeword_length(Word16 n_codewords, Word16 slot_nibbles, Word16 codeword_index) +{ + Dyn_Mem_Deluxe_In( + Word16 i; + ); + + slot_nibbles = sub(slot_nibbles, add(codeword_index, 1)); + slot_nibbles = sub(slot_nibbles, i_mult(n_codewords, 13)); + + FOR (i = 12; slot_nibbles >= 0; i++) + { + slot_nibbles = sub(slot_nibbles, n_codewords); + } + + Dyn_Mem_Deluxe_Out(); + return add(i, 1); +} + +/* Encoder */ + +Word16 fec_get_data_size(Word16 fec_mode, Word16 ccc_flag, Word16 slot_bytes) +/* not time critical */ +{ + Dyn_Mem_Deluxe_In( + Word16 n_codewords, payload_size; + ); + + n_codewords = get_n_codewords(slot_bytes); + + assert(n_codewords == (2 * slot_bytes + RS16_CW_LEN_MAX - 1) / RS16_CW_LEN_MAX); + payload_size = slot_bytes; move16(); + + IF (fec_mode > 0) + { + IF (fec_mode == 1) + { + payload_size = sub(payload_size, 1); + } + ELSE + { + payload_size = sub(payload_size, i_mult(sub(fec_mode, 1), n_codewords)); + } + IF (slot_bytes == 40) + { + payload_size = sub(payload_size, crc1_bytes_by_mode0[fec_mode]); move16(); + } + ELSE + { + payload_size = sub(payload_size, crc1_bytes_by_mode1[fec_mode]); move16(); + } + + IF (ccc_flag == 0 && fec_mode > 2 && slot_bytes >= 80) + { + payload_size = sub(payload_size, crc2_bytes_by_mode[fec_mode]); + } + } + + Dyn_Mem_Deluxe_Out(); + return payload_size; +} + +Word16 fec_get_n_pc(Word16 fec_mode, Word16 n_pccw, Word16 slot_bytes) +/* not time critical */ +{ + Dyn_Mem_Deluxe_In( + Word16 n_codewords, pc_split, tmp; + int i; + ); + + n_codewords = get_n_codewords(slot_bytes); + + assert(n_codewords == (2 * slot_bytes + RS16_CW_LEN_MAX - 1) / RS16_CW_LEN_MAX); + pc_split = i_mult(i_mult(n_pccw, -2), sub(fec_mode, 1)); + + IF (fec_mode == 1 || slot_bytes < 80) + { + pc_split = 0; move16(); + } + ELSE + { + FOR (i = 0; i < n_pccw; i++) + { + tmp = get_codeword_length(n_codewords, add(slot_bytes, slot_bytes), sub(n_codewords, i + 1)); + assert(tmp == (2 * slot_bytes + i) / n_codewords); + pc_split = add(pc_split, tmp); + } + } + + Dyn_Mem_Deluxe_Out(); + return pc_split; +} + +/* functions for EPMR handling */ +FEC_STATIC void dw0_bitswap(UWord8 *dw0, Word16 mode, Word16 slot_bytes) +/* swap epmr bits with bits that will be positioned at 30 and 32 in code word 0 */ +{ + Dyn_Mem_Deluxe_In( + UWord8 tmp; + int ind0, ind1, position; + ); + + position = sub(get_codeword_length(get_n_codewords(slot_bytes), shl(slot_bytes, 1), 0), 1); + + IF (sub(slot_bytes, 40) == 0) + { + ind0 = sub(shl(crc1_bytes_by_mode0[mode], 1), 1); + } + ELSE + { + ind0 = sub(shl(crc1_bytes_by_mode1[mode], 1), 1); + } + + ind1 = sub(position, sub(hamming_distance_by_mode0[mode], 1)); + + /* swap bits 2 and 3 of dw0[ind0] with bits 0 and 1 of dw0[ind1] */ + tmp = (UWord8) s_and(shr(dw0[ind0],2), 3); + dw0[ind0] = (UWord8) s_and(dw0[ind0], 3); + dw0[ind0] = (UWord8) s_or(dw0[ind0], shl(s_and(dw0[ind1], 3),2)); + dw0[ind1] = (UWord8) s_and(dw0[ind1], 12); + dw0[ind1] = (UWord8) s_or(dw0[ind1], tmp); + + Dyn_Mem_Deluxe_Out(); +} + +FEC_STATIC Word16 cw0_get_epmr(UWord8 *cw0, Word16 position) +{ + Dyn_Mem_Deluxe_In( + Word16 epmr; + ); + epmr = s_and(cw0[position], 3); + + Dyn_Mem_Deluxe_Out(); + return epmr; +} + +FEC_STATIC Word16 dw0_get_epmr(UWord8 *dw0, Word16 mode, Word16 slot_size) +{ + Dyn_Mem_Deluxe_In( + int ncrc1; + Word16 epmr; + ); + + ncrc1 = crc1_bytes_by_mode1[mode]; + + if (sub(slot_size, 40) == 0) + { + ncrc1 = crc1_bytes_by_mode0[mode]; + } + + epmr = shr(dw0[2 * ncrc1 - 1], 2); + + Dyn_Mem_Deluxe_Out(); + return epmr; +} + + +FEC_STATIC Word16 fec_data_preproc(Word16 mode, Word16 epmr, UWord8 *iobuf, UWord8 *cw_buf, Word16 data_bytes, + Word16 slot_bytes, Word16 pc_split) +{ + Dyn_Mem_Deluxe_In( + Word16 data_offset, n_crc1, n_crc2, tmp; + int i, j; + ); + + tmp = sub(slot_bytes, data_bytes); + data_offset = add(tmp, tmp); + + /* extract and reverse data*/ + j = sub(add(slot_bytes, slot_bytes), 1); + FOR (i = 0; i < data_bytes; i++) + { + cw_buf[j--] = (UWord8)s_and(iobuf[i], 15); move16(); + cw_buf[j--] = (UWord8)shr(iobuf[i], 4); move16(); + } + + /* add crc hashes */ + IF (sub(slot_bytes, 40) == 0) + { + n_crc1 = crc1_bytes_by_mode0[mode]; move16(); + } + ELSE + { + n_crc1 = crc1_bytes_by_mode1[mode]; move16(); + } + + IF (pc_split > 0 && sub(mode, 1) > 0) + { + n_crc2 = crc2_bytes_by_mode[mode]; move16(); + } + ELSE + { + n_crc2 = 0; move16(); + } + + IF (n_crc2) + { + crc2(cw_buf + data_offset + 2 * data_bytes - pc_split, pc_split, cw_buf + data_offset - 2 * n_crc2, n_crc2, 0); + } + IF (n_crc1) + { + crc1(cw_buf + data_offset, 2 * data_bytes - pc_split, epmr, cw_buf + data_offset - 2 * (n_crc1 + n_crc2), n_crc1, + 0); + } + + tmp = add(n_crc1, n_crc2); + data_offset = sub(data_offset, add(tmp, tmp)); + + dw0_bitswap(cw_buf + data_offset, mode, slot_bytes); + + Dyn_Mem_Deluxe_Out(); + return data_offset; +} + +void fec_encoder(Word16 mode, Word16 epmr, UWord8 *iobuf, Word16 data_bytes, Word16 slot_bytes, Word16 n_pccw, + void *scratch) +{ + Dyn_Mem_Deluxe_In( + Word16 n_codewords, codeword_length, hd, redundancy_nibbles, cw_offset, dw_offset, pc_split; + int i, j; + UWord8 *cw_buf; + ); + + cw_offset = 0; move16(); + dw_offset = 0; move16(); + pc_split = 0; move16(); + cw_buf = scratch; + + n_codewords = get_n_codewords(slot_bytes); + assert(n_codewords == (2 * slot_bytes + RS16_CW_LEN_MAX - 1) / RS16_CW_LEN_MAX); + + /* some sanity checks */ + { + int tmp = slot_bytes; + assert((slot_bytes >= FEC_SLOT_BYTES_MIN && slot_bytes <= FEC_SLOT_BYTES_MAX) && + "fec_encoder: slot_bytes out of range"); + tmp -= mode == 1 ? 1 : n_codewords * (mode - 1); /* reed solomon redundancy */ + tmp -= slot_bytes == 40 ? crc1_bytes_by_mode0[mode] : crc1_bytes_by_mode1[mode]; /* crc1 */ + tmp -= (n_pccw > 0) && (mode > 1) ? crc2_bytes_by_mode[mode] : 0; /* crc2 */ + assert(data_bytes == tmp && "fec_encoder: inconsistent payload size"); + assert(n_codewords - n_pccw >= 6); + } + + /* data preproc: re-ordering and hash extension */ + pc_split = fec_get_n_pc(mode, n_pccw, slot_bytes); + + dw_offset = fec_data_preproc(mode, epmr, iobuf, cw_buf, data_bytes, slot_bytes, pc_split); + + /* encoding of first data word*/ + hd = hamming_distance_by_mode0[mode]; move16(); + redundancy_nibbles = sub(hd, 1); + codeword_length = get_codeword_length(n_codewords, add(slot_bytes, slot_bytes), 0); + + assert(codeword_length == (2 * slot_bytes - 1) / n_codewords + 1); + + FOR (j = redundancy_nibbles; j < codeword_length; (j++, dw_offset++)) + { + cw_buf[j] = cw_buf[dw_offset]; move16(); + } + + rs16_enc(cw_buf, codeword_length, hd, mode, 1); + + cw_offset = add(cw_offset, codeword_length); + + /* encoding of remaining data words */ + hd = hamming_distance_by_mode1[mode]; move16(); + redundancy_nibbles = sub(hd, 1); + + FOR (i = 1; i < n_codewords; i++) + { + codeword_length = get_codeword_length(n_codewords, add(slot_bytes, slot_bytes), i); + + assert(codeword_length == (2 * slot_bytes - i - 1) / n_codewords + 1); + FOR (j = redundancy_nibbles; j < codeword_length; (j++, dw_offset++)) + { + cw_buf[cw_offset + j] = cw_buf[dw_offset]; move16(); + } + + rs16_enc(cw_buf + cw_offset, codeword_length, hd, mode, sub(i, 6) < 0); + + cw_offset = add(cw_offset, codeword_length); + } + + assert(cw_offset == 2 * slot_bytes && dw_offset == 2 * slot_bytes); + + fec_interleave_pack(iobuf, cw_buf, add(slot_bytes, slot_bytes), n_codewords); + + + Dyn_Mem_Deluxe_Out(); +} + +FEC_STATIC void rs16_enc(UWord8 *iobuf, Word16 codeword_length, Word16 hamming_distance, Word16 fec_mode, + Word16 signal_mode) +/* expects (data polynomial) * x^(hamming_distance - 1) in iobuf */ +{ + + Dyn_Mem_Deluxe_In( + UWord8 const *gp; + UWord8 shift_buffer[RS16_CW_LEN_MAX + 1], lc; + int i, j, deg_gp; + ); + + basop_memset(shift_buffer, 0, sizeof(shift_buffer)); + gp = rs16_gp_by_hd[hamming_distance]; move16(); + deg_gp = sub(hamming_distance, 1); + + IF (sub(hamming_distance, 1) > 0) + { + assert(codeword_length > deg_gp); + + /* initialize redundancy part to zero */ + basop_memset(iobuf, 0, deg_gp); + + /* initialize shift_buffer */ + basop_memmove(shift_buffer + 1, iobuf + codeword_length - deg_gp, deg_gp); + + /* calculate remainder */ + FOR (i = codeword_length - deg_gp - 1; i >= 0; i--) + { + shift_buffer[0] = iobuf[i]; move16(); + lc = (UWord8)shl(shift_buffer[deg_gp], 4); move16(); + FOR (j = deg_gp - 1; j >= 0; j--) + { + shift_buffer[j + 1] = GF16_ADD(shift_buffer[j], GF16_MUL0(gp[j], lc)); move16(); + } + } + + /* add remainder to shifted data polynomial */ + FOR (i = 0; i < deg_gp; i++) + { + iobuf[i] = shift_buffer[i + 1]; move16(); + } + + /* add signaling polynomial */ + IF (signal_mode) + { + assert(codeword_length > EP_SIG_POLY_DEG); + FOR (i = 0; i <= EP_SIG_POLY_DEG; i++) + { + iobuf[i] = GF16_ADD(iobuf[i], sig_polys[fec_mode - 1][i]); move16(); + } + } + } + + Dyn_Mem_Deluxe_Out(); +} + +FEC_STATIC void fec_interleave_pack(UWord8 *out, UWord8 *in, Word16 n_nibbles, Word16 n_codewords) +{ + Dyn_Mem_Deluxe_In( + Word16 out_offset, cw_offset, codeword_length; + int i, j; + ); + + out_offset = 0; move16(); + cw_offset = 0; move16(); + + /* initialize output buffer to zero */ + basop_memset(out, 0, shr(n_nibbles, 1)); + + /* interleave and pack codewords */ + FOR (i = 0; i < n_codewords; i++) + { + codeword_length = get_codeword_length(n_codewords, n_nibbles, i); + + assert(codeword_length == (n_nibbles - i - 1) / n_codewords + 1); + FOR (j = 0; j < codeword_length; j++) + { + out_offset = add(i_mult(j, n_codewords), i); + out_offset = sub(n_nibbles, add(out_offset, 1)); + out[out_offset >> 1] = + (UWord8)s_or(out[out_offset >> 1], shl(in[cw_offset], shl(s_and(out_offset, 1), 2))); move16(); + cw_offset = add(cw_offset, 1); + } + } + + assert(cw_offset == n_nibbles); + Dyn_Mem_Deluxe_Out(); +} + +/* Decoder */ +FEC_STATIC void fec_data_postproc(Word16 mode, Word16 *epmr, UWord8 *obuf, Word16 data_bytes, UWord8 *cw_buf, + Word16 slot_bytes, Word16 pc_split, int *bfi) +{ + Dyn_Mem_Deluxe_In( + Word16 i; + Word16 n_crc1, n_crc2; + Word16 cw_buf_len; + Word16 tmp_epmr; + ); + + n_crc1 = crc1_bytes_by_mode1[mode]; move16(); + if (sub(slot_bytes, 40) == 0) + { + n_crc1 = crc1_bytes_by_mode0[mode]; move16(); + } + + n_crc2 = 0; move16(); + if (pc_split > 0) + { + n_crc2 = crc2_bytes_by_mode[mode]; move16(); + } + + assert(n_crc1 == (slot_bytes == 40 ? crc1_bytes_by_mode0[mode] : crc1_bytes_by_mode1[mode])); + assert(n_crc2 == ((pc_split > 0) && (mode > 1) ? crc2_bytes_by_mode[mode] : 0)); + + cw_buf_len = 2 * (data_bytes + n_crc1 + n_crc2); + + IF (sub(mode, 1)) + { + /* reverse bit-swap */ + dw0_bitswap(cw_buf, mode, slot_bytes); + tmp_epmr = dw0_get_epmr(cw_buf, mode, slot_bytes); + + IF (crc1(cw_buf + shl(add(n_crc1, n_crc2), 1), sub(shl(data_bytes, 1), pc_split), tmp_epmr, cw_buf, n_crc1, 1)) + { + *bfi = 1; move32(); + + Dyn_Mem_Deluxe_Out(); + return; + } + else + { + *epmr = tmp_epmr; + } + } + + test(); + IF (pc_split > 0 && sub(*bfi, 2) != 0) + { + IF (crc2(cw_buf + sub(shl(add(data_bytes, add(n_crc1, n_crc2)), 1), pc_split), pc_split, + cw_buf + shl(n_crc1, 1), n_crc2, 1)) + { + *bfi = 2; move32(); + } + } + + FOR (i = 0; i < data_bytes; i++) + { + obuf[i] = (UWord8)s_or(cw_buf[cw_buf_len - 2 * i - 1], shl(cw_buf[cw_buf_len - 2 * i - 2], 4)); move16(); + } + Dyn_Mem_Deluxe_Out(); +} + +int fec_decoder(UWord8 *iobuf, Word16 slot_bytes, int *data_bytes, Word16 *epmr, Word16 ccc_flag, Word16 *n_pccw, + int *bfi, Word16 *be_bp_left, Word16 *be_bp_right, Word16 *n_pc, Word16 *m_fec, void *scratch) +{ + Dyn_Mem_Deluxe_In( + UWord8 *my_scratch; + UWord8 *cw_buf; + UWord8 *array_of_trust; + Word16 i, j; + Word16 cw_offset, dw_offset; + Word16 n_codewords, redundancy_nibbles, codeword_length; + Word16 mode, error_report; + Word16 n_crc; + Word16 first_bad_cw; + Word16 pc_split; + ); + + IF (*bfi == 1) + { + Dyn_Mem_Deluxe_Out(); + return ERROR_REPORT_BEC_MASK; + } + + if (slot_bytes < FEC_SLOT_BYTES_MIN || slot_bytes > FEC_SLOT_BYTES_MAX) + { + *bfi = 1; + return ERROR_REPORT_BEC_MASK; + } + + my_scratch = (UWord8 *)scratch; move32(); + cw_buf = my_scratch; move32(); + my_scratch += 2 * slot_bytes; + + IF (ccc_flag == 0) + { + *be_bp_left = -1; move16(); + *be_bp_right = -1; move16(); + } + + n_codewords = get_n_codewords(slot_bytes); + + array_of_trust = my_scratch; move32(); + my_scratch += n_codewords; + + /* extract and de-interleave nibbles */ + fec_deinterleave_unpack(cw_buf, iobuf, 2 * slot_bytes, n_codewords); + + /* mode detection and error correction */ + mode = rs16_detect_and_correct(cw_buf, 2 * slot_bytes, n_codewords, epmr, &error_report, bfi, array_of_trust, + ccc_flag, n_pccw, (void *)my_scratch); + + /* for normal slots the maximal number of bit errors is limited */ + test(); +#ifndef APPLY_MAX_ERRORS + IF (sub(slot_bytes, 40) == 0 && mode > 0) + { + IF (sub(error_report & ERROR_REPORT_BEC_MASK, low_br_max_bit_errors_by_mode[mode]) > 0) + { + error_report &= ERROR_REPORT_BEC_MASK; + mode = -1; move16(); + *bfi = 1; move32(); + } + ELSE + { + IF (sub(error_report & ERROR_REPORT_BEC_MASK, low_br_max_bit_errors_by_mode[2]) > 0) + { + error_report &= ~ERROR_REPORT_EP2_OK; + } + IF (sub(error_report & ERROR_REPORT_BEC_MASK, low_br_max_bit_errors_by_mode[3])>0) + { + error_report &= ~ERROR_REPORT_EP3_OK; + } + } + } +#endif + + IF (sub(*bfi, 1) == 0) + { + *data_bytes = 0; move16(); + + Dyn_Mem_Deluxe_Out(); + return error_report; + } + + /* initialization for decoding */ + *data_bytes = fec_get_data_size(mode, ccc_flag, slot_bytes); move32(); + pc_split = fec_get_n_pc(mode, *n_pccw, slot_bytes); + n_crc = get_total_crc_size(slot_bytes, mode, pc_split); + UNUSED(n_crc); + + /* decoding of first code word */ + redundancy_nibbles = sub(hamming_distance_by_mode0[mode], 1); + codeword_length = get_codeword_length(n_codewords, add(slot_bytes, slot_bytes), 0); + + dw_offset = 0; move16(); + cw_offset = 0; move16(); + + FOR (j = redundancy_nibbles; j < codeword_length; j++) + { + cw_buf[dw_offset++] = cw_buf[j]; move16(); + } + cw_offset = add(cw_offset, codeword_length); + + /* decoding of remaining code words */ + redundancy_nibbles = sub(hamming_distance_by_mode1[mode], 1); + + FOR (i = 1; i < n_codewords; i++) + { + codeword_length = get_codeword_length(n_codewords, add(slot_bytes, slot_bytes), i); + + FOR (j = redundancy_nibbles; j < codeword_length; j++) + { + cw_buf[dw_offset++] = cw_buf[j + cw_offset]; move16(); + } + + cw_offset = add(cw_offset, codeword_length); + } + + assert(2 * (*data_bytes + n_crc) == dw_offset && 2 * slot_bytes == cw_offset); + + /* data postproc: hash validation and re-ordering */ + + fec_data_postproc(mode, epmr, iobuf, *data_bytes, cw_buf, slot_bytes, pc_split, bfi); + + IF (sub(*bfi, 1) == 0) + { + *data_bytes = 0; move32(); + error_report &= ERROR_REPORT_BEC_MASK; + Dyn_Mem_Deluxe_Out(); + return error_report; + } + + IF (*bfi == 2) + { + first_bad_cw = 0; move16(); + array_of_trust[*n_pccw] = 0; move16(); + WHILE (array_of_trust[first_bad_cw] != 0) + { + first_bad_cw = add(first_bad_cw, 1); + } + IF (sub(first_bad_cw, *n_pccw) == 0) + { + /* this is the case when CRC failed */ + *be_bp_left = 0; move16(); + } + ELSE + { + *be_bp_left = extract_l(L_mult0(fec_get_n_pc(mode, first_bad_cw, slot_bytes), 4)); move16(); + } + + FOR (i = *n_pccw - 1; i >= 0; i--) + { + if (!array_of_trust[i]) + { + BREAK; + } + } + IF (i < 0) + { + i = sub(*n_pccw, 1); + } + *be_bp_right = sub(extract_l(L_mult0(fec_get_n_pc(mode, i+1, slot_bytes), 4)), 1); move16(); + + } + + IF (ccc_flag == 0) + { + *n_pc = pc_split; move16(); + *m_fec = mode; move16(); + } + + + Dyn_Mem_Deluxe_Out(); + return error_report; +} + +FEC_STATIC void fec_deinterleave_unpack(UWord8 *out, UWord8 *in, Word16 n_nibbles, Word16 n_codewords) +{ + Dyn_Mem_Deluxe_In( + Word16 in_offset, out_offset, codeword_length; + int i, j; + ); + + in_offset = 0; move16(); + out_offset = 0; move16(); + + /* unpack nibbles in input buffer and deinterleave codewords */ + FOR (i = 0; i < n_codewords; i++) + { + codeword_length = get_codeword_length(n_codewords, n_nibbles, i); + FOR (j = 0; j < codeword_length; (j++, out_offset++)) + { + in_offset = add(i_mult(j, n_codewords), i); + in_offset = sub(n_nibbles, add(in_offset, 1)); + out[out_offset] = (UWord8)s_and(shr(in[in_offset >> 1], shl(s_and(in_offset, 1), 2)), 15); move16(); + } + } + + assert(out_offset == n_nibbles); + Dyn_Mem_Deluxe_Out(); +} + +FEC_STATIC Word16 fec_estimate_epmr_from_cw0(UWord8 *cw0, Word8 *t, UWord8 *syndromes, UWord8 *elp, Word8 *deg_elp, + UWord8 *err_pos, UWord8 *err_symb, Word16 n_codewords, Word16 n_symb) +{ + Dyn_Mem_Deluxe_In( + int epmr_lowest_risk_exp; + int start, inc, i, n_candidates; + int first_codeword_length; + int mode_counter; + Word16 epmr; + ); + + epmr_lowest_risk_exp = 0; + first_codeword_length = get_codeword_length(n_codewords, n_symb, 0); + start = 2; + inc = 1; + n_candidates = 0; + + /* test if first code word decodes in mode 0 or 1 without error correction */ + test(); + IF (s_or(syndromes[SYNDROME_IDX(0, 0)], syndromes[SYNDROME_IDX(0, 0) + 1]) == 0 || + s_or(syndromes[SYNDROME_IDX(1, 0)], syndromes[SYNDROME_IDX(1, 0) + 1]) == 0) + { + epmr_lowest_risk_exp = risk_table_f[1][0].exponent; move16(); + } + /* test if first code word decodes in mode 2 or 3 with lower risk */ + IF (sub(deg_elp[DEG_ELP_IDX(2, 0)], t[2]) <= 0) + { + IF (add(risk_table_f[2][deg_elp[DEG_ELP_IDX(2, 0)]].exponent, 8) <= 0) + { + n_candidates++; + start = 2; + } + } + + IF (sub(deg_elp[DEG_ELP_IDX(3, 0)], t[3]) <= 0) + { + IF (add(risk_table_f[3][deg_elp[DEG_ELP_IDX(3, 0)]].exponent, 8) <= 0) + { + n_candidates++; + start = 3; + } + } + + IF (sub(n_candidates, 1) > 0) + { + /* decide on order if mode 2 and 3 are considered */ + IF (simple_float_cmp(risk_table_f[2][deg_elp[DEG_ELP_IDX(2, 0)]], risk_table_f[3][deg_elp[DEG_ELP_IDX(3, 0)]]) < + 0) + { + start = 2; + inc = 1; + } + ELSE + { + start = 3; + inc = -1; + } + } + + FOR ((mode_counter = start, i = 0); i < n_candidates; (mode_counter += inc, i++)) + { + IF (sub(risk_table_f[mode_counter][deg_elp[DEG_ELP_IDX(mode_counter, 0)]].exponent, epmr_lowest_risk_exp) < 0) + { + IF (!rs16_factorize_elp(err_pos + ERR_POS_IDX(mode_counter, 0), elp + ELP_IDX(mode_counter, 0), + deg_elp[DEG_ELP_IDX(mode_counter, 0)], sub(first_codeword_length, 1))) + { + /* code word is decodable with error correction */ + epmr_lowest_risk_exp = risk_table_f[mode_counter][deg_elp[DEG_ELP_IDX(mode_counter, 0)]].exponent; + + rs16_calculate_errors(err_symb + ERR_SYMB_IDX(mode_counter, 0), err_pos + ERR_POS_IDX(mode_counter, 0), + syndromes + SYNDROME_IDX(mode_counter, 0), deg_elp[DEG_ELP_IDX(mode_counter, 0)], + t[mode_counter]); + + FOR (i = 0; i < deg_elp[DEG_ELP_IDX(mode_counter, 0)]; i++) + { + cw0[err_pos[ERR_POS_IDX(mode_counter, 0) + i]] = GF16_ADD( + cw0[err_pos[ERR_POS_IDX(mode_counter, 0) + i]], err_symb[ERR_SYMB_IDX(mode_counter, 0) + i]); + } + BREAK; + } + } + } + + epmr = cw0_get_epmr(cw0, sub(first_codeword_length, 1)); + + IF (add(epmr_lowest_risk_exp, 16) > 0) + { + epmr = add(epmr, 4); move16(); + } + IF (add(epmr_lowest_risk_exp, 8) > 0) + { + epmr = add(epmr, 4); move16(); + } + + Dyn_Mem_Deluxe_Out(); + return epmr; +} + +FEC_STATIC int rs16_detect_and_correct(UWord8 *iobuf, int n_symb, int n_codewords, Word16 *epmr, Word16 *error_report, + int *bfi, UWord8 *array_of_trust, int ccc_flag, Word16 *n_pccw, void *scratch) +{ + Dyn_Mem_Deluxe_In( + UWord8 * syndromes; + UWord8 * elp; + UWord8 * err_pos; + UWord8 * err_symb; + Word8 t[FEC_N_MODES]; + Word8 * deg_elp; + UWord8 * my_scratch; + UWord8 blacklist[FEC_N_MODES]; + UWord8 const *hamming_distance; + + Word16 i, cw_counter, mode_counter, cw_offset; + Word16 codeword_length; + Word16 mode; + Word16 mode_candidates[4]; + Word16 mode_broken[4]; + Word16 error_report_ep_ok[4]; + Word16 n_mode_candidates; + Word16 broken_cw, n_broken_cw; + Word16 j, idx_min; + Word16 n_pccw0; + simple_float val_min_f; + Word16 tmp; + Word16 epmr_position; + simple_float dec_risk_f[FEC_N_MODES]; + simple_float risk_min_f; + simple_float ep_risk_thresh; + + int epmr_dec_fail_increment; + + void (*syndr_calc[3])(UWord8 *, UWord8 *, int); + ); + + /* initialization */ + blacklist[0] = 0; move16(); + blacklist[1] = 0; move16(); + blacklist[2] = 0; move16(); + blacklist[3] = 0; move16(); + mode_broken[0] = 0; move16(); + mode_broken[1] = 0; move16(); + mode_broken[2] = 0; move16(); + mode_broken[3] = 0; move16(); + error_report_ep_ok[0] = ERROR_REPORT_EP1_OK; + error_report_ep_ok[1] = ERROR_REPORT_EP2_OK; + error_report_ep_ok[2] = ERROR_REPORT_EP3_OK; + error_report_ep_ok[3] = ERROR_REPORT_EP4_OK; + my_scratch = (UWord8 *)scratch; + hamming_distance = &hamming_distance_by_mode0[1]; + mode = -1; move16(); + n_mode_candidates = 0; move16(); + risk_min_f.mantissa = SIMPLE_FLOAT_1_MANTISSA; move16(); + risk_min_f.exponent = 0; move16(); + + IF (n_symb <= 80) + { + ep_risk_thresh.mantissa = EP_RISK_THRESH_NS_M; move16(); + ep_risk_thresh.exponent = EP_RISK_THRESH_NS_E; move16(); + } + ELSE + { + ep_risk_thresh.mantissa = EP_RISK_THRESH_OS_M; move16(); + ep_risk_thresh.exponent = EP_RISK_THRESH_OS_E; move16(); + } + + syndr_calc[0] = &rs16_calculate_two_syndromes; + syndr_calc[1] = &rs16_calculate_four_syndromes; + syndr_calc[2] = &rs16_calculate_six_syndromes; + + FOR (i = 0; i < FEC_N_MODES; i++) + { + t[i] = (Word8)shr(sub(hamming_distance[i], 1), 1); move16(); + } + + syndromes = my_scratch; + my_scratch += FEC_TOTAL_SYNDROME_SIZE; + elp = my_scratch; + my_scratch += FEC_TOTAL_ELP_SIZE; + err_pos = my_scratch; + my_scratch += FEC_TOTAL_ERR_POS_SIZE; + err_symb = my_scratch; + my_scratch += FEC_TOTAL_ERROR_SIZE; + deg_elp = (Word8 *)my_scratch; + my_scratch += FEC_TOTAL_DEG_ELP_SIZE; + + *error_report = 0; move16(); + *bfi = 0; move32(); + + /* mode detection (stage 1) */ + codeword_length = get_codeword_length(n_codewords, n_symb, 0); + + epmr_position = sub(codeword_length, 1); + + rs16_calculate_two_syndromes(syndromes + SYNDROME_IDX(0, 0), iobuf, sub(codeword_length, 1)); + + IF (s_or(syndromes[0 + SYNDROME_IDX(0, 0)], syndromes[1 + SYNDROME_IDX(0, 0)]) == 0) + { + + /* data validation for fec mode 1 */ + *epmr = cw0_get_epmr(iobuf, epmr_position); + + dw0_bitswap(iobuf + 2, 1, n_symb / 2); + + IF (!crc1(iobuf + 8, sub(n_symb, 8), *epmr, iobuf + 2, 3, 1)) + { + mode = 0; move16(); + *error_report |= ERROR_REPORT_ALL_OK; + Dyn_Mem_Deluxe_Out(); + return add(mode, 1); + } + ELSE + { + /* reverse bit swap */ + dw0_bitswap(iobuf + 2, 1, n_symb / 2); + + *epmr = add(*epmr, 4); move16(); + } + } + + blacklist[0] = 1; move16(); + + /* mode detection (stage 2) */ + + /* calculate syndromes of code words 0 to 5 and modes 1 to 3 */ + cw_offset = 0; move16(); + + FOR (cw_counter = 0; cw_counter < 6; cw_counter++) + { + codeword_length = get_codeword_length(n_codewords, n_symb, cw_counter); + + rs16_calculate_six_syndromes(syndromes + SYNDROME_IDX(1, cw_counter), iobuf + cw_offset, + sub(codeword_length, 1)); + + cw_offset = add(cw_offset, codeword_length); + + FOR (mode_counter = FEC_N_MODES - 1; mode_counter >= 1; mode_counter--) + { + FOR (i = 0; i < sub(hamming_distance[mode_counter], 1); i++) + { + syndromes[SYNDROME_IDX(mode_counter, cw_counter) + i] = GF16_ADD( + syndromes[SYNDROME_IDX(1, cw_counter) + i], sig_poly_syndr[mode_counter][i]); move16(); + } + } + } + + /* check for valid code words */ + FOR (mode_counter = 1; mode_counter < FEC_N_MODES; mode_counter++) + { + n_broken_cw = 0; + FOR (cw_counter = 0; cw_counter < 6; cw_counter++) + { + broken_cw = 0; + FOR (i = 0; i < sub(hamming_distance[mode_counter], 1); i++) + { + broken_cw = s_or(broken_cw, syndromes[SYNDROME_IDX(mode_counter, cw_counter) + i]); move16(); + } + IF (broken_cw != 0) + { + n_broken_cw = add(n_broken_cw, 1); + } + } + + IF (n_broken_cw == 0) + { + mode = mode_counter; move16(); + cw_offset = 0; move16(); + + *epmr = cw0_get_epmr(iobuf, epmr_position); + + FOR (cw_counter = 0; cw_counter < 6; cw_counter++) + { + codeword_length = get_codeword_length(n_codewords, n_symb, cw_counter); + FOR (i = 0; i <= EP_SIG_POLY_DEG; i++) + { + iobuf[cw_offset + i] = GF16_ADD(iobuf[cw_offset + i], sig_polys[mode][i]); + } + cw_offset = add(cw_offset, codeword_length); + } + } + } + + IF (mode < 0) /* mode hasn't been detected so far -> errors occurred in transmission */ + { + /* calculate error locator polynomials for code words 0 to 5 */ + FOR (mode_counter = 1; mode_counter < FEC_N_MODES; mode_counter++) + { + FOR (cw_counter = 0; cw_counter < 6; cw_counter++) + { + deg_elp[DEG_ELP_IDX(mode_counter, cw_counter)] = rs16_calculate_elp( + elp + ELP_IDX(mode_counter, cw_counter), syndromes + SYNDROME_IDX(mode_counter, cw_counter), + t[mode_counter]); move16(); + IF (sub(deg_elp[DEG_ELP_IDX(mode_counter, cw_counter)], t[mode_counter]) > 0) + { + blacklist[mode_counter] = 1; move16(); + BREAK; + } + } + } + + /* risk analysis for mode candidate selection */ + FOR (mode_counter = 1; mode_counter < FEC_N_MODES; mode_counter++) + { + dec_risk_f[mode_counter].mantissa = SIMPLE_FLOAT_1_MANTISSA; move16(); + dec_risk_f[mode_counter].exponent = 0; move16(); + + IF (blacklist[mode_counter] == 0) + { + FOR (cw_counter = 0; cw_counter < 6; cw_counter++) + { + dec_risk_f[mode_counter] = simple_float_mul( + dec_risk_f[mode_counter], + risk_table_f[mode_counter][deg_elp[DEG_ELP_IDX(mode_counter, cw_counter)]]); move16(); + } + + IF (simple_float_cmp(dec_risk_f[mode_counter], ep_risk_thresh) <= 0) + { + mode_candidates[n_mode_candidates++] = mode_counter; move16(); + } + + IF (simple_float_cmp(dec_risk_f[mode_counter], risk_min_f) < 0) + { + risk_min_f = dec_risk_f[mode_counter]; move16(); + } + } + } + assert(n_mode_candidates <= 4); /* suppress false gcc warning when OPTIM=3 */ + + /* sort mode candidates by risk */ + FOR (i = 0; i < n_mode_candidates; i++) + { + idx_min = i; move16(); + val_min_f = dec_risk_f[mode_candidates[i]]; move16(); + + FOR (j = i + 1; j < n_mode_candidates; j++) + { + IF (simple_float_cmp(dec_risk_f[mode_candidates[j]], val_min_f) < 0) + { + val_min_f = dec_risk_f[mode_candidates[j]]; move16(); + idx_min = j; move16(); + } + } + + IF (sub(idx_min, i) > 0) + { + tmp = mode_candidates[i]; move16(); + mode_candidates[i] = mode_candidates[idx_min]; move16(); + mode_candidates[idx_min] = tmp; move16(); + } + } + + /* try out candidate modes */ + FOR (i = 0; i < n_mode_candidates; i++) + { + mode = mode_candidates[i]; move16(); + + FOR (cw_counter = 0; cw_counter < 6; cw_counter++) + { + codeword_length = get_codeword_length(n_codewords, n_symb, cw_counter); + + IF (deg_elp[DEG_ELP_IDX(mode, cw_counter)]) + { + IF (rs16_factorize_elp(err_pos + ERR_POS_IDX(mode, cw_counter), elp + ELP_IDX(mode, cw_counter), + deg_elp[DEG_ELP_IDX(mode, cw_counter)], sub(codeword_length, 1))) + { + /* elp did not split into distinct linear factors or error position was out of range */ + mode = -1; move16(); + BREAK; + } + } + } + IF (mode > 0) + { + /* decodable mode with lowest risk has been found */ + BREAK; + } + } + + IF (mode < 0) + { + /* no decodable mode has been found */ + *error_report = ERROR_REPORT_BEC_MASK; move16(); + *bfi = 1; move32(); + mode = -1; move16(); + + *epmr = fec_estimate_epmr_from_cw0(iobuf, t, syndromes, elp, deg_elp, err_pos, err_symb, n_codewords, + n_symb); + + Dyn_Mem_Deluxe_Out(); + return mode; + } + + /* perform error correction */ + cw_offset = 0; move16(); + *error_report = 0; move16(); + FOR (cw_counter = 0; cw_counter < 6; cw_counter++) + { + codeword_length = get_codeword_length(n_codewords, n_symb, cw_counter); + + IF (deg_elp[DEG_ELP_IDX(mode, cw_counter)]) + { + rs16_calculate_errors( + err_symb + ERR_SYMB_IDX(mode, cw_counter), err_pos + ERR_POS_IDX(mode, cw_counter), + syndromes + SYNDROME_IDX(mode, cw_counter), deg_elp[DEG_ELP_IDX(mode, cw_counter)], t[mode]); + + /* correct errors and sum up number of corrected bits */ + FOR (i = 0; i < deg_elp[DEG_ELP_IDX(mode, cw_counter)]; i++) + { + iobuf[err_pos[ERR_POS_IDX(mode, cw_counter) + i] + cw_offset] = + GF16_ADD(iobuf[err_pos[ERR_POS_IDX(mode, cw_counter) + i] + cw_offset], + err_symb[ERR_SYMB_IDX(mode, cw_counter) + i]); + *error_report = add(*error_report, + rs16_bit_count_table[err_symb[ERR_SYMB_IDX(mode, cw_counter) + i]]); move16(); + } + + FOR (i = 0; i < mode; i ++) + { + IF(deg_elp[DEG_ELP_IDX(mode, cw_counter)] > i) + { + mode_broken[i] = 1; + } + } + } + + FOR (i = 0; i <= EP_SIG_POLY_DEG; i++) + { + iobuf[cw_offset + i] = GF16_ADD(iobuf[cw_offset + i], sig_polys[mode][i]); + } + cw_offset = add(cw_offset, codeword_length); + } + + /* set epmr according to risk value of cw0 */ + epmr_dec_fail_increment = 8; + + IF (add(risk_table_f[mode][deg_elp[DEG_ELP_IDX(mode, 0)]].exponent, 8) <= 0) + { + epmr_dec_fail_increment = sub(epmr_dec_fail_increment, 4); + } + IF (add(risk_table_f[mode][deg_elp[DEG_ELP_IDX(mode, 0)]].exponent, 16) <= 0) + { + epmr_dec_fail_increment = sub(epmr_dec_fail_increment, 4); + } + + *epmr = cw0_get_epmr(iobuf, epmr_position) + epmr_dec_fail_increment; + } + + /* mode has been successfully detected -> now check and try to correct remaining code words*/ + *n_pccw = fec_get_n_pccw(n_symb / 2, mode + 1, ccc_flag); + IF (ccc_flag == 0) + { + n_pccw0 = fec_get_n_pccw(n_symb / 2, mode + 1, ccc_flag); + *n_pccw = n_pccw0; + } + ELSE + { + n_pccw0 = 0; + } + + FOR (cw_counter = 6; cw_counter < n_codewords; cw_counter++) + { + /* usual error correction scheme: syndromes -> elp's, errors, etc. */ + codeword_length = get_codeword_length(n_codewords, n_symb, cw_counter); + array_of_trust[n_codewords - 1 - cw_counter] = 1; move16(); + + syndr_calc[sub(t[mode], 1)](syndromes, iobuf + cw_offset, sub(codeword_length, 1)); + + deg_elp[0] = rs16_calculate_elp(elp, syndromes, t[mode]); move16(); + + FOR (i = 0; i < mode; i ++) + { + IF(deg_elp[0] > i) + { + mode_broken[i] = 1; + } + } + IF (sub(deg_elp[0], t[mode]) > 0) + { + FOR (i = 0; i < 4; i ++) + { + mode_broken[i] = 1; + } + cw_offset = add(cw_offset, codeword_length); + IF (cw_counter < n_codewords - n_pccw0) + { + *error_report = ERROR_REPORT_BEC_MASK; move16(); + mode = -1; move16(); + *bfi = 1; move32(); + + BREAK; + } + ELSE + { + *bfi = 2; move32(); + array_of_trust[n_codewords - 1 - cw_counter] = 0; move16(); + CONTINUE; + } + } + + IF (deg_elp[0]) + { + IF (rs16_factorize_elp(err_pos, elp, deg_elp[0], sub(codeword_length, 1))) + { + cw_offset = add(cw_offset, codeword_length); + FOR (i = 0; i < 4; i ++) + { + mode_broken[i] = 1; + } + IF (add(n_pccw0, sub(cw_counter, n_codewords)) < 0) + { + *error_report = ERROR_REPORT_BEC_MASK; move16(); + mode = -1; move16(); + *bfi = 1; move32(); + + BREAK; + } + ELSE + { + *bfi = 2; move32(); + array_of_trust[n_codewords - 1 - cw_counter] = 0; move16(); + CONTINUE; + } + } + + rs16_calculate_errors(err_symb, err_pos, syndromes, deg_elp[0], t[mode]); + + /* correct errors and sum up number of corrected bits */ + FOR (i = 0; i < deg_elp[0]; i++) + { + iobuf[err_pos[i] + cw_offset] = GF16_ADD(iobuf[err_pos[i] + cw_offset], err_symb[i]); + *error_report = add(*error_report, rs16_bit_count_table[err_symb[i]]); + } + } + cw_offset = add(cw_offset, codeword_length); + if (add(risk_table_f[mode][deg_elp[0]].exponent, 16) > 0) + { + array_of_trust[n_codewords - 1 - cw_counter] = 0; move16(); + } + } + + *error_report &= ERROR_REPORT_BEC_MASK; + FOR (i = 0; i < 4; i ++) + { + IF (!mode_broken[i]) + { + *error_report |= error_report_ep_ok[i]; + } + } + + Dyn_Mem_Deluxe_Out(); + IF (mode >= 0) + { + return add(mode, 1); + } + + return -1; +} + +FEC_STATIC void rs16_calculate_six_syndromes(UWord8 *syndromes, UWord8 *cw, int cw_poly_deg) +{ + Dyn_Mem_Deluxe_In( + int i; + UWord8 buffer[15]; + ); + + assert(cw_poly_deg >= 12); + + FOR (i = 0; i <= cw_poly_deg; i++) + { + buffer[i] = cw[i]; move16(); + } + + syndromes[0] = buffer[0]; move16(); + syndromes[1] = buffer[0]; move16(); + syndromes[2] = buffer[0]; move16(); + syndromes[3] = buffer[0]; move16(); + syndromes[4] = buffer[0]; move16(); + syndromes[5] = buffer[0]; move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[1], 32)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[1], 64)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[1], 128)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[1], 48)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[1], 96)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[1], 192)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[2], 64)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[2], 48)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[2], 192)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[2], 80)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[2], 112)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[2], 240)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[3], 128)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[3], 192)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[3], 160)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[3], 240)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[3], 16)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[3], 128)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[4], 48)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[4], 80)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[4], 240)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[4], 32)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[4], 96)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[4], 160)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[5], 96)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[5], 112)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[5], 16)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[5], 96)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[5], 112)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[5], 16)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[6], 192)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[6], 240)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[6], 128)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[6], 160)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[6], 16)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[6], 192)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[7], 176)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[7], 144)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[7], 192)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[7], 208)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[7], 96)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[7], 240)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[8], 80)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[8], 32)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[8], 160)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[8], 64)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[8], 112)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[8], 128)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[9], 160)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[9], 128)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[9], 240)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[9], 192)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[9], 16)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[9], 160)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[10], 112)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[10], 96)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[10], 16)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[10], 112)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[10], 96)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[10], 16)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[11], 224)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[11], 176)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[11], 128)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[11], 144)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[11], 112)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[11], 192)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[12], 240)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[12], 160)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[12], 192)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[12], 128)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[12], 16)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[12], 240)); move16(); + + IF (sub(cw_poly_deg, 13) >= 0) + { + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[13], 208)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[13], 224)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[13], 160)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[13], 176)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[13], 96)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[13], 128)); move16(); + } + + IF (sub(cw_poly_deg, 14) >= 0) + { + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[14], 144)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[14], 208)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[14], 240)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[14], 224)); move16(); + syndromes[4] = GF16_ADD(syndromes[4], GF16_MUL0(buffer[14], 112)); move16(); + syndromes[5] = GF16_ADD(syndromes[5], GF16_MUL0(buffer[14], 160)); move16(); + } + + Dyn_Mem_Deluxe_Out(); +} + +FEC_STATIC void rs16_calculate_four_syndromes(UWord8 *syndromes, UWord8 *cw, int cw_poly_deg) +{ + Dyn_Mem_Deluxe_In( + int i; + UWord8 buffer[15]; + ); + + assert(cw_poly_deg >= 12); + + FOR (i = 0; i <= cw_poly_deg; i++) + { + buffer[i] = cw[i]; move16(); + } + + syndromes[0] = buffer[0]; move16(); + syndromes[1] = buffer[0]; move16(); + syndromes[2] = buffer[0]; move16(); + syndromes[3] = buffer[0]; move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[1], 32)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[1], 64)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[1], 128)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[1], 48)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[2], 64)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[2], 48)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[2], 192)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[2], 80)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[3], 128)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[3], 192)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[3], 160)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[3], 240)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[4], 48)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[4], 80)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[4], 240)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[4], 32)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[5], 96)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[5], 112)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[5], 16)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[5], 96)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[6], 192)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[6], 240)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[6], 128)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[6], 160)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[7], 176)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[7], 144)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[7], 192)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[7], 208)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[8], 80)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[8], 32)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[8], 160)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[8], 64)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[9], 160)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[9], 128)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[9], 240)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[9], 192)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[10], 112)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[10], 96)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[10], 16)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[10], 112)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[11], 224)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[11], 176)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[11], 128)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[11], 144)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[12], 240)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[12], 160)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[12], 192)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[12], 128)); move16(); + + IF (sub(cw_poly_deg, 13) >= 0) + { + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[13], 208)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[13], 224)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[13], 160)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[13], 176)); move16(); + } + + IF (sub(cw_poly_deg, 14) >= 0) + { + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[14], 144)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[14], 208)); move16(); + syndromes[2] = GF16_ADD(syndromes[2], GF16_MUL0(buffer[14], 240)); move16(); + syndromes[3] = GF16_ADD(syndromes[3], GF16_MUL0(buffer[14], 224)); move16(); + } + + Dyn_Mem_Deluxe_Out(); +} + +FEC_STATIC void rs16_calculate_two_syndromes(UWord8 *syndromes, UWord8 *cw, int cw_poly_deg) +{ + Dyn_Mem_Deluxe_In( + int i; + UWord8 buffer[15]; + ); + + assert(cw_poly_deg >= 12); + + FOR (i = 0; i <= cw_poly_deg; i++) + { + buffer[i] = cw[i]; move16(); + } + + syndromes[0] = buffer[0]; move16(); + syndromes[1] = buffer[0]; move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[1], 32)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[1], 64)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[2], 64)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[2], 48)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[3], 128)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[3], 192)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[4], 48)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[4], 80)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[5], 96)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[5], 112)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[6], 192)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[6], 240)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[7], 176)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[7], 144)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[8], 80)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[8], 32)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[9], 160)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[9], 128)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[10], 112)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[10], 96)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[11], 224)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[11], 176)); move16(); + + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[12], 240)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[12], 160)); move16(); + + IF (sub(cw_poly_deg, 13) >= 0) + { + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[13], 208)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[13], 224)); move16(); + } + + IF (sub(cw_poly_deg, 14) >= 0) + { + syndromes[0] = GF16_ADD(syndromes[0], GF16_MUL0(buffer[14], 144)); move16(); + syndromes[1] = GF16_ADD(syndromes[1], GF16_MUL0(buffer[14], 208)); move16(); + } + + Dyn_Mem_Deluxe_Out(); +} + +FEC_STATIC Word8 rs16_calculate_elp(UWord8 *elp, UWord8 *syndromes, Word16 t) +/* calculates error locator polynomial vie Petterson's algorithm */ +{ + Dyn_Mem_Deluxe_In( + Word8 ret; + UWord8 det, det_inv, aux, all_s, *s; + UWord8 s22, s33, s44, s13, s14, s15; + UWord8 s23, s24, s25, s34, s35; + UWord8 a, b, c, d, e, f; + ); + + ret = 0; move16(); + all_s = 0; move16(); + s = syndromes; move16(); + elp[0] = 1; move16(); + basop_memset(elp + 1, 0, 3); + + SWITCH (t) + { + case 3: + { + /* check for errors */ + all_s = (UWord8)s_or(s[0], s_or(s[1], s_or(s[2], s_or(s[3], s_or(s[4], s[5]))))); + + IF (all_s == 0) + { + BREAK; + } + + /* assume 3 errors */ + s22 = GF16_MUL(s[1], s[1]); + s33 = GF16_MUL(s[2], s[2]); + s44 = GF16_MUL(s[3], s[3]); + s13 = GF16_MUL(s[0], s[2]); + + det = GF16_ADD(GF16_ADD(GF16_MUL(s13, s[4]), GF16_MUL(s44, s[0])), + GF16_ADD(GF16_MUL(s22, s[4]), GF16_MUL(s33, s[2]))); + + IF (det) + { + det_inv = (UWord8)shl(gf16_inv_table[det], 4); + + s14 = GF16_MUL(s[0], s[3]); + s15 = GF16_MUL(s[0], s[4]); + + s23 = GF16_MUL(s[1], s[2]); + s24 = GF16_MUL(s[1], s[3]); + s25 = GF16_MUL(s[1], s[4]); + + s34 = GF16_MUL(s[2], s[3]); + s35 = GF16_MUL(s[2], s[4]); + + a = GF16_ADD(s35, s44) << 4; + b = GF16_ADD(s15, s33) << 4; + c = GF16_ADD(s13, s22) << 4; + d = GF16_ADD(s34, s25) << 4; + e = GF16_ADD(s23, s14) << 4; + f = GF16_ADD(s24, s33) << 4; + + aux = GF16_ADD(GF16_ADD(GF16_MUL0(a, s[3]), GF16_MUL0(d, s[4])), GF16_MUL0(f, s[5])); + elp[3] = GF16_MUL0(aux, det_inv); + + aux = GF16_ADD(GF16_ADD(GF16_MUL0(d, s[3]), GF16_MUL0(b, s[4])), GF16_MUL0(e, s[5])); + elp[2] = GF16_MUL0(aux, det_inv); + + aux = GF16_ADD(GF16_ADD(GF16_MUL0(f, s[3]), GF16_MUL0(e, s[4])), GF16_MUL0(c, s[5])); + elp[1] = GF16_MUL0(aux, det_inv); + + IF (elp[3] == 0) + { + ret = (Word8) add(t, 1); + } + ELSE + { + ret = 3; move16(); + } + BREAK; + } + + /* assume two errors */ + det = GF16_ADD(GF16_MUL(syndromes[0], syndromes[2]), GF16_MUL(syndromes[1], syndromes[1])); + + IF (det) + { + det_inv = (UWord8)shl(gf16_inv_table[det], 4); + + aux = GF16_ADD(GF16_MUL(syndromes[1], syndromes[2]), GF16_MUL(syndromes[0], syndromes[3])); + elp[1] = GF16_MUL0(aux, det_inv); + + aux = GF16_ADD(GF16_MUL(syndromes[2], syndromes[2]), GF16_MUL(syndromes[1], syndromes[3])); + elp[2] = GF16_MUL0(aux, det_inv); + + /* check remaining LSF relations */ + aux = (UWord8)s_or(GF16_ADD(GF16_ADD(GF16_MUL(elp[2], s[2]), GF16_MUL(elp[1], s[3])), s[4]), + GF16_ADD(GF16_ADD(GF16_MUL(elp[2], s[3]), GF16_MUL(elp[1], s[4])), s[5])); + + aux = (UWord8)s_or(aux, elp[2] == 0); + + IF (aux != 0) + { + ret = (Word8) add(t, 1); + } + ELSE + { + ret = 2; move16(); + } + BREAK; + } + + /* assume one error */ + IF (syndromes[0] != 0) + { + elp[1] = GF16_MUL(syndromes[1], gf16_inv_table[syndromes[0]]); + + /* check remaining LSF relations */ + aux = (UWord8)s_or(s_or(GF16_ADD(GF16_MUL(elp[1], s[1]), s[2]), GF16_ADD(GF16_MUL(elp[1], s[2]), s[3])), + s_or(GF16_ADD(GF16_MUL(elp[1], s[3]), s[4]), GF16_ADD(GF16_MUL(elp[1], s[4]), s[5]))); + + aux = (UWord8)s_or(aux, elp[1] == 0); + + IF (aux != 0) + { + ret = (Word8) add(t, 1); + } + ELSE + { + ret = 1; move16(); + } + BREAK; + } + + ret = (Word8) add(t, 1); + BREAK; + } + case 2: + { + all_s = (UWord8)s_or(s[0], s_or(s[1], s_or(s[2], s[3]))); + + IF (all_s == 0) + { + BREAK; + } + + /* assume two errors */ + det = GF16_ADD(GF16_MUL(syndromes[0], syndromes[2]), GF16_MUL(syndromes[1], syndromes[1])); + + IF (det) + { + det_inv = (UWord8)shl(gf16_inv_table[det], 4); + + aux = GF16_ADD(GF16_MUL(syndromes[1], syndromes[2]), GF16_MUL(syndromes[0], syndromes[3])); + elp[1] = GF16_MUL0(aux, det_inv); + + aux = GF16_ADD(GF16_MUL(syndromes[2], syndromes[2]), GF16_MUL(syndromes[1], syndromes[3])); + elp[2] = GF16_MUL0(aux, det_inv); + + IF (elp[2] == 0) + { + ret = (Word8) add(t, 1); + } + ELSE + { + ret = 2; move16(); + } + BREAK; + } + + /* assume one error */ + IF (syndromes[0] != 0) + { + elp[1] = GF16_MUL(syndromes[1], gf16_inv_table[syndromes[0]]); + + /* check remaining LSF relation */ + aux = (UWord8)s_or(GF16_ADD(GF16_MUL(elp[1], s[1]), s[2]), GF16_ADD(GF16_MUL(elp[1], s[2]), s[3])); + aux = (UWord8)s_or(aux, elp[1] == 0); + IF (aux != 0) + { + ret = (Word8) add(t, 1); + } + ELSE + { + ret = 1; move16(); + } + BREAK; + } + + ret = (Word8) add(t, 1); + BREAK; + } + case 1: + { + all_s = (UWord8)s_or(s[0], s[1]); + + IF (all_s == 0) + { + BREAK; + } + + IF (syndromes[0] != 0) + { + elp[1] = GF16_MUL(syndromes[1], gf16_inv_table[syndromes[0]]); + IF (elp[1] == 0) + { + ret = (Word8) add(t, 1); + } + ELSE + { + ret = 1; move16(); + } + BREAK; + } + + ret = (Word8) add(t, 1); + BREAK; + } + default: assert(0 && "calculating elp of this degree not implemented"); + } + + Dyn_Mem_Deluxe_Out(); + return ret; +} + +FEC_STATIC Word16 rs16_factorize_elp(UWord8 *err_pos, UWord8 *elp, Word16 deg_elp, Word16 max_pos) +{ + Dyn_Mem_Deluxe_In( + UWord8 beta, gamma; + Word16 zeros, err_pos0, err_pos1, err_pos2, ret; + ); + + beta = 0; move16(); + gamma = 0; move16(); + zeros = 0; move16(); + ret = 0; move16(); + + SWITCH (deg_elp) + { + case 0: BREAK; + + case 1: + err_pos0 = gf16_log_g[elp[1]]; move16(); + IF (sub(err_pos0, max_pos) > 0) + { + ret = 1; move16(); + BREAK; + } + + err_pos[0] = (UWord8)err_pos0; move16(); + BREAK; + + case 2: + zeros = rs16_elp_deg2_table[s_or(elp[1], shl(elp[2], 4))]; move16(); + IF (zeros == 0) + { + Dyn_Mem_Deluxe_Out(); + return 1; + } + + err_pos0 = s_and(zeros, 15); + err_pos1 = s_and(shr(zeros, 4), 15); + + IF (sub(err_pos0, max_pos) > 0 || sub(err_pos1, max_pos) > 0) + { + ret = 1; move16(); + BREAK; + } + + err_pos[0] = (UWord8)err_pos0; move16(); + err_pos[1] = (UWord8)err_pos1; move16(); + BREAK; + + case 3: + /* beta = a*a + b, gamma = a*b + c */ + beta = GF16_ADD(GF16_MUL(elp[1], elp[1]), elp[2]); + gamma = GF16_ADD(GF16_MUL(elp[1], elp[2]), elp[3]); + zeros = rs16_elp_deg3_table[beta | gamma << 4]; + + IF (zeros == 0) + /* elp does not split over GF(16) or has multiple zeros */ + { + ret = 1; move16(); + BREAK; + } + + /* remove shift from zeros */ + err_pos0 = GF16_ADD(s_and(zeros, 15), elp[1]); + err_pos1 = GF16_ADD(s_and(shr(zeros, 4), 15), elp[1]); + err_pos2 = GF16_ADD(s_and(shr(zeros, 8), 15), elp[1]); + + IF (err_pos0 == 0 || err_pos1 == 0 || err_pos2 == 0) + { + test(); test(); + Dyn_Mem_Deluxe_Out(); + return 1; + } + + err_pos0 = gf16_log_g[err_pos0]; + err_pos1 = gf16_log_g[err_pos1]; + err_pos2 = gf16_log_g[err_pos2]; + + IF (sub(err_pos0, max_pos) > 0 || sub(err_pos1, max_pos) > 0 || sub(err_pos2, max_pos) > 0) + { + test(); test(); + ret = 1; move16(); + BREAK; + } + + err_pos[0] = (UWord8)err_pos0; move16(); + err_pos[1] = (UWord8)err_pos1; move16(); + err_pos[2] = (UWord8)err_pos2; move16(); + + BREAK; + + default: assert(0 && "invalid degree in rs16_error_locator"); + } + + Dyn_Mem_Deluxe_Out(); + return ret; +} + +FEC_STATIC void rs16_calculate_errors(UWord8 *err_symb, UWord8 *err_pos, UWord8 *syndromes, Word8 deg_elp, Word8 t) +{ + Dyn_Mem_Deluxe_In( + UWord8 det_inv; + UWord8 x0, x1, x2; + UWord8 x0sq, x1sq, x2sq; + UWord8 c0, c1, c2; + UWord8 s0, s1, s2; + UWord8 tmp; + ); + + assert(deg_elp <= t); + UNUSED(t); + + SWITCH (deg_elp) + { + case 0: BREAK; + + case 1: + err_symb[0] = GF16_MUL(gf16_g_pow[15 - err_pos[0]], syndromes[0]); move16(); + + BREAK; + + case 2: + s0 = (UWord8)shl(syndromes[0], 4); + s1 = (UWord8)shl(syndromes[1], 4); + + x0 = gf16_g_pow[err_pos[0]]; move16(); + x1 = gf16_g_pow[err_pos[1]]; move16(); + + x0sq = GF16_MUL(x0, x0); + x1sq = GF16_MUL(x1, x1); + + tmp = GF16_ADD(GF16_MUL(x0sq, x1), GF16_MUL(x1sq, x0)); + det_inv = (UWord8)shl(gf16_inv_table[tmp], 4); + + tmp = GF16_ADD(GF16_MUL0(x1sq, s0), GF16_MUL0(x1, s1)); + err_symb[0] = GF16_MUL0(tmp, det_inv); move16(); + + tmp = GF16_ADD(GF16_MUL0(x0sq, s0), GF16_MUL0(x0, s1)); + err_symb[1] = GF16_MUL0(tmp, det_inv); move16(); + + BREAK; + + case 3: + s0 = (UWord8)shl(syndromes[0], 4); + s1 = (UWord8)shl(syndromes[1], 4); + s2 = (UWord8)shl(syndromes[2], 4); + + x0 = gf16_g_pow[err_pos[0]]; move16(); + x1 = gf16_g_pow[err_pos[1]]; move16(); + x2 = gf16_g_pow[err_pos[2]]; move16(); + + x0sq = GF16_MUL(x0, x0); + x1sq = GF16_MUL(x1, x1); + x2sq = GF16_MUL(x2, x2); + + tmp = GF16_MUL(GF16_ADD(x1, x0), GF16_ADD(x2, x0)); + tmp = GF16_MUL(GF16_ADD(x2, x1), tmp); + det_inv = (UWord8)shl(gf16_inv_table[tmp], 4); + + c0 = GF16_ADD(GF16_MUL(x1, x2sq), GF16_MUL(x2, x1sq)); + c1 = GF16_ADD(x2sq, x1sq); + c2 = GF16_ADD(x2, x1); + + err_symb[0] = GF16_ADD(GF16_ADD(GF16_MUL0(c0, s0), GF16_MUL0(c1, s1)), GF16_MUL0(c2, s2)); move16(); + + c0 = GF16_ADD(GF16_MUL(x0, x2sq), GF16_MUL(x2, x0sq)); + c1 = GF16_ADD(x2sq, x0sq); + c2 = GF16_ADD(x2, x0); + + err_symb[1] = GF16_ADD(GF16_ADD(GF16_MUL0(c0, s0), GF16_MUL0(c1, s1)), GF16_MUL0(c2, s2)); move16(); + + c0 = GF16_ADD(GF16_MUL(x0, x1sq), GF16_MUL(x1, x0sq)); + c1 = GF16_ADD(x1sq, x0sq); + c2 = GF16_ADD(x1, x0); + + err_symb[2] = GF16_ADD(GF16_ADD(GF16_MUL0(c0, s0), GF16_MUL0(c1, s1)), GF16_MUL0(c2, s2)); move16(); + + tmp = GF16_MUL0(err_symb[0], det_inv); + err_symb[0] = GF16_MUL(tmp, gf16_inv_table[x0]); move16(); + + tmp = GF16_MUL0(err_symb[1], det_inv); + err_symb[1] = GF16_MUL(tmp, gf16_inv_table[x1]); move16(); + + tmp = GF16_MUL0(err_symb[2], det_inv); + err_symb[2] = GF16_MUL(tmp, gf16_inv_table[x2]); move16(); + + BREAK; + + default: assert(0 && "method not implemented\n"); BREAK; + } + + Dyn_Mem_Deluxe_Out(); +} + +/* hash functions for data validation */ + +/* hamming distance 4 */ +static const UWord32 crc14_mask[16] = {0, 17989, 35978, 51919, 71956, 89937, 103838, 119771, + 143912, 160877, 179874, 194791, 207676, 224633, 239542, 254451}; + +/* hamming distance 4 */ +static const UWord32 crc22_mask[16] = {0, 4788009, 9576018, 14356859, 19152036, 23933837, 28713718, 33500639, + 33650273, 38304072, 43214899, 47867674, 52775621, 57427436, 62346391, 67001278}; + +FEC_STATIC Word16 crc1(UWord8 *data, Word16 data_size, Word16 epmr, UWord8 *hash, Word16 hash_size, Word16 check) +{ + Dyn_Mem_Deluxe_In( + UWord32 const *mask; + int shift, i, fail; + UWord32 rem; + ); + + fail = 0; move16(); + rem = 0; move16(); + + assert(hash_size > 0); + + SWITCH (hash_size) + { + case 2: + shift = 14; move16(); + mask = crc14_mask; move32(); + BREAK; + case 3: + shift = 22; move16(); + mask = crc22_mask; move32(); + BREAK; + default: + shift = 0; + mask = 0; + assert(0 && "crc hash size not implemented"); + } + + /* data array contains 4-bit words */ + FOR (i = data_size - 1; i >= 0; i--) + { + rem = UL_xor(UL_lshl(rem, 4), data[i]); move32(); + rem = UL_xor(rem, mask[UL_and(UL_lshr(rem, shift), 15)]); move32(); + } + + rem = UL_xor(UL_lshl(rem, 4), UL_lshl(epmr, 2)); + rem = UL_xor(rem, mask[UL_and(UL_lshr(rem, shift), 15)]); move32(); + + FOR (i = 0; i < 2 * hash_size - 1; i++) + { + rem = UL_lshl(rem, 4); + rem = UL_xor(rem, mask[UL_and(UL_lshr(rem, shift), 15)]); move32(); + } + + rem = UL_xor(rem, UL_lshl((UWord32)epmr, shift)); move32(); + + IF (check) + { + /* test hash value */ + FOR (i = 0; i < 2 * hash_size; i++) + { + fail = s_or(fail, UL_xor(hash[i], UL_and(UL_lshr(rem, shl(i, 2)), 15))); move32(); + } + } + ELSE + { + /* write hash value */ + for (i = 0; i < 2 * hash_size; i++) + { + hash[i] = (UWord8)UL_and(UL_lshr(rem, shl(i, 2)), 15); move32(); + } + } + + Dyn_Mem_Deluxe_Out(); + return fail; +} + +/* hamming distance = 4 */ +static const UWord32 crc16_mask[16] = {0, 107243, 190269, 214486, 289937, 380538, 428972, 469319, + 579874, 621513, 671263, 761076, 832947, 857944, 938638, 1044581}; + +FEC_STATIC Word16 crc2(UWord8 *data, Word16 data_size, UWord8 *hash, Word16 hash_size, Word16 check) +{ + Dyn_Mem_Deluxe_In( + UWord32 const *mask; + int shift, i, fail; + UWord32 rem; + ); + + fail = 0; move16(); + rem = 0; move16(); + + assert(hash_size > 0); + + SWITCH (hash_size) + { + case 2: + shift = 16; move16(); + mask = crc16_mask; move32(); + BREAK; + default: + shift = 0; + mask = 0; + assert(0 && "crc hash size not implemented"); + } + + /* data array contains 4-bit words */ + FOR (i = data_size - 1; i >= 0; i--) + { + rem = UL_xor(UL_lshl(rem, 4), data[i]); move32(); + rem = UL_xor(rem, mask[UL_and(UL_lshr(rem, shift), 15)]); move32(); + } + + FOR (i = 0; i < 2 * hash_size; i++) + { + rem = UL_lshl(rem, 4); + rem = UL_xor(rem, mask[UL_and(UL_lshr(rem, shift), 15)]); move32(); + } + + IF (check) + { + /* test hash value */ + FOR (i = 0; i < 2 * hash_size; i++) + { + fail = s_or(fail, UL_xor(hash[i], UL_and(UL_lshr(rem, shl(i, 2)), 15))); move32(); + } + } + ELSE + { + /* write hash value */ + FOR (i = 0; i < 2 * hash_size; i++) + { + hash[i] = (UWord8)UL_and(UL_lshr(rem, shl(i, 2)), 15); move32(); + } + } + + Dyn_Mem_Deluxe_Out(); + return fail; +} + +/* simple float implementation */ + +FEC_STATIC simple_float simple_float_mul(simple_float op1, simple_float op2) +{ + Dyn_Mem_Deluxe_In( + simple_float rop; + Word32 aux; + ); + aux = L_shr(L_mult0(op1.mantissa, op2.mantissa), 14); + rop.exponent = add(op1.exponent, op2.exponent); + IF (L_and(aux, 32768L)) + { + aux = L_shr(aux, 1); + rop.exponent = add(rop.exponent, 1); + } + rop.mantissa = extract_l(aux); + Dyn_Mem_Deluxe_Out(); + return rop; +} + +/* Auxiliary */ + +FEC_STATIC Word16 simple_float_cmp(simple_float op1, simple_float op2) +/* returns 1 if op1 > op2, 0 if op1 = op2, and -1 if op1 < op2 */ +{ + Dyn_Mem_Deluxe_In( + Word16 rval; + Word16 mdiff; + Word16 ediff; + ); + + rval = 0; move16(); + + ediff = sub(op1.exponent, op2.exponent); + mdiff = sub(op1.mantissa, op2.mantissa); + + IF (ediff == 0) + { + if (mdiff > 0) + { + rval = 1; + } + if (mdiff < 0) + { + rval = -1; + } + } + ELSE + { + if (ediff > 0) + { + rval = 1; + } + if (ediff < 0) + { + rval = -1; + } + } + + Dyn_Mem_Deluxe_Out(); + return rval; +} + + diff --git a/lib_lc3plus/apply_global_gain_fx.c b/lib_lc3plus/apply_global_gain_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..7fa960267e3aad7c91ae1a54cf41aa26c71699c8 --- /dev/null +++ b/lib_lc3plus/apply_global_gain_fx.c @@ -0,0 +1,68 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +void processApplyGlobalGain_fx(Word32 x[], Word16 *x_e, Word16 xLen, Word16 global_gain_idx, Word16 global_gain_off) +{ + Counter i; +#ifdef ENABLE_HR_MODE + Word32 global_gain; +#else + Word16 global_gain; +#endif + Word16 global_gain_e; + Word32 tmp32; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processApplyGlobalGain_fx", sizeof(struct { + Counter i; + Word16 global_gain, global_gain_e; + Word32 tmp32; + })); +#endif + +#ifdef ENABLE_HR_MODE + /* 1 / (28 * log 2) is 0x797D in Q18, L_shl_pos by 7 results in Q25 tmp32 */ + /* round(2^31 / (28 * log10(2))) = 254778081 */ + + Word32 mh; + UWord16 ml; + + Mpy_32_16_ss(254778081, add(global_gain_idx, global_gain_off), &mh, &ml); + tmp32 = L_shl_pos(mh, 9) | L_deposit_l((shr((Word16)ml, 7)) & 0x1ff); + move16(); + /* Uses an argument in Q25 */ + global_gain = BASOP_Util_InvLog2(L_or(tmp32, (Word32)0xFE000000)); +#else + tmp32 = L_shl_pos(L_mult0(add(global_gain_idx, global_gain_off), 0x797D), 7); + /* Uses an argument in Q25 */ + global_gain = round_fx(BASOP_Util_InvLog2(L_or(tmp32, (Word32)0xFE000000))); +#endif + global_gain_e = add(extract_l(L_shr_pos(tmp32, 25)), 1); + + FOR (i = 0; i < xLen; i++) + { +#ifdef ENABLE_HR_MODE + x[i] = Mpy_32_32_lc3plus(x[i], global_gain); +#else + x[i] = Mpy_32_16_lc3plus(x[i], global_gain); +#endif + move32(); + } + + *x_e = add(*x_e, global_gain_e); move16(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + diff --git a/lib_lc3plus/ari_codec.c b/lib_lc3plus/ari_codec.c new file mode 100644 index 0000000000000000000000000000000000000000..05055122d317af6529c1887ba63406aa5eab2a93 --- /dev/null +++ b/lib_lc3plus/ari_codec.c @@ -0,0 +1,2603 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + + +typedef struct +{ + Word16 inv_bin; + Word16 numbytes; + Word16 c_bp; + Word16 c_bp_side; + Word16 bytes; + Word16 b_left; + Word16 b_right; + Word16 enc; + Word16 sim_dec; + Word16 bfi; + Word16 be_bp_left; + Word16 be_bp_right; +} Pc_State_fx; + +typedef struct +{ + UWord32 ac_low_fx; + UWord32 ac_range_fx; + Word16 ac_cache_fx; + Word16 ac_carry_fx; + Word16 ac_carry_count_fx; +} Encoder_State_fx; + +typedef struct +{ + UWord32 ac_low_fx; + UWord32 ac_range_fx; + UWord32 ac_help_fx; + Word16 BER_detect; + Pc_State_fx pc; +} Decoder_State_fx; + +static void ac_dec_init_fx(UWord8 *ptr, Word16 *bp, Word16 *bp_side, Word16 *mask_side, + Decoder_State_fx *st_fx /* i/o: Decoder State */ +); + +static __forceinline void pc_init_fx(Word16 n_pc, Word16 numbytes, Word16 be_bp_left, Word16 be_bp_right, Word16 L_spec, + Word16 enc, Word16 sim_dec, Word16 bfi, Pc_State_fx *pc /* i/o: Pc State */ +); +static __forceinline Word16 check_pc_bytes(Word16 *bp, Word16 *bp_side, Word16 *mask_side, Word16 cur_bin, + Word16 from_left, Pc_State_fx *pc /* i/o: Pc State */ +); + +static void ac_enc_init_fx(Encoder_State_fx *st_fx /* i/o: Encoder state */ +); + +static void ac_enc_shift_fx(UWord8 *ptr, Word16 *bp, Encoder_State_fx *st_fx /* i/o: Encoder state */ +); + +static void write_indice_forward(UWord8 *ptr, Word16 bp, Word16 indice, Word16 numbits); + +static void ac_encode_fx(UWord8 *ptr, Word16 *bp, Encoder_State_fx *st_fx, /* i/o: Encoder state */ + UWord32 cum_freq, /* i : Cumulative frequency up to symbol */ + UWord32 sym_freq /* i : Symbol probability */ +); + +static Word16 ac_enc_finish_fx(UWord8 *ptr, Word16 *bp, Encoder_State_fx *st_fx /* i/o: Encoder state */ +); + +static Word16 ac_decode_fx( /* o : Decoded cumulative frequency */ + Decoder_State_fx *st_fx, /* i/o: Decoder State */ + Word16 pki +#ifdef CR13_B_FIX_PC_BINS + , + Word16 *bp, + Word16 *bp_side, + Word16 *mask_side, + Word16 cur_bin, + Word16 from_left +#endif + ); +static Word16 ac_decode_tns_order( /* o : Decoded cumulative frequency */ + Decoder_State_fx *st_fx, /* i/o: Decoder State */ + Word16 enable_lpc_weighting); +static Word16 ac_decode_tns_coef( /* o : Decoded cumulative frequency */ + Decoder_State_fx *st_fx, /* i/o: Decoder State */ + Word16 pki); +static Word16 ac_dec_update_fx(UWord8 *ptr, Word16 *bp, Word16 *bp_side, Word16 *mask_side, Word16 cur_bin, + Decoder_State_fx *st_fx, /* i/o: Decoder State */ + UWord32 cum_freq, /* i : Cumulative frequency */ + UWord32 sym_freq /* i : Symbol frequency */ +); + +/*************************************************************************/ + +#ifdef ENABLE_HR_MODE + +Word16 processAriEncoder_fx(UWord8 *bytes, Word16 bp_side_in, Word16 mask_side_in, Word16 nbbits, Word32 xq[], + Word16 *tns_order, Word16 tns_numfilters, Word16 *tns_idx, Word16 lastnz, + Word16 *codingdata, UWord8 *resBits, Word16 numResBits, Word16 lsbMode, + Word16 enable_lpc_weighting, Word8 *scratchBuffer) +{ + Word16 resbit, i1, i2; + + Dyn_Mem_Deluxe_In(Encoder_State_fx st; Word16 bp, bp_side, mask_side, extra_bits; + Word32 a1, b1, a1_i, b1_i, a1_msb, b1_msb; Word16 lev1; Word16 nbits_side; Word16 tmp; + Word16 fill_bits; UWord8 * ptr; Word16 numResBitsEnc; Word16 * lsb, nlsbs; Counter i, n, k, lev;); + + lsb = (Word16 *)scratchAlign(scratchBuffer, 0); /* size = 2 * lastnz */ + + /* Init */ + a1_i = 0; + move16(); + b1_i = 1; + move16(); + bp = 0; + move16(); + numResBitsEnc = 0; + move16(); + nlsbs = 0; + move16(); + ptr = bytes; + bp_side = bp_side_in; + move16(); + mask_side = mask_side_in; + move16(); + + /*Start Encoding*/ + ac_enc_init_fx(&st); + + /* TNS data */ + FOR (n = 0; n < tns_numfilters; n++) + { + IF (tns_order[n] > 0) + { + ac_encode_fx(ptr, &bp, &st, ac_tns_order_cumfreq[enable_lpc_weighting][tns_order[n] - 1], + ac_tns_order_freq[enable_lpc_weighting][tns_order[n] - 1]); + FOR (k = 0; k < tns_order[n]; k++) + { + ac_encode_fx(ptr, &bp, &st, ac_tns_coef_cumfreq[k][tns_idx[MAXLAG * n + k]], + ac_tns_coef_freq[k][tns_idx[MAXLAG * n + k]]); + } + } + } + + IF (lsbMode == 0) + { + + /*Main Loop through the 2-tuples*/ + FOR (k = 0; k < lastnz; k += 2) + { + IF (codingdata[1] < 0) + { + ac_encode_fx(ptr, &bp, &st, 0, + ari_spec_freq[ari_spec_lookup[codingdata[0]]][0]); + } + ELSE IF (codingdata[1] == 0) + { + ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][codingdata[2]], + ari_spec_freq[ari_spec_lookup[codingdata[0]]][codingdata[2]]); + IF (xq[a1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[a1_i], 31)); + } + IF (xq[b1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[b1_i], 31)); + } + } + ELSE IF (sub(codingdata[1], 1) == 0) + { + ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][VAL_ESC], + ari_spec_freq[ari_spec_lookup[codingdata[0]]][VAL_ESC]); + ac_encode_fx(ptr, &bp, &st, + ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]]); + write_bit_backward(ptr, &bp_side, &mask_side, L_and(xq[a1_i], 1)); + write_bit_backward(ptr, &bp_side, &mask_side, L_and(xq[b1_i], 1)); + IF (xq[a1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[a1_i], 31)); + } + IF (xq[b1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[b1_i], 31)); + } + } + ELSE + { + a1 = L_abs(xq[a1_i]); + b1 = L_abs(xq[b1_i]); + FOR (lev = 0; lev < codingdata[1]; lev++) + { + lev1 = s_min(lev, 3); + ac_encode_fx(ptr, &bp, &st, + ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC]); + write_bit_backward(ptr, &bp_side, &mask_side, s_and(L_shr_pos(a1, lev), 1)); + write_bit_backward(ptr, &bp_side, &mask_side, s_and(L_shr_pos(b1, lev), 1)); + } + lev1 = s_min(codingdata[1], 3); + ac_encode_fx(ptr, &bp, &st, + ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]]); + IF (xq[a1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[a1_i], 31)); + } + IF (xq[b1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[b1_i], 31)); + } + } + + a1_i += 2; + b1_i += 2; + codingdata += 3; + + } /*end of the 2-tuples loop*/ + } + ELSE + { + /*Main Loop through the 2-tuples*/ + FOR (k = 0; k < lastnz; k += 2) + { + IF (codingdata[1] < 0) + { + ac_encode_fx(ptr, &bp, &st, 0, + ari_spec_freq[ari_spec_lookup[codingdata[0]]][0]); + } + ELSE IF (codingdata[1] == 0) + { + ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][codingdata[2]], + ari_spec_freq[ari_spec_lookup[codingdata[0]]][codingdata[2]]); + IF (xq[a1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[a1_i], 31)); + } + IF (xq[b1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[b1_i], 31)); + } + } + ELSE IF (sub(codingdata[1], 1) == 0) + { + ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][VAL_ESC], + ari_spec_freq[ari_spec_lookup[codingdata[0]]][VAL_ESC]); + ac_encode_fx(ptr, &bp, &st, + ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]]); + a1_msb = s_and(codingdata[2], 0x3); + tmp = L_and(xq[a1_i], 1); + lsb[nlsbs++] = tmp; + move16(); + test(); + IF (a1_msb == 0 && tmp > 0) + { + if (xq[a1_i] > 0) + { + lsb[nlsbs++] = 0; + move16(); + } + if (xq[a1_i] < 0) + { + lsb[nlsbs++] = 1; + move16(); + } + } + IF (a1_msb != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[a1_i], 31)); + } + b1_msb = shr_pos(codingdata[2], 2); + tmp = L_and(xq[b1_i], 1); + lsb[nlsbs++] = tmp; + move16(); + test(); + IF (b1_msb == 0 && tmp > 0) + { + if (xq[b1_i] > 0) + { + lsb[nlsbs++] = 0; + move16(); + } + if (xq[b1_i] < 0) + { + lsb[nlsbs++] = 1; + move16(); + } + } + IF (b1_msb != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[b1_i], 31)); + } + } + ELSE + { + a1 = L_abs(xq[a1_i]); + b1 = L_abs(xq[b1_i]); + a1_msb = L_shr_pos(a1, 1); + tmp = L_and(a1, 1); + lsb[nlsbs++] = tmp; + move16(); + test(); + IF (a1_msb == 0 && tmp > 0) + { + if (xq[a1_i] > 0) + { + lsb[nlsbs++] = 0; + move16(); + } + if (xq[a1_i] < 0) + { + lsb[nlsbs++] = 1; + move16(); + } + } + b1_msb = L_shr_pos(b1, 1); + tmp = s_and(b1, 1); + lsb[nlsbs++] = tmp; + move16(); + test(); + IF (b1_msb == 0 && tmp > 0) + { + if (xq[b1_i] > 0) + { + lsb[nlsbs++] = 0; + move16(); + } + if (xq[b1_i] < 0) + { + lsb[nlsbs++] = 1; + move16(); + } + } + ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[0]]][VAL_ESC], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[0]]][VAL_ESC]); + FOR (lev = 1; lev < codingdata[1]; lev++) + { + lev1 = s_min(lev, 3); + ac_encode_fx(ptr, &bp, &st, + ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC]); + write_bit_backward(ptr, &bp_side, &mask_side, s_and(L_shr_pos(a1, lev), 1)); + write_bit_backward(ptr, &bp_side, &mask_side, s_and(L_shr_pos(b1, lev), 1)); + } + lev1 = s_min(codingdata[1], 3); + ac_encode_fx(ptr, &bp, &st, + ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]]); + IF (a1_msb != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[a1_i], 31)); + } + IF (b1_msb != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[b1_i], 31)); + } + } + + a1_i += 2; + b1_i += 2; + codingdata += 3; + + } /*end of the 2-tuples loop*/ + } + + /* Side bits (in sync with the decoder) */ + nbits_side = sub(nbbits, add(shl_pos(bp_side, 3), sub(norm_s(mask_side), 6))); + + /* Residual bits (in sync with the decoder) */ + extra_bits = sub(norm_ul(st.ac_range_fx), 6); + if (st.ac_cache_fx >= 0) + { + extra_bits = add(extra_bits, 8); + } + if (st.ac_carry_count_fx > 0) + { + extra_bits = add(extra_bits, shl_pos(st.ac_carry_count_fx, 3)); + } + + n = s_max(sub(nbbits, add(shl_pos(bp, 3), add(extra_bits, nbits_side))), 0); + move16(); + + IF (lsbMode == 0) + { + numResBitsEnc = s_min(numResBits, n); + FOR (i = 0; i < numResBitsEnc; i++) + { + resbit = 0; move16(); + i1 = shr(i, RESBITS_PACK_SHIFT); + i2 = s_and(i, RESBITS_PACK_MASK); + if (s_and(resBits[i1], shl(1, i2))) + { + resbit = 1; + } + write_bit_backward(ptr, &bp_side, &mask_side, resbit); + } + } + ELSE + { + nlsbs = s_min(nlsbs, n); + FOR (k = 0; k < nlsbs; k++) + { + write_bit_backward(ptr, &bp_side, &mask_side, lsb[k]); + } + } + + /* End arithmetic coder, overflow management */ + extra_bits = ac_enc_finish_fx(ptr, &bp, &st); + + /* Fill bits (for debugging, the exact number of fill bits cannot be computed in the decoder)*/ + fill_bits = nbbits - (bp * 8 + extra_bits + nbits_side + nlsbs + numResBitsEnc); + + Dyn_Mem_Deluxe_Out(); + + return fill_bits; +} + +#else /* ENABLE_HR_MODE */ + +Word16 processAriEncoder_fx(UWord8 *bytes, Word16 bp_side_in, Word16 mask_side_in, Word16 nbbits, Word16 xq[], + Word16 *tns_order, Word16 tns_numfilters, Word16 *tns_idx, Word16 lastnz, + Word16 *codingdata, UWord8 *resBits, Word16 numResBits, Word16 lsbMode, + Word16 enable_lpc_weighting, Word8 *scratchBuffer) +{ +#ifdef ENABLE_HR_MODE + Dyn_Mem_Deluxe_In(Encoder_State_fx st; Word16 bp, bp_side, mask_side, extra_bits; + Word16 a1, b1, a1_i, b1_i, a1_msb, b1_msb; Word16 lev1; Word16 nbits_side; Word16 tmp; + Word16 fill_bits; UWord8 * ptr; Word16 numResBitsEnc; Word16 * lsb, nlsbs; Counter i, n, k, lev; + ); +#else + Dyn_Mem_Deluxe_In(Encoder_State_fx st; Word16 bp, bp_side, mask_side, extra_bits; + Word16 a1, b1, a1_i, b1_i, a1_msb, b1_msb; Word16 lev1; Word16 nbits_side; Word16 tmp; + Word16 fill_bits; UWord8 * ptr; Word16 numResBitsEnc; Word16 * lsb, nlsbs; Counter i, n, k, lev; + ); +#endif + + + lsb = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * MAX_LEN * 2 bytes */ + + /* Init */ + a1_i = 0; + move16(); + b1_i = 1; + move16(); + bp = 0; + move16(); + numResBitsEnc = 0; + move16(); + nlsbs = 0; + move16(); + ptr = bytes; + bp_side = bp_side_in; + move16(); + mask_side = mask_side_in; + move16(); + + /*Start Encoding*/ + ac_enc_init_fx(&st); + + /* TNS data */ + FOR (n = 0; n < tns_numfilters; n++) + { + IF (tns_order[n] > 0) + { + ac_encode_fx(ptr, &bp, &st, ac_tns_order_cumfreq[enable_lpc_weighting][tns_order[n] - 1], + ac_tns_order_freq[enable_lpc_weighting][tns_order[n] - 1]); + FOR (k = 0; k < tns_order[n]; k++) + { + ac_encode_fx(ptr, &bp, &st, ac_tns_coef_cumfreq[k][tns_idx[MAXLAG * n + k]], + ac_tns_coef_freq[k][tns_idx[MAXLAG * n + k]]); + } + } + } + + IF (lsbMode == 0) + { + + /*Main Loop through the 2-tuples*/ + FOR (k = 0; k < lastnz; k += 2) + { + IF (codingdata[1] < 0) + { + ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][0], + ari_spec_freq[ari_spec_lookup[codingdata[0]]][0]); + } + ELSE IF (codingdata[1] == 0) + { + ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][codingdata[2]], + ari_spec_freq[ari_spec_lookup[codingdata[0]]][codingdata[2]]); + IF (xq[a1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[a1_i], 15)); + } + IF (xq[b1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[b1_i], 15)); + } + } + ELSE IF (sub(codingdata[1], 1) == 0) + { + ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][VAL_ESC], + ari_spec_freq[ari_spec_lookup[codingdata[0]]][VAL_ESC]); + ac_encode_fx(ptr, &bp, &st, + ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]]); + write_bit_backward(ptr, &bp_side, &mask_side, s_and(xq[a1_i], 1)); + write_bit_backward(ptr, &bp_side, &mask_side, s_and(xq[b1_i], 1)); + IF (xq[a1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[a1_i], 15)); + } + IF (xq[b1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[b1_i], 15)); + } + } + ELSE + { + a1 = abs_s(xq[a1_i]); + b1 = abs_s(xq[b1_i]); + FOR (lev = 0; lev < codingdata[1]; lev++) + { + lev1 = s_min(lev, 3); + ac_encode_fx(ptr, &bp, &st, + ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC]); + write_bit_backward(ptr, &bp_side, &mask_side, s_and(shr_pos(a1, lev), 1)); + write_bit_backward(ptr, &bp_side, &mask_side, s_and(shr_pos(b1, lev), 1)); + } + lev1 = s_min(codingdata[1], 3); + ac_encode_fx(ptr, &bp, &st, + ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]]); + IF (xq[a1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[a1_i], 15)); + } + IF (xq[b1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[b1_i], 15)); + } + } + + a1_i += 2; + b1_i += 2; + codingdata += 3; + + } /*end of the 2-tuples loop*/ + } + ELSE + { + /*Main Loop through the 2-tuples*/ + FOR (k = 0; k < lastnz; k += 2) + { + IF (codingdata[1] < 0) + { + ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][0], + ari_spec_freq[ari_spec_lookup[codingdata[0]]][0]); + } + ELSE IF (codingdata[1] == 0) + { + ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][codingdata[2]], + ari_spec_freq[ari_spec_lookup[codingdata[0]]][codingdata[2]]); + IF (xq[a1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[a1_i], 15)); + } + IF (xq[b1_i] != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[b1_i], 15)); + } + } + ELSE IF (sub(codingdata[1], 1) == 0) + { + ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][VAL_ESC], + ari_spec_freq[ari_spec_lookup[codingdata[0]]][VAL_ESC]); + ac_encode_fx(ptr, &bp, &st, + ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]]); + a1_msb = s_and(codingdata[2], 0x3); + tmp = s_and(xq[a1_i], 1); + lsb[nlsbs++] = tmp; + move16(); + test(); + IF (a1_msb == 0 && tmp > 0) + { + if (xq[a1_i] > 0) + { + lsb[nlsbs++] = 0; + move16(); + } + if (xq[a1_i] < 0) + { + lsb[nlsbs++] = 1; + move16(); + } + } + IF (a1_msb != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[a1_i], 15)); + } + b1_msb = shr_pos(codingdata[2], 2); + tmp = s_and(xq[b1_i], 1); + lsb[nlsbs++] = tmp; + move16(); + test(); + IF (b1_msb == 0 && tmp > 0) + { + if (xq[b1_i] > 0) + { + lsb[nlsbs++] = 0; + move16(); + } + if (xq[b1_i] < 0) + { + lsb[nlsbs++] = 1; + move16(); + } + } + IF (b1_msb != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[b1_i], 15)); + } + } + ELSE + { + a1 = abs_s(xq[a1_i]); + b1 = abs_s(xq[b1_i]); + a1_msb = shr_pos(a1, 1); + tmp = s_and(a1, 1); + lsb[nlsbs++] = tmp; + move16(); + test(); + IF (a1_msb == 0 && tmp > 0) + { + if (xq[a1_i] > 0) + { + lsb[nlsbs++] = 0; + move16(); + } + if (xq[a1_i] < 0) + { + lsb[nlsbs++] = 1; + move16(); + } + } + b1_msb = shr_pos(b1, 1); + tmp = s_and(b1, 1); + lsb[nlsbs++] = tmp; + move16(); + test(); + IF (b1_msb == 0 && tmp > 0) + { + if (xq[b1_i] > 0) + { + lsb[nlsbs++] = 0; + move16(); + } + if (xq[b1_i] < 0) + { + lsb[nlsbs++] = 1; + move16(); + } + } + ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[0]]][VAL_ESC], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[0]]][VAL_ESC]); + FOR (lev = 1; lev < codingdata[1]; lev++) + { + lev1 = s_min(lev, 3); + ac_encode_fx(ptr, &bp, &st, + ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC]); + write_bit_backward(ptr, &bp_side, &mask_side, s_and(shr_pos(a1, lev), 1)); + write_bit_backward(ptr, &bp_side, &mask_side, s_and(shr_pos(b1, lev), 1)); + } + lev1 = s_min(codingdata[1], 3); + ac_encode_fx(ptr, &bp, &st, + ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]], + ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]]); + IF (a1_msb != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[a1_i], 15)); + } + IF (b1_msb != 0) + { + write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[b1_i], 15)); + } + } + + a1_i += 2; + b1_i += 2; + codingdata += 3; + + } /*end of the 2-tuples loop*/ + } + + /* Side bits (in sync with the decoder) */ + nbits_side = sub(nbbits, add(shl_pos(bp_side, 3), sub(norm_s(mask_side), 6))); + + /* Residual bits (in sync with the decoder) */ + extra_bits = sub(norm_ul(st.ac_range_fx), 6); + if (st.ac_cache_fx >= 0) + { + extra_bits = add(extra_bits, 8); + } + if (st.ac_carry_count_fx > 0) + { + extra_bits = add(extra_bits, shl_pos(st.ac_carry_count_fx, 3)); + } + + n = s_max(sub(nbbits, add(shl_pos(bp, 3), add(extra_bits, nbits_side))), 0); + move16(); + + IF (lsbMode == 0) + { + numResBitsEnc = s_min(numResBits, n); + FOR (i = 0; i < numResBitsEnc; i++) + { + FOR (i = 0; i < numResBitsEnc; i++) + { + write_bit_backward(ptr, &bp_side, &mask_side, resBits[i]); + } + } + } + ELSE + { + nlsbs = s_min(nlsbs, n); + FOR (k = 0; k < nlsbs; k++) + { + write_bit_backward(ptr, &bp_side, &mask_side, lsb[k]); + } + } + + /* End arithmetic coder, overflow management */ + extra_bits = ac_enc_finish_fx(ptr, &bp, &st); + + /* Fill bits (for debugging, the exact number of fill bits cannot be computed in the decoder)*/ + fill_bits = nbbits - (bp * 8 + extra_bits + nbits_side + nlsbs + numResBitsEnc); + + Dyn_Mem_Deluxe_Out(); + return fill_bits; +} + +#endif /* ENABLE_HR_MODE */ + +void processAriDecoder_fx(UWord8 *bytes, Word16 *bp_side, Word16 *mask_side, Word16 nbbits, Word16 L_spec, + Word16 fs_idx, Word16 enable_lpc_weighting, Word16 tns_numfilters, Word16 lsbMode, + Word16 lastnz, Word16 *bfi, Word16 *tns_order, Word16 fac_ns_idx, Word16 gg_idx, + LC3PLUS_FrameDuration frame_dms, + Word16 n_pc, Word16 be_bp_left, Word16 be_bp_right, Word16 mode, Word16 *spec_inv_idx, + Word16 *b_left, + Word16 *resBits, +#ifdef ENABLE_HR_MODE + Word32 *x, +#else + Word16 *x, +#endif + Word16 *nf_seed, UWord8 *resQdata, Word16 *tns_idx, Word16 *zero_frame, Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +) +{ + Decoder_State_fx st; +#ifdef ENABLE_HR_MODE + Word16 resbit, i1, i2; + Word32 a, b; +#else + Word16 a, b; +#endif + Word16 t, a1, b1, a1_i, b1_i, bp; + Word16 esc_nb; + Word16 rateFlag; + Word16 r; + Word16 nt_half; + Word16 c; + Word16 nbits_side, extra_bits, nbits_ari; + UWord8 * ptr; + Word32 tmp32; + Word16 lsb_ind_c; + Word16 * lsb_ind; + Word16 tmp; + Counter n, k, lev; + Counter i; + Word16 max_lev = 14; + +#ifdef DYNMEM_COUNT +struct _dynmem +{ +Decoder_State_fx st; + Pc_State_fx pc; + Word16 resbit, i1, i2; +#ifdef ENABLE_HR_MODE + Word32 a, b; +#else + Word16 a, b; +#endif + Word16 t, a1, b1, a1_i, b1_i, bp; + Word16 esc_nb; + Word16 rateFlag; + Word16 r; + Word16 nt_half; + Word16 c; + Word16 nbits_side, extra_bits, nbits_ari; + UWord8 * ptr; + Word32 tmp32; + Word16 lsb_ind_c; + Word16 * lsb_ind; + Word16 tmp; + Counter i, n, k, lev; + }; + Dyn_Mem_In("processAriDecoder_fx", sizeof(struct _dynmem)); +#endif + +#ifdef ENABLE_HR_MODE + if (hrmode == 1) + { + max_lev = max_lev + 8; + } +#endif + + lsb_ind = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size 2 * MAX_LEN bytes */ + + /* Rate flag */ + rateFlag = 0; + move16(); +#ifdef ENABLE_HR_MODE + if (fs_idx != 5) /* Don't update rateFlag for 96000 Hz */ +#endif + { + if (sub(nbbits, add(160, i_mult(fs_idx, 160))) > 0) + { + rateFlag = 2 << NBITS_CONTEXT; + move16(); + } + } + + pc_init_fx(n_pc, shr_pos(nbbits, 3), be_bp_left, be_bp_right, L_spec, mode==1, mode==2, *bfi, &st.pc); + + /* Init */ + nt_half = shr_pos(L_spec, 1); + c = 0; + move16(); + t = 0; + move16(); + a1_i = 0; + move16(); + b1_i = 1; + move16(); + bp = 0; + move16(); + if (mode != 1) + { + bp = add(bp, st.pc.bytes); + move16(); + } + *spec_inv_idx = L_spec; + move16(); + *b_left = -1; + move16(); + lsb_ind_c = 0; + move16(); + +ptr = bytes; + +/* Start Decoding */ +ac_dec_init_fx(ptr, &bp, bp_side, mask_side, &st); + + /* Decode TNS data */ + tmp = MAXLAG; +IF (sub(frame_dms, LC3PLUS_FRAME_DURATION_2p5MS) == 0) +{ +tmp = shr_pos(tmp, 1); +} +IF (sub(frame_dms, LC3PLUS_FRAME_DURATION_5MS) == 0) +{ +tmp = shr_pos(tmp, 1); +} + + FOR (n = 0; n < tns_numfilters; n++) + { + IF (tns_order[n] > 0) + { + tns_order[n] = ac_decode_tns_order(&st, enable_lpc_weighting); + move16(); + tns_order[n] = add(tns_order[n], 1); + move16(); + IF (tns_order[n] > tmp) + { + GOTO ber_detect; + } + if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, 0, &st, + ac_tns_order_cumfreq[enable_lpc_weighting][tns_order[n] - 1], + ac_tns_order_freq[enable_lpc_weighting][tns_order[n] - 1]) != 0) + { + GOTO ber_detect; + } + FOR (k = 0; k < tns_order[n]; k++) + { + IF (sub(*bp_side, bp) < 0) + { + GOTO ber_detect; + } + tns_idx[MAXLAG * n + k] = ac_decode_tns_coef(&st, k); + move16(); + if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, 0, &st, + ac_tns_coef_cumfreq[k][tns_idx[MAXLAG * n + k]], + ac_tns_coef_freq[k][tns_idx[MAXLAG * n + k]]) != 0) + { + GOTO ber_detect; + } + } + } + } + IF (st.BER_detect > 0) + { + GOTO ber_detect; + } + +IF (lsbMode == 0) +{ + +/*Main Loop through the 2-tuples*/ +FOR (k = 0; k < lastnz; k += 2) +{ + +/* Get context */ +t = add(c, rateFlag); +if (sub(k, nt_half) > 0) +{ +t = add(t, 1 << NBITS_CONTEXT); +} + + r = ac_decode_fx(&st, ari_spec_lookup[t] +#ifdef CR13_B_FIX_PC_BINS + , + &bp, + bp_side, + mask_side, + k, + 1 +#endif + ); + if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, k, &st, ari_spec_cumfreq[ari_spec_lookup[t]][r], + ari_spec_freq[ari_spec_lookup[t]][r]) != 0) + { + GOTO ber_detect; + } + + IF (r == 0) + { + x[a1_i] = 0; + move16(); + x[b1_i] = 0; + move16(); + c = add(shl_pos(s_and(c, 0xf), 4), 1); + } + ELSE IF (sub(r, VAL_ESC) < 0) + { + a = s_and(r, 0x3); + b = shr_pos(r, 2); + c = add(shl_pos(s_and(c, 0xf), 4), add(add(a, b), 1)); + IF (a > 0) + { +if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) +{ + GOTO ber_detect; +} + if (read_bit(ptr, bp_side, mask_side) != 0) + { + a = negate(a); + } + } + x[a1_i] = a; + move16(); + IF (b > 0) + { +if (check_pc_bytes(&bp, bp_side, mask_side, b1_i, 0, &st.pc) != 0) +{ + GOTO ber_detect; +} + if (read_bit(ptr, bp_side, mask_side) != 0) + { + b = negate(b); + } + } + x[b1_i] = b; + move16(); + } + ELSE + { +if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) +{ +GOTO ber_detect; +} +a = read_bit(ptr, bp_side, mask_side); +if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) +{ +GOTO ber_detect; +} + b = read_bit(ptr, bp_side, mask_side); + r = ac_decode_fx(&st, ari_spec_lookup[t + Tab_esc_nb[1]] +#ifdef CR13_B_FIX_PC_BINS + , + &bp, + bp_side, + mask_side, + k, + 1 +#endif + ); + if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, k, &st, + ari_spec_cumfreq[ari_spec_lookup[t + Tab_esc_nb[1]]][r], + ari_spec_freq[ari_spec_lookup[t + Tab_esc_nb[1]]][r]) != 0) + { + GOTO ber_detect; + } + IF (sub(r, VAL_ESC) < 0) + { + a1 = s_and(r, 0x3); + b1 = shr_pos(r, 2); + a = add(shl_pos(a1, 1), a); + b = add(shl_pos(b1, 1), b); + IF (a > 0) + { + if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) + { + GOTO ber_detect; + } + if (read_bit(ptr, bp_side, mask_side) != 0) + { + a = negate(a); + } + } + x[a1_i] = a; + move16(); + IF (b > 0) + { + if (check_pc_bytes(&bp, bp_side, mask_side, b1_i, 0, &st.pc) != 0) + { + GOTO ber_detect; + } + if (read_bit(ptr, bp_side, mask_side) != 0) + { + b = negate(b); + } + } + x[b1_i] = b; + move16(); + c = add(shl_pos(s_and(c, 0xf), 4), add(shl_pos(add(a1, b1), 1), 1)); + } + ELSE + { +if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) +{ + GOTO ber_detect; +} +a = add(shl_pos(read_bit(ptr, bp_side, mask_side), 1), a); +if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) +{ + GOTO ber_detect; +} + b = add(shl_pos(read_bit(ptr, bp_side, mask_side), 1), b); + FOR (lev = 2; lev < max_lev; lev++) + { + esc_nb = s_min(lev, 3); + r = ac_decode_fx(&st, ari_spec_lookup[t + Tab_esc_nb[esc_nb]] +#ifdef CR13_B_FIX_PC_BINS + , + &bp, + bp_side, + mask_side, + k, + 1 +#endif + ); + if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, k, &st, + ari_spec_cumfreq[ari_spec_lookup[t + Tab_esc_nb[esc_nb]]][r], + ari_spec_freq[ari_spec_lookup[t + Tab_esc_nb[esc_nb]]][r]) != 0) + { + GOTO ber_detect; + } + IF (sub(r, VAL_ESC) < 0) + { + BREAK; + } + if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) + { + GOTO ber_detect; + } + +#ifdef ENABLE_HR_MODE + a = L_add(L_shl(read_bit(ptr, bp_side, mask_side), lev), a); +#else + a = add(shl(read_bit(ptr, bp_side, mask_side), lev), a); +#endif + + if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) + { + GOTO ber_detect; + } +#ifdef ENABLE_HR_MODE + b = L_add(L_shl(read_bit(ptr, bp_side, mask_side), lev), b); +#else + b = add(shl(read_bit(ptr, bp_side, mask_side), lev), b); +#endif + } + /* check for bitflip */ + IF (sub(lev, max_lev) == 0) + { + GOTO ber_detect; + } + + b1 = shr_pos(r, 2); + a1 = s_and(r, 0x3); + +#ifdef ENABLE_HR_MODE + a = L_add(L_shl(a1, lev), a); + b = L_add(L_shl(b1, lev), b); +#else + a = add(shl(a1, lev), a); + b = add(shl(b1, lev), b); +#endif + IF (a > 0) + { + if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) + { + GOTO ber_detect; + } + if (read_bit(ptr, bp_side, mask_side) != 0) + { +#ifdef ENABLE_HR_MODE + a = L_negate(a); +#else + a = negate(a); +#endif + } + } + x[a1_i] = a; + move16(); + IF (b > 0) + { + if (check_pc_bytes(&bp, bp_side, mask_side, b1_i, 0, &st.pc) != 0) + { + GOTO ber_detect; + } + if (read_bit(ptr, bp_side, mask_side) != 0) + { +#ifdef ENABLE_HR_MODE + b = L_negate(b); +#else + b = negate(b); +#endif + } + } + x[b1_i] = b; + move16(); + c = add(shl_pos(s_and(c, 0xf), 4), add(esc_nb, 12)); + } + } + + test(); + test(); + IF ((sub(sub(bp, *bp_side), 3) > 0 && sub(st.pc.c_bp, st.pc.c_bp_side) == 0) || st.BER_detect > 0) +{ +GOTO ber_detect; +} + +a1_i += 2; +b1_i += 2; +} +} +ELSE +{ +/*Main Loop through the 2-tuples*/ +FOR (k = 0; k < lastnz; k += 2) +{ + +/* Get context */ +t = add(c, rateFlag); +if (sub(k, nt_half) > 0) +{ +t = add(t, 1 << NBITS_CONTEXT); +} + + r = ac_decode_fx(&st, ari_spec_lookup[t] +#ifdef CR13_B_FIX_PC_BINS + , + &bp, + bp_side, + mask_side, + k, + 1 +#endif + ); + if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, k, &st, ari_spec_cumfreq[ari_spec_lookup[t]][r], + ari_spec_freq[ari_spec_lookup[t]][r]) != 0) + { + GOTO ber_detect; + } + + IF (r == 0) + { + x[a1_i] = 0; + move16(); + x[b1_i] = 0; + move16(); + c = add(shl_pos(s_and(c, 0xf), 4), 1); + } + ELSE IF (sub(r, VAL_ESC) < 0) + { + a = s_and(r, 0x3); + b = shr_pos(r, 2); + c = add(shl_pos(s_and(c, 0xf), 4), add(add(a, b), 1)); + IF (a > 0) + { +if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) +{ + GOTO ber_detect; +} + if (read_bit(ptr, bp_side, mask_side) != 0) + { + a = negate(a); + } + } + x[a1_i] = a; + move16(); + IF (b > 0) + { +if (check_pc_bytes(&bp, bp_side, mask_side, b1_i, 0, &st.pc) != 0) +{ + GOTO ber_detect; +} + if (read_bit(ptr, bp_side, mask_side) != 0) + { + b = negate(b); + } + } + x[b1_i] = b; + move16(); + } + ELSE + { + r = ac_decode_fx(&st, ari_spec_lookup[t + Tab_esc_nb[1]] +#ifdef CR13_B_FIX_PC_BINS + , + &bp, + bp_side, + mask_side, + k, + 1 +#endif + ); + if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, k, &st, + ari_spec_cumfreq[ari_spec_lookup[t + Tab_esc_nb[1]]][r], + ari_spec_freq[ari_spec_lookup[t + Tab_esc_nb[1]]][r]) != 0) + { + GOTO ber_detect; + } + IF (sub(r, VAL_ESC) < 0) + { + a1 = s_and(r, 0x3); + b1 = shr_pos(r, 2); + a = shl_pos(a1, 1); + b = shl_pos(b1, 1); + IF (a > 0) + { + if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) + { + GOTO ber_detect; + } + if (read_bit(ptr, bp_side, mask_side) != 0) + { + a = negate(a); + } + } + x[a1_i] = a; + move16(); + IF (b > 0) + { + if (check_pc_bytes(&bp, bp_side, mask_side, b1_i, 0, &st.pc) != 0) + { + GOTO ber_detect; + } + if (read_bit(ptr, bp_side, mask_side) != 0) + { + b = negate(b); + } + } + x[b1_i] = b; + move16(); + c = add(shl_pos(s_and(c, 0xf), 4), add(shl_pos(add(a1, b1), 1), 1)); + lsb_ind[lsb_ind_c++] = k; + move16(); + } + ELSE + { +if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) +{ + GOTO ber_detect; +} +a = shl_pos(read_bit(ptr, bp_side, mask_side), 1); +if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) +{ + GOTO ber_detect; +} + b = shl_pos(read_bit(ptr, bp_side, mask_side), 1); + FOR (lev = 2; lev < max_lev; lev++) + { + esc_nb = s_min(lev, 3); + r = ac_decode_fx(&st, ari_spec_lookup[t + Tab_esc_nb[esc_nb]] +#ifdef CR13_B_FIX_PC_BINS + , + &bp, + bp_side, + mask_side, + k, + 1 +#endif + ); + if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, k, &st, + ari_spec_cumfreq[ari_spec_lookup[t + Tab_esc_nb[esc_nb]]][r], + ari_spec_freq[ari_spec_lookup[t + Tab_esc_nb[esc_nb]]][r]) != 0) + { + GOTO ber_detect; + } + IF (sub(r, VAL_ESC) < 0) + { + BREAK; + } + if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) + { + GOTO ber_detect; + } +#ifdef ENABLE_HR_MODE + a = L_add(L_shl(read_bit(ptr, bp_side, mask_side), lev), a); +#else + a = add(shl(read_bit(ptr, bp_side, mask_side), lev), a); +#endif + if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) + { + GOTO ber_detect; + } +#ifdef ENABLE_HR_MODE + b = L_add(L_shl(read_bit(ptr, bp_side, mask_side), lev), b); +#else + b = add(shl(read_bit(ptr, bp_side, mask_side), lev), b); +#endif + } + /* check for bitflip */ + IF (sub(lev, max_lev) == 0) + { + GOTO ber_detect; + } + + b1 = shr_pos(r, 2); + a1 = s_and(r, 0x3); +#ifdef ENABLE_HR_MODE + a = L_add(L_shl(a1, lev), a); + b = L_add(L_shl(b1, lev), b); +#else + a = add(shl(a1, lev), a); + b = add(shl(b1, lev), b); +#endif + IF (a > 0) + { + if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0) + { + GOTO ber_detect; + } + if (read_bit(ptr, bp_side, mask_side) != 0) + { +#ifdef ENABLE_HR_MODE + a = L_negate(a); +#else + a = negate(a); +#endif + } + } + x[a1_i] = a; + move16(); + IF (b > 0) + { + if (check_pc_bytes(&bp, bp_side, mask_side, b1_i, 0, &st.pc) != 0) + { + GOTO ber_detect; + } + if (read_bit(ptr, bp_side, mask_side) != 0) + { +#ifdef ENABLE_HR_MODE + b = L_negate(b); +#else + b = negate(b); +#endif + } + } + x[b1_i] = b; + move16(); + c = add(shl_pos(s_and(c, 0xf), 4), add(esc_nb, 12)); + lsb_ind[lsb_ind_c++] = k; + move16(); + } + } + + test(); + test(); + IF ((sub(sub(bp, *bp_side), 3) > 0 && sub(st.pc.c_bp, st.pc.c_bp_side) == 0) || st.BER_detect > 0) +{ +GOTO ber_detect; +} + +a1_i += 2; +b1_i += 2; +} +} + +IF (L_spec > k) +{ +basop_memset(&x[k], 0, (L_spec - k) * sizeof(*x)); +} + + nbits_side = sub(nbbits, add(shl_pos(*bp_side, 3), sub(norm_s(*mask_side), 6))); + extra_bits = sub(norm_ul(st.ac_range_fx), 6); + nbits_ari = shl_pos(sub(bp, 3), 3); +IF (mode != 1) +{ +IF (st.pc.c_bp == 0) +{ +nbits_ari = shl_pos(sub(sub(bp, st.pc.bytes), 3), 3); +} +ELSE +{ +nbits_ari = shl_pos(add(bp, sub(sub(st.pc.b_left, st.pc.bytes), 3)), 3); +} + + IF (st.pc.c_bp_side != 0) + { + nbits_side = sub(add(sub(nbbits, shl_pos(st.pc.b_left, 3)), shl_pos(sub(st.pc.bytes, *bp_side), 3)), + sub(norm_s(*mask_side), 6)); + } + } + + n = sub(nbbits, add(nbits_ari, add(extra_bits, nbits_side))); + move16(); + +IF (n < 0) +{ +GOTO ber_detect; +} + + IF (lsbMode == 0) + { + *resBits = n; + move16(); + i=0; + +#ifdef CR9_C_ADD_1p25MS + Counter l, lMax = 1; + if (frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) { + lMax = 3; + } + FOR (l = 0; l < lMax; l++) + { +#endif +#ifdef ENABLE_HR_MODE + FOR (k = 0; k < L_spec; k++) + { + IF (x[k] != 0) + { + IF (n == 0) + { + BREAK; + } + if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0) + { + GOTO ber_detect_res; + } + i1 = shr(i, RESBITS_PACK_SHIFT); + i2 = s_and(i, RESBITS_PACK_MASK); + resbit = read_bit(ptr, bp_side, mask_side); + if (resbit) + { + resQdata[i1] = (UWord8) s_or(resQdata[i1], shl(1, i2)); + } + i = add(i, 1); + move16(); + n = sub(n, 1); + } + } +#else + FOR (k = 0; k < L_spec; k++) + { + IF (x[k] != 0) + { + IF (n == 0) + { + BREAK; + } + + if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0) + { + GOTO ber_detect_res; + } + + *resQdata++ = (UWord8) read_bit(ptr, bp_side, mask_side); + move16(); + n = sub(n, 1); + } + } +#endif +#ifdef CR9_C_ADD_1p25MS + } +#endif +#ifdef ENABLE_HR_MODE + if (hrmode) + { + Word16 idx_len = sub(*resBits, n); /* Number of nonzero bits */ + Word16 idx_len_lim = idx_len * EXT_RES_ITER_MAX; + + Word16 res_bits_hrmode = s_min(idx_len_lim, *resBits) - idx_len; + /* idx_len bits have been read in the previous loop */ + + for (k = 0; k < res_bits_hrmode; k++) + { + if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0) + { + GOTO ber_detect_res; + } + i1 = shr(i, RESBITS_PACK_SHIFT); + i2 = s_and(i, RESBITS_PACK_MASK); + resbit = read_bit(ptr, bp_side, mask_side); + if (resbit) + { + resQdata[i1] = (UWord8) s_or(resQdata[i1], shl(1, i2)); + } + i = add(i, 1); + move16(); + n = sub(n, 1); + } + } +#endif + + *resBits = sub(*resBits, n); + } + ELSE + { + *resBits = 0; + FOR (k = 0; k < lsb_ind_c; k++) + { + a = x[lsb_ind[k]]; + move16(); + IF (n == 0) + { + BREAK; + } +if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0) +{ +GOTO ber_detect_res; +} + tmp = read_bit(ptr, bp_side, mask_side); + n = sub(n, 1); + IF (tmp > 0) + { +#ifdef ENABLE_HR_MODE + if (a > 0) + { + a = L_add(a, 1); + } + if (a < 0) + { + a = L_sub(a, 1); + } +#else + if (a > 0) + { + a = add(a, 1); + } + if (a < 0) + { + a = sub(a, 1); + } +#endif + IF (a == 0) + { + IF (n == 0) + { + BREAK; + } + a = 1; +if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0) +{ + GOTO ber_detect_res; +} +if (read_bit(ptr, bp_side, mask_side) != 0) +{ + a = negate(a); +} +n = sub(n, 1); +} +} + + x[lsb_ind[k]] = a; + move16(); + b = x[lsb_ind[k] + 1]; + move16(); + IF (n == 0) + { + BREAK; + } +if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0) +{ +GOTO ber_detect_res; +} + tmp = read_bit(ptr, bp_side, mask_side); + n = sub(n, 1); + IF (tmp > 0) + { +#ifdef ENABLE_HR_MODE + if (b > 0) + { + b = L_add(b, 1); + } + if (b < 0) + { + b = L_sub(b, 1); + } +#else + if (b > 0) + { + b = add(b, 1); + } + if (b < 0) + { + b = sub(b, 1); + } +#endif + IF (b == 0) + { + IF (n == 0) + { + BREAK; + } + b = 1; +if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0) +{ + GOTO ber_detect_res; +} + if (read_bit(ptr, bp_side, mask_side) != 0) + { + b = negate(b); + } + n = sub(n, 1); + } + } + x[lsb_ind[k] + 1] = b; + move16(); + } + } + +/* Noise Filling seed */ + tmp32 = L_deposit_l(0); + FOR (i = 0; i < L_spec; i++) + { +#ifdef ENABLE_HR_MODE + tmp32 = L_mac0(tmp32, L_and(L_abs(x[i]), 32767), i); +#else + tmp32 = L_mac0(tmp32, abs_s(x[i]), i); +#endif + } + *nf_seed = extract_l(tmp32); + move16(); + + /* Detect zero frame */ + test(); + test(); + test(); + test(); + IF (sub(lastnz, 2) == 0 && sub(x[0], 0) == 0 && sub(x[1], 0) == 0 && sub(gg_idx, 0) == 0 && sub(fac_ns_idx, 7) == 0) + { + *zero_frame = 1; + move16(); + } + ELSE + { + *zero_frame = 0; + move16(); + } + +IF (mode == 1) + { + IF (st.pc.bytes > 0) + { + IF (sub(st.pc.b_left, shr_pos(nbbits, 3)) > 0) + { + *b_left = sub(*bp_side, st.pc.bytes); + } + } + } +IF (mode == 2) +{ +IF (st.pc.bytes > 0) +{ +IF (sub(st.pc.b_left, shr_pos(nbbits,3)) > 0) +{ +*b_left = *bp_side; +} +} +} + +IF (sub(*bfi, 2) == 0) +{ +IF (sub(*spec_inv_idx, L_spec) == 0) +{ +*bfi = 0; +} +} +GOTO bail; + +/* goto for bit error handling */ +ber_detect: + *bfi = 1; + move16(); + *b_left = st.pc.b_left; + move16(); + test(); + IF (st.pc.inv_bin > 0 && sub(st.pc.inv_bin, L_spec) <= 0) + { + *spec_inv_idx = st.pc.inv_bin; + move16(); + *bfi = 2; + move16(); + *resBits = 0; + move16(); + *zero_frame = 0; + move16(); + /* Noise Filling seed */ + tmp32 = L_deposit_l(0); + FOR (i = 0; i < *spec_inv_idx; i++) + { + tmp32 = L_mac0(tmp32, abs_s(x[i]), i); + } + *nf_seed = extract_l(tmp32); + move16(); + } +GOTO bail; + +/* goto for bit error handling in residual signal */ +ber_detect_res: + *b_left = st.pc.b_left; + move16(); + *resBits = 0; + move16(); + *bfi = 0; + move16(); + *zero_frame = 0; + move16(); + /* Noise Filling seed */ + tmp32 = L_deposit_l(0); + FOR (i = 0; i < *spec_inv_idx; i++) + { + tmp32 = L_mac0(tmp32, abs_s(x[i]), i); + } + *nf_seed = extract_l(tmp32); + move16(); + GOTO bail; + +/* goto, because of dynmem out */ +bail: +Dyn_Mem_Deluxe_Out(); +} + + +void processAriDecoderScaling_fx( +#ifdef ENABLE_HR_MODE + Word32 *datain, +#else + Word16 *data16, +#endif + Word16 dataLen, Word32 *data32, Word16 *data_e) +{ + Counter i; + +#ifdef ENABLE_HR_MODE + Dyn_Mem_Deluxe_In(Word16 shift; Word32 tmp, x_min, x_max;); +#else + Dyn_Mem_Deluxe_In(Word16 shift; Word16 tmp, x_min, x_max;); +#endif + + +#ifdef ENABLE_HR_MODE + x_max = 0; + move32(); + x_min = 0; + move32(); +#else + x_max = 0; + move16(); + x_min = 0; + move16(); +#endif + + FOR (i = 0; i < dataLen; i++) + { +#ifdef ENABLE_HR_MODE + if (datain[i] > 0) + x_max = L_max(x_max, datain[i]); + if (datain[i] < 0) + x_min = L_min(x_min, datain[i]); +#else + if (data16[i] > 0) + x_max = s_max(x_max, data16[i]); + if (data16[i] < 0) + x_min = s_min(x_min, data16[i]); +#endif + } + +#ifdef ENABLE_HR_MODE + tmp = L_max(x_max, L_negate(x_min)); + shift = norm_l(tmp); + if (tmp == 0) + { + shift = 31; + move32(); + } +#else + tmp = s_max(x_max, negate(x_min)); + shift = norm_s(tmp); + if (tmp == 0) + { + shift = 15; + move16(); + } +#endif + + FOR (i = 0; i < dataLen; i++) + { +#ifdef ENABLE_HR_MODE + data32[i] = L_shl_pos(datain[i], shift); +#else + data32[i] = L_shl_pos(L_deposit_h(data16[i]), shift); +#endif + } + +#ifdef ENABLE_HR_MODE + *data_e = sub(31, shift); + move16(); +#else + *data_e = sub(15, shift); + move16(); +#endif + + Dyn_Mem_Deluxe_Out(); +} + + +/*************************************************************************/ +/*************************************************************************/ +/*************************************************************************/ + +/*************************************************************************/ + +static __forceinline UWord32 UL_addNs24(UWord32 UL_var1, UWord32 UL_var2, UWord16 *wrap) +{ + return UL_lshr(UL_addNs(UL_lshl(UL_var1, 8), UL_lshl(UL_var2, 8), wrap), 8); +} +#ifdef ENABLE_HR_MODE +Word16 find_last_nz_pair(const Word32 x[], Word16 length) +#else +Word16 find_last_nz_pair(const Word16 x[], Word16 length) +#endif +{ + Dyn_Mem_Deluxe_In(Word16 last_nz, lobs[4]; Counter stage, i;); + + lobs[0] = 4; + move16(); + lobs[1] = shr_pos(length, 1); /* length/2 */ + move16(); + lobs[2] = add(lobs[1], shr_pos(length, 2)); + move16(); + lobs[3] = add(lobs[2], shr_pos(length, 3)); + move16(); + + last_nz = 0; + move16(); + i = length; + move16(); + FOR (stage = 3; stage >= 0; --stage) + { + /* unmapped kernel */ + FOR (; i >= lobs[stage]; i -= 2) + { + if (x[i - 2] != 0) + { + last_nz = s_max(last_nz, i); + } + if (x[i - 1] != 0) + { + last_nz = s_max(last_nz, i); + } + } + IF (last_nz > 0) + { + BREAK; + } + } + + Dyn_Mem_Deluxe_Out(); + return s_max(last_nz, 2); +} + + +void write_bit_backward(UWord8 *ptr, Word16 *bp, Word16 *mask, Word16 bit) +{ + if (bit > 0) + { + ptr[*bp] = (UWord8)s_or((Word16)ptr[*bp], *mask); + move16(); + } + *mask = lshl_pos(*mask, 1); + move16(); + if (sub(*mask, 0x100) == 0) + { + *mask = 1; + move16(); + } + if (sub(*mask, 1) == 0) + { + *bp = sub(*bp, 1); + move16(); + } +} + + +void write_indice_backward(UWord8 *ptr, Word16 *bp, Word16 *mask, Word16 indice, Word16 numbits) +{ + Dyn_Mem_Deluxe_In(Counter k; Word16 bit;); + + FOR (k = 0; k < numbits; k++) + { + bit = s_and(indice, 1); + write_bit_backward(ptr, bp, mask, bit); + indice = lshr(indice, 1); + } + + Dyn_Mem_Deluxe_Out(); +} + + +static __forceinline void write_indice_forward(UWord8 *ptr, Word16 bp, Word16 indice, Word16 numbits) +{ + Dyn_Mem_Deluxe_In(Counter k; Word16 bit, mask, tmp;); + + tmp = (Word16)ptr[bp]; + move16(); + mask = 0x80; + move16(); + FOR (k = 0; k < numbits; k++) + { + bit = s_and(indice, mask); + tmp = s_or(tmp, mask); + if (bit == 0) + { + tmp = sub(tmp, mask); + } + mask = lshr(mask, 1); + } + ptr[bp] = (UWord8)tmp; + move16(); + + Dyn_Mem_Deluxe_Out(); +} + +static __forceinline void ac_enc_init_fx(Encoder_State_fx *st_fx) /* i/o: Encoder state */ +{ + st_fx->ac_low_fx = L_deposit_l(0); + move32(); + st_fx->ac_range_fx = 0x00ffffff; + move32(); + st_fx->ac_cache_fx = -1; + move16(); + st_fx->ac_carry_fx = 0; + move16(); + st_fx->ac_carry_count_fx = 0; + move16(); +} + +static __forceinline void ac_enc_shift_fx(UWord8 *ptr, Word16 *bp, Encoder_State_fx *st_fx) /* i/o: Encoder state */ +{ + test(); + L_sub(0, 0); /* For comparision in if */ + IF (st_fx->ac_low_fx < (0x00ff0000UL) || sub(st_fx->ac_carry_fx, 1) == 0) + { + IF (st_fx->ac_cache_fx >= 0) + { + ptr[(*bp)++] = (UWord8)add(st_fx->ac_cache_fx, st_fx->ac_carry_fx); + move16(); + } + + WHILE (st_fx->ac_carry_count_fx > 0) + { + ptr[(*bp)++] = (UWord8)s_and(add(st_fx->ac_carry_fx, 0xff), 255); + move16(); + st_fx->ac_carry_count_fx = sub(st_fx->ac_carry_count_fx, 1); + move16(); + } + + st_fx->ac_cache_fx = u_extract_l(UL_lshr_pos(st_fx->ac_low_fx, 16)); + move16(); + st_fx->ac_carry_fx = 0; + move16(); + } + ELSE + { + st_fx->ac_carry_count_fx = add(st_fx->ac_carry_count_fx, 1); + move16(); + } + st_fx->ac_low_fx = UL_and(UL_lshl_pos(st_fx->ac_low_fx, 8), 0x00ffffff); + move32(); +} + +static __forceinline void ac_encode_fx(UWord8 *ptr, Word16 *bp, Encoder_State_fx *st_fx, /* i/o: Encoder state */ + UWord32 cum_freq, /* i : Cumulative frequency up to symbol */ + UWord32 sym_freq) /* i : Symbol probability */ +{ + Dyn_Mem_Deluxe_In(UWord32 r, tmp; UWord16 carry;); + + r = UL_lshr_pos(st_fx->ac_range_fx, 10); + tmp = UL_Mpy_32_32(r, cum_freq); + + assert(r < (1U << 24)); + assert(cum_freq < (1U << 24)); + assert(tmp < (1U << 24)); + assert(st_fx->ac_low_fx < (1U << 24)); + st_fx->ac_low_fx = UL_addNs24(st_fx->ac_low_fx, tmp, &carry); + move32(); + + if (carry != 0) + { + st_fx->ac_carry_fx = carry; + move16(); + } + + st_fx->ac_range_fx = UL_Mpy_32_32(r, sym_freq); + move32(); + + assert(cum_freq < (1U << 24)); + assert(st_fx->ac_range_fx < (1U << 24)); + WHILE (st_fx->ac_range_fx < (1U << 16)) + { + L_sub(0, 0); /* Comparison in while */ + st_fx->ac_range_fx = UL_lshl_pos(st_fx->ac_range_fx, 8); + move32(); + + assert(st_fx->ac_range_fx < (1U << 24)); + + ac_enc_shift_fx(ptr, bp, st_fx); + } + + Dyn_Mem_Deluxe_Out(); +} + +static __forceinline Word16 ac_enc_finish_fx(UWord8 *ptr, Word16 *bp, Encoder_State_fx *st_fx) /* i/o: Encoder state */ +{ + Dyn_Mem_Deluxe_In(UWord32 val, mask, high; Word16 bits; UWord16 over1, over2;); + + /*bits = 24 - log2_i(st->ac_range); */ + bits = sub(norm_ul(st_fx->ac_range_fx), 7); + + mask = UL_lshr(0x00ffffff, bits); + + val = UL_addNs24(st_fx->ac_low_fx, mask, &over1); + high = UL_addNs24(st_fx->ac_low_fx, st_fx->ac_range_fx, &over2); + + L_xor(0, 0); /* For bit not */ + UL_and(1U, 1U); /* added counters */ + val = L_and(val, (~mask) & 0x00ffffff); + + L_xor(0, 0); /* For bit not */ + IF ((L_xor(over1, over2)) == 0) + { + L_sub(0, 0); /* For comparision in if */ + IF (UL_addNsD(val, mask) >= high) + { + bits = add(bits, 1); + mask = UL_lshr_pos(mask, 1); + val = UL_and(UL_addNsD(st_fx->ac_low_fx, mask), (~mask) & 0x00ffffff); + L_xor(0, 0); + UL_and(1, 1); /* For bit not , mask */ + } + + if (val < st_fx->ac_low_fx) + { + st_fx->ac_carry_fx = 1; + move16(); + } + } + + st_fx->ac_low_fx = val; + move32(); + + FOR (; bits > 0; bits -= 8) + { + ac_enc_shift_fx(ptr, bp, st_fx); + } + bits = add(bits, 8); + + assert(st_fx->ac_carry_fx == 0); + + IF (st_fx->ac_carry_count_fx > 0) + { + ptr[(*bp)++] = (UWord8)st_fx->ac_cache_fx; + move16(); + + FOR (; st_fx->ac_carry_count_fx > 1; st_fx->ac_carry_count_fx--) + { + ptr[(*bp)++] = 0xff; + move16(); + } + write_indice_forward(ptr, *bp, lshr(0xff, sub(8, bits)), bits); + } + ELSE + { + write_indice_forward(ptr, *bp, st_fx->ac_cache_fx, bits); + } + + Dyn_Mem_Deluxe_Out(); + return bits; +} + + +__forceinline Word16 read_bit(UWord8 *ptr, Word16 *bp, Word16 *mask) +{ + Dyn_Mem_Deluxe_In(Word16 bit;); + + bit = 0; + move16(); + if (s_and((Word16)ptr[*bp], *mask) > 0) + { + bit = 1; + move16(); + } + *mask = lshl_pos(*mask, 1); + move16(); + if (sub(*mask, 0x100) == 0) + { + *mask = 1; + move16(); + } + if (sub(*mask, 1) == 0) + { + *bp = sub(*bp, 1); + move16(); + } + + Dyn_Mem_Deluxe_Out(); + return bit; +} + + +static __forceinline void ac_dec_init_fx(UWord8 *ptr, Word16 *bp, Word16 *bp_side, Word16 *mask_side, + Decoder_State_fx *st_fx) /* i/o: Decoder State */ +{ + Dyn_Mem_Deluxe_In(Counter i;); + + + st_fx->ac_low_fx = L_deposit_l(0); + move32(); + + st_fx->ac_range_fx = 0x00ffffff; + move32(); + FOR (i = 0; i < 3; i++) + { + if (check_pc_bytes(bp, bp_side, mask_side, 0, 1, &st_fx->pc) != 0) + { + Dyn_Mem_Deluxe_Out(); + return; + } + st_fx->ac_low_fx = UL_addNsD(UL_lshl_pos(st_fx->ac_low_fx, 8), UL_deposit_l((Word16)ptr[(*bp)++])); + move32(); + assert(st_fx->ac_low_fx < (1U << 24)); + } + + st_fx->BER_detect = 0; + move16(); + + Dyn_Mem_Deluxe_Out(); +} + +#ifdef CR13_B_FIX_PC_BINS +static Word16 pc_check_bytes_ac_decode_fx( + Word16 *bp, + Word16 *bp_side, + Word16 *mask_side, + Word16 cur_bin, + Word16 from_left, + Pc_State_fx *pc +) +{ + Word16 bp_local, bp_side_local; + + if (pc->bytes > 0) + { + bp_local = *bp; + bp_side_local = *bp_side; + + if (from_left) + { + if (*mask_side == 1) + { + bp_side_local = add(bp_side_local, 1); + } + } + else + { + bp_local = sub(bp_local, 1); + } + + if (!pc->enc && pc->b_right > -1) + { + if (pc->bfi == 2) + { + if (pc->c_bp && bp_local > pc->be_bp_left) + { + pc->inv_bin = cur_bin; + return 1; + } + } + } + } + + return 0; +} +#endif + +/* o : Decoded cumulative frequency */ +static __forceinline Word16 ac_decode_fx(Decoder_State_fx *st_fx, /* i/o: Decoder State */ + Word16 pki +#ifdef CR13_B_FIX_PC_BINS + , + Word16 *bp, + Word16 *bp_side, + Word16 *mask_side, + Word16 cur_bin, + Word16 from_left +#endif + ) +{ + Dyn_Mem_Deluxe_In(UWord16 sgn; Word16 val, r;); + +#ifdef CR13_B_FIX_PC_BINS + IF (pc_check_bytes_ac_decode_fx(bp, bp_side, mask_side, cur_bin, from_left, &st_fx->pc)) + { + st_fx->BER_detect = 1; + return 0; + } +#endif + + st_fx->ac_help_fx = UL_lshr_pos(st_fx->ac_range_fx, 10); + move32(); + val = 0; + move16(); + + r = add(val, 8); + UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ari_spec_cumfreq[pki][r]), &sgn); + if (sgn == 0) + { + val = r; + move16(); + } + + r = add(val, 4); + UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ari_spec_cumfreq[pki][r]), &sgn); + if (sgn == 0) + { + val = r; + move16(); + } + + r = add(val, 2); + UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ari_spec_cumfreq[pki][r]), &sgn); + if (sgn == 0) + { + val = r; + move16(); + } + + r = add(val, 1); + UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ari_spec_cumfreq[pki][r]), &sgn); + IF (sgn == 0) + { + val = r; + move16(); + IF (sub(val, 15) == 0) + { + UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ari_spec_cumfreq[pki][16]), &sgn); + if (sgn == 0) + { + val = 16; + move16(); + } + UL_subNs(st_fx->ac_low_fx, UL_lshl(st_fx->ac_help_fx, 10), &sgn); + if (sgn == 0) + { + st_fx->BER_detect = 1; + move16(); + } + } + } + + Dyn_Mem_Deluxe_Out(); + return val; +} + +/* o : Decoded cumulative frequency */ +static __forceinline Word16 ac_decode_tns_order(Decoder_State_fx *st_fx, /* i/o: Decoder State */ + Word16 enable_lpc_weighting) +{ + Dyn_Mem_Deluxe_In(UWord16 sgn; Word16 val, r;); + + st_fx->ac_help_fx = UL_lshr_pos(st_fx->ac_range_fx, 10); + move32(); + val = 0; + move16(); + + r = add(val, 4); + UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_order_cumfreq[enable_lpc_weighting][r]), &sgn); + if (sgn == 0) + { + val = r; + move16(); + } + + r = add(val, 2); + UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_order_cumfreq[enable_lpc_weighting][r]), &sgn); + if (sgn == 0) + { + val = r; + move16(); + } + + r = add(val, 1); + UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_order_cumfreq[enable_lpc_weighting][r]), &sgn); + if (sgn == 0) + { + val = r; + move16(); + } + + UL_subNs(st_fx->ac_low_fx, UL_lshl(st_fx->ac_help_fx, 10), &sgn); + if (sgn == 0) + { + st_fx->BER_detect = 1; + move16(); + } + + Dyn_Mem_Deluxe_Out(); + return val; +} + +/* o : Decoded cumulative frequency */ +static __forceinline Word16 ac_decode_tns_coef(Decoder_State_fx *st_fx, /* i/o: Decoder State */ + Word16 pki) +{ + Dyn_Mem_Deluxe_In(UWord16 sgn; Word16 val, r;); + + st_fx->ac_help_fx = UL_lshr_pos(st_fx->ac_range_fx, 10); + move32(); + val = 0; + move16(); + + r = add(val, 8); + UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_coef_cumfreq[pki][r]), &sgn); + if (sgn == 0) + { + val = r; + move16(); + } + + r = add(val, 4); + UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_coef_cumfreq[pki][r]), &sgn); + if (sgn == 0) + { + val = r; + move16(); + } + + r = add(val, 2); + UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_coef_cumfreq[pki][r]), &sgn); + if (sgn == 0) + { + val = r; + move16(); + } + + r = add(val, 1); + UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_coef_cumfreq[pki][r]), &sgn); + if (sgn == 0) + { + val = r; + move16(); + IF (sub(val, 15) == 0) + { + UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_coef_cumfreq[pki][16]), &sgn); + if (sgn == 0) + { + val = 16; + move16(); + } + UL_subNs(st_fx->ac_low_fx, UL_lshl(st_fx->ac_help_fx, 10), &sgn); + if (sgn == 0) + { + st_fx->BER_detect = 1; + move16(); + } + } + } + + Dyn_Mem_Deluxe_Out(); + return val; +} + +static __forceinline Word16 ac_dec_update_fx(UWord8 *ptr, Word16 *bp, Word16 *bp_side, Word16 *mask_side, + Word16 cur_bin, Decoder_State_fx *st_fx, /* i/o: Decoder State */ + UWord32 cum_freq, /* i : Cumulative frequency */ + UWord32 sym_freq /* i : Symbol frequency */ +) +{ + UWord32 UL_tmp; + + + assert(st_fx->ac_help_fx < (1U << 24)); + assert(cum_freq < (1U << 24)); + + UL_tmp = UL_Mpy_32_32(cum_freq, st_fx->ac_help_fx); + assert(UL_tmp < (1U << 24)); + + st_fx->ac_low_fx = UL_subNsD(st_fx->ac_low_fx, UL_tmp); + move32(); /*0+0*/ + assert(st_fx->ac_low_fx < (1U << 24)); + + st_fx->ac_range_fx = UL_Mpy_32_32(st_fx->ac_help_fx, sym_freq); + move32(); + + assert(st_fx->ac_range_fx < (1U << 24)); + /* updated to 16 from 24 */ + WHILE (st_fx->ac_range_fx < (1U << 16)) + { + L_sub(0, 0); /* For comparision in while*/ + + st_fx->ac_low_fx = + UL_and(st_fx->ac_low_fx, 0x0000ffFF); /* make sure upshift doe not lead to more than 24 bits */ + assert(st_fx->ac_low_fx < 1U << 16); + + if (check_pc_bytes(bp, bp_side, mask_side, cur_bin, 1, &st_fx->pc) != 0) + return 1; + + /*shift in 8 bits */ + st_fx->ac_low_fx = UL_addNsD(UL_lshl_pos(st_fx->ac_low_fx, 8), UL_deposit_l((Word16)ptr[(*bp)++])); + move32(); + + assert(st_fx->ac_low_fx < (1U << 24)); + st_fx->ac_range_fx = UL_lshl_pos(st_fx->ac_range_fx, 8); + move32(); + assert(st_fx->ac_range_fx < (1U << 24)); + } + return 0; +} + +static __forceinline void pc_init_fx(Word16 n_pc, Word16 numbytes, Word16 be_bp_left, Word16 be_bp_right, Word16 L_spec, + Word16 enc, Word16 sim_dec, Word16 bfi, Pc_State_fx *pc /* i/o: Pc State */ +) +{ +pc->inv_bin = add(L_spec, 1); move16(); +pc->numbytes = numbytes; move16(); +pc->c_bp = 0; move16(); +pc->c_bp_side = 0; move16(); +pc->bytes = shr(add(n_pc, 1),1); move16(); +pc->b_left = add(numbytes,1); move16(); +pc->b_right = -1; move16(); +pc->enc = enc; move16(); +pc->sim_dec = sim_dec; move16(); +pc->bfi = bfi; move16(); +pc->be_bp_left = shr(be_bp_left, 3); move16(); +pc->be_bp_right = shr(be_bp_right, 3); move16(); + assert(pc->be_bp_right < pc->bytes || pc->bytes == 0); +} + +static __forceinline Word16 check_pc_bytes(Word16 *bp, Word16 *bp_side, Word16 *mask_side, Word16 cur_bin, + Word16 from_left, Pc_State_fx *pc /* i/o: Pc State */) +{ + Dyn_Mem_Deluxe_In(Word16 bp_local, bp_side_local, offset;); + + IF (pc->bytes > 0) + { + test(); + IF (from_left == 0 && sub(*mask_side, 1) != 0) + { + Dyn_Mem_Deluxe_Out(); + return 0; + } + test(); + IF (pc->c_bp_side > 0 && *bp_side < 0) + { + assert(*mask_side == 1); + assert(pc->b_right != -1); + *bp_side = pc->b_right; + Dyn_Mem_Deluxe_Out(); + return 0; + } + bp_local = *bp; + bp_side_local = *bp_side; + + IF (from_left != 0) + { + if (sub(*mask_side, 1) == 0) + { + bp_side_local = add(bp_side_local, 1); + } + } + ELSE + { + bp_local = sub(bp_local, 1); + } + + IF (pc->b_right < 0) + { + offset = -1; + move16(); + if (pc->enc == 0) + { + offset = add(offset, pc->bytes); + } + + IF (add(bp_side_local, sub(offset, bp_local)) == pc->bytes) + { + pc->b_left = add(bp_local, 1); + pc->b_right = sub(bp_side_local, 1); + IF (pc->enc != 0) + { + assert(pc->b_right - pc->b_left + 1 == pc->bytes); + Dyn_Mem_Deluxe_Out(); + return 1; + } + } + } + + test(); + IF (pc->enc == 0 && pc->b_right >= 0) + { + test(); + IF (from_left != 0 && sub(*bp, pc->b_left) == 0) + { + IF (pc->sim_dec == 1) + { + pc->b_left = *bp; + Dyn_Mem_Deluxe_Out(); + return 1; + } + *bp = 0; move16(); + pc->c_bp = 1; move16(); + } + test(); + IF (from_left == 0 && sub(bp_side_local, pc->b_right) == 0) + { + *bp_side = sub(pc->bytes, 1); + move16(); + pc->c_bp_side = 1; + move16(); + } + IF (sub(pc->bfi, 2) == 0) + { + test(); + test(); + IF ((pc->c_bp != 0 && sub(*bp, pc->be_bp_left) >= 0) || + (pc->c_bp_side != 0 && sub(*bp_side, pc->be_bp_right) <= 0)) + { + pc->inv_bin = cur_bin; + move16(); + Dyn_Mem_Deluxe_Out(); + return 1; + } + ELSE IF ((pc->c_bp != 0 && *bp >= 0) || (pc->c_bp_side != 0 && sub(*bp_side, sub(pc->bytes, 1)) <= 0)) + { + pc->inv_bin = s_min(pc->inv_bin, cur_bin); + Dyn_Mem_Deluxe_Out(); + return 0; + } + } + } + } + + Dyn_Mem_Deluxe_Out(); + return 0; +} + diff --git a/lib_lc3plus/attack_detector_fx.c b/lib_lc3plus/attack_detector_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..dd2541fd6a21e803db4c4d7f33897e046e7ead8d --- /dev/null +++ b/lib_lc3plus/attack_detector_fx.c @@ -0,0 +1,121 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +void attack_detector_fx(LC3PLUS_Enc *enc, EncSetup *setup, Word16 *input, Word16 input_scaling, void *scratch) +{ + Dyn_Mem_Deluxe_In( + int i, j, position; + Word32 tmp, *block_energy; + Word16 h16, l16, new_scaling, rescale, input_delta_scaling; + Word16 scales[3], *input_16k; + Word16 frame_length_16k; + ); + + block_energy = scratchAlign(scratch, 0); + input_16k = scratchAlign(block_energy, 4 * 4 + 4); + frame_length_16k = i_mult(enc->attdec_nblocks, 40); + + IF (setup->attack_handling) + { + /* input scaling */ + scales[0] = add(getScaleFactor16(input, enc->frame_length), input_scaling); + scales[1] = add(getScaleFactor16_0(setup->attdec_filter_mem, 2), setup->attdec_scaling); + scales[2] = + shr(add(add(getScaleFactor32_0(&setup->attdec_acc_energy, 1), shl(setup->attdec_scaling, 1)), 1), 1); + new_scaling = s_min(scales[0], s_min(scales[1], scales[2])); + + new_scaling = sub(new_scaling, 2); /* add overhead for resampler*/ + + /* memory re-scaling */ + rescale = sub(new_scaling, setup->attdec_scaling); + + IF (rescale) + { + rescale = s_min(s_max(rescale, -15), 15); + setup->attdec_filter_mem[0] = shl(setup->attdec_filter_mem[0], rescale); move16(); + setup->attdec_filter_mem[1] = shl(setup->attdec_filter_mem[1], rescale); move16(); + setup->attdec_acc_energy = L_shl(setup->attdec_acc_energy, shl(rescale, 1)); move16(); + } + setup->attdec_scaling = new_scaling; move16(); + + SWITCH (enc->fs) + { + case 32000: + input_delta_scaling = sub(1, sub(new_scaling, input_scaling)); + FOR (i = 0; i < frame_length_16k; i++) + { + input_16k[i] = add(shr(input[2 * i + 0], input_delta_scaling), + shr(input[2 * i + 1], input_delta_scaling)); move16(); + } + break; + case 48000: + input_delta_scaling = sub(2, sub(new_scaling, input_scaling)); + FOR (i = 0; i < frame_length_16k; i++) + { + input_16k[i] = add(shr(input[3 * i + 0], input_delta_scaling), + add(shr(input[3 * i + 1], input_delta_scaling), + shr(input[3 * i + 2], input_delta_scaling))); move16(); + } + break; + default: ASSERT(!"sampling rate not supported in function attack_detector_fx!"); break; + } + + input_16k[-2] = setup->attdec_filter_mem[0]; move16(); + input_16k[-1] = setup->attdec_filter_mem[1]; move16(); + setup->attdec_filter_mem[0] = input_16k[frame_length_16k - 2]; move16(); + setup->attdec_filter_mem[1] = input_16k[frame_length_16k - 1]; move16(); + + FOR (i = frame_length_16k - 1; i >= 0; i--) + { + tmp = L_mult(input_16k[i], 12288); + tmp = L_msu(tmp, input_16k[i - 1], 16384); + tmp = L_mac(tmp, input_16k[i - 2], 4096); + + input_16k[i] = extract_h(tmp); move16(); + } + + basop_memset(block_energy, 0, 4 * sizeof(Word32)); + + FOR (j = 0; j < enc->attdec_nblocks; j++) + { + FOR (i = 0; i < 40; i++) + { + block_energy[j] = L_mac(block_energy[j], input_16k[i + j*40], input_16k[i + j*40]); move16(); + } + } + + setup->attdec_detected = setup->attdec_position >= enc->attdec_hangover_thresh; + test(); move16(); + position = -1; move16(); + + FOR (i = 0; i < enc->attdec_nblocks; i++) + { + /* block_energy[i] / 8.5 */ + l16 = extract_l(L_shr(block_energy[i], 1)); + l16 = s_and(l16, 0x7fff); + h16 = extract_h(block_energy[i]); + tmp = L_shr(L_mult0(l16, 30840), 15); + tmp = L_shr(L_mac0(tmp, h16, 30840), 2); + + IF (tmp > setup->attdec_acc_energy) + { + position = i; move16(); + setup->attdec_detected = 1; move16(); + } + setup->attdec_acc_energy = L_max(L_shr(setup->attdec_acc_energy, 2), block_energy[i]); move16(); + } + setup->attdec_position = position; move16(); + } + + Dyn_Mem_Deluxe_Out(); +} diff --git a/lib_lc3plus/basop_mpy_lc3plus.c b/lib_lc3plus/basop_mpy_lc3plus.c new file mode 100644 index 0000000000000000000000000000000000000000..b570b9358cba58b7cd607b3480760a273a21656e --- /dev/null +++ b/lib_lc3plus/basop_mpy_lc3plus.c @@ -0,0 +1,127 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" + +#include "functions.h" + +#ifdef ENABLE_HR_MODE +Word32 Mpy_32_32_0(Word32 x, Word32 y) +{ + Word32 z; + + z = L_shr(L_add(Mpy_32_32_lc3plus(x, y),1), 1); + + return (z); +} + +Word32 Mpy_32_16_0(Word32 x, Word16 y) +{ + Word32 z; + + z = L_shr(L_add(Mpy_32_16_lc3plus(x, y),1), 1); + + return (z); +} +#endif + +/* Is this port necessary ? */ +#ifdef CR9_C_ADD_1p25MS_LRSNS +#if !defined(__arm__) && !defined(__hexagon__) +/*#define Mpy_32_16_0_DEFINED */ +/* +Word32 Mpy_32_16_0(Word32 x, Word16 y) +{ + Word32 z; + + z = L_shr(L_add(Mpy_32_16_lc3plus(x, y), 1), 1); + + return (z); +} +*/ + + + +Word32 Mpy_32_16_0_0(Word32 x, Word16 y) +{ + Word32 z; + z = L_shr_pos(Mpy_32_16_lc3plus(x, y), 1); /* stay downshifted, no rounding, to exactly match a single SMULWB */ + return (z); +} +#endif +#endif + +Word32 Mpy_32_16_lc3plus(Word32 x, Word16 y) +{ + Word32 mh; + UWord16 ml; + + Mpy_32_16_ss(x, y, &mh, &ml); + + return (mh); +} + + +Word32 Mpy_32_32_lc3plus(Word32 x, Word32 y) +{ + Word32 mh; + UWord32 ml; + + Mpy_32_32_ss(x, y, &mh, &ml); + + return (mh); +} + + +void cplxMpy_32_16(Word32 *c_Re, Word32 *c_Im, const Word32 a_Re, const Word32 a_Im, const Word16 b_Re, + const Word16 b_Im) +{ + *c_Re = L_sub(Mpy_32_16_lc3plus(a_Re, b_Re), Mpy_32_16_lc3plus(a_Im, b_Im)); move32(); + *c_Im = L_add(Mpy_32_16_lc3plus(a_Re, b_Im), Mpy_32_16_lc3plus(a_Im, b_Re)); move32(); +} + +void cplxMpy_32_32(Word32 *c_Re, Word32 *c_Im, const Word32 a_Re, const Word32 a_Im, const Word32 b_Re, + const Word32 b_Im) +{ + *c_Re = L_sub(Mpy_32_32_lc3plus(a_Re, b_Re), Mpy_32_32_lc3plus(a_Im, b_Im)); move32(); + *c_Im = L_add(Mpy_32_32_lc3plus(a_Re, b_Im), Mpy_32_32_lc3plus(a_Im, b_Re)); move32(); +} + +#ifdef ENABLE_HR_MODE +Word32 Mac_32_16_0(Word32 z, Word32 x, Word16 y) +{ + z = L_add(z, Mpy_32_16_0(x, y)); + + return (z); +} + +Word32 Mac_32_32_0(Word32 z, Word32 x, Word32 y) +{ + z = L_add(z, Mpy_32_32_0(x, y)); + + return (z); +} + +Word32 Msu_32_16_0(Word32 z, Word32 x, Word16 y) +{ + z = L_sub(z, Mpy_32_16_0(x, y)); + + return (z); +} + +Word32 Msu_32_32_0(Word32 z, Word32 x, Word32 y) +{ + z = L_sub(z, Mpy_32_32_0(x, y)); + + return (z); +} + +#endif /* #ifdef ENABLE_HR_MODE */ diff --git a/lib_lc3plus/basop_mpy_lc3plus.h b/lib_lc3plus/basop_mpy_lc3plus.h new file mode 100644 index 0000000000000000000000000000000000000000..7d45f6fff1937d3a93d6aca04753703b2c78761a --- /dev/null +++ b/lib_lc3plus/basop_mpy_lc3plus.h @@ -0,0 +1,78 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" + +#ifndef __BASOP_MPY_H +#define __BASOP_MPY_H + +#include "functions.h" + +#ifdef ENABLE_HR_MODE +Word32 Mpy_32_16_0(Word32 x, Word16 y); +#endif + +Word32 Mac_32_16_0(Word32 z, Word32 x, Word16 y); +Word32 Mpy_32_32_0(Word32 x, Word32 y); +Word32 Mac_32_32_0(Word32 z, Word32 x, Word32 y); +Word32 Msu_32_16_0(Word32 z, Word32 x, Word16 y); +Word32 Msu_32_32_0(Word32 z, Word32 x, Word32 y); + +#ifdef CR9_C_ADD_1p25MS_LRSNS +Word32 Mpy_32_16_0_0(Word32 x, Word16 y); /* non-rounding, no upshift */ +#endif + +/** + * \brief 32*16 Bit fractional Multiplication using 40 bit OPS + * Performs a multiplication of a 32-bit variable x by + * a 16-bit variable y, returning a 32-bit value. + * + * \param[i] x + * \param[i] y + * + * \return x*y + */ +Word32 Mpy_32_16_lc3plus(Word32 x, Word16 y); + +/** + * \brief 32*32 Bit fractional Multiplication using 40 bit OPS + * + * Performs a multiplication of a 32-bit variable x by + * a 32-bit variable y, returning a 32-bit value. + * + * \param[i] x + * \param[i] y + * + * \return x*y + */ +Word32 Mpy_32_32_lc3plus(Word32 x, Word32 y); + +#ifdef ENABLE_HR_MODE +#define cplxMpy32_32_32_2(re, im, a, b, c, d) \ + do \ + { \ + re = L_sub(Mpy_32_32_0(a, c), Mpy_32_32_0(b, d)); \ + im = L_add(Mpy_32_32_0(a, d), Mpy_32_32_0(b, c)); \ + } while (0) +#endif +#define cplxMpy32_32_16_2(re, im, a, b, c, d) \ + do \ + { \ + re = L_sub(L_shr_pos(Mpy_32_16_lc3plus(a, c), 1), L_shr_pos(Mpy_32_16_lc3plus(b, d), 1)); \ + im = L_add(L_shr_pos(Mpy_32_16_lc3plus(a, d), 1), L_shr_pos(Mpy_32_16_lc3plus(b, c), 1)); \ + } while (0) + +void cplxMpy_32_16(Word32 *c_Re, Word32 *c_Im, const Word32 a_Re, const Word32 a_Im, const Word16 b_Re, + const Word16 b_Im); +void cplxMpy_32_32(Word32 *c_Re, Word32 *c_Im, const Word32 a_Re, const Word32 a_Im, const Word32 b_Re, + const Word32 b_Im); + +#endif /* __BASOP_MPY_H */ diff --git a/lib_lc3plus/basop_util_lc3plus.c b/lib_lc3plus/basop_util_lc3plus.c new file mode 100644 index 0000000000000000000000000000000000000000..348e11b248e564aae485cf8165aa6c1c1c272a91 --- /dev/null +++ b/lib_lc3plus/basop_util_lc3plus.c @@ -0,0 +1,1221 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" +#include "rom_basop_util_lc3plus.h" +#include "basop_util_lc3plus.h" + +extern const Word32 SqrtTable[32]; +extern const Word16 SqrtDiffTable[32]; + +extern const Word32 ISqrtTable[32]; +extern const Word16 ISqrtDiffTable[32]; + +extern const Word32 InvTable[32]; +extern const Word16 InvDiffTable[32]; + +Word32 BASOP_Util_Log2(Word32 x) +{ + Word32 exp; + Word16 exp_e; + Word16 nIn; + Word16 accuSqr; + Word32 accuRes; + + assert(x >= 0); + + if (x == 0) + { + + return ((Word32)MIN_32); + } + + /* normalize input, calculate integer part */ + exp_e = norm_l(x); + x = L_shl(x, exp_e); + exp = L_deposit_l(exp_e); + + /* calculate (1-normalized_input) */ + nIn = extract_h(L_sub(MAX_32, x)); + + /* approximate ln() for fractional part (nIn *c0 + nIn^2*c1 + nIn^3*c2 + ... + nIn^8 *c7) */ + + /* iteration 1, no need for accumulation */ + accuRes = L_mult(nIn, ldCoeff[0]); /* nIn^i * coeff[0] */ + accuSqr = mult(nIn, nIn); /* nIn^2, nIn^3 .... */ + + /* iteration 2 */ + accuRes = L_mac(accuRes, accuSqr, ldCoeff[1]); /* nIn^i * coeff[1] */ + accuSqr = mult(accuSqr, nIn); /* nIn^2, nIn^3 .... */ + + /* iteration 3 */ + accuRes = L_mac(accuRes, accuSqr, ldCoeff[2]); /* nIn^i * coeff[2] */ + accuSqr = mult(accuSqr, nIn); /* nIn^2, nIn^3 .... */ + + /* iteration 4 */ + accuRes = L_mac(accuRes, accuSqr, ldCoeff[3]); /* nIn^i * coeff[3] */ + accuSqr = mult(accuSqr, nIn); /* nIn^2, nIn^3 .... */ + + /* iteration 5 */ + accuRes = L_mac(accuRes, accuSqr, ldCoeff[4]); /* nIn^i * coeff[4] */ + accuSqr = mult(accuSqr, nIn); /* nIn^2, nIn^3 .... */ + + /* iteration 6 */ + accuRes = L_mac(accuRes, accuSqr, ldCoeff[5]); /* nIn^i * coeff[5] */ + accuSqr = mult(accuSqr, nIn); /* nIn^2, nIn^3 .... */ + + /* iteration 7, no need to calculate accuSqr any more */ + accuRes = L_mac(accuRes, accuSqr, ldCoeff[6]); /* nIn^i * coeff[6] */ + + /* ld(fractional part) = ln(fractional part)/ln(2), 1/ln(2) = (1 + 0.44269504) */ + accuRes = L_mac0(L_shr(accuRes, 1), extract_h(accuRes), 14506); + + accuRes = L_shr(accuRes, LD_DATA_SCALE - 1); /* fractional part/LD_DATA_SCALE */ + exp = L_shl(exp, (31 - LD_DATA_SCALE)); /* integer part/LD_DATA_SCALE */ + accuRes = L_sub(accuRes, exp); /* result = integer part + fractional part */ + + return (accuRes); +} + + + +#ifdef LOG2_LC_APPROX +/* LC log2 with 16 segment piecewise 2nd order minmax optimized approximation */ + +Word32 BASOP_Util_Log2_LC(Word32 L_x) +{ + Word16 exp_e0; + Word32 L_accuRes; + +#define L2LC_TABSIZE_BITS 4 /* 16 segments */ +#define L2LC_TABWIDTH 2 +#define L2LC_TABLENGTH (1<> 6/*0.044*/ , 277633165 >> 6, 449797678 >> 6, 612896598 >> 6, + 767837083 >> 6, 915396590 >> 6, 1056246482 >> 6, 1190970490 >> 6, + 1320079339 >> 6, 1444022426 >> 6, 1563197273 >> 6, 1677957208 >> 6, + 1788617686 >> 6, 1895461516 >> 6, 1998743213 >> 6, 2098692655 >> 6 /*0.9773*/ + }; + + Word32 L_pow2Const[31] = + { /* The Table implements L_shl_pos( L_deposit_l(add(exp_e0,1)), 25)) */ + ((0L + 1) << 25), /* orig exp_e0==0 */ + ((0L + 2) << 25), + ((0L + 3) << 25), + ((0L + 4) << 25), + ((0L + 5) << 25), + ((0L + 6) << 25), + ((0L + 7) << 25), + ((0L + 8) << 25), + ((0L + 9) << 25), + ((0L + 10) << 25), + + ((0L + 11) << 25), + ((0L + 12) << 25), + ((0L + 13) << 25), + ((0L + 14) << 25), + ((0L + 15) << 25), + ((0L + 16) << 25), + ((0L + 17) << 25), + ((0L + 18) << 25), + ((0L + 19) << 25), + ((0L + 20) << 25), + + ((0L + 21) << 25), + ((0L + 22) << 25), + ((0L + 23) << 25), + ((0L + 24) << 25), + ((0L + 25) << 25), + ((0L + 26) << 25), + ((0L + 27) << 25), + ((0L + 28) << 25), + ((0L + 29) << 25), + ((0L + 30) << 25), + ((0L + 31) << 25), /* orig exp_e0==30 */ + }; + + Word32 L_x_up; + Word16 dx; + Word32 L_segm_ind; + Word32 L_tail_frac_indQ32; + Word16* cXPtr; /* C1C2 row pointer */ + Word32 L_tmp; + + + cXPtr = &(log2_LC_TabValC1C2_Qx[0][0]); /* C1C2 table init */ + assert(L_x >= 0); + + if (L_x == 0) /* logic kept from non LC version */ + { /* do not call this function with 0 */ + return ((Word32)MIN_32); + } + + /* start of actual BASOP approximation */ + exp_e0 = norm_l(L_x); /* exp_e0 = number of upshifts for L_x to get into 0.5 to 1.0 */ + L_x_up = L_shl_pos(L_x, exp_e0); /* max upshift to a get a mantissa fractional value range .5 to 1.0 */ + + /* apply total_frac=(2*x-1) to move to region 1.0 to 2.0 , and extract tail fraction to approximation ox log2(1+x/16) )*/ + + L_segm_ind = L_shr_pos_pos(L_and(L_x_up, 0x3c000000), 30 - 4); /* 2 ops to pick segment */ + + /* use 16 bits after the segment index, and put them it in a Q16 short variable as in segment range -.5 to .5 */ + L_tail_frac_indQ32 = L_and(L_x_up, 0x03ffffff); /* mask away to a positive value in Q26 */ + L_tail_frac_indQ32 = L_sub(L_tail_frac_indQ32, 1L << (26 - 1)); /* subtract 0.5 at Q26 */ + L_tail_frac_indQ32 = L_shl_pos(L_tail_frac_indQ32, 6); /* shift up to Q32 */ + dx = extract_h(L_tail_frac_indQ32); /* 4 ops to get a the signed tail fraction into a Word16 */ + + + ASSERT(L_segm_ind >= 0 && L_segm_ind <= L2LC_TABLENGTH); + /* Table ptr init to [segm_ind][0,1,2] */ + cXPtr += (L_segm_ind*L2LC_TABWIDTH); /* allows for ptr increment , for the Word16 table segment adressing */ + + /* ops pre = 8 , mid = 6 , tail = 1, sum= 15 (25-15)/25 = 40% reduction */ + /* Horners rule ((C2*x+ C1)*x) + C0 , maintains precision until final summation */ + + L_tmp = L_mult0(cXPtr[1], dx); /* Q23*Q16 -> Q39 C2*x */ + L_tmp = L_shr_pos(L_tmp, 39 - 34); /* Q39 to -> Q34 */ + + L_tmp = L_msu(L_tmp, cXPtr[0], SHRT_MIN); /* add C1, with L_msu , no extra cycle cost for C1 Word16 storage in Q18 , Q34=18+15+1 */ + + L_tmp = Mpy_32_16_lc3plus(L_tmp, dx); /*Q34*Q16 to -> Q50-16+1 = Q35 , (x*c2+c1)x*/ + L_tmp = L_shr_pos(L_tmp, 35 - 25); /*Q34+1 to -> Q25 */ /* fractional to final Q25 */ + + L_tmp = L_add(L_tmp, L_log2_LC_TabValC0Q25[L_segm_ind]); /* Q25 to -> Q25 */ + + /* back to 0..1 from log2(1+x/16) range */ + ASSERT(exp_e0 >= 0 && exp_e0 <= 30); + L_accuRes = L_sub(L_tmp, L_pow2Const[exp_e0]); /* result = integer_partQ25*2^-1 + fractional partQ25 */ + + return (L_accuRes); +} +#endif + + +Word32 BASOP_Util_InvLog2(Word32 x) +{ +#ifdef ENABLE_HR_MODE + /* Original code was used for negative x and hence the exp was always 0, which is assumed */ + Word16 exp; + return BASOP_Util_InvLog2_pos(x, &exp); +#else + Word16 frac; + Word16 exp; + Word32 retVal; + UWord32 index3; + UWord32 index2; + UWord32 index1; + UWord32 lookup3f; + UWord32 lookup12; + UWord32 lookup; + + if (x < -1040187392l /*-31.0/64.0 Q31*/) + { + + return 0; + } + test(); + if ((L_sub(x, 1040187392l /*31.0/64.0 Q31*/) >= 0) || (x == 0)) + { + + return 0x7FFFFFFF; + } + + frac = extract_l(L_and(x, 0x3FF)); + + index3 = L_and(L_shr_pos(x, 10), 0x1F); + index2 = L_and(L_shr_pos(x, 15), 0x1F); + index1 = L_and(L_shr_pos(x, 20), 0x1F); + + exp = extract_l(L_shr_pos(x, 25)); + if (x > 0) + { + exp = sub(31, exp); + } + if (x < 0) + { + exp = negate(exp); + } + + lookup3f = L_add(exp2x_tab_long[index3], L_shr_pos(Mpy_32_16_lc3plus(0x0016302F, frac), 1)); + lookup12 = Mpy_32_32_lc3plus(exp2_tab_long[index1], exp2w_tab_long[index2]); + lookup = Mpy_32_32_lc3plus(lookup12, lookup3f); + + retVal = L_shr(lookup, sub(exp, 3)); + + return retVal; +#endif +} + +#ifdef ENABLE_HR_MODE +/* New function which works with positive and negative exponents */ +Word32 BASOP_Util_InvLog2_pos(Word32 x, Word16 *exp) +{ + Word16 frac; + Word16 ret_exp; + Word32 retVal; + UWord32 index3; + UWord32 index2; + UWord32 index1; + UWord32 lookup3f; + UWord32 lookup12; + UWord32 lookup; + + /* The usage of exp.mantissa format in LC3plus in Word32 is : floatval = mantissa / (2^(31 - exp)) */ + ret_exp = extract_l(L_shr(x, 25)); + + IF (x < -1040187392l /*-31.0/64.0 Q31*/) + { + *exp = 0; + move16(); + return 0; + } + test(); + IF ((L_sub(x, 1040187392l /*31.0/64.0 Q31*/) >= 0)) + { + *exp = 31; + move16(); + return 0x40000000; + } + ELSE IF(x == 0) + { +#ifdef LRSNS_ALLZERO_FIX + *exp = 2; move16(); + return (1L << 29); /* 2^29/(2^(31-(+2)) = 1.0 exactly */ +#else + *exp = -1; + move16(); + return 0x10000000; +#endif + } + + frac = extract_l(L_and(x, 0x3FF)); + + index3 = L_and(L_shr(x, 10), 0x1F); + index2 = L_and(L_shr(x, 15), 0x1F); + index1 = L_and(L_shr(x, 20), 0x1F); + + lookup3f = L_add(exp2x_tab_long[index3], L_shr(Mpy_32_16_lc3plus(0x0016302F, frac), 1)); + lookup12 = Mpy_32_32_lc3plus(exp2_tab_long[index1], exp2w_tab_long[index2]); + lookup = Mpy_32_32_lc3plus(lookup12, lookup3f); + + IF (x > 0) + { + /* The returned exponent is the offset from 31, so the float result is + retVal / 2^(31 - *exp) */ + *exp = add(ret_exp, 3); + retVal = lookup; + } + ELSE + { + /* For negative powers provide the result in Q31 and ignore the exponent */ + *exp = 0; + retVal = L_shr(lookup, sub(negate(ret_exp), 3)); + } + + return retVal; +} +#endif + +/* local function for Sqrt16 and Sqrt16norm */ +static Word16 Sqrt16_common(Word16 m, Word16 e) +{ + Word16 index, frac; + + assert((m >= 0x4000) || (m == 0)); + + /* get table index (upper 6 bits minus 32) */ + /* index = (m >> 9) - 32; */ + index = mac_r(-32768 - (32 << 16), m, 1 << 6); + + /* get fractional part for interpolation (lower 9 bits) */ + frac = s_and(m, 0x1FF); /* Q9 */ + + /* interpolate */ + if (m != 0) + { + m = mac_r(SqrtTable[index], SqrtDiffTable[index], frac); + } + + /* handle odd exponents */ + if (s_and(e, 1) != 0) + m = mult_r(m, 0x5a82); + + return m; +} + +/* local function for ISqrt16 and ISqrt16norm */ +static Word16 ISqrt16_common(Word16 m, Word16 e) +{ + Word16 index, frac; + + assert(m >= 0x4000); + + /* get table index (upper 6 bits minus 32) */ + /* index = (m >> 9) - 32; */ + index = mac_r(-32768 - (32 << 16), m, 1 << 6); + + /* get fractional part for interpolation (lower 9 bits) */ + frac = s_and(m, 0x1FF); /* Q9 */ + + /* interpolate */ + m = msu_r(ISqrtTable[index], ISqrtDiffTable[index], frac); + + /* handle even exponents */ + if (s_and(e, 1) == 0) + m = mult_r(m, 0x5a82); + + return m; +} + +Word16 Sqrt16( /*!< output mantissa */ + Word16 mantissa, /*!< input mantissa */ + Word16 *exponent /*!< pointer to exponent */ +) +{ + Word16 preShift, e; + + assert(mantissa >= 0); + + /* normalize */ + preShift = norm_s(mantissa); + + e = sub(*exponent, preShift); + mantissa = shl(mantissa, preShift); + + /* calc mantissa */ + mantissa = Sqrt16_common(mantissa, e); + + /* e = (e + 1) >> 1 */ + *exponent = mult_r(e, 1 << 14); move16(); + + return mantissa; +} + +Word16 ISqrt16( /*!< output mantissa */ + Word16 mantissa, /*!< input mantissa */ + Word16 *exponent /*!< pointer to exponent */ +) +{ + Word16 preShift, e; + + assert(mantissa > 0); + + /* normalize */ + preShift = norm_s(mantissa); + + e = sub(*exponent, preShift); + mantissa = shl(mantissa, preShift); + + /* calc mantissa */ + mantissa = ISqrt16_common(mantissa, e); + + /* e = (2 - e) >> 1 */ + *exponent = msu_r(1L << 15, e, 1 << 14); move16(); + + return mantissa; +} + +Word16 Inv16( /*!< output mantissa */ + Word16 mantissa, /*!< input mantissa */ + Word16 *exponent /*!< pointer to exponent */ +) +{ + Word16 index, frac; + Word16 preShift; + Word16 m, e; + + assert(mantissa != 0); + + /* absolute */ + m = abs_s(s_max(mantissa, MIN_16 + 1)); + + /* normalize */ + preShift = norm_s(m); + + e = sub(*exponent, preShift); + m = shl(m, preShift); + + /* get table index (upper 6 bits minus 32) */ + /* index = (m >> 9) - 32; */ + index = mac_r(-32768 - (32 << 16), m, 1 << 6); + + /* get fractional part for interpolation (lower 9 bits) */ + frac = shl(s_and(m, 0x1FF), 1); /* Q10 */ + + /* interpolate */ + m = msu_r(InvTable[index], InvDiffTable[index], frac); + + /* restore sign */ + if (mantissa < 0) + m = negate(m); + + /* e = 1 - e */ + *exponent = sub(1, e); move16(); + + return m; +} + +/********************************************************************/ +/*! + \brief Calculates the scalefactor needed to normalize input array + + The scalefactor needed to normalize the Word16 input array is returned
+ If the input array contains only '0', a scalefactor 0 is returned
+ Scaling factor is determined wrt a normalized target x: 16384 <= x <= 32767 for positive x
+ and -32768 <= x <= -16384 for negative x +*/ + +Word16 getScaleFactor16( /* o: measured headroom in range [0..15], 0 if all x[i] == 0 */ + const Word16 *x, /* i: array containing 16-bit data */ + const Word16 len_x) /* i: length of the array to scan */ +{ + Counter i; + Word16 i_min, i_max; + Word16 x_min, x_max; + + x_max = 0; move16(); + x_min = 0; move16(); + FOR (i = 0; i < len_x; i++) + { + if (x[i] >= 0) + x_max = s_max(x_max, x[i]); + if (x[i] < 0) + x_min = s_min(x_min, x[i]); + } + + i_max = 0x10; move16(); + i_min = 0x10; move16(); + + if (x_max != 0) + i_max = norm_s(x_max); + + if (x_min != 0) + i_min = norm_s(x_min); + + i = s_and(s_min(i_max, i_min), 0xF); + + return i; +} + +/********************************************************************/ +/*! + \brief Calculates the scalefactor needed to normalize input array + + The scalefactor needed to normalize the Word16 input array is returned
+ If the input array contains only '0', a scalefactor 16 is returned
+ Scaling factor is determined wrt a normalized target x: 16384 <= x <= 32767 for positive x
+ and -32768 <= x <= -16384 for negative x +*/ + +Word16 getScaleFactor16_0( /* o: measured headroom in range [0..15], 16 if all x[i] == 0 */ + const Word16 *x, /* i: array containing 16-bit data */ + const Word16 len_x) /* i: length of the array to scan */ +{ + Counter i; + Word16 i_min, i_max; + Word16 x_min, x_max; + + x_max = 0; move16(); + x_min = 0; move16(); + FOR (i = 0; i < len_x; i++) + { + if (x[i] >= 0) + x_max = s_max(x_max, x[i]); + if (x[i] < 0) + x_min = s_min(x_min, x[i]); + } + + i_max = 0x10; move16(); + i_min = 0x10; move16(); + + if (x_max != 0) + i_max = norm_s(x_max); + + if (x_min != 0) + i_min = norm_s(x_min); + + i = s_min(i_max, i_min); + + return i; +} + +/********************************************************************/ +/*! + \brief Calculates the scalefactor needed to normalize input array + + The scalefactor needed to normalize the Word32 input array is returned
+ If the input array contains only '0', a scalefactor 0 is returned
+ Scaling factor is determined wrt a normalized target x: 1073741824 <= x <= 2147483647 for positive x
+ and -2147483648 <= x <= -1073741824 for negative x +*/ + +Word16 getScaleFactor32( /* o: measured headroom in range [0..31], 0 if all x[i] == 0 */ + const Word32 *x, /* i: array containing 32-bit data */ + const Word16 len_x) /* i: length of the array to scan */ +{ + Counter i; + Word16 i_min, i_max; + Word32 x_min, x_max; + + x_max = L_add(0, 0); + x_min = L_add(0, 0); + FOR (i = 0; i < len_x; i++) + { + if (x[i] >= 0) + x_max = L_max(x_max, x[i]); + if (x[i] < 0) + x_min = L_min(x_min, x[i]); + } + + i_max = 0x20; move16(); + i_min = 0x20; move16(); + + if (x_max != 0) + i_max = norm_l(x_max); + + if (x_min != 0) + i_min = norm_l(x_min); + + i = s_and(s_min(i_max, i_min), 0x1F); + + return i; +} + +/********************************************************************/ +/*! + \brief Calculates the scalefactor needed to normalize input array + + The scalefactor needed to normalize the Word32 input array is returned
+ If the input array contains only '0', a scalefactor 32 is returned
+ Scaling factor is determined wrt a normalized target x: 1073741824 <= x <= 2147483647 for positive x
+ and -2147483648 <= x <= -1073741824 for negative x +*/ + +Word16 getScaleFactor32_0( /* o: measured headroom in range [0..31], 32 if all x[i] == 0 */ + const Word32 *x, /* i: array containing 32-bit data */ + const Word16 len_x) /* i: length of the array to scan */ +{ + Counter i; + Word16 i_min, i_max; + Word32 x_min, x_max; + + x_max = L_add(0, 0); + x_min = L_add(0, 0); + FOR (i = 0; i < len_x; i++) + { + if (x[i] >= 0) + x_max = L_max(x_max, x[i]); + if (x[i] < 0) + x_min = L_min(x_min, x[i]); + } + + i_max = 0x20; move16(); + i_min = 0x20; move16(); + + if (x_max != 0) + i_max = norm_l(x_max); + + if (x_min != 0) + i_min = norm_l(x_min); + + i = s_min(i_max, i_min); + + return i; +} + +Word16 BASOP_Util_Divide3216_Scale( /* o: result of division x/y, not normalized */ + Word32 x, /* i: numerator, signed */ + Word16 y, /* i: denominator, signed */ + Word16 *s) /* o: scaling, 0, if x==0 */ +{ + Word16 z; + Word16 sx; + Word16 sy; + Word16 sign; + + /*assert (x > (Word32)0); + assert (y >= (Word16)0);*/ + + /* check, if numerator equals zero, return zero then */ + IF (x == (Word32)0) + { + *s = 0; move16(); + + return ((Word16)0); + } + + sign = s_xor(extract_h(x), y); /* just to exor the sign bits */ + x = L_abs(L_max(x, MIN_32 + 1)); + y = abs_s(s_max(y, MIN_16 + 1)); + sx = sub(norm_l(x), 1); + x = L_shl(x, sx); + sy = norm_s(y); + y = shl(y, sy); + *s = sub(sy, sx); move16(); + + z = div_s(round_fx(x), y); + + if (sign < 0) /* if sign bits differ, negate the result */ + { + z = negate(z); + } + + return z; +} + +Word16 BASOP_Util_Divide1616_Scale(Word16 x, Word16 y, Word16 *s) +{ + Word16 z; + Word16 sx; + Word16 sy; + Word16 sign; + + /* assert (x >= (Word16)0); */ + assert(y != (Word16)0); + + sign = 0; move16(); + + IF (x < 0) + { + x = negate(x); + sign = s_xor(sign, 1); + } + + IF (y < 0) + { + y = negate(y); + sign = s_xor(sign, 1); + } + + IF (x == (Word16)0) + { + *s = 0; move16(); + + return ((Word16)0); + } + + sx = norm_s(x); + x = shl(x, sx); + x = shr(x, 1); + *s = sub(1, sx); move16(); + + sy = norm_s(y); + y = shl(y, sy); + *s = add(*s, sy); move16(); + + z = div_s(x, y); + + if (sign != 0) + { + z = negate(z); + } + + return z; +} + +Word32 Norm32Norm(const Word32 *x, const Word16 headroom, const Word16 length, Word16 *result_e) +{ + Word32 L_tmp, L_tmp2, inc; + Word16 s, shift, tmp; + Counter i; + + shift = headroom; move16(); + + L_tmp = L_deposit_l(0); + + FOR (i = 0; i < length; i++) + { + L_tmp2 = L_sub(L_tmp, 0x40000000); + if (L_tmp2 >= 0) + shift = sub(shift, 1); + if (L_tmp2 >= 0) + L_tmp = L_shr(L_tmp, 2); + + tmp = round_fx_sat(L_shl_sat(x[i], shift)); + L_tmp = L_mac0(L_tmp, tmp, tmp); /* exponent = (1-shift*2) , Q(30+shift*2) */ + } + + /* Consider an increase of 0xfffd per sample in case that the pre-shift factor + in the acf is 1 bit higher than the shift factor estimated in this function. + This prevent overflows in the acf. */ + IF (L_tmp != 0) + { + s = norm_s(length); + inc = L_shl(Mpy_32_16_lc3plus(0x0000fffd, shl(length, s)), sub(15, s)); + L_tmp = L_add_sat(L_tmp, inc); + } + + *result_e = sub(1, shl(shift, 1)); move16(); + + return L_tmp; +} + +void Scale_sig(Word16 x[], /* i/o: signal to scale Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +) +{ + Counter i; + Word16 tmp; + IF (exp0 > 0) + { + tmp = s_min(exp0, 15); move16(); + FOR (i = 0; i < lg; i++) + { + x[i] = shl(x[i], tmp); move16(); /* saturation can occur here */ + } + return; + } + IF (exp0 < 0) + { + tmp = shl(-32768, s_max(exp0, -15)); /* we use negative to correctly represent 1.0 */ + FOR (i = 0; i < lg; i++) + { + x[i] = msu_r(0, x[i], tmp); move16(); /* msu instead of mac because factor is negative */ + } + return; + } +} + +void Copy_Scale_sig(const Word16 x[], /* i : signal to scale input Qx */ + Word16 y[], /* o : scaled signal output Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +) +{ + Counter i; + Word16 tmp; + + IF (exp0 == 0) + { + basop_memmove(y, x, lg * sizeof(Word16)); + + return; + } + IF (exp0 < 0) + { + tmp = shl(-32768, exp0); /* we use negative to correctly represent 1.0 */ + FOR (i = 0; i < lg; i++) + { + y[i] = msu_r(0, x[i], tmp); move16(); + } + return; + } + FOR (i = 0; i < lg; i++) + { + y[i] = shl_sat(x[i], exp0); move16(); /* saturation can occur here */ + } +} + +Word32 BASOP_Util_Add_Mant32Exp /*!< o: normalized result mantissa */ + (Word32 a_m, /*!< i: Mantissa of 1st operand a */ + Word16 a_e, /*!< i: Exponent of 1st operand a */ + Word32 b_m, /*!< i: Mantissa of 2nd operand b */ + Word16 b_e, /*!< i: Exponent of 2nd operand b */ + Word16 *ptr_e) /*!< o: exponent of result */ +{ + Word32 L_tmp; + Word16 shift; + + /* Compare exponents: the difference is limited to +/- 30 + The Word32 mantissa of the operand with lower exponent is shifted right by the exponent difference. + Then, the unshifted mantissa of the operand with the higher exponent is added. The addition result + is normalized and the result represents the mantissa to return. The returned exponent takes into + account all shift operations. + */ + + if (!a_m) + a_e = add(b_e, 0); + + if (!b_m) + b_e = add(a_e, 0); + + shift = sub(a_e, b_e); + shift = s_max(-31, shift); + shift = s_min(31, shift); + if (shift < 0) + { + /* exponent of b is greater than exponent of a, shr a_m */ + a_m = L_shl(a_m, shift); + } + if (shift > 0) + { + /* exponent of a is greater than exponent of b */ + b_m = L_shr(b_m, shift); + } + a_e = add(s_max(a_e, b_e), 1); + L_tmp = L_add(L_shr(a_m, 1), L_shr(b_m, 1)); + shift = norm_l(L_tmp); + if (shift) + L_tmp = L_shl(L_tmp, shift); + if (L_tmp == 0) + a_e = add(0, 0); + if (L_tmp != 0) + a_e = sub(a_e, shift); + *ptr_e = a_e; + + return (L_tmp); +} + +Word16 BASOP_Util_Cmp_Mant32Exp /*!< o: flag: result of comparison */ + /* 0, if a == b */ + /* 1, if a > b */ + /* -1, if a < b */ + (Word32 a_m, /*!< i: Mantissa of 1st operand a */ + Word16 a_e, /*!< i: Exponent of 1st operand a */ + Word32 b_m, /*!< i: Mantissa of 2nd operand b */ + Word16 b_e) /*!< i: Exponent of 2nd operand b */ + +{ + Word32 diff_m; + Word16 diff_e, shift, result; + + /* + This function compares two input parameters, both represented by a 32-bit mantissa and a 16-bit exponent. + If both values are identical, 0 is returned. + If a is greater b, 1 is returned. + If a is less than b, -1 is returned. + */ + + /* Check, if both mantissa and exponents are identical, when normalized: return 0 */ + shift = norm_l(a_m); + if (shift) + a_m = L_shl(a_m, shift); + if (shift) + a_e = sub(a_e, shift); + + shift = norm_l(b_m); + if (shift) + b_m = L_shl(b_m, shift); + if (shift) + b_e = sub(b_e, shift); + + /* align exponent, if any mantissa is zero */ + if (!a_m) + a_e = add(b_e, 0); + if (!b_m) + b_e = add(a_e, 0); + + IF (a_m > 0 && b_m < 0) + { + diff_m = 1; move16(); + } + ELSE IF (a_m<0 && b_m> 0) + { + diff_m = -1; move16(); + } + ELSE + { + diff_m = L_sub(a_m, b_m); + } + + diff_e = sub(a_e, b_e); + + test(); + IF (diff_m == 0 && diff_e == 0) + { + return 0; + } + + /* Check sign, exponent and mantissa to identify, whether a is greater b or not */ + result = sub(0, 1); + + IF (a_m >= 0) + { + /* a is positive */ + if (b_m < 0) + { + result = add(1, 0); + } + + test(); test(); test(); + if ((b_m >= 0) && ((diff_e > 0) || (diff_e == 0 && diff_m > 0))) + { + result = add(1, 0); + } + } + ELSE + { + /* a is negative */ + test(); test(); test(); + if ((b_m < 0) && ((diff_e < 0) || (diff_e == 0 && diff_m > 0))) + { + result = add(1, 0); + } + } + return result; +} + +/*----------------------------------------------------------------------------------* + * Function: Isqrt_lc3plus + * + * Description: + * + * The function computes 1/sqrt(x). + * The mantissa of the input value must be in the range of 1.0 > x >= 0.5. + * The computation of the inverse square root is an approach with a lookup table + * and linear interpolation. + * + * result = x * 2^x_e + * + * Parameter: + * + * x [i] mantissa (Q31) + * x_e [i/o] pointer to exponent (Q0) + * + * Return value: + * + * mantissa (Q31) + * + *----------------------------------------------------------------------------------*/ +Word32 Isqrt_lc3plus(Word32 x, /* mantissa */ + Word16 *x_e /* pointer to exponent */ +) +{ + Word16 s; + Word32 y; + Word32 idx; + Word32 diff; + Word16 fract; + + IF (x <= 0) + { + *x_e = 0; move16(); + return 0x7FFFFFFF; + } + + /* check if exponent is odd */ + s = s_and(*x_e, 0x0001); + + /* get table index (upper 8 bits) */ + idx = L_and(L_shr(x, (31 - 8)), 0x00000007f); + + /* get fractional part for interpolation (lower 23 bits) */ + fract = extract_h(L_shl(L_and(x, 0x007FFFFF), 8)); + + /* interpolate */ + diff = L_sub(isqrt_table[idx + 1], isqrt_table[idx]); + y = L_add(isqrt_table[idx], Mpy_32_16_lc3plus(diff, fract)); + + /* if exponent is odd apply sqrt(0.5) */ + if (s != 0) + { + y = Mpy_32_16_lc3plus(y, 0x5A82 /*0x5A827999*/); + } + + /* if exponent is odd shift 1 bit left */ + if (s != 0) + { + y = L_shl(y, s); + } + + /* change sign, shift right and add 1 to exponent (implicit exponent of isqrt_table) */ + *x_e = mac_r(32768, *x_e, -16384); move16(); + + return y; +} + +Word16 BASOP_Util_Log2_16(Word32 x, Word16 x_e) +{ + Word16 shift, tmp1, tmp2; + Word16 outInt, outFrac, out; + + assert(x >= 0); + + if (x == 0) + { + return (MIN_16); + } + + /* Scale Input */ + shift = norm_l(x); + x = L_shl(x, sub(shift, 10)); + + /* Integer part */ + outInt = shl(sub(sub(x_e, shift), 1), 9); + + /* Fractional part */ + tmp1 = mac_r(x, -33, 16384); + tmp2 = lshr(extract_l(x), 6); + outFrac = mac_r(Log2_16_table1[tmp1], Log2_16_table2[tmp1], tmp2); + + /* Output */ + out = add(outInt, outFrac); + + return out; +} + +Word16 BASOP_Util_InvLog2_16(Word16 x, Word16 *y_e) +{ + Word16 tmp1, tmp2, y; + + tmp1 = shr(s_and(x, 2047), 5); + tmp2 = shl(s_and(x, 31), 4); + y = mac_r(InvLog2_16_table1[tmp1], InvLog2_16_table2[tmp1], tmp2); + *y_e = add(shr_pos(x, 11), 1); + + return y; +} + +#ifdef ENABLE_HR_MODE +#define DFRACT_BITS 32 /* double precision */ + +#define SQRT_BITS 7 +#define SQRT_BITS_MASK 0x7f +#define SQRT_FRACT_BITS_MASK 0x007FFFFF + +#ifndef Word64 +#define Word64 long long +#endif + +static __inline Word32 Mpy_32_32_noshift(Word32 x1, Word32 x2) +{ + Word64 ret = 0; + ret = ((Word64)x1 * (Word64)x2); + return ((Word32)((ret & (Word64)0xffffffff00000000) >> 32)); +} + +static __inline Word32 fixmadddiv2_DD(const Word32 x, const Word32 a, const Word32 b) +{ + return ((((Word64)x << 32) + (Word64)a * b) >> 32); +} + +/** + * \brief calculate 1.0/sqrt(op) + * \param op_m mantissa of input value. + * \param result_e pointer to return the exponent of the result + * \return mantissa of the result + */ +/***************************************************************************** + delivers 1/sqrt(op) normalized to .5...1 and the shift value of the OUTPUT, + i.e. the denormalized result is 1/sqrt(op) = invSqrtNorm(op) * 2^(shift) + uses Newton-iteration for approximation + Q(n+1) = Q(n) + Q(n) * (0.5 - 2 * V * Q(n)^2) + with Q = 0.5* V ^-0.5; 0.5 <= V < 1.0 +*****************************************************************************/ +static __inline Word32 invSqrtNorm2(Word32 op, Word32 *shift) +{ + Word32 val = op; + Word32 reg1, reg2; + + if (val == 0) + { + *shift = 16; + return ((Word32)0x7FFFFFFF); /* maximum positive value */ + } + +/* #define INVSQRTNORM2_NEWTON_ITERATE */ +#define INVSQRTNORM2_LINEAR_INTERPOLATE +#define INVSQRTNORM2_LINEAR_INTERPOLATE_HQ + + /* normalize input, calculate shift value */ + assert(val > 0); + *shift = norm_l(val); /* CountLeadingBits() is not necessary here since test value is always > 0 */ + val <<= *shift; /* normalized input V */ + *shift += 2; /* bias for exponent */ + +#if defined(INVSQRTNORM2_NEWTON_ITERATE) + /* Newton iteration of 1/sqrt(V) */ + reg1 = invSqrtTab[(Word32)(val >> (DFRACT_BITS - 1 - (SQRT_BITS + 1))) & SQRT_BITS_MASK]; + reg2 = FL2FXCONST_DBL(0.0625f); /* 0.5 >> 3 */ + + Word32 regtmp = fPow2Div2(reg1); /* a = Q^2 */ + regtmp = reg2 - fMultDiv2(regtmp, val); /* b = 0.5 - 2 * V * Q^2 */ + reg1 += (fMultDiv2(regtmp, reg1) << 4); /* Q = Q + Q*b */ +#elif defined(INVSQRTNORM2_LINEAR_INTERPOLATE) + Word32 index = (Word32)(val >> (DFRACT_BITS - 1 - (SQRT_BITS + 1))) & SQRT_BITS_MASK; + Word32 Fract = (Word32)(((Word32)val & SQRT_FRACT_BITS_MASK) << (SQRT_BITS + 1)); + Word32 diff = invSqrtTab[index + 1] - invSqrtTab[index]; + reg1 = invSqrtTab[index] + (Word32)(((UWord32)(Mpy_32_32_noshift(diff, Fract)) << 1)); +#if defined(INVSQRTNORM2_LINEAR_INTERPOLATE_HQ) + /* reg1 = t[i] + (t[i+1]-t[i])*fract ... already computed ... + + (1-fract)fract*(t[i+2]-t[i+1])/2 */ + if (Fract != (Word32)0) + { + /* fract = fract * (1 - fract) */ + Fract = Mpy_32_32_noshift(Fract, (Word32)((UWord32)0x80000000 - (Word32)Fract)) << 1; + diff = diff - (invSqrtTab[index + 2] - invSqrtTab[index + 1]); + reg1 = fixmadddiv2_DD(reg1, Fract, diff); + } +#endif /* INVSQRTNORM2_LINEAR_INTERPOLATE_HQ */ +#else +#error "Either define INVSQRTNORM2_NEWTON_ITERATE or INVSQRTNORM2_LINEAR_INTERPOLATE" +#endif + /* calculate the output exponent = input exp/2 */ + if (*shift & 0x00000001) + { /* odd shift values ? */ + /* Note: Do not use rounded value 0x5A82799A to avoid overflow with shift-by-2 */ + reg2 = (Word32)0x5A827999; /* FL2FXCONST_DBL(0.707106781186547524400844362104849f);*/ /* 1/sqrt(2); */ +#ifdef __ADSP21000__ + reg1 = fMult(reg1, reg2) << 1; /* compiler bug work around (CCES 2.4.0), and better precision */ +#else + reg1 = Mpy_32_32_noshift(reg1, reg2) << 2; +#endif + } + + *shift = *shift >> 1; + + return (reg1); +} + +/** + * \brief calculate 1.0/(op_m * 2^op_e) + * \param op_m mantissa of the input value. + * \param op_e pointer into were the exponent of the input value is stored, and the result will be stored into. + * \return mantissa of the result + */ +Word32 invFixp(Word32 op_m, Word16 *op_e) +{ + if ((op_m == (Word32)0x00000000) || (op_m == (Word32)0x00000001)) + { + *op_e = 31 - *op_e; + return ((Word32)0x7FFFFFFF); + } + + Word32 tmp_exp; + Word32 tmp_inv = invSqrtNorm2(op_m, &tmp_exp); + + *op_e = (tmp_exp << 1) - *op_e + 1; + return Mpy_32_32_noshift(tmp_inv, tmp_inv); +} +#endif diff --git a/lib_lc3plus/basop_util_lc3plus.h b/lib_lc3plus/basop_util_lc3plus.h new file mode 100644 index 0000000000000000000000000000000000000000..c8eb0b25f9ffe03f07f59f06e52a81b6588c7a87 --- /dev/null +++ b/lib_lc3plus/basop_util_lc3plus.h @@ -0,0 +1,387 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#ifndef __BASOP_UTIL_LC3PLUS_H__ +#define __BASOP_UTIL_LC3PLUS_H__ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" +#include +#include + +#define _LONG long +#define _SHORT short +#ifdef _WIN32 +#define _INT64 __int64 +#else +#define _INT64 long long +#endif + +#define WORD32_BITS 32 +#define MAXVAL_WORD32 ((signed)0x7FFFFFFF) +#define MINVAL_WORD32 ((signed)0x80000000) +#define WORD32_FIX_SCALE ((_INT64)(1) << (WORD32_BITS - 1)) + +#define WORD16_BITS 16 +#define MAXVAL_WORD16 (((signed)0x7FFFFFFF) >> 16) +#define MINVAL_WORD16 (((signed)0x80000000) >> 16) +#define WORD16_FIX_SCALE ((_INT64)(1) << (WORD16_BITS - 1)) + +/*! + \def Macro converts a Word32 fixed point to Word16 fixed point <1 with saturation +*/ +#define WORD322WORD16(val) \ + ((((((val) >> (WORD32_BITS - WORD16_BITS - 1)) + 1) > (((_LONG)1 << WORD16_BITS) - 1)) && ((_LONG)(val) > 0)) \ + ? (Word16)(_SHORT)(((_LONG)1 << (WORD16_BITS - 1)) - 1) \ + : (Word16)(_SHORT)((((val) >> (WORD32_BITS - WORD16_BITS - 1)) + 1) >> 1)) + + +/* Word16 Packed Type */ +typedef struct +{ + struct + { + Word16 re; + Word16 im; + } v; +} PWord16; + +#ifdef ENABLE_HR_MODE +/* Word32 Packed Type */ +typedef struct +{ + struct + { + Word32 re; + Word32 im; + } v; +} PWord32; +#endif + +#define cast16 move16 + +#define LD_DATA_SCALE (6) +#define LD_DATA_SHIFT_I5 (7) + +/************************************************************************/ +/*! + \brief Calculate the squareroot of a number given by mantissa and exponent + + Mantissa is in 16/32-bit-fractional format with values between 0 and 1.
+ For *norm versions mantissa has to be between 0.5 and 1.
+ The base for the exponent is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
+ The exponent is addressed via pointers and will be overwritten with the result. +*/ + +Word16 Sqrt16( /*!< output mantissa */ + Word16 mantissa, /*!< input mantissa */ + Word16 *exponent /*!< pointer to exponent */ +); + +Word16 ISqrt16( /*!< output mantissa */ + Word16 mantissa, /*!< input mantissa */ + Word16 *exponent /*!< pointer to exponent */ +); + +/*****************************************************************************/ +/*! + \brief Calculate the inverse of a number given by mantissa and exponent + + Mantissa is in 16-bit-fractional format with values between 0 and 1.
+ The base for the exponent is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
+ The operand is addressed via pointers and will be overwritten with the result. + + The function uses a table lookup and a newton iteration. +*/ +Word16 Inv16( /*!< output mantissa */ + Word16 mantissa, /*!< input mantissa */ + Word16 *exponent /*!< pointer to exponent */ +); + +/********************************************************************/ +/*! + \brief Calculates the scalefactor needed to normalize input array + + The scalefactor needed to normalize the Word16 input array is returned
+ If the input array contains only '0', a scalefactor 0 is returned
+ Scaling factor is determined wrt a normalized target x: 16384 <= x <= 32767 for positive x
+ and -32768 <= x <= -16384 for negative x +*/ + +Word16 getScaleFactor16( /* o: measured headroom in range [0..15], 0 if all x[i] == 0 */ + const Word16 *x, /* i: array containing 16-bit data */ + const Word16 len_x); /* i: length of the array to scan */ + +/********************************************************************/ +/*! + \brief Calculates the scalefactor needed to normalize input array + + The scalefactor needed to normalize the Word16 input array is returned
+ If the input array contains only '0', a scalefactor 16 is returned
+ Scaling factor is determined wrt a normalized target x: 16384 <= x <= 32767 for positive x
+ and -32768 <= x <= -16384 for negative x +*/ + +Word16 getScaleFactor16_0( /* o: measured headroom in range [0..15], 16 if all x[i] == 0 */ + const Word16 *x, /* i: array containing 16-bit data */ + const Word16 len_x); /* i: length of the array to scan */ + +/********************************************************************/ +/*! + \brief Calculates the scalefactor needed to normalize input array + + The scalefactor needed to normalize the Word32 input array is returned
+ If the input array contains only '0', a scalefactor 0 is returned
+ Scaling factor is determined wrt a normalized target x: 1073741824 <= x <= 2147483647 for positive x
+ and -2147483648 <= x <= -1073741824 for negative x +*/ + +Word16 getScaleFactor32( /* o: measured headroom in range [0..31], 0 if all x[i] == 0 */ + const Word32 *x, /* i: array containing 32-bit data */ + const Word16 len_x); /* i: length of the array to scan */ + +/********************************************************************/ +/*! + \brief Calculates the scalefactor needed to normalize input array + + The scalefactor needed to normalize the Word32 input array is returned
+ If the input array contains only '0', a scalefactor 32 is returned
+ Scaling factor is determined wrt a normalized target x: 1073741824 <= x <= 2147483647 for positive x
+ and -2147483648 <= x <= -1073741824 for negative x +*/ + +Word16 getScaleFactor32_0( /* o: measured headroom in range [0..31], 32 if all x[i] == 0 */ + const Word32 *x, /* i: array containing 32-bit data */ + const Word16 len_x); /* i: length of the array to scan */ + +/****************************************************************************/ +/*! + \brief Does fractional integer division of Word32 arg1 by Word16 arg2 + + + \return fractional Word16 integer z = arg1(32bits)/arg2(16bits) , z not normalized +*/ +Word16 BASOP_Util_Divide3216_Scale(Word32 x, /*!< i : Numerator */ + Word16 y, /*!< i : Denominator*/ + Word16 *s); /*!< o : Additional scalefactor difference*/ + +/****************************************************************************/ +/*! + \brief Does fractional division of Word16 arg1 by Word16 arg2 + + + \return fractional Q15 Word16 z = arg1(Q15)/arg2(Q15) with scaling s +*/ +Word16 BASOP_Util_Divide1616_Scale(Word16 x, /*!< i : Numerator*/ + Word16 y, /*!< i : Denominator*/ + Word16 *s); /*!< o : Additional scalefactor difference*/ + +/************************************************************************/ +/*! + \brief Binary logarithm with 7 iterations + + \param x + + \return log2(x)/64 + */ +/************************************************************************/ +Word32 BASOP_Util_Log2(Word32 x); + +#ifdef LOG2_LC_APPROX +/************************************************************************/ +/*! + \brief Low Complex Binary logarithm with 16 sections and 2nd order polynom + + \param x + + \return log2(x)/64 + */ + /************************************************************************/ +Word32 BASOP_Util_Log2_LC(Word32 L_x); +#endif + +/************************************************************************/ +/*! + \brief Binary power + + Date: 06-JULY-2012 Arthur Tritthart, IIS Fraunhofer Erlangen + + Version with 3 table lookup and 1 linear interpolations + + Algorithm: compute power of 2, argument x is in Q7.25 format + result = 2^(x/64) + We split exponent (x/64) into 5 components: + integer part: represented by b31..b25 (exp) + fractional part 1: represented by b24..b20 (lookup1) + fractional part 2: represented by b19..b15 (lookup2) + fractional part 3: represented by b14..b10 (lookup3) + fractional part 4: represented by b09..b00 (frac) + => result = (lookup1*lookup2*(lookup3+C1*frac)<<3)>>exp + + Due to the fact, that all lookup values contain a factor 0.5 + the result has to be shifted by 3 to the right also. + Table exp2_tab_long contains the log2 for 0 to 1.0 in steps + of 1/32, table exp2w_tab_long the log2 for 0 to 1/32 in steps + of 1/1024, table exp2x_tab_long the log2 for 0 to 1/1024 in + steps of 1/32768. Since the 2-logarithm of very very small + negative value is rather linear, we can use interpolation. + + Limitations: + + For x <= 0, the result is fractional positive + For x > 0, the result is integer in range 1...7FFF.FFFF + For x < -31/64, we have to clear the result + For x = 0, the result is ~1.0 (0x7FFF.FFFF) + For x >= 31/64, the result is 0x7FFF.FFFF + + \param x + + \return pow(2,(x/64)) + */ +/************************************************************************/ +Word32 BASOP_Util_InvLog2(Word32 x); + +#ifdef ENABLE_HR_MODE +/* New function which works with positive x, BASOP_Util_InvLog2 does not give + accurate results for x > 0 */ +Word32 BASOP_Util_InvLog2_pos(Word32 x, Word16 *exp); +#endif + +/** + * \brief Compute dot product of 1 32 bit vectors with itself + * \param x input vector 1 + * \param headroom amount of headroom bits the input vector + * \param length the length of the input vector + * \param result_e pointer to where the exponent of the result will be stored into + * \return the dot product of x and x. + */ +Word32 Norm32Norm(const Word32 *x, const Word16 headroom, const Word16 length, Word16 *result_e); + +/*!********************************************************************** + \brief Add two values given by mantissa and exponent. + + Mantissas are in 32-bit-fractional format with values between 0 and 1.
+ The base for exponents is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
+ +************************************************************************/ +Word32 BASOP_Util_Add_Mant32Exp /*!< o: normalized result mantissa */ + (Word32 a_m, /*!< i: Mantissa of 1st operand a */ + Word16 a_e, /*!< i: Exponent of 1st operand a */ + Word32 b_m, /*!< i: Mantissa of 2nd operand b */ + Word16 b_e, /*!< i: Exponent of 2nd operand b */ + Word16 *ptr_e); /*!< o: exponent of result */ + /*!********************************************************************** + \brief Returns the comparison result of two normalized values given by mantissa and exponent. + return value: -1: a < b, 0: a == b, 1; a > b + + Mantissas are in 32-bit-fractional format with values between 0 and 1.
+ The base for exponents is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
+ + ************************************************************************/ +Word16 BASOP_Util_Cmp_Mant32Exp /*!< o: flag: result of comparison */ + (Word32 a_m, /*!< i: Mantissa of 1st operand a */ + Word16 a_e, /*!< i: Exponent of 1st operand a */ + Word32 b_m, /*!< i: Mantissa of 2nd operand b */ + Word16 b_e); /*!< i: Exponent of 2nd operand b */ + +/* compare two positive normalized 16 bit mantissa/exponent values */ +/* return value: positive if first value greater, negative if second value greater, zero if equal */ +Word16 compMantExp16Unorm(Word16 m1, Word16 e1, Word16 m2, Word16 e2); + +void Scale_sig(Word16 x[], /* i/o: signal to scale Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +); +void Copy_Scale_sig(const Word16 x[], /* i : signal to scale input Qx */ + Word16 y[], /* o : scaled signal output Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +); + +#ifdef ENABLE_HR_MODE +void Copy_Scale_sig_32(const Word32 x[], /* i : signal to scale input Qx */ + Word16 y[], /* o : scaled signal output Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +); +#endif + +Word32 Isqrt_lc3plus(Word32 x, /* (i) Q31: normalized value (1.0 > x >= 0.5) */ + Word16 *x_e /* (i/o) Q0 : pointer to exponent */ +); + +Word16 BASOP_Util_Log2_16(Word32 x, Word16 x_e); + +Word16 BASOP_Util_InvLog2_16(Word16 x, Word16 *y_e); + +#ifdef ENABLE_HR_MODE +Word32 invFixp(Word32 op_m, Word16 *op_e); +#endif + +#define BASOP_CFFT_MAX_LENGTH 480 +void BASOP_cfft(Word32 *re, Word32 *im, Word16 sizeOfFft, Word16 s, Word16 *scale, Word32 *x); +void BASOP_rfftN(Word32 *re, Word16 sizeOfFft, Word16 *scale, Word8 *scratchBuffer); +void BASOP_irfftN(Word32 *re, Word16 sizeOfFft, Word16 *scale, Word8 *scratchBuffer); + +static __inline void basop_memcpy(void *dst, const void *src, size_t n) +{ +#ifdef WMOPS + multiCounter[currCounter].move16 += (UWord32)n / 2; +#endif + /* check for overlapping memory */ + assert((const char *)src + n <= (char *)dst || (char *)dst + n <= (const char *)src); + memcpy(dst, src, n); +} + +static __inline void basop_memmove(void *dst, const void *src, size_t n) +{ +#ifdef WMOPS + multiCounter[currCounter].move16 += (UWord32)n / 2; +#endif + memmove(dst, src, n); +} + +static __inline void basop_memset(void *dst, int val, size_t n) +{ +#ifdef WMOPS + multiCounter[currCounter].move16 += (UWord32)n / 2; +#endif + memset(dst, val, n); +} + +/* Macros around Dyn_Mem that don't require duplicate declarations. */ +#ifdef DYNMEM_COUNT +/* older visual studio doesn't have __func__ */ +#if defined _MSC_VER && _MSC_VER < 1900 +#define __func__ __FUNCTION__ +#endif +#define Dyn_Mem_Deluxe_In(...) __VA_ARGS__ Dyn_Mem_In(__func__, sizeof(struct {__VA_ARGS__})) +#define Dyn_Mem_Deluxe_Out() Dyn_Mem_Out() +#else +#define Dyn_Mem_Deluxe_In(...) __VA_ARGS__ +#define Dyn_Mem_Deluxe_Out() +#endif + +/* Macros missing from IVAS BASOP, used only in LC3plus */ +#define L_shl_pos(x, y) (L_shl((x), (y))) +#define L_shr_pos(x, y) (L_shr((x), (y))) +#define L_shr_pos_pos(x, y) (L_shr((x), (y))) + +#define L_shr_r_pos(x, shift) (L_shr_r(x, shift)) + +#define shl_pos(x, y) (shl((x), (y))) +#define shr_pos(x, y) (shr((x), (y))) +#define shr_pos_pos(x, y) (shr((x), (y))) + +#define lshl_pos(x, y) (lshl(x, y)) +#define UL_lshr_pos(x, y) (UL_lshr(x, y)) +#define UL_lshl_pos(x, y) (UL_lshl(x, y)) +#endif /* __BASOP_UTIL_LC3PLUS_H__ */ diff --git a/lib_lc3plus/com_entropy.c b/lib_lc3plus/com_entropy.c new file mode 100644 index 0000000000000000000000000000000000000000..6d8cb89b9bf862d7dee2f73fb425e9aa582c604a --- /dev/null +++ b/lib_lc3plus/com_entropy.c @@ -0,0 +1,27 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +Word16 getLastNzBits_fx (Word16 N) +{ + Dyn_Mem_Deluxe_In( Word16 minBits;); + minBits = sub(14, norm_s(negate(N))); +#ifdef CR9_C_ADD_1p25MS + /* minimum of 2 spare bits */ + if (sub(sub(shl(1,minBits),shr(N,1)),2) < 0) + { + minBits = add(minBits,1); + } +#endif + Dyn_Mem_Deluxe_Out(); + return minBits; +} diff --git a/lib_lc3plus/constants.c b/lib_lc3plus/constants.c new file mode 100644 index 0000000000000000000000000000000000000000..c8aa477efb4b202ba4568c80f9705c0b9d6124ab --- /dev/null +++ b/lib_lc3plus/constants.c @@ -0,0 +1,6041 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "basop_util_lc3plus.h" +#include "constants.h" +#include "defines.h" + +#ifdef LTPF_ADAPTIVE_GAIN +RAM_ALIGN const Word16 adaptive_gain_step = 328; +RAM_ALIGN const Word16 max_adaptive_gain[4] = { 19661, 18022, 16384, 14746 }; +RAM_ALIGN const Word16 max_adaptive_gain_step[4] = { 983, 901, 819, 737 }; +#endif + +#ifdef LTPF_ADAPTIVE_GAIN +RAM_ALIGN const Word16 tilt_filter_1p25ms[5][4][11] = { + { {19343, 13480, -605}, {19251, 13480, -512}, {19164, 13480, -425}, {19083, 13480, -344} }, + { {19343, 13480, -605}, {19251, 13480, -512}, {19164, 13480, -425}, {19083, 13480, -344} }, + { {12812, 16514, 3225, -411, -50}, + {12680, 16454, 3350, -351, -43}, + {12556, 16397, 3468, -294, -36}, + {12438, 16343, 3579, -239, -30} }, + { {9577, 14941, 6763, 1210, -326, -81, -10}, + {9453, 14834, 6838, 1306, -279, -70, -9}, + {9337, 14732, 6909, 1397, -234, -59, -7}, + {9226, 14634, 6975, 1484, -191, -48, -6} }, + { {6363, 11318, 8072, 4573, 1832, 298, -232, -102, -36, -9, -1}, + {6264, 11190, 8060, 4628, 1904, 356, -199, -88, -31, -8, -1}, + {6171, 11069, 8048, 4679, 1972, 411, -167, -74, -26, -7, -1}, + {6084, 10954, 8036, 4727, 2037, 463, -137, -60, -22, -6, -1} } +}; +#endif + +RAM_ALIGN const Word16 lpc_warp_pre_adapt_emphasis_64_48000[64] = +{ + 0x0000, 0x0334, 0x074e, 0x0c81, 0x1308, 0x1b27, 0x2532, 0x18c6, 0x2056, 0x298c, 0x34bd, 0x4247, 0x52a0, 0x3326, 0x3ef7, 0x4d21, + 0x5e12, 0x724e, 0x4537, 0x5395, 0x64aa, 0x78f3, 0x4883, 0x56c6, 0x67aa, 0x7ba5, 0x49a1, 0x5794, 0x680a, 0x7b75, 0x492c, 0x56a8, + 0x6688, 0x7937, 0x4798, 0x5484, 0x63b2, 0x7589, 0x453d, 0x5189, 0x5ff6, 0x70e3, 0x425f, 0x4e02, 0x5ba6, 0x6ba2, 0x7e5c, 0x4a25, + 0x56fd, 0x6607, 0x77a0, 0x461d, 0x522a, 0x6044, 0x70c2, 0x4207, 0x4d4e, 0x5a7f, 0x69ea, 0x7bf0, 0x4881, 0x54d0, 0x6333, 0x7402 +}; + +RAM_ALIGN const Word16 lpc_warp_pre_adapt_emphasis_64_32000[64] = +{ + 0x0000, 0x02ba, 0x061d, 0x0a48, 0x0f5f, 0x158b, 0x1cff, 0x25f1, 0x1853, 0x1eb3, 0x2646, 0x2f3f, 0x39d9, 0x4658, 0x550b, 0x3326, + 0x3d43, 0x4919, 0x56ee, 0x6712, 0x79e2, 0x47e5, 0x54a1, 0x636e, 0x749c, 0x4445, 0x4fd1, 0x5d31, 0x6cab, 0x7e92, 0x49a1, 0x5595, + 0x6361, 0x734e, 0x42d6, 0x4d6d, 0x59a0, 0x67af, 0x77df, 0x4541, 0x4ff9, 0x5c4e, 0x6a7d, 0x7acb, 0x46c5, 0x5189, 0x5de7, 0x6c1c, + 0x7c6b, 0x4792, 0x5251, 0x5ea5, 0x6cca, 0x7d04, 0x47d0, 0x527b, 0x5eb7, 0x6cbc, 0x7ccf, 0x479d, 0x522a, 0x5e41, 0x6c1b, 0x7bf8 +}; + +RAM_ALIGN const Word8 lpc_warp_pre_adapt_emphasis_64_e_32000[64] = +{ + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, + 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c +}; + +RAM_ALIGN const Word16 *const lpc_pre_adapt_emphasis[NUM_SAMP_FREQ] = {NULL, + NULL, + NULL, + lpc_warp_pre_adapt_emphasis_64_32000, + lpc_warp_pre_adapt_emphasis_64_48000, + NULL}; + +RAM_ALIGN const Word8 lpc_warp_pre_adapt_emphasis_64_e_48000[64] = +{ + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e +}; + +RAM_ALIGN const Word8 *const lpc_pre_adapt_emphasis_e[NUM_SAMP_FREQ] = {NULL, + NULL, + NULL, + lpc_warp_pre_adapt_emphasis_64_e_32000, + lpc_warp_pre_adapt_emphasis_64_e_48000, + NULL}; + +#ifdef CR9_C_ADD_1p25MS +#ifdef ENABLE_HR_MODE +const Word16 LowDelayShapes_n960_len_1_25ms[6] = {20, 40, 60, 80, 120, 240}; +#else +const Word16 LowDelayShapes_n960_len_1_25ms[5] = {20, 40, 60, 80, 120}; +#endif + +#ifdef ENABLE_HR_MODE +const Word32 MDCT_WINDOW_FS_8000_frame_ms_1_25[20] = { + 150701702, 448394330, 735046002, 1003598401, 1247438878, 1460563269, 1637723745, + 1774558027, 1867696801, 1914846681, -1914846681, -1867696801, -1774558027, -1637723745, + -1460563269, -1247438878, -1003598401, -735046002, -448394330, -150701702 + }; + +const Word32 MDCT_WINDOW_FS_16000_frame_ms_1_25[40] = { + 53322207, 159637873, 264969317, 368667138, 470092003, 568618595, 663639464, + 754568775, 840845919, 921938968, 997347957, 1066607963, 1129291978, 1185013531, + 1233429082, 1274240133, 1307195069, 1332090713, 1348773575, 1357140799, -1357140799, + -1348773575, -1332090713, -1307195069, -1274240133, -1233429082, -1185013531, -1129291978, + -1066607963, -997347957, -921938968, -840845919, -754568775, -663639464, -568618595, + -470092003, -368667138, -264969317, -159637873, -53322207 + }; + +const Word32 MDCT_WINDOW_FS_24000_frame_ms_1_25[60] = { + 29029078, 87007668, 144747776, 202091141, 258880587, 314960460, 370177048, + 424379007, 477417772, 529147969, 579427807, 628119474, 675089510, 720209172, + 763354790, 804408107, 843256596, 879793778, 913919506, 945540245, 974569323, + 1000927175, 1024541554, 1045347737, 1063288694, 1078315251, 1090386220, 1099468517, + 1105537247, 1108575776, -1108575776, -1105537247, -1099468517, -1090386220, -1078315251, + -1063288694, -1045347737, -1024541554, -1000927175, -974569323, -945540245, -913919506, + -879793778, -843256596, -804408107, -763354790, -720209172, -675089510, -628119474, + -579427807, -529147969, -477417772, -424379007, -370177048, -314960460, -258880587, + -202091141, -144747776, -87007668, -29029078 + }; + +const Word32 MDCT_WINDOW_FS_32000_frame_ms_1_25[80] = { + 37711764, 113077142, 188268164, 263168890, 337663828, 411638113, 484977683, + 557569451, 629301488, 700063188, 769745441, 838240803, 905443658, 971250384, + 1035559513, 1098271884, 1159290799, 1218522172, 1275874672, 1331259866, 1384592353, + 1435789900, 1484773562, 1531467812, 1575800649, 1617703715, 1657112400, 1693965938, + 1728207502, 1759784297, 1788647631, 1814753000, 1838060152, 1858533148, 1876140421, + 1890854821, 1902653660, 1911518745, 1917436407, 1920397521, -1920397521, -1917436407, + -1911518745, -1902653660, -1890854821, -1876140421, -1858533148, -1838060152, -1814753000, + -1788647631, -1759784297, -1728207502, -1693965938, -1657112400, -1617703715, -1575800649, + -1531467812, -1484773562, -1435789900, -1384592353, -1331259866, -1275874672, -1218522172, + -1159290799, -1098271884, -1035559513, -971250384, -905443658, -838240803, -769745441, + -700063188, -629301488, -557569451, -484977683, -411638113, -337663828, -263168890, + -188268164, -113077142, -37711764 + }; + +const Word32 MDCT_WINDOW_FS_48000_frame_ms_1_25[120] = { + 20528417, 61571181, 102571748, 143502017, 184333937, 225039524, 265590880, + 305960213, 346119857, 386042287, 425700143, 465066245, 504113615, 542815489, + 581145346, 619076914, 656584198, 693641492, 730223399, 766304847, 801861108, + 836867813, 871300971, 905136983, 938352659, 970925235, 1002832388, 1034052249, + 1064563423, 1094344998, 1123376563, 1151638223, 1179110607, 1205774887, 1231612790, + 1256606606, 1280739208, 1303994054, 1326355209, 1347807345, 1368335762, 1387926390, + 1406565803, 1424241225, 1440940544, 1456652314, 1471365767, 1485070820, 1497758079, + 1509418850, 1520045141, 1529629668, 1538165864, 1545647877, 1552070581, 1557429573, + 1561721181, 1564942463, 1567091212, 1568165954, -1568165954, -1567091212, -1564942463, + -1561721181, -1557429573, -1552070581, -1545647877, -1538165864, -1529629668, -1520045141, + -1509418850, -1497758079, -1485070820, -1471365767, -1456652314, -1440940544, -1424241225, + -1406565803, -1387926390, -1368335762, -1347807345, -1326355209, -1303994054, -1280739208, + -1256606606, -1231612790, -1205774887, -1179110607, -1151638223, -1123376563, -1094344998, + -1064563423, -1034052249, -1002832388, -970925235, -938352659, -905136983, -871300971, + -836867813, -801861108, -766304847, -730223399, -693641492, -656584198, -619076914, + -581145346, -542815489, -504113615, -465066245, -425700143, -386042287, -346119857, + -305960213, -265590880, -225039524, -184333937, -143502017, -102571748, -61571181, + -20528417 +}; + +#else /* ENABLE_HR_MODE */ + +const Word16 MDCT_WINDOW_FS_8000_frame_ms_1_25[20] = { + 2300, + 6842, + 11216, + 15314, + 19034, + 22286, + 24990, + 27078, + 28499, + 29218, + -29218, + -28499, + -27078, + -24990, + -22286, + -19034, + -15314, + -11216, + -6842, + -2300 + }; + +const Word16 MDCT_WINDOW_FS_16000_frame_ms_1_25[40] = { + 814, + 2436, + 4043, + 5625, + 7173, + 8676, + 10126, + 11514, + 12830, + 14068, + 15218, + 16275, + 17232, + 18082, + 18821, + 19443, + 19946, + 20326, + 20581, + 20708, + -20708, + -20581, + -20326, + -19946, + -19443, + -18821, + -18082, + -17232, + -16275, + -15218, + -14068, + -12830, + -11514, + -10126, + -8676, + -7173, + -5625, + -4043, + -2436, + -814 + }; + +const Word16 MDCT_WINDOW_FS_24000_frame_ms_1_25[60] = { + 443, + 1328, + 2209, + 3084, + 3950, + 4806, + 5648, + 6476, + 7285, + 8074, + 8841, + 9584, + 10301, + 10990, + 11648, + 12274, + 12867, + 13425, + 13945, + 14428, + 14871, + 15273, + 15633, + 15951, + 16224, + 16454, + 16638, + 16777, + 16869, + 16916, + -16916, + -16869, + -16777, + -16638, + -16454, + -16224, + -15951, + -15633, + -15273, + -14871, + -14428, + -13945, + -13425, + -12867, + -12274, + -11648, + -10990, + -10301, + -9584, + -8841, + -8074, + -7285, + -6476, + -5648, + -4806, + -3950, + -3084, + -2209, + -1328, + -443 + }; + +const Word16 MDCT_WINDOW_FS_32000_frame_ms_1_25[80] = { + 575, + 1725, + 2873, + 4016, + 5152, + 6281, + 7400, + 8508, + 9602, + 10682, + 11745, + 12791, + 13816, + 14820, + 15801, + 16758, + 17689, + 18593, + 19468, + 20313, + 21127, + 21908, + 22656, + 23368, + 24045, + 24684, + 25286, + 25848, + 26370, + 26852, + 27293, + 27691, + 28047, + 28359, + 28628, + 28852, + 29032, + 29167, + 29258, + 29303, + -29303, + -29258, + -29167, + -29032, + -28852, + -28628, + -28359, + -28047, + -27691, + -27293, + -26852, + -26370, + -25848, + -25286, + -24684, + -24045, + -23368, + -22656, + -21908, + -21127, + -20313, + -19468, + -18593, + -17689, + -16758, + -15801, + -14820, + -13816, + -12791, + -11745, + -10682, + -9602, + -8508, + -7400, + -6281, + -5152, + -4016, + -2873, + -1725, + -575 + }; + +const Word16 MDCT_WINDOW_FS_48000_frame_ms_1_25[120] = { + 313, + 940, + 1565, + 2190, + 2813, + 3434, + 4053, + 4669, + 5281, + 5891, + 6496, + 7096, + 7692, + 8283, + 8868, + 9446, + 10019, + 10584, + 11142, + 11693, + 12235, + 12770, + 13295, + 13811, + 14318, + 14815, + 15302, + 15778, + 16244, + 16698, + 17141, + 17573, + 17992, + 18399, + 18793, + 19174, + 19543, + 19897, + 20239, + 20566, + 20879, + 21178, + 21462, + 21732, + 21987, + 22227, + 22451, + 22660, + 22854, + 23032, + 23194, + 23340, + 23471, + 23585, + 23683, + 23764, + 23830, + 23879, + 23912, + 23928, + -23928, + -23912, + -23879, + -23830, + -23764, + -23683, + -23585, + -23471, + -23340, + -23194, + -23032, + -22854, + -22660, + -22451, + -22227, + -21987, + -21732, + -21462, + -21178, + -20879, + -20566, + -20239, + -19897, + -19543, + -19174, + -18793, + -18399, + -17992, + -17573, + -17141, + -16698, + -16244, + -15778, + -15302, + -14815, + -14318, + -13811, + -13295, + -12770, + -12235, + -11693, + -11142, + -10584, + -10019, + -9446, + -8868, + -8283, + -7692, + -7096, + -6496, + -5891, + -5281, + -4669, + -4053, + -3434, + -2813, + -2190, + -1565, + -940, + -313 +}; +#endif /* ENABLE_HR_MODE */ + +#ifdef ENABLE_HR_MODE +const Word32 *const LowDelayShapes_n960_1_25ms[6] = { + MDCT_WINDOW_FS_8000_frame_ms_1_25, MDCT_WINDOW_FS_16000_frame_ms_1_25, MDCT_WINDOW_FS_24000_frame_ms_1_25, MDCT_WINDOW_FS_32000_frame_ms_1_25, MDCT_WINDOW_FS_48000_frame_ms_1_25, NULL }; +#else +const Word16 *const LowDelayShapes_n960_1_25ms[6] = { + MDCT_WINDOW_FS_8000_frame_ms_1_25, MDCT_WINDOW_FS_16000_frame_ms_1_25, MDCT_WINDOW_FS_24000_frame_ms_1_25, MDCT_WINDOW_FS_32000_frame_ms_1_25, MDCT_WINDOW_FS_48000_frame_ms_1_25, NULL }; +#endif + +const Word16 bands_offset_16000_lpc_warp_1_25ms[21] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20}; + +const Word16 bands_offset_24000_lpc_warp_1_25ms[28] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 28, 30}; + +const Word16 bands_offset_32000_lpc_warp_1_25ms[32] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 27, 29, 31, 33, 35, 37, 40}; + +const Word16 bands_offset_48000_lpc_warp_1_25ms[34] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 43, 46, 50}; + +const Word16 *const bands_offset_1_25ms[6] = { + NULL, bands_offset_16000_lpc_warp_1_25ms, bands_offset_24000_lpc_warp_1_25ms, + bands_offset_32000_lpc_warp_1_25ms, bands_offset_48000_lpc_warp_1_25ms, NULL}; + +#ifdef ENABLE_HR_MODE +/* RAM_ALIGN const Word16 bands_number_1_25ms_HR[] = NULL; */ +const Word16 bands_number_1_25ms [] = {-1, 20, 27, 31, 33, 0}; +#else +const Word16 bands_number_1_25ms [] = {-1, 20, 27, 31, 33}; +#endif +#ifdef FIX_PLC_CONFORM_ISSUES +const Word16 bands_offset_with_one_max_1_25ms[NUM_OFFSETS] = {-1, 20, 20, 23, 20 +#ifdef ENABLE_HR_MODE + , -1, -1 +#endif +}; + +const Word16 bands_offset_with_two_max_1_25ms[NUM_OFFSETS] = {-1, 20, 20, 30, 30 +#ifdef ENABLE_HR_MODE + , -1, -1 +#endif +}; +#endif +#ifdef FIX_PLC_CONFORM_ISSUES +const Word16 bands_offset_with_one_max_lin_1_25ms[NUM_SAMP_FREQ] = {-1, 20, 30, 40, 50 +#ifdef ENABLE_HR_MODE + , 0 +#endif + }; +const Word16 bands_offset_with_two_max_lin_1_25ms[NUM_SAMP_FREQ] = {0, 0, 0, 0, 0 +#ifdef ENABLE_HR_MODE + , 0 +#endif + }; +#endif +#endif /* CR9_C_ADD_1p25MS */ + +#ifdef ENABLE_HR_MODE + +const Word32 LowDelayShapes_n960_N480_HRA_7_5ms_IP[720] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 87, 348, 823, 1614, 2855, 4711, + 7394, 11166, 16346, 23325, 32567, 44630, 60168, 79951, 104871, + 135960, 174404, 221554, 278944, 348306, 431580, 530938, 648792, 787807, + 950923, 1141360, 1362631, 1618557, 1913273, 2251235, 2637225, 3076358, 3574079, + 4136163, 4768712, 5478142, 6271180, 7154844, 8136428, 9223482, 10423785, 11745317, + 13196231, 14784811, 16519438, 18408546, 20460576, 22683925, 25086898, 27677652, 30464139, + 33454048, 36654744, 40073208, 43715977, 47589078, 51697972, 56047490, 60641775, 65484225, + 70577443, 75923181, 81522294, 87374702, 93479345, 99834159, 106436041, 113280836, 120363317, + 127677184, 135215062, 142968508, 150928157, 159083617, 167423428, 175935264, 184605929, 193421420, + 202366999, 211427267, 220586253, 229827503, 239134176, 248489151, 257875132, 267274759, 276670727, + 286045896, 295383416, 304666842, 313880253, 323008369, 332036665, 340951481, 349740127, 358390986, + 366893607, 375238791, 383418672, 391426786, 399258131, 406909219, 414378115, 421664463, 428769507, + 435696092, 442448656, 449033209, 455457302, 461729975, 467861704, 473864325, 479750954, 485535888, + 491234502, 496863130, 502438943, 507979811, 513504165, 519030849, 524578969, 530167737, 535816319, + 541543674, 547368406, 553308608, 559381722, 565604392, 571992342, 578560249, 585321630, 592288748, + 599472521, 606882448, 614526549, 622411321, 630541701, 638921050, 647551149, 656432204, 665562870, + 674940281, 684560092, 694416534, 704502476, 714809492, 725327938, 736047035, 746954953, 758038900, + 769285219, 780679474, 792206554, 803850758, 815595897, 827425384, 839322323, 851269604, 863249984, + 875246176, 887240926, 899217093, 911157723, 923046119, 934865908, 946601106, 958236175, 969756079, + 981146337, 992393068, 1003483035, 1014403685, 1025143183, 1035690443, 1046035156, 1056167806, 1066079698, + 1075762962, 1085210568, 1094416328, 1103374896, 1112081767, 1120533266, 1128726537, 1136659525, 1144330955, + 1151740310, 1158887799, 1165774327, 1172401460, 1178771388, 1184886881, 1190751250, 1196368299, 1201742283, + 1206877859, 1211780040, 1216454151, 1220905777, 1225140726, 1229164983, 1232984668, 1236606003, 1240035271, + 1243278790, 1246342881, 1249233843, 1251957932, 1254521342, 1256930191, 1259190506, 1261308214, 1263289136, + 1265138979, 1266863333, 1268467669, 1269957337, 1271337562, 1272613448, 1273789972, 1274871989, 1275864224, + 1276771276, 1277597614, 1278347576, 1279025364, 1279635046, 1280180548, 1280665658, 1281094017, 1281469123, + 1281794327, 1282072831, 1282307692, 1282501820, 1282657982, 1282778803, 1282866770, 1282924240, 1282953439, + 1282956475, 1282935340, 1282891922, 1282828007, 1282745290, 1282645385, 1282529830, 1282400095, 1282257591, + 1282103675, 1281939658, 1281766811, 1281586369, 1281399536, 1281207489, 1281011380, 1280812338, 1280611471, + 1280409867, 1280208592, 1280008692, 1279811190, 1279617083, 1279427343, 1279242908, 1279064691, 1278893575, + 1278730391, 1278575934, 1278430953, 1278296152, 1278172183, 1278059646, 1277959085, 1277870984, 1277795766, + 1277733793, 1277685360, 1277650698, 1277629970, 1277623272, 1277630630, 1277652006, 1277687290, 1277736307, + 1277798815, 1277874509, 1277963018, 1278063911, 1278176696, 1278300826, 1278435697, 1278580655, 1278734998, + 1278897977, 1279068803, 1279246650, 1279430656, 1279619930, 1279813555, 1280010596, 1280210097, 1280411091, + 1280612606, 1280813664, 1281013290, 1281210515, 1281404382, 1281593947, 1281778291, 1281956514, 1282127749, + 1282291161, 1282445951, 1282591364, 1282726688, 1282851259, 1282964467, 1283065755, 1283154623, 1283230634, + 1283293412, 1283342644, 1283378085, 1283399556, 1283406948, 1283400219, 1283379398, 1283344582, 1283295937, + 1283233697, 1283158163, 1283069704, 1282968748, 1282855789, 1282731378, 1282596123, 1282450686, 1282295780, + 1282132162, 1281960636, 1281782040, 1281597253, 1281407178, 1281212748, 1281014916, 1280814653, 1280612938, + -1280410760, -1280209108, -1280008970, -1279811325, -1279617137, -1279427356, -1279242908, -1279064691, -1278893575, + -1278730391, -1278575934, -1278430953, -1278296152, -1278172183, -1278059646, -1277959085, -1277870984, -1277795766, + -1277733793, -1277685360, -1277650698, -1277629970, -1277623272, -1277630630, -1277652006, -1277687290, -1277736307, + -1277798815, -1277874509, -1277963018, -1278063911, -1278176696, -1278300826, -1278435697, -1278580655, -1278734998, + -1278897977, -1279068803, -1279246650, -1279430656, -1279619930, -1279813555, -1280010596, -1280210097, -1280411091, + -1280612606, -1280813664, -1281013290, -1281210515, -1281404382, -1281593947, -1281778291, -1281956514, -1282127749, + -1282291161, -1282445951, -1282591364, -1282726688, -1282851259, -1282964467, -1283065755, -1283154623, -1283230634, + -1283293412, -1283342644, -1283378085, -1283399556, -1283406948, -1283400219, -1283379398, -1283344582, -1283295937, + -1283233697, -1283158163, -1283069704, -1282968748, -1282855789, -1282731378, -1282596123, -1282450686, -1282295780, + -1282132162, -1281960636, -1281782040, -1281597240, -1281407124, -1281212613, -1281014638, -1280814136, -1280612044, + -1280409293, -1280206794, -1280005436, -1279806071, -1279609505, -1279416489, -1279227704, -1279043754, -1278865148, + -1278692290, -1278525466, -1278364827, -1278210380, -1278061967, -1277919259, -1277781732, -1277648661, -1277519103, + -1277391882, -1277265579, -1277138516, -1277008749, -1276874050, -1276731906, -1276579498, -1276413701, -1276231074, + -1276027848, -1275799922, -1275542858, -1275251868, -1274921816, -1274547202, -1274122161, -1273640454, -1273095459, + -1272480163, -1271787153, -1271008605, -1270136275, -1269161491, -1268075138, -1266867650, -1265529002, -1264048705, + -1262415795, -1260618834, -1258645914, -1256484654, -1254122219, -1251545330, -1248740288, -1245693001, -1242389021, + -1238813588, -1234951678, -1230788064, -1226307382, -1221494200, -1216333106, -1210808785, -1204906119, -1198610276, + -1191906816, -1184781789, -1177221841, -1169214319, -1160747375, -1151810067, -1142392460, -1132485722, -1122082216, + -1111175584, -1099760832, -1087834398, -1075394224, -1062439811, -1048972272, -1034994376, -1020510578, -1005527053, + -990051705, -974094182, -957665874, -940779904, -923451116, -905696046, -887532891, -868981469, -850063169, + -830800896, -811219007, -791343239, -771200631, -750819438, -730229039, -709459838, -688543157, -667511126, + -646396563, -625232849, -604053802, -582893543, -561786350, -540766526, -519868245, -499125406, -478571481, + -458239366, -438161227, -418368350, -398890991, -379758233, -360997846, -342636148, -324697881, -307206093, + -290182024, -273645013, -257612410, -242099504, -227119464, -212683299, -198799827, -185475666, -172715241, + -160520802, -148892465, -137828265, -127324223, -117374432, -107971150, -99104909, -90764635, -82937772, + -75610419, -68767471, -62392760, -56469205, -50978959, -45903556, -41224052, -36921169, -32975429, + -29367284, -26077235, -23085950, -20374365, -17923784, -15715959, -13733175, -11958308, -10374886, + -8967135, -7720017, -6619257, -5651362, -4803637, -4064184, -3421902, -2866477, -2388368, + -1978789, -1629681, -1333688, -1084125, -874947, -700710, -556540, -438092, -341515, + -263414, -200812, -151118, -112086, -81786, -58572, -41046, -28035, -18564, + -11827, -7166, -4052, -2065, -873, -219, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +const Word32 LowDelayShapes_n960_N960_HRA_7_5ms_IP[1440] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 44, 108, 200, + 327, 496, 716, 997, 1352, 1793, 2334, 2993, 3788, + 4740, 5873, 7210, 8782, 10618, 12754, 15228, 18079, 21354, + 25102, 29375, 34232, 39736, 45954, 52960, 60833, 69657, 79523, + 90531, 102783, 116393, 131479, 148170, 166600, 186913, 209263, 233812, + 260731, 290202, 322417, 357578, 395898, 437601, 482924, 532113, 585429, + 643144, 705541, 772919, 845587, 923872, 1008108, 1098650, 1195861, 1300121, + 1411824, 1531379, 1659208, 1795748, 1941453, 2096787, 2262233, 2438287, 2625458, + 2824273, 3035270, 3259002, 3496037, 3746956, 4012353, 4292837, 4589026, 4901555, + 5231067, 5578220, 5943680, 6328125, 6732242, 7156730, 7602292, 8069643, 8559503, + 9072598, 9609661, 10171429, 10758643, 11372046, 12012385, 12680404, 13376850, 14102468, + 14858000, 15644185, 16461757, 17311444, 18193967, 19110038, 20060361, 21045626, 22066514, + 23123691, 24217808, 25349499, 26519382, 27728053, 28976092, 30264055, 31592472, 32961855, + 34372684, 35825415, 37320475, 38858262, 40439142, 42063449, 43731482, 45443509, 47199758, + 49000423, 50845659, 52735581, 54670266, 56649748, 58674020, 60743031, 62856690, 65014857, + 67217351, 69463943, 71754359, 74088280, 76465337, 78885116, 81347157, 83850949, 86395935, + 88981513, 91607029, 94271785, 96975035, 99715986, 102493800, 105307656, 108156591, 111039641, + 113955799, 116904014, 119883198, 122892222, 125929920, 128995090, 132086493, 135202860, 138342888, + 141505243, 144688567, 147891470, 151112543, 154350350, 157603439, 160870336, 164149553, 167439589, + 170738931, 174046055, 177359434, 180677535, 183998823, 187321766, 190644834, 193966503, 197285258, + 200599596, 203908028, 207209080, 210501300, 213783255, 217053539, 220310770, 223553598, 226780705, + 229990806, 233182654, 236355043, 239506805, 242636819, 245744010, 248827351, 251885864, 254918626, + 257924767, 260903473, 263853991, 266775622, 269667734, 272529755, 275361176, 278161556, 280930518, + 283667753, 286373022, 289046153, 291687043, 294295661, 296872047, 299416309, 301928628, 304409254, + 306858511, 309276789, 311664551, 314022327, 316350717, 318650389, 320922075, 323166575, 325384751, + 327577531, 329745900, 331890905, 334013649, 336115291, 338197045, 340260173, 342305990, 344335852, + 346351165, 348353370, 350343952, 352324427, 354296346, 356261288, 358220860, 360176691, 362130431, + 364083745, 366038312, 367995821, 369957968, 371926451, 373902968, 375889214, 377886876, 379897629, + 381923135, 383965040, 386024966, 388104513, 390205254, 392328729, 394476448, 396649881, 398850460, + 401079575, 403338572, 405628746, 407951345, 410307564, 412698544, 415125367, 417589059, 420090585, + 422630847, 425210685, 427830873, 430492120, 433195067, 435940288, 438728287, 441559502, 444434298, + 447352971, 450315749, 453322788, 456374176, 459469929, 462609996, 465794259, 469022529, 472294553, + 475610011, 478968518, 482369626, 485812825, 489297542, 492823148, 496388953, 499994212, 503638125, + 507319839, 511038449, 514793004, 518582502, 522405897, 526262100, 530149980, 534068367, 538016053, + 541991796, 545994319, 550022317, 554074452, 558149362, 562245659, 566361935, 570496756, 574648675, + 578816224, 582997925, 587192283, 591397795, 595612950, 599836228, 604066106, 608301058, 612539556, + 616780072, 621021084, 625261070, 629498515, 633731914, 637959769, 642180591, 646392905, 650595252, + 654786183, 658964269, 663128098, 667276277, 671407434, 675520217, 679613298, 683685373, 687735163, + 691761414, 695762900, 699738424, 703686816, 707606936, 711497676, 715357958, 719186737, 722983000, + 726745768, 730474096, 734167073, 737823824, 741443507, 745025319, 748568492, 752072293, 755536028, + 758959039, 762340704, 765680440, 768977700, 772231975, 775442794, 778609720, 781732356, 784810341, + 787843351, 790831096, 793773326, 796669823, 799520406, 802324927, 805083276, 807795372, 810461171, + 813080658, 815653853, 818180806, 820661596, 823096332, 825485155, 827828229, 830125749, 832377934, + 834585028, 836747302, 838865047, 840938578, 842968232, 844954366, 846897354, 848797592, 850655491, + 852471478, 854245997, 855979505, 857672472, 859325380, 860938723, 862513004, 864048738, 865546444, + 867006653, 868429898, 869816720, 871167666, 872483283, 873764126, 875010749, 876223709, 877403563, + 878550870, 879666189, 880750077, 881803089, 882825781, 883818705, 884782410, 885717445, 886624352, + 887503671, 888355939, 889181688, 889981445, 890755734, 891505074, 892229977, 892930955, 893608509, + 894263138, 894895337, 895505593, 896094389, 896662203, 897209507, 897736768, 898244447, 898733000, + 899202877, 899654523, 900088379, 900504877, 900904447, 901287510, 901654485, 902005783, 902341811, + 902662967, 902969647, 903262240, 903541129, 903806691, 904059297, 904299312, 904527095, 904742999, + 904947372, 905140554, 905322879, 905494676, 905656265, 905807964, 905950080, 906082916, 906206768, + 906321926, 906428673, 906527284, 906618032, 906701178, 906776980, 906845690, 906907551, 906962802, + 907011675, 907054396, 907091185, 907122257, 907147818, 907168073, 907183217, 907193443, 907198938, + 907199882, 907196451, 907188818, 907177150, 907161608, 907142351, 907119533, 907093305, 907063813, + 907031199, 906995603, 906957162, 906916008, 906872273, 906826083, 906777563, 906726837, 906674025, + 906619245, 906562613, 906504244, 906444251, 906382745, 906319835, 906255629, 906190236, 906123759, + 906056304, 905987975, 905918873, 905849099, 905778755, 905707939, 905636751, 905565287, 905493644, + 905421918, 905350204, 905278596, 905207187, 905136068, 905065331, 904995065, 904925359, 904856301, + 904787977, 904720472, 904653870, 904588254, 904523701, 904460295, 904398114, 904337234, 904277728, + 904219670, 904163129, 904108175, 904054874, 904003290, 903953487, 903905525, 903859462, 903815353, + 903773252, 903733209, 903695274, 903659492, 903625906, 903594557, 903565482, 903538716, 903514291, + 903492237, 903472579, 903455342, 903440546, 903428208, 903418343, 903410963, 903406076, 903403687, + 903403799, 903406411, 903411521, 903419121, 903429201, 903441750, 903456751, 903474186, 903494033, + 903516269, 903540866, 903567793, 903597018, 903628506, 903662217, 903698112, 903736145, 903776272, + 903818442, 903862605, 903908708, 903956694, 904006505, 904058081, 904111359, 904166274, 904222761, + 904280750, 904340172, 904400953, 904463022, 904526303, 904590718, 904656191, 904722641, 904789988, + 904858152, 904927048, 904996594, 905066706, 905137298, 905208286, 905279583, 905351102, 905422757, + 905494462, 905566128, 905637670, 905709001, 905780033, 905850681, 905920859, 905990482, 906059464, + 906127723, 906195175, 906261739, 906327332, 906391876, 906455291, 906517501, 906578429, 906638002, + 906696146, 906752790, 906807866, 906861306, 906913045, 906963019, 907011167, 907057430, 907101752, + 907144078, 907184355, 907222535, 907258571, 907292418, 907324034, 907353381, 907380422, 907405124, + 907427456, 907447391, 907464903, 907479970, 907492575, 907502701, 907510335, 907515468, 907518092, + 907518205, 907515805, 907510896, 907503482, 907493572, 907481179, 907466317, 907449004, 907429261, + 907407111, 907382581, 907355702, 907326506, 907295028, 907261307, 907225384, 907187302, 907147109, + 907104853, 907060585, 907014361, 906966236, 906916270, 906864523, 906811060, 906755944, 906699245, + 906641031, 906581374, 906520347, 906458025, 906394483, 906329801, 906264057, 906197332, 906129707, + 906061266, 905992093, 905922271, 905851888, 905781028, 905709780, 905638230, 905566465, 905494574, + -905422645, -905350765, -905279024, -905207507, -905136304, -905065500, -904995184, -904925439, -904856352, + -904788008, -904720488, -904653877, -904588254, -904523701, -904460295, -904398114, -904337234, -904277728, + -904219670, -904163129, -904108175, -904054874, -904003290, -903953487, -903905525, -903859462, -903815353, + -903773252, -903733209, -903695274, -903659492, -903625906, -903594557, -903565482, -903538716, -903514291, + -903492237, -903472579, -903455342, -903440546, -903428208, -903418343, -903410963, -903406076, -903403687, + -903403799, -903406411, -903411521, -903419121, -903429201, -903441750, -903456751, -903474186, -903494033, + -903516269, -903540866, -903567793, -903597018, -903628506, -903662217, -903698112, -903736145, -903776272, + -903818442, -903862605, -903908708, -903956694, -904006505, -904058081, -904111359, -904166274, -904222761, + -904280750, -904340172, -904400953, -904463022, -904526303, -904590718, -904656191, -904722641, -904789988, + -904858152, -904927048, -904996594, -905066706, -905137298, -905208286, -905279583, -905351102, -905422757, + -905494462, -905566128, -905637670, -905709001, -905780033, -905850681, -905920859, -905990482, -906059464, + -906127723, -906195175, -906261739, -906327332, -906391876, -906455291, -906517501, -906578429, -906638002, + -906696146, -906752790, -906807866, -906861306, -906913045, -906963019, -907011167, -907057430, -907101752, + -907144078, -907184355, -907222535, -907258571, -907292418, -907324034, -907353381, -907380422, -907405124, + -907427456, -907447391, -907464903, -907479970, -907492575, -907502701, -907510335, -907515468, -907518092, + -907518205, -907515805, -907510896, -907503482, -907493572, -907481179, -907466317, -907449004, -907429261, + -907407111, -907382581, -907355702, -907326506, -907295028, -907261307, -907225384, -907187302, -907147109, + -907104853, -907060585, -907014361, -906966236, -906916270, -906864523, -906811060, -906755944, -906699245, + -906641031, -906581374, -906520347, -906458025, -906394483, -906329801, -906264050, -906197315, -906129676, + -906061214, -905992012, -905922152, -905851718, -905780792, -905709459, -905637802, -905565904, -905493847, + -905421715, -905349587, -905277545, -905205668, -905134032, -905062714, -904991788, -904921326, -904851397, + -904782068, -904713403, -904645463, -904578305, -904511983, -904446548, -904382044, -904318513, -904255990, + -904194508, -904134091, -904074760, -904016528, -903959404, -903903387, -903848473, -903794647, -903741889, + -903690170, -903639452, -903589690, -903540829, -903492806, -903445546, -903398968, -903352977, -903307470, + -903262332, -903217440, -903172655, -903127830, -903082805, -903037408, -902991455, -902944749, -902897082, + -902848230, -902797958, -902746017, -902692145, -902636065, -902577487, -902516107, -902451605, -902383649, + -902311891, -902235969, -902155504, -902070104, -901979361, -901882852, -901780138, -901670764, -901554261, + -901430141, -901297903, -901157028, -901006979, -900847206, -900677140, -900496195, -900303767, -900099237, + -899881968, -899651302, -899406566, -899147069, -898872099, -898580929, -898272809, -897946972, -897602633, + -897238985, -896855201, -896450436, -896023825, -895574479, -895101492, -894603937, -894080864, -893531305, + -892954268, -892348742, -891713696, -891048075, -890350805, -889620793, -888856922, -888058059, -887223048, + -886350714, -885439866, -884489291, -883497761, -882464029, -881386834, -880264898, -879096929, -877881622, + -876617661, -875303716, -873938450, -872520516, -871048562, -869521229, -867937155, -866294976, -864593328, + -862830848, -861006177, -859117961, -857164854, -855145521, -853058635, -850902887, -848676980, -846379640, + -844009611, -841565658, -839046575, -836451182, -833778329, -831026896, -828195801, -825283996, -822290474, + -819214267, -816054453, -812810153, -809480538, -806064827, -802562292, -798972258, -795294106, -791527275, + -787671264, -783725629, -779689995, -775564045, -771347531, -767040273, -762642156, -758153138, -753573244, + -748902575, -744141301, -739289667, -734347993, -729316674, -724196178, -718987051, -713689917, -708305473, + -702834496, -697277838, -691636430, -685911277, -680103464, -674214150, -668244572, -662196041, -656069944, + -649867743, -643590972, -637241240, -630820227, -624329685, -617771433, -611147363, -604459432, -597709664, + -590900148, -584033037, -577110543, -570134942, -563108566, -556033804, -548913099, -541748950, -534543903, + -527300554, -520021545, -512709564, -505367338, -497997635, -490603260, -483187052, -475751882, -468300650, + -460836282, -453361728, -445879958, -438393963, -430906743, -423421316, -415940704, -408467938, -401006049, + -393558069, -386127025, -378715938, -371327818, -363965660, -356632445, -349331130, -342064650, -334835913, + -327647796, -320503142, -313404758, -306355410, -299357818, -292414658, -285528555, -278702079, -271937746, + -265238010, -258605264, -252041836, -245549983, -239131895, -232789684, -226525389, -220340970, -214238305, + -208219189, -202285333, -196438360, -190679806, -185011113, -179433635, -173948631, -168557267, -163260612, + -158059640, -152955229, -147948160, -143039115, -138228681, -133517347, -128905505, -124393450, -119981382, + -115669406, -111457534, -107345683, -103333681, -99421264, -95608082, -91893698, -88277589, -84759152, + -81337704, -78012482, -74782650, -71647299, -68605451, -65656059, -62798015, -60030148, -57351228, + -54759972, -52255046, -49835065, -47498599, -45244179, -43070293, -40975397, -38957912, -37016231, + -35148723, -33353731, -31629581, -29974582, -28387030, -26865208, -25407397, -24011868, -22676893, + -21400745, -20181701, -19018041, -17908057, -16850050, -15842335, -14883242, -13971116, -13104325, + -12281255, -11500315, -10759938, -10058585, -9394741, -8766919, -8173665, -7613552, -7085185, + -6587202, -6118273, -5677102, -5262427, -4873021, -4507690, -4165278, -3844660, -3544752, + -3264499, -3002887, -2758933, -2531691, -2320249, -2123731, -1941292, -1772123, -1615446, + -1470519, -1336627, -1213092, -1099261, -994515, -898263, -809943, -729021, -654988, + -587365, -525695, -469547, -418515, -372215, -330284, -292383, -258192, -227410, + -199757, -174969, -152801, -133024, -115424, -99803, -85978, -73777, -63042, + -53629, -45403, -38240, -32028, -26663, -22051, -18104, -14745, -11902, + -9511, -7514, -5860, -4500, -3394, -2503, -1797, -1244, -820, + -502, -271, -109, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +RAM_ALIGN const Word32 LowDelayShapes_n960_N480_HRA_2_5ms_IP[240] = { + 214, 1407, 4144, 9592, 19434, 36052, 62711, 103783, 164992, + 253687, 379148, 552904, 789076, 1104722, 1520198, 2059494, 2750561, 3625602, + 4721314, 6079061, 7744972, 9769942, 12209518, 15123669, 18576419, 22635352, 27370973, + 32855950, 39164229, 46370051, 54546874, 63766241, 74096597, 85602085, 98341344, 112366317, + 127721101, 144440829, 162550610, 182064542, 202984778, 225300694, 248988134, 274008783, 300309659, + 327822776, 356464985, 386138051, 416728983, 448110659, 480142780, 512673177, 545539472, 578571104, + 611591694, 644421704, 676881340, 708793602, 739987407, 770300656, 799583149, 827699226, 854530045, + 879975405, 903955057, 926409465, 947300009, 966608644, 984337071, 1000505451, 1015150768, 1028324899, + 1040092491, 1050528715, 1059716983, 1067746699, 1074711082, 1080705143, 1085823820, 1090160324, 1093804700, + 1096842623, 1099354431, 1101414399, 1103090233, 1104442796, 1105526028, 1106387052, 1107066439, 1107598605, + 1108012308, 1108331223, 1108574556, 1108757676, 1108892731, 1108989242, 1109054637, 1109094735, 1109114155, + 1109116652, 1109105394, 1109083163, 1109052498, 1109015788, 1108975323, 1108933307, 1108891843, 1108852902, + 1108818280, 1108789546, 1108767992, 1108754591, 1108749953, 1108754306, 1108767481, 1108788919, 1108817694, + 1108852552, 1108891964, 1108934195, -1108977380, -1109019614, -1109059032, -1109093898, -1109122681, -1109144125, + -1109157302, -1109161650, -1109156995, -1109143556, -1109121925, -1109093037, -1109058122, -1109018637, -1108976187, + -1108932433, -1108888980, -1108847255, -1108808366, -1108772946, -1108740971, -1108711558, -1108682731, -1108651158, + -1108611855, -1108557851, -1108479820, -1108365676, -1108200143, -1107964292, -1107635083, -1107184891, -1106581062, + -1105785503, -1104754330, -1103437601, -1101779148, -1099716548, -1097181229, -1094098763, -1090389339, -1085968441, + -1080747748, -1074636248, -1067541577, -1059371579, -1050036059, -1039448713, -1027529209, -1014205354, -999415302, + -983109740, -965253961, -945829756, -924837032, -902295070, -878243367, -852741971, -825871301, -797731403, + -768440669, -738134051, -706960817, -675081952, -642667284, -609892453, -576935833, -543975515, -511186440, + -478737764, -446790521, -415495622, -384992199, -355406317, -326850029, -299420751, -273200929, -248257970, + -224644391, -202398148, -181543141, -162089834, -144035993, -127367520, -112059369, -98076525, -85375063, + -73903244, -63602666, -54409446, -46255413, -39069306, -32777951, -27307388, -22583946, -18535216, + -15090941, -12183768, -9749883, -7729511, -6067277, -4712439, -3619003, -2745721, -2055997, + -1517713, -1102987, -787888, -552109, -378629, -253358, -164789, -103664, -62644, + -36017, -19417, -9584, -4141, -1406, -214 }; +RAM_ALIGN const Word32 LowDelayShapes_n960_N480_HRA_5ms_IP[420] = { + 153, 1006, 2962, 6854, 13880, 25735, 44738, 73986, 117524, + 180533, 269534, 392603, 559593, 782368, 1075031, 1454143, 1938937, 2551502, + 3316947, 4263524, 5422707, 6829222, 8521011, 10539137, 12927604, 15733109, 19004698, + 22793344, 27151431, 32132152, 37788816, 44174082, 51339114, 59332667, 68200136, 77982547, + 88715548, 100428385, 113142910, 126872625, 141621804, 157384706, 174144915, 191874817, 210535261, + 230075406, 250432778, 271533559, 293293106, 315616716, 338400617, 361533198, 384896437, 408367524, + 431820627, 455128780, 478165843, 500808481, 522938120, 544442827, 565219197, 585174124, 604225689, + 622304754, 639355717, 655337129, 670221993, 683997778, 696666136, 708242355, 718754575, 728242788, + 736757688, 744359378, 751116012, 757102394, 762398585, 767088551, 771258886, 774997644, 778393288, + 781533768, 784505744, 787393944, 790280637, 793245232, 796363956, 799709608, 803351363, 807354601, + 811780739, 816687064, 822126537, 828147569, 834793773, 842103681, 850110443, 858841520, 868318369, + 878556163, 889563529, 901342346, 913887605, 927187338, 941222645, 955967800, 971390453, 987451937, + 1004107649, 1021307531, 1038996616, 1057115651, 1075601769, 1094389201, 1113410024, 1132594917, 1151873921, + 1171177186, 1190435688, 1209581916, 1228550504, 1247278803, 1265707395, 1283780533, 1301446498, 1318657893, + 1335371854, 1351550191, 1367159457, 1382170967, 1396560748, 1410309460, 1423402271, 1435828702, 1447582463, + 1458661263, 1469066617, 1478803649, 1487880888, 1496310057, 1504105864, 1511285781, 1517869810, 1523880240, + 1529341392, 1534279342, 1538721639, 1542697001, 1546235012, 1549365809, 1552119778, 1554527246, 1556618203, + 1558422028, 1559967247, 1561281317, 1562390436, 1563319395, 1564091445, 1564728213, 1565249633, 1565673917, + 1566017543, 1566295272, 1566520181, 1566703721, 1566855785, 1566984788, 1567097770, 1567200488, 1567297538, + 1567392456, 1567487845, 1567585484, 1567686442, 1567791191, 1567899701, 1568011546, 1568125984, 1568242042, + 1568358534, 1568474289, 1568587995, 1568698311, 1568803945, 1568903672, 1568996349, 1569080932, 1569156484, + 1569222192, 1569277370, 1569321465, 1569354064, 1569374893, 1569383815, 1569380829, 1569366065, 1569339781, + 1569302349, 1569254257, 1569196093, 1569128539, 1569052361, 1568968403, 1568877571, 1568780830, 1568679193, + 1568573710, 1568465461, 1568355548, 1568245083, 1568135185, 1568026967, 1567921528, 1567819946, 1567723271, + 1567632511, 1567548628, 1567472527, 1567405047, 1567346952, 1567298919, 1567261537, 1567235287, 1567220544, + 1567217562, 1567226472, 1567247272, 1567279829, 1567323868, 1567378978, 1567444612, 1567520086, 1567604589, + 1567697189, 1567796846, 1567902419, 1568012687, 1568126359, 1568242097, -1568358534, -1568474289, -1568587995, + -1568698311, -1568803945, -1568903672, -1568996349, -1569080932, -1569156484, -1569222192, -1569277370, -1569321465, + -1569354064, -1569374893, -1569383815, -1569380829, -1569366065, -1569339781, -1569302349, -1569254257, -1569196093, + -1569128539, -1569052361, -1568968403, -1568877571, -1568780830, -1568679193, -1568573710, -1568465461, -1568355548, + -1568245083, -1568135185, -1568026967, -1567921528, -1567819946, -1567723271, -1567632511, -1567548628, -1567472527, + -1567405047, -1567346952, -1567298919, -1567261537, -1567235287, -1567220544, -1567217562, -1567226472, -1567247272, + -1567279829, -1567323868, -1567378978, -1567444612, -1567520086, -1567604589, -1567697189, -1567796846, -1567902419, + -1568012687, -1568126359, -1568242097, -1568358479, -1568473914, -1568586854, -1568695591, -1568798286, -1568892916, + -1568977226, -1569048656, -1569104263, -1569140635, -1569153790, -1569139071, -1569091028, -1569003308, -1568868529, + -1568678156, -1568422382, -1568089999, -1567668277, -1567142834, -1566497514, -1565714254, -1564772952, -1563651331, + -1562324794, -1560766278, -1558946098, -1556831792, -1554387964, -1551576132, -1548354584, -1544678268, -1540498696, + -1535763912, -1530418507, -1524403718, -1517657618, -1510115411, -1501709847, -1492371764, -1482030768, -1470616033, + -1458057247, -1444285654, -1429235205, -1412843785, -1395054486, -1375816907, -1355088440, -1332835519, -1309034797, + -1283674224, -1256753995, -1228287351, -1198301206, -1166836586, -1133948872, -1099707826, -1064197417, -1027515419, + -989772809, -951092956, -911610610, -871470715, -830827045, -789840682, -748678366, -707510713, -666510349, + -625849956, -585700281, -546228117, -507594292, -469951710, -433443460, -398201053, -364342807, -331972440, + -301177891, -272030413, -244583969, -218874947, -194922208, -172727465, -152275991, -133537623, -116468025, + -101010189, -87096098, -74648510, -63582812, -53808877, -45232880, -37759037, -31291209, -25734358, + -20995832, -16986455, -13621428, -10821035, -8511162, -6623645, -5096451, -3873717, -2905668, + -2148423, -1563717, -1118555, -784819, -538834, -360926, -234965, -147925, -89451, + -51458, -27754, -13704, -5923, -2011, -306 }; +RAM_ALIGN const Word32 LowDelayShapes_n960_N480_HRA_IP[780] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 105, 687, 2025, 4688, 9502, 17634, + 30689, 50817, 80838, 124375, 186009, 271432, 387623, 543017, 747676, + 1013467, 1354215, 1785853, 2326545, 2996777, 3819424, 4819763, 6025441, 7466392, + 9174686, 11184326, 13530961, 16251545, 19383921, 22966334, 27036891, 31632957, 36790505, + 42543426, 48922816, 55956247, 63667042, 72073568, 81188571, 91018551, 101563225, 112815065, + 124758945, 137371906, 150623045, 164473553, 178876885, 193779093, 209119296, 224830297, 240839344, + 257069006, 273438164, 289863100, 306258645, 322539389, 338620907, 354420979, 369860792, 384866072, + 399368244, 413305531, 426623420, 439275707, 451224957, 462442920, 472910759, 482619111, 491567983, + 499766479, 507232383, 513991603, 520077504, 525530145, 530395443, 534724296, 538571682, 541995756, + 545056975, 547817267, 550339253, 552685542, 554918106, 557097730, 559283544, 561532631, 563899693, + 566436780, 569193061, 572214618, 575544274, 579221418, 583281849, 587757606, 592676805, 598063482, + 603937430, 610314061, 617204279, 624614388, 632546030, 640996174, 649957147, 659416723, 669358259, + 679760895, 690599795, 701846444, 713468981, 725432569, 737699796, 750231092, 762985159, 775919415, + 788990419, 802154306, 815367198, 828585593, 841766740, 854868978, 867852045, 880677358, 893308258, + 905710214, 917851001, 929700832, 941232469, 952421292, 963245346, 973685357, 983724726, 993349512, + 1002548385, 1011312579, 1019635831, 1027514316, 1034946573, 1041933433, 1048477942, 1054585275, 1060262649, + 1065519228, 1070366010, 1074815711, 1078882625, 1082582470, 1085932219, 1088949913, 1091654462, 1094065430, + 1096202822, 1098086863, 1099737781, 1101175600, 1102419947, 1103489872, 1104403690, 1105178850, 1105831817, + 1106377989, 1106831632, 1107205842, 1107512525, 1107762397, 1107965009, 1108128778, 1108261042, 1108368118, + 1108455375, 1108527311, 1108587638, 1108639366, 1108684891, 1108726077, 1108764338, 1108800715, 1108835945, + 1108870522, 1108904754, 1108938811, 1108972723, 1109006542, 1109040205, 1109073607, 1109106645, 1109139216, + 1109171221, 1109202563, 1109233147, 1109262880, 1109291675, 1109319447, 1109346114, 1109371602, 1109395837, + 1109418753, 1109440288, 1109460385, 1109478991, 1109496061, 1109511552, 1109525430, 1109537663, 1109548227, + 1109557101, 1109564272, 1109569731, 1109573473, 1109575498, 1109575814, 1109574431, 1109571363, 1109566630, + 1109560257, 1109552270, 1109542702, 1109531587, 1109518966, 1109504879, 1109489374, 1109472496, 1109454299, + 1109434835, 1109414161, 1109392335, 1109369417, 1109345469, 1109320555, 1109294742, 1109268095, 1109240684, + 1109212578, 1109183848, 1109154564, 1109124800, 1109094627, 1109064121, 1109033354, 1109002402, 1108971338, + 1108940237, 1108909175, 1108878226, 1108847464, 1108816965, 1108786801, 1108757046, 1108727774, 1108699056, + 1108670963, 1108643567, 1108616936, 1108591139, 1108566243, 1108542312, 1108519412, 1108497603, 1108476946, + 1108457499, 1108439319, 1108422458, 1108406967, 1108392895, 1108380286, 1108369184, 1108359626, 1108351647, + 1108345281, 1108340553, 1108337489, 1108336107, 1108336422, 1108338446, 1108342183, 1108347636, 1108354799, + 1108363664, 1108374217, 1108386437, 1108400301, 1108415777, 1108432830, 1108451419, 1108471498, 1108493014, + 1108515912, 1108540129, 1108565598, 1108592247, 1108620001, 1108648779, 1108678497, 1108709066, 1108740395, + 1108772389, 1108804951, 1108837980, 1108871376, 1108905035, 1108938852, 1108972723, 1109006542, 1109040205, + 1109073607, 1109106645, 1109139216, 1109171221, 1109202563, 1109233147, 1109262880, 1109291675, 1109319447, + 1109346114, 1109371602, 1109395837, 1109418753, 1109440288, 1109460385, 1109478991, 1109496061, 1109511552, + 1109525430, 1109537663, 1109548227, 1109557101, 1109564272, 1109569731, 1109573473, 1109575498, 1109575814, + 1109574431, 1109571363, 1109566630, 1109560257, 1109552270, 1109542702, 1109531587, 1109518966, 1109504879, + 1109489374, 1109472496, 1109454299, 1109434835, 1109414161, 1109392335, 1109369417, 1109345469, 1109320555, + 1109294742, 1109268095, 1109240684, 1109212578, 1109183848, 1109154564, 1109124800, 1109094627, 1109064121, + 1109033354, 1109002402, 1108971338, -1108940237, -1108909175, -1108878226, -1108847464, -1108816965, -1108786801, + -1108757046, -1108727774, -1108699056, -1108670963, -1108643567, -1108616936, -1108591139, -1108566243, -1108542312, + -1108519412, -1108497603, -1108476946, -1108457499, -1108439319, -1108422458, -1108406967, -1108392895, -1108380286, + -1108369184, -1108359626, -1108351647, -1108345281, -1108340553, -1108337489, -1108336107, -1108336422, -1108338446, + -1108342183, -1108347636, -1108354799, -1108363664, -1108374217, -1108386437, -1108400301, -1108415777, -1108432830, + -1108451419, -1108471498, -1108493014, -1108515912, -1108540129, -1108565598, -1108592247, -1108620001, -1108648779, + -1108678497, -1108709066, -1108740395, -1108772389, -1108804951, -1108837980, -1108871376, -1108905035, -1108938852, + -1108972723, -1109006542, -1109040205, -1109073607, -1109106645, -1109139216, -1109171221, -1109202563, -1109233147, + -1109262880, -1109291675, -1109319447, -1109346114, -1109371602, -1109395837, -1109418753, -1109440288, -1109460385, + -1109478991, -1109496061, -1109511552, -1109525430, -1109537663, -1109548227, -1109557101, -1109564272, -1109569731, + -1109573473, -1109575498, -1109575814, -1109574431, -1109571363, -1109566630, -1109560257, -1109552270, -1109542702, + -1109531587, -1109518966, -1109504879, -1109489374, -1109472496, -1109454299, -1109434835, -1109414161, -1109392335, + -1109369417, -1109345469, -1109320555, -1109294742, -1109268095, -1109240684, -1109212578, -1109183848, -1109154564, + -1109124800, -1109094627, -1109064121, -1109033354, -1109002402, -1108971338, -1108940237, -1108909175, -1108878226, + -1108847464, -1108816965, -1108786801, -1108757046, -1108727774, -1108699056, -1108670963, -1108643567, -1108616936, + -1108591139, -1108566243, -1108542312, -1108519412, -1108497603, -1108476946, -1108457499, -1108439319, -1108422458, + -1108406967, -1108392895, -1108380286, -1108369184, -1108359626, -1108351647, -1108345281, -1108340553, -1108337489, + -1108336107, -1108336422, -1108338446, -1108342183, -1108347636, -1108354799, -1108363664, -1108374217, -1108386437, + -1108400301, -1108415777, -1108432830, -1108451419, -1108471498, -1108493014, -1108515912, -1108540129, -1108565598, + -1108592247, -1108620001, -1108648779, -1108678497, -1108709066, -1108740395, -1108772389, -1108804951, -1108837980, + -1108871376, -1108905035, -1108938852, -1108972682, -1109006261, -1109039351, -1109071571, -1109102407, -1109131162, + -1109156896, -1109178374, -1109193989, -1109201688, -1109198891, -1109182406, -1109148336, -1109091993, -1109007805, + -1108889225, -1108728643, -1108517302, -1108245211, -1107901063, -1107472158, -1106944320, -1106301824, -1105527310, + -1104601707, -1103504157, -1102211925, -1100700333, -1098942681, -1096910184, -1094571927, -1091894839, -1088843693, + -1085381150, -1081467851, -1077062556, -1072122362, -1066602975, -1060459071, -1053644721, -1046113898, -1037821043, + -1028721699, -1018773190, -1007935330, -996171157, -983447669, -969736537, -955014802, -939265519, -922478340, + -904650040, -885784954, -865895333, -845001612, -823132583, -800325469, -776625909, -752087844, -726773304, + -700752110, -674101477, -646905528, -619254721, -591245188, -562977986, -534558266, -506094363, -477696807, + -449477265, -421547413, -394017760, -366996430, -340587909, -314891801, -290001587, -266003441, -242975106, + -220984887, -200090776, -180339738, -161767200, -144396752, -128240072, -113297104, -99556455, -86996029, + -75583860, -65279122, -56033278, -47791333, -40493145, -34074759, -28469709, -23610284, -19428682, + -15858075, -12833534, -10292814, -8176993, -6430970, -5003818, -3849000, -2924474, -2192679, + -1620441, -1178790, -842729, -590941, -405483, -271445, -176613, -111130, -67168, + -38622, -20823, -10279, -4442, -1508, -229 }; +RAM_ALIGN const Word32 LowDelayShapes_n960_N960_HRA_2_5ms_IP[480] = { + 214, 718, 1564, 2887, 4850, 7655, 11549, 16828, 23847, + 33024, 44855, 59914, 78870, 102494, 131671, 167412, 210862, 263320, + 326247, 401279, 490246, 595184, 718349, 862234, 1029583, 1223409, 1447008, + 1703973, 1998212, 2333963, 2715805, 3148674, 3637878, 4189104, 4808432, 5502344, + 6277732, 7141903, 8102584, 9167924, 10346495, 11647288, 13079711, 14653577, 16379097, + 18266869, 20327854, 22573365, 25015043, 27664828, 30534935, 33637823, 36986159, 40592781, + 44470665, 48632874, 53092523, 57862728, 62956563, 68387004, 74166887, 80308851, 86825288, + 93728290, 101029595, 108740533, 116871978, 125434289, 134437259, 143890065, 153801219, 164178510, + 175028964, 186358792, 198173341, 210477054, 223273422, 236564945, 250353087, 264638241, 279419691, + 294695574, 310462852, 326717278, 343453367, 360664374, 378342268, 396477718, 415060072, 434077349, + 453516232, 473362064, 493598851, 514209273, 535174695, 556475190, 578089564, 599995393, 622169062, + 644585817, 667219821, 690044217, 713031208, 736152130, 759377547, 782677345, 806020840, 829376886, + 852713991, 876000447, 899204452, 922294246, 945238242, 968005170, 990564209, 1012885127, 1034938418, + 1056695435, 1078128516, 1099211112, 1119917901, 1140224902, 1160109567, 1179550884, 1198529445, 1217027528, + 1235029144, 1252520091, 1269487982, 1285922269, 1301814250, 1317157066, 1331945687, 1346176884, 1359849191, + 1372962859, 1385519797, 1397523511, 1408979025, 1419892807, 1430272680, 1440127732, 1449468226, 1458305498, + 1466651859, 1474520500, 1481925383, 1488881148, 1495403011, 1501506666, 1507208191, 1512523957, 1517470536, + 1522064619, 1526322933, 1530262165, 1533898889, 1537249499, 1540330149, 1543156689, 1545744622, 1548109049, + 1550264632, 1552225553, 1554005489, 1555617576, 1557074399, 1558387963, 1559569689, 1560630404, 1561580336, + 1562429115, 1563185777, 1563858772, 1564455973, 1564984695, 1565451702, 1565863235, 1566225027, 1566542325, + 1566819919, 1567062160, 1567272989, 1567455965, 1567614286, 1567750818, 1567868122, 1567968477, 1568053906, + 1568126199, 1568186936, 1568237509, 1568279142, 1568312908, 1568339752, 1568360503, 1568375889, 1568386553, + 1568393062, 1568395921, 1568395582, 1568392450, 1568386895, 1568379252, 1568369831, 1568358921, 1568346793, + 1568333699, 1568319881, 1568305568, 1568290979, 1568276322, 1568261795, 1568247587, 1568233876, 1568220830, + 1568208605, 1568197346, 1568187184, 1568178237, 1568170607, 1568164384, 1568159638, 1568156425, 1568154783, + 1568154732, 1568156276, 1568159400, 1568164071, 1568170240, 1568177841, 1568186791, 1568196993, 1568208336, + 1568220695, 1568233934, 1568247907, 1568262461, 1568277433, 1568292659, -1568307970, -1568323196, -1568338169, + -1568352723, -1568366698, -1568379938, -1568392298, -1568403642, -1568413846, -1568422797, -1568430399, -1568436568, + -1568441238, -1568444360, -1568445899, -1568445842, -1568444189, -1568440959, -1568436189, -1568429930, -1568422249, + -1568413227, -1568402961, -1568391555, -1568379128, -1568365802, -1568351710, -1568336985, -1568321763, -1568306179, + -1568290362, -1568274432, -1568258500, -1568242658, -1568226981, -1568211514, -1568196277, -1568181247, -1568166364, + -1568151514, -1568136526, -1568121163, -1568105112, -1568087973, -1568069251, -1568048342, -1568024520, -1567996924, + -1567964542, -1567926198, -1567880531, -1567825982, -1567760771, -1567682880, -1567590033, -1567479671, -1567348935, + -1567194644, -1567013268, -1566800908, -1566553276, -1566265667, -1565932945, -1565549513, -1565109302, -1564605744, + -1564031762, -1563379748, -1562641555, -1561808482, -1560871269, -1559820088, -1558644542, -1557333666, -1555875931, + -1554259255, -1552471010, -1550498044, -1548326699, -1545942840, -1543331880, -1540478822, -1537368293, -1533984594, + -1530311749, -1526333557, -1522033659, -1517395595, -1512402882, -1507039082, -1501287884, -1495133187, -1488559185, + -1481550459, -1474092069, -1466169648, -1457769502, -1448878707, -1439485206, -1429577913, -1419146803, -1408183016, + -1396678943, -1384628319, -1372026306, -1358869573, -1345156368, -1330886582, -1316061806, -1300685380, -1284762427, + -1268299884, -1251306514, -1233792909, -1215771486, -1197256464, -1178263828, -1158811290, -1138918228, -1118605615, + -1097895946, -1076813140, -1055382446, -1033630329, -1011584359, -989273085, -966725907, -943972946, -921044904, + -897972934, -874788497, -851523227, -828208798, -804876792, -781558570, -758285150, -735087092, -711994385, + -689036342, -666241506, -643637563, -621251256, -599108313, -577233388, -555649994, -534380464, -513445903, + -492866154, -472659775, -452844015, -433434798, -414446719, -395893041, -377785693, -360135279, -342951091, + -326241124, -310012090, -294269448, -279017421, -264259031, -249996126, -236229411, -222958488, -210181887, + -197897110, -186100669, -174788126, -163954142, -153592518, -143696242, -134257536, -125267909, -116718201, + -108598638, -100898882, -93608083, -86714933, -80207718, -74074369, -68302521, -62879558, -57792672, + -53028908, -48575221, -44418518, -40545711, -36943757, -33599707, -30500746, -27634227, -24987716, + -22549018, -20306212, -18247679, -16362124, -14638601, -13066533, -11635723, -10336374, -9159092, + -8094899, -7135237, -6271969, -5497377, -4804166, -4185453, -3634765, -3146030, -2713568, + -2332079, -1996632, -1702653, -1445912, -1222503, -1028839, -861625, -717855, -594786, + -489927, -401025, -326046, -263164, -210741, -167319, -131601, -102441, -78831, + -59886, -44835, -33011, -23837, -16822, -11545, -7652, -4848, -2886, + -1564, -718, -214 }; +RAM_ALIGN const Word32 LowDelayShapes_n960_N960_HRA_5ms_IP[840] = { + 76, 257, 559, 1032, 1734, 2736, 4127, 6013, 8519, + 11795, 16017, 21388, 28146, 36565, 46958, 59681, 75141, 93793, + 116154, 142798, 174368, 211576, 255213, 306147, 365337, 433830, 512771, + 603404, 707083, 825270, 959545, 1111607, 1283278, 1476512, 1693391, 1936135, + 2207099, 2508779, 2843816, 3214988, 3625222, 4077586, 4575292, 5121693, 5720282, + 6374686, 7088668, 7866117, 8711044, 9627575, 10619947, 11692493, 12849640, 14095892, + 15435823, 16874063, 18415286, 20064193, 21825499, 23703917, 25704138, 27830817, 30088554, + 32481870, 35015193, 37692833, 40518962, 43497594, 46632560, 49927486, 53385775, 57010578, + 60804774, 64770951, 68911378, 73227988, 77722354, 82395670, 87248734, 92281923, 97495181, + 102888003, 108459414, 114207966, 120131717, 126228227, 132494547, 138927218, 145522261, 152275182, + 159180971, 166234104, 173428552, 180757788, 188214801, 195792105, 203481764, 211275403, 219164235, + 227139085, 235190416, 243308359, 251482745, 259703138, 267958873, 276239090, 284532776, 292828806, + 301115982, 309383080, 317618887, 325812253, 333952128, 342027608, 350027981, 357942764, 365761752, + 373475051, 381073123, 388546818, 395887478, 403086861, 410137202, 417031278, 423762414, 430324505, + 436712040, 442920115, 448944445, 454781381, 460427907, 465881653, 471140887, 476204517, 481072084, + 485743749, 490220286, 494503064, 498594029, 502495687, 506211078, 509743756, 513097759, 516277584, + 519288161, 522134817, 524823252, 527359505, 529749922, 532001128, 534119994, 536113606, 537989238, + 539754317, 541416403, 542983151, 544462298, 545861626, 547188947, 548452077, 549658817, 550816937, + 551934153, 553018114, 554076391, 555116460, 556145691, 557171340, 558200539, 559240287, 560297445, + 561378728, 562490702, 563639778, 564832206, 566074075, 567371305, 568729649, 570154682, 571651805, + 573226236, 574883010, 576626970, 578462769, 580394858, 582427488, 584564698, 586810313, 589167940, + 591640954, 594232500, 596945481, 599782552, 602746115, 605838312, 609061015, 612415825, 615904060, + 619526756, 623284658, 627178213, 631207574, 635372590, 639672804, 644107457, 648675483, 653375510, + 658205862, 663164563, 668249336, 673457615, 678786542, 684232980, 689793518, 695464480, 701241935, + 707121707, 713099387, 719170342, 725329733, 731572527, 737893509, 744287298, 750748363, 757271038, + 763849540, 770477982, 777150393, 783860731, 790602903, 797370781, 804158216, 810959059, 817767172, + 824576448, 831380824, 838174297, 844950938, 851704905, 858430460, 865121975, 871773953, 878381029, + 884937988, 891439772, 897881487, 904258415, 910566018, 916799945, 922956036, 929030332, 935019072, + 940918701, 946725867, 952437431, 958050459, 963562228, 968970222, 974272134, 979465863, 984549513, + 989521388, 994379992, 999124027, 1003752385, 1008264148, 1012658583, 1016935141, 1021093445, 1025133296, + 1029054661, 1032857672, 1036542620, 1040109952, 1043560268, 1046894310, 1050112965, 1053217256, 1056208338, + 1059087494, 1061856131, 1064515771, 1067068050, 1069514712, 1071857603, 1074098665, 1076239931, 1078283519, + 1080231627, 1082086525, 1083850551, 1085526101, 1087115629, 1088621631, 1090046648, 1091393252, 1092664044, + 1093861644, 1094988685, 1096047808, 1097041655, 1097972860, 1098844046, 1099657818, 1100416756, 1101123410, + 1101780297, 1102389891, 1102954625, 1103476879, 1103958984, 1104403212, 1104811774, 1105186822, 1105530438, + 1105844638, 1106131370, 1106392508, 1106629854, 1106845137, 1107040012, 1107216060, 1107374784, 1107517617, + 1107645915, 1107760961, 1107863967, 1107956073, 1108038347, 1108111792, 1108177340, 1108235860, 1108288159, + 1108334979, 1108377006, 1108414868, 1108449137, 1108480336, 1108508935, 1108535359, 1108559986, 1108583153, + 1108605158, 1108626260, 1108646685, 1108666625, 1108686243, 1108705675, 1108725031, 1108744398, 1108763843, + 1108783413, 1108803139, 1108823037, 1108843110, 1108863348, 1108883733, 1108904238, 1108924827, 1108945461, + 1108966087, 1108986655, 1109007132, 1109027458, 1109047572, 1109067415, 1109086928, 1109106055, 1109124739, + 1109142927, 1109160566, 1109177606, 1109193997, 1109209694, 1109224653, 1109238833, 1109252194, 1109264701, + 1109276321, 1109287024, 1109296781, 1109305569, 1109313366, 1109320154, 1109325918, 1109330645, 1109334328, + 1109336959, 1109338535, 1109339057, 1109338528, 1109336954, 1109334342, 1109330704, 1109326055, 1109320411, + 1109313791, 1109306216, 1109297711, 1109288301, 1109278014, 1109266881, 1109254934, 1109242206, 1109228734, + 1109214554, 1109199706, 1109184228, 1109168164, 1109151555, 1109134445, 1109116879, 1109098903, 1109080563, + 1109061906, 1109042980, 1109023833, 1109004515, 1108985073, 1108965557, 1108946017, 1108926503, 1108907062, + 1108887746, 1108868601, 1108849679, 1108831026, 1108812690, 1108794719, 1108777158, 1108760054, 1108743451, + 1108727393, 1108711923, 1108697081, 1108682908, 1108669442, 1108656721, 1108644781, 1108633654, 1108623374, + 1108613969, 1108605469, 1108597899, 1108591283, 1108585643, 1108580997, 1108577362, 1108574752, 1108573178, + 1108572650, 1108573172, 1108574747, 1108577376, 1108581056, 1108585780, 1108591541, 1108598324, 1108606116, + 1108614899, 1108624650, 1108635346, 1108646959, 1108659460, 1108672814, 1108686987, 1108701939, 1108717629, + 1108734013, 1108751046, 1108768679, 1108786861, 1108805540, 1108824662, 1108844171, 1108864011, 1108884121, + 1108904445, 1108924921, 1108945488, -1108966087, -1108986655, -1109007132, -1109027458, -1109047572, -1109067415, + -1109086928, -1109106055, -1109124739, -1109142927, -1109160566, -1109177606, -1109193997, -1109209694, -1109224653, + -1109238833, -1109252194, -1109264701, -1109276321, -1109287024, -1109296781, -1109305569, -1109313366, -1109320154, + -1109325918, -1109330645, -1109334328, -1109336959, -1109338535, -1109339057, -1109338528, -1109336954, -1109334342, + -1109330704, -1109326055, -1109320411, -1109313791, -1109306216, -1109297711, -1109288301, -1109278014, -1109266881, + -1109254934, -1109242206, -1109228734, -1109214554, -1109199706, -1109184228, -1109168164, -1109151555, -1109134445, + -1109116879, -1109098903, -1109080563, -1109061906, -1109042980, -1109023833, -1109004515, -1108985073, -1108965557, + -1108946017, -1108926503, -1108907062, -1108887746, -1108868601, -1108849679, -1108831026, -1108812690, -1108794719, + -1108777158, -1108760054, -1108743451, -1108727393, -1108711923, -1108697081, -1108682908, -1108669442, -1108656721, + -1108644781, -1108633654, -1108623374, -1108613969, -1108605469, -1108597899, -1108591283, -1108585643, -1108580997, + -1108577362, -1108574752, -1108573178, -1108572650, -1108573172, -1108574747, -1108577376, -1108581056, -1108585780, + -1108591541, -1108598324, -1108606116, -1108614899, -1108624650, -1108635346, -1108646959, -1108659460, -1108672814, + -1108686987, -1108701939, -1108717629, -1108734013, -1108751046, -1108768679, -1108786861, -1108805540, -1108824662, + -1108844171, -1108864011, -1108884121, -1108904445, -1108924921, -1108945488, -1108966059, -1108986562, -1109006925, + -1109027070, -1109046909, -1109066353, -1109085302, -1109103653, -1109121290, -1109138090, -1109153916, -1109168619, + -1109182038, -1109193990, -1109204280, -1109212687, -1109218972, -1109222869, -1109224086, -1109222302, -1109217164, + -1109208286, -1109195243, -1109177572, -1109154771, -1109126288, -1109091528, -1109049845, -1109000541, -1108942861, + -1108875994, -1108799068, -1108711146, -1108611228, -1108498242, -1108371047, -1108228427, -1108069090, -1107891663, + -1107694692, -1107476636, -1107235870, -1106970675, -1106679239, -1106359654, -1106009912, -1105627904, -1105211414, + -1104758117, -1104265576, -1103731240, -1103152437, -1102526375, -1101850136, -1101120673, -1100334807, -1099489225, + -1098580473, -1097604958, -1096558943, -1095438542, -1094239723, -1092958302, -1091589944, -1090130161, -1088574313, + -1086917606, -1085155099, -1083281700, -1081292171, -1079181138, -1076943086, -1074572374, -1072063243, -1069409818, + -1066606126, -1063646105, -1060523618, -1057232468, -1053766415, -1050119192, -1046284528, -1042256165, -1038027882, + -1033593517, -1028946994, -1024082345, -1018993738, -1013675503, -1008122162, -1002328454, -996289366, -990000160, + -983456402, -976653990, -969589182, -962258626, -954659381, -946788949, -938645296, -930226877, -921532657, + -912562133, -903315354, -893792938, -883996084, -873926592, -863586870, -852979945, -842109472, -830979735, + -819595655, -807962787, -796087320, -783976072, -771636483, -759076610, -746305110, -733331233, -720164799, + -706816188, -693296313, -679616605, -665788980, -651825820, -637739943, -623544570, -609253297, -594880059, + -580439096, -565944918, -551412265, -536856066, -522291404, -507733472, -493197528, -478698857, -464252725, + -449874333, -435578778, -421381001, -407295749, -393337528, -379520558, -365858731, -352365567, -339054174, + -325937207, -313026827, -300334664, -287871784, -275648653, -263675105, -251960314, -240512770, -229340251, + -218449809, -207847746, -197539607, -187530166, -177823422, -168422593, -159330123, -150547678, -142076164, + -133915731, -126065794, -118525050, -111291498, -104362470, -97734652, -91404122, -85366377, -79616373, + -74148557, -68956911, -64034986, -59375949, -54972617, -50817502, -46902854, -43220698, -39762875, + -36521086, -33486923, -30651913, -28007548, -25545325, -23256770, -21133479, -19167136, -17349546, + -15672656, -14128580, -12709614, -11408260, -10217235, -9129491, -8138220, -7236869, -6419144, + -5679019, -5010736, -4408811, -3868031, -3383459, -2950426, -2564532, -2221640, -1917871, + -1649598, -1413439, -1206249, -1025112, -867332, -730423, -612103, -510279, -423042, + -348652, -285533, -232260, -187551, -150254, -119343, -93901, -73120, -56285, + -42770, -32029, -23588, -17037, -12025, -8254, -5472, -3467, -2064, + -1119, -513, -153 }; +RAM_ALIGN const Word32 LowDelayShapes_n960_N960_HRA_IP[1560] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 175, 382, + 705, 1185, 1871, 2823, 4114, 5831, 8077, 10972, 14660, + 19303, 25092, 32244, 41009, 51670, 64545, 79996, 98427, 120290, + 146088, 176379, 211778, 252965, 300685, 355753, 419058, 491567, 574329, + 668476, 775231, 895906, 1031911, 1184750, 1356028, 1547453, 1760836, 1998091, + 2261242, 2552417, 2873848, 3227877, 3616948, 4043606, 4510498, 5020366, 5576047, + 6180463, 6836620, 7547602, 8316559, 9146706, 10041310, 11003683, 12037172, 13145144, + 14330983, 15598071, 16949778, 18389446, 19920381, 21545832, 23268982, 25092926, 27020662, + 29055072, 31198906, 33454766, 35825091, 38312140, 40917976, 43644450, 46493186, 49465569, + 52562726, 55785514, 59134509, 62609992, 66211939, 69940008, 73793535, 77771521, 81872629, + 86095178, 90437137, 94896125, 99469410, 104153908, 108946186, 113842469, 118838639, 123930249, + 129112527, 134380390, 139728454, 145151046, 150642225, 156195792, 161805313, 167464136, 173165413, + 178902121, 184667086, 190453005, 196252476, 202058015, 207862090, 213657145, 219435626, 225190009, + 230912827, 236596697, 242234348, 247818648, 253342624, 258799497, 264182697, 269485893, 274703012, + 279828312, 284856314, 289781856, 294600125, 299306665, 303897390, 308368599, 312716983, 316939635, + 321034059, 324998175, 328830319, 332529248, 336094136, 339524575, 342820570, 345982531, 349011267, + 351907976, 354674236, 357311989, 359823531, 362211496, 364478840, 366628822, 368664989, 370591159, + 372411396, 374129997, 375751467, 377280502, 378721970, 380080887, 381362400, 382571769, 383714343, + 384795547, 385820862, 386795806, 387725921, 388616754, 389473844, 390302710, 391108835, 391897652, + 392674541, 393444809, 394213686, 394986316, 395767747, 396562926, 397376691, 398213764, 399078748, + 399976120, 400910228, 401885285, 402905364, 403974398, 405096172, 406274322, 407512329, 408813519, + 410181054, 411617935, 413126993, 414710888, 416372104, 418112946, 419935539, 421841819, 423833534, + 425912241, 428079300, 430335872, 432682921, 435121205, 437651278, 440273491, 442987985, 445794697, + 448693355, 451683483, 454764399, 457935219, 461194860, 464542039, 467975283, 471492928, 475093126, + 478773851, 482532904, 486367920, 490276375, 494255591, 498302751, 502414896, 506588946, 510821698, + 515109841, 519449966, 523838572, 528272075, 532746823, 537259100, 541805139, 546381131, 550983233, + 555607579, 560250290, 564907481, 569575271, 574249791, 578927195, 583603665, 588275420, 592938724, + 597589893, 602225302, 606841390, 611434670, 616001729, 620539240, 625043960, 629512740, 633942527, + 638330370, 642673418, 646968929, 651214270, 655406919, 659544468, 663624624, 667645211, 671604169, + 675499557, 679329551, 683092449, 686786663, 690410727, 693963289, 697443117, 700849092, 704180212, + 707435589, 710614445, 713716116, 716740046, 719685788, 722553001, 725341451, 728051005, 730681634, + 733233409, 735706498, 738101168, 740417780, 742656787, 744818734, 746904257, 748914076, 750848997, + 752709910, 754497783, 756213660, 757858664, 759433984, 760940881, 762380680, 763754766, 765064584, + 766311629, 767497450, 768623637, 769691823, 770703677, 771660899, 772565218, 773418381, 774222155, + 774978320, 775688661, 776354967, 776979026, 777562617, 778107510, 778615459, 779088198, 779527438, + 779934863, 780312126, 780660846, 780982606, 781278948, 781551373, 781801337, 782030250, 782239474, + 782430322, 782604056, 782761888, 782904976, 783034427, 783151295, 783256582, 783351237, 783436158, + 783512191, 783580133, 783640729, 783694677, 783742630, 783785193, 783822926, 783856349, 783885939, + 783912134, 783935335, 783955909, 783974185, 783990464, 784005015, 784018080, 784029874, 784040589, + 784050394, 784059435, 784067843, 784075728, 784083188, 784090303, 784097145, 784103769, 784110225, + 784116552, 784122782, 784128939, 784135042, 784141107, 784147142, 784153152, 784159138, 784165118, + 784171086, 784177037, 784182968, 784188874, 784194749, 784200591, 784206393, 784212151, 784217862, + 784223520, 784229122, 784234663, 784240139, 784245546, 784250879, 784256136, 784261311, 784266402, + 784271403, 784276313, 784281126, 784285841, 784290452, 784294958, 784299354, 784303638, 784307807, + 784311858, 784315788, 784319595, 784323276, 784326828, 784330250, 784333539, 784336693, 784339710, + 784342589, 784345327, 784347923, 784350376, 784352685, 784354847, 784356862, 784358729, 784360447, + 784362016, 784363434, 784364702, 784365818, 784366783, 784367596, 784368257, 784368766, 784369124, + 784369331, 784369387, 784369292, 784369047, 784368653, 784368111, 784367421, 784366584, 784365602, + 784364475, 784363205, 784361793, 784360241, 784358550, 784356721, 784354756, 784352657, 784350426, + 784348065, 784345575, 784342958, 784340217, 784337354, 784334371, 784331270, 784328053, 784324723, + 784321282, 784317734, 784314079, 784310321, 784306463, 784302507, 784298456, 784294312, 784290078, + 784285758, 784281354, 784276869, 784272306, 784267667, 784262957, 784258177, 784253332, 784248423, + 784243454, 784238429, 784233349, 784228220, 784223043, 784217822, 784212560, 784207260, 784201926, + 784196560, 784191167, 784185749, 784180310, 784174852, 784169380, 784163896, 784158404, 784152907, + 784147408, 784141911, 784136419, 784130935, 784125463, 784120006, 784114567, 784109150, 784103757, + 784098392, 784093059, 784087760, 784082499, 784077278, 784072102, 784066974, 784061896, 784056872, + 784051904, 784046997, 784042152, 784037374, 784032665, 784028028, 784023466, 784018982, 784014580, + 784010261, 784006029, 784001887, 783997837, 783993883, 783990026, 783986270, 783982617, 783979069, + 783975630, 783972302, 783969087, 783965987, 783963005, 783960143, 783957404, 783954788, 783952300, + 783949939, 783947709, 783945612, 783943648, 783941820, 783940130, 783938578, 783937167, 783935898, + 783934772, 783933790, 783932954, 783932264, 783931722, 783931328, 783931084, 783930989, 783931045, + 783931251, 783931609, 783932118, 783932779, 783933592, 783934556, 783935672, 783936938, 783938356, + 783939924, 783941641, 783943507, 783945521, 783947682, 783949989, 783952441, 783955036, 783957773, + 783960650, 783963666, 783966818, 783970106, 783973526, 783977077, 783980756, 783984561, 783988490, + 783992539, 783996706, 784000989, 784005383, 784009887, 784014497, 784019210, 784024022, 784028930, + 784033930, 784039019, 784044193, 784049448, 784054780, 784060186, 784065661, 784071201, 784076801, + 784082459, 784088168, 784093926, 784099727, 784105568, 784111443, 784117348, 784123278, 784129229, + 784135197, 784141176, 784147163, 784153152, 784159138, 784165118, 784171086, 784177037, 784182968, + 784188874, 784194749, 784200591, 784206393, 784212151, 784217862, 784223520, 784229122, 784234663, + 784240139, 784245546, 784250879, 784256136, 784261311, 784266402, 784271403, 784276313, 784281126, + 784285841, 784290452, 784294958, 784299354, 784303638, 784307807, 784311858, 784315788, 784319595, + 784323276, 784326828, 784330250, 784333539, 784336693, 784339710, 784342589, 784345327, 784347923, + 784350376, 784352685, 784354847, 784356862, 784358729, 784360447, 784362016, 784363434, 784364702, + 784365818, 784366783, 784367596, 784368257, 784368766, 784369124, 784369331, 784369387, 784369292, + 784369047, 784368653, 784368111, 784367421, 784366584, 784365602, 784364475, 784363205, 784361793, + 784360241, 784358550, 784356721, 784354756, 784352657, 784350426, 784348065, 784345575, 784342958, + 784340217, 784337354, 784334371, 784331270, 784328053, 784324723, 784321282, 784317734, 784314079, + 784310321, 784306463, 784302507, 784298456, 784294312, 784290078, 784285758, 784281354, 784276869, + 784272306, 784267667, 784262957, 784258177, 784253332, 784248423, 784243454, 784238429, 784233349, + 784228220, 784223043, 784217822, 784212560, 784207260, 784201926, 784196560, 784191167, 784185749, + 784180310, 784174852, 784169380, 784163896, 784158404, 784152907, -784147408, -784141911, -784136419, + -784130935, -784125463, -784120006, -784114567, -784109150, -784103757, -784098392, -784093059, -784087760, + -784082499, -784077278, -784072102, -784066974, -784061896, -784056872, -784051904, -784046997, -784042152, + -784037374, -784032665, -784028028, -784023466, -784018982, -784014580, -784010261, -784006029, -784001887, + -783997837, -783993883, -783990026, -783986270, -783982617, -783979069, -783975630, -783972302, -783969087, + -783965987, -783963005, -783960143, -783957404, -783954788, -783952300, -783949939, -783947709, -783945612, + -783943648, -783941820, -783940130, -783938578, -783937167, -783935898, -783934772, -783933790, -783932954, + -783932264, -783931722, -783931328, -783931084, -783930989, -783931045, -783931251, -783931609, -783932118, + -783932779, -783933592, -783934556, -783935672, -783936938, -783938356, -783939924, -783941641, -783943507, + -783945521, -783947682, -783949989, -783952441, -783955036, -783957773, -783960650, -783963666, -783966818, + -783970106, -783973526, -783977077, -783980756, -783984561, -783988490, -783992539, -783996706, -784000989, + -784005383, -784009887, -784014497, -784019210, -784024022, -784028930, -784033930, -784039019, -784044193, + -784049448, -784054780, -784060186, -784065661, -784071201, -784076801, -784082459, -784088168, -784093926, + -784099727, -784105568, -784111443, -784117348, -784123278, -784129229, -784135197, -784141176, -784147163, + -784153152, -784159138, -784165118, -784171086, -784177037, -784182968, -784188874, -784194749, -784200591, + -784206393, -784212151, -784217862, -784223520, -784229122, -784234663, -784240139, -784245546, -784250879, + -784256136, -784261311, -784266402, -784271403, -784276313, -784281126, -784285841, -784290452, -784294958, + -784299354, -784303638, -784307807, -784311858, -784315788, -784319595, -784323276, -784326828, -784330250, + -784333539, -784336693, -784339710, -784342589, -784345327, -784347923, -784350376, -784352685, -784354847, + -784356862, -784358729, -784360447, -784362016, -784363434, -784364702, -784365818, -784366783, -784367596, + -784368257, -784368766, -784369124, -784369331, -784369387, -784369292, -784369047, -784368653, -784368111, + -784367421, -784366584, -784365602, -784364475, -784363205, -784361793, -784360241, -784358550, -784356721, + -784354756, -784352657, -784350426, -784348065, -784345575, -784342958, -784340217, -784337354, -784334371, + -784331270, -784328053, -784324723, -784321282, -784317734, -784314079, -784310321, -784306463, -784302507, + -784298456, -784294312, -784290078, -784285758, -784281354, -784276869, -784272306, -784267667, -784262957, + -784258177, -784253332, -784248423, -784243454, -784238429, -784233349, -784228220, -784223043, -784217822, + -784212560, -784207260, -784201926, -784196560, -784191167, -784185749, -784180310, -784174852, -784169380, + -784163896, -784158404, -784152907, -784147408, -784141911, -784136419, -784130935, -784125463, -784120006, + -784114567, -784109150, -784103757, -784098392, -784093059, -784087760, -784082499, -784077278, -784072102, + -784066974, -784061896, -784056872, -784051904, -784046997, -784042152, -784037374, -784032665, -784028028, + -784023466, -784018982, -784014580, -784010261, -784006029, -784001887, -783997837, -783993883, -783990026, + -783986270, -783982617, -783979069, -783975630, -783972302, -783969087, -783965987, -783963005, -783960143, + -783957404, -783954788, -783952300, -783949939, -783947709, -783945612, -783943648, -783941820, -783940130, + -783938578, -783937167, -783935898, -783934772, -783933790, -783932954, -783932264, -783931722, -783931328, + -783931084, -783930989, -783931045, -783931251, -783931609, -783932118, -783932779, -783933592, -783934556, + -783935672, -783936938, -783938356, -783939924, -783941641, -783943507, -783945521, -783947682, -783949989, + -783952441, -783955036, -783957773, -783960650, -783963666, -783966818, -783970106, -783973526, -783977077, + -783980756, -783984561, -783988490, -783992539, -783996706, -784000989, -784005383, -784009887, -784014497, + -784019210, -784024022, -784028930, -784033930, -784039019, -784044193, -784049448, -784054780, -784060186, + -784065661, -784071201, -784076801, -784082459, -784088168, -784093926, -784099727, -784105568, -784111443, + -784117348, -784123278, -784129229, -784135197, -784141176, -784147163, -784153131, -784159068, -784164963, + -784170795, -784176541, -784182173, -784187657, -784192951, -784198007, -784202769, -784207169, -784211130, + -784214559, -784217353, -784219391, -784220535, -784220630, -784219497, -784216937, -784212727, -784206617, + -784198327, -784187551, -784173947, -784157141, -784136723, -784112243, -784083213, -784049101, -784009333, + -783963287, -783910294, -783849634, -783780538, -783702180, -783613679, -783514100, -783402445, -783277658, + -783138617, -782984141, -782812977, -782623808, -782415247, -782185834, -781934039, -781658253, -781356794, + -781027899, -780669728, -780280356, -779857776, -779399894, -778904531, -778369419, -777792197, -777170416, + -776501532, -775782908, -775011810, -774185411, -773300787, -772354919, -771344691, -770266894, -769118226, + -767895293, -766594614, -765212620, -763745664, -762190019, -760541889, -758797411, -756952664, -755003678, + -752946440, -750776904, -748491005, -746084664, -743553805, -740894366, -738102311, -735173645, -732104432, + -728890802, -725528974, -722015270, -718346128, -714518120, -710527972, -706372573, -702048997, -697554517, + -692886621, -688043026, -683021694, -677820848, -672438982, -666874876, -661127608, -655196568, -649081463, + -642782332, -636299553, -629633851, -622786302, -615758346, -608551783, -601168786, -593611894, -585884022, + -577988458, -569928861, -561709265, -553334069, -544808041, -536136306, -527324347, -518377994, -509303418, + -500107123, -490795932, -481376983, -471857712, -462245842, -452549370, -442776550, -432935882, -423036090, + -413086109, -403095064, -393072251, -383027119, -372969246, -362908319, -352854112, -342816459, -332805234, + -322830326, -312901609, -303028921, -293222034, -283490629, -273844269, -264292369, -254844170, -245508712, + -236294804, -227211000, -218265568, -209466468, -200821323, -192337394, -184021561, -175880295, -167919639, + -160145191, -152562081, -145174961, -137987988, -131004813, -124228572, -117661879, -111306824, -105164969, + -99237348, -93524475, -88026347, -82742454, -77671790, -72812867, -68163733, -63721988, -59484805, + -55448955, -51610827, -47966456, -44511550, -41241516, -38151492, -35236370, -32490831, -29909374, + -27486341, -25215951, -23092326, -21109518, -19261540, -17542387, -15946062, -14466601, -13098096, + -11834709, -10670701, -9600439, -8618419, -7719279, -6897809, -6148962, -5467868, -4849835, + -4290361, -3785136, -3330046, -2921175, -2554807, -2227423, -1935704, -1676526, -1446955, + -1244248, -1065844, -909363, -772594, -653495, -550182, -460924, -384136, -318370, + -262309, -214759, -174641, -140984, -112917, -89663, -70531, -54908, -42257, + -32104, -24037, -17698, -12781, -9020, -6190, -4103, -2600, -1548, + -839, -385, -115 }; +#endif /* ENABLE_HR_MODE */ + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word32 *const LowDelayShapes_n960_HRA_2_5ms[2] = { LowDelayShapes_n960_N480_HRA_2_5ms_IP, + LowDelayShapes_n960_N960_HRA_2_5ms_IP }; + +RAM_ALIGN const Word32 *const LowDelayShapes_n960_HRA_5ms[2] = { LowDelayShapes_n960_N480_HRA_5ms_IP, + LowDelayShapes_n960_N960_HRA_5ms_IP }; + +RAM_ALIGN const Word32 *const LowDelayShapes_n960_HRA[2] = { LowDelayShapes_n960_N480_HRA_IP, + LowDelayShapes_n960_N960_HRA_IP }; + +RAM_ALIGN const Word32 *const LowDelayShapes_n960_HRA_7_5ms[2] = { LowDelayShapes_n960_N480_HRA_7_5ms_IP, + LowDelayShapes_n960_N960_HRA_7_5ms_IP }; +#endif /* ENABLE_HR_MODE */ + +RAM_ALIGN const Word16 pitch_max[5] = {MAX_PITCH_8K, MAX_PITCH_16K, MAX_PITCH_24K, MAX_PITCH_32K, MAX_PITCH_48K}; +RAM_ALIGN const Word16 plc_preemph_fac[NUM_SAMP_FREQ] = {20316, 23592, 26869, 30146, 30146 +#ifdef ENABLE_HR_MODE + , 30146 +#endif + }; +/* high pass filter Q15 */ +RAM_ALIGN const Word16 TDC_high_16[11] = {(Word16)0x0000, (Word16)0xfd60, (Word16)0xf7ab, (Word16)0xefec, + (Word16)0xe910, (Word16)0x66c2, (Word16)0xe910, (Word16)0xefec, + (Word16)0xf7ab, (Word16)0xfd60, (Word16)0x0000}; + +RAM_ALIGN const Word16 TDC_high_32[11] = {(Word16)0xf962, (Word16)0xf87d, (Word16)0xf581, (Word16)0xf2e5, + (Word16)0xf11a, (Word16)0x7076, (Word16)0xf11a, (Word16)0xf2e5, + (Word16)0xf581, (Word16)0xf87d, (Word16)0xf962}; + +RAM_ALIGN const Word16 TDC_high_16_harm[11] = {(Word16) 174, (Word16) 0, (Word16) -1442, (Word16) 0, + (Word16) 8641, (Word16) 18022, (Word16) 8641, (Word16) 0, + (Word16) -1442, (Word16) 0, (Word16) 174}; + +RAM_ALIGN const Word16 TDC_high_32_harm[11] = {(Word16) -174, (Word16) -121, (Word16) -459, (Word16) 590, + (Word16) 8743, (Word16) 16355, (Word16) 8743, (Word16) 590, + (Word16) -459, (Word16) -121, (Word16) -174}; + + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 LowDelayShapes_n960_N80[130] = { + -15, -43, -94, -171, -277, -414, -580, -771, -981, -1201, -1423, -1638, -1836, + -2008, -2145, -2240, -2286, -2279, -2214, -2085, -1889, -1621, -1274, -842, -318, 305, + 1034, 1876, 2833, 3906, 5091, 6379, 7754, 9198, 10683, 12179, 13652, 15068, 16390, + 17588, 18634, 19509, 20201, 20712, 21051, 21237, 21297, 21263, 21168, 21044, 20918, 20797, + 20701, 20627, 20571, 20529, 20499, 20479, 20468, 20463, 20464, 20469, 20477, 20486, 20495, + 20503, 20509, 20514, 20516, 20518, 20520, 20524, 20530, 20540, 20556, 20576, 20602, 20633, + 20668, 20705, -20743, -20781, -20816, -20847, -20873, -20894, -20910, -20920, -20927, -20930, -20932, + -20934, -20937, -20942, -20948, -20956, -20966, -20975, -20982, -20988, -20989, -20984, -20972, -20952, + -20921, -20879, -20822, -20747, -20652, -20532, -20359, -20121, -19785, -19318, -18689, -17873, -16855, + -15636, -14231, -12670, -10997, -9266, -7542, -5889, -4373, -3051, -1965, -1136, -560, -207}; +#else +#define LowDelayShapes_n960_N80 NULL +#endif + +#ifdef SUBSET_WB +RAM_ALIGN const Word16 LowDelayShapes_n960_N160[260] = { + -14, -29, -49, -76, -112, -156, -210, -275, -350, -437, -534, -641, -759, -885, + -1020, -1163, -1311, -1464, -1620, -1777, -1935, -2090, -2242, -2390, -2530, -2661, -2783, -2893, + -2990, -3073, -3140, -3191, -3224, -3238, -3233, -3208, -3162, -3094, -3003, -2889, -2751, -2587, + -2397, -2180, -1935, -1661, -1355, -1018, -648, -244, 197, 674, 1190, 1745, 2340, 2976, + 3652, 4370, 5129, 5928, 6766, 7642, 8553, 9496, 10470, 11469, 12490, 13529, 14579, 15637, + 16696, 17750, 18792, 19817, 20819, 21791, 22727, 23621, 24469, 25264, 26004, 26685, 27304, 27858, + 28348, 28773, 29134, 29433, 29672, 29855, 29986, 30070, 30112, 30117, 30092, 30043, 29976, 29895, + 29807, 29716, 29632, 29536, 29451, 29374, 29307, 29247, 29195, 29149, 29109, 29075, 29045, 29020, + 28999, 28982, 28968, 28957, 28949, 28943, 28940, 28939, 28940, 28942, 28946, 28950, 28956, 28962, + 28968, 28975, 28981, 28987, 28993, 28998, 29002, 29006, 29009, 29012, 29014, 29015, 29017, 29018, + 29019, 29021, 29024, 29027, 29031, 29037, 29044, 29053, 29064, 29077, 29091, 29108, 29126, 29146, + 29168, 29192, 29216, 29242, 29268, 29295, -29322, -29349, -29376, -29401, -29426, -29450, -29472, -29492, + -29511, -29527, -29542, -29555, -29566, -29575, -29583, -29589, -29593, -29596, -29599, -29601, -29602, -29603, + -29605, -29606, -29608, -29611, -29614, -29618, -29623, -29628, -29634, -29640, -29646, -29653, -29660, -29666, + -29671, -29676, -29680, -29682, -29683, -29682, -29678, -29673, -29664, -29653, -29639, -29621, -29600, -29574, + -29544, -29509, -29469, -29423, -29370, -29310, -29243, -29167, -29083, -28988, -28861, -28718, -28551, -28351, + -28114, -27834, -27505, -27121, -26677, -26168, -25591, -24943, -24223, -23431, -22569, -21639, -20644, -19592, + -18487, -17338, -16154, -14944, -13719, -12491, -11270, -10068, -8898, -7771, -6698, -5689, -4753, -3898, + -3130, -2452, -1866, -1371, -964, -640, -392, -198}; +#else +#define LowDelayShapes_n960_N160 NULL +#endif +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 LowDelayShapes_n960_N240[390] = { + -9, -17, -26, -37, -50, -66, -86, -108, -134, -164, -197, -234, -275, -320, + -369, -422, -479, -539, -603, -670, -741, -814, -891, -969, -1050, -1132, -1216, -1301, + -1387, -1473, -1558, -1643, -1728, -1810, -1892, -1971, -2047, -2120, -2190, -2256, -2318, -2376, + -2429, -2477, -2519, -2556, -2586, -2611, -2629, -2640, -2645, -2642, -2632, -2614, -2589, -2556, + -2515, -2466, -2408, -2341, -2266, -2182, -2088, -1985, -1872, -1748, -1615, -1471, -1316, -1150, + -972, -783, -582, -368, -141, 99, 352, 619, 899, 1194, 1503, 1827, 2166, 2519, + 2888, 3271, 3669, 4082, 4510, 4952, 5408, 5878, 6362, 6857, 7365, 7885, 8414, 8954, + 9502, 10058, 10621, 11189, 11761, 12335, 12912, 13488, 14063, 14635, 15203, 15764, 16319, 16864, + 17399, 17922, 18431, 18926, 19405, 19866, 20309, 20732, 21135, 21517, 21876, 22213, 22526, 22817, + 23083, 23326, 23546, 23743, 23916, 24068, 24198, 24308, 24397, 24469, 24522, 24560, 24582, 24592, + 24589, 24575, 24552, 24522, 24485, 24443, 24398, 24349, 24300, 24252, 24209, 24155, 24104, 24058, + 24014, 23974, 23938, 23904, 23873, 23844, 23818, 23794, 23773, 23753, 23735, 23719, 23705, 23692, + 23681, 23670, 23662, 23654, 23647, 23642, 23638, 23634, 23632, 23630, 23629, 23629, 23629, 23630, + 23632, 23634, 23636, 23639, 23642, 23645, 23648, 23652, 23655, 23658, 23662, 23665, 23669, 23672, + 23674, 23677, 23680, 23682, 23684, 23686, 23687, 23688, 23689, 23690, 23691, 23692, 23693, 23693, + 23694, 23695, 23696, 23697, 23699, 23701, 23703, 23706, 23710, 23714, 23718, 23723, 23729, 23736, + 23743, 23751, 23760, 23769, 23779, 23790, 23801, 23813, 23825, 23838, 23851, 23865, 23879, 23894, + 23908, 23923, -23938, -23952, -23967, -23981, -23996, -24010, -24023, -24036, -24049, -24061, -24072, -24083, + -24093, -24102, -24111, -24119, -24127, -24133, -24139, -24145, -24149, -24153, -24157, -24160, -24162, -24164, + -24166, -24167, -24168, -24169, -24170, -24171, -24171, -24172, -24173, -24174, -24175, -24176, -24178, -24179, + -24181, -24184, -24186, -24189, -24192, -24195, -24198, -24202, -24205, -24209, -24213, -24216, -24219, -24223, + -24226, -24228, -24231, -24233, -24234, -24235, -24236, -24236, -24235, -24233, -24230, -24227, -24222, -24217, + -24210, -24202, -24193, -24183, -24171, -24158, -24143, -24127, -24109, -24089, -24067, -24043, -24017, -23988, + -23957, -23923, -23886, -23847, -23804, -23758, -23708, -23655, -23584, -23509, -23427, -23336, -23234, -23119, + -22990, -22846, -22685, -22506, -22307, -22087, -21845, -21580, -21291, -20977, -20638, -20272, -19880, -19462, + -19018, -18549, -18054, -17536, -16995, -16432, -15849, -15248, -14630, -13997, -13353, -12698, -12036, -11369, + -10700, -10032, -9367, -8709, -8059, -7422, -6800, -6196, -5611, -5050, -4513, -4004, -3523, -3073, + -2655, -2269, -1917, -1598, -1312, -1059, -837, -646, -484, -350, -239, -127}; +#else +#define LowDelayShapes_n960_N240 NULL +#endif + +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 LowDelayShapes_n960_N320[520] = { + -6, -12, -17, -23, -30, -39, -48, -60, -72, -86, -102, -119, -138, -159, + -182, -207, -234, -262, -293, -325, -359, -396, -434, -473, -515, -558, -603, -649, + -697, -746, -797, -848, -900, -954, -1008, -1062, -1118, -1173, -1229, -1285, -1340, -1396, + -1451, -1505, -1559, -1612, -1664, -1715, -1764, -1813, -1859, -1904, -1947, -1988, -2027, -2064, + -2098, -2130, -2159, -2186, -2210, -2230, -2248, -2263, -2275, -2283, -2289, -2290, -2289, -2283, + -2274, -2262, -2245, -2225, -2201, -2173, -2141, -2105, -2065, -2020, -1971, -1918, -1860, -1797, + -1730, -1658, -1582, -1500, -1414, -1322, -1225, -1122, -1014, -901, -782, -657, -526, -389, + -246, -97, 59, 221, 390, 565, 748, 937, 1133, 1336, 1547, 1764, 1989, 2221, + 2460, 2707, 2961, 3222, 3490, 3765, 4048, 4338, 4634, 4937, 5246, 5562, 5884, 6212, + 6546, 6885, 7229, 7578, 7932, 8289, 8650, 9014, 9382, 9751, 10123, 10496, 10870, 11244, + 11619, 11992, 12365, 12736, 13105, 13471, 13833, 14192, 14546, 14895, 15239, 15576, 15907, 16231, + 16547, 16856, 17155, 17446, 17727, 17999, 18261, 18512, 18753, 18983, 19202, 19409, 19605, 19790, + 19963, 20125, 20275, 20414, 20541, 20658, 20764, 20858, 20943, 21017, 21082, 21137, 21184, 21221, + 21251, 21273, 21287, 21295, 21297, 21293, 21285, 21271, 21254, 21233, 21209, 21182, 21154, 21124, + 21092, 21060, 21028, 20999, 20972, 20935, 20902, 20870, 20839, 20811, 20784, 20758, 20734, 20712, + 20691, 20671, 20653, 20635, 20619, 20604, 20590, 20577, 20565, 20554, 20543, 20534, 20525, 20517, + 20509, 20502, 20496, 20491, 20486, 20481, 20477, 20474, 20471, 20469, 20467, 20465, 20464, 20464, + 20463, 20463, 20463, 20464, 20465, 20466, 20467, 20468, 20470, 20472, 20474, 20476, 20478, 20480, + 20482, 20485, 20487, 20489, 20491, 20494, 20496, 20498, 20500, 20502, 20504, 20505, 20507, 20508, + 20510, 20511, 20512, 20513, 20514, 20515, 20516, 20516, 20517, 20517, 20518, 20518, 20519, 20519, + 20519, 20520, 20521, 20521, 20522, 20523, 20524, 20526, 20527, 20529, 20531, 20533, 20536, 20539, + 20542, 20546, 20549, 20554, 20558, 20563, 20568, 20573, 20579, 20586, 20592, 20599, 20606, 20613, + 20621, 20629, 20637, 20646, 20655, 20663, 20672, 20682, 20691, 20700, 20710, 20720, -20729, -20739, + -20748, -20758, -20767, -20776, -20785, -20794, -20803, -20812, -20820, -20828, -20836, -20843, -20851, -20857, + -20864, -20870, -20876, -20882, -20887, -20892, -20896, -20901, -20905, -20908, -20911, -20914, -20917, -20919, + -20921, -20923, -20925, -20926, -20927, -20928, -20929, -20930, -20931, -20931, -20932, -20932, -20933, -20933, + -20934, -20934, -20935, -20935, -20936, -20937, -20938, -20939, -20940, -20941, -20943, -20944, -20946, -20947, + -20949, -20951, -20953, -20955, -20958, -20960, -20962, -20964, -20967, -20969, -20971, -20974, -20976, -20978, + -20980, -20982, -20983, -20985, -20986, -20987, -20988, -20989, -20989, -20989, -20988, -20988, -20986, -20985, + -20983, -20980, -20978, -20974, -20970, -20966, -20961, -20955, -20949, -20942, -20934, -20926, -20917, -20907, + -20896, -20885, -20873, -20859, -20845, -20830, -20814, -20796, -20778, -20758, -20737, -20714, -20690, -20665, + -20638, -20610, -20580, -20548, -20515, -20480, -20433, -20384, -20333, -20279, -20220, -20155, -20085, -20008, + -19924, -19833, -19734, -19627, -19511, -19385, -19249, -19103, -18946, -18778, -18598, -18406, -18202, -17986, + -17757, -17515, -17260, -16993, -16713, -16421, -16116, -15799, -15470, -15129, -14778, -14415, -14043, -13661, + -13271, -12872, -12466, -12053, -11634, -11210, -10782, -10351, -9918, -9484, -9049, -8616, -8184, -7755, + -7330, -6910, -6496, -6090, -5691, -5301, -4922, -4553, -4196, -3852, -3521, -3204, -2902, -2615, + -2343, -2087, -1847, -1624, -1417, -1226, -1051, -892, -748, -619, -504, -404, -316, -241, + -175, -92}; +#else +#define LowDelayShapes_n960_N320 NULL +#endif + +#ifdef SUBSET_FB +RAM_ALIGN const Word16 LowDelayShapes_n960_N480[780] = { + -4, -8, -11, -13, -16, -20, -24, -28, -33, -38, -44, -50, -57, -64, + -72, -81, -90, -100, -110, -121, -133, -146, -159, -173, -187, -202, -218, -235, + -252, -270, -289, -308, -328, -349, -370, -392, -415, -438, -462, -486, -511, -537, + -563, -589, -616, -643, -671, -699, -728, -757, -786, -815, -845, -875, -905, -935, + -965, -996, -1026, -1056, -1087, -1117, -1147, -1177, -1207, -1236, -1266, -1295, -1323, -1352, + -1380, -1407, -1434, -1461, -1486, -1512, -1537, -1561, -1584, -1607, -1629, -1650, -1670, -1690, + -1709, -1726, -1743, -1759, -1774, -1788, -1801, -1813, -1824, -1834, -1842, -1850, -1856, -1861, + -1865, -1868, -1870, -1870, -1869, -1867, -1863, -1858, -1852, -1845, -1836, -1826, -1814, -1801, + -1786, -1770, -1753, -1734, -1713, -1691, -1668, -1643, -1616, -1588, -1558, -1527, -1494, -1459, + -1422, -1384, -1344, -1302, -1259, -1213, -1166, -1117, -1066, -1013, -959, -902, -843, -783, + -720, -655, -588, -519, -448, -374, -299, -221, -141, -58, 27, 114, 203, 295, + 389, 486, 585, 687, 791, 898, 1007, 1119, 1234, 1351, 1471, 1593, 1718, 1846, + 1976, 2109, 2244, 2382, 2523, 2667, 2813, 2961, 3113, 3266, 3423, 3582, 3743, 3907, + 4073, 4241, 4412, 4585, 4760, 4938, 5117, 5299, 5483, 5668, 5855, 6045, 6235, 6428, + 6622, 6817, 7013, 7211, 7410, 7610, 7811, 8012, 8215, 8417, 8621, 8824, 9028, 9232, + 9436, 9639, 9843, 10045, 10248, 10449, 10650, 10850, 11048, 11246, 11442, 11636, 11829, 12020, + 12209, 12396, 12581, 12763, 12944, 13121, 13296, 13468, 13638, 13804, 13967, 14127, 14284, 14437, + 14586, 14732, 14875, 15014, 15148, 15280, 15407, 15530, 15649, 15764, 15875, 15981, 16084, 16183, + 16277, 16367, 16453, 16535, 16612, 16686, 16755, 16821, 16882, 16940, 16993, 17043, 17089, 17131, + 17170, 17205, 17237, 17265, 17291, 17313, 17331, 17348, 17361, 17371, 17379, 17385, 17388, 17389, + 17388, 17385, 17380, 17374, 17366, 17356, 17345, 17333, 17320, 17306, 17292, 17276, 17260, 17243, + 17226, 17209, 17191, 17174, 17157, 17142, 17128, 17108, 17089, 17071, 17053, 17036, 17019, 17003, + 16988, 16973, 16959, 16946, 16933, 16920, 16908, 16897, 16886, 16875, 16865, 16856, 16846, 16838, + 16829, 16821, 16814, 16806, 16799, 16793, 16786, 16780, 16775, 16769, 16764, 16759, 16755, 16751, + 16747, 16743, 16739, 16736, 16733, 16730, 16727, 16725, 16722, 16720, 16718, 16717, 16715, 16714, + 16712, 16711, 16711, 16710, 16709, 16709, 16708, 16708, 16708, 16708, 16708, 16708, 16709, 16709, + 16710, 16710, 16711, 16712, 16713, 16714, 16715, 16716, 16717, 16718, 16719, 16720, 16721, 16722, + 16724, 16725, 16726, 16727, 16728, 16730, 16731, 16732, 16733, 16734, 16736, 16737, 16738, 16739, + 16740, 16741, 16742, 16743, 16744, 16744, 16745, 16746, 16747, 16747, 16748, 16748, 16749, 16750, + 16750, 16750, 16751, 16751, 16751, 16752, 16752, 16752, 16753, 16753, 16753, 16753, 16753, 16754, + 16754, 16754, 16755, 16755, 16755, 16756, 16756, 16757, 16757, 16758, 16759, 16759, 16760, 16761, + 16762, 16763, 16765, 16766, 16767, 16769, 16770, 16772, 16774, 16776, 16778, 16780, 16782, 16785, + 16787, 16790, 16793, 16796, 16799, 16802, 16805, 16809, 16812, 16816, 16820, 16824, 16828, 16832, + 16836, 16840, 16845, 16849, 16854, 16858, 16863, 16868, 16873, 16878, 16883, 16888, 16893, 16898, + 16903, 16908, 16914, 16919, -16924, -16929, -16934, -16940, -16945, -16950, -16955, -16960, -16965, -16970, + -16975, -16980, -16984, -16989, -16994, -16998, -17003, -17007, -17011, -17015, -17020, -17023, -17027, -17031, + -17035, -17038, -17041, -17045, -17048, -17051, -17053, -17056, -17059, -17061, -17064, -17066, -17068, -17070, + -17072, -17074, -17075, -17077, -17078, -17080, -17081, -17082, -17083, -17084, -17085, -17086, -17086, -17087, + -17088, -17088, -17089, -17089, -17089, -17090, -17090, -17090, -17091, -17091, -17091, -17091, -17092, -17092, + -17092, -17092, -17093, -17093, -17093, -17094, -17094, -17094, -17095, -17095, -17096, -17097, -17097, -17098, + -17099, -17099, -17100, -17101, -17102, -17103, -17104, -17105, -17106, -17107, -17108, -17109, -17110, -17111, + -17113, -17114, -17115, -17116, -17118, -17119, -17120, -17121, -17123, -17124, -17125, -17126, -17127, -17129, + -17130, -17131, -17132, -17133, -17133, -17134, -17135, -17136, -17136, -17137, -17137, -17137, -17137, -17137, + -17137, -17137, -17137, -17136, -17136, -17135, -17134, -17133, -17132, -17130, -17129, -17127, -17125, -17123, + -17120, -17118, -17115, -17112, -17109, -17105, -17102, -17098, -17094, -17089, -17085, -17080, -17075, -17069, + -17063, -17057, -17051, -17044, -17037, -17030, -17022, -17014, -17005, -16997, -16987, -16978, -16967, -16957, + -16946, -16934, -16922, -16910, -16897, -16883, -16869, -16855, -16840, -16824, -16808, -16791, -16773, -16755, + -16736, -16717, -16690, -16663, -16637, -16609, -16581, -16550, -16518, -16484, -16448, -16409, -16369, -16326, + -16280, -16232, -16181, -16127, -16070, -16010, -15947, -15880, -15810, -15736, -15658, -15577, -15491, -15402, + -15308, -15210, -15108, -15001, -14890, -14775, -14655, -14530, -14401, -14267, -14128, -13985, -13837, -13685, + -13528, -13367, -13201, -13030, -12855, -12676, -12493, -12306, -12114, -11919, -11720, -11517, -11311, -11102, + -10889, -10674, -10455, -10234, -10010, -9784, -9556, -9327, -9095, -8862, -8628, -8393, -8157, -7921, + -7684, -7448, -7211, -6976, -6741, -6507, -6274, -6042, -5813, -5585, -5360, -5137, -4917, -4700, + -4487, -4276, -4070, -3867, -3668, -3474, -3284, -3099, -2919, -2744, -2574, -2410, -2251, -2097, + -1949, -1807, -1671, -1540, -1415, -1297, -1184, -1077, -976, -881, -791, -707, -629, -556, + -489, -427, -369, -317, -269, -226, -188, -151, -114, -59}; +#else +#define LowDelayShapes_n960_N480 NULL +#endif + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 LowDelayShapes_n960_N40_5ms[70] = { + 29, 112, 280, 563, 991, 1590, 2380, 3377, 4587, 6006, 7624, 9416, 11353, 13393, + 15490, 17595, 19657, 21624, 23450, 25092, 26519, 27707, 28645, 29332, 29783, 30021, 30083, 30008, + 29840, 29625, 29408, 29214, 29077, 28993, 28956, 28961, 29000, 29068, 29156, 29256, -29361, -29462, + -29551, -29620, -29661, -29666, -29628, -29542, -29403, -29209, -28923, -28521, -27962, -27210, -26234, -25014, + -23541, -21819, -19874, -17743, -15481, -13149, -10820, -8571, -6479, -4611, -3020, -1753, -842, -284}; +#else +#define LowDelayShapes_n960_N40_5ms NULL +#endif + +#ifdef SUBSET_WB +RAM_ALIGN const Word16 LowDelayShapes_n960_N80_5ms[140] = { + 13, 31, 60, 102, 161, 239, 339, 464, 615, 795, 1006, 1251, 1530, 1845, + 2198, 2588, 3015, 3481, 3983, 4520, 5092, 5697, 6331, 6992, 7677, 8382, 9104, 9838, + 10580, 11326, 12071, 12811, 13540, 14255, 14951, 15624, 16270, 16885, 17466, 18010, 18515, 18978, + 19399, 19775, 20106, 20393, 20636, 20836, 20995, 21115, 21199, 21250, 21271, 21266, 21239, 21194, + 21134, 21064, 20987, 20908, 20836, 20757, 20688, 20630, 20581, 20542, 20513, 20491, 20478, 20473, + 20475, 20483, 20497, 20517, 20541, 20568, 20600, 20633, 20669, 20706, -20743, -20780, -20816, -20850, + -20881, -20910, -20934, -20954, -20968, -20977, -20979, -20973, -20960, -20938, -20908, -20868, -20819, -20761, + -20692, -20613, -20508, -20389, -20248, -20080, -19883, -19653, -19387, -19083, -18738, -18351, -17920, -17444, + -16923, -16358, -15749, -15099, -14410, -13687, -12933, -12154, -11353, -10537, -9712, -8884, -8060, -7246, + -6450, -5679, -4938, -4235, -3574, -2959, -2397, -1889, -1441, -1055, -732, -474, -277, -138}; +#else +#define LowDelayShapes_n960_N80_5ms NULL +#endif + +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 LowDelayShapes_n960_N120_5ms[210] = { + 9, 17, 28, 44, 65, 91, 123, 161, 208, 262, 325, 398, 480, 572, + 676, 791, 918, 1057, 1209, 1374, 1552, 1744, 1950, 2169, 2402, 2648, 2908, 3181, + 3468, 3767, 4078, 4402, 4736, 5081, 5437, 5801, 6174, 6554, 6942, 7335, 7732, 8134, + 8538, 8943, 9349, 9755, 10159, 10560, 10957, 11349, 11735, 12114, 12485, 12846, 13198, 13539, + 13868, 14184, 14487, 14776, 15051, 15311, 15555, 15784, 15997, 16194, 16374, 16538, 16686, 16818, + 16935, 17036, 17123, 17195, 17254, 17299, 17333, 17355, 17366, 17368, 17361, 17347, 17325, 17297, + 17265, 17228, 17189, 17147, 17104, 17061, 17024, 16979, 16938, 16901, 16867, 16837, 16811, 16788, + 16768, 16752, 16739, 16729, 16722, 16718, 16716, 16717, 16720, 16726, 16734, 16743, 16755, 16768, + 16782, 16798, 16815, 16833, 16852, 16871, 16891, 16911, -16931, -16952, -16972, -16991, -17010, -17028, + -17045, -17061, -17076, -17090, -17101, -17111, -17119, -17125, -17128, -17129, -17127, -17123, -17116, -17106, + -17092, -17076, -17056, -17033, -17006, -16976, -16942, -16905, -16864, -16820, -16760, -16698, -16630, -16553, + -16467, -16370, -16263, -16144, -16013, -15868, -15710, -15537, -15349, -15146, -14927, -14693, -14442, -14175, + -13891, -13591, -13276, -12944, -12597, -12236, -11862, -11474, -11074, -10664, -10244, -9816, -9380, -8938, + -8492, -8043, -7592, -7141, -6692, -6247, -5807, -5374, -4949, -4534, -4131, -3741, -3365, -3005, + -2662, -2337, -2030, -1744, -1478, -1234, -1012, -814, -638, -486, -357, -250, -164, -95}; +#else +#define LowDelayShapes_n960_N120_5ms NULL +#endif + +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 LowDelayShapes_n960_N160_5ms[280] = { + 13, 23, 36, 52, 73, 98, 128, 163, 205, 253, 308, 371, 441, 520, + 608, 705, 812, 929, 1056, 1195, 1344, 1505, 1678, 1863, 2060, 2270, 2493, 2729, + 2978, 3241, 3516, 3805, 4108, 4424, 4753, 5095, 5450, 5818, 6198, 6591, 6995, 7411, + 7839, 8277, 8725, 9184, 9651, 10128, 10612, 11104, 11603, 12108, 12618, 13133, 13653, 14175, + 14700, 15226, 15754, 16281, 16808, 17334, 17857, 18376, 18892, 19403, 19909, 20408, 20901, 21385, + 21861, 22328, 22784, 23231, 23666, 24089, 24500, 24898, 25283, 25654, 26011, 26354, 26681, 26994, + 27291, 27572, 27838, 28089, 28323, 28541, 28744, 28931, 29103, 29259, 29401, 29528, 29640, 29738, + 29823, 29895, 29955, 30002, 30038, 30063, 30078, 30083, 30080, 30068, 30049, 30023, 29991, 29953, + 29911, 29865, 29815, 29763, 29708, 29653, 29597, 29541, 29496, 29437, 29381, 29329, 29280, 29235, + 29194, 29156, 29122, 29091, 29064, 29039, 29018, 29000, 28986, 28974, 28964, 28958, 28954, 28953, + 28954, 28958, 28964, 28972, 28982, 28994, 29007, 29023, 29040, 29058, 29078, 29099, 29121, 29144, + 29168, 29192, 29218, 29243, 29269, 29295, -29322, -29348, -29374, -29400, -29425, -29450, -29474, -29498, + -29520, -29541, -29561, -29580, -29597, -29613, -29627, -29639, -29649, -29657, -29663, -29667, -29668, -29667, + -29663, -29657, -29647, -29635, -29620, -29602, -29580, -29556, -29528, -29496, -29462, -29424, -29382, -29337, + -29288, -29236, -29181, -29122, -29041, -28964, -28880, -28788, -28688, -28579, -28460, -28332, -28193, -28042, + -27879, -27705, -27517, -27315, -27100, -26871, -26627, -26369, -26095, -25806, -25501, -25180, -24844, -24492, + -24123, -23739, -23339, -22924, -22493, -22048, -21588, -21114, -20627, -20128, -19616, -19094, -18561, -18018, + -17467, -16907, -16341, -15769, -15192, -14611, -14028, -13442, -12857, -12272, -11689, -11109, -10533, -9963, + -9400, -8846, -8300, -7765, -7241, -6730, -6232, -5749, -5282, -4830, -4396, -3979, -3581, -3202, + -2843, -2505, -2188, -1893, -1620, -1369, -1141, -936, -753, -593, -454, -336, -237, -155}; +#else +#define LowDelayShapes_n960_N160_5ms NULL +#endif + +#ifdef SUBSET_FB +RAM_ALIGN const Word16 LowDelayShapes_n960_N240_5ms[420] = { + 10, 15, 21, 27, 36, 45, 56, 69, 83, 100, 118, 138, 161, 186, + 214, 244, 276, 312, 350, 392, 436, 484, 535, 590, 648, 710, 775, 845, + 918, 995, 1076, 1162, 1252, 1346, 1444, 1547, 1655, 1767, 1883, 2005, 2131, 2261, + 2397, 2537, 2683, 2833, 2988, 3148, 3312, 3482, 3656, 3835, 4019, 4208, 4401, 4599, + 4801, 5008, 5220, 5436, 5656, 5880, 6109, 6342, 6578, 6818, 7063, 7310, 7562, 7816, + 8074, 8335, 8598, 8865, 9134, 9405, 9679, 9955, 10233, 10513, 10794, 11076, 11360, 11645, + 11931, 12217, 12504, 12791, 13078, 13366, 13652, 13939, 14224, 14509, 14792, 15075, 15356, 15635, + 15912, 16187, 16460, 16731, 16999, 17264, 17526, 17785, 18041, 18293, 18542, 18787, 19028, 19264, + 19497, 19725, 19949, 20168, 20382, 20592, 20796, 20996, 21190, 21379, 21563, 21741, 21914, 22082, + 22243, 22399, 22550, 22695, 22834, 22967, 23095, 23216, 23332, 23443, 23548, 23647, 23740, 23828, + 23910, 23987, 24059, 24125, 24186, 24243, 24294, 24340, 24381, 24418, 24450, 24478, 24502, 24522, + 24537, 24549, 24557, 24562, 24563, 24561, 24556, 24549, 24538, 24525, 24510, 24492, 24473, 24451, + 24428, 24404, 24378, 24351, 24323, 24294, 24264, 24234, 24204, 24173, 24143, 24112, 24093, 24059, + 24027, 23997, 23968, 23940, 23914, 23889, 23865, 23842, 23821, 23801, 23783, 23765, 23749, 23734, + 23720, 23708, 23696, 23686, 23677, 23668, 23661, 23655, 23650, 23647, 23644, 23641, 23640, 23640, + 23641, 23642, 23645, 23648, 23652, 23657, 23662, 23668, 23675, 23682, 23691, 23699, 23708, 23718, + 23728, 23739, 23750, 23762, 23774, 23786, 23799, 23812, 23825, 23839, 23853, 23866, 23881, 23895, + 23909, 23923, -23938, -23952, -23966, -23980, -23994, -24008, -24022, -24036, -24049, -24062, -24075, -24088, + -24100, -24112, -24123, -24134, -24144, -24154, -24164, -24173, -24181, -24189, -24195, -24202, -24207, -24212, + -24216, -24219, -24222, -24223, -24224, -24224, -24223, -24221, -24218, -24214, -24208, -24202, -24195, -24187, + -24177, -24167, -24155, -24142, -24128, -24113, -24097, -24079, -24060, -24040, -24019, -23996, -23972, -23947, + -23921, -23893, -23864, -23834, -23802, -23769, -23721, -23681, -23638, -23592, -23543, -23492, -23438, -23380, + -23319, -23255, -23186, -23115, -23039, -22959, -22875, -22786, -22693, -22596, -22494, -22387, -22275, -22157, + -22035, -21908, -21775, -21637, -21494, -21345, -21190, -21030, -20864, -20692, -20515, -20332, -20143, -19948, + -19748, -19541, -19329, -19112, -18888, -18659, -18425, -18185, -17940, -17690, -17434, -17174, -16909, -16639, + -16365, -16087, -15804, -15518, -15228, -14934, -14637, -14337, -14034, -13728, -13420, -13109, -12797, -12483, + -12167, -11851, -11533, -11215, -10896, -10577, -10258, -9940, -9623, -9307, -8992, -8678, -8367, -8058, + -7752, -7448, -7148, -6851, -6557, -6268, -5983, -5702, -5426, -5156, -4890, -4630, -4375, -4126, + -3884, -3647, -3417, -3194, -2977, -2767, -2565, -2369, -2181, -2001, -1829, -1664, -1507, -1358, + -1218, -1085, -961, -846, -738, -639, -547, -464, -388, -320, -259, -206, -159, -124}; +#else +#define LowDelayShapes_n960_N240_5ms NULL +#endif + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 LowDelayShapes_n960_N40_2_5ms[40] = { + 140, 566, 1277, 2319, 3704, 5404, 7357, 9466, 11616, 13686, 15563, 17163, 18436, 19375, + 20007, 20391, 20594, 20685, 20717, 20724, -20724, -20717, -20685, -20594, -20391, -20007, -19375, -18436, + -17163, -15563, -13686, -11616, -9466, -7357, -5404, -3704, -2319, -1277, -566, -140}; +#else +#define LowDelayShapes_n960_N40_2_5ms NULL +#endif + +#ifdef SUBSET_WB +RAM_ALIGN const Word16 LowDelayShapes_n960_N80_2_5ms[80] = { + 140, 353, 653, 1049, 1553, 2171, 2909, 3768, 4747, 5842, 7043, 8341, 9721, 11165, + 12655, 14170, 15688, 17188, 18649, 20051, 21376, 22610, 23739, 24756, 25656, 26436, 27099, 27650, + 28097, 28450, 28721, 28922, 29065, 29164, 29228, 29267, 29290, 29301, 29306, 29308, -29308, -29306, + -29301, -29290, -29267, -29228, -29164, -29065, -28922, -28721, -28450, -28097, -27650, -27099, -26436, -25656, + -24756, -23739, -22610, -21376, -20051, -18649, -17188, -15688, -14170, -12655, -11165, -9721, -8341, -7043, + -5842, -4747, -3768, -2909, -2171, -1553, -1049, -653, -353, -140}; +#else +#define LowDelayShapes_n960_N80_2_5ms NULL +#endif + +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 LowDelayShapes_n960_N120_2_5ms[120] = { + 93, 196, 328, 491, 689, 924, 1199, 1514, 1873, 2274, 2720, 3209, 3742, 4318, + 4934, 5588, 6277, 7000, 7750, 8526, 9321, 10132, 10953, 11780, 12606, 13427, 14237, 15032, + 15807, 16557, 17278, 17967, 18620, 19234, 19809, 20341, 20830, 21276, 21680, 22040, 22360, 22641, + 22884, 23092, 23269, 23416, 23538, 23636, 23714, 23775, 23822, 23857, 23882, 23900, 23913, 23920, + 23925, 23928, 23930, 23930, -23930, -23930, -23928, -23925, -23920, -23913, -23900, -23882, -23857, -23822, + -23775, -23714, -23636, -23538, -23416, -23269, -23092, -22884, -22641, -22360, -22040, -21680, -21276, -20830, + -20341, -19809, -19234, -18620, -17967, -17278, -16557, -15807, -15032, -14237, -13427, -12606, -11780, -10953, + -10132, -9321, -8526, -7750, -7000, -6277, -5588, -4934, -4318, -3742, -3209, -2720, -2274, -1873, + -1514, -1199, -924, -689, -491, -328, -196, -93}; +#else +#define LowDelayShapes_n960_N120_2_5ms NULL +#endif + +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 LowDelayShapes_n960_N160_2_5ms[160] = { + 70, 134, 210, 301, 407, 530, 671, 830, 1008, 1206, 1425, 1665, 1926, 2208, + 2512, 2837, 3183, 3550, 3937, 4343, 4768, 5211, 5670, 6143, 6631, 7131, 7642, 8161, + 8688, 9219, 9755, 10292, 10828, 11363, 11893, 12417, 12933, 13440, 13936, 14418, 14887, 15339, + 15775, 16193, 16593, 16972, 17332, 17670, 17988, 18285, 18561, 18816, 19050, 19264, 19459, 19635, + 19793, 19934, 20059, 20168, 20264, 20347, 20418, 20478, 20529, 20572, 20606, 20635, 20657, 20675, + 20689, 20700, 20708, 20713, 20718, 20720, 20722, 20723, 20724, 20724, -20724, -20724, -20723, -20722, + -20720, -20718, -20713, -20708, -20700, -20689, -20675, -20657, -20635, -20606, -20572, -20529, -20478, -20418, + -20347, -20264, -20168, -20059, -19934, -19793, -19635, -19459, -19264, -19050, -18816, -18561, -18285, -17988, + -17670, -17332, -16972, -16593, -16193, -15775, -15339, -14887, -14418, -13936, -13440, -12933, -12417, -11893, + -11363, -10828, -10292, -9755, -9219, -8688, -8161, -7642, -7131, -6631, -6143, -5670, -5211, -4768, + -4343, -3937, -3550, -3183, -2837, -2512, -2208, -1926, -1665, -1425, -1206, -1008, -830, -671, + -530, -407, -301, -210, -134, -70}; +#else +#define LowDelayShapes_n960_N160_2_5ms NULL +#endif + +#ifdef SUBSET_FB +RAM_ALIGN const Word16 LowDelayShapes_n960_N240_2_5ms[240] = { + 47, 81, 118, 160, 207, 259, 317, 381, 452, 528, 611, 701, 799, 903, + 1015, 1134, 1260, 1395, 1537, 1686, 1844, 2009, 2183, 2363, 2552, 2748, 2951, 3162, + 3380, 3604, 3836, 4073, 4317, 4567, 4822, 5083, 5348, 5618, 5892, 6170, 6451, 6735, + 7022, 7311, 7601, 7892, 8185, 8477, 8769, 9060, 9350, 9639, 9926, 10209, 10491, 10768, + 11042, 11312, 11577, 11837, 12092, 12341, 12585, 12822, 13053, 13277, 13494, 13705, 13908, 14103, + 14291, 14472, 14645, 14810, 14968, 15118, 15261, 15396, 15523, 15643, 15756, 15862, 15961, 16054, + 16140, 16220, 16293, 16361, 16424, 16481, 16533, 16580, 16623, 16662, 16697, 16728, 16755, 16780, + 16802, 16821, 16837, 16851, 16864, 16874, 16883, 16891, 16897, 16902, 16907, 16910, 16913, 16915, + 16917, 16918, 16919, 16920, 16921, 16921, 16921, 16921, -16921, -16921, -16921, -16921, -16920, -16919, + -16918, -16917, -16915, -16913, -16910, -16907, -16902, -16897, -16891, -16883, -16874, -16864, -16851, -16837, + -16821, -16802, -16780, -16755, -16728, -16697, -16662, -16623, -16580, -16533, -16481, -16424, -16361, -16293, + -16220, -16140, -16054, -15961, -15862, -15756, -15643, -15523, -15396, -15261, -15118, -14968, -14810, -14645, + -14472, -14291, -14103, -13908, -13705, -13494, -13277, -13053, -12822, -12585, -12341, -12092, -11837, -11577, + -11312, -11042, -10768, -10491, -10209, -9926, -9639, -9350, -9060, -8769, -8477, -8185, -7892, -7601, + -7311, -7022, -6735, -6451, -6170, -5892, -5618, -5348, -5083, -4822, -4567, -4317, -4073, -3836, + -3604, -3380, -3162, -2951, -2748, -2552, -2363, -2183, -2009, -1844, -1686, -1537, -1395, -1260, + -1134, -1015, -903, -799, -701, -611, -528, -452, -381, -317, -259, -207, -160, -118, + -81, -47}; +#else +#define LowDelayShapes_n960_N240_2_5ms NULL +#endif + + +#ifdef SUBSET_NB +RAM_ALIGN const Word32 lag_win_8k[16] = {0x7fdba30b, 0x7f6eca1a, 0x7eba2e4e, 0x7dbf01e8, 0x7c7eecec, 0x7afc0879, + 0x7938d8eb, 0x773846e0, 0x74fd973a, 0x728c623e, 0x6fe889ee, 0x6d162fc8, + 0x6a19aa0b, 0x66f778a7, 0x63b43a09, 0x60549fe1}; +#else +#define lag_win_8k NULL +#endif + +#ifdef SUBSET_WB +RAM_ALIGN const Word32 lag_win_16k[16] = {0x7ff6e7cb, 0x7fdba30b, 0x7fae3d5f, 0x7f6eca1a, 0x7f1d643a, 0x7eba2e4e, + 0x7e455264, 0x7dbf01e8, 0x7d277581, 0x7c7eecec, 0x7bc5aecb, 0x7afc0879, + 0x7a224dcf, 0x7938d8eb, 0x784009f7, 0x773846e0}; +#else +#define lag_win_16k NULL +#endif + +#ifdef SUBSET_SSWB +RAM_ALIGN const Word32 lag_win_24k[16] = {0x7ffbf529, 0x7fefd569, 0x7fdba30b, 0x7fbf61e2, 0x7f9b1748, 0x7f6eca1a, + 0x7f3a82b8, 0x7efe4b00, 0x7eba2e4e, 0x7e6e3976, 0x7e1a7ac1, 0x7dbf01e8, + 0x7d5be00f, 0x7cf127c2, 0x7c7eecec, 0x7c0544d0}; +#else +#define lag_win_24k NULL +#endif + +#ifdef SUBSET_SWB +RAM_ALIGN const Word32 lag_win_32k[16] = {0x7ffdb9e3, 0x7ff6e7cb, 0x7feb8a70, 0x7fdba30b, 0x7fc7334b, 0x7fae3d5f, + 0x7f90c3ed, 0x7f6eca1a, 0x7f485382, 0x7f1d643a, 0x7eee00d1, 0x7eba2e4e, + 0x7e81f22e, 0x7e455264, 0x7e045558, 0x7dbf01e8}; +#else +#define lag_win_32k NULL +#endif + +#ifdef SUBSET_FB +RAM_ALIGN const Word32 lag_win_48k[16] = {0x7ffefd47, 0x7ffbf529, 0x7ff6e7cb, 0x7fefd569, 0x7fe6be59, 0x7fdba30b, + 0x7fce8403, 0x7fbf61e2, 0x7fae3d5f, 0x7f9b1748, 0x7f85f087, 0x7f6eca1a, + 0x7f55a51b, 0x7f3a82b8, 0x7f1d643a, 0x7efe4b00}; +#else +#define lag_win_48k NULL +#endif + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word32 lag_win_96k[16] = {0x7fffbf52, 0x7ffefd47, 0x7ffdb9e3, 0x7ffbf529, 0x7ff9af1f, 0x7ff6e7cb, + 0x7ff39f35, 0x7fefd569, 0x7feb8a70, 0x7fe6be59, 0x7fe17132, 0x7fdba30b, + 0x7fd553f5, 0x7fce8403, 0x7fc7334b, 0x7fbf61e2}; +#else +#define lag_win_96k NULL +#endif + +RAM_ALIGN const Word32 *const lag_win[NUM_SAMP_FREQ] = {lag_win_8k, lag_win_16k, lag_win_24k, lag_win_32k, lag_win_48k, lag_win_96k}; + +RAM_ALIGN const Word16 sqrt_table_phecu[49] = {/* used by Sqrt_l */ + 16384, 16888, 17378, 17854, 18318, 18770, 19212, 19644, 20066, 20480, + 20886, 21283, 21674, 22058, 22435, 22806, 23170, 23530, 23884, 24232, + 24576, 24915, 25249, 25580, 25905, 26227, 26545, 26859, 27170, 27477, + 27780, 28081, 28378, 28672, 28963, 29251, 29537, 29819, 30099, 30377, + 30652, 30924, 31194, 31462, 31727, 31991, 32252, 32511, 32767}; + +/* First frequency bin in each subband now adjusted to include last bin * + * which was missed with the previous definition * + * 250 750 1250 2250 4250 8250 12250 16250 20250 ( 24250 ) * + * note that bins over 20000 are zeroed and not used */ +/* [- FB ----------------------------) (Currently limited to 20kHz) + * [- SWB -----------------------) + * [- sWB -------------------) + * [- WB ----------------) + * [- NB -----------) + */ + +RAM_ALIGN const Word16 gw_len_inv_shift_fx[MAX_LGW] = {/* Q0 */ + 1 - 1 /*/1/2*/, 1 - 1, 2 - 1 /*1/4*/, + 3 - 1 /*1/8*/, 4 - 1 /*1/16*/, 4 - 1, + 4 - 1, 4 - 1, 4 - 1}; +RAM_ALIGN const Word16 gwlpr_fx[MAX_LGW + 1] = { + 1, + 3 * QUOT_LPR_LTR, + 5 * QUOT_LPR_LTR, + 9 * QUOT_LPR_LTR, + 17 * QUOT_LPR_LTR, + 33 * QUOT_LPR_LTR, + 49 * QUOT_LPR_LTR, + 65 * QUOT_LPR_LTR, + 81 * QUOT_LPR_LTR, + 97 * QUOT_LPR_LTR}; /* frequency group start bins for transient analysis */ + + /* puretone_ana compressed ATH bandborder weights */ +RAM_ALIGN const Word16 scATHFx[MAX_LGW - 2] = { 14924 , 30499 , 31886 , 32767 , 29770 , 25417 , 16384 }; + /* 0.455444335937500 0.930755615234375 0.973083496093750 0.999969482421875 0.908508300781250 0.775665283203125 0.5*/ + +RAM_ALIGN const Word16 e_tot_headroom[5] = {3, 3, 4, 4, 4}; /* smallest head room to use for each fs */ + + + +RAM_ALIGN const Word16 xfp_wE_MDCT2FFTQ11[5] = {4077, 8283, 12489, 16698, + 25109}; /* Q11 Mantissa of scale to use for each fs */ + +RAM_ALIGN const Word16 POW_ATT_TABLE0[OFF_FRAMES_LIMIT + 1] = { + 32767, 31293, 29885, 28540, 27255, 26029, 24857, 23738, 22670, 21650, 20675, 19745, 18856, 18007, 17197, 16423, + 8211, 4106, 2053, 1026, 513, 257, 128, 64, 32, 16, 8, 4, 2, 1, 0}; +RAM_ALIGN const Word16 POW_ATT_TABLE1[OFF_FRAMES_LIMIT + 1] = { + 32767, 31656, 30581, 29543, 28540, 27571, 26635, 25731, 24857, 24013, 23198, 22410, 21650, 20915, 20205, 19519, + 9759, 4880, 2440, 1220, 610, 305, 152, 76, 38, 19, 10, 5, 2, 1, 0}; + +#ifdef PLC2_FADEOUT_IN_MS +#if PLC2_FADEOUT_IN_MS == 0 + +#else /* PLC2_FADEOUT_IN_MS == 0 */ + +RAM_ALIGN const Word16 POW_ATT_TABLE_p3x9_14_7[OFF_FRAMES_LIMIT + 1] = { + 32767, + 31656, 30581, 29543, 28540, 27571, 26635, 25731, 24857, 24013, /* 9 times .3dB steps , 14 6 dB steps, 7 muted steps */ + 12007, 6003, 3002, 1501, 750, 375, 188, 94, 47, 23, 12, 6, 3, 1, + 0, 0, 0, 0, 0, 0, 0 }; + +RAM_ALIGN const Word16 POW_ATT_TABLE_p4x9_14_7[OFF_FRAMES_LIMIT + 1] = +{ 32767, + 31293, 29885, 28540, 27255, 26029, 24857, 23738, 22670, 21650, /* 9 times .4dB steps , 14 6 dB steps, 7 muted steps */ + 10825, 5413, 2706, 1353, 677, 338, 169, 85, 42, 21, 11, 5, 3, 1, + 0, 0,0,0,0,0,0 }; + +RAM_ALIGN const Word16 POW_ATT_TABLE_p3x8_6[OFF_FRAMES_LIMIT + 1] = { + 32767, 31656, 30581, 29543, 28540, 27571, 26635, 25731, 12865, 6433, 3216, 1608, 804, 402, 201, 101, + 50, 25, 13, 6, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0}; +RAM_ALIGN const Word16 POW_ATT_TABLE_p4x8_6[OFF_FRAMES_LIMIT + 1] = { + 32767, 31293, 29885, 28540, 27255, 26029, 24857, 23738, 11869, 5935, 2967, 1484, 742, 371, 185, 93, + 46, 23, 12, 6, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}; + +RAM_ALIGN const Word16 POW_ATT_TABLE_p3x4_6[OFF_FRAMES_LIMIT + 1] = { + 32767, 31656, 30581, 29543, 14772, 7386, 3693, 1847, 923, 462, 231, 115, 58, 29, 14, 7, + 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +RAM_ALIGN const Word16 POW_ATT_TABLE_p4x4_6[OFF_FRAMES_LIMIT + 1] = { + 32767, 31293, 29885, 28540, 14270, 7135, 3568, 1784, 892, 446, 223, 111, 56, 28, 14, 7, + 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +RAM_ALIGN const Word16 POW_ATT_TABLE_p3x2_6[OFF_FRAMES_LIMIT + 1] = { + 32767, 31656, 15828, 7914, 3957, 1979, 989, 495, 247, 124, 62, 31, 15, 8, 4, 2, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +RAM_ALIGN const Word16 POW_ATT_TABLE_p4x2_6[OFF_FRAMES_LIMIT + 1] = { + 32767, 31293, 15647, 7823, 3912, 1956, 978, 489, 244, 122, 61, 31, 15, 8, 4, 2, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +RAM_ALIGN const Word16 POW_ATT_TABLE_p3x1_6[OFF_FRAMES_LIMIT + 1] = { + 32767, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +RAM_ALIGN const Word16 POW_ATT_TABLE_p4x1_6[OFF_FRAMES_LIMIT + 1] = { + 32767, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/* POW_ATT_TABLES now ordered logically based on initial slow muting phase time */ +/* POW_ATT_TABLES[ind] is used after teh initial gain==1.0 no energy muting phase */ +RAM_ALIGN const Word16 *const POW_ATT_TABLES[1 + 24 / 2] = +{ NULL, +/*0.3dB col , 0.4dB col */ +/* 1*/POW_ATT_TABLE_p3x1_6, POW_ATT_TABLE_p4x1_6, /* 0 0.3dB, 16 6dB, 14mute */ /* 0.4dB version */ /* old short mute tabs */ +/* 3*/POW_ATT_TABLE_p3x2_6, POW_ATT_TABLE_p4x2_6, /* 1 0.3dB, 15 6dB ,14mute */ /* 0.4dB version */ +/* 5*/POW_ATT_TABLE_p3x4_6, POW_ATT_TABLE_p4x4_6, /* 3 0.3dB, 15 6dB , 12 mute */ /* 0.4dB version */ +/* 7*/POW_ATT_TABLE_p3x8_6, POW_ATT_TABLE_p4x8_6, /* 7 0.3dB, 15 6dB , 8 mute */ /* 0.4dB version */ +/* 9*/POW_ATT_TABLE_p3x9_14_7, POW_ATT_TABLE_p4x9_14_7, /* 9 0.3dB, 14 6dB , 7 mute */ /* 0.4dB version */ /* opt 120 ms */ +/*11*/POW_ATT_TABLE1, POW_ATT_TABLE0, /* 15 0.3dB, 14 6dB , 1 mute */ /* 0.4dB version */ /* 3GPP original/default curves */ +}; + +/* PLC_FADEOUT_TUNING, extended table nominal muting phases from 30 ms to 140 ms */ +RAM_ALIGN const Word16 fade_scheme_tab_fx[24 / 2][3] = { +/* burst_att_thresh indicates when muting POW_ATT_TABLE[att_per_frame_idx] should be used first time it is 1.0 though */ +/* burst_att_thresh ==2 --> gains [ 1.0, 32767/32768.0(first table value used) , first muted, .... ]*/ +/* burst_att_thresh ==5 --> gains [ 1.0, 1.0, 1,0 1,0, 32767/32768.0(first table value used) , first muted,... ]*/ +/* beta_mute_thr ==4 --> start of final attenuation attenuate AvgMix */ + +/* tabled {att_per_frame_idx_p3dB , burst_att_thresh, beta_mute_thr } */ +{ 1, 2, 0 + 2 + 2 }, /* 30 ms, 0.3 dB delta att in slow mutephase nominal_fadeout=0 */ +{ 1, 3, 0 + 3 + 2 }, /* 40 ms, 0.3 dB delta att in slow mutephase */ +{ 3, 3, 1 + 3 + 1 }, /* 50 ms, 0.3 dB delta att in slow mutephase */ +{ 3, 4, 1 + 4 + 1}, /* 60 ms, 0.3 dB delta att in slow mutephase */ +{ 5, 4, 3 + 4 + 1 }, /* 70 ms, 0.3 dB delta att in slow mutephase */ +{ 5, 5, 3 + 5 + 1 }, /* 80 ms, 0.3 dB delta att in slow mutephase */ +{ 7, 5, 7 + 5 }, /* 90 ms, 0.3 dB delta att in slow mutephase */ +{ 7, 5, 7 + 5 + 1}, /* 100 ms, 0.3 dB delta att in slow mutephase */ +{ 9, 5, 9 + 5 }, /* 110 ms, 0.3 dB delta att in slow mutephase */ +{ 9, 5, 9 + 5 + 1}, /* 120 ms, 0.3 dB delta att in slow mutephase nominal_fadeout=1 */ +{ 11, 5, 15 + 5 },/* 130 ms, 0.3 dB delta att in slow mutephase */ +{ 11, 6, 15 + 6 },/* 140 ms, 0.3 dB delta att in slow mutephase nominal 3GPP */ +}; +/*fade_scheme_tab_fx[ind][0] att_per _fram_index , "points" to first column in POW_ATT TABLES */ +/*fade_scheme_tab_fx[ind][1] is burst_att_thresh, the number of non_muted 1.0 gain frames */ +/*fade_scheme_tab_fx[ind][2] is beta_mute_thr, the location of the start of final attenuation */ + +#endif /* PLC2_FADEOUT_IN_MS == 0 */ + +#else /* PLC2_FADEOUT_IN_MS */ +RAM_ALIGN const Word16 *const POW_ATT_TABLES[1 + 2] = { + NULL, + POW_ATT_TABLE1 /*1 .3dB steps */, + POW_ATT_TABLE0 /*2 .4 dB steps*/, +}; +#endif /* PLC2_FADEOUT_IN_MS */ + +RAM_ALIGN const Word16 sin_quarterQ15_fx[256 + 1] = { + 0, 201, 402, 603, 804, 1005, 1206, 1407, 1608, 1809, 2009, 2210, 2411, 2611, 2811, 3012, + 3212, 3412, 3612, 3812, 4011, 4211, 4410, 4609, 4808, 5007, 5205, 5404, 5602, 5800, 5998, 6195, + 6393, 6590, 6787, 6983, 7180, 7376, 7571, 7767, 7962, 8157, 8351, 8546, 8740, 8933, 9127, 9319, + 9512, 9704, 9896, 10088, 10279, 10469, 10660, 10850, 11039, 11228, 11417, 11605, 11793, 11980, 12167, 12354, + 12540, 12725, 12910, 13095, 13279, 13463, 13646, 13828, 14010, 14192, 14373, 14553, 14733, 14912, 15091, 15269, + 15447, 15624, 15800, 15976, 16151, 16326, 16500, 16673, 16846, 17018, 17190, 17361, 17531, 17700, 17869, 18037, + 18205, 18372, 18538, 18703, 18868, 19032, 19195, 19358, 19520, 19681, 19841, 20001, 20160, 20318, 20475, 20632, + 20788, 20943, 21097, 21251, 21403, 21555, 21706, 21856, 22006, 22154, 22302, 22449, 22595, 22740, 22884, 23028, + 23170, 23312, 23453, 23593, 23732, 23870, 24008, 24144, 24279, 24414, 24548, 24680, 24812, 24943, 25073, 25202, + 25330, 25457, 25583, 25708, 25833, 25956, 26078, 26199, 26320, 26439, 26557, 26674, 26791, 26906, 27020, 27133, + 27246, 27357, 27467, 27576, 27684, 27791, 27897, 28002, 28106, 28209, 28311, 28411, 28511, 28610, 28707, 28803, + 28899, 28993, 29086, 29178, 29269, 29359, 29448, 29535, 29622, 29707, 29792, 29875, 29957, 30038, 30118, 30196, + 30274, 30350, 30425, 30499, 30572, 30644, 30715, 30784, 30853, 30920, 30986, 31050, 31114, 31177, 31238, 31298, + 31357, 31415, 31471, 31527, 31581, 31634, 31686, 31737, 31786, 31834, 31881, 31927, 31972, 32015, 32058, 32099, + 32138, 32177, 32214, 32251, 32286, 32319, 32352, 32383, 32413, 32442, 32470, 32496, 32522, 32546, 32568, 32590, + 32610, 32629, 32647, 32664, 32679, 32693, 32706, 32718, 32729, 32738, 32746, 32753, 32758, 32762, 32766, 32767, + 32767}; + +/* 16 ms tables for PHECU fft windowing and post ifft preTda MDCT windowing (window 11) */ +/* 3+3ms tapering for the hamming parts */ +/* temporary ROM solution */ +/* alternatively use values from a single 48 kHz table */ + +/* 3ms rising tapering part @48 kHZ */ +/* only quarter sine hamming part is actually used by the C-function windowing_fx */ +/* OPT: store only one table at 48 or 96 kHz */ +/* OPT2: for this to work one must switch to 'periodic' instead of used 'symetric' windows, * + * the different windows are just sub-sampled windows of a 96kHz window */ + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 PhECU_whr16ms_NB_Q15[Lprot_hamm_len2_8k] = {/* From matlab */ + 2621, 2750, 3135, 3769, 4641, 5736, + 7036, 8519, 10158, 11926, 13793, 15727, + 17695, 19662, 21596, 23463, 25231, 26871, + 28353, 29653, 30749, 31621, 32254, 32639}; +#else +#define PhECU_whr16ms_NB_Q15 NULL +#endif +#ifdef SUBSET_WB +RAM_ALIGN const Word16 PhECU_whr16ms_WB_Q15[Lprot_hamm_len2_16k] = {/* From matlab */ + 2621, 2654, 2750, 2911, 3135, 3421, 3769, + 4176, 4641, 5162, 5736, 6362, 7036, 7756, + 8519, 9320, 10158, 11028, 11926, 12850, 13793, + 14754, 15727, 16709, 17695, 18681, 19662, 20635, + 21596, 22540, 23463, 24361, 25231, 26069, 26871, + 27633, 28353, 29027, 29653, 30228, 30749, 31214, + 31621, 31968, 32254, 32478, 32639, 32736}; +#else +#define PhECU_whr16ms_WB_Q15 NULL +#endif +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 PhECU_whr16ms_ssWB_Q15[Lprot_hamm_len2_24k] = + {/* From matlab */ + 2621, 2636, 2679, 2750, 2850, 2979, 3135, 3319, 3530, 3769, 4034, 4325, 4641, 4982, 5347, + 5736, 6148, 6582, 7036, 7511, 8006, 8519, 9049, 9596, 10158, 10735, 11324, 11926, 12539, 13162, + 13793, 14432, 15077, 15727, 16381, 17037, 17695, 18352, 19008, 19662, 20312, 20957, 21596, 22227, 22850, + 23463, 24065, 24655, 25231, 25794, 26340, 26871, 27384, 27878, 28353, 28808, 29242, 29653, 30042, 30407, + 30749, 31065, 31356, 31621, 31859, 32070, 32254, 32411, 32539, 32639, 32711, 32754}; +#else +#define PhECU_whr16ms_ssWB_Q15 NULL +#endif +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 PhECU_whr16ms_SWB_Q15[Lprot_hamm_len2_32k] = + {/* From matlab */ + 2621, 2630, 2654, 2694, 2750, 2823, 2911, 3015, 3135, 3270, 3421, 3588, 3769, 3965, 4176, 4401, + 4641, 4894, 5162, 5442, 5736, 6043, 6362, 6693, 7036, 7391, 7756, 8132, 8519, 8915, 9320, 9735, + 10158, 10589, 11028, 11474, 11926, 12385, 12850, 13319, 13793, 14272, 14754, 15239, 15727, 16217, 16709, 17202, + 17695, 18188, 18681, 19172, 19662, 20150, 20635, 21118, 21596, 22070, 22540, 23004, 23463, 23916, 24361, 24800, + 25231, 25654, 26069, 26475, 26871, 27257, 27633, 27999, 28353, 28696, 29027, 29347, 29653, 29947, 30228, 30495, + 30749, 30988, 31214, 31424, 31621, 31802, 31968, 32119, 32254, 32374, 32478, 32567, 32639, 32695, 32736, 32760}; +#else +#define PhECU_whr16ms_SWB_Q15 NULL +#endif +#ifdef SUBSET_FB +RAM_ALIGN const Word16 PhECU_whr16ms_FB_Q15[Lprot_hamm_len2_48k] = + {/* From matlab */ + 2621, 2625, 2636, 2654, 2679, 2711, 2750, 2797, 2850, 2911, 2979, 3053, 3135, 3224, 3319, 3421, + 3530, 3646, 3769, 3898, 4034, 4176, 4325, 4480, 4641, 4808, 4982, 5162, 5347, 5539, 5736, 5939, + 6148, 6362, 6582, 6806, 7036, 7271, 7511, 7756, 8006, 8260, 8519, 8782, 9049, 9320, 9596, 9875, + 10158, 10445, 10735, 11028, 11324, 11624, 11926, 12232, 12539, 12850, 13162, 13477, 13793, 14112, 14432, 14754, + 15077, 15402, 15727, 16054, 16381, 16709, 17037, 17366, 17695, 18024, 18352, 18681, 19008, 19336, 19662, 19988, + 20312, 20635, 20957, 21277, 21596, 21913, 22227, 22540, 22850, 23158, 23463, 23765, 24065, 24361, 24655, 24945, + 25231, 25514, 25794, 26069, 26340, 26608, 26871, 27129, 27384, 27633, 27878, 28118, 28353, 28583, 28808, 29027, + 29242, 29450, 29653, 29850, 30042, 30228, 30407, 30581, 30749, 30910, 31065, 31214, 31356, 31491, 31621, 31743, + 31859, 31968, 32070, 32166, 32254, 32336, 32411, 32478, 32539, 32593, 32639, 32678, 32711, 32736, 32754, 32764}; +#else +#define PhECU_whr16ms_FB_Q15 NULL +#endif + +/* initial 2ms for preTda is the LD-MDCT analysis window times the centered inverse whr window */ +#ifdef SUBSET_NB +RAM_ALIGN const Word16 PhECU_preTdaFx16ms_128_pre_Q14[16] = {-12, -34, -74, -135, -219, -327, -459, -610, + -776, -949, -1125, -1295, -1451, -1587, -1696, -1771}; +#else +#define PhECU_preTdaFx16ms_128_pre_Q14 NULL +#endif +#ifdef SUBSET_WB +RAM_ALIGN const Word16 PhECU_preTdaFx16ms_256_pre_Q14[32] = { + -8, -16, -27, -42, -63, -87, -117, -154, -196, -244, -299, -358, -424, -495, -570, -650, + -733, -818, -906, -993, -1082, -1168, -1253, -1336, -1414, -1488, -1556, -1617, -1671, -1718, -1755, -1784}; +#else +#define PhECU_preTdaFx16ms_256_pre_Q14 NULL +#endif +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 PhECU_preTdaFx16ms_384_pre_Q14[48] = { + -6, -12, -18, -25, -34, -45, -59, -74, -92, -112, -135, -160, -188, -219, -253, -289, + -328, -369, -413, -459, -507, -557, -610, -663, -719, -775, -833, -891, -950, -1008, -1067, -1125, + -1183, -1239, -1295, -1349, -1401, -1451, -1499, -1545, -1587, -1627, -1663, -1696, -1725, -1750, -1771, -1788}; +#else +#define PhECU_preTdaFx16ms_384_pre_Q14 NULL +#endif +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 PhECU_preTdaFx16ms_512_pre_Q14[64] = { + -5, -9, -13, -18, -24, -31, -38, -47, -57, -68, -81, -94, -109, -126, -144, -164, + -185, -207, -232, -257, -284, -313, -343, -374, -407, -441, -477, -513, -551, -590, -630, -670, + -712, -754, -797, -840, -884, -927, -972, -1016, -1059, -1104, -1147, -1190, -1232, -1274, -1316, -1356, + -1395, -1433, -1470, -1505, -1539, -1572, -1602, -1632, -1659, -1684, -1707, -1728, -1747, -1763, -1777, -1789}; +#else +#define PhECU_preTdaFx16ms_512_pre_Q14 NULL +#endif +#ifdef SUBSET_FB +RAM_ALIGN const Word16 PhECU_preTdaFx16ms_768_pre_Q14[96] = { + -4, -8, -11, -13, -15, -19, -23, -27, -32, -37, -43, -48, -55, -62, -70, -78, + -87, -97, -107, -117, -129, -141, -154, -168, -181, -196, -211, -228, -244, -261, -280, -298, + -318, -338, -358, -380, -402, -424, -447, -471, -495, -520, -545, -570, -596, -623, -650, -677, + -705, -733, -761, -789, -818, -847, -876, -905, -934, -964, -993, -1022, -1052, -1082, -1111, -1140, + -1169, -1197, -1226, -1254, -1281, -1309, -1336, -1362, -1388, -1415, -1439, -1464, -1488, -1511, -1534, -1556, + -1577, -1598, -1617, -1636, -1655, -1671, -1688, -1703, -1718, -1731, -1744, -1755, -1766, -1776, -1784, -1791}; +#else +#define PhECU_preTdaFx16ms_768_pre_Q14 NULL +#endif + +/* ROM OPT compute it runtime based on MDCT win and tabled inverse hamming sections */ +/* 16 ms tables for PHECU fft windowing and post ifft preTda MDCT windowing */ +/* OPT2 can be reduced to 14.25 ms, due to 1.75 ms trailing zeroes */ +#ifdef SUBSET_NB +RAM_ALIGN const Word16 PhECU_preTdaFx16ms_NB_Q14[128] = { + -22591, -21465, -18295, -14331, -10544, -7321, -4690, -2561, -811, 662, 1942, 3090, 4148, 5146, 6107, 7043, + 7961, 8868, 9761, 10640, 11502, 12345, 13164, 13959, 14731, 15423, 15970, 16374, 16642, 16789, 16837, 16810, + 16735, 16637, 16537, 16441, 16366, 16307, 16263, 16230, 16206, 16190, 16181, 16177, 16178, 16182, 16188, 16196, + 16203, 16209, 16214, 16218, 16219, 16221, 16222, 16226, 16230, 16238, 16251, 16267, 16287, 16312, 16339, 16369, + 16399, 16429, 16456, 16481, 16502, 16518, 16531, 16539, 16544, 16547, 16548, 16550, 16552, 16556, 16561, 16567, + 16575, 16582, 16588, 16592, 16593, 16589, 16580, 16564, 16540, 16506, 16461, 16402, 16327, 16232, 16095, 15907, + 15641, 15272, 14775, 14130, 13325, 12361, 11251, 10017, 8694, 7354, 6057, 4825, 3684, 2665, 1795, 1095, + 575, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#else +#define PhECU_preTdaFx16ms_NB_Q14 NULL +#endif +#ifdef SUBSET_WB +RAM_ALIGN const Word16 PhECU_preTdaFx16ms_WB_Q14[256] = { + -22528, -22351, -21532, -20186, -18475, -16565, -14596, -12673, -10858, -9181, -7654, -6277, -5037, -3923, -2914, + -2001, -1169, -405, 303, 961, 1580, 2166, 2725, 3263, 3781, 4285, 4778, 5262, 5739, 6211, + 6677, 7140, 7601, 8059, 8514, 8968, 9419, 9868, 10314, 10756, 11195, 11630, 12060, 12486, 12907, + 13322, 13733, 14137, 14537, 14917, 15263, 15573, 15847, 16085, 16286, 16454, 16587, 16689, 16763, 16810, + 16833, 16836, 16822, 16795, 16757, 16712, 16663, 16612, 16565, 16511, 16464, 16421, 16383, 16350, 16321, + 16295, 16272, 16253, 16237, 16223, 16211, 16201, 16194, 16187, 16183, 16180, 16178, 16177, 16178, 16179, + 16181, 16184, 16187, 16190, 16194, 16198, 16201, 16204, 16208, 16210, 16213, 16215, 16217, 16218, 16219, + 16220, 16221, 16222, 16222, 16223, 16225, 16227, 16229, 16232, 16236, 16241, 16247, 16255, 16262, 16272, + 16282, 16293, 16305, 16319, 16332, 16347, 16361, 16376, 16391, 16407, 16422, 16436, 16450, 16463, 16475, + 16487, 16497, 16506, 16514, 16522, 16528, 16533, 16537, 16541, 16543, 16545, 16546, 16547, 16548, 16549, + 16550, 16550, 16551, 16553, 16555, 16557, 16560, 16563, 16566, 16569, 16573, 16577, 16580, 16584, 16587, + 16589, 16592, 16593, 16593, 16593, 16591, 16588, 16583, 16577, 16569, 16559, 16547, 16532, 16516, 16496, + 16474, 16448, 16418, 16385, 16347, 16305, 16258, 16205, 16134, 16054, 15960, 15849, 15716, 15560, 15376, + 15161, 14913, 14628, 14306, 13944, 13541, 13098, 12616, 12097, 11540, 10952, 10335, 9692, 9030, 8362, + 7699, 7045, 6400, 5769, 5155, 4560, 3990, 3448, 2936, 2460, 2022, 1625, 1272, 963, 700, + 481, 306, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0}; +#else +#define PhECU_preTdaFx16ms_WB_Q14 NULL +#endif +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 PhECU_preTdaFx16ms_ssWB_Q14[384] = { + -22499, -22471, -22152, -21551, -20715, -19688, -18527, -17277, -15982, -14679, -13393, -12145, -10954, -9826, + -8760, -7763, -6831, -5958, -5149, -4394, -3688, -3029, -2410, -1831, -1285, -769, -279, 186, + 630, 1055, 1462, 1856, 2236, 2606, 2966, 3317, 3662, 3999, 4330, 4658, 4981, 5301, + 5618, 5933, 6246, 6556, 6866, 7175, 7481, 7788, 8093, 8398, 8702, 9004, 9306, 9606, + 9906, 10205, 10502, 10798, 11092, 11385, 11676, 11965, 12252, 12537, 12820, 13101, 13379, 13655, + 13929, 14200, 14470, 14732, 14977, 15208, 15422, 15622, 15804, 15970, 16121, 16256, 16374, 16478, + 16567, 16643, 16703, 16753, 16789, 16815, 16830, 16837, 16835, 16825, 16810, 16789, 16764, 16735, + 16704, 16671, 16637, 16604, 16575, 16538, 16503, 16471, 16441, 16414, 16389, 16366, 16345, 16325, + 16307, 16291, 16276, 16263, 16250, 16239, 16230, 16221, 16213, 16206, 16200, 16195, 16190, 16187, + 16184, 16181, 16180, 16178, 16178, 16178, 16178, 16178, 16180, 16181, 16182, 16185, 16187, 16189, + 16191, 16193, 16195, 16198, 16200, 16202, 16205, 16207, 16208, 16211, 16213, 16214, 16215, 16217, + 16217, 16218, 16219, 16219, 16220, 16221, 16221, 16221, 16222, 16223, 16224, 16224, 16226, 16227, + 16228, 16230, 16233, 16236, 16239, 16242, 16246, 16251, 16256, 16261, 16267, 16274, 16280, 16288, + 16295, 16304, 16312, 16321, 16330, 16339, 16349, 16359, 16369, 16379, 16389, 16399, 16409, 16419, + 16429, 16439, 16447, 16456, 16465, 16473, 16481, 16489, 16495, 16502, 16508, 16513, 16519, 16523, + 16527, 16531, 16534, 16536, 16539, 16541, 16543, 16544, 16545, 16546, 16547, 16547, 16548, 16549, + 16549, 16549, 16550, 16551, 16551, 16552, 16554, 16554, 16556, 16558, 16559, 16561, 16563, 16565, + 16567, 16570, 16572, 16575, 16578, 16580, 16582, 16584, 16586, 16588, 16590, 16591, 16592, 16593, + 16593, 16593, 16593, 16591, 16589, 16587, 16584, 16580, 16575, 16570, 16564, 16557, 16549, 16540, + 16530, 16519, 16506, 16493, 16478, 16461, 16443, 16423, 16402, 16379, 16354, 16327, 16297, 16266, + 16232, 16195, 16147, 16096, 16039, 15977, 15907, 15828, 15740, 15642, 15531, 15409, 15273, 15122, + 14956, 14775, 14577, 14362, 14130, 13879, 13611, 13325, 13021, 12700, 12361, 12006, 11636, 11250, + 10851, 10440, 10016, 9583, 9142, 8698, 8255, 7815, 7377, 6944, 6515, 6092, 5675, 5266, + 4865, 4475, 4094, 3726, 3370, 3029, 2703, 2393, 2101, 1826, 1571, 1334, 1117, 921, + 744, 588, 451, 335, 235, 128, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0}; +#else +#define PhECU_preTdaFx16ms_ssWB_Q14 NULL +#endif +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 PhECU_preTdaFx16ms_SWB_Q14[512] = { + -22482, -22492, -22345, -22020, -21560, -20952, -20236, -19434, -18551, -17624, -16665, -15691, -14716, -13753, + -12810, -11889, -11002, -10152, -9335, -8553, -7813, -7108, -6442, -5806, -5206, -4634, -4091, -3574, + -3084, -2618, -2173, -1748, -1341, -952, -578, -219, 128, 462, 786, 1099, 1405, 1701, + 1989, 2271, 2548, 2818, 3084, 3345, 3601, 3856, 4106, 4354, 4598, 4840, 5082, 5322, + 5559, 5795, 6029, 6263, 6496, 6729, 6961, 7192, 7422, 7652, 7882, 8111, 8339, 8567, + 8795, 9022, 9249, 9475, 9701, 9926, 10151, 10374, 10597, 10819, 11041, 11261, 11481, 11699, + 11917, 12133, 12349, 12563, 12776, 12988, 13198, 13408, 13616, 13823, 14028, 14233, 14437, 14635, + 14826, 15007, 15181, 15344, 15499, 15645, 15782, 15910, 16029, 16139, 16239, 16332, 16415, 16490, + 16557, 16615, 16667, 16710, 16747, 16777, 16800, 16818, 16829, 16835, 16837, 16834, 16827, 16816, + 16803, 16786, 16767, 16746, 16724, 16700, 16675, 16649, 16624, 16601, 16580, 16551, 16524, 16499, + 16475, 16453, 16431, 16411, 16392, 16374, 16358, 16342, 16328, 16313, 16301, 16289, 16278, 16268, + 16258, 16249, 16241, 16234, 16226, 16220, 16214, 16208, 16204, 16200, 16196, 16192, 16188, 16186, + 16184, 16182, 16181, 16179, 16178, 16178, 16177, 16177, 16177, 16178, 16179, 16180, 16181, 16181, + 16183, 16185, 16186, 16188, 16189, 16191, 16192, 16195, 16196, 16198, 16200, 16202, 16204, 16205, + 16207, 16208, 16210, 16211, 16212, 16213, 16215, 16215, 16216, 16217, 16218, 16219, 16219, 16219, + 16220, 16220, 16221, 16221, 16222, 16222, 16222, 16222, 16223, 16223, 16224, 16225, 16226, 16227, + 16228, 16230, 16231, 16233, 16235, 16238, 16240, 16243, 16245, 16249, 16253, 16256, 16260, 16264, + 16269, 16275, 16279, 16285, 16290, 16296, 16302, 16309, 16315, 16322, 16329, 16336, 16343, 16351, + 16358, 16365, 16373, 16381, 16388, 16396, 16403, 16411, 16418, 16425, 16432, 16439, 16446, 16453, + 16460, 16466, 16472, 16478, 16484, 16489, 16494, 16499, 16504, 16509, 16513, 16517, 16520, 16524, + 16527, 16529, 16532, 16534, 16536, 16538, 16540, 16541, 16543, 16543, 16544, 16545, 16546, 16547, + 16547, 16547, 16548, 16548, 16549, 16549, 16550, 16550, 16551, 16551, 16551, 16552, 16553, 16554, + 16555, 16555, 16557, 16558, 16559, 16560, 16562, 16563, 16565, 16566, 16569, 16570, 16572, 16573, + 16576, 16577, 16579, 16581, 16583, 16585, 16586, 16588, 16589, 16590, 16591, 16592, 16592, 16593, + 16593, 16593, 16592, 16592, 16591, 16590, 16589, 16586, 16585, 16581, 16578, 16575, 16571, 16566, + 16562, 16556, 16550, 16543, 16536, 16528, 16520, 16511, 16502, 16490, 16479, 16468, 16455, 16441, + 16426, 16411, 16394, 16376, 16357, 16337, 16316, 16294, 16270, 16245, 16219, 16191, 16154, 16115, + 16075, 16032, 15985, 15934, 15879, 15818, 15751, 15679, 15601, 15517, 15425, 15325, 15218, 15102, + 14978, 14845, 14703, 14551, 14390, 14219, 14038, 13847, 13645, 13434, 13213, 12982, 12741, 12490, + 12230, 11961, 11683, 11396, 11102, 10800, 10492, 10176, 9855, 9529, 9197, 8864, 8532, 8201, + 7872, 7544, 7218, 6894, 6573, 6255, 5940, 5629, 5322, 5020, 4723, 4432, 4147, 3868, + 3596, 3332, 3076, 2828, 2590, 2361, 2141, 1931, 1732, 1543, 1366, 1200, 1044, 901, + 768, 647, 536, 438, 349, 271, 201, 108, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; +#else +#define PhECU_preTdaFx16ms_SWB_Q14 NULL +#endif +#ifdef SUBSET_FB +RAM_ALIGN const Word16 PhECU_preTdaFx16ms_FB_Q14[768] = { + -22463, -22493, -22449, -22334, -22148, -21885, -21560, -21179, -20737, -20250, -19726, -19171, -18581, -17972, + -17340, -16701, -16050, -15401, -14757, -14114, -13474, -12848, -12237, -11637, -11048, -10478, -9922, -9386, + -8864, -8357, -7865, -7393, -6936, -6493, -6069, -5654, -5258, -4874, -4503, -4144, -3801, -3465, + -3140, -2829, -2524, -2230, -1944, -1667, -1399, -1136, -884, -636, -395, -158, 72, 296, + 514, 728, 938, 1144, 1346, 1545, 1739, 1931, 2119, 2305, 2489, 2670, 2849, 3025, + 3199, 3373, 3543, 3713, 3879, 4046, 4211, 4376, 4539, 4700, 4862, 5022, 5182, 5341, + 5499, 5657, 5814, 5970, 6126, 6282, 6437, 6592, 6746, 6901, 7056, 7209, 7362, 7517, + 7669, 7823, 7976, 8129, 8281, 8433, 8585, 8738, 8890, 9040, 9193, 9343, 9495, 9645, + 9796, 9946, 10096, 10245, 10395, 10543, 10693, 10841, 10989, 11137, 11284, 11431, 11578, 11723, + 11869, 12014, 12159, 12303, 12446, 12589, 12733, 12874, 13016, 13157, 13298, 13438, 13577, 13716, + 13855, 13992, 14129, 14266, 14403, 14537, 14667, 14795, 14918, 15037, 15152, 15263, 15371, 15474, + 15573, 15669, 15760, 15847, 15931, 16010, 16084, 16156, 16223, 16287, 16346, 16402, 16453, 16502, + 16546, 16587, 16625, 16659, 16690, 16717, 16742, 16763, 16781, 16797, 16810, 16819, 16827, 16833, + 16836, 16837, 16836, 16833, 16828, 16822, 16815, 16805, 16794, 16783, 16770, 16756, 16743, 16727, + 16712, 16695, 16679, 16663, 16645, 16629, 16612, 16598, 16584, 16565, 16546, 16529, 16511, 16495, + 16479, 16463, 16449, 16434, 16420, 16408, 16395, 16383, 16371, 16360, 16350, 16339, 16329, 16321, + 16311, 16303, 16295, 16287, 16280, 16272, 16266, 16260, 16253, 16247, 16242, 16237, 16232, 16227, + 16223, 16219, 16215, 16211, 16207, 16205, 16202, 16199, 16196, 16194, 16191, 16189, 16187, 16186, + 16184, 16183, 16181, 16180, 16180, 16179, 16178, 16178, 16177, 16177, 16177, 16177, 16177, 16177, + 16178, 16178, 16179, 16179, 16180, 16181, 16182, 16183, 16184, 16185, 16186, 16187, 16188, 16189, + 16190, 16191, 16193, 16194, 16195, 16196, 16197, 16199, 16200, 16201, 16202, 16203, 16205, 16206, + 16206, 16207, 16208, 16209, 16210, 16211, 16212, 16212, 16213, 16214, 16215, 16215, 16216, 16216, + 16217, 16218, 16218, 16218, 16219, 16219, 16219, 16220, 16220, 16220, 16221, 16221, 16221, 16221, + 16221, 16222, 16222, 16222, 16223, 16223, 16223, 16224, 16224, 16225, 16225, 16226, 16227, 16227, + 16228, 16229, 16230, 16231, 16233, 16234, 16235, 16237, 16237, 16239, 16241, 16243, 16245, 16247, + 16249, 16252, 16254, 16257, 16260, 16263, 16266, 16268, 16271, 16275, 16278, 16282, 16286, 16290, + 16294, 16298, 16301, 16305, 16310, 16314, 16319, 16323, 16328, 16332, 16337, 16342, 16347, 16352, + 16357, 16361, 16366, 16371, 16377, 16382, 16387, 16391, 16396, 16402, 16407, 16412, 16417, 16421, + 16426, 16431, 16436, 16441, 16445, 16450, 16454, 16458, 16463, 16467, 16471, 16475, 16480, 16482, + 16486, 16490, 16494, 16497, 16500, 16504, 16507, 16510, 16511, 16514, 16517, 16519, 16522, 16524, + 16526, 16528, 16530, 16532, 16533, 16535, 16536, 16538, 16539, 16540, 16541, 16542, 16542, 16543, + 16543, 16544, 16545, 16545, 16546, 16546, 16546, 16547, 16547, 16547, 16548, 16548, 16548, 16548, + 16549, 16549, 16549, 16549, 16550, 16550, 16550, 16551, 16551, 16551, 16552, 16552, 16553, 16554, + 16554, 16555, 16556, 16556, 16557, 16558, 16559, 16560, 16561, 16562, 16563, 16564, 16565, 16566, + 16567, 16568, 16570, 16571, 16572, 16572, 16574, 16575, 16576, 16577, 16579, 16580, 16581, 16582, + 16583, 16585, 16586, 16587, 16588, 16589, 16589, 16590, 16591, 16592, 16592, 16593, 16593, 16593, + 16593, 16593, 16593, 16593, 16593, 16592, 16592, 16591, 16590, 16589, 16588, 16586, 16585, 16583, + 16581, 16579, 16576, 16574, 16572, 16569, 16566, 16562, 16559, 16555, 16551, 16546, 16542, 16538, + 16533, 16527, 16521, 16515, 16510, 16503, 16496, 16489, 16481, 16474, 16465, 16457, 16448, 16439, + 16428, 16419, 16408, 16396, 16385, 16373, 16360, 16347, 16333, 16320, 16305, 16290, 16274, 16258, + 16240, 16223, 16205, 16186, 16160, 16134, 16109, 16082, 16054, 16024, 15993, 15961, 15926, 15888, + 15849, 15808, 15763, 15717, 15667, 15615, 15560, 15502, 15441, 15376, 15308, 15236, 15161, 15082, + 14999, 14913, 14822, 14727, 14628, 14525, 14417, 14306, 14190, 14069, 13944, 13814, 13679, 13541, + 13398, 13250, 13098, 12943, 12782, 12616, 12447, 12273, 12096, 11915, 11729, 11541, 11348, 11151, + 10952, 10749, 10543, 10335, 10123, 9909, 9692, 9473, 9253, 9032, 8810, 8589, 8369, 8149, + 7929, 7711, 7492, 7276, 7059, 6845, 6631, 6418, 6207, 5997, 5789, 5582, 5378, 5175, + 4975, 4777, 4583, 4389, 4200, 4012, 3827, 3646, 3468, 3294, 3123, 2956, 2793, 2634, + 2479, 2328, 2181, 2039, 1902, 1768, 1639, 1517, 1398, 1284, 1176, 1072, 973, 879, + 791, 707, 629, 556, 486, 423, 364, 310, 261, 213, 163, 85, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#else +#define PhECU_preTdaFx16ms_FB_Q14 NULL +#endif + +RAM_ALIGN const Word16 *const PhECU_wins[5][3] = { + /* 3ms hamm(left part) , 16ms(center IWHR(periodic)*MDCT-anaQ14) , 2ms(initial MDCT-ana in Q14) */ + /*8 kHz*/ {PhECU_whr16ms_NB_Q15, PhECU_preTdaFx16ms_NB_Q14, PhECU_preTdaFx16ms_128_pre_Q14}, + /*16 kHz*/ {PhECU_whr16ms_WB_Q15, PhECU_preTdaFx16ms_WB_Q14, PhECU_preTdaFx16ms_256_pre_Q14}, + /*24 kHz*/ {PhECU_whr16ms_ssWB_Q15, PhECU_preTdaFx16ms_ssWB_Q14, PhECU_preTdaFx16ms_384_pre_Q14}, + /*32 kHz*/ {PhECU_whr16ms_SWB_Q15, PhECU_preTdaFx16ms_SWB_Q14, PhECU_preTdaFx16ms_512_pre_Q14}, + /*48 kHz*/ {PhECU_whr16ms_FB_Q15, PhECU_preTdaFx16ms_FB_Q14, PhECU_preTdaFx16ms_768_pre_Q14}}; + +/* x=(0:(5*8-1))*(2*pi)/32; y=sin(x);y_int=max(-32768,min(32767,round(y*32768))), y_int/32768 */ +/* 1.25 *2*pi table for low complex and low angle resolution rand_phase_fx */ +RAM_ALIGN const Word16 sincos_lowres_tab_sinQ15_fx[40] = { + 0, 6393, 12540, 18205, 23170, 27246, 30274, 32138, 32767, 32138, 30274, 27246, 23170, 18205, + 12540, 6393, 0, -6393, -12540, -18205, -23170, -27246, -30274, -32138, -32768, -32138, -30274, -27246, + -23170, -18205, -12540, -6393, 0, 6393, 12540, 18205, 23170, 27246, 30274, 32138}; + +/* (PHECU_LA_48K == 0) */ + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 w_new_fs_8_LA_0[OLA_LEN_8K] = {0, 411, 1623, 3574, 6169, 9275, 12738, + 16384, 20030, 23493, 26599, 29194, 31145, 32357}; + + +RAM_ALIGN const Word16 w_old_fs_8_LA_0[OLA_LEN_8K] = { + + /* ( 32768-fliplr(w_new_fs_8_LA_0) ) *[whr3ms(0:13)*/ + 2621, 2721, 3001, 3401, 3836, 4205, 4411, 4377, 4063, 3475, 2673, 1766, 901, 253}; +#else +#define w_new_fs_8_LA_0 NULL +#define w_old_fs_8_LA_0 NULL +#endif /* SUBSET_NB */ + +#ifdef SUBSET_WB +RAM_ALIGN const Word16 w_new_fs_16_LA_0[OLA_LEN_16K] = { + 0, 103, 411, 919, 1623, 2511, 3574, 4799, 6169, 7667, 9275, 10973, 12738, 14550, + 16384, 18218, 20030, 21795, 23493, 25101, 26599, 27969, 29194, 30257, 31145, 31849, 32357, 32665}; + +RAM_ALIGN const Word16 w_old_fs_16_LA_0[OLA_LEN_16K] = {2621, 2646, 2719, 2835, 2990, 3175, 3379, 3592, 3801, 3994, + 4158, 4282, 4355, 4369, 4317, 4196, 4005, 3746, 3425, 3050, + 2635, 2192, 1740, 1299, 889, 531, 250, 66}; +#else +#define w_new_fs_16_LA_0 NULL +#define w_old_fs_16_LA_0 NULL +#endif /* SUBSET_WB */ + +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 w_new_fs_24_LA_0[OLA_LEN_24K] = { + 0, 46, 183, 411, 728, 1133, 1623, 2195, 2847, 3574, 4374, 5240, 6169, 7155, + 8192, 9275, 10398, 11555, 12738, 13942, 15160, 16384, 17608, 18826, 20030, 21213, 22370, 23493, + 24576, 25613, 26599, 27528, 28394, 29194, 29921, 30573, 31145, 31635, 32040, 32357, 32585, 32722}; + +RAM_ALIGN const Word16 w_old_fs_24_LA_0[OLA_LEN_24K] = { + 2621, 2632, 2665, 2718, 2790, 2881, 2987, 3106, 3235, 3372, 3512, 3653, 3790, 3919, + 4038, 4143, 4229, 4295, 4337, 4353, 4340, 4298, 4225, 4121, 3986, 3821, 3628, 3408, + 3165, 2902, 2622, 2330, 2032, 1732, 1437, 1152, 884, 640, 426, 249, 114, 30}; +#else +#define w_new_fs_24_LA_0 NULL +#define w_old_fs_24_LA_0 NULL +#endif /* SUBSET_SSWB */ + +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 w_new_fs_32_LA_0[OLA_LEN_32K] = { + 0, 26, 103, 231, 411, 640, 919, 1247, 1623, 2044, 2511, 3022, 3574, 4167, + 4799, 5467, 6169, 6903, 7667, 8459, 9275, 10114, 10973, 11848, 12738, 13640, 14550, 15465, + 16384, 17303, 18218, 19128, 20030, 20920, 21795, 22654, 23493, 24309, 25101, 25865, 26599, 27301, + 27969, 28601, 29194, 29746, 30257, 30724, 31145, 31521, 31849, 32128, 32357, 32537, 32665, 32742}; + +RAM_ALIGN const Word16 w_old_fs_32_LA_0[OLA_LEN_32K] = { + 2621, 2628, 2646, 2676, 2717, 2770, 2832, 2904, 2985, 3073, 3167, 3266, 3368, 3473, 3578, 3682, 3784, 3882, 3974, + 4059, 4135, 4202, 4257, 4299, 4328, 4342, 4340, 4323, 4288, 4236, 4167, 4081, 3977, 3856, 3719, 3567, 3400, 3220, + 3028, 2826, 2615, 2398, 2176, 1952, 1728, 1506, 1290, 1081, 882, 697, 528, 377, 248, 143, 65, 17}; +#else +#define w_new_fs_32_LA_0 NULL +#define w_old_fs_32_LA_0 NULL +#endif /* SUBSET_SWB */ + +#ifdef SUBSET_FB +RAM_ALIGN const Word16 w_new_fs_48_LA_0[OLA_LEN_48K] = { + 0, 11, 46, 103, 183, 286, 411, 558, 728, 919, 1133, 1367, 1623, 1899, + 2195, 2511, 2847, 3201, 3574, 3965, 4374, 4799, 5240, 5697, 6169, 6655, 7155, 7667, + 8192, 8728, 9275, 9832, 10398, 10973, 11555, 12144, 12738, 13338, 13942, 14550, 15160, 15771, + 16384, 16997, 17608, 18218, 18826, 19430, 20030, 20624, 21213, 21795, 22370, 22936, 23493, 24040, + 24576, 25101, 25613, 26113, 26599, 27071, 27528, 27969, 28394, 28803, 29194, 29567, 29921, 30257, + 30573, 30869, 31145, 31401, 31635, 31849, 32040, 32210, 32357, 32482, 32585, 32665, 32722, 32757}; + +RAM_ALIGN const Word16 w_old_fs_48_LA_0[OLA_LEN_48K] = { + 2621, 2624, 2632, 2646, 2664, 2688, 2717, 2750, 2789, 2831, 2878, 2929, 2983, 3041, 3101, 3164, 3229, + 3296, 3365, 3434, 3504, 3573, 3643, 3711, 3778, 3844, 3907, 3967, 4024, 4078, 4128, 4173, 4213, 4248, + 4278, 4301, 4319, 4330, 4334, 4331, 4321, 4303, 4278, 4246, 4206, 4158, 4102, 4038, 3967, 3889, 3803, + 3710, 3611, 3505, 3392, 3274, 3150, 3021, 2888, 2750, 2609, 2465, 2319, 2171, 2022, 1873, 1724, 1576, + 1430, 1287, 1147, 1011, 880, 755, 637, 527, 424, 331, 248, 175, 114, 65, 29, 7}; +#else +#define w_new_fs_48_LA_0 NULL +#define w_old_fs_48_LA_0 NULL +#endif /* SUBSET_FB */ + +RAM_ALIGN const Word16 *const w_new[5] = {w_new_fs_8_LA_0, w_new_fs_16_LA_0, w_new_fs_24_LA_0, w_new_fs_32_LA_0, + w_new_fs_48_LA_0}; +RAM_ALIGN const Word16 *const w_old[5] = {w_old_fs_8_LA_0, w_old_fs_16_LA_0, w_old_fs_24_LA_0, w_old_fs_32_LA_0, + w_old_fs_48_LA_0}; + +RAM_ALIGN const Word16 COPY_LEN[5] = {COPY_LEN_8K, COPY_LEN_16K, COPY_LEN_24K, COPY_LEN_32K, COPY_LEN_48K}; /* 2ms */ +RAM_ALIGN const Word16 OLA_LEN[5] = {OLA_LEN_8K, OLA_LEN_16K, OLA_LEN_24K, OLA_LEN_32K, OLA_LEN_48K}; /*1.75 ms mix */ + +RAM_ALIGN const Word16 num_FsByResQ0[5] = {LPROT8K, LPROT16K, LPROT24K, LPROT32K, LPROT48K}; +RAM_ALIGN const Word16 *const LprotSzPtr = num_FsByResQ0; +RAM_ALIGN const Word16 InvLprot_Q22[5] = {INV_LPROT8K_Q22, INV_LPROT16K_Q22, INV_LPROT24K_Q22, INV_LPROT32K_Q22, + INV_LPROT48K_Q22}; +RAM_ALIGN const Word16 PhEcuFftScale[5] = {0, 0, 8, 0, 4}; + +RAM_ALIGN const Word16 oneOverFrameQ15Tab[5] = {INV_L_FRAME8K_Q15, INV_L_FRAME16K_Q15, INV_L_FRAME24K_Q15, + INV_L_FRAME32K_Q15, INV_L_FRAME48K_Q15}; + + +RAM_ALIGN const Word16 PhEcu_Xsav_Flt2FxDnShift[5] = {6, 7, 7, 8, 8}; /* TOTAL FFT adjutmenst shift */ +RAM_ALIGN const Word16 PhEcu_Xsav_Flt2FxScaleQ15[5] = {32767, 32767, 21845, 32767, + 21845}; /* fractional fft adjustment 1./ fft_fs_scale */ + +RAM_ALIGN const Word16 PhEcu_frac_thr_rise_lin_Q15[MAX_LGW] = {3277, 3277, 3277, 3277, 3277, + 3277, 3277, 3277, 3277}; /* for now all fixed to 10dB */ +RAM_ALIGN const Word16 PhEcu_frac_thr_decay_lin_Q15[MAX_LGW] = { + 3277, 3277, 3277, 3277, 3277, + 3277, 3277, 3277, 3277}; /* thresh_rise_dB=10; thresh_lin = 1.0/( 10^(thresh_rise_dB/10) ); */ + +RAM_ALIGN const Word16 mdct_grp_bins_fx[MAX_LGW + 2] = {4, 14, 24, 44, 84, 164, 244, 324, 404, 484}; +RAM_ALIGN const Word16 xavg_N_grp_fx[5] = {4, 5, 6, 7, 8}; + + +RAM_ALIGN const Word16 spec_shape_headroom[5] = {3, 4, 4, 4, 4}; +RAM_ALIGN const Word16 rectLengthTab[NUM_SAMP_FREQ] = {80, 160, 240, 320, 480, 960}; /* 10ms */ +RAM_ALIGN const Word16 hamm_len2Tab[5] = {24, 48, 72, 96, 144}; /* 3 ms*/ + +RAM_ALIGN const Word16 PLC_FADEOUT_TYPE_2_SELECTOR = 10; /* can take values from 0 to 10, default is 10 for longer fadeout*/ + +RAM_ALIGN const Word16 NN_thresh = 0x7800; /* 30*2^10 */ +RAM_ALIGN const Word16 NN_thresh_exp = -10; +/* Tone detector */ +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word32 TD_HR_thresh_10ms = 83402; +RAM_ALIGN const Word32 TD_HR_thresh_7_5ms = 743496; +RAM_ALIGN const Word32 TD_HR_thresh_5ms = 382564; +RAM_ALIGN const Word32 TD_HR_thresh_2_5ms = 301695; +#endif /* ENABLE_HR_MODE */ +RAM_ALIGN const Word32 BW_thresh_quiet[4] = {0x14000000, 0xA000000, 0xA000000, 0xA000000}; /* [20,10,10,10]*2^24 */ +RAM_ALIGN const Word16 BW_thresh_quiet_exp = 31 - 24; +RAM_ALIGN const Word16 BW_thresh_brickwall[4] = { + 1036, 164, 327, 327}; /* (1/(10^(ctrl.BW_thresh_brickwall/10))*2^15) with [15,23,20,20] dB*/ + +RAM_ALIGN const Word16 BW_brickwall_dist[4] = {4, 4, 3, 1}; +RAM_ALIGN const Word16 BW_warp_idx_start_16k[4] = { + 53, 0, 0, 0}; /* indices for warped bands, with an offset of [17,23,23,23] bins for the start_idx */ +RAM_ALIGN const Word16 BW_warp_idx_stop_16k[4] = { + 63, 0, 0, + 0}; /*'-1' since this is not matlab and another '-1' because of the different formatting of acc_coeff_per_band*/ +RAM_ALIGN const Word16 BW_warp_idx_start_24k[4] = {47, 59, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_stop_24k[4] = {56, 63, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_start_32k[4] = {44, 54, 60, 0}; +RAM_ALIGN const Word16 BW_warp_idx_stop_32k[4] = {52, 59, 63, 0}; +RAM_ALIGN const Word16 BW_warp_idx_start_48k[4] = {41, 51, 57, 61}; +RAM_ALIGN const Word16 BW_warp_idx_stop_48k[4] = {49, 55, 60, 63}; +RAM_ALIGN const Word16 *const BW_warp_idx_start_all[MAX_BW_BANDS_NUMBER - 1] = { + BW_warp_idx_start_16k, BW_warp_idx_start_24k, BW_warp_idx_start_32k, BW_warp_idx_start_48k}; +RAM_ALIGN const Word16 *const BW_warp_idx_stop_all[MAX_BW_BANDS_NUMBER - 1] = { + BW_warp_idx_stop_16k, BW_warp_idx_stop_24k, BW_warp_idx_stop_32k, BW_warp_idx_stop_48k}; + +RAM_ALIGN const Word16 BW_brickwall_dist_5ms[4] = {4, 4, 3, 1}; +RAM_ALIGN const Word16 BW_warp_idx_start_16k_5ms[4] = {39, 0, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_stop_16k_5ms[4] = {49, 0, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_start_24k_5ms[4] = {35, 47, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_stop_24k_5ms[4] = {44, 51, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_start_32k_5ms[4] = {34, 44, 50, 0}; +RAM_ALIGN const Word16 BW_warp_idx_stop_32k_5ms[4] = {42, 49, 53, 0}; +RAM_ALIGN const Word16 BW_warp_idx_start_48k_5ms[4] = {32, 42, 48, 52}; +RAM_ALIGN const Word16 BW_warp_idx_stop_48k_5ms[4] = {40, 46, 51, 54}; +RAM_ALIGN const Word16 *const BW_warp_idx_start_all_5ms[MAX_BW_BANDS_NUMBER - 1] = { + BW_warp_idx_start_16k_5ms, BW_warp_idx_start_24k_5ms, BW_warp_idx_start_32k_5ms, BW_warp_idx_start_48k_5ms}; +RAM_ALIGN const Word16 *const BW_warp_idx_stop_all_5ms[MAX_BW_BANDS_NUMBER - 1] = { + BW_warp_idx_stop_16k_5ms, BW_warp_idx_stop_24k_5ms, BW_warp_idx_stop_32k_5ms, BW_warp_idx_stop_48k_5ms}; + +RAM_ALIGN const Word16 BW_brickwall_dist_2_5ms[4] = {4, 4, 3, 1}; +RAM_ALIGN const Word16 BW_warp_idx_start_16k_2_5ms[4] = {24, 0, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_stop_16k_2_5ms[4] = {34, 0, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_start_24k_2_5ms[4] = {24, 35, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_stop_24k_2_5ms[4] = {32, 39, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_start_32k_2_5ms[4] = {24, 33, 39, 0}; +RAM_ALIGN const Word16 BW_warp_idx_stop_32k_2_5ms[4] = {31, 38, 42, 0}; +RAM_ALIGN const Word16 BW_warp_idx_start_48k_2_5ms[4] = {22, 31, 37, 41}; +RAM_ALIGN const Word16 BW_warp_idx_stop_48k_2_5ms[4] = {29, 35, 40, 43}; +RAM_ALIGN const Word16 *const BW_warp_idx_start_all_2_5ms[MAX_BW_BANDS_NUMBER - 1] = { + BW_warp_idx_start_16k_2_5ms, BW_warp_idx_start_24k_2_5ms, BW_warp_idx_start_32k_2_5ms, BW_warp_idx_start_48k_2_5ms}; +RAM_ALIGN const Word16 *const BW_warp_idx_stop_all_2_5ms[MAX_BW_BANDS_NUMBER - 1] = { + BW_warp_idx_stop_16k_2_5ms, BW_warp_idx_stop_24k_2_5ms, BW_warp_idx_stop_32k_2_5ms, BW_warp_idx_stop_48k_2_5ms}; + +RAM_ALIGN const Word16 BW_brickwall_dist_7_5ms[4] = {4, 4, 3, 2}; +RAM_ALIGN const Word16 BW_warp_idx_start_16k_7_5ms[4] = {51, 0, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_stop_16k_7_5ms[4] = {63, 0, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_start_24k_7_5ms[4] = {45, 58, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_stop_24k_7_5ms[4] = {55, 63, 0, 0}; +RAM_ALIGN const Word16 BW_warp_idx_start_32k_7_5ms[4] = {42, 53, 60, 0}; +RAM_ALIGN const Word16 BW_warp_idx_stop_32k_7_5ms[4] = {51, 58, 63, 0}; +RAM_ALIGN const Word16 BW_warp_idx_start_48k_7_5ms[4] = {40, 51, 57, 61}; +RAM_ALIGN const Word16 BW_warp_idx_stop_48k_7_5ms[4] = {48, 55, 60, 63}; +RAM_ALIGN const Word16 *const BW_warp_idx_start_all_7_5ms[] = { + BW_warp_idx_start_16k_7_5ms, BW_warp_idx_start_24k_7_5ms, BW_warp_idx_start_32k_7_5ms, BW_warp_idx_start_48k_7_5ms}; +RAM_ALIGN const Word16 *const BW_warp_idx_stop_all_7_5ms[] = { + BW_warp_idx_stop_16k_7_5ms, BW_warp_idx_stop_24k_7_5ms, BW_warp_idx_stop_32k_7_5ms, BW_warp_idx_stop_48k_7_5ms}; + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 BW_cutoff_bin_all[] = {80, 160, 240, 320, 400, 400}; +RAM_ALIGN const Word16 BW_cutoff_bin_all_HR[] = {80, 160, 240, 320, 400, 400}; +RAM_ALIGN const Word16 BW_cutoff_bits_all[] = {0, 1, 2, 2, 3, 0}; +#else /* ENABLE_HR_MODE */ +RAM_ALIGN const Word16 BW_cutoff_bin_all[] = {80, 160, 240, 320, 400}; +RAM_ALIGN const Word16 BW_cutoff_bits_all[] = {0, 1, 2, 2, 3}; +#endif /* ENABLE_HR_MODE */ + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 LowDelayShapes_n960_len[6] = {130, 260, 390, 520, 780, 1560}; +#else +RAM_ALIGN const Word16 LowDelayShapes_n960_len[5] = {130, 260, 390, 520, 780}; +#endif +RAM_ALIGN const Word16 LowDelayShapes_n960_la_zeroes[NUM_SAMP_FREQ] = {30, + 60, + 90, + 120, + 180 +#ifdef ENABLE_HR_MODE + , 360 +#endif +}; + +#ifdef ENABLE_HR_MODE +const Word16 LowDelayShapes_n960_len_7_5ms[6] = {106, 212, 318, 424, 636, 1272}; +#else +const Word16 LowDelayShapes_n960_len_7_5ms[5] = {106, 212, 318, 424, 636}; +#endif +const Word16 LowDelayShapes_n960_la_zeroes_7_5ms[NUM_SAMP_FREQ] = {14, 28, 42, 56, 84 +#ifdef ENABLE_HR_MODE + , 168 +#endif +}; +#ifdef ENABLE_HR_MODE +#ifdef SUBSET_NB +const Word32 MDCT_WINDOW_FS_8000_frame_ms_75[106] = { + 4627440, 11253200, 21594770, 36220454, 55523513, 79715027, 108949241, 143324500, 182870991, + 227518888, 277136190, 331449220, 390143896, 452770029, 518831181, 587821768, 659169189, 732247130, + 806397033, 880930033, 955136210, 1028289061, 1099721013, 1168761191, 1234831373, 1297335398, 1355817068, + 1409866562, 1459158403, 1503372583, 1542341368, 1575958063, 1604141948, 1626962506, 1644516439, 1657006271, + 1664740913, 1668084651, 1667510566, 1663566793, 1656808751, 1647805301, 1637186879, 1625507591, 1613355502, + 1601336341, 1590266842, 1579708994, 1571001708, 1564080946, 1558867236, 1555257286, 1553127519, 1552339115, + 1552734517, 1554146897, 1556401387, 1559318893, 1562715844, 1566405205, -1570197717, -1573904742, -1577333468, + -1580290211, -1582582625, -1584022156, -1584425628, -1583621336, -1581452727, -1577790475, -1572531065, -1565603566, + -1556974029, -1546637213, -1533223967, -1517247857, -1497930249, -1474813741, -1447477329, -1415559391, -1378853853, + -1337198324, -1290524957, -1238912889, -1182546000, -1121735805, -1056935470, -988679598, -917579357, -844370566, + -769774729, -694577976, -619621377, -545775321, -473935196, -404978161, -339758802, -279035319, -223452287, + -173535871, -129697804, -92268521, -61482210, -37424210, -19913685, -8400842}; +#else +#define MDCT_WINDOW_FS_8000_frame_ms_75 NULL +#endif +#ifdef SUBSET_WB +const Word32 MDCT_WINDOW_FS_16000_frame_ms_75[212] = { + 2448850, 4225281, 6560055, 9518849, 13169928, 17558685, 22724572, 28709046, 35532706, + 43206772, 51759643, 61197652, 71531905, 82773688, 94926633, 107995294, 121978042, 136866522, + 152653815, 169326944, 186873869, 205260070, 224464206, 244469708, 265226672, 286694090, 308842566, + 331620399, 354982140, 378884306, 403282899, 428126460, 453358062, 478925896, 504771155, 530831178, + 557056009, 583378298, 609738583, 636071404, 662314239, 688406753, 714278048, 739869110, 765133864, + 789997902, 814413107, 838333634, 861699657, 884456686, 906561215, 927970820, 948653245, 968562870, + 987675635, 1005965699, 1023398499, 1039938064, 1055570884, 1070287165, 1084066983, 1096897234, 1108786027, + 1119713468, 1129673618, 1138691939, 1146759882, 1153881756, 1160087929, 1165385723, 1169796304, 1173355296, + 1176085471, 1178017803, 1179194996, 1179657892, 1179448026, 1178622117, 1177223060, 1175290297, 1172896803, + 1170081494, 1166887472, 1163391971, 1159633509, 1155652038, 1151518603, 1147273273, 1142969676, 1138666561, + 1134412515, 1130255869, 1126558117, 1122496331, 1118765157, 1115363902, 1112285558, 1109526458, 1107080797, + 1104939816, 1103098430, 1101543766, 1100269289, 1099261964, 1098510648, 1098002762, 1097726182, 1097665183, + 1097807233, 1098135900, 1098637579, 1099295163, 1100094642, 1101018650, 1102052611, 1103178569, 1104381936, + 1105644852, 1106951761, 1108284322, -1109627660, -1110963442, -1112276637, -1113548581, -1114763260, -1115902204, + -1116950143, -1117888308, -1118701309, -1119370903, -1119882282, -1120217558, -1120362527, -1120300271, -1120018073, + -1119500244, -1118735095, -1117710865, -1116417682, -1114844247, -1112986355, -1110833953, -1108385410, -1105635984, + -1102584489, -1099232427, -1095578582, -1091628491, -1086655755, -1081531176, -1075887278, -1069676603, -1062851542, + -1055375495, -1047209387, -1038304906, -1028645771, -1018191542, -1006905821, -994788854, -981815515, -967960849, + -953236015, -937625018, -921120793, -903739802, -885489416, -866385515, -846456825, -825718325, -804213946, + -781984241, -759069751, -735509614, -711369811, -686704607, -661557703, -636008311, -610118476, -583941228, + -557562076, -531035554, -504439473, -477846967, -451338312, -424989596, -398869327, -373061710, -347653667, + -322717851, -298330826, -274560095, -251498346, -229196510, -207718889, -187124805, -167466055, -148790641, + -131139192, -114544857, -99042767, -84660988, -71425324, -59356162, -48470733, -38776535, -30272788, + -22943830, -16759108, -11669404, -7602417, -4461896 }; +#else +#define MDCT_WINDOW_FS_16000_frame_ms_75 NULL +#endif +#ifdef SUBSET_SSWB +const Word32 MDCT_WINDOW_FS_24000_frame_ms_75[318] = { + 3569045, 5343308, 7469087, 10008734, 12994076, 16456850, 20430606, 24935492, 29988837, + 35611849, 41823777, 48643571, 56071893, 64113030, 72783590, 82094564, 92046985, 102645585, + 113894977, 125803748, 138373328, 151602749, 165496877, 180058414, 195279760, 211161232, 227698398, + 244884561, 262716182, 281188032, 300290267, 320009308, 340323456, 361229416, 382724592, 404784463, + 427382077, 450499367, 474123138, 498236134, 522813796, 547827872, 573261791, 599094644, 625301687, + 651864990, 678758112, 705953149, 733423301, 761143017, 789088191, 817226769, 845526155, 873965021, + 902516713, 931147088, 959825021, 988524208, 1017210384, 1045855673, 1074425690, 1102896296, 1131233244, + 1159399102, 1187365932, 1215118091, 1242623432, 1269848445, 1296758792, 1323338775, 1349569176, 1375419011, + 1400856664, 1425860452, 1450405500, 1474469418, 1498033883, 1521084216, 1543600669, 1565562699, 1586950362, + 1607758181, 1627973678, 1647578495, 1666558705, 1684890994, 1702569411, 1719588669, 1735945131, 1751628259, + 1766631537, 1780942408, 1794568179, 1807511369, 1819759624, 1831304037, 1842145330, 1852303571, 1861781063, + 1870563512, 1878654482, 1886073254, 1892829269, 1898924017, 1904366694, 1909168622, 1913346034, 1916917451, + 1919887595, 1922277229, 1924098512, 1925377637, 1926138245, 1926390110, 1926159966, 1925475348, 1924365664, + 1922840889, 1920921471, 1918639476, 1916032510, 1913117957, 1909905898, 1906425851, 1902721668, 1898817211, + 1894724624, 1890460570, 1886061947, 1881561147, 1876974490, 1872321669, 1867634952, 1862942467, 1858269659, + 1853636539, 1849063935, 1844532585, 1840901848, 1836281978, 1831977326, 1827914309, 1824090826, 1820508133, + 1817156298, 1814036518, 1811148878, 1808486122, 1806045111, 1803824889, 1801820200, 1800024837, 1798435525, + 1797047955, 1795856425, 1794854508, 1794036436, 1793397182, 1792930395, 1792629275, 1792486811, 1792496288, + 1792650932, 1792943382, 1793366271, 1793912436, 1794574259, 1795343928, 1796214319, 1797177519, 1798225910, + 1799351580, 1800546365, 1801802795, 1803112835, 1804468826, 1805862173, 1807285016, 1808728934, 1810185719, + -1811649011, -1813108149, -1814556719, -1815986412, -1817388652, -1818755380, -1820077746, -1821347804, -1822557195, + -1823698097, -1824761958, -1825740466, -1826625594, -1827409009, -1828083190, -1828639928, -1829071236, -1829369628, + -1829527454, -1829537126, -1829391729, -1829084485, -1828608410, -1827956837, -1827123677, -1826104316, -1824893520, + -1823485537, -1821875510, -1820060164, -1818037432, -1815802468, -1813351581, -1810685587, -1807803281, -1804699559, + -1801376829, -1797838749, -1794078176, -1790099212, -1785902823, -1781420977, -1775757613, -1770414541, -1764657397, + -1758514553, -1751966917, -1744988832, -1737559493, -1729660865, -1721279216, -1712390301, -1702968220, -1693002531, + -1682487980, -1671402851, -1659722977, -1647435681, -1634547191, -1621051754, -1606928538, -1592163286, -1576765074, + -1560734340, -1544063625, -1526744164, -1508774562, -1490169863, -1470931267, -1451061598, -1430573380, -1409469788, + -1387774154, -1365486503, -1342628496, -1319212449, -1295268938, -1270814307, -1245866917, -1220443956, -1194576202, + -1168294208, -1141628864, -1114589888, -1087212858, -1059529377, -1031588154, -1003401722, -974995147, -946412027, + -917694623, -888859295, -859943075, -830987474, -802029563, -773092402, -744234412, -715477138, -686865195, + -658426713, -630207057, -602244426, -574581369, -547253226, -520293544, -493735699, -467628500, -441995738, + -416889401, -392319671, -368337811, -344954670, -322202233, -300117288, -278711744, -258020476, -238052276, + -218834457, -200381964, -182706579, -165829103, -149762124, -134517743, -120107705, -106542511, -93830987, + -81979923, -70993541, -60872925, -51615362, -43213756, -35655914, -28924065, -22994343, -17836407, + -13413907, -9700456, -6939916 }; +#else +#define MDCT_WINDOW_FS_24000_frame_ms_75 NULL +#endif +#ifdef SUBSET_SWB +const Word32 MDCT_WINDOW_FS_32000_frame_ms_75[424] = { + 2898737, 4022405, 5281441, 6723878, 8372060, 10235970, 12328606, 14657777, 17238266, + 20075996, 23180406, 26552429, 30204258, 34141418, 38374110, 42901881, 47726394, 52848657, + 58275464, 64009892, 70057240, 76417471, 83091786, 90080421, 97386522, 105014921, 112964415, + 121235754, 129827911, 138744722, 147986004, 157551876, 167437738, 177647147, 188174741, 199022831, + 210184946, 221662871, 233452811, 245554560, 257961285, 270671503, 283672733, 296964439, 310542664, + 324409414, 338557330, 352975270, 367652577, 382584217, 397764861, 413190770, 428852496, 444742036, + 460850489, 477166934, 493686689, 510401963, 527305552, 544386461, 561639986, 579055156, 596625027, + 614334635, 632177187, 650141962, 668224093, 686407908, 704684687, 723041108, 741470500, 759961912, + 778506953, 797092489, 815707619, 834339025, 852979862, 871616777, 890238991, 908834402, 927390921, + 945902091, 964354406, 982734524, 1001028580, 1019227984, 1037324578, 1055313224, 1073178103, 1090910419, + 1108493143, 1125919532, 1143183321, 1160279970, 1177195986, 1193922020, 1210443853, 1226757428, 1242848720, + 1258716966, 1274346305, 1289734310, 1304873724, 1319761111, 1334385677, 1348742053, 1362821420, 1376620057, + 1390134975, 1403361262, 1416296924, 1428929625, 1441257929, 1453270092, 1464967234, 1476341997, 1487396355, + 1498127704, 1508535547, 1518610856, 1528355951, 1537762901, 1546836443, 1555575202, 1563981756, 1572051527, + 1579779433, 1587162378, 1594203212, 1600912026, 1607289540, 1613333597, 1619037500, 1624404299, 1629439428, + 1634149881, 1638537653, 1642603536, 1646350593, 1649779860, 1652898979, 1655708955, 1658229426, 1660449352, + 1662377545, 1664024217, 1665388315, 1666481709, 1667311651, 1667891108, 1668216427, 1668300198, 1668150304, + 1667777789, 1667191944, 1666404102, 1665413150, 1664228568, 1662860495, 1661323561, 1659629730, 1657785817, + 1655794977, 1653662566, 1651401295, 1649028654, 1646557403, 1643989827, 1641331208, 1638586818, 1635770553, + 1632894967, 1629971201, 1627004437, 1624002536, 1620971847, 1617927153, 1614878122, 1611835451, 1608805100, + 1605795099, 1602815547, 1599884473, 1596942341, 1594771673, 1591702411, 1588839753, 1586088059, 1583448720, + 1580925703, 1578521775, 1576232766, 1574055288, 1571990953, 1570040827, 1568202332, 1566472498, 1564851004, + 1563337829, 1561931261, 1560628909, 1559429084, 1558330506, 1557331359, 1556429824, 1555624516, 1554913143, + 1554292592, 1553760945, 1553317125, 1552958916, 1552683122, 1552487276, 1552369480, 1552327252, 1552357490, + 1552457675, 1552625785, 1552859126, 1553154340, 1553508826, 1553920495, 1554386414, 1554903212, 1555468295, + 1556079427, 1556733719, 1557427851, 1558158741, 1558924090, 1559721218, 1560546581, 1561397206, 1562271110, + 1563165114, 1564075458, 1564999378, 1565934440, 1566877694, 1567825218, -1568775555, -1569724227, -1570669763, + -1571608214, -1572536583, -1573452385, -1574352788, -1575233942, -1576092574, -1576926600, -1577732933, -1578507896, + -1579248680, -1579952850, -1580617181, -1581238194, -1581812847, -1582338764, -1582813204, -1583232638, -1583593989, + -1583895045, -1584133086, -1584304626, -1584406873, -1584437736, -1584394635, -1584274418, -1584074588, -1583793268, + -1583428030, -1582975737, -1582434279, -1581802744, -1581079400, -1580261338, -1579346529, -1578333908, -1577222011, + -1576009429, -1574695339, -1573278552, -1571757228, -1570130264, -1568398303, -1566561731, -1564618340, -1562566382, + -1560407784, -1558145041, -1555775754, -1553296829, -1550712057, -1548026396, -1545242289, -1542268350, -1538423280, + -1535025262, -1531395445, -1527591708, -1523601949, -1519416343, -1515026680, -1510422354, -1505596841, -1500543057, + -1495258714, -1489733930, -1483960441, -1477928294, -1471632952, -1465071334, -1458241898, -1451136236, -1443746092, + -1436060907, -1428079531, -1419805847, -1411239360, -1402373353, -1393199823, -1383713926, -1373917135, -1363813377, + -1353400513, -1342677100, -1331640941, -1320284636, -1308611825, -1296630892, -1284342674, -1271742396, -1258835954, + -1245628407, -1232122065, -1218316234, -1204224404, -1189846207, -1175175506, -1160242956, -1145031655, -1129564821, + -1113844775, -1097879736, -1081675373, -1065238433, -1048578417, -1031707925, -1014636539, -997375667, -979937295, + -962314566, -944532531, -926597437, -908531127, -890341534, -872033654, -853615925, -835103871, -816513734, + -797862235, -779149108, -760390220, -741599202, -722791848, -703980340, -685176354, -666389658, -647646244, + -628944722, -610316405, -591754523, -573282405, -554915396, -536666275, -518550375, -500581949, -482775076, + -465139339, -447692836, -430439482, -413418994, -396596647, -380036004, -363729221, -347677810, -331912032, + -316431125, -301242631, -286354637, -271795849, -257560706, -243655300, -230096441, -216894979, -204043835, + -191560528, -179450345, -167715723, -156363602, -145400931, -134832648, -124663143, -114896281, -105536276, + -96587551, -88053476, -79936384, -72238586, -64962154, -58107752, -51674659, -45661585, -40066372, + -34884913, -30111469, -25739290, -21759792, -18161914, -14933570, -12062384, -9522842, -7254663, + -5656627 }; +#else +#define MDCT_WINDOW_FS_32000_frame_ms_75 NULL +#endif +#ifdef SUBSET_FB +const Word32 MDCT_WINDOW_FS_48000_frame_ms_75[636] = { + 2204435, 2827689, 3443319, 4131102, 4878935, 5703040, 6599364, 7574899, 8628974, + 9768536, 10991420, 12304931, 13709256, 15207323, 16799052, 18489324, 20275023, 22160933, + 24148496, 26240076, 28435235, 30739604, 33150351, 35668955, 38294878, 41029635, 43871618, + 46825882, 49890883, 53068998, 56360550, 59766888, 63284768, 66918075, 70664961, 74526448, + 78503039, 82597929, 86807681, 91135031, 95578822, 100139618, 104816236, 109611835, 114523552, + 119554039, 124702224, 129967749, 135348514, 140848111, 146462751, 152193324, 158039847, 164002831, + 170078327, 176269443, 182573647, 188991411, 195521914, 202165741, 208918745, 215783357, 222755240, + 229832331, 237013913, 244302241, 251692923, 259188940, 266788795, 274490295, 282289304, 290186132, + 298175224, 306257381, 314430505, 322694044, 331045821, 339487261, 348012274, 356620678, 365310317, + 374079074, 382922254, 391842074, 400834178, 409898068, 419031270, 428232881, 437497913, 446828175, + 456219802, 465670981, 475178925, 484743299, 494357854, 504022976, 513735237, 523492799, 533292796, + 543136028, 553015990, 562931887, 572880536, 582859524, 592864355, 602896501, 612951047, 623027190, + 633121825, 643232873, 653354882, 663488155, 673627234, 683771323, 693918098, 704065470, 714207061, + 724344108, 734471992, 744587758, 754688429, 764774608, 774840295, 784884831, 794903648, 804894011, + 814851825, 824777247, 834664477, 844515260, 854327259, 864098094, 873822193, 883500485, 893125924, + 902697010, 912211002, 921668164, 931065070, 940403253, 949676961, 958885223, 968024298, 977093615, + 986086667, 995005058, 1003845874, 1012604766, 1021282611, 1029879030, 1038386135, 1046806723, 1055138039, + 1063379017, 1071528406, 1079585832, 1087546197, 1095410412, 1103175087, 1110839263, 1118400067, 1125861251, + 1133217689, 1140469587, 1147616705, 1154658548, 1161589135, 1168411456, 1175122212, 1181718798, 1188199640, + 1194567214, 1200817042, 1206950737, 1212967954, 1218868269, 1224650873, 1230316551, 1235861165, 1241285527, + 1246589565, 1251772729, 1256831629, 1261771016, 1266587826, 1271284733, 1275860443, 1280315823, 1284645497, + 1288852346, 1292933744, 1296889962, 1300722079, 1304434734, 1308025653, 1311497310, 1314848195, 1318076916, + 1321181451, 1324164254, 1327024207, 1329764950, 1332387885, 1334893025, 1337281173, 1339554157, 1341707740, + 1343747791, 1345671522, 1347481634, 1349179572, 1350764422, 1352239980, 1353613012, 1354873992, 1356030340, + 1357079368, 1358026526, 1358871638, 1359613742, 1360257791, 1360804083, 1361255397, 1361617096, 1361885808, + 1362062609, 1362151603, 1362153995, 1362072233, 1361909271, 1361666938, 1361347766, 1360955593, 1360489817, + 1359950116, 1359340101, 1358660855, 1357916180, 1357108339, 1356243400, 1355321087, 1354344570, 1353313776, + 1352230258, 1351093731, 1349909242, 1348677915, 1347405592, 1346095404, 1344750475, 1343369336, 1341955495, + 1340508098, 1339029437, 1337520955, 1335988076, 1334432030, 1332857982, 1331266254, 1329659151, 1328036799, + 1326403000, 1324757066, 1323104230, 1321446604, 1319787700, 1318127699, 1316471738, 1314818892, 1313173031, + 1311534229, 1309906742, 1308289975, 1306691587, 1305107061, 1303560954, 1302485706, 1300837265, 1299230148, + 1297667349, 1296147118, 1294669845, 1293233008, 1291838729, 1290486465, 1289178223, 1287911298, 1286686132, + 1285500617, 1284356733, 1283253302, 1282192039, 1281170798, 1280190420, 1279248602, 1278346792, 1277483349, + 1276659918, 1275874601, 1275128550, 1274419448, 1273748350, 1273113203, 1272515449, 1271953180, 1271427649, + 1270936717, 1270481540, 1270059928, 1269672963, 1269318382, 1268997326, 1268707731, 1268450837, 1268224483, + 1268029756, 1267864381, 1267729424, 1267622629, 1267545013, 1267494302, 1267471571, 1267474578, 1267504402, + 1267558747, 1267638603, 1267741668, 1267868942, 1268018115, 1268190239, 1268383008, 1268597404, 1268831071, + 1269084943, 1269356717, 1269647473, 1269954877, 1270279875, 1270620090, 1270976496, 1271346828, 1271732058, + 1272129716, 1272540744, 1272962829, 1273396990, 1273840888, 1274295422, 1274758248, 1275230417, 1275709517, + 1276196415, 1276688706, 1277187379, 1277690114, 1278197794, 1278707969, 1279221647, 1279736503, 1280253498, + -1280770244, -1281287656, -1281803343, -1282318265, -1282830085, -1283339807, -1283844964, -1284346432, -1284841866, + -1285332250, -1285815146, -1286291410, -1286758593, -1287217737, -1287666452, -1288105628, -1288532876, -1288949203, + -1289352245, -1289742931, -1290118731, -1290480607, -1290826232, -1291156571, -1291469183, -1291765004, -1292041634, + -1292300151, -1292538184, -1292756663, -1292953166, -1293128674, -1293280819, -1293410658, -1293515818, -1293597309, + -1293652773, -1293683213, -1293686282, -1293663081, -1293611326, -1293532118, -1293423149, -1293285472, -1293116803, + -1292918254, -1292687534, -1292425784, -1292130842, -1291804017, -1291443255, -1291049775, -1290621337, -1290159111, + -1289660945, -1289128099, -1288558489, -1287953483, -1287311252, -1286633366, -1285917866, -1285165943, -1284375393, + -1283547520, -1282680564, -1281776335, -1280833350, -1279853230, -1278833852, -1277776244, -1276678466, -1275542433, + -1274367185, -1273154903, -1271903726, -1270614321, -1269284275, -1267915816, -1266508671, -1265065178, -1263583140, + -1262063220, -1260504007, -1258908698, -1256628331, -1254761985, -1252853377, -1250881358, -1248844632, -1246741358, + -1244569594, -1242327619, -1240012651, -1237623600, -1235156149, -1232610864, -1229984110, -1227275248, -1224482272, + -1221606271, -1218642652, -1215591412, -1212448650, -1209213243, -1205881571, -1202455146, -1198931234, -1195311772, + -1191594196, -1187777826, -1183858288, -1179836046, -1175706321, -1171469469, -1167124636, -1162674694, -1158117379, + -1153454731, -1148683225, -1143802349, -1138808714, -1133702904, -1128481825, -1123149280, -1117704914, -1112149514, + -1106481061, -1100702139, -1094806903, -1088800296, -1082676113, -1076437274, -1070082677, -1063618676, -1057039488, + -1050351248, -1043548836, -1036634133, -1029608325, -1022475106, -1015230021, -1007878923, -1000415821, -992849913, + -985179219, -977404151, -969525479, -961538535, -953457394, -945280420, -936999272, -928626277, -920160734, + -911603664, -902957625, -894223210, -885402362, -876498250, -867508512, -858440255, -849293347, -840074392, + -830781521, -821419104, -811990901, -802499334, -792938179, -783315469, -773636100, -763901035, -754111866, + -744278025, -734399140, -724475975, -714510329, -704504133, -694460237, -684383382, -674277250, -664145566, + -653994294, -643817229, -633622219, -623410967, -613187040, -602954520, -592717105, -582476532, -572238350, + -562002979, -551770150, -541551921, -531349514, -521160592, -510991643, -500852505, -490735715, -480646079, + -470590740, -460574626, -450595871, -440662753, -430774557, -420941335, -411160195, -401435877, -391774603, + -382174290, -372642476, -363180190, -353786746, -344482765, -335253937, -326094163, -317034690, -308063867, + -299187762, -290405275, -281715156, -273134873, -264653333, -256282164, -248014183, -239853113, -231807709, + -223884020, -216073113, -208387006, -200816625, -193373144, -186056104, -178871459, -171808633, -164881963, + -158086310, -151426496, -144902306, -138514809, -132265008, -126156408, -120188845, -114364736, -108683712, + -103148269, -97758088, -92515604, -87420431, -82474860, -77678410, -73033188, -68538592, -64196501, + -60006167, -55969182, -52084610, -48353698, -44775286, -41350196, -38077002, -34956005, -31985545, + -29165263, -26493253, -23968386, -21588587, -19351751, -17255806, -15297341, -13474667, -11782386, + -10220076, -8778515, -7460996, -6246830, -5152154, -4038973 }; +#else +#define MDCT_WINDOW_FS_48000_frame_ms_75 NULL +#endif + +const Word32 *const LowDelayShapes_n960_7_5ms[5] = { + MDCT_WINDOW_FS_8000_frame_ms_75, MDCT_WINDOW_FS_16000_frame_ms_75, MDCT_WINDOW_FS_24000_frame_ms_75, MDCT_WINDOW_FS_32000_frame_ms_75, MDCT_WINDOW_FS_48000_frame_ms_75 }; +#else + +RAM_ALIGN const Word16 LowDelayShapes_n960_N60_7_5ms[106] = { + 71, 172, 330, 553, 847, 1216, 1662, 2187, 2790, 3472, 4229, 5058, 5953, 6909, + 7917, 8969, 10058, 11173, 12305, 13442, 14574, 15690, 16780, 17834, 18842, 19796, 20688, 21513, + 22265, 22940, 23534, 24047, 24477, 24825, 25093, 25284, 25402, 25453, 25444, 25384, 25281, 25144, + 24981, 24803, 24618, 24434, 24266, 24104, 23972, 23866, 23786, 23731, 23699, 23687, 23693, 23714, + 23749, 23793, 23845, 23901, -23959, -24016, -24068, -24113, -24148, -24170, -24176, -24164, -24131, -24075, + -23995, -23889, -23758, -23600, -23395, -23151, -22857, -22504, -22087, -21600, -21040, -20404, -19692, -18904, + -18044, -17116, -16128, -15086, -14001, -12884, -11746, -10598, -9455, -8328, -7232, -6179, -5184, -4258, + -3410, -2648, -1979, -1408, -938, -571, -304, -128}; + +RAM_ALIGN const Word16 LowDelayShapes_n960_N120_7_5ms[212] = { + 37, 64, 100, 145, 201, 268, 347, 438, 542, 659, 790, 934, 1091, 1263, + 1448, 1648, 1861, 2088, 2329, 2584, 2851, 3132, 3425, 3730, 4047, 4375, 4713, 5060, + 5417, 5781, 6154, 6533, 6918, 7308, 7702, 8100, 8500, 8902, 9304, 9706, 10106, 10504, + 10899, 11290, 11675, 12054, 12427, 12792, 13148, 13496, 13833, 14160, 14475, 14779, 15071, 15350, + 15616, 15868, 16107, 16331, 16542, 16737, 16919, 17085, 17237, 17375, 17498, 17607, 17702, 17782, + 17850, 17904, 17946, 17975, 17993, 18000, 17997, 17984, 17963, 17934, 17897, 17854, 17805, 17752, + 17695, 17634, 17571, 17506, 17440, 17375, 17310, 17246, 17190, 17128, 17071, 17019, 16972, 16930, + 16893, 16860, 16832, 16808, 16789, 16773, 16762, 16754, 16750, 16749, 16751, 16756, 16764, 16774, + 16786, 16800, 16816, 16833, 16852, 16871, 16891, 16911, -16932, -16952, -16972, -16991, -17010, -17027, + -17043, -17058, -17070, -17080, -17088, -17093, -17095, -17094, -17090, -17082, -17071, -17055, -17035, -17011, + -16983, -16950, -16913, -16871, -16824, -16773, -16717, -16657, -16581, -16503, -16417, -16322, -16218, -16104, + -15979, -15843, -15696, -15536, -15364, -15179, -14981, -14770, -14545, -14307, -14055, -13790, -13511, -13220, + -12916, -12599, -12271, -11932, -11582, -11223, -10855, -10478, -10095, -9705, -9310, -8910, -8508, -8103, + -7697, -7291, -6887, -6485, -6086, -5692, -5305, -4924, -4552, -4189, -3838, -3497, -3170, -2855, + -2555, -2270, -2001, -1748, -1511, -1292, -1090, -906, -740, -592, -462, -350, -256, -178, + -116, -68}; + +RAM_ALIGN const Word16 LowDelayShapes_n960_N180_7_5ms[318] = { + 54, 82, 114, 153, 198, 251, 312, 380, 458, 543, 638, 742, 856, 978, + 1111, 1253, 1405, 1566, 1738, 1920, 2111, 2313, 2525, 2747, 2980, 3222, 3474, 3737, + 4009, 4291, 4582, 4883, 5193, 5512, 5840, 6177, 6521, 6874, 7235, 7602, 7978, 8359, + 8747, 9141, 9541, 9947, 10357, 10772, 11191, 11614, 12041, 12470, 12902, 13336, 13771, 14208, + 14646, 15084, 15521, 15958, 16394, 16829, 17261, 17691, 18118, 18541, 18961, 19376, 19787, 20193, + 20593, 20987, 21375, 21757, 22131, 22499, 22858, 23210, 23553, 23889, 24215, 24532, 24841, 25140, + 25430, 25709, 25979, 26239, 26488, 26728, 26957, 27175, 27383, 27580, 27767, 27943, 28109, 28264, + 28409, 28543, 28666, 28779, 28882, 28975, 29058, 29132, 29195, 29250, 29295, 29332, 29359, 29379, + 29391, 29394, 29391, 29380, 29363, 29340, 29311, 29276, 29236, 29192, 29143, 29090, 29033, 28974, + 28911, 28846, 28779, 28710, 28640, 28569, 28498, 28426, 28355, 28284, 28214, 28145, 28090, 28019, + 27954, 27892, 27833, 27779, 27728, 27680, 27636, 27595, 27558, 27524, 27494, 27466, 27442, 27421, + 27403, 27387, 27375, 27365, 27358, 27353, 27351, 27351, 27354, 27358, 27365, 27373, 27383, 27395, + 27408, 27423, 27439, 27456, 27474, 27493, 27513, 27534, 27555, 27577, 27599, 27621, -27644, -27666, + -27688, -27710, -27731, -27752, -27772, -27792, -27810, -27827, -27844, -27859, -27872, -27884, -27894, -27903, + -27909, -27914, -27916, -27917, -27914, -27910, -27902, -27892, -27880, -27864, -27846, -27824, -27800, -27772, + -27741, -27707, -27670, -27629, -27585, -27538, -27487, -27433, -27375, -27315, -27251, -27182, -27096, -27014, + -26927, -26833, -26733, -26626, -26513, -26393, -26265, -26129, -25985, -25833, -25673, -25504, -25325, -25138, + -24941, -24735, -24520, -24294, -24060, -23815, -23561, -23296, -23022, -22738, -22445, -22141, -21829, -21507, + -21176, -20836, -20487, -20130, -19764, -19391, -19010, -18622, -18228, -17827, -17420, -17007, -16590, -16167, + -15741, -15311, -14877, -14441, -14003, -13563, -13122, -12680, -12238, -11796, -11356, -10917, -10481, -10047, + -9616, -9190, -8767, -8350, -7939, -7534, -7135, -6744, -6361, -5986, -5620, -5264, -4916, -4579, + -4253, -3937, -3632, -3339, -3058, -2788, -2530, -2285, -2053, -1833, -1626, -1432, -1251, -1083, + -929, -788, -659, -544, -441, -351, -272, -205, -148, -106}; + +RAM_ALIGN const Word16 LowDelayShapes_n960_N240_7_5ms[424] = { + 44, 61, 81, 103, 128, 156, 188, 224, 263, 306, 354, 405, 461, 521, + 586, 655, 728, 806, 889, 977, 1069, 1166, 1268, 1375, 1486, 1602, 1724, 1850, + 1981, 2117, 2258, 2404, 2555, 2711, 2871, 3037, 3207, 3382, 3562, 3747, 3936, 4130, + 4329, 4531, 4739, 4950, 5166, 5386, 5610, 5838, 6069, 6305, 6544, 6786, 7032, 7281, + 7533, 7788, 8046, 8307, 8570, 8836, 9104, 9374, 9646, 9920, 10196, 10474, 10753, 11033, + 11314, 11596, 11879, 12163, 12447, 12731, 13015, 13300, 13584, 13868, 14151, 14433, 14715, 14995, + 15274, 15552, 15828, 16103, 16375, 16646, 16914, 17180, 17444, 17704, 17963, 18218, 18470, 18719, + 18964, 19206, 19445, 19680, 19911, 20138, 20361, 20580, 20795, 21006, 21212, 21414, 21611, 21804, + 21992, 22175, 22354, 22527, 22696, 22860, 23018, 23172, 23321, 23464, 23603, 23736, 23864, 23988, + 24106, 24218, 24326, 24428, 24525, 24618, 24705, 24786, 24863, 24935, 25002, 25064, 25121, 25174, + 25221, 25264, 25303, 25336, 25366, 25391, 25412, 25428, 25441, 25450, 25455, 25456, 25454, 25448, + 25439, 25427, 25412, 25394, 25373, 25350, 25324, 25296, 25265, 25233, 25198, 25162, 25124, 25085, + 25045, 25003, 24960, 24916, 24871, 24826, 24780, 24734, 24688, 24641, 24595, 24548, 24502, 24457, + 24412, 24367, 24334, 24287, 24244, 24202, 24162, 24123, 24086, 24051, 24018, 23987, 23957, 23929, + 23902, 23878, 23855, 23833, 23813, 23795, 23778, 23763, 23749, 23737, 23726, 23717, 23709, 23702, + 23696, 23692, 23689, 23687, 23687, 23687, 23689, 23691, 23695, 23699, 23705, 23711, 23718, 23726, + 23735, 23744, 23754, 23764, 23776, 23787, 23799, 23812, 23825, 23838, 23852, 23866, 23880, 23894, + 23909, 23923, -23938, -23952, -23967, -23981, -23995, -24009, -24023, -24036, -24049, -24062, -24074, -24086, + -24097, -24108, -24118, -24128, -24137, -24145, -24152, -24158, -24164, -24168, -24172, -24175, -24176, -24177, + -24176, -24174, -24171, -24167, -24161, -24154, -24146, -24136, -24125, -24113, -24099, -24083, -24066, -24048, + -24028, -24006, -23983, -23958, -23932, -23904, -23874, -23843, -23810, -23775, -23739, -23701, -23662, -23621, + -23579, -23533, -23474, -23423, -23367, -23309, -23248, -23184, -23117, -23047, -22974, -22896, -22816, -22732, + -22643, -22551, -22455, -22355, -22251, -22143, -22030, -21913, -21791, -21665, -21534, -21399, -21259, -21114, + -20964, -20810, -20651, -20488, -20319, -20146, -19968, -19785, -19598, -19405, -19208, -19007, -18801, -18590, + -18375, -18156, -17932, -17704, -17472, -17236, -16996, -16752, -16505, -16254, -16000, -15743, -15482, -15219, + -14953, -14684, -14412, -14139, -13863, -13586, -13306, -13025, -12743, -12459, -12174, -11889, -11603, -11316, + -11029, -10742, -10455, -10168, -9882, -9597, -9313, -9029, -8748, -8467, -8189, -7912, -7638, -7367, + -7097, -6831, -6568, -6308, -6052, -5799, -5550, -5305, -5065, -4828, -4597, -4369, -4147, -3930, + -3718, -3511, -3310, -3113, -2923, -2738, -2559, -2386, -2219, -2057, -1902, -1753, -1610, -1474, + -1344, -1220, -1102, -991, -887, -788, -697, -611, -532, -459, -393, -332, -277, -228, + -184, -145, -111, -86}; + +RAM_ALIGN const Word16 LowDelayShapes_n960_N360_7_5ms[636] = { + 34, 43, 53, 63, 74, 87, 101, 116, 132, 149, 168, 188, 209, 232, + 256, 282, 309, 338, 368, 400, 434, 469, 506, 544, 584, 626, 669, 715, + 761, 810, 860, 912, 966, 1021, 1078, 1137, 1198, 1260, 1325, 1391, 1458, 1528, + 1599, 1673, 1747, 1824, 1903, 1983, 2065, 2149, 2235, 2322, 2411, 2502, 2595, 2690, + 2786, 2884, 2983, 3085, 3188, 3293, 3399, 3507, 3617, 3728, 3841, 3955, 4071, 4188, + 4307, 4428, 4550, 4673, 4798, 4924, 5051, 5180, 5310, 5442, 5574, 5708, 5843, 5979, + 6116, 6255, 6394, 6534, 6676, 6818, 6961, 7106, 7251, 7397, 7543, 7691, 7839, 7988, + 8137, 8288, 8438, 8590, 8741, 8894, 9046, 9199, 9353, 9507, 9661, 9815, 9969, 10124, + 10279, 10434, 10588, 10743, 10898, 11053, 11207, 11362, 11516, 11670, 11823, 11976, 12129, 12282, + 12434, 12585, 12736, 12886, 13036, 13185, 13333, 13481, 13628, 13774, 13919, 14064, 14207, 14349, + 14491, 14631, 14771, 14909, 15046, 15183, 15317, 15451, 15584, 15715, 15845, 15973, 16100, 16226, + 16350, 16473, 16595, 16715, 16833, 16950, 17065, 17179, 17292, 17402, 17511, 17619, 17724, 17829, + 17931, 18032, 18130, 18228, 18323, 18417, 18508, 18598, 18687, 18773, 18858, 18941, 19021, 19101, + 19178, 19253, 19327, 19398, 19468, 19536, 19602, 19666, 19729, 19789, 19847, 19904, 19959, 20012, + 20063, 20112, 20160, 20205, 20249, 20291, 20331, 20369, 20405, 20440, 20473, 20504, 20533, 20561, + 20587, 20611, 20634, 20654, 20674, 20691, 20707, 20722, 20735, 20746, 20756, 20764, 20771, 20777, + 20781, 20783, 20785, 20785, 20784, 20781, 20777, 20773, 20767, 20759, 20751, 20742, 20732, 20720, + 20708, 20695, 20681, 20666, 20650, 20633, 20616, 20598, 20579, 20560, 20540, 20519, 20498, 20477, + 20455, 20432, 20409, 20386, 20362, 20338, 20314, 20289, 20264, 20239, 20214, 20189, 20164, 20138, + 20113, 20088, 20063, 20037, 20012, 19988, 19963, 19939, 19914, 19891, 19874, 19849, 19825, 19801, + 19778, 19755, 19733, 19712, 19691, 19671, 19652, 19633, 19615, 19598, 19581, 19565, 19549, 19534, + 19520, 19506, 19493, 19480, 19468, 19457, 19446, 19436, 19426, 19417, 19408, 19400, 19393, 19386, + 19380, 19374, 19368, 19363, 19359, 19355, 19352, 19349, 19346, 19344, 19342, 19341, 19340, 19340, + 19340, 19341, 19341, 19343, 19344, 19346, 19348, 19351, 19354, 19357, 19361, 19365, 19369, 19373, + 19378, 19383, 19388, 19394, 19399, 19405, 19411, 19417, 19424, 19430, 19437, 19444, 19451, 19458, + 19466, 19473, 19481, 19488, 19496, 19504, 19512, 19519, 19527, 19535, -19543, -19551, -19559, -19567, + -19574, -19582, -19590, -19598, -19605, -19613, -19620, -19627, -19634, -19641, -19648, -19655, -19661, -19668, + -19674, -19680, -19686, -19691, -19696, -19701, -19706, -19711, -19715, -19719, -19723, -19726, -19729, -19732, + -19734, -19736, -19737, -19739, -19740, -19740, -19740, -19740, -19739, -19738, -19736, -19734, -19731, -19728, + -19725, -19721, -19716, -19711, -19706, -19700, -19693, -19686, -19679, -19671, -19662, -19653, -19643, -19632, + -19622, -19610, -19598, -19585, -19572, -19558, -19544, -19529, -19513, -19497, -19481, -19463, -19445, -19427, + -19408, -19388, -19368, -19347, -19325, -19303, -19281, -19258, -19234, -19209, -19175, -19146, -19117, -19087, + -19056, -19024, -18991, -18956, -18921, -18885, -18847, -18808, -18768, -18727, -18684, -18640, -18595, -18548, + -18500, -18451, -18400, -18348, -18294, -18239, -18182, -18124, -18064, -18003, -17940, -17875, -17809, -17741, + -17671, -17600, -17528, -17453, -17377, -17299, -17219, -17138, -17055, -16970, -16884, -16795, -16705, -16614, + -16520, -16425, -16328, -16230, -16129, -16027, -15923, -15818, -15711, -15602, -15491, -15379, -15265, -15150, + -15033, -14914, -14794, -14672, -14549, -14424, -14297, -14170, -14041, -13910, -13778, -13645, -13510, -13374, + -13237, -13099, -12959, -12819, -12677, -12534, -12390, -12245, -12099, -11952, -11805, -11656, -11507, -11357, + -11206, -11055, -10903, -10750, -10597, -10443, -10289, -10134, -9979, -9824, -9668, -9512, -9356, -9200, + -9044, -8888, -8732, -8575, -8419, -8263, -8108, -7952, -7797, -7642, -7488, -7334, -7181, -7028, + -6876, -6724, -6573, -6423, -6274, -6125, -5978, -5832, -5686, -5542, -5398, -5256, -5116, -4976, + -4838, -4701, -4565, -4431, -4299, -4168, -4038, -3911, -3784, -3660, -3537, -3416, -3297, -3180, + -3064, -2951, -2839, -2729, -2622, -2516, -2412, -2311, -2211, -2114, -2018, -1925, -1834, -1745, + -1658, -1574, -1492, -1412, -1334, -1258, -1185, -1114, -1046, -980, -916, -854, -795, -738, + -683, -631, -581, -533, -488, -445, -404, -366, -329, -295, -263, -233, -206, -180, + -156, -134, -114, -95, -79, -62}; + +const Word16 *const LowDelayShapes_n960_7_5ms[5] = { + LowDelayShapes_n960_N60_7_5ms, LowDelayShapes_n960_N120_7_5ms, LowDelayShapes_n960_N180_7_5ms, + LowDelayShapes_n960_N240_7_5ms, LowDelayShapes_n960_N360_7_5ms}; +#endif + +#ifdef ENABLE_HR_MODE +#ifdef SUBSET_NB +RAM_ALIGN const Word32 MDCT_WINDOW_FS_8000_frame_ms_100[130] = { + -961400, -2849747, -6146069, -11183287, -18168658, -27159976, -38041614, -50544991, -64266305, + -78702302, -93275005, -107359966, -120331449, -131585369, -140567185, -146788394, -149841031, -149374845, + -145077849, -136659567, -123818556, -106218681, -83483575, -55188103, -20866242, 19967468, 67769998, + 122921021, 185652202, 255975827, 333632994, 418021593, 508185345, 602779388, 700109939, 798161092, + 894722554, 987480940, 1074157272, 1152645644, 1221190247, 1278509567, 1323911980, 1357388583, 1379593462, + 1391784272, 1395720478, 1393489246, 1387290092, 1379158144, 1370909958, 1362952657, 1356680081, 1351822616, + 1348129706, 1345389974, 1343434137, 1342132875, 1341380238, 1341082389, 1341146030, 1341475565, 1341976666, + 1342558820, 1343143270, 1343665484, 1344082633, 1344377759, 1344564351, 1344687981, 1344819951, 1345048163, + 1345462207, 1346140636, 1347141158, 1348493131, 1350195802, 1352216474, 1354492706, 1356936321, -1359440659, + -1361893201, -1364185723, -1366227332, -1367952395, -1369325253, -1370343007, -1371033982, -1371456025, -1371688758, + -1371823378, -1371949513, -1372139932, -1372441219, -1372867302, -1373401073, -1373998949, -1374594994, -1375108467, + -1375446347, -1375511619, -1375206190, -1374435007, -1373103717, -1371107592, -1368321163, -1364583182, -1359697421, + -1353439826, -1345583929, -1334252006, -1318640435, -1296625734, -1266042179, -1224814360, -1171299094, -1104589425, + -1024691930, -932610693, -830326556, -720679178, -607287900, -494260157, -385949065, -286606097, -199964372, + -128792415, -74461791, -36690922, -13577456 }; +#else +#define MDCT_WINDOW_FS_8000_frame_ms_100 NULL +#endif +#ifdef SUBSET_WB +Word32 MDCT_WINDOW_FS_16000_frame_ms_100[260] = { + -887375, -1872204, -3197066, -4988439, -7310990, -10227337, -13783209, -18021567, -22958367, + -28610377, -34970773, -42018157, -49718535, -58023758, -66873408, -76198163, -85910142, -95927481, + -106148057, -116469926, -126789141, -136988509, -146961365, -156599505, -165784108, -174413613, -182384155, + -189593925, -195957243, -201380750, -205787662, -209112092, -211278626, -212225338, -211904063, -210251417, + -207219014, -202758648, -196811500, -189330359, -180258003, -169532917, -157095614, -142881796, -126812734, + -108824087, -88825077, -66738724, -42479347, -15962398, 12903137, 44189991, 77985216, 114347898, + 153341694, 195002709, 239360583, 286415769, 336147305, 388513668, 443439084, 500814289, 560507827, + 622347139, 686131895, 751624641, 818548945, 886612081, 955480469, 1024792378, 1094174334, 1163233060, + 1231563801, 1298756609, 1364398281, 1428080024, 1489417472, 1548030726, 1603570137, 1655722624, 1704220353, + 1748832761, 1789380048, 1825732185, 1857837021, 1885694068, 1909350182, 1928926255, 1944599555, 1956591988, + 1965173692, 1970654814, 1973392048, 1973753741, 1972126549, 1968905622, 1964477747, 1959200677, 1953414096, + 1947497068, 1941982397, 1935699544, 1930081097, 1925079908, 1920651209, 1916744799, 1913315837, 1910318315, + 1907712617, 1905458724, 1903525160, 1901880657, 1900501434, 1899362031, 1898444320, 1897728470, 1897199074, + 1896837448, 1896629442, 1896556474, 1896603942, 1896753023, 1896988900, 1897292512, 1897649018, 1898040860, + 1898455207, 1898875282, 1899290274, 1899686952, 1900057791, 1900392969, 1900688703, 1900940068, 1901148890, + 1901315261, 1901446916, 1901549632, 1901635772, 1901716579, 1901808596, 1901925470, 1902085313, 1902301944, + 1902593430, 1902971628, 1903450623, 1904038863, 1904746055, 1905575675, 1906532421, 1907613683, 1908818837, + 1910139810, 1911570484, 1913097876, 1914709921, 1916389064, 1918119705, 1919880868, -1921655075, -1923419485, + -1925156475, -1926844779, -1928468408, -1930009301, -1931454857, -1932791495, -1934012556, -1935109403, -1936080977, + -1936924245, -1937643651, -1938242459, -1938730331, -1939115713, -1939412840, -1939633721, -1939796733, -1939915942, + -1940009808, -1940092245, -1940180131, -1940284940, -1940419293, -1940589100, -1940802279, -1941058948, -1941361010, + -1941703474, -1942082515, -1942488131, -1942912654, -1943342567, -1943766803, -1944168168, -1944533482, -1944844704, + -1945086561, -1945239453, -1945288139, -1945213300, -1944999989, -1944629251, -1944086772, -1943353711, -1942414745, + -1941250214, -1939842441, -1938166561, -1936199807, -1933912258, -1931274378, -1928248720, -1924799179, -1920884332, + -1916465285, -1911499377, -1905951172, -1899784891, -1891449639, -1882086102, -1871092605, -1858022426, -1842504117, + -1824150091, -1802570281, -1777395508, -1748280284, -1714926445, -1677106435, -1634654127, -1587483810, -1535592652, + -1479074019, -1418108336, -1352953154, -1283959587, -1211573312, -1136287716, -1058670176, -979383239, -899114678, + -818587615, -738568308, -659827651, -583145988, -509279027, -438949979, -372825231, -311497711, -255465040, + -205107348, -160673323, -122260482, -89825442, -63156242, -41931466, -25668784, -12980788 }; +#else +#define MDCT_WINDOW_FS_16000_frame_ms_100 NULL +#endif +#ifdef SUBSET_SSWB +Word32 MDCT_WINDOW_FS_24000_frame_ms_100[390] = { + -566705, -1110129, -1685050, -2404955, -3290604, -4357398, -5620992, -7096870, -8797110, + -10732247, -12913348, -15346312, -18033576, -20979359, -24186040, -27648819, -31361639, -35319387, + -39511857, -43926672, -48550894, -53369201, -58364329, -63516998, -68804773, -74208337, -79706124, + -85271101, -90877590, -96504202, -102123140, -107704698, -113222623, -118652834, -123968611, -129140789, + -134141816, -138946789, -143532274, -147872644, -151941696, -155718471, -159183810, -162313004, -165085094, + -167485061, -169496638, -171101141, -172281631, -173021519, -173310456, -173136812, -172483214, -171335676, + -169686052, -167521471, -164827705, -161591409, -157800875, -153444385, -148507128, -142973353, -136828628, + -130059834, -122650769, -114582255, -105836248, -96398529, -86248633, -75363800, -63725732, -51315501, + -38111620, -24094261, -9239538, 6471742, 23056447, 40536457, 58931280, 78254053, 98521159, + 119745967, 141936970, 165102364, 189247343, 214372698, 240474371, 267544931, 295575426, 324551903, + 354450456, 385246198, 416908490, 449403326, 482689758, 516718794, 551441284, 586801891, 622731215, + 659163373, 696029684, 733249762, 770740975, 808417324, 846185475, 883956761, 921637043, 959124688, + 996324031, 1033136615, 1069460208, 1105195788, 1140244773, 1174510921, 1207903363, 1240329980, 1271701586, + 1301936917, 1330960546, 1358704531, 1385106661, 1410109035, 1433668094, 1455740664, 1476295686, 1495314659, + 1512790051, 1528721877, 1543118961, 1555993720, 1567377327, 1577311901, 1585840140, 1593017314, 1598905809, + 1603572858, 1607094048, 1609553036, 1611038032, 1611639187, 1611445924, 1610554709, 1609062783, 1607062660, + 1604647205, 1601904616, 1598915994, 1595761439, 1592514651, 1589411075, 1586578699, 1582990467, 1579691165, + 1576632996, 1573802167, 1571187222, 1568776964, 1566559220, 1564523108, 1562656830, 1560950303, 1559392538, + 1557974462, 1556686097, 1555520279, 1554467590, 1553522528, 1552677071, 1551926380, 1551264122, 1550685851, + 1550186120, 1549761554, 1549406743, 1549118648, 1548892484, 1548724782, 1548611579, 1548548556, 1548532064, + 1548557824, 1548622043, 1548720068, 1548848512, 1549002557, 1549178941, 1549372811, 1549581179, 1549799479, + 1550025081, 1550253392, 1550482320, 1550707996, 1550928257, 1551140242, 1551341918, 1551531258, 1551707132, + 1551867783, 1552012940, 1552142171, 1552255441, 1552353722, 1552437360, 1552508729, 1552569181, 1552621341, + 1552667742, 1552711935, 1552756861, 1552806540, 1552864321, 1552934727, 1553021212, 1553127838, 1553258419, + 1553416594, 1553605935, 1553829154, 1554089545, 1554389317, 1554730803, 1555115388, 1555544621, 1556019161, + 1556539764, 1557105744, 1557717296, 1558373006, 1559071819, 1559811599, 1560590143, 1561405090, 1562252936, + 1563130339, 1564033457, 1564958401, 1565900358, 1566855101, 1567817123, -1568783655, -1569746861, -1570703949, + -1571649364, -1572578812, -1573487389, -1574371102, -1575225988, -1576048579, -1576835227, -1577583436, -1578290863, + -1578955234, -1579575367, -1580149723, -1580678399, -1581160607, -1581597028, -1581988259, -1582335808, -1582641029, + -1582906248, -1583133678, -1583326640, -1583487877, -1583621010, -1583729737, -1583817938, -1583889747, -1583948684, + -1583999362, -1584045193, -1584090279, -1584137621, -1584190841, -1584252527, -1584325358, -1584410718, -1584511035, + -1584626668, -1584758614, -1584906848, -1585070936, -1585250612, -1585444090, -1585650227, -1585866958, -1586092212, + -1586323072, -1586557326, -1586791018, -1587022005, -1587245580, -1587459040, -1587657701, -1587838487, -1587996409, + -1588128112, -1588228637, -1588294501, -1588320923, -1588304007, -1588239369, -1588123278, -1587951328, -1587719494, + -1587424275, -1587060842, -1586626176, -1586114863, -1585523601, -1584847006, -1584080761, -1583218674, -1582256132, + -1581185350, -1580001184, -1578694604, -1577258975, -1575684935, -1573964180, -1572086641, -1570043344, -1567823810, + -1565418712, -1562817696, -1560011672, -1556991601, -1553746487, -1550232508, -1545614483, -1540661510, -1535326382, + -1529347469, -1522634820, -1515104434, -1506662411, -1497214433, -1486667044, -1474925134, -1461899585, -1447505979, + -1431661421, -1414293801, -1395342396, -1374757780, -1352499694, -1328538688, -1302862307, -1275470003, -1246373968, + -1215606643, -1183212323, -1149244754, -1113774081, -1076886070, -1038679407, -999271421, -958778521, -917331256, + -875071965, -832168635, -788780400, -745078907, -701235665, -657439320, -613872407, -570722470, -528178104, + -486428392, -445655594, -406038238, -367747699, -330944214, -295781070, -262392452, -230898968, -201404745, + -173990773, -148716671, -125619512, -104711740, -85981071, -69390841, -54880490, -42367028, -31748204, + -22909680, -15677896, -8320202 }; +#else +#define MDCT_WINDOW_FS_24000_frame_ms_100 NULL +#endif +#ifdef SUBSET_SWB +Word32 MDCT_WINDOW_FS_32000_frame_ms_100[520] = { + -410329, -796949, -1136328, -1530183, -1997206, -2544529, -3177199, -3900727, -4721409, + -5644580, -6674901, -7816606, -9073542, -10449649, -11947654, -13568981, -15314575, -17185616, + -19183576, -21308469, -23557934, -25929130, -28420717, -31030313, -33753791, -36586142, -39522623, + -42558881, -45688908, -48905915, -52203334, -55573600, -59008578, -62500911, -66043225, -69627153, + -73242249, -76878656, -80528547, -84184130, -87834359, -91467738, -95074499, -98645962, -102173556, + -105646999, -109055430, -112389025, -115637823, -118792264, -121843979, -124784385, -127604158, -130292837, + -132842231, -135246333, -137497670, -139586545, -141504332, -143245396, -144804682, -146175706, -147351477, + -148325994, -149093197, -149646348, -149980871, -150094482, -149982174, -149636889, -149052616, -148226262, + -147155224, -145834061, -144257234, -142420419, -140318794, -137947501, -135302755, -132379903, -129173499, + -125677248, -121885484, -117793976, -113398013, -108690888, -103666131, -98316590, -92636250, -86619948, + -80260566, -73550172, -66480755, -59045143, -51237113, -43048956, -34473252, -25502546, -16127957, + -6341514, 3862818, 14491541, 25552349, 37053485, 49000846, 61399638, 74255377, 87574137, + 101359692, 115615618, 130345077, 145550314, 161232640, 177393068, 194030243, 211141818, 228724496, + 246775667, 265291298, 284263733, 303683434, 323542122, 343829307, 364532416, 385638632, 407133703, + 428999825, 451218622, 473771892, 496640476, 519799290, 543222449, 566886347, 590766871, 614834881, + 639060282, 663412218, 687860455, 712370477, 736908535, 761442526, 785938885, 810359699, 834668800, + 858831376, 882812136, 906573323, 930077938, 953289749, 976173461, 998692986, 1020814305, 1042504195, + 1063729320, 1084456529, 1104654343, 1124293323, 1143346837, 1161788685, 1179595571, 1196744793, 1213214499, + 1228990130, 1244053625, 1258390343, 1271989157, 1284842646, 1296945646, 1308295983, 1318894029, 1328742964, + 1337845893, 1346207620, 1353840346, 1360760354, 1366981286, 1372519590, 1377396138, 1381633759, 1385255026, + 1388285177, 1390752262, 1392686884, 1394119237, 1395082423, 1395609697, 1395734288, 1395488163, 1394907750, + 1394029226, 1392887172, 1391513953, 1389943438, 1388208885, 1386340921, 1384367440, 1382316364, 1380214130, + 1378106162, 1376182641, 1374415552, 1372026612, 1369811233, 1367710559, 1365724178, 1363849407, 1362082203, + 1360417744, 1358852161, 1357381258, 1356001076, 1354706993, 1353494673, 1352361089, 1351302228, 1350313689, + 1349392506, 1348535330, 1347739116, 1347001032, 1346317031, 1345686404, 1345105561, 1344572298, 1344084536, + 1343640384, 1343238137, 1342875748, 1342550922, 1342263301, 1342010831, 1341791477, 1341604203, 1341447356, + 1341320237, 1341220346, 1341146654, 1341097800, 1341072665, 1341069082, 1341085615, 1341121386, 1341174740, + 1341243587, 1341326852, 1341422956, 1341530950, 1341648658, 1341774344, 1341907686, 1342046793, 1342189996, + 1342336371, 1342484315, 1342633509, 1342781772, 1342928111, 1343072442, 1343213120, 1343349339, 1343480101, + 1343605189, 1343724192, 1343836029, 1343940104, 1344037064, 1344126250, 1344207727, 1344281010, 1344347228, + 1344406398, 1344458631, 1344504740, 1344545486, 1344582197, 1344614878, 1344644716, 1344673602, 1344702406, + 1344732123, 1344764116, 1344799913, 1344841581, 1344889533, 1344945396, 1345011275, 1345087987, 1345177164, + 1345279600, 1345397199, 1345531309, 1345682002, 1345850876, 1346039023, 1346247352, 1346476070, 1346725599, + 1346997017, 1347290788, 1347606421, 1347944342, 1348304546, 1348687326, 1349091759, 1349517389, 1349964590, + 1350432001, 1350919119, 1351424549, 1351948150, 1352488782, 1353044492, 1353614173, 1354196920, 1354791164, + 1355395130, 1356006741, 1356625062, 1357248513, 1357874066, -1358501833, -1359127963, -1359752565, -1360372594, + -1360986451, -1361593178, -1362190669, -1362777107, -1363350886, -1363911059, -1364456475, -1364985125, -1365495818, + -1365988370, -1366461329, -1366914145, -1367345397, -1367755425, -1368143727, -1368509329, -1368852492, -1369173176, + -1369471783, -1369747786, -1370001627, -1370234382, -1370446455, -1370638040, -1370810046, -1370963570, -1371100229, + -1371220085, -1371324505, -1371415420, -1371493639, -1371560818, -1371617789, -1371666695, -1371709196, -1371745710, + -1371778346, -1371808661, -1371838047, -1371867517, -1371897959, -1371931304, -1371968763, -1372010342, -1372057396, + -1372110702, -1372171094, -1372238686, -1372313498, -1372396683, -1372487751, -1372586771, -1372693072, -1372807320, + -1372928910, -1373056739, -1373190393, -1373329652, -1373473500, -1373621114, -1373770813, -1373922515, -1374075203, + -1374226645, -1374376513, -1374523166, -1374665655, -1374802265, -1374931057, -1375051695, -1375162397, -1375260925, + -1375346302, -1375416903, -1375471622, -1375508310, -1375525267, -1375521592, -1375495812, -1375445706, -1375370134, + -1375267707, -1375137383, -1374976617, -1374784711, -1374559999, -1374301455, -1374007032, -1373674676, -1373304076, + -1372892947, -1372439276, -1371941405, -1371397503, -1370805562, -1370163465, -1369467701, -1368717718, -1367909588, + -1367040649, -1366108055, -1365108685, -1364039842, -1362897427, -1361677778, -1360378277, -1358995048, -1357523990, + -1355961737, -1354304757, -1352549921, -1350693234, -1348731568, -1346663222, -1344488796, -1342151873, -1339094859, + -1335868526, -1332575618, -1329015998, -1325134514, -1320899332, -1316281926, -1311249778, -1305767783, -1299801189, + -1293316467, -1286278496, -1278652937, -1270407089, -1261510752, -1251931832, -1241641304, -1230612600, -1218823121, + -1206251778, -1192882032, -1178699247, -1163691417, -1147850058, -1131172617, -1113659053, -1095312137, -1076139342, + -1056154695, -1035374650, -1013817533, -991505119, -968465043, -944729088, -920331658, -895311402, -869713787, + -843580319, -816956722, -789893244, -762442487, -734669461, -706629428, -678385082, -649998064, -621530231, + -593051422, -564628794, -536328929, -508220768, -480373259, -452855166, -425735746, -399081503, -372957401, + -347428629, -322556345, -298398778, -275013415, -252453167, -230765335, -209993816, -190178661, -171354066, + -153547820, -136781064, -121069202, -106422336, -92843298, -80326106, -68858674, -58425411, -49003701, + -40559788, -33054527, -26453090, -20722011, -15806421, -11453718, -6043487 }; +#else +#define MDCT_WINDOW_FS_32000_frame_ms_100 NULL +#endif +#ifdef SUBSET_FB +Word32 MDCT_WINDOW_FS_48000_frame_ms_100[780] = { + -260941, -512326, -694531, -879311, -1080918, -1308853, -1562751, -1845827, -2158684, + -2503004, -2880077, -3290946, -3737685, -4221002, -4742864, -5303548, -5904756, -6546614, + -7230857, -7957740, -8729060, -9544323, -10404756, -11309433, -12259734, -13255019, -14296724, + -15384139, -16518209, -17697344, -18921986, -20190385, -21503384, -22859520, -24259194, -25700342, + -27183029, -28705009, -30266328, -31864635, -33500032, -35169872, -36873876, -38609380, -40375887, + -42170731, -43993030, -45839524, -47709533, -49600244, -51511244, -53439376, -55383757, -57340675, + -59308752, -61284610, -63267293, -65253972, -67243943, -69233263, -71220507, -73201745, -75175694, + -77138930, -79090353, -81026756, -82947219, -84848184, -86728232, -88583507, -90412766, -92212306, + -93980997, -95715499, -97414829, -99075933, -100697747, -102276727, -103811934, -105299541, -106738717, + -108126346, -109462104, -110743333, -111969072, -113135967, -114242829, -115286640, -116267230, -117181898, + -118030913, -118811562, -119523250, -120163192, -120730923, -121223904, -121641755, -121981772, -122243774, + -122425704, -122528356, -122549198, -122488317, -122342868, -122112204, -121794056, -121388712, -120894363, + -120311595, -119637953, -118873094, -118014671, -117062760, -116014831, -114871079, -113629173, -112289425, + -110849719, -109309933, -107667532, -105922420, -104072007, -102115976, -100051888, -97879875, -95597465, + -93204875, -90699195, -88080200, -85345024, -82492843, -79520968, -76429175, -73215366, -69879179, + -66417490, -62829616, -59111848, -55264005, -51283182, -47168943, -42918760, -38531620, -34004372, + -29336594, -24525462, -19570192, -14467231, -9215895, -3812888, 1741410, 7449630, 13312759, + 19333517, 25513103, 31854549, 38357631, 45024786, 51855914, 58853769, 66018789, 73353520, + 80857218, 88531868, 96377212, 104395033, 112584867, 120948431, 129484622, 138194897, 147077806, + 156134120, 165362222, 174762717, 184333381, 194074737, 203984869, 214063752, 224308471, 234717970, + 245288658, 256019674, 266907692, 277950967, 289145264, 300489211, 311977987, 323609345, 335378203, + 347280982, 359312288, 371469093, 383745604, 396138434, 408640853, 421247404, 433950689, 446746484, + 459627611, 472589454, 485624370, 498725842, 511885724, 525097999, 538353697, 551646906, 564968308, + 578310445, 591664155, 605022969, 618377829, 631721846, 645044713, 658338326, 671592921, 684801497, + 697954218, 711043692, 724059806, 736994360, 749837478, 762581648, 775216823, 787735715, 800128161, + 812386829, 824502387, 836468309, 848275065, 859915578, 871380881, 882663894, 893755956, 904651429, + 915341669, 925821650, 936083534, 946122397, 955931903, 965507514, 974842174, 983932079, 992771963, + 1001359538, 1009689065, 1017758097, 1025562027, 1033099052, 1040366302, 1047363095, 1054086968, 1060539102, + 1066717272, 1072622704, 1078255082, 1083616279, 1088705978, 1093526428, 1098077639, 1102363841, 1106387711, + 1110154526, 1113666093, 1116927603, 1119941829, 1122715077, 1125251563, 1127558143, 1129638911, 1131501374, + 1133150240, 1134593560, 1135837167, 1136890075, 1137758087, 1138450616, 1138974310, 1139338430, 1139549551, + 1139617253, 1139547254, 1139350624, 1139033981, 1138607794, 1138078811, 1137457063, 1136748191, 1135963275, + 1135107610, 1134191756, 1133220410, 1132203794, 1131145038, 1130056206, 1128938553, 1127804154, 1126651875, + 1125505224, 1124387956, 1123424960, 1122502936, 1121204059, 1119950632, 1118742198, 1117576653, 1116454214, + 1115372925, 1114332841, 1113331819, 1112370092, 1111445403, 1110557933, 1109705650, 1108888492, 1108104203, + 1107353139, 1106633126, 1105944161, 1105284140, 1104653414, 1104049906, 1103473745, 1102922793, 1102397465, + 1101895930, 1101418393, 1100962642, 1100529407, 1100117107, 1099725702, 1099353203, 1099000764, 1098666499, + 1098350488, 1098051309, 1097769862, 1097504226, 1097255015, 1097020632, 1096801846, 1096597180, 1096407228, + 1096230254, 1096067339, 1095917048, 1095779800, 1095654043, 1095540974, 1095438919, 1095348396, 1095268166, + 1095199173, 1095139611, 1095090409, 1095050175, 1095019519, 1094996963, 1094983471, 1094977391, 1094979525, + 1094988385, 1095004796, 1095027271, 1095056499, 1095090869, 1095131425, 1095176627, 1095227052, 1095281232, + 1095340201, 1095402343, 1095468278, 1095536534, 1095608171, 1095681620, 1095757514, 1095834402, 1095913392, + 1095992947, 1096073625, 1096154019, 1096235421, 1096316155, 1096396797, 1096476293, 1096555751, 1096633346, + 1096710075, 1096784773, 1096858327, 1096929351, 1096998877, 1097065514, 1097130458, 1097192392, 1097252182, + 1097308660, 1097363134, 1097414177, 1097462864, 1097508260, 1097551529, 1097591240, 1097628824, 1097663320, + 1097695680, 1097724878, 1097752577, 1097777519, 1097800889, 1097821938, 1097842083, 1097860192, 1097877707, + 1097893767, 1097909925, 1097925238, 1097941056, 1097956579, 1097973457, 1097990704, 1098009705, 1098029761, + 1098052600, 1098077182, 1098104865, 1098135087, 1098169468, 1098206820, 1098248699, 1098294539, 1098345796, + 1098401373, 1098462829, 1098529452, 1098602617, 1098681182, 1098766743, 1098858507, 1098957729, 1099063375, + 1099176931, 1099297350, 1099425943, 1099561602, 1099705648, 1099857107, 1100017184, 1100184629, 1100360829, + 1100544624, 1100737006, 1100936785, 1101145313, 1101361273, 1101585583, 1101817094, 1102057069, 1102303875, + 1102558446, 1102819734, 1103088684, 1103363640, 1103645734, 1103933619, 1104228082, 1104527573, 1104833025, + 1105142974, 1105458288, 1105777328, 1106100968, 1106427742, 1106758401, 1107091175, 1107426928, 1107764262, + 1108103811, 1108443736, 1108785137, -1109126464, -1109468075, -1109808418, -1110148595, -1110486758, -1110823540, + -1111157536, -1111489609, -1111817975, -1112143382, -1112464352, -1112781755, -1113093934, -1113401755, -1113703734, + -1114000803, -1114291390, -1114576277, -1114854097, -1115125982, -1115390248, -1115647841, -1115897690, -1116140732, + -1116375302, -1116602670, -1116821661, -1117033199, -1117235935, -1117431235, -1117617882, -1117796873, -1117967024, + -1118129738, -1118283734, -1118430232, -1118568236, -1118699084, -1118821642, -1118937239, -1119044805, -1119145850, + -1119239316, -1119326479, -1119406526, -1119481081, -1119548979, -1119611618, -1119668271, -1119720525, -1119767262, + -1119809963, -1119848051, -1119883112, -1119913933, -1119942166, -1119967238, -1119990533, -1120010991, -1120030373, + -1120047967, -1120065185, -1120081021, -1120097158, -1120112780, -1120129265, -1120145650, -1120163521, -1120181998, + -1120202553, -1120224032, -1120247880, -1120273333, -1120301601, -1120331401, -1120364428, -1120399639, -1120438004, + -1120478543, -1120522718, -1120569068, -1120618782, -1120670906, -1120726540, -1120784227, -1120845302, -1120908575, + -1120974930, -1121043024, -1121114079, -1121186673, -1121261863, -1121338234, -1121416691, -1121496045, -1121577316, + -1121658638, -1121741144, -1121823756, -1121907065, -1121989354, -1122071945, -1122153400, -1122234287, -1122313032, + -1122390771, -1122466015, -1122539413, -1122609356, -1122676929, -1122740622, -1122801070, -1122856613, -1122908312, + -1122954661, -1122996249, -1123031496, -1123061471, -1123084522, -1123101354, -1123110442, -1123112631, -1123106394, + -1123092556, -1123069422, -1123037982, -1122996721, -1122946267, -1122885196, -1122814464, -1122732221, -1122639444, + -1122534864, -1122419021, -1122290207, -1122149656, -1121995788, -1121829044, -1121647967, -1121453676, -1121244410, + -1121020792, -1120781333, -1120526836, -1120255693, -1119968555, -1119663488, -1119341437, -1119000986, -1118642248, + -1118263342, -1117865480, -1117446686, -1117006965, -1116544763, -1116060878, -1115553126, -1115021782, -1114465065, + -1113883468, -1113274918, -1112639632, -1111975615, -1111283324, -1110560756, -1109808026, -1109023086, -1108206431, + -1107355953, -1106471748, -1105551963, -1104596956, -1103604680, -1102575570, -1101507722, -1100401422, -1099254985, + -1098068882, -1096841318, -1095572135, -1093824443, -1092028958, -1090297711, -1088504795, -1086622918, -1084627237, + -1082515433, -1080275819, -1077903929, -1075390736, -1072729748, -1069911131, -1066927638, -1063770248, -1060430896, + -1056901504, -1053173546, -1049238310, -1045087876, -1040714437, -1036109920, -1031267875, -1026179775, -1020838674, + -1015237521, -1009370093, -1003230227, -996813209, -990113245, -983126698, -975849235, -968277852, -960408557, + -952239544, -943768000, -934993585, -925915442, -916534205, -906849190, -896862428, -886574831, -875990255, + -865111684, -853943783, -842489873, -830755484, -818745230, -806465779, -793923840, -781127868, -768084617, + -754803973, -741294413, -727567055, -713632929, -699502178, -685184041, -670691428, -656036019, -641230326, + -626286760, -611223511, -596053211, -580789367, -565447177, -550042966, -534590207, -519104101, -503600887, + -488098220, -472611780, -457157918, -441752495, -426412611, -411154642, -395995557, -380951672, -366040108, + -351277307, -336679493, -322262126, -308041137, -294032383, -280251079, -266711613, -253427888, -240414233, + -227684137, -215250748, -203125310, -191319486, -179843288, -168707738, -157921160, -147492810, -137428529, + -127735992, -118418783, -109483185, -100930269, -92764786, -84984919, -77594007, -70587122, -63966522, + -57723857, -51860743, -46364893, -41238076, -36463273, -32043815, -27956560, -24209143, -20769591, + -17655994, -14819879, -12293428, -9917917, -7494462, -3886267 }; +#else +#define MDCT_WINDOW_FS_48000_frame_ms_100 NULL +#endif + +#ifdef PACK_MDCT_WINDOWS +RAM_ALIGN const Word16 * LowDelayShapes_n960[6]; +#else +RAM_ALIGN const Word32 *const LowDelayShapes_n960[6] = { MDCT_WINDOW_FS_8000_frame_ms_100, MDCT_WINDOW_FS_16000_frame_ms_100, + MDCT_WINDOW_FS_24000_frame_ms_100, MDCT_WINDOW_FS_32000_frame_ms_100, + MDCT_WINDOW_FS_48000_frame_ms_100, NULL }; +#endif + +#else +RAM_ALIGN const Word16 *const LowDelayShapes_n960[6] = {LowDelayShapes_n960_N80, LowDelayShapes_n960_N160, + LowDelayShapes_n960_N240, LowDelayShapes_n960_N320, + LowDelayShapes_n960_N480, NULL}; +#endif + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 LowDelayShapes_n960_len_5ms[6] = {70, 140, 210, 280, 420, 840}; +#else +RAM_ALIGN const Word16 LowDelayShapes_n960_len_5ms[5] = {70, 140, 210, 280, 420}; +#endif + +RAM_ALIGN const Word16 LowDelayShapes_n960_la_zeroes_5ms[NUM_SAMP_FREQ] = {10, + 20, + 30, + 40, + 60 +#ifdef ENABLE_HR_MODE + , 120 +#endif +}; + +#ifdef ENABLE_HR_MODE +#ifdef SUBSET_NB +RAM_ALIGN const Word32 MDCT_WINDOW_FS_8000_frame_ms_25[40] = { + 9151354, 37109627, 83712740, 151998210, 242715442, 354150912, 482126354, 620379048, + 761296862, 896901837, 1019922302, 1124767307, 1208223590, 1269735636, 1311202326, 1336324669, + 1349655864, 1355605615, 1357680847, 1358157082, -1358157082, -1357680847, -1355605615, -1349655864, + -1336324669, -1311202326, -1269735636, -1208223590, -1124767307, -1019922302, -896901837, -761296862, + -620379048, -482126354, -354150912, -242715442, -151998210, -83712740, -37109627, -9151354}; +#else +#define MDCT_WINDOW_FS_8000_frame_ms_25 NULL +#endif +#ifdef SUBSET_WB +RAM_ALIGN const Word32 MDCT_WINDOW_FS_16000_frame_ms_25[80] = { + 9151337, 23138265, 42763907, 68767772, 101782534, 142300433, 190643613, 246939893, 311105303, + 382834448, 461599452, 546657840, 637069348, 731721202, 829361019, 928636120, 1028137675, 1126447891, + 1222188210, 1314066414, 1400920509, 1481757333, 1555784035, 1622430811, 1681363664, 1732486397, 1775931558, + 1812040689, 1841334847, 1864477074, 1882229157, 1895405578, 1904827946, 1911283293, 1915489337, 1918069115, + 1919536352, 1920291661, 1920628396, 1920745966, -1920745966, -1920628396, -1920291661, -1919536352, -1918069115, + -1915489337, -1911283293, -1904827946, -1895405578, -1882229157, -1864477074, -1841334847, -1812040689, -1775931558, + -1732486397, -1681363664, -1622430811, -1555784035, -1481757333, -1400920509, -1314066414, -1222188210, -1126447891, + -1028137675, -928636120, -829361019, -731721202, -637069348, -546657840, -461599452, -382834448, -311105303, + -246939893, -190643613, -142300433, -101782534, -68767772, -42763907, -23138265, -9151337 }; +#else +#define MDCT_WINDOW_FS_16000_frame_ms_25 NULL +#endif +#ifdef SUBSET_SSWB +RAM_ALIGN const Word32 MDCT_WINDOW_FS_24000_frame_ms_25[120] = { + 6100899, 12864132, 21489409, 32196712, 45171875, 60580072, 78565098, 99246695, 122717635, + 149041013, 178247915, 210335558, 245265970, 282965259, 323323502, 366195270, 411400805, 458727828, + 507933969, 558749783, 610882290, 664019005, 717832373, 771984525, 826132286, 879932323, 933046345, + 985146249, 1035919114, 1085071930, 1132335985, 1177470792, 1220267489, 1260551623, 1298185265, 1333068386, + 1365139469, 1394375330, 1420790145, 1444433697, 1465388876, 1483768499, 1499711524, 1513378754, 1524948163, + 1534609980, 1542561681, 1549003060, 1554131535, 1558137849, 1561202310, 1563491688, 1565156852, 1566331192, + 1567129839, 1567649635, 1567969785, 1568153080, 1568247554, 1568288448, -1568288448, -1568247554, -1568153080, + -1567969785, -1567649635, -1567129839, -1566331192, -1565156852, -1563491688, -1561202310, -1558137849, -1554131535, + -1549003060, -1542561681, -1534609980, -1524948163, -1513378754, -1499711524, -1483768499, -1465388876, -1444433697, + -1420790145, -1394375330, -1365139469, -1333068386, -1298185265, -1260551623, -1220267489, -1177470792, -1132335985, + -1085071930, -1035919114, -985146249, -933046345, -879932323, -826132286, -771984525, -717832373, -664019005, + -610882290, -558749783, -507933969, -458727828, -411400805, -366195270, -323323502, -282965259, -245265970, + -210335558, -178247915, -149041013, -122717635, -99246695, -78565098, -60580072, -45171875, -32196712, + -21489409, -12864132, -6100899 }; +#else +#define MDCT_WINDOW_FS_24000_frame_ms_25 NULL +#endif +#ifdef SUBSET_SWB +RAM_ALIGN const Word32 MDCT_WINDOW_FS_32000_frame_ms_25[160] = { + 4575679, 8767860, 13776210, 19722611, 26689435, 34747238, 43959497, 54383445, 66069923, + 79062931, 93399091, 109107106, 126207257, 144710958, 164620379, 185928150, 208617151, 232660396, + 258021008, 284652300, 312497943, 341492250, 371560541, 402619617, 434578316, 467338167, 500794115, + 534835326, 569346062, 604206611, 639294264, 674484335, 709651210, 744669409, 779414654, 813764938, + 847601565, 880810169, 913281687, 944913281, 975609194, 1005281536, 1033850982, 1061247376, 1087410241, + 1112289173, 1135844126, 1158045581, 1178874586, 1198322683, 1216391705, 1233093455, 1248449271, 1262489470, + 1275252698, 1286785178, 1297139874, 1306375586, 1314555990, 1321748631, 1328023899, 1333453999, 1338111934, + 1342070524, 1345401476, 1348174521, 1350456644, 1352311405, 1353798377, 1354972700, 1355884752, 1356579954, + 1357098688, 1357476324, 1357743362, 1357925654, 1358044707, 1358118045, 1358159612, 1358180205, -1358180205, + -1358159612, -1358118045, -1358044707, -1357925654, -1357743362, -1357476324, -1357098688, -1356579954, -1355884752, + -1354972700, -1353798377, -1352311405, -1350456644, -1348174521, -1345401476, -1342070524, -1338111934, -1333453999, + -1328023899, -1321748631, -1314555990, -1306375586, -1297139874, -1286785178, -1275252698, -1262489470, -1248449271, + -1233093455, -1216391705, -1198322683, -1178874586, -1158045581, -1135844126, -1112289173, -1087410241, -1061247376, + -1033850982, -1005281536, -975609194, -944913281, -913281687, -880810169, -847601565, -813764938, -779414654, + -744669409, -709651210, -674484335, -639294264, -604206611, -569346062, -534835326, -500794115, -467338167, + -434578316, -402619617, -371560541, -341492250, -312497943, -284652300, -258021008, -232660396, -208617151, + -185928150, -164620379, -144710958, -126207257, -109107106, -93399091, -79062931, -66069923, -54383445, + -43959497, -34747238, -26689435, -19722611, -13776210, -8767860, -4575679 }; +#else +#define MDCT_WINDOW_FS_32000_frame_ms_25 NULL +#endif +#ifdef SUBSET_FB +RAM_ALIGN const Word32 MDCT_WINDOW_FS_48000_frame_ms_25[240] = { + 3050456, 5295536, 7753004, 10501942, 13578229, 17006497, 20806969, 24997575, 29594719, + 34613583, 40068237, 45971662, 52335732, 59171174, 66487516, 74293042, 82594732, 91398213, + 100707709, 110526001, 120854381, 131692624, 143038956, 154890033, 167240926, 180085109, 193414462, + 207219271, 221488240, 236208515, 251365705, 266943917, 282925795, 299292569, 316024108, 333098980, + 350494519, 368186897, 386151203, 404361529, 422791056, 441412148, 460196455, 479115006, 498138325, + 517236531, 536379451, 555536738, 574677975, 593772799, 612791011, 631702693, 650478321, 669088878, + 687505964, 705701904, 723649854, 741323899, 758699157, 775751861, 792459455, 808800673, 824755609, + 840305794, 855434253, 870125559, 884365881, 898143024, 911446458, 924267340, 936598527, 948434586, + 959771781, 970608068, 980943072, 990778052, 1000115868, 1008960932, 1017319150, 1025197865, 1032605778, + 1039552878, 1046050356, 1052110513, 1057746665, 1062973048, 1067804709, 1072257401, 1076347473, 1080091765, + 1083507488, 1086612119, 1089423293, 1091958692, 1094235940, 1096272508, 1098085614, 1099692137, 1101108528, + 1102350741, 1103434158, 1104373531, 1105182928, 1105875693, 1106464406, 1106960861, 1107376047, 1107720140, + 1108002502, 1108231688, 1108415463, 1108560820, 1108674010, 1108760573, 1108825377, 1108872657, 1108906059, + 1108928685, 1108943144, 1108951592, -1108951592, -1108943144, -1108928685, -1108906059, -1108872657, -1108825377, + -1108760573, -1108674010, -1108560820, -1108415463, -1108231688, -1108002502, -1107720140, -1107376047, -1106960861, + -1106464406, -1105875693, -1105182928, -1104373531, -1103434158, -1102350741, -1101108528, -1099692137, -1098085614, + -1096272508, -1094235940, -1091958692, -1089423293, -1086612119, -1083507488, -1080091765, -1076347473, -1072257401, + -1067804709, -1062973048, -1057746665, -1052110513, -1046050356, -1039552878, -1032605778, -1025197865, -1017319150, + -1008960932, -1000115868, -990778052, -980943072, -970608068, -959771781, -948434586, -936598527, -924267340, + -911446458, -898143024, -884365881, -870125559, -855434253, -840305794, -824755609, -808800673, -792459455, + -775751861, -758699157, -741323899, -723649854, -705701904, -687505964, -669088878, -650478321, -631702693, + -612791011, -593772799, -574677975, -555536738, -536379451, -517236531, -498138325, -479115006, -460196455, + -441412148, -422791056, -404361529, -386151203, -368186897, -350494519, -333098980, -316024108, -299292569, + -282925795, -266943917, -251365705, -236208515, -221488240, -207219271, -193414462, -180085109, -167240926, + -154890033, -143038956, -131692624, -120854381, -110526001, -100707709, -91398213, -82594732, -74293042, + -66487516, -59171174, -52335732, -45971662, -40068237, -34613583, -29594719, -24997575, -20806969, + -17006497, -13578229, -10501942, -7753004, -5295536, -3050456 }; +#else +#define MDCT_WINDOW_FS_48000_frame_ms_25 NULL +#endif +#endif + +#ifdef ENABLE_HR_MODE +#ifdef SUBSET_NB +RAM_ALIGN const Word32 MDCT_WINDOW_FS_8000_frame_ms_50[70] = { + 1912909, 7335521, 18325724, 36910622, 64974178, 104198418, 155981280, 221305462, 300589079, + 393635120, 499623692, 617106989, 744004208, 877694270, 1015162828, 1153137249, 1288239038, 1417150998, + 1536791945, 1644447880, 1737962977, 1815833349, 1877263804, 1922306058, 1951829636, 1967471711, 1971505676, + 1966594148, 1955602246, 1941502114, 1927310881, 1914588900, 1905592841, 1900063224, 1897652925, 1897963170, + 1900562354, 1904988644, 1910750498, 1917333371, -1924208315, -1930837552, -1936677590, -1941187989, -1943846368, + -1944164165, -1941697923, -1936063536, -1926966575, -1914246866, -1895468226, -1869147188, -1832534703, -1783214725, + -1719263259, -1639330989, -1542778136, -1429960741, -1302431717, -1162827131, -1014564422, -861762630, -709123640, + -561741289, -424627691, -302165309, -197940066, -114914393, -55161222, -18600494 }; +#else +#define MDCT_WINDOW_FS_8000_frame_ms_50 NULL +#endif +#ifdef SUBSET_WB +RAM_ALIGN const Word32 MDCT_WINDOW_FS_16000_frame_ms_50[140] = { + 834388, 2023133, 3917156, 6701705, 10565521, 15685856, 22235650, 30384241, 40286022, + 52095516, 65948322, 81967398, 100265346, 120927126, 144016301, 169574495, 197607091, 228098907, + 261006859, 296253144, 333742048, 373344049, 414902600, 458235462, 503129294, 549353006, 596652543, + 644762423, 693401311, 742277119, 791098023, 839557429, 887360048, 934211532, 979820668, 1023922652, + 1066251747, 1106569674, 1144656239, 1180316465, 1213396318, 1243758349, 1271300584, 1295946391, 1317664404, + 1336461856, 1352374790, 1365487180, 1375907723, 1383780765, 1389286272, 1392625157, 1394020824, 1393712039, + 1391944281, 1388970703, 1385052050, 1380450904, 1375432870, 1370255673, 1365493257, 1360311818, 1355815371, + 1351987330, 1348809662, 1346259072, 1344307938, 1342925268, 1342077528, 1341729312, 1341843769, 1342382749, + 1343306801, 1344575110, 1346145481, 1347974400, 1350017219, 1352228384, 1354561632, 1356970112, -1359406807, + -1361823903, -1364173707, -1366408059, -1368478813, -1370338075, -1371938535, -1373233878, -1374179166, -1374731135, + -1374848407, -1374491689, -1373624022, -1372211199, -1370222452, -1367631371, -1364416934, -1360564607, -1356067324, + -1350921653, -1344029735, -1336226439, -1326949476, -1315967441, -1303050661, -1287981322, -1270565808, -1250633190, + -1228037147, -1202659404, -1174406746, -1143219019, -1109079369, -1072015866, -1032110341, -989504343, -944386484, + -896992664, -847599093, -796504062, -744037160, -690570612, -636495945, -582226621, -528203723, -474881089, + -422717084, -372160937, -323635430, -277529378, -234193138, -193941056, -157058932, -123809989, -94431397, + -69117849, -47990622, -31057417, -18172622, -9019056 }; +#else +#define MDCT_WINDOW_FS_16000_frame_ms_50 NULL +#endif +#ifdef SUBSET_SSWB +RAM_ALIGN const Word32 MDCT_WINDOW_FS_24000_frame_ms_50[210] = { + 564151, 1104419, 1865494, 2894039, 4235165, 5932159, 8033172, 10580362, 13613959, + 17177173, 21310358, 26053470, 31441110, 37512859, 44302113, 51841191, 60158985, 69285016, + 79244161, 90055834, 101740044, 114307277, 127770768, 142131061, 157390145, 173545185, 190584386, + 208498576, 227265343, 246867205, 267275117, 288457873, 310382420, 333006130, 356286886, 380173162, + 404613227, 429551030, 454926373, 480676280, 506737023, 533041379, 559520739, 586104532, 612719819, + 639298867, 665764101, 692044954, 718069120, 743765156, 769064062, 793893410, 818192510, 841895640, + 864939671, 887267243, 908824605, 929558785, 949422426, 968375342, 986383128, 1003413393, 1019433821, + 1034427350, 1048371873, 1061257817, 1073079562, 1083838763, 1093544388, 1102204732, 1109843920, 1116483171, + 1122153769, 1126889366, 1130731703, 1133726105, 1135920322, 1137368676, 1138125139, 1138249333, 1137797435, + 1136832092, 1135413661, 1133604477, 1131468200, 1129067483, 1126468580, 1123733695, 1120926768, 1118121453, + 1115661504, 1112733456, 1110039679, 1107592275, 1105388417, 1103424195, 1101694785, 1100194540, 1098917076, + 1097855409, 1097002014, 1096348961, 1095887953, 1095610427, 1095507566, 1095570351, 1095789547, 1096155725, + 1096659227, 1097290187, 1098038501, 1098893850, 1099845706, 1100883348, 1101995893, 1103172315, 1104401472, + 1105672121, 1106972938, 1108292669, -1109619302, -1110942189, -1112249205, -1113528884, -1114769580, -1115959638, + -1117087420, -1118141328, -1119109856, -1119981619, -1120745408, -1121390225, -1121905319, -1122280224, -1122504764, + -1122569097, -1122463704, -1122179448, -1121707579, -1121039818, -1120168401, -1119086203, -1117786804, -1116264645, + -1114515111, -1112534671, -1110320979, -1107872954, -1105190944, -1102290376, -1098369607, -1094349090, -1089850335, + -1084803470, -1079152632, -1072839707, -1065811535, -1058014404, -1049399648, -1039922082, -1029539502, -1018216878, + -1005918442, -992617105, -978287110, -962909114, -946468188, -928955851, -910372331, -890723372, -870025772, + -848301812, -825588219, -801924529, -777362543, -751959302, -725776798, -698887464, -671358557, -643273732, + -614708529, -585759042, -556515015, -527075925, -497538887, -468010517, -438598442, -409412725, -380564000, + -352163661, -324321484, -297140687, -270721761, -245158912, -220540161, -196946958, -174455223, -153136078, + -133056674, -114280750, -96868231, -80874056, -66345855, -53320577, -41820223, -31847346, -23380692, + -16371397, -10739000, -6256916 }; +#else +#define MDCT_WINDOW_FS_24000_frame_ms_50 NULL +#endif +#ifdef SUBSET_SWB +RAM_ALIGN const Word32 MDCT_WINDOW_FS_32000_frame_ms_50[280] = { + 882763, 1521118, 2358563, 3425984, 4762639, 6395771, 8362131, 10689006, 13418692, + 16576000, 20193865, 24299300, 28928500, 34104984, 39865074, 46229302, 53228467, 60887056, + 69236180, 78292965, 88087142, 98634050, 109959733, 122081209, 135019424, 148782425, 163392710, + 178855011, 195181305, 212377526, 230451659, 249395809, 269219382, 289915225, 311477904, 333897457, + 357170677, 381274098, 406199848, 431929301, 458441926, 485710203, 513718369, 542430861, 571822196, + 601857045, 632504350, 663719412, 695470641, 727711424, 760403450, 793496784, 826949741, 860710772, + 894737379, 928972875, 963373530, 997882662, 1032450522, 1067021806, 1101552211, 1135977909, 1170251366, + 1204317771, 1238127288, 1271622131, 1304759595, 1337479850, 1369736833, 1401482421, 1432674669, 1463259078, + 1493196881, 1522440628, 1550955893, 1578698536, 1605635690, 1631726882, 1656947594, 1681264014, 1704659250, + 1727103999, 1748576205, 1769054798, 1788533700, 1806990078, 1824418644, 1840812466, 1856170505, 1870488908, + 1883781944, 1896047096, 1907297858, 1917548829, 1926819646, 1935123035, 1942490021, 1948939055, 1954502859, + 1959211322, 1963101243, 1966202102, 1968559589, 1970206964, 1971189283, 1971546464, 1971324022, 1970559672, + 1969305529, 1967600289, 1965492731, 1963026251, 1960251018, 1957207403, 1953949375, 1950518787, 1946965804, + 1943332468, 1939669743, 1936018211, 1933074896, 1929170790, 1925511708, 1922091318, 1918913458, 1915970631, + 1913265545, 1910789617, 1908544525, 1906520767, 1904719178, 1903129502, 1901751868, 1900575443, 1899599816, + 1898813735, 1898216400, 1897796234, 1897552155, 1897472330, 1897555435, 1897789418, 1898172732, 1898693091, + 1899348726, 1900127098, 1901026195, 1902033230, 1903145941, 1904351313, 1905646871, 1907019391, 1908466229, + 1909973977, 1911539869, 1913150363, 1914802598, 1916482920, 1918188394, 1919905292, -1921630629, -1923350609, + -1925062194, -1926751519, -1928415501, -1930040212, -1931622556, -1933148598, -1934615259, -1936008644, -1937325739, + -1938552759, -1939686835, -1940714349, -1941632651, -1942428351, -1943099088, -1943631764, -1944024336, -1944264050, + -1944349204, -1944267410, -1944017355, -1943587051, -1942975631, -1942171601, -1941174620, -1939973809, -1938569504, + -1936951577, -1935121231, -1933069293, -1930798023, -1928299406, -1925576914, -1922623868, -1919445128, -1916035514, + -1912401346, -1908538993, -1903226832, -1898165387, -1892651677, -1886636702, -1880083188, -1872945708, -1865186866, + -1856760038, -1847633035, -1837760249, -1827110036, -1815644193, -1803335041, -1790145270, -1776055593, -1761033530, + -1745059396, -1728108424, -1710167501, -1691212572, -1671237793, -1650226116, -1628174600, -1605075941, -1580936677, + -1555754529, -1529546654, -1502320930, -1474101256, -1444909741, -1414780308, -1383738492, -1351831573, -1319095487, + -1285577912, -1251324682, -1216394344, -1180827594, -1144691880, -1108040592, -1070930654, -1033434550, -995621142, + -957552560, -919309430, -880954958, -842572374, -804234470, -766025822, -728021485, -690307576, -652960034, + -616065598, -579699451, -543943367, -508866771, -474546527, -441046910, -408438534, -376778154, -346129113, + -316541929, -288074358, -260771792, -234687576, -209863469, -186348825, -164181088, -143404068, -124048067, + -106147028, -89718620, -74780184, -61329654, -49360094, -38842904, -29739589, -21991349, -15513048, + -10180154 }; +#else +#define MDCT_WINDOW_FS_32000_frame_ms_50 NULL +#endif +#ifdef SUBSET_FB +RAM_ALIGN const Word32 MDCT_WINDOW_FS_48000_frame_ms_50[420] = { + 641452, 963468, 1344309, 1798864, 2336113, 2963727, 3690212, 4523143, 5470567, + 6539876, 7738462, 9075874, 10560639, 12200013, 14000287, 15968479, 18112467, 20440430, + 22959153, 25675517, 28597257, 31731569, 35084700, 38662325, 42471171, 46518292, 50811124, + 55354756, 60154720, 65216952, 70547205, 76150562, 82031461, 88195322, 94647798, 101393537, + 108435354, 115776449, 123420676, 131372779, 139634617, 148207504, 157093536, 166295700, 175815910, + 185653595, 195807761, 206278987, 217068929, 228177014, 239600679, 251337195, 263385931, 275745715, + 288413583, 301384760, 314655039, 328222340, 342083665, 356233498, 370664518, 385372123, 400351243, + 415596618, 431100575, 446855251, 462853492, 479088256, 495551477, 512233512, 529124734, 546216403, + 563499351, 580963667, 598598648, 616393743, 634338212, 652420945, 670630244, 688955012, 707384418, + 725906000, 744507517, 763176760, 781901922, 800670867, 819470287, 838286395, 857107788, 875922821, + 894718707, 913481313, 932196408, 950852353, 969437415, 987938553, 1006342043, 1024635125, 1042806406, + 1060844237, 1078734559, 1096464849, 1114023247, 1131399453, 1148583332, 1165562052, 1182324038, 1198858240, + 1215154081, 1231201466, 1246990634, 1262512157, 1277756598, 1292714571, 1307377034, 1321735176, 1335781943, + 1349510011, 1362912058, 1375982854, 1388718627, 1401109382, 1413152613, 1424839949, 1436168435, 1447135603, + 1457737882, 1467971469, 1477831821, 1487317959, 1496429995, 1505166563, 1513525606, 1521507797, 1529115290, + 1536350460, 1543213224, 1549704472, 1555827692, 1561587898, 1566989343, 1572034920, 1576728782, 1581076815, + 1585086027, 1588761389, 1592109107, 1595136511, 1597852394, 1600264963, 1602381209, 1604209606, 1605759882, + 1607041997, 1608065019, 1608838122, 1609371538, 1609676596, 1609763199, 1609640908, 1609320042, 1608811796, + 1608127979, 1607278811, 1606274326, 1605125864, 1603845218, 1602443629, 1600931810, 1599320348, 1597621250, + 1595846595, 1594007402, 1592114826, 1590179414, 1588213076, 1586227163, 1584231653, 1582234964, 1580207977, + 1578973545, 1576735799, 1574650444, 1572657612, 1570752789, 1568935343, 1567204832, 1565560739, 1564002460, + 1562529304, 1561140497, 1559835185, 1558612434, 1557471243, 1556410547, 1555429220, 1554526076, 1553699872, + 1552949321, 1552273100, 1551669839, 1551138129, 1550676530, 1550283581, 1549957792, 1549697644, 1549501594, + 1549368091, 1549295559, 1549282400, 1549326998, 1549427723, 1549582929, 1549790946, 1550050083, 1550358639, + 1550714889, 1551117086, 1551563464, 1552052237, 1552581604, 1553149738, 1553754795, 1554394911, 1555068212, + 1555772800, 1556506765, 1557268182, 1558055112, 1558865609, 1559697712, 1560549450, 1561418844, 1562303905, + 1563202640, 1564113045, 1565033113, 1565960825, 1566894119, 1567830370, -1568770400, -1569707772, -1570643299, + -1571574337, -1572498793, -1573414613, -1574319739, -1575212113, -1576089676, -1576950365, -1577792121, -1578612885, + -1579410602, -1580183223, -1580928704, -1581645010, -1582330113, -1582982003, -1583598681, -1584178165, -1584718489, + -1585217707, -1585673898, -1586085163, -1586449622, -1586765423, -1587030743, -1587243787, -1587402781, -1587505982, + -1587551679, -1587538195, -1587463877, -1587327103, -1587126293, -1586859906, -1586526431, -1586124397, -1585652387, + -1585109032, -1584493010, -1583803053, -1583037961, -1582196603, -1581277917, -1580280911, -1579204680, -1578048412, + -1576811384, -1575492968, -1574092640, -1572609980, -1571044684, -1569396562, -1567665543, -1565851670, -1563955090, + -1561975794, -1559909960, -1557699231, -1554579493, -1551951859, -1549122074, -1546121016, -1542941389, -1539572601, + -1536005010, -1532229275, -1528234689, -1524011122, -1519548313, -1514837211, -1509868869, -1504633300, -1499121016, + -1493323395, -1487232726, -1480841309, -1474140699, -1467123022, -1459782240, -1452112311, -1444106817, -1435759114, + -1427063276, -1418015155, -1408610288, -1398843935, -1388711462, -1378209682, -1367336091, -1356088102, -1344462791, + -1332458664, -1320075617, -1307313612, -1294173092, -1280654545, -1266760135, -1252493498, -1237857298, -1222855659, + -1207493934, -1191778366, -1175716859, -1159315327, -1142581197, -1125524357, -1108155092, -1090483582, -1072519662, + -1054273467, -1035757912, -1016986859, -997971439, -978723129, -959255645, -939584189, -919723670, -899686034, + -879484158, -859140109, -838667380, -818082710, -797402257, -776643501, -755824703, -734962210, -714073915, + -693179322, -672297393, -651446511, -630646657, -609917124, -589277150, -568746490, -548345449, -528092326, + -508008241, -488111645, -468421183, -448956496, -429734434, -410773661, -392090517, -373702005, -355624406, + -337873208, -320463322, -303409145, -286724555, -270422942, -254517317, -239020241, -223943842, -209300003, + -195100311, -181356034, -168078124, -155277193, -142963461, -131146681, -119836028, -109039985, -98766166, + -89021184, -79810417, -71137840, -63005796, -55414797, -48363340, -41847826, -35862016, -30397367, + -25442735, -20983937, -17003804, -13482292, -10414308, -8112352 }; +#else +#define MDCT_WINDOW_FS_48000_frame_ms_50 NULL +#endif +#endif + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word32 *const LowDelayShapes_n960_5ms[6] = { + MDCT_WINDOW_FS_8000_frame_ms_50, MDCT_WINDOW_FS_16000_frame_ms_50, MDCT_WINDOW_FS_24000_frame_ms_50, MDCT_WINDOW_FS_32000_frame_ms_50, MDCT_WINDOW_FS_48000_frame_ms_50, NULL }; +#else +RAM_ALIGN const Word16 *const LowDelayShapes_n960_5ms[6] = {LowDelayShapes_n960_N40_5ms, LowDelayShapes_n960_N80_5ms, + LowDelayShapes_n960_N120_5ms, LowDelayShapes_n960_N160_5ms, + LowDelayShapes_n960_N240_5ms, NULL}; +#endif + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 LowDelayShapes_n960_len_2_5ms[6] = {40, 80, 120, 160, 240, 480}; +#else +RAM_ALIGN const Word16 LowDelayShapes_n960_len_2_5ms[5] = {40, 80, 120, 160, 240}; +#endif + +RAM_ALIGN const Word16 LowDelayShapes_n960_la_zeroes_2_5ms[NUM_SAMP_FREQ] = {0, + 0, + 0, + 0, + 0 +}; + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word32 *const LowDelayShapes_n960_2_5ms[6] = { + MDCT_WINDOW_FS_8000_frame_ms_25, MDCT_WINDOW_FS_16000_frame_ms_25, MDCT_WINDOW_FS_24000_frame_ms_25, MDCT_WINDOW_FS_32000_frame_ms_25, MDCT_WINDOW_FS_48000_frame_ms_25, NULL }; +#else +RAM_ALIGN const Word16 *const LowDelayShapes_n960_2_5ms[6] = { + LowDelayShapes_n960_N40_2_5ms, LowDelayShapes_n960_N80_2_5ms, LowDelayShapes_n960_N120_2_5ms, + LowDelayShapes_n960_N160_2_5ms, LowDelayShapes_n960_N240_2_5ms, NULL}; +#endif + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 tns_subdiv_startfreq_48k_HR[6] = {12, 74, 137, 200, 266, 333}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_48k_HR[6] = {74, 137, 200, 266, 333, 400}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_96k_HR[6] = {12, 74, 137, 200, 266, 333}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_96k_HR[6] = {74, 137, 200, 266, 333, 400}; +RAM_ALIGN const Word16 *const tns_subdiv_startfreq_HR[2] = {tns_subdiv_startfreq_48k_HR, tns_subdiv_startfreq_96k_HR}; +RAM_ALIGN const Word16 *const tns_subdiv_stopfreq_HR[2] = {tns_subdiv_stopfreq_48k_HR, tns_subdiv_stopfreq_96k_HR}; + +RAM_ALIGN const Word16 tns_subdiv_startfreq_48k_5ms_HR[4] = {6, 53, 100, 150}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_48k_5ms_HR[4] = {53, 100, 150, 200}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_96k_5ms_HR[4] = {6, 53, 100, 150}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_96k_5ms_HR[4] = {53, 100, 150, 200}; + +RAM_ALIGN const Word16 *const tns_subdiv_startfreq_5ms_HR[2] = {tns_subdiv_startfreq_48k_5ms_HR, + tns_subdiv_startfreq_96k_5ms_HR}; +RAM_ALIGN const Word16 *const tns_subdiv_stopfreq_5ms_HR[2] = {tns_subdiv_stopfreq_48k_5ms_HR, + tns_subdiv_stopfreq_96k_5ms_HR}; + +RAM_ALIGN const Word16 tns_subdiv_startfreq_48k_2_5ms_HR[2] = {3, 51}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_48k_2_5ms_HR[2] = {51, 100}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_96k_2_5ms_HR[2] = {3, 51}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_96k_2_5ms_HR[2] = {51, 100}; + +RAM_ALIGN const Word16 *const tns_subdiv_startfreq_2_5ms_HR[2] = {tns_subdiv_startfreq_48k_2_5ms_HR, + tns_subdiv_startfreq_96k_2_5ms_HR}; +RAM_ALIGN const Word16 *const tns_subdiv_stopfreq_2_5ms_HR[2] = {tns_subdiv_stopfreq_48k_2_5ms_HR, + tns_subdiv_stopfreq_96k_2_5ms_HR}; +#endif + + +RAM_ALIGN const Word16 tns_subdiv_startfreq_8k[6] = {12, 34, 57, 0, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_8k[6] = {34, 57, 80, 0, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_16k[6] = {12, 61, 110, 0, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_16k[6] = {61, 110, 160, 0, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_24k[6] = {12, 88, 164, 0, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_24k[6] = {88, 164, 240, 0, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_32k[6] = {12, 61, 110, 160, 213, 266}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_32k[6] = {61, 110, 160, 213, 266, 320}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_48k[6] = {12, 74, 137, 200, 266, 333}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_48k[6] = {74, 137, 200, 266, 333, 400}; +RAM_ALIGN const Word16 *const tns_subdiv_startfreq[MAX_BW_BANDS_NUMBER] = { + tns_subdiv_startfreq_8k, tns_subdiv_startfreq_16k, tns_subdiv_startfreq_24k, tns_subdiv_startfreq_32k, + tns_subdiv_startfreq_48k}; +RAM_ALIGN const Word16 *const tns_subdiv_stopfreq[MAX_BW_BANDS_NUMBER] = { + tns_subdiv_stopfreq_8k, tns_subdiv_stopfreq_16k, tns_subdiv_stopfreq_24k, tns_subdiv_stopfreq_32k, + tns_subdiv_stopfreq_48k}; + + +RAM_ALIGN const Word16 tns_subdiv_startfreq_8k_5ms[4] = {6, 23, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_8k_5ms[4] = {23, 40, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_16k_5ms[4] = {6, 43, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_16k_5ms[4] = {43, 80, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_24k_5ms[4] = {6, 63, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_24k_5ms[4] = {63, 120, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_32k_5ms[4] = {6, 43, 80, 120}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_32k_5ms[4] = {43, 80, 120, 160}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_48k_5ms[4] = {6, 53, 100, 150}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_48k_5ms[4] = {53, 100, 150, 200}; +RAM_ALIGN const Word16 *const tns_subdiv_startfreq_5ms[MAX_BW_BANDS_NUMBER] = { + tns_subdiv_startfreq_8k_5ms, tns_subdiv_startfreq_16k_5ms, tns_subdiv_startfreq_24k_5ms, + tns_subdiv_startfreq_32k_5ms, tns_subdiv_startfreq_48k_5ms}; +RAM_ALIGN const Word16 *const tns_subdiv_stopfreq_5ms[MAX_BW_BANDS_NUMBER] = { + tns_subdiv_stopfreq_8k_5ms, tns_subdiv_stopfreq_16k_5ms, tns_subdiv_stopfreq_24k_5ms, tns_subdiv_stopfreq_32k_5ms, + tns_subdiv_stopfreq_48k_5ms}; + +RAM_ALIGN const Word16 tns_subdiv_startfreq_8k_2_5ms[2] = {3, 11}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_8k_2_5ms[2] = {11, 20}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_16k_2_5ms[2] = {3, 21}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_16k_2_5ms[2] = {21, 40}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_24k_2_5ms[2] = {3, 31}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_24k_2_5ms[2] = {31, 60}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_32k_2_5ms[2] = {3, 41}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_32k_2_5ms[2] = {41, 80}; +RAM_ALIGN const Word16 tns_subdiv_startfreq_48k_2_5ms[2] = {3, 51}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_48k_2_5ms[2] = {51, 100}; + +RAM_ALIGN const Word16 *const tns_subdiv_startfreq_2_5ms[MAX_BW_BANDS_NUMBER] = { + tns_subdiv_startfreq_8k_2_5ms, tns_subdiv_startfreq_16k_2_5ms, tns_subdiv_startfreq_24k_2_5ms, + tns_subdiv_startfreq_32k_2_5ms, tns_subdiv_startfreq_48k_2_5ms}; +RAM_ALIGN const Word16 *const tns_subdiv_stopfreq_2_5ms[MAX_BW_BANDS_NUMBER] = { + tns_subdiv_stopfreq_8k_2_5ms, tns_subdiv_stopfreq_16k_2_5ms, tns_subdiv_stopfreq_24k_2_5ms, + tns_subdiv_stopfreq_32k_2_5ms, tns_subdiv_stopfreq_48k_2_5ms}; + +RAM_ALIGN const Word16 tns_subdiv_startfreq_8k_7_5ms[6] = {9, 26, 43, 0, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_8k_7_5ms[6] = {26, 43, 60, 0, 0, 0}; + +RAM_ALIGN const Word16 tns_subdiv_startfreq_16k_7_5ms[6] = {9, 46, 83, 0, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_16k_7_5ms[6] = {46, 83, 120, 0, 0, 0}; + +RAM_ALIGN const Word16 tns_subdiv_startfreq_24k_7_5ms[6] = {9, 66, 123, 0, 0, 0}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_24k_7_5ms[6] = {66, 123, 180, 0, 0, 0}; + +RAM_ALIGN const Word16 tns_subdiv_startfreq_32k_7_5ms[6] = {9, 46, 82, 120, 159, 200}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_32k_7_5ms[6] = {46, 82, 120, 159, 200, 240}; + +RAM_ALIGN const Word16 tns_subdiv_startfreq_48k_7_5ms[6] = {9, 56, 103, 150, 200, 250}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_48k_7_5ms[6] = {56, 103, 150, 200, 250, 300}; + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 tns_subdiv_startfreq_96k_7_5ms[6] = {9, 56, 103, 150, 200, 250}; +RAM_ALIGN const Word16 tns_subdiv_stopfreq_96k_7_5ms[6] = {56, 103, 150, 200, 250, 300}; +#endif + +RAM_ALIGN const Word16 *const tns_subdiv_startfreq_7_5ms[] = { + tns_subdiv_startfreq_8k_7_5ms, tns_subdiv_startfreq_16k_7_5ms, tns_subdiv_startfreq_24k_7_5ms, + tns_subdiv_startfreq_32k_7_5ms, tns_subdiv_startfreq_48k_7_5ms +#ifdef ENABLE_HR_MODE + , tns_subdiv_startfreq_96k_7_5ms +#endif +}; +RAM_ALIGN const Word16 *const tns_subdiv_stopfreq_7_5ms[] = { + tns_subdiv_stopfreq_8k_7_5ms, tns_subdiv_stopfreq_16k_7_5ms, tns_subdiv_stopfreq_24k_7_5ms, + tns_subdiv_stopfreq_32k_7_5ms, tns_subdiv_stopfreq_48k_7_5ms +#ifdef ENABLE_HR_MODE + , tns_subdiv_stopfreq_96k_7_5ms +#endif +}; + +RAM_ALIGN const Word16 Tab_esc_nb[4] = {0 << (NBITS_CONTEXT + NBITS_RATEQ), 1 << (NBITS_CONTEXT + NBITS_RATEQ), + 2 << (NBITS_CONTEXT + NBITS_RATEQ), 3 << (NBITS_CONTEXT + NBITS_RATEQ)}; +RAM_ALIGN const Word8 ari_spec_lookup[4096] = { + 0x01, 0x27, 0x07, 0x19, 0x16, 0x16, 0x1C, 0x16, 0x16, 0x16, 0x16, 0x1C, 0x1C, 0x1C, 0x22, 0x1F, 0x1F, 0x28, 0x2B, + 0x2E, 0x31, 0x34, 0x0E, 0x11, 0x24, 0x24, 0x24, 0x26, 0x00, 0x39, 0x26, 0x16, 0x00, 0x08, 0x09, 0x0B, 0x2F, 0x0E, + 0x0E, 0x11, 0x24, 0x24, 0x24, 0x26, 0x3B, 0x3B, 0x26, 0x16, 0x16, 0x1A, 0x2E, 0x1D, 0x1E, 0x20, 0x21, 0x23, 0x24, + 0x24, 0x24, 0x26, 0x00, 0x3B, 0x17, 0x16, 0x2E, 0x2E, 0x2D, 0x2F, 0x30, 0x32, 0x32, 0x12, 0x36, 0x36, 0x36, 0x26, + 0x3B, 0x3B, 0x3B, 0x16, 0x00, 0x3E, 0x3F, 0x03, 0x21, 0x02, 0x02, 0x3D, 0x14, 0x14, 0x14, 0x15, 0x3B, 0x3B, 0x27, + 0x1C, 0x1C, 0x3F, 0x3F, 0x03, 0x21, 0x02, 0x02, 0x3D, 0x26, 0x26, 0x26, 0x15, 0x3B, 0x3B, 0x27, 0x1C, 0x1C, 0x06, + 0x06, 0x06, 0x02, 0x12, 0x3D, 0x14, 0x15, 0x15, 0x15, 0x3B, 0x27, 0x27, 0x07, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x35, 0x36, 0x14, 0x26, + 0x26, 0x39, 0x27, 0x27, 0x27, 0x07, 0x18, 0x22, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x38, 0x26, 0x39, 0x39, 0x3B, 0x07, 0x07, 0x07, 0x2A, + 0x2A, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x04, 0x04, 0x05, 0x15, 0x15, 0x3B, 0x07, 0x07, 0x07, 0x07, 0x19, 0x19, 0x19, 0x22, 0x04, 0x04, 0x04, 0x04, + 0x05, 0x17, 0x17, 0x27, 0x07, 0x07, 0x07, 0x2A, 0x19, 0x19, 0x16, 0x1F, 0x1F, 0x27, 0x27, 0x27, 0x27, 0x07, 0x07, + 0x2A, 0x00, 0x19, 0x16, 0x16, 0x16, 0x1C, 0x22, 0x1F, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, + 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x28, 0x08, 0x09, 0x31, 0x31, 0x34, 0x11, 0x11, 0x11, 0x04, 0x00, + 0x14, 0x11, 0x3C, 0x28, 0x28, 0x08, 0x2B, 0x1B, 0x31, 0x31, 0x0E, 0x11, 0x11, 0x11, 0x24, 0x2A, 0x2A, 0x11, 0x39, + 0x39, 0x28, 0x08, 0x1A, 0x1B, 0x31, 0x0C, 0x0E, 0x11, 0x11, 0x11, 0x24, 0x00, 0x26, 0x24, 0x01, 0x08, 0x08, 0x2B, + 0x09, 0x0B, 0x31, 0x0C, 0x0E, 0x0E, 0x21, 0x32, 0x32, 0x32, 0x3D, 0x24, 0x27, 0x08, 0x08, 0x2B, 0x2E, 0x31, 0x34, + 0x1E, 0x0E, 0x0E, 0x21, 0x32, 0x32, 0x32, 0x32, 0x12, 0x19, 0x08, 0x08, 0x2B, 0x2E, 0x31, 0x34, 0x1E, 0x0E, 0x0E, + 0x12, 0x05, 0x05, 0x05, 0x3D, 0x12, 0x17, 0x2B, 0x2B, 0x2B, 0x09, 0x31, 0x34, 0x03, 0x0E, 0x0E, 0x32, 0x32, 0x32, + 0x32, 0x3D, 0x11, 0x18, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, + 0x2B, 0x2B, 0x2B, 0x2B, 0x09, 0x0B, 0x34, 0x34, 0x0E, 0x0E, 0x11, 0x3D, 0x3D, 0x3D, 0x36, 0x11, 0x27, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2C, 0x1B, 0x1D, + 0x34, 0x30, 0x34, 0x34, 0x11, 0x11, 0x11, 0x11, 0x02, 0x11, 0x07, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, + 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x09, 0x1B, 0x1B, 0x0C, 0x34, 0x0E, 0x0E, 0x3A, 0x29, + 0x29, 0x29, 0x06, 0x11, 0x25, 0x09, 0x09, 0x09, 0x1B, 0x0B, 0x31, 0x0C, 0x34, 0x0E, 0x0E, 0x0E, 0x32, 0x00, 0x35, + 0x11, 0x1C, 0x34, 0x34, 0x31, 0x34, 0x0C, 0x34, 0x1E, 0x0E, 0x0E, 0x11, 0x02, 0x02, 0x02, 0x26, 0x26, 0x22, 0x1F, + 0x22, 0x22, 0x1F, 0x1F, 0x1F, 0x1F, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x1F, 0x13, 0x2C, 0x2C, 0x3E, 0x1E, + 0x20, 0x3A, 0x23, 0x24, 0x24, 0x26, 0x00, 0x3B, 0x07, 0x07, 0x27, 0x22, 0x22, 0x2D, 0x2F, 0x30, 0x21, 0x23, 0x23, + 0x24, 0x26, 0x26, 0x26, 0x3B, 0x07, 0x07, 0x27, 0x22, 0x22, 0x3E, 0x1E, 0x0F, 0x32, 0x35, 0x35, 0x36, 0x15, 0x15, + 0x15, 0x3B, 0x07, 0x07, 0x07, 0x22, 0x1E, 0x1E, 0x30, 0x21, 0x3A, 0x12, 0x12, 0x38, 0x17, 0x17, 0x17, 0x3B, 0x07, + 0x07, 0x18, 0x22, 0x22, 0x06, 0x06, 0x3A, 0x35, 0x36, 0x36, 0x15, 0x3B, 0x3B, 0x3B, 0x27, 0x07, 0x07, 0x2A, 0x22, + 0x06, 0x06, 0x21, 0x3A, 0x35, 0x36, 0x3D, 0x15, 0x3B, 0x3B, 0x3B, 0x27, 0x07, 0x07, 0x2A, 0x22, 0x22, 0x33, 0x33, + 0x35, 0x36, 0x38, 0x38, 0x39, 0x27, 0x27, 0x27, 0x07, 0x2A, 0x2A, 0x19, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x04, 0x04, 0x04, 0x05, 0x17, 0x17, 0x27, 0x07, + 0x07, 0x07, 0x2A, 0x19, 0x19, 0x16, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x05, 0x05, 0x05, 0x05, 0x39, 0x39, 0x27, 0x18, 0x18, 0x18, 0x2A, 0x16, 0x16, 0x1C, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x29, + 0x29, 0x29, 0x29, 0x27, 0x27, 0x07, 0x2A, 0x2A, 0x2A, 0x19, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, 0x29, 0x29, 0x29, 0x29, + 0x27, 0x27, 0x18, 0x19, 0x19, 0x19, 0x16, 0x1C, 0x1C, 0x22, 0x1F, 0x1F, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x1C, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1F, 0x13, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x0B, 0x2F, 0x20, 0x32, 0x12, 0x12, 0x14, 0x15, 0x15, 0x15, 0x27, + 0x3B, 0x22, 0x1A, 0x1A, 0x1B, 0x1D, 0x1E, 0x21, 0x32, 0x12, 0x12, 0x14, 0x39, 0x39, 0x39, 0x3B, 0x3B, 0x22, 0x1B, + 0x1B, 0x0B, 0x0C, 0x30, 0x32, 0x3A, 0x3D, 0x3D, 0x38, 0x39, 0x39, 0x39, 0x3B, 0x27, 0x22, 0x2D, 0x2D, 0x0C, 0x1E, + 0x20, 0x02, 0x02, 0x3D, 0x26, 0x26, 0x26, 0x39, 0x00, 0x3B, 0x27, 0x22, 0x3F, 0x3F, 0x03, 0x20, 0x3A, 0x12, 0x12, + 0x14, 0x15, 0x15, 0x15, 0x3B, 0x27, 0x27, 0x07, 0x1F, 0x1F, 0x03, 0x03, 0x21, 0x3A, 0x12, 0x12, 0x14, 0x15, 0x15, + 0x15, 0x3B, 0x07, 0x07, 0x07, 0x1F, 0x06, 0x06, 0x33, 0x33, 0x35, 0x36, 0x36, 0x26, 0x39, 0x39, 0x39, 0x27, 0x07, + 0x07, 0x2A, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, + 0x1F, 0x33, 0x35, 0x35, 0x36, 0x38, 0x38, 0x39, 0x3B, 0x3B, 0x3B, 0x07, 0x18, 0x18, 0x19, 0x1F, 0x1F, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x04, 0x04, 0x04, 0x36, 0x15, + 0x15, 0x39, 0x27, 0x27, 0x27, 0x07, 0x2A, 0x2A, 0x16, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x05, 0x05, 0x05, 0x05, 0x17, 0x17, 0x3B, 0x07, 0x07, 0x07, 0x2A, + 0x16, 0x16, 0x1C, 0x1F, 0x1F, 0x04, 0x04, 0x04, 0x05, 0x17, 0x17, 0x27, 0x18, 0x18, 0x18, 0x19, 0x1C, 0x1C, 0x22, + 0x1F, 0x1F, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x1C, 0x22, 0x22, 0x22, 0x1F, 0x1F, 0x1F, 0x1F, 0x13, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0D, 0x0D, 0x0D, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, + 0x0D, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x3C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x3C, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, + 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, + 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, + 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, + 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x00, + 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x3C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x00, + 0x0D, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x3C, 0x10, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x3C, 0x10, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x3C, 0x10, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x10, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x3C, + 0x3C, 0x10, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0D, 0x0D, 0x0D, 0x00, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x00, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, + 0x00, 0x0D, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x00, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x13, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x13, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, + 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x3C, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x3C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x3C, 0x3C, 0x3C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0D, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x3C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x3C, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, + 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +RAM_ALIGN const UWord16 ari_spec_cumfreq[64][17] = { + {0, 1, 2, 177, 225, 226, 227, 336, 372, 543, 652, 699, 719, 768, 804, 824, 834}, + {0, 18, 44, 61, 71, 98, 135, 159, 175, 197, 229, 251, 265, 282, 308, 328, 341}, + {0, 71, 163, 212, 237, 318, 420, 481, 514, 556, 613, 652, 675, 697, 727, 749, 764}, + {0, 160, 290, 336, 354, 475, 598, 653, 677, 722, 777, 808, 823, 842, 866, 881, 890}, + {0, 71, 144, 177, 195, 266, 342, 385, 411, 445, 489, 519, 539, 559, 586, 607, 622}, + {0, 48, 108, 140, 159, 217, 285, 327, 354, 385, 427, 457, 478, 497, 524, 545, 561}, + {0, 138, 247, 290, 308, 419, 531, 584, 609, 655, 710, 742, 759, 780, 807, 825, 836}, + {0, 16, 40, 62, 79, 103, 139, 170, 195, 215, 245, 270, 290, 305, 327, 346, 362}, + {0, 579, 729, 741, 743, 897, 970, 980, 982, 996, 1007, 1010, 1011, 1014, 1017, 1018, 1019}, + {0, 398, 582, 607, 612, 788, 902, 925, 931, 956, 979, 987, 990, 996, 1002, 1005, 1007}, + {0, 13, 34, 52, 63, 83, 112, 134, 149, 163, 183, 199, 211, 221, 235, 247, 257}, + {0, 281, 464, 501, 510, 681, 820, 857, 867, 902, 938, 953, 959, 968, 978, 984, 987}, + {0, 198, 362, 408, 421, 575, 722, 773, 789, 832, 881, 905, 915, 928, 944, 954, 959}, + {0, 1, 2, 95, 139, 140, 141, 213, 251, 337, 407, 450, 475, 515, 551, 576, 592}, + {0, 133, 274, 338, 366, 483, 605, 664, 691, 730, 778, 807, 822, 837, 857, 870, 878}, + {0, 128, 253, 302, 320, 443, 577, 636, 659, 708, 767, 799, 814, 833, 857, 872, 881}, + {0, 1, 2, 25, 42, 43, 44, 67, 85, 105, 126, 144, 159, 174, 191, 205, 217}, + {0, 70, 166, 229, 267, 356, 468, 533, 569, 606, 653, 685, 705, 722, 745, 762, 774}, + {0, 55, 130, 175, 200, 268, 358, 416, 449, 488, 542, 581, 606, 628, 659, 683, 699}, + {0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31}, + {0, 34, 85, 123, 147, 196, 265, 317, 352, 386, 433, 470, 497, 518, 549, 574, 593}, + {0, 30, 73, 105, 127, 170, 229, 274, 305, 335, 377, 411, 436, 455, 483, 506, 524}, + {0, 9, 24, 38, 51, 65, 87, 108, 126, 139, 159, 177, 193, 204, 221, 236, 250}, + {0, 30, 74, 105, 125, 166, 224, 266, 294, 322, 361, 391, 413, 431, 457, 478, 494}, + {0, 15, 38, 58, 73, 95, 128, 156, 178, 196, 222, 245, 263, 276, 296, 314, 329}, + {0, 11, 28, 44, 57, 74, 100, 123, 142, 157, 179, 199, 216, 228, 246, 262, 276}, + {0, 448, 619, 639, 643, 821, 926, 944, 948, 971, 991, 998, 1000, 1005, 1010, 1012, 1013}, + {0, 332, 520, 549, 555, 741, 874, 903, 910, 940, 970, 981, 985, 991, 998, 1002, 1004}, + {0, 8, 21, 34, 45, 58, 78, 96, 112, 124, 141, 157, 170, 180, 194, 207, 219}, + {0, 239, 415, 457, 468, 631, 776, 820, 833, 872, 914, 933, 940, 951, 964, 971, 975}, + {0, 165, 310, 359, 375, 513, 652, 707, 727, 774, 828, 856, 868, 884, 904, 916, 923}, + {0, 3, 8, 13, 18, 23, 30, 37, 44, 48, 55, 62, 68, 72, 78, 84, 90}, + {0, 115, 237, 289, 311, 422, 547, 608, 635, 680, 737, 771, 788, 807, 832, 849, 859}, + {0, 107, 221, 272, 293, 399, 521, 582, 610, 656, 714, 749, 767, 787, 813, 831, 842}, + {0, 6, 16, 26, 35, 45, 60, 75, 89, 98, 112, 125, 137, 145, 157, 168, 178}, + {0, 72, 160, 210, 236, 320, 422, 482, 514, 555, 608, 644, 665, 685, 712, 732, 745}, + {0, 45, 108, 153, 183, 244, 327, 385, 421, 455, 502, 536, 559, 578, 605, 626, 641}, + {0, 1, 2, 9, 16, 17, 18, 26, 34, 40, 48, 55, 62, 68, 75, 82, 88}, + {0, 29, 73, 108, 132, 174, 236, 284, 318, 348, 391, 426, 452, 471, 500, 524, 543}, + {0, 20, 51, 76, 93, 123, 166, 200, 225, 247, 279, 305, 326, 342, 365, 385, 401}, + {0, 742, 845, 850, 851, 959, 997, 1001, 1002, 1009, 1014, 1016, 1017, 1019, 1020, 1021, 1022}, + {0, 42, 94, 121, 137, 186, 244, 280, 303, 330, 366, 392, 410, 427, 451, 470, 484}, + {0, 13, 33, 51, 66, 85, 114, 140, 161, 178, 203, 225, 243, 256, 275, 292, 307}, + {0, 501, 670, 689, 693, 848, 936, 952, 956, 975, 991, 997, 999, 1004, 1008, 1010, 1011}, + {0, 445, 581, 603, 609, 767, 865, 888, 895, 926, 954, 964, 968, 977, 986, 991, 993}, + {0, 285, 442, 479, 489, 650, 779, 818, 830, 870, 912, 930, 937, 949, 963, 971, 975}, + {0, 349, 528, 561, 569, 731, 852, 883, 892, 923, 953, 965, 970, 978, 987, 992, 994}, + {0, 199, 355, 402, 417, 563, 700, 750, 767, 811, 860, 884, 894, 909, 926, 936, 942}, + {0, 141, 275, 325, 343, 471, 606, 664, 686, 734, 791, 822, 836, 854, 877, 891, 899}, + {0, 243, 437, 493, 510, 649, 775, 820, 836, 869, 905, 923, 931, 941, 953, 960, 964}, + {0, 91, 197, 248, 271, 370, 487, 550, 580, 625, 684, 721, 741, 761, 788, 807, 819}, + {0, 107, 201, 242, 262, 354, 451, 503, 531, 573, 626, 660, 680, 701, 730, 751, 765}, + {0, 168, 339, 407, 432, 553, 676, 731, 755, 789, 830, 854, 866, 879, 895, 906, 912}, + {0, 67, 147, 191, 214, 290, 384, 441, 472, 513, 567, 604, 627, 648, 678, 700, 715}, + {0, 46, 109, 148, 171, 229, 307, 359, 391, 427, 476, 513, 537, 558, 588, 612, 629}, + {0, 848, 918, 920, 921, 996, 1012, 1013, 1014, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023}, + {0, 36, 88, 123, 145, 193, 260, 308, 340, 372, 417, 452, 476, 496, 525, 548, 565}, + {0, 24, 61, 90, 110, 145, 196, 237, 266, 292, 330, 361, 385, 403, 430, 453, 471}, + {0, 85, 182, 230, 253, 344, 454, 515, 545, 590, 648, 685, 706, 727, 756, 776, 789}, + {0, 22, 55, 82, 102, 135, 183, 222, 252, 278, 315, 345, 368, 385, 410, 431, 448}, + {0, 1, 2, 56, 89, 90, 91, 140, 172, 221, 268, 303, 328, 358, 388, 412, 430}, + {0, 45, 109, 152, 177, 239, 320, 376, 411, 448, 499, 537, 563, 585, 616, 640, 658}, + {0, 247, 395, 433, 445, 599, 729, 771, 785, 829, 875, 896, 905, 920, 937, 946, 951}, + {0, 231, 367, 408, 423, 557, 676, 723, 742, 786, 835, 860, 872, 889, 909, 921, 928}}; + +RAM_ALIGN const UWord16 ari_spec_freq[64][17] = { + {1, 1, 175, 48, 1, 1, 109, 36, 171, 109, 47, 20, 49, 36, 20, 10, 190}, + {18, 26, 17, 10, 27, 37, 24, 16, 22, 32, 22, 14, 17, 26, 20, 13, 683}, + {71, 92, 49, 25, 81, 102, 61, 33, 42, 57, 39, 23, 22, 30, 22, 15, 260}, + {160, 130, 46, 18, 121, 123, 55, 24, 45, 55, 31, 15, 19, 24, 15, 9, 134}, + {71, 73, 33, 18, 71, 76, 43, 26, 34, 44, 30, 20, 20, 27, 21, 15, 402}, + {48, 60, 32, 19, 58, 68, 42, 27, 31, 42, 30, 21, 19, 27, 21, 16, 463}, + {138, 109, 43, 18, 111, 112, 53, 25, 46, 55, 32, 17, 21, 27, 18, 11, 188}, + {16, 24, 22, 17, 24, 36, 31, 25, 20, 30, 25, 20, 15, 22, 19, 16, 662}, + {579, 150, 12, 2, 154, 73, 10, 2, 14, 11, 3, 1, 3, 3, 1, 1, 5}, + {398, 184, 25, 5, 176, 114, 23, 6, 25, 23, 8, 3, 6, 6, 3, 2, 17}, + {13, 21, 18, 11, 20, 29, 22, 15, 14, 20, 16, 12, 10, 14, 12, 10, 767}, + {281, 183, 37, 9, 171, 139, 37, 10, 35, 36, 15, 6, 9, 10, 6, 3, 37}, + {198, 164, 46, 13, 154, 147, 51, 16, 43, 49, 24, 10, 13, 16, 10, 5, 65}, + {1, 1, 93, 44, 1, 1, 72, 38, 86, 70, 43, 25, 40, 36, 25, 16, 432}, + {133, 141, 64, 28, 117, 122, 59, 27, 39, 48, 29, 15, 15, 20, 13, 8, 146}, + {128, 125, 49, 18, 123, 134, 59, 23, 49, 59, 32, 15, 19, 24, 15, 9, 143}, + {1, 1, 23, 17, 1, 1, 23, 18, 20, 21, 18, 15, 15, 17, 14, 12, 807}, + {70, 96, 63, 38, 89, 112, 65, 36, 37, 47, 32, 20, 17, 23, 17, 12, 250}, + {55, 75, 45, 25, 68, 90, 58, 33, 39, 54, 39, 25, 22, 31, 24, 16, 325}, + {1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 993}, + {34, 51, 38, 24, 49, 69, 52, 35, 34, 47, 37, 27, 21, 31, 25, 19, 431}, + {30, 43, 32, 22, 43, 59, 45, 31, 30, 42, 34, 25, 19, 28, 23, 18, 500}, + {9, 15, 14, 13, 14, 22, 21, 18, 13, 20, 18, 16, 11, 17, 15, 14, 774}, + {30, 44, 31, 20, 41, 58, 42, 28, 28, 39, 30, 22, 18, 26, 21, 16, 530}, + {15, 23, 20, 15, 22, 33, 28, 22, 18, 26, 23, 18, 13, 20, 18, 15, 695}, + {11, 17, 16, 13, 17, 26, 23, 19, 15, 22, 20, 17, 12, 18, 16, 14, 748}, + {448, 171, 20, 4, 178, 105, 18, 4, 23, 20, 7, 2, 5, 5, 2, 1, 11}, + {332, 188, 29, 6, 186, 133, 29, 7, 30, 30, 11, 4, 6, 7, 4, 2, 20}, + {8, 13, 13, 11, 13, 20, 18, 16, 12, 17, 16, 13, 10, 14, 13, 12, 805}, + {239, 176, 42, 11, 163, 145, 44, 13, 39, 42, 19, 7, 11, 13, 7, 4, 49}, + {165, 145, 49, 16, 138, 139, 55, 20, 47, 54, 28, 12, 16, 20, 12, 7, 101}, + {3, 5, 5, 5, 5, 7, 7, 7, 4, 7, 7, 6, 4, 6, 6, 6, 934}, + {115, 122, 52, 22, 111, 125, 61, 27, 45, 57, 34, 17, 19, 25, 17, 10, 165}, + {107, 114, 51, 21, 106, 122, 61, 28, 46, 58, 35, 18, 20, 26, 18, 11, 182}, + {6, 10, 10, 9, 10, 15, 15, 14, 9, 14, 13, 12, 8, 12, 11, 10, 846}, + {72, 88, 50, 26, 84, 102, 60, 32, 41, 53, 36, 21, 20, 27, 20, 13, 279}, + {45, 63, 45, 30, 61, 83, 58, 36, 34, 47, 34, 23, 19, 27, 21, 15, 383}, + {1, 1, 7, 7, 1, 1, 8, 8, 6, 8, 7, 7, 6, 7, 7, 6, 936}, + {29, 44, 35, 24, 42, 62, 48, 34, 30, 43, 35, 26, 19, 29, 24, 19, 481}, + {20, 31, 25, 17, 30, 43, 34, 25, 22, 32, 26, 21, 16, 23, 20, 16, 623}, + {742, 103, 5, 1, 108, 38, 4, 1, 7, 5, 2, 1, 2, 1, 1, 1, 2}, + {42, 52, 27, 16, 49, 58, 36, 23, 27, 36, 26, 18, 17, 24, 19, 14, 540}, + {13, 20, 18, 15, 19, 29, 26, 21, 17, 25, 22, 18, 13, 19, 17, 15, 717}, + {501, 169, 19, 4, 155, 88, 16, 4, 19, 16, 6, 2, 5, 4, 2, 1, 13}, + {445, 136, 22, 6, 158, 98, 23, 7, 31, 28, 10, 4, 9, 9, 5, 2, 31}, + {285, 157, 37, 10, 161, 129, 39, 12, 40, 42, 18, 7, 12, 14, 8, 4, 49}, + {349, 179, 33, 8, 162, 121, 31, 9, 31, 30, 12, 5, 8, 9, 5, 2, 30}, + {199, 156, 47, 15, 146, 137, 50, 17, 44, 49, 24, 10, 15, 17, 10, 6, 82}, + {141, 134, 50, 18, 128, 135, 58, 22, 48, 57, 31, 14, 18, 23, 14, 8, 125}, + {243, 194, 56, 17, 139, 126, 45, 16, 33, 36, 18, 8, 10, 12, 7, 4, 60}, + {91, 106, 51, 23, 99, 117, 63, 30, 45, 59, 37, 20, 20, 27, 19, 12, 205}, + {107, 94, 41, 20, 92, 97, 52, 28, 42, 53, 34, 20, 21, 29, 21, 14, 259}, + {168, 171, 68, 25, 121, 123, 55, 24, 34, 41, 24, 12, 13, 16, 11, 6, 112}, + {67, 80, 44, 23, 76, 94, 57, 31, 41, 54, 37, 23, 21, 30, 22, 15, 309}, + {46, 63, 39, 23, 58, 78, 52, 32, 36, 49, 37, 24, 21, 30, 24, 17, 395}, + {848, 70, 2, 1, 75, 16, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1}, + {36, 52, 35, 22, 48, 67, 48, 32, 32, 45, 35, 24, 20, 29, 23, 17, 459}, + {24, 37, 29, 20, 35, 51, 41, 29, 26, 38, 31, 24, 18, 27, 23, 18, 553}, + {85, 97, 48, 23, 91, 110, 61, 30, 45, 58, 37, 21, 21, 29, 20, 13, 235}, + {22, 33, 27, 20, 33, 48, 39, 30, 26, 37, 30, 23, 17, 25, 21, 17, 576}, + {1, 1, 54, 33, 1, 1, 49, 32, 49, 47, 35, 25, 30, 30, 24, 18, 594}, + {45, 64, 43, 25, 62, 81, 56, 35, 37, 51, 38, 26, 22, 31, 24, 18, 366}, + {247, 148, 38, 12, 154, 130, 42, 14, 44, 46, 21, 9, 15, 17, 9, 5, 73}, + {231, 136, 41, 15, 134, 119, 47, 19, 44, 49, 25, 12, 17, 20, 12, 7, 96}}; + +RAM_ALIGN const UWord16 ari_spec_bits[64][17] = { + {20480, 20480, 5220, 9042, 20480, 20480, 6619, 9892, 5289, 6619, 9105, 11629, 8982, 9892, 11629, 13677, 4977}, + {11940, 10854, 12109, 13677, 10742, 9812, 11090, 12288, 11348, 10240, 11348, 12683, 12109, 10854, 11629, 12902, + 1197}, + {7886, 7120, 8982, 10970, 7496, 6815, 8334, 10150, 9437, 8535, 9656, 11216, 11348, 10431, 11348, 12479, 4051}, + {5485, 6099, 9168, 11940, 6311, 6262, 8640, 11090, 9233, 8640, 10334, 12479, 11781, 11090, 12479, 13988, 6009}, + {7886, 7804, 10150, 11940, 7886, 7685, 9368, 10854, 10061, 9300, 10431, 11629, 11629, 10742, 11485, 12479, 2763}, + {9042, 8383, 10240, 11781, 8483, 8013, 9437, 10742, 10334, 9437, 10431, 11485, 11781, 10742, 11485, 12288, 2346}, + {5922, 6619, 9368, 11940, 6566, 6539, 8750, 10970, 9168, 8640, 10240, 12109, 11485, 10742, 11940, 13396, 5009}, + {12288, 11090, 11348, 12109, 11090, 9892, 10334, 10970, 11629, 10431, 10970, 11629, 12479, 11348, 11781, 12288, + 1289}, + {1685, 5676, 13138, 18432, 5598, 7804, 13677, 18432, 12683, 13396, 17234, 20480, 17234, 17234, 20480, 20480, 15725}, + {2793, 5072, 10970, 15725, 5204, 6487, 11216, 15186, 10970, 11216, 14336, 17234, 15186, 15186, 17234, 18432, 12109}, + {12902, 11485, 11940, 13396, 11629, 10531, 11348, 12479, 12683, 11629, 12288, 13138, 13677, 12683, 13138, 13677, + 854}, + {3821, 5088, 9812, 13988, 5289, 5901, 9812, 13677, 9976, 9892, 12479, 15186, 13988, 13677, 15186, 17234, 9812}, + {4856, 5412, 9168, 12902, 5598, 5736, 8863, 12288, 9368, 8982, 11090, 13677, 12902, 12288, 13677, 15725, 8147}, + {20480, 20480, 7088, 9300, 20480, 20480, 7844, 9733, 7320, 7928, 9368, 10970, 9581, 9892, 10970, 12288, 2550}, + {6031, 5859, 8192, 10635, 6410, 6286, 8433, 10742, 9656, 9042, 10531, 12479, 12479, 11629, 12902, 14336, 5756}, + {6144, 6215, 8982, 11940, 6262, 6009, 8433, 11216, 8982, 8433, 10240, 12479, 11781, 11090, 12479, 13988, 5817}, + {20480, 20480, 11216, 12109, 20480, 20480, 11216, 11940, 11629, 11485, 11940, 12479, 12479, 12109, 12683, 13138, + 704}, + {7928, 6994, 8239, 9733, 7218, 6539, 8147, 9892, 9812, 9105, 10240, 11629, 12109, 11216, 12109, 13138, 4167}, + {8640, 7724, 9233, 10970, 8013, 7185, 8483, 10150, 9656, 8694, 9656, 10970, 11348, 10334, 11090, 12288, 3391}, + {20480, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, + 91}, + {10061, 8863, 9733, 11090, 8982, 7970, 8806, 9976, 10061, 9105, 9812, 10742, 11485, 10334, 10970, 11781, 2557}, + {10431, 9368, 10240, 11348, 9368, 8433, 9233, 10334, 10431, 9437, 10061, 10970, 11781, 10635, 11216, 11940, 2119}, + {13988, 12479, 12683, 12902, 12683, 11348, 11485, 11940, 12902, 11629, 11940, 12288, 13396, 12109, 12479, 12683, + 828}, + {10431, 9300, 10334, 11629, 9508, 8483, 9437, 10635, 10635, 9656, 10431, 11348, 11940, 10854, 11485, 12288, 1946}, + {12479, 11216, 11629, 12479, 11348, 10150, 10635, 11348, 11940, 10854, 11216, 11940, 12902, 11629, 11940, 12479, + 1146}, + {13396, 12109, 12288, 12902, 12109, 10854, 11216, 11781, 12479, 11348, 11629, 12109, 13138, 11940, 12288, 12683, + 928}, + {2443, 5289, 11629, 16384, 5170, 6730, 11940, 16384, 11216, 11629, 14731, 18432, 15725, 15725, 18432, 20480, 13396}, + {3328, 5009, 10531, 15186, 5040, 6031, 10531, 14731, 10431, 10431, 13396, 16384, 15186, 14731, 16384, 18432, 11629}, + {14336, 12902, 12902, 13396, 12902, 11629, 11940, 12288, 13138, 12109, 12288, 12902, 13677, 12683, 12902, 13138, + 711}, + {4300, 5204, 9437, 13396, 5430, 5776, 9300, 12902, 9656, 9437, 11781, 14731, 13396, 12902, 14731, 16384, 8982}, + {5394, 5776, 8982, 12288, 5922, 5901, 8640, 11629, 9105, 8694, 10635, 13138, 12288, 11629, 13138, 14731, 6844}, + {17234, 15725, 15725, 15725, 15725, 14731, 14731, 14731, 16384, 14731, 14731, 15186, 16384, 15186, 15186, 15186, + 272}, + {6461, 6286, 8806, 11348, 6566, 6215, 8334, 10742, 9233, 8535, 10061, 12109, 11781, 10970, 12109, 13677, 5394}, + {6674, 6487, 8863, 11485, 6702, 6286, 8334, 10635, 9168, 8483, 9976, 11940, 11629, 10854, 11940, 13396, 5105}, + {15186, 13677, 13677, 13988, 13677, 12479, 12479, 12683, 13988, 12683, 12902, 13138, 14336, 13138, 13396, 13677, + 565}, + {7844, 7252, 8922, 10854, 7389, 6815, 8383, 10240, 9508, 8750, 9892, 11485, 11629, 10742, 11629, 12902, 3842}, + {9233, 8239, 9233, 10431, 8334, 7424, 8483, 9892, 10061, 9105, 10061, 11216, 11781, 10742, 11485, 12479, 2906}, + {20480, 20480, 14731, 14731, 20480, 20480, 14336, 14336, 15186, 14336, 14731, 14731, 15186, 14731, 14731, 15186, + 266}, + {10531, 9300, 9976, 11090, 9437, 8286, 9042, 10061, 10431, 9368, 9976, 10854, 11781, 10531, 11090, 11781, 2233}, + {11629, 10334, 10970, 12109, 10431, 9368, 10061, 10970, 11348, 10240, 10854, 11485, 12288, 11216, 11629, 12288, + 1469}, + {952, 6787, 15725, 20480, 6646, 9733, 16384, 20480, 14731, 15725, 18432, 20480, 18432, 20480, 20480, 20480, 18432}, + {9437, 8806, 10742, 12288, 8982, 8483, 9892, 11216, 10742, 9892, 10854, 11940, 12109, 11090, 11781, 12683, 1891}, + {12902, 11629, 11940, 12479, 11781, 10531, 10854, 11485, 12109, 10970, 11348, 11940, 12902, 11781, 12109, 12479, + 1054}, + {2113, 5323, 11781, 16384, 5579, 7252, 12288, 16384, 11781, 12288, 15186, 18432, 15725, 16384, 18432, 20480, 12902}, + {2463, 5965, 11348, 15186, 5522, 6934, 11216, 14731, 10334, 10635, 13677, 16384, 13988, 13988, 15725, 18432, 10334}, + {3779, 5541, 9812, 13677, 5467, 6122, 9656, 13138, 9581, 9437, 11940, 14731, 13138, 12683, 14336, 16384, 8982}, + {3181, 5154, 10150, 14336, 5448, 6311, 10334, 13988, 10334, 10431, 13138, 15725, 14336, 13988, 15725, 18432, 10431}, + {4841, 5560, 9105, 12479, 5756, 5944, 8922, 12109, 9300, 8982, 11090, 13677, 12479, 12109, 13677, 15186, 7460}, + {5859, 6009, 8922, 11940, 6144, 5987, 8483, 11348, 9042, 8535, 10334, 12683, 11940, 11216, 12683, 14336, 6215}, + {4250, 4916, 8587, 12109, 5901, 6191, 9233, 12288, 10150, 9892, 11940, 14336, 13677, 13138, 14731, 16384, 8383}, + {7153, 6702, 8863, 11216, 6904, 6410, 8239, 10431, 9233, 8433, 9812, 11629, 11629, 10742, 11781, 13138, 4753}, + {6674, 7057, 9508, 11629, 7120, 6964, 8806, 10635, 9437, 8750, 10061, 11629, 11485, 10531, 11485, 12683, 4062}, + {5341, 5289, 8013, 10970, 6311, 6262, 8640, 11090, 10061, 9508, 11090, 13138, 12902, 12288, 13396, 15186, 6539}, + {8057, 7533, 9300, 11216, 7685, 7057, 8535, 10334, 9508, 8694, 9812, 11216, 11485, 10431, 11348, 12479, 3541}, + {9168, 8239, 9656, 11216, 8483, 7608, 8806, 10240, 9892, 8982, 9812, 11090, 11485, 10431, 11090, 12109, 2815}, + {558, 7928, 18432, 20480, 7724, 12288, 20480, 20480, 18432, 20480, 20480, 20480, 20480, 20480, 20480, 20480, 20480}, + {9892, 8806, 9976, 11348, 9042, 8057, 9042, 10240, 10240, 9233, 9976, 11090, 11629, 10531, 11216, 12109, 2371}, + {11090, 9812, 10531, 11629, 9976, 8863, 9508, 10531, 10854, 9733, 10334, 11090, 11940, 10742, 11216, 11940, 1821}, + {7354, 6964, 9042, 11216, 7153, 6592, 8334, 10431, 9233, 8483, 9812, 11485, 11485, 10531, 11629, 12902, 4349}, + {11348, 10150, 10742, 11629, 10150, 9042, 9656, 10431, 10854, 9812, 10431, 11216, 12109, 10970, 11485, 12109, 1700}, + {20480, 20480, 8694, 10150, 20480, 20480, 8982, 10240, 8982, 9105, 9976, 10970, 10431, 10431, 11090, 11940, 1610}, + {9233, 8192, 9368, 10970, 8286, 7496, 8587, 9976, 9812, 8863, 9733, 10854, 11348, 10334, 11090, 11940, 3040}, + {4202, 5716, 9733, 13138, 5598, 6099, 9437, 12683, 9300, 9168, 11485, 13988, 12479, 12109, 13988, 15725, 7804}, + {4400, 5965, 9508, 12479, 6009, 6360, 9105, 11781, 9300, 8982, 10970, 13138, 12109, 11629, 13138, 14731, 6994}}; + +RAM_ALIGN const Word32 tnsAcfWindow[MAXLAG] = {0x7FBF61E2, 0x7EFE4B00, 0x7DBF01E8, 0x7C0544D0, + 0x79D636E9, 0x773846E0, 0x74330F61, 0x70CF3251}; +RAM_ALIGN const Word16 tnsQuantPts[TNS_COEF_RES] = {-32628, -31517, -29333, -26149, -22076, -17250, -11837, -6021, 0, + 6021, 11837, 17250, 22076, 26149, 29333, 31517, 32628}; +RAM_ALIGN const Word16 tnsQuantThr[TNS_COEF_RES - 1] = {-32210, -30555, -27860, -24216, -19747, -14606, -8967, -3023, + 3023, 8967, 14606, 19747, 24216, 27860, 30555, 32210}; + +RAM_ALIGN const Word16 ac_tns_order_bits[2][MAXLAG] = {{17234, 13988, 11216, 8694, 6566, 4977, 3961, 3040}, + {12683, 9437, 6874, 5541, 5121, 5170, 5359, 5056}}; +RAM_ALIGN const Word16 ac_tns_order_freq[2][MAXLAG] = {{3, 9, 23, 54, 111, 190, 268, 366}, + {14, 42, 100, 157, 181, 178, 167, 185}}; +RAM_ALIGN const Word16 ac_tns_order_cumfreq[2][MAXLAG] = {{0, 3, 12, 35, 89, 200, 390, 658}, + {0, 14, 56, 156, 313, 494, 672, 839}}; +RAM_ALIGN const Word16 ac_tns_coef_bits[MAXLAG][TNS_COEF_RES] = { + {20480, 15725, 12479, 10334, 8694, 7320, 6964, 6335, 5504, 5637, 6566, 6758, 8433, 11348, 15186, 20480, 20480}, + {20480, 20480, 20480, 20480, 12902, 9368, 7057, 5901, 5254, 5485, 5598, 6076, 7608, 10742, 15186, 20480, 20480}, + {20480, 20480, 20480, 20480, 13988, 9368, 6702, 4841, 4585, 4682, 5859, 7764, 12109, 20480, 20480, 20480, 20480}, + {20480, 20480, 20480, 20480, 18432, 13396, 8982, 4767, 3779, 3658, 6335, 9656, 13988, 20480, 20480, 20480, 20480}, + {20480, 20480, 20480, 20480, 20480, 14731, 9437, 4275, 3249, 3493, 8483, 13988, 17234, 20480, 20480, 20480, 20480}, + {20480, 20480, 20480, 20480, 20480, 20480, 12902, 4753, 3040, 2953, 9105, 15725, 20480, 20480, 20480, 20480, 20480}, + {20480, 20480, 20480, 20480, 20480, 20480, 12902, 3821, 3346, 3000, 12109, 20480, 20480, 20480, 20480, 20480, + 20480}, + {20480, 20480, 20480, 20480, 20480, 20480, 15725, 3658, 20480, 1201, 10854, 18432, 20480, 20480, 20480, 20480, + 20480}}; +RAM_ALIGN const Word16 ac_tns_coef_freq[MAXLAG][TNS_COEF_RES] = { + {1, 5, 15, 31, 54, 86, 97, 120, 159, 152, 111, 104, 59, 22, 6, 1, 1}, + {1, 1, 1, 1, 13, 43, 94, 139, 173, 160, 154, 131, 78, 27, 6, 1, 1}, + {1, 1, 1, 1, 9, 43, 106, 199, 217, 210, 141, 74, 17, 1, 1, 1, 1}, + {1, 1, 1, 1, 2, 11, 49, 204, 285, 297, 120, 39, 9, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 7, 42, 241, 341, 314, 58, 9, 3, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 13, 205, 366, 377, 47, 5, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 13, 281, 330, 371, 17, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 5, 297, 1, 682, 26, 2, 1, 1, 1, 1, 1}}; +RAM_ALIGN const Word16 ac_tns_coef_cumfreq[MAXLAG][TNS_COEF_RES] = { + {0, 1, 6, 21, 52, 106, 192, 289, 409, 568, 720, 831, 935, 994, 1016, 1022, 1023}, + {0, 1, 2, 3, 4, 17, 60, 154, 293, 466, 626, 780, 911, 989, 1016, 1022, 1023}, + {0, 1, 2, 3, 4, 13, 56, 162, 361, 578, 788, 929, 1003, 1020, 1021, 1022, 1023}, + {0, 1, 2, 3, 4, 6, 17, 66, 270, 555, 852, 972, 1011, 1020, 1021, 1022, 1023}, + {0, 1, 2, 3, 4, 5, 12, 54, 295, 636, 950, 1008, 1017, 1020, 1021, 1022, 1023}, + {0, 1, 2, 3, 4, 5, 6, 19, 224, 590, 967, 1014, 1019, 1020, 1021, 1022, 1023}, + {0, 1, 2, 3, 4, 5, 6, 19, 300, 630, 1001, 1018, 1019, 1020, 1021, 1022, 1023}, + {0, 1, 2, 3, 4, 5, 6, 11, 308, 309, 991, 1017, 1019, 1020, 1021, 1022, 1023}}; + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 lpc_warp_pre_emphasis_64_8000[64] = { + 0x4000, 0x435c, 0x46e5, 0x4a9e, 0x4e89, 0x52a9, 0x5700, 0x5b91, 0x6060, 0x656f, 0x6ac2, 0x705d, 0x7643, + 0x7c79, 0x4181, 0x44f1, 0x4890, 0x4c5f, 0x5061, 0x549a, 0x590b, 0x5db7, 0x62a3, 0x67d1, 0x6d44, 0x7301, + 0x790a, 0x7f65, 0x430b, 0x4690, 0x4a44, 0x4e2a, 0x5245, 0x5696, 0x5b22, 0x5feb, 0x64f4, 0x6a41, 0x6fd5, + 0x75b4, 0x7be2, 0x4131, 0x449e, 0x4838, 0x4c02, 0x5000, 0x5433, 0x589f, 0x5d46, 0x622c, 0x6753, 0x6cc0, + 0x7275, 0x7878, 0x7ecb, 0x42b9, 0x463a, 0x49ea, 0x4dcb, 0x51e1, 0x562d, 0x5ab4, 0x5f77, 0x647a}; + +RAM_ALIGN const Word16 lpc_warp_pre_emphasis_64_e_8000[64] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05}; +#else +#define lpc_warp_pre_emphasis_64_8000 NULL +#define lpc_warp_pre_emphasis_64_e_8000 NULL +#endif + +#ifdef SUBSET_WB +RAM_ALIGN const Word16 lpc_warp_pre_emphasis_64_16000[64] = { + 0x4000, 0x445a, 0x4900, 0x4df7, 0x5344, 0x58ed, 0x5efa, 0x656f, 0x6c55, 0x73b2, 0x7b91, 0x41fc, 0x4678, + 0x4b43, 0x5061, 0x55d9, 0x5baf, 0x61eb, 0x6894, 0x6fb0, 0x7748, 0x7f65, 0x4407, 0x48a8, 0x4d98, 0x52df, + 0x5882, 0x5e87, 0x64f4, 0x6bd1, 0x7326, 0x7afb, 0x41ac, 0x4623, 0x4ae8, 0x5000, 0x5571, 0x5b40, 0x6174, + 0x6815, 0x6f29, 0x76b8, 0x7ecb, 0x43b5, 0x4850, 0x4d3a, 0x527b, 0x5817, 0x5e14, 0x647a, 0x6b4f, 0x729b, + 0x7a66, 0x415c, 0x45ce, 0x4a8d, 0x4f9f, 0x5509, 0x5ad1, 0x60fe, 0x6797, 0x6ea2, 0x7628, 0x7e31}; + +RAM_ALIGN const Word16 lpc_warp_pre_emphasis_64_e_16000[64] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06}; +#else +#define lpc_warp_pre_emphasis_64_16000 NULL +#define lpc_warp_pre_emphasis_64_e_16000 NULL +#endif + +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 lpc_warp_pre_emphasis_64_24000[64] = { + 0x4000, 0x455c, 0x4b2a, 0x5176, 0x5848, 0x5fac, 0x67af, 0x705d, 0x79c5, 0x41fc, 0x4782, 0x4d7f, 0x53fc, + 0x5b04, 0x62a3, 0x6ae5, 0x73d9, 0x7d8c, 0x4407, 0x49b9, 0x4fe6, 0x5696, 0x5dd6, 0x65b2, 0x6e35, 0x7770, + 0x40b8, 0x4623, 0x4c02, 0x5260, 0x5945, 0x60bf, 0x68d8, 0x71a0, 0x7b23, 0x42b9, 0x4850, 0x4e5e, 0x54ed, + 0x5c0a, 0x63be, 0x6c18, 0x7525, 0x7ef4, 0x44cb, 0x4a8d, 0x50cb, 0x578f, 0x5ee4, 0x66d6, 0x6f72, 0x78c7, + 0x4172, 0x46ed, 0x4cdd, 0x534c, 0x5a46, 0x61d5, 0x6a06, 0x72e6, 0x7c85, 0x4379, 0x491f, 0x4f3f}; + +RAM_ALIGN const Word16 lpc_warp_pre_emphasis_64_e_24000[64] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08}; +#else +#define lpc_warp_pre_emphasis_64_24000 NULL +#define lpc_warp_pre_emphasis_64_e_24000 NULL +#endif + +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 lpc_warp_pre_emphasis_64_32000[64] = { + 0x4000, 0x4661, 0x4d65, 0x551d, 0x5d99, 0x66ed, 0x7130, 0x7c79, 0x4471, 0x4b43, 0x52c4, 0x5b04, 0x6417, + 0x6e11, 0x790a, 0x428e, 0x4930, 0x507c, 0x5882, 0x6154, 0x6b08, 0x75b4, 0x40b8, 0x472b, 0x4e44, 0x5611, + 0x5ea6, 0x6815, 0x7275, 0x7dde, 0x4535, 0x4c1b, 0x53b2, 0x5c0a, 0x6536, 0x6f4d, 0x7a66, 0x434d, 0x4a02, + 0x5163, 0x5980, 0x626c, 0x6c3c, 0x7706, 0x4172, 0x47f8, 0x4f25, 0x5708, 0x5fb5, 0x6940, 0x73be, 0x7f48, + 0x45fc, 0x4cf6, 0x54a2, 0x5d12, 0x6659, 0x708d, 0x7bc6, 0x440e, 0x4ad7, 0x524d, 0x5a81, 0x6387}; + +RAM_ALIGN const Word16 lpc_warp_pre_emphasis_64_e_32000[64] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09}; +#else +#define lpc_warp_pre_emphasis_64_32000 NULL +#define lpc_warp_pre_emphasis_64_e_32000 NULL +#endif + +#ifdef SUBSET_FB +RAM_ALIGN const Word16 lpc_warp_pre_emphasis_64_48000[64] = { + 0x4000, 0x476b, 0x4fb1, 0x58ed, 0x633c, 0x6ebc, 0x7b91, 0x44f1, 0x4cee, 0x55d9, 0x5fcb, 0x6ae5, 0x7748, + 0x428e, 0x4a44, 0x52df, 0x5c7a, 0x6731, 0x7326, 0x403f, 0x47b1, 0x5000, 0x5945, 0x639e, 0x6f29, 0x7c0b, + 0x4535, 0x4d3a, 0x562d, 0x602a, 0x6b4f, 0x77be, 0x42cf, 0x4a8d, 0x5331, 0x5cd5, 0x6797, 0x7398, 0x407f, + 0x47f8, 0x504f, 0x599d, 0x6400, 0x6f97, 0x7c85, 0x457a, 0x4d87, 0x5683, 0x6089, 0x6bb9, 0x7834, 0x4311, + 0x4ad7, 0x5383, 0x5d31, 0x67fd, 0x740a, 0x40be, 0x483f, 0x509e, 0x59f6, 0x6463, 0x7005, 0x7d00}; + +RAM_ALIGN const Word16 lpc_warp_pre_emphasis_64_e_48000[64] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a}; +#else +#define lpc_warp_pre_emphasis_64_48000 NULL +#define lpc_warp_pre_emphasis_64_e_48000 NULL +#endif + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 lpc_warp_pre_emphasis_64_96000[64] = { + 0x4000, 0x4878, 0x520f, 0x5cea, 0x6936, 0x7721, 0x4372, 0x4c5f, 0x567a, 0x61eb, 0x6ee0, 0x7d8c, 0x4714, + 0x507c, 0x5b22, 0x6731, 0x74d8, 0x4227, 0x4ae8, 0x54d1, 0x600a, 0x6cc0, 0x7b23, 0x45b7, 0x4ef1, 0x5963, + 0x6536, 0x729b, 0x40e2, 0x4978, 0x5331, 0x5e33, 0x6aaa, 0x78c7, 0x4461, 0x4d6d, 0x57ac, 0x6346, 0x7068, + 0x7f48, 0x4810, 0x5199, 0x5c64, 0x689e, 0x7676, 0x4311, 0x4bf1, 0x55fd, 0x615e, 0x6e40, 0x7cd7, 0x46ae, + 0x5008, 0x5a9f, 0x669d, 0x7430, 0x41c8, 0x4a7c, 0x5457, 0x5f80, 0x6c23, 0x7a72, 0x4553, 0x4e7f}; + +RAM_ALIGN const Word16 lpc_warp_pre_emphasis_64_e_96000[64] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c}; +#else +#define lpc_warp_pre_emphasis_64_96000 NULL +#define lpc_warp_pre_emphasis_64_e_96000 NULL +#endif + +RAM_ALIGN const Word16 *const lpc_pre_emphasis[NUM_SAMP_FREQ] = {lpc_warp_pre_emphasis_64_8000, + lpc_warp_pre_emphasis_64_16000, + lpc_warp_pre_emphasis_64_24000, + lpc_warp_pre_emphasis_64_32000, + lpc_warp_pre_emphasis_64_48000, + lpc_warp_pre_emphasis_64_96000 +}; + +RAM_ALIGN const Word16 *const lpc_pre_emphasis_e[NUM_SAMP_FREQ] = {lpc_warp_pre_emphasis_64_e_8000, + lpc_warp_pre_emphasis_64_e_16000, + lpc_warp_pre_emphasis_64_e_24000, + lpc_warp_pre_emphasis_64_e_32000, + lpc_warp_pre_emphasis_64_e_48000, + lpc_warp_pre_emphasis_64_e_96000 +}; + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_20_8000[20] = {0x4be4, 0x5b79, 0x7a43, 0x53bf, 0x7106, 0x4a1f, 0x5e46, + 0x7477, 0x4613, 0x5260, 0x5ed4, 0x6b21, 0x76f9, 0x4109, + 0x4612, 0x4a79, 0x4e22, 0x50f6, 0x52e2, 0x53dc}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_20_e_8000[20] = { + (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, (Word16)0xffff, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; + +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_40_8000[40] = { + 0x4a6c, 0x4e55, 0x5622, 0x61c5, 0x712d, 0x4220, 0x4d71, 0x5a77, 0x691e, 0x794e, 0x4577, 0x4ef1, 0x5906, 0x63a6, + 0x6ec1, 0x7a44, 0x430f, 0x491f, 0x4f46, 0x557c, 0x5bb8, 0x61ee, 0x6815, 0x6e25, 0x7412, 0x79d4, 0x7f61, 0x4259, + 0x44de, 0x473c, 0x4970, 0x4b76, 0x4d4b, 0x4eec, 0x5056, 0x5187, 0x527e, 0x5338, 0x53b5, 0x53f3}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_40_e_8000[40] = { + (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, (Word16)0xffff, + (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; + + +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_80_8000[80] = { + 0x4a0e, 0x4b09, 0x4cfd, 0x4fec, 0x53d2, 0x58af, 0x5e81, 0x6545, 0x6cf9, 0x759a, 0x7f25, 0x44ca, 0x4a73, 0x508a, + 0x570e, 0x5dfa, 0x654e, 0x6d06, 0x751e, 0x7d94, 0x4332, 0x47c6, 0x4c83, 0x5168, 0x5673, 0x5ba2, 0x60f2, 0x6662, + 0x6bf0, 0x7199, 0x775b, 0x7d34, 0x4191, 0x4490, 0x4798, 0x4aa7, 0x4dba, 0x50d3, 0x53ee, 0x570b, 0x5a29, 0x5d46, + 0x6061, 0x637a, 0x668e, 0x699c, 0x6ca4, 0x6fa3, 0x729a, 0x7587, 0x7868, 0x7b3c, 0x7e03, 0x405e, 0x41b2, 0x42fd, + 0x4440, 0x4579, 0x46a9, 0x47cd, 0x48e7, 0x49f6, 0x4af9, 0x4bf0, 0x4cdb, 0x4db8, 0x4e89, 0x4f4c, 0x5001, 0x50a8, + 0x5140, 0x51ca, 0x5246, 0x52b2, 0x530f, 0x535d, 0x539b, 0x53ca, 0x53e9, 0x53f9}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_80_e_8000[80] = { + (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, + (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, + (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; +#else +#define lpc_lin_pre_emphasis_20_8000 NULL +#define lpc_lin_pre_emphasis_20_e_8000 NULL +#define lpc_lin_pre_emphasis_40_8000 NULL +#define lpc_lin_pre_emphasis_40_e_8000 NULL +#define lpc_lin_pre_emphasis_80_8000 NULL +#define lpc_lin_pre_emphasis_80_e_8000 NULL +#endif + +#ifdef SUBSET_WB +#ifdef FIX_PLC_CONFORM_ISSUES +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_20_16000[20] = { + 0x54d4, 0x7906, 0x6043, 0x4a65, 0x6c65, 0x4aa6, 0x620c, 0x7bd2, 0x4baa, 0x59f2, 0x6869, 0x76b1, 0x4239, 0x48aa, 0x4e84, 0x53a1, + 0x57e1, 0x5b29, 0x5d65, 0x5e87 +}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_20_e_16000[20] = { + (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffe, (Word16)0xffff, (Word16)0xffff, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002 +}; +#endif +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_40_16000[40] = { + 0x516b, 0x5a81, 0x6c9d, 0x43d2, 0x55b6, 0x6bdd, 0x4313, 0x5233, 0x6336, 0x7602, 0x453d, 0x503e, 0x5bf4, 0x684b, + 0x7530, 0x4148, 0x4829, 0x4f33, 0x5658, 0x5d8f, 0x64cc, 0x6c03, 0x7328, 0x7a32, 0x408a, 0x43e1, 0x471b, 0x4a31, + 0x4d1e, 0x4fde, 0x526d, 0x54c7, 0x56e7, 0x58cb, 0x5a70, 0x5bd2, 0x5cf0, 0x5dc9, 0x5e59, 0x5ea2}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_40_e_16000[40] = { + (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, + (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_80_16000[80] = { + 0x5091, 0x52d7, 0x5762, 0x5e30, 0x673f, 0x728b, 0x4008, 0x47e3, 0x50d6, 0x5adb, 0x65ef, 0x720e, 0x7f33, 0x46ac, + 0x4e3c, 0x5647, 0x5ec9, 0x67bf, 0x7126, 0x7afa, 0x429b, 0x47ec, 0x4d6d, 0x531c, 0x58f7, 0x5efb, 0x6527, 0x6b78, + 0x71eb, 0x787d, 0x7f2d, 0x42fc, 0x466d, 0x49e8, 0x4d6d, 0x50fa, 0x548d, 0x5825, 0x5bc1, 0x5f5e, 0x62fd, 0x669a, + 0x6a36, 0x6dce, 0x7161, 0x74ee, 0x7872, 0x7bee, 0x7f5f, 0x4162, 0x430e, 0x44b3, 0x4650, 0x47e4, 0x496f, 0x4af0, + 0x4c67, 0x4dd2, 0x4f33, 0x5087, 0x51ce, 0x5309, 0x5436, 0x5554, 0x5665, 0x5766, 0x5858, 0x593a, 0x5a0d, 0x5acf, + 0x5b80, 0x5c20, 0x5caf, 0x5d2d, 0x5d99, 0x5df4, 0x5e3c, 0x5e72, 0x5e97, 0x5ea9}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_80_e_16000[80] = { + (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffe, + (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, + (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; +#else +#define lpc_lin_pre_emphasis_40_16000 NULL +#define lpc_lin_pre_emphasis_40_e_16000 NULL +#define lpc_lin_pre_emphasis_80_16000 NULL +#define lpc_lin_pre_emphasis_80_e_16000 NULL +#endif + +#ifdef SUBSET_SSWB +#ifdef FIX_PLC_CONFORM_ISSUES +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_30_24000[30] = { + 0x46f5, 0x6bb5, 0x5a67, 0x485c, 0x6c1c, 0x4c07, 0x65dc, 0x41a2, 0x51f6, 0x63bd, 0x76c4, 0x456b, 0x4fde, 0x5a9d, 0x658a, 0x7087, + 0x7b74, 0x431a, 0x4853, 0x4d58, 0x5219, 0x568b, 0x5aa0, 0x5e4d, 0x6188, 0x6447, 0x6683, 0x6835, 0x695a, 0x69ed +}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_30_e_24000[30] = { + (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffd, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, (Word16)0xffff, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002 +}; +#endif +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_40_24000[40] = { + 0x44f2, 0x59a3, 0x4172, 0x603b, 0x447d, 0x5db8, 0x7ba7, 0x4f0d, 0x626d, 0x77d6, 0x4793, 0x541b, 0x6171, 0x6f7f, + 0x7e2f, 0x46b5, 0x4e8b, 0x568f, 0x5eb2, 0x66ea, 0x6f28, 0x775f, 0x7f83, 0x43c3, 0x47ae, 0x4b7d, 0x4f29, 0x52ac, + 0x5602, 0x5924, 0x5c0e, 0x5ebb, 0x6127, 0x634e, 0x652d, 0x66c1, 0x6807, 0x68fd, 0x69a2, 0x69f5}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_40_e_24000[40] = { + (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, + (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; + +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_60_24000[60] = { + 0x4382, 0x4cb6, 0x5f17, 0x7a99, 0x4f94, 0x6656, 0x40c0, 0x5081, 0x6263, 0x7658, 0x4629, 0x5222, + 0x5f0e, 0x6ce3, 0x7b98, 0x4591, 0x4dbc, 0x5647, 0x5f2b, 0x6862, 0x71e7, 0x7bb2, 0x42de, 0x47ff, + 0x4d39, 0x5288, 0x57e8, 0x5d55, 0x62cc, 0x6849, 0x6dc8, 0x7345, 0x78bc, 0x7e29, 0x41c5, 0x446c, + 0x4709, 0x499a, 0x4c1c, 0x4e8f, 0x50f0, 0x533e, 0x5577, 0x579a, 0x59a4, 0x5b96, 0x5d6c, 0x5f27, + 0x60c4, 0x6243, 0x63a3, 0x64e2, 0x6601, 0x66fd, 0x67d6, 0x688c, 0x691e, 0x698c, 0x69d6, 0x69fb}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_60_e_24000[60] = { + (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffe, + (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, + (Word16)0xffff, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; + +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_80_24000[80] = { + 0x4301, 0x482e, 0x5287, 0x6208, 0x76a9, 0x4832, 0x5797, 0x697e, 0x7dde, 0x4a59, 0x56f7, 0x64c5, 0x73bd, 0x41ed, + 0x4a8a, 0x53b2, 0x5d63, 0x6798, 0x724d, 0x7d7e, 0x4493, 0x4aa1, 0x50e5, 0x575e, 0x5e0a, 0x64e4, 0x6beb, 0x731d, + 0x7a75, 0x40f9, 0x44c7, 0x48a5, 0x4c91, 0x5088, 0x548a, 0x5895, 0x5ca7, 0x60bf, 0x64db, 0x68f9, 0x6d18, 0x7136, + 0x7552, 0x796a, 0x7d7c, 0x40c4, 0x42c4, 0x44c0, 0x46b6, 0x48a5, 0x4a8c, 0x4c6b, 0x4e41, 0x500e, 0x51d0, 0x5386, + 0x5531, 0x56cf, 0x5860, 0x59e4, 0x5b59, 0x5cbf, 0x5e16, 0x5f5c, 0x6092, 0x61b7, 0x62cb, 0x63cd, 0x64bc, 0x6599, + 0x6663, 0x671a, 0x67bd, 0x684c, 0x68c7, 0x692e, 0x6980, 0x69be, 0x69e8, 0x69fd}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_80_e_24000[80] = { + (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffd, (Word16)0xfffd, + (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, + (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; +#else +#define lpc_lin_pre_emphasis_60_24000 NULL +#define lpc_lin_pre_emphasis_60_e_24000 NULL +#define lpc_lin_pre_emphasis_40_24000 NULL +#define lpc_lin_pre_emphasis_40_e_24000 NULL +#define lpc_lin_pre_emphasis_80_24000 NULL +#define lpc_lin_pre_emphasis_80_e_24000 NULL +#endif + +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_40_32000[40] = +{ + 0x400d, 0x4e74, 0x5584, 0x4d4b, 0x7b03, 0x59d0, 0x7b65, 0x5106, 0x66c3, 0x7ec8, 0x4c78, 0x5a88, 0x697e, 0x7942, 0x44de, 0x4d69, + 0x5634, 0x5f32, 0x6854, 0x718c, 0x7acb, 0x4201, 0x4692, 0x4b11, 0x4f77, 0x53bc, 0x57db, 0x5bcc, 0x5f89, 0x630d, 0x6652, 0x6953, + 0x6c0b, 0x6e75, 0x708e, 0x7253, 0x73c1, 0x74d5, 0x758f, 0x75eb +}; + +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_40_e_32000[40] = +{ + (Word16)0xfffa, (Word16)0xfffb, (Word16)0xfffc, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, + (Word16)0xffff, (Word16)0xffff, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002 +}; + +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_80_32000[80] = { + 0x6eab, 0x4e92, 0x7d03, 0x614a, 0x47cb, 0x64a9, 0x439a, 0x57af, 0x6e8c, 0x4414, 0x523c, 0x61b9, 0x7284, 0x424c, + 0x4bf6, 0x563d, 0x611c, 0x6c8f, 0x7892, 0x4290, 0x491a, 0x4fe5, 0x56ed, 0x5e31, 0x65ac, 0x6d5d, 0x753f, 0x7d51, + 0x42c7, 0x46fa, 0x4b40, 0x4f96, 0x53fc, 0x5870, 0x5cef, 0x6178, 0x6609, 0x6aa1, 0x6f3d, 0x73dc, 0x787b, 0x7d1a, + 0x40db, 0x4327, 0x4570, 0x47b4, 0x49f4, 0x4c2d, 0x4e60, 0x508b, 0x52ae, 0x54c8, 0x56d7, 0x58dc, 0x5ad4, 0x5cc0, + 0x5e9f, 0x6070, 0x6232, 0x63e5, 0x6587, 0x6719, 0x689a, 0x6a08, 0x6b64, 0x6cad, 0x6de2, 0x6f03, 0x7010, 0x7108, + 0x71ea, 0x72b7, 0x736e, 0x740f, 0x7499, 0x750c, 0x7569, 0x75ae, 0x75dd, 0x75f4}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_80_e_32000[80] = { + (Word16)0xfff9, (Word16)0xfffa, (Word16)0xfffa, (Word16)0xfffb, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffd, + (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, + (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; +#else +#define lpc_lin_pre_emphasis_80_32000 NULL +#define lpc_lin_pre_emphasis_80_e_32000 NULL +#endif + +#ifdef SUBSET_FB +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_60_48000[60] = { + 0x7330, 0x62e5, 0x5ab1, 0x4c35, 0x753a, 0x5425, 0x72a0, 0x4afd, 0x5f0d, 0x7571, 0x470d, 0x547b, + 0x62fa, 0x727f, 0x4180, 0x4a38, 0x5362, 0x5cf7, 0x66f0, 0x7148, 0x7bf5, 0x4379, 0x491b, 0x4edc, + 0x54b9, 0x5aae, 0x60b6, 0x66cd, 0x6cee, 0x7316, 0x7941, 0x7f69, 0x42c5, 0x45d1, 0x48d4, 0x4bcf, + 0x4ebd, 0x519e, 0x546f, 0x572e, 0x59d9, 0x5c6f, 0x5eee, 0x6153, 0x639d, 0x65cb, 0x67dc, 0x69cc, + 0x6b9c, 0x6d4a, 0x6ed4, 0x703b, 0x717c, 0x7296, 0x738a, 0x7457, 0x74fb, 0x7576, 0x75c9, 0x75f2}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_60_e_48000[60] = { + (Word16)0xfff9, (Word16)0xfffa, (Word16)0xfffb, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffd, (Word16)0xfffd, + (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_80_48000[80] = { + 0x6eab, 0x4e92, 0x7d03, 0x614a, 0x47cb, 0x64a9, 0x439a, 0x57af, 0x6e8c, 0x4414, 0x523c, 0x61b9, 0x7284, 0x424c, + 0x4bf6, 0x563d, 0x611c, 0x6c8f, 0x7892, 0x4290, 0x491a, 0x4fe5, 0x56ed, 0x5e31, 0x65ac, 0x6d5d, 0x753f, 0x7d51, + 0x42c7, 0x46fa, 0x4b40, 0x4f96, 0x53fc, 0x5870, 0x5cef, 0x6178, 0x6609, 0x6aa1, 0x6f3d, 0x73dc, 0x787b, 0x7d1a, + 0x40db, 0x4327, 0x4570, 0x47b4, 0x49f4, 0x4c2d, 0x4e60, 0x508b, 0x52ae, 0x54c8, 0x56d7, 0x58dc, 0x5ad4, 0x5cc0, + 0x5e9f, 0x6070, 0x6232, 0x63e5, 0x6587, 0x6719, 0x689a, 0x6a08, 0x6b64, 0x6cad, 0x6de2, 0x6f03, 0x7010, 0x7108, + 0x71ea, 0x72b7, 0x736e, 0x740f, 0x7499, 0x750c, 0x7569, 0x75ae, 0x75dd, 0x75f4}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_80_e_48000[80] = { + (Word16)0xfff9, (Word16)0xfffa, (Word16)0xfffa, (Word16)0xfffb, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffd, + (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, + (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; +#else +#define lpc_lin_pre_emphasis_60_48000 NULL +#define lpc_lin_pre_emphasis_60_e_48000 NULL +#define lpc_lin_pre_emphasis_80_48000 NULL +#define lpc_lin_pre_emphasis_80_e_48000 NULL +#endif + +#if defined(SUBSET_SWB) || defined(SUBSET_FB) +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_80_0_92[80] = { + 0x6eab, 0x4e92, 0x7d03, 0x614a, 0x47cb, 0x64a9, 0x439a, 0x57af, 0x6e8c, 0x4414, 0x523c, 0x61b9, 0x7284, 0x424c, + 0x4bf6, 0x563d, 0x611c, 0x6c8f, 0x7892, 0x4290, 0x491a, 0x4fe5, 0x56ed, 0x5e31, 0x65ac, 0x6d5d, 0x753f, 0x7d51, + 0x42c7, 0x46fa, 0x4b40, 0x4f96, 0x53fc, 0x5870, 0x5cef, 0x6178, 0x6609, 0x6aa1, 0x6f3d, 0x73dc, 0x787b, 0x7d1a, + 0x40db, 0x4327, 0x4570, 0x47b4, 0x49f4, 0x4c2d, 0x4e60, 0x508b, 0x52ae, 0x54c8, 0x56d7, 0x58dc, 0x5ad4, 0x5cc0, + 0x5e9f, 0x6070, 0x6232, 0x63e5, 0x6587, 0x6719, 0x689a, 0x6a08, 0x6b64, 0x6cad, 0x6de2, 0x6f03, 0x7010, 0x7108, + 0x71ea, 0x72b7, 0x736e, 0x740f, 0x7499, 0x750c, 0x7569, 0x75ae, 0x75dd, 0x75f4}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_80_e_0_92[80] = { + (Word16)0xfff9, (Word16)0xfffa, (Word16)0xfffa, (Word16)0xfffb, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffd, + (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, + (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; +#else +#define lpc_lin_pre_emphasis_80_0_92 NULL +#define lpc_lin_pre_emphasis_80_e_0_92 NULL +#endif + +RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis[NUM_SAMP_FREQ] = {lpc_lin_pre_emphasis_80_8000, lpc_lin_pre_emphasis_80_16000, + lpc_lin_pre_emphasis_80_24000, lpc_lin_pre_emphasis_80_32000, + lpc_lin_pre_emphasis_80_48000 +#ifdef ENABLE_HR_MODE + , lpc_lin_pre_emphasis_80_0_92 +#endif + }; + +RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_e[NUM_SAMP_FREQ] = { + lpc_lin_pre_emphasis_80_e_8000, lpc_lin_pre_emphasis_80_e_16000, lpc_lin_pre_emphasis_80_e_24000, + lpc_lin_pre_emphasis_80_e_32000, lpc_lin_pre_emphasis_80_e_48000 +#ifdef ENABLE_HR_MODE + , lpc_lin_pre_emphasis_80_e_0_92 +#endif +}; + +RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_5ms[NUM_SAMP_FREQ] = { + lpc_lin_pre_emphasis_40_8000, lpc_lin_pre_emphasis_80_16000, lpc_lin_pre_emphasis_40_24000, + lpc_lin_pre_emphasis_80_32000, lpc_lin_pre_emphasis_80_48000 +#ifdef ENABLE_HR_MODE + , lpc_lin_pre_emphasis_80_0_92 +#endif +}; + +RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_e_5ms[NUM_SAMP_FREQ] = { + lpc_lin_pre_emphasis_40_e_8000, lpc_lin_pre_emphasis_80_e_16000, lpc_lin_pre_emphasis_40_e_24000, + lpc_lin_pre_emphasis_80_e_32000, lpc_lin_pre_emphasis_80_e_48000 +#ifdef ENABLE_HR_MODE + , lpc_lin_pre_emphasis_80_e_0_92 +#endif +}; + +RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_2_5ms[NUM_SAMP_FREQ] = { + lpc_lin_pre_emphasis_20_8000, lpc_lin_pre_emphasis_40_16000, lpc_lin_pre_emphasis_60_24000, + lpc_lin_pre_emphasis_80_32000, lpc_lin_pre_emphasis_60_48000 +#ifdef ENABLE_HR_MODE + , lpc_lin_pre_emphasis_80_0_92 +#endif +}; + +RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_e_2_5ms[NUM_SAMP_FREQ] = { + lpc_lin_pre_emphasis_20_e_8000, lpc_lin_pre_emphasis_40_e_16000, lpc_lin_pre_emphasis_60_e_24000, + lpc_lin_pre_emphasis_80_e_32000, lpc_lin_pre_emphasis_60_e_48000 +#ifdef ENABLE_HR_MODE + , lpc_lin_pre_emphasis_80_e_0_92 +#endif +}; + +#ifdef FIX_PLC_CONFORM_ISSUES +RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_1_25ms[NUM_SAMP_FREQ] = { + lpc_lin_pre_emphasis_20_8000, lpc_lin_pre_emphasis_20_16000, lpc_lin_pre_emphasis_30_24000, + lpc_lin_pre_emphasis_40_32000, lpc_lin_pre_emphasis_60_48000 +#ifdef ENABLE_HR_MODE + , lpc_lin_pre_emphasis_80_0_92 +#endif +}; + +RAM_ALIGN const Word16* const lpc_lin_pre_emphasis_e_1_25ms[NUM_SAMP_FREQ] = { + lpc_lin_pre_emphasis_20_e_8000, lpc_lin_pre_emphasis_20_e_16000, lpc_lin_pre_emphasis_30_e_24000, + lpc_lin_pre_emphasis_40_e_32000, lpc_lin_pre_emphasis_60_e_48000 +#ifdef ENABLE_HR_MODE + , lpc_lin_pre_emphasis_80_e_0_92 +#endif +}; +#endif + + +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_60_0_62[60] = { + 0x4a26, 0x4be4, 0x4f5d, 0x5490, 0x5b79, 0x6414, 0x6e59, 0x7a43, 0x43e4, 0x4b6f, 0x53bf, 0x5ccc, 0x6690, 0x7106, + 0x7c25, 0x43f3, 0x4a1f, 0x5095, 0x574e, 0x5e46, 0x6578, 0x6cdf, 0x7477, 0x7c39, 0x4210, 0x4613, 0x4a24, 0x4e3e, + 0x5260, 0x5686, 0x5aae, 0x5ed4, 0x62f6, 0x6710, 0x6b21, 0x6f24, 0x7318, 0x76f9, 0x7ac4, 0x7e78, 0x4109, 0x42c7, + 0x4475, 0x4612, 0x479d, 0x4915, 0x4a79, 0x4bc8, 0x4d01, 0x4e22, 0x4f2c, 0x501e, 0x50f6, 0x51b4, 0x5259, 0x52e2, + 0x5351, 0x53a4, 0x53dc, 0x53f8}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_60_e_0_62[60] = { + (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, + (Word16)0xfffe, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, + (Word16)0xffff, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; + +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_60_0_72[60] = { + 0x50c9, 0x54d4, 0x5ce6, 0x68f9, 0x7906, 0x4681, 0x526e, 0x6043, 0x6ff6, 0x40be, 0x4a65, 0x54e8, 0x6040, 0x6c65, + 0x794f, 0x437a, 0x4aa6, 0x5226, 0x59f5, 0x620c, 0x6a68, 0x7301, 0x7bd2, 0x426a, 0x4701, 0x4baa, 0x5062, 0x5526, + 0x59f2, 0x5ec4, 0x6397, 0x6869, 0x6d35, 0x71f9, 0x76b1, 0x7b5a, 0x7ff1, 0x4239, 0x446d, 0x4694, 0x48aa, 0x4ab0, + 0x4ca4, 0x4e84, 0x504f, 0x5204, 0x53a1, 0x5526, 0x5691, 0x57e1, 0x5916, 0x5a2e, 0x5b29, 0x5c07, 0x5cc5, 0x5d65, + 0x5de6, 0x5e46, 0x5e87, 0x5ea7}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_60_e_0_72[60] = { + (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffe, (Word16)0xfffe, + (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, + (Word16)0xffff, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; + +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_60_0_82[60] = { + 0x4382, 0x4cb6, 0x5f17, 0x7a99, 0x4f94, 0x6656, 0x40c0, 0x5081, 0x6263, 0x7658, 0x4629, 0x5222, 0x5f0e, 0x6ce3, + 0x7b98, 0x4591, 0x4dbc, 0x5647, 0x5f2b, 0x6862, 0x71e7, 0x7bb2, 0x42de, 0x47ff, 0x4d39, 0x5288, 0x57e8, 0x5d55, + 0x62cc, 0x6849, 0x6dc8, 0x7345, 0x78bc, 0x7e29, 0x41c5, 0x446c, 0x4709, 0x499a, 0x4c1c, 0x4e8f, 0x50f0, 0x533e, + 0x5577, 0x579a, 0x59a4, 0x5b96, 0x5d6c, 0x5f27, 0x60c4, 0x6243, 0x63a3, 0x64e2, 0x6601, 0x66fd, 0x67d6, 0x688c, + 0x691e, 0x698c, 0x69d6, 0x69fb}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_60_e_0_82[60] = { + (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffe, + (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, + (Word16)0xffff, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0000, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; + +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_60_0_92[60] = { + 0x7330, 0x62e5, 0x5ab1, 0x4c35, 0x753a, 0x5425, 0x72a0, 0x4afd, 0x5f0d, 0x7571, 0x470d, 0x547b, 0x62fa, 0x727f, + 0x4180, 0x4a38, 0x5362, 0x5cf7, 0x66f0, 0x7148, 0x7bf5, 0x4379, 0x491b, 0x4edc, 0x54b9, 0x5aae, 0x60b6, 0x66cd, + 0x6cee, 0x7316, 0x7941, 0x7f69, 0x42c5, 0x45d1, 0x48d4, 0x4bcf, 0x4ebd, 0x519e, 0x546f, 0x572e, 0x59d9, 0x5c6f, + 0x5eee, 0x6153, 0x639d, 0x65cb, 0x67dc, 0x69cc, 0x6b9c, 0x6d4a, 0x6ed4, 0x703b, 0x717c, 0x7296, 0x738a, 0x7457, + 0x74fb, 0x7576, 0x75c9, 0x75f2}; +RAM_ALIGN const Word16 lpc_lin_pre_emphasis_60_e_0_92[60] = { + (Word16)0xfff9, (Word16)0xfffa, (Word16)0xfffb, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffd, (Word16)0xfffd, + (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, + (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, + (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0001, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, + (Word16)0x0002, (Word16)0x0002, (Word16)0x0002, (Word16)0x0002}; + +RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_7_5ms[NUM_SAMP_FREQ] = { + lpc_lin_pre_emphasis_60_0_62, lpc_lin_pre_emphasis_60_0_72, lpc_lin_pre_emphasis_60_0_82, + lpc_lin_pre_emphasis_80_0_92, lpc_lin_pre_emphasis_60_0_92 +#ifdef ENABLE_HR_MODE + , lpc_lin_pre_emphasis_80_0_92 +#endif + }; +RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_e_7_5ms[NUM_SAMP_FREQ] = { + lpc_lin_pre_emphasis_60_e_0_62, lpc_lin_pre_emphasis_60_e_0_72, lpc_lin_pre_emphasis_60_e_0_82, + lpc_lin_pre_emphasis_80_e_0_92, lpc_lin_pre_emphasis_60_e_0_92 +#ifdef ENABLE_HR_MODE + , lpc_lin_pre_emphasis_80_e_0_92 +#endif + }; + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 lpc_warp_dee_emphasis_16_8000[16] = {0x4000, 0x673f, 0x5348, 0x432d, 0x6c5f, 0x576a, + 0x4682, 0x71bf, 0x5bc0, 0x4a02, 0x7764, 0x604d, + 0x4dae, 0x7d50, 0x6514, 0x5188}; + +RAM_ALIGN const Word16 lpc_warp_dee_emphasis_16_e_8000[16] = { + (Word16)0x0001, (Word16)0x0000, (Word16)0x0000, (Word16)0x0000, (Word16)0xffff, (Word16)0xffff, + (Word16)0xffff, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffd, (Word16)0xfffd, + (Word16)0xfffd, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffc}; +#else +#define lpc_warp_dee_emphasis_16_8000 NULL +#define lpc_warp_dee_emphasis_16_e_8000 NULL +#endif + +#ifdef SUBSET_WB +RAM_ALIGN const Word16 lpc_warp_dee_emphasis_16_16000[16] = {0x4000, 0x6119, 0x49a8, 0x6fc0, 0x54c5, 0x404e, + 0x618f, 0x4a02, 0x7048, 0x552c, 0x409c, 0x6206, + 0x4a5c, 0x70d0, 0x5594, 0x40eb}; + +RAM_ALIGN const Word16 lpc_warp_dee_emphasis_16_e_16000[16] = { + (Word16)0x0001, (Word16)0x0000, (Word16)0x0000, (Word16)0xffff, (Word16)0xffff, (Word16)0xffff, + (Word16)0xfffe, (Word16)0xfffe, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffc, + (Word16)0xfffc, (Word16)0xfffb, (Word16)0xfffb, (Word16)0xfffb}; +#else +#define lpc_warp_dee_emphasis_16_16000 NULL +#define lpc_warp_dee_emphasis_16_e_16000 NULL +#endif + +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 lpc_warp_dee_emphasis_16_24000[16] = {0x4000, 0x5b51, 0x4125, 0x5cf3, 0x424f, 0x5e9c, + 0x437f, 0x604d, 0x44b4, 0x6206, 0x45ee, 0x63c7, + 0x472e, 0x658f, 0x4874, 0x6760}; + +RAM_ALIGN const Word16 lpc_warp_dee_emphasis_16_e_24000[16] = { + (Word16)0x0001, (Word16)0x0000, (Word16)0x0000, (Word16)0xffff, (Word16)0xffff, (Word16)0xfffe, + (Word16)0xfffe, (Word16)0xfffd, (Word16)0xfffd, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffb, + (Word16)0xfffb, (Word16)0xfffa, (Word16)0xfffa, (Word16)0xfff9}; +#else +#define lpc_warp_dee_emphasis_16_24000 NULL +#define lpc_warp_dee_emphasis_16_e_24000 NULL +#endif + +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 lpc_warp_dee_emphasis_16_32000[16] = {0x4000, 0x55e1, 0x733b, 0x4d50, 0x67bd, 0x4599, + 0x5d64, 0x7d50, 0x5413, 0x70d0, 0x4bb0, 0x658f, + 0x4423, 0x5b6e, 0x7aaf, 0x524f}; + +RAM_ALIGN const Word16 lpc_warp_dee_emphasis_16_e_32000[16] = { + (Word16)0x0001, (Word16)0x0000, (Word16)0xffff, (Word16)0xffff, (Word16)0xfffe, (Word16)0xfffe, + (Word16)0xfffd, (Word16)0xfffc, (Word16)0xfffc, (Word16)0xfffb, (Word16)0xfffb, (Word16)0xfffa, + (Word16)0xfffa, (Word16)0xfff9, (Word16)0xfff8, (Word16)0xfff8}; +#else +#define lpc_warp_dee_emphasis_16_32000 NULL +#define lpc_warp_dee_emphasis_16_e_32000 NULL +#endif + +#ifdef SUBSET_FB +RAM_ALIGN const Word16 lpc_warp_dee_emphasis_16_48000[16] = {0x4000, 0x50c3, 0x65ea, 0x404e, 0x5126, 0x6666, + 0x409c, 0x5188, 0x66e3, 0x40eb, 0x51ec, 0x6760, + 0x413a, 0x524f, 0x67de, 0x4189}; + +RAM_ALIGN const Word16 lpc_warp_dee_emphasis_16_e_48000[16] = { + (Word16)0x0001, (Word16)0x0000, (Word16)0xffff, (Word16)0xffff, (Word16)0xfffe, (Word16)0xfffd, + (Word16)0xfffd, (Word16)0xfffc, (Word16)0xfffb, (Word16)0xfffb, (Word16)0xfffa, (Word16)0xfff9, + (Word16)0xfff9, (Word16)0xfff8, (Word16)0xfff7, (Word16)0xfff7}; +#else +#define lpc_warp_dee_emphasis_16_48000 NULL +#define lpc_warp_dee_emphasis_16_e_48000 NULL +#endif + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 lpc_warp_dee_emphasis_16_96000[16] = {0x4000, 0x4bf4, 0x5a23, 0x6af9, 0x7ef3, 0x4b54, + 0x5966, 0x6a18, 0x7de9, 0x4ab6, 0x58aa, 0x6939, + 0x7ce0, 0x4a19, 0x57f0, 0x685d}; + +RAM_ALIGN const Word16 lpc_warp_dee_emphasis_16_e_96000[16] = { + (Word16)0x0001, (Word16)0x0000, (Word16)0xffff, (Word16)0xfffe, (Word16)0xfffd, (Word16)0xfffd, + (Word16)0xfffc, (Word16)0xfffb, (Word16)0xfffa, (Word16)0xfffa, (Word16)0xfff9, (Word16)0xfff8, + (Word16)0xfff7, (Word16)0xfff7, (Word16)0xfff6, (Word16)0xfff5}; +#else +#define lpc_warp_dee_emphasis_16_96000 NULL +#define lpc_warp_dee_emphasis_16_e_96000 NULL +#endif + +RAM_ALIGN const Word16 *const lpc_warp_dee_emphasis[NUM_SAMP_FREQ] = { + lpc_warp_dee_emphasis_16_8000, lpc_warp_dee_emphasis_16_16000, lpc_warp_dee_emphasis_16_24000, + lpc_warp_dee_emphasis_16_32000, lpc_warp_dee_emphasis_16_48000, lpc_warp_dee_emphasis_16_96000}; +RAM_ALIGN const Word16 *const lpc_warp_dee_emphasis_e[NUM_SAMP_FREQ] = { + lpc_warp_dee_emphasis_16_e_8000, lpc_warp_dee_emphasis_16_e_16000, lpc_warp_dee_emphasis_16_e_24000, + lpc_warp_dee_emphasis_16_e_32000, lpc_warp_dee_emphasis_16_e_48000, lpc_warp_dee_emphasis_16_e_96000}; + +RAM_ALIGN const Word16 bands_nrg_scale[32] = {0, 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}; + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 bands_offset_48000_HR[65] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21, 23, 25, + 27, 29, 31, 33, 36, 39, 42, 45, 48, 51, 55, 59, 63, 67, 72, 77, 83, 89, 95, 101, 108, 116, + 124, 133, 142, 152, 163, 174, 187, 200, 214, 229, 244, 262, 280, 299, 320, 343, 367, 392, 419, 449, 480}; + +RAM_ALIGN const Word16 bands_offset_96000_HR[65] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, + 33, 36, 39, 42, 46, 50, 54, 59, 64, 69, 75, 82, 89, 96, 104, 113, 122, 132, 143, 155, 168, 181, + 196, 213, 230, 249, 270, 292, 316, 342, 371, 401, 434, 470, 509, 551, 596, 646, 699, 757, 819, 887, 960}; + +RAM_ALIGN const Word16 *const bands_offset_HR[2] = {bands_offset_48000_HR, bands_offset_96000_HR}; + +RAM_ALIGN const Word16 bands_offset_48000_5ms_HR[56] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 21, 23, 25, 27, 29, 31, 33, 35, 38, 41, 44, 47, 50, 54, 58, 62, 66, 71, + 76, 81, 87, 93, 100, 107, 114, 122, 131, 140, 149, 160, 171, 183, 196, 209, 224, 240}; +RAM_ALIGN const Word16 bands_offset_96000_5ms_HR[59] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21, + 23, 25, 27, 29, 31, 34, 37, 40, 44, 48, 52, 56, 61, 66, 71, 77, 83, 90, 98, 106, + 115, 124, 135, 146, 158, 171, 185, 200, 217, 235, 254, 275, 298, 323, 349, 378, 409, 443, 480}; + +RAM_ALIGN const Word16 *const bands_offset_5ms_HR[2] = {bands_offset_48000_5ms_HR, bands_offset_96000_5ms_HR}; + +RAM_ALIGN const Word16 bands_offset_48000_2_5ms_HR[46] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, + 27, 29, 31, 33, 35, 37, 40, 43, 46, 49, 53, 57, 61, 65, 69, 74, 79, 85, 91, 97, 104, 112, 120}; +RAM_ALIGN const Word16 bands_offset_96000_2_5ms_HR[50] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 26, 28, 30, 32, + 35, 38, 41, 45, 49, 53, 57, 62, 67, 73, 79, 85, 92, 100, 108, 117, 127, 137, 149, 161, 174, 189, 204, 221, 240}; + +RAM_ALIGN const Word16 *const bands_offset_2_5ms_HR[2] = {bands_offset_48000_2_5ms_HR, bands_offset_96000_2_5ms_HR}; + +RAM_ALIGN const Word16 bands_offset_48000_7_5ms_HR[65] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, + 26, 28, 30, 32, 34, 36, 38, 41, 44, 47, 50, 53, 56, 60, 64, 68, 73, 78, 83, 89, 95, 101, 108, + 115, 122, 130, 139, 148, 158, 168, 179, 191, 203, 217, 231, 246, 262, 279, 298, 317, 338, 360}; +RAM_ALIGN const Word16 bands_offset_96000_7_5ms_HR[65] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 26, 28, + 30, 32, 35, 38, 41, 44, 48, 52, 56, 61, 66, 71, 77, 83, 90, 97, 105, 114, 123, 132, 143, 155, 167, + 180, 195, 210, 227, 245, 265, 286, 309, 334, 360, 389, 420, 454, 490, 529, 572, 617, 667, 720}; + +RAM_ALIGN const Word16 *const bands_offset_7_5ms_HR[2] = {bands_offset_48000_7_5ms_HR, bands_offset_96000_7_5ms_HR}; +#endif /* ENABLE_HR_MODE */ + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 bands_offset_8000_lpc_warp[65] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, + 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, + 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, + 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0033, 0x0035, + 0x0037, 0x0039, 0x003b, 0x003d, 0x003f, 0x0041, 0x0043, 0x0045, 0x0047, 0x0049, 0x004b, 0x004d, 0x0050}; +#else +#define bands_offset_8000_lpc_warp NULL +#endif + +#ifdef SUBSET_WB +RAM_ALIGN const Word16 bands_offset_16000_lpc_warp[65] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, + 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, + 0x001a, 0x001b, 0x001c, 0x001e, 0x0020, 0x0022, 0x0024, 0x0026, 0x0028, 0x002a, 0x002c, 0x002e, 0x0030, + 0x0032, 0x0034, 0x0037, 0x003a, 0x003d, 0x0040, 0x0043, 0x0046, 0x0049, 0x004c, 0x0050, 0x0054, 0x0058, + 0x005c, 0x0060, 0x0065, 0x006a, 0x006f, 0x0074, 0x0079, 0x007f, 0x0085, 0x008b, 0x0092, 0x0099, 0x00a0}; +#else +#define bands_offset_16000_lpc_warp NULL +#endif + +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 bands_offset_24000_lpc_warp[65] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, + 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0019, 0x001b, + 0x001d, 0x001f, 0x0021, 0x0023, 0x0025, 0x0027, 0x0029, 0x002b, 0x002e, 0x0031, 0x0034, 0x0037, 0x003a, + 0x003d, 0x0040, 0x0044, 0x0048, 0x004c, 0x0050, 0x0055, 0x005a, 0x005f, 0x0064, 0x006a, 0x0070, 0x0076, + 0x007d, 0x0084, 0x008b, 0x0093, 0x009b, 0x00a4, 0x00ad, 0x00b7, 0x00c1, 0x00cc, 0x00d7, 0x00e3, 0x00f0}; +#else +#define bands_offset_24000_lpc_warp NULL +#endif + +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 bands_offset_32000_lpc_warp[65] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, + 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0016, 0x0018, 0x001a, 0x001c, 0x001e, + 0x0020, 0x0022, 0x0024, 0x0026, 0x0029, 0x002c, 0x002f, 0x0032, 0x0035, 0x0038, 0x003c, 0x0040, 0x0044, + 0x0048, 0x004c, 0x0051, 0x0056, 0x005b, 0x0061, 0x0067, 0x006d, 0x0074, 0x007b, 0x0083, 0x008b, 0x0094, + 0x009d, 0x00a6, 0x00b0, 0x00bb, 0x00c7, 0x00d3, 0x00e0, 0x00ee, 0x00fc, 0x010c, 0x011c, 0x012e, 0x0140}; +#else +#define bands_offset_32000_lpc_warp NULL +#endif + +#ifdef SUBSET_FB +RAM_ALIGN const Word16 bands_offset_48000_lpc_warp[65] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, + 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0014, 0x0016, 0x0018, 0x001a, 0x001c, 0x001e, 0x0020, + 0x0022, 0x0024, 0x0027, 0x002a, 0x002d, 0x0030, 0x0033, 0x0037, 0x003b, 0x003f, 0x0043, 0x0047, 0x004c, + 0x0051, 0x0056, 0x005c, 0x0062, 0x0069, 0x0070, 0x0077, 0x007f, 0x0087, 0x0090, 0x009a, 0x00a4, 0x00af, + 0x00ba, 0x00c6, 0x00d3, 0x00e1, 0x00f0, 0x0100, 0x0111, 0x0123, 0x0136, 0x014a, 0x0160, 0x0177, 0x0190}; +#else +#define bands_offset_48000_lpc_warp NULL +#endif + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 bands_offset_8000_lpc_lin[81] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, + 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, + 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, + 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, + 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050}; +#else +#define bands_offset_8000_lpc_lin NULL +#endif + +#ifdef SUBSET_WB +RAM_ALIGN const Word16 bands_offset_16000_lpc_lin[81] = { + 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e, 0x0010, 0x0012, 0x0014, 0x0016, 0x0018, 0x001a, + 0x001c, 0x001e, 0x0020, 0x0022, 0x0024, 0x0026, 0x0028, 0x002a, 0x002c, 0x002e, 0x0030, 0x0032, 0x0034, 0x0036, + 0x0038, 0x003a, 0x003c, 0x003e, 0x0040, 0x0042, 0x0044, 0x0046, 0x0048, 0x004a, 0x004c, 0x004e, 0x0050, 0x0052, + 0x0054, 0x0056, 0x0058, 0x005a, 0x005c, 0x005e, 0x0060, 0x0062, 0x0064, 0x0066, 0x0068, 0x006a, 0x006c, 0x006e, + 0x0070, 0x0072, 0x0074, 0x0076, 0x0078, 0x007a, 0x007c, 0x007e, 0x0080, 0x0082, 0x0084, 0x0086, 0x0088, 0x008a, + 0x008c, 0x008e, 0x0090, 0x0092, 0x0094, 0x0096, 0x0098, 0x009a, 0x009c, 0x009e, 0x00a0}; +#else +#define bands_offset_16000_lpc_lin NULL +#endif + +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 bands_offset_24000_lpc_lin[81] = { + 0x0000, 0x0003, 0x0006, 0x0009, 0x000c, 0x000f, 0x0012, 0x0015, 0x0018, 0x001b, 0x001e, 0x0021, 0x0024, 0x0027, + 0x002a, 0x002d, 0x0030, 0x0033, 0x0036, 0x0039, 0x003c, 0x003f, 0x0042, 0x0045, 0x0048, 0x004b, 0x004e, 0x0051, + 0x0054, 0x0057, 0x005a, 0x005d, 0x0060, 0x0063, 0x0066, 0x0069, 0x006c, 0x006f, 0x0072, 0x0075, 0x0078, 0x007b, + 0x007e, 0x0081, 0x0084, 0x0087, 0x008a, 0x008d, 0x0090, 0x0093, 0x0096, 0x0099, 0x009c, 0x009f, 0x00a2, 0x00a5, + 0x00a8, 0x00ab, 0x00ae, 0x00b1, 0x00b4, 0x00b7, 0x00ba, 0x00bd, 0x00c0, 0x00c3, 0x00c6, 0x00c9, 0x00cc, 0x00cf, + 0x00d2, 0x00d5, 0x00d8, 0x00db, 0x00de, 0x00e1, 0x00e4, 0x00e7, 0x00ea, 0x00ed, 0x00f0}; +#else +#define bands_offset_24000_lpc_lin NULL +#endif + +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 bands_offset_32000_lpc_lin[81] = { + 0x0000, 0x0004, 0x0008, 0x000c, 0x0010, 0x0014, 0x0018, 0x001c, 0x0020, 0x0024, 0x0028, 0x002c, 0x0030, 0x0034, + 0x0038, 0x003c, 0x0040, 0x0044, 0x0048, 0x004c, 0x0050, 0x0054, 0x0058, 0x005c, 0x0060, 0x0064, 0x0068, 0x006c, + 0x0070, 0x0074, 0x0078, 0x007c, 0x0080, 0x0084, 0x0088, 0x008c, 0x0090, 0x0094, 0x0098, 0x009c, 0x00a0, 0x00a4, + 0x00a8, 0x00ac, 0x00b0, 0x00b4, 0x00b8, 0x00bc, 0x00c0, 0x00c4, 0x00c8, 0x00cc, 0x00d0, 0x00d4, 0x00d8, 0x00dc, + 0x00e0, 0x00e4, 0x00e8, 0x00ec, 0x00f0, 0x00f4, 0x00f8, 0x00fc, 0x0100, 0x0104, 0x0108, 0x010c, 0x0110, 0x0114, + 0x0118, 0x011c, 0x0120, 0x0124, 0x0128, 0x012c, 0x0130, 0x0134, 0x0138, 0x013c, 0x0140}; +#else +#define bands_offset_32000_lpc_lin NULL +#endif + +#ifdef SUBSET_FB +RAM_ALIGN const Word16 bands_offset_48000_lpc_lin[81] = { + 0x0000, 0x0006, 0x000c, 0x0012, 0x0018, 0x001e, 0x0024, 0x002a, 0x0030, 0x0036, 0x003c, 0x0042, 0x0048, 0x004e, + 0x0054, 0x005a, 0x0060, 0x0066, 0x006c, 0x0072, 0x0078, 0x007e, 0x0084, 0x008a, 0x0090, 0x0096, 0x009c, 0x00a2, + 0x00a8, 0x00ae, 0x00b4, 0x00ba, 0x00c0, 0x00c6, 0x00cc, 0x00d2, 0x00d8, 0x00de, 0x00e4, 0x00ea, 0x00f0, 0x00f6, + 0x00fc, 0x0102, 0x0108, 0x010e, 0x0114, 0x011a, 0x0120, 0x0126, 0x012c, 0x0132, 0x0138, 0x013e, 0x0144, 0x014a, + 0x0150, 0x0156, 0x015c, 0x0162, 0x0168, 0x016e, 0x0174, 0x017a, 0x0180, 0x0186, 0x018c, 0x0192, 0x0198, 0x019e, + 0x01a4, 0x01aa, 0x01b0, 0x01b6, 0x01bc, 0x01c2, 0x01c8, 0x01ce, 0x01d4, 0x01da, 0x01e0}; +#else +#define bands_offset_48000_lpc_lin NULL +#endif + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 bands_offset_8000_lpc_warp_5ms[40] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, + 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, + 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0028}; +#else +#define bands_offset_8000_lpc_warp_5ms NULL +#endif + +#ifdef SUBSET_WB +RAM_ALIGN const Word16 bands_offset_16000_lpc_warp_5ms[51] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, + 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, + 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x0020, 0x0022, 0x0024, 0x0026, 0x0028, 0x002a, 0x002c, 0x002e, + 0x0030, 0x0032, 0x0034, 0x0036, 0x0039, 0x003c, 0x003f, 0x0042, 0x0045, 0x0048, 0x004c, 0x0050}; +#else +#define bands_offset_16000_lpc_warp_5ms NULL +#endif + +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 bands_offset_24000_lpc_warp_5ms[53] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, + 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x001a, 0x001c, 0x001e, + 0x0020, 0x0022, 0x0024, 0x0026, 0x0028, 0x002a, 0x002c, 0x002f, 0x0032, 0x0035, 0x0038, 0x003b, 0x003e, 0x0041, + 0x0045, 0x0049, 0x004d, 0x0051, 0x0056, 0x005b, 0x0060, 0x0065, 0x006b, 0x0071, 0x0078}; +#else +#define bands_offset_24000_lpc_warp_5ms NULL +#endif + +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 bands_offset_32000_lpc_warp_5ms[55] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, + 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0018, 0x001a, 0x001c, 0x001e, 0x0020, + 0x0022, 0x0024, 0x0026, 0x0028, 0x002a, 0x002d, 0x0030, 0x0033, 0x0036, 0x0039, 0x003d, 0x0041, 0x0045, 0x0049, + 0x004e, 0x0053, 0x0058, 0x005d, 0x0063, 0x0069, 0x0070, 0x0077, 0x007e, 0x0086, 0x008e, 0x0097, 0x00a0}; +#else +#define bands_offset_32000_lpc_warp_5ms NULL +#endif + +#ifdef SUBSET_FB +RAM_ALIGN const Word16 bands_offset_48000_lpc_warp_5ms[56] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, + 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0017, 0x0019, 0x001b, 0x001d, 0x001f, 0x0021, + 0x0023, 0x0025, 0x0028, 0x002b, 0x002e, 0x0031, 0x0034, 0x0037, 0x003b, 0x003f, 0x0043, 0x0048, 0x004d, 0x0052, + 0x0057, 0x005d, 0x0063, 0x0069, 0x0070, 0x0078, 0x0080, 0x0088, 0x0091, 0x009b, 0x00a5, 0x00b0, 0x00bb, 0x00c8}; +#else +#define bands_offset_48000_lpc_warp_5ms NULL +#endif + + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 bands_offset_8000_lpc_warp_2_5ms[21] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; +#else +#define bands_offset_8000_lpc_warp_2_5ms NULL +#endif + +#ifdef SUBSET_WB +RAM_ALIGN const Word16 bands_offset_16000_lpc_warp_2_5ms[36] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 32, 34, 36, 38, 40}; +#else +#define bands_offset_16000_lpc_warp_2_5ms NULL +#endif + +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 bands_offset_24000_lpc_warp_2_5ms[41] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, + 30, 32, 34, 36, 38, 40, 42, 44, 47, 50, 53, 56, 60}; +#else +#define bands_offset_24000_lpc_warp_2_5ms NULL +#endif + +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 bands_offset_32000_lpc_warp_2_5ms[44] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 26, 28, 30, 32, 34, 36, 38, 40, 43, 46, 49, 52, 55, 59, 63, 67, 71, 75, 80}; +#else +#define bands_offset_32000_lpc_warp_2_5ms NULL +#endif + +#ifdef SUBSET_FB +RAM_ALIGN const Word16 bands_offset_48000_lpc_warp_2_5ms[45] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, + 25, 27, 29, 31, 33, 35, 37, 40, 43, 46, 49, 52, 56, 60, 64, 68, 72, 77, 82, 87, 93, 100}; +#else +#define bands_offset_48000_lpc_warp_2_5ms NULL +#endif + + + +RAM_ALIGN const Word16 *const bands_offset[6] = {bands_offset_8000_lpc_warp, bands_offset_16000_lpc_warp, + bands_offset_24000_lpc_warp, bands_offset_32000_lpc_warp, + bands_offset_48000_lpc_warp, NULL}; + +RAM_ALIGN const Word16 bands_offset_with_one_max_7_5ms[NUM_OFFSETS] = {60, 34, 27, 24, 22 +#ifdef ENABLE_HR_MODE + , 20, 16 +#endif +}; +RAM_ALIGN const Word16 bands_offset_with_two_max_7_5ms[NUM_OFFSETS] = {0, 48, 38, 33, 31 +#ifdef ENABLE_HR_MODE + , 29, 24 +#endif +}; + +RAM_ALIGN const Word16 bands_offset_with_one_max[NUM_OFFSETS] = {49, 28, 23, 20, 18 +#ifdef ENABLE_HR_MODE + , 17, 12 +#endif + }; +RAM_ALIGN const Word16 bands_offset_with_two_max[NUM_OFFSETS] = {63, 40, 33, 29, 27 +#ifdef ENABLE_HR_MODE + , 25, 21 +#endif + }; + +RAM_ALIGN const Word16 *const bands_offset_5ms[6] = {bands_offset_8000_lpc_warp_5ms, bands_offset_16000_lpc_warp_5ms, + bands_offset_24000_lpc_warp_5ms, bands_offset_32000_lpc_warp_5ms, + bands_offset_48000_lpc_warp_5ms, NULL}; +RAM_ALIGN const Word16 bands_offset_with_one_max_5ms[NUM_OFFSETS] = {38, 30, 24, 22, 21 +#ifdef ENABLE_HR_MODE + , 19, 17 +#endif + }; +RAM_ALIGN const Word16 bands_offset_with_two_max_5ms[NUM_OFFSETS] = {39, 42, 34, 32, 29 +#ifdef ENABLE_HR_MODE + , 27, 24 +#endif + }; + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 bands_number_7_5ms [] = {60, 64, 64, 64, 64, 64}; +#else +RAM_ALIGN const Word16 bands_number_7_5ms [] = {60, 64, 64, 64, 64}; +#endif + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 bands_number_5ms[NUM_SAMP_FREQ] = {39, 50, 52, 54, 55, 58}; +#else +RAM_ALIGN const Word16 bands_number_5ms[NUM_SAMP_FREQ] = {39, 50, 52, 54, 55}; +#endif + +RAM_ALIGN const Word16 *const bands_offset_2_5ms[6] = { + bands_offset_8000_lpc_warp_2_5ms, bands_offset_16000_lpc_warp_2_5ms, bands_offset_24000_lpc_warp_2_5ms, + bands_offset_32000_lpc_warp_2_5ms, bands_offset_48000_lpc_warp_2_5ms, NULL}; + +RAM_ALIGN const Word16 bands_offset_with_one_max_2_5ms[NUM_OFFSETS] = {20, 30, 26, 24, 21 +#ifdef ENABLE_HR_MODE + , 19, 16 +#endif + }; +RAM_ALIGN const Word16 bands_offset_with_two_max_2_5ms[NUM_OFFSETS] = {20, 35, 35, 32, 29 +#ifdef ENABLE_HR_MODE + , 28, 24 +#endif + }; + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 bands_number_2_5ms_HR[] = {20, 35, 40, 43, 45, 49}; +RAM_ALIGN const Word16 bands_number_2_5ms [] = {20, 35, 40, 43, 44, 49}; +#else +RAM_ALIGN const Word16 bands_number_2_5ms [] = {20, 35, 40, 43, 44}; +#endif + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 bands_offset_96000_lpc_lin[81] = +{ + 0x0000, 0x000c, 0x0018, 0x0024, 0x0030, 0x003c, 0x0048, 0x0054, 0x0060, 0x006c, 0x0078, 0x0084, 0x0090, 0x009c, + 0x00a8, 0x00b4, 0x00c0, 0x00cc, 0x00d8, 0x00e4, 0x00f0, 0x00fc, 0x0108, 0x0114, 0x0120, 0x012c, 0x0138, 0x0144, + 0x0150, 0x015c, 0x0168, 0x0174, 0x0180, 0x018c, 0x0198, 0x01a4, 0x01b0, 0x01bc, 0x01c8, 0x01d4, 0x01e0, 0x01ec, + 0x01f8, 0x0204, 0x0210, 0x021c, 0x0228, 0x0234, 0x0240, 0x024c, 0x0258, 0x0264, 0x0270, 0x027c, 0x0288, 0x0294, + 0x02a0, 0x02ac, 0x02b8, 0x02c4, 0x02d0, 0x02dc, 0x02e8, 0x02f4, 0x0300, 0x030c, 0x0318, 0x0324, 0x0330, 0x033c, + 0x0348, 0x0354, 0x0360, 0x036c, 0x0378, 0x0384, 0x0390, 0x039c, 0x03a8, 0x03b4, 0x03c0 +}; + +RAM_ALIGN const Word16 bands_offset_96000_lpc_lin_7_5ms[81] = +{ + 0x0000, 0x0009, 0x0012, 0x001b, 0x0024, 0x002d, 0x0036, 0x003f, 0x0048, 0x0051, 0x005a, 0x0063, 0x006c, 0x0075, + 0x007e, 0x0087, 0x0090, 0x0099, 0x00a2, 0x00ab, 0x00b4, 0x00bd, 0x00c6, 0x00cf, 0x00d8, 0x00e1, 0x00ea, 0x00f3, + 0x00fc, 0x0105, 0x010e, 0x0117, 0x0120, 0x0129, 0x0132, 0x013b, 0x0144, 0x014d, 0x0156, 0x015f, 0x0168, 0x0171, + 0x017a, 0x0183, 0x018c, 0x0195, 0x019e, 0x01a7, 0x01b0, 0x01b9, 0x01c2, 0x01cb, 0x01d4, 0x01dd, 0x01e6, 0x01ef, + 0x01f8, 0x0201, 0x020a, 0x0213, 0x021c, 0x0225, 0x022e, 0x0237, 0x0240, 0x0249, 0x0252, 0x025b, 0x0264, 0x026d, + 0x0276, 0x027f, 0x0288, 0x0291, 0x029a, 0x02a3, 0x02ac, 0x02b5, 0x02be, 0x02c7, 0x02d0 +}; +#endif + + +RAM_ALIGN const Word16 *const bands_offset_lin[NUM_SAMP_FREQ] = {bands_offset_8000_lpc_lin, bands_offset_16000_lpc_lin, + bands_offset_24000_lpc_lin, bands_offset_32000_lpc_lin, + bands_offset_48000_lpc_lin +#ifdef ENABLE_HR_MODE + , bands_offset_96000_lpc_lin +#endif + }; + +RAM_ALIGN const Word16 *const bands_offset_lin_7_5ms[NUM_SAMP_FREQ] = {bands_offset_8000_lpc_lin, bands_offset_16000_lpc_lin, + bands_offset_24000_lpc_lin, bands_offset_24000_lpc_lin, + bands_offset_48000_lpc_lin +#ifdef ENABLE_HR_MODE + , bands_offset_96000_lpc_lin_7_5ms +#endif + }; + +RAM_ALIGN const Word16 *const bands_offset_lin_5ms[NUM_SAMP_FREQ] = {bands_offset_8000_lpc_lin, bands_offset_8000_lpc_lin, + bands_offset_24000_lpc_lin, bands_offset_16000_lpc_lin, + bands_offset_24000_lpc_lin +#ifdef ENABLE_HR_MODE + , bands_offset_48000_lpc_lin +#endif + }; +RAM_ALIGN const Word16 *const bands_offset_lin_2_5ms[NUM_SAMP_FREQ] = {bands_offset_8000_lpc_lin, bands_offset_8000_lpc_lin, + bands_offset_8000_lpc_lin, bands_offset_8000_lpc_lin, + bands_offset_16000_lpc_lin +#ifdef ENABLE_HR_MODE + , bands_offset_24000_lpc_lin +#endif + }; + +#ifdef FIX_PLC_CONFORM_ISSUES +RAM_ALIGN const Word16 *const bands_offset_lin_1_25ms[NUM_SAMP_FREQ] = {bands_offset_8000_lpc_lin, bands_offset_8000_lpc_lin, + bands_offset_8000_lpc_lin, bands_offset_8000_lpc_lin, + bands_offset_8000_lpc_lin +#ifdef ENABLE_HR_MODE + , bands_offset_24000_lpc_lin +#endif + }; +#endif + +RAM_ALIGN const Word16 bands_offset_with_one_max_lin[NUM_SAMP_FREQ] = {80, 0, 0, 0, 0 +#ifdef ENABLE_HR_MODE + , 0 +#endif + }; +RAM_ALIGN const Word16 bands_offset_with_two_max_lin[NUM_SAMP_FREQ] = {0, 80, 0, 0, 0 +#ifdef ENABLE_HR_MODE + , 0 +#endif + }; + +RAM_ALIGN const Word16 bands_offset_with_one_max_lin_7_5ms[NUM_SAMP_FREQ] = {60, 0, 0, 0, 0 +#ifdef ENABLE_HR_MODE + , 0 +#endif + }; + +RAM_ALIGN const Word16 bands_offset_with_two_max_lin_7_5ms[NUM_SAMP_FREQ] = {0, 60, 0, 0, 0 +#ifdef ENABLE_HR_MODE + , 0 +#endif + }; + +RAM_ALIGN const Word16 bands_offset_with_one_max_lin_5ms[NUM_SAMP_FREQ] = {40, 80, 0, 0, 0 +#ifdef ENABLE_HR_MODE + , 0 +#endif + }; +RAM_ALIGN const Word16 bands_offset_with_two_max_lin_5ms[NUM_SAMP_FREQ] = {0, 0, 0, 80, 0 +#ifdef ENABLE_HR_MODE + , 0 +#endif + }; +RAM_ALIGN const Word16 bands_offset_with_one_max_lin_2_5ms[NUM_SAMP_FREQ] = {20, 40, 60, 80, 0 +#ifdef ENABLE_HR_MODE + , 0 +#endif + }; +RAM_ALIGN const Word16 bands_offset_with_two_max_lin_2_5ms[NUM_SAMP_FREQ] = {0, 0, 0, 0, 60 +#ifdef ENABLE_HR_MODE + , 0 +#endif + }; + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 bands_offset_8000_lpc_warp_7_5ms[61] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60}; +#else +#define bands_offset_8000_lpc_warp_7_5ms NULL +#endif + +#ifdef SUBSET_WB +RAM_ALIGN const Word16 bands_offset_16000_lpc_warp_7_5ms[65] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, + 54, 56, 58, 60, 62, 65, 68, 71, 74, 77, 80, 83, 86, 90, 94, 98, 102, 106, 110, 115, 120}; +#else +#define bands_offset_16000_lpc_warp_7_5ms NULL +#endif + +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 bands_offset_24000_lpc_warp_7_5ms[65] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 52, 55, 58, 61, 64, + 67, 70, 74, 78, 82, 86, 90, 95, 100, 105, 110, 115, 121, 127, 134, 141, 148, 155, 163, 171, 180}; +#else +#define bands_offset_24000_lpc_warp_7_5ms NULL +#endif + +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 bands_offset_32000_lpc_warp_7_5ms[65] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 45, 48, 51, 54, 57, 60, 63, 67, 71, 75, + 79, 84, 89, 94, 99, 105, 111, 117, 124, 131, 138, 146, 154, 163, 172, 182, 192, 203, 215, 227, 240}; +#else +#define bands_offset_32000_lpc_warp_7_5ms NULL +#endif + +#ifdef SUBSET_FB +RAM_ALIGN const Word16 bands_offset_48000_lpc_warp_7_5ms[65] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 43, 46, 49, 52, 55, 59, 63, 67, 71, 75, 80, 85, + 90, 96, 102, 108, 115, 122, 129, 137, 146, 155, 165, 175, 186, 197, 209, 222, 236, 251, 266, 283, 300}; +#else +#define bands_offset_48000_lpc_warp_7_5ms NULL +#endif + +RAM_ALIGN const Word16 *const bands_offset_7_5ms[5] = { + bands_offset_8000_lpc_warp_7_5ms, bands_offset_16000_lpc_warp_7_5ms, bands_offset_24000_lpc_warp_7_5ms, + bands_offset_32000_lpc_warp_7_5ms, bands_offset_48000_lpc_warp_7_5ms}; + +RAM_ALIGN const Word32 inv_odft_twiddle_80_re[M] = { + 0x7ff9af04, 0x7fe6bcb0, 0x7fc72ae2, 0x7f9afcb9, 0x7f62368f, 0x7f1cde01, 0x7ecaf9e5, 0x7e6c9251, + 0x7e01b096, 0x7d8a5f40, 0x7d06aa16, 0x7c769e18, 0x7bda497d, 0x7b31bbb2, 0x7a7d055b, 0x79bc384d}; + +RAM_ALIGN const Word32 inv_odft_twiddle_80_im[M] = { + 0x02835b5a, 0x05067734, 0x07891418, 0x0a0af299, 0x0c8bd35e, 0x0f0b7727, 0x11899ed3, 0x14060b68, + 0x16807e15, 0x18f8b83c, 0x1b6e7b7a, 0x1de189a6, 0x2051a4dd, 0x22be8f87, 0x25280c5e, 0x278dde6e}; + +RAM_ALIGN const Word32 inv_odft_twiddle_60_re[16] = { + 0x7ff4c56f, 0x7fd317b4, 0x7f9afcb9, 0x7f4c7e54, 0x7ee7aa4c, 0x7e6c9251, 0x7ddb4bfc, 0x7d33f0ca, + 0x7c769e18, 0x7ba3751d, 0x7aba9ae6, 0x79bc384d, 0x78a879f4, 0x777f903c, 0x7641af3d, 0x74ef0ebc}; + +RAM_ALIGN const Word32 inv_odft_twiddle_60_im[16] = { + 0x0359c428, 0x06b2f1d2, 0x0a0af299, 0x0d61304e, 0x10b5150f, 0x14060b68, 0x17537e63, 0x1a9cd9ac, + 0x1de189a6, 0x2120fb83, 0x245a9d65, 0x278dde6e, 0x2aba2ee4, 0x2ddf0040, 0x30fbc54d, 0x340ff242}; + +RAM_ALIGN const Word32 inv_odft_twiddle_40_re[16] = { + 0x7fe6bcb0, 0x7f9afcb9, 0x7f1cde01, 0x7e6c9251, 0x7d8a5f40, 0x7c769e18, 0x7b31bbb2, 0x79bc384d, + 0x7816a759, 0x7641af3d, 0x743e0918, 0x720c8075, 0x6fadf2fc, 0x6d23501b, 0x6a6d98a4, 0x678dde6e}; + +RAM_ALIGN const Word32 inv_odft_twiddle_40_im[16] = { + 0x05067734, 0x0a0af299, 0x0f0b7727, 0x14060b68, 0x18f8b83c, 0x1de189a6, 0x22be8f87, 0x278dde6e, + 0x2c4d9050, 0x30fbc54d, 0x3596a46c, 0x3a1c5c57, 0x3e8b240e, 0x42e13ba4, 0x471cece7, 0x4b3c8c12}; + +#ifdef FIX_PLC_CONFORM_ISSUES +RAM_ALIGN const Word32 inv_odft_twiddle_30_re[16] = { + 0x7fd317b4, 0x7f4c7e54, 0x7e6c9251, 0x7d33f0ca, 0x7ba3751d, 0x79bc384d, 0x777f903c, 0x74ef0ebc, + 0x720c8075, 0x6ed9eba1, 0x6b598ea3, 0x678dde6e, 0x637984d4, 0x5f1f5ea1, 0x5a82799a, 0x55a6125c +}; + +RAM_ALIGN const Word32 inv_odft_twiddle_30_im[16] = { + 0x06b2f1d2, 0x0d61304e, 0x14060b68, 0x1a9cd9ac, 0x2120fb83, 0x278dde6e, 0x2ddf0040, 0x340ff242, + 0x3a1c5c57, 0x40000000, 0x45b6bb5e, 0x4b3c8c12, 0x508d9211, 0x55a6125c, 0x5a82799a, 0x5f1f5ea1 +}; +#endif + +RAM_ALIGN const Word32 inv_odft_twiddle_20_re[16] = { + 0x7f9afcb9, 0x7e6c9251, 0x7c769e18, 0x79bc384d, 0x7641af3d, 0x720c8075, 0x6d23501b, 0x678dde6e, + 0x6154fb91, 0x5a82799a, 0x53211d18, 0x4b3c8c12, 0x42e13ba4, 0x3a1c5c57, 0x30fbc54d, 0x278dde6e}; + +RAM_ALIGN const Word32 inv_odft_twiddle_20_im[16] = { + 0x0a0af299, 0x14060b68, 0x1de189a6, 0x278dde6e, 0x30fbc54d, 0x3a1c5c57, 0x42e13ba4, 0x4b3c8c12, + 0x53211d18, 0x5a82799a, 0x6154fb91, 0x678dde6e, 0x6d23501b, 0x720c8075, 0x7641af3d, 0x79bc384d}; + +#ifdef SUBSET_NB +RAM_ALIGN const Word16 resamp_filt_8k[240] = { + 214, 417, -1052, -4529, 26233, -4529, -1052, 417, 214, 0, 212, 277, -1281, -3928, 26037, -4979, + -755, 550, 206, -8, 200, 136, -1439, -3214, 25456, -5243, -401, 668, 187, -18, 180, 0, + -1522, -2427, 24506, -5289, 0, 763, 156, -28, 154, -125, -1534, -1605, 23211, -5090, 432, 831, + 114, -39, 124, -234, -1478, -785, 21609, -4626, 877, 865, 61, -50, 92, -323, -1361, 0, + 19741, -3885, 1317, 861, 0, -61, 60, -391, -1194, 720, 17658, -2863, 1729, 815, -68, -69, + 29, -436, -987, 1351, 15414, -1563, 2093, 727, -140, -76, 0, -457, -752, 1873, 13068, 0, + 2389, 598, -213, -79, -25, -457, -501, 2274, 10677, 1803, 2597, 430, -282, -77, -46, -436, + -247, 2545, 8302, 3815, 2700, 229, -345, -72, -61, -398, 0, 2686, 5997, 5997, 2686, 0, + -398, -61, -72, -345, 229, 2700, 3815, 8302, 2545, -247, -436, -46, -77, -282, 430, 2597, + 1803, 10677, 2274, -501, -457, -25, -79, -213, 598, 2389, 0, 13068, 1873, -752, -457, 0, + -76, -140, 727, 2093, -1563, 15414, 1351, -987, -436, 29, -69, -68, 815, 1729, -2863, 17658, + 720, -1194, -391, 60, -61, 0, 861, 1317, -3885, 19741, 0, -1361, -323, 92, -50, 61, + 865, 877, -4626, 21609, -785, -1478, -234, 124, -39, 114, 831, 432, -5090, 23211, -1605, -1534, + -125, 154, -28, 156, 763, 0, -5289, 24506, -2427, -1522, 0, 180, -18, 187, 668, -401, + -5243, 25456, -3214, -1439, 136, 200, -8, 206, 550, -755, -4979, 26037, -3928, -1281, 277, 212}; +#else +#define resamp_filt_8k NULL +#endif + +#ifdef SUBSET_WB +RAM_ALIGN const Word16 resamp_filt_16k[240] = { + -61, 214, -398, 417, 0, -1052, 2686, -4529, 5997, 26233, 5997, -4529, 2686, -1052, 0, 417, + -398, 214, -61, 0, -72, 212, -345, 277, 229, -1281, 2700, -3928, 3815, 26037, 8302, -4979, + 2545, -755, -247, 550, -436, 206, -46, -8, -77, 200, -282, 136, 430, -1439, 2597, -3214, + 1803, 25456, 10677, -5243, 2274, -401, -501, 668, -457, 187, -25, -18, -79, 180, -213, 0, + 598, -1522, 2389, -2427, 0, 24506, 13068, -5289, 1873, 0, -752, 763, -457, 156, 0, -28, + -76, 154, -140, -125, 727, -1534, 2093, -1605, -1563, 23211, 15414, -5090, 1351, 432, -987, 831, + -436, 114, 29, -39, -69, 124, -68, -234, 815, -1478, 1729, -785, -2863, 21609, 17658, -4626, + 720, 877, -1194, 865, -391, 61, 60, -50, -61, 92, 0, -323, 861, -1361, 1317, 0, + -3885, 19741, 19741, -3885, 0, 1317, -1361, 861, -323, 0, 92, -61, -50, 60, 61, -391, + 865, -1194, 877, 720, -4626, 17658, 21609, -2863, -785, 1729, -1478, 815, -234, -68, 124, -69, + -39, 29, 114, -436, 831, -987, 432, 1351, -5090, 15414, 23211, -1563, -1605, 2093, -1534, 727, + -125, -140, 154, -76, -28, 0, 156, -457, 763, -752, 0, 1873, -5289, 13068, 24506, 0, + -2427, 2389, -1522, 598, 0, -213, 180, -79, -18, -25, 187, -457, 668, -501, -401, 2274, + -5243, 10677, 25456, 1803, -3214, 2597, -1439, 430, 136, -282, 200, -77, -8, -46, 206, -436, + 550, -247, -755, 2545, -4979, 8302, 26037, 3815, -3928, 2700, -1281, 229, 277, -345, 212, -72}; +#else +#define resamp_filt_16k NULL +#endif + +#ifdef SUBSET_SSWB +RAM_ALIGN const Word16 resamp_filt_24k[240] = { + -50, 19, 143, -93, -290, 278, 485, -658, -701, 1396, 901, -3019, -1042, 10276, 17488, 10276, + -1042, -3019, 901, 1396, -701, -658, 485, 278, -290, -93, 143, 19, -50, 0, -46, 0, + 141, -45, -305, 185, 543, -501, -854, 1153, 1249, -2619, -1908, 8712, 17358, 11772, 0, -3319, + 480, 1593, -504, -796, 399, 367, -261, -142, 138, 40, -52, -5, -41, -17, 133, 0, + -304, 91, 574, -334, -959, 878, 1516, -2143, -2590, 7118, 16971, 13161, 1202, -3495, 0, 1731, + -267, -908, 287, 445, -215, -188, 125, 62, -52, -12, -34, -30, 120, 41, -291, 0, + 577, -164, -1015, 585, 1697, -1618, -3084, 5534, 16337, 14406, 2544, -3526, -523, 1800, 0, -985, + 152, 509, -156, -230, 104, 83, -48, -19, -26, -41, 103, 76, -265, -83, 554, 0, + -1023, 288, 1791, -1070, -3393, 3998, 15474, 15474, 3998, -3393, -1070, 1791, 288, -1023, 0, 554, + -83, -265, 76, 103, -41, -26, -19, -48, 83, 104, -230, -156, 509, 152, -985, 0, + 1800, -523, -3526, 2544, 14406, 16337, 5534, -3084, -1618, 1697, 585, -1015, -164, 577, 0, -291, + 41, 120, -30, -34, -12, -52, 62, 125, -188, -215, 445, 287, -908, -267, 1731, 0, + -3495, 1202, 13161, 16971, 7118, -2590, -2143, 1516, 878, -959, -334, 574, 91, -304, 0, 133, + -17, -41, -5, -52, 40, 138, -142, -261, 367, 399, -796, -504, 1593, 480, -3319, 0, + 11772, 17358, 8712, -1908, -2619, 1249, 1153, -854, -501, 543, 185, -305, -45, 141, 0, -46}; +#else +#define resamp_filt_24k NULL +#endif + +#ifdef SUBSET_SWB +RAM_ALIGN const Word16 resamp_filt_32k[240] = { + -30, -31, 46, 107, 0, -199, -162, 209, 430, 0, -681, -526, 658, 1343, 0, -2264, + -1943, 2999, 9871, 13116, 9871, 2999, -1943, -2264, 0, 1343, 658, -526, -681, 0, 430, 209, + -162, -199, 0, 107, 46, -31, -30, 0, -25, -36, 30, 106, 31, -173, -195, 139, + 432, 114, -597, -641, 439, 1350, 360, -1964, -2313, 1908, 8829, 13019, 10804, 4151, -1431, -2489, + -393, 1273, 864, -378, -739, -123, 408, 275, -117, -218, -34, 103, 62, -23, -35, -4, + -20, -39, 14, 100, 57, -141, -218, 68, 416, 215, -494, -719, 216, 1298, 676, -1607, + -2545, 902, 7707, 12728, 11606, 5339, -781, -2621, -803, 1137, 1047, -200, -767, -251, 364, 334, + -62, -228, -70, 94, 77, -13, -38, -9, -14, -39, 0, 90, 78, -106, -229, 0, + 382, 299, -376, -761, 0, 1194, 937, -1214, -2644, 0, 6534, 12253, 12253, 6534, 0, -2644, + -1214, 937, 1194, 0, -761, -376, 299, 382, 0, -229, -106, 78, 90, 0, -39, -14, + -9, -38, -13, 77, 94, -70, -228, -62, 334, 364, -251, -767, -200, 1047, 1137, -803, + -2621, -781, 5339, 11606, 12728, 7707, 902, -2545, -1607, 676, 1298, 216, -719, -494, 215, 416, + 68, -218, -141, 57, 100, 14, -39, -20, -4, -35, -23, 62, 103, -34, -218, -117, + 275, 408, -123, -739, -378, 864, 1273, -393, -2489, -1431, 4151, 10804, 13019, 8829, 1908, -2313, + -1964, 360, 1350, 439, -641, -597, 114, 432, 139, -195, -173, 31, 106, 30, -36, -25}; +#else +#define resamp_filt_32k NULL +#endif + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 resamp_filt_96k[240] = { + -3, -7, -10, -13, -13, -10, -4, 5, 15, 26, 33, 36, 31, 19, 0, -23, -47, -66, -76, + -73, -54, -21, 23, 70, 111, 139, 143, 121, 72, 0, -84, -165, -227, -256, -240, -175, -67, 72, + 219, 349, 433, 448, 379, 225, 0, -268, -536, -755, -874, -848, -648, -260, 301, 1000, 1780, 2569, 3290, + 3869, 4243, 4372, 4243, 3869, 3290, 2569, 1780, 1000, 301, -260, -648, -848, -874, -755, -536, -268, 0, 225, + 379, 448, 433, 349, 219, 72, -67, -175, -240, -256, -227, -165, -84, 0, 72, 121, 143, 139, 111, + 70, 23, -21, -54, -73, -76, -66, -47, -23, 0, 19, 31, 36, 33, 26, 15, 5, -4, -10, + -13, -13, -10, -7, -3, 0, -1, -5, -8, -12, -13, -12, -8, 0, 10, 21, 30, 35, 34, + 26, 10, -11, -35, -58, -73, -76, -65, -39, 0, 46, 92, 127, 144, 136, 100, 38, -41, -125, + -199, -246, -254, -214, -126, 0, 146, 288, 398, 450, 424, 312, 120, -131, -405, -655, -830, -881, -771, + -477, 0, 636, 1384, 2178, 2943, 3601, 4084, 4340, 4340, 4084, 3601, 2943, 2178, 1384, 636, 0, -477, -771, + -881, -830, -655, -405, -131, 120, 312, 424, 450, 398, 288, 146, 0, -126, -214, -254, -246, -199, -125, + -41, 38, 100, 136, 144, 127, 92, 46, 0, -39, -65, -76, -73, -58, -35, -11, 10, 26, 34, + 35, 30, 21, 10, 0, -8, -12, -13, -12, -8, -5, -1}; +#else +#define resamp_filt_96k NULL +#endif + +#ifdef SUBSET_FB +RAM_ALIGN const Word16 resamp_filt_48k[240] = { + -13, -25, -20, 10, 51, 71, 38, -47, -133, -145, -42, 139, 277, 242, 0, -329, + -511, -351, 144, 698, 895, 450, -535, -1510, -1697, -521, 1999, 5138, 7737, 8744, 7737, 5138, + 1999, -521, -1697, -1510, -535, 450, 895, 698, 144, -351, -511, -329, 0, 242, 277, 139, + -42, -145, -133, -47, 38, 71, 51, 10, -20, -25, -13, 0, -9, -23, -24, 0, + 41, 71, 52, -23, -115, -152, -78, 92, 254, 272, 76, -251, -493, -427, 0, 576, + 900, 624, -262, -1309, -1763, -954, 1272, 4356, 7203, 8679, 8169, 5886, 2767, 0, -1542, -1660, + -809, 240, 848, 796, 292, -252, -507, -398, -82, 199, 288, 183, 0, -130, -145, -71, + 20, 69, 60, 20, -15, -26, -17, -3, -6, -20, -26, -8, 31, 67, 62, 0, + -94, -152, -108, 45, 223, 287, 143, -167, -454, -480, -134, 439, 866, 758, 0, -1071, + -1748, -1295, 601, 3559, 6580, 8485, 8485, 6580, 3559, 601, -1295, -1748, -1071, 0, 758, 866, + 439, -134, -480, -454, -167, 143, 287, 223, 45, -108, -152, -94, 0, 62, 67, 31, + -8, -26, -20, -6, -3, -17, -26, -15, 20, 60, 69, 20, -71, -145, -130, 0, + 183, 288, 199, -82, -398, -507, -252, 292, 796, 848, 240, -809, -1660, -1542, 0, 2767, + 5886, 8169, 8679, 7203, 4356, 1272, -954, -1763, -1309, -262, 624, 900, 576, 0, -427, -493, + -251, 76, 272, 254, 92, -78, -152, -115, -23, 52, 71, 41, 0, -24, -23, -9}; +#else +#define resamp_filt_48k NULL +#endif + + +RAM_ALIGN const Word16 *const resamp_filts[NUM_SAMP_FREQ] = {resamp_filt_8k, + resamp_filt_16k, + resamp_filt_24k, + resamp_filt_32k, + resamp_filt_48k, + resamp_filt_96k +}; + +RAM_ALIGN const Word16 resamp_params[NUM_SAMP_FREQ][4] = { +#ifdef SUBSET_NB + {24, 5, 0, 15}, +#else + {0}, +#endif +#ifdef SUBSET_WB + {12, 10, 1, 3}, +#else + {0}, +#endif +#ifdef SUBSET_SSWB + {8, 15, 1, 7}, +#else + {0}, +#endif +#ifdef SUBSET_SWB + {6, 20, 2, 3}, +#else + {0}, +#endif +#ifdef SUBSET_FB + {4, 30, 3, 3}, +#else + {0}, +#endif +#ifdef ENABLE_HR_MODE + {2, 60, 7, 1}, +#endif +}; + +RAM_ALIGN const Word16 highpass50_filt_num[3] = {32204, -32204, 32204}; +RAM_ALIGN const Word16 highpass50_filt_den[2] = {32199, -31650}; + +RAM_ALIGN const Word16 olpa_ac_weighting[98] = { + 32767, 32598, 32429, 32260, 32091, 31922, 31754, 31585, 31416, 31247, 31078, 30909, 30740, 30571, + 30402, 30233, 30065, 29896, 29727, 29558, 29389, 29220, 29051, 28882, 28713, 28544, 28376, 28207, + 28038, 27869, 27700, 27531, 27362, 27193, 27024, 26855, 26687, 26518, 26349, 26180, 26011, 25842, + 25673, 25504, 25335, 25166, 24998, 24829, 24660, 24491, 24322, 24153, 23984, 23815, 23646, 23477, + 23308, 23140, 22971, 22802, 22633, 22464, 22295, 22126, 21957, 21788, 21619, 21451, 21282, 21113, + 20944, 20775, 20606, 20437, 20268, 20099, 19930, 19762, 19593, 19424, 19255, 19086, 18917, 18748, + 18579, 18410, 18241, 18073, 17904, 17735, 17566, 17397, 17228, 17059, 16890, 16721, 16552, 16384}; + +RAM_ALIGN const Word16 ltpf_ac_interp_filt[7][9] = { + {90, 151, -2472, 26787, 10819, -3468, 940, -94, 0}, {-98, 967, -4270, 19769, 19769, -4270, 967, -98, 0}, + {-94, 940, -3468, 10819, 26787, -2472, 151, 90, 0}, {0, 503, -1550, 2739, 29447, 2739, -1550, 503, 0}, + {0, 90, 151, -2472, 26787, 10819, -3468, 940, -94}, {0, -98, 967, -4270, 19769, 19769, -4270, 967, -98}, + {0, -94, 940, -3468, 10819, 26787, -2472, 151, 90}}; + +RAM_ALIGN const Word16 inter_filter[5][4][12] = { + {{6877, 19121, 6877, 0}, {3506, 18025, 11000, 220}, {1300, 15048, 15048, 1300}, {220, 11000, 18025, 3506}}, + {{6877, 19121, 6877, 0}, {3506, 18025, 11000, 220}, {1300, 15048, 15048, 1300}, {220, 11000, 18025, 3506}}, + {{2072, 8216, 12170, 8216, 2072, 0}, + {1134, 6509, 11883, 9787, 3320, 140}, + {503, 4831, 11057, 11057, 4831, 503}, + {140, 3320, 9787, 11883, 6509, 1134}}, + {{950, 3702, 7248, 8926, 7248, 3702, 950, 0}, + {558, 2858, 6427, 8812, 7946, 4606, 1466, 102}, + {281, 2106, 5530, 8479, 8479, 5530, 2106, 281}, + {102, 1466, 4606, 7946, 8812, 6427, 2858, 558}}, + {{355, 1183, 2515, 4068, 5333, 5822, 5333, 4068, 2515, 1183, 355, 0}, + {231, 924, 2145, 3685, 5074, 5791, 5543, 4433, 2900, 1474, 510, 67}, + {136, 700, 1797, 3293, 4771, 5697, 5697, 4771, 3293, 1797, 700, 136}, + {67, 510, 1474, 2900, 4433, 5543, 5791, 5074, 3685, 2145, 924, 231}}}; +RAM_ALIGN const Word16 inter_filter_shift[5] = {1, 1, 2, 3, 5}; +RAM_ALIGN const Word16 inter_filter_len[5] = {4, 4, 6, 8, 12}; + +RAM_ALIGN const Word16 tilt_filter[5][4][11] = { + {{16777, 11692, -525}, {16697, 11692, -444}, {16622, 11692, -369}, {16551, 11692, -298}}, + {{16777, 11692, -525}, {16697, 11692, -444}, {16622, 11692, -369}, {16551, 11692, -298}}, + {{11112, 14323, 2797, -356, -44}, + {10998, 14271, 2906, -304, -38}, + {10890, 14222, 3008, -255, -32}, + {10788, 14175, 3104, -208, -26}}, + {{8307, 12959, 5866, 1049, -283, -71, -9}, + {8199, 12866, 5931, 1133, -242, -61, -8}, + {8098, 12777, 5992, 1212, -203, -51, -6}, + {8002, 12693, 6050, 1287, -166, -42, -5}}, + {{5519, 9817, 7001, 3967, 1589, 259, -201, -88, -31, -8, -1}, + {5433, 9706, 6991, 4014, 1651, 309, -172, -76, -27, -7, -1}, + {5353, 9601, 6981, 4058, 1710, 356, -145, -64, -23, -6, -1}, + {5277, 9501, 6970, 4100, 1767, 402, -118, -52, -19, -5, -1}}}; +RAM_ALIGN const Word16 tilt_filter_len[5] = {2, 2, 4, 6, 10}; + +RAM_ALIGN const Word16 gain_scale_fac[4] = {13108, 11468, 9832, 8192}; + +RAM_ALIGN const UWord16 pitch_scale[NUM_SAMP_FREQ] = {5120, + 10240, + 15360, + 20480, + 30720 +}; + +RAM_ALIGN const Word16 ltpf_overlap_len[NUM_SAMP_FREQ] = {20, 40, 60, 80, 120 +}; + +/* set up of SNS VQ stages 1 ( split VQ) and SNS stage 2(Transformed PVQ) for bit rate 38 bits */ + +/* trained gain set for DCT Q12 */ +RAM_ALIGN const Word16 sns_vq_reg_adj_gains[2] = {8915, 12054}; +RAM_ALIGN const Word16 sns_vq_reg_lf_adj_gains[4] = {6245, 15043, 17861, 21014}; +RAM_ALIGN const Word16 sns_vq_near_adj_gains[4] = {7099, 9132, 11253, 14808}; +RAM_ALIGN const Word16 sns_vq_far_adj_gains[8] = {4336, 5067, 5895, 8149, 10235, 12825, 16868, 19882}; + +RAM_ALIGN const Word16 *const sns_gaintabPtr[4] = {sns_vq_reg_adj_gains, sns_vq_reg_lf_adj_gains, sns_vq_near_adj_gains, + sns_vq_far_adj_gains}; +RAM_ALIGN const Word16 sns_gainSz[4] = {2, 4, 4, 8}; +RAM_ALIGN const Word16 sns_gainMSBbits[4] = {1, 1, 2, 2}; +RAM_ALIGN const Word16 sns_gainLSBbits[4] = {0, 1, 0, 1}; +RAM_ALIGN const Word16 sns_Kval[4][2] = {{10, 1}, {10, 0}, {8, 0}, {6, 0}}; +RAM_ALIGN const UWord32 sns_MPVQ_Sz[4][2] = { + {4780008U >> 1, (2U * 6U)}, {4780008U >> 1, (2U)}, {30316544U >> 1, 0U}, {MPVQ_SZ_OUTL_FAR, 0U}}; + +#ifdef NEW_SIGNALLING_SCHEME_1p25 +RAM_ALIGN const Word16 lrsns_ltp_bits_fx[8] = { + 2, /*00(x=0) , ltp=0 ltpf=0 x is next param */ + 2, /*00(x=1) x is next param */ + 3 + 4, /*010 ltp=1 ltpf=0, phaseA or PhaseB(phaseB with reduced resolution) */ + 3 + 4, /*011 ltp=1 ltpf=0, PhaseB(phaseB with reduced resolution) */ + 2 + 4, /*10(x=0) ltp=1 ltpf=1, phase A, +extra bit */ + 2 + 4, /*10(x=1) */ + 2 + 5, /*11(x=0) ltp=1 ltpf=1, phase B , +extra bit */ + 2 + 5 /*11(x=1) */ +}; +#endif + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word32 st1SCF0_7_base5_32x8_Q27[256] = { + 303712392, 109160791, -71161366, -182086260, -214684177, -193406093, -153520450, -101361734, 395293327, + 323657083, 128910102, -59488852, -164971858, -208829415, -200908713, -149907762, -293414324, -264613117, + -239872071, -257518046, -240785425, -182185002, -94683128, -6417929, 93105259, 128259784, 77206169, + -15381811, -86711449, -127822437, -144156883, -101748810, -174150364, -99370653, -46355110, -42048494, + -54086690, -49931794, -10514807, 13025043, 122762518, 233932163, 256230537, 207243559, 146760322, + 86903234, 4855873, -39875122, -337462040, -388124479, -269040331, -100785739, 59217144, 161317613, + 178164447, 163811504, -123774032, 84892061, 145943568, 81688751, 17605952, -39748467, -27784884, + 18109316, 106075262, 84342590, 52763395, 64425544, 60104730, 28150050, 881397, -11559399, + 194314494, 365609026, 310154713, 125500457, -36875504, -121074819, -126256135, -85053377, 106482242, + 1931812, -76213503, -87880462, -64351897, -23339746, 9128989, 39611134, 365643112, 397214108, + 248240465, 75602822, 18779354, 48270210, 92537937, 85871184, -71246823, -28546860, 773918, + 57025285, 63502293, 115278828, 159868294, 133706314, 226463440, 326973859, 312753384, 238885783, + 193825560, 204004473, 197567682, 131222320, -396188282, -213934330, -14753048, 52158227, 68844655, + 84303846, 110410429, 117560157, 13673880, 79169310, 83087169, 170095890, 324754621, 302223766, + 70670604, -53229612, 360045196, 178157942, 17473172, -45437142, -49421549, -25728189, -20774539, + -31434755, 647866186, 418689256, 187252080, 33594069, -52829955, -86363494, -86244384, -97065351, + 11789953, -76448652, -153687373, -224101311, -247677903, -210007831, -149983961, -71669806, 186699958, + 265947702, 149338424, -29542330, -104014124, -79733903, 18379464, 109822702, 51618245, -21553862, + -72392588, -71042662, 25559558, 343681831, 378354941, 88136873, 259345425, 404035869, 411436250, + 335692175, 259160465, 76793185, -108950139, -157896166, 23498902, -100733469, -139511132, -152441152, + -139852059, -2040916, 277895647, 460298246, -159473505, 49230106, 175768625, 225929624, 167907618, + 126483532, 110897463, 59049457, 340003306, 283568025, 169501437, 102208613, 70077483, 15928969, + -60712963, -93999711, 536723054, 547476463, 378877401, 231669479, 86858248, -44446002, -118654185, + -151259810, 68169532, 213189358, 232061142, 135146824, 50616355, 63937402, 145968142, 145970189, + 425278032, 437353108, 325116396, 240848448, 204249734, 157298757, 65685431, -8359023, 254228196, + 167918047, 79249020, 81652507, 117866118, 150206430, 136711039, 83275912, 127356599, 286205131, + 365535742, 371764419, 341298198, 271181905, 111406869, -3698627, -252365241, -169692913, 41798753, + 246517983, 302841086, 274903406, 294643934, 272005129, 33067993, 128261383, 204073729, 265277850, + 260441270, 299809987, 266873132, 170768802 }; +RAM_ALIGN const Word32 st1SCF8_15_base5_32x8_Q27[256] = { + 31142327, -135412629, -287525918, -318812488, -299361815, -292052248, -307447065, -339955249, -173817241, + -241497912, -253273077, -242922894, -236679593, -246180047, -242237472, -233108740, 18694612, -34653021, + -87349511, -143365648, -217337078, -293618146, -354009441, -399831591, -42481669, -64122205, -73975722, + -65067182, -31995949, -19196424, 9169576, 11852254, 118046962, 40042530, -122861082, -296146014, + -367947407, -384049364, -387676629, -396187390, -39822658, -130862945, -182344850, -132032812, -87638397, + -132873805, -216717640, -323078583, 45765709, 36091119, 7560964, 6698995, -12806126, -102027773, + -312402661, -506209524, -189555374, -199343014, -159187030, -83886299, 20656444, 77361286, 106715523, + 80069550, -30714319, -44791015, -108625274, -219563932, -252982160, -220783722, -188597085, -196852406, + -143812455, -190276467, -207892204, -195013074, -138489838, -92696486, -57558441, -66432436, -79321135, + -9552782, 46401689, 40339066, -150142954, -327610913, -299110559, -254354980, -113874897, -78279377, + 12085282, 113417337, 143039033, 98996714, 34438988, -66030204, 153101016, 129388157, 51198856, + -64806941, -243783312, -376184794, -434040973, -464270818, -50503881, 5713319, 69329858, 33784868, + -29015184, -71682211, -86004854, -116735202, 89255342, 147358670, 185680385, 180291129, 110458350, + 28974493, -54348215, -143647337, -110899539, -90084420, -30668159, 69656431, 183505023, 292625568, + 340370914, 295441538, 189258173, 101259479, -175222029, -251166616, -166441640, -170071209, -273362338, + -388808843, 48504518, -2952679, -77761569, -118034823, -114177011, -104608901, -98271929, -119232119, + 58716127, 40995519, -991583, -66524997, -108266901, -164325304, -228381893, -301307946, 86986552, + 91576640, 33990299, 9876306, 42173453, 31504911, 19407902, -9155262, 150216257, 165712633, + 79077091, -184136602, -318224471, -269482063, -223725572, -258546087, 19038449, -14852543, -37960074, + -885587, 38376778, 6179995, -80879122, -304095400, 67652037, 110995667, 150298671, 158261551, + 144938274, 93621729, -122480229, -480076341, -67253289, -43711762, 3768810, 35172367, 48397679, + 85311972, 128716474, 175483179, 503277534, 204470792, -61433556, -107201177, -51918012, -50452587, + -88293374, -172018761, -154697999, -148714432, -75512923, -29603347, -46955117, -101124035, -132687189, + -172859645, 138012394, 147331497, 103165859, 27659855, -46010607, -101326252, -139849742, -201777098, + 17291535, 92534989, 150789463, 175737342, 181881080, 191007103, 155298567, 54535272, 179896088, + 186558381, 140214471, 85338684, -36874140, -207934631, -327812990, -405951728, 287015358, 570037814, + 388874539, 125188990, -39301937, -108770623, -105880084, -125540975, 75810265, 213654461, 321816127, + 407615675, 357588710, 186971315, 54201685, -88083199, -56701695, 43775062, 186792575, 299502316, + 350549113, 357744389, 322261535, 236116337 }; +#endif + +#ifdef CR9_C_ADD_1p25MS_LRSNS +RAM_ALIGN const Word16 st1SCF0_7_base5_32x8_Q11[32 * 8 * 2] = +#else +RAM_ALIGN const Word16 st1SCF0_7_base5_32x8_Q11[256] = +#endif +{ + 4634, 1666, -1086, -2778, -3276, -2951, -2343, -1547, 6032, 4939, 1967, -908, -2517, -3186, -3066, -2287, + -4477, -4038, -3660, -3929, -3674, -2780, -1445, -98, 1421, 1957, 1178, -235, -1323, -1950, -2200, -1553, + -2657, -1516, -707, -642, -825, -762, -160, 199, 1873, 3570, 3910, 3162, 2239, 1326, 74, -608, + -5149, -5922, -4105, -1538, 904, 2462, 2719, 2500, -1889, 1295, 2227, 1246, 269, -607, -424, 276, + 1619, 1287, 805, 983, 917, 430, 13, -176, 2965, 5579, 4733, 1915, -563, -1847, -1927, -1298, + 1625, 29, -1163, -1341, -982, -356, 139, 604, 5579, 6061, 3788, 1154, 287, 737, 1412, 1310, + -1087, -436, 12, 870, 969, 1759, 2439, 2040, 3456, 4989, 4772, 3645, 2958, 3113, 3015, 2002, + -6045, -3264, -225, 796, 1050, 1286, 1685, 1794, 209, 1208, 1268, 2595, 4955, 4612, 1078, -812, + 5494, 2718, 267, -693, -754, -393, -317, -480, 9886, 6389, 2857, 513, -806, -1318, -1316, -1481, + 180, -1167, -2345, -3420, -3779, -3204, -2289, -1094, 2849, 4058, 2279, -451, -1587, -1217, 280, 1676, + 788, -329, -1105, -1084, 390, 5244, 5773, 1345, 3957, 6165, 6278, 5122, 3954, 1172, -1662, -2409, + 359, -1537, -2129, -2326, -2134, -31, 4240, 7024, -2433, 751, 2682, 3447, 2562, 1930, 1692, 901, + 5188, 4327, 2586, 1560, 1069, 243, -926, -1434, 8190, 8354, 5781, 3535, 1325, -678, -1811, -2308, + 1040, 3253, 3541, 2062, 772, 976, 2227, 2227, 6489, 6673, 4961, 3675, 3117, 2400, 1002, -128, + 3879, 2562, 1209, 1246, 1798, 2292, 2086, 1271, 1943, 4367, 5578, 5673, 5208, 4138, 1700, -56, + -3851, -2589, 638, 3762, 4621, 4195, 4496, 4150, 505, 1957, 3114, 4048, 3974, 4575, 4072, 2606 + #ifdef CR9_C_ADD_1p25MS_LRSNS + /* negated part */ + , -4634, -1666, 1086, 2778, 3276, 2951, 2343, 1547, + -6032, -4939, -1967, 908, 2517, 3186, 3066, 2287, + 4477, 4038, 3660, 3929, 3674, 2780, 1445, 98, + -1421, -1957, -1178, 235, 1323, 1950, 2200, 1553, + 2657, 1516, 707, 642, 825, 762, 160, -199, + -1873, -3570, -3910, -3162, -2239, -1326, -74, 608, + 5149, 5922, 4105, 1538, -904, -2462, -2719, -2500, + 1889, -1295, -2227, -1246, -269, 607, 424, -276, + -1619, -1287, -805, -983, -917, -430, -13, 176, + -2965, -5579, -4733, -1915, 563, 1847, 1927, 1298, + -1625, -29, 1163, 1341, 982, 356, -139, -604, + -5579, -6061, -3788, -1154, -287, -737, -1412, -1310, + 1087, 436, -12, -870, -969, -1759, -2439, -2040, + -3456, -4989, -4772, -3645, -2958, -3113, -3015, -2002, + 6045, 3264, 225, -796, -1050, -1286, -1685, -1794, + -209, -1208, -1268, -2595, -4955, -4612, -1078, 812, + -5494, -2718, -267, 693, 754, 393, 317, 480, + -9886, -6389, -2857, -513, 806, 1318, 1316, 1481, + -180, 1167, 2345, 3420, 3779, 3204, 2289, 1094, + -2849, -4058, -2279, 451, 1587, 1217, -280, -1676, + -788, 329, 1105, 1084, -390, -5244, -5773, -1345, + -3957, -6165, -6278, -5122, -3954, -1172, 1662, 2409, + -359, 1537, 2129, 2326, 2134, 31, -4240, -7024, + 2433, -751, -2682, -3447, -2562, -1930, -1692, -901, + -5188, -4327, -2586, -1560, -1069, -243, 926, 1434, + -8190, -8354, -5781, -3535, -1325, 678, 1811, 2308, + -1040, -3253, -3541, -2062, -772, -976, -2227, -2227, + -6489, -6673, -4961, -3675, -3117, -2400, -1002, 128, + -3879, -2562, -1209, -1246, -1798, -2292, -2086, -1271, + -1943, -4367, -5578, -5673, -5208, -4138, -1700, 56, + 3851, 2589, -638, -3762, -4621, -4195, -4496, -4150, + -505, -1957, -3114, -4048, -3974, -4575, -4072, -2606 +#endif +}; + +#ifdef CR9_C_ADD_1p25MS_LRSNS +RAM_ALIGN const Word16 st1SCF8_15_base5_32x8_Q11[8 * 32 * 2] = +#else +RAM_ALIGN const Word16 st1SCF8_15_base5_32x8_Q11[256] = +#endif +{ + 475, -2066, -4387, -4865, -4568, -4456, -4691, -5187, -2652, -3685, -3865, -3707, -3611, -3756, -3696, -3557, + 285, -529, -1333, -2188, -3316, -4480, -5402, -6101, -648, -978, -1129, -993, -488, -293, 140, 181, + 1801, 611, -1875, -4519, -5614, -5860, -5915, -6045, -608, -1997, -2782, -2015, -1337, -2027, -3307, -4930, + 698, 551, 115, 102, -195, -1557, -4767, -7724, -2892, -3042, -2429, -1280, 315, 1180, 1628, 1222, + -469, -683, -1657, -3350, -3860, -3369, -2878, -3004, -2194, -2903, -3172, -2976, -2113, -1414, -878, -1014, + -1210, -146, 708, 616, -2291, -4999, -4564, -3881, -1738, -1194, 184, 1731, 2183, 1511, 525, -1008, + 2336, 1974, 781, -989, -3720, -5740, -6623, -7084, -771, 87, 1058, 516, -443, -1094, -1312, -1781, + 1362, 2249, 2833, 2751, 1685, 442, -829, -2192, -1692, -1375, -468, 1063, 2800, 4465, 5194, 4508, + 2888, 1545, -2674, -3832, -2540, -2595, -4171, -5933, 740, -45, -1187, -1801, -1742, -1596, -1500, -1819, + 896, 626, -15, -1015, -1652, -2507, -3485, -4598, 1327, 1397, 519, 151, 644, 481, 296, -140, + 2292, 2529, 1207, -2810, -4856, -4112, -3414, -3945, 291, -227, -579, -14, 586, 94, -1234, -4640, + 1032, 1694, 2293, 2415, 2212, 1429, -1869, -7325, -1026, -667, 58, 537, 738, 1302, 1964, 2678, + 7679, 3120, -937, -1636, -792, -770, -1347, -2625, -2361, -2269, -1152, -452, -716, -1543, -2025, -2638, + 2106, 2248, 1574, 422, -702, -1546, -2134, -3079, 264, 1412, 2301, 2682, 2775, 2915, 2370, 832, + 2745, 2847, 2140, 1302, -563, -3173, -5002, -6194, 4380, 8698, 5934, 1910, -600, -1660, -1616, -1916, + 1157, 3260, 4911, 6220, 5456, 2853, 827, -1344, -865, 668, 2850, 4570, 5349, 5459, 4917, 3603 + #ifdef CR9_C_ADD_1p25MS_LRSNS + /* negated part */ + , -475, 2066, 4387, 4865, 4568, 4456, 4691, 5187, + 2652, 3685, 3865, 3707, 3611, 3756, 3696, 3557, + -285, 529, 1333, 2188, 3316, 4480, 5402, 6101, + 648, 978, 1129, 993, 488, 293, -140, -181, + -1801, -611, 1875, 4519, 5614, 5860, 5915, 6045, + 608, 1997, 2782, 2015, 1337, 2027, 3307, 4930, + -698, -551, -115, -102, 195, 1557, 4767, 7724, + 2892, 3042, 2429, 1280, -315, -1180, -1628, -1222, + 469, 683, 1657, 3350, 3860, 3369, 2878, 3004, + 2194, 2903, 3172, 2976, 2113, 1414, 878, 1014, + 1210, 146, -708, -616, 2291, 4999, 4564, 3881, + 1738, 1194, -184, -1731, -2183, -1511, -525, 1008, + -2336, -1974, -781, 989, 3720, 5740, 6623, 7084, + 771, -87, -1058, -516, 443, 1094, 1312, 1781, + -1362, -2249, -2833, -2751, -1685, -442, 829, 2192, + 1692, 1375, 468, -1063, -2800, -4465, -5194, -4508, + -2888, -1545, 2674, 3832, 2540, 2595, 4171, 5933, + -740, 45, 1187, 1801, 1742, 1596, 1500, 1819, + -896, -626, 15, 1015, 1652, 2507, 3485, 4598, + -1327, -1397, -519, -151, -644, -481, -296, 140, + -2292, -2529, -1207, 2810, 4856, 4112, 3414, 3945, + -291, 227, 579, 14, -586, -94, 1234, 4640, + -1032, -1694, -2293, -2415, -2212, -1429, 1869, 7325, + 1026, 667, -58, -537, -738, -1302, -1964, -2678, + -7679, -3120, 937, 1636, 792, 770, 1347, 2625, + 2361, 2269, 1152, 452, 716, 1543, 2025, 2638, + -2106, -2248, -1574, -422, 702, 1546, 2134, 3079, + -264, -1412, -2301, -2682, -2775, -2915, -2370, -832, + -2745, -2847, -2140, -1302, 563, 3173, 5002, 6194, + -4380, -8698, -5934, -1910, 600, 1660, 1616, 1916, + -1157, -3260, -4911, -6220, -5456, -2853, -827, 1344, + 865, -668, -2850, -4570, -5349, -5459, -4917, -3603 + #endif +}; + +/* tables for MPVQ pulse enumeration */ + +/* N=16, K=12 31.74 bits */ +RAM_ALIGN const UWord32 h_memN16K12[12 + 2] = { + 0U, 1U, 31U, 481U, 4991U, 39041U, 246047U, + 1303777U, 5984767U, 24331777U, 89129247U, 298199265U, 921406335U, /*U*/ 1326824512U}; + +/*N=16,K=8,h_memN16K8={0U,1U,31U,481U,4991U,39041U,246047U,1303777U,5984767U, 12165888U,}; */ + +/*N=10, K=20 +UWord32 h_memN10K20[20+2] = +{ + 0U,1U,19U,181U,1159U,5641U,22363U,75517U,224143U,598417U,1462563U, + 3317445U,7059735U,14218905U,27298155U,50250765U,89129247U,152951073U,254831667U,413442773U,654862247U, + 507444884U +}; +*/ +/*N=10, K=22 31.84 bits */ +RAM_ALIGN const UWord32 h_memN10K22[22 + 2] = {0U, + 1U, + 19U, + 181U, + 1159U, + 5641U, + 22363U, + 75517U, + 224143U, + 598417U, + 1462563U, + 3317445U, + 7059735U, + 14218905U, + 27298155U, + 50250765U, + 89129247U, + 152951073U, + 254831667U, + 413442773U, + 654862247U, + 1014889769U, + 1541911931U, + /*U*/ 1150204814U}; +/* N=10,K=10,h_memN10K10={0U,1U,19U,181U,1159U,5641U,22363U,75517U,224143U,598417U,1462563U,1658722U,}; */ + +/* N=6,K=2,*/ +RAM_ALIGN const UWord32 h_memN6K2[2 + 2] = {0U, 1U, 11U, /*U*/ 30U}; +/*N=6,K=1, h_memN6K1={0U,1U, 5U,}; */ + +#ifdef CR9_C_ADD_1p25MS_LRSNS +RAM_ALIGN const UWord32 h_memN5K8[8 + 2] = { 0U, 1U, 9U, 41U, 129U, 321U, 681U, 1289U, 2241U, /*U*/ 1824U }; +RAM_ALIGN const UWord32 h_memN8K2[2 + 2] = { 0U, 1U, 15U, /*U*/ 56U }; +RAM_ALIGN const UWord32 h_memN15K5[5 + 2] = { 0U, 1U, 29U, 421U, 4089U, 29961U, /*U*/ 88522U }; + +RAM_ALIGN const UWord32* const MPVQ_offs_ptr[M + 1] = { NULL /*0*/, NULL, NULL, NULL, NULL, h_memN5K8, + h_memN6K2, NULL, h_memN8K2, NULL, h_memN10K22, NULL, + NULL, NULL, NULL, h_memN15K5 , h_memN16K12 }; +#else +RAM_ALIGN const UWord32* const MPVQ_offs_ptr[M + 1] = { NULL /*0*/, NULL, NULL, NULL, NULL, NULL, + h_memN6K2, NULL, NULL, NULL, h_memN10K22, NULL, + NULL, NULL, NULL, NULL, h_memN16K12 }; +#endif + +/*maxK coefficents for MPVQ de-indexing lookup */ +#ifdef CR9_C_ADD_1p25MS_LRSNS +RAM_ALIGN const Word16 tabledKMAX[M + 1] = { + 0, 0, 0, 0, 0, 8/*N=5 LR*/, 2 /*N=6*/, 0, 2 /*N=8 LR*/, 0, 22 /*N=10*/, 0, 0, 0, 0, 5/*N==15 LR*/, 12 /*N=16*/ +}; +#else +RAM_ALIGN const Word16 tabledKMAX[M + 1] = { + 0, 0, 0, 0, 0, 0, 2 /*N=6*/, 0, 0, 0, 22 /*N=10*/, 0, 0, 0, 0, 0, 12 /*N=16*/ +}; +#endif + +RAM_ALIGN const Word16 isqrt_Q16tab[1 + 64] = {/*table generated using ISqrt16 function + shift to Q16 */ + 32767, 32767, 32767, 32767, 32766, 29308, 26754, 24770, 23169, 21844, + 20723, 19759, 18918, 18176, 17515, 16921, 16383, 15894, 15446, 15034, + 14654, 14300, 13972, 13665, 13377, 13107, 12852, 12612, 12385, 12169, + 11965, 11770, 11584, 11407, 11238, 11077, 10922, 10773, 10631, 10493, + 10361, 10234, 10112, 9993, 9879, 9769, 9662, 9559, 9459, 9362, + 9268, 9176, 9088, 9001, 8918, 8836, 8757, 8680, 8605, 8532, + 8460, 8390, 8323, 8256, 8191}; + +#if defined(ENABLE_HR_MODE) || defined (CR9_C_ADD_1p25MS_LRSNS) +RAM_ALIGN const Word32 isqrt_Q31tab[1 + 64] = {/* 2^31 / sqrt(idx) */ + 2147483647, 2147483647, 1518500249, 1239850262, 1073741824, 960383883, + 876706528, 811672525, 759250124, 715827882, 679093956, 647490682, + 619925131, 595604800, 573939146, 554477893, 536870912, 520841288, + 506166749, 492666537, 480191941, 468619350, 457845052, 447781294, + 438353264, 429496729, 421156193, 413283420, 405836262, 398777702, + 392075078, 385699449, 379625062, 373828919, 368290407, 362990988, + 357913941, 353044136, 348367849, 343872591, 339546978, 335380599, + 331363920, 327488186, 323745341, 320127961, 316629189, 313242684, + 309962565, 306783378, 303700049, 300707858, 297802400, 294979564, + 292235509, 289566636, 286969573, 284441157, 281978417, 279578557, + 277238946, 274957105, 272730696, 270557508, 268435456 }; +#endif + +#ifdef ENABLE_HR_MODE +RAM_ALIGN const Word16 adjust_global_gain_tables[5][NUM_SAMP_FREQ] = {{80, 230, 380, 530, 680, 830}, + {500, 1025, 1550, 2075, 2600, 3125}, + {850, 1700, 2550, 3400, 4250, 5100}, + {189, 164, 155, 151, 148, 146}, + {1310, 3241, 5268, 7326, 9400, 11482}}; +#else +RAM_ALIGN const Word16 adjust_global_gain_tables[5][NUM_SAMP_FREQ] = {{80, 230, 380, 530, 680}, + {500, 1025, 1550, 2075, 2600}, + {850, 1700, 2550, 3400, 4250}, + {189, 164, 155, 151, 148}, + {1310, 3241, 5268, 7326, 9400}}; +#endif + +const Word16 plc_fadeout_param_maxlen[4] = {800, 400, 266, 200}; +const Word16 plc_fadeout_param_maxbytes[4] = {27, 14, 9, 7}; + +#ifdef CR9_C_ADD_1p25MS_LRSNS +RAM_ALIGN const Word16 lrsns_vq_gain_lvls_fx[SNSLR_MAX_PVQ_SEARCH_CAND] = { 4,8,8 }; + +/* BASOP gains stored in Q12 to be aligned with the 38-bit SNS-VQ BASOP gain tables */ +/* Cfloat values wer Q11 quantizd */ +RAM_ALIGN const Word16 lrsns_vq_split_gainsQ12_fx[4] = { 7424 , 10240 , 13568 , 17664 }; +/* q_gains5Q11_shape0_4[4] = { +1.8125 , +2.5000 , +3.3125 , +4.3125 }; */ +RAM_ALIGN const Word16 lrsns_vq_full_gainsQ12_fx[8] = { 5888 , 7424 , 8704 , 10240 , 12032 , 14336 , 16640 , 20224 }; +/* q_gains5Q11_shape1_8[8] = { +1.4375 , +1.8125 , +2.125 , +2.500 , +2.9375 , +3.5000 , +4.0625 , +4.9375 }; */ +RAM_ALIGN const Word16 lrsns_vq_fixenv_gainsQ12_fx[8] = { 5632 , 7168 , 8192 , 9472 , 10752 , 12544 , 14592 , 18176 }; +/* q_gains5Q11_shape2_8[8] = { ++1.375, +1.75, +2.0 , +2.3125 , +2.625 , +3.0625 , +3.5625 , +4.4375 }; */ + +RAM_ALIGN const Word16 *const lrsns_vq_gainsQ12_fx[SNSLR_MAX_PVQ_SEARCH_CAND] = +{ lrsns_vq_split_gainsQ12_fx, lrsns_vq_full_gainsQ12_fx, lrsns_vq_fixenv_gainsQ12_fx }; + +RAM_ALIGN const Word16 lrsns_cbA_fx[2 * 16] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -0, + 2431, 2077, 1592, 824, 16, -540, -560, -536, + -154, 385, 927, 1129, 455, -760, -2567, -4719 +}; + +#endif + +#ifdef CR9_C_ADD_1p25MS_LRSNS + +/*LRSNS tables to construct the 170x16 st1B from legacy st1(LF,HF) tables */ +/* each index point to two vector in the split 2x32 stage 1 cb , lower 12 bits in use [1][5][1][5] */ +/* ff,fr,rf,rr , handled by counting the absoulte idx */ +RAM_ALIGN const Word16 lrsns_st1B_merged170orderSortedSegmCnt_fx[4] = { /*ff,fr,rf,rr */ + 88, 42, 24, 16 +}; +RAM_ALIGN const Word16 lrsns_st1B_merged170orderSortedSegmCum_fx[5] = { /*ff,fr,rf,rr */ + 0, 88, 130, 154, 170 +}; +RAM_ALIGN const Word16 lrsns_st1B_merged170orderSort12bitIdx_fx[170] = { /* actually 14 bit index can also be saved */ + 15, 19, 119, 162, 177, 185, 227, 296, 297, 353, 357, 369, 370, 372, 377, 416, 418, + 420, 515, 529, 561, 569, 603, 625, 627, 673, 680, 754, 756, 777, 786, 801, 809, 834, + 837, 848, 849, 850, 852, 864, 865, 866, 872, 904, 908, 913, 914, 924, 928, 978, 996, + 1041, 1082, 1088, 1089, 1090, 1139, 1651, 1751, 1982, 1999, 2066, 2120, 2194, 2247, 2391, 2495, 2579, + 2626, 2632, 2649, 2959, 3071, 3107, 3223, 3331, 3395, 3415, 3548, 3641, 3675, 3703, 3820, 3825, 3849, + 3853, 3865, 3916, 45, 107, 110, 151, 168, 169, 247, 305, 313, 323, 357, 361, 777, 785, + 841, 1096, 1123, 1347, 1427, 1498, 1555, 1617, 1643, 1646, 1651, 1774, 2051, 2087, 2265, 2296, 2371, + 2971, 3022, 3241, 3287, 3319, 3331, 3543, 3601, 3683, 3689, 3697, 122, 259, 274, 387, 401, 496, + 657, 707, 739, 850, 857, 928, 929, 932, 996, 1123, 1270, 1303, 1609, 2151, 2193, 2371, 2632, + 2633, 55, 119, 291, 299, 343, 681, 1001, 1307, 1427, 1609, 1646, 1683, 2157, 2222, 3331, 4060 +}; + +RAM_ALIGN const Word32 lrsns_st1B_enBy2TabW32_fx[2 * 32] = { + /*LF part*/ + 30234814, 48294454, 44252960, 10048319, 5798194, 24342955, 50660188, 6227077, + 3474389, 37555746, 3633757, 43938502, 8136036, 52215414, 28346960, 28744396, + 19588476, 76644956, 24786264, 18434221, 32956728, 72443234, 42151630, 19760916, + 29437456, 96801748, 19960876, 70624637, 19538794, 66641198, 56240496, 45131948, + + /*HF part*/ + 68520493, 51375963, 52197680, 2006716, 82469877, 28647435, 42830587, 15395581, + 29105630, 20211225, 34248538, 7908398, 75887420, 4137010, 15516815, 40589204, + 49172712, 8171368, 22263062, 2379007, 44354878, 11938118, 39554253, 7529063, + 41090552, 13103632, 14530709, 18529070, 47842888, 71549086, 57585190, 62886415, +}; + +const RAM_ALIGN Word16 lrsns_st1C_pitch0_mp0Q11_fx[16] = { + 2293, 2602, 1960, 1161, 880, 417, 34, -169, + -368, -541, -604, -318, -287, -958, -2341, -3759 +}; +const RAM_ALIGN Word16 lrsns_st1C_pitch1_mp1Q11_fx[16] = { + 258, 805, 789, 533, 507, 123, 183, 155, + 88, 151, 535, 1019, 1023, 58, -2013, -4211 +}; +#ifdef LRSNS_CBC_NO_LTPF_DEPENDENCY +const RAM_ALIGN Word16* lrsns_st1CTrainedMapMeans_fx[2] = { lrsns_st1C_pitch0_mp0Q11_fx ,lrsns_st1C_pitch1_mp1Q11_fx }; +#else +const RAM_ALIGN Word16 lrsns_st1C_pitch2_mp2Q11_fx[16] = { + -421, 206, 399, 323, 383, 25, 233, 263, + 240, 381, 914, 1464, 1460, 397, -1904, -4361 +}; +const RAM_ALIGN Word16* lrsns_st1CTrainedMapMeans_fx[3] = { lrsns_st1C_pitch0_mp0Q11_fx ,lrsns_st1C_pitch1_mp1Q11_fx,lrsns_st1C_pitch2_mp2Q11_fx }; +#endif +/* BE representable in Q11 after Q4*Q7 multiplcation */ +const RAM_ALIGN Word16 lrsns_st1C_Both_scaleQ4_7p4bits_fx[2] = { +-1, 86 /* exact BASOP Q4 value, used in synthesis */ }; +const RAM_ALIGN Word16 lrsns_st1C_Both_inv_scaleQ15_7p4bits_fx[2] = { +-1 , 6096 /* BASOP Q15 value, invScale used in encoder side target creation */ }; + +/* Word8 storage of ST1 codebook to save ROM in BASOP */ +const RAM_ALIGN Word8 lrsns_st1C_Both_Word8_fx[170 * 16] = { + -88, -78, -57, -39, -27, -15, -6, 3, 11, 17, 20, 23, 32, 47, 69, 88, + -86, -40, -7, 4, 1, 5, 10, 10, 0, -5, -5, 4, 9, 23, 38, 39, + -71, -69, -65, -49, -29, -5, 16, 30, 21, -8, -3, 15, 27, 40, 63, 87, + -71, -36, -10, -5, 2, 17, 15, 18, 24, 24, 13, 7, 11, 2, -6, -7, + -70, -23, 13, 12, 0, 7, 19, 14, 1, -1, 6, 3, -2, 1, 9, 13, + -68, -79, -67, -42, -26, -17, 8, 29, 38, 34, 32, 33, 32, 36, 36, 21, + -62, -66, -56, -41, -33, -13, 11, 17, 16, 17, 28, 39, 40, 41, 40, 23, + -61, -62, -51, -31, -26, -25, -23, -15, -3, 12, 24, 30, 33, 43, 68, 85, + -60, -63, -47, -28, -17, -9, 13, 30, 36, 31, 25, 24, 27, 28, 17, -6, + -57, -47, -25, -11, -17, -12, -1, -7, -4, -1, -7, 1, 23, 44, 58, 60, + -54, -59, -61, -50, -22, -1, 25, 37, 37, 31, 21, 13, 21, 31, 27, 4, + -53, -36, -14, 3, 13, 12, 14, 19, 26, 31, 30, 22, 3, -12, -21, -36, + -53, -52, -39, -24, -12, 2, 23, 34, 32, 27, 16, 8, 11, 21, 14, -9, + -45, -46, -31, -16, -8, -5, 6, 21, 31, 32, 26, 22, 18, 11, 1, -17, + -40, -11, 7, 11, 4, 13, 5, -13, -28, -20, -10, 0, 8, 19, 23, 32, + -40, -32, -18, -2, 6, 12, 8, 1, 2, 4, 9, 15, 20, 13, 3, -1, + -40, -9, 11, 7, 6, 6, 0, -13, -13, -1, 7, 12, 8, 4, 6, 9, + -39, 5, 19, 12, 13, 9, 4, 3, -2, -6, -4, 2, 3, -2, -6, -13, + -38, -13, 1, 1, 4, 17, 16, 12, 8, 0, -9, -23, -20, 0, 18, 24, + -38, -25, -13, -12, -24, -17, -6, 4, 10, 6, -17, -13, 6, 35, 51, 53, + -38, -34, -30, -24, -9, 7, 17, 18, 14, 9, 11, 14, 18, 18, 12, -3, + -38, -36, -19, 2, 20, 28, 28, 33, 31, 16, 6, 4, -4, -12, -23, -36, + -38, -46, -38, -22, -17, -22, -11, 18, 35, 34, 27, 25, 24, 22, 12, -3, + -37, 3, 34, 16, -8, -30, -54, -45, -23, -9, -3, 14, 12, 15, 42, 72, + -35, -55, -53, -38, -30, -20, -5, 6, 13, 16, 21, 25, 29, 41, 48, 36, + -35, -45, -50, -47, -48, -41, -31, -16, -1, 9, 20, 21, 29, 51, 81, 104, + -35, -46, -46, -35, -24, -11, 9, 27, 34, 33, 27, 25, 21, 17, 9, -6, + -34, -24, -20, -13, -11, -7, 2, 2, -13, -4, 23, 31, 21, 16, 16, 16, + -33, -54, -66, -58, -43, -23, -16, -10, 1, 18, 23, 18, 28, 51, 74, 89, + -31, 16, 51, 48, 30, 18, 12, 2, -7, -17, -23, -26, -29, -26, -17, -1, + -31, -20, -18, -20, -13, -8, 1, 13, 20, 2, -13, -8, 12, 27, 31, 25, + -30, -33, -40, -36, -30, -11, 3, 10, 14, 15, 24, 29, 31, 27, 20, 8, + -30, -45, -40, -20, -14, -21, -31, -23, -10, 1, 12, 15, 22, 39, 64, 83, + -29, -15, 0, 4, 8, 16, 17, 11, 5, 4, 2, 1, 11, 7, -13, -29, + -29, -29, -20, -3, 15, 27, 27, 18, 17, 29, 31, 19, -3, -19, -35, -44, + -28, -21, -26, -26, 2, 22, 30, 37, 34, 18, 8, 2, 0, -9, -18, -25, + -28, -19, -11, -7, -1, 8, 13, 17, 21, 25, 30, 23, 5, -9, -26, -42, + -27, -9, 3, 2, 3, 11, -7, -14, 9, 25, 14, -6, -4, -1, 0, 2, + -27, -27, -25, -17, -18, -10, -8, -16, -18, 1, 16, 20, 29, 35, 38, 27, + -26, -44, -8, 8, -12, -5, -6, -9, 1, 13, 17, 15, 35, 42, 6, -29, + -24, -22, -16, -13, -12, 0, 10, 15, 19, 8, 5, 13, 26, 18, -5, -21, + -24, -42, -47, -33, -31, -32, -19, 2, 13, 13, 9, 4, 16, 35, 58, 80, + -24, -16, -7, -4, -7, -6, -8, -9, -3, 5, 11, 15, 23, 22, 12, -2, + -23, -13, 1, 1, -19, -17, 7, 21, 29, 29, 20, 12, 0, -9, -15, -26, + -23, -39, -40, -26, -19, -13, -4, -10, -21, -20, 0, 18, 26, 39, 57, 73, + -22, -26, -25, -25, -28, -21, -3, 23, 35, 38, 31, 20, 10, 5, 2, -13, + -21, 3, 27, 20, -9, -8, 4, 3, -3, -10, -18, -16, -4, 8, 11, 13, + -21, -13, -5, 1, 15, 22, 23, 27, 31, 25, 13, -1, -18, -28, -33, -40, + -20, -15, 0, 10, 9, 13, 12, 0, -15, -8, 7, 9, 4, 0, -2, -6, + -20, -15, -9, -6, -2, -14, -40, -5, 34, 49, 45, 29, -7, -16, -7, -18, + -19, 13, 24, 22, 27, 17, 2, -1, -8, -17, -26, -16, 0, 1, -4, -15, + -18, -14, -7, 6, 19, 21, 20, 22, 20, 16, 17, 14, -5, -27, -39, -44, + -17, 30, 76, 76, 57, 44, 11, -23, -43, -54, -57, -58, -53, -33, 5, 40, + -17, -19, -22, -34, -39, -15, 12, 23, 21, 17, 18, 22, 20, 13, 6, -7, + -17, -12, -8, 6, 19, 4, -15, 0, 21, 32, 30, 8, -9, -15, -20, -24, + -16, 33, 77, 82, 55, 23, -2, -11, -20, -39, -58, -65, -58, -33, 0, 32, + -16, -21, -26, -21, -7, 7, 10, 8, 11, 16, 22, 20, 12, 3, -4, -16, + -15, 8, 29, 23, 11, -9, -29, -23, -14, -5, -2, -2, 4, 10, 9, 3, + -14, -17, -19, -22, -11, 2, 15, 27, 33, 27, 20, 14, 3, -10, -20, -27, + -13, -2, 6, 3, -7, -7, 4, 26, 31, 19, 13, 12, -4, -23, -29, -32, + -13, -6, 6, 18, 21, 18, 12, 7, 5, 5, 5, -1, -7, -15, -23, -33, + -12, -7, 0, 3, 5, 0, -5, 4, 18, 24, 25, 16, 1, -13, -25, -34, + -12, -3, 0, -4, -3, 10, 9, -3, -5, -6, -6, -3, 14, 20, 5, -14, + -12, -11, -15, -14, -7, 2, 12, 6, -10, -21, -4, 11, 22, 22, 15, 4, + -11, -12, -13, -5, 11, 16, 11, 6, 5, 15, 22, 20, 3, -12, -23, -33, + -11, -10, -8, -11, -3, 13, 19, 18, 11, -1, -12, -8, 6, 7, 0, -12, + -11, -17, -20, -20, -16, -9, -2, 7, 24, 32, 32, 26, 14, 0, -14, -27, + -10, -11, -11, -20, -26, -25, -7, 7, 20, 29, 19, 6, 5, 15, 9, 0, + -10, -5, -7, -9, -4, 9, 10, 0, -17, -28, -21, -7, 12, 28, 29, 22, + -8, -20, -30, -25, -28, -26, -18, -9, 7, 15, 24, 26, 30, 33, 24, 5, + -8, -17, -19, -17, -16, -7, -7, -7, 3, 4, 4, 6, 21, 28, 22, 10, + -8, 35, 62, 60, 43, 21, 6, -4, -21, -34, -37, -42, -43, -32, -12, 6, + -8, -6, -3, -1, 1, 0, -5, -5, 2, 11, 23, 21, 8, -2, -11, -24, + -7, -21, -21, -13, 1, 18, 28, 30, 30, 34, 33, 18, 0, -21, -52, -57, + -6, -31, -40, -39, -36, -27, -20, -22, -19, -4, 10, 12, 19, 38, 69, 95, + -6, -38, -48, -42, -37, -27, -13, 2, 7, 9, 17, 23, 33, 45, 46, 28, + -6, -18, -39, -58, -59, -34, -15, -6, 0, 4, 15, 22, 24, 38, 59, 71, + -4, 6, 6, 11, 15, 9, 1, -7, 2, 11, 16, 10, -5, -14, -26, -31, + -4, 2, 7, -6, -59, -49, -4, -1, 1, 15, 9, -19, -19, 11, 52, 64, + -2, 31, 53, 43, 20, 8, -2, -17, -24, -21, -22, -25, -22, -14, -8, 1, + 1, -3, -3, 4, 6, 9, -4, -31, -39, -17, -5, -1, 6, 16, 27, 34, + 1, 10, 15, 12, -5, -20, -21, -10, 12, 27, 23, 10, -4, -12, -17, -23, + 3, 13, 23, 25, 20, 14, 3, 7, 11, -4, -31, -43, -35, -21, -1, 19, + 3, -3, -9, -16, -19, -7, 1, 7, 11, -2, -5, 5, 23, 20, 2, -10, + 4, -22, -27, -23, -23, -11, 7, 14, 15, 15, 6, -3, -9, -6, 19, 44, + 5, -5, -9, -8, -9, -7, 0, 17, 29, 22, 12, 12, 6, -8, -23, -32, + 6, -31, -58, -64, -41, -12, -1, 3, 2, 0, 3, 6, 21, 37, 55, 74, + 7, 12, 10, 1, 2, 6, 2, -5, -7, -3, -2, 0, 1, 1, -6, -19, + 9, 1, 2, 12, 15, 11, -11, -33, -17, 13, 20, 9, 0, -7, -11, -13, + 10, 21, 26, 24, 18, 4, -5, -13, -14, -6, 4, 7, -7, -19, -25, -25, + 11, 1, -4, -7, -17, -28, -18, 4, 19, 27, 21, 12, 6, 2, -8, -20, + 11, 4, -17, -36, -48, -39, -18, 0, 3, 1, 3, 6, 15, 27, 39, 49, + 11, 3, -12, -26, -20, -2, 11, 16, 14, 9, 18, 19, 6, -7, -15, -25, + 12, 0, -12, -7, -5, -15, -21, -14, -5, 4, 13, 22, 22, 13, 3, -8, + 14, 17, 19, 17, 17, 16, 1, -9, -8, -5, -13, -11, -6, -7, -14, -27, + 14, 33, 52, 50, 32, 12, -1, -6, -8, -14, -23, -30, -36, -35, -26, -13, + 16, 11, 10, 15, 21, 13, 13, 10, 8, 4, 6, 6, -6, -25, -50, -52, + 17, 9, 9, 23, 23, 10, 5, 16, 20, 13, 2, -18, -35, -39, -30, -23, + 17, 31, 47, 49, 42, 32, 22, 8, -7, -21, -31, -30, -43, -53, -42, -21, + 19, 37, 50, 42, 28, 24, 15, -8, -22, -22, -19, -28, -39, -39, -26, -12, + 19, 39, 47, 31, 10, 0, 1, 1, -6, -15, -21, -23, -26, -25, -18, -13, + 19, 12, 0, -7, -3, 1, -2, -12, -19, -19, -11, -1, 9, 14, 12, 5, + 19, 33, 47, 55, 47, 23, -6, -18, -23, -24, -14, -9, -22, -34, -42, -33, + 19, 13, -1, -20, -24, -13, -6, -6, -11, -16, -21, -24, -15, 9, 45, 71, + 21, 15, 8, 4, 5, 6, 3, 4, -2, -17, -20, -8, 12, 9, -12, -28, + 22, 10, 9, 20, 18, -4, -6, 1, 5, 9, 16, 18, -1, -22, -47, -48, + 22, 22, 27, 42, 41, 33, 21, 0, -17, -27, -28, -37, -39, -32, -19, -8, + 23, 4, -28, -27, -16, -5, 9, 28, 28, 0, -52, -61, -12, 18, 35, 56, + 23, -6, -26, -22, -18, -18, -20, -28, -23, -3, 9, 3, 1, 17, 44, 66, + 23, 21, 12, 10, 6, -5, 3, 8, 4, -1, 8, 11, -2, -16, -40, -43, + 24, 11, -4, -9, -8, -10, -21, -37, -44, -26, 0, 8, 17, 29, 36, 35, + 25, 11, 3, 7, 13, 14, 9, 2, -7, -13, -17, -12, -10, -10, -7, -8, + 25, 24, 17, 12, 20, 7, -11, -10, -15, -16, -16, -5, 3, -4, -11, -21, + 27, 26, 17, 6, -5, -16, -12, 2, -1, -9, -16, -7, 3, 3, -2, -15, + 28, 15, -10, -29, -30, -17, 4, 16, 33, 29, 15, 6, -5, -18, -18, -18, + 28, 12, 4, 16, 23, 12, 6, -1, -6, -7, 2, 8, -2, -19, -38, -37, + 29, 16, -1, -15, -25, -15, -12, -9, 18, 29, 23, 12, -1, -13, -16, -20, + 29, 28, 25, 33, 32, 6, -13, -20, -8, 4, 7, 0, -14, -25, -43, -40, + 29, 25, 19, 17, 20, 8, -12, -34, -34, -19, -14, -6, 2, 4, 3, -9, + 30, 28, 22, 14, 17, 16, 15, 8, -5, -19, -13, -4, -7, -20, -40, -41, + 30, 1, -20, -4, -6, -32, -37, -28, -18, -11, -7, -3, 8, 21, 44, 63, + 30, 42, 57, 45, 22, 6, 8, 2, -10, -27, -43, -50, -45, -33, -13, 9, + 32, 25, 20, 24, 23, 6, 3, -2, -10, -8, 4, 8, -8, -27, -47, -45, + 32, 40, 44, 29, 12, 0, -10, -18, -24, -20, -18, -23, -25, -19, -5, 4, + 34, 45, 56, 51, 33, 16, 10, 6, -8, -21, -25, -42, -55, -52, -33, -16, + 34, 53, 63, 61, 58, 44, 12, -26, -62, -68, -60, -61, -47, -18, 9, 9, + 34, 28, 22, 17, 16, 16, 9, 0, -6, -12, -26, -31, -21, -13, -13, -19, + 34, 23, 10, -15, -33, -24, -17, -15, -7, 0, -5, -10, -4, 5, 23, 35, + 35, 23, 12, 0, -16, -22, -17, 0, 17, 19, 14, 7, -5, -16, -24, -27, + 35, 32, -23, -51, -12, 33, 23, 0, -10, 1, -12, -29, -13, 9, 17, 0, + 36, 69, 78, 62, 30, -9, -40, -49, -49, -44, -48, -51, -37, -10, 19, 44, + 36, 21, 8, 11, 18, 8, 9, 8, 7, 3, 2, 1, -13, -28, -46, -44, + 37, 27, 11, 6, 14, 5, -6, -1, -9, -26, -37, -18, 3, 5, 0, -11, + 39, 31, 20, 13, 12, 6, -8, -12, -16, -16, -22, -18, -9, -6, -5, -10, + 39, 33, 25, 21, 22, 18, 7, -4, -24, -33, -33, -20, -9, -8, -14, -22, + 39, 52, 61, 57, 40, 27, 9, -12, -27, -37, -46, -50, -48, -40, -23, -2, + 40, 31, 20, 18, 14, -8, -5, 4, 8, 4, -1, -2, -14, -28, -42, -38, + 40, 29, 17, 19, 15, -9, -20, -18, -7, 1, 10, 9, -5, -15, -33, -33, + 41, 33, 23, 18, 20, 2, -13, -6, -6, -9, -16, -13, -12, -18, -21, -21, + 41, 58, 71, 51, 33, 19, -13, -42, -56, -58, -65, -67, -53, -17, 32, 65, + 41, 31, 15, 10, 4, -16, -7, 5, 7, 8, 12, 8, -7, -26, -44, -40, + 43, 40, 28, 23, 23, 6, -13, -20, -26, -18, -2, 3, -2, -13, -34, -36, + 43, 23, -11, -15, 2, 3, 6, 5, 3, 4, 11, 11, -2, -17, -33, -32, + 43, 54, 61, 49, 24, -1, -8, -3, -8, -21, -32, -43, -46, -39, -21, -9, + 43, 30, 9, -8, -2, 0, -10, -12, -14, -12, -12, -2, 4, 2, -3, -14, + 43, 35, 23, 15, 12, -8, -33, -27, -16, -12, -14, -4, 5, 0, -6, -13, + 44, 31, 19, 12, 4, -5, 1, -1, -10, -14, -1, 5, -3, -15, -33, -34, + 44, 28, 8, 8, 18, 13, 7, -3, -10, -8, -3, -3, -13, -23, -33, -31, + 46, 40, 9, -22, -17, 6, 18, 19, 6, -11, -14, -5, 5, -9, -35, -35, + 47, 47, 53, 51, 27, -3, -46, -65, -46, -33, -32, -29, -28, -17, 17, 56, + 47, 43, 27, 25, 24, 2, -2, -1, -17, -19, -1, 6, -11, -33, -50, -40, + 48, 50, 47, 34, 9, -7, -10, -9, -10, -12, -17, -28, -33, -30, -19, -12, + 48, 51, 51, 41, 25, 7, -18, -39, -47, -47, -44, -36, -21, -2, 14, 17, + 48, 23, -3, 10, 21, -2, -9, -6, -4, -2, 8, 15, 0, -23, -40, -36, + 50, 25, 2, -3, 4, 16, 13, -4, -21, -30, -30, -29, -20, -2, 13, 17, + 59, 44, 18, 13, 23, 18, 8, -7, -28, -26, -8, -3, -10, -24, -42, -35, + 61, 47, 30, 22, 25, 21, 8, -2, -16, -25, -14, -5, -15, -39, -56, -43, + 62, 46, 31, 37, 38, 16, -13, -33, -25, -7, -1, -3, -20, -39, -51, -38, + 63, 47, 23, 9, 5, -2, -13, -12, -8, -7, -14, -20, -26, -25, -15, -6, + 63, 42, 20, 9, 7, 0, -10, -18, -21, -22, -24, -24, -22, -16, 0, 17, + 64, 54, 43, 22, -17, -38, -42, -38, -37, -23, -17, -20, -15, -2, 22, 42, + 64, 51, 36, 34, 35, 21, 6, -9, -34, -41, -20, -7, -18, -35, -48, -36, + 66, 66, 65, 55, 35, 8, -9, -18, -29, -35, -39, -45, -47, -39, -24, -9, + 67, 38, -11, -47, -53, -27, -14, -19, -21, -21, 0, 6, 9, 19, 31, 45, + 70, 60, 50, 45, 32, 3, -17, -33, -34, -24, -10, -9, -22, -36, -44, -30, + 75, 57, 34, 30, 34, 20, -7, -29, -42, -36, -21, -15, -19, -28, -32, -20, + 76, 61, 27, -11, -30, -32, -29, -24, -24, -22, -18, -21, -16, 1, 22, 42, + 96, 77, 40, 5, -17, -27, -30, -28, -25, -24, -22, -23, -23, -16, 1, 16, + 99, 86, 61, 28, -5, -26, -39, -35, -34, -20, -5, -15, -34, -40, -22, 2, + 127, 101, 43, -12, -35, -34, -40, -42, -40, -40, -41, -40, -31, -6, 28, 61 +}; + +const RAM_ALIGN Word16 lrsns_st1C_Both_EnBy2Tab_fx[170] = /* 2*170 words = 340 bytes st1C vector energiesBy2 for BASOP optimized st1C search */ +{ + 18337, 6464, 16528, 4442, 3325, 13879, 11473, 14799, + 8649, 8092, 10092, 5046, 6178, 4902, 2766, 2051, + 1326, 1302, 2147, 5282, 3107, 4708, 5827, 8414, + 8739, 17452, 6318, 2682, 16210, 5422, 2792, 5004, + 10256, 1519, 5041, 3956, 3440, 1079, 4168, 3788, + 2020, 9834, 1334, 2524, 8456, 4251, 1404, 4078, + 797, 4834, 2070, 3822, 17739, 3451, 2423, 16332, + 1881, 1833, 3031, 2527, 1746, 2000, 646, 1403, + 1949, 914, 3011, 2055, 2134, 3985, 1646, 9429, + 1011, 6486, 11620, 7391, 10705, 1452, 6977, 4626, + 2571, 1958, 3481, 1012, 2781, 1940, 10326, 412, + 1532, 2142, 1890, 5401, 1814, 1322, 1576, 6375, + 3799, 3481, 9205, 6809, 4090, 1001, 7829, 5257, + 1371, 3563, 6407, 7621, 5384, 2630, 4548, 1109, + 1827, 1397, 3300, 2621, 2531, 4684, 2870, 3750, + 5722, 8534, 4237, 4413, 10184, 18130, 3132, 3079, + 2704, 4383, 16988, 3762, 2559, 2501, 4264, 12450, + 3930, 3390, 3062, 19816, 3948, 4767, 2736, 9537, + 1928, 3348, 3123, 3165, 4113, 13238, 5997, 6146, + 10143, 3619, 3770, 6037, 8141, 8949, 4701, 4897, + 9675, 9684, 13828, 8352, 10983, 9836, 9009, 11364, + 15100, 23026 +}; +#endif + +#ifdef CR9_C_ADD_1p25MS_LRSNS +RAM_ALIGN const Word16 isqrt_Q15tab[1 + 6] = { + /* onepulse_search_tab based search , Q15 table generated using isqrt_Q16tab table for idx=[8(4*2),16(4*4), 20(4*5),24(4*6) ] */ + /*this slighly suboptimal inv_sqrt(x) table is used to enable optional exact use of the ROM saving BASOP ISqrt16() function */ + + 32767/*0*/, 32766/*1*/, 23169 /*2*/, 18918 /*3*/ , 16384/*4*/ , 14654 /*5*/, 13377/*6*/ + + /* i.e. value in isqrt_Q15tab[n=0..6] == isqrt_Q16tab[4*n] */ +}; + + +RAM_ALIGN const Word16 lrsns_signs_fix_fx[SNSLR_N_FIXENV] = { 12, 12, 12, 10 }; +RAM_ALIGN const Word16 long_bell_fx[M - 1 + 4] = { /* --> constants.c ROM */ + 6, 6, 7, 7, 8 , + 8, 8, 7, 7, 6 , + 6, 5, 5, 5, 5 , + 5, 5, 5, 5 }; + +RAM_ALIGN const Word16 decay_fx[M - 1] = +{ /* floor((25:-1:11 -i)/2)*/ + 12,12,11,11,10, + 10, 9, 9, 8, 8, + 7, 7, 6, 6, 5 +}; + +RAM_ALIGN const Word16 *lrsns_fix_env_fx[SNSLR_N_FIXENV] = { &(long_bell_fx[4]), decay_fx, &(long_bell_fx[2]), long_bell_fx }; + + +RAM_ALIGN const Word16 lrsns_fixenv_enQ0[SNSLR_N_FIXENV * SNSLR_N_FIXENV_SHIFTS] = /* offline pre-computed from fixenv[0..3] + shifts */ +{ 487, 448, 409, 370, 1118, 1010, 902, 806, 535, 511, 487, 448, 496, 496, 485, 461 +}; + +RAM_ALIGN const Word16 lrsns_fixenv_enNormQ19[SNSLR_N_FIXENV * SNSLR_N_FIXENV_SHIFTS] = /*Q15+4 => Q19 */ +{ /* round(2.^19 ./ sqrt(fixenv_en) , for search loop */ + 23758, 24770, 25924, 27256, /*fixenv 0*/ + 15680, 16497, 17457, 18467, /*fixenv 1*/ + 22667, 23193, 23758, 24770, /*fixenv 2*/ + 23541, 23541, 23807, 24419 /*fixenv 3*/ +}; +RAM_ALIGN const Word32 L_lrsns_fixenv_enNormQ35[SNSLR_N_FIXENV * SNSLR_N_FIXENV_SHIFTS] = /*Q15+4 +16=> Q35 */ +{ /* fixenv_enQ0= [487, 448, 409, 370, 1118, 1010, 902, 806, 535, 511, 487, 448, 496, 496, 485, 461] */ + /* int32(round(2.^35 ./ sqrt(fixenv_enQ0))), "for synthesis" */ + 1556988367L, 1623345051L, 1698979717L, 1786277740L,/*fixenv 0*/ + 1027611478L, 1081157988L, 1144054146L, 1210270165L,/*fixenv 1*/ + 1485501030L, 1519985336L, 1556988367L, 1623345051L,/*fixenv 2*/ + 1542797797L, 1542797797L, 1560195349L, 1600292558L /*fixenv 3*/ +}; + +RAM_ALIGN const Word16 lrsns_norm_factorQ_L[N_SCF_SEARCH_SHAPES_ST2_LR] = { 31, 31, 19 + 16 }; /* split, full, fixenv */ +/*maxamps = [8, 5, 12]; 8*2^11 = 2^14 =16384 , 5*2^12 = 20480, 12*2^11= 24576 */ +RAM_ALIGN const Word16 lrsns_y_up_bits[N_SCF_SEARCH_SHAPES_ST2_LR] = { 11, 12, 11 }; /* split, full, fixenv, max uphifts for normaliztion */ + +#endif diff --git a/lib_lc3plus/constants.h b/lib_lc3plus/constants.h new file mode 100644 index 0000000000000000000000000000000000000000..2ecc1ad24e408e535d29716caacfdb84c6079174 --- /dev/null +++ b/lib_lc3plus/constants.h @@ -0,0 +1,457 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#ifndef CONSTANTS_H +#define CONSTANTS_H + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "basop_util_lc3plus.h" + +#ifdef LTPF_ADAPTIVE_GAIN +extern RAM_ALIGN const Word16 tilt_filter_1p25ms[5][4][11]; +extern RAM_ALIGN const Word16 adaptive_gain_step; +extern RAM_ALIGN const Word16 max_adaptive_gain[4]; +extern RAM_ALIGN const Word16 max_adaptive_gain_step[4]; +#endif + +extern RAM_ALIGN const Word16 *const lpc_pre_adapt_emphasis[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word8 *const lpc_pre_adapt_emphasis_e[NUM_SAMP_FREQ]; + +#ifdef CR9_C_ADD_1p25MS +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word16 LowDelayShapes_n960_len_1_25ms[6]; +#else +extern RAM_ALIGN const Word16 LowDelayShapes_n960_len_1_25ms[5]; +#endif + +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word32 *const LowDelayShapes_n960_1_25ms[6]; +#else +extern RAM_ALIGN const Word16 *const LowDelayShapes_n960_1_25ms[6]; +#endif + +extern RAM_ALIGN const Word16 bands_number_1_25ms[]; +extern RAM_ALIGN const Word16 *const bands_offset_1_25ms[6]; + +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word16 bands_number_1_25ms_HR[]; +extern RAM_ALIGN const Word16 *const bands_offset_1_25ms_HR[2]; +#endif + +extern RAM_ALIGN const Word16 bands_offset_with_one_max_1_25ms[NUM_OFFSETS]; +extern RAM_ALIGN const Word16 bands_offset_with_two_max_1_25ms[NUM_OFFSETS]; + +extern RAM_ALIGN const Word16 *const bands_offset_lin_1_25ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 bands_offset_with_one_max_lin_1_25ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 bands_offset_with_two_max_lin_1_25ms[NUM_SAMP_FREQ]; + +#endif /* CR9_C_ADD_1p25MS */ + +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word16 BW_cutoff_bin_all_HR[]; + +extern RAM_ALIGN const Word32 *const LowDelayShapes_n960_HRA_2_5ms[2]; +extern RAM_ALIGN const Word32 *const LowDelayShapes_n960_HRA_5ms[2]; +extern RAM_ALIGN const Word32 *const LowDelayShapes_n960_HRA_7_5ms[2]; +extern RAM_ALIGN const Word32 *const LowDelayShapes_n960_HRA[2]; +#endif + +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word16 LowDelayShapes_n960_len[6]; +#else +extern RAM_ALIGN const Word16 LowDelayShapes_n960_len[5]; +#endif +extern RAM_ALIGN const Word16 LowDelayShapes_n960_la_zeroes[NUM_SAMP_FREQ]; +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word32 *const LowDelayShapes_n960[6]; +#else +extern RAM_ALIGN const Word16 *const LowDelayShapes_n960[6]; +#endif + +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word16 LowDelayShapes_n960_len_5ms[6]; +#else +extern RAM_ALIGN const Word16 LowDelayShapes_n960_len_5ms[5]; +#endif +extern RAM_ALIGN const Word16 LowDelayShapes_n960_la_zeroes_5ms[NUM_SAMP_FREQ]; +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word32 *const LowDelayShapes_n960_5ms[6]; +#else +extern RAM_ALIGN const Word16 *const LowDelayShapes_n960_5ms[6]; +#endif +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word16 LowDelayShapes_n960_len_2_5ms[6]; +#else +extern RAM_ALIGN const Word16 LowDelayShapes_n960_len_2_5ms[5]; +#endif +extern RAM_ALIGN const Word16 LowDelayShapes_n960_la_zeroes_2_5ms[NUM_SAMP_FREQ]; +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word32 *const LowDelayShapes_n960_2_5ms[6]; +#else +extern RAM_ALIGN const Word16 *const LowDelayShapes_n960_2_5ms[6]; +#endif + +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word32 *const LowDelayShapes_n960_7_5ms[5]; +#else +extern RAM_ALIGN const Word16 *const LowDelayShapes_n960_7_5ms[5]; +#endif + +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word16 LowDelayShapes_n960_len_7_5ms[6]; +#else +extern RAM_ALIGN const Word16 LowDelayShapes_n960_len_7_5ms[5]; +#endif +extern RAM_ALIGN const Word16 LowDelayShapes_n960_la_zeroes_7_5ms[NUM_SAMP_FREQ]; + +extern RAM_ALIGN const Word16 NN_thresh; +extern RAM_ALIGN const Word16 NN_thresh_exp; +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word32 TD_HR_thresh_10ms; +extern RAM_ALIGN const Word32 TD_HR_thresh_7_5ms; +extern RAM_ALIGN const Word32 TD_HR_thresh_5ms; +extern RAM_ALIGN const Word32 TD_HR_thresh_2_5ms; +#endif /* ENABLE_HR_MODE */ +extern RAM_ALIGN const Word32 BW_thresh_quiet[4]; +extern RAM_ALIGN const Word16 BW_thresh_quiet_exp; +extern RAM_ALIGN const Word16 BW_thresh_brickwall[4]; + +extern RAM_ALIGN const Word16 BW_cutoff_bin_all[]; +extern RAM_ALIGN const Word16 BW_cutoff_bits_all[]; + +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word16 bands_number_2_5ms_HR[]; +#endif + +extern RAM_ALIGN const Word16 BW_brickwall_dist[4]; +extern RAM_ALIGN const Word16 *const BW_warp_idx_start_all[MAX_BW_BANDS_NUMBER - 1]; +extern RAM_ALIGN const Word16 *const BW_warp_idx_stop_all[MAX_BW_BANDS_NUMBER - 1]; + +extern RAM_ALIGN const Word16 BW_brickwall_dist_5ms[4]; +extern RAM_ALIGN const Word16 *const BW_warp_idx_start_all_5ms[MAX_BW_BANDS_NUMBER - 1]; +extern RAM_ALIGN const Word16 *const BW_warp_idx_stop_all_5ms[MAX_BW_BANDS_NUMBER - 1]; +extern RAM_ALIGN const Word16 BW_brickwall_dist_2_5ms[4]; +extern RAM_ALIGN const Word16 *const BW_warp_idx_start_all_2_5ms[MAX_BW_BANDS_NUMBER - 1]; +extern RAM_ALIGN const Word16 *const BW_warp_idx_stop_all_2_5ms[MAX_BW_BANDS_NUMBER - 1]; + +extern RAM_ALIGN const Word16 BW_brickwall_dist_7_5ms[4]; +extern RAM_ALIGN const Word16 *const BW_warp_idx_start_all_7_5ms[]; +extern RAM_ALIGN const Word16 *const BW_warp_idx_stop_all_7_5ms[]; + +extern RAM_ALIGN const Word16 *const tns_subdiv_startfreq[MAX_BW_BANDS_NUMBER]; +extern RAM_ALIGN const Word16 *const tns_subdiv_stopfreq[MAX_BW_BANDS_NUMBER]; + +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word16 *const tns_subdiv_startfreq_HR[2]; +extern RAM_ALIGN const Word16 *const tns_subdiv_stopfreq_HR[2]; + +extern RAM_ALIGN const Word16 *const tns_subdiv_startfreq_5ms_HR[2]; +extern RAM_ALIGN const Word16 *const tns_subdiv_stopfreq_5ms_HR[2]; + +extern RAM_ALIGN const Word16 *const tns_subdiv_startfreq_2_5ms_HR[2]; +extern RAM_ALIGN const Word16 *const tns_subdiv_stopfreq_2_5ms_HR[2]; +#endif + +extern RAM_ALIGN const Word16 *const tns_subdiv_startfreq_5ms[MAX_BW_BANDS_NUMBER]; +extern RAM_ALIGN const Word16 *const tns_subdiv_stopfreq_5ms[MAX_BW_BANDS_NUMBER]; + + +extern RAM_ALIGN const Word16 *const tns_subdiv_startfreq_2_5ms[MAX_BW_BANDS_NUMBER]; +extern RAM_ALIGN const Word16 *const tns_subdiv_stopfreq_2_5ms[MAX_BW_BANDS_NUMBER]; + +extern RAM_ALIGN const Word16 *const tns_subdiv_startfreq_7_5ms[]; +extern RAM_ALIGN const Word16 *const tns_subdiv_stopfreq_7_5ms[]; + +extern RAM_ALIGN const Word16 Tab_esc_nb[4]; + +extern RAM_ALIGN const Word8 ari_spec_lookup[4096]; +extern RAM_ALIGN const UWord16 ari_spec_cumfreq[64][17]; +extern RAM_ALIGN const UWord16 ari_spec_freq[64][17]; +extern RAM_ALIGN const UWord16 ari_spec_bits[64][17]; + +extern RAM_ALIGN const Word32 tnsAcfWindow[MAXLAG]; +extern RAM_ALIGN const Word16 ac_tns_order_bits[2][MAXLAG]; +extern RAM_ALIGN const Word16 ac_tns_order_freq[2][MAXLAG]; +extern RAM_ALIGN const Word16 ac_tns_order_cumfreq[2][MAXLAG]; +extern RAM_ALIGN const Word16 ac_tns_coef_bits[MAXLAG][TNS_COEF_RES]; +extern RAM_ALIGN const Word16 ac_tns_coef_freq[MAXLAG][TNS_COEF_RES]; +extern RAM_ALIGN const Word16 ac_tns_coef_cumfreq[MAXLAG][TNS_COEF_RES]; +extern RAM_ALIGN const Word16 tnsQuantPts[TNS_COEF_RES]; +extern RAM_ALIGN const Word16 tnsQuantThr[TNS_COEF_RES - 1]; + +extern RAM_ALIGN const Word16 *const lpc_pre_emphasis[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 *const lpc_pre_emphasis_e[NUM_SAMP_FREQ]; + +extern RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_e[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_5ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_e_5ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_2_5ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_e_2_5ms[NUM_SAMP_FREQ]; + +extern RAM_ALIGN const Word16 *const lpc_warp_dee_emphasis[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 *const lpc_warp_dee_emphasis_e[NUM_SAMP_FREQ]; + +extern RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_7_5ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 *const lpc_lin_pre_emphasis_e_7_5ms[NUM_SAMP_FREQ]; +#ifdef FIX_PLC_CONFORM_ISSUES +extern RAM_ALIGN const Word16* const lpc_lin_pre_emphasis_1_25ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16* const lpc_lin_pre_emphasis_e_1_25ms[NUM_SAMP_FREQ]; +#endif + +extern RAM_ALIGN const Word16 bands_nrg_scale[32]; + +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word16 *const bands_offset_2_5ms_HR[2]; +extern RAM_ALIGN const Word16 *const bands_offset_5ms_HR[2]; +extern RAM_ALIGN const Word16 *const bands_offset_HR[2]; +#endif + +extern RAM_ALIGN const Word16 *const bands_offset[6]; +extern RAM_ALIGN const Word16 bands_offset_with_one_max[NUM_OFFSETS]; +extern RAM_ALIGN const Word16 bands_offset_with_two_max[NUM_OFFSETS]; + +extern RAM_ALIGN const Word16 bands_number_5ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 *const bands_offset_5ms[6]; +extern RAM_ALIGN const Word16 bands_offset_with_one_max_5ms[NUM_OFFSETS]; +extern RAM_ALIGN const Word16 bands_offset_with_two_max_5ms[NUM_OFFSETS]; +extern RAM_ALIGN const Word16 bands_number_2_5ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 *const bands_offset_2_5ms[6]; +extern RAM_ALIGN const Word16 bands_offset_with_one_max_2_5ms[NUM_OFFSETS]; +extern RAM_ALIGN const Word16 bands_offset_with_two_max_2_5ms[NUM_OFFSETS]; + +extern RAM_ALIGN const Word16 bands_number_7_5ms[]; +#ifndef GENERATE_BAND_TABLES +extern RAM_ALIGN const Word16 *const bands_offset_7_5ms[5]; +#endif +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word16 bands_number_7_5ms_HR[]; +#ifndef GENERATE_BAND_TABLES +extern RAM_ALIGN const Word16 *const bands_offset_7_5ms_HR[2]; +#endif +#endif + +extern RAM_ALIGN const Word16 pitch_max[5]; +extern RAM_ALIGN const Word16 plc_preemph_fac[NUM_SAMP_FREQ]; + +extern RAM_ALIGN const Word16 TDC_high_16[11]; +extern RAM_ALIGN const Word16 TDC_high_32[11]; +extern RAM_ALIGN const Word16 TDC_high_16_harm[11]; +extern RAM_ALIGN const Word16 TDC_high_32_harm[11]; + +extern RAM_ALIGN const Word32 *const lag_win[NUM_SAMP_FREQ]; + +extern RAM_ALIGN const Word16 *const bands_offset_lin[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 bands_offset_with_one_max_lin[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 bands_offset_with_two_max_lin[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 *const bands_offset_lin_5ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 bands_offset_with_one_max_lin_5ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 bands_offset_with_two_max_lin_5ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 *const bands_offset_lin_2_5ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 bands_offset_with_one_max_lin_2_5ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 bands_offset_with_two_max_lin_2_5ms[NUM_SAMP_FREQ]; + +extern RAM_ALIGN const Word16 bands_offset_with_one_max_7_5ms[NUM_OFFSETS]; +extern RAM_ALIGN const Word16 bands_offset_with_two_max_7_5ms[NUM_OFFSETS]; +extern RAM_ALIGN const Word16 *const bands_offset_lin_7_5ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 bands_offset_with_one_max_lin_7_5ms[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 bands_offset_with_two_max_lin_7_5ms[NUM_SAMP_FREQ]; + +extern RAM_ALIGN const Word32 inv_odft_twiddle_80_re[M]; +extern RAM_ALIGN const Word32 inv_odft_twiddle_80_im[M]; +extern RAM_ALIGN const Word32 inv_odft_twiddle_60_re[M]; +extern RAM_ALIGN const Word32 inv_odft_twiddle_60_im[M]; +extern RAM_ALIGN const Word32 inv_odft_twiddle_40_re[M]; +extern RAM_ALIGN const Word32 inv_odft_twiddle_40_im[M]; +#ifdef FIX_PLC_CONFORM_ISSUES +extern RAM_ALIGN const Word32 inv_odft_twiddle_30_re[M]; +extern RAM_ALIGN const Word32 inv_odft_twiddle_30_im[M]; +#endif +extern RAM_ALIGN const Word32 inv_odft_twiddle_20_re[M]; +extern RAM_ALIGN const Word32 inv_odft_twiddle_20_im[M]; + +#ifdef SUBSET_WB +extern RAM_ALIGN const Word16 resamp_filt_16k[240]; +#else +extern RAM_ALIGN const Word16 resamp_filt_16k[1]; +#endif +#ifdef SUBSET_SSWB +extern RAM_ALIGN const Word16 resamp_filt_24k[240]; +#else +extern RAM_ALIGN const Word16 resamp_filt_24k[1]; +#endif +#ifdef SUBSET_SWB +extern RAM_ALIGN const Word16 resamp_filt_32k[240]; +#else +extern RAM_ALIGN const Word16 resamp_filt_32k[1]; +#endif +#ifdef SUBSET_FB +extern RAM_ALIGN const Word16 resamp_filt_48k[240]; +#else +extern RAM_ALIGN const Word16 resamp_filt_48k[1]; +#endif + +extern RAM_ALIGN const Word16 resamp_params[NUM_SAMP_FREQ][4]; +extern RAM_ALIGN const Word16 *const resamp_filts[NUM_SAMP_FREQ]; + +extern RAM_ALIGN const Word16 highpass50_filt_num[3]; +extern RAM_ALIGN const Word16 highpass50_filt_den[2]; + +extern RAM_ALIGN const Word16 olpa_ac_weighting[98]; + +extern RAM_ALIGN const Word16 ltpf_ac_interp_filt[7][9]; +extern RAM_ALIGN const Word16 inter_filter[5][4][12]; +extern RAM_ALIGN const Word16 inter_filter_shift[5]; +extern RAM_ALIGN const Word16 inter_filter_len[5]; +extern RAM_ALIGN const Word16 tilt_filter[5][4][11]; +extern RAM_ALIGN const Word16 tilt_filter_len[5]; +extern RAM_ALIGN const Word16 gain_scale_fac[4]; +extern RAM_ALIGN const UWord16 pitch_scale[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 ltpf_overlap_len[NUM_SAMP_FREQ]; + +extern RAM_ALIGN const Word16 sns_vq_reg_adj_scf[2]; +extern RAM_ALIGN const Word16 sns_vq_reg_lf_adj_scf[4]; +extern RAM_ALIGN const Word16 sns_vq_near_adj_scf[4]; +extern RAM_ALIGN const Word16 sns_vq_far_adj_scf[8]; +extern RAM_ALIGN const Word16 *const sns_gaintabPtr[4]; +extern RAM_ALIGN const Word16 sns_gainSz[4]; +extern RAM_ALIGN const Word16 sns_gainMSBbits[4]; +extern RAM_ALIGN const Word16 sns_gainLSBbits[4]; +extern RAM_ALIGN const Word16 sns_Kval[4][2]; +extern RAM_ALIGN const UWord32 sns_MPVQ_Sz[4][2]; + +#ifdef CR9_C_ADD_1p25MS_LRSNS +extern RAM_ALIGN const Word16 st1SCF0_7_base5_32x8_Q11[256 * 2]; +extern RAM_ALIGN const Word16 st1SCF8_15_base5_32x8_Q11[256 * 2]; +#else +extern RAM_ALIGN const Word16 st1SCF0_7_base5_32x8_Q11[256]; +extern RAM_ALIGN const Word16 st1SCF8_15_base5_32x8_Q11[256]; +#endif + +#ifdef CR9_C_ADD_1p25MS_LRSNS +extern RAM_ALIGN const Word16 lrsns_ltp_bits_fx[8]; +extern RAM_ALIGN const Word16 *const lrsns_vq_gainsQ12_fx[SNSLR_MAX_PVQ_SEARCH_CAND]; +extern RAM_ALIGN const Word16 lrsns_vq_gain_lvls_fx[SNSLR_MAX_PVQ_SEARCH_CAND]; + +extern RAM_ALIGN const Word16 lrsns_cbA_fx[2 * 16]; + +/*LRSNS tables to construct st1B from legacy st1(LF,HF) Q11 tables */ +extern RAM_ALIGN const Word16 lrsns_st1B_merged170orderSortedSegmCnt_fx[4]; +extern RAM_ALIGN const Word16 lrsns_st1B_merged170orderSortedSegmCum_fx[5]; +extern RAM_ALIGN const Word16 lrsns_st1B_merged170orderSort12bitIdx_fx[170]; +extern RAM_ALIGN const Word32 lrsns_st1B_enBy2TabW32_fx[2 * 32]; + +/*LRSNS tables to construct st1C from Word8in Q7 and a Q4 scalefactor */ +#ifdef LRSNS_CBC_NO_LTPF_DEPENDENCY +extern RAM_ALIGN const Word16 * lrsns_st1CTrainedMapMeans_fx[2]; +#else +extern RAM_ALIGN const Word16 * lrsns_st1CTrainedMapMeans_fx[3]; +#endif +extern RAM_ALIGN const Word16 lrsns_st1C_Both_EnBy2Tab_fx[170]; +extern RAM_ALIGN const Word16 lrsns_st1C_Both_scaleQ4_7p4bits_fx[2]; +extern RAM_ALIGN const Word16 lrsns_st1C_Both_inv_scaleQ15_7p4bits_fx[2]; +extern RAM_ALIGN const Word8 lrsns_st1C_Both_Word8_fx[170 * 16]; + +#endif + +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word32 st1SCF0_7_base5_32x8_Q27[256]; +extern RAM_ALIGN const Word32 st1SCF8_15_base5_32x8_Q27[256]; +#endif + +/* PVQ deindexing tables */ +extern RAM_ALIGN const UWord32 h_memN16K12[12 + 2]; +extern RAM_ALIGN const UWord32 h_memN10K22[22 + 2]; +extern RAM_ALIGN const UWord32 h_memN6K2[2 + 2]; +extern RAM_ALIGN const Word16 tabledKMAX[16 + 1]; +extern RAM_ALIGN const UWord32 *const MPVQ_offs_ptr[16 + 1]; + +extern RAM_ALIGN const Word16 isqrt_Q16tab[1 + SQRT_EN_MAX_FX]; + +#ifdef CR9_C_ADD_1p25MS_LRSNS +extern RAM_ALIGN const Word16 isqrt_Q15tab[1 + 6]; +extern RAM_ALIGN const Word32 isqrt_Q31tab[1 + SQRT_EN_MAX_FX]; +#else +#ifdef ENABLE_HR_MODE +extern RAM_ALIGN const Word32 isqrt_Q31tab[1 + SQRT_EN_MAX_FX]; +#endif +#endif + +#ifdef CR9_C_ADD_1p25MS_LRSNS +extern RAM_ALIGN const Word16 lrsns_signs_fix_fx[SNSLR_N_FIXENV]; +extern RAM_ALIGN const Word16 *lrsns_fix_env_fx[SNSLR_N_FIXENV]; + +extern RAM_ALIGN const Word16 lrsns_fixenv_enQ0[SNSLR_N_FIXENV * SNSLR_N_FIXENV_SHIFTS]; +extern RAM_ALIGN const Word16 lrsns_fixenv_enNormQ19[SNSLR_N_FIXENV * SNSLR_N_FIXENV_SHIFTS]; +extern RAM_ALIGN const Word32 L_lrsns_fixenv_enNormQ35[SNSLR_N_FIXENV * SNSLR_N_FIXENV_SHIFTS]; + +extern RAM_ALIGN const Word16 lrsns_norm_factorQ_L[N_SCF_SEARCH_SHAPES_ST2_LR]; +extern RAM_ALIGN const Word16 lrsns_y_up_bits[N_SCF_SEARCH_SHAPES_ST2_LR]; +#endif + +extern RAM_ALIGN const Word16 adjust_global_gain_tables[5][NUM_SAMP_FREQ]; + +extern RAM_ALIGN const Word16 sqrt_table_phecu[]; +extern RAM_ALIGN const Word16 POW_ATT_TABLE0[]; +extern RAM_ALIGN const Word16 POW_ATT_TABLE1[]; +#ifdef PLC2_FADEOUT_IN_MS +#if PLC2_FADEOUT_IN_MS == 0 +extern RAM_ALIGN const Word16 *const POW_ATT_TABLES[3]; +#else +extern RAM_ALIGN const Word16 fade_scheme_tab_fx[24 / 2][3]; +extern RAM_ALIGN const Word16 *const POW_ATT_TABLES[1+24/2]; + +#endif +#else +extern RAM_ALIGN const Word16 *const POW_ATT_TABLES[3]; +#endif + +extern RAM_ALIGN const Word16 scATHFx[7]; + +extern RAM_ALIGN const Word16 e_tot_headroom[]; +extern RAM_ALIGN const Word16 xfp_wE_MDCT2FFTQ11[]; + +extern RAM_ALIGN const Word16 num_FsByResQ0[5]; +extern RAM_ALIGN const Word16 *const LprotSzPtr; +extern RAM_ALIGN const Word16 InvLprot_Q22[5]; +extern RAM_ALIGN const Word16 PhEcuFftScale[5]; +extern RAM_ALIGN const Word16 oneOverFrameQ15Tab[5]; +extern RAM_ALIGN const Word16 PhEcu_Xsav_Flt2FxDnShift[]; +extern RAM_ALIGN const Word16 PhEcu_Xsav_Flt2FxScaleQ15[]; +extern RAM_ALIGN const Word16 PhEcu_frac_thr_rise_lin_Q15[]; +extern RAM_ALIGN const Word16 PhEcu_frac_thr_decay_lin_Q15[]; + +extern RAM_ALIGN const Word16 mdct_grp_bins_fx[]; +extern RAM_ALIGN const Word16 xavg_N_grp_fx[]; +extern RAM_ALIGN const Word16 spec_shape_headroom[]; +extern RAM_ALIGN const Word16 rectLengthTab[NUM_SAMP_FREQ]; +extern RAM_ALIGN const Word16 hamm_len2Tab[]; + +extern RAM_ALIGN const Word16 gw_len_inv_shift_fx[]; +extern RAM_ALIGN const Word16 gwlpr_fx[]; + +extern RAM_ALIGN const Word16 sin_quarterQ15_fx[]; +extern RAM_ALIGN const Word16 sincos_lowres_tab_sinQ15_fx[]; + +extern RAM_ALIGN const Word16 *const PhECU_wins[5][3]; + +extern RAM_ALIGN const Word16 *const w_new[]; +extern RAM_ALIGN const Word16 *const w_old[]; + +/* extern RAM_ALIGN const Word16 WORK_LEN[]; */ +extern RAM_ALIGN const Word16 COPY_LEN[]; +extern RAM_ALIGN const Word16 OLA_LEN[]; + +extern const Word16 plc_fadeout_param_maxlen[4]; +extern const Word16 plc_fadeout_param_maxbytes[4]; +extern RAM_ALIGN const Word16 PLC_FADEOUT_TYPE_2_SELECTOR; + +#endif /* CONSTANTS_H */ diff --git a/lib_lc3plus/cutoff_bandwidth.c b/lib_lc3plus/cutoff_bandwidth.c new file mode 100644 index 0000000000000000000000000000000000000000..5225cd0e864407699d5cee28e70717e129d1d607 --- /dev/null +++ b/lib_lc3plus/cutoff_bandwidth.c @@ -0,0 +1,28 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +void process_cutoff_bandwidth(Word32 d_fx[], Word16 len, Word16 bw_bin) +{ + Counter i = 0; + if (len > bw_bin){ + /* roll off */ + for (i = -1; i < 3; i++) { + d_fx[bw_bin + i] = L_shr(d_fx[bw_bin + i], add(i, 2)); + } + + for (i = bw_bin + 3; i < len; i++) { + d_fx[i] = 0; move32(); + } + } +} + diff --git a/lib_lc3plus/dct2_fx.c b/lib_lc3plus/dct2_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..63d5132198a15684d36a1e712dcc9a0f53eb874d --- /dev/null +++ b/lib_lc3plus/dct2_fx.c @@ -0,0 +1,654 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +#ifdef CR9_C_ADD_1p25MS_LRSNS +#ifndef USE_LC3_OPERATORS +#include "enh40.h" +#endif +#endif + +void idct16_fx(const Word16 *in, Word16 *out) +{ + Dyn_Mem_Deluxe_In( + Word16 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15; + Word16 b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15; + ); + + a8 = add(mult_r(in[1], 1136), mult_r(in[15], -11529)); /* Sπ/32/√8 -S15π/32/√8 */ + a9 = add(mult_r(in[9], 8956), mult_r(in[7], -7350)); /* S9π/32/√8 -S7π/32/√8 */ + a10 = add(mult_r(in[5], 5461), mult_r(in[11], -10217)); /* S5π/32/√8 -S11π/32/√8 */ + a11 = add(mult_r(in[13], 11086), mult_r(in[3], -3363)); /* S13π/32/√8 -S3π/32/√8 */ + a12 = add(mult_r(in[3], 11086), mult_r(in[13], 3363)); /* C3π/32/√8 C13π/32/√8 */ + a13 = add(mult_r(in[11], 5461), mult_r(in[5], 10217)); /* C11π/32/√8 C5π/32/√8 */ + a14 = add(mult_r(in[7], 8956), mult_r(in[9], 7350)); /* C7π/32/√8 C9π/32/√8 */ + a15 = add(mult_r(in[15], 1136), mult_r(in[1], 11529)); /* C15π/32/√8 Cπ/32/√8 */ + + b4 = add(mult_r(in[2], 2260), mult_r(in[14], -11363)); /* Sπ/16/√8 -S7π/16/√8 */ + b5 = add(mult_r(in[10], 9633), mult_r(in[6], -6436)); /* S5π/16/√8 -S3π/16/√8 */ + b6 = add(mult_r(in[6], 9633), mult_r(in[10], 6436)); /* C3π/16/√8 C5π/16/√8 */ + b7 = add(mult_r(in[14], 2260), mult_r(in[2], 11363)); /* C7π/16/√8 Cπ/16/√8 */ + b8 = add(a9, a8); + b9 = sub(a8, a9); + b10 = sub(a11, a10); + b11 = add(a10, a11); + b12 = add(a13, a12); + b13 = sub(a12, a13); + b14 = sub(a15, a14); + b15 = add(a14, a15); + + a0 = add(mult_r(in[0], 8192), mult_r(in[8], 8192)); /* Cπ/4/√8 Cπ/4/√8 */ + a1 = add(mult_r(in[8], -8192), mult_r(in[0], 8192)); /* -Cπ/4/√8 Cπ/4/√8 */ + a2 = add(mult_r(in[4], 4433), mult_r(in[12], -10703)); /* Sπ/8/√8 -S3π/8/√8 */ + a3 = add(mult_r(in[12], 4433), mult_r(in[4], 10703)); /* C3π/8/√8 Cπ/8/√8 */ + a4 = add(b5, b4); + a5 = sub(b4, b5); + a6 = sub(b7, b6); + a7 = add(b6, b7); + a8 = b8; move16(); + a9 = add(mult_r(b9, -30274), mult_r(b14, 12540)); /* -Cπ/8 C3π/8 */ + a10 = add(mult_r(b10, -12540), mult_r(b13, -30274)); /* -Sπ/8 -S3π/8 */ + a11 = b11; move16(); + a12 = b12; move16(); + a13 = add(mult_r(b13, 12540), mult_r(b10, -30274)); /* C3π/8 -Cπ/8 */ + a14 = add(mult_r(b14, 30274), mult_r(b9, 12540)); /* S3π/8 Sπ/8 */ + a15 = b15; move16(); + + b0 = add(a3, a0); + b1 = add(a2, a1); + b2 = sub(a1, a2); + b3 = sub(a0, a3); + b4 = a4; move16(); + b5 = add(mult_r(a5, -23170), mult_r(a6, 23170)); /* -Cπ/4 Cπ/4 */ + b6 = add(mult_r(a6, 23170), mult_r(a5, 23170)); /* Cπ/4 Cπ/4 */ + b7 = a7; move16(); + b8 = add(a11, a8); + b9 = add(a10, a9); + b10 = sub(a9, a10); + b11 = sub(a8, a11); + b12 = sub(a15, a12); + b13 = sub(a14, a13); + b14 = add(a13, a14); + b15 = add(a12, a15); + + a0 = add(b7, b0); + a1 = add(b6, b1); + a2 = add(b5, b2); + a3 = add(b4, b3); + a4 = sub(b3, b4); + a5 = sub(b2, b5); + a6 = sub(b1, b6); + a7 = sub(b0, b7); + a10 = add(mult_r(b10, -23170), mult_r(b13, 23170)); /* -Cπ/4 Cπ/4 */ + a11 = add(mult_r(b11, -23170), mult_r(b12, 23170)); /* -Cπ/4 Cπ/4 */ + a12 = add(mult_r(b12, 23170), mult_r(b11, 23170)); /* Cπ/4 Cπ/4 */ + a13 = add(mult_r(b13, 23170), mult_r(b10, 23170)); /* Cπ/4 Cπ/4 */ + + out[0] = add(b15, a0); move16(); + out[1] = add(b14, a1); move16(); + out[2] = add(a13, a2); move16(); + out[3] = add(a12, a3); move16(); + out[4] = add(a11, a4); move16(); + out[5] = add(a10, a5); move16(); + out[6] = add(b9, a6); move16(); + out[7] = add(b8, a7); move16(); + out[8] = sub(a7, b8); move16(); + out[9] = sub(a6, b9); move16(); + out[10] = sub(a5, a10); move16(); + out[11] = sub(a4, a11); move16(); + out[12] = sub(a3, a12); move16(); + out[13] = sub(a2, a13); move16(); + out[14] = sub(a1, b14); move16(); + out[15] = sub(a0, b15); move16(); + + Dyn_Mem_Deluxe_Out(); +} + +void dct32_fx(const Word32 *in, Word32 *out) +{ + Dyn_Mem_Deluxe_In(Word32 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15; + Word32 b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15;); + + a0 = L_add(in[15], in[0]); + a1 = L_add(in[14], in[1]); + a2 = L_add(in[13], in[2]); + a3 = L_add(in[12], in[3]); + a4 = L_add(in[11], in[4]); + a5 = L_add(in[10], in[5]); + a6 = L_add(in[9], in[6]); + a7 = L_add(in[8], in[7]); + a10 = L_sub(in[5], in[10]); + a11 = L_sub(in[4], in[11]); + a12 = L_sub(in[3], in[12]); + a13 = L_sub(in[2], in[13]); + + b0 = L_add(a7, a0); + b1 = L_add(a6, a1); + b2 = L_add(a5, a2); + b3 = L_add(a4, a3); + b4 = L_sub(a3, a4); + b5 = L_sub_sat(a2, a5); + b6 = L_sub_sat(a1, a6); + b7 = L_sub(a0, a7); + b8 = L_sub(in[7], in[8]); + b9 = L_sub(in[6], in[9]); + b10 = L_add(Mpy_32_16_lc3plus(a10, -23170), Mpy_32_16_lc3plus(a13, 23170)); /* -Cπ/4 Cπ/4 */ + b11 = L_add(Mpy_32_16_lc3plus(a11, -23170), Mpy_32_16_lc3plus(a12, 23170)); /* -Cπ/4 Cπ/4 */ + b12 = L_add(Mpy_32_16_lc3plus(a12, 23170), Mpy_32_16_lc3plus(a11, 23170)); /* Cπ/4 Cπ/4 */ + b13 = L_add(Mpy_32_16_lc3plus(a13, 23170), Mpy_32_16_lc3plus(a10, 23170)); /* Cπ/4 Cπ/4 */ + b14 = L_sub(in[1], in[14]); + b15 = L_sub(in[0], in[15]); + + a0 = L_add(b3, b0); + a1 = L_add(b2, b1); + a2 = L_sub(b1, b2); + a3 = L_sub_sat(b0, b3); + a4 = b4; + move16(); + a5 = L_add(Mpy_32_16_lc3plus(b5, -23170), Mpy_32_16_lc3plus(b6, 23170)); /* -Cπ/4 Cπ/4 */ + a6 = L_add(Mpy_32_16_lc3plus(b6, 23170), Mpy_32_16_lc3plus(b5, 23170)); /* Cπ/4 Cπ/4 */ + a7 = b7; + move16(); + a8 = L_add(b11, b8); + a9 = L_add(b10, b9); + a10 = L_sub(b9, b10); + a11 = L_sub(b8, b11); + a12 = L_sub(b15, b12); + a13 = L_sub(b14, b13); + a14 = L_add(b13, b14); + a15 = L_add(b12, b15); + + out[0] = L_add(Mpy_32_16_lc3plus(a0, 8192), Mpy_32_16_lc3plus(a1, 8192)); + move16(); /* Cπ/4/√8 Cπ/4/√8 */ + out[8] = L_add(Mpy_32_16_lc3plus(a1, -8192), Mpy_32_16_lc3plus(a0, 8192)); + move16(); /* -Cπ/4/√8 Cπ/4/√8 */ + out[4] = L_add(Mpy_32_16_lc3plus(a2, 4433), Mpy_32_16_lc3plus(a3, 10703)); + move16(); /* Sπ/8/√8 Cπ/8/√8 */ + out[12] = L_add(Mpy_32_16_lc3plus(a3, 4433), Mpy_32_16_lc3plus(a2, -10703)); + move16(); /* C3π/8/√8 -S3π/8/√8 */ + b4 = L_add(a5, a4); + b5 = L_sub(a4, a5); + b6 = L_sub_sat(a7, a6); + b7 = L_add(a6, a7); + b8 = a8; + move16(); + b9 = L_add(Mpy_32_16_lc3plus(a9, -30274), Mpy_32_16_lc3plus(a14, 12540)); /* -Cπ/8 Sπ/8 */ + b10 = L_add(Mpy_32_16_lc3plus(a10, -12540), Mpy_32_16_lc3plus(a13, -30274)); /* -Sπ/8 -Cπ/8 */ + b11 = a11; + move16(); + b12 = a12; + move16(); + b13 = L_add(Mpy_32_16_lc3plus(a13, 12540), Mpy_32_16_lc3plus(a10, -30274)); /* C3π/8 -S3π/8 */ + b14 = L_add(Mpy_32_16_lc3plus(a14, 30274), Mpy_32_16_lc3plus(a9, 12540)); /* S3π/8 C3π/8 */ + b15 = a15; + move16(); + + out[2] = L_add(Mpy_32_16_lc3plus(b4, 2260), Mpy_32_16_lc3plus(b7, 11363)); + move16(); /* Sπ/16/√8 Cπ/16/√8 */ + out[10] = L_add(Mpy_32_16_lc3plus(b5, 9633), Mpy_32_16_lc3plus(b6, 6436)); + move16(); /* S5π/16/√8 C5π/16/√8 */ + out[6] = L_add(Mpy_32_16_lc3plus(b6, 9633), Mpy_32_16_lc3plus(b5, -6436)); + move16(); /* C3π/16/√8 -S3π/16/√8 */ + out[14] = L_add(Mpy_32_16_lc3plus(b7, 2260), Mpy_32_16_lc3plus(b4, -11363)); + move16(); /* C7π/16/√8 -S7π/16/√8 */ + + a8 = L_add_sat(b9, b8); + a9 = L_sub_sat(b8, b9); + a10 = L_sub_sat(b11, b10); + a11 = L_add_sat(b10, b11); + a12 = L_add_sat(b13, b12); + a13 = L_sub_sat(b12, b13); + a14 = L_sub_sat(b15, b14); + a15 = L_add_sat(b14, b15); + + out[1] = L_add(Mpy_32_16_lc3plus(a8, 1136), Mpy_32_16_lc3plus(a15, 11529)); + move16(); /* Sπ/32/√8 Cπ/32/√8 */ + out[9] = L_add(Mpy_32_16_lc3plus(a9, 8956), Mpy_32_16_lc3plus(a14, 7350)); + move16(); /* S9π/32/√8 C9π/32/√8 */ + out[5] = L_add(Mpy_32_16_lc3plus(a10, 5461), Mpy_32_16_lc3plus(a13, 10217)); + move16(); /* S5π/32/√8 C5π/32/√8 */ + out[13] = L_add(Mpy_32_16_lc3plus(a11, 11086), Mpy_32_16_lc3plus(a12, 3363)); + move16(); /* S13π/32/√8 C13π/32/√8 */ + out[3] = L_add(Mpy_32_16_lc3plus(a12, 11086), Mpy_32_16_lc3plus(a11, -3363)); + move16(); /* C3π/32/√8 -S3π/32/√8 */ + out[11] = L_add(Mpy_32_16_lc3plus(a13, 5461), Mpy_32_16_lc3plus(a10, -10217)); + move16(); /* C11π/32/√8 -S11π/32/√8 */ + out[7] = L_add(Mpy_32_16_lc3plus(a14, 8956), Mpy_32_16_lc3plus(a9, -7350)); + move16(); /* C7π/32/√8 -S7π/32/√8 */ + out[15] = L_add(Mpy_32_16_lc3plus(a15, 1136), Mpy_32_16_lc3plus(a8, -11529)); + move16(); /* C15π/32/√8 -S15/32/√8 */ + + Dyn_Mem_Deluxe_Out(); +} + +void idct32_fx(const Word32 *in, Word32 *out) +{ + Dyn_Mem_Deluxe_In(Word32 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15; + Word32 b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15;); + + a8 = L_add(Mpy_32_16_lc3plus(in[1], 1136), Mpy_32_16_lc3plus(in[15], -11529)); /* Sπ/32/√8 -S15π/32/√8 */ + a9 = L_add(Mpy_32_16_lc3plus(in[9], 8956), Mpy_32_16_lc3plus(in[7], -7350)); /* S9π/32/√8 -S7π/32/√8 */ + a10 = L_add(Mpy_32_16_lc3plus(in[5], 5461), Mpy_32_16_lc3plus(in[11], -10217)); /* S5π/32/√8 -S11π/32/√8 */ + a11 = L_add(Mpy_32_16_lc3plus(in[13], 11086), Mpy_32_16_lc3plus(in[3], -3363)); /* S13π/32/√8 -S3π/32/√8 */ + a12 = L_add(Mpy_32_16_lc3plus(in[3], 11086), Mpy_32_16_lc3plus(in[13], 3363)); /* C3π/32/√8 C13π/32/√8 */ + a13 = L_add(Mpy_32_16_lc3plus(in[11], 5461), Mpy_32_16_lc3plus(in[5], 10217)); /* C11π/32/√8 C5π/32/√8 */ + a14 = L_add(Mpy_32_16_lc3plus(in[7], 8956), Mpy_32_16_lc3plus(in[9], 7350)); /* C7π/32/√8 C9π/32/√8 */ + a15 = L_add(Mpy_32_16_lc3plus(in[15], 1136), Mpy_32_16_lc3plus(in[1], 11529)); /* C15π/32/√8 Cπ/32/√8 */ + + b4 = L_add(Mpy_32_16_lc3plus(in[2], 2260), Mpy_32_16_lc3plus(in[14], -11363)); /* Sπ/16/√8 -S7π/16/√8 */ + b5 = L_add(Mpy_32_16_lc3plus(in[10], 9633), Mpy_32_16_lc3plus(in[6], -6436)); /* S5π/16/√8 -S3π/16/√8 */ + b6 = L_add(Mpy_32_16_lc3plus(in[6], 9633), Mpy_32_16_lc3plus(in[10], 6436)); /* C3π/16/√8 C5π/16/√8 */ + b7 = L_add(Mpy_32_16_lc3plus(in[14], 2260), Mpy_32_16_lc3plus(in[2], 11363)); /* C7π/16/√8 Cπ/16/√8 */ + b8 = L_add(a9, a8); + b9 = L_sub(a8, a9); + b10 = L_sub(a11, a10); + b11 = L_add(a10, a11); + b12 = L_add(a13, a12); + b13 = L_sub(a12, a13); + b14 = L_sub(a15, a14); + b15 = L_add(a14, a15); + + a0 = L_add(Mpy_32_16_lc3plus(in[0], 8192), Mpy_32_16_lc3plus(in[8], 8192)); /* Cπ/4/√8 Cπ/4/√8 */ + a1 = L_add(Mpy_32_16_lc3plus(in[8], -8192), Mpy_32_16_lc3plus(in[0], 8192)); /* -Cπ/4/√8 Cπ/4/√8 */ + a2 = L_add(Mpy_32_16_lc3plus(in[4], 4433), Mpy_32_16_lc3plus(in[12], -10703)); /* Sπ/8/√8 -S3π/8/√8 */ + a3 = L_add(Mpy_32_16_lc3plus(in[12], 4433), Mpy_32_16_lc3plus(in[4], 10703)); /* C3π/8/√8 Cπ/8/√8 */ + a4 = L_add(b5, b4); + a5 = L_sub(b4, b5); + a6 = L_sub(b7, b6); + a7 = L_add(b6, b7); + a8 = b8; + move32(); + a9 = L_add(Mpy_32_16_lc3plus(b9, -30274), Mpy_32_16_lc3plus(b14, 12540)); /* -Cπ/8 C3π/8 */ + a10 = L_add(Mpy_32_16_lc3plus(b10, -12540), Mpy_32_16_lc3plus(b13, -30274)); /* -Sπ/8 -S3π/8 */ + a11 = b11; + move32(); + a12 = b12; + move32(); + a13 = L_add(Mpy_32_16_lc3plus(b13, 12540), Mpy_32_16_lc3plus(b10, -30274)); /* C3π/8 -Cπ/8 */ + a14 = L_add(Mpy_32_16_lc3plus(b14, 30274), Mpy_32_16_lc3plus(b9, 12540)); /* S3π/8 Sπ/8 */ + a15 = b15; + move32(); + + b0 = L_add(a3, a0); + b1 = L_add(a2, a1); + b2 = L_sub(a1, a2); + b3 = L_sub(a0, a3); + b4 = a4; + move32(); + b5 = L_add(Mpy_32_16_lc3plus(a5, -23170), Mpy_32_16_lc3plus(a6, 23170)); /* -Cπ/4 Cπ/4 */ + b6 = L_add(Mpy_32_16_lc3plus(a6, 23170), Mpy_32_16_lc3plus(a5, 23170)); /* Cπ/4 Cπ/4 */ + b7 = a7; + move32(); + b8 = L_add(a11, a8); + b9 = L_add(a10, a9); + b10 = L_sub(a9, a10); + b11 = L_sub(a8, a11); + b12 = L_sub(a15, a12); + b13 = L_sub(a14, a13); + b14 = L_add(a13, a14); + b15 = L_add(a12, a15); + + a0 = L_add(b7, b0); + a1 = L_add(b6, b1); + a2 = L_add(b5, b2); + a3 = L_add(b4, b3); + a4 = L_sub(b3, b4); + a5 = L_sub(b2, b5); + a6 = L_sub(b1, b6); + a7 = L_sub(b0, b7); + a10 = L_add(Mpy_32_16_lc3plus(b10, -23170), Mpy_32_16_lc3plus(b13, 23170)); /* -Cπ/4 Cπ/4 */ + a11 = L_add(Mpy_32_16_lc3plus(b11, -23170), Mpy_32_16_lc3plus(b12, 23170)); /* -Cπ/4 Cπ/4 */ + a12 = L_add(Mpy_32_16_lc3plus(b12, 23170), Mpy_32_16_lc3plus(b11, 23170)); /* Cπ/4 Cπ/4 */ + a13 = L_add(Mpy_32_16_lc3plus(b13, 23170), Mpy_32_16_lc3plus(b10, 23170)); /* Cπ/4 Cπ/4 */ + + out[0] = L_add(b15, a0); + move32(); + out[1] = L_add(b14, a1); + move32(); + out[2] = L_add(a13, a2); + move32(); + out[3] = L_add(a12, a3); + move32(); + out[4] = L_add(a11, a4); + move32(); + out[5] = L_add(a10, a5); + move32(); + out[6] = L_add(b9, a6); + move32(); + out[7] = L_add(b8, a7); + move32(); + out[8] = L_sub(a7, b8); + move32(); + out[9] = L_sub(a6, b9); + move32(); + out[10] = L_sub(a5, a10); + move32(); + out[11] = L_sub(a4, a11); + move32(); + out[12] = L_sub(a3, a12); + move32(); + out[13] = L_sub(a2, a13); + move32(); + out[14] = L_sub(a1, b14); + move32(); + out[15] = L_sub(a0, b15); + move32(); + + Dyn_Mem_Deluxe_Out(); +} + +void idct32_32_fx(const Word32 *in, Word32 *out) +{ + Dyn_Mem_Deluxe_In(Word32 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15; + Word32 b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15;); + + /*round(sin(pi*(1:16)/32)/sqrt(8)*2^31) = + 74419526 148122351 220398677 290552444 357908031 421816769 481663180 536870912 + 586908283 631293407 669598830 701455651 726557070 744661347 755594128 759250125 + */ + /*ound(cos(pi*(1:16)/32)/sqrt(8)*2^31) = + 755594128 744661347 726557070 701455651 669598830 631293407 586908283 536870912 + 481663180 421816769 357908031 290552444 220398677 148122351 74419526 0 + */ + + a8 = L_add(Mpy_32_32_lc3plus(in[1], 74419526), Mpy_32_32_lc3plus(in[15], -755594128)); /* Sπ/32/√8 -S15π/32/√8 */ + a9 = L_add(Mpy_32_32_lc3plus(in[9], 586908283), Mpy_32_32_lc3plus(in[7], -481663180)); /* S9π/32/√8 -S7π/32/√8 */ + a10 = L_add(Mpy_32_32_lc3plus(in[5], 357908031), Mpy_32_32_lc3plus(in[11], -669598830)); /* S5π/32/√8 -S11π/32/√8 */ + a11 = L_add(Mpy_32_32_lc3plus(in[13], 726557070), Mpy_32_32_lc3plus(in[3], -220398677)); /* S13π/32/√8 -S3π/32/√8 */ + + a12 = L_add(Mpy_32_32_lc3plus(in[3], 726557070), Mpy_32_32_lc3plus(in[13], 220398677)); /* C3π/32/√8 C13π/32/√8 */ + a13 = L_add(Mpy_32_32_lc3plus(in[11], 357908031), Mpy_32_32_lc3plus(in[5], 669598830)); /* C11π/32/√8 C5π/32/√8 */ + a14 = L_add(Mpy_32_32_lc3plus(in[7], 586908283), Mpy_32_32_lc3plus(in[9], 481663180)); /* C7π/32/√8 C9π/32/√8 */ + a15 = L_add(Mpy_32_32_lc3plus(in[15], 74419526), Mpy_32_32_lc3plus(in[1], 755594128)); /* C15π/32/√8 Cπ/32/√8 */ + + b4 = L_add(Mpy_32_32_lc3plus(in[2], 148122351), Mpy_32_32_lc3plus(in[14], -744661347)); /* Sπ/16/√8 -S7π/16/√8 */ + b5 = L_add(Mpy_32_32_lc3plus(in[10], 631293407), Mpy_32_32_lc3plus(in[6], -421816769)); /* S5π/16/√8 -S3π/16/√8 */ + b6 = L_add(Mpy_32_32_lc3plus(in[6], 631293407), Mpy_32_32_lc3plus(in[10], 421816769)); /* C3π/16/√8 C5π/16/√8 */ + b7 = L_add(Mpy_32_32_lc3plus(in[14], 148122351), Mpy_32_32_lc3plus(in[2], 744661347)); /* C7π/16/√8 Cπ/16/√8 */ + b8 = L_add(a9, a8); + b9 = L_sub(a8, a9); + b10 = L_sub(a11, a10); + b11 = L_add(a10, a11); + b12 = L_add(a13, a12); + b13 = L_sub(a12, a13); + b14 = L_sub(a15, a14); + b15 = L_add(a14, a15); + + a0 = L_add(Mpy_32_32_lc3plus(in[0], 536870912), Mpy_32_32_lc3plus(in[8], 536870912)); /* Cπ/4/√8 Cπ/4/√8 */ + a1 = L_add(Mpy_32_32_lc3plus(in[8], -536870912), Mpy_32_32_lc3plus(in[0], 536870912)); /* -Cπ/4/√8 Cπ/4/√8 */ + a2 = L_add(Mpy_32_32_lc3plus(in[4], 290552444), Mpy_32_32_lc3plus(in[12], -701455651)); /* Sπ/8/√8 -S3π/8/√8 */ + a3 = L_add(Mpy_32_32_lc3plus(in[12], 290552444), Mpy_32_32_lc3plus(in[4], 701455651)); /* C3π/8/√8 Cπ/8/√8 */ + a4 = L_add(b5, b4); + a5 = L_sub(b4, b5); + a6 = L_sub(b7, b6); + a7 = L_add(b6, b7); + a8 = b8; + move32(); + a9 = L_add(Mpy_32_32_lc3plus(b9, -1984016189), Mpy_32_32_lc3plus(b14, 821806413)); /* -Cπ/8 C3π/8 */ + a10 = L_add(Mpy_32_32_lc3plus(b10, -821806413), Mpy_32_32_lc3plus(b13, -1984016189)); /* -Sπ/8 -S3π/8 */ + a11 = b11; + move32(); + a12 = b12; + move32(); + a13 = L_add(Mpy_32_32_lc3plus(b13, 821806413), Mpy_32_32_lc3plus(b10, -1984016189)); /* C3π/8 -Cπ/8 */ + a14 = L_add(Mpy_32_32_lc3plus(b14, 1984016189), Mpy_32_32_lc3plus(b9, 821806413)); /* S3π/8 Sπ/8 */ + a15 = b15; + move32(); + + b0 = L_add(a3, a0); + b1 = L_add(a2, a1); + b2 = L_sub(a1, a2); + b3 = L_sub(a0, a3); + b4 = a4; + move32(); + b5 = L_add(Mpy_32_32_lc3plus(a5, -1518500250), Mpy_32_32_lc3plus(a6, 1518500250)); /* -Cπ/4 Cπ/4 */ + b6 = L_add(Mpy_32_32_lc3plus(a6, 1518500250), Mpy_32_32_lc3plus(a5, 1518500250)); /* Cπ/4 Cπ/4 */ + b7 = a7; + move32(); + b8 = L_add(a11, a8); + b9 = L_add(a10, a9); + b10 = L_sub(a9, a10); + b11 = L_sub(a8, a11); + b12 = L_sub(a15, a12); + b13 = L_sub(a14, a13); + b14 = L_add(a13, a14); + b15 = L_add(a12, a15); + + a0 = L_add(b7, b0); + a1 = L_add(b6, b1); + a2 = L_add(b5, b2); + a3 = L_add(b4, b3); + a4 = L_sub(b3, b4); + a5 = L_sub(b2, b5); + a6 = L_sub(b1, b6); + a7 = L_sub(b0, b7); + a10 = L_add(Mpy_32_32_lc3plus(b10, -1518500250), Mpy_32_32_lc3plus(b13, 1518500250)); /* -Cπ/4 Cπ/4 */ + a11 = L_add(Mpy_32_32_lc3plus(b11, -1518500250), Mpy_32_32_lc3plus(b12, 1518500250)); /* -Cπ/4 Cπ/4 */ + a12 = L_add(Mpy_32_32_lc3plus(b12, 1518500250), Mpy_32_32_lc3plus(b11, 1518500250)); /* Cπ/4 Cπ/4 */ + a13 = L_add(Mpy_32_32_lc3plus(b13, 1518500250), Mpy_32_32_lc3plus(b10, 1518500250)); /* Cπ/4 Cπ/4 */ + + out[0] = L_add(b15, a0); + move32(); + out[1] = L_add(b14, a1); + move32(); + out[2] = L_add(a13, a2); + move32(); + out[3] = L_add(a12, a3); + move32(); + out[4] = L_add(a11, a4); + move32(); + out[5] = L_add(a10, a5); + move32(); + out[6] = L_add(b9, a6); + move32(); + out[7] = L_add(b8, a7); + move32(); + out[8] = L_sub(a7, b8); + move32(); + out[9] = L_sub(a6, b9); + move32(); + out[10] = L_sub(a5, a10); + move32(); + out[11] = L_sub(a4, a11); + move32(); + out[12] = L_sub(a3, a12); + move32(); + out[13] = L_sub(a2, a13); + move32(); + out[14] = L_sub(a1, b14); + move32(); + out[15] = L_sub(a0, b15); + move32(); + + Dyn_Mem_Deluxe_Out(); +} + +#ifdef CR9_C_ADD_1p25MS_LRSNS +void dct16_W32int_fx(const Word16 *in, + Word16 *out) /* for now same Q as input . later potetially reduce Q for output */ +{ + + +#define Mpy_32_16op(Lx,y) Mpy_32_16_lc3plus(Lx, y ) /* two-three cycle count as in existing STL */ +#define Mpy_32_16_0op(Lx,y) Mpy_32_16_0_0(Lx,y ) /* no rounding , STL shift cost still there */ + + + Dyn_Mem_Deluxe_In( + /* Counter i; */ + Word32 L_a0, L_a1, L_a2, L_a3, L_a4, L_a5, L_a6, L_a7, L_a8, L_a9, L_a10, L_a11, L_a12, L_a13, L_a14, L_a15; + Word32 L_b0, L_b1, L_b2, L_b3, L_b4, L_b5, L_b6, L_b7, L_b8, L_b9, L_b10, L_b11, L_b12, L_b13, L_b14, L_b15; + ); +#ifdef WMOPS + push_wmops("dct16_W32int_fx"); +#endif + +#define INMARGIN 0 +#if INMARGIN > 0 +#define INSCALE (1<<(15-INMARGIN) ) +#endif + +#if INMARGIN == 0 + L_a0 = L_deposit_h(add(in[15], in[0])); /* Word16 Q11 deposited 16 levels up, becomes Q27, NB add can still potentially saturate ! */ + L_a1 = L_deposit_h(add(in[14], in[1])); + L_a2 = L_deposit_h(add(in[13], in[2])); + L_a3 = L_deposit_h(add(in[12], in[3])); + L_a4 = L_deposit_h(add(in[11], in[4])); + L_a5 = L_deposit_h(add(in[10], in[5])); + L_a6 = L_deposit_h(add(in[9], in[6])); + L_a7 = L_deposit_h(add(in[8], in[7])); + + L_a10 = L_deposit_h(sub(in[5], in[10])); + L_a11 = L_deposit_h(sub(in[4], in[11])); + L_a12 = L_deposit_h(sub(in[3], in[12])); + L_a13 = L_deposit_h(sub(in[2], in[13])); +#else + /* create higher internal margin */ + /* Q11 deposited 16 levels up, becomes lower than Q27, internal L_aX, L_bx signals becomes Q26, or lower */ + L_a0 = L_mult0(add(in[15], in[0]), INSCALE); + L_a1 = L_mult0(add(in[14], in[1]), INSCALE); + L_a2 = L_mult0(add(in[13], in[2]), INSCALE); + L_a3 = L_mult0(add(in[12], in[3]), INSCALE); + L_a4 = L_mult0(add(in[11], in[4]), INSCALE); + L_a5 = L_mult0(add(in[10], in[5]), INSCALE); + L_a6 = L_mult0(add(in[9], in[6]), INSCALE); + L_a7 = L_mult0(add(in[8], in[7]), INSCALE); + + L_a10 = L_mult0(sub(in[5], in[10]), INSCALE); + L_a11 = L_mult0(sub(in[4], in[11]), INSCALE); + L_a12 = L_mult0(sub(in[3], in[12]), INSCALE); + L_a13 = L_mult0(sub(in[2], in[13]), INSCALE); +#endif + + L_b0 = L_add(L_a7, L_a0); + L_b1 = L_add(L_a6, L_a1); + L_b2 = L_add(L_a5, L_a2); + L_b3 = L_add(L_a4, L_a3); + L_b4 = L_sub(L_a3, L_a4); + L_b5 = L_sub(L_a2, L_a5); + L_b6 = L_sub(L_a1, L_a6); + L_b7 = L_sub(L_a0, L_a7); + +#if INMARGIN == 0 + L_b8 = L_deposit_h(sub(in[7], in[8])); + L_b9 = L_deposit_h(sub(in[6], in[9])); +#else + L_b8 = L_mult0(sub(in[7], in[8]), INSCALE); + L_b9 = L_mult0(sub(in[6], in[9]), INSCALE); +#endif + L_b10 = L_add(Mpy_32_16op(L_a10, -23170), Mpy_32_16op(L_a13, 23170));/* -Cπ/4 Cπ/4 */ + //L_b10 = L_add(L_b10, L_b10); /* scale up due to previous use of L_Mpy_32_16_0op() */ + + L_b11 = L_add(Mpy_32_16op(L_a11, -23170), Mpy_32_16op(L_a12, 23170)); /* -Cπ/4 Cπ/4 */ + //L_b11 = L_add(L_b11, L_b11);/* scale up due to previous use of L_Mpy_32_16_0op() */ + + L_b12 = L_add(Mpy_32_16op(L_a12, 23170), Mpy_32_16op(L_a11, 23170)); /* Cπ/4 Cπ/4 */ + //L_b12 = L_add(L_b12, L_b12);/* scale up due to previous use of L_Mpy_32_16_0op() */ + + L_b13 = L_add(Mpy_32_16op(L_a13, 23170), Mpy_32_16op(L_a10, 23170)); /* Cπ/4 Cπ/4 */ + //L_b13 = L_add(L_b13, L_b13);/* scale up due to previous use of L_Mpy_32_16_0op() */ + +#if INMARGIN == 0 + L_b14 = L_deposit_h(sub(in[1], in[14])); + L_b15 = L_deposit_h(sub(in[0], in[15])); +#else + L_b14 = L_mult0(sub(in[1], in[14]), INSCALE); + L_b15 = L_mult0(sub(in[0], in[15]), INSCALE); +#endif + + /* all inputs processed */ + L_a0 = L_add_sat(L_b3, L_b0); /*saturation was required in dct32_fx()*/ + L_a1 = L_add(L_b2, L_b1); + L_a2 = L_sub(L_b1, L_b2); + L_a3 = L_sub_sat(L_b0, L_b3); /*saturation was required in dct32_fx()*/ + + L_a4 = L_add(L_b4, 0L); + + L_a5 = L_add(Mpy_32_16op(L_b5, -23170), Mpy_32_16op(L_b6, 23170)); /* -Cπ/4 Cπ/4 */ + //L_a5 = L_add(L_a5, L_a5);/* scale up due to previous use of L_Mpy_32_16_0op() */ + L_a6 = L_add(Mpy_32_16op(L_b6, 23170), Mpy_32_16op(L_b5, 23170)); /* Cπ/4 Cπ/4 */ + //L_a6 = L_add(L_a6, L_a6);/* scale up due to previous use of L_Mpy_32_16_0op() */ + + L_a7 = L_add(L_b7, 0L); + L_a8 = L_add(L_b11, L_b8); + L_a9 = L_add(L_b10, L_b9); + + L_a10 = L_sub(L_b9, L_b10); + L_a11 = L_sub(L_b8, L_b11); + + L_a12 = L_sub(L_b15, L_b12); + L_a13 = L_sub(L_b14, L_b13); + + L_a14 = L_add(L_b13, L_b14); + L_a15 = L_add(L_b12, L_b15); + + /* upscaling done by constant doubling */ + out[0] = round_fx(L_add(Mpy_32_16_0op(L_a0, 8192 * 2), Mpy_32_16_0op(L_a1, 8192 * 2))); move16(); /* Cπ/4/√8 Cπ/4/√8 */ + out[8] = round_fx(L_add(Mpy_32_16_0op(L_a1, -8192 * 2), Mpy_32_16_0op(L_a0, 8192 * 2))); move16(); /* -Cπ/4/√8 Cπ/4/√8 */ + out[4] = round_fx(L_add(Mpy_32_16_0op(L_a2, 4433 * 2), Mpy_32_16_0op(L_a3, 10703 * 2))); move16(); /* Sπ/8/√8 Cπ/8/√8 */ + out[12] = round_fx(L_add(Mpy_32_16_0op(L_a3, 4433 * 2), Mpy_32_16_0op(L_a2, -10703 * 2))); move16(); /* C3π/8/√8 -S3π/8/√8 */ + + L_b4 = L_add(L_a5, L_a4); + L_b5 = L_sub_sat(L_a4, L_a5); /*saturation was required in dct32_fx()*/ + L_b6 = L_sub_sat(L_a7, L_a6); /*saturation was required in dct32_fx()*/ + L_b7 = L_add(L_a6, L_a7); + L_b8 = L_add(L_a8, 0L); ; + + L_b9 = L_add(Mpy_32_16op(L_a9, -30274), Mpy_32_16op(L_a14, 12540)); /* -Cπ/8 Sπ/8 */ + L_b10 = L_add(Mpy_32_16op(L_a10, -12540), Mpy_32_16op(L_a13, -30274)); /* -Sπ/8 -Cπ/8 */ + L_b11 = L_add(L_a11, 0L); + L_b12 = L_add(L_a12, 0L); + + L_b13 = L_add(Mpy_32_16op(L_a13, 12540), Mpy_32_16op(L_a10, -30274)); /* C3π/8 -S3π/8 */ + L_b14 = L_add(Mpy_32_16op(L_a14, 30274), Mpy_32_16op(L_a9, 12540)); /* S3π/8 C3π/8 */ + L_b15 = L_add(L_a15, 0L); + + + /* upscaling done by constant doubling */ + out[2] = round_fx(L_add(Mpy_32_16_0op(L_b4, 2260 * 2), Mpy_32_16_0op(L_b7, 11363 * 2))); move16(); /* Sπ/16/√8 Cπ/16/√8 */ + out[10] = round_fx(L_add(Mpy_32_16_0op(L_b5, 9633 * 2), Mpy_32_16_0op(L_b6, 6436 * 2))); move16(); /* S5π/16/√8 C5π/16/√8 */ + out[6] = round_fx(L_add(Mpy_32_16_0op(L_b6, 9633 * 2), Mpy_32_16_0op(L_b5, -6436 * 2))); move16(); /* C3π/16/√8 -S3π/16/√8 */ + out[14] = round_fx(L_add(Mpy_32_16_0op(L_b7, 2260 * 2), Mpy_32_16_0op(L_b4, -11363 * 2))); move16(); /* C7π/16/√8 -S7π/16/√8 */ + + L_a8 = L_add_sat(L_b9, L_b8); /*saturation was required in dct32_fx()*/ + L_a9 = L_sub_sat(L_b8, L_b9); + L_a10 = L_sub_sat(L_b11, L_b10); + L_a11 = L_add_sat(L_b10, L_b11); + L_a12 = L_add_sat(L_b13, L_b12); + L_a13 = L_sub_sat(L_b12, L_b13); + L_a14 = L_sub_sat(L_b15, L_b14); + L_a15 = L_add_sat(L_b14, L_b15); + + /* upscaling done by constant doubling */ + out[1] = round_fx(L_add(Mpy_32_16_0op(L_a8, 1136 * 2), Mpy_32_16_0op(L_a15, 11529 * 2))); move16(); /* Sπ/32/√8 Cπ/32/√8 */ + out[9] = round_fx(L_add(Mpy_32_16_0op(L_a9, 8956 * 2), Mpy_32_16_0op(L_a14, 7350 * 2))); move16(); /* S9π/32/√8 C9π/32/√8 */ + out[5] = round_fx(L_add(Mpy_32_16_0op(L_a10, 5461 * 2), Mpy_32_16_0op(L_a13, 10217 * 2))); move16(); /* S5π/32/√8 C5π/32/√8 */ + out[13] = round_fx(L_add(Mpy_32_16_0op(L_a11, 11086 * 2), Mpy_32_16_0op(L_a12, 3363 * 2))); move16(); /* S13π/32/√8 C13π/32/√8 */ + out[3] = round_fx(L_add(Mpy_32_16_0op(L_a12, 11086 * 2), Mpy_32_16_0op(L_a11, -3363 * 2))); move16(); /* C3π/32/√8 -S3π/32/√8 */ + out[11] = round_fx(L_add(Mpy_32_16_0op(L_a13, 5461 * 2), Mpy_32_16_0op(L_a10, -10217 * 2))); move16();/* C11π/32/√8 -S11π/32/√8 */ + out[7] = round_fx(L_add(Mpy_32_16_0op(L_a14, 8956 * 2), Mpy_32_16_0op(L_a9, -7350 * 2))); move16(); /* C7π/32/√8 -S7π/32/√8 */ + out[15] = round_fx(L_add(Mpy_32_16_0op(L_a15, 1136 * 2), Mpy_32_16_0op(L_a8, -11529 * 2))); move16(); /* C15π/32/√8 -S15/32/√8 */ + + + +#ifdef Mpy_32_16op +#undef Mpy_32_16op +#endif + +#ifdef Mpy_32_16_0op +#undef Mpy_32_16_0op +#endif +#ifdef WMOPS + pop_wmops(); +#endif + Dyn_Mem_Deluxe_Out(); +} +#endif diff --git a/lib_lc3plus/dct4_fx.c b/lib_lc3plus/dct4_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..e5f1ed189c6f0483d2fc245c5719287d33b38a77 --- /dev/null +++ b/lib_lc3plus/dct4_fx.c @@ -0,0 +1,221 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" +#include "rom_basop_util_lc3plus.h" + + +void dct_IV(Word32 *pDat, /* i/o: pointer to data buffer */ + Word16 *pDat_e, /* i/o: pointer to data exponent */ + Word16 L, /* i : length of block */ +#ifdef ENABLE_HR_MODE + Word16 hrmode, /* indicate high precision usage */ +#endif + Word32 *workBuffer) /* : size of L */ + +{ + Word16 sin_step; + Word16 idx; + Word16 M_var; + Word16 M2; + + Word32 *pDat_0; + Word32 *pDat_1; + + Word32 accu1; + Word32 accu2; + Word32 accu3; + Word32 accu4; + + Counter i; + +#ifdef ENABLE_HR_MODE + const PWord32 *twiddle; + const PWord32 *sin_twiddle; +#else + const PWord16 *twiddle; + const PWord16 *sin_twiddle; +#endif + +#ifdef ENABLE_DCTIV_RESCALE + Word16 scale; +#endif + +#ifdef DYNMEM_COUNT +#ifdef ENABLE_HR_MODE + Dyn_Mem_In("dct_IV", sizeof(struct { + Word16 sin_step; + Word16 idx; + Counter i; + Word16 M_var; + Word16 M2; + + Word32 *pDat_0; + Word32 *pDat_1; + + Word32 accu1; + Word32 accu2; + Word32 accu3; + Word32 accu4; + + const PWord32 *twiddle; + const PWord32 *sin_twiddle; + })); + +#else + Dyn_Mem_In("dct_IV", sizeof(struct { + Word16 sin_step; + Word16 idx; + Counter i; + Word16 M_var; + Word16 M2; + + Word32 *pDat_0; + Word32 *pDat_1; + + Word32 accu1; + Word32 accu2; + Word32 accu3; + Word32 accu4; + + const PWord16 *twiddle; + const PWord16 *sin_twiddle; + })); +#endif /* ENABLE_HR_MODE */ +#endif /* DYNMEM_COUNT */ + + M_var = shr_pos_pos(L, 1); + M2 = sub(M_var, 1); + + BASOP_getTables(&twiddle, &sin_twiddle, &sin_step, L); + + pDat_0 = &pDat[0]; + pDat_1 = &pDat[L - 2]; + + FOR (i = 0; i < M_var; i += 2) + { +#ifdef ENABLE_HR_MODE + if (hrmode) { + cplxMpy32_32_32_2(accu1, accu2, pDat_1[1], pDat_0[0], twiddle[i].v.re, twiddle[i].v.im); + cplxMpy32_32_32_2(accu3, accu4, pDat_1[0], pDat_0[1], twiddle[i + 1].v.re, twiddle[i + 1].v.im); + } else { + cplxMpy32_32_16_2(accu1, accu2, pDat_1[1], pDat_0[0], round_fx_sat(twiddle[i].v.re), round_fx_sat(twiddle[i].v.im)); + cplxMpy32_32_16_2(accu3, accu4, pDat_1[0], pDat_0[1], round_fx_sat(twiddle[i + 1].v.re), round_fx_sat(twiddle[i + 1].v.im)); + } +#else + cplxMpy32_32_16_2(accu1, accu2, pDat_1[1], pDat_0[0], twiddle[i].v.re, twiddle[i].v.im); + cplxMpy32_32_16_2(accu3, accu4, pDat_1[0], pDat_0[1], twiddle[i + 1].v.re, twiddle[i + 1].v.im); +#endif + + /* The order of writing the coefficients is not important unless the length is odd, as then the two pointers pDat_0 and pDat_1 would overlap. The order here should be correct as such that the incorrectly calculated coefficient is overwritten with the correctly calculated coefficient. This is happens e.g. for the FFT15, 30 Samples, 1.25 ms @ 24 kHz */ + pDat_1[0] = accu4; move32(); + pDat_1[1] = L_negate(accu3); move32(); + pDat_0[0] = accu2; move32(); + pDat_0[1] = accu1; move32(); + + pDat_0 = pDat_0 + 2; + pDat_1 = pDat_1 - 2; + } + +#ifdef ENABLE_DCTIV_RESCALE + if (hrmode) + { + + scale = s_max(getScaleFactor32(pDat, L), 0); move16(); + + FOR (i = 0; i < L; i++) + { + pDat[i] = L_shl_pos(pDat[i], scale); move32(); + } + + *pDat_e = sub(*pDat_e, scale); move16(); + } +#endif + + BASOP_cfft(&pDat[0], &pDat[1], M_var, 2, pDat_e, workBuffer); + + pDat_0 = &pDat[0]; + pDat_1 = &pDat[L - 2]; + + idx = sin_step; + M2 = sub(shr_pos_pos(add(M_var, 1), 1), 1); + + /* Sin and Cos values are 0.0f and 1.0f */ +#ifdef ENABLE_HR_MODE + cplxMpy32_32_32_2(accu3, accu4, pDat_1[0], pDat_1[1], sin_twiddle[idx].v.re, sin_twiddle[idx].v.im); +#else + cplxMpy32_32_16_2(accu3, accu4, pDat_1[0], pDat_1[1], sin_twiddle[idx].v.re, sin_twiddle[idx].v.im); +#endif + + pDat_1[1] = L_negate(L_shr_pos(pDat_0[1], 1)); move32(); + pDat_0[0] = L_shr_pos(pDat_0[0], 1); move32(); + + FOR (i = 1; i < M2; i++) + { + pDat_0[1] = accu3; move32(); + pDat_1[0] = accu4; move32(); + + pDat_0 = pDat_0 + 2; + pDat_1 = pDat_1 - 2; + +#ifdef ENABLE_HR_MODE + cplxMpy32_32_32_2(accu1, accu2, pDat_0[1], pDat_0[0], sin_twiddle[idx].v.re, sin_twiddle[idx].v.im); +#else + cplxMpy32_32_16_2(accu1, accu2, pDat_0[1], pDat_0[0], sin_twiddle[idx].v.re, sin_twiddle[idx].v.im); +#endif + + idx += sin_step; + +#ifdef ENABLE_HR_MODE + cplxMpy32_32_32_2(accu3, accu4, pDat_1[0], pDat_1[1], sin_twiddle[idx].v.re, sin_twiddle[idx].v.im); +#else + cplxMpy32_32_16_2(accu3, accu4, pDat_1[0], pDat_1[1], sin_twiddle[idx].v.re, sin_twiddle[idx].v.im); +#endif + + pDat_1[1] = L_negate(accu1); move32(); + pDat_0[0] = accu2; move32(); + } + + pDat_0[1] = accu3; move32(); + pDat_1[0] = accu4; move32(); + + pDat_0 = pDat_0 + 2; + pDat_1 = pDat_1 - 2; + +#ifdef ENABLE_HR_MODE + cplxMpy32_32_32_2(accu3, accu4, pDat_0[1], pDat_0[0], sin_twiddle[idx].v.re, sin_twiddle[idx].v.im); +#else + cplxMpy32_32_16_2(accu3, accu4, pDat_0[1], pDat_0[0], sin_twiddle[idx].v.re, sin_twiddle[idx].v.im); +#endif + +/* Last Sin and Cos value pair are the same */ +#ifdef ENABLE_HR_MODE + accu1 = L_shr_pos(Mpy_32_32_lc3plus(pDat_1[0], TWIDDLE), 1); + accu2 = L_shr_pos(Mpy_32_32_lc3plus(pDat_1[1], TWIDDLE), 1); +#else + accu1 = L_shr_pos(Mpy_32_16_lc3plus(pDat_1[0], TWIDDLE), 1); + accu2 = L_shr_pos(Mpy_32_16_lc3plus(pDat_1[1], TWIDDLE), 1); +#endif + + pDat_1[0] = L_add(accu1, accu2); move32(); + pDat_0[1] = L_sub(accu1, accu2); move32(); + + pDat_1[1] = L_negate(accu3); move32(); + pDat_0[0] = accu4; move32(); + + /* twiddeling scale is 2 */ + *pDat_e = add(*pDat_e, 2); move16(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + diff --git a/lib_lc3plus/dec_entropy.c b/lib_lc3plus/dec_entropy.c new file mode 100644 index 0000000000000000000000000000000000000000..20582f47ba9b7ac01c5d7b379c34b8084906ac51 --- /dev/null +++ b/lib_lc3plus/dec_entropy.c @@ -0,0 +1,998 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + + + +#ifdef CR9_C_ADD_1p25MS_LRSNS + +static void readSNSData_fx(UWord8* ptr, + Word16* bfiPtr, + Word16* mask_side, + Word16* bp_side, + Word16* ltpf_idx_2_lrsns, + Word32* L_scf_idx, + LC3PLUS_FrameDuration frame_dms); + +#endif + +static Word16 read_indice(UWord8 *ptr, Word16 *bp, Word16 *mask, Word16 numbits) +{ + Dyn_Mem_Deluxe_In( + Word16 indice, bit; + Counter i; + ); + + indice = read_bit(ptr, bp, mask); + + FOR (i = 1; i < numbits; i++) + { + bit = read_bit(ptr, bp, mask); + indice = add(indice, lshl_pos(bit, i)); + } + + Dyn_Mem_Deluxe_Out(); + return indice; +} + +static Word16 ac_dec_split_st2VQ_CW( /* local BER flag */ + const Word32 L_cwRx, /* max 25 bits */ + const Word32 L_szA, const Word32 L_szB, Word32 *L_cwA, Word32 *L_cwB, + Word16 *submodeLSB); + +void processDecoderEntropy_fx(UWord8 *bytes, Word16 *bp_side, Word16 *mask_side, Word16 nbbits, + Word16 L_spec, Word16 fs_idx, Word16 BW_cutoff_bits, Word16 *tns_numfilters, + Word16 *lsbMode, Word16 *lastnz, Word16 *bfi, Word16 *tns_order, Word16 *fac_ns_idx, + Word16 *gg_idx, Word16 *BW_cutoff_idx, Word16 *ltpf_idx, Word32 *L_scf_idx, + LC3PLUS_FrameDuration frame_dms +#ifdef CR9_C_ADD_1p25MS + , Word16 rx_status[2], Word16* mem_continuation +#ifdef NEW_SIGNALLING_SCHEME_1p25 + ,Word16 *ltpfinfo_frame_cntr_fx /* set here , but also increased outside by bfi for the channel */ +#endif +#endif + + ) +{ +#ifdef CR9_C_ADD_1p25MS_LRSNS + Dyn_Mem_Deluxe_In( + Word16 L; + Word32 tmp32; + Word16 gain_e, gain; + Counter n; + UWord8 * ptr; + Word16 ltpf_idx_2_lrsns[3]; + Word16 bfiSNS; + ); +#else + Dyn_Mem_Deluxe_In( + Word16 L, submodeLSB; + Word32 tmp32, tmp32lim; + Word16 gain_e, gain, submodeMSB, BER_detect; + Counter n; + UWord8 * ptr; ); +#endif + +#if !defined(LRSNS_PC_SIGNAL_FIX) && defined(CR9_C_ADD_1p25MS_LRSNS) + UNUSED(bfiSNS); +#endif + + ptr = bytes; + *bp_side = shr_pos(sub(nbbits, 1), 3); + *mask_side = shl(1, sub(8, sub(nbbits, shl_pos(*bp_side, 3)))); + + /* Cutoff-detection */ + IF (BW_cutoff_bits > 0) + { + *BW_cutoff_idx = read_indice(ptr, bp_side, mask_side, BW_cutoff_bits); + /* check for bitflips */ + IF (sub(fs_idx, *BW_cutoff_idx) < 0) + { + *BW_cutoff_idx = fs_idx; + *bfi = 1; move16(); + Dyn_Mem_Deluxe_Out(); + return; + } + } + ELSE + { + *BW_cutoff_idx = fs_idx; + } + + /* Number of TNS filters */ +#ifdef CR9_C_ADD_1p25MS + IF (frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) { + *tns_numfilters = 0; + } ELSE +#ifdef CR9_C_ADD_1p25MS_LRSNS + { +#endif +#endif + IF (sub(*BW_cutoff_idx, 3) >= 0 && frame_dms >= LC3PLUS_FRAME_DURATION_5MS) + { + *tns_numfilters = 2; move16(); + } + ELSE + { + *tns_numfilters = 1; move16(); + } +#ifdef CR9_C_ADD_1p25MS_LRSNS + } +#endif + + /* Decode number of ntuples */ + L = getLastNzBits_fx(L_spec); + n = read_indice(ptr, bp_side, mask_side, L); + n = add(n, 1); + *lastnz = shl_pos(n, 1); + IF (sub(*lastnz, L_spec) > 0) + { + *bfi = 1; move16(); + Dyn_Mem_Deluxe_Out(); + return; + } + + /* Mode bit */ + *lsbMode = read_bit(ptr, bp_side, mask_side); + + /* Decode global-gain */ + *gg_idx = read_indice(ptr, bp_side, mask_side, 8); move16(); + tmp32 = L_shl_pos(L_mult0(*gg_idx, 0x797D), 7); /* 6Q25; 0x797D -> log2(10)/28 (Q18) */ + gain_e = add(extract_l(L_shr_pos(tmp32, 25)), 1); /* get exponent */ + gain = round_fx(BASOP_Util_InvLog2(L_or(tmp32, 0xFE000000))); + assert(gain >= 0); /* JSv, check if shr_pos(gain,1) is more appropriate) */ + gain = shr_r(gain, 1); + gain_e = add(gain_e, 1); + + /* Decode TNS on/off flag */ + tns_order[1] = 0; move16(); /* fix problem with uninitialized memory */ + FOR (n = 0; n < *tns_numfilters; n++) + { + tns_order[n] = read_bit(ptr, bp_side, mask_side); move16(); + } + + /* LTPF on/off */ +#ifdef NEW_SIGNALLING_SCHEME_1p25 + IF(sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) != 0) + { + ltpf_idx[0] = read_bit(ptr, bp_side, mask_side); move16(); + } + ELSE + { /* read one of {2, 6, 7} bits into ltp/ltpf/lag variable ltpf_idx[ 0 ... 2] */ + readLtpData_fx(ptr, bfi, mask_side, bp_side, ltpf_idx, rx_status, ltpfinfo_frame_cntr_fx, mem_continuation); + } +#else + ltpf_idx[0] = read_indice(ptr, bp_side, mask_side, 1); move16(); +#endif + + +/* Decode SNS VQ parameters - 1st stage (10 bits) */ +#ifdef CR9_C_ADD_1p25MS_LRSNS + ltpf_idx_2_lrsns[0] = ltpf_idx[0]; move16(); + ltpf_idx_2_lrsns[1] = ltpf_idx[1]; move16(); +#ifdef LRSNS_PC_SIGNAL_FIX + bfiSNS = 0; move16(); /* Local BFI flag for Errors SNS bit area */ + + readSNSData_fx(ptr, &bfiSNS, mask_side, bp_side, ltpf_idx_2_lrsns, L_scf_idx, frame_dms); + IF ( bfiSNS != 0 ) + { /* corrupt SNSbits triggers PLC through global PLC flag *bfi==1. + *bfi==2 and bfiSNS == 0 maintains bfi==2 for PC(Partial Concealmnet) + */ + *bfi = 1; + Dyn_Mem_Deluxe_Out(); + return; + } + IF ( sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS ) == 0 ) + { /* for 1.25ms and previously detected bit errors --> handle frame as a completely corrupt bad frame */ + IF( sub(*bfi, 2) == 0) + { + *bfi = 1; + Dyn_Mem_Deluxe_Out(); + return; + } + } + +#else + readSNSData_fx(ptr, bfi, mask_side, bp_side, ltpf_idx_2_lrsns, L_scf_idx, frame_dms); + + IF(*bfi != 0) + { + *bfi = 1; + Dyn_Mem_Deluxe_Out(); + return; + } +#endif +#else + +#ifdef ENABLE_HR_MODE + L = read_indice(ptr, bp_side, mask_side, 5 + 5); + L_scf_idx[0] = L_deposit_l(s_and(L, 0x1F)); /* stage1 LF 5 bits */ + L_scf_idx[1] = L_deposit_l(shr_pos(L, 5)); /* stage1 HF 5 bits */ +#else + L_scf_idx[0] = L_deposit_l(read_indice(ptr, bp_side, mask_side, 5)); /* stage1 LF 5 bits */ + L_scf_idx[1] = L_deposit_l(read_indice(ptr, bp_side, mask_side, 5)); /* stage1 HF 5 bits */ +#endif + + /* Decode SNS VQ parameters - 2nd stage side-info (3-4 bits) */ + submodeMSB = read_bit(ptr, bp_side, mask_side); /* submodeMSB 1 bit */ + L_scf_idx[2] = L_deposit_l(shl_pos(submodeMSB, 1)); + ASSERT(sns_gainMSBbits[L_scf_idx[2]] > 0); + L_scf_idx[3] = L_deposit_l( + read_indice(ptr, bp_side, mask_side, sns_gainMSBbits[L_scf_idx[2]])); /* gains or gain MSBs 1-2 bits */ + L_scf_idx[4] = read_bit(ptr, bp_side, mask_side); /* shape LS 1 bit */ + + /* Decode SNS VQ parameters - 2nd stage data (24-25 bits) */ + IF (submodeMSB == 0) + { /* shape_j = 0, or 1 */ + /* regular mode A,B indexes integer multiplexed, total 24.x bits MPVQ codeword section A and codeword for + * section B */ + /* regular mode mode shape index total 24.9999 bits MPVQ codeword */ + tmp32 = L_deposit_l(read_indice(ptr, bp_side, mask_side, 13)); + tmp32 = L_or(tmp32, L_shl_pos(read_indice(ptr, bp_side, mask_side, 12), 13)); move16(); /*for ber state */ + BER_detect = + ac_dec_split_st2VQ_CW( /* local BER flag */ + tmp32, /* L_cwRx max 25 bits */ + sns_MPVQ_Sz[0][0], UL_addNsD(sns_MPVQ_Sz[0][1], sns_MPVQ_Sz[1][1]), /* 12+2 = 14 */ + (&L_scf_idx[5]), /* shape A */ + (&L_scf_idx[6]), /* shape B or gain LSB */ + &submodeLSB /* total submode update below */ + ); + IF (submodeLSB != 0) + { /* add gainLSB bit */ + L_scf_idx[3] = L_add(L_shl_pos(L_scf_idx[3], 1), L_scf_idx[6]); + L_scf_idx[6] = -2L; + } + } + ELSE + { /* shape_j = 2 or 3 */ + ASSERT(submodeMSB == 1); + /* outlier mode shape index total 23.8536 + 19.5637 (19.5637 < (log2(2.^24 -2.^23.8537)) bits MPVQ + * codeword */ + + tmp32 = L_deposit_l( read_indice( ptr, bp_side, mask_side, 12 ) ); + tmp32 = L_or( tmp32, L_shl_pos( read_indice( ptr, bp_side, mask_side, 12 ), 12 ) ); + + L_scf_idx[5] = tmp32; + move32(); /*shape outl_near or outl_far */ + submodeLSB = 0; + move16(); + BER_detect = 0; + move16(); + tmp32lim = L_add( sns_MPVQ_Sz[2][0], L_shl_pos( sns_MPVQ_Sz[3][0], 1 ) ); + IF( L_sub( tmp32, tmp32lim ) >= 0 ) + { + BER_detect = 1; + move16(); + } + ELSE + { + tmp32 = L_sub( tmp32, sns_MPVQ_Sz[2][0] ); /* a potential high index is computed */ + IF( tmp32 >= 0 ) + { + submodeLSB = 1; + move16(); + ASSERT( tmp32 >= 0 && tmp32 < (Word32) ( 2 * sns_MPVQ_Sz[3][0] ) ); + L_scf_idx[3] = L_add( L_shl_pos( L_scf_idx[3], 1 ), L_and( tmp32, 0x1 ) ); /* add LSB_gain bit to gain MSBs */ + L_scf_idx[5] = L_shr_pos( tmp32, 1 ); /* MPVQ index with offset and gainLSB removed */ + L_scf_idx[6] = -2L; + move32(); + } + ELSE + { + L_scf_idx[6] = -1L; + move32(); + } + } + } + L_scf_idx[2] = + L_add( L_scf_idx[2], L_deposit_l( submodeLSB ) ); /* decoder internal signal shape_j = submode 0..3 to VQ */ + + IF( BER_detect > 0 ) + { + *bfi = 1; move16(); + Dyn_Mem_Deluxe_Out(); + return; + } +#endif + +#ifdef CR9_C_ADD_1p25MS + +#ifdef NEW_SIGNALLING_SCHEME_1p25 + IF( sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) != 0 ) + { + ltpf_idx[1] = 0; move16(); + ltpf_idx[2] = 0; move16(); + + test(); + IF( ltpf_idx[0] != 0 ) + { + L = read_indice(ptr, bp_side, mask_side, 1 + 9); + ltpf_idx[1] = s_and(L, 1); move16(); + ltpf_idx[2] = shr_pos(L, 1); move16(); + } + } +#else + IF (ltpf_idx[0] == 1) { + if (frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) { + Word32 rx_current_status = read_bit(ptr, bp_side, mask_side); + IF (rx_current_status == rx_status[0]) { + IF (rx_current_status == 0) { + rx_status[0] = 1; move16(); + rx_status[1] = read_indice(ptr, bp_side, mask_side, 5); move16(); + if (*mem_continuation == 0) + { + *mem_continuation = 1; + } + } ELSE { + /* rx current status 1 */ + rx_status[0] = 0; move16(); + ltpf_idx[1] = shr_pos (rx_status[1],4); + ltpf_idx[2] = read_indice(ptr, bp_side, mask_side, 5); + ltpf_idx[2] = add(ltpf_idx[2], shl_pos(s_and(rx_status[1],15), 5)); + rx_status[1] = 0; move16(); + *mem_continuation = 0; + } + } ELSE { /* frame loss condtion */ + rx_status[0] = 0; +#ifdef FIX_PLC_CONFORM_ISSUES + rx_status[1] = read_indice( ptr, bp_side, mask_side, 5 ); +#else + rx_status[1] = 0; +#endif + } + } ELSE { + L = read_indice(ptr, bp_side, mask_side, 1+9); move16(); + ltpf_idx[1] = s_and(L, 1); move16(); + ltpf_idx[2] = shr_pos(L, 1); move16(); + } + } + ELSE + { + ltpf_idx[1] = 0; move16(); + ltpf_idx[2] = 0; move16(); + rx_status[0] = 0; + rx_status[1] = 0; + *mem_continuation = 0; + } +#endif +#else /* CR9_C_ADD_1p25MS */ + /* LTPF data */ + IF (ltpf_idx[0] != 0) + { +#ifdef ENABLE_HR_MODE + L = read_indice(ptr, bp_side, mask_side, 1+9); move16(); + ltpf_idx[1] = s_and(L, 1); move16(); + ltpf_idx[2] = shr_pos(L, 1); move16(); +#else + ltpf_idx[1] = read_indice(ptr, bp_side, mask_side, 1); move16(); + ltpf_idx[2] = read_indice(ptr, bp_side, mask_side, 9); move16(); + +#endif + } + ELSE + { + ltpf_idx[1] = 0; move16(); + ltpf_idx[2] = 0; move16(); + } +#endif /* new signalling */ + + /* Decode noise-fac */ + *fac_ns_idx = read_indice( ptr, bp_side, mask_side, 3 ); move16(); + + Dyn_Mem_Deluxe_Out(); +} + + +#ifdef ENABLE_PADDING +Word32 paddingDec_fx( UWord8* bytes, Word16 nbbits, Word16 L_spec, Word16 BW_cutoff_bits, Word16 ep_enabled, Word16* total_padding, Word16* np_zero ) +{ + Word16 lastnz_threshold; + Word16 padding_len_bits, padding_len; + + Word16 bp_side; + Word16 nbbytes = shr( nbbits, 3 ); + + Word16 mask_side; + UWord8* ptr = bytes; + + Word16 lastnz; + Word16 nbits = getLastNzBits_fx( L_spec ); + if ( sub( nbbits, nbits ) < 0 ) + { + return 1; + } + *np_zero = 0; + + *total_padding = 0; + + bp_side = shr_pos( sub( nbbits, 1 ), 3 ); + mask_side = shl( 1, sub( 8, sub( nbbits, shl_pos( bp_side, 3 ) ) ) ); + + test(); + IF( sub( bp_side, 19 ) < 0 || sub( bp_side, LC3PLUS_MAX_BYTES ) >= 0 ) + { + return 1; + } + + ptr = bytes; + + IF( BW_cutoff_bits > 0 ) + { + read_indice( ptr, &bp_side, &mask_side, BW_cutoff_bits ); + move16(); + } + + lastnz = read_indice( ptr, &bp_side, &mask_side, nbits ); + move16(); + + lastnz_threshold = sub( shl( 1, nbits ), 2 ); + + WHILE( lastnz == lastnz_threshold ) + { + padding_len_bits = sub( sub( 12, nbits ), BW_cutoff_bits ); + + /*Read padding length*/ + padding_len = read_indice( ptr, &bp_side, &mask_side, padding_len_bits ); + move16(); + + /* Read 4 reserved bits */ + read_indice( ptr, &bp_side, &mask_side, 4 ); + move16(); + + IF( ep_enabled == 0 ) + { + /* Discard padding length bytes */ + bp_side = sub( bp_side, padding_len ); + *total_padding = add( add( *total_padding, padding_len ), 2 ); + move16(); + } + ELSE + { + *total_padding = add( *total_padding, 2 ); + move16(); + *np_zero = add( *np_zero, padding_len ); + move16(); + } + + /* test if we have less than 20 bytes left; if so frame is broken */ + IF( sub( sub( nbbytes, add( *total_padding, *np_zero ) ), 20 ) < 0 ) + { + return 1; + } + + /* Read bandwidth bits */ + IF( BW_cutoff_bits > 0 ) + { + read_indice( ptr, &bp_side, &mask_side, BW_cutoff_bits ); + move16(); + } + + lastnz = read_indice( ptr, &bp_side, &mask_side, nbits ); + move16(); + } + + IF( ep_enabled != 0 ) + { + *total_padding = add( *total_padding, *np_zero ); + move16(); + } + return 0; +} +#endif + +static Word16 ac_dec_split_st2VQ_CW( /* local BER flag */ + const Word32 L_cwRx, /* max 25 bits */ + const Word32 L_szA, + const Word32 L_szB, + Word32* L_cwA, + Word32* L_cwB, + Word16* submodeLSB ) +{ + /* demultiplex: L_cwRx = L_cwB(21.z bits) * L_szA(3.y bits) + L_cwA(21.x bits)); */ + Word16 start, fin, ind; + Word32 L_tmp, L_max_size; + Counter i; + + L_max_size = (Word32) UL_Mpy_32_32( (UWord32) L_szB, (UWord32) L_szA ); /* may be tabled */ + + /* section B ind larger than 13 out of the possible 14 = 0..13 */ + IF( L_sub( L_cwRx, L_max_size ) >= 0 ) + { + *L_cwA = L_deposit_l( 0 ); + *L_cwB = L_deposit_l( 0 ); + *submodeLSB = 0; + move16(); + return (Word16) 1; /* set berFlag and exit */ + } + + /*initial binary split of cw, select top or low half */ + start = 0; + move16(); + + ASSERT( ( L_szB & 0x1L ) == 0 ); /* this middle split only works if L_szB is even */ + if ( L_sub( L_cwRx, L_shr_pos( L_max_size, 1 ) ) >= 0 ) + { + start = L_shr_pos( L_szB, 1 ); /* top half start index */ + } + + /*linear loop over a low or a high section */ + ind = start; + move16(); + L_tmp = L_negate( L_cwRx ); /* search from negative side */ + + L_tmp = L_add( L_tmp, (Word32) UL_Mpy_32_32( UL_deposit_l( (UWord16) start ), (UWord32) L_szA ) ); + /* start is 0 or 7 */ /*non-fractional mult is (int)start * L_szA */ + + /* a short linear run over ceil(szB/2) = 7 values */ + + fin = add( start, shr_pos( L_szB, 1 ) ); + FOR( i = start; i < fin; i++ ) + { + ind = add( ind, 1 ); + L_tmp = L_add( L_tmp, L_szA ); + if ( L_tmp > 0 ) + { + ind = sub( ind, 1 ); /* passed criteria point, keep index */ + } + } + + *L_cwB = L_deposit_l( ind ); + *L_cwA = L_sub( L_cwRx, (Word32) UL_Mpy_32_32( UL_deposit_l( (UWord16) ind ), + (UWord32) L_szA ) ); /* non-fractional mult; (int)ind * L_szA */ + + ASSERT( *L_cwA >= 0 && *L_cwA < L_szA ); + ASSERT( *L_cwB >= 0 && *L_cwB < L_szB ); + + *submodeLSB = 0; + *L_cwB = L_sub( *L_cwB, 2 ); + if ( *L_cwB < 0 ) + { + *submodeLSB = 1; + move16(); + } + *L_cwB = L_mac0( *L_cwB, 2, *submodeLSB ); /* add back gain ind if needed */ + + return 0; /* no BER */ +} + +#ifdef CR9_C_ADD_1p25MS_LRSNS + +void readSNSData_fx(UWord8* ptr, + Word16* bfiPtr, + Word16* mask_side, + Word16* bp_side, + Word16* ltpf_idx_2_lrsns, + Word32* L_scf_idx, + LC3PLUS_FrameDuration frame_dms) +{ + Dyn_Mem_Deluxe_In( + Word32 i, tmp32, tmp32lim; + Word16 submodeMSB, submodeLSB; + Word16 L, BER_detect; + Word16 read_legacy_sns_vq_bits_fx; + Word16 shape_idx, gain_idx, aux_idx, tmp_shape, stop_bit; + Word16 plc_trigger_SNS1, plc_trigger_SNS2; + + ); + + BER_detect = 0; move16(); + plc_trigger_SNS1 = 1; move16(); +#ifdef LRSNS_10MS_BFISIGNAL_FIX + plc_trigger_SNS2 = 1; move16(); +#else + plc_trigger_SNS2 = 2; move16(); +#endif + read_legacy_sns_vq_bits_fx = 1; move16(); + IF(sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0) + { + read_legacy_sns_vq_bits_fx = 0; move16(); /* decode 9, 10, or 29/30 bits */ + } + + IF(read_legacy_sns_vq_bits_fx != 0) + { + /* Decode SNS VQ parameters - 1st stage (10 bits) */ + L = read_indice(ptr, bp_side, mask_side, 5 + 5); + L_scf_idx[0] = L_deposit_l(s_and(L, 0x1F)); /* stage1 LF 5 bits */ + L_scf_idx[1] = L_deposit_l(shr_pos(L, 5)); /* stage1 HF 5 bits */ + + + /* Decode SNS VQ parameters - 2nd stage side-info (3-4 bits) */ + submodeMSB = read_bit(ptr, bp_side, mask_side); /* submodeMSB 1 bit */ + L_scf_idx[2] = L_deposit_l(shl_pos(submodeMSB, 1)); + ASSERT(sns_gainMSBbits[L_scf_idx[2]] > 0); + L_scf_idx[3] = L_deposit_l( + read_indice(ptr, bp_side, mask_side, sns_gainMSBbits[L_scf_idx[2]])); /* gains or gain MSBs 1-2 bits */ + L_scf_idx[4] = read_bit(ptr, bp_side, mask_side); /* shape LS 1 bit */ + + /* Decode SNS VQ parameters - 2nd stage data (24-25 bits) */ + IF(submodeMSB == 0) + { /* shape_j = 0, or 1 */ + /* regular mode A,B indexes integer multiplexed, total 24.x bits MPVQ codeword section A and codeword for + * section B */ + /* regular mode mode shape index total 24.9999 bits MPVQ codeword */ + + tmp32 = L_deposit_l(read_indice(ptr, bp_side, mask_side, 13)); + tmp32 = L_or(tmp32, L_shl_pos(read_indice(ptr, bp_side, mask_side, 12), 13)); + move16(); /*for ber state */ + BER_detect = + ac_dec_split_st2VQ_CW( /* local BER flag */ + tmp32, /* L_cwRx max 25 bits */ + sns_MPVQ_Sz[0][0], UL_addNsD(sns_MPVQ_Sz[0][1], sns_MPVQ_Sz[1][1]), /* 12+2 = 14 */ + (&L_scf_idx[5]), /* shape A */ + (&L_scf_idx[6]), /* shape B or gain LSB */ + &submodeLSB /* total submode update below */ + ); + IF(submodeLSB != 0) + { /* add gainLSB bit */ + L_scf_idx[3] = L_add(L_shl_pos(L_scf_idx[3], 1), L_scf_idx[6]); + L_scf_idx[6] = -2L; + } + } + ELSE + { /* shape_j = 2 or 3 */ + ASSERT(submodeMSB == 1); + /* outlier mode shape index total 23.8536 + 19.5637 (19.5637 < (log2(2.^24 -2.^23.8537)) bits MPVQ + * codeword */ + tmp32 = L_deposit_l(read_indice(ptr, bp_side, mask_side, 12)); + tmp32 = L_or(tmp32, L_shl_pos(read_indice(ptr, bp_side, mask_side, 12), 12)); + + L_scf_idx[5] = tmp32; move32(); /*shape outl_near or outl_far */ + submodeLSB = 0; move16(); + BER_detect = 0; move16(); + tmp32lim = L_add(sns_MPVQ_Sz[2][0], L_shl_pos(sns_MPVQ_Sz[3][0], 1)); + + IF (L_sub(tmp32, tmp32lim) >= 0) + { + BER_detect = 1; move16(); + } + ELSE + { + tmp32 = L_sub(tmp32, sns_MPVQ_Sz[2][0]); /* a potential high index is computed */ + IF (tmp32 >= 0) + { + submodeLSB = 1; move16(); + ASSERT(tmp32 >= 0 && tmp32 < (Word32)(2 * sns_MPVQ_Sz[3][0])); + L_scf_idx[3] = L_add(L_shl_pos(L_scf_idx[3], 1), L_and(tmp32, 0x1)); /* add LSB_gain bit to gain MSBs */ + L_scf_idx[5] = L_shr_pos(tmp32, 1); /* MPVQ index with offset and gainLSB removed */ + L_scf_idx[6] = -2L; move32(); + } + ELSE + { + L_scf_idx[6] = -1L; move32(); + } + } + } + L_scf_idx[2] = + L_add(L_scf_idx[2], L_deposit_l(submodeLSB)); /* decoder internal signal shape_j = submode 0..3 to VQ */ + + +#ifdef LRSNS_10MS_BFISIGNAL_FIX + IF( BER_detect > 0) + { + *bfiPtr = 1; move16(); + Dyn_Mem_Deluxe_Out(); + return; + } +#else + *bfiPtr = BER_detect; move16(); + IF(*bfiPtr != 0) + { + Dyn_Mem_Deluxe_Out(); + return; + } +#endif + } + ELSE + { + ASSERT(read_legacy_sns_vq_bits_fx == 0 ); + /* lrsns 9/10/29/30 */ + /* init auxiliary demuxing variabls */ + shape_idx = -1; move16(); + gain_idx = -1; move16(); + aux_idx = -1; move16(); + tmp_shape = -1; move16(); + stop_bit = -1; move16(); + + FOR(i = 0; i < SCF_MAX_PARAM; i++) + { + L_scf_idx[i] = L_sub(-32000, i); move32(); /* init parameters to be fwded to LRSNS VQ demultiplexor */ + } + + /* start actual Q-mode and fractional bits demultiplexing */ + + /* SNS-VQ 1st stage , 3 sections of 7.4 bits is stored in the first 9 bits */ + L_scf_idx[0] = L_deposit_l(read_indice(ptr, bp_side, mask_side, 9)); + + IF(L_sub(L_scf_idx[0], 510) >= 0) + { + ASSERT(L_scf_idx[0] < 512); + L_scf_idx[0] -= 510; move32(); /* sent only idx 0,1 */ + shape_idx = -9; move16(); + L_scf_idx[2] = shape_idx; move32(); /* actual signal to LRSNS decoder vector reconstruction */ + } + ELSE + { + /* read stop bit, 10th bit */ + stop_bit = read_indice(ptr, bp_side, mask_side, 1); + + test(); test(); + IF((L_sub(L_scf_idx[0] , (2 * 170)) < 0) && (stop_bit != 0)) + { + /*keep values 0...339 in sns_vq_idx[0] , so that B vs C can be determined later in DecLR_fx function */ + L_scf_idx[2] = -10L; move32(); + L_scf_idx[3] = L_deposit_l(ltpf_idx_2_lrsns[0]); /*LTP active flag */ + L_scf_idx[4] = L_deposit_l(ltpf_idx_2_lrsns[1]); /*LTPF active flag */ + } + ELSE + { /* stage1B* + stage2*/ + /*0...169 in sns_vq_idx[0]*/ + test(); test(); + IF((L_sub(L_scf_idx[0], (2 * 170)) < 0) && (stop_bit == 0)) + { + aux_idx = 0; move16(); /* typically a leading or first sign is stored in aux_idx */ + + IF(L_sub(L_scf_idx[0], 170) >= 0) + { + aux_idx = 1; move16(); + L_scf_idx[0] = L_sub(L_scf_idx[0], 170); move32(); + } + L_scf_idx[1] = aux_idx; move32(); /* forward aux bit for , LR_Split_LF, 29 bits */ + + shape_idx = 0; move16(); /* point to splitLF parsing */ + L_scf_idx[2] = L_deposit_l(shape_idx); move32(); + + gain_idx = read_indice(ptr, bp_side, mask_side, 2); + L_scf_idx[3] = L_deposit_l(gain_idx); move32(); + + /* stage2 shape demux for LR_splitLF */ + + L_scf_idx[4] = L_deposit_l(read_indice(ptr, bp_side, mask_side, 10));/* 10bits mPVQ(N=5,K=6) */ + + IF(L_sub(L_scf_idx[4] , (SNSLR_NPVQ_L5K6 >> 1) + (1 << 5)) >= 0) /* some limited bit error detection possible here */ + { + *bfiPtr = plc_trigger_SNS1; move16(); + IF(*bfiPtr != 0) + { +#ifdef LRSNS_10MS_BFISIGNAL_FIX + ASSERT(*bfiPtr == 1); +#endif + Dyn_Mem_Deluxe_Out(); + return; + } + } + + /* determine section of splitLF mpvq(5,6)+P(8,2)+P(2,0) or mpvq(5,8)+P(10,0) */ + IF(L_sub(L_scf_idx[4] , (SNSLR_NPVQ_L5K6 >> 1)) < 0) + { + tmp_shape = read_indice(ptr, bp_side, mask_side, 1);/* LS (8,2) */ + L_scf_idx[5] = L_deposit_l(read_indice(ptr, bp_side, mask_side, 6)); move32(); /* mPVQ(8,2) */ + L_scf_idx[5] = L_mac0(L_shl_pos(L_scf_idx[5], 1), 1, tmp_shape); move32(); /* P(8,2) LS put as lsb */ + } + ELSE + { + L_scf_idx[4] = L_sub(L_scf_idx[4], (SNSLR_NPVQ_L5K6 >> 1)); move32(); /* 5 lsbs of mpvq (5,8) */ + + L_scf_idx[5] = L_deposit_l(read_indice(ptr, bp_side, mask_side, 7)); move32();/* 7 msbs of mPVQ(5,8) */ + + L_scf_idx[4] = L_or(L_shl_pos(L_scf_idx[5], 5), L_scf_idx[4]); move32(); /* binary merge MSB's and LSBs */ + L_scf_idx[5] = -8L; move32(); /* signal to sns_decoder split_LF subshape to decode 8 lf pulses, and no hf pulses */ + + IF(L_sub(L_scf_idx[4] , (SNSLR_NPVQ_L5K8 >> 1)) >= 0) + { + *bfiPtr = plc_trigger_SNS2; move16(); + IF( *bfiPtr != 0 ) + { +#ifdef LRSNS_10MS_BFISIGNAL_FIX + ASSERT(*bfiPtr == 1); +#endif + Dyn_Mem_Deluxe_Out(); + return; + } + } + } + } + ELSE IF(L_sub(L_scf_idx[0], 2 * 170) >= 0) + { + aux_idx = stop_bit; move16(); + L_scf_idx[0] = L_sub(L_scf_idx[0], 2 * 170); move32(); + L_scf_idx[1] = L_deposit_l(aux_idx); move32(); + + + shape_idx = 1; move16();/* point to full parsing */ + L_scf_idx[2] = shape_idx; move32();/* LR_full , 30 bits */ + + gain_idx = read_indice(ptr, bp_side, mask_side, 3); + L_scf_idx[3] = gain_idx; move32(); + + /* stage2 shape demux for LR_full */ + tmp32 = L_deposit_l(read_indice(ptr, bp_side, mask_side, 10)); /* 10 LSBs. total 16.666 bits mPVQ(N=15,K=5) */ + tmp32 = L_or(tmp32, L_shl_pos(read_indice(ptr, bp_side, mask_side, 7), 10)); /*7 MSBs */ + L_scf_idx[4] = tmp32; move32(); + IF(L_sub(L_scf_idx[4], (SNSLR_NPVQ_L15K5 >> 1)) >= 0) + { /* fixenv shapes demultiplexing */ + L_scf_idx[5] = L_sub(L_scf_idx[4], (SNSLR_NPVQ_L15K5 >> 1)); move32(); + + IF(L_sub(L_scf_idx[5] , 3 * (1 << 13)) < 0) + { /*fix_env's "0,1,2" with 2 shiftbits and 11 remaining sign bits s1..s11 */ + L_scf_idx[4] = 0L; move32(); + WHILE(L_sub(L_scf_idx[5], (1 << 13)) >= 0) + { + L_scf_idx[5] = L_mac0(L_scf_idx[5], -1, (1 << 13)); move32(); + L_scf_idx[4] = L_add(L_scf_idx[4], 1); move32(); + } + assert(L_scf_idx[4] >= 0 && L_scf_idx[4] <= 3); + assert(L_scf_idx[5] >= 0 && L_scf_idx[5] < (1 << 13)); + } + ELSE IF(L_sub(L_scf_idx[5], 3 * (1 << 13) + (1 << 11)) < 0) + { + L_scf_idx[4] = 3L; move32(); /*smaller fix_env "3" with 2 shiftbits and 9 remaining sign bits s1..s9 */ + L_scf_idx[5] = L_mac0(L_scf_idx[5] , -1, 3 * (1 << 13)); move32(); + assert(L_scf_idx[5] >= 0 && L_scf_idx[5] < (1 << 11)); + } + ELSE + { + /* unused section indicate bit error */ + *bfiPtr = plc_trigger_SNS2; move16(); + test(); + IF( *bfiPtr != 0 ) + { + Dyn_Mem_Deluxe_Out(); + return; + } + } + shape_idx = add(extract_l(L_scf_idx[4]), 2); move32(); + L_scf_idx[2] = L_deposit_l(shape_idx); move32(); + } /* fixenv */ + } /*full*/ + } /*stage1B* + stage2 */ + } /*10+ bits*/ + } +#ifdef LRSNS_PC_SIGNAL_FIX + assert(*bfiPtr == 0 || *bfiPtr == 1); /* local SNS BFI-flag output check */ +#endif + Dyn_Mem_Deluxe_Out(); +} /*read SNS*/ +#endif /* LRSNS */ + + + +#ifdef NEW_SIGNALLING_SCHEME_1p25 + +void readLtpData_fx( + UWord8* ptr, + Word16* bfiPtr, + Word16* mask_side, + Word16* bp_side, + Word16* ltpf_idx, + Word16* rx_status, + Word16* ltpfinfo_frame_cntr_fx, + Word16* mem_continuation +) +{ + Word16 rx_current_status = -1; + Word16 tmp, MSBs, LSBs; + + ltpf_idx[2] = -1; move16(); /* -1 indicates incomplete lag, conditionally decoded if phase is B , and consecutive A/B has arrived */ + + tmp = read_indice(ptr, bp_side, mask_side, 2); + + test(); + IF(tmp == 0) + { + ltpf_idx[0] = 0; move16(); /* ltp ltpf/lag was not transmitted */ + ltpf_idx[1] = 0; move16(); /* ltpf activation bit zeroed */ + + /* *ltp_bits_fx = 2; */ /* note: ltpbits bitbudget not really used in decoder */ + + rx_status[0] = -32768; move16(); /* set unknown phase A , due to rxLTP==0 */ + rx_status[1] = -1; move16(); /* set unknown phase A MSBs content */ + *ltpfinfo_frame_cntr_fx = -32768; move16(); + ASSERT(ltpf_idx[2] < 0); /* ltpf_idx[2] = -1; , no ready lag available */ +#ifdef FIX_LTPF_1p25 + *mem_continuation = 0; move16(); /* also kill lag continuation state */ +#endif + } + ELSE IF(sub(tmp, 1) == 0) + { + ltpf_idx[0] = 1; + ltpf_idx[1] = 0; /* LTP=1, LTPF=0, inactive ltpf */ + rx_current_status = read_bit(ptr, bp_side, mask_side); + + test(); + IF(rx_current_status == 0) + { + rx_status[0] = 0; move16(); /* phaseA */ + rx_status[1] = read_indice(ptr, bp_side, mask_side, 4); /* read four MSBs, and store in rx_status[1] */ +#ifdef FIX_LTPF_1p25 + test(); + if (*mem_continuation == 0) + { + *mem_continuation = 1; + } +#endif + *ltpfinfo_frame_cntr_fx = 0; /* handle longer loss bursts */ + } + ELSE + { /* LSB part of delta coded lag information */ + ASSERT(rx_current_status == 1); + LSBs = shl(read_indice(ptr, bp_side, mask_side, 4), 1); /* NB LSB is on purpose always zero, truncation on encoder side */ + IF ( rx_status[1] < 0 ) + { + *bfiPtr = 1; move16(); + return; + } + ltpf_idx[2] = s_or(shl(rx_status[1], 5), LSBs); + + /* check frame cntr info to not combine oldA with a newB */ + IF(sub(*ltpfinfo_frame_cntr_fx, 1) != 0) + { + ltpf_idx[1] = 0; move16(); /*turn of LTPF, even number of bfi frames may have happened */ + ltpf_idx[2] = -1; move16(); /* indicate bfi burst and corrupt lagLSBs to PLC and ltpf_decoder_fx */ + } +#ifdef FIX_LTPF_MEM_CONTINUATION + else + { + *mem_continuation = 0; move16(); + } + # endif + rx_status[0] = -32768; move16(); + *ltpfinfo_frame_cntr_fx = -32678; move16(); + } + } + ELSE + { /*2 or 3*/ + ltpf_idx[0] = 1; move16(); + ltpf_idx[1] = 1; move16(); /* active ltpf */ + + IF(sub(tmp, 2) == 0) + { + /* phaseA */ + MSBs = read_indice(ptr, bp_side, mask_side, 4); + rx_status[0] = 0; move16(); + rx_status[1] = MSBs; move16();/* remember the four MSBs */ +#ifdef FIX_LTPF_1p25 + test(); + if (*mem_continuation == 0) + { + *mem_continuation = 1; move16(); + } +#endif + *ltpfinfo_frame_cntr_fx = 0; move16(); + } + ELSE + { + ASSERT(tmp == 3); /* phaseB */ + LSBs = read_indice(ptr, bp_side, mask_side, 5); /* all 5 LSBs available*/ + IF ( rx_status[1] < 0 ) + { + *bfiPtr = 1; move16(); + return; + } + ltpf_idx[2] = s_or(shl(rx_status[1], 5), LSBs); + + /* check frame cntr info to not combine oldA MSBs with a newB LSBs */ + IF(sub(*ltpfinfo_frame_cntr_fx, 1) != 0) + { + ltpf_idx[1] = 0; move16(); /* turn off LTPF activation, ltpf_idx[2] is not read */ + ltpf_idx[2] = -1; move16(); /* indicate bfi burst and corrupt lagLSBs to PLC and ltpf_decoder_fx */ + } + *ltpfinfo_frame_cntr_fx = -32678; move16(); /*cntr init in phaseA*/ + rx_status[0] = -32768; move16(); /* phase init in phaseA*/ + +#ifdef FIX_LTPF_MEM_CONTINUATION + *mem_continuation = 0; move16(); +#endif + } + } +} + +#endif diff --git a/lib_lc3plus/dec_lc3plus.c b/lib_lc3plus/dec_lc3plus.c new file mode 100644 index 0000000000000000000000000000000000000000..ba9a2b39a8633f9ea41f5469defb789289611be3 --- /dev/null +++ b/lib_lc3plus/dec_lc3plus.c @@ -0,0 +1,924 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +static int Dec_LC3PLUS_Channel(LC3PLUS_Dec *decoder, int channel, int bits_per_sample, UWord8 *bs_in, void *s_out, Word16 bfi, + Word8 *scratchBuffer) +{ + Word16 scale; + Word32 offset; + Word16 fill_bits; + Word16 nf_seed, gg_idx, fac_ns_idx, q_fx_exp = 0; + Word16 bp_side, mask_side; + Word16 tns_numfilters, lsbMode, lastnz, BW_cutoff_idx, BW_cutoff_idx_nf; + Word16 zero_frame = 0; +#ifdef ENABLE_RFRAME + Word16 rframe = 0; +#endif + Word16 ltpf_idx[3] = {0}; + Word16 spec_inv_idx = 0; + Counter i; + + /* Buffers */ + Word16 *int_scf_fx_exp, tns_order[TNS_NUMFILTERS_MAX]; + UWord8 *resBitBuf; + Word16 resBitBufLen; +#ifdef ENABLE_HR_MODE + Word32 *sqQdec; +#else + Word16 * sqQdec; + Word16 * int_scf_fx; +#endif + Word16 * x_fx, *indexes; + Word16 scf_q[M]; + Word32 * L_scf_idx; + Word32 * q_d_fx; + Word8 * currentScratch; + DecSetup *h_DecSetup = decoder->channel_setup[channel]; + +#ifdef CR9_C_ADD_1p25MS_LRSNS + Word16 pitch_rx_fx; + Word16 ltpf_rx_fx; +#endif + +#ifdef CR9_C_ADD_1p25MS_LRSNS + Word32 scf_q_ip[M]; +#ifdef ENABLE_HR_MODE + //Counter i; + Word32* x_fx_ip; + Word32 *int_scf_fx_ip; +#endif +#else +#ifdef ENABLE_HR_MODE + Word32 *x_fx_ip; + Word32 *int_scf_fx_ip; + Word32 scf_q_ip[M]; +#endif +#endif /* CR9_C_ADD_1p25MS_LRSNS */ + +#ifdef DYNMEM_COUNT + struct _dynmem + { + Counter i; + Word16 scale; + Word32 offset; + Word16 fill_bits; + Word16 nf_seed, gg_idx, fac_ns_idx, q_fx_exp; + Word16 bp_side, mask_side; + Word16 tns_numfilters, lsbMode, lastnz, BW_cutoff_idx, BW_cutoff_idx_nf; + Word16 zero_frame; + Word16 ltpf_idx[3]; +#ifdef ENABLE_RFRAME + Word16 rframe; +#endif + Word16 spec_inv_idx; + + /* Buffers */ + Word16 *int_scf_fx_exp, tns_order[TNS_NUMFILTERS_MAX]; + UWord8 *resBitBuf; +#ifdef ENABLE_HR_MODE + Word32 *sqQdec; +#else + Word16 *sqQdec; +#endif + Word16 *int_scf_fx, *x_fx, *indexes; + Word16 resBitBufLen; + Word32 *L_scf_idx; + Word32 *q_d_fx; + Word8 * currentScratch; + Word16 scf_q[M]; +#ifdef ENABLE_HR_MODE + Word32 scf_q_ip[M]; +#endif + }; + Dyn_Mem_In("Dec_LC3_Channel", sizeof(struct _dynmem)); +#endif + +#ifdef DISABLE_PLC + UNUSED(decoder->plcMeth); +#endif + + + /* BUFFER INITIALISATION. Some buffers may overlap since they are not used in the whole decoding process */ + q_d_fx = scratchAlign(scratchBuffer, 0); /* Size = 4 * MAX_LEN bytes */ + +#ifdef CR9_C_ADD_1p25MS + IF (decoder->frame_dms==LC3PLUS_FRAME_DURATION_1p25MS) + { + resBitBufLen = 3; + } + ELSE { +#endif + resBitBufLen = 2; +#ifdef CR9_C_ADD_1p25MS + } +#endif + +#ifdef ENABLE_HR_MODE + /* allocate memory for residual bits */ + if (decoder->hrmode) + { +#ifdef CR9_C_ADD_1p25MS + IF (decoder->frame_dms==LC3PLUS_FRAME_DURATION_1p25MS) + { + resBitBuf = scratchAlign(q_d_fx, sizeof(*q_d_fx) * + decoder->frame_length * 3); + } + ELSE +#endif + { + resBitBuf = scratchAlign(q_d_fx, sizeof(*q_d_fx) * + decoder->frame_length); + } + basop_memset(resBitBuf, 0, sizeof(*resBitBuf) * MAX_RESBITS_LEN); + } + else +#endif + { + resBitBuf = scratchAlign(q_d_fx, sizeof(*q_d_fx) * + decoder->frame_length); /* Size = 2 * NPRM_RESQ = 2 * MAX_LEN bytes for + normal case and 2*MAX_RESBITS_LEN for hrmode */ + + basop_memset(resBitBuf, 0, sizeof(*resBitBuf) * resBitBufLen * decoder->frame_length); + } + +#ifdef ENABLE_HR_MODE + indexes = scratchAlign(resBitBuf, sizeof(*resBitBuf) * MAX_RESBITS_LEN); +#else + indexes = scratchAlign(resBitBuf, sizeof(*resBitBuf) * resBitBufLen * decoder->frame_length); +#endif + memset(indexes, 0, sizeof(*indexes) * TNS_NUMFILTERS_MAX * MAXLAG); + + /* indexes Size = 2 * TNS_NUMFILTERS_MAX * MAXLAG = 32 bytes */ + + L_scf_idx = scratchAlign(indexes, sizeof(*indexes) * TNS_NUMFILTERS_MAX * + MAXLAG); /* Size = 4 * SCF_MAX_PARAM = 28 bytes -> aligned to 32 bytes */ + sqQdec = scratchAlign(L_scf_idx, sizeof(*L_scf_idx) * (SCF_MAX_PARAM)); /* Size = 2 * MAX_LEN bytes */ + int_scf_fx_exp = scratchAlign(sqQdec, sizeof(*sqQdec) * decoder->frame_length); /* Size = 2 * MAX_BANDS_NUMBER = 128 bytes */ +#ifndef ENABLE_HR_MODE + int_scf_fx = scratchAlign(int_scf_fx_exp, + sizeof(*int_scf_fx_exp) * MAX_BANDS_NUMBER); /* Size = 2 * MAX_BANDS_NUMBER = 128 bytes */ +#endif +#ifdef ENABLE_HR_MODE + x_fx = + scratchAlign(int_scf_fx_exp, sizeof(*int_scf_fx_exp) * MAX_BANDS_NUMBER); /* Size = 2 * (MAX_LEN + MDCT_MEM_LEN_MAX) = 2 + * MAX_LEN + 1.25 * MAX_LEN = 3.25 * MAX_LEN */ +#else + x_fx = + scratchAlign(q_d_fx, sizeof(*q_d_fx) * decoder->frame_length); /* Size = 2 * (MAX_LEN + MDCT_MEM_LEN_MAX) = 2 + * MAX_LEN + 1.25 * MAX_LEN = 3.25 * MAX_LEN */ +#endif + +#ifdef ENABLE_HR_MODE + x_fx_ip = scratchAlign(x_fx, sizeof(*x_fx) * (decoder->frame_length + decoder->stDec_ola_mem_fx_len)); + int_scf_fx_ip = scratchAlign(x_fx_ip, sizeof(*x_fx_ip) * (decoder->frame_length + decoder->stDec_ola_mem_fx_len)); + + currentScratch = scratchAlign(int_scf_fx_ip, sizeof(*int_scf_fx_ip) * 2 * MAX_BANDS_NUMBER); /* Size = 4 * MAX_LEN */ +#else + currentScratch = scratchAlign(x_fx, sizeof(*x_fx) * 4 * MAX_LEN); /* Size = 4 * MAX_LEN */ +#endif + +#ifdef DISABLE_PLC + memset(q_d_fx, 0, decoder->frame_length * sizeof(*q_d_fx)); +#endif + +#ifdef WMOPS + push_wmops("Decoder"); +#endif + +#ifdef ENABLE_RFRAME + IF (sub(bfi, 3) == 0) + { + bfi = 2; + move16(); + rframe = 1; + move16(); + } +#endif + + if (bfi != 1) + { +#ifdef WMOPS + push_wmops("Dec(bfi=0)"); +#endif + } + else + { +#ifdef WMOPS + push_wmops("Dec(bfi=1)"); +#endif + } + +#ifdef WMOPS + push_wmops("Entropy dec"); +#endif +#ifdef NEW_SIGNALLING_SCHEME_1p25 + h_DecSetup->ltpfinfo_frame_cntr_fx = add_sat(h_DecSetup->ltpfinfo_frame_cntr_fx, 1); + /*ltpfinfo_frame_cntr_fx increased always, also for bfi=1 */ /* set or reset inside dec_entropy_fx() */ +#endif + + IF (sub(bfi, 1) != 0) + { + processDecoderEntropy_fx(bs_in, &bp_side, &mask_side, h_DecSetup->total_bits, decoder->yLen, decoder->fs_idx, + decoder->BW_cutoff_bits, &tns_numfilters, &lsbMode, &lastnz, &bfi, tns_order, + &fac_ns_idx, &gg_idx, &BW_cutoff_idx, ltpf_idx, L_scf_idx, decoder->frame_dms +#ifdef CR9_C_ADD_1p25MS +#ifdef FIX_TX_RX_STRUCT_STEREO + , h_DecSetup->ltpf_rx_status, &h_DecSetup->ltpf_mem_continuation +#else + , decoder->ltpf_rx_status, &decoder->ltpf_mem_continuation +#endif +#ifdef NEW_SIGNALLING_SCHEME_1p25 + , + &h_DecSetup->ltpfinfo_frame_cntr_fx +#endif +#endif + ); + + BW_cutoff_idx_nf = BW_cutoff_idx; + move16(); + } +#ifdef WMOPS + pop_wmops(); /* Entropy dec */ +#endif + +#ifdef WMOPS + push_wmops("Ari dec"); +#endif + IF (sub(bfi, 1) != 0) + { + processAriDecoder_fx(bs_in, &bp_side, &mask_side, h_DecSetup->total_bits, decoder->yLen, decoder->fs_idx, + h_DecSetup->enable_lpc_weighting, tns_numfilters, lsbMode, lastnz, &bfi, tns_order, + fac_ns_idx, gg_idx, decoder->frame_dms, + decoder->n_pc, decoder->be_bp_left, decoder->be_bp_right, 0, &spec_inv_idx, &scale, + &fill_bits, sqQdec, &nf_seed, resBitBuf, indexes, &zero_frame, currentScratch +#ifdef ENABLE_HR_MODE + , decoder->hrmode +#endif + ); + +#ifdef ENABLE_RFRAME + test();test(); + IF (sub(rframe, 1) == 0 && zero_frame == 0 && sub(bfi, 1) != 0) + { + bfi = 2; + move16(); + Word16 max_bw_stopband = BW_cutoff_bin_all[BW_cutoff_idx]; + SWITCH (decoder->frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + max_bw_stopband = shr_pos(max_bw_stopband, 3); + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + max_bw_stopband = shr_pos(max_bw_stopband, 2); + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + max_bw_stopband = shr_pos(max_bw_stopband, 1); + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + max_bw_stopband = add(shr_pos(max_bw_stopband, 2), add(shr_pos(max_bw_stopband, 2), shr_pos(max_bw_stopband, 2))); + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: + assert(0); + } + + spec_inv_idx = s_max(lastnz, max_bw_stopband); + move16(); + } +#endif + + IF (bfi == 0) + { + processAriDecoderScaling_fx(sqQdec, decoder->yLen, q_d_fx, &q_fx_exp); + } + } +#ifdef WMOPS + pop_wmops(); /* Ari dec */ +#endif + +#ifdef WMOPS + push_wmops("SnsQuantScfDec"); +#endif + + IF (sub(bfi, 1) != 0) +#ifdef CR9_C_ADD_1p25MS_LRSNS + { + IF(sub(decoder->frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0) + { + pitch_rx_fx = ltpf_idx[0]; move16(); + +#ifdef LRSNS_CBC_NO_LTPF_DEPENDENCY + ltpf_rx_fx = 0; move16(); /* CB_C with binary means , not dependent on LTPF activation */ +#else + ltpf_rx_fx = ltpf_idx[1]; move16();/* CB_C, with ternary means dependent on LTPF activation */ +#endif + snsQuantScfDecLR_fx(L_scf_idx, scf_q_ip, scf_q, pitch_rx_fx, ltpf_rx_fx, currentScratch); /* 9,12,29,30, bits decoding and 2 pitch info bits */ +#ifdef ENABLE_HR_MODE + downshift_w32_arr(scf_q_ip /* Q26 */, scf_q/* Q11 */, 26 - 11, M); /* W16Q11 version required for PLC */ +#endif + } + ELSE +#endif /* CR9_C_ADD_1p25MS_LRSNS */ + { + /* currentScratch Size = 96 bytes */ +#ifdef ENABLE_HR_MODE + processSnsQuantizeScfDecoder_fx(L_scf_idx, scf_q_ip, currentScratch); + downshift_w32_arr(scf_q_ip, scf_q, 15, M); /* required for PLC */ +#else + processSnsQuantizeScfDecoder_fx(L_scf_idx, scf_q, currentScratch); +#endif + } +#ifdef CR9_C_ADD_1p25MS_LRSNS +} +#endif +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("PLC::ComputeStabFac"); +#endif + if (h_DecSetup->plcAd) + { + processPLCcomputeStabFac_main(scf_q, h_DecSetup->plcAd->old_scf_q, h_DecSetup->plcAd->old_old_scf_q, bfi, + h_DecSetup->prev_bfi, h_DecSetup->prev_prev_bfi, &h_DecSetup->plcAd->stab_fac); + } +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Partial Concealment"); +#endif + IF (sub(bfi, 1) != 0) + { + scale = 32767; + move16(); + + IF (h_DecSetup->plcAd) + { + scale = h_DecSetup->plcAd->stab_fac; + } + + processPCmain_fx(rframe, &bfi, decoder->yLen, decoder->frame_dms, h_DecSetup->q_old_res_fx, + &h_DecSetup->q_old_res_fx_exp, sqQdec, h_DecSetup->q_old_d_fx, spec_inv_idx, ltpf_idx[0], + scale, q_d_fx, &q_fx_exp, gg_idx, h_DecSetup->quantizedGainOff, &h_DecSetup->prev_gg, + &h_DecSetup->prev_gg_e, &BW_cutoff_idx_nf, &h_DecSetup->prev_BW_cutoff_idx_nf, fac_ns_idx, + &h_DecSetup->prev_fac_ns_fx, &h_DecSetup->pc_nbLostFramesInRow); + } +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef FIX_PLC_CONFORM_ISSUES +#ifdef CR9_C_ADD_1p25MS + IF( sub( bfi, 1 ) == 0 ) + { +#ifdef FIX_TX_RX_STRUCT_STEREO + h_DecSetup->ltpf_rx_status[0] = 0; + h_DecSetup->ltpf_rx_status[1] = 0; +#else + decoder->ltpf_rx_status[0] = 0; + decoder->ltpf_rx_status[1] = 0; +#endif + } +#endif +#endif + + + IF (sub(bfi, 1) != 0) + { +#ifdef WMOPS + push_wmops("Residual dec"); +#endif + processResidualDecoding_fx(q_d_fx, q_fx_exp, decoder->yLen, resBitBuf, fill_bits +#ifdef ENABLE_HR_MODE + , decoder->hrmode +#endif +#if defined (CR9_C_ADD_1p25MS) + , decoder->frame_dms +#endif + ); +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Noisefill"); +#endif + /* currentScratch Size = 2 * MAX_LEN bytes */ +#ifdef CR9_C_ADD_1p25MS + IF (zero_frame == 0) +#else + IF (zero_frame == 0) +#endif + { + processNoiseFilling_fx(q_d_fx, nf_seed, q_fx_exp, fac_ns_idx, BW_cutoff_idx_nf, decoder->frame_dms, + h_DecSetup->prev_fac_ns_fx, spec_inv_idx, currentScratch +#ifdef ENABLE_HR_MODE + , decoder->hrmode +#endif + ); + } +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("applyGlobalGain"); +#endif + processApplyGlobalGain_fx(q_d_fx, &q_fx_exp, decoder->yLen, gg_idx, h_DecSetup->quantizedGainOff); +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef CR9_C_ADD_1p25MS + if (tns_numfilters > 0) { +#endif +#ifdef WMOPS + push_wmops("Tns_dec"); +#endif + /* currentScratch Size = 48 bytes */ + processTnsDecoder_fx(indexes, q_d_fx, decoder->yLen, tns_order, &q_fx_exp, BW_cutoff_idx, decoder->frame_dms, + currentScratch +#ifdef ENABLE_HR_MODE + , decoder->hrmode +#endif + ); +#ifdef WMOPS + pop_wmops(); +#endif +#ifdef CR9_C_ADD_1p25MS + } +#endif + +#ifdef ENABLE_HR_MODE +#ifdef WMOPS + push_wmops("SnsInterpScfDec"); +#endif + processSnsInterpolateScf_fx(scf_q_ip, int_scf_fx_ip, int_scf_fx_exp, 0, decoder->bands_number, currentScratch); + +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Mdct shaping_dec"); +#endif + processScfScaling(int_scf_fx_exp, decoder->bands_number, &q_fx_exp); + + processMdctShaping_fx(q_d_fx, int_scf_fx_ip, int_scf_fx_exp, decoder->bands_offset, decoder->bands_number); +#ifdef WMOPS + pop_wmops(); +#endif +#else +#ifdef WMOPS + push_wmops("SnsInterpScfDec"); +#endif + /* currentScratch Size = 128 bytes */ + processSnsInterpolateScf_fx(scf_q, int_scf_fx, int_scf_fx_exp, 0, decoder->bands_number, currentScratch); +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Mdct shaping_dec"); +#endif + processScfScaling(int_scf_fx_exp, decoder->bands_number, &q_fx_exp); + processMdctShaping_fx(q_d_fx, int_scf_fx, int_scf_fx_exp, decoder->bands_offset, decoder->bands_number); +#ifdef WMOPS + pop_wmops(); +#endif + /* end int_scf_fx */ +#endif /* ENABLE_HR_MODE */ + } + + /* x_fx_ip will be used to store h_DecSetup->stDec_ola_mem_fx returned by PLCmain_fx*/ + /* This will be upshifted to 32 bit overlap buffer outside of the PLCmain function */ +#ifdef ENABLE_HR_MODE + Word16 *plc_ola_mem = (Word16 *)x_fx_ip; + IF(sub(bfi, 1) == 0) + { + FOR(i = 0; i < decoder->stDec_ola_mem_fx_len; i++) + { + plc_ola_mem[i] = round_fx(h_DecSetup->stDec_ola_mem_fx[i]); + } + } +#endif + +#ifdef WMOPS + push_wmops("PLC::Main"); +#endif + /* currentScratch Size = 2 * MAX_LGW + 8 * MAX_LPROT + 12 * MAX_L_FRAME */ + processPLCmain_fx(decoder->plcMeth, &h_DecSetup->concealMethod, &h_DecSetup->nbLostFramesInRow, bfi, + h_DecSetup->prev_bfi, decoder->frame_length, decoder->la_zeroes, decoder->W_fx, x_fx, +#ifdef ENABLE_HR_MODE + plc_ola_mem, +#else + h_DecSetup->stDec_ola_mem_fx, +#endif + &h_DecSetup->stDec_ola_mem_fx_exp, h_DecSetup->q_old_d_fx, + &h_DecSetup->q_old_fx_exp, q_d_fx, &q_fx_exp, decoder->yLen, decoder->fs_idx, + decoder->bands_offset, decoder->bands_number, &h_DecSetup->plc_damping, h_DecSetup->ltpf_mem_pitch_int, + h_DecSetup->ltpf_mem_pitch_fr, &h_DecSetup->ns_cum_alpha, &h_DecSetup->ns_seed, h_DecSetup->plcAd, + decoder->frame_dms, currentScratch, &h_DecSetup->pc_nbLostFramesInRow +#ifdef ENABLE_HR_MODE + , decoder->hrmode +#endif + , h_DecSetup->rel_pitch_change + , decoder->alpha_type_2_table + ); +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef ENABLE_HR_MODE + IF(sub(bfi, 1) == 0) + { + FOR(i = 0; i < decoder->stDec_ola_mem_fx_len; i++) + { + h_DecSetup->stDec_ola_mem_fx[i] = L_deposit_h(plc_ola_mem[i]); + } + } +#endif + +#ifdef WMOPS + push_wmops("PLC/PC::DampingScrambling"); +#endif + if (h_DecSetup->plcAd) + { + processPLCDampingScrambling_main_fx( + bfi, h_DecSetup->concealMethod, h_DecSetup->nbLostFramesInRow, &h_DecSetup->plcAd->cum_fflcAtten, + h_DecSetup->pc_nbLostFramesInRow, &h_DecSetup->ns_seed, &h_DecSetup->pc_seed, + h_DecSetup->ltpf_mem_pitch_int, ltpf_idx[0], q_d_fx, &q_fx_exp, h_DecSetup->q_old_d_fx, + &h_DecSetup->q_old_fx_exp, decoder->yLen, h_DecSetup->plcAd->stab_fac, decoder->frame_dms, + &h_DecSetup->plcAd->cum_fading_slow, &h_DecSetup->plcAd->cum_fading_fast, spec_inv_idx + , h_DecSetup->plcAd->plc_fadeout_type + ); + } +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Imdct"); +#endif + /* currentScratch Size = 4 * MAX_LEN */ + ProcessingIMDCT(q_d_fx, &q_fx_exp, decoder->W_fx, h_DecSetup->stDec_ola_mem_fx, &h_DecSetup->stDec_ola_mem_fx_exp, +#ifdef ENABLE_HR_MODE + x_fx_ip, +#else + x_fx, +#endif + decoder->W_size, decoder->frame_length, decoder->stDec_ola_mem_fx_len, decoder->frame_dms, + h_DecSetup->concealMethod, bfi, h_DecSetup->prev_bfi, h_DecSetup->nbLostFramesInRow, + h_DecSetup->plcAd, + currentScratch +#ifdef ENABLE_HR_MODE + , decoder->hrmode +#endif + ); + +#ifdef ENABLE_HR_MODE + IF(sub(bfi, 1) != 0 || sub(h_DecSetup->concealMethod, LC3_CON_TEC_NS_STD) == 0 || sub(h_DecSetup->concealMethod, LC3_CON_TEC_NS_ADV) == 0 || sub(h_DecSetup->concealMethod, LC3_CON_TEC_FREQ_MUTING) == 0) + { + round_w32tow16_arr(x_fx_ip, x_fx, decoder->frame_length); + } + ELSE + { + FOR(i = 0; i < decoder->frame_length; i++) + { + x_fx_ip[i] = L_deposit_h(x_fx[i]); + } + } +#endif /* ENABLE_HR_MODE */ + +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("PLC::Update"); +#endif + + processPLCupdate_fx(h_DecSetup->plcAd, x_fx, q_fx_exp, h_DecSetup->concealMethod, decoder->frame_length, + decoder->fs_idx, &h_DecSetup->nbLostFramesInRow, &h_DecSetup->prev_prev_bfi, + &h_DecSetup->prev_bfi, bfi, scf_q, &h_DecSetup->ns_cum_alpha +#ifdef ENABLE_HR_MODE + , decoder->hrmode +#endif + ); +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("LtpfDec"); +#endif + /* currentScratch Size = 0.5 * MAX_LEN + 20 bytes */ + process_ltpf_decoder_fx(&q_fx_exp, decoder->frame_length, decoder->ltpf_mem_x_len, decoder->fs_idx, + decoder->ltpf_mem_y_len, &h_DecSetup->ltpf_mem_e, x_fx, h_DecSetup->ltpf_mem_x, x_fx, + h_DecSetup->ltpf_mem_y, ltpf_idx[0], ltpf_idx[1], ltpf_idx[2], + &h_DecSetup->ltpf_mem_pitch_int, &h_DecSetup->ltpf_mem_pitch_fr, &h_DecSetup->ltpf_mem_gain, + &h_DecSetup->ltpf_mem_active, h_DecSetup->ltpf_scale_fac_idx, bfi, + h_DecSetup->concealMethod, + h_DecSetup->plc_damping, &h_DecSetup->ltpf_mem_scale_fac_idx, + &h_DecSetup->rel_pitch_change, decoder->hrmode, decoder->frame_dms, + currentScratch +#ifdef CR9_C_ADD_1p25MS +#ifdef FIX_TX_RX_STRUCT_STEREO + ,&h_DecSetup->ltpf_mem_continuation, &h_DecSetup->ltpf_mem_pitch_int_prev, + &h_DecSetup->ltpf_mem_pitch_fr_prev, &h_DecSetup->ltpf_mem_beta_idx_prev, &h_DecSetup->ltpf_mem_gain_prev, + &h_DecSetup->ltpf_mem_active_prev, &h_DecSetup->ltpf_pitch_stability_counter +#else + , &decoder->ltpf_mem_continuation, &decoder->ltpf_mem_pitch_int_prev, + &decoder->ltpf_mem_pitch_fr_prev, &decoder->ltpf_mem_beta_idx_prev, &decoder->ltpf_mem_gain_prev, + &decoder->ltpf_mem_active_prev, &decoder->ltpf_pitch_stability_counter +#endif +#endif + ); +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef ENABLE_HR_MODE + IF (!(decoder->hrmode)) + { + FOR (i = 0; i < decoder->frame_length; i++) + { + x_fx_ip[i] = L_deposit_h(x_fx[i]); + } + } +#endif + +#ifdef WMOPS + push_wmops("Output scaling"); +#endif + { + scale = sub(sub(31 + 16, bits_per_sample), q_fx_exp); + offset = L_shr_sat(32768, sub(16, scale)); + IF (bits_per_sample == 16) + { + scale = sub(15, q_fx_exp); + FOR (i = 0; i < decoder->frame_length; i++) + { +#ifdef ENABLE_HR_MODE + ((Word16 *)s_out)[i] = round_fx_sat(L_shr_sat(x_fx_ip[i], scale)); +#else + ((Word16 *)s_out)[i] = round_fx_sat(L_shr_sat(L_deposit_h(x_fx[i]), scale)); +#endif + move16(); + } + } + ELSE + { + FOR (i = 0; i < decoder->frame_length; i++) + { +#ifdef ENABLE_HR_MODE + ((Word32 *)s_out)[i] = L_shr_sat(L_add_sat(x_fx_ip[i], offset), scale); +#else + ((Word32 *)s_out)[i] = L_shr_sat(L_add_sat(L_deposit_h(x_fx[i]), offset), scale); +#endif + move32(); + } + } + } +#ifdef WMOPS + pop_wmops(); /* Output scaling */ +#endif + +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + pop_wmops(); /* Decoder */ +#endif + + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif + return bfi; +} + +/* num_bytes = 0 -> bad frame */ +LC3PLUS_Error Dec_LC3PLUS(LC3PLUS_Dec *decoder, UWord8 *input, int num_bytes, void **output, int bits_per_sample, void *scratch, + int bfi_ext) +{ + int ch = 0, bfi = bfi_ext; + LC3PLUS_Error err = LC3PLUS_OK; + int fec_num_bytes; + int lc3_num_bytes; + int lc3_channel_num_bytes; + int channel_bfi, out_bfi; + Word16 channel_epmr; + + if (bfi == 0) + { + bfi = !num_bytes; + } + + if (decoder->ep_enabled) + { + decoder->combined_channel_coding = decoder->channels > 1 && num_bytes <= 160; + + if (decoder->combined_channel_coding) + { + fec_num_bytes = num_bytes; + +#ifdef WMOPS + push_wmops("fec_dec"); +#endif + + decoder->error_report = + fec_decoder(input, fec_num_bytes, &lc3_num_bytes, &decoder->epmr, decoder->combined_channel_coding, + &decoder->n_pccw, &bfi, &decoder->be_bp_left, &decoder->be_bp_right, &decoder->n_pc, + &decoder->m_fec, scratch); + +#ifdef WMOPS + pop_wmops(); +#endif + + for (ch = 0; ch < decoder->channels; ch++) + { + lc3_channel_num_bytes = lc3_num_bytes / decoder->channels + (ch < (lc3_num_bytes % decoder->channels)); + + + if (bfi != 1 && lc3_channel_num_bytes != decoder->channel_setup[ch]->last_size) + { + err = update_dec_bitrate(decoder, ch, lc3_channel_num_bytes); + + if (err) + { + bfi = 1; + } + else + { + decoder->channel_setup[ch]->last_size = lc3_channel_num_bytes; + } + } + + bfi = Dec_LC3PLUS_Channel(decoder, ch, bits_per_sample, input, output[ch], bfi, scratch); + if (input != NULL) + { + input += decoder->channel_setup[ch]->targetBytes; + } + } + } + else + { + decoder->epmr = 12; + out_bfi = 0; + decoder->error_report = 0; + + for (ch = 0; ch < decoder->channels; ch++) + { + fec_num_bytes = num_bytes / decoder->channels + (ch < (num_bytes % decoder->channels)); + +#ifdef WMOPS + push_wmops("fec_dec"); +#endif + + channel_bfi = bfi; + + Word32 chan_error_report = + fec_decoder(input, fec_num_bytes, &lc3_num_bytes, &channel_epmr, decoder->combined_channel_coding, + &decoder->n_pccw, &channel_bfi, &decoder->be_bp_left, &decoder->be_bp_right, + &decoder->n_pc, &decoder->m_fec, scratch); + + if (chan_error_report < 0 || decoder->error_report < 0) { + decoder->error_report = -1; move16(); + } else { + decoder->error_report = add(decoder->error_report, chan_error_report); + } + +#ifdef WMOPS + pop_wmops(); +#endif + + decoder->epmr = MIN(decoder->epmr, channel_epmr); + + +#ifdef ENABLE_PADDING + if (channel_bfi != 1) + { + Word16 padding_len, np_zero; + + if (paddingDec_fx(input, shl(lc3_num_bytes, 3), decoder->yLen, decoder->BW_cutoff_bits, + decoder->ep_enabled, &padding_len, &np_zero)) + { + channel_bfi = 1; + } + + if (input != NULL) + { + input = input + np_zero; + } + decoder->n_pc = s_max(decoder->n_pc - (2 * np_zero), 0); + + if (channel_bfi == 2) + { + if (decoder->be_bp_right < (8 * np_zero)) + { + channel_bfi = 0; + decoder->be_bp_left = -1; + decoder->be_bp_right = -1; + } + else + { + decoder->be_bp_right = decoder->be_bp_right - (8 * np_zero); + decoder->be_bp_left = s_max(decoder->be_bp_left - (8 * np_zero), 0); + } + } + + lc3_num_bytes = lc3_num_bytes - padding_len; + } +#endif + + if (channel_bfi != 1 && lc3_num_bytes != decoder->channel_setup[ch]->last_size) + { + err = update_dec_bitrate(decoder, ch, lc3_num_bytes); + if (err) + { + channel_bfi = 1; + } + else + { + decoder->channel_setup[ch]->last_size = lc3_num_bytes; + } + } + + channel_bfi = Dec_LC3PLUS_Channel(decoder, ch, bits_per_sample, input, output[ch], channel_bfi, scratch); + + out_bfi |= channel_bfi; + if (input != NULL) + { + input += fec_num_bytes; + } + } + + bfi = out_bfi & 1; + } + } + else + { + for (ch = 0; ch < decoder->channels; ch++) + { + lc3_num_bytes = num_bytes / decoder->channels + (ch < (num_bytes % decoder->channels)); + +#ifdef ENABLE_PADDING + if (bfi != 1) + { + Word16 padding_len, np_zero; + + if (paddingDec_fx(input, shl(lc3_num_bytes, 3), decoder->yLen, decoder->BW_cutoff_bits, + decoder->ep_enabled, &padding_len, &np_zero)) + { + bfi = 1; + } + + lc3_num_bytes = lc3_num_bytes - padding_len; + if (lc3_num_bytes < 20 || lc3_num_bytes > LC3PLUS_MAX_BYTES) + { + bfi = 1; /* mark frame as broken if frame sizeif below the minimum of 20 bytes */ + } + } +#endif + + if (bfi != 1 && lc3_num_bytes != decoder->channel_setup[ch]->last_size) + { + err = update_dec_bitrate(decoder, ch, lc3_num_bytes); + if (err) + { + bfi = 1; + } + else + { + decoder->channel_setup[ch]->last_size = lc3_num_bytes; + } + } + + bfi = Dec_LC3PLUS_Channel(decoder, ch, bits_per_sample, input, output[ch], bfi, scratch); + if (input != NULL) + { + input += decoder->channel_setup[ch]->targetBytes; + } + } + } + + return bfi == 1 ? LC3PLUS_DECODE_ERROR : LC3PLUS_OK; +} diff --git a/lib_lc3plus/defines.h b/lib_lc3plus/defines.h new file mode 100644 index 0000000000000000000000000000000000000000..74652147158ddb7ff4dec13dceb33c171e8be032 --- /dev/null +++ b/lib_lc3plus/defines.h @@ -0,0 +1,880 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#ifndef DEFINES_H +#define DEFINES_H + +#ifndef DISABLE_HR_MODE +#define ENABLE_HR_MODE +#endif + +#ifdef ENABLE_HR_MODE +#define MAX_BW_HR 960 +#endif + +#ifdef ENABLE_HR_MODE +#define extractW16(a) extract_h(a) +#else +#define extractW16(a) (a) +#endif + +#define MAX_BR 320000 /* 400 * 800 */ + +/* FUNCTION MACROS */ +/* NB, divisions in some of these MACROs, use mainly for initial setup, do not use in loops */ +#define CEILING(x, y) (((x) + (y)-1) / (y)) + +#define FRAME2FS_IDX(x) (x / 100) /* 80 -> 0, 160 -> 1, 240 -> 2, 320 -> 3, 480 -> 4 */ +#ifdef ENABLE_HR_MODE +#define FS2FS_IDX(x) ((x) == 96000 ? 5 : (x) / 10000) /* 8000 -> 0, 16000 -> 1, 24000 -> 2, 32000 -> 3, 48000 -> 4, 96000 -> 5 */ +#else +#define FS2FS_IDX(x) (x / 10000) /* 8000 -> 0, 16000 -> 1, 24000 -> 2, 32000 -> 3, 48000 -> 4 */ +#endif + +#define UNUSED(x) (void)(x) /* silence unused parameter warning */ +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define STATIC_ASSERTS(cond, s) typedef char assert_##s[(cond) ? 1 : -1] +#define STATIC_ASSERTI(cond, i) STATIC_ASSERTS(cond, i) +#define STATIC_ASSERT(cond) STATIC_ASSERTI(cond, __LINE__) +#define TRACE(x) PRINTF("%s:%i %s = %i\n", __FILE__, __LINE__, #x, (int)(x)) + +/* For dynamic memory calculations */ +#define CODEC_FS(fs) ((fs) == 44100 ? 48000 : (fs)) + +#define DYN_MAX_LEN(fs) (CODEC_FS(fs) / 100) +#define DYN_MAX_LEN_EXT(fs) MAX(CODEC_FS(fs) / 100, 160) /* extension to length 160 for NB(fs=8000) */ +#define DYN_MAX_LPROT(fs) ((512 * (CODEC_FS(fs) / 100)) / 320) + +#define DYN_MAX_PLOCS(fs) (DYN_MAX_LPROT(fs) / 4 + 1) +#define DYN_MAX_MDCT_LEN(fs) (DYN_MAX_LEN(fs) - (180 * DYN_MAX_LEN(fs) / 480)) + +#define MAX_PITCH_FS(fs) (CEILING((MAX_PITCH_12K8 * CODEC_FS(fs)), (12800))) + +/* get the maximum buffer size assuming 10 ms framing */ +/* MAX_PITCH was previously always the highest fs in the current SUBSET , i.e. typically 48 kHz */ +/* now fs(from incoming wav file) adaptive MAX_PITCH_FS(fs) is used instead */ +#define DYN_MAX_LEN_PCM_PLC_CLASSIFIER(fs) \ + (MAX_PITCH_FS(fs) + DYN_MAX_LEN(fs)) /* CLASSIFIER PCM memory requirement */ +#define DYN_MAX_LEN_PCM_PLC_TDCAPPLYFILTER(fs) \ + ((M + 1) + MAX_PITCH_FS(fs) + (DYN_MAX_LEN(fs) / 2)) /* TDC filtering PCM memory requirement */ + +#ifdef ENABLE_HR_MODE +#define DYN_MAX_LEN_PCM_PLC(fs) (MAX_PITCH_FS(fs) + DYN_MAX_LEN(fs)) +#else +#define DYN_MAX_LEN_PCM_PLC(fs) MAX(DYN_MAX_LEN_PCM_PLC_CLASSIFIER(fs), DYN_MAX_LEN_PCM_PLC_TDCAPPLYFILTER(fs)) +#endif + +#define FRAME_MS_BLOCK 25 + +/* OPTIONS */ +#define ENABLE_ADVANCED_PLC +#define ENABLE_ADVANCED_PLC_DEFAULT +#define ENABLE_BW_CONTROLLER +#define ENABLE_ERROR_PROTECTION +#define ENABLE_RFRAME +#define ENABLE_PC +#define ENABLE_PLC +#define ENABLE_PADDING +/* flags */ +#define ENABLE_BANDWIDTH_FLAG +#define ENABLE_RBANDWIDTH_FLAG +#define ENABLE_EP_MODE_FLAG +#define ENABLE_FRAME_MS_FLAG + +#ifndef NO_POST_REL_CHANGES +/* Post-release non-bitexact changes */ +#define CR13_B_FIX_PC_BINS +#define CR13_C_RESET_CLASSIFIER_AFTER_BAD_FRAMES + +#define CR12_B_STOP_DC_RINGING +#define CR12_D_FIX_BITRATE_LIMITS + +#define CR9_C_ADD_1p25MS + +#ifdef CR9_C_ADD_1p25MS + +#define CR9_C_ADD_1p25MS_LRSNS +#define ENABLE_12p5_DMS_MODE +#define NOISEFILLWIDTH_1_25MS 1 +#define NOISEFILLSTART_1_25MS 6 + +#define CR9_C_ADD_1p25MS_NOISEFILLING +#define CR9_1p25MS_SNS_TILT +#define CR9_1p25MS_SNS_TILT_FIX_DELTA_AD_LINE + +#define PLC34_ATTEN_FAC_125_FX 32752 + +#define LTPF_ADAPTIVE_GAIN + +#ifdef LTPF_ADAPTIVE_GAIN +#define LTPF_PITCH_STABILITY_THRESHOLD 5 /* Number of frames for which the pitch must be constant for adaptive gain and pitch correction to be applied */ +#define LTPF_ADAPTIVE_GAIN_RATE 20 /* Number of frames it must take to reach maximum beta from the default value, provided the pitch remains constant */ + +#define LTPF_ADAPTIVE_GAIN_WITH_NORM_CORR +#endif + +/* master integration fixes for 1p25 */ +#ifdef CR9_C_ADD_1p25MS +#define FIX_BASOP_ENC_QUANTIZE_1P25MS_512KBPS /* add two last MDCT coeffs into the last quadruple for global_gain _xmax_ and energy analysis */ + + +#define FIX_BOTH_1p25_WB_GLOBGAINOFFSET_NONBE /* 1p25 curve tilt calulation corrected and made into BASOP, WB had a loss of of HF in the range 211-260 kbps */ +#define FIX_BOTH_1p25_WB_GLOBGAINOFFSET_LOWLIM_NONBE -135 /* 1p25 curve tilt calulation limited to value -135 kbps */ + +#define FIX_BOTH_1p25_TEST_NEW_GG_EST2 /* GG_EST2_will use bands with two coeffs in each instead of four, for 1p25 WB and 1p25 SSWB , note only active for regular, hrmode==0 */ + +#ifdef FIX_BOTH_1p25_TEST_NEW_GG_EST2 +#define FIX_BASOP_1p25_NEW_GG_EST3 /* GG_EST3 , GG_EST2 with optimized code for better BASOP code reuse , less changes to non 1p25ms */ +#define FIX_BOTH_1p25_GG_EST_SWB_FB /* 1.25ms GG_EST update for SWB/FB, better RD curve float and BASOP , active for hrmode==0 */ +#endif + +/* defines to activate 2 or 3 tuple 1.25ms loops for WB,SSWB,SWB,FB */ +#define FIX_1p25_GG_EST_TUPLES /* 1.25 ms GG_EST2_will use 2,3 or 4 , note only active for regular, hrmode==0 */ +#ifdef FIX_1p25_GG_EST_TUPLES +#define GG_1p25_WB_TUPLES 2 +#define GG_1p25_SSWB_TUPLES 2 +#define GG_1p25_SWB_TUPLES 2 +#define GG_1p25_FB_TUPLES 3 +#define GG_1p25_MAX_TUPLES MAX(MAX(GG_1p25_WB_TUPLES ,GG_1p25_SSWB_TUPLES ), MAX(GG_1p25_SWB_TUPLES ,GG_1p25_FB_TUPLES)) /* used to control common energy loop */ +#define FIX_1p25_32kHz_CLANG_WARNING_EST_GAIN + +#ifndef FIX_BOTH_1p25_ALLOC_SPECTRUM +#define FIX_BOTH_1p25_ALLOC_SPECTRUM +#endif + +#define FIX_1p25_FLEX_ITER_TUPLE_LOOP /* energy loop part optimized BASOP only */ +#define LOG2_LC_APPROX /* log2_LC(energy) call BASOP only */ /* only applied to 1p25 ms global gain estimation loop */ +#define FIX_1p25_FLEX_BISECT_LOOP /* bisect optimization BASOP only !! */ + +#endif + +#define FIX_LTPFDEC_BASOP /* added saturation and apply L_max() */ + +/* all 1p25ms precision optimizations */ + +#define FIX_BASOP_ENC_LRSNS_CBC_MSE /* recalculate CB_C MSE to better match CFL cbC vs st2 decision */ +#define FIX_BASOP_ENC_LRSNS_ST2FULL_PROJ /* less optimistic pre-projection for Y_FULL , better match CFL */ + +#define FIX_BASOP_LT_NORMCORR_AR1 /* better exact representation of 0.8 LT normcorr limit */ +#define FIX_BASOP_PREEMPH_CALC /* only1p25ms higher precision in adaptive preemphasis addition , average increase by ~6dB, minSNR increased by ~1dB */ + +#define FIX_SNS_BASOP_MEAN64_CALC /* norm for all energy bands to reduce SCF target variations before log2 domain */ +#ifdef FIX_SNS_BASOP_MEAN64_CALC +#define FIX_SNS_BASOP_NF_APPL /* apply noisefill 1/10000 in the W32*exp energy domain, not in the inexact 1/9998 W16Q9 log2 domain */ +#endif +#define FIX_SNS_BASOP_MEAN16_APPLY /* norm for all 16 scg log2 bands to reduce SCF target variations */ + +#endif + +#ifdef CR9_C_ADD_1p25MS_LRSNS + /*NB CR9_C_ADD_1p25MS_LRSNS requires NEW_SIGNALLING_SCHEME_1p25 */ +#define LRSNS_PC_SIGNAL_FIX /*correct handling of incoming bfi==2 to DEC_ENTROPY for conformance */ +/* #define USE_LC3_OPERATORS */ + +#define LRSNS_10MS_BFISIGNAL_FIX /* correct signaling of detected BER in both 10ms SNS/and in 1.25ms LRSNS */ + +#define LRSNS_ALLZERO_FIX /* BASOP_Util_InvLog2_pos(), incorrect exponent for 2^0, became appearant for an all zero vector in LRSNS CB_A */ +#define LRSNS_MORE_SCRATCH /* set BASOP SCRATCH to max values */ +/* #define LRSNS_CBC_NO_LTPF_DEPENDENCY */ /* turn off LRSNS CB_C dependency on LTPF activation flag */ + +#define SNSLR_N_FIXENV 4 /* 4 fix envelopes multiplexed inside the full codeword */ +#define SNSLR_N_FIXENV_SHIFTS 4 /* 2 bits */ +#define SNSLR_MAX_PVQ_CAND 6 /* splitLF(0), full(1), fixed_env 2+{0,1,2,3 }, */ +#define SNSLR_MAX_PVQ_SEARCH_CAND (SNSLR_MAX_PVQ_CAND-SNSLR_N_FIXENV+1) /* 3 = splitLF(0), full(1), fixed_envs(2), */ +#define SNS_IDX_SHAPEJ 2 /* shape index location */ + +#endif + + +#define FIX_LTPF_PITCH_1p25 +#define FIX_LTPF_MEM_CONTINUATION +#define FIX_LTPF_PITCH_MEM_LEN +#define FIX_PLC_CONFORM_ISSUES +#define FIX_TDC_BURST_ERROR +#define FIX_LTPF_DEC_FLFX_MISMATCH +#define FIX_TX_RX_STRUCT_STEREO +#define NEW_SIGNALLING_SCHEME_1p25 +#define FIX_LTPF_1p25 + +#endif /* CR9_C_ADD_1p25MS */ + +#endif /* NO_POST_REL_CHANGES Post-release changes */ + +#ifdef CR9_C_ADD_1p25MS +#define LEN_MEM_NORMCORR 5 +#else +#define LEN_MEM_NORMCORR 2 +#endif + +#define THRESH_100_DMS_TDC_CNT 9 +#define THRESH_100_DMS_NS_CNT 7 +#define THRESH_100_DMS_TDC_NS_CNT 73 +#define THRESH_075_DMS_TDC_CNT 7 +#define THRESH_075_DMS_NS_CNT 7 +#define THRESH_075_DMS_TDC_NS_CNT 87 +#define THRESH_050_DMS_TDC_CNT 22 +#define THRESH_050_DMS_NS_CNT 15 +#define THRESH_050_DMS_TDC_NS_CNT 141 +#define THRESH_025_DMS_TDC_CNT 20 +#define THRESH_025_DMS_NS_CNT 21 +#define THRESH_025_DMS_TDC_NS_CNT 278 +#define PLC_LONGTERM_ANALYSIS_MS 200 /* Nominal analysis window 2000 ms */ +#define PLC_LONGTERM_ANALYSIS_STARTUP_FILL (Word16)(0.5*32768.0) /* 16384/32768 == 0.5 required buffer fill amount, set to 0.0 to not require any fill at all */ + +#define REL_PITCH_THRESH 11796 + +#define MIN_BR_100DMS 16000 /* 20 * 800 * 100/100 */ +#ifdef SUBSET_NB +#define MAX_BR_100DMS_NB 114400 /* for 100ms at 8kHz */ +#endif +#ifdef SUBSET_WB +#define MAX_BR_100DMS_WB 221600 /* for 100ms at 16kHz */ +#endif +#ifdef SUBSET_SSWB +#define MAX_BR_100DMS_SSWB 314400 /* for 100ms at 24kHz */ +#endif + +/* G192 bitstream writing/reading */ +#define G192_GOOD_FRAME 0x6B21 +#define G192_BAD_FRAME 0x6B20 +#define G192_REDUNDANCY_FRAME 0x6B22 +#define G192_ZERO 0x007F +#define G192_ONE 0x0081 +#define READ_G192FER /* allow C executable to also read G192 formatted FER files */ + +#ifdef DEBUG +#ifdef READ_G192FER +#define READ_G192_FER_BYTE /* Allow C executable to also read G192 byte formatted FER files 0x20=BAD , 0x21=Good */ +#endif +#endif + + +// #define DYNMEM_COUNT /* conflicts with WMC tool */ +#define STAMEM_COUNT + + +/* +do not change __forceinline for mex compilation using gcc6.3.0 or larger + gcc630 supported by MATLAB 2018b, via Mingw "app" + */ +#ifdef __GNUC__ +#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#else +#define GCC_VERSION 0 +#endif + +/* Define __forceinline as empty if ARM not activated to avoid any errors */ +#undef __forceinline +/* The above undef is needed to compile using make_mex.m without the following warning in Matlab for windows */ +#define __forceinline + +/* SUBSETS */ +#if !(defined(SUBSET_NB) || defined(SUBSET_WB) || defined(SUBSET_SSWB) || defined(SUBSET_SWB) || defined(SUBSET_FB) || defined(SUBSET_UB)) +#define SUBSET_NB +#define SUBSET_WB +#define SUBSET_SSWB +#define SUBSET_SWB +#define SUBSET_FB +#ifdef ENABLE_HR_MODE +#define SUBSET_UB +#endif +#endif + +#define MIN_BR_100DMS 16000 /* 20 * 800 * 100/100 */ +#define MIN_BR_025DMS 64000 /* 20 * 800 * 100/ 25 */ +#define MIN_BR_050DMS 32000 /* 20 * 800 * 100/ 50 */ +#define MAX_BR_050DMS_NB 260800 /* 163 * 800 * 100/ 50 */ +#ifdef SUBSET_NB +#define MAX_BR_100DMS_NB 114400 /* for 100ms at 8kHz */ +#endif +#ifdef SUBSET_WB +#define MAX_BR_100DMS_WB 221600 /* for 100ms at 16kHz */ +#endif +#ifdef SUBSET_SSWB +#define MAX_BR_100DMS_SSWB 314400 /* for 100ms at 24kHz */ +#endif + +#ifdef CR9_C_ADD_1p25MS +#define MIN_BR_0125DMS 128000 /* 20 * 800 * 100/ 12.5 */ +#define MAX_BR_0125DMS 512000 +#endif + +#define MIN_BR_075DMS_48KHZ_HR ((int)124800/ 800/2)* 800 +#define MIN_BR_075DMS_96KHZ_HR ((int)149600/ 800/2)* 800 +#define MIN_BR_075DMS 21334 /* ceil( 20 * 800 * 100/ 75) */ +#define MAX_BR_075DMS 426667 /* ceil(400 * 800 * 100/ 75) */ +#define MAX_BR_075DMS_NB 152534 /* ceil(143 * 800 * 100/ 75) */ +#define MAX_BR_075DMS_WB 295467 /* ceil(277 * 800 * 100/ 75) */ +#define MAX_BR_075DMS_SSWB 419200 /* ceil(393 * 800 * 100/ 75) */ + +#define NOISEFILLWIDTH_7_5MS 2 +#define NOISEFILLSTART_7_5MS 18 + +#define PACK_RESBITS + +/* FRAME/BUFFER */ +#ifdef SUBSET_UB +#define MAX_LEN 960 /* = 10ms at 96kHz */ +#elif defined SUBSET_FB +#define MAX_LEN 480 /* = 10ms at 48kHz */ +#elif defined(SUBSET_SWB) +#define MAX_LEN 320 /* = 10ms at 32kHz */ +#elif defined(SUBSET_SSWB) +#define MAX_LEN 240 /* = 10ms at 24kHz */ +#elif defined(SUBSET_WB) +#define MAX_LEN 160 /* = 10ms at 16kHz */ +#elif defined(SUBSET_NB) +#define MAX_LEN 80 /* = 10ms at 8kHz */ +#endif + +#ifdef ENABLE_HR_MODE +#define ENABLE_FFT_RESCALE +#define ENABLE_FFT_30X16 +#define ENABLE_DCTIV_RESCALE + +#define EXT_RES_ITER_MAX 20 +#define MAX_RESBITS 5000 +#define HR_MODE_SCRATCH_SIZE 60 +#else /* ENABLE_HR_MODE */ +#define MAX_RESBITS MAX_LEN +#endif /* ENABLE_HR_MODE */ + +/* BW Cutoff-Detection */ +#define MAX_BW_BANDS_NUMBER 5 + +#ifdef ENABLE_HR_MODE +#define RESBITS_PACK_SHIFT 3 +#define RESBITS_PACK_N (1<<(RESBITS_PACK_SHIFT)) +#define RESBITS_PACK_MASK (RESBITS_PACK_N - 1) +#define MAX_RESBITS_LEN ((MAX_RESBITS + RESBITS_PACK_MASK) >> RESBITS_PACK_SHIFT) +#define MAX_RESBITS_LEN_32BIT_ALIGN (((MAX_RESBITS_LEN + 3)/4)*4) +#else /* ENABLE_HR_MODE */ +#define MAX_RESBITS_LEN (MAX_RESBITS) +#define MAX_RESBITS_LEN_32BIT_ALIGN (((MAX_RESBITS_LEN + 3)/4)*4) +#endif /* ENABLE_HR_MODE */ + +#define MAX_CHANNELS 2 +#define MIN_NBYTES 20 /* 100dms: 16 kbps at !=44.1kHz, 14.7kbps at 44.1kHz + 50dms: 32 kbps at !=44.1kHz, 29.4kbps at 44.1kHz + 25dms: 64 kbps at !=44.1kHz, 58.8kbps at 44.1kHz */ +#define MAX_NBYTES_025 100 /* any dms: 320 kbps at !=44.1kHz, 294 kbps at 44.1kHz */ +#define MAX_NBYTES_050 200 /* any dms: 320 kbps at !=44.1kHz, 294 kbps at 44.1kHz */ +#define MAX_NBYTES_075 400 /* any dms: 320 kbps at !=44.1kHz, 294 kbps at 44.1kHz */ +#define MAX_NBYTES_100 400 /* any dms: 320 kbps at !=44.1kHz, 294 kbps at 44.1kHz */ +#ifdef ENABLE_HR_MODE +#define MIN_BR_25MS_48KHZ_HR ((int)172800/3200/2)*3200 +#define MIN_BR_25MS_96KHZ_HR ((int)198400/3200/2)*3200 +#define MIN_BR_50MS_48KHZ_HR ((int)148800/1600/2)*1600 +#define MIN_BR_50MS_96KHZ_HR ((int)174400/1600/2)*1600 +#define MIN_BR_100MS_48KHZ_HR ((int)124800/800/2)*800 +#define MIN_BR_100MS_96KHZ_HR ((int)149600/800/2)*800 +#define MAX_NBYTES_RED_HR 625 /* From table 5.2 */ +#define BYTESBUFSIZE (MAX_NBYTES_RED_HR * LC3PLUS_MAX_CHANNELS) +#else +#define BYTESBUFSIZE (MAX_NBYTES_100 * LC3PLUS_MAX_CHANNELS) +#endif +#define MAX_BW_BIN 400 +#define FEC_SLOT_BYTES_MIN 40 +#define FEC_SLOT_BYTES_MAX 400 +#ifdef CR12_D_FIX_BITRATE_LIMITS +#ifdef ENABLE_HR_MODE +#define FEC_SLOT_BYTES_MIN_025DMS_48KHZ_HR 54 +#define FEC_SLOT_BYTES_MIN_025DMS_96KHZ_HR 61 +#define FEC_SLOT_BYTES_MIN_050DMS_48KHZ_HR 87 +#define FEC_SLOT_BYTES_MIN_050DMS_96KHZ_HR 101 +#define FEC_SLOT_BYTES_MIN_075DMS_48KHZ_HR 110 +#define FEC_SLOT_BYTES_MIN_075DMS_96KHZ_HR 126 +#define FEC_SLOT_BYTES_MIN_100DMS_48KHZ_HR 140 +#define FEC_SLOT_BYTES_MIN_100DMS_96KHZ_HR 164 +#endif +#endif +#if MAX_BW_BIN > MAX_LEN +#define MAX_BW MAX_LEN +#else +#define MAX_BW MAX_BW_BIN +#endif + +#define NUM_OFFSETS 7 +#define NUM_SAMP_FREQ 6 + +/* SCF */ +#define M 16 /* LPC_ORDER */ +#define MAX_BANDS_NUMBER 64 +#define MAX_BANDS_NUMBER_PLC 80 +#define PVQ_MAX_VEC_SIZE M +#define KMAX_FX 10 /* N=10 */ +#define K_OUTL_FAR 6 +#define MPVQ_SZ_OUTL_FAR (1549824U >> 1) +#define TOTBITS_SHAPE OUTL_FAR(1.0 + 19.5637) +#define SQRT_EN_MAX_FX 64 /* table size, for fast inv_sqrt */ +#define N_SETA 10 +#define N_SETB (PVQ_MAX_VEC_SIZE - N_SETA) + +#define SNS_DAMPING 27853 /* 0.85 in Q15 */ +#ifdef ENABLE_HR_MODE +#define SNS_DAMPING_HRMODE 19661 /* 0.6 in Q15 */ +#define SNS_DAMPING_HRMODE_UB_10MS 6881 /* 0.21 in Q15 */ +#define SNS_DAMPING_HRMODE_UB_7_5MS 5898 /* 0.18 in Q15 */ +#define SNS_DAMPING_HRMODE_UB_5MS 4915 /* 0.15 in Q15 */ +#define SNS_DAMPING_HRMODE_UB_2_5MS 4915 /* 0.15 in Q15 */ +#endif + +#ifdef CR9_C_ADD_1p25MS_LRSNS +#define N_SCF_SEARCH_SHAPES_ST2_LR SNSLR_MAX_PVQ_SEARCH_CAND /* {split, full, fix} */ +#define NA_LR 5 +#define NB_LR 8 +#define NC_LR 2 /* the 2 remaining positions also coded by full*/ +#define NFULL_LR (NA_LR+NB_LR+NC_LR) + +#define PULSES_SPLIT_A_LR 6 +#define PULSES_SPLIT_B_LR 2 +#define PULSES_FULL_LR 5 /* 'full'== ABC region */ + +#define N_CANDS_FIX_LR SNSLR_N_FIXENV +#define NSIGNS_FIX_012 12 /* 15-4+1 */ +#define N_SHIFT_FIX SNSLR_N_FIXENV_SHIFTS +#define NSIGNS_FIX_3 (NSIGNS_FIX_012 -2) +#define N_SHIFT_FIX_3 SNSLR_N_FIXENV_SHIFTS + + + +#define SNSLR_NST1 170 /*, 3*170 + 2 = 512 */ +#define SNSLR_NPVQ_L5K6 1970 /* mux into 11 bits 2048 pos , 78 slots remaining, 6 whole bits */ +#define SNSLR_NPVQ_L5K8 5890 /* additional split LF part muxed into 13 bits, log2(5980)= 12.5241 */ +#define SNSLR_NPVQ_L8K2 128 /* 1+6 = 7 bits */ +#define SNSLR_NPVQ_L15K5 207006L /* 1+ 16.6593 bits , */ + +#define SNSLR_A_CNST_WEIGHT 28672 /* 0.875 */ + +#define SNS_VQ_MAX_IDX 8 + +#endif /* CR9_C_ADD_LRSNS */ + +/* PVQ VQ setup */ +#define VQMODES26 \ + ((0 << 4) + (1 << 3) + (1 << 2) + (1 << 1) + \ + (1 << 0)) /* select all shapes, including extended lf, and new far \ + shape for MODE26, add extreme far mode not enabled */ +#define SCF_STAGE1_MAX_BITS (5 + 5) /* typically only (5+5) used */ +#define SCF_STAGE1_NBCDKENTRIES 32 +#define SCF_STAGE2_MAX_GAIN_BITS 2 +#define SCF_STAGE2_NB_MODE_BITS 1 +#define SCF_STAGE2_MAX_NB_SHAPES 3 +#define SCF_MAX_PARAM 7 /* (L+H) + submode_MSB +gain+(Ia_leads+Ia_mpvq)+(Ib_joint_mpvq), submode-LSB */ +#define SCF_MAX_PARAM_ST2 (SCF_MAX_PARAM - 2) +#define N_SCF_SHAPES_ST2 4 +#define N_SCF_SHAPE_SETUPS 1 + +/* ARITHMETIC ENCODER */ +#define NBITS_CONTEXT 8 +#define NBITS_RATEQ 2 +#define A_THRES_SHIFT 2 +#define A_THRES (1 << A_THRES_SHIFT) +#define VAL_ESC 16 +#define SYM_BITS_Q 11 + +/* RESIDUAL CODING */ +#define NPRM_RESQ MAX_LEN + +/* NOISE FILLING */ +#define NOISEFILLWIDTH 3 +#define NOISEFILLSTART 24 +#define NOISEFILLWIDTH_5MS 1 +#define NOISEFILLSTART_5MS 12 +#define NOISEFILLWIDTH_2_5MS 1 +#define NOISEFILLSTART_2_5MS 6 + +/* MDCT */ +#ifdef ENABLE_HR_MODE +#define TWIDDLE ((Word32)0x5a82799a) +#else +#define TWIDDLE WORD322WORD16(0x5a82799a) +#endif +#define MDCT_MEM_LEN_MAX (MAX_LEN - ((180 * MAX_LEN) / 480)) + +/* TNS */ +#define TNS_NUMFILTERS_MAX 2 +#define TNS_COEF_RES 17 +#define INDEX_SHIFT 8 +#define NSUBDIV 3 +#define MAXLAG 8 + +/* OLPA/LTPF */ +#define LEN_12K8 128 +#define LEN_6K4 64 +#define MIN_PITCH_6K4 17 +#define MAX_PITCH_6K4 114 +#define RANGE_PITCH_6K4 98 +#define MIN_PITCH_12K8 32 +#define MAX_PITCH_12K8 228 +#define RES2_PITCH_12K8 157 +#define RES4_PITCH_12K8 127 +#define LTPF_MEMIN_LEN (MAX_PITCH_12K8 + 4) +#define M_LTPF 24 +#define LTPF_MEM_X_LEN (MAX_LEN + MAX_LEN / 40 - 2) +#define LTPF_MEM_Y_LEN (MAX_LEN + CEILING(MAX_PITCH_12K8 * MAX_LEN, 128) + (MAX_LEN / 80)) + +/* PLC */ +#define PLC_FADEOUT_TYPE_1_IN_MS 200 +#define PLC_FADEOUT_IN_MS 60 /* fade-out to zero in ms for TD-PLC and NS, minimum value is 20 */ + /* table settings */ +#define PLC2_FADEOUT_IN_MS_MIN 30 /* table min */ +#define PLC2_FADEOUT_IN_MS_MAX 140 /* table max */ +#define PLC2_FADEOUT_RES 10 /* 10 ms steps used in fade tables */ + +/* current settings */ +#define PLC2_FADEOUT_LONG_IN_MS 120 +#define PLC2_FADEOUT_IN_MS 30 /* 0 uses original constants for PLC2 + -1 uses TDC::PLC_FADEOUT_IN_MS as basis for a PLC2 macro-re-calculation + 30..140 will use a separate settings for PLC2 fadeout + 30: P800 short fade optimization + 120: Mushra optimized fade */ + + + +#define PLC4_TRANSIT_END_IN_MS PLC_FADEOUT_IN_MS /* end of transition time for noise substitution */ +#define PLC4_TRANSIT_START_IN_MS 20 /* begin of transition time for noise substitution for voiced signals */ +#define PLC34_ATTEN_FAC_100_FX 0x4000 /* attenuation factor for NS and TDC @ 10 ms (0.5000)*/ +#define PLC34_ATTEN_FAC_050_FX 0x5A83 /* attenuation factor for NS and TDC @ 5.0 ms (0.7071)*/ +#define PLC34_ATTEN_FAC_025_FX 0x6BA3 /* attenuation factor for NS and TDC @ 2.5 ms (0.8409)*/ +#define PLC34_ATTEN_FAC_075_FX 0x4C1C /* attenuation factor for NS and TDC @ 7.5 ms (0.5946) */ +#define PLC3_HPBLENDTHROTTLE 30 /* higher numbers increase throttled blending from hp filtered to unfiltered uv excitation (0 is no throttle) */ + +#define MAX_PITCH_8K (CEILING((MAX_PITCH_12K8 * 8000), (12800))) /*NB was a risky MACRO at 0.5 border !!, */ +#define MAX_PITCH_16K ((MAX_PITCH_12K8 * 16000) / (12800)) /* exact integer */ +#define MAX_PITCH_24K \ + (CEILING((MAX_PITCH_12K8 * 24000), (12800))) /* was a risky MACRO truncation at 0.5 border !! , */ +#define MAX_PITCH_32K ((MAX_PITCH_12K8 * 32000) / (12800)) /* exact integer */ +#define MAX_PITCH_48K ((MAX_PITCH_12K8 * 48000) / (12800)) /* exact integer */ + +#ifdef ENABLE_HR_MODE +#define MAX_PITCH_96K ((MAX_PITCH_12K8 * 96000) / (12800)) /* exact integer */ +#endif + +#ifdef ENABLE_HR_MODE +#define MAX_PITCH MAX_PITCH_96K +#elif defined(SUBSET_FB) +#define MAX_PITCH MAX_PITCH_48K +#elif defined(SUBSET_SWB) +#define MAX_PITCH MAX_PITCH_32K +#elif defined(SUBSET_SSWB) +#define MAX_PITCH MAX_PITCH_24K +#elif defined(SUBSET_WB) +#define MAX_PITCH MAX_PITCH_16K +#elif defined(SUBSET_NB) +#define MAX_PITCH MAX_PITCH_8K +#endif + + +/* macri MAX_LEN_PCM_PLC is used for WC memory size checking + DYN_MAX_LEN_PCM_PLC(fs) is used by static memory buffers + */ +#define MAX_LEN_PCM_PLC (MAX_PITCH + MAX_LEN) + +#define TDC_L_FIR_HP 11 +#define TDC_L_FIR_LP 11 + +#define BASE_LPROT 512 /* BASE Lprot set to 512 for 32 kHz sampling */ + +#define LPROT48K (BASE_LPROT * 48 / 32) /* Fs based Lprot */ +#define LPROT40K (BASE_LPROT * 40 / 32) /* For Fs == 48000 only use 0 - 20000 Hz in 8 bands */ +#define LPROT32K BASE_LPROT +#define LPROT24K (BASE_LPROT * 24 / 32) +#define LPROT16K (BASE_LPROT * 16 / 32) +#define LPROT8K (BASE_LPROT * 8 / 32) + +/* #define PHECU_XFP_LA 1 */ /* Original soluiton xfp generated with 1ms look ahead into MDCT memory + ctrl.PhECU.LA = 0.001 * ctrl.fs; */ +/* #define PHECU_XFP_LA 4 */ /* Option with some lookahead 1/4 ms look ahead into MDCT memory + ctrl.PhECU.LA = 0.001 * ctrl.fs / 4; */ +#define PHECU_XFP_LA \ + 0 /* Option without lookahead 0 ms look ahead into MDCT memory \ + ctrl.PhECU.LA = 0; */ + +#if (PHECU_XFP_LA == 0) + +#define PHECU_LA_48K 0 /* 0 ms */ +#define PHECU_LA_32K 0 /* 0 ms */ +#define PHECU_LA_24K 0 /* 0 ms */ +#define PHECU_LA_16K 0 /* 0 ms */ +#define PHECU_LA_8K 0 /* 0 ms */ + +#define MAX_PHECU_LA (0) + +#else +#if (PHECU_XFP_LA == 4) + +#define PHECU_LA_48K (48 / 4) /* 0.25 ms */ +#define PHECU_LA_32K (32 / 4) /* 0.25 ms */ +#define PHECU_LA_24K (24 / 4) /* 0.25 ms */ +#define PHECU_LA_16K (16 / 4) /* 0.25 ms */ +#define PHECU_LA_8K (8 / 4) /* 0.25 ms */ + +#define MAX_PHECU_LA (MAX_LEN / 10 / 4) + +#else + +#define PHECU_LA_48K 48 /* 1 ms */ +#define PHECU_LA_32K 32 /* 1 ms */ +#define PHECU_LA_24K 24 /* 1 ms */ +#define PHECU_LA_16K 16 /* 1 ms */ +#define PHECU_LA_8K 8 /* 1 ms */ + +#define MAX_PHECU_LA (MAX_LEN / 10) + +#endif +#endif + + +/* (PHECU_LA_48K == 0) */ + +#define COPY_LEN_8K 16 +#define COPY_LEN_16K 32 +#define COPY_LEN_24K 48 +#define COPY_LEN_32K 64 +#define COPY_LEN_48K 96 + +#define OLA_LEN_8K 14 +#define OLA_LEN_16K 28 +#define OLA_LEN_24K 42 +#define OLA_LEN_32K 56 +#define OLA_LEN_48K 84 + +#define LPROT48K_RED LPROT40K /* limit peak searched part of spectrum for FB */ +#define LPROT32K_RED LPROT32K /* limit peak searched part of spectrum for SWB */ +#define LPROT24K_RED LPROT24K /* limit peak searched part of spectrum for HQ */ +#define LPROT16K_RED LPROT16K /* limit peak searched part of spectrum for SQ */ +#define LPROT8K_RED LPROT8K /* limit peak searched part of spectrum for NB */ + +#define INV_LPROT48K_Q22 5461 /* round(2^22/LPROT48K) , 1/6 */ +#define INV_LPROT32K_Q22 8192 /* round(2^22/LPROT32K) , 1/4 */ +#define INV_LPROT24K_Q22 10923 /* round(2^22/LPROT24K) , 1/3 */ +#define INV_LPROT16K_Q22 16384 /* round(2^22/LPROT16K) , 1/2 */ +#define INV_LPROT8K_Q22 32767 /* round(2^22/LPROT8K) , 1/1 */ + +#define LGW48K 8 /* 8 bands defined , but may the same frequency groups as for SWB(32k) */ +#define LGW32K 7 +#define LGW24K 6 +#define LGW16K 5 +#define LGW8K 4 + +#define MAX_LGW 9 /* LGW48K + 1 !! */ + +#define UNINIT_OR_UNSAFE_OOLD_SENTINEL -32768 +#define LTOT_INIT_FLAG -32768 +#define LTOT_MIN_MAN 1 /* lowest possible energy value */ +#define LTOT_MIN_EXP -61 /* L_tot= LTOT_MIN_MAN*2^(LTOT_MIN_EXP-31) */ +#define GRP_SHAPE_INIT 0 /* Q15 */ + +#define TRANA_TIME 4 /* Transient analysis length in ms */ +#define LTRANA48K (48000 * TRANA_TIME / 1000) +#define LTRANA32K (32000 * TRANA_TIME / 1000) +#define LTRANA24K (24000 * TRANA_TIME / 1000) +#define LTRANA16K (16000 * TRANA_TIME / 1000) +#define LTRANA8K (8000 * TRANA_TIME / 1000) + +#define MAX_PLOCS ((MAX_LPROT / 4) + 1) /* maximum number of spectral peaks to be searched */ +#define QUOT_LPR_LTR 4 + +#define BETA_MUTE_FAC_INI 16384 /* Q15, initial noise attenuation factor */ + +#define OFF_FRAMES_LIMIT 30 /* Hard limit to a maximum of 300ms of burst decay frames */ + +#define Lprot_hamm_len2_48k (3 * 48) +#define Lprot_hamm_len2_32k (3 * 32) +#define Lprot_hamm_len2_24k (3 * 24) +#define Lprot_hamm_len2_16k (3 * 16) +#define Lprot_hamm_len2_8k (3 * 8) + +#define FRAME_TIME 10 /* Frame length in ms */ + +#define L_FRAME48K (48000 * FRAME_TIME / 1000) +#define L_FRAME32K (32000 * FRAME_TIME / 1000) +#define L_FRAME24K (24000 * FRAME_TIME / 1000) +#define L_FRAME16K (16000 * FRAME_TIME / 1000) +#define L_FRAME8K (8000 * FRAME_TIME / 1000) + +#ifdef DISABLE_PLC +#define MAX_LTRANA 0 +#define MAX_LPROT LPROT48K +#define MAX_L_FRAME L_FRAME48K +#define MAX_LPROT_RED LPROT48K_RED +#else + +#ifdef SUBSET_UB +#define MAX_LPROT LPROT48K /* Max length of protype frame for buffer allocation */ +#define MAX_LPROT_RED LPROT48K_RED /* stack alloc peak searched part */ +#define MAX_LTRANA LTRANA48K +#define MAX_L_FRAME L_FRAME48K +#elif defined(SUBSET_FB) +#define MAX_LPROT LPROT48K /* Max length of protype frame for buffer allocation */ +#define MAX_LPROT_RED LPROT48K_RED /* stack alloc peak searched part */ +#define MAX_LTRANA LTRANA48K +#define MAX_L_FRAME L_FRAME48K +#elif defined(SUBSET_SWB) +#define MAX_LPROT LPROT32K +#define MAX_LPROT_RED LPROT32K_RED /* stack alloc peak searched part */ +#define MAX_LTRANA LTRANA32K +#define MAX_L_FRAME L_FRAME32K +#elif defined(SUBSET_SSWB) +#define MAX_LPROT LPROT24K +#define MAX_LPROT_RED LPROT24K_RED /* stack alloc peak searched part */ +#define MAX_LTRANA LTRANA24K +#define MAX_L_FRAME L_FRAME24K +#elif defined(SUBSET_WB) +#define MAX_LPROT LPROT16K +#define MAX_LPROT_RED LPROT16K_RED /* stack alloc peak searched part */ +#define MAX_LTRANA LTRANA16K +#define MAX_L_FRAME L_FRAME16K +#elif defined(SUBSET_NB) +#define MAX_LPROT LPROT8K +#define MAX_LPROT_RED LPROT8K_RED /* stack alloc peak searched part */ +#define MAX_LTRANA LTRANA8K +#define MAX_L_FRAME L_FRAME8K +#endif + +#endif /* #ifdef DISABLE_PLC */ + +#define INV_L_FRAME48K_Q15 32768 / L_FRAME48K +#define INV_L_FRAME32K_Q15 32768 / L_FRAME32K +#define INV_L_FRAME24K_Q15 32768 / L_FRAME24K +#define INV_L_FRAME16K_Q15 32768 / L_FRAME16K +#define INV_L_FRAME8K_Q15 32768 / L_FRAME8K + +#define MDCT_MEM_LEN_48 (L_FRAME48K - ((180 * L_FRAME48K) / 480)) + +#define R1_48 690 +#define R2_48 420 +#define R1_16 230 +#define R2_16 140 +#define R1_25 368 +#define R2_25 224 + +#define MAX_LEN_PCM_PLC_TOT (MAX_LEN_PCM_PLC) /* TDC_pcm_buff */ +#define MAX_WIN_PRE_TDA (0) /* not in RAM any longer , now stored in ROM only as PhECU_wins[fs_idx][1] */ + +#define MAX_PLCMETH 1 + +/* Scratch buffer defines */ +#define scratchBuffer_ACTIVE +#ifdef ENABLE_HR_MODE +#define SCRATCH_BUF_LEN_ENC (4 * MAX_LEN + 32 + 32 + 4 * MAX_LEN + 3 * MAX_LEN + MAX_RESBITS_LEN_32BIT_ALIGN) +#define SCRATCH_BUF_LEN_ENC_CURRENT_SCRATCH (4 * MAX_LEN + 8 * 60 + MAX_LEN) +#else +#define SCRATCH_BUF_LEN_ENC (4 * MAX_LEN + 32 + 32 + 2 * MAX_LEN + 3 * MAX_LEN + MAX_RESBITS_LEN_32BIT_ALIGN) +#define SCRATCH_BUF_LEN_ENC_CURRENT_SCRATCH (4 * MAX_LEN) +#endif + +#define SCRATCH_BUF_LEN_ENC_TOT (SCRATCH_BUF_LEN_ENC + SCRATCH_BUF_LEN_ENC_CURRENT_SCRATCH) + +#ifdef ENABLE_HR_MODE +#define SCRATCH_BUF_LEN_DEC (4 * MAX_LEN + MAX_RESBITS_LEN_32BIT_ALIGN + 32 + 32 + 4 * MAX_LEN + 32 + 128 + 128) +#else +#define SCRATCH_BUF_LEN_DEC (4 * MAX_LEN + 2 * MAX_LEN + 32 + 32 + 2 * MAX_LEN + 32 + 128 + 128) +#endif +#define SCRATCH_BUF_LEN_DEC_CURRENT_SCRATCH (2 * MAX_LGW + 8 * MAX_LPROT + 12 * MAX_L_FRAME) +#ifdef ENABLE_HR_MODE +#define SCRATCH_BUF_LEN_DEC_TOT (SCRATCH_BUF_LEN_DEC + (4 * HR_MODE_SCRATCH_SIZE) + SCRATCH_BUF_LEN_DEC_CURRENT_SCRATCH) +#else +#define SCRATCH_BUF_LEN_DEC_TOT (SCRATCH_BUF_LEN_DEC + SCRATCH_BUF_LEN_DEC_CURRENT_SCRATCH) +#endif + +#define ADVACED_PLC_SIZE \ + (sizeof(AplcSetup) + (4 + 2) * MAX_PLOCS + 2 * MAX_LEN_PCM_PLC_TOT + 0 * MAX_LPROT + 2 * MDCT_MEM_LEN_MAX + \ + 2 * MAX_WIN_PRE_TDA) +/* ERI : Correct this sum after ROM/RAM , joint RAM optimizations */ + + +#define ENC_MAX_SIZE (sizeof(LC3PLUS_Enc) + MAX_CHANNELS * (sizeof(EncSetup) + 6 * MDCT_MEM_LEN_MAX)) +#define DEC_MAX_SIZE \ + (sizeof(LC3PLUS_Dec) + MAX_CHANNELS * (sizeof(DecSetup) + ADVACED_PLC_SIZE + 2 * LTPF_MEM_X_LEN + 2 * LTPF_MEM_Y_LEN + \ + 2 * MDCT_MEM_LEN_MAX + 2 * MAX_BW)) + +#if (defined(_M_ARM) || defined(__CC_ARM) || defined(__TMS470__) || defined(__arm__) || defined(__aarch64__)) && \ + (defined(__TARGET_FEATURE_NEON) || defined(__ARM_NEON) || defined(__ARM_NEON__) || defined(__ARM_AARCH64_NEON__)) +#define ALIGNMENT_DEFAULT 16 +#elif defined(__bfin__) +#define ALIGNMENT_DEFAULT 4 +#else +#define ALIGNMENT_DEFAULT 8 +#endif + +/* RAM_ALIGN keyword causes memory alignment of global variables. */ +#if defined(__GNUC__) +#define RAM_ALIGN __attribute__((aligned(ALIGNMENT_DEFAULT))) +#elif defined(__CC_ARM) +#define RAM_ALIGN __align(ALIGNMENT_DEFAULT) +#elif defined(__ANALOG_EXTENSIONS__) +#define RAM_ALIGN +#pragma pack(ALIGNMENT_DEFAULT) +#elif defined(_MSC_VER) +#define RAM_ALIGN __declspec(align(ALIGNMENT_DEFAULT)) +#else +#define RAM_ALIGN +#endif + +#define scratchAlign(ptr, offset) (void *)(((uintptr_t)(ptr) + (offset) + 0x3) & ~0x3) + + + +/* some configurations leave empty translation units. */ +extern int fix_empty_translation_unit_warning; + +#define FIX_IVAS_LC3PLUS_DUPLICATES +#ifdef FIX_IVAS_LC3PLUS_DUPLICATES +#define abs_s_sat abs_s +#define BASOP_cfft BASOP_cfft_lc3plus +#define BASOP_getTables BASOP_getTables_lc3plus +#define BASOP_Util_Add_Mant32Exp BASOP_Util_Add_Mant32Exp_lc3plus +#define BASOP_Util_Cmp_Mant32Exp BASOP_Util_Cmp_Mant32Exp_lc3plus +#define BASOP_Util_Divide1616_Scale BASOP_Util_Divide1616_Scale_lc3plus +#define BASOP_Util_Divide3216_Scale BASOP_Util_Divide3216_Scale_lc3plus +#define BASOP_Util_InvLog2 BASOP_Util_InvLog2_lc3plus +#define BASOP_Util_Log2 BASOP_Util_Log2_lc3plus +#define Copy_Scale_sig Copy_Scale_sig_lc3plus +#define exp2_tab_long exp2_tab_long_lc3plus +#define exp2w_tab_long exp2w_tab_long_lc3plus +#define exp2x_tab_long exp2x_tab_long_lc3plus +#define get_size_mpvq_calc_offset_fx get_size_mpvq_calc_offset_fx_lc3plus +#define getScaleFactor16 getScaleFactor16_lc3plus +#define getScaleFactor32 getScaleFactor32_lc3plus +#define i_mult DEPR_i_mult +#define Inv16 Inv16_lc3plus +#define InvDiffTable InvDiffTable_lc3plus +#define InvIntTable InvIntTable_lc3plus +#define InvTable InvTable_lc3plus +#define ISqrt16 ISqrt16_lc3plus +#define ISqrtDiffTable ISqrtDiffTable_lc3plus +#define ISqrtTable ISqrtTable_lc3plus +#define L_abs_sat L_abs +#define ldCoeff ldCoeff_lc3plus +#define Norm32Norm Norm32Norm_lc3plus +#define POW_ATT_TABLE0 POW_ATT_TABLE0_lc3plus +#define POW_ATT_TABLE1 POW_ATT_TABLE1_lc3plus +#define RotVector_320 RotVector_320_lc3plus +#define RotVector_480 RotVector_480_lc3plus +#define Scale_sig Scale_sig_lc3plus +#define SineTable320 SineTable320_lc3plus +#define SineWindow120 SineWindow120_lc3plus +#define SineWindow160 SineWindow160_lc3plus +#define SineWindow180 SineWindow180_lc3plus +#define SineWindow20 SineWindow20_lc3plus +#define SineWindow30 SineWindow30_lc3plus +#define SineWindow320 SineWindow320_lc3plus +#define SineWindow40 SineWindow40_lc3plus +#define SineWindow60 SineWindow60_lc3plus +#define SineWindow80 SineWindow80_lc3plus +#define Sqrt16 Sqrt16_lc3plus +#define SqrtDiffTable SqrtDiffTable_lc3plus +#define SqrtTable SqrtTable_lc3plus +#define Tab_esc_nb Tab_esc_nb_lc3plus +#define tnsAcfWindow tnsAcfWindow_lc3plus +#endif /* FIX_IVAS_LC3PLUS_DUPLICATES */ +#endif /* DEFINES_H */ diff --git a/lib_lc3plus/detect_cutoff_warped_fx.c b/lib_lc3plus/detect_cutoff_warped_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..e57723f7b66869f63cf50a078a5e5faf8161c745 --- /dev/null +++ b/lib_lc3plus/detect_cutoff_warped_fx.c @@ -0,0 +1,135 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" +#include "rom_basop_util_lc3plus.h" + +void processDetectCutoffWarped_fx(Word16 *bw_idx, Word32 *d2_fx, Word16 d2_fx_exp, Word16 fs_idx, LC3PLUS_FrameDuration frame_dms) +{ + + Dyn_Mem_Deluxe_In( + Counter iBand; + Word32 d2_fx_sum; + Word32 d2_fx_mean; + Word32 delta_energy; + Word16 d2_fx_sum_exp; + Word16 d2_fx_mean_exp; + Word16 nrg_below_thresh; + Word16 counter; + Word16 brickwall; + Word16 stop; + Word16 brickwall_dist; + const Word16 *warp_idx_start, *warp_idx_stop, *bw_brickwall_dist; + ); + + warp_idx_start = 0; + warp_idx_stop = 0; + bw_brickwall_dist = 0; + + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + *bw_idx = fs_idx; move16(); + Dyn_Mem_Deluxe_Out(); + return; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + warp_idx_start = BW_warp_idx_start_all_2_5ms[fs_idx - 1]; move16(); + warp_idx_stop = BW_warp_idx_stop_all_2_5ms[fs_idx - 1]; move16(); + bw_brickwall_dist = BW_brickwall_dist_2_5ms; + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + warp_idx_start = BW_warp_idx_start_all_5ms[fs_idx - 1]; move16(); + warp_idx_stop = BW_warp_idx_stop_all_5ms[fs_idx - 1]; move16(); + bw_brickwall_dist = BW_brickwall_dist_5ms; + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + warp_idx_start = BW_warp_idx_start_all_7_5ms[fs_idx - 1]; move16(); + warp_idx_stop = BW_warp_idx_stop_all_7_5ms[fs_idx - 1]; move16(); + bw_brickwall_dist = BW_brickwall_dist_7_5ms; + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + warp_idx_start = BW_warp_idx_start_all[fs_idx - 1]; move16(); + warp_idx_stop = BW_warp_idx_stop_all[fs_idx - 1]; move16(); + bw_brickwall_dist = BW_brickwall_dist; + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + counter = fs_idx; + DO + { + + /* counter is 0...num_idxs-1 */ + counter = sub(counter, 1); + + /* always code the lowest band (NB), skip check against threshold if counter == -1 */ + IF (counter < 0) + { + BREAK; + } + + d2_fx_mean = 0; move32(); + d2_fx_mean_exp = 0; move16(); + + iBand = warp_idx_start[counter]; move16(); + d2_fx_sum = d2_fx[iBand]; move32(); + d2_fx_sum_exp = d2_fx_exp; move16(); + + iBand++; + FOR (; iBand <= warp_idx_stop[counter]; iBand++) + { + d2_fx_sum = BASOP_Util_Add_Mant32Exp(d2_fx[iBand], d2_fx_exp, d2_fx_sum, d2_fx_sum_exp, &d2_fx_sum_exp); + } + /* Energy-sum */ + d2_fx_mean = Mpy_32_16_lc3plus(d2_fx_sum, InvIntTable[add(sub(warp_idx_stop[counter], warp_idx_start[counter]), 1)]); + d2_fx_mean_exp = d2_fx_sum_exp; move16(); + + /* check if above threshold */ + nrg_below_thresh = BASOP_Util_Cmp_Mant32Exp(BW_thresh_quiet[counter], BW_thresh_quiet_exp, d2_fx_mean, + d2_fx_mean_exp); /* true if firstNumber > secondNumber */ + } + WHILE (nrg_below_thresh > 0) + ; + + *bw_idx = add(1, counter); move16(); + + /* addtional check for brickwall characteristic */ + IF (sub(fs_idx, *bw_idx) > 0) + { + brickwall = 0; move16(); + stop = add(warp_idx_start[counter + 1], 1); + brickwall_dist = bw_brickwall_dist[counter + 1]; + + FOR (iBand = stop; iBand >= sub(stop, brickwall_dist); iBand--) + { + /* Band(x) > Band(x-3)*Thr */ + delta_energy = + L_sub(Mpy_32_16_lc3plus(d2_fx[iBand - brickwall_dist], BW_thresh_brickwall[counter + 1]), d2_fx[iBand]); + if (delta_energy > 0) + { + brickwall = 1; move16(); + } + IF (brickwall) + { + BREAK; + } + } + if (brickwall == 0) + { + *bw_idx = fs_idx; + } + } + + Dyn_Mem_Deluxe_Out(); +} + diff --git a/lib_lc3plus/dynmem.c b/lib_lc3plus/dynmem.c new file mode 100644 index 0000000000000000000000000000000000000000..9cdac738d57c9698cca7f08feff5b68328445800 --- /dev/null +++ b/lib_lc3plus/dynmem.c @@ -0,0 +1,290 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.5.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + + +/* + Tool for dynamic memory estimation + Anisse Taleb, November 2003 + +*/ + +/* turn off stdlib function warnings in visual studio */ +#ifdef _MSC_VER +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "options.h" +#include "wmc_auto.h" +#include +#include +#include +#include +#include + +#include "dynmem.h" + +#define MAX_FUNC_NAME_LENGTH 128 + + + +struct C_Path{ + char func_name[MAX_FUNC_NAME_LENGTH]; + long mem_usage; + long mem_usage_acc; + struct C_Path *next; + struct C_Path *parent; +}; + + +typedef struct C_Path C_Path; + +static C_Path *Max_Mem_path; /* Snap shot of the maximum memory usage path */ +static C_Path *Head_path; +static C_Path *Curr_path; /* Current code path */ + + +static long Max_mem_usage; + +static C_Path *Static_mem_head; +static C_Path *Static_mem_curr; + +/* + * initialisation. Must be called at start, sets up all the + * structures and resets counters. + * + * Called externally. + */ + +static void path_free(C_Path * path) +{ + C_Path *path_end,*tmp; + path_end = path; + + if(path == NULL) return; + /* find last node */ + while(path_end->next != NULL) path_end = path_end->next; + + /* walk back */ + while(path_end != NULL) { + tmp = path_end; + path_end = path_end->parent; + free(tmp); + } + +} +static void path_save(void) +{ + C_Path * node; + C_Path * node_save; + C_Path * previous; + /* free the old path */ + path_free(Max_Mem_path); + Max_Mem_path = NULL; + /* */ + + Max_Mem_path = (C_Path *) malloc(sizeof(C_Path)); + + node = Head_path; + node_save = Max_Mem_path; + previous = NULL; + while(node != NULL){ + + strcpy(node_save->func_name,node->func_name); + node_save->mem_usage = node->mem_usage; + node_save->mem_usage_acc = node->mem_usage_acc; + + node_save->parent = previous; + node_save->next = NULL; + + if(node->next != NULL) { + node_save->next = (C_Path *) malloc(sizeof(C_Path)); + } + node = node->next; + previous = node_save; + node_save = node_save->next; + } while(node != NULL); + +} + +void P_Dyn_Mem_Init(void) +{ + + /* initialize the path */ + Head_path = (C_Path *) malloc(sizeof(C_Path)); + strcpy(Head_path->func_name,"---Top---"); + Head_path->mem_usage = 0; + Head_path->mem_usage_acc = 0; /*memory usage accumulator */ + Head_path->parent = NULL; + Head_path->next = NULL; + + Curr_path = Head_path; + /* Initilaize the memory consumptions */ + Max_mem_usage = 0; + Max_Mem_path = NULL; +} + +void P_Dyn_Mem_In(const char *func_name, + long mem_usage) +{ +#ifdef DEBUG_DYNMEM + printf( "Entering: %s\n", func_name ); +#endif + + /* Enter a new function, push on the stack */ + if(Curr_path->next != NULL) { + fprintf(stderr,"\n Something went wrong !!"); + exit(0); + + } + Curr_path->next = (C_Path*) malloc (sizeof(C_Path)); + + if(Curr_path->next == NULL) { + fprintf(stderr,"\n Can't allocate memory"); + exit(0); + } + + Curr_path->next->parent = Curr_path; + Curr_path = Curr_path->next; + Curr_path->next = NULL; + /* save function name */ + strcpy(Curr_path->func_name,func_name); + /* save memory usage */ + Curr_path->mem_usage = mem_usage; + /* update memory usage accumulator */ + Curr_path->mem_usage_acc = Curr_path->parent->mem_usage_acc + mem_usage; +} + +/* Add memory size to current function */ +void P_Dyn_Mem_Add(long mem_usage) +{ +#ifdef DEBUG_DYNMEM + printf( "Staying in: %s\n", Curr_path->func_name); +#endif + + /* Staying in the current function, nothing to push */ + + /* save memory usage */ + Curr_path->mem_usage = Curr_path->mem_usage + mem_usage; + /* update memory usage accumulator */ + Curr_path->mem_usage_acc = Curr_path->mem_usage_acc + mem_usage; +} + + +/* before any return */ + +void P_Dyn_Mem_Out(void) +{ + C_Path *tmp; + if(Curr_path->mem_usage_acc > Max_mem_usage) { + /* set new memory usage record */ + Max_mem_usage = Curr_path->mem_usage_acc; + /* save snap shot */ + path_save(); + } + +#ifdef DEBUG_DYNMEM + printf( "Exiting: %s\n", Curr_path->func_name ); +#endif + + /* delete last node */ + tmp = Curr_path; + + Curr_path = Curr_path->parent; + Curr_path->next = NULL; + free(tmp); +} + + +/* Write data and exit */ + +void P_Dyn_Mem_Exit(void) +{ + /*FILE *f_mem_statistics;*/ + C_Path *node; + /*f_mem_statistics = fopen("mem_stat.txt","wt"); + fprintf(f_mem_statistics,"\n Maximum dynamic memory usage = %ld b, %ld kW \n Critical Memory Usage Path", Max_mem_usage, Max_mem_usage/(1000*2));*/ + /* fprintf(stderr,"\n Maximum dynamic memory usage = %ld kWords (%ld bytes)\n Critical Memory Usage Path", Max_mem_usage/(1000*2),Max_mem_usage); */ + fprintf(stderr,"\n Maximum dynamic memory usage = %.2f kWords (%ld bytes)\n Critical Memory Usage Path", (ceil((float)Max_mem_usage/20.f)/100.f), Max_mem_usage); + + node = Max_Mem_path; + while (node != NULL) { + /*fprintf(f_mem_statistics,"\n %-30s %10ld bytes (+ %10ld bytes)",node->func_name, node->mem_usage_acc, node->mem_usage);*/ + fprintf(stderr,"\n %-30s %10ld bytes (+ %10ld bytes)",node->func_name, node->mem_usage_acc, node->mem_usage); + node=node->next; + } + + /*fclose(f_mem_statistics);*/ + fprintf(stderr,"\n"); + +#ifdef CTEST_MEASUREMENTS + printf("%.3f\n", "dynMem [kWords]", "numeric/float", Max_mem_usage/(1000.0*2)); +#endif + + path_free(Max_Mem_path); + path_free(Head_path); +} + +void P_Dyn_Mem_Exit_noprint(void) +{ + path_free(Max_Mem_path); + path_free(Head_path); +} +void P_Sta_Mem_Init(void) +{ + /* initialize the head object */ + Static_mem_head = (C_Path *) malloc(sizeof(C_Path)); + strcpy(Static_mem_head->func_name,"---Top---"); + Static_mem_head->mem_usage = 0; + Static_mem_head->mem_usage_acc = 0; + Static_mem_head->parent = NULL; + Static_mem_head->next = NULL; + Static_mem_curr = Static_mem_head; +} + +void P_Sta_Mem_Add(const char *func_name, + long mem_usage) +{ + /* Enter a new function, push on the stack */ + Static_mem_curr->next = (C_Path*) malloc (sizeof(C_Path)); + Static_mem_curr->next->parent = Static_mem_curr; + Static_mem_curr = Static_mem_curr->next; + Static_mem_curr->next = NULL; + /* save function name */ + strcpy(Static_mem_curr->func_name,func_name); + /* save memory usage */ + Static_mem_curr->mem_usage = mem_usage; + /* update memory usage accumulator */ + Static_mem_curr->mem_usage_acc = Static_mem_curr->parent->mem_usage_acc + mem_usage; +} + +void P_Sta_Mem_Exit(void) +{ + C_Path *node; + /* fprintf(stderr,"\n Static memory usage = %ld kWords (%ld bytes)\n Detailed Memory Usage", Static_mem_curr->mem_usage_acc/(1000*2),Static_mem_curr->mem_usage_acc); */ + fprintf(stderr,"\n Static memory usage = %.2f kWords (%ld bytes)\n Detailed Memory Usage", (ceil((float)Static_mem_curr->mem_usage_acc/20.f)/100.f),Static_mem_curr->mem_usage_acc); + + node = Static_mem_head->next; + while (node != NULL) { + fprintf(stderr,"\n %-30s %10ld bytes (+ %10ld bytes)",node->func_name, node->mem_usage_acc, node->mem_usage); + node=node->next; + } + + fprintf(stderr,"\n"); + +#ifdef CTEST_MEASUREMENTS + printf("%.3f\n", "statMem [kWords]", "numeric/float", Static_mem_curr->mem_usage_acc/(1000.0*2)); +#endif + + path_free(Static_mem_head); +} + +void P_Sta_Mem_Exit_noprint(void) +{ + path_free(Static_mem_head); +} diff --git a/lib_lc3plus/dynmem.h b/lib_lc3plus/dynmem.h new file mode 100644 index 0000000000000000000000000000000000000000..b92fcd2a7fbc31e2f8013b123fb8426ac549b0f1 --- /dev/null +++ b/lib_lc3plus/dynmem.h @@ -0,0 +1,80 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.5.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + + +#ifndef DYNMEM_H +#define DYNMEM_H + +#ifdef _MSC_VER +/* This disables warnings about anonymous temporary struct declarations */ +#pragma warning(disable:4115) +#pragma warning(disable:4116) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +void P_Dyn_Mem_Init(void); +void P_Dyn_Mem_In(const char *func_name, + long mem_usage); +void P_Dyn_Mem_Add(long mem_usage); +void P_Dyn_Mem_Out(void); +void P_Dyn_Mem_Exit(void); +void P_Dyn_Mem_Exit_noprint(void); + +void P_Sta_Mem_Init(void); +void P_Sta_Mem_Add(const char *func_name, + long mem_usage); +void P_Sta_Mem_Exit(void); +void P_Sta_Mem_Exit_noprint(void); + +#ifdef DONT_COUNT_MEM + +#define Dyn_Mem_Init() +#define Dyn_Mem_Exit() +#define Dyn_Mem_Exit_noprint() +#define Dyn_Mem_In(a,b) +#define Dyn_Mem_Add(b) +#define Dyn_Mem_Out() + +#define DYN_MEM_IN Dyn_Mem_In +#define DYN_MEM_ADD Dyn_Mem_Add +#define DYN_MEM_OUT Dyn_Mem_Out + +#define Sta_Mem_Init() +#define Sta_Mem_Exit() +#define Sta_Mem_Exit_noprint() +#define Sta_Mem_Add(a,b) + +#else /* DONT_COUNT_MEM */ + +#define Dyn_Mem_Init P_Dyn_Mem_Init +#define Dyn_Mem_Exit P_Dyn_Mem_Exit +#define Dyn_Mem_Exit_noprint P_Dyn_Mem_Exit_noprint +#define Dyn_Mem_In P_Dyn_Mem_In +#define Dyn_Mem_Add P_Dyn_Mem_Add +#define Dyn_Mem_Out P_Dyn_Mem_Out + +#define DYN_MEM_IN P_Dyn_Mem_In +#define DYN_MEM_ADD P_Dyn_Mem_Add +#define DYN_MEM_OUT P_Dyn_Mem_Out + +#define Sta_Mem_Init P_Sta_Mem_Init +#define Sta_Mem_Exit P_Sta_Mem_Exit +#define Sta_Mem_Exit_noprint P_Sta_Mem_Exit_noprint +#define Sta_Mem_Add P_Sta_Mem_Add + +#endif /* DONT_COUNT_MEM */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib_lc3plus/enc_entropy.c b/lib_lc3plus/enc_entropy.c new file mode 100644 index 0000000000000000000000000000000000000000..4afac13a486f8cf3a9bdb5e9300a9d38e4b26bc1 --- /dev/null +++ b/lib_lc3plus/enc_entropy.c @@ -0,0 +1,538 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +static Word32 ac_enc_mux_st2VQ_cws( /* o: max 25 bits total codeword */ + const Word32 L_szA, /* i: max 22 bits */ + const Word32 L_szB, /* i: max 4 bits */ + const Word32 L_cwA, const Word32 L_cwB); + +void processEncoderEntropy(UWord8 *bytes, Word16 *bp_side, Word16 *mask_side, Word16 nbbits, Word16 targetBytes, + Word16 L_spec, Word16 BW_cutoff_bits, Word16 tns_numfilters, + Word16 lsbMode, Word16 lastnz, Word16 *tns_order, Word16 fac_ns_idx, Word16 gg_idx, + Word16 BW_cutoff_idx, Word16 *ltpf_idx, Word32 *L_scf_idx, Word16 bfi_ext, Word16 fs_idx +#ifdef CR9_C_ADD_1p25MS + , LC3PLUS_FrameDuration frame_dms, Word16* Tx_ltpf +#endif + ) +{ + Word16 tmp; + Word32 L_tmp; + Word16 submode_LSB, submode_MSB, gain_MSBs; + Word32 L_gain_LSB; + Counter n; + UWord8 *ptr; + + Word16 lastnzTrigger[5] = {63, 127, 127, 255, 255}; + +#ifdef DYNMEM_COUNT + struct _dynmem + { + Word16 tmp; + Word32 L_tmp; + Word16 submode_LSB, submode_MSB, gain_MSBs; + Word32 L_gain_LSB; + Counter n; + UWord8 *ptr; + Word16 lastnzTrigger[5]; + }; + Dyn_Mem_In("processEncoderEntropy", sizeof(struct _dynmem)); +#endif + + UNUSED(L_gain_LSB); UNUSED(gain_MSBs); UNUSED(submode_MSB); UNUSED(submode_LSB); UNUSED(L_tmp); + + /* Init */ + *bp_side = shr_pos(sub(nbbits, 1), 3); + *mask_side = shl(1, sub(8, sub(nbbits, shl_pos(*bp_side, 3)))); + ptr = bytes; + + basop_memset(bytes, 0, targetBytes * sizeof(*bytes)); + + /* Cutoff-detection */ + IF (BW_cutoff_bits > 0) + { + write_indice_backward(ptr, bp_side, mask_side, BW_cutoff_idx, BW_cutoff_bits); + } + + /* Encode last non-zero tuple */ + tmp = getLastNzBits_fx(L_spec); + + IF (sub(bfi_ext, 1) == 0) + { + write_indice_backward(ptr, bp_side, mask_side, lastnzTrigger[fs_idx], tmp); + } + ELSE + { + write_indice_backward(ptr, bp_side, mask_side, sub(shr_pos(lastnz, 1), 1), tmp); + } + + /* Mode bit */ + write_bit_backward(ptr, bp_side, mask_side, lsbMode); + + /* Encode global-gain */ + write_indice_backward(ptr, bp_side, mask_side, gg_idx, 8); + + /* TNS on/off flag */ + FOR (n = 0; n < tns_numfilters; n++) + { + write_bit_backward(ptr, bp_side, mask_side, s_min(tns_order[n], 1)); + } + + /* LTPF on/off*/ +#ifdef CR9_C_ADD_1p25MS +#ifdef NEW_SIGNALLING_SCHEME_1p25 + IF( sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0 ) + { + writeLtpData_fx(ptr, bp_side, mask_side, ltpf_idx, Tx_ltpf); /* LTP-flag and LTPFflag and interleaved lag */ + } + ELSE + { + write_bit_backward(ptr, bp_side, mask_side, ltpf_idx[0]); /* LTP-flag only */ + } +#endif +#else + write_indice_backward(ptr, bp_side, mask_side, ltpf_idx[0], 1); +#endif + +#ifdef CR9_C_ADD_1p25MS_LRSNS + /* Encode SCF VQ parameters */ + writeSNSData_fx(bytes, bp_side, mask_side, frame_dms, L_scf_idx); +#else + /* Encode SCF VQ parameters - 1st stage (10 bits) */ + write_indice_backward(ptr, bp_side, mask_side, extract_l(L_scf_idx[0]), 5); /* stage1 LF 5 bits */ + write_indice_backward(ptr, bp_side, mask_side, extract_l(L_scf_idx[1]), 5); /* stage1 HF 5 bits */ + + /* Encode SCF VQ parameters - 2nd stage side-info (3-4 bits) */ + submode_MSB = shr_pos(extract_l(L_scf_idx[2]), 1); /* explicit tx */ + write_bit_backward(ptr, bp_side, mask_side, submode_MSB); /* submode MSB 1 explicit bit */ + submode_LSB = s_and(extract_l(L_scf_idx[2]), 0x1); /* for joint coding with shapeCw */ + gain_MSBs = extract_l(L_scf_idx[3]); /* all gain bits */ + L_gain_LSB = L_and(L_scf_idx[3], 0x1L); + gain_MSBs = shr(gain_MSBs, sns_gainLSBbits[L_scf_idx[2]]); + + ASSERT(gain_MSBs >= 0 && gain_MSBs < (1 << sns_gainMSBbits[L_scf_idx[2]])); /* ASSERT max 2 MSB(s) in gain bits */ + + write_indice_backward(ptr, bp_side, mask_side, gain_MSBs, + sns_gainMSBbits[L_scf_idx[2]]); /* adjgain or MSBs of adjGains 1-2 bits */ + write_bit_backward(ptr, bp_side, mask_side, extract_l(L_scf_idx[4])); /* shape LS 1 bit */ + + /* Encode SCF VQ parameters - 2nd stage data (24-25 bits) */ + IF (submode_MSB == 0) + { /* regular,regular_lf*/ + ASSERT(submode_MSB == 0); + + L_tmp = L_add(L_gain_LSB, 0); /* gain-LSB 0,1 for regular_lf, offset is 0 */ + if (submode_LSB == 0) + { + L_tmp = L_add(L_scf_idx[6], + sns_MPVQ_Sz[1][1]); /* shape B pos offset is 2 , upshifted two positions , 0..11 -> 2..13 */ + } + /* regular mode A,B indexes multiplexed, total 24.x bits MPVQ codeword section A + codeword for section B */ + L_tmp = ac_enc_mux_st2VQ_cws(sns_MPVQ_Sz[0][0], /* max 21.3 bits*/ + UL_addNsD(sns_MPVQ_Sz[0][1], sns_MPVQ_Sz[1][1]), /* max log2(14) bits */ + L_scf_idx[5] /* shapeA */, L_tmp /* shapeB joint with adjGainLSB */); + /* regular mode mode shape index total 1+23.9999 bits MPVQ codeword */ + ASSERT(L_tmp < (1L << 25)); + write_indice_backward(ptr, bp_side, mask_side, extract_l(L_tmp), 13); /* multiplex 13 bits */ + write_indice_backward(ptr, bp_side, mask_side, extract_l(L_shr_pos(L_tmp, 13)), 12); /* multiplex 12 bits */ + } + ELSE + { /* outlier near, outlier far */ + ASSERT(submode_MSB == 1); + L_tmp = L_scf_idx[5]; move32(); /* outlier near section assumed */ + if (submode_LSB != 0) + { /* outl_far */ + L_tmp = L_add(L_shl_pos(L_tmp, 1), L_gain_LSB); /* add lsb bit of Gain */ + L_tmp = L_add(L_tmp, sns_MPVQ_Sz[2][0]); /* outlier far section offset added */ + } + + ASSERT(L_tmp < (1L << 24)); + /* outlier mode shape index total 23.8536 ( + ~.14 ) bits as MPVQ codeword */ + write_indice_backward(ptr, bp_side, mask_side, extract_l(L_tmp), 12); /* multiplex 12 bits LSB*/ + write_indice_backward(ptr, bp_side, mask_side, extract_l(L_shr(L_tmp, 12)), 12); /* multiplex 12 bits MSBs */ + } +#endif + + /* LTPF data */ +#ifdef NEW_SIGNALLING_SCHEME_1p25 + test(); test(); + IF( (sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) != 0) && (ltpf_idx[0] != 0) ) +#else + test(); + IF( ltpf_idx[0] != 0 ) +#endif + { + write_indice_backward(ptr, bp_side, mask_side, ltpf_idx[1], 1); + write_indice_backward(ptr, bp_side, mask_side, ltpf_idx[2], 9); + } + + + /* Encoder noise-fac */ + write_indice_backward(ptr, bp_side, mask_side, fac_ns_idx, 3); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +static __forceinline Word32 +ac_enc_mux_st2VQ_cws( /* o: max 25 bits total codeword */ + const Word32 L_szA, /* i: max 22 bits */ + const Word32 L_szB, /* i: max 4 bits 0..13 */ + const Word32 L_cwA, + const Word32 L_cwB) /* [0..13} corresponding to gains{0,1}, shapeB{0..11} or */ +{ + + Word32 L_cwTx; + /* L_cw_tx = L_cwB(21.z bits) * L_szA(3.y bits) + L_cwA(21.x bits)); */ + L_cwTx = (Word32)UL_Mpy_32_32( + (UWord32)L_cwB, (UWord32)L_szA); /* non-fractional 16x32 -> 32 may possibly also be used if available */ + L_cwTx = L_add(L_cwTx, L_cwA); + + ASSERT((L_szA * L_szB) <= 1 << 25); /* multiplexing only allowed up to 25 bits (+ leading sign) */ + ASSERT(L_cwTx >= 0 && L_cwTx <= 0x01ffFFff); /* max 25 bits allowed */ + UNUSED(L_szB); + + return L_cwTx; +} + +#ifdef NEW_SIGNALLING_SCHEME_1p25 +void writeLtpData_fx( + UWord8 *ptr, + Word16 *bp_side, + Word16 *mask_side, + Word16* ltpf_idx, + Word16* Tx_ltpf +) +{ + Dyn_Mem_Deluxe_In( + Word16 tmp; + Word16 bitsTx;); + + tmp = s_min(*Tx_ltpf, 1); /*phaseA==0, phaseB==1*/ + test(); + IF(ltpf_idx[0] == 0) + { + write_indice_backward(ptr, bp_side, mask_side, 0, 2); /* "00" */ + + *Tx_ltpf = 0; + /* *Tx_ltpf A/B state forced to zero or kept at zero */ + /* decoder will discard any sofar in phase received phaseA MSB bits */ + } + ELSE IF(ltpf_idx[1] == 0) + { + /* no current LTPF activation, + lag transmitted for PLC, or for next frame LTPF activation */ + ASSERT(ltpf_idx[0] != 0); + + /* A "010" 3 bits Hdr transmitted */ + /* B "011" 3 bits Hdr transmitted*/ + + write_indice_backward(ptr, bp_side, mask_side, 1, 2); /* "01"*/ + write_indice_backward(ptr, bp_side, mask_side, tmp, 1); /* phase A or phaseB */ + + test(); + IF(*Tx_ltpf == 0) + { /* phase A transmission */ + ASSERT(tmp == 0); + ASSERT((ltpf_idx[2] & ~(0x01ff)) == 0); /* only 9 bits info allowed within ltpf_idx[2] */ + tmp = shr_pos(ltpf_idx[2], 5); /* shift_out LSBS, send 4 MSBs */ + *Tx_ltpf = s_or(0x200, ltpf_idx[2]); move16(); /* remember full lag, as phaseB sentinel in bit 10, */ + } + ELSE + { /* phase B */ + ASSERT(tmp == 1); + ASSERT(*Tx_ltpf > 511); /*sentinel in b10 should have been set in previous phaseA frame */ + tmp = shr_pos(s_and(*Tx_ltpf, 0x001f), 1); /* B send 4* LSBs, 1 bit truncated */ + *Tx_ltpf = 0; move16(); /* clear sentinel in b10 and the old remebered lag value */ + } + write_indice_backward(ptr, bp_side, mask_side, tmp, 4); /* 4 bits lag info Tx, when LTPF is deactivated */ + } + ELSE + { /* LTPF activated */ + /* A "10" 2 bits Hdr */ + /* B "11" 2 bits Hdr */ + ASSERT(ltpf_idx[0] != 0 && ltpf_idx[1] != 0); + + tmp = s_or(0x02, tmp); + write_indice_backward(ptr, bp_side, mask_side, tmp, 2); + test(); + IF(*Tx_ltpf == 0) + { + bitsTx = 4; move16(); + ASSERT((ltpf_idx[2] & ~(0x01ff)) == 0); /* only 9 bits info allowed within ltpf_idx[2] */ + tmp = shr_pos(ltpf_idx[2], 5); /* shift away 5 LBS, LTPF active, send phaseA 4 MSBs */ + + *Tx_ltpf = s_or(0x0200, ltpf_idx[2]); /* remember full lag in state *Tx_ltpf, add phaseB Tx state sentinel in bit 10 */ + } + ELSE + { + bitsTx = 5; move16(); + tmp = s_and(*Tx_ltpf, 0x001f); /* LTPF active B send 5 LSBs , full regular resolution */ + *Tx_ltpf = 0; move16(); /* clear sentinel in b10 and also the old remebered lag value */ + } + + write_indice_backward(ptr, bp_side, mask_side, tmp, bitsTx); /* ltp==1 , ltpf==1, 4(A,MSBs) or 5(b, LSBs) bits */ + } + Dyn_Mem_Deluxe_Out(); +} + + +void writeSNSData_fx(UWord8 *bytes, Word16 *bp_side, Word16 *mask_side, LC3PLUS_FrameDuration frame_dms, Word32* L_scf_idx) +{ + Dyn_Mem_Deluxe_In( + Word16 submode_LSB, submode_MSB, gain_MSBs; + Word32 L_gain_LSB; + Word16 write_legacy_sns_vq_bits; + Word16 tmp; + Word32 L_tmp; + Word16 aux_idx; /* aux value: location the LS, or the s0 sign bit */ + Word16 shape_idx; /* st2 shape 0 .. 5 , where [2.3.4.5] are fixed FESS shapes */ + Word16 fixenv_shape_idx; + Word16 gain_idx; /* idx of 2-3 bits valued gains */ + Word16 n5k; /* number of unit pulses k for the width N=5 LF region of splitLF */ + ); + + write_legacy_sns_vq_bits = 1; + if (sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0) /* 9,10,29/30 */ + { + write_legacy_sns_vq_bits = 0; + } + + test(); + IF(write_legacy_sns_vq_bits != 0) /* 10 bits (5+5) for stage1 + a total of 28 bits for stage2 */ + { + /* Encode SCF VQ parameters - 1st stage (10 bits) */ + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_scf_idx[0]), 5); /* stage1 LF 5 bits */ + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_scf_idx[1]), 5); /* stage1 HF 5 bits */ + + /* Encode SCF VQ parameters - 2nd stage side-info (3-4 bits) */ + submode_MSB = shr_pos(extract_l(L_scf_idx[2]), 1); /* explicit tx */ + write_bit_backward(bytes, bp_side, mask_side, submode_MSB); /* submode MSB 1 explicit bit */ + submode_LSB = s_and(extract_l(L_scf_idx[2]), 0x1); /* for joint coding with shapeCw */ + gain_MSBs = extract_l(L_scf_idx[3]); /* all gain bits */ + L_gain_LSB = L_and(L_scf_idx[3], 0x1L); + gain_MSBs = shr(gain_MSBs, sns_gainLSBbits[L_scf_idx[2]]); + + ASSERT(gain_MSBs >= 0 && gain_MSBs < (1 << sns_gainMSBbits[L_scf_idx[2]])); /* ASSERT max 2 MSB(s) in gain bits */ + + write_indice_backward(bytes, bp_side, mask_side, gain_MSBs, + sns_gainMSBbits[L_scf_idx[2]]); /* adjgain or MSBs of adjGains 1-2 bits */ + write_bit_backward(bytes, bp_side, mask_side, extract_l(L_scf_idx[4])); /* shape LS 1 bit */ + + /* Encode SCF VQ parameters - 2nd stage data (24-25 bits) */ + test(); + IF(submode_MSB == 0) + { /* regular,regular_lf*/ + ASSERT(submode_MSB == 0); + + L_tmp = L_add(L_gain_LSB, 0); /* gain-LSB 0,1 for regular_lf, offset is 0 */ + if (submode_LSB == 0) + { + L_tmp = L_add(L_scf_idx[6], + sns_MPVQ_Sz[1][1]); /* shape B pos offset is 2 , upshifted two positions , 0..11 -> 2..13 */ + } + /* regular mode A,B indexes multiplexed, total 24.x bits MPVQ codeword section A + codeword for section B */ + L_tmp = ac_enc_mux_st2VQ_cws(sns_MPVQ_Sz[0][0], /* max 21.3 bits*/ + UL_addNsD(sns_MPVQ_Sz[0][1], sns_MPVQ_Sz[1][1]), /* max log2(14) bits */ + L_scf_idx[5] /* shapeA */, L_tmp /* shapeB joint with adjGainLSB */); + /* regular mode mode shape index total 1+23.9999 bits MPVQ codeword */ + ASSERT(L_tmp < (1L << 25)); + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_tmp), 13); /* multiplex 13 bits */ + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_shr_pos(L_tmp, 13)), 12); /* multiplex 12 bits */ + } + ELSE + { /* outlier near, outlier far */ + ASSERT(submode_MSB == 1); + L_tmp = L_scf_idx[5]; + move32(); /* outlier near section assumed */ + if (submode_LSB != 0) + { /* outl_far */ + L_tmp = L_add(L_shl_pos(L_tmp, 1), L_gain_LSB); /* add lsb bit of Gain */ + L_tmp = L_add(L_tmp, sns_MPVQ_Sz[2][0]); /* outlier far section offset added */ + } + + ASSERT(L_tmp < (1L << 24)); + /* outlier mode shape index total 23.8536 ( + ~.14 ) bits as MPVQ codeword */ + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_tmp), 12); /* multiplex 12 bits LSB*/ + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_shr(L_tmp, 12)), 12); /* multiplex 12 bits MSBs */ + } + } + + test(); + IF(write_legacy_sns_vq_bits == 0) /* 9 or 10 bits for stage1, 19-20 bits for stage2 */ + { + /* SNS-VQ 1st stage is jointly multiplexed into 9 bits or 10 bits */ + /* input scf_idx[0], has the stage1 index for one of BCA , if B+stage 1 only */ + tmp = extract_l(L_scf_idx[0]); + aux_idx = extract_l(L_scf_idx[1]); /* aux value: we have the LS, or the s0 sign bit */ + shape_idx = extract_l(L_scf_idx[2]); /* st2 shape 0 .. 5 , where [2.3.4.5] are fixed FESS shapes */ + gain_idx = extract_l(L_scf_idx[3]); /* idx of 2-3 bits valued gains */ + +#ifdef DEBUG + if (shape_idx == 0 && L_scf_idx[0] >= 0) + { /*aux==2 --> split mode st1B (aux==2), + a 2 bit gain + P(5,6)10.96b + P(8,2)7b */ + ASSERT(shape_idx == 0 && gain_idx < 4); + } + if ((shape_idx == 1) && L_scf_idx[0] >= 0) + { /* regular mode st1B , + a 3 bit gain + P(15,5) */ + ASSERT(shape_idx == 1 && gain_idx >= 0 && gain_idx < 8); + } + + if ((shape_idx >= 2) && L_scf_idx[0] >= 0) + { /* regular mode st1B , + a 3 bit gain + fixenv */ + ASSERT(shape_idx >= 2 && shape_idx <= 5 && gain_idx >= 0 && gain_idx < 8); + } +#endif + /* b0-b8 b9 + segm , idx9b , stop bit, comment use + -----+--------+--------- + A | 510,511| n/a, 2 entries, 9 bit total + ------+--------+-------- + B | 0--169 | 1 , 170 entries, 10 bit total + ------+--------+-------- + C | 170-339| 1 , 170 entries, 10 bit total + ------+--------+--------+------------*/ + + test(); test(); test(); test(); + IF(L_sub(L_scf_idx[0], 510) >= 0) + { /* stage1A */ + ASSERT(L_scf_idx[0] < (1 << 9)); + write_indice_backward(bytes, bp_side, mask_side, tmp, 9); /* writes values 510 or 511 */ + shape_idx = -9; move16(); /* use only the coarse stage 1A , no more bits to send */ + } + ELSE IF((sub(tmp, 2 * 170) < 0) && (shape_idx < 0)) + { + write_indice_backward(bytes, bp_side, mask_side, tmp, 9); /* 1B [ 0..169] or 1C [ 170 ... 339 ] */ + + /* write the stop bit sentinel value "1", so that the demux dec_entropy_fx) can stop already at (9+1)=10 bits */ + write_indice_backward(bytes, bp_side, mask_side, 1, 1); /* dec_entropy_fx() will read this a 1 "stop" bit */ + shape_idx = -10; move16(); + } + ELSE IF(shape_idx == 0) { + /* aux info as a part of (9+1) 10 initial bits */ + /* b0-b8 b9 + segm , idx9b , stop bit, comment use + -----+--------+--------- + B* | 0--169 | 0 , --> aux=0, 170, 2b+17b for stage2 'LR_SplitLF', 29 bit total + ------+--------+--------+------- + B* | 170-339| 0 , --> aux=1, 170, 2b+17b for stage2 'LR_SplitLF', 29 bit total + ------+--------+--------+------- + */ + /* 29 bit total LR_splitLF */ +#ifdef DEBUG + ASSERT(L_scf_idx[0] >= 0 && L_scf_idx[0] < 170); /* st1B range */ + ASSERT(aux_idx >= 0 && aux_idx <= 1); /* aux_bit can only be 1 or 0 */ +#endif + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_mac0(L_scf_idx[0], aux_idx, 170)), 9); /* aux_bit defined by region 0.169 or 170..339 in decoder */ + write_indice_backward(bytes, bp_side, mask_side, 0, 1); /* "stop" bit. always zero for 'LR_splitLF' path */ + + write_indice_backward(bytes, bp_side, mask_side, gain_idx, 2); /* always 2bits == 4 gain levels for the splitLF mode */ + + n5k = 6; move16(); + test(); + if (L_scf_idx[5] < 0) + { + ASSERT(L_scf_idx[5] == -8); + n5k = 8; move16(); /* 8 LF pulses , no HF pulses */ + } + + test(); + IF(sub(n5k, 6) == 0) + { /* multiplex remaining 10 + 1+6 bit */ + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_scf_idx[4]), 10); /* P(5,6)=10.94 in LS+10 bits, */ + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_and(L_scf_idx[5], 0x1)), 1); /* LS for P(8,2)=7 */ + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_shr_pos(L_scf_idx[5], 1)), 6); /* mPVQ(8,2) in 6 */ + } + ELSE + { /* LF is PVQ(N=5,K=8), HF is all zero , multiplexed as top section in stage2 10b , + 7b */ + /* scf_idx[4] is in the range [0 ... (SNSLR_NPVQ_L5K8 >>1)[, [0 .. 2945[ , 11.52 bits */ + /* 985 - 1024 = 39 entries where we now use 32 (5 bits) */ + /* index_to_send = (SNSLR_NPVQ_L5K6 >> 1) + (scf_idx[4] & 0x001f) , range [985 .. 1017[ , i.e. 7 values are not sent:[1018 ... 1023] */ + ASSERT(L_scf_idx[4] < (SNSLR_NPVQ_L5K8 >> 1)); + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_add((SNSLR_NPVQ_L5K6 >> 1), L_and(L_scf_idx[4], 0x001f))), 10); /* 5 lsb's as top in the 10b block*/ + ASSERT((L_scf_idx[4] >> 5) < (1 << 7)); + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_shr_pos(L_scf_idx[4], 5)), 7); /* 7 msb's of mpvq(5,8)*/ + /* unused region of 7*2^7 = 1792= 10.8 bits may be used for BER detection */ + } + } + ELSE IF(shape_idx == 1) + { + /* b0-b8 b9 + segm , idx9b , stop bit, comment/use + ------+--------+--------+------------ + B* | 340-509| 1 --> aux=1, 170, 3b+17b for stage2 'LR_full', 30 bit total + ------+--------+--------+------- + B* | 340-509| 0 --> aux=0, 170, 3b+17b for stage2 'LR_full', 30 bit total + ------+--------+--------+------- + */ + ASSERT(L_scf_idx[0] >= 0 && L_scf_idx[0] < 170); /* validate st1B* range */ + + write_indice_backward(bytes, bp_side, mask_side, add(tmp, 2 * 170), 9); /* stage1B* signal */ + write_indice_backward(bytes, bp_side, mask_side, aux_idx, 1); /* auxbit value transmitted in the stop bit location */ + + write_indice_backward(bytes, bp_side, mask_side, gain_idx, 3); /* 30b always 8 gain levels in 3 bits for the full mode */ + /* the next 17 bit index is used to decode submode 1==full or one of submode 2,3,4,5 == fix */ + ASSERT(L_scf_idx[4] >= 0 && L_scf_idx[4] < ((SNSLR_NPVQ_L15K5 >> 1))); + + L_tmp = L_scf_idx[4]; move32(); /* full 17 bit index */ + /* typically P(15,5) without the leading sign, 16.6593 bits, written */ + /* subset of 7 lsb's written first to match Cflt writing of all 17 bits at once */ + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_tmp), 17 - 10); + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_shr_pos(L_tmp, 7)), 10); + } + ELSE + { /* Fixed shapes 2(fixenv0) and 3(fixenv1) , 4(fixenv2), 5(fixenv3) */ + ASSERT(shape_idx >= 2 && shape_idx <= 5); + /* fixenv 0,1,2, : s0(in aux) + shift(2bits)+ 11 signs , section size 8192 + fixenv 3 : s0(in aux) + shift(2bits)+ 9 signs , section size 2048 + */ + fixenv_shape_idx = extract_l(L_scf_idx[4]); + ASSERT(fixenv_shape_idx == (shape_idx - 2)); /* scf_idx[4] has the fixed env index*/ + ASSERT(L_scf_idx[0] >= 0 && L_scf_idx[0] < 170); /* validate st1B* range */ + + write_indice_backward(bytes, bp_side, mask_side, add(tmp, 2 * 170), 9); /* stage1B* signal */ + write_indice_backward(bytes, bp_side, mask_side, aux_idx, 1); /* auxbit transmitted in the stop bit location */ + + write_indice_backward(bytes, bp_side, mask_side, gain_idx, 3); /* for this 30bit path it is always 3 gain bits */ + + IF(sub(shape_idx, 5) < 0) /* 2,3,4 */ + { + ASSERT(L_scf_idx[5] >= 0 && L_scf_idx[5] < (1 << 13)); + ASSERT((SNSLR_NPVQ_L15K5 >> 1) + fixenv_shape_idx * (1 << 13) + L_scf_idx[5] < (1 << 17)); + /* offset is PVQ(15,5) without leading sign */ + /* int32_t tmp_idx = (SNSLR_NPVQ_L15K5 >> 1) + env_shape_idx * (1 << 13) + scf_idx[5]; */ + L_tmp = L_add(L_mac0((SNSLR_NPVQ_L15K5 >> 1), fixenv_shape_idx, 1 << 13), L_scf_idx[5]); /* full 17 bits*/ + } + ELSE + { + ASSERT(shape_idx == 5); /* 5*/ + ASSERT(fixenv_shape_idx == 3); + ASSERT(L_scf_idx[5] < (1 << 11)); + ASSERT(((SNSLR_NPVQ_L15K5 >> 1) + 3 * (1 << 13) + L_scf_idx[5]) < (1 << 17)); + /* offset is PVQ(15,5) without leading sign */ + L_tmp = L_add((SNSLR_NPVQ_L15K5 >> 1) + 3 * (1 << 13), L_scf_idx[5]); /* full 17 bits*/ + } + /* subset of 7 lsb's written first to match Cflt writing of all 17 bits at once */ + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_tmp), 17 - 10); + write_indice_backward(bytes, bp_side, mask_side, extract_l(L_shr_pos(L_tmp, 7)), 10); + } + } + Dyn_Mem_Deluxe_Out(); +} +#endif /* CR9_C_ADD_1p25MS_LRSNS */ + + + +#ifdef __cplusplus +} /* NAMESPACE_VERSION */ +#endif diff --git a/lib_lc3plus/enc_lc3plus.c b/lib_lc3plus/enc_lc3plus.c new file mode 100644 index 0000000000000000000000000000000000000000..0c34a8d484e69faee8a6d0ec0755c79f473cc000 --- /dev/null +++ b/lib_lc3plus/enc_lc3plus.c @@ -0,0 +1,829 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ +#include "options.h" +#include "wmc_auto.h" +#include +#include "functions.h" + +static void Enc_LC3PLUS_Channel(LC3PLUS_Enc *encoder, int channel, int bits_per_sample, Word32 *s_in, UWord8 *bytes, + Word8 *scratchBuffer, int bfi_ext) +{ +#ifdef ENABLE_HR_MODE + Dyn_Mem_Deluxe_In(Word16 d_fx_exp; + Word16 gain_e, gain, quantizedGain, quantizedGainMin; + Word16 ener_fx_exp; + Word16 pitch, normcorr; + Word16 ltpf_bits; + Word16 tns_numfilters; + Word16 lsbMode, lastnz, BW_cutoff_idx; + Word16 gainChange, fac_ns_idx; + Word16 nBits, numResBits; + Word16 bp_side, mask_side; + Word16 s_12k8_len; + Word16 b_left; + Word32 * L_scf_idx; + Word32 * d_fx, *ener_fx; + Word16 * s_12k8, *int_scf_fx_exp, tns_order[TNS_NUMFILTERS_MAX], *indexes; + Word32 * q_d_fx24; + Word16 * scf; + Word16 * codingdata; + Word32 * scf_q, *int_scf_fx; + Word32 * s_in_scaled; + Word16 * s_in_scaled_lp; + UWord8 * resBits; + Word16 ltpf_idx[3]; + EncSetup * h_EncSetup; + Word8 * currentScratch; + Word16 hrmode; + ); +#else + Dyn_Mem_Deluxe_In(Word16 d_fx_exp; Word16 gain_e, gain, quantizedGain, quantizedGainMin; Word16 ener_fx_exp; + Word16 pitch, normcorr; Word16 ltpf_bits; Word16 tns_numfilters; + Word16 lsbMode, lastnz, BW_cutoff_idx; Word16 gainChange, fac_ns_idx; Word16 nBits, numResBits; + Word16 bp_side, mask_side; Word16 s_12k8_len; Word16 b_left; + + Word32 * L_scf_idx; Word32 * d_fx, *ener_fx; + Word16 * s_12k8, *int_scf_fx_exp, *q_d_fx16, *int_scf_fx, tns_order[TNS_NUMFILTERS_MAX], *indexes; + Word16 * scf, *scf_q; Word16 * codingdata; Word16 * s_in_scaled; UWord8 * resBits; + Word8 * currentScratch; Word16 ltpf_idx[3]; EncSetup * h_EncSetup;); +#endif /* ENABLE_HR_MODE */ + +#ifdef CR9_C_ADD_1p25MS_LRSNS + Word16 envelope_bits_fx; + Word16 pitch_rx_fx; + Word16 ltpf_rx_fx; + Word16 lrsns_st1C_in_use ; + Word16 ltptx_lowest_bit_lim; +#endif + +#ifdef CR9_C_ADD_1p25MS_LRSNS + envelope_bits_fx = -1; /*later move up to Dynmem() struct area */ +#endif + h_EncSetup = encoder->channel_setup[channel]; + +#ifdef ENABLE_HR_MODE + hrmode = encoder->hrmode; +#endif + + +#ifndef FIX_1p25_GG_EST_TUPLES + +#if defined (FIX_BASOP_ENC_QUANTIZE_1P25MS_512KBPS) + /* make sure the initial allocated d_fx buffer size is a multiple of 4 */ + /* ms_mode Fs frame_length frame_ylen misc */ + /* 1.25ms 16 kHz 20/2=10 same 2-tuples */ + /* 1.25ms 24kHz 30/2=15 same 2-tuples action in estimate_global_gain() */ + /* 1.25ms 32kHz 40/2=10 same 2-tuples */ + /* 1.25ms 48kHz 60/3=20 50/3=16.66 3-tuples, 60/3 =15 allocated , separate action in estimate_global_gain(), 50==60*40/48 */ + /* 2.5 ms 8 kHz 20/4=5 same 4-tuples */ + + Word16 lg_4 = shr(encoder->frame_length, 2); + Word16 rem_4 = sub(encoder->frame_length, shl(lg_4, 2)); + if (rem_4 != 0 && sub(encoder->frame_length, encoder->yLen) == 0) + { + lg_4 = add(lg_4, 1); /* add one quadruple */ + ASSERT(encoder->frame_dms == LC3PLUS_FRAME_DURATION_1p25MS); + ASSERT(MAX_LEN >= lg_4 * 4 ); /* "en" size in estimate_global_gain_fx() */ + } +#ifdef FIX_BASOP_1p25_NEW_GG_EST3 + if(encoder->frame_dms == LC3PLUS_FRAME_DURATION_1p25MS && (sub(encoder->frame_length, 30) <= 0)) /* WB and SSWB */ + { + ASSERT(MAX_LEN >= 2 + lg_4 * 4); /*make sure that there are 2 extra tail coeffs in d_fx*/ + } +#endif +#endif +#endif + + +#ifdef WMOPS + push_wmops("Encoder"); +#endif + + /* BUFFER INITIALISATION. Some buffers may overlap since they are not used in the whole encoding process */ + d_fx = scratchAlign(scratchBuffer, 0); /* Size = 4 * MAX_LEN bytes */ + L_scf_idx = scratchAlign( + d_fx, sizeof(*d_fx) * s_max(80, encoder->frame_length)); /* Size = 4 * SCF_MAX_PARAM -> aligned to 32 bytes */ + +#ifdef FIX_1p25_GG_EST_TUPLES + if (encoder->frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) + { + ASSERT(MAX(80, encoder->frame_length) >= ((GG_1p25_MAX_TUPLES - 1) + encoder->yLen)); + /*make sure that there are extra tail coeffs in d_fx for Global gain estimation routine */ + } +#endif + indexes = scratchAlign(L_scf_idx, + sizeof(*L_scf_idx) * SCF_MAX_PARAM); /* Size = 2 * TNS_NUMFILTERS_MAX * MAXLAG = 32 bytes */ + +#ifdef ENABLE_HR_MODE + q_d_fx24 = scratchAlign(indexes, sizeof(*indexes) * (TNS_NUMFILTERS_MAX * MAXLAG)); +#else + q_d_fx16 = scratchAlign(indexes, sizeof(*indexes) * (TNS_NUMFILTERS_MAX * MAXLAG)); /* Size = 2 * MAX_LEN bytes */ +#endif /* ENABLE_HR_MODE */ + +#ifdef ENABLE_HR_MODE + codingdata = + scratchAlign(q_d_fx24, sizeof(*q_d_fx24) * s_max(80, encoder->frame_length)); /* Size = 3 * MAX_LEN bytes */ +#else + codingdata = + scratchAlign(q_d_fx16, sizeof(*q_d_fx16) * s_max(80, encoder->frame_length)); /* Size = 3 * MAX_LEN bytes */ +#endif + +#ifdef ENABLE_HR_MODE + ener_fx = scratchAlign(q_d_fx24, 0); /* Size = 4 * MAX_BANDS_NUMBER = 256 bytes */ + s_in_scaled = scratchAlign(q_d_fx24, 0); /* Size = 2 * MAX_LEN bytes */ +#else + ener_fx = scratchAlign(q_d_fx16, 0); /* Size = 4 * MAX_BANDS_NUMBER = 256 bytes */ + s_in_scaled = scratchAlign(q_d_fx16, 0); /* Size = 2 * MAX_LEN bytes */ +#endif + +#ifdef ENABLE_HR_MODE + s_in_scaled_lp = (Word16 *)s_in_scaled; +#endif + +#ifdef ENABLE_HR_MODE + /* allocate memory for residual bits */ + if (encoder->hrmode) + { + resBits = scratchAlign(codingdata, sizeof(*codingdata) * (3 * s_max(80, encoder->frame_length) / 2)); + } + else +#endif /* #ifdef ENABLE_HR_MODE */ + { + resBits = scratchAlign(codingdata, + sizeof(*codingdata) * (3 * s_max(80, encoder->frame_length) / 2)); /* Size = MAX_LEN bytes */ + } + + { +#ifdef ENABLE_HR_MODE + currentScratch = + scratchAlign(resBits, sizeof(*resBits) * MAX_RESBITS_LEN); /* Size = 4 * MAX_LEN */ +#else + currentScratch = + scratchAlign(resBits, sizeof(*resBits) * s_max(80, encoder->frame_length)); /* Size = 4 * MAX_LEN */ +#endif /* #ifdef ENABLE_HR_MODE */ + } + + s_12k8 = scratchAlign( + s_in_scaled, + sizeof(*s_in_scaled) * + s_max(80, encoder->frame_length)); /* Size = 2 * (LEN_12K8 + 1) = 258 bytes -> aligned to 288 bytes */ + scf_q = scratchAlign(ener_fx, sizeof(*ener_fx) * MAX_BANDS_NUMBER); /* Size = 2 * M */ + scf = scratchAlign(scf_q, sizeof(*scf_q) * M); /* Size = 2 * M */ + int_scf_fx = scratchAlign(scf, sizeof(*scf) * M); /* Size = 2 * MAX_BANDS_NUMBER = 128 bytes */ + int_scf_fx_exp = + scratchAlign(int_scf_fx, sizeof(*int_scf_fx) * MAX_BANDS_NUMBER); /* Size = 2 * MAX_BANDS_NUMBER = 128 bytes */ + + /* Scale 24-bit input data */ + IF (sub(bits_per_sample, 24) == 0) + { +#ifdef WMOPS + push_wmops("Scale_signal24"); +#endif + scale_signal24_fx(s_in, s_in_scaled, &h_EncSetup->x_exp, h_EncSetup->stEnc_mdct_mem, + encoder->stEnc_mdct_mem_len, h_EncSetup->r12k8_mem_in, encoder->r12k8_mem_in_len, + h_EncSetup->r12k8_mem_50, h_EncSetup->r12k8_mem_out, encoder->r12k8_mem_out_len, + h_EncSetup->mdct_mem32, encoder->frame_length, h_EncSetup->resamp_mem32, + h_EncSetup->olpa_mem_s12k8, &h_EncSetup->resamp_exp); +#ifdef WMOPS + pop_wmops(); +#endif + } + ELSE + { +#ifdef ENABLE_HR_MODE + Word16 *ip_buf = (Word16*)s_in; + Word32 i; + FOR(i = 0; i < encoder->frame_length; i++) + { + s_in_scaled[i] = L_deposit_h(ip_buf[i]); + } + h_EncSetup->x_exp = 15; move16(); +#else + memcpy(s_in_scaled, s_in, encoder->frame_length * sizeof(*s_in_scaled)); +#endif + } + +#ifdef WMOPS + push_wmops("Mdct"); +#endif + + /* currentScratch Size = 4 * MAX_LEN */ + processMdct_fx(s_in_scaled, h_EncSetup->x_exp, encoder->frame_length, +#ifdef ENABLE_HR_MODE + hrmode, +#endif + encoder->W_fx, encoder->W_size, + h_EncSetup->stEnc_mdct_mem, encoder->stEnc_mdct_mem_len, d_fx, &d_fx_exp, currentScratch); +#ifdef WMOPS + pop_wmops(); +#endif + + /* begin s_12k8 */ +#ifdef WMOPS + push_wmops("Resamp12k8"); +#endif + /* currentScratch Size = 2.25 * MAX_LEN bytes */ +#ifdef ENABLE_HR_MODE + downshift_w32_arr(s_in_scaled, s_in_scaled_lp, 16, encoder->frame_length); /* s_in_scaled is no longer required */ + + process_resamp12k8_fx(s_in_scaled_lp, encoder->frame_length, h_EncSetup->r12k8_mem_in, encoder->r12k8_mem_in_len, + h_EncSetup->r12k8_mem_50, h_EncSetup->r12k8_mem_out, encoder->r12k8_mem_out_len, s_12k8, + &s_12k8_len, encoder->fs_idx, encoder->frame_dms, currentScratch + , bits_per_sample + ); +#else + process_resamp12k8_fx(s_in_scaled, encoder->frame_length, h_EncSetup->r12k8_mem_in, encoder->r12k8_mem_in_len, + h_EncSetup->r12k8_mem_50, h_EncSetup->r12k8_mem_out, encoder->r12k8_mem_out_len, s_12k8, + &s_12k8_len, encoder->fs_idx, encoder->frame_dms, currentScratch + , bits_per_sample + ); +#endif /* ENABLE_HR_MODE */ +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Olpa"); +#endif + /* currentScratch Size = 392 bytes */ + process_olpa_fx(&h_EncSetup->olpa_mem_s6k4_exp, h_EncSetup->olpa_mem_s12k8, h_EncSetup->olpa_mem_s6k4, &pitch, + s_12k8, s_12k8_len, &normcorr, &h_EncSetup->olpa_mem_pitch, + &h_EncSetup->pitch_flag, + h_EncSetup->resamp_exp, encoder->frame_dms, currentScratch); +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("LtpfEnc"); +#endif + /* currentScratch Size = 512 bytes */ + process_ltpf_coder_fx(<pf_bits, pitch, h_EncSetup->ltpf_enable, &h_EncSetup->ltpf_mem_in_exp, + h_EncSetup->ltpf_mem_in, encoder->ltpf_mem_in_len, ltpf_idx, s_12k8, s_12k8_len, + h_EncSetup->ltpf_mem_normcorr, &h_EncSetup->ltpf_mem_mem_normcorr, normcorr, + &h_EncSetup->ltpf_mem_ltpf_on, &h_EncSetup->ltpf_mem_pitch, h_EncSetup->resamp_exp, + encoder->frame_dms, currentScratch + , encoder->hrmode + +#ifdef CR9_C_ADD_1p25MS +#ifdef FIX_TX_RX_STRUCT_STEREO +#ifdef NEW_SIGNALLING_SCHEME_1p25 + ,&h_EncSetup->Tx_ltpf +#else + ,h_EncSetup->Tx_ltpf +#endif +#else + , encoder->Tx_ltpf +#endif +#endif +); +#ifdef WMOPS + pop_wmops(); +#endif + + /* end s_12k8 */ +#ifdef WMOPS + push_wmops("AttackDetector"); +#endif + /* currentScratch Size = ??? bytes */ +#ifdef ENABLE_HR_MODE + attack_detector_fx(encoder, h_EncSetup, s_in_scaled_lp, sub(h_EncSetup->x_exp, 15), currentScratch); +#else + attack_detector_fx(encoder, h_EncSetup, s_in_scaled, sub(h_EncSetup->x_exp, 15), currentScratch); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + + /* begin ener_fx */ +#ifdef WMOPS + push_wmops("PerBandEnergy"); +#endif + /* currentScratch Size = 160 bytes */ + processPerBandEnergy_fx(ener_fx, &ener_fx_exp, d_fx, d_fx_exp, encoder->bands_offset, encoder->fs_idx, + encoder->bands_number, 0, encoder->frame_dms, currentScratch +#ifdef ENABLE_HR_MODE + , encoder->hrmode +#endif + ); +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Near Nyquist Detector"); +#endif + /* Near Nyquist Detector */ + processNearNyquistdetector_fx(&encoder->near_nyquist_flag, encoder->fs_idx, encoder->near_nyquist_index, + encoder->bands_number, ener_fx, ener_fx_exp +#ifdef ENABLE_HR_MODE + , encoder->frame_dms, encoder->hrmode ); +#else + ); +#endif + /* Disable LTPF if nyquist detector triggers */ + IF (encoder->near_nyquist_flag != 0 || sub(h_EncSetup->lfe, 1) == 0) + { + h_EncSetup->ltpf_mem_ltpf_on = 0; move16(); + ltpf_idx[1] = 0; move16(); + } +#ifdef WMOPS + pop_wmops(); +#endif +#ifdef WMOPS + push_wmops("BW Cutoff-Detection"); +#endif + IF (h_EncSetup->lfe == 0) + { +#ifdef ENABLE_HR_MODE + /* No BW Cutoff for 8 kHz and 96 kHz */ + IF (encoder->fs_idx > 0 && encoder->hrmode == 0 && encoder->bw_ctrl_active == 0) + { +#else /* ENABLE_HR_MODE */ + IF (encoder->fs_idx > 0 && encoder->bw_ctrl_active == 0) + { +#endif /* ENABLE_HR_MODE */ + processDetectCutoffWarped_fx(&BW_cutoff_idx, ener_fx, ener_fx_exp, encoder->fs_idx, encoder->frame_dms); + } + ELSE + { + BW_cutoff_idx = encoder->fs_idx; + move16(); + } + } + ELSE + { + BW_cutoff_idx = 0; + } +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("SnsCompScf"); +#endif + + + /* currentScratch Size = 512 bytes */ + processSnsComputeScf_fx(ener_fx, ener_fx_exp, encoder->fs_idx, encoder->bands_number, scf, + h_EncSetup->attdec_detected, encoder->attdec_damping, currentScratch, encoder->sns_damping +#ifdef CR9_C_ADD_1p25MS + , encoder->frame_dms, normcorr, &encoder->LT_normcorr +#endif + ); + +#ifdef WMOPS + pop_wmops(); +#endif + + +#ifdef CR9_C_ADD_1p25MS_LRSNS + IF(sub(encoder->frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0) + { + pitch_rx_fx = ltpf_idx[0]; /* pitch_rx status flag */ + ltpf_rx_fx = ltpf_idx[1]; /* ltpf_activation used in snslr_st1C mode */ + + +#ifdef WMOPS + push_wmops("EncLC3_SnsQuantScfEncLR_fx"); +#endif + envelope_bits_fx = snsQuantScfEncLR_fx( + scf, /* input scf is always Word16 Q11 (both for ENABLE_HR and DISABLE_HR) */ + L_scf_idx, /* output: to send to enc_entropy_fx() */ + scf_q, /* output: Word32(for ENABLE_HR) or Word16 (for DISABLE_HR ) */ + pitch_rx_fx, ltpf_rx_fx, /* input: pitch information to st1C */ + currentScratch); +#ifdef WMOPS + pop_wmops(); +#endif + + } + ELSE + { +#ifdef WMOPS + push_wmops("SnsQuantScfEnc38bit"); +#endif + processSnsQuantizeScfEncoder_fx(scf, L_scf_idx, scf_q, currentScratch); +#ifdef WMOPS + pop_wmops(); +#endif + } +#else +#ifdef WMOPS + push_wmops("SnsQuantScfEnc"); +#endif + /* currentScratch Size = 500 bytes */ + processSnsQuantizeScfEncoder_fx(scf, L_scf_idx, scf_q, currentScratch); +#ifdef WMOPS + pop_wmops(); +#endif +#endif /* CR9_C_ADD_1p25MS_LRSNS */ + +#ifdef WMOPS + push_wmops("SnsInterpScfEnc"); +#endif + /* currentScratch Size = 128 bytes */ + processSnsInterpolateScf_fx(scf_q, int_scf_fx, int_scf_fx_exp, 1, encoder->bands_number, currentScratch); +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Mdct shaping_enc"); +#endif + processMdctShaping_fx(d_fx, int_scf_fx, int_scf_fx_exp, encoder->bands_offset, encoder->bands_number); + +#ifdef WMOPS + pop_wmops(); +#endif + /* end int_scf_fx_exp */ +#ifdef WMOPS + push_wmops("BandwidthControl_enc"); +#endif + if (encoder->bandwidth < L_shr_pos(encoder->fs, 1)) + { + process_cutoff_bandwidth(d_fx, encoder->yLen, encoder->bw_ctrl_cutoff_bin); + BW_cutoff_idx = s_min(BW_cutoff_idx, encoder->bw_index); + } +#ifdef WMOPS + pop_wmops(); +#endif +#ifdef WMOPS + push_wmops("Tns_enc"); +#endif + /* currentScratch Size = 2 * MAX_LEN + 220 */ + +#ifdef CR9_C_ADD_1p25MS + IF (h_EncSetup->lfe == 0 && encoder->frame_dms > LC3PLUS_FRAME_DURATION_1p25MS) +#else + IF (h_EncSetup->lfe == 0) +#endif + { + processTnsCoder_fx(&(h_EncSetup->tns_bits), indexes, d_fx, BW_cutoff_idx, tns_order, &tns_numfilters, + h_EncSetup->enable_lpc_weighting, encoder->nSubdivisions, encoder->frame_dms, + encoder->frame_length, currentScratch +#ifdef ENABLE_HR_MODE + , encoder->hrmode +#endif + , encoder->near_nyquist_flag + ); + } + ELSE + { + tns_numfilters = 1; + move16(); +#ifdef CR9_C_ADD_1p25MS + IF (encoder->frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) { + tns_numfilters = 0; move16(); + } +#endif + tns_order[0] = 0; + move16(); + h_EncSetup->tns_bits = tns_numfilters; + move16(); + } +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Est. Global Gain"); +#endif + /* currentScratch Size = 4 * MAX_LEN bytes */ + h_EncSetup->targetBitsQuant = sub(h_EncSetup->targetBitsInit, add(h_EncSetup->tns_bits, ltpf_bits)); + +#ifdef CR9_C_ADD_1p25MS_LRSNS + IF( sub(encoder->frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0 ) + { /* adjust(==reduce) target bits based on the selected LRSNS-VQ bitrate */ + + h_EncSetup->targetBitsQuant = add(h_EncSetup->targetBitsQuant, 38); /* legacy 38bits was already pre-subtracted in h_EncSetup->targetBitsInit setup */ + ASSERT(envelope_bits_fx >= 9 && envelope_bits_fx <= 30); + h_EncSetup->targetBitsQuant = sub(h_EncSetup->targetBitsQuant, envelope_bits_fx); /* 9,10, 29,30, subtract actual LRSNS bitrate */ + } +#endif + + test(); +#ifdef CR9_C_ADD_1p25MS_LRSNS + /* incoming (state based) ltpf_bits for tranmission set in function ltpf_coder_fx() */ + test(); test(); + lrsns_st1C_in_use = 0; move16(); + /* LRSNS stage1C use 10 bits and ltp/ltpf active flags , i.e. one can thus not always disable/steal the ltp/ltpf flags */ + if ( (sub(encoder->frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0) && (sub(envelope_bits_fx, 10) == 0) && (L_sub(L_scf_idx[0], 170L) > 0) ) + { + ASSERT(L_scf_idx[0] < (2 * 170) && (L_scf_idx[1] != 0) ); + lrsns_st1C_in_use = 1; move16(); + } + + ltptx_lowest_bit_lim = 1; move16(); + if ( sub(encoder->frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0 ) + { + ltptx_lowest_bit_lim = lrsns_ltp_bits_fx[0]; move16(); + } + test(); test(); test(); test(); + + /* allow cut away of LTP-active, ltpf-active, lag-index (including phase A, B) info when possible and not actually in use by LRSNS-VQ */ + + IF((h_EncSetup->targetBitsQuant < 0) && (sub(ltpf_bits, ltptx_lowest_bit_lim) > 0) && (lrsns_st1C_in_use == 0)) +#else + IF (h_EncSetup->targetBitsQuant < 0 && sub(ltpf_bits, 1) > 0) +#endif + { + /* Disable LTPF */ + h_EncSetup->ltpf_mem_ltpf_on = 0; move16(); + ltpf_idx[1] = 0; move16(); +#ifdef CR9_C_ADD_1p25MS_LRSNS + ASSERT( (ltpf_bits-ltptx_lowest_bit_lim) > 0 ); + h_EncSetup->targetBitsQuant = add(h_EncSetup->targetBitsQuant, sub(ltpf_bits, ltptx_lowest_bit_lim)); move16(); /* subtract saving */ + ltpf_bits = ltptx_lowest_bit_lim; move16(); +#else + ltpf_bits = 1; move16(); + h_EncSetup->targetBitsQuant = sub(h_EncSetup->targetBitsInit, add(h_EncSetup->tns_bits, ltpf_bits)); +#endif + } + +#ifdef ENABLE_HR_MODE + Word32 gain32; +#endif + + processEstimateGlobalGain_fx(d_fx, d_fx_exp, encoder->yLen, h_EncSetup->targetBitsQuant, +#ifdef ENABLE_HR_MODE + &gain32, +#else + &gain, +#endif + &gain_e, + &quantizedGain, &quantizedGainMin, h_EncSetup->quantizedGainOff, + &h_EncSetup->targetBitsOff, &h_EncSetup->mem_targetBits, h_EncSetup->mem_specBits, + currentScratch +#ifdef ENABLE_HR_MODE + , encoder->hrmode, h_EncSetup->regBits, encoder->frame_dms +#else +#if defined(FIX_BOTH_1p25_TEST_NEW_GG_EST2) || defined (FIX_1p25_GG_EST_TUPLES) + , encoder->frame_dms +#endif +#endif + ); +#ifdef WMOPS + pop_wmops(); +#endif + /* begin q_d_fx16 */ + +#ifdef WMOPS + push_wmops("Quant. 1"); +#endif +#ifdef ENABLE_HR_MODE + processQuantizeSpec_fx(d_fx, d_fx_exp, gain32, gain_e, q_d_fx24, encoder->yLen, h_EncSetup->targetBitsQuant, + h_EncSetup->targetBitsAri, &h_EncSetup->mem_specBits, &nBits, encoder->fs_idx, &lastnz, + codingdata, &lsbMode, -1, encoder->hrmode); + +#else + processQuantizeSpec_fx(d_fx, d_fx_exp, gain, gain_e, q_d_fx16, encoder->yLen, h_EncSetup->targetBitsQuant, + h_EncSetup->targetBitsAri, &h_EncSetup->mem_specBits, &nBits, encoder->fs_idx, &lastnz, + codingdata, &lsbMode, -1); +#endif /* ENABLE_HR_MODE */ +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Adj. Global Gain"); +#endif +#ifdef ENABLE_HR_MODE + //gain32 = L_shl_pos((Word32)gain, 16); + processAdjustGlobalGain_fx(&quantizedGain, quantizedGainMin, h_EncSetup->quantizedGainOff, &gain32, &gain_e, + h_EncSetup->targetBitsQuant, h_EncSetup->mem_specBits, &gainChange, encoder->fs_idx + , encoder->hrmode, encoder->frame_dms + ); + gain = round_fx(gain32); +#else + processAdjustGlobalGain_fx(&quantizedGain, quantizedGainMin, h_EncSetup->quantizedGainOff, &gain, &gain_e, + h_EncSetup->targetBitsQuant, h_EncSetup->mem_specBits, &gainChange, encoder->fs_idx); +#endif /* ENABLE_HR_MODE */ +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Quant. 2"); +#endif + IF (sub(gainChange, 1) == 0) + { +#ifdef ENABLE_HR_MODE + processQuantizeSpec_fx(d_fx, d_fx_exp, gain32, gain_e, q_d_fx24, encoder->yLen, h_EncSetup->targetBitsQuant, + h_EncSetup->targetBitsAri, NULL, &nBits, encoder->fs_idx, &lastnz, codingdata, &lsbMode, + 0, encoder->hrmode); +#else + processQuantizeSpec_fx(d_fx, d_fx_exp, gain, gain_e, q_d_fx16, encoder->yLen, h_EncSetup->targetBitsQuant, + h_EncSetup->targetBitsAri, NULL, &nBits, encoder->fs_idx, &lastnz, codingdata, &lsbMode, + 0); +#endif /* ENABLE_HR_MODE */ + } +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Res. Cod."); +#endif + IF (lsbMode == 0) + { + processResidualCoding_fx(d_fx_exp, d_fx, +#ifdef ENABLE_HR_MODE + q_d_fx24, +#else + q_d_fx16, +#endif +#ifdef ENABLE_HR_MODE + gain32, +#else + gain, +#endif + gain_e, encoder->yLen, h_EncSetup->targetBitsQuant, nBits, resBits, &numResBits +#ifdef ENABLE_HR_MODE + , encoder->hrmode +#endif +#if defined (CR9_C_ADD_1p25MS) + , encoder->frame_dms +#endif + ); + } + ELSE + { + numResBits = 0; + move16(); + } +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Noise fac"); +#endif + /* currentScratch Size = 2 * MAX_LEN bytes */ + IF (h_EncSetup->lfe == 0) + { + processNoiseFactor_fx(&fac_ns_idx, d_fx_exp, d_fx, +#ifdef ENABLE_HR_MODE + q_d_fx24, +#else + q_d_fx16, +#endif + gain, gain_e, BW_cutoff_idx, encoder->frame_dms, h_EncSetup->targetBytes, currentScratch +#ifdef ENABLE_HR_MODE + , encoder->hrmode +#endif + ); + } + ELSE + { + fac_ns_idx = 7; + move16(); + } +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Entropy cod"); +#endif + processEncoderEntropy(bytes, &bp_side, &mask_side, h_EncSetup->targetBitsAri, h_EncSetup->targetBytes, + encoder->yLen, encoder->BW_cutoff_bits, tns_numfilters, lsbMode, lastnz, tns_order, + fac_ns_idx, quantizedGain, BW_cutoff_idx, ltpf_idx, L_scf_idx, bfi_ext, encoder->fs_idx +#ifdef CR9_C_ADD_1p25MS +#ifdef FIX_TX_RX_STRUCT_STEREO + , encoder->frame_dms, &h_EncSetup->Tx_ltpf +#else + , encoder->frame_dms, &encoder->Tx_ltpf +#endif +#endif + ); +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Ari cod"); +#endif + processAriEncoder_fx(bytes, bp_side, mask_side, h_EncSetup->targetBitsAri, +#ifdef ENABLE_HR_MODE + q_d_fx24, +#else + q_d_fx16, +#endif + tns_order, tns_numfilters, indexes, lastnz, codingdata, resBits, numResBits, lsbMode, + h_EncSetup->enable_lpc_weighting, currentScratch); +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("Reorder Bitstream Enc"); +#endif + test(); + IF (encoder->combined_channel_coding == 0 && h_EncSetup->n_pc > 0) + { +#ifdef WMOPS + push_wmops("Reorder Ari dec"); +#endif + +#ifdef ENABLE_HR_MODE + Word32 *xbuf = (Word32 *) scratchAlign(scratchBuffer, 0); + + processAriDecoder_fx(bytes, &bp_side, &mask_side, h_EncSetup->total_bits, encoder->yLen, encoder->fs_idx, + h_EncSetup->enable_lpc_weighting, tns_numfilters, lsbMode, lastnz, &gain, tns_order, + fac_ns_idx, quantizedGain, encoder->frame_dms, h_EncSetup->n_pc, 0, + shr_pos(h_EncSetup->total_bits, 3), 1, &gain, &b_left, &gain, + xbuf, + &gain, resBits, indexes, &gain, + currentScratch + , encoder->hrmode + ); +#else + + processAriDecoder_fx(bytes, &bp_side, &mask_side, h_EncSetup->total_bits, encoder->yLen, encoder->fs_idx, + h_EncSetup->enable_lpc_weighting, tns_numfilters, lsbMode, lastnz, &gain, tns_order, + fac_ns_idx, quantizedGain, encoder->frame_dms, h_EncSetup->n_pc, 0, + shr_pos(h_EncSetup->total_bits, 3), 1, &gain, &b_left, &gain, + codingdata, + &gain, resBits, indexes, &gain, + currentScratch + ); +#endif + +#ifdef WMOPS + pop_wmops(); /* Ari dec */ +#endif + processReorderBitstream_fx(bytes, h_EncSetup->n_pccw, h_EncSetup->n_pc, b_left, currentScratch); + } +#ifdef WMOPS + pop_wmops(); +#endif + + /* end q_d_fx16 */ +#ifdef WMOPS + pop_wmops(); +#endif + + Dyn_Mem_Deluxe_Out(); +} + +int Enc_LC3PLUS(LC3PLUS_Enc *encoder, void **input, int bits_per_sample, UWord8 *output, void *scratch, Word16 bfi_ext) +{ + int ch = 0, output_size = 0; + int input_size = 0; + int totalBytes = (Word32)encoder->bitrate * encoder->frame_length / (8 * encoder->fs_in); + int output_size2; + + UWord8 *lc3buf = output; + + for (ch = 0; ch < encoder->channels; ch++) + { + Enc_LC3PLUS_Channel(encoder, ch, bits_per_sample, input[ch], lc3buf, scratch, bfi_ext); + if (encoder->epmode && encoder->combined_channel_coding == 0) + { + output_size2 = totalBytes / encoder->channels + (ch < (totalBytes % encoder->channels)); +#ifdef WMOPS + push_wmops("fec_enc"); +#endif + + fec_encoder(encoder->epmode, encoder->epmr, lc3buf, encoder->channel_setup[ch]->targetBytes, output_size2, + encoder->channel_setup[ch]->n_pccw, scratch); + +#ifdef WMOPS + pop_wmops(); +#endif + + lc3buf += output_size2; + output_size += output_size2; + } + else + { + lc3buf += encoder->channel_setup[ch]->targetBytes; + output_size += encoder->channel_setup[ch]->targetBytes; + } + } + + if (encoder->epmode > 0 && encoder->combined_channel_coding) + { + input_size = output_size; + output_size = (Word32)encoder->bitrate * encoder->frame_length / (8 * encoder->fs_in); +#ifdef WMOPS + push_wmops("fec_enc"); +#endif + + fec_encoder(encoder->epmode, encoder->epmr, output, input_size, output_size, encoder->channel_setup[0]->n_pccw, + scratch); + +#ifdef WMOPS + pop_wmops(); +#endif + } + + return output_size; +} diff --git a/lib_lc3plus/estimate_global_gain_fx.c b/lib_lc3plus/estimate_global_gain_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..21b0d7d161992d1bd322bd1c7eb3b179e37308cf --- /dev/null +++ b/lib_lc3plus/estimate_global_gain_fx.c @@ -0,0 +1,939 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +void processEstimateGlobalGain_fx(Word32 x[], Word16 x_e, Word16 lg, Word16 nbitsSQ, +#ifdef ENABLE_HR_MODE + Word32 *gain, +#else + Word16 *gain, +#endif + Word16 *gain_e, + Word16 *quantizedGain, Word16 *quantizedGainMin, Word16 quantizedGainOff, + Word32 *targetBitsOff, Word16 *old_targetBits, Word16 old_specBits, + Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode, Word16 regBits, LC3PLUS_FrameDuration frame_dms +#else +#if defined(FIX_BOTH_1p25_TEST_NEW_GG_EST2) ||defined (FIX_1p25_GG_EST_TUPLES) + , LC3PLUS_FrameDuration frame_dms +#endif +#endif +) +{ + + Word16 lg_4, tmp16, iszero, s; + Word32 ener, tmp32, x_max; + Word32 target, fac, offset; + Word32 *en; + Counter iter, i; + Word32 diff, diff2; +#ifdef ENABLE_HR_MODE + Word16 *en_exp = NULL; + Word32 M0, M1; +#endif +#ifdef FIX_1p25_GG_EST_TUPLES + /* NB (-1) WB(20), SSWB(30), SWB(40), FB(50) */ + Word16 nCoeffTab1p25[5] = { -1/*NB*/, GG_1p25_WB_TUPLES, GG_1p25_SSWB_TUPLES, GG_1p25_SWB_TUPLES, GG_1p25_FB_TUPLES }; + Word16 bwIdx; + Word16 divTabQ15[5] = { 0, -32768, 16384, 10923, 8192 }; +#endif +#ifdef FIX_BOTH_1p25_TEST_NEW_GG_EST2 + Word16 nCoeffPerBand = 4; /* 4 coeff per band */ + Word16 twoCoeffFlag = 0; /* boolean */ +#endif +#if defined( FIX_1p25_FLEX_ITER_TUPLE_LOOP ) || defined( FIX_1p25_FLEX_BISECT_LOOP ) + Word16 twoCoeffOutShiftA; + Word16 twoCoeffOutShiftB; + Word32 L_twoCoeffSuppressMaskA; + Word32 L_twoCoeffSuppressMaskB; + Word32 L_dB_scale_offset, L_dB_scale_offset2, L_dB_scale_offset3; + + Word16 twoCoeffOutShift; + Word32 L_twoCoeffSuppressMask; + +#elif defined( FIX_BASOP_1p25_NEW_GG_EST3) + Word16 twoCoeffOutShift; + Word32 L_twoCoeffSuppressMask; + Word32 L_dB_scale_offset, L_dB_scale_offset2, L_dB_scale_offset3; +#endif +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processEstimateGlobalGain_fx", sizeof(struct { + Word16 lg_4, s, tmp16, iszero; + Word32 ener, tmp32, x_max; + Word32 target, fac, offset; + Word32 *en; + Counter i, iter; + Word32 diff, diff2; + })); +#endif + UNUSED(iszero); + +#ifdef FIX_1p25_FLEX_ITER_TUPLE_LOOP + UNUSED(twoCoeffOutShift); + UNUSED(L_twoCoeffSuppressMask); +#endif +#ifdef FIX_1p25_FLEX_BISECT_LOOP + UNUSED(twoCoeffOutShiftA); + UNUSED(L_twoCoeffSuppressMaskA); + UNUSED(twoCoeffOutShiftB); + UNUSED(L_twoCoeffSuppressMaskB); +#endif + +#ifdef FIX_1p25_FLEX_ITER_TUPLE_LOOP + UNUSED(twoCoeffOutShiftA); + UNUSED(L_twoCoeffSuppressMaskA); + UNUSED(twoCoeffOutShiftB); + UNUSED(L_twoCoeffSuppressMaskB); +#endif + +#ifndef FIX_1p25_GG_EST_TUPLES +#ifdef FIX_BOTH_1p25_TEST_NEW_GG_EST2 + IF(frame_dms == LC3PLUS_FRAME_DURATION_1p25MS && (sub(lg, 30) <= 0)) /* WB and SSWB */ + { + nCoeffPerBand = 2; move16(); /* 2 coeff per band */ + twoCoeffFlag = 1; move16(); + } +#endif +#endif + + +#ifdef FIX_1p25_GG_EST_TUPLES + twoCoeffFlag = 0; move16(); + nCoeffPerBand = 4; move16(); /* default assume 4 coeff per band(4-tuples block) */ + lg_4 = shr_pos_pos(lg, 2); + + test(); + IF(frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) + { + bwIdx = mult(lg, 3276); + assert(bwIdx == ((lg - 1) / 10)); + nCoeffPerBand = nCoeffTab1p25[bwIdx]; move16(); + + if (sub(nCoeffPerBand, 2) == 0) + { + twoCoeffFlag = 1; move16(); + } + s = mult(add(lg, sub(nCoeffPerBand, 1)), divTabQ15[nCoeffPerBand]); + + tmp16 = i_mult(s, nCoeffPerBand); + +#ifdef FIX_1p25_32kHz_CLANG_WARNING_EST_GAIN + /* common 2,3,4 tuple energy loop may access tail values in blocks of GG_1p25_MAX_TUPLES */ + /* even if they are actually unused as values and shifted out, they should not be accessed uninitialized */ + tmp16 = add(tmp16, sub(GG_1p25_MAX_TUPLES,nCoeffPerBand)); +#endif + + FOR(i = lg; i < tmp16; i++) + { + x[i] = L_deposit_l(0); /* zero the top virtual MDCT lines in the spectrum signal x */ + } + assert(MAX_LEN >= s); + lg_4 = s; /* lg_4 also used for 3_tuples, 2 tuples*/ + } + +#elif defined( FIX_BASOP_ENC_QUANTIZE_1P25MS_512KBPS) + /* handle non-eaxactly quadruple lengths, in case frame_length is (e.g 1p25ms 24kHz --> 30 = 7*4 + 2 ) */ + /* e.g 1p25ms 48kHz --> 50 = 12*4 + 2 ) */ + /* quadruple extension is needed provide a correct x_max analysis as req. for scaling analysis */ + lg_4 = shr_pos(lg, 2); /*1/4*/ + + IF(frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) + { + tmp16 = sub(lg, shl_pos(lg_4, 2)); + test(); + if (tmp16 != 0) + { + lg_4 = add(lg_4, 1); + } + FOR(i = lg; i < lg_4 * 4; i++) + { + x[i] = L_deposit_l(0); /* zero these top virtual MDCT lines */ + } + } +#endif + + + en = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = MAX_LEN bytes */ + + +#ifdef ENABLE_HR_MODE + if (hrmode) + { + M0 = 1; + M1 = 1; /* Regularization factor; needs´to be 1e-5, but 1e-5 is 0 in Q15 */ + en_exp = (Word16 *) scratchAlign(en, sizeof(*en) * MAX_LEN); + } +#endif + IF (*old_targetBits < 0) + { + *targetBitsOff = 0; + move16(); + } + ELSE + { + tmp32 = L_add(*targetBitsOff, L_deposit_h(sub(*old_targetBits, old_specBits))); + tmp32 = L_min((40 << 16), L_max(-(40 << 16), tmp32)); + *targetBitsOff = L_add(Mpy_32_16_lc3plus(*targetBitsOff, 26214), Mpy_32_16_lc3plus(tmp32, 6554)); + move16(); + } + + *old_targetBits = nbitsSQ; move16(); + nbitsSQ = add(nbitsSQ, round_fx(*targetBitsOff)); + +#ifndef FIX_BASOP_ENC_QUANTIZE_1P25MS_512KBPS + lg_4 = shr_pos(lg, 2); +#endif + + x_max = 0; move32(); + +/* energy of quadruples with 9dB offset */ +#ifdef ENABLE_HR_MODE + IF (hrmode) + { + FOR (i = 0; i < lg_4; i++) + { + Word32 absval; + Word16 idx; + /* normalization */ + s = 31; + move16(); + + /* M1 requires a 32x16 mult with Q0 i, resulting in Q15. Keeping both M0 and M1 in same Q */ + /* Use Q15 for M0 and M1 calculation */ + idx = shl(i, 2); + + tmp32 = L_abs(x[0]); + absval = L_shr(tmp32, 16); + M0 = L_add(M0, absval); /* M0 += fabs(x[idx])*/ + M1 = L_add(M1, L_mult(absval, idx)); /* M1 += i*fabs(x[idx])*/ + idx = add(idx, 1); + + absval = L_abs(x[1]); + tmp32 = L_max(tmp32, absval); + absval = L_shr(tmp32, 16); + M0 = L_add(M0, absval); /* M0 += fabs(x[idx])*/ + M1 = L_add(M1, L_mult(absval, idx)); /* M1 += idx*fabs(x[idx])*/ + idx = add(idx, 1); + + absval = L_abs(x[2]); + tmp32 = L_max(tmp32, absval); + absval = L_shr(tmp32, 16); + M0 = L_add(M0, absval); /* M0 += fabs(x[idx])*/ + M1 = L_add(M1, L_mult(absval, idx)); /* M1 += idx*fabs(x[idx])*/ + idx = add(idx, 1); + + absval = L_abs(x[3]); + tmp32 = L_max(tmp32, absval); + absval = L_shr(tmp32, 16); + M0 = L_add(M0, absval); /* M0 += fabs(x[idx])*/ + M1 = L_add(M1, L_mult(absval, idx)); /* M1 += idx*fabs(x[idx])*/ + + x_max = L_max(x_max, tmp32); + + if (tmp32 != 0) + s = norm_l(tmp32); + + s = sub(s, 2); /* 2 bits headroom */ + + /* calc quadruple energy */ + ener = L_deposit_l(1); + + tmp16 = round_fx(L_shl(x[0], s)); + ener = L_mac(ener, tmp16, tmp16); + + tmp16 = round_fx(L_shl(x[1], s)); + ener = L_mac(ener, tmp16, tmp16); + + tmp16 = round_fx(L_shl(x[2], s)); + ener = L_mac(ener, tmp16, tmp16); + + tmp16 = round_fx(L_shl(x[3], s)); + ener = L_mac(ener, tmp16, tmp16); + + s = shl_pos(sub(x_e, s), 1); + if (ener == 1 && s < 0) + s = 0; + IF (regBits > 0) + { + en[i] = ener; + en_exp[i] = s; + move32(); + } + ELSE + { + /* log */ + tmp32 = L_add(BASOP_Util_Log2(ener), L_shl_pos(L_deposit_l(s), 25)); /* log2, 6Q25 */ + tmp32 = L_add(L_shr_pos(Mpy_32_16_lc3plus(tmp32, 0x436E), 7), + 0x4E666); /* -> (28/20)*(7+10*tmp32/log2(10)), 16Q15 */ + en[i] = tmp32; + move32(); + } + + x += 4; + } + } + ELSE +#endif + { /* regular hrmode==0 */ +#if defined ( FIX_1p25_FLEX_ITER_TUPLE_LOOP ) + if (frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) + { + /* 4 or 2 tuples */ + L_dB_scale_offset = L_shr_pos(0x9CCCD, twoCoeffFlag); /* S15Q16 7.5(4 tuples) or 3.75(2_tuples) offset */ + L_dB_scale_offset2 = L_shr_pos(0x460000, twoCoeffFlag); + L_dB_scale_offset3 = L_shr_pos(0x3C7AE, twoCoeffFlag); + + /* set up constants for blocks of 4 (or block of 3 or 2)*/ + + /*init for 2-tuples energy loop */ + twoCoeffOutShiftA = 31; move16(); /* shift out */ + twoCoeffOutShiftB = 31; move16(); /* shift out */ + L_twoCoeffSuppressMaskA = 0; move32(); /* suppress value*/ + L_twoCoeffSuppressMaskB = 0; move32(); /* suppress value*/ + + +#if GG_1p25_MAX_TUPLES>=3 + IF(sub(nCoeffPerBand, 3) == 0) + { + L_dB_scale_offset = L_add(Mpy_32_16_lc3plus(0x9CCCD, 24576), 1L); /* S15Q16/ round(7.5 * 3/4), 481689.75 -> 481690 */ + L_dB_scale_offset2 = Mpy_32_16_lc3plus(0x460000, 24576); /*3440640.0 */ + L_dB_scale_offset3 = Mpy_32_16_lc3plus(0x3C7AE, 24576); /* 185794.5*/ + + twoCoeffOutShiftA = 0; move16(); /* do not shift out */ + L_twoCoeffSuppressMaskA = -1L; move32(); /* all ones, do not suppress*/ + twoCoeffOutShiftB = 31; move16(); /* shift out x[3] */ + L_twoCoeffSuppressMaskB = 0; move32(); /* suppress value*/ + } +#endif + +#if GG_1p25_MAX_TUPLES>=4 + IF(sub(nCoeffPerBand, 4) == 0) + { + twoCoeffOutShiftA = 0; move16(); /* do not shift out */ + twoCoeffOutShiftB = 0; move16(); /* do not shift out */ + L_twoCoeffSuppressMaskA = -1L; move32(); /* all ones, do not suppress*/ + L_twoCoeffSuppressMaskB = -1L; move32(); /* all ones, do not suppress*/ + } +#endif +#endif + +#ifdef FIX_1p25_FLEX_ITER_TUPLE_LOOP + + FOR(i = 0; i < lg_4; i++) /* 1.25 ms energy loop used for all N/4 , (N)/3 and N/2 */ + { + /* normalization */ + s = 31; move16(); + + tmp32 = L_abs(x[0]); + tmp32 = L_max(tmp32, L_abs(x[1])); + + /* 0 or 31 shift, 0 for blocks of 4, 31 to accumulate a 0 value (for block #2,#3) for blocks of 2 or blocks of 3 */ +#if GG_1p25_MAX_TUPLES>=3 + tmp32 = L_max(tmp32, L_shr_pos_pos(L_abs(x[2]), twoCoeffOutShiftA)); +#endif +#if GG_1p25_MAX_TUPLES>=4 + tmp32 = L_max(tmp32, L_shr_pos_pos(L_abs(x[3]), twoCoeffOutShiftB)); +#endif + x_max = L_max(x_max, tmp32); /* global x_max */ + + + if (tmp32 != 0) + { + s = norm_l(tmp32); + } + + s = sub(s, 2); /* 2 bits headroom . for up to four values accumulation */ + /* NB only 1 bit headroom needed with L_mac0 */ + /* NB only 2tuples will only need 1 bit even with L_mac */ + /* calc quadruple or , triple or tuple energy */ + ener = L_deposit_l(1); + + + tmp16 = round_fx(L_shl(x[0], s)); /* s is in range [29...-2], i.e. can become a downshift of two */ + ener = L_mac(ener, tmp16, tmp16); + + tmp16 = round_fx(L_shl(x[1], s)); + ener = L_mac(ener, tmp16, tmp16); + +#if GG_1p25_MAX_TUPLES >= 3 + tmp32 = L_and(x[2], L_twoCoeffSuppressMaskA); /* mask is 0 for 2blocks, all ones for 3 or 4 blocks */ + tmp16 = round_fx(L_shl(tmp32, s)); + ener = L_mac(ener, tmp16, tmp16); +#endif + +#if GG_1p25_MAX_TUPLES >= 4 + tmp32 = L_and(x[3], L_twoCoeffSuppressMaskB); /* 0 for 2 or 3 blocks, all ones for 4 blocks */ + tmp16 = round_fx(L_shl(tmp32, s)); + ener = L_mac(ener, tmp16, tmp16); +#endif + s = shl_pos(sub(x_e, s), 1); + +#ifdef NONBE_GAIN_EST_FIX + test(); test(); + if ((L_sub(ener, 1L) == 0) && (s < 0)) + { + s = 0; move16(); + } +#endif + +#ifndef LOG2_LC_APPROX + /* log2 */ + tmp32 = L_add_sat(BASOP_Util_Log2(ener), L_shl_sat(L_deposit_l(s), 25)); /* log2, 6Q25 */ +#endif +#ifdef LOG2_LC_APPROX + tmp32 = L_add_sat(BASOP_Util_Log2_LC(ener), L_shl_sat(L_deposit_l(s), 25)); /* log2LC , 6Q25 */ +#endif + tmp32 = L_add(L_shr_pos(Mpy_32_16_lc3plus(tmp32, 0x436E), 6), L_dB_scale_offset); /* -> (28/20)*( (7or5.25or3.5 ) + 10*tmp32/log2(10)), 15Q16 */ + + en[i] = tmp32; move32(); + + x += nCoeffPerBand; + /* N/4 or N/3 or N/2 */ + } /* for loop*/ + } /* end of IF 1p25 */ + else + { /* 4 or 2 merged loop for non-1p25ms */ +#endif + +#ifndef FIX_1p25_GG_EST_TUPLES + # ifdef FIX_BOTH_1p25_TEST_NEW_GG_EST2 + test(); + if (twoCoeffFlag != 0) + { + lg_4 = add(lg_4, lg_4); /*lg_4(extended) for N/4 doubled and used as "lg_2" for N/2 */ + } +#endif +#endif + + #ifdef FIX_BASOP_1p25_NEW_GG_EST3 + /*set up constants for blocks of two (or block of 4)*/ + L_dB_scale_offset = L_shr_pos(0x9CCCD, twoCoeffFlag); /* S15Q16/ 7.5 or 3.5 offset */ +#ifdef FIX_1p25_FLEX_ITER_TUPLE_LOOP + Word16 twoCoeffOutShift; + Word32 L_twoCoeffSuppressMask; +#endif + twoCoeffOutShift = 0; move16(); /* do not shift out */ + L_twoCoeffSuppressMask = -1L; move32(); /* all ones-mask, do not suppress*/ + + IF(twoCoeffFlag != 0) + { + twoCoeffOutShift = 31; move16(); + L_twoCoeffSuppressMask = 0; move16();/* supress value*/ + x[lg_4 * 2] = 0; move32(); /*make sure extra two coeffs at tail are zeroed */ + x[lg_4 * 2 + 1] = 0; move32(); + }; +#endif + + FOR (i = 0; i < lg_4; i++) + { + /* normalization */ + s = 31; move16(); + + tmp32 = L_abs(x[0]); + tmp32 = L_max(tmp32, L_abs(x[1])); +#ifdef FIX_BOTH_1p25_TEST_NEW_GG_EST2 +#ifdef FIX_BASOP_1p25_NEW_GG_EST3 + /* 0 or 31 shift, 0 for blocks of 4, 31 to accumulate a 0 value (for block #2,#3) for blocks of 2 */ + tmp32 = L_max(tmp32, L_shr_pos(L_abs(x[2]), twoCoeffOutShift)); + tmp32 = L_max(tmp32, L_shr_pos(L_abs(x[3]), twoCoeffOutShift)); +#endif +#else + tmp32 = L_max(tmp32, L_abs(x[2])); + tmp32 = L_max(tmp32, L_abs(x[3])); +#endif + x_max = L_max(x_max, tmp32); + + if (tmp32 != 0) { + s = norm_l(tmp32); + } + s = sub(s, 2); /* 2 bits headroom */ /* note: slightly suboptimal 2 bit headroom kept for pairs */ + + /* calc quadruple energy */ + ener = L_deposit_l(1); + + tmp16 = round_fx(L_shl(x[0], s)); + ener = L_mac(ener, tmp16, tmp16); + + tmp16 = round_fx(L_shl(x[1], s)); + ener = L_mac(ener, tmp16, tmp16); + +#ifdef FIX_BOTH_1p25_TEST_NEW_GG_EST2 +#ifdef FIX_BASOP_1p25_NEW_GG_EST3 + tmp32 = L_and(x[2], L_twoCoeffSuppressMask); /* 0 for 2blocks, all ones for 4 blocks */ + tmp16 = round_fx(L_shl(tmp32, s)); + ener = L_mac(ener, tmp16, tmp16); + + tmp32 = L_and(x[3], L_twoCoeffSuppressMask); /* 0 for 2blocks, all ones for 4 blocks */ + tmp16 = round_fx(L_shl(tmp32, s)); + ener = L_mac(ener, tmp16, tmp16); +#endif +#else + tmp16 = round_fx(L_shl(x[2], s)); + ener = L_mac(ener, tmp16, tmp16); + + tmp16 = round_fx(L_shl(x[3], s)); + ener = L_mac(ener, tmp16, tmp16); +#endif + s = shl_pos(sub(x_e, s), 1); + if (ener == 1 && s < 0) { + s = 0; + } + + /* log */ + tmp32 = L_add_sat(BASOP_Util_Log2(ener), L_shl_sat(L_deposit_l(s), 25)); /* log2, 6Q25 */ +#ifdef FIX_BOTH_1p25_TEST_NEW_GG_EST2 +#ifdef FIX_BASOP_1p25_NEW_GG_EST3 + tmp32 = L_add(L_shr_pos(Mpy_32_16_lc3plus(tmp32, 0x436E), 6), L_dB_scale_offset); /* -> (28/20)*( (7or3.5) + 10*tmp32/log2(10)), 15Q16 */ +#endif +#else + tmp32 = L_add(L_shr_pos(Mpy_32_16_lc3plus(tmp32, 0x436E), 6), 0x9CCCD); /* -> (28/20)*(7+10*tmp32/log2(10)), 15Q16 */ +#endif + en[i] = tmp32; move32(); + +#ifdef FIX_BOTH_1p25_TEST_NEW_GG_EST2 + x += nCoeffPerBand; +#else + x += 4; +#endif + } /* N/4 or N/2 energy loop */ +#ifdef FIX_1p25_FLEX_ITER_TUPLE_LOOP + } /* end of non-1.25ms 4 or 2 tuple energy loop */ +#endif + }/* hrmode==0 */ + + IF (x_max == 0) + { + *quantizedGainMin = quantizedGainOff; move16(); + *quantizedGain = 0; move16(); + *old_targetBits = -1; move16(); + } + ELSE + { + Word32 sub_val = 0xFCDD38F; + /*28 * log10(32767 - 0.375) * (1 - 1e-7) in Q21 */ + +#ifdef ENABLE_HR_MODE + if (hrmode) + { + /* + Original float code : + rB_offset = 8 * (1 - MIN(M1/M0, 2*frame_ms)/(2*frame_ms) + */ + Word16 ratio; + Word16 ratio_exp = 0; + Word32 regterm = MAX_32; /* 1 in Q31 */ + Word32 rB_offset, reg_val; + Word32 ratio_prod; + Word16 n_reg_val; + + if (M0 <= 0x7fff) + { + Word16 inv_M0 = Inv16(M0, &ratio_exp); /* Inverse in Q(15 - ratio_exp) */ + ratio = L_shr(Mpy_32_16_lc3plus(M1, inv_M0), 15 - ratio_exp); /* Integer ratio */ + } + else + { + Word16 M0_h = L_shr(M0, 15); + Word32 M1_h = L_shr(M1, 15); + + Word16 inv_M0 = Inv16(M0_h, &ratio_exp); /* Inverse in Q(15 - ratio_exp) */ + ratio = extract_l(L_shr(Mpy_32_16_lc3plus(M1_h, inv_M0), 15 - ratio_exp)); /* Integer ratio */ + } + + /* + regterm = MIN (M1 / M0, 2 *frame_ms) / (2 * frame_ms) + regterm = MIN (M1 * (10 / 2) / M0, frame_dms) / frame_dms + regterm = MIN ( ratio * 5, frame_dms) / frame_dms + */ + + ratio_prod = L_mult(ratio, 5); + + int frame_dms_val = 0; + SWITCH (frame_dms) /* 1 / frame_dms in Q15 */ + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: assert(0); frame_dms_val = 13; BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: frame_dms_val = 25; BREAK; + case LC3PLUS_FRAME_DURATION_5MS: frame_dms_val = 50; BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: frame_dms_val = 75; BREAK; + case LC3PLUS_FRAME_DURATION_10MS: frame_dms_val = 100; BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + if (ratio_prod < frame_dms_val) + { + Word16 mult_factor = 0; + + SWITCH (frame_dms) /* 1 / frame_dms in Q15 */ + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: mult_factor = 15721; BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: mult_factor = 1311; BREAK; + case LC3PLUS_FRAME_DURATION_5MS: mult_factor = 655; BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: mult_factor = 437; BREAK; + case LC3PLUS_FRAME_DURATION_10MS: mult_factor = 328; BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + /* ratio_prod < frame_dms. Hence Word16 can be used */ + + regterm = L_shl(L_mult(extract_l(ratio_prod), mult_factor), 15); /* result in Q31 */ + } + + rB_offset = L_sub(MAX_32, regterm); + /* Calculation in Q28 to prevent overflow. Subtraction result in Q31, downshift by 3 results in Q28. + Multiplication by 8 is implemented as upshift by 3. + */ + + /* + FLOAT code : reg_val = x_max * LC3_POW(2,-regBits - rB_offset); + */ + Word16 reg_val_e = x_e; + + IF(rB_offset > 0) + { + Word32 reg_exp = L_negate(L_add(L_shl(regBits, 25), L_shr(rB_offset, 3))); + reg_val = Mpy_32_32_lc3plus(x_max, BASOP_Util_InvLog2(reg_exp)); /* Product is in Q31 */ + /* reg_val is in Q(31-x_e) */ + } + ELSE + { + reg_val = x_max; + reg_val_e = sub(x_e, regBits); + } + + sub_val = 0x183BA045; move16(); + /*28 * log10(32768*256 - 2) in Q21 */ + + /* + Adding LC3_POW(2, -31) to reg_val.2^-31 * 2^(31-x_e) = 2^-x_e. + If x_e is positive, this is below precision requirements to be used. + */ + + if (reg_val_e < 0) + { + reg_val = L_add_sat(reg_val, L_shl_sat(1, negate(reg_val_e))); + } + n_reg_val = norm_l(reg_val); + + FOR (i = 0; i < lg_4; i++) + { + ener = en[i]; move16(); + s = en_exp[i]; move16(); + + Word16 shift_val = sub(reg_val_e, s); + + IF (sub(n_reg_val, shift_val) > 0) + { + IF(shift_val > -32) + { + ener = L_add(ener, L_shl(reg_val, shift_val)); /* Match q formats */ + } + } + ELSE + { + IF (sub(shift_val, 32) >= 0 ) + { + ener = reg_val; + } + ELSE + { + ener = L_add_sat(reg_val, L_shr(ener, shift_val)); + } + s = reg_val_e; + } + + tmp32 = L_add(BASOP_Util_Log2(ener), L_shl_pos(L_deposit_l(s), 25)); /* log2, 6Q25 */ + tmp32 = L_add(L_shr_pos(Mpy_32_32_lc3plus(tmp32, 0x436E439A), 7), 0x4E666); /* -> (28/20)*(7+10*tmp32/log2(10)), 15Q16 */ + en[i] = tmp32; move32(); + } + } +#endif + x_max = BASOP_Util_Log2(x_max); + /* Minimum gain */ + x_max = L_add(x_max, L_shl_pos(L_deposit_l(x_e), 25)); /* log2(x_max) in 6Q25 */ + x_max = L_sub( + Mpy_32_32_lc3plus(x_max, 0x436E439A), + sub_val); /* 28*log10(x_max/(32768-0.375)) = log2(x_max)*(28/log2(10))-28*log10(32768-0.375) in 10Q21 */ + /* 28/log1(10) is in Q27 + Mpy_32_32 : Q25(x_max) + Q27 + Q1(Mpy_32_32_ss) - Q32 = Q21 */ + *quantizedGainMin = extract_l(L_shr_pos(L_add(x_max, (1 << 21) + (1 << 11)), 21)); + move16(); + ASSERT(*quantizedGainMin <= 255 + quantizedGainOff); + *quantizedGainMin = s_max(quantizedGainOff, s_min(add(255, quantizedGainOff), *quantizedGainMin)); + + offset = L_deposit_h(add(255, quantizedGainOff)); /* -> 127 */ + +#ifdef ENABLE_HR_MODE + IF(hrmode) + { + offset = L_shr_pos(offset, 2); + /* SQ scale: 4 bits / 6 dB per quadruple */ + target = L_mult(0x3EB8, nbitsSQ); /* -> (28/20) * (1.4) * nbitsSQ */ + + fac = L_add(0x400000, 0); /* -> 256 */ + /* find offset (0 to 127) */ + FOR (iter = 0; iter < 8; iter++) + { + fac = L_shr_pos(fac, 1); + offset = L_sub(offset, fac); + + ener = L_deposit_l(0); + iszero = 1; + move16(); + + FOR (i = lg_4 - 1; i >= 0; i--) + { + tmp32 = L_sub(L_shr_pos(en[i], 1), offset); + diff = L_sub(tmp32, 0x27333); /* 0x4E666 -> (28/20)*(7) in Q15 */ + if (diff < 0) + { + if (iszero == 0) + { + ener = L_add(ener, 0xF1EC); /* 0x1E3D7 -> (28/20)*(2.7) in Q15 */ + } + } + else + { + ener = L_add(ener, tmp32); + iszero = 0; move16(); + + diff2 = L_sub(tmp32, 0x118000); /* 0x230000 -> (28/20)*(50) */ + if (diff2 >= 0) + { + ener = L_add(ener, diff2); + } + } + } + + /* if ener is above target -> increase offset */ + test(); + if (L_sub(ener, target) > 0 && iszero == 0) + { + offset = L_add(offset, fac); + } + } + tmp16 = extract_h(L_shl(offset, 2)); + } + ELSE +#endif + /* regular mode */ + /* SQ scale: 4 bits / 6 dB per quadruple */ + { + + #ifndef FIX_1p25_FLEX_BISECT_LOOP +#ifdef FIX_BASOP_1p25_NEW_GG_EST3 + /*these limits were constant for blocks of 4 , now we adaptively adjust them for blocks of two */ + L_dB_scale_offset = L_shr_pos(0x9CCCD, twoCoeffFlag); + L_dB_scale_offset2 = L_shr_pos(0x460000, twoCoeffFlag); + L_dB_scale_offset3 = L_shr_pos(0x3C7AE, twoCoeffFlag); +#endif +#endif + target = L_shl_pos(L_mult(0x7D71, nbitsSQ), 1); /* -> (28/20) * (1.4) * nbitsSQ */ + fac = L_add(0x1000000, 0); /* -> 256 */ + +#ifdef FIX_1p25_FLEX_BISECT_LOOP + + /* 1p25 iteration code, for 4-tuples 3-tuples and 2 tuples */ + test(); + IF((frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) && (sub(nCoeffPerBand, 4) <= 0)) + { + Word16 idx; /* 0, 1, 2 , section index */ + Word32 L_tmp32; + Word32 L_offset2; + + Word16 shiftl_fac[3] = { -31, 0, 1 }; /* ROM float mult_fact[3] = { 0.0, 1.0, 2.0 }; */ /* -31 shifts out all energy in an signed Word32 */ + + /* 4 or 2 tuples */ + L_dB_scale_offset = L_shr_pos(0x9CCCD, twoCoeffFlag); /* S15Q16 7.5(4 tuples) or 3.75(2_tuples) offset */ + L_dB_scale_offset2 = L_shr_pos(0x460000, twoCoeffFlag); + L_dB_scale_offset3 = L_shr_pos(0x3C7AE, twoCoeffFlag); + + /* set up constants for blocks of 4 (or block of 3 or 2)*/ +#if GG_1p25_MAX_TUPLES>=3 + IF(sub(nCoeffPerBand, 3) == 0) + { + L_dB_scale_offset = L_add(Mpy_32_16_lc3plus(0x9CCCD, 24576), 1L); /* S15Q16/ round(7.5 * 3/4), 481689.75 -> 481690 */ + L_dB_scale_offset2 = Mpy_32_16_lc3plus(0x460000, 24576); /*3440640.0 */ + L_dB_scale_offset3 = Mpy_32_16_lc3plus(0x3C7AE, 24576); /* 185794.5*/ + } +#endif + /* tuple-size dynamic constant tables, treated as registers */ + Word32 L_en_lim[2]; + Word32 L_add_fac[3]; + + L_en_lim[0] = L_add(L_dB_scale_offset, 0); /*28/20*7.0*/; + L_en_lim[1] = L_add(L_dB_scale_offset2, 0); /*28/20*50.0*/ + + L_add_fac[0] = L_add(L_dB_scale_offset3, 0); + L_add_fac[1] = L_add(0, 0); + L_add_fac[2] = L_negate(L_dB_scale_offset2); + + + /* find offset (0 to 255) */ + FOR(iter = 0; iter < 8; iter++) + { + fac = L_shr_pos_pos(fac, 1); + offset = L_sub(offset, fac); + iszero = 1; move16(); + ener = L_deposit_l(0); + /* skip iszero section, go to first band with enough energy */ + /* find first index where we start summing up adding bits. */ + + L_offset2 = L_add(offset, L_dB_scale_offset); + FOR(i = sub(lg_4, 1); i >= 0; i--) + { + L_tmp32 = L_sub(en[i], L_offset2); + IF(L_tmp32 > 0) + { + iszero = 0; move16(); /* now also allow upward update */ + BREAK; + } + } + /* exiting counter value "i" is remembered , for the next FOR loop initialization */ + + + /* Equations realized acc = { 0*d_en + 2.7 , 1*dEn + 0.0, 2*dEn + (-50.0) }; */ + FOR(; i >= 0; i--) + { + L_tmp32 = L_sub(en[i], offset); + + /* pre_quantize energy "L_tmp32" into a idx 0, 1, 2; to address tabled acc. values */ + idx = 0; move16(); /* "ptr" init to low section */ + if (L_sub(L_tmp32, L_en_lim[0]) > 0) + { + idx = add(idx, 1); /* single op */ /* middle section */ + } + + if (L_sub(L_tmp32, L_en_lim[1]) > 0) + { + idx = add(idx, 1); /* single op */ /* high section*/ + } + + ener = L_add_sat(ener, L_shl_sat(L_tmp32, shiftl_fac[idx])); /* *0.0, *1.0, *2.0 */ /* NB! this shifts L_tmp32, (the ener contribution) both up and down */ + ener = L_add_sat(ener, L_add_fac[idx]); /* 2.7, 0, -50 */ + } + + + /* if ener is above target -> increase offset */ + /* if only low level signal , iszero was never set to 0 --> offset not moved */ + assert(target > 0); + test(); test(); + if (L_sub(ener, target) > 0 && iszero == 0) + { + offset = L_add(offset, fac); + } + } /* iter 1--8 ,1p25 loop */ + } + /* if 1p25 */ + ELSE + { + #endif /* FLEX BISECT*/ + /* find offset (0 to 127) */ +#ifdef FIX_BASOP_1p25_NEW_GG_EST3 + /* 4 ,or 2 tuples */ + L_dB_scale_offset = L_shr_pos(0x9CCCD, twoCoeffFlag); + /* S15Q16 7.5(4 tuples) or 3.75(2_tuples) offset */ + L_dB_scale_offset2 = L_shr_pos(0x460000, twoCoeffFlag); + L_dB_scale_offset3 = L_shr_pos(0x3C7AE, twoCoeffFlag); +#endif + FOR(iter = 0; iter < 8; iter++) + { + fac = L_shr_pos(fac, 1); + offset = L_sub(offset, fac); + + ener = L_deposit_l(0); + iszero = 1; move16(); + + + FOR(i = lg_4 - 1; i >= 0; i--) + { + tmp32 = L_sub(en[i], offset); +#ifdef FIX_BOTH_1p25_TEST_NEW_GG_EST2 +#ifdef FIX_BASOP_1p25_NEW_GG_EST3 + diff = L_sub(tmp32, L_dB_scale_offset); /* 0x9CCCD -> (28/20)*( 7or3.5) in Q16 */ +#endif +#else + diff = L_sub(tmp32, 0x9CCCD); /* 0x9CCCD -> (28/20)*(7) in Q16 */ +#endif + if (diff < 0) + { + if (iszero == 0) + { +#ifdef FIX_BOTH_1p25_TEST_NEW_GG_EST2 +#ifdef FIX_BASOP_1p25_NEW_GG_EST3 + ener = L_add_sat(ener, L_dB_scale_offset3); /* 0x3C7AE -> (28/20)*(2.7or 3.5) in Q16 */ +#endif +#else + ener = L_add_sat(ener, 0x3C7AE); /* 0x3C7AE -> (28/20)*(2.7) in Q16 */ +#endif + } + } + else + { + ener = L_add_sat(ener, tmp32); + iszero = 0; move16(); +#ifdef FIX_BOTH_1p25_TEST_NEW_GG_EST2 +#ifdef FIX_BASOP_1p25_NEW_GG_EST3 + diff2 = L_sub(tmp32, L_dB_scale_offset2); /* 0x460000 -> (28/20)*(50or25) in Q16 */ +#endif +#else + diff2 = L_sub(tmp32, 0x460000); /* 0x460000 -> (28/20)*(50) in Q16 */ +#endif + if (diff2 >= 0) + { + ener = L_add_sat(ener, diff2); + } + } + + } + + /* if ener is above target -> increase offset */ + test(); + if (L_sub(ener, target) > 0 && iszero == 0) + { + offset = L_add(offset, fac); + } + } /* legacy 1-8 iter loop , FOR */ +#ifdef FIX_1p25_FLEX_BISECT_LOOP + } /* 1p25, non 1p25*/ +#endif + tmp16 = extract_h(offset); + } + + if (sub(tmp16, *quantizedGainMin) < 0) + { + *old_targetBits = -1; move16(); + } + *quantizedGain = sub(s_max(*quantizedGainMin, tmp16), quantizedGainOff); move16(); + } + +#ifdef ENABLE_HR_MODE + tmp32 = Mpy_32_16_lc3plus(0x797CD707, L_shl_pos(add(*quantizedGain, quantizedGainOff), 6)); +#else + tmp32 = L_shl_pos(L_mult0(add(*quantizedGain, quantizedGainOff), 0x797D), 7); /* 6Q25; 0x797D -> log2(10)/28 (Q18) */ +#endif + *gain_e = add(extract_l(L_shr_pos(tmp32, 25)), 1); /* get exponent */ +#ifdef ENABLE_HR_MODE + *gain = BASOP_Util_InvLog2(L_or(tmp32, (Word32)0xFE000000)); +#else + *gain = round_fx(BASOP_Util_InvLog2(L_or(tmp32,(Word32) 0xFE000000))); +#endif + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + diff --git a/lib_lc3plus/fft_lc3plus.c b/lib_lc3plus/fft_lc3plus.c new file mode 100644 index 0000000000000000000000000000000000000000..1f727bcd4563b7cf8cdbef1c8b9b99e00ee945c7 --- /dev/null +++ b/lib_lc3plus/fft_lc3plus.c @@ -0,0 +1,4379 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" +#include "rom_basop_util_lc3plus.h" + +#ifdef ENABLE_FFT_RESCALE +#ifndef FFT_RESCALE_HR +#define FFT_RESCALE_HR 3 +#endif +#endif + +#define SCALEFACTORN2 3 +#define SCALEFACTOR4 3 +#define SCALEFACTOR5 4 +#define SCALEFACTOR8 4 +#define SCALEFACTOR15 5 +#define SCALEFACTOR30_1 5 +#define SCALEFACTOR30_2 1 +#define SCALEFACTOR32_1 5 +#define SCALEFACTOR32_2 1 + +#ifdef ENABLE_HR_MODE +#define Mpy_32_xx Mpy_32_32 +#else +#define Mpy_32_xx Mpy_32_16 +#endif + +#define SCALEFACTOR6 4 +#define C61_32 (0x6ed9eba1) + +#define SCALEFACTOR10 5 +#define SCALEFACTOR16 5 +#define SCALEFACTOR20 5 +#define SCALEFACTOR30 6 +#define SCALEFACTOR32 6 +#define SCALEFACTOR40 7 +#define SCALEFACTOR48 8 +#define SCALEFACTOR60 7 +#define SCALEFACTOR64 7 +#define SCALEFACTOR80 8 +#define SCALEFACTOR90 9 +#define SCALEFACTOR96 9 +#define SCALEFACTOR120 8 +#define SCALEFACTOR128 8 +#define SCALEFACTOR160 8 +#define SCALEFACTOR180 10 +#define SCALEFACTOR192 10 +#define SCALEFACTOR240 9 +#define SCALEFACTOR256 9 +#define SCALEFACTOR384 11 + +#ifdef ENABLE_HR_MODE +#define SCALEFACTOR360 11 +#ifndef ENABLE_FFT_30X16 +#define SCALEFACTOR480 10 +#else +#define SCALEFACTOR480 11 +#endif +#endif + +#ifdef ENABLE_HR_MODE +#undef L_shr_pos +#define L_shr_pos(x, y) (L_shr(L_add(L_shr((x), ((y)-1)),1),1)) +#endif + +#ifdef ENABLE_HR_MODE +#define FFTC(x) ((Word32)x) +#else +#define FFTC(x) WORD322WORD16((Word32)x) +#endif + +#define C31 (FFTC(0x91261468)) /* FL2WORD32( -0.86602540) -sqrt(3)/2 */ + +#define C51 (FFTC(0x79bc3854)) /* FL2WORD32( 0.95105652) */ +#define C52 (FFTC(0x9d839db0)) /* FL2WORD32(-1.53884180/2) */ +#define C53 (FFTC(0xd18053ce)) /* FL2WORD32(-0.36327126) */ +#define C54 (FFTC(0x478dde64)) /* FL2WORD32( 0.55901699) */ +#define C55 (FFTC(0xb0000001)) /* FL2WORD32(-1.25/2) */ + +#define C81 (FFTC(0x5a82799a)) /* FL2WORD32( 7.071067811865475e-1) */ +#define C82 (FFTC(0xa57d8666)) /* FL2WORD32(-7.071067811865475e-1) */ + +#define C161 (FFTC(0x5a82799a)) /* FL2WORD32( 7.071067811865475e-1) INV_SQRT2 */ +#define C162 (FFTC(0xa57d8666)) /* FL2WORD32(-7.071067811865475e-1) -INV_SQRT2 */ + +#define C163 (FFTC(0x7641af3d)) /* FL2WORD32( 9.238795325112867e-1) COS_PI_DIV8 */ +#define C164 (FFTC(0x89be50c3)) /* FL2WORD32(-9.238795325112867e-1) -COS_PI_DIV8 */ + +#define C165 (FFTC(0x30fbc54d)) /* FL2WORD32( 3.826834323650898e-1) COS_3PI_DIV8 */ +#define C166 (FFTC(0xcf043ab3)) /* FL2WORD32(-3.826834323650898e-1) -COS_3PI_DIV8 */ + +#define C51_32 (0x79bc3854) /* FL2WORD32( 0.95105652) */ +#define C52_32 (0x9d839db0) /* FL2WORD32(-1.53884180/2) */ +#define C53_32 (0xd18053ce) /* FL2WORD32(-0.36327126) */ +#define C54_32 (0x478dde64) /* FL2WORD32( 0.55901699) */ +#define C55_32 (0xb0000001) /* FL2WORD32(-1.25/2) */ + + +#define C81_32 (0x5a82799a) /* FL2WORD32( 7.071067811865475e-1) */ +#define C82_32 (0xa57d8666) /* FL2WORD32(-7.071067811865475e-1) */ + +#if defined(ENABLE_HR_MODE) + +#define cplxMpy4_16_0(re, im, a, b, c, d) \ + do \ + { \ + re = L_sub(Mpy_32_xx(a, c), Mpy_32_xx(b, d)); \ + move32(); \ + im = L_add(Mpy_32_xx(a, d), Mpy_32_xx(b, c)); \ + move32(); \ + } while (0) + +#define cplxMpy4_16_1(re, im, a, b) \ + do \ + { \ + re = a; \ + move32(); \ + im = b; \ + move32(); \ + } while (0) + +#endif + +#define Mpy3_0(s12, s13, s14, s15, t0, t1, t2, t3) \ + do \ + { \ + s12 = Mpy_32_32_lc3plus(L_add(t0, t2), C81_32); \ + s14 = Mpy_32_32_lc3plus(L_sub(t0, t2), C81_32); \ + s13 = Mpy_32_32_lc3plus(L_sub(t3, t1), C81_32); \ + s15 = Mpy_32_32_lc3plus(L_add(t1, t3), C82_32); \ + } while (0) + +#define cplxMpy3_0(a, b, c, d) \ + do \ + { \ + as = L_shr_pos(a, 1); \ + bs = L_shr_pos(b, 1); \ + a = L_sub(Mpy_32_32_lc3plus(as, c), Mpy_32_32_lc3plus(bs, d)); \ + b = L_add(Mpy_32_32_lc3plus(as, d), Mpy_32_32_lc3plus(bs, c)); \ + } while (0) + +#ifdef ENABLE_HR_MODE +#define cplxMpy4_4_0(re, im, a, b, c, d) \ + re = L_shr_pos(L_sub(Mpy_32_xx(a, c), Mpy_32_xx(b, d)), SCALEFACTOR60 - SCALEFACTOR15); \ + im = L_shr_pos(L_add(Mpy_32_xx(a, d), Mpy_32_xx(b, c)), SCALEFACTOR60 - SCALEFACTOR15); + +#define cplxMpy4_4_1(re, im, a, b) \ + re = L_shr_pos(a, SCALEFACTOR60 - SCALEFACTOR15); \ + im = L_shr_pos(b, SCALEFACTOR60 - SCALEFACTOR15); +#else +#define cplxMpy4_4_0(re, im, a, b, c, d) \ + re = L_shr(L_sub(Mpy_32_xx(a, c), Mpy_32_xx(b, d)), SCALEFACTOR60 - SCALEFACTOR15); \ + im = L_shr(L_add(Mpy_32_xx(a, d), Mpy_32_xx(b, c)), SCALEFACTOR60 - SCALEFACTOR15); + +#define cplxMpy4_4_1(re, im, a, b) \ + re = L_shr(a, SCALEFACTOR60 - SCALEFACTOR15); \ + im = L_shr(b, SCALEFACTOR60 - SCALEFACTOR15); +#endif + +#define cplxMpy4_8_0(re, im, a, b, c, d) \ + do \ + { \ + re = L_shr_pos(L_sub(Mpy_32_xx(a, c), Mpy_32_xx(b, d)), 1); \ + im = L_shr_pos(L_add(Mpy_32_xx(a, d), Mpy_32_xx(b, c)), 1); \ + } while (0) + + +#define cplxMpy4_8_1(re, im, a, b) \ + do \ + { \ + re = L_shr_pos(a, 1); \ + im = L_shr_pos(b, 1); \ + } while (0) + + +#define cplxMpy4_8_2(re, im, a, b, c, d) \ + do \ + { \ + re = L_shr_pos(L_add(Mpy_32_32_lc3plus(a, c), Mpy_32_32_lc3plus(b, d)), 1); \ + im = L_shr_pos(L_sub(Mpy_32_32_lc3plus(b, c), Mpy_32_32_lc3plus(a, d)), 1); \ + } while (0) + + +#define cplxMpy4_12_0(re, im, a, b, c, d) \ + do \ + { \ + re = L_sub(Mpy_32_xx(a, c), Mpy_32_xx(b, d)); \ + move32(); \ + im = L_add(Mpy_32_xx(a, d), Mpy_32_xx(b, c)); \ + move32(); \ + } while (0) + +#define cplxMpy4_12_1(re, im, a, b) \ + do \ + { \ + re = a; \ + move32(); \ + im = b; \ + move32(); \ + } while (0) + + +static void fft4(Word32 *x) +{ + Dyn_Mem_Deluxe_In(Word32 x0, x1, x2, x3, x4, x5, x6, x7; Word32 t0, t1, t2, t3, t4, t5, t6, t7;); + + x0 = L_shr_pos(x[0], SCALEFACTOR4); + x1 = L_shr_pos(x[1], SCALEFACTOR4); + x2 = L_shr_pos(x[2], SCALEFACTOR4); + x3 = L_shr_pos(x[3], SCALEFACTOR4); + x4 = L_shr_pos(x[4], SCALEFACTOR4); + x5 = L_shr_pos(x[5], SCALEFACTOR4); + x6 = L_shr_pos(x[6], SCALEFACTOR4); + x7 = L_shr_pos(x[7], SCALEFACTOR4); + + /* Pre-additions */ + t0 = L_add(x0, x4); + t2 = L_sub(x0, x4); + t1 = L_add(x1, x5); + t3 = L_sub(x1, x5); + t4 = L_add(x2, x6); + t7 = L_sub(x2, x6); + t5 = L_add(x7, x3); + t6 = L_sub(x7, x3); + + /* Post-additions */ + x[0] = L_add(t0, t4); + x[1] = L_add(t1, t5); + x[2] = L_sub(t2, t6); + x[3] = L_sub(t3, t7); + x[4] = L_sub(t0, t4); + x[5] = L_sub(t1, t5); + x[6] = L_add(t2, t6); + x[7] = L_add(t3, t7); + + Dyn_Mem_Deluxe_Out(); +} + +/** + * \brief Function performs a complex 5-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR5 bits. + * + * + * \param [i/o] re real input / output + * \param [i/o] im imag input / output + * \param [i ] s stride real and imag input / output + * + * \return void + */ + + + +static void fft5(Word32 *re, Word32 *im, Word16 s) +{ + Dyn_Mem_Deluxe_In(Word32 x0, x1, x2, x3, x4; Word32 r1, r2, r3, r4; Word32 s1, s2, s3, s4; Word32 t;); + + /* real part */ + x0 = L_shr_pos(re[s * 0], SCALEFACTOR5); + x1 = L_shr_pos(re[s * 1], SCALEFACTOR5); + x2 = L_shr_pos(re[s * 2], SCALEFACTOR5); + x3 = L_shr_pos(re[s * 3], SCALEFACTOR5); + x4 = L_shr_pos(re[s * 4], SCALEFACTOR5); + + r1 = L_add(x1, x4); + r4 = L_sub(x1, x4); + r3 = L_add(x2, x3); + r2 = L_sub(x2, x3); + t = Mpy_32_32_lc3plus(L_sub(r1, r3), C54_32); + r1 = L_add(r1, r3); + re[0] = L_add(x0, r1); + move32(); + /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of + the values as fracts */ + r1 = L_add(re[0], (L_shl_pos(Mpy_32_32_lc3plus(r1, C55_32), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_32_lc3plus(L_add(r4, r2), C51_32); + /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of + the values as fracts */ + r4 = L_add(t, L_shl_pos(Mpy_32_32_lc3plus(r4, C52_32), 1)); + r2 = L_add(t, Mpy_32_32_lc3plus(r2, C53_32)); + + /* imaginary part */ + x0 = L_shr_pos(im[s * 0], SCALEFACTOR5); + x1 = L_shr_pos(im[s * 1], SCALEFACTOR5); + x2 = L_shr_pos(im[s * 2], SCALEFACTOR5); + x3 = L_shr_pos(im[s * 3], SCALEFACTOR5); + x4 = L_shr_pos(im[s * 4], SCALEFACTOR5); + + s1 = L_add(x1, x4); + s4 = L_sub(x1, x4); + s3 = L_add(x2, x3); + s2 = L_sub(x2, x3); + t = Mpy_32_32_lc3plus(L_sub(s1, s3), C54_32); + s1 = L_add(s1, s3); + im[0] = L_add(x0, s1); + move32(); + /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of + the values as fracts */ + s1 = L_add(im[0], L_shl_pos(Mpy_32_32_lc3plus(s1, C55_32), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_32_lc3plus(L_add(s4, s2), C51_32); + /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of + the values as fracts */ + s4 = L_add(t, L_shl_pos(Mpy_32_32_lc3plus(s4, C52_32), 1)); + s2 = L_add(t, Mpy_32_32_lc3plus(s2, C53_32)); + + /* combination */ + re[s * 1] = L_add(r1, s2); + move32(); + re[s * 4] = L_sub(r1, s2); + move32(); + re[s * 2] = L_sub(r3, s4); + move32(); + re[s * 3] = L_add(r3, s4); + move32(); + + im[s * 1] = L_sub(s1, r2); + move32(); + im[s * 4] = L_add(s1, r2); + move32(); + im[s * 2] = L_add(s3, r4); + move32(); + im[s * 3] = L_sub(s3, r4); + move32(); + + Dyn_Mem_Deluxe_Out(); +} + +/** + * \brief Function performs a complex 6-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR6 bits. + * + * + * \param [i/o] re real input / output + * \param [i/o] im imag input / output + * \param [i ] st stride real and imag input / output + * + * \return void + */ + +static void fft6(Word32 *re, Word32 *im, Word16 st) +{ + Dyn_Mem_Deluxe_In(Word32 x0, x1, x2, x3, x4, x5; Word32 r1o, r2o, i1e, i2e, i1o, i2o; Word32 t, s;); + + /* process real parts */ + + x0 = L_shr_pos(re[0 * st], SCALEFACTOR6); + x1 = L_shr_pos(re[1 * st], SCALEFACTOR6); + x2 = L_shr_pos(re[2 * st], SCALEFACTOR6); + x3 = L_shr_pos(re[3 * st], SCALEFACTOR6); + x4 = L_shr_pos(re[4 * st], SCALEFACTOR6); + x5 = L_shr_pos(re[5 * st], SCALEFACTOR6); + + t = L_add(x0, L_add(x2, x4)); + s = L_add(x1, L_add(x3, x5)); + re[0 * st] = L_add(t, s); + move32(); + re[3 * st] = L_sub(t, s); + move32(); + t = L_sub(x0, L_shr_pos(L_add(x2, x4), 1)); + + re[1 * st] = t; + move32(); + re[2 * st] = t; + move32(); + re[4 * st] = t; + move32(); + re[5 * st] = t; + move32(); + + s = Mpy_32_32_lc3plus(L_sub(x4, x2), C61_32); + + i1e = s; + i2e = -s; + + t = L_sub(x1, L_shr_pos(L_add(x3, x5), 1)); + s = Mpy_32_32_lc3plus(L_sub(x5, x3), C61_32); + + r1o = r2o = t; + i1o = s; + i2o = -s; + + x0 = L_shr_pos(im[0 * st], SCALEFACTOR6); + x1 = L_shr_pos(im[1 * st], SCALEFACTOR6); + x2 = L_shr_pos(im[2 * st], SCALEFACTOR6); + x3 = L_shr_pos(im[3 * st], SCALEFACTOR6); + x4 = L_shr_pos(im[4 * st], SCALEFACTOR6); + x5 = L_shr_pos(im[5 * st], SCALEFACTOR6); + + t = L_add(x0, L_add(x2, x4)); + s = L_add(x1, L_add(x3, x5)); + + im[0 * st] = L_add(t, s); + move32(); + im[3 * st] = L_sub(t, s); + move32(); + + t = Mpy_32_32_lc3plus(L_sub(x2, x4), C61_32); + s = L_sub(x0, L_shr_pos(L_add(x2, x4), 1)); + + re[1 * st] = L_add(re[1 * st], t); + move32(); + re[2 * st] = L_sub(re[2 * st], t); + move32(); + re[4 * st] = L_add(re[4 * st], t); + move32(); + re[5 * st] = L_sub(re[5 * st], t); + move32(); + + i1e = L_add(i1e, s); + i2e = L_add(i2e, s); + + t = Mpy_32_32_lc3plus(L_sub(x3, x5), C61_32); + s = L_sub(x1, L_shr_pos(L_add(x5, x3), 1)); + + r1o = L_add(r1o, t); + r2o = L_sub(r2o, t); + + i1o = L_add(i1o, s); + i2o = L_add(i2o, s); + + t = L_add(L_shr_pos(r1o, 1), Mpy_32_32_lc3plus(i1o, C61_32)); + s = L_sub(L_shr_pos(i1o, 1), Mpy_32_32_lc3plus(r1o, C61_32)); + + re[1 * st] = L_add(re[1 * st], t); + move32(); + im[1 * st] = L_add(i1e, s); + move32(); + + re[4 * st] = L_sub(re[4 * st], t); + move32(); + im[4 * st] = L_sub(i1e, s); + move32(); + + t = L_sub(Mpy_32_32_lc3plus(i2o, C61_32), L_shr_pos(r2o, 1)); + s = L_negate(L_add(Mpy_32_32_lc3plus(r2o, C61_32), L_shr_pos(i2o, 1))); + + re[2 * st] = L_add(re[2 * st], t); + move32(); + im[2 * st] = L_add(i2e, s); + move32(); + + re[5 * st] = L_sub(re[5 * st], t); + move32(); + im[5 * st] = L_sub(i2e, s); + move32(); + + Dyn_Mem_Deluxe_Out(); +} + +/** + * \brief Function performs a complex 8-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR8 bits. + * + * WOPS with 32x16 bit multiplications: 108 cycles + * + * \param [i/o] re real input / output + * \param [i/o] im imag input / output + * \param [i ] s stride real and imag input / output + * + * \return void + */ + + +static void fft8(Word32 *re, Word32 *im, Word16 s) +{ + Dyn_Mem_Deluxe_In(Word32 x00, x01, x02, x03, x04, x05, x06, x07; Word32 x08, x09, x10, x11, x12, x13, x14, x15; + Word32 t00, t01, t02, t03, t04, t05, t06, t07; Word32 t08, t09, t10, t11, t12, t13, t14, t15; + Word32 s00, s01, s02, s03, s04, s05, s06, s07; Word32 s08, s09, s10, s11, s12, s13, s14, s15;); + + /* Pre-additions */ + + x00 = L_shr_pos(re[s * 0], SCALEFACTOR8); + x01 = L_shr_pos(im[s * 0], SCALEFACTOR8); + x02 = L_shr_pos(re[s * 1], SCALEFACTOR8); + x03 = L_shr_pos(im[s * 1], SCALEFACTOR8); + x04 = L_shr_pos(re[s * 2], SCALEFACTOR8); + x05 = L_shr_pos(im[s * 2], SCALEFACTOR8); + x06 = L_shr_pos(re[s * 3], SCALEFACTOR8); + x07 = L_shr_pos(im[s * 3], SCALEFACTOR8); + x08 = L_shr_pos(re[s * 4], SCALEFACTOR8); + x09 = L_shr_pos(im[s * 4], SCALEFACTOR8); + x10 = L_shr_pos(re[s * 5], SCALEFACTOR8); + x11 = L_shr_pos(im[s * 5], SCALEFACTOR8); + x12 = L_shr_pos(re[s * 6], SCALEFACTOR8); + x13 = L_shr_pos(im[s * 6], SCALEFACTOR8); + x14 = L_shr_pos(re[s * 7], SCALEFACTOR8); + x15 = L_shr_pos(im[s * 7], SCALEFACTOR8); + + t00 = L_add(x00, x08); + t02 = L_sub(x00, x08); + t01 = L_add(x01, x09); + t03 = L_sub(x01, x09); + t04 = L_add(x02, x10); + t06 = L_sub(x02, x10); + t05 = L_add(x03, x11); + t07 = L_sub(x03, x11); + t08 = L_add(x04, x12); + t10 = L_sub(x04, x12); + t09 = L_add(x05, x13); + t11 = L_sub(x05, x13); + t12 = L_add(x06, x14); + t14 = L_sub(x06, x14); + t13 = L_add(x07, x15); + t15 = L_sub(x07, x15); + + /* Pre-additions and core multiplications */ + + s00 = L_add(t00, t08); + s04 = L_sub(t00, t08); + s01 = L_add(t01, t09); + s05 = L_sub(t01, t09); + s08 = L_sub(t02, t11); + s10 = L_add(t02, t11); + s09 = L_add(t03, t10); + s11 = L_sub(t03, t10); + s02 = L_add(t04, t12); + s07 = L_sub(t04, t12); + s03 = L_add(t05, t13); + s06 = L_sub(t13, t05); + + t01 = L_add(t06, t14); + t02 = L_sub(t06, t14); + t00 = L_add(t07, t15); + t03 = L_sub(t07, t15); + + s12 = Mpy_32_xx(L_add(t00, t02), C81); + s14 = Mpy_32_xx(L_sub(t00, t02), C81); + s13 = Mpy_32_xx(L_sub(t03, t01), C81); + s15 = Mpy_32_xx(L_add(t01, t03), C82); + + /* Post-additions */ + + re[s * 0] = L_add(s00, s02); + move32(); + re[s * 4] = L_sub(s00, s02); + move32(); + im[s * 0] = L_add(s01, s03); + move32(); + im[s * 4] = L_sub(s01, s03); + move32(); + re[s * 2] = L_sub(s04, s06); + move32(); + re[s * 6] = L_add(s04, s06); + move32(); + im[s * 2] = L_sub(s05, s07); + move32(); + im[s * 6] = L_add(s05, s07); + move32(); + re[s * 3] = L_add(s08, s14); + move32(); + re[s * 7] = L_sub(s08, s14); + move32(); + im[s * 3] = L_add(s09, s15); + move32(); + im[s * 7] = L_sub(s09, s15); + move32(); + re[s * 1] = L_add(s10, s12); + move32(); + re[s * 5] = L_sub(s10, s12); + move32(); + im[s * 1] = L_add(s11, s13); + move32(); + im[s * 5] = L_sub(s11, s13); + move32(); + + Dyn_Mem_Deluxe_Out(); +} + +/** + * \brief Function performs a complex 10-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR10 bits. + * + * WOPS with 32x16 bit multiplications: 196 cycles + * + * \param [i/o] re real input / output + * \param [i/o] im imag input / output + * \param [i ] s stride real and imag input / output + * + * \return void + */ + + + +static void fft10(Word32 *re, Word32 *im, Word16 s) +{ + Dyn_Mem_Deluxe_In(Word32 t; Word32 x0, x1, x2, x3, x4; Word32 r1, r2, r3, r4; Word32 s1, s2, s3, s4; + Word32 y00, y01, y02, y03, y04, y05, y06, y07, y08, y09; + Word32 y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;); + + /* 2 fft5 stages */ + + /* real part */ + x0 = L_shr_pos(re[s * 0], SCALEFACTOR10); + x1 = L_shr_pos(re[s * 2], SCALEFACTOR10); + x2 = L_shr_pos(re[s * 4], SCALEFACTOR10); + x3 = L_shr_pos(re[s * 6], SCALEFACTOR10); + x4 = L_shr_pos(re[s * 8], SCALEFACTOR10); + + r1 = L_add(x3, x2); + r4 = L_sub(x3, x2); + r3 = L_add(x1, x4); + r2 = L_sub(x1, x4); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y00 = L_add(x0, r1); + r1 = L_add(y00, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + x0 = L_shr_pos(im[s * 0], SCALEFACTOR10); + x1 = L_shr_pos(im[s * 2], SCALEFACTOR10); + x2 = L_shr_pos(im[s * 4], SCALEFACTOR10); + x3 = L_shr_pos(im[s * 6], SCALEFACTOR10); + x4 = L_shr_pos(im[s * 8], SCALEFACTOR10); + + s1 = L_add(x3, x2); + s4 = L_sub(x3, x2); + s3 = L_add(x1, x4); + s2 = L_sub(x1, x4); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y01 = L_add(x0, s1); + s1 = L_add(y01, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y04 = L_add(r1, s2); + y16 = L_sub(r1, s2); + y08 = L_sub(r3, s4); + y12 = L_add(r3, s4); + + y05 = L_sub(s1, r2); + y17 = L_add(s1, r2); + y09 = L_add(s3, r4); + y13 = L_sub(s3, r4); + + /* real part */ + x0 = L_shr_pos(re[s * 5], SCALEFACTOR10); + x1 = L_shr_pos(re[s * 1], SCALEFACTOR10); + x2 = L_shr_pos(re[s * 3], SCALEFACTOR10); + x3 = L_shr_pos(re[s * 7], SCALEFACTOR10); + x4 = L_shr_pos(re[s * 9], SCALEFACTOR10); + + r1 = L_add(x1, x4); + r4 = L_sub(x1, x4); + r3 = L_add(x3, x2); + r2 = L_sub(x3, x2); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y02 = L_add(x0, r1); + r1 = L_add(y02, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + x0 = L_shr_pos(im[s * 5], SCALEFACTOR10); + x1 = L_shr_pos(im[s * 1], SCALEFACTOR10); + x2 = L_shr_pos(im[s * 3], SCALEFACTOR10); + x3 = L_shr_pos(im[s * 7], SCALEFACTOR10); + x4 = L_shr_pos(im[s * 9], SCALEFACTOR10); + + s1 = L_add(x1, x4); + s4 = L_sub(x1, x4); + s3 = L_add(x3, x2); + s2 = L_sub(x3, x2); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y03 = L_add(x0, s1); + s1 = L_add(y03, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y06 = L_add(r1, s2); + y18 = L_sub(r1, s2); + y10 = L_sub(r3, s4); + y14 = L_add(r3, s4); + + y07 = L_sub(s1, r2); + y19 = L_add(s1, r2); + y11 = L_add(s3, r4); + y15 = L_sub(s3, r4); + + /* 5 fft2 stages */ + re[s * 0] = L_add(y00, y02); + move32(); + im[s * 0] = L_add(y01, y03); + move32(); + re[s * 5] = L_sub(y00, y02); + move32(); + im[s * 5] = L_sub(y01, y03); + move32(); + + re[s * 2] = L_add(y04, y06); + move32(); + im[s * 2] = L_add(y05, y07); + move32(); + re[s * 7] = L_sub(y04, y06); + move32(); + im[s * 7] = L_sub(y05, y07); + move32(); + + re[s * 4] = L_add(y08, y10); + move32(); + im[s * 4] = L_add(y09, y11); + move32(); + re[s * 9] = L_sub(y08, y10); + move32(); + im[s * 9] = L_sub(y09, y11); + move32(); + + re[s * 6] = L_add(y12, y14); + move32(); + im[s * 6] = L_add(y13, y15); + move32(); + re[s * 1] = L_sub(y12, y14); + move32(); + im[s * 1] = L_sub(y13, y15); + move32(); + + re[s * 8] = L_add(y16, y18); + move32(); + im[s * 8] = L_add(y17, y19); + move32(); + re[s * 3] = L_sub(y16, y18); + move32(); + im[s * 3] = L_sub(y17, y19); + move32(); + + Dyn_Mem_Deluxe_Out(); +} + +/** + * \brief Function performs a complex 15-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR15 bits. + * + * WOPS with 32x16 bit multiplications: 354 cycles + * + * \param [i/o] re real input / output + * \param [i/o] im imag input / output + * \param [i ] s stride real and imag input / output + * + * \return void + */ + + +static void fft15(Word32 *re, Word32 *im, Word16 s) +{ + Dyn_Mem_Deluxe_In(Word32 t; Word32 r1, r2, r3, r4; Word32 s1, s2, s3, s4; + Word32 x00, x01, x02, x03, x04, x05, x06, x07, x08, x09; + Word32 x10, x11, x12, x13, x14, x15, x16, x17, x18, x19; + Word32 x20, x21, x22, x23, x24, x25, x26, x27, x28, x29; + Word32 y00, y01, y02, y03, y04, y05, y06, y07, y08, y09; + Word32 y10, y11, y12, y13, y14, y15, y16, y17, y18, y19; + Word32 y20, y21, y22, y23, y24, y25, y26, y27, y28, y29;); + + x00 = L_shr_pos(re[s * 0], SCALEFACTOR15); + x01 = L_shr_pos(im[s * 0], SCALEFACTOR15); + x02 = L_shr_pos(re[s * 3], SCALEFACTOR15); + x03 = L_shr_pos(im[s * 3], SCALEFACTOR15); + x04 = L_shr_pos(re[s * 6], SCALEFACTOR15); + x05 = L_shr_pos(im[s * 6], SCALEFACTOR15); + x06 = L_shr_pos(re[s * 9], SCALEFACTOR15); + x07 = L_shr_pos(im[s * 9], SCALEFACTOR15); + x08 = L_shr_pos(re[s * 12], SCALEFACTOR15); + x09 = L_shr_pos(im[s * 12], SCALEFACTOR15); + + x10 = L_shr_pos(re[s * 5], SCALEFACTOR15); + x11 = L_shr_pos(im[s * 5], SCALEFACTOR15); + x12 = L_shr_pos(re[s * 8], SCALEFACTOR15); + x13 = L_shr_pos(im[s * 8], SCALEFACTOR15); + x14 = L_shr_pos(re[s * 11], SCALEFACTOR15); + x15 = L_shr_pos(im[s * 11], SCALEFACTOR15); + x16 = L_shr_pos(re[s * 14], SCALEFACTOR15); + x17 = L_shr_pos(im[s * 14], SCALEFACTOR15); + x18 = L_shr_pos(re[s * 2], SCALEFACTOR15); + x19 = L_shr_pos(im[s * 2], SCALEFACTOR15); + + x20 = L_shr_pos(re[s * 10], SCALEFACTOR15); + x21 = L_shr_pos(im[s * 10], SCALEFACTOR15); + x22 = L_shr_pos(re[s * 13], SCALEFACTOR15); + x23 = L_shr_pos(im[s * 13], SCALEFACTOR15); + x24 = L_shr_pos(re[s * 1], SCALEFACTOR15); + x25 = L_shr_pos(im[s * 1], SCALEFACTOR15); + x26 = L_shr_pos(re[s * 4], SCALEFACTOR15); + x27 = L_shr_pos(im[s * 4], SCALEFACTOR15); + x28 = L_shr_pos(re[s * 7], SCALEFACTOR15); + x29 = L_shr_pos(im[s * 7], SCALEFACTOR15); + + /* 1. FFT5 stage */ + + /* real part */ + r1 = L_add(x02, x08); + r4 = L_sub(x02, x08); + r3 = L_add(x04, x06); + r2 = L_sub(x04, x06); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y00 = L_add(x00, r1); + r1 = L_add(y00, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + s1 = L_add(x03, x09); + s4 = L_sub(x03, x09); + s3 = L_add(x05, x07); + s2 = L_sub(x05, x07); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y01 = L_add(x01, s1); + s1 = L_add(y01, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y02 = L_add(r1, s2); + y08 = L_sub(r1, s2); + y04 = L_sub(r3, s4); + y06 = L_add(r3, s4); + + y03 = L_sub(s1, r2); + y09 = L_add(s1, r2); + y05 = L_add(s3, r4); + y07 = L_sub(s3, r4); + + /* 2. FFT5 stage */ + + /* real part */ + r1 = L_add(x12, x18); + r4 = L_sub(x12, x18); + r3 = L_add(x14, x16); + r2 = L_sub(x14, x16); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y10 = L_add(x10, r1); + r1 = L_add(y10, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + s1 = L_add(x13, x19); + s4 = L_sub(x13, x19); + s3 = L_add(x15, x17); + s2 = L_sub(x15, x17); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y11 = L_add(x11, s1); + s1 = L_add(y11, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y12 = L_add(r1, s2); + y18 = L_sub(r1, s2); + y14 = L_sub(r3, s4); + y16 = L_add(r3, s4); + + y13 = L_sub(s1, r2); + y19 = L_add(s1, r2); + y15 = L_add(s3, r4); + y17 = L_sub(s3, r4); + + /* 3. FFT5 stage */ + + /* real part */ + r1 = L_add(x22, x28); + r4 = L_sub(x22, x28); + r3 = L_add(x24, x26); + r2 = L_sub(x24, x26); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y20 = L_add(x20, r1); + r1 = L_add(y20, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + s1 = L_add(x23, x29); + s4 = L_sub(x23, x29); + s3 = L_add(x25, x27); + s2 = L_sub(x25, x27); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y21 = L_add(x21, s1); + s1 = L_add(y21, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y22 = L_add(r1, s2); + y28 = L_sub(r1, s2); + y24 = L_sub(r3, s4); + y26 = L_add(r3, s4); + + y23 = L_sub(s1, r2); + y29 = L_add(s1, r2); + y25 = L_add(s3, r4); + y27 = L_sub(s3, r4); + + /* 1. FFT3 stage */ + + /* real part */ + r1 = L_add(y10, y20); + r2 = Mpy_32_xx(L_sub(y10, y20), C31); + re[s * 0] = L_add(y00, r1); + move32(); + r1 = L_sub(y00, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y11, y21); + s2 = Mpy_32_xx(L_sub(y11, y21), C31); + im[s * 0] = L_add(y01, s1); + move32(); + s1 = L_sub(y01, L_shr_pos(s1, 1)); + + /* combination */ + re[s * 10] = L_sub(r1, s2); + move32(); + re[s * 5] = L_add(r1, s2); + move32(); + im[s * 10] = L_add(s1, r2); + move32(); + im[s * 5] = L_sub(s1, r2); + move32(); + + /* 2. FFT3 stage */ + + /* real part */ + r1 = L_add(y12, y22); + r2 = Mpy_32_xx(L_sub(y12, y22), C31); + re[s * 6] = L_add(y02, r1); + move32(); + r1 = L_sub(y02, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y13, y23); + s2 = Mpy_32_xx(L_sub(y13, y23), C31); + im[s * 6] = L_add(y03, s1); + move32(); + s1 = L_sub(y03, L_shr_pos(s1, 1)); + + /* combination */ + re[s * 1] = L_sub(r1, s2); + move32(); + re[s * 11] = L_add(r1, s2); + move32(); + im[s * 1] = L_add(s1, r2); + move32(); + im[s * 11] = L_sub(s1, r2); + move32(); + + /* 3. FFT3 stage */ + + /* real part */ + r1 = L_add(y14, y24); + r2 = Mpy_32_xx(L_sub(y14, y24), C31); + re[s * 12] = L_add(y04, r1); + move32(); + r1 = L_sub(y04, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y15, y25); + s2 = Mpy_32_xx(L_sub(y15, y25), C31); + im[s * 12] = L_add(y05, s1); + move32(); + s1 = L_sub(y05, L_shr_pos(s1, 1)); + + /* combination */ + re[s * 7] = L_sub(r1, s2); + move32(); + re[s * 2] = L_add(r1, s2); + move32(); + im[s * 7] = L_add(s1, r2); + move32(); + im[s * 2] = L_sub(s1, r2); + move32(); + + /* 4. FFT3 stage */ + + /* real part */ + r1 = L_add(y16, y26); + r2 = Mpy_32_xx(L_sub(y16, y26), C31); + re[s * 3] = L_add(y06, r1); + move32(); + r1 = L_sub(y06, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y17, y27); + s2 = Mpy_32_xx(L_sub(y17, y27), C31); + im[s * 3] = L_add(y07, s1); + move32(); + s1 = L_sub(y07, L_shr_pos(s1, 1)); + + /* combination */ + re[s * 13] = L_sub(r1, s2); + move32(); + re[s * 8] = L_add(r1, s2); + move32(); + im[s * 13] = L_add(s1, r2); + move32(); + im[s * 8] = L_sub(s1, r2); + move32(); + + /* 5. FFT3 stage */ + + /* real part */ + r1 = L_add(y18, y28); + r2 = Mpy_32_xx(L_sub(y18, y28), C31); + re[s * 9] = L_add(y08, r1); + move32(); + r1 = L_sub(y08, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y19, y29); + s2 = Mpy_32_xx(L_sub(y19, y29), C31); + im[s * 9] = L_add(y09, s1); + move32(); + s1 = L_sub(y09, L_shr_pos(s1, 1)); + + /* combination */ + re[s * 4] = L_sub(r1, s2); + move32(); + re[s * 14] = L_add(r1, s2); + move32(); + im[s * 4] = L_add(s1, r2); + move32(); + im[s * 14] = L_sub(s1, r2); + move32(); + + Dyn_Mem_Deluxe_Out(); +} + +#define STC(x) (x) +const Word32 RotVectorReal12[] = +{ + STC(0x6ed9eba1), STC(0x40000000), + STC(0x40000000), STC(0xc0000000), +#ifndef FFT12_UNROLLED_ENABLE + STC(0x00000000), STC(0x80000000), +#endif +}; + +const Word32 RotVectorImag12[] = +{ + STC(0x40000000), STC(0x6ed9eba1), + STC(0x6ed9eba1), STC(0x6ed9eba1), +#ifndef FFT12_UNROLLED_ENABLE + STC(0x7fffffff), STC(0x00000000), +#endif +}; + +static void fft12(Word32 *pInput) +{ + Dyn_Mem_Deluxe_In(Word32 aDst[24]; Word32 * pSrc, *pDst; Counter i; Word32 r1, r2, s1, s2, pD; Word32 re, im; + Word32 vre, vim;); + + pSrc = pInput; + move16(); + pDst = aDst; + move16(); + + /* First 3*2 samples are shifted right by 2 before output */ + r1 = L_add(L_shr_pos(pSrc[8], 2), L_shr_pos(pSrc[16], 2)); + r2 = Mpy_32_xx(L_sub(L_shr_pos(pSrc[8], 2), L_shr_pos(pSrc[16], 2)), C31); + pD = L_shr_pos(pSrc[0], 2); + pDst[0] = L_shr_pos(L_add(pD, r1), 1); + r1 = L_sub(pD, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(L_shr_pos(pSrc[9], 2), L_shr_pos(pSrc[17], 2)); + s2 = Mpy_32_xx(L_sub(L_shr_pos(pSrc[9], 2), L_shr_pos(pSrc[17], 2)), C31); + pD = L_shr_pos(pSrc[1], 2); + pDst[1] = L_shr_pos(L_add(pD, s1), 1); + s1 = L_sub(pD, L_shr_pos(s1, 1)); + + r1 = L_shr_pos(r1, 1); + r2 = L_shr_pos(r2, 1); + s1 = L_shr_pos(s1, 1); + s2 = L_shr_pos(s2, 1); + + /* combination */ + pDst[2] = L_sub(r1, s2); + pDst[3] = L_add(s1, r2); + pDst[4] = L_add(r1, s2); + pDst[5] = L_sub(s1, r2); + pSrc += 2; + pDst += 6; + + const Word32 *pVecRe = RotVectorReal12; + const Word32 *pVecIm = RotVectorImag12; + + + + FOR (i = 0; i < 2; i++) + { + /* sample 0,1 are shifted right by 2 before output */ + /* sample 2,3 4,5 are shifted right by 1 and complex multiplied before output */ + + r1 = L_add(L_shr_pos(pSrc[8], 2), L_shr_pos(pSrc[16], 2)); + r2 = Mpy_32_xx(L_sub(L_shr_pos(pSrc[8], 2), L_shr_pos(pSrc[16], 2)), C31); + pD = L_shr_pos(pSrc[0], 2); + pDst[0] = L_shr_pos(L_add(pD, r1), 1); + r1 = L_sub(pD, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(L_shr_pos(pSrc[9], 2), L_shr_pos(pSrc[17], 2)); + s2 = Mpy_32_xx(L_sub(L_shr_pos(pSrc[9], 2), L_shr_pos(pSrc[17], 2)), C31); + pD = L_shr_pos(pSrc[1], 2); + pDst[1] = L_shr_pos(L_add(pD, s1), 1); + s1 = L_sub(pD, L_shr_pos(s1, 1)); + + r1 = L_shr_pos(r1, 1); + r2 = L_shr_pos(r2, 1); + s1 = L_shr_pos(s1, 1); + s2 = L_shr_pos(s2, 1); + + /* combination */ + re = L_sub(r1, s2); + im = L_add(s1, r2); + vre = *pVecRe++; + vim = *pVecIm++; + cplxMpy_32_32(&pDst[3], &pDst[2], im, re, vre, vim); + + re = L_add(r1, s2); + im = L_sub(s1, r2); + + vre = *pVecRe++; + vim = *pVecIm++; + cplxMpy_32_32(&pDst[5], &pDst[4], im, re, vre, vim); + + pDst += 6; + pSrc += 2; + } + /* sample 0,1 are shifted right by 2 before output */ + /* sample 2,3 is shifted right by 1 and complex multiplied with (0.0,+1.0) */ + /* sample 4,5 is shifted right by 1 and complex multiplied with (-1.0,0.0) */ + r1 = L_add(L_shr_pos(pSrc[8], 2), L_shr_pos(pSrc[16], 2)); + r2 = Mpy_32_xx(L_sub(L_shr_pos(pSrc[8], 2), L_shr_pos(pSrc[16], 2)), C31); + pD = L_shr_pos(pSrc[0], 2); + pDst[0] = L_shr_pos(L_add(pD, r1), 1); + r1 = L_sub(pD, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(L_shr_pos(pSrc[9], 2), L_shr_pos(pSrc[17], 2)); + s2 = Mpy_32_xx(L_sub(L_shr_pos(pSrc[9], 2), L_shr_pos(pSrc[17], 2)), C31); + pD = L_shr_pos(pSrc[1], 2); + pDst[1] = L_shr_pos(L_add(pD, s1), 1); + s1 = L_sub(pD, L_shr_pos(s1, 1)); + + r1 = L_shr_pos(r1, 1); + r2 = L_shr_pos(r2, 1); + s1 = L_shr_pos(s1, 1); + s2 = L_shr_pos(s2, 1); + + /* combination */ + + pDst[2] = L_add(s1, r2); + move32(); + pDst[3] = L_sub(s2, r1); + move32(); + pDst[4] = L_negate(L_add(r1, s2)); + move32(); + pDst[5] = L_sub(r2, s1); + move32(); + /* Perform 3 times the fft of length 4. The input samples are at the address of aDst and the + output samples are at the address of pInput. The input vector for the fft of length 4 is built + of the interleaved samples in aDst, the output samples are stored consecutively at the address + of pInput. + */ + move16(); + move16(); + pSrc = aDst; + pDst = pInput; + FOR (i = 0; i < 3; i++) + { + /* inline FFT4 merged with incoming resorting loop */ + r1 = L_add(L_shr_pos(pSrc[0], 2), L_shr_pos(pSrc[12], 2)); /* Re A + Re B */ + r2 = L_add(L_shr_pos(pSrc[6], 2), L_shr_pos(pSrc[18], 2)); /* Re C + Re D */ + s1 = L_add(L_shr_pos(pSrc[1], 2), L_shr_pos(pSrc[13], 2)); /* Im A + Im B */ + s2 = L_add(L_shr_pos(pSrc[7], 2), L_shr_pos(pSrc[19], 2)); /* Im C + Im D */ + + pDst[0] = L_add(r1, r2); /* Re A' = Re A + Re B + Re C + Re D */ + pDst[1] = L_add(s1, s2); /* Im A' = Im A + Im B + Im C + Im D */ + + re = L_sub(r1, L_shr_pos(pSrc[12], 1)); /* Re A - Re B */ + im = L_sub(s1, L_shr_pos(pSrc[13], 1)); /* Im A - Im B */ + + pDst[12] = L_sub(r1, r2); /* Re C' = Re A + Re B - Re C - Re D */ + pDst[13] = L_sub(s1, s2); /* Im C' = Im A + Im B - Im C - Im D */ + + r2 = L_sub(r2, L_shr_pos(pSrc[18], 1)); /* Re C - Re D */ + s2 = L_sub(s2, L_shr_pos(pSrc[19], 1)); /* Im C - Im D */ + + pDst[6] = L_add(re, s2); /* Re B' = Re A - Re B + Im C - Im D */ + pDst[18] = L_sub(re, s2); /* Re D' = Re A - Re B - Im C + Im D */ + pDst[7] = L_sub(im, r2); /* Im B' = Im A - Im B - Re C + Re D */ + pDst[19] = L_add(im, r2); /* Im D' = Im A - Im B + Re C - Re D */ + + pSrc += 2; + pDst += 2; + } + + Dyn_Mem_Deluxe_Out(); +} + +/** + * \brief Function performs a complex 16-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR16 bits. + * + * WOPS with 32x16 bit multiplications (scale on ): 288 cycles + * WOPS with 32x16 bit multiplications (scale off): 256 cycles + * + * \param [i/o] re real input / output + * \param [i/o] im imag input / output + * \param [i ] s stride real and imag input / output + * + * \return void + */ + + + +static void fft16(Word32 *re, Word32 *im, Word16 s) +{ + Dyn_Mem_Deluxe_In(Word32 x0, x1, x2, x3, x4, x5, x6, x7; Word32 t0, t1, t2, t3, t4, t5, t6, t7; + Word32 y00, y01, y02, y03, y04, y05, y06, y07; Word32 y08, y09, y10, y11, y12, y13, y14, y15; + Word32 y16, y17, y18, y19, y20, y21, y22, y23; Word32 y24, y25, y26, y27, y28, y29, y30, y31;); + + x0 = L_shr_pos(re[s * 0], SCALEFACTOR16); + x1 = L_shr_pos(im[s * 0], SCALEFACTOR16); + x2 = L_shr_pos(re[s * 4], SCALEFACTOR16); + x3 = L_shr_pos(im[s * 4], SCALEFACTOR16); + x4 = L_shr_pos(re[s * 8], SCALEFACTOR16); + x5 = L_shr_pos(im[s * 8], SCALEFACTOR16); + x6 = L_shr_pos(re[s * 12], SCALEFACTOR16); + x7 = L_shr_pos(im[s * 12], SCALEFACTOR16); + + /* Pre-additions */ + t0 = L_add(x0, x4); + t2 = L_sub(x0, x4); + t1 = L_add(x1, x5); + t3 = L_sub(x1, x5); + t4 = L_add(x2, x6); + t7 = L_sub(x2, x6); + t5 = L_add(x7, x3); + t6 = L_sub(x7, x3); + + /* Post-additions */ + y00 = L_add(t0, t4); + y01 = L_add(t1, t5); + y02 = L_sub(t2, t6); + y03 = L_sub(t3, t7); + y04 = L_sub(t0, t4); + y05 = L_sub(t1, t5); + y06 = L_add(t2, t6); + y07 = L_add(t3, t7); + + x0 = L_shr_pos(re[s * 1], SCALEFACTOR16); + x1 = L_shr_pos(im[s * 1], SCALEFACTOR16); + x2 = L_shr_pos(re[s * 5], SCALEFACTOR16); + x3 = L_shr_pos(im[s * 5], SCALEFACTOR16); + x4 = L_shr_pos(re[s * 9], SCALEFACTOR16); + x5 = L_shr_pos(im[s * 9], SCALEFACTOR16); + x6 = L_shr_pos(re[s * 13], SCALEFACTOR16); + x7 = L_shr_pos(im[s * 13], SCALEFACTOR16); + + /* Pre-additions */ + t0 = L_add(x0, x4); + t2 = L_sub(x0, x4); + t1 = L_add(x1, x5); + t3 = L_sub(x1, x5); + t4 = L_add(x2, x6); + t7 = L_sub(x2, x6); + t5 = L_add(x7, x3); + t6 = L_sub(x7, x3); + + /* Post-additions */ + y08 = L_add(t0, t4); + y09 = L_add(t1, t5); + y10 = L_sub(t2, t6); + y11 = L_sub(t3, t7); + y12 = L_sub(t0, t4); + y13 = L_sub(t1, t5); + y14 = L_add(t2, t6); + y15 = L_add(t3, t7); + + x0 = L_shr_pos(re[s * 2], SCALEFACTOR16); + x1 = L_shr_pos(im[s * 2], SCALEFACTOR16); + x2 = L_shr_pos(re[s * 6], SCALEFACTOR16); + x3 = L_shr_pos(im[s * 6], SCALEFACTOR16); + x4 = L_shr_pos(re[s * 10], SCALEFACTOR16); + x5 = L_shr_pos(im[s * 10], SCALEFACTOR16); + x6 = L_shr_pos(re[s * 14], SCALEFACTOR16); + x7 = L_shr_pos(im[s * 14], SCALEFACTOR16); + + /* Pre-additions */ + t0 = L_add(x0, x4); + t2 = L_sub(x0, x4); + t1 = L_add(x1, x5); + t3 = L_sub(x1, x5); + t4 = L_add(x2, x6); + t7 = L_sub(x2, x6); + t5 = L_add(x7, x3); + t6 = L_sub(x7, x3); + + /* Post-additions */ + y16 = L_add(t0, t4); + y17 = L_add(t1, t5); + y18 = L_sub(t2, t6); + y19 = L_sub(t3, t7); + y20 = L_sub(t1, t5); + y21 = L_sub(t4, t0); + y22 = L_add(t2, t6); + y23 = L_add(t3, t7); + + x0 = L_shr_pos(re[s * 3], SCALEFACTOR16); + x1 = L_shr_pos(im[s * 3], SCALEFACTOR16); + x2 = L_shr_pos(re[s * 7], SCALEFACTOR16); + x3 = L_shr_pos(im[s * 7], SCALEFACTOR16); + x4 = L_shr_pos(re[s * 11], SCALEFACTOR16); + x5 = L_shr_pos(im[s * 11], SCALEFACTOR16); + x6 = L_shr_pos(re[s * 15], SCALEFACTOR16); + x7 = L_shr_pos(im[s * 15], SCALEFACTOR16); + + /* Pre-additions */ + t0 = L_add(x0, x4); + t2 = L_sub(x0, x4); + t1 = L_add(x1, x5); + t3 = L_sub(x1, x5); + t4 = L_add(x2, x6); + t7 = L_sub(x2, x6); + t5 = L_add(x7, x3); + t6 = L_sub(x7, x3); + + /* Post-additions */ + y24 = L_add(t0, t4); + y25 = L_add(t1, t5); + y26 = L_sub(t2, t6); + y27 = L_sub(t3, t7); + y28 = L_sub(t0, t4); + y29 = L_sub(t1, t5); + y30 = L_add(t2, t6); + y31 = L_add(t3, t7); + + /* rotation */ + + x0 = Mpy_32_xx(y22, C162); + x1 = Mpy_32_xx(y23, C162); + y22 = L_sub(x0, x1); + y23 = L_add(x0, x1); + + x0 = Mpy_32_xx(y28, C162); + x1 = Mpy_32_xx(y29, C162); + y28 = L_sub(x0, x1); + y29 = L_add(x0, x1); + + x0 = Mpy_32_xx(y12, C161); + x1 = Mpy_32_xx(y13, C161); + y12 = L_add(x0, x1); + y13 = L_sub(x1, x0); + + x0 = Mpy_32_xx(y18, C161); + x1 = Mpy_32_xx(y19, C161); + y18 = L_add(x0, x1); + y19 = L_sub(x1, x0); + + x0 = Mpy_32_xx(y10, C163); + x1 = Mpy_32_xx(y11, C166); + x2 = Mpy_32_xx(y10, C166); + x3 = Mpy_32_xx(y11, C163); + y10 = L_sub(x0, x1); + y11 = L_add(x2, x3); + + x0 = Mpy_32_xx(y14, C165); + x1 = Mpy_32_xx(y15, C164); + x2 = Mpy_32_xx(y14, C164); + x3 = Mpy_32_xx(y15, C165); + y14 = L_sub(x0, x1); + y15 = L_add(x2, x3); + + x0 = Mpy_32_xx(y26, C165); + x1 = Mpy_32_xx(y27, C164); + x2 = Mpy_32_xx(y26, C164); + x3 = Mpy_32_xx(y27, C165); + y26 = L_sub(x0, x1); + y27 = L_add(x2, x3); + + x0 = Mpy_32_xx(y30, C164); + x1 = Mpy_32_xx(y31, C165); + x2 = Mpy_32_xx(y30, C165); + x3 = Mpy_32_xx(y31, C164); + y30 = L_sub(x0, x1); + y31 = L_add(x2, x3); + + /* Pre-additions */ + + t0 = L_add(y00, y16); + t2 = L_sub(y00, y16); + t1 = L_add(y01, y17); + t3 = L_sub(y01, y17); + t4 = L_add(y08, y24); + t7 = L_sub(y08, y24); + t5 = L_add(y25, y09); + t6 = L_sub(y25, y09); + + /* Post-additions */ + + re[s * 0] = L_add(t0, t4); + move32(); + im[s * 0] = L_add(t1, t5); + move32(); + re[s * 4] = L_sub(t2, t6); + move32(); + im[s * 4] = L_sub(t3, t7); + move32(); + re[s * 8] = L_sub(t0, t4); + move32(); + im[s * 8] = L_sub(t1, t5); + move32(); + re[s * 12] = L_add(t2, t6); + move32(); + im[s * 12] = L_add(t3, t7); + move32(); + + /* Pre-additions */ + + t0 = L_add(y02, y18); + t2 = L_sub(y02, y18); + t1 = L_add(y03, y19); + t3 = L_sub(y03, y19); + t4 = L_add(y10, y26); + t7 = L_sub(y10, y26); + t5 = L_add(y27, y11); + t6 = L_sub(y27, y11); + + /* Post-additions */ + + re[s * 1] = L_add(t0, t4); + move32(); + im[s * 1] = L_add(t1, t5); + move32(); + re[s * 5] = L_sub(t2, t6); + move32(); + im[s * 5] = L_sub(t3, t7); + move32(); + re[s * 9] = L_sub(t0, t4); + move32(); + im[s * 9] = L_sub(t1, t5); + move32(); + re[s * 13] = L_add(t2, t6); + move32(); + im[s * 13] = L_add(t3, t7); + move32(); + + /* Pre-additions */ + + t0 = L_add(y04, y20); + t2 = L_sub(y04, y20); + t1 = L_add(y05, y21); + t3 = L_sub(y05, y21); + t4 = L_add(y12, y28); + t7 = L_sub(y12, y28); + t5 = L_add(y29, y13); + t6 = L_sub(y29, y13); + + /* Post-additions */ + + re[s * 2] = L_add(t0, t4); + move32(); + im[s * 2] = L_add(t1, t5); + move32(); + re[s * 6] = L_sub(t2, t6); + move32(); + im[s * 6] = L_sub(t3, t7); + move32(); + re[s * 10] = L_sub(t0, t4); + move32(); + im[s * 10] = L_sub(t1, t5); + move32(); + re[s * 14] = L_add(t2, t6); + move32(); + im[s * 14] = L_add(t3, t7); + move32(); + + /* Pre-additions */ + + t0 = L_add(y06, y22); + t2 = L_sub(y06, y22); + t1 = L_add(y07, y23); + t3 = L_sub(y07, y23); + t4 = L_add(y14, y30); + t7 = L_sub(y14, y30); + t5 = L_add(y31, y15); + t6 = L_sub(y31, y15); + + /* Post-additions */ + + re[s * 3] = L_add(t0, t4); + move32(); + im[s * 3] = L_add(t1, t5); + move32(); + re[s * 7] = L_sub(t2, t6); + move32(); + im[s * 7] = L_sub(t3, t7); + move32(); + re[s * 11] = L_sub(t0, t4); + move32(); + im[s * 11] = L_sub(t1, t5); + move32(); + re[s * 15] = L_add(t2, t6); + move32(); + im[s * 15] = L_add(t3, t7); + move32(); + + Dyn_Mem_Deluxe_Out(); +} + +/** + * \brief Function performs a complex 20-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR20 bits. + * + * WOPS with 32x16 bit multiplications: 432 cycles + * + * \param [i/o] re real input / output + * \param [i/o] im imag input / output + * \param [i ] s stride real and imag input / output + * + * \return void + */ + + +static void fft20(Word32 *re, Word32 *im, Word16 s) +{ + Dyn_Mem_Deluxe_In(Word32 r1, r2, r3, r4; Word32 s1, s2, s3, s4; Word32 x0, x1, x2, x3, x4; + Word32 t, t0, t1, t2, t3, t4, t5, t6, t7; Word32 y00, y01, y02, y03, y04, y05, y06, y07, y08, y09; + Word32 y10, y11, y12, y13, y14, y15, y16, y17, y18, y19; + Word32 y20, y21, y22, y23, y24, y25, y26, y27, y28, y29; + Word32 y30, y31, y32, y33, y34, y35, y36, y37, y38, y39;); + + /* 1. FFT5 stage */ + + /* real part */ + x0 = L_shr_pos(re[s * 0], SCALEFACTOR20); + x1 = L_shr_pos(re[s * 16], SCALEFACTOR20); + x2 = L_shr_pos(re[s * 12], SCALEFACTOR20); + x3 = L_shr_pos(re[s * 8], SCALEFACTOR20); + x4 = L_shr_pos(re[s * 4], SCALEFACTOR20); + + r1 = L_add(x1, x4); + r4 = L_sub(x1, x4); + r3 = L_add(x2, x3); + r2 = L_sub(x2, x3); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y00 = L_add(x0, r1); + r1 = L_add(y00, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + x0 = L_shr_pos(im[s * 0], SCALEFACTOR20); + x1 = L_shr_pos(im[s * 16], SCALEFACTOR20); + x2 = L_shr_pos(im[s * 12], SCALEFACTOR20); + x3 = L_shr_pos(im[s * 8], SCALEFACTOR20); + x4 = L_shr_pos(im[s * 4], SCALEFACTOR20); + + s1 = L_add(x1, x4); + s4 = L_sub(x1, x4); + s3 = L_add(x2, x3); + s2 = L_sub(x2, x3); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y01 = L_add(x0, s1); + s1 = L_add(y01, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y08 = L_add(r1, s2); + y32 = L_sub(r1, s2); + y16 = L_sub(r3, s4); + y24 = L_add(r3, s4); + + y09 = L_sub(s1, r2); + y33 = L_add(s1, r2); + y17 = L_add(s3, r4); + y25 = L_sub(s3, r4); + + /* 2. FFT5 stage */ + + /* real part */ + x0 = L_shr_pos(re[s * 5], SCALEFACTOR20); + x1 = L_shr_pos(re[s * 1], SCALEFACTOR20); + x2 = L_shr_pos(re[s * 17], SCALEFACTOR20); + x3 = L_shr_pos(re[s * 13], SCALEFACTOR20); + x4 = L_shr_pos(re[s * 9], SCALEFACTOR20); + + r1 = L_add(x1, x4); + r4 = L_sub(x1, x4); + r3 = L_add(x2, x3); + r2 = L_sub(x2, x3); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y02 = L_add(x0, r1); + r1 = L_add(y02, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + x0 = L_shr_pos(im[s * 5], SCALEFACTOR20); + x1 = L_shr_pos(im[s * 1], SCALEFACTOR20); + x2 = L_shr_pos(im[s * 17], SCALEFACTOR20); + x3 = L_shr_pos(im[s * 13], SCALEFACTOR20); + x4 = L_shr_pos(im[s * 9], SCALEFACTOR20); + + s1 = L_add(x1, x4); + s4 = L_sub(x1, x4); + s3 = L_add(x2, x3); + s2 = L_sub(x2, x3); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y03 = L_add(x0, s1); + s1 = L_add(y03, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y10 = L_add(r1, s2); + y34 = L_sub(r1, s2); + y18 = L_sub(r3, s4); + y26 = L_add(r3, s4); + + y11 = L_sub(s1, r2); + y35 = L_add(s1, r2); + y19 = L_add(s3, r4); + y27 = L_sub(s3, r4); + + /* 3. FFT5 stage */ + + /* real part */ + x0 = L_shr_pos(re[s * 10], SCALEFACTOR20); + x1 = L_shr_pos(re[s * 6], SCALEFACTOR20); + x2 = L_shr_pos(re[s * 2], SCALEFACTOR20); + x3 = L_shr_pos(re[s * 18], SCALEFACTOR20); + x4 = L_shr_pos(re[s * 14], SCALEFACTOR20); + + r1 = L_add(x1, x4); + r4 = L_sub(x1, x4); + r3 = L_add(x2, x3); + r2 = L_sub(x2, x3); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y04 = L_add(x0, r1); + r1 = L_add(y04, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + x0 = L_shr_pos(im[s * 10], SCALEFACTOR20); + x1 = L_shr_pos(im[s * 6], SCALEFACTOR20); + x2 = L_shr_pos(im[s * 2], SCALEFACTOR20); + x3 = L_shr_pos(im[s * 18], SCALEFACTOR20); + x4 = L_shr_pos(im[s * 14], SCALEFACTOR20); + + s1 = L_add(x1, x4); + s4 = L_sub(x1, x4); + s3 = L_add(x2, x3); + s2 = L_sub(x2, x3); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y05 = L_add(x0, s1); + s1 = L_add(y05, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y12 = L_add(r1, s2); + y36 = L_sub(r1, s2); + y20 = L_sub(r3, s4); + y28 = L_add(r3, s4); + + y13 = L_sub(s1, r2); + y37 = L_add(s1, r2); + y21 = L_add(s3, r4); + y29 = L_sub(s3, r4); + + /* 4. FFT5 stage */ + + /* real part */ + x0 = L_shr_pos(re[s * 15], SCALEFACTOR20); + x1 = L_shr_pos(re[s * 11], SCALEFACTOR20); + x2 = L_shr_pos(re[s * 7], SCALEFACTOR20); + x3 = L_shr_pos(re[s * 3], SCALEFACTOR20); + x4 = L_shr_pos(re[s * 19], SCALEFACTOR20); + + r1 = L_add(x1, x4); + r4 = L_sub(x1, x4); + r3 = L_add(x2, x3); + r2 = L_sub(x2, x3); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y06 = L_add(x0, r1); + r1 = L_add(y06, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + x0 = L_shr_pos(im[s * 15], SCALEFACTOR20); + x1 = L_shr_pos(im[s * 11], SCALEFACTOR20); + x2 = L_shr_pos(im[s * 7], SCALEFACTOR20); + x3 = L_shr_pos(im[s * 3], SCALEFACTOR20); + x4 = L_shr_pos(im[s * 19], SCALEFACTOR20); + + s1 = L_add(x1, x4); + s4 = L_sub(x1, x4); + s3 = L_add(x2, x3); + s2 = L_sub(x2, x3); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y07 = L_add(x0, s1); + s1 = L_add(y07, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y14 = L_add(r1, s2); + y38 = L_sub(r1, s2); + y22 = L_sub(r3, s4); + y30 = L_add(r3, s4); + + y15 = L_sub(s1, r2); + y39 = L_add(s1, r2); + y23 = L_add(s3, r4); + y31 = L_sub(s3, r4); + + /* 1. FFT4 stage */ + + /* Pre-additions */ + t0 = L_add(y00, y04); + t2 = L_sub(y00, y04); + t1 = L_add(y01, y05); + t3 = L_sub(y01, y05); + t4 = L_add(y02, y06); + t7 = L_sub(y02, y06); + t5 = L_add(y07, y03); + t6 = L_sub(y07, y03); + + /* Post-additions */ + re[s * 0] = L_add(t0, t4); + move32(); + im[s * 0] = L_add(t1, t5); + move32(); + re[s * 5] = L_sub(t2, t6); + move32(); + im[s * 5] = L_sub(t3, t7); + move32(); + re[s * 10] = L_sub(t0, t4); + move32(); + im[s * 10] = L_sub(t1, t5); + move32(); + re[s * 15] = L_add(t2, t6); + move32(); + im[s * 15] = L_add(t3, t7); + move32(); + + /* 2. FFT4 stage */ + + /* Pre-additions */ + t0 = L_add(y08, y12); + t2 = L_sub(y08, y12); + t1 = L_add(y09, y13); + t3 = L_sub(y09, y13); + t4 = L_add(y10, y14); + t7 = L_sub(y10, y14); + t5 = L_add(y15, y11); + t6 = L_sub(y15, y11); + + /* Post-additions */ + re[s * 4] = L_add(t0, t4); + move32(); + im[s * 4] = L_add(t1, t5); + move32(); + re[s * 9] = L_sub(t2, t6); + move32(); + im[s * 9] = L_sub(t3, t7); + move32(); + re[s * 14] = L_sub(t0, t4); + move32(); + im[s * 14] = L_sub(t1, t5); + move32(); + re[s * 19] = L_add(t2, t6); + move32(); + im[s * 19] = L_add(t3, t7); + move32(); + + /* 3. FFT4 stage */ + + /* Pre-additions */ + t0 = L_add(y16, y20); + t2 = L_sub(y16, y20); + t1 = L_add(y17, y21); + t3 = L_sub(y17, y21); + t4 = L_add(y18, y22); + t7 = L_sub(y18, y22); + t5 = L_add(y23, y19); + t6 = L_sub(y23, y19); + + /* Post-additions */ + re[s * 8] = L_add(t0, t4); + move32(); + im[s * 8] = L_add(t1, t5); + move32(); + re[s * 13] = L_sub(t2, t6); + move32(); + im[s * 13] = L_sub(t3, t7); + move32(); + re[s * 18] = L_sub(t0, t4); + move32(); + im[s * 18] = L_sub(t1, t5); + move32(); + re[s * 3] = L_add(t2, t6); + move32(); + im[s * 3] = L_add(t3, t7); + move32(); + + /* 4. FFT4 stage */ + + /* Pre-additions */ + t0 = L_add(y24, y28); + t2 = L_sub(y24, y28); + t1 = L_add(y25, y29); + t3 = L_sub(y25, y29); + t4 = L_add(y26, y30); + t7 = L_sub(y26, y30); + t5 = L_add(y31, y27); + t6 = L_sub(y31, y27); + + /* Post-additions */ + re[s * 12] = L_add(t0, t4); + move32(); + im[s * 12] = L_add(t1, t5); + move32(); + re[s * 17] = L_sub(t2, t6); + move32(); + im[s * 17] = L_sub(t3, t7); + move32(); + re[s * 2] = L_sub(t0, t4); + move32(); + im[s * 2] = L_sub(t1, t5); + move32(); + re[s * 7] = L_add(t2, t6); + move32(); + im[s * 7] = L_add(t3, t7); + move32(); + + /* 5. FFT4 stage */ + + /* Pre-additions */ + t0 = L_add(y32, y36); + t2 = L_sub(y32, y36); + t1 = L_add(y33, y37); + t3 = L_sub(y33, y37); + t4 = L_add(y34, y38); + t7 = L_sub(y34, y38); + t5 = L_add(y39, y35); + t6 = L_sub(y39, y35); + + /* Post-additions */ + re[s * 16] = L_add(t0, t4); + move32(); + im[s * 16] = L_add(t1, t5); + move32(); + re[s * 1] = L_sub(t2, t6); + move32(); + im[s * 1] = L_sub(t3, t7); + move32(); + re[s * 6] = L_sub(t0, t4); + move32(); + im[s * 6] = L_sub(t1, t5); + move32(); + re[s * 11] = L_add(t2, t6); + move32(); + im[s * 11] = L_add(t3, t7); + move32(); + + Dyn_Mem_Deluxe_Out(); +} + +/** + * \brief Function performs a complex 30-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR30 bits. + * + * WOPS with 32x16 bit multiplications: 828 cycles + * + * \param [i/o] re real input / output + * \param [i/o] im imag input / output + * \param [i ] s stride real and imag input / output + * + * \return void + */ + + +static void fft30(Word32 *re, Word32 *im, Word16 s) +{ + Dyn_Mem_Deluxe_In(Word32 t; Word32 r1, r2, r3, r4; Word32 s1, s2, s3, s4; + Word32 x00, x01, x02, x03, x04, x05, x06, x07, x08, x09; + Word32 x10, x11, x12, x13, x14, x15, x16, x17, x18, x19; + Word32 x20, x21, x22, x23, x24, x25, x26, x27, x28, x29; + + Word32 y00, y01, y02, y03, y04, y05, y06, y07, y08, y09; + Word32 y10, y11, y12, y13, y14, y15, y16, y17, y18, y19; + Word32 y20, y21, y22, y23, y24, y25, y26, y27, y28, y29; + + Word32 z00, z01, z02, z03, z04, z05, z06, z07, z08, z09; + Word32 z10, z11, z12, z13, z14, z15, z16, z17, z18, z19; + Word32 z20, z21, z22, z23, z24, z25, z26, z27, z28, z29; + Word32 z30, z31, z32, z33, z34, z35, z36, z37, z38, z39; + Word32 z40, z41, z42, z43, z44, z45, z46, z47, z48, z49; + Word32 z50, z51, z52, z53, z54, z55, z56, z57, z58, z59; + + Word32 * rel, *reh, *iml, *imh;); + + rel = &re[s * 0]; + reh = &re[s * 15]; + iml = &im[s * 0]; + imh = &im[s * 15]; + + /* 1. FFT15 stage */ + x00 = L_shr_pos(re[s * 0], SCALEFACTOR30_1); + x01 = L_shr_pos(im[s * 0], SCALEFACTOR30_1); + x02 = L_shr_pos(re[s * 18], SCALEFACTOR30_1); + x03 = L_shr_pos(im[s * 18], SCALEFACTOR30_1); + x04 = L_shr_pos(re[s * 6], SCALEFACTOR30_1); + x05 = L_shr_pos(im[s * 6], SCALEFACTOR30_1); + x06 = L_shr_pos(re[s * 24], SCALEFACTOR30_1); + x07 = L_shr_pos(im[s * 24], SCALEFACTOR30_1); + x08 = L_shr_pos(re[s * 12], SCALEFACTOR30_1); + x09 = L_shr_pos(im[s * 12], SCALEFACTOR30_1); + + x10 = L_shr_pos(re[s * 20], SCALEFACTOR30_1); + x11 = L_shr_pos(im[s * 20], SCALEFACTOR30_1); + x12 = L_shr_pos(re[s * 8], SCALEFACTOR30_1); + x13 = L_shr_pos(im[s * 8], SCALEFACTOR30_1); + x14 = L_shr_pos(re[s * 26], SCALEFACTOR30_1); + x15 = L_shr_pos(im[s * 26], SCALEFACTOR30_1); + x16 = L_shr_pos(re[s * 14], SCALEFACTOR30_1); + x17 = L_shr_pos(im[s * 14], SCALEFACTOR30_1); + x18 = L_shr_pos(re[s * 2], SCALEFACTOR30_1); + x19 = L_shr_pos(im[s * 2], SCALEFACTOR30_1); + + x20 = L_shr_pos(re[s * 10], SCALEFACTOR30_1); + x21 = L_shr_pos(im[s * 10], SCALEFACTOR30_1); + x22 = L_shr_pos(re[s * 28], SCALEFACTOR30_1); + x23 = L_shr_pos(im[s * 28], SCALEFACTOR30_1); + x24 = L_shr_pos(re[s * 16], SCALEFACTOR30_1); + x25 = L_shr_pos(im[s * 16], SCALEFACTOR30_1); + x26 = L_shr_pos(re[s * 4], SCALEFACTOR30_1); + x27 = L_shr_pos(im[s * 4], SCALEFACTOR30_1); + x28 = L_shr_pos(re[s * 22], SCALEFACTOR30_1); + x29 = L_shr_pos(im[s * 22], SCALEFACTOR30_1); + + /* 1. FFT5 stage */ + + /* real part */ + r1 = L_add(x02, x08); + r4 = L_sub(x02, x08); + r3 = L_add(x04, x06); + r2 = L_sub(x04, x06); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y00 = L_add(x00, r1); + r1 = L_add(y00, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + s1 = L_add(x03, x09); + s4 = L_sub(x03, x09); + s3 = L_add(x05, x07); + s2 = L_sub(x05, x07); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y01 = L_add(x01, s1); + s1 = L_add(y01, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y02 = L_add(r1, s2); + y08 = L_sub(r1, s2); + y04 = L_sub(r3, s4); + y06 = L_add(r3, s4); + + y03 = L_sub(s1, r2); + y09 = L_add(s1, r2); + y05 = L_add(s3, r4); + y07 = L_sub(s3, r4); + + /* 2. FFT5 stage */ + + /* real part */ + r1 = L_add(x12, x18); + r4 = L_sub(x12, x18); + r3 = L_add(x14, x16); + r2 = L_sub(x14, x16); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y10 = L_add(x10, r1); + r1 = L_add(y10, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + s1 = L_add(x13, x19); + s4 = L_sub(x13, x19); + s3 = L_add(x15, x17); + s2 = L_sub(x15, x17); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y11 = L_add(x11, s1); + s1 = L_add(y11, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y12 = L_add(r1, s2); + y18 = L_sub(r1, s2); + y14 = L_sub(r3, s4); + y16 = L_add(r3, s4); + + y13 = L_sub(s1, r2); + y19 = L_add(s1, r2); + y15 = L_add(s3, r4); + y17 = L_sub(s3, r4); + + /* 3. FFT5 stage */ + + /* real part */ + r1 = L_add(x22, x28); + r4 = L_sub(x22, x28); + r3 = L_add(x24, x26); + r2 = L_sub(x24, x26); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y20 = L_add(x20, r1); + r1 = L_add(y20, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + s1 = L_add(x23, x29); + s4 = L_sub(x23, x29); + s3 = L_add(x25, x27); + s2 = L_sub(x25, x27); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y21 = L_add(x21, s1); + s1 = L_add(y21, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y22 = L_add(r1, s2); + y28 = L_sub(r1, s2); + y24 = L_sub(r3, s4); + y26 = L_add(r3, s4); + + y23 = L_sub(s1, r2); + y29 = L_add(s1, r2); + y25 = L_add(s3, r4); + y27 = L_sub(s3, r4); + + /* 1. FFT3 stage */ + + /* real part */ + r1 = L_add(y10, y20); + r2 = Mpy_32_xx(L_sub(y10, y20), C31); + z00 = L_add(y00, r1); + r1 = L_sub(y00, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y11, y21); + s2 = Mpy_32_xx(L_sub(y11, y21), C31); + z01 = L_add(y01, s1); + s1 = L_sub(y01, L_shr_pos(s1, 1)); + + /* combination */ + z20 = L_sub(r1, s2); + z10 = L_add(r1, s2); + z21 = L_add(s1, r2); + z11 = L_sub(s1, r2); + + /* 2. FFT3 stage */ + + /* real part */ + r1 = L_add(y12, y22); + r2 = Mpy_32_xx(L_sub(y12, y22), C31); + z12 = L_add(y02, r1); + r1 = L_sub(y02, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y13, y23); + s2 = Mpy_32_xx(L_sub(y13, y23), C31); + z13 = L_add(y03, s1); + s1 = L_sub(y03, L_shr_pos(s1, 1)); + + /* combination */ + z02 = L_sub(r1, s2); + z22 = L_add(r1, s2); + z03 = L_add(s1, r2); + z23 = L_sub(s1, r2); + + /* 3. FFT3 stage */ + + /* real part */ + r1 = L_add(y14, y24); + r2 = Mpy_32_xx(L_sub(y14, y24), C31); + z24 = L_add(y04, r1); + r1 = L_sub(y04, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y15, y25); + s2 = Mpy_32_xx(L_sub(y15, y25), C31); + z25 = L_add(y05, s1); + s1 = L_sub(y05, L_shr_pos(s1, 1)); + + /* combination */ + z14 = L_sub(r1, s2); + z04 = L_add(r1, s2); + z15 = L_add(s1, r2); + z05 = L_sub(s1, r2); + + /* 4. FFT3 stage */ + + /* real part */ + r1 = L_add(y16, y26); + r2 = Mpy_32_xx(L_sub(y16, y26), C31); + z06 = L_add(y06, r1); + r1 = L_sub(y06, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y17, y27); + s2 = Mpy_32_xx(L_sub(y17, y27), C31); + z07 = L_add(y07, s1); + s1 = L_sub(y07, L_shr_pos(s1, 1)); + + /* combination */ + z26 = L_sub(r1, s2); + z16 = L_add(r1, s2); + z27 = L_add(s1, r2); + z17 = L_sub(s1, r2); + + /* 5. FFT3 stage */ + + /* real part */ + r1 = L_add(y18, y28); + r2 = Mpy_32_xx(L_sub(y18, y28), C31); + z18 = L_add(y08, r1); + r1 = L_sub(y08, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y19, y29); + s2 = Mpy_32_xx(L_sub(y19, y29), C31); + z19 = L_add(y09, s1); + s1 = L_sub(y09, L_shr_pos(s1, 1)); + + /* combination */ + z08 = L_sub(r1, s2); + z28 = L_add(r1, s2); + z09 = L_add(s1, r2); + z29 = L_sub(s1, r2); + + /* 2. FFT15 stage */ + x00 = L_shr_pos(re[s * 15], SCALEFACTOR30_1); + x01 = L_shr_pos(im[s * 15], SCALEFACTOR30_1); + x02 = L_shr_pos(re[s * 3], SCALEFACTOR30_1); + x03 = L_shr_pos(im[s * 3], SCALEFACTOR30_1); + x04 = L_shr_pos(re[s * 21], SCALEFACTOR30_1); + x05 = L_shr_pos(im[s * 21], SCALEFACTOR30_1); + x06 = L_shr_pos(re[s * 9], SCALEFACTOR30_1); + x07 = L_shr_pos(im[s * 9], SCALEFACTOR30_1); + x08 = L_shr_pos(re[s * 27], SCALEFACTOR30_1); + x09 = L_shr_pos(im[s * 27], SCALEFACTOR30_1); + + x10 = L_shr_pos(re[s * 5], SCALEFACTOR30_1); + x11 = L_shr_pos(im[s * 5], SCALEFACTOR30_1); + x12 = L_shr_pos(re[s * 23], SCALEFACTOR30_1); + x13 = L_shr_pos(im[s * 23], SCALEFACTOR30_1); + x14 = L_shr_pos(re[s * 11], SCALEFACTOR30_1); + x15 = L_shr_pos(im[s * 11], SCALEFACTOR30_1); + x16 = L_shr_pos(re[s * 29], SCALEFACTOR30_1); + x17 = L_shr_pos(im[s * 29], SCALEFACTOR30_1); + x18 = L_shr_pos(re[s * 17], SCALEFACTOR30_1); + x19 = L_shr_pos(im[s * 17], SCALEFACTOR30_1); + + x20 = L_shr_pos(re[s * 25], SCALEFACTOR30_1); + x21 = L_shr_pos(im[s * 25], SCALEFACTOR30_1); + x22 = L_shr_pos(re[s * 13], SCALEFACTOR30_1); + x23 = L_shr_pos(im[s * 13], SCALEFACTOR30_1); + x24 = L_shr_pos(re[s * 1], SCALEFACTOR30_1); + x25 = L_shr_pos(im[s * 1], SCALEFACTOR30_1); + x26 = L_shr_pos(re[s * 19], SCALEFACTOR30_1); + x27 = L_shr_pos(im[s * 19], SCALEFACTOR30_1); + x28 = L_shr_pos(re[s * 7], SCALEFACTOR30_1); + x29 = L_shr_pos(im[s * 7], SCALEFACTOR30_1); + + /* 1. FFT5 stage */ + + /* real part */ + r1 = L_add(x02, x08); + r4 = L_sub(x02, x08); + r3 = L_add(x04, x06); + r2 = L_sub(x04, x06); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y00 = L_add(x00, r1); + r1 = L_add(y00, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + s1 = L_add(x03, x09); + s4 = L_sub(x03, x09); + s3 = L_add(x05, x07); + s2 = L_sub(x05, x07); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y01 = L_add(x01, s1); + s1 = L_add(y01, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y02 = L_add(r1, s2); + y08 = L_sub(r1, s2); + y04 = L_sub(r3, s4); + y06 = L_add(r3, s4); + + y03 = L_sub(s1, r2); + y09 = L_add(s1, r2); + y05 = L_add(s3, r4); + y07 = L_sub(s3, r4); + + /* 2. FFT5 stage */ + + /* real part */ + r1 = L_add(x12, x18); + r4 = L_sub(x12, x18); + r3 = L_add(x14, x16); + r2 = L_sub(x14, x16); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y10 = L_add(x10, r1); + r1 = L_add(y10, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + s1 = L_add(x13, x19); + s4 = L_sub(x13, x19); + s3 = L_add(x15, x17); + s2 = L_sub(x15, x17); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y11 = L_add(x11, s1); + s1 = L_add(y11, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y12 = L_add(r1, s2); + y18 = L_sub(r1, s2); + y14 = L_sub(r3, s4); + y16 = L_add(r3, s4); + + y13 = L_sub(s1, r2); + y19 = L_add(s1, r2); + y15 = L_add(s3, r4); + y17 = L_sub(s3, r4); + + /* 3. FFT5 stage */ + + /* real part */ + r1 = L_add(x22, x28); + r4 = L_sub(x22, x28); + r3 = L_add(x24, x26); + r2 = L_sub(x24, x26); + t = Mpy_32_xx(L_sub(r1, r3), C54); + r1 = L_add(r1, r3); + y20 = L_add(x20, r1); + r1 = L_add(y20, (L_shl_pos(Mpy_32_xx(r1, C55), 1))); + r3 = L_sub(r1, t); + r1 = L_add(r1, t); + t = Mpy_32_xx((L_add(r4, r2)), C51); + r4 = L_add(t, L_shl_pos(Mpy_32_xx(r4, C52), 1)); + r2 = L_add(t, Mpy_32_xx(r2, C53)); + + /* imaginary part */ + s1 = L_add(x23, x29); + s4 = L_sub(x23, x29); + s3 = L_add(x25, x27); + s2 = L_sub(x25, x27); + t = Mpy_32_xx(L_sub(s1, s3), C54); + s1 = L_add(s1, s3); + y21 = L_add(x21, s1); + s1 = L_add(y21, L_shl_pos(Mpy_32_xx(s1, C55), 1)); + s3 = L_sub(s1, t); + s1 = L_add(s1, t); + t = Mpy_32_xx(L_add(s4, s2), C51); + s4 = L_add(t, L_shl_pos(Mpy_32_xx(s4, C52), 1)); + s2 = L_add(t, Mpy_32_xx(s2, C53)); + + /* combination */ + y22 = L_add(r1, s2); + y28 = L_sub(r1, s2); + y24 = L_sub(r3, s4); + y26 = L_add(r3, s4); + + y23 = L_sub(s1, r2); + y29 = L_add(s1, r2); + y25 = L_add(s3, r4); + y27 = L_sub(s3, r4); + + /* 1. FFT3 stage */ + + /* real part */ + r1 = L_add(y10, y20); + r2 = Mpy_32_xx(L_sub(y10, y20), C31); + z30 = L_add(y00, r1); + r1 = L_sub(y00, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y11, y21); + s2 = Mpy_32_xx(L_sub(y11, y21), C31); + z31 = L_add(y01, s1); + s1 = L_sub(y01, L_shr_pos(s1, 1)); + + /* combination */ + z50 = L_sub(r1, s2); + z40 = L_add(r1, s2); + z51 = L_add(s1, r2); + z41 = L_sub(s1, r2); + + /* 2. FFT3 stage */ + + /* real part */ + r1 = L_add(y12, y22); + r2 = Mpy_32_xx(L_sub(y12, y22), C31); + z42 = L_add(y02, r1); + r1 = L_sub(y02, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y13, y23); + s2 = Mpy_32_xx(L_sub(y13, y23), C31); + z43 = L_add(y03, s1); + s1 = L_sub(y03, L_shr_pos(s1, 1)); + + /* combination */ + z32 = L_sub(r1, s2); + z52 = L_add(r1, s2); + z33 = L_add(s1, r2); + z53 = L_sub(s1, r2); + + /* 3. FFT3 stage */ + + /* real part */ + r1 = L_add(y14, y24); + r2 = Mpy_32_xx(L_sub(y14, y24), C31); + z54 = L_add(y04, r1); + r1 = L_sub(y04, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y15, y25); + s2 = Mpy_32_xx(L_sub(y15, y25), C31); + z55 = L_add(y05, s1); + s1 = L_sub(y05, L_shr_pos(s1, 1)); + + /* combination */ + z44 = L_sub(r1, s2); + z34 = L_add(r1, s2); + z45 = L_add(s1, r2); + z35 = L_sub(s1, r2); + + /* 4. FFT3 stage */ + + /* real part */ + r1 = L_add(y16, y26); + r2 = Mpy_32_xx(L_sub(y16, y26), C31); + z36 = L_add(y06, r1); + r1 = L_sub(y06, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y17, y27); + s2 = Mpy_32_xx(L_sub(y17, y27), C31); + z37 = L_add(y07, s1); + s1 = L_sub(y07, L_shr_pos(s1, 1)); + + /* combination */ + z56 = L_sub(r1, s2); + z46 = L_add(r1, s2); + z57 = L_add(s1, r2); + z47 = L_sub(s1, r2); + + /* 5. FFT3 stage */ + + /* real part */ + r1 = L_add(y18, y28); + r2 = Mpy_32_xx(L_sub(y18, y28), C31); + z48 = L_add(y08, r1); + r1 = L_sub(y08, L_shr_pos(r1, 1)); + + /* imaginary part */ + s1 = L_add(y19, y29); + s2 = Mpy_32_xx(L_sub(y19, y29), C31); + z49 = L_add(y09, s1); + s1 = L_sub(y09, L_shr_pos(s1, 1)); + + /* combination */ + z38 = L_sub(r1, s2); + z58 = L_add(r1, s2); + z39 = L_add(s1, r2); + z59 = L_sub(s1, r2); + + /* 1. FFT2 stage */ + r1 = L_shr_pos(z00, SCALEFACTOR30_2); + r2 = L_shr_pos(z30, SCALEFACTOR30_2); + r3 = L_shr_pos(z01, SCALEFACTOR30_2); + r4 = L_shr_pos(z31, SCALEFACTOR30_2); + *rel = L_add(r1, r2); + move32(); + *reh = L_sub(r1, r2); + move32(); + *iml = L_add(r3, r4); + move32(); + *imh = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 2. FFT2 stage */ + r1 = L_shr_pos(z16, SCALEFACTOR30_2); + r2 = L_shr_pos(z46, SCALEFACTOR30_2); + r3 = L_shr_pos(z17, SCALEFACTOR30_2); + r4 = L_shr_pos(z47, SCALEFACTOR30_2); + *reh = L_add(r1, r2); + move32(); + *rel = L_sub(r1, r2); + move32(); + *imh = L_add(r3, r4); + move32(); + *iml = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 3. FFT2 stage */ + r1 = L_shr_pos(z02, SCALEFACTOR30_2); + r2 = L_shr_pos(z32, SCALEFACTOR30_2); + r3 = L_shr_pos(z03, SCALEFACTOR30_2); + r4 = L_shr_pos(z33, SCALEFACTOR30_2); + *rel = L_add(r1, r2); + move32(); + *reh = L_sub(r1, r2); + move32(); + *iml = L_add(r3, r4); + move32(); + *imh = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 4. FFT2 stage */ + r1 = L_shr_pos(z18, SCALEFACTOR30_2); + r2 = L_shr_pos(z48, SCALEFACTOR30_2); + r3 = L_shr_pos(z19, SCALEFACTOR30_2); + r4 = L_shr_pos(z49, SCALEFACTOR30_2); + *reh = L_add(r1, r2); + move32(); + *rel = L_sub(r1, r2); + move32(); + *imh = L_add(r3, r4); + move32(); + *iml = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 5. FFT2 stage */ + r1 = L_shr_pos(z04, SCALEFACTOR30_2); + r2 = L_shr_pos(z34, SCALEFACTOR30_2); + r3 = L_shr_pos(z05, SCALEFACTOR30_2); + r4 = L_shr_pos(z35, SCALEFACTOR30_2); + *rel = L_add(r1, r2); + move32(); + *reh = L_sub(r1, r2); + move32(); + *iml = L_add(r3, r4); + move32(); + *imh = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 6. FFT2 stage */ + r1 = L_shr_pos(z20, SCALEFACTOR30_2); + r2 = L_shr_pos(z50, SCALEFACTOR30_2); + r3 = L_shr_pos(z21, SCALEFACTOR30_2); + r4 = L_shr_pos(z51, SCALEFACTOR30_2); + *reh = L_add(r1, r2); + move32(); + *rel = L_sub(r1, r2); + move32(); + *imh = L_add(r3, r4); + move32(); + *iml = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 7. FFT2 stage */ + r1 = L_shr_pos(z06, SCALEFACTOR30_2); + r2 = L_shr_pos(z36, SCALEFACTOR30_2); + r3 = L_shr_pos(z07, SCALEFACTOR30_2); + r4 = L_shr_pos(z37, SCALEFACTOR30_2); + *rel = L_add(r1, r2); + move32(); + *reh = L_sub(r1, r2); + move32(); + *iml = L_add(r3, r4); + move32(); + *imh = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 8. FFT2 stage */ + r1 = L_shr_pos(z22, SCALEFACTOR30_2); + r2 = L_shr_pos(z52, SCALEFACTOR30_2); + r3 = L_shr_pos(z23, SCALEFACTOR30_2); + r4 = L_shr_pos(z53, SCALEFACTOR30_2); + *reh = L_add(r1, r2); + move32(); + *rel = L_sub(r1, r2); + move32(); + *imh = L_add(r3, r4); + move32(); + *iml = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 9. FFT2 stage */ + r1 = L_shr_pos(z08, SCALEFACTOR30_2); + r2 = L_shr_pos(z38, SCALEFACTOR30_2); + r3 = L_shr_pos(z09, SCALEFACTOR30_2); + r4 = L_shr_pos(z39, SCALEFACTOR30_2); + *rel = L_add(r1, r2); + move32(); + *reh = L_sub(r1, r2); + move32(); + *iml = L_add(r3, r4); + move32(); + *imh = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 10. FFT2 stage */ + r1 = L_shr_pos(z24, SCALEFACTOR30_2); + r2 = L_shr_pos(z54, SCALEFACTOR30_2); + r3 = L_shr_pos(z25, SCALEFACTOR30_2); + r4 = L_shr_pos(z55, SCALEFACTOR30_2); + *reh = L_add(r1, r2); + move32(); + *rel = L_sub(r1, r2); + move32(); + *imh = L_add(r3, r4); + move32(); + *iml = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 11. FFT2 stage */ + r1 = L_shr_pos(z10, SCALEFACTOR30_2); + r2 = L_shr_pos(z40, SCALEFACTOR30_2); + r3 = L_shr_pos(z11, SCALEFACTOR30_2); + r4 = L_shr_pos(z41, SCALEFACTOR30_2); + *rel = L_add(r1, r2); + move32(); + *reh = L_sub(r1, r2); + move32(); + *iml = L_add(r3, r4); + move32(); + *imh = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 12. FFT2 stage */ + r1 = L_shr_pos(z26, SCALEFACTOR30_2); + r2 = L_shr_pos(z56, SCALEFACTOR30_2); + r3 = L_shr_pos(z27, SCALEFACTOR30_2); + r4 = L_shr_pos(z57, SCALEFACTOR30_2); + *reh = L_add(r1, r2); + move32(); + *rel = L_sub(r1, r2); + move32(); + *imh = L_add(r3, r4); + move32(); + *iml = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 13. FFT2 stage */ + r1 = L_shr_pos(z12, SCALEFACTOR30_2); + r2 = L_shr_pos(z42, SCALEFACTOR30_2); + r3 = L_shr_pos(z13, SCALEFACTOR30_2); + r4 = L_shr_pos(z43, SCALEFACTOR30_2); + *rel = L_add(r1, r2); + move32(); + *reh = L_sub(r1, r2); + move32(); + *iml = L_add(r3, r4); + move32(); + *imh = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 14. FFT2 stage */ + r1 = L_shr_pos(z28, SCALEFACTOR30_2); + r2 = L_shr_pos(z58, SCALEFACTOR30_2); + r3 = L_shr_pos(z29, SCALEFACTOR30_2); + r4 = L_shr_pos(z59, SCALEFACTOR30_2); + *reh = L_add(r1, r2); + move32(); + *rel = L_sub(r1, r2); + move32(); + *imh = L_add(r3, r4); + move32(); + *iml = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + /* 15. FFT2 stage */ + r1 = L_shr_pos(z14, SCALEFACTOR30_2); + r2 = L_shr_pos(z44, SCALEFACTOR30_2); + r3 = L_shr_pos(z15, SCALEFACTOR30_2); + r4 = L_shr_pos(z45, SCALEFACTOR30_2); + *rel = L_add(r1, r2); + move32(); + *reh = L_sub(r1, r2); + move32(); + *iml = L_add(r3, r4); + move32(); + *imh = L_sub(r3, r4); + move32(); + rel += s, reh += s, iml += s; + imh += s; + + Dyn_Mem_Deluxe_Out(); +} + +/** + * \brief Function performs a complex 32-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR32 bits. + * + * WOPS with 32x16 bit multiplications: 752 cycles + * + * \param [i/o] re real input / output + * \param [i/o] im imag input / output + * \param [i ] s stride real and imag input / output + * + * \return void + */ + + +static void fft32(Word32 *re, Word32 *im, Word16 s) +{ + Dyn_Mem_Deluxe_In(Word32 as, bs; Word32 x00, x01, x02, x03, x04, x05, x06, x07; + Word32 x08, x09, x10, x11, x12, x13, x14, x15; Word32 t00, t01, t02, t03, t04, t05, t06, t07; + Word32 t08, t09, t10, t11, t12, t13, t14, t15; Word32 s00, s01, s02, s03, s04, s05, s06, s07; + Word32 s08, s09, s10, s11, s12, s13, s14, s15; + + Word32 y00, y01, y02, y03, y04, y05, y06, y07; Word32 y08, y09, y10, y11, y12, y13, y14, y15; + Word32 y16, y17, y18, y19, y20, y21, y22, y23; Word32 y24, y25, y26, y27, y28, y29, y30, y31; + Word32 y32, y33, y34, y35, y36, y37, y38, y39; Word32 y40, y41, y42, y43, y44, y45, y46, y47; + Word32 y48, y49, y50, y51, y52, y53, y54, y55; Word32 y56, y57, y58, y59, y60, y61, y62, y63;); + + /* 1. FFT8 stage */ + x00 = L_shr_pos(re[s * 0], SCALEFACTOR32_1); + x01 = L_shr_pos(im[s * 0], SCALEFACTOR32_1); + x02 = L_shr_pos(re[s * 4], SCALEFACTOR32_1); + x03 = L_shr_pos(im[s * 4], SCALEFACTOR32_1); + x04 = L_shr_pos(re[s * 8], SCALEFACTOR32_1); + x05 = L_shr_pos(im[s * 8], SCALEFACTOR32_1); + x06 = L_shr_pos(re[s * 12], SCALEFACTOR32_1); + x07 = L_shr_pos(im[s * 12], SCALEFACTOR32_1); + x08 = L_shr_pos(re[s * 16], SCALEFACTOR32_1); + x09 = L_shr_pos(im[s * 16], SCALEFACTOR32_1); + x10 = L_shr_pos(re[s * 20], SCALEFACTOR32_1); + x11 = L_shr_pos(im[s * 20], SCALEFACTOR32_1); + x12 = L_shr_pos(re[s * 24], SCALEFACTOR32_1); + x13 = L_shr_pos(im[s * 24], SCALEFACTOR32_1); + x14 = L_shr_pos(re[s * 28], SCALEFACTOR32_1); + x15 = L_shr_pos(im[s * 28], SCALEFACTOR32_1); + + t00 = L_add(x00, x08); + t02 = L_sub(x00, x08); + t01 = L_add(x01, x09); + t03 = L_sub(x01, x09); + t04 = L_add(x02, x10); + t06 = L_sub(x02, x10); + t05 = L_add(x03, x11); + t07 = L_sub(x03, x11); + t08 = L_add(x04, x12); + t10 = L_sub(x04, x12); + t09 = L_add(x05, x13); + t11 = L_sub(x05, x13); + t12 = L_add(x06, x14); + t14 = L_sub(x06, x14); + t13 = L_add(x07, x15); + t15 = L_sub(x07, x15); + + /* Pre-additions and core multiplications */ + s00 = L_add(t00, t08); + s04 = L_sub(t00, t08); + s01 = L_add(t01, t09); + s05 = L_sub(t01, t09); + s08 = L_sub(t02, t11); + s10 = L_add(t02, t11); + s09 = L_add(t03, t10); + s11 = L_sub(t03, t10); + s02 = L_add(t04, t12); + s07 = L_sub(t04, t12); + s03 = L_add(t05, t13); + s06 = L_sub(t13, t05); + t01 = L_add(t06, t14); + t02 = L_sub(t06, t14); + t00 = L_add(t07, t15); + t03 = L_sub(t07, t15); + + Mpy3_0(s12, s13, s14, s15, t00, t01, t02, t03); + + /* Post-additions */ + y00 = L_add(s00, s02); + y08 = L_sub(s00, s02); + y01 = L_add(s01, s03); + y09 = L_sub(s01, s03); + y04 = L_sub(s04, s06); + y12 = L_add(s04, s06); + y05 = L_sub(s05, s07); + y13 = L_add(s05, s07); + y06 = L_add(s08, s14); + y14 = L_sub(s08, s14); + y07 = L_add(s09, s15); + y15 = L_sub(s09, s15); + y02 = L_add(s10, s12); + y10 = L_sub(s10, s12); + y03 = L_add(s11, s13); + y11 = L_sub(s11, s13); + + /* 2. FFT8 stage */ + x00 = L_shr_pos(re[s * 1], SCALEFACTOR32_1); + x01 = L_shr_pos(im[s * 1], SCALEFACTOR32_1); + x02 = L_shr_pos(re[s * 5], SCALEFACTOR32_1); + x03 = L_shr_pos(im[s * 5], SCALEFACTOR32_1); + x04 = L_shr_pos(re[s * 9], SCALEFACTOR32_1); + x05 = L_shr_pos(im[s * 9], SCALEFACTOR32_1); + x06 = L_shr_pos(re[s * 13], SCALEFACTOR32_1); + x07 = L_shr_pos(im[s * 13], SCALEFACTOR32_1); + x08 = L_shr_pos(re[s * 17], SCALEFACTOR32_1); + x09 = L_shr_pos(im[s * 17], SCALEFACTOR32_1); + x10 = L_shr_pos(re[s * 21], SCALEFACTOR32_1); + x11 = L_shr_pos(im[s * 21], SCALEFACTOR32_1); + x12 = L_shr_pos(re[s * 25], SCALEFACTOR32_1); + x13 = L_shr_pos(im[s * 25], SCALEFACTOR32_1); + x14 = L_shr_pos(re[s * 29], SCALEFACTOR32_1); + x15 = L_shr_pos(im[s * 29], SCALEFACTOR32_1); + + t00 = L_add(x00, x08); + t02 = L_sub(x00, x08); + t01 = L_add(x01, x09); + t03 = L_sub(x01, x09); + t04 = L_add(x02, x10); + t06 = L_sub(x02, x10); + t05 = L_add(x03, x11); + t07 = L_sub(x03, x11); + t08 = L_add(x04, x12); + t10 = L_sub(x04, x12); + t09 = L_add(x05, x13); + t11 = L_sub(x05, x13); + t12 = L_add(x06, x14); + t14 = L_sub(x06, x14); + t13 = L_add(x07, x15); + t15 = L_sub(x07, x15); + + /* Pre-additions and core multiplications */ + s00 = L_add(t00, t08); + s04 = L_sub(t00, t08); + s01 = L_add(t01, t09); + s05 = L_sub(t01, t09); + s08 = L_sub(t02, t11); + s10 = L_add(t02, t11); + s09 = L_add(t03, t10); + s11 = L_sub(t03, t10); + s02 = L_add(t04, t12); + s07 = L_sub(t04, t12); + s03 = L_add(t05, t13); + s06 = L_sub(t13, t05); + t01 = L_add(t06, t14); + t02 = L_sub(t06, t14); + t00 = L_add(t07, t15); + t03 = L_sub(t07, t15); + + Mpy3_0(s12, s13, s14, s15, t00, t01, t02, t03); + + /* Post-additions */ + y16 = L_add(s00, s02); + y24 = L_sub(s00, s02); + y17 = L_add(s01, s03); + y25 = L_sub(s01, s03); + y20 = L_sub(s04, s06); + y28 = L_add(s04, s06); + y21 = L_sub(s05, s07); + y29 = L_add(s05, s07); + y22 = L_add(s08, s14); + y30 = L_sub(s08, s14); + y23 = L_add(s09, s15); + y31 = L_sub(s09, s15); + y18 = L_add(s10, s12); + y26 = L_sub(s10, s12); + y19 = L_add(s11, s13); + y27 = L_sub(s11, s13); + + /* 3. FFT8 stage */ + x00 = L_shr_pos(re[s * 2], SCALEFACTOR32_1); + x01 = L_shr_pos(im[s * 2], SCALEFACTOR32_1); + x02 = L_shr_pos(re[s * 6], SCALEFACTOR32_1); + x03 = L_shr_pos(im[s * 6], SCALEFACTOR32_1); + x04 = L_shr_pos(re[s * 10], SCALEFACTOR32_1); + x05 = L_shr_pos(im[s * 10], SCALEFACTOR32_1); + x06 = L_shr_pos(re[s * 14], SCALEFACTOR32_1); + x07 = L_shr_pos(im[s * 14], SCALEFACTOR32_1); + x08 = L_shr_pos(re[s * 18], SCALEFACTOR32_1); + x09 = L_shr_pos(im[s * 18], SCALEFACTOR32_1); + x10 = L_shr_pos(re[s * 22], SCALEFACTOR32_1); + x11 = L_shr_pos(im[s * 22], SCALEFACTOR32_1); + x12 = L_shr_pos(re[s * 26], SCALEFACTOR32_1); + x13 = L_shr_pos(im[s * 26], SCALEFACTOR32_1); + x14 = L_shr_pos(re[s * 30], SCALEFACTOR32_1); + x15 = L_shr_pos(im[s * 30], SCALEFACTOR32_1); + + t00 = L_add(x00, x08); + t02 = L_sub(x00, x08); + t01 = L_add(x01, x09); + t03 = L_sub(x01, x09); + t04 = L_add(x02, x10); + t06 = L_sub(x02, x10); + t05 = L_add(x03, x11); + t07 = L_sub(x03, x11); + t08 = L_add(x04, x12); + t10 = L_sub(x04, x12); + t09 = L_add(x05, x13); + t11 = L_sub(x05, x13); + t12 = L_add(x06, x14); + t14 = L_sub(x06, x14); + t13 = L_add(x07, x15); + t15 = L_sub(x07, x15); + + /* Pre-additions and core multiplications */ + s00 = L_add(t00, t08); + s04 = L_sub(t00, t08); + s01 = L_add(t01, t09); + s05 = L_sub(t01, t09); + s08 = L_sub(t02, t11); + s10 = L_add(t02, t11); + s09 = L_add(t03, t10); + s11 = L_sub(t03, t10); + s02 = L_add(t04, t12); + s07 = L_sub(t04, t12); + s03 = L_add(t05, t13); + s06 = L_sub(t13, t05); + t01 = L_add(t06, t14); + t02 = L_sub(t06, t14); + t00 = L_add(t07, t15); + t03 = L_sub(t07, t15); + + Mpy3_0(s12, s13, s14, s15, t00, t01, t02, t03); + + /* Post-additions */ + y32 = L_add(s00, s02); + y40 = L_sub(s00, s02); + y33 = L_add(s01, s03); + y41 = L_sub(s01, s03); + y36 = L_sub(s04, s06); + y44 = L_add(s04, s06); + y37 = L_sub(s05, s07); + y45 = L_add(s05, s07); + y38 = L_add(s08, s14); + y46 = L_sub(s08, s14); + y39 = L_add(s09, s15); + y47 = L_sub(s09, s15); + y34 = L_add(s10, s12); + y42 = L_sub(s10, s12); + y35 = L_add(s11, s13); + y43 = L_sub(s11, s13); + + /* 4. FFT8 stage */ + x00 = L_shr_pos(re[s * 3], SCALEFACTOR32_1); + x01 = L_shr_pos(im[s * 3], SCALEFACTOR32_1); + x02 = L_shr_pos(re[s * 7], SCALEFACTOR32_1); + x03 = L_shr_pos(im[s * 7], SCALEFACTOR32_1); + x04 = L_shr_pos(re[s * 11], SCALEFACTOR32_1); + x05 = L_shr_pos(im[s * 11], SCALEFACTOR32_1); + x06 = L_shr_pos(re[s * 15], SCALEFACTOR32_1); + x07 = L_shr_pos(im[s * 15], SCALEFACTOR32_1); + x08 = L_shr_pos(re[s * 19], SCALEFACTOR32_1); + x09 = L_shr_pos(im[s * 19], SCALEFACTOR32_1); + x10 = L_shr_pos(re[s * 23], SCALEFACTOR32_1); + x11 = L_shr_pos(im[s * 23], SCALEFACTOR32_1); + x12 = L_shr_pos(re[s * 27], SCALEFACTOR32_1); + x13 = L_shr_pos(im[s * 27], SCALEFACTOR32_1); + x14 = L_shr_pos(re[s * 31], SCALEFACTOR32_1); + x15 = L_shr_pos(im[s * 31], SCALEFACTOR32_1); + + t00 = L_add(x00, x08); + t02 = L_sub(x00, x08); + t01 = L_add(x01, x09); + t03 = L_sub(x01, x09); + t04 = L_add(x02, x10); + t06 = L_sub(x02, x10); + t05 = L_add(x03, x11); + t07 = L_sub(x03, x11); + t08 = L_add(x04, x12); + t10 = L_sub(x04, x12); + t09 = L_add(x05, x13); + t11 = L_sub(x05, x13); + t12 = L_add(x06, x14); + t14 = L_sub(x06, x14); + t13 = L_add(x07, x15); + t15 = L_sub(x07, x15); + + /* Pre-additions and core multiplications */ + s00 = L_add(t00, t08); + s04 = L_sub(t00, t08); + s01 = L_add(t01, t09); + s05 = L_sub(t01, t09); + s08 = L_sub(t02, t11); + s10 = L_add(t02, t11); + s09 = L_add(t03, t10); + s11 = L_sub(t03, t10); + s02 = L_add(t04, t12); + s07 = L_sub(t04, t12); + s03 = L_add(t05, t13); + s06 = L_sub(t13, t05); + t01 = L_add(t06, t14); + t02 = L_sub(t06, t14); + t00 = L_add(t07, t15); + t03 = L_sub(t07, t15); + + Mpy3_0(s12, s13, s14, s15, t00, t01, t02, t03); + + /* Post-additions */ + y48 = L_add(s00, s02); + y56 = L_sub(s00, s02); + y49 = L_add(s01, s03); + y57 = L_sub(s01, s03); + y52 = L_sub(s04, s06); + y60 = L_add(s04, s06); + y53 = L_sub(s05, s07); + y61 = L_add(s05, s07); + y54 = L_add(s08, s14); + y62 = L_sub(s08, s14); + y55 = L_add(s09, s15); + y63 = L_sub(s09, s15); + y50 = L_add(s10, s12); + y58 = L_sub(s10, s12); + y51 = L_add(s11, s13); + y59 = L_sub(s11, s13); + + /* apply twiddle factors */ + y00 = L_shr_pos(y00, SCALEFACTOR32_2); + y01 = L_shr_pos(y01, SCALEFACTOR32_2); + y02 = L_shr_pos(y02, SCALEFACTOR32_2); + y03 = L_shr_pos(y03, SCALEFACTOR32_2); + y04 = L_shr_pos(y04, SCALEFACTOR32_2); + y05 = L_shr_pos(y05, SCALEFACTOR32_2); + y06 = L_shr_pos(y06, SCALEFACTOR32_2); + y07 = L_shr_pos(y07, SCALEFACTOR32_2); + y08 = L_shr_pos(y08, SCALEFACTOR32_2); + y09 = L_shr_pos(y09, SCALEFACTOR32_2); + y10 = L_shr_pos(y10, SCALEFACTOR32_2); + y11 = L_shr_pos(y11, SCALEFACTOR32_2); + y12 = L_shr_pos(y12, SCALEFACTOR32_2); + y13 = L_shr_pos(y13, SCALEFACTOR32_2); + y14 = L_shr_pos(y14, SCALEFACTOR32_2); + y15 = L_shr_pos(y15, SCALEFACTOR32_2); + y16 = L_shr_pos(y16, SCALEFACTOR32_2); + y17 = L_shr_pos(y17, SCALEFACTOR32_2); + y32 = L_shr_pos(y32, SCALEFACTOR32_2); + y33 = L_shr_pos(y33, SCALEFACTOR32_2); + y48 = L_shr_pos(y48, SCALEFACTOR32_2); + y49 = L_shr_pos(y49, SCALEFACTOR32_2); + y40 = L_shr_pos(y40, SCALEFACTOR32_2); + y41 = L_shr_pos(y41, SCALEFACTOR32_2); + + cplxMpy3_0(y18, y19, RotVector_32_32[2 * 0 + 0], RotVector_32_32[2 * 0 + 1]); + cplxMpy3_0(y20, y21, RotVector_32_32[2 * 1 + 0], RotVector_32_32[2 * 1 + 1]); + cplxMpy3_0(y22, y23, RotVector_32_32[2 * 2 + 0], RotVector_32_32[2 * 2 + 1]); + cplxMpy3_0(y24, y25, RotVector_32_32[2 * 3 + 0], RotVector_32_32[2 * 3 + 1]); + cplxMpy3_0(y26, y27, RotVector_32_32[2 * 4 + 0], RotVector_32_32[2 * 4 + 1]); + cplxMpy3_0(y28, y29, RotVector_32_32[2 * 5 + 0], RotVector_32_32[2 * 5 + 1]); + cplxMpy3_0(y30, y31, RotVector_32_32[2 * 6 + 0], RotVector_32_32[2 * 6 + 1]); + cplxMpy3_0(y34, y35, RotVector_32_32[2 * 7 + 0], RotVector_32_32[2 * 7 + 1]); + cplxMpy3_0(y36, y37, RotVector_32_32[2 * 8 + 0], RotVector_32_32[2 * 8 + 1]); + cplxMpy3_0(y38, y39, RotVector_32_32[2 * 9 + 0], RotVector_32_32[2 * 9 + 1]); + cplxMpy3_0(y42, y43, RotVector_32_32[2 * 10 + 0], RotVector_32_32[2 * 10 + 1]); + cplxMpy3_0(y44, y45, RotVector_32_32[2 * 11 + 0], RotVector_32_32[2 * 11 + 1]); + cplxMpy3_0(y46, y47, RotVector_32_32[2 * 12 + 0], RotVector_32_32[2 * 12 + 1]); + cplxMpy3_0(y50, y51, RotVector_32_32[2 * 13 + 0], RotVector_32_32[2 * 13 + 1]); + cplxMpy3_0(y52, y53, RotVector_32_32[2 * 14 + 0], RotVector_32_32[2 * 14 + 1]); + cplxMpy3_0(y54, y55, RotVector_32_32[2 * 15 + 0], RotVector_32_32[2 * 15 + 1]); + cplxMpy3_0(y56, y57, RotVector_32_32[2 * 16 + 0], RotVector_32_32[2 * 16 + 1]); + cplxMpy3_0(y58, y59, RotVector_32_32[2 * 17 + 0], RotVector_32_32[2 * 17 + 1]); + cplxMpy3_0(y60, y61, RotVector_32_32[2 * 18 + 0], RotVector_32_32[2 * 18 + 1]); + cplxMpy3_0(y62, y63, RotVector_32_32[2 * 19 + 0], RotVector_32_32[2 * 19 + 1]); + + /* 1. FFT4 stage */ + + /* Pre-additions */ + t00 = L_add(y00, y32); + t02 = L_sub(y00, y32); + t01 = L_add(y01, y33); + t03 = L_sub(y01, y33); + t04 = L_add(y16, y48); + t07 = L_sub(y16, y48); + t05 = L_add(y49, y17); + t06 = L_sub(y49, y17); + + /* Post-additions */ + re[s * 0] = L_add(t00, t04); + move32(); + im[s * 0] = L_add(t01, t05); + move32(); + re[s * 8] = L_sub(t02, t06); + move32(); + im[s * 8] = L_sub(t03, t07); + move32(); + re[s * 16] = L_sub(t00, t04); + move32(); + im[s * 16] = L_sub(t01, t05); + move32(); + re[s * 24] = L_add(t02, t06); + move32(); + im[s * 24] = L_add(t03, t07); + move32(); + + /* 2. FFT4 stage */ + + /* Pre-additions */ + t00 = L_add(y02, y34); + t02 = L_sub(y02, y34); + t01 = L_add(y03, y35); + t03 = L_sub(y03, y35); + t04 = L_add(y18, y50); + t07 = L_sub(y18, y50); + t05 = L_add(y51, y19); + t06 = L_sub(y51, y19); + + /* Post-additions */ + re[s * 1] = L_add(t00, t04); + move32(); + im[s * 1] = L_add(t01, t05); + move32(); + re[s * 9] = L_sub(t02, t06); + move32(); + im[s * 9] = L_sub(t03, t07); + move32(); + re[s * 17] = L_sub(t00, t04); + move32(); + im[s * 17] = L_sub(t01, t05); + move32(); + re[s * 25] = L_add(t02, t06); + move32(); + im[s * 25] = L_add(t03, t07); + move32(); + + /* 3. FFT4 stage */ + + /* Pre-additions */ + t00 = L_add(y04, y36); + t02 = L_sub(y04, y36); + t01 = L_add(y05, y37); + t03 = L_sub(y05, y37); + t04 = L_add(y20, y52); + t07 = L_sub(y20, y52); + t05 = L_add(y53, y21); + t06 = L_sub(y53, y21); + + /* Post-additions */ + re[s * 2] = L_add(t00, t04); + move32(); + im[s * 2] = L_add(t01, t05); + move32(); + re[s * 10] = L_sub(t02, t06); + move32(); + im[s * 10] = L_sub(t03, t07); + move32(); + re[s * 18] = L_sub(t00, t04); + move32(); + im[s * 18] = L_sub(t01, t05); + move32(); + re[s * 26] = L_add(t02, t06); + move32(); + im[s * 26] = L_add(t03, t07); + move32(); + + /* 4. FFT4 stage */ + + /* Pre-additions */ + t00 = L_add(y06, y38); + t02 = L_sub(y06, y38); + t01 = L_add(y07, y39); + t03 = L_sub(y07, y39); + t04 = L_add(y22, y54); + t07 = L_sub(y22, y54); + t05 = L_add(y55, y23); + t06 = L_sub(y55, y23); + + /* Post-additions */ + re[s * 3] = L_add(t00, t04); + move32(); + im[s * 3] = L_add(t01, t05); + move32(); + re[s * 11] = L_sub(t02, t06); + move32(); + im[s * 11] = L_sub(t03, t07); + move32(); + re[s * 19] = L_sub(t00, t04); + move32(); + im[s * 19] = L_sub(t01, t05); + move32(); + re[s * 27] = L_add(t02, t06); + move32(); + im[s * 27] = L_add(t03, t07); + move32(); + + /* 5. FFT4 stage */ + + /* Pre-additions */ + t00 = L_add(y08, y41); + t02 = L_sub(y08, y41); + t01 = L_sub(y09, y40); + t03 = L_add(y09, y40); + t04 = L_add(y24, y56); + t07 = L_sub(y24, y56); + t05 = L_add(y57, y25); + t06 = L_sub(y57, y25); + + /* Post-additions */ + re[s * 4] = L_add(t00, t04); + move32(); + im[s * 4] = L_add(t01, t05); + move32(); + re[s * 12] = L_sub(t02, t06); + move32(); + im[s * 12] = L_sub(t03, t07); + move32(); + re[s * 20] = L_sub(t00, t04); + move32(); + im[s * 20] = L_sub(t01, t05); + move32(); + re[s * 28] = L_add(t02, t06); + move32(); + im[s * 28] = L_add(t03, t07); + move32(); + + /* 6. FFT4 stage */ + + /* Pre-additions */ + t00 = L_add(y10, y42); + t02 = L_sub(y10, y42); + t01 = L_add(y11, y43); + t03 = L_sub(y11, y43); + t04 = L_add(y26, y58); + t07 = L_sub(y26, y58); + t05 = L_add(y59, y27); + t06 = L_sub(y59, y27); + + /* Post-additions */ + re[s * 5] = L_add(t00, t04); + move32(); + im[s * 5] = L_add(t01, t05); + move32(); + re[s * 13] = L_sub(t02, t06); + move32(); + im[s * 13] = L_sub(t03, t07); + move32(); + re[s * 21] = L_sub(t00, t04); + move32(); + im[s * 21] = L_sub(t01, t05); + move32(); + re[s * 29] = L_add(t02, t06); + move32(); + im[s * 29] = L_add(t03, t07); + move32(); + + /* 7. FFT4 stage */ + + /* Pre-additions */ + t00 = L_add(y12, y44); + t02 = L_sub(y12, y44); + t01 = L_add(y13, y45); + t03 = L_sub(y13, y45); + t04 = L_add(y28, y60); + t07 = L_sub(y28, y60); + t05 = L_add(y61, y29); + t06 = L_sub(y61, y29); + + /* Post-additions */ + re[s * 6] = L_add(t00, t04); + move32(); + im[s * 6] = L_add(t01, t05); + move32(); + re[s * 14] = L_sub(t02, t06); + move32(); + im[s * 14] = L_sub(t03, t07); + move32(); + re[s * 22] = L_sub(t00, t04); + move32(); + im[s * 22] = L_sub(t01, t05); + move32(); + re[s * 30] = L_add(t02, t06); + move32(); + im[s * 30] = L_add(t03, t07); + move32(); + + /* 8. FFT4 stage */ + + /* Pre-additions */ + t00 = L_add(y14, y46); + t02 = L_sub(y14, y46); + t01 = L_add(y15, y47); + t03 = L_sub(y15, y47); + t04 = L_add(y30, y62); + t07 = L_sub(y30, y62); + t05 = L_add(y63, y31); + t06 = L_sub(y63, y31); + + /* Post-additions */ + re[s * 7] = L_add(t00, t04); + move32(); + im[s * 7] = L_add(t01, t05); + move32(); + re[s * 15] = L_sub(t02, t06); + move32(); + im[s * 15] = L_sub(t03, t07); + move32(); + re[s * 23] = L_sub(t00, t04); + move32(); + im[s * 23] = L_sub(t01, t05); + move32(); + re[s * 31] = L_add(t02, t06); + move32(); + im[s * 31] = L_add(t03, t07); + move32(); + + Dyn_Mem_Deluxe_Out(); +} + +/** + * \brief Function performs a complex 40-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR40 bits. + * + * \param [i/o] re real part + * \param [i/o] im imag part + * \param [i ] sx stride real and imag part + * + * \return void + */ + + + +static void fft40(Word32 *re, Word32 *im, Word16 sx, Word32 *x) +{ + Dyn_Mem_Deluxe_In(const Word32 *W; Word16 dim1, dim2; Counter i, j; + Word32 x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15; + Word32 t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15; + Word32 s00, s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15;); + + dim1 = 5; + move16(); + dim2 = 8; + move16(); + + W = RotVector_40_32; + + FOR (i = 0; i < dim2; i++) + { + FOR (j = 0; j < dim1; j++) + { + x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2]; + move32(); + x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2]; + move32(); + } + } + + FOR (i = 0; i < dim2; i++) + { + fft5(&x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2); + } + + FOR (i = 0; i < dim1; i++) + { + cplxMpy4_8_1(x00, x01, x[2 * i + 2 * 0 * dim1], x[2 * i + 2 * 0 * dim1 + 1]); + + IF (i == 0) + { + cplxMpy4_8_1(x02, x03, x[2 * i + 2 * 1 * dim1], x[2 * i + 2 * 1 * dim1 + 1]); + cplxMpy4_8_1(x04, x05, x[2 * i + 2 * 2 * dim1], x[2 * i + 2 * 2 * dim1 + 1]); + cplxMpy4_8_1(x06, x07, x[2 * i + 2 * 3 * dim1], x[2 * i + 2 * 3 * dim1 + 1]); + cplxMpy4_8_1(x08, x09, x[2 * i + 2 * 4 * dim1], x[2 * i + 2 * 4 * dim1 + 1]); + cplxMpy4_8_1(x10, x11, x[2 * i + 2 * 5 * dim1], x[2 * i + 2 * 5 * dim1 + 1]); + cplxMpy4_8_1(x12, x13, x[2 * i + 2 * 6 * dim1], x[2 * i + 2 * 6 * dim1 + 1]); + cplxMpy4_8_1(x14, x15, x[2 * i + 2 * 7 * dim1], x[2 * i + 2 * 7 * dim1 + 1]); + } + ELSE + { + cplxMpy4_8_2(x02, x03, x[2 * i + 2 * 1 * dim1], x[2 * i + 2 * 1 * dim1 + 1], W[2 * (i - 1) + 0 * 2 * 4], + W[2 * (i - 1) + 0 * 2 * 4 + 1]); + cplxMpy4_8_2(x04, x05, x[2 * i + 2 * 2 * dim1], x[2 * i + 2 * 2 * dim1 + 1], W[2 * (i - 1) + 1 * 2 * 4], + W[2 * (i - 1) + 1 * 2 * 4 + 1]); + cplxMpy4_8_2(x06, x07, x[2 * i + 2 * 3 * dim1], x[2 * i + 2 * 3 * dim1 + 1], W[2 * (i - 1) + 2 * 2 * 4], + W[2 * (i - 1) + 2 * 2 * 4 + 1]); + cplxMpy4_8_2(x08, x09, x[2 * i + 2 * 4 * dim1], x[2 * i + 2 * 4 * dim1 + 1], W[2 * (i - 1) + 3 * 2 * 4], + W[2 * (i - 1) + 3 * 2 * 4 + 1]); + cplxMpy4_8_2(x10, x11, x[2 * i + 2 * 5 * dim1], x[2 * i + 2 * 5 * dim1 + 1], W[2 * (i - 1) + 4 * 2 * 4], + W[2 * (i - 1) + 4 * 2 * 4 + 1]); + cplxMpy4_8_2(x12, x13, x[2 * i + 2 * 6 * dim1], x[2 * i + 2 * 6 * dim1 + 1], W[2 * (i - 1) + 5 * 2 * 4], + W[2 * (i - 1) + 5 * 2 * 4 + 1]); + cplxMpy4_8_2(x14, x15, x[2 * i + 2 * 7 * dim1], x[2 * i + 2 * 7 * dim1 + 1], W[2 * (i - 1) + 6 * 2 * 4], + W[2 * (i - 1) + 6 * 2 * 4 + 1]); + } + + t00 = L_shr_pos(L_add(x00, x08), SCALEFACTORN2 - 1); + t02 = L_shr_pos(L_sub(x00, x08), SCALEFACTORN2 - 1); + t01 = L_shr_pos(L_add(x01, x09), SCALEFACTORN2 - 1); + t03 = L_shr_pos(L_sub(x01, x09), SCALEFACTORN2 - 1); + t04 = L_shr_pos(L_add(x02, x10), SCALEFACTORN2 - 1); + t06 = L_sub(x02, x10); + t05 = L_shr_pos(L_add(x03, x11), SCALEFACTORN2 - 1); + t07 = L_sub(x03, x11); + t08 = L_shr_pos(L_add(x04, x12), SCALEFACTORN2 - 1); + t10 = L_shr_pos(L_sub(x04, x12), SCALEFACTORN2 - 1); + t09 = L_shr_pos(L_add(x05, x13), SCALEFACTORN2 - 1); + t11 = L_shr_pos(L_sub(x05, x13), SCALEFACTORN2 - 1); + t12 = L_shr_pos(L_add(x06, x14), SCALEFACTORN2 - 1); + t14 = L_sub(x06, x14); + t13 = L_shr_pos(L_add(x07, x15), SCALEFACTORN2 - 1); + t15 = L_sub(x07, x15); + + s00 = L_add(t00, t08); + s04 = L_sub(t00, t08); + s01 = L_add(t01, t09); + s05 = L_sub(t01, t09); + s08 = L_sub(t02, t11); + s10 = L_add(t02, t11); + s09 = L_add(t03, t10); + s11 = L_sub(t03, t10); + s02 = L_add(t04, t12); + s07 = L_sub(t04, t12); + s03 = L_add(t05, t13); + s06 = L_sub(t13, t05); + + t01 = L_shr_pos(L_add(t06, t14), SCALEFACTORN2 - 1); + t02 = L_shr_pos(L_sub(t06, t14), SCALEFACTORN2 - 1); + t00 = L_shr_pos(L_add(t07, t15), SCALEFACTORN2 - 1); + t03 = L_shr_pos(L_sub(t07, t15), SCALEFACTORN2 - 1); + + s12 = Mpy_32_32_lc3plus(L_add(t00, t02), C81_32); + s14 = Mpy_32_32_lc3plus(L_sub(t00, t02), C81_32); + s13 = Mpy_32_32_lc3plus(L_sub(t03, t01), C81_32); + s15 = Mpy_32_32_lc3plus(L_add(t01, t03), C82_32); + + re[sx * i + sx * 0 * dim1] = L_add(s00, s02); + move32(); + im[sx * i + sx * 0 * dim1] = L_add(s01, s03); + move32(); + re[sx * i + sx * 1 * dim1] = L_add(s10, s12); + move32(); + im[sx * i + sx * 1 * dim1] = L_add(s11, s13); + move32(); + re[sx * i + sx * 2 * dim1] = L_sub(s04, s06); + move32(); + im[sx * i + sx * 2 * dim1] = L_sub(s05, s07); + move32(); + re[sx * i + sx * 3 * dim1] = L_add(s08, s14); + move32(); + im[sx * i + sx * 3 * dim1] = L_add(s09, s15); + move32(); + re[sx * i + sx * 4 * dim1] = L_sub(s00, s02); + move32(); + im[sx * i + sx * 4 * dim1] = L_sub(s01, s03); + move32(); + re[sx * i + sx * 5 * dim1] = L_sub(s10, s12); + move32(); + im[sx * i + sx * 5 * dim1] = L_sub(s11, s13); + move32(); + re[sx * i + sx * 6 * dim1] = L_add(s04, s06); + move32(); + im[sx * i + sx * 6 * dim1] = L_add(s05, s07); + move32(); + re[sx * i + sx * 7 * dim1] = L_sub(s08, s14); + move32(); + im[sx * i + sx * 7 * dim1] = L_sub(s09, s15); + move32(); + } + + Dyn_Mem_Deluxe_Out(); +} + +/** + * \brief Combined FFT + * + * \param [i/o] re real part + * \param [i/o] im imag part + * \param [i ] W rotation factor + * \param [i ] dim1 length of fft1 + * \param [i ] dim2 length of fft2 + * \param [i ] sx stride real and imag part + * \param [i ] sc stride phase rotation coefficients + * \param [tmp] x 32-bit workbuffer of length=2*len + * \param [i ] Woff offset for addressing the rotation vector table + * + * \return void + */ + + +static void fftN2(Word32 *re, Word32 *im, +#ifdef ENABLE_HR_MODE + const Word32 *W, +#else + const Word16 *W, +#endif + Word16 dim1, Word16 dim2, Word16 sx, Word16 sc, + Word16 Woff + , Word8 *scratchBuffer +#ifdef ENABLE_FFT_RESCALE + , Word16 *scale +#endif + ) +{ + Dyn_Mem_Deluxe_In(Counter i, j;); + + Word32 *x = scratchAlign(scratchBuffer, 0); + + FOR (i = 0; i < dim2; i++) + { + FOR (j = 0; j < dim1; j++) + { + x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2]; + move32(); + x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2]; + move32(); + } + } + + SWITCH (dim1) + { + + case 4: + FOR (i = 0; i < dim2; i++) + { + fft4(&x[i * 2 * dim1]); + } + BREAK; + case 8: + FOR (i = 0; i < dim2; i++) + { + fft8(&x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2); + } + BREAK; + + case 10: + FOR (i = 0; i < dim2; i++) + { + fft10(&x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2); + } + BREAK; + case 15: + FOR (i = 0; i < dim2; i++) + { + fft15(&x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2); + } + + BREAK; + case 16: + FOR (i = 0; i < dim2; i++) + { + fft16(&x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2); + } + BREAK; + case 20: + FOR (i = 0; i < dim2; i++) + { + fft20(&x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2); + } + BREAK; + case 30: + FOR (i = 0; i < dim2; i++) + { + fft30(&x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2); + } + BREAK; + case 32: + FOR (i = 0; i < dim2; i++) + { + fft32(&x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2); + } + BREAK; +#ifdef ENABLE_HR_MODE +#if (defined LC3_FFT15) + case 60: + FOR (i = 0; i < dim2; i++) + { +#ifndef ENABLE_FFT_RESCALE + fftN2(&x[i * 2 * dim1], &x[i * 2 * dim1 + 1], RotVector_480, 15, 4, sx, 4, 60, scratch); +#else + fftN2(&x[i * 2 * dim1], &x[i * 2 * dim1 + 1], RotVector_480, 15, 4, sx, 4, 60, scratch, NULL); +#endif + } + BREAK; +#endif +#endif + default: ASSERT(0); + } + +#ifdef ENABLE_FFT_RESCALE + IF (scale) + { + *scale = s_max(sub(getScaleFactor32(x, dim1 * dim2 * 2), FFT_RESCALE_HR), 0); move16(); + +#if defined(FUNCTION_scaleValues_32) + scaleValues_32(x, dim1 * dim2, *scale); +#else + FOR (i = 0; i < dim1 * dim2 * 2; i++) + { + x[i] = L_shl_pos(x[i], *scale); move32(); + } + } +#endif +#endif + + SWITCH (dim2) + { + case 4: + { + Word32 x00, x01, x02, x03, x04, x05, x06, x07; + Word32 t00, t01, t02, t03, t04, t05, t06, t07; + + j = add(8, 0); + FOR (i = 0; i < dim1; i++) + { + cplxMpy4_4_1(x00, x01, x[2 * i + 2 * 0 * dim1], x[2 * i + 2 * 0 * dim1 + 1]); + IF (i == 0) + { + cplxMpy4_4_1(x02, x03, x[2 * i + 2 * 1 * dim1], x[2 * i + 2 * 1 * dim1 + 1]); + cplxMpy4_4_1(x04, x05, x[2 * i + 2 * 2 * dim1], x[2 * i + 2 * 2 * dim1 + 1]); + cplxMpy4_4_1(x06, x07, x[2 * i + 2 * 3 * dim1], x[2 * i + 2 * 3 * dim1 + 1]); + } + ELSE + { + cplxMpy4_4_0(x02, x03, x[2 * i + 2 * 1 * dim1], x[2 * i + 2 * 1 * dim1 + 1], + W[sc * i + j * 1 * dim1 - Woff], W[sc * i + j * 1 * dim1 + 1 - Woff]); + cplxMpy4_4_0(x04, x05, x[2 * i + 2 * 2 * dim1], x[2 * i + 2 * 2 * dim1 + 1], + W[sc * i + j * 2 * dim1 - Woff], W[sc * i + j * 2 * dim1 + 1 - Woff]); + cplxMpy4_4_0(x06, x07, x[2 * i + 2 * 3 * dim1], x[2 * i + 2 * 3 * dim1 + 1], + W[sc * i + j * 3 * dim1 - Woff], W[sc * i + j * 3 * dim1 + 1 - Woff]); + } + + t00 = L_add(x00, x04); + t02 = L_sub(x00, x04); + t01 = L_add(x01, x05); + t03 = L_sub(x01, x05); + t04 = L_add(x02, x06); + t07 = L_sub(x02, x06); + t05 = L_add(x07, x03); + t06 = L_sub(x07, x03); + + re[sx * i + sx * 0 * dim1] = L_add(t00, t04); + move32(); + im[sx * i + sx * 0 * dim1] = L_add(t01, t05); + move32(); + re[sx * i + sx * 1 * dim1] = L_sub(t02, t06); + move32(); + im[sx * i + sx * 1 * dim1] = L_sub(t03, t07); + move32(); + re[sx * i + sx * 2 * dim1] = L_sub(t00, t04); + move32(); + im[sx * i + sx * 2 * dim1] = L_sub(t01, t05); + move32(); + re[sx * i + sx * 3 * dim1] = L_add(t02, t06); + move32(); + im[sx * i + sx * 3 * dim1] = L_add(t03, t07); + move32(); + } + + BREAK; + } + + case 6: + { + Word32 y[2 * 10]; + FOR (j = 0; j < dim2; j++) + { + cplxMpy4_12_1(y[2 * j], y[2 * j + 1], x[2 * 0 + 2 * j * dim1], x[2 * 0 + 2 * j * dim1 + 1]); + } + fft6(&y[0], &y[1], 2); + FOR (j = 0; j < dim2; j++) + { + re[sx * 0 + sx * j * dim1] = y[2 * j]; + move32(); + im[sx * 0 + sx * j * dim1] = y[2 * j + 1]; + move32(); + } + + FOR (i = 1; i < dim1; i++) + { + cplxMpy4_12_1(y[2 * (0 + 0)], y[2 * (0 + 0) + 1], x[2 * i + 2 * (0 + 0) * dim1], + x[2 * i + 2 * (0 + 0) * dim1 + 1]); + cplxMpy4_12_0(y[2 * (0 + 1)], y[2 * (0 + 1) + 1], x[2 * i + 2 * (0 + 1) * dim1], + x[2 * i + 2 * (0 + 1) * dim1 + 1], W[sc * i + sc * (0 + 1) * dim1 - Woff], + W[sc * i + sc * (0 + 1) * dim1 + 1 - Woff]); + FOR (j = 2; j < dim2; j = j + 2) + { + cplxMpy4_12_0(y[2 * (j + 0)], y[2 * (j + 0) + 1], x[2 * i + 2 * (j + 0) * dim1], + x[2 * i + 2 * (j + 0) * dim1 + 1], W[sc * i + sc * (j + 0) * dim1 - Woff], + W[sc * i + sc * (j + 0) * dim1 + 1 - Woff]); + cplxMpy4_12_0(y[2 * (j + 1)], y[2 * (j + 1) + 1], x[2 * i + 2 * (j + 1) * dim1], + x[2 * i + 2 * (j + 1) * dim1 + 1], W[sc * i + sc * (j + 1) * dim1 - Woff], + W[sc * i + sc * (j + 1) * dim1 + 1 - Woff]); + } + fft6(&y[0], &y[1], 2); + FOR (j = 0; j < dim2; j++) + { + re[sx * i + sx * j * dim1] = y[2 * j]; + move32(); + im[sx * i + sx * j * dim1] = y[2 * j + 1]; + move32(); + } + } + BREAK; + } + + case 8: + { + Word32 x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15; + Word32 t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15; + Word32 s00, s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15; + + FOR (i = 0; i < dim1; i++) + { + cplxMpy4_8_1(x00, x01, x[2 * i + 2 * 0 * dim1], x[2 * i + 2 * 0 * dim1 + 1]); + IF (i == 0) + { + cplxMpy4_8_1(x02, x03, x[2 * i + 2 * 1 * dim1], x[2 * i + 2 * 1 * dim1 + 1]); + cplxMpy4_8_1(x04, x05, x[2 * i + 2 * 2 * dim1], x[2 * i + 2 * 2 * dim1 + 1]); + cplxMpy4_8_1(x06, x07, x[2 * i + 2 * 3 * dim1], x[2 * i + 2 * 3 * dim1 + 1]); + cplxMpy4_8_1(x08, x09, x[2 * i + 2 * 4 * dim1], x[2 * i + 2 * 4 * dim1 + 1]); + cplxMpy4_8_1(x10, x11, x[2 * i + 2 * 5 * dim1], x[2 * i + 2 * 5 * dim1 + 1]); + cplxMpy4_8_1(x12, x13, x[2 * i + 2 * 6 * dim1], x[2 * i + 2 * 6 * dim1 + 1]); + cplxMpy4_8_1(x14, x15, x[2 * i + 2 * 7 * dim1], x[2 * i + 2 * 7 * dim1 + 1]); + } + ELSE + { + cplxMpy4_8_0(x02, x03, x[2 * i + 2 * 1 * dim1], x[2 * i + 2 * 1 * dim1 + 1], + W[sc * i + sc * 1 * dim1 - Woff], W[sc * i + sc * 1 * dim1 + 1 - Woff]); + cplxMpy4_8_0(x04, x05, x[2 * i + 2 * 2 * dim1], x[2 * i + 2 * 2 * dim1 + 1], + W[sc * i + sc * 2 * dim1 - Woff], W[sc * i + sc * 2 * dim1 + 1 - Woff]); + cplxMpy4_8_0(x06, x07, x[2 * i + 2 * 3 * dim1], x[2 * i + 2 * 3 * dim1 + 1], + W[sc * i + sc * 3 * dim1 - Woff], W[sc * i + sc * 3 * dim1 + 1 - Woff]); + cplxMpy4_8_0(x08, x09, x[2 * i + 2 * 4 * dim1], x[2 * i + 2 * 4 * dim1 + 1], + W[sc * i + sc * 4 * dim1 - Woff], W[sc * i + sc * 4 * dim1 + 1 - Woff]); + cplxMpy4_8_0(x10, x11, x[2 * i + 2 * 5 * dim1], x[2 * i + 2 * 5 * dim1 + 1], + W[sc * i + sc * 5 * dim1 - Woff], W[sc * i + sc * 5 * dim1 + 1 - Woff]); + cplxMpy4_8_0(x12, x13, x[2 * i + 2 * 6 * dim1], x[2 * i + 2 * 6 * dim1 + 1], + W[sc * i + sc * 6 * dim1 - Woff], W[sc * i + sc * 6 * dim1 + 1 - Woff]); + cplxMpy4_8_0(x14, x15, x[2 * i + 2 * 7 * dim1], x[2 * i + 2 * 7 * dim1 + 1], + W[sc * i + sc * 7 * dim1 - Woff], W[sc * i + sc * 7 * dim1 + 1 - Woff]); + } + + t00 = L_shr_pos(L_add(x00, x08), SCALEFACTORN2 - 1); + t02 = L_shr_pos(L_sub(x00, x08), SCALEFACTORN2 - 1); + t01 = L_shr_pos(L_add(x01, x09), SCALEFACTORN2 - 1); + t03 = L_shr_pos(L_sub(x01, x09), SCALEFACTORN2 - 1); + t04 = L_shr_pos(L_add(x02, x10), SCALEFACTORN2 - 1); + t06 = L_sub(x02, x10); + t05 = L_shr_pos(L_add(x03, x11), SCALEFACTORN2 - 1); + t07 = L_sub(x03, x11); + t08 = L_shr_pos(L_add(x04, x12), SCALEFACTORN2 - 1); + t10 = L_shr_pos(L_sub(x04, x12), SCALEFACTORN2 - 1); + t09 = L_shr_pos(L_add(x05, x13), SCALEFACTORN2 - 1); + t11 = L_shr_pos(L_sub(x05, x13), SCALEFACTORN2 - 1); + t12 = L_shr_pos(L_add(x06, x14), SCALEFACTORN2 - 1); + t14 = L_sub(x06, x14); + t13 = L_shr_pos(L_add(x07, x15), SCALEFACTORN2 - 1); + t15 = L_sub(x07, x15); + + s00 = L_add(t00, t08); + s04 = L_sub(t00, t08); + s01 = L_add(t01, t09); + s05 = L_sub(t01, t09); + s08 = L_sub(t02, t11); + s10 = L_add(t02, t11); + s09 = L_add(t03, t10); + s11 = L_sub(t03, t10); + s02 = L_add(t04, t12); + s07 = L_sub(t04, t12); + s03 = L_add(t05, t13); + s06 = L_sub(t13, t05); + + t01 = L_shr_pos(L_add(t06, t14), SCALEFACTORN2 - 1); + t02 = L_shr_pos(L_sub(t06, t14), SCALEFACTORN2 - 1); + t00 = L_shr_pos(L_add(t07, t15), SCALEFACTORN2 - 1); + t03 = L_shr_pos(L_sub(t07, t15), SCALEFACTORN2 - 1); + + s12 = Mpy_32_xx(L_add(t00, t02), C81); + s14 = Mpy_32_xx(L_sub(t00, t02), C81); + s13 = Mpy_32_xx(L_sub(t03, t01), C81); + s15 = Mpy_32_xx(L_add(t01, t03), C82); + + re[sx * i + sx * 0 * dim1] = L_add(s00, s02); + move32(); + im[sx * i + sx * 0 * dim1] = L_add(s01, s03); + move32(); + re[sx * i + sx * 1 * dim1] = L_add(s10, s12); + move32(); + im[sx * i + sx * 1 * dim1] = L_add(s11, s13); + move32(); + re[sx * i + sx * 2 * dim1] = L_sub(s04, s06); + move32(); + im[sx * i + sx * 2 * dim1] = L_sub(s05, s07); + move32(); + re[sx * i + sx * 3 * dim1] = L_add(s08, s14); + move32(); + im[sx * i + sx * 3 * dim1] = L_add(s09, s15); + move32(); + re[sx * i + sx * 4 * dim1] = L_sub(s00, s02); + move32(); + im[sx * i + sx * 4 * dim1] = L_sub(s01, s03); + move32(); + re[sx * i + sx * 5 * dim1] = L_sub(s10, s12); + move32(); + im[sx * i + sx * 5 * dim1] = L_sub(s11, s13); + move32(); + re[sx * i + sx * 6 * dim1] = L_add(s04, s06); + move32(); + im[sx * i + sx * 6 * dim1] = L_add(s05, s07); + move32(); + re[sx * i + sx * 7 * dim1] = L_sub(s08, s14); + move32(); + im[sx * i + sx * 7 * dim1] = L_sub(s09, s15); + move32(); + } + BREAK; + } + + case 12: + { + Word32 y[2 * 20]; + FOR (j = 0; j < dim2; j++) + { + cplxMpy4_12_1(y[2 * j], y[2 * j + 1], x[2 * 0 + 2 * j * dim1], x[2 * 0 + 2 * j * dim1 + 1]); + } + fft12(y); + FOR (j = 0; j < dim2; j++) + { + re[sx * 0 + sx * j * dim1] = y[2 * j]; + move32(); + im[sx * 0 + sx * j * dim1] = y[2 * j + 1]; + move32(); + } + + FOR (i = 1; i < dim1; i++) + { + cplxMpy4_12_1(y[2 * (0 + 0)], y[2 * (0 + 0) + 1], x[2 * i + 2 * (0 + 0) * dim1], + x[2 * i + 2 * (0 + 0) * dim1 + 1]); + cplxMpy4_12_0(y[2 * (0 + 1)], y[2 * (0 + 1) + 1], x[2 * i + 2 * (0 + 1) * dim1], + x[2 * i + 2 * (0 + 1) * dim1 + 1], W[sc * i + sc * (0 + 1) * dim1 - Woff], + W[sc * i + sc * (0 + 1) * dim1 + 1 - Woff]); + FOR (j = 2; j < dim2; j = j + 2) + { + cplxMpy4_12_0(y[2 * (j + 0)], y[2 * (j + 0) + 1], x[2 * i + 2 * (j + 0) * dim1], + x[2 * i + 2 * (j + 0) * dim1 + 1], W[sc * i + sc * (j + 0) * dim1 - Woff], + W[sc * i + sc * (j + 0) * dim1 + 1 - Woff]); + cplxMpy4_12_0(y[2 * (j + 1)], y[2 * (j + 1) + 1], x[2 * i + 2 * (j + 1) * dim1], + x[2 * i + 2 * (j + 1) * dim1 + 1], W[sc * i + sc * (j + 1) * dim1 - Woff], + W[sc * i + sc * (j + 1) * dim1 + 1 - Woff]); + } + fft12(y); + FOR (j = 0; j < dim2; j++) + { + re[sx * i + sx * j * dim1] = y[2 * j]; + move32(); + im[sx * i + sx * j * dim1] = y[2 * j + 1]; + move32(); + } + } + BREAK; + } + +#if defined(ENABLE_HR_MODE) + case 16: + { + Word32 y[2 * 20]; + FOR (j = 0; j < dim2; j++) + { + cplxMpy4_16_1(y[2 * j], y[2 * j + 1], x[2 * 0 + 2 * j * dim1], x[2 * 0 + 2 * j * dim1 + 1]); + } + + fft16(&y[0], &y[1], 2); + FOR (j = 0; j < dim2; j++) + { + re[sx * 0 + sx * j * dim1] = y[2 * j]; + move32(); + im[sx * 0 + sx * j * dim1] = y[2 * j + 1]; + move32(); + } + + FOR (i = 1; i < dim1; i++) + { + cplxMpy4_16_1(y[2 * (0 + 0)], y[2 * (0 + 0) + 1], x[2 * i + 2 * (0 + 0) * dim1], + x[2 * i + 2 * (0 + 0) * dim1 + 1]); + cplxMpy4_16_0(y[2 * (0 + 1)], y[2 * (0 + 1) + 1], x[2 * i + 2 * (0 + 1) * dim1], + x[2 * i + 2 * (0 + 1) * dim1 + 1], W[sc * i + sc * (0 + 1) * dim1 - Woff], + W[sc * i + sc * (0 + 1) * dim1 + 1 - Woff]); + FOR (j = 2; j < dim2; j = j + 2) + { + cplxMpy4_16_0(y[2 * (j + 0)], y[2 * (j + 0) + 1], x[2 * i + 2 * (j + 0) * dim1], + x[2 * i + 2 * (j + 0) * dim1 + 1], W[sc * i + sc * (j + 0) * dim1 - Woff], + W[sc * i + sc * (j + 0) * dim1 + 1 - Woff]); + cplxMpy4_16_0(y[2 * (j + 1)], y[2 * (j + 1) + 1], x[2 * i + 2 * (j + 1) * dim1], + x[2 * i + 2 * (j + 1) * dim1 + 1], W[sc * i + sc * (j + 1) * dim1 - Woff], + W[sc * i + sc * (j + 1) * dim1 + 1 - Woff]); + } + fft16(&y[0], &y[1], 2); + FOR (j = 0; j < dim2; j++) + { + re[sx * i + sx * j * dim1] = y[2 * j]; + move32(); + im[sx * i + sx * j * dim1] = y[2 * j + 1]; + move32(); + } + } + BREAK; + } +#endif + default: ASSERT(0); + } + + Dyn_Mem_Deluxe_Out(); +} + +/** + * \brief Complex valued FFT + * + * \param [i/o] re real part + * \param [i/o] im imag part + * \param [i ] sizeOfFft length of fft + * \param [i ] s stride real and imag part + * \param [i ] scale scalefactor + * + * \return void + */ + + + +/* x is the scratch buffer */ +void BASOP_cfft(Word32 *re, Word32 *im, Word16 length, Word16 s, Word16 *scale, Word32 *x) +{ +#if (defined ENABLE_FFT_RESCALE) && ((defined LC3_FFT30) || (defined ENABLE_HR_MODE)) + Word16 fftN2scale = 0; +#endif + +#ifdef ENABLE_HR_MODE + Word8 scratch[6128] = {0}; +#else + Word8 scratch[4068] = {0}; +#endif + + SWITCH (length) + { + + case 10: + fft10(re, im, s); + *scale = add(*scale, SCALEFACTOR10); + move16(); + BREAK; +#ifdef CR9_C_ADD_1p25MS + case 15: + fft15(re, im, s); + *scale = add(*scale, SCALEFACTOR15); + move16(); + BREAK; +#endif + case 16: + fft16(re, im, s); + *scale = add(*scale, SCALEFACTOR16); + move16(); + BREAK; + case 20: + fft20(re, im, s); + *scale = add(*scale, SCALEFACTOR20); + move16(); + BREAK; + case 30: + fft30(re, im, s); + *scale = add(*scale, SCALEFACTOR30); + move16(); + BREAK; + case 32: + fft32(re, im, s); + *scale = add(*scale, SCALEFACTOR32); + move16(); + BREAK; + case 40: + fft40(re, im, s, x); + *scale = add(*scale, SCALEFACTOR40); + move16(); + BREAK; + case 48: +#ifndef ENABLE_FFT_RESCALE + fftN2(re, im, RotVector_32_12, 4, 12, s, 16, 64, scratch); +#else + fftN2(re, im, RotVector_32_12, 4, 12, s, 16, 64, scratch, NULL); +#endif + *scale = add(*scale, SCALEFACTOR48); + move16(); + BREAK; + case 60: +#ifndef ENABLE_FFT_RESCALE + fftN2(re, im, RotVector_480, 15, 4, s, 4, 60, scratch); +#else + fftN2(re, im, RotVector_480, 15, 4, s, 4, 60, scratch, NULL); +#endif + *scale = add(*scale, SCALEFACTOR60); + move16(); + BREAK; + case 64: +#ifndef ENABLE_FFT_RESCALE + fftN2(re, im, RotVector_32_8, 8, 8, s, 8, 64, scratch); +#else + fftN2(re, im, RotVector_32_8, 8, 8, s, 8, 64, scratch, NULL); +#endif + *scale = add(*scale, SCALEFACTOR64); + move16(); + BREAK; + case 80: +#ifndef ENABLE_FFT_RESCALE + fftN2(re, im, RotVector_320, 10, 8, s, 4, 40, scratch); +#else + fftN2(re, im, RotVector_320, 10, 8, s, 4, 40, scratch, NULL); +#endif + *scale = add(*scale, SCALEFACTOR80); + move16(); + BREAK; + case 90: +#ifndef ENABLE_FFT_RESCALE + fftN2(re, im, RotVector_15_6, 15, 6, s, 2, 30, scratch); +#else + fftN2(re, im, RotVector_15_6, 15, 6, s, 2, 30, scratch, NULL); +#endif + *scale = add(*scale, SCALEFACTOR90); + move16(); + BREAK; + + case 120: +#ifndef ENABLE_FFT_RESCALE + fftN2(re, im, RotVector_480, 15, 8, s, 4, 60, scratch); +#else + fftN2(re, im, RotVector_480, 15, 8, s, 4, 60, scratch, NULL); +#endif + *scale = add(*scale, SCALEFACTOR120); + move16(); + BREAK; + case 128: +#ifndef ENABLE_FFT_RESCALE + fftN2(re, im, RotVector_32_8, 16, 8, s, 4, 64, scratch); +#else + fftN2(re, im, RotVector_32_8, 16, 8, s, 4, 64, scratch, NULL); +#endif + *scale = add(*scale, SCALEFACTOR128); + move16(); + BREAK; + case 160: +#ifndef ENABLE_FFT_RESCALE + fftN2(re, im, RotVector_320, 20, 8, s, 2, 40, scratch); +#else + fftN2(re, im, RotVector_320, 20, 8, s, 2, 40, scratch, NULL); +#endif + *scale = add(*scale, SCALEFACTOR160); + move16(); + BREAK; + case 180: +#ifndef ENABLE_FFT_RESCALE + fftN2(re, im, RotVector_360, 15, 12, s, 4, 60, scratch); + *scale = add(*scale, SCALEFACTOR180); +#else + fftN2(re, im, RotVector_360, 15, 12, s, 4, 60, scratch, &fftN2scale); + *scale = add(*scale, SCALEFACTOR180); + *scale = sub(*scale, fftN2scale); move16(); +#endif + + move16(); + BREAK; + case 192: +#ifndef ENABLE_FFT_RESCALE + fftN2(re, im, RotVector_32_12, 16, 12, s, 4, 64, scratch); +#else + fftN2(re, im, RotVector_32_12, 16, 12, s, 4, 64, scratch, NULL); +#endif + *scale = add(*scale, SCALEFACTOR192); + move16(); + BREAK; + case 240: +#ifndef ENABLE_FFT_RESCALE + fftN2(re, im, RotVector_480, 30, 8, s, 2, 60, scratch); + *scale = add(*scale, SCALEFACTOR240); +#else + fftN2(re, im, RotVector_480, 30, 8, s, 2, 60, scratch, &fftN2scale); + *scale = add(*scale, SCALEFACTOR240); + *scale = sub(*scale, fftN2scale); move16(); +#endif + move16(); + BREAK; + case 256: +#ifndef ENABLE_FFT_RESCALE + fftN2(re, im, RotVector_32_8, 32, 8, s, 2, 64, scratch); +#else + fftN2(re, im, RotVector_32_8, 32, 8, s, 2, 64, scratch, NULL); +#endif + *scale = add(*scale, SCALEFACTOR256); + move16(); + BREAK; + case 384: +#ifndef ENABLE_FFT_RESCALE + fftN2(re, im, RotVector_32_12, 32, 12, s, 2, 64, scratch); +#else + fftN2(re, im, RotVector_32_12, 32, 12, s, 2, 64, scratch, NULL); +#endif + *scale = add(*scale, SCALEFACTOR384); + move16(); + BREAK; +#ifdef ENABLE_HR_MODE + case 360: + fftN2(re, im, RotVector_720, 30, 12, s, 2, 60, scratch, &fftN2scale); + *scale = add(*scale, SCALEFACTOR360); move16(); + *scale = sub(*scale, fftN2scale); move16(); + BREAK; + case 480: +#ifndef ENABLE_FFT_RESCALE +#ifndef ENABLE_FFT_30X16 + fftN2(re, im, RotVector_960, 60, 8, s, 2, 120, scratch); +#else + fftN2(re, im, RotVector_30_16, 30, 16, s, 2, 60, scratch); +#endif + *scale = add(*scale, SCALEFACTOR480); move16(); +#else +#ifndef ENABLE_FFT_30X16 + fftN2(re, im, RotVector_960, 60, 8, s, 2, 120, scratch, &fftN2scale); +#else + fftN2(re, im, RotVector_30_16, 30, 16, s, 2, 60, scratch, &fftN2scale); +#endif + *scale = add(*scale, SCALEFACTOR480); move16(); + *scale = sub(*scale, fftN2scale); move16(); +#endif + BREAK; +#endif + default: ASSERT(0); + } +} + + +#define RFFT_TWIDDLE1(x, t1, t2, t3, t4, w1, w2, xb0, xb1, xt0, xt1) \ + do \ + { \ + xb0 = L_shr_pos(x[2 * i + 0], 2); \ + xb1 = L_shr_pos(x[2 * i + 1], 2); \ + xt0 = L_shr_pos(x[sizeOfFft - 2 * i + 0], 2); \ + xt1 = L_shr_pos(x[sizeOfFft - 2 * i + 1], 2); \ + t1 = L_sub(xb0, xt0); \ + t2 = L_add(xb1, xt1); \ + t3 = L_sub(Mpy_32_32_lc3plus(t1, w1), Mpy_32_32_lc3plus(t2, w2)); \ + t4 = L_add(Mpy_32_32_lc3plus(t1, w2), Mpy_32_32_lc3plus(t2, w1)); \ + t1 = L_add(xb0, xt0); \ + t2 = L_sub(xb1, xt1); \ + } while (0) + +#define RFFT_TWIDDLE2(x, t1, t2, t3, t4, w1, w2, xb0, xb1, xt0, xt1) \ + do \ + { \ + xb0 = L_shr_pos(x[2 * i + 0], 2); \ + xb1 = L_shr_pos(x[2 * i + 1], 2); \ + xt0 = L_shr_pos(x[sizeOfFft - 2 * i + 0], 2); \ + xt1 = L_shr_pos(x[sizeOfFft - 2 * i + 1], 2); \ + t1 = L_sub(xb0, xt0); \ + t2 = L_add(xb1, xt1); \ + t3 = L_add(Mpy_32_32_lc3plus(t1, w1), Mpy_32_32_lc3plus(t2, w2)); \ + t4 = L_sub(Mpy_32_32_lc3plus(t2, w1), Mpy_32_32_lc3plus(t1, w2)); \ + t1 = L_add(xb0, xt0); \ + t2 = L_sub(xb1, xt1); \ + } while (0) + + + +static const Word32 *rfft_twid(int size) +{ + SWITCH (size) + { + case 32: return RealFFT32_twid; + case 40: return RealFFT40_twid; + case 64: return RealFFT64_twid; + case 80: return RealFFT80_twid; + case 96: return RealFFT96_twid; + case 128: return RealFFT128_twid; + case 192: return RealFFT192_twid; + case 256: return RealFFT256_twid; + case 384: return RealFFT384_twid; + case 512: return RealFFT512_twid; + case 768: return RealFFT768_twid; + default: ASSERT(0); + } + return NULL; +} + + +void BASOP_rfftN(Word32 *x, Word16 sizeOfFft, Word16 *scale, Word8 *scratchBuffer) +{ + Dyn_Mem_Deluxe_In(Counter i; Word16 sizeOfFft2, sizeOfFft4, sizeOfFft8; Word32 t1, t2, t3, t4, xb0, xb1, xt0, xt1; + Word32 * workBuffer; const Word32 *w32;); + + workBuffer = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 4 * sizeOfFft */ + w32 = rfft_twid(sizeOfFft); + + sizeOfFft2 = shr_pos(sizeOfFft, 1); + sizeOfFft4 = shr_pos(sizeOfFft, 2); + sizeOfFft8 = shr_pos(sizeOfFft, 3); + + BASOP_cfft(&x[0], &x[1], sizeOfFft2, 2, scale, workBuffer); + + xb0 = L_shr_pos(x[0], 1); + xb1 = L_shr_pos(x[1], 1); + x[0] = L_add(xb0, xb1); + move32(); + x[1] = L_sub(xb0, xb1); + move32(); + + FOR (i = 1; i < sizeOfFft8; i++) + { + RFFT_TWIDDLE1(x, t1, t2, t3, t4, w32[2 * i + 1], w32[2 * i], xb0, xb1, xt0, xt1); + x[2 * i] = L_sub(t1, t3); + move32(); + x[2 * i + 1] = L_sub(t2, t4); + move32(); + x[sizeOfFft - 2 * i] = L_add(t1, t3); + move32(); + x[sizeOfFft - 2 * i + 1] = L_negate(L_add(t2, t4)); + move32(); + } + + FOR (i = sizeOfFft8; i < sizeOfFft4; i++) + { + RFFT_TWIDDLE1(x, t1, t2, t3, t4, w32[(2 * sizeOfFft4 - 2 * i)], w32[(2 * sizeOfFft4 - 2 * i + 1)], xb0, xb1, + xt0, xt1); + x[2 * i] = L_sub(t1, t3); + move32(); + x[2 * i + 1] = L_sub(t2, t4); + move32(); + x[sizeOfFft - 2 * i] = L_add(t1, t3); + move32(); + x[sizeOfFft - 2 * i + 1] = L_negate(L_add(t2, t4)); + move32(); + } + + x[sizeOfFft - 2 * i] = L_shr_pos(x[2 * i + 0], 1); + move32(); + x[sizeOfFft - 2 * i + 1] = L_negate(L_shr_pos(x[2 * i + 1], 1)); + move32(); + + *scale = add(*scale, 1); + move16(); + + Dyn_Mem_Deluxe_Out(); +} + + + +void BASOP_irfftN(Word32 *x, Word16 sizeOfFft, Word16 *scale, Word8 *scratchBuffer) +{ + Dyn_Mem_Deluxe_In(Word16 sizeOfFft2, sizeOfFft4, sizeOfFft8; Word32 t1, t2, t3, t4, xb0, xb1, xt0, xt1; + Word32 * workBuffer; const Word32 *w32; Counter i;); + + workBuffer = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * BASOP_CFFT_MAX_LENGTH */ + + w32 = rfft_twid(sizeOfFft); + + sizeOfFft2 = shr_pos(sizeOfFft, 1); + sizeOfFft4 = shr_pos(sizeOfFft, 2); + sizeOfFft8 = shr_pos(sizeOfFft, 3); + + xb0 = L_shr_pos(x[0], 2); + xb1 = L_shr_pos(x[1], 2); + x[0] = L_add(xb0, xb1); + move32(); + x[1] = L_sub(xb1, xb0); + move32(); + + FOR (i = 1; i < sizeOfFft8; i++) + { + RFFT_TWIDDLE2(x, t1, t2, t3, t4, w32[2 * i + 1], w32[2 * i], xb0, xb1, xt0, xt1); + x[2 * i] = L_sub(t1, t3); + move32(); + x[2 * i + 1] = L_sub(t4, t2); + move32(); + x[sizeOfFft - 2 * i] = L_add(t1, t3); + move32(); + x[sizeOfFft - 2 * i + 1] = L_add(t2, t4); + move32(); + } + + FOR (i = sizeOfFft8; i < sizeOfFft4; i++) + { + RFFT_TWIDDLE2(x, t1, t2, t3, t4, w32[(2 * sizeOfFft4 - 2 * i)], w32[(2 * sizeOfFft4 - 2 * i + 1)], xb0, xb1, + xt0, xt1); + x[2 * i] = L_sub(t1, t3); + move32(); + x[2 * i + 1] = L_sub(t4, t2); + move32(); + x[sizeOfFft - 2 * i] = L_add(t1, t3); + move32(); + x[sizeOfFft - 2 * i + 1] = L_add(t2, t4); + move32(); + } + + x[sizeOfFft - 2 * i] = L_shr_pos(x[2 * i + 0], 1); + move32(); + x[sizeOfFft - 2 * i + 1] = L_shr_pos(x[2 * i + 1], 1); + move32(); + + BASOP_cfft(&x[0], &x[1], sizeOfFft2, 2, scale, workBuffer); + + /* If you want BASOP_irfft to be inverse to BASOP_rfft then the result needs + * to be normalised by sizeOfFft */ + FOR (i = 0; i < sizeOfFft2; i++) + { + x[2 * i + 1] = L_negate(x[2 * i + 1]); + move32(); + } + + *scale = add(*scale, 2); + move16(); + + Dyn_Mem_Deluxe_Out(); +} + + diff --git a/lib_lc3plus/functions.h b/lib_lc3plus/functions.h new file mode 100644 index 0000000000000000000000000000000000000000..38b32769d0954d613be18a6149aac4a4f8b49e89 --- /dev/null +++ b/lib_lc3plus/functions.h @@ -0,0 +1,952 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#ifndef FUNCTIONS_H +#define FUNCTIONS_H + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" + +#include "stl.h" +#ifdef DYNMEM_COUNT +#include "dynmem.h" +#endif + +#include "basop_util_lc3plus.h" +#include "constants.h" +#include "lc3plus.h" +#include "setup_dec_lc3plus.h" /* for decoder state handle ptr */ +#include "setup_enc_lc3plus.h" /* for encoder state handle ptr */ +#include "basop_mpy_lc3plus.h" + +#include +#include +#include +#include +#include + +#define PRINTF printf /* C console debug, */ +#define ASSERT(test) assert(test) + +typedef struct +{ + Word16 lead_sign_ind; /* this MPVQ index is the first part of the total PVQ index */ + UWord32 index, size; /* this MPVQ index is the second part of the total PVQ index */ + Word16 dim, k_val; + Word16 vec[PVQ_MAX_VEC_SIZE]; /* integer vector */ +} PvqEntry_fx; + +typedef enum { + LC3_CON_TEC_NS_STD, /* 0 */ + LC3_CON_TEC_PHASE_ECU, /* 2 */ + LC3_CON_TEC_TDPLC, /* 3 */ + LC3_CON_TEC_NS_ADV, /* 4 */ + LC3_CON_TEC_FREQ_MUTING, /* 5 */ +} LC3_ConcealTechnique; + +void WarnMsg(char *msg); +void ExitMsg(char *msg); +void AssertMsg(int true_flag, char *msg); + +Word16 getLastNzBits_fx (Word16 N); +void dct16_W32int_fx(const Word16 *in, Word16 *out); + +void processTnsDecoder_fx(Word16 rc_idx[], Word32 x[], Word16 xLen, Word16 order[], Word16 *x_e, Word16 BW_stopband_idx, + LC3PLUS_FrameDuration frame_dms, Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +); + +void processTnsCoder_fx(Word16 *bits, Word16 indexes[], Word32 x[], Word16 BW_cutoff_idx, Word16 order[], + Word16 *numfilters, Word16 enable_lpc_weighting, Word16 nSubdivisions, LC3PLUS_FrameDuration frame_dms, + Word16 max_len, Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif + , Word16 near_nyquist_flag +); + +void TnsUpdate_fx(Word16 *tns_numfilters, Word16 *long_startfreq, const Word16 **subdiv_startfreq, + const Word16 **subdiv_stopfreq, Word16 frame_length, Word16 tab_idx); + +void processResidualDecoding_fx(Word32 spectrum[], Word16 spectrum_e, Word16 L_spec, UWord8 prm[], Word16 resQBits +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +#ifdef CR9_C_ADD_1p25MS + , LC3PLUS_FrameDuration frame_dms +#endif +); + +void processPreemph_fx(Word16 *x, Word16 len, Word16 mem[], Word16 memLen, Word16 out[], Word16 *outLen, Word16 mu); + +void processNoiseFilling_fx(Word32 xq[], Word16 nfseed, Word16 xq_e, Word16 fac_ns_idx, Word16 BW_cutoff_idx, + LC3PLUS_FrameDuration frame_dms, Word16 fac_ns_pc, Word16 spec_inv_idx, Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +); + +void processNoiseFactor_fx(Word16 *fac_ns_idx, Word16 x_e, Word32 x[], +#ifdef ENABLE_HR_MODE + Word32 xq[], +#else + Word16 xq[], +#endif + Word16 gg, Word16 gg_e, Word16 BW_cutoff_idx, LC3PLUS_FrameDuration frame_dms, Word16 target_bytes, + Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +); + +void processMdctShaping_fx(Word32 x[], +#ifdef ENABLE_HR_MODE + Word32 scf[], +#else + Word16 scf[], +#endif + Word16 scf_exp[], const Word16 bands_offset[], Word16 fdns_npts); + +void processScfScaling(Word16 scf_exp[], Word16 fdns_npts, Word16 *x_e); + +void processMdct_fx( +#ifdef ENABLE_HR_MODE + Word32 x[], +#else + Word16 x[], +#endif + Word16 x_exp, Word16 N, +#ifdef ENABLE_HR_MODE + Word16 hrmode, /* i: indicate high precision */ +#endif +#ifdef ENABLE_HR_MODE + const Word32 w[], /* i: window coefficients including normalization of sqrt(2/N) and scaled by 2^4 */ +#else + const Word16 w[], /* i: window coefficients including normalization of sqrt(2/N) and scaled by 2^4 */ +#endif + Word16 wLen, +#ifdef ENABLE_HR_MODE + Word32 mem[], /* i/o: last block of input samples */ +#else + Word16 mem[], /* i/o: last block of input samples */ +#endif + Word16 memLen, + Word32 y[], Word16 *y_e, Word8 *scratchBuffer); + +void processLevinson_fx(Word32 *lpc, Word32 *ac, Word16 N, Word16 *rc, Word32 *pred_err, Word8 *scratchBuffer); + +void lpc2rc(Word32 *lpc, Word16 *rc, Word16 N); + +void ProcessingIMDCT(Word32 y[], Word16 *y_e, +#ifdef ENABLE_HR_MODE + const Word32 w[], /* i: window coefficients including normalization of sqrt(2/N) and scaled by 2^4 */ + Word32 mem[], /* i/o: overlap add memory */ +#else + const Word16 w[], /* i: window coefficients including normalization of sqrt(2/N) and scaled by 2^4 */ + Word16 mem[], /* i/o: overlap add memory */ +#endif + Word16 *mem_e, +#ifdef ENABLE_HR_MODE + Word32 x[], /* o: time signal out */ +#else + Word16 x[], /* o: time signal out */ +#endif + Word16 wLen, + Word16 N, Word16 memLen, LC3PLUS_FrameDuration frame_dms, + Word16 concealMethod, Word16 bfi, Word16 prev_bfi, Word16 nbLostFramesInRow, AplcSetup *plcAd, + Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +); + +#ifdef ENABLE_HR_MODE +void dct_IV(Word32 *pDat, Word16 *pDat_e, Word16 L, Word16 hrmode, Word32 *workBuffer); +#else +void dct_IV(Word32 *pDat, Word16 *pDat_e, Word16 L, Word32 *workBuffer); +#endif + +#ifdef ENABLE_HR_MODE +Word16 find_last_nz_pair(const Word32 x[], Word16 length); +#else +Word16 find_last_nz_pair(const Word16 x[], Word16 length); +#endif + +PvqEntry_fx mpvq_index_fx(const Word16 *vec_in, Word16 dim_in, Word16 k_val_local); +void mpvq_deindex_fx(const PvqEntry_fx *entry, UWord32 *h_mem, Word16 *vec_out); + +void pvq_enc_search_fx(const Word16 *x, /* i: target vector to quantize Qin */ + Word16 * rt_far, /* o: outl_far o, raw pulses (non-scaled short) Q0 */ + Word16 * rt_near, /* o: outl_near o, raw pulses (non-scaled short) Q0 */ + Word16 * rtA, /* o: A section raw pulses (non-scaled short) Q0 */ + Word16 * rtB, /* o: B section raw pulses (non-scaled short) Q0 */ + Word32 *L_corr, /* o: 4 un-normalized correlation sums for outl_far, near, outl, A, AB */ + Word32 *L_search_en, /* o: 4 energy sums for out_far, outl_near, A, AB */ + Word16 *pulses_fin, /* i: number of allocated pulses to outl A, AB section */ + Word16 *pulses_proj, /* i: number of proj pulses pulses to outl, A , AB section */ + + const Word16 dim, /* i: Length of vector */ + const Word16 dimA /* i: Length of vector A section */ +); + +PvqEntry_fx get_size_mpvq_calc_offset_fx(Word16 dim_in, Word16 k_val_in, UWord32 *h_mem); + +Word16 pvq_dec_deidx_fx( /* out BER detected 1 , ok==0 */ + Word16 * y, /* o: decoded vector (non-scaled int) */ + const Word16 k_val, /* i: number of allocated pulses */ + const Word16 dim, /* i: Length of vector */ + const Word16 LS_ind, /* i; lS index 1 bit */ + const UWord32 UL_MPVQ_ind /* i; MPVQ index */ +); + +void pvq_dec_en1_norm_fx( /* */ +#ifdef ENABLE_HR_MODE + Word32 * xq, /* o: en1 normalized decoded vector (Q14) */ +#else + Word16 * xq, /* o: en1 normalized decoded vector (Q14) */ +#endif + const Word16 *y, /* i: decoded vector (non-scaled int) */ + const Word16 kval_max, /* i: max possible K in Q0 kO or kA */ + const Word16 dim, /* i: Length of vector */ + const Word16 neg_glob_gain /* i: a Global Gain (negated to fit 1.0 in Q15 as -1.0) */ +); + +#ifdef ENABLE_HR_MODE +#ifdef WIN32 +#define mexPrintf(x, y) printf(x, y) +#endif +#endif + +void pvq_dec_en1_normQ14_fx( /* Have to be used by both encoder and decoder */ +#ifdef ENABLE_HR_MODE + Word32 * xq, /* o: en1 normalized decoded vector (Q14) */ +#else + Word16 * xq, /* o: en1 normalized decoded vector (Q14) */ +#endif + const Word16 *y, /* i: decoded vector (non-scaled int) */ + const Word16 k_val_max, /* i: max possible K in Q0 kO or kA */ + const Word16 dim /* i: Length of vector */ +); + + +#ifdef ENABLE_HR_MODE +void pvq_dec_scale_vec_fx(const Word32 *inQ29, Word16 adjGainQ13, Word32 *outQ); +#else +void pvq_dec_scale_vec_fx(const Word16 *inQ14, Word16 adjGainQ13, Word16 *outQ14); +#endif + +#ifdef CR9_C_ADD_1p25MS_LRSNS + +/* LRSNS functions needed in both encoder and decoder */ +Word16 snslr_remove_st1_DC_fQ11_fx( /* o : dc in Q11 */ + Word16 *scfq, /* i/o: b vector in Q11 */ + Word16 len /* i : length Q0*/); + +void lrsns_pvq_dec_scale_W16vec_fx( + const Word16 *inQ14, Word16 adjGainQ12, Word16 *inoutQ11 +); + +void snslr_st1B_vector_dec_fx( + Word16 idx, const Word16* LFCB, const Word16 *HFCB, const Word16* seg_cnt_cum, const Word16* idx12b_cb, Word16 *st1B_vectorQ11 +); +void snslr_st1C_vector_dec_fx( + Word16 idx, const Word8* CBW8, Word16 scaleQ4, Word16 inv_scaleQ15, Word16 v_len, Word16 cb_len, Word16 *st1C_vector +); + +#ifdef ENABLE_HR_MODE +void lrsns_pvq_dec_scale_W32vec_fx( + const Word32 *inQ27, Word16 adjGainQ12, Word32 *inQ27outQ26, Word16 *outQ11 +); +#endif /* ENABLE_HR_MODE*/ + +/* enc_dec common lrsns PVQ_FESS function */ +void pvq_fess_dec_en1_normQ30andQ14_fx( + const Word16 *y /*Q0*/, + Word16 y_up_bits, /*constant max upshift for each Q0 shape 0,1, 2(3,4,5) */ + Word32 L_norm_factor, + Word16 norm_factorQ, /*Q of L_norm_factor */ + Word16 len, + Word32* L_y_norm, /* Q30 */ + Word16 *y_norm); /* Q14 */ + + +void FESSdeenum_fx(Word16 dim_in_fx, /* i : dimension of vec_out typically (M-1 == 15) */ + Word16 n_env_fx, /* i : number of envelopes */ + Word16 n_shift_fx, /* i : number shifts */ + Word16 n_signs_fx, /* i : number signs */ + Word16 env_ind_fx, /* i:indx */ + Word16 shift_ind_fx, /* i:indx */ + Word16 sign_ind_fx, /* i:indx */ + Word16* vec_out_fx /* o : FESS integer pulse train , with signs applied */ +); + +Word16 snsQuantScfDecLR_fx( /* BER_flag */ + Word32* L_sns_vq_idx_fx, + Word32* L_scf_q_fx, + Word16* scf_q_fx, + Word16 pitch_rx_fx, + Word16 ltpf_rx_fx, + Word8 * scratch); + + +Word16 MSEsearchCbBIdxMap_fx( + const Word16 *scf, const Word16 *LFCB, const Word16 *HFCB, const Word16 *seg_cnt_cum, const Word16* idx12b_cb, Word16 v_len, Word16 cb_len, Word32* min_mse +); +Word16 MSEsearchGenericScaledW8_fx( + Word16 *scf, const Word8 *sns_CBW8, Word16 scaleQ4, Word16 inv_scaleQ15, Word16 v_len, Word16 cb_len, Word32* L_min_mse +); +Word16 MSEsearchGeneric_fx( + Word16 *scf, const Word16 *sns_CB, Word16 v_len, Word16 cb_len, Word32* L_min_mse +); + +void pvq_fess_enc_search_fx( + const Word16 *x_in, /* i: target vector to quantize Qin 0...M-1 */ + Word16 * y_Q0, /* o: raw integer pulses (non-scaled short) Q0 , length 3*M */ + Word16 * y_normQ14, /* o: normlized integer pulses (non-scaled short) Q14 , length 3*M */ + Word32 * L_y_normQ30, + Word16 * s_idx, /* o: quantized shape index, 0,1,2 */ + Word16 * g_idx, /* o: quantized gain index, 0..3, or 0..7 */ + Word16 * g_valQ12Ptr, /* o: quantized gain value, in Q12 -32767 == 7.99975 for best shape */ + Word16 * fixShapeNb, /* o: idx for the selected fix shape y_fix 0...3, relevant in the case s_idx==2 */ + Word16 * fixShiftIdxPtr, + Word32 * L_MSEQ22Ptr, /* o: 1 Q11+Q0+1 --> Q22 */ + Word8 * scratch +); + +Word32 snsQuantScfEncLRSt1ABC_fx(Word16* env, Word32* L_index, Word32 *L_min_mse_saveBCA_ptr_fx, + Word16* ind_saveB_ptr, Word16* st1_vectors, + Word16 pitch_rx, Word16 ltpf_rx, Word8* scratch); + +Word16 snsQuantScfEncLR_fx( /* o: bits spent on LRSNS-VQ envelope */ + Word16 scf_fx[], /* i: input scf M W16Q11 */ + Word32 *L_index_fx, /* o: SNS indeces . */ +#ifdef ENABLE_HR_MODE + Word32 *L_scf_q_fx, /* o: quantizefl_env scf M W16Q11 */ +#else + Word16 *scf_q_fx, /* o: quantizefl_env scf M W16Q11 */ +#endif + Word16 pitch_rx_fx, /*i: 0 or 1 */ + Word16 ltpf_rx_fx, /*i: 0 or 1 */ + Word8 * scratch); + + + +void dct16_fx(const Word16 *in, Word16 *out); +void dct16_updated_fx(const Word16 *in, Word16 *out); +void dct16_W32int_fx(const Word16 *in, Word16 *out); + +void writeSNSData_fx(UWord8 *bytes, Word16 *bp_side, Word16 *mask_side, LC3PLUS_FrameDuration frame_dms, Word32* L_scf_idx); + +#endif /* CR9_C_ADD_1p25MS_LRSNS */ + + +#ifdef NEW_SIGNALLING_SCHEME_1p25 +void writeLtpData_fx(UWord8 *ptr, Word16 *bp_side, Word16 *mask_side, Word16* ltpf_idx, Word16* Tx_ltpf); +#endif + + + + +Word16 processAriEncoder_fx(UWord8 *bytes, Word16 bp_side, Word16 mask_side, Word16 nbbits, +#ifdef ENABLE_HR_MODE + Word32 xq[], +#else + Word16 xq[], +#endif + Word16 *tns_order, Word16 tns_numfilters, Word16 *tns_idx, Word16 lastnz, + Word16 *codingdata, UWord8 *resBits, Word16 numResBits, Word16 lsbMode, + Word16 enable_lpc_weighting, Word8 *scratchBuffer); + +void processAriDecoder_fx(UWord8 *bytes, Word16 *bp_side, Word16 *mask_side, Word16 nbbits, Word16 L_spec, + Word16 fs_idx, Word16 enable_lpc_weighting, Word16 tns_numfilters, Word16 lsbMode, + Word16 lastnz, Word16 *bfi, Word16 *tns_order, Word16 fac_ns_idx, Word16 gg_idx, + LC3PLUS_FrameDuration frame_dms, + Word16 n_pc, Word16 be_bp_left, Word16 be_bp_right, Word16 mode, Word16 *spec_inv_idx, + Word16 *b_left, + Word16 *resBits, +#ifdef ENABLE_HR_MODE + Word32 *x, +#else + Word16 *x, +#endif + Word16 *nf_seed, UWord8 *resQdata, Word16 *tns_idx, Word16 *zero_frame, Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +); + +void processAriDecoderScaling_fx( +#ifdef ENABLE_HR_MODE + Word32 *datain, +#else + Word16 *data16, +#endif + Word16 dataLen, Word32 *data32, Word16 *data_e); + +void processApplyGlobalGain_fx(Word32 x[], Word16 *x_e, Word16 xLen, Word16 global_gain_idx, Word16 global_gain_off); + +void processPerBandEnergy_fx(Word32 *d2_fx, Word16 *d2_fx_exp, Word32 *d_fx, Word16 d_fx_exp, + const Word16 *band_offsets, Word16 fs_idx, Word16 n_bands, Word16 linear, LC3PLUS_FrameDuration frame_dms, + Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +); + +void processNearNyquistdetector_fx(Word16 *near_nyquist_flag, const Word16 fs_idx, const Word16 near_nyquist_index, + const Word16 bands_number, const Word32 *ener_fx, const Word16 ener_fx_exp +#ifdef ENABLE_HR_MODE + , LC3PLUS_FrameDuration frame_dms , Word16 hrmode +#endif + ); + +void processDetectCutoffWarped_fx(Word16 *bw_idx, Word32 *d2_fx, Word16 d2_fx_exp, Word16 fs_idx, LC3PLUS_FrameDuration frame_dms); + +void process_resamp12k8_fx(Word16 x[], Word16 x_len, Word16 mem_in[], Word16 mem_in_len, Word32 mem_50[], + Word16 mem_out[], Word16 mem_out_len, Word16 y[], Word16 *y_len, Word16 fs_idx, + LC3PLUS_FrameDuration frame_dms, Word8 *scratchBuffer + , Word16 bps + ); + +void process_olpa_fx(Word16 *mem_s6k4_exp, Word16 mem_s12k8[], Word16 mem_s6k4[], Word16 *pitch, Word16 *s12k8, + Word16 len, Word16 *normcorr, Word16 *mem_pitch, + Word16 *pitch_flag, + Word16 s12k8_exp, LC3PLUS_FrameDuration frame_dms, Word8 *scratchBuffer); + +void process_ltpf_coder_fx(Word16 *bits, Word16 ol_pitch, Word16 ltpf_enable, Word16 *old_wsp_exp, Word16 *old_wsp, + Word16 old_wsplen, Word16 *param, Word16 *wsp, Word16 len, Word16 *mem_normcorr, + Word16 *mem_mem_normcorr, Word16 ol_normcorr, Word16 *mem_ltpf_on, Word16 *mem_ltpf_pitch, + Word16 wsp_exp, LC3PLUS_FrameDuration frame_dms, Word8 *scratchBuffer + , Word16 hrmode +#ifdef CR9_C_ADD_1p25MS +#ifdef NEW_SIGNALLING_SCHEME_1p25 + , Word16* Tx_ltpf +#else + , Word16 Tx_ltpf +#endif +#endif +); + +void process_ltpf_decoder_fx(Word16 *x_e, Word16 L_frame, Word16 old_x_len, Word16 fs_idx, Word16 old_y_len, + Word16 *old_e, Word16 *x, Word16 *old_x, Word16 *y, Word16 *old_y, Word16 ltpf, + Word16 ltpf_active, Word16 pitch_index, Word16 *old_pitch_int, Word16 *old_pitch_fr, + Word16 *old_gain, Word16 *mem_ltpf_active, Word16 scale_fac_idx, Word16 bfi, + Word16 concealMethod, + Word16 damping, Word16 *old_scale_fac_idx, + Word32 *rel_pitch_change, Word16 hrmode, LC3PLUS_FrameDuration frame_dms, + Word8 *scratchBuffer +#ifdef CR9_C_ADD_1p25MS + , Word16* mem_continuation, Word16* mem_pitch_int_prev, + Word16* mem_pitch_fr_prev, Word16* mem_beta_idx_prev, Word16* mem_gain_prev, Word16 *mem_ltpf_active_prev, Word16* pitch_stability_counter +#endif + ); + +void attack_detector_fx(LC3PLUS_Enc *enc, EncSetup *setup, Word16 *input, Word16 input_scaling, void *scratch); + +void processSnsComputeScf_fx(Word32 *d2_fx, Word16 d2_fx_exp, Word16 fs_idx, Word16 n_bands, Word16 *scf, + Word16 scf_smoothing_enabled, Word16 attdec_damping_factor, Word8 *scratchBuffer, Word16 sns_damping +#ifdef CR9_C_ADD_1p25MS + , LC3PLUS_FrameDuration frame_dms, Word16 norm_corr, Word16 *LT_normcorr +#endif + ); + +void processSnsQuantizeScfEncoder_fx(Word16 scf[], /* i: input scf M */ + Word32 *L_prm_idx, /* o: indeces . negative == unused */ +#ifdef ENABLE_HR_MODE + Word32 *scf_q, /* o: quantized scf M */ +#else + Word16 *scf_q, /* o: quantized scf M */ +#endif + Word8 * scratchBuffer); + +Word16 processSnsQuantizeScfDecoder_fx( /* o: BER flag */ + Word32 *L_prm_idx, /* i: indeces */ +#ifdef ENABLE_HR_MODE + Word32 scf_q[], +#else + Word16 scf_q[], +#endif + Word8 *scratchBuffer); /* o: M */ + +void processSnsInterpolateScf_fx( +#ifdef ENABLE_HR_MODE + Word32 *scf_q, Word32 mdct_scf[], +#else + Word16 *scf_q, Word16 mdct_scf[], +#endif + Word16 mdct_scf_exp[], Word16 inv_scf, + Word16 n_bands, Word8 *scratchBuffer); + +void downshift_w32_arr(Word32 *w32_arr, Word16 *w16_arr, Word16 shft_val, Word32 len); +void round_w32tow16_arr(Word32 *w32_arr, Word16 *w16_arr, Word32 len); + +void processPLCmain_fx(Word16 plcMeth, Word16 *concealMethod, Word16 *nbLostFramesInRow, Word16 bfi, Word16 prev_bfi, + Word16 frame_length, Word16 la_zeroes, +#ifdef ENABLE_HR_MODE + const Word32 w[], +#else + const Word16 w[], +#endif + Word16 x_fx[], Word16 ola_mem[], + Word16 *ola_mem_exp, Word16 q_old_d_fx[], Word16 *q_old_fx_exp, Word32 q_d_fx[], + Word16 *q_fx_exp, Word16 yLen, Word16 fs_idx, const Word16 *band_offsets, Word16 bands_number, Word16 *damping, + Word16 old_pitch_int, Word16 old_pitch_fr, Word16 *ns_cum_alpha, Word16 *ns_seed, + AplcSetup *plcAd, LC3PLUS_FrameDuration frame_dms, Word8 *scratchBuffer, Word16 *pc_nbLostFramesInRow +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif + , Word32 rel_pitch_change + , Word16 *alpha_type_2_table + ); + +void processPLCupdate_fx(AplcSetup *plcAd, Word16 x_fx[], Word16 q_fx_exp, Word16 concealMethod, Word16 frame_length, + Word16 fs_idx, Word16 *nbLostFramesInRow, Word16 *prev_prev_bfi, Word16 *prev_bfi, Word16 bfi, + Word16 scf_q[], Word16 *ns_cum_alpha +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif + ); + +void processPLCupdateSpec_fx(Word16 q_old_d_fx[], Word16 *q_old_fx_exp, Word32 q_d_fx[], Word16 *q_fx_exp, Word16 yLen); + + +void processPLCspec2shape_fx(Word16 prev_bfi, Word16 bfi, Word16 q_old_d_fx[], Word16 yLen, + Word16 *PhECU_oold_grp_shape_fx, Word16 *PhECU_old_grp_shape_fx); + +Word32 winEnCalc(const Word16 *, const Word16, const Word16 *, const Word16, const Word16, Word16 *); + +void processPLCUpdateAfterIMDCT_fx(Word16 x_fx[], Word16 q_fx_exp, Word16 concealMethod, Word16 xLen, Word16 fs_idx, + Word16 *nbLostFramesInRow, Word16 *prev_prev_bfi, Word16 *prev_bfi, Word16 bfi, + Word16 scf_q[], Word16 *ns_cum_alpha, AplcSetup *plcAd); + +void processPLCclassify_fx(Word16 plcMeth, Word16 *concealMethod, Word16 *nbLostFramesInRow, Word16 bfi, + Word16 ltpf_mem_pitch_int, Word16 frame_length, LC3PLUS_FrameDuration frame_dms, Word16 fs_idx, Word16 yLen, + Word16 q_old_d_fx[], const Word16 *band_offsets, Word16 bands_number, AplcSetup *plcAd, Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif + ); + +void processPLCapply_fx( + Word16 *concealMethod, + Word16 nbLostFramesInRow, Word16 bfi, Word16 prev_bfi, + Word16 frame_length, Word16 la_zeroes, +#ifdef ENABLE_HR_MODE + const Word32 w[], +#else + const Word16 w[], +#endif + Word16 x_fx[], Word16 ola_mem[], + Word16 *ola_mem_exp, Word16 q_old_d_fx[], Word16 *q_old_fx_exp, Word32 q_d_fx[], + Word16 *q_fx_exp, Word16 yLen, Word16 fs_idx, Word16 *damping, Word16 old_pitch_int, + Word16 old_pitch_fr, Word16 *ns_cum_alpha, Word16 *ns_seed, LC3PLUS_FrameDuration frame_dms, AplcSetup *plcAd, + Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif + , Word32 rel_pitch_change + , Word16 *alpha_type_2_table + ); + +void processPLCNoiseSubstitution_fx(Word32 spec[], Word16 spec_prev[], Word16 L_spec); +void processPLCDampingScrambling_main_fx(Word16 bfi, Word16 concealMethod, Word16 ns_nbLostFramesInRow, Word16 *cum_fflcAtten, + Word16 pc_nbLostFramesInRow, Word16 *ns_seed, Word16 *pc_seed, Word16 pitch_present_bfi1, + Word16 pitch_present_bfi2, Word32 spec[], Word16 *q_fx_exp, Word16 *q_old_d_fx, + Word16 *q_old_fx_exp, Word16 L_spec, Word16 stabFac, LC3PLUS_FrameDuration frame_dms, + Word16 *cum_fading_slow, Word16 *cum_fading_fast, Word16 spec_inv_idx + , UWord8 plc_fadeout_type + ); + +void processPLCDampingScrambling_fx(Word32 spec[], Word16 L_spec, Word16 nbLostFramesInRow, Word16 stabFac, Word16 processDampScramb, + Word16 *cum_fflcAtten, Word16 pitch_present, LC3PLUS_FrameDuration frame_dms, Word16 *cum_fading_slow, + Word16 *cum_fading_fast, Word16 *seed, Word16 spec_inv_idx + , UWord8 plc_fadeout_type + ); + +void processLagwin_fx(Word32 r[], const Word32 w[], Word16 m); + +void processInverseODFT_fx(Word32 *r_fx, Word16 *r_fx_exp, Word32 *d2_fx, Word16 d2_fx_exp, Word16 n_bands, + Word16 lpc_order, Word8 *scratchBuffer); + +void processPreEmphasis_fx(Word32 *d2_fx, Word16 *d2_fx_exp, Word16 fs_idx, Word16 n_bands, LC3PLUS_FrameDuration frame_dms, + Word8 *scratchBuffer); + +void processPLCLpcScaling_fx(Word32 tdc_A_32[], Word16 tdc_A_16[], Word16 m); + +void processPLCcomputeStabFac_main(Word16 scf_q[], Word16 old_scf_q[], Word16 old_old_scf_q[], Word16 bfi, + Word16 prev_bfi, Word16 prev_prev_bfi, Word16 *stab_fac); + +void processPLCUpdateXFP_w_E_hist_fx(Word16 prev_bfi, Word16 bfi, + Word16 *xfp_fx, Word16 xfp_exp_fx,Word16 margin_xfp, + Word16 fs_idx, + Word32 *L_oold_xfp_w_E_fx, Word16 *oold_xfp_w_E_exp_fx, + Word32 *L_old_xfp_w_E_fx, Word16 *old_xfp_w_E_exp_fx, + Word16 *oold_Ltot_exp_fx, Word16 *old_Ltot_exp_fx); + +void processTimeDomainConcealment_Apply_fx(const Word16 pitch_int, const Word16 preemphFac_fx, const Word16 *A_fx, + const Word16 lpc_order, const Word16 *pcmbufHist_fx, + const Word16 frame_length, const LC3PLUS_FrameDuration frame_dms, const Word16 fs_idx, + const Word16 nbLostFramesInRow, const Word16 overlap, + const Word16 stabFac_fx, Word16 *fract, Word16 *seed_fx, + Word32 *gain_c_fx, Word16 *synth_fx, Word16 *Q_syn, + Word16 *alpha, Word16 max_len_pcm_plc, + Word16 harmonicBuf_fx[MAX_PITCH], Word16 synthHist_fx[M], Word16 *const harmonicBuf_Q, + Word8 *scratchBuffer + , UWord8 plc_fadeout_type + ,Word16 *alpha_type_2_table +); + +void processTdac_fx(Word16 *ola_mem, Word16 *ola_mem_exp, const Word16 *synth, const Word16 synth_exp, +#ifdef ENABLE_HR_MODE + const Word32 *win, +#else + const Word16 *win, +#endif + const Word16 la_zeroes, const Word16 frame_len, Word8 *scratchBuffer); + +void plc_phEcu_F0_refine_first_fx(Word16 *plocs, const Word16 n_plocs_in, Word32 *L_f0est, + const Word16 stPhECU_f0hzLtpBinQ7, const Word16 stPhECU_f0gainLtpQ15, + const Word16 nSubm); +void plc_phEcu_LF_peak_analysis_fx(Word16 *plocs, Word16 *n_plocs, Word32 *L_f0estQ16, const Word16 *mag, + const Word16 stPhECU_f0hzLtpBinQ7, const Word16 stPhECU_f0gainLtpQ15, + const Word16 nSubm, Word16 maxPlocs, Word8 *scratchBuffer); + +Word16 plc_phEcuSetF0Hz_fx(Word16 fs_idx, Word16 old_pitch_int, Word16 old_pitch_fr); + +void create_sin2_taper_fx(Word16 *, Word16, Word16); + +void plc_phEcu_initWord16(Word16 * vec, /*i/o : vector pointer */ + const Word16 value, /*i : short initialization value */ + const Word16 len); /*i : number of elements */ + +Word16 plc_phEcu_ratio_fx(const Word32, const Word32, Word16 *); + +void plc_phEcu_minval_fx(const Word16 *inp, /* i : vector */ + const Word16 len, /* i : length */ + Word16 * minvalPtr); /* o : min value Ptr */ + +void plc_phEcu_maxval_fx(const Word16 *inp, /* i : vector */ + const Word16 len, /* i : length */ + Word16 * maxvalPtr); /* o : *maxvalPtr */ + +void Scale_sig_sat(Word16 x[], /* i/o: signal to scale, possibly saturated Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0); /* i : exponent: x = round(x << exp) Qx ?exp */ + +void Processing_ITDA_WIN_OLA(Word32 L_x_tda[], Word16 *y_e, +#ifdef ENABLE_HR_MODE + const Word32 w[], +#else + const Word16 w[], +#endif + Word16 mem[], Word16 *mem_e, Word16 x[], + Word16 wLen, Word16 N, Word16 memLen); + +void trans_burst_ana_fx(const Word16 *xfp, /* i : Input signal Qspec */ + Word16 * mag_chg, /* o : Magnitude modification Q15 */ + Word16 *ph_dith, /* o : Phase dither, 2*PI is not included (Q15, i.e., between 0.0 and 1.0) */ + Word16 *mag_chg_1st, /* i/o: per band magnitude modifier for transients Q15 */ + const Word16 output_frame, /* i : Frame length */ + const Word16 time_offs, /* i : Time offset (integral multiple of output_frame) */ + const Word16 est_stab_content, /* i : 0.0=dynamic ... 1.0=stable (==st->env_stab ) */ + Word16 * alpha, /* o : Magnitude modification factors for fade to average */ + Word16 * beta, /* : Magnitude modification factors for fade to average */ + Word16 * beta_mute, /* i/o : Factor for long-term mute */ + Word16 * Xavg, /* o : Frequency group average gain to fade to */ + Word16 Q_spec, Word32 L_oold_xfp_w_E_fx, Word16 oold_xfp_w_E_exp_fx, Word16 oold_Ltot_exp_fx, + Word16 *oold_grp_shape_fx, Word32 L_old_xfp_w_E_fx, Word16 old_xfp_w_E_exp_fx, + Word16 old_Ltot_exp_fx, Word16 *old_grp_shape_fx, + Word16 fadeout, + Word32 *L_Xavg, /* full scale average band amplitudes */ + Word8 *scratchBuffer); + +void spec_ana_fx(Word16 *xfp, Word16 *, Word32 *, Word16 *, Word16 *, const Word16, const Word16, + const Word16 *, const Word16, const Word16, Word16 maxLprot, Word16 maxPlocs, Word8 *scratchBuffer); + +void subst_spec_fx(const Word16 *, const Word32 *, Word16 *, const Word16, Word16 *, const Word16 *, const Word16, + const Word16 *, const Word16, Word16 *, const Word16 *, const Word16 *, const Word16 *, const Word16 + ,const Word16, + Word16*, + const Word32 * +); + +void rec_frame_fx(Word16 * X, /* i : FFT spectrum */ + Word32 * L_ecu_rec, /* o : Reconstructed frame in tda domain */ + const Word16 output_frame, /* i : Frame length */ + const Word16 Q, const Word16 *const win2ms_init, /* i: 2 ms initial part of pre_tda window */ + const Word16 *const win16ms_center, /* i: 16 ms combined part of pre_tda IWHR+MDCT-ana */ + + Word16 maxLprot, const Word16 *prevsynth, const Word16 Q_prevsynth, + Word8 * scratchBuffer); + +Word16 rand_phase_fx(const Word16 seed, Word16 *sin_F, Word16 *cos_F); + +void hq_phase_ecu_fx(const Word16 *prevsynth, /* i : buffer of previously synthesized signal */ + Word32 *L_ecu_rec, /* o : reconstructed frame in tda domain , also tmp w32_fft buffer */ + Word16 *time_offs, /* i/o: Sample offset for consecutive frame losses*/ + Word16 *X_sav, /* i/o: Stored spectrum of prototype frame */ + Word16 *Q_spec, /* o: Q value of stored spectrum */ + Word16 *num_p, /* i/o: Number of identified peaks */ + Word16 *plocs, /* i/o: Peak locations */ + Word32 *L_plocsi, /* i/o: Interpolated peak locations Q16 */ + const Word16 env_stab, /* i : Envelope stability parameter */ + const Word16 f0hzLtpBinQ7, /* i: LTP bin frequency in normalized Hz Q7 */ + const Word16 norm_corrQ15_fx, /*i : correlation for lag at f0hzLtpBinQ7 */ + const Word16 prev_bfi, /* i : indicating burst frame error */ + Word16 old_is_transient[2], /* i/o : flags indicating noise generation */ + Word16 * mag_chg_1st, /* i/o: per band magnitude modifier for transients */ + Word16 * mag_chg_gr, /* o: per band magnitude modifier incl burst attenuation */ + Word16 * Xavg, /* i/o: Frequency group average gain to fade to */ + Word16 * beta_mute, /* o : Factor for long-term mute */ + const Word16 bwidth_fx, /* i : Encoded bandwidth */ + const Word16 output_frame, /* i : frame length */ + Word16 * seed_out_fxPtr, /* o: seed synch analysis */ + Word16 * X_out, /* o: utput evolved spectrum */ + const Word16 t_adv, /* i : time adjustment including time_offs */ + const Word16 *const win2ms_init, /* i: 2 ms initial part of pre_tda window */ + const Word16 *const win16ms_center, /* i: 16 ms combined part of pre_tda IWHR+MDCT-ana */ + const Word16 * sp_ana_win, /* i : whr hamming window */ + Word16 q_fx_old_exp, Word16 maxLprot, Word16 maxPlocs, + Word32 L_oold_xfp_w_E_fx, Word16 oold_xfp_w_E_exp_fx, /* exp of time signal */ + Word16 oold_Ltot_exp_fx, /*true exp of energy */ + Word16 *oold_grp_shape_fx, Word32 L_old_xfp_w_E_fx, + Word16 old_xfp_w_E_exp_fx, /* exp of time signal */ + Word16 old_Ltot_exp_fx, /*true exp of energy */ + Word16 *old_grp_shape_fx, + Word16 margin_prev_synth, /* i: margin in prev_synth(16ms for first bfi , 3.75 ms for other bfi + frames ) , from plcAd.PhECU_margin_xfp */ + const Word16 fadeout, /*i: fadeout length indicator */ + Word16 *nonpure_tone_flag_ptr, /* i/o : non-pure single tone indicator state */ + Word8 *scratchBuffer /* Size = 2 * MAX_LGW + 8 * MAX_LPROT + 12 * MAX_L_FRAME */ +); + + +Word16 plc_xcorr_lc_fx(/* o: quantized output xcorr in Q15 [ 0 ..32767 ] = [0. 1.0[ */ + Word16 * + pcmbuf_fx, /* NB should be an already dynamically upscaled buffer with about 0...1 bits margin */ + Word16 max_len_pcm_plc, /* Q0 size of pcmbuf_fx */ + Word16 pitch_int, /* Q0 in Fs, lag value to evaluate, corresponding to the current f0 fr pcm_buf */ + Word16 fs_idx); + +void plc_phEcu_peak_locator_fx(const Word16 *, const Word16, Word16 *, Word16 *, const Word16, const Word16, + const Word16, Word16, Word8 *); + +Word16 plc_phEcu_find_ind_fx(const Word16 *, const Word16, const Word16); + + +Word16 initQV(Word16 SR_idx, Word32 BR); + +void processEstimateGlobalGain_fx(Word32 x[], Word16 x_e, Word16 lg, Word16 sqTargetBits, +#ifdef ENABLE_HR_MODE + Word32 *gain, +#else + Word16 *gain, +#endif + Word16 *gain_e, + Word16 *quantizedGain, Word16 *quantizedGainMin, Word16 quantizedGainOff, + Word32 *targetBitsOff, Word16 *old_targetBits, Word16 old_specBits, + Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode, Word16 regBits, LC3PLUS_FrameDuration frame_dms +#else +#ifdef FIX_BOTH_1p25_TEST_NEW_GG_EST2 + , LC3PLUS_FrameDuration frame_dms +#endif +#endif +); + +void processAdjustGlobalGain_fx(Word16 *gg_idx, Word16 gg_idx_min, Word16 gg_idx_off, +#ifdef ENABLE_HR_MODE + Word32 *gain, +#else + Word16 *gain, +#endif + Word16 *gain_e, + Word16 target, Word16 nBits, Word16 *gainChange, Word16 fs_idx +#ifdef ENABLE_HR_MODE + , Word16 hrmode, LC3PLUS_FrameDuration frame_dms +#endif + ); + +void processScalarQuant_fx(Word32 x[], Word16 x_e, Word16 xq[], Word16 L_frame, Word16 gain, Word16 gain_e); + +#ifdef ENABLE_HR_MODE +void processQuantizeSpec_fx(Word32 x[], Word16 x_e, Word32 gain, Word16 gain_e, Word32 xq[], Word16 nt, Word16 target, + Word16 totalBits, Word16 *nBits, Word16 *nBits2, Word16 fs_idx, Word16 *lastnz, + Word16 *codingdata, Word16 *lsbMode, Word16 mode, Word16 hrmode); +#else +void processQuantizeSpec_fx(Word32 x[], Word16 x_e, Word16 gain, Word16 gain_e, Word16 xq[], Word16 nt, + Word16 target, + Word16 totalBits, Word16 *nBits, Word16 *nBits2, Word16 fs_idx, Word16 *lastnz, + Word16 *codingdata, Word16 *lsbMode, Word16 mode); + +#endif /* ENABLE_HR_MODE */ + +void processResidualCoding_fx(Word16 x_e, Word32 x[], +#ifdef ENABLE_HR_MODE + Word32 xq[], Word32 gain, +#else + Word16 xq[], Word16 gain, +#endif + Word16 gain_e, Word16 L_spec, Word16 targetBits, Word16 nBits, + UWord8 *resBits, Word16 *numResBits +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +#if defined (CR9_C_ADD_1p25MS) + , LC3PLUS_FrameDuration frame_dms +#endif +); + +void scale_signal24_fx(Word32 x[], /* i: time input signal */ +#ifdef ENABLE_HR_MODE + Word32 x_scaled[], +#else + Word16 x_scaled[], +#endif + Word16 *x_exp, +#ifdef ENABLE_HR_MODE + Word32 mdct_mem[], +#else + Word16 mdct_mem[], +#endif + Word16 mdct_mem_len, + Word16 resample_mem_in[], Word16 resample_mem_in_len, Word32 resample_mem_in50[], + Word16 resample_mem_out[], Word16 resample_mem_out_len, Word32 mdct_mem32[], Word16 N, + Word32 resamp_mem32[], Word16 mem_s12k8[], Word16 *resamp_scale); + +void processReorderBitstream_fx(UWord8 *bytes, Word16 n_pccw, Word16 n_pc, Word16 b_left, Word8 *scratchBuffer); + +/* al_fec.c */ +Word16 fec_get_n_pccw(Word16 slot_bytes, Word16 fec_mode, Word16 ccc_flag); +Word16 fec_get_data_size(Word16 fec_mode, Word16 ccc_flag, Word16 slot_bytes); +Word16 fec_get_n_pc(Word16 fec_mode, Word16 n_pccw, Word16 slot_bytes); + +void fec_encoder(Word16 mode, Word16 epmr, UWord8 *iobuf, Word16 data_bytes, Word16 slot_bytes, Word16 n_pccw, + void *scratch); + +int fec_decoder(UWord8 *iobuf, Word16 slot_bytes, int *data_bytes, Word16 *epmr, Word16 ccc_flag, Word16 *n_pccw, + int *bfi, Word16 *be_bp_left, Word16 *be_bp_right, Word16 *n_pc, Word16 *m_fec, void *scratch); + +void processPCmain_fx(Word16 rframe, Word16 *bfi, Word16 yLen, LC3PLUS_FrameDuration frame_dms, Word16 q_old_res_fx[], + Word16 *q_old_res_fx_exp, +#ifdef ENABLE_HR_MODE + Word32 q_res_fx[], +#else + Word16 q_res_fx[], +#endif + Word16 q_old_d_fx[], Word16 spec_inv_idx, + Word16 pitch_present, Word16 stab_fac, Word32 q_d_fx[], Word16 *q_fx_exp, + Word16 gg_idx, Word16 gg_idx_off, Word16 *prev_gg, Word16 *prev_gg_e, Word16 *BW_cutoff_idx_nf, + Word16 *prev_BW_cutoff_idx_nf, Word16 fac_ns_idx, Word16 *prev_fac_ns_fx, Word16 *pc_nbLostFramesInRow); +void processPCclassify_fx(Word16 pitch_present, LC3PLUS_FrameDuration frame_dms, Word16 q_old_d_fx[], Word16 q_old_res_fx[], + Word16 yLen, Word16 spec_inv_idx, Word16 stab_fac, Word16 *bfi); +void processPCapply_fx(Word16 yLen, Word16 q_old_res_fx[], Word16 *q_old_res_fx_exp, +#ifdef ENABLE_HR_MODE + Word32 q_res_fx[], +#else + Word16 q_res_fx[], +#endif + Word16 q_old_d_fx[], Word16 spec_inv_idx, Word16 *fac, Word16 *fac_e, Word32 q_d_fx[], + Word16 *q_fx_exp, Word16 gg_idx, Word16 gg_idx_off, Word16 prev_gg, Word16 prev_gg_e, + Word16 *pc_nbLostFramesInRow); +void processPCupdate_fx(Word16 bfi, Word16 yLen, Word16 q_old_res_fx[], Word16 *q_old_res_fx_exp, +#ifdef ENABLE_HR_MODE + Word32 q_res_fx[], +#else + Word16 q_res_fx[], +#endif + Word16 spec_inv_idx, Word16 gg_idx, Word16 gg_idx_off, Word16 *prev_gg, Word16 *prev_gg_e, + Word16 rframe, Word16 *BW_cutoff_idx_nf, Word16 *prev_BW_cutoff_idx_nf, Word16 fac_ns_idx, + Word16 *prev_fac_ns_fx, Word16 fac, Word16 fac_e); +void processPcApplyDamping_fx(Word32 x[], Word16 xLen, Word16 fac, Word16 spec_inv_idx); + +void process_cutoff_bandwidth(Word32 d_fx[], Word16 len, Word16 bw_bin); + +void idct16_fx(const Word16 *in, Word16 *out); + +void dct32_fx(const Word32 *in, Word32 *out); +void idct32_fx(const Word32 *in, Word32 *out); +void idct32_32_fx(const Word32 *in, Word32 *out); + +/* Functions used in arithmetic coder */ + +void write_bit_backward(UWord8 *ptr, Word16 *bp, Word16 *mask, Word16 bit); +void write_indice_backward(UWord8 *ptr, Word16 *bp, Word16 *mask, Word16 indice, Word16 numbits); + +void processEncoderEntropy(UWord8 *bytes, Word16 *bp_side, Word16 *mask_side, Word16 nbbits, Word16 targetBytes, + Word16 L_spec, Word16 BW_cutoff_bits, Word16 tns_numfilters, Word16 lsbMode, Word16 lastnz, + Word16 *tns_order, Word16 fac_ns_idx, Word16 gg_idx, Word16 BW_cutoff_idx, Word16 *ltpf_idx, + Word32 *L_scf_idx, Word16 bfi_ext, Word16 fs_idx +#ifdef CR9_C_ADD_1p25MS + , LC3PLUS_FrameDuration frame_dms, Word16* Tx_ltpf +#endif + ); + +void processDecoderEntropy_fx(UWord8 *bytes, Word16 *bp_side, Word16 *mask_side, Word16 nbbits, Word16 L_spec, + Word16 fs_idx, Word16 BW_cutoff_bits, Word16 *tns_numfilters, Word16 *lsbMode, + Word16 *lastnz, Word16 *bfi, Word16 *tns_order, Word16 *fac_ns_idx, Word16 *gg_idx, + Word16 *BW_cutoff_idx, Word16 *ltpf_idx, Word32 *L_scf_idx, LC3PLUS_FrameDuration frame_dms +#ifdef CR9_C_ADD_1p25MS + , Word16 rx_status[2], Word16* mem_continuation +#ifdef NEW_SIGNALLING_SCHEME_1p25 + , Word16 *ltpfinfo_frame_cntr_fx +#endif +#endif + ); + +#ifdef NEW_SIGNALLING_SCHEME_1p25 +void readLtpData_fx(UWord8* ptr, Word16* bfiPtr, Word16* mask_side, Word16* bp_side, Word16* ltpf_idx, Word16* rx_status, + Word16* ltpfinfo_frame_cntr_fx, Word16* mem_continuation); +#endif + +#ifdef ENABLE_PADDING +int paddingDec_fx(UWord8 *bytes, Word16 nbbits, Word16 L_spec, Word16 BW_cutoff_bits, Word16 ep_enabled, + Word16 *total_padding, Word16 *np_zero); +#endif + +Word16 read_bit(UWord8 *ptr, Word16 *bp, Word16 *mask); + +/* setup_enc_lc3plus.c */ +int alloc_encoder(LC3PLUS_Enc *encoder, int samplerate, int channels); +void set_enc_frame_params(LC3PLUS_Enc *encoder); +LC3PLUS_Error update_enc_bitrate(LC3PLUS_Enc *encoder, int bitrate); +LC3PLUS_Error FillEncSetup(LC3PLUS_Enc *encoder, int samplerate, int channels +#ifdef ENABLE_HR_MODE + , int hrmode +#endif + , int32_t lfe_channel_array[] + ); + +/* setup_dec_lc3plus.c */ +int alloc_decoder(LC3PLUS_Dec *decoder, int samplerate, int channels); +void set_dec_frame_params(LC3PLUS_Dec *decoder); +LC3PLUS_Error update_dec_bitrate(LC3PLUS_Dec *decoder, int ch, Word16 nBytes); +LC3PLUS_Error FillDecSetup(LC3PLUS_Dec *decoder, int samplerate, int channels, LC3PLUS_PlcMode plc_mode +#ifdef ENABLE_HR_MODE + , int hrmode +#endif + ); + +int Enc_LC3PLUS(LC3PLUS_Enc *encoder, void **input, int bits_per_sample, UWord8 *output, void *scratch, Word16 bfi_ext); +LC3PLUS_Error Dec_LC3PLUS(LC3PLUS_Dec *decoder, UWord8 *input, int input_bytes, void **output, int bits_per_sample, void *scratch, + int bfi_ext); + +void *balloc(void *base, size_t *base_size, size_t size); + +#ifdef FIX_BOTH_1p25_WB_GLOBGAINOFFSET_NONBE +Word16 calc_GGainOffset_1p25_fx(Word16 total_bits, Word16 fs_idx); +#endif + +Word16 type_2_fadeout_fx(Word16 nbLostFramesInRow, LC3PLUS_FrameDuration frame_dms); + +#endif /* FUNCTIONS_H */ diff --git a/lib_lc3plus/imdct_fx.c b/lib_lc3plus/imdct_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..70e76c8c57892423f234323aadaf05bd457436fa --- /dev/null +++ b/lib_lc3plus/imdct_fx.c @@ -0,0 +1,391 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +void ProcessingIMDCT( + Word32 y[], /* i: spectra data */ + Word16 * y_e, /* i: spectral data exponent */ +#ifdef ENABLE_HR_MODE + const Word32 w[], /* i: window coefficients including normalization of sqrt(2/N) and scaled by 2^4 */ + Word32 mem[], /* i/o: overlap add memory */ +#else + const Word16 w[], /* i: window coefficients including normalization of sqrt(2/N) and scaled by 2^4 */ + Word16 mem[], /* i/o: overlap add memory */ +#endif + Word16 * mem_e, /* i/o: overlap add exponent */ +#ifdef ENABLE_HR_MODE + Word32 x[], /* o: time signal out */ +#else + Word16 x[], /* o: time signal out */ +#endif + Word16 wLen, /* i: window length */ + Word16 N, /* i: block size */ + Word16 memLen, /* i: overlap add buffer size */ + LC3PLUS_FrameDuration frame_dms, /* i: frame size in ms */ + Word16 concealMethod, /* i: concealment method */ + Word16 bfi, /* i: bad frame indicator */ + Word16 prev_bfi, /* i: previous bad frame indicator */ + Word16 nbLostFramesInRow, /* i: number of consecutive lost frames */ + AplcSetup *plcAd, /* i: advanced plc struct */ + Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +) +{ + Counter i; + Word16 o, z, m, s; + Word16 y_s, mem_s, max_bw; + Word32 L_tmp; + Word32 *workBuffer; + +#ifdef DYNMEM_COUNT + struct _dynmem + { + Word16 o, z, m, s; + Word16 y_s, mem_s, max_bw; + Word32 L_tmp; + Counter i; + Word32 *workBuffer; + Word16 mem_i_win; + Word16 w_taper_win; + }; + Dyn_Mem_In("ProcessingIMDCT", sizeof(struct _dynmem)); +#endif + + + test(); test(); test(); + IF (sub(bfi, 1) != 0 || sub(concealMethod, LC3_CON_TEC_NS_STD) == 0 || sub(concealMethod, LC3_CON_TEC_NS_ADV) == 0 || sub(concealMethod, LC3_CON_TEC_FREQ_MUTING) == 0) + { + workBuffer = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 4 * MAX_LEN bytes */ + + /* Init (constant per sample rate) */ + z = 2 * N - wLen; /* number of leading zeros in window */ + m = N >> 1; /* half block size */ + o = m - z; + max_bw = 0; + +#ifdef ENABLE_HR_MODE + if (hrmode) + { + max_bw = N; + } + else +#endif + { + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + max_bw = MAX_BW >> 3; move16(); + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + max_bw = MAX_BW >> 2; move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + max_bw = MAX_BW >> 1; move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + max_bw = (MAX_BW >> 2) * 3; move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + max_bw = MAX_BW; move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + } + + if (N > max_bw) + basop_memset(&y[max_bw], 0, (N - max_bw) * sizeof(*y)); + + /* Start Processing */ + y_s = getScaleFactor32_0(y, N); + IF (sub(y_s, 32) < 0) + { + FOR (i = 0; i < N; i++) + { + y[i] = L_shl(y[i], y_s); + } + *y_e = sub(*y_e, y_s); +#ifdef ENABLE_HR_MODE + dct_IV(y, y_e, N, + hrmode, + workBuffer); +#else + dct_IV(y, y_e, N, workBuffer); +#endif + y_s = getScaleFactor32(y, N); + y_s = sub(y_s, 1); + *y_e = sub(*y_e, y_s + 3); /* mdct window is scaled by pow(2,x) */ + /* N<=20 only happens for 2.5ms frames in NB */ + if (sub(N, 30) <= 0) + { + *y_e = add(*y_e, 2); + } + else if (sub(N, 120) <= 0) + { + *y_e = add(*y_e, 1); + } + } + ELSE + { + *y_e = 0; move16(); + } + +#ifdef ENABLE_HR_MODE + mem_s = getScaleFactor32_0(mem, memLen); +#else + mem_s = getScaleFactor16_0(mem, memLen); +#endif + +#ifdef ENABLE_HR_MODE + IF (sub(mem_s, 32) < 0) +#else + IF (sub(mem_s, 16) < 0) +#endif + { + mem_s = sub(mem_s, 1); + *mem_e = sub(*mem_e, mem_s); + } + ELSE + { + *mem_e = *y_e; move16(); + } + + s = sub(*mem_e, *y_e); + + IF (s > 0) + { + y_s = sub(y_s, s); + *y_e = add(*y_e, s); + } + ELSE + { + mem_s = add(mem_s, s); + *mem_e = sub(*mem_e, s); + } + + mem_s = s_max(mem_s, -31); + y_s = s_max(y_s, -31); + + if (sub(y_s, 32) >= 0) + { + y_s = 0; move16(); + } +#ifdef ENABLE_HR_MODE + if (sub(mem_s, 32) >= 0) + { + mem_s = 0; move16(); + } +#else + if (sub(mem_s, 16) >= 0) + { + mem_s = 0; move16(); + } +#endif + + UNUSED(prev_bfi); + UNUSED(nbLostFramesInRow); + UNUSED(plcAd); + + { /* regular operation */ + FOR (i = 0; i < o; i++) + { +#ifdef ENABLE_HR_MODE + L_tmp = L_sub(L_shl(mem[i], mem_s), Mpy_32_32_lc3plus(L_shl(y[m + i + z], y_s), w[4 * m - 1 - i - z])); + x[i] = L_tmp; + move32(); +#else + L_tmp = L_sub(L_shl(L_deposit_h(mem[i]), mem_s), Mpy_32_16_lc3plus(L_shl(y[m + i + z], y_s), w[4 * m - 1 - i - z])); + x[i] = round_fx(L_tmp); + move16(); +#endif + } + FOR (i = 0; i < m; i++) + { +#ifdef ENABLE_HR_MODE + L_tmp = L_add(L_shl(mem[i + o], mem_s), Mpy_32_32_lc3plus(L_shl(y[2 * m - 1 - i], y_s), w[3 * m - 1 - i])); + x[i + o] = L_tmp; + move32(); +#else + L_tmp = L_add(L_shl(L_deposit_h(mem[i + o]), mem_s), Mpy_32_16_lc3plus(L_shl(y[2 * m - 1 - i], y_s), w[3 * m - 1 - i])); + x[i + o] = round_fx(L_tmp); + move16(); +#endif + } + } + + FOR (i = 0; i < m; i++) + { +#ifdef ENABLE_HR_MODE + L_tmp = L_negate(Mpy_32_32_lc3plus(L_shl(y[i], y_s), w[m - 1 - i])); + x[3 * m - z + i] = L_tmp; + move32(); +#else + L_tmp = L_negate(Mpy_32_16_lc3plus(L_shl(y[i], y_s), w[m - 1 - i])); + x[3 * m - z + i] = round_fx(L_tmp); + move16(); +#endif + } + + FOR (i = 0; i < m; i++) + { +#ifdef ENABLE_HR_MODE + L_tmp = L_negate(Mpy_32_32_lc3plus(L_shl(y[i], y_s), w[m + i])); + x[3 * m - z - 1 - i] = L_tmp; + move32(); +#else + L_tmp = L_negate(Mpy_32_16_lc3plus(L_shl(y[i], y_s), w[m + i])); + x[3 * m - z - 1 - i] = round_fx(L_tmp); + move16(); +#endif + } + +#ifdef ENABLE_HR_MODE + basop_memmove(mem, &x[N], memLen * sizeof(Word32)); +#else + basop_memmove(mem, &x[N], memLen * sizeof(Word16)); +#endif + + *mem_e = *y_e; move16(); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} +/* End Processing */ + +void Processing_ITDA_WIN_OLA( + Word32 L_x_tda[], /* i: X_TDA buffer data = "y" DCT-IV output */ + Word16 * y_e, /* i/o: x_tda input exponent "y_e" , x output exponent */ +#ifdef ENABLE_HR_MODE + const Word32 w[], /* i: window coefficients including normalization of sqrt(2/N) and scaled by 2^4 */ +#else + const Word16 w[], /* i: window coefficients including normalization of sqrt(2/N) and scaled by 2^4 */ +#endif + Word16 mem[], /* i/o: overlap add memory */ + Word16 * mem_e, /* i/o: overlap add exponent */ + Word16 x[], /* o: time signal out */ + Word16 wLen, /* i: window length */ + Word16 N, /* i: block size */ + Word16 memLen /* i: overlap add buffer size */ + ) +{ + /* Declarations */ + Word16 i, o, z, m, s; + Word16 y_s, mem_s; + Word32 L_tmp; + Word32 *L_y; + Word16 fs_idx, tmp_w, w_factor; + Word16 factorITDA[5]= { 25905 , 18318 , 22435 , 25905 , 31727}; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("Processing_ITDA_WIN_OLA", sizeof(struct { + Word16 i, o, z, m, s; + Word16 y_s, mem_s; + Word32 L_tmp; + Word32 *L_y; + })); +#endif + + + /* Init (constants per sample rate) */ + z = 2 * N - wLen; /* number of leading zeros in window */ + m = N >> 1; /* half block size */ + o = m - z; + + + L_y = L_x_tda; /* use same variables naming as in IMDCT for DCT-IV output signal y */ + + y_s = getScaleFactor32(L_y, N); + + y_s = sub(y_s, 1); /* add 1 bit margin , y_s is now initial tda upscaling factor */ + + + *y_e = sub(add(*y_e,1),y_s); /* handle W scale down by 2^(3) , as mdct synthesis window was upscaled by pow(2,x) x=2 for NB otherwise 3 */ + + + + mem_s = getScaleFactor16_0(mem, memLen); + + IF (sub(mem_s, 16) < 0) + { + mem_s = sub(mem_s, 1); /* one bit margin */ + *mem_e = sub(*mem_e, mem_s); /*adjusted mem exponent due to new scale */ + } + ELSE + { + *mem_e = 0; move16(); + } + + s = sub(*mem_e, *y_e); /* */ + + IF (s > 0) + { + y_s = sub(y_s, s); /* new , reduced upshift of TDA in window application loop */ + *y_e = add(*y_e, s); /* resulting new exp y_e for output signal */ + } + ELSE + { + mem_s = add(mem_s, s); /* s negative or zero, new , decreased upshift of OLAmem in loop */ + *mem_e = sub(*mem_e, s); /* resulting new exp mem_e for OLA_mem output signal */ + } + + fs_idx = mult(N,(Word16)(32768.0/99.0)); /* truncation needed , i.e no rounding can be applied here */ + w_factor = factorITDA[fs_idx]; move16(); + y_s = s_max(s_min(y_s, 31), -31); + + FOR (i = 0; i < o; i++) + { + tmp_w = mult_r(extractW16(w[4 * m - 1 - i - z]), w_factor); + L_tmp = L_sub(L_shl_sat(L_deposit_h(mem[i]), mem_s), Mpy_32_16_lc3plus(L_shl(L_y[m + i + z], y_s), tmp_w)); + x[i] = round_fx_sat(L_tmp); + move16(); + } + + FOR (i = 0; i < m; i++) + { + tmp_w = mult_r(extractW16(w[3 * m - 1 - i]), w_factor); + L_tmp = L_add(L_shl_sat(L_deposit_h(mem[i + o]), mem_s), Mpy_32_16_lc3plus(L_shl(L_y[2 * m - 1 - i], y_s), tmp_w)); + x[i + o] = round_fx_sat(L_tmp); + move16(); + } + + FOR (i = 0; i < m; i++) + { + tmp_w = mult_r(extractW16(w[m - 1 - i]), w_factor); + L_tmp = L_negate(Mpy_32_16_lc3plus(L_shl(L_y[i], y_s), tmp_w)); + x[3 * m - z + i] = round_fx(L_tmp); move16(); + } + + FOR (i = 0; i < m; i++) + { + tmp_w = mult_r(extractW16(w[m + i]), w_factor); + L_tmp = L_negate(Mpy_32_16_lc3plus(L_shl(L_y[i], y_s), tmp_w )); + x[3 * m - z - 1 - i] = round_fx(L_tmp); move16(); + } + + FOR (i = 0; i < memLen; i++) + { + mem[i] = x[N + i]; move16(); + } + *mem_e = *y_e; move16(); /* set OLA mem exp to x_Fx exponent*/ + + + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + diff --git a/lib_lc3plus/lc3plus.c b/lib_lc3plus/lc3plus.c new file mode 100644 index 0000000000000000000000000000000000000000..aed8e029b16df958a5318d766c819ba090fbaacd --- /dev/null +++ b/lib_lc3plus/lc3plus.c @@ -0,0 +1,452 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" +#include "lc3plus.h" +#include "setup_dec_lc3plus.h" +#include "setup_enc_lc3plus.h" + +#define RETURN_IF(cond, error) \ + if (cond) \ + return (error) + +#ifdef SUBSET_NB +// #pragma message("- SUBSET_NB") +#endif +#ifdef SUBSET_WB +// #pragma message("- SUBSET_WB") +#endif +#ifdef SUBSET_SSWB +// #pragma message("- SUBSET_SSWB") +#endif +#ifdef SUBSET_SWB +// #pragma message("- SUBSET_SWB") +#endif +#ifdef SUBSET_FB +// #pragma message("- SUBSET_FB") +#endif +#ifdef SUBSET_UB +// #pragma message("- SUBSET_UB") +#endif + +/* ensure api header constants are up to date */ +STATIC_ASSERT(LC3PLUS_MAX_SAMPLES >= MAX_LEN); +STATIC_ASSERT(LC3PLUS_MAX_CHANNELS >= MAX_CHANNELS); +STATIC_ASSERT(LC3PLUS_MAX_BYTES >= BYTESBUFSIZE); +STATIC_ASSERT(LC3PLUS_ENC_MAX_SIZE >= ENC_MAX_SIZE); +STATIC_ASSERT(LC3PLUS_DEC_MAX_SIZE >= DEC_MAX_SIZE); +STATIC_ASSERT(LC3PLUS_ENC_MAX_SCRATCH_SIZE >= SCRATCH_BUF_LEN_ENC_TOT); +STATIC_ASSERT(LC3PLUS_DEC_MAX_SCRATCH_SIZE >= SCRATCH_BUF_LEN_DEC_TOT); +STATIC_ASSERT(PLC_FADEOUT_IN_MS >= 20); + + +/* misc functions ************************************************************/ + +int lc3plus_version(void) +{ + return LC3PLUS_VERSION; +} + +int lc3plus_channels_supported(int channels) +{ + return channels >= 1 && channels <= MAX_CHANNELS; +} + +int lc3plus_samplerate_supported(int samplerate) +{ + switch (samplerate) + { +#ifdef SUBSET_NB + case 8000: return 1; +#endif +#ifdef SUBSET_WB + case 16000: return 1; +#endif +#ifdef SUBSET_SSWB + case 24000: return 1; +#endif +#ifdef SUBSET_SWB + case 32000: return 1; +#endif +#ifdef SUBSET_FB + case 44100: return 1; + case 48000: return 1; +#endif +#ifdef ENABLE_HR_MODE + case 96000: return 1; +#endif + default: return 0; + } + return 0; +} + +static int lc3plus_plc_mode_supported(LC3PLUS_PlcMode plc_mode) +{ + switch ((int)plc_mode) + { + case LC3PLUS_PLC_ADVANCED: /* fallthru */ + return 1; + default: return 0; + } + return 0; +} + +static int lc3plus_frame_size_supported(LC3PLUS_FrameDuration frame_dms) +{ + switch (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: /* fallthru */ +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: /* fallthru */ + case LC3PLUS_FRAME_DURATION_5MS: /* fallthru */ + case LC3PLUS_FRAME_DURATION_7p5MS: /* fallthru */ + case LC3PLUS_FRAME_DURATION_10MS: + return 1; + default: return 0; + } + return 0; +} + +static int null_in_list(void **list, int n) +{ + while (--n >= 0) + RETURN_IF(list[n] == NULL, 1); + return 0; +} + +/* return pointer to aligned base + base_size, *base_size += size + 4 bytes align */ +void *balloc(void *base, size_t *base_size, size_t size) +{ + uintptr_t ptr = ((uintptr_t)base + *base_size + 3) & ~3; + assert((uintptr_t)base % 4 == 0); /* base must be 4-byte aligned */ + *base_size = (*base_size + size + 3) & ~3; + return (void *)ptr; +} + +int32_t lc3_enc_supported_lfe(void) +{ + return 1; +} + +/* encoder functions *********************************************************/ + +LC3PLUS_Error lc3plus_enc_init(LC3PLUS_Enc *encoder, int samplerate, int channels +#ifdef ENABLE_HR_MODE + , int hrmode +#endif + , int32_t lfe_channel_array[] + ) +{ + int ch = 0; + + RETURN_IF(encoder == NULL, LC3PLUS_NULL_ERROR); + RETURN_IF((uintptr_t)encoder % 4 != 0, LC3PLUS_ALIGN_ERROR); + RETURN_IF(!lc3plus_samplerate_supported(samplerate), LC3PLUS_SAMPLERATE_ERROR); + RETURN_IF(!lc3plus_channels_supported(channels), LC3PLUS_CHANNELS_ERROR); +#ifdef ENABLE_HR_MODE + RETURN_IF(samplerate==96000 && hrmode == 0, LC3PLUS_HRMODE_ERROR); +#endif + + if (lfe_channel_array != NULL) + { + for (ch = 0; ch < channels; ch++) + { + RETURN_IF(!lc3_enc_supported_lfe() && lfe_channel_array[ch], LC3PLUS_LFE_MODE_NOT_SUPPORTED); + } + } + +#ifdef ENABLE_HR_MODE + return FillEncSetup(encoder, samplerate, channels, hrmode + , lfe_channel_array + ); /* real bitrate check happens here */ +#else + return FillEncSetup(encoder, samplerate, channels + , lfe_channel_array + ); /* real bitrate check happens here */ +#endif +} + +int lc3plus_enc_get_size(int samplerate, int channels) +{ + RETURN_IF(!lc3plus_samplerate_supported(samplerate), 0); + RETURN_IF(!lc3plus_channels_supported(channels), 0); + return alloc_encoder(NULL, samplerate, channels); +} + +int lc3plus_enc_get_scratch_size(const LC3PLUS_Enc *encoder) +{ + int size = 0; + RETURN_IF(encoder == NULL, 0); + +#ifdef ENABLE_HR_MODE + size = 47 * MAX(encoder->frame_length, 160) + 64; +#else + size = 14 * MAX(encoder->frame_length, 160) + 64; +#endif + assert(size <= LC3PLUS_ENC_MAX_SCRATCH_SIZE); + return size; +} + +int lc3plus_enc_get_input_samples(const LC3PLUS_Enc *encoder) +{ + RETURN_IF(encoder == NULL, 0); + return encoder->frame_length; +} + +int lc3plus_enc_get_num_bytes(const LC3PLUS_Enc *encoder) +{ + RETURN_IF(encoder == NULL, 0); + return (Word32)encoder->bitrate * encoder->frame_length / (8 * encoder->fs_in); +} + +int lc3plus_enc_get_real_bitrate(const LC3PLUS_Enc *encoder) +{ + int ch = 0, totalBytes = 0; + RETURN_IF(encoder == NULL, 0); + RETURN_IF(!encoder->lc3_br_set, LC3PLUS_BITRATE_UNSET_ERROR); + + for (ch = 0; ch < encoder->channels; ch++) + { + totalBytes += encoder->channel_setup[ch]->targetBytes; + } +#ifdef CR9_C_ADD_1p25MS + int frame_ns = (int)(1250L*(encoder->frame_dms)); + int bitrate = (long long int)((totalBytes * 8L) * 1000000L + (frame_ns - 1L)) / (frame_ns); +#else + int bitrate = (totalBytes * 80000.0 + encoder->frame_dms - 1) / encoder->frame_dms; +#endif + + if (encoder->fs_in == 44100) + { + int rem = bitrate % 480; + bitrate = ((bitrate - rem) / 480) * 441 + (rem * 441) / 480; + } + + return bitrate; +} + +LC3PLUS_Error lc3plus_enc_set_bitrate(LC3PLUS_Enc *encoder, int bitrate) +{ + RETURN_IF(encoder == NULL, LC3PLUS_NULL_ERROR); + RETURN_IF(bitrate <= 0, LC3PLUS_BITRATE_ERROR); + return update_enc_bitrate(encoder, bitrate); +} + +int lc3plus_enc_get_delay(const LC3PLUS_Enc *encoder) +{ + RETURN_IF(encoder == NULL, 0); + return encoder->frame_length - 2 * encoder->la_zeroes; +} + +LC3PLUS_Error lc3plus_enc_set_ep_mode(LC3PLUS_Enc *encoder, LC3PLUS_EpMode epmode) +{ + RETURN_IF(encoder == NULL, LC3PLUS_NULL_ERROR); + RETURN_IF((unsigned)epmode > LC3PLUS_EP_HIGH, LC3PLUS_EPMODE_ERROR); + encoder->epmode = epmode; + return encoder->lc3_br_set ? update_enc_bitrate(encoder, encoder->bitrate) : LC3PLUS_OK; +} + +LC3PLUS_Error lc3plus_enc_set_ep_mode_request(LC3PLUS_Enc *encoder, LC3PLUS_EpModeRequest epmr) +{ + RETURN_IF(encoder == NULL, LC3PLUS_NULL_ERROR); + RETURN_IF((unsigned)epmr > LC3PLUS_EPMR_HIGH, LC3PLUS_EPMR_ERROR); + encoder->epmr = epmr; + return LC3PLUS_OK; +} + +LC3PLUS_Error lc3plus_enc_set_frame_dms(LC3PLUS_Enc *encoder, LC3PLUS_FrameDuration frame_dms) +{ + RETURN_IF(encoder == NULL, LC3PLUS_NULL_ERROR); + RETURN_IF(!lc3plus_frame_size_supported(frame_dms), LC3PLUS_FRAMEMS_ERROR); + RETURN_IF(encoder->lc3_br_set, LC3PLUS_BITRATE_SET_ERROR); +#ifdef CR9_C_ADD_1p25MS + RETURN_IF(encoder->fs == 8000 && frame_dms == LC3PLUS_FRAME_DURATION_1p25MS, LC3PLUS_SAMPLERATE_ERROR); +#endif + + encoder->frame_dms = frame_dms; + set_enc_frame_params(encoder); + return LC3PLUS_OK; +} + + +LC3PLUS_Error lc3plus_enc_set_bandwidth(LC3PLUS_Enc *encoder, int bandwidth) +{ + RETURN_IF(encoder == NULL, LC3PLUS_NULL_ERROR); + Word32 effective_fs = encoder->fs_in; + if (encoder->bandwidth != bandwidth) { + if (encoder->fs_in > 40000) { + effective_fs = 40000; + } + if ((bandwidth * 2) > effective_fs) { + return LC3PLUS_BW_WARNING; + } + else { + encoder->bandwidth = bandwidth; + encoder->bandwidth_preset = bandwidth; + encoder->bw_ctrl_active = 1; + update_enc_bitrate(encoder, encoder->bitrate); + } + } + return LC3PLUS_OK; +} + + +static LC3PLUS_Error lc3plus_enc(LC3PLUS_Enc *encoder, void **input_samples, int bitdepth, void *output_bytes, int *num_bytes, + void *scratch) +{ + RETURN_IF(!encoder || !input_samples || !output_bytes || !num_bytes || !scratch, LC3PLUS_NULL_ERROR); + RETURN_IF(null_in_list(input_samples, encoder->channels), LC3PLUS_NULL_ERROR); + RETURN_IF(bitdepth != 16 && bitdepth != 24, LC3PLUS_ERROR); + RETURN_IF(!encoder->lc3_br_set, LC3PLUS_BITRATE_UNSET_ERROR); + *num_bytes = Enc_LC3PLUS(encoder, input_samples, bitdepth, output_bytes, scratch, *num_bytes == -1); + + assert(*num_bytes == lc3plus_enc_get_num_bytes(encoder)); + return LC3PLUS_OK; +} + +LC3PLUS_Error lc3plus_enc16(LC3PLUS_Enc *encoder, int16_t **input_samples, void *output_bytes, int *num_bytes, void *scratch) +{ + return lc3plus_enc(encoder, (void **)input_samples, 16, output_bytes, num_bytes, scratch); +} + +LC3PLUS_Error lc3plus_enc24(LC3PLUS_Enc *encoder, int32_t **input_samples, void *output_bytes, int *num_bytes, void *scratch) +{ + return lc3plus_enc(encoder, (void **)input_samples, 24, output_bytes, num_bytes, scratch); +} + +/* decoder functions *********************************************************/ + +LC3PLUS_Error lc3plus_dec_init(LC3PLUS_Dec *decoder, int samplerate, int channels, LC3PLUS_PlcMode plc_mode +#ifdef ENABLE_HR_MODE + , int hrmode +#endif +) +{ + RETURN_IF(decoder == NULL, LC3PLUS_NULL_ERROR); + RETURN_IF(!lc3plus_samplerate_supported(samplerate), LC3PLUS_SAMPLERATE_ERROR); + RETURN_IF(!lc3plus_channels_supported(channels), LC3PLUS_CHANNELS_ERROR); + RETURN_IF(!lc3plus_plc_mode_supported(plc_mode), LC3PLUS_PLCMODE_ERROR); +#ifdef ENABLE_HR_MODE + RETURN_IF(samplerate==96000 && hrmode == 0, LC3PLUS_HRMODE_ERROR); +#endif + + return FillDecSetup(decoder, samplerate, channels, plc_mode +#ifdef ENABLE_HR_MODE + , hrmode +#endif + ); +} + +int lc3plus_dec_get_size(int samplerate, int channels, LC3PLUS_PlcMode plc_mode) +{ + RETURN_IF(!lc3plus_samplerate_supported(samplerate), 0); + RETURN_IF(!lc3plus_channels_supported(channels), 0); + RETURN_IF(!lc3plus_plc_mode_supported(plc_mode), 0); + return alloc_decoder(NULL, samplerate, channels); +} + +int lc3plus_dec_get_scratch_size(const LC3PLUS_Dec *decoder) +{ + int size = 0; + RETURN_IF(decoder == NULL, 0); + +#ifdef ENABLE_HR_MODE + size = 30 * DYN_MAX_LEN(decoder->fs) + 2866; + size += 4 * MAX_LGW + 8 * DYN_MAX_LPROT(decoder->fs) + 16 * DYN_MAX_LEN(decoder->fs); +#else + size = 12 * DYN_MAX_LEN(decoder->fs) + 752; + size += 2 * MAX_LGW + 8 * DYN_MAX_LPROT(decoder->fs) + 8 * DYN_MAX_LEN(decoder->fs); + size += 3720; +#endif + + assert(size <= LC3PLUS_DEC_MAX_SCRATCH_SIZE); + return size; +} + +LC3PLUS_Error lc3plus_dec_set_ep_enabled(LC3PLUS_Dec *decoder, int ep_enabled) +{ + RETURN_IF(decoder == NULL, LC3PLUS_NULL_ERROR); + decoder->ep_enabled = ep_enabled != 0; + decoder->epmr = LC3PLUS_EPMR_ZERO; + return LC3PLUS_OK; +} + +int lc3plus_dec_get_error_report(const LC3PLUS_Dec *decoder) +{ + RETURN_IF(decoder == NULL, 0); + return decoder->error_report == 2047 ? -1 : decoder->error_report & 0x07FF; +} + +int lc3plus_dec_get_epok_flags(const LC3PLUS_Dec *decoder) +{ + RETURN_IF(decoder == NULL, 0); + return decoder->error_report >> 11; +} + +LC3PLUS_EpModeRequest lc3plus_dec_get_ep_mode_request(const LC3PLUS_Dec *decoder) +{ + RETURN_IF(decoder == NULL, LC3PLUS_EPMR_ZERO); + return (LC3PLUS_EpModeRequest)decoder->epmr; +} + +LC3PLUS_Error lc3plus_dec_set_frame_dms(LC3PLUS_Dec *decoder, LC3PLUS_FrameDuration frame_dms) +{ + RETURN_IF(decoder == NULL, LC3PLUS_NULL_ERROR); + RETURN_IF(!lc3plus_frame_size_supported(frame_dms), LC3PLUS_FRAMEMS_ERROR); + RETURN_IF(decoder->plcMeth == 2 && frame_dms != LC3PLUS_FRAME_DURATION_10MS, LC3PLUS_FRAMEMS_ERROR); +#ifdef CR9_C_ADD_1p25MS + RETURN_IF(decoder->fs == 8000 && frame_dms == LC3PLUS_FRAME_DURATION_1p25MS, LC3PLUS_SAMPLERATE_ERROR); +#endif + + decoder->frame_dms = frame_dms; + set_dec_frame_params(decoder); + return LC3PLUS_OK; +} + + +int lc3plus_dec_get_output_samples(const LC3PLUS_Dec *decoder) +{ + RETURN_IF(decoder == NULL, 0); + return decoder->frame_length; +} + +int lc3plus_dec_get_delay(const LC3PLUS_Dec *decoder) +{ + RETURN_IF(decoder == NULL, 0); + return decoder->frame_length - 2 * decoder->la_zeroes; +} + +static LC3PLUS_Error lc3plus_dec(LC3PLUS_Dec *decoder, void *input_bytes, int num_bytes, void **output_samples, int bitdepth, + void *scratch, int bfi_ext) +{ + if (bfi_ext == 1) + { + RETURN_IF(!decoder || !output_samples || !scratch, LC3PLUS_NULL_ERROR); + } else { + RETURN_IF(!decoder || !input_bytes || !output_samples || !scratch, LC3PLUS_NULL_ERROR); + } + + RETURN_IF(null_in_list(output_samples, decoder->channels), LC3PLUS_NULL_ERROR); + RETURN_IF(bitdepth != 16 && bitdepth != 24, LC3PLUS_ERROR); + return Dec_LC3PLUS(decoder, input_bytes, num_bytes, output_samples, bitdepth, scratch, bfi_ext); +} + +LC3PLUS_Error lc3plus_dec16(LC3PLUS_Dec *decoder, void *input_bytes, int num_bytes, int16_t **output_samples, void *scratch, int bfi_ext) +{ + return lc3plus_dec(decoder, input_bytes, num_bytes, (void **)output_samples, 16, scratch, bfi_ext); +} + +LC3PLUS_Error lc3plus_dec24(LC3PLUS_Dec *decoder, void *input_bytes, int num_bytes, int32_t **output_samples, void *scratch, int bfi_ext) +{ + return lc3plus_dec(decoder, input_bytes, num_bytes, (void **)output_samples, 24, scratch, bfi_ext); +} diff --git a/lib_lc3plus/lc3plus.h b/lib_lc3plus/lc3plus.h new file mode 100644 index 0000000000000000000000000000000000000000..2ac69c9a9b7fb0ff0f4b582226b8caadb2889178 --- /dev/null +++ b/lib_lc3plus/lc3plus.h @@ -0,0 +1,552 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +/*! \file lc3plus.h + * This header provides the API for LC3plus. + * + * This library is targeting devices with extreme memory limitations, so memory management + * must be handeled by the user. This includes allocating memory for the structs and scratch + * memory. The structs are persistent between function calls. The scratch memory is working + * memory that does not persist between function calls. + * + * The amount of memory needed for various configurations can be obtained from the lc3plus_*_get_size + * and lc3plus_*_get_scratch_size functions. If memory usage is not a concern the LC3PLUS_*_MAX_SIZE + * LC3PLUS_*_MAX_SCRATCH_SIZE macros can be used for all configurations. + * + * Depending on the build configuration some functions might not be available. + */ + +#ifndef LC3PLUS_H +#define LC3PLUS_H +#define ENABLE_HR_MODE + +#ifndef _MSC_VER +#include "options.h" +#include "wmc_auto.h" +#include +#else +typedef __int16 int16_t; +typedef __int32 int32_t; +#endif + +/*! Construct version number from major/minor/micro values. */ +#define LC3PLUS_VERSION_INT(major, minor, micro) (((major) << 16) | ((minor) << 8) | (micro)) + +/*! Version number to ensure header and binary are matching. */ +#define LC3PLUS_VERSION LC3PLUS_VERSION_INT(1, 8, 0) + +/*! Maximum number of supported channels. The actual binary might support + * less, use lc3plus_channels_supported() to check. */ +#define LC3PLUS_MAX_CHANNELS 2 + +/*! Maximum number of samples per channel that can be stored in one LC3plus frame. */ +#ifdef ENABLE_HR_MODE +#define LC3PLUS_MAX_SAMPLES 960 +#else +#define LC3PLUS_MAX_SAMPLES 480 +#endif + +/*! Maximum number of bytes of one LC3plus frame. */ +#ifdef ENABLE_HR_MODE +#define LC3PLUS_MAX_BYTES (625 * LC3PLUS_MAX_CHANNELS) +#else +#define LC3PLUS_MAX_BYTES 870 +#endif + + + + +/*! Maximum size needed to store encoder state. */ +#ifdef ENABLE_HR_MODE +#define LC3PLUS_ENC_MAX_SIZE 12628 +#else +#define LC3PLUS_ENC_MAX_SIZE 7226 +#endif + +/*! Maximum size needed to store decoder state. */ +#ifdef ENABLE_HR_MODE +#define LC3PLUS_DEC_MAX_SIZE 42488 +#else +#define LC3PLUS_DEC_MAX_SIZE 28446 +#endif + +#ifdef LRSNS_MORE_SCRATCH + +#ifdef ENABLE_HR_MODE +#define LC3PLUS_ENC_MAX_SCRATCH_SIZE (2*32767) +#define LC3PLUS_DEC_MAX_SCRATCH_SIZE (2*32767) +#else +#define LC3PLUS_ENC_MAX_SCRATCH_SIZE (2*32767) +#define LC3PLUS_DEC_MAX_SCRATCH_SIZE (2*32767) +#endif + +#else + +/*! Maximum scratch size needed by lc3plus_enc16() or lc3plus_enc24().*/ +#ifdef ENABLE_HR_MODE +#define LC3PLUS_ENC_MAX_SCRATCH_SIZE 45624 +#else +#define LC3PLUS_ENC_MAX_SCRATCH_SIZE 6784 +#endif + +/*! Maximum scratch size needed by lc3plus_dec16() or lc3plus_dec24(). */ +#ifdef ENABLE_HR_MODE +#define LC3PLUS_DEC_MAX_SCRATCH_SIZE 59768 +#else +#define LC3PLUS_DEC_MAX_SCRATCH_SIZE 27474 +#endif + +#endif + +typedef enum { + LC3PLUS_FRAME_DURATION_UNDEFINED = 0, /* Invalid */ +#ifdef CR9_C_ADD_1p25MS + LC3PLUS_FRAME_DURATION_1p25MS = 1, /* 1.25 ms */ +#endif + LC3PLUS_FRAME_DURATION_2p5MS = 2, /* 2.5 ms */ + LC3PLUS_FRAME_DURATION_5MS = 4, /* 5 ms */ + LC3PLUS_FRAME_DURATION_7p5MS = 6, /* 7.5 ms */ + LC3PLUS_FRAME_DURATION_10MS = 8, /* 10 ms */ +} LC3PLUS_FrameDuration; + +/*! Decoder packet loss concealment mode */ +typedef enum +{ + LC3PLUS_PLC_ADVANCED = 1 /*!< Enhanced concealment method */ +} LC3PLUS_PlcMode; + +/*! Error protection mode. LC3PLUS_EP_ZERO differs to LC3PLUS_EP_OFF in that + * errors can be detected but not corrected. */ +typedef enum +{ + LC3PLUS_EP_OFF = 0, /*!< Error protection is disabled */ + LC3PLUS_EP_ZERO = 1, /*!< Error protection with 0 bit correction */ + LC3PLUS_EP_LOW = 2, /*!< Error protection correcting one symbol per codeword */ + LC3PLUS_EP_MEDIUM = 3, /*!< Error protection correcting two symbols per codeword */ + LC3PLUS_EP_HIGH = 4 /*!< Error protection correcting three symbols per codeword */ +} LC3PLUS_EpMode; + +/*! Error protection mode request. On the encoder sidem, LC3PLUS_EPMR_ZERO to LC3PLUS_EPMR_HIGH + * can be set. The decoder returns mode requests with different confidences. */ +typedef enum +{ + LC3PLUS_EPMR_ZERO = 0, /*!< Request no error correction. High confidence if returned by decoder. */ + LC3PLUS_EPMR_LOW = 1, /*!< Request low error correction. High confidence if returned by decoder. */ + LC3PLUS_EPMR_MEDIUM = 2, /*!< Request medium error correction. High confidence if returned by decoder. */ + LC3PLUS_EPMR_HIGH = 3, /*!< Request high error correction. High confidence if returned by decoder. */ + LC3PLUS_EPMR_ZERO_MC = 4, /*!< No error correction requested, medium confidence. */ + LC3PLUS_EPMR_LOW_MC = 5, /*!< Low error correction requested, medium confidence. */ + LC3PLUS_EPMR_MEDIUM_MC = 6, /*!< Medium error correction requested, medium confidence. */ + LC3PLUS_EPMR_HIGH_MC = 7, /*!< High error correction requested, medium confidence. */ + LC3PLUS_EPMR_ZERO_NC = 8, /*!< No error correction requested, unvalidated. */ + LC3PLUS_EPMR_LOW_NC = 9, /*!< Low error correction requested, unvalidated. */ + LC3PLUS_EPMR_MEDIUM_NC = 10, /*!< Medium error correction requested, unvalidated. */ + LC3PLUS_EPMR_HIGH_NC = 11 /*!< High error correction requested, unvalidated. */ +} LC3PLUS_EpModeRequest; + +/*! Error codes returned by functions. */ +typedef enum +{ + LC3PLUS_OK = 0, /*!< No error occurred */ + LC3PLUS_ERROR = 1, /*!< Function call failed */ + LC3PLUS_DECODE_ERROR = 2, /*!< Frame failed to decode and was concealed */ + LC3PLUS_NULL_ERROR = 3, /*!< Pointer argument is null */ + LC3PLUS_SAMPLERATE_ERROR = 4, /*!< Invalid samplerate value */ + LC3PLUS_CHANNELS_ERROR = 5, /*!< Invalid channels value */ + LC3PLUS_BITRATE_ERROR = 6, /*!< Invalid bitrate value */ + LC3PLUS_NUMBYTES_ERROR = 7, /*!< Invalid num_bytes value */ + LC3PLUS_EPMODE_ERROR = 8, /*!< Invalid plc_method value */ + LC3PLUS_FRAMEMS_ERROR = 9, /*!< Invalid epmode value */ + LC3PLUS_ALIGN_ERROR = 10, /*!< Invalid frame_ms value */ + LC3PLUS_HRMODE_ERROR = 11, /*!< Unaligned pointer */ + LC3PLUS_BITRATE_UNSET_ERROR = 12, /*!< Invalid epmr value */ + LC3PLUS_BITRATE_SET_ERROR = 13, /*!< Invalid usage of hrmode, sampling rate and frame size */ + LC3PLUS_HRMODE_BW_ERROR = 14, /*!< Function called before bitrate has been set */ + LC3PLUS_PLCMODE_ERROR = 15, /*!< Function called after bitrate has been set */ + LC3PLUS_EPMR_ERROR = 16, /*!< Invalid external bad frame index */ + LC3PLUS_PADDING_ERROR = 17, /*!< Incorrect padding value */ + FRAMESIZE_ERROR = 18, /*!< Incorrect frame size during decoding */ + LC3PLUS_LFE_MODE_NOT_SUPPORTED = 19, /*!< LFE support not available */ + + /* START WARNING */ + LC3PLUS_WARNING = 20, + LC3PLUS_BW_WARNING = 21 /*!< Invalid bandwidth cutoff frequency */ + +} LC3PLUS_Error; + +typedef struct LC3PLUS_Enc LC3PLUS_Enc; /*!< Opaque encoder struct. */ +typedef struct LC3PLUS_Dec LC3PLUS_Dec; /*!< Opaque decoder struct. */ + +/*! \addtogroup Misc + * \{ */ + +/*! Test LFE mode support. + * + * Tests the support of the LFE mode. + * + * \return 1 for true, 0 for false. + */ +int32_t lc3_enc_supported_lfe(void); + +/*! Return library version number. It should match LC3PLUS_VERSION. */ +int lc3plus_version(void); + +/*! Tests if the library supports number of channels. + * + * \param[in] channels Number of channels. + * \return 1 for true, 0 for false. + */ +int lc3plus_channels_supported(int channels); + +/*! Tests if the library supports a sampling rate. + * + * \param[in] samplerate Sampling rate + * \return 1 for true, 0 for false + */ +int lc3plus_samplerate_supported(int samplerate); + +/*! \} + * \addtogroup Encoder + * \{ */ + +/*! + * Initialize LC3plus encoder. + * + * This function is used to fill a user-allocated encoder struct. This is typically + * called once for a samplerate / channel configuration. After init and before encoding + * the first frame you must call lc3plus_enc_set_bitrate(). + * + * \param[out] encoder Pointer to allocated encoder memory. It must have a size provided + * by lc3plus_enc_get_size() for matching samplerate / channels + * configuration or LC3PLUS_ENC_MAX_SIZE. + * \param[in] channels Number of channels. + * \param[in] samplerate Input sampling rate. Allowed sampling rates are: + * 8000, 16000, 24000, 32000, 44100, 48000 + * \param[in] hrmode High resolution mode. + * \param[in] lfe_channel_array Array containing activation of LFE mode for each individual channel. Can be NULL if LFE activation is not required. + * \return LC3PLUS_OK on success or appropriate error code. + */ +LC3PLUS_Error lc3plus_enc_init(LC3PLUS_Enc *encoder, int samplerate, int channels +#ifdef ENABLE_HR_MODE + , int hrmode +#endif + , int32_t lfe_channel_array[] + ); + +/*! + * Encode LC3plus frame with 16 bit input. + * + * Each call consumes a fixed number of samples. The number of input samples + * can be obtained from lc3plus_enc_get_input_samples(). + * + * \param[in] encoder Encoder handle initialized by lc3plus_enc_init(). + * \param[in] input_samples Input samples. The left channel is stored in input_samples[0], + * the right channel in input_samples[1]. The input is not changed + * by the encoder. + * \param[out] output_bytes Output buffer. It must have a at least lc3plus_enc_get_num_bytes() + * or at most LC3PLUS_MAX_BYTES. + * \param[out] num_bytes Number of bytes written to output_bytes. + * \param scratch A pointer to an allocated work buffer of at least + * lc3plus_enc_get_scratch_size() or at most LC3PLUS_ENC_SCRATCH_SIZE bytes. + * The buffer does not have to persist, so it can be used for other + * purposes in between calls. + * \return LC3PLUS_OK on success or appropriate error code. + */ +LC3PLUS_Error lc3plus_enc16(LC3PLUS_Enc *encoder, int16_t **input_samples, void *output_bytes, int *num_bytes, void *scratch); + +/*! Encode LC3plus frame with 24 bit input. + * + * The input samples are expected to be 24-bit values, sign-extended to 32-bit. + * See lc3plus_enc16() for parameter documentation. + */ +LC3PLUS_Error lc3plus_enc24(LC3PLUS_Enc *encoder, int32_t **input_samples, void *output_bytes, int *num_bytes, void *scratch); + +/*! Get the size of the LC3plus encoder struct for a samplerate / channel configuration. + * If memory is not restricted LC3PLUS_ENC_MAX_SIZE can be used for all configurations. + * + * \param[in] samplerate Sampling rate. + * \param[in] channels Number of channels. + * \return Size in bytes or 0 on error. + */ +int lc3plus_enc_get_size(int samplerate, int channels); + +/*! Get the size of the scratch buffer required by lc3plus_enc16() or lc3plus_enc24() for the current + * encoder configuration. If memory is not restricted, LC3PLUS_ENC_MAX_SCRATCH_SIZE can be used for + * all configurations. + * + * \param[in] encoder Encoder handle. + * \return Size in bytes or 0 on error. + */ +int lc3plus_enc_get_scratch_size(const LC3PLUS_Enc *encoder); + +/*! Get number of samples per channel expected by lc3plus_enc16() or lc3plus_enc24(). + * + * \param[in] encoder Encoder handle. + * \return Number of samples or 0 on error. + */ +int lc3plus_enc_get_input_samples(const LC3PLUS_Enc *encoder); + +/*! Get real internal bitrate of the encoder. It might differ from the requested bitrate due + * to error protection or 44.1 kHz input. + * + * \param[in] encoder Encoder handle. + * \return Bitrate in bits per second or 0 on error. + */ +int lc3plus_enc_get_real_bitrate(const LC3PLUS_Enc *encoder); + +/*! Get the maximum number of bytes produced by lc3plus_enc16() or lc3plus_enc24() for the current + * bitrate. It should be equal to the num_bytes output of lc3plus_enc16(). + * + * \param[in] encoder Encoder handle. + * \return Size in bytes or 0 on error. + */ +int lc3plus_enc_get_num_bytes(const LC3PLUS_Enc *encoder); + +/*! Set encoder bitrate for all channels. + * This function must be called at least once before encoding the first frame, but + * after other configuration functions such as lc3plus_enc_set_frame_dms(). + * + * Recommended bitrates for input sampling rates with 10 ms framing: + * kHz | kbps + * --------|----- + * 8 | 24 + * 16 | 32 + * 24 | 48 + * 32 | 64 + * 44.1/48 | 80(voice) 128(music) + * + * \param[in] encoder Encoder handle. + * \param[in] bitrate Bitrate in bits per second. + * \return LC3PLUS_OK on success or appropriate error code. + */ +LC3PLUS_Error lc3plus_enc_set_bitrate(LC3PLUS_Enc *encoder, int bitrate); + +/*! Set encoder Low-frequency effect moded. deactivates LTPF, TNS, NF. + * + * \param[in] encoder Encoder handle. + * \param[in] lfe LFE mode flag + * \return LC3PLUS_OK on success or appropriate error code. + */ +LC3PLUS_Error lc3plus_enc_set_lfe(LC3PLUS_Enc* encoder, int lfe); + +/*! Get the encoder delay in number of samples. + * + * \param[in] encoder Encoder handle. + * \return Encoder in samples or 0 on error. + */ +int lc3plus_enc_get_delay(const LC3PLUS_Enc *encoder); + +/*! Set the frame length for LC3plus encoder in deci milliseconds. + * Not all lengths may be enabled, in that case LC3PLUS_FRAMEMS_ERROR is returned. + * This function must be called before lc3plus_enc_set_bitrate(). The decoder must be + * configured with lc3plus_dec_set_frame_dms() with the same value. + * + * \param[in] encoder Encoder handle. + * \param[in] frame_ms Frame length in ms. + * \return LC3PLUS_OK on success or appropriate error code. + */ +LC3PLUS_Error lc3plus_enc_set_frame_dms(LC3PLUS_Enc *encoder, LC3PLUS_FrameDuration frame_ms); + +/*! Set error protection mode. The default is LC3PLUS_EP_OFF. It is possible to switch between + * different modees during encoding. Dynamic switching is only allowed between LC3PLUS_EP_ZERO, + * LC3PLUS_EP_LOW, LC3_EP_MEDIUM, and LC3PLUS_EP_HIGH. The the decoder must be notified with + * lc3plus_dec_set_ep_enabled() to expect protected data if epmode is other than LC3PLUS_EP_OFF. + * + * \param[in] encoder Encoder handle. + * \param[in] epmode Error protection mode. + * \return LC3PLUS_OK on success or appropriate error code. + */ +LC3PLUS_Error lc3plus_enc_set_ep_mode(LC3PLUS_Enc *encoder, LC3PLUS_EpMode epmode); + +/*! Sets error protection mode request transmitted in each channel encoded frame. + * The channel coder includes an error protection mode request (EPMR) in every frame. + * The EPMR takes value 0, 1, 2, and 3 which request ep modes 1, 2, 3, and 4 from the + * decoding device. The EPMR can be retrieved from the channel decoder via the interface + * routine lc3plus_dec_get_ep_mode_request(). + * + * \param[in] encoder Encoder handle. + * \param[in] epmr Error Protection Mode Request + * \return LC3PLUS_OK on success or appropriate error code. + */ +LC3PLUS_Error lc3plus_enc_set_ep_mode_request(LC3PLUS_Enc *encoder, LC3PLUS_EpModeRequest epmr); + +/*! Set encoder bandwidth to a different value. All frequency bins above the cutoff + * frequency are cut off. Allowed frequencies are: 4 kHz, 8 kHz, 12 kHz, 16 kHz and 24 kHz. + * + * \param[in] encoder Encoder handle. + * \param[in] bandwidth Cutoff Frequency in Hz + * \return LC3PLUS_OK on success or appropriate error code. + */ +LC3PLUS_Error lc3plus_enc_set_bandwidth(LC3PLUS_Enc *encoder, int bandwidth); + +/*! \} + * \addtogroup Decoder + * \{ */ + + +/*! + * Initialize LC3plus decoder. + * + * This function is used to fill a user-allocated decoder struct. This is typically + * called once for a samplerate / channel / plc_mode configuration. + * + * The samplerate and channel arguments must have the same values that were used for encoding. + * LC3plus does not provide a signalling scheme, transporting these values is the responsibility + * of the application. + * + * \param[out] decoder Pointer to decoder memory. It must have as size of least + * lc3plus_dec_get_size() or at most LC3PLUS_DEC_MAX_SIZE. + * \param[in] samplerate Bitstream sampling rate. + * \param[in] channels Bitstream number of channels. + * \param[in] plc_mode Packet loss concealment mode. + * \param[in] hrmode High resolution mode mode. + * + * \return LC3PLUS_OK on success or appropriate error code. + */ +LC3PLUS_Error lc3plus_dec_init(LC3PLUS_Dec *decoder, int samplerate, int channels, LC3PLUS_PlcMode plc_mode +#ifdef ENABLE_HR_MODE + , int hrmode +#endif + ); + +/*! + * Decode compressed LC3plus frame to 16 bit PCM output. + * + * Each call decodes a fixed number of samples. Use lc3plus_dec_get_output_samples() to obtain this + * number. When the input is corrupted and can not be decoded, LC3PLUS_DECODE_ERROR is returned and + * packet loss concealment is applied, so the output is still usable. + * If error protection is enabled and the errors can be corrected the frame is corrected and + * normally decoded. Use lc3plus_dec_get_error_report() to check if errors were corrected. + * + * \param[in] decoder Decoder initialized by lc3plus_dec_init(). + * \param[in] input_bytes Input bytes. If error protection is enabled the input bytes can be + * altered when error correction is applied. This is why this buffer + * must be writable. + * \param[in] num_bytes Number of valid bytes in input_bytes. To signal a lost frame and + * generate concealment output this value must be set to 0. + * \param[out] output_samples Array of pointers to output channel buffers. Each channel buffer + * should provide enough space to hold at most LC3PLUS_MAX_SAMPLES. The + * left channel is stored in output_samples[0], the right channel in + * output_samples[1]. + * \param scratch A pointer to an allocated work buffer of at least + * lc3plus_dec_get_scratch_size() or at most LC3PLUS_DEC_MAX_SCRATCH_SIZE + * bytes. The scratch buffer does not have to persist, so it can be + * used for other purposes in between calls. + * \param[in] bfi_ext Bad Frame Indicator. 0: Good Frame. 1: Bad Frame, apply PLC. + * \return Returns LC3PLUS_OK on success or appropriate error code. Note there is + * a special case for LC3PLUS_DECODE_ERROR where the output is still valid. + */ +LC3PLUS_Error lc3plus_dec16(LC3PLUS_Dec *decoder, void *input_bytes, int num_bytes, int16_t **output_samples, void *scratch, + int bfi_ext); + +/*! Decode compressed LC3plus frame to 24 bit PCM output. + * + * The output samples are 24-bit values, sign-extended to 32-bit. + * See lc3plus_dec16() for parameter documentation. + */ +LC3PLUS_Error lc3plus_dec24(LC3PLUS_Dec *decoder, void *input_bytes, int num_bytes, int32_t **output_samples, void *scratch, + int bfi_ext); + +/*! Get the size of the LC3plus decoder struct for a samplerate / channel / plc_mode configuration. + * If memory is not restricted LC3PLUS_DEC_MAX_SIZE can be used for all configurations. + * + * \param[in] channels Number of channels. + * \param[in] samplerate Sampling rate. + * \param[in] plc_mode Packet loss concealment mode. + * \return Size in bytes or 0 on error. + */ +int lc3plus_dec_get_size(int samplerate, int channels, LC3PLUS_PlcMode plc_mode); + +/*! Get the size of the scratch buffer required by lc3plus_dec16() or lc3plus_dec24() for the current + * decoder configuration. If memory is not restricted LC3PLUS_DEC_MAX_SCRATCH_SIZE can be used for + * all configurations. + * + * \param[in] decoder Decoder handle. + * \return Size in bytes or 0 on error. + */ +int lc3plus_dec_get_scratch_size(const LC3PLUS_Dec *decoder); + +/*! Get the number of samples per channel produced by lc3plus_dec16() or lc3plus_dec24(). + * + * \param[in] decoder Decoder handle. + * \return Number of samples or 0 on error. + */ + +int lc3plus_dec_get_output_samples(const LC3PLUS_Dec *decoder); + +/*! Get the decoder delay in number of samples. + * + * \param[in] decoder Decoder handle. + * \return Delay in samples or 0 on error. + */ +int lc3plus_dec_get_delay(const LC3PLUS_Dec *decoder); + +/*! Set the frame length for LC3plus decoder in deci milliseconds. + * Not all lengths may be enabled, in that case LC3PLUS_FRAMEMS_ERROR is returned. + * This only works correcly if the encoder was configured with the same vale. + * + * \param[in] decoder Decoder handle. + * \param[in] frame_ms Frame length in ms. + * \return LC3PLUS_OK on success or appropriate error code. + */ +LC3PLUS_Error lc3plus_dec_set_frame_dms(LC3PLUS_Dec *decoder, LC3PLUS_FrameDuration frame_ms); + +/*! Enable or disable error protection. Default value is 0 (disabled). If error protection is + * enabled, the decoder expects that the frames were encoded with error protection mode + * LC3PLUS_EP_ZERO or higher. + * + * \param[in] decoder Decoder handle. + * \param[in] ep_enabled 1 (or any nonzero) for true, 0 for false. + * \return LC3PLUS_OK on success or appropriate error code. + */ +LC3PLUS_Error lc3plus_dec_set_ep_enabled(LC3PLUS_Dec *decoder, int ep_enabled); + +/*! Retrieves the error protection mode reqeust from channel decoder. + * + * The return value encodes both the error protection mode request (EPMR) + * and the confidence of the method by which it was retrieved. + * + * The requested error protection mode is (epmr % 4) + 1, where epmr is the + * function's return value. The confidence is specified as follows. + * + * Confidence | Range + * -----------|------------- + * high | 0 <= epmr < 4 + * medium | 4 <= epmr < 8 + * no | 8 <= epmr < 12 + * + * When receiving stereo content of separately channel encoded audio frames the + * return value is the minimum of two values retrieved from the individual channels. + * + * \param[in] decoder Decoder handle. + * \return Error protection mode reqeust. + */ +LC3PLUS_EpModeRequest lc3plus_dec_get_ep_mode_request(const LC3PLUS_Dec *decoder); + +/*! Get the number of corrected bit errors in the last decoded frame. This only works if + * error protection is active. If the number of errors is greater than the current error + * protection mode can correct, -1 is returned. If the last frame had no errors or the + * decoder handle is NULL, 0 is returned, + * + * \param[in] decoder Decoder handle. + * \return Number of corrected bits or -1. See description for details. + */ +int lc3plus_dec_get_error_report(const LC3PLUS_Dec *decoder); +/*! This function returns an set of flags indicating whether the last frame + * would have been channel decodable in epmode m, m ranging from 1 to 4. Note that + * this information is not available in case the last frame was not channel + * decodable in which case the return value is 0. If the last frame would have + * been decodable in epmode m, m-1th of the return value will be 1. + * Otherwise, if the frame would not have been decodable or if this information + * cannot be retrieved, the m-1th bit of the return value will be 0. + */ +int lc3plus_dec_get_epok_flags(const LC3PLUS_Dec *decoder); + +/*! \} */ +#endif /* LC3PLUS_H */ diff --git a/lib_lc3plus/levinson_fx.c b/lib_lc3plus/levinson_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..3cb547439c3512e685f9bb491f76aa81064babc6 --- /dev/null +++ b/lib_lc3plus/levinson_fx.c @@ -0,0 +1,162 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +void processLevinson_fx(Word32 *lpc, Word32 *ac, Word16 N, Word16 *rc, Word32 *pred_err, Word8 *scratchBuffer) +{ + + Word32 *lpc_tmp; + Word32 rc32, err, sum; + Word16 shift, s, inv; + Counter n, m; + + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processLevinson_fx", sizeof(struct { + Word32 *lpc_tmp; + Word32 rc32, err, sum; + Word16 shift, s, inv; + Counter n, m; + Word32 params[2]; + })); +#endif + + lpc_tmp = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 4 * (M_LTPF + 1) = 100 bytes */ + + /* Init Prediction Error */ + err = ac[0]; move32(); + shift = 0; move16(); + + /* LPC Coefficient 0 */ + lpc[0] = 0x8000000; move32(); + + /* Reflection Coefficient 0 */ + IF (ac[0] != 0) + { + inv = div_s(16383, extract_h(ac[0])); + rc32 = L_shl_pos(Mpy_32_32_lc3plus(L_abs(ac[1]), Mpy_32_16_lc3plus(L_sub(MAX_32, Mpy_32_16_lc3plus(ac[0], inv)), inv)), 2); + } + ELSE + { + rc32 = 0; move32(); + } + if (ac[1] > 0) + { + rc32 = L_negate(rc32); + } + if (rc != NULL) + { + rc[0] = round_fx(rc32); move16(); + } + + /* LPC Coefficient 1 */ + lpc[1] = L_shr_pos(rc32, 4); move32(); + + FOR (n = 2; n <= N; n++) + { + /* Update Prediction Error */ + err = Mpy_32_32_lc3plus(err, L_sub(MAX_32, Mpy_32_32_lc3plus(rc32, rc32))); + s = norm_l(err); + err = L_shl_pos(err, s); + shift = add(shift, s); + + /* Reflection Coefficient n-1 */ + sum = Mpy_32_32_lc3plus(ac[1], lpc[n - 1]); + FOR (m = 2; m < n; m++) + { + sum = L_add(sum, Mpy_32_32_lc3plus(ac[m], lpc[n - m])); + } + + sum = L_add(L_shl_pos(sum, 4), ac[n]); + IF (err != 0) + { + inv = div_s(16383, extract_h(err)); + rc32 = L_shl_pos(Mpy_32_32_lc3plus(L_abs(sum), Mpy_32_16_lc3plus(L_sub(MAX_32, Mpy_32_16_lc3plus(err, inv)), inv)), 2); + } + ELSE + { + rc32 = 0; + } + if (sum > 0) + { + rc32 = L_negate(rc32); + } + rc32 = L_shl(rc32, shift); + if (rc != NULL) + { + rc[n - 1] = round_fx(rc32); move16(); + } + +/* Recompute LPC Coefficients up to n-1 */ + FOR (m = 1; m < n; m++) + { + lpc_tmp[m] = L_add(lpc[m], Mpy_32_32_lc3plus(rc32, lpc[n - m])); move32(); + } + + basop_memmove(&lpc[1], &lpc_tmp[1], (n - 1) * sizeof(Word32)); + + /* LPC Coefficient n */ + lpc[n] = L_shr_pos(rc32, 4); move32(); + } + + /* Final Prediction Error */ + IF (pred_err != NULL) + { + err = Mpy_32_32_lc3plus(err, L_sub(MAX_32, Mpy_32_32_lc3plus(rc32, rc32))); + *pred_err = L_shr(err, shift); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + + +void lpc2rc(Word32 *lpc, Word16 *rc, Word16 N) +{ + Word32 lpc_tmp[MAXLAG + 1]; + Word32 rc32, tmp0, tmp1; + Word16 inv; + Counter n, m; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("lpc2rc", sizeof(struct { + Word32 lpc_tmp[MAXLAG + 1]; + Word32 rc32, tmp0, tmp1; + Word16 inv; + Counter n, m; + })); +#endif + + FOR (n = N; n >= 2; n--) + { + rc32 = L_shl_pos(lpc[n], 4); + rc[n - 1] = round_fx(rc32); move16(); + + tmp0 = L_sub(MAX_32, L_abs(Mpy_32_32_lc3plus(rc32, rc32))); + FOR (m = 1; m < n; m++) + { + tmp1 = L_sub(lpc[m], Mpy_32_32_lc3plus(lpc[n - m], rc32)); + inv = div_s(16383, extract_h(tmp0)); + lpc_tmp[m] = L_shl_pos(Mpy_32_32_lc3plus(tmp1, Mpy_32_16_lc3plus(L_sub(MAX_32, Mpy_32_16_lc3plus(tmp0, inv)), inv)), 2); move32(); + } + + basop_memmove(&lpc[1], &lpc_tmp[1], (n - 1) * sizeof(Word32)); + } + + rc[0] = round_fx(L_shl_pos(lpc[1], 4)); move32(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + diff --git a/lib_lc3plus/license.h b/lib_lc3plus/license.h new file mode 100644 index 0000000000000000000000000000000000000000..a692e0ed4d0d1ca4e566cc050add85b776e51e9f --- /dev/null +++ b/lib_lc3plus/license.h @@ -0,0 +1,23 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" + +static const char *const LICENSE = + "*******************************************************************************\n" + "* ETSI TS 103 634 V1.6.1 *\n" + "* Low Complexity Communication Codec Plus (LC3plus) *\n" + "* Fixed Point Software V%i.%i.%iETSI, " __DATE__ " *\n" + "* Copyright licence is solely granted through ETSI Intellectual Property *\n" + "* Rights Policy, 3rd April 2019. No patent licence is granted by implication, *\n" + "* estoppel or otherwise. *\n" + "*******************************************************************************\n" + "\n"; diff --git a/lib_lc3plus/ltpf_coder_fx.c b/lib_lc3plus/ltpf_coder_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..bf2ea18ab3f1c2773df4970619487c41834b1db8 --- /dev/null +++ b/lib_lc3plus/ltpf_coder_fx.c @@ -0,0 +1,430 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +#ifdef CR9_C_ADD_1p25MS_LRSNS +#include "constants.h" +#endif + +/*************************************************************************/ + + +void process_ltpf_coder_fx(Word16 *bits, Word16 ol_pitch, Word16 ltpf_enable, Word16 *mem_in_exp, Word16 mem_in[], + Word16 mem_in_len, Word16 param[], Word16 *xin, Word16 len, Word16 *mem_normcorr, + Word16 *mem_mem_normcorr, Word16 ol_normcorr, Word16 *mem_ltpf_on, Word16 *mem_ltpf_pitch, + Word16 xin_exp, LC3PLUS_FrameDuration frame_dms, Word8 *scratchBuffer + , Word16 hrmode +#ifdef CR9_C_ADD_1p25MS +#ifdef NEW_SIGNALLING_SCHEME_1p25 + , Word16* Tx_ltpf +#else + , Word16 Tx_ltpf +#endif +#endif +) +{ + Word16 pitch_index, scale0, scale1, scale2, *x, x_exp, shift, prod_exp, ltpf_pitch; + Word32 L_tmp, cor_max32, sum0, sum1, sum2, prod, inv; + Word32 *ac32; + Word16 *ac, *currFrame, *predFrame; + Word16 min_pitch, max_pitch, ac_min_pitch, ac_max_pitch, ac_max; + Word16 pitch, pitch_res, min_pitch_fr, pitch_int, pitch_fr, norm_corr, ltpf_active; + Counter n, m, fr; + Word16 tmp, acflen; +#if defined (CR9_C_ADD_1p25MS) + Word16 activation_due_to_past_corr, activation_due_to_stable_pitch, activation; +#endif + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("process_ltpf_coder_fx", sizeof(struct { + Word16 pitch_index, scale0, scale1, scale2, *x, x_exp, shift, prod_exp, ltpf_pitch; + Word32 L_tmp, cor_max32, sum0, sum1, sum2, prod, inv; + Word32 *ac32; + Word16 *ac, *currFrame, *predFrame; + Word16 min_pitch, max_pitch, ac_min_pitch, ac_max_pitch, ac_max; + Word16 pitch, pitch_res, min_pitch_fr, pitch_int, pitch_fr, norm_corr, ltpf_active; + Counter n, m, fr; + Word16 tmp, acflen; + })); +#endif + + UNUSED(mem_mem_normcorr); + + ac32 = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 4 * 17 = 68 bytes; */ + ac = (Word16 *)scratchAlign(ac32, sizeof(*ac32) * 17); /* Size = 2 * 17 = 34 bytes */ + currFrame = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * 128 = 256 bytes */ + predFrame = (Word16 *)scratchAlign(currFrame, sizeof(*currFrame) * LEN_12K8); /* Size = 2 * 128 = 256 bytes */ + /* Buffers 'overlap' since they are not used at the same time */ /* Total size used = 512 bytes */ + + ltpf_active = 0; move16(); + norm_corr = 0; move16(); + + /* Input buffer */ + x = mem_in + mem_in_len; + + basop_memmove(x, xin, (len + 1) * sizeof(Word16)); + + ASSERT(mem_in_len + len + 1 <= LTPF_MEMIN_LEN + LEN_12K8 + 1); + + /* Scaling */ + scale0 = sub(getScaleFactor16_0(mem_in, mem_in_len), 3); + *mem_in_exp = sub(*mem_in_exp, scale0); move16(); + scale1 = sub(getScaleFactor16_0(x, len + 1), 3); + x_exp = sub(xin_exp, scale1); + scale2 = sub(*mem_in_exp, x_exp); + IF (scale2 > 0) + { + Scale_sig(x, len + 1, sub(scale1, scale2)); + Scale_sig(mem_in, mem_in_len, scale0); + x_exp = *mem_in_exp; move16(); + } + ELSE + { + Scale_sig(x, len + 1, scale1); + Scale_sig(mem_in, mem_in_len, add(scale0, scale2)); + *mem_in_exp = x_exp; move16(); + } + + Word32 normCorrTh = 0; + if (hrmode) { + normCorrTh = 13107; + } else { + normCorrTh = 19660; + } + + IF (sub(ol_normcorr, normCorrTh) > 0) + { + /* Autocorrelation Bounds */ + min_pitch = sub(ol_pitch, 4); + max_pitch = add(ol_pitch, 4); + min_pitch = s_max(min_pitch, MIN_PITCH_12K8); + max_pitch = s_min(max_pitch, MAX_PITCH_12K8); + ac_min_pitch = sub(min_pitch, 4); + ac_max_pitch = add(max_pitch, 4); + acflen = len; move16(); + +#ifndef FIX_LTPF_PITCH_MEM_LEN + IF ( sub( frame_dms, LC3PLUS_FRAME_DURATION_2p5MS ) == 0 ) + { + acflen = shl( len, 1 ); + x = x - len; + } + +#ifdef CR9_C_ADD_1p25MS + IF ( sub( frame_dms, LC3PLUS_FRAME_DURATION_1p25MS ) == 0 ) + { + acflen = shl( len, 2 ); + x = x - 80; + } +#endif +#else + if (sub(frame_dms, LC3PLUS_FRAME_DURATION_5MS) == 0) + { + acflen = shl(len, 1); + } + if (sub(frame_dms, LC3PLUS_FRAME_DURATION_2p5MS) == 0) + { + acflen = shl(len, 2); + } +#ifdef CR9_C_ADD_1p25MS + if (sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0) + { + acflen = shl(len, 3); + } +#endif + x = x - (mem_in_len - LTPF_MEMIN_LEN); +#endif + /* Compute norm */ + sum1 = L_mac0(1, x[0], x[0]); + sum2 = L_mac0(1, x[-ac_min_pitch], x[-ac_min_pitch]); + FOR (m = 1; m < acflen; m++) + { + sum1 = L_mac0(sum1, x[m], x[m]); + sum2 = L_mac0(sum2, x[m - ac_min_pitch], x[m - ac_min_pitch]); + } + scale1 = norm_l(sum1); + sum1 = L_shl_pos(sum1, scale1); + + /* Compute Autocorrelation */ + FOR (n = ac_min_pitch; n <= ac_max_pitch; n++) + { + sum0 = L_mac0(0L, x[0], x[0 - n]); + FOR (m = 1; m < acflen; m++) + { + sum0 = L_mac0(sum0, x[m], x[m - n]); + } + if (n > ac_min_pitch) + { + sum2 = L_msu0(sum2, x[acflen - 1 - (n - 1)], x[acflen - 1 - (n - 1)]); + sum2 = L_mac0_sat(sum2, x[-n], x[-n]); + } + scale2 = norm_l(sum2); + L_tmp = L_shl_pos(sum2, scale2); + prod = Mpy_32_32_lc3plus(sum1, L_tmp); + shift = norm_l(prod); + prod = L_shl_pos(prod, shift); + prod_exp = sub(62, add(add(scale1, scale2), shift)); + inv = Isqrt_lc3plus(prod, &prod_exp); + scale0 = norm_l(sum0); + sum0 = L_shl_pos(sum0, scale0); + prod = Mpy_32_32_lc3plus(sum0, inv); + prod_exp = add(sub(31, scale0), prod_exp); + test(); + IF (prod == 0 || sub(norm_l(prod), prod_exp) >= 0) + { + ac[n - ac_min_pitch] = s_max(0, round_fx_sat(L_shl_sat(prod, prod_exp))); move16(); + } + ELSE + { + ac[n - ac_min_pitch] = 32767; move16(); + } + } + + /* Find maximum */ + ac_max = ac[min_pitch - ac_min_pitch]; move16(); + pitch = min_pitch; move16(); + + FOR (n = min_pitch + 1; n <= max_pitch; n++) + { + tmp = sub_sat(ac[n - ac_min_pitch], ac_max); + + if (tmp > 0) + { + pitch = n; move16(); + } + ac_max = s_max(ac_max, ac[n - ac_min_pitch]); + } + pitch_int = pitch; move16(); + pitch_fr = 0; move16(); + pitch_index = add(pitch_int, 283); + + /* If the pitch is low -> estimate a fractional part */ + IF (sub(pitch, RES2_PITCH_12K8) < 0) + { + IF (sub(pitch, RES4_PITCH_12K8) < 0) + { + pitch_res = 1; move16(); + min_pitch_fr = -3; move16(); + } + ELSE + { + pitch_res = 2; move16(); + min_pitch_fr = -2; move16(); + } + if (sub(pitch, min_pitch) == 0) + { + min_pitch_fr = 0; + } + cor_max32 = MIN_32; + FOR (fr = min_pitch_fr; fr < 4; fr += pitch_res) + { + sum0 = L_mult0(ac[pitch_int - ac_min_pitch - 4], ltpf_ac_interp_filt[fr + 3][0]); + sum0 = L_mac0(sum0, ac[pitch_int - ac_min_pitch - 3], ltpf_ac_interp_filt[fr + 3][1]); + sum0 = L_mac0(sum0, ac[pitch_int - ac_min_pitch - 2], ltpf_ac_interp_filt[fr + 3][2]); + sum0 = L_mac0(sum0, ac[pitch_int - ac_min_pitch - 1], ltpf_ac_interp_filt[fr + 3][3]); + sum0 = L_mac0(sum0, ac[pitch_int - ac_min_pitch + 0], ltpf_ac_interp_filt[fr + 3][4]); + sum0 = L_mac0(sum0, ac[pitch_int - ac_min_pitch + 1], ltpf_ac_interp_filt[fr + 3][5]); + sum0 = L_mac0(sum0, ac[pitch_int - ac_min_pitch + 2], ltpf_ac_interp_filt[fr + 3][6]); + sum0 = L_mac0(sum0, ac[pitch_int - ac_min_pitch + 3], ltpf_ac_interp_filt[fr + 3][7]); + sum0 = L_mac0(sum0, ac[pitch_int - ac_min_pitch + 4], ltpf_ac_interp_filt[fr + 3][8]); + + L_tmp = L_sub_sat(sum0, cor_max32); + if (L_tmp > 0) + { + pitch_fr = fr; move16(); + } + cor_max32 = L_max(cor_max32, sum0); + } + IF (pitch_fr < 0) + { + pitch_int = sub(pitch_int, 1); + pitch_fr = add(pitch_fr, 4); + } + IF (sub(pitch_int, 127) >= 0) + { + pitch_index = add(add(shl_pos(pitch_int, 1), shr_pos(pitch_fr, 1)), 126); + } + ELSE + { + pitch_index = sub(add(shl_pos(pitch_int, 2), pitch_fr), 128); + } + } + ltpf_pitch = add(shl_pos(pitch_int, 2), pitch_fr); + + /* Filter current and predicted frame */ + + FOR (n = 0; n < acflen; n++) + { + sum0 = L_mult(x[n + 1], inter_filter[0][0][0]); + sum0 = L_mac(sum0, x[n], inter_filter[0][0][1]); + currFrame[n] = mac_r(sum0, x[n - 1], inter_filter[0][0][2]); + + sum0 = L_mult(x[n - pitch_int + 1], inter_filter[0][pitch_fr][0]); + sum0 = L_mac(sum0, x[n - pitch_int], inter_filter[0][pitch_fr][1]); + sum0 = L_mac(sum0, x[n - pitch_int - 1], inter_filter[0][pitch_fr][2]); + predFrame[n] = mac_r(sum0, x[n - pitch_int - 2], inter_filter[0][pitch_fr][3]); + } + + /* Normalized Correlation */ + sum0 = L_mult0(currFrame[0], predFrame[0]); + sum1 = L_mac0(1, predFrame[0], predFrame[0]); + sum2 = L_mac0(1, currFrame[0], currFrame[0]); + for (m = 1; m < acflen; m++) + { + sum0 = L_mac0(sum0, currFrame[m], predFrame[m]); + sum1 = L_mac0(sum1, predFrame[m], predFrame[m]); + sum2 = L_mac0(sum2, currFrame[m], currFrame[m]); + } + + scale1 = norm_l(sum1); + scale2 = norm_l(sum2); + sum1 = L_shl_pos(sum1, scale1); + sum2 = L_shl_pos(sum2, scale2); + prod = Mpy_32_32_lc3plus(sum1, sum2); + shift = norm_l(prod); + prod = L_shl_pos(prod, shift); + prod_exp = sub(62, add(add(scale1, scale2), shift)); + inv = Isqrt_lc3plus(prod, &prod_exp); + scale0 = norm_l(sum0); + sum0 = L_shl_pos(sum0, scale0); + prod = Mpy_32_32_lc3plus(sum0, inv); + prod_exp = add(sub(31, scale0), prod_exp); + test(); + IF (prod == 0 || sub(norm_l(prod), prod_exp) >= 0) + { + norm_corr = s_max(0, round_fx_sat(L_shl_sat(prod, prod_exp))); move16(); + } + ELSE + { + norm_corr = 32767; move16(); + } + if (norm_corr < 0) + { + norm_corr = 0; + } + + IF (sub(ltpf_enable, 1) == 0) + { + test(); test(); test(); test(); + /* Decision if lptf active */ +#if defined (CR9_C_ADD_1p25MS) + activation_due_to_past_corr = sub(mem_normcorr[1], 30802) > 0; + activation_due_to_stable_pitch = 1; + IF (frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) + { + activation_due_to_past_corr &= sub(mem_normcorr[2], 30802) > 0; + activation_due_to_past_corr &= sub(mem_normcorr[3], 30802) > 0; + activation_due_to_past_corr &= sub(mem_normcorr[4], 30802) > 0; + + /* 0.7 * max(pitch,mem.pitch(1)) < min(pitch,mem.pitch(1)); */ + Word16 tmp_max = s_max(ltpf_pitch, *mem_ltpf_pitch); + Word16 tmp_min = s_min(ltpf_pitch, *mem_ltpf_pitch); + activation_due_to_stable_pitch = shr(mult(shl(tmp_max,5),22938),5) < tmp_min; + } + activation = activation_due_to_past_corr && activation_due_to_stable_pitch; + + IF( ( *mem_ltpf_on == 0 && sub( *mem_normcorr, 30802 ) > 0 && sub( norm_corr, 30802 ) > 0 && + ( sub( frame_dms, LC3PLUS_FRAME_DURATION_10MS ) == 0 || activation ) ) || + ( sub( *mem_ltpf_on, 1 ) == 0 && sub( norm_corr, 29491 ) > 0 ) & activation_due_to_stable_pitch || + ( sub( *mem_ltpf_on, 1 ) == 0 && sub( abs_s( sub( ltpf_pitch, *mem_ltpf_pitch ) ), 8 ) < 0 && + add( sub( norm_corr, *mem_normcorr ), 3277 ) > 0 && sub( norm_corr, 27525 ) > 0 ) ) +#else + IF( ( *mem_ltpf_on == 0 && sub( mem_normcorr[0], 30802 ) > 0 && sub( norm_corr, 30802 ) > 0 && + ( sub( frame_dms, LC3PLUS_FRAME_DURATION_10MS ) == 0 || sub( mem_normcorr[1], 30802 ) > 0 ) ) || + ( sub( *mem_ltpf_on, 1 ) == 0 && sub( norm_corr, 29491 ) > 0 ) || + ( sub( *mem_ltpf_on, 1 ) == 0 && sub( abs_s( sub( ltpf_pitch, *mem_ltpf_pitch ) ), 8 ) < 0 && + add( sub( norm_corr, mem_normcorr[0] ), 3277 ) > 0 && sub( norm_corr, 27525 ) > 0 ) ) +#endif + { + ltpf_active = 1; move16(); + } + } + + param[0] = 1; move16(); + param[1] = ltpf_active; move16(); + param[2] = pitch_index; move16(); + *bits = 11; move16(); + } + ELSE + { + norm_corr = ol_normcorr; move16(); + param[0] = 0; move16(); + param[1] = 0; move16(); + param[2] = 0; move16(); + *bits = 1; move16(); + ltpf_pitch = 0; move16(); + } + +#ifdef CR9_C_ADD_1p25MS + if ( sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0 ) + { +#ifdef NEW_SIGNALLING_SCHEME_1p25 + tmp = s_min(*Tx_ltpf, 1); /* tmp == 0 == phaseA, tmp==1==PhaseB ) */ + test(); test(); test(); + if (param[0] == 0 && tmp != 0) + { + /* pitch correlation dropped from high(ltpf_active) to low(no ltp info at all ), + we select to NOT send the remaining phaseB laginfo for use in a possible low corr PLC frame */ + *Tx_ltpf = 0; move16(); /* kill the lag transmission state at encoder side */ + } + + /* 00 (ltp=0, ltpf=0, no Phase, 2b), + 010yyyy (ltp=1, ltpf=0, phaseA, 7b), + 011zzzz (ltp=1, ltpf=0, phaseB , 7b), "zzzz=lowered lag res for PLC use" + 10yyyy (ltp=1, ltpf=1) phaseA 6b) + 11ZZZZZ (ltp=1, ltpf=1) phaseB 7b) "ZZZZZ= full lag resolution for LTPF use" + */ + test(); + IF(param[0] != 0) + { + test(); + IF(param[1] == 0) + { /* ltpf inactive */ + tmp = s_or(shl(param[0], 1), tmp); /* LTP in b1 phase in LSB b0 , tmp becomes 2 or 3 */ + ASSERT(tmp==2 || tmp == 3 ); + } + ELSE + { /* ltpf active */ + ASSERT(param[2] >= 0 && param[2] <= 511); + tmp = s_or(0x04, shl(tmp, 1)); /* LTPF in b2, phase b1, always zero in b0 , tmp becomes 4 or 6 */ + ASSERT(tmp == 4 || tmp == 6); + } + } + *bits = lrsns_ltp_bits_fx[tmp]; move16(); /* one of { 2,2, 7,7 , 6,6, 7,7} */ + /* tmp as idx is 0,1 2,3 4,5, 6,7 */ + ASSERT(*bits >= 2 && *bits <= 7); +#else + ASSERT(*bits == 1 || *bits == 11 ); +#endif + } +#else + ASSERT(*bits == 1 || *bits == 11 ); +#endif /* CR9_C_ADD_1p25MS */ + +/* Update memory */ + FOR (n = 0; n < mem_in_len; n++) + { + mem_in[n] = mem_in[n + len]; move16(); + } + + FOR (n = LEN_MEM_NORMCORR-2; n>=0; n--) { + mem_normcorr[n+1] = mem_normcorr[n]; move16(); + } + + *mem_normcorr = norm_corr; move16(); + *mem_ltpf_on = ltpf_active; move16(); + *mem_ltpf_pitch = ltpf_pitch; move16(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} diff --git a/lib_lc3plus/ltpf_decoder_fx.c b/lib_lc3plus/ltpf_decoder_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..084b7738bbae866cd9d4c9331c4cc215ba1ea733 --- /dev/null +++ b/lib_lc3plus/ltpf_decoder_fx.c @@ -0,0 +1,914 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +static void ltpf_synth_filter(Word16 *synth_ltp, Word16 *synth, Word16 length, Word16 pitch_int, Word16 pitch_fr, + Word16 gain, Word16 scale_fac_idx, Word16 fs_idx, + Word16 fade /* 0=normal, +1=fade-in, -1=fade-out */ + , Word16 continuation, Word16 splitFading +#ifdef LTPF_ADAPTIVE_GAIN + , LC3PLUS_FrameDuration frame_dms +#endif + ); + + +/*************************************************************************/ + +#ifdef CR9_C_ADD_1p25MS +static void get_continuation (Word16 fading_case, LC3PLUS_FrameDuration frame_dms, Word16 *continuation) +{ + if (frame_dms != LC3PLUS_FRAME_DURATION_1p25MS) { + *continuation = 0; + } + else + { + if ( *continuation > 0 ) + { + *continuation = 0; + } + else + { + *continuation = fading_case; + } + } +} +#endif + +#ifdef LTPF_ADAPTIVE_GAIN_WITH_NORM_CORR +static Word16 compare_normalized_corrs(Word16 *sig, Word16 len, Word16 pitch_int, Word16 old_pitch_int) +{ + Word32 sum0, sum1, sum2, prod, inv; + Word32 sum0_prev, sum2_prev, prod_prev; + Word16 scale0, scale1, scale2, shift, prod_exp, prod_exp_prev; + Word32 norm_corr, norm_corr_prev; + + sum0 = L_mult0( sig[0], sig[-pitch_int] ); + sum1 = L_mac0( 1, sig[0], sig[0] ); + sum2 = L_mac0( 1, sig[-pitch_int], sig[-pitch_int] ); + + sum0_prev = L_mult0( sig[0], sig[-old_pitch_int] ); + sum2_prev = L_mac0( 1, sig[-old_pitch_int], sig[-old_pitch_int] ); + + FOR (int i=1; i < len; i++) + { + sum0 = L_mac0( sum0, sig[i], sig[i - pitch_int] ); + sum1 = L_mac0( sum1, sig[i], sig[i] ); + sum2 = L_mac0( sum2, sig[i - pitch_int], sig[i - pitch_int] ); + + sum0_prev = L_mac0( sum0_prev, sig[i], sig[i - old_pitch_int] ); + sum2_prev = L_mac0( sum2_prev, sig[i - old_pitch_int], sig[i - old_pitch_int] ); + } + + scale1 = norm_l( sum1 ); + scale2 = norm_l( sum2 ); + sum1 = L_shl_pos( sum1, scale1 ); + sum2 = L_shl_pos( sum2, scale2 ); + prod = Mpy_32_32_lc3plus( sum1, sum2 ); + shift = norm_l( prod ); + prod = L_shl_pos( prod, shift ); + prod_exp = sub( 62, add( add( scale1, scale2 ), shift ) ); + inv = Isqrt_lc3plus( prod, &prod_exp ); + scale0 = norm_l( sum0 ); + sum0 = L_shl_pos( sum0, scale0 ); + prod = Mpy_32_32_lc3plus( sum0, inv ); + prod_exp = add( sub( 31, scale0 ), prod_exp ); + +#ifdef FIX_LTPFDEC_BASOP + norm_corr = INT_MAX; move32(); + test(); + if(prod == 0 || sub(norm_l(prod), prod_exp) >= 0) + { + norm_corr = L_shl_sat(prod, prod_exp); + } + norm_corr = L_max(0, norm_corr); +#else + test(); + IF( prod == 0 || sub( norm_l( prod ), prod_exp ) >= 0 ) + { + norm_corr = L_max( 0, L_shl_sat( prod, prod_exp ) ); + } + ELSE + { + norm_corr = 2147483647; move32(); + } + + if ( norm_corr < 0 ) + { + norm_corr = 0; move32(); + } +#endif + + + scale2 = norm_l( sum2_prev ); + sum2_prev = L_shl_pos( sum2_prev, scale2 ); + prod_prev = Mpy_32_32_lc3plus( sum1, sum2_prev ); + shift = norm_l( prod_prev ); + prod_prev = L_shl_pos( prod_prev, shift ); + prod_exp_prev = sub( 62, add( add( scale1, scale2 ), shift ) ); + inv = Isqrt_lc3plus( prod_prev, &prod_exp_prev ); + scale0 = norm_l( sum0_prev ); + sum0_prev = L_shl_pos( sum0_prev, scale0 ); + prod_prev = Mpy_32_32_lc3plus( sum0_prev, inv ); + prod_exp_prev = add( sub( 31, scale0 ), prod_exp_prev ); + +#ifdef FIX_LTPFDEC_BASOP + norm_corr_prev = INT_MAX; move32(); + test(); + if( prod_prev == 0 || sub( norm_l( prod_prev ), prod_exp_prev ) >= 0 ) + { + norm_corr_prev = L_shl_sat( prod_prev, prod_exp_prev ); + } + norm_corr_prev = L_max( 0L, norm_corr_prev); +#else + test(); + IF( prod_prev == 0 || sub(norm_l(prod_prev), prod_exp_prev) >= 0) + { + norm_corr_prev = L_max(0, L_shl_sat(prod_prev, prod_exp_prev)); move32(); + } + ELSE + { + norm_corr_prev = 2147483647; move32(); + } + + IF(norm_corr_prev < 0) + { + norm_corr_prev = 0; + } +#endif + +#ifdef FIX_LTPFDEC_BASOP + IF(L_sub_sat(L_sub(norm_corr_prev, norm_corr), 1073742L) > 0) +#else + IF( L_sub(L_sub(norm_corr_prev, norm_corr), 1073742L ) > 0) +#endif + { + return 1; + } + + return 0; +} +#endif + +void process_ltpf_decoder_fx(Word16 *x_e, Word16 L_frame, Word16 old_x_len, Word16 fs_idx, Word16 old_y_len, + Word16 *old_e, Word16 *x_in, Word16 *old_x, Word16 *y_out, Word16 *old_y, Word16 ltpf, + Word16 ltpf_active, Word16 pitch_index, Word16 *old_pitch_int, Word16 *old_pitch_fr, + Word16 *old_gain, Word16 *mem_ltpf_active, Word16 scale_fac_idx, Word16 bfi, + Word16 concealMethod, + Word16 damping, Word16 *old_scale_fac_idx, + Word32 *rel_pitch_change, Word16 hrmode, LC3PLUS_FrameDuration frame_dms, + Word8 *scratchBuffer +#ifdef CR9_C_ADD_1p25MS + , Word16* mem_continuation, Word16* mem_pitch_int_prev, + Word16* mem_pitch_fr_prev, Word16* mem_beta_idx_prev, Word16* mem_gain_prev, Word16 *ltpf_mem_active_prev, Word16* pitch_stability_counter +#endif + ) +{ + Counter i; + Word16 gain, s, s0, s1, pitch, pitch_int, pitch_fr, N4, N34, fading_case, split_fading; + Word16 *x, *y; + Word16* z; + Word32 tmp32, pitch_delta; + +#ifdef LTPF_ADAPTIVE_GAIN + Word16 bkp_ltpf_active = 0; + Word16 bkp_pitch_int = 0, bkp_pitch_fr = 0; + Word16 bkp_gain = 0; +#endif + +#ifdef DYNMEM_COUNT +#ifndef CR9_N_SHORT_FADE_FOR_UNSTABLE_PITCH + Dyn_Mem_In( "process_ltpf_decoder_fx", sizeof( struct { + Counter i; + Word16 gain, s, s0, s1, pitch, pitch_int, pitch_fr, N4, N34; + Word16 *x, *y; + Word16* z; + } ) ); +#else + Dyn_Mem_In("process_ltpf_decoder_fx", sizeof(struct { + Counter i; + Word16 gain, s, s0, s1, pitch, pitch_int, pitch_fr, N4, N34; + Word16 *x, *y; + Word16* z; + Word32 tmp32, pitch_delta; + })); +#endif + +#endif + + z = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = MAX_LEN / 4 + 10 */ + + +#ifdef CR9_C_ADD_1p25MS + UNUSED( frame_dms ); + UNUSED( mem_continuation ); + UNUSED( mem_pitch_int_prev ); + UNUSED( mem_pitch_fr_prev ); + UNUSED( mem_beta_idx_prev ); + UNUSED( mem_gain_prev ); +#else + Word16 mem_cont = 0; + Word16* mem_continuation = &mem_cont; +#ifndef FIX_LTPF_MEM_CONTINUATION + fading_case = 0; +#endif + UNUSED( mem_continuation ); +#endif + +#ifdef FIX_LTPF_MEM_CONTINUATION + fading_case = 0; +#endif + + split_fading = 0; +#ifdef CR9_C_ADD_1p25MS + if ( frame_dms == LC3PLUS_FRAME_DURATION_1p25MS ) + { + split_fading = 1; + } +#endif + test(); + IF ((sub(bfi, 1) == 0) && (sub(concealMethod, LC3_CON_TEC_NS_STD) == 0)) + { + ltpf = 0; move16(); + ltpf_active = 0; move16(); + pitch_int = 0; move16(); + pitch_fr = 0; move16(); + gain = 0; move16(); + } + +#ifdef FIX_LTPF_1p25 + IF (pitch_index == -1) { + ltpf = 0; + ltpf_active = 0; + } +#endif + + /* Filter parameters */ + IF (sub(bfi, 1) != 0) + { + IF (ltpf == 0) + { + pitch_int = 0; move16(); + pitch_fr = 0; move16(); + } + ELSE + { + /* Decode pitch */ + IF (sub(pitch_index, 380) < 0) + { + pitch_int = shr_pos(add(pitch_index, 64), 2); + pitch_fr = add(sub(pitch_index, shl_pos(pitch_int, 2)), 128); + } + ELSE IF (sub(pitch_index, 440) < 0) + { + pitch_int = shr_pos(sub(pitch_index, 126), 1); + pitch_fr = sub(sub(shl_pos(pitch_index, 1), shl_pos(pitch_int, 2)), 252); + } + ELSE + { + pitch_int = sub(pitch_index, 283); + pitch_fr = 0; move16(); + } + pitch = add(shl_pos(pitch_int, 2), pitch_fr); +#ifdef ENABLE_HR_MODE + IF (sub(fs_idx, 5) == 0) + { + pitch = round_fx(L_shl_pos(L_mult(shl_pos(pitch, 2), pitch_scale[4]), 1)); + } + ELSE +#endif + { + pitch = mult_r(shl_pos(pitch, 2), pitch_scale[fs_idx]); + } + pitch_int = shr_pos(pitch, 2); + pitch_fr = sub(pitch, shl_pos(pitch_int, 2)); + } + + /* Decode gain */ + if (scale_fac_idx < 0) + { + ltpf_active = 0; + ASSERT(!(*old_scale_fac_idx < 0 && *mem_ltpf_active == 1)); + } + IF (ltpf_active == 0) + { + gain = 0; move16(); + } + ELSE + { + ASSERT(scale_fac_idx >= 0); + gain = gain_scale_fac[scale_fac_idx]; move16(); + } + } +#ifdef CR9_C_ADD_1p25MS + ELSE IF ( (sub(concealMethod, LC3_CON_TEC_NS_STD) != 0) + && (*mem_continuation == 0) ) +#else + ELSE IF (sub(concealMethod, LC3_CON_TEC_NS_STD) != 0) +#endif + { + /* fix to avoid not initialized filtering for concelament + might be necessary in case of bit errors or rate switching */ + if (scale_fac_idx < 0) { + if (*mem_ltpf_active && *old_scale_fac_idx>=0) + { + scale_fac_idx = *old_scale_fac_idx; + } + } + + ltpf_active = *mem_ltpf_active; move16(); + + if ((sub(concealMethod, LC3_CON_TEC_PHASE_ECU) == 0)) + { /* always start fade off to save filtering WMOPS for the remaining 7.5 ms */ + assert(bfi == 1); + ltpf_active = 0; move16(); /*always start fade off , still maintain *mem_ltpf_active */ + } + + pitch_int = *old_pitch_int; + pitch_fr = *old_pitch_fr; + gain = mult_r(*old_gain, damping); + } + +#ifdef CR9_C_ADD_1p25MS + IF (*mem_continuation > 0) + { +#ifdef LTPF_ADAPTIVE_GAIN + /* Backup LTPF parameters */ + bkp_ltpf_active = ltpf_active; + bkp_pitch_int = pitch_int; + bkp_pitch_fr = pitch_fr; + bkp_gain = gain; +#endif + + fading_case = *mem_continuation; + ltpf_active = *mem_ltpf_active; + pitch_int = *old_pitch_int; + pitch_fr = *old_pitch_fr; + gain = *old_gain; +#ifdef FIX_LTPF_1p25 + scale_fac_idx = *old_scale_fac_idx; +#endif + *mem_ltpf_active = *ltpf_mem_active_prev; + *old_pitch_int = *mem_pitch_int_prev; + *old_pitch_fr = *mem_pitch_fr_prev; + *old_gain = *mem_gain_prev; +#ifdef FIX_LTPF_1p25 + *old_scale_fac_idx = *mem_beta_idx_prev; +#endif + } +#endif + +#ifdef LTPF_ADAPTIVE_GAIN + IF (frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) + { +#ifdef FIX_LTPF_DEC_FLFX_MISMATCH + /* Control variables */ + Word8 ltpf_active_ctrl = ltpf_active; + Word8 ltpf_active_prev_ctrl = *mem_ltpf_active; +#endif + Word8 pitch_changed = !( ( pitch_int == *old_pitch_int ) && ( pitch_fr == *old_pitch_fr ) ); + Word8 pitch_was_stable = ( ( *pitch_stability_counter >= LTPF_PITCH_STABILITY_THRESHOLD ) ); + +#ifdef CR9_C_ADD_1p25MS + IF ( *mem_continuation == 0 ) + { +#endif + +#ifdef LTPF_ADAPTIVE_GAIN_WITH_NORM_CORR + Word16 tmp_y[LTPF_MEM_Y_LEN] = {0}; + basop_memmove( tmp_y, old_y, ( old_y_len ) * sizeof( Word16 ) ); + basop_memmove( tmp_y + old_y_len, x_in, ( L_frame ) * sizeof( Word16 ) ); + + Word16 scale1 = sub( getScaleFactor16_0( tmp_y, old_y_len + L_frame ), 3 ); + Scale_sig( tmp_y, old_y_len + L_frame, scale1 ); + + IF ( !pitch_was_stable && pitch_changed && pitch_int != 0 && *old_pitch_int != 0 ) + { + pitch_was_stable = compare_normalized_corrs(tmp_y + old_y_len, L_frame, pitch_int, *old_pitch_int); + } +#endif + +#ifdef FIX_LTPF_DEC_FLFX_MISMATCH + IF ( ltpf_active_ctrl && !pitch_changed ) +#else + IF ( ltpf_active && !pitch_changed ) +#endif + { + /* increment gain and increment pitch stability counter */ + gain = pitch_was_stable ? MIN( max_adaptive_gain[scale_fac_idx], MAX( gain, *old_gain ) + adaptive_gain_step ) : MAX( gain, *old_gain ); + (*pitch_stability_counter)++; + } +#ifdef FIX_LTPF_DEC_FLFX_MISMATCH + ELSE IF ( ltpf_active_ctrl && pitch_changed && !pitch_was_stable ) +#else + ELSE IF ( ltpf_active && pitch_changed && !pitch_was_stable ) +#endif + { + /* decrement gain and reset pitch stability counter */ + gain = ( *old_gain > gain) ? MAX( gain, *old_gain - max_adaptive_gain_step[scale_fac_idx] ) : gain; + *pitch_stability_counter = 0; + } +#ifdef FIX_LTPF_DEC_FLFX_MISMATCH + ELSE IF ( !ltpf_active_ctrl && !pitch_was_stable && ltpf_active_prev_ctrl && pitch_changed ) +#else + ELSE IF ( !ltpf_active && !pitch_was_stable && *mem_ltpf_active && pitch_changed ) +#endif + { + /* decrement gain, use previous pitch and reset pitch stability counter */ + gain = *old_gain - adaptive_gain_step; + + if (scale_fac_idx>=0 && (gain-gain_scale_fac[scale_fac_idx]) > -20) + { + ltpf_active = *mem_ltpf_active; + pitch_int = *old_pitch_int; + pitch_fr = *old_pitch_fr; + } + else + { + gain = 0; + } + *pitch_stability_counter = 0; + } +#ifdef FIX_LTPF_DEC_FLFX_MISMATCH + ELSE IF ( ( ltpf_active_ctrl && pitch_changed && pitch_was_stable ) || ( !ltpf_active_ctrl && pitch_was_stable ) || ( !ltpf_active_ctrl && !pitch_was_stable && ltpf_active_prev_ctrl && !pitch_changed ) ) +#else + ELSE IF ( ( ltpf_active && pitch_changed && pitch_was_stable ) || ( !ltpf_active && pitch_was_stable ) || ( !ltpf_active && !pitch_was_stable && *mem_ltpf_active && !pitch_changed ) ) +#endif + { + /* use previous pitch and gain and reset pitch stability counter */ + ltpf_active = *mem_ltpf_active; + pitch_int = *old_pitch_int; + pitch_fr = *old_pitch_fr; + gain = *old_gain; + *pitch_stability_counter = 0; + } +#ifdef CR9_C_ADD_1p25MS /* This preprocessor is added here for the future when adaptive gain will be enabled for other frame sizes. */ + } +#ifdef FIX_PLC_CONFORM_ISSUES + ELSE IF ( *mem_continuation != 0 && bkp_ltpf_active == 1 && bfi == 0 ) +#else + ELSE IF ( *mem_continuation != 0 && bkp_ltpf_active == 1 ) +#endif + { + /* Code enters this block if LTPF is reenabled when adaptive gain is being applied. */ + /* In this case, use new LTPF parameters but with a smaller gain than in the prev frame. */ + fading_case = 0; + *mem_continuation = 0; + + *ltpf_mem_active_prev = *mem_ltpf_active; + *mem_pitch_int_prev = *old_pitch_int; + *mem_pitch_fr_prev = *old_pitch_fr; + *mem_gain_prev = *old_gain; + + *mem_ltpf_active = ltpf_active; + *old_pitch_int = pitch_int; + *old_pitch_fr = pitch_fr; + *old_gain = gain; + + ltpf_active = bkp_ltpf_active; + pitch_int = bkp_pitch_int; + pitch_fr = bkp_pitch_fr; + gain = bkp_gain; + + /* if prev gain > curr gain, then decrease gain slowly.*/ + gain = ( *old_gain > gain) ? MAX( gain, *old_gain - max_adaptive_gain_step[scale_fac_idx] ) : gain; + + *pitch_stability_counter = 0; + } +#endif + } +#endif /* LTPF_ADAPTIVE_GAIN */ + +#ifdef FIX_LTPF_1p25 + if ( *mem_ltpf_active && *old_scale_fac_idx < 0 ) + { + *mem_ltpf_active = 0; + } + + if ( ltpf_active && scale_fac_idx < 0 ) + { + ltpf_active = 0; + } +#endif + + IF( sub( fs_idx, 5 ) < 0 ) + { + test(); + test(); + +#ifdef FIX_LTPF_MEM_CONTINUATION + IF( ( ltpf_active == 0 && *mem_ltpf_active == 0 ) || fading_case == 1 ) +#else + IF( ltpf_active == 0 && *mem_ltpf_active == 0 && *mem_continuation == 0 ) +#endif + { + /* LTPF inactive */ + basop_memmove( y_out, x_in, L_frame * sizeof( Word16 ) ); +#ifdef FIX_LTPF_MEM_CONTINUATION +#ifdef CR9_C_ADD_1p25MS + fading_case = 1; + get_continuation( fading_case, frame_dms, mem_continuation ); +#endif +#endif + + + /* Update */ + s = sub(*old_e, *x_e); + IF (s > 0) + { + basop_memmove(old_y, &old_y[L_frame], (old_y_len - L_frame) * sizeof(Word16)); + + IF (sub(s, 15) > 0) + { + basop_memset(&old_y[old_y_len - L_frame], 0, (L_frame) * sizeof(Word16)); + + basop_memset(old_x, 0, (old_x_len) * sizeof(Word16)); + } + ELSE + { + FOR (i = 0; i < L_frame; i++) + { + old_y[i + old_y_len - L_frame] = shr(x_in[i], s); move16(); + } + FOR (i = 0; i < old_x_len; i++) + { + old_x[i] = shr(x_in[i + L_frame - old_x_len], s); move16(); + } + } + } + ELSE + { + IF (sub(s, -15) < 0) + { + basop_memset(old_y, 0, (old_y_len - L_frame) * sizeof(Word16)); + } + ELSE + { + FOR (i = 0; i < old_y_len - L_frame; i++) + { + old_y[i] = shl(old_y[i + L_frame], s); move16(); + } + } + + basop_memmove(&old_y[old_y_len - L_frame], x_in, (L_frame) * sizeof(Word16)); + + basop_memmove(old_x, &x_in[L_frame - old_x_len], (old_x_len) * sizeof(Word16)); + + *old_e = *x_e; + move16(); + } + *old_gain = 0; + move16(); + *mem_ltpf_active = 0; + move16(); + } + ELSE + { + /* Input/Output buffers */ + x = old_x + old_x_len; + y = old_y + old_y_len; + +#ifdef ENABLE_HR_MODE + assert( fs_idx < 5 && "Ltpf not supported for 96kHz!\n" ); +#endif + + N4 = ltpf_overlap_len[fs_idx]; + move16(); +#ifdef CR9_C_ADD_1p25MS + N4 = N4 >> split_fading; +#endif + N34 = sub( L_frame, N4 ); + move16(); + + /* Input */ + basop_memmove(x, x_in, (L_frame) * sizeof(Word16)); + + /* Scaling */ + s0 = sub(s_min(getScaleFactor16_0(old_x, old_x_len), getScaleFactor16_0(old_y, old_y_len)), 1); + *old_e = sub(*old_e, s0); move16(); + s1 = sub(getScaleFactor16(x, L_frame), 1); + *x_e = sub(*x_e, s1); move16(); + s = sub(*old_e, *x_e); + IF (s > 0) + { + Scale_sig(x, L_frame, sub(s1, s)); + Scale_sig(old_x, old_x_len, s0); + Scale_sig(old_y, old_y_len, s0); + *x_e = *old_e; move16(); + } + ELSE + { + Scale_sig(x, L_frame, s1); + Scale_sig(old_x, old_x_len, add(s0, s)); + Scale_sig(old_y, old_y_len, add(s0, s)); + *old_e = *x_e; move16(); + } + + test(); +#ifndef FIX_LTPF_1p25 + IF (sub(*mem_ltpf_active, 1) == 0 && *old_scale_fac_idx < 0) + { + *mem_ltpf_active = 0; + } +#endif +#ifdef CR9_C_ADD_1p25MS + IF (*mem_continuation == 0) + { +#endif + /* fading case */ + IF (ltpf_active == 0) + { + fading_case = 3; + } + ELSE IF (*mem_ltpf_active == 0) + { + fading_case = 2; + } + ELSE IF (sub(pitch_int, *old_pitch_int) == 0 && sub(*old_pitch_fr, pitch_fr) == 0) + { + fading_case = 4; + } + ELSE + { + fading_case = 5; + } +#ifdef CR9_C_ADD_1p25MS + } +#endif + + /* Filtering */ + IF( sub( fading_case, 3 ) == 0 ) + { + ltpf_synth_filter( y, x, N4, *old_pitch_int, *old_pitch_fr, *old_gain, *old_scale_fac_idx, fs_idx, -1, *mem_continuation, split_fading +#ifdef LTPF_ADAPTIVE_GAIN + , + frame_dms +#endif + ); + } + ELSE IF( sub( fading_case, 2 ) == 0 ) + { + ltpf_synth_filter( y, x, N4, pitch_int, pitch_fr, gain, scale_fac_idx, fs_idx, 1, *mem_continuation, split_fading +#ifdef LTPF_ADAPTIVE_GAIN + , + frame_dms +#endif + ); + } + ELSE IF( sub( fading_case, 4 ) == 0 ) + { + ltpf_synth_filter( y, x, N4, pitch_int, pitch_fr, gain, scale_fac_idx, fs_idx, 0, *mem_continuation, split_fading +#ifdef LTPF_ADAPTIVE_GAIN + , + frame_dms +#endif + ); + } + ELSE + { + ltpf_synth_filter( y, x, N4, *old_pitch_int, *old_pitch_fr, *old_gain, *old_scale_fac_idx, fs_idx, + -1, *mem_continuation, split_fading +#ifdef LTPF_ADAPTIVE_GAIN + , + frame_dms +#endif + ); + + basop_memmove( z, y - tilt_filter_len[fs_idx], ( N4 + tilt_filter_len[fs_idx] ) * sizeof( Word16 ) ); + + ltpf_synth_filter( y, z + tilt_filter_len[fs_idx], N4, pitch_int, pitch_fr, gain, scale_fac_idx, + fs_idx, 1, *mem_continuation, split_fading +#ifdef LTPF_ADAPTIVE_GAIN + , + frame_dms +#endif + ); + } +#ifdef CR9_C_ADD_1p25MS + IF( sub( fading_case, 1 ) > 0 ) + { + get_continuation( fading_case, frame_dms, mem_continuation ); + } +#endif + +#ifdef CR9_C_ADD_1p25MS + IF( ltpf_active > 0 && frame_dms > LC3PLUS_FRAME_DURATION_1p25MS ) +#else + IF( ltpf_active > 0 ) +#endif + { + ltpf_synth_filter( y + N4, x + N4, N34, pitch_int, pitch_fr, gain, + scale_fac_idx, fs_idx, 0, 0, 0 +#ifdef LTPF_ADAPTIVE_GAIN + , + frame_dms +#endif + ); + } + ELSE + { + basop_memmove( &y[N4], &x[N4], N34 * sizeof( Word16 ) ); + } + + /* Output */ + basop_memmove( y_out, y, ( L_frame ) * sizeof( Word16 ) ); + + /* Update */ + basop_memmove( old_x, &old_x[L_frame], ( old_x_len ) * sizeof( Word16 ) ); + basop_memmove( old_y, &old_y[L_frame], ( old_y_len ) * sizeof( Word16 ) ); + +#ifndef FIX_LTPF_DEC_FLFX_MISMATCH +#ifdef CR9_C_ADD_1p25MS + if ( frame_dms == LC3PLUS_FRAME_DURATION_1p25MS ) + { + *mem_pitch_int_prev = *old_pitch_int; + *mem_pitch_fr_prev = *old_pitch_fr; + *mem_gain_prev = *old_gain; + *ltpf_mem_active_prev = *mem_ltpf_active; + } +#endif + + *old_gain = gain; + move16(); + *mem_ltpf_active = ltpf_active; + move16(); +#endif + } + } + + + + + IF( bfi == 0 && sub( hrmode, 1 ) == 0 && ( sub( frame_dms, LC3PLUS_FRAME_DURATION_5MS ) == 0 || sub( frame_dms, LC3PLUS_FRAME_DURATION_2p5MS ) == 0 ) ) + { + pitch_delta = abs_s( add( sub( *old_pitch_int, pitch_int ), shr_pos( sub( *old_pitch_fr, pitch_fr ), 2 ) ) ); + tmp32 = BASOP_Util_Divide3216_Scale( pitch_delta, MAX( add( *old_pitch_int, shr_pos( *old_pitch_fr, 2 ) ), 1 ), &s0 ); + IF( s0 + 16 < 0 ) + { + *rel_pitch_change = L_shr_pos( tmp32, -( s0 + 16 ) ); + } + ELSE + { + *rel_pitch_change = L_shl_pos( tmp32, s0 + 16 ); + } + } + +#ifdef FIX_LTPF_DEC_FLFX_MISMATCH +#ifdef CR9_C_ADD_1p25MS + if ( frame_dms == LC3PLUS_FRAME_DURATION_1p25MS ) + { + *mem_pitch_int_prev = *old_pitch_int; + *mem_pitch_fr_prev = *old_pitch_fr; + *mem_gain_prev = *old_gain; + *ltpf_mem_active_prev = *mem_ltpf_active; + *mem_beta_idx_prev = *old_scale_fac_idx; + } +#endif + + *old_gain = gain; + move16(); + *mem_ltpf_active = ltpf_active; + move16(); +#endif + + *old_pitch_int = pitch_int; + move16(); + *old_pitch_fr = pitch_fr; + move16(); + *old_scale_fac_idx = scale_fac_idx; + move16(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + + +static void ltpf_synth_filter(Word16 *synth_ltp, Word16 *synth, Word16 length, Word16 pitch_int, Word16 pitch_fr, + Word16 gain, Word16 scale_fac_idx, Word16 fs_idx, + Word16 fade /* 0=normal, +1=fade-in, -1=fade-out */ + ,Word16 continuation, Word16 splitFading +#ifdef LTPF_ADAPTIVE_GAIN + , LC3PLUS_FrameDuration frame_dms +#endif + ) +{ + Word16 *x0; + Word16 *y0; + Word32 s; + Word16 alpha, step; + Word16 i, k; + Counter j, l; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("ltpf_synth_filter", sizeof(struct { + Word16 *x0; + Word16 *y0; + Word32 s; + Word16 alpha, step; + Word16 i, k; + Counter j, l; + })); +#endif + + ASSERT(scale_fac_idx >= 0); + + step = 0; /* initialize just to avoid compiler warning */ + alpha = 0; /* initialize just to avoid compiler warning */ + x0 = &synth_ltp[-pitch_int + inter_filter_shift[fs_idx]]; + y0 = synth; + + alpha = 0; move16(); + + IF (fade != 0) + { + if (fade < 0) + { + alpha = 0x7FFF; move16(); + } + if (continuation > 0) { + alpha = shr(0x7FFF,1); + } + +/* step = 1.f/(float)(length); */ + if (sub(length, 20) == 0) + { + step = 1638 /*1.f/20.f Q15*/; move16(); + } + if (sub(length, 30) == 0) + { + step = 1092 /*1.f/30.f Q15*/; move16(); + } + if (sub(length, 40) == 0) + { + step = 819 /*1.f/40.f Q15*/; move16(); + } + if (sub(length, 60) == 0) + { + step = 546 /*1.f/60.f Q15*/; move16(); + } + if (sub(length, 80) == 0) + { + step = 409 /*1.f/80.f Q15*/; move16(); + } + if (sub(length, 120) == 0) + { + step = 273 /*1.f/120.f Q15*/; move16(); + } + + if (fade < 0) + step = negate(step); + + if (splitFading != 0) + step = shr(step,1); + } + + FOR (j = 0; j < length; j++) + { + const Word16* tilt_filter_ptr = tilt_filter[fs_idx][scale_fac_idx]; +#ifdef LTPF_ADAPTIVE_GAIN + IF ( frame_dms == LC3PLUS_FRAME_DURATION_1p25MS ) + { + tilt_filter_ptr = tilt_filter_1p25ms[fs_idx][scale_fac_idx]; + } +#endif + + s = L_mult( x0[0], inter_filter[fs_idx][pitch_fr][0] ); + FOR( l = 1; l < inter_filter_len[fs_idx]; l++ ) + { + s = L_mac(s, x0[-l], inter_filter[fs_idx][pitch_fr][l]); + } + FOR (l = 0; l < tilt_filter_len[fs_idx]; l++) + { + s = L_msu( s, y0[-l], tilt_filter_ptr[l] ); + } + + i = msu_r( s, y0[-l], tilt_filter_ptr[l] ); + + k = mult_r(gain, i); + + if (fade != 0) + k = mult_r(k, alpha); + + synth_ltp[j] = add(synth[j], k); move16(); + + if (fade != 0) + alpha = add(alpha, step); + + x0++; + y0++; + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + diff --git a/lib_lc3plus/mdct_fx.c b/lib_lc3plus/mdct_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..b2cde56ab91d3b13fe748c3a985ef8ce57c59493 --- /dev/null +++ b/lib_lc3plus/mdct_fx.c @@ -0,0 +1,169 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +/* Union holding buffers to conserve stack memory. */ + +void processMdct_fx( +#ifdef ENABLE_HR_MODE + Word32 x[], /* i: time input signal */ +#else + Word16 x[], /* i: time input signal */ +#endif + Word16 x_exp, Word16 N, /* i: block size N */ +#ifdef ENABLE_HR_MODE + Word16 hrmode, /* i: indicate high precision */ +#endif +#ifdef ENABLE_HR_MODE + const Word32 w[], /* i: window coefficients including normalization of sqrt(2/N) and scaled by 2^4 */ +#else + const Word16 w[], /* i: window coefficients including normalization of sqrt(2/N) and scaled by 2^4 */ +#endif + Word16 wLen, /* i: window length */ +#ifdef ENABLE_HR_MODE + Word32 mem[], /* i/o: last block of input samples */ +#else + Word16 mem[], /* i/o: last block of input samples */ +#endif + Word16 memLen, /* i: length of last sample block */ + Word32 y[], /* o: spectral data */ + Word16 * y_e, /* o: spectal data exponent */ + Word8 * scratchBuffer) +{ + Counter i; + Word16 z, s, m; +#ifdef ENABLE_HR_MODE + Word32 *buf; +#else + Word16 *buf; +#endif + Word32 *workBuffer; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processMdct_fx", sizeof(struct { + Counter i; + Word16 z, s, m; + Word16 *buf; + Word32 *workBuffer; + })); +#endif + + /* Buffers overlap since they are not used at the same time */ +#ifdef ENABLE_HR_MODE + buf = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * MAX_LEN */ +#else + buf = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * MAX_LEN */ +#endif + workBuffer = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 4 * MAX_LEN */ + + /* Init (constant per sample rate) */ + z = (N << 1) - wLen; /* number of leading zeros in window */ + m = N >> 1; /* half block size */ + +#ifdef ENABLE_HR_MODE + basop_memmove(buf, mem, memLen * sizeof(Word32)); + + basop_memmove(&buf[memLen], x, (N - memLen) * sizeof(Word32)); + + basop_memmove(mem, &x[N - memLen], memLen * sizeof(Word32)); +#else + basop_memmove(buf, mem, memLen * sizeof(Word16)); + + basop_memmove(&buf[memLen], x, (N - memLen) * sizeof(Word16)); + + basop_memmove(mem, &x[N - memLen], memLen * sizeof(Word16)); +#endif + +#ifdef ENABLE_HR_MODE + if (hrmode) + { + FOR (i = 0; i < m; i++) + { + y[m + i] = Msu_32_32_0(Mpy_32_32_0(w[i], buf[i]), w[2 * m - 1 - i], buf[2 * m - 1 - i]); move32(); + } + + FOR (i = 0; i < z; i++) + { + y[m - 1 - i] = Mpy_32_32_0(w[2 * m + i], x[2 * m - memLen + i]); move32(); + } + + FOR (i = i; i < m; i++) + { + y[m - 1 - i] = Mac_32_32_0(Mpy_32_32_0(w[2 * m + i], x[2 * m - memLen + i]), w[4 * m - 1 - i], x[4 * m - memLen - 1 - i]); move32(); + } + } else { + FOR (i = 0; i < m; i++) + { + y[m + i] = L_msu0(L_mult0(round_fx_sat(buf[i]), round_fx(w[i])), round_fx_sat(buf[2 * m - 1 - i]), round_fx(w[2 * m - 1 - i])); move32(); + } + + FOR (i = 0; i < z; i++) + { + y[m - 1 - i] = L_mult0(round_fx_sat(x[2 * m - memLen + i]), round_fx(w[2 * m + i])); move32(); + } + + FOR (i = i; i < m; i++) + { + y[m - 1 - i] = L_mac0(L_mult0(round_fx_sat(x[2 * m - memLen + i]), round_fx(w[2 * m + i])), round_fx_sat(x[4 * m - memLen - 1 - i]), + round_fx(w[4 * m - 1 - i])); move32(); + } + } +#else + /* regular resolution only */ + FOR (i = 0; i < m; i++) + { + y[m + i] = L_msu0(L_mult0(buf[i], w[i]), buf[2 * m - 1 - i], w[2 * m - 1 - i]); move32(); + } + + FOR (i = 0; i < z; i++) + { + y[m - 1 - i] = L_mult0(x[2 * m - memLen + i], w[2 * m + i]); move32(); + } + + FOR (i = i; i < m; i++) + { + y[m - 1 - i] = L_mac0(L_mult0(x[2 * m - memLen + i], w[2 * m + i]), x[4 * m - memLen - 1 - i], + w[4 * m - 1 - i]); move32(); + } +#endif + + s = s_max(0, getScaleFactor32(y, N)); + FOR (i = 0; i < N; i++) + { + y[i] = L_shl(y[i], s); move32(); + } + + *y_e = sub(sub(x_exp, 2), s); + + /* N=20 only for 2.5ms possible */ + /* maybe implement this a pre init of shift */ + if (sub(N, 30) <= 0) + { + *y_e = add(*y_e, 2); + } + else if (sub(N, 120) <= 0) + { + *y_e = add(*y_e, 1); + } +#ifdef ENABLE_HR_MODE + dct_IV(y, y_e, N, + hrmode, + workBuffer); +#else + dct_IV(y, y_e, N, workBuffer); +#endif + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + diff --git a/lib_lc3plus/mdct_shaping_fx.c b/lib_lc3plus/mdct_shaping_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..90e29aa362b5f24fcfd06a8e6e47325b2ccac136 --- /dev/null +++ b/lib_lc3plus/mdct_shaping_fx.c @@ -0,0 +1,76 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +void processMdctShaping_fx(Word32 x[], +#ifdef ENABLE_HR_MODE + Word32 scf[], +#else + Word16 scf[], +#endif + Word16 scf_exp[], const Word16 bands_offset[], Word16 fdns_npts) +{ + Counter i, j; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processMdctShaping_fx", sizeof(struct { Counter i, j; })); +#endif + + j = 0; move16(); + FOR (i = 0; i < fdns_npts; i++) + { + FOR (; j < bands_offset[i + 1]; j++) + { +#ifdef ENABLE_HR_MODE + x[j] = L_shl(Mpy_32_32_lc3plus(x[j], scf[i]), scf_exp[i]); move32(); +#else + x[j] = L_shl(Mpy_32_16_lc3plus(x[j], scf[i]), scf_exp[i]); move32(); +#endif + } + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + + +void processScfScaling(Word16 scf_exp[], Word16 fdns_npts, Word16 *x_e) +{ + Counter i; + Word16 scf_exp_max; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processLpcGainScaling", sizeof(struct { + Counter i; + Word16 scf_exp_max; + })); +#endif + + scf_exp_max = scf_exp[0]; move16(); + + FOR (i = 1; i < fdns_npts; i++) + { + scf_exp_max = s_max(scf_exp_max, scf_exp[i]); + } + + FOR (i = 0; i < fdns_npts; i++) + { + scf_exp[i] = sub(scf_exp[i], scf_exp_max); move16(); + } + + *x_e = add(*x_e, scf_exp_max); move16(); +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + diff --git a/lib_lc3plus/near_nyquist_detector_fx.c b/lib_lc3plus/near_nyquist_detector_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..5e83af0b138eb2925b2615c0f8d17103be8928c3 --- /dev/null +++ b/lib_lc3plus/near_nyquist_detector_fx.c @@ -0,0 +1,138 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +void processNearNyquistdetector_fx(Word16 *near_nyquist_flag, const Word16 fs_idx, const Word16 near_nyquist_index, + const Word16 bands_number, const Word32 *ener_fx, const Word16 ener_fx_exp +#ifdef ENABLE_HR_MODE + ,LC3PLUS_FrameDuration frame_dms, Word16 hrmode +#endif + ) +{ + *near_nyquist_flag = 0; +#ifdef ENABLE_HR_MODE + IF (hrmode == 0){ +#endif + IF (sub(fs_idx, 4) < 0) + { + Dyn_Mem_Deluxe_In( + Word16 i; + Word16 nrg_above_thresh; + Word16 ener_low_exp; + Word16 ener_high_exp; + Word16 comp_energy_exp; + Word32 comp_energy; + Word32 ener_low; + Word32 ener_high; + ); + + ener_low = 0; move32(); + ener_low_exp = 0; move16(); + FOR (i = 0; i < near_nyquist_index; i++) + { + ener_low = BASOP_Util_Add_Mant32Exp(ener_fx[i], ener_fx_exp, ener_low, ener_low_exp, &ener_low_exp); + } + + ener_high = 0; move32(); + ener_high_exp = 0; move16(); + FOR (i = near_nyquist_index; i < bands_number; i++) + { + ener_high = BASOP_Util_Add_Mant32Exp(ener_fx[i], ener_fx_exp, ener_high, ener_high_exp, &ener_high_exp); + } + + comp_energy = Mpy_32_16_lc3plus(ener_low, NN_thresh); /* Mpy_32_16 -> 32Q15 */ + comp_energy_exp = add(add(ener_low_exp, NN_thresh_exp),15); + + nrg_above_thresh = BASOP_Util_Cmp_Mant32Exp(ener_high, ener_high_exp, comp_energy, comp_energy_exp); /* 1 if firstNumber > secondNumber */ + + if (sub(nrg_above_thresh, 1) == 0) + { + *near_nyquist_flag = 1; + } + + Dyn_Mem_Deluxe_Out(); + } +#ifdef ENABLE_HR_MODE + } + ELSE /* hrmode == 1 */ + { + /* inverse spectral flatness = mean(energy) ./ 2^(mean(log2(energy))); */ + Word32 td_thresh = 0; + + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + assert(0); + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + td_thresh = TD_HR_thresh_2_5ms; + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + td_thresh = TD_HR_thresh_5ms; + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + td_thresh = TD_HR_thresh_7_5ms; + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + td_thresh = TD_HR_thresh_10ms; + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + Word16 mean_ener_exp = 0; + + Word32 sum_ener = 0; move32(); + Word16 sum_ener_exp = 0; move16(); + FOR (Word16 i = 0; i < bands_number; i++) + { + sum_ener = BASOP_Util_Add_Mant32Exp(ener_fx[i], ener_fx_exp, sum_ener, sum_ener_exp, &sum_ener_exp); + } + + Word16 denom = sub(14,norm_s(bands_number)); + IF (sub(frame_dms, LC3PLUS_FRAME_DURATION_5MS) == 0){ + denom = sub(15,norm_s(bands_number)); move16(); + } + + Word32 mean_ener = L_shr(sum_ener, denom); move32(); + mean_ener_exp = sum_ener_exp; move16(); + + Word32 sum_ener_log2 = 0;move32(); + Word16 sum_ener_log2_exp = 0;move16(); + Word32 mean_ener_log2 = 0;move32(); + + FOR (Word16 i = 0; i < bands_number; i++) + { + IF (ener_fx[i] != 0) { + Word32 log2Value = L_add(BASOP_Util_Log2(ener_fx[i]), L_shl_pos(L_deposit_l(ener_fx_exp), 25)); + /* input argument is in Q7.25 , returns pow(2,(x/64) + floatingpoint value log2_fl = log2Value/pow(2,31-6) */ + sum_ener_log2 = BASOP_Util_Add_Mant32Exp(log2Value, 6, sum_ener_log2, sum_ener_log2_exp, &sum_ener_log2_exp); move32(); + } + } + mean_ener_log2 = L_shr(sum_ener_log2, denom); move32(); //mean_ener_log2 = sum_ener_log2 / bands_number + Word16 mean_ener_log2_exp = sum_ener_log2_exp; + Word32 mean_ener_log2_fl = L_shr_pos(mean_ener_log2 ,s_min(31, sub(31,mean_ener_log2_exp))); //mean_ener_log2_fl = mean_ener_log2 / 2^(31-mean_ener_log2_exp) + Word32 inv_flatness = 0; + if (L_sub(norm_l(mean_ener),sub(sub(mean_ener_exp,31),mean_ener_log2_fl)) < 0 ) { + inv_flatness = maxWord32; + } + else { + inv_flatness = L_shl(mean_ener, s_max(-31,sub(sub(mean_ener_exp,31),mean_ener_log2_fl))); + } + IF (L_sub(inv_flatness, td_thresh) > 0) { + *near_nyquist_flag = 1; move16(); + } + } + #endif /* ENABLE_HR_MODE */ +} diff --git a/lib_lc3plus/noise_factor_fx.c b/lib_lc3plus/noise_factor_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..c73eef56e9e18a06d16387b94a5caa1c9d7505a9 --- /dev/null +++ b/lib_lc3plus/noise_factor_fx.c @@ -0,0 +1,260 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + + +void processNoiseFactor_fx(Word16 *fac_ns_idx, Word16 x_e, Word32 x[], +#ifdef ENABLE_HR_MODE + Word32 xq[], +#else + Word16 xq[], +#endif + Word16 gg, Word16 gg_e, Word16 BW_cutoff_idx, LC3PLUS_FrameDuration frame_dms, Word16 target_bytes, + Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + ,Word16 hrmode +#endif +) +{ + Dyn_Mem_Deluxe_In(Counter k; Word16 nzeros, s1, s2, s3, c, idx, fac_unq, *ind; + Word16 noisefillwidth, noisefillstart, N; Word32 Lsum;); + + + + ind = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * MAX_LEN bytes */ + + noisefillwidth = 0; + noisefillstart = 0; + c = 0; + move16(); + +#ifdef ENABLE_HR_MODE + if (hrmode) + { + N = BW_cutoff_bin_all_HR[BW_cutoff_idx]; + move16(); + } + else +#endif + { + N = BW_cutoff_bin_all[BW_cutoff_idx]; + move16(); + } + + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + N = shr_pos(N, 3); + noisefillwidth = NOISEFILLWIDTH_1_25MS; + noisefillstart = NOISEFILLSTART_1_25MS; + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + N = shr_pos(N, 2); + noisefillwidth = NOISEFILLWIDTH_2_5MS; + noisefillstart = NOISEFILLSTART_2_5MS; + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + N = shr_pos(N, 1); + noisefillwidth = NOISEFILLWIDTH_5MS; + noisefillstart = NOISEFILLSTART_5MS; + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + N = add(shr_pos(N, 2), add(shr_pos(N, 2), shr_pos(N, 2))); + noisefillwidth = NOISEFILLWIDTH_7_5MS; + noisefillstart = NOISEFILLSTART_7_5MS; + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + noisefillwidth = NOISEFILLWIDTH; + noisefillstart = NOISEFILLSTART; + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + nzeros = -2 * noisefillwidth - 1; + move16(); + + FOR (k = noisefillstart - noisefillwidth; k < noisefillstart + noisefillwidth; k++) + { + if (xq[k] != 0) + { + nzeros = -2 * noisefillwidth - 1; + move16(); + } + if (xq[k] == 0) + { + nzeros = add(nzeros, 1); + } + } + + FOR (k = noisefillstart; k < N - noisefillwidth; k++) + { + if (xq[k + noisefillwidth] != 0) + { + nzeros = -2 * noisefillwidth - 1; + move16(); + } + if (xq[k + noisefillwidth] == 0) + { + nzeros = add(nzeros, 1); + } + if (nzeros >= 0) + { + ind[c++] = k; + move16(); + } + } + + FOR (k = N - noisefillwidth; k < N; k++) + { + nzeros = add(nzeros, 1); + if (nzeros >= 0) + { + ind[c++] = k; + move16(); + } + } + + IF (c == 0) + { + fac_unq = 0; + move16(); + } + ELSE + { + + IF (target_bytes <= 20 && frame_dms == LC3PLUS_FRAME_DURATION_10MS) + { + Word32 ind_sum; + Word16 mean_ind; + + Word16 fac_unq1, fac_unq2; + + /* calculate mean index */ + ind_sum = ind[0]; + move32(); + FOR (k = 1; k < c; k++) + { + ind_sum = L_add(ind_sum, ind[k]); + } + + mean_ind = BASOP_Util_Divide3216_Scale(ind_sum, c, &s2); + mean_ind = shl(mean_ind, s2 + 1); + + assert(0 <= mean_ind && mean_ind <= ind[c - 1]); + + /* calculate noise filling gain for low frequencies */ + s2 = 0; move16(); + if (sub(mean_ind, ind[0]) > 0) + { + /* calculate scale to ensure that Lsum does not overflow */ + s2 = s_max(sub(sub(14, norm_s(c)), getScaleFactor32(&x[ind[0]], sub(mean_ind, ind[0]))), 0); + } + Lsum = L_shr_pos_pos(L_abs(x[ind[0]]), s2); + + FOR (k = 1; k < c && ind[k] <= mean_ind; k++) + { + /* scale before adding to Lsum */ + Lsum = L_add(Lsum, L_shr_pos_pos(L_abs(x[ind[k]]), s2)); + } + fac_unq1 = BASOP_Util_Divide3216_Scale(Lsum, k, &s1); + /* add scale applied during summing */ + s1 = add(s1, s2); + fac_unq1 = BASOP_Util_Divide1616_Scale(fac_unq1, gg, &s2); + s3 = sub(15, add(x_e, add(s1, sub(s2, gg_e)))); + s2 = norm_s(fac_unq1); + test(); + IF (fac_unq1 != 0 && add(s3, s2) < 0) + { + fac_unq1 = MAX_16; + move16(); + } + ELSE + { + s3 = s_min(s_max(s3, -15), 15); + fac_unq1 = shr_r(fac_unq1, s3); + } + + /* calculate noise filling gain for high frequencies */ + Lsum = 0; + move16(); + idx = sub(c, k); + FOR (; k < c; k++) + { + Lsum = L_add(Lsum, L_abs(x[ind[k]])); + } + fac_unq2 = BASOP_Util_Divide3216_Scale(Lsum, idx, &s1); + fac_unq2 = BASOP_Util_Divide1616_Scale(fac_unq2, gg, &s2); + s3 = sub(15, add(x_e, add(s1, sub(s2, gg_e)))); + s2 = norm_s(fac_unq1); + test(); + IF (fac_unq2 != 0 && add(s3, s2) < 0) + { + fac_unq2 = MAX_16; + move16(); + } + ELSE + { + s3 = s_min(s_max(s3, -15), 15); + fac_unq2 = shr_r(fac_unq2, s3); + } + + /* calculate noise filling gain as minimum over high and low frequencies */ + fac_unq = s_min(fac_unq1, fac_unq2); + } + ELSE + { + /* calculate scale to ensure that Lsum does not overflow */ + s2 = s_max(sub(sub(14, norm_s(c)), getScaleFactor32(&x[ind[0]], sub(N,ind[0]))), 0); + Lsum = L_abs(x[ind[0]]); + FOR (k = 1; k < c; k++) + { + /* scale before adding to Lsum */ + Lsum = L_add(Lsum, L_shr_pos_pos(L_abs(x[ind[k]]), s2)); + } + fac_unq = BASOP_Util_Divide3216_Scale(Lsum, c, &s1); + /* add scale applied during summing */ + s1 = add(s1, s2); + fac_unq = BASOP_Util_Divide1616_Scale(fac_unq, gg, &s2); + s3 = sub(15, add(x_e, add(s1, sub(s2, gg_e)))); + s2 = norm_s(fac_unq); + test(); + IF (fac_unq != 0 && add(s3, s2) < 0) + { + fac_unq = MAX_16; + move16(); + } + ELSE + { + fac_unq = shr_r(fac_unq, s_max(s_min(s3, 15), -15)); + } + } + } + + idx = round_fx(L_sub(0x80000, L_mult(fac_unq, 16))); + if (sub(idx, 7) > 0) + { + idx = 7; + move16(); + } + if (idx < 0) + { + idx = 0; + move16(); + } + *fac_ns_idx = idx; + move16(); + + Dyn_Mem_Deluxe_Out(); +} + diff --git a/lib_lc3plus/noise_filling_fx.c b/lib_lc3plus/noise_filling_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..0be080f6fe133d90f053a5e946d49e2454c8198a --- /dev/null +++ b/lib_lc3plus/noise_filling_fx.c @@ -0,0 +1,159 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +/*************************************************************************/ + + + +void processNoiseFilling_fx(Word32 xq[], Word16 nfseed, Word16 xq_e, Word16 fac_ns_idx, Word16 BW_cutoff_idx, + LC3PLUS_FrameDuration frame_dms, Word16 fac_ns_pc, Word16 spec_inv_idx, Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +) +{ + Dyn_Mem_Deluxe_In( + Counter k; + Word16 nzeros, fac_ns, *ind, c; + Word16 noisefillwidth, noisefillstart, N; + Word32 L_tmp, L_tmp_neg, L_tmp_pc, L_tmp_neg_pc; + ); + + noisefillwidth = 0; move16(); + noisefillstart = 0; move16(); + ind = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * MAX_LEN bytes */ + + c = 0; move16(); + +#ifdef ENABLE_HR_MODE + if (hrmode == 1) + { + N = BW_cutoff_bin_all_HR[BW_cutoff_idx]; + move16(); + } + else +#endif + { + N = BW_cutoff_bin_all[BW_cutoff_idx]; + move16(); + } + + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + N = shr_pos(N, 3); + noisefillwidth = NOISEFILLWIDTH_1_25MS; + noisefillstart = NOISEFILLSTART_1_25MS; + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + N = shr_pos(N, 2); + noisefillwidth = NOISEFILLWIDTH_2_5MS; + noisefillstart = NOISEFILLSTART_2_5MS; + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + N = shr_pos(N, 1); + noisefillwidth = NOISEFILLWIDTH_5MS; + noisefillstart = NOISEFILLSTART_5MS; + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + N = add(shr_pos(N, 2), add(shr_pos(N, 2), shr_pos(N, 2))); + noisefillwidth = NOISEFILLWIDTH_7_5MS; + noisefillstart = NOISEFILLSTART_7_5MS; + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + noisefillwidth = NOISEFILLWIDTH; + noisefillstart = NOISEFILLSTART; + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + nzeros = -2 * noisefillwidth - 1; move16(); + + FOR (k = noisefillstart - noisefillwidth; k < noisefillstart + noisefillwidth; k++) + { + if (xq[k] != 0) + { + nzeros = -2 * noisefillwidth - 1; move16(); + } + if (xq[k] == 0) + { + nzeros = add(nzeros, 1); + } + } + + FOR (k = noisefillstart; k < N - noisefillwidth; k++) + { + if (xq[k + noisefillwidth] != 0) + { + nzeros = -2 * noisefillwidth - 1; move16(); + } + if (xq[k + noisefillwidth] == 0) + { + nzeros = add(nzeros, 1); + } + if (nzeros >= 0) + { + ind[c++] = k; move16(); + } + } + + FOR (k = N - noisefillwidth; k < N; k++) + { + nzeros = add(nzeros, 1); + if (nzeros >= 0) + { + ind[c++] = k; move16(); + } + } + + IF (c > 0) + { + fac_ns = shl_pos(sub(8, fac_ns_idx), 11); + L_tmp = L_shr_sat(L_deposit_l(fac_ns), sub(xq_e, 16)); + L_tmp_neg = L_negate(L_tmp); + L_tmp_pc = L_shr_sat(L_deposit_l(fac_ns_pc), sub(xq_e, 16)); + L_tmp_neg_pc = L_negate(L_tmp_pc); + + FOR (k = 0; k < c; k++) + { + nfseed = extract_l(L_mac0(13849, nfseed, 31821)); + IF (nfseed >= 0) + { + IF (ind[k] < spec_inv_idx) + { + xq[ind[k]] = L_tmp; move32(); + } + ELSE + { + xq[ind[k]] = L_tmp_pc; move32(); + } + } + IF (nfseed < 0) + { + IF (ind[k] < spec_inv_idx) + { + xq[ind[k]] = L_tmp_neg; move32(); + } + ELSE + { + xq[ind[k]] = L_tmp_neg_pc; move32(); + } + } + } + } + + Dyn_Mem_Deluxe_Out(); +} + diff --git a/lib_lc3plus/olpa_fx.c b/lib_lc3plus/olpa_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..8131826090afbef3151ac3fbcd3e2b2d622983d3 --- /dev/null +++ b/lib_lc3plus/olpa_fx.c @@ -0,0 +1,297 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +/*************************************************************************/ + + +void process_olpa_fx(Word16 *mem_s6k4_exp, Word16 mem_s12k8[], Word16 mem_s6k4[], Word16 *pitch, Word16 *s12k8, + Word16 len, Word16 *normcorr, Word16 *mem_pitch, + Word16 *pitch_flag, + Word16 s12k8_exp, LC3PLUS_FrameDuration frame_dms, Word8 *scratchBuffer) +{ + Word32 sum, sum0, sum1, sum2, prod, inv; + Word16 shift, s6k4_exp, prod_exp, min_pitch, max_pitch; + Word16 scale0, scale1, scale2, pitch2, normcorr2, len2, acflen, mem_in_len; + Word32 max32; + Word32 *ac; + Word16 *s6k4; + Counter n; + + Counter m; + Word32 L_tmp, L_tmp2; + + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("process_olpa_fx", sizeof(struct { + Word32 sum, sum0, sum1, sum2, prod, inv; + Word16 shift, s6k4_exp, prod_exp, min_pitch, max_pitch; + Word16 scale0, scale1, scale2, pitch2, normcorr2, len2, acflen, mem_in_len; + Word32 max32; + Word32 *ac; + Word16 *s6k4; + Counter n; + Word32 sums[3]; + Counter m; + Word32 L_tmp, L_tmp2; + })); +#endif + + /* Buffer alignment */ + ac = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 4 * RANGE_PITCH_6K4 = 392 bytes */ + + /* Downsample input signal by a factor of 2 (12.8kHz -> 6.4kHz) */ + mem_in_len = MAX_PITCH_6K4; move16(); + len2 = shr(len, 1); + acflen = len2; move16(); + + SWITCH(frame_dms) + { + case LC3PLUS_FRAME_DURATION_10MS: break; + case LC3PLUS_FRAME_DURATION_7p5MS: break; + case LC3PLUS_FRAME_DURATION_5MS: + mem_in_len = add(mem_in_len, 32); + acflen = add(acflen, 32); + break; + + case LC3PLUS_FRAME_DURATION_2p5MS: + mem_in_len = add(mem_in_len, 48); + acflen = add(acflen, 48); + break; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + mem_in_len = add(mem_in_len, 56); + acflen = add(acflen, 56); + break; +#endif + } + + s6k4 = mem_s6k4 + mem_in_len; + sum = L_mac(L_mac(L_mult(mem_s12k8[0], 4053), mem_s12k8[1], 7712), mem_s12k8[2], 9239); + *s6k4++ = round_fx(L_mac_sat(L_mac(sum, s12k8[0], 7712), s12k8[1], 4053)); move16(); + sum = L_mac(L_mac(L_mult(mem_s12k8[2], 4053), s12k8[0], 7712), s12k8[1], 9239); + *s6k4++ = round_fx(L_mac_sat(L_mac(sum, s12k8[2], 7712), s12k8[3], 4053)); move16(); + + FOR (n = 5; n < len; n += 2) + { + sum = L_mac(L_mac(L_mult(s12k8[n - 4], 4053), s12k8[n - 3], 7712), s12k8[n - 2], 9239); + *s6k4++ = round_fx_sat(L_mac_sat(L_mac(sum, s12k8[n - 1], 7712), s12k8[n], 4053)); move16(); + } + + mem_s12k8[0] = s12k8[len - 3]; move16(); + mem_s12k8[1] = s12k8[len - 2]; move16(); + mem_s12k8[2] = s12k8[len - 1]; move16(); + + /* Scale downsampled signal */ + s6k4 = mem_s6k4 + mem_in_len; + scale0 = sub(getScaleFactor16_0(mem_s6k4, mem_in_len), 3); + *mem_s6k4_exp = sub(*mem_s6k4_exp, scale0); move16(); + scale1 = sub(getScaleFactor16_0(s6k4, len2), 3); + s6k4_exp = sub(s12k8_exp, scale1); + scale2 = sub(*mem_s6k4_exp, s6k4_exp); + IF (scale2 > 0) + { + Scale_sig(s6k4, len2, sub(scale1, scale2)); + shift = scale0; move16(); + s6k4_exp = *mem_s6k4_exp; move16(); + } + ELSE + { + Scale_sig(s6k4, len2, scale1); + shift = add(scale0, scale2); + *mem_s6k4_exp = s6k4_exp; move16(); + } + + SWITCH(frame_dms) + { + case LC3PLUS_FRAME_DURATION_10MS: break; + case LC3PLUS_FRAME_DURATION_7p5MS: break; + case LC3PLUS_FRAME_DURATION_5MS: + s6k4 = s6k4 - 32; + break; + + case LC3PLUS_FRAME_DURATION_2p5MS: + s6k4 = s6k4 - 48; + break; +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + s6k4 = s6k4 - 56; + break; +#endif + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + Scale_sig(mem_s6k4, mem_in_len, shift); + + /* Compute autocorrelation */ + FOR (n = MIN_PITCH_6K4; n <= MAX_PITCH_6K4; n++) + { + sum = L_mult0(s6k4[0], s6k4[0 - n]); + FOR (m = 1; m < acflen; m++) + { + sum = L_mac0(sum, s6k4[m], s6k4[m - n]); + } + ac[n - MIN_PITCH_6K4] = sum; move32(); + } + + /* Weight autocorrelation and find maximum */ + max32 = Mpy_32_16_lc3plus(ac[0], olpa_ac_weighting[0]); move32(); + *pitch = MIN_PITCH_6K4; move16(); + FOR (n = MIN_PITCH_6K4 + 1; n <= MAX_PITCH_6K4; n++) + { + L_tmp = Mpy_32_16_lc3plus(ac[n - MIN_PITCH_6K4], olpa_ac_weighting[n - MIN_PITCH_6K4]); + L_tmp2 = L_sub_sat(L_tmp, max32); + if (L_tmp2 > 0) + { + *pitch = n; move16(); + } + max32 = L_max(L_tmp, max32); + } + + /* Compute normalized correlation */ + sum0 = L_mult0(s6k4[0], s6k4[0 - *pitch]); + sum1 = L_mac0(1, s6k4[0 - *pitch], s6k4[0 - *pitch]); + sum2 = L_mac0(1, s6k4[0], s6k4[0]); + for (m = 1; m < acflen; m++) + { + sum0 = L_mac0(sum0, s6k4[m], s6k4[m - *pitch]); + sum1 = L_mac0(sum1, s6k4[m - *pitch], s6k4[m - *pitch]); + sum2 = L_mac0(sum2, s6k4[m], s6k4[m]); + } + scale1 = norm_l(sum1); + scale2 = norm_l(sum2); + sum1 = L_shl_pos(sum1, scale1); + sum2 = L_shl_pos(sum2, scale2); + prod = Mpy_32_32_lc3plus(sum1, sum2); + shift = norm_l(prod); + prod = L_shl_pos(prod, shift); + prod_exp = sub(62, add(add(scale1, scale2), shift)); + inv = Isqrt_lc3plus(prod, &prod_exp); + scale0 = norm_l(sum0); + sum0 = L_shl_pos(sum0, scale0); + prod = Mpy_32_32_lc3plus(sum0, inv); + prod_exp = add(sub(31, scale0), prod_exp); + test(); + IF (prod == 0 || sub(norm_l(prod), prod_exp) >= 0) + { + *normcorr = s_max(0, round_fx_sat(L_shl_sat(prod, prod_exp))); move16(); + } + ELSE + { + *normcorr = 32767; move16(); + } + + /* Second try in the neighborhood of the previous pitch */ + min_pitch = s_max(MIN_PITCH_6K4, sub(*mem_pitch, 4)); + max_pitch = s_min(MAX_PITCH_6K4, add(*mem_pitch, 4)); + + max32 = ac[min_pitch - MIN_PITCH_6K4]; move32(); + pitch2 = min_pitch; move16(); + FOR (n = min_pitch + 1; n <= max_pitch; n++) + { + L_tmp = L_sub_sat(ac[n - MIN_PITCH_6K4], max32); + if (L_tmp > 0) + { + pitch2 = n; move16(); + } + max32 = L_max(ac[n - MIN_PITCH_6K4], max32); + } + IF (sub(*pitch, pitch2) != 0) + { + sum0 = L_mult0(s6k4[0], s6k4[0 - pitch2]); + sum1 = L_mac0(1, s6k4[0 - pitch2], s6k4[0 - pitch2]); + sum2 = L_mac0(1, s6k4[0], s6k4[0]); + for (m = 1; m < acflen; m++) + { + sum0 = L_mac0(sum0, s6k4[m], s6k4[m - pitch2]); + sum1 = L_mac0(sum1, s6k4[m - pitch2], s6k4[m - pitch2]); + sum2 = L_mac0(sum2, s6k4[m], s6k4[m]); + } + scale1 = norm_l(sum1); + scale2 = norm_l(sum2); + sum1 = L_shl_pos(sum1, scale1); + sum2 = L_shl_pos(sum2, scale2); + prod = Mpy_32_32_lc3plus(sum1, sum2); + shift = norm_l(prod); + prod = L_shl_pos(prod, shift); + prod_exp = sub(62, add(add(scale1, scale2), shift)); + inv = Isqrt_lc3plus(prod, &prod_exp); + scale0 = norm_l(sum0); + sum0 = L_shl_pos(sum0, scale0); + prod = Mpy_32_32_lc3plus(sum0, inv); + prod_exp = add(sub(31, scale0), prod_exp); + test(); + IF (prod == 0 || sub(norm_l(prod), prod_exp) >= 0) + { + normcorr2 = s_max(0, round_fx_sat(L_shl_sat(prod, prod_exp))); move16(); + } + ELSE + { + normcorr2 = 32767; move16(); + } + IF (sub(normcorr2, mult_r(*normcorr, 27853)) > 0) + { + *pitch = pitch2; move16(); + *normcorr = normcorr2; move16(); + } + } + + SWITCH(frame_dms) + { + case LC3PLUS_FRAME_DURATION_5MS: + if(*pitch_flag == 1) { + *mem_pitch = *pitch; move16(); + *pitch_flag = 0; + } + else { + *pitch_flag += 1; + } + break; + + case LC3PLUS_FRAME_DURATION_2p5MS: + if (*pitch_flag == 3) { + *mem_pitch = *pitch; move16(); + *pitch_flag = 0; + } + else { + *pitch_flag += 1; + } + break; +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + if (*pitch_flag == 7) { + *mem_pitch = *pitch; move16(); + *pitch_flag = 0; + } + else { + *pitch_flag += 1; + } + break; +#endif + + default: + + *mem_pitch = *pitch; move16(); + } + + /* Update memory */ + basop_memmove(mem_s6k4, &mem_s6k4[len2], mem_in_len * sizeof(Word16)); + + /* Upsample pitch by a factor of 2 (6.4kHz -> 12.8kHz) */ + *pitch = shl_pos(*pitch, 1); move16(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + diff --git a/lib_lc3plus/pc_apply_fx.c b/lib_lc3plus/pc_apply_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..c34c83e14b72cfed33ae56c4ba3a3fa52ca915c9 --- /dev/null +++ b/lib_lc3plus/pc_apply_fx.c @@ -0,0 +1,317 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "constants.h" +#include "functions.h" + +#ifdef ENABLE_HR_MODE +static Word16 getScaleFactor32_withNegativeScaling(Word32 *data32, Word16 dataLen); +#else +static Word16 getScaleFactor16_withNegativeScaling(Word16 *data16, Word16 dataLen); +#endif + + +void processPCapply_fx(Word16 yLen, Word16 q_old_res_fx[], Word16 *q_old_res_fx_exp, +#ifdef ENABLE_HR_MODE + Word32 q_res_fx[], +#else + Word16 q_res_fx[], +#endif + Word16 q_old_d_fx[], Word16 spec_inv_idx, Word16 *fac, Word16 *fac_e, Word32 q_d_fx[], + Word16 *q_fx_exp, Word16 gg_idx, Word16 gg_idx_off, Word16 prev_gg, Word16 prev_gg_e, + Word16 *pc_nbLostFramesInRow) +{ + Counter i; + Word16 s, s2, s3, c, tmp16, tmp16_2, inv_gain, thr; + Word32 ener_curr, ener_prev, mean_nrg_high, mean_nrg_low; + Word16 global_gain, global_gain_e, gg2, gg2_e, prev_gg2, prev_gg2_e; + Word32 tmp32, ener_curr_gg2, ener_prev_gg2; + Word16 fac_local, fac_local_e; + +#ifdef DYNMEM_COUNT + struct _dynmem + { + Counter i; + Word16 s, s2, s3, c, tmp16, tmp16_2, inv_gain, thr; + Word32 ener_curr, ener_prev, mean_nrg_high, mean_nrg_low; + Word16 global_gain, global_gain_e, gg2, gg2_e, prev_gg2, prev_gg2_e; + Word32 tmp32, ener_curr_gg2, ener_prev_gg2; + Word16 fac_local, fac_local_e; + }; + Dyn_Mem_In("processPCapply_fx", sizeof(struct _dynmem)); +#endif + + assert(spec_inv_idx >= 0); + + *pc_nbLostFramesInRow = add(*pc_nbLostFramesInRow, 1); + + tmp32 = L_shl_pos(L_mult0(add(gg_idx, gg_idx_off), 0x797D), 7); + global_gain_e = add(extract_l(L_shr_pos(tmp32, 25)), 1); + global_gain = round_fx(BASOP_Util_InvLog2(L_or(tmp32, 0xFE000000))); + + /** Calculate rescaling factor **/ + + /* mean_nrg_low = mean(q_d_prev(1:spec_inv_idx-1).^2); + mean_nrg_high = mean(q_d_prev(spec_inv_idx:end).^2); */ + s = getScaleFactor16(q_old_d_fx, yLen); + + mean_nrg_low = 0; + move32(); + FOR (i = 0; i < spec_inv_idx; i++) + { + tmp16 = shl_sat(q_old_d_fx[i], sub(s, 4)); + mean_nrg_low = L_mac0(mean_nrg_low, tmp16, tmp16); /* exp = 2s - 8 */ + } + + mean_nrg_high = 0; + move32(); + FOR (i = spec_inv_idx; i < yLen; i++) + { + tmp16 = shl_sat(q_old_d_fx[i], sub(s, 4)); + mean_nrg_high = L_mac0(mean_nrg_high, tmp16, tmp16); /* exp = 2s - 8 */ + } + + IF (sub(spec_inv_idx, sub(yLen, spec_inv_idx)) < 0) + { + c = div_s(spec_inv_idx, sub(yLen, spec_inv_idx)); + mean_nrg_high = Mpy_32_16_lc3plus(mean_nrg_high, c); /* exp = 2s - 8 */ + } + ELSE + { + c = div_s(sub(yLen, spec_inv_idx), spec_inv_idx); + mean_nrg_low = Mpy_32_16_lc3plus(mean_nrg_low, c); /* exp = 2s - 8 */ + } + + /* ener_prev = sum(q_old_res(1:spec_inv_idx-1).^2); + ener_curr = sum( q_res(1:spec_inv_idx-1).^2); */ + s = getScaleFactor16(q_old_res_fx, spec_inv_idx); + ener_prev = 0; move32(); + FOR (i = 0; i < spec_inv_idx; i++) + { + tmp16 = shl_sat(q_old_res_fx[i], sub(s, 4)); + ener_prev = L_mac0(ener_prev, tmp16, tmp16); /* exp = - (2s - 8 - 2**q_old_res_fx_exp) */ + } + + ener_curr = 0; + move32(); + +#ifdef ENABLE_HR_MODE + s2 = getScaleFactor32(q_res_fx, spec_inv_idx); + FOR (i = 0; i < spec_inv_idx; i++) + { + tmp16 = extract_h(L_shl_sat(q_res_fx[i], sub(s2, 4))); + ener_curr = L_mac0(ener_curr, tmp16, tmp16); /* exp = - (2s2 - 8) */ + } + s2 = s2 - 16; +#else + s2 = getScaleFactor16(q_res_fx, spec_inv_idx); + FOR (i = 0; i < spec_inv_idx; i++) + { + tmp16 = shl_sat(q_res_fx[i], sub(s2, 4)); + ener_curr = L_mac0(ener_curr, tmp16, tmp16); /* exp = - (2s2 - 8) */ + } +#endif + + + s = shl(sub(s, *q_old_res_fx_exp), 1); + s2 = shl(s2, 1); + s3 = s_max(s, s2); + ener_prev = L_shr_sat(ener_prev, sub(s3, s2)); + ener_curr = L_shr_sat(ener_curr, sub(s3, s)); + + /* fac = 1; */ + *fac = 1; + /* if ener_prev > 0 */ + IF ( ener_prev > 0 ) + { + /* fac = sqrt(ener_curr/ener_prev); */ + s = getScaleFactor32(&ener_prev, 1); + s2 = getScaleFactor32(&ener_curr, 1); + s3 = s_min(s, s2); + tmp16 = extract_h(L_shl_sat(ener_curr, s3)); + tmp16_2 = extract_h(L_shl_sat(ener_prev, s3)); + + *fac_e = 0; move16(); + if ( tmp16_2 == 0) { + tmp16_2 = 32767; move16(); + *fac_e = 15; move16(); + } else { + tmp16_2 = Inv16(tmp16_2, fac_e); + } + + *fac = mult(tmp16, tmp16_2); + + IF (sub(*fac, 32767) < 0) + { + *fac = Sqrt16(*fac, fac_e); move16(); + } + } + + /* fac_local = fac; */ + fac_local = *fac; + fac_local_e = *fac_e; + + /* if (mean_nrg_low > mean_nrg_high) && (ener_prev * prev_gg^2 > ener_curr * gg^2) */ + prev_gg2 = mult(prev_gg, prev_gg); + prev_gg2_e = shl(prev_gg_e, 1); + ener_prev_gg2 = Mpy_32_16_lc3plus(ener_prev, prev_gg2); /* exp = prev_gg2_e */ + + gg2 = mult(global_gain, global_gain); + gg2_e = shl(global_gain_e, 1); + ener_curr_gg2 = Mpy_32_16_lc3plus(ener_curr, gg2); /* exp = gg2_e */ + + s3 = s_max(prev_gg2_e, gg2_e); + ener_prev_gg2 = L_shr_sat(ener_prev_gg2, sub(s3, prev_gg2_e)); + ener_curr_gg2 = L_shr_sat(ener_curr_gg2, sub(s3, gg2_e)); + + + test(); + IF ( (L_sub(mean_nrg_low, mean_nrg_high) <= 0) || (L_sub(ener_prev_gg2, ener_curr_gg2) <= 0) ) + { + /* fac = prev_gg/gg; */ + s = global_gain_e; move16(); + inv_gain = Inv16(global_gain, &s); + fac_local = mult(prev_gg, inv_gain); + fac_local_e = add(s, prev_gg_e); + } + + /* write synthesized samples */ + *q_old_res_fx_exp = add(*q_old_res_fx_exp, fac_local_e); + thr = shl_sat(20480, sub(-15, *q_old_res_fx_exp)); + FOR (i = spec_inv_idx; i < yLen; i++) + { + q_res_fx[i] = extract_h(L_mult(q_old_res_fx[i] /* exp = q_old_res_fx_exp' */, fac_local /* exp = fac_e */)); /* exp = q_old_res_fx_exp */ + + IF (sub(abs_s(q_res_fx[i]), thr) < 0) + { + q_res_fx[i] = 0; + move16(); + } + } + +#ifdef ENABLE_HR_MODE + s = getScaleFactor32_withNegativeScaling(&q_res_fx[0], spec_inv_idx) - 16; /* exp = 0 */ + s2 = getScaleFactor32_withNegativeScaling(&q_res_fx[spec_inv_idx], + sub(yLen, spec_inv_idx)) - 16; /* exp = q_old_res_fx_exp */ +#else + s = getScaleFactor16_withNegativeScaling(&q_res_fx[0], spec_inv_idx); /* exp = 0 */ + s2 = getScaleFactor16_withNegativeScaling(&q_res_fx[spec_inv_idx], + sub(yLen, spec_inv_idx)); /* exp = q_old_res_fx_exp */ +#endif + + s3 = add(s, *q_old_res_fx_exp); + IF (sub(s3, s2) > 0) + { + tmp16 = sub(s3, s2); + s = sub(s, tmp16); + s3 = sub(s3, tmp16); + } + *q_fx_exp = sub(15, s); + move16(); + +#ifdef ENABLE_HR_MODE + s = add(s, 16); + s3 = add(s3, 16); +#endif + + s = s_max(s, -31); + s = s_min(s, 31); + s3 = s_max(s3, -31); + s3 = s_min(s3, 31); + + FOR (i = 0; i < spec_inv_idx; i++) + { +#ifdef ENABLE_HR_MODE + q_d_fx[i] = L_shl(q_res_fx[i], s); +#else + q_d_fx[i] = L_shl(L_deposit_h(q_res_fx[i]), s); +#endif + move32(); + } + FOR (; i < yLen; i++) + { +#ifdef ENABLE_HR_MODE + q_d_fx[i] = L_shl(q_res_fx[i], s3); +#else + q_d_fx[i] = L_shl(L_deposit_h(q_res_fx[i]), s3); +#endif + move32(); + } + + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +#ifndef ENABLE_HR_MODE +static Word16 getScaleFactor16_withNegativeScaling(Word16 *data16, Word16 dataLen) +{ + Counter i; + Dyn_Mem_Deluxe_In(Word16 tmp, shift; Word16 x_min, x_max;); + + x_max = 0; + move16(); + x_min = 0; + move16(); + + FOR (i = 0; i < dataLen; i++) + { + if (data16[i] > 0) + x_max = s_max(x_max, data16[i]); + if (data16[i] < 0) + x_min = s_min(x_min, data16[i]); + } + + tmp = s_max(x_max, negate(x_min)); + shift = norm_s(tmp); + if (tmp == 0) + { + shift = 15; + move16(); + } + + Dyn_Mem_Deluxe_Out(); + + return shift; +} + +#else +static Word16 getScaleFactor32_withNegativeScaling(Word32 *data32, Word16 dataLen) +{ + Counter i; + Dyn_Mem_Deluxe_In(Word32 tmp, shift; Word32 x_min, x_max;); + + x_max = L_add(0, 0); + x_min = L_add(0, 0); + + FOR (i = 0; i < dataLen; i++) + { + if (data32[i] >= 0) + x_max = L_max(x_max, data32[i]); + if (data32[i] < 0) + x_min = L_min(x_min, data32[i]); + } + + tmp = L_max(x_max, L_negate(x_min)); + shift = norm_l(tmp); + if (tmp == 0) + { + shift = 31; + move16(); + } + + Dyn_Mem_Deluxe_Out(); + + return shift; +} +#endif diff --git a/lib_lc3plus/pc_classify_fx.c b/lib_lc3plus/pc_classify_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..a9736b9b98c1210ac01da4de23636e532707d904 --- /dev/null +++ b/lib_lc3plus/pc_classify_fx.c @@ -0,0 +1,281 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "constants.h" +#include "functions.h" + +#define BLOCK_SIZE 3 +#define THR1 8 +#define FAC 9830 /* 0.3 */ + +void peakDetector_fx(Word16 in_sig[], Word16 yLen, Word16 *xover); + +void processPCclassify_fx(Word16 pitch_present, LC3PLUS_FrameDuration frame_dms, Word16 q_old_d_fx[], Word16 q_old_res_fx[], + Word16 yLen, Word16 spec_inv_idx, Word16 stab_fac, Word16 *bfi) +{ + Dyn_Mem_Deluxe_In( + Word16 maxPitchBin, xover; + Counter i; + Word16 s, tmp16, full_nrg16, part_nrg16; + Word32 full_nrg, part_nrg; + ); + + int frame_dms_val = 0; + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + assert(0); frame_dms_val = 125; BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + frame_dms_val = 250; BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + frame_dms_val = 500; BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + frame_dms_val = 750; BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + frame_dms_val = 1000; BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: + assert(0); + } + + /* Apply classifier only if lower than 2kHz signal */ + IF (sub(i_mult(spec_inv_idx, 10), shl_pos(frame_dms_val/10, 2)) < 0 ) + { + IF (sub(stab_fac, 16384 /* 0.5 */) < 0) + { + *bfi = 1; + } + ELSE IF (sub(pitch_present, 1) == 0) + { + maxPitchBin = 8; move16(); + IF (sub(frame_dms, LC3PLUS_FRAME_DURATION_5MS) == 0) + { + maxPitchBin = 4; move16(); + } + + /* avoid phase discontinuity in low frequencies */ + peakDetector_fx(q_old_d_fx, yLen, &xover); + test(); + IF (sub(spec_inv_idx, xover) < 0 || sub(spec_inv_idx, maxPitchBin) < 0) + { + *bfi = 1; + } + } + ELSE + { + s = getScaleFactor16(q_old_res_fx, yLen); + + part_nrg = 0; move32(); + FOR (i = 0; i < spec_inv_idx; i++) + { + tmp16 = shl_sat(q_old_res_fx[i], sub(s, 4)); + part_nrg = L_mac0(part_nrg, tmp16, tmp16); /* exp = 2s - 8 */ + } + + full_nrg = part_nrg; move32(); + FOR (i = spec_inv_idx; i < yLen; i++) + { + tmp16 = shl_sat(q_old_res_fx[i], sub(s, 4)); + full_nrg = L_mac0(full_nrg, tmp16, tmp16); /* exp = 2s - 8 */ + } + + s = getScaleFactor32(&full_nrg, 1); + full_nrg16 = extract_h(L_shl(full_nrg, s)); + part_nrg16 = extract_h(L_shl(part_nrg, s)); + + tmp16 = mult(full_nrg16, 9830 /* 0.3 */); + + IF (part_nrg16 < tmp16) + { + *bfi = 1; + } + } + } + + Dyn_Mem_Deluxe_Out(); +} + +void peakDetector_fx(Word16 in_sig[], Word16 yLen, Word16 *xover) +{ + Dyn_Mem_Deluxe_In( + Counter i, j; + Word16 tmp16, c, s, s2, mean_block_nrg16; + Word32 maxPeak, tmp32; + Word32 mean_block_nrg, block_cent; + Word16 cur_max, prev_max, next_max; + ); + + *xover = 0; + + s = getScaleFactor16(in_sig, yLen); + + mean_block_nrg = 0; move32(); + FOR (i = 0; i < yLen; i++) + { + tmp16 = shl_sat(in_sig[i], sub(s, 4)); + mean_block_nrg = L_mac0(mean_block_nrg, tmp16, tmp16); /* exp = 2s - 8 */ + } + + s2 = getScaleFactor16(&yLen, 1); + c = shl(yLen, s2); + mean_block_nrg16 = div_l(mean_block_nrg, c); /* exp = 2s - 8 - s2 - 1 */ + mean_block_nrg = L_shl(L_mult0(mean_block_nrg16, BLOCK_SIZE * THR1), add(4, s2)); /* exp = 2s - 5 */ + + maxPeak = 0; move32(); + c = sub(yLen, 2 * BLOCK_SIZE); + + test(); + IF (abs_s_sat(in_sig[0]) >= abs_s_sat(in_sig[1])) + { + block_cent = 0; move32(); + FOR (j = 0; j <= 1; j++) + { + tmp16 = shl_sat(in_sig[j], sub(s, 2)); + block_cent = L_mac0(block_cent, tmp16, tmp16); /* -> exp = 2s - 4 */ + } + block_cent = L_shr(block_cent, 1); /* exp = 2s - 5 */ + + IF (L_sub(block_cent, mean_block_nrg) > 0) + { + cur_max = abs_s_sat(in_sig[0]); + cur_max = MAX(abs_s_sat(in_sig[1]), cur_max); + + next_max = abs_s_sat(in_sig[-1 + BLOCK_SIZE]); + next_max = MAX(abs_s_sat(in_sig[-1 + BLOCK_SIZE + 1]), next_max); + next_max = MAX(abs_s_sat(in_sig[-1 + BLOCK_SIZE + 2]), next_max); + + IF (sub(cur_max, next_max) > 0) + { + maxPeak = block_cent; move32(); + *xover = 1; + } + } + } + + FOR (i = 0; i < BLOCK_SIZE; i++) + { + test(); + IF (abs_s_sat(in_sig[i + 1]) >= abs_s_sat(in_sig[i]) && abs_s_sat(in_sig[i + 1]) >= abs_s_sat(in_sig[i + 2])) + { + block_cent = 0; move32(); + FOR (j = 0; j < BLOCK_SIZE; j++) + { + tmp16 = shl_sat(in_sig[i + j], sub(s, 2)); + block_cent = L_mac0(block_cent, tmp16, tmp16); /* -> exp = 2s - 4 */ + } + block_cent = L_shr(block_cent, 1); /* exp = 2s - 5 */ + + IF (L_sub(block_cent, mean_block_nrg) > 0) + { + cur_max = abs_s_sat(in_sig[i]); + cur_max = MAX(abs_s_sat(in_sig[i + 1]), cur_max); + cur_max = MAX(abs_s_sat(in_sig[i + 2]), cur_max); + + prev_max = 0; move16(); + FOR (j = i - BLOCK_SIZE; j <= i - 1; j++) + { + IF (j > 0) + { + prev_max = MAX(abs_s_sat(in_sig[j]), prev_max); + } + } + + next_max = abs_s_sat(in_sig[i + BLOCK_SIZE]); + next_max = MAX(abs_s_sat(in_sig[i + BLOCK_SIZE + 1]), next_max); + next_max = MAX(abs_s_sat(in_sig[i + BLOCK_SIZE + 2]), next_max); + + test(); + IF (sub(cur_max, prev_max) >= 0 && sub(cur_max, next_max) > 0) + { + IF (L_sub(block_cent, maxPeak) >= 0) + { + maxPeak = block_cent; move32(); + *xover = sub(add(i, BLOCK_SIZE), 1); + } + ELSE + { + tmp32 = L_mult(FAC, extract_h(maxPeak)); + + tmp16 = extract_l(L_shr(maxPeak, 1)); + tmp16 = s_and(tmp16, 0x7fff); + tmp16 = mult(FAC, tmp16); + tmp32 = L_add_sat(tmp32, tmp16); + + IF (L_sub(block_cent, tmp32) > 0) + { + *xover = sub(add(i, BLOCK_SIZE), 1); + } + } + } + } + } + } + + FOR (i = BLOCK_SIZE; i <= c; i++) + { + test(); + IF (abs_s_sat(in_sig[i + 1]) >= abs_s_sat(in_sig[i]) && abs_s_sat(in_sig[i + 1]) >= abs_s_sat(in_sig[i + 2])) + { + block_cent = 0; move32(); + FOR (j = 0; j < BLOCK_SIZE; j++) + { + tmp16 = shl_sat(in_sig[i + j], sub(s, 2)); + block_cent = L_mac0(block_cent, tmp16, tmp16); /* -> exp = 2s - 4 */ + } + block_cent = L_shr(block_cent, 1); /* exp = 2s - 5 */ + + IF (L_sub(block_cent, mean_block_nrg) > 0) + { + cur_max = abs_s_sat(in_sig[i]); + cur_max = MAX(abs_s_sat(in_sig[i + 1]), cur_max); + cur_max = MAX(abs_s_sat(in_sig[i + 2]), cur_max); + + prev_max = abs_s_sat(in_sig[i - BLOCK_SIZE]); + prev_max = MAX(abs_s_sat(in_sig[i - BLOCK_SIZE + 1]), prev_max); + prev_max = MAX(abs_s_sat(in_sig[i - BLOCK_SIZE + 2]), prev_max); + + next_max = abs_s_sat(in_sig[i + BLOCK_SIZE]); + next_max = MAX(abs_s_sat(in_sig[i + BLOCK_SIZE + 1]), next_max); + next_max = MAX(abs_s_sat(in_sig[i + BLOCK_SIZE + 2]), next_max); + + test(); + IF (sub(cur_max, prev_max) >= 0 && sub(cur_max, next_max) > 0) + { + IF (L_sub(block_cent, maxPeak) >= 0) + { + maxPeak = block_cent; move32(); + *xover = sub(add(i, BLOCK_SIZE), 1); + } + ELSE + { + tmp32 = L_mult(FAC, extract_h(maxPeak)); + + tmp16 = extract_l(L_shr(maxPeak, 1)); + tmp16 = s_and(tmp16, 0x7fff); + tmp16 = mult(FAC, tmp16); + tmp32 = L_add_sat(tmp32, tmp16); + + IF (L_sub(block_cent, tmp32) > 0) + { + *xover = sub(add(i, BLOCK_SIZE), 1); + } + } + } + } + } + } + + Dyn_Mem_Deluxe_Out(); +} + + diff --git a/lib_lc3plus/pc_main_fx.c b/lib_lc3plus/pc_main_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..3e159b301098d47ccd7f4dfd6a24128ad42f3e62 --- /dev/null +++ b/lib_lc3plus/pc_main_fx.c @@ -0,0 +1,59 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "constants.h" +#include "functions.h" + +void processPCmain_fx(Word16 rframe, Word16 *bfi, Word16 yLen, LC3PLUS_FrameDuration frame_dms, Word16 q_old_res_fx[], + Word16 *q_old_res_fx_exp, +#ifdef ENABLE_HR_MODE + Word32 q_res_fx[], +#else + Word16 q_res_fx[], +#endif + Word16 q_old_d_fx[], Word16 spec_inv_idx, + Word16 pitch_present, Word16 stab_fac, Word32 q_d_fx[], Word16 *q_fx_exp, + Word16 gg_idx, Word16 gg_idx_off, Word16 *prev_gg, Word16 *prev_gg_e, Word16 *BW_cutoff_idx_nf, + Word16 *prev_BW_cutoff_idx_nf, Word16 fac_ns_idx, Word16 *prev_fac_ns_fx, Word16 *pc_nbLostFramesInRow) +{ + Dyn_Mem_Deluxe_In( + Word16 fac, fac_e; + ); + + fac = 32767; fac_e = 0; + + IF (sub(*bfi, 2) == 0) + { + processPCclassify_fx(pitch_present, frame_dms, q_old_d_fx, q_old_res_fx, yLen, spec_inv_idx, stab_fac, bfi); + } + + IF (sub(*bfi, 2) == 0) + { + processPCapply_fx(yLen, q_old_res_fx, q_old_res_fx_exp, q_res_fx, q_old_d_fx, spec_inv_idx, + &fac, &fac_e, q_d_fx, q_fx_exp, gg_idx, gg_idx_off, *prev_gg, *prev_gg_e, pc_nbLostFramesInRow); + } + + IF (sub(*bfi, 1) != 0) + { + processPCupdate_fx(*bfi, yLen, q_old_res_fx, q_old_res_fx_exp, q_res_fx, spec_inv_idx, gg_idx, gg_idx_off, prev_gg, + prev_gg_e, rframe, BW_cutoff_idx_nf, prev_BW_cutoff_idx_nf, fac_ns_idx, prev_fac_ns_fx, fac, fac_e); + } + + if (*bfi == 0) + { + *pc_nbLostFramesInRow = 0; move16(); + } + + Dyn_Mem_Deluxe_Out(); +} + + diff --git a/lib_lc3plus/pc_update_fx.c b/lib_lc3plus/pc_update_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..6823a320f8d1dc41df478b0092ede865645482a5 --- /dev/null +++ b/lib_lc3plus/pc_update_fx.c @@ -0,0 +1,150 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "constants.h" +#include "functions.h" + +#ifdef ENABLE_HR_MODE + +void Copy_Scale_sig_32(const Word32 x[], /* i : signal to scale input Qx */ + Word16 y[], /* o : scaled signal output Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +) +{ + Counter i; + Word16 tmp; + + if (exp0 == 0) + { + for (i = 0; i < lg; i++) + { + y[i] = extract_h(x[i]); + } + + return; + } + + tmp = s_max(exp0, -31); + tmp = s_min(tmp, 31); + + for (i = 0; i < lg; i++) + { + y[i] = extract_h(L_shr_r(x[i], -tmp)); + } +} +#endif + +void processPCupdate_fx(Word16 bfi, Word16 yLen, Word16 q_old_res_fx[], Word16 *q_old_res_fx_exp, +#ifdef ENABLE_HR_MODE + Word32 q_res_fx[], +#else + Word16 q_res_fx[], +#endif + Word16 spec_inv_idx, Word16 gg_idx, Word16 gg_idx_off, + Word16 *prev_gg, Word16 *prev_gg_e, Word16 rframe, Word16 *BW_cutoff_idx_nf, + Word16 *prev_BW_cutoff_idx_nf, Word16 fac_ns_idx, Word16 *prev_fac_ns_fx, Word16 fac, + Word16 fac_e) +{ + Word16 global_gain, global_gain_e, s, s2, s3, tmp16; + Word32 tmp32; + +#ifdef DYNMEM_COUNT + struct _dynmem + { + Word16 global_gain, global_gain_e, s, s2, s3, tmp16; + Word32 tmp32; + }; + Dyn_Mem_In("processPCupdate_fx", sizeof(struct _dynmem)); +#endif + + tmp32 = L_shl_pos(L_mult0(add(gg_idx, gg_idx_off), 0x797D), 7); + global_gain_e = add(extract_l(L_shr_pos(tmp32, 25)), 1); + global_gain = round_fx(BASOP_Util_InvLog2(L_or(tmp32, 0xFE000000))); + + *prev_gg = global_gain; move16(); + *prev_gg_e = global_gain_e; move16(); + +#ifdef ENABLE_HR_MODE + s = getScaleFactor32(q_res_fx, spec_inv_idx); /* exp = 0 */ +#else + s = getScaleFactor16(q_res_fx, spec_inv_idx); /* exp = 0 */ +#endif + + IF (bfi == 0) + { + *q_old_res_fx_exp = negate(s); +#ifdef ENABLE_HR_MODE + Copy_Scale_sig_32(q_res_fx, q_old_res_fx, yLen, s); + *q_old_res_fx_exp = *q_old_res_fx_exp + 16; +#else + Copy_Scale_sig(q_res_fx, q_old_res_fx, yLen, s); +#endif + } + ELSE + { +#ifdef ENABLE_HR_MODE + s2 = getScaleFactor32(&q_res_fx[spec_inv_idx], sub(yLen, spec_inv_idx)); /* exp = q_old_res_fx_exp */ + IF (s2 == 0) + s2 = 16; + s3 = add(s, *q_old_res_fx_exp); + IF (sub(s3, s2) > 0) + { + tmp16 = sub(s3, s2); + s = sub(s, tmp16); + } + s2 = add(s, *q_old_res_fx_exp); + *q_old_res_fx_exp = negate(s) + 16; + + + if (s2 > -32) + { + Copy_Scale_sig_32(&q_res_fx[spec_inv_idx], &q_old_res_fx[spec_inv_idx], sub(yLen, spec_inv_idx), s2); + } +#else + s2 = getScaleFactor16(&q_res_fx[spec_inv_idx], sub(yLen, spec_inv_idx)); /* exp = q_old_res_fx_exp */ + s3 = add(s, *q_old_res_fx_exp); + IF (sub(s3, s2) > 0) + { + tmp16 = sub(s3, s2); + s = sub(s, tmp16); + } + s2 = add(s, *q_old_res_fx_exp); + *q_old_res_fx_exp = negate(s); + + s = s_max(s_min(s, 15), -15); + s2 = s_max(s_min(s2, 15), -15); + Copy_Scale_sig(q_res_fx, q_old_res_fx, spec_inv_idx, s); + Copy_Scale_sig(&q_res_fx[spec_inv_idx], &q_old_res_fx[spec_inv_idx], sub(yLen, spec_inv_idx), s2); +#endif + } + + IF (rframe == 0) + { + *prev_BW_cutoff_idx_nf = *BW_cutoff_idx_nf; + *prev_fac_ns_fx = shl_pos(sub(8, fac_ns_idx), 11); + } + ELSE IF(sub(bfi, 2) == 0 && sub(*BW_cutoff_idx_nf, *prev_BW_cutoff_idx_nf) != 0 + && sub(spec_inv_idx, yLen) < 0) + { + *BW_cutoff_idx_nf = *prev_BW_cutoff_idx_nf; + *prev_fac_ns_fx = shl_sat(mult(*prev_fac_ns_fx, fac), fac_e); + *prev_fac_ns_fx = s_max(*prev_fac_ns_fx, 2048); + *prev_fac_ns_fx = s_min(*prev_fac_ns_fx, 16384); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + + diff --git a/lib_lc3plus/per_band_energy_fx.c b/lib_lc3plus/per_band_energy_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..86c848c01b79830bdd0cff2610e11b9f88dd2141 --- /dev/null +++ b/lib_lc3plus/per_band_energy_fx.c @@ -0,0 +1,295 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" +#include "rom_basop_util_lc3plus.h" + +void processPerBandEnergy_fx(Word32 *d2_fx, Word16 *d2_fx_exp, Word32 *d_fx, Word16 d_fx_exp, + const Word16 *band_offsets, Word16 fs_idx, Word16 n_bands, Word16 linear, LC3PLUS_FrameDuration frame_dms, + Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +) +{ + Dyn_Mem_Deluxe_In(Counter i, k, band; Word16 s; Word16 s1; Word16 s2; Word32 nrg; Word16 smax; Word16 tmp16; + Word16 nbands; Word16 maxBwBin; Word16 stopBand; Word16 bandsOffsetOne; Word16 bandsOffsetTwo; + Word16 * d2_band_fx_exp;); + + + d2_band_fx_exp = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * MAX_BANDS_NUMBER_PLC bytes */ + bandsOffsetOne = 0; move16(); + bandsOffsetTwo = 0; move16(); + +#ifdef ENABLE_HR_MODE + if (hrmode) + { + maxBwBin = MAX_BW_HR; + fs_idx = fs_idx + 1; + move16(); + } + else +#endif + { + maxBwBin = MAX_BW; + move16(); + } + + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: maxBwBin = maxBwBin >> 3; move16(); + { + bandsOffsetOne = bands_offset_with_one_max_1_25ms[fs_idx]; + move16(); + bandsOffsetTwo = bands_offset_with_two_max_1_25ms[fs_idx]; + move16(); + } + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: maxBwBin = maxBwBin >> 2; move16(); + { + bandsOffsetOne = bands_offset_with_one_max_2_5ms[fs_idx]; + move16(); + bandsOffsetTwo = bands_offset_with_two_max_2_5ms[fs_idx]; + move16(); + } + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: maxBwBin = maxBwBin >> 1; move16(); + { + bandsOffsetOne = bands_offset_with_one_max_5ms[fs_idx]; + move16(); + bandsOffsetTwo = bands_offset_with_two_max_5ms[fs_idx]; + move16(); + } + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + maxBwBin = (maxBwBin >> 2) * 3; move16(); + bandsOffsetOne = bands_offset_with_one_max_7_5ms[fs_idx]; + move16(); + bandsOffsetTwo = bands_offset_with_two_max_7_5ms[fs_idx]; + move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + { + bandsOffsetOne = bands_offset_with_one_max[fs_idx]; + move16(); + bandsOffsetTwo = bands_offset_with_two_max[fs_idx]; + move16(); + } + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + IF (sub(linear, 1) == 0) + { + + #ifdef ENABLE_HR_MODE + if (hrmode) + { + fs_idx = fs_idx - 1; + } + #endif + + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + bandsOffsetOne = bands_offset_with_one_max_lin_1_25ms[fs_idx]; + move16(); + bandsOffsetTwo = bands_offset_with_two_max_lin_1_25ms[fs_idx]; + move16(); + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + bandsOffsetOne = bands_offset_with_one_max_lin_2_5ms[fs_idx]; + move16(); + bandsOffsetTwo = bands_offset_with_two_max_lin_2_5ms[fs_idx]; + move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + bandsOffsetOne = bands_offset_with_one_max_lin_5ms[fs_idx]; + move16(); + bandsOffsetTwo = bands_offset_with_two_max_lin_5ms[fs_idx]; + move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + bandsOffsetOne = bands_offset_with_one_max_lin_7_5ms[fs_idx]; + move16(); + bandsOffsetTwo = bands_offset_with_two_max_lin_7_5ms[fs_idx]; + move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + bandsOffsetOne = bands_offset_with_one_max_lin[fs_idx]; + move16(); + bandsOffsetTwo = bands_offset_with_two_max_lin[fs_idx]; + move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + } + + /* start processing with band offsets == 1 */ + FOR (band = 0; band < bandsOffsetOne; band++) + { + ASSERT((band_offsets[band + 1] - band_offsets[band]) == 1); + ASSERT(band < maxBwBin); + + s2 = 15; + move16(); + s = norm_l(d_fx[band]); + if (d_fx[band] != 0) + s2 = s_min(s2, s); + + tmp16 = extract_h(L_shl_pos(d_fx[band], s2)); + + d2_fx[band] = L_mult0(tmp16, tmp16); + move32(); + d2_band_fx_exp[band] = sub(1, shl_pos(s2, 1)); + move16(); + } + + /* start processing with band offsets == 2 */ + i = bandsOffsetOne; + move16(); + FOR (; band < bandsOffsetTwo; band++) + { + ASSERT((band_offsets[band + 1] - band_offsets[band]) == 2); + IF (sub(add(i, 1), maxBwBin) >= 0) + { + IF (sub(i, maxBwBin) >= 0) + { + d2_fx[band] = 0; + move32(); + d2_band_fx_exp[band] = sub(1, shl_pos(15, 1)); + move16(); + } + ELSE + { + s2 = 15; + move16(); + s = norm_l(d_fx[band]); + if (d_fx[band] != 0) + s2 = s_min(s2, s); + + tmp16 = extract_h(L_shl_pos(d_fx[band], s2)); + + d2_fx[band] = L_mult0(tmp16, tmp16); + move32(); + d2_band_fx_exp[band] = sub(1, shl_pos(s2, 1)); + move16(); + } + } + ELSE + { + ASSERT(i + 1 < maxBwBin); + + s2 = 15; + move16(); + s = norm_l(d_fx[i]); + if (d_fx[i] != 0) + s2 = s_min(s2, s); + s = norm_l(d_fx[i + 1]); + if (d_fx[i + 1] != 0) + s2 = s_min(s2, s); + + tmp16 = extract_h(L_shl_pos(d_fx[i], s2)); + nrg = L_mult0(tmp16, tmp16); + nrg = L_min(nrg, 0x3FFFFFFF); + tmp16 = extract_h(L_shl_pos(d_fx[i + 1], s2)); + + d2_fx[band] = L_shr_pos(L_mac0(nrg, tmp16, tmp16), 1); + move32(); + d2_band_fx_exp[band] = sub(1, shl_pos(s2, 1)); + move16(); + } + i = add(i, 2); + } + + /* proceed with band offsets > 2 */ + FOR (; band < n_bands; band++) + { + /* normalization */ + k = i; + move16(); + s1 = 15; + move16(); + + stopBand = s_min(band_offsets[band + 1], maxBwBin); + FOR (; k < stopBand; k++) + { + s = norm_l(d_fx[k]); + if (d_fx[k] != 0) + s1 = s_min(s1, s); + } + + nbands = sub(band_offsets[band + 1], band_offsets[band]); +#ifdef ENABLE_HR_MODE + if (nbands < 32) + { + nbands = s_min(s_max(0, nbands), 31); + /* specify headroom, it can be reduced by one due to use of L_mac0 */ + s2 = sub(s1, bands_nrg_scale[nbands]); + } + else + { + /* Active only in the 96 kHz case */ + s2 = sub(s1, 5); + } +#else + ASSERT(nbands < 32); + nbands = s_min(s_max(0, nbands), 31); + /* specify headroom, it can be reduced by one due to use of L_mac0 */ + s2 = sub(s1, bands_nrg_scale[nbands]); +#endif + + /* calculate energy per band */ + nrg = 0; + move32(); + + FOR (; i < stopBand; i++) + { + tmp16 = extract_h(L_shl(d_fx[i], s2)); + nrg = L_mac0(nrg, tmp16, tmp16); + } + i = band_offsets[band + 1]; + + /* calculate mean value of energy */ + nrg = Mpy_32_16_lc3plus(nrg, InvIntTable[nbands]); + + /* store normalized energy */ + s = norm_l(nrg); + d2_fx[band] = L_shl_pos(nrg, s); + move32(); + d2_band_fx_exp[band] = sub(1, add(shl_pos(s2, 1), s)); + move16(); + } + + /* Determine maximum exponent and rescale band energies */ + smax = -31; + move16(); + FOR (band = 0; band < n_bands; band++) + { + smax = s_max(smax, d2_band_fx_exp[band]); + } + FOR (band = 0; band < n_bands; band++) + { + d2_fx[band] = L_shr_pos(d2_fx[band], s_min(sub(smax, d2_band_fx_exp[band]), 31)); + move32(); + } + + /* Save exponent for all bands */ + *d2_fx_exp = s_max(add(shl_pos(d_fx_exp, 1), smax), -32); + move16(); + + Dyn_Mem_Deluxe_Out(); +} + diff --git a/lib_lc3plus/plc_apply_fx.c b/lib_lc3plus/plc_apply_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..ca07b5d8169534530e7f089913029e12dc7efa22 --- /dev/null +++ b/lib_lc3plus/plc_apply_fx.c @@ -0,0 +1,380 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "constants.h" +#include "functions.h" + +void processPLCapply_fx( + Word16 *concealMethod, + Word16 nbLostFramesInRow, Word16 bfi, Word16 prev_bfi, + Word16 frame_length, Word16 la_zeroes, +#ifdef ENABLE_HR_MODE + const Word32 w[], +#else + const Word16 w[], +#endif + Word16 x_fx[], Word16 ola_mem[], + Word16 *ola_mem_exp, Word16 q_old_d_fx[], Word16 *q_old_fx_exp, Word32 q_d_fx[], + Word16 *q_fx_exp, Word16 yLen, Word16 fs_idx, Word16 *damping, Word16 old_pitch_int, + Word16 old_pitch_fr, Word16 *ns_cum_alpha, Word16 *ns_seed, LC3PLUS_FrameDuration frame_dms, AplcSetup *plcAd, + Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif + , Word32 rel_pitch_change + , Word16 *alpha_type_2_table + ) +{ + Dyn_Mem_Deluxe_In( + Counter i; + Word32 *d2_fx; + Word32 *q_old_d_fx32; + Word32 *r_fx; + Word32 *tdc_A_32; + Word16 d2_fx_exp; + Word16 r_fx_exp; + Word16 Q_syn; + Word8 * buffer_perBandEnergy, *buffer_preEmphasis, *buffer_InverseODFT, *buffer_Levinson, + *buffer_tdac, *buffer_phecu; + Word16 y_e; /*exponent of L_ecu_rec */ + Word16 tmp_is_trans[2]; /* may be changed to a single variable */ + Word16 env_stab; + + Word16 n_bands, prev_bfi_plc2; + const Word16 *band_offsets; + Word32 * L_ecu_rec; /* local xtda output is MAX_LEN -> input buffer, + as tmp buffer for w32 fft MAX_LPROT */ + ); + Word16 consecutiveLostThreshold = 0; + +#ifndef ENABLE_HR_MODE + UNUSED(rel_pitch_change); +#endif + + Word16 thresh_tdc_cnt = 0; + Word16 thresh_ns_cnt = 0; + Word16 thresh_tdc_ns_cnt = 0; + + band_offsets = NULL; + + d2_fx = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 4 * MAX_BANDS_NUMBER_PLC */ + q_old_d_fx32 = (Word32 *)scratchAlign(d2_fx, sizeof(*d2_fx) * MAX_BANDS_NUMBER_PLC); /* Size = 4 * MAX_BW */ + r_fx = (Word32 *)scratchAlign(d2_fx, sizeof(*d2_fx) * MAX_BANDS_NUMBER_PLC); /* Size = 4 * (M + 1) */ + tdc_A_32 = (Word32 *)scratchAlign(r_fx, sizeof(*r_fx) * (M + 1)); /* Size = 4 * (M + 1) */ + + L_ecu_rec = (Word32 *)scratchAlign(tdc_A_32, sizeof(*tdc_A_32) * (M + 1)); /* Size = 4 * MAX_LPROT bytes */ + + buffer_perBandEnergy = + (Word8 *)scratchAlign(q_old_d_fx32, sizeof(*q_old_d_fx32) * (MAX_LEN)); /* Size = 2 * MAX_BANDS_NUMBER_PLC */ + buffer_preEmphasis = + (Word8 *)scratchAlign(tdc_A_32, sizeof(*tdc_A_32) * (M + 1)); /* Size = 2 * MAX_BANDS_NUMBER_PLC */ + buffer_InverseODFT = buffer_preEmphasis; /* Size = 640 bytes */ + buffer_Levinson = buffer_preEmphasis; /* Size = 4 * (M + 1) */ + + buffer_tdac = scratchBuffer; /* Size = 2 * MAX_LEN bytes */ + buffer_phecu = scratchBuffer; /* Size = 2 * MAX_LGW + 8 * MAX_LPROT + 12 * MAX_L_FRAME */ + /* Buffers overlap since they are not used at once */ + + + UNUSED(ns_cum_alpha); + UNUSED(ns_seed); + + /* Apply/Prepare PLC in bfi-case */ + IF (sub(bfi, 1) == 0) + { + SWITCH(frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + consecutiveLostThreshold = 32; + thresh_tdc_cnt = THRESH_025_DMS_TDC_CNT; + thresh_ns_cnt = THRESH_025_DMS_NS_CNT; + thresh_tdc_ns_cnt = THRESH_025_DMS_TDC_NS_CNT; + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + consecutiveLostThreshold = 16; + thresh_tdc_cnt = THRESH_025_DMS_TDC_CNT; + thresh_ns_cnt = THRESH_025_DMS_NS_CNT; + thresh_tdc_ns_cnt = THRESH_025_DMS_TDC_NS_CNT; + break; + case LC3PLUS_FRAME_DURATION_5MS: consecutiveLostThreshold = 8; + thresh_tdc_cnt = THRESH_050_DMS_TDC_CNT; + thresh_ns_cnt = THRESH_050_DMS_NS_CNT; + thresh_tdc_ns_cnt = THRESH_050_DMS_TDC_NS_CNT; + break; + case LC3PLUS_FRAME_DURATION_7p5MS: consecutiveLostThreshold = 6; + thresh_tdc_cnt = THRESH_075_DMS_TDC_CNT; + thresh_ns_cnt = THRESH_075_DMS_NS_CNT; + thresh_tdc_ns_cnt = THRESH_075_DMS_TDC_NS_CNT; + break; + case LC3PLUS_FRAME_DURATION_10MS: consecutiveLostThreshold = 4; + thresh_tdc_cnt = THRESH_100_DMS_TDC_CNT; + thresh_ns_cnt = THRESH_100_DMS_NS_CNT; + thresh_tdc_ns_cnt = THRESH_100_DMS_TDC_NS_CNT; + break; + default: assert(0); + } + + IF (sub(fs_idx, 2) == 0 || sub(fs_idx, 4) >= 0) + { + if (sub(plcAd->longterm_counter_plcTdc, thresh_tdc_cnt) < 0){ + plcAd->plc_fadeout_type = 1; + } + else if (sub(plcAd->longterm_counter_plcNsAdv, thresh_ns_cnt) < 0){ + plcAd->plc_fadeout_type = 1; + } + else if (sub(plcAd->longterm_counter_plcTdc + plcAd->longterm_counter_plcNsAdv, thresh_tdc_ns_cnt) < 0){ + plcAd->plc_fadeout_type = 1; + } + else { + plcAd->plc_fadeout_type = 0; + } + + env_stab = norm_s(plcAd->longterm_analysis_counter_max); + IF(sub(shl_pos(plcAd->overall_counter, env_stab), mult(shl_pos(plcAd->longterm_analysis_counter_max, env_stab), PLC_LONGTERM_ANALYSIS_STARTUP_FILL)) < 0) + { + plcAd->plc_fadeout_type = 0; + } + +#ifdef ENABLE_HR_MODE + IF (L_sub(rel_pitch_change,REL_PITCH_THRESH) > 0 && sub(hrmode,1) == 0 && (sub(frame_dms, LC3PLUS_FRAME_DURATION_5MS) == 0 || sub(frame_dms, LC3PLUS_FRAME_DURATION_2p5MS) == 0)){ + plcAd->plc_fadeout_type = 2;move16(); + } ELSE +#endif + IF((sub(nbLostFramesInRow, consecutiveLostThreshold) < 0) && (*concealMethod != LC3_CON_TEC_PHASE_ECU)) + { + plcAd->plc_fadeout_type = 0; + } + } ELSE { + plcAd->plc_fadeout_type = 0; /*fs_idx == 0,1,3 */ + } + + SWITCH (*concealMethod) + { + case LC3_CON_TEC_PHASE_ECU: + ASSERT(frame_dms == LC3PLUS_FRAME_DURATION_10MS); + /* call phaseEcu */ + env_stab = 32767; move16(); /* 1.0=stable , 0.0=dynamic Q15*/ + tmp_is_trans[0] = plcAd->PhECU_short_flag_prev; move16(); + tmp_is_trans[1] = plcAd->PhECU_short_flag_prev; move16(); + + ASSERT(prev_bfi == 0 || prev_bfi == 1|| prev_bfi == 2); /*PC prev_bfi has three states */ + prev_bfi_plc2 = prev_bfi; move16(); + if (sub(prev_bfi_plc2, 2) == 0) + { + prev_bfi_plc2 = 0; move16(); + } + + ASSERT(prev_bfi_plc2 == 0 || prev_bfi_plc2 == 1); /*PhEcu does not accept prev_bfi == 2 */ + IF(prev_bfi_plc2 == 0) + { /* convert pitch lag info at current fs to a normalized fractional bin-frequency */ + plcAd->PhECU_f0hzLtpBinQ7 = plc_phEcuSetF0Hz_fx(fs_idx, old_pitch_int, old_pitch_fr); move16(); + + + + /* first bfi frame calc decoded pcm energy 16,16 ms, in 26 ms buffer separated by 10 ms*/ + + { /* compute energy normalization needed for concealment method 2 Xavg and transient analysis */ + + /* left */ + processPLCUpdateXFP_w_E_hist_fx(0, 0, + &(plcAd->x_old_tot_fx[ sub(plcAd->max_len_pcm_plc , add(num_FsByResQ0[fs_idx],rectLengthTab[fs_idx] )) ]), plcAd->q_fx_old_exp,0, + + fs_idx, + &plcAd->PhECU_L_oold_xfp_w_E_fx, &plcAd->PhECU_oold_xfp_w_E_exp_fx, + &plcAd->PhECU_L_old_xfp_w_E_fx, &plcAd->PhECU_old_xfp_w_E_exp_fx, + &plcAd->PhECU_oold_Ltot_exp_fx, &plcAd->PhECU_old_Ltot_exp_fx); + + /* right */ + processPLCUpdateXFP_w_E_hist_fx(0, 0, plcAd->PhECU_xfp_fx, plcAd->PhECU_xfp_exp_fx, + plcAd->PhECU_margin_xfp, fs_idx, + &plcAd->PhECU_L_oold_xfp_w_E_fx, &plcAd->PhECU_oold_xfp_w_E_exp_fx, + &plcAd->PhECU_L_old_xfp_w_E_fx, &plcAd->PhECU_old_xfp_w_E_exp_fx, + &plcAd->PhECU_oold_Ltot_exp_fx, &plcAd->PhECU_old_Ltot_exp_fx); + } + } + + hq_phase_ecu_fx( + plcAd->PhECU_xfp_fx, /* i : only valid first Bfi frame , buffer of previous synt signal length */ + L_ecu_rec, /* o : reconstructed frame in folded tda domain xtda Word32 Q x */ + &plcAd->PhECU_time_offs, /* i/o: Sample offset for consecutive frame losses*/ + plcAd->PhECU_X_sav_fx, /* i(prev_bfi==1)/o(prev_bfi==0): Stored Complex spectrum of prototype frame */ + &plcAd->PhECU_X_savQ_fx, /* i/o: Q value of stored spectrum */ + &plcAd->PhECU_num_plocs, /* i/o: Number of identified peaks */ + plcAd->PhECU_plocs, /* i/o: Peak locations Q0 */ + plcAd->PhECU_f0est, /* i/o: Interpolated peak locations Q16 */ + env_stab, /* i : Envelope stability parameter */ + plcAd->PhECU_f0hzLtpBinQ7, /* i: LTP bin frequency in normalized Hz Q7 */ + plcAd->norm_corrQ15_fx, /* i : correlation for lag at f0hzLtpBinQ7 */ + prev_bfi_plc2, /* i : indicating burst frame error */ + tmp_is_trans, /* i : flags indicating previous transient frames */ + plcAd->PhECU_mag_chg_1st, /* i/o: per band magnitude modifier for transients*/ + NULL, /* o: dbg per band magnitude modifier, incl. burst attenuation */ + plcAd->PhECU_Xavg, /* i/o: Frequency group average gain to fade to */ + &plcAd->PhECU_beta_mute, /* o : Factor for long-term mute */ + fs_idx, /* i : Encoded bandwidth "nb(0),WB,sWB,WB,FB" */ + frame_length, /* i : frame length */ + NULL , /* o : seed synch dbg */ + NULL , /* o : evolved Spectrum dbg */ + plcAd->PhECU_t_adv, /* i : time adjustment excluding time_offs */ + PhECU_wins[fs_idx][2], /* i: 2 ms initial part pre_tda = mdct-ana */ + PhECU_wins[fs_idx][1], /* i: 16 ms pretda combined part IWHR+MDCT-ana */ + PhECU_wins[fs_idx][0], + plcAd->PhECU_xfp_exp_fx, + plcAd->max_lprot, + plcAd->max_plocs, + plcAd->PhECU_L_oold_xfp_w_E_fx,plcAd->PhECU_oold_xfp_w_E_exp_fx, plcAd->PhECU_oold_Ltot_exp_fx, + plcAd->PhECU_oold_grp_shape_fx, + plcAd->PhECU_L_old_xfp_w_E_fx,plcAd->PhECU_old_xfp_w_E_exp_fx, plcAd->PhECU_old_Ltot_exp_fx, + plcAd->PhECU_old_grp_shape_fx, + plcAd->PhECU_margin_xfp, + plcAd->plc_fadeout_type , /* i : fadeout scheme */ + &(plcAd->PhECU_nonpure_tone_flag), /* i/o : non-pure single tone indicator state */ + buffer_phecu); + + y_e = 18; move16(); /* the fixed exponent (exp) from Lecu_rec from PhaseECU is 18 */ + + Processing_ITDA_WIN_OLA( + L_ecu_rec, /* i: X_TDA buffer data = "y" DCT-IV output */ + &y_e, /* i/o: x_tda exponent "y_e" */ + w, /* i: window coefficients including normalization of sqrt(2/N) and scaled by 2^4 */ + ola_mem, /* i/o: overlap add memory */ + ola_mem_exp, /* i/o: overlap add exponent */ + x_fx, /* o: time signal out */ + LowDelayShapes_n960_len[fs_idx], /* i: window length */ + frame_length, /* i: block size */ + sub(frame_length, LowDelayShapes_n960_la_zeroes[fs_idx]) /* i: overlap add buffer size */ + ); + *q_fx_exp = y_e; move16(); /* assign updated Q */ + BREAK; + + case LC3_CON_TEC_TDPLC: + IF (sub(nbLostFramesInRow, 1) == 0) + { + plcAd->tdc_fract = old_pitch_fr; move16(); + n_bands = s_min(frame_length, MAX_BANDS_NUMBER_PLC); + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: +#ifdef FIX_PLC_CONFORM_ISSUES + band_offsets = bands_offset_lin_1_25ms[fs_idx]; move16(); +#endif + IF (sub(fs_idx, 4) == 0) + { + n_bands = 60; move16(); + } + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + band_offsets = bands_offset_lin_2_5ms[fs_idx]; move16(); + IF (sub(fs_idx, 4) == 0) + { + n_bands = 60; move16(); + } + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + band_offsets = bands_offset_lin_5ms[fs_idx]; move16(); + IF (sub(fs_idx, 2) == 0) + { + n_bands = 40; move16(); + } + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + band_offsets = bands_offset_lin_7_5ms[fs_idx]; move16(); +#ifdef ENABLE_HR_MODE + IF (sub(fs_idx, 5) != 0) + { +#endif + IF (sub(fs_idx, 3) != 0) + { + n_bands = 60; move16(); + } +#ifdef ENABLE_HR_MODE + } +#endif + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + band_offsets = bands_offset_lin[fs_idx]; move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + FOR (i = 0; i < yLen; i++) + { + q_old_d_fx32[i] = L_deposit_h(q_old_d_fx[i]); + } + + /* LPC Analysis */ + /* calculate per band energy*/ + processPerBandEnergy_fx(d2_fx, &d2_fx_exp, q_old_d_fx32, *q_old_fx_exp, band_offsets, fs_idx, n_bands, + 1, frame_dms, buffer_perBandEnergy +#ifdef ENABLE_HR_MODE + , hrmode +#endif + ); + + /* calculate pre-emphasis */ + processPreEmphasis_fx(d2_fx, &d2_fx_exp, fs_idx, n_bands, frame_dms, buffer_preEmphasis); + + /* inverse ODFT */ + processInverseODFT_fx(r_fx, &r_fx_exp, d2_fx, d2_fx_exp, n_bands, plcAd->tdc_lpc_order, buffer_InverseODFT); + + /* lag windowing */ + processLagwin_fx(r_fx, lag_win[fs_idx], plcAd->tdc_lpc_order); + + /* Levinson Durbin */ + processLevinson_fx(tdc_A_32, r_fx, plcAd->tdc_lpc_order, NULL, NULL, buffer_Levinson); + + /* 32Q27 -> 16Qx */ + processPLCLpcScaling_fx(tdc_A_32, plcAd->tdc_A, add(plcAd->tdc_lpc_order, 1)); + } + + /* call TD-PLC */ + /* Q_syn = plcAd->q_fx_old_exp; */ /* makes q_fx_old_exp + available in processTimeDomainConcealment_Apply_fx() for + debugging */ + processTimeDomainConcealment_Apply_fx( + old_pitch_int, plcAd->tdc_preemph_fac, plcAd->tdc_A, plcAd->tdc_lpc_order, plcAd->x_old_tot_fx, frame_length, frame_dms, + fs_idx, nbLostFramesInRow, sub(frame_length, la_zeroes), plcAd->stab_fac, &plcAd->tdc_fract, + &plcAd->tdc_seed, + &plcAd->tdc_gain_c, x_fx, &Q_syn, damping, + plcAd->max_len_pcm_plc, + plcAd->harmonicBuf_fx, plcAd->synthHist_fx, &plcAd->harmonicBuf_Q, scratchBuffer + , plcAd->plc_fadeout_type + , alpha_type_2_table +); + + /* exponent of TD-PLC output */ + Q_syn = add(Q_syn, sub(15, plcAd->q_fx_old_exp)); + *q_fx_exp = sub(15, Q_syn); move16(); + + /* TDAC */ + processTdac_fx(ola_mem, ola_mem_exp, x_fx, *q_fx_exp, w, la_zeroes, frame_length, buffer_tdac); + BREAK; + + case LC3_CON_TEC_NS_ADV: + *q_fx_exp = *q_old_fx_exp; move16(); + + /* call Noise Substitution */ + processPLCNoiseSubstitution_fx(q_d_fx, q_old_d_fx, yLen); + + BREAK; + default: ASSERT(!"Unsupported PLC method!"); + } + } + + Dyn_Mem_Deluxe_Out(); +} + + diff --git a/lib_lc3plus/plc_classify_fx.c b/lib_lc3plus/plc_classify_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..6779ca92550d8c3744dedcff5a2f8d194e85df66 --- /dev/null +++ b/lib_lc3plus/plc_classify_fx.c @@ -0,0 +1,451 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +static Word32 change_bit_at_position(Word32 value, Word8 bit_position, UWord8 bit) +{ + Word32 helper_mask = ~L_shl_pos(1, bit_position); + Word32 tmp = L_and(value, helper_mask); + tmp = L_or(tmp, L_shl_pos(bit, bit_position)); + return tmp; +} + +static void update_bit_and_byte_positions(Word16 longterm_analysis_counter_max_bytebuffer, Word8 *byte_position, Word8 *bit_position) +{ + IF (sub(*bit_position, 29) == 0) + { + *bit_position = 0; move16(); + + if (sub(*byte_position, longterm_analysis_counter_max_bytebuffer) < -1) + { + *byte_position = add(*byte_position, 1); + } else { + *byte_position = 0; move16(); + } + } ELSE { + *bit_position = add(*bit_position, 1); + } +} + +static void array_insert_and_shift(Word32 *array, UWord8 value, Word16 longterm_analysis_counter_max, Word16 *overall_counter, Word8 *byte_position, Word8 *bit_position) +{ + Word32 current_byte = 0; + +#ifdef WMOPS + push_wmops("PLC::array_insert_and_shift"); +#endif + + IF( overall_counter != NULL) + { + *overall_counter = s_min(add(*overall_counter, 1), longterm_analysis_counter_max); + } + + current_byte = array[*byte_position]; move16(); + current_byte = change_bit_at_position(current_byte, *bit_position, value); + array[*byte_position] = current_byte; move16(); + +#ifdef WMOPS + pop_wmops(); +#endif +} + +static void array_calculate(Word32 *array_tdc, Word32 *array_ns, int length, Word16 *counter_tdc, Word16 *counter_ns, Word16 longterm_analysis_counter_max) +{ + int i, k; + Word32 current_byte_tdc = 0, current_byte_ns = 0; + Word16 counter_loc_tdc = 0, counter_loc_ns = 0, counter_tmp = 0; + +#ifdef WMOPS + push_wmops("PLC::array_calculate"); +#endif + + for (i = length - 1; i >= 0; i--) + { + current_byte_tdc = array_tdc[i]; + current_byte_ns = array_ns[i]; + + for (k = 0; k < 30; k++) + { + counter_loc_tdc += ((current_byte_tdc >> k) & 1); + counter_loc_ns += ((current_byte_ns >> k) & 1); + counter_tmp++; + + /* Break from both loops if full 2s buffer has been evaluated */ + if (counter_tmp >= longterm_analysis_counter_max) + { + i = -1; + k = 30; + break; + } + } + } + + *counter_tdc = counter_loc_tdc; + *counter_ns = counter_loc_ns; + +#ifdef WMOPS + pop_wmops(); +#endif +} + +static Word16 spectral_centroid_fx_lc(Word16 old_scf_q[], const Word16 *band_offsets, Word16 bands_number, Word16 frame_length, + Word16 fs_idx, Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif + ); + +void processPLCclassify_fx(Word16 plcMeth, Word16 *concealMethod, Word16 *nbLostFramesInRow, Word16 bfi, + Word16 ltpf_mem_pitch_int, Word16 frame_length, LC3PLUS_FrameDuration frame_dms, Word16 fs_idx, Word16 yLen, + Word16 q_old_d_fx[], const Word16 *band_offsets, Word16 bands_number, AplcSetup *plcAd, Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif + ) +{ + Dyn_Mem_Deluxe_In( + Word16 scQ15; + Word32 class; + ); + +#ifdef WMOPS + push_wmops("PLC::processPLCclassify_fx"); +#endif + + UNUSED(yLen); + UNUSED(q_old_d_fx); + + if (plcAd) + { + plcAd->norm_corrQ15_fx = 0; move16(); + } + +#ifdef CR13_C_RESET_CLASSIFIER_AFTER_BAD_FRAMES + Word16 resetClassifierThreshold = 0; + Word16 updateStatistics = 0; + + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + resetClassifierThreshold = 16; + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + resetClassifierThreshold = 8; + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + resetClassifierThreshold = 4; + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + resetClassifierThreshold = 3; + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + resetClassifierThreshold = 2; + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + IF (sub(plcAd->numberOfGoodFrames, resetClassifierThreshold) > 0) + { + updateStatistics = 1; + } ELSE { + updateStatistics = 0; + } +#endif + + /* assert(bfi != 2 && "Error bfi flag value, state of fadeout cntr is affected by PartialConcealment here "); */ + /* Save statistics for 24 kHz, 48 kHz and 96 kHz */ + IF((sub(bfi, 1) == 0) || (((bfi >= 0) && (sub(bfi, 2) <= 0)) && ((sub(fs_idx, 2) == 0) || (sub(fs_idx, 4) == 0) || (sub(fs_idx, 5) == 0)))) /* note for PC bfi==2 is possible */ + { + /* increase counter of lost-frames-in-a-row */ + IF (sub(bfi, 1) == 0) + { + *nbLostFramesInRow = add(*nbLostFramesInRow, 1); + *nbLostFramesInRow = s_min(*nbLostFramesInRow, 0x100); + } + + /*assert((bfi != 2) && "PartialConcealment checked vs bfi==0 can cause issues "); */ + IF ((sub(*nbLostFramesInRow, 1) == 0) || (bfi != 1) ) /* was "|| (bfi==0)" , NB only test bfi vs "1" as bfi can have the states [0(good),1(bad),2(good,partialConcealment) } */ + { + *concealMethod = plcMeth; move16(); + + IF(sub(plcMeth, 1) == 0) + { + IF(ltpf_mem_pitch_int > 0) + { + *concealMethod = LC3_CON_TEC_TDPLC; move16(); /* TD-PLC */ + /* Calculate Features */ + + plcAd->norm_corrQ15_fx = plc_xcorr_lc_fx(plcAd->x_old_tot_fx, plcAd->max_len_pcm_plc, ltpf_mem_pitch_int, fs_idx); + scQ15 = spectral_centroid_fx_lc(plcAd->old_scf_q, band_offsets, bands_number, frame_length, + fs_idx, scratchBuffer +#ifdef ENABLE_HR_MODE + , hrmode +#endif + ); + + /* Classify */ + class = L_mult(plcAd->norm_corrQ15_fx, 7640); + class = L_mac(class, scQ15, -32768); + class = L_add_sat(class, -335020208); + + IF(class <= 0) + { +#ifdef ENABLE_HR_MODE + IF((frame_dms == LC3PLUS_FRAME_DURATION_10MS) && (hrmode == 0)) +#else + IF(frame_dms == LC3PLUS_FRAME_DURATION_10MS) +#endif + { + *concealMethod = LC3_CON_TEC_PHASE_ECU; move16(); /* Phase ECU selected */ + +#ifdef CR13_C_RESET_CLASSIFIER_AFTER_BAD_FRAMES + IF (sub(updateStatistics, 1) == 0) +#endif + { + array_insert_and_shift(plcAd->plc_longterm_advc_tdc, 0, plcAd->longterm_analysis_counter_max, &plcAd->overall_counter, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + array_insert_and_shift(plcAd->plc_longterm_advc_ns, 0, plcAd->longterm_analysis_counter_max, NULL, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + } + } + ELSE + { +#ifdef CR13_C_RESET_CLASSIFIER_AFTER_BAD_FRAMES + IF (sub(updateStatistics, 1) == 0) +#endif + { + array_insert_and_shift(plcAd->plc_longterm_advc_tdc, 0, plcAd->longterm_analysis_counter_max, &plcAd->overall_counter, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + array_insert_and_shift(plcAd->plc_longterm_advc_ns, 0, plcAd->longterm_analysis_counter_max, NULL, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + } + } + } + ELSE { +#ifdef CR13_C_RESET_CLASSIFIER_AFTER_BAD_FRAMES + IF (sub(updateStatistics, 1) == 0) +#endif + { + array_insert_and_shift(plcAd->plc_longterm_advc_tdc, 1, plcAd->longterm_analysis_counter_max, &plcAd->overall_counter, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + array_insert_and_shift(plcAd->plc_longterm_advc_ns, 0, plcAd->longterm_analysis_counter_max, NULL, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + } + } + } + ELSE + { + *concealMethod = LC3_CON_TEC_NS_ADV; move16(); /* Noise Substitution */ + +#ifdef CR13_C_RESET_CLASSIFIER_AFTER_BAD_FRAMES + IF (sub(updateStatistics, 1) == 0) +#endif + { + array_insert_and_shift(plcAd->plc_longterm_advc_tdc, 0, plcAd->longterm_analysis_counter_max, &plcAd->overall_counter, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + array_insert_and_shift(plcAd->plc_longterm_advc_ns, 1, plcAd->longterm_analysis_counter_max, NULL, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + } + } + +#ifdef CR13_C_RESET_CLASSIFIER_AFTER_BAD_FRAMES + IF (sub(updateStatistics, 1) == 0) +#endif + { + array_calculate(plcAd->plc_longterm_advc_tdc, plcAd->plc_longterm_advc_ns, plcAd->longterm_analysis_counter_max_bytebuffer, &plcAd->longterm_counter_plcTdc, &plcAd->longterm_counter_plcNsAdv, plcAd->longterm_analysis_counter_max); + update_bit_and_byte_positions(plcAd->longterm_analysis_counter_max_bytebuffer, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + } + } + + } + } + +#ifdef CR13_C_RESET_CLASSIFIER_AFTER_BAD_FRAMES + IF (sub(bfi, 1) == 0) + { + plcAd->numberOfGoodFrames = 0; + } ELSE { + plcAd->numberOfGoodFrames = add(plcAd->numberOfGoodFrames, 1); + } +#endif + + Dyn_Mem_Deluxe_Out(); +#ifdef WMOPS + pop_wmops(); +#endif +} + +Word16 spectral_centroid_fx_lc(Word16 old_scf_q[], const Word16 *band_offsets, Word16 bands_number, Word16 frame_length, + Word16 fs_idx, Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif + ) +{ + Dyn_Mem_Deluxe_In( + Counter i, j; + Word32 den32, num32, tmp32; + Word16 s, sc, fac, freq, inv, startfreq, stopfreq; + Word16 s2; + Word16 *old_scf_q_mod; + Word16 *old_scf_q_mod_exp; + Word16 *band_offsets_local; + ); +#ifdef WMOPS + push_wmops("PLC::spectral_centroid_fx_lc"); +#endif + +#ifdef ENABLE_HR_MODE + s2 = 0; +#else + UNUSED(s2); +#endif + + + old_scf_q_mod = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * M */ + old_scf_q_mod_exp = (Word16 *)scratchAlign(old_scf_q_mod, sizeof(*old_scf_q_mod) * M); /* Size = 2 * M */ + band_offsets_local = (Word16 *)scratchAlign(old_scf_q_mod_exp, sizeof(*old_scf_q_mod_exp) * (M)); /* Size = 2 * bands_number */ + + /* Linear Domain */ + FOR (i = 0; i < M; i++) + { + old_scf_q_mod[i] = BASOP_Util_InvLog2_16(old_scf_q[i], &old_scf_q_mod_exp[i]); + } + + /* De-emphasis */ + FOR (i = 0; i < M; i++) + { + old_scf_q_mod[i] = mult(old_scf_q_mod[i], lpc_warp_dee_emphasis[fs_idx][i]); move16(); + old_scf_q_mod_exp[i] = add(old_scf_q_mod_exp[i], lpc_warp_dee_emphasis_e[fs_idx][i]); move16(); + } + + IF (sub(bands_number, 64) == 0) + { + basop_memmove(band_offsets_local, band_offsets, (bands_number + 1) * sizeof(Word16)); + } + IF (sub(bands_number, 32) < 0) + { + band_offsets_local[0] = 0; move16(); + s = sub(32, bands_number); + FOR (i = sub(bands_number, 1); i >= s; i--) + { + band_offsets_local[(i + s) * 2 + 1 + 1] = band_offsets[i + 1]; move16(); + band_offsets_local[(i + s) * 2 + 0 + 1] = band_offsets[i + 1]; move16(); + } + FOR (i = sub(s, 1); i >= 0; i--) + { + band_offsets_local[i * 4 + 3 + 1] = band_offsets[i + 1]; move16(); + band_offsets_local[i * 4 + 2 + 1] = band_offsets[i + 1]; move16(); + band_offsets_local[i * 4 + 1 + 1] = band_offsets[i + 1]; move16(); + band_offsets_local[i * 4 + 0 + 1] = band_offsets[i + 1]; move16(); + } + } + ELSE + IF (sub(bands_number, 64) < 0) + { + band_offsets_local[0] = 0; move16(); + s = sub(64, bands_number); + FOR (i = sub(bands_number, 1); i >= s; i--) + { + band_offsets_local[i + s + 1] = band_offsets[i + 1]; move16(); + } + FOR (i = sub(s, 1); i >= 0; i--) + { + band_offsets_local[i * 2 + 1 + 1] = band_offsets[i + 1]; move16(); + band_offsets_local[i * 2 + 0 + 1] = band_offsets[i + 1]; move16(); + } + } + + den32 = 1; move16(); + num32 = 0; move16(); + inv = div_s(1, frame_length); + + FOR (i = 0; i < M; i++) + { + freq = 0; move16(); + startfreq = add(band_offsets_local[i * 4], 1); + stopfreq = band_offsets_local[i * 4 + 4]; + +#ifdef ENABLE_HR_MODE + IF (hrmode != 0) + { + tmp32 = 0; move32(); + FOR (j = startfreq; j <= stopfreq; j++) + { + tmp32 = L_add(tmp32, j); + } + + s2 = norm_l(tmp32); + freq = extract_h(L_shl(tmp32, s2)); + s2 = sub(add(15, s2), 31); + tmp32 = L_mult(inv, freq); + s = norm_l(tmp32); + } + ELSE +#endif + { + FOR (j = startfreq; j <= stopfreq; j++) + { + freq = add(freq, j); + } + + tmp32 = L_mult(inv, freq); + s = norm_l(tmp32); + } + + tmp32 = L_mult(old_scf_q_mod[i], extract_h(L_shl(tmp32, s))); + +#ifdef ENABLE_HR_MODE + if (hrmode != 0) + { + s = add(s, s2); + } +#endif + + num32 = L_add(num32, L_shl(tmp32, add(add(-15, old_scf_q_mod_exp[i]), sub(15, s)))); + den32 = L_add(den32, L_shl(L_mult(old_scf_q_mod[i], stopfreq - startfreq + 1), old_scf_q_mod_exp[i])); + } + + s = norm_l(den32); + s = sub(16, s); + + sc = div_s(extract_l(L_shr(num32, s)), extract_l(L_shr(den32, s))); + + SWITCH (fs_idx) + { + case 0: + fac = 5461; move16(); + BREAK; + case 1: + fac = 10922; move16(); + BREAK; + case 2: + fac = 16384; move16(); + BREAK; + case 3: + fac = 21845; move16(); + BREAK; + default: /* case 4: */ + fac = 32767; move16(); + BREAK; + } + sc = round_fx(L_mult(sc, fac)); +#ifdef ENABLE_HR_MODE + if (sub(fs_idx, 5) == 0) + { + sc = shl_pos(sc, 1); + } +#endif + + Dyn_Mem_Deluxe_Out(); +#ifdef WMOPS + pop_wmops(); +#endif + return sc; +} + + diff --git a/lib_lc3plus/plc_damping_scrambling_fx.c b/lib_lc3plus/plc_damping_scrambling_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..89c079202aa7a98a65e26550a12444dfd5f798d2 --- /dev/null +++ b/lib_lc3plus/plc_damping_scrambling_fx.c @@ -0,0 +1,442 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +void processPLCDampingScrambling_main_fx(Word16 bfi, Word16 concealMethod, Word16 ns_nbLostFramesInRow, Word16 *cum_fflcAtten, + Word16 pc_nbLostFramesInRow, Word16 *ns_seed, Word16 *pc_seed, Word16 pitch_present_bfi1, + Word16 pitch_present_bfi2, Word32 spec[], Word16 *q_fx_exp, Word16 *q_old_d_fx, + Word16 *q_old_fx_exp, Word16 L_spec, Word16 stabFac, LC3PLUS_FrameDuration frame_dms, + Word16 *cum_fading_slow, Word16 *cum_fading_fast, Word16 spec_inv_idx + , UWord8 plc_fadeout_type + ) +{ + Dyn_Mem_Deluxe_In( + Word16 processDampScramb; + ); + + IF ( bfi != 0 ) + { + processDampScramb = 0; move16(); + test(); + IF (sub(concealMethod, LC3_CON_TEC_NS_ADV) == 0 || sub(bfi, 2) == 0) + { + processDampScramb = 1; move16(); + } + + IF (sub(ns_nbLostFramesInRow, 1) == 0) + { + *cum_fading_slow = 32767; move16(); + *cum_fading_fast = 32767; move16(); + *cum_fflcAtten = 32767; move16(); + } + + IF (sub(bfi, 1) == 0) + { + processPLCDampingScrambling_fx(spec, L_spec, ns_nbLostFramesInRow, stabFac, + processDampScramb, cum_fflcAtten, + pitch_present_bfi1, frame_dms, cum_fading_slow, + cum_fading_fast, ns_seed, 0 + , plc_fadeout_type + ); + } + ELSE /* bfi == 2 */ + { + processPLCDampingScrambling_fx(spec, L_spec, pc_nbLostFramesInRow, stabFac, + processDampScramb, cum_fflcAtten, + pitch_present_bfi2, frame_dms, cum_fading_slow, + cum_fading_fast, pc_seed, spec_inv_idx + , plc_fadeout_type + ); + + processPLCupdateSpec_fx(q_old_d_fx, q_old_fx_exp, spec, q_fx_exp, L_spec); + } + } + Dyn_Mem_Deluxe_Out(); +} + +void processPLCDampingScrambling_fx(Word32 spec[], Word16 L_spec, Word16 nbLostFramesInRow, Word16 stabFac, Word16 processDampScramb, + Word16 *cum_fflcAtten, Word16 pitch_present, LC3PLUS_FrameDuration frame_dms, Word16 *cum_fading_slow, + Word16 *cum_fading_fast, Word16 *seed, Word16 spec_inv_idx + , UWord8 plc_fadeout_type + ) +{ + Counter i; + Word16 lossDuration_dms, slow, fast, tmp16; + Word16 plc_start_inFrames = 0, plc_end_inFrames = 0, plc_duration_inFrames, linFuncStartStop; + Word16 randThreshold = 0, ad_threshFac, energThreshold, s, s2, s3, mean_energy16; + Word32 frame_energy, mean_nrg, fac; + Word16 fflcAtten, cum_fading_slow_local, cum_fading_fast_local; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processPLCDampingScrambling_fx", sizeof(struct { + Counter i; + Word16 lossDuration_dms, slow, fast, tmp16; + Word16 plc_start_inFrames, plc_end_inFrames, plc_duration_inFrames, linFuncStartStop; + Word16 randThreshold, ad_threshFac, energThreshold, s, s2, s3, mean_energy16; + Word32 frame_energy, mean_nrg, fac; + Word16 fflcAtten, cum_fading_slow_local, cum_fading_fast_local; + })); +#endif + + /** preparation */ + + /* get damping factors */ + tmp16 = mult(6554 /*0.2*/, stabFac); + slow = add(26214 /*0.8*/, tmp16); + fast = add( 9830 /*0.3*/, tmp16); + + + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: +#ifdef FIX_PLC_CONFORM_ISSUES + for ( i = 0; i < 3; i++ ) +#else + for ( i = 0; i < 8; i++ ) +#endif + { + IF (sub(slow, 32767) < 0) + { + tmp16 = 0; + slow = Sqrt16(slow, &tmp16); move16(); + slow = shl(slow, tmp16); + } + } +#ifdef FIX_PLC_CONFORM_ISSUES + for ( i = 0; i < 3; i++ ) + { + IF( sub( fast, 32767 ) < 0 ) + { + tmp16 = 0; + fast = Sqrt16( fast, &tmp16 ); + move16(); + fast = shl( fast, tmp16 ); + } + } +#endif + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + IF (sub(slow, 32767) < 0) + { + tmp16 = 0; + slow = Sqrt16(slow, &tmp16); move16(); + slow = shl(slow, tmp16); + } + IF (sub(slow, 32767) < 0) + { + tmp16 = 0; + slow = Sqrt16(slow, &tmp16); move16(); + slow = shl(slow, tmp16); + } + IF (sub(fast, 32767) < 0) + { + tmp16 = 0; + fast = Sqrt16(fast, &tmp16); move16(); + fast = shl(fast, tmp16); + } + IF (sub(fast, 32767) < 0) + { + tmp16 = 0; + fast = Sqrt16(fast, &tmp16); move16(); + fast = shl(fast, tmp16); + } + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + IF (sub(slow, 32767) < 0) + { + tmp16 = 0; + slow = Sqrt16(slow, &tmp16); move16(); + slow = shl(slow, tmp16); + } + IF (sub(fast, 32767) < 0) + { + tmp16 = 0; + fast = Sqrt16(fast, &tmp16); move16(); + fast = shl(fast, tmp16); + } + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + IF (sub(slow, 32767) < 0) + { + slow = mult(slow, mult(slow, slow)); + } + IF (sub(slow, 32767) < 0) + { + tmp16 = 0; + slow = Sqrt16(slow, &tmp16); move16(); + slow = shl(slow, tmp16); + } + IF (sub(slow, 32767) < 0) + { + tmp16 = 0; + slow = Sqrt16(slow, &tmp16); move16(); + slow = shl(slow, tmp16); + } + IF (sub(fast, 32767) < 0) + { + fast = mult(fast, mult(fast, fast)); + } + IF (sub(fast, 32767) < 0) + { + tmp16 = 0; + fast = Sqrt16(fast, &tmp16); move16(); + fast = shl(fast, tmp16); + } + IF (sub(fast, 32767) < 0) + { + tmp16 = 0; + fast = Sqrt16(fast, &tmp16); move16(); + fast = shl(fast, tmp16); + } + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + if (plc_fadeout_type == 0) + { + *cum_fading_slow = mult_r(*cum_fading_slow, slow); + *cum_fading_fast = mult_r(*cum_fading_fast, fast); + } + + IF ( sub(processDampScramb, 1) == 0 ) + { + if (plc_fadeout_type != 0) + { + Word16 lost_frame_thr1 = 4; + Word16 lost_frame_thr2 = 8; + + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + lost_frame_thr1 = 32; + lost_frame_thr2 = 64; + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + lost_frame_thr1 = 16; + lost_frame_thr2 = 32; + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + lost_frame_thr1 = 8; + lost_frame_thr2 = 16; + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + lost_frame_thr1 = 6; + lost_frame_thr2 = 11; + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + IF (sub(nbLostFramesInRow, lost_frame_thr1) < 0) + { + cum_fading_slow_local = 32767; move16(); + } + ELSE IF (sub(nbLostFramesInRow, lost_frame_thr2) < 0) + { + cum_fading_slow_local = 29491; move16(); + } + ELSE + { + cum_fading_slow_local = 27852; move16(); + } + + *cum_fading_slow = mult_r(*cum_fading_slow, cum_fading_slow_local); move16(); + cum_fading_slow_local = *cum_fading_slow; move16(); + } else { + /** rapid fading for FFLC */ + fflcAtten = 32767; move16(); + cum_fading_slow_local = *cum_fading_slow; move16(); + cum_fading_fast_local = *cum_fading_fast; move16(); + + IF (spec_inv_idx == 0) + { + int frame_dms_val = 0; + SWITCH (frame_dms) /* 1 / frame_dms in Q15 */ + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: frame_dms_val = 125; BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: frame_dms_val = 250; BREAK; + case LC3PLUS_FRAME_DURATION_5MS: frame_dms_val = 500; BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: frame_dms_val = 750; BREAK; + case LC3PLUS_FRAME_DURATION_10MS: frame_dms_val = 1000; BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + lossDuration_dms = i_mult(nbLostFramesInRow, frame_dms_val/10); + IF (sub(lossDuration_dms, PLC_FADEOUT_IN_MS*10) > 0) + { + *cum_fflcAtten = 0; move16(); + fflcAtten = 0; move16(); + } + ELSE IF (sub(lossDuration_dms, 200) > 0) + { + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: fflcAtten = PLC34_ATTEN_FAC_125_FX; BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: fflcAtten = PLC34_ATTEN_FAC_025_FX; BREAK; + case LC3PLUS_FRAME_DURATION_5MS: fflcAtten = PLC34_ATTEN_FAC_050_FX; BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: fflcAtten = PLC34_ATTEN_FAC_075_FX; BREAK; + case LC3PLUS_FRAME_DURATION_10MS: fflcAtten = PLC34_ATTEN_FAC_100_FX; BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + } + IF ( sub(fflcAtten, 32767) < 0 ) + { + *cum_fflcAtten = mult_r(*cum_fflcAtten, fflcAtten); + cum_fading_slow_local = mult_r(*cum_fading_slow, *cum_fflcAtten); + cum_fading_fast_local = mult_r(*cum_fading_fast, *cum_fflcAtten); + } + } + + /** prepare fade-out function */ + /* being 1 up to plc_start_inFrames, being 0 starting with + plc_end_inFrames; decreasing linearly in between */ + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + plc_start_inFrames = (100 * PLC4_TRANSIT_START_IN_MS) / 125; move16(); + plc_end_inFrames = (100 * PLC4_TRANSIT_END_IN_MS) / 125; move16(); + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + plc_start_inFrames = (10*PLC4_TRANSIT_START_IN_MS) / 25; move16(); + plc_end_inFrames = (10*PLC4_TRANSIT_END_IN_MS) / 25; move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + plc_start_inFrames = (10*PLC4_TRANSIT_START_IN_MS) / 50; move16(); + plc_end_inFrames = (10*PLC4_TRANSIT_END_IN_MS) / 50; move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + plc_start_inFrames = (10*PLC4_TRANSIT_START_IN_MS) / 75; move16(); + plc_end_inFrames = (10*PLC4_TRANSIT_END_IN_MS) / 75; move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + plc_start_inFrames = (10*PLC4_TRANSIT_START_IN_MS) / 100; move16(); + plc_end_inFrames = (10*PLC4_TRANSIT_END_IN_MS) / 100; move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + if (pitch_present == 0) + { + plc_start_inFrames = 1; move16(); + } + plc_duration_inFrames = sub(plc_end_inFrames, plc_start_inFrames); + + IF (sub(nbLostFramesInRow, plc_start_inFrames) <= 0) + { + linFuncStartStop = 32767; move16(); + } + ELSE IF (sub(nbLostFramesInRow, plc_end_inFrames) >= 0) + { + linFuncStartStop = 0; move16(); + } + ELSE + { + /* + x = xLostFramesInRow; + m = -1 / plc_duration_inFrames; + b = -plc_end_inFrames; % shift on x axis + linFuncStartStop = m * (x + b); + */ + linFuncStartStop = div_s(sub(plc_end_inFrames, nbLostFramesInRow), plc_duration_inFrames); + } + + /** sign scrambling */ + randThreshold = mult(-32768, linFuncStartStop); + } + + tmp16 = *seed; move16(); + FOR (i = spec_inv_idx; i < L_spec; i++) + { + tmp16 = extract_l(L_mac0(16831, tmp16, 12821)); + + IF (tmp16 < 0) + { + test(); + if (plc_fadeout_type != 0 || pitch_present == 0 || sub(tmp16, randThreshold) < 0 ) + { + spec[i] = L_negate(spec[i]); + } + } + + } + *seed = tmp16; move16(); + + if (plc_fadeout_type == 0) + { + /** adaptive damping */ + tmp16 = mult(18022 /* 10 - 1.2 */, linFuncStartStop); + ad_threshFac = add(shr(tmp16, 1), 1228 /* 1.2 >> 1 */); /* exp = 5 */ + + s = getScaleFactor32(&spec[spec_inv_idx], sub(L_spec, spec_inv_idx)); + frame_energy = 0; move32(); + FOR (i = spec_inv_idx; i < L_spec; i++) + { + tmp16 = extract_h(L_shl_sat(spec[i], sub(s, 4))); + frame_energy = L_mac0(frame_energy, tmp16, tmp16); /* exp = -(2*(s-16) - 8) */ + } + mean_energy16 = BASOP_Util_Divide3216_Scale(frame_energy, sub(L_spec, spec_inv_idx), &s2); /* exp = -(2*(s-16) - 8) + 16 - (15-s2) */ + + energThreshold = mult(ad_threshFac, mean_energy16); /* exp = -(2*(s-16) - 8) + 16 - (15-s2) + 5 */ + + s3 = add(sub(29, shl(sub(s, 16), 1)), s2); + IF (sub(energThreshold, 32767) < 0) + { + energThreshold = Sqrt16(energThreshold, &s3); + } + s3 = sub(s3, 15); + + mean_nrg = L_shl_sat(L_deposit_l(energThreshold), s3); /* exp = 0 */ + fac = mult(sub(cum_fading_slow_local, cum_fading_fast_local), energThreshold); + fac = L_shl_sat(L_deposit_l(fac), s3); /* exp = 0 */ + } + + FOR (i = spec_inv_idx; i < L_spec; i++) + { + if ( ( plc_fadeout_type != 0 ) || (L_sub(L_abs_sat(spec[i]), mean_nrg) < 0) ) + { + spec[i] = Mpy_32_16_lc3plus(spec[i], cum_fading_slow_local); + } + else + { + if (spec[i] > 0) + { + spec[i] = L_add_sat(Mpy_32_16_lc3plus(spec[i], cum_fading_fast_local), fac); + } + else if (spec[i] == 0) + { + spec[i] = Mpy_32_16_lc3plus(spec[i], cum_fading_fast_local); + } + else + { + spec[i] = L_sub_sat(Mpy_32_16_lc3plus(spec[i], cum_fading_fast_local), fac); + } + } + } + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + + diff --git a/lib_lc3plus/plc_lpc_scaling_fx.c b/lib_lc3plus/plc_lpc_scaling_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..945f583a16c087a99733eae1796482146626aed2 --- /dev/null +++ b/lib_lc3plus/plc_lpc_scaling_fx.c @@ -0,0 +1,38 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +void processPLCLpcScaling_fx(Word32 tdc_A_32[], Word16 tdc_A_16[], Word16 m) +{ + Counter i; + Word16 s; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processPLCLpcScaling_fx", sizeof(struct { + Counter i; + Word16 s; + })); +#endif + + s = getScaleFactor32(tdc_A_32, m); + FOR (i = 0; i < m; i++) + { + tdc_A_16[i] = round_fx_sat(L_shl_sat(tdc_A_32[i], s)); move16(); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + + diff --git a/lib_lc3plus/plc_main_fx.c b/lib_lc3plus/plc_main_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..9f12d15a02a189b0df30f7e7535e165064060279 --- /dev/null +++ b/lib_lc3plus/plc_main_fx.c @@ -0,0 +1,75 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +void processPLCmain_fx(Word16 plcMeth, Word16 *concealMethod, Word16 *nbLostFramesInRow, Word16 bfi, Word16 prev_bfi, + Word16 frame_length, Word16 la_zeroes, +#ifdef ENABLE_HR_MODE + const Word32 w[], +#else + const Word16 w[], +#endif + Word16 x_fx[], Word16 ola_mem[], + Word16 *ola_mem_exp, Word16 q_old_d_fx[], Word16 *q_old_fx_exp, Word32 q_d_fx[], + Word16 *q_fx_exp, Word16 yLen, Word16 fs_idx, const Word16 *band_offsets, Word16 bands_number, Word16 *damping, + Word16 old_pitch_int, Word16 old_pitch_fr, Word16 *ns_cum_alpha, Word16 *ns_seed, + AplcSetup *plcAd, LC3PLUS_FrameDuration frame_dms, Word8 *scratchBuffer, Word16 *pc_nbLostFramesInRow +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif + , Word32 rel_pitch_change + , Word16 *alpha_type_2_table +) +{ + IF(sub(bfi, 1) == 0 && plcAd) + { + /* FFLC increases the PFLC counter */ + *pc_nbLostFramesInRow = add(*pc_nbLostFramesInRow, 1); + } + + processPLCclassify_fx(plcMeth, concealMethod, nbLostFramesInRow, bfi, old_pitch_int, frame_length, frame_dms, + fs_idx, yLen, q_old_d_fx, band_offsets, bands_number, plcAd, scratchBuffer +#ifdef ENABLE_HR_MODE + , hrmode +#endif + ); + + processPLCapply_fx( + concealMethod, + *nbLostFramesInRow, bfi, prev_bfi, frame_length, la_zeroes, w, x_fx, ola_mem, + ola_mem_exp, q_old_d_fx, q_old_fx_exp, q_d_fx, q_fx_exp, yLen, fs_idx, damping, old_pitch_int, + old_pitch_fr, ns_cum_alpha, ns_seed, frame_dms, plcAd, scratchBuffer +#ifdef ENABLE_HR_MODE + , hrmode +#endif + , rel_pitch_change + , alpha_type_2_table + ); + + IF (bfi == 0) + { + processPLCupdateSpec_fx(q_old_d_fx, q_old_fx_exp, q_d_fx, q_fx_exp, yLen); + } + +#ifdef ENABLE_HR_MODE + IF (plcAd != NULL && (sub(plcAd->PhECU_frame_ms , 10) == 0) && (hrmode == 0)) +#else + IF (plcAd != NULL && (sub(plcAd->PhECU_frame_ms , 10) == 0)) +#endif + { + processPLCspec2shape_fx(prev_bfi, bfi, q_old_d_fx, yLen, plcAd->PhECU_oold_grp_shape_fx, plcAd->PhECU_old_grp_shape_fx); + } + +} + + diff --git a/lib_lc3plus/plc_noise_substitution_fx.c b/lib_lc3plus/plc_noise_substitution_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..5bf71258a425a2cf3bd191c8d5edbad3a107ce52 --- /dev/null +++ b/lib_lc3plus/plc_noise_substitution_fx.c @@ -0,0 +1,34 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +void processPLCNoiseSubstitution_fx(Word32 spec[], Word16 spec_prev[], Word16 L_spec) +{ + Dyn_Mem_Deluxe_In( + Counter i; + ); + + FOR (i = 0; i < L_spec; i++) + { + spec[i] = L_deposit_h(spec_prev[i]); + } + + /* High pass to prevent overflows */ + spec[0] = Mpy_32_16_lc3plus(spec[0], 6553 /* 0.2 Q15*/); move32(); + spec[1] = Mpy_32_16_lc3plus(spec[1], 16384 /* 0.5 Q15*/); move32(); + + Dyn_Mem_Deluxe_Out(); +} + + + diff --git a/lib_lc3plus/plc_phecu_f0_refine_first_fx.c b/lib_lc3plus/plc_phecu_f0_refine_first_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..4c4f26b00979c89bbed061ede33185ca006232ba --- /dev/null +++ b/lib_lc3plus/plc_phecu_f0_refine_first_fx.c @@ -0,0 +1,102 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +void plc_phEcu_F0_refine_first_fx(Word16 * plocs, /* i/o */ + const Word16 n_plocs_in, Word32 *L_f0est, /* i/o Q16 */ + const Word16 stPhECU_f0hzLtpBinQ7, const Word16 stPhECU_f0gainLtpQ15, + const Word16 nSubm) + +{ + Counter subm, i; + Word16 ploc, n_plocs_ana; + Word32 L_tmp = 0, L_diff, L_f0EstQ7, L_sensitivity_Q7; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("plc_phEcu_F0_refine_first_fx", sizeof(struct { + Counter subm, i; + Word16 ploc, n_plocs_ana; + Word32 L_tmp, L_diff, L_f0EstQ7, L_sensitivity_Q7; + })); +#endif + + + + /* single initial peak F0 correction using available LTP information */ + + IF (sub(stPhECU_f0gainLtpQ15, ((Word16)(0.25 * 32768.0))) > 0) + { + ploc = -1; move16(); /* sentinel */ + n_plocs_ana = s_min(n_plocs_in, 4); /* only analyze at first 3 deteteced LF peaks */ + + /* only apply analysis below nsubm*pitmax_freq ~= 1600Hz */ + i = sub(n_plocs_ana, 1); + WHILE (i >= 0 && sub(plocs[i], (Word16)(1600.0 / 62.5)) > 0) + { + i--; + } + n_plocs_ana = add(i, 1); + + IF ((n_plocs_ana > 0)) + { + /* % find/correct first peak in f0est , that is a submultiple of n*f0Ltp*/ + FOR (i = 0; i < n_plocs_ana; i++) + { + + L_sensitivity_Q7 = L_deposit_l(((Word32)1) << (7 - 1)); /* 0.5 in Q7 */ + if (sub(stPhECU_f0gainLtpQ15, ((Word16)(0.75 * 32768.0))) < 0) + { + L_sensitivity_Q7 = L_shr_pos(L_sensitivity_Q7, 1); /* % more picky if correlation is rather low */ + } + + L_f0EstQ7 = L_shr_pos(L_f0est[i], 9); /* Q16 to Q7 */ + + FOR (subm = 1; subm <= nSubm; subm++) + { + /*adjf0 = abs(f0est - subm*stPhECU_f0hzLtpBin*ones(size(f0est))) < sensitivity ; % L1 difference, + vector operation over f0 + ind = find(adjf0==1,1); */ + L_diff = L_msu0(L_f0EstQ7, subm, stPhECU_f0hzLtpBinQ7); + L_diff = L_abs(L_diff); + IF (L_sub(L_diff, L_sensitivity_Q7) < 0) + { + L_tmp = L_shl_pos(L_mult0(subm, stPhECU_f0hzLtpBinQ7), 16 - 7); /* to Q16 */ + ploc = i; move16(); + BREAK; + } + L_sensitivity_Q7 = Mpy_32_16_lc3plus(L_sensitivity_Q7, (Word16)(0.875 * 32768.0 )); /* 2 cycles */ + } /* subm*/ + + IF (ploc >= 0) + { + BREAK; + } + } /* i, n_ploc_ana*/ + } + + if (ploc >= 0) + { + L_f0est[ploc] = L_tmp; move32(); /* in Q16 */ + /*ideally also integer plocs should be updated , e.g. if f0est goes from 1.45(plocs=1) to 1.6(plocs==2) + */ + /* but that is costly and not required as long as corr_phase width is large enough ]*/ + } + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif + +} + + diff --git a/lib_lc3plus/plc_phecu_fec_hq_fx.c b/lib_lc3plus/plc_phecu_fec_hq_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..0d94b37183934c0f92c73a712bd8b27c8feafd2a --- /dev/null +++ b/lib_lc3plus/plc_phecu_fec_hq_fx.c @@ -0,0 +1,2987 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" +#include "math.h" /*dbg*/ + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define DELTA_CORR 5 /* Tuning parameter - defining range for phase correction around peak */ +#define DELTA_CORR_F0_INT 2 /* Tuning parameter - defining range for phase correction around peak */ + +#define MAX_INCREASE_GRPPOW_FX 0 /* max. amplification in case of transients (in dB scale) */ + +#define ONE_SIDED_SINE_WIDTH (4) /* expected pure sine main lobe maximum width (4+1+4) bins *62.5 hz/bin => approx 560 Hz total width */ +#define SIDE_LIM 12539859L /* 10^ (4.5/20.0) = 2^(a); --> x= 0.747433821 -> Lx_Q24 = round((1L<<(24))*0.747433821)) = 12539859 */ +#define LFHF_LIM 16719812L /* 10^ (6.0/20.0) = 2^(b); --> x= 0.996578428 -> Lx_Q24 = round((1L<<(24))*0.996578428)) = 16719812 */ + +#define CMPLMNT_PLOC_SENS_FX 2294 /* (1.0 - p_locator_sens) in Q15 */ +#define FEC_HQ_ECU_ROOT2 23170 /*(0x5a83) */ /* sqrt(2) in Q14 */ +#define FEC_TWOTHIRDS_Q15 21845 /* round(2^15*2/3) */ + +static void get_sin_cosQ10opt(Word16 phase, /* Q10 0..1023 i.e. 1024=2*pi */ + Word16 *ptrSin, /* Q15 */ + Word16 *ptrCos); /* Q15 */ + +static Word16 sqrt2ndOrder(const Word16); + +void my_wtda_fx(const Word16 *new_audio, /* i : input audio to be windowed Q0 20 ms , OPT can be output as well */ + const Word16 *const win2ms_init, /* i: 2 ms initial part of pre_tda window */ + const Word16 *const win16ms_center, /* i: 16 ms combined part of pre_tda IWHR+MDCT-ana */ + Word32 * L_wtda_audio, /* o : tda audio Q16 20 ms */ + const Word16 L, Word8 *scratchBuffer); + +static void windowing_L(const Word16 *, Word32 *, const Word16 *, const Word16, const Word16); +static void windowing_ola(const Word16 *, Word16 *, const Word16 *, const Word16); +static void ola_add(const Word16 *, const Word16 *, Word16 *, const Word16); +static void intlvW32_2_flippedW16(Word32 *L_x, const Word16 numPairs, const Word16 L_prot, Word16 *x); +static void flippedW16_2_intlvW32(Word16 *x, const Word16 numPairs, const Word16 Lprot, Word32 *L_x); +static Word16 imax_fx(const Word16 *, const Word16); + + +Word16 rand_phase_fx(const Word16 seed, Word16 *sin_F, Word16 *cos_F); + +static Word16 imax2_jacobsen_mag_fx(const Word16 *y_re, const Word16 *y_im, const Word16 special); +static void fft_spec2_sqrt_approx_fx(const Word16 x[], Word16 xMagSqrt[], const Word16 N); +static Word16 sqrtMagnApprox_fx(const Word16 re, const Word16 im); + +static Word16 plc_phEcu_nonpure_tone_ana_fx(const Word16* plocs, const Word16 n_plocs, const Word16* X, + const Word32 *L_Xavg, /* i : Frequency group amp averages for tonal tilt analysis pref. Max upshifted */ + const Word16 Lprot, const Word16 fs_idx); + +static void rotate_W16_fx(Word16 re_in, Word16 im_in, Word16 cosFactor, Word16 sinFactor, Word16 *re_out_ptr, + Word16 *im_out_ptr) +{ +#ifdef WMOPS + push_wmops("PhECU::rotate_W16_fx"); +#endif + *re_out_ptr = msu_r(L_mult(re_in, cosFactor), im_in, sinFactor); /* 2 ops no move when inlined */ + *im_out_ptr = mac_r(L_mult(re_in, sinFactor), im_in, cosFactor); /* 2 ops no move when inlined */ +#ifdef WMOPS + pop_wmops(); +#endif + return; +} + +static void valley_magnitude_adj_fx(Word16 *re_ptr, Word16 *im_ptr, Word16 uniFactor, Word16 cosFactor) +{ + Word16 scale_fx; +#ifdef WMOPS + push_wmops("PhECU::valley_magnitude_adj_fx"); +#endif + + /* y = 0.5*((2*rand(1,10000) + 1*cos(2*pi*x)) - 1 */ /* y will be in -1 to 1 range */ + /* y = 1*((1*rand(1,10000) + 0.5*cos(2*pi*x)) - 1 */ /* y will be in -1 to 1 range */ + + scale_fx /*Q15*/ = mac_r(L_mult(uniFactor, 16384), cosFactor, 16384); + /* make gain distribution more like N(0,1) than uniform */ + + scale_fx /*Q14*/ = round_fx(L_mac((Word32)(16384L << 16), scale_fx, 4096)); + /* create a random gain scaling value with mean 1.0 and max 1.25 and min 0.75 */ + ASSERT(scale_fx <= (16384 + 8192)); + ASSERT(scale_fx >= (-16384 - 8192)); + *re_ptr = mult_r(scale_fx, shl_sat(*re_ptr, 1)); /* no moves , should be inlined */ + *im_ptr = mult_r(scale_fx, shl_sat(*im_ptr, 1)); /* no moves , should be inlined */ + +#ifdef WMOPS + pop_wmops(); +#endif + return; +} + +/*------------------------------------------------------------------* + * rand_phase() + * + * randomized phase in form of sin and cos components + *------------------------------------------------------------------*/ +Word16 rand_phase_fx(const Word16 seed, Word16 *sin_F, Word16 *cos_F) +{ + /* 4x8+8 lookup scheme requiring ~40 Words of ROM freqRes 90/8 = 11.25 degrees */ + + /* x=(0:(5*8-1))*(2*pi)/32; y=sin(x);y_int=max(-32768,min(32767,round(y*32768))), y_int/32768 */ + + const Word16 *sincos_lowres_tab_cosQ15_fx = sincos_lowres_tab_sinQ15_fx + 8; + /* position at 90 degrees , ptr init */ + Word16 seed2; + Word16 seed2_shift; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("rand_phase_fx", sizeof(struct { + const Word16 *sincos_lowres_tab_cosQ15_fx; /* position at 90 degrees */ + Word16 seed2; /* 16 bit signed */ + Word16 seed2_shift; + })); +#endif + +#ifdef WMOPS + push_wmops("PhECU::rand_phase_fx"); +#endif + + seed2 = extract_l(L_mac0(13849, seed, 31821)); + seed2_shift = lshr(seed2, 11); + /* logical shift to get uniform random 5 msb bits; 0-31 , 0 degrees to 31*360/32= 348.75 */ + *sin_F = sincos_lowres_tab_sinQ15_fx[seed2_shift]; move16(); /* these moves can often be avoided by returning seed2shift and inlining */ + *cos_F = sincos_lowres_tab_cosQ15_fx[seed2_shift]; move16(); /* these moves can often be avoided by inlining */ +/* total WC 5 ops */ +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + return seed2; +} + +/*----------------------------------------------------------------------------- + * trans_burst_ana_fx() + * + * Transient analysis + *----------------------------------------------------------------------------*/ +void trans_burst_ana_fx( + const Word16 *xfp, /* i : Input signal (, only used if time_offset==0) now in up_scaled *Q_spec */ + Word16 * mag_chg, /* o : Magnitude modification vector Q15 */ + Word16 * ph_dith, /* o : Phase dither, 2*PI is not included (Q15, i.e., between 0.0 and 1.0) */ + Word16 * mag_chg_1st, /* i/o: per band magnitude modifier for transients Q15 */ + const Word16 output_frame, /* i : Frame length */ + const Word16 time_offs, /* i : Time offset (integral multiple of output_frame) */ + const Word16 est_stab_content, /* i : 0.0=dynamic ... 1.0=Stable (==st->env_stab ) */ + Word16 * alpha, /* o : Magnitude modification factors for fade to average */ + Word16 * beta, /* : Magnitude modification factors for fade to average */ + Word16 * beta_mute, /* i/o : Factor for long-term mute */ + Word16 * Xavg, /* o : Frequency group average gain to fade to in same Q as X_sav */ + Word16 Q_spec, Word32 L_oold_xfp_w_E_fx, Word16 oold_xfp_w_E_exp_fx, Word16 oold_Ltot_exp_fx, + Word16 *oold_grp_shape_fx, + + Word32 L_old_xfp_w_E_fx, Word16 old_xfp_w_E_exp_fx, Word16 old_Ltot_exp_fx, Word16 *old_grp_shape_fx, + Word16 fadeout, + Word32 * L_Xavg, /* full scale band amplitudes */ + Word8 *scratchBuffer /* Size = 4*4 * MAX_LTRANA + (2*4 + 1*2) * MAX_LGW + 8 */ +) +{ + Word16 att_val, attDegreeFrames; + Word32 * L_pGrPowLeft, *L_pGrPowRight; + Word32 * L_gr_pow_left, *L_gr_pow_right; + Word16 Lgw, i, k, burst_len; + Word16 man, expo; + Word16 att_always = 0; /* fixed attenuation per frequency group if set to 1 */ + Word16 oneOverFrame, roundEstMusContent, tmp16; + Word16 burst_att_thresh; + Word16 att_per_frame; + Word16 * tr_dec; + Word32 L_acc; + Word16 fs_scale; + Word16 scale_sh; + + Word32 L_oold_tmp, L_old_tmp; + Word16 oold_exp_fx, old_exp_fx; + Word16 margin_oold, margin_old; + Word16 fs_idx; + Word16 exp_diff; + Word16 Xavg_exp_fx, Xavg_mod_exp_fx; + Word16 tr_rise[MAX_LGW]; + Word16 tr_decay[MAX_LGW]; + Word16 man_in, expo_in, tmp; + Word32 L_tmp, L_tmp2; + Word16 thresh_tr_rise_lin_Q15; + Word16 thresh_tr_decay_lin_Q15; + Word16 beta_mute_thr; + Word16 fade_ms_ind; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("trans_burst_ana_fx", sizeof(struct { + + Word16 att_val, attDegreeFrames; + Word32 * pGrPowLeft_L, *pGrPowRight_L; + Word32 * L_gr_pow_left, *L_gr_pow_right; + Word16 Lprot; + Word16 Lgw, i, k, burst_len; + Word16 man, expo; + Word16 att_always; /* fixed attenuation per frequency group if set to 1 */ + Word16 oneOverFrame, roundEstMusContent, tmp16; + + Word16 burst_att_thresh; + Word16 att_per_frame; + + Word16 * tr_dec; + UWord16 lsb; + Word32 L_acc; + Word16 fs_scale; + Word16 scale_sh; + + Word32 L_oold_tmp; + Word32 L_old_tmp; + Word16 fs_idx; + Word16 shift32; + Word16 margin_old; + Word16 margin_oold; + + Word16 Xavg_exp_fx, Xavg_mod_exp_fx; + Word16 tr_rise[MAX_LGW]; + Word16 tr_decay[MAX_LGW]; + + Word16 man_in, expo_in, tmp; + Word32 L_tmp, L_tmp2; + Word16 thresh_tr_rise_lin_Q15; + Word16 thresh_tr_decay_lin_Q15; + + Word16 beta_mute_thr; + Word16 fade_ms_ind; + })); +#endif + + UNUSED(xfp); + UNUSED(oold_xfp_w_E_exp_fx); + UNUSED(old_xfp_w_E_exp_fx); + + if (time_offs == 0) + { +#ifdef WMOPS + push_wmops("PhECU::trans_burst_ana_fx(1st)"); +#endif + } + else + { +#ifdef WMOPS + push_wmops("PhECU::trans_burst_ana_fx(N)"); +#endif + } + + fs_idx = mult(output_frame, (Word16)(32768.0 / 99.0)); /* truncation needed , i.e no rounding can be applied here */ + ASSERT(fs_idx == (output_frame / 100)); + + L_gr_pow_left = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 4 * MAX_LGW */ /* Size = 4 * MAX_LGW */ + + L_gr_pow_right = (Word32 *)scratchAlign(L_gr_pow_left, sizeof(*L_gr_pow_left) * MAX_LGW); /* Size = 4 * MAX_LGW */ + + tr_dec = (Word16 *)scratchAlign(L_gr_pow_right, sizeof(*L_gr_pow_right) * MAX_LGW); /* Size = 2bytes * MAX_LGW */ + + oneOverFrame = oneOverFrameQ15Tab[fs_idx]; + Lgw = s_min(add(fs_idx, LGW8K), LGW48K); /* 4,5,6,7, (7/8) */ + + burst_len = add(mult_r(time_offs, oneOverFrame), 1); + + UNUSED(est_stab_content); + UNUSED(roundEstMusContent); + + move16(); + fade_ms_ind = (PLC2_FADEOUT_IN_MS - PLC2_FADEOUT_IN_MS_MIN) / PLC2_FADEOUT_RES; /* a shorter fading entry in fade_scheme_tab_fx */ + test(); + if (fadeout != 0) + { + fade_ms_ind = (PLC2_FADEOUT_LONG_IN_MS - PLC2_FADEOUT_IN_MS_MIN) / PLC2_FADEOUT_RES; move16(); + /* a long fading table entry in fade_scheme_tab */ + } + + move16(); move16(); move16(); + att_per_frame = fade_scheme_tab_fx[fade_ms_ind][0]; + burst_att_thresh = fade_scheme_tab_fx[fade_ms_ind][1]; /* number of 1.0 frames before muting phase */ + /* band gain muting can take place earlier due to a band transient */ + beta_mute_thr = fade_scheme_tab_fx[fade_ms_ind][2]; /* faster muting of added noise starts when slow main signal fadeout is over */ + +#ifdef PLC_FADEOUT_IN_MS + ASSERT(att_per_frame >= 1 && att_per_frame <= 12); /* table based lookup restriction */ +#else + ASSERT(att_per_frame == 1 || att_per_frame == 2); /* table based lookup restriction */ +#endif + + *ph_dith = 0; /* peak scrambling, not in use */ + + attDegreeFrames = 0; move16(); + IF(sub(burst_len, burst_att_thresh) > 0) + { + att_always = 1; move16(); + /* increase degree of attenuation */ + + /* N.B. To facilitate the subsequent 10^(-att_degree/20) implementation + * so as to use direct table-lookup, + * the first (burstLen - burst_att_thresh) are NOT multiplied by "att_per_frame". */ + attDegreeFrames = sub(burst_len, burst_att_thresh); /* multiplied by 1.0 , */ + /* Furthermore, in order to minimize the size of the lookup-table required to + * implement 10^(-att_degree/10), hard limit attDegreeFrames to (30% of 100)=30. + * If attDegreeFrames is greater than 30, it means there are more than 30 successive + * bad frames. */ + if (sub(attDegreeFrames, OFF_FRAMES_LIMIT) > 0) + {/* Hard limit the no. of frames, for table lookup */ + attDegreeFrames = OFF_FRAMES_LIMIT; move16(); + } + } + + plc_phEcu_initWord16(alpha, 32767, MAX_LGW); + basop_memset(beta, 0, (MAX_LGW) * sizeof(Word16)); + IF(sub(burst_len, 1) <= 0) + { + *beta_mute = BETA_MUTE_FAC_INI; move16(); + *beta_mute = shr_pos(*beta_mute , 1); /* perceptual decrease */ + } + + IF(sub(burst_len, 1) <= 0) + { + L_pGrPowLeft = &L_gr_pow_left[0]; /* ptr init*/ + L_pGrPowRight = &L_gr_pow_right[0]; /* ptr init*/ + + fs_scale = xfp_wE_MDCT2FFTQ11[fs_idx]; move16(); + scale_sh = 4; /* 15-11 */ move16(); + /* L_*old_xfp_w_E_fx, always upscaled to max from the calculating function */ + + + L_oold_tmp = Mpy_32_16_lc3plus(L_oold_xfp_w_E_fx, fs_scale); + L_old_tmp = Mpy_32_16_lc3plus(L_old_xfp_w_E_fx, fs_scale); + + oold_exp_fx = add(oold_Ltot_exp_fx, scale_sh); + old_exp_fx = add(old_Ltot_exp_fx, scale_sh); + + /*re-normalize L_mantissas and adjust exps */ + margin_oold = norm_l(L_oold_tmp); + L_oold_tmp = L_shl_pos(L_oold_tmp, margin_oold); + oold_exp_fx = sub(oold_exp_fx, margin_oold); + + margin_old = norm_l(L_old_tmp); + L_old_tmp = L_shl_pos(L_old_tmp, margin_old); + old_exp_fx = sub(old_exp_fx, margin_old); + + /* now time to analyze how the actual L_tot exponent scaling should be done */ + /* bring up the lowest exp to the same exp as the higher exp, and scale down the corresponding mantissa */ + exp_diff = sub(old_exp_fx, oold_exp_fx); /* energy increase from oold to old in log2 shifts */ + + /* Overflow2 fix */ + exp_diff = s_max(-31, exp_diff); + exp_diff = s_min(31, exp_diff); + if (exp_diff > 0) + { /* oold_exp < old_exp */ + /* old_exp is limiting, shift down oold mantissa */ + L_oold_tmp = L_shr_pos(L_oold_tmp, exp_diff); + } + if (exp_diff < 0) + { /* oold_exp > old_exp */ + /* oold_exp is limiting, shift down old mantissa */ + L_old_tmp = L_shr_pos(L_old_tmp, negate(exp_diff)); + } + oold_exp_fx = s_max(oold_exp_fx, old_exp_fx); + old_exp_fx = oold_exp_fx; move16(); + + /* safety set lowest energy to 2 , as one bit is shifted away in avg calculation */ + L_oold_tmp = L_max(L_oold_tmp, 2L); + L_old_tmp = L_max(L_old_tmp, 2L); + + FOR(k = 0; k < Lgw; k++) /* NB Lgw may be shorter than all defined bands , e.g at at 48k */ + { + L_gr_pow_left[k] = Mpy_32_16_lc3plus(L_oold_tmp, oold_grp_shape_fx[k]); move32(); + L_gr_pow_right[k] = Mpy_32_16_lc3plus(L_old_tmp, old_grp_shape_fx[k]); move32(); + + /*Xavg[k] = sqrt(0.5f*(gr_pow_left[k]+gr_pow_right[k])/(float)(gw[k+1]-gw[k]));*/ + Xavg_exp_fx = sub(old_exp_fx, 1); /* virtual pre divide X_avg by 2 too keep precision in summation */ + L_acc = L_add(L_shr_pos(L_gr_pow_left[k], 1), L_shr_pos(L_gr_pow_right[k], 1)); + L_acc = L_shr_pos(L_acc, gw_len_inv_shift_fx[k]); /* divide by (bandwidth/2) in bins */ + + { /* new Xavg_fx calculation */ + L_acc = L_max(L_acc, 1L); + tmp = norm_l(L_acc); + Xavg_exp_fx = sub(Xavg_exp_fx, tmp); + L_acc = L_shl_pos(L_acc, tmp); /* now between 0.5 an 1.0*/ + + expo_in = add(Xavg_exp_fx, 0); + man_in = round_fx_sat(L_acc); + + /* now allow both positive and negative expos into sqrt */ + man = sqrt2ndOrder(man_in); + if (s_and(expo_in, 1) != 0) + { + man = mult_r(man, FEC_HQ_ECU_ROOT2); /* odd exp operation */ /* 1/sqrt(2) */ + } + expo = shr_r(expo_in, 1); /* apply even part of exp , square root operation. shr_r needed for positive side exps */ + + + + L_acc = L_deposit_h(man); + Xavg_exp_fx = add(expo, 0); + /*Note: sqrt approximaton may overshoot e.g- sqrt(1.0) may become 1.0001 i.e. saturation is needed when eventually applying expo */ + + + /* Xavg (unscaled flt in L_acc*2^(exp-31)) needs to be saved in the same scale + Q as the stored 16bit + * Xsav_fx, for use in subst_spec() */ + /* move Xavg fft scale to fx domain fx-fft scale*/ + L_acc = Mpy_32_16_lc3plus(L_acc, PhEcu_Xsav_Flt2FxScaleQ15[fs_idx]); /* fs fixed fractional change */ + Xavg_mod_exp_fx = sub(Xavg_exp_fx, PhEcu_Xsav_Flt2FxDnShift[fs_idx]); /* fs fixed exp change*/ + Xavg_mod_exp_fx = add(Xavg_mod_exp_fx, Q_spec); /* signal adaptive exp change*/ + + /* :: move to Q_spec domain of Xsav , Q fixed in first BFI frames */ + + /* extract Q0 value shift so that the mantissa is in the high part with man*2,^(0-15) */ + exp_diff = sub(15, Xavg_mod_exp_fx); + + + exp_diff = s_min(31, exp_diff); /* limit to meaningfull DSP shifts as described by up to 6 bits */ + exp_diff = s_max(-32, exp_diff); + if (exp_diff > 0) + { + L_acc = L_shr_pos(L_acc, exp_diff); /* may underflow */ + } + + if (exp_diff < 0) + { + L_acc = L_shr_sat(L_acc, exp_diff); + } + L_Xavg[k] = L_acc; /* export full 31 bit scale band amplitude */ + Xavg[k] = round_fx_sat(L_acc); /* extract high part */ + + } /*end of new Xavg_fx calculation */ + /* internal transition detection */ + + { /* pure percentage based transient detection */ + thresh_tr_rise_lin_Q15 = PhEcu_frac_thr_rise_lin_Q15[k]; + thresh_tr_decay_lin_Q15 = PhEcu_frac_thr_decay_lin_Q15[k]; + + /* analyse rise */ + /* one of L_left or L_right should be pre-upshifted to a near max mantissa, (in one band ) */ + L_tmp2 = L_deposit_h(0); + L_tmp = Mpy_32_16_lc3plus(*L_pGrPowRight, thresh_tr_rise_lin_Q15); + if (L_sub(*L_pGrPowLeft, L_tmp) <= 0) + { + L_tmp2 = L_deposit_l(1); + } + + if (*L_pGrPowLeft == 0) /* denominator zero special cases */ + { + /* rise: Right/Left ; " * / 0 " --> tr_rise=1 ; "0/0" --> tr_rise = 0 */ + L_tmp2 = L_min(*L_pGrPowRight, 1L); + } + tr_rise[k] = extract_l(L_tmp2); move16(); + + /* analyse decay */ + L_tmp2 = L_deposit_h(0); + L_tmp = Mpy_32_16_lc3plus(*L_pGrPowLeft, thresh_tr_decay_lin_Q15); + if (L_sub(L_tmp, *L_pGrPowRight) >= 0) + { + L_tmp2 = L_deposit_l(1); + } + if (*L_pGrPowRight == 0) /* right side no energy , special cases */ + { + /* decay: Right/Left ; " 0 / * " --> tr_decay=0 ; "0/0" --> tr_decay = 0 */ + L_tmp2 = L_deposit_h(0); + } + tr_decay[k] = extract_l(L_tmp2); move16(); + + tr_dec[k] = s_max(tr_rise[k], tr_decay[k]); move16(); + + } /* percentage tr_dec */ + /* magnitude modification, calculated for decay only */ + IF(add(tr_dec[k], att_always) != 0) + { + +#if MAX_INCREASE_GRPPOW_FX != 0 +#error trans_burst_ana_fx-- The following implementation is incorrect +#endif + att_val = 32767; move16(); + IF(L_sub(*L_pGrPowRight, 0) > 0) + { + IF(L_sub(*L_pGrPowRight, *L_pGrPowLeft) < 0) /* decay , i.e., (gr_pow_right/gr_pow_left) < 1.0 */ + { + /* Compute sqrt(grp_pow_chg), where grp_pow_chg = gr_pow_right/gr_pow_left. */ + tmp16 = plc_phEcu_ratio_fx(*L_pGrPowRight, *L_pGrPowLeft, &expo); /* output tmp16 in Q14 */ + + expo = sub(expo, (15 - 14)); /* Now, tmp16 is considered in Q15 */ + i = norm_s(tmp16); + man = shl_pos(tmp16, i); /* Mandatory normalization before sqrtNthOrder(). */ + expo = add(expo, i); + man = sqrt2ndOrder(man); + if (s_and(expo, 1) != 0) /* Check even or odd. */ + { + man = mult_r(man, FEC_HQ_ECU_ROOT2); + } + expo = shr_pos(expo, 1); /* Divided by 2-- square root operation. */ + att_val = shr(man, expo); /* Denormalize the mantissa back to Q15. */ + } + /* ELSE + { + do nothing because (gr_pow_right/gr_pow_left) >= 1.0 + } + */ + } + + mag_chg_1st[k] = att_val; move16(); + mag_chg[k] = att_val; move16(); + } + ELSE + { + mag_chg_1st[k] = 32767; move16(); + mag_chg[k] = 32767; move16(); /* Set to ]1.0 in Q15 */ + } + + L_pGrPowLeft++; + L_pGrPowRight++; + } /* FOR band k */ + } + ELSE /* sub(burst_len, 1) <= 0) */ + { + /* BURST path */ + + /* Since attDegreeFrames is discrete (integer) and hard limited to OFF_FRAMES_LIMIT, + * it is easier to implement 10^(-att_degree/20.0) by a simply direct + * table-lookup. Also, att_per_frame is discrete as well and can be + * either ATT_PER_FRAME-1 or ATT_PER_FRAME and nothing else. This + * means only 2 tables of size=(OFF_FRAMES_LIMIT+1) each are required. + * To take square root into account, it is divided by 20 instead of 10. */ + + if (sub(burst_len, beta_mute_thr) > 0) /* beta_mute_thr coincides/close to stronger 6dB muting phase */ + { + *beta_mute = shr_pos_pos(*beta_mute, 1); + } + + FOR(k = 0; k < Lgw; k++) /* Lgw may be shorter than all bands at 48k */ + { + /* global burst attenuation */ + #if PLC2_FADEOUT_IN_MS != 0 + /* att_per_frame idx = "1:12") */ + att_val = POW_ATT_TABLES[att_per_frame][s_min(OFF_FRAMES_LIMIT, attDegreeFrames)]; move16(); +#else + /* att_per_frame idx = "1:2") */ + att_val = POW_ATT_TABLES[att_per_frame][s_min(OFF_FRAMES_LIMIT, attDegreeFrames)]; move16(); + /* 10^(-attDegreeFrames*(att_per_frame = "1 or 2")/20) */ +#endif + + mag_chg[k] = mult_r(mag_chg_1st[k], att_val); /* Q15 */ + + alpha[k] = mag_chg[k]; move16(); + ASSERT(beta[k] == 0); /* initialization required */ + IF(sub(alpha[k], 32766) < 0) + { + /* beta_pre[k] = sqrt(1.0f - SQR(alpha[k])); */ + /* beta[k] = beta_pre[k]* *beta_mute;*/ + /* (1.0-alpha.^2), in exp 1 due to L_mult0; */ + + L_acc = L_sub((INT_MAX >> 1) + 1, L_mult0(alpha[k], alpha[k])); + { + + /* use lower complex(WMOPS/ROM) 2nd-order sqrt approximation */ + Word32 L_man, L_acc2 = L_acc; + Word16 tmp, expo_in, expo2, man_in, man; + /* updated code using the 2nd order approximation routine */ + /* form is flt=(L_acc2*2.^(-31 + 1) */ + + tmp = norm_l(L_acc2); /* tmp is always 1 or higher due to Lmac0 downshift */ + man_in = round_fx_sat(L_shl_pos(L_acc2, tmp)); + expo_in = sub(1, tmp); /* 1 due to original 1 bit margin gain in L_mult0 */ + + /* both positive and negative expos into sqrt */ + man = sqrt2ndOrder(man_in); + if (s_and(expo_in, 1) != 0) + { + man = mult_r(man, FEC_HQ_ECU_ROOT2); /* odd exp operation */ /* sqrt(2)/2 */ + } + + expo2 = shr_r(expo_in, 1); /* apply square root operation. shr_r needed for pos and neg exps */ + ASSERT(expo2 <= 1); + + L_man = L_deposit_h(man); + L_man = L_shl_sat(L_man, expo2); /* move to a zero exp , _sat needed for 1.0 input (due to approximation overshoot) */ + + man = round_fx_sat(L_man); /* better perf with round here */ + + + beta[k] = mult_r(*beta_mute, man); move16(); + } + + /* bw Lowpass shape additive component */ + /* tab[LGW48K + 1] = { 1.0, ....1.0, 0.5,0.5, ... 0.1, 0.1 } */ + + IF(sub(k, LGW32K - 1) >= 0) + { + beta[k] = mult_r(beta[k], 3277); /* 0.1 in Q15 */ + } + ELSE IF(sub(k, LGW16K - 1) >= 0) + { + beta[k] = mult_r(beta[k], 16384); /* 0.5 in Q15 */ + } + + /* + % limit Xavg noise contribution further in case of offset/tr_decay + % attenuation was already active + + if (burst_len <= burst_att_thresh) && ( stPhECU_mag_chg_1st(k) < (32766/32768) ) + XavgFadeinFactor = (burst_len-1)/burst_att_thresh; + XavgFadeinFactor = min(1.0, XavgFadeinFactor); + beta(k) = beta(k)*XavgFadeinFactor; + % limit initial Xavg noise contribution until We have reached regular burst attenuation + end + end + */ + IF( sub(mag_chg_1st[k], 32767) <0 ) + { /* offset muting was started before burst muting phase */ + /* Xavg noise gradually increased during a short period */ + Word16 XavgFadeinFactor = 32767; + Word16 ratio2_3_4_5tab[4][5 - 1] = { + {(Word16)(.5 * 32768.0), (Word16)(1.0 * 32767.0), (Word16)(1.0 * 32767.0), (Word16)(1.0 * 32767.0)}, /* 1/2*/ + {(Word16)(.333 * 32768.0), (Word16)(.666 * 32768.0), (Word16)(1.0 * 32767.0), (Word16)(1.0 * 32767.0)}, /* 1/3*/ + {(Word16)(.25 * 32768.0), (Word16)(.5 * 32768.0), (Word16)(.75 * 32768.0), (Word16)(1.0 * 32767.0)}, /* 1/4 */ + {(Word16)(.2 * 32768.0), (Word16)(.4 * 32768.0), (Word16)(.6 * 32768.0), (Word16)(.8 * 32768.0)} /* 1/5 */ + + }; + ASSERT(burst_att_thresh >= 1 && burst_att_thresh <= 5); + ASSERT(burst_len >= 2); + if (sub(burst_len,burst_att_thresh) <= 0) + { + ASSERT(burst_len - 2 < (5-1)); + ASSERT(burst_att_thresh-1-1 < (4)); + XavgFadeinFactor = ratio2_3_4_5tab[burst_att_thresh-1-1][burst_len - 2]; /* second bfi frame burst_len= is 2 */ + } + beta[k] = mult_r(beta[k], XavgFadeinFactor); /* n Q15 */ + } + } /* IF (sub(alpha[k], 32766) < 0) */ + } /* FOR k*/ + + } /* BURST */ + + + + IF(sub(output_frame, L_FRAME48K) == 0) + { /* for 48kHz set/handle scalings of last group/band the same way as previous lower freq band(s) */ + + FOR(k = Lgw; k < MAX_LGW; k++) + { + tr_dec[k] = tr_dec[k - 1]; move16(); /* only available in first bfi frame */ + Xavg[k] = Xavg[k - 1]; move16(); + mag_chg_1st[k] = mag_chg_1st[k - 1]; move16(); + mag_chg[k] = mag_chg[k - 1]; move16(); + alpha[k] = alpha[k - 1]; move16(); + beta[k] = beta[k - 1]; move16(); + } + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif +} + +/*----------------------------------------------------------------------------- + * imax_fx() + * + * Get interpolated maximum position + *-----------------------------------------------------------------------------*/ +static Word16 imax_fx( /* o: The location, relative to the middle of the 3 given data point, of the maximum. (Q15) */ + const Word16 *y, /* i: The 3 given data points. */ + const Word16 special /* i: -1 = left edge special case, 0 = normal, +1 = right edge special case */ +) +{ + Word16 posi; + Word16 man, expo, edge; + const Word16 *pY; + Word32 L_y1, L_y2, L_y3, L_numer, L_denom, L_sign, L_acc, L_y3_y1; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("imax_fx", sizeof(struct { + Word16 posi; + Word16 man, expo, edge; + const Word16 *pY; + Word32 L_y1, L_y2, L_y3, L_numer, L_denom, L_sign, L_acc, L_y3_y1; + })); +#endif + +#ifdef WMOPS + push_wmops("PhECU::imax_fx"); +#endif + + /* Seek the extremum of the parabola P(x) defined by 3 consecutive points + so that P([-1 0 1]) = [y1 y2 y3] */ + pY = y; + L_y1 = L_deposit_l(*pY++), L_y2 = L_deposit_l(*pY++), L_y3 = L_deposit_l(*pY); + + /* The extremum value: + * y2i = -0.125f * SQR(y3_y1) / (y1+y3-2*y2)+y2 + * is not computed. Alternatively, the derivative of the parabola evaluated at y=0, + * dP/dy|y=0, is used to determine whether the extremum is maximum or not. + */ + + /* Compute the extremum location: posi = (y3 - y1)/(4*y2 - 2*y1 - 2*y3). */ + L_y3_y1 = L_sub(L_y3, L_y1); + L_acc = L_shl_pos(L_y2, 1); /* N.B. y2 is multiplied by 2 not 4. */ + L_acc = L_sub(L_acc, L_y1); /* N.B. Y1 is not multiplied by 2. */ + L_denom = L_sub(L_acc, L_y3); /* N.B. Y3 is not multiplied by 2. */ + L_sign = L_xor(L_y3_y1, L_denom); /* Preserve the sign since div_s() only takes positive arguments. */ + L_numer = L_abs(L_y3_y1); + L_denom = L_abs(L_denom); + + test(); + IF(L_numer == 0 || L_denom == 0) + { + posi = 0; move16(); /* flat top , exit with center freq. */ + } + ELSE + { + + IF(L_sub(L_denom, L_shr_pos_pos(L_numer, 1)) > 0) + { + /* Although the output of ratio() is in Q14, adding the missing factor of 2 (See above) + * in the denominator, the output is now considered to be in Q15. */ + man = plc_phEcu_ratio_fx(L_numer, L_denom, &expo); /* The mantissa is considered in Q15 */ + + posi = shr_sat(man, expo); /* in Q15 (Due to saturation, it is automatically bound inside [-1.0,1.0].) */ + } + ELSE + { + posi = 0x7fff; move16(); + } + + if (L_sign < 0) /* Restore the sign. */ + { + posi = negate(posi); + } + + /* For both edges (left and right), the extremum found above may be minimum. + * It needs to reject the minimum. */ + IF(special != 0) /* Either edge special case. */ + { + edge = 0x7fff; /* 1 in Q15 for the right edge special case */ move16(); + if (special < 0) + { + edge = 0; /* Left edge special case */ move16(); + } + + /* The derivative (slope) of the interpolating parabola = 2*A*y + B, + * where A = (y3 + y1)/2 - y2 + * and B = (y3 - y1)/2. + * Therefore, the slope at y=0 is simply B. Use this slope to determine + * if the parabola is concave upward or downward. + */ + IF(posi > 0) /* The extremum is in between the middle and the right given data points. */ + { + posi = sub(0x7fff, posi); /* maximum case */ + if (L_sub(L_y3, L_y1) <= 0) /* Check the slope at y=0, i.e., at the middle given data point. */ + { + posi = edge; /* minimum case */ move16(); + } + } + ELSE /* The extremum is in between the left and the middle given data points. */ + { + posi = add(0x7fff, posi); /* maximum case */ + if (L_sub(L_y3, L_y1) >= 0) + { + posi = edge; /* minimum case */ move16(); + } + } + } + } +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + return posi; + /* Q15. The position either left or right relative to the index of the middle of the 3 given data points. */ +} + + /*----------------------------------------------------------------------------- + * spec_ana_fx() + * + * Spectral analysis + *-----------------------------------------------------------------------------*/ + /* OPT add the FB transient input flags , and skip peakfinder if fullband transient is set */ + void spec_ana_fx(Word16 * xfp, /* i/o : Input 16ms pre-upscaled time signal, output xfp utility buffer */ + Word16 * plocs, /* o : The indicies of the identified peaks Q0 */ + Word32 * L_plocsi, /* o : Interpolated positions of the identified peaks Q16 */ + Word16 * num_plocs, /* o : Number of identified peaks Q0 */ + Word16 * X_sav, /* o : Stored fft spectrum */ + const Word16 output_frame, /* i : Frame length Q0 */ + const Word16 bwidth_fx, /* i : Encoded Fs index Q0 */ + const Word16 *sp_ana_win, /* i : spectral analysis window Q15 */ + const Word16 f0hzLtpBinQ7, /* i : LTP bin frequency in normalized Hz Q7 */ + const Word16 norm_corrQ15_fx, /* i : correlation for lag at f0hzLtpBinQ7 */ + Word16 maxLprot, Word16 maxPlocs, + Word8 *scratchBuffer /* Size = 4 * (MAX_LPROT + MAX_LPROT_RED + 1) + 2 * MAX_PLOCS */ + ) + { + Counter n, k; + Word16 nJacob, Lprot, hamm_len2 = 0, Lprot2, Lprot2p1; + Word32 *L_xfp; + + Word16 *pXfp; + Word16 *pPlocs; + Word16 Xmax, Xmin, sens; + Word16 rectLength, fraction; + Word32 *pPlocsi_L; + Word32 L_acc; + Word16 peak_range_1; + Word16 stop_band_start; + Word16 stop_band_length; + Word16 fft_scale; + Word8 * buffer_fft; + Word16 currPlocs, endPlocs; + Word16 P_in_plocs; + Word16 n_real_interp_tail; + +#ifdef WMOPS + push_wmops("PhECU::spec_ana_fx(1st)"); +#endif +#ifdef DYNMEM_COUNT + Dyn_Mem_In("spec_ana_fx", sizeof(struct { + Counter n, k; + Word16 nJacob ,Lprot, hamm_len2, Lprot2, Lprot2p1; + Word32 *L_xfp; + Word32 *pXfp_L; + Word16 *y_re_ptr, *y_im_ptr; /* otrs to Xsav as xfp was overwritten */ + Word16 *pXfp, *pXfp1, *pPlocs; + Word16 Xmax, Xmin, sel; + Word16 rectLength, fraction, special; + Word32 *pPlocsi_L; + Word32 L_acc; + Word16 peak_range_1; + Word16 stop_band_start; + Word16 stop_band_length; + Word16 fft_scale; + Word8 * buffer_fft; + Word16 fft_scale_by4; + Word16 currPlocs, endPlocs; + Word16 P_in_plocs; + Word16 n_real_interp_tail; + })); +#endif + /* Initialize for 48k to avoid warnings + Lprot - length of saved prototype samples + hamm_len2 - half Hamming window length + pFftTbl - Table for real input FFT + LprotLog2Minus1 - FFT stages for complex input FFT + */ + + + L_xfp = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 4 * MAX_LPROT bytes */ + buffer_fft = scratchAlign(L_xfp, sizeof(*L_xfp) * maxLprot); /* Size = 4 * (MAX_LPROT_RED + 1) + 2 * MAX_PLOCS */ + + ASSERT(bwidth_fx >= 0 && bwidth_fx <= 4); /* avoid bwidth_fx variable warning */ + + Lprot = LprotSzPtr[bwidth_fx]; + move16(); + hamm_len2 = i_mult(3, mult(output_frame, (Word16)(3277) /* divBy10 + floor */)); /* 3 ms */ + fft_scale = PhEcuFftScale[bwidth_fx]; + move16(); /* 32,16,8 kHz all have fft scale 0, 24 has 8, 48 has 4 */ + Lprot2 = shr_pos(Lprot, 1); + Lprot2p1 = add(Lprot2, 1); /* Magnitude lengths */ + rectLength = sub(Lprot, shl_pos(hamm_len2, 1)); + /* The length of the rectangular portion of the Hamming-Rectangular window. */ + { +#ifdef WMOPS + push_wmops("PhECU::WhrAnaWin+fft"); +#endif + + /* Apply hamming-rect window */ + windowing_L(xfp, L_xfp, sp_ana_win, rectLength, hamm_len2); + BASOP_rfftN(L_xfp, Lprot, &fft_scale, buffer_fft); + } +#ifdef WMOPS + pop_wmops(); /* anawin+fft */ +#endif + + /* Convert 32 Bit intlv FFT into phecu 16 bit flipped fft format */ + /* can not yet be an inplace operation */ + + intlvW32_2_flippedW16(L_xfp, sub(Lprot2, 1), Lprot, xfp); + + /* Apply zeroing of non-coded FFT spectrum above 20 kHz */ + IF(sub(output_frame, ((L_FRAME48K) * 40) / 48) >= 0) /* only relevant for 48kHz in LC3plus */ + { + stop_band_start = ((LPROT48K / 2) * 40) / 48; /* initial start position in real part , 320 */ + stop_band_length = ((LPROT48K * 8) / 48) - 1; /* real tail and into Im parts , 128-1 */ + stop_band_start = add(stop_band_start, 1); /* exclude DC ... */ + + basop_memset(xfp + stop_band_start, 0, (stop_band_length) * sizeof(Word16)); + } + + peak_range_1 = s_min(Lprot2p1, MAX_LPROT_RED / 2 + 1); /* limit preliminary only active for 48k to save WMOPS */ + + basop_memmove(X_sav, xfp, (Lprot) * sizeof(Word16)); + + /* Magnitude representation */ + fft_spec2_sqrt_approx_fx(xfp, xfp, Lprot); + /* inplace, i.e. [ Dc, real part of xfp ,Fs/2 ] will be replaced by magnitude(scaled by .5) */ + + /* Find global maximum and minimum. */ + plc_phEcu_maxval_fx(xfp, peak_range_1, &Xmax); + plc_phEcu_minval_fx(xfp, peak_range_1, &Xmin); + sens = mult_r(sub(Xmax, Xmin), CMPLMNT_PLOC_SENS_FX); + + + plc_phEcu_peak_locator_fx(xfp, peak_range_1, plocs, num_plocs, sens, Xmax, Xmin, MAX_LPROT_RED, buffer_fft); + + +#ifdef WMOPS + push_wmops("PhECU::Peaks_refine"); +#endif + + /* Refine peaks */ + pPlocsi_L = L_plocsi; + pPlocs = plocs; + /* n = sub(*num_plocs, 1); */ /* -1 so as to exclude the very last peak. */ + n = *num_plocs; /* number of peaks to process */ + /* Special case-- The very 1st peak if it is at 0 index position (DC) */ + /* With DELTA_CORR_F0_INT == 2 one needs to handle both *pPlocs==0 and *pPlocs==1 */ + logic16(); + IF((n > 0) && (sub(*pPlocs, 0) == 0)) /* Very 1st peak position possible to have a peak at 0/DC index position. */ + { + fraction = imax_fx(xfp, -1); /* -1 signifies special left edge case. */ + L_acc = L_deposit_h(*pPlocs++); /* N.B., (*pPlocs) must be zero here. */ + *pPlocsi_L++ = L_mac(L_acc, fraction, 1); move32(); /* in Q16 */ + n = sub(n, 1); /* This special case is taken care of -- one less peak to go */ + } + logic16(); + IF((n > 0) && (sub(*pPlocs, 1) == 0)) /* Also 2nd peak position uses DC which makes jacobsen unsuitable. */ + { + fraction = imax_fx(xfp, 0); /* for parabolic this is not a special case. */ + L_acc = L_deposit_h(*pPlocs++); /* N.B., (*pPlocs) must be 1 here. */ + *pPlocsi_L++ = L_mac(L_acc, fraction, 1); move32(); /* in Q16 */ + n = sub(n, 1); /* This special case is taken care of -- one less peak to go */ + } + + /* All remaining peaks except the very last two possible integer positions */ + currPlocs = *pPlocs++; move16(); + endPlocs = sub(Lprot2p1, DELTA_CORR_F0_INT); /* last *pPlocs position for Jacobsen */ + + /* precompute number of turns based on endpoint integer location and make into a proper FOR loop */ + IF(n > 0) + { + nJacob = n; move16(); + + /* catch all three xxx01 , xxx10 and xxx11 , + and not only xxx01, xxx10 */ + + n_real_interp_tail = 0; move16(); + if (sub(endPlocs, plocs[sub(*num_plocs, 1)]) <= 0) + { + n_real_interp_tail = add(n_real_interp_tail, 1); + } + + logic16(); + if (sub(n,1) > 0 && sub(endPlocs, plocs[sub(*num_plocs, 2)]) <= 0) + { + n_real_interp_tail = add(n_real_interp_tail, 1); + } + + nJacob = sub(nJacob, n_real_interp_tail); + + FOR (k = 0; k < nJacob; k++) + { + fraction = imax2_jacobsen_mag_fx(&(X_sav[currPlocs - 1]), &(X_sav[Lprot - 1 - currPlocs]), 0); /* in Q15 */ /* not endpoint */ + move16(); move16(); /* account for inloop indirect ptrs into Xsav */ + + L_acc = L_deposit_h(currPlocs); + *pPlocsi_L++ = L_mac(L_acc, fraction, 1); move32(); /* in Q16. Append the fractional part to the integral part. */ + currPlocs = *pPlocs++; move16(); + } + n = sub(n, nJacob); + } + + /* At this point there should at most two plocs left to process */ + /* the position before fs/2 and fs/2 both use the same magnitude points */ + + IF(n > 0) + { + /* [ . . . . . . . ] Lprot/2+1 positions */ + /* | | | */ + /* 0 (Lprot/2-2) (Lprot/2) */ + + pXfp = xfp + sub(Lprot2, 2); + IF(sub(currPlocs, sub(Lprot2p1, DELTA_CORR_F0_INT)) == 0) + /* Also 2nd last peak position uses fs/2 which makes jacobsen less suitable. */ + { + fraction = imax_fx(pXfp, 0); /* for parabolic this is not a special case. */ + + L_acc = L_deposit_h(currPlocs); /* N.B., (*pPlocs) must be 1 here. */ + *pPlocsi_L++ = L_mac(L_acc, fraction, 1); move32(); /* in Q16 */ + currPlocs = *pPlocs++; move16(); + n = sub(n, 1); /* This special case is taken care of -- one less peak to go */ + + if (n > 0) + { + /* allow for an additional consecutive final plocs after (Fs/2-1) at Fs/2 */ + currPlocs = *pPlocs++; move16(); + } + } + + /* Here the only remaining point would be a fs/2 plocs */ + /* pXfp = xfp + sub(Lprot2,1); already set just a reminder where it whould point */ + IF(n > 0) /* fs/2 which makes special case . */ + { + fraction = imax_fx(pXfp, 1); /* for parabolic this is a special case. */ + + L_acc = L_deposit_h(currPlocs); /* N.B., (*pPlocs) must be 1 here. */ + *pPlocsi_L++ = L_mac(L_acc, fraction, 1); move32(); /* in Q16 */ + currPlocs = *pPlocs++; move16(); + n = sub(n, 1); /* This special case is taken care of -- one less peak to go */ + } + } + + /* here n should be 0 if all peaks have been processed */ + ASSERT(n == 0); + + /* Check number of plocs within an assumed pitch range */ + P_in_plocs = 0; move16(); + FOR(n = 0; n < *num_plocs; n++) + { + /* count number of peaks in locations 1,2,3,4,5,6 , ~= 60 Hz ... 380 Hz */ + fraction = s_min(1, plocs[n]); /* 0 stays zero , otherwise 1 */ + if (sub(plocs[n], 7) < 0) + { + P_in_plocs = add(P_in_plocs, fraction); + } + } + +#ifdef WMOPS + pop_wmops(); /* peaks refine */ +#endif + + logic16(); + IF(f0hzLtpBinQ7 > 0 && P_in_plocs > 0) + { + Word16 n_plocs_in, n_plocs_out; + + n_plocs_in = *num_plocs; move16(); + + /* NB LF peak analysis may add adjacent peaks in { plocs, L_plocsi}, (output from peakfinder did not have + * adjacent peaks ) */ + plc_phEcu_LF_peak_analysis_fx(plocs /* i/o */, num_plocs /* i/o */, L_plocsi /* i/o */, xfp, f0hzLtpBinQ7, + norm_corrQ15_fx, 2, maxPlocs, buffer_fft); + n_plocs_out = *num_plocs; move16(); + + IF(sub(n_plocs_in, n_plocs_out) == 0) + { + /* adjust first peak coinciding with LTPF0 measures if it indicates so */ + plc_phEcu_F0_refine_first_fx(plocs /* i/o */, *num_plocs, L_plocsi /* i/o */, f0hzLtpBinQ7, norm_corrQ15_fx, + 3); + } + } + /* moved inside spec_ana_fx , to include validated pitch peak P_in_plocs*/ + { + Word16 peak_limits_fx[5] = { 14 /*NB*/, 14 /*WB*/, 14 /*sWB*/, 14 /*SWB*/, + 14 /* FB */ }; /* to be trained for each BW */ + + test(); + test(); + IF((sub(norm_corrQ15_fx, 0) > 0) && /* == 0 indicates a negative correlation, which could be likely stable */ + (sub((Word16)(0.5 * 32768), norm_corrQ15_fx) > 0) && (sub(*num_plocs, peak_limits_fx[bwidth_fx]) > 0)) + { + if (P_in_plocs > 0) + { + *num_plocs = 0; move16(); /*activate noise only path only if normcorr vas valid energywise */ + } + } + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + } + + /*-------------------------------------------------------------------* + * subst_spec_fx() + * + * Substitution spectrum calculation + *-------------------------------------------------------------------*/ + + void subst_spec_fx( + const Word16 *plocs, /* i : The indices of the identified peaks Q0 */ + const Word32 *L_plocsi, /* i : Interpolated positions of the identified peaks Q16 */ + Word16 * num_plocs, /* i/o : Number of identified peaks Q0 */ + const Word16 time_offs, /* i : Time offset Q0 */ + Word16 * X, /* i/o : FFT spectrum */ + const Word16 *mag_chg, /* i : Magnitude modification Q15 */ + const Word16 ph_dith, /* i : Phase dither, 2*PI is not included. (Q15, i.e., between 0.0 and 1.0) */ + const Word16 *is_trans, /* i : (Transient) noise generation flags (either 0 or not 1 ) */ + const Word16 output_frame, /* i : Frame length Q0 */ + Word16 * seed, /* i/o : Random seed */ + const Word16 *alpha, /* i : Magnitude modification factors for fade to average Q15 */ + const Word16 *beta, /* i : Magnitude modification factors for fade to average Q15 */ + const Word16 *Xavg, /* i : Frequency group averages to fade to Q0 */ + const Word16 t_adv /* i : time adjustement excluding time_offs Q0 */ + ,const Word16 fadeout, /* need for DC muting */ + Word16 * nonpure_tone_flag_ptr, /* i/o : non-pure single tone indicator state */ + const Word32 * L_Xavg /* i : Frequency group amp averages for tonal tilt analysis Max upshifted */ + ) + { + Word16 Xph_short; + Word32 L_corr_phase[MAX_PLOCS], L_Xph; + Word32 *pCorrPhase_L; + Word16 cos_F, sin_F, tmp; + Word16 peak_sin_F = 0, peak_cos_F = 0; + Word16 sin_F_fade2avg, cos_F_fade2avg; + Word16 fs_idx; + Word16 Lprot, m, i, e, im_ind, delta_corr_up, delta_corr_dn, delta_tmp; + UWord16 lsb; + Word16 j, re, im, *pReX, *pImX, lastPeak, lprotBy2Minus1, segmentLen; + Word16 pkLocation_1, pkLocation, pkLocation1; + const Word16 *pPlocs; + const Word32 *pPlocsi_L; + Word32 L_acc; + Word16 Lprot_inv; + Word16 k; + Word16 tmp2; + Word16 alpha_local; + Word32 tmp_L; + Word16 mag_chg_local; + const Word16 *gwlpr_fxPlus1; + Word16 one_peak_flag_mask; + Word16 noise_mag_scale_neg; + Word16 up_shift_adj; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("subst_spec_fx", sizeof(struct { + Word16 Xph_short; + Word32 L_corr_phase[MAX_PLOCS], L_Xph; + Word32 *pCorrPhase_L; + Word16 cos_F, sin_F, tmp; + Word16 peak_sin_F, peak_cos_F; + Word16 sin_F_fade2avg, cos_F_fade2avg; + Word16 fs_idx; + Word16 Lprot, m, i, e, im_ind, delta_corr_up, delta_corr_dn, delta_tmp; + UWord16 lsb; + Word16 j, re, im, *pReX, *pImX, lastPeak, lprotBy2Minus1, segmentLen; + Word16 pkLocation_1, pkLocation, pkLocation1; + const Word16 *pPlocs; + const Word32 *pPlocsi_L; + Word32 L_acc; + Word16 Lprot_inv; + Word16 k; + Word16 tmp2; + Word16 alpha_local; + Word16 expo; + Word32 tmp_L; + Word16 mag_chg_local; + const Word16 *gwlpr_fxPlus1; + Word16 one_peak_flag_mask; + Word16 noise_mag_scale_neg; + Word16 up_shift_adj; + })); +#endif + + if (time_offs == 0) + { +#ifdef WMOPS + push_wmops("PhECU::subst_spec_fx(1st)"); +#endif + } + else + { +#ifdef WMOPS + push_wmops("PhECU::subst_spec_fx(N)"); +#endif + } + + + gwlpr_fxPlus1 = &(gwlpr_fx[1]); /* ptr init */ + fs_idx = mult(output_frame, (Word16)(32768.0 / 99.0)); /* truncation needed , i.e no rounding can be applied here */ + ASSERT(fs_idx == (output_frame / 100)); + Lprot = LprotSzPtr[fs_idx];move16(); + Lprot_inv = InvLprot_Q22[fs_idx]; move16(); + + tmp2 = add(mult_r(time_offs, oneOverFrameQ15Tab[fs_idx]), 1);/* save a local burst_len for securing DC and fs/2 muting */ + + /* Correction/evolution phase of the identified peaks */ + IF(s_or(is_trans[0], is_trans[1]) != 0) + { + *num_plocs = 0; move16(); + } + ELSE + { + + tmp = t_adv; + + tmp = add_sat(tmp, time_offs); + /* NB tmp can be stored in Word16 Q0 as max used value is 684+(OFF FRAMELIMIT==60)*480 = 29484 */ + tmp_L = L_mult0(tmp, Lprot_inv); + + + tmp = norm_l(tmp_L); + up_shift_adj = s_max(0, sub(4, tmp)); /* 48kHz : PLC frame 1..49 -> tmp_L<<4 , frame 50..60 -> tmpL<<3 */ + tmp_L = L_shl_sat(tmp_L, sub(4, up_shift_adj)); + tmp = round_fx_sat( tmp_L); + + + pPlocsi_L = L_plocsi; + pCorrPhase_L = L_corr_phase; + FOR(m = 0; m < *num_plocs; m++) + { + + /* tmp has variable resolution 10 or 9 bits */ + ASSERT( up_shift_adj >= 0); + Mpy_32_16_ss(L_shl_pos(*pPlocsi_L++, up_shift_adj), tmp, &L_acc, &lsb); + L_acc = L_add(L_shl_pos(L_acc, 5), lshr(lsb, 11)); + /* 5 lsb's actually unused though, as 6 bits are shifted out */ + *pCorrPhase_L++ = L_acc; move32();/* in Q16. 2*PI is not included. */ + } + } + + one_peak_flag_mask = (Word16)0xFFFF; move16(); /* all ones mask -> keep */ + test(); logic16(); + IF((*num_plocs > 0) && sub(*num_plocs, 3) < 0) + { + one_peak_flag_mask = 0x0000; move16(); /* all zeroes mask -> zeroes in valleys, single clean tone assumed */ + + /* revert initial pure tone decision in some cases */ + logic16(); logic16(); + IF((sub(*nonpure_tone_flag_ptr, 0) < 0) && + ((sub(fs_idx, 2) == 0)/* SemiSWB 24 kHz */ || (sub(fs_idx, 4) >= 0)) /* FB 48 kHz */ + ) + { + /* in the first lost frame analyze spectra and spectral bands to possibly reverse an initial pure sine assumption */ + *nonpure_tone_flag_ptr = plc_phEcu_nonpure_tone_ana_fx(plocs, *num_plocs, X, L_Xavg, Lprot, fs_idx); + +#ifdef LOCAL_PLC2_TON_ANA_DEACTIVATE + *nonpure_tone_flag_ptr = 0; /* dbg of inactive tone analysis */ +#endif + } + + + if (sub(*nonpure_tone_flag_ptr, 0) > 0) + { + /* actually revert single pure tone detection */ /* 0-> mute all surrounding valley bins in evolution , 0xff -> generate noise in all valleys */ + one_peak_flag_mask = (Word16)0xFFFF; move16(); /* all ones mask -> keep */ + } + } + + noise_mag_scale_neg = 0; move16(); /* no change of valley noise magnitude */ + logic16(); + if ((*num_plocs == 0) || (time_offs != 0)) + { /* only adj_scale noise amplitude when we have no WC path , or in all noise frame */ + noise_mag_scale_neg = -32768; move16(); /* all ones --> scale_noise */ + } + + IF(*num_plocs == 0) + { + X[0] = 0; move16(); /* reset DC if there are no peaks */ + X[shr_pos(Lprot, 1)] = 0; move16(); /* also reset fs/2 if there are no peaks */ + } + + /* the binary selection of fadeout scheme */ + tmp = (PLC2_FADEOUT_IN_MS - PLC2_FADEOUT_IN_MS_MIN) / PLC2_FADEOUT_RES; move16(); + if (fadeout != 0) + { + tmp = (PLC2_FADEOUT_LONG_IN_MS - PLC2_FADEOUT_IN_MS_MIN) / PLC2_FADEOUT_RES; move16(); + } + + IF(sub(tmp2, add(fade_scheme_tab_fx[tmp][1],1) ) > 0) + { + /* also start DC scaling attenuation */ + X[0] = mult(alpha[0], X[0]); move16(); + /* start fs/by2 attenuation */ + X[shr_pos(Lprot, 1)] = mult(alpha[s_min(add(fs_idx, LGW8K), LGW48K)], X[shr_pos(Lprot, 1)]); move16(); + } + + + lprotBy2Minus1 = sub(shr_pos(Lprot, 1), 1); + + /* for 48k the last (63+1+63) 128/2-1 values above 20 kHz are always zeroes */ + { /* after a last, peak no need to evolve above 20kHz , those coeffs have been/ will be zeroed already */ + /* DC, Xused,ReZeroed, fs/2, ImZeroed, ImUsed */ + /*N: 1, 320 , 63 , 1 , 63 , 320 */ + /*Cind: 0, 1-320, 321-383 , 384 , 385-447, 448 -767 */ + lprotBy2Minus1 = s_min( lprotBy2Minus1, 320); + /*only process up to bin X[320] , 63 coeffs X[321] fwd should already be zeroed */ + } + + i = 1; move16(); /* index in the X[DC, ReX part of X_Sav ,i.e *pReX == X[i] */ + k = 0; move16(); + + pReX = X + i; + im_ind = (Lprot - 1); /* ptr init */ + pImX = X + im_ind; + pPlocs = plocs; + pCorrPhase_L = L_corr_phase; + + + pkLocation_1 = -4; move16(); /* dummy value to avoid Out of Array Read */ + pkLocation = -3; move16(); /* dummy value to avoid Out of Array Read for the *num_plocs==0 case */ + pkLocation1 = -2; move16(); /* dummy value to avoid Out of Array Read */ + + IF (*num_plocs != 0) + { + + pkLocation = *pPlocs; move16(); /* N.B. No post-increment */ + lastPeak = sub(*num_plocs, 1); + if (lastPeak >= 0) + { + pkLocation1 = *pPlocs++; move16(); /* get a next peak */ + } + } + + FOR(m = 0; m < *num_plocs; m++) + { + pkLocation_1 = pkLocation; /* plocs[m - 1] */ move16(); + pkLocation = pkLocation1; /* plocs[m] */move16(); + + /*location dependent update of plocs[m + 1] */ + if ( sub(lastPeak, m) > 0) + { /* only read additional peak when teher is a valid position to read */ + pkLocation1 = *pPlocs++; /* plocs[m + 1] */ move16(); + } + + delta_tmp = shr_pos(sub(sub(pkLocation, pkLocation_1), 1), 1); + if (m == 0) + { + delta_tmp = DELTA_CORR; move16(); /* first peak special case */ + } + delta_corr_dn = s_min(delta_tmp, DELTA_CORR); + + delta_tmp = shr_pos(sub(sub(pkLocation1, pkLocation), 1), 1); + if (sub(m, lastPeak) >= 0) + { + delta_tmp = DELTA_CORR; move16(); + } + delta_corr_up = s_min(delta_tmp, DELTA_CORR); /* last peak special case */ + + + /* Input Xph */ + segmentLen = sub(sub(pkLocation, delta_corr_dn), i); /* may be negative */ + + ASSERT(pReX == &(X[i])); + ASSERT(*pReX == X[i]); /*before first, nth valley*/ + + FOR(j = 0; j < segmentLen; j++) /* valley section , may be skipped for segmentlen < 0 */ + { + + *seed = rand_phase_fx(*seed, &sin_F, &cos_F); + + /* phase scrambling */ + rotate_W16_fx(*pReX, *pImX, cos_F, sin_F, &tmp, &im); /* tmp=real part, should be inlined */ + UNUSED(re); + + /* i.e. add a bit of magnitude scrambling around 1.0 in longer bursts */ + *seed = rand_phase_fx(*seed, &sin_F_fade2avg, &cos_F_fade2avg); + IF(noise_mag_scale_neg != 0) + { + valley_magnitude_adj_fx(&tmp, &im, *seed, cos_F); + /* use two random variables */ /*reuse cosF from regular X scrambling, + reuse *seed from fade2avg + */ + } + + IF( beta[k] != 0 ) + { + alpha_local = alpha[k]; /* no move as alpha_local is only needed for debug */ + /* the fade2avg mixing branch, fade2avg and transient downscaling and evolution rotation */ + tmp2 = mult_r(beta[k], Xavg[k]); + + { + tmp2 = s_and(tmp2, one_peak_flag_mask); + tmp = s_and(tmp, one_peak_flag_mask); + im = s_and(im, one_peak_flag_mask); + } + + *pReX++ = mac_r(L_mult(alpha_local, tmp), tmp2, cos_F_fade2avg); move16(); + *pImX-- = mac_r(L_mult(alpha_local, im), tmp2, sin_F_fade2avg); move16(); + } + ELSE + { /* the no fade2avg mixing branch, only transient downscaling and evolution rotation */ + { + tmp = s_and(tmp, one_peak_flag_mask); + im = s_and(im, one_peak_flag_mask); + } + + + *pReX++ = mult_r(mag_chg[k], tmp); move16(); + *pImX-- = mult_r(mag_chg[k], im); move16(); + } + i = add(i, 1); + ASSERT(pReX == &(X[i])); /* nth Valley */ + ASSERT(*pReX == X[i]); /* nth Valley */ + if (sub(i, gwlpr_fxPlus1[k]) >= 0) + { + k = add(k, 1); + } + } /* segment_len 1st++ etc valley excluding last */ + + /* peak area section */ + + e = s_min(lprotBy2Minus1, add(pkLocation, delta_corr_up)); + segmentLen = sub(e, sub(i, 1)); + + + L_Xph = *pCorrPhase_L; move32(); + /* rounding here, add "0.5" before extracting the 10 bits for table lookup */ + Xph_short = s_and(extract_l(L_shr_pos_pos(L_add(L_Xph, (1L << (16 - 10 - 1))), 16 - 10)), 0x3ff); + /* 10 bits precision after radix point, for a virtual 0-1023 sin/cos table lookup */ + + + get_sin_cosQ10opt(Xph_short, &peak_sin_F, &peak_cos_F); + + + ASSERT(pReX == &(X[i])); /*before peak*/ + FOR(j = 0; j < segmentLen; j++) + { + mag_chg_local = mag_chg[k]; /* mag_chg_local actually only need for debugging , no move16()*/ + + UNUSED(ph_dith); + *seed = extract_l(L_mac0(13849, *seed, 31821)); + rotate_W16_fx(*pReX, *pImX, peak_cos_F, peak_sin_F, &tmp, &im); /* should be inlined */ + UNUSED(re); + + *seed = rand_phase_fx(*seed, &sin_F, &cos_F); + + IF( beta[k] != 0 ) + { /* fade2avg path alpha*X_sav + beta *Xavg */ + alpha_local = mag_chg_local; /* no move alpha_local only needed for dbg */ + tmp2 = mult_r(beta[k], Xavg[k]); + + + *pReX++ = mac_r(L_mult(alpha_local, tmp), tmp2, cos_F); move16(); + *pImX-- = mac_r(L_mult(alpha_local, im), tmp2, sin_F); move16(); + } + ELSE + { + *pReX++ = mult_r(mag_chg_local, tmp); move16(); + *pImX-- = mult_r(mag_chg_local, im); move16(); + } + + i = add(i, 1); + ASSERT(pReX == &(X[i])); + ASSERT(*pReX == X[i]); + if (sub(i, gwlpr_fxPlus1[k]) > 0) + { + k = add(k, 1); + } + } /* segment_length Peak*/ + pCorrPhase_L++; + } + + segmentLen = sub(lprotBy2Minus1, sub(i, 1)); /* tail/valley noise-bins */ + + /* for 48k the last 63+1+63 = values above 20 kHz */ + { /* after last, peak no need to scramble above 20kHz , those coeffs have been/ will be zeroed already */ + /* DC, Xused,ReZeroed, fs/2, ImZeroed, ImUsed */ + /*N: 1, 320 , 63 , 1 , 63 , 320 */ + /*ind: 0, 1-320, 321-383 ,384 , 385-447, 448 -767 */ + /* segmentLen = sub(320, i-1); */ /*only process up to bin X[320] , 63 coeffs X[321] fwd should already be + zeroed */ + /* ASSERT(i-1+ segmentLen == lprotBy2Minus1 ); */ + } + + ASSERT(*pReX == X[i]); /* before a final valley*/ + FOR(j = 0; j < segmentLen; j++) + { + + + *seed = rand_phase_fx(*seed, &sin_F, &cos_F); + rotate_W16_fx(*pReX, *pImX, cos_F, sin_F, &tmp, &im); /* should be inlined , tmp=real part */ + + *seed = rand_phase_fx(*seed, &sin_F_fade2avg, &cos_F_fade2avg); + /* i.e. add a bit of magnitude scrambling around 1.0 in longer bursts */ + IF(noise_mag_scale_neg != 0) + { + valley_magnitude_adj_fx(&tmp, &im, *seed, cos_F); + /*reuse cosF from regular X scrambling, + reuse *seed from fade2avg */ + } + + tmp = s_and(tmp, one_peak_flag_mask); + im = s_and(im, one_peak_flag_mask); + IF(beta[k] != 0) + { /* fade2avg path never in first BFI frame */ + + alpha_local = alpha[k]; /* no move as alpha_local is only needed for debug */ + tmp2 = mult_r(beta[k], Xavg[k]); + { + tmp2 = s_and(tmp2, one_peak_flag_mask); + } + + + *pReX++ = mac_r(L_mult(alpha_local, tmp), tmp2, cos_F_fade2avg); move16(); + *pImX-- = mac_r(L_mult(alpha_local, im), tmp2, sin_F_fade2avg); move16(); + } + ELSE + { + + *pReX++ = mult_r(mag_chg[k], tmp); move16(); + *pImX-- = mult_r(mag_chg[k], im); move16(); + } + i = add(i, 1); + ASSERT(*pReX == X[i]); + if (sub(i, gwlpr_fxPlus1[k]) > 0) + { + k = add(k, 1); + } + } /* segment_len last valley */ + + + + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + } + + void my_wtda_fx(const Word16 *new_audio, /* i : input audio to be windowed Q0 20 ms , OPT can be output as well */ + const Word16 *const win2ms_init, /* i: 2 ms initial part of pre_tda window */ + const Word16 *const win16ms_center, /* i: 16 ms combined part of pre_tda IWHR+MDCT-ana */ + Word32 *L_wtda_audio, /* o : tda audio Q16 20 ms */ + const Word16 L, Word8 *scratchBuffer) /* Size = 8 * MAX_L_FRAME */ + { + Word16 i, L2; /*,L4;*/ + const Word16 *pX; + const Word16 *pW; + Word32 *p1_L, *p2_L, *p3_L, *p4_L; + Word32 *L_w_audio; /*OPt 1 use input buffer , OPT2, may be shortened from 20 ms to 16 ms due to + zeroed parts*/ + Word32 *pY_L, *pa1_L, *pa2_L; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("my_wtda_fx", sizeof(struct { + Word16 i, L2; /*,L4;*/ + const Word16 *pX; + const Word16 *pW; + Word32 *p1_L, *p2_L, *p3_L, *p4_L; + Word32 *L_w_audio; /*OPT 1 use input buffer, OPT2, may be shortened from 20 ms to 16.25+(1.75) ms + due to zeroed parts*/ + Word32 *pY_L, *pa1_L, *pa2_L; + })); +#endif + +#ifdef WMOPS + push_wmops("PhECU::my_wtda_fx"); +#endif + + L_w_audio = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 4 * 2 * MAX_L_FRAME */ + + /* |111111|222222|333333|444444 */ + /* |p1 p2| p3||p4 */ + + /* Apply analysis window */ + + pX = new_audio; + pY_L = L_w_audio; + + pW = win2ms_init; + FOR(i = 0; i < ((2 * L / 10)); i++) /* Loop over 2ms window MDCT-ana length */ + { + *pY_L++ = L_mult(*pX++, *pW++); move32(); + } + + pW = win16ms_center; + /* 20 ms - 2ms - 3.75 ms = 14.25 ms */ + FOR(i = 0; i < (2 * L - (2 * L / 10) - ((3 * 2 * L) / 16)); + i++) /* Loop over remaining 14.25ms, currently out of a 16 ms stored length */ + { + *pY_L++ = L_mult(*pX++, *pW++); move32(); + } + + + /* tda */ + L2 = shr_pos_pos(L, 1); /* length of tda blocks */ + + p1_L = L_w_audio; /* block 1 fwd */ + p2_L = L_w_audio + L - 1; /* block 2 rev */ + p3_L = L_w_audio + L + L2 - 1; /* block 3 rev */ + p4_L = L_w_audio + L + L2; /* block 4 fwd */ + + pa1_L = L_wtda_audio; /* first part output */ + pa2_L = L_wtda_audio + L2; /* second part output */ + + FOR(i = 0; i < (L / 8); i++) + { + /* first 1.25ms part of tda signal -p3_rev -p4_fwd */ + *pa1_L++ = L_negate(L_add_sat(*p3_L--, *p4_L++)); move32(); + } + FOR(; i < L2; i++) + { + /* first front part 3.75 ms p4_l is zeroes -p3_rev + (-p4_fwd==0) */ + *pa1_L++ = L_negate(*p3_L--); move32(); + } + + FOR(i = 0; i < L2; i++) + { + /* second part of tda signal p1 -p2_rev */ + *pa2_L++ = L_sub_sat(*p1_L++, *p2_L--); move32(); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + return; + } + + /*-------------------------------------------------------------------------- + * rec_wtda() + * + * Windowing and TDA of reconstructed frame + *--------------------------------------------------------------------------*/ + + + static void + rec_wtda_fx( + Word16 *X, /* i : iFFT(X-evolved) TD-signal o: dbg 16 ms */ + Word32 *L_ecu_rec, /* o : Reconstructed frame in tda domain Qx? */ + const Word16 output_frame, /* i : Frame length */ + const Word16 Lprot, /* i : Prototype frame length */ + const Word16 *const win2ms_init, /* i: 2 ms initial part of pre_tda window */ + const Word16 *const win16ms_center, /* i: 16 ms combined part of pre_tda IWHR+MDCT-ana */ + const Word16 maxLen, + const Word16 *prevsynth, + const Word16 Q_psMinus1, /*i: Q prev_synth minus 1 , (-1 to match Q of Xsav in first bfi frame ) */ + Word8 *scratchBuffer) /* Size = 12 * MAX_L_FRAME */ + { + Word16 l, Lprot2; + Word16 *rec_buf; + Word16 *xsubst_; /*,*out_ptr;*/ + + Word16 ola_old[COPY_LEN_48K + OLA_LEN_48K]; /* 3.75 ms */ + Word16 work_len; + Word16 copy_len; + Word16 ola_len; + + + Word8 *buffer_wtda; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("rec_wtda_fx", sizeof(struct { + Word16 l, Lprot2; + Word16 *rec_buf; + Word16 *xsubst_; /*,*out_ptr;*/ + Word8 *buffer_wtda; + })); +#endif + +#ifdef WMOPS + push_wmops("PhECU::rec_wtda_fx"); +#endif + + rec_buf = scratchAlign(scratchBuffer, 0); /* Size = 2 * 2 * MAX_L_FRAME */ + buffer_wtda = (Word8 *)scratchAlign(rec_buf, sizeof(*rec_buf) * (2 * maxLen)); /* Size = 4 * 2 * MAX_L_FRAME */ + + xsubst_ = rec_buf; + Lprot2 = shr_pos_pos(Lprot, 1); + + /* extract reconstructed frame with ld window into rec_buf */ + l = sub(output_frame, Lprot2); + basop_memmove(xsubst_ + l, X, (Lprot) * sizeof(Word16)); /* 16 ms IFFT raw output */ + copy_len = COPY_LEN[FRAME2FS_IDX(output_frame)]; + ola_len = OLA_LEN[FRAME2FS_IDX(output_frame)]; + work_len = add(copy_len, ola_len); + /* Copy and scale copy part 2ms from prevsynth */ + basop_memmove(rec_buf, &prevsynth[Lprot - work_len], (copy_len) * sizeof(Word16)); /* 2ms out of 3.75 ms copied */ + Scale_sig_sat(rec_buf, copy_len, sub(-3, Q_psMinus1)); /* inplace scaling by 2^(-Q_ps-4) */ + + + /* Copy, window and scale 1.75 ms ola part from prevsynth , into a temporary buffer ola_old */ + + + windowing_ola(&prevsynth[Lprot - ola_len], ola_old, w_old[FRAME2FS_IDX(output_frame)], ola_len); /* 1.75 ms */ + + Scale_sig_sat(ola_old, ola_len, sub(-3, Q_psMinus1)); /* inplace scaling by 2^(-Qps-4) */ + + /* Window 1.75 ms length inplace recreated X=IFFT(prototype) signal copied into rec_buf signal */ + windowing_ola(&rec_buf[copy_len], &rec_buf[copy_len], w_new[FRAME2FS_IDX(output_frame)], ola_len); + /* mix add the two windowed components */ + ola_add(&rec_buf[copy_len], ola_old, &rec_buf[copy_len], ola_len); /* OPT: sat check */ + + my_wtda_fx(rec_buf, + win2ms_init, /* i: 2 ms initial part of pre_tda window */ + win16ms_center, /* i: 16 ms combined part of pre_tda IWHR+MDCT-ana */ + L_ecu_rec, output_frame, buffer_wtda); /* */ + + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + + return; + } + + /*-------------------------------------------------------------------------- + * rec_frame_fx() + * + * Frame reconstruction + *--------------------------------------------------------------------------*/ + void rec_frame_fx(Word16 * x, /* i : FFT spectrum 16 ms, o: ifft() TD debug signal 16ms */ + Word32 * L_ecu_rec, /* o : Reconstructed frame in tda domain 10ms buffer */ + const Word16 output_frame, /* i : Frame length */ + const Word16 Q, /* i : Xsav Q */ + const Word16 *const win2ms_init, /* i: 2 ms initial part of pre_tda window */ + const Word16 *const win16ms_center, /* i: 16 ms combined part of pre_tda IWHR+MDCT-ana */ + Word16 maxLprot, + const Word16 *prevsynth, + const Word16 Q_prevsynthMinus1, /* i : prevsynthQ-1 or xfp Q */ + Word8 *scratchBuffer /* Size = 4 * MAX_LPROT + 12 * MAX_L_FRAME */ + ) + { + Counter i; + Word16 Lprot; + Word32 *L_x; + Word32 *pX_L; + Word16 *pX; + Word16 fft_scale; + Word8 * buffer_fft; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("rec_frame_fx", sizeof(struct { + Counter i; + Word16 Lprot; + Word32 *L_x; + Word32 *pX_L; + Word16 *pX; + Word16 fft_scale; + Word8 * buffer_fft; + })); +#endif + +#ifdef WMOPS + push_wmops("PhECU::rec_frame_fx"); +#endif + + L_x = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 4 * MAX_LPROT */ + buffer_fft = (Word8 *)scratchAlign(L_x, sizeof(*L_x) * maxLprot); /* Size = 4* (2+1) * MAX_L_FRAME */ + + /* Initialize to FB constants */ + Lprot = mult(output_frame, (Word16)(32768.0 / 99.0)); /* truncation needed , i.e no rounding can be applied here */ + ASSERT(Lprot == (output_frame / 100)); + Lprot = LprotSzPtr[Lprot]; move16(); + + + /* Convert stored 16 bit into 32bit for fft */ + flippedW16_2_intlvW32(x, sub(shr_pos_pos(Lprot, 1), 1), Lprot, L_x); + /*scratch x now free for re-use */ + + fft_scale = -1; move16(); + +#ifdef WMOPS + push_wmops("PhECU::IFFT_fx"); +#endif + BASOP_irfftN(L_x, Lprot, &fft_scale, buffer_fft); +#ifdef WMOPS + pop_wmops(); +#endif + + pX_L = &L_x[0]; + pX = &x[0]; /* scratch x reused */ + + { + FOR(i = 0; i < Lprot; i++) + { + *pX++ = extract_h(L_shl_sat(*pX_L++, fft_scale)); move16(); + } + } + /* Scratch L_x may be released */ + + + /* Saturation possible when rescaling to Q0 if there are random bit errors in the bit stream + * One may use one guard bit to better handle this - though it should not be needed for normal + * operation. + */ + Scale_sig_sat(x, Lprot, negate(Q)); /* scale by 2^(-Q) */ + + /*scratch x is Lprot word16 */ + /* scatch need for win-TDA XXX */ + /* scrcatch need for TDA XXX */ + + rec_wtda_fx(x, L_ecu_rec, output_frame, Lprot, + win2ms_init, /* i: 2 ms initial part of pre_tda window */ + win16ms_center, /* i: 16 ms combined part of pre_tda IWHR+MDCT-ana */ + s_max(output_frame, 160), + prevsynth, + Q_prevsynthMinus1, /* NB: prevsynth Q may change from prev_bfi=0 to prev_bfi==1, due to phase + of signal or PLC2-muting */ + buffer_fft); + + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + return; + } + + /*-------------------------------------------------------------------------- + * hq_phase_ecu_fx() + * + * Main routine for HQ phase ECU + *--------------------------------------------------------------------------*/ + void hq_phase_ecu_fx( + const Word16 *prevsynth, /* i : buffer of previously synthesized signal currently 16ms */ + Word32 * L_ecu_rec, /* o : reconstructed frame in tda domain , also tmp w32_fft buffer */ + Word16 * time_offs, /* i/o: Sample offset for consecutive frame losses*/ + Word16 * X_sav, /* i/o: Stored spectrum of prototype frame */ + Word16 * Q_spec, /* o: Q value of stored spectrum */ + Word16 * num_p, /* i/o: Number of identified peaks */ + Word16 * plocs, /* i/o: Peak locations */ + Word32 * L_plocsi, /* i/o: Interpolated peak locations Q16 */ + const Word16 env_stab, /* i : Envelope stability parameter */ + const Word16 f0hzLtpBinQ7, /* i: LTP bin frequency in normalized Hz Q7 */ + const Word16 norm_corrQ15_fx, /*i : correlation for lag at f0hzLtpBinQ7 */ + const Word16 prev_bfi, /* i : indicating burst frame error */ + Word16 old_is_transient[2], /* i/o : flags indicating noise generation frames */ + Word16 * mag_chg_1st, /* i/o: per band magnitude modifier for transients*/ + Word16 * mag_chg_gr, /* o: per band magnitude modifier, incl burst attenuation */ + Word16 * Xavg, /* i/o: Frequency group average gain to fade to */ + Word16 * beta_mute, /* o : Factor for long-term mute */ + const Word16 bwidth_fx, /* i : Encoded bandwidth */ + const Word16 output_frame, /* i : frame length */ + Word16 * seed_out_fxPtr, /* o: utput dbg NULL may be used*/ + Word16 * X_out, /* o: utput dbg NUll may be used */ + const Word16 t_adv, /* i : time adjustment including time_offs */ + const Word16 *const win2ms_init, /* i: 2 ms initial part of pre_tda window */ + const Word16 *const win16ms_center, /* i: 16 ms combined part of pre_tda IWHR+MDCT-ana */ + const Word16 *sp_ana_win, /* i : whr 3+10+3 window */ + Word16 q_fx_old_exp, /* i : exp of prev_synth */ + + Word16 maxLprot, /* i : maz spectrum buffer size */ + Word16 maxPlocs, /* i : max nb of peaks */ + Word32 L_oold_xfp_w_E_fx, Word16 oold_xfp_w_E_exp_fx, /* exp of time signale */ + Word16 oold_Ltot_exp_fx, /*true exp of energy */ + Word16 *oold_grp_shape_fx, Word32 L_old_xfp_w_E_fx, Word16 old_xfp_w_E_exp_fx, /* exp of time signale */ + Word16 old_Ltot_exp_fx, /*true exp of energy */ + Word16 *old_grp_shape_fx, + Word16 margin_prevsynth, + const Word16 fadeout, + Word16 *nonpure_tone_flag_ptr, /* i/o : non-pure single tone indicator state */ + Word8 *scratchBuffer /* Size = 2 * MAX_LGW + 8 * MAX_LPROT + 12 * MAX_L_FRAME */ + ) + { + Word16 lprot; + Word16 *mag_chg, ph_dith, *X; + Word16 *xfp; + Word16 seed; + Word16 alpha[MAX_LGW], beta[MAX_LGW] ; + Word16 prevsynth_man_upshift; + Word16 Q_prevsynthMinus1; + Word8 *buffer; + Word32 L_Xavg[MAX_LGW]; /* i/o : Frequency group amp averages for tonal tilt analysis Max upshifted */ +#ifdef DYNMEM_COUNT + Dyn_Mem_In("hq_phase_ecu_fx", sizeof(struct { + Counter i; + Word16 lprot; + Word16 *mag_chg, ph_dith, *X; + Word16 seed; + Word16 alpha[MAX_LGW], beta[MAX_LGW]; + Word16 prevsynth_man_upshift; + Word16 Q_prevsynthMinus1; + Word8 *buffer; + })); +#endif + + if (!prev_bfi) + { +#ifdef WMOPS + push_wmops("PhECU::hq_phase_ecu_fx(1st)"); +#endif + } + else + { +#ifdef WMOPS + push_wmops("PhECU::hq_phase_ecu_fx(N)"); +#endif + } + + mag_chg = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * MAX_LGW */ + X = (Word16 *)scratchAlign(mag_chg, sizeof(*mag_chg) * MAX_LGW); /* Size = 2 * MAX_LPROT == 1 Word16*MAX_LPROT */ + xfp = (Word16 *)scratchAlign(X, sizeof(*X) * maxLprot); /* Size = 2 * MAX_LPROT == 1 Word16*MAX_LPROT */ + buffer = (Word8 *)scratchAlign(xfp, sizeof(*xfp) * maxLprot); /* Size = 4 * MAX_LPROT + 12 * MAX_L_FRAME */ + + /* buffer size = Word32 * MAX_LPROT (FFT, IFFT) DRAM + + 3*Word32 * MAX_L_FRAME */ + + basop_memset(alpha, 0, MAX_LGW*sizeof(Word16)); + basop_memset(beta, 0, MAX_LGW*sizeof(Word16)); + + lprot = LprotSzPtr[bwidth_fx]; move16(); + + test(); + ASSERT(prev_bfi >= 0 && prev_bfi <= 1); + IF( prev_bfi == 0 ) /* inside PhECU we can check vs 0 */ + { + *time_offs = 0; move16(); + *nonpure_tone_flag_ptr = -1; move16(); /* flag nonpure tone flag for new analysis */ + /* analysis made outside, up/down scaling here from static RAM to dynamic RAM */ + /* prevsynth_in_flt = prev_synth_man*2.^(-15 + exp_old) */ + /* X_sav_flt = X_man/2.^(Q_spec) */ + + /* 1 bit headroom needed in xfp_tmp_buf for FFT processing into X_sav */ + /* margin_prevsynth = actual margin in incoming 16 ms xpf segment */ + /* q_fx_old_exp was computed on full 21+ ms updatepcm buffer) */ + + ASSERT(margin_prevsynth >= 0 && (margin_prevsynth <= 16)); + + prevsynth_man_upshift = + sub(margin_prevsynth, 1); /* 0 --> -1(==down), 1--> 0 , 2 --> 1(==up), ... */ + ASSERT(prevsynth_man_upshift >= -16 && prevsynth_man_upshift <= 15); /* avoid Overflow in shr, shl */ + *Q_spec = sub(15, sub(q_fx_old_exp, prevsynth_man_upshift)); + /* Q_spec target is to create 1 additional bit of margin in the xfp TD buffer , before converting to + * Xsav + */ + + if (margin_prevsynth == 0) + { + Word16 Qold = 15 - (q_fx_old_exp + 1); + Word16 tmp_man_upshift = margin_prevsynth - 1; /* 1 .. -15 */ + Word16 Qnew = 15 - (q_fx_old_exp - tmp_man_upshift); + assert(Qold == Qnew); + UNUSED(Qold); + UNUSED(Qnew); + } + if (margin_prevsynth == 1) + { + Word16 Qold = 15 - (q_fx_old_exp + 0); + assert(*Q_spec == Qold); + UNUSED(Qold); + } + if (margin_prevsynth == 2) + { + Word16 Qold = 15 - (q_fx_old_exp - 1); + assert(*Q_spec == Qold); + UNUSED(Qold); + } + + Q_prevsynthMinus1 = sub(15, add(q_fx_old_exp, +1)); /* dbg to use non-scaled prevsynth for OLA */ + + /* Q of prev_synth now separated from prev_bfi=0 and prev_bfi==1 */ + +#ifdef USE_TMPXFP_IN_OLA + Q_prevsynthMinus1 = *Q_spec; /* a possibly upscaled Q */ +#endif + + + Copy_Scale_sig( + prevsynth, xfp, lprot, + prevsynth_man_upshift); /* unscaled prevsynth is still used by rec_frame, copy to a temporary + xfp analysis buffer, and scale down to a margin of 1 bit */ + + + trans_burst_ana_fx( + ((void *)NULL), + mag_chg, &ph_dith, mag_chg_1st, output_frame, *time_offs, env_stab, alpha, beta, beta_mute, Xavg, + (*Q_spec), L_oold_xfp_w_E_fx, oold_xfp_w_E_exp_fx, oold_Ltot_exp_fx, oold_grp_shape_fx, + L_old_xfp_w_E_fx, old_xfp_w_E_exp_fx, old_Ltot_exp_fx, old_grp_shape_fx, + fadeout, + L_Xavg, /* full scale band amplitudes in first bfi frame */ + buffer); + + spec_ana_fx(&(xfp[0]), plocs, L_plocsi, num_p, X_sav, output_frame, bwidth_fx, + sp_ana_win, f0hzLtpBinQ7, norm_corrQ15_fx, maxLprot, maxPlocs, buffer); + } + ELSE + { + /* analysis made outside, possible up/down scaling here from static RAM to dynamic RAM */ + ASSERT(margin_prevsynth >= 0 && (margin_prevsynth <= 15)); + + /* prev_synth may have been scaled outside by update_pcm() function */ + /* prevsynth_in_flt = prev_synth_man*2.^(-15 + exp_old) */ + /* first bfi frame: X_sav_flt = X_man/2.^(*Q_spec) */ + /* this bfi frame prev_synth(TD) is mixed with ifft signal(TD,from Q_spec) in rec_frame_fx + variable Q_prevsynthMinus1 provided to rec_frame for this TD+TD mixing + */ + + Q_prevsynthMinus1 = sub(15, add(q_fx_old_exp, +1)); /* for now, "old" use of unscaled prevsynth for added OLA */ + +#ifdef USE_TMPXFP_IN_OLA + { /* DBG target here is to instead upshift to a zero margin */ + /* but Q value is maintained to match the save Xsav *Q_spec which is used with an offset of " -1" */ + /* prevsynth_man_upshift = -prevsynth_margin ; */ + Word16 tmp, worklen = add(hamm_len2Tab[bwidth_fx], shr(hamm_len2Tab[bwidth_fx], 2)); + tmp = mult(7680, lprot); /* needs to truncate to integer */ + ASSERT(tmp == worklen); + Copy_Scale_sig(&prevsynth[lprot - worklen], &xfp[lprot - worklen], worklen, + margin_prevsynth); /* only scale up last 3.75 ms */ + Q_prevsynthMinus1 = sub(15, add(q_fx_old_exp, margin_prevsynth)); /*-1 does not make sense */ + } +#endif + + *time_offs = add_sat(*time_offs, output_frame); + + trans_burst_ana_fx( + ((void *)NULL), + mag_chg, &ph_dith, mag_chg_1st, output_frame, *time_offs, env_stab, alpha, beta, beta_mute, Xavg, + (0), /* *Q_spec input only used in first bfi frames for burst analysis */ + L_oold_xfp_w_E_fx, oold_xfp_w_E_exp_fx, oold_Ltot_exp_fx, oold_grp_shape_fx, L_old_xfp_w_E_fx, + old_xfp_w_E_exp_fx, old_Ltot_exp_fx, old_grp_shape_fx, + fadeout, + NULL, /* full scale band amplitudes , only used in first bfi frame */ + buffer); + } + /* cpy LPROT Word16 from Static RAM Xsav to working DRAM/scratch buffer X ;*/ + basop_memmove(X, X_sav, (lprot) * sizeof(Word16)); + /* seed for own_rand2 */ + seed = *time_offs; move16(); + + if (mag_chg_gr != NULL) /* o: dbg per band magnitude modifier, incl. burst attenuation */ + { + Counter k; + Word16 lgw_local = s_min(add(bwidth_fx, LGW8K), LGW48K); /* 4,5,6,7, (7/8) */ + for (k = 0; k < lgw_local; k++) + { + mag_chg_gr[k] = mag_chg[k]; /* dbg SNR output */ + } + } + + subst_spec_fx(plocs, L_plocsi, num_p, *time_offs, X, mag_chg, ph_dith, old_is_transient, output_frame, + &seed, alpha, beta, + Xavg, t_adv + ,fadeout, + nonpure_tone_flag_ptr, /* i/o : non-pure single tone indicator state */ + L_Xavg /*i : only used in first bfi frame */ + ); + + if (seed_out_fxPtr != NULL) + { + *seed_out_fxPtr = seed; /* verify seed synch after subst_spec */ + } + + + if (X_out != NULL) + { + Word16 ii; + for (ii = 0; ii < lprot; ii++) + { + X_out[ii] = X[ii]; /* evolve spectrum, no moves counted as this is a dbg-vector info cpy */ + } + } + + /* reconstructed frame in tda domain */ + /* NB *Q_spec only updated in first bfi frame */ + + /*Scratch Analysis at this point */ + /* X fft input needed as evolved spectrum Lprot* Word16 */ + /* xfp not needed any longer Word16* Lprot */ + /* IFFT operation needs Word32*Lprot in and Word32*Lprot out */ + /* MDCT win operation may be inplace 2x MAX_L_FRAME */ + /* TDA output is 1x MAX_L_FRAME */ + + rec_frame_fx(X, L_ecu_rec, output_frame, *Q_spec, + win2ms_init, win16ms_center, + maxLprot, +#ifdef USE_TMPXFP_IN_OLA + xfp, /* only last 3.75 ms used, in both prevbfi=0 and prevBfi=1 i.e frames, xfp is an + upscaled prev_synth */ +#else + prevsynth, /*only last 3.75 ms used in both prevbfi=0 and prevBfi=1 i.e frames */ +#endif + Q_prevsynthMinus1, + buffer); + + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + } + + + static Word16 sqrt2ndOrder( /* o: in Q15 (2nd order least square approx.) */ + const Word16 x /* i: x must be in between 0.5 and 1.0 (Q15). */ + ) + { + Word32 acc; + Word16 z; +#ifdef WMOPS + push_wmops("PhECU::sqrt2ndOrder"); +#endif + + ASSERT(x >= 16384); + + acc = 1890205600L; /* 0.880195572812922 in Q31 */ move32(); + z = mac_r(acc, x, -6506); /* -0.198537395405340 in Q15 */ + acc = 682030261L; /* 0.317595089462249 in Q31 */ move32(); + z = mac_r(acc, z, x); /* in Q15 */ + + +#ifdef WMOPS + pop_wmops(); +#endif + return z; + } + + + /* Modified version to produce Word32 input to FFT */ + static void windowing_L( + const Word16 *x, /* i: Input signal */ + Word32 * L_y, /* o: Windowed output */ + const Word16 *win, /* i: Window coefficients */ + const Word16 rectLength, /* i: Offset in between the 1st and 2nd symmetric halves of the Hamming window */ + const Word16 halfLength /* i: Half of the total length of a complete Hamming window. */ + ) + { + Counter i; + Word32 * pY_L; + const Word16 *pX, *pW; + Word16 tmp_RL; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("windowing_L", sizeof(struct { + Counter i; + Word32 * pY_L; + const Word16 *pX, *pW; + })); +#endif + +#ifdef WMOPS + push_wmops("PhECU::windowing_L"); +#endif + + pX = x; + pW = win; + pY_L = L_y; + + FOR(i = 0; i < halfLength; i++) /* 1st symmetric half of the Hamming window */ + { + *pY_L++ = L_mult(*pX++, *pW++); move32(); + } + /* Periodic filter - one more rect sample before end tapering */ + + tmp_RL = add(rectLength, 1); + + if (rectLength == 0) + { + tmp_RL = 0; move16(); + } + /* If rectLength is zero, it's a pure Hamming window; otherwise Hamming-Rectangular. */ + FOR(i = 0; i < tmp_RL;i++) + { + *pY_L++ = L_deposit_h(*pX++); move32(); + } + tmp_RL = sub(halfLength, 1); + if (rectLength == 0) + { + tmp_RL = halfLength; move16(); + } + FOR(i = 0; i < tmp_RL; i++) /* 2nd symmetric half of the Hamming window. */ + { + *pY_L++ = L_mult(*pX++, *(--pW)); move32(); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + } + + /* Modified version to produce Word16 input to FFT */ + static void windowing_ola(const Word16 *x, /* i: Input signal */ + Word16 * y, /* o: Windowed output */ + const Word16 *win, /* i: Window coefficients */ + const Word16 Length /* i: Half of the total length of a complete Hamming window. */ + ) + { + Counter i; + Word16 * pY; + const Word16 *pX, *pW; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("windowing_ola", sizeof(struct { + Counter i; + Word16 * pY; + const Word16 *pX, *pW; + })); +#endif + +#ifdef WMOPS + push_wmops("PhECU::windowing_ola"); +#endif + + pX = x; + pW = win; + pY = y; + + FOR(i = 0; i < Length; i++) /* 1st symmetric half of the Hamming window */ + { + *pY++ = mult_r(*pX++, *pW++); move16(); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + } + + /* Modified version to produce Word16 input to FFT */ + static void ola_add(const Word16 *x, /* i: Input signal 1 */ + const Word16 *y, /* i: Input signal 2 */ + Word16 * z, /* o: Output signal */ + const Word16 Length /* i: Half of the total length of a complete window. */ + ) + { + Counter i; + Word16 * pZ; + const Word16 *pX, *pY; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("windowing_ola", sizeof(struct { + Counter i; + Word16 * pY; + const Word16 *pX, *pW; + })); +#endif + + + + pX = x; + pY = y; + pZ = z; + + FOR(i = 0; i < Length; i++) /* 1st symmetric half of the Hamming window */ + { + *pZ++ = add_sat(*pX++, *pY++); move16(); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif + + } + + /*----------------------------------------------------------------------------- + * magnSqrtApprox_fx() + * + * Approximation of sqrt(Square magnitude) of fft spectrum + * if min_abs <= 0.4142135*max_abs + * abs = 0.99*max_abs + 0.197*min_abs + * else + * abs = 0.84*max_abs + 0.561*min_abs + * end + * + * Note: even to handle the dynamics of sqrt(re^2+im^2) located on + * a scaled unit circle. One need to scale down the results + * with a factor 2, that is Q_out = Q_in - 1 + * sqrt(32768.^2+32768.^2) results in = 23170 Q0-1, + * which corresponds to 46341 in the Q0 domain + *----------------------------------------------------------------------------*/ + Word16 sqrtMagnApprox_fx( /* o : sqrt of magnitude square spectrum Q_in-1*/ + const Word16 re, /* i : Real part Q_in */ + const Word16 im /* i : Imag part Q_in */ + ) + { + /* Constants for Approximation of sqrt(Square magnitude) of fft spectrum + * >> num2str(round(0.4142135]*2.^15)) + * ans = 13573 + * >> num2str(round([0.99 0.197 0.84 0.561]*2.^14)) + * ans = 16220 3228 13763 9191 + */ + +#define C_0p4142135_Q15 13573 + +#define C_0p99_Q14 16220 +#define C_0p197_Q14 3228 +#define C_0p84_Q14 13763 +#define C_0p561_Q14 9191 + Word16 sgn_bit, re_abs, im_abs, max_abs, min_abs, sum; + Word16 jcoeffs[2][2] = { {C_0p99_Q14, C_0p197_Q14}, {C_0p84_Q14, C_0p561_Q14} }; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("sqrtMagnApprox_fx", sizeof(struct { + Word16 sgn_bit, re_abs, im_abs, max_abs, min_abs, sum; + Word16 jcoeffs[2][2]; + })); +#endif + +#ifdef WMOPS + push_wmops("PhECU::sqrtMagnApprox_fx"); +#endif + + /* Get values and move pointers */ + re_abs = abs_s(re); /* 1 cycle */ + im_abs = abs_s(im); /* 1 cycle */ + + /* Find max and min value */ + min_abs = s_min(re_abs, im_abs); /* 1 cycle */ + max_abs = s_max(re_abs, im_abs); /* 1 cycle */ + + /* Calc approximation depending on relation */ + sgn_bit = lshr(sub(mult(max_abs, C_0p4142135_Q15), min_abs), 15); /* 3 cycles */ + sum = mac_r(L_mult(max_abs, jcoeffs[sgn_bit][0]), min_abs, jcoeffs[sgn_bit][1]); /* 2 cycles */ +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + return sum; + } + + /*----------------------------------------------------------------------------- + * fft_spec2_sqrt_approx_fx() + * + * Approximation of sqrt(Square magnitude) of fft spectrum + * if min_abs <= 0.4142135*max_abs + * abs = 0.99 max_abs + 0.197*min_abs + * else + * abs = 0.84 max_abs + 0.561*min_abs + * end + * + * Note: even to handle the dynamics of sqrt(re^2+im^2) located on + * a scaled unit circle. One need to scale down the results + * with a factor 2, that is Q_out = Q_in - 1 + * sqrt( -32768.^2 + -32768.^2 ) results in = 23170 Qin-1, + * which corresponds to 46341 in the Qin domain + *----------------------------------------------------------------------------*/ + + void fft_spec2_sqrt_approx_fx(const Word16 x[], /* i : Input vector: complex spectrum , Qin */ + Word16 xMagSqrt[], /* o : sqrt of magnitude square spectrum Qout=Qin-1*/ + const Word16 N /* i : Input vector x length */ + ) + { + Counter i; + Word16 l; + const Word16 *pRe, *pIm; + Word16 * pMagSqrt; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("fft_spec2_sqrt_approx_fx", sizeof(struct { + Counter i; + Word16 l; + const Word16 *pRe, *pIm; + Word16 * pMagSqrt; + })); +#endif + +#ifdef WMOPS + push_wmops("PhECU::fft_spec2_sqrt_approx_fx"); +#endif + + /* Magnitude at 0. only real component */ + pMagSqrt = &xMagSqrt[0]; + pRe = &x[0]; + *pMagSqrt++ = mult(abs_s(*pRe++), C_0p99_Q14); move16(); + + /* From 1 to (N/2 - 1). */ + pIm = &x[N - 1]; + + l = sub(shr_pos_pos(N, 1), 1); /* N/2 - 1. */ + l = s_min(l, (LPROT48K_RED / 2 - 1) + DELTA_CORR_F0_INT); + /* at 48 k the top 8 khz are always zero, and further peaks are not + located above LPROT48K_RED 32 kHz */ + FOR(i = 0; i < l; i++) + { + *pMagSqrt++ = sqrtMagnApprox_fx(*pRe++, *pIm--); move16(); + } + + /* The sqrt magnitude square at N/2 - only real component */ + *pMagSqrt = mult(abs_s(*pRe), C_0p99_Q14); move16(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + return; + } + + Word16 + imax2_jacobsen_mag_fx(/* o: The location, relative to the middle of the 3 given data point, of the maximum. + (Q15) */ + const Word16 *y_re, /* i: The 3 given data points. real part order -1 0 1 */ + const Word16 *y_im, /* i: The 3 given data points. imag part order 1 0 -1 (from FFT)*/ + const Word16 + special /* i: -1 = left edge special case, 0 = normal, +1 = right edge special case */ + ) + { + Word16 posi; + Word16 man, expo; + const Word16 *pY; + Word16 y_m1_re, y_0_re, y_p1_re; + Word16 y_m1_im, y_0_im, y_p1_im; + + Word16 D_re, D_im, N_re, N_im; + + Word32 L_sign, L_denom, L_numer; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("imax2_jacobsen_mag_fx", sizeof(struct { + Word16 posi; + Word16 man, expo; + const Word16 *pY; + Word16 y_m1_re, y_0_re, y_p1_re; + Word16 y_m1_im, y_0_im, y_p1_im; + Word16 D_re, D_im, N_re, N_im; + Word32 L_sign, L_denom, L_numer; + })); +#endif + +#ifdef WMOPS + push_wmops("PhECU::imax2_jacobsen_mag_fx"); +#endif + + /* Jacobsen estimates peak offset relative y_0 using + * X_m1 - X_p1 + * d = REAL ( ------------------- ) * c_jacob + * 2*X_0 - X_m1 -Xp1 + * + * Where c_jacob is a window dependent constant + */ +#define C_JACOB_Q14 18725 /* c_jacob = 1.1429; % assume 0.1875 hammrect window 'periodic' */ + + ASSERT(special == 0); /* always use other imax for edges cases */ + UNUSED(special); + + /* Get the bin parameters into variables */ + pY = y_re; + y_m1_re = *pY++; + y_0_re = *pY++; + y_p1_re = *pY++; + + /* Same for imaginary parts - note reverse order from FFT */ + pY = y_im; + y_p1_im = *pY++; + y_0_im = *pY++; + y_m1_im = *pY++; + + test(); + IF( norm_s(y_0_re) == 0 || norm_s(y_0_im) == 0 ) + { +#define JACOB_MARGIN 2 + /* for very high peaks the Complex denominator values may need to be downshifted 2 steps */ + y_0_re = shr_pos(y_0_re, JACOB_MARGIN); + y_0_im = shr_pos(y_0_im, JACOB_MARGIN); + + y_m1_re = shr_pos(y_m1_re, JACOB_MARGIN); + y_m1_im = shr_pos(y_m1_im, JACOB_MARGIN); + + y_p1_re = shr_pos(y_p1_re, JACOB_MARGIN); + y_p1_im = shr_pos(y_p1_im, JACOB_MARGIN); + } + + /* prepare numerator real and imaginary parts*/ + N_re = sub(y_m1_re, y_p1_re); + N_im = sub(y_m1_im, y_p1_im); + + /* prepare denominator real and imaginary parts */ + + D_re = sub(sub(shl_pos(y_0_re, 1), y_m1_re), y_p1_re); + D_im = sub(sub(shl_pos(y_0_im, 1), y_m1_im), y_p1_im); + + /* REAL part of complex division */ + L_numer = L_mac0(L_mult0(N_re, D_re), N_im, D_im); + L_denom = L_mac0(L_mult0(D_re, D_re), D_im, D_im); + L_sign = L_xor(L_numer, L_denom); /* Preserve the sign since div_s() only takes positive arguments. */ + + L_numer = L_abs(L_numer); + L_denom = L_abs(L_denom); + + test(); + IF(L_numer != 0 && L_denom != 0) + { + + man = plc_phEcu_ratio_fx(L_numer, L_denom, &expo); /* The mantissa is considered in Q15 */ + + man = mult_r(man, C_JACOB_Q14); + posi = shr_sat( man, sub(expo, 2)); + /* to Q15 (and due to saturation, it is automatically bound inside [-1.0,1.0].) */ + + if (L_sign < 0) /* Restore the sign. */ + { + posi = negate(posi); + } + } + ELSE + { + posi = 0; move16(); /* flat top, division is not possible choose center freq */ + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + return posi; /* Q15. The position either left or right relative to the index of the middle of the 3 given + data points. */ + } + + /* Convert 32 Bit FFT into 16 bit fft domain */ + static void intlvW32_2_flippedW16( + Word32 * L_x, /* i : interleaved coeffs DC, Fs/2, Re(1),Im(1), Re(2),Im(2), ... ] */ + const Word16 numPairs, /* i: typically (fft-size/2 -1), re/im coeffs to copy */ + const Word16 Lprot, /* i: fft size , including DC+fs/2 */ + Word16 * x /* o : flipped coeffs , [DC, Re(1),.. Re(N-1/2) , Fs/2, Im(N-1/2) ... Im(1) ] */ + ) + { + + /* reorder real and imag components, and apply fractional scale for 24/48Khz */ + Counter m; + Counter numPairsLocal; + Word32 *pX_L = &L_x[2]; /*ptr init*/ + Word16 *pX_Re = &x[1]; /*ptr init*/ + Word16 *pX_Im = &x[Lprot - 1]; /*ptr init*/ + +#define FHG_FFT_UPSHIFT 2 + +#ifdef WMOPS + push_wmops("PhECU::intlvW32_2_flippedW16"); +#endif +#ifdef DYNMEM_COUNT + Dyn_Mem_In("intlvW32_2_flippedW16", sizeof(struct { + Counter m; + Counter numPairsLocal; + Word32 *pX_L; + Word16 *pX_Re; + Word16 *pX_Im; + })); +#endif + + /* make the scaling of 8/3= 4*0.666 here for 24 kHz and 48 kHz using 16x16 instead or 32x16 ops + a limited loss of SNR */ + + test(); + IF(sub(numPairs, 383) == 0 || sub(numPairs, 191) == 0) + { /* 24,48 kHz , 16 ms , scale by 8/3 = .666*4 */ + numPairsLocal = s_min(numPairs, 383 - 63); /* do not copy bins above 20 kHz */ + /* for 48 kHz is to only go up to 40 kHz pairs , */ + FOR(m = 0; m < numPairsLocal; m++) + { + /* multiply by (8/3)*(2.^FHG_FFT_UPSHIFT) */ + /* note: multiplication by 2/3 need to preceed upshift , due to FFT scaling being very close to the 48/24 3 + * split kHz bit margin */ + *pX_Re++ = extract_h(L_shl_pos(Mpy_32_16_lc3plus(*pX_L++, FEC_TWOTHIRDS_Q15), FHG_FFT_UPSHIFT + 2)); + move16(); + *pX_Im-- = extract_h(L_shl_pos(Mpy_32_16_lc3plus(*pX_L++, FEC_TWOTHIRDS_Q15), FHG_FFT_UPSHIFT + 2)); + move16(); + } + /* Place the two real only components */ + x[0] = extract_h(L_shl_pos(Mpy_32_16_lc3plus(L_x[0], FEC_TWOTHIRDS_Q15), FHG_FFT_UPSHIFT + 2)); /* DC */ + move16(); + m = shr_pos_pos(Lprot, 1); + x[m] = extract_h(L_shl_pos(Mpy_32_16_lc3plus(L_x[1], FEC_TWOTHIRDS_Q15), FHG_FFT_UPSHIFT + 2)); /* fs/2 */ + move16(); + } + ELSE + { /* 8,16,32 kHz 16 ms no additional scaling by 8/3 */ + + FOR(m = 0; m < numPairs; m++) + { + *pX_Re++ = extract_h(L_shl_pos(*pX_L++, FHG_FFT_UPSHIFT)); + move16(); + *pX_Im-- = extract_h(L_shl_pos(*pX_L++, FHG_FFT_UPSHIFT)); + move16(); + } + + /* Place the two real only components */ + x[0] = extract_h(L_shl_pos(L_x[0], FHG_FFT_UPSHIFT)); /* DC */ move16(); + m = shr_pos_pos(Lprot, 1); + x[m] = extract_h(L_shl_pos(L_x[1], FHG_FFT_UPSHIFT)); /* fs/2 */ move16(); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + } + + static void flippedW16_2_intlvW32( + Word16 * x, /* i : flipped coeffs , [DC, Re(1),.. Re(N-1/2) , Fs/2, Im(N-1/2) ... Im(1) ] */ + const Word16 numPairs, /* i: typically (fft-size/2 -1), re/im coeffs to copy */ + const Word16 Lprot, /* i: fft size , including DC+fs/2 */ + Word32 * L_x /* o : interleaved coeffs DC, Fs/2, Re(1),Im(1), Re(2),Im(2), ... ] */ + ) + { + Counter i; + Counter numPairsLocal; + Word32 *pX_L; + Word16 *pX_re, *pX_im; +#ifdef WMOPS + push_wmops("PhECU::flippedW16_2_intlvW32"); +#endif +#ifdef DYNMEM_COUNT + Dyn_Mem_In("flippedW16_2_intlvW32", sizeof(struct { + Counter i; + Counter numPairsLocal; + Word32 *pX_L; + Word16 *pX_re, *pX_im; + })); +#endif + + /* Convert stored 16 bit into 32bit for fft */ + /* Note during save FFT output was left shifted FHG_FFT_UPSHIFT */ + /* this needs to be restored before one calls ifft to avoid overflow */ + + pX_L = &L_x[2]; /*ptr init*/ + pX_re = &x[1]; /*ptr init*/ + pX_im = &x[Lprot - 1]; /*ptr init*/ + + numPairsLocal = s_min(320, numPairs); /* 48kHz optimization */ + FOR(i = 0; i < numPairsLocal; i++) + { + *pX_L++ = L_shr_pos(L_deposit_h(*pX_re++), FHG_FFT_UPSHIFT); move32(); + *pX_L++ = L_shr_pos(L_deposit_h(*pX_im--), FHG_FFT_UPSHIFT); move32(); + } + /* at 48KHz zero tail 2x63= 126 bins for Word32 IFFT input */ + basop_memset(pX_L, 0, sizeof(Word32) * shl_pos(sub(numPairs, numPairsLocal), 1)); + + /* Place the two real only components */ + L_x[0] = L_shr_pos(L_deposit_h(x[0]), FHG_FFT_UPSHIFT); move32(); + L_x[1] = L_shr_pos(L_deposit_h(x[Lprot / 2]), FHG_FFT_UPSHIFT); move32(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + } + + void get_sin_cosQ10opt(Word16 phase, /* Q10 0..1023 i.e. 1024=2*pi */ + Word16 * ptrSin, /* Q15 */ + Word16 * ptrCos /* Q15 */ + ) + { + Word16 sign_val, idx, idx2, idx3; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("get_sin_cosQ10", sizeof(struct { Word16 sign_val, idx, idx2, idx3; })); +#endif + +#ifdef WMOPS + push_wmops("PhECU::get_sin_cosQ10opt"); +#endif + + /* sin table has a range up to pi/2 (256+1)=257 coeffs*/ + + sign_val = shr_pos_pos(phase, 9); /* highest bit is the sinus sign */ + idx = s_and(phase, 0x1ff); /* mask away sign */ + + idx2 = sub(idx, 256); + if (idx2 < 0) + { /*rising sine part */ + *ptrSin = sin_quarterQ15_fx[idx]; move16(); + } + + idx3 = sub(512, idx); + if (idx2 >= 0) + { /* decaying part, reverse idx */ + *ptrSin = sin_quarterQ15_fx[idx3]; move16(); + } + + if (sign_val != 0) + { + *ptrSin = negate(*ptrSin); /*no move when inlined , no sat as max in table is 32767 */ + } + + /*cos*/ + idx = add(phase, 256); /* +pi/2, i.e. move to cos phase */ + idx = s_and(idx, 0x3ff); /* wrap on 10 bits limit */ + + sign_val = shr_pos_pos(idx, 9); /* highest bit is the sign */ + idx = s_and(idx, 0x1ff); /* mask away sign */ + + idx2 = sub(idx, 256); + if (idx2 < 0) + { /*rising sine part */ + *ptrCos = sin_quarterQ15_fx[idx]; move16(); + } + + idx3 = sub(512, idx); + if (idx2 >= 0) + { /* decaying part, reverse idx*/ + *ptrCos = sin_quarterQ15_fx[idx3]; move16(); + } + + if (sign_val != 0) + { + *ptrCos = negate(*ptrCos); /* no move when inlined , no sat as max in table is 32767 */ + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + } + + static Word16 plc_phEcu_nonpure_tone_ana_fx(const Word16* plocs, + const Word16 n_plocs, + const Word16* X, /*i: { DC, Re1,Re2 ,.....ReN , Fs/2, ImN... , Im2, Im1} */ + const Word32 *L_Xavg, /* i : Frequency group amp averages for tonal tilt analysis Max upshifted */ + const Word16 Lprot, + const Word16 fs_idx) + { +#ifdef DYNMEM_COUNT + Dyn_Mem_In("PhECU::nonpure_tone_ana", sizeof(struct { + Word16 nonpure_tone_detect; + Word16 n_ind, tone_ind, low_ind, high_ind; + Word16 peak_amp, peak_amp2, valley_amp, x_abs[(1 + 2 * ONE_SIDED_SINE_WIDTH + 2 * 1)]; + Word16 sineband_ind_low, sineband_ind_high; + Word16 i, N_grp; + Word16 tmp, tmp_dB; + Word32 L_tot_inc_HF, L_tot_inc_LF; + Word16* pRe; + Word16* pIm; + Word16* gwlpr_fxPlus1; + Word32 L_nf; + Word32 L_XavgL2_fx[MAX_LGW + 1]; + Word32 L_XavgUp_fx[MAX_LGW + 1]; + })); +#endif + +#ifdef WMOPS + push_wmops("PhEcu::nonpure_tone_ana_fx"); +#endif + + Word16 nonpure_tone_detect; /* output variable */ + Word16 n_ind, tone_ind, low_ind, high_ind; + Word16 peak_amp, peak_amp2, valley_amp, x_abs[(1 + 2 * ONE_SIDED_SINE_WIDTH + 2 * 1)]; + + Word16 sineband_ind_low, sineband_ind_high; + Word16 i, N_grp; + Word16 tmp; + + Word32 L_Ltot_inc_HF, L_Ltot_inc_LF; + Word32 L_tmp_dB; + + const Word16* pRe; + const Word16* pIm; + const Word16* gwlpr_fxPlus1; + Word32 L_nf; + Word32 L_XavgL2_fx[MAX_LGW + 1], L_tmp ; + Word32 L_XavgUp_fx[MAX_LGW + 1]; /* upscaled values , excluding peak band(s) */ + + /* use of a compressed hearing sensitivity curve allowing more energy deviation in highest and lowest bands */ + /* ROM table Word16 scATHFx[MAX_LGW - 1] */ + + /* init */ + nonpure_tone_detect = 0; move16(); /* Word16 register with decisions */ + + peak_amp = 0; move16(); + peak_amp2 = 0; move16(); + + /* limit single sine optimization to when 2 peaks are close enough to represent a single sinusoid */ + test(); + if ((sub(n_plocs, 2) == 0) && + (sub(sub(plocs[1], plocs[0]), ONE_SIDED_SINE_WIDTH) >= 0) + ) /* NB, plocs is an ordered vector */ + { + nonpure_tone_detect = s_or(nonpure_tone_detect, 0x01); + } + + /* local bin wise dynamics analysis, for 1 or 2 initial local maxima peaks , + if 2 peaks , we do the analysis based on the location of the largest abs peak */ + { + tone_ind = 0; move16(); /* one peak only , use position plocs[tone_ind], tone_ind==0 */ + + peak_amp = shr(abs_s(X[0]), 1); /* plocs[0]=0, simply multiply DC*0.5 to match scaling in function sqrtMagnApprox_fx */ + test(); + IF(plocs[0] != 0) + { + peak_amp = sqrtMagnApprox_fx(X[plocs[0]], X[sub(Lprot, plocs[0])]); + } + + IF(sub(n_plocs, 2) == 0) /* locate abs max peak */ + { + peak_amp2 = sqrtMagnApprox_fx(X[plocs[1]], X[sub(Lprot, plocs[1])]); /* Re-part and Im-part in different ends of array X */ + + tmp = sub(peak_amp, peak_amp2); + tone_ind = lshr(tmp, 15); /* mask out sign bit 0(for peak_amp0), 1( for peak_amp2), lshr --> no sign extension in shift */ + peak_amp = s_max(peak_amp, peak_amp2); + } + + low_ind = s_max(1, sub(plocs[tone_ind], (ONE_SIDED_SINE_WIDTH + 1))); /* DC is not allowed in the range */ + high_ind = s_min(sub(shr(Lprot, 1), 2), add(plocs[tone_ind], (ONE_SIDED_SINE_WIDTH + 1))); /* Fs/2 is not allowed in the range */ + + n_ind = add(sub(high_ind, low_ind), 1); + /* find lowest amplitude around the assumed main lobe center location */ + + pRe = &(X[low_ind]); /* ptr init */ + pIm = &(X[Lprot - low_ind]); /* ptr init*/ + FOR(i = 0; i < n_ind; i++) + { + x_abs[i] = sqrtMagnApprox_fx(*pRe++, *pIm--); move16(); /* x_abs is downscaled by 0.5 in abs(complex) approximation */ + } + + valley_amp = peak_amp; move16(); + FOR(i = 0; i < n_ind; i++) + { + valley_amp = s_min(x_abs[i], valley_amp); + } + + /* at least a localized amplitude ratio of 16 (24 dB) required to declare a pure noise-free sinusoid */ + if (sub(shr(peak_amp, 4), valley_amp) < 0) /* 1/16 */ + { + nonpure_tone_detect = s_or(nonpure_tone_detect, 0x02); /* not a pure tone due to too low local SNR P2V */ + } + } + + + /* analyze LF/ HF bands energy dynamics vs the assumed single tone band ( for one or two peaks found cases ) */ + { + /* Xavg , is a vector of rather rough MDCT based band amplitude estimates in perceptually motivated bands. from approx the last 26 ms of synthesis */ + + /* eval amplitude relations for assumed tonal band vs lower and higher bands */ + /*N_grp = xavg_N_grp[fs_idx];*/ /* { 4 NB , 5 WB , 6 SSWB , 7 SWB, 8 FB }; */ + N_grp = add(fs_idx, 4); + assert(fs_idx < 5); + + + /* establish band(s) with assumed sinusoid tone */ + /* if tone freq location is below first MDCT-band definition, use first band as band location anyway */ + + /* band 0 , 1 , 2 , 3 , ...*/ + /* dct-inds "c" "0"...11, 12...19, 20...35, 36 ... */ + /* gwplr_fx= [ 1 , 12(750Hz), 20(1250Hz) , 36 , ... */ /* lowest lim+1 in gwplr */ + + /* for-loop BASOP version */ + tmp = 0; move16(); + gwlpr_fxPlus1 = &(gwlpr_fx[1]); /* ptr init */ + FOR(i = 0; i < N_grp; i++) + { + if (sub(plocs[tone_ind], gwlpr_fxPlus1[i]) >= 0) + { + tmp = add(i, 1); + } + } + + sineband_ind_low = tmp; move16(); + sineband_ind_high = tmp; move16(); /* typically in the same band as low */ + + /* a single tone may end up on a band border + , handle case when assumed tone is more or less right in-between two perceptual bands +/- 4*62.5 Hz */ + + test(); logic16(); + if ((sineband_ind_high > 0) && + (sub(sub(plocs[tone_ind], ONE_SIDED_SINE_WIDTH), gwlpr_fx[add(sineband_ind_high, 1)]) >= 0) + ) + { + sineband_ind_low = sub(sineband_ind_high, 1); + } + + logic16(); + if ((sub(sineband_ind_low, sub(N_grp, 1)) < 0) && + (sub(add(plocs[tone_ind], ONE_SIDED_SINE_WIDTH), gwlpr_fx[add(sineband_ind_low, 1)]) >= 0) + ) + { + sineband_ind_high = add(sineband_ind_low, 1); + } + } + + /* intraframe(26 ms), weighted LB and HB envelope dynamics/variation analysis */ + /* envelope analysis , + require at least two HF or two LF bands in the envelope taper/roll-off analysis , otherwise skip this condition */ + + logic16(); + test(); logic16(); + IF( (nonpure_tone_detect == 0) && + ( (sub( add(sineband_ind_high, 2), N_grp) < 0 ) || + (sub(sineband_ind_low, 2+1 ) >= 0) + ) + ) + { + + /* delta taper-off analysis solution, less sensitive to input bandwidth limitation and levels */ + + /* test Xavg Word16 result above vs a high resolution Word32 L_Xavg */ + /* strong spectral tilt causes HF to be truncated in Word16 */ + + basop_memcpy(L_XavgUp_fx, L_Xavg, N_grp * sizeof(Word32) ) ; + + /* first remove all energy from the assumed tonal peak band(s) */ + L_XavgUp_fx[sineband_ind_low] = L_min(L_XavgUp_fx[sineband_ind_low], 1); move32(); + L_XavgUp_fx[sineband_ind_high] = L_min(L_XavgUp_fx[sineband_ind_high], 1); move32(); + + tmp = getScaleFactor32_0(L_XavgUp_fx, N_grp); /* o: measured headroom in range [0..32], 32 if all L_x[i] == 0 */ + if (sub(tmp, 32) == 0) + { + nonpure_tone_detect = s_or(nonpure_tone_detect, 0x100); /* also set a flag for an all zero L_Xavg coarse spectrum estimate signal */ + } + + + /* add noise floor to L_Xavg before log2 function call */ + L_nf = L_shl(1L, sub(tmp, 1)); + L_nf = L_max(L_nf, 1L); + for (i = 0; i < N_grp; i++) + { + L_XavgUp_fx[i] = L_shl_sat(L_XavgUp_fx[i], tmp); move32(); /* maximize precision before actual log2_fx(Word32) calc call */ + + L_tmp = L_XavgUp_fx[i]; move32(); + test(); + if (L_tmp <= 0) + { + L_tmp = L_nf; move32(); + } + + /* log2(Upshifted Word32) */ + /* maximize precision in BASOP Log2 function */ + L_XavgL2_fx[i] = BASOP_Util_Log2(L_tmp); /* L_input 1.0 or lower --> output always negative */ + /* add 31.0 to store as fractional bits of an upscaled positive Word32 integer input ) */ + L_XavgL2_fx[i] = L_add(31L << 25, L_XavgL2_fx[i]); /* only diffs added so 31.0 is cancelled out later , in total only values between +/- 2^6 = [-64 ... -64[ are possible */ + } /* band i for L_Xavg calc*/ + /* verify that an assumed clean sine does not have any odd HF content indications by thresholding the accumulated delta rise in LF/HF side lobes */ + L_Ltot_inc_HF = 0; move32(); + for (i = (sineband_ind_high + 1); i < (N_grp - 1); i++) + { + L_tmp_dB = 0; move32(); + if (L_sub(L_Xavg[i], L_Xavg[i + 1]) < 0) /* only increases are accumulated */ + { + L_tmp_dB = L_sub(L_XavgL2_fx[i + 1], L_XavgL2_fx[i]); /* obtain ratio in log2 domain */ + } + L_tmp = Mpy_32_16_lc3plus(L_tmp_dB, scATHFx[i]); /* scATHFx[i] is the ATH weight for band i and band i+1 */ + L_tmp = L_shr_pos(L_tmp, 1); /* Q25 -> Q24 */ + + L_Ltot_inc_HF = L_add(L_Ltot_inc_HF, L_tmp); /* Q24 */ + } + + /* verify that an assumed clean sine does not have any odd LF content by thresholding the accumulated LF reverse up tilt */ + + L_Ltot_inc_LF = 0; move32(); + tmp = s_max(0, sub(sineband_ind_low, 1)); /* could also be pointer init */ + for (i = tmp; i > 0; i--) + { + L_tmp_dB = 0; move32(); + if (L_sub(L_Xavg[i - 1], L_Xavg[i]) > 0) /* only increases are accumulated */ + { + L_tmp_dB = L_sub(L_XavgL2_fx[i - 1], L_XavgL2_fx[i]); /* obtain ratio in log2 domain */ + } + L_tmp = Mpy_32_16_lc3plus(L_tmp_dB, scATHFx[i-1]); /* scATHFx[i-1] is the ATH weight in between band i-1 and band i */ + L_tmp = L_shr_pos(L_tmp, 1); /* Q25 -> Q24 */ + L_Ltot_inc_LF = L_add(L_Ltot_inc_LF, L_tmp); /* Q24 */ + } + + if (L_sub(L_Ltot_inc_HF, SIDE_LIM) > 0) /* side_lim=round(Q24x*0.7474) */ + { + /* 4.5 dB in log2 is 0.7474 */ + nonpure_tone_detect = s_or(nonpure_tone_detect, 0x10); /* still not a pure tone, too great HF side increase */ + } + + if (L_sub(L_Ltot_inc_LF, SIDE_LIM) > 0) /* side_lim=round(Q24x*0.7474) */ + { + /* 4.5 dB in log2 is 0.7474 */ + nonpure_tone_detect = s_or(nonpure_tone_detect, 0x20); /* still not a pure tone, too great HF side increase */ + } + + /* verify that an assumed clean sine does not have any odd LF+HF content by thresholding the accumulated LF+HF unexpected tilt */ + if (L_sub(L_add_sat(L_Ltot_inc_LF, L_Ltot_inc_HF), LFHF_LIM) > 0) /* side_lim=round(Q24x*0.7474) */ + { + /* 6.0 dB in log2 is 0.996578428 */ + nonpure_tone_detect = s_or(nonpure_tone_detect, 0x40); /* still not a pure tone, too great LF+HF side increase */ + } + + } /* bands available*/ + +#ifdef WMOPS + pop_wmops(); +#endif + + return nonpure_tone_detect; + } diff --git a/lib_lc3plus/plc_phecu_lf_peak_analysis_fx.c b/lib_lc3plus/plc_phecu_lf_peak_analysis_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..cdd082c317ca2d0dc3135b2a576d4f7a5febdac7 --- /dev/null +++ b/lib_lc3plus/plc_phecu_lf_peak_analysis_fx.c @@ -0,0 +1,204 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +void plc_phEcu_LF_peak_analysis_fx(Word16 * plocs, /* i/o 0 ... Lprot/2 +1*/ + Word16 * n_plocs, /* i/o 0.. MAX_PLOCS */ + Word32 * L_f0estQ16, /* i/o Q16*/ + const Word16 *mag, /* i: Qx */ + const Word16 stPhECU_f0hzLtpBinQ7, const Word16 stPhECU_f0gainLtpQ15, + const Word16 nSubm, Word16 maxPlocs, + Word8 *scratchBuffer /* Size = 6 * MAX_PLOCS + 42 */ +) + +{ + Counter i, j; + Word16 n_plocs_ana, peakLF_Xval, tmp, f_abs_ind, plocsIntersectFlag; + + Word32 L_fQ7, *L_f0est_prelQ16; + Word16 num_prel = 0, *plocs_prel; + Word16 prel_low, prel_high, start, fin; + Word16 *plocs_old; + Word32 *L_plocsi_old; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("plc_phEcu_LF_peak_analysis_fx", sizeof(struct { + Counter i, j; + Word16 n_plocs_ana, peakLF_Xval, tmp, f_abs_ind, plocsIntersectFlag; + Word32 L_fQ7, *L_f0est_prelQ16; + Word16 num_prel, *plocs_prel; + Word16 prel_low, prel_high, start, fin; + Word16 *plocs_old; + Word32 *L_plocsi_old; + })); +#endif + + + + L_f0est_prelQ16 = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 4 * 7 */ + plocs_prel = (Word16 *)scratchAlign(L_f0est_prelQ16, sizeof(*L_f0est_prelQ16) * 7); /* Size = 2 * 7 */ + plocs_old = (Word16 *)scratchAlign(plocs_prel, sizeof(*plocs_prel) * 7); /* Size = 2 * MAX_PLOCS */ + L_plocsi_old = (Word32 *)scratchAlign(plocs_old, sizeof(*plocs_old) * maxPlocs); /* Size = 4 * MAX_PLOCS */ + + test(); test(); + IF ((*n_plocs > 0) && sub(stPhECU_f0gainLtpQ15, ((Word16)(0.25 * 32768.0))) > 0 && + sub(stPhECU_f0hzLtpBinQ7, (Word16)(2.75 * 128.0)) < 0) + { + + /* % analyze/apply f0Ltp to avoid intermodulation effects below f0 of ~180 Hz + % we only do the f0Ltp-replacement(s) if there is already an established + % fft peak in the region ~fRes to 2.5*fres + fft_peak_eval_plocs = 1:3; + plocsIntersectFlag = intersect(plocs, fft_peak_eval_plocs ); % check for 1,2,3 in plocs */ + + plocsIntersectFlag = 0; move16(); + peakLF_Xval = 0; move16(); + n_plocs_ana = s_min(*n_plocs, 3); + FOR (i = 0; i < n_plocs_ana; i++) + { + tmp = plocs[i]; move16(); + if (sub(tmp, 2) <= 0) /* C index 0, 1,2 checked , [DC, 62.5 Hz, 125Hz ] */ + { + plocsIntersectFlag = add(i, 1); + } + peakLF_Xval = s_max(mag[tmp], peakLF_Xval); + } + + num_prel = 0; move16(); + IF (plocsIntersectFlag != 0) + { /* fft-peak at 0, 62 or 125 Hz */ + /* analyze if ltp-based f0 need to be added or not */ + peakLF_Xval = mult_r(peakLF_Xval, (Word16)(.375 * 32768.0)); /* now as a limit */ + + FOR (i = 1; i <= nSubm; i++) + { + L_fQ7 = L_mult0(i, stPhECU_f0hzLtpBinQ7); /* fractional index stored in L_plocsi */ + f_abs_ind = L_shr_pos(L_add(L_fQ7, 64), 7); /* integer bin index stored in plocs */ + + test(); + IF ((L_sub(L_fQ7, 819) <= 0) && /* % only apply up to ~400hz , 819 = 400/62.5*128 */ + (sub(mag[f_abs_ind], peakLF_Xval) > + 0)) /* % only set as preliminary if relative peak strength is signficant*/ + { + L_f0est_prelQ16[num_prel] = L_shl_pos(L_fQ7, 9); move32(); + plocs_prel[num_prel] = f_abs_ind; move16(); + num_prel = add(num_prel, 1); + } + } + } /*intersectFlag*/ + + /* now replace/ merge new preliminary added peaks with existing plocs and L_f0estQ16 */ + /* note that a previous fake/merged magnitude-determined peak may be replaced by two separated side peaks */ + + /* a general non-optimized list-merging solution below */ + test(); + IF ((num_prel > 0) && (sub(add(num_prel, *n_plocs), MAX_PLOCS) <= 0) /* skip in case plocs list is too large */ + ) + { + prel_low = plocs_prel[0]; move16(); + prel_high = plocs_prel[sub(num_prel, 1)]; move16(); + + /* initial assumption:: all original peaks (1 or 2 of them) are positioned below prel_low */ + start = (*n_plocs); /* at this point 'start' is the location_c where to add any harmonics peaks */ + + FOR (i = sub(*n_plocs, 1); i >= 0; i--) + { + if (sub(plocs[i], prel_low) >= 0) + { + start = i; move16(); + } + } + start = sub(start, 1); /* end of old section to copy before the added/merged section */ + start = s_max(start, -1); /* limit for loop later */ + /*% dbg check low part for a sucessful replace/merge */ + if (start >= 0 && start < *n_plocs) + { + ASSERT(plocs[start] < plocs_prel[0]); + } + + sub(0, 0); + IF (prel_high < plocs[0]) + { + fin = 0; move16(); /*% keep all plocs , just concat */ + } + ELSE + { + fin = *n_plocs; + FOR (i = 0; i < *n_plocs; i++) + { + sub(0, 0); + if (plocs[i] <= prel_high) + { + fin = i; move16(); + } + } + fin = add(fin, 1); /* first element in high part of old plocs to be copied */ + } + + /*% dbg check high part for a sucessful replace/merge */ + if (fin >= 0 && fin < *n_plocs) + { + ASSERT(plocs_prel[sub(num_prel, 1)] < plocs[fin]); + } + + /* + % actual replace/merge of added integer locations and fractional freqs. into plocs/f0list list ; + % three loops in BASOP + plocs = [ plocs(1:(start)) ; plocs_prel ; plocs((fin):end) ]; + f0est = [ f0est(1:(start)) ; f0est_prel; f0est((fin):end) ]; + */ + + FOR (i = 0; i < *n_plocs; i++) + { + plocs_old[i] = plocs[i]; move16(); + L_plocsi_old[i] = L_f0estQ16[i]; move32(); + } + + /* + j=0; + FOR(i=0; i <= start; i++) + { + plocs[i] = plocs_old[i]; move16(); + L_f0estQ16[i] = L_plocsi_old[i]; move32(); + j++; + } + */ + + j = add(start, 1); + + ASSERT(j>=0); + + FOR (i = 0; i < num_prel; i++) /* NB this section may both insert or overwrite old plocs */ + { + plocs[j] = plocs_prel[i]; move16(); + L_f0estQ16[j] = L_f0est_prelQ16[i]; move32(); + j++; + } + FOR (i = fin; i < *n_plocs; i++) /* copy the tail of the list */ + { + plocs[j] = plocs_old[i]; move16(); + L_f0estQ16[j] = L_plocsi_old[i]; move32(); + j++; + } + + *n_plocs = j; move16(); /* update total length */ + } /* num_prel >0*/ +} /* gain/hz Limits */ + +#ifdef DYNMEM_COUNT +Dyn_Mem_Out(); +#endif + +} + + diff --git a/lib_lc3plus/plc_phecu_peak_locator_fx.c b/lib_lc3plus/plc_phecu_peak_locator_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..e1342a486fdeaccc12ccf543a7dc7a245b5951ba --- /dev/null +++ b/lib_lc3plus/plc_phecu_peak_locator_fx.c @@ -0,0 +1,387 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +#define RES_fx 1 /* fixed point resolution */ + +/*----------------------------------------------------------------------------- + * peak_locator_fx() + *----------------------------------------------------------------------------*/ +void plc_phEcu_peak_locator_fx(const Word16 *inp, /* i: vector with values >=0 ,Qx */ + const Word16 inp_len, /* i: length of inp */ + Word16 * int_plocs, /* o: array of filtered integer plocs Q0 */ + Word16 * n_fsc, /* o: total_ number of filtered located highs Q0 */ + const Word16 sens, /* i sensitivity, Qx */ + const Word16 inp_high, /* i global high , Qx */ + const Word16 inp_low, /* i: global low, Qx */ + Word16 maxLprot_Red, /* i: optional size for wc memory alloc of scratch buffer */ + Word8 *scratchBuffer /* i: : scratch buffer 2* 3*(1+1+(maxLprot_Red/2)+1) */ +) +{ + Counter j, k, n, idx_high, idx_low; + Word16 inp_len_minus1 ; + Word16 pairs_start, pairs_end; + Word16 *p_tmp; + Word16 prev_delta, curr_delta; + Word16 delta_predc, delta_fin; + Word16 add_dc_flag, add_fin_flag; + Word16 low_val_cand_pairs, val_range; + Word16 num_pairs, n_tail_values; + Word16 cand_phase_start, cand_idx, prev_low_plus_sens, tmp; + + Word16 cand_high, prev_low; + Word16 *sc_idx; /* 1+ 128/2+1, or 1+ 256/2+1 ... 1+ 640/2+1 or 1+ 768/2+1*/ + Word16 *cand_pairs_buf ; /* actually lowVal + [DC ] + (368/2)pairs + [FS/2] */ + Word16 *cand_pairs; /* actually [DC ] + pairs + [FS/2] */ + Word16 * fsc_idx; /* list of high locations in sc__idx 1+368/2+1 */ + + + + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("peak_locator_fx", sizeof(struct { + Counter j, k, n, idx_high, idx_low; + Word16 inp_len_minus1; + Word16 pairs_start, pairs_end; + Word16 *p_tmp; + Word16 prev_delta, curr_delta; + Word16 delta_predc, delta_fin; + Word16 add_dc_flag, add_fin_flag; + Word16 low_val_cand_pairs, val_range; + Word16 num_pairs, n_tail_values; + Word16 cand_phase_start, cand_idx, prev_low_plus_sens, tmp; + Word16 cand_high, prev_low; + Word16 *sc_idx; + Word16 *cand_pairs_buf; + Word16 *cand_pairs; + Word16 *fsc_idx; + })); +#endif +#ifdef WMOPS + push_wmops("PhECU::peak_locator_fx(1st)"); +#endif + sc_idx = (Word16 *)scratchAlign(scratchBuffer, 0); /* ByteSize = 2 * (1+ inp_len+1) */ + cand_pairs_buf = (Word16 *)scratchAlign(sc_idx, sizeof(*sc_idx) * (1+inp_len+1)); /* ByteSize = 2 * (1+ 1+ inp_len+1 ) */ + fsc_idx = (Word16 *)scratchAlign(cand_pairs_buf , sizeof(*cand_pairs_buf) * (1+ 1+ inp_len+1)); /* ByteSize = 2 * ( 1+ inp_len + 1) */ + ASSERT((4 * maxLprot_Red) >= 3 * (1 + 1 + inp_len + 1)); /* basic buffer check */ + UNUSED(maxLprot_Red); + + inp_len_minus1 = sub(inp_len, 1); /* size of delta=derivative array ,and last index in inp */ + + cand_pairs = &cand_pairs_buf[1]; /* ptr init , make space for storing a lowest amplitude value in location -1 */ + pairs_start = 1; move16(); /* adjusted to zero or 1 or 2 when/if, DC is injected as sc_idx[0], or initial plateau skipped */ + + p_tmp = &(sc_idx[pairs_start]); /* ptr init */ + + + /* xor high/low pairs of delta_inp and save sign changes */ + prev_delta = sub(inp[1], inp[0]); /* precompute very first delta */ + + FOR(n = 1; n < inp_len_minus1; n++) + { /* sign change analysis */ + curr_delta = sub(inp[n + 1], inp[n]); /* n+1 ,n , are loop ptrs */ + if (s_xor(prev_delta, curr_delta) < 0) /* a "0" delta treated as a positive sign */ + { + *p_tmp++ = n; move16(); /* store sign change bin locations , location n in the inp[] signal */ + } + prev_delta = curr_delta; move16(); + } + + L_sub(0, 0); /* account for length calculaton */ + k = (Word16)(p_tmp - &(sc_idx[pairs_start])); + + + /* copy sign change location values to a pairs array */ + /* leave one initial sc_idx location open for a potential initial DC value */ + + ASSERT(pairs_start >= 0 && ((k - 1) + pairs_start) < (inp_len +2)); + FOR(j = 0; j < k; j++) + { + cand_pairs[j + pairs_start] = inp[sc_idx[j + pairs_start]]; move16(); move16(); /* the indirect should be calculated */ + } + + + /* filter away a potential single initial/trailing plateau + to enable correct analysis for adding DC or fs/2 bins */ + + logic16(); + IF((sub(k, 2) >= 0) && + (sub(cand_pairs[pairs_start], cand_pairs[pairs_start + 1]) == 0)) + { + pairs_start = add(pairs_start, 1); + k = sub(k, 1); + } + + /* filter away potential single trailing plateu */ + pairs_end = sub(add(pairs_start,k), 1); /* point to last established sign change element */ + logic16(); + if ((sub(k, 2) >= 0) && + (sub(cand_pairs[sub(pairs_end,1)], cand_pairs[pairs_end]) == 0)) + { + k = sub(k, 1); + } + pairs_end = sub(add(pairs_start,k), 1); /* recalc ptr to last element */ + + + /* conditionally add high/lows on both sides of input (pre_dc or fin) as candidates */ + add_dc_flag = 0; move16(); + add_fin_flag = 0; move16(); + + + IF(sub(k, 1) == 0) /* one single sign change found special case */ + { + if (sub(inp[0], cand_pairs[pairs_start]) != 0) + { + add_dc_flag = 1; move16(); /* not plateau */ + } + + if (sub(cand_pairs[pairs_end], inp[inp_len_minus1]) != 0) + { + add_fin_flag = 1; move16(); /* not plateau */ + } + } + + IF(sub(k, 2) >= 0) + { + delta_predc = sub(cand_pairs[pairs_start + 1], cand_pairs[pairs_start]); + delta_fin = sub(cand_pairs[pairs_end], cand_pairs[pairs_end - 1]); + + /* plateaus are allowed to be detected by xor sign change, + but still not allowed at the start nor at the end */ + + add_dc_flag = 1; move16(); + if (sub(inp[0], cand_pairs[pairs_start]) == 0) + { + add_dc_flag = 0; move16(); /* plateau down or , plateus up., --> do not add DC */ + } + + logic16(); + if ((sub(inp[0], cand_pairs[pairs_start]) < 0) && (delta_predc > 0)) + { + add_dc_flag = -1; move16(); /*UP - up ... replace */ + } + logic16(); + if ((sub(inp[0], cand_pairs[pairs_start]) > 0) && (delta_predc < 0)) + { + add_dc_flag = -1; move16(); /* DOWN - down ... % replace */ + } + + add_fin_flag = 1; move16(); + if (sub(cand_pairs[pairs_end], inp[inp_len_minus1]) == 0) + { + add_fin_flag = 0; move16(); /* up - plateau ... */ + } + logic16(); + if ((delta_fin > 0) && (sub(cand_pairs[pairs_end], inp[inp_len_minus1]) < 0)) + { + add_fin_flag = -1; move16(); /* up - UP ... % replace , hard to hit */ + } + logic16(); + if ((delta_fin < 0) && (sub(cand_pairs[pairs_end], inp[inp_len_minus1]) > 0)) + { + add_fin_flag = -1; move16(); /*down - DOWN ... % replace */ + } + + } + + IF(add_dc_flag > 0) + { /* add DC */ + pairs_start = sub(pairs_start, 1); + cand_pairs[pairs_start] = inp[0]; move16(); + sc_idx[pairs_start] = 0; move16(); + ASSERT(pairs_start >= 0 && pairs_start <= 2); + k = add(k, 1); + } + IF(add_dc_flag < 0) + { /* -1 --> replace with DC*/ + cand_pairs[pairs_start] = inp[0]; move16(); + sc_idx[pairs_start] = 0; move16(); + ASSERT(pairs_start >=0 && pairs_start <= 2); + } + + IF(add_fin_flag > 0) + { /* add FS/2 */ + pairs_end = add(pairs_end, 1); + cand_pairs[pairs_end] = inp[inp_len_minus1]; move16(); + sc_idx[pairs_end] = inp_len_minus1; move16(); + k = add(k, 1); + } + IF(add_fin_flag < 0) + { /* -1, replace tail with FS/2*/ + cand_pairs[pairs_end] = inp[inp_len_minus1]; move16(); + sc_idx[pairs_end] = inp_len_minus1; move16(); + } + /* preliminary cand_pairs now only have highs , lows , no initial/trailing plateaus */ + + + /* we allow the DC/FsBy2 lows to be used as the candidatelLow */ + low_val_cand_pairs = inp_low; move16(); + val_range = sub( inp_high, low_val_cand_pairs); /* used to determine if search is useful at all */ + + logic16(); + if ((sub(val_range, RES_fx) < 0) || + (sub( inp_high, sens) < 0)) + { + k = 0; move16(); + } + + logic16(); + if ((k == 0) && (sub(val_range, sens) >= 0)) + { + k = 1; move16(); + } + + + IF(sub(k, 2) > 0) + { + /* low, high, low, ... or + high, low, high, ...*/ + + cand_phase_start = pairs_start; move16(); /*assume first candidate is a high */ + if (sub(cand_pairs[pairs_start], cand_pairs[pairs_start + 1]) < 0) + { + cand_phase_start = add(pairs_start, 1); /* first is a low, --> skip to next higher cand */ + } + + /* high, low, high, ... */ + tmp = k; move16(); + if (sub(cand_phase_start, pairs_start) != 0) + { + tmp = sub(tmp, 1); + } + num_pairs = shr(tmp, 1); + n_tail_values = sub(tmp, shl(num_pairs, 1)); + + /* filter preliminary sign changes into sensitivity filtered sign changes */ + + *n_fsc = 0; move16(); /* counter of filtered fsc_idx */ + cand_high = low_val_cand_pairs; move16(); + cand_idx = -1; move16(); /* sentinel location for no high cand found yet. */ + cand_pairs[-1] = low_val_cand_pairs; move16(); + + prev_low = low_val_cand_pairs; move16(); + prev_low_plus_sens = add(prev_low, sens); + + /* filter loop for high - low sign change pairs */ + /* idx_high, idx_low are raw pointers into the cand_pairs and sc_idx arrays */ + + FOR( idx_high = cand_phase_start; idx_high < (cand_phase_start + 2 * num_pairs); idx_high += 2) + { + idx_low = idx_high+1; /* loop ptr increase */ + + /* new high candidate larger than previous candidate and */ + /* sensitivity still larger than the the previous low */ + tmp = s_max(cand_high, prev_low_plus_sens); + if(sub(cand_pairs[idx_high], tmp) > 0) + { + cand_idx = idx_high; move16(); /* enable or shift candidate position fwd */ + } + cand_high = cand_pairs[cand_idx]; move16(); /* NB, cand_pairs[-1] , has the low_val_cand_pairs value stored */ + + /* now check the fwd idx_low of the current {high,low} pair */ + prev_low = s_min(cand_pairs[idx_low], prev_low); + + tmp = sub(cand_high, sens); + IF(sub(tmp, cand_pairs[idx_low]) > 0) + { + /* this low point is now low enough to fix a previous high candidate */ + + fsc_idx[*n_fsc] = cand_idx; move16(); /*% add cand high idx -> output idx list*/ + *n_fsc = add(*n_fsc, 1); + + prev_low = cand_pairs[idx_low]; move16(); /* use this value as new low estimate */ + cand_idx = -1; move16(); /* no candidate until next pair or tail bin, and pt to lowVal */ + cand_high = low_val_cand_pairs; move16(); /* enable next candidate to be selected immediately */ + } + prev_low_plus_sens = add(prev_low, sens); + } /* { high, low} FOR loop */ + + logic16(); + IF((n_tail_values == 0) && (cand_idx >= 0)) + { + /* no tail low or high value to analyze + still may need to lock a non-locked but qualified candidate */ + fsc_idx[*n_fsc] = cand_idx; move16(); + *n_fsc = add(*n_fsc, 1); + } + + + /* cand_pairs vector may have a last orphan value */ + IF(n_tail_values > 0) + { + /* cand_pairs vector may have a last orphan tail value */ + /* + logic boils down to if (nTailValues > 0) && (cand_pairs(n_end) > tmp) + there is a last one trailing high to process + + a) the last high, may be a new high Peak if we have not yet + locked the current candidate + b) if we have locked the last candidate, the last high may also be + a highpeak if it is high enough from the(newly set previous) valley floor. + + tmp=a||b + */ + + tmp = s_max(cand_high, prev_low_plus_sens); + tmp = sub(cand_pairs[pairs_end], tmp); + IF(tmp > 0) + { + fsc_idx[*n_fsc] = pairs_end; move16(); + *n_fsc = add(*n_fsc, 1); + } + ELSE + { + IF(cand_idx >= 0) + { /* we have a previously established high candidate */ + fsc_idx[*n_fsc] = cand_idx; move16(); + *n_fsc = add(*n_fsc, 1); + } + + } + } + /* move high locations info from fsc_idx , to output */ + FOR(j = 0; j < *n_fsc; j++) + { + ASSERT(fsc_idx[j] >= 0 && fsc_idx[j] < (inp_len+2)); + int_plocs[j] = sc_idx[fsc_idx[j]]; move16(); move16(); /* the indirect moves are calculated */ + } + + } /* end of pairs + [tail] section filtering */ + ELSE + { + /* constant/single rise or constant decay or very low overall values, cases */ + *n_fsc = 0; move16(); + + logic16(); + tmp = sub(inp_high, sens); + IF((k != 0) && (sub(tmp, low_val_cand_pairs) > 0)) + { + /* low,high */ + /* high,low */ + tmp = plc_phEcu_find_ind_fx(inp, inp_len, inp_high); move16(); + int_plocs[0] = tmp; move16(); /* simply locate the high peak*/ + *n_fsc = 1; move16(); + if (tmp < 0) + { /*safety in case max value index was not found */ + *n_fsc = 0; move16(); + } + } + } +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif +} + diff --git a/lib_lc3plus/plc_phecu_setf0hz_fx.c b/lib_lc3plus/plc_phecu_setf0hz_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..b21488af47bbeaee83b60ba1651b525e2a110151 --- /dev/null +++ b/lib_lc3plus/plc_phecu_setf0hz_fx.c @@ -0,0 +1,62 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +/* +st_PhECU_f0minLtp=55; % 55.4 Hz +st_PhECU_f0maxLtp=376; % 376.4706 Hz + +*/ + + +Word16 +plc_phEcuSetF0Hz_fx(/* output Q7 bin frequency [0.. 255.xxxx] "1 sign, 8 bits mantissa, 7 binomial" [0-255.9999] */ + Word16 fs_idx, Word16 old_pitch_int, Word16 old_pitch_fr) +{ + Word16 pitch_lagQ2, result, expo; + Word32 L_result, L_tmp; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("plc_phEcuSetF0Hz_fx", sizeof(struct { + Word16 pitch_lagQ2, result, expo; + Word32 L_result, L_tmp; + Word16 num_FsByResQ0[5]; + })); +#endif + +#ifdef WMOPS + push_wmops("PhECU::plc_phEcuSetF0Hz_fx"); +#endif + + result = 0; move16(); + IF (old_pitch_int != 0) + { + pitch_lagQ2 = add( + old_pitch_fr, + shl(old_pitch_int, 2)); /* lag at the current fs_idx , max lag_value is is 228(+.75)*48/12.8 = 858 in Q0 */ + + L_result = plc_phEcu_ratio_fx(L_deposit_h(num_FsByResQ0[fs_idx]), L_deposit_h(pitch_lagQ2), &expo); + L_tmp = L_shl_sat(L_result, sub(11, expo)); /* move to Q7, in high word to allow round*/ + result = round_fx(L_tmp); + } +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + + return result; /*Q7*/ +} + + diff --git a/lib_lc3plus/plc_phecu_tools_fx.c b/lib_lc3plus/plc_phecu_tools_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..c9eb49e022da486a67737346615e097258abba34 --- /dev/null +++ b/lib_lc3plus/plc_phecu_tools_fx.c @@ -0,0 +1,249 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +/* initilize a short vector */ +void plc_phEcu_initWord16(Word16 * vec, /*i/o : short vector pointer */ + const Word16 value, /*i : short initialization value */ + const Word16 len) /*i : number of elements */ +{ + Counter n; + + FOR (n = 0; n < len; n++) + { + vec[n] = value; move16(); + } +} + +/* scale inplace with allowed saturation in upscaling , function not available in basop_util */ +void Scale_sig_sat(Word16 x[], /* i/o: signal to scale Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +) +{ + Counter i; + Word16 tmp; + IF (exp0 > 0) + { + FOR (i = 0; i < lg; i++) + { + x[i] = shl_sat(x[i], exp0); move16(); /* no saturation warnings triggered here */ + } + return; + } + IF (exp0 < 0) + { + tmp = shl(-32768, s_max(exp0, -15)); /* we use negative to correctly represent 1.0 */ + FOR (i = 0; i < lg; i++) + { + x[i] = msu_r(0, x[i], tmp); move16(); /* msu instead of mac because factor is negative */ + } + return; + } +} + +void plc_phEcu_minval_fx(const Word16 *inp, /* i : vector */ + const Word16 len, /* i : length */ + Word16 *minvalPtr /* o : min value Ptr */ +) +{ + Word16 minTmp; + Counter pos; + + minTmp = inp[0]; move16(); + assert(len>1); + FOR (pos = 1; pos < len; pos++) + { + minTmp = s_min(inp[pos], minTmp); + } + + *minvalPtr = minTmp; move16(); +} + +void plc_phEcu_maxval_fx(const Word16 *inp, /* i : vector */ + const Word16 len, /* i : length */ + Word16 *maxvalPtr /* o : *maxvalPtr */ +) +{ + Word16 maxTmp; + Counter pos; + + maxTmp = inp[0]; move16(); + + assert(len>1); + FOR (pos = 1; pos < len; pos++) + { + maxTmp = s_max(inp[pos], maxTmp); + } + *maxvalPtr = maxTmp; move16(); +} + +/* in case a value (e.g max or min) is already known , find the first corresponding array index */ +Word16 plc_phEcu_find_ind_fx( /* o : output maximum indx 0.. len-1 */ + const Word16 *inp, /* i : vector */ + const Word16 len, /* i : length */ + const Word16 val /* i : value to find */ +) +{ + Word16 val_ind; + Counter pos; + + val_ind = -1; move16(); + + FOR(pos = 0; pos < len; pos++) + { + if (sub(inp[pos], val) == 0) + { + val_ind = pos; move16(); + } + } + return val_ind; +} + +/*----------------------------------------------------------------------------- + * ratio_fx() + * + * Divide the numerator by the denominator. + *----------------------------------------------------------------------------*/ +Word16 plc_phEcu_ratio_fx( /* o : quotient in Q14 */ + const Word32 numer, /* i : numerator */ + const Word32 denom, /* i : denominator */ + Word16 *expo) /* o : req shift of quotient */ +{ + Word16 expNumer, expDenom; + Word16 manNumer, manDenom; + Word16 quotient; +#ifdef DYNMEM_COUNT + Dyn_Mem_In("plc_phEcu_ratio_fx", sizeof(struct { + Word16 expNumer, expDenom; + Word16 manNumer, manDenom; + Word16 quotient; + })); +#endif + + expDenom = norm_l(denom); /* exponent */ + manDenom = extract_h(L_shl(denom, expDenom)); /* mantissa */ + expNumer = norm_l(numer); /* exponent */ + manNumer = extract_h(L_shl(numer, expNumer)); /* mantissa */ + manNumer = shr_pos(manNumer, 1); /* Ensure the numerator < the denominator */ + quotient = div_s(manNumer, manDenom); /* in Q14 */ + + *expo = sub(expNumer, expDenom); +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif + return quotient; /* Q14 */ +} + +Word32 winEnCalc( /* o: output summed energy Ltot */ + const Word16 *x, /* i: Input signal */ + const Word16 headroom_shift, /* i: headroom_shift */ + const Word16 *win, /* i: left side Window coefficients */ + const Word16 rectLength, /* i: Offset in between the 1st and 2nd symmetric halves of the Hamming window */ + const Word16 halfLength, /* i: Half of the total length of a complete Hamming window. */ + Word16 *exp /* i/o : i exp of Word16 variable x , o:Lexp of output Word32 sum */ + ) +{ + Counter i; + Word32 L_tot; + const Word16 *pX, *pW; + Word16 tmp, tmp_RL; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("PhEcu::GF::winEnCalc", sizeof(struct { + Counter i; + Word32 L_tot; + const Word16 *pX, *pW; + Word16 tmp, tmp_RL; + })); +#endif + + +#ifdef WMOPS + push_wmops("PhECU::winEnCalc"); +#endif + + L_tot = INT_MAX; move32(); /*acc is on negative side , but as all accumulation is positive, we make use of one extra bit */ + pX = x; + pW = win; + + + assert( headroom_shift>=0 ); + FOR (i = 0; i < halfLength; i++) /* 1st symmetric half of the Hamming window */ + { + tmp = mult(*pX++, *pW++); + tmp = shr_pos(tmp, headroom_shift); /* shr may/create bias on the negative side , costly options are shr_r or use msu_r */ + L_tot = L_msu0(L_tot, tmp, tmp); /* acc on negative energy side */ + } + + /* Periodic filter - one more rect sample before end tapering */ + tmp_RL = add(rectLength, 1); + ASSERT(rectLength != 0); + + FOR (i = 0; i < tmp_RL; i++) /* If rectLength is zero, it's a pure Hamming window; otherwise Hamming-Rectangular. */ + { + tmp = shr_pos( *pX++, headroom_shift); + L_tot = L_msu0(L_tot, tmp, tmp); /* acc on negative side */ + } + + tmp_RL = sub(halfLength, 1); + ASSERT(rectLength != 0); + + FOR (i = 0; i < tmp_RL; i++) /* 2nd symmetric half of the Hamming window. */ + { + tmp = mult(*pX++, *(--pW)); + tmp = shr_pos(tmp, headroom_shift); + L_tot = L_msu0(L_tot, tmp, tmp); + } + + /* Lexp = 2*(incoming_exp + dnshift) + 1 , 2x for square + 1(for msu0 DSP dn shift)*/ + *exp = add(shl_pos(add(*exp, headroom_shift),1),1); + + /* handle wrap on zero point */ + IF( L_tot >= 0 ) + { /* L_tot positive --> less than 32 bits needed, */ + L_tot = L_add(L_tot,(INT_MIN+1)); + if( L_tot == 0 ) + { + *exp = LTOT_MIN_EXP; /* WC is actually (-(15+4)*2 + 1 +1 -31) */ ; move16(); + } + L_tot = L_min(L_tot, -1); /* make sure there is energy for future ratio calculations */ + } + ELSE + { /* L_tot negative --> more than 31 bits needed for sum , scale 32 bit sum within 31 bits and adjust exp */ + + L_tot = L_shr_pos(L_add(L_tot,1),1); /* rnd by adding 1, then use 50% contribution from negative side */ + L_tot = L_add(L_tot, INT_MIN>>1); /* add 50% contribution from positive side */ + + *exp = add(*exp, 1); move16(); + } + + L_tot = L_max( -(INT_MAX), L_tot); /* guard against max accumulation on the negative side , should only occur for rectangle windows */ + L_tot = L_negate(L_tot); /* no saturation here */ + + /* activate when xfp_exp is not used any longer */ + /* pre-maximize the mantissa for the following steps in burst_ana_dx */ + tmp = norm_l(L_tot); + L_tot = L_shl(L_tot,tmp); + *exp = sub(*exp, tmp); move16(); + +#ifdef WMOPS + pop_wmops(); +#endif +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif + + return L_tot; +} + diff --git a/lib_lc3plus/plc_tdac_fx.c b/lib_lc3plus/plc_tdac_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..43b85be6d38c45624c672d6aa913e087e3eed238 --- /dev/null +++ b/lib_lc3plus/plc_tdac_fx.c @@ -0,0 +1,225 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +/* + * processTdac_fx + * + * Parameters: + * ola_mem o: pointer of output signal Q0 + * ola_mem_exp o: exponent of output signal Q0 + * synth i: pointer of input signal Q0 + * synth_exp i: exponent of input signal Q0 + * win i: pointer of analysis and synthesis window Q0 + * la_zeroes i: number of zeroes Q0 + * frame_len i: frame length Q0 + * + * Function: + * + * + * Returns: + * void + */ +void processTdac_fx(Word16 *ola_mem, Word16 *ola_mem_exp, const Word16 *synth_inp, const Word16 synth_exp_inp, +#ifdef ENABLE_HR_MODE + const Word32 *win, +#else + const Word16 *win, +#endif + const Word16 la_zeroes, const Word16 frame_len, Word8 *scratchBuffer) +{ + Counter i; + Word16 s; + Word16 L; + Word16 N; + Word16 NZ; + Word16 LD2; + Word32 sz; + Word16 INV_NORM; + Word16 INV_NORM_E; + Word16 smax; + Word16 * synth; + Word16 synth_len; + Word16 synth_exp; +#ifdef ENABLE_HR_MODE + const Word32 *win1, *win2, *win3, *win4; +#else + const Word16 *win1, *win2, *win3, *win4; +#endif + const Word16 *synth1; + const Word16 *synth2; + Word16 * ola_mem1; + Word16 * ola_mem2; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processTdac_fx", sizeof(struct { + Counter i; + Word16 s; + Word16 L; + Word16 N; + Word16 NZ; + Word16 LD2; + Word32 sz; + Word16 INV_NORM; + Word16 INV_NORM_E; + Word16 smax; + Word16 * synth; + Word16 synth_len; + Word16 synth_exp; + const Word16 *win1; + const Word16 *win2; + const Word16 *win3; + const Word16 *win4; + const Word16 *synth1; + const Word16 *synth2; + Word16 * ola_mem1; + Word16 * ola_mem2; + })); +#endif + + synth = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * MAX_LEN */ + + ASSERT(la_zeroes <= frame_len / 2); + + L = frame_len; move16(); + LD2 = shr_pos(L, 1); + NZ = sub(LD2, la_zeroes); + + /* inverse normalization of sqrt(2/N) inside window */ +#ifdef ENABLE_HR_MODE + IF ((sub(frame_len, 960) == 0) || (sub(frame_len, 720) == 0)) + { + INV_NORM = negate(shl_pos(frame_len, (15 - 10))); + INV_NORM_E = 3; move16(); + } + ELSE +#endif + { + INV_NORM = negate(shl_pos(frame_len, (15 - 9))); + INV_NORM_E = 2; move16(); + if (norm_s(INV_NORM) > 0) + { + INV_NORM = shl_pos(INV_NORM, 1); + INV_NORM_E = 1; move16(); + } + if (sub(frame_len, 120) <= 0) + { + INV_NORM_E = add(INV_NORM_E, 2); + } + if (sub(frame_len, 20) <= 0) + { + INV_NORM_E = add(INV_NORM_E, 2); + } +#ifdef FIX_PLC_CONFORM_ISSUES + if (sub(frame_len, 30) == 0) + { + INV_NORM_E = add(INV_NORM_E, 2); + } +#endif + } + + /* Scale input */ + synth_len = sub(shl_pos(L, 1), la_zeroes); + s = getScaleFactor16(synth_inp, synth_len); + + FOR (i = 0; i < synth_len; i++) + { + synth[i] = shl(synth_inp[i], s); move16(); + } + synth_exp = sub(synth_exp_inp, s); + + /* calculate x_ov[L+la_zeroes] ... x_ov[2*L-1] */ + + win1 = &win[L + LD2 - 1]; + win2 = &win[L + LD2]; + + win3 = &win[LD2 - 1]; + win4 = &win[LD2]; + + synth1 = &synth[L + LD2 - 1 - la_zeroes]; + synth2 = &synth[L + LD2 - la_zeroes]; + + ola_mem1 = &ola_mem[LD2 - la_zeroes]; + ola_mem2 = &ola_mem[LD2 - la_zeroes - 1]; + + smax = 15; move16(); + + FOR (i = 0; i < NZ; i++) + { + /* analysis windowing + 2N -> N */ + sz = L_mac_sat(L_mult(*synth1, extractW16(*win1)), *synth2, extractW16(*win2)); + + /* N -> 2N + synthesis windowing */ + *ola_mem1 = round_fx(Mpy_32_16_lc3plus(sz, extractW16(*win3))); move16(); + *ola_mem2 = round_fx(Mpy_32_16_lc3plus(sz, extractW16(*win4))); move16(); + + /* determine headroom */ + s = norm_s(*ola_mem1); + if (*ola_mem1 != 0) + smax = s_min(smax, s); + s = norm_s(*ola_mem2); + if (*ola_mem2 != 0) + smax = s_min(smax, s); + + /* pointer update */ + win1--; + win2++; + win3--; + win4++; + synth1--; + synth2++; + ola_mem1++; + ola_mem2--; + } + + N = LD2; move16(); + + FOR (; i < N; i++) + { + /* analysis windowing + 2N -> N */ + sz = L_mult(*synth1, extractW16(*win1)); + + /* N -> 2N + synthesis windowing */ + *ola_mem1 = round_fx(Mpy_32_16_lc3plus(sz, extractW16(*win3))); move16(); + + /* determin headroom */ + s = norm_s(*ola_mem1); + if (*ola_mem1 != 0) + smax = s_min(smax, s); + + /* pointer update */ + win1--; + win2++; + win3--; + synth1--; + synth2++; + ola_mem1++; + } + + smax = s_min(smax, 15); + + N = add(N, NZ); + + FOR (i = 0; i < N; i++) + { + ola_mem[i] = round_fx(L_mult(shl(ola_mem[i], smax), INV_NORM)); move16(); + } + + *ola_mem_exp = sub(add(synth_exp, INV_NORM_E), smax); move16(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + + diff --git a/lib_lc3plus/plc_tdc_inverse_odft_fx.c b/lib_lc3plus/plc_tdc_inverse_odft_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..3eb4cdc6a62dde241f12decb9125dd8ef7739520 --- /dev/null +++ b/lib_lc3plus/plc_tdc_inverse_odft_fx.c @@ -0,0 +1,147 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +void processInverseODFT_fx(Word32 *r_fx, Word16 *r_fx_exp, Word32 *d2_fx, Word16 d2_fx_exp, Word16 n_bands, + Word16 lpc_order, Word8 *scratchBuffer) +{ + Counter i; + Word16 s; + Word16 n_bands2; + Word32 * x; + const Word32 *inv_odft_twiddle_re; + const Word32 *inv_odft_twiddle_im; + Word8 * buffer_BASOP_rfftN; + + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processInverseODFT_fx", sizeof(struct { + Counter i; + Word16 s; + Word16 n_bands2; + Word32 * x; + const Word32 *inv_odft_twiddle_re; + const Word32 *inv_odft_twiddle_im; + Word8 * buffer_BASOP_rfftN; + Word32 * params[2]; + })); +#endif + + x = scratchAlign(scratchBuffer, 0); /* Size = 320 bytes */ + buffer_BASOP_rfftN = scratchAlign(x, sizeof(*x) * (MAX_BANDS_NUMBER_PLC + MAX_BANDS_NUMBER_PLC/2)); /* Size = 480 bytes */ + + ASSERT(lpc_order <= M); +#ifdef FIX_PLC_CONFORM_ISSUES + ASSERT(n_bands == 80 || n_bands == 60 || n_bands == 40 || n_bands == 30 || n_bands == 20); +#else + ASSERT(n_bands == 80 || n_bands == 60 || n_bands == 40 || n_bands == 20); +#endif + + n_bands2 = shr_pos_pos(n_bands, 1); + + test(); +#ifdef FIX_PLC_CONFORM_ISSUES + IF( sub(n_bands, 20) == 0 || sub( n_bands, 30) == 0 || sub( n_bands, 60) == 0 ) +#else + IF( sub(n_bands, 20) == 0 || sub( n_bands, 60) == 0 ) +#endif + { + /* sort input samples */ + FOR (i = 0; i < n_bands2; i++) + { + x[2*i] = d2_fx[2 * i]; move32(); + x[2*i+1] = 0; move32(); + x[n_bands + 2*i] = d2_fx[n_bands - 1 - 2 * i]; move32(); + x[n_bands + 2*i + 1] = 0; move32(); + } + BASOP_cfft(&x[0], &x[1], n_bands, 2, &d2_fx_exp, (Word32*)buffer_BASOP_rfftN); + } + ELSE + { + /* sort input samples */ + FOR (i = 0; i < n_bands2; i++) + { + x[i] = d2_fx[2 * i]; move32(); + x[n_bands2 + i] = d2_fx[n_bands - 1 - 2 * i]; move32(); + } + + BASOP_rfftN(x, n_bands, &d2_fx_exp, buffer_BASOP_rfftN); + } + + inv_odft_twiddle_re = inv_odft_twiddle_80_re; + inv_odft_twiddle_im = inv_odft_twiddle_80_im; + IF (sub(n_bands, 20) == 0) + { + inv_odft_twiddle_re = inv_odft_twiddle_20_re; + inv_odft_twiddle_im = inv_odft_twiddle_20_im; + } +#ifdef FIX_PLC_CONFORM_ISSUES + ELSE IF(sub(n_bands, 30) == 0 ) + { + inv_odft_twiddle_re = inv_odft_twiddle_30_re; + inv_odft_twiddle_im = inv_odft_twiddle_30_im; + } +#endif + ELSE IF (sub(n_bands, 40) == 0) + { + inv_odft_twiddle_re = inv_odft_twiddle_40_re; + inv_odft_twiddle_im = inv_odft_twiddle_40_im; + } + ELSE IF (sub(n_bands, 60) == 0) + { + inv_odft_twiddle_re = inv_odft_twiddle_60_re; + inv_odft_twiddle_im = inv_odft_twiddle_60_im; + } + + s = norm_l(x[0]); + + /* imag[0] is always zero */ + r_fx[0] = L_shl_pos(x[0], s); move32(); + + /* r_fx[0] = r_fx[0] * 1.0001 */ + r_fx[0] = Mpy_32_32_lc3plus(r_fx[0], 0x4001A36E); move32(); + IF (norm_l(r_fx[0]) > 0) + { + r_fx[0] = L_shl_pos(r_fx[0], 1); + } + ELSE + { + s = sub(s, 1); + } + + /* post-twiddle */ + FOR (i = 1; i <= lpc_order; i++) + { + r_fx[i] = L_add(Mpy_32_32_lc3plus(L_shl(x[2 * i], s), inv_odft_twiddle_re[i - 1]), + Mpy_32_32_lc3plus(L_shl(x[2 * i + 1], s), inv_odft_twiddle_im[i - 1])); move32(); + } + + *r_fx_exp = sub(d2_fx_exp, s); move16(); + + /* r_fx[0] must not be zero */ + IF (r_fx[0] == 0) + { + r_fx[0] = (Word32)0x7FFFFFFF; move32(); + FOR (i = 1; i <= lpc_order; i++) + { + r_fx[i] = 0; move32(); + } + *r_fx_exp = 0; move16(); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + + diff --git a/lib_lc3plus/plc_tdc_lagwin_fx.c b/lib_lc3plus/plc_tdc_lagwin_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..2de348eb2fa876f1ca6b79f5460db7b3dfd2add3 --- /dev/null +++ b/lib_lc3plus/plc_tdc_lagwin_fx.c @@ -0,0 +1,34 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +void processLagwin_fx(Word32 r[], const Word32 w[], Word16 m) +{ + /* Start Processing */ + Counter i; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processLagwin_fx", sizeof(struct { Counter i; })); +#endif + + FOR (i = 0; i < m; i++) + { + r[i + 1] = Mpy_32_32_lc3plus(r[i + 1], w[i]); move32(); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + + diff --git a/lib_lc3plus/plc_tdc_main_fx.c b/lib_lc3plus/plc_tdc_main_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..56e62f21bc5ea71fac22c08b5ed78fa89fd2c9d5 --- /dev/null +++ b/lib_lc3plus/plc_tdc_main_fx.c @@ -0,0 +1,1268 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +/*****************************************************************************/ + +static Word16 TDC_Dot_product(const Word16 x[], const Word16 y[], const Word16 lg); +static Word32 TDC_L_Dot_product(const Word16 x[], const Word16 y[], const Word16 lg); +static void TDC_highPassFiltering_fx(const Word16 L_buffer, Word16 exc2[], const Word16 l_fir_fer, + const Word16 *hp_filt); +static Word32 TDC_calcGainp(Word16 x[], Word16 y[], Word16 lg); +static void TDC_calcGainc(Word16 *exc, Word16 Q_exc, Word16 old_fpitch, Word16 lg, LC3PLUS_FrameDuration frame_dms, Word16 lp_gainp, Word32 *lp_gainc); +static void TDC_random_fx(Word16 *seed, Word16 lg, Word16 *y); +static Word16 TDC_preemph(Word16 *x, const Word16 fac, const Word16 lg); +static void TDC_LPC_residu_fx(const Word16 *a, Word16 *x, Word16 *y, Word16 lg, Word16 m); +static void TDC_deemph_fx(const Word16 *x, Word16 *y, const Word16 fac, const Word16 lg, const Word16 mem); +static void TDC_LPC_synthesis_fx(const Word16 sh, const Word16 a[], const Word16 x[], Word16 y[], const Word16 lg, + const Word16 m); +static void TDC_normalize_energy_fx(Word16 *gain, Word16 *gain_exp, const Word16 *x, const Word16 lg); + +#ifdef FIX_TDC_BURST_ERROR +const Word16 beforeNextIncArray_fx[5][8] = { + { 0, 0, 0, 0, 0, 0, 0, 1 }, + { 0, 0, 0, 1, 0, 0, 0, 1 }, + { 0, 1, 0, 1, 0, 1, 0, 1 }, + { 0, 1, 1, 1, 0, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1 } +}; +const Word16 nextIncArray_fx[5][8] = { + { 1, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 0, 0, 0, 1, 0, 0, 0 }, + { 1, 0, 1, 0, 1, 0, 1, 0 }, + { 1, 0, 1, 1, 1, 0, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1 } +}; +#else +const Word16 beforeNextIncArray_fx[4][4] = {{0,0,0,1}, + {0,1,0,1}, + {0,1,1,1}, + {1,1,1,1}}; +const Word16 nextIncArray_fx[4][4] = {{1,0,0,0}, + {1,0,1,0}, + {1,0,1,1}, + {1,1,1,1}}; +#endif + +static Word16 type_2_alpha_long(Word16 nbLostFramesInRow, LC3PLUS_FrameDuration frame_dms); +static Word16 powWord16rest(Word16 base, Word16 exp, Word16 rest); + +/*****************************************************************************/ + + +/* + * processTimeDomainConcealment_Apply_fx + * + * Parameters: + * pitch_int i : integer pitch lag Q0 + * preemphFac_fx i : preemphase factor Q15 + * A_fx i : lp filter coefficients Qx + * pcmbufHist_fx i : pointer to input signal Qq_fx_old_exp + * frame_length i : frame length Q0 + * fs_idx i : sample rate index Q0 + * nbLostFramesInRow i : number of consecutive lost frames Q0 + * overlap i : overlap length Q0 + * stabFac_fx i : stability factor Q15 + * fract i/o: fraction of lag Q0 + * seed_fx i/o: pointer to seed Q0 + * gain_p_fx i/o: pointer to gainp Q15 + * gain_c_fx i/o: pointer to gainc 15Q16 + * synth_fx o : pointer to synthesized signal Q_syn + * Q_syn o : exponent for synthesized signal Q0 + * alpha o : damping factor Q15 + * scratchBuffer i : scratch buffer + * + * Function: + * Perform the time domain concealment. + * + * Returns: + * void + */ +void processTimeDomainConcealment_Apply_fx(const Word16 pitch_int, const Word16 preemphFac_fx, const Word16 *A_fx, + const Word16 lpc_order, const Word16 *pcmbufHist_fx, const Word16 frame_length, + const LC3PLUS_FrameDuration frame_dms, const Word16 fs_idx, const Word16 nbLostFramesInRow, + const Word16 overlap, const Word16 stabFac_fx, Word16 *fract, + Word16 *seed_fx, + Word32 *gain_c_fx, Word16 *synth_fx, Word16 *Q_syn, Word16 *alpha, Word16 max_len_pcm_plc, + Word16 harmonicBuf_fx[MAX_PITCH], Word16 synthHist_fx[M], Word16 *const harmonicBuf_Q, + Word8 *scratchBuffer + , UWord8 plc_fadeout_type + ,Word16 * alpha_type_2_table +) +{ + Counter i; + Word16 s, s1, c1, c2, len, cnt, g_fx, ilen, Tc, nextInc, beforeNextInc; + Word32 tmp32, tmp32_2, gainc_tmp; + Word16 gain_p_fx; + Word32 gain_c_32_fx; + Word16 gain_c_16_fx, gain_c_16_fx_exp, gain_inov_fx, gain_inov_fx_exp, ilen_exp; + Word16 hpBlendFac; + Word16 len_pi_lf_2, frame_length_2, step_fx, step_n_fx, gain_h_fx, nbLostCmpt_loc, mem_deemph; + Word16 * synth_mem_fx, *synth_tmp_fx, *exc2_fx, *exc_fx, *pt_exc, *pt1_exc, *x_pre_fx; + Word16 * harmonicBufPtr; + Word16 Q_exc = 0, exp_scale; + const Word16 *hp_filt_fx, *TDC_high_harm; + Word16 alphaPrev_fx; + Word16 throttle; + Word16 frame_dms_idx, nbLostFramesInRow_mod; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processTimeDomainConcealment_Apply_fx", sizeof(struct { + Counter i; + Word16 s, s1, c1, c2, len, cnt, g_fx, ilen, Tc, nextInc, beforeNextInc; + Word32 tmp32, tmp32_2, gainc_tmp; + Word16 gain_p_fx; + Word32 gain_c_32_fx; + Word16 gain_c_16_fx, gain_c_16_fx_exp, gain_inov_fx, gain_inov_fx_exp, ilen_exp; + Word16 hpBlendFac; + Word16 len_pi_lf_2, frame_length_2, step_fx, step_n_fx, gain_h_fx, nbLostCmpt_loc, mem_deemph; + Word16 * synth_mem_fx, *synth_tmp_fx, *exc2_fx, *exc_fx, *pt_exc, *pt1_exc, *x_pre_fx; + Word16 * harmonicBufPtr; + Word16 Q_exc, exp_scale; + const Word16 *hp_filt_fx, *TDC_high_harm; + Word16 alphaPrev_fx; + Word16 throttle; + Word16 frame_dms_idx, nbLostFramesInRow_mod; + })); +#endif + + Word32 plc_fadeout_len = 0; + if (plc_fadeout_type >= 1){ + plc_fadeout_len = PLC_FADEOUT_TYPE_1_IN_MS; + } + else{ + plc_fadeout_len = PLC_FADEOUT_IN_MS; + } + + /* len of output signal */ + len = add(frame_length, overlap); + + int frame_dms_val = 0; + SWITCH (frame_dms) + { +#ifdef FIX_TDC_BURST_ERROR +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: frame_dms_val = 1; break; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: frame_dms_val = 2; break; + case LC3PLUS_FRAME_DURATION_5MS: frame_dms_val = 4; break; + case LC3PLUS_FRAME_DURATION_7p5MS: frame_dms_val = 6; break; + case LC3PLUS_FRAME_DURATION_10MS: frame_dms_val = 8; break; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + default: assert( 0 ); +#else +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: frame_dms_val = 125; break; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: frame_dms_val = 250; break; + case LC3PLUS_FRAME_DURATION_5MS: frame_dms_val = 500; break; + case LC3PLUS_FRAME_DURATION_7p5MS: frame_dms_val = 750; break; + case LC3PLUS_FRAME_DURATION_10MS: frame_dms_val = 1000; break; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); +#endif + } + +#ifdef FIX_TDC_BURST_ERROR + nbLostFramesInRow_mod = sub( nbLostFramesInRow, 1 ) & 0x0007; + nbLostCmpt_loc = L_add(L_shr(L_mult0(frame_dms_val, sub(nbLostFramesInRow, 1)), 3), 1); + if (sub(frame_dms_val, 1) == 0) + { + frame_dms_idx = 0; + } + else + { + frame_dms_idx = shr(frame_dms, 1); + } + beforeNextInc = beforeNextIncArray_fx[frame_dms_idx][nbLostFramesInRow_mod]; + nextInc = nextIncArray_fx[frame_dms_idx][nbLostFramesInRow_mod]; +#else + nbLostFramesInRow_mod = sub(nbLostFramesInRow, 1) & 0x0003; + + frame_dms_idx = mult(frame_dms_val/10, 0x051F); + nbLostCmpt_loc = add(shr(L_mult0(frame_dms_idx, sub(nbLostFramesInRow, 1)), 2), 1); + frame_dms_idx = sub(frame_dms_idx, 1); + beforeNextInc = beforeNextIncArray_fx[frame_dms_idx][nbLostFramesInRow_mod]; move16(); + nextInc = nextIncArray_fx [frame_dms_idx][nbLostFramesInRow_mod]; move16(); +#endif + + IF (sub(nbLostCmpt_loc, plc_fadeout_len / 10) > 0) + { + gain_p_fx = 0; move16(); + *gain_c_fx = 0; move32(); + *Q_syn = 0; move16(); + *alpha = 0; move16(); + basop_memset(synth_fx, 0, len * sizeof(Word16)); +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif + return; + } + + frame_length_2 = shr_pos(frame_length, 1); + + Tc = pitch_int; move16(); + if (sub(*fract, 0) > 0) + { + Tc = add(Tc, 1); + } + + len_pi_lf_2 = add(Tc, frame_length_2); + + /*---------------------------------------------------------------- + * Buffer Initialization + * + * exc_fx synth_mem_fx + * |--exc_buf_past--|--exc_buf_curr--|--syn_mem--|--x_pre--| + * |--exc2--| + * |--syn--| + * + *---------------------------------------------------------------*/ + + /* pointer inits */ + exc_fx = (Word16 *)scratchAlign(scratchBuffer, + sizeof(Word16) * len_pi_lf_2); /* MAX_PITCH+MAX_LEN/2 + MAX_LEN+MDCT_MEM_LEN_MAX */ + synth_mem_fx = (Word16 *)scratchAlign(exc_fx, sizeof(*exc_fx) * len); /* M */ + x_pre_fx = (Word16 *)scratchAlign(synth_mem_fx, sizeof(*synth_mem_fx) * lpc_order); /* MAX_PITCH+MAX_LEN/2+M+1 */ + exc2_fx = (Word16 *)scratchAlign(synth_mem_fx, sizeof(*synth_mem_fx) * lpc_order); /* MAX_LEN+MDCT_MEM_LEN_MAX+TDC_L_FIR_HP-1 */ + synth_tmp_fx = (Word16 *)scratchAlign(synth_mem_fx, sizeof(*synth_mem_fx) * lpc_order); /* MAX_LEN+MDCT_MEM_LEN_MAX */ + /* Buffers 'overlap' since they are not used at the same time */ + + /*---------------------------------------------------------------* + * LPC Residual * + *---------------------------------------------------------------*/ + IF (sub(nbLostFramesInRow, 1) == 0) + { + + /* copy buffer to pre-emphasis buffer */ + cnt = add(len_pi_lf_2, lpc_order + 1); + basop_memmove(&x_pre_fx[0], &pcmbufHist_fx[max_len_pcm_plc - cnt], cnt * sizeof(Word16)); + + /* apply pre-emphasis to the signal; x_pre = x_pre_flt * 2^(q_fx_old_exp-15-Q_exc+1) */ + Q_exc = TDC_preemph(&(x_pre_fx[1]), preemphFac_fx, sub(cnt, 1)); + + /* copy memory for LPC synth */ + basop_memmove(&synth_mem_fx[0], &x_pre_fx[len_pi_lf_2 + 1], lpc_order * sizeof(Word16)); + + /* LPC Residual; exc = exc_fx * 2^(q_fx_old_exp-15-Q_exc) */ + TDC_LPC_residu_fx(A_fx, &(x_pre_fx[lpc_order + 1]), &(exc_fx[-len_pi_lf_2]), len_pi_lf_2, lpc_order); + } + + /*---------------------------------------------------------------* + * Calculate gains * + *---------------------------------------------------------------*/ + + IF (sub(nbLostFramesInRow, 1) == 0) + { + IF (sub(pitch_int, Tc) == 0) + { + gain_p_fx = + round_fx_sat(L_shl_sat(TDC_calcGainp(&(x_pre_fx[lpc_order + Tc + 1]), &(x_pre_fx[lpc_order + 1]), frame_length_2), 15)); + } + ELSE + { + tmp32 = TDC_calcGainp(&(x_pre_fx[lpc_order + Tc + 1]), &(x_pre_fx[lpc_order + 2]), frame_length_2); + tmp32_2 = TDC_calcGainp(&(x_pre_fx[lpc_order + Tc + 1]), &(x_pre_fx[lpc_order + 1]), frame_length_2); + + IF (L_sub(tmp32, tmp32_2) > 0) + { + Tc = pitch_int; move16(); + gain_p_fx = round_fx_sat(L_shl_sat(tmp32, 15)); + *fract = 0; move16(); + } + ELSE + { + gain_p_fx = round_fx_sat(L_shl_sat(tmp32_2, 15)); + } + } + + if (gain_p_fx < 0) + { + gain_p_fx = 0; move16(); + } + + IF (sub(pitch_int, Tc) == 0) + { + /* gain_c = gain_c_32_fx * 2^(q_fx_old_exp-31) */ + TDC_calcGainc(exc_fx, Q_exc, Tc, frame_length_2, frame_dms, gain_p_fx, &gain_c_32_fx); + } + ELSE + { + TDC_calcGainc(exc_fx, Q_exc, pitch_int, frame_length_2, frame_dms, gain_p_fx, &tmp32); + TDC_calcGainc(exc_fx, Q_exc, Tc , frame_length_2, frame_dms, gain_p_fx, &gain_c_32_fx); + + gain_c_32_fx = L_min(gain_c_32_fx, tmp32); move32(); + } + } + ELSE + { + gain_c_32_fx = *gain_c_fx; move32(); + gain_p_fx = *alpha; + } + + /*---------------------------------------------------------------* + * Damping factor * + *---------------------------------------------------------------*/ + + alphaPrev_fx = 0x7FFF; move16(); + IF (sub(nbLostFramesInRow,1) > 0) + { + alphaPrev_fx = *alpha; move16(); + } + IF (sub(plc_fadeout_type,2) == 0 ){ + *alpha = alpha_type_2_table[nbLostFramesInRow]; + } + ELSE{ + IF (nextInc != 0) + { + IF (sub(nbLostCmpt_loc, 1) == 0) + { + /* Threshold 31470 is 0.98^2 in Q15 format */ + IF (sub(gain_p_fx, 31470) > 0) + { + *alpha = 0x7D71; /*0.98f*/ + move16(); + } + /* Threshold 28037 is 0.925^2 in Q15 format */ + ELSE IF (sub(gain_p_fx, 28037) < 0) + { + *alpha = 0x7666; /*0.925f*/ + move16(); + } + ELSE + { + exp_scale = 0; + *alpha = Sqrt16(gain_p_fx, &exp_scale); move16(); + *alpha = shl(*alpha, exp_scale); + } + } + ELSE + { + SWITCH (nbLostCmpt_loc) + { + case 2: + c1 = 0x50A4; /*0.630f*/ + move16(); + c2 = 0x2CCD; /*0.350f*/ + move16(); + BREAK; + default: + c1 = 0x5375; /*0.652f*/ + move16(); + c2 = 0x29FC; /*0.328f*/ + move16(); + BREAK; + } + + *alpha = mult_r(stabFac_fx, c2); + *alpha = add(*alpha, c1); + + *alpha = mult(gain_p_fx, *alpha); + + + IF (sub(nbLostCmpt_loc, 2) == 0) + { + if (sub(*alpha, 0x75A2 /*0.919f*/) < 0) + { + *alpha = 0x75A2; move16(); + } + } + ELSE IF (sub(nbLostCmpt_loc, 5) > 0) + { + gain_p_fx = *alpha; move16(); + } + } + } + + IF (sub(nbLostCmpt_loc,3) > 0) + { + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: *alpha = mult(*alpha, PLC34_ATTEN_FAC_125_FX); BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: *alpha = mult(*alpha, PLC34_ATTEN_FAC_025_FX); BREAK; + case LC3PLUS_FRAME_DURATION_5MS: *alpha = mult(*alpha, PLC34_ATTEN_FAC_025_FX); BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: *alpha = mult(*alpha, PLC34_ATTEN_FAC_075_FX); BREAK; + case LC3PLUS_FRAME_DURATION_10MS: *alpha = mult(*alpha, PLC34_ATTEN_FAC_100_FX); BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + } + if (sub(nbLostCmpt_loc, 5) > 0) + { + gain_p_fx = *alpha; move16(); + } + } + + /*---------------------------------------------------------------* + * Construct the harmonic part * + * Last pitch cycle of the previous frame is repeatedly copied. * + *---------------------------------------------------------------*/ + + pt_exc = harmonicBuf_fx; move16(); + pt1_exc = exc_fx - Tc; move16(); + s = s_min(len, Tc); move16(); + test(); + IF (sub(nbLostFramesInRow, 1) == 0) + { + *harmonicBuf_Q = Q_exc; move16(); + IF (sub(stabFac_fx, 32767 /*1.f Q15*/) >= 0) + { + basop_memmove(pt_exc, pt1_exc, Tc * sizeof(Word16)); + } + ELSE + { + /* These values are necessary for the last five filtered samples */ + basop_memmove(exc_fx, &exc_fx[-Tc], (TDC_L_FIR_HP-1)/2 * sizeof(Word16)); + TDC_high_harm = TDC_high_32_harm; + if (sub(fs_idx, 1) <= 0) + { + TDC_high_harm = TDC_high_16_harm; + } + FOR (i = 0; i < Tc; i++) + { + pt_exc[i] = TDC_Dot_product(&pt1_exc[i-(TDC_L_FIR_HP-1)/2], TDC_high_harm, TDC_L_FIR_HP); + } + } + } + ELSE + { + Q_exc = *harmonicBuf_Q; move16(); + } + + + /*---------------------------------------------------------------* + * Construct the random part of excitation * + *---------------------------------------------------------------*/ + + TDC_random_fx(seed_fx, add(len, sub(TDC_L_FIR_HP, 1)), exc2_fx); + + /* high pass noise */ + hp_filt_fx = TDC_high_32; + if (sub(fs_idx, 1) <= 0) + { + hp_filt_fx = TDC_high_16; + } + + IF (sub(nbLostFramesInRow, 1) == 0) + { + TDC_highPassFiltering_fx(len, exc2_fx, TDC_L_FIR_HP, hp_filt_fx); + } + ELSE + { + throttle = div_s(nbLostCmpt_loc, add(nbLostCmpt_loc, PLC3_HPBLENDTHROTTLE)); + hpBlendFac = mult(sub(0x7FFF, *alpha), throttle); + c1 = sub(0x7FFF, hpBlendFac); + FOR (i = 0; i < len; i++) + { + /* Return value of dot product is Q1 */ + tmp32 = Mpy_32_16_lc3plus(TDC_L_Dot_product(&exc2_fx[i], hp_filt_fx, TDC_L_FIR_HP), c1 /*Q15*/); + exc2_fx[i] = round_fx(L_mac0(tmp32, hpBlendFac, exc2_fx[i+TDC_L_FIR_HP/2])); move16(); + } + } + + /* normalize energy */ + TDC_normalize_energy_fx(&gain_inov_fx, &gain_inov_fx_exp, exc2_fx, frame_length); + tmp32 = Mpy_32_16_lc3plus( + L_sub(590558016l /*1.1 Q29*/, Mpy_32_16_lc3plus(L_shr_pos(L_deposit_h(gain_p_fx), 2), 24576 /*0.75*/)) /*Q29*/, + gain_inov_fx /*Q15,gain_inov_e*/); /*Q29,gain_inov_e*/ + s = norm_l(tmp32); + tmp32 = L_shl_pos(tmp32, s); + tmp32 = L_min(tmp32, 0x7FFEFFFF); + gain_inov_fx_exp = add(sub(gain_inov_fx_exp, s), 31 - 29); /*->Q31*/ + gain_inov_fx = round_fx(tmp32); /*Q15,gain_inov_e*/ + + /* gains */ + gain_h_fx = alphaPrev_fx; move16(); + + /* update steps */ + if (frame_length == 720) + { + ilen = BASOP_Util_Divide1616_Scale((Word16)1, 960, &ilen_exp); + } else { + ilen = BASOP_Util_Divide1616_Scale((Word16)1, frame_length, &ilen_exp); + } + step_fx = round_fx(L_shl(L_mult(sub(gain_h_fx, *alpha), ilen), ilen_exp)); + + s = norm_l(gain_c_32_fx); + tmp32 = L_shl_pos(gain_c_32_fx, s); + + gain_c_16_fx = extract_h(tmp32); + gain_c_16_fx_exp = sub(15, s); + gainc_tmp = L_mult (gain_c_16_fx, div_s(*alpha, s_max(alphaPrev_fx, 1))); + tmp32 = L_sub (tmp32, gainc_tmp); + step_n_fx = round_fx(L_shl(Mpy_32_16_lc3plus(tmp32, ilen), ilen_exp)); + + /*---------------------------------------------------------------* + * Construct the total excitation * + *---------------------------------------------------------------*/ + + harmonicBufPtr = harmonicBuf_fx + ((nbLostFramesInRow - 1) * frame_length) % Tc; + + s1 = add(Q_exc, add(gain_inov_fx_exp, gain_c_16_fx_exp)); + cnt = add(frame_length, TDC_L_FIR_HP / 2); + + g_fx = mult_r(gain_c_16_fx, gain_inov_fx); + + FOR (i = 0; i < len; i++) + { + /* harmonic */ + if (harmonicBufPtr - harmonicBuf_fx >= Tc) { + harmonicBufPtr = harmonicBuf_fx; + } + exc_fx[i] = *harmonicBufPtr++; + tmp32 = L_mult(exc_fx[i], gain_h_fx); + /* random */ + tmp32_2 = L_shl_sat(L_mult(exc2_fx[i], g_fx), s1); + /* total */ + exc_fx[i] = round_fx_sat(L_add_sat(tmp32, tmp32_2)); move16(); + /* update */ + gain_h_fx = s_max(sub(gain_h_fx, step_fx), 0); + gain_c_16_fx = s_max(sub(gain_c_16_fx, step_n_fx), 0); + g_fx = mult_r(gain_c_16_fx, gain_inov_fx); + } + + /* update gain */ + *gain_c_fx = L_shl(gainc_tmp, sub(gain_c_16_fx_exp, 15)); move32(); + + + /*----------------------------------------------------------* + * Compute the synthesis speech * + *----------------------------------------------------------*/ + + /* introduce some headroom to avoid Overflows, 2 bit seem to be sufficient */ + *Q_syn = sub(Q_exc, 2); + *Q_syn = s_max(*Q_syn, -3); + + exp_scale = sub(*Q_syn, Q_exc - 1); + + IF (sub(nbLostFramesInRow, 1) != 0) + { + synth_mem_fx = synthHist_fx; + } + Copy_Scale_sig(synth_mem_fx, &synth_tmp_fx[-lpc_order], lpc_order, exp_scale); + TDC_LPC_synthesis_fx(sub(Q_exc, *Q_syn), A_fx, exc_fx, synth_tmp_fx, len, lpc_order); + + FOR (i=0; i= 0); + synth_fx[i] = mult(synth_fx[i], gain_h_fx); + gain_h_fx = sub(gain_h_fx, step_fx); + } + basop_memset(&synth_fx[frame_length], 0, overlap * sizeof(Word16)); + } + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + + +/*****************************************************************************/ + +static Word32 syn_kern_2(Word32 L_tmp, const Word16 a[], const Word16 y[]) +{ + L_tmp = L_msu_sat(L_tmp, y[-1], a[1]); + L_tmp = L_msu_sat(L_tmp, y[-2], a[2]); + return L_tmp; +} + +static Word32 syn_kern_4(Word32 L_tmp, const Word16 a[], const Word16 y[]) +{ + L_tmp = syn_kern_2(L_tmp, a, y); + return syn_kern_2(L_tmp, a + 2, y - 2); +} + +static Word32 syn_kern_8(Word32 L_tmp, const Word16 a[], const Word16 y[]) +{ + L_tmp = syn_kern_4(L_tmp, a, y); + return syn_kern_4(L_tmp, a + 4, y - 4); +} + +static Word32 syn_kern_16(Word32 L_tmp, const Word16 a[], const Word16 y[]) +{ + L_tmp = syn_kern_8(L_tmp, a, y); + return syn_kern_8(L_tmp, a + 8, y - 8); +} + +/* + * TDC_Dot_product + * + * Parameters: + * x i: x vector Q0 + * y i: y vector Q0 + * lg i: vector length Q0 + * + * Function: + * dot product + * + * Returns: + * dot product Q0 + */ +static Word16 TDC_Dot_product(const Word16 x[], const Word16 y[], const Word16 lg) +{ + Dyn_Mem_Deluxe_In( + Counter i; + Word32 sum; + ); + + sum = L_mult(x[0], y[0]); + FOR (i = 1; i < lg-1; i++) + { + sum = L_mac_sat(sum, x[i], y[i]); + } + + sum = mac_r_sat(sum, x[lg-1], y[lg-1]); + + Dyn_Mem_Deluxe_Out(); + + return sum; +} + +/* + * TDC_L_Dot_product + * + * Parameters: + * x i: x vector Q0 + * y i: y vector Q0 + * lg i: vector length Q0 + * + * Function: + * dot product + * + * Returns: + * dot product Q1 + */ +static Word32 TDC_L_Dot_product(const Word16 x[], const Word16 y[], const Word16 lg) +{ + Dyn_Mem_Deluxe_In( + Counter i; + Word32 sum; + ); + + sum = L_mac0(1L, x[0], y[0]); + FOR (i = 1; i < lg; i++) + { + sum = L_mac0(sum, x[i], y[i]); + } + + Dyn_Mem_Deluxe_Out(); + + return sum; +} + +/* + * TDC_highPassFiltering_fx + * + * Parameters: + * L_buffer i: buffer length + * exc2 i: unvoiced excitation before the high pass filtering Qx/Qx+1 + * l_fir_fer i: length highpass filter + * hp_filt i: highpass filter coefficients Q15 + * + * Function: + * Highpass filter + * + * Returns: + * void + */ +static void TDC_highPassFiltering_fx(const Word16 L_buffer, Word16 exc2[], const Word16 l_fir_fer, + const Word16 *hp_filt) +{ + Dyn_Mem_Deluxe_In( + Counter i; + ); + + FOR (i = 0; i < L_buffer; i++) + { + exc2[i] = round_fx(L_sub(TDC_L_Dot_product(&exc2[i], hp_filt, l_fir_fer), 1)); move16(); + } + + Dyn_Mem_Deluxe_Out(); +} + +/* + * TDC_calcGainc + * + * Parameters: + * exc i: pointer to excitation buffer + * Q_exc i: Q format of excitation buffer + * old_fpitch i: pitch_int + * lg i: length + * lp_gainp i: gain p + * lp_gainc o: pointer to gain (15Q16) + * + * Function: + * Gain calculation + * + * Returns: + * void + */ +static void TDC_calcGainc(Word16 *exc, Word16 Q_exc, Word16 old_fpitch, Word16 lg, LC3PLUS_FrameDuration frame_dms, Word16 lp_gainp, Word32 *lp_gainc) +{ + Dyn_Mem_Deluxe_In( + Word16 tmp16, tmp_e, tmp2_e; + Word32 L_tmp, L_tmp_max; + Counter i; + ); + + L_tmp = L_deposit_l(0); + + FOR (i = 0; i < lg; i++) + { + /* gain_c += ( exc[-i-1] - *gain_p * exc[-i-1-pitch_int] ) * ( exc[-i-1] - *gain_p * exc[-i-1-pitch_int] ); */ + tmp16 = sub_sat(exc[i - lg] /*Q1*/, mult_r(lp_gainp /*Q15*/, exc[i - lg - old_fpitch] /*Q1*/) /*Q1*/); + L_tmp = L_mac0_sat(L_tmp, tmp16, tmp16); /*Q3*/ + } + + IF (sub(frame_dms, LC3PLUS_FRAME_DURATION_10MS) < 0) + { + L_tmp_max = L_deposit_l(0); + FOR (i = 0; i < lg; i++) + { + L_tmp_max = L_mac0_sat(L_tmp_max, exc[i - lg], exc[i - lg]); /*Q3*/ + } + L_tmp = L_min(L_tmp, L_tmp_max); + } + + tmp_e = norm_l(L_tmp); + L_tmp = L_shl(L_tmp, tmp_e); + tmp_e = sub(sub(31, shl_pos(Q_exc, 1)), tmp_e); /*L_tmp is Q31, now*/ + tmp16 = BASOP_Util_Divide3216_Scale(L_tmp /*Q31,norm,tmp_e*/, lg /*Q15,15*/, &tmp2_e) /*Q15,tmp2_e+tmp_e-15*/; + tmp_e = sub(add(tmp2_e, tmp_e), 15); + + IF (tmp16 != 0) + { + tmp16 = Sqrt16(tmp16, &tmp_e); /*Q15,norm,tmp_e*/ + tmp_e = L_min(tmp_e, 15); + *lp_gainc = L_shl_pos(L_deposit_l(tmp16), add(tmp_e, 1)); /*15Q16*/ + move32(); + } + ELSE + { + *lp_gainc = 0; + } + + Dyn_Mem_Deluxe_Out(); +} + +/* + * TDC_calcGainp + * + * Parameters: + * x i: input signal + * y i: shifted input signal + * lg i: vector length + * + * Function: + * Gain calculation + * + * Returns: + * gain (15Q16) + */ +static Word32 TDC_calcGainp(Word16 x[], Word16 y[], Word16 lg) +{ + Dyn_Mem_Deluxe_In( + Word32 tcorr, tener, Lgain, L_tmp1, L_tmp2; + Word16 m_corr, m_ener, negative, Q_corr, Q_ener; + Counter i; + ); + + negative = 0; move16(); + + L_tmp1 = L_deposit_l(0); + L_tmp2 = L_deposit_l(0); + FOR (i = 0; i < lg; i += 2) + { + L_tmp1 = L_mac0_sat(L_tmp1, x[i], y[i]); +#ifdef FIX_PLC_CONFORM_ISSUES + IF (i + 1 < lg) + { +#endif + L_tmp2 = L_mac0_sat(L_tmp2, x[i + 1], y[i + 1]); +#ifdef FIX_PLC_CONFORM_ISSUES + } +#endif + } + tcorr = L_add(L_shr_pos(L_tmp1, 1), L_shr_pos(L_tmp2, 1)); + Q_corr = norm_l(tcorr); + tcorr = L_shl(tcorr, Q_corr); + Q_corr = sub(2, Q_corr); + + L_tmp1 = L_deposit_l(0); + L_tmp2 = L_deposit_l(0); + FOR (i = 0; i < lg; i += 2) + { + L_tmp1 = L_mac0_sat(L_tmp1, y[i], y[i]); +#ifdef FIX_PLC_CONFORM_ISSUES + IF (i + 1 < lg) + { +#endif + L_tmp2 = L_mac0_sat(L_tmp2, y[i + 1], y[i + 1]); +#ifdef FIX_PLC_CONFORM_ISSUES + } +#endif + } + tener = L_add(L_shr_pos(L_tmp1, 1), L_shr_pos(L_tmp2, 1)); + Q_ener = norm_l(tener); + tener = L_shl(tener, Q_ener); + Q_ener = sub(2, Q_ener); + + tener = L_max(tener, 1); + + if (tcorr <= 0) + { + negative = 1; move16(); + } + tcorr = L_abs_sat(tcorr); + + m_corr = extract_h(tcorr); + + m_ener = extract_h(tener); + + IF (sub(m_corr, m_ener) > 0) + { + m_corr = shr_pos(m_corr, 1); + Q_corr = add(Q_corr, 1); + } + if (m_ener == 0) + { + move16(); + m_corr = 0x7FFF; + } + if (m_ener != 0) + { + m_corr = div_s(m_corr, m_ener); + } + + Q_corr = sub(Q_corr, Q_ener); + + Lgain = L_shl(L_deposit_l(m_corr), add(Q_corr, 1)); + + if (negative != 0) + { + Lgain = L_negate(Lgain); + } + + Dyn_Mem_Deluxe_Out(); + + return Lgain; +} + +/* + * TDC_LPC_synthesis_fx + * + * Parameters: + * sh i : scaling to apply for a[0] Q0 + * a[] i : LP filter coefficients Qx + * x[] i : input signal Qx + * y[] o : output signal Qx-s + * lg i : size of filtering Q0 + * m i : order of LP filter Q0 + * + * Function: + * Apply LP filtering to obtain synthesis signal. + * Memory size is always m. + * + * Returns: + * void + */ +static void TDC_LPC_synthesis_fx(const Word16 sh, const Word16 a[], const Word16 x[], Word16 y[], const Word16 lg, + const Word16 m) +{ + Dyn_Mem_Deluxe_In( + Counter i; + Word16 a0; + Word16 q; + Word32(*syn_kern)(Word32 L_tmp, const Word16 a[], const Word16 y[] + );); + + ASSERT(m == 16 || m == 8); + + if (sub(m, 16) == 0) + { + syn_kern = syn_kern_16; + } + if (sub(m, 8) == 0) + { + syn_kern = syn_kern_8; + } + + q = add(norm_s(a[0]), 1); + a0 = shr_sat(a[0], sh); + + FOR (i = 0; i < lg; i++) + { + y[i] = round_fx_sat(L_shl_sat(syn_kern(L_mult(a0, x[i]), a, &y[i]), q)); move16(); + } + + Dyn_Mem_Deluxe_Out(); +} + +/* TDC_LPC_residu_fx + * + * Parameters: + * a I: LP filter coefficients (Qx) + * x I: input signal + * y O: output signal + * lg I: size of filtering + * m I: lpc order + * + * Function: + * Apply inverse filtering to obtain LP residual signal. + * + * Returns: + * void + */ +static void TDC_LPC_residu_fx(const Word16 *a, Word16 *x, Word16 *y, Word16 lg, Word16 m) +{ + Dyn_Mem_Deluxe_In( + Word16 a_exp; + Word32 s; + Counter i; + ); + + ASSERT(m == 16 || m == 8); + + a_exp = add(norm_s(a[0]), 1); + a_exp = add(a_exp, 1); + + IF (sub(m, 16) == 0) + { + FOR (i = 0; i < lg; i++) + { + s = L_mult(x[i], a[0]); + s = L_mac_sat(s, x[i - 1], a[1]); + s = L_mac_sat(s, x[i - 2], a[2]); + s = L_mac_sat(s, x[i - 3], a[3]); + s = L_mac_sat(s, x[i - 4], a[4]); + s = L_mac_sat(s, x[i - 5], a[5]); + s = L_mac_sat(s, x[i - 6], a[6]); + s = L_mac_sat(s, x[i - 7], a[7]); + s = L_mac_sat(s, x[i - 8], a[8]); + s = L_mac_sat(s, x[i - 9], a[9]); + s = L_mac_sat(s, x[i - 10], a[10]); + s = L_mac_sat(s, x[i - 11], a[11]); + s = L_mac_sat(s, x[i - 12], a[12]); + s = L_mac_sat(s, x[i - 13], a[13]); + s = L_mac_sat(s, x[i - 14], a[14]); + s = L_mac_sat(s, x[i - 15], a[15]); + s = L_mac_sat(s, x[i - 16], a[16]); + + s = L_shl_sat(s, a_exp); + y[i] = round_fx_sat(s); move16(); + } + } + IF (sub(m, 8) == 0) + { + FOR (i = 0; i < lg; i++) + { + s = L_mult(x[i], a[0]); + s = L_mac_sat(s, x[i - 1], a[1]); + s = L_mac_sat(s, x[i - 2], a[2]); + s = L_mac_sat(s, x[i - 3], a[3]); + s = L_mac_sat(s, x[i - 4], a[4]); + s = L_mac_sat(s, x[i - 5], a[5]); + s = L_mac_sat(s, x[i - 6], a[6]); + s = L_mac_sat(s, x[i - 7], a[7]); + s = L_mac_sat(s, x[i - 8], a[8]); + + s = L_shl_sat(s, a_exp); + y[i] = round_fx_sat(s); move16(); + } + } + + Dyn_Mem_Deluxe_Out(); +} + +/* TDC_random_fx + * + * Parameters: + * seed i/o: seed for random number + * lg i : vector length + * y o : output values + * + * Function: + * Uniform distributed random generator. + * + * Returns: + * random number + */ +static void TDC_random_fx(Word16 *seed, Word16 lg, Word16 *y) +{ + Dyn_Mem_Deluxe_In( + Counter i; + ); + + FOR (i = 0; i < lg; i++) + { + *seed = extract_l(L_mac0(16831L, *seed, 12821)); + *y++ = *seed; move16(); + } + + Dyn_Mem_Deluxe_Out(); +} + +/* + * TDC_preemph + * + * Parameters: + * x i/o: signal Qx + * fac i: preemphasis factor Q15 + * lg i: vector length + * + * Function: + * Filtering through 1 - fac z^-1 + * + * Returns: + * Q-factor + */ +static Word16 TDC_preemph(Word16 *x, const Word16 fac, const Word16 lg) +{ + Dyn_Mem_Deluxe_In( + Word16 fac_sh, Q_max_value, Q_out; + Word32 max_val; + Counter i; + ); + + fac_sh = shr(fac, 3); + Q_max_value = 4096; move16(); + Q_out = 12; move16(); + + max_val = 0; move32(); + FOR (i = sub(lg, 1); i >= 0; i--) + { + max_val = L_max(L_abs(L_msu(L_mult(x[i], Q_max_value), x[i - 1], fac_sh)), max_val); + } + + IF (extract_h(max_val) != 0) + { + Q_out = s_min(s_max(sub(norm_s(extract_h(max_val)), 3), 0), 12); + } + + FOR (i = sub(lg, 1); i >= 0; i--) + { + x[i] = round_fx(L_shl(L_msu(L_mult(x[i], Q_max_value), x[i - 1], fac_sh), Q_out)); move16(); + } + + Dyn_Mem_Deluxe_Out(); + + return sub(Q_out, 2); +} + +/* + * TDC_deemph_fx + * + * Parameters: + * x i: input signal Qx + * y o: output signal Qx + * fac i: deemphasis factor Q15 + * lg i: size of filtering Q0 + * mem i: memory (x[-1]) + * + * Function: + * Filtering through 1/(1-fac z^-1) + * + * Returns: + * void + */ +static void TDC_deemph_fx(const Word16 *x, Word16 *y, const Word16 fac, const Word16 lg, const Word16 mem) +{ + Dyn_Mem_Deluxe_In( + Counter i; + ); + + y[0] = round_fx_sat(L_mac_sat(L_deposit_h(x[0]), mem, fac)); move16(); + FOR (i = 1; i < lg; i++) + { + y[i] = round_fx_sat(L_mac_sat(L_deposit_h(x[i]), y[i - 1], fac)); move16(); + } + + Dyn_Mem_Deluxe_Out(); +} + +/* + * TDC_normalize_energy_fx + * + * Parameters: + * gain o: gain + * gain_exp o: exponent of gain + * x i: input signal + * lg i: length of input signal + * + * Function: + * Normalizes the energy. + * + * Returns: + * void + */ +static void TDC_normalize_energy_fx(Word16 *gain, Word16 *gain_exp, const Word16 *x, const Word16 lg) +{ + Dyn_Mem_Deluxe_In( + Counter i; + Word16 c; + Word16 e; + Word16 e1; + Word16 e2; + Word32 tmp; + Word16 tmp16; + ); + + tmp = 0; move32(); + FOR (i = 0; i < lg; i++) + { + tmp16 = mult_r(x[i], 2048); + tmp = L_mac(tmp, tmp16, tmp16); + } + + e = norm_l(tmp); + tmp = L_shl_pos(tmp, e); + e1 = sub(sub(30, e), -8); move16(); + tmp16 = BASOP_Util_Divide3216_Scale(tmp, lg, &e2); + + e = 0; move16(); + if (tmp16 != 0) + { + e = sub(add(e1, e2), 15); + } + + c = 0x0148; /* 0.01 */ + move16(); + IF (e > 0) + { + c = shr(c, s_min(e, 15)); + } + ELSE + { + tmp16 = shr(tmp16, s_min(negate(e), 15)); + e = 0; move16(); + } + + e2 = 2; move16(); + if (s_and(e, 1)) + { + e2 = 1; move16(); + } + + tmp16 = add(shr_pos(tmp16, e2), shr_pos(c, e2)); + e = add(e, e2); + + tmp16 = Sqrt16(tmp16, &e); + + *gain = BASOP_Util_Divide1616_Scale((Word16)0x7FFF, tmp16, &e1); move16(); + *gain_exp = sub(e1, e); move16(); + + Dyn_Mem_Deluxe_Out(); +} + +static Word16 type_2_alpha_long(Word16 nbLostFramesInRow, LC3PLUS_FrameDuration frame_dms) +{ + Word16 n_help; + Word32 n_shift; + + if (nbLostFramesInRow <= 3*(100.0/(frame_dms*1.25*10))){ + n_help = (nbLostFramesInRow + (100/(frame_dms*1.25*10)) - 1) * (frame_dms*1.25*10); + return powWord16rest(31129,n_help/100,n_help%100); + } + else { + n_shift = (nbLostFramesInRow - 3*(100/(frame_dms*1.25*10))) * 50/(frame_dms*1.25*10); + n_help = (n_shift + (100/(frame_dms*1.25*10)) - 1) * (frame_dms*1.25*10); + return powWord16rest(22937,n_help/100,n_help%100); + } +} + +Word16 type_2_fadeout_fx(Word16 nbLostFramesInRow, LC3PLUS_FrameDuration frame_dms) +{ + Word16 n_help; + Word16 selector = PLC_FADEOUT_TYPE_2_SELECTOR * 2 * (100/(frame_dms*1.25*10)); + + if (selector >= nbLostFramesInRow){ + return type_2_alpha_long(nbLostFramesInRow, frame_dms); + } + else { + n_help = (nbLostFramesInRow + (100/(frame_dms*1.25*10)) - 1) * (frame_dms*1.25*10); + return powWord16rest(16383,n_help/100, n_help%100); + } +} + +static Word16 powWord16rest(Word16 base, Word16 exp, Word16 rest) { + Word32 exp_result = 32767; + Word32 tmp_result; + Word16 root, i, exp2; + + FOR (i = 0; i < exp; ++i) { + tmp_result = (Word32)exp_result * base; + exp_result = (Word16)(tmp_result >> 15); + } + + IF (rest != 0) { + exp2 = 0; + SWITCH (rest) + { + case 50: + root = Sqrt16(base, &exp2); + shr(root,exp2); + exp_result = L_shr(exp_result * root,15); /* 0.5^1.5 = 0.5^(3/2) = 0.5^3*sqrt(0.5) */ + BREAK; + case 25: + root = Sqrt16(base, &exp2); + shr(root,exp2); + exp2 = 0; + root = Sqrt16(root, &exp2); + shr(root,exp2); + exp_result = L_shr(exp_result * root,15); /* 0.5^(1/4) = 0.5^sqrt(sqrt(0.5)) */ + BREAK; + case 75: + root = Sqrt16(base, &exp2); + shr(root,exp2); + exp2 = 0; + root = Sqrt16(root, &exp2); + shr(root,exp2); + tmp_result = powWord16rest(root, 3, 0); + exp_result = L_shr( exp_result * tmp_result,15); + BREAK; + } + } + return (Word16) exp_result; +} diff --git a/lib_lc3plus/plc_tdc_pre_emphasis_fx.c b/lib_lc3plus/plc_tdc_pre_emphasis_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..401bb061b091588b11795d63df8bff33b7c6b03a --- /dev/null +++ b/lib_lc3plus/plc_tdc_pre_emphasis_fx.c @@ -0,0 +1,110 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +void processPreEmphasis_fx(Word32 *d2_fx, Word16 *d2_fx_exp, Word16 fs_idx, Word16 n_bands, LC3PLUS_FrameDuration frame_dms, Word8 *scratchBuffer) +{ + Word16 s; + Word32 nrg; + Word16 smax; + Counter band; + const Word16 *pre_emph; + const Word16 *pre_emph_e; + Word16 * d2_band_fx_exp; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processPreEmphasis_fx", sizeof(struct { + Word16 s; + Word32 nrg; + Word16 smax; + Counter band; + const Word16 *pre_emph; + const Word16 *pre_emph_e; + Word16 * d2_band_fx_exp; + })); +#endif + + d2_band_fx_exp = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * MAX_BANDS_NUMBER_PLC = 160 bytes */ + + pre_emph = lpc_lin_pre_emphasis[fs_idx]; + pre_emph_e = lpc_lin_pre_emphasis_e[fs_idx]; + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: +#ifdef FIX_PLC_CONFORM_ISSUES + pre_emph = lpc_lin_pre_emphasis_1_25ms[fs_idx]; + pre_emph_e = lpc_lin_pre_emphasis_e_1_25ms[fs_idx]; +#endif + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + pre_emph = lpc_lin_pre_emphasis_2_5ms[fs_idx]; + pre_emph_e = lpc_lin_pre_emphasis_e_2_5ms[fs_idx]; + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + pre_emph = lpc_lin_pre_emphasis_5ms[fs_idx]; + pre_emph_e = lpc_lin_pre_emphasis_e_5ms[fs_idx]; + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + pre_emph = lpc_lin_pre_emphasis_7_5ms[fs_idx]; + pre_emph_e = lpc_lin_pre_emphasis_e_7_5ms[fs_idx]; + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + +#ifdef FIX_PLC_CONFORM_ISSUES + ASSERT(n_bands == 20 || n_bands == 30 || n_bands == 40 || n_bands == 60 || n_bands == 80); +#else + ASSERT(n_bands == 20 || n_bands == 40 || n_bands == 60 || n_bands == 80); +#endif + + /* start processing */ + smax = -31; move16(); + + FOR (band = 0; band < n_bands; band++) + { + nrg = Mpy_32_16_lc3plus(d2_fx[band], pre_emph[band]); + + if (nrg == 0) + { + s = 31; move16(); + } + + if (nrg != 0) + { + s = norm_l(nrg); + } + + d2_fx[band] = L_shl_pos(nrg, s); move32(); + d2_band_fx_exp[band] = sub(pre_emph_e[band], s); move16(); + + smax = s_max(smax, d2_band_fx_exp[band]); + } + +/* Rescale band energies */ + FOR (band = 0; band < n_bands; band++) + { + d2_fx[band] = L_shr_pos(d2_fx[band], s_min(sub(smax, d2_band_fx_exp[band]), 31)); move32(); + } + /* Save common exponent for all bands */ + *d2_fx_exp = add(*d2_fx_exp, smax); move16(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + + diff --git a/lib_lc3plus/plc_update_aft_imdct_fx.c b/lib_lc3plus/plc_update_aft_imdct_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..18685f5b411bc8a0bce9d453a9c3b3c7736e7d9d --- /dev/null +++ b/lib_lc3plus/plc_update_aft_imdct_fx.c @@ -0,0 +1,345 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +static void processPLCcomputeStabFac(Word16 scf_q[], Word16 old_scf_q[], Word16 prev_bfi, Word16 *stab_fac); + +void processPLCUpdateAfterIMDCT_fx(Word16 x_fx[], Word16 q_fx_exp, Word16 concealMethod, Word16 xLen, Word16 fs_idx, + Word16 *nbLostFramesInRow, Word16 *prev_prev_bfi, Word16 *prev_bfi, Word16 bfi, Word16 scf_q[], + Word16 *ns_cum_alpha, AplcSetup *plcAd) +{ + Word16 oldLen, usedHistlen; + Word16 scale_fac_old, scale_fac_new, q_theo_new_old, q_theo_new_new, q_new, shift_old, shift_new; + Word16 frontLen, pastLen; + Word16 marginOldPast; + Word16 marginNewXlen, marginOldFront; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processPLCUpdateAfterIMDCT_fx", sizeof(struct { + Word16 oldLen, usedHistlen; + Counter i; + Word16 scale_fac_old, scale_fac_new, q_theo_new_old, q_theo_new_new, q_new, shift_old, shift_new; + Word16 frontLen, pastLen; + Word16 marginOldPast; + Word16 scale_fac_old_dual; + Word16 marginNewXlen, marginOldFront; + })); +#endif + + + + +#ifdef WMOPS + push_wmops("processPLCUpdateAfterIMDCT "); +#endif + + + if (plcAd) + { + /* for short NB frames(2.5 ms) TDC-filtering requires more PCM samples than the plc_xcorr function */ + usedHistlen = plcAd->max_len_pcm_plc; + + + logic16(); + IF( (sub(bfi,1) == 0) && sub(concealMethod, LC3_CON_TEC_PHASE_ECU) == 0 && xLen == (Word16)(((double)LprotSzPtr[fs_idx])*0.625)) + { /* % reduced buffering update length during concealment method 2 as Xsav_fx is stored in the joint q_old_fx and pcmbufHist buffer */ + usedHistlen = sub(usedHistlen, sub(LprotSzPtr[fs_idx], s_min(MAX_BW_BIN, xLen))); + ASSERT(xLen == (Word16)(((double)LprotSzPtr[fs_idx])*0.625)); /*/ only enter here for 10 ms cases */ + + /* actually one can select to always update xLen(10 ms) less samples of x_old_tot, also in TDC-PLC bfi frames ,, and for PhECU.PLC */ + } + oldLen = sub(usedHistlen, xLen); + + /* update ltpf-free pcm history buffer for TD-PLC */ + + basop_memmove(&plcAd->x_old_tot_fx[plcAd->max_len_pcm_plc - usedHistlen], + &plcAd->x_old_tot_fx[plcAd->max_len_pcm_plc - usedHistlen + xLen], oldLen * sizeof(Word16)); + + basop_memcpy(&plcAd->x_old_tot_fx[plcAd->max_len_pcm_plc - xLen], &x_fx[0], xLen * sizeof(Word16)); + +#ifdef ENABLE_HR_MODE + frontLen = 0; + IF (sub(fs_idx, 5) < 0) +#endif + { + frontLen = sub(LprotSzPtr[fs_idx], xLen); /*16-10 = 6ms of the prev_synth/xfp part */ + } + pastLen = sub(oldLen, frontLen); /* ~11.8 ms*/ + + marginOldPast = getScaleFactor16_0(&(plcAd->x_old_tot_fx[plcAd->max_len_pcm_plc - usedHistlen]), pastLen); + marginOldFront = getScaleFactor16_0(&(plcAd->x_old_tot_fx[plcAd->max_len_pcm_plc - usedHistlen + pastLen]), frontLen); + + scale_fac_old = s_min(marginOldFront, marginOldPast); + + frontLen = 0; move16(); + logic16(); logic16(); + IF(bfi == 1 && *prev_bfi == 0 && sub(concealMethod, LC3_CON_TEC_PHASE_ECU) == 0) + { /* prepare localized margin_xfp value for a next bad concealment Method 2 frame */ + frontLen = *nbLostFramesInRow; + frontLen = add(hamm_len2Tab[fs_idx], shr(hamm_len2Tab[fs_idx], 2)); /* find margin in the 3.75 ms front part */ + pastLen = sub(xLen, frontLen); + scale_fac_new = getScaleFactor16_0(&(x_fx[0]), pastLen); + marginNewXlen = getScaleFactor16_0(&(x_fx[0]) + pastLen, frontLen); /* for pHEcuprev_synth in 2nd+ bfi frame */ + + scale_fac_new = s_min(scale_fac_new, marginNewXlen); + } + ELSE + { /* prepare margin value for any coming good frame or any coming first bad frame */ + + marginNewXlen = getScaleFactor16_0(&(x_fx[0]),xLen); /* prevsynth in first bfi frame */ + scale_fac_new = marginNewXlen; move16(); + } + + q_theo_new_old = s_max(plcAd->q_fx_old_exp - scale_fac_old, 0); + q_theo_new_new = s_max(q_fx_exp - scale_fac_new, 0); + + q_new = s_max(q_theo_new_old, q_theo_new_new); + + shift_old = plcAd->q_fx_old_exp - q_new; + shift_new = q_fx_exp - q_new; + + IF(shift_old != 0) + { + Scale_sig(&plcAd->x_old_tot_fx[plcAd->max_len_pcm_plc - usedHistlen], oldLen, shift_old); + logic16(); + test(); + IF ((sub(bfi,1) == 0) && (sub(concealMethod, LC3_CON_TEC_TDPLC) == 0)) + { + plcAd->harmonicBuf_Q -= shift_old; + plcAd->tdc_gain_c = L_shl_sat(plcAd->tdc_gain_c, shift_old); + } + move16(); /* count move to static RAM */ + + marginOldFront = s_min(16, sub(marginOldFront, shift_old)); + } + IF(shift_new) + { + Scale_sig(&plcAd->x_old_tot_fx[plcAd->max_len_pcm_plc - xLen], xLen, shift_new); /* positive shift_new means upshift=less margin */ + marginNewXlen = s_min(16, sub(marginNewXlen, shift_new)); + } + + plcAd->q_fx_old_exp = sub(q_fx_exp, shift_new); + + plcAd->PhECU_margin_xfp = s_min(marginNewXlen, marginOldFront); move16(); /* for pHECU winEncalc xfp energy calculations */ + if (frontLen != 0) + { /* prepare margin value for a first pHECU(16 ms) or a consecutive bad PhEcu frame (3.75ms) */ + plcAd->PhECU_margin_xfp = marginNewXlen; move16(); + } + if (sub(plcAd->PhECU_margin_xfp, 16) == 0) + { + plcAd->PhECU_margin_xfp = 1; move16(); /* "1" --> does not rescale the all-zero vector, inside PhECU */ + } + } + + /* Update PLC params */ + IF(sub(bfi, 1) != 0) + { + /* % reset counters in GF */ + *nbLostFramesInRow = 0; move16(); + *ns_cum_alpha = 32767; move16(); + + if (plcAd) + { + basop_memmove(plcAd->old_old_scf_q, plcAd->old_scf_q, M * sizeof(Word16)); + basop_memmove(plcAd->old_scf_q, scf_q, M * sizeof(Word16)); + + /* PLC fullband transient detector setting for non-bfi frames */ + plcAd->PhECU_short_flag_prev = 0; move16(); /* fullband transient not active */ + } + } + + /* values may be {0,1,2} */ + *prev_prev_bfi = *prev_bfi; move16(); + *prev_bfi = bfi; move16(); + +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +void processPLCcomputeStabFac_main(Word16 scf_q[], Word16 old_scf_q[], Word16 old_old_scf_q[], Word16 bfi, Word16 prev_bfi, + Word16 prev_prev_bfi, Word16 *stab_fac) +{ + IF (sub(bfi, 1) == 0) + { + IF (sub(prev_bfi, 1) != 0) + { + processPLCcomputeStabFac(old_scf_q, old_old_scf_q, prev_prev_bfi, stab_fac); + } + } + ELSE IF(sub(bfi, 2) == 0) + { + processPLCcomputeStabFac(scf_q, old_scf_q, prev_bfi, stab_fac); + } +} + +static void processPLCcomputeStabFac(Word16 scf_q[], Word16 old_scf_q[], Word16 prev_bfi, Word16 *stab_fac) +{ + Counter i; + Word32 tmp32; + Word16 d; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("calculateStabFac", sizeof(struct { + Counter i; + Word32 tmp32; + Word16 d; + })); +#endif + + /* calculate stability factor */ + IF (sub(prev_bfi, 1) == 0) + { + *stab_fac = 26214; move16(); + } + ELSE + { + tmp32 = 0; move32(); + FOR (i = 0; i < M; i++) + { + d = sub(scf_q[i], old_scf_q[i]); + tmp32 = L_mac_sat(tmp32, d, d); + } + tmp32 = L_shl_sat(tmp32, 3); + IF (tmp32 > 0x7D000000 /*1.25*25*/) + { + *stab_fac = 0; move16(); + } + ELSE IF (tmp32 < 0x19003E82 /*0.25*25*/) + { + *stab_fac = 0x7FFF; move16(); + } + ELSE + { + tmp32 = L_shl_pos(L_sub(0x50000000 /*1.25/2*/, Mpy_32_16_lc3plus(tmp32, 0x51EC /*16/25*/)), 1); + *stab_fac = round_fx(tmp32); move16(); + } + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +void processPLCUpdateXFP_w_E_hist_fx(Word16 prev_bfi, Word16 bfi, Word16 *xfp_fx, Word16 xfp_exp_fx, Word16 margin_xfp, + Word16 fs_idx, + Word32 *L_oold_xfp_w_E_fx, Word16 *oold_xfp_w_E_exp_fx, + Word32 *L_old_xfp_w_E_fx, Word16 *old_xfp_w_E_exp_fx, + + Word16 *oold_Ltot_exp_fx ,Word16 *old_Ltot_exp_fx ) + +{ + Word32 L_tot ; + Word16 dn_scale, exp_shift; + Word16 used_xfp_exp_fx; + Word16 exp_out ; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("PLCUpdateXFP_w_E_hist", sizeof(struct { + Word32 L_tot; + Word16 dn_scale, exp_shift; + Word16 used_xfp_exp_fx; + Word16 exp_out; + })); +#endif +#ifdef WMOPS + push_wmops("PhECU::UpdateXfp_w_E_hist_fx"); +#endif + + IF (sub(bfi,1) != 0) + { + + if (sub(prev_bfi,1) == 0) + { + /* only a single historic frame available in the next frame + , force artifical update of oold energy to be the same as old */ + *old_xfp_w_E_exp_fx = LTOT_INIT_FLAG ; move16(); + } + + /* Time shift energy state and xfp exp */ + IF (sub_sat(*old_xfp_w_E_exp_fx, LTOT_INIT_FLAG ) == 0) + { + *L_oold_xfp_w_E_fx = LTOT_MIN_MAN ; move32(); + *oold_xfp_w_E_exp_fx = UNINIT_OR_UNSAFE_OOLD_SENTINEL ; move16(); + } + ELSE + { + *L_oold_xfp_w_E_fx = *L_old_xfp_w_E_fx; move32(); /* regular update */ + *oold_xfp_w_E_exp_fx = *old_xfp_w_E_exp_fx; move16(); + } + + /* Time shift L_tot energy state and L_tot_exp */ + IF (sub_sat(*old_Ltot_exp_fx, LTOT_INIT_FLAG ) == 0) + { + *L_oold_xfp_w_E_fx = LTOT_MIN_MAN ; move32(); + *oold_Ltot_exp_fx = UNINIT_OR_UNSAFE_OOLD_SENTINEL ; move16(); + } + ELSE + { + *L_oold_xfp_w_E_fx = *L_old_xfp_w_E_fx; move32(); /* regular update */ + *oold_Ltot_exp_fx = *old_Ltot_exp_fx; move16(); + } + + + dn_scale = e_tot_headroom[fs_idx]; /* allowed minimum dn_scale for a max upshifted signal */ + used_xfp_exp_fx = xfp_exp_fx; + + IF( margin_xfp > 0 ) /* xfp_fx was normalized on a larger area than 16ms part of pcmBuffer */ + { + ASSERT(bfi !=1) ; /* if bfi was set the margin_xfp does not reflect the correct 16ms part of pcm_buf hist, prev_synth */ + dn_scale = s_max(0, sub(e_tot_headroom[fs_idx], margin_xfp)); + + exp_shift = sub(e_tot_headroom[fs_idx], dn_scale); + used_xfp_exp_fx = sub(xfp_exp_fx, exp_shift); /* the virtual change of the xfp_buffer due to reduced downscaling in L_tot calc */ + } + + /* use semifixed dn_scale as adjusted by margin_xfp in 16 ms region */ + exp_out = xfp_exp_fx; move16(); + L_tot = winEnCalc(xfp_fx, dn_scale , PhECU_wins[fs_idx][0], rectLengthTab[fs_idx], hamm_len2Tab[fs_idx], &exp_out ); + + *L_old_xfp_w_E_fx = L_tot; move32(); + + *old_xfp_w_E_exp_fx = used_xfp_exp_fx ; move16(); + /* this now needs to be in Q1 , used_fx_exp , (exp_out-1-2*e_tot_headroom[fs_idx])/2 */ + + *old_Ltot_exp_fx = exp_out; /* new proper _Ltot value from winEnCalc function */ + + + /* use true Word32 exponent of L_tot */ + + + /* restart oold and old from same state for init or prevBFI cases */ + logic16(); + IF (sub_sat(*oold_xfp_w_E_exp_fx, UNINIT_OR_UNSAFE_OOLD_SENTINEL) <= 0 || /* old xfp_Exp */ + sub_sat(*oold_Ltot_exp_fx, UNINIT_OR_UNSAFE_OOLD_SENTINEL) <= 0 ) /* new L_tot_exp */ + { + *L_oold_xfp_w_E_fx = L_tot; move32(); + *oold_xfp_w_E_exp_fx = used_xfp_exp_fx; move16(); + *oold_Ltot_exp_fx = *old_Ltot_exp_fx; /* use Ltot exp value */ + } + } + +#ifdef WMOPS + pop_wmops(); +#endif +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + + + diff --git a/lib_lc3plus/plc_update_fx.c b/lib_lc3plus/plc_update_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..9cb2b02e4fc6d9056bcd57f9274f71f3d2ac01d9 --- /dev/null +++ b/lib_lc3plus/plc_update_fx.c @@ -0,0 +1,226 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +void processPLCupdate_fx(AplcSetup *plcAd, Word16 x_fx[], Word16 q_fx_exp, Word16 concealMethod, Word16 frame_length, + Word16 fs_idx, Word16 *nbLostFramesInRow, Word16 *prev_prev_bfi, Word16 *prev_bfi, Word16 bfi, Word16 scf_q[], + Word16 *ns_cum_alpha +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif + ) +{ + processPLCUpdateAfterIMDCT_fx(x_fx, q_fx_exp, concealMethod, frame_length, fs_idx, nbLostFramesInRow, prev_prev_bfi, prev_bfi, bfi, + scf_q, ns_cum_alpha, plcAd); /* NB *prev_bfi updated here */ + + IF ( plcAd != 0 ) + { + /* reuse/inplace the most recent 16 ms of x_old_tot without additional rescaling, keep exponent aligned with tdc pitch buffer to save WMOPS */ + + +#ifdef ENABLE_HR_MODE + if (hrmode == 0) +#endif + { + ASSERT( (&plcAd->x_old_tot_fx[plcAd->max_len_pcm_plc - LprotSzPtr[fs_idx] ]) == plcAd->PhECU_xfp_fx ); + plcAd->PhECU_xfp_exp_fx = plcAd->q_fx_old_exp; move16(); /* exponent used by concealmethod 2 in prevBfi frames and also right after non bfi frames */ + } + } +} + +void processPLCupdateSpec_fx(Word16 q_old_d_fx[], Word16 *q_old_fx_exp, Word32 q_d_fx[], Word16 *q_fx_exp, Word16 yLen) +{ + Dyn_Mem_Deluxe_In( + Counter i; + Word16 s; + ); + + /* save spectrum and the corresponding exponent */ + s = getScaleFactor32(q_d_fx, yLen); + + *q_old_fx_exp = sub(*q_fx_exp, s); + + + FOR (i = 0; i < yLen; i++) + { + q_old_d_fx[i] = round_fx_sat(L_shl_sat(q_d_fx[i], s)); /* */ + } + + Dyn_Mem_Deluxe_Out(); +} + +void processPLCspec2shape_fx(Word16 prev_bfi, Word16 bfi, Word16 q_old_d_fx[], Word16 yLen, + Word16 *stPhECU_oold_grp_shape_fx, Word16 *stPhECU_old_grp_shape_fx) + +#define L_GRP_DC 4 + +{ + Counter i,l; + Word16 *pX, tmp; + Word16 N_grp,l_grp; + Word16 man, expo; + Word32 L_acc; + Word32 L_tot; + Word32 L_grp_shape[MAX_LGW]; + Word16 grp_shape[MAX_LGW]; /**/ + Word16 fs_idx,local_prev_bfi; + + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("process_plc_spec_2_shape_fx", sizeof(struct { + Counter i,l; + Word16 *pX; + Word16 N_grp,l_grp; + Word32 L_acc; + Word32 L_tot; + Word32 L_grp_shape[MAX_LGW]; + Word16 fs_idx,local_prev_bfi; + })); +#endif +#ifdef WMOPS + push_wmops("PhECU::GF::process_plc_spec_2_shape_fx"); +#endif + + IF(sub(bfi, 1) != 0) + { + fs_idx = mult(yLen, (Word16)(32768.0 / (99.0))); /* truncation needed , i.e no rounding can be applied here */ + N_grp = xavg_N_grp_fx[fs_idx]; move16(); + + local_prev_bfi = prev_bfi; move16(); + if (sub(local_prev_bfi, 2)==0) + { + local_prev_bfi = 0; move16(); + } + + if( stPhECU_oold_grp_shape_fx[0] < 0 ) + { + local_prev_bfi = 1 ; move16(); /* handle startup in the case 2nd frame is a BFI frame */ + } + + /* Copy old to oold grp shape */ + FOR( i=0; i < MAX_LGW ; i++) + { + stPhECU_oold_grp_shape_fx[i] = stPhECU_old_grp_shape_fx[i]; move16(); + } + + + /* Accumulate DC bin(s) to total */ + pX = q_old_d_fx; /* ptr setup */ + L_tot = L_deposit_h(0); /* acc on negative side */ + + FOR( i= 0; i < L_GRP_DC; i++) + { + tmp = shr_pos(*pX++ ,spec_shape_headroom[fs_idx]); /* scale down upscaled MDCT to create some headroom */ + L_tot = L_msu0(L_tot, tmp, tmp); + + } + + /* Accumulate middle subbands and add to total */ + FOR( i=0; i < sub(N_grp,1) ; i++) + { + + L_acc = L_deposit_h(0); /* acc on negative side */ + l_grp = sub(mdct_grp_bins_fx[i+1], mdct_grp_bins_fx[i]); move16(); + + + + FOR(l=0;l 0) + { + FOR(i=0; i < N_grp ; i++) + { + man = plc_phEcu_ratio_fx(L_grp_shape[i], L_tot, &expo); /* The mantissa is considered in Q15 output in Q14 */ + grp_shape[i] = shr_sat(man, sub(expo,1)); /* gfrom Q14 to in Q15 (Due to saturation, it is automatically bound inside [-1.0,1.0].) */ + } + } + ELSE + { + FOR(i=0; i < N_grp ; i++) + { + grp_shape[i] = GRP_SHAPE_INIT; move16(); + + } + } + + /* copy to output */ + FOR(i=0; i < N_grp ; i++) + { + stPhECU_old_grp_shape_fx[i] = grp_shape[i]; move16(); + } + FOR(i = N_grp; i < MAX_LGW ; i++) + { + stPhECU_old_grp_shape_fx[i] = GRP_SHAPE_INIT; move16(); + } + + + + /* handle oold states for the frame sequence BAD, GOOD, NEXT_BAD */ + if(sub(local_prev_bfi, 1)==0) + { + FOR( i=0; i < MAX_LGW ; i++) + { + stPhECU_oold_grp_shape_fx[i] = stPhECU_old_grp_shape_fx[i] ; move16(); + } + } + + } + +#ifdef WMOPS + pop_wmops(); +#endif +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif + +} + + + + diff --git a/lib_lc3plus/plc_xcorr_fx.c b/lib_lc3plus/plc_xcorr_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..0c3dbb0cfbb0dda48f7e8807699e7522426a69d8 --- /dev/null +++ b/lib_lc3plus/plc_xcorr_fx.c @@ -0,0 +1,252 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +#define MAX_ACCS 3 /* sum(x.*y), sum(x.*x), sum(y.*y), nb of always nonsaturated shorter sub_blocks*/ +#define MAX_BLOCKS 8 +#define MAX_ACC_LEN_BITS 7 +#define MIN_ACC_LEN_BITS 5 +#define MAX_ACC_LEN (1 << MAX_ACC_LEN_BITS) +#define MIN_PITCH_8K 20 /* 8000* MIN_PITCH_12k8/12800 */ + +static const Word16 pitch_min_2[] = {2 * MIN_PITCH_8K , 2 * MIN_PITCH_8K * 2, 2 * MIN_PITCH_8K * 3, + 2 * MIN_PITCH_8K * 4, 2 * MIN_PITCH_8K * 6, 2 * MIN_PITCH_8K * 12}; + +/* req headroom in bits, for safe summing of block results w/o downshift */ +/* also the safe pre subblock acc downshift for various number of blocks */ +static const Word16 tab_req_headroom[MAX_BLOCKS + 1] = {0, 0, 1, 2, 2, 3, 3, 3, 3}; +/*(0, 1, 2, 3,4, 5,6,7,8)*/ + +static Word16 plc_norm_corr_blocks_fx(Word16 tot_len, Word16 l2_base_len, Word16 n_blocks, Word16 inshift, + Word16 *currFrame, Word16 *predFrame); + +Word16 plc_norm_corr_blocks_fx( /* o: norm_corr range [-1 ... 1.0[ in Q15 */ + Word16 tot_len, /* i: total correlation length in Q0 */ + Word16 l2_base_len, /* i: size of subblocks in log2 */ + Word16 n_blocks, /* i: number of accumulator sub_blocks */ + Word16 inshift, /* i: required inshift of curr/pred Q0 */ + Word16 *currFrame, /* i: ptr to most recent section */ + Word16 *predFrame) /* i: ptr to historic section */ +{ + Word16 scale0, scale1, scale2, scale_min, shift, prod_exp, acc_margin; + Word32 L_prod, L_inv, L_tmp0 = 0, L_tmp1 = 0, L_tmp2 = 0; + Word16 norm_corr, curr, pred; + Counter m, b; + Word32 L_ce[MAX_ACCS][MAX_BLOCKS]; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("plc_norm_corr_blocks_fx", sizeof(struct { + Word16 scale0, scale1, scale2, scale_min, shift, prod_exp, acc_margin; + Word32 L_prod, L_inv, L_tmp0, L_tmp1, L_tmp2; + Word16 norm_corr, curr, pred; + Counter m, b; + Word32 L_ce[MAX_ACCS][MAX_BLOCKS]; + })); +#endif + +#ifdef WMOPS + push_wmops("plc_norm_corr_blocks_fx"); +#endif + + /* Calculate normalized correlation with added shift and block interleaving possibility */ + ASSERT(n_blocks <= MAX_BLOCKS && n_blocks > 0); + ASSERT(((float)tot_len / (float)n_blocks) <= (float)(1 << l2_base_len)); + ASSERT(inshift > 0); + UNUSED(l2_base_len); + + FOR (b = 0; b < n_blocks; b++) + { /* block loop with fixed pre_down shifting(inshift) of input signal */ + curr = shr_pos(currFrame[b], inshift); + pred = shr_pos(predFrame[b], inshift); + L_tmp2 = L_deposit_l(0); + L_tmp0 = L_msu0(L_tmp2, curr, pred); /* acc L_tmp0 on negative side to avoid saturation for (-1*-1) */ + L_tmp1 = L_msu0(L_tmp2, pred, pred); /* acc_energy on negative side */ + L_tmp2 = L_msu0(L_tmp2, curr, curr); /* acc_energy on negative side */ + + FOR (m = (b + n_blocks); m < tot_len; m += n_blocks) + { /* interleaved accumulation over total length */ + curr = shr_pos(currFrame[m], inshift); + pred = shr_pos(predFrame[m], inshift); + L_tmp0 = L_msu0(L_tmp0, curr, pred); + L_tmp1 = L_msu0(L_tmp1, pred, pred); + L_tmp2 = L_msu0(L_tmp2, curr, curr); + } + + L_ce[0][b] = L_add(L_tmp0, 0); /* account for moves from register to stack memory */ + L_ce[1][b] = L_add(L_tmp1, 0); + L_ce[2][b] = L_add(L_tmp2, 0); + } + + /* aggregate interleaved subsections */ + IF (sub(n_blocks, 1) >= 0) + { /* 100% safe non saturating L_ce with a safe acc_margin */ + acc_margin = tab_req_headroom[n_blocks]; move16(); + + L_tmp0 = L_shr_pos(L_ce[0][0], acc_margin); + L_tmp1 = L_shr_pos(L_ce[1][0], acc_margin); + L_tmp2 = L_shr_pos(L_ce[2][0], acc_margin); + + FOR (b = 1; b < n_blocks; b++) + { + L_tmp0 = L_add(L_tmp0, L_shr_pos(L_ce[0][b], acc_margin)); /* add negative values */ + L_tmp1 = L_add(L_tmp1, L_shr_pos(L_ce[1][b], acc_margin)); /* add negative values */ + L_tmp2 = L_add(L_tmp2, L_shr_pos(L_ce[2][b], acc_margin)); /* add negative values */ + } + + /* evaluate headroom margin in coarse representation */ + scale0 = norm_l(L_tmp0); + scale1 = norm_l(L_tmp1); + scale2 = norm_l(L_tmp2); + + scale_min = s_min(scale0, scale1); + scale_min = s_min(scale_min, scale2); + + shift = sub(scale_min, acc_margin); + IF (shift >= 0) + { /* re-accumulate blocks with highest possible precision */ + L_tmp0 = L_add(L_ce[0][0], 0); /* add negative values */ + L_tmp1 = L_add(L_ce[1][0], 0); /* add negative values */ + L_tmp2 = L_add(L_ce[2][0], 0); /* add negative values */ + + FOR (b = 1; b < n_blocks; b++) + { + L_tmp0 = L_add(L_tmp0, L_ce[0][b]); /* add negative values */ + L_tmp1 = L_add(L_tmp1, L_ce[1][b]); /* add negative values */ + L_tmp2 = L_add(L_tmp2, L_ce[2][b]); /* add negative values */ + } + } + } + + /* quota: norm_corr = corr/sqrt(en1*en2) = negate(L_tmp1)/sqrt(-L_tmp1*-L_tmp2) */ + L_tmp1 = L_min(L_tmp1, -1); /* make sure there is negative energy */ + L_tmp2 = L_min(L_tmp2, -1); /* make sure there is negative energy */ + + ASSERT(L_tmp1 < 0 && L_tmp2 < 0); + + /* negate correlation, due to the used safe msu0 accumulation, with a saturation pre-check ctrl */ + L_tmp0 = L_max(L_tmp0, (MIN_32 + 1)); + L_tmp0 = L_negate(L_tmp0); + + scale0 = norm_l(L_tmp0); + scale1 = norm_l(L_tmp1); + scale2 = norm_l(L_tmp2); + + L_tmp1 = L_shl_pos(L_tmp1, scale1); + L_tmp2 = L_shl_pos(L_tmp2, scale2); + L_prod = Mpy_32_32_lc3plus(L_tmp1, L_tmp2); /* neg * neg -> positive */ + shift = norm_l(L_prod); + L_prod = L_shl_pos(L_prod, shift); + prod_exp = sub(62, add(add(scale1, scale2), shift)); + L_inv = Isqrt_lc3plus(L_prod, &prod_exp); + + L_tmp0 = L_shl_pos(L_tmp0, scale0); + L_prod = Mpy_32_32_lc3plus(L_tmp0, L_inv); + prod_exp = add(sub(31, scale0), prod_exp); + + norm_corr = 32767; move16(); /* as close to 1.0 as possible in Q15 */ + if (L_tmp0 < 0) + { + norm_corr = -32768; move16(); /*-1.0*/ + } + + test(); + IF (L_prod == 0 || sub(norm_l(L_prod), prod_exp) >= 0) + { + norm_corr = round_fx_sat(L_shl_sat(L_prod, prod_exp)); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + return norm_corr; +} + +Word16 plc_xcorr_lc_fx( /* o: quantized output xcorr in Q15 [ 0 ..32767 ] = [0. 1.0[ */ + Word16 *pcmbuf_fx, /* i: NB should be an already dynamically upscaled pcm buffer with about + 0...1(2) bits margin */ + Word16 max_len_pcm_plc, /* i: Q0 physical size of pcmbuf_fx */ + Word16 pitch_int, /* i: Q0 in Fs, lag value to evaluate, corresponding to the current f0 in + pcm_buf_Fx */ + Word16 fs_idx /*i: */) +{ + Word16 *range1Ptr; + Word16 *range2Ptr; + Word16 corr_len_fx, inshift, l2_base_len, n_blocks, norm_xcorr_est_q, pcm_max_corr_len, max_corr_len; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("plc_xcorr_lc_fx", sizeof(struct { + Word16 *range1Ptr; + Word16 *range2Ptr; + Word16 corr_len_fx, inshift, l2_base_len, n_blocks, norm_xcorr_est_q, pcm_max_corr_len, max_corr_len; + })); +#endif + +#ifdef WMOPS + push_wmops("plc_xcorr_lc_fx"); +#endif + + norm_xcorr_est_q = 0; move16(); + + IF (pitch_int > 0) + { + pcm_max_corr_len = sub(max_len_pcm_plc, pitch_int); + + max_corr_len = rectLengthTab[fs_idx]; /* maximum 10 ms */ + max_corr_len = s_min(max_corr_len, pcm_max_corr_len); + + corr_len_fx = s_min(max_corr_len, pitch_int); + corr_len_fx = s_max(corr_len_fx, pitch_min_2[fs_idx]); /* at least 5 ms (=2*pitchmin*) corr length */ + + ASSERT(corr_len_fx >= (pitch_min_2[fs_idx])); /* at least 2 x pitch min(fs) */ + ASSERT(corr_len_fx <= (MAX_ACC_LEN * MAX_BLOCKS)); + ASSERT(corr_len_fx <= max_corr_len); + ASSERT( max_len_pcm_plc - corr_len_fx - pitch_int + 1 > 0 ); + + range1Ptr = &(pcmbuf_fx[max_len_pcm_plc]) - corr_len_fx; /* ptr setup, start of head section */ + range2Ptr = range1Ptr - pitch_int; /* ptr setup, history = tail - lag distance */ + + /* assume 32 bit acc of up to 32 values -> sum(over 32, x_up>>2 * y_up>>2) */ + inshift = 2; move16(); + l2_base_len = MIN_ACC_LEN_BITS; move16(); + n_blocks = shr(add(corr_len_fx, (1 << MIN_ACC_LEN_BITS) - 1), MIN_ACC_LEN_BITS); + + IF (sub(n_blocks, MAX_BLOCKS) > 0) + { /* shift to 32 bit acc of up to 128 values -> sum(over 128, x_up>>3 * y_up>>3) */ + inshift = 3; move16(); + l2_base_len = MAX_ACC_LEN_BITS; move16(); + n_blocks = shr(add(corr_len_fx, ((1 << MAX_ACC_LEN_BITS) - 1)), MAX_ACC_LEN_BITS); + } + + ASSERT(n_blocks <= MAX_BLOCKS); /* MAX_BLOCKS*(32 or 128) is max possible total corr_length */ + ASSERT(n_blocks > 0); + + /* subblock accumulation of corr and energies, to achieve high low level precision */ + norm_xcorr_est_q = + plc_norm_corr_blocks_fx(corr_len_fx, l2_base_len, n_blocks, inshift, range1Ptr, /* curr_frame */ + range2Ptr); /* pred_frame = curr_frame-lag, i.e historic section */ + + norm_xcorr_est_q = s_max(0, norm_xcorr_est_q); /* do not allow negative output values */ + } +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + return norm_xcorr_est_q; +} + + diff --git a/lib_lc3plus/pvq_dec_fx.c b/lib_lc3plus/pvq_dec_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..25ec3e5393b7798454fcd26b5d30afc404c3cd91 --- /dev/null +++ b/lib_lc3plus/pvq_dec_fx.c @@ -0,0 +1,287 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +Word16 pvq_dec_deidx_fx( /* out BER detected 1 , ok==0 */ + Word16 * y, /* o: decoded vector (non-scaled int) */ + const Word16 k_val, /* i: number of allocated pulses */ + const Word16 dim, /* i: Length of vector */ + const Word16 LS_ind, /* i; lS index 1 bit */ + const UWord32 UL_MPVQ_ind /* i; MPVQ index */ +) +{ + Dyn_Mem_Deluxe_In( + Word16 BER_flag; + UWord32 h_mem[1 + KMAX_FX + 1]; + PvqEntry_fx entry; + ); + + BER_flag = 0; move16(); + + /* get_size will likely be called before this function, as the range decoder needs the size to fetch the index + */ + entry = get_size_mpvq_calc_offset_fx(dim, k_val, h_mem); /* TBD should be made into tables for N=16,10,6 */ + + entry.lead_sign_ind = LS_ind; move16(); + entry.index = L_deposit_l(0); /* only in case dim == 1 */ + IF (sub(dim, 1) != 0) + { + entry.index = UL_MPVQ_ind; + + /* safety check in case of bit errors */ + IF (L_sub(entry.index, entry.size) >= 0) + { + BER_flag = 1; move16(); + entry.index = 0; move16(); /* return something deterministic/valid, and LOW complex */ + } + } + mpvq_deindex_fx(&entry, h_mem, y); /* actual deindexing */ + + Dyn_Mem_Deluxe_Out(); + return BER_flag; +} + + + +#ifdef ENABLE_HR_MODE +void pvq_dec_scale_vec_fx(const Word32 *inQ29, Word16 adjGainQ13, Word32 *outQ) +#else +void pvq_dec_scale_vec_fx(const Word16 *inQ14, Word16 adjGainQ13, Word16 *outQ14) +#endif +{ + Dyn_Mem_Deluxe_In( + Counter i; + ); + FOR (i = 0; i < M; i++) + { +#ifdef ENABLE_HR_MODE + outQ[i] = L_shr(L_add(outQ[i], Mpy_32_16_lc3plus(inQ29[i], adjGainQ13)), 1); + move16(); +#else + outQ14[i] = add(outQ14[i], mult_r(adjGainQ13, inQ14[i])); move16(); +#endif + } + Dyn_Mem_Deluxe_Out(); +} + +#ifdef CR9_C_ADD_1p25MS_LRSNS +void lrsns_pvq_dec_scale_W16vec_fx( + const Word16 *inQ14, + Word16 adjGainQ12, + Word16 *inQ11outQ11 +) +{ + Dyn_Mem_Deluxe_In( + Counter i; + ); + FOR(i = 0; i < M; i++) + { /* Q12*Q14 +1 -16 => Q11 */ + inQ11outQ11[i] = add(inQ11outQ11[i], mult_r(adjGainQ12, inQ14[i])); move16(); + /* Q11 = Q11 + adjGainQ12 *inQ14 +1-16 , note 12+14+1-16=11 */ + } + Dyn_Mem_Deluxe_Out(); +} + +#ifdef ENABLE_HR_MODE +void lrsns_pvq_dec_scale_W32vec_fx( + const Word32 *inQ30, + Word16 adjGainQ12, + Word32 *inQ27outQ26, + Word16 *outQ11 +) +{ + Dyn_Mem_Deluxe_In( + Counter i; + Word32 L_tmp; + ); + FOR(i = 0; i < M; i++) + { + L_tmp = L_shr_pos(L_add(inQ27outQ26[i], Mpy_32_16_lc3plus(inQ30[i], adjGainQ12)), 1); + /* Q26 = ( Q27 + inQ30*adjGainQ12 * +1-16 ) >>1 , note 30+12+1-16 =43-16 = 27 */ + inQ27outQ26[i] = L_tmp; move32(); + L_tmp = L_add(L_tmp, 1 << 14); /* manual round + 0.5*2^15 */ + L_tmp = L_min(16383L << 16, L_tmp); /* pre_saturate, to not exceed 32767 , for extract_l() below */ + L_tmp = L_max(-(16384L << 16), L_tmp); /* pre_saturate, to not exceed -32768. for extract_l() below */ + outQ11[i] = extract_h(L_shl_pos(L_tmp, 1)); move16(); /*26-16 +1= 26-15 = 11 --> Q26 to Q11*/ + + /* the effect of this Word32 to Word16 rounding does not result in exactly the same W16Q11 vector as DISABLE_HR */ + } + Dyn_Mem_Deluxe_Out(); +} +#endif /* ENABLE_HR_MODE */ + +void pvq_fess_dec_en1_normQ30andQ14_fx( + const Word16 *y /*Q0*/, + Word16 y_up_bits, + Word32 L_norm_factor, + Word16 norm_factorQ, + Word16 len, + Word32* L_y_norm, + Word16 *y_norm) +{ + Dyn_Mem_Deluxe_In( + Counter i; + Word32 L_tmp; + Word16 shift_tot; + ); + +#ifdef WMOPS + push_wmops("pvq_fess_dec_en1_normQ30andQ14_fx"); +#endif + + /* lrsns_norm_factorQ_L[N_SCF_SEARCH_SHAPES_ST2_LR] = { 31, 31, 19 + 16 }; */ /* 0_split, 1_full, 2_fixenv */ + /* maxamps = [8, 5, 12 ]; 8*2^11 = 2^14 =16384 , 5*2^12 = 20480, 12*2^11= 24576 */ + /* lrsns_y_up_bits[N_SCF_SEARCH_SHAPES_ST2_LR] = { 11, 12, 11 };*/ + + shift_tot = sub((30 + 16), add(norm_factorQ, y_up_bits)); + /* 0: lf_split (30+16) - (31+11) = 4 */ + /* 1: full (30+16) - (31+12) = 3 */ + /* 2: fixenv (30+16) - (35+11) = 0 */ + ASSERT(shift_tot >= 0); + FOR(i = 0; i < len; i++) + { + L_tmp = Mpy_32_16_0_0(L_norm_factor, shl_pos(y[i], y_up_bits)); /* Qfactor*Q_y_up => Qfactor*Qyup + 0 - 16 . e.g. Q31*Q11-16 = Q26 */ + L_y_norm[i] = L_shl_pos(L_tmp, shift_tot); move32(); /* shift up the target to Q30 */ + + y_norm[i] = round_fx(L_y_norm[i]); move16(); /* 30-16=> Q14, used in enc side gainQ loop, and for DISABLE_HR synthesis */ + + } +#ifdef WMOPS + pop_wmops(); /* pvq_fess_dec_en1_normQ30andQ14_fx*/ +#endif + Dyn_Mem_Deluxe_Out(); +} + +void FESSdeenum_fx(Word16 dim_in_fx, /* i : dimension of vec_out typically (M-1 == 15) */ + Word16 n_env_fx, /* i : number of envelopes */ + Word16 n_shift_fx, /* i : number shifts */ + Word16 n_signs_fx, /* i : number signs */ + Word16 env_ind_fx, /* i:indx */ + Word16 shift_ind_fx, /* i:indx */ + Word16 sign_ind_fx, /* i:indx */ + Word16* vec_out_fx /* o : FESS integer pulse train , with signs applied */) +{ + Dyn_Mem_Deluxe_In( + Counter i; + Word16 sign_val_fx; + ); + assert(n_env_fx >= 1 && n_env_fx <= 4); + assert(env_ind_fx >= 0 && env_ind_fx < n_env_fx); + assert(shift_ind_fx >= 0 && shift_ind_fx < n_shift_fx); + + UNUSED(n_env_fx); + UNUSED(n_shift_fx); + +#ifdef WMOPS + push_wmops("FESSdeenum_fx"); +#endif + + basop_memset(vec_out_fx, 0, sizeof(*vec_out_fx)*dim_in_fx); + + FOR(i = (shift_ind_fx + n_signs_fx - 1); i >= shift_ind_fx; i--) + { + /* low numbered coeff signs are in the msb's */ + /* high numbered coeff signs are in the lsb's */ + ASSERT(i < dim_in_fx); + + sign_val_fx = sub(1, shl_pos(s_and(sign_ind_fx, 0x01), 1)); /* 1 - 2*signbit_value */ + sign_ind_fx = shr_pos_pos(sign_ind_fx, 1); + + vec_out_fx[i] = extract_l(L_mult0(sign_val_fx, lrsns_fix_env_fx[env_ind_fx][i])); + } + +#ifdef WMOPS + pop_wmops(); /* */ +#endif + Dyn_Mem_Deluxe_Out(); +} +#endif + +void pvq_dec_en1_normQ14_fx(/* Have to be used EXACTLY the same way in both both encoder and decoder */ +#ifdef ENABLE_HR_MODE + Word32 * xq, /* o: en1 normalized decoded vector (Q14) */ +#else + Word16 * xq, /* o: en1 normalized decoded vector (Q14) */ +#endif + const Word16 *y, /* i: decoded vector (non-scaled int) */ + const Word16 k_val_max, + /* i: max possible K in Q0 kO or kA */ /* OPT: not BE , use dynamic max pulse + amplitude */ + const Word16 dim /* i: Length of vector */ +) +{ +#ifdef ENABLE_HR_MODE + Dyn_Mem_Deluxe_In( + Counter i; + Word32 L_tmp; + Word16 shift_num, shift_tot; + Word32 isqrtQ31_local; + Word16 tmp, exp, exp_shift; + Word32 L_yy; + ); +#else + Dyn_Mem_Deluxe_In( + Counter i; + Word32 L_tmp; + Word16 shift_num, shift_tot; + Word16 isqrtQ16_local, tmp, exp, exp_shift; + Word32 L_yy; + ); +#endif + +/* energy normalization starts here */ + L_yy = L_mult0(y[0], y[0]); + FOR (i = 1; i < dim; i++) + { + L_yy = L_mac0(L_yy, y[i], y[i]); /* stay in Q0 */ /* OPT: reuse some energies from PVQ linear search */ + } + /* 16 bit */ + IF (L_sub(L_yy, SQRT_EN_MAX_FX) < 0) + { + ASSERT(L_yy > 4); /* Q16 isqrt table lookup not valid below 5 */ +#ifdef ENABLE_HR_MODE + isqrtQ31_local = isqrt_Q31tab[L_yy]; move16(); /* 1 cycle */ +#else + isqrtQ16_local = isqrt_Q16tab[L_yy]; move16(); /* 1 cycle */ +#endif + } + ELSE + { + /* about 8-9 cycles */ + exp = 15; move16(); /* set ISqrt16() exp_in to get delta exp out near 0 when Lyy is in Q0 */ + tmp = ISqrt16(extract_l(L_yy), + &exp); /* exp out is now a delta shift with a later tmp Q15 multiplication in mind */ +#ifdef ENABLE_HR_MODE + exp_shift = add(exp, 16); /* up to Q16 */ + isqrtQ31_local = L_shl(L_deposit_l(tmp), exp_shift); /* new mantissa in a fixed Q16 */ +#else + exp_shift = add(exp, 16 - 15); /* up to Q16 */ + isqrtQ16_local = shl(tmp, exp_shift); /* new mantissa in a fixed Q16 */ +#endif + } + + shift_num = norm_s(k_val_max); /* simply account for the preknown fixed max possible pulseamp in y */ + shift_tot = sub(14 - 1, shift_num); /* upshift to get to Q14 */ + FOR (i = 0; i < dim; i++) /* upshifted y[i] used */ + { +#ifdef ENABLE_HR_MODE + L_tmp = Mpy_32_16_lc3plus(isqrtQ31_local, shl_pos(y[i], shift_num)); /* Q(16+0+shift_num +1 = shift_num+1 */ + xq[i] = L_shl(L_tmp, shift_tot + 1); move32(); /* Q30 , */ +#else + L_tmp = L_mult(isqrtQ16_local, shl_pos(y[i], shift_num)); /* Q(16+0+shift_num +1 = shift_num+1 */ + xq[i] = round_fx(L_shl(L_tmp, shift_tot)); move16(); /* Q14 , */ +#endif + } + + Dyn_Mem_Deluxe_Out(); +} + diff --git a/lib_lc3plus/pvq_enc_fx.c b/lib_lc3plus/pvq_enc_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..9933419bb0f57c5b069dd84d537a4e7d1a5131f9 --- /dev/null +++ b/lib_lc3plus/pvq_enc_fx.c @@ -0,0 +1,1085 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" + +#ifdef CR9_C_ADD_1p25MS_LRSNS + static void pvq_pyr_project_lrsns_adv(const Word16 dim_proj, /* vector dimension */ + const Word16 *xabs, /* absolute vector values */ + Word32 L_xsum, /* absolute vector sum over dim_proj */ + Word16 num, /* start/safe target number of pulses for projection to a pyramid e.g. KMAX-1 */ + Word16 num_max, /* max number of pulses allowed , typically K_MAX */ + Word16 * y, /* projected integer output vector */ + Word16 *pulse_tot_ptr, Word32 *L_xy_ptr, /* accumulated correlation Q(in+0+1) = Qin+1 */ + Word32 *L_yy_ptr, /* accumulated energy Q0 */ + Word8 * scratch + ) + { + Dyn_Mem_Deluxe_In( + Counter i; + Word32 L_tmp, L_num; + Word16 den, shift_num, shift_den, shift_delta, proj_fac; + Word16 *y_r, *y_r_soft; + Word16 pulse_tot_r, pulse_tot_r_soft; + ); + +#ifdef FIX_BASOP_ENC_LRSNS_ST2FULL_PROJ + Word16 skip_rnd_flag = 0; +#endif + + y_r = (Word16 *)scratchAlign(scratch, 0); + y_r_soft = (Word16 *)scratchAlign(y_r, M * sizeof(*y_r)); /* y_r = M */ + /* y_r_soft = M */ + + *pulse_tot_ptr = 0; move16(); + pulse_tot_r = 0; move16(); + pulse_tot_r_soft = 0; move16(); + + shift_den = norm_l(L_xsum); /* x_sum input Qin */ + den = extract_h(L_shl_pos(L_xsum, shift_den)); /* now in Qin+shift_den */ + +#ifdef FIX_BASOP_ENC_LRSNS_ST2FULL_PROJ + IF(num_max == 0 ) { + num_max = num; move16(); /* use projection value num as num_max limit*/ + skip_rnd_flag = 1; move16(); + } +#endif + + L_num = L_deposit_l(num); + shift_num = sub(norm_l(L_num), 1); + L_num = L_shl_pos(L_num, shift_num); /* now in Q0 +shift_num -1 */ + + proj_fac = div_l(L_num, den); /* L_num always has to be less than den<<16 , norm_l-1 makes that happen */ + + shift_delta = sub(shift_num, shift_den); + + /* we are here using a single proj factor, but different rounding offsets 0(==trunc=safe), .25(soft), .5(==round=risky) */ + + FOR(i = 0; i < dim_proj; i++) + { + L_tmp = L_mult(proj_fac, xabs[i]); /* Q shift_delta + PVQ_SEARCH_QIN */ + L_tmp = L_shr(L_tmp, shift_delta); + + y[i] = extract_h(L_tmp); move16(); /* to Q0 with floor */ + *pulse_tot_ptr = add(*pulse_tot_ptr, y[i]); /* Q0 */ + + y_r[i] = extract_h(L_add(L_tmp, (Word32)0x00008000L)); /* regular round i.e. +.5 and truncate */ + pulse_tot_r = add(pulse_tot_r, y_r[i]); /* Q0 */ + + y_r_soft[i] = extract_h(L_add(L_tmp, (Word32)0x00004000L)); /* softer round i.e. +.25 and truncate */ + pulse_tot_r_soft = add(pulse_tot_r_soft, y_r_soft[i]); /* Q0 */ + } + + /* now analyze which rounding is valid and closest to num_max */ + +#ifdef FIX_BASOP_ENC_LRSNS_ST2FULL_PROJ + IF (skip_rnd_flag != 0 ) + { + pulse_tot_r = 32767; /*disable most optimistic rounding */ + pulse_tot_r_soft = 32767; /*disable soft optimistic rounding */ + } +#endif + + /* if y_r is successful and does not overshoot, let us use that */ + IF(sub(pulse_tot_r, num_max) <= 0) + { + basop_memcpy(y, y_r, dim_proj * sizeof(*y)); + *pulse_tot_ptr = pulse_tot_r; + pulse_tot_r_soft = 32767; /* exclude r_soft */ + } + + /* if y_r_soft is successful and does not overshoot, use that */ + IF(sub(pulse_tot_r_soft, num_max) <= 0) + { + basop_memcpy(y, y_r_soft, dim_proj * sizeof(*y)); + *pulse_tot_ptr = pulse_tot_r_soft; + pulse_tot_r = 32767; + } + + /*sum up correlation and energy */ + *L_xy_ptr = L_deposit_l(0); + *L_yy_ptr = L_deposit_l(0); + FOR(i = 0; i < dim_proj; i++) + { + *L_yy_ptr = L_mac0(*L_yy_ptr, y[i], y[i]); /* Energy, Q0 */ + *L_xy_ptr = L_mac(*L_xy_ptr, xabs[i], y[i]); /* Corr, Q11*Q0 +1 --> Q12 */ + } + ASSERT(*pulse_tot_ptr <= num_max); + + Dyn_Mem_Deluxe_Out(); + } +#endif + +static void pvq_pyr_project(const Word16 dim_proj, /* end vector dimension+1 */ + const Word16 *xabs, /* absolute vector values */ + Word32 L_xsum, /* absolute vector sum over dim */ + Word16 num, /* target number of pulses */ + Word16 * y, /* projected output vector */ + Word16 *pulse_tot_ptr, Word32 *L_xy_ptr, /* accumulated correlation Q(in+0+1) = Qin+1 */ + Word32 *L_yy_ptr /* accumulated energy Q0 */ +) +{ + + Dyn_Mem_Deluxe_In( + Counter i; + Word32 L_tmp, L_num; + Word16 den, shift_num, shift_den, shift_delta, proj_fac; + ); + + *pulse_tot_ptr = 0; move16(); + *L_xy_ptr = L_deposit_l(0); + *L_yy_ptr = L_deposit_l(0); + + shift_den = norm_l(L_xsum); /* x_sum input Qin */ + den = extract_h(L_shl_pos(L_xsum, shift_den)); /* now in Qin+shift_den */ + + L_num = L_deposit_l(num); + shift_num = sub(norm_l(L_num), 1); + L_num = L_shl_pos(L_num, shift_num); /* now in Q0 +shift_num -1 */ + proj_fac = div_l(L_num, den); /* L_num always has to be less than den<<16 , norm_l-1 makes that happen */ + + shift_delta = sub(shift_num, shift_den); + FOR (i = 0; i < dim_proj; i++) + { + L_tmp = L_mult(proj_fac, xabs[i]); /* Q shift_delta + PVQ_SEARCH_QIN */ + y[i] = extract_h(L_shr(L_tmp, shift_delta)); move16(); /* to Q0 with floor , and potential sturation */ + ; + + *pulse_tot_ptr = add(*pulse_tot_ptr, y[i]); /* Q0 */ + *L_yy_ptr = L_mac0(*L_yy_ptr, y[i], y[i]); /* Energy, Q0 */ + *L_xy_ptr = L_mac(*L_xy_ptr, xabs[i], y[i]); /* Corr, Q0*Q12 +1 --> Q13 */ + } + + Dyn_Mem_Deluxe_Out(); +} + + +static __forceinline Word16 one_pulse_search(const Word16 dim_start, /* start vector dimension */ + const Word16 dim_end, /* end vector dimension+1 */ + const Word16 *x_abs, /* absolute vector values */ + Word16 * y, /* output vector */ + Word16 * pulse_tot_ptr, + Word32 * L_xy_ptr, /* accumulated correlation Q(12+0+1) = Q13 */ + Word32 * L_yy_ptr, /* accumulated energy Q0 */ + Word16 max_xabs) /* current max amplitude for target */ +{ + Dyn_Mem_Deluxe_In( + Counter i; + Word16 corr_tmp, corr_sq_tmp, en_max_den, cmax_num, en_tmp; + Word32 L_tmp_en_lc, L_tmp_corr; + Word16 corr_up_shift, imax; + ); + + /* maximize correlation precision, prior to every unit pulse addition in the vector */ + corr_up_shift = norm_l(L_mac(*L_xy_ptr, 1, max_xabs)); /* pre analyze worst case L_xy update in the dim loop */ + imax = -1; /* not needed for search, only added to avoid compiler warning */ + { + en_max_den = 0; move16(); + cmax_num = -1; move16(); /* req. to force a 1st update for n==dim_start */ + + FOR (i = dim_start; i < dim_end; i++) + { + L_tmp_corr = L_shl_pos(L_mac(*L_xy_ptr, 1, x_abs[i]), corr_up_shift); /* actual in-loop target value */ + + corr_tmp = round_fx_sat(L_tmp_corr); + + corr_sq_tmp = mult(corr_tmp, corr_tmp); /* CorrSq_tmp for a 16bit low complexity cross multiplication */ + + L_tmp_en_lc = L_mac(*L_yy_ptr, 1, y[i]); /*Q0 x^2+ 2x , "+1" added once before loop , result , energy may + span up to ~14+1(Q1)+1(sign)=16 bits */ + /* extract_l without shift can always be used for this section as energy is guaranteed to stay in the lower + * word*/ + + en_tmp = extract_l(L_tmp_en_lc); /* L_shl + round_fx could also be used also but then adds an uphift cost */ + + /* 16/32 bit comparison WC (4 +1+1 + (1+1+1) = 9 */ + IF (L_msu(L_mult(corr_sq_tmp, en_max_den), cmax_num, en_tmp) > 0) /* use L_mult and then a L_msu */ + { + cmax_num = corr_sq_tmp; move16(); + en_max_den = en_tmp; move16(); + imax = i; move16(); + } + } /* dim */ + } + + + /* finally add found unit pulse contribution to past L_xy, Lyy, for next pulse loop */ + *L_xy_ptr = L_mac(*L_xy_ptr, x_abs[imax], 1); /* Qin+1 */ + *L_yy_ptr = L_mac(*L_yy_ptr, 1, y[imax]); + + y[imax] = add(y[imax], 1); move16(); /* Q0 added pulse */ + (*pulse_tot_ptr) = add((*pulse_tot_ptr), 1); /* increment total pulse sum */ + Dyn_Mem_Deluxe_Out(); + return imax; +} + +#ifdef CR9_C_ADD_1p25MS_LRSNS + +/* evaluate corr/sqrt(en) = corr*inv_sqrt_tab[en], as CorrSq/en ratio cross-multiplication may cost more */ + +static __forceinline Word16 one_pulse_search_tab_isqrt( + const Word16 dim_start, /* start vector dimension */ + const Word16 dim_end, /* end vector dimension+1 */ + const Word16 *x_abs, /* absolute vector values */ + Word16 * y, /* output vector */ + Word16 * pulse_tot_ptr, + Word32 * L_xy_ptr, /* accumulated correlation Q(12+0+1) = Q13 */ + Word32 * L_yy_ptr, /* accumulated energy Q0 */ + Word16 max_xabs) /* current max amplitude for target */ +{ + Dyn_Mem_Deluxe_In( + Counter i; + + Word32 L_cand_en_lc, L_cand_corr; + Word16 corr_up_shift, imax; + Word32 L_cand_norm_ratio, L_max_norm_ratio; + ); + + /* maximize correlation precision, prior to every unit pulse addition in the vector */ + corr_up_shift = norm_l(L_mac0(*L_xy_ptr, 2, max_xabs)); /* pre analyze worst case L_xy update in the dim loop */ + imax = -1; /* init not needed for this search, only added to avoid MSVC compiler warning */ + + /* select isqrt table for this pulse addition loop , based on current energy */ + const Word16* isqrt_QxTab = isqrt_Q16tab; move32(); /* Q16 table valid for energies 4...64 */ + if (L_sub(*L_yy_ptr, 3L) <= 0) /* +1 for the inloop value of L_yy was preadded outside to *L_yy_ptr */ + { + isqrt_QxTab = isqrt_Q15tab; move32(); /* energies: 1...6 */ + } + + { + L_max_norm_ratio = L_deposit_l(-1); /* req. to force a 1st update for n==dim_start */ + + FOR(i = dim_start; i < dim_end; i++) + { + L_cand_corr = L_shl_pos(L_mac0(*L_xy_ptr, 2, x_abs[i]), corr_up_shift); /* actual in-loop target value */ + L_cand_en_lc = L_mac0(*L_yy_ptr, 2, y[i]); /*Q0 y^2+ 2y +1, "+1" added once before loop outside */ + + L_cand_norm_ratio = Mpy_32_16_0_0(L_cand_corr, isqrt_QxTab[L_cand_en_lc]); /* energy normalized ratio, non-saturating operation */ + + /* 32 bit comparison WC (1 +1 +1 = 2 */ + if (L_sub(L_cand_norm_ratio, L_max_norm_ratio) >= 0) + { + imax = i; move16(); /* conditional move single basop */ + } + L_max_norm_ratio = L_max(L_max_norm_ratio, L_cand_norm_ratio); /* always update */ + } /* dim */ + } + + /* finally add found unit pulse contribution to past L_xy, L_yy, for next pulse loop */ + *L_xy_ptr = L_mac0(*L_xy_ptr, x_abs[imax], 2); /* Qin*Q0+1 */ + *L_yy_ptr = L_mac0(*L_yy_ptr, 2, y[imax]); /* en = en + 2*y + 1 , 1 was preadded outside */ + + y[imax] = add(y[imax], 1); move16(); /* Q0 added pulse */ + (*pulse_tot_ptr) = add((*pulse_tot_ptr), 1); /* increment total pulse sum */ + + Dyn_Mem_Deluxe_Out(); + return imax; +} +#endif + +void pvq_enc_search_fx( + const Word16 *x, /* i: target vector to quantize Qin */ + Word16 * y_far, /* o: outl_far o, raw pulses (non-scaled short) Q0 , length dim */ + Word16 * y, /* o: outl_near o, raw pulses (non-scaled short) Q0 , length dim */ + Word16 * yA, /* o: A section raw pulses (non-scaled short) Q0 , length dimA */ + Word16 * yB, /* o: B section raw pulses (non-scaled short) Q0 , length dim-dimA */ + Word32 * L_corr, /* o: 4 un-normalized correlation sums for outl_far, outl_near, A, AB */ + Word32 * L_search_en, /* o: 4 energy sums for outl_far, outl_near, A, AB */ + Word16 * pulses_fin, /* i: number of allocated pulses to outl_far, outl_near , A, AB sections */ + Word16 * pulses_proj, /* i: number of projection pulses for outl_far, outl_near, A, AB */ + + const Word16 dim, /* i: Length of outlier vector */ + const Word16 dimA /* i: Length of vector A section */ +) +{ + + Dyn_Mem_Deluxe_In( + Counter i; + Word16 pulse_tot_far, pulse_tot, pulse_totA, pulse_totB; + Word16 xabs[PVQ_MAX_VEC_SIZE]; + Word16 max_xabs, max_xabsA, max_xabsB; + Word32 L_xsum, L_xsumA; + Word32 L_yy, L_xy; + Word16 imax; + Counter k; + Word16 dim_m1; + Word16 dimB; + const Word16 *xBptr; + Word16 pulses_far, pulses, pulsesA, pulsesB; + ); + +#ifdef WMOPS + push_wmops("pvq_enc_search_fx"); +#endif + + pulses_far = pulses_fin[0]; move16(); + pulses = pulses_fin[1]; move16(); + pulsesA = pulses_fin[2]; move16(); + pulsesB = pulses_fin[3]; move16(); + + FOR (i = 0; i < N_SCF_SHAPES_ST2; i++) + { + L_corr[i] = L_deposit_l(0); + L_search_en[i] = L_deposit_l(0); + } + + dimB = sub(dim, dimA); + + L_xsum = L_deposit_h(0); + + max_xabs = -1; move16(); + max_xabsA = -1; move16(); + max_xabsB = -1; move16(); + FOR (i = 0; i < dimA; i++) + { + xabs[i] = abs_s(x[i]); move16(); /* Qx */ + max_xabsA = s_max(max_xabsA, xabs[i]); /* for efficient search correlation scaling */ + L_xsum = L_mac0(L_xsum, 1, xabs[i]); /* stay in Qx */ + } + + basop_memset(y_far, 0, dim * sizeof(Word16)); + basop_memset(y, 0, dimA * sizeof(Word16)); + basop_memset(yA, 0, dimA * sizeof(Word16)); + + L_xsumA = L_add(L_xsum, 0); /* save for section A projection */ + + FOR (i = dimA; i < dim; i++) + { + xabs[i] = abs_s(x[i]); move16(); /* Qx */ + max_xabsB = s_max(max_xabsB, xabs[i]); /* for efficient search correlation scaling */ + L_xsum = L_mac0(L_xsum, 1, xabs[i]); /* stay in Qx */ + } + + basop_memset(&y[dimA], 0, (dim - dimA) * sizeof(Word16)); + + basop_memset(yB, 0, dimB * sizeof(Word16)); + + max_xabs = s_max(max_xabsA, max_xabsB); /* global max abs value */ + + test(); + IF (L_xsum == 0) + { /* no shape in any section, projection in outl_far, outl_near, A, AB not possible, any search meaningless */ + + dim_m1 = sub(dim, 1); + y_far[0] = shr_pos(pulses_far, 1); move16(); + y_far[dim_m1] = add(y_far[dim_m1], sub(pulses_far, y_far[0])); move16(); + + dim_m1 = sub(dim, 1); + y[0] = shr_pos(pulses, 1); move16(); + y[dim_m1] = add(y[dim_m1], sub(pulses, y[0])); move16(); + + dim_m1 = sub(dimA, 1); + yA[0] = shr_pos(pulsesA, 1); move16(); + yA[dim_m1] = add(yA[dim_m1], sub(pulsesA, yA[0])); move16(); + + dim_m1 = sub(dimB, 1); + yB[0] = shr_pos(pulsesB, 1); move16(); + yB[dim_m1] = add(yB[dim_m1], sub(pulsesB, yB[0])); move16(); + } + ELSE + { + ASSERT(pulses_proj[0] > 0); + ASSERT(L_xsum > 0); + + pvq_pyr_project(dim, xabs, L_xsum, pulses_proj[0], y_far, &pulse_tot_far, &L_xy, + &L_yy); /* outlier submode projection */ + + ASSERT(pulses_far <= 127); + FOR (k = pulse_tot_far; k < pulses_far; k++) + { + L_yy = L_add(L_yy, 1); /* pre add 1 in Q0 in L_yyQ0 = (x^2 + 2*x + 1) */ + imax = one_pulse_search(0, dim, xabs, y_far, &pulse_tot_far, &L_xy, &L_yy, max_xabs); + } + ASSERT(pulse_tot_far == pulses_far); + /* outlier far submode result vector in y_far[0...15] */ + L_corr[0] = L_shr_pos(L_xy, 1); /* to Qin*Q0 */ + + basop_memmove(y, y_far, dim * sizeof(Word16)); /*y_far->y */ + + pulse_tot = pulse_tot_far; move16(); + + ASSERT(pulses <= 127); + FOR (k = pulse_tot; k < pulses; k++) + { + L_yy = L_add(L_yy, 1); /* pre add 1 in Q0 in L_yyQ0 = (x^2 + 2*x + 1) */ + imax = one_pulse_search(0, dim, xabs, y, &pulse_tot, &L_xy, &L_yy, max_xabs); + } + + /* outlier near submode result vector in y[0...15] */ + L_corr[1] = L_shr_pos(L_xy, 1); /* to Qin*Q0 */ + + ASSERT(pulse_tot == pulses); + + IF (L_xsumA == 0) + { + /* no shape in A section, projection in A not possible, search meaningless */ + dim_m1 = sub(dimA, 1); + yA[0] = shr_pos(pulsesA, 1); move16(); + yA[dim_m1] = add(yA[dim_m1], sub(pulsesA, yA[0])); move16(); + } + ELSE + { + IF (pulses_proj[2] != 0) /* fixed setup if bitrate is fixed */ + { + ASSERT(pulses_proj[2] > 0); + ASSERT(L_xsumA > 0); + pvq_pyr_project(dimA, xabs, L_xsumA, pulses_proj[2], yA, &pulse_totA, &L_xy, + &L_yy); /* section A , in submode 1 projection */ + } + ELSE + { + /* default, otherwise recalculate A from outlier result (to remove any section B pulses influence) + */ + pulse_totA = 0; move16(); + L_xy = L_deposit_l(0); + L_yy = L_deposit_l(0); + + basop_memmove(yA, y, dimA * sizeof(Word16)); + FOR (i = 0; i < dimA; i++) + { + pulse_totA = add(pulse_totA, yA[i]); /* Q0 */ + L_xy = L_mac(L_xy, xabs[i], yA[i]); /* Corr, Q0*Q12 +1 --> Q13 */ + L_yy = L_mac(L_yy, yA[i], yA[i]); /* Energy, Q(0+0)+1)= Q1 */ + } + L_yy = L_shr_pos(L_yy, 1); /* En to Q0 */ + } + + /* search remaining pulses in regular section A */ + FOR (k = pulse_totA; k < pulsesA; k++) + { + L_yy = L_add(L_yy, 1); /* 1 added in Q0 */ + imax = one_pulse_search(0, dimA, xabs, yA, &pulse_totA, &L_xy, &L_yy, max_xabsA); + } + ASSERT(pulse_totA == pulsesA); + } /* L_xsumA!=0 */ + + /* reg Set A result vector now in yA[0...9] */ + L_corr[2] = L_shr_pos(L_xy, 1); /* to Qin*Q0 */ + + /* search remaining pulses in regular section B, even if energy in B is zero */ + ASSERT(pulses_proj[3] == 0); + pulse_totB = 0; move16(); + + IF (sub(pulsesB, 1) == 0) + { /* LC search, sufficient to find a single max, as pulses can not be stacked, when nb-pulses==1 */ + imax = 0; move16(); /* safety */ + FOR (i = dimA; i < dim; i++) + { + if (xabs[i] == max_xabsB) + { + imax = sub(i, dimA); + } + } + pulse_totB = 1; move16(); + yB[imax] = 1; move16(); /* reg set B result vector in yB[0...5] */ + L_xy = L_mac(L_xy, xabs[add(imax, dimA)], 1); /* calc total corr for A+B sections */ + L_yy = L_add(L_yy, 1); + } + ELSE + { /* more than one target pulse in section B */ + /* keep A pulses influence, search section B pulses influence */ + FOR (k = pulse_totB; k < pulsesB; k++) + { + L_yy = L_add(L_yy, 1); /* 1 added in Q0*/ + imax = one_pulse_search(dimA, dim, xabs, &(yB[-dimA]), &pulse_totB, &L_xy, &L_yy, max_xabsB); + } + } + + L_corr[3] = L_shr_pos(L_xy, 1); move32(); /* to Qin*Q0 , corr of combined A and B */ + + ASSERT(pulse_totB == pulsesB); + /* reg set B result vector now in yB[0...5] */ + } /* L_xsum != 0 */ + +/* apply sign of (x) to first orthant result */ + FOR (i = 0; i < dim; i++) + { + if (x[i] < 0) + { + y_far[i] = negate(y_far[i]); /* apply sign for outlier far */ + } + } + + FOR (i = 0; i < dim; i++) + { + if (x[i] < 0) + { + y[i] = negate(y[i]); /* apply sign for outliers near */ + } + } + + xBptr = &(x[dimA]); move32(); /* ptr init to B target section */ + FOR (i = 0; i < dimA; i++) + { + if (x[i] < 0) + { + yA[i] = negate(yA[i]); /* apply sign in N_SETA */ + } + } + + FOR (i = 0; i < (dimB); i++) + { + if (xBptr[i] < 0) + { + yB[i] = negate(yB[i]); /* apply sign in N_SETB */ + } + } + + Dyn_Mem_Deluxe_Out(); +#ifdef WMOPS + pop_wmops(); +#endif +} + +#ifdef CR9_C_ADD_1p25MS_LRSNS + +/* 29/30 bits optimized search functions for PVQ and FESS */ +/* stage 2 submode shape 0: "splitLF" (N=5,K=6)(N=8,K=2)(N=2,K=0), or (N=5,K=8)(N=10,K=0) , 4 gains */ +/* stage 2 submode shape 1: "full" FB (N=15,K=5), , 8 gains */ +/* stage 2 submode shape 2-5: "fixed env " (N=13-15,K=10-12), 4xfixed , 8 gains */ + +#define SC 1 /* starting coeff for LRSNS VQ searches, as DC is zero in the DCT-II domain target */ +void pvq_fess_enc_search_fx( + const Word16 *x_in, /* i: target vector to quantize Qin (=Q11) 0...M-1 */ + + Word16 * y_Q0, /* o: raw integer pulses (non-scaled short) Q0 , length 3*M */ + Word16 * y_normQ14, /* o: normalized integer pulses (non-scaled short) Q14 , length 3*M */ + Word32 * L_y_normQ30, /* o: normalized integer pulses (non-scaled short) Q30 , length 3*M */ + Word16 * s_idxPtr, /* o: quantized shape index, 0,1,2 */ + Word16 * g_idxPtr, /* o: quantized gain index, 0..3, or 0..7 */ + Word16 * g_qvalQ12Ptr, /* o: quantized gain value, in Q12 -32767 == 7.99975 for best shape */ + Word16 * fixShapeNbPtr, /* o: idx for the selected fix shape y_fix 0...3, only relevant in the case s_idx==2 */ + Word16 * fixShiftIdxPtr, /* o: idx for the selected fix shift 0...3, only relevant in the case s_idx==2 */ + Word32 * L_MSEQ22Ptr, /* o: 1 Q11+Q0+1 --> Q22 */ + Word8 * scratch +) +{ + + Dyn_Mem_Deluxe_In( + Counter i, k, n; + Word16 pulse_tot; + Word16 max_xabs, max_xabsA, max_xabsB, max_xabsAB, max_xabsC; + Word32 L_xsum, L_xsumA, L_xsumB, L_xsumAB; + Word32 L_yy, L_xy; + + Word16 imax; + Word16 *y_split, *y_full, *y_fix; + Word16 *y_splitAB; + + Word16 *y_splitA0; + Word16 best_env_ind; + Word16 best_shift_ind; + Word32 L_targetEnNeg; + + Word16 shift_ind, fix_ind; + Word16* xabs1; + const Word16* envPtr; + Word32 L_corr; + + + Word16 *y, *y_norm, tmp; + Word32 *L_y_norm; + Word32 L_tmp; + Word32 L_min_mse_opt; + + Word16 gain_idx_opt, shape_idx_opt; + Word16 best_ind; + Word16 gidx; + Word32 L_g_q_tmp; + const Word16 *gTabPtr; + Word32 L_mse; + Word32 L_xy_a6_mem; + Word32 L_MSEQ22_recalc; + Word32 L_normcorrQy; + Word16 norm_factors[N_SCF_SEARCH_SHAPES_ST2_LR]; + Word32 L_norm_factors[N_SCF_SEARCH_SHAPES_ST2_LR]; + + Word32 *L_search_corr; + Word32 *L_search_en; + Word16 *xabs; + Word8* scratch_top_proj; + Word32 *L_corr_fixenv; + Word32 *L_normcorr_fixenv; + Word16 *gain_idx_opt_save; + Word32 *L_min_mse_opt_save; + ); + UNUSED(imax); /* avoid gcc compiler warning */ + UNUSED(tmp); + + L_search_corr = (Word32 *)scratchAlign(scratch, 0); + L_search_en = (Word32 *)scratchAlign(L_search_corr , N_SCF_SEARCH_SHAPES_ST2_LR * sizeof(*L_search_corr)); + xabs = (Word16 *)scratchAlign(L_search_en , N_SCF_SEARCH_SHAPES_ST2_LR * sizeof(*L_search_en)); + scratch_top_proj = (Word8 *)scratchAlign(xabs, PVQ_MAX_VEC_SIZE * sizeof(*xabs) ); + + L_corr_fixenv = (Word32 *)scratch_top_proj ; + L_normcorr_fixenv = (Word32 *)scratchAlign(L_corr_fixenv , SNSLR_N_FIXENV*SNSLR_N_FIXENV_SHIFTS * sizeof(*L_corr_fixenv)); + gain_idx_opt_save = (Word16 *)scratchAlign(L_normcorr_fixenv, SNSLR_N_FIXENV*SNSLR_N_FIXENV_SHIFTS * sizeof(*L_normcorr_fixenv)); + L_min_mse_opt_save = (Word32 *)scratchAlign(gain_idx_opt_save, N_SCF_SEARCH_SHAPES_ST2_LR * sizeof(*gain_idx_opt_save)); + /* scratch_top = (Word8 *)scratchAlign(L_min_mse_opt_save, N_SCF_SEARCH_SHAPES_ST2_LR *sizeof(L_min_mse_opt_save)); */ + +#ifdef WMOPS + push_wmops("pvq_fess_enc_search_fx"); +#endif + + best_env_ind = -1; + best_shift_ind = -1; + gain_idx_opt = 0; + + y_split = &(y_Q0[0]); move32(); + y_full = &(y_Q0[1 * M]); move32(); + y_fix = &(y_Q0[2 * M]); move32(); + + + /* init */ + basop_memset(L_search_corr, 0, N_SCF_SEARCH_SHAPES_ST2_LR * sizeof(Word32)); + basop_memset(L_search_en, 0, N_SCF_SEARCH_SHAPES_ST2_LR * sizeof(Word32)); + + max_xabs = -1; move16(); + max_xabsC = -1; move16(); + + basop_memset(y_split, 0, PVQ_MAX_VEC_SIZE * sizeof(Word16)); + basop_memset(y_full, 0, PVQ_MAX_VEC_SIZE * sizeof(Word16)); + basop_memset(y_fix, 0, PVQ_MAX_VEC_SIZE * sizeof(Word16)); + + y_splitAB = y_split; /* ptr init */ + y_splitA0 = y_fix; /* ptr init */ /* y_fix temporarlily used for splitA0 */ + + xabs[0] = 0; move16(); /* always no DC in LRSNS scheme */ + FOR(i = SC; i < PVQ_MAX_VEC_SIZE; i++) + { + xabs[i] = abs_s(x_in[i]); move16(); /* input Qx */ + } + + /* A section */ + max_xabsA = -1; move16(); + L_xsumA = L_deposit_h(0); + FOR(i = SC; i < SC + NA_LR; i++) + { + max_xabsA = s_max(max_xabsA, xabs[i]); /* max value used for near optimal search correlation scaling */ + L_xsumA = L_mac0(L_xsumA, 1, xabs[i]); /* stay in Qx */ + } + /* B section */ + max_xabsB = -1; move16(); + L_xsumB = L_deposit_h(0); + FOR(i = SC + NA_LR; i < SC + NA_LR + NB_LR; i++) + { + max_xabsB = s_max(max_xabsB, xabs[i]); /* later used for near optimal search correlation scaling */ + L_xsumB = L_mac0(L_xsumB, 1, xabs[i]); /* stay in Qx */ + } + L_xsumAB = L_add(L_xsumA, L_xsumB); + + /* "C" section, 2 coeffs, not coded by split shapes {A,B}, {A,0} , but potentially coded by full and fix shapes */ + max_xabsC = s_max(xabs[PVQ_MAX_VEC_SIZE - 2], xabs[PVQ_MAX_VEC_SIZE - 1]); + L_xsum = L_mac0(L_xsumAB, 1, xabs[PVQ_MAX_VEC_SIZE - 2]); + L_xsum = L_mac0(L_xsum, 1, xabs[PVQ_MAX_VEC_SIZE - 1]); + + /*globalMax abs , for split and full search and projection */ + max_xabsAB = s_max(max_xabsA, max_xabsB); + max_xabs = s_max(max_xabsAB, max_xabsC); /* global max abs value over all M-1 coeffs */ + + L_targetEnNeg = L_deposit_l(0); + FOR(i = SC; i < PVQ_MAX_VEC_SIZE; i++) + { + /*target MSE part for final winning stage 2 MSE shape */ + L_targetEnNeg = L_msu0(L_targetEnNeg, x_in[i], x_in[i]); /* for final MSE output calculation */ + } + + IF(L_xsum == 0) + { /* no shape in any section, projection, A, AB, ABC not possible:: --> search is meaningless */ + y_split[SC] = PULSES_SPLIT_A_LR; move16(); + y_split[SC + NA_LR] = PULSES_SPLIT_B_LR; move16(); + + y_full[SC] = PULSES_FULL_LR; move16(); + + FOR(i = SC; i < SC + NSIGNS_FIX_3; i++) + { + y_fix[i] = 1; move16(); + } + *fixShapeNbPtr = 3; move16(); + + /* L_search_corr[], [0,1,2] all stays zero valued */ + ASSERT(L_search_corr[0] == 0 && L_search_corr[1] == 0 && L_search_corr[2] == 0); + L_search_en[0] = PULSES_SPLIT_A_LR * PULSES_SPLIT_A_LR + PULSES_SPLIT_B_LR * PULSES_SPLIT_B_LR; move32(); + L_search_en[1] = PULSES_FULL_LR * PULSES_FULL_LR; move32(); + L_search_en[2] = NSIGNS_FIX_3; move32(); /* read from table as shape is not all ones */ + } + ELSE + { /* projection, to a valid pyramid or sub-pyramid */ + /* use the most optimistic projection */ +#ifdef FIX_BASOP_ENC_LRSNS_ST2FULL_PROJ + /* always use at least one loop of single pulse optimization */ + pvq_pyr_project_lrsns_adv(SC + NFULL_LR, xabs, L_xsum, (PULSES_FULL_LR - 1), 0, y_full, &pulse_tot, &L_xy, &L_yy, scratch_top_proj); /* 0 --> old floor( 1/( K-1) ) */ +#else + pvq_pyr_project_lrsns_adv(SC + NFULL_LR, xabs, L_xsum, (PULSES_FULL_LR), PULSES_FULL_LR, y_full, &pulse_tot, &L_xy, &L_yy, scratch_top_proj); +#endif + + FOR(k = pulse_tot; k < PULSES_FULL_LR; k++) + { + L_yy = L_add(L_yy, 1); /* pre add 1 in Q0 in L_yyQ0 = (x^2 + 2*x + 1) */ + imax = one_pulse_search_tab_isqrt(SC, PVQ_MAX_VEC_SIZE, xabs, y_full, &pulse_tot, &L_xy, &L_yy, max_xabs); + } + ASSERT(pulse_tot == PULSES_FULL_LR); + + /* full subshape result vector in y_full[0...15] */ + /* L_mac result from splitAB search loop */ + L_search_corr[1] = L_shr_pos(L_xy,1); /* Q11*Q0 */ + L_search_en[1] = L_yy; move32(); /*Q0*/ + + + IF( L_xsumA == 0 ) + { /* no shape in A section, search is meaningless */ + y_split[SC] = PULSES_SPLIT_A_LR; move16(); /*splitAB A-shape set */ + y_split[SC + NA_LR] = PULSES_SPLIT_B_LR; move16(); /*splitAB B-shape set */ + L_search_corr[0] = L_deposit_h(0); + L_search_en[0] = (PULSES_SPLIT_A_LR*PULSES_SPLIT_A_LR + PULSES_SPLIT_B_LR + PULSES_SPLIT_B_LR); move32(); /*Q0*/ + } + ELSE + { /* recalculate A section from the partially available full result ( to remove section B pulses influence in corr^2/en ) */ + pulse_tot = 0; move16(); + L_xy = L_deposit_l(0); + L_yy = L_deposit_l(0); + + basop_memmove(y_splitAB, y_full, (SC + NA_LR) * sizeof(Word16)); /* copy full(15) -> y_splitAB(5+8) (5 first here only) */ + + FOR(i = SC; i < (SC + NA_LR); i++) + { + pulse_tot = add(pulse_tot, y_splitAB[i]); /* Q0 */ + L_xy = L_mac(L_xy, xabs[i], y_splitAB[i]); /* Corr, Q0*Qx +1 --> Qx+1 */ + L_yy = L_mac0(L_yy, y_splitAB[i], y_splitAB[i]); /* Energy, Q(0+0)+1)= Q0 */ + } + + /* search any remaining unit pulses in section A */ + /* (continue up to 6 LF section A pulses) */ + + FOR(k = pulse_tot; k < PULSES_SPLIT_A_LR; k++) + { + L_yy = L_add(L_yy, 1); /* 1 added in Q0 */ + imax = one_pulse_search_tab_isqrt(SC, SC + NA_LR, xabs, y_splitAB, &pulse_tot, &L_xy, &L_yy, max_xabsA); + } + + /* L_mac result from splitAB search loop */ + L_xy_a6_mem = L_xy; move32(); + L_search_corr[0] = L_shr_pos(L_xy,1); /* A-part of AB temporarily saved */ + L_search_en[0] = L_yy; move32(); /* A-part of AB temporarily saved */ + + ASSERT(pulse_tot == PULSES_SPLIT_A_LR); + + basop_memmove(y_splitA0, y_splitAB, (SC + NA_LR) * sizeof(Word16)); /* copy_splitAB(5 first) -> y_splitA (5) */ + + /* search any remaining unit pulses in sectionA for the PVQ(n=5,k=8)+PVQ(n=9,k=0) alternative */ + /* (i.e. add 2 LF pulses, up to 8) */ + + FOR(k = pulse_tot; k < (PULSES_SPLIT_A_LR + PULSES_SPLIT_B_LR); k++) + { + L_yy = L_add(L_yy, 1); /* 1 added in Q0 */ + imax = one_pulse_search_tab_isqrt(SC, SC + NA_LR, xabs, y_splitA0, &pulse_tot, &L_xy, &L_yy, max_xabsA); + } + + + /* note: a local temporary use of the fixed env location "2" for corr and energy memory*/ + L_search_corr[2] = L_xy; move32(); /* A-part of A,0 saved temporarily */ + L_search_en[2] = L_yy; move32(); /* A-part of A,0 saved */ + + /* search B section of splitAB (add 2 HF pulses) */ + L_xy = L_xy_a6_mem; move32(); + L_yy = L_search_en[0]; move32(); + pulse_tot = PULSES_SPLIT_A_LR; move16(); + + IF(L_xsumB != 0) + { + FOR(k = 0; k < PULSES_SPLIT_B_LR; k++) + { + L_yy = L_add(L_yy, 1); /* 1 added in Q0 */ + imax = one_pulse_search_tab_isqrt(SC + NA_LR, SC + NA_LR + NB_LR, xabs, y_splitAB, &pulse_tot, &L_xy, &L_yy, max_xabsB); + } + } + ELSE + { + y_splitAB[SC + NA_LR] = PULSES_SPLIT_B_LR; /* correlation L_xy not increased as x is zero */ + L_yy = L_add(L_yy, PULSES_SPLIT_B_LR * PULSES_SPLIT_B_LR); /* y_splitAB energy increased by 2^2 */ + } + + /* compare the best split shape out of (splitAB), vs (splitA,0) */ + /* if corrAB^2/enAB > corrA^2/enA, then choose AB else A,0 */ + /* energy in L_yy can at most be 64 , and low value is 8 */ + /* however as energy can only take on ~64 values [8 ... 64] */ + /* we use :. if corrAB*sqrt(1/enAB) > corrA* sqrt(1/enA), then choose AB else A,0 */ + { + Word32 L_tmpA0, L_tmpAB; + Word16 tmp_shift; + + /* maximize precision in corr values */ + tmp_shift = s_min(norm_l(L_search_corr[2]), norm_l(L_xy)); + + ASSERT(tmp_shift >= 0); + + ASSERT(L_yy >= 4 && L_search_en[2] > 4 && "isqrt_Q16tab requires energy >=4 "); + L_tmpA0 = Mpy_32_16_0_0(L_shl_pos(L_search_corr[2], tmp_shift), isqrt_Q16tab[L_search_en[2]]); /* nonsaturating Mpy32_16_0_0 used for ARM-SMULWB reuse */ + L_tmpAB = Mpy_32_16_0_0(L_shl_pos(L_xy, tmp_shift), isqrt_Q16tab[L_yy]); + + L_search_corr[0] = L_shr_pos_pos(L_xy, 1); /* assume AB corr as winner */ + L_search_en[0] = L_yy; move32(); /* assume AB energy as winner */ + + IF(L_sub(L_tmpA0, L_tmpAB) > 0) + { + basop_memcpy(y_split, y_splitA0, M * sizeof(Word16)); /* cpy complete LFonly A,0 as the final splitLF output */ + L_search_corr[0] = L_shr_pos_pos(L_search_corr[2], 1); /* set A,0 as winner */ + L_search_en[0] = L_search_en[2]; move32(); /* set A,0 as winner */ + } + } + } /* L_xsumA!=0 */ + } /* L_xsum != 0 */ + + { + /* Fixed envelope signband coding, including sign coding of a shifted block */ + /* subshape idx 2,3,4 , "1"/env 1(s0)+ 2(shift)+ 11bits(s1..s11) + always a 3 bits gain */ + /* subshape idx 5 , "1"/env 1(s0)+ 2(shift)+ 9bits(s1..s9) + always a 3 bits gain */ + /* + 2, init_bell_12signs , [ 8,8,8, 7,7 ... ] + 3, decaying envelope 12 signs, [ 12,12,11,11, ... ] + 4, start_bell_12signs , [ 7,7,8,8,8, 7,... ] + 5, early_bell_10signs, [ 6,6, 7,7,8,8,8,7,... ]*/ + + /* find the minimum shape error across all possible 4 envelopes and all 4 shifts */ + /* maximise normalized cross correlation target*y /sqrt(en(y)) to minimize shape error */ + + basop_memset(y_fix, 0, PVQ_MAX_VEC_SIZE * sizeof(Word16)); /* y_fix buffer was used for y_splitA0 above, reset needed */ + + FOR(fix_ind = 0; fix_ind < SNSLR_N_FIXENV; fix_ind++) + { + FOR(shift_ind = 0; shift_ind < SNSLR_N_FIXENV_SHIFTS; shift_ind++) + { + L_corr = L_deposit_l(0); + envPtr = &(lrsns_fix_env_fx[fix_ind][shift_ind]); /* ptr init to start of the selected Q0 unit pulses */ + xabs1 = &(xabs[SC + shift_ind]); /* ptr init */ + FOR(n = 0; n < lrsns_signs_fix_fx[fix_ind]; n++) + { + ASSERT(envPtr[n] >= 0 && xabs1[n] >= 0); + L_corr = L_mac0(L_corr, xabs1[n], envPtr[n]); /* runtime first octant correlation calc */ + } + + tmp = add(shl_pos(fix_ind, 2), shift_ind); /* fix_ind * 4 + shift_ind */ + L_corr_fixenv[tmp] = L_corr; move32(); + L_corr = L_shl_pos(L_corr, 9); /* always 100% safe to shift up by 9 , tested with input M* 32767*/ + /* energy normalize, for the specific shift and env, + otherwise it is not possible to compare among the fixed shape envelopes */ + L_normcorr_fixenv[tmp] = Mpy_32_16_0_0(L_corr, lrsns_fixenv_enNormQ19[tmp]); + } + } + + /* now actually pick the fixenv[0,1,2,3] and env shift[0,1,2,3] option which maximizes the normcorr + . (also minimizes shape MSE as all fixed envelopes later use the very same 8 level gain quantizer) */ + + Word32 *pL = &(L_normcorr_fixenv[0]); /* ptr init */ + + best_ind = 0; move16(); + FOR(n = 1; n < (SNSLR_N_FIXENV * SNSLR_N_FIXENV_SHIFTS); n++) + { + if (L_sub(pL[n], pL[best_ind]) > 0) + { + best_ind = n; move16(); /* conditional move single BASOP */ + } + } + + /* decompose index */ + best_env_ind = shr_pos_pos(best_ind, 2); + best_shift_ind = sub(best_ind, i_mult(best_env_ind, 4)); + + ASSERT(best_env_ind >= 0 && best_env_ind < SNSLR_N_FIXENV); + ASSERT(best_shift_ind >= 0 && best_shift_ind < SNSLR_N_FIXENV_SHIFTS); + + + *fixShapeNbPtr = best_env_ind; move16(); + *fixShiftIdxPtr = best_shift_ind; move16(); + + basop_memcpy(&(y_fix[add(SC, best_shift_ind)]), &(lrsns_fix_env_fx[best_env_ind][best_shift_ind]), lrsns_signs_fix_fx[best_env_ind] * sizeof(Word16)); /* cpy complete fixed envelope to output */ + + tmp = add(shl_pos(best_env_ind, 2), best_shift_ind); + L_search_corr[2] = L_corr_fixenv[tmp]; move32(); /* L_mac0 result from fixenv normcorr search loop*/ + L_search_en[2] = L_deposit_l(lrsns_fixenv_enQ0[tmp]); /* tabled energy */ + } + + /* sign application for all three shape options */ + /* apply sign of (x_in) to first orthant result in Q0 */ + + FOR(i = SC; i < (SC + NA_LR + NB_LR); i++) + { + if (x_in[i] < 0) + { + y_split[i] = negate(y_split[i]); move16(); /* apply sign for split (AB or A0) */ + } + } + + FOR(i = SC; i < (SC + NFULL_LR); i++) + { + if (x_in[i] < 0) + { + y_full[i] = negate(y_full[i]); move16(); /* apply sign for full */ + } + } + + FOR(i = SC; i < (SC + NFULL_LR); i++) + { + if (x_in[i] < 0) + { + y_fix[i] = negate(y_fix[i]); move16(); /* apply sign for fixed env */ + } + } + + /* prepare Q14 normalized values and run the gain quantization with all remaining 3 shape options */ + /* and prepare Q30 normalized values for HR mode */ + { + + /* calculate each normalized envelope y_Q0[0...M-1]/sqrt(en) and provide result in Q14 */ + + /* make sure Word16 inv_sqrt table lookup is ok */ + ASSERT(L_search_en[0] <= SQRT_EN_MAX_FX && L_search_en[1] <= SQRT_EN_MAX_FX); + ASSERT(L_search_en[0] > 4 && L_search_en[1] > 4); /* inv_sqrt table only valid from energy value 5 */ + + + norm_factors[0] = isqrt_Q16tab[L_search_en[0]]; move16(); move16(); /* Q16 */ + norm_factors[1] = isqrt_Q16tab[L_search_en[1]]; move16(); move16(); /* Q16 */ + tmp = add(shl_pos(best_env_ind, 2), best_shift_ind); + norm_factors[2] = lrsns_fixenv_enNormQ19[tmp]; move16(); /* Q19 */ + + L_norm_factors[0] = isqrt_Q31tab[L_search_en[0]]; move32(); move32(); /* Q31 */ + L_norm_factors[1] = isqrt_Q31tab[L_search_en[1]]; move32(); move32(); /* Q31 */ + L_norm_factors[2] = L_lrsns_fixenv_enNormQ35[tmp]; move32(); + + FOR(n = 0; n < (N_SCF_SEARCH_SHAPES_ST2_LR); n++) + { + /* PVQ and FESS unit energy normalization */ + /* some precomputed norm factor and pre-known normalization shift */ + y = &(y_Q0[n*M]); /* ptr init */ + L_y_norm = &(L_y_normQ30[n*M]); /* ptr init */ + y_norm = &(y_normQ14[n*M]); /* ptr init to signed seq Q14 */ + + ASSERT(y[0] == 0); + pvq_fess_dec_en1_normQ30andQ14_fx( + y /*Q0*/, + lrsns_y_up_bits[n], + L_norm_factors[n], + lrsns_norm_factorQ_L[n], + M, /*M==16 always used to enable simple unroll into 4 */ + L_y_norm, /* for MSEQ22 estimation, and for ENABLE_HR */ + y_norm); /* for gain Q*/ + ASSERT(L_y_norm[0] == 0 && y_norm[0] == 0); + + L_y_norm[0] = 0; move32(); /* DC is always zero in LRSNS stage2 */ + y_norm[0] = 0; move16(); + + + /* establish normalized correlation to target */ + + Word32 L_normcorr_pre_fx = Mpy_32_16_lc3plus(L_search_corr[n], norm_factors[n]); + /* no need to recalc correlation, simply scale with factor */ + /*here Mpy_32_16 shifts left by 1 and maintains maximum precision */ + /*For ARM the somewhat better/native 32_16_0_0() without saturation, however not used here */ + + Word16 g_shiftright_opt[3] = { 0 , 0 , 3 }; /* down_shift(right) to get result as "g_opt*2" in Q11 */ + Word32 L_normcorrX2_opt_fx = L_shr_pos_pos(L_normcorr_pre_fx, g_shiftright_opt[n]); /* -2*g_opt for MSE calc , in Q11 */ + + /* MSE= t_2 + g^2*1.0 -(2*g_opt)*g , with g_opt = corr(t_2,x_n) */ + + gTabPtr = (const Word16 *)lrsns_vq_gainsQ12_fx[n]; move32(); /* q gains in Q12, n-adaptive ptr init */ + L_mse = L_deposit_l(0); + L_min_mse_opt = L_add(MAX_32, 0); /* min_MSE w/o target energy gain loop */ + + FOR(gidx = 0; gidx < lrsns_vq_gain_lvls_fx[n]; gidx++) + { + /* adding at the same Q required, we use Q22 in search loop for now */ + /* g_q*(g_q - 2*g_opt)/ */ + /* (-2*g_opt)*g_q + g_q*g_q = g_q*(g_q-2*g_opt) , Q11*Q11->Q22 */ + + L_g_q_tmp = L_shr_pos(L_deposit_h(gTabPtr[gidx]), 2); /* from Q12 to 12+16-2-> Q26 */ + L_tmp = L_shl_pos(L_normcorrX2_opt_fx, 15); /*11+15 -> 26 */ + ASSERT(L_normcorrX2_opt_fx <= 32767 && "L_normcorrX2_opt_fx <= 32767 "); /* should fit in Word16 */ + + L_tmp = L_sub(L_g_q_tmp, L_tmp); /* Q26-Q26 --> Q26 */ + + L_mse = Mpy_32_16_0_0(L_tmp, gTabPtr[gidx]); /* Q26+Q12 - 16 => 22 */ + + L_min_mse_opt = L_min(L_min_mse_opt, L_mse); + if (L_sub(L_mse, L_min_mse_opt) == 0) + { + gain_idx_opt = gidx; move16(); /* single BASOP, conditional move */ + } + } + gain_idx_opt_save[n] = gain_idx_opt; move16(); + L_min_mse_opt_save[n] = L_min_mse_opt; move32(); + + } /* shape n */ + + /* get the best min(MSE) among the 3 shapes */ + shape_idx_opt = 0; move16(); + L_min_mse_opt = L_min_mse_opt_save[shape_idx_opt]; move32(); + FOR(n = 1; n < (N_SCF_SEARCH_SHAPES_ST2_LR); n++) + { + L_min_mse_opt = L_min(L_min_mse_opt_save[n], L_min_mse_opt); + if (L_sub(L_min_mse_opt, L_min_mse_opt_save[n]) == 0) + { + shape_idx_opt = n; move16(); /* single basop */ + } + } + /* provide function output */ + *s_idxPtr = shape_idx_opt; move16(); + *g_idxPtr = gain_idx_opt_save[*s_idxPtr]; move16(); + *L_MSEQ22Ptr = L_sub(L_min_mse_opt, L_targetEnNeg); /* search based MSE, add target energy to gain part of MSE (sum t*2) */ + *g_qvalQ12Ptr = lrsns_vq_gainsQ12_fx[*s_idxPtr][*g_idxPtr]; + + ASSERT(L_min_mse_opt == L_min_mse_opt_save[*s_idxPtr]); + + + + /** Recalculate winning stage2 MSE with high precision **/ + L_MSEQ22_recalc = 0; + L_normcorrQy = 0; /* INT32_MIN; */ + + /* shift up input signal to the max with a margin of 4 bits. */ + Word16 x_in_upshift = norm_s(max_xabs); + + /* accumulate 15 values, would typically require ~4 bits margin , however we know only 12 can have a non-zero value */ + x_in_upshift = s_max(sub(x_in_upshift, 4), 0); + + FOR(i = 1; i < M; i++) + { + L_tmp = Mpy_32_16_0_0(L_y_normQ30[*s_idxPtr*M + i], shl_pos(x_in[i], x_in_upshift)); /* signed*signed */ + L_normcorrQy = L_add(L_normcorrQy, L_tmp); + } + L_normcorrQy = L_shr_pos(L_normcorrQy, x_in_upshift); /* back to Q25 */ + + + /* x_in^2 + gq^2*1 - 2*gq*gopt */ + L_MSEQ22_recalc = L_negate(L_targetEnNeg); + L_tmp = L_shr_pos(L_mult0(*g_qvalQ12Ptr, *g_qvalQ12Ptr), 2); + L_MSEQ22_recalc = L_add(L_MSEQ22_recalc, L_tmp); + L_tmp = L_shl_pos(Mpy_32_16_0_0(L_normcorrQy, *g_qvalQ12Ptr), (26 + 1) - 25); /* Qy+12-16+lshift = 22, --> lshift = 26-Qy , 2.0 factor -> add 1 leftshift*/ + + L_MSEQ22_recalc = L_sub(L_MSEQ22_recalc, L_tmp); + + *L_MSEQ22Ptr = L_max(L_MSEQ22_recalc, 0L); move32(); /*use high precision result recalculated MSE for winner */ + + + + ASSERT(*L_MSEQ22Ptr >= 0 && " warning negative total MSE "); + + + } /* shape norm and gain calc , and shape decision */ + +#ifdef WMOPS + pop_wmops(); +#endif + + Dyn_Mem_Deluxe_Out(); +} +#endif + diff --git a/lib_lc3plus/pvq_index_fx.c b/lib_lc3plus/pvq_index_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..5d216df5ef4fc87d863d15f3f1ea84892007d625 --- /dev/null +++ b/lib_lc3plus/pvq_index_fx.c @@ -0,0 +1,515 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +#define SIGNBIT_FX 0x80000000u +#define SIGNBIT_SHRT_FX 0x8000 + +static void initOffsets_fx(Word16 dim_in, UWord32 *h_mem, + Word16 k_val_in) /* may be removed with tables for N=16,10,6 */ +{ + UWord32 k_val_prev, k_val_curr; + UWord32 k_val, UL_k_val_in; +#ifdef DYNMEM_COUNT + Dyn_Mem_In("initOffsets_fx", sizeof(struct { + UWord32 k_val_prev, k_val_curr; + UWord32 k_val, UL_k_val_in; + })); +#endif + + h_mem[0] = UL_deposit_l(0); + h_mem[1] = UL_deposit_l(1); + + UL_k_val_in = UL_deposit_l(k_val_in); + IF (sub(dim_in, 2) == 0) + { + FOR (k_val = 2; k_val <= UL_k_val_in; k_val++) + { + h_mem[k_val] = UL_subNsD(UL_lshl(k_val, 1), 1U); move32(); + } + h_mem[k_val] = UL_k_val_in; move32(); + } + ELSE + { + k_val_prev = UL_deposit_l(1U); + FOR (k_val_curr = 2; k_val_curr <= UL_k_val_in; k_val_curr++) + { + h_mem[k_val_curr] = UL_addNsD(1U, UL_Mpy_32_32(k_val_curr, UL_lshl(k_val_prev, 1))); move32(); + k_val_prev = UL_addNsD(k_val_curr, 0U); + } + h_mem[k_val_curr] = UL_Mpy_32_32(k_val_curr, k_val_prev); move32(); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +static void a_fwd_fx(UWord32 *a_in, /* i/o: offsets */ + Word16 n_items /* i : items, k's */ +) +{ + UWord32 a_1, a_in0; + Counter i; + UWord32 *a_in_prev_ptr; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("a_fwd_fx", sizeof(struct { + UWord32 a_1, a_in0; + Counter i; + UWord32 *a_in_prev_ptr; + })); +#endif + + a_in0 = UL_deposit_l(1); + + a_in_prev_ptr = &(a_in[-1]); + FOR (i = 1; i <= n_items; i++) + { + a_1 = UL_addNsD(a_in0, UL_addNsD(a_in_prev_ptr[i], a_in[i])); + a_in_prev_ptr[i] = a_in0; move32(); + a_in0 = UL_addNsD(a_1, 0U); + } + a_in_prev_ptr[i] = a_in0; move32(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +static void a_bwd_fx(UWord32 *a_in, /* i/o: offsets */ + Word16 n_items /* i: n_items */ +) +{ + UWord32 a_1, a_in0; + Counter i; + UWord32 *a_in_prev_ptr; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("a_bwd_fx", sizeof(struct { + UWord32 a_1, a_in0; + Counter i; + UWord32 *a_in_prev_ptr; + })); +#endif + + a_in0 = UL_deposit_l(0); + a_in_prev_ptr = &(a_in[-1]); + + FOR (i = 1; i <= n_items; i++) + { + a_1 = UL_subNsD(UL_subNsD(a_in[i], a_in0), a_in_prev_ptr[i]); + a_in_prev_ptr[i] = a_in0; move32(); + a_in0 = UL_addNsD(a_1, 0U); + } + a_in_prev_ptr[i] = a_in0; move32(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +static void a_u_fwd_fx(UWord32 *a_u_in, Word16 k_val_in, Word16 mem_size_m1) +{ + UWord32 u_kp1_prev, u_kp1; + UWord32 u_k_prev; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("a_u_fwd_fx", sizeof(struct { + UWord32 u_kp1_prev, u_kp1; + UWord32 u_k_prev; + })); +#endif + + u_kp1_prev = a_u_in[mem_size_m1]; move32(); + u_k_prev = UL_lshr(a_u_in[k_val_in], 1); + + a_fwd_fx(&a_u_in[1], k_val_in); + + u_kp1 = UL_lshr(a_u_in[k_val_in], 1); + a_u_in[mem_size_m1] = UL_addNsD(1U, UL_addNsD(u_kp1_prev, UL_addNsD(u_k_prev, u_kp1))); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +static Word16 get_lead_sign_fx(UWord32 *ind) +{ + Word16 leading_sign; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("get_lead_sign_fx", sizeof(struct { Word16 leading_sign; })); +#endif + + leading_sign = 1; move16(); + if (UL_and(*ind, 1) != 0) + { + leading_sign = -1; move16(); + } + (*ind) = UL_lshr(*ind, 1); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif + + return leading_sign; +} + +/*-------------------------------------------------------------------* + * mind2vec_one_fx() + *-------------------------------------------------------------------*/ +static void mind2vec_one_fx(Word16 k_val_in, /* i: nb unit pulses , [ 0...K_MAX ] */ + Word16 leading_sign, /* i: leading sign -1, 0, 1*/ + UWord32 ind, /* i: index */ /* parameter could be omitted */ + Word16 *vec_out /* o: pulse train */ +) +{ + *vec_out = (Word16)ind; /* dummy assignment to handle the common ind parameter warning */ + + if (leading_sign < 0) + { + k_val_in = negate(k_val_in); + } + *vec_out = k_val_in; move16(); +} + +static Word16 setval_update_sign_fx(Word16 k_delta, Word16 k_max_local, Word16 *leading_sign, UWord32 *ind_in, + Word16 *vec_out) +{ + IF (k_delta != 0) + { + mind2vec_one_fx(k_delta, *leading_sign, *ind_in, vec_out); + *leading_sign = get_lead_sign_fx(ind_in); + k_max_local = sub(k_max_local, k_delta); + } + return k_max_local; +} + +/*-------------------------------------------------------------------* + * mind2vec_fx() + *-------------------------------------------------------------------*/ +static void mind2vec_fx(Word16 dim_in, /* i: dimension */ + Word16 k_max_local, /* i: nb unit pulses */ + Word16 leading_sign, /* i: leading sign */ + UWord32 ind, /* i: index */ + Word16 * vec_out, /* o: pulse train */ + UWord32 *h_in /* i: offset vector A=1+2U */ +) +{ + Counter pos; + Word16 k_acc, k_delta; + UWord32 UL_tmp_offset, UL_diff; + UWord16 sgn; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("mind2vec_fx", sizeof(struct { + Counter pos; + Word16 k_acc, k_delta; + UWord32 UL_tmp_offset, UL_diff; + UWord16 sgn; + })); +#endif + + k_acc = k_max_local; move16(); + FOR (pos = 0; pos < dim_in; pos++) + { + + IF (ind != 0) + { + + k_acc = k_max_local; move16(); + + UL_tmp_offset = UL_addNsD(h_in[k_acc], 0U); + + UL_diff = UL_subNs(ind, UL_tmp_offset, &sgn); + + WHILE (sgn) + { + UL_diff = UL_subNs(ind, h_in[--k_acc], &sgn); + } + + ind = UL_addNsD(UL_diff, 0U); + + k_delta = sub(k_max_local, k_acc); + } + ELSE + { + mind2vec_one_fx(k_max_local, leading_sign, ind, &vec_out[pos]); + BREAK; + } + + k_max_local = setval_update_sign_fx(k_delta, k_max_local, &leading_sign, &ind, &vec_out[pos]); + + a_bwd_fx(h_in, add(k_max_local, 1)); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +PvqEntry_fx get_size_mpvq_calc_offset_fx( /* o : size, dim, k_val */ + Word16 dim_in, /* i : dimension */ + Word16 k_val_in, /* i : nb unit pulses */ + UWord32 *h_mem /* o : offsets */ +) +{ + Counter i; + PvqEntry_fx entry; + Word16 kp1; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("get_size_mpvq_calc_offset_fx", sizeof(struct { + Counter i; + PvqEntry_fx entry; + Word16 kp1; + })); +#endif + + entry.dim = dim_in; move16(); + entry.k_val = k_val_in; move16(); + + entry.index = L_deposit_l(0); + entry.lead_sign_ind = 0; move16(); + + ASSERT(dim_in <= M); + ASSERT(tabledKMAX[dim_in] != 0); + + /* tabled values for worst case K */ /* made into table lookup for N=16, 10, 6 */ + kp1 = add(k_val_in, 1); + FOR (i = 0; i <= kp1; i++) /* A+U copying */ + { + h_mem[i] = + UL_addNsD(MPVQ_offs_ptr[dim_in][i], 0U); /* a vector copying is needed as MPVQ recursion is in place */ + } + /* special handling of last U offset in k+1 column */ + if (sub(k_val_in, tabledKMAX[dim_in]) != 0) + { + h_mem[kp1] = UL_lshr(h_mem[kp1], 1); /* (A+1)/2 , convert from A(K+1) to U(K+1) domain */ + } + entry.size = + UL_addNsD(1U, UL_addNsD(h_mem[kp1], UL_lshr(h_mem[k_val_in], 1))); /* MPVQ size calc. 1 + H(K+1) + (A(K)>>1) */ + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif + + return entry; +} + +/*-------------------------------------------------------------------* + * mpvq_deindex_fx() + *-------------------------------------------------------------------*/ +void mpvq_deindex_fx( /* o : void */ + const PvqEntry_fx *entry, /* i : sign_ind, index, dim, k_val */ + UWord32 * h_mem, /* i : A/U offsets */ + Word16 * vec_out /* o : pulse train */ +) +{ + Word16 leading_sign; +#ifdef DYNMEM_COUNT + Dyn_Mem_In("mpvq_deindex_fx", sizeof(struct { Word16 leading_sign; })); +#endif +#ifdef WMOPS + push_wmops("mpvq_deindex_fx"); +#endif + + basop_memset(vec_out, 0, (entry->dim) * sizeof(Word16)); + + leading_sign = 1; move16(); + if (entry->lead_sign_ind != 0) + { + leading_sign = -1; move16(); + } + + IF (entry->k_val != 0) + { + mind2vec_fx(entry->dim, entry->k_val, leading_sign, entry->index, vec_out, h_mem); + } +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif +} + +/*-------------------------------------------------------------------* + * vec2mind_two_fx() + *-------------------------------------------------------------------*/ +static void vec2mind_two_fx(const Word16 *vec_in, /* i : PVQ pulse train */ + Word16 * k_val_out_ptr, /* o : number of unit pulses */ + UWord32 * next_sign_ind, /* i/o: next sign ind */ + UWord32 * ind /* o: MPVQ index */ +) +{ + UWord32 lead_sign_ind_add; + Word16 abs0, abs1, abs01, sptr; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("vec2mind_two_fx", sizeof(struct { + UWord32 lead_sign_ind_add; + Word16 abs0, abs1, abs01, sptr; + })); +#endif + + abs0 = abs_s(vec_in[0]); + abs1 = abs_s(vec_in[1]); + abs01 = add(abs0, abs1); + *k_val_out_ptr = abs01; move16(); + *ind = UL_deposit_l(0); + + *next_sign_ind = UL_deposit_h(SIGNBIT_SHRT_FX); + + IF (abs01 != 0) + { + sptr = 0; move16(); + *next_sign_ind = UL_deposit_l(sptr); + + test(); + IF (abs0 != 0 && abs1 != 0) + { + lead_sign_ind_add = UL_deposit_l(1); + if (vec_in[1] < 0) + { + lead_sign_ind_add = UL_deposit_l(2); + } + *ind = UL_addNsD(UL_deposit_l((UWord16)lshl(sub(abs1, 1), 1)), lead_sign_ind_add); + } + ELSE + { + IF (abs0 == 0) + { + *ind = UL_deposit_l((UWord16)sub(lshl(abs1, 1), 1)); + sptr = 1; move16(); + } + } + + if (vec_in[sptr] < 0) + { + *next_sign_ind = UL_deposit_l(1); + } + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +static void enc_push_sign(Word16 val, UWord32 *next_sign_ind, UWord32 *index) +{ + test(); + IF ((UL_and(*next_sign_ind, SIGNBIT_FX) == 0) && (val != 0)) + { + *index = UL_addNsD(UL_lshl(*index, 1), *next_sign_ind); + } + if (val < 0) + { + *next_sign_ind = UL_deposit_l(1); + } + if (val > 0) + { + *next_sign_ind = UL_deposit_l(0); + } +} + +static void vec2mind_fx(Word16 dim_in, /* i : dim */ + Word16 k_val_in, /* i : number of unit pulses */ + const Word16 *vec_in, /* i : PVQ pulse train */ + UWord32 * next_sign_ind, /* o : pushed leading sign */ + UWord32 * index, /* o : MPVQ index */ + UWord32 * N_MPVQ_ptr, /* o : size(N_MPVQ(dim,K_val_in))*/ + UWord32 * h_mem) /* o : offsets */ +{ + Counter pos; + Word16 mem_size_m1, k_val_acc, tmp_val; + UWord32 tmp_h; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("vec2mind_fx", sizeof(struct { + Counter pos; + Word16 mem_size_m1, k_val_acc, tmp_val; + UWord32 tmp_h; + })); +#endif + + mem_size_m1 = add(k_val_in, 1); + *next_sign_ind = UL_deposit_h(SIGNBIT_SHRT_FX); + + pos = sub(dim_in, 2); + vec2mind_two_fx(&vec_in[pos], &k_val_acc, next_sign_ind, index); + initOffsets_fx(3, h_mem, k_val_in); + + tmp_h = h_mem[k_val_acc]; move32(); + FOR (pos--; pos >= 0; pos--) + { + tmp_val = vec_in[pos]; move16(); + enc_push_sign(tmp_val, next_sign_ind, index); + + *index = UL_addNsD(*index, tmp_h); + + k_val_acc = add(k_val_acc, abs_s(tmp_val)); + + IF (pos != 0) + { + a_u_fwd_fx(h_mem, k_val_in, mem_size_m1); + } + tmp_h = UL_addNsD(h_mem[k_val_acc], 0U); + } + *N_MPVQ_ptr = UL_addNsD(1U, UL_addNsD(UL_lshr(tmp_h, 1), h_mem[mem_size_m1])); move32(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +PvqEntry_fx mpvq_index_fx( /* o : leading_sign_index, index, size, k_val */ + const Word16 *vec_in, /* i : signed pulse train */ + Word16 dim_in, /* i : dimension */ + Word16 k_val_local /* i : nb unit pulses */ +) +{ + PvqEntry_fx result; + UWord32 h_mem[1 + KMAX_FX + 1]; + UWord32 lead_sign_ind; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("mpvq_index_fx", sizeof(struct { + PvqEntry_fx result; + UWord32 h_mem[1 + KMAX_FX + 1]; + UWord32 lead_sign_ind; + })); +#endif +#ifdef WMOPS + push_wmops("mpvq_index_fx"); +#endif + + ASSERT(k_val_local <= KMAX_FX); + + result.k_val = k_val_local; move16(); + result.dim = dim_in; move16(); + + vec2mind_fx(dim_in, k_val_local, vec_in, &lead_sign_ind, &result.index, &result.size, h_mem); + + result.lead_sign_ind = u_extract_l(lead_sign_ind); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +#ifdef WMOPS + pop_wmops(); +#endif + + return result; +} + diff --git a/lib_lc3plus/quantize_spec_fx.c b/lib_lc3plus/quantize_spec_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..147000186f269b769767a0d4d3978056b7bf3894 --- /dev/null +++ b/lib_lc3plus/quantize_spec_fx.c @@ -0,0 +1,1169 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +#ifdef ENABLE_HR_MODE +void processQuantizeSpec_fx(Word32 x[], Word16 x_e, Word32 gain, Word16 gain_e, Word32 xq[], Word16 nt, Word16 target, + Word16 totalBits, Word16 *nBits, Word16 *nBits2, Word16 fs_idx, Word16 *lastnzout, + Word16 *codingdata, Word16 *lsbMode, Word16 mode, Word16 hrmode) +{ + + Word32 a1, b1, a1_i, b1_i; + Word16 t, lev1; + Word16 lastnz, lastnz2; + Word16 rateFlag; + Word32 nbits32, nbits232, target32; + Word16 nt_half; + Word32 c, ab_max, msb, a1_msb, b1_msb; + Word16 levmax; + Word16 s; + Word16 totBits, nbits_lsb; + Counter k, lev; + Word16 maxlevs; +#ifndef FUNCTION_quantizeSpec_func1 + Word16 tmp16; + Word32 offs32; + Counter i; +#else + Word32 ARM_params[3]; +#endif + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processQuantizeSpec_fx", sizeof(struct { + Word32 a1, b1, a1_i, b1_i, ab_max, c; + Word16 t, lev1; + Word16 lastnz, lastnz2; + Word16 rateFlag; + Word32 nbits32, nbits232; + Word16 nt_half; + Word16 msb, a1_msb, b1_msb, levmax; + Counter k, lev, i; + Word16 s; + Word16 tmp16; + Word32 offs32, target32; + Word16 totBits, nbits_lsb; + Word16 maxlevs; + })); +#endif + + assert(target >= 0); + + /* Quantization */ + gain = invFixp(gain, &gain_e); + + maxlevs = 21; + IF (hrmode) + { + s = sub(add(x_e, gain_e), 23); + s = s_min(s, 31); +#ifdef FUNCTION_quantizeSpec_func1 + ARM_params[0] = gain; + ARM_params[1] = s; + + quantizeSpec_func1_hr_ip(xq, x, nt, ARM_params); +#else + IF(s > 4) + { + s = sub(s, 4); /* Use extra bits of precision for fine calculation */ + FOR(i = 0; i < nt; i++) + { + offs32 = Mpy_32_32_lc3plus(L_shl_pos(x[i], s), gain); /* multiply */ + xq[i] = L_shr_r_pos(offs32, 4); /* Convert to Q0 with rounding */ + /* rounding is the equivalent of adding 0.5, which is the offset in hrmode */ + + move32(); + } + } + ELSE + { + FOR(i = 0; i < nt; i++) + { + offs32 = Mpy_32_32_lc3plus(x[i], gain); /* multiply */ + offs32 = L_shl(offs32, s); /* convert to 23Q8 */ + xq[i] = L_shr_r_pos(offs32, 8); /* Convert to Q0 with rounding */ + /* rounding is the equivalent of adding 0.5, which is the offset in hrmode */ + + move32(); + } + } +#endif /* FUNCTION_quantizeSpec_func1 */ + } + ELSE + { + s = sub(add(x_e, gain_e), 15); + s = s_max(s_min(s, 15), -15); +#ifdef FUNCTION_quantizeSpec_func1 + ARM_params[0] = gain; + ARM_params[1] = s; + ARM_params[2] = -4096; + quantizeSpec_func1_ip(xq, x, nt, ARM_params); +#else + FOR (i = 0; i < nt; i++) + { + + offs32 = Mpy_32_32_lc3plus(L_abs(x[i]), gain); /* multiply */ + offs32 = L_shl( offs32, s ); /* convert to 15Q16 */ + tmp16 = mac_r(offs32, -4096, 1); /* add offset and truncate */ + if (x[i] < 0) + tmp16 = negate(tmp16); /* restore sign */ + + /* Normal quantization: xq[i] = x[i] / gg + sign(x[i]) * 0.375 + quant_offset is -0.125 in Q15 and round adds 0.5 in Q16. Hence + mac_r results in abs(x[i])/gain - 0.125 + 0.5 = abs(x[i])/gain + 0.375. + Due to the abs and negate combination this achieves the same result + as spec. + */ + + xq[i] = tmp16; + move16(); + } +#endif /* FUNCTION_quantizeSpec_func1 */ + } + /* Rate flag */ + rateFlag = 0; + move16(); + if (fs_idx != 5) + { + if (sub(totalBits, add(160, i_mult(fs_idx, 160))) > 0) + { + rateFlag = 2 << NBITS_CONTEXT; + move16(); + } + } + + /* Init */ + nt_half = shr_pos(nt, 1); + c = 0; + move16(); + t = 0; + move16(); + a1_i = 0; + move16(); + b1_i = 1; + move16(); + target32 = L_shl_pos(L_deposit_l(target), SYM_BITS_Q); + nbits32 = L_negate(target32); + nbits232 = 0; + move32(); + nbits_lsb = 0; + move16(); + + if (fs_idx != 5) + { + IF (mode == 0 && sub(totalBits, add(480, i_mult(fs_idx, 160))) >= 0) + { + mode = 1; + move16(); + } + } + + /* Find last non-zero tuple */ + lastnz = find_last_nz_pair(xq, nt); + IF (mode >= 0) + { + lastnz2 = 2; + } + ELSE + { + lastnz2 = lastnz; + } + + IF (mode < 0) + { + /* Main Loop through the 2-tuples */ + FOR (k = 0; k < lastnz; k += 2) + { + + /* Get context */ + t = add(c, rateFlag); + if (sub(k, nt_half) > 0) + { + t = add(t, 1 << NBITS_CONTEXT); + } + codingdata[0] = t; + move16(); + + /* Init current 2-tuple encoding */ + a1 = L_abs(xq[a1_i]); + b1 = L_abs(xq[b1_i]); + ab_max = L_max(a1, b1); + + IF (ab_max == 0) + { + codingdata[1] = -1; + move16(); + codingdata[2] = 0; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][0]); + c = add(shl_pos(s_and(c, 0xf), 4), 1); + } + ELSE IF (L_sub(ab_max, A_THRES) < 0) + { + codingdata[1] = 0; + move16(); + msb = L_add(a1, L_shl_pos(b1, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + c = L_add(shl_pos(s_and(c, 0xf), 4), L_add(L_add(a1, b1), 1)); + } + ELSE IF (L_sub(ab_max, 2 * A_THRES) < 0) + { + codingdata[1] = 1; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][VAL_ESC]); + nbits32 = L_add(nbits32, 2 << SYM_BITS_Q); + a1_msb = L_shr_pos_pos(a1, 1); + b1_msb = L_shr_pos_pos(b1, 1); + msb = L_add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[1]]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + c = L_add(shl_pos(s_and(c, 0xf), 4), L_add(L_shl_pos(L_add(a1_msb, b1_msb), 1), 1)); + } + ELSE + { + levmax = sub(maxlevs, sub(norm_l(ab_max), 8)); + codingdata[1] = levmax; + move16(); + FOR (lev = 0; lev < levmax; lev++) + { + lev1 = s_min(lev, 3); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][VAL_ESC]); + } + nbits32 = L_add(nbits32, L_shl_pos(L_deposit_l(levmax), SYM_BITS_Q + 1)); + a1_msb = L_shr(a1, levmax); + b1_msb = L_shr(b1, levmax); + msb = L_add(a1_msb, L_shl_pos(b1_msb, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + lev1 = s_min(levmax, 3); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + c = add(shl_pos(s_and(c, 0xf), 4), add(12, s_min(levmax, 3))); + } + + a1_i += 2; + b1_i += 2; + codingdata += 3; + + } /* end of the 2-tuples loop */ + } + ELSE IF (mode == 0) + { + /* Main Loop through the 2-tuples */ + FOR (k = 0; k < lastnz; k += 2) + { + + /* Get context */ + t = add(c, rateFlag); + if (sub(k, nt_half) > 0) + { + t = add(t, 1 << NBITS_CONTEXT); + } + + codingdata[0] = t; + move16(); + + /* Init current 2-tuple encoding */ + a1 = L_abs(xq[a1_i]); + b1 = L_abs(xq[b1_i]); + ab_max = L_max(a1, b1); + + IF (ab_max == 0) + { + codingdata[1] = -1; + move16(); + codingdata[2] = 0; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][0]); + c = add(shl_pos(s_and(c, 0xf), 4), 1); + } + ELSE IF (L_sub(ab_max, A_THRES) < 0) + { + codingdata[1] = 0; + move16(); + msb = L_add(a1, L_shl_pos(b1, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + + if (nbits32 <= 0) + { + lastnz2 = add(k, 2); + } + if (nbits32 <= 0) + { + nbits232 = nbits32; + move32(); + } + + c = L_add(shl_pos(s_and(c, 0xf), 4), L_add(L_add(a1, b1), 1)); + } + ELSE IF (L_sub(ab_max, 2 * A_THRES) < 0) + { + codingdata[1] = 1; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][VAL_ESC]); + nbits32 = L_add(nbits32, 2 << SYM_BITS_Q); + a1_msb = L_shr_pos_pos(a1, 1); + b1_msb = L_shr_pos_pos(b1, 1); + msb = L_add(a1_msb, L_shl_pos(b1_msb, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[1]]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + + if (nbits32 <= 0) + { + lastnz2 = add(k, 2); + } + if (nbits32 <= 0) + { + nbits232 = nbits32; + move32(); + } + + c = add(shl_pos(s_and(c, 0xf), 4), L_add(L_shl_pos(L_add(a1_msb, b1_msb), 1), 1)); + } + ELSE + { + levmax = sub(maxlevs, sub(norm_l(ab_max), 8)); + codingdata[1] = levmax; + move16(); + FOR (lev = 0; lev < levmax; lev++) + { + lev1 = s_min(lev, 3); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][VAL_ESC]); + } + nbits32 = L_add(nbits32, L_shl_pos(L_deposit_l(levmax), SYM_BITS_Q + 1)); + a1_msb = L_shr(a1, levmax); + b1_msb = L_shr(b1, levmax); + msb = L_add(a1_msb, L_shl_pos(b1_msb, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + lev1 = s_min(levmax, 3); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + + if (nbits32 <= 0) + { + lastnz2 = add(k, 2); + } + if (nbits32 <= 0) + { + nbits232 = nbits32; + move32(); + } + + c = add(shl_pos(s_and(c, 0xf), 4), add(12, s_min(levmax, 3))); + } + + a1_i += 2; + b1_i += 2; + codingdata += 3; + + } /* end of the 2-tuples loop */ + } + ELSE + { + /* Main Loop through the 2-tuples */ + FOR (k = 0; k < lastnz; k += 2) + { + + /* Get context */ + t = add(c, rateFlag); + + if (sub(k, nt_half) > 0) + { + t = add(t, 1 << NBITS_CONTEXT); + } + + codingdata[0] = t; + move16(); + + /* Init current 2-tuple encoding */ + a1 = L_abs(xq[a1_i]); + b1 = L_abs(xq[b1_i]); + ab_max = L_max(a1, b1); + + IF (ab_max == 0) + { + codingdata[1] = -1; + move16(); + codingdata[2] = 0; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][0]); + c = add(shl_pos(s_and(c, 0xf), 4), 1); + } + ELSE IF (L_sub(ab_max, A_THRES) < 0) + { + codingdata[1] = 0; + move16(); + msb = L_add(a1, L_shl_pos(b1, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + + if (nbits32 <= 0) + { + lastnz2 = add(k, 2); + } + if (nbits32 <= 0) + { + nbits232 = nbits32; + move32(); + } + + c = add(shl_pos(s_and(c, 0xf), 4), add(add(a1, b1), 1)); + } + ELSE IF (L_sub(ab_max, 2 * A_THRES) < 0) + { + codingdata[1] = 1; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][VAL_ESC]); + a1_msb = L_shr_pos_pos(a1, 1); + b1_msb = L_shr_pos_pos(b1, 1); + msb = L_add(a1_msb, L_shl_pos(b1_msb, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[1]]][msb]); + if (a1_msb != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1_msb != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + nbits_lsb = add(nbits_lsb, 2); + if (L_sub(a1, 1) == 0) + { + nbits_lsb = add(nbits_lsb, 1); + } + if (L_sub(b1, 1) == 0) + { + nbits_lsb = add(nbits_lsb, 1); + } + + if (nbits32 <= 0) + { + lastnz2 = add(k, 2); + } + if (nbits32 <= 0) + { + nbits232 = nbits32; + move32(); + } + + c = add(shl_pos(s_and(c, 0xf), 4), add(shl_pos(add(a1_msb, b1_msb), 1), 1)); + } + ELSE + { + levmax = sub(maxlevs, sub(norm_l(ab_max), 8)); + codingdata[1] = levmax; + move16(); + FOR (lev = 0; lev < levmax; lev++) + { + lev1 = s_min(lev, 3); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][VAL_ESC]); + } + nbits32 = L_add(nbits32, L_shl_pos(L_deposit_l(sub(levmax, 1)), SYM_BITS_Q + 1)); + a1_msb = L_shr(a1, levmax); + b1_msb = L_shr(b1, levmax); + msb = L_add(a1_msb, L_shl_pos(b1_msb, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + lev1 = s_min(levmax, 3); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][msb]); + a1_msb = L_shr_pos(a1, 1); + b1_msb = L_shr_pos(b1, 1); + if (a1_msb != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1_msb != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + nbits_lsb = add(nbits_lsb, 2); + if (L_sub(a1, 1) == 0) + { + nbits_lsb = add(nbits_lsb, 1); + } + if (L_sub(b1, 1) == 0) + { + nbits_lsb = add(nbits_lsb, 1); + } + + if (nbits32 <= 0) + { + lastnz2 = add(k, 2); + } + if (nbits32 <= 0) + { + nbits232 = nbits32; + move32(); + } + + c = add(shl_pos(s_and(c, 0xf), 4), add(12, s_min(levmax, 3))); + } + + a1_i += 2; + b1_i += 2; + codingdata += 3; + + } /* end of the 2-tuples loop */ + } + + /* Number of consumed bits */ + nbits32 = L_add(nbits32, target32); + totBits = add(extract_l(L_shr_pos_pos(L_sub(nbits32, 1), SYM_BITS_Q)), 1); + IF (mode > 0) + { + totBits = add(totBits, nbits_lsb); + } + IF (nBits != NULL) + { + *nBits = totBits; + } + IF (mode >= 0) + { + nbits232 = L_add(nbits232, target32); + *nBits2 = add(extract_l(L_shr_pos(L_sub(nbits232, 1), SYM_BITS_Q)), 1); + } + ELSE + { + *nBits2 = *nBits; + move16(); + } + IF (mode > 0) + { + *nBits2 = add(*nBits2, nbits_lsb); + } + *lastnzout = lastnz2; + + /* Truncation of high frequency coefficients */ + IF (lastnz > lastnz2) + { + basop_memset(&xq[lastnz2], 0, (lastnz - lastnz2) * sizeof(*xq)); + } + + /* Truncation of LSBs */ + test(); + IF (mode > 0 && sub(totBits, target) > 0) + { + *lsbMode = 1; + move16(); + } + ELSE + { + *lsbMode = 0; + move16(); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +#else /* ENABLE_HR_MODE */ + +void processQuantizeSpec_fx(Word32 x[], Word16 x_e, Word16 gain, Word16 gain_e, Word16 xq[], Word16 nt, Word16 target, + Word16 totalBits, Word16 *nBits, Word16 *nBits2, Word16 fs_idx, Word16 *lastnzout, + Word16 *codingdata, Word16 *lsbMode, Word16 mode +) +{ + + Word16 a1, b1, a1_i, b1_i; + Word16 t, lev1; + Word16 lastnz, lastnz2; + Word16 rateFlag; + Word32 nbits32, nbits232, target32; + Word16 nt_half; + Word16 c, ab_max, msb, a1_msb, b1_msb, levmax; + Word16 s; + Word16 totBits, nbits_lsb; + Counter k, lev; + Word16 tmp16; + Word32 offs32; + Counter i; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processQuantizeSpec_fx", sizeof(struct { + Word16 a1, b1, a1_i, b1_i; + Word16 t, lev1; + Word16 lastnz, lastnz2; + Word16 rateFlag; + Word32 nbits32, nbits232; + Word16 nt_half; + Word16 c, ab_max, msb, a1_msb, b1_msb, levmax; + Counter k, lev, i; + Word16 s; + Word16 tmp16; + Word32 offs32, target32; + Word16 totBits, nbits_lsb; + })); +#endif + + /* Quantization */ + gain = Inv16(gain, &gain_e); + s = sub(add(x_e, gain_e), 15); + s = s_max(s_min(s, 15), -15); + + FOR (i = 0; i < nt; i++) + { + offs32 = Mpy_32_16_lc3plus(L_abs(x[i]), gain); /* multiply */ + offs32 = L_shl(offs32, s); /* convert to 15Q16 */ + tmp16 = extract_h(L_add(offs32, 0x00006000)); /* add offset and truncate */ + Word16 x_sign = (Word16) L_shr(x[i], 31); + xq[i] = sub(s_xor(tmp16, x_sign), x_sign); + move16(); + /* + Normal quantization: xq[i] = x[i] / gg + sign(x[i]) * 0.375 + -> 0.375 = 0x00006000 in 15Q16 + */ + } + + /* Rate flag */ + rateFlag = 0; + move16(); + if (sub(totalBits, add(160, i_mult(fs_idx, 160))) > 0) + { + rateFlag = 2 << NBITS_CONTEXT; + move16(); + } + + /* Init */ + nt_half = shr_pos(nt, 1); + c = 0; + move16(); + t = 0; + move16(); + a1_i = 0; + move16(); + b1_i = 1; + move16(); + target32 = L_shl_pos(L_deposit_l(target), SYM_BITS_Q); + nbits32 = L_negate(target32); + nbits232 = 0; + move32(); + nbits_lsb = 0; + move16(); + IF (mode == 0 && sub(totalBits, add(480, i_mult(fs_idx, 160))) >= 0) + { + mode = 1; + move16(); + } + + /* Find last non-zero tuple */ + lastnz = find_last_nz_pair(xq, nt); + IF (mode >= 0) + { + lastnz2 = 2; + } + ELSE + { + lastnz2 = lastnz; + } + + IF (mode < 0) + { + /* Main Loop through the 2-tuples */ + FOR (k = 0; k < lastnz; k += 2) + { + + /* Get context */ + t = add(c, rateFlag); + if (sub(k, nt_half) > 0) + { + t = add(t, 1 << NBITS_CONTEXT); + } + codingdata[0] = t; + move16(); + + /* Init current 2-tuple encoding */ + a1 = abs_s(xq[a1_i]); + b1 = abs_s(xq[b1_i]); + ab_max = s_max(a1, b1); + + IF (ab_max == 0) + { + codingdata[1] = -1; + move16(); + codingdata[2] = 0; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][0]); + c = add(shl_pos(s_and(c, 0xf), 4), 1); + } + ELSE IF (sub(ab_max, A_THRES) < 0) + { + codingdata[1] = 0; + move16(); + msb = add(a1, shl_pos(b1, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + c = add(shl_pos(s_and(c, 0xf), 4), add(add(a1, b1), 1)); + } + ELSE IF (sub(ab_max, 2 * A_THRES) < 0) + { + codingdata[1] = 1; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][VAL_ESC]); + nbits32 = L_add(nbits32, 2 << SYM_BITS_Q); + a1_msb = shr_pos_pos(a1, 1); + b1_msb = shr_pos_pos(b1, 1); + msb = add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[1]]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + c = add(shl_pos(s_and(c, 0xf), 4), add(shl_pos(add(a1_msb, b1_msb), 1), 1)); + } + ELSE + { + levmax = sub(13, norm_s(ab_max)); + codingdata[1] = levmax; + move16(); + FOR (lev = 0; lev < levmax; lev++) + { + lev1 = s_min(lev, 3); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][VAL_ESC]); + } + nbits32 = L_add(nbits32, L_shl_pos(L_deposit_l(levmax), SYM_BITS_Q + 1)); + a1_msb = shr(a1, levmax); + b1_msb = shr(b1, levmax); + msb = add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + lev1 = s_min(levmax, 3); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + c = add(shl_pos(s_and(c, 0xf), 4), add(12, s_min(levmax, 3))); + } + + a1_i += 2; + b1_i += 2; + codingdata += 3; + + } /* end of the 2-tuples loop */ + } + ELSE IF (mode == 0) + { + /* Main Loop through the 2-tuples */ + FOR (k = 0; k < lastnz; k += 2) + { + + /* Get context */ + t = add(c, rateFlag); + if (sub(k, nt_half) > 0) + { + t = add(t, 1 << NBITS_CONTEXT); + } + codingdata[0] = t; + move16(); + + /* Init current 2-tuple encoding */ + a1 = abs_s(xq[a1_i]); + b1 = abs_s(xq[b1_i]); + ab_max = s_max(a1, b1); + + IF (ab_max == 0) + { + codingdata[1] = -1; + move16(); + codingdata[2] = 0; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][0]); + c = add(shl_pos(s_and(c, 0xf), 4), 1); + } + ELSE IF (sub(ab_max, A_THRES) < 0) + { + codingdata[1] = 0; + move16(); + msb = add(a1, shl_pos(b1, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (nbits32 <= 0) + { + lastnz2 = add(k, 2); + } + if (nbits32 <= 0) + { + nbits232 = nbits32; + move32(); + } + c = add(shl_pos(s_and(c, 0xf), 4), add(add(a1, b1), 1)); + } + ELSE IF (sub(ab_max, 2 * A_THRES) < 0) + { + codingdata[1] = 1; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][VAL_ESC]); + nbits32 = L_add(nbits32, 2 << SYM_BITS_Q); + a1_msb = shr_pos_pos(a1, 1); + b1_msb = shr_pos_pos(b1, 1); + msb = add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[1]]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (nbits32 <= 0) + { + lastnz2 = add(k, 2); + } + if (nbits32 <= 0) + { + nbits232 = nbits32; + move32(); + } + c = add(shl_pos(s_and(c, 0xf), 4), add(shl_pos(add(a1_msb, b1_msb), 1), 1)); + } + ELSE + { + levmax = sub(13, norm_s(ab_max)); + codingdata[1] = levmax; + move16(); + FOR (lev = 0; lev < levmax; lev++) + { + lev1 = s_min(lev, 3); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][VAL_ESC]); + } + nbits32 = L_add(nbits32, L_shl_pos(L_deposit_l(levmax), SYM_BITS_Q + 1)); + a1_msb = shr(a1, levmax); + b1_msb = shr(b1, levmax); + msb = add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + lev1 = s_min(levmax, 3); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (nbits32 <= 0) + { + lastnz2 = add(k, 2); + } + if (nbits32 <= 0) + { + nbits232 = nbits32; + move32(); + } + c = add(shl_pos(s_and(c, 0xf), 4), add(12, s_min(levmax, 3))); + } + + a1_i += 2; + b1_i += 2; + codingdata += 3; + + } /* end of the 2-tuples loop */ + } + ELSE + { + /* Main Loop through the 2-tuples */ + FOR (k = 0; k < lastnz; k += 2) + { + + /* Get context */ + t = add(c, rateFlag); + if (sub(k, nt_half) > 0) + { + t = add(t, 1 << NBITS_CONTEXT); + } + codingdata[0] = t; + move16(); + + /* Init current 2-tuple encoding */ + a1 = abs_s(xq[a1_i]); + b1 = abs_s(xq[b1_i]); + ab_max = s_max(a1, b1); + + IF (ab_max == 0) + { + codingdata[1] = -1; + move16(); + codingdata[2] = 0; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][0]); + c = add(shl_pos(s_and(c, 0xf), 4), 1); + } + ELSE IF (sub(ab_max, A_THRES) < 0) + { + codingdata[1] = 0; + move16(); + msb = add(a1, shl_pos(b1, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][msb]); + if (a1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1 != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (nbits32 <= 0) + { + lastnz2 = add(k, 2); + } + if (nbits32 <= 0) + { + nbits232 = nbits32; + move32(); + } + c = add(shl_pos(s_and(c, 0xf), 4), add(add(a1, b1), 1)); + } + ELSE IF (sub(ab_max, 2 * A_THRES) < 0) + { + codingdata[1] = 1; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][VAL_ESC]); + a1_msb = shr_pos_pos(a1, 1); + b1_msb = shr_pos_pos(b1, 1); + msb = add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[1]]][msb]); + if (a1_msb != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1_msb != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + nbits_lsb = add(nbits_lsb, 2); + if (sub(a1, 1) == 0) + { + nbits_lsb = add(nbits_lsb, 1); + } + if (sub(b1, 1) == 0) + { + nbits_lsb = add(nbits_lsb, 1); + } + if (nbits32 <= 0) + { + lastnz2 = add(k, 2); + } + if (nbits32 <= 0) + { + nbits232 = nbits32; + move32(); + } + c = add(shl_pos(s_and(c, 0xf), 4), add(shl_pos(add(a1_msb, b1_msb), 1), 1)); + } + ELSE + { + levmax = sub(13, norm_s(ab_max)); + codingdata[1] = levmax; + move16(); + FOR (lev = 0; lev < levmax; lev++) + { + lev1 = s_min(lev, 3); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][VAL_ESC]); + } + nbits32 = L_add(nbits32, L_shl_pos(L_deposit_l(sub(levmax, 1)), SYM_BITS_Q + 1)); + a1_msb = shr(a1, levmax); + b1_msb = shr(b1, levmax); + msb = add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT)); + codingdata[2] = msb; + move16(); + lev1 = s_min(levmax, 3); + nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][msb]); + a1_msb = shr_pos(a1, 1); + b1_msb = shr_pos(b1, 1); + if (a1_msb != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + if (b1_msb != 0) + { + nbits32 = L_add(nbits32, 1 << SYM_BITS_Q); + } + nbits_lsb = add(nbits_lsb, 2); + if (sub(a1, 1) == 0) + { + nbits_lsb = add(nbits_lsb, 1); + } + if (sub(b1, 1) == 0) + { + nbits_lsb = add(nbits_lsb, 1); + } + if (nbits32 <= 0) + { + lastnz2 = add(k, 2); + } + if (nbits32 <= 0) + { + nbits232 = nbits32; + move32(); + } + c = add(shl_pos(s_and(c, 0xf), 4), add(12, s_min(levmax, 3))); + } + + a1_i += 2; + b1_i += 2; + codingdata += 3; + + } /* end of the 2-tuples loop */ + } + + /* Number of consumed bits */ + nbits32 = L_add(nbits32, target32); + totBits = add(extract_l(L_shr_pos_pos(L_sub(nbits32, 1), SYM_BITS_Q)), 1); + IF (mode > 0) + { + totBits = add(totBits, nbits_lsb); + } + IF (nBits != NULL) + { + *nBits = totBits; + } + IF (mode >= 0) + { + nbits232 = L_add(nbits232, target32); + *nBits2 = add(extract_l(L_shr_pos(L_sub(nbits232, 1), SYM_BITS_Q)), 1); + } + ELSE + { + *nBits2 = *nBits; + move16(); + } + IF (mode > 0) + { + *nBits2 = add(*nBits2, nbits_lsb); + } + *lastnzout = lastnz2; + + /* Truncation of high frequency coefficients */ + IF (lastnz > lastnz2) + { + basop_memset(&xq[lastnz2], 0, (lastnz - lastnz2) * sizeof(*xq)); + } + + /* Truncation of LSBs */ + test(); + IF (mode > 0 && sub(totBits, target) > 0) + { + *lsbMode = 1; + move16(); + } + ELSE + { + *lsbMode = 0; + move16(); + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +#endif /* ENABLE_HR_MODE */ diff --git a/lib_lc3plus/reorder_bitstream_fx.c b/lib_lc3plus/reorder_bitstream_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..657abffc14f8db491c5fc869507bec1609fcaf1d --- /dev/null +++ b/lib_lc3plus/reorder_bitstream_fx.c @@ -0,0 +1,58 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" + +#include "constants.h" +#include "functions.h" + + +void processReorderBitstream_fx(UWord8 *bytes, Word16 n_pccw, Word16 n_pc, Word16 b_left, Word8 *scratchBuffer) +{ + Word16 block_bytes; + UWord8 * bytes_tmp; + +#ifdef DYNMEM_COUNT + struct _dynmem + { + Word16 block_bits, block_bytes; + UWord8 * bytes_tmp; + }; + Dyn_Mem_In("processReorderBitstream_fx", sizeof(struct _dynmem)); +#endif + + bytes_tmp = (UWord8 *)scratchAlign(scratchBuffer, 0); /* Size = LC3PLUS_MAX_BYTES */ + + if (n_pccw == 0) + { +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif + return; + } + + assert(b_left >= 0); + + /* set block size in bits and full bytes */ + block_bytes = shr_sat(add(n_pc, 1), 1); + + /* rearrange bitstream */ + basop_memmove(&bytes_tmp[0], &bytes[b_left], block_bytes * sizeof(UWord8)); + basop_memmove(&bytes_tmp[block_bytes], &bytes[0], b_left * sizeof(UWord8)); + + basop_memmove(&bytes[0], &bytes_tmp[0], add(block_bytes, b_left) * sizeof(UWord8)); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + + diff --git a/lib_lc3plus/resamp12k8_fx.c b/lib_lc3plus/resamp12k8_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..ebfa42502e1575a4b94e415bcc1b7f14cb6cfb7d --- /dev/null +++ b/lib_lc3plus/resamp12k8_fx.c @@ -0,0 +1,135 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +void process_resamp12k8_fx(Word16 x[], Word16 x_len, Word16 mem_in[], Word16 mem_in_len, Word32 mem_50[], + Word16 mem_out[], Word16 mem_out_len, Word16 y[], Word16 *y_len, Word16 fs_idx, + LC3PLUS_FrameDuration frame_dms, Word8 *scratchBuffer + , Word16 bps + ) +{ + Dyn_Mem_Deluxe_In( + Word16 * buf; + Word16 index_int, index_frac, len_12k8; + Word16 resamp_upfac, resamp_off_int, resamp_off_frac, resamp_delay; + const Word16 *resamp_filt; + const Word16 *filt_coeff; + Word16 * filt_input; + Word32 filt_output, mem_50_0, mem_50_1; + Counter n, m; + Word32 L_tmp; + ); + + buf = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * (MAX_LEN + MAX_LEN / 8) bytes */ + len_12k8 = 0; + + /* resamp parameters : {upsample-factor, 120 / upsample-factor, down_sample_int_part, down_sample_frac_part } + upsample is to 384 kHz. upsample-facor = 192000 / samp-freq + Fractional downsample parameters are calculated from : downsample samp-freq to 128000 + At 48000 sampling frequency: + upsample-factor = 192000 / 48000 = 4 + 120 / upsample-factor = 120 / 4 = 30 + downsample-ratio = 48000 / 12800 = 3.75 + down_sample_int_part = 3 + down_sample_frac_part = int(0.75 * upsample-factor ) = 0.75 * 4 = 3 + */ + resamp_upfac = resamp_params[fs_idx][0]; move16(); + resamp_delay = resamp_params[fs_idx][1]; move16(); + resamp_off_int = resamp_params[fs_idx][2]; move16(); + resamp_off_frac = resamp_params[fs_idx][3]; move16(); + resamp_filt = resamp_filts[fs_idx]; move16(); + + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: len_12k8 = 16; BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: len_12k8 = 32; BREAK; + case LC3PLUS_FRAME_DURATION_5MS: len_12k8 = 64; BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: len_12k8 = 96; BREAK; + case LC3PLUS_FRAME_DURATION_10MS: len_12k8 = 128; BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + *y_len = len_12k8; move16(); + + /* Init Input Buffer */ + basop_memmove(buf, mem_in, mem_in_len * sizeof(Word16)); + basop_memmove(&buf[mem_in_len], x, x_len * sizeof(Word16)); + basop_memmove(mem_in, &buf[x_len], mem_in_len * sizeof(Word16)); + + /* Init Input Indices */ + index_int = 1; move16(); + index_frac = 0; move16(); + + /* Resampling */ + FOR (n = 0; n < len_12k8; n++) + { + /* Init Filtering */ + filt_input = &buf[index_int]; + filt_coeff = &resamp_filt[index_frac * resamp_delay * 2]; + +/* Perform Filtering */ + filt_output = L_mult0(*filt_input, *filt_coeff); + FOR (m = 1; m < resamp_delay * 2; m++) + { + filt_coeff++; + filt_input++; + if (*filt_coeff) + { + filt_output = L_mac0(filt_output, *filt_input, *filt_coeff); + } + } + y[n] = round_fx(filt_output); move16(); + + /* Update Input Indices */ + index_int = add(index_int, resamp_off_int); + index_frac = add(index_frac, resamp_off_frac); + IF (sub(resamp_upfac, index_frac) <= 0) + { + index_int = add(index_int, 1); + index_frac = sub(index_frac, resamp_upfac); + } + } + + /* High Pass Filtering (-3dB at 50Hz) */ + mem_50_0 = mem_50[0]; move32(); + mem_50_1 = mem_50[1]; move32(); + + FOR (n = 0; n < len_12k8; n++) + { + filt_output = L_mac0_sat(mem_50_0, highpass50_filt_num[0], y[n]); + L_tmp = L_mac0(Mpy_32_16_lc3plus(filt_output, highpass50_filt_den[0]), highpass50_filt_num[1], y[n]); + + IF (sub(bps, 24) == 0) + { + mem_50_0 = L_shl_sat(L_add_sat(L_shr_pos(mem_50_1,1), L_tmp), 1); + } ELSE + { + mem_50_0 = L_add_sat(mem_50_1, L_shl_sat(L_tmp, 1)); + } + + mem_50_1 = L_mac0(Mpy_32_16_lc3plus(filt_output, highpass50_filt_den[1]), highpass50_filt_num[2], y[n]); + y[n] = round_fx_sat(filt_output); move16(); + } + mem_50[0] = mem_50_0; move32(); + mem_50[1] = mem_50_1; move32(); + +/* Output Buffer */ + basop_memmove(buf, mem_out, mem_out_len * sizeof(Word16)); + basop_memmove(&buf[mem_out_len], y, len_12k8 * sizeof(Word16)); + basop_memmove(y, buf, (*y_len + 1) * sizeof(Word16)); + basop_memmove(mem_out, &buf[len_12k8], mem_out_len * sizeof(Word16)); + + Dyn_Mem_Deluxe_Out(); +} + diff --git a/lib_lc3plus/residual_coding_fx.c b/lib_lc3plus/residual_coding_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..bec0636b73f4afe6d7dbbaa8a90d45480eb596b4 --- /dev/null +++ b/lib_lc3plus/residual_coding_fx.c @@ -0,0 +1,292 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +#ifdef ENABLE_HR_MODE + +void processResidualCoding_fx(Word16 x_e, Word32 x[], + Word32 xq[], Word32 gain, + Word16 gain_e, Word16 L_spec, + Word16 targetBits, Word16 nBits, UWord8 *resBits, Word16 *numResBits + , Word16 hrmode +#if defined (CR9_C_ADD_1p25MS) + , LC3PLUS_FrameDuration frame_dms +#endif +) +{ + + Counter i; + Word16 s, n, m; + Word32 L_tmp; +#if defined (CR9_C_ADD_1p25MS) || defined (ENABLE_HR_MODE) + Word16 iter = 0; +#endif + Counter idx; + Word16 N_nz = 0; + Word16 n1, n2; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processResidualCoding_fx", sizeof(struct { + Counter i; + Word16 s, n, m; + Word32 L_tmp; + Word16 iter; + Counter idx; + Word16 N_nz; + Word16 *nz_idx; + Word16 n1, n2; + })); +#endif + + n = 0; + move16(); + + IF (hrmode) + { + m = add(sub(targetBits, nBits), 14); + assert(m <= (MAX_RESBITS_LEN << RESBITS_PACK_SHIFT)); + } + ELSE + { + m = add(sub(targetBits, nBits), 4); + if (m > L_spec) + { + m = L_spec; + } + } + + basop_memset(resBits, 0, sizeof(*resBits)*((m + RESBITS_PACK_MASK) >> RESBITS_PACK_SHIFT)); + + s = sub(add(15, gain_e), x_e); + + IF(hrmode) + { + /* + x = xval * 2^(31 - x_e) + gain = gainval * 2^(15 - gain_e) + + To bring gain to the same q of x : + + gain (in_Qx_e) = gain * 2^(16 + gain_e - x_e) + + gain*offset (in Qx_e) = gain (in_Qx_e) * 0.25 = gain (in_Qx_e) / 4 = gain * 2^(16 - 2 + gain_e - x_e) + */ + Word16 shift_val; + shift_val = sub(sub(gain_e, x_e), 2); + + Word32 gain_offset; + + IF (shift_val <= -32) + gain_offset = 0; + ELSE + { + gain_offset = L_shl_sat(gain, shift_val); + } + + Word16 exit_iter = 0; + + Word16 nz_idx[MAX_LEN]; + + /* enumerate non-zero coefficients */ + FOR (i = 0; i < L_spec; i++) + { + IF (xq[i]) + { + nz_idx[N_nz] = i; move16(); + N_nz = add(N_nz, 1); + } + } + + s = sub(31, sub(x_e, gain_e)); + FOR (iter = 0; iter < EXT_RES_ITER_MAX; iter++) + { + FOR (i = 0; i < N_nz; i++) + { + idx = nz_idx[i]; + + L_tmp = L_sub(x[idx], Mpy_32_32_lc3plus(L_shl(xq[idx], s), gain)); + + IF (L_tmp >= 0) + { + n1 = shr(n, RESBITS_PACK_SHIFT); + n2 = s_and(n, RESBITS_PACK_MASK); + resBits[n1] = (UWord8)s_or(resBits[n1], shl(1, n2)); + move16(); + x[idx] = L_sub(x[idx], gain_offset); + move16(); + } + ELSE + { + move16(); + x[idx] = L_add(x[idx], gain_offset); + move16(); + } + n = add(n, 1); + IF (sub(n, m) == 0) + { + exit_iter = 1; + BREAK; + } + } + gain_offset = L_shr(gain_offset, 1); /* offset *= 0.5 */ + + IF (exit_iter) + { + BREAK; + } + } + } + ELSE + { + s = add(s, 16); + gain = round_fx(gain); + +#if defined (CR9_C_ADD_1p25MS) + Word16 iter_exit, exit_iter = 0; + IF (sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0) + { + iter_exit = 3; move16(); + } ELSE { + iter_exit = 1; move16(); + } + + FOR (iter = 0; iter < iter_exit; iter++) + { +#endif + FOR (i = 0; i < L_spec; i++) + { + IF (xq[i] != 0) + { + L_tmp = L_sub(x[i], Mpy_32_16_lc3plus(L_shl(xq[i], s), gain)); + if (L_tmp >= 0) + { + n1 = shr(n, RESBITS_PACK_SHIFT); + n2 = s_and(n, RESBITS_PACK_MASK); + resBits[n1] = (UWord8) s_or(resBits[n1], shl(1, n2)); + move16(); + } + n = add(n, 1); + IF (sub(n, m) == 0) + { +#if defined (CR9_C_ADD_1p25MS) + exit_iter = 1; +#endif + BREAK; + } + } + } +#if defined (CR9_C_ADD_1p25MS) + IF (exit_iter) + { + BREAK; + } + } +#endif + } + *numResBits = n; + move16(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +#else + +void processResidualCoding_fx(Word16 x_e, Word32 x[], + Word16 xq[], + Word16 gain, Word16 gain_e, Word16 L_spec, + Word16 targetBits, Word16 nBits, UWord8 *resBits, Word16 *numResBits +#if defined (CR9_C_ADD_1p25MS) + , LC3PLUS_FrameDuration frame_dms +#endif +) +{ + + Counter i; + Word16 s, n, m; + Word32 L_tmp; +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processResidualCoding_fx", sizeof(struct { + Counter i; + Word16 s, n, m; + Word32 L_tmp; + })); +#endif + + n = 0; + move16(); + { + m = add(sub(targetBits, nBits), 4); + if (m > L_spec) + { + m = L_spec; + } + } + + + s = sub(add(15, gain_e), x_e); + { +#if defined (CR9_C_ADD_1p25MS) + Word16 iter_exit, exit_iter = 0, iter = 0; + IF (sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0) + { + iter_exit = 3; move16(); + } ELSE { + iter_exit = 1; move16(); + } + + FOR (iter = 0; iter < iter_exit; iter++) + { +#endif + FOR (i = 0; i < L_spec; i++) + { + IF (xq[i] != 0) + { + L_tmp = L_sub(x[i], L_shl(L_mult(xq[i], gain), s)); + if (L_tmp < 0) + { + resBits[n] = 0; + move16(); + } + if (L_tmp >= 0) + { + resBits[n] = 1; + move16(); + } + n = add(n, 1); + IF (sub(n, m) == 0) + { +#if defined (CR9_C_ADD_1p25MS) + exit_iter = 1; +#endif + BREAK; + } + } + } +#if defined (CR9_C_ADD_1p25MS) + IF (exit_iter) + { + BREAK; + } + } +#endif + } + *numResBits = n; + move16(); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +#endif diff --git a/lib_lc3plus/residual_decoding_fx.c b/lib_lc3plus/residual_decoding_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..158c5f4542ba793f2d39840c6557bd3baca61cf9 --- /dev/null +++ b/lib_lc3plus/residual_decoding_fx.c @@ -0,0 +1,257 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +#ifdef ENABLE_HR_MODE /* HRMODE enables packing of residual bits */ + +void processResidualDecoding_fx(Word32 x[], Word16 x_e, Word16 L_spec, UWord8 prm[], Word16 resQBits +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +#ifdef CR9_C_ADD_1p25MS + , LC3PLUS_FrameDuration frame_dms +#endif +) +{ + + Counter i; + Word32 fac_m, fac_p; + Word16 s, bits; + Word32 tmp; + Counter idx; + Word16 N_nz = 0; +#if defined (CR9_C_ADD_1p25MS) || defined (ENABLE_HR_MODE) + Word16 iter = 0; move16(); + Word16 maxIter = 1; move16(); + UNUSED(maxIter); +#endif + Word32 fac_hr; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processResidualDecoding_fx", sizeof(struct { + Counter i; + Word32 fac_m, fac_p; + Word16 s, bits; + Word32 tmp; + Counter idx; + Word16 N_nz; + Word16 *nz_idx; + Word16 iter; + })); +#endif + + tmp = 0; + s = sub(x_e, 1); + s = s_min(s, 31); + + IF (hrmode) + { + fac_hr = L_shr(0x10000000, s); /* 0.25 in 1Q30 */ + } + ELSE + { + fac_m = L_shr(0xC000000, s); /* 0.1875 in 1Q30 */ + fac_p = L_shr(0x14000000, s); /* 0.3125 in 1Q30 */ + +#if defined (CR9_C_ADD_1p25MS) + IF (sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0) + { + maxIter = 3; + } +#endif + } + + bits = 0; + move16(); + + Word16 nz_idx[MAX_LEN]; + + IF (hrmode) + { + FOR (i = 0; i < L_spec; i++) + { + IF (x[i]) + { + nz_idx[N_nz] = i; move16(); + N_nz = add(N_nz, 1); + } + } + FOR (iter = 0; iter < EXT_RES_ITER_MAX; iter++) + { + IF (sub(bits, resQBits) >= 0) + { + BREAK; + } + FOR (i = 0; i < N_nz; i++) + { + idx = nz_idx[i]; move16(); + + IF (sub(bits, resQBits) >= 0) + { + BREAK; + } + + IF (! (s_and(prm[shr(bits, RESBITS_PACK_SHIFT)], shl(1, s_and(bits, RESBITS_PACK_MASK))))) + { + tmp = L_sub_sat(x[idx], fac_hr); + } + ELSE + { + tmp = L_add_sat(x[idx], fac_hr); + } + x[idx] = tmp; + move32(); + bits = add(bits, 1); + } + fac_hr = L_shr(fac_hr, 1); + } + } + ELSE + { + #if defined (CR9_C_ADD_1p25MS) + WHILE (iter < maxIter) + #endif + { + FOR (i = 0; i < L_spec; i++) + { + IF (sub(bits, resQBits) >= 0) + { + BREAK; + } + + IF (x[i] != 0) + { + IF (! (s_and(prm[shr(bits, RESBITS_PACK_SHIFT)], shl(1, s_and(bits, RESBITS_PACK_MASK))))) + { + if (x[i] > 0) + tmp = L_sub(x[i], fac_m); + if (x[i] < 0) + tmp = L_sub(x[i], fac_p); + } + ELSE + { + if (x[i] > 0) + tmp = L_add(x[i], fac_p); + if (x[i] < 0) + tmp = L_add(x[i], fac_m); + } + x[i] = tmp; + move32(); + bits = add(bits, 1); + } + } + #if defined (CR9_C_ADD_1p25MS) + iter++; + fac_p = L_shr(fac_p, 1); + fac_m = L_shr(fac_m, 1); + #endif + } + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +#else + +void processResidualDecoding_fx(Word32 x[], Word16 x_e, Word16 L_spec, UWord8 prm[], Word16 resQBits +#ifdef CR9_C_ADD_1p25MS + , LC3PLUS_FrameDuration frame_dms +#endif +) +{ + + Counter i; + Word32 fac_m, fac_p; + Word16 s, bits; + Word32 tmp; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processResidualDecoding_fx", sizeof(struct { + Counter i; + Word32 fac_m, fac_p; + Word16 s, bits; + Word32 tmp; + })); +#endif + +#if defined (CR9_C_ADD_1p25MS) + Word16 iter = 0; move16(); + Word16 maxIter = 1; move16(); + UNUSED(maxIter); +#endif + + tmp = 0; + s = sub(x_e, 1); + s = s_min(s, 31); + + { + fac_m = L_shr(0xC000000, s); /* 0.1875 in 1Q30 */ + fac_p = L_shr(0x14000000, s); /* 0.3125 in 1Q30 */ + } + +#if defined (CR9_C_ADD_1p25MS) + IF (sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0) + { + maxIter = 3; + } +#endif + + bits = 0; + move16(); + + #if defined (CR9_C_ADD_1p25MS) + WHILE (iter < maxIter) + #endif + { + FOR (i = 0; i < L_spec; i++) + { + IF (sub(bits, resQBits) >= 0) + { + BREAK; + } + + IF (x[i] != 0) + { + IF (prm[bits] == 0) + { + if (x[i] > 0) + tmp = L_sub(x[i], fac_m); + if (x[i] < 0) + tmp = L_sub(x[i], fac_p); + } + ELSE + { + if (x[i] > 0) + tmp = L_add(x[i], fac_p); + if (x[i] < 0) + tmp = L_add(x[i], fac_m); + } + x[i] = tmp; + move32(); + bits = add(bits, 1); + } + } + #if defined (CR9_C_ADD_1p25MS) + iter++; + fac_p = L_shr(fac_p, 1); + fac_m = L_shr(fac_m, 1); + #endif + } + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +#endif diff --git a/lib_lc3plus/rom_basop_util_lc3plus.c b/lib_lc3plus/rom_basop_util_lc3plus.c new file mode 100644 index 0000000000000000000000000000000000000000..f47c818f696db6f438b056ba8e8182ccefd88f9e --- /dev/null +++ b/lib_lc3plus/rom_basop_util_lc3plus.c @@ -0,0 +1,2927 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "rom_basop_util_lc3plus.h" +#include "basop_util_lc3plus.h" +#include "functions.h" + + +/* clang-format off */ +#ifdef ENABLE_HR_MODE +#define STC(x) (x) +#define WTC(x) (x) +#define STCP(a, b) {{STC(a), STC(b)}} +#define WTCP(a, b) {{WTC(a), WTC(b)}} +#else +#define STC(x) WORD322WORD16(x) +#define WTC(x) WORD322WORD16(x) +#define STCP(a, b) {{STC(a), STC(b)}} +#define WTCP(a, b) {{WTC(a), WTC(b)}} +#endif +/* clang-format on */ + +/** + * \brief Lookup-Table for binary logarithm + */ +RAM_ALIGN const Word16 ldCoeff[7] = {-32768, -16384, -10923, -8192, -6554, -5461, -4681}; + +/** + \brief Lookup-Table for binary power algorithm + + This table is used for lookup 2^x with + x in range [0...1.0[ in steps of 1/32 +*/ +const UWord32 exp2_tab_long[32] = { + 0x40000000, 0x4166C34C, 0x42D561B4, 0x444C0740, 0x45CAE0F2, 0x47521CC6, 0x48E1E9BA, 0x4A7A77D4, + 0x4C1BF829, 0x4DC69CDD, 0x4F7A9930, 0x51382182, 0x52FF6B55, 0x54D0AD5A, 0x56AC1F75, 0x5891FAC1, + 0x5A82799A, 0x5C7DD7A4, 0x5E8451D0, 0x60962665, 0x62B39509, 0x64DCDEC3, 0x6712460B, 0x69540EC9, + 0x6BA27E65, 0x6DFDDBCC, 0x70666F76, 0x72DC8374, 0x75606374, 0x77F25CCE, 0x7A92BE8B, 0x7D41D96E, +}; + +/** + \brief Lookup-Table for binary power algorithm + + This table is used for lookup 2^x with + x in range [0...1/32[ in steps of 1/1024 +*/ +const UWord32 exp2w_tab_long[32] = { + 0x40000000, 0x400B1818, 0x4016321B, 0x40214E0C, 0x402C6BE9, 0x40378BB4, 0x4042AD6D, 0x404DD113, + 0x4058F6A8, 0x40641E2B, 0x406F479E, 0x407A7300, 0x4085A051, 0x4090CF92, 0x409C00C4, 0x40A733E6, + 0x40B268FA, 0x40BD9FFF, 0x40C8D8F5, 0x40D413DD, 0x40DF50B8, 0x40EA8F86, 0x40F5D046, 0x410112FA, + 0x410C57A2, 0x41179E3D, 0x4122E6CD, 0x412E3152, 0x41397DCC, 0x4144CC3B, 0x41501CA0, 0x415B6EFB, +}; + +/** + \brief Lookup-Table for binary power algorithm + + This table is used for lookup 2^x with + x in range [0...1/1024[ in steps of 1/32768 +*/ +const UWord32 exp2x_tab_long[32] = { + 0x40000000, 0x400058B9, 0x4000B173, 0x40010A2D, 0x400162E8, 0x4001BBA3, 0x4002145F, 0x40026D1B, + 0x4002C5D8, 0x40031E95, 0x40037752, 0x4003D011, 0x400428CF, 0x4004818E, 0x4004DA4E, 0x4005330E, + 0x40058BCE, 0x4005E48F, 0x40063D51, 0x40069613, 0x4006EED5, 0x40074798, 0x4007A05B, 0x4007F91F, + 0x400851E4, 0x4008AAA8, 0x4009036E, 0x40095C33, 0x4009B4FA, 0x400A0DC0, 0x400A6688, 0x400ABF4F, +}; + +/* square root tables */ +const Word32 SqrtTable[32] = { + /* Q31 */ + 0x5A82D429, 0x5BEA10FE, 0x5D4BE6E5, 0x5EA89270, 0x60004BE2, 0x615347A1, 0x62A1B68C, 0x63EBC651, + 0x6531A1B5, 0x667370D4, 0x67B1595F, 0x68EB7EC8, 0x6A220277, 0x6B5503F0, 0x6C84A0F9, 0x6DB0F5BD, + 0x6EDA1CE9, 0x70002FC7, 0x7123465A, 0x72437773, 0x7360D8C5, 0x747B7EFA, 0x75937DC4, 0x76A8E7EB, + 0x77BBCF60, 0x78CC4545, 0x79DA5A00, 0x7AE61D3E, 0x7BEF9E07, 0x7CF6EAC2, 0x7DFC113F, 0x7EFF1EC0, +}; + +const Word16 SqrtDiffTable[32] = { + /* Q21 */ + 0x59CF, 0x5875, 0x572B, 0x55EE, 0x54BF, 0x539C, 0x5284, 0x5177, 0x5074, 0x4F7A, 0x4E89, + 0x4DA1, 0x4CC0, 0x4BE7, 0x4B15, 0x4A4A, 0x4985, 0x48C6, 0x480C, 0x4758, 0x46AA, 0x4600, + 0x455B, 0x44BA, 0x441D, 0x4385, 0x42F1, 0x4260, 0x41D3, 0x414A, 0x40C3, 0x4040, +}; + +const Word32 ISqrtTable[32] = { + /* Q31 */ + 0x7FFE7F85, 0x7E0A4E25, 0x7C2C56C7, 0x7A63002C, 0x78ACD922, 0x7708939D, 0x75750088, 0x73F10C2D, + 0x727BBB1A, 0x71142774, 0x6FB97EA5, 0x6E6AFF54, 0x6D27F79D, 0x6BEFC388, 0x6AC1CBA4, 0x699D83DA, + 0x68826A53, 0x6770068E, 0x6665E882, 0x6563A7DF, 0x6468E364, 0x63754043, 0x62886999, 0x61A20FEE, + 0x60C1E8C8, 0x5FE7AE45, 0x5F131EBE, 0x5E43FC76, 0x5D7A0D4F, 0x5CB51A81, 0x5BF4F061, 0x5B395E26, +}; + +const Word16 ISqrtDiffTable[32] = { + /* Q21 */ + 0x7D0C, 0x777E, 0x7256, 0x6D8A, 0x6911, 0x64E5, 0x60FD, 0x5D54, 0x59E5, 0x56AA, 0x53A0, + 0x50C2, 0x4E0D, 0x4B7E, 0x4912, 0x46C6, 0x4499, 0x4288, 0x4090, 0x3EB1, 0x3CE9, 0x3B36, + 0x3996, 0x380A, 0x368F, 0x3524, 0x33C9, 0x327C, 0x313D, 0x300B, 0x2EE5, 0x2DCA, +}; + +/* 1/x tables */ +const Word32 InvTable[32] = { + /* Q31 */ + 0x7FFBFE40, 0x7C1B608E, 0x78752176, 0x750440BA, 0x71C44C49, 0x6EB14D0A, 0x6BC7B6B4, 0x69045A19, + 0x6664598A, 0x63E51EE2, 0x61845308, 0x5F3FD698, 0x5D15BB8E, 0x5B043FD0, 0x5909C861, 0x5724DD3C, + 0x555425B2, 0x53966532, 0x51EA787F, 0x504F5331, 0x4EC3FD84, 0x4D479267, 0x4BD93DBE, 0x4A783ADC, + 0x4923D31D, 0x47DB5CAE, 0x469E3974, 0x456BD608, 0x4443A8D9, 0x43253159, 0x420FF746, 0x41038A01, +}; + +#ifdef ENABLE_HR_MODE +const Word16 InvIntTable[74] = { + 32767, 32767, 16384, 10923, 8192, 6554, 5461, 4681, 4096, 3641, 3277, 2979, 2731, 2521, 2341, + 2185, 2048, 1928, 1820, 1725, 1638, 1560, 1489, 1425, 1365, 1311, 1260, 1214, 1170, 1130, + 1092, 1057, 1024, 993, 964, 936, 910, 886, 862, 840, 819, 799, 780, 762, 745, + 728, 712, 697, 683, 669, 655, 643, 630, 618, 607, 596, 585, 575, 565, 555, + 546, 537, 529, 520, 512, 504, 496, 489, 482, 475, 468, 462, 455, 449 +}; +#else +const Word16 InvIntTable[32] = { + 0x7FFF, 0x7FFF, 0x4000, 0x2AAB, 0x2000, 0x199A, 0x1555, 0x1249, 0x1000, 0x0E39, 0x0CCD, + 0x0BA3, 0x0AAB, 0x09D9, 0x0925, 0x0889, 0x0800, 0x0788, 0x071C, 0x06BD, 0x0666, 0x0618, + 0x05D1, 0x0591, 0x0555, 0x051F, 0x04EC, 0x04BE, 0x0492, 0x046A, 0x0444, 0x0421, +}; +#endif + +const Word16 InvDiffTable[32] = { + /* Q20 */ + 0x7C14, 0x74C8, 0x6E1C, 0x67FF, 0x6260, 0x5D33, 0x586C, 0x5400, 0x4FE7, 0x4C19, 0x4890, + 0x4543, 0x422F, 0x3F4F, 0x3C9D, 0x3A17, 0x37B8, 0x357E, 0x3365, 0x316B, 0x2F8D, 0x2DCB, + 0x2C20, 0x2A8D, 0x290F, 0x27A4, 0x264C, 0x2506, 0x23CF, 0x22A7, 0x218E, 0x2081, +}; + +/* + Sine tables + */ +#ifdef ENABLE_HR_MODE +const PWord32 SineTable480[] = { +#else +const PWord16 SineTable480[] = { +#endif + STCP(0x7fffffff, 0x00000000), STCP(0x7fffd315, 0x006b3b9b), STCP(0x7fff4c54, 0x00d676eb), + STCP(0x7ffe6bbf, 0x0141b1a5), STCP(0x7ffd3154, 0x01aceb7c), STCP(0x7ffb9d15, 0x02182427), + STCP(0x7ff9af04, 0x02835b5a), STCP(0x7ff76721, 0x02ee90c8), STCP(0x7ff4c56f, 0x0359c428), + STCP(0x7ff1c9ef, 0x03c4f52f), STCP(0x7fee74a2, 0x0430238f), STCP(0x7feac58d, 0x049b4f00), + STCP(0x7fe6bcb0, 0x05067734), STCP(0x7fe25a0f, 0x05719be2), STCP(0x7fdd9dad, 0x05dcbcbe), + STCP(0x7fd8878e, 0x0647d97c), STCP(0x7fd317b4, 0x06b2f1d2), STCP(0x7fcd4e24, 0x071e0575), + STCP(0x7fc72ae2, 0x07891418), STCP(0x7fc0adf2, 0x07f41d72), STCP(0x7fb9d759, 0x085f2137), + STCP(0x7fb2a71b, 0x08ca1f1b), STCP(0x7fab1d3d, 0x093516d4), STCP(0x7fa339c5, 0x09a00817), + STCP(0x7f9afcb9, 0x0a0af299), STCP(0x7f92661d, 0x0a75d60e), STCP(0x7f8975f9, 0x0ae0b22c), + STCP(0x7f802c52, 0x0b4b86a8), STCP(0x7f76892f, 0x0bb65336), STCP(0x7f6c8c96, 0x0c21178c), + STCP(0x7f62368f, 0x0c8bd35e), STCP(0x7f578721, 0x0cf68662), STCP(0x7f4c7e54, 0x0d61304e), + STCP(0x7f411c2f, 0x0dcbd0d5), STCP(0x7f3560b9, 0x0e3667ad), STCP(0x7f294bfd, 0x0ea0f48c), + STCP(0x7f1cde01, 0x0f0b7727), STCP(0x7f1016ce, 0x0f75ef33), STCP(0x7f02f66f, 0x0fe05c64), + STCP(0x7ef57cea, 0x104abe71), STCP(0x7ee7aa4c, 0x10b5150f), STCP(0x7ed97e9c, 0x111f5ff4), + STCP(0x7ecaf9e5, 0x11899ed3), STCP(0x7ebc1c31, 0x11f3d164), STCP(0x7eace58a, 0x125df75b), + STCP(0x7e9d55fc, 0x12c8106f), STCP(0x7e8d6d91, 0x13321c53), STCP(0x7e7d2c54, 0x139c1abf), + STCP(0x7e6c9251, 0x14060b68), STCP(0x7e5b9f93, 0x146fee03), STCP(0x7e4a5426, 0x14d9c245), + STCP(0x7e38b017, 0x154387e6), STCP(0x7e26b371, 0x15ad3e9a), STCP(0x7e145e42, 0x1616e618), + STCP(0x7e01b096, 0x16807e15), STCP(0x7deeaa7a, 0x16ea0646), STCP(0x7ddb4bfc, 0x17537e63), + STCP(0x7dc79529, 0x17bce621), STCP(0x7db3860f, 0x18263d36), STCP(0x7d9f1ebd, 0x188f8357), + STCP(0x7d8a5f40, 0x18f8b83c), STCP(0x7d7547a7, 0x1961db9b), STCP(0x7d5fd801, 0x19caed29), + STCP(0x7d4a105d, 0x1a33ec9c), STCP(0x7d33f0ca, 0x1a9cd9ac), STCP(0x7d1d7958, 0x1b05b40f), + STCP(0x7d06aa16, 0x1b6e7b7a), STCP(0x7cef8315, 0x1bd72fa4), STCP(0x7cd80464, 0x1c3fd045), + STCP(0x7cc02e15, 0x1ca85d12), STCP(0x7ca80038, 0x1d10d5c2), STCP(0x7c8f7ade, 0x1d793a0b), + STCP(0x7c769e18, 0x1de189a6), STCP(0x7c5d69f7, 0x1e49c447), STCP(0x7c43de8e, 0x1eb1e9a7), + STCP(0x7c29fbee, 0x1f19f97b), STCP(0x7c0fc22a, 0x1f81f37c), STCP(0x7bf53153, 0x1fe9d75f), + STCP(0x7bda497d, 0x2051a4dd), STCP(0x7bbf0aba, 0x20b95bac), STCP(0x7ba3751d, 0x2120fb83), + STCP(0x7b8788ba, 0x2188841a), STCP(0x7b6b45a5, 0x21eff528), STCP(0x7b4eabf1, 0x22574e65), + STCP(0x7b31bbb2, 0x22be8f87), STCP(0x7b1474fd, 0x2325b847), STCP(0x7af6d7e6, 0x238cc85d), + STCP(0x7ad8e482, 0x23f3bf7e), STCP(0x7aba9ae6, 0x245a9d65), STCP(0x7a9bfb27, 0x24c161c7), + STCP(0x7a7d055b, 0x25280c5e), STCP(0x7a5db997, 0x258e9ce0), STCP(0x7a3e17f2, 0x25f51307), + STCP(0x7a1e2082, 0x265b6e8a), STCP(0x79fdd35c, 0x26c1af22), STCP(0x79dd3098, 0x2727d486), + STCP(0x79bc384d, 0x278dde6e), STCP(0x799aea92, 0x27f3cc94), STCP(0x7979477d, 0x28599eb0), + STCP(0x79574f28, 0x28bf547b), STCP(0x793501a9, 0x2924edac), STCP(0x79125f19, 0x298a69fc), + STCP(0x78ef678f, 0x29efc925), STCP(0x78cc1b26, 0x2a550adf), STCP(0x78a879f4, 0x2aba2ee4), + STCP(0x78848414, 0x2b1f34eb), STCP(0x7860399e, 0x2b841caf), STCP(0x783b9aad, 0x2be8e5e8), + STCP(0x7816a759, 0x2c4d9050), STCP(0x77f15fbc, 0x2cb21ba0), STCP(0x77cbc3f2, 0x2d168792), + STCP(0x77a5d413, 0x2d7ad3de), STCP(0x777f903c, 0x2ddf0040), STCP(0x7758f886, 0x2e430c6f), + STCP(0x77320d0d, 0x2ea6f827), STCP(0x770acdec, 0x2f0ac320), STCP(0x76e33b3f, 0x2f6e6d16), + STCP(0x76bb5521, 0x2fd1f5c1), STCP(0x76931bae, 0x30355cdd), STCP(0x766a8f04, 0x3098a223), + STCP(0x7641af3d, 0x30fbc54d), STCP(0x76187c77, 0x315ec617), STCP(0x75eef6ce, 0x31c1a43b), + STCP(0x75c51e61, 0x32245f72), STCP(0x759af34c, 0x3286f779), STCP(0x757075ac, 0x32e96c09), + STCP(0x7545a5a0, 0x334bbcde), STCP(0x751a8346, 0x33ade9b3), STCP(0x74ef0ebc, 0x340ff242), + STCP(0x74c34820, 0x3471d647), STCP(0x74972f92, 0x34d3957e), STCP(0x746ac52f, 0x35352fa1), + STCP(0x743e0918, 0x3596a46c), STCP(0x7410fb6b, 0x35f7f39c), STCP(0x73e39c49, 0x36591cea), + STCP(0x73b5ebd1, 0x36ba2014), STCP(0x7387ea23, 0x371afcd5), STCP(0x73599760, 0x377bb2e9), + STCP(0x732af3a7, 0x37dc420c), STCP(0x72fbff1b, 0x383ca9fb), STCP(0x72ccb9db, 0x389cea72), + STCP(0x729d2409, 0x38fd032d), STCP(0x726d3dc6, 0x395cf3e9), STCP(0x723d0734, 0x39bcbc63), + STCP(0x720c8075, 0x3a1c5c57), STCP(0x71dba9ab, 0x3a7bd382), STCP(0x71aa82f7, 0x3adb21a1), + STCP(0x71790c7e, 0x3b3a4672), STCP(0x71474660, 0x3b9941b1), STCP(0x711530c2, 0x3bf8131c), + STCP(0x70e2cbc6, 0x3c56ba70), STCP(0x70b01790, 0x3cb5376b), STCP(0x707d1443, 0x3d1389cb), + STCP(0x7049c203, 0x3d71b14d), STCP(0x701620f5, 0x3dcfadb0), STCP(0x6fe2313c, 0x3e2d7eb1), + STCP(0x6fadf2fc, 0x3e8b240e), STCP(0x6f79665b, 0x3ee89d86), STCP(0x6f448b7e, 0x3f45ead8), + STCP(0x6f0f6289, 0x3fa30bc1), STCP(0x6ed9eba1, 0x40000000), STCP(0x6ea426ed, 0x405cc754), + STCP(0x6e6e1492, 0x40b9617d), STCP(0x6e37b4b6, 0x4115ce38), STCP(0x6e010780, 0x41720d46), + STCP(0x6dca0d14, 0x41ce1e65), STCP(0x6d92c59b, 0x422a0154), STCP(0x6d5b313b, 0x4285b5d4), + STCP(0x6d23501b, 0x42e13ba4), STCP(0x6ceb2261, 0x433c9283), STCP(0x6cb2a837, 0x4397ba32), + STCP(0x6c79e1c2, 0x43f2b271), STCP(0x6c40cf2c, 0x444d7aff), STCP(0x6c07709b, 0x44a8139e), + STCP(0x6bcdc639, 0x45027c0c), STCP(0x6b93d02e, 0x455cb40c), STCP(0x6b598ea3, 0x45b6bb5e), + STCP(0x6b1f01c0, 0x461091c2), STCP(0x6ae429ae, 0x466a36f9), STCP(0x6aa90697, 0x46c3aac5), + STCP(0x6a6d98a4, 0x471cece7), STCP(0x6a31e000, 0x4775fd1f), STCP(0x69f5dcd3, 0x47cedb31), + STCP(0x69b98f48, 0x482786dc), STCP(0x697cf78a, 0x487fffe4), STCP(0x694015c3, 0x48d84609), + STCP(0x6902ea1d, 0x4930590f), STCP(0x68c574c4, 0x498838b6), STCP(0x6887b5e2, 0x49dfe4c2), + STCP(0x6849ada3, 0x4a375cf5), STCP(0x680b5c33, 0x4a8ea111), STCP(0x67ccc1be, 0x4ae5b0da), + STCP(0x678dde6e, 0x4b3c8c12), STCP(0x674eb271, 0x4b93327c), STCP(0x670f3df3, 0x4be9a3db), + STCP(0x66cf8120, 0x4c3fdff4), STCP(0x668f7c25, 0x4c95e688), STCP(0x664f2f2e, 0x4cebb75c), + STCP(0x660e9a6a, 0x4d415234), STCP(0x65cdbe05, 0x4d96b6d3), STCP(0x658c9a2d, 0x4debe4fe), + STCP(0x654b2f10, 0x4e40dc79), STCP(0x65097cdb, 0x4e959d08), STCP(0x64c783bd, 0x4eea2670), + STCP(0x648543e4, 0x4f3e7875), STCP(0x6442bd7e, 0x4f9292dc), STCP(0x63fff0ba, 0x4fe6756a), + STCP(0x63bcddc7, 0x503a1fe5), STCP(0x637984d4, 0x508d9211), STCP(0x6335e611, 0x50e0cbb4), + STCP(0x62f201ac, 0x5133cc94), STCP(0x62add7d6, 0x51869476), STCP(0x626968be, 0x51d92321), + STCP(0x6224b495, 0x522b7859), STCP(0x61dfbb8a, 0x527d93e6), STCP(0x619a7dce, 0x52cf758f), + STCP(0x6154fb91, 0x53211d18), STCP(0x610f3505, 0x53728a4a), STCP(0x60c92a5a, 0x53c3bcea), + STCP(0x6082dbc1, 0x5414b4c1), STCP(0x603c496c, 0x54657194), STCP(0x5ff5738d, 0x54b5f32c), + STCP(0x5fae5a55, 0x55063951), STCP(0x5f66fdf5, 0x555643c8), STCP(0x5f1f5ea1, 0x55a6125c), + STCP(0x5ed77c8a, 0x55f5a4d2), STCP(0x5e8f57e2, 0x5644faf4), STCP(0x5e46f0dd, 0x5694148b), + STCP(0x5dfe47ad, 0x56e2f15d), STCP(0x5db55c86, 0x57319135), STCP(0x5d6c2f99, 0x577ff3da), + STCP(0x5d22c11c, 0x57ce1917), STCP(0x5cd91140, 0x581c00b3), STCP(0x5c8f203b, 0x5869aa79), + STCP(0x5c44ee40, 0x58b71632), STCP(0x5bfa7b82, 0x590443a7), STCP(0x5bafc837, 0x595132a2), + STCP(0x5b64d492, 0x599de2ee), STCP(0x5b19a0c8, 0x59ea5454), STCP(0x5ace2d0f, 0x5a36869f), + STCP(0x5a82799a, 0x5a82799a), +}; + +#ifdef ENABLE_HR_MODE +const PWord32 SineTable360[] = { +#else +const PWord16 SineTable360[] = { +#endif + STCP(0x7fffffff, 0x00000000), STCP(0x7fffb025, 0x008efa17), STCP(0x7ffec095, 0x011df37c), + STCP(0x7ffd3153, 0x01aceb7c), STCP(0x7ffb025f, 0x023be165), STCP(0x7ff833bc, 0x02cad485), + STCP(0x7ff4c56e, 0x0359c428), STCP(0x7ff0b779, 0x03e8af9e), STCP(0x7fec09e2, 0x04779632), + STCP(0x7fe6bcaf, 0x05067734), STCP(0x7fe0cfe6, 0x059551f1), STCP(0x7fda4390, 0x062425b6), + STCP(0x7fd317b3, 0x06b2f1d2), STCP(0x7fcb4c5a, 0x0741b592), STCP(0x7fc2e18d, 0x07d07044), + STCP(0x7fb9d758, 0x085f2136), STCP(0x7fb02dc5, 0x08edc7b7), STCP(0x7fa5e4e0, 0x097c6313), + STCP(0x7f9afcb8, 0x0a0af299), STCP(0x7f8f7558, 0x0a997597), STCP(0x7f834ecf, 0x0b27eb5c), + STCP(0x7f76892e, 0x0bb65336), STCP(0x7f692482, 0x0c44ac72), STCP(0x7f5b20de, 0x0cd2f660), + STCP(0x7f4c7e53, 0x0d61304e), STCP(0x7f3d3cf3, 0x0def5989), STCP(0x7f2d5cd0, 0x0e7d7162), + STCP(0x7f1cde00, 0x0f0b7727), STCP(0x7f0bc096, 0x0f996a26), STCP(0x7efa04a7, 0x102749ae), + STCP(0x7ee7aa4b, 0x10b5150f), STCP(0x7ed4b197, 0x1142cb98), STCP(0x7ec11aa4, 0x11d06c96), + STCP(0x7eace589, 0x125df75b), STCP(0x7e981261, 0x12eb6b35), STCP(0x7e82a145, 0x1378c774), + STCP(0x7e6c9250, 0x14060b68), STCP(0x7e55e59d, 0x1493365f), STCP(0x7e3e9b49, 0x152047ab), + STCP(0x7e26b370, 0x15ad3e9a), STCP(0x7e0e2e31, 0x163a1a7e), STCP(0x7df50baa, 0x16c6daa6), + STCP(0x7ddb4bfb, 0x17537e63), STCP(0x7dc0ef43, 0x17e00505), STCP(0x7da5f5a4, 0x186c6ddd), + STCP(0x7d8a5f3f, 0x18f8b83c), STCP(0x7d6e2c36, 0x1984e373), STCP(0x7d515cae, 0x1a10eed2), + STCP(0x7d33f0c9, 0x1a9cd9ac), STCP(0x7d15e8ac, 0x1b28a351), STCP(0x7cf7447e, 0x1bb44b13), + STCP(0x7cd80464, 0x1c3fd045), STCP(0x7cb82884, 0x1ccb3237), STCP(0x7c97b108, 0x1d56703b), + STCP(0x7c769e17, 0x1de189a5), STCP(0x7c54efdb, 0x1e6c7dc7), STCP(0x7c32a67d, 0x1ef74bf3), + STCP(0x7c0fc229, 0x1f81f37b), STCP(0x7bec430a, 0x200c73b4), STCP(0x7bc8294c, 0x2096cbf0), + STCP(0x7ba3751c, 0x2120fb83), STCP(0x7b7e26a9, 0x21ab01c0), STCP(0x7b583e20, 0x2234ddfa), + STCP(0x7b31bbb1, 0x22be8f87), STCP(0x7b0a9f8d, 0x234815ba), STCP(0x7ae2e9e3, 0x23d16fe8), + STCP(0x7aba9ae5, 0x245a9d64), STCP(0x7a91b2c6, 0x24e39d85), STCP(0x7a6831b9, 0x256c6f9f), + STCP(0x7a3e17f1, 0x25f51307), STCP(0x7a1365a4, 0x267d8713), STCP(0x79e81b05, 0x2705cb19), + STCP(0x79bc384c, 0x278dde6e), STCP(0x798fbdaf, 0x2815c069), STCP(0x7962ab66, 0x289d7061), + STCP(0x793501a8, 0x2924edab), STCP(0x7906c0af, 0x29ac37a0), STCP(0x78d7e8b5, 0x2a334d95), + STCP(0x78a879f3, 0x2aba2ee3), STCP(0x787874a6, 0x2b40dae2), STCP(0x7847d908, 0x2bc750e9), + STCP(0x7816a758, 0x2c4d9050), STCP(0x77e4dfd1, 0x2cd39870), STCP(0x77b282b3, 0x2d5968a2), + STCP(0x777f903b, 0x2ddf003f), STCP(0x774c08aa, 0x2e645ea0), STCP(0x7717ec40, 0x2ee9831f), + STCP(0x76e33b3e, 0x2f6e6d15), STCP(0x76adf5e5, 0x2ff31bdd), STCP(0x76781c79, 0x30778ed2), + STCP(0x7641af3c, 0x30fbc54d), STCP(0x760aae72, 0x317fbeaa), STCP(0x75d31a60, 0x32037a45), + STCP(0x759af34b, 0x3286f778), STCP(0x75623979, 0x330a35a1), STCP(0x7528ed31, 0x338d341a), + STCP(0x74ef0ebb, 0x340ff242), STCP(0x74b49e5f, 0x34926f74), STCP(0x74799c65, 0x3514ab0d), + STCP(0x743e0917, 0x3596a46c), STCP(0x7401e4c0, 0x36185aee), STCP(0x73c52faa, 0x3699cdf1), + STCP(0x7387ea22, 0x371afcd4), STCP(0x734a1474, 0x379be6f6), STCP(0x730baeec, 0x381c8bb5), + STCP(0x72ccb9da, 0x389cea71), STCP(0x728d358b, 0x391d028b), STCP(0x724d224e, 0x399cd362), + STCP(0x720c8074, 0x3a1c5c56), STCP(0x71cb504d, 0x3a9b9cc9), STCP(0x7189922b, 0x3b1a941c), + STCP(0x7147465f, 0x3b9941b0), STCP(0x71046d3d, 0x3c17a4e8), STCP(0x70c10717, 0x3c95bd25), + STCP(0x707d1442, 0x3d1389cb), STCP(0x70389513, 0x3d910a3c), STCP(0x6ff389de, 0x3e0e3ddb), + STCP(0x6fadf2fb, 0x3e8b240e), STCP(0x6f67d0c0, 0x3f07bc37), STCP(0x6f212384, 0x3f8405bb), + STCP(0x6ed9eba1, 0x3fffffff), STCP(0x6e92296d, 0x407baa69), STCP(0x6e49dd44, 0x40f7045f), + STCP(0x6e01077f, 0x41720d45), STCP(0x6db7a879, 0x41ecc483), STCP(0x6d6dc08e, 0x42672980), + STCP(0x6d23501a, 0x42e13ba3), STCP(0x6cd85779, 0x435afa54), STCP(0x6c8cd70a, 0x43d464fa), + STCP(0x6c40cf2b, 0x444d7aff), STCP(0x6bf4403a, 0x44c63bca), STCP(0x6ba72a97, 0x453ea6c7), + STCP(0x6b598ea2, 0x45b6bb5d), STCP(0x6b0b6cbc, 0x462e78f8), STCP(0x6abcc546, 0x46a5df02), + STCP(0x6a6d98a3, 0x471cece6), STCP(0x6a1de736, 0x4793a210), STCP(0x69cdb161, 0x4809fdeb), + STCP(0x697cf789, 0x487fffe3), STCP(0x692bba13, 0x48f5a767), STCP(0x68d9f964, 0x496af3e1), + STCP(0x6887b5e1, 0x49dfe4c2), STCP(0x6834eff2, 0x4a547975), STCP(0x67e1a7ff, 0x4ac8b16b), + STCP(0x678dde6e, 0x4b3c8c11), STCP(0x673993a8, 0x4bb008d8), STCP(0x66e4c817, 0x4c23272f), + STCP(0x668f7c24, 0x4c95e687), STCP(0x6639b03a, 0x4d084651), STCP(0x65e364c3, 0x4d7a45fd), + STCP(0x658c9a2d, 0x4debe4fe), STCP(0x653550e1, 0x4e5d22c5), STCP(0x64dd894f, 0x4ecdfec6), + STCP(0x648543e3, 0x4f3e7874), STCP(0x642c810b, 0x4fae8f42), STCP(0x63d34136, 0x501e42a5), + STCP(0x637984d4, 0x508d9211), STCP(0x631f4c54, 0x50fc7cfa), STCP(0x62c49826, 0x516b02d8), + STCP(0x626968be, 0x51d92320), STCP(0x620dbe8a, 0x5246dd48), STCP(0x61b19a00, 0x52b430c8), + STCP(0x6154fb90, 0x53211d17), STCP(0x60f7e3b0, 0x538da1ae), STCP(0x609a52d2, 0x53f9be04), + STCP(0x603c496c, 0x54657194), STCP(0x5fddc7f3, 0x54d0bbd6), STCP(0x5f7ecedd, 0x553b9c45), + STCP(0x5f1f5ea0, 0x55a6125b), STCP(0x5ebf77b4, 0x56101d94), STCP(0x5e5f1a90, 0x5679bd6b), + STCP(0x5dfe47ad, 0x56e2f15d), STCP(0x5d9cff82, 0x574bb8e6), STCP(0x5d3b428b, 0x57b41383), + STCP(0x5cd91140, 0x581c00b3), STCP(0x5c766c1c, 0x58837ff3), STCP(0x5c13539a, 0x58ea90c3), + STCP(0x5bafc836, 0x595132a2), STCP(0x5b4bca6c, 0x59b7650f), STCP(0x5ae75ab8, 0x5a1d278c), + STCP(0x5a827999, 0x5a827999), +}; + +#ifdef ENABLE_HR_MODE +const PWord32 SineTable320[] = { +#else +const PWord16 SineTable320[] = { +#endif + STCP(0x7fffffff, 0x00000000), STCP(0x7fff9aef, 0x00a0d951), STCP(0x7ffe6bbf, 0x0141b1a5), + STCP(0x7ffc726f, 0x01e287fc), STCP(0x7ff9af04, 0x02835b5a), STCP(0x7ff62182, 0x03242abf), + STCP(0x7ff1c9ef, 0x03c4f52f), STCP(0x7feca851, 0x0465b9aa), STCP(0x7fe6bcb0, 0x05067734), + STCP(0x7fe00716, 0x05a72ccf), STCP(0x7fd8878e, 0x0647d97c), STCP(0x7fd03e23, 0x06e87c3f), + STCP(0x7fc72ae2, 0x07891418), STCP(0x7fbd4dda, 0x0829a00c), STCP(0x7fb2a71b, 0x08ca1f1b), + STCP(0x7fa736b4, 0x096a9049), STCP(0x7f9afcb9, 0x0a0af299), STCP(0x7f8df93c, 0x0aab450d), + STCP(0x7f802c52, 0x0b4b86a8), STCP(0x7f719611, 0x0bebb66c), STCP(0x7f62368f, 0x0c8bd35e), + STCP(0x7f520de6, 0x0d2bdc80), STCP(0x7f411c2f, 0x0dcbd0d5), STCP(0x7f2f6183, 0x0e6baf61), + STCP(0x7f1cde01, 0x0f0b7727), STCP(0x7f0991c4, 0x0fab272b), STCP(0x7ef57cea, 0x104abe71), + STCP(0x7ee09f95, 0x10ea3bfd), STCP(0x7ecaf9e5, 0x11899ed3), STCP(0x7eb48bfb, 0x1228e5f8), + STCP(0x7e9d55fc, 0x12c8106f), STCP(0x7e85580c, 0x13671d3d), STCP(0x7e6c9251, 0x14060b68), + STCP(0x7e5304f2, 0x14a4d9f4), STCP(0x7e38b017, 0x154387e6), STCP(0x7e1d93ea, 0x15e21445), + STCP(0x7e01b096, 0x16807e15), STCP(0x7de50646, 0x171ec45c), STCP(0x7dc79529, 0x17bce621), + STCP(0x7da95d6c, 0x185ae269), STCP(0x7d8a5f40, 0x18f8b83c), STCP(0x7d6a9ad5, 0x199666a0), + STCP(0x7d4a105d, 0x1a33ec9c), STCP(0x7d28c00c, 0x1ad14938), STCP(0x7d06aa16, 0x1b6e7b7a), + STCP(0x7ce3ceb2, 0x1c0b826a), STCP(0x7cc02e15, 0x1ca85d12), STCP(0x7c9bc87a, 0x1d450a78), + STCP(0x7c769e18, 0x1de189a6), STCP(0x7c50af2b, 0x1e7dd9a4), STCP(0x7c29fbee, 0x1f19f97b), + STCP(0x7c02849f, 0x1fb5e836), STCP(0x7bda497d, 0x2051a4dd), STCP(0x7bb14ac5, 0x20ed2e7b), + STCP(0x7b8788ba, 0x2188841a), STCP(0x7b5d039e, 0x2223a4c5), STCP(0x7b31bbb2, 0x22be8f87), + STCP(0x7b05b13d, 0x2359436c), STCP(0x7ad8e482, 0x23f3bf7e), STCP(0x7aab55ca, 0x248e02cb), + STCP(0x7a7d055b, 0x25280c5e), STCP(0x7a4df380, 0x25c1db44), STCP(0x7a1e2082, 0x265b6e8a), + STCP(0x79ed8cad, 0x26f4c53e), STCP(0x79bc384d, 0x278dde6e), STCP(0x798a23b1, 0x2826b928), + STCP(0x79574f28, 0x28bf547b), STCP(0x7923bb01, 0x2957af74), STCP(0x78ef678f, 0x29efc925), + STCP(0x78ba5524, 0x2a87a09d), STCP(0x78848414, 0x2b1f34eb), STCP(0x784df4b3, 0x2bb68522), + STCP(0x7816a759, 0x2c4d9050), STCP(0x77de9c5b, 0x2ce45589), STCP(0x77a5d413, 0x2d7ad3de), + STCP(0x776c4edb, 0x2e110a62), STCP(0x77320d0d, 0x2ea6f827), STCP(0x76f70f05, 0x2f3c9c40), + STCP(0x76bb5521, 0x2fd1f5c1), STCP(0x767edfbe, 0x306703bf), STCP(0x7641af3d, 0x30fbc54d), + STCP(0x7603c3fd, 0x31903982), STCP(0x75c51e61, 0x32245f72), STCP(0x7585becb, 0x32b83634), + STCP(0x7545a5a0, 0x334bbcde), STCP(0x7504d345, 0x33def287), STCP(0x74c34820, 0x3471d647), + STCP(0x74810499, 0x35046736), STCP(0x743e0918, 0x3596a46c), STCP(0x73fa5607, 0x36288d03), + STCP(0x73b5ebd1, 0x36ba2014), STCP(0x7370cae2, 0x374b5cb9), STCP(0x732af3a7, 0x37dc420c), + STCP(0x72e4668f, 0x386ccf2a), STCP(0x729d2409, 0x38fd032d), STCP(0x72552c85, 0x398cdd32), + STCP(0x720c8075, 0x3a1c5c57), STCP(0x71c3204c, 0x3aab7fb7), STCP(0x71790c7e, 0x3b3a4672), + STCP(0x712e457f, 0x3bc8afa5), STCP(0x70e2cbc6, 0x3c56ba70), STCP(0x70969fca, 0x3ce465f3), + STCP(0x7049c203, 0x3d71b14d), STCP(0x6ffc32eb, 0x3dfe9ba1), STCP(0x6fadf2fc, 0x3e8b240e), + STCP(0x6f5f02b2, 0x3f1749b8), STCP(0x6f0f6289, 0x3fa30bc1), STCP(0x6ebf12ff, 0x402e694c), + STCP(0x6e6e1492, 0x40b9617d), STCP(0x6e1c67c4, 0x4143f379), STCP(0x6dca0d14, 0x41ce1e65), + STCP(0x6d770506, 0x4257e166), STCP(0x6d23501b, 0x42e13ba4), STCP(0x6cceeed8, 0x436a2c45), + STCP(0x6c79e1c2, 0x43f2b271), STCP(0x6c242960, 0x447acd50), STCP(0x6bcdc639, 0x45027c0c), + STCP(0x6b76b8d6, 0x4589bdcf), STCP(0x6b1f01c0, 0x461091c2), STCP(0x6ac6a180, 0x4696f710), + STCP(0x6a6d98a4, 0x471cece7), STCP(0x6a13e7b8, 0x47a27271), STCP(0x69b98f48, 0x482786dc), + STCP(0x695e8fe5, 0x48ac2957), STCP(0x6902ea1d, 0x4930590f), STCP(0x68a69e81, 0x49b41533), + STCP(0x6849ada3, 0x4a375cf5), STCP(0x67ec1817, 0x4aba2f84), STCP(0x678dde6e, 0x4b3c8c12), + STCP(0x672f013f, 0x4bbe71d1), STCP(0x66cf8120, 0x4c3fdff4), STCP(0x666f5ea6, 0x4cc0d5ae), + STCP(0x660e9a6a, 0x4d415234), STCP(0x65ad3505, 0x4dc154bb), STCP(0x654b2f10, 0x4e40dc79), + STCP(0x64e88926, 0x4ebfe8a5), STCP(0x648543e4, 0x4f3e7875), STCP(0x64215fe5, 0x4fbc8b22), + STCP(0x63bcddc7, 0x503a1fe5), STCP(0x6357be2a, 0x50b735f8), STCP(0x62f201ac, 0x5133cc94), + STCP(0x628ba8ef, 0x51afe2f6), STCP(0x6224b495, 0x522b7859), STCP(0x61bd253f, 0x52a68bfb), + STCP(0x6154fb91, 0x53211d18), STCP(0x60ec3830, 0x539b2af0), STCP(0x6082dbc1, 0x5414b4c1), + STCP(0x6018e6eb, 0x548db9cb), STCP(0x5fae5a55, 0x55063951), STCP(0x5f4336a7, 0x557e3292), + STCP(0x5ed77c8a, 0x55f5a4d2), STCP(0x5e6b2ca8, 0x566c8f55), STCP(0x5dfe47ad, 0x56e2f15d), + STCP(0x5d90ce45, 0x5758ca31), STCP(0x5d22c11c, 0x57ce1917), STCP(0x5cb420e0, 0x5842dd54), + STCP(0x5c44ee40, 0x58b71632), STCP(0x5bd529eb, 0x592ac2f7), STCP(0x5b64d492, 0x599de2ee), + STCP(0x5af3eee6, 0x5a107561), STCP(0x5a82799a, 0x5a82799a), +}; + + +#ifdef ENABLE_HR_MODE + + const PWord32 SineTable720[] = { + STCP(0x7fffffff, 0x00000000), STCP(0x7fffec08, 0x00477d17), STCP(0x7fffb025, 0x008efa17), + STCP(0x7fff4c53, 0x00d676eb), STCP(0x7ffec095, 0x011df37c), STCP(0x7ffe0cea, 0x01656fb4), + STCP(0x7ffd3153, 0x01aceb7c), STCP(0x7ffc2dcf, 0x01f466bf), STCP(0x7ffb025f, 0x023be165), + STCP(0x7ff9af03, 0x02835b59), STCP(0x7ff833bc, 0x02cad485), STCP(0x7ff6908a, 0x03124cd1), + STCP(0x7ff4c56e, 0x0359c428), STCP(0x7ff2d268, 0x03a13a74), STCP(0x7ff0b779, 0x03e8af9e), + STCP(0x7fee74a1, 0x0430238f), STCP(0x7fec09e2, 0x04779632), STCP(0x7fe9773c, 0x04bf0771), + STCP(0x7fe6bcaf, 0x05067734), STCP(0x7fe3da3d, 0x054de566), STCP(0x7fe0cfe6, 0x059551f1), + STCP(0x7fdd9dac, 0x05dcbcbe), STCP(0x7fda4390, 0x062425b6), STCP(0x7fd6c192, 0x066b8cc5), + STCP(0x7fd317b3, 0x06b2f1d2), STCP(0x7fcf45f6, 0x06fa54c9), STCP(0x7fcb4c5a, 0x0741b592), + STCP(0x7fc72ae1, 0x07891418), STCP(0x7fc2e18d, 0x07d07044), STCP(0x7fbe705f, 0x0817ca01), + STCP(0x7fb9d758, 0x085f2136), STCP(0x7fb51679, 0x08a675d0), STCP(0x7fb02dc5, 0x08edc7b7), + STCP(0x7fab1d3c, 0x093516d4), STCP(0x7fa5e4e0, 0x097c6313), STCP(0x7fa084b4, 0x09c3ac5c), + STCP(0x7f9afcb8, 0x0a0af299), STCP(0x7f954cee, 0x0a5235b4), STCP(0x7f8f7558, 0x0a997597), + STCP(0x7f8975f8, 0x0ae0b22c), STCP(0x7f834ecf, 0x0b27eb5c), STCP(0x7f7cffe1, 0x0b6f2112), + STCP(0x7f76892e, 0x0bb65336), STCP(0x7f6feab8, 0x0bfd81b3), STCP(0x7f692482, 0x0c44ac72), + STCP(0x7f62368e, 0x0c8bd35e), STCP(0x7f5b20de, 0x0cd2f660), STCP(0x7f53e374, 0x0d1a1562), + STCP(0x7f4c7e53, 0x0d61304e), STCP(0x7f44f17c, 0x0da8470d), STCP(0x7f3d3cf3, 0x0def5989), + STCP(0x7f3560b8, 0x0e3667ad), STCP(0x7f2d5cd0, 0x0e7d7162), STCP(0x7f25313c, 0x0ec47692), + STCP(0x7f1cde00, 0x0f0b7727), STCP(0x7f14631c, 0x0f52730a), STCP(0x7f0bc096, 0x0f996a26), + STCP(0x7f02f66e, 0x0fe05c64), STCP(0x7efa04a7, 0x102749ae), STCP(0x7ef0eb45, 0x106e31ef), + STCP(0x7ee7aa4b, 0x10b5150f), STCP(0x7ede41ba, 0x10fbf2fa), STCP(0x7ed4b197, 0x1142cb98), + STCP(0x7ecaf9e4, 0x11899ed3), STCP(0x7ec11aa4, 0x11d06c96), STCP(0x7eb713da, 0x121734cb), + STCP(0x7eace589, 0x125df75b), STCP(0x7ea28fb5, 0x12a4b431), STCP(0x7e981261, 0x12eb6b35), + STCP(0x7e8d6d90, 0x13321c53), STCP(0x7e82a145, 0x1378c774), STCP(0x7e77ad84, 0x13bf6c82), + STCP(0x7e6c9250, 0x14060b68), STCP(0x7e614fac, 0x144ca40e), STCP(0x7e55e59d, 0x1493365f), + STCP(0x7e4a5425, 0x14d9c245), STCP(0x7e3e9b49, 0x152047ab), STCP(0x7e32bb0b, 0x1566c679), + STCP(0x7e26b370, 0x15ad3e9a), STCP(0x7e1a847b, 0x15f3aff8), STCP(0x7e0e2e31, 0x163a1a7e), + STCP(0x7e01b095, 0x16807e14), STCP(0x7df50baa, 0x16c6daa6), STCP(0x7de83f76, 0x170d301d), + STCP(0x7ddb4bfb, 0x17537e63), STCP(0x7dce313e, 0x1799c562), STCP(0x7dc0ef43, 0x17e00505), + STCP(0x7db3860e, 0x18263d35), STCP(0x7da5f5a4, 0x186c6ddd), STCP(0x7d983e08, 0x18b296e7), + STCP(0x7d8a5f3f, 0x18f8b83c), STCP(0x7d7c594d, 0x193ed1c8), STCP(0x7d6e2c36, 0x1984e373), + STCP(0x7d5fd800, 0x19caed28), STCP(0x7d515cae, 0x1a10eed2), STCP(0x7d42ba45, 0x1a56e85b), + STCP(0x7d33f0c9, 0x1a9cd9ac), STCP(0x7d25003f, 0x1ae2c2b0), STCP(0x7d15e8ac, 0x1b28a351), + STCP(0x7d06aa15, 0x1b6e7b7a), STCP(0x7cf7447e, 0x1bb44b13), STCP(0x7ce7b7ec, 0x1bfa1209), + STCP(0x7cd80464, 0x1c3fd045), STCP(0x7cc829ea, 0x1c8585b0), STCP(0x7cb82884, 0x1ccb3237), + STCP(0x7ca80037, 0x1d10d5c1), STCP(0x7c97b108, 0x1d56703b), STCP(0x7c873afb, 0x1d9c018f), + STCP(0x7c769e17, 0x1de189a5), STCP(0x7c65da60, 0x1e27086a), STCP(0x7c54efdb, 0x1e6c7dc7), + STCP(0x7c43de8d, 0x1eb1e9a6), STCP(0x7c32a67d, 0x1ef74bf3), STCP(0x7c2147af, 0x1f3ca496), + STCP(0x7c0fc229, 0x1f81f37b), STCP(0x7bfe15f0, 0x1fc7388d), STCP(0x7bec430a, 0x200c73b4), + STCP(0x7bda497c, 0x2051a4dd), STCP(0x7bc8294c, 0x2096cbf0), STCP(0x7bb5e27f, 0x20dbe8da), + STCP(0x7ba3751c, 0x2120fb83), STCP(0x7b90e128, 0x216603d7), STCP(0x7b7e26a9, 0x21ab01c0), + STCP(0x7b6b45a4, 0x21eff528), STCP(0x7b583e20, 0x2234ddfa), STCP(0x7b451022, 0x2279bc21), + STCP(0x7b31bbb1, 0x22be8f87), STCP(0x7b1e40d3, 0x23035817), STCP(0x7b0a9f8d, 0x234815ba), + STCP(0x7af6d7e5, 0x238cc85c), STCP(0x7ae2e9e3, 0x23d16fe8), STCP(0x7aced58b, 0x24160c47), + STCP(0x7aba9ae5, 0x245a9d64), STCP(0x7aa639f7, 0x249f232b), STCP(0x7a91b2c6, 0x24e39d85), + STCP(0x7a7d055a, 0x25280c5d), STCP(0x7a6831b9, 0x256c6f9f), STCP(0x7a5337e9, 0x25b0c734), + STCP(0x7a3e17f1, 0x25f51307), STCP(0x7a28d1d8, 0x26395303), STCP(0x7a1365a4, 0x267d8713), + STCP(0x79fdd35b, 0x26c1af21), STCP(0x79e81b05, 0x2705cb19), STCP(0x79d23ca9, 0x2749dae4), + STCP(0x79bc384c, 0x278dde6e), STCP(0x79a60df7, 0x27d1d5a2), STCP(0x798fbdaf, 0x2815c069), + STCP(0x7979477c, 0x28599eb0), STCP(0x7962ab66, 0x289d7061), STCP(0x794be972, 0x28e13566), + STCP(0x793501a8, 0x2924edab), STCP(0x791df40f, 0x2968991b), STCP(0x7906c0af, 0x29ac37a0), + STCP(0x78ef678e, 0x29efc925), STCP(0x78d7e8b5, 0x2a334d95), STCP(0x78c04429, 0x2a76c4dc), + STCP(0x78a879f3, 0x2aba2ee3), STCP(0x78908a1a, 0x2afd8b97), STCP(0x787874a6, 0x2b40dae2), + STCP(0x7860399d, 0x2b841caf), STCP(0x7847d908, 0x2bc750e9), STCP(0x782f52ef, 0x2c0a777b), + STCP(0x7816a758, 0x2c4d9050), STCP(0x77fdd64b, 0x2c909b54), STCP(0x77e4dfd1, 0x2cd39870), + STCP(0x77cbc3f1, 0x2d168792), STCP(0x77b282b3, 0x2d5968a2), STCP(0x77991c1e, 0x2d9c3b8e), + STCP(0x777f903b, 0x2ddf003f), STCP(0x7765df12, 0x2e21b6a2), STCP(0x774c08aa, 0x2e645ea0), + STCP(0x77320d0c, 0x2ea6f826), STCP(0x7717ec40, 0x2ee9831f), STCP(0x76fda64e, 0x2f2bff76), + STCP(0x76e33b3e, 0x2f6e6d15), STCP(0x76c8ab18, 0x2fb0cbea), STCP(0x76adf5e5, 0x2ff31bdd), + STCP(0x76931bae, 0x30355cdc), STCP(0x76781c79, 0x30778ed2), STCP(0x765cf850, 0x30b9b1a9), + STCP(0x7641af3c, 0x30fbc54d), STCP(0x76264144, 0x313dc9aa), STCP(0x760aae72, 0x317fbeaa), + STCP(0x75eef6ce, 0x31c1a43a), STCP(0x75d31a60, 0x32037a45), STCP(0x75b71931, 0x324540b6), + STCP(0x759af34b, 0x3286f778), STCP(0x757ea8b5, 0x32c89e78), STCP(0x75623979, 0x330a35a1), + STCP(0x7545a59f, 0x334bbcde), STCP(0x7528ed31, 0x338d341a), STCP(0x750c1038, 0x33ce9b42), + STCP(0x74ef0ebb, 0x340ff242), STCP(0x74d1e8c5, 0x34513903), STCP(0x74b49e5f, 0x34926f74), + STCP(0x74972f91, 0x34d3957e), STCP(0x74799c65, 0x3514ab0d), STCP(0x745be4e4, 0x3555b00e), + STCP(0x743e0917, 0x3596a46c), STCP(0x74200908, 0x35d78813), STCP(0x7401e4c0, 0x36185aee), + STCP(0x73e39c48, 0x36591cea), STCP(0x73c52faa, 0x3699cdf1), STCP(0x73a69ef0, 0x36da6df1), + STCP(0x7387ea22, 0x371afcd4), STCP(0x7369114b, 0x375b7a87), STCP(0x734a1474, 0x379be6f6), + STCP(0x732af3a6, 0x37dc420c), STCP(0x730baeec, 0x381c8bb5), STCP(0x72ec4650, 0x385cc3de), + STCP(0x72ccb9da, 0x389cea71), STCP(0x72ad0995, 0x38dcff5d), STCP(0x728d358b, 0x391d028b), + STCP(0x726d3dc5, 0x395cf3e9), STCP(0x724d224e, 0x399cd362), STCP(0x722ce330, 0x39dca0e2), + STCP(0x720c8074, 0x3a1c5c56), STCP(0x71ebfa25, 0x3a5c05aa), STCP(0x71cb504d, 0x3a9b9cc9), + STCP(0x71aa82f6, 0x3adb21a0), STCP(0x7189922b, 0x3b1a941c), STCP(0x71687df5, 0x3b59f428), + STCP(0x7147465f, 0x3b9941b0), STCP(0x7125eb74, 0x3bd87ca1), STCP(0x71046d3d, 0x3c17a4e8), + STCP(0x70e2cbc5, 0x3c56ba70), STCP(0x70c10717, 0x3c95bd25), STCP(0x709f1f3d, 0x3cd4acf5), + STCP(0x707d1442, 0x3d1389cb), STCP(0x705ae630, 0x3d525394), STCP(0x70389513, 0x3d910a3c), + STCP(0x701620f4, 0x3dcfadaf), STCP(0x6ff389de, 0x3e0e3ddb), STCP(0x6fd0cfdd, 0x3e4cbaac), + STCP(0x6fadf2fb, 0x3e8b240e), STCP(0x6f8af343, 0x3ec979ed), STCP(0x6f67d0c0, 0x3f07bc37), + STCP(0x6f448b7d, 0x3f45ead7), STCP(0x6f212384, 0x3f8405bb), STCP(0x6efd98e2, 0x3fc20ccf), + STCP(0x6ed9eba1, 0x3fffffff), STCP(0x6eb61bcb, 0x403ddf39), STCP(0x6e92296d, 0x407baa69), + STCP(0x6e6e1492, 0x40b9617c), STCP(0x6e49dd44, 0x40f7045f), STCP(0x6e25838f, 0x413492fd), + STCP(0x6e01077f, 0x41720d45), STCP(0x6ddc691e, 0x41af7323), STCP(0x6db7a879, 0x41ecc483), + STCP(0x6d92c59a, 0x422a0154), STCP(0x6d6dc08e, 0x42672980), STCP(0x6d48995f, 0x42a43cf7), + STCP(0x6d23501a, 0x42e13ba3), STCP(0x6cfde4c9, 0x431e2573), STCP(0x6cd85779, 0x435afa54), + STCP(0x6cb2a836, 0x4397ba32), STCP(0x6c8cd70a, 0x43d464fa), STCP(0x6c66e403, 0x4410fa9a), + STCP(0x6c40cf2b, 0x444d7aff), STCP(0x6c1a988f, 0x4489e615), STCP(0x6bf4403a, 0x44c63bca), + STCP(0x6bcdc639, 0x45027c0c), STCP(0x6ba72a97, 0x453ea6c7), STCP(0x6b806d61, 0x457abbe8), + STCP(0x6b598ea2, 0x45b6bb5d), STCP(0x6b328e67, 0x45f2a513), STCP(0x6b0b6cbc, 0x462e78f8), + STCP(0x6ae429ad, 0x466a36f9), STCP(0x6abcc546, 0x46a5df02), STCP(0x6a953f94, 0x46e17102), + STCP(0x6a6d98a3, 0x471cece6), STCP(0x6a45d080, 0x4758529c), STCP(0x6a1de736, 0x4793a210), + STCP(0x69f5dcd2, 0x47cedb30), STCP(0x69cdb161, 0x4809fdeb), STCP(0x69a564ef, 0x48450a2d), + STCP(0x697cf789, 0x487fffe3), STCP(0x6954693b, 0x48badefd), STCP(0x692bba13, 0x48f5a767), + STCP(0x6902ea1c, 0x4930590e), STCP(0x68d9f964, 0x496af3e1), STCP(0x68b0e7f6, 0x49a577ce), + STCP(0x6887b5e1, 0x49dfe4c2), STCP(0x685e6331, 0x4a1a3aaa), STCP(0x6834eff2, 0x4a547975), + STCP(0x680b5c33, 0x4a8ea111), STCP(0x67e1a7ff, 0x4ac8b16b), STCP(0x67b7d363, 0x4b02aa71), + STCP(0x678dde6e, 0x4b3c8c11), STCP(0x6763c92b, 0x4b76563a), STCP(0x673993a8, 0x4bb008d8), + STCP(0x670f3df2, 0x4be9a3db), STCP(0x66e4c817, 0x4c23272f), STCP(0x66ba3223, 0x4c5c92c4), + STCP(0x668f7c24, 0x4c95e687), STCP(0x6664a627, 0x4ccf2267), STCP(0x6639b03a, 0x4d084651), + STCP(0x660e9a69, 0x4d415233), STCP(0x65e364c3, 0x4d7a45fd), STCP(0x65b80f55, 0x4db3219c), + STCP(0x658c9a2d, 0x4debe4fe), STCP(0x65610557, 0x4e249011), STCP(0x653550e1, 0x4e5d22c5), + STCP(0x65097cda, 0x4e959d07), STCP(0x64dd894f, 0x4ecdfec6), STCP(0x64b1764d, 0x4f0647f0), + STCP(0x648543e3, 0x4f3e7874), STCP(0x6458f21d, 0x4f769040), STCP(0x642c810b, 0x4fae8f42), + STCP(0x63fff0b9, 0x4fe6756a), STCP(0x63d34136, 0x501e42a5), STCP(0x63a6728f, 0x5055f6e2), + STCP(0x637984d4, 0x508d9211), STCP(0x634c7810, 0x50c5141e), STCP(0x631f4c54, 0x50fc7cfa), + STCP(0x62f201ac, 0x5133cc94), STCP(0x62c49826, 0x516b02d8), STCP(0x62970fd2, 0x51a21fb7), + STCP(0x626968be, 0x51d92320), STCP(0x623ba2f6, 0x52100d01), STCP(0x620dbe8a, 0x5246dd48), + STCP(0x61dfbb89, 0x527d93e6), STCP(0x61b19a00, 0x52b430c8), STCP(0x618359fd, 0x52eab3de), + STCP(0x6154fb90, 0x53211d17), STCP(0x61267ec7, 0x53576c62), STCP(0x60f7e3b0, 0x538da1ae), + STCP(0x60c92a59, 0x53c3bce9), STCP(0x609a52d2, 0x53f9be04), STCP(0x606b5d28, 0x542fa4ed), + STCP(0x603c496c, 0x54657194), STCP(0x600d17aa, 0x549b23e7), STCP(0x5fddc7f3, 0x54d0bbd6), + STCP(0x5fae5a54, 0x55063950), STCP(0x5f7ecedd, 0x553b9c45), STCP(0x5f4f259c, 0x5570e4a3), + STCP(0x5f1f5ea0, 0x55a6125b), STCP(0x5eef79f8, 0x55db255b), STCP(0x5ebf77b4, 0x56101d94), + STCP(0x5e8f57e2, 0x5644faf4), STCP(0x5e5f1a90, 0x5679bd6b), STCP(0x5e2ebfcf, 0x56ae64e9), + STCP(0x5dfe47ad, 0x56e2f15d), STCP(0x5dcdb239, 0x571762b6), STCP(0x5d9cff82, 0x574bb8e6), + STCP(0x5d6c2f99, 0x577ff3da), STCP(0x5d3b428b, 0x57b41383), STCP(0x5d0a3868, 0x57e817d1), + STCP(0x5cd91140, 0x581c00b3), STCP(0x5ca7cd21, 0x584fce19), STCP(0x5c766c1c, 0x58837ff3), + STCP(0x5c44ee3f, 0x58b71631), STCP(0x5c13539a, 0x58ea90c3), STCP(0x5be19c3c, 0x591def98), + STCP(0x5bafc836, 0x595132a2), STCP(0x5b7dd796, 0x598459ce), STCP(0x5b4bca6c, 0x59b7650f), + STCP(0x5b19a0c7, 0x59ea5454), STCP(0x5ae75ab8, 0x5a1d278c), STCP(0x5ab4f84f, 0x5a4fdea9), + STCP(0x5a827999, 0x5a827999) +}; + +const PWord32 SineTable960[] = { + STCP(0x7fffffff, 0x00000000), STCP(0x7ffff4c4, 0x00359dd2), STCP(0x7fffd314, 0x006b3b9b), + STCP(0x7fff9aee, 0x00a0d951), STCP(0x7fff4c53, 0x00d676eb), STCP(0x7ffee743, 0x010c1460), + STCP(0x7ffe6bbe, 0x0141b1a5), STCP(0x7ffdd9c3, 0x01774eb2), STCP(0x7ffd3153, 0x01aceb7c), + STCP(0x7ffc726e, 0x01e287fc), STCP(0x7ffb9d14, 0x02182427), STCP(0x7ffab146, 0x024dbff4), + STCP(0x7ff9af03, 0x02835b59), STCP(0x7ff8964c, 0x02b8f64e), STCP(0x7ff76720, 0x02ee90c8), + STCP(0x7ff62181, 0x03242abf), STCP(0x7ff4c56e, 0x0359c428), STCP(0x7ff352e7, 0x038f5cfb), + STCP(0x7ff1c9ee, 0x03c4f52e), STCP(0x7ff02a81, 0x03fa8cb8), STCP(0x7fee74a1, 0x0430238f), + STCP(0x7feca850, 0x0465b9aa), STCP(0x7feac58c, 0x049b4f00), STCP(0x7fe8cc56, 0x04d0e386), + STCP(0x7fe6bcaf, 0x05067734), STCP(0x7fe49697, 0x053c0a01), STCP(0x7fe25a0e, 0x05719be2), + STCP(0x7fe00715, 0x05a72ccf), STCP(0x7fdd9dac, 0x05dcbcbe), STCP(0x7fdb1dd4, 0x06124ba5), + STCP(0x7fd8878d, 0x0647d97c), STCP(0x7fd5dad7, 0x067d6639), STCP(0x7fd317b3, 0x06b2f1d2), + STCP(0x7fd03e22, 0x06e87c3f), STCP(0x7fcd4e23, 0x071e0575), STCP(0x7fca47b8, 0x07538d6b), + STCP(0x7fc72ae1, 0x07891418), STCP(0x7fc3f79f, 0x07be9973), STCP(0x7fc0adf1, 0x07f41d72), + STCP(0x7fbd4dd9, 0x0829a00b), STCP(0x7fb9d758, 0x085f2136), STCP(0x7fb64a6d, 0x0894a0e9), + STCP(0x7fb2a71a, 0x08ca1f1b), STCP(0x7faeed5e, 0x08ff9bc2), STCP(0x7fab1d3c, 0x093516d4), + STCP(0x7fa736b3, 0x096a9049), STCP(0x7fa339c4, 0x09a00817), STCP(0x7f9f2670, 0x09d57e35), + STCP(0x7f9afcb8, 0x0a0af299), STCP(0x7f96bc9b, 0x0a40653a), STCP(0x7f92661c, 0x0a75d60e), + STCP(0x7f8df93b, 0x0aab450d), STCP(0x7f8975f8, 0x0ae0b22c), STCP(0x7f84dc54, 0x0b161d63), + STCP(0x7f802c51, 0x0b4b86a8), STCP(0x7f7b65ee, 0x0b80edf1), STCP(0x7f76892e, 0x0bb65336), + STCP(0x7f719610, 0x0bebb66c), STCP(0x7f6c8c95, 0x0c21178c), STCP(0x7f676cbf, 0x0c56768a), + STCP(0x7f62368e, 0x0c8bd35e), STCP(0x7f5cea04, 0x0cc12dff), STCP(0x7f578720, 0x0cf68662), + STCP(0x7f520de5, 0x0d2bdc80), STCP(0x7f4c7e53, 0x0d61304e), STCP(0x7f46d86b, 0x0d9681c2), + STCP(0x7f411c2e, 0x0dcbd0d5), STCP(0x7f3b499c, 0x0e011d7c), STCP(0x7f3560b8, 0x0e3667ad), + STCP(0x7f2f6182, 0x0e6baf61), STCP(0x7f294bfc, 0x0ea0f48c), STCP(0x7f232025, 0x0ed63727), + STCP(0x7f1cde00, 0x0f0b7727), STCP(0x7f16858d, 0x0f40b483), STCP(0x7f1016cd, 0x0f75ef32), + STCP(0x7f0991c3, 0x0fab272b), STCP(0x7f02f66e, 0x0fe05c64), STCP(0x7efc44cf, 0x10158ed4), + STCP(0x7ef57cea, 0x104abe71), STCP(0x7eee9ebd, 0x107feb33), STCP(0x7ee7aa4b, 0x10b5150f), + STCP(0x7ee09f94, 0x10ea3bfd), STCP(0x7ed97e9b, 0x111f5ff3), STCP(0x7ed24760, 0x115480e9), + STCP(0x7ecaf9e4, 0x11899ed3), STCP(0x7ec39629, 0x11beb9aa), STCP(0x7ebc1c30, 0x11f3d164), + STCP(0x7eb48bfa, 0x1228e5f7), STCP(0x7eace589, 0x125df75b), STCP(0x7ea528df, 0x12930586), + STCP(0x7e9d55fb, 0x12c8106e), STCP(0x7e956ce0, 0x12fd180b), STCP(0x7e8d6d90, 0x13321c53), + STCP(0x7e85580b, 0x13671d3d), STCP(0x7e7d2c53, 0x139c1abf), STCP(0x7e74ea69, 0x13d114d0), + STCP(0x7e6c9250, 0x14060b68), STCP(0x7e642407, 0x143afe7b), STCP(0x7e5b9f92, 0x146fee02), + STCP(0x7e5304f1, 0x14a4d9f3), STCP(0x7e4a5425, 0x14d9c245), STCP(0x7e418d31, 0x150ea6ef), + STCP(0x7e38b016, 0x154387e6), STCP(0x7e2fbcd5, 0x15786522), STCP(0x7e26b370, 0x15ad3e9a), + STCP(0x7e1d93e9, 0x15e21444), STCP(0x7e145e41, 0x1616e618), STCP(0x7e0b1279, 0x164bb40b), + STCP(0x7e01b095, 0x16807e14), STCP(0x7df83894, 0x16b5442b), STCP(0x7deeaa79, 0x16ea0646), + STCP(0x7de50645, 0x171ec45c), STCP(0x7ddb4bfb, 0x17537e63), STCP(0x7dd17b9b, 0x17883452), + STCP(0x7dc79528, 0x17bce621), STCP(0x7dbd98a3, 0x17f193c5), STCP(0x7db3860e, 0x18263d35), + STCP(0x7da95d6b, 0x185ae269), STCP(0x7d9f1ebc, 0x188f8357), STCP(0x7d94ca02, 0x18c41ff6), + STCP(0x7d8a5f3f, 0x18f8b83c), STCP(0x7d7fde75, 0x192d4c21), STCP(0x7d7547a6, 0x1961db9b), + STCP(0x7d6a9ad4, 0x199666a0), STCP(0x7d5fd800, 0x19caed28), STCP(0x7d54ff2d, 0x19ff6f2a), + STCP(0x7d4a105c, 0x1a33ec9c), STCP(0x7d3f0b8f, 0x1a686575), STCP(0x7d33f0c9, 0x1a9cd9ac), + STCP(0x7d28c00b, 0x1ad14938), STCP(0x7d1d7957, 0x1b05b40e), STCP(0x7d121caf, 0x1b3a1a27), + STCP(0x7d06aa15, 0x1b6e7b7a), STCP(0x7cfb218b, 0x1ba2d7fc), STCP(0x7cef8314, 0x1bd72fa4), + STCP(0x7ce3ceb1, 0x1c0b826a), STCP(0x7cd80464, 0x1c3fd045), STCP(0x7ccc242f, 0x1c74192a), + STCP(0x7cc02e14, 0x1ca85d12), STCP(0x7cb42216, 0x1cdc9bf2), STCP(0x7ca80037, 0x1d10d5c1), + STCP(0x7c9bc879, 0x1d450a78), STCP(0x7c8f7add, 0x1d793a0b), STCP(0x7c831766, 0x1dad6473), + STCP(0x7c769e17, 0x1de189a5), STCP(0x7c6a0ef1, 0x1e15a99a), STCP(0x7c5d69f6, 0x1e49c447), + STCP(0x7c50af2a, 0x1e7dd9a3), STCP(0x7c43de8d, 0x1eb1e9a6), STCP(0x7c36f823, 0x1ee5f447), + STCP(0x7c29fbed, 0x1f19f97b), STCP(0x7c1ce9ee, 0x1f4df93a), STCP(0x7c0fc229, 0x1f81f37b), + STCP(0x7c02849f, 0x1fb5e835), STCP(0x7bf53152, 0x1fe9d75f), STCP(0x7be7c846, 0x201dc0ef), + STCP(0x7bda497c, 0x2051a4dd), STCP(0x7bccb4f7, 0x2085831e), STCP(0x7bbf0ab9, 0x20b95bac), + STCP(0x7bb14ac4, 0x20ed2e7b), STCP(0x7ba3751c, 0x2120fb83), STCP(0x7b9589c2, 0x2154c2bb), + STCP(0x7b8788b9, 0x2188841a), STCP(0x7b797204, 0x21bc3f97), STCP(0x7b6b45a4, 0x21eff528), + STCP(0x7b5d039d, 0x2223a4c5), STCP(0x7b4eabf0, 0x22574e65), STCP(0x7b403ea1, 0x228af1fe), + STCP(0x7b31bbb1, 0x22be8f87), STCP(0x7b232324, 0x22f226f8), STCP(0x7b1474fc, 0x2325b847), + STCP(0x7b05b13c, 0x2359436c), STCP(0x7af6d7e5, 0x238cc85c), STCP(0x7ae7e8fb, 0x23c04710), + STCP(0x7ad8e481, 0x23f3bf7e), STCP(0x7ac9ca79, 0x2427319d), STCP(0x7aba9ae5, 0x245a9d64), + STCP(0x7aab55c9, 0x248e02ca), STCP(0x7a9bfb26, 0x24c161c7), STCP(0x7a8c8b00, 0x24f4ba50), + STCP(0x7a7d055a, 0x25280c5d), STCP(0x7a6d6a36, 0x255b57e6), STCP(0x7a5db997, 0x258e9ce0), + STCP(0x7a4df37f, 0x25c1db43), STCP(0x7a3e17f1, 0x25f51307), STCP(0x7a2e26f1, 0x26284421), + STCP(0x7a1e2081, 0x265b6e8a), STCP(0x7a0e04a3, 0x268e9238), STCP(0x79fdd35b, 0x26c1af21), + STCP(0x79ed8cac, 0x26f4c53e), STCP(0x79dd3097, 0x2727d485), STCP(0x79ccbf21, 0x275adcee), + STCP(0x79bc384c, 0x278dde6e), STCP(0x79ab9c1b, 0x27c0d8fe), STCP(0x799aea91, 0x27f3cc94), + STCP(0x798a23b0, 0x2826b928), STCP(0x7979477c, 0x28599eb0), STCP(0x796855f8, 0x288c7d24), + STCP(0x79574f27, 0x28bf547a), STCP(0x7946330b, 0x28f224aa), STCP(0x793501a8, 0x2924edab), + STCP(0x7923bb00, 0x2957af74), STCP(0x79125f18, 0x298a69fc), STCP(0x7900edf1, 0x29bd1d3a), + STCP(0x78ef678e, 0x29efc925), STCP(0x78ddcbf4, 0x2a226db4), STCP(0x78cc1b25, 0x2a550adf), + STCP(0x78ba5523, 0x2a87a09c), STCP(0x78a879f3, 0x2aba2ee3), STCP(0x78968997, 0x2aecb5ab), + STCP(0x78848413, 0x2b1f34eb), STCP(0x78726969, 0x2b51ac9a), STCP(0x7860399d, 0x2b841caf), + STCP(0x784df4b2, 0x2bb68521), STCP(0x783b9aac, 0x2be8e5e8), STCP(0x78292b8c, 0x2c1b3efb), + STCP(0x7816a758, 0x2c4d9050), STCP(0x78040e11, 0x2c7fd9df), STCP(0x77f15fbb, 0x2cb21ba0), + STCP(0x77de9c5a, 0x2ce45589), STCP(0x77cbc3f1, 0x2d168792), STCP(0x77b8d683, 0x2d48b1b1), + STCP(0x77a5d413, 0x2d7ad3de), STCP(0x7792bca4, 0x2dacee10), STCP(0x777f903b, 0x2ddf003f), + STCP(0x776c4eda, 0x2e110a62), STCP(0x7758f885, 0x2e430c6f), STCP(0x77458d3f, 0x2e75065e), + STCP(0x77320d0c, 0x2ea6f826), STCP(0x771e77ef, 0x2ed8e1bf), STCP(0x770acdeb, 0x2f0ac320), + STCP(0x76f70f04, 0x2f3c9c3f), STCP(0x76e33b3e, 0x2f6e6d15), STCP(0x76cf529b, 0x2fa03599), + STCP(0x76bb5520, 0x2fd1f5c1), STCP(0x76a742d0, 0x3003ad85), STCP(0x76931bae, 0x30355cdc), + STCP(0x767edfbd, 0x306703be), STCP(0x766a8f03, 0x3098a222), STCP(0x76562981, 0x30ca37ff), + STCP(0x7641af3c, 0x30fbc54d), STCP(0x762d2037, 0x312d4a02), STCP(0x76187c76, 0x315ec617), + STCP(0x7603c3fc, 0x31903982), STCP(0x75eef6ce, 0x31c1a43a), STCP(0x75da14ee, 0x31f30638), + STCP(0x75c51e60, 0x32245f72), STCP(0x75b01329, 0x3255afe0), STCP(0x759af34b, 0x3286f778), + STCP(0x7585beca, 0x32b83634), STCP(0x757075ab, 0x32e96c09), STCP(0x755b17f1, 0x331a98ef), + STCP(0x7545a59f, 0x334bbcde), STCP(0x75301eba, 0x337cd7cc), STCP(0x751a8345, 0x33ade9b2), + STCP(0x7504d344, 0x33def287), STCP(0x74ef0ebb, 0x340ff242), STCP(0x74d935ad, 0x3440e8da), + STCP(0x74c3481f, 0x3471d647), STCP(0x74ad4614, 0x34a2ba80), STCP(0x74972f91, 0x34d3957e), + STCP(0x74810498, 0x35046736), STCP(0x746ac52e, 0x35352fa1), STCP(0x74547157, 0x3565eeb6), + STCP(0x743e0917, 0x3596a46c), STCP(0x74278c71, 0x35c750bb), STCP(0x7410fb6a, 0x35f7f39b), + STCP(0x73fa5606, 0x36288d03), STCP(0x73e39c48, 0x36591cea), STCP(0x73ccce35, 0x3689a347), + STCP(0x73b5ebd0, 0x36ba2013), STCP(0x739ef51e, 0x36ea9345), STCP(0x7387ea22, 0x371afcd4), + STCP(0x7370cae1, 0x374b5cb8), STCP(0x7359975f, 0x377bb2e8), STCP(0x73424f9f, 0x37abff5c), + STCP(0x732af3a6, 0x37dc420c), STCP(0x73138379, 0x380c7aee), STCP(0x72fbff1a, 0x383ca9fb), + STCP(0x72e4668e, 0x386ccf29), STCP(0x72ccb9da, 0x389cea71), STCP(0x72b4f901, 0x38ccfbcb), + STCP(0x729d2408, 0x38fd032d), STCP(0x72853af2, 0x392d008f), STCP(0x726d3dc5, 0x395cf3e9), + STCP(0x72552c84, 0x398cdd32), STCP(0x723d0733, 0x39bcbc62), STCP(0x7224cdd7, 0x39ec9171), + STCP(0x720c8074, 0x3a1c5c56), STCP(0x71f41f0e, 0x3a4c1d09), STCP(0x71dba9aa, 0x3a7bd381), + STCP(0x71c3204b, 0x3aab7fb6), STCP(0x71aa82f6, 0x3adb21a0), STCP(0x7191d1b0, 0x3b0ab937), + STCP(0x71790c7d, 0x3b3a4671), STCP(0x71603360, 0x3b69c947), STCP(0x7147465f, 0x3b9941b0), + STCP(0x712e457e, 0x3bc8afa4), STCP(0x711530c1, 0x3bf8131b), STCP(0x70fc082d, 0x3c276c0c), + STCP(0x70e2cbc5, 0x3c56ba70), STCP(0x70c97b8f, 0x3c85fe3c), STCP(0x70b0178f, 0x3cb5376b), + STCP(0x70969fc9, 0x3ce465f2), STCP(0x707d1442, 0x3d1389cb), STCP(0x706374fe, 0x3d42a2ec), + STCP(0x7049c202, 0x3d71b14d), STCP(0x702ffb53, 0x3da0b4e6), STCP(0x701620f4, 0x3dcfadaf), + STCP(0x6ffc32ea, 0x3dfe9ba0), STCP(0x6fe2313b, 0x3e2d7eb0), STCP(0x6fc81be9, 0x3e5c56d8), + STCP(0x6fadf2fb, 0x3e8b240e), STCP(0x6f93b675, 0x3eb9e64b), STCP(0x6f79665a, 0x3ee89d86), + STCP(0x6f5f02b1, 0x3f1749b7), STCP(0x6f448b7d, 0x3f45ead7), STCP(0x6f2a00c3, 0x3f7480dd), + STCP(0x6f0f6288, 0x3fa30bc0), STCP(0x6ef4b0d0, 0x3fd18b79), STCP(0x6ed9eba1, 0x3fffffff), + STCP(0x6ebf12fe, 0x402e694b), STCP(0x6ea426ed, 0x405cc754), STCP(0x6e892772, 0x408b1a12), + STCP(0x6e6e1492, 0x40b9617c), STCP(0x6e52ee51, 0x40e79d8c), STCP(0x6e37b4b6, 0x4115ce38), + STCP(0x6e1c67c3, 0x4143f378), STCP(0x6e01077f, 0x41720d45), STCP(0x6de593ed, 0x41a01b96), + STCP(0x6dca0d14, 0x41ce1e64), STCP(0x6dae72f6, 0x41fc15a6), STCP(0x6d92c59a, 0x422a0154), + STCP(0x6d770505, 0x4257e166), STCP(0x6d5b313a, 0x4285b5d4), STCP(0x6d3f4a3f, 0x42b37e95), + STCP(0x6d23501a, 0x42e13ba3), STCP(0x6d0742ce, 0x430eecf5), STCP(0x6ceb2260, 0x433c9283), + STCP(0x6cceeed7, 0x436a2c44), STCP(0x6cb2a836, 0x4397ba32), STCP(0x6c964e82, 0x43c53c43), + STCP(0x6c79e1c1, 0x43f2b270), STCP(0x6c5d61f8, 0x44201cb2), STCP(0x6c40cf2b, 0x444d7aff), + STCP(0x6c24295f, 0x447acd50), STCP(0x6c07709b, 0x44a8139d), STCP(0x6beaa4e1, 0x44d54dde), + STCP(0x6bcdc639, 0x45027c0c), STCP(0x6bb0d4a6, 0x452f9e1e), STCP(0x6b93d02d, 0x455cb40c), + STCP(0x6b76b8d5, 0x4589bdce), STCP(0x6b598ea2, 0x45b6bb5d), STCP(0x6b3c5199, 0x45e3acb1), + STCP(0x6b1f01bf, 0x461091c1), STCP(0x6b019f19, 0x463d6a86), STCP(0x6ae429ad, 0x466a36f9), + STCP(0x6ac6a180, 0x4696f710), STCP(0x6aa90696, 0x46c3aac5), STCP(0x6a8b58f6, 0x46f0520f), + STCP(0x6a6d98a3, 0x471cece6), STCP(0x6a4fc5a5, 0x47497b44), STCP(0x6a31dfff, 0x4775fd1f), + STCP(0x6a13e7b7, 0x47a27270), STCP(0x69f5dcd2, 0x47cedb30), STCP(0x69d7bf56, 0x47fb3757), + STCP(0x69b98f47, 0x482786dc), STCP(0x699b4cac, 0x4853c9b8), STCP(0x697cf789, 0x487fffe3), + STCP(0x695e8fe4, 0x48ac2956), STCP(0x694015c2, 0x48d84609), STCP(0x69218928, 0x490455f3), + STCP(0x6902ea1c, 0x4930590e), STCP(0x68e438a3, 0x495c4f51), STCP(0x68c574c3, 0x498838b6), + STCP(0x68a69e80, 0x49b41533), STCP(0x6887b5e1, 0x49dfe4c2), STCP(0x6868baeb, 0x4a0ba75a), + STCP(0x6849ada3, 0x4a375cf4), STCP(0x682a8e0e, 0x4a630589), STCP(0x680b5c33, 0x4a8ea111), + STCP(0x67ec1816, 0x4aba2f83), STCP(0x67ccc1bd, 0x4ae5b0d9), STCP(0x67ad592e, 0x4b11250b), + STCP(0x678dde6e, 0x4b3c8c11), STCP(0x676e5182, 0x4b67e5e4), STCP(0x674eb270, 0x4b93327b), + STCP(0x672f013f, 0x4bbe71d0), STCP(0x670f3df2, 0x4be9a3db), STCP(0x66ef6890, 0x4c14c894), + STCP(0x66cf811f, 0x4c3fdff3), STCP(0x66af87a4, 0x4c6ae9f1), STCP(0x668f7c24, 0x4c95e687), + STCP(0x666f5ea5, 0x4cc0d5ad), STCP(0x664f2f2e, 0x4cebb75c), STCP(0x662eedc2, 0x4d168b8b), + STCP(0x660e9a69, 0x4d415233), STCP(0x65ee3528, 0x4d6c0b4e), STCP(0x65cdbe05, 0x4d96b6d3), + STCP(0x65ad3504, 0x4dc154bb), STCP(0x658c9a2d, 0x4debe4fe), STCP(0x656bed84, 0x4e166795), + STCP(0x654b2f0f, 0x4e40dc78), STCP(0x652a5ed5, 0x4e6b43a1), STCP(0x65097cda, 0x4e959d07), + STCP(0x64e88925, 0x4ebfe8a4), STCP(0x64c783bc, 0x4eea266f), STCP(0x64a66ca4, 0x4f145662), + STCP(0x648543e3, 0x4f3e7874), STCP(0x6464097e, 0x4f688c9f), STCP(0x6442bd7d, 0x4f9292db), + STCP(0x64215fe4, 0x4fbc8b21), STCP(0x63fff0b9, 0x4fe6756a), STCP(0x63de7003, 0x501051ad), + STCP(0x63bcddc6, 0x503a1fe4), STCP(0x639b3a0a, 0x5063e008), STCP(0x637984d4, 0x508d9211), + STCP(0x6357be29, 0x50b735f7), STCP(0x6335e610, 0x50e0cbb4), STCP(0x6313fc8f, 0x510a5340), + STCP(0x62f201ac, 0x5133cc94), STCP(0x62cff56c, 0x515d37a8), STCP(0x62add7d5, 0x51869476), + STCP(0x628ba8ef, 0x51afe2f5), STCP(0x626968be, 0x51d92320), STCP(0x62471748, 0x520254ee), + STCP(0x6224b494, 0x522b7859), STCP(0x620240a8, 0x52548d58), STCP(0x61dfbb89, 0x527d93e6), + STCP(0x61bd253e, 0x52a68bfa), STCP(0x619a7dcd, 0x52cf758e), STCP(0x6177c53c, 0x52f8509a), + STCP(0x6154fb90, 0x53211d17), STCP(0x613220d1, 0x5349daff), STCP(0x610f3504, 0x53728a49), + STCP(0x60ec382f, 0x539b2aef), STCP(0x60c92a59, 0x53c3bce9), STCP(0x60a60b87, 0x53ec4032), + STCP(0x6082dbc0, 0x5414b4c0), STCP(0x605f9b0b, 0x543d1a8e), STCP(0x603c496c, 0x54657194), + STCP(0x6018e6ea, 0x548db9cb), STCP(0x5ff5738c, 0x54b5f32c), STCP(0x5fd1ef58, 0x54de1db0), + STCP(0x5fae5a54, 0x55063950), STCP(0x5f8ab486, 0x552e4605), STCP(0x5f66fdf4, 0x555643c8), + STCP(0x5f4336a6, 0x557e3291), STCP(0x5f1f5ea0, 0x55a6125b), STCP(0x5efb75ea, 0x55cde31d), + STCP(0x5ed77c89, 0x55f5a4d2), STCP(0x5eb37284, 0x561d5771), STCP(0x5e8f57e2, 0x5644faf4), + STCP(0x5e6b2ca8, 0x566c8f54), STCP(0x5e46f0dc, 0x5694148a), STCP(0x5e22a487, 0x56bb8a8f), + STCP(0x5dfe47ad, 0x56e2f15d), STCP(0x5dd9da55, 0x570a48eb), STCP(0x5db55c85, 0x57319134), + STCP(0x5d90ce44, 0x5758ca31), STCP(0x5d6c2f99, 0x577ff3da), STCP(0x5d478089, 0x57a70e29), + STCP(0x5d22c11b, 0x57ce1916), STCP(0x5cfdf156, 0x57f5149c), STCP(0x5cd91140, 0x581c00b3), + STCP(0x5cb420df, 0x5842dd54), STCP(0x5c8f203a, 0x5869aa78), STCP(0x5c6a0f58, 0x5890681a), + STCP(0x5c44ee3f, 0x58b71631), STCP(0x5c1fbcf5, 0x58ddb4b7), STCP(0x5bfa7b81, 0x590443a6), + STCP(0x5bd529ea, 0x592ac2f6), STCP(0x5bafc836, 0x595132a2), STCP(0x5b8a566b, 0x597792a1), + STCP(0x5b64d491, 0x599de2ed), STCP(0x5b3f42ae, 0x59c42380), STCP(0x5b19a0c7, 0x59ea5454), + STCP(0x5af3eee5, 0x5a107560), STCP(0x5ace2d0e, 0x5a36869f), STCP(0x5aa85b48, 0x5a5c8809), + STCP(0x5a827999, 0x5a827999), +}; +#endif + +/* + Sine windows + */ + +#ifdef ENABLE_HR_MODE +const PWord32 SineWindow20[10] = { +#else +const PWord16 SineWindow20[10] = { +#endif + WTCP(0x7fe6bcaf, 0x5067734), WTCP(0x7f1cde00, 0xf0b7727), WTCP(0x7d8a5f3f, 0x18f8b83c), + WTCP(0x7b31bbb1, 0x22be8f87), WTCP(0x7816a758, 0x2c4d9050), WTCP(0x743e0917, 0x3596a46c), + WTCP(0x6fadf2fb, 0x3e8b240e), WTCP(0x6a6d98a3, 0x471cece6), WTCP(0x648543e3, 0x4f3e7874), + WTCP(0x5dfe47ad, 0x56e2f15d), +}; + +#if (defined CR9_C_ADD_1p25MS) +#ifdef ENABLE_HR_MODE +const PWord32 SineWindow30[] = { +#else +const PWord16 SineWindow30[] = { +#endif + WTCP(0x7ff4c56f, 0x0359c428), WTCP(0x7f9afcb9, 0x0a0af299), WTCP(0x7ee7aa4c, 0x10b5150f), WTCP(0x7ddb4bfc, 0x17537e63), + WTCP(0x7c769e18, 0x1de189a6), WTCP(0x7aba9ae6, 0x245a9d65), WTCP(0x78a879f4, 0x2aba2ee4), WTCP(0x7641af3d, 0x30fbc54d), + WTCP(0x7387ea23, 0x371afcd5), WTCP(0x707d1443, 0x3d1389cb), WTCP(0x6d23501b, 0x42e13ba4), WTCP(0x697cf78a, 0x487fffe4), + WTCP(0x658c9a2d, 0x4debe4fe), WTCP(0x6154fb91, 0x53211d18), WTCP(0x5cd91140, 0x581c00b3), WTCP(0x5cd91140, 0x581c00b3), + +}; +#endif + +#ifdef ENABLE_HR_MODE +const PWord32 SineWindow40[20] = { +#else +const PWord16 SineWindow40[20] = { +#endif + WTCP(0x7ff9af04, 0x02835b5a), WTCP(0x7fc72ae2, 0x07891418), WTCP(0x7f62368f, 0x0c8bd35e), + WTCP(0x7ecaf9e5, 0x11899ed3), WTCP(0x7e01b096, 0x16807e15), WTCP(0x7d06aa16, 0x1b6e7b7a), + WTCP(0x7bda497d, 0x2051a4dd), WTCP(0x7a7d055b, 0x25280c5e), WTCP(0x78ef678f, 0x29efc925), + WTCP(0x77320d0d, 0x2ea6f827), WTCP(0x7545a5a0, 0x334bbcde), WTCP(0x732af3a7, 0x37dc420c), + WTCP(0x70e2cbc6, 0x3c56ba70), WTCP(0x6e6e1492, 0x40b9617d), WTCP(0x6bcdc639, 0x45027c0c), + WTCP(0x6902ea1d, 0x4930590f), WTCP(0x660e9a6a, 0x4d415234), WTCP(0x62f201ac, 0x5133cc94), + WTCP(0x5fae5a55, 0x55063951), WTCP(0x5c44ee40, 0x58b71632), +}; + +#ifdef ENABLE_HR_MODE +const PWord32 SineWindow60[30] = { +#else +const PWord16 SineWindow60[30] = { +#endif + WTCP(0x7ffd3153, 0x1aceb7c), WTCP(0x7fe6bcaf, 0x5067734), WTCP(0x7fb9d758, 0x85f2136), + WTCP(0x7f76892e, 0xbb65336), WTCP(0x7f1cde00, 0xf0b7727), WTCP(0x7eace589, 0x125df75b), + WTCP(0x7e26b370, 0x15ad3e9a), WTCP(0x7d8a5f3f, 0x18f8b83c), WTCP(0x7cd80464, 0x1c3fd045), + WTCP(0x7c0fc229, 0x1f81f37b), WTCP(0x7b31bbb1, 0x22be8f87), WTCP(0x7a3e17f1, 0x25f51307), + WTCP(0x793501a8, 0x2924edab), WTCP(0x7816a758, 0x2c4d9050), WTCP(0x76e33b3e, 0x2f6e6d15), + WTCP(0x759af34b, 0x3286f778), WTCP(0x743e0917, 0x3596a46c), WTCP(0x72ccb9da, 0x389cea71), + WTCP(0x7147465f, 0x3b9941b0), WTCP(0x6fadf2fb, 0x3e8b240e), WTCP(0x6e01077f, 0x41720d45), + WTCP(0x6c40cf2b, 0x444d7aff), WTCP(0x6a6d98a3, 0x471cece6), WTCP(0x6887b5e1, 0x49dfe4c2), + WTCP(0x668f7c24, 0x4c95e687), WTCP(0x648543e3, 0x4f3e7874), WTCP(0x626968be, 0x51d92320), + WTCP(0x603c496c, 0x54657194), WTCP(0x5dfe47ad, 0x56e2f15d), WTCP(0x5bafc836, 0x595132a2), +}; + +#ifdef ENABLE_HR_MODE +const PWord32 SineWindow80[40] = { +#else +const PWord16 SineWindow80[40] = { +#endif + WTCP(0x7ffe6bbf, 0x0141b1a5), WTCP(0x7ff1c9ef, 0x03c4f52f), WTCP(0x7fd8878e, 0x0647d97c), + WTCP(0x7fb2a71b, 0x08ca1f1b), WTCP(0x7f802c52, 0x0b4b86a8), WTCP(0x7f411c2f, 0x0dcbd0d5), + WTCP(0x7ef57cea, 0x104abe71), WTCP(0x7e9d55fc, 0x12c8106f), WTCP(0x7e38b017, 0x154387e6), + WTCP(0x7dc79529, 0x17bce621), WTCP(0x7d4a105d, 0x1a33ec9c), WTCP(0x7cc02e15, 0x1ca85d12), + WTCP(0x7c29fbee, 0x1f19f97b), WTCP(0x7b8788ba, 0x2188841a), WTCP(0x7ad8e482, 0x23f3bf7e), + WTCP(0x7a1e2082, 0x265b6e8a), WTCP(0x79574f28, 0x28bf547b), WTCP(0x78848414, 0x2b1f34eb), + WTCP(0x77a5d413, 0x2d7ad3de), WTCP(0x76bb5521, 0x2fd1f5c1), WTCP(0x75c51e61, 0x32245f72), + WTCP(0x74c34820, 0x3471d647), WTCP(0x73b5ebd1, 0x36ba2014), WTCP(0x729d2409, 0x38fd032d), + WTCP(0x71790c7e, 0x3b3a4672), WTCP(0x7049c203, 0x3d71b14d), WTCP(0x6f0f6289, 0x3fa30bc1), + WTCP(0x6dca0d14, 0x41ce1e65), WTCP(0x6c79e1c2, 0x43f2b271), WTCP(0x6b1f01c0, 0x461091c2), + WTCP(0x69b98f48, 0x482786dc), WTCP(0x6849ada3, 0x4a375cf5), WTCP(0x66cf8120, 0x4c3fdff4), + WTCP(0x654b2f10, 0x4e40dc79), WTCP(0x63bcddc7, 0x503a1fe5), WTCP(0x6224b495, 0x522b7859), + WTCP(0x6082dbc1, 0x5414b4c1), WTCP(0x5ed77c8a, 0x55f5a4d2), WTCP(0x5d22c11c, 0x57ce1917), + WTCP(0x5b64d492, 0x599de2ee), +}; + +#ifdef ENABLE_HR_MODE +const PWord32 SineWindow120[60] = { +#else +const PWord16 SineWindow120[60] = { +#endif + WTCP(0x7fff4c54, 0x00d676eb), WTCP(0x7ff9af04, 0x02835b5a), WTCP(0x7fee74a2, 0x0430238f), + WTCP(0x7fdd9dad, 0x05dcbcbe), WTCP(0x7fc72ae2, 0x07891418), WTCP(0x7fab1d3d, 0x093516d4), + WTCP(0x7f8975f9, 0x0ae0b22c), WTCP(0x7f62368f, 0x0c8bd35e), WTCP(0x7f3560b9, 0x0e3667ad), + WTCP(0x7f02f66f, 0x0fe05c64), WTCP(0x7ecaf9e5, 0x11899ed3), WTCP(0x7e8d6d91, 0x13321c53), + WTCP(0x7e4a5426, 0x14d9c245), WTCP(0x7e01b096, 0x16807e15), WTCP(0x7db3860f, 0x18263d36), + WTCP(0x7d5fd801, 0x19caed29), WTCP(0x7d06aa16, 0x1b6e7b7a), WTCP(0x7ca80038, 0x1d10d5c2), + WTCP(0x7c43de8e, 0x1eb1e9a7), WTCP(0x7bda497d, 0x2051a4dd), WTCP(0x7b6b45a5, 0x21eff528), + WTCP(0x7af6d7e6, 0x238cc85d), WTCP(0x7a7d055b, 0x25280c5e), WTCP(0x79fdd35c, 0x26c1af22), + WTCP(0x7979477d, 0x28599eb0), WTCP(0x78ef678f, 0x29efc925), WTCP(0x7860399e, 0x2b841caf), + WTCP(0x77cbc3f2, 0x2d168792), WTCP(0x77320d0d, 0x2ea6f827), WTCP(0x76931bae, 0x30355cdd), + WTCP(0x75eef6ce, 0x31c1a43b), WTCP(0x7545a5a0, 0x334bbcde), WTCP(0x74972f92, 0x34d3957e), + WTCP(0x73e39c49, 0x36591cea), WTCP(0x732af3a7, 0x37dc420c), WTCP(0x726d3dc6, 0x395cf3e9), + WTCP(0x71aa82f7, 0x3adb21a1), WTCP(0x70e2cbc6, 0x3c56ba70), WTCP(0x701620f5, 0x3dcfadb0), + WTCP(0x6f448b7e, 0x3f45ead8), WTCP(0x6e6e1492, 0x40b9617d), WTCP(0x6d92c59b, 0x422a0154), + WTCP(0x6cb2a837, 0x4397ba32), WTCP(0x6bcdc639, 0x45027c0c), WTCP(0x6ae429ae, 0x466a36f9), + WTCP(0x69f5dcd3, 0x47cedb31), WTCP(0x6902ea1d, 0x4930590f), WTCP(0x680b5c33, 0x4a8ea111), + WTCP(0x670f3df3, 0x4be9a3db), WTCP(0x660e9a6a, 0x4d415234), WTCP(0x65097cdb, 0x4e959d08), + WTCP(0x63fff0ba, 0x4fe6756a), WTCP(0x62f201ac, 0x5133cc94), WTCP(0x61dfbb8a, 0x527d93e6), + WTCP(0x60c92a5a, 0x53c3bcea), WTCP(0x5fae5a55, 0x55063951), WTCP(0x5e8f57e2, 0x5644faf4), + WTCP(0x5d6c2f99, 0x577ff3da), WTCP(0x5c44ee40, 0x58b71632), WTCP(0x5b19a0c8, 0x59ea5454), +}; + +#ifdef ENABLE_HR_MODE +const PWord32 SineWindow160[80] = { +#else +const PWord16 SineWindow160[80] = { +#endif + WTCP(0x7fff9aef, 0x00a0d951), WTCP(0x7ffc726f, 0x01e287fc), WTCP(0x7ff62182, 0x03242abf), + WTCP(0x7feca851, 0x0465b9aa), WTCP(0x7fe00716, 0x05a72ccf), WTCP(0x7fd03e23, 0x06e87c3f), + WTCP(0x7fbd4dda, 0x0829a00c), WTCP(0x7fa736b4, 0x096a9049), WTCP(0x7f8df93c, 0x0aab450d), + WTCP(0x7f719611, 0x0bebb66c), WTCP(0x7f520de6, 0x0d2bdc80), WTCP(0x7f2f6183, 0x0e6baf61), + WTCP(0x7f0991c4, 0x0fab272b), WTCP(0x7ee09f95, 0x10ea3bfd), WTCP(0x7eb48bfb, 0x1228e5f8), + WTCP(0x7e85580c, 0x13671d3d), WTCP(0x7e5304f2, 0x14a4d9f4), WTCP(0x7e1d93ea, 0x15e21445), + WTCP(0x7de50646, 0x171ec45c), WTCP(0x7da95d6c, 0x185ae269), WTCP(0x7d6a9ad5, 0x199666a0), + WTCP(0x7d28c00c, 0x1ad14938), WTCP(0x7ce3ceb2, 0x1c0b826a), WTCP(0x7c9bc87a, 0x1d450a78), + WTCP(0x7c50af2b, 0x1e7dd9a4), WTCP(0x7c02849f, 0x1fb5e836), WTCP(0x7bb14ac5, 0x20ed2e7b), + WTCP(0x7b5d039e, 0x2223a4c5), WTCP(0x7b05b13d, 0x2359436c), WTCP(0x7aab55ca, 0x248e02cb), + WTCP(0x7a4df380, 0x25c1db44), WTCP(0x79ed8cad, 0x26f4c53e), WTCP(0x798a23b1, 0x2826b928), + WTCP(0x7923bb01, 0x2957af74), WTCP(0x78ba5524, 0x2a87a09d), WTCP(0x784df4b3, 0x2bb68522), + WTCP(0x77de9c5b, 0x2ce45589), WTCP(0x776c4edb, 0x2e110a62), WTCP(0x76f70f05, 0x2f3c9c40), + WTCP(0x767edfbe, 0x306703bf), WTCP(0x7603c3fd, 0x31903982), WTCP(0x7585becb, 0x32b83634), + WTCP(0x7504d345, 0x33def287), WTCP(0x74810499, 0x35046736), WTCP(0x73fa5607, 0x36288d03), + WTCP(0x7370cae2, 0x374b5cb9), WTCP(0x72e4668f, 0x386ccf2a), WTCP(0x72552c85, 0x398cdd32), + WTCP(0x71c3204c, 0x3aab7fb7), WTCP(0x712e457f, 0x3bc8afa5), WTCP(0x70969fca, 0x3ce465f3), + WTCP(0x6ffc32eb, 0x3dfe9ba1), WTCP(0x6f5f02b2, 0x3f1749b8), WTCP(0x6ebf12ff, 0x402e694c), + WTCP(0x6e1c67c4, 0x4143f379), WTCP(0x6d770506, 0x4257e166), WTCP(0x6cceeed8, 0x436a2c45), + WTCP(0x6c242960, 0x447acd50), WTCP(0x6b76b8d6, 0x4589bdcf), WTCP(0x6ac6a180, 0x4696f710), + WTCP(0x6a13e7b8, 0x47a27271), WTCP(0x695e8fe5, 0x48ac2957), WTCP(0x68a69e81, 0x49b41533), + WTCP(0x67ec1817, 0x4aba2f84), WTCP(0x672f013f, 0x4bbe71d1), WTCP(0x666f5ea6, 0x4cc0d5ae), + WTCP(0x65ad3505, 0x4dc154bb), WTCP(0x64e88926, 0x4ebfe8a5), WTCP(0x64215fe5, 0x4fbc8b22), + WTCP(0x6357be2a, 0x50b735f8), WTCP(0x628ba8ef, 0x51afe2f6), WTCP(0x61bd253f, 0x52a68bfb), + WTCP(0x60ec3830, 0x539b2af0), WTCP(0x6018e6eb, 0x548db9cb), WTCP(0x5f4336a7, 0x557e3292), + WTCP(0x5e6b2ca8, 0x566c8f55), WTCP(0x5d90ce45, 0x5758ca31), WTCP(0x5cb420e0, 0x5842dd54), + WTCP(0x5bd529eb, 0x592ac2f7), WTCP(0x5af3eee6, 0x5a107561), +}; + +#ifdef ENABLE_HR_MODE +const PWord32 SineWindow180[90] = { +#else +const PWord16 SineWindow180[90] = { +#endif + WTCP(0x7fffb025, 0x008efa17), WTCP(0x7ffd3153, 0x01aceb7c), WTCP(0x7ff833bc, 0x02cad485), + WTCP(0x7ff0b779, 0x03e8af9e), WTCP(0x7fe6bcaf, 0x05067734), WTCP(0x7fda4390, 0x062425b6), + WTCP(0x7fcb4c5a, 0x0741b592), WTCP(0x7fb9d758, 0x085f2136), WTCP(0x7fa5e4e0, 0x097c6313), + WTCP(0x7f8f7558, 0x0a997597), WTCP(0x7f76892e, 0x0bb65336), WTCP(0x7f5b20de, 0x0cd2f660), + WTCP(0x7f3d3cf3, 0x0def5989), WTCP(0x7f1cde00, 0x0f0b7727), WTCP(0x7efa04a7, 0x102749ae), + WTCP(0x7ed4b197, 0x1142cb98), WTCP(0x7eace589, 0x125df75b), WTCP(0x7e82a145, 0x1378c774), + WTCP(0x7e55e59d, 0x1493365f), WTCP(0x7e26b370, 0x15ad3e9a), WTCP(0x7df50baa, 0x16c6daa6), + WTCP(0x7dc0ef43, 0x17e00505), WTCP(0x7d8a5f3f, 0x18f8b83c), WTCP(0x7d515cae, 0x1a10eed2), + WTCP(0x7d15e8ac, 0x1b28a351), WTCP(0x7cd80464, 0x1c3fd045), WTCP(0x7c97b108, 0x1d56703b), + WTCP(0x7c54efdb, 0x1e6c7dc7), WTCP(0x7c0fc229, 0x1f81f37b), WTCP(0x7bc8294c, 0x2096cbf0), + WTCP(0x7b7e26a9, 0x21ab01c0), WTCP(0x7b31bbb1, 0x22be8f87), WTCP(0x7ae2e9e3, 0x23d16fe8), + WTCP(0x7a91b2c6, 0x24e39d85), WTCP(0x7a3e17f1, 0x25f51307), WTCP(0x79e81b05, 0x2705cb19), + WTCP(0x798fbdaf, 0x2815c069), WTCP(0x793501a8, 0x2924edab), WTCP(0x78d7e8b5, 0x2a334d95), + WTCP(0x787874a6, 0x2b40dae2), WTCP(0x7816a758, 0x2c4d9050), WTCP(0x77b282b3, 0x2d5968a2), + WTCP(0x774c08aa, 0x2e645ea0), WTCP(0x76e33b3e, 0x2f6e6d15), WTCP(0x76781c79, 0x30778ed2), + WTCP(0x760aae72, 0x317fbeaa), WTCP(0x759af34b, 0x3286f778), WTCP(0x7528ed31, 0x338d341a), + WTCP(0x74b49e5f, 0x34926f74), WTCP(0x743e0917, 0x3596a46c), WTCP(0x73c52faa, 0x3699cdf1), + WTCP(0x734a1474, 0x379be6f6), WTCP(0x72ccb9da, 0x389cea71), WTCP(0x724d224e, 0x399cd362), + WTCP(0x71cb504d, 0x3a9b9cc9), WTCP(0x7147465f, 0x3b9941b0), WTCP(0x70c10717, 0x3c95bd25), + WTCP(0x70389513, 0x3d910a3c), WTCP(0x6fadf2fb, 0x3e8b240e), WTCP(0x6f212384, 0x3f8405bb), + WTCP(0x6e92296d, 0x407baa69), WTCP(0x6e01077f, 0x41720d45), WTCP(0x6d6dc08e, 0x42672980), + WTCP(0x6cd85779, 0x435afa54), WTCP(0x6c40cf2b, 0x444d7aff), WTCP(0x6ba72a97, 0x453ea6c7), + WTCP(0x6b0b6cbc, 0x462e78f8), WTCP(0x6a6d98a3, 0x471cece6), WTCP(0x69cdb161, 0x4809fdeb), + WTCP(0x692bba13, 0x48f5a767), WTCP(0x6887b5e1, 0x49dfe4c2), WTCP(0x67e1a7ff, 0x4ac8b16b), + WTCP(0x673993a8, 0x4bb008d8), WTCP(0x668f7c24, 0x4c95e687), WTCP(0x65e364c3, 0x4d7a45fd), + WTCP(0x653550e1, 0x4e5d22c5), WTCP(0x648543e3, 0x4f3e7874), WTCP(0x63d34136, 0x501e42a5), + WTCP(0x631f4c54, 0x50fc7cfa), WTCP(0x626968be, 0x51d92320), WTCP(0x61b19a00, 0x52b430c8), + WTCP(0x60f7e3b0, 0x538da1ae), WTCP(0x603c496c, 0x54657194), WTCP(0x5f7ecedd, 0x553b9c45), + WTCP(0x5ebf77b4, 0x56101d94), WTCP(0x5dfe47ad, 0x56e2f15d), WTCP(0x5d3b428b, 0x57b41383), + WTCP(0x5c766c1c, 0x58837ff3), WTCP(0x5bafc836, 0x595132a2), WTCP(0x5ae75ab8, 0x5a1d278c), +}; + +#ifdef ENABLE_HR_MODE +const PWord32 SineWindow240[120] = { +#else +const PWord16 SineWindow240[120] = { +#endif + WTCP(0x7fffd315, 0x006b3b9b), WTCP(0x7ffe6bbf, 0x0141b1a5), WTCP(0x7ffb9d15, 0x02182427), + WTCP(0x7ff76721, 0x02ee90c8), WTCP(0x7ff1c9ef, 0x03c4f52f), WTCP(0x7feac58d, 0x049b4f00), + WTCP(0x7fe25a0f, 0x05719be2), WTCP(0x7fd8878e, 0x0647d97c), WTCP(0x7fcd4e24, 0x071e0575), + WTCP(0x7fc0adf2, 0x07f41d72), WTCP(0x7fb2a71b, 0x08ca1f1b), WTCP(0x7fa339c5, 0x09a00817), + WTCP(0x7f92661d, 0x0a75d60e), WTCP(0x7f802c52, 0x0b4b86a8), WTCP(0x7f6c8c96, 0x0c21178c), + WTCP(0x7f578721, 0x0cf68662), WTCP(0x7f411c2f, 0x0dcbd0d5), WTCP(0x7f294bfd, 0x0ea0f48c), + WTCP(0x7f1016ce, 0x0f75ef33), WTCP(0x7ef57cea, 0x104abe71), WTCP(0x7ed97e9c, 0x111f5ff4), + WTCP(0x7ebc1c31, 0x11f3d164), WTCP(0x7e9d55fc, 0x12c8106f), WTCP(0x7e7d2c54, 0x139c1abf), + WTCP(0x7e5b9f93, 0x146fee03), WTCP(0x7e38b017, 0x154387e6), WTCP(0x7e145e42, 0x1616e618), + WTCP(0x7deeaa7a, 0x16ea0646), WTCP(0x7dc79529, 0x17bce621), WTCP(0x7d9f1ebd, 0x188f8357), + WTCP(0x7d7547a7, 0x1961db9b), WTCP(0x7d4a105d, 0x1a33ec9c), WTCP(0x7d1d7958, 0x1b05b40f), + WTCP(0x7cef8315, 0x1bd72fa4), WTCP(0x7cc02e15, 0x1ca85d12), WTCP(0x7c8f7ade, 0x1d793a0b), + WTCP(0x7c5d69f7, 0x1e49c447), WTCP(0x7c29fbee, 0x1f19f97b), WTCP(0x7bf53153, 0x1fe9d75f), + WTCP(0x7bbf0aba, 0x20b95bac), WTCP(0x7b8788ba, 0x2188841a), WTCP(0x7b4eabf1, 0x22574e65), + WTCP(0x7b1474fd, 0x2325b847), WTCP(0x7ad8e482, 0x23f3bf7e), WTCP(0x7a9bfb27, 0x24c161c7), + WTCP(0x7a5db997, 0x258e9ce0), WTCP(0x7a1e2082, 0x265b6e8a), WTCP(0x79dd3098, 0x2727d486), + WTCP(0x799aea92, 0x27f3cc94), WTCP(0x79574f28, 0x28bf547b), WTCP(0x79125f19, 0x298a69fc), + WTCP(0x78cc1b26, 0x2a550adf), WTCP(0x78848414, 0x2b1f34eb), WTCP(0x783b9aad, 0x2be8e5e8), + WTCP(0x77f15fbc, 0x2cb21ba0), WTCP(0x77a5d413, 0x2d7ad3de), WTCP(0x7758f886, 0x2e430c6f), + WTCP(0x770acdec, 0x2f0ac320), WTCP(0x76bb5521, 0x2fd1f5c1), WTCP(0x766a8f04, 0x3098a223), + WTCP(0x76187c77, 0x315ec617), WTCP(0x75c51e61, 0x32245f72), WTCP(0x757075ac, 0x32e96c09), + WTCP(0x751a8346, 0x33ade9b3), WTCP(0x74c34820, 0x3471d647), WTCP(0x746ac52f, 0x35352fa1), + WTCP(0x7410fb6b, 0x35f7f39c), WTCP(0x73b5ebd1, 0x36ba2014), WTCP(0x73599760, 0x377bb2e9), + WTCP(0x72fbff1b, 0x383ca9fb), WTCP(0x729d2409, 0x38fd032d), WTCP(0x723d0734, 0x39bcbc63), + WTCP(0x71dba9ab, 0x3a7bd382), WTCP(0x71790c7e, 0x3b3a4672), WTCP(0x711530c2, 0x3bf8131c), + WTCP(0x70b01790, 0x3cb5376b), WTCP(0x7049c203, 0x3d71b14d), WTCP(0x6fe2313c, 0x3e2d7eb1), + WTCP(0x6f79665b, 0x3ee89d86), WTCP(0x6f0f6289, 0x3fa30bc1), WTCP(0x6ea426ed, 0x405cc754), + WTCP(0x6e37b4b6, 0x4115ce38), WTCP(0x6dca0d14, 0x41ce1e65), WTCP(0x6d5b313b, 0x4285b5d4), + WTCP(0x6ceb2261, 0x433c9283), WTCP(0x6c79e1c2, 0x43f2b271), WTCP(0x6c07709b, 0x44a8139e), + WTCP(0x6b93d02e, 0x455cb40c), WTCP(0x6b1f01c0, 0x461091c2), WTCP(0x6aa90697, 0x46c3aac5), + WTCP(0x6a31e000, 0x4775fd1f), WTCP(0x69b98f48, 0x482786dc), WTCP(0x694015c3, 0x48d84609), + WTCP(0x68c574c4, 0x498838b6), WTCP(0x6849ada3, 0x4a375cf5), WTCP(0x67ccc1be, 0x4ae5b0da), + WTCP(0x674eb271, 0x4b93327c), WTCP(0x66cf8120, 0x4c3fdff4), WTCP(0x664f2f2e, 0x4cebb75c), + WTCP(0x65cdbe05, 0x4d96b6d3), WTCP(0x654b2f10, 0x4e40dc79), WTCP(0x64c783bd, 0x4eea2670), + WTCP(0x6442bd7e, 0x4f9292dc), WTCP(0x63bcddc7, 0x503a1fe5), WTCP(0x6335e611, 0x50e0cbb4), + WTCP(0x62add7d6, 0x51869476), WTCP(0x6224b495, 0x522b7859), WTCP(0x619a7dce, 0x52cf758f), + WTCP(0x610f3505, 0x53728a4a), WTCP(0x6082dbc1, 0x5414b4c1), WTCP(0x5ff5738d, 0x54b5f32c), + WTCP(0x5f66fdf5, 0x555643c8), WTCP(0x5ed77c8a, 0x55f5a4d2), WTCP(0x5e46f0dd, 0x5694148b), + WTCP(0x5db55c86, 0x57319135), WTCP(0x5d22c11c, 0x57ce1917), WTCP(0x5c8f203b, 0x5869aa79), + WTCP(0x5bfa7b82, 0x590443a7), WTCP(0x5b64d492, 0x599de2ee), WTCP(0x5ace2d0f, 0x5a36869f), +}; + +#ifdef ENABLE_HR_MODE +const PWord32 SineWindow320[160] = { +#else +const PWord16 SineWindow320[160] = { +#endif + WTCP(0x7fffe6bc, 0x00506cb9), WTCP(0x7fff1c9b, 0x00f145ab), WTCP(0x7ffd885a, 0x01921d20), + WTCP(0x7ffb29fd, 0x0232f21a), WTCP(0x7ff80186, 0x02d3c39b), WTCP(0x7ff40efa, 0x037490a5), + WTCP(0x7fef5260, 0x0415583b), WTCP(0x7fe9cbc0, 0x04b6195d), WTCP(0x7fe37b22, 0x0556d30f), + WTCP(0x7fdc608f, 0x05f78453), WTCP(0x7fd47c14, 0x06982c2b), WTCP(0x7fcbcdbc, 0x0738c998), + WTCP(0x7fc25596, 0x07d95b9e), WTCP(0x7fb813b0, 0x0879e140), WTCP(0x7fad081b, 0x091a597e), + WTCP(0x7fa132e8, 0x09bac35d), WTCP(0x7f949429, 0x0a5b1dde), WTCP(0x7f872bf3, 0x0afb6805), + WTCP(0x7f78fa5b, 0x0b9ba0d5), WTCP(0x7f69ff76, 0x0c3bc74f), WTCP(0x7f5a3b5e, 0x0cdbda79), + WTCP(0x7f49ae2a, 0x0d7bd954), WTCP(0x7f3857f6, 0x0e1bc2e4), WTCP(0x7f2638db, 0x0ebb962c), + WTCP(0x7f1350f8, 0x0f5b5231), WTCP(0x7effa069, 0x0ffaf5f6), WTCP(0x7eeb274d, 0x109a807e), + WTCP(0x7ed5e5c6, 0x1139f0cf), WTCP(0x7ebfdbf5, 0x11d945eb), WTCP(0x7ea909fc, 0x12787ed8), + WTCP(0x7e917000, 0x13179a9b), WTCP(0x7e790e25, 0x13b69836), WTCP(0x7e5fe493, 0x145576b1), + WTCP(0x7e45f371, 0x14f43510), WTCP(0x7e2b3ae8, 0x1592d257), WTCP(0x7e0fbb22, 0x16314d8e), + WTCP(0x7df3744b, 0x16cfa5b9), WTCP(0x7dd6668f, 0x176dd9de), WTCP(0x7db8921c, 0x180be904), + WTCP(0x7d99f721, 0x18a9d231), WTCP(0x7d7a95cf, 0x1947946c), WTCP(0x7d5a6e57, 0x19e52ebb), + WTCP(0x7d3980ec, 0x1a82a026), WTCP(0x7d17cdc2, 0x1b1fe7b3), WTCP(0x7cf5550e, 0x1bbd046c), + WTCP(0x7cd21707, 0x1c59f557), WTCP(0x7cae13e4, 0x1cf6b97c), WTCP(0x7c894bde, 0x1d934fe5), + WTCP(0x7c63bf2f, 0x1e2fb79a), WTCP(0x7c3d6e13, 0x1ecbefa4), WTCP(0x7c1658c5, 0x1f67f70b), + WTCP(0x7bee7f85, 0x2003ccdb), WTCP(0x7bc5e290, 0x209f701c), WTCP(0x7b9c8226, 0x213adfda), + WTCP(0x7b725e8a, 0x21d61b1e), WTCP(0x7b4777fe, 0x227120f3), WTCP(0x7b1bcec4, 0x230bf065), + WTCP(0x7aef6323, 0x23a6887f), WTCP(0x7ac23561, 0x2440e84d), WTCP(0x7a9445c5, 0x24db0edb), + WTCP(0x7a659496, 0x2574fb36), WTCP(0x7a362220, 0x260eac6a), WTCP(0x7a05eead, 0x26a82186), + WTCP(0x79d4fa89, 0x27415996), WTCP(0x79a34602, 0x27da53a9), WTCP(0x7970d165, 0x28730ecd), + WTCP(0x793d9d03, 0x290b8a12), WTCP(0x7909a92d, 0x29a3c485), WTCP(0x78d4f634, 0x2a3bbd37), + WTCP(0x789f846b, 0x2ad37338), WTCP(0x78695428, 0x2b6ae598), WTCP(0x783265c0, 0x2c021369), + WTCP(0x77fab989, 0x2c98fbba), WTCP(0x77c24fdb, 0x2d2f9d9f), WTCP(0x77892910, 0x2dc5f829), + WTCP(0x774f4581, 0x2e5c0a6b), WTCP(0x7714a58b, 0x2ef1d377), WTCP(0x76d94989, 0x2f875262), + WTCP(0x769d31d9, 0x301c863f), WTCP(0x76605edb, 0x30b16e23), WTCP(0x7622d0ef, 0x31460922), + WTCP(0x75e48874, 0x31da5651), WTCP(0x75a585cf, 0x326e54c7), WTCP(0x7565c962, 0x3302039b), + WTCP(0x75255392, 0x339561e1), WTCP(0x74e424c5, 0x34286eb3), WTCP(0x74a23d62, 0x34bb2927), + WTCP(0x745f9dd1, 0x354d9057), WTCP(0x741c467b, 0x35dfa35a), WTCP(0x73d837ca, 0x3671614b), + WTCP(0x7393722a, 0x3702c942), WTCP(0x734df607, 0x3793da5b), WTCP(0x7307c3d0, 0x382493b0), + WTCP(0x72c0dbf3, 0x38b4f45d), WTCP(0x72793edf, 0x3944fb7e), WTCP(0x7230ed07, 0x39d4a82f), + WTCP(0x71e7e6dc, 0x3a63f98d), WTCP(0x719e2cd2, 0x3af2eeb7), WTCP(0x7153bf5d, 0x3b8186ca), + WTCP(0x71089ef2, 0x3c0fc0e6), WTCP(0x70bccc09, 0x3c9d9c28), WTCP(0x70704718, 0x3d2b17b3), + WTCP(0x7023109a, 0x3db832a6), WTCP(0x6fd52907, 0x3e44ec22), WTCP(0x6f8690db, 0x3ed14349), + WTCP(0x6f374891, 0x3f5d373e), WTCP(0x6ee750a8, 0x3fe8c724), WTCP(0x6e96a99d, 0x4073f21d), + WTCP(0x6e4553ef, 0x40feb74f), WTCP(0x6df35020, 0x418915de), WTCP(0x6da09eb1, 0x42130cf0), + WTCP(0x6d4d4023, 0x429c9bab), WTCP(0x6cf934fc, 0x4325c135), WTCP(0x6ca47dbf, 0x43ae7cb7), + WTCP(0x6c4f1af2, 0x4436cd58), WTCP(0x6bf90d1d, 0x44beb240), WTCP(0x6ba254c7, 0x45462a9a), + WTCP(0x6b4af279, 0x45cd358f), WTCP(0x6af2e6bc, 0x4653d24b), WTCP(0x6a9a321d, 0x46d9fff8), + WTCP(0x6a40d527, 0x475fbdc3), WTCP(0x69e6d067, 0x47e50ad8), WTCP(0x698c246c, 0x4869e665), + WTCP(0x6930d1c4, 0x48ee4f98), WTCP(0x68d4d900, 0x497245a1), WTCP(0x68783ab1, 0x49f5c7ae), + WTCP(0x681af76a, 0x4a78d4f0), WTCP(0x67bd0fbd, 0x4afb6c98), WTCP(0x675e843e, 0x4b7d8dd8), + WTCP(0x66ff5584, 0x4bff37e2), WTCP(0x669f8425, 0x4c8069ea), WTCP(0x663f10b7, 0x4d012324), + WTCP(0x65ddfbd3, 0x4d8162c4), WTCP(0x657c4613, 0x4e012800), WTCP(0x6519f010, 0x4e80720e), + WTCP(0x64b6fa66, 0x4eff4025), WTCP(0x645365b2, 0x4f7d917c), WTCP(0x63ef3290, 0x4ffb654d), + WTCP(0x638a619e, 0x5078bad1), WTCP(0x6324f37d, 0x50f59141), WTCP(0x62bee8cc, 0x5171e7d9), + WTCP(0x6258422c, 0x51edbdd4), WTCP(0x61f1003f, 0x5269126e), WTCP(0x618923a9, 0x52e3e4e6), + WTCP(0x6120ad0d, 0x535e3479), WTCP(0x60b79d10, 0x53d80065), WTCP(0x604df459, 0x545147eb), + WTCP(0x5fe3b38d, 0x54ca0a4b), WTCP(0x5f78db56, 0x554246c6), WTCP(0x5f0d6c5b, 0x55b9fc9e), + WTCP(0x5ea16747, 0x56312b17), WTCP(0x5e34ccc3, 0x56a7d174), WTCP(0x5dc79d7c, 0x571deefa), + WTCP(0x5d59da1e, 0x579382ee), WTCP(0x5ceb8355, 0x58088c96), WTCP(0x5c7c99d1, 0x587d0b3b), + WTCP(0x5c0d1e41, 0x58f0fe23), WTCP(0x5b9d1154, 0x59646498), WTCP(0x5b2c73bb, 0x59d73de3), + WTCP(0x5abb4629, 0x5a498950), +}; + +#ifdef ENABLE_HR_MODE +const PWord32 SineWindow360[180] = { +#else +const PWord16 SineWindow360[180] = { +#endif + WTCP(0x7fffec08, 0x00477d17), WTCP(0x7fff4c53, 0x00d676eb), WTCP(0x7ffe0cea, 0x01656fb4), + WTCP(0x7ffc2dcf, 0x01f466bf), WTCP(0x7ff9af03, 0x02835b59), WTCP(0x7ff6908a, 0x03124cd1), + WTCP(0x7ff2d268, 0x03a13a74), WTCP(0x7fee74a1, 0x0430238f), WTCP(0x7fe9773c, 0x04bf0771), + WTCP(0x7fe3da3d, 0x054de566), WTCP(0x7fdd9dac, 0x05dcbcbe), WTCP(0x7fd6c192, 0x066b8cc5), + WTCP(0x7fcf45f6, 0x06fa54c9), WTCP(0x7fc72ae1, 0x07891418), WTCP(0x7fbe705f, 0x0817ca01), + WTCP(0x7fb51679, 0x08a675d0), WTCP(0x7fab1d3c, 0x093516d4), WTCP(0x7fa084b4, 0x09c3ac5c), + WTCP(0x7f954cee, 0x0a5235b4), WTCP(0x7f8975f8, 0x0ae0b22c), WTCP(0x7f7cffe1, 0x0b6f2112), + WTCP(0x7f6feab8, 0x0bfd81b3), WTCP(0x7f62368e, 0x0c8bd35e), WTCP(0x7f53e374, 0x0d1a1562), + WTCP(0x7f44f17c, 0x0da8470d), WTCP(0x7f3560b8, 0x0e3667ad), WTCP(0x7f25313c, 0x0ec47692), + WTCP(0x7f14631c, 0x0f52730a), WTCP(0x7f02f66e, 0x0fe05c64), WTCP(0x7ef0eb45, 0x106e31ef), + WTCP(0x7ede41ba, 0x10fbf2fa), WTCP(0x7ecaf9e4, 0x11899ed3), WTCP(0x7eb713da, 0x121734cb), + WTCP(0x7ea28fb5, 0x12a4b431), WTCP(0x7e8d6d90, 0x13321c53), WTCP(0x7e77ad84, 0x13bf6c82), + WTCP(0x7e614fac, 0x144ca40e), WTCP(0x7e4a5425, 0x14d9c245), WTCP(0x7e32bb0b, 0x1566c679), + WTCP(0x7e1a847b, 0x15f3aff8), WTCP(0x7e01b095, 0x16807e14), WTCP(0x7de83f76, 0x170d301d), + WTCP(0x7dce313e, 0x1799c562), WTCP(0x7db3860e, 0x18263d35), WTCP(0x7d983e08, 0x18b296e7), + WTCP(0x7d7c594d, 0x193ed1c8), WTCP(0x7d5fd800, 0x19caed28), WTCP(0x7d42ba45, 0x1a56e85b), + WTCP(0x7d25003f, 0x1ae2c2b0), WTCP(0x7d06aa15, 0x1b6e7b7a), WTCP(0x7ce7b7ec, 0x1bfa1209), + WTCP(0x7cc829ea, 0x1c8585b0), WTCP(0x7ca80037, 0x1d10d5c1), WTCP(0x7c873afb, 0x1d9c018f), + WTCP(0x7c65da60, 0x1e27086a), WTCP(0x7c43de8d, 0x1eb1e9a6), WTCP(0x7c2147af, 0x1f3ca496), + WTCP(0x7bfe15f0, 0x1fc7388d), WTCP(0x7bda497c, 0x2051a4dd), WTCP(0x7bb5e27f, 0x20dbe8da), + WTCP(0x7b90e128, 0x216603d7), WTCP(0x7b6b45a4, 0x21eff528), WTCP(0x7b451022, 0x2279bc21), + WTCP(0x7b1e40d3, 0x23035817), WTCP(0x7af6d7e5, 0x238cc85c), WTCP(0x7aced58b, 0x24160c47), + WTCP(0x7aa639f7, 0x249f232b), WTCP(0x7a7d055a, 0x25280c5d), WTCP(0x7a5337e9, 0x25b0c734), + WTCP(0x7a28d1d8, 0x26395303), WTCP(0x79fdd35b, 0x26c1af21), WTCP(0x79d23ca9, 0x2749dae4), + WTCP(0x79a60df7, 0x27d1d5a2), WTCP(0x7979477c, 0x28599eb0), WTCP(0x794be972, 0x28e13566), + WTCP(0x791df40f, 0x2968991b), WTCP(0x78ef678e, 0x29efc925), WTCP(0x78c04429, 0x2a76c4dc), + WTCP(0x78908a1a, 0x2afd8b97), WTCP(0x7860399d, 0x2b841caf), WTCP(0x782f52ef, 0x2c0a777b), + WTCP(0x77fdd64b, 0x2c909b54), WTCP(0x77cbc3f1, 0x2d168792), WTCP(0x77991c1e, 0x2d9c3b8e), + WTCP(0x7765df12, 0x2e21b6a2), WTCP(0x77320d0c, 0x2ea6f826), WTCP(0x76fda64e, 0x2f2bff76), + WTCP(0x76c8ab18, 0x2fb0cbea), WTCP(0x76931bae, 0x30355cdc), WTCP(0x765cf850, 0x30b9b1a9), + WTCP(0x76264144, 0x313dc9aa), WTCP(0x75eef6ce, 0x31c1a43a), WTCP(0x75b71931, 0x324540b6), + WTCP(0x757ea8b5, 0x32c89e78), WTCP(0x7545a59f, 0x334bbcde), WTCP(0x750c1038, 0x33ce9b42), + WTCP(0x74d1e8c5, 0x34513903), WTCP(0x74972f91, 0x34d3957e), WTCP(0x745be4e4, 0x3555b00e), + WTCP(0x74200908, 0x35d78813), WTCP(0x73e39c48, 0x36591cea), WTCP(0x73a69ef0, 0x36da6df1), + WTCP(0x7369114b, 0x375b7a87), WTCP(0x732af3a6, 0x37dc420c), WTCP(0x72ec4650, 0x385cc3de), + WTCP(0x72ad0995, 0x38dcff5d), WTCP(0x726d3dc5, 0x395cf3e9), WTCP(0x722ce330, 0x39dca0e2), + WTCP(0x71ebfa25, 0x3a5c05aa), WTCP(0x71aa82f6, 0x3adb21a0), WTCP(0x71687df5, 0x3b59f428), + WTCP(0x7125eb74, 0x3bd87ca1), WTCP(0x70e2cbc5, 0x3c56ba70), WTCP(0x709f1f3d, 0x3cd4acf5), + WTCP(0x705ae630, 0x3d525394), WTCP(0x701620f4, 0x3dcfadaf), WTCP(0x6fd0cfdd, 0x3e4cbaac), + WTCP(0x6f8af343, 0x3ec979ed), WTCP(0x6f448b7d, 0x3f45ead7), WTCP(0x6efd98e2, 0x3fc20ccf), + WTCP(0x6eb61bcb, 0x403ddf39), WTCP(0x6e6e1492, 0x40b9617c), WTCP(0x6e25838f, 0x413492fd), + WTCP(0x6ddc691e, 0x41af7323), WTCP(0x6d92c59a, 0x422a0154), WTCP(0x6d48995f, 0x42a43cf7), + WTCP(0x6cfde4c9, 0x431e2573), WTCP(0x6cb2a836, 0x4397ba32), WTCP(0x6c66e403, 0x4410fa9a), + WTCP(0x6c1a988f, 0x4489e615), WTCP(0x6bcdc639, 0x45027c0c), WTCP(0x6b806d61, 0x457abbe8), + WTCP(0x6b328e67, 0x45f2a513), WTCP(0x6ae429ad, 0x466a36f9), WTCP(0x6a953f94, 0x46e17102), + WTCP(0x6a45d080, 0x4758529c), WTCP(0x69f5dcd2, 0x47cedb30), WTCP(0x69a564ef, 0x48450a2d), + WTCP(0x6954693b, 0x48badefd), WTCP(0x6902ea1c, 0x4930590e), WTCP(0x68b0e7f6, 0x49a577ce), + WTCP(0x685e6331, 0x4a1a3aaa), WTCP(0x680b5c33, 0x4a8ea111), WTCP(0x67b7d363, 0x4b02aa71), + WTCP(0x6763c92b, 0x4b76563a), WTCP(0x670f3df2, 0x4be9a3db), WTCP(0x66ba3223, 0x4c5c92c4), + WTCP(0x6664a627, 0x4ccf2267), WTCP(0x660e9a69, 0x4d415233), WTCP(0x65b80f55, 0x4db3219c), + WTCP(0x65610557, 0x4e249011), WTCP(0x65097cda, 0x4e959d07), WTCP(0x64b1764d, 0x4f0647f0), + WTCP(0x6458f21d, 0x4f769040), WTCP(0x63fff0b9, 0x4fe6756a), WTCP(0x63a6728f, 0x5055f6e2), + WTCP(0x634c7810, 0x50c5141e), WTCP(0x62f201ac, 0x5133cc94), WTCP(0x62970fd2, 0x51a21fb7), + WTCP(0x623ba2f6, 0x52100d01), WTCP(0x61dfbb89, 0x527d93e6), WTCP(0x618359fd, 0x52eab3de), + WTCP(0x61267ec7, 0x53576c62), WTCP(0x60c92a59, 0x53c3bce9), WTCP(0x606b5d28, 0x542fa4ed), + WTCP(0x600d17aa, 0x549b23e7), WTCP(0x5fae5a54, 0x55063950), WTCP(0x5f4f259c, 0x5570e4a3), + WTCP(0x5eef79f8, 0x55db255b), WTCP(0x5e8f57e2, 0x5644faf4), WTCP(0x5e2ebfcf, 0x56ae64e9), + WTCP(0x5dcdb239, 0x571762b6), WTCP(0x5d6c2f99, 0x577ff3da), WTCP(0x5d0a3868, 0x57e817d1), + WTCP(0x5ca7cd21, 0x584fce19), WTCP(0x5c44ee3f, 0x58b71631), WTCP(0x5be19c3c, 0x591def98), + WTCP(0x5b7dd796, 0x598459ce), WTCP(0x5b19a0c7, 0x59ea5454), WTCP(0x5ab4f84f, 0x5a4fdea9), +}; + +#ifdef ENABLE_HR_MODE +const PWord32 SineWindow480[240] = { +#else +const PWord16 SineWindow480[240] = { +#endif + WTCP(0x7ffff4c5, 0x00359dd2), WTCP(0x7fff9aef, 0x00a0d951), WTCP(0x7ffee744, 0x010c1460), + WTCP(0x7ffdd9c4, 0x01774eb2), WTCP(0x7ffc726f, 0x01e287fc), WTCP(0x7ffab147, 0x024dbff4), + WTCP(0x7ff8964d, 0x02b8f64e), WTCP(0x7ff62182, 0x03242abf), WTCP(0x7ff352e8, 0x038f5cfb), + WTCP(0x7ff02a82, 0x03fa8cb8), WTCP(0x7feca851, 0x0465b9aa), WTCP(0x7fe8cc57, 0x04d0e386), + WTCP(0x7fe49698, 0x053c0a01), WTCP(0x7fe00716, 0x05a72ccf), WTCP(0x7fdb1dd5, 0x06124ba5), + WTCP(0x7fd5dad8, 0x067d6639), WTCP(0x7fd03e23, 0x06e87c3f), WTCP(0x7fca47b9, 0x07538d6b), + WTCP(0x7fc3f7a0, 0x07be9973), WTCP(0x7fbd4dda, 0x0829a00c), WTCP(0x7fb64a6e, 0x0894a0ea), + WTCP(0x7faeed5f, 0x08ff9bc2), WTCP(0x7fa736b4, 0x096a9049), WTCP(0x7f9f2671, 0x09d57e35), + WTCP(0x7f96bc9c, 0x0a40653a), WTCP(0x7f8df93c, 0x0aab450d), WTCP(0x7f84dc55, 0x0b161d63), + WTCP(0x7f7b65ef, 0x0b80edf1), WTCP(0x7f719611, 0x0bebb66c), WTCP(0x7f676cc0, 0x0c56768a), + WTCP(0x7f5cea05, 0x0cc12dff), WTCP(0x7f520de6, 0x0d2bdc80), WTCP(0x7f46d86c, 0x0d9681c2), + WTCP(0x7f3b499d, 0x0e011d7c), WTCP(0x7f2f6183, 0x0e6baf61), WTCP(0x7f232026, 0x0ed63727), + WTCP(0x7f16858e, 0x0f40b483), WTCP(0x7f0991c4, 0x0fab272b), WTCP(0x7efc44d0, 0x10158ed4), + WTCP(0x7eee9ebe, 0x107feb33), WTCP(0x7ee09f95, 0x10ea3bfd), WTCP(0x7ed24761, 0x115480e9), + WTCP(0x7ec3962a, 0x11beb9aa), WTCP(0x7eb48bfb, 0x1228e5f8), WTCP(0x7ea528e0, 0x12930586), + WTCP(0x7e956ce1, 0x12fd180b), WTCP(0x7e85580c, 0x13671d3d), WTCP(0x7e74ea6a, 0x13d114d0), + WTCP(0x7e642408, 0x143afe7b), WTCP(0x7e5304f2, 0x14a4d9f4), WTCP(0x7e418d32, 0x150ea6ef), + WTCP(0x7e2fbcd6, 0x15786522), WTCP(0x7e1d93ea, 0x15e21445), WTCP(0x7e0b127a, 0x164bb40b), + WTCP(0x7df83895, 0x16b5442b), WTCP(0x7de50646, 0x171ec45c), WTCP(0x7dd17b9c, 0x17883452), + WTCP(0x7dbd98a4, 0x17f193c5), WTCP(0x7da95d6c, 0x185ae269), WTCP(0x7d94ca03, 0x18c41ff6), + WTCP(0x7d7fde76, 0x192d4c21), WTCP(0x7d6a9ad5, 0x199666a0), WTCP(0x7d54ff2e, 0x19ff6f2a), + WTCP(0x7d3f0b90, 0x1a686575), WTCP(0x7d28c00c, 0x1ad14938), WTCP(0x7d121cb0, 0x1b3a1a28), + WTCP(0x7cfb218c, 0x1ba2d7fc), WTCP(0x7ce3ceb2, 0x1c0b826a), WTCP(0x7ccc2430, 0x1c74192a), + WTCP(0x7cb42217, 0x1cdc9bf2), WTCP(0x7c9bc87a, 0x1d450a78), WTCP(0x7c831767, 0x1dad6473), + WTCP(0x7c6a0ef2, 0x1e15a99a), WTCP(0x7c50af2b, 0x1e7dd9a4), WTCP(0x7c36f824, 0x1ee5f447), + WTCP(0x7c1ce9ef, 0x1f4df93a), WTCP(0x7c02849f, 0x1fb5e836), WTCP(0x7be7c847, 0x201dc0ef), + WTCP(0x7bccb4f8, 0x2085831f), WTCP(0x7bb14ac5, 0x20ed2e7b), WTCP(0x7b9589c3, 0x2154c2bb), + WTCP(0x7b797205, 0x21bc3f97), WTCP(0x7b5d039e, 0x2223a4c5), WTCP(0x7b403ea2, 0x228af1fe), + WTCP(0x7b232325, 0x22f226f8), WTCP(0x7b05b13d, 0x2359436c), WTCP(0x7ae7e8fc, 0x23c04710), + WTCP(0x7ac9ca7a, 0x2427319d), WTCP(0x7aab55ca, 0x248e02cb), WTCP(0x7a8c8b01, 0x24f4ba50), + WTCP(0x7a6d6a37, 0x255b57e6), WTCP(0x7a4df380, 0x25c1db44), WTCP(0x7a2e26f2, 0x26284422), + WTCP(0x7a0e04a4, 0x268e9238), WTCP(0x79ed8cad, 0x26f4c53e), WTCP(0x79ccbf22, 0x275adcee), + WTCP(0x79ab9c1c, 0x27c0d8fe), WTCP(0x798a23b1, 0x2826b928), WTCP(0x796855f9, 0x288c7d24), + WTCP(0x7946330c, 0x28f224ab), WTCP(0x7923bb01, 0x2957af74), WTCP(0x7900edf2, 0x29bd1d3a), + WTCP(0x78ddcbf5, 0x2a226db5), WTCP(0x78ba5524, 0x2a87a09d), WTCP(0x78968998, 0x2aecb5ac), + WTCP(0x7872696a, 0x2b51ac9a), WTCP(0x784df4b3, 0x2bb68522), WTCP(0x78292b8d, 0x2c1b3efb), + WTCP(0x78040e12, 0x2c7fd9e0), WTCP(0x77de9c5b, 0x2ce45589), WTCP(0x77b8d683, 0x2d48b1b1), + WTCP(0x7792bca5, 0x2dacee11), WTCP(0x776c4edb, 0x2e110a62), WTCP(0x77458d40, 0x2e75065e), + WTCP(0x771e77f0, 0x2ed8e1c0), WTCP(0x76f70f05, 0x2f3c9c40), WTCP(0x76cf529c, 0x2fa03599), + WTCP(0x76a742d1, 0x3003ad85), WTCP(0x767edfbe, 0x306703bf), WTCP(0x76562982, 0x30ca3800), + WTCP(0x762d2038, 0x312d4a03), WTCP(0x7603c3fd, 0x31903982), WTCP(0x75da14ef, 0x31f30638), + WTCP(0x75b01329, 0x3255afe0), WTCP(0x7585becb, 0x32b83634), WTCP(0x755b17f2, 0x331a98ef), + WTCP(0x75301ebb, 0x337cd7cd), WTCP(0x7504d345, 0x33def287), WTCP(0x74d935ae, 0x3440e8da), + WTCP(0x74ad4615, 0x34a2ba81), WTCP(0x74810499, 0x35046736), WTCP(0x74547158, 0x3565eeb6), + WTCP(0x74278c72, 0x35c750bc), WTCP(0x73fa5607, 0x36288d03), WTCP(0x73ccce36, 0x3689a348), + WTCP(0x739ef51f, 0x36ea9346), WTCP(0x7370cae2, 0x374b5cb9), WTCP(0x73424fa0, 0x37abff5d), + WTCP(0x73138379, 0x380c7aee), WTCP(0x72e4668f, 0x386ccf2a), WTCP(0x72b4f902, 0x38ccfbcb), + WTCP(0x72853af3, 0x392d008f), WTCP(0x72552c85, 0x398cdd32), WTCP(0x7224cdd8, 0x39ec9172), + WTCP(0x71f41f0f, 0x3a4c1d09), WTCP(0x71c3204c, 0x3aab7fb7), WTCP(0x7191d1b1, 0x3b0ab937), + WTCP(0x71603361, 0x3b69c947), WTCP(0x712e457f, 0x3bc8afa5), WTCP(0x70fc082d, 0x3c276c0d), + WTCP(0x70c97b90, 0x3c85fe3d), WTCP(0x70969fca, 0x3ce465f3), WTCP(0x706374ff, 0x3d42a2ec), + WTCP(0x702ffb54, 0x3da0b4e7), WTCP(0x6ffc32eb, 0x3dfe9ba1), WTCP(0x6fc81bea, 0x3e5c56d8), + WTCP(0x6f93b676, 0x3eb9e64b), WTCP(0x6f5f02b2, 0x3f1749b8), WTCP(0x6f2a00c4, 0x3f7480dd), + WTCP(0x6ef4b0d1, 0x3fd18b7a), WTCP(0x6ebf12ff, 0x402e694c), WTCP(0x6e892772, 0x408b1a12), + WTCP(0x6e52ee52, 0x40e79d8c), WTCP(0x6e1c67c4, 0x4143f379), WTCP(0x6de593ee, 0x41a01b97), + WTCP(0x6dae72f7, 0x41fc15a6), WTCP(0x6d770506, 0x4257e166), WTCP(0x6d3f4a40, 0x42b37e96), + WTCP(0x6d0742cf, 0x430eecf6), WTCP(0x6cceeed8, 0x436a2c45), WTCP(0x6c964e83, 0x43c53c44), + WTCP(0x6c5d61f9, 0x44201cb2), WTCP(0x6c242960, 0x447acd50), WTCP(0x6beaa4e2, 0x44d54ddf), + WTCP(0x6bb0d4a7, 0x452f9e1e), WTCP(0x6b76b8d6, 0x4589bdcf), WTCP(0x6b3c519a, 0x45e3acb1), + WTCP(0x6b019f1a, 0x463d6a87), WTCP(0x6ac6a180, 0x4696f710), WTCP(0x6a8b58f6, 0x46f0520f), + WTCP(0x6a4fc5a6, 0x47497b44), WTCP(0x6a13e7b8, 0x47a27271), WTCP(0x69d7bf57, 0x47fb3757), + WTCP(0x699b4cad, 0x4853c9b9), WTCP(0x695e8fe5, 0x48ac2957), WTCP(0x69218929, 0x490455f4), + WTCP(0x68e438a4, 0x495c4f52), WTCP(0x68a69e81, 0x49b41533), WTCP(0x6868baec, 0x4a0ba75b), + WTCP(0x682a8e0f, 0x4a63058a), WTCP(0x67ec1817, 0x4aba2f84), WTCP(0x67ad592f, 0x4b11250c), + WTCP(0x676e5183, 0x4b67e5e4), WTCP(0x672f013f, 0x4bbe71d1), WTCP(0x66ef6891, 0x4c14c894), + WTCP(0x66af87a4, 0x4c6ae9f2), WTCP(0x666f5ea6, 0x4cc0d5ae), WTCP(0x662eedc3, 0x4d168b8b), + WTCP(0x65ee3529, 0x4d6c0b4e), WTCP(0x65ad3505, 0x4dc154bb), WTCP(0x656bed84, 0x4e166795), + WTCP(0x652a5ed6, 0x4e6b43a2), WTCP(0x64e88926, 0x4ebfe8a5), WTCP(0x64a66ca5, 0x4f145662), + WTCP(0x6464097f, 0x4f688ca0), WTCP(0x64215fe5, 0x4fbc8b22), WTCP(0x63de7003, 0x501051ae), + WTCP(0x639b3a0b, 0x5063e008), WTCP(0x6357be2a, 0x50b735f8), WTCP(0x6313fc90, 0x510a5340), + WTCP(0x62cff56c, 0x515d37a9), WTCP(0x628ba8ef, 0x51afe2f6), WTCP(0x62471749, 0x520254ef), + WTCP(0x620240a8, 0x52548d59), WTCP(0x61bd253f, 0x52a68bfb), WTCP(0x6177c53c, 0x52f8509b), + WTCP(0x613220d2, 0x5349daff), WTCP(0x60ec3830, 0x539b2af0), WTCP(0x60a60b88, 0x53ec4032), + WTCP(0x605f9b0b, 0x543d1a8e), WTCP(0x6018e6eb, 0x548db9cb), WTCP(0x5fd1ef59, 0x54de1db1), + WTCP(0x5f8ab487, 0x552e4605), WTCP(0x5f4336a7, 0x557e3292), WTCP(0x5efb75ea, 0x55cde31e), + WTCP(0x5eb37285, 0x561d5771), WTCP(0x5e6b2ca8, 0x566c8f55), WTCP(0x5e22a487, 0x56bb8a90), + WTCP(0x5dd9da55, 0x570a48ec), WTCP(0x5d90ce45, 0x5758ca31), WTCP(0x5d47808a, 0x57a70e29), + WTCP(0x5cfdf157, 0x57f5149d), WTCP(0x5cb420e0, 0x5842dd54), WTCP(0x5c6a0f59, 0x5890681a), + WTCP(0x5c1fbcf6, 0x58ddb4b8), WTCP(0x5bd529eb, 0x592ac2f7), WTCP(0x5b8a566c, 0x597792a1), + WTCP(0x5b3f42ae, 0x59c42381), WTCP(0x5af3eee6, 0x5a107561), WTCP(0x5aa85b48, 0x5a5c880a), +}; + +#ifdef ENABLE_HR_MODE +const PWord32 SineWindow720[360] = { + WTCP(0x7ffffb01, 0x0023be8d), WTCP(0x7fffd314, 0x006b3b9b), WTCP(0x7fff833a, 0x00b2b888), + WTCP(0x7fff0b72, 0x00fa353e), WTCP(0x7ffe6bbe, 0x0141b1a5), WTCP(0x7ffda41c, 0x01892da8), + WTCP(0x7ffcb48e, 0x01d0a930), WTCP(0x7ffb9d14, 0x02182427), WTCP(0x7ffa5dae, 0x025f9e77), + WTCP(0x7ff8f65d, 0x02a7180a), WTCP(0x7ff76720, 0x02ee90c8), WTCP(0x7ff5aff9, 0x0336089d), + WTCP(0x7ff3d0e8, 0x037d7f71), WTCP(0x7ff1c9ee, 0x03c4f52e), WTCP(0x7fef9b0a, 0x040c69bf), + WTCP(0x7fed443f, 0x0453dd0c), WTCP(0x7feac58c, 0x049b4f00), WTCP(0x7fe81ef2, 0x04e2bf83), + WTCP(0x7fe55073, 0x052a2e81), WTCP(0x7fe25a0e, 0x05719be2), WTCP(0x7fdf3bc6, 0x05b90791), + WTCP(0x7fdbf59a, 0x06007176), WTCP(0x7fd8878d, 0x0647d97c), WTCP(0x7fd4f19f, 0x068f3f8d), + WTCP(0x7fd133d0, 0x06d6a392), WTCP(0x7fcd4e23, 0x071e0575), WTCP(0x7fc94099, 0x0765651f), + WTCP(0x7fc50b33, 0x07acc27b), WTCP(0x7fc0adf1, 0x07f41d72), WTCP(0x7fbc28d6, 0x083b75ee), + WTCP(0x7fb77be3, 0x0882cbd8), WTCP(0x7fb2a71a, 0x08ca1f1b), WTCP(0x7fadaa7b, 0x09116fa0), + WTCP(0x7fa88608, 0x0958bd51), WTCP(0x7fa339c4, 0x09a00817), WTCP(0x7f9dc5b0, 0x09e74fdd), + WTCP(0x7f9829cc, 0x0a2e948c), WTCP(0x7f92661c, 0x0a75d60e), WTCP(0x7f8c7aa1, 0x0abd144d), + WTCP(0x7f86675c, 0x0b044f32), WTCP(0x7f802c51, 0x0b4b86a8), WTCP(0x7f79c980, 0x0b92ba97), + WTCP(0x7f733eeb, 0x0bd9eaeb), WTCP(0x7f6c8c95, 0x0c21178c), WTCP(0x7f65b280, 0x0c684064), + WTCP(0x7f5eb0ae, 0x0caf655e), WTCP(0x7f578720, 0x0cf68662), WTCP(0x7f5035da, 0x0d3da35c), + WTCP(0x7f48bcde, 0x0d84bc34), WTCP(0x7f411c2e, 0x0dcbd0d5), WTCP(0x7f3953cb, 0x0e12e128), + WTCP(0x7f3163ba, 0x0e59ed17), WTCP(0x7f294bfc, 0x0ea0f48c), WTCP(0x7f210c93, 0x0ee7f771), + WTCP(0x7f18a583, 0x0f2ef5b0), WTCP(0x7f1016cd, 0x0f75ef32), WTCP(0x7f076075, 0x0fbce3e2), + WTCP(0x7efe827e, 0x1003d3a9), WTCP(0x7ef57cea, 0x104abe71), WTCP(0x7eec4fbb, 0x1091a424), + WTCP(0x7ee2faf5, 0x10d884ad), WTCP(0x7ed97e9b, 0x111f5ff3), WTCP(0x7ecfdaaf, 0x116635e3), + WTCP(0x7ec60f35, 0x11ad0665), WTCP(0x7ebc1c30, 0x11f3d164), WTCP(0x7eb201a2, 0x123a96c9), + WTCP(0x7ea7bf90, 0x1281567f), WTCP(0x7e9d55fb, 0x12c8106e), WTCP(0x7e92c4e8, 0x130ec482), + WTCP(0x7e880c5a, 0x135572a5), WTCP(0x7e7d2c53, 0x139c1abf), WTCP(0x7e7224d8, 0x13e2bcbb), + WTCP(0x7e66f5ec, 0x14295884), WTCP(0x7e5b9f92, 0x146fee02), WTCP(0x7e5021ce, 0x14b67d21), + WTCP(0x7e447ca3, 0x14fd05c9), WTCP(0x7e38b016, 0x154387e6), WTCP(0x7e2cbc29, 0x158a0360), + WTCP(0x7e20a0e1, 0x15d07823), WTCP(0x7e145e41, 0x1616e618), WTCP(0x7e07f44d, 0x165d4d28), + WTCP(0x7dfb6309, 0x16a3ad3f), WTCP(0x7deeaa79, 0x16ea0646), WTCP(0x7de1caa1, 0x17305827), + WTCP(0x7dd4c384, 0x1776a2cd), WTCP(0x7dc79528, 0x17bce621), WTCP(0x7dba3f90, 0x1803220d), + WTCP(0x7dacc2c0, 0x1849567c), WTCP(0x7d9f1ebc, 0x188f8357), WTCP(0x7d915389, 0x18d5a889), + WTCP(0x7d83612b, 0x191bc5fc), WTCP(0x7d7547a6, 0x1961db9b), WTCP(0x7d6706ff, 0x19a7e94e), + WTCP(0x7d589f3a, 0x19edef00), WTCP(0x7d4a105c, 0x1a33ec9c), WTCP(0x7d3b5a69, 0x1a79e20c), + WTCP(0x7d2c7d66, 0x1abfcf39), WTCP(0x7d1d7957, 0x1b05b40e), WTCP(0x7d0e4e41, 0x1b4b9076), + WTCP(0x7cfefc29, 0x1b91645a), WTCP(0x7cef8314, 0x1bd72fa4), WTCP(0x7cdfe306, 0x1c1cf23f), + WTCP(0x7cd01c05, 0x1c62ac16), WTCP(0x7cc02e14, 0x1ca85d12), WTCP(0x7cb0193a, 0x1cee051d), + WTCP(0x7c9fdd7b, 0x1d33a422), WTCP(0x7c8f7add, 0x1d793a0b), WTCP(0x7c7ef164, 0x1dbec6c3), + WTCP(0x7c6e4115, 0x1e044a33), WTCP(0x7c5d69f6, 0x1e49c447), WTCP(0x7c4c6c0d, 0x1e8f34e8), + WTCP(0x7c3b475d, 0x1ed49c00), WTCP(0x7c29fbed, 0x1f19f97b), WTCP(0x7c1889c3, 0x1f5f4d42), + WTCP(0x7c06f0e2, 0x1fa49740), WTCP(0x7bf53152, 0x1fe9d75f), WTCP(0x7be34b17, 0x202f0d8a), + WTCP(0x7bd13e38, 0x207439aa), WTCP(0x7bbf0ab9, 0x20b95bac), WTCP(0x7bacb0a0, 0x20fe7378), + WTCP(0x7b9a2ff4, 0x214380f9), WTCP(0x7b8788b9, 0x2188841a), WTCP(0x7b74baf7, 0x21cd7cc5), + WTCP(0x7b61c6b2, 0x22126ae5), WTCP(0x7b4eabf0, 0x22574e65), WTCP(0x7b3b6ab8, 0x229c272e), + WTCP(0x7b28030f, 0x22e0f52b), WTCP(0x7b1474fc, 0x2325b847), WTCP(0x7b00c085, 0x236a706d), + WTCP(0x7aece5af, 0x23af1d86), WTCP(0x7ad8e481, 0x23f3bf7e), WTCP(0x7ac4bd02, 0x2438563f), + WTCP(0x7ab06f36, 0x247ce1b4), WTCP(0x7a9bfb26, 0x24c161c7), WTCP(0x7a8760d7, 0x2505d663), + WTCP(0x7a72a050, 0x254a3f72), WTCP(0x7a5db997, 0x258e9ce0), WTCP(0x7a48acb2, 0x25d2ee97), + WTCP(0x7a3379a8, 0x26173481), WTCP(0x7a1e2081, 0x265b6e8a), WTCP(0x7a08a141, 0x269f9c9c), + WTCP(0x79f2fbf1, 0x26e3bea1), WTCP(0x79dd3097, 0x2727d485), WTCP(0x79c73f3a, 0x276bde33), + WTCP(0x79b127e0, 0x27afdb94), WTCP(0x799aea91, 0x27f3cc94), WTCP(0x79848753, 0x2837b11e), + WTCP(0x796dfe2d, 0x287b891c), WTCP(0x79574f27, 0x28bf547a), WTCP(0x79407a47, 0x29031322), + WTCP(0x79297f95, 0x2946c4ff), WTCP(0x79125f18, 0x298a69fc), WTCP(0x78fb18d6, 0x29ce0204), + WTCP(0x78e3acd8, 0x2a118d01), WTCP(0x78cc1b25, 0x2a550adf), WTCP(0x78b463c3, 0x2a987b89), + WTCP(0x789c86bb, 0x2adbdee9), WTCP(0x78848413, 0x2b1f34eb), WTCP(0x786c5bd4, 0x2b627d79), + WTCP(0x78540e04, 0x2ba5b87f), WTCP(0x783b9aac, 0x2be8e5e8), WTCP(0x782301d2, 0x2c2c059e), + WTCP(0x780a4380, 0x2c6f178d), WTCP(0x77f15fbb, 0x2cb21ba0), WTCP(0x77d8568d, 0x2cf511c2), + WTCP(0x77bf27fd, 0x2d37f9dd), WTCP(0x77a5d413, 0x2d7ad3de), WTCP(0x778c5ad6, 0x2dbd9faf), + WTCP(0x7772bc4f, 0x2e005d3c), WTCP(0x7758f885, 0x2e430c6f), WTCP(0x773f0f81, 0x2e85ad34), + WTCP(0x7725014b, 0x2ec83f76), WTCP(0x770acdeb, 0x2f0ac320), WTCP(0x76f07569, 0x2f4d381e), + WTCP(0x76d5f7cd, 0x2f8f9e5a), WTCP(0x76bb5520, 0x2fd1f5c1), WTCP(0x76a08d6a, 0x30143e3d), + WTCP(0x7685a0b2, 0x305677ba), WTCP(0x766a8f03, 0x3098a222), WTCP(0x764f5863, 0x30dabd63), + WTCP(0x7633fcdc, 0x311cc966), WTCP(0x76187c76, 0x315ec617), WTCP(0x75fcd739, 0x31a0b362), + WTCP(0x75e10d2f, 0x31e29131), WTCP(0x75c51e60, 0x32245f72), WTCP(0x75a90ad4, 0x32661e0e), + WTCP(0x758cd295, 0x32a7ccf2), WTCP(0x757075ab, 0x32e96c09), WTCP(0x7553f41f, 0x332afb3e), + WTCP(0x75374dfa, 0x336c7a7d), WTCP(0x751a8345, 0x33ade9b2), WTCP(0x74fd9409, 0x33ef48c8), + WTCP(0x74e0804f, 0x343097ab), WTCP(0x74c3481f, 0x3471d647), WTCP(0x74a5eb84, 0x34b30487), + WTCP(0x74886a86, 0x34f42256), WTCP(0x746ac52e, 0x35352fa1), WTCP(0x744cfb86, 0x35762c53), + WTCP(0x742f0d97, 0x35b71858), WTCP(0x7410fb6a, 0x35f7f39b), WTCP(0x73f2c509, 0x3638be09), + WTCP(0x73d46a7d, 0x3679778d), WTCP(0x73b5ebd0, 0x36ba2013), WTCP(0x7397490b, 0x36fab787), + WTCP(0x73788237, 0x373b3dd5), WTCP(0x7359975f, 0x377bb2e8), WTCP(0x733a888b, 0x37bc16ad), + WTCP(0x731b55c6, 0x37fc690f), WTCP(0x72fbff1a, 0x383ca9fb), WTCP(0x72dc848f, 0x387cd95b), + WTCP(0x72bce631, 0x38bcf71d), WTCP(0x729d2408, 0x38fd032d), WTCP(0x727d3e1f, 0x393cfd75), + WTCP(0x725d347f, 0x397ce5e3), WTCP(0x723d0733, 0x39bcbc62), WTCP(0x721cb645, 0x39fc80df), + WTCP(0x71fc41be, 0x3a3c3345), WTCP(0x71dba9aa, 0x3a7bd381), WTCP(0x71baee11, 0x3abb617f), + WTCP(0x719a0eff, 0x3afadd2b), WTCP(0x71790c7d, 0x3b3a4671), WTCP(0x7157e696, 0x3b799d3e), + WTCP(0x71369d54, 0x3bb8e17d), WTCP(0x711530c1, 0x3bf8131b), WTCP(0x70f3a0e8, 0x3c373205), + WTCP(0x70d1edd4, 0x3c763e26), WTCP(0x70b0178f, 0x3cb5376b), WTCP(0x708e1e23, 0x3cf41dc0), + WTCP(0x706c019b, 0x3d32f112), WTCP(0x7049c202, 0x3d71b14d), WTCP(0x70275f63, 0x3db05e5d), + WTCP(0x7004d9c7, 0x3deef830), WTCP(0x6fe2313b, 0x3e2d7eb0), WTCP(0x6fbf65c8, 0x3e6bf1cc), + WTCP(0x6f9c7779, 0x3eaa516f), WTCP(0x6f79665a, 0x3ee89d86), WTCP(0x6f563276, 0x3f26d5fd), + WTCP(0x6f32dbd7, 0x3f64fac2), WTCP(0x6f0f6288, 0x3fa30bc0), WTCP(0x6eebc694, 0x3fe108e5), + WTCP(0x6ec80808, 0x401ef21d), WTCP(0x6ea426ed, 0x405cc754), WTCP(0x6e80234e, 0x409a8878), + WTCP(0x6e5bfd38, 0x40d83575), WTCP(0x6e37b4b6, 0x4115ce38), WTCP(0x6e1349d2, 0x415352ad), + WTCP(0x6deebc98, 0x4190c2c3), WTCP(0x6dca0d14, 0x41ce1e64), WTCP(0x6da53b50, 0x420b657f), + WTCP(0x6d804759, 0x42489800), WTCP(0x6d5b313a, 0x4285b5d4), WTCP(0x6d35f8ff, 0x42c2bee7), + WTCP(0x6d109eb2, 0x42ffb328), WTCP(0x6ceb2260, 0x433c9283), WTCP(0x6cc58415, 0x43795ce4), + WTCP(0x6c9fc3dc, 0x43b6123a), WTCP(0x6c79e1c1, 0x43f2b270), WTCP(0x6c53ddd0, 0x442f3d75), + WTCP(0x6c2db815, 0x446bb335), WTCP(0x6c07709b, 0x44a8139d), WTCP(0x6be1076e, 0x44e45e9b), + WTCP(0x6bba7c9b, 0x4520941b), WTCP(0x6b93d02d, 0x455cb40c), WTCP(0x6b6d0232, 0x4598be59), + WTCP(0x6b4612b3, 0x45d4b2f1), WTCP(0x6b1f01bf, 0x461091c1), WTCP(0x6af7cf60, 0x464c5ab6), + WTCP(0x6ad07ba4, 0x46880dbd), WTCP(0x6aa90696, 0x46c3aac5), WTCP(0x6a817043, 0x46ff31b9), + WTCP(0x6a59b8b7, 0x473aa288), WTCP(0x6a31dfff, 0x4775fd1f), WTCP(0x6a09e626, 0x47b1416c), + WTCP(0x69e1cb3a, 0x47ec6f5b), WTCP(0x69b98f47, 0x482786dc), WTCP(0x6991325a, 0x486287da), + WTCP(0x6968b47e, 0x489d7245), WTCP(0x694015c2, 0x48d84609), WTCP(0x69175630, 0x49130314), + WTCP(0x68ee75d7, 0x494da953), WTCP(0x68c574c3, 0x498838b6), WTCP(0x689c5300, 0x49c2b128), + WTCP(0x6873109c, 0x49fd1298), WTCP(0x6849ada3, 0x4a375cf4), WTCP(0x68202a22, 0x4a71902a), + WTCP(0x67f68626, 0x4aabac27), WTCP(0x67ccc1bd, 0x4ae5b0d9), WTCP(0x67a2dcf3, 0x4b1f9e2f), + WTCP(0x6778d7d5, 0x4b597416), WTCP(0x674eb270, 0x4b93327b), WTCP(0x67246cd3, 0x4bccd94e), + WTCP(0x66fa0708, 0x4c06687c), WTCP(0x66cf811f, 0x4c3fdff3), WTCP(0x66a4db24, 0x4c793fa1), + WTCP(0x667a1524, 0x4cb28775), WTCP(0x664f2f2e, 0x4cebb75c), WTCP(0x6624294d, 0x4d24cf44), + WTCP(0x65f90390, 0x4d5dcf1c), WTCP(0x65cdbe05, 0x4d96b6d3), WTCP(0x65a258b7, 0x4dcf8655), + WTCP(0x6576d3b6, 0x4e083d93), WTCP(0x654b2f0f, 0x4e40dc78), WTCP(0x651f6acf, 0x4e7962f6), + WTCP(0x64f38704, 0x4eb1d0f8), WTCP(0x64c783bc, 0x4eea266f), WTCP(0x649b6104, 0x4f226348), + WTCP(0x646f1eeb, 0x4f5a8772), WTCP(0x6442bd7d, 0x4f9292db), WTCP(0x64163cc9, 0x4fca8572), + WTCP(0x63e99cdd, 0x50025f26), WTCP(0x63bcddc6, 0x503a1fe4), WTCP(0x638fff93, 0x5071c79c), + WTCP(0x63630252, 0x50a9563d), WTCP(0x6335e610, 0x50e0cbb4), WTCP(0x6308aadc, 0x511827f0), + WTCP(0x62db50c4, 0x514f6ae1), WTCP(0x62add7d5, 0x51869476), WTCP(0x6280401f, 0x51bda49c), + WTCP(0x625289af, 0x51f49b42), WTCP(0x6224b494, 0x522b7859), WTCP(0x61f6c0dc, 0x52623bcd), + WTCP(0x61c8ae94, 0x5298e58f), WTCP(0x619a7dcd, 0x52cf758e), WTCP(0x616c2e93, 0x5305ebb8), + WTCP(0x613dc0f6, 0x533c47fc), WTCP(0x610f3504, 0x53728a49), WTCP(0x60e08acb, 0x53a8b28f), + WTCP(0x60b1c25b, 0x53dec0bc), WTCP(0x6082dbc0, 0x5414b4c0), WTCP(0x6053d70c, 0x544a8e8a), + WTCP(0x6024b44b, 0x54804e09), WTCP(0x5ff5738c, 0x54b5f32c), WTCP(0x5fc614df, 0x54eb7de2), + WTCP(0x5f969852, 0x5520ee1c), WTCP(0x5f66fdf4, 0x555643c8), WTCP(0x5f3745d4, 0x558b7ed5), + WTCP(0x5f077001, 0x55c09f33), WTCP(0x5ed77c89, 0x55f5a4d2), WTCP(0x5ea76b7c, 0x562a8fa0), + WTCP(0x5e773ce8, 0x565f5f8e), WTCP(0x5e46f0dc, 0x5694148a), WTCP(0x5e168769, 0x56c8ae85), + WTCP(0x5de6009c, 0x56fd2d6e), WTCP(0x5db55c85, 0x57319134), WTCP(0x5d849b33, 0x5765d9c8), + WTCP(0x5d53bcb5, 0x579a0719), WTCP(0x5d22c11b, 0x57ce1916), WTCP(0x5cf1a874, 0x58020fb0), + WTCP(0x5cc072ce, 0x5835ead6), WTCP(0x5c8f203a, 0x5869aa78), WTCP(0x5c5db0c7, 0x589d4e87), + WTCP(0x5c2c2484, 0x58d0d6f0), WTCP(0x5bfa7b81, 0x590443a6), WTCP(0x5bc8b5cd, 0x59379497), + WTCP(0x5b96d378, 0x596ac9b5), WTCP(0x5b64d491, 0x599de2ed), WTCP(0x5b32b928, 0x59d0e032), + WTCP(0x5b00814c, 0x5a03c172), WTCP(0x5ace2d0e, 0x5a36869f), WTCP(0x5a9bbc7c, 0x5a692fa7) +}; + +const PWord32 SineWindow960[480] = { + WTCP(0x7ffffd30, 0x001aceea), WTCP(0x7fffe6bb, 0x00506cb9), WTCP(0x7fffb9d0, 0x00860a79), + WTCP(0x7fff7670, 0x00bba822), WTCP(0x7fff1c9a, 0x00f145ab), WTCP(0x7ffeac4f, 0x0126e309), + WTCP(0x7ffe258f, 0x015c8033), WTCP(0x7ffd8859, 0x01921d20), WTCP(0x7ffcd4af, 0x01c7b9c6), + WTCP(0x7ffc0a90, 0x01fd561d), WTCP(0x7ffb29fc, 0x0232f21a), WTCP(0x7ffa32f3, 0x02688db4), + WTCP(0x7ff92576, 0x029e28e2), WTCP(0x7ff80185, 0x02d3c39b), WTCP(0x7ff6c71f, 0x03095dd5), + WTCP(0x7ff57646, 0x033ef786), WTCP(0x7ff40ef9, 0x037490a5), WTCP(0x7ff29139, 0x03aa292a), + WTCP(0x7ff0fd06, 0x03dfc109), WTCP(0x7fef525f, 0x0415583b), WTCP(0x7fed9147, 0x044aeeb5), + WTCP(0x7febb9bc, 0x0480846e), WTCP(0x7fe9cbbf, 0x04b6195d), WTCP(0x7fe7c751, 0x04ebad79), + WTCP(0x7fe5ac71, 0x052140b7), WTCP(0x7fe37b21, 0x0556d30f), WTCP(0x7fe13360, 0x058c6478), + WTCP(0x7fded52f, 0x05c1f4e7), WTCP(0x7fdc608e, 0x05f78453), WTCP(0x7fd9d57e, 0x062d12b3), + WTCP(0x7fd73400, 0x06629ffe), WTCP(0x7fd47c13, 0x06982c2b), WTCP(0x7fd1adb8, 0x06cdb72f), + WTCP(0x7fcec8f0, 0x07034101), WTCP(0x7fcbcdbb, 0x0738c998), WTCP(0x7fc8bc1a, 0x076e50eb), + WTCP(0x7fc5940d, 0x07a3d6f0), WTCP(0x7fc25595, 0x07d95b9e), WTCP(0x7fbf00b2, 0x080edeec), + WTCP(0x7fbb9566, 0x084460cf), WTCP(0x7fb813af, 0x0879e140), WTCP(0x7fb47b90, 0x08af6033), + WTCP(0x7fb0cd09, 0x08e4dda0), WTCP(0x7fad081a, 0x091a597e), WTCP(0x7fa92cc4, 0x094fd3c3), + WTCP(0x7fa53b08, 0x09854c66), WTCP(0x7fa132e7, 0x09bac35d), WTCP(0x7f9d1460, 0x09f0389f), + WTCP(0x7f98df76, 0x0a25ac22), WTCP(0x7f949428, 0x0a5b1dde), WTCP(0x7f903278, 0x0a908dc9), + WTCP(0x7f8bba65, 0x0ac5fbd9), WTCP(0x7f872bf2, 0x0afb6805), WTCP(0x7f82871e, 0x0b30d244), + WTCP(0x7f7dcbeb, 0x0b663a8c), WTCP(0x7f78fa5a, 0x0b9ba0d5), WTCP(0x7f74126a, 0x0bd10513), + WTCP(0x7f6f141e, 0x0c06673f), WTCP(0x7f69ff75, 0x0c3bc74f), WTCP(0x7f64d472, 0x0c71253a), + WTCP(0x7f5f9314, 0x0ca680f5), WTCP(0x7f5a3b5d, 0x0cdbda79), WTCP(0x7f54cd4e, 0x0d1131ba), + WTCP(0x7f4f48e7, 0x0d4686b1), WTCP(0x7f49ae29, 0x0d7bd954), WTCP(0x7f43fd17, 0x0db12998), + WTCP(0x7f3e35af, 0x0de67776), WTCP(0x7f3857f5, 0x0e1bc2e4), WTCP(0x7f3263e8, 0x0e510bd7), + WTCP(0x7f2c5989, 0x0e865248), WTCP(0x7f2638da, 0x0ebb962c), WTCP(0x7f2001dc, 0x0ef0d77b), + WTCP(0x7f19b490, 0x0f26162a), WTCP(0x7f1350f7, 0x0f5b5231), WTCP(0x7f0cd711, 0x0f908b86), + WTCP(0x7f0646e1, 0x0fc5c220), WTCP(0x7effa068, 0x0ffaf5f6), WTCP(0x7ef8e3a5, 0x103026fe), + WTCP(0x7ef2109c, 0x1065552e), WTCP(0x7eeb274c, 0x109a807e), WTCP(0x7ee427b8, 0x10cfa8e5), + WTCP(0x7edd11e0, 0x1104ce58), WTCP(0x7ed5e5c5, 0x1139f0cf), WTCP(0x7ecea36a, 0x116f1040), + WTCP(0x7ec74ace, 0x11a42ca2), WTCP(0x7ebfdbf4, 0x11d945eb), WTCP(0x7eb856dd, 0x120e5c13), + WTCP(0x7eb0bb89, 0x12436f10), WTCP(0x7ea909fb, 0x12787ed8), WTCP(0x7ea14234, 0x12ad8b63), + WTCP(0x7e996435, 0x12e294a7), WTCP(0x7e916fff, 0x13179a9a), WTCP(0x7e896594, 0x134c9d34), + WTCP(0x7e8144f5, 0x13819c6b), WTCP(0x7e790e24, 0x13b69836), WTCP(0x7e70c123, 0x13eb908c), + WTCP(0x7e685df1, 0x14208562), WTCP(0x7e5fe492, 0x145576b1), WTCP(0x7e575507, 0x148a646e), + WTCP(0x7e4eaf50, 0x14bf4e91), WTCP(0x7e45f370, 0x14f43510), WTCP(0x7e3d2168, 0x152917e1), + WTCP(0x7e34393a, 0x155df6fc), WTCP(0x7e2b3ae7, 0x1592d257), WTCP(0x7e222671, 0x15c7a9ea), + WTCP(0x7e18fbd9, 0x15fc7da9), WTCP(0x7e0fbb21, 0x16314d8e), WTCP(0x7e06644b, 0x1666198d), + WTCP(0x7dfcf758, 0x169ae19f), WTCP(0x7df3744a, 0x16cfa5b9), WTCP(0x7de9db22, 0x170465d2), + WTCP(0x7de02be3, 0x173921e2), WTCP(0x7dd6668e, 0x176dd9de), WTCP(0x7dcc8b24, 0x17a28dbe), + WTCP(0x7dc299a8, 0x17d73d79), WTCP(0x7db8921b, 0x180be904), WTCP(0x7dae747f, 0x18409058), + WTCP(0x7da440d5, 0x1875336a), WTCP(0x7d99f720, 0x18a9d231), WTCP(0x7d8f9761, 0x18de6ca5), + WTCP(0x7d85219b, 0x191302bb), WTCP(0x7d7a95ce, 0x1947946c), WTCP(0x7d6ff3fd, 0x197c21ac), + WTCP(0x7d653c2a, 0x19b0aa75), WTCP(0x7d5a6e56, 0x19e52ebb), WTCP(0x7d4f8a84, 0x1a19ae76), + WTCP(0x7d4490b5, 0x1a4e299c), WTCP(0x7d3980eb, 0x1a82a025), WTCP(0x7d2e5b29, 0x1ab71208), + WTCP(0x7d231f6f, 0x1aeb7f3a), WTCP(0x7d17cdc1, 0x1b1fe7b3), WTCP(0x7d0c6620, 0x1b544b6a), + WTCP(0x7d00e88e, 0x1b88aa55), WTCP(0x7cf5550d, 0x1bbd046c), WTCP(0x7ce9aba0, 0x1bf159a4), + WTCP(0x7cddec47, 0x1c25a9f5), WTCP(0x7cd21706, 0x1c59f557), WTCP(0x7cc62bde, 0x1c8e3bbe), + WTCP(0x7cba2ad2, 0x1cc27d23), WTCP(0x7cae13e3, 0x1cf6b97c), WTCP(0x7ca1e714, 0x1d2af0c0), + WTCP(0x7c95a466, 0x1d5f22e6), WTCP(0x7c894bdd, 0x1d934fe5), WTCP(0x7c7cdd7a, 0x1dc777b3), + WTCP(0x7c70593f, 0x1dfb9a48), WTCP(0x7c63bf2e, 0x1e2fb79a), WTCP(0x7c570f4a, 0x1e63cfa0), + WTCP(0x7c4a4995, 0x1e97e251), WTCP(0x7c3d6e12, 0x1ecbefa3), WTCP(0x7c307cc1, 0x1efff78f), + WTCP(0x7c2375a7, 0x1f33fa0a), WTCP(0x7c1658c4, 0x1f67f70b), WTCP(0x7c09261c, 0x1f9bee8a), + WTCP(0x7bfbddb0, 0x1fcfe07d), WTCP(0x7bee7f84, 0x2003ccdb), WTCP(0x7be10b98, 0x2037b39b), + WTCP(0x7bd381f0, 0x206b94b4), WTCP(0x7bc5e28f, 0x209f701c), WTCP(0x7bb82d75, 0x20d345cb), + WTCP(0x7baa62a7, 0x210715b8), WTCP(0x7b9c8225, 0x213adfda), WTCP(0x7b8e8bf4, 0x216ea426), + WTCP(0x7b808014, 0x21a26295), WTCP(0x7b725e89, 0x21d61b1d), WTCP(0x7b642755, 0x2209cdb6), + WTCP(0x7b55da7b, 0x223d7a55), WTCP(0x7b4777fd, 0x227120f3), WTCP(0x7b38ffdd, 0x22a4c185), + WTCP(0x7b2a721e, 0x22d85c03), WTCP(0x7b1bcec3, 0x230bf064), WTCP(0x7b0d15cf, 0x233f7e9f), + WTCP(0x7afe4743, 0x237306ab), WTCP(0x7aef6323, 0x23a6887e), WTCP(0x7ae06970, 0x23da0410), + WTCP(0x7ad15a2f, 0x240d7958), WTCP(0x7ac23560, 0x2440e84c), WTCP(0x7ab2fb08, 0x247450e4), + WTCP(0x7aa3ab28, 0x24a7b316), WTCP(0x7a9445c4, 0x24db0eda), WTCP(0x7a84cadd, 0x250e6427), + WTCP(0x7a753a78, 0x2541b2f3), WTCP(0x7a659495, 0x2574fb35), WTCP(0x7a55d939, 0x25a83ce5), + WTCP(0x7a460867, 0x25db77fa), WTCP(0x7a36221f, 0x260eac6a), WTCP(0x7a262667, 0x2641da2c), + WTCP(0x7a16153f, 0x26750139), WTCP(0x7a05eeac, 0x26a82185), WTCP(0x79f5b2b0, 0x26db3b0a), + WTCP(0x79e5614e, 0x270e4dbd), WTCP(0x79d4fa88, 0x27415996), WTCP(0x79c47e62, 0x27745e8b), + WTCP(0x79b3ecdf, 0x27a75c95), WTCP(0x79a34601, 0x27da53a9), WTCP(0x799289cb, 0x280d43bf), + WTCP(0x7981b841, 0x28402cce), WTCP(0x7970d164, 0x28730ecd), WTCP(0x795fd539, 0x28a5e9b3), + WTCP(0x794ec3c2, 0x28d8bd78), WTCP(0x793d9d02, 0x290b8a11), WTCP(0x792c60fd, 0x293e4f77), + WTCP(0x791b0fb4, 0x29710da1), WTCP(0x7909a92c, 0x29a3c485), WTCP(0x78f82d67, 0x29d6741a), + WTCP(0x78e69c68, 0x2a091c59), WTCP(0x78d4f633, 0x2a3bbd37), WTCP(0x78c33aca, 0x2a6e56ac), + WTCP(0x78b16a31, 0x2aa0e8af), WTCP(0x789f846a, 0x2ad37338), WTCP(0x788d897a, 0x2b05f63d), + WTCP(0x787b7963, 0x2b3871b5), WTCP(0x78695427, 0x2b6ae598), WTCP(0x785719cb, 0x2b9d51dd), + WTCP(0x7844ca52, 0x2bcfb67b), WTCP(0x783265bf, 0x2c021368), WTCP(0x781fec14, 0x2c34689e), + WTCP(0x780d5d56, 0x2c66b611), WTCP(0x77fab988, 0x2c98fbba), WTCP(0x77e800ac, 0x2ccb3990), + WTCP(0x77d532c6, 0x2cfd6f8a), WTCP(0x77c24fda, 0x2d2f9d9f), WTCP(0x77af57eb, 0x2d61c3c6), + WTCP(0x779c4afb, 0x2d93e1f7), WTCP(0x7789290f, 0x2dc5f829), WTCP(0x7775f229, 0x2df80653), + WTCP(0x7762a64e, 0x2e2a0c6b), WTCP(0x774f4580, 0x2e5c0a6b), WTCP(0x773bcfc3, 0x2e8e0047), + WTCP(0x7728451b, 0x2ebfedf9), WTCP(0x7714a58a, 0x2ef1d377), WTCP(0x7700f114, 0x2f23b0b8), + WTCP(0x76ed27bd, 0x2f5585b4), WTCP(0x76d94988, 0x2f875262), WTCP(0x76c55679, 0x2fb916b9), + WTCP(0x76b14e92, 0x2fead2b0), WTCP(0x769d31d9, 0x301c863f), WTCP(0x7689004f, 0x304e315d), + WTCP(0x7674b9f9, 0x307fd401), WTCP(0x76605eda, 0x30b16e22), WTCP(0x764beef7, 0x30e2ffb9), + WTCP(0x76376a51, 0x311488bb), WTCP(0x7622d0ee, 0x31460921), WTCP(0x760e22d0, 0x317780e2), + WTCP(0x75f95ffb, 0x31a8eff5), WTCP(0x75e48874, 0x31da5651), WTCP(0x75cf9c3c, 0x320bb3ee), + WTCP(0x75ba9b59, 0x323d08c3), WTCP(0x75a585ce, 0x326e54c7), WTCP(0x75905b9f, 0x329f97f2), + WTCP(0x757b1ccf, 0x32d0d23b), WTCP(0x7565c961, 0x3302039a), WTCP(0x7550615b, 0x33332c06), + WTCP(0x753ae4bf, 0x33644b76), WTCP(0x75255392, 0x339561e1), WTCP(0x750fadd6, 0x33c66f3f), + WTCP(0x74f9f390, 0x33f77388), WTCP(0x74e424c5, 0x34286eb3), WTCP(0x74ce4176, 0x345960b6), + WTCP(0x74b849a9, 0x348a498b), WTCP(0x74a23d61, 0x34bb2927), WTCP(0x748c1ca3, 0x34ebff83), + WTCP(0x7475e771, 0x351ccc95), WTCP(0x745f9dd0, 0x354d9056), WTCP(0x74493fc4, 0x357e4abd), + WTCP(0x7432cd51, 0x35aefbc1), WTCP(0x741c467a, 0x35dfa35a), WTCP(0x7405ab44, 0x3610417e), + WTCP(0x73eefbb2, 0x3640d627), WTCP(0x73d837c9, 0x3671614a), WTCP(0x73c15f8c, 0x36a1e2e0), + WTCP(0x73aa7300, 0x36d25ae0), WTCP(0x73937229, 0x3702c942), WTCP(0x737c5d0a, 0x37332dfc), + WTCP(0x736533a8, 0x37638907), WTCP(0x734df606, 0x3793da5a), WTCP(0x7336a42a, 0x37c421ed), + WTCP(0x731f3e16, 0x37f45fb7), WTCP(0x7307c3cf, 0x382493b0), WTCP(0x72f03559, 0x3854bdce), + WTCP(0x72d892b9, 0x3884de0b), WTCP(0x72c0dbf2, 0x38b4f45d), WTCP(0x72a91108, 0x38e500bb), + WTCP(0x72913200, 0x3915031e), WTCP(0x72793edf, 0x3944fb7d), WTCP(0x726137a7, 0x3974e9d0), + WTCP(0x72491c5d, 0x39a4ce0e), WTCP(0x7230ed06, 0x39d4a82e), WTCP(0x7218a9a6, 0x3a047829), + WTCP(0x72005241, 0x3a343df6), WTCP(0x71e7e6db, 0x3a63f98d), WTCP(0x71cf6779, 0x3a93aae5), + WTCP(0x71b6d41f, 0x3ac351f5), WTCP(0x719e2cd1, 0x3af2eeb7), WTCP(0x71857194, 0x3b228120), + WTCP(0x716ca26b, 0x3b520929), WTCP(0x7153bf5c, 0x3b8186ca), WTCP(0x713ac86a, 0x3bb0f9f9), + WTCP(0x7121bd9b, 0x3be062b0), WTCP(0x71089ef1, 0x3c0fc0e5), WTCP(0x70ef6c73, 0x3c3f1490), + WTCP(0x70d62624, 0x3c6e5da9), WTCP(0x70bccc08, 0x3c9d9c28), WTCP(0x70a35e25, 0x3cccd004), + WTCP(0x7089dc7e, 0x3cfbf935), WTCP(0x70704718, 0x3d2b17b3), WTCP(0x70569df7, 0x3d5a2b75), + WTCP(0x703ce121, 0x3d893473), WTCP(0x70231099, 0x3db832a5), WTCP(0x70092c64, 0x3de72603), + WTCP(0x6fef3487, 0x3e160e85), WTCP(0x6fd52906, 0x3e44ec22), WTCP(0x6fbb09e6, 0x3e73bed1), + WTCP(0x6fa0d72b, 0x3ea2868c), WTCP(0x6f8690da, 0x3ed14349), WTCP(0x6f6c36f7, 0x3efff500), + WTCP(0x6f51c988, 0x3f2e9baa), WTCP(0x6f374890, 0x3f5d373e), WTCP(0x6f1cb415, 0x3f8bc7b3), + WTCP(0x6f020c1b, 0x3fba4d02), WTCP(0x6ee750a7, 0x3fe8c723), WTCP(0x6ecc81bd, 0x4017360d), + WTCP(0x6eb19f63, 0x404599b8), WTCP(0x6e96a99c, 0x4073f21d), WTCP(0x6e7ba06e, 0x40a23f32), + WTCP(0x6e6083dd, 0x40d080f0), WTCP(0x6e4553ef, 0x40feb74f), WTCP(0x6e2a10a7, 0x412ce246), + WTCP(0x6e0eba0b, 0x415b01ce), WTCP(0x6df3501f, 0x418915de), WTCP(0x6dd7d2e9, 0x41b71e6e), + WTCP(0x6dbc426d, 0x41e51b77), WTCP(0x6da09eb0, 0x42130cf0), WTCP(0x6d84e7b6, 0x4240f2d1), + WTCP(0x6d691d86, 0x426ecd12), WTCP(0x6d4d4022, 0x429c9baa), WTCP(0x6d314f92, 0x42ca5e93), + WTCP(0x6d154bd8, 0x42f815c4), WTCP(0x6cf934fb, 0x4325c135), WTCP(0x6cdd0aff, 0x435360de), + WTCP(0x6cc0cde9, 0x4380f4b6), WTCP(0x6ca47dbe, 0x43ae7cb6), WTCP(0x6c881a83, 0x43dbf8d7), + WTCP(0x6c6ba43d, 0x4409690f), WTCP(0x6c4f1af2, 0x4436cd57), WTCP(0x6c327ea5, 0x446425a7), + WTCP(0x6c15cf5c, 0x449171f7), WTCP(0x6bf90d1c, 0x44beb240), WTCP(0x6bdc37eb, 0x44ebe678), + WTCP(0x6bbf4fcc, 0x45190e99), WTCP(0x6ba254c6, 0x45462a9a), WTCP(0x6b8546dd, 0x45733a73), + WTCP(0x6b682617, 0x45a03e1d), WTCP(0x6b4af278, 0x45cd358f), WTCP(0x6b2dac05, 0x45fa20c2), + WTCP(0x6b1052c5, 0x4626ffae), WTCP(0x6af2e6bb, 0x4653d24a), WTCP(0x6ad567ee, 0x46809890), + WTCP(0x6ab7d662, 0x46ad5277), WTCP(0x6a9a321c, 0x46d9fff7), WTCP(0x6a7c7b22, 0x4706a109), + WTCP(0x6a5eb179, 0x473335a5), WTCP(0x6a40d526, 0x475fbdc2), WTCP(0x6a22e62f, 0x478c3959), + WTCP(0x6a04e498, 0x47b8a863), WTCP(0x69e6d067, 0x47e50ad7), WTCP(0x69c8a9a1, 0x481160ae), + WTCP(0x69aa704b, 0x483da9e0), WTCP(0x698c246b, 0x4869e664), WTCP(0x696dc606, 0x48961634), + WTCP(0x694f5522, 0x48c23948), WTCP(0x6930d1c3, 0x48ee4f98), WTCP(0x69123bf0, 0x491a591b), + WTCP(0x68f393ad, 0x494655cb), WTCP(0x68d4d8ff, 0x497245a0), WTCP(0x68b60bed, 0x499e2892), + WTCP(0x68972c7c, 0x49c9fe99), WTCP(0x68783ab1, 0x49f5c7ad), WTCP(0x68593691, 0x4a2183c7), + WTCP(0x683a2022, 0x4a4d32e0), WTCP(0x681af769, 0x4a78d4ef), WTCP(0x67fbbc6c, 0x4aa469ed), + WTCP(0x67dc6f31, 0x4acff1d2), WTCP(0x67bd0fbc, 0x4afb6c97), WTCP(0x679d9e13, 0x4b26da34), + WTCP(0x677e1a3d, 0x4b523aa1), WTCP(0x675e843e, 0x4b7d8dd7), WTCP(0x673edc1b, 0x4ba8d3cf), + WTCP(0x671f21db, 0x4bd40c7f), WTCP(0x66ff5584, 0x4bff37e2), WTCP(0x66df7719, 0x4c2a55ef), + WTCP(0x66bf86a2, 0x4c55669f), WTCP(0x669f8424, 0x4c8069ea), WTCP(0x667f6fa4, 0x4cab5fc9), + WTCP(0x665f4928, 0x4cd64834), WTCP(0x663f10b6, 0x4d012324), WTCP(0x661ec653, 0x4d2bf090), + WTCP(0x65fe6a05, 0x4d56b073), WTCP(0x65ddfbd2, 0x4d8162c3), WTCP(0x65bd7bc0, 0x4dac077b), + WTCP(0x659ce9d3, 0x4dd69e91), WTCP(0x657c4612, 0x4e0127ff), WTCP(0x655b9083, 0x4e2ba3be), + WTCP(0x653ac92a, 0x4e5611c5), WTCP(0x6519f00f, 0x4e80720d), WTCP(0x64f90537, 0x4eaac48f), + WTCP(0x64d808a7, 0x4ed50944), WTCP(0x64b6fa65, 0x4eff4024), WTCP(0x6495da78, 0x4f296927), + WTCP(0x6474a8e5, 0x4f538447), WTCP(0x645365b1, 0x4f7d917c), WTCP(0x643210e3, 0x4fa790be), + WTCP(0x6410aa80, 0x4fd18206), WTCP(0x63ef328f, 0x4ffb654c), WTCP(0x63cda915, 0x50253a8b), + WTCP(0x63ac0e18, 0x504f01b9), WTCP(0x638a619e, 0x5078bad0), WTCP(0x6368a3ac, 0x50a265c8), + WTCP(0x6346d44a, 0x50cc029b), WTCP(0x6324f37c, 0x50f59140), WTCP(0x63030149, 0x511f11b1), + WTCP(0x62e0fdb7, 0x514883e6), WTCP(0x62bee8cb, 0x5171e7d8), WTCP(0x629cc28c, 0x519b3d80), + WTCP(0x627a8aff, 0x51c484d6), WTCP(0x6258422b, 0x51edbdd3), WTCP(0x6235e815, 0x5216e870), + WTCP(0x62137cc4, 0x524004a6), WTCP(0x61f1003e, 0x5269126e), WTCP(0x61ce7289, 0x529211c0), + WTCP(0x61abd3aa, 0x52bb0295), WTCP(0x618923a8, 0x52e3e4e5), WTCP(0x61666289, 0x530cb8ab), + WTCP(0x61439053, 0x53357dde), WTCP(0x6120ad0c, 0x535e3478), WTCP(0x60fdb8ba, 0x5386dc71), + WTCP(0x60dab364, 0x53af75c2), WTCP(0x60b79d0f, 0x53d80064), WTCP(0x609475c2, 0x54007c50), + WTCP(0x60713d83, 0x5428e97f), WTCP(0x604df458, 0x545147ea), WTCP(0x602a9a47, 0x54799789), + WTCP(0x60072f56, 0x54a1d856), WTCP(0x5fe3b38d, 0x54ca0a4a), WTCP(0x5fc026f0, 0x54f22d5d), + WTCP(0x5f9c8986, 0x551a4188), WTCP(0x5f78db55, 0x554246c5), WTCP(0x5f551c64, 0x556a3d0c), + WTCP(0x5f314cb9, 0x55922457), WTCP(0x5f0d6c5b, 0x55b9fc9d), WTCP(0x5ee97b4e, 0x55e1c5da), + WTCP(0x5ec5799b, 0x56098004), WTCP(0x5ea16746, 0x56312b16), WTCP(0x5e7d4457, 0x5658c709), + WTCP(0x5e5910d4, 0x568053d5), WTCP(0x5e34ccc3, 0x56a7d173), WTCP(0x5e10782a, 0x56cf3fdd), + WTCP(0x5dec1310, 0x56f69f0c), WTCP(0x5dc79d7b, 0x571deef9), WTCP(0x5da31772, 0x57452f9d), + WTCP(0x5d7e80fb, 0x576c60f0), WTCP(0x5d59da1d, 0x579382ed), WTCP(0x5d3522dd, 0x57ba958c), + WTCP(0x5d105b43, 0x57e198c6), WTCP(0x5ceb8355, 0x58088c96), WTCP(0x5cc69b18, 0x582f70f2), + WTCP(0x5ca1a295, 0x585645d6), WTCP(0x5c7c99d0, 0x587d0b3a), WTCP(0x5c5780d2, 0x58a3c117), + WTCP(0x5c3257a0, 0x58ca6767), WTCP(0x5c0d1e40, 0x58f0fe22), WTCP(0x5be7d4ba, 0x59178542), + WTCP(0x5bc27b13, 0x593dfcc1), WTCP(0x5b9d1153, 0x59646497), WTCP(0x5b779780, 0x598abcbe), + WTCP(0x5b520da0, 0x59b1052e), WTCP(0x5b2c73ba, 0x59d73de2), WTCP(0x5b06c9d6, 0x59fd66d3), + WTCP(0x5ae10ff8, 0x5a237ff9), WTCP(0x5abb4628, 0x5a49894f), WTCP(0x5a956c6d, 0x5a6f82cd), +}; +#endif + +/* + fs 48 32 24 16 8 + ms +-------------------- + 10.0 | 480 320 240 160 80 + 7.5 | 360 240 180 120 60 + 5.0 | 240 160 120 80 40 + 2.5 | 120 80 60 40 20 +*/ +void BASOP_getTables( +#ifdef ENABLE_HR_MODE + const PWord32 **twiddle, const PWord32 **sin, +#else + const PWord16 **twiddle, const PWord16 **sin, +#endif + Word16 *sin_step, Word16 length) +{ + SWITCH (length) + { + case 20: + *sin = SineTable320; + move16(); + *sin_step = 32; + move16(); + *twiddle = SineWindow20; + move16(); + BREAK; +#ifdef CR9_C_ADD_1p25MS + /* 24 kHz 1.25 ms */ + case 30: + *sin = SineTable360; + move16(); + *sin_step = 24; + move16(); + *twiddle = SineWindow30; + move16(); + BREAK; +#endif + case 40: + *sin = SineTable320; + move16(); + *sin_step = 16; + move16(); + *twiddle = SineWindow40; + move16(); + BREAK; + case 60: + *sin = SineTable480; + move16(); + *sin_step = 16; + move16(); + *twiddle = SineWindow60; + move16(); + BREAK; + case 80: + *sin = SineTable320; + move16(); + *sin_step = 8; + move16(); + *twiddle = SineWindow80; + move16(); + BREAK; + case 120: + *sin = SineTable480; + move16(); + *sin_step = 8; + move16(); + *twiddle = SineWindow120; + move16(); + BREAK; + case 160: + *sin = SineTable320; + move16(); + *sin_step = 4; + move16(); + *twiddle = SineWindow160; + move16(); + BREAK; + case 180: + *sin = SineTable360; + move16(); + *sin_step = 4; + move16(); + *twiddle = SineWindow180; + move16(); + BREAK; + case 240: + *sin = SineTable480; + move16(); + *sin_step = 4; + move16(); + *twiddle = SineWindow240; + move16(); + BREAK; + case 320: + *sin = SineTable320; + move16(); + *sin_step = 2; + move16(); + *twiddle = SineWindow320; + move16(); + BREAK; + case 360: + *sin = SineTable360; + move16(); + *sin_step = 2; + move16(); + *twiddle = SineWindow360; + move16(); + BREAK; + case 480: + *sin = SineTable480; + move16(); + *sin_step = 2; + move16(); + *twiddle = SineWindow480; + move16(); + BREAK; +#ifdef ENABLE_HR_MODE + case 720: + *sin = SineTable720; + move16(); + *sin_step = 2; + move16(); + *twiddle = SineWindow720; + move16(); + break; + case 960: + *sin = SineTable960; + move16(); + *sin_step = 2; + move16(); + *twiddle = SineWindow960; + move16(); + break; +#endif + default: ASSERT(0); + } +} + +const Word32 RealFFT32_twid[10] = { + 0x7fffffff, 0x00000000, 0x7d8a5f40, 0x18f8b83c, 0x7641af3d, + 0x30fbc54d, 0x6a6d98a4, 0x471cece7, 0x5a82799a, 0x5a82799a, +}; + +const Word32 RealFFT40_twid[12] = { + 0x7fffffff, 0x00000000, 0x7e6c9251, 0x14060b68, 0x79bc384d, 0x278dde6e, + 0x720c8075, 0x3a1c5c57, 0x678dde6e, 0x4b3c8c12, 0x5a82799a, 0x5a82799a, +}; + +const Word32 RealFFT64_twid[18] = { + 0x7fffffff, 0x00000000, 0x7f62368f, 0x0c8bd35e, 0x7d8a5f40, 0x18f8b83c, 0x7a7d055b, 0x25280c5e, 0x7641af3d, + 0x30fbc54d, 0x70e2cbc6, 0x3c56ba70, 0x6a6d98a4, 0x471cece7, 0x62f201ac, 0x5133cc94, 0x5a82799a, 0x5a82799a, +}; + +const Word32 RealFFT80_twid[22] = { + 0x7fffffff, 0x00000000, 0x7f9afcb9, 0x0a0af299, 0x7e6c9251, 0x14060b68, 0x7c769e18, 0x1de189a6, + 0x79bc384d, 0x278dde6e, 0x7641af3d, 0x30fbc54d, 0x720c8075, 0x3a1c5c57, 0x6d23501b, 0x42e13ba4, + 0x678dde6e, 0x4b3c8c12, 0x6154fb91, 0x53211d18, 0x5a82799a, 0x5a82799a, +}; + +const Word32 RealFFT96_twid[26] = { + 0x7fffffff, 0x00000000, 0x7fb9d759, 0x085f2137, 0x7ee7aa4c, 0x10b5150f, 0x7d8a5f40, 0x18f8b83c, 0x7ba3751d, + 0x2120fb83, 0x793501a9, 0x2924edac, 0x7641af3d, 0x30fbc54d, 0x72ccb9db, 0x389cea72, 0x6ed9eba1, 0x40000000, + 0x6a6d98a4, 0x471cece7, 0x658c9a2d, 0x4debe4fe, 0x603c496c, 0x54657194, 0x5a82799a, 0x5a82799a, +}; + +const Word32 RealFFT128_twid[34] = { + 0x7fffffff, 0x00000000, 0x7fd8878e, 0x0647d97c, 0x7f62368f, 0x0c8bd35e, 0x7e9d55fc, 0x12c8106f, 0x7d8a5f40, + 0x18f8b83c, 0x7c29fbee, 0x1f19f97b, 0x7a7d055b, 0x25280c5e, 0x78848414, 0x2b1f34eb, 0x7641af3d, 0x30fbc54d, + 0x73b5ebd1, 0x36ba2014, 0x70e2cbc6, 0x3c56ba70, 0x6dca0d14, 0x41ce1e65, 0x6a6d98a4, 0x471cece7, 0x66cf8120, + 0x4c3fdff4, 0x62f201ac, 0x5133cc94, 0x5ed77c8a, 0x55f5a4d2, 0x5a82799a, 0x5a82799a, +}; + +const Word32 RealFFT192_twid[50] = { + 0x7fffffff, 0x00000000, 0x7fee74a2, 0x0430238f, 0x7fb9d759, 0x085f2137, 0x7f62368f, 0x0c8bd35e, 0x7ee7aa4c, + 0x10b5150f, 0x7e4a5426, 0x14d9c245, 0x7d8a5f40, 0x18f8b83c, 0x7ca80038, 0x1d10d5c2, 0x7ba3751d, 0x2120fb83, + 0x7a7d055b, 0x25280c5e, 0x793501a9, 0x2924edac, 0x77cbc3f2, 0x2d168792, 0x7641af3d, 0x30fbc54d, 0x74972f92, + 0x34d3957e, 0x72ccb9db, 0x389cea72, 0x70e2cbc6, 0x3c56ba70, 0x6ed9eba1, 0x40000000, 0x6cb2a837, 0x4397ba32, + 0x6a6d98a4, 0x471cece7, 0x680b5c33, 0x4a8ea111, 0x658c9a2d, 0x4debe4fe, 0x62f201ac, 0x5133cc94, 0x603c496c, + 0x54657194, 0x5d6c2f99, 0x577ff3da, 0x5a82799a, 0x5a82799a, +}; + +const Word32 RealFFT256_twid[66] = { + 0x7fffffff, 0x00000000, 0x7ff62182, 0x03242abf, 0x7fd8878e, 0x0647d97c, 0x7fa736b4, 0x096a9049, 0x7f62368f, + 0x0c8bd35e, 0x7f0991c4, 0x0fab272b, 0x7e9d55fc, 0x12c8106f, 0x7e1d93ea, 0x15e21445, 0x7d8a5f40, 0x18f8b83c, + 0x7ce3ceb2, 0x1c0b826a, 0x7c29fbee, 0x1f19f97b, 0x7b5d039e, 0x2223a4c5, 0x7a7d055b, 0x25280c5e, 0x798a23b1, + 0x2826b928, 0x78848414, 0x2b1f34eb, 0x776c4edb, 0x2e110a62, 0x7641af3d, 0x30fbc54d, 0x7504d345, 0x33def287, + 0x73b5ebd1, 0x36ba2014, 0x72552c85, 0x398cdd32, 0x70e2cbc6, 0x3c56ba70, 0x6f5f02b2, 0x3f1749b8, 0x6dca0d14, + 0x41ce1e65, 0x6c242960, 0x447acd50, 0x6a6d98a4, 0x471cece7, 0x68a69e81, 0x49b41533, 0x66cf8120, 0x4c3fdff4, + 0x64e88926, 0x4ebfe8a5, 0x62f201ac, 0x5133cc94, 0x60ec3830, 0x539b2af0, 0x5ed77c8a, 0x55f5a4d2, 0x5cb420e0, + 0x5842dd54, 0x5a82799a, 0x5a82799a, +}; + +const Word32 RealFFT384_twid[98] = { + 0x7fffffff, 0x00000000, 0x7ffb9d15, 0x02182427, 0x7fee74a2, 0x0430238f, 0x7fd8878e, 0x0647d97c, 0x7fb9d759, + 0x085f2137, 0x7f92661d, 0x0a75d60e, 0x7f62368f, 0x0c8bd35e, 0x7f294bfd, 0x0ea0f48c, 0x7ee7aa4c, 0x10b5150f, + 0x7e9d55fc, 0x12c8106f, 0x7e4a5426, 0x14d9c245, 0x7deeaa7a, 0x16ea0646, 0x7d8a5f40, 0x18f8b83c, 0x7d1d7958, + 0x1b05b40f, 0x7ca80038, 0x1d10d5c2, 0x7c29fbee, 0x1f19f97b, 0x7ba3751d, 0x2120fb83, 0x7b1474fd, 0x2325b847, + 0x7a7d055b, 0x25280c5e, 0x79dd3098, 0x2727d486, 0x793501a9, 0x2924edac, 0x78848414, 0x2b1f34eb, 0x77cbc3f2, + 0x2d168792, 0x770acdec, 0x2f0ac320, 0x7641af3d, 0x30fbc54d, 0x757075ac, 0x32e96c09, 0x74972f92, 0x34d3957e, + 0x73b5ebd1, 0x36ba2014, 0x72ccb9db, 0x389cea72, 0x71dba9ab, 0x3a7bd382, 0x70e2cbc6, 0x3c56ba70, 0x6fe2313c, + 0x3e2d7eb1, 0x6ed9eba1, 0x40000000, 0x6dca0d14, 0x41ce1e65, 0x6cb2a837, 0x4397ba32, 0x6b93d02e, 0x455cb40c, + 0x6a6d98a4, 0x471cece7, 0x694015c3, 0x48d84609, 0x680b5c33, 0x4a8ea111, 0x66cf8120, 0x4c3fdff4, 0x658c9a2d, + 0x4debe4fe, 0x6442bd7e, 0x4f9292dc, 0x62f201ac, 0x5133cc94, 0x619a7dce, 0x52cf758f, 0x603c496c, 0x54657194, + 0x5ed77c8a, 0x55f5a4d2, 0x5d6c2f99, 0x577ff3da, 0x5bfa7b82, 0x590443a7, 0x5a82799a, 0x5a82799a, +}; + +const Word32 RealFFT512_twid[130] = { + 0x7fffffff, 0x00000000, 0x7ffd885a, 0x01921d20, 0x7ff62182, 0x03242abf, 0x7fe9cbc0, 0x04b6195d, 0x7fd8878e, + 0x0647d97c, 0x7fc25596, 0x07d95b9e, 0x7fa736b4, 0x096a9049, 0x7f872bf3, 0x0afb6805, 0x7f62368f, 0x0c8bd35e, + 0x7f3857f6, 0x0e1bc2e4, 0x7f0991c4, 0x0fab272b, 0x7ed5e5c6, 0x1139f0cf, 0x7e9d55fc, 0x12c8106f, 0x7e5fe493, + 0x145576b1, 0x7e1d93ea, 0x15e21445, 0x7dd6668f, 0x176dd9de, 0x7d8a5f40, 0x18f8b83c, 0x7d3980ec, 0x1a82a026, + 0x7ce3ceb2, 0x1c0b826a, 0x7c894bde, 0x1d934fe5, 0x7c29fbee, 0x1f19f97b, 0x7bc5e290, 0x209f701c, 0x7b5d039e, + 0x2223a4c5, 0x7aef6323, 0x23a6887f, 0x7a7d055b, 0x25280c5e, 0x7a05eead, 0x26a82186, 0x798a23b1, 0x2826b928, + 0x7909a92d, 0x29a3c485, 0x78848414, 0x2b1f34eb, 0x77fab989, 0x2c98fbba, 0x776c4edb, 0x2e110a62, 0x76d94989, + 0x2f875262, 0x7641af3d, 0x30fbc54d, 0x75a585cf, 0x326e54c7, 0x7504d345, 0x33def287, 0x745f9dd1, 0x354d9057, + 0x73b5ebd1, 0x36ba2014, 0x7307c3d0, 0x382493b0, 0x72552c85, 0x398cdd32, 0x719e2cd2, 0x3af2eeb7, 0x70e2cbc6, + 0x3c56ba70, 0x7023109a, 0x3db832a6, 0x6f5f02b2, 0x3f1749b8, 0x6e96a99d, 0x4073f21d, 0x6dca0d14, 0x41ce1e65, + 0x6cf934fc, 0x4325c135, 0x6c242960, 0x447acd50, 0x6b4af279, 0x45cd358f, 0x6a6d98a4, 0x471cece7, 0x698c246c, + 0x4869e665, 0x68a69e81, 0x49b41533, 0x67bd0fbd, 0x4afb6c98, 0x66cf8120, 0x4c3fdff4, 0x65ddfbd3, 0x4d8162c4, + 0x64e88926, 0x4ebfe8a5, 0x63ef3290, 0x4ffb654d, 0x62f201ac, 0x5133cc94, 0x61f1003f, 0x5269126e, 0x60ec3830, + 0x539b2af0, 0x5fe3b38d, 0x54ca0a4b, 0x5ed77c8a, 0x55f5a4d2, 0x5dc79d7c, 0x571deefa, 0x5cb420e0, 0x5842dd54, + 0x5b9d1154, 0x59646498, 0x5a82799a, 0x5a82799a, +}; + +const Word32 RealFFT768_twid[194] = { + 0x7fffffff, 0x00000000, 0x7ffee744, 0x010c1460, 0x7ffb9d15, 0x02182427, 0x7ff62182, 0x03242abf, 0x7fee74a2, + 0x0430238f, 0x7fe49698, 0x053c0a01, 0x7fd8878e, 0x0647d97c, 0x7fca47b9, 0x07538d6b, 0x7fb9d759, 0x085f2137, + 0x7fa736b4, 0x096a9049, 0x7f92661d, 0x0a75d60e, 0x7f7b65ef, 0x0b80edf1, 0x7f62368f, 0x0c8bd35e, 0x7f46d86c, + 0x0d9681c2, 0x7f294bfd, 0x0ea0f48c, 0x7f0991c4, 0x0fab272b, 0x7ee7aa4c, 0x10b5150f, 0x7ec3962a, 0x11beb9aa, + 0x7e9d55fc, 0x12c8106f, 0x7e74ea6a, 0x13d114d0, 0x7e4a5426, 0x14d9c245, 0x7e1d93ea, 0x15e21445, 0x7deeaa7a, + 0x16ea0646, 0x7dbd98a4, 0x17f193c5, 0x7d8a5f40, 0x18f8b83c, 0x7d54ff2e, 0x19ff6f2a, 0x7d1d7958, 0x1b05b40f, + 0x7ce3ceb2, 0x1c0b826a, 0x7ca80038, 0x1d10d5c2, 0x7c6a0ef2, 0x1e15a99a, 0x7c29fbee, 0x1f19f97b, 0x7be7c847, + 0x201dc0ef, 0x7ba3751d, 0x2120fb83, 0x7b5d039e, 0x2223a4c5, 0x7b1474fd, 0x2325b847, 0x7ac9ca7a, 0x2427319d, + 0x7a7d055b, 0x25280c5e, 0x7a2e26f2, 0x26284422, 0x79dd3098, 0x2727d486, 0x798a23b1, 0x2826b928, 0x793501a9, + 0x2924edac, 0x78ddcbf5, 0x2a226db5, 0x78848414, 0x2b1f34eb, 0x78292b8d, 0x2c1b3efb, 0x77cbc3f2, 0x2d168792, + 0x776c4edb, 0x2e110a62, 0x770acdec, 0x2f0ac320, 0x76a742d1, 0x3003ad85, 0x7641af3d, 0x30fbc54d, 0x75da14ef, + 0x31f30638, 0x757075ac, 0x32e96c09, 0x7504d345, 0x33def287, 0x74972f92, 0x34d3957e, 0x74278c72, 0x35c750bc, + 0x73b5ebd1, 0x36ba2014, 0x73424fa0, 0x37abff5d, 0x72ccb9db, 0x389cea72, 0x72552c85, 0x398cdd32, 0x71dba9ab, + 0x3a7bd382, 0x71603361, 0x3b69c947, 0x70e2cbc6, 0x3c56ba70, 0x706374ff, 0x3d42a2ec, 0x6fe2313c, 0x3e2d7eb1, + 0x6f5f02b2, 0x3f1749b8, 0x6ed9eba1, 0x40000000, 0x6e52ee52, 0x40e79d8c, 0x6dca0d14, 0x41ce1e65, 0x6d3f4a40, + 0x42b37e96, 0x6cb2a837, 0x4397ba32, 0x6c242960, 0x447acd50, 0x6b93d02e, 0x455cb40c, 0x6b019f1a, 0x463d6a87, + 0x6a6d98a4, 0x471cece7, 0x69d7bf57, 0x47fb3757, 0x694015c3, 0x48d84609, 0x68a69e81, 0x49b41533, 0x680b5c33, + 0x4a8ea111, 0x676e5183, 0x4b67e5e4, 0x66cf8120, 0x4c3fdff4, 0x662eedc3, 0x4d168b8b, 0x658c9a2d, 0x4debe4fe, + 0x64e88926, 0x4ebfe8a5, 0x6442bd7e, 0x4f9292dc, 0x639b3a0b, 0x5063e008, 0x62f201ac, 0x5133cc94, 0x62471749, + 0x520254ef, 0x619a7dce, 0x52cf758f, 0x60ec3830, 0x539b2af0, 0x603c496c, 0x54657194, 0x5f8ab487, 0x552e4605, + 0x5ed77c8a, 0x55f5a4d2, 0x5e22a487, 0x56bb8a90, 0x5d6c2f99, 0x577ff3da, 0x5cb420e0, 0x5842dd54, 0x5bfa7b82, + 0x590443a7, 0x5b3f42ae, 0x59c42381, 0x5a82799a, 0x5a82799a, +}; + +const Word32 RotVector_32_32[2 * 20] = { + 0x7d8a5f00, 0xe70747c0, 0x7641b000, 0xcf043ac0, 0x6a6d9900, 0xb8e31300, 0x5a827980, 0xa57d8680, + 0x471ced80, 0x95926780, 0x30fbc600, 0x89be5100, 0x18f8b800, 0x8275a100, 0x7641b000, 0xcf043ac0, + 0x5a827980, 0xa57d8680, 0x30fbc600, 0x89be5100, 0xcf043b00, 0x89be5100, 0xa57d8680, 0xa57d8680, + 0x89be5100, 0xcf043ac0, 0x6a6d9900, 0xb8e31300, 0x30fbc600, 0x89be5100, 0xe7074800, 0x8275a100, + 0xa57d8680, 0xa57d8680, 0x8275a100, 0xe70747c0, 0x89be5000, 0x30fbc540, 0xb8e31280, 0x6a6d9880, +}; + +const Word32 RotVector_40_32[2 * 28] = { + 0x7e6c9251, 0x14060b68, 0x79bc384d, 0x278dde6e, 0x720c8075, 0x3a1c5c57, 0x678dde6e, 0x4b3c8c12, + 0x79bc384d, 0x278dde6e, 0x678dde6e, 0x4b3c8c12, 0x4b3c8c12, 0x678dde6e, 0x278dde6e, 0x79bc384d, + 0x720c8075, 0x3a1c5c57, 0x4b3c8c12, 0x678dde6e, 0x14060b68, 0x7e6c9251, 0xd8722192, 0x79bc384d, + 0x678dde6e, 0x4b3c8c12, 0x278dde6e, 0x79bc384d, 0xd8722192, 0x79bc384d, 0x98722192, 0x4b3c8c12, + 0x5a82799a, 0x5a82799a, 0x00000000, 0x7fffffff, 0xa57d8666, 0x5a82799a, 0x80000000, 0x00000000, + 0x4b3c8c12, 0x678dde6e, 0xd8722192, 0x79bc384d, 0x8643c7b3, 0x278dde6e, 0x98722192, 0xb4c373ee, + 0x3a1c5c57, 0x720c8075, 0xb4c373ee, 0x678dde6e, 0x81936daf, 0xebf9f498, 0xd8722192, 0x8643c7b3, +}; + +#ifdef ENABLE_HR_MODE +const Word32 RotVector_480[2 * (480 - 30)] = { +#else +const Word16 RotVector_480[2 * (480 - 30)] = { +#endif + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ff4c56f), SHC(0xfca63bd8), SHC(0x7fd317b4), SHC(0xf94d0e2e), + SHC(0x7f9afcb9), SHC(0xf5f50d67), SHC(0x7f4c7e54), SHC(0xf29ecfb2), SHC(0x7ee7aa4c), SHC(0xef4aeaf1), + SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7ddb4bfc), SHC(0xe8ac819d), SHC(0x7d33f0ca), SHC(0xe5632654), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x7aba9ae6), SHC(0xdba5629b), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x78a879f4), SHC(0xd545d11c), SHC(0x777f903c), SHC(0xd220ffc0), + SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x7387ea23), SHC(0xc8e5032b), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x707d1443), SHC(0xc2ec7635), SHC(0x6ed9eba1), SHC(0xc0000000), + SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x6b598ea3), SHC(0xba4944a2), SHC(0x697cf78a), SHC(0xb780001c), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x658c9a2d), SHC(0xb2141b02), SHC(0x637984d4), SHC(0xaf726def), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x5f1f5ea1), SHC(0xaa59eda4), SHC(0x5cd91140), SHC(0xa7e3ff4d), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fd317b4), SHC(0xf94d0e2e), SHC(0x7f4c7e54), SHC(0xf29ecfb2), + SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7ba3751d), SHC(0xdedf047d), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x74ef0ebc), SHC(0xcbf00dbe), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x6b598ea3), SHC(0xba4944a2), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x637984d4), SHC(0xaf726def), SHC(0x5f1f5ea1), SHC(0xaa59eda4), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x508d9211), SHC(0x9c867b2c), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x45b6bb5e), SHC(0x94a6715d), SHC(0x40000000), SHC(0x9126145f), + SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x340ff242), SHC(0x8b10f144), SHC(0x2ddf0040), SHC(0x88806fc4), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x2120fb83), SHC(0x845c8ae3), SHC(0x1a9cd9ac), SHC(0x82cc0f36), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x0d61304e), SHC(0x80b381ac), SHC(0x06b2f1d2), SHC(0x802ce84c), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f9afcb9), SHC(0xf5f50d67), SHC(0x7e6c9251), SHC(0xebf9f498), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x79bc384d), SHC(0xd8722192), SHC(0x7641af3d), SHC(0xcf043ab3), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x678dde6e), SHC(0xb4c373ee), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x53211d18), SHC(0x9eab046f), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x42e13ba4), SHC(0x92dcafe5), SHC(0x3a1c5c57), SHC(0x8df37f8b), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x1de189a6), SHC(0x838961e8), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x0a0af299), SHC(0x80650347), SHC(0x00000000), SHC(0x80000000), + SHC(0xf5f50d67), SHC(0x80650347), SHC(0xebf9f498), SHC(0x81936daf), SHC(0xe21e765a), SHC(0x838961e8), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xc5e3a3a9), SHC(0x8df37f8b), + SHC(0xbd1ec45c), SHC(0x92dcafe5), SHC(0xb4c373ee), SHC(0x98722192), SHC(0xacdee2e8), SHC(0x9eab046f), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f4c7e54), SHC(0xf29ecfb2), SHC(0x7d33f0ca), SHC(0xe5632654), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x6ed9eba1), SHC(0xc0000000), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x5f1f5ea1), SHC(0xaa59eda4), SHC(0x55a6125c), SHC(0xa0e0a15f), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x40000000), SHC(0x9126145f), SHC(0x340ff242), SHC(0x8b10f144), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x1a9cd9ac), SHC(0x82cc0f36), SHC(0x0d61304e), SHC(0x80b381ac), + SHC(0x00000000), SHC(0x80000000), SHC(0xf29ecfb2), SHC(0x80b381ac), SHC(0xe5632654), SHC(0x82cc0f36), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xcbf00dbe), SHC(0x8b10f144), SHC(0xc0000000), SHC(0x9126145f), + SHC(0xb4c373ee), SHC(0x98722192), SHC(0xaa59eda4), SHC(0xa0e0a15f), SHC(0xa0e0a15f), SHC(0xaa59eda4), + SHC(0x98722192), SHC(0xb4c373ee), SHC(0x9126145f), SHC(0xc0000000), SHC(0x8b10f144), SHC(0xcbf00dbe), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x82cc0f36), SHC(0xe5632654), SHC(0x80b381ac), SHC(0xf29ecfb2), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ee7aa4c), SHC(0xef4aeaf1), SHC(0x7ba3751d), SHC(0xdedf047d), + SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x658c9a2d), SHC(0xb2141b02), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x4debe4fe), SHC(0x9a7365d3), SHC(0x40000000), SHC(0x9126145f), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x2120fb83), SHC(0x845c8ae3), SHC(0x10b5150f), SHC(0x811855b4), + SHC(0x00000000), SHC(0x80000000), SHC(0xef4aeaf1), SHC(0x811855b4), SHC(0xdedf047d), SHC(0x845c8ae3), + SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xc0000000), SHC(0x9126145f), SHC(0xb2141b02), SHC(0x9a7365d3), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x9a7365d3), SHC(0xb2141b02), SHC(0x9126145f), SHC(0xc0000000), + SHC(0x89be50c3), SHC(0xcf043ab3), SHC(0x845c8ae3), SHC(0xdedf047d), SHC(0x811855b4), SHC(0xef4aeaf1), + SHC(0x80000000), SHC(0x00000000), SHC(0x811855b4), SHC(0x10b5150f), SHC(0x845c8ae3), SHC(0x2120fb83), + SHC(0x89be50c3), SHC(0x30fbc54d), SHC(0x9126145f), SHC(0x40000000), SHC(0x9a7365d3), SHC(0x4debe4fe), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x79bc384d), SHC(0xd8722192), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x5a82799a), SHC(0xa57d8666), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x278dde6e), SHC(0x8643c7b3), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x00000000), SHC(0x80000000), SHC(0xebf9f498), SHC(0x81936daf), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xc5e3a3a9), SHC(0x8df37f8b), SHC(0xb4c373ee), SHC(0x98722192), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x98722192), SHC(0xb4c373ee), SHC(0x8df37f8b), SHC(0xc5e3a3a9), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x81936daf), SHC(0xebf9f498), SHC(0x80000000), SHC(0x00000000), + SHC(0x81936daf), SHC(0x14060b68), SHC(0x8643c7b3), SHC(0x278dde6e), SHC(0x8df37f8b), SHC(0x3a1c5c57), + SHC(0x98722192), SHC(0x4b3c8c12), SHC(0xa57d8666), SHC(0x5a82799a), SHC(0xb4c373ee), SHC(0x678dde6e), + SHC(0xc5e3a3a9), SHC(0x720c8075), SHC(0xd8722192), SHC(0x79bc384d), SHC(0xebf9f498), SHC(0x7e6c9251), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ddb4bfc), SHC(0xe8ac819d), SHC(0x777f903c), SHC(0xd220ffc0), + SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x5f1f5ea1), SHC(0xaa59eda4), SHC(0x4debe4fe), SHC(0x9a7365d3), + SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x245a9d65), SHC(0x8545651a), SHC(0x0d61304e), SHC(0x80b381ac), + SHC(0xf5f50d67), SHC(0x80650347), SHC(0xdedf047d), SHC(0x845c8ae3), SHC(0xc8e5032b), SHC(0x8c7815dd), + SHC(0xb4c373ee), SHC(0x98722192), SHC(0xa326eec0), SHC(0xa7e3ff4d), SHC(0x94a6715d), SHC(0xba4944a2), + SHC(0x89be50c3), SHC(0xcf043ab3), SHC(0x82cc0f36), SHC(0xe5632654), SHC(0x800b3a91), SHC(0xfca63bd8), + SHC(0x81936daf), SHC(0x14060b68), SHC(0x8757860c), SHC(0x2aba2ee4), SHC(0x9126145f), SHC(0x40000000), + SHC(0x9eab046f), SHC(0x53211d18), SHC(0xaf726def), SHC(0x637984d4), SHC(0xc2ec7635), SHC(0x707d1443), + SHC(0xd8722192), SHC(0x79bc384d), SHC(0xef4aeaf1), SHC(0x7ee7aa4c), SHC(0x06b2f1d2), SHC(0x7fd317b4), + SHC(0x1de189a6), SHC(0x7c769e18), SHC(0x340ff242), SHC(0x74ef0ebc), SHC(0x487fffe4), SHC(0x697cf78a), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ffd3154), SHC(0xfe531484), SHC(0x7ff4c56f), SHC(0xfca63bd8), + SHC(0x7fe6bcb0), SHC(0xfaf988cc), SHC(0x7fd317b4), SHC(0xf94d0e2e), SHC(0x7fb9d759), SHC(0xf7a0dec9), + SHC(0x7f9afcb9), SHC(0xf5f50d67), SHC(0x7f76892f), SHC(0xf449acca), SHC(0x7f4c7e54), SHC(0xf29ecfb2), + SHC(0x7f1cde01), SHC(0xf0f488d9), SHC(0x7ee7aa4c), SHC(0xef4aeaf1), SHC(0x7eace58a), SHC(0xeda208a5), + SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7e26b371), SHC(0xea52c166), SHC(0x7ddb4bfc), SHC(0xe8ac819d), + SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7cd80464), SHC(0xe3c02fbb), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x7c0fc22a), SHC(0xe07e0c84), SHC(0x7ba3751d), SHC(0xdedf047d), + SHC(0x7b31bbb2), SHC(0xdd417079), SHC(0x7aba9ae6), SHC(0xdba5629b), SHC(0x7a3e17f2), SHC(0xda0aecf9), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x793501a9), SHC(0xd6db1254), SHC(0x78a879f4), SHC(0xd545d11c), + SHC(0x7816a759), SHC(0xd3b26fb0), SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x76e33b3f), SHC(0xd09192ea), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fe6bcb0), SHC(0xfaf988cc), SHC(0x7f9afcb9), SHC(0xf5f50d67), + SHC(0x7f1cde01), SHC(0xf0f488d9), SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7d8a5f40), SHC(0xe70747c4), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x7b31bbb2), SHC(0xdd417079), SHC(0x79bc384d), SHC(0xd8722192), + SHC(0x7816a759), SHC(0xd3b26fb0), SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x743e0918), SHC(0xca695b94), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6fadf2fc), SHC(0xc174dbf2), SHC(0x6d23501b), SHC(0xbd1ec45c), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x648543e4), SHC(0xb0c1878b), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x5dfe47ad), SHC(0xa91d0ea3), SHC(0x5a82799a), SHC(0xa57d8666), + SHC(0x56e2f15d), SHC(0xa201b853), SHC(0x53211d18), SHC(0x9eab046f), SHC(0x4f3e7875), SHC(0x9b7abc1c), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x471cece7), SHC(0x9592675c), SHC(0x42e13ba4), SHC(0x92dcafe5), + SHC(0x3e8b240e), SHC(0x90520d04), SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x3596a46c), SHC(0x8bc1f6e8), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fb9d759), SHC(0xf7a0dec9), SHC(0x7ee7aa4c), SHC(0xef4aeaf1), + SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x793501a9), SHC(0xd6db1254), + SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x72ccb9db), SHC(0xc763158e), SHC(0x6ed9eba1), SHC(0xc0000000), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x658c9a2d), SHC(0xb2141b02), SHC(0x603c496c), SHC(0xab9a8e6c), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x54657194), SHC(0x9fc3b694), SHC(0x4debe4fe), SHC(0x9a7365d3), + SHC(0x471cece7), SHC(0x9592675c), SHC(0x40000000), SHC(0x9126145f), SHC(0x389cea72), SHC(0x8d334625), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x2924edac), SHC(0x86cafe57), SHC(0x2120fb83), SHC(0x845c8ae3), + SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x10b5150f), SHC(0x811855b4), SHC(0x085f2137), SHC(0x804628a7), + SHC(0x00000000), SHC(0x80000000), SHC(0xf7a0dec9), SHC(0x804628a7), SHC(0xef4aeaf1), SHC(0x811855b4), + SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xdedf047d), SHC(0x845c8ae3), SHC(0xd6db1254), SHC(0x86cafe57), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f76892f), SHC(0xf449acca), SHC(0x7ddb4bfc), SHC(0xe8ac819d), + SHC(0x7b31bbb2), SHC(0xdd417079), SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x72ccb9db), SHC(0xc763158e), + SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x668f7c25), SHC(0xb36a1978), SHC(0x5f1f5ea1), SHC(0xaa59eda4), + SHC(0x56e2f15d), SHC(0xa201b853), SHC(0x4debe4fe), SHC(0x9a7365d3), SHC(0x444d7aff), SHC(0x93bf30d4), + SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x2f6e6d16), SHC(0x891cc4c1), SHC(0x245a9d65), SHC(0x8545651a), + SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x0d61304e), SHC(0x80b381ac), SHC(0x01aceb7c), SHC(0x8002ceac), + SHC(0xf5f50d67), SHC(0x80650347), SHC(0xea52c166), SHC(0x81d94c8f), SHC(0xdedf047d), SHC(0x845c8ae3), + SHC(0xd3b26fb0), SHC(0x87e958a7), SHC(0xc8e5032b), SHC(0x8c7815dd), SHC(0xbe8df2ba), SHC(0x91fef880), + SHC(0xb4c373ee), SHC(0x98722192), SHC(0xab9a8e6c), SHC(0x9fc3b694), SHC(0xa326eec0), SHC(0xa7e3ff4d), + SHC(0x9b7abc1c), SHC(0xb0c1878b), SHC(0x94a6715d), SHC(0xba4944a2), SHC(0x8eb8b9a0), SHC(0xc466be4f), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f1cde01), SHC(0xf0f488d9), SHC(0x7c769e18), SHC(0xe21e765a), + SHC(0x7816a759), SHC(0xd3b26fb0), SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6a6d98a4), SHC(0xb8e31319), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x56e2f15d), SHC(0xa201b853), SHC(0x4b3c8c12), SHC(0x98722192), + SHC(0x3e8b240e), SHC(0x90520d04), SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x22be8f87), SHC(0x84ce444e), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x05067734), SHC(0x80194350), SHC(0xf5f50d67), SHC(0x80650347), + SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xca695b94), SHC(0x8bc1f6e8), + SHC(0xbd1ec45c), SHC(0x92dcafe5), SHC(0xb0c1878b), SHC(0x9b7abc1c), SHC(0xa57d8666), SHC(0xa57d8666), + SHC(0x9b7abc1c), SHC(0xb0c1878b), SHC(0x92dcafe5), SHC(0xbd1ec45c), SHC(0x8bc1f6e8), SHC(0xca695b94), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x8275a0c0), SHC(0xe70747c4), SHC(0x80650347), SHC(0xf5f50d67), + SHC(0x80194350), SHC(0x05067734), SHC(0x81936daf), SHC(0x14060b68), SHC(0x84ce444e), SHC(0x22be8f87), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7eace58a), SHC(0xeda208a5), SHC(0x7aba9ae6), SHC(0xdba5629b), + SHC(0x743e0918), SHC(0xca695b94), SHC(0x6b598ea3), SHC(0xba4944a2), SHC(0x603c496c), SHC(0xab9a8e6c), + SHC(0x53211d18), SHC(0x9eab046f), SHC(0x444d7aff), SHC(0x93bf30d4), SHC(0x340ff242), SHC(0x8b10f144), + SHC(0x22be8f87), SHC(0x84ce444e), SHC(0x10b5150f), SHC(0x811855b4), SHC(0xfe531484), SHC(0x8002ceac), + SHC(0xebf9f498), SHC(0x81936daf), SHC(0xda0aecf9), SHC(0x85c1e80e), SHC(0xc8e5032b), SHC(0x8c7815dd), + SHC(0xb8e31319), SHC(0x9592675c), SHC(0xaa59eda4), SHC(0xa0e0a15f), SHC(0x9d969742), SHC(0xae26dcdf), + SHC(0x92dcafe5), SHC(0xbd1ec45c), SHC(0x8a650cb4), SHC(0xcd790887), SHC(0x845c8ae3), SHC(0xdedf047d), + SHC(0x80e321ff), SHC(0xf0f488d9), SHC(0x800b3a91), SHC(0x0359c428), SHC(0x81d94c8f), SHC(0x15ad3e9a), + SHC(0x8643c7b3), SHC(0x278dde6e), SHC(0x8d334625), SHC(0x389cea72), SHC(0x96830876), SHC(0x487fffe4), + SHC(0xa201b853), SHC(0x56e2f15d), SHC(0xaf726def), SHC(0x637984d4), SHC(0xbe8df2ba), SHC(0x6e010780), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e26b371), SHC(0xea52c166), SHC(0x78a879f4), SHC(0xd545d11c), + SHC(0x6fadf2fc), SHC(0xc174dbf2), SHC(0x637984d4), SHC(0xaf726def), SHC(0x54657194), SHC(0x9fc3b694), + SHC(0x42e13ba4), SHC(0x92dcafe5), SHC(0x2f6e6d16), SHC(0x891cc4c1), SHC(0x1a9cd9ac), SHC(0x82cc0f36), + SHC(0x05067734), SHC(0x80194350), SHC(0xef4aeaf1), SHC(0x811855b4), SHC(0xda0aecf9), SHC(0x85c1e80e), + SHC(0xc5e3a3a9), SHC(0x8df37f8b), SHC(0xb36a1978), SHC(0x997083db), SHC(0xa326eec0), SHC(0xa7e3ff4d), + SHC(0x9592675c), SHC(0xb8e31319), SHC(0x8b10f144), SHC(0xcbf00dbe), SHC(0x83f03dd6), SHC(0xe07e0c84), + SHC(0x80650347), SHC(0xf5f50d67), SHC(0x808976d1), SHC(0x0bb65336), SHC(0x845c8ae3), SHC(0x2120fb83), + SHC(0x8bc1f6e8), SHC(0x3596a46c), SHC(0x96830876), SHC(0x487fffe4), SHC(0xa45037c9), SHC(0x595132a2), + SHC(0xb4c373ee), SHC(0x678dde6e), SHC(0xc763158e), SHC(0x72ccb9db), SHC(0xdba5629b), SHC(0x7aba9ae6), + SHC(0xf0f488d9), SHC(0x7f1cde01), SHC(0x06b2f1d2), SHC(0x7fd317b4), SHC(0x1c3fd045), SHC(0x7cd80464), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7641af3d), SHC(0xcf043ab3), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x471cece7), SHC(0x9592675c), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x00000000), SHC(0x80000000), + SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xb8e31319), SHC(0x9592675c), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x9592675c), SHC(0xb8e31319), SHC(0x89be50c3), SHC(0xcf043ab3), + SHC(0x8275a0c0), SHC(0xe70747c4), SHC(0x80000000), SHC(0x00000000), SHC(0x8275a0c0), SHC(0x18f8b83c), + SHC(0x89be50c3), SHC(0x30fbc54d), SHC(0x9592675c), SHC(0x471cece7), SHC(0xa57d8666), SHC(0x5a82799a), + SHC(0xb8e31319), SHC(0x6a6d98a4), SHC(0xcf043ab3), SHC(0x7641af3d), SHC(0xe70747c4), SHC(0x7d8a5f40), + SHC(0x00000000), SHC(0x7fffffff), SHC(0x18f8b83c), SHC(0x7d8a5f40), SHC(0x30fbc54d), SHC(0x7641af3d), + SHC(0x471cece7), SHC(0x6a6d98a4), SHC(0x5a82799a), SHC(0x5a82799a), SHC(0x6a6d98a4), SHC(0x471cece7)}; + +#ifdef ENABLE_HR_MODE +const Word32 RotVector_720[2 * (720 - 30)] = { + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ffb0260), SHC(0xfdc41e9b), SHC(0x7fec09e3), SHC(0xfb8869ce), + SHC(0x7fd317b4), SHC(0xf94d0e2e), SHC(0x7fb02dc6), SHC(0xf7123849), SHC(0x7f834ed0), SHC(0xf4d814a4), + SHC(0x7f4c7e54), SHC(0xf29ecfb2), SHC(0x7f0bc097), SHC(0xf06695da), SHC(0x7ec11aa5), SHC(0xee2f9369), + SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7e0e2e32), SHC(0xe9c5e582), SHC(0x7da5f5a5), SHC(0xe7939223), + SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7cb82885), SHC(0xe334cdc9), SHC(0x7c32a67e), SHC(0xe108b40d), + SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x7b0a9f8d), SHC(0xdcb7ea46), SHC(0x7a6831ba), SHC(0xda939061), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x7906c0b0), SHC(0xd653c860), SHC(0x7847d909), SHC(0xd438af17), + SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x76adf5e6), SHC(0xd00ce422), SHC(0x75d31a61), SHC(0xcdfc85bb), + SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x7401e4c1), SHC(0xc9e7a512), SHC(0x730baeed), SHC(0xc7e3744b), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x71046d3e), SHC(0xc3e85b18), SHC(0x6ff389df), SHC(0xc1f1c224), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fec09e3), SHC(0xfb8869ce), SHC(0x7fb02dc6), SHC(0xf7123849), + SHC(0x7f4c7e54), SHC(0xf29ecfb2), SHC(0x7ec11aa5), SHC(0xee2f9369), SHC(0x7e0e2e32), SHC(0xe9c5e582), + SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7c32a67e), SHC(0xe108b40d), SHC(0x7b0a9f8d), SHC(0xdcb7ea46), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x7847d909), SHC(0xd438af17), SHC(0x76adf5e6), SHC(0xd00ce422), + SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x730baeed), SHC(0xc7e3744b), SHC(0x71046d3e), SHC(0xc3e85b18), + SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x6c8cd70b), SHC(0xbc2b9b05), SHC(0x6a1de737), SHC(0xb86c5df0), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x64dd8950), SHC(0xb1320139), SHC(0x620dbe8b), SHC(0xadb922b7), + SHC(0x5f1f5ea1), SHC(0xaa59eda4), SHC(0x5c13539b), SHC(0xa7156f3c), SHC(0x58ea90c4), SHC(0xa3ecac65), + SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x5246dd49), SHC(0x9df24175), SHC(0x4ecdfec7), SHC(0x9b2276b0), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x4793a210), SHC(0x95e218c9), SHC(0x43d464fb), SHC(0x937328f5), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fd317b4), SHC(0xf94d0e2e), SHC(0x7f4c7e54), SHC(0xf29ecfb2), + SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7ba3751d), SHC(0xdedf047d), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x74ef0ebc), SHC(0xcbf00dbe), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x6b598ea3), SHC(0xba4944a2), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x637984d4), SHC(0xaf726def), SHC(0x5f1f5ea1), SHC(0xaa59eda4), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x508d9211), SHC(0x9c867b2c), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x45b6bb5e), SHC(0x94a6715d), SHC(0x40000000), SHC(0x9126145f), + SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x340ff242), SHC(0x8b10f144), SHC(0x2ddf0040), SHC(0x88806fc4), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x2120fb83), SHC(0x845c8ae3), SHC(0x1a9cd9ac), SHC(0x82cc0f36), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x0d61304e), SHC(0x80b381ac), SHC(0x06b2f1d2), SHC(0x802ce84c), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fb02dc6), SHC(0xf7123849), SHC(0x7ec11aa5), SHC(0xee2f9369), + SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7b0a9f8d), SHC(0xdcb7ea46), SHC(0x7847d909), SHC(0xd438af17), + SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x71046d3e), SHC(0xc3e85b18), SHC(0x6c8cd70b), SHC(0xbc2b9b05), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x620dbe8b), SHC(0xadb922b7), SHC(0x5c13539b), SHC(0xa7156f3c), + SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x4ecdfec7), SHC(0x9b2276b0), SHC(0x4793a210), SHC(0x95e218c9), + SHC(0x40000000), SHC(0x9126145f), SHC(0x381c8bb5), SHC(0x8cf45113), SHC(0x2ff31bde), SHC(0x89520a1a), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x1ef74bf3), SHC(0x83cd5982), SHC(0x163a1a7e), SHC(0x81f1d1ce), + SHC(0x0d61304e), SHC(0x80b381ac), SHC(0x04779632), SHC(0x8013f61d), SHC(0xfb8869ce), SHC(0x8013f61d), + SHC(0xf29ecfb2), SHC(0x80b381ac), SHC(0xe9c5e582), SHC(0x81f1d1ce), SHC(0xe108b40d), SHC(0x83cd5982), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xd00ce422), SHC(0x89520a1a), SHC(0xc7e3744b), SHC(0x8cf45113), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f834ed0), SHC(0xf4d814a4), SHC(0x7e0e2e32), SHC(0xe9c5e582), + SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x7847d909), SHC(0xd438af17), SHC(0x7401e4c1), SHC(0xc9e7a512), + SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x68d9f964), SHC(0xb6950c1e), SHC(0x620dbe8b), SHC(0xadb922b7), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x5246dd49), SHC(0x9df24175), SHC(0x496af3e2), SHC(0x9726069c), + SHC(0x40000000), SHC(0x9126145f), SHC(0x36185aee), SHC(0x8bfe1b3f), SHC(0x2bc750e9), SHC(0x87b826f7), + SHC(0x2120fb83), SHC(0x845c8ae3), SHC(0x163a1a7e), SHC(0x81f1d1ce), SHC(0x0b27eb5c), SHC(0x807cb130), + SHC(0x00000000), SHC(0x80000000), SHC(0xf4d814a4), SHC(0x807cb130), SHC(0xe9c5e582), SHC(0x81f1d1ce), + SHC(0xdedf047d), SHC(0x845c8ae3), SHC(0xd438af17), SHC(0x87b826f7), SHC(0xc9e7a512), SHC(0x8bfe1b3f), + SHC(0xc0000000), SHC(0x9126145f), SHC(0xb6950c1e), SHC(0x9726069c), SHC(0xadb922b7), SHC(0x9df24175), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x9df24175), SHC(0xadb922b7), SHC(0x9726069c), SHC(0xb6950c1e), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f4c7e54), SHC(0xf29ecfb2), SHC(0x7d33f0ca), SHC(0xe5632654), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x6ed9eba1), SHC(0xc0000000), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x5f1f5ea1), SHC(0xaa59eda4), SHC(0x55a6125c), SHC(0xa0e0a15f), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x40000000), SHC(0x9126145f), SHC(0x340ff242), SHC(0x8b10f144), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x1a9cd9ac), SHC(0x82cc0f36), SHC(0x0d61304e), SHC(0x80b381ac), + SHC(0x00000000), SHC(0x80000000), SHC(0xf29ecfb2), SHC(0x80b381ac), SHC(0xe5632654), SHC(0x82cc0f36), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xcbf00dbe), SHC(0x8b10f144), SHC(0xc0000000), SHC(0x9126145f), + SHC(0xb4c373ee), SHC(0x98722192), SHC(0xaa59eda4), SHC(0xa0e0a15f), SHC(0xa0e0a15f), SHC(0xaa59eda4), + SHC(0x98722192), SHC(0xb4c373ee), SHC(0x9126145f), SHC(0xc0000000), SHC(0x8b10f144), SHC(0xcbf00dbe), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x82cc0f36), SHC(0xe5632654), SHC(0x80b381ac), SHC(0xf29ecfb2), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f0bc097), SHC(0xf06695da), SHC(0x7c32a67e), SHC(0xe108b40d), + SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x71046d3e), SHC(0xc3e85b18), SHC(0x68d9f964), SHC(0xb6950c1e), + SHC(0x5f1f5ea1), SHC(0xaa59eda4), SHC(0x53f9be05), SHC(0x9f65ad2d), SHC(0x4793a210), SHC(0x95e218c9), + SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x2bc750e9), SHC(0x87b826f7), SHC(0x1ccb3237), SHC(0x8347d77b), + SHC(0x0d61304e), SHC(0x80b381ac), SHC(0xfdc41e9b), SHC(0x8004fda0), SHC(0xee2f9369), SHC(0x813ee55b), + SHC(0xdedf047d), SHC(0x845c8ae3), SHC(0xd00ce422), SHC(0x89520a1a), SHC(0xc1f1c224), SHC(0x900c7621), + SHC(0xb4c373ee), SHC(0x98722192), SHC(0xa8b4471a), SHC(0xa263007d), SHC(0x9df24175), SHC(0xadb922b7), + SHC(0x94a6715d), SHC(0xba4944a2), SHC(0x8cf45113), SHC(0xc7e3744b), SHC(0x86f93f50), SHC(0xd653c860), + SHC(0x82cc0f36), SHC(0xe5632654), SHC(0x807cb130), SHC(0xf4d814a4), SHC(0x8013f61d), SHC(0x04779632), + SHC(0x81936daf), SHC(0x14060b68), SHC(0x84f56073), SHC(0x234815ba), SHC(0x8a2ce59f), SHC(0x32037a45), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ec11aa5), SHC(0xee2f9369), SHC(0x7b0a9f8d), SHC(0xdcb7ea46), + SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x6c8cd70b), SHC(0xbc2b9b05), SHC(0x620dbe8b), SHC(0xadb922b7), + SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x4793a210), SHC(0x95e218c9), SHC(0x381c8bb5), SHC(0x8cf45113), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x163a1a7e), SHC(0x81f1d1ce), SHC(0x04779632), SHC(0x8013f61d), + SHC(0xf29ecfb2), SHC(0x80b381ac), SHC(0xe108b40d), SHC(0x83cd5982), SHC(0xd00ce422), SHC(0x89520a1a), + SHC(0xc0000000), SHC(0x9126145f), SHC(0xb1320139), SHC(0x9b2276b0), SHC(0xa3ecac65), SHC(0xa7156f3c), + SHC(0x98722192), SHC(0xb4c373ee), SHC(0x8efb92c2), SHC(0xc3e85b18), SHC(0x87b826f7), SHC(0xd438af17), + SHC(0x82cc0f36), SHC(0xe5632654), SHC(0x804fd23a), SHC(0xf7123849), SHC(0x804fd23a), SHC(0x08edc7b7), + SHC(0x82cc0f36), SHC(0x1a9cd9ac), SHC(0x87b826f7), SHC(0x2bc750e9), SHC(0x8efb92c2), SHC(0x3c17a4e8), + SHC(0x98722192), SHC(0x4b3c8c12), SHC(0xa3ecac65), SHC(0x58ea90c4), SHC(0xb1320139), SHC(0x64dd8950), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x79bc384d), SHC(0xd8722192), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x5a82799a), SHC(0xa57d8666), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x278dde6e), SHC(0x8643c7b3), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x00000000), SHC(0x80000000), SHC(0xebf9f498), SHC(0x81936daf), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xc5e3a3a9), SHC(0x8df37f8b), SHC(0xb4c373ee), SHC(0x98722192), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x98722192), SHC(0xb4c373ee), SHC(0x8df37f8b), SHC(0xc5e3a3a9), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x81936daf), SHC(0xebf9f498), SHC(0x80000000), SHC(0x00000000), + SHC(0x81936daf), SHC(0x14060b68), SHC(0x8643c7b3), SHC(0x278dde6e), SHC(0x8df37f8b), SHC(0x3a1c5c57), + SHC(0x98722192), SHC(0x4b3c8c12), SHC(0xa57d8666), SHC(0x5a82799a), SHC(0xb4c373ee), SHC(0x678dde6e), + SHC(0xc5e3a3a9), SHC(0x720c8075), SHC(0xd8722192), SHC(0x79bc384d), SHC(0xebf9f498), SHC(0x7e6c9251), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e0e2e32), SHC(0xe9c5e582), SHC(0x7847d909), SHC(0xd438af17), + SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x620dbe8b), SHC(0xadb922b7), SHC(0x5246dd49), SHC(0x9df24175), + SHC(0x40000000), SHC(0x9126145f), SHC(0x2bc750e9), SHC(0x87b826f7), SHC(0x163a1a7e), SHC(0x81f1d1ce), + SHC(0x00000000), SHC(0x80000000), SHC(0xe9c5e582), SHC(0x81f1d1ce), SHC(0xd438af17), SHC(0x87b826f7), + SHC(0xc0000000), SHC(0x9126145f), SHC(0xadb922b7), SHC(0x9df24175), SHC(0x9df24175), SHC(0xadb922b7), + SHC(0x9126145f), SHC(0xc0000000), SHC(0x87b826f7), SHC(0xd438af17), SHC(0x81f1d1ce), SHC(0xe9c5e582), + SHC(0x80000000), SHC(0x00000000), SHC(0x81f1d1ce), SHC(0x163a1a7e), SHC(0x87b826f7), SHC(0x2bc750e9), + SHC(0x9126145f), SHC(0x40000000), SHC(0x9df24175), SHC(0x5246dd49), SHC(0xadb922b7), SHC(0x620dbe8b), + SHC(0xc0000000), SHC(0x6ed9eba1), SHC(0xd438af17), SHC(0x7847d909), SHC(0xe9c5e582), SHC(0x7e0e2e32), + SHC(0x00000000), SHC(0x7fffffff), SHC(0x163a1a7e), SHC(0x7e0e2e32), SHC(0x2bc750e9), SHC(0x7847d909), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7da5f5a5), SHC(0xe7939223), SHC(0x76adf5e6), SHC(0xd00ce422), + SHC(0x6b598ea3), SHC(0xba4944a2), SHC(0x5c13539b), SHC(0xa7156f3c), SHC(0x496af3e2), SHC(0x9726069c), + SHC(0x340ff242), SHC(0x8b10f144), SHC(0x1ccb3237), SHC(0x8347d77b), SHC(0x04779632), SHC(0x8013f61d), + SHC(0xebf9f498), SHC(0x81936daf), SHC(0xd438af17), SHC(0x87b826f7), SHC(0xbe133b7c), SHC(0x92485786), + SHC(0xaa59eda4), SHC(0xa0e0a15f), SHC(0x99c64fc5), SHC(0xb2f7b9af), SHC(0x8cf45113), SHC(0xc7e3744b), + SHC(0x845c8ae3), SHC(0xdedf047d), SHC(0x804fd23a), SHC(0xf7123849), SHC(0x80f43f69), SHC(0x0f996a26), + SHC(0x8643c7b3), SHC(0x278dde6e), SHC(0x900c7621), SHC(0x3e0e3ddc), SHC(0x9df24175), SHC(0x5246dd49), + SHC(0xaf726def), SHC(0x637984d4), SHC(0xc3e85b18), SHC(0x71046d3e), SHC(0xda939061), SHC(0x7a6831ba), + SHC(0xf29ecfb2), SHC(0x7f4c7e54), SHC(0x0b27eb5c), SHC(0x7f834ed0), SHC(0x234815ba), SHC(0x7b0a9f8d), + SHC(0x3a1c5c57), SHC(0x720c8075), SHC(0x4ecdfec7), SHC(0x64dd8950), SHC(0x609a52d3), SHC(0x53f9be05), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f1cde01), SHC(0xf0f488d9), SHC(0x7c769e18), SHC(0xe21e765a), + SHC(0x7816a759), SHC(0xd3b26fb0), SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6a6d98a4), SHC(0xb8e31319), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x56e2f15d), SHC(0xa201b853), SHC(0x4b3c8c12), SHC(0x98722192), + SHC(0x3e8b240e), SHC(0x90520d04), SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x22be8f87), SHC(0x84ce444e), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x05067734), SHC(0x80194350), SHC(0xf5f50d67), SHC(0x80650347), + SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xca695b94), SHC(0x8bc1f6e8), + SHC(0xbd1ec45c), SHC(0x92dcafe5), SHC(0xb0c1878b), SHC(0x9b7abc1c), SHC(0xa57d8666), SHC(0xa57d8666), + SHC(0x9b7abc1c), SHC(0xb0c1878b), SHC(0x92dcafe5), SHC(0xbd1ec45c), SHC(0x8bc1f6e8), SHC(0xca695b94), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x8275a0c0), SHC(0xe70747c4), SHC(0x80650347), SHC(0xf5f50d67), + SHC(0x80194350), SHC(0x05067734), SHC(0x81936daf), SHC(0x14060b68), SHC(0x84ce444e), SHC(0x22be8f87), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7eace58a), SHC(0xeda208a5), SHC(0x7aba9ae6), SHC(0xdba5629b), + SHC(0x743e0918), SHC(0xca695b94), SHC(0x6b598ea3), SHC(0xba4944a2), SHC(0x603c496c), SHC(0xab9a8e6c), + SHC(0x53211d18), SHC(0x9eab046f), SHC(0x444d7aff), SHC(0x93bf30d4), SHC(0x340ff242), SHC(0x8b10f144), + SHC(0x22be8f87), SHC(0x84ce444e), SHC(0x10b5150f), SHC(0x811855b4), SHC(0xfe531484), SHC(0x8002ceac), + SHC(0xebf9f498), SHC(0x81936daf), SHC(0xda0aecf9), SHC(0x85c1e80e), SHC(0xc8e5032b), SHC(0x8c7815dd), + SHC(0xb8e31319), SHC(0x9592675c), SHC(0xaa59eda4), SHC(0xa0e0a15f), SHC(0x9d969742), SHC(0xae26dcdf), + SHC(0x92dcafe5), SHC(0xbd1ec45c), SHC(0x8a650cb4), SHC(0xcd790887), SHC(0x845c8ae3), SHC(0xdedf047d), + SHC(0x80e321ff), SHC(0xf0f488d9), SHC(0x800b3a91), SHC(0x0359c428), SHC(0x81d94c8f), SHC(0x15ad3e9a), + SHC(0x8643c7b3), SHC(0x278dde6e), SHC(0x8d334625), SHC(0x389cea72), SHC(0x96830876), SHC(0x487fffe4), + SHC(0xa201b853), SHC(0x56e2f15d), SHC(0xaf726def), SHC(0x637984d4), SHC(0xbe8df2ba), SHC(0x6e010780), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e26b371), SHC(0xea52c166), SHC(0x78a879f4), SHC(0xd545d11c), + SHC(0x6fadf2fc), SHC(0xc174dbf2), SHC(0x637984d4), SHC(0xaf726def), SHC(0x54657194), SHC(0x9fc3b694), + SHC(0x42e13ba4), SHC(0x92dcafe5), SHC(0x2f6e6d16), SHC(0x891cc4c1), SHC(0x1a9cd9ac), SHC(0x82cc0f36), + SHC(0x05067734), SHC(0x80194350), SHC(0xef4aeaf1), SHC(0x811855b4), SHC(0xda0aecf9), SHC(0x85c1e80e), + SHC(0xc5e3a3a9), SHC(0x8df37f8b), SHC(0xb36a1978), SHC(0x997083db), SHC(0xa326eec0), SHC(0xa7e3ff4d), + SHC(0x9592675c), SHC(0xb8e31319), SHC(0x8b10f144), SHC(0xcbf00dbe), SHC(0x83f03dd6), SHC(0xe07e0c84), + SHC(0x80650347), SHC(0xf5f50d67), SHC(0x808976d1), SHC(0x0bb65336), SHC(0x845c8ae3), SHC(0x2120fb83), + SHC(0x8bc1f6e8), SHC(0x3596a46c), SHC(0x96830876), SHC(0x487fffe4), SHC(0xa45037c9), SHC(0x595132a2), + SHC(0xb4c373ee), SHC(0x678dde6e), SHC(0xc763158e), SHC(0x72ccb9db), SHC(0xdba5629b), SHC(0x7aba9ae6), + SHC(0xf0f488d9), SHC(0x7f1cde01), SHC(0x06b2f1d2), SHC(0x7fd317b4), SHC(0x1c3fd045), SHC(0x7cd80464), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7641af3d), SHC(0xcf043ab3), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x471cece7), SHC(0x9592675c), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x00000000), SHC(0x80000000), + SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xb8e31319), SHC(0x9592675c), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x9592675c), SHC(0xb8e31319), SHC(0x89be50c3), SHC(0xcf043ab3), + SHC(0x8275a0c0), SHC(0xe70747c4), SHC(0x80000000), SHC(0x00000000), SHC(0x8275a0c0), SHC(0x18f8b83c), + SHC(0x89be50c3), SHC(0x30fbc54d), SHC(0x9592675c), SHC(0x471cece7), SHC(0xa57d8666), SHC(0x5a82799a), + SHC(0xb8e31319), SHC(0x6a6d98a4), SHC(0xcf043ab3), SHC(0x7641af3d), SHC(0xe70747c4), SHC(0x7d8a5f40), + SHC(0x00000000), SHC(0x7fffffff), SHC(0x18f8b83c), SHC(0x7d8a5f40), SHC(0x30fbc54d), SHC(0x7641af3d), + SHC(0x471cece7), SHC(0x6a6d98a4), SHC(0x5a82799a), SHC(0x5a82799a), SHC(0x6a6d98a4), SHC(0x471cece7), + SHC(0x00007fff), SHC(0x00007fff), SHC(0x00007fff), SHC(0x00007fff), SHC(0x00007fff), SHC(0x00007fff), + SHC(0x00007fff), SHC(0x00007fff), SHC(0x00007fff), SHC(0x00007fff), SHC(0x00007fff), SHC(0x00007fff), + SHC(0x00007fff), SHC(0x00007fff), SHC(0x00007fff), SHC(0x00007fff), SHC(0xfb887fec), SHC(0xf7127fb0), + SHC(0xf29f7f4c), SHC(0xee307ec1), SHC(0xe9c67e0e), SHC(0xe5637d34), SHC(0xe1097c33), SHC(0xdcb87b0b), + SHC(0xd87279bc), SHC(0xd4397848), SHC(0xd00d76ae), SHC(0xcbf074ef), SHC(0xc7e3730c), SHC(0xc3e87104), + SHC(0x00007fff), SHC(0xf7127fb0), SHC(0xee307ec1), SHC(0xe5637d34), SHC(0xdcb87b0b), SHC(0xd4397848), + SHC(0xcbf074ef), SHC(0xc3e87104), SHC(0xbc2c6c8d), SHC(0xb4c3678e), SHC(0xadb9620e), SHC(0xa7155c13), + SHC(0xa0e155a6), SHC(0x9b224ece), SHC(0x95e24794), SHC(0x00007fff), SHC(0xf29f7f4c), SHC(0xe5637d34), + SHC(0xd87279bc), SHC(0xcbf074ef), SHC(0xc0006eda), SHC(0xb4c3678e), SHC(0xaa5a5f1f), SHC(0xa0e155a6), + SHC(0x98724b3d), SHC(0x91264000), SHC(0x8b113410), SHC(0x8644278e), SHC(0x82cc1a9d), SHC(0x80b40d61), + SHC(0x00007fff), SHC(0xee307ec1), SHC(0xdcb87b0b), SHC(0xcbf074ef), SHC(0xbc2c6c8d), SHC(0xadb9620e), + SHC(0xa0e155a6), SHC(0x95e24794), SHC(0x8cf4381d), SHC(0x8644278e), SHC(0x81f2163a), SHC(0x80140478), + SHC(0x80b4f29f), SHC(0x83cde109), SHC(0x8952d00d), SHC(0x00007fff), SHC(0xe9c67e0e), SHC(0xd4397848), + SHC(0xc0006eda), SHC(0xadb9620e), SHC(0x9df25247), SHC(0x91264000), SHC(0x87b82bc7), SHC(0x81f2163a), + SHC(0x80000000), SHC(0x81f2e9c6), SHC(0x87b8d439), SHC(0x9126c000), SHC(0x9df2adb9), SHC(0xadb99df2), + SHC(0x00007fff), SHC(0xe5637d34), SHC(0xcbf074ef), SHC(0xb4c3678e), SHC(0xa0e155a6), SHC(0x91264000), + SHC(0x8644278e), SHC(0x80b40d61), SHC(0x80b4f29f), SHC(0x8644d872), SHC(0x9126c000), SHC(0xa0e1aa5a), + SHC(0xb4c39872), SHC(0xcbf08b11), SHC(0xe56382cc), SHC(0x00007fff), SHC(0xe1097c33), SHC(0xc3e87104), + SHC(0xaa5a5f1f), SHC(0x95e24794), SHC(0x87b82bc7), SHC(0x80b40d61), SHC(0x813fee30), SHC(0x8952d00d), + SHC(0x9872b4c3), SHC(0xadb99df2), SHC(0xc7e38cf4), SHC(0xe56382cc), SHC(0x04788014), SHC(0x234884f5), + SHC(0x00007fff), SHC(0xdcb87b0b), SHC(0xbc2c6c8d), SHC(0xa0e155a6), SHC(0x8cf4381d), SHC(0x81f2163a), + SHC(0x80b4f29f), SHC(0x8952d00d), SHC(0x9b22b132), SHC(0xb4c39872), SHC(0xd43987b8), SHC(0xf7128050), + SHC(0x1a9d82cc), SHC(0x3c188efc), SHC(0x58eba3ed), SHC(0x00007fff), SHC(0xd87279bc), SHC(0xb4c3678e), + SHC(0x98724b3d), SHC(0x8644278e), SHC(0x80000000), SHC(0x8644d872), SHC(0x9872b4c3), SHC(0xb4c39872), + SHC(0xd8728644), SHC(0x00008000), SHC(0x278e8644), SHC(0x4b3d9872), SHC(0x678eb4c3), SHC(0x79bcd872), + SHC(0x00007fff), SHC(0xd4397848), SHC(0xadb9620e), SHC(0x91264000), SHC(0x81f2163a), SHC(0x81f2e9c6), + SHC(0x9126c000), SHC(0xadb99df2), SHC(0xd43987b8), SHC(0x00008000), SHC(0x2bc787b8), SHC(0x52479df2), + SHC(0x6edac000), SHC(0x7e0ee9c6), SHC(0x7e0e163a), SHC(0x00007fff), SHC(0xd00d76ae), SHC(0xa7155c13), + SHC(0x8b113410), SHC(0x80140478), SHC(0x87b8d439), SHC(0xa0e1aa5a), SHC(0xc7e38cf4), SHC(0xf7128050), + SHC(0x278e8644), SHC(0x52479df2), SHC(0x7104c3e8), SHC(0x7f4cf29f), SHC(0x7b0b2348), SHC(0x64de4ece), + SHC(0x00007fff), SHC(0xe21e7c77), SHC(0xc5e4720d), SHC(0xacdf6155), SHC(0x98724b3d), SHC(0x89be30fc), + SHC(0x81931406), SHC(0x8065f5f5), SHC(0x8644d872), SHC(0x92ddbd1f), SHC(0xa57ea57e), SHC(0xbd1f92dd), + SHC(0xd8728644), SHC(0xf5f58065), SHC(0x14068193), SHC(0x00007fff), SHC(0xdba57abb), SHC(0xba496b5a), + SHC(0x9eab5321), SHC(0x8b113410), SHC(0x811810b5), SHC(0x8193ebfa), SHC(0x8c78c8e5), SHC(0xa0e1aa5a), + SHC(0xbd1f92dd), SHC(0xdedf845d), SHC(0x035a800b), SHC(0x278e8644), SHC(0x48809683), SHC(0x637aaf72), + SHC(0x00007fff), SHC(0xd54678a8), SHC(0xaf72637a), SHC(0x92dd42e1), SHC(0x82cc1a9d), SHC(0x8118ef4b), + SHC(0x8df3c5e4), SHC(0xa7e4a327), SHC(0xcbf08b11), SHC(0xf5f58065), SHC(0x2121845d), SHC(0x48809683), + SHC(0x678eb4c3), SHC(0x7abbdba5), SHC(0x7fd306b3), SHC(0x00007fff), SHC(0xcf047642), SHC(0xa57e5a82), + SHC(0x89be30fc), SHC(0x80000000), SHC(0x89becf04), SHC(0xa57ea57e), SHC(0xcf0489be), SHC(0x00008000), + SHC(0x30fc89be), SHC(0x5a82a57e), SHC(0x7642cf04), SHC(0x7fff0000), SHC(0x764230fc), SHC(0x5a825a82), + SHC(0xe2e1004b), SHC(0x00000000), SHC(0x00000000), SHC(0x6fb076e0), SHC(0x002fba9c), SHC(0x6fb079d0), + SHC(0x8d92be50), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), + SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0xffffffff), + SHC(0x00010000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), + SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0xffffffff), SHC(0x00010000), SHC(0x00000000), + SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0xeabee318), SHC(0x00000000), SHC(0x4d55545a), + SHC(0000000000), SHC(0000000000), SHC(0x00000000), SHC(0x00000000), SHC(0xffffffff), SHC(0x904f882f), + SHC(0x4d55545a), SHC(0x00000000), SHC(0x00000000), SHC(0x006f5dd8), SHC(0x40000000), SHC(0x00666004), + SHC(0x006ec0b0), SHC(0x00660000), SHC(0x006f5dd8), SHC(0x42000000), SHC(0x00665fa0), SHC(0x006ec080), + SHC(0x6fb07880), SHC(0x00660000), SHC(0x00660000), SHC(0x00309ca0), SHC(0x00000000), SHC(0x00000000), + SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), + SHC(0xffffffff), SHC(0x00010000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), + SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x0d888000), SHC(0x00000000), + SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), + SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), SHC(0x00000000), + SHC(0x00000170), SHC(0x00000000), SHC(0x00000000), SHC(0x6fb07880), SHC(0x6fb078a8), SHC(0x8d926000), + SHC(0x0d888000), SHC(0x8d888000), SHC(0x6fb079e0), SHC(0x00000000), SHC(0000000000), SHC(0x002f8000), + SHC(0x00000001), SHC(0x6fb07b40), SHC(0x00000000), SHC(0x6fb07b54), SHC(0x6fb07b70), SHC(0x6fb07b80), + SHC(0x6fb07b94), SHC(0x6fb07bcd), SHC(0x6fb07be6), SHC(0x6fb07c0e), SHC(0x6fb07c43), SHC(0x6fb07c4d), + SHC(0x6fb07c8f), SHC(0x6fb07d49), SHC(0x6fb07d71), SHC(0x6fb07d9e), SHC(0x6fb07daf), SHC(0x6fb07dbd), + SHC(0x6fb07dcc), SHC(0x6fb07ddf), SHC(0x6fb07de7), SHC(0x6fb07df8), SHC(0x6fb07e05), SHC(0x6fb07e45), + SHC(0x00000000), SHC(0x6fb07b18), SHC(0x6fb07e60), SHC(0x6fb07e70), SHC(0x6fb07e8f), SHC(0x6fb07ec4), + SHC(0x6fb07ee1), SHC(0x6fb07f17), SHC(0x6fb07f3e), SHC(0x6fb07f67), SHC(0x6fb07fa2), SHC(0x6fb07fdf), + SHC(0x6fb07fed), SHC(0x00000000), SHC(0x63657865), SHC(0x705f656c), SHC(0x65672f2e), SHC(0x6f526574), + SHC(0x00726f74), SHC(0x65672f2e), SHC(0x6f526574), SHC(0x00726f74), SHC(0x4f52505f), SHC(0x7070413d), + SHC(0x696d7265), SHC(0x4c454853), SHC(0x622f6e69), SHC(0x4d524554), SHC(0x322d6d72), SHC(0x00726f6c), + SHC(0x2f3d5249), SHC(0x646c6f66), SHC(0x6e2f3238), SHC(0x36737636), SHC(0x78663431), SHC(0x3031785f), + SHC(0x2f542f33), SHC(0x52505f4d), SHC(0x45565f4d), SHC(0x34343d4e), SHC(0x44575044), SHC(0x2f737265), + SHC(0x636f442f), SHC(0x6c2f7374), SHC(0x65747361), SHC(0x535f4d52), SHC(0x495f4e4f), SHC(0x34323939), + SHC(0x2d364133), SHC(0x4345382d), SHC(0x43344233), SHC(0x55003845), SHC(0x6d676c73), SHC(0x5455415f), + SHC(0x2f3d4b43), SHC(0x2f657461), SHC(0x2e6d6f63), SHC(0x616c2e65), SHC(0x64722e64), SHC(0x4b776b7a), + SHC(0x656e6574), SHC(0x3d485441), SHC(0x6d6f682f), SHC(0x69622f77), SHC(0x6c2f7273), SHC(0x6e69622f), + SHC(0x69622f72), SHC(0x2f3a6e69), SHC(0x6e696273), SHC(0x2f3a6e69), SHC(0x656d6f68), SHC(0x6e69622f), + SHC(0x31582f74), SHC(0x4c2f3a6e), SHC(0x412f7972), SHC(0x7273752f), SHC(0x70412f3a), SHC(0x6f697461), + SHC(0x61757369), SHC(0x6f696475), SHC(0x70612e65), SHC(0x6e65746e), SHC(0x756f7365), SHC(0x7070612f), + SHC(0x435f5f00), SHC(0x49656c64), SHC(0x65696669), SHC(0x70612e6d), SHC(0x6d726554), SHC(0x44575000), + SHC(0x2f737265), SHC(0x636f442f), SHC(0x6c2f7374), SHC(0x65747361), SHC(0x74706972), SHC(0x643d474e), + SHC(0x4654552e), SHC(0x465f4350), SHC(0x3078303d), SHC(0x40755c3d), SHC(0x00202477), SHC(0x56524553), + SHC(0x454d414e), SHC(0x4c564c48), SHC(0x3d454d4f), SHC(0x732f7372), SHC(0x4e474f4c), SHC(0x6d676c73), + SHC(0x59414c50), SHC(0x74617669), SHC(0x6f632f70), SHC(0x2e656c70), SHC(0x2e646863), SHC(0x53386438) + }; + +const Word32 RotVector_960[2 * (480 - 60)] = { + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ffd3154), SHC(0xfe531484), SHC(0x7ff4c56f), SHC(0xfca63bd8), + SHC(0x7fe6bcb0), SHC(0xfaf988cc), SHC(0x7fd317b4), SHC(0xf94d0e2e), SHC(0x7fb9d759), SHC(0xf7a0dec9), + SHC(0x7f9afcb9), SHC(0xf5f50d67), SHC(0x7f76892f), SHC(0xf449acca), SHC(0x7f4c7e54), SHC(0xf29ecfb2), + SHC(0x7f1cde01), SHC(0xf0f488d9), SHC(0x7ee7aa4c), SHC(0xef4aeaf1), SHC(0x7eace58a), SHC(0xeda208a5), + SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7e26b371), SHC(0xea52c166), SHC(0x7ddb4bfc), SHC(0xe8ac819d), + SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7cd80464), SHC(0xe3c02fbb), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x7c0fc22a), SHC(0xe07e0c84), SHC(0x7ba3751d), SHC(0xdedf047d), + SHC(0x7b31bbb2), SHC(0xdd417079), SHC(0x7aba9ae6), SHC(0xdba5629b), SHC(0x7a3e17f2), SHC(0xda0aecf9), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x793501a9), SHC(0xd6db1254), SHC(0x78a879f4), SHC(0xd545d11c), + SHC(0x7816a759), SHC(0xd3b26fb0), SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x76e33b3f), SHC(0xd09192ea), + SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x759af34c), SHC(0xcd790887), SHC(0x74ef0ebc), SHC(0xcbf00dbe), + SHC(0x743e0918), SHC(0xca695b94), SHC(0x7387ea23), SHC(0xc8e5032b), SHC(0x72ccb9db), SHC(0xc763158e), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x71474660), SHC(0xc466be4f), SHC(0x707d1443), SHC(0xc2ec7635), + SHC(0x6fadf2fc), SHC(0xc174dbf2), SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x6e010780), SHC(0xbe8df2ba), + SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x6c40cf2c), SHC(0xbbb28501), SHC(0x6b598ea3), SHC(0xba4944a2), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x697cf78a), SHC(0xb780001c), SHC(0x6887b5e2), SHC(0xb6201b3e), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x668f7c25), SHC(0xb36a1978), SHC(0x658c9a2d), SHC(0xb2141b02), + SHC(0x648543e4), SHC(0xb0c1878b), SHC(0x637984d4), SHC(0xaf726def), SHC(0x626968be), SHC(0xae26dcdf), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x603c496c), SHC(0xab9a8e6c), SHC(0x5f1f5ea1), SHC(0xaa59eda4), + SHC(0x5dfe47ad), SHC(0xa91d0ea3), SHC(0x5cd91140), SHC(0xa7e3ff4d), SHC(0x5bafc837), SHC(0xa6aecd5e), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ff4c56f), SHC(0xfca63bd8), SHC(0x7fd317b4), SHC(0xf94d0e2e), + SHC(0x7f9afcb9), SHC(0xf5f50d67), SHC(0x7f4c7e54), SHC(0xf29ecfb2), SHC(0x7ee7aa4c), SHC(0xef4aeaf1), + SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7ddb4bfc), SHC(0xe8ac819d), SHC(0x7d33f0ca), SHC(0xe5632654), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x7aba9ae6), SHC(0xdba5629b), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x78a879f4), SHC(0xd545d11c), SHC(0x777f903c), SHC(0xd220ffc0), + SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x7387ea23), SHC(0xc8e5032b), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x707d1443), SHC(0xc2ec7635), SHC(0x6ed9eba1), SHC(0xc0000000), + SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x6b598ea3), SHC(0xba4944a2), SHC(0x697cf78a), SHC(0xb780001c), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x658c9a2d), SHC(0xb2141b02), SHC(0x637984d4), SHC(0xaf726def), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x5f1f5ea1), SHC(0xaa59eda4), SHC(0x5cd91140), SHC(0xa7e3ff4d), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x581c00b3), SHC(0xa326eec0), SHC(0x55a6125c), SHC(0xa0e0a15f), + SHC(0x53211d18), SHC(0x9eab046f), SHC(0x508d9211), SHC(0x9c867b2c), SHC(0x4debe4fe), SHC(0x9a7365d3), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x487fffe4), SHC(0x96830876), SHC(0x45b6bb5e), SHC(0x94a6715d), + SHC(0x42e13ba4), SHC(0x92dcafe5), SHC(0x40000000), SHC(0x9126145f), SHC(0x3d1389cb), SHC(0x8f82ebbd), + SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x371afcd5), SHC(0x8c7815dd), SHC(0x340ff242), SHC(0x8b10f144), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x2ddf0040), SHC(0x88806fc4), SHC(0x2aba2ee4), SHC(0x8757860c), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x245a9d65), SHC(0x8545651a), SHC(0x2120fb83), SHC(0x845c8ae3), + SHC(0x1de189a6), SHC(0x838961e8), SHC(0x1a9cd9ac), SHC(0x82cc0f36), SHC(0x17537e63), SHC(0x8224b404), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x10b5150f), SHC(0x811855b4), SHC(0x0d61304e), SHC(0x80b381ac), + SHC(0x0a0af299), SHC(0x80650347), SHC(0x06b2f1d2), SHC(0x802ce84c), SHC(0x0359c428), SHC(0x800b3a91), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fe6bcb0), SHC(0xfaf988cc), SHC(0x7f9afcb9), SHC(0xf5f50d67), + SHC(0x7f1cde01), SHC(0xf0f488d9), SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7d8a5f40), SHC(0xe70747c4), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x7b31bbb2), SHC(0xdd417079), SHC(0x79bc384d), SHC(0xd8722192), + SHC(0x7816a759), SHC(0xd3b26fb0), SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x743e0918), SHC(0xca695b94), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6fadf2fc), SHC(0xc174dbf2), SHC(0x6d23501b), SHC(0xbd1ec45c), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x648543e4), SHC(0xb0c1878b), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x5dfe47ad), SHC(0xa91d0ea3), SHC(0x5a82799a), SHC(0xa57d8666), + SHC(0x56e2f15d), SHC(0xa201b853), SHC(0x53211d18), SHC(0x9eab046f), SHC(0x4f3e7875), SHC(0x9b7abc1c), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x471cece7), SHC(0x9592675c), SHC(0x42e13ba4), SHC(0x92dcafe5), + SHC(0x3e8b240e), SHC(0x90520d04), SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x3596a46c), SHC(0x8bc1f6e8), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x2c4d9050), SHC(0x87e958a7), SHC(0x278dde6e), SHC(0x8643c7b3), + SHC(0x22be8f87), SHC(0x84ce444e), SHC(0x1de189a6), SHC(0x838961e8), SHC(0x18f8b83c), SHC(0x8275a0c0), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x0f0b7727), SHC(0x80e321ff), SHC(0x0a0af299), SHC(0x80650347), + SHC(0x05067734), SHC(0x80194350), SHC(0x00000000), SHC(0x80000000), SHC(0xfaf988cc), SHC(0x80194350), + SHC(0xf5f50d67), SHC(0x80650347), SHC(0xf0f488d9), SHC(0x80e321ff), SHC(0xebf9f498), SHC(0x81936daf), + SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xe21e765a), SHC(0x838961e8), SHC(0xdd417079), SHC(0x84ce444e), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xd3b26fb0), SHC(0x87e958a7), SHC(0xcf043ab3), SHC(0x89be50c3), + SHC(0xca695b94), SHC(0x8bc1f6e8), SHC(0xc5e3a3a9), SHC(0x8df37f8b), SHC(0xc174dbf2), SHC(0x90520d04), + SHC(0xbd1ec45c), SHC(0x92dcafe5), SHC(0xb8e31319), SHC(0x9592675c), SHC(0xb4c373ee), SHC(0x98722192), + SHC(0xb0c1878b), SHC(0x9b7abc1c), SHC(0xacdee2e8), SHC(0x9eab046f), SHC(0xa91d0ea3), SHC(0xa201b853), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fd317b4), SHC(0xf94d0e2e), SHC(0x7f4c7e54), SHC(0xf29ecfb2), + SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7ba3751d), SHC(0xdedf047d), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x74ef0ebc), SHC(0xcbf00dbe), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x6b598ea3), SHC(0xba4944a2), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x637984d4), SHC(0xaf726def), SHC(0x5f1f5ea1), SHC(0xaa59eda4), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x508d9211), SHC(0x9c867b2c), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x45b6bb5e), SHC(0x94a6715d), SHC(0x40000000), SHC(0x9126145f), + SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x340ff242), SHC(0x8b10f144), SHC(0x2ddf0040), SHC(0x88806fc4), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x2120fb83), SHC(0x845c8ae3), SHC(0x1a9cd9ac), SHC(0x82cc0f36), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x0d61304e), SHC(0x80b381ac), SHC(0x06b2f1d2), SHC(0x802ce84c), + SHC(0x00000000), SHC(0x80000000), SHC(0xf94d0e2e), SHC(0x802ce84c), SHC(0xf29ecfb2), SHC(0x80b381ac), + SHC(0xebf9f498), SHC(0x81936daf), SHC(0xe5632654), SHC(0x82cc0f36), SHC(0xdedf047d), SHC(0x845c8ae3), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xd220ffc0), SHC(0x88806fc4), SHC(0xcbf00dbe), SHC(0x8b10f144), + SHC(0xc5e3a3a9), SHC(0x8df37f8b), SHC(0xc0000000), SHC(0x9126145f), SHC(0xba4944a2), SHC(0x94a6715d), + SHC(0xb4c373ee), SHC(0x98722192), SHC(0xaf726def), SHC(0x9c867b2c), SHC(0xaa59eda4), SHC(0xa0e0a15f), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0xa0e0a15f), SHC(0xaa59eda4), SHC(0x9c867b2c), SHC(0xaf726def), + SHC(0x98722192), SHC(0xb4c373ee), SHC(0x94a6715d), SHC(0xba4944a2), SHC(0x9126145f), SHC(0xc0000000), + SHC(0x8df37f8b), SHC(0xc5e3a3a9), SHC(0x8b10f144), SHC(0xcbf00dbe), SHC(0x88806fc4), SHC(0xd220ffc0), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x845c8ae3), SHC(0xdedf047d), SHC(0x82cc0f36), SHC(0xe5632654), + SHC(0x81936daf), SHC(0xebf9f498), SHC(0x80b381ac), SHC(0xf29ecfb2), SHC(0x802ce84c), SHC(0xf94d0e2e), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fb9d759), SHC(0xf7a0dec9), SHC(0x7ee7aa4c), SHC(0xef4aeaf1), + SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x793501a9), SHC(0xd6db1254), + SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x72ccb9db), SHC(0xc763158e), SHC(0x6ed9eba1), SHC(0xc0000000), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x658c9a2d), SHC(0xb2141b02), SHC(0x603c496c), SHC(0xab9a8e6c), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x54657194), SHC(0x9fc3b694), SHC(0x4debe4fe), SHC(0x9a7365d3), + SHC(0x471cece7), SHC(0x9592675c), SHC(0x40000000), SHC(0x9126145f), SHC(0x389cea72), SHC(0x8d334625), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x2924edac), SHC(0x86cafe57), SHC(0x2120fb83), SHC(0x845c8ae3), + SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x10b5150f), SHC(0x811855b4), SHC(0x085f2137), SHC(0x804628a7), + SHC(0x00000000), SHC(0x80000000), SHC(0xf7a0dec9), SHC(0x804628a7), SHC(0xef4aeaf1), SHC(0x811855b4), + SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xdedf047d), SHC(0x845c8ae3), SHC(0xd6db1254), SHC(0x86cafe57), + SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xc763158e), SHC(0x8d334625), SHC(0xc0000000), SHC(0x9126145f), + SHC(0xb8e31319), SHC(0x9592675c), SHC(0xb2141b02), SHC(0x9a7365d3), SHC(0xab9a8e6c), SHC(0x9fc3b694), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x9fc3b694), SHC(0xab9a8e6c), SHC(0x9a7365d3), SHC(0xb2141b02), + SHC(0x9592675c), SHC(0xb8e31319), SHC(0x9126145f), SHC(0xc0000000), SHC(0x8d334625), SHC(0xc763158e), + SHC(0x89be50c3), SHC(0xcf043ab3), SHC(0x86cafe57), SHC(0xd6db1254), SHC(0x845c8ae3), SHC(0xdedf047d), + SHC(0x8275a0c0), SHC(0xe70747c4), SHC(0x811855b4), SHC(0xef4aeaf1), SHC(0x804628a7), SHC(0xf7a0dec9), + SHC(0x80000000), SHC(0x00000000), SHC(0x804628a7), SHC(0x085f2137), SHC(0x811855b4), SHC(0x10b5150f), + SHC(0x8275a0c0), SHC(0x18f8b83c), SHC(0x845c8ae3), SHC(0x2120fb83), SHC(0x86cafe57), SHC(0x2924edac), + SHC(0x89be50c3), SHC(0x30fbc54d), SHC(0x8d334625), SHC(0x389cea72), SHC(0x9126145f), SHC(0x40000000), + SHC(0x9592675c), SHC(0x471cece7), SHC(0x9a7365d3), SHC(0x4debe4fe), SHC(0x9fc3b694), SHC(0x54657194), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f9afcb9), SHC(0xf5f50d67), SHC(0x7e6c9251), SHC(0xebf9f498), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x79bc384d), SHC(0xd8722192), SHC(0x7641af3d), SHC(0xcf043ab3), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x678dde6e), SHC(0xb4c373ee), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x53211d18), SHC(0x9eab046f), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x42e13ba4), SHC(0x92dcafe5), SHC(0x3a1c5c57), SHC(0x8df37f8b), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x1de189a6), SHC(0x838961e8), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x0a0af299), SHC(0x80650347), SHC(0x00000000), SHC(0x80000000), + SHC(0xf5f50d67), SHC(0x80650347), SHC(0xebf9f498), SHC(0x81936daf), SHC(0xe21e765a), SHC(0x838961e8), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xc5e3a3a9), SHC(0x8df37f8b), + SHC(0xbd1ec45c), SHC(0x92dcafe5), SHC(0xb4c373ee), SHC(0x98722192), SHC(0xacdee2e8), SHC(0x9eab046f), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x9eab046f), SHC(0xacdee2e8), SHC(0x98722192), SHC(0xb4c373ee), + SHC(0x92dcafe5), SHC(0xbd1ec45c), SHC(0x8df37f8b), SHC(0xc5e3a3a9), SHC(0x89be50c3), SHC(0xcf043ab3), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x838961e8), SHC(0xe21e765a), SHC(0x81936daf), SHC(0xebf9f498), + SHC(0x80650347), SHC(0xf5f50d67), SHC(0x80000000), SHC(0x00000000), SHC(0x80650347), SHC(0x0a0af299), + SHC(0x81936daf), SHC(0x14060b68), SHC(0x838961e8), SHC(0x1de189a6), SHC(0x8643c7b3), SHC(0x278dde6e), + SHC(0x89be50c3), SHC(0x30fbc54d), SHC(0x8df37f8b), SHC(0x3a1c5c57), SHC(0x92dcafe5), SHC(0x42e13ba4), + SHC(0x98722192), SHC(0x4b3c8c12), SHC(0x9eab046f), SHC(0x53211d18), SHC(0xa57d8666), SHC(0x5a82799a), + SHC(0xacdee2e8), SHC(0x6154fb91), SHC(0xb4c373ee), SHC(0x678dde6e), SHC(0xbd1ec45c), SHC(0x6d23501b), + SHC(0xc5e3a3a9), SHC(0x720c8075), SHC(0xcf043ab3), SHC(0x7641af3d), SHC(0xd8722192), SHC(0x79bc384d), + SHC(0xe21e765a), SHC(0x7c769e18), SHC(0xebf9f498), SHC(0x7e6c9251), SHC(0xf5f50d67), SHC(0x7f9afcb9), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f76892f), SHC(0xf449acca), SHC(0x7ddb4bfc), SHC(0xe8ac819d), + SHC(0x7b31bbb2), SHC(0xdd417079), SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x72ccb9db), SHC(0xc763158e), + SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x668f7c25), SHC(0xb36a1978), SHC(0x5f1f5ea1), SHC(0xaa59eda4), + SHC(0x56e2f15d), SHC(0xa201b853), SHC(0x4debe4fe), SHC(0x9a7365d3), SHC(0x444d7aff), SHC(0x93bf30d4), + SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x2f6e6d16), SHC(0x891cc4c1), SHC(0x245a9d65), SHC(0x8545651a), + SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x0d61304e), SHC(0x80b381ac), SHC(0x01aceb7c), SHC(0x8002ceac), + SHC(0xf5f50d67), SHC(0x80650347), SHC(0xea52c166), SHC(0x81d94c8f), SHC(0xdedf047d), SHC(0x845c8ae3), + SHC(0xd3b26fb0), SHC(0x87e958a7), SHC(0xc8e5032b), SHC(0x8c7815dd), SHC(0xbe8df2ba), SHC(0x91fef880), + SHC(0xb4c373ee), SHC(0x98722192), SHC(0xab9a8e6c), SHC(0x9fc3b694), SHC(0xa326eec0), SHC(0xa7e3ff4d), + SHC(0x9b7abc1c), SHC(0xb0c1878b), SHC(0x94a6715d), SHC(0xba4944a2), SHC(0x8eb8b9a0), SHC(0xc466be4f), + SHC(0x89be50c3), SHC(0xcf043ab3), SHC(0x85c1e80e), SHC(0xda0aecf9), SHC(0x82cc0f36), SHC(0xe5632654), + SHC(0x80e321ff), SHC(0xf0f488d9), SHC(0x800b3a91), SHC(0xfca63bd8), SHC(0x804628a7), SHC(0x085f2137), + SHC(0x81936daf), SHC(0x14060b68), SHC(0x83f03dd6), SHC(0x1f81f37c), SHC(0x8757860c), SHC(0x2aba2ee4), + SHC(0x8bc1f6e8), SHC(0x3596a46c), SHC(0x9126145f), SHC(0x40000000), SHC(0x97784a1e), SHC(0x49dfe4c2), + SHC(0x9eab046f), SHC(0x53211d18), SHC(0xa6aecd5e), SHC(0x5bafc837), SHC(0xaf726def), SHC(0x637984d4), + SHC(0xb8e31319), SHC(0x6a6d98a4), SHC(0xc2ec7635), SHC(0x707d1443), SHC(0xcd790887), SHC(0x759af34c), + SHC(0xd8722192), SHC(0x79bc384d), SHC(0xe3c02fbb), SHC(0x7cd80464), SHC(0xef4aeaf1), SHC(0x7ee7aa4c), + SHC(0xfaf988cc), SHC(0x7fe6bcb0), SHC(0x06b2f1d2), SHC(0x7fd317b4), SHC(0x125df75b), SHC(0x7eace58a), + SHC(0x1de189a6), SHC(0x7c769e18), SHC(0x2924edac), SHC(0x793501a9), SHC(0x340ff242), SHC(0x74ef0ebc), + SHC(0x3e8b240e), SHC(0x6fadf2fc), SHC(0x487fffe4), SHC(0x697cf78a), SHC(0x51d92321), SHC(0x626968be)}; +#endif + +#ifdef ENABLE_FFT_30X16 +/* Twiddle coefficients for 30x16 FFTs, generated by fft_tables.py */ +#ifdef ENABLE_HR_MODE +const Word32 RotVector_30_16[2 * (480 - 30)] = { + + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ffd3154), SHC(0xfe531484), SHC(0x7ff4c56f), SHC(0xfca63bd8), + SHC(0x7fe6bcb0), SHC(0xfaf988cc), SHC(0x7fd317b4), SHC(0xf94d0e2e), SHC(0x7fb9d759), SHC(0xf7a0dec9), + SHC(0x7f9afcb9), SHC(0xf5f50d67), SHC(0x7f76892f), SHC(0xf449acca), SHC(0x7f4c7e54), SHC(0xf29ecfb2), + SHC(0x7f1cde01), SHC(0xf0f488d9), SHC(0x7ee7aa4c), SHC(0xef4aeaf1), SHC(0x7eace58a), SHC(0xeda208a5), + SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7e26b371), SHC(0xea52c166), SHC(0x7ddb4bfc), SHC(0xe8ac819d), + SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7cd80464), SHC(0xe3c02fbb), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x7c0fc22a), SHC(0xe07e0c84), SHC(0x7ba3751d), SHC(0xdedf047d), + SHC(0x7b31bbb2), SHC(0xdd417079), SHC(0x7aba9ae6), SHC(0xdba5629b), SHC(0x7a3e17f2), SHC(0xda0aecf9), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x793501a9), SHC(0xd6db1254), SHC(0x78a879f4), SHC(0xd545d11c), + SHC(0x7816a759), SHC(0xd3b26fb0), SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x76e33b3f), SHC(0xd09192ea), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ff4c56f), SHC(0xfca63bd8), SHC(0x7fd317b4), SHC(0xf94d0e2e), + SHC(0x7f9afcb9), SHC(0xf5f50d67), SHC(0x7f4c7e54), SHC(0xf29ecfb2), SHC(0x7ee7aa4c), SHC(0xef4aeaf1), + SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7ddb4bfc), SHC(0xe8ac819d), SHC(0x7d33f0ca), SHC(0xe5632654), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x7aba9ae6), SHC(0xdba5629b), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x78a879f4), SHC(0xd545d11c), SHC(0x777f903c), SHC(0xd220ffc0), + SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x7387ea23), SHC(0xc8e5032b), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x707d1443), SHC(0xc2ec7635), SHC(0x6ed9eba1), SHC(0xc0000000), + SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x6b598ea3), SHC(0xba4944a2), SHC(0x697cf78a), SHC(0xb780001c), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x658c9a2d), SHC(0xb2141b02), SHC(0x637984d4), SHC(0xaf726def), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x5f1f5ea1), SHC(0xaa59eda4), SHC(0x5cd91140), SHC(0xa7e3ff4d), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fe6bcb0), SHC(0xfaf988cc), SHC(0x7f9afcb9), SHC(0xf5f50d67), + SHC(0x7f1cde01), SHC(0xf0f488d9), SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7d8a5f40), SHC(0xe70747c4), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x7b31bbb2), SHC(0xdd417079), SHC(0x79bc384d), SHC(0xd8722192), + SHC(0x7816a759), SHC(0xd3b26fb0), SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x743e0918), SHC(0xca695b94), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6fadf2fc), SHC(0xc174dbf2), SHC(0x6d23501b), SHC(0xbd1ec45c), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x648543e4), SHC(0xb0c1878b), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x5dfe47ad), SHC(0xa91d0ea3), SHC(0x5a82799a), SHC(0xa57d8666), + SHC(0x56e2f15d), SHC(0xa201b853), SHC(0x53211d18), SHC(0x9eab046f), SHC(0x4f3e7875), SHC(0x9b7abc1c), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x471cece7), SHC(0x9592675c), SHC(0x42e13ba4), SHC(0x92dcafe5), + SHC(0x3e8b240e), SHC(0x90520d04), SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x3596a46c), SHC(0x8bc1f6e8), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fd317b4), SHC(0xf94d0e2e), SHC(0x7f4c7e54), SHC(0xf29ecfb2), + SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7ba3751d), SHC(0xdedf047d), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x74ef0ebc), SHC(0xcbf00dbe), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x6b598ea3), SHC(0xba4944a2), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x637984d4), SHC(0xaf726def), SHC(0x5f1f5ea1), SHC(0xaa59eda4), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x508d9211), SHC(0x9c867b2c), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x45b6bb5e), SHC(0x94a6715d), SHC(0x40000000), SHC(0x9126145f), + SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x340ff242), SHC(0x8b10f144), SHC(0x2ddf0040), SHC(0x88806fc4), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x2120fb83), SHC(0x845c8ae3), SHC(0x1a9cd9ac), SHC(0x82cc0f36), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x0d61304e), SHC(0x80b381ac), SHC(0x06b2f1d2), SHC(0x802ce84c), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fb9d759), SHC(0xf7a0dec9), SHC(0x7ee7aa4c), SHC(0xef4aeaf1), + SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x793501a9), SHC(0xd6db1254), + SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x72ccb9db), SHC(0xc763158e), SHC(0x6ed9eba1), SHC(0xc0000000), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x658c9a2d), SHC(0xb2141b02), SHC(0x603c496c), SHC(0xab9a8e6c), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x54657194), SHC(0x9fc3b694), SHC(0x4debe4fe), SHC(0x9a7365d3), + SHC(0x471cece7), SHC(0x9592675c), SHC(0x40000000), SHC(0x9126145f), SHC(0x389cea72), SHC(0x8d334625), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x2924edac), SHC(0x86cafe57), SHC(0x2120fb83), SHC(0x845c8ae3), + SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x10b5150f), SHC(0x811855b4), SHC(0x085f2137), SHC(0x804628a7), + SHC(0x00000000), SHC(0x80000000), SHC(0xf7a0dec9), SHC(0x804628a7), SHC(0xef4aeaf1), SHC(0x811855b4), + SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xdedf047d), SHC(0x845c8ae3), SHC(0xd6db1254), SHC(0x86cafe57), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f9afcb9), SHC(0xf5f50d67), SHC(0x7e6c9251), SHC(0xebf9f498), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x79bc384d), SHC(0xd8722192), SHC(0x7641af3d), SHC(0xcf043ab3), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x678dde6e), SHC(0xb4c373ee), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x53211d18), SHC(0x9eab046f), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x42e13ba4), SHC(0x92dcafe5), SHC(0x3a1c5c57), SHC(0x8df37f8b), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x1de189a6), SHC(0x838961e8), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x0a0af299), SHC(0x80650347), SHC(0x00000000), SHC(0x80000000), + SHC(0xf5f50d67), SHC(0x80650347), SHC(0xebf9f498), SHC(0x81936daf), SHC(0xe21e765a), SHC(0x838961e8), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xc5e3a3a9), SHC(0x8df37f8b), + SHC(0xbd1ec45c), SHC(0x92dcafe5), SHC(0xb4c373ee), SHC(0x98722192), SHC(0xacdee2e8), SHC(0x9eab046f), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f76892f), SHC(0xf449acca), SHC(0x7ddb4bfc), SHC(0xe8ac819d), + SHC(0x7b31bbb2), SHC(0xdd417079), SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x72ccb9db), SHC(0xc763158e), + SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x668f7c25), SHC(0xb36a1978), SHC(0x5f1f5ea1), SHC(0xaa59eda4), + SHC(0x56e2f15d), SHC(0xa201b853), SHC(0x4debe4fe), SHC(0x9a7365d3), SHC(0x444d7aff), SHC(0x93bf30d4), + SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x2f6e6d16), SHC(0x891cc4c1), SHC(0x245a9d65), SHC(0x8545651a), + SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x0d61304e), SHC(0x80b381ac), SHC(0x01aceb7c), SHC(0x8002ceac), + SHC(0xf5f50d67), SHC(0x80650347), SHC(0xea52c166), SHC(0x81d94c8f), SHC(0xdedf047d), SHC(0x845c8ae3), + SHC(0xd3b26fb0), SHC(0x87e958a7), SHC(0xc8e5032b), SHC(0x8c7815dd), SHC(0xbe8df2ba), SHC(0x91fef880), + SHC(0xb4c373ee), SHC(0x98722192), SHC(0xab9a8e6c), SHC(0x9fc3b694), SHC(0xa326eec0), SHC(0xa7e3ff4d), + SHC(0x9b7abc1c), SHC(0xb0c1878b), SHC(0x94a6715d), SHC(0xba4944a2), SHC(0x8eb8b9a0), SHC(0xc466be4f), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f4c7e54), SHC(0xf29ecfb2), SHC(0x7d33f0ca), SHC(0xe5632654), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x6ed9eba1), SHC(0xc0000000), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x5f1f5ea1), SHC(0xaa59eda4), SHC(0x55a6125c), SHC(0xa0e0a15f), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x40000000), SHC(0x9126145f), SHC(0x340ff242), SHC(0x8b10f144), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x1a9cd9ac), SHC(0x82cc0f36), SHC(0x0d61304e), SHC(0x80b381ac), + SHC(0x00000000), SHC(0x80000000), SHC(0xf29ecfb2), SHC(0x80b381ac), SHC(0xe5632654), SHC(0x82cc0f36), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xcbf00dbe), SHC(0x8b10f144), SHC(0xc0000000), SHC(0x9126145f), + SHC(0xb4c373ee), SHC(0x98722192), SHC(0xaa59eda4), SHC(0xa0e0a15f), SHC(0xa0e0a15f), SHC(0xaa59eda4), + SHC(0x98722192), SHC(0xb4c373ee), SHC(0x9126145f), SHC(0xc0000000), SHC(0x8b10f144), SHC(0xcbf00dbe), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x82cc0f36), SHC(0xe5632654), SHC(0x80b381ac), SHC(0xf29ecfb2), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f1cde01), SHC(0xf0f488d9), SHC(0x7c769e18), SHC(0xe21e765a), + SHC(0x7816a759), SHC(0xd3b26fb0), SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6a6d98a4), SHC(0xb8e31319), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x56e2f15d), SHC(0xa201b853), SHC(0x4b3c8c12), SHC(0x98722192), + SHC(0x3e8b240e), SHC(0x90520d04), SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x22be8f87), SHC(0x84ce444e), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x05067734), SHC(0x80194350), SHC(0xf5f50d67), SHC(0x80650347), + SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xca695b94), SHC(0x8bc1f6e8), + SHC(0xbd1ec45c), SHC(0x92dcafe5), SHC(0xb0c1878b), SHC(0x9b7abc1c), SHC(0xa57d8666), SHC(0xa57d8666), + SHC(0x9b7abc1c), SHC(0xb0c1878b), SHC(0x92dcafe5), SHC(0xbd1ec45c), SHC(0x8bc1f6e8), SHC(0xca695b94), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x8275a0c0), SHC(0xe70747c4), SHC(0x80650347), SHC(0xf5f50d67), + SHC(0x80194350), SHC(0x05067734), SHC(0x81936daf), SHC(0x14060b68), SHC(0x84ce444e), SHC(0x22be8f87), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ee7aa4c), SHC(0xef4aeaf1), SHC(0x7ba3751d), SHC(0xdedf047d), + SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x658c9a2d), SHC(0xb2141b02), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x4debe4fe), SHC(0x9a7365d3), SHC(0x40000000), SHC(0x9126145f), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x2120fb83), SHC(0x845c8ae3), SHC(0x10b5150f), SHC(0x811855b4), + SHC(0x00000000), SHC(0x80000000), SHC(0xef4aeaf1), SHC(0x811855b4), SHC(0xdedf047d), SHC(0x845c8ae3), + SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xc0000000), SHC(0x9126145f), SHC(0xb2141b02), SHC(0x9a7365d3), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x9a7365d3), SHC(0xb2141b02), SHC(0x9126145f), SHC(0xc0000000), + SHC(0x89be50c3), SHC(0xcf043ab3), SHC(0x845c8ae3), SHC(0xdedf047d), SHC(0x811855b4), SHC(0xef4aeaf1), + SHC(0x80000000), SHC(0x00000000), SHC(0x811855b4), SHC(0x10b5150f), SHC(0x845c8ae3), SHC(0x2120fb83), + SHC(0x89be50c3), SHC(0x30fbc54d), SHC(0x9126145f), SHC(0x40000000), SHC(0x9a7365d3), SHC(0x4debe4fe), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7eace58a), SHC(0xeda208a5), SHC(0x7aba9ae6), SHC(0xdba5629b), + SHC(0x743e0918), SHC(0xca695b94), SHC(0x6b598ea3), SHC(0xba4944a2), SHC(0x603c496c), SHC(0xab9a8e6c), + SHC(0x53211d18), SHC(0x9eab046f), SHC(0x444d7aff), SHC(0x93bf30d4), SHC(0x340ff242), SHC(0x8b10f144), + SHC(0x22be8f87), SHC(0x84ce444e), SHC(0x10b5150f), SHC(0x811855b4), SHC(0xfe531484), SHC(0x8002ceac), + SHC(0xebf9f498), SHC(0x81936daf), SHC(0xda0aecf9), SHC(0x85c1e80e), SHC(0xc8e5032b), SHC(0x8c7815dd), + SHC(0xb8e31319), SHC(0x9592675c), SHC(0xaa59eda4), SHC(0xa0e0a15f), SHC(0x9d969742), SHC(0xae26dcdf), + SHC(0x92dcafe5), SHC(0xbd1ec45c), SHC(0x8a650cb4), SHC(0xcd790887), SHC(0x845c8ae3), SHC(0xdedf047d), + SHC(0x80e321ff), SHC(0xf0f488d9), SHC(0x800b3a91), SHC(0x0359c428), SHC(0x81d94c8f), SHC(0x15ad3e9a), + SHC(0x8643c7b3), SHC(0x278dde6e), SHC(0x8d334625), SHC(0x389cea72), SHC(0x96830876), SHC(0x487fffe4), + SHC(0xa201b853), SHC(0x56e2f15d), SHC(0xaf726def), SHC(0x637984d4), SHC(0xbe8df2ba), SHC(0x6e010780), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x79bc384d), SHC(0xd8722192), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x5a82799a), SHC(0xa57d8666), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x278dde6e), SHC(0x8643c7b3), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x00000000), SHC(0x80000000), SHC(0xebf9f498), SHC(0x81936daf), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xc5e3a3a9), SHC(0x8df37f8b), SHC(0xb4c373ee), SHC(0x98722192), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x98722192), SHC(0xb4c373ee), SHC(0x8df37f8b), SHC(0xc5e3a3a9), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x81936daf), SHC(0xebf9f498), SHC(0x80000000), SHC(0x00000000), + SHC(0x81936daf), SHC(0x14060b68), SHC(0x8643c7b3), SHC(0x278dde6e), SHC(0x8df37f8b), SHC(0x3a1c5c57), + SHC(0x98722192), SHC(0x4b3c8c12), SHC(0xa57d8666), SHC(0x5a82799a), SHC(0xb4c373ee), SHC(0x678dde6e), + SHC(0xc5e3a3a9), SHC(0x720c8075), SHC(0xd8722192), SHC(0x79bc384d), SHC(0xebf9f498), SHC(0x7e6c9251), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e26b371), SHC(0xea52c166), SHC(0x78a879f4), SHC(0xd545d11c), + SHC(0x6fadf2fc), SHC(0xc174dbf2), SHC(0x637984d4), SHC(0xaf726def), SHC(0x54657194), SHC(0x9fc3b694), + SHC(0x42e13ba4), SHC(0x92dcafe5), SHC(0x2f6e6d16), SHC(0x891cc4c1), SHC(0x1a9cd9ac), SHC(0x82cc0f36), + SHC(0x05067734), SHC(0x80194350), SHC(0xef4aeaf1), SHC(0x811855b4), SHC(0xda0aecf9), SHC(0x85c1e80e), + SHC(0xc5e3a3a9), SHC(0x8df37f8b), SHC(0xb36a1978), SHC(0x997083db), SHC(0xa326eec0), SHC(0xa7e3ff4d), + SHC(0x9592675c), SHC(0xb8e31319), SHC(0x8b10f144), SHC(0xcbf00dbe), SHC(0x83f03dd6), SHC(0xe07e0c84), + SHC(0x80650347), SHC(0xf5f50d67), SHC(0x808976d1), SHC(0x0bb65336), SHC(0x845c8ae3), SHC(0x2120fb83), + SHC(0x8bc1f6e8), SHC(0x3596a46c), SHC(0x96830876), SHC(0x487fffe4), SHC(0xa45037c9), SHC(0x595132a2), + SHC(0xb4c373ee), SHC(0x678dde6e), SHC(0xc763158e), SHC(0x72ccb9db), SHC(0xdba5629b), SHC(0x7aba9ae6), + SHC(0xf0f488d9), SHC(0x7f1cde01), SHC(0x06b2f1d2), SHC(0x7fd317b4), SHC(0x1c3fd045), SHC(0x7cd80464), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ddb4bfc), SHC(0xe8ac819d), SHC(0x777f903c), SHC(0xd220ffc0), + SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x5f1f5ea1), SHC(0xaa59eda4), SHC(0x4debe4fe), SHC(0x9a7365d3), + SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x245a9d65), SHC(0x8545651a), SHC(0x0d61304e), SHC(0x80b381ac), + SHC(0xf5f50d67), SHC(0x80650347), SHC(0xdedf047d), SHC(0x845c8ae3), SHC(0xc8e5032b), SHC(0x8c7815dd), + SHC(0xb4c373ee), SHC(0x98722192), SHC(0xa326eec0), SHC(0xa7e3ff4d), SHC(0x94a6715d), SHC(0xba4944a2), + SHC(0x89be50c3), SHC(0xcf043ab3), SHC(0x82cc0f36), SHC(0xe5632654), SHC(0x800b3a91), SHC(0xfca63bd8), + SHC(0x81936daf), SHC(0x14060b68), SHC(0x8757860c), SHC(0x2aba2ee4), SHC(0x9126145f), SHC(0x40000000), + SHC(0x9eab046f), SHC(0x53211d18), SHC(0xaf726def), SHC(0x637984d4), SHC(0xc2ec7635), SHC(0x707d1443), + SHC(0xd8722192), SHC(0x79bc384d), SHC(0xef4aeaf1), SHC(0x7ee7aa4c), SHC(0x06b2f1d2), SHC(0x7fd317b4), + SHC(0x1de189a6), SHC(0x7c769e18), SHC(0x340ff242), SHC(0x74ef0ebc), SHC(0x487fffe4), SHC(0x697cf78a), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7641af3d), SHC(0xcf043ab3), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x471cece7), SHC(0x9592675c), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x00000000), SHC(0x80000000), + SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xb8e31319), SHC(0x9592675c), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x9592675c), SHC(0xb8e31319), SHC(0x89be50c3), SHC(0xcf043ab3), + SHC(0x8275a0c0), SHC(0xe70747c4), SHC(0x80000000), SHC(0x00000000), SHC(0x8275a0c0), SHC(0x18f8b83c), + SHC(0x89be50c3), SHC(0x30fbc54d), SHC(0x9592675c), SHC(0x471cece7), SHC(0xa57d8666), SHC(0x5a82799a), + SHC(0xb8e31319), SHC(0x6a6d98a4), SHC(0xcf043ab3), SHC(0x7641af3d), SHC(0xe70747c4), SHC(0x7d8a5f40), + SHC(0x00000000), SHC(0x7fffffff), SHC(0x18f8b83c), SHC(0x7d8a5f40), SHC(0x30fbc54d), SHC(0x7641af3d), + SHC(0x471cece7), SHC(0x6a6d98a4), SHC(0x5a82799a), SHC(0x5a82799a), SHC(0x6a6d98a4), SHC(0x471cece7)}; +#endif +#endif + +#ifdef ENABLE_HR_MODE +const Word32 RotVector_360[2 * (360 - 30)] = { +#else +const Word16 RotVector_360[2 * (360 - 30)] = { +#endif + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ffb0260), SHC(0xfdc41e9b), SHC(0x7fec09e3), SHC(0xfb8869ce), + SHC(0x7fd317b4), SHC(0xf94d0e2e), SHC(0x7fb02dc6), SHC(0xf7123849), SHC(0x7f834ed0), SHC(0xf4d814a4), + SHC(0x7f4c7e54), SHC(0xf29ecfb2), SHC(0x7f0bc097), SHC(0xf06695da), SHC(0x7ec11aa5), SHC(0xee2f9369), + SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7e0e2e32), SHC(0xe9c5e582), SHC(0x7da5f5a5), SHC(0xe7939223), + SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7cb82885), SHC(0xe334cdc9), SHC(0x7c32a67e), SHC(0xe108b40d), + SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x7b0a9f8d), SHC(0xdcb7ea46), SHC(0x7a6831ba), SHC(0xda939061), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x7906c0b0), SHC(0xd653c860), SHC(0x7847d909), SHC(0xd438af17), + SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x76adf5e6), SHC(0xd00ce422), SHC(0x75d31a61), SHC(0xcdfc85bb), + SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x7401e4c1), SHC(0xc9e7a512), SHC(0x730baeed), SHC(0xc7e3744b), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x71046d3e), SHC(0xc3e85b18), SHC(0x6ff389df), SHC(0xc1f1c224), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fec09e3), SHC(0xfb8869ce), SHC(0x7fb02dc6), SHC(0xf7123849), + SHC(0x7f4c7e54), SHC(0xf29ecfb2), SHC(0x7ec11aa5), SHC(0xee2f9369), SHC(0x7e0e2e32), SHC(0xe9c5e582), + SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7c32a67e), SHC(0xe108b40d), SHC(0x7b0a9f8d), SHC(0xdcb7ea46), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x7847d909), SHC(0xd438af17), SHC(0x76adf5e6), SHC(0xd00ce422), + SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x730baeed), SHC(0xc7e3744b), SHC(0x71046d3e), SHC(0xc3e85b18), + SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x6c8cd70b), SHC(0xbc2b9b05), SHC(0x6a1de737), SHC(0xb86c5df0), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x64dd8950), SHC(0xb1320139), SHC(0x620dbe8b), SHC(0xadb922b7), + SHC(0x5f1f5ea1), SHC(0xaa59eda4), SHC(0x5c13539b), SHC(0xa7156f3c), SHC(0x58ea90c4), SHC(0xa3ecac65), + SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x5246dd49), SHC(0x9df24175), SHC(0x4ecdfec7), SHC(0x9b2276b0), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x4793a210), SHC(0x95e218c9), SHC(0x43d464fb), SHC(0x937328f5), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fd317b4), SHC(0xf94d0e2e), SHC(0x7f4c7e54), SHC(0xf29ecfb2), + SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7ba3751d), SHC(0xdedf047d), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x74ef0ebc), SHC(0xcbf00dbe), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x6b598ea3), SHC(0xba4944a2), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x637984d4), SHC(0xaf726def), SHC(0x5f1f5ea1), SHC(0xaa59eda4), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x508d9211), SHC(0x9c867b2c), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x45b6bb5e), SHC(0x94a6715d), SHC(0x40000000), SHC(0x9126145f), + SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x340ff242), SHC(0x8b10f144), SHC(0x2ddf0040), SHC(0x88806fc4), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x2120fb83), SHC(0x845c8ae3), SHC(0x1a9cd9ac), SHC(0x82cc0f36), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x0d61304e), SHC(0x80b381ac), SHC(0x06b2f1d2), SHC(0x802ce84c), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fb02dc6), SHC(0xf7123849), SHC(0x7ec11aa5), SHC(0xee2f9369), + SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7b0a9f8d), SHC(0xdcb7ea46), SHC(0x7847d909), SHC(0xd438af17), + SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x71046d3e), SHC(0xc3e85b18), SHC(0x6c8cd70b), SHC(0xbc2b9b05), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x620dbe8b), SHC(0xadb922b7), SHC(0x5c13539b), SHC(0xa7156f3c), + SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x4ecdfec7), SHC(0x9b2276b0), SHC(0x4793a210), SHC(0x95e218c9), + SHC(0x40000000), SHC(0x9126145f), SHC(0x381c8bb5), SHC(0x8cf45113), SHC(0x2ff31bde), SHC(0x89520a1a), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x1ef74bf3), SHC(0x83cd5982), SHC(0x163a1a7e), SHC(0x81f1d1ce), + SHC(0x0d61304e), SHC(0x80b381ac), SHC(0x04779632), SHC(0x8013f61d), SHC(0xfb8869ce), SHC(0x8013f61d), + SHC(0xf29ecfb2), SHC(0x80b381ac), SHC(0xe9c5e582), SHC(0x81f1d1ce), SHC(0xe108b40d), SHC(0x83cd5982), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xd00ce422), SHC(0x89520a1a), SHC(0xc7e3744b), SHC(0x8cf45113), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f834ed0), SHC(0xf4d814a4), SHC(0x7e0e2e32), SHC(0xe9c5e582), + SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x7847d909), SHC(0xd438af17), SHC(0x7401e4c1), SHC(0xc9e7a512), + SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x68d9f964), SHC(0xb6950c1e), SHC(0x620dbe8b), SHC(0xadb922b7), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x5246dd49), SHC(0x9df24175), SHC(0x496af3e2), SHC(0x9726069c), + SHC(0x40000000), SHC(0x9126145f), SHC(0x36185aee), SHC(0x8bfe1b3f), SHC(0x2bc750e9), SHC(0x87b826f7), + SHC(0x2120fb83), SHC(0x845c8ae3), SHC(0x163a1a7e), SHC(0x81f1d1ce), SHC(0x0b27eb5c), SHC(0x807cb130), + SHC(0x00000000), SHC(0x80000000), SHC(0xf4d814a4), SHC(0x807cb130), SHC(0xe9c5e582), SHC(0x81f1d1ce), + SHC(0xdedf047d), SHC(0x845c8ae3), SHC(0xd438af17), SHC(0x87b826f7), SHC(0xc9e7a512), SHC(0x8bfe1b3f), + SHC(0xc0000000), SHC(0x9126145f), SHC(0xb6950c1e), SHC(0x9726069c), SHC(0xadb922b7), SHC(0x9df24175), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x9df24175), SHC(0xadb922b7), SHC(0x9726069c), SHC(0xb6950c1e), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f4c7e54), SHC(0xf29ecfb2), SHC(0x7d33f0ca), SHC(0xe5632654), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x6ed9eba1), SHC(0xc0000000), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x5f1f5ea1), SHC(0xaa59eda4), SHC(0x55a6125c), SHC(0xa0e0a15f), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x40000000), SHC(0x9126145f), SHC(0x340ff242), SHC(0x8b10f144), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x1a9cd9ac), SHC(0x82cc0f36), SHC(0x0d61304e), SHC(0x80b381ac), + SHC(0x00000000), SHC(0x80000000), SHC(0xf29ecfb2), SHC(0x80b381ac), SHC(0xe5632654), SHC(0x82cc0f36), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xcbf00dbe), SHC(0x8b10f144), SHC(0xc0000000), SHC(0x9126145f), + SHC(0xb4c373ee), SHC(0x98722192), SHC(0xaa59eda4), SHC(0xa0e0a15f), SHC(0xa0e0a15f), SHC(0xaa59eda4), + SHC(0x98722192), SHC(0xb4c373ee), SHC(0x9126145f), SHC(0xc0000000), SHC(0x8b10f144), SHC(0xcbf00dbe), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x82cc0f36), SHC(0xe5632654), SHC(0x80b381ac), SHC(0xf29ecfb2), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f0bc097), SHC(0xf06695da), SHC(0x7c32a67e), SHC(0xe108b40d), + SHC(0x777f903c), SHC(0xd220ffc0), SHC(0x71046d3e), SHC(0xc3e85b18), SHC(0x68d9f964), SHC(0xb6950c1e), + SHC(0x5f1f5ea1), SHC(0xaa59eda4), SHC(0x53f9be05), SHC(0x9f65ad2d), SHC(0x4793a210), SHC(0x95e218c9), + SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x2bc750e9), SHC(0x87b826f7), SHC(0x1ccb3237), SHC(0x8347d77b), + SHC(0x0d61304e), SHC(0x80b381ac), SHC(0xfdc41e9b), SHC(0x8004fda0), SHC(0xee2f9369), SHC(0x813ee55b), + SHC(0xdedf047d), SHC(0x845c8ae3), SHC(0xd00ce422), SHC(0x89520a1a), SHC(0xc1f1c224), SHC(0x900c7621), + SHC(0xb4c373ee), SHC(0x98722192), SHC(0xa8b4471a), SHC(0xa263007d), SHC(0x9df24175), SHC(0xadb922b7), + SHC(0x94a6715d), SHC(0xba4944a2), SHC(0x8cf45113), SHC(0xc7e3744b), SHC(0x86f93f50), SHC(0xd653c860), + SHC(0x82cc0f36), SHC(0xe5632654), SHC(0x807cb130), SHC(0xf4d814a4), SHC(0x8013f61d), SHC(0x04779632), + SHC(0x81936daf), SHC(0x14060b68), SHC(0x84f56073), SHC(0x234815ba), SHC(0x8a2ce59f), SHC(0x32037a45), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ec11aa5), SHC(0xee2f9369), SHC(0x7b0a9f8d), SHC(0xdcb7ea46), + SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x6c8cd70b), SHC(0xbc2b9b05), SHC(0x620dbe8b), SHC(0xadb922b7), + SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x4793a210), SHC(0x95e218c9), SHC(0x381c8bb5), SHC(0x8cf45113), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x163a1a7e), SHC(0x81f1d1ce), SHC(0x04779632), SHC(0x8013f61d), + SHC(0xf29ecfb2), SHC(0x80b381ac), SHC(0xe108b40d), SHC(0x83cd5982), SHC(0xd00ce422), SHC(0x89520a1a), + SHC(0xc0000000), SHC(0x9126145f), SHC(0xb1320139), SHC(0x9b2276b0), SHC(0xa3ecac65), SHC(0xa7156f3c), + SHC(0x98722192), SHC(0xb4c373ee), SHC(0x8efb92c2), SHC(0xc3e85b18), SHC(0x87b826f7), SHC(0xd438af17), + SHC(0x82cc0f36), SHC(0xe5632654), SHC(0x804fd23a), SHC(0xf7123849), SHC(0x804fd23a), SHC(0x08edc7b7), + SHC(0x82cc0f36), SHC(0x1a9cd9ac), SHC(0x87b826f7), SHC(0x2bc750e9), SHC(0x8efb92c2), SHC(0x3c17a4e8), + SHC(0x98722192), SHC(0x4b3c8c12), SHC(0xa3ecac65), SHC(0x58ea90c4), SHC(0xb1320139), SHC(0x64dd8950), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x79bc384d), SHC(0xd8722192), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x5a82799a), SHC(0xa57d8666), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x278dde6e), SHC(0x8643c7b3), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x00000000), SHC(0x80000000), SHC(0xebf9f498), SHC(0x81936daf), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xc5e3a3a9), SHC(0x8df37f8b), SHC(0xb4c373ee), SHC(0x98722192), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x98722192), SHC(0xb4c373ee), SHC(0x8df37f8b), SHC(0xc5e3a3a9), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x81936daf), SHC(0xebf9f498), SHC(0x80000000), SHC(0x00000000), + SHC(0x81936daf), SHC(0x14060b68), SHC(0x8643c7b3), SHC(0x278dde6e), SHC(0x8df37f8b), SHC(0x3a1c5c57), + SHC(0x98722192), SHC(0x4b3c8c12), SHC(0xa57d8666), SHC(0x5a82799a), SHC(0xb4c373ee), SHC(0x678dde6e), + SHC(0xc5e3a3a9), SHC(0x720c8075), SHC(0xd8722192), SHC(0x79bc384d), SHC(0xebf9f498), SHC(0x7e6c9251), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e0e2e32), SHC(0xe9c5e582), SHC(0x7847d909), SHC(0xd438af17), + SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x620dbe8b), SHC(0xadb922b7), SHC(0x5246dd49), SHC(0x9df24175), + SHC(0x40000000), SHC(0x9126145f), SHC(0x2bc750e9), SHC(0x87b826f7), SHC(0x163a1a7e), SHC(0x81f1d1ce), + SHC(0x00000000), SHC(0x80000000), SHC(0xe9c5e582), SHC(0x81f1d1ce), SHC(0xd438af17), SHC(0x87b826f7), + SHC(0xc0000000), SHC(0x9126145f), SHC(0xadb922b7), SHC(0x9df24175), SHC(0x9df24175), SHC(0xadb922b7), + SHC(0x9126145f), SHC(0xc0000000), SHC(0x87b826f7), SHC(0xd438af17), SHC(0x81f1d1ce), SHC(0xe9c5e582), + SHC(0x80000000), SHC(0x00000000), SHC(0x81f1d1ce), SHC(0x163a1a7e), SHC(0x87b826f7), SHC(0x2bc750e9), + SHC(0x9126145f), SHC(0x40000000), SHC(0x9df24175), SHC(0x5246dd49), SHC(0xadb922b7), SHC(0x620dbe8b), + SHC(0xc0000000), SHC(0x6ed9eba1), SHC(0xd438af17), SHC(0x7847d909), SHC(0xe9c5e582), SHC(0x7e0e2e32), + SHC(0x00000000), SHC(0x7fffffff), SHC(0x163a1a7e), SHC(0x7e0e2e32), SHC(0x2bc750e9), SHC(0x7847d909), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7da5f5a5), SHC(0xe7939223), SHC(0x76adf5e6), SHC(0xd00ce422), + SHC(0x6b598ea3), SHC(0xba4944a2), SHC(0x5c13539b), SHC(0xa7156f3c), SHC(0x496af3e2), SHC(0x9726069c), + SHC(0x340ff242), SHC(0x8b10f144), SHC(0x1ccb3237), SHC(0x8347d77b), SHC(0x04779632), SHC(0x8013f61d), + SHC(0xebf9f498), SHC(0x81936daf), SHC(0xd438af17), SHC(0x87b826f7), SHC(0xbe133b7c), SHC(0x92485786), + SHC(0xaa59eda4), SHC(0xa0e0a15f), SHC(0x99c64fc5), SHC(0xb2f7b9af), SHC(0x8cf45113), SHC(0xc7e3744b), + SHC(0x845c8ae3), SHC(0xdedf047d), SHC(0x804fd23a), SHC(0xf7123849), SHC(0x80f43f69), SHC(0x0f996a26), + SHC(0x8643c7b3), SHC(0x278dde6e), SHC(0x900c7621), SHC(0x3e0e3ddc), SHC(0x9df24175), SHC(0x5246dd49), + SHC(0xaf726def), SHC(0x637984d4), SHC(0xc3e85b18), SHC(0x71046d3e), SHC(0xda939061), SHC(0x7a6831ba), + SHC(0xf29ecfb2), SHC(0x7f4c7e54), SHC(0x0b27eb5c), SHC(0x7f834ed0), SHC(0x234815ba), SHC(0x7b0a9f8d), + SHC(0x3a1c5c57), SHC(0x720c8075), SHC(0x4ecdfec7), SHC(0x64dd8950), SHC(0x609a52d3), SHC(0x53f9be05)}; + +#ifdef ENABLE_HR_MODE +const Word32 RotVector_320[2 * (320 - 20)] = { +#else +const Word16 RotVector_320[2 * (320 - 20)] = { +#endif + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fe6bcb0), SHC(0xfaf988cc), SHC(0x7f9afcb9), SHC(0xf5f50d67), + SHC(0x7f1cde01), SHC(0xf0f488d9), SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7d8a5f40), SHC(0xe70747c4), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x7b31bbb2), SHC(0xdd417079), SHC(0x79bc384d), SHC(0xd8722192), + SHC(0x7816a759), SHC(0xd3b26fb0), SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x743e0918), SHC(0xca695b94), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6fadf2fc), SHC(0xc174dbf2), SHC(0x6d23501b), SHC(0xbd1ec45c), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x648543e4), SHC(0xb0c1878b), + SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x5dfe47ad), SHC(0xa91d0ea3), SHC(0x7fffffff), SHC(0x00000000), + SHC(0x7f9afcb9), SHC(0xf5f50d67), SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7c769e18), SHC(0xe21e765a), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x720c8075), SHC(0xc5e3a3a9), + SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x6154fb91), SHC(0xacdee2e8), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x53211d18), SHC(0x9eab046f), SHC(0x4b3c8c12), SHC(0x98722192), + SHC(0x42e13ba4), SHC(0x92dcafe5), SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x30fbc54d), SHC(0x89be50c3), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x1de189a6), SHC(0x838961e8), SHC(0x14060b68), SHC(0x81936daf), + SHC(0x0a0af299), SHC(0x80650347), SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f1cde01), SHC(0xf0f488d9), + SHC(0x7c769e18), SHC(0xe21e765a), SHC(0x7816a759), SHC(0xd3b26fb0), SHC(0x720c8075), SHC(0xc5e3a3a9), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x56e2f15d), SHC(0xa201b853), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x3e8b240e), SHC(0x90520d04), SHC(0x30fbc54d), SHC(0x89be50c3), + SHC(0x22be8f87), SHC(0x84ce444e), SHC(0x14060b68), SHC(0x81936daf), SHC(0x05067734), SHC(0x80194350), + SHC(0xf5f50d67), SHC(0x80650347), SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xd8722192), SHC(0x8643c7b3), + SHC(0xca695b94), SHC(0x8bc1f6e8), SHC(0xbd1ec45c), SHC(0x92dcafe5), SHC(0xb0c1878b), SHC(0x9b7abc1c), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x79bc384d), SHC(0xd8722192), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x5a82799a), SHC(0xa57d8666), + SHC(0x4b3c8c12), SHC(0x98722192), SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x278dde6e), SHC(0x8643c7b3), + SHC(0x14060b68), SHC(0x81936daf), SHC(0x00000000), SHC(0x80000000), SHC(0xebf9f498), SHC(0x81936daf), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xc5e3a3a9), SHC(0x8df37f8b), SHC(0xb4c373ee), SHC(0x98722192), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x98722192), SHC(0xb4c373ee), SHC(0x8df37f8b), SHC(0xc5e3a3a9), + SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x81936daf), SHC(0xebf9f498), SHC(0x7fffffff), SHC(0x00000000), + SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x6a6d98a4), SHC(0xb8e31319), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x471cece7), SHC(0x9592675c), SHC(0x30fbc54d), SHC(0x89be50c3), + SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x00000000), SHC(0x80000000), SHC(0xe70747c4), SHC(0x8275a0c0), + SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xb8e31319), SHC(0x9592675c), SHC(0xa57d8666), SHC(0xa57d8666), + SHC(0x9592675c), SHC(0xb8e31319), SHC(0x89be50c3), SHC(0xcf043ab3), SHC(0x8275a0c0), SHC(0xe70747c4), + SHC(0x80000000), SHC(0x00000000), SHC(0x8275a0c0), SHC(0x18f8b83c), SHC(0x89be50c3), SHC(0x30fbc54d), + SHC(0x9592675c), SHC(0x471cece7), SHC(0x7fffffff), SHC(0x00000000), SHC(0x7c769e18), SHC(0xe21e765a), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x4b3c8c12), SHC(0x98722192), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x14060b68), SHC(0x81936daf), SHC(0xf5f50d67), SHC(0x80650347), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xbd1ec45c), SHC(0x92dcafe5), SHC(0xa57d8666), SHC(0xa57d8666), + SHC(0x92dcafe5), SHC(0xbd1ec45c), SHC(0x8643c7b3), SHC(0xd8722192), SHC(0x80650347), SHC(0xf5f50d67), + SHC(0x81936daf), SHC(0x14060b68), SHC(0x89be50c3), SHC(0x30fbc54d), SHC(0x98722192), SHC(0x4b3c8c12), + SHC(0xacdee2e8), SHC(0x6154fb91), SHC(0xc5e3a3a9), SHC(0x720c8075), SHC(0xe21e765a), SHC(0x7c769e18), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7b31bbb2), SHC(0xdd417079), SHC(0x6d23501b), SHC(0xbd1ec45c), + SHC(0x56e2f15d), SHC(0xa201b853), SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x18f8b83c), SHC(0x8275a0c0), + SHC(0xf5f50d67), SHC(0x80650347), SHC(0xd3b26fb0), SHC(0x87e958a7), SHC(0xb4c373ee), SHC(0x98722192), + SHC(0x9b7abc1c), SHC(0xb0c1878b), SHC(0x89be50c3), SHC(0xcf043ab3), SHC(0x80e321ff), SHC(0xf0f488d9), + SHC(0x81936daf), SHC(0x14060b68), SHC(0x8bc1f6e8), SHC(0x3596a46c), SHC(0x9eab046f), SHC(0x53211d18), + SHC(0xb8e31319), SHC(0x6a6d98a4), SHC(0xd8722192), SHC(0x79bc384d), SHC(0xfaf988cc), SHC(0x7fe6bcb0), + SHC(0x1de189a6), SHC(0x7c769e18), SHC(0x3e8b240e), SHC(0x6fadf2fc), SHC(0x7fffffff), SHC(0x00000000), + SHC(0x7ff9af04), SHC(0xfd7ca4a6), SHC(0x7fe6bcb0), SHC(0xfaf988cc), SHC(0x7fc72ae2), SHC(0xf876ebe8), + SHC(0x7f9afcb9), SHC(0xf5f50d67), SHC(0x7f62368f), SHC(0xf3742ca2), SHC(0x7f1cde01), SHC(0xf0f488d9), + SHC(0x7ecaf9e5), SHC(0xee76612d), SHC(0x7e6c9251), SHC(0xebf9f498), SHC(0x7e01b096), SHC(0xe97f81eb), + SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7d06aa16), SHC(0xe4918486), SHC(0x7c769e18), SHC(0xe21e765a), + SHC(0x7bda497d), SHC(0xdfae5b23), SHC(0x7b31bbb2), SHC(0xdd417079), SHC(0x7a7d055b), SHC(0xdad7f3a2), + SHC(0x79bc384d), SHC(0xd8722192), SHC(0x78ef678f), SHC(0xd61036db), SHC(0x7816a759), SHC(0xd3b26fb0), + SHC(0x77320d0d), SHC(0xd15907d9), SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fc72ae2), SHC(0xf876ebe8), + SHC(0x7f1cde01), SHC(0xf0f488d9), SHC(0x7e01b096), SHC(0xe97f81eb), SHC(0x7c769e18), SHC(0xe21e765a), + SHC(0x7a7d055b), SHC(0xdad7f3a2), SHC(0x7816a759), SHC(0xd3b26fb0), SHC(0x7545a5a0), SHC(0xccb44322), + SHC(0x720c8075), SHC(0xc5e3a3a9), SHC(0x6e6e1492), SHC(0xbf469e83), SHC(0x6a6d98a4), SHC(0xb8e31319), + SHC(0x660e9a6a), SHC(0xb2beadcc), SHC(0x6154fb91), SHC(0xacdee2e8), SHC(0x5c44ee40), SHC(0xa748e9ce), + SHC(0x56e2f15d), SHC(0xa201b853), SHC(0x5133cc94), SHC(0x9d0dfe54), SHC(0x4b3c8c12), SHC(0x98722192), + SHC(0x45027c0c), SHC(0x943239c7), SHC(0x3e8b240e), SHC(0x90520d04), SHC(0x37dc420c), SHC(0x8cd50c59), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f62368f), SHC(0xf3742ca2), SHC(0x7d8a5f40), SHC(0xe70747c4), + SHC(0x7a7d055b), SHC(0xdad7f3a2), SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x70e2cbc6), SHC(0xc3a94590), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x62f201ac), SHC(0xaecc336c), SHC(0x5a82799a), SHC(0xa57d8666), + SHC(0x5133cc94), SHC(0x9d0dfe54), SHC(0x471cece7), SHC(0x9592675c), SHC(0x3c56ba70), SHC(0x8f1d343a), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x25280c5e), SHC(0x8582faa5), SHC(0x18f8b83c), SHC(0x8275a0c0), + SHC(0x0c8bd35e), SHC(0x809dc971), SHC(0x00000000), SHC(0x80000000), SHC(0xf3742ca2), SHC(0x809dc971), + SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xdad7f3a2), SHC(0x8582faa5), SHC(0x7fffffff), SHC(0x00000000), + SHC(0x7ecaf9e5), SHC(0xee76612d), SHC(0x7b31bbb2), SHC(0xdd417079), SHC(0x7545a5a0), SHC(0xccb44322), + SHC(0x6d23501b), SHC(0xbd1ec45c), SHC(0x62f201ac), SHC(0xaecc336c), SHC(0x56e2f15d), SHC(0xa201b853), + SHC(0x4930590f), SHC(0x96fd15e3), SHC(0x3a1c5c57), SHC(0x8df37f8b), SHC(0x29efc925), SHC(0x87109871), + SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x07891418), SHC(0x8038d51e), SHC(0xf5f50d67), SHC(0x80650347), + SHC(0xe4918486), SHC(0x82f955ea), SHC(0xd3b26fb0), SHC(0x87e958a7), SHC(0xc3a94590), SHC(0x8f1d343a), + SHC(0xb4c373ee), SHC(0x98722192), SHC(0xa748e9ce), SHC(0xa3bb11c0), SHC(0x9b7abc1c), SHC(0xb0c1878b), + SHC(0x9191eb6e), SHC(0xbf469e83), SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e01b096), SHC(0xe97f81eb), + SHC(0x7816a759), SHC(0xd3b26fb0), SHC(0x6e6e1492), SHC(0xbf469e83), SHC(0x6154fb91), SHC(0xacdee2e8), + SHC(0x5133cc94), SHC(0x9d0dfe54), SHC(0x3e8b240e), SHC(0x90520d04), SHC(0x29efc925), SHC(0x87109871), + SHC(0x14060b68), SHC(0x81936daf), SHC(0xfd7ca4a6), SHC(0x800650fc), SHC(0xe70747c4), SHC(0x8275a0c0), + SHC(0xd15907d9), SHC(0x88cdf2f3), SHC(0xbd1ec45c), SHC(0x92dcafe5), SHC(0xaaf9c6af), SHC(0xa051a5ab), + SHC(0x9b7abc1c), SHC(0xb0c1878b), SHC(0x8f1d343a), SHC(0xc3a94590), SHC(0x8643c7b3), SHC(0xd8722192), + SHC(0x8135061b), SHC(0xee76612d), SHC(0x80194350), SHC(0x05067734), SHC(0x82f955ea), SHC(0x1b6e7b7a), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7d06aa16), SHC(0xe4918486), SHC(0x743e0918), SHC(0xca695b94), + SHC(0x660e9a6a), SHC(0xb2beadcc), SHC(0x53211d18), SHC(0x9eab046f), SHC(0x3c56ba70), SHC(0x8f1d343a), + SHC(0x22be8f87), SHC(0x84ce444e), SHC(0x07891418), SHC(0x8038d51e), SHC(0xebf9f498), SHC(0x81936daf), + SHC(0xd15907d9), SHC(0x88cdf2f3), SHC(0xb8e31319), SHC(0x9592675c), SHC(0xa3bb11c0), SHC(0xa748e9ce), + SHC(0x92dcafe5), SHC(0xbd1ec45c), SHC(0x87109871), SHC(0xd61036db), SHC(0x80e321ff), SHC(0xf0f488d9), + SHC(0x809dc971), SHC(0x0c8bd35e), SHC(0x8643c7b3), SHC(0x278dde6e), SHC(0x9191eb6e), SHC(0x40b9617d), + SHC(0xa201b853), SHC(0x56e2f15d), SHC(0xb6cfa6f1), SHC(0x6902ea1d), SHC(0x7fffffff), SHC(0x00000000), + SHC(0x7bda497d), SHC(0xdfae5b23), SHC(0x6fadf2fc), SHC(0xc174dbf2), SHC(0x5c44ee40), SHC(0xa748e9ce), + SHC(0x42e13ba4), SHC(0x92dcafe5), SHC(0x25280c5e), SHC(0x8582faa5), SHC(0x05067734), SHC(0x80194350), + SHC(0xe4918486), SHC(0x82f955ea), SHC(0xc5e3a3a9), SHC(0x8df37f8b), SHC(0xaaf9c6af), SHC(0xa051a5ab), + SHC(0x9592675c), SHC(0xb8e31319), SHC(0x87109871), SHC(0xd61036db), SHC(0x80650347), SHC(0xf5f50d67), + SHC(0x81fe4f6a), SHC(0x16807e15), SHC(0x8bc1f6e8), SHC(0x3596a46c), SHC(0x9d0dfe54), SHC(0x5133cc94), + SHC(0xb4c373ee), SHC(0x678dde6e), SHC(0xd15907d9), SHC(0x77320d0d), SHC(0xf0f488d9), SHC(0x7f1cde01), + SHC(0x11899ed3), SHC(0x7ecaf9e5), SHC(0x7fffffff), SHC(0x00000000), SHC(0x7a7d055b), SHC(0xdad7f3a2), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x5133cc94), SHC(0x9d0dfe54), SHC(0x30fbc54d), SHC(0x89be50c3), + SHC(0x0c8bd35e), SHC(0x809dc971), SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xc3a94590), SHC(0x8f1d343a), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x8f1d343a), SHC(0xc3a94590), SHC(0x8275a0c0), SHC(0xe70747c4), + SHC(0x809dc971), SHC(0x0c8bd35e), SHC(0x89be50c3), SHC(0x30fbc54d), SHC(0x9d0dfe54), SHC(0x5133cc94), + SHC(0xb8e31319), SHC(0x6a6d98a4), SHC(0xdad7f3a2), SHC(0x7a7d055b), SHC(0x00000000), SHC(0x7fffffff), + SHC(0x25280c5e), SHC(0x7a7d055b), SHC(0x471cece7), SHC(0x6a6d98a4), SHC(0x62f201ac), SHC(0x5133cc94)}; + + +/* Twiddle coefficients for 32x8 FFTs, generated by fft_tables.py */ +#ifdef ENABLE_HR_MODE +const Word32 RotVector_32_8[2 * (256 - 32)] = { +#else +const Word16 RotVector_32_8[2 * (256 - 32)] = { +#endif + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ff62182), SHC(0xfcdbd541), SHC(0x7fd8878e), SHC(0xf9b82684), + SHC(0x7fa736b4), SHC(0xf6956fb7), SHC(0x7f62368f), SHC(0xf3742ca2), SHC(0x7f0991c4), SHC(0xf054d8d5), + SHC(0x7e9d55fc), SHC(0xed37ef91), SHC(0x7e1d93ea), SHC(0xea1debbb), SHC(0x7d8a5f40), SHC(0xe70747c4), + SHC(0x7ce3ceb2), SHC(0xe3f47d96), SHC(0x7c29fbee), SHC(0xe0e60685), SHC(0x7b5d039e), SHC(0xdddc5b3b), + SHC(0x7a7d055b), SHC(0xdad7f3a2), SHC(0x798a23b1), SHC(0xd7d946d8), SHC(0x78848414), SHC(0xd4e0cb15), + SHC(0x776c4edb), SHC(0xd1eef59e), SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x7504d345), SHC(0xcc210d79), + SHC(0x73b5ebd1), SHC(0xc945dfec), SHC(0x72552c85), SHC(0xc67322ce), SHC(0x70e2cbc6), SHC(0xc3a94590), + SHC(0x6f5f02b2), SHC(0xc0e8b648), SHC(0x6dca0d14), SHC(0xbe31e19b), SHC(0x6c242960), SHC(0xbb8532b0), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x68a69e81), SHC(0xb64beacd), SHC(0x66cf8120), SHC(0xb3c0200c), + SHC(0x64e88926), SHC(0xb140175b), SHC(0x62f201ac), SHC(0xaecc336c), SHC(0x60ec3830), SHC(0xac64d510), + SHC(0x5ed77c8a), SHC(0xaa0a5b2e), SHC(0x5cb420e0), SHC(0xa7bd22ac), SHC(0x7fffffff), SHC(0x00000000), + SHC(0x7fd8878e), SHC(0xf9b82684), SHC(0x7f62368f), SHC(0xf3742ca2), SHC(0x7e9d55fc), SHC(0xed37ef91), + SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7c29fbee), SHC(0xe0e60685), SHC(0x7a7d055b), SHC(0xdad7f3a2), + SHC(0x78848414), SHC(0xd4e0cb15), SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x73b5ebd1), SHC(0xc945dfec), + SHC(0x70e2cbc6), SHC(0xc3a94590), SHC(0x6dca0d14), SHC(0xbe31e19b), SHC(0x6a6d98a4), SHC(0xb8e31319), + SHC(0x66cf8120), SHC(0xb3c0200c), SHC(0x62f201ac), SHC(0xaecc336c), SHC(0x5ed77c8a), SHC(0xaa0a5b2e), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x55f5a4d2), SHC(0xa1288376), SHC(0x5133cc94), SHC(0x9d0dfe54), + SHC(0x4c3fdff4), SHC(0x99307ee0), SHC(0x471cece7), SHC(0x9592675c), SHC(0x41ce1e65), SHC(0x9235f2ec), + SHC(0x3c56ba70), SHC(0x8f1d343a), SHC(0x36ba2014), SHC(0x8c4a142f), SHC(0x30fbc54d), SHC(0x89be50c3), + SHC(0x2b1f34eb), SHC(0x877b7bec), SHC(0x25280c5e), SHC(0x8582faa5), SHC(0x1f19f97b), SHC(0x83d60412), + SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x12c8106f), SHC(0x8162aa04), SHC(0x0c8bd35e), SHC(0x809dc971), + SHC(0x0647d97c), SHC(0x80277872), SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fa736b4), SHC(0xf6956fb7), + SHC(0x7e9d55fc), SHC(0xed37ef91), SHC(0x7ce3ceb2), SHC(0xe3f47d96), SHC(0x7a7d055b), SHC(0xdad7f3a2), + SHC(0x776c4edb), SHC(0xd1eef59e), SHC(0x73b5ebd1), SHC(0xc945dfec), SHC(0x6f5f02b2), SHC(0xc0e8b648), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x64e88926), SHC(0xb140175b), SHC(0x5ed77c8a), SHC(0xaa0a5b2e), + SHC(0x5842dd54), SHC(0xa34bdf20), SHC(0x5133cc94), SHC(0x9d0dfe54), SHC(0x49b41533), SHC(0x9759617f), + SHC(0x41ce1e65), SHC(0x9235f2ec), SHC(0x398cdd32), SHC(0x8daad37b), SHC(0x30fbc54d), SHC(0x89be50c3), + SHC(0x2826b928), SHC(0x8675dc4f), SHC(0x1f19f97b), SHC(0x83d60412), SHC(0x15e21445), SHC(0x81e26c16), + SHC(0x0c8bd35e), SHC(0x809dc971), SHC(0x03242abf), SHC(0x8009de7e), SHC(0xf9b82684), SHC(0x80277872), + SHC(0xf054d8d5), SHC(0x80f66e3c), SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xdddc5b3b), SHC(0x84a2fc62), + SHC(0xd4e0cb15), SHC(0x877b7bec), SHC(0xcc210d79), SHC(0x8afb2cbb), SHC(0xc3a94590), SHC(0x8f1d343a), + SHC(0xbb8532b0), SHC(0x93dbd6a0), SHC(0xb3c0200c), SHC(0x99307ee0), SHC(0xac64d510), SHC(0x9f13c7d0), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f62368f), SHC(0xf3742ca2), SHC(0x7d8a5f40), SHC(0xe70747c4), + SHC(0x7a7d055b), SHC(0xdad7f3a2), SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x70e2cbc6), SHC(0xc3a94590), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x62f201ac), SHC(0xaecc336c), SHC(0x5a82799a), SHC(0xa57d8666), + SHC(0x5133cc94), SHC(0x9d0dfe54), SHC(0x471cece7), SHC(0x9592675c), SHC(0x3c56ba70), SHC(0x8f1d343a), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x25280c5e), SHC(0x8582faa5), SHC(0x18f8b83c), SHC(0x8275a0c0), + SHC(0x0c8bd35e), SHC(0x809dc971), SHC(0x00000000), SHC(0x80000000), SHC(0xf3742ca2), SHC(0x809dc971), + SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xdad7f3a2), SHC(0x8582faa5), SHC(0xcf043ab3), SHC(0x89be50c3), + SHC(0xc3a94590), SHC(0x8f1d343a), SHC(0xb8e31319), SHC(0x9592675c), SHC(0xaecc336c), SHC(0x9d0dfe54), + SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x9d0dfe54), SHC(0xaecc336c), SHC(0x9592675c), SHC(0xb8e31319), + SHC(0x8f1d343a), SHC(0xc3a94590), SHC(0x89be50c3), SHC(0xcf043ab3), SHC(0x8582faa5), SHC(0xdad7f3a2), + SHC(0x8275a0c0), SHC(0xe70747c4), SHC(0x809dc971), SHC(0xf3742ca2), SHC(0x7fffffff), SHC(0x00000000), + SHC(0x7f0991c4), SHC(0xf054d8d5), SHC(0x7c29fbee), SHC(0xe0e60685), SHC(0x776c4edb), SHC(0xd1eef59e), + SHC(0x70e2cbc6), SHC(0xc3a94590), SHC(0x68a69e81), SHC(0xb64beacd), SHC(0x5ed77c8a), SHC(0xaa0a5b2e), + SHC(0x539b2af0), SHC(0x9f13c7d0), SHC(0x471cece7), SHC(0x9592675c), SHC(0x398cdd32), SHC(0x8daad37b), + SHC(0x2b1f34eb), SHC(0x877b7bec), SHC(0x1c0b826a), SHC(0x831c314e), SHC(0x0c8bd35e), SHC(0x809dc971), + SHC(0xfcdbd541), SHC(0x8009de7e), SHC(0xed37ef91), SHC(0x8162aa04), SHC(0xdddc5b3b), SHC(0x84a2fc62), + SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xc0e8b648), SHC(0x90a0fd4e), SHC(0xb3c0200c), SHC(0x99307ee0), + SHC(0xa7bd22ac), SHC(0xa34bdf20), SHC(0x9d0dfe54), SHC(0xaecc336c), SHC(0x93dbd6a0), SHC(0xbb8532b0), + SHC(0x8c4a142f), SHC(0xc945dfec), SHC(0x8675dc4f), SHC(0xd7d946d8), SHC(0x8275a0c0), SHC(0xe70747c4), + SHC(0x8058c94c), SHC(0xf6956fb7), SHC(0x80277872), SHC(0x0647d97c), SHC(0x81e26c16), SHC(0x15e21445), + SHC(0x8582faa5), SHC(0x25280c5e), SHC(0x8afb2cbb), SHC(0x33def287), SHC(0x9235f2ec), SHC(0x41ce1e65), + SHC(0x9b1776da), SHC(0x4ebfe8a5), SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e9d55fc), SHC(0xed37ef91), + SHC(0x7a7d055b), SHC(0xdad7f3a2), SHC(0x73b5ebd1), SHC(0xc945dfec), SHC(0x6a6d98a4), SHC(0xb8e31319), + SHC(0x5ed77c8a), SHC(0xaa0a5b2e), SHC(0x5133cc94), SHC(0x9d0dfe54), SHC(0x41ce1e65), SHC(0x9235f2ec), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x1f19f97b), SHC(0x83d60412), SHC(0x0c8bd35e), SHC(0x809dc971), + SHC(0xf9b82684), SHC(0x80277872), SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xd4e0cb15), SHC(0x877b7bec), + SHC(0xc3a94590), SHC(0x8f1d343a), SHC(0xb3c0200c), SHC(0x99307ee0), SHC(0xa57d8666), SHC(0xa57d8666), + SHC(0x99307ee0), SHC(0xb3c0200c), SHC(0x8f1d343a), SHC(0xc3a94590), SHC(0x877b7bec), SHC(0xd4e0cb15), + SHC(0x8275a0c0), SHC(0xe70747c4), SHC(0x80277872), SHC(0xf9b82684), SHC(0x809dc971), SHC(0x0c8bd35e), + SHC(0x83d60412), SHC(0x1f19f97b), SHC(0x89be50c3), SHC(0x30fbc54d), SHC(0x9235f2ec), SHC(0x41ce1e65), + SHC(0x9d0dfe54), SHC(0x5133cc94), SHC(0xaa0a5b2e), SHC(0x5ed77c8a), SHC(0xb8e31319), SHC(0x6a6d98a4), + SHC(0xc945dfec), SHC(0x73b5ebd1), SHC(0xdad7f3a2), SHC(0x7a7d055b), SHC(0xed37ef91), SHC(0x7e9d55fc), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e1d93ea), SHC(0xea1debbb), SHC(0x78848414), SHC(0xd4e0cb15), + SHC(0x6f5f02b2), SHC(0xc0e8b648), SHC(0x62f201ac), SHC(0xaecc336c), SHC(0x539b2af0), SHC(0x9f13c7d0), + SHC(0x41ce1e65), SHC(0x9235f2ec), SHC(0x2e110a62), SHC(0x8893b125), SHC(0x18f8b83c), SHC(0x8275a0c0), + SHC(0x03242abf), SHC(0x8009de7e), SHC(0xed37ef91), SHC(0x8162aa04), SHC(0xd7d946d8), SHC(0x8675dc4f), + SHC(0xc3a94590), SHC(0x8f1d343a), SHC(0xb140175b), SHC(0x9b1776da), SHC(0xa1288376), SHC(0xaa0a5b2e), + SHC(0x93dbd6a0), SHC(0xbb8532b0), SHC(0x89be50c3), SHC(0xcf043ab3), SHC(0x831c314e), SHC(0xe3f47d96), + SHC(0x80277872), SHC(0xf9b82684), SHC(0x80f66e3c), SHC(0x0fab272b), SHC(0x8582faa5), SHC(0x25280c5e), + SHC(0x8daad37b), SHC(0x398cdd32), SHC(0x99307ee0), SHC(0x4c3fdff4), SHC(0xa7bd22ac), SHC(0x5cb420e0), + SHC(0xb8e31319), SHC(0x6a6d98a4), SHC(0xcc210d79), SHC(0x7504d345), SHC(0xe0e60685), SHC(0x7c29fbee), + SHC(0xf6956fb7), SHC(0x7fa736b4), SHC(0x0c8bd35e), SHC(0x7f62368f), SHC(0x2223a4c5), SHC(0x7b5d039e), + SHC(0x36ba2014), SHC(0x73b5ebd1), SHC(0x49b41533), SHC(0x68a69e81)}; + + +#ifdef ENABLE_HR_MODE +const Word32 RotVector_15_6[2 * (90 - 15)] = { +#else +const Word16 RotVector_15_6[2 * (90 - 15)] = { +#endif + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fb02dc6), SHC(0xf7123849), SHC(0x7ec11aa5), SHC(0xee2f9369), + SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x7b0a9f8d), SHC(0xdcb7ea46), SHC(0x7847d909), SHC(0xd438af17), + SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x71046d3e), SHC(0xc3e85b18), SHC(0x6c8cd70b), SHC(0xbc2b9b05), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x620dbe8b), SHC(0xadb922b7), SHC(0x5c13539b), SHC(0xa7156f3c), + SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x4ecdfec7), SHC(0x9b2276b0), SHC(0x4793a210), SHC(0x95e218c9), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ec11aa5), SHC(0xee2f9369), SHC(0x7b0a9f8d), SHC(0xdcb7ea46), + SHC(0x74ef0ebc), SHC(0xcbf00dbe), SHC(0x6c8cd70b), SHC(0xbc2b9b05), SHC(0x620dbe8b), SHC(0xadb922b7), + SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x4793a210), SHC(0x95e218c9), SHC(0x381c8bb5), SHC(0x8cf45113), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x163a1a7e), SHC(0x81f1d1ce), SHC(0x04779632), SHC(0x8013f61d), + SHC(0xf29ecfb2), SHC(0x80b381ac), SHC(0xe108b40d), SHC(0x83cd5982), SHC(0xd00ce422), SHC(0x89520a1a), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7d33f0ca), SHC(0xe5632654), SHC(0x74ef0ebc), SHC(0xcbf00dbe), + SHC(0x678dde6e), SHC(0xb4c373ee), SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x40000000), SHC(0x9126145f), + SHC(0x278dde6e), SHC(0x8643c7b3), SHC(0x0d61304e), SHC(0x80b381ac), SHC(0xf29ecfb2), SHC(0x80b381ac), + SHC(0xd8722192), SHC(0x8643c7b3), SHC(0xc0000000), SHC(0x9126145f), SHC(0xaa59eda4), SHC(0xa0e0a15f), + SHC(0x98722192), SHC(0xb4c373ee), SHC(0x8b10f144), SHC(0xcbf00dbe), SHC(0x82cc0f36), SHC(0xe5632654), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7b0a9f8d), SHC(0xdcb7ea46), SHC(0x6c8cd70b), SHC(0xbc2b9b05), + SHC(0x55a6125c), SHC(0xa0e0a15f), SHC(0x381c8bb5), SHC(0x8cf45113), SHC(0x163a1a7e), SHC(0x81f1d1ce), + SHC(0xf29ecfb2), SHC(0x80b381ac), SHC(0xd00ce422), SHC(0x89520a1a), SHC(0xb1320139), SHC(0x9b2276b0), + SHC(0x98722192), SHC(0xb4c373ee), SHC(0x87b826f7), SHC(0xd438af17), SHC(0x804fd23a), SHC(0xf7123849), + SHC(0x82cc0f36), SHC(0x1a9cd9ac), SHC(0x8efb92c2), SHC(0x3c17a4e8), SHC(0xa3ecac65), SHC(0x58ea90c4), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7847d909), SHC(0xd438af17), SHC(0x620dbe8b), SHC(0xadb922b7), + SHC(0x40000000), SHC(0x9126145f), SHC(0x163a1a7e), SHC(0x81f1d1ce), SHC(0xe9c5e582), SHC(0x81f1d1ce), + SHC(0xc0000000), SHC(0x9126145f), SHC(0x9df24175), SHC(0xadb922b7), SHC(0x87b826f7), SHC(0xd438af17), + SHC(0x80000000), SHC(0x00000000), SHC(0x87b826f7), SHC(0x2bc750e9), SHC(0x9df24175), SHC(0x5246dd49), + SHC(0xc0000000), SHC(0x6ed9eba1), SHC(0xe9c5e582), SHC(0x7e0e2e32), SHC(0x163a1a7e), SHC(0x7e0e2e32)}; + +#if defined(SUBSET_SSWB) || defined(SUBSET_SWB) || defined(SUBSET_FB) +/* Twiddle coefficients for 32x12 FFTs, generated by fft_tables.py */ +#ifdef ENABLE_HR_MODE +const Word32 RotVector_32_12[2 * (384 - 32)] = { +#else +const Word16 RotVector_32_12[2 * (384 - 32)] = { +#endif + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7ffb9d15), SHC(0xfde7dbd9), SHC(0x7fee74a2), SHC(0xfbcfdc71), + SHC(0x7fd8878e), SHC(0xf9b82684), SHC(0x7fb9d759), SHC(0xf7a0dec9), SHC(0x7f92661d), SHC(0xf58a29f2), + SHC(0x7f62368f), SHC(0xf3742ca2), SHC(0x7f294bfd), SHC(0xf15f0b74), SHC(0x7ee7aa4c), SHC(0xef4aeaf1), + SHC(0x7e9d55fc), SHC(0xed37ef91), SHC(0x7e4a5426), SHC(0xeb263dbb), SHC(0x7deeaa7a), SHC(0xe915f9ba), + SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7d1d7958), SHC(0xe4fa4bf1), SHC(0x7ca80038), SHC(0xe2ef2a3e), + SHC(0x7c29fbee), SHC(0xe0e60685), SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x7b1474fd), SHC(0xdcda47b9), + SHC(0x7a7d055b), SHC(0xdad7f3a2), SHC(0x79dd3098), SHC(0xd8d82b7a), SHC(0x793501a9), SHC(0xd6db1254), + SHC(0x78848414), SHC(0xd4e0cb15), SHC(0x77cbc3f2), SHC(0xd2e9786e), SHC(0x770acdec), SHC(0xd0f53ce0), + SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x757075ac), SHC(0xcd1693f7), SHC(0x74972f92), SHC(0xcb2c6a82), + SHC(0x73b5ebd1), SHC(0xc945dfec), SHC(0x72ccb9db), SHC(0xc763158e), SHC(0x71dba9ab), SHC(0xc5842c7e), + SHC(0x70e2cbc6), SHC(0xc3a94590), SHC(0x6fe2313c), SHC(0xc1d2814f), SHC(0x7fffffff), SHC(0x00000000), + SHC(0x7fee74a2), SHC(0xfbcfdc71), SHC(0x7fb9d759), SHC(0xf7a0dec9), SHC(0x7f62368f), SHC(0xf3742ca2), + SHC(0x7ee7aa4c), SHC(0xef4aeaf1), SHC(0x7e4a5426), SHC(0xeb263dbb), SHC(0x7d8a5f40), SHC(0xe70747c4), + SHC(0x7ca80038), SHC(0xe2ef2a3e), SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x7a7d055b), SHC(0xdad7f3a2), + SHC(0x793501a9), SHC(0xd6db1254), SHC(0x77cbc3f2), SHC(0xd2e9786e), SHC(0x7641af3d), SHC(0xcf043ab3), + SHC(0x74972f92), SHC(0xcb2c6a82), SHC(0x72ccb9db), SHC(0xc763158e), SHC(0x70e2cbc6), SHC(0xc3a94590), + SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x6cb2a837), SHC(0xbc6845ce), SHC(0x6a6d98a4), SHC(0xb8e31319), + SHC(0x680b5c33), SHC(0xb5715eef), SHC(0x658c9a2d), SHC(0xb2141b02), SHC(0x62f201ac), SHC(0xaecc336c), + SHC(0x603c496c), SHC(0xab9a8e6c), SHC(0x5d6c2f99), SHC(0xa8800c26), SHC(0x5a82799a), SHC(0xa57d8666), + SHC(0x577ff3da), SHC(0xa293d067), SHC(0x54657194), SHC(0x9fc3b694), SHC(0x5133cc94), SHC(0x9d0dfe54), + SHC(0x4debe4fe), SHC(0x9a7365d3), SHC(0x4a8ea111), SHC(0x97f4a3cd), SHC(0x471cece7), SHC(0x9592675c), + SHC(0x4397ba32), SHC(0x934d57c9), SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fd8878e), SHC(0xf9b82684), + SHC(0x7f62368f), SHC(0xf3742ca2), SHC(0x7e9d55fc), SHC(0xed37ef91), SHC(0x7d8a5f40), SHC(0xe70747c4), + SHC(0x7c29fbee), SHC(0xe0e60685), SHC(0x7a7d055b), SHC(0xdad7f3a2), SHC(0x78848414), SHC(0xd4e0cb15), + SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x73b5ebd1), SHC(0xc945dfec), SHC(0x70e2cbc6), SHC(0xc3a94590), + SHC(0x6dca0d14), SHC(0xbe31e19b), SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x66cf8120), SHC(0xb3c0200c), + SHC(0x62f201ac), SHC(0xaecc336c), SHC(0x5ed77c8a), SHC(0xaa0a5b2e), SHC(0x5a82799a), SHC(0xa57d8666), + SHC(0x55f5a4d2), SHC(0xa1288376), SHC(0x5133cc94), SHC(0x9d0dfe54), SHC(0x4c3fdff4), SHC(0x99307ee0), + SHC(0x471cece7), SHC(0x9592675c), SHC(0x41ce1e65), SHC(0x9235f2ec), SHC(0x3c56ba70), SHC(0x8f1d343a), + SHC(0x36ba2014), SHC(0x8c4a142f), SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x2b1f34eb), SHC(0x877b7bec), + SHC(0x25280c5e), SHC(0x8582faa5), SHC(0x1f19f97b), SHC(0x83d60412), SHC(0x18f8b83c), SHC(0x8275a0c0), + SHC(0x12c8106f), SHC(0x8162aa04), SHC(0x0c8bd35e), SHC(0x809dc971), SHC(0x0647d97c), SHC(0x80277872), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7fb9d759), SHC(0xf7a0dec9), SHC(0x7ee7aa4c), SHC(0xef4aeaf1), + SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x793501a9), SHC(0xd6db1254), + SHC(0x7641af3d), SHC(0xcf043ab3), SHC(0x72ccb9db), SHC(0xc763158e), SHC(0x6ed9eba1), SHC(0xc0000000), + SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x658c9a2d), SHC(0xb2141b02), SHC(0x603c496c), SHC(0xab9a8e6c), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x54657194), SHC(0x9fc3b694), SHC(0x4debe4fe), SHC(0x9a7365d3), + SHC(0x471cece7), SHC(0x9592675c), SHC(0x40000000), SHC(0x9126145f), SHC(0x389cea72), SHC(0x8d334625), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x2924edac), SHC(0x86cafe57), SHC(0x2120fb83), SHC(0x845c8ae3), + SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x10b5150f), SHC(0x811855b4), SHC(0x085f2137), SHC(0x804628a7), + SHC(0x00000000), SHC(0x80000000), SHC(0xf7a0dec9), SHC(0x804628a7), SHC(0xef4aeaf1), SHC(0x811855b4), + SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xdedf047d), SHC(0x845c8ae3), SHC(0xd6db1254), SHC(0x86cafe57), + SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xc763158e), SHC(0x8d334625), SHC(0x7fffffff), SHC(0x00000000), + SHC(0x7f92661d), SHC(0xf58a29f2), SHC(0x7e4a5426), SHC(0xeb263dbb), SHC(0x7c29fbee), SHC(0xe0e60685), + SHC(0x793501a9), SHC(0xd6db1254), SHC(0x757075ac), SHC(0xcd1693f7), SHC(0x70e2cbc6), SHC(0xc3a94590), + SHC(0x6b93d02e), SHC(0xbaa34bf4), SHC(0x658c9a2d), SHC(0xb2141b02), SHC(0x5ed77c8a), SHC(0xaa0a5b2e), + SHC(0x577ff3da), SHC(0xa293d067), SHC(0x4f9292dc), SHC(0x9bbd4282), SHC(0x471cece7), SHC(0x9592675c), + SHC(0x3e2d7eb1), SHC(0x901dcec4), SHC(0x34d3957e), SHC(0x8b68d06e), SHC(0x2b1f34eb), SHC(0x877b7bec), + SHC(0x2120fb83), SHC(0x845c8ae3), SHC(0x16ea0646), SHC(0x82115586), SHC(0x0c8bd35e), SHC(0x809dc971), + SHC(0x02182427), SHC(0x800462eb), SHC(0xf7a0dec9), SHC(0x804628a7), SHC(0xed37ef91), SHC(0x8162aa04), + SHC(0xe2ef2a3e), SHC(0x8357ffc8), SHC(0xd8d82b7a), SHC(0x8622cf68), SHC(0xcf043ab3), SHC(0x89be50c3), + SHC(0xc5842c7e), SHC(0x8e245655), SHC(0xbc6845ce), SHC(0x934d57c9), SHC(0xb3c0200c), SHC(0x99307ee0), + SHC(0xab9a8e6c), SHC(0x9fc3b694), SHC(0xa405847e), SHC(0xa6fbbc59), SHC(0x9d0dfe54), SHC(0xaecc336c), + SHC(0x96bfea3d), SHC(0xb727b9f7), SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f62368f), SHC(0xf3742ca2), + SHC(0x7d8a5f40), SHC(0xe70747c4), SHC(0x7a7d055b), SHC(0xdad7f3a2), SHC(0x7641af3d), SHC(0xcf043ab3), + SHC(0x70e2cbc6), SHC(0xc3a94590), SHC(0x6a6d98a4), SHC(0xb8e31319), SHC(0x62f201ac), SHC(0xaecc336c), + SHC(0x5a82799a), SHC(0xa57d8666), SHC(0x5133cc94), SHC(0x9d0dfe54), SHC(0x471cece7), SHC(0x9592675c), + SHC(0x3c56ba70), SHC(0x8f1d343a), SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x25280c5e), SHC(0x8582faa5), + SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x0c8bd35e), SHC(0x809dc971), SHC(0x00000000), SHC(0x80000000), + SHC(0xf3742ca2), SHC(0x809dc971), SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xdad7f3a2), SHC(0x8582faa5), + SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xc3a94590), SHC(0x8f1d343a), SHC(0xb8e31319), SHC(0x9592675c), + SHC(0xaecc336c), SHC(0x9d0dfe54), SHC(0xa57d8666), SHC(0xa57d8666), SHC(0x9d0dfe54), SHC(0xaecc336c), + SHC(0x9592675c), SHC(0xb8e31319), SHC(0x8f1d343a), SHC(0xc3a94590), SHC(0x89be50c3), SHC(0xcf043ab3), + SHC(0x8582faa5), SHC(0xdad7f3a2), SHC(0x8275a0c0), SHC(0xe70747c4), SHC(0x809dc971), SHC(0xf3742ca2), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7f294bfd), SHC(0xf15f0b74), SHC(0x7ca80038), SHC(0xe2ef2a3e), + SHC(0x78848414), SHC(0xd4e0cb15), SHC(0x72ccb9db), SHC(0xc763158e), SHC(0x6b93d02e), SHC(0xbaa34bf4), + SHC(0x62f201ac), SHC(0xaecc336c), SHC(0x590443a7), SHC(0xa405847e), SHC(0x4debe4fe), SHC(0x9a7365d3), + SHC(0x41ce1e65), SHC(0x9235f2ec), SHC(0x34d3957e), SHC(0x8b68d06e), SHC(0x2727d486), SHC(0x8622cf68), + SHC(0x18f8b83c), SHC(0x8275a0c0), SHC(0x0a75d60e), SHC(0x806d99e3), SHC(0xfbcfdc71), SHC(0x80118b5e), + SHC(0xed37ef91), SHC(0x8162aa04), SHC(0xdedf047d), SHC(0x845c8ae3), SHC(0xd0f53ce0), SHC(0x88f53214), + SHC(0xc3a94590), SHC(0x8f1d343a), SHC(0xb727b9f7), SHC(0x96bfea3d), SHC(0xab9a8e6c), SHC(0x9fc3b694), + SHC(0xa1288376), SHC(0xaa0a5b2e), SHC(0x97f4a3cd), SHC(0xb5715eef), SHC(0x901dcec4), SHC(0xc1d2814f), + SHC(0x89be50c3), SHC(0xcf043ab3), SHC(0x84eb8b03), SHC(0xdcda47b9), SHC(0x81b5abda), SHC(0xeb263dbb), + SHC(0x80277872), SHC(0xf9b82684), SHC(0x804628a7), SHC(0x085f2137), SHC(0x82115586), SHC(0x16ea0646), + SHC(0x8582faa5), SHC(0x25280c5e), SHC(0x8a8f8a54), SHC(0x32e96c09), SHC(0x7fffffff), SHC(0x00000000), + SHC(0x7ee7aa4c), SHC(0xef4aeaf1), SHC(0x7ba3751d), SHC(0xdedf047d), SHC(0x7641af3d), SHC(0xcf043ab3), + SHC(0x6ed9eba1), SHC(0xc0000000), SHC(0x658c9a2d), SHC(0xb2141b02), SHC(0x5a82799a), SHC(0xa57d8666), + SHC(0x4debe4fe), SHC(0x9a7365d3), SHC(0x40000000), SHC(0x9126145f), SHC(0x30fbc54d), SHC(0x89be50c3), + SHC(0x2120fb83), SHC(0x845c8ae3), SHC(0x10b5150f), SHC(0x811855b4), SHC(0x00000000), SHC(0x80000000), + SHC(0xef4aeaf1), SHC(0x811855b4), SHC(0xdedf047d), SHC(0x845c8ae3), SHC(0xcf043ab3), SHC(0x89be50c3), + SHC(0xc0000000), SHC(0x9126145f), SHC(0xb2141b02), SHC(0x9a7365d3), SHC(0xa57d8666), SHC(0xa57d8666), + SHC(0x9a7365d3), SHC(0xb2141b02), SHC(0x9126145f), SHC(0xc0000000), SHC(0x89be50c3), SHC(0xcf043ab3), + SHC(0x845c8ae3), SHC(0xdedf047d), SHC(0x811855b4), SHC(0xef4aeaf1), SHC(0x80000000), SHC(0x00000000), + SHC(0x811855b4), SHC(0x10b5150f), SHC(0x845c8ae3), SHC(0x2120fb83), SHC(0x89be50c3), SHC(0x30fbc54d), + SHC(0x9126145f), SHC(0x40000000), SHC(0x9a7365d3), SHC(0x4debe4fe), SHC(0xa57d8666), SHC(0x5a82799a), + SHC(0xb2141b02), SHC(0x658c9a2d), SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e9d55fc), SHC(0xed37ef91), + SHC(0x7a7d055b), SHC(0xdad7f3a2), SHC(0x73b5ebd1), SHC(0xc945dfec), SHC(0x6a6d98a4), SHC(0xb8e31319), + SHC(0x5ed77c8a), SHC(0xaa0a5b2e), SHC(0x5133cc94), SHC(0x9d0dfe54), SHC(0x41ce1e65), SHC(0x9235f2ec), + SHC(0x30fbc54d), SHC(0x89be50c3), SHC(0x1f19f97b), SHC(0x83d60412), SHC(0x0c8bd35e), SHC(0x809dc971), + SHC(0xf9b82684), SHC(0x80277872), SHC(0xe70747c4), SHC(0x8275a0c0), SHC(0xd4e0cb15), SHC(0x877b7bec), + SHC(0xc3a94590), SHC(0x8f1d343a), SHC(0xb3c0200c), SHC(0x99307ee0), SHC(0xa57d8666), SHC(0xa57d8666), + SHC(0x99307ee0), SHC(0xb3c0200c), SHC(0x8f1d343a), SHC(0xc3a94590), SHC(0x877b7bec), SHC(0xd4e0cb15), + SHC(0x8275a0c0), SHC(0xe70747c4), SHC(0x80277872), SHC(0xf9b82684), SHC(0x809dc971), SHC(0x0c8bd35e), + SHC(0x83d60412), SHC(0x1f19f97b), SHC(0x89be50c3), SHC(0x30fbc54d), SHC(0x9235f2ec), SHC(0x41ce1e65), + SHC(0x9d0dfe54), SHC(0x5133cc94), SHC(0xaa0a5b2e), SHC(0x5ed77c8a), SHC(0xb8e31319), SHC(0x6a6d98a4), + SHC(0xc945dfec), SHC(0x73b5ebd1), SHC(0xdad7f3a2), SHC(0x7a7d055b), SHC(0xed37ef91), SHC(0x7e9d55fc), + SHC(0x7fffffff), SHC(0x00000000), SHC(0x7e4a5426), SHC(0xeb263dbb), SHC(0x793501a9), SHC(0xd6db1254), + SHC(0x70e2cbc6), SHC(0xc3a94590), SHC(0x658c9a2d), SHC(0xb2141b02), SHC(0x577ff3da), SHC(0xa293d067), + SHC(0x471cece7), SHC(0x9592675c), SHC(0x34d3957e), SHC(0x8b68d06e), SHC(0x2120fb83), SHC(0x845c8ae3), + SHC(0x0c8bd35e), SHC(0x809dc971), SHC(0xf7a0dec9), SHC(0x804628a7), SHC(0xe2ef2a3e), SHC(0x8357ffc8), + SHC(0xcf043ab3), SHC(0x89be50c3), SHC(0xbc6845ce), SHC(0x934d57c9), SHC(0xab9a8e6c), SHC(0x9fc3b694), + SHC(0x9d0dfe54), SHC(0xaecc336c), SHC(0x9126145f), SHC(0xc0000000), SHC(0x88343c0e), SHC(0xd2e9786e), + SHC(0x8275a0c0), SHC(0xe70747c4), SHC(0x80118b5e), SHC(0xfbcfdc71), SHC(0x811855b4), SHC(0x10b5150f), + SHC(0x8582faa5), SHC(0x25280c5e), SHC(0x8d334625), SHC(0x389cea72), SHC(0x97f4a3cd), SHC(0x4a8ea111), + SHC(0xa57d8666), SHC(0x5a82799a), SHC(0xb5715eef), SHC(0x680b5c33), SHC(0xc763158e), SHC(0x72ccb9db), + SHC(0xdad7f3a2), SHC(0x7a7d055b), SHC(0xef4aeaf1), SHC(0x7ee7aa4c), SHC(0x0430238f), SHC(0x7fee74a2), + SHC(0x18f8b83c), SHC(0x7d8a5f40), SHC(0x2d168792), SHC(0x77cbc3f2), SHC(0x7fffffff), SHC(0x00000000), + SHC(0x7deeaa7a), SHC(0xe915f9ba), SHC(0x77cbc3f2), SHC(0xd2e9786e), SHC(0x6dca0d14), SHC(0xbe31e19b), + SHC(0x603c496c), SHC(0xab9a8e6c), SHC(0x4f9292dc), SHC(0x9bbd4282), SHC(0x3c56ba70), SHC(0x8f1d343a), + SHC(0x2727d486), SHC(0x8622cf68), SHC(0x10b5150f), SHC(0x811855b4), SHC(0xf9b82684), SHC(0x80277872), + SHC(0xe2ef2a3e), SHC(0x8357ffc8), SHC(0xcd1693f7), SHC(0x8a8f8a54), SHC(0xb8e31319), SHC(0x9592675c), + SHC(0xa6fbbc59), SHC(0xa405847e), SHC(0x97f4a3cd), SHC(0xb5715eef), SHC(0x8c4a142f), SHC(0xc945dfec), + SHC(0x845c8ae3), SHC(0xdedf047d), SHC(0x806d99e3), SHC(0xf58a29f2), SHC(0x809dc971), SHC(0x0c8bd35e), + SHC(0x84eb8b03), SHC(0x2325b847), SHC(0x8d334625), SHC(0x389cea72), SHC(0x99307ee0), SHC(0x4c3fdff4), + SHC(0xa8800c26), SHC(0x5d6c2f99), SHC(0xbaa34bf4), SHC(0x6b93d02e), SHC(0xcf043ab3), SHC(0x7641af3d), + SHC(0xe4fa4bf1), SHC(0x7d1d7958), SHC(0xfbcfdc71), SHC(0x7fee74a2), SHC(0x12c8106f), SHC(0x7e9d55fc), + SHC(0x2924edac), SHC(0x793501a9), SHC(0x3e2d7eb1), SHC(0x6fe2313c), SHC(0x5133cc94), SHC(0x62f201ac), + SHC(0x619a7dce), SHC(0x52cf758f)}; + + +#endif /* !defined(__XTENSA__) */ + + +/* Inverse square root table for operands running from 0.5 to ~1.0 + + (Word32) (0.5 + 1.0/sqrt((op)/CDKpow(2.0,31))) + + Note: First value is not rounded for accuracy reasons + + Implicit exponent is 1 + + Example: 0x5A82799A = Isqrt_lc3plus(0x40000000), exponent=1 +*/ +const Word32 isqrt_table[128 + 2] = { + 0x5A827999, 0x5A287E03, 0x59CF8CBC, 0x5977A0AC, 0x5920B4DF, 0x58CAC480, 0x5875CADE, 0x5821C364, 0x57CEA99D, + 0x577C7930, 0x572B2DE0, 0x56DAC38E, 0x568B3632, 0x563C81E0, 0x55EEA2C4, 0x55A19522, 0x55555555, 0x5509DFD0, + 0x54BF311A, 0x547545D0, 0x542C1AA4, 0x53E3AC5B, 0x539BF7CD, 0x5354F9E7, 0x530EAFA5, 0x52C91618, 0x52842A5F, + 0x523FE9AC, 0x51FC5140, 0x51B95E6B, 0x51770E8F, 0x51355F1A, 0x50F44D89, 0x50B3D768, 0x5073FA50, 0x5034B3E7, + 0x4FF601E0, 0x4FB7E1FA, 0x4F7A5202, 0x4F3D4FCF, 0x4F00D944, 0x4EC4EC4F, 0x4E8986EA, 0x4E4EA718, 0x4E144AE9, + 0x4DDA7073, 0x4DA115DA, 0x4D683948, 0x4D2FD8F4, 0x4CF7F31B, 0x4CC08605, 0x4C899000, 0x4C530F65, 0x4C1D0294, + 0x4BE767F5, 0x4BB23DF9, 0x4B7D8317, 0x4B4935CF, 0x4B1554A6, 0x4AE1DE2A, 0x4AAED0F0, 0x4A7C2B93, 0x4A49ECB3, + 0x4A1812FA, 0x49E69D16, 0x49B589BB, 0x4984D7A4, 0x49548592, 0x49249249, 0x48F4FC97, 0x48C5C34B, 0x4896E53D, + 0x48686148, 0x483A364D, 0x480C6332, 0x47DEE6E1, 0x47B1C049, 0x4784EE60, 0x4758701C, 0x472C447C, 0x47006A81, + 0x46D4E130, 0x46A9A794, 0x467EBCBA, 0x46541FB4, 0x4629CF98, 0x45FFCB80, 0x45D6128A, 0x45ACA3D5, 0x45837E88, + 0x455AA1CB, 0x45320CC8, 0x4509BEB0, 0x44E1B6B4, 0x44B9F40B, 0x449275ED, 0x446B3B96, 0x44444444, 0x441D8F3B, + 0x43F71BBF, 0x43D0E917, 0x43AAF68F, 0x43854374, 0x435FCF15, 0x433A98C6, 0x43159FDC, 0x42F0E3AE, 0x42CC6398, + 0x42A81EF6, 0x42841527, 0x4260458E, 0x423CAF8D, 0x4219528B, 0x41F62DF2, 0x41D3412A, 0x41B08BA2, 0x418E0CC8, + 0x416BC40D, 0x4149B0E5, 0x4127D2C3, 0x41062920, 0x40E4B374, 0x40C3713B, 0x40A261EF, 0x40818512, 0x4060DA22, + 0x404060A1, 0x40201814, 0x40000000, 0x3FE017EC, +}; + +const Word32 Log2_16_table1[16] = { + 0, 2934766, 5701737, 8319067, 10802114, 13163988, 15415967, 17567824, + 19628084, 21604229, 23502857, 25329821, 27090336, 28789065, 30430199, 32017515, +}; + +const Word16 Log2_16_table2[16] = { + 1433, 1351, 1278, 1212, 1153, 1099, 1051, 1006, 965, 927, 892, 860, 829, 801, 775, 750, +}; + +const Word32 InvLog2_16_table1[64] = { + 1073741824, 1085434106, 1097253708, 1109202018, 1121280436, 1133490379, 1145833280, 1158310587, + 1170923762, 1183674286, 1196563654, 1209593378, 1222764986, 1236080024, 1249540052, 1263146652, + 1276901417, 1290805962, 1304861917, 1319070932, 1333434672, 1347954824, 1362633090, 1377471191, + 1392470869, 1407633882, 1422962010, 1438457051, 1454120821, 1469955159, 1485961921, 1502142985, + 1518500250, 1535035634, 1551751076, 1568648537, 1585730000, 1602997467, 1620452965, 1638098541, + 1655936265, 1673968228, 1692196547, 1710623359, 1729250827, 1748081133, 1767116489, 1786359126, + 1805811301, 1825475297, 1845353420, 1865448001, 1885761398, 1906295993, 1927054196, 1948038440, + 1969251188, 1990694927, 2012372174, 2034285470, 2056437387, 2078830522, 2101467502, 2124350982, +}; + +const Word16 InvLog2_16_table2[64] = { + 11418, 11543, 11668, 11795, 11924, 12054, 12185, 12318, 12452, 12587, 12724, 12863, 13003, 13145, 13288, 13432, + 13579, 13727, 13876, 14027, 14180, 14334, 14490, 14648, 14808, 14969, 15132, 15297, 15463, 15632, 15802, 15974, + 16148, 16324, 16501, 16681, 16863, 17046, 17232, 17420, 17609, 17801, 17995, 18191, 18389, 18589, 18792, 18996, + 19203, 19412, 19624, 19837, 20053, 20272, 20492, 20716, 20941, 21169, 21400, 21633, 21868, 22106, 22347, 22590, +}; + +const UWord8 gf16_mult_table[256] = { + /* gf16_mult_table[a | (b << 4)] contains the product of a and b in GF(16) */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 0, 2, 4, 6, 8, 10, 12, 14, 3, 1, 7, 5, 11, 9, 15, 13, 0, 3, 6, 5, 12, 15, 10, 9, 11, 8, + 13, 14, 7, 4, 1, 2, 0, 4, 8, 12, 3, 7, 11, 15, 6, 2, 14, 10, 5, 1, 13, 9, 0, 5, 10, 15, 7, 2, 13, + 8, 14, 11, 4, 1, 9, 12, 3, 6, 0, 6, 12, 10, 11, 13, 7, 1, 5, 3, 9, 15, 14, 8, 2, 4, 0, 7, 14, 9, + 15, 8, 1, 6, 13, 10, 3, 4, 2, 5, 12, 11, 0, 8, 3, 11, 6, 14, 5, 13, 12, 4, 15, 7, 10, 2, 9, 1, 0, + 9, 1, 8, 2, 11, 3, 10, 4, 13, 5, 12, 6, 15, 7, 14, 0, 10, 7, 13, 14, 4, 9, 3, 15, 5, 8, 2, 1, 11, + 6, 12, 0, 11, 5, 14, 10, 1, 15, 4, 7, 12, 2, 9, 13, 6, 8, 3, 0, 12, 11, 7, 5, 9, 14, 2, 10, 6, 1, + 13, 15, 3, 4, 8, 0, 13, 9, 4, 1, 12, 8, 5, 2, 15, 11, 6, 3, 14, 10, 7, 0, 14, 15, 1, 13, 3, 2, 12, + 9, 7, 6, 8, 4, 10, 11, 5, 0, 15, 13, 2, 9, 6, 4, 11, 1, 14, 12, 3, 8, 7, 5, 10, +}; + +const UWord8 rs16_elp_deg2_table[256] = { + /* If the polynomial x^2 + ax + b has distinct non-zero roots z1 and z2 in GF(16), * + * then table entry a + 16*b contains log_g(z1) | log_g(z2) << 4, and otherwise it * + * contains 0. */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, + 105, 195, 0, 210, 0, 225, 0, 180, 120, 0, 0, 121, 0, 16, 0, 211, 0, 0, 181, 0, 0, 106, + 196, 226, 0, 0, 0, 214, 64, 0, 199, 0, 0, 0, 0, 0, 49, 184, 0, 154, 0, 229, 0, 227, + 182, 0, 0, 32, 0, 0, 0, 197, 0, 0, 122, 0, 212, 152, 0, 203, 0, 158, 128, 0, 0, 0, + 98, 113, 218, 0, 0, 0, 53, 0, 0, 65, 0, 0, 185, 110, 215, 80, 0, 0, 200, 0, 50, 0, + 0, 0, 0, 130, 205, 115, 0, 0, 160, 190, 145, 0, 0, 0, 0, 0, 0, 100, 0, 0, 168, 198, + 0, 183, 33, 0, 0, 48, 228, 213, 0, 0, 0, 0, 0, 0, 0, 0, 164, 0, 179, 0, 224, 104, + 0, 194, 149, 0, 0, 209, 0, 0, 0, 189, 99, 84, 0, 129, 0, 0, 0, 144, 0, 0, 234, 114, + 0, 0, 82, 0, 0, 0, 0, 217, 202, 0, 112, 52, 232, 0, 97, 0, 0, 0, 126, 0, 81, 201, + 0, 36, 216, 186, 0, 0, 0, 96, 0, 0, 0, 0, 0, 88, 0, 0, 0, 103, 0, 148, 178, 0, + 208, 193, 0, 58, 0, 0, 0, 0, 0, 161, 206, 0, 116, 0, 101, 0, 0, 56, 146, 176, 0, 0, + 147, 162, 222, 0, 132, 0, 0, 0, 0, 0, 177, 117, 192, 0, +}; + +const UWord16 rs16_elp_deg3_table[256] = { + /* If the polynomial x^3 + ax + b has distinct roots z1, z2 and z3 in GF(16), * + * then table entry a + 16*b contains z1) | z2 << 4 | z3 << 8, and otherwise it * + * contains 0. */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1889, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2977, 0, 0, 0, 0, 0, 3990, 1859, 0, + 0, 0, 0, 0, 0, 0, 3521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1874, 0, 3718, 0, 0, 0, + 0, 0, 0, 2433, 0, 0, 1619, 0, 0, 0, 0, 3495, 0, 0, 0, 0, 0, 0, 4065, 0, 0, 0, + 0, 0, 0, 3255, 0, 0, 0, 1602, 0, 3735, 0, 0, 0, 0, 3238, 801, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3510, 0, 0, 0, 0, 1345, 3975, 0, 0, 0, 0, 0, 0, 0, 0, 3778, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2947, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3476, 0, 4005, 0, 3461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3748, 0, 0, 2962, 0, 0, 0, 0, 4035, 0, 0, 4020, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3221, 0, 0, 0, 0, 0, 0, 2690, + 0, 0, 0, 3795, 0, 0, 0, 4050, 0, 0, 0, 0, 0, 3204, 3765, 0, 0, 0, 0, 0, 2707, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +#ifdef ENABLE_HR_MODE +const Word32 invSqrtTab[(128 + 2)] = { + 0x5A827999, 0x5A287E03, 0x59CF8CBC, 0x5977A0AC, 0x5920B4DF, 0x58CAC480, 0x5875CADE, 0x5821C364, 0x57CEA99D, + 0x577C7930, 0x572B2DE0, 0x56DAC38E, 0x568B3632, 0x563C81E0, 0x55EEA2C4, 0x55A19522, 0x55555555, 0x5509DFD0, + 0x54BF311A, 0x547545D0, 0x542C1AA4, 0x53E3AC5B, 0x539BF7CD, 0x5354F9E7, 0x530EAFA5, 0x52C91618, 0x52842A5F, + 0x523FE9AC, 0x51FC5140, 0x51B95E6B, 0x51770E8F, 0x51355F1A, 0x50F44D89, 0x50B3D768, 0x5073FA50, 0x5034B3E7, + 0x4FF601E0, 0x4FB7E1FA, 0x4F7A5202, 0x4F3D4FCF, 0x4F00D944, 0x4EC4EC4F, 0x4E8986EA, 0x4E4EA718, 0x4E144AE9, + 0x4DDA7073, 0x4DA115DA, 0x4D683948, 0x4D2FD8F4, 0x4CF7F31B, 0x4CC08605, 0x4C899000, 0x4C530F65, 0x4C1D0294, + 0x4BE767F5, 0x4BB23DF9, 0x4B7D8317, 0x4B4935CF, 0x4B1554A6, 0x4AE1DE2A, 0x4AAED0F0, 0x4A7C2B93, 0x4A49ECB3, + 0x4A1812FA, 0x49E69D16, 0x49B589BB, 0x4984D7A4, 0x49548592, 0x49249249, 0x48F4FC97, 0x48C5C34B, 0x4896E53D, + 0x48686148, 0x483A364D, 0x480C6332, 0x47DEE6E1, 0x47B1C049, 0x4784EE60, 0x4758701C, 0x472C447C, 0x47006A81, + 0x46D4E130, 0x46A9A794, 0x467EBCBA, 0x46541FB4, 0x4629CF98, 0x45FFCB80, 0x45D6128A, 0x45ACA3D5, 0x45837E88, + 0x455AA1CB, 0x45320CC8, 0x4509BEB0, 0x44E1B6B4, 0x44B9F40B, 0x449275ED, 0x446B3B96, 0x44444444, 0x441D8F3B, + 0x43F71BBF, 0x43D0E917, 0x43AAF68F, 0x43854374, 0x435FCF15, 0x433A98C6, 0x43159FDC, 0x42F0E3AE, 0x42CC6398, + 0x42A81EF6, 0x42841527, 0x4260458E, 0x423CAF8D, 0x4219528B, 0x41F62DF2, 0x41D3412A, 0x41B08BA2, 0x418E0CC8, + 0x416BC40D, 0x4149B0E5, 0x4127D2C3, 0x41062920, 0x40E4B374, 0x40C3713B, 0x40A261EF, 0x40818512, 0x4060DA22, + 0x404060A1, 0x40201814, 0x40000000, 0x3FE017EC /* , 0x3FC05F61 */ +}; +#endif diff --git a/lib_lc3plus/rom_basop_util_lc3plus.h b/lib_lc3plus/rom_basop_util_lc3plus.h new file mode 100644 index 0000000000000000000000000000000000000000..ac088fa1d0a920318ebed396699fe91b5ba1d892 --- /dev/null +++ b/lib_lc3plus/rom_basop_util_lc3plus.h @@ -0,0 +1,172 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#ifndef __BASOP_UTIL_ROM_LC3PLUS_H__ +#define __BASOP_UTIL_ROM_LC3PLUS_H__ + +#include "options.h" +#include "wmc_auto.h" +#include "basop_util_lc3plus.h" +#include "functions.h" + +#define LD_INT_TAB_LEN 120 +#define INV_TABLE_SIZE 256 +#define SQRT_TABLE_SIZE 256 + +#ifndef CHEAP_NORM_SIZE +#define CHEAP_NORM_SIZE 161 +#endif + +#define MINSFTAB 7 +#define MAXSFTAB 25 + +#ifdef ENABLE_HR_MODE +#define SHC(x) ((Word32)x) +#else +#define SHC(x) WORD322WORD16((Word32)x) +#endif + +/** + * \brief Lookup-Table for binary logarithm + */ +extern const Word16 ldCoeff[7]; + +/** + \brief Lookup-Table for binary power algorithm +*/ +extern const UWord32 exp2_tab_long[32]; + +/** + \brief Lookup-Table for binary power algorithm +*/ +extern const UWord32 exp2w_tab_long[32]; + +/** + \brief Lookup-Table for binary power algorithm +*/ +extern const UWord32 exp2x_tab_long[32]; + +/** + * \brief 1/x, x=[0,1,2,3...] table + */ +#ifdef ENABLE_HR_MODE +extern const Word16 InvIntTable[74]; +#else +extern const Word16 InvIntTable[32]; +#endif + +/** + * \ brief Lookup for sine tables and windows. + */ +void BASOP_getTables( +#ifdef ENABLE_HR_MODE + const PWord32 **ptwiddle, + const PWord32 **sin_twiddle, +#else + const PWord16 **ptwiddle, + const PWord16 **sin_twiddle, +#endif + Word16 *sin_step, + Word16 length); + +extern const Word32 RealFFT20_twid[6]; +extern const Word32 RealFFT32_twid[10]; +extern const Word32 RealFFT40_twid[12]; +extern const Word32 RealFFT60_twid[17]; +extern const Word32 RealFFT64_twid[18]; +extern const Word32 RealFFT80_twid[22]; +extern const Word32 RealFFT96_twid[26]; +extern const Word32 RealFFT128_twid[34]; +extern const Word32 RealFFT192_twid[50]; +extern const Word32 RealFFT256_twid[66]; +extern const Word32 RealFFT384_twid[98]; +extern const Word32 RealFFT512_twid[130]; +extern const Word32 RealFFT768_twid[194]; + +#ifdef ENABLE_HR_MODE +extern const PWord32 SineTable480[241]; +extern const PWord32 SineTable320[161]; +extern const PWord32 SineTable960[481]; +#else +extern const PWord16 SineTable480[241]; +extern const PWord16 SineTable320[161]; +extern const PWord16 SineTable960[481]; +#endif + +#ifdef ENABLE_HR_MODE +extern const Word32 RotVector_15_6[2 * (90 - 15)]; +#else +extern const Word16 RotVector_15_6[2 * (90 - 15)]; +#endif + +extern const Word32 RotVector_32_32[2 * 20]; +extern const Word32 RotVector_40_32[2 * 28]; + +#ifdef ENABLE_HR_MODE +extern const Word32 RotVector_320[2 * (320 - 20)]; +#else +extern const Word16 RotVector_320[2 * (320 - 20)]; +#endif + +#ifdef ENABLE_HR_MODE +extern const Word32 RotVector_360[2 * (360 - 30)]; +#else +extern const Word16 RotVector_360[2 * (360 - 30)]; +#endif + +#ifdef ENABLE_HR_MODE +extern const Word32 RotVector_480[2 * (480 - 30)]; +#else +extern const Word16 RotVector_480[2 * (480 - 30)]; +#endif + +#ifdef ENABLE_HR_MODE +extern const Word32 RotVector_720[2 * (720 - 30)]; +extern const Word32 RotVector_960[2 * (480 - 60)]; +#else +extern const Word16 RotVector_960[2 * (480 - 60)]; +#endif + +#ifdef ENABLE_HR_MODE +extern const Word32 RotVector_30_16[2 * (480 - 30)]; +#endif + +#ifdef ENABLE_HR_MODE +extern const Word32 RotVector_32_8[2 * (256 - 32)]; +#else +extern const Word16 RotVector_32_8[2 * (256 - 32)]; +#endif + +#if defined(SUBSET_SSWB) || defined(SUBSET_SWB) || defined(SUBSET_FB) +#ifdef ENABLE_HR_MODE +extern const Word32 RotVector_32_12[2 * (384 - 32)]; +#else +extern const Word16 RotVector_32_12[2 * (384 - 32)]; +#endif +#else +#define RotVector_32_12 NULL +#endif + +extern const Word32 isqrt_table[128 + 2]; + +extern const Word32 Log2_16_table1[16]; +extern const Word16 Log2_16_table2[16]; + +extern const Word32 InvLog2_16_table1[64]; +extern const Word16 InvLog2_16_table2[64]; + +extern const UWord8 gf16_mult_table[256]; +extern const UWord8 rs16_elp_deg2_table[256]; +extern const UWord16 rs16_elp_deg3_table[256]; + +#ifdef ENABLE_HR_MODE +extern const Word32 invSqrtTab[(128 + 2)]; +#endif + +#endif /* __BASOP_UTIL_ROM_LC3PLUS_H__ */ diff --git a/lib_lc3plus/scale_signal24_fx.c b/lib_lc3plus/scale_signal24_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..1cabd2bbf5176dd6d01389edcb0b3d37ba86e018 --- /dev/null +++ b/lib_lc3plus/scale_signal24_fx.c @@ -0,0 +1,123 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +void scale_signal24_fx(Word32 x[], /* i: time input signal */ +#ifdef ENABLE_HR_MODE + Word32 x_scaled[], +#else + Word16 x_scaled[], +#endif + Word16 *x_exp, +#ifdef ENABLE_HR_MODE + Word32 mdct_mem[], +#else + Word16 mdct_mem[], +#endif + Word16 mdct_mem_len, + Word16 resample_mem_in[], Word16 resample_mem_in_len, Word32 resample_mem_in50[], + Word16 resample_mem_out[], Word16 resample_mem_out_len, Word32 mdct_mem32[], Word16 N, + Word32 resamp_mem32[], Word16 mem_s12k8[], Word16 *resamp_scale) +{ + Word16 i; + Word16 s; + Word16 scales[6]; + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("scale_signal24_fx", sizeof(struct { + Word16 i; + Word16 s; + Word16 scales[6]; + })); +#endif + + /* Scale input for 24 bit case */ + /* assure 24 bit input */ + FOR (i = 0; i < N; i++) + { + IF (x[i] >= 0) + { + x[i] = L_and(x[i], 0x007fffff); + } + ELSE + { + x[i] = (Word32)L_or( (UWord32)x[i], 0xff800000); + } + } + + /* Find maximum exponent */ + scales[0] = sub(15 + 8, getScaleFactor32_0(x, N)); + scales[1] = sub(15 + 8, getScaleFactor32_0(mdct_mem32, mdct_mem_len)); + scales[2] = sub(15 + 8, getScaleFactor32_0(resamp_mem32, resample_mem_in_len)); + scales[3] = sub(sub(*resamp_scale, 2), getScaleFactor32_0(resample_mem_in50, 2)); + scales[4] = sub(sub(*resamp_scale, 2), getScaleFactor16_0(resample_mem_out, resample_mem_out_len)); + scales[5] = sub(sub(*resamp_scale, 2), getScaleFactor16_0(mem_s12k8, 3)); + *x_exp = 7; move16(); + FOR (i = 0; i < 6; i++) + { + *x_exp = s_max(*x_exp, scales[i]); move16(); + } + + /* Shift input buffers */ + s = sub(15 + 8, *x_exp); + FOR (i = 0; i < N; i++) + { +#ifdef ENABLE_HR_MODE + x_scaled[i] = L_shl(x[i], s); +#else + x_scaled[i] = round_fx_sat(L_shl(x[i], s)); +#endif + } + + FOR (i = 0; i < mdct_mem_len; i++) + { +#ifdef ENABLE_HR_MODE + mdct_mem[i] = L_shl(mdct_mem32[i], s); +#else + mdct_mem[i] = round_fx_sat(L_shl(mdct_mem32[i], s)); +#endif + } + + FOR (i = 0; i < resample_mem_in_len; i++) + { + resample_mem_in[i] = round_fx_sat(L_shl(resamp_mem32[i], s)); + } + + /* Adjust resampler filter and output buffers */ + s = sub(sub(*resamp_scale, 2), *x_exp); + *resamp_scale = add(*x_exp, 2); + + IF (s) + { + FOR (i = 0; i < 2; i++) + { + resample_mem_in50[i] = L_shl(resample_mem_in50[i], s); + } + FOR (i = 0; i < resample_mem_out_len; i++) + { + resample_mem_out[i] = shl(resample_mem_out[i], s); + } + + FOR (i = 0; i < 3; i++) + { + mem_s12k8[i] = shl(mem_s12k8[i], s); + } + } + /* Store part of current frame as mdct memory buffer and resampler input buffer for next frame */ + basop_memcpy(mdct_mem32, &x[N - mdct_mem_len], mdct_mem_len * sizeof(Word32)); + basop_memmove(resamp_mem32, &x[N - resample_mem_in_len], resample_mem_in_len * sizeof(Word32)); + +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + diff --git a/lib_lc3plus/setup_com_lc3plus.c b/lib_lc3plus/setup_com_lc3plus.c new file mode 100644 index 0000000000000000000000000000000000000000..1121d1905a5f541235d03e3e7dd9726c33a57c39 --- /dev/null +++ b/lib_lc3plus/setup_com_lc3plus.c @@ -0,0 +1,39 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +#ifdef FIX_BOTH_1p25_WB_GLOBGAINOFFSET_NONBE +/* tilt factor in gainOffset quantized and adjusted for low Fs and 1p25ms framing */ +Word16 calc_GGainOffset_1p25_fx(Word16 total_bits, Word16 fs_idx) +{ + Word16 gain_off_tilt_1p25_Q19[6] = { 20480, 17408, 17476, 13107, 10486, 8738 }; /* vector for NB to UB */ + /* Corresponding FLT = gain_off_tilt_1p25 = {0.039062500000000 0.033203125000000 0.033333333333333 0.025000000000000 0.020000000000000 0.016666666666667 }*/ + + Word16 tmp1 = extract_h(L_shr_pos(L_mult0(total_bits, gain_off_tilt_1p25_Q19[fs_idx]), 3)); /* extract bits in Q0 , no rounding for interop*/ + Word16 tmp2 = extract_l(L_mac0(105L, 5, add(fs_idx, 1))); + + tmp2 = negate(add(s_min(115, tmp1), tmp2)); move16(); + + +#ifdef FIX_BOTH_1p25_WB_GLOBGAINOFFSET_LOWLIM_NONBE + if (sub(fs_idx, 1) <= 0) + { /* only NB and WB additionally limited to -135 */ + tmp2 = s_max(tmp2, FIX_BOTH_1p25_WB_GLOBGAINOFFSET_LOWLIM_NONBE); + } +#endif + + + return tmp2; +} +#endif + + diff --git a/lib_lc3plus/setup_dec_lc3plus.c b/lib_lc3plus/setup_dec_lc3plus.c new file mode 100644 index 0000000000000000000000000000000000000000..43512a4eaa5e356af95725bb521a619e71921023 --- /dev/null +++ b/lib_lc3plus/setup_dec_lc3plus.c @@ -0,0 +1,632 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" +#include "setup_dec_lc3plus.h" + +/* if decoder is null only size is reported */ +/*assume 10ms for memory allocation for now */ +int alloc_decoder(LC3PLUS_Dec *decoder, int samplerate, int channels) +{ + int ch = 0; + size_t size = sizeof(LC3PLUS_Dec); + void * ltpf_mem_x = NULL, *ltpf_mem_y = NULL, *stDec_ola_mem_fx = NULL; + int max_len = DYN_MAX_LEN_EXT(samplerate); /*NB sing 80 as minimum value changes BE for NB */ + Word32 * plc_longterm_advc_tdc = NULL, *plc_longterm_advc_ns = NULL; + Word16 longterm_analysis_counter_max = 0, longterm_analysis_counter_max_bytebuffer = 0; + + void *q_old_res_fx = NULL; + Word16 *sharedBuf = NULL; +#if defined(ENABLE_PC) + void *q_old_d_fx = NULL; +#endif + void *plcAd = NULL, *PhECU_f0est = NULL, *PhECU_plocs = NULL; + + for (ch = 0; ch < channels; ch++) + { + DecSetup *setup = balloc(decoder, &size, sizeof(DecSetup)); +#ifdef ENABLE_HR_MODE + int q_old_len = MIN(CODEC_FS(samplerate) * 100 / 10000, MAX_BW_HR); +#else + int q_old_len = MIN(CODEC_FS(samplerate) * 100 / 10000, MAX_BW ); +#endif + int x_old_len = DYN_MAX_LEN_PCM_PLC(samplerate); /* max(pitchmax + frame ms, M+1 + pitchmax + frame/2) */ + int fs_idx = (samplerate / 10000); /* floor= integer truncation is needed here */ + + ltpf_mem_x = balloc(decoder, &size, sizeof(*setup->ltpf_mem_x) * (max_len + max_len / 40 - 2)); + ltpf_mem_y = + balloc(decoder, &size, + sizeof(*setup->ltpf_mem_y) * (max_len + CEILING(MAX_PITCH_12K8 * max_len, 128) + (max_len / 80))); + + stDec_ola_mem_fx = balloc(decoder, &size, sizeof(*setup->stDec_ola_mem_fx) * DYN_MAX_MDCT_LEN(samplerate)); + +#if defined(ENABLE_PC) + q_old_d_fx = balloc(decoder, &size, sizeof(*setup->q_old_d_fx) * q_old_len); +#endif + sharedBuf = balloc(decoder, &size, sizeof(*setup->q_old_d_fx) * q_old_len + sizeof(*setup->plcAd->x_old_tot_fx) * x_old_len); + + /* To save static RAM, a large buffer sharedBuf is used to share + * space for q_old_d_fx, x_old_tot_fx and X_sav_fx (note: + * PHASE_ECU operates only at 10ms and standard precision) + * + * If partial Concealment is active, q_old_d_fx is saved in a separate buffer + * + * The following graph provides an overview about the memory + * sharing for 10ms and normal resolution: + */ + + /* Total buffer | <--- sharedBuf ---> | */ + /* ConcealMethod 3or4 | <---q_old_d_fx---> | <-------------------- x_old_tot_fx ------------------> | */ + /* ConcealMethod 3 | <---q_old_d_fx---> | |<------- M+1+pitch_max+ (frame_len/2)----------> | */ /* first BFI-frame only? */ + /* Meth 2,prevBfi=0 | | <------- 16 ms xfp ------->| */ + /* Meth 2 | ^ X_sav_fx ptr | <-------- maintained old_tot_fx ---------> | */ /* pitchmax samples maintained */ + /* Meth 2 | <----- X_sav 16 ms ----------> | ^xfp_fx ptr | */ + /* Meth2 ,prevBfi=1 | | <-12.25(forTDC),3.75(PLC2)->| */ /*the part used by PhECU is 3.75ms */ + /* ConcealMethod 2 |<- <10ms ->| */ + int max_plocs = DYN_MAX_PLOCS(samplerate); + plcAd = balloc(decoder, &size, sizeof(*setup->plcAd)); + PhECU_f0est = balloc(decoder, &size, sizeof(*setup->plcAd->PhECU_f0est) * max_plocs); + PhECU_plocs = balloc(decoder, &size, sizeof(*setup->plcAd->PhECU_plocs) * max_plocs); +#ifdef ENABLE_HR_MODE + q_old_res_fx = balloc(decoder, &size, sizeof(*setup->q_old_res_fx) * max_len); +#else + q_old_res_fx = balloc(decoder, &size, sizeof(*setup->q_old_res_fx) * MIN(max_len, MAX_BW)); +#endif + + longterm_analysis_counter_max = plc_fadeout_param_maxlen[0]; + longterm_analysis_counter_max_bytebuffer = plc_fadeout_param_maxbytes[0]; + + plc_longterm_advc_tdc = balloc(decoder, &size, sizeof(Word32) * longterm_analysis_counter_max_bytebuffer); + plc_longterm_advc_ns = balloc(decoder, &size, sizeof(Word32) * longterm_analysis_counter_max_bytebuffer); + + if (decoder) + { + decoder->channel_setup[ch] = setup; + setup->ltpf_mem_x = ltpf_mem_x; + setup->ltpf_mem_y = ltpf_mem_y; + setup->stDec_ola_mem_fx = stDec_ola_mem_fx; + setup->q_old_res_fx = q_old_res_fx; +#if defined(ENABLE_PC) + setup->q_old_d_fx = q_old_d_fx; +#else + setup->q_old_d_fx = sharedBuf; +#endif + setup->plcAd = plcAd; + } + if (decoder && plcAd) + { +#ifdef ENABLE_HR_MODE + if (fs_idx > 4) + { + fs_idx = 4; + } +#endif + + setup->plcAd->x_old_tot_fx = &sharedBuf[q_old_len]; + setup->plcAd->PhECU_f0est = PhECU_f0est; + setup->plcAd->PhECU_xfp_fx = &(setup->plcAd->x_old_tot_fx[x_old_len-LprotSzPtr[fs_idx]]); /* point to the last 16ms of the x_old_tot_fx */ + setup->plcAd->PhECU_X_sav_fx = sharedBuf; /* reuse of lprot(=num_FsByResQ0[fs_idx]) values from this point fwd, i.e beyond the end of q_old_fx */ + setup->plcAd->PhECU_plocs = PhECU_plocs; + + setup->plcAd->longterm_analysis_counter_max = longterm_analysis_counter_max; + setup->plcAd->longterm_analysis_counter_max_bytebuffer = longterm_analysis_counter_max_bytebuffer; + + setup->plcAd->plc_longterm_advc_tdc = plc_longterm_advc_tdc; + setup->plcAd->plc_longterm_advc_ns = plc_longterm_advc_ns; + } + } + + return (int)size; +} + +LC3PLUS_Error FillDecSetup(LC3PLUS_Dec *decoder, int samplerate, int channels, LC3PLUS_PlcMode plc_mode +#ifdef ENABLE_HR_MODE + , int hrmode +#endif + ) +{ + int ch = 0; + + memset(decoder, 0, lc3plus_dec_get_size(samplerate, channels, plc_mode)); + alloc_decoder(decoder, samplerate, channels); + +#ifdef ENABLE_HR_MODE + decoder->hrmode = hrmode != 0; +#endif + + decoder->fs = CODEC_FS(samplerate); + decoder->fs_out = samplerate; + decoder->fs_idx = FS2FS_IDX(decoder->fs); + decoder->channels = channels; + decoder->frame_dms = LC3PLUS_FRAME_DURATION_10MS; + decoder->plcMeth = plc_mode; + { + decoder->BW_cutoff_bits = BW_cutoff_bits_all[decoder->fs_idx]; + } + decoder->ltpf_mem_x_len = extract_l(L_shr_pos(Mpy_32_16_lc3plus(L_max(16000, decoder->fs), 16778), 11)) - 2; + decoder->ltpf_mem_y_len = extract_l(L_shr_pos(Mpy_32_16_lc3plus(decoder->fs, 18678) - 1, 5)) + 1 + + extract_l(L_shr_pos(Mpy_32_16_lc3plus(L_max(16000, decoder->fs), 16778), 12)); + + set_dec_frame_params(decoder); + + for (ch = 0; ch < decoder->channels; ch++) + { + DecSetup *setup = decoder->channel_setup[ch]; + setup->plc_damping = 32767; + setup->ltpf_mem_scale_fac_idx = -1; + move16(); + +#ifdef CR9_C_ADD_1p25MS +#ifdef CR9_C_ADD_1p25MS_LRSNS + setup->ltpfinfo_frame_cntr_fx = -32768; move16(); +#endif +#endif + + # ifdef CR9_C_ADD_1p25MS + # if 0 + /* @FhG @alex ToAddhere channel dependent :: setup->ltpf_mem_continuation = 0; */ + # endif + # ifdef CR9_C_ADD_1p25MS_LRSNS + setup->ltpfinfo_frame_cntr_fx = -32768; move16(); + # endif + # endif + + setup->pc_seed = 24607; + setup->ns_seed = 24607; + setup->ns_cum_alpha = 32767; + +#ifdef CR9_C_ADD_1p25MS +#ifdef NEW_SIGNALLING_SCHEME_1p25 + setup->ltpfinfo_frame_cntr_fx = -32768; move16(); +#endif +#endif + + int i = 0; + /* 0 = 0kHz 1= 8kHz, 2= 16 kHz 3= 24 , 4 = 32 5=40 6=48kHz */ +#if (PHECU_XFP_LA == 0) + Word16 oneMsTab_LA[5] = {0, 0, 0, 0, 0}; +#else +#if (PHECU_XFP_LA == 4) + Word16 oneMsTab_LA[7] = {0 /*unused*/, 2, 4, 6, 8, 10 /*unused*/, 12}; +#else + Word16 oneMsTab_LA[7] = {0 /*unused*/, 8, 16, 24, 32, 40 /*unused*/, 48}; +#endif +#endif + Word16 oneMsTab[5] = {8, 16, 24, 32, 48}; + + setup->plcAd->stab_fac = 32767; + setup->plcAd->tdc_seed = 24607; + setup->plcAd->tdc_preemph_fac = plc_preemph_fac[decoder->fs_idx]; + setup->plcAd->tdc_lpc_order = 16; + setup->plcAd->PhECU_fs_idx_fx = + mult(decoder->frame_length, + (Word16)(32768.0 / 99.0)); /* truncation needed , i.e no rounding can be applied here */ + /* idx=frame/80, 0=8kHZ, 1=16kHz, 2=24 kHz, 3=32 kHz 5=*, 4=48 */ + setup->plcAd->max_len_pcm_plc = DYN_MAX_LEN_PCM_PLC(decoder->fs); + + if ((decoder->hrmode == 0) && (samplerate <= 48000)) + { + setup->plcAd->PhECU_frame_ms = (Word16)( + decoder->frame_dms * 1.25 * 10 * 0.1); /* needed in PLCUpdate and PLC main functions, adjusted in first frame */ + setup->plcAd->PhECU_seed_fx = 21845; + setup->plcAd->PhECU_LprotOrg_fx = + shl_pos(oneMsTab[setup->plcAd->PhECU_fs_idx_fx], 4); /* 16 *1ms = 1.6 *framelength */ + setup->plcAd->PhECU_Lprot_fx = setup->plcAd->PhECU_LprotOrg_fx; + setup->plcAd->PhECU_LA = oneMsTab_LA[setup->plcAd->PhECU_fs_idx_fx]; + setup->plcAd->PhECU_whr_tot_taper = sub(setup->plcAd->PhECU_Lprot_fx, decoder->frame_length); /* 3+3 ms */ + setup->plcAd->PhECU_whr_tot_flat = decoder->frame_length; /* 10 ms */ + setup->plcAd->PhECU_LDWIN_OLAP = shr_pos(decoder->frame_length, 2); /* 2.5 ms */ + setup->plcAd->max_lprot = DYN_MAX_LPROT(decoder->fs); + setup->plcAd->max_plocs = DYN_MAX_PLOCS(decoder->fs); + setup->plcAd->PhECU_margin_xfp = 0; + setup->plcAd->PhECU_L_oold_xfp_w_E_fx = LTOT_MIN_MAN; + setup->plcAd->PhECU_L_old_xfp_w_E_fx = LTOT_MIN_MAN; + + setup->plcAd->PhECU_oold_xfp_w_E_exp_fx = UNINIT_OR_UNSAFE_OOLD_SENTINEL; + setup->plcAd->PhECU_old_xfp_w_E_exp_fx = LTOT_INIT_FLAG; + + setup->plcAd->PhECU_oold_Ltot_exp_fx = UNINIT_OR_UNSAFE_OOLD_SENTINEL; + setup->plcAd->PhECU_old_Ltot_exp_fx = LTOT_INIT_FLAG; + + + for (i = 0; i < MAX_LGW; i++) + { + setup->plcAd->PhECU_oold_grp_shape_fx[i] = + GRP_SHAPE_INIT; /* negative value will be replaced in very first calculation */ + setup->plcAd->PhECU_old_grp_shape_fx[i] = GRP_SHAPE_INIT; + } + /* t_adv=ctrl.FRAME/2 + ctrl.PhECU.LprotOrg/2 - ctrl.PhECU.LA + LDWIN_OLAP/2; */ + i = add(add(decoder->frame_length, setup->plcAd->PhECU_LprotOrg_fx), setup->plcAd->PhECU_LDWIN_OLAP); + setup->plcAd->PhECU_t_adv = sub(shr_pos(i, 1), setup->plcAd->PhECU_LA); + + for (i = 0; i < MAX_LGW; i++) + { + setup->plcAd->PhECU_mag_chg_1st[i] = 32767; + } + setup->plcAd->PhECU_beta_mute = 16384; + setup->plcAd->PhECU_nonpure_tone_flag = -1; + } + } + + lc3plus_dec_set_ep_enabled(decoder, 0); + return LC3PLUS_OK; +} + +/* set frame config params */ +void set_dec_frame_params(LC3PLUS_Dec *decoder) +{ + Word16 tmp = 0; + Word16 n; + +#ifndef FIX_TX_RX_STRUCT_STEREO +#ifdef CR9_C_ADD_1p25MS + decoder->ltpf_rx_status[0] = 0; + decoder->ltpf_rx_status[1] = 0; + decoder->ltpf_mem_continuation = 0; + decoder->ltpf_mem_active_prev = 0; +#endif +#endif + + decoder->frame_length = extract_l(L_shr_pos(Mpy_32_16_lc3plus(decoder->fs, 20972), 6)); /* fs * 0.01*2^6 */ + +#ifdef ENABLE_HR_MODE + if (decoder->hrmode) + { + decoder->BW_cutoff_bits = 0; + } +#endif + + SWITCH (decoder->frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + decoder->frame_length = shr_pos(decoder->frame_length, 3); + decoder->la_zeroes = 0; + decoder->stDec_ola_mem_fx_len = sub(decoder->frame_length, decoder->la_zeroes); + decoder->BW_cutoff_bits = 0; +#ifdef ENABLE_HR_MODE + if (decoder->hrmode) + { + assert(0); + } + else +#endif + { + decoder->bands_number = bands_number_1_25ms[decoder->fs_idx]; + decoder->bands_offset = bands_offset_1_25ms[decoder->fs_idx]; + decoder->W_fx = LowDelayShapes_n960_1_25ms[decoder->fs_idx]; + decoder->W_size = LowDelayShapes_n960_len_1_25ms[decoder->fs_idx]; + decoder->yLen = s_min(MAX_BW >> 3, decoder->frame_length); + } + +#ifdef ENABLE_HR_MODE + if (decoder->hrmode) + { + assert(0); + } + else +#endif + { + decoder->bands_number = bands_number_1_25ms[decoder->fs_idx]; + decoder->bands_offset = bands_offset_1_25ms[decoder->fs_idx]; + decoder->W_fx = LowDelayShapes_n960_1_25ms[decoder->fs_idx]; + decoder->W_size = LowDelayShapes_n960_len_1_25ms[decoder->fs_idx]; + decoder->yLen = s_min(MAX_BW >> 3, decoder->frame_length); + decoder->BW_cutoff_bits = -1; + } +#ifdef FIX_PLC_CONFORM_ISSUES + if (decoder->fs_idx == 0 || decoder->frame_length <= 20) +#else + if (decoder->fs_idx == 0) +#endif + { + int ch; + for (ch = 0; ch < decoder->channels; ch++) + { + DecSetup *setup = decoder->channel_setup[ch]; + if (setup->plcAd != NULL) + { + setup->plcAd->tdc_lpc_order = 8; + } + } + } + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + decoder->frame_length = shr_pos(decoder->frame_length, 2); + decoder->la_zeroes = LowDelayShapes_n960_la_zeroes_2_5ms[decoder->fs_idx]; + decoder->stDec_ola_mem_fx_len = sub(decoder->frame_length, decoder->la_zeroes); + +#ifdef ENABLE_HR_MODE + if (decoder->hrmode) + { + decoder->bands_number = bands_number_2_5ms_HR[decoder->fs_idx]; + decoder->bands_offset = bands_offset_2_5ms_HR[decoder->fs_idx - 4]; + decoder->W_fx = LowDelayShapes_n960_HRA_2_5ms[decoder->fs_idx - 4]; + decoder->W_size = LowDelayShapes_n960_len_2_5ms[decoder->fs_idx]; + decoder->yLen = decoder->frame_length; + } + else +#endif + { + decoder->bands_number = bands_number_2_5ms[decoder->fs_idx]; + decoder->bands_offset = bands_offset_2_5ms[decoder->fs_idx]; + decoder->W_fx = LowDelayShapes_n960_2_5ms[decoder->fs_idx]; + decoder->W_size = LowDelayShapes_n960_len_2_5ms[decoder->fs_idx]; + decoder->yLen = s_min(MAX_BW >> 2, decoder->frame_length); + } + +#ifdef FIX_PLC_CONFORM_ISSUES + if (decoder->fs_idx == 0 || decoder->frame_length <= 20) +#else + if (decoder->fs_idx == 0) +#endif + { + int ch; + for (ch = 0; ch < decoder->channels; ch++) + { + DecSetup *setup = decoder->channel_setup[ch]; + if (setup->plcAd != NULL) + { + setup->plcAd->tdc_lpc_order = 8; + } + } + } + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + decoder->frame_length = shr_pos(decoder->frame_length, 1); + decoder->la_zeroes = LowDelayShapes_n960_la_zeroes_5ms[decoder->fs_idx]; + decoder->stDec_ola_mem_fx_len = sub(decoder->frame_length, decoder->la_zeroes); + +#ifdef ENABLE_HR_MODE + if (decoder->hrmode) + { + decoder->bands_offset = bands_offset_5ms_HR[decoder->fs_idx - 4]; + decoder->W_fx = LowDelayShapes_n960_HRA_5ms[decoder->fs_idx - 4]; + decoder->W_size = LowDelayShapes_n960_len_5ms[decoder->fs_idx]; + decoder->yLen = decoder->frame_length; + decoder->bands_number = bands_number_5ms[decoder->fs_idx]; + } + else +#endif + { + decoder->bands_offset = bands_offset_5ms[decoder->fs_idx]; + decoder->W_fx = LowDelayShapes_n960_5ms[decoder->fs_idx]; + decoder->W_size = LowDelayShapes_n960_len_5ms[decoder->fs_idx]; + decoder->yLen = s_min(MAX_BW >> 1, decoder->frame_length); + decoder->bands_number = bands_number_5ms[decoder->fs_idx]; + } + BREAK; + + case LC3PLUS_FRAME_DURATION_7p5MS: + tmp = shr_pos(decoder->frame_length, 2); + decoder->frame_length = add(tmp, add(tmp, tmp)); + decoder->la_zeroes = LowDelayShapes_n960_la_zeroes_7_5ms[decoder->fs_idx]; + decoder->stDec_ola_mem_fx_len = sub(decoder->frame_length, decoder->la_zeroes); +#ifdef ENABLE_HR_MODE + if (decoder->hrmode) + { + decoder->bands_offset = bands_offset_7_5ms_HR[decoder->fs_idx - 4]; + decoder->W_fx = LowDelayShapes_n960_HRA_7_5ms[decoder->fs_idx - 4]; + decoder->W_size = LowDelayShapes_n960_len_7_5ms[decoder->fs_idx]; + decoder->yLen = decoder->frame_length; + decoder->bands_number = bands_number_7_5ms[decoder->fs_idx]; + } + else +#endif + { + decoder->bands_offset = bands_offset_7_5ms[decoder->fs_idx]; + decoder->W_fx = LowDelayShapes_n960_7_5ms[decoder->fs_idx]; + decoder->W_size = LowDelayShapes_n960_len_7_5ms[decoder->fs_idx]; + decoder->yLen = s_min((MAX_BW >> 2) * 3, decoder->frame_length); + decoder->bands_number = bands_number_7_5ms[decoder->fs_idx]; + } + BREAK; + + case LC3PLUS_FRAME_DURATION_10MS: + decoder->la_zeroes = LowDelayShapes_n960_la_zeroes[decoder->fs_idx]; + decoder->stDec_ola_mem_fx_len = sub(decoder->frame_length, decoder->la_zeroes); + decoder->bands_number = 64; + +#ifdef ENABLE_HR_MODE + if (decoder->hrmode) + { + decoder->bands_offset = bands_offset_HR[decoder->fs_idx - 4]; + decoder->W_fx = LowDelayShapes_n960_HRA[decoder->fs_idx - 4]; + decoder->W_size = LowDelayShapes_n960_len[decoder->fs_idx]; + decoder->yLen = decoder->frame_length; + } + else +#endif + { + decoder->W_fx = LowDelayShapes_n960[decoder->fs_idx]; + decoder->W_size = LowDelayShapes_n960_len[decoder->fs_idx]; + decoder->bands_offset = bands_offset[decoder->fs_idx]; + decoder->yLen = s_min(MAX_BW, decoder->frame_length); + } + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: + assert(0); + } + + { + int ch; + for (ch = 0; ch < decoder->channels; ch++) + { + DecSetup *setup = decoder->channel_setup[ch]; + if (setup->plcAd != NULL) + { /*only set if plcAd was actually allocated */ + int idx = (decoder->frame_dms * 1.25 * 10 / 25) - 1; + setup->plcAd->longterm_analysis_counter_max = plc_fadeout_param_maxlen[idx]; + setup->plcAd->longterm_analysis_counter_max_bytebuffer = plc_fadeout_param_maxbytes[idx]; + + setup->plcAd->PhECU_frame_ms = (Word16)( + decoder->frame_dms * 1.25 * 10 * + 0.1); /* needed in processPLCupdate_fx(), now set properly set in first frame /second time */ + } + } + } + FOR (n=0; n < PLC_FADEOUT_TYPE_1_IN_MS*10/(decoder->frame_dms*1.25*10);n++){ + decoder->alpha_type_2_table[n] = type_2_fadeout_fx(n, decoder->frame_dms); + } +} + +LC3PLUS_Error update_dec_bitrate(LC3PLUS_Dec *decoder, int ch, Word16 nBytes) +{ + int tmp = 0, totalBits = 0; + int channel_bytes = 0; + int minBytes = 0, maxBytes = 0; + + DecSetup *setup = decoder->channel_setup[ch]; + channel_bytes = nBytes; + +#ifdef ENABLE_HR_MODE + if (decoder->hrmode) + { + SWITCH (decoder->frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + maxBytes = 210; + minBytes = MIN_NBYTES; + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + maxBytes = 210; + minBytes = MIN_NBYTES; + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + maxBytes = 375; + minBytes = MIN_NBYTES; + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + maxBytes = 625; + minBytes = MIN_NBYTES; + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + maxBytes = 625; + minBytes = MIN_NBYTES; + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: return LC3PLUS_HRMODE_ERROR; + } + } + else +#endif + { + minBytes = MIN_NBYTES; + maxBytes = MAX_NBYTES_100; + } + + if (channel_bytes < minBytes || channel_bytes > maxBytes) + { + return LC3PLUS_NUMBYTES_ERROR; + } + + setup->targetBytes = channel_bytes; + move16(); + setup->total_bits = shl(setup->targetBytes, 3); + setup->enable_lpc_weighting = (setup->total_bits < 480); + + +#ifdef FIX_BOTH_1p25_WB_GLOBGAINOFFSET_NONBE + IF(decoder->frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) + { + setup->quantizedGainOff = calc_GGainOffset_1p25_fx(setup->total_bits, decoder->fs_idx); /* enc/dec common function */ + } + ELSE + { + setup->quantizedGainOff = + -(s_min(115, setup->total_bits / (10 * (decoder->fs_idx + 1))) + 105 + 5 * (decoder->fs_idx + 1)); + } +#else + setup->quantizedGainOff = + -(s_min(115, setup->total_bits / (10 * (decoder->fs_idx + 1))) + 105 + 5 * (decoder->fs_idx + 1)); +#endif + + + +#ifdef ENABLE_HR_MODE + if (decoder->hrmode && decoder->fs_idx == 5) + { + setup->quantizedGainOff = MAX(setup->quantizedGainOff, -181); + } +#endif + + tmp = i_mult(80, decoder->fs_idx); + + totalBits = setup->total_bits; + + SWITCH (decoder->frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + setup->enable_lpc_weighting = 0; + /* total_bits * 3.36 */ + totalBits = extract_l(L_shr(L_mult0(27526, setup->total_bits), 13)); + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + setup->enable_lpc_weighting = 0; + /* total_bits * 2.4 */ + totalBits = extract_l(L_shr(L_mult0(19661, setup->total_bits), 13)); + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + setup->enable_lpc_weighting = setup->total_bits < 240; + totalBits = sub(i_mult(setup->total_bits, 2), 160); + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + setup->enable_lpc_weighting = setup->total_bits < 360; + totalBits = L_shr(L_mult0(10923, setup->total_bits), 13); + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: + assert(0); + } + + if (sub(totalBits, add(320, tmp)) < 0) + { + setup->ltpf_scale_fac_idx = 0; + move16(); + } + else if (sub(totalBits, add(400, tmp)) < 0) + { + setup->ltpf_scale_fac_idx = 1; + move16(); + } + else if (sub(totalBits, add(480, tmp)) < 0) + { + setup->ltpf_scale_fac_idx = 2; + move16(); + } + else if (sub(totalBits, add(560, tmp)) < 0) + { + setup->ltpf_scale_fac_idx = 3; + move16(); + } + else + { + setup->ltpf_scale_fac_idx = -1; + move16(); + } + +#ifdef ENABLE_HR_MODE + /* No LTPF in hrmode */ + if (decoder->hrmode) + { + setup->ltpf_scale_fac_idx = -1; + move16(); + } +#endif + + return LC3PLUS_OK; +} + diff --git a/lib_lc3plus/setup_dec_lc3plus.h b/lib_lc3plus/setup_dec_lc3plus.h new file mode 100644 index 0000000000000000000000000000000000000000..e2c35ec458edd71ff8afae0c9b49c49b182bdfd2 --- /dev/null +++ b/lib_lc3plus/setup_dec_lc3plus.h @@ -0,0 +1,206 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#ifndef SETUP_DEC_LC3_H +#define SETUP_DEC_LC3_H + +#include "options.h" +#include "wmc_auto.h" +#include "constants.h" + +typedef struct +{ + Word16 *x_old_tot_fx; /* MAX_LEN_PCM_PLC_TOT */ + Word32 *PhECU_f0est; /* MAX_PLOCS interpolated plocs */ + Word16 *PhECU_xfp_fx; /* MAX_LPROT */ + Word16 *PhECU_X_sav_fx; /* MAX_LPROT */ + Word16 *PhECU_plocs; /* MAX_PLOCS */ + Word16 *PhECU_fg_wintaper; /* MDCT_MEM_LEN_MAX */ + Word16 *PhECU_win_pre_tda; /* MAX_WIN_PRE_TDA */ + Word32 tdc_gain_c; + Word16 stab_fac; + Word16 tdc_fract; + Word16 tdc_seed; + Word16 tdc_preemph_fac; + Word16 tdc_lpc_order; + Word16 cum_fflcAtten; + Word16 harmonicBuf_fx[MAX_PITCH]; + Word16 harmonicBuf_Q; + Word16 synthHist_fx[M]; + Word16 cum_fading_slow; + Word16 cum_fading_fast; + Word16 PhECU_LprotOrg_fx; /* needed to change the Prot size adaptively */ + Word16 PhECU_Lprot_fx; + Word16 PhECU_fs_idx_fx; + Word16 PhECU_frame_ms; /* needed in PLC_Update and PLCMain functons*/ + Word16 PhECU_seed_fx; + Word16 PhECU_xfp_exp_fx; + Word16 PhECU_time_offs; + Word16 PhECU_X_savQ_fx; + Word16 PhECU_num_plocs; + Word16 PhECU_f0hzLtpBinQ7; /* ltp F0 in bins if available */ + Word16 PhECU_short_flag_prev; + Word16 PhECU_whr_tot_taper; + Word16 PhECU_whr_tot_flat; + Word16 PhECU_LDWIN_OLAP; + Word16 PhECU_LA; + Word16 PhECU_t_adv; + Word16 PhECU_beta_mute; + Word16 norm_corrQ15_fx; + Word16 q_fx_old_exp; + Word16 max_len_pcm_plc; + Word16 max_lprot; + Word16 max_plocs; + + /* Word32 L_tot W_energy sum exponent */ + Word16 PhECU_oold_Ltot_exp_fx; + Word16 PhECU_old_Ltot_exp_fx; + Word32 PhECU_L_oold_xfp_w_E_fx; + Word32 PhECU_L_old_xfp_w_E_fx; + Word16 PhECU_oold_xfp_w_E_exp_fx; /* input Word16 xfp exponnet */ + Word16 PhECU_old_xfp_w_E_exp_fx; + Word16 PhECU_oold_grp_shape_fx[MAX_LGW]; + Word16 PhECU_old_grp_shape_fx[MAX_LGW]; + Word16 PhECU_margin_xfp; + Word16 PhECU_nonpure_tone_flag; /* non-pure single tone indicator state */ + Word16 PhECU_mag_chg_1st[MAX_LGW]; + Word16 PhECU_Xavg[MAX_LGW]; + Word16 old_scf_q[M]; + Word16 old_old_scf_q[M]; + Word16 tdc_A[M + 1]; + /* for now 20 ms saved Q14 or ptr to a combined ifft win and MDCT preTDA synthesis window 16 ms */ + + Word16 longterm_counter_plcTdc; + Word16 longterm_counter_plcNsAdv; + Word16 longterm_analysis_counter_max; /* Maximum longterm frames number */ + Word16 longterm_analysis_counter_max_bytebuffer; /* Same as above but reduced for circular bit-buffer */ + Word32 *plc_longterm_advc_tdc; + Word32 *plc_longterm_advc_ns; + UWord8 plc_fadeout_type; + Word16 overall_counter; + Word8 longterm_counter_byte_position; + Word8 longterm_counter_bit_position; +#ifdef CR13_C_RESET_CLASSIFIER_AFTER_BAD_FRAMES + Word16 numberOfGoodFrames; +#endif +} AplcSetup; + +/* Channel state and bitrate-derived values go in this struct */ +typedef struct +{ + Word16 *ltpf_mem_x; /* LTPF_MEM_X_LEN */ + Word16 *ltpf_mem_y; /* LTPF_MEM_Y_LEN */ +#ifdef ENABLE_HR_MODE + Word32 *stDec_ola_mem_fx; /* MDCT_MEM_LEN_MAX */ +#else + Word16 *stDec_ola_mem_fx; /* MDCT_MEM_LEN_MAX */ +#endif + AplcSetup *plcAd; + Word16 * q_old_d_fx; /* MAX_BW */ + Word16 q_old_fx_exp; + Word16 ns_seed; + Word16 ns_cum_alpha; + Word16 pc_nbLostFramesInRow; + Word16 pc_seed; + Word16 *q_old_res_fx; + Word16 q_old_res_fx_exp; + Word16 prev_gg; + Word16 prev_gg_e; + Word16 prev_BW_cutoff_idx_nf; + Word16 prev_fac_ns_fx; + Word16 total_bits; + Word16 enable_lpc_weighting; + Word16 stDec_ola_mem_fx_exp; + Word16 targetBytes; + Word16 ltpf_mem_e; + Word16 ltpf_mem_pitch_int; + Word16 ltpf_mem_pitch_fr; + Word16 ltpf_mem_gain; + Word16 ltpf_mem_active; + Word16 ltpf_scale_fac_idx; + Word16 ltpf_mem_scale_fac_idx; + Word16 quantizedGainOff; + Word16 prev_bfi; + Word16 prev_prev_bfi; + Word16 concealMethod; + Word16 nbLostFramesInRow; + Word16 plc_damping; + Word16 last_size; + Word32 rel_pitch_change; +#ifdef CR9_C_ADD_1p25MS +#ifdef FIX_TX_RX_STRUCT_STEREO + Word16 ltpf_rx_status[2]; +#endif + Word16 ltpf_mem_continuation; + Word16 ltpf_mem_active_prev; + Word16 ltpf_mem_pitch_int_prev; + Word16 ltpf_mem_pitch_fr_prev; + Word16 ltpf_mem_beta_idx_prev; + Word16 ltpf_mem_gain_prev; + Word16 ltpf_pitch_stability_counter; +#ifdef NEW_SIGNALLING_SCHEME_1p25 + Word16 ltpfinfo_frame_cntr_fx; /* individual cntr for each channel*/ +#endif +#endif +} DecSetup; + +/* Constants and sampling rate derived values go in this struct */ +struct LC3PLUS_Dec +{ + DecSetup * channel_setup[MAX_CHANNELS]; +#ifdef ENABLE_HR_MODE + const Word32 *W_fx; +#else + const Word16 *W_fx; +#endif + const Word16 *bands_offset; + Word32 fs; /* sampling rate, 44.1 maps to 48 */ + Word32 fs_out; /* output sampling rate */ + Word16 fs_idx; /* sampling rate index */ + Word16 frame_length; /* sampling rate index */ + Word16 channels; /* number of channels */ + Word16 plcMeth; /* PLC method for all channels */ + LC3PLUS_FrameDuration frame_dms; /* frame length in dms (decimilliseconds, 10^-4)*/ + Word16 last_size; /* size of last frame, without error protection */ + Word16 ep_enabled; /* error protection enabled */ + Word16 error_report; /* corrected errors in last frame or -1 on error */ + + Word16 n_pccw; + Word16 be_bp_left; + Word16 be_bp_right; + Word16 n_pc; + Word16 m_fec; + Word16 epmr; + Word16 combined_channel_coding; + + Word16 yLen; + Word16 W_size; + Word16 la_zeroes; + Word16 stDec_ola_mem_fx_len; + Word16 bands_number; + Word16 ltpf_mem_x_len; + Word16 ltpf_mem_y_len; + Word16 BW_cutoff_bits; + Word16 hrmode; + Word16 alpha_type_2_table[160];/* PLC_FADEOUT_TYPE_1_IN_MS*100/125 */ +#ifndef FIX_TX_RX_STRUCT_STEREO +#ifdef CR9_C_ADD_1p25MS + Word16 ltpf_rx_status[2]; + Word16 ltpf_mem_continuation; + Word16 ltpf_mem_active_prev; + Word16 ltpf_mem_pitch_int_prev; + Word16 ltpf_mem_pitch_fr_prev; + Word16 ltpf_mem_beta_idx_prev; + Word16 ltpf_mem_gain_prev; + Word16 ltpf_pitch_stability_counter; +#endif +#endif +}; + +#endif /* SETUP_DEC_LC3_H */ diff --git a/lib_lc3plus/setup_enc_lc3plus.c b/lib_lc3plus/setup_enc_lc3plus.c new file mode 100644 index 0000000000000000000000000000000000000000..6005f1521262793edea2692ea9c774bc2c682c0b --- /dev/null +++ b/lib_lc3plus/setup_enc_lc3plus.c @@ -0,0 +1,903 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" +#include "setup_enc_lc3plus.h" + +/* if encoder is null only size is reported */ +int alloc_encoder(LC3PLUS_Enc *encoder, int samplerate, int channels) +{ + int ch = 0; + size_t size = sizeof(LC3PLUS_Enc); + void * mdct_mem32 = NULL, *stEnc_mdct_mem = NULL; + + for (ch = 0; ch < channels; ch++) + { + EncSetup *setup = balloc(encoder, &size, sizeof(EncSetup)); + mdct_mem32 = balloc(encoder, &size, sizeof(*setup->mdct_mem32) * DYN_MAX_MDCT_LEN(samplerate)); + stEnc_mdct_mem = balloc(encoder, &size, sizeof(*setup->stEnc_mdct_mem) * DYN_MAX_MDCT_LEN(samplerate)); + if (encoder) + { + encoder->channel_setup[ch] = setup; + setup->mdct_mem32 = mdct_mem32; + setup->stEnc_mdct_mem = stEnc_mdct_mem; + } + } + + return (int)size; +} + +LC3PLUS_Error FillEncSetup(LC3PLUS_Enc *encoder, int samplerate, int channels +#ifdef ENABLE_HR_MODE + , int hrmode +#endif + , int32_t lfe_channel_array[] + ) +{ + int ch = 0; + + memset(encoder, 0, lc3plus_enc_get_size(samplerate, channels)); + alloc_encoder(encoder, samplerate, channels); + + encoder->fs = CODEC_FS(samplerate); + encoder->fs_in = samplerate; + encoder->fs_idx = FS2FS_IDX(encoder->fs); + +#ifdef ENABLE_HR_MODE + if (encoder->fs_idx > 4) + { + encoder->fs_idx = 5; + } + encoder->hrmode = hrmode != 0; +#endif + + encoder->channels = channels; + encoder->frame_dms = LC3PLUS_FRAME_DURATION_10MS; + encoder->envelope_bits = 38; + #ifdef CR9_C_ADD_1p25MS_LRSNS + /* "38" SNS bit constant kept here, final LR-SNS bitrate adjusted in enc_lc3() after LR-SNSVQ */ +#endif /* CR9_C_ADD_1p25MS_LRSNS */ + encoder->global_gain_bits = 8; + encoder->noise_fac_bits = 3; + encoder->r12k8_mem_in_len = extract_l(L_shr_pos(Mpy_32_16_lc3plus(encoder->fs, 20972), 9)); + encoder->r12k8_mem_out_len = 24; + encoder->epmr = LC3PLUS_EPMR_ZERO; + encoder->bw_ctrl_active = 0; + encoder->bandwidth = L_shr_pos(encoder->fs, 1); + encoder->bandwidth_preset = L_shr_pos(encoder->fs, 1); + + if (lfe_channel_array != NULL) + { + for (ch = 0; ch < encoder->channels; ch++) + { + encoder->channel_setup[ch]->lfe = lfe_channel_array[ch] != 0; + } + } + + for (ch = 0; ch < encoder->channels; ch++) + { + encoder->channel_setup[ch]->x_exp = 15; + encoder->channel_setup[ch]->resamp_exp = 17; + } + + set_enc_frame_params(encoder); + + return lc3plus_enc_set_ep_mode(encoder, LC3PLUS_EP_OFF); /* also calls update_enc_bitrate */ +} + +/* set frame config params */ +void set_enc_frame_params(LC3PLUS_Enc *encoder) +{ + Word16 tmp; +#ifdef CR9_C_ADD_1p25MS +#ifndef FIX_TX_RX_STRUCT_STEREO + encoder->Tx_ltpf = 0; +#endif + encoder->LT_normcorr = 0xFFFF >> 2; +#endif + + encoder->frame_length = extract_l(L_shr_pos(Mpy_32_16_lc3plus(encoder->fs, 20972), 6)); /* fs * 0.01*2^6 */ + +#ifdef ENABLE_HR_MODE + if (encoder->hrmode) + { + encoder->BW_cutoff_bits = 0; + } + else +#endif + { + encoder->BW_cutoff_bits = BW_cutoff_bits_all[encoder->fs_idx]; + } + + SWITCH (encoder->frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + encoder->BW_cutoff_bits = 0; + encoder->frame_length = shr_pos(encoder->frame_length, 3); + encoder->la_zeroes = 0; + encoder->stEnc_mdct_mem_len = sub(encoder->frame_length, encoder->la_zeroes); + encoder->nSubdivisions = 0; +#ifdef FIX_LTPF_PITCH_MEM_LEN + encoder->ltpf_mem_in_len = LTPF_MEMIN_LEN + 112; +#else + encoder->ltpf_mem_in_len = LTPF_MEMIN_LEN + ( LEN_12K8 >> 1 ) + 16; +#endif + encoder->r12k8_mem_out_len = 8; +#ifndef CR9_C_ADD_1p25MS_NOISEFILLING + encoder->noise_fac_bits = 0; +#endif +#ifdef ENABLE_HR_MODE + if (encoder->hrmode) + { + assert(0); + } + else +#endif + { + encoder->yLen = s_min(MAX_BW >> 3, encoder->frame_length); + encoder->W_fx = LowDelayShapes_n960_1_25ms[encoder->fs_idx]; + encoder->W_size = LowDelayShapes_n960_len_1_25ms[encoder->fs_idx]; + encoder->bands_number = bands_number_1_25ms[encoder->fs_idx]; + encoder->bands_offset = bands_offset_1_25ms[encoder->fs_idx]; + encoder->near_nyquist_index = encoder->bands_number - 2; + encoder->near_nyquist_flag = 0; + } + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + encoder->frame_length = shr_pos(encoder->frame_length, 2); + encoder->la_zeroes = LowDelayShapes_n960_la_zeroes_2_5ms[encoder->fs_idx]; + encoder->stEnc_mdct_mem_len = sub(encoder->frame_length, encoder->la_zeroes); + encoder->nSubdivisions = 2; +#ifdef FIX_LTPF_PITCH_MEM_LEN + encoder->ltpf_mem_in_len = LTPF_MEMIN_LEN + 96; +#else + encoder->ltpf_mem_in_len = LTPF_MEMIN_LEN + ( LEN_12K8 >> 2 ); +#endif + +#ifdef ENABLE_HR_MODE + if (encoder->hrmode) + { + encoder->bands_number = bands_number_2_5ms_HR[encoder->fs_idx]; + encoder->bands_offset = bands_offset_2_5ms_HR[encoder->fs_idx - 4]; + encoder->W_fx = LowDelayShapes_n960_HRA_2_5ms[encoder->fs_idx - 4]; + encoder->W_size = LowDelayShapes_n960_len_2_5ms[encoder->fs_idx]; + encoder->yLen = encoder->frame_length; + } + else +#endif + { + encoder->yLen = s_min(MAX_BW >> 2, encoder->frame_length); + encoder->W_fx = LowDelayShapes_n960_2_5ms[encoder->fs_idx]; + encoder->W_size = LowDelayShapes_n960_len_2_5ms[encoder->fs_idx]; + encoder->bands_number = bands_number_2_5ms[encoder->fs_idx]; + encoder->bands_offset = bands_offset_2_5ms[encoder->fs_idx]; + encoder->near_nyquist_index = encoder->bands_number - 2; + encoder->near_nyquist_flag = 0; + } + + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + encoder->frame_length = shr_pos(encoder->frame_length, 1); + encoder->la_zeroes = LowDelayShapes_n960_la_zeroes_5ms[encoder->fs_idx]; + encoder->stEnc_mdct_mem_len = sub(encoder->frame_length, encoder->la_zeroes); + encoder->nSubdivisions = 2; +#ifdef FIX_LTPF_PITCH_MEM_LEN + encoder->ltpf_mem_in_len = LTPF_MEMIN_LEN + 64; +#else + encoder->ltpf_mem_in_len = LTPF_MEMIN_LEN + ( LEN_12K8 >> 1 ); +#endif + +#ifdef ENABLE_HR_MODE + if (encoder->hrmode) + { + encoder->bands_offset = bands_offset_5ms_HR[encoder->fs_idx - 4]; + encoder->W_fx = LowDelayShapes_n960_HRA_5ms[encoder->fs_idx - 4]; + encoder->W_size = LowDelayShapes_n960_len_5ms[encoder->fs_idx]; + encoder->yLen = encoder->frame_length; + encoder->bands_number = bands_number_5ms[encoder->fs_idx]; + } + else +#endif + { + encoder->yLen = s_min(MAX_BW >> 1, encoder->frame_length); + encoder->W_fx = LowDelayShapes_n960_5ms[encoder->fs_idx]; + encoder->W_size = LowDelayShapes_n960_len_5ms[encoder->fs_idx]; + encoder->bands_number = bands_number_5ms[encoder->fs_idx]; + encoder->bands_offset = bands_offset_5ms[encoder->fs_idx]; + encoder->near_nyquist_index = encoder->bands_number - 3; + encoder->near_nyquist_flag = 0; + } + BREAK; + + case LC3PLUS_FRAME_DURATION_7p5MS: + tmp = shr_pos(encoder->frame_length, 2); + encoder->frame_length = add(tmp, add(tmp, tmp)); + encoder->la_zeroes = LowDelayShapes_n960_la_zeroes_7_5ms[encoder->fs_idx]; + encoder->stEnc_mdct_mem_len = sub(encoder->frame_length, encoder->la_zeroes); + encoder->bands_number = bands_number_7_5ms[encoder->fs_idx]; + encoder->nSubdivisions = 3; + encoder->ltpf_mem_in_len = LTPF_MEMIN_LEN; + encoder->attdec_nblocks = 3; + encoder->attdec_damping = 9830; + encoder->attdec_hangover_thresh = 1; + encoder->r12k8_mem_out_len = 44; + encoder->near_nyquist_index = encoder->bands_number - 4; + encoder->near_nyquist_flag = 0; +#ifdef ENABLE_HR_MODE + if (encoder->hrmode) + { + encoder->yLen = encoder->frame_length; + encoder->W_fx = LowDelayShapes_n960_HRA_7_5ms[encoder->fs_idx - 4]; + encoder->W_size = LowDelayShapes_n960_len_7_5ms[encoder->fs_idx]; + encoder->bands_number = bands_number_7_5ms[encoder->fs_idx]; + encoder->bands_offset = bands_offset_7_5ms_HR[encoder->fs_idx - 4]; + } + else +#endif + { + encoder->yLen = s_min((MAX_BW >> 2) * 3, encoder->frame_length); + encoder->W_fx = LowDelayShapes_n960_7_5ms[encoder->fs_idx]; + encoder->W_size = LowDelayShapes_n960_len_7_5ms[encoder->fs_idx]; + encoder->bands_number = bands_number_7_5ms[encoder->fs_idx]; + encoder->bands_offset = bands_offset_7_5ms[encoder->fs_idx]; + } + BREAK; + + case LC3PLUS_FRAME_DURATION_10MS: + encoder->la_zeroes = LowDelayShapes_n960_la_zeroes[encoder->fs_idx]; + encoder->stEnc_mdct_mem_len = sub(encoder->frame_length, encoder->la_zeroes); + encoder->bands_number = 64; + encoder->nSubdivisions = 3; + encoder->ltpf_mem_in_len = LTPF_MEMIN_LEN; + encoder->attdec_nblocks = 4; + encoder->attdec_damping = 16384; + encoder->attdec_hangover_thresh = 2; + encoder->near_nyquist_index = encoder->bands_number - 2; + encoder->near_nyquist_flag = 0; + +#ifdef ENABLE_HR_MODE + if (encoder->hrmode) + { + encoder->bands_offset = bands_offset_HR[encoder->fs_idx - 4]; + encoder->W_fx = LowDelayShapes_n960_HRA[encoder->fs_idx - 4]; + encoder->W_size = LowDelayShapes_n960_len[encoder->fs_idx]; + encoder->yLen = encoder->frame_length; + } + else +#endif + { + encoder->yLen = s_min(MAX_BW, encoder->frame_length); + encoder->W_fx = LowDelayShapes_n960[encoder->fs_idx]; + encoder->W_size = LowDelayShapes_n960_len[encoder->fs_idx]; + encoder->bands_offset = bands_offset[encoder->fs_idx]; + } + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: + assert(0); + } +} + +/* change encoder bitrate */ +LC3PLUS_Error update_enc_bitrate(LC3PLUS_Enc *encoder, int bitrate) +{ + int ch = 0; + int totalBytes = 0, maxBR = 0, minBR = 0, max_bytes = 0; + int channel_bytes = 0; + +#ifdef CR12_D_FIX_BITRATE_LIMITS + int fec_slot_bytes_min = 0, check_bytes = 0; +#endif +#ifdef ENABLE_HR_MODE + if (encoder->hrmode) + { + SWITCH (encoder->frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + assert(0); + maxBR = 672000; + if (encoder->fs == 48000) + { + minBR = MIN_BR_25MS_48KHZ_HR; + } + else if (encoder->fs == 96000) + { + minBR = MIN_BR_25MS_96KHZ_HR; + } + else + { + return LC3PLUS_HRMODE_ERROR; + } + break; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + maxBR = 672000; + if (encoder->fs == 48000) + { + minBR = MIN_BR_25MS_48KHZ_HR; + } + else if (encoder->fs == 96000) + { + minBR = MIN_BR_25MS_96KHZ_HR; + } + else + { + return LC3PLUS_HRMODE_ERROR; + } + break; + case LC3PLUS_FRAME_DURATION_5MS: + maxBR = 600000; + if (encoder->fs == 48000) + { + minBR = MIN_BR_50MS_48KHZ_HR; + } + else if (encoder->fs == 96000) + { + minBR = MIN_BR_50MS_96KHZ_HR; + } + else + { + return LC3PLUS_HRMODE_ERROR; + } + break; + case LC3PLUS_FRAME_DURATION_7p5MS: + maxBR = 500000; + if (encoder->fs == 48000) {minBR = MIN_BR_075DMS_48KHZ_HR;} + else if (encoder->fs == 96000) {minBR = MIN_BR_075DMS_96KHZ_HR;} + else {return LC3PLUS_HRMODE_ERROR;} + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + maxBR = 500000; + if (encoder->fs == 48000) + { + minBR = MIN_BR_100MS_48KHZ_HR; + } + else if (encoder->fs == 96000) + { + minBR = MIN_BR_100MS_96KHZ_HR; + } + else + { + return LC3PLUS_HRMODE_ERROR; + } + break; + case LC3PLUS_FRAME_DURATION_UNDEFINED: return LC3PLUS_HRMODE_ERROR; + } + } + else + { + minBR = (MIN_NBYTES << 3); + maxBR = MAX_BR; + + SWITCH (encoder->frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + minBR = MIN_BR_0125DMS; + maxBR = MAX_BR_0125DMS; + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + minBR = MIN_BR_025DMS; + maxBR = MAX_BR; + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + minBR = MIN_BR_050DMS; + maxBR = MAX_BR; + /* have additional limitations for 5.0ms */ + SWITCH (encoder->fs_in) + { +#ifdef SUBSET_NB + case 8000: maxBR = MAX_BR_050DMS_NB; BREAK; +#endif + default: BREAK; + } + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + minBR = MIN_BR_075DMS; + maxBR = MAX_BR_075DMS; // special value for maxBR @ 7.5ms + /* have additional limitations for 7.5ms */ + SWITCH (encoder->fs_in) + { +#ifdef SUBSET_NB + case 8000: maxBR = MAX_BR_075DMS_NB ; BREAK; +#endif +#ifdef SUBSET_WB + case 16000: maxBR = MAX_BR_075DMS_WB ; BREAK; +#endif +#ifdef SUBSET_SSWB + case 24000: maxBR = MAX_BR_075DMS_SSWB; BREAK; +#endif + default: BREAK; + } + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + /* have additional limitations for 10ms */ + minBR = MIN_BR_100DMS; + maxBR = MAX_BR; + SWITCH (encoder->fs_in) + { +#ifdef SUBSET_NB + case 8000: maxBR = MAX_BR_100DMS_NB ; BREAK; +#endif +#ifdef SUBSET_WB + case 16000: maxBR = MAX_BR_100DMS_WB ; BREAK; +#endif +#ifdef SUBSET_SSWB + case 24000: maxBR = MAX_BR_100DMS_SSWB; BREAK; +#endif + default: maxBR = MAX_BR; BREAK; + } + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: return LC3PLUS_FRAMEMS_ERROR; + } + + /* 441/480 in Q31 and 1000/75 in Q23 */ + if (encoder->fs_in == 44100) + { + minBR = Mpy_32_32_lc3plus(minBR, 1973000602); + maxBR = Mpy_32_32_lc3plus(maxBR, 1973000602); + } + } +#else /* ENABLE_HR_MODE */ + minBR = (MIN_NBYTES << 3); + maxBR = MAX_BR; + + SWITCH (encoder->frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + minBR = MIN_BR_0125DMS; + maxBR = MAX_BR_0125DMS; + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + minBR = MIN_BR_025DMS; + maxBR = MAX_BR; + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + minBR = MIN_BR_050DMS; + maxBR = MAX_BR; + /* have additional limitations for 5.0ms */ + SWITCH (encoder->fs_in) + { +#ifdef SUBSET_NB + case 8000: maxBR = MAX_BR_050DMS_NB; BREAK; +#endif + default: BREAK; + } + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + minBR = MIN_BR_075DMS; + maxBR = MAX_BR_075DMS; // special value for maxBR @ 7.5ms + /* have additional limitations for 7.5ms */ + SWITCH (encoder->fs_in) + { +#ifdef SUBSET_NB + case 8000: maxBR = MAX_BR_075DMS_NB ; BREAK; +#endif +#ifdef SUBSET_WB + case 16000: maxBR = MAX_BR_075DMS_WB ; BREAK; +#endif +#ifdef SUBSET_SSWB + case 24000: maxBR = MAX_BR_075DMS_SSWB; BREAK; +#endif + default: BREAK; + } + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + /* have additional limitations for 10ms */ + minBR = MIN_BR_100DMS; + maxBR = MAX_BR; + SWITCH (encoder->fs_in) + { +#ifdef SUBSET_NB + case 8000: maxBR = MAX_BR_100DMS_NB ; BREAK; +#endif +#ifdef SUBSET_WB + case 16000: maxBR = MAX_BR_100DMS_WB ; BREAK; +#endif +#ifdef SUBSET_SSWB + case 24000: maxBR = MAX_BR_100DMS_SSWB; BREAK; +#endif + default: maxBR = MAX_BR; BREAK; + } + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: return LC3PLUS_FRAMEMS_ERROR; + } + + /* 441/480 in Q31 and 1000/75 in Q23 */ + if (encoder->fs_in == 44100) + { + minBR = Mpy_32_32_lc3plus(minBR, 1973000602); + maxBR = Mpy_32_32_lc3plus(maxBR, 1973000602); + } +#endif /* ENABLE_HR_MODE */ + + minBR *= encoder->channels; + maxBR *= encoder->channels; + + if (bitrate < minBR || bitrate > maxBR) + { + return LC3PLUS_BITRATE_ERROR; + } + + encoder->bitrate = bitrate; + encoder->lc3_br_set = 1; + + /* move stuff to encoder->channel_setup */ + + encoder->combined_channel_coding = 0; + if (encoder->channels > 1 && encoder->epmode) + { + if (encoder->bitrate * encoder->frame_length / (8 * encoder->fs_in) <= 160) + { + encoder->combined_channel_coding = 1; + } + } + + if (encoder->epmode > 0) + { +#ifdef CR12_D_FIX_BITRATE_LIMITS +#ifdef ENABLE_HR_MODE + if (encoder->hrmode){ + SWITCH( encoder->frame_dms ) + { + case LC3PLUS_FRAME_DURATION_2p5MS: + IF( encoder->fs_in == 48000){ + fec_slot_bytes_min = FEC_SLOT_BYTES_MIN_025DMS_48KHZ_HR; + } ELSE { + fec_slot_bytes_min = FEC_SLOT_BYTES_MIN_025DMS_96KHZ_HR; + } + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + IF( encoder->fs_in == 48000){ + fec_slot_bytes_min = FEC_SLOT_BYTES_MIN_050DMS_48KHZ_HR; + } ELSE { + fec_slot_bytes_min = FEC_SLOT_BYTES_MIN_050DMS_96KHZ_HR; + } + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + IF( encoder->fs_in == 48000){ + fec_slot_bytes_min = FEC_SLOT_BYTES_MIN_075DMS_48KHZ_HR; + } ELSE { + fec_slot_bytes_min = FEC_SLOT_BYTES_MIN_075DMS_96KHZ_HR; + } + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + IF( encoder->fs_in == 48000){ + fec_slot_bytes_min = FEC_SLOT_BYTES_MIN_100DMS_48KHZ_HR; + } ELSE { + fec_slot_bytes_min = FEC_SLOT_BYTES_MIN_100DMS_96KHZ_HR; + } + BREAK; + default: + return LC3PLUS_FRAMEMS_ERROR; + } + } + else +#endif + { + fec_slot_bytes_min = FEC_SLOT_BYTES_MIN; + } + + check_bytes = bitrate * encoder->frame_length / ( 8 * encoder->fs_in * encoder->channels ); + maxBR = FEC_SLOT_BYTES_MAX * ( 8 * encoder->fs_in * encoder->channels ) / encoder->frame_length; + if ( check_bytes < fec_slot_bytes_min || bitrate > maxBR ) +#else + max_bytes = bitrate * encoder->frame_length / (8 * encoder->fs_in * encoder->channels); + if (max_bytes < FEC_SLOT_BYTES_MIN || max_bytes > FEC_SLOT_BYTES_MAX) +#endif /* CR12_D_FIX_BITRATE_LIMITS */ + { + return LC3PLUS_BITRATE_ERROR; + } + } + + if (encoder->combined_channel_coding) + { + totalBytes = fec_get_data_size(encoder->epmode, encoder->combined_channel_coding, + bitrate * (Word32)encoder->frame_length / (8 * encoder->fs_in)); + + encoder->channel_setup[0]->n_pccw = + fec_get_n_pccw(bitrate * (Word32)encoder->frame_length / (8 * encoder->fs_in), encoder->epmode, + encoder->combined_channel_coding); + + encoder->channel_setup[0]->n_pc = fec_get_n_pc(encoder->epmode, encoder->channel_setup[0]->n_pccw, + bitrate * (Word32)encoder->frame_length / (8 * encoder->fs_in)); + } + else + { + totalBytes = bitrate * (Word32)encoder->frame_length / (8 * encoder->fs_in); + } + + for (ch = 0; ch < encoder->channels; ch++) + { + EncSetup *setup = encoder->channel_setup[ch]; + channel_bytes = totalBytes / encoder->channels + (ch < (totalBytes % encoder->channels)); + + if (encoder->combined_channel_coding) + { + setup->targetBytes = channel_bytes; + } + else + { + setup->targetBytes = fec_get_data_size(encoder->epmode, encoder->combined_channel_coding, channel_bytes); + setup->n_pccw = fec_get_n_pccw(channel_bytes, encoder->epmode, encoder->combined_channel_coding); + setup->n_pc = fec_get_n_pc(encoder->epmode, setup->n_pccw, channel_bytes); + } + /* reduce bandwith to 12kHz if bitrate is low */ + if (sub(encoder->frame_dms, LC3PLUS_FRAME_DURATION_10MS) == 0 && + ((sub(setup->targetBytes, 40) < 0 && L_sub(encoder->fs, 48000) == 0) || + (sub(setup->targetBytes, 36) < 0 && L_sub(encoder->fs, 32000) == 0))) + { + encoder->bandwidth = L_min(12000, encoder->bandwidth_preset); + } + else + { + /* channel with highest index has lowest bitrate. + For a second channel with lower targetBytes, bandwidth is overwritten */ + encoder->bandwidth = encoder->bandwidth_preset; + } + + { + Word16 tmp = 0; + + SWITCH(encoder->frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: tmp = 1; BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: tmp = 2; BREAK; + case LC3PLUS_FRAME_DURATION_5MS: tmp = 4; BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: tmp = 6; BREAK; + case LC3PLUS_FRAME_DURATION_10MS: tmp = 8; BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + encoder->bw_ctrl_cutoff_bin = L_mult0(Mpy_32_32_lc3plus(encoder->bandwidth, 10737420>>1), tmp); /* bandwidth * frame_dms / 5000 */ + } + + encoder->bw_index = sub( Mpy_32_32_lc3plus(encoder->bandwidth, 536871), 1); /* (bandwidth / 4000 ) - 1 */ + SWITCH (encoder->frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: max_bytes = MAX_NBYTES_025; break; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: max_bytes = MAX_NBYTES_025; break; + case LC3PLUS_FRAME_DURATION_5MS: max_bytes = MAX_NBYTES_050; break; + case LC3PLUS_FRAME_DURATION_7p5MS: max_bytes = MAX_NBYTES_075; BREAK; + case LC3PLUS_FRAME_DURATION_10MS: max_bytes = MAX_NBYTES_100; break; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } +#ifdef ENABLE_HR_MODE + if (encoder->hrmode) + { + max_bytes = MAX_NBYTES_RED_HR; + } +#endif + if (setup->targetBytes < MIN_NBYTES || setup->targetBytes > max_bytes) + { + return LC3PLUS_BITRATE_ERROR; + } + + setup->total_bits = shl(setup->targetBytes, 3); + setup->targetBitsInit = + sub(setup->total_bits, + add(encoder->envelope_bits, + add(encoder->global_gain_bits, add(encoder->noise_fac_bits, encoder->BW_cutoff_bits)))); + setup->targetBitsInit = sub(setup->targetBitsInit, getLastNzBits_fx (encoder->frame_length) + 3); + if (setup->total_bits > 1280) + { + setup->targetBitsInit = sub(setup->targetBitsInit, 1); + } + if (setup->total_bits > 2560) + { + setup->targetBitsInit = sub(setup->targetBitsInit, 1); + } + +#ifdef ENABLE_HR_MODE + if (encoder->hrmode) + { + setup->targetBitsInit -= 1; + } +#endif + + setup->targetBitsAri = setup->total_bits; + + SWITCH (encoder->frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + /* 13763 = 3.36 * 2^12 */ + setup->ltpf_enable = + sub(extract_l(L_shr(L_mult0(13763, setup->total_bits), 12)), add(560, i_mult(80, encoder->fs_idx))) < 0; + setup->enable_lpc_weighting = 0; + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + /* 9830 = 2.4 * 2^12 */ + setup->ltpf_enable = + sub(extract_l(L_shr(L_mult0(9830, setup->total_bits), 12)), add(560, i_mult(80, encoder->fs_idx))) < 0; + setup->enable_lpc_weighting = 0; + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + setup->ltpf_enable = sub(sub(i_mult(setup->total_bits, 2), 160), add(560, i_mult(80, encoder->fs_idx))) < 0; + setup->enable_lpc_weighting = setup->total_bits < 240; + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + setup->ltpf_enable = sub(L_shr(L_mult0(10923, setup->total_bits), 13), add(560, i_mult(80, encoder->fs_idx))) < 0; + setup->enable_lpc_weighting = setup->total_bits < 360; + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + setup->enable_lpc_weighting = setup->total_bits < 480; + setup->ltpf_enable = sub(setup->total_bits, add(560, i_mult(80, encoder->fs_idx))) < 0; + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: + assert(0); + } + +#ifdef FIX_BOTH_1p25_WB_GLOBGAINOFFSET_NONBE + IF(encoder->frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) + { + setup->quantizedGainOff = calc_GGainOffset_1p25_fx(setup->total_bits, encoder->fs_idx); /* enc/dec common function */ + } + ELSE + { + setup->quantizedGainOff = + -(s_min(115, setup->total_bits / (10 * (encoder->fs_idx + 1))) + 105 + 5 * (encoder->fs_idx + 1)); + } +#else + + setup->quantizedGainOff = + -(s_min(115, setup->total_bits / (10 * (encoder->fs_idx + 1))) + 105 + 5 * (encoder->fs_idx + 1)); +#endif + +#ifdef ENABLE_HR_MODE + if (encoder->hrmode && encoder->fs_idx == 5) + { + setup->quantizedGainOff = MAX(setup->quantizedGainOff, -181); + } +#endif + +#ifdef ENABLE_HR_MODE + if (encoder->frame_dms == LC3PLUS_FRAME_DURATION_10MS && + ((encoder->fs_in >= 44100 && setup->targetBytes >= 100) || + (encoder->fs_in == 32000 && setup->targetBytes >= 81)) + && setup->targetBytes < 340 + && (encoder->hrmode == 0)) +#else + if (encoder->frame_dms == LC3PLUS_FRAME_DURATION_10MS && + ((encoder->fs_in >= 44100 && setup->targetBytes >= 100) || + (encoder->fs_in == 32000 && setup->targetBytes >= 81)) + && setup->targetBytes < 340 + ) +#endif + { + setup->attack_handling = 1; + } + else if (encoder->frame_dms == LC3PLUS_FRAME_DURATION_7p5MS && ((encoder->fs_in >= 44100 && setup->targetBytes >= 75) || + (encoder->fs_in == 32000 && setup->targetBytes >= 61)) && setup->targetBytes < 150 +#ifdef ENABLE_HR_MODE + && encoder->hrmode == 0 +#endif + ) + { + setup->attack_handling = 1; + } + else + { + /* reset attack detector for bitrate switching */ + setup->attack_handling = 0; + setup->attdec_filter_mem[0] = 0; + setup->attdec_filter_mem[1] = 0; + setup->attdec_detected = 0; + setup->attdec_position = 0; + setup->attdec_acc_energy = 0; + setup->attdec_scaling = 0; + } + +#ifdef ENABLE_HR_MODE + if (encoder->hrmode) + { + setup->ltpf_enable = 0; + } +#endif + encoder->sns_damping = SNS_DAMPING; + +#ifdef ENABLE_HR_MODE + IF (encoder->hrmode) + { + encoder->sns_damping = SNS_DAMPING_HRMODE; + IF (encoder->fs_idx >= 4) + { + IF ((encoder->frame_dms == LC3PLUS_FRAME_DURATION_10MS) & (setup->total_bits > 4400)) + { + encoder->sns_damping = SNS_DAMPING_HRMODE_UB_10MS; + } + IF ((encoder->frame_dms == LC3PLUS_FRAME_DURATION_7p5MS) & (setup->total_bits > 3300)) + { + encoder->sns_damping = SNS_DAMPING_HRMODE_UB_7_5MS; + } + IF ((encoder->frame_dms == LC3PLUS_FRAME_DURATION_5MS) & (setup->total_bits > 2300)) + { + encoder->sns_damping = SNS_DAMPING_HRMODE_UB_5MS; + } + IF ((encoder->frame_dms == LC3PLUS_FRAME_DURATION_2p5MS) & (setup->total_bits > 1150)) + { + encoder->sns_damping = SNS_DAMPING_HRMODE_UB_2_5MS; + } + } + } + + if (encoder->hrmode && encoder->fs_idx >= 4) + { + int real_rate = setup->targetBytes * 8 * 10000 / (encoder->frame_dms * 1.25 * 10); + setup->regBits = real_rate / 12500; + + if (encoder->fs_idx == 5) + { + if (encoder->frame_dms == LC3PLUS_FRAME_DURATION_10MS) + { + setup->regBits += 2; + } + if (encoder->frame_dms == LC3PLUS_FRAME_DURATION_7p5MS) + { + setup->regBits +=1; + } + if (encoder->frame_dms == LC3PLUS_FRAME_DURATION_2p5MS) + { + setup->regBits -= 6; + } + } + else + { + if (encoder->frame_dms == LC3PLUS_FRAME_DURATION_2p5MS) + { + setup->regBits -= 6; + } + else if (encoder->frame_dms == LC3PLUS_FRAME_DURATION_5MS) + { + setup->regBits += 0; + } + if (encoder->frame_dms == LC3PLUS_FRAME_DURATION_7p5MS) + { + setup->regBits +=2; + } + if (encoder->frame_dms == LC3PLUS_FRAME_DURATION_10MS) + { + setup->regBits += 5; + } + } + + + if (setup->regBits < 6) + { + setup->regBits = 6; + } + if (setup->regBits > 23) + { + setup->regBits = 23; + } + } + else + { + setup->regBits = -1; + } +#endif + } + + encoder->bitrate = bitrate; + + return LC3PLUS_OK; +} + diff --git a/lib_lc3plus/setup_enc_lc3plus.h b/lib_lc3plus/setup_enc_lc3plus.h new file mode 100644 index 0000000000000000000000000000000000000000..6fa08039d3781865927ad38d168cd4ea753a2eb9 --- /dev/null +++ b/lib_lc3plus/setup_enc_lc3plus.h @@ -0,0 +1,136 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#ifndef SETUP_ENC_LC3_H +#define SETUP_ENC_LC3_H + +#include "options.h" +#include "wmc_auto.h" +#include "constants.h" + +/* Channel state and bitrate-derived values go in this struct */ +typedef struct +{ +#ifdef ENABLE_HR_MODE + Word32 *stEnc_mdct_mem; /* MDCT_MEM_LEN_MAX */ +#else + Word16 *stEnc_mdct_mem; /* MDCT_MEM_LEN_MAX */ +#endif + Word32 *mdct_mem32; /* MDCT_MEM_LEN_MAX */ + Word32 targetBitsOff; + Word16 targetBytes; + Word16 total_bits; + Word16 targetBitsInit; + Word16 targetBitsAri; + Word16 enable_lpc_weighting; + Word16 ltpf_enable; + Word16 quantizedGainOff; + Word16 tns_bits; + Word16 targetBitsQuant; + Word16 olpa_mem_s6k4_exp; + Word16 olpa_mem_pitch; + Word16 pitch_flag; + Word16 ltpf_mem_in_exp; + Word16 ltpf_mem_normcorr[LEN_MEM_NORMCORR]; + Word16 ltpf_mem_mem_normcorr; + Word16 ltpf_mem_ltpf_on; + Word16 ltpf_mem_pitch; +#ifdef FIX_TX_RX_STRUCT_STEREO + Word16 Tx_ltpf; +#endif + Word16 mem_targetBits; + Word16 mem_specBits; + Word16 x_exp; + Word16 resamp_exp; + Word16 attack_handling; /* flag to enable attack handling */ + Word16 attdec_filter_mem[2]; + Word16 attdec_detected; + Word16 attdec_position; + Word32 attdec_acc_energy; + Word16 attdec_scaling; +#ifdef ENABLE_HR_MODE + Word16 regBits; + Word32 resamp_mem32[120]; +#else + Word32 resamp_mem32[60]; +#endif +#ifdef ENABLE_HR_MODE + Word16 r12k8_mem_in[120]; +#else + Word16 r12k8_mem_in[60]; +#endif + Word32 r12k8_mem_50[2]; + Word16 r12k8_mem_out[44]; + Word16 olpa_mem_s12k8[3]; + Word16 olpa_mem_s6k4[LEN_6K4 + MAX_PITCH_6K4 + 16]; + Word16 ltpf_mem_in[LTPF_MEMIN_LEN + LEN_12K8 + 1]; + Word16 n_pccw; + Word16 n_pc; + + Word16 lfe; +} EncSetup; + +/* Constants and sampling rate derived values go in this struct */ +struct LC3PLUS_Enc +{ + EncSetup *channel_setup[MAX_CHANNELS]; +#ifdef ENABLE_HR_MODE + const Word32 *W_fx; +#else + const Word16 *W_fx; +#endif + const Word16 *bands_offset; + + Word32 fs; /* encoder sampling rate 44.1 -> 48 */ + Word32 fs_in; /* input sampling rate */ + Word32 bitrate; /* global bitrate */ + Word16 fs_idx; /* sampling rate index */ + Word16 frame_length; /* audio samples / frame */ + Word16 channels; /* number of channels */ + Word16 epmode; /* error protection mode */ + LC3PLUS_FrameDuration frame_dms; /* enum for frame length in steps of 12.5 dms */ + Word8 lc3_br_set; /* indicate if bitrate has been set */ + + Word16 yLen; + Word16 W_size; + Word16 la_zeroes; + Word16 stEnc_mdct_mem_len; + Word16 bands_number; + Word16 nSubdivisions; + Word16 ltpf_mem_in_len; + Word16 envelope_bits; + Word16 global_gain_bits; + Word16 noise_fac_bits; + Word16 BW_cutoff_bits; + Word16 r12k8_mem_in_len; + Word16 r12k8_mem_out_len; + Word16 near_nyquist_index; + Word16 near_nyquist_flag; + + Word16 epmr; + Word16 combined_channel_coding; + Word32 bandwidth; + Word32 bandwidth_preset; + Word32 bw_ctrl_active; + Word16 bw_ctrl_cutoff_bin; + Word16 bw_index; + Word16 attdec_nblocks; + Word16 attdec_damping; + Word16 attdec_hangover_thresh; + Word16 hrmode; + Word16 sns_damping; +#ifdef CR9_C_ADD_1p25MS +#ifndef FIX_TX_RX_STRUCT_STEREO + Word16 Tx_ltpf; +#endif + Word16 LT_normcorr; +#endif +}; + +#endif /* SETUP_ENC_LC3_H */ diff --git a/lib_lc3plus/sns_compute_scf_fx.c b/lib_lc3plus/sns_compute_scf_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..a95e3e7720464369fbeba1ac8009f1db4aa3f105 --- /dev/null +++ b/lib_lc3plus/sns_compute_scf_fx.c @@ -0,0 +1,609 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +#ifdef CR9_C_ADD_1p25MS +static Word32 limitShaping (Word32* d3_fx) { + Word32 score = L_shl_pos(L_sub(d3_fx[0], d3_fx[1]), 1); + score = L_add(score, L_sub(d3_fx[0], d3_fx[2])); + score = L_shr_pos(score, 1); + + score = L_max(L_min(score, 536870912), 335544320); /* 5*2^26 and 8*2^26 */ + + score = L_sub(536870912, score); /* 8 - score */ + + score = L_shr_pos(Mpy_32_16_lc3plus(score, 7646), 0); /* 7646 = 0.7/3 * 2^15 */ + + score = L_add(score, 20132660); /* +0.3*2^26 */ + + score = L_shl_sat(score, 5); /* Bring score into Q31 Format for Mpy32_16() */ + /* Alex: Changed from L_shl_pos to L_shl_sat */ + + return score; +} +#endif + + +#ifdef FIX_SNS_BASOP_MEAN64_CALC +/*improved precision in mean64 accumulation will increase min SNR by 15 dB */ +/* output is max energy band location [0 ... 63] */ +static Word16 sns_compute_mean64_ip(Word32 *en_fx_m, Word16 * en_fx_exp, Word32 *L_mean64_fx, Word16* mean64_fx_exp, Word32* L_en_upd_fx, Word16* en_upd_fx_exp ) +{ + Word32 i,L_tmp; + Word16 tmp, max_exp; + + /* maximize all exponents and mantissas , except for zero mantissas */ + max_exp = -128; move16(); + FOR (i = 0; i < 64; i++) + { + tmp = norm_l(en_fx_m[i]); + + L_en_upd_fx[i] = L_shl_pos(en_fx_m[i], tmp); /* factor 1/64 __NOT__ applied here */ + en_upd_fx_exp[i] = sub(en_fx_exp[i], tmp); + + if (L_en_upd_fx[i] == 0) + { + en_upd_fx_exp[i] = 0; move16();/* all zero mantissa --> correct max_exp */ + } + + max_exp = s_max(max_exp, en_upd_fx_exp[i]); + + } + + L_tmp = L_deposit_l(0); + + /* sum up at max_exp + 6 for 1/64 */ + Word16 glob_shift = add(max_exp, 6); /* add div by 64 , as margin */ + + glob_shift = s_max(glob_shift, -31); + + for (i = 0; i < 64; i++) + { + tmp = s_min(31, sub(glob_shift, en_upd_fx_exp[i])); /* right shift including 1/64 can become larger than 31 */ + L_tmp = L_add(L_tmp, L_shr(L_en_upd_fx[i], tmp)); + } + + //double mean64_m = round(mean64 * pow(2.0, 31.0-(double)max_exp)); /* dbg */ + //double mean64_new = (double)L_tmp * pow(2.0, (double)max_exp - 31.0); + + *L_mean64_fx = L_tmp; + *mean64_fx_exp = max_exp; + + return -1; + +} +#endif + + +void processSnsComputeScf_fx(Word32 *d2_fx, Word16 d2_fx_exp, Word16 fs_idx, Word16 n_bands, Word16 *scf, + Word16 scf_smoothing_enabled, Word16 attdec_damping_factor, Word8 *scratchBuffer, Word16 sns_damping +#ifdef CR9_C_ADD_1p25MS + , LC3PLUS_FrameDuration frame_dms, Word16 norm_corr, Word16 *LT_normcorr +#endif + ) +{ + Dyn_Mem_Deluxe_In( + Word16 i, s, s2, nf, tmp; + Word32 L_mean, L_tmp; + Word32 *d3_fx; + Word16 *d3_fx_exp; + Word16 *d4_fx; + Word16 *scf_smooth; + ); + + UNUSED(attdec_damping_factor); + + d3_fx = scratchAlign(scratchBuffer, 0); /* Size = 4 * MAX_BANDS_NUMBER = 256 bytes */ + d3_fx_exp = scratchAlign(d3_fx, sizeof(*d3_fx) * MAX_BANDS_NUMBER); /* Size = 2 * MAX_BANDS_NUMBER = 128 bytes */ + d4_fx = scratchAlign(d3_fx_exp, sizeof(*d3_fx_exp) * MAX_BANDS_NUMBER); /* Size = 2 * MAX_BANDS_NUMBER = 128bytes */ + scf_smooth = scratchAlign(d4_fx, sizeof(*d4_fx) * MAX_BANDS_NUMBER); /* Size = 2 * 16 */ + + const Word16 *preemp; + const Word16 *preemp_e; +#ifdef CR9_C_ADD_1p25MS + Word16 *pre_em_buf; + Word16 *pre_em_buf_e; + + if (frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) { + pre_em_buf = scratchAlign(scf_smooth, sizeof(*pre_em_buf) * MAX_BANDS_NUMBER); + pre_em_buf_e = scratchAlign(pre_em_buf, sizeof(*pre_em_buf_e) * MAX_BANDS_NUMBER); + } + + Word32 limiterGain = 0x7FFFFFFF; /* 1.0f */ + Word16 ncorr_fac = 0; + +#ifdef FIX_SNS_BASOP_MEAN64_CALC + Word32 L_d5_fx[64], L_mean_ip = 1; + Word16 d5_fx_exp[64], mean_ip_exp = 0; +#endif +#endif + +/* Smoothing and Pre-emphasis */ + IF (sub(n_bands, 32) < 0) + { + L_tmp = sub(32, n_bands); + FOR (i = sub(n_bands, 1); i >= L_tmp; i--) + { + d2_fx[(i + L_tmp) * 2 + 1] = d2_fx[i]; move32(); + d2_fx[(i + L_tmp) * 2 + 0] = d2_fx[i]; move32(); + } + FOR (i = sub(L_tmp, 1); i >= 0; i--) + { + d2_fx[i * 4 + 3] = d2_fx[i]; move32(); + d2_fx[i * 4 + 2] = d2_fx[i]; move32(); + d2_fx[i * 4 + 1] = d2_fx[i]; move32(); + d2_fx[i * 4 + 0] = d2_fx[i]; move32(); + } + n_bands = 64; move16(); + } + ELSE + IF (sub(n_bands, 64) < 0) + { + L_tmp = sub(64, n_bands); + FOR (i = sub(n_bands, 1); i >= L_tmp; i--) + { + d2_fx[i + L_tmp] = d2_fx[i]; move32(); + } + FOR (i = sub(L_tmp, 1); i >= 0; i--) + { + d2_fx[i * 2 + 1] = d2_fx[i]; move32(); + d2_fx[i * 2 + 0] = d2_fx[i]; move32(); + } + n_bands = 64; move16(); + } + +#ifdef CR9_C_ADD_1p25MS + /* calc long termn normcorr */ + if (frame_dms == LC3PLUS_FRAME_DURATION_1p25MS && lpc_pre_adapt_emphasis[fs_idx] != NULL) { +#ifdef FIX_BASOP_LT_NORMCORR_AR1 + #ifdef ER_DEBUG + Word16 LT_normcorr_mem = *LT_normcorr; + #endif + L_tmp = L_mult0(1, norm_corr); /* 1/8 */ + L_tmp = L_mac0(L_tmp, 7, *LT_normcorr); /* 7/8 */ + *LT_normcorr = round_fx(L_shl_pos(L_tmp, 16 - 3) ); + assert(*LT_normcorr >= 0); + + /* ncorr_fac = max(*LT_normcorr - 0.8, 0) * 5 */ + /* improved precision of n_corr_fac esp. close to the 0.8 border */ + L_tmp = L_mult0(*LT_normcorr, 5 * (1L << (15 - 3))); /* work in the 5 * upscaled domain from start */ + L_tmp = L_sub(L_tmp, 4 * (1L << ((15 - 3) + 15))); /* sub by 0.8 , limit now exactly 0.8 */ + L_tmp = L_max(L_tmp, 0L); + ncorr_fac = round_fx(L_shl(L_tmp, 4)); /* extract in Q15 */ + + #ifdef ER_DEBUG + LT_normcorr_mem = add(mult(LT_normcorr_mem, 28672), mult(norm_corr, 4096)); + Word16 ncorr_fac_orig = i_mult(s_max(sub(LT_normcorr_mem, 26214), 0), 5); + UNUSED(ncorr_fac_orig); + #endif +#else + /* LT_normcorr * (1-0.125) + normcorr * 0.125 */ + *LT_normcorr = add(mult(*LT_normcorr,28672), mult(norm_corr,4096)); + /* ncorr_fac = max(LT_normcorr - 0.8, 0) * 5 */ + ncorr_fac = i_mult(s_max(sub(*LT_normcorr, 26214), 0), 5); +#endif + + if (ncorr_fac == 0) + { + preemp = lpc_pre_emphasis[fs_idx]; + preemp_e = lpc_pre_emphasis_e[fs_idx]; + } else { + FOR (i = 0; i < n_bands; i++) { + assert (lpc_pre_adapt_emphasis_e[fs_idx][i]>= lpc_pre_emphasis_e[fs_idx][i]); + assert((((Word16)lpc_pre_adapt_emphasis_e[fs_idx][i]) + 1) <= 255); /*check Word8 storage */ + assert((((Word16)lpc_pre_adapt_emphasis_e[fs_idx][i]) + 1) >= -256); /*check Word8 storage */ +#ifdef FIX_BASOP_PREEMPH_CALC + /* FLT sns_preemph_new[i] = (sns_preemph[i] + fac * sns_preemph_adapt[i]); */ + /* BASOP MantNew[i]*2^expNew[i] = (Mant16A[i]*2^expA[i] + facQ15 * Mant16B^expB[i]); */ + /*determine downscaling factor for the base part */ + Word16 tmp_shift = sub(lpc_pre_adapt_emphasis_e[fs_idx][i], lpc_pre_emphasis_e[fs_idx][i]); + Word16 shift_factor = shr_pos(-32768, tmp_shift); /* mantissa downshift impl. as multiplication on the negative side */ + + /*Add scaled mantissas in the same Q but 1 bit rightshifted(for 1 bit WC addition margin) */ + L_tmp = L_mult0(lpc_pre_adapt_emphasis[fs_idx][i], ncorr_fac); /* Qx*Q15 --> Qx, 1 additional bit margin created with Mult0 */ + L_tmp = L_msu0(L_tmp, lpc_pre_emphasis[fs_idx][i], shift_factor ); /* shift_dactor is negative, Msu0 will lead to addition */ + + tmp = norm_l(L_tmp); + pre_em_buf[i] = round_fx_sat(L_shl_pos(L_tmp, tmp)); /* maximize mantissa and apply round */ /* sat needed due to warning due to RND additio of 0.5 */ + + tmp = sub(tmp, add(tmp_shift, 1)); ; + pre_em_buf_e[i] = sub(lpc_pre_emphasis_e[fs_idx][i], tmp); /* adjust final exponent due to mantissa upshift and addition margin */ + + /* sum ~10 ops, but increased precision, and a maintained maximized mantissa */ + +#else + pre_em_buf_e[i] = lpc_pre_adapt_emphasis_e[fs_idx][i] + 1; + Word16 tmp_s = lpc_pre_adapt_emphasis_e[fs_idx][i] - lpc_pre_emphasis_e[fs_idx][i]; + Word16 tmp_v = mult(lpc_pre_adapt_emphasis[fs_idx][i], ncorr_fac); + pre_em_buf[i] = add(shr(lpc_pre_emphasis[fs_idx][i], (tmp_s+1)), shr(tmp_v,1)); +#endif + } + preemp = pre_em_buf; + preemp_e = pre_em_buf_e; + } + } else { + preemp = lpc_pre_emphasis[fs_idx]; + preemp_e = lpc_pre_emphasis_e[fs_idx]; + } +#else + preemp = lpc_pre_emphasis[fs_idx]; + preemp_e = lpc_pre_emphasis_e[fs_idx]; +#endif + + L_tmp = L_add(Mpy_32_16_lc3plus(d2_fx[0], 24576), L_shr_pos(d2_fx[1], 2)); + d3_fx[0] = Mpy_32_16_lc3plus(L_tmp, preemp[0]); move32(); + d3_fx_exp[0] = add(d2_fx_exp, preemp_e[0]); move16(); + FOR (i = 1; i < n_bands - 1; i++) + { + L_tmp = L_add(L_shr_pos(d2_fx[i], 1), L_add(L_shr_pos(d2_fx[i - 1], 2), L_shr_pos(d2_fx[i + 1], 2))); + d3_fx[i] = Mpy_32_16_lc3plus(L_tmp, preemp[i]); move32(); + d3_fx_exp[i] = add(d2_fx_exp, preemp_e[i]); move16(); + } + L_tmp = L_add(Mpy_32_16_lc3plus(d2_fx[n_bands - 1], 24576), L_shr_pos(d2_fx[n_bands - 2], 2)); + d3_fx[n_bands - 1] = Mpy_32_16_lc3plus(L_tmp, preemp[n_bands - 1]); move32(); + d3_fx_exp[n_bands - 1] = add(d2_fx_exp, preemp_e[n_bands - 1]); move16(); + + /* Mean */ + s = d3_fx_exp[MAX_BANDS_NUMBER - 1]; + s2 = add(s, 6); + + L_mean = L_shr(d3_fx[0], sub(s2, d3_fx_exp[0])); + FOR (i = 1; i < MAX_BANDS_NUMBER; i++) + { + L_mean = L_add(L_mean, L_shr(d3_fx[i], sub(s2, d3_fx_exp[i]))); + } + +#ifdef FIX_SNS_BASOP_MEAN64_CALC + IF(frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) + { + /* improved precision in mean64 accumulation will increase minimum SNR vs FLT by 15 dB */ + Word16 max_loc = sns_compute_mean64_ip(&d3_fx[0], &d3_fx_exp[0], &L_mean_ip, &mean_ip_exp, &L_d5_fx[0], &d5_fx_exp[0]); /*ToDo::inplace update d3_fx, d3_fx_exp */ + /* high precision accumluation , divides all entries in d_fx by 1/64 */ + UNUSED(max_loc); + +#ifdef ER_DEBUG + //float mean64new_fx_fl = (((double)L_mean_ip))*pow(2.0, (double)mean_ip_exp - 31); + Word16 d3_max_log2 = BASOP_Util_Log2_16(d3_fx[max_loc], d3_fx_exp[max_loc]); + double d3_maxlog2_dbl = (double)d3_max_log2 / 512.0; + UNUSED(d3_maxlog2_dbl); +#endif + +#ifdef ER_DEBUG + if (d3_fx[max_loc] != 0) /* max_loc is -1 when not debugging */ +#endif + { /* maximize the q in the coming log2 function call */ + + basop_memcpy(d3_fx, L_d5_fx, 64 * sizeof(Word32)); /* use upscaled mantissa values */ + + basop_memcpy(d3_fx_exp, d5_fx_exp, 64 * sizeof(Word16)); /* use corresponding exponents values */ + +#ifdef ER_DEBUG + /* s,s2 are no longer valid in relation to the previous d3_fx */ + s = d3_fx_exp[max_loc]; + s2 = add(s, 6); /* div by 64 */ + + /* debug:: redo L_mean calc using new s, s2 and upscaled mantissa parameters */ + tmp = s_min(31, sub(s2, d3_fx_exp[0])); + L_mean = L_shr_pos(d3_fx[0], tmp); + FOR(i = 1; i < MAX_BANDS_NUMBER; i++) + { + tmp = s_min(31, sub(s2, d3_fx_exp[i])); + L_mean = L_add(L_mean, L_shr_pos(d3_fx[i], tmp)); + } +#endif + } + } +#endif + +#ifdef ER_DEBUG + if ((dbgflag("r") || dbgflag("ru")) && scratch->max_scratch_calculation_only == 0) + { + double sns64_fx_fl_all[64]; + double sns64_fx_fl_all_log2[64]; /* find range of smoothed input signal */ + + double sns64_fx_fl_opt_all[64]; + double sns64_fx_fl_opt_all_log2[64]; /* find range of smoothed input signal */ + + Word32 d3_opt_fx[64]; + Word16 d3_opt_fx_exp[64]; + float fl_mean64, fl_mean64_m, fl_mean64_e; + float L_mean_fx_fl; + float fl_mean64_recalc; + + UNUSED(sns64_fx_fl_opt_all); + UNUSED(sns64_fx_fl_opt_all_log2); + UNUSED(sns64_fx_fl_all_log2); + UNUSED(sns64_fx_fl_all); + + + UNUSED(fl_mean64_m); + UNUSED(fl_mean64_e); + + dbgread(&fl_mean64, sizeof(fl_mean64), 1, "..//..//..//fl_x_mean64.float.1.dat"); + +#ifdef FIX_SNS_BASOP_MEAN64_CALC + float mean64new_fx_fl = (((double)L_mean_ip))*pow(2.0, (double)mean_ip_exp - 31); + + snr_diff(&mean64new_fx_fl, &fl_mean64, 1, 0, "SNRc4b_x_mean64ip_FXvsFL"); + +#endif + + fl_mean64_e = s; + fl_mean64_m = fl_mean64 * pow(2.0, 31.0 -(double)fl_mean64_e ); + + + fl_mean64_recalc = 0.0; + for (int i = 0; i < 64; i++) + { + sns64_fx_fl_all[i] = (double)d3_fx[i] * pow(2.0, (double)d3_fx_exp[i] - 31.0); + sns64_fx_fl_all_log2[i] = log2(sns64_fx_fl_all[i]); + fl_mean64_recalc += sns64_fx_fl_all[i]; + + int tmp_up = norm_l(d3_fx[i]); + d3_opt_fx[i] = L_shl_pos(d3_fx[i], tmp_up); + d3_opt_fx_exp[i] = sub(d3_fx_exp[i], tmp_up); + + sns64_fx_fl_opt_all[i] = (double)d3_opt_fx[i] * pow(2.0, (double)d3_opt_fx_exp[i] - 31.0); + sns64_fx_fl_opt_all_log2[i] = log2(sns64_fx_fl_all[i]); + } + + + + fl_mean64_recalc /= 64.0; /* downscaling by 1/64 already applied */ + + L_mean_fx_fl = (((double)L_mean))*pow(2.0, (double)s - 31.0); + snr_diff(&L_mean_fx_fl, &fl_mean64, 1, 0, "SNRc4b_x_mean64_FXvsFL"); + + snr_diff(&fl_mean64_recalc, &fl_mean64, 1, 0, "SNRc4b_x_mean64recalc_FXvsFL"); /* 15 dB better !! */ + + + if (dbgflag("ru")) + { +#ifdef FIX_SNS_BASOP_MEAN64_CALC + L_mean = round(fl_mean64*pow(2.0, 31 - mean_ip_exp)); + assert(fabs(fl_mean64*pow(2.0, 31 - mean_ip_exp)) <= (double)INT32_MAX); +#else + L_mean = round(fl_mean64*pow(2.0, 31 - s)); + assert(fabs(fl_mean64*pow(2.0, 31 - s)) <= (double)INT32_MAX); +#endif + + } + } +#endif + +#ifdef FIX_SNS_BASOP_NF_APPL + IF(frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) + { +#ifdef ER_DEBUG + Word16 nf_post = BASOP_Util_Log2_16(L_mean_ip, mean_ip_exp); + nf_post = sub(s_max(nf_post, -25965), 6803); /* log2(-25965)- log2(6803) --> -50.7 -13.28 => -64.00 in Q9 */ + /*if nf > -50.7 nf is applied by subtracting 2^-13.28 9996 */ +#endif + + /* calulate the nf level in W32 before going to the less exact log2() W16 domain */ + Word16 tmp_nf = norm_l(L_mean_ip); + Word32 L_nf_fx = L_shl_pos(L_mean_ip, tmp_nf); /* shift up 1/64 to maximize mantissa */ + + L_nf_fx = Mpy_32_16_lc3plus(L_nf_fx, 26844); /* 26844=round(2^13/10000) */ + Word16 nf_fx_exp = sub(mean_ip_exp, add(13, tmp_nf)); /* division by 10000.0 as L_mant = L_mant*(2^13/10000), nf_exp=mean_exp-13 */ + + nf = BASOP_Util_Log2_16(L_nf_fx, nf_fx_exp); /* log2_16 function ouput is in Q9 , range is values [-64.xxx to 63.xxxx] */ + +#ifdef ER_DEBUG + /* all zero input will get nf of -32768 */ + if (L_mean_ip == 0) + { + assert(nf == -32768); + } +#endif + + } + ELSE + { /* 2.5ms ... 10ms (nf is at approximated at 1/9998 below mean) */ + nf = BASOP_Util_Log2_16(L_mean, s); + nf = sub(s_max(nf, -25965), 6803); + } +#else + nf = BASOP_Util_Log2_16(L_mean, s); + nf = sub(s_max(nf, -25965), 6803); +#endif + + +/* Log-domain */ + FOR (i = 0; i < MAX_BANDS_NUMBER; i++) + { + d4_fx[i] = s_max(nf, BASOP_Util_Log2_16(d3_fx[i], d3_fx_exp[i])); move16(); + } + + /* Downsampling */ + L_tmp = L_mult(d4_fx[0], 8192); + L_tmp = L_mac(L_tmp, d4_fx[1], 8192); + L_tmp = L_mac(L_tmp, d4_fx[2], 8192); + L_tmp = L_mac(L_tmp, d4_fx[3], 5461); + d3_fx[0] = L_mac(L_tmp, d4_fx[4], 2731); move32(); + FOR (i = 1; i < M - 1; i++) + { + L_tmp = L_mult(d4_fx[i * 4 - 1], 2731); + L_tmp = L_mac(L_tmp, d4_fx[i * 4 + 0], 5461); + L_tmp = L_mac(L_tmp, d4_fx[i * 4 + 1], 8192); + L_tmp = L_mac(L_tmp, d4_fx[i * 4 + 2], 8192); + L_tmp = L_mac(L_tmp, d4_fx[i * 4 + 3], 5461); + d3_fx[i] = L_mac(L_tmp, d4_fx[i * 4 + 4], 2731); move32(); + } + L_tmp = L_mult(d4_fx[59], 2731); + L_tmp = L_mac(L_tmp, d4_fx[60], 5461); + L_tmp = L_mac(L_tmp, d4_fx[61], 8192); + L_tmp = L_mac(L_tmp, d4_fx[62], 8192); + d3_fx[M - 1] = L_mac(L_tmp, d4_fx[63], 8192); move32(); + +#if defined (CR9_C_ADD_1p25MS) + /* limit shaping */ + IF (frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) { + limiterGain = limitShaping(d3_fx); + } +#endif + +/* Remove mean and scaling */ + L_mean = L_shr_pos(d3_fx[0], 4); + FOR (i = 1; i < M; i++) + { + L_mean = L_add(L_mean, L_shr_pos(d3_fx[i], 4)); + } + +#ifdef FIX_SNS_BASOP_MEAN16_APPLY + Word16 limGainDamping = 0; + Word16 up_shift = 0, dn_shift = 0; + + IF(frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) + { + up_shift = 31; move16(); + + FOR(i = 0; i < M; i++) + { + L_tmp = L_sub(d3_fx[i], L_mean); + up_shift = s_min(norm_l(L_tmp), up_shift); + d3_fx[i + M] = L_tmp; move32(); /* store mean removed variable */ + } + dn_shift = s_max(0, sub(up_shift, 1)); /* conditional downshift from q10 to Q11, to maintain precision */ + + limGainDamping = round_fx(Mpy_32_16_lc3plus(limiterGain, sns_damping)); + } +#endif + + FOR (i = 0; i < M; i++) + { +#if defined (CR9_C_ADD_1p25MS) + if (frame_dms == LC3PLUS_FRAME_DURATION_1p25MS) + { +#ifdef FIX_SNS_BASOP_MEAN16_APPLY + /* maximize precision */ + L_tmp = Mpy_32_16_lc3plus(L_shl_pos(d3_fx[i + M], up_shift), limGainDamping ); + scf[i] = round_fx(L_shr_pos(L_tmp, dn_shift)); +#else + scf[i] = mult_r(extract_h(Mpy_32_16_lc3plus(limiterGain, sns_damping)), round_fx(L_shl_pos(L_sub(d3_fx[i], L_mean), 1))); +#endif + move16(); + } else { + scf[i] = mult_r(sns_damping, round_fx(L_shl_pos(L_sub(d3_fx[i], L_mean), 1))); + move16(); + } +#else + scf[i] = mult_r(sns_damping, round_fx(L_shl_pos(L_sub(d3_fx[i], L_mean), 1))); + move16(); +#endif + } + + /* scale factor smoothing */ + #ifdef CR9_C_ADD_1p25MS_LRSNS + test(); test(); + IF( (scf_smoothing_enabled != 0 ) || (sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0) ) + #else + IF (scf_smoothing_enabled) + #endif + { + #ifdef CR9_C_ADD_1p25MS_LRSNS + IF(sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0) + { + +#define A0Q15 6144 /* 0.1875 */ +#define A1Q15 (32768 - 2 * A0Q15) /* 0.675 */ +#define A2Q15 A0Q15 /* 0.1875 */ + + L_tmp = L_mult0(scf[0], A0Q15 >> 1); + L_tmp = L_mac0(L_tmp, scf[1], A0Q15 >> 1);/*incl a mult by 0.5)*/ /* a virtual scf[-1]*.1875 created */ + L_tmp = L_mac0(L_tmp, scf[0], A1Q15); /*scf[0] * .675 */ + L_tmp = L_mac0(L_tmp, scf[1], A2Q15); /*scf[1] * .1875 */ + L_tmp = L_add(L_tmp, L_tmp); /* added to realize one upshift due to margin created by mac0 */ + + scf_smooth[0] = round_fx(L_tmp); + L_mean = L_deposit_l(scf_smooth[0]); + + FOR(i = 1; i < M - 1; i++) + { /* normal unity gain three tap FIR filter */ + L_tmp = L_mult0(scf[i - 1], A0Q15); /*Q(11+16+1) Q26 */ + L_tmp = L_mac0(L_tmp, scf[i], A1Q15); + L_tmp = L_mac0(L_tmp, scf[i + 1], A2Q15); + L_tmp = L_add(L_tmp, L_tmp); /* added to realize one upshift due to margin created by mac0 */ + scf_smooth[i] = round_fx(L_tmp); /* back to Q11 */ + L_mean = L_add(L_mean, L_deposit_l(scf_smooth[i])); /* mean accumulated on the low side */ + } + + /* final coeff */ + L_tmp = L_mult0(scf[M - 2], A2Q15); /* .1875*/ + L_tmp = L_mac0(L_tmp, scf[M - 1], A1Q15); /* .675 */ + L_tmp = L_mac0(L_tmp, scf[M - 2], A0Q15 >> 1); /* now the final virtual scf[M]*.1875 */ + L_tmp = L_mac0(L_tmp, scf[M - 1], A0Q15 >> 1); + L_tmp = L_add(L_tmp, L_tmp); /* added to realize one upshift due to margin created by mac0 */ + scf_smooth[M - 1] = round_fx(L_tmp); + + L_mean = L_add(L_mean, L_deposit_l(scf_smooth[M - 1])); + + L_mean = L_shr(L_add(L_mean, 1L << (4 - 1)), 4); /* excplicit rounding in the 1/M = 0.1625 application */ + } + ELSE IF(sub(scf_smoothing_enabled, 1) == 0) + { /* legacy smoothing logic */ +#endif + scf_smooth[0] = L_shr(L_mult0(L_add(L_add(scf[0], scf[1]), scf[2]), 10923), 15); + L_mean = scf_smooth[0]; move16(); + scf_smooth[1] = L_shr(L_add(L_add(L_add(scf[0], scf[1]), scf[2]), scf[3]), 2); + L_mean = L_add(L_mean, scf_smooth[1]); + FOR (i = 2; i < M - 2; i++) + { + L_tmp = L_add(L_add(L_add(L_add(scf[i - 2], scf[i - 1]), scf[i]), scf[i + 1]), scf[i + 2]); + tmp = norm_s(L_shr(L_abs(L_tmp), 15)); + if (tmp > 0) { + tmp = sub(16, tmp); + L_tmp = L_shr(L_tmp, tmp); + } + scf_smooth[i] = L_shr(L_mult0(L_tmp, 13107), sub(16, tmp)); + L_mean = L_add(L_mean, scf_smooth[i]); + } + scf_smooth[M - 2] = L_shr(L_add(L_add(L_add(scf[M - 4], scf[M - 3]), scf[M - 2]), scf[M - 1]), 2); + L_mean = L_add(L_mean, scf_smooth[M - 2]); + scf_smooth[M - 1] = L_shr(L_mult0(L_add(L_add(scf[M - 3], scf[M - 2]), scf[M - 1]), 10923), 15); + L_mean = L_add(L_mean, scf_smooth[M - 1]); + + L_mean = L_shr(L_mean, 4); + + + #ifdef CR9_C_ADD_1p25MS_LRSNS + } + #endif + + #ifdef CR9_C_ADD_1p25MS_LRSNS + IF(sub(frame_dms, LC3PLUS_FRAME_DURATION_1p25MS) == 0) + { + ASSERT(L_mean <= 32767L && L_mean >= -32768L); + Word16 mean = extract_l(L_mean); + FOR(i = 0; i < M; i++) + { + scf[i] = sub(scf_smooth[i], mean); /* only mean subtraction required, no damping/scaling */ + } + } + ELSE + { + FOR(i = 0; i < M; i++) + { + scf[i] = mult_r(attdec_damping_factor, sub(scf_smooth[i], L_mean)); + } + } +#else + FOR (i = 0; i < M; i++) + { + scf[i] = mult_r(attdec_damping_factor, sub(scf_smooth[i], L_mean)); + } + #endif + } + + Dyn_Mem_Deluxe_Out(); +} + diff --git a/lib_lc3plus/sns_interpolate_scf_fx.c b/lib_lc3plus/sns_interpolate_scf_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..89718af525569104ae38a99f6e1172e900b927e5 --- /dev/null +++ b/lib_lc3plus/sns_interpolate_scf_fx.c @@ -0,0 +1,156 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +void processSnsInterpolateScf_fx( +#ifdef ENABLE_HR_MODE + Word32 *scf_q, Word32 mdct_scf[], +#else + Word16 *scf_q, Word16 mdct_scf[], +#endif + Word16 mdct_scf_exp[], Word16 inv_scf, + Word16 n_bands, Word8 *scratchBuffer) +{ +#ifdef ENABLE_HR_MODE + Dyn_Mem_Deluxe_In( + Word32 i, tmp2; + Word32 *scf_int; + Word32 tmp; + Word32 *scf_tmp; + ); +#else + Dyn_Mem_Deluxe_In( + Word16 i, tmp2; + Word16 *scf_int; + Word16 tmp; + Word16 *scf_tmp; + ); +#endif + +#ifdef ENABLE_HR_MODE + scf_int = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * MAX_BANDS_NUMBER = 128 bytes */ + scf_tmp = (Word32 *)scratchAlign(scf_int, 4 * MAX_BANDS_NUMBER); /* 2 * MAX_BANDS_NUMBER = 128 bytes */ +#else + scf_int = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * MAX_BANDS_NUMBER = 128 bytes */ + scf_tmp = (Word16 *)scratchAlign(scf_int, 2 * MAX_BANDS_NUMBER); /* 2 * MAX_BANDS_NUMBER = 128 bytes */ +#endif + + /* Interpolation */ + scf_int[0] = scf_q[0]; + scf_int[1] = scf_q[0]; + FOR (i = 1; i < M; i++) + { +#ifdef ENABLE_HR_MODE + tmp = L_sub(scf_q[i], scf_q[i - 1]); + tmp2 = L_shr(tmp, 2); + tmp = L_shr(tmp, 3); + scf_int[i * 4 - 2] = L_add(scf_q[i - 1], tmp); + scf_int[i * 4 - 1] = L_add(scf_int[i * 4 - 2], tmp2); + scf_int[i * 4] = L_add(scf_int[i * 4 - 1], tmp2); + scf_int[i * 4 + 1] = L_add(scf_int[i * 4], tmp2); +#else + tmp = sub(scf_q[i], scf_q[i - 1]); + tmp2 = mult_r(tmp, 8192); + tmp = mult_r(tmp, 4096); + scf_int[i * 4 - 2] = add(scf_q[i - 1], tmp); + scf_int[i * 4 - 1] = add(scf_int[i * 4 - 2], tmp2); + scf_int[i * 4] = add(scf_int[i * 4 - 1], tmp2); + scf_int[i * 4 + 1] = add(scf_int[i * 4], tmp2); +#endif + } +#ifdef ENABLE_HR_MODE + scf_int[62] = L_add(scf_int[61], tmp2); + scf_int[63] = L_add(scf_int[62], tmp2); +#else + scf_int[62] = add(scf_int[61], tmp2); + scf_int[63] = add(scf_int[62], tmp2); +#endif + + /* 8 kHz mode for 2.5 ms */ + IF (sub(n_bands, 32) < 0) + { +#ifdef ENABLE_HR_MODE + basop_memmove(scf_tmp, scf_int, 64 * sizeof(Word32)); +#else + basop_memmove(scf_tmp, scf_int, 64 * sizeof(Word16)); +#endif + tmp = sub(32, n_bands); + FOR (i = 0; i < tmp; i++) + { +#ifdef ENABLE_HR_MODE + scf_int[i] = L_add(L_shr(L_add(scf_tmp[4 * i], scf_tmp[4 * i + 1]), 2), + L_shr(L_add(scf_tmp[4 * i + 2], scf_tmp[4 * i + 3]), 2)); +#else + /* 8192 = 0.25 * 2^15 */ + scf_int[i] = add(mac_r(L_mult(scf_tmp[4 * i], 8192), scf_tmp[4 * i + 1], 8192), + mac_r(L_mult(scf_tmp[4 * i + 2], 8192), scf_tmp[4 * i + 3], 8192)); +#endif + } + + FOR (i = 0; i < n_bands - tmp; i++) + { +#ifdef ENABLE_HR_MODE + scf_int[tmp + i] = L_shr(L_add(scf_tmp[4 * tmp + 2 * i], scf_tmp[4 * tmp + 2 * i + 1]), 1); +#else + scf_int[tmp + i] = mac_r(L_mult(scf_tmp[4 * tmp + 2 * i], 16384), scf_tmp[4 * tmp + 2 * i + 1], 16384); +#endif + } + } + ELSE + /* For 5ms */ + IF (sub(n_bands, 64) < 0) + { + tmp = sub(64, n_bands); + FOR (i = 0; i < tmp; i++) + { +#ifdef ENABLE_HR_MODE + scf_int[i] = L_shr(L_add(scf_int[2 * i], scf_int[2 * i + 1]), 1); +#else + scf_int[i] = mac_r(L_mult(scf_int[2 * i], 16384), scf_int[2 * i + 1], 16384); +#endif + } + FOR (; i < n_bands; i++) + { + scf_int[i] = scf_int[tmp + i]; move16(); + } +#ifdef ENABLE_HR_MODE + move16(); // 32 bit operations have twice the complexity weight of 16 bit operations +#endif + } + + /* Inversion at encoder-side*/ + IF (inv_scf == 1) + { + FOR (i = 0; i < n_bands; i++) + { +#ifdef ENABLE_HR_MODE + scf_int[i] = L_negate(scf_int[i]); +#else + scf_int[i] = negate(scf_int[i]); +#endif + } + } + +/* Linear Domain */ + FOR (i = 0; i < n_bands; i++) + { +#ifdef ENABLE_HR_MODE + /* scf_int is in Q26, BASOP_Util_InvLog2_pos requires Q25 data */ + mdct_scf[i] = BASOP_Util_InvLog2_pos(L_shr(scf_int[i], 1), &mdct_scf_exp[i]); +#else + mdct_scf[i] = BASOP_Util_InvLog2_16(scf_int[i], &mdct_scf_exp[i]); +#endif + } + + Dyn_Mem_Deluxe_Out(); +} + diff --git a/lib_lc3plus/sns_quantize_scf_fx.c b/lib_lc3plus/sns_quantize_scf_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..d4d3d3aa279fe48ea0372aa423d5cd3481af8522 --- /dev/null +++ b/lib_lc3plus/sns_quantize_scf_fx.c @@ -0,0 +1,2067 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "defines.h" +#include "functions.h" +#ifdef CR9_C_ADD_1p25MS_LRSNS +#include "constants.h" +#include /* req for INT32_MAX in msvc */ +#endif + +static Word16 stage1_base( /* o : idx */ + const Word16 *t, /* i : target SCFs */ +#ifdef ENABLE_HR_MODE + const Word32 *cdbk, /* i : SCFs cdbk */ +#else + const Word16 *cdbk, /* i : SCFs cdbk */ +#endif + const Word16 R /* i : number of rows in codebook */ +) +{ + Counter row; + Word16 k_ptr, idx; + Word32 L_min_mse, L_mse; + Counter col; +#ifdef ENABLE_HR_MODE + Word32 err; +#else + Word16 err; +#endif + +#ifdef DYNMEM_COUNT + Dyn_Mem_In("stage1_base", sizeof(struct { + Counter row, col; + Word16 k_ptr, idx, err; + Word32 L_min_mse, L_mse; + })); +#endif +#ifdef WMOPS + push_wmops("stage1_base"); +#endif + +/* find first vector error energy for */ +/* loop probably works with saturation , but it should not occur anyway */ + L_min_mse = L_add(0, 0); /* init acc with absolute min mse sofar */ + FOR (col = 0; col < M / 2; col++) /* fixed to 8 elements */ + { +#ifdef ENABLE_HR_MODE + err = L_sub(cdbk[col], L_deposit_h(t[col])); /* cdbk max abs value is 2048 = 2.^11 , max nb col is 2^3 max + target is approx similar (2.^14/M)*2 = +/- 2048 , errmax is 4096 */ + L_min_mse = L_add(L_min_mse, Mpy_32_32_lc3plus(err, err)); +#else + err = sub(cdbk[col], t[col]); /* cdbk max abs value is 2048 = 2.^11 , max nb col is 2^3 max target is approx + similar (2.^14/M)*2 = +/- 2048 , errmax is 4096 */ + L_min_mse = L_mac0(L_min_mse, err, err); /* max L_min_mse is 8*4096*4096 =2.^(3+12+12) = 2.^27 */ +#endif + } + + idx = 0; move16(); + + k_ptr = M / 2; move16(); /* ptr init to second row */ + FOR (row = 1; row < R; row++) + { + /* loop probably works with saturation , but it should not occur anyway */ + + L_mse = L_add(L_min_mse, 0); /* init acc with min mse sofar , */ + FOR (col = 0; col < M / 2; col++) /* fixed to 8 elements */ + { +#ifdef ENABLE_HR_MODE + err = L_sub(cdbk[k_ptr++], L_deposit_h(t[col])); + L_mse = L_sub(L_mse, Mpy_32_32_lc3plus(err, err)); +#else + err = sub(cdbk[k_ptr++], t[col]); + L_mse = L_msu0(L_mse, err, + err); /* NB subtraction from best MSE error sofar in acc , saturation may not occur */ +#endif + } + + L_min_mse = L_sub(L_min_mse, L_max(L_mse, 0L)); /* ALWAYS update best MSE error sofar */ + + if (L_mse > 0L) /* if acc value still is positive a new lower error energy vector was found in this row */ + { + idx = row; move16(); /* update 1-8 bits idx */ + } + + /* this inner loop(always updating L_min_mse), (L_msu, if ) consumes AV 19, WC ~20 STL cycles , + compared to a conventional(L_mac, IF( ) ) AV 21 WC ~23 STL cycles per + loop */ + } + ASSERT(idx >= 0 && idx < R); + +#ifdef WMOPS + pop_wmops(); +#endif +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif + + return idx; +} + +static void first_stage_split_search( +#ifdef ENABLE_HR_MODE + const Word32 *cbk_LF, const Word32 *cbk_HF, +#else + const Word16 *cbk_LF, const Word16 *cbk_HF, +#endif + const Word16 *target, + const Word16 nbCbkEntries, Word16 *idxLF, Word16 *idxHF) +{ + /* find base index for each SCF split */ + *idxLF = stage1_base(target, cbk_LF, nbCbkEntries); + *idxHF = stage1_base((&target[M / 2]), cbk_HF, nbCbkEntries); +} + +static void processDeQuantize_stage1ScfDecStage1_fx( +#ifdef ENABLE_HR_MODE + const Word32 *cbk_LF, const Word32 *cbk_HF, +#else + const Word16 *cbk_LF, const Word16 *cbk_HF, +#endif + Word16 st1_idx0, Word16 st1_idx1, +#ifdef ENABLE_HR_MODE + Word32 *st1_vector +#else + Word16 *st1_vector +#endif + ) +{ + Counter col; + Word16 offset0, offset1; +#ifdef DYNMEM_COUNT + Dyn_Mem_In("processDeQuantize_stage1ScfDecStage1_fx", sizeof(struct { + Word16 offset0, offset1; + Counter col; + })); +#endif + + offset0 = shl_pos(st1_idx0, 3); /* mult by M/2 */ + offset1 = shl_pos(st1_idx1, 3); + FOR (col = 0; col < M / 2; col++) + { + st1_vector[col] = cbk_LF[offset0++]; move16(); + st1_vector[col + 8] = cbk_HF[offset1++]; move16(); +#ifdef ENABLE_HR_MODE + move16(); + move16(); +#endif + } +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif +} + +void downshift_w32_arr(Word32 *w32_arr, Word16 *w16_arr, Word16 shft_val, Word32 len) +{ + Word32 i; + FOR (i = 0; i < len; i++) + { + w16_arr[i] = extract_l(L_shr_pos(w32_arr[i], shft_val)); + move16(); + } + return; +} + +void round_w32tow16_arr(Word32 *w32_arr, Word16 *w16_arr,Word32 len) +{ + Word32 i; + FOR (i = 0; i < len; i++) + { + w16_arr[i] = round_fx(w32_arr[i]); + move16(); + } + return; +} + +static void processQuantize_stage1ScfEncStage1_fx(const Word16 *target_st1, +#ifdef ENABLE_HR_MODE + Word32 *st1_vector, +#else + Word16 *st1_vector, +#endif + Word16 *st1_idx0Ptr, Word16 *st1_idx1Ptr) + +{ +#ifdef WMOPS + push_wmops("processQuantize_stage1ScfEncStage1_fx"); +#endif + +#ifdef ENABLE_HR_MODE + first_stage_split_search(st1SCF0_7_base5_32x8_Q27, st1SCF8_15_base5_32x8_Q27, target_st1, SCF_STAGE1_NBCDKENTRIES, + st1_idx0Ptr, st1_idx1Ptr); + + processDeQuantize_stage1ScfDecStage1_fx(st1SCF0_7_base5_32x8_Q27, st1SCF8_15_base5_32x8_Q27, *st1_idx0Ptr, + *st1_idx1Ptr, st1_vector); +#else + first_stage_split_search(st1SCF0_7_base5_32x8_Q11, st1SCF8_15_base5_32x8_Q11, target_st1, SCF_STAGE1_NBCDKENTRIES, + st1_idx0Ptr, st1_idx1Ptr); + + processDeQuantize_stage1ScfDecStage1_fx(st1SCF0_7_base5_32x8_Q11, st1SCF8_15_base5_32x8_Q11, *st1_idx0Ptr, + *st1_idx1Ptr, st1_vector); +#endif + +#ifdef WMOPS + pop_wmops(); +#endif + + return; +} + +/* gain-shape MSE search in warped SCF-residual domain, synthesis in SCF resiudal domain allows for easy weighting */ + +static void pvq_enc_find_best_submode_pre_post_fx( +#ifdef ENABLE_HR_MODE + const Word32 *target_st2, /* this target is in the linearized warped domain , same as input to PVQ search */ +#else + const Word16 *target_st2, /* this target is in the linearized warped domain , same as input to PVQ search */ +#endif + const Word16 *enc_pulses_far, Word16 *enc_pulses_near, const Word16 *enc_pulsesA, const Word16 *enc_pulsesB, + Word16 *sub_mode_ptr, Word16 *i_gain_ptr, +#ifdef ENABLE_HR_MODE + Word32 *enc_adj_glob_warped_vec, +#else + Word16 *enc_adj_glob_warped_vec, +#endif + Word8 *scratchBuffer) /* Size = 18 * M */ +{ + + Counter L_section, idx; +#ifdef ENABLE_HR_MODE + const Word32 *search_en1shape[N_SCF_SHAPES_ST2]; +#else + const Word16 *search_en1shape[N_SCF_SHAPES_ST2]; +#endif + const Word16 *search_gainTab[N_SCF_SHAPES_ST2]; + Word16 search_n_gains[N_SCF_SHAPES_ST2]; + Word32 L_mse, L_mse_min, L_idx; + Word16 * pulses_far, *pulses_near, *pulsesAB, *pulsesA; +#ifdef ENABLE_HR_MODE + Word32 * target_w, *shape_far, *shape_near, *shapeAB, *shapeA; +#else + Word16 * target_w, *shape_far, *shape_near, *shapeAB, *shapeA; +#endif +#ifdef ENABLE_HR_MODE + Word32 tmp, err; +#else + Word16 tmp, err; +#endif + Counter i; + +#ifdef DYNMEM_COUNT +#ifdef ENABLE_HR_MODE + Dyn_Mem_In("pvq_enc_find_best_submode_pre_post_fx", sizeof(struct { + Counter i, L_section, idx; + Word32 *search_en1shape[N_SCF_SHAPES_ST2]; + Word16 *search_gainTab[N_SCF_SHAPES_ST2]; + Word16 search_n_gains[N_SCF_SHAPES_ST2]; + Word32 L_mse, L_mse_min, L_idx; + Word16 *pulses_far, *pulses_near, *pulsesAB, *pulsesA; + Word32 *target_w, *shape_far, *shape_near, *shapeAB, *shapeA; + Word32 tmp, err; + })); +#else + Dyn_Mem_In("pvq_enc_find_best_submode_pre_post_fx", sizeof(struct { + Counter i, L_section, idx; + Word16 *search_en1shape[N_SCF_SHAPES_ST2]; + Word16 *search_gainTab[N_SCF_SHAPES_ST2]; + Word16 search_n_gains[N_SCF_SHAPES_ST2]; + Word32 L_mse, L_mse_min, L_idx; + Word16 *pulses_far, *pulses_near, *pulsesAB, *pulsesA; + Word16 *target_w, *shape_far, *shape_near, *shapeAB, *shapeA; + Word16 tmp, err; + })); +#endif /* ENABLE_HR_MODE */ +#endif /* DYNMEM_COUNT */ + + pulses_near = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * M */ + + pulsesAB = (Word16 *)scratchAlign(pulses_near, sizeof(*pulses_near) * M); /* Size = 2 * M */ + + pulsesA = (Word16 *)scratchAlign(pulsesAB, sizeof(*pulsesAB) * M); /* Size = 2 * M */ + +#ifdef ENABLE_HR_MODE + target_w = (Word32 *)scratchAlign(pulsesA, sizeof(*pulsesA) * M); /* Size = 2 * M */ + + shape_near = (Word32 *)scratchAlign(target_w, sizeof(*target_w) * M); /* Size = 4 * M */ + + shapeAB = (Word32 *)scratchAlign(shape_near, sizeof(*shape_near) * M); /* Size = 4 * M */ + + shapeA = (Word32 *)scratchAlign(shapeAB, sizeof(*shapeAB) * M); /* Size = 4 * M */ +#else + target_w = (Word16 *)scratchAlign(pulsesA, sizeof(*pulsesA) * M); /* Size = 2 * M */ + + shape_near = (Word16 *)scratchAlign(target_w, sizeof(*target_w) * M); /* Size = 2 * M */ + + shapeAB = (Word16 *)scratchAlign(shape_near, sizeof(*shape_near) * M); /* Size = 2 * M */ + + shapeA = (Word16 *)scratchAlign(shapeAB, sizeof(*shapeAB) * M); /* Size = 2 * M */ +#endif + + pulses_far = (Word16 *)scratchAlign(shapeA, sizeof(*shapeA) * M); /* Size = 2 * M */ + +#ifdef ENABLE_HR_MODE + shape_far = (Word32 *)scratchAlign(pulses_far, sizeof(*pulses_far) * M); /* Size = 2 * M */ +#else + shape_far = (Word16 *)scratchAlign(pulses_far, sizeof(*pulses_far) * M); /* Size = 2 * M */ +#endif + +#ifdef WMOPS + push_wmops("pvq_enc_find_best_submode_pre_post_fx"); +#endif + + /* construct pulse vectors and en1 normalized shape vectors */ /* use shape Q in Q14 */ + basop_memmove(pulses_far, enc_pulses_far, M * sizeof(*pulses_far)); + basop_memmove(pulses_near, enc_pulses_near, M * sizeof(*pulses_near)); + basop_memmove(target_w, target_st2, M * sizeof(*target_w)); + + pvq_dec_en1_normQ14_fx(shape_near, pulses_near, sns_Kval[2][0], M); /* near outlier mode */ + pvq_dec_en1_normQ14_fx(shape_far, pulses_far, sns_Kval[3][0], M); /* far outlier mode */ + + /* regular mode(with a split), prepare vectors of full length M */ + basop_memmove(pulsesAB, enc_pulsesA, N_SETA * sizeof(*pulsesAB)); + basop_memmove(pulsesA, enc_pulsesA, N_SETA * sizeof(*pulsesA)); + + FOR (i = N_SETA; i < M; i++) + { + pulsesAB[i] = enc_pulsesB[sub(i, N_SETA)]; move16(); + } + + IF (M > N_SETA) + { + basop_memset(&pulsesA[N_SETA], 0, (M - N_SETA) * sizeof(*pulsesA)); + } + + pvq_dec_en1_normQ14_fx(shapeAB, pulsesAB, sns_Kval[0][0], M); + /* regular AB , b_pulses = 1 ;*/ /* OPT: combine with shapeA */ + + pvq_dec_en1_normQ14_fx(shapeA, pulsesA, sns_Kval[1][0], M); + /* regular A , b_pulses = 0 */ /* OPT: M-> N_SETA */ + + /* setup search structure */ + + /* now aligned with order of j {regular=0, regular_lf=1, outlier_near=2, outlier far=3} */ + + search_en1shape[0] = shapeAB; + search_gainTab[0] = sns_gaintabPtr[0]; + search_n_gains[0] = sns_gainSz[0]; /* assumes whole bits */ + + search_en1shape[1] = shapeA; + search_gainTab[1] = sns_gaintabPtr[1]; + search_n_gains[1] = sns_gainSz[1]; /* assumes whole bits */ + + search_en1shape[2] = shape_near; + search_gainTab[2] = sns_gaintabPtr[2]; + search_n_gains[2] = sns_gainSz[2]; /*assume whole bits */ + + search_en1shape[3] = shape_far; + search_gainTab[3] = sns_gaintabPtr[3]; + search_n_gains[3] = sns_gainSz[3]; /*assume whole bits */ + + /* start actual search loop */ + + /* basic raw MSE loop, */ + L_mse_min = INT_MAX; move32(); + L_idx = L_deposit_l(-1); /* section in low 2 bits* gain idx above */ + + FOR (L_section = 0; L_section < N_SCF_SHAPES_ST2; L_section++) + { + /* raw MSE over gain and shape */ + FOR (idx = 0; idx < search_n_gains[L_section]; idx++) + { + /* MSE ( proc_target_local[i]-adjGain[i]*en1Shape[i] ) */ + + L_mse = L_deposit_l(0); + FOR (i = 0; i < M; i++) + { +#ifdef ENABLE_HR_MODE + tmp = Mpy_32_16_lc3plus(search_en1shape[L_section][i], search_gainTab[L_section][idx]); /* Q30 + 14 - 15 = Q29 */ + err = L_sub(target_w[i], tmp); /* both in Q29 */ + L_mse = L_add(L_mse, L_shr_pos(Mpy_32_32_lc3plus(err, err), 1)); /* Q29+29-31 = Q27 */ +#else + tmp = mult_r(search_gainTab[L_section][idx], search_en1shape[L_section][i]); /* Q15+14+1-16= Q14 */ + err = sub(target_w[i], tmp); /* both in Q14 */ + L_mse = L_mac0(L_mse, err, err); /* Q14+14 = Q28 */ +#endif /* Q14+14 = Q28 */ + } + + IF (L_sub(L_mse, L_mse_min) < 0) /* OPT: always update L_mse_min) */ + { + L_mse_min = L_mse; move32(); + L_idx = L_mac0(L_section, idx, 1 << 2); /* save both section and gain idx */ + } + } /* gains */ + } /*submodes*/ + + L_section = L_and(0x3L, L_idx); /* section was stored in two lowest bits */ + ASSERT(L_section >= 0 && L_section <= 3); + *i_gain_ptr = extract_l(L_shr_pos(L_idx, 2)); /*1,2,3 bit gain */ + ASSERT(*i_gain_ptr >= 0 && *i_gain_ptr <= 7); + + /* returns a scaled and transformed vector, ___EXACTLY__ as a decoder would scale it */ + ASSERT(enc_adj_glob_warped_vec != NULL); + { + /* warp/rotate search result to SCF residual domain */ +#ifdef ENABLE_HR_MODE + idct32_32_fx(search_en1shape[L_section], target_w); +#else + idct16_fx(search_en1shape[L_section], target_w); /* fwd synthesis warping */ +#endif + /* actual synthesis gain scaling in SCF-residual domain, for easy weighting analysis */ + pvq_dec_scale_vec_fx(target_w, search_gainTab[L_section][*i_gain_ptr], enc_adj_glob_warped_vec); + } + + *sub_mode_ptr = extract_l(L_section); + move16(); /* 0,1,2,3 */ + +#ifdef WMOPS + pop_wmops(); +#endif +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif + return; +} + +static void processQuantize_stage2ScfEncStage2_fx( +#ifdef ENABLE_HR_MODE + const Word32 *target_st2, Word32 *st2_vector, +#else + const Word16 *target_st2, Word16 *st2_vector, +#endif + Word32 *L_prm_idx, + Word16 submodes, Word8 *scratchBuffer) /* Size = 26 * M + 48 */ +{ /*func */ +#ifdef ENABLE_HR_MODE + Word32 *proc_target; +#else + Word16 *proc_target; +#endif + + Word16 *enc_pulses_far, *enc_pulses_near, *enc_pulsesA, *enc_pulsesB; + + Word16 *pulses_fin, *pulses_proj; + Word32 L_tmp; + + Word8 *buffer_pvq_enc_find_best_submode_pre_post_fx; + + PvqEntry_fx enc_PVQ_OA, enc_PVQ_B; + Word16 submode, i_gain, submodeMSB, submodeLSB; + Word32 * L_search_corr, *L_search_en; +#ifdef ENABLE_HR_MODE + Word16 * proc_target_lp; +#endif + +#ifdef DYNMEM_COUNT +#ifdef ENABLE_HR_MODE + Dyn_Mem_In("processQuantize_stage2ScfEncStage2_fx", sizeof(struct { + Word32 *proc_target; + Word16 *enc_pulses_far, *enc_pulses_near, *enc_pulsesA, *enc_pulsesB; + Word16 *pulses_fin, *pulses_proj; + Word32 L_tmp; + Word8 *buffer_pvq_enc_find_best_submode_pre_post_fx; + PvqEntry_fx enc_PVQ_OA, enc_PVQ_B; + Word16 submode, i_gain, submodeMSB, submodeLSB; + Word32 * L_search_corr, *L_search_en; + Word16 * proc_target_lp; + })); +#else + Dyn_Mem_In("processQuantize_stage2ScfEncStage2_fx", sizeof(struct { + Word16 *proc_target; + Word16 *enc_pulses_far, *enc_pulses_near, *enc_pulsesA, *enc_pulsesB; + Word16 *pulses_fin, *pulses_proj; + Word32 L_tmp; + Word8 *buffer_pvq_enc_find_best_submode_pre_post_fx; + PvqEntry_fx enc_PVQ_OA, enc_PVQ_B; + Word16 submode, i_gain, submodeMSB, submodeLSB; + Word32 * L_search_corr, *L_search_en; + })); +#endif /* ENABLE_HR_MODE */ +#endif /* DYNMEM_COUNT */ + +#ifdef ENABLE_HR_MODE + buffer_pvq_enc_find_best_submode_pre_post_fx = (Word8 *) scratchAlign(scratchBuffer, 0); + proc_target = (Word32 *) scratchAlign(buffer_pvq_enc_find_best_submode_pre_post_fx, sizeof(*buffer_pvq_enc_find_best_submode_pre_post_fx) * 28 * M); +#else + buffer_pvq_enc_find_best_submode_pre_post_fx = scratchAlign(scratchBuffer, 0); /* Size = 18 * M */ + proc_target = + (Word16 *)scratchAlign(buffer_pvq_enc_find_best_submode_pre_post_fx, + sizeof(*buffer_pvq_enc_find_best_submode_pre_post_fx) * 18 * M); /* Size = 2 * M */ +#endif + + enc_pulses_near = (Word16 *)scratchAlign(proc_target, sizeof(*proc_target) * M); /* Size = 2 * M */ + enc_pulsesA = (Word16 *)scratchAlign(enc_pulses_near, sizeof(*enc_pulses_near) * M); /* Size = 2 * N_SETA */ + enc_pulsesB = (Word16 *)scratchAlign(enc_pulsesA, sizeof(*enc_pulsesA) * N_SETA); /* Size = 2 * N_SETB */ + pulses_fin = (Word16 *)scratchAlign(enc_pulsesB, sizeof(*enc_pulsesB) * N_SETB); /* Size = 2 * N_SCF_SHAPES_ST2 */ + pulses_proj = + (Word16 *)scratchAlign(pulses_fin, sizeof(*pulses_fin) * N_SCF_SHAPES_ST2); /* Size = 2 * N_SCF_SHAPES_ST2 */ + L_search_corr = + (Word32 *)scratchAlign(pulses_proj, sizeof(*pulses_proj) * N_SCF_SHAPES_ST2); /* Size = 4 * N_SCF_SHAPES_ST2 */ + L_search_en = (Word32 *)scratchAlign(L_search_corr, + sizeof(*L_search_corr) * N_SCF_SHAPES_ST2); /* Size = 4 * N_SCF_SHAPES_ST2 */ + enc_pulses_far = (Word16 *)scratchAlign(L_search_en, sizeof(*L_search_en) * N_SCF_SHAPES_ST2); /* Size = 2 * M */ + +#ifdef ENABLE_HR_MODE + proc_target_lp = (Word16 *)buffer_pvq_enc_find_best_submode_pre_post_fx; /* size = 2*M */ +#endif + +#ifdef WMOPS + push_wmops("processQuantize_stage2ScfEncStage2_fx"); +#endif + + /* fixed setup for a given bitrate of 38 , no moves needed */ + /* k_far = sns_Kval[3][0]; */ + /* k_near = sns_Kval[2][0]; */ + /* kA = sns_Kval[1][0]; */ /* regular, regular_lf */ + /* kB is always 1 */ + + /* NB these search indecese do not correspond exactly to specification shape_index j */ + + pulses_fin[0] = sns_Kval[3][0]; /* far 6 */ + pulses_fin[1] = sns_Kval[2][0]; /* near 8 */ + pulses_fin[2] = sns_Kval[1][0]; /* section A 10 */ + pulses_fin[3] = sns_Kval[0][1]; /* section B 1 */ + + pulses_proj[0] = sns_Kval[3][0]; + pulses_proj[1] = 0; + pulses_proj[2] = 0; + pulses_proj[3] = 0; + + /* pre_process */ +#ifdef ENABLE_HR_MODE + dct32_fx(target_st2, proc_target); /* enc analysis */ + downshift_w32_arr(proc_target, proc_target_lp, 16, M); + + /* get the initial four integer shape candidate vectors, no normalization at this stage */ + pvq_enc_search_fx(proc_target_lp, enc_pulses_far, enc_pulses_near, enc_pulsesA, enc_pulsesB, L_search_corr, + L_search_en, pulses_fin, pulses_proj, M, N_SETA); +#else + Word32 target_st2_32[M]; Word32 proc_target_32[M]; int i; + + FOR (i = 0; i < M; i++) + { + target_st2_32[i] = L_shl_pos(target_st2[i], 16); + } + + dct32_fx(target_st2_32, proc_target_32); /* enc analysis */ + + downshift_w32_arr(proc_target_32, proc_target, 16, M); + + /* get the initial four integer shape candidate vectors, no normalization at this stage */ + pvq_enc_search_fx(proc_target, enc_pulses_far, enc_pulses_near, enc_pulsesA, enc_pulsesB, L_search_corr, + L_search_en, pulses_fin, pulses_proj, M, N_SETA); +#endif + + /* scale with gains a after a unit energy fwd transform */ + /* apply transform to each candidate shape vector priot to gain-shape search loop */ + submode = submodes; /* used as input solely to debug/unit test a specific shape mode */ + + /*target should be in a linearized residual domain target */ + /* search pre, synthesis post*/ + pvq_enc_find_best_submode_pre_post_fx(proc_target, enc_pulses_far, enc_pulses_near, enc_pulsesA, enc_pulsesB, + &submode, &i_gain, st2_vector, + buffer_pvq_enc_find_best_submode_pre_post_fx); /* Q14 tr out */ + + /* send parameters to multiplexor as a series/vector of Long Words */ + /* 0 : 0..3 submode */ + /* 1 : 0..7 gain_ind */ + /* 2 : 0..1 LeadSign ind */ + /* 3 : 25 bit MPVQ index outl_near or A part */ + /* 4 : 3.7 to 21 bits MPVQ index B part OR -2 */ + + L_prm_idx[0] = L_deposit_l(submode); /* complete submode fwd'ed to ari_codec as 0,1,2,3 */ + + submodeMSB = shr_pos(submode, 1); /* LSB of submode , sent as main submode bit */ + submodeLSB = s_and(submode, 0x1); /* LSB of submode */ /* sent via shape param */ + + /* gain, shape indicese , incl. calls to MPVQ indexing */ + IF (submodeMSB == 0) + { /* regular modes:: j=0(reg=AB) or 1(reg_lf A) */ /* regular mode, with two or one shape indices */ + + /* assume regular_lf part , shape_j == 1 */ + enc_PVQ_OA = + mpvq_index_fx(enc_pulsesA, N_SETA, sns_Kval[submode][0]); /* o : leading_sign_index, index, size, k_val */ + L_prm_idx[2] = L_deposit_l(enc_PVQ_OA.lead_sign_ind); /*LS set A */ + + ASSERT(enc_PVQ_OA.size == (UWord32)sns_MPVQ_Sz[submode][0]); + L_prm_idx[3] = L_add(0L, (Word32)enc_PVQ_OA.index); /* MPVQ shape index set A fractional */ + + /* section B always have low indexing dynamics and is combined into one joint single index */ + IF (submodeLSB == 0) + { /* regular AB , shape_j == 0*/ + L_prm_idx[1] = L_deposit_l(i_gain); /* full established gain idx fwd'ed */ /* 2 possible values */ + enc_PVQ_B = mpvq_index_fx(enc_pulsesB, N_SETB, 1); + ASSERT(((enc_PVQ_B.size << 1)) == + (sns_MPVQ_Sz[submode][1])); /* two lowest indeces indicate all_zero B section */ + + L_tmp = L_shl_pos((Word32)enc_PVQ_B.index, 1); /* 2*section B MPVQ index */ + L_prm_idx[4] = L_add(L_tmp, enc_PVQ_B.lead_sign_ind); move32(); /* add joint section B and LS index */ + + ASSERT(L_prm_idx[4] >= 0 && L_prm_idx[4] < (Word32)sns_MPVQ_Sz[submode][0]); + } + ELSE + { + L_prm_idx[1] = L_deposit_l(i_gain); + /* MSBs of established gain idx */ /* 2 or 4 total possible values */ + L_prm_idx[4] = L_deposit_l(-2); + } + } + ELSE + { + /* outlier modes shape_j= 2(near, LSB=0) or 3(far, LSB=1) */ + + IF (submodeLSB == 0) + { + L_prm_idx[1] = L_deposit_l(i_gain); /* established gain idx */ /* 4 possible values */ + enc_PVQ_OA = mpvq_index_fx(enc_pulses_near, M, + sns_Kval[submode][0]); /* o : leading_sign_index, index, size, k_val */ + ASSERT(enc_PVQ_OA.size == sns_MPVQ_Sz[submode][0]); + L_prm_idx[3] = L_add(0L, enc_PVQ_OA.index); /* MPVQ index fractional bits */ + L_prm_idx[4] = L_deposit_l(-1); /* no gain LSBs */ + } + ELSE + { + L_prm_idx[1] = L_deposit_l(i_gain); /* established gain idx MSBs */ /* all 4 or 8 possible values */ + enc_PVQ_OA = mpvq_index_fx(enc_pulses_far, M, + sns_Kval[submode][0]); /* o : leading_sign_index, index, size, k_val */ + ASSERT(enc_PVQ_OA.size == sns_MPVQ_Sz[submode][0]); + L_prm_idx[3] = L_add(0L, enc_PVQ_OA.index); /* MPVQ index fractional bits */ + L_prm_idx[4] = L_deposit_l(-2); /* */ + } + L_prm_idx[2] = L_deposit_l(enc_PVQ_OA.lead_sign_ind); /* LS shape single bit */ + } + +#ifdef WMOPS + pop_wmops(); +#endif +#ifdef DYNMEM_COUNT + Dyn_Mem_Out(); +#endif + return; +} + +static Word16 scfdec_stage2_fx( /* o: ber flag */ + const Word32 *L_prm_idx, /* set to -1 if not used */ +#ifdef ENABLE_HR_MODE + Word32 * st2_vector, /*o: Q14 */ +#else + Word16 * st2_vector, /*o: Q14 */ +#endif + Word8 * scratchBuffer) +{ + /* MPVQ deindexing, gainscaling transform and transform */ +#ifdef ENABLE_HR_MODE + Dyn_Mem_Deluxe_In( + Word16 submode; + Word16 submodeLSB, submodeMSB; + Word16 gValQ13; + Word16 idxB; + Word16 maxK; + Word16 BER_dec; + Word16 *dec_pulses; + Word32 *dec_en1_vec; + Word32 *dec_adj_glob_vec; + ); +#else + Dyn_Mem_Deluxe_In( + Word16 submode; + Word16 submodeLSB, submodeMSB; + Word16 gValQ13; + Word16 idxB; + Word16 maxK; + Word16 BER_dec; + Word16 *dec_pulses; + Word16 *dec_en1_vec; + Word16 *dec_adj_glob_vec; + ); +#endif + +#ifdef WMOPS + push_wmops("scfdec_stage2_fx"); +#endif + + dec_pulses = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * M = 32 bytes */ +#ifdef ENABLE_HR_MODE + dec_en1_vec = (Word32 *)scratchAlign(dec_pulses, sizeof(*dec_pulses) * M); /* Size = 2 * M = 32 bytes */ + dec_adj_glob_vec = (Word32 *)scratchAlign(dec_en1_vec, sizeof(*dec_en1_vec) * M); /* Size = 2 * M = 32 bytes */ +#else + dec_en1_vec = (Word16 *)scratchAlign(dec_pulses, sizeof(*dec_pulses) * M); /* Size = 2 * M = 32 bytes */ + dec_adj_glob_vec = (Word16 *)scratchAlign(dec_en1_vec, sizeof(*dec_en1_vec) * M); /* Size = 2 * M = 32 bytes */ +#endif + + /* get submode */ + submode = extract_l(L_prm_idx[0]); /* 0..3 */ + + submodeLSB = s_and(submode, 0x1); + submodeMSB = shr_pos(submode, 1); + + /* get initial adjustment gain vector for regular, outl_near */ + ASSERT(L_prm_idx[1] >= 0 && L_prm_idx[1] < sns_gainSz[submode]); + gValQ13 = sns_gaintabPtr[submode][L_prm_idx[1]]; + ASSERT(gValQ13 >= 0); + + /* gain, shape indices, incl.calls to MPVQ deindexing */ + IF (submodeMSB != 0) + { + /* outlier_near or outlier_far mode decoding */ + maxK = sns_Kval[submode][0]; move16(); + BER_dec = pvq_dec_deidx_fx(dec_pulses, maxK, M, extract_l(L_prm_idx[2]), (UWord32)L_prm_idx[3]); + } + ELSE + { /* regular mode, with potentially two shape indices */ + + maxK = sns_Kval[submode][0]; move16(); + BER_dec = pvq_dec_deidx_fx(dec_pulses, maxK, N_SETA, extract_l(L_prm_idx[2]), (UWord32)L_prm_idx[3]); + + IF (submodeLSB == 0) + { + idxB = extract_l(L_prm_idx[4]); /* 0..11 */ + ASSERT(idxB >= 0 && idxB < (Word16)sns_MPVQ_Sz[0][1]); + BER_dec |= pvq_dec_deidx_fx(&(dec_pulses[N_SETA]), sns_Kval[submode][1], N_SETB, s_and(idxB, 0x1), + (UWord32)L_deposit_l(shr_pos(idxB, 1))); + /* maxK does not need to be increased as set B is not stacked */ + } + ELSE + { /* LSB gain bit already parsed */ + ASSERT(L_prm_idx[4] < 0); + basop_memset(&dec_pulses[N_SETA], 0, (N_SETB) * sizeof(*dec_pulses)); + } + } + + /* normalize decoded integer vector , exactly as on encoder side !! */ + pvq_dec_en1_normQ14_fx(dec_en1_vec, dec_pulses, maxK, M); + +#ifdef ENABLE_HR_MODE + idct32_32_fx(dec_en1_vec, dec_adj_glob_vec); +#else + idct16_fx(dec_en1_vec, dec_adj_glob_vec); /* fwd warping in unscaled domain */ +#endif + + /* scaling aligend with encoder search */ + pvq_dec_scale_vec_fx(dec_adj_glob_vec, gValQ13, st2_vector); + +#ifdef WMOPS + pop_wmops(); +#endif + Dyn_Mem_Deluxe_Out(); + return BER_dec; +} + +void processSnsQuantizeScfEncoder_fx(Word16 scf[], /* i: input scf M */ + Word32 *L_prm_idx, /* o: indeces . negative == unused */ +#ifdef ENABLE_HR_MODE + Word32 *scf_q, /* o: quantized scf M */ +#else + Word16 *scf_q, /* o: quantized scf M */ +#endif + Word8 * scratchBuffer) /* Size = 28 * M + 52 */ +{ +#ifdef ENABLE_HR_MODE + Dyn_Mem_Deluxe_In( + Word32 *target_st2; + Word16 *st1_idx; /* stage 1 indices */ + Word8 * buffer_processQuantize_stage2ScfEncStage2_fx; + Counter col; + ); +#else + Dyn_Mem_Deluxe_In( + Word16 *target_st2; + Word16 *st1_idx; /* stage 1 indices */ + Word8 * buffer_processQuantize_stage2ScfEncStage2_fx; + Counter col; + ); +#endif + +#ifdef ENABLE_HR_MODE + target_st2 = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * M */ +#else + target_st2 = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * M */ +#endif + st1_idx = (Word16 *)scratchAlign(target_st2, sizeof(*target_st2) * M); /* Size = 2 * 2 */ + buffer_processQuantize_stage2ScfEncStage2_fx = (Word8 *)scratchAlign(st1_idx, sizeof(*st1_idx) * M); + /* Size = 26 * M + 48 */ + + /* TBD needs update */ + + /* 1st stage trained VQ */ + processQuantize_stage1ScfEncStage1_fx(scf, scf_q, &st1_idx[0], &st1_idx[1]); + L_prm_idx[0] = L_deposit_l(st1_idx[0]); + L_prm_idx[1] = L_deposit_l(st1_idx[1]); + +/* 2nd stage PVQ-based SCF quantizer */ + FOR (col = 0; col < M; col++) + { +#ifdef ENABLE_HR_MODE + target_st2[col] = L_sub(L_deposit_h(scf[col]), scf_q[col]); +#else + target_st2[col] = sub(scf[col], scf_q[col]); +#endif + } + + processQuantize_stage2ScfEncStage2_fx(target_st2, scf_q, &L_prm_idx[2], VQMODES26, /* 0xF means all submodes */ + buffer_processQuantize_stage2ScfEncStage2_fx); /* PVQ in stage 2 */ + Dyn_Mem_Deluxe_Out(); +} + +Word16 processSnsQuantizeScfDecoder_fx( /* o: BER flag */ + Word32 *L_prm_idx, /* i: indeces */ +#ifdef ENABLE_HR_MODE + Word32 scf_q[], +#else + Word16 scf_q[], +#endif + Word8 *scratchBuffer) /* o: M */ +{ + Dyn_Mem_Deluxe_In( + Word16 BER_flag; + ); + + /* Decode First Stage */ +#ifdef ENABLE_HR_MODE + processDeQuantize_stage1ScfDecStage1_fx(st1SCF0_7_base5_32x8_Q27, st1SCF8_15_base5_32x8_Q27, + extract_l(L_prm_idx[0]), extract_l(L_prm_idx[1]), scf_q); +#else + processDeQuantize_stage1ScfDecStage1_fx(st1SCF0_7_base5_32x8_Q11, st1SCF8_15_base5_32x8_Q11, + extract_l(L_prm_idx[0]), extract_l(L_prm_idx[1]), scf_q); +#endif + + /* Decode Second Stage */ + BER_flag = scfdec_stage2_fx(&(L_prm_idx[2]), scf_q, scratchBuffer); + + Dyn_Mem_Deluxe_Out(); + return BER_flag; +} + +#ifdef CR9_C_ADD_1p25MS_LRSNS +Word16 snsQuantScfDecLR_fx(Word32* L_sns_vq_idx_fx, + Word32* L_scf_q_fx, /* o: Q26 */ + Word16* scf_q_fx, /* o: Q11 */ + Word16 pitch_rx_fx, Word16 ltpf_rx_fx, Word8 * scratch) +{ + + + + Dyn_Mem_Deluxe_In( + Counter i; + Word32 L_mPVQ_ind_fx; /* can be up to 17 bits */ + Word16 shape_idx_fx, gain_idx_fx, cb_idx_fx, aux_idx_fx, LS_ind_fx; + Word16 env_ind_fx, shift_ind_fx, sign_ind_fx, n_signs_fx; + + Word16 *Y_shape_j_fx; /* Q0 */ + Word16 *Xq_shape_j_fx; /* Q14 */ + Word32 *L_Xq_shape_j_fx; + const Word16 *cb_fx; + Word16 * st1_scf_q_fx; + Word16 CBCmeanp_ind_fx; + const Word16 *gainTab_fx; + Word16 gainValQ12_fx; + Word16 BER_dec; + Word32 L_y_en, L_norm_factor; + Word16 norm_factorQ, y_upshift; + ); + + st1_scf_q_fx = (Word16*)scratchAlign(scratch, 0); + Y_shape_j_fx = (Word16*)scratchAlign(st1_scf_q_fx, sizeof(*st1_scf_q_fx) * M); /*1*16*/ + L_Xq_shape_j_fx = (Word32*)scratchAlign(Y_shape_j_fx, sizeof(*Y_shape_j_fx) * M); /*1*16*/ + Xq_shape_j_fx = (Word16*)scratchAlign(L_Xq_shape_j_fx, sizeof(*L_Xq_shape_j_fx) * M); /*1*16*/ + /*1*16*/ + +#ifdef LRSNS_CBC_NO_LTPF_DEPENDENCY + UNUSED(ltpf_rx_fx); +#endif + BER_dec = 0; /* no BER detected in PVQ indeces */ + basop_memset(Y_shape_j_fx, 0, sizeof(Word16) * M); + + gainTab_fx = lrsns_vq_gainsQ12_fx[0]; move16(); /* gcc warning init */ + gain_idx_fx = 0; move16();/* gcc warning init */ + shift_ind_fx = 0; move16(); + env_ind_fx = 0; move16(); + + /* get indices from dec_entropy_dx */ + cb_idx_fx = extract_l(L_sns_vq_idx_fx[0]); move16(); /* stage1 idx */ + aux_idx_fx = extract_l(L_sns_vq_idx_fx[1]); move16(); /* mPVQ LS-bit or the FESS s0 bit */ + shape_idx_fx = extract_l(L_sns_vq_idx_fx[2]); move16(); /* analysis order shape idx -9,-10 0,1, 2,3,4,5 */ + gain_idx_fx = extract_l(L_sns_vq_idx_fx[3]); move16(); /* stage 2 gain index */ + + /* Stage1 cand */ + IF(sub(shape_idx_fx, -9) == 0) + { + /* minimal 2*16 SNS codebook, no DC */ + cb_fx = lrsns_cbA_fx; /* ptr init */ + basop_memcpy(scf_q_fx, &(cb_fx[shl_pos(cb_idx_fx, 4)]), sizeof(Word16) * M); /* cb_idx_fx * M */ + } + ELSE IF(sub(shape_idx_fx, -10) == 0) + { /* 0..339 */ /* stage 1B or 1C only, transmitted in 9+1= 10 bits */ + IF(sub(cb_idx_fx, 170) < 0) + { /* Stage 1B */ + snslr_st1B_vector_dec_fx(cb_idx_fx, st1SCF0_7_base5_32x8_Q11, st1SCF8_15_base5_32x8_Q11, + lrsns_st1B_merged170orderSortedSegmCum_fx, lrsns_st1B_merged170orderSort12bitIdx_fx, scf_q_fx); + + snslr_remove_st1_DC_fQ11_fx(scf_q_fx, M); + } + ELSE + { + cb_idx_fx = sub(cb_idx_fx, 170); + /* Stage 1C harmonic outlier CB with pitch dependent mean vector */ + /* Q11 values , so that BASOP and float is always BE in synthesis*/ + ASSERT(cb_idx_fx >= 0 && cb_idx_fx < 170); + + snslr_st1C_vector_dec_fx(cb_idx_fx, lrsns_st1C_Both_Word8_fx, lrsns_st1C_Both_scaleQ4_7p4bits_fx[1], + lrsns_st1C_Both_inv_scaleQ15_7p4bits_fx[1], M, 170, scf_q_fx); + /* add harmonic mean , based on pitch_info availability */ + + pitch_rx_fx = extract_l(L_sns_vq_idx_fx[3]); /* LTP active flag directly from dec_entropy */ +#ifdef LRSNS_CBC_NO_LTPF_DEPENDENCY + ltpf_rx_fx = 0; /* CB_C has no dependency on LTPF active flag */ +#else + ltpf_rx_fx = extract_l(L_sns_vq_idx_fx[4]); /* LTPF active flag directly from dec_entropy */ +#endif + CBCmeanp_ind_fx = pitch_rx_fx; move16(); /* 0 or 1 */ +#ifndef LRSNS_CBC_NO_LTPF_DEPENDENCY + test(); test(); test(); + if (pitch_rx_fx != 0 && ltpf_rx_fx != 0) + { + CBCmeanp_ind_fx = add(CBCmeanp_ind_fx, 1); /* high corr ltpf_rx is also active */ + } +#endif + const Word16 *mean_cb_fx = lrsns_st1CTrainedMapMeans_fx[CBCmeanp_ind_fx]; /* point to pitch dependent mean */ + for (i = 0; i < M; i++) + { + scf_q_fx[i] = add(scf_q_fx[i], mean_cb_fx[i]); + } + /* remove_DC() call is not required for section C */ + } + } + ELSE + { /* 0..169 */ /* st1B* used with a stage 2 shape submode */ + ASSERT(shape_idx_fx >= 0 && shape_idx_fx <= 5); + snslr_st1B_vector_dec_fx(cb_idx_fx, st1SCF0_7_base5_32x8_Q11, st1SCF8_15_base5_32x8_Q11, lrsns_st1B_merged170orderSortedSegmCum_fx, lrsns_st1B_merged170orderSort12bitIdx_fx, scf_q_fx); + snslr_remove_st1_DC_fQ11_fx(scf_q_fx, M); /* inplace */ /* DC needs removal for st1 part B */ + } + + basop_memcpy(st1_scf_q_fx, scf_q_fx, sizeof(Word16) * M); /* keep track of stage1 (A,B or C) contribution */ + + IF(shape_idx_fx >= 0) /* stage 2 shapes 0,1, 2,3,4,5 ( negative idx used for stage1 only */ + { + /* stage 2 SNS VQ decoding */ + /* Decode shape_j */ + Y_shape_j_fx[0] = 0; /* no DCT-II DC-coeff decoded */ + + SWITCH(shape_idx_fx) + { + case 0: /* splitLF 29 bits total */ + LS_ind_fx = aux_idx_fx; move16(); + L_mPVQ_ind_fx = L_sns_vq_idx_fx[4]; move32(); /* mPVQ(5,6) or mPVQ(5,8) */ + + test(); + IF(L_sns_vq_idx_fx[5] >= 0) + { + /* CFLT: MPVQdeenum_fx(5, 6, LS_ind_fx, L_mPVQ_ind_fx, &Y_shape_j_fx[1]); */ + BER_dec = pvq_dec_deidx_fx(&Y_shape_j_fx[1], PULSES_SPLIT_A_LR, NA_LR, LS_ind_fx, (UWord32)L_mPVQ_ind_fx); + + LS_ind_fx = extract_l(L_and(L_sns_vq_idx_fx[5], 0x1)); + L_mPVQ_ind_fx = L_shr_pos(L_sns_vq_idx_fx[5], 1); + + /* CFLT: MPVQdeenum_fx(8, 2, LS_ind_fx, L_mPVQ_ind_fx, &Y_shape_j_fx[1 + 5]); */ + BER_dec = s_or(BER_dec, pvq_dec_deidx_fx(&Y_shape_j_fx[1 + NA_LR], PULSES_SPLIT_B_LR, NB_LR, LS_ind_fx, (UWord32)L_mPVQ_ind_fx)); + } + ELSE + { + /* CFLT: MPVQdeenum_fx(5, 8, LS_ind_fx, L_mPVQ_ind_fx, &Y_shape_j_fx[1]); */ + BER_dec = pvq_dec_deidx_fx(&Y_shape_j_fx[1], (PULSES_SPLIT_A_LR + PULSES_SPLIT_B_LR), NA_LR, LS_ind_fx, (UWord32)L_mPVQ_ind_fx); + } + gainTab_fx = lrsns_vq_gainsQ12_fx[0]; move32(); /* 4 levels in 2 bits */ + break; + case 1: /* full (N=15,K=5) 30 bits total */ + LS_ind_fx = aux_idx_fx; move16(); + L_mPVQ_ind_fx = L_sns_vq_idx_fx[4]; move32(); + + /* CFLT: MPVQdeenum_fx(15, 5, LS_ind_fx, L_mPVQ_ind_fx, &Y_shape_j_fx[1]); */ + BER_dec = pvq_dec_deidx_fx(&Y_shape_j_fx[1], PULSES_FULL_LR, NFULL_LR, LS_ind_fx, (UWord32)L_mPVQ_ind_fx); + gainTab_fx = lrsns_vq_gainsQ12_fx[1]; move16(); /* 8 levels in 3 bits */ + + break; + case 2: /* fix env 0 , init_bell 12 signs */ + case 3: /* fix env 1 , decay 12-->6 12 signs */ + case 4: /* fix env 2 , start bell 12 signs */ + case 5: /* fix env 3 , early bell 10 signs */ + LS_ind_fx = aux_idx_fx; /* s0 */ move16(); + env_ind_fx = extract_l(L_sns_vq_idx_fx[4]); move16(); + ASSERT(env_ind_fx == (shape_idx_fx - 2)); + Word16 sign_mask_fx = 0x07ff; move16(); /* mask for 11 remaining signs */ + n_signs_fx = NSIGNS_FIX_012; move16(); /* number of signs including s0 */ + if (sub(env_ind_fx, 3) == 0) + { + n_signs_fx = NSIGNS_FIX_3; move16(); + } + sign_mask_fx = shr_pos_pos(sign_mask_fx, sub(NSIGNS_FIX_012, n_signs_fx)); + + shift_ind_fx = extract_l(L_shr_pos(L_sns_vq_idx_fx[5], sub(n_signs_fx, 1))); + sign_ind_fx = s_and(extract_l(L_sns_vq_idx_fx[5]), sign_mask_fx); + + /* put sign s0 , right next to s1 , to make the subsequent sign decoding loop straight fwd */ + sign_ind_fx = add(shl_pos(LS_ind_fx, sub(n_signs_fx, 1)), sign_ind_fx); /* s0 put as MSB at 12th position */ + + /*FixEnvShiftedSigns deenumeration */ + /* part of 30b total, 4xenv,4xshifts, 10 or12 signs , spread over 15 positions,*/ + FESSdeenum_fx(NFULL_LR, N_CANDS_FIX_LR, N_SHIFT_FIX, n_signs_fx, env_ind_fx, shift_ind_fx, sign_ind_fx, &Y_shape_j_fx[1]); + + gainTab_fx = lrsns_vq_gainsQ12_fx[2]; move16(); /* 8 levels in 3 bits */ + /* fix_envshift_nb_fx = env_ind_fx * 4 + shift_ind_fx; */ /* index for fast normalization lookup */ + break; + default: + ASSERT(0 && " LRSNS stage2 demux bad shape shape_idx_fx received from dec_entropy_fx "); + break; + } + + gainValQ12_fx = gainTab_fx[gain_idx_fx]; + + + /* enc/dec common Word32Q30 and Word16Q14 Unit energy normalization of the received shapes mPVQ or FESS */ + IF(sub(shape_idx_fx, 2) < 0) + { /* 0,1,2 :: PVQ(N,K) shape with up to 8 unit pulses */ + L_y_en = L_deposit_l(0); + FOR(i = 1; i < M; i++) + { + L_y_en = L_mac0(L_y_en, Y_shape_j_fx[i], Y_shape_j_fx[i]); + } + L_norm_factor = isqrt_Q31tab[L_y_en]; move32(); /* Q31 inv_sqrt value */ + norm_factorQ = lrsns_norm_factorQ_L[shape_idx_fx]; move16(); + y_upshift = lrsns_y_up_bits[shape_idx_fx]; move16(); + } + ELSE + { /* 2,3,4,5 :: FESS shapes with up to unit pulses */ + /* no energy calc required, only 16 different energies are possible */ + L_norm_factor = L_lrsns_fixenv_enNormQ35[add(shl_pos(env_ind_fx , 2), shift_ind_fx)]; move32(); /* Q19+16=Q35 */ + norm_factorQ = lrsns_norm_factorQ_L[2]; move16(); + y_upshift = lrsns_y_up_bits[2]; move16(); + } + + /* reuse common encoder/decoder unit energy normalization routine */ + ASSERT(Y_shape_j_fx[0] == 0); + pvq_fess_dec_en1_normQ30andQ14_fx(Y_shape_j_fx, y_upshift, L_norm_factor, norm_factorQ, M, L_Xq_shape_j_fx, Xq_shape_j_fx); + ASSERT(L_Xq_shape_j_fx[0] == 0 && Xq_shape_j_fx[0] == 0); + + /* Reconstruction of the quantized SNS scale factors */ +#ifdef ENABLE_HR_MODE + L_Xq_shape_j_fx[0] = 0; move32(); /* enforce no DC */ + idct32_32_fx(L_Xq_shape_j_fx, L_Xq_shape_j_fx); /* inplace idct */ + + /* move stage1 W16Q11 to W32Q27 */ + FOR(i = 0; i < M; i++) + { + L_scf_q_fx[i] = L_deposit_h(st1_scf_q_fx[i]); move32();/* stage1 W16Q11 to W32Q27 */ + } + lrsns_pvq_dec_scale_W32vec_fx(L_Xq_shape_j_fx, gainValQ12_fx, L_scf_q_fx /* W32Q27 in, W32Q26 out */, scf_q_fx /* out Q11*/); + +#else + /* DISABLE_HR */ + Xq_shape_j_fx[0] = 0; move16(); /* no DC */ + idct16_fx(Xq_shape_j_fx, Xq_shape_j_fx); /* inplace idct */ /* fwd in unscaled unit energy domain */ + + /* move stage1B into a W16 vector for accumulation in Q11 */ + basop_memcpy(scf_q_fx, st1_scf_q_fx, sizeof(*scf_q_fx)*M); + + /* scf_q_fx contains stage1 in Q11 */ + lrsns_pvq_dec_scale_W16vec_fx(Xq_shape_j_fx/* Q14 */, gainValQ12_fx, scf_q_fx /* Q11in, Q11out */); + + /* scf_q_fx is the final result incl. stage2 in Q11 */ +#endif /* DISABLE_HR */ + + } + ELSE + { /* -9, -10 */ + /* LRSNS stage 1 A,B,C */ + basop_memcpy(scf_q_fx, st1_scf_q_fx, sizeof(Word16) * M); /* Q11*/ + + FOR(i = 0; i < M; i++) + { + L_scf_q_fx[i] = L_shr_pos(L_deposit_h(scf_q_fx[i]), 1); /* 11+16-1 => Q26 */ + } + } + Dyn_Mem_Deluxe_Out(); + + return BER_dec; +} + +/* split out of LRSNS stage 1 functionality */ +Word32 snsQuantScfEncLRSt1ABC_fx(Word16* env, Word32* L_index, Word32 *L_min_mse_saveBCA_ptr_fx, + Word16* ind_saveB_ptr, Word16* st1_vectors, + Word16 pitch_rx, Word16 ltpf_rx, Word8 * scratch) +{ + + Dyn_Mem_Deluxe_In( + Counter i; + Word16 *st1_vector_fx, *st1_vectorA_fx, *st1_vectorB_fx, *st1_vectorC_fx, *target_fx; + Word32 L_min_mse_saveA_fx, L_min_mse_saveB_fx, L_min_mse_saveC_fx, L_min_mse_saveBC_fx; + Word16 ind_saveA_fx, ind_saveC_fx; + Word16 meanC_ind; + Word16 stage1_mode; /*0=A, 1=B, 2=C. -1==fail*/ + Word32 L_min_mse_saveB_fxlike_fx; + Word16 ind_saveB_fxlike_fx; + Word16 dc_fx; + Word32 L_tmp; + Word16 *st1_vectorB_idx_fx; + ); + + stage1_mode = -1; /* output */ + + st1_vectorB_idx_fx = scratchAlign(scratch, 0); + target_fx = scratchAlign(scratch, sizeof(*st1_vectorB_idx_fx) * M); + +#ifdef LRSNS_CBC_NO_LTPF_DEPENDENCY + UNUSED(ltpf_rx); +#endif + st1_vectorA_fx = &(st1_vectors[0]); + st1_vectorB_fx = &(st1_vectors[1 * M]); + st1_vectorC_fx = &(st1_vectors[2 * M]); + st1_vector_fx = &(st1_vectors[3 * M]); /*selected winner */ + +#ifdef WMOPS + push_wmops("snsQuantScfEncLRSt1ABC_fx"); +#endif + + /* snslr stage1 B(170) and C(170), A(2) evaluation */ + /* + segm idx9b + + ------+--------+--------+------- + B | 0--169 | aux==0 , 170 entries + ------+--------+-------- + C | 170-339| aux==1 , 170 entries, + ------+--------+--------+ + * | 341-509| aux==2 , 170 entries (later decided to be B + aux bit) + ------+--------+--------- + A | 510,511| 2 entries, 9 bit total + ------+--------+-------- + */ +#ifdef WMOPS + push_wmops("MSEsearchCbA_fx"); +#endif + + + { /* stage 1 section A(2), a very small 2xM entry cb */ + /* two crude vector MSE_calculations needed */ + + basop_memcpy(target_fx, env, sizeof(Word16)*M); + + ind_saveA_fx = MSEsearchGeneric_fx(target_fx, lrsns_cbA_fx, M, 2, &L_min_mse_saveA_fx); + + basop_memcpy(st1_vectorA_fx, &(lrsns_cbA_fx[ind_saveA_fx*M]), sizeof(Word16)*M); + } +#ifdef WMOPS + pop_wmops(); +#endif + + +#ifdef WMOPS + push_wmops("MSEsearchCbB_fx"); +#endif + { /* stage1 section B(170) MSE analysis */ + basop_memcpy(target_fx, env, sizeof(Word16)*M); + *ind_saveB_ptr = -1; move16(); + + ind_saveB_fxlike_fx = MSEsearchCbBIdxMap_fx(target_fx, st1SCF0_7_base5_32x8_Q11, st1SCF8_15_base5_32x8_Q11, + lrsns_st1B_merged170orderSortedSegmCum_fx, lrsns_st1B_merged170orderSort12bitIdx_fx, M, 170, &L_min_mse_saveB_fxlike_fx); /*st1B LF,HF idx lookup search 170 ,170 Word16s , 0.34kB ROM */ + + snslr_st1B_vector_dec_fx(ind_saveB_fxlike_fx, st1SCF0_7_base5_32x8_Q11, st1SCF8_15_base5_32x8_Q11, lrsns_st1B_merged170orderSortedSegmCum_fx, lrsns_st1B_merged170orderSort12bitIdx_fx, + st1_vectorB_idx_fx); + + *ind_saveB_ptr = ind_saveB_fxlike_fx; move16(); + L_min_mse_saveB_fx = L_min_mse_saveB_fxlike_fx; move32(); + basop_memcpy(st1_vectorB_fx, st1_vectorB_idx_fx, sizeof(Word16)*M); /*use low ROM version */ + + { + /* remove the DC that can remain in the LF,HF index stored stage cbB structure */ + /* a very slight off-line decrease in perf 0.001 dB in AveSD when searching with DC above, + but it allows much better stage1 ROM-reuse performance */ + + dc_fx = snslr_remove_st1_DC_fQ11_fx(st1_vectorB_fx, M); /* in-place removal of dc in st1_vectorB */ + + ASSERT(L_min_mse_saveB_fx >= 0L); + + dc_fx = shl_pos(dc_fx, 2); /* mult dc_fx with sqrt(M) */ + L_tmp = L_msu0(L_min_mse_saveB_fx, dc_fx, dc_fx); + + /* force the MSE B to be zero or larger*/ + /* may happen due to imperfect(truncation) DC removal */ + L_min_mse_saveB_fx = L_max(L_tmp, 0L); + } + } /* end of stage 1 section B , search */ +#ifdef WMOPS + pop_wmops(); +#endif + +#ifdef WMOPS + push_wmops("MSEsearchCbC_fx"); +#endif + meanC_ind = pitch_rx; move16(); +#ifndef LRSNS_CBC_NO_LTPF_DEPENDENCY + if (ltpf_rx != 0) + { + meanC_ind = add(meanC_ind, 1); + } +#else + /* CbC only dependent on LTP transmission on/off */ +#endif + Word32 L_mse_tmpQ22 = L_min(Mpy_32_16_lc3plus(L_min_mse_saveA_fx, SNSLR_A_CNST_WEIGHT), L_min_mse_saveB_fx); + + /* apply skipC threshold of 3.97 in Q22 */ + IF(L_sub(L_mse_tmpQ22, 16651387L) < 0) /* to skip C search if SD is already low enough < 1.5dB (msesum=3.97)) to save average WMOPS */ + { + /* search stage1C */ /* made adaptive on stage1 BA MSE sofar */ + L_min_mse_saveC_fx = (23404216L << 1); move32();/* disable C selection in consecutive logic */ + ind_saveC_fx = 0; move16();/* a valid index that will not be used */ + } + ELSE + { + /* search another set (pitch dependent section C) of 170 mean residual vectors */ + /* pitch_info rx used to selects a mean and then a trained residual 1x170W8 based harmonic outlier table */ + /* float means were based on Word16 S16Q11 values, so that BASOP and float always may become BE in synthesis*/ + FOR(i = 0; i < M; i++) { + target_fx[i] = sub(env[i], lrsns_st1CTrainedMapMeans_fx[meanC_ind][i]); + } + + + Word32 ind_saveC_ScaledW8_fx; + Word32 L_min_mse_saveC_ScaledW8_fx; + + ind_saveC_ScaledW8_fx = MSEsearchGenericScaledW8_fx(target_fx, lrsns_st1C_Both_Word8_fx, + lrsns_st1C_Both_scaleQ4_7p4bits_fx[1], lrsns_st1C_Both_inv_scaleQ15_7p4bits_fx[1], + M, 170, &(L_min_mse_saveC_ScaledW8_fx)); + + snslr_st1C_vector_dec_fx(ind_saveC_ScaledW8_fx, lrsns_st1C_Both_Word8_fx, lrsns_st1C_Both_scaleQ4_7p4bits_fx[1], lrsns_st1C_Both_inv_scaleQ15_7p4bits_fx[1], + M, 170, + st1_vectorC_fx + ); + + ind_saveC_fx = ind_saveC_ScaledW8_fx; + L_min_mse_saveC_fx = L_min_mse_saveC_ScaledW8_fx; + + FOR(i = 0; i < M; i++) + { + st1_vectorC_fx[i] = add(st1_vectorC_fx[i], lrsns_st1CTrainedMapMeans_fx[meanC_ind][i]); /* Q11 means*/ + } + +#ifdef FIX_BASOP_ENC_LRSNS_CBC_MSE + /* CB_C MSE search loop in BASOP is using lower resolution, than and the best possible calculation */ + /* recalc CB_C MSE with Q22 precision for a best possible CB decision */ + MSEsearchGeneric_fx(env, st1_vectorC_fx, M, 1, &L_min_mse_saveC_fx); /* reuse of search to get MSE for 1 vector */ +#endif + + } +#ifdef WMOPS + pop_wmops(); +#endif + + + /* BC stage1 comparison */ + /* initially assume B as stage 1 winner */ + L_min_mse_saveBC_fx = L_min_mse_saveB_fx; move32(); + L_index[0] = L_deposit_l(*ind_saveB_ptr); /* 0...169 */ + + basop_memcpy(st1_vector_fx, st1_vectorB_fx, sizeof(Word16)*M); /* stage 1 segmentB result without DC copied as base for st2 */ + + { + IF(L_sub(L_min_mse_saveC_fx, L_min_mse_saveBC_fx) < 0) + { /* C better than B */ + L_min_mse_saveBC_fx = L_min_mse_saveC_fx; move32(); + L_index[0] = L_add(170L, L_deposit_l(ind_saveC_fx)); /* [2x 170] (9+3)b [ 0..169], [170-339] , ">=170" is a signal to multiplexor */ + basop_memcpy(st1_vector_fx, st1_vectorC_fx, sizeof(Word16)*M); + } + L_index[1] = -10; move32(); + ASSERT(L_min_mse_saveBC_fx >= 0.0); + + /* (9(A)<->10(BC) bit weighted comparison */ + *L_min_mse_saveBCA_ptr_fx = L_min_mse_saveBC_fx; move32(); + IF(L_sub(Mpy_32_16_lc3plus(L_min_mse_saveA_fx, SNSLR_A_CNST_WEIGHT), L_min_mse_saveBC_fx) < 0) /* a minor favouring of the 9b vector results sqrt(0.875) => approx 0.6dB level domain */ + { + L_index[0] = L_add(510L, L_deposit_l(ind_saveA_fx)); /* only [510,511] possible */ + L_index[1] = -9; + + basop_memcpy(st1_vectorA_fx, &(lrsns_cbA_fx[ind_saveA_fx*M]), sizeof(Word16)*M); + basop_memcpy(st1_vector_fx, st1_vectorA_fx, sizeof(Word16)*M); + + *L_min_mse_saveBCA_ptr_fx = Mpy_32_16_lc3plus(L_min_mse_saveA_fx, SNSLR_A_CNST_WEIGHT); /* Q22 */ + } + } + + /* index0_saveBCA = index[0];*/ /* 0...511 */ + /* index1_saveBCA = index[1];*/ /* -9 or -10 */ + + stage1_mode = 2; move16(); /* cbC */ + if (L_sub(L_index[0], 510L) >= 0) { + stage1_mode = 0; move16(); /* cbA */ + } + if (L_sub(L_index[0], 169L) <= 0) { + stage1_mode = 1; move16();/* cbB */ + } + +#ifdef WMOPS + pop_wmops(); +#endif + + Dyn_Mem_Deluxe_Out(); + + return stage1_mode; /* return best mode */ +} + +/* top level lrsns BASOP code calling both st1 and st2 */ +Word16 snsQuantScfEncLR_fx( /* o: bits spent on LRSNS-VQ envelope */ + Word16 scf_fx[], /* i: input scf M W16Q11 */ + Word32 *L_index_fx, /* o: SNS indeces . */ +#ifdef ENABLE_HR_MODE + Word32 *L_scf_q_fx, /* o: quantizefl_env scf M ? W32Q11 or W32Q27 */ +#else + Word16 *scf_q_fx, /* o: quantizefl_env scf M W16Q11 */ +#endif + Word16 pitch_rx_fx, /*i: 0 or 1 */ + Word16 ltpf_rx_fx, /*i: o or 1 */ + Word8 * scratch) +{ + + Dyn_Mem_Deluxe_In( + Counter col; + + Word16 *st1_vectorA_fx, *st1_vectorB_fx, *st1_vectorC_fx, *st1_vector_fx; + Word16 ind_saveB_fx; + Word16 st1_mode_fx; + Word16 envelope_bits_fx; /* output */ + Word32 L_min_mse_saveBCA_Q22_fx; + + Word16 gain_idx_fx; /* gain index 0..3, 0..7, 0..7 */ + Word16 s_idx_fx; /* shape index 0 =split, 1 = full, 2= fix*/ + Word16 shape_idx_fx; /* expanded shape index 0 ..5 */ + Word32 L_mse_st1B_st2_Q22_fx; + Word16 *y_split_fx, *y_full_fx, *y_fix_fx; + Word16 gainValQ12_fx; /* output from PVQ search */ + Word16 fixShapeNb; + Word16 fixShiftIdx; + + /* scratch ptrs */ + Word16 *st1_vectors_fx; + Word16 *target_st2_fx; + Word8 *scratch_ABC_fx; + Word32 *L_target_st2_fx; /* req. for dct32 use */ + Word16 *pvq_target_fx; + Word32 *L_pvq_target_fx; + Word16 *y_Q0; + Word16 *y_normQ14_fx; + Word32 *L_y_normQ30_fx; + Word8 *scratch_pvq_fess_fx; + ); + + +#ifdef ENABLE_HR_MODE + Word16 scf_q_fx[M]; /* W16Q11 always in use also for HR_MODE */ + UNUSED(scf_q_fx); +#endif + UNUSED(st1_mode_fx); + UNUSED(st1_vectorA_fx); + UNUSED(st1_vectorC_fx); + + st1_mode_fx = -1; move16(); + envelope_bits_fx = -1; move16(); /* output information */ + shape_idx_fx = 0; move16(); + + st1_vectors_fx = (Word16*)scratchAlign(scratch, 0); + scratch_ABC_fx = (Word8*)scratchAlign(st1_vectors_fx, sizeof(*st1_vector_fx) * M * 4); + target_st2_fx = (Word16*)scratch_ABC_fx; + L_target_st2_fx = (Word32*)scratchAlign(target_st2_fx, sizeof(*target_st2_fx) * M); + + pvq_target_fx = (Word16*)scratchAlign(L_target_st2_fx, sizeof(*L_target_st2_fx) * M); + L_pvq_target_fx = (Word32*)scratchAlign(pvq_target_fx, sizeof(*pvq_target_fx) * M); + y_Q0 = (Word16*)scratchAlign(L_pvq_target_fx, sizeof(*L_pvq_target_fx) * M); + y_normQ14_fx = (Word16*)scratchAlign(y_Q0, sizeof(*y_Q0) *SNSLR_MAX_PVQ_SEARCH_CAND*M); + L_y_normQ30_fx = (Word32*)scratchAlign(y_normQ14_fx, sizeof(*y_normQ14_fx) *SNSLR_MAX_PVQ_SEARCH_CAND*M); + scratch_pvq_fess_fx = (Word8*)scratchAlign(L_y_normQ30_fx, sizeof(*L_y_normQ30_fx) * SNSLR_MAX_PVQ_SEARCH_CAND * M ); + + y_split_fx = &(y_Q0[0 * M]); /* ptr init */ + y_full_fx = &(y_Q0[1 * M]); /* ptr init */ + y_fix_fx = &(y_Q0[2 * M]); /* ptr init */ + + st1_vectorA_fx = &(st1_vectors_fx[0]); /* ptr init */ + st1_vectorB_fx = &(st1_vectors_fx[1 * M]); + st1_vectorC_fx = &(st1_vectors_fx[2 * M]); + st1_vector_fx = &(st1_vectors_fx[3 * M]); /* best vector */ + + FOR(col = 0; col < SCF_MAX_PARAM; col++) + { + L_index_fx[col] = L_sub(-32000, col); move32(); /* safety init parameters to be fwd'ed to LRSNS VQ multiplexor */ + } + + /* Stage 1 Cb's A,B,C */ + ind_saveB_fx = -1; + L_min_mse_saveBCA_Q22_fx = M * 32 * 32; move32(); + + st1_mode_fx = snsQuantScfEncLRSt1ABC_fx( + scf_fx, L_index_fx, &L_min_mse_saveBCA_Q22_fx, &ind_saveB_fx, st1_vectors_fx, + pitch_rx_fx, ltpf_rx_fx, scratch_ABC_fx); + + Word32 L_mse_lim_smooth_Q22_fx = 22691185L; /* round(5.41*pow(2.0, 22.0))*//* 1.75 dB */ + + /* mse_st1B_st2_fl = 2.0* min_mse_saveBCA + 1.0;*/ /* safety indicate that st1B+st2 is not used by setting a higher MSE than st1BCA */ + L_mse_st1B_st2_Q22_fx = L_add(L_shl_pos(L_min_mse_saveBCA_Q22_fx, 1), (1L << 22)); /* set st1B+st2 to a safety bad MSE value */ + + + IF((L_sub(L_min_mse_saveBCA_Q22_fx, L_mse_lim_smooth_Q22_fx) > 0)) + { /* stage 2 analysis */ + /* prepare stage2 W16 target */ + FOR(col = 0; col < M; col++) + { + target_st2_fx[col] = sub(scf_fx[col], st1_vectorB_fx[col]); /* Q11 */ + } + + /* both ENABLE_HR and DISABLE_HR runs the same analysis DCT-II(16) */ + /* for analysis use 16 bit i/o Word16 constants, but Word32 internal states in DCT-II(M=16) */ + basop_memcpy(pvq_target_fx, target_st2_fx, M * sizeof(*pvq_target_fx)); + + dct16_W32int_fx(pvq_target_fx, pvq_target_fx); /* Q11 to Q11, enc-side analysis with W16 i/o internally W32 precision */ + + pvq_target_fx[0] = 0; move16(); + + /* PVQ FESS search, include norm , shape search and Q gain search */ + /* NB IDCT-II __not__ run in stage2 shape and gain search */ + pvq_fess_enc_search_fx( + pvq_target_fx, + y_Q0, + y_normQ14_fx, /* normally calculated for DISABLE_HR_MODE */ + L_y_normQ30_fx, /* calculated for both DISABLE_HR_MODE and ENABLE_HR_MODE */ + &s_idx_fx/*[0,1,2]*/, + &gain_idx_fx/* [0...7]*/, + &gainValQ12_fx, + &fixShapeNb, /* 0,1,2,3, [-1] */ + &fixShiftIdx, /* 0,1,2,3, [-1] */ + &L_mse_st1B_st2_Q22_fx, + scratch_pvq_fess_fx); + + + /* update to shape idx to one of 0...5 ] */ + shape_idx_fx = s_idx_fx; move16(); + if (sub(shape_idx_fx, 2) == 0) + { + shape_idx_fx = add(shape_idx_fx, fixShapeNb); /* [0..5] */ + } + } + ELSE + { /* indicate complete skipping of stage2 search, stage1 is good enough */ + L_mse_st1B_st2_Q22_fx = INT32_MAX; move32(); + /*copy of best stage 1 to proper output , done below */ + } + + IF(L_sub(L_mse_st1B_st2_Q22_fx, L_min_mse_saveBCA_Q22_fx) > 0) + { + /* skip IDCT, as stage2 will not be used */ + //L_mse_st1B_st2_Q22_fx = L_mse_st1B_st2_Q22_fx; /* dummy op */ + } + ELSE + { +#ifdef ENABLE_HR_MODE + /* apply IDCT-II on the Q30 unit energy normalized vector */ + Word32 L_tmp_vec_fx[M]; + Word32* L_y_norm_fx = &(L_y_normQ30_fx[s_idx_fx*M]); move32(); + + ASSERT(L_y_norm_fx[0] == 0); + /* 32x32 bit dec IDCT-II analysis, with W32 internal constants */ + idct32_32_fx(L_y_norm_fx, L_tmp_vec_fx); /* currently Q30 to Q30 , can also be inplace */ + /* idct32_32_fx:: 162.712 dBSegSNR, minSNR = 157.979, WMOPS 0.26 */ +#else + Word16 tmp_vec_fx[M]; + /* apply IDCT-II on the Q14 unit energy normalized vector */ + + Word16* y_norm_fx = &(y_normQ14_fx[s_idx_fx*M]); move32(); + ASSERT(y_norm_fx[0] == 0); + idct16_fx(y_norm_fx, tmp_vec_fx); /* idct16_fx:: segsnr 73.7 /minsnr 67.65 , 0.118 WMOPS using mult_r) */ +#endif /* HR_MODE*/ + +#ifdef ENABLE_HR_MODE + /* move stage1 W16Q11 to W32Q27 */ + FOR(col = 0; col < M; col++) + { + L_scf_q_fx[col] = L_deposit_h(st1_vectorB_fx[col]); /* W16Q11 to W32Q27 */ + } + lrsns_pvq_dec_scale_W32vec_fx(L_tmp_vec_fx, gainValQ12_fx, L_scf_q_fx /* W32Q27 in, W32Q26 out */, scf_q_fx /* W16Q11 out */); +#else + /* non HR */ + /* move stage1B into a W16 vector for accumulation in Q11 */ + basop_memcpy(scf_q_fx, st1_vectorB_fx, sizeof(*scf_q_fx)*M); + + /* scf_q_fx contains stage1 in Q11*/ + lrsns_pvq_dec_scale_W16vec_fx(tmp_vec_fx/*Q14*/, gainValQ12_fx, scf_q_fx /* Q11 */); /* scf_q_fx is the final result incl. stage2 in Q11 */ + +#endif /* ENABLE_HR_MODE */ + } + + + /* post-evaluate if one of (st1B, st1C, st1A) was actually better than st1B+stage2 */ + + IF(L_sub(L_mse_st1B_st2_Q22_fx, L_min_mse_saveBCA_Q22_fx) <= 0) + { + /* use stage1B + st2 at 29b or 30b bits total cost */ + L_index_fx[0] = L_deposit_l(ind_saveB_fx); move32(); + L_index_fx[1] = L_deposit_l(2930); move32(); /* later stage2 aux value LS_splitLF or LS_full or s0, put here as a 0 or 1 */ + L_index_fx[2] = L_deposit_l(shape_idx_fx); move32(); /* 0=splitLF, 1=full, ( 2=fixEnv0, 3=fixEnv1, 4: fixEnv2, 5: fixEnv3 ) */ + L_index_fx[3] = L_deposit_l(gain_idx_fx); move32(); /* gain idx with a shape dependent number of levels (4 or 8 levels ) */ + + basop_memcpy(st1_vector_fx, st1_vectorB_fx, sizeof(*st1_vectorB_fx)*M); + /* final result st1 in combination with stage 2, kept now for verification at decoder */ + + envelope_bits_fx = 29; move16(); /* 'LR_splitLF' bitrate */ + test(); + if (shape_idx_fx > 0) { + envelope_bits_fx = add(envelope_bits_fx, 1); /*30 'LR_full/LR_fixenv' */ + } + + { + /* DBG check values */ + ASSERT(shape_idx_fx >= 0); + ASSERT(envelope_bits_fx >= 29); + ASSERT(L_index_fx[0] <= 170); /*only B allowed */ + ASSERT(L_index_fx[1] >= 0); + + ASSERT(gain_idx_fx >= 0); /*gain index*/ + ASSERT(gainValQ12_fx > 0); /* gain value */ + } + } + ELSE + { /*stick to stage1(best of BCA) at 9 or 10 bits */ + ASSERT(L_index_fx[1] < 0 && L_index_fx[0] >= 0 && L_index_fx[0] < 512); + envelope_bits_fx = ((L_index_fx[0] >= 510) ? 9 : 10); + shape_idx_fx = -envelope_bits_fx; /* signal an invalid stage2 shape number to enc-entropy */ +#ifdef ENABLE_HR_MODE + FOR(col = 0; col < M; col++) + { + L_scf_q_fx[col] = L_shl_pos(st1_vector_fx[col], 16 - 1); move32(); /* W16Q11 to W32Q26 */ + } +#else + basop_memcpy(scf_q_fx, st1_vector_fx, M * sizeof(*scf_q_fx)); /* output */ +#endif + + gainValQ12_fx = 0; move16(); + + gain_idx_fx = -1; move16(); /* L_index sentinel */ + L_index_fx[2] = shape_idx_fx; move32(); + } + + /******************************************************************/ + /* signal to enc_entropy_fx for LRSNS semi-fractional multiplexing */ + /******************************************************************/ + /* integer multiplexing 29/30 bit modes into intermediate unmuxed integer indeces 0...7 */ + /* a bit of fractional multiplexing for the L_index_fx 0...7 is done later, in function enc_entropy_fx() */ + test(); + IF(shape_idx_fx >= 0) + { /* stage 2 multiplexing manipulations */ + Word16 fix_end_sign_fx; + + PvqEntry_fx enc_PVQ_A, enc_PVQ_B; + + test(); + IF(shape_idx_fx == 0) + { /* splitLF shape */ + Word16 n5k = 0; + FOR(col = 1; col < 6; col++) + { + n5k += abs_s(y_split_fx[col]); + } + + IF(sub(n5k, PULSES_SPLIT_A_LR) == 0) + { + /* this (6+2) pulses over NA+NB=5+8, is expected to be more frequent than 8 pulses over NA=5 */ + enc_PVQ_A = mpvq_index_fx(&(y_split_fx[1]), NA_LR, PULSES_SPLIT_A_LR); /* P(N=5,K=6) (10)=10 bit L_index */ + L_index_fx[4] = (Word32)enc_PVQ_A.index; move32(); + L_index_fx[1] = L_deposit_l(enc_PVQ_A.lead_sign_ind); /* aux bit for the splitLF path , we plant the first LS there */ + + enc_PVQ_B = mpvq_index_fx(&(y_split_fx[1 + NA_LR]), NB_LR, PULSES_SPLIT_B_LR); + L_index_fx[5] = L_mac0(L_shl_pos((Word32)enc_PVQ_B.index, 1), 1, enc_PVQ_B.lead_sign_ind); move32(); /* A full PVQ 7 bit index for the P(N=8,K=2) B config*/ + + assert(L_index_fx[5] >= 0); + } + ELSE + { + ASSERT(n5k == (PULSES_SPLIT_A_LR + PULSES_SPLIT_B_LR));/* PVQ(N=5,K=8) (12.x in total, i.e. LS+ 11.x ) */ + enc_PVQ_A = mpvq_index_fx(&(y_split_fx[1]), NA_LR, PULSES_SPLIT_A_LR + PULSES_SPLIT_B_LR); + L_index_fx[4] = (Word32)enc_PVQ_A.index; + L_index_fx[1] = L_deposit_l(enc_PVQ_A.lead_sign_ind); /* aux bit for the splitLF path , we plant the first LS there */ + L_index_fx[5] = L_deposit_l(-8); /* signal LF PVQ(5,k=8) and zeroed HF(10,0) apart */ + } + } + IF(sub(shape_idx_fx, 1) == 0) + { /* full (15,5), LS kept separated */ + enc_PVQ_A = mpvq_index_fx(&(y_full_fx[1]), NFULL_LR, PULSES_FULL_LR);/* mPVQ 16.66 bits in index[4], and LS 1 bit in index[1] */ + L_index_fx[4] = (Word32)enc_PVQ_A.index; move32(); + L_index_fx[1] = L_deposit_l(enc_PVQ_A.lead_sign_ind); + } + + IF(sub(shape_idx_fx, 2) >= 0) + { /* fixEnv0, fixEnv1, fixEnv2, fixEnv3 */ + ASSERT(shape_idx_fx <= 5); + /* send the fixed env subshape mode to enc_entropy */ + L_index_fx[4] = L_deposit_l(sub(shape_idx_fx, 2)); /* env shape, 0-->"1" , 1--> "env1" */ /* L_index[2] has original shape 0...5 */ + + ASSERT(fixShapeNb == L_index_fx[4]); + ASSERT(fixShiftIdx < (1 << 2)); + + Word16 tmp1 = add(1, fixShiftIdx); + + /* aux_bit : 0 (or 1) , will indicate the s0 sign in the FESS fix shape */ + L_index_fx[1] = 0L; move32(); /* s0 positive */ + test(); + if (y_fix_fx[tmp1] < 0) + { + L_index_fx[1] = 1L; move32(); /* s0 negative*/ + } + + fix_end_sign_fx = 12; move16(); + if (sub(shape_idx_fx, 5) == 0) + { + ASSERT(L_index_fx[4] == 3L); /* final fix_envelope only has 10 signs */ + fix_end_sign_fx = 10; move16(); /* shape 5 has 2 bits shift and a total of 10 signs =2^10*2^2 = 2^12 = 4096 */ + } + + Word16 tmp = fixShiftIdx; move16(); /* the two shift bits will be pushed up to b11,b12, for 11 signs s1-s11 */ + + /* sign loop */ + FOR(int sign_ind_fx = 1; sign_ind_fx < fix_end_sign_fx; sign_ind_fx++) /* push the remaining sequential signs s1-s11(or s1-s9), into a single idx */ + { /* s1 is in the MSB, and s11 is in the LSB*/ + tmp = shl_pos(tmp, 1); /* shift in a zero */ + test(); + if (y_fix_fx[add(tmp1, sign_ind_fx)] < 0) /* "1" indicates negative, "0" means positive */ + { + tmp = add(tmp, 1); + } + } + L_index_fx[5] = L_deposit_l(tmp); + + ASSERT(L_index_fx[5] >= 0 && L_index_fx[5] < (1 << (2 + (fix_end_sign_fx - 1)))); + } + } /* end of stage2 premultiplexing , fractional packing aspects done within enc_entropy_fx() */ + + ASSERT(envelope_bits_fx == 9 || envelope_bits_fx == 10 || envelope_bits_fx == 29 || envelope_bits_fx == 30); + + Dyn_Mem_Deluxe_Out(); + return envelope_bits_fx; +} + +/* LRSNS function needed in both encoder and decoder */ +Word16 snslr_remove_st1_DC_fQ11_fx( /* o : dc in Q11 */ + Word16 *scfq, /* i/o: stage1B vector in Q11 */ + Word16 len /* i : length Q0 */ +) +{ + Dyn_Mem_Deluxe_In( + Counter i; + Word32 L_dcQ11; + Word16 dcQ11; + ); + assert(len == 16); +#ifdef WMOPS + push_wmops("snslr_remove_st1_DC_fQ11_fx"); +#endif + + L_dcQ11 = 0; move32(); + + for (i = 0; i < len; i++) { + L_dcQ11 = L_mac0(L_dcQ11, scfq[i], 2048); + } + dcQ11 = extract_h(L_shl_pos(L_dcQ11, 1)); /*NB ! same truncation needed in both CFL and in basop */ + + for (i = 0; i < len; i++) + { + scfq[i] = sub(scfq[i], dcQ11); move16(); /* result update */ + } + +#ifdef WMOPS + pop_wmops(); +#endif + Dyn_Mem_Deluxe_Out(); + + return dcQ11; /* output used for encoder side mse update*/ +} + + +void snslr_st1B_vector_dec_fx(Word16 idx, const Word16* LFCB, const Word16 *HFCB, const Word16* seg_cnt_cum, const Word16* idx12b_cb, Word16 *st1B_vectorQ11) +{ + /* decompose the received 0... 169 index , into the correct integer and float st1B vector */ + Dyn_Mem_Deluxe_In( + Counter i; + const Word16 *lf_cb, *hf_cb; + + Word16 seg_fx; + Word16 idx_12b_fx, lf_sign_fx; + Word16 hf_sign_fx; + Word16 idx_HF_fx; + Word16 idx_LF_fx; + Word16 st1B_W16Q11_fx[M]; + Word16 buf[M]; + ); + +#ifdef WMOPS + push_wmops("snslr_st1B_vector_dec_fx"); +#endif + assert(idx >= 0 && idx < 170); + + + seg_fx = 0; move16(); + WHILE(sub(seg_cnt_cum[add(seg_fx, 1)], idx) <= 0) + { + seg_fx = add(seg_fx, 1); + } + + assert(seg_fx >= 0 && seg_fx < 4); + + idx_12b_fx = idx12b_cb[idx]; /* indirect lookup from sequential value to a coded 12b index*/ + + lf_sign_fx = 1; move16(); /* assume a 0 bit -> "+" */ + if (s_and(0x0800, idx_12b_fx) != 0) { + lf_sign_fx = -1; move16(); /* assume a 1 bit -> " -" */ + } + + hf_sign_fx = 1; move16(); /* assume a 0 bit -> "+" */ + if ((s_and(0x0400, idx_12b_fx)) != 0) { + hf_sign_fx = -1; move16(); /* assume a 1 bit -> "-" */ + } + idx_LF_fx = shr_pos(s_and(0x03e0, idx_12b_fx), 5); + idx_HF_fx = s_and(0x001f, idx_12b_fx); + + /* extseg0 f,f */ + lf_cb = &(LFCB[idx_LF_fx*(M / 2)]); L_mult(0, 0); /* mult and pointer init */ + hf_cb = &(HFCB[idx_HF_fx*(M / 2)]); L_mult(0, 0); /* mult and pointer init */ + + FOR(i = 0; i < (M / 2); i++) + { + st1B_W16Q11_fx[i] = i_mult(lf_sign_fx, lf_cb[i]); /* imult() to switch sign without changing dynamics*/ + st1B_W16Q11_fx[M / 2 + i] = i_mult(hf_sign_fx, hf_cb[i]); + } + + basop_memcpy(buf, st1B_W16Q11_fx, sizeof(*buf)*M); /* buffer cpy needed for reversal sections */ + + IF(s_and(seg_fx, 0x0002) != 0) + { /* r,* */ /* flip LF */ + FOR(i = 0; i < (M / 2); i++) + { + st1B_W16Q11_fx[i] = buf[(M / 2 - 1) - i]; move16(); + } + } + + IF(s_and(seg_fx, 0x0001) != 0) + { /* *,r */ /* flip HF */ + FOR(i = 0; i < (M / 2); i++) + { + st1B_W16Q11_fx[(M / 2) + i] = buf[(M - 1) - i]; move16(); + } + } + + basop_memcpy(st1B_vectorQ11, st1B_W16Q11_fx, M * sizeof(*st1B_vectorQ11)); + +#ifdef WMOPS + pop_wmops(); +#endif + Dyn_Mem_Deluxe_Out(); +} + +Word16 MSEsearchCbBIdxMap_fx(const Word16 *scf, const Word16 *LFCB, const Word16 *HFCB, const Word16 *seg_cnt_cum, const Word16* idx12b_cb, Word16 v_len, Word16 cb_len, Word32* min_mse) +{ + Dyn_Mem_Deluxe_In( + + Counter seg, i, j; /*counters */ + + Word16 scfLF_Q11[M]; + + Word16* scfHF_Q11; + const Word16 *lf_cb, *hf_cb; + Word16 idx_12b, signbitLF, signbitHF, idx_LF, idx_HF; + Word32 L_mse_best_fx; + Word16 best_ind; + ); + UNUSED(v_len); + UNUSED(cb_len); + Word32 L_tEnBy2; + Word32 L_cbEnBy2; + Word32 L_mseBy2; /* sum( t_i^2 + cbB_i^2 - 2*t_i*cbB_i )/2 */ + + + + + /* MSE separated into targetEn + vectorB_en - 2 *correlation t*cbB */ + /* vectorBenergy is obtained from addition of two Word32 lookup tables LFen and HFen */ + + +#ifdef WMOPS + push_wmops("MSEsearchCbBIdxMap_fx"); +#endif + + L_mse_best_fx = INT_MAX; move32(); + best_ind = -1; /*for debug*/ + + assert(v_len == M); + + L_tEnBy2 = L_mult0(scf[0], scf[0]); + FOR(i = 1; i < M; i++) + { + L_tEnBy2 = L_mac0(L_tEnBy2, scf[i], scf[i]); /* calc target Energy part of MSE */ + } + L_tEnBy2 = L_shr_pos_pos(L_tEnBy2, 1); + + + scfHF_Q11 = (&scfLF_Q11[M / 2]); /* ptr init */ + + FOR(seg = 0; seg < 4; seg++) + { + basop_memcpy(scfLF_Q11, scf, M * sizeof(*scfLF_Q11)); + /*seg==0: fwd, fwd *//*seg==1: fwd, rev *//*seg==2: fwd, fwd */ /*seg==3: rev, rev */ + + IF(s_and(seg, 0x0002) != 0) + { /* {r,*} */ /* flip LF */ + FOR(i = 0; i < (M / 2); i++) + { + scfLF_Q11[i] = scf[(M / 2 - 1) - i]; move16(); + } + } + IF(s_and(seg, 0x0001) != 0) + { /* {*,r} */ /* flip HF */ + FOR(i = 0; i < (M / 2); i++) + { + scfHF_Q11[i] = scf[(M - 1) - i]; move16(); + } + } + + FOR(i = seg_cnt_cum[seg]; i < seg_cnt_cum[add(seg, 1)]; i++) + { + /* Note: these 4 subindex extractions can be in parallel */ + idx_12b = idx12b_cb[i]; /* tmp variable, indirect adressing lookup of 12b index pointing to LF and HF + individual sign swaps */ + + idx_LF = shr_pos_pos(s_and(0x03e0, idx_12b), 5); /* b9...b5 */ + idx_HF = s_and(0x001f, idx_12b); /* b4...b0 lowest 5 bits */ + + L_cbEnBy2 = L_add(lrsns_st1B_enBy2TabW32_fx[idx_LF], lrsns_st1B_enBy2TabW32_fx[32 + idx_HF]); /* ptr init to HF tab*/ + + signbitLF = s_and(0x0800, idx_12b); /* b11 logical 0 or 2048 */ + signbitHF = s_and(0x0400, idx_12b); /* b10 logical 0 or 1024 */ + + /* conditional update of signed section offsets */ + if (signbitLF != 0) + { + idx_LF = add(idx_LF, 32); /* point to negated part of lf_cb */ + } + if (signbitHF != 0) + { + idx_HF = add(idx_HF, 32); /* point to negated part of hf_cb */ + } + + lf_cb = &(LFCB[idx_LF * M / 2]); /* adaptive ptr init */ + hf_cb = &(HFCB[idx_HF * M / 2]); /* adaptive ptr init */ + + L_mseBy2 = L_add(L_tEnBy2, L_cbEnBy2); /* in ARM one op per cbB idx [0..169] can likely be saved by adding targetEnergyBy2 last */ + + /* mse/2 = tEn^2/2 + cbEn^2/2 - corr(target_v, (sign)*cb_v ) */ + FOR(j = 0; j < (M / 2); j++) + { + /* cycles saved by extending the LF and HF tables with negated versions */ + L_mseBy2 = L_msu0(L_mseBy2, scfLF_Q11[j], lf_cb[j]); /* acc with -1 * t*c , cb sign set by lf_cb */ + L_mseBy2 = L_msu0(L_mseBy2, scfHF_Q11[j], hf_cb[j]); /* acc -1* t*c with cb sign set by hf_cb ptr */ + } + ASSERT(L_mseBy2 >= 0); + /* always update best case */ + L_mse_best_fx = L_min(L_mseBy2, L_mse_best_fx); /* 1 cycle BASOP update */ + + if (L_sub(L_mseBy2, L_mse_best_fx) == 0) + { + best_ind = ((Word16)i); move16(); /* update winner, cond move , single BASOP */ + } + } /* one segment seg*/ + } /* all segms */ + + *min_mse = L_add(L_mse_best_fx, L_mse_best_fx); /* multiply halved MSEby2 to get final MSE */ + + assert(best_ind >= 0 && best_ind < cb_len); + +#ifdef WMOPS + pop_wmops(); /* func */ +#endif + Dyn_Mem_Deluxe_Out(); + + return best_ind; +} + +void snslr_st1C_vector_dec_fx(Word16 idx, const Word8* CBW8, Word16 scaleQ4, Word16 inv_scaleQ15, Word16 v_len, Word16 cb_len, Word16 *st1C_vector) +{ + /* decompose the received 0... 169 index , into the correct (integer and) float st1C vector */ + /* even in C-float the st1C coeffs are put into a S16Q11 final integers domain */ + /* Enables BE compatibility between {BASOP, float, double} arithmetic implmentations */ + Dyn_Mem_Deluxe_In( + Counter i; + const Word8 *cb; + Word32 L_tmp; + Word16 s_tmp; + ); + UNUSED(v_len); + UNUSED(cb_len); + UNUSED(inv_scaleQ15); /* req for debugging only */ + +#ifdef WMOPS + push_wmops("snslr_st1C_vector_dec_fx"); +#endif + + assert(idx >= 0 && idx < cb_len); + assert(v_len == M); + + cb = &(CBW8[idx*M]); move16(); /* pointer init */ + FOR(i = 0; i < M; i++) + { + L_tmp = L_mult0((Word16)cb[i], scaleQ4); /*S8Q7 * S15Q4 */ /*sign+7bit, sign+4 bits --> sign+11bit .lt sign+23 bits*/ + s_tmp = extract_l(L_tmp); + assert(L_tmp >= -32768L && L_tmp <= 32767L); /* INT16 domain check*/ + st1C_vector[i] = s_tmp; + } + +#ifdef WMOPS + pop_wmops(); +#endif + Dyn_Mem_Deluxe_Out(); +} + +Word16 MSEsearchGenericScaledW8_fx(Word16 *scf, const Word8 *sns_CBW8, Word16 scaleQ4, Word16 inv_scaleQ15, Word16 v_len, Word16 cb_len, Word32* L_min_mse) +{ + /* scf float input values are typically in the range +12.0 to -12.0. + rom table stored in Word8 [+127,-128], format corresponding to ]+1.0 .. -1.0 ] + inv_scaleQ15, [downscaling value in Q15] applied before search + scaleQ12 upscaling value quantized in Q12, used in the mse calulation and in the common float and BASOP synthesis routines + + */ + Dyn_Mem_Deluxe_In( + Counter i, n; + Word32 best_ind; + Word32 L_mse, L_mse_best; + Word16 targetW16[M]; + const Word8 * cbW8; + Word16 shift_mse; + Word16 tmp; + ); + +#ifdef WMOPS + push_wmops("MSEsearchGenericScaledW8_fx"); +#endif + FOR(i = 0; i < v_len; i++) + { + targetW16[i] = shr_pos(mult(scf[i], inv_scaleQ15), 4); /* target from W16Q11 to W8Q7 domain , and floor */ + }; + + best_ind = -1; /* needed to avoid compiler warning */ + + /* use use S1.15 wise multiplication operations QSUB16 for two coeffs correlation */ + /* L_msu0 can use 16 bit input only e.g. SMLSLD */ + + /* MSE_i = sum(i=0,15, (t_i-c_i)*(t_i-c_i) ) = sum(i=0,15, (t_i)^2 + c_i^2 - 2*(t_i*c_i) ) */ + /* store EnC_i = sum(1,16) c_i^2 , in a Word32 ROM entry , 170 entries , or potentially in Word16 */ + /* calculate MSE_i = EnT+EnC - sum (2*t_i*c_i) */ + /* or even calculate MSE_i/2 = enT/2 + EnC/2 - sum( t_i*c_i) , as an approximation of MSE */ + + /* commmon target contribution to MSE */ + + Word32 L_targetEn = 0; move32(); + if (v_len > 0) { + L_targetEn = L_mult0(targetW16[0], targetW16[0]); + FOR (i = 1; i < v_len; i++) + { + L_targetEn = L_mac0(L_targetEn, targetW16[i], targetW16[i]); + } + } + L_mse_best = INT32_MAX; move32(); /* largest possible positive number in INT32 */ + + FOR(i = 0; i < cb_len; i++) + { + cbW8 = &(sns_CBW8[i*M]); /* ptr init += i*16 */ + assert(v_len == M); + + L_mse = L_deposit_l(lrsns_st1C_Both_EnBy2Tab_fx[i]); /* scaled down CB energy by 2 from ROM to allow use of L_msu0 for best ARM ops */ + L_mse = L_add(L_mse, L_shr_pos_pos(L_targetEn, 1)); /* scale down target energy by 2 to allow use of L_msu0 for best ARM ops */ + + FOR(n = 0; n < v_len; n++) + { /* correlate is fast in most ARM cases, as SIMD or as blocks of 4 */ + L_mse = L_msu0(L_mse, targetW16[n], (Word16)(cbW8[n])); /* no upscaling included in L_msu0() */ + } + + assert(L_mse >= 0); /* check that error is always positive, otherwise we might get overflow in the subtraction below */ + if (L_sub(L_mse, L_mse_best) <= 0) + { + best_ind = i; move16(); /* single BASOP, conditional move, for best_ind update */ + } + L_mse_best = L_min(L_mse, L_mse_best); /* always update best MSE using L_min() in the idx loop, reduces WC WMOPS */ + } + L_mse_best = L_add(L_mse_best, L_mse_best); /* scale up by two from the BASOP/ARM optimized search mse domain */ + + + assert(best_ind >= 0 && best_ind < cb_len); + + *L_min_mse = L_mse_best; move32(); + + tmp = i_mult(scaleQ4, scaleQ4); /* non fractional square --> Q4 to Q8 */ + tmp = shl_pos(tmp, 2); /* a Q10 const */ + + shift_mse = norm_l(*L_min_mse); + + *L_min_mse = L_shl(*L_min_mse, shift_mse); + *L_min_mse = Mpy_32_16_lc3plus(*L_min_mse, tmp); /* still use max upshifting Mpy_32_16, here for this final Word32 L_mse output calculation */ + *L_min_mse = L_shr(*L_min_mse, add(shift_mse, 2 - 15)); + +#ifdef WMOPS + pop_wmops(); +#endif + Dyn_Mem_Deluxe_Out(); + + return best_ind; +} + +Word16 MSEsearchGeneric_fx(Word16 *scf, const Word16 *sns_CB, Word16 v_len, Word16 cb_len, Word32* L_min_mse) +{ + Dyn_Mem_Deluxe_In( + Counter i, n; + Word16 ind; + Word32 L_mse_best_fx, L_mse_fx; + Word16 tmp; + Word16 const *cb_ptr; + Word16 const *scf_ptr; + ); + +#ifdef WMOPS + push_wmops("MSEsearchGeneric_fx"); +#endif + ind = -1; /* avoid compiler warning */ + L_mse_best_fx = INT_MAX; move32(); + + FOR(i = 0; i < cb_len; i++) + { + L_mse_fx = L_deposit_l(0); + cb_ptr = &(sns_CB[i*v_len]); /* pointer init */ + scf_ptr = &(scf[0]); /* pointer init */ + FOR(n = 0; n < v_len; n++) + { + tmp = sub(*scf_ptr++, *cb_ptr++); + L_mse_fx = L_mac0(L_mse_fx, tmp, tmp); + } + + L_mse_best_fx = L_min(L_mse_fx, L_mse_best_fx); + if (L_sub(L_mse_fx, L_mse_best_fx) == 0) + { + ind = i; move16(); + } + } + + *L_min_mse = L_mse_best_fx; move32(); + + assert(ind >= 0 && ind < cb_len); +#ifdef WMOPS + pop_wmops(); +#endif + Dyn_Mem_Deluxe_Out(); + return ind; +} + +#endif diff --git a/lib_lc3plus/tns_coder_fx.c b/lib_lc3plus/tns_coder_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..e012abd0f9ff253df03832ab62913734e7d456f7 --- /dev/null +++ b/lib_lc3plus/tns_coder_fx.c @@ -0,0 +1,397 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +static void Parcor2Index(const Word16 parCoeff[] /*Q15*/, Word16 index[], Word16 order); +static void Index2Parcor(const Word16 index[], Word16 parCoeff[], Word16 order); +static Word32 FIRLattice(Word16 order, const Word16 *parCoeff /*Q15*/, Word32 *state, Word32 x /* Q0 */); + +/*************************************************************************/ + +void processTnsCoder_fx(Word16 *bits, Word16 indexes[], Word32 x[], Word16 BW_cutoff_idx, Word16 order[], + Word16 *numfilters, Word16 enable_lpc_weighting, Word16 nSubdivisions, LC3PLUS_FrameDuration frame_dms, + Word16 maxLen, Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif + , Word16 near_nyquist_flag +) +{ + Dyn_Mem_Deluxe_In(Word16 * tmpbuf; Word32 * rxx, epsP, *state, L_tmp, *A, predictionGain, alpha; Word16 * RC, inv; + Word16 n, n2, headroom, shift, tmp, shifts, facs, facs_e, stopfreq, xLen, maxOrder; + Word16 startfreq[TNS_NUMFILTERS_MAX]; const Word16 *subdiv_startfreq, *subdiv_stopfreq; + Counter i, j, iSubdivisions, lag; Word8 * LevinsonBuffer;); + + /* Buffer alignment */ + tmpbuf = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * MAX_LEN */ + + rxx = (Word32 *)scratchAlign(tmpbuf, sizeof(*tmpbuf) * maxLen); /* Size = 4 * (MAXLAG + 1) = 36 bytes */ + + state = (Word32 *)scratchAlign(rxx, sizeof(*rxx) * (MAXLAG + 1)); /* Size = 4 * MAXLAG = 32 bytes */ + + A = (Word32 *)scratchAlign(state, sizeof(*state) * MAXLAG); /* Size = 4 * (MAXLAG + 1) = 36 bytes */ + + RC = (Word16 *)scratchAlign(A, sizeof(*A) * (MAXLAG + 1)); /* Size = 2 * MAXLAG = 16 bytes */ + + LevinsonBuffer = (Word8 *)scratchAlign(RC, sizeof(*RC) * (MAXLAG)); /* Size = 4 * (M_LTPF + 1) = 100 bytes */ + + /* Init */ + *bits = 0; + move16(); + maxOrder = MAXLAG; + move16(); + *numfilters = 1; + move16(); + subdiv_startfreq = 0; + move16(); + subdiv_stopfreq = 0; + move16(); + +#ifdef ENABLE_HR_MODE + if (hrmode) + { + xLen = BW_cutoff_bin_all_HR[BW_cutoff_idx]; + } + else +#endif + { + xLen = BW_cutoff_bin_all[BW_cutoff_idx]; + } + move16(); + + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + *bits = 0; + order[0] = 0; + order[1] = 0; + *numfilters = 0; + goto tns_exit; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + startfreq[0] = 3; + move16(); + +#ifdef ENABLE_HR_MODE + if (hrmode) + { + subdiv_startfreq = tns_subdiv_startfreq_2_5ms_HR[BW_cutoff_idx - 4]; + move16(); + subdiv_stopfreq = tns_subdiv_stopfreq_2_5ms_HR[BW_cutoff_idx - 4]; + move16(); + } + else +#endif + { + subdiv_startfreq = tns_subdiv_startfreq_2_5ms[BW_cutoff_idx]; + move16(); + subdiv_stopfreq = tns_subdiv_stopfreq_2_5ms[BW_cutoff_idx]; + move16(); + } + xLen = shr_pos(xLen, 2); + maxOrder = 4; + move16(); + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + startfreq[0] = 6; + move16(); + +#ifdef ENABLE_HR_MODE + if (hrmode) + { + subdiv_startfreq = tns_subdiv_startfreq_5ms_HR[BW_cutoff_idx - 4]; + move16(); + subdiv_stopfreq = tns_subdiv_stopfreq_5ms_HR[BW_cutoff_idx - 4]; + move16(); + } + else +#endif + { + subdiv_startfreq = tns_subdiv_startfreq_5ms[BW_cutoff_idx]; + move16(); + subdiv_stopfreq = tns_subdiv_stopfreq_5ms[BW_cutoff_idx]; + move16(); + } + xLen = shr_pos(xLen, 1); + maxOrder = 4; + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + startfreq[0] = 9; + move16(); + subdiv_startfreq = tns_subdiv_startfreq_7_5ms[BW_cutoff_idx]; + move16(); + subdiv_stopfreq = tns_subdiv_stopfreq_7_5ms[BW_cutoff_idx]; + move16(); + tmp = shr_pos(xLen, 2); + xLen = add(tmp, add(tmp, tmp)); + maxOrder = 8; + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: + startfreq[0] = 12; + move16(); + +#ifdef ENABLE_HR_MODE + if (hrmode) + { + subdiv_startfreq = tns_subdiv_startfreq_HR[BW_cutoff_idx - 4]; + move16(); + subdiv_stopfreq = tns_subdiv_stopfreq_HR[BW_cutoff_idx - 4]; + move16(); + } + else +#endif + { + subdiv_startfreq = tns_subdiv_startfreq[BW_cutoff_idx]; + move16(); + subdiv_stopfreq = tns_subdiv_stopfreq[BW_cutoff_idx]; + move16(); + } + BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + IF (sub(BW_cutoff_idx, 3) >= 0 && frame_dms >= LC3PLUS_FRAME_DURATION_5MS) + { + *numfilters = 2; + startfreq[1] = shr_pos(xLen, 1); + } + + basop_memset(state, 0, MAXLAG * sizeof(*state)); + + FOR (j = 0; j < *numfilters; j++) + { + basop_memset(rxx, 0, (maxOrder + 1) * sizeof(*rxx)); + + FOR (iSubdivisions = 0; iSubdivisions < nSubdivisions; iSubdivisions++) + { + n = sub(subdiv_stopfreq[nSubdivisions * j + iSubdivisions], + subdiv_startfreq[nSubdivisions * j + iSubdivisions]); + + /*norms[iFilter][iSubdivisions] = norm2FLOAT(pSpectrum+iStartLine, iEndLine-iStartLine);*/ + headroom = getScaleFactor32(x + subdiv_startfreq[nSubdivisions * j + iSubdivisions], n); + + /* Calculate norm of spectrum band */ + L_tmp = Norm32Norm(x + subdiv_startfreq[nSubdivisions * j + iSubdivisions], headroom, n, &shift); + + /* Rounding to avoid overflow when computing the autocorrelation below */ + tmp = sub(norm_l(L_tmp), 1); + L_tmp = L_shl(L_tmp, tmp); + shift = sub(shift, tmp); + L_tmp = L_add(L_tmp, 0x8000); + L_tmp = L_and(L_tmp, 0x7FFF0000); + + IF (L_tmp == 0) + { + rxx[0] = 0x7FFFFFFF; + move32(); + basop_memset(&rxx[1], 0, (maxOrder) * sizeof(*rxx)); + BREAK; + } + + /* get pre-shift for autocorrelation */ + tmp = sub(shift, norm_l(L_tmp)); /* exponent for normalized L_tmp */ + tmp = shr_pos(sub(1, tmp), 1); /* pre-shift to apply before autocorrelation */ + shifts = s_min(tmp, headroom); + + /* calc normalization factor */ + facs_e = shl_pos(sub(tmp, shifts), 1); + + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: assert(0); +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: facs_e = add(facs_e, 1); BREAK; + case LC3PLUS_FRAME_DURATION_5MS: facs_e = add(facs_e, 1); BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: BREAK; + case LC3PLUS_FRAME_DURATION_10MS: BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + tmp = sub(1, shl_pos(tmp, 1)); /* exponent of autocorrelation */ + L_tmp = L_shl(L_tmp, sub(shift, tmp)); /* shift L_tmp to that exponent */ + /* calc factor (with 2 bits headroom for sum of 3 subdivisions) */ + facs = div_s(0x2000, round_fx(L_tmp)); /* L_tmp is >= 0x2000000 */ + + FOR (i = 0; i < n; i++) + { + tmpbuf[i] = round_fx_sat(L_shl_sat(x[subdiv_startfreq[nSubdivisions * j + iSubdivisions] + i], shifts)); + move16(); + } + + FOR (lag = 0; lag <= maxOrder; lag++) + { + n2 = sub(n, lag); + L_tmp = L_deposit_l(0); + FOR (i = 0; i < n2; i++) + { + L_tmp = L_mac0(L_tmp, tmpbuf[i], tmpbuf[i + lag]); + } + if (lag != 0) + L_tmp = Mpy_32_32_lc3plus(L_tmp, tnsAcfWindow[lag - 1]); + + L_tmp = Mpy_32_16_lc3plus(L_tmp, facs); + L_tmp = L_shl(L_tmp, facs_e); + + rxx[lag] = L_add(rxx[lag], L_tmp); + move32(); + } + } + + /* Levinson-Durbin */ + processLevinson_fx(A, rxx, maxOrder, RC, &epsP, LevinsonBuffer); + + /* Prediction Gain */ + shift = norm_l(epsP); + inv = div_s(16383, extract_h(L_shl_pos(epsP, shift))); + predictionGain = Mpy_32_32_lc3plus(rxx[0], Mpy_32_16_lc3plus(L_sub(MAX_32, Mpy_32_16_lc3plus(L_shl(epsP, shift), inv)), inv)); + + IF (L_sub(predictionGain, L_shr_pos_pos(0x30000000, shift)) > 0 && near_nyquist_flag == 0) + { + /* If Prediction Gain is low */ + test(); + IF (enable_lpc_weighting != 0 && L_sub(predictionGain, L_shr_pos_pos(0x40000000, shift)) < 0) + { + /* LPC weighting */ + alpha = L_add(0x6CCCCCCD, + Mpy_32_32_lc3plus(0x13333333, L_shl_pos(L_sub(L_shl_pos(predictionGain, shift), 0x30000000), 3))); + L_tmp = alpha; + FOR (i = 1; i < maxOrder; i++) + { + A[i] = Mpy_32_32_lc3plus(A[i], L_tmp); + move32(); + L_tmp = Mpy_32_32_lc3plus(L_tmp, alpha); + } + A[maxOrder] = Mpy_32_32_lc3plus(A[maxOrder], L_tmp); + move32(); + + /* LPC -> RC */ + lpc2rc(A, RC, maxOrder); + } + + /* Reflection Coefficients Quantization */ + Parcor2Index(RC, &indexes[MAXLAG * j], maxOrder); + + /* reduce filter order by truncating trailing zeros */ + i = sub(maxOrder, 1); + WHILE ((i >= 0) && (indexes[MAXLAG * j + i] == INDEX_SHIFT)) + { + i = sub(i, 1); + } + order[j] = add(i, 1); + + // Disable TNS if order is 0: + IF (order[j] == 0) { + // Jump to else statement + goto tns_disabled; + } + /* Count bits */ + L_tmp = L_deposit_l(ac_tns_order_bits[enable_lpc_weighting][order[j] - 1]); + FOR (i = 0; i < order[j]; i++) + { + L_tmp = L_add(L_tmp, L_deposit_l(ac_tns_coef_bits[i][indexes[MAXLAG * j + i]])); + } + *bits = add(*bits, add(2, extract_l(L_shr_pos(L_sub(L_tmp, 1), 11)))); + move16(); + + /* Unquantize Reflection Coefficients */ + Index2Parcor(&indexes[MAXLAG * j], RC, order[j]); + + /* Stop frequency */ + stopfreq = xLen; + move16(); + IF (sub(*numfilters, 2) == 0 && j == 0) + { + stopfreq = startfreq[1]; + } + + /* Filter */ + FOR (i = startfreq[j]; i < stopfreq; i++) + { + x[i] = FIRLattice(order[j], RC, state, x[i]); + move32(); + } + } + ELSE + { +tns_disabled: + /* TNS disabled */ + *bits = add(*bits, 1); + order[j] = 0; + } + } + +#ifdef CR9_C_ADD_1p25MS +tns_exit: +#endif + + Dyn_Mem_Deluxe_Out(); +} + +/*************************************************************************/ + +static void Parcor2Index(const Word16 parCoeff[] /*Q15*/, Word16 index[], Word16 order) +{ + Dyn_Mem_Deluxe_In(Counter i; Word16 iIndex; Word16 x;); + + FOR (i = 0; i < order; i++) + { + move16(); + move16(); + iIndex = 1; + x = parCoeff[i]; + + WHILE ((iIndex < TNS_COEF_RES) && (x > tnsQuantThr[iIndex - 1])) + { + iIndex = add(iIndex, 1); + } + index[i] = sub(iIndex, 1); + move16(); + } + + Dyn_Mem_Deluxe_Out(); +} + +static void Index2Parcor(const Word16 index[], Word16 parCoeff[], Word16 order) +{ + Counter i; + FOR (i = 0; i < order; i++) + { + parCoeff[i] = tnsQuantPts[index[i]]; + move16(); + } +} + +static Word32 FIRLattice(Word16 order, const Word16 *parCoeff /*Q15*/, Word32 *state, Word32 x /* Q0 */) +{ + Dyn_Mem_Deluxe_In(Counter i; Word32 tmpSave, tmp;); + + tmpSave = L_add(x, 0); + + FOR (i = 0; i < order - 1; i++) + { + tmp = L_add(state[i], Mpy_32_16_lc3plus(x, parCoeff[i])); + x = L_add(x, Mpy_32_16_lc3plus(state[i], parCoeff[i])); /* exponent: 31+0 */ + state[i] = tmpSave; + move32(); + tmpSave = L_add(tmp, 0); + } + + /* last stage: only need half operations */ + x = L_add(x, Mpy_32_16_lc3plus(state[order - 1], parCoeff[order - 1])); + state[order - 1] = tmpSave; + move32(); + Dyn_Mem_Deluxe_Out(); + return x; +} + diff --git a/lib_lc3plus/tns_decoder_fx.c b/lib_lc3plus/tns_decoder_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..7b9575f2dc1417b9b850d0e5450328319c735931 --- /dev/null +++ b/lib_lc3plus/tns_decoder_fx.c @@ -0,0 +1,164 @@ +/****************************************************************************** +* ETSI TS 103 634 V1.6.1 * +* Low Complexity Communication Codec Plus (LC3plus) * +* * +* Copyright licence is solely granted through ETSI Intellectual Property * +* Rights Policy, 3rd April 2019. No patent licence is granted by implication, * +* estoppel or otherwise. * +******************************************************************************/ + +#include "options.h" +#include "wmc_auto.h" +#include "functions.h" + +static Word32 IIRLattice(Word16 order, const Word16 *parCoeff, Word32 *state, Word32 x); + +/*************************************************************************/ + +void processTnsDecoder_fx(Word16 rc_idx[], Word32 x[], Word16 xLen, Word16 order[], Word16 *x_e, Word16 BW_stopband_idx, + LC3PLUS_FrameDuration frame_dms, Word8 *scratchBuffer +#ifdef ENABLE_HR_MODE + , Word16 hrmode +#endif +) +{ + Dyn_Mem_Deluxe_In( + Word32 *state; + Counter i, j; + Word16 s1, s2, s, *rc, f, stopfreq, BW_stopband; + Word16 numfilters, startfreq[TNS_NUMFILTERS_MAX]; + ); + + state = (Word32 *)scratchAlign(scratchBuffer, 0); /* Size = MAXLAG */ + rc = (Word16 *)scratchAlign(state, sizeof(*state) * MAXLAG); /* Size = MAXLAG */ + + numfilters = 1; + +#ifdef ENABLE_HR_MODE + if (hrmode == 1) + { + BW_stopband = BW_cutoff_bin_all_HR[BW_stopband_idx]; move16(); + } + else +#endif + { + BW_stopband = BW_cutoff_bin_all[BW_stopband_idx]; move16(); + } + + SWITCH (frame_dms) + { +#ifdef CR9_C_ADD_1p25MS + case LC3PLUS_FRAME_DURATION_1p25MS: + startfreq[0] = 3; move16(); + BW_stopband = shr_pos(BW_stopband, 3); + BREAK; +#endif + case LC3PLUS_FRAME_DURATION_2p5MS: + startfreq[0] = 3; move16(); + BW_stopband = shr_pos(BW_stopband, 2); + BREAK; + case LC3PLUS_FRAME_DURATION_5MS: + startfreq[0] = 6; move16(); + BW_stopband = shr_pos(BW_stopband, 1); + BREAK; + case LC3PLUS_FRAME_DURATION_7p5MS: + startfreq[0] = 9; move16(); + BW_stopband = add(shr_pos(BW_stopband, 2), add(shr_pos(BW_stopband, 2), shr_pos(BW_stopband, 2))); + BREAK; + case LC3PLUS_FRAME_DURATION_10MS: startfreq[0] = 12; BREAK; + case LC3PLUS_FRAME_DURATION_UNDEFINED: assert(0); + } + + IF (sub(BW_stopband_idx, 3) >= 0 && frame_dms >= LC3PLUS_FRAME_DURATION_5MS) + { + numfilters = 2; + startfreq[1] = shr_pos(BW_stopband, 1); + } + +#ifdef CR9_C_ADD_1p25MS + IF (frame_dms <= LC3PLUS_FRAME_DURATION_1p25MS) { + numfilters = 0; + } +#endif + + stopfreq = 0; + + test(); test(); + IF (order[0] > 0 || (sub(numfilters, 2) == 0 && order[1] > 0)) + { + /* Scaling */ + f = startfreq[0]; move16(); + test(); + IF (sub(numfilters, 2) == 0 && order[0] == 0) + { + f = startfreq[1]; move16(); + } + s1 = getScaleFactor32(x, f); + s2 = getScaleFactor32(x + f, sub(xLen, f)); + s = s_min(s1, sub(s2, 7)); /* 7 bits of headroom for IIR filtering */ + *x_e = sub(*x_e, s); + +/* Init Filter */ + basop_memset(state, 0, MAXLAG * sizeof(Word32)); + FOR (i = 0; i < f; i++) + { + x[i] = L_shl(x[i], s); move32(); + } + + FOR (j = 0; j < numfilters; j++) + { + IF (order[j] > 0) + { + /* Unquantize coefficients */ + FOR (i = 0; i < order[j]; i++) + { + rc[i] = tnsQuantPts[rc_idx[j * MAXLAG + i]]; move16(); + } + + /* Stop frequency */ + stopfreq = BW_stopband; move16(); + IF (sub(numfilters, 2) == 0 && j == 0) + { + stopfreq = startfreq[1]; + } + + /* Filter */ + FOR (i = startfreq[j]; i < stopfreq; i++) + { + x[i] = IIRLattice(order[j], rc, state, L_shl(x[i], s)); move32(); + } + } + } + FOR (i = stopfreq; i < xLen; i++) + { + x[i] = L_shl(x[i], s); move32(); + } + } + Dyn_Mem_Deluxe_Out(); +} + +/*************************************************************************/ +/*************************************************************************/ +/*************************************************************************/ + +static Word32 IIRLattice(Word16 order, const Word16 *parCoeff, Word32 *state, Word32 x) +{ + Dyn_Mem_Deluxe_In( + Counter i; + ); + + /* first stage: no need to calculate state[order-1] */ + x = L_sub_sat(x, Mpy_32_16_lc3plus(state[order - 1], parCoeff[order - 1])); + + FOR (i = order - 2; i >= 0; i--) + { + x = L_sub(x, Mpy_32_16_lc3plus(state[i], parCoeff[i])); + state[i + 1] = L_add(state[i], Mpy_32_16_lc3plus(x, parCoeff[i])); move32(); + } + + state[0] = x; move32(); + + Dyn_Mem_Deluxe_Out(); + return x; +} + diff --git a/lib_rend/ivas_cldfb_ring_buffer.c b/lib_rend/ivas_cldfb_ring_buffer.c new file mode 100644 index 0000000000000000000000000000000000000000..6a3ee58ddcbbdb7d4a5206537c25c6ddd11a3ddd --- /dev/null +++ b/lib_rend/ivas_cldfb_ring_buffer.c @@ -0,0 +1,319 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "prot_fx.h" +#include "ivas_prot_fx.h" +#include +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * CLDFB ring-buffer functions needed in split-rendering outputs + *---------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------* + * ivas_cldfb_ringbuf_IsEmpty() + * + * Returns 1 if the ring buffer is empty, or 0 otherwise. + *---------------------------------------------------------------------*/ + +static Word16 ivas_cldfb_ringbuf_IsEmpty( + ISAR_CLDFB_RINGBUF_HANDLE h ) +{ + test(); + return EQ_16( h->read_pos, h->write_pos ) && !h->is_full; +} + + +/*---------------------------------------------------------------------* + * ivas_cldfb_ringbuf_IsFull() + * + * Returns 1 if the ring buffer is full, or 0 otherwise. + *---------------------------------------------------------------------*/ + +static Word16 ivas_cldfb_ringbuf_IsFull( + ISAR_CLDFB_RINGBUF_HANDLE h ) +{ + return h->is_full; +} + + +/*---------------------------------------------------------------------* + * ivas_CLDFB_RINGBUF_Open() + * + * Allocates a ring buffer for CLDFB data with the given capacity of CLDFB columns. + * Each column is expected to contain at most CLDFB_NO_CHANNELS_MAX frequency bands. + * + * May return IVAS_ERR_FAILED_ALLOC on failed allocation, or IVAS_ERR_OK otherwise. + *---------------------------------------------------------------------*/ + +ivas_error ivas_CLDFB_RINGBUF_Open( + ISAR_CLDFB_RINGBUF_HANDLE *ph, + const Word16 capacity_columns ) +{ + ISAR_CLDFB_RINGBUF_HANDLE h; + Word16 capacity; + + capacity = i_mult( capacity_columns, CLDFB_NO_CHANNELS_MAX ); + move16(); + + IF( ( h = malloc( sizeof( ISAR_CLDFB_RINGBUF ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to allocate memory for CLDFB ring buffer\n" ); + } + h->real = NULL; + h->imag = NULL; + h->capacity = 0; + move16(); + h->write_pos = 0; + move16(); + h->read_pos = 0; + move16(); + h->is_full = 0; + move16(); + *ph = h; + + IF( ( h->real = malloc( capacity * sizeof( Word32 ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to allocate memory for CLDFB ring buffer\n" ); + } + IF( ( h->imag = malloc( capacity * sizeof( Word32 ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to allocate memory for CLDFB ring buffer\n" ); + } + h->capacity = capacity; + move16(); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * ivas_CLDFB_RINGBUF_Close() + * + * Dellocates CLDFB ring buffer. The given handle will be set to NULL. + *---------------------------------------------------------------------*/ + +void ivas_CLDFB_RINGBUF_Close( + ISAR_CLDFB_RINGBUF_HANDLE *ph ) +{ + ISAR_CLDFB_RINGBUF_HANDLE h; + + IF( ph == NULL ) + { + return; + } + h = *ph; + + IF( h == NULL ) + { + return; + } + + IF( h->real != NULL ) + { + free( h->real ); + } + IF( h->imag != NULL ) + { + free( h->imag ); + } + + free( h ); + *ph = NULL; + + return; +} + + +/*---------------------------------------------------------------------* + * ivas_CLDFB_RINGBUF_Push() + * + * Pushes a single column onto the back of the CLDFB ring buffer from real and imag arrays. + *---------------------------------------------------------------------*/ + +void ivas_CLDFB_RINGBUF_Push( + ISAR_CLDFB_RINGBUF_HANDLE h, + const Word32 *real, + const Word32 *imag, + const Word16 num_bands ) +{ + assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); + assert( !ivas_cldfb_ringbuf_IsFull( h ) ); + + Copy32( real, &h->real[h->write_pos], num_bands ); + Copy32( imag, &h->imag[h->write_pos], num_bands ); + + h->write_pos = add( h->write_pos, CLDFB_NO_CHANNELS_MAX ); + move16(); + IF( EQ_16( h->write_pos, h->capacity ) ) + { + h->write_pos = 0; + move16(); + } + + IF( EQ_16( h->read_pos, h->write_pos ) ) + { + h->is_full = 1; + move16(); + } + + return; +} + + +/*---------------------------------------------------------------------* + * ivas_CLDFB_RINGBUF_Pop() + * + * Pops a single column from the front of the CLDFB ring buffer into real and imag arrays. + *---------------------------------------------------------------------*/ + +void ivas_CLDFB_RINGBUF_Pop( + ISAR_CLDFB_RINGBUF_HANDLE h, + Word32 *real, + Word32 *imag, + const Word16 num_bands ) +{ + assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); + assert( !ivas_cldfb_ringbuf_IsEmpty( h ) ); + + IF( real != NULL ) + { + Copy32( &h->real[h->read_pos], real, num_bands ); + } + IF( imag != NULL ) + { + Copy32( &h->imag[h->read_pos], imag, num_bands ); + } + + h->read_pos = add( h->read_pos, CLDFB_NO_CHANNELS_MAX ); + move16(); + IF( EQ_16( h->read_pos, h->capacity ) ) + { + h->read_pos = 0; + move16(); + } + + h->is_full = 0; + move16(); + + return; +} + + +/*---------------------------------------------------------------------* + * ivas_cldfb_ringbuf_total_size() + * + * Returns total number of buffered samples (including number of channels) + *---------------------------------------------------------------------*/ + +static Word32 ivas_cldfb_ringbuf_total_size( + ISAR_CLDFB_RINGBUF_HANDLE h ) +{ + IF( ivas_cldfb_ringbuf_IsFull( h ) ) + { + return h->capacity; + } + + IF( LE_16( h->read_pos, h->write_pos ) ) + { + return sub( h->write_pos, h->read_pos ); + } + + /* else wrap around */ + return add( h->write_pos, sub( h->capacity, h->read_pos ) ); +} + + +/*---------------------------------------------------------------------* + * ivas_CLDFB_RINGBUF_GetByIdx() + * + * Gets pointers into a specific column in the CLDFB ring buffer based on given index. + * Non-negative indices access from the front of the ring buffer, negative indexes access + * from the back, similar to Python arrays. For example: + * + * - index 0 accesses the front of the buffer, i.e. the oldest CLDFB column in the queue. + * - index -1 accesses the back of the buffer, i.e. the newest (last pushed) CLDFB column in the queue. + *---------------------------------------------------------------------*/ + +void ivas_CLDFB_RINGBUF_GetByIdx( + ISAR_CLDFB_RINGBUF_HANDLE h, + Word32 **p_real, + Word32 **p_imag, + const Word16 col_idx ) +{ + Word16 idx = i_mult( col_idx, CLDFB_NO_CHANNELS_MAX ); + move16(); + Word16 num_floats = extract_l( ivas_cldfb_ringbuf_total_size( h ) ); + move16(); + Word16 offset /*, uidx */; // uidx unused in FX code + + assert( -num_floats <= idx && idx <= num_floats ); + + IF( GE_16( idx, 0 ) ) + { + offset = add( h->read_pos, idx ); + move16(); + IF( LE_16( h->capacity, offset ) ) + { + offset = sub( offset, h->capacity ); + move16(); + } + } + ELSE + { + idx = negate( idx ); + move16(); + IF( LE_16( idx, h->write_pos ) ) + { + offset = sub( h->write_pos, idx ); + move16(); + } + ELSE + { + offset = add( h->write_pos, sub( h->capacity, idx ) ); + move16(); + } + } + + *p_real = &h->real[offset]; + move16(); + *p_imag = &h->imag[offset]; + move16(); + + return; +} diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index 36d18f85924d04ad55ab1adc432bb5ac32156991..9c3379527d84ee278052b0ce8099af94674a623c 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -46,17 +46,15 @@ #include "debug.h" #endif -#define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) -#define fix_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) /*------------------------------------------------------------------------- - * ivas_hrtf_init() + * ivas_Crend_hrtf_init() * * Initialize hHrtf handle *------------------------------------------------------------------------*/ -ivas_error ivas_hrtf_init( - HRTFS_DATA *hHrtf /* i/o: HRTF handle */ +ivas_error ivas_Crend_hrtf_init_fx( + HRTFS_CREND_DATA *hHrtf /* i/o: HRTF handle */ ) { Word16 i, j; @@ -71,18 +69,26 @@ ivas_error ivas_hrtf_init( hHrtf->max_num_ir = 0; hHrtf->max_num_iterations = 0; hHrtf->index_frequency_max_diffuse = 0; + hHrtf->same_inv_diffuse_weight = 1; + move16(); move32(); move16(); move16(); move16(); move16(); + hHrtf->factor_Q_latency_s_fx = 0; + move16(); + hHrtf->factor_Q_inv_diffuse_weight = 0; + move16(); + hHrtf->factor_Q_pOut_to_bin = 0; + move16(); FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = 0; - move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { + hHrtf->inv_diffuse_weight_fx[j][i] = 0; + move16(); hHrtf->num_iterations[i][j] = 0; move16(); hHrtf->pIndex_frequency_max[i][j] = NULL; @@ -101,29 +107,34 @@ ivas_error ivas_hrtf_init( hHrtf->pOut_to_bin_diffuse_im_fx[j] = NULL; } + hHrtf->init_from_rom = 1; + move16(); + return IVAS_ERR_OK; } + /*------------------------------------------------------------------------- * ivas_hrtf_open() * - * Open hHrtf handle + * Open hHrtf handle for Crend renderer *------------------------------------------------------------------------*/ -static ivas_error ivas_hrtf_open( - HRTFS_HANDLE *hHrtf_out /* o : HRTF handle */ + +static ivas_error ivas_hrtf_open_fx( + HRTFS_CREND_HANDLE *hHrtf_out /* o : HRTF handle */ ) { - HRTFS_HANDLE hHrtf; + HRTFS_CREND_HANDLE hHrtf; ivas_error error; IF( *hHrtf_out == NULL ) { - IF( ( hHrtf = (HRTFS_HANDLE) malloc( sizeof( HRTFS_DATA ) ) ) == NULL ) + IF( ( hHrtf = (HRTFS_CREND_HANDLE) malloc( sizeof( HRTFS_CREND_DATA ) ) ) == NULL ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR decoder\n" ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend HRTFS Handle\n" ); } - IF( NE_32( ( error = ivas_hrtf_init( hHrtf ) ), IVAS_ERR_OK ) ) + IF( ( error = ivas_Crend_hrtf_init_fx( hHrtf ) ) != IVAS_ERR_OK ) { return error; } @@ -146,7 +157,7 @@ static ivas_error ivas_hrtf_open( *------------------------------------------------------------------------*/ static void ivas_hrtf_close( - HRTFS_HANDLE *hHrtf /* i/o: HRTF handle */ + HRTFS_CREND_HANDLE *hHrtf /* i/o: Crend HRTF handle */ ) { test(); @@ -160,8 +171,10 @@ static void ivas_hrtf_close( return; } + + /*------------------------------------------------------------------------- - * initCrend_from_rom() + * ivas_rend_initCrend() * * Allocate and initialize crend renderer handle *------------------------------------------------------------------------*/ @@ -170,13 +183,14 @@ static ivas_error ivas_rend_initCrend_fx( CREND_WRAPPER *pCrend, const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, - HRTFS_CREND_HANDLE hSetOfHRTF, + HRTFS_CREND_HANDLE hHrtfCrend, + const Word16 ext_rend_flag, const Word32 output_Fs ) { - Word16 i, j, tmp; + Word16 i, j, tmp, tmp2; Word16 nchan_in; IVAS_REND_AudioConfigType inConfigType; - HRTFS_HANDLE hHrtf; + HRTFS_CREND_HANDLE hHrtf; ivas_error error; inConfigType = getAudioConfigType( inConfig ); @@ -184,23 +198,43 @@ static ivas_error ivas_rend_initCrend_fx( /* Do all error checks up front so that the nested if later is easier */ test(); - IF( inConfigType != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED && NE_16( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) + IF( NE_16( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) && NE_16( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Encountered unsupported input config in Crend" ); } test(); test(); - IF( NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Encountered unsupported output type in Crend" ); } IF( hHrtf == NULL ) { - IF( NE_32( ivas_hrtf_open( &hHrtf ), IVAS_ERR_OK ) ) + test(); + IF( hHrtfCrend != NULL && ext_rend_flag == 0 ) + { + /* HRTF set loaded from binary file */ + hHrtf = hHrtfCrend; + hHrtf->init_from_rom = 0; + move16(); + } + ELSE { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for HRTF handle" ); + /* create new handle when HRTF is loaded from ROM, or external renderer is used */ + IF( NE_32( ( error = ivas_hrtf_open_fx( &hHrtf ) ), IVAS_ERR_OK ) ) + { + return error; + } + + hHrtf->init_from_rom = 1; + move16(); + IF( hHrtfCrend != NULL ) + { + hHrtf->init_from_rom = 0; + move16(); + } } } @@ -216,7 +250,7 @@ static ivas_error ivas_rend_initCrend_fx( return IVAS_ERR_INTERNAL_FATAL; } - IF( hSetOfHRTF == NULL ) + IF( hHrtf->init_from_rom ) { IF( EQ_32( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { @@ -232,16 +266,25 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->latency_s_fx = CRendBin_Combined_BRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_48kHz; // Q0 hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; // Q0 + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_Combined_BRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_Combined_BRIR_inv_diffuse_weight_Q_48kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_Combined_BRIR_coeff_Q_48kHz_fx; } ELSE { hHrtf->latency_s_fx = CRendBin_Combined_HRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_48kHz; // Q0 hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; // Q0 + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_Combined_HRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_Combined_HRIR_inv_diffuse_weight_Q_48kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_Combined_HRIR_coeff_Q_48kHz_fx; } move32(); move16(); move16(); + move16(); + move16(); + move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { @@ -274,16 +317,25 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->latency_s_fx = CRendBin_Combined_BRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_32kHz; // Q0 hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; // Q0 + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_Combined_BRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_Combined_BRIR_inv_diffuse_weight_Q_32kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_Combined_BRIR_coeff_Q_32kHz_fx; } ELSE { hHrtf->latency_s_fx = CRendBin_Combined_HRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_32kHz; // Q0 hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; // Q0 + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_Combined_HRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_Combined_HRIR_inv_diffuse_weight_Q_32kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_Combined_HRIR_coeff_Q_32kHz_fx; } move32(); move16(); move16(); + move16(); + move16(); + move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { @@ -316,16 +368,25 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->latency_s_fx = CRendBin_Combined_BRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_16kHz; hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_Combined_BRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_Combined_BRIR_inv_diffuse_weight_Q_16kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_Combined_BRIR_coeff_Q_16kHz_fx; } ELSE { hHrtf->latency_s_fx = CRendBin_Combined_HRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_16kHz; hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_Combined_HRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_Combined_HRIR_inv_diffuse_weight_Q_16kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_Combined_HRIR_coeff_Q_16kHz_fx; } move32(); move16(); move16(); + move16(); + move16(); + move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { @@ -386,20 +447,11 @@ static ivas_error ivas_rend_initCrend_fx( IF( EQ_32( output_Fs, 48000 ) ) { - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) - { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[tmp]; // Q15 - } - ELSE - { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[tmp]; // Q15 - } - move16(); - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[j][tmp]; hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_48kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j]; @@ -408,6 +460,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[j][tmp]; hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_48kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[tmp][j]; @@ -422,20 +475,11 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_32( output_Fs, 32000 ) ) { - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) - { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[tmp]; // Q15 - } - ELSE - { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[tmp]; // Q15 - } - move16(); - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[j][tmp]; hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_32kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j]; @@ -444,6 +488,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[j][tmp]; hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_32kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[tmp][j]; @@ -458,20 +503,11 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_32( output_Fs, 16000 ) ) { - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) - { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[tmp]; // Q15 - } - ELSE - { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[tmp]; // Q15 - } - move16(); - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[j][tmp]; hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_16kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j]; @@ -480,6 +516,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[j][tmp]; hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_16kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[tmp][j]; @@ -510,14 +547,19 @@ static ivas_error ivas_rend_initCrend_fx( move32(); move16(); move16(); + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_HOA3_HRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_HOA3_HRIR_inv_diffuse_weight_Q_48kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_HOA3_HRIR_coeff_Q_48kHz_fx; + move16(); + move16(); + move16(); FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[i]; // Q15 - move16(); - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[j][i]; // Q15 + move16(); hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; @@ -550,14 +592,19 @@ static ivas_error ivas_rend_initCrend_fx( move32(); move16(); move16(); + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_HOA3_HRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_HOA3_HRIR_inv_diffuse_weight_Q_32kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_HOA3_HRIR_coeff_Q_32kHz_fx; + move16(); + move16(); + move16(); FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[i]; // Q15 - move16(); - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[j][i]; // Q15 + move16(); hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; @@ -591,14 +638,20 @@ static ivas_error ivas_rend_initCrend_fx( move32(); move16(); move16(); + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_HOA3_HRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_HOA3_HRIR_inv_diffuse_weight_Q_16kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_HOA3_HRIR_coeff_Q_16kHz_fx; + move16(); + move16(); + move16(); FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[i]; // Q15 - move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[j][i]; // Q15 + move16(); hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; @@ -639,14 +692,19 @@ static ivas_error ivas_rend_initCrend_fx( move32(); move16(); move16(); + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_HOA2_HRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_HOA2_HRIR_inv_diffuse_weight_Q_48kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_HOA2_HRIR_coeff_Q_48kHz_fx; + move16(); + move16(); + move16(); FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[i]; // Q15 - move16(); - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[j][i]; // Q15 + move16(); hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_48kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[i][j]; @@ -679,14 +737,19 @@ static ivas_error ivas_rend_initCrend_fx( move32(); move16(); move16(); + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_HOA2_HRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_HOA2_HRIR_inv_diffuse_weight_Q_32kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_HOA2_HRIR_coeff_Q_32kHz_fx; + move16(); + move16(); + move16(); FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[i]; // Q15 - move16(); - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[j][i]; // Q15 + move16(); hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_32kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[i][j]; @@ -720,14 +783,19 @@ static ivas_error ivas_rend_initCrend_fx( move32(); move16(); move16(); + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_HOA2_HRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_HOA2_HRIR_inv_diffuse_weight_Q_16kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_HOA2_HRIR_coeff_Q_16kHz_fx; + move16(); + move16(); + move16(); FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[i]; // Q15 - move16(); - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[j][i]; // Q15 + move16(); hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_16kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[i][j]; @@ -768,14 +836,19 @@ static ivas_error ivas_rend_initCrend_fx( move32(); move16(); move16(); + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_FOA_HRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_FOA_HRIR_inv_diffuse_weight_Q_48kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_FOA_HRIR_coeff_Q_48kHz_fx; + move16(); + move16(); + move16(); FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[i]; // Q15 - move16(); - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[j][i]; // Q15 + move16(); hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_48kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[i][j]; @@ -808,14 +881,19 @@ static ivas_error ivas_rend_initCrend_fx( move32(); move16(); move16(); + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_FOA_HRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_FOA_HRIR_inv_diffuse_weight_Q_32kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_FOA_HRIR_coeff_Q_32kHz_fx; + move16(); + move16(); + move16(); FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[i]; // Q15 - move16(); - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[j][i]; // Q15 + move16(); hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_32kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[i][j]; @@ -849,14 +927,19 @@ static ivas_error ivas_rend_initCrend_fx( move32(); move16(); move16(); + hHrtf->factor_Q_latency_s_fx = Q31 - CRendBin_FOA_HRIR_Q_latency_s_fx; + hHrtf->factor_Q_inv_diffuse_weight = Q15 - CRendBin_FOA_HRIR_inv_diffuse_weight_Q_16kHz_fx; + hHrtf->factor_Q_pOut_to_bin = Q15 - CRendBin_FOA_HRIR_coeff_Q_16kHz_fx; + move16(); + move16(); + move16(); FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[i]; // Q15 - move16(); - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[j][i]; // Q15 + move16(); hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_16kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[i][j]; @@ -905,240 +988,144 @@ static ivas_error ivas_rend_initCrend_fx( move16(); hHrtf->gain_lfe_fx = GAIN_LFE_FX; move16(); + } - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) - { - hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_brir_combined->latency_s_fx; // Q31 - hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_brir_combined->max_num_iterations; - hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_brir_combined->index_frequency_max_diffuse; - } - ELSE + IF( EQ_16( ext_rend_flag, 1 ) ) + { + IF( hHrtfCrend == NULL ) { - hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_combined->latency_s_fx; // Q31 - hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_combined->max_num_iterations; - hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_combined->index_frequency_max_diffuse; + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Invalid function parameters " ); } - move32(); + hHrtf->latency_s_fx = hHrtfCrend->latency_s_fx; + hHrtf->max_num_iterations = hHrtfCrend->max_num_iterations; + hHrtf->index_frequency_max_diffuse = hHrtfCrend->index_frequency_max_diffuse; + move16(); + move16(); + move16(); + hHrtf->factor_Q_inv_diffuse_weight = hHrtfCrend->factor_Q_inv_diffuse_weight; + hHrtf->factor_Q_latency_s_fx = hHrtfCrend->factor_Q_latency_s_fx; + hHrtf->factor_Q_pOut_to_bin = hHrtfCrend->factor_Q_pOut_to_bin; + move16(); move16(); move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) - { - hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_brir_combined->num_iterations_diffuse[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_brir_combined->pIndex_frequency_max_diffuse[j]; - - hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_diffuse_re_fx[j]; // Q31 - hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_diffuse_im_fx[j]; // Q31 - } - ELSE - { - hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_combined->num_iterations_diffuse[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_combined->pIndex_frequency_max_diffuse[j]; - - hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_diffuse_re_fx[j]; // Q31 - hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_diffuse_im_fx[j]; // Q31 - } - move32(); - move32(); - move16(); - move16(); + hHrtf->num_iterations_diffuse[j] = hHrtfCrend->num_iterations_diffuse[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = hHrtfCrend->pIndex_frequency_max_diffuse[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = hHrtfCrend->pOut_to_bin_diffuse_re_fx[j]; + hHrtf->pOut_to_bin_diffuse_im_fx[j] = hHrtfCrend->pOut_to_bin_diffuse_im_fx[j]; } + } - FOR( i = 0; i < hHrtf->max_num_ir; i++ ) + test(); + IF( EQ_32( inConfig, IVAS_AUDIO_CONFIG_7_1 ) && EQ_16( ext_rend_flag, 0 ) ) + { + /* hack to enable pointers swapping - needed when indexes of 'channelIndex_CICPx[]' are not in increasing order */ + FOR( i = 5; i < hHrtf->max_num_ir; i++ ) { - IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_5_1 ) ) - { - tmp = channelIndex_CICP6[i]; - } - ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_7_1 ) ) - { - tmp = channelIndex_CICP12[i]; - } - ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_5_1_2 ) ) - { - tmp = channelIndex_CICP14[i]; - } - ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_5_1_4 ) ) - { - tmp = channelIndex_CICP16[i]; - } - ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_7_1_4 ) ) - { - tmp = channelIndex_CICP19[i]; - } - ELSE - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" ); - } + tmp = channelIndex_CICP12[i]; + tmp2 = channelIndex_CICP14[i]; move16(); - - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) - { - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_brir_combined->inv_diffuse_weight_fx[tmp]; // Q15 - } - ELSE - { - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_combined->inv_diffuse_weight_fx[tmp]; // Q15 - } move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) - { - hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_brir_combined->num_iterations[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_brir_combined->pIndex_frequency_max[tmp][j]; - - hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_re_fx[tmp][j]; // Q29 - hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_im_fx[tmp][j]; // Q29 - } - ELSE - { - hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_combined->num_iterations[tmp][j]; - hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_combined->pIndex_frequency_max[tmp][j]; - - hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_re_fx[tmp][j]; // Q29 - hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_im_fx[tmp][j]; // Q29 - } - move32(); - move32(); - move16(); - move16(); + hHrtf->inv_diffuse_weight_fx[j][tmp2] = hHrtfCrend->inv_diffuse_weight_fx[j][tmp]; + hHrtf->num_iterations[tmp2][j] = hHrtfCrend->num_iterations[tmp][j]; + hHrtf->pIndex_frequency_max[tmp2][j] = hHrtfCrend->pIndex_frequency_max[tmp][j]; + hHrtf->pOut_to_bin_re_fx[tmp2][j] = hHrtfCrend->pOut_to_bin_re_fx[tmp][j]; + hHrtf->pOut_to_bin_im_fx[tmp2][j] = hHrtfCrend->pOut_to_bin_im_fx[tmp][j]; } } } - ELSE IF( EQ_16( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) + + FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_HOA3 ) ) + IF( EQ_32( inConfig, IVAS_AUDIO_CONFIG_5_1 ) ) { - hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s_fx; // Q31 - hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations; - hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse; - move32(); - move16(); + tmp = channelIndex_CICP6[i]; move16(); - - FOR( i = 0; i < hHrtf->max_num_ir; i++ ) + } + ELSE IF( EQ_32( inConfig, IVAS_AUDIO_CONFIG_7_1 ) ) + { + IF( EQ_16( ext_rend_flag, 0 ) ) { - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight_fx[i]; // Q31 + tmp = channelIndex_CICP14[i]; move16(); - - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations[i][j]; - hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max[i][j]; - - hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_re_fx[i][j]; // Q29 - hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_im_fx[i][j]; // Q29 - move32(); - move32(); - move16(); - move16(); - } } - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + ELSE { - hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations_diffuse[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max_diffuse[j]; - - hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_re_fx[j]; // Q31 - hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_im_fx[j]; // Q31 - move32(); - move32(); - move16(); + tmp = channelIndex_CICP12[i]; move16(); } } - ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_HOA2 ) ) + ELSE IF( EQ_32( inConfig, IVAS_AUDIO_CONFIG_5_1_2 ) ) { - hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_hoa2->latency_s_fx; // Q31 - hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa2->max_num_iterations; - hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa2->index_frequency_max_diffuse; - move32(); + tmp = channelIndex_CICP14[i]; move16(); + } + ELSE IF( EQ_32( inConfig, IVAS_AUDIO_CONFIG_5_1_4 ) ) + { + tmp = channelIndex_CICP16[i]; move16(); + } + ELSE IF( EQ_32( inConfig, IVAS_AUDIO_CONFIG_7_1_4 ) ) + { + tmp = channelIndex_CICP19[i]; + move16(); + } + ELSE IF( EQ_32( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) + { + tmp = i; + move16(); + } + ELSE + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" ); + } - FOR( i = 0; i < hHrtf->max_num_ir; i++ ) - { - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_hoa2->inv_diffuse_weight_fx[i]; // Q15 - move16(); - - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations[i][j]; - hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max[i][j]; + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->inv_diffuse_weight_fx[j][i] = hHrtfCrend->inv_diffuse_weight_fx[j][tmp]; + hHrtf->num_iterations[i][j] = hHrtfCrend->num_iterations[tmp][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_re_fx[i][j]; // Q29 - hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_im_fx[i][j]; // Q29 - move32(); - move32(); - move16(); - move16(); - } + IF( ext_rend_flag == 0 ) + { + /* in case of HRTF handle reuse, swap the pointers for correct deallocation at the exit */ +#define WMC_TOOL_SKIP + swap( hHrtf->pIndex_frequency_max[i][j], hHrtf->pIndex_frequency_max[tmp][j], const Word16 * ); + MOVE( 3 ); + swap( hHrtf->pOut_to_bin_re_fx[i][j], hHrtf->pOut_to_bin_re_fx[tmp][j], const Word16 * ); + MOVE( 3 ); + swap( hHrtf->pOut_to_bin_im_fx[i][j], hHrtf->pOut_to_bin_im_fx[tmp][j], const Word16 * ); + MOVE( 3 ); +#undef WMC_TOOL_SKIP } - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + ELSE { - hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations_diffuse[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max_diffuse[j]; - - hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_re_fx[j]; // Q31 - hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_im_fx[j]; // Q31 - move32(); - move32(); - move16(); - move16(); + hHrtf->pIndex_frequency_max[i][j] = hHrtfCrend->pIndex_frequency_max[tmp][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = hHrtfCrend->pOut_to_bin_re_fx[tmp][j]; + hHrtf->pOut_to_bin_im_fx[i][j] = hHrtfCrend->pOut_to_bin_im_fx[tmp][j]; } } - ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_FOA ) ) + } + } + + hHrtf->same_inv_diffuse_weight = 1; + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + if ( hHrtf->inv_diffuse_weight_fx[0][i] != hHrtf->inv_diffuse_weight_fx[1][i] ) { - hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_foa->latency_s_fx; // Q31 - hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_foa->max_num_iterations; - hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_foa->index_frequency_max_diffuse; - move32(); - move16(); - move16(); + hHrtf->same_inv_diffuse_weight = 0; + break; + } + } + } - FOR( i = 0; i < hHrtf->max_num_ir; i++ ) - { - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_foa->inv_diffuse_weight_fx[i]; // Q31 - move16(); - - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations[i][j]; - hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max[i][j]; - - hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_re_fx[i][j]; // Q29 - hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_im_fx[i][j]; // Q29 - move32(); - move32(); - move16(); - move16(); - } - } - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations_diffuse[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max_diffuse[j]; - - hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_re_fx[j]; // Q31 - hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_im_fx[j]; // Q31 - move32(); - move32(); - move16(); - move16(); - } - } - ELSE - { - return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" ); - } - } - } - - pCrend->hHrtfCrend = hHrtf; + pCrend->hHrtfCrend = hHrtf; return IVAS_ERR_OK; } @@ -1385,20 +1372,24 @@ static ivas_error ivas_er_init_handle( { return error; } + return IVAS_ERR_OK; } + /*------------------------------------------------------------------------- * ivas_rend_initCrendWrapper() * * Allocate and initialize crend renderer handle *------------------------------------------------------------------------*/ -ivas_error ivas_rend_initCrendWrapper( - CREND_WRAPPER_HANDLE *pCrend ) +ivas_error ivas_rend_initCrendWrapper_fx( + CREND_WRAPPER_HANDLE *pCrend, + const Word16 num_poses ) { Word16 i; CREND_HANDLE hCrend; + Word16 pos_idx; IF( pCrend == NULL ) { @@ -1413,7 +1404,16 @@ ivas_error ivas_rend_initCrendWrapper( ( *pCrend )->binaural_latency_ns = 0; move32(); ( *pCrend )->hHrtfCrend = NULL; + ( *pCrend )->io_qfactor = 0; + move16(); + ( *pCrend )->p_io_qfactor = &( *pCrend )->io_qfactor; + + FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) + { + ( *pCrend )->hCrend[pos_idx] = NULL; + } + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) { hCrend = NULL; IF( ( hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) @@ -1435,8 +1435,10 @@ ivas_error ivas_rend_initCrendWrapper( } hCrend->hTrack = NULL; - hCrend->freq_buffer_re_diffuse_fx = NULL; - hCrend->freq_buffer_im_diffuse_fx = NULL; + hCrend->freq_buffer_re_diffuse_fx[0] = NULL; + hCrend->freq_buffer_re_diffuse_fx[1] = NULL; + hCrend->freq_buffer_im_diffuse_fx[0] = NULL; + hCrend->freq_buffer_im_diffuse_fx[1] = NULL; hCrend->hReverb = NULL; hCrend->reflections = NULL; hCrend->delay_line_rw_index = 0; @@ -1450,187 +1452,243 @@ ivas_error ivas_rend_initCrendWrapper( move32(); move32(); - ( *pCrend )->hCrend = hCrend; + ( *pCrend )->hCrend[pos_idx] = hCrend; } return IVAS_ERR_OK; } +/*------------------------------------------------------------------------- + * ivas_rend_openMultiBinCrend() + * + * Allocate and initialize crend renderer handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_rend_openMultiBinCrend( + CREND_WRAPPER_HANDLE *pCrend, + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig, + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const Word32 output_Fs ) +{ + return ivas_rend_openCrend_fx( pCrend, inConfig, outConfig, NULL /*hRendCfg*/, NULL, NULL /* hHrtfStatistics */, output_Fs, 0, pMultiBinPoseData->num_poses ); +} + + /*------------------------------------------------------------------------- * ivas_rend_openCrend() * * Allocate and initialize crend renderer handle *------------------------------------------------------------------------*/ -ivas_error ivas_rend_openCrend( +ivas_error ivas_rend_openCrend_fx( CREND_WRAPPER_HANDLE *pCrend, const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, - HRTFS_CREND_HANDLE hSetOfHRTF, - const Word32 output_Fs ) + HRTFS_CREND_HANDLE hHrtfCrend, + HRTFS_STATISTICS_HANDLE hHrtfStatistics, + const Word32 output_Fs, + const Word16 ext_rend_flag, + const Word16 num_poses ) { Word16 i, subframe_length; - Word16 max_total_ir_len; - HRTFS_HANDLE hHrtf; + Word32 max_total_ir_len; + HRTFS_CREND_HANDLE hHrtf; CREND_HANDLE hCrend; ivas_error error; + Word16 pos_idx; - error = IVAS_ERR_OK; - move16(); - - IF( NE_32( ( error = ivas_rend_initCrendWrapper( pCrend ) ), IVAS_ERR_OK ) ) + IF( ( error = ivas_rend_initCrendWrapper_fx( pCrend, num_poses ) ) != IVAS_ERR_OK ) { return error; } subframe_length = extract_l( Mult_32_16( output_Fs, 164 ) ); /*( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES(i/o:164=(32768/FRAMES_PER_SEC)/MAX_PARAM_SPATIAL_SUBFRAMES*/ - IF( ( *pCrend )->hHrtfCrend == NULL ){ - IF( NE_32( ( error = ivas_rend_initCrend_fx( *pCrend, inConfig, outConfig, hSetOfHRTF, output_Fs ) ), IVAS_ERR_OK ) ){ + IF( ( *pCrend )->hHrtfCrend == NULL ) + { + IF( NE_32( ( error = ivas_rend_initCrend_fx( *pCrend, inConfig, outConfig, hHrtfCrend, ext_rend_flag, output_Fs ) ), IVAS_ERR_OK ) ) + { return error; -} -} - -{ - hCrend = ( *pCrend )->hCrend; - hHrtf = ( *pCrend )->hHrtfCrend; + } + } - IF( hHrtf != NULL ) + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) { - max_total_ir_len = imult1616( hHrtf->max_num_iterations, subframe_length ); + hCrend = ( *pCrend )->hCrend[pos_idx]; + hHrtf = ( *pCrend )->hHrtfCrend; - FOR( i = 0; i < hHrtf->max_num_ir; i++ ) + IF( hHrtf != NULL ) { - IF( ( hCrend->freq_buffer_re_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - set_zero_fx( hCrend->freq_buffer_re_fx[i], max_total_ir_len ); - IF( ( hCrend->freq_buffer_im_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + max_total_ir_len = L_mult0( hHrtf->max_num_iterations, subframe_length ); + + FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + IF( ( hCrend->freq_buffer_re_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero2_fx( hCrend->freq_buffer_re_fx[i], max_total_ir_len ); + + IF( ( hCrend->freq_buffer_im_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero2_fx( hCrend->freq_buffer_im_fx[i], max_total_ir_len ); } - set_zero_fx( hCrend->freq_buffer_im_fx[i], max_total_ir_len ); - } - FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - IF( ( hCrend->prev_out_buffer_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * subframe_length ) ) == NULL ) + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + IF( ( hCrend->prev_out_buffer_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * subframe_length ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero_fx( hCrend->prev_out_buffer_fx[i], subframe_length ); } - set_zero_fx( hCrend->prev_out_buffer_fx[i], subframe_length ); - } - max_total_ir_len = imult1616( (Word16) hHrtf->num_iterations_diffuse[0], subframe_length ); + max_total_ir_len = L_mult0( (Word16) hHrtf->num_iterations_diffuse[0], subframe_length ); - IF( max_total_ir_len > 0 ) - { - IF( ( hCrend->freq_buffer_re_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + IF( max_total_ir_len > 0 ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + IF( ( hCrend->freq_buffer_re_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + IF( hHrtf->same_inv_diffuse_weight == 0 ) + { + IF( ( hCrend->freq_buffer_re_diffuse_fx[1] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + } + ELSE + { + hCrend->freq_buffer_re_diffuse_fx[1] = NULL; + } + set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[0], max_total_ir_len ); + IF( hCrend->freq_buffer_re_diffuse_fx[1] != NULL ) + { + set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[1], max_total_ir_len ); + } + IF( ( hCrend->freq_buffer_im_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + IF( hHrtf->same_inv_diffuse_weight == 0 ) + { + IF( ( hCrend->freq_buffer_im_diffuse_fx[1] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + } + ELSE + { + hCrend->freq_buffer_im_diffuse_fx[1] = NULL; + } + set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[0], max_total_ir_len ); + IF( hCrend->freq_buffer_im_diffuse_fx[1] != NULL ) + { + set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[1], max_total_ir_len ); + } } - set_zero_fx( hCrend->freq_buffer_re_diffuse_fx, max_total_ir_len ); - IF( ( hCrend->freq_buffer_im_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + ELSE { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + hCrend->freq_buffer_re_diffuse_fx[0] = NULL; + hCrend->freq_buffer_im_diffuse_fx[0] = NULL; + hCrend->freq_buffer_re_diffuse_fx[1] = NULL; + hCrend->freq_buffer_im_diffuse_fx[1] = NULL; } - set_zero_fx( hCrend->freq_buffer_im_diffuse_fx, max_total_ir_len ); - } - ELSE - { - hCrend->freq_buffer_re_diffuse_fx = NULL; - hCrend->freq_buffer_im_diffuse_fx = NULL; - } - max_total_ir_len = add( extract_l( L_shr( L_add( L_shl( Mult_32_32( hHrtf->latency_s_fx, output_Fs ), 1 ), 1 ), 1 ) ), subframe_length ); /*(int16_t) ( hHrtf->latency_s * output_Fs + 0.5f ) + subframe_length;*/ - IF( max_total_ir_len > 0 ) - { - IF( ( hCrend->lfe_delay_line_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + max_total_ir_len = add( extract_l( L_shr( L_add( L_shl( Mult_32_32( hHrtf->latency_s_fx, output_Fs ), 1 ), 1 ), 1 ) ), subframe_length ); /*(int16_t) ( hHrtf->latency_s * output_Fs + 0.5f ) + subframe_length;*/ + IF( max_total_ir_len > 0 ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + IF( ( hCrend->lfe_delay_line_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero2_fx( hCrend->lfe_delay_line_fx, max_total_ir_len ); } - set_zero_fx( hCrend->lfe_delay_line_fx, max_total_ir_len ); - } - ELSE - { - hCrend->lfe_delay_line_fx = NULL; - } - - IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) - { - IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend, NULL, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) + ELSE { - return error; + hCrend->lfe_delay_line_fx = NULL; } - IF( EQ_16( hRendCfg->roomAcoustics.use_er, 1 ) ) + IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { - - /* Allocate memory for reflections */ - hCrend->reflections = (er_struct_t *) malloc( sizeof( er_struct_t ) ); - IF( !hCrend->reflections ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections" ); - } - IF( NE_32( ( error = ivas_er_init_handle( hCrend->reflections ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), hHrtfStatistics, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } - hCrend->reflections->use_er = hRendCfg->roomAcoustics.use_er; - hCrend->reflections->lowComplexity = hRendCfg->roomAcoustics.lowComplexity; - move16(); - move32(); + IF( EQ_16( hRendCfg->roomAcoustics.use_er, 1 ) ) + { - /* Set sample rate and frame size */ + /* Allocate memory for reflections */ + hCrend->reflections = (er_struct_t *) malloc( sizeof( er_struct_t ) ); + IF( !hCrend->reflections ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections" ); + } + IF( NE_32( ( error = ivas_er_init_handle( hCrend->reflections ) ), IVAS_ERR_OK ) ) + { + return error; + } - hCrend->reflections->output_Fs_fx = output_Fs; // Q0 - move32(); + hCrend->reflections->use_er = hRendCfg->roomAcoustics.use_er; + hCrend->reflections->lowComplexity = hRendCfg->roomAcoustics.lowComplexity; + move16(); + move32(); - hCrend->reflections->max_frame_size = extract_l( Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); - move32(); + /* Set sample rate and frame size */ - /* Init Shoebox */ - ivas_shoebox_config_init( &hCrend->reflections->shoebox_lib.cal, hRendCfg ); + hCrend->reflections->output_Fs_fx = output_Fs; // Q0 + move32(); + + hCrend->reflections->max_frame_size = extract_l( Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); + move32(); + + /* Init Shoebox */ + ivas_shoebox_config_init( &hCrend->reflections->shoebox_lib.cal, hRendCfg ); - /* Init and compute Reflections */ - IF( NE_32( ( error = ivas_er_init( hCrend->reflections, inConfig ) ), IVAS_ERR_OK ) ) + /* Init and compute Reflections */ + IF( NE_32( ( error = ivas_er_init( hCrend->reflections, inConfig ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE { - return error; + hCrend->reflections = NULL; } } ELSE { - hCrend->reflections = NULL; + hCrend->hReverb = NULL; } - } - ELSE - { - hCrend->hReverb = NULL; + ( *pCrend )->binaural_latency_ns = L_shr_r( Mpy_32_32_r( ( *pCrend )->hHrtfCrend->latency_s_fx, (Word32) 1000000000 ), ( *pCrend )->hHrtfCrend->factor_Q_latency_s_fx ); + move32(); } - ( *pCrend )->binaural_latency_ns = Mult_32_32( ( *pCrend )->hHrtfCrend->latency_s_fx, (Word32) 1000000000 ); - move32(); + ( *pCrend )->hCrend[pos_idx] = hCrend; } - ( *pCrend )->hCrend = hCrend; -} -return IVAS_ERR_OK; + return IVAS_ERR_OK; } + /*------------------------------------------------------------------------- * ivas_rend_closeCrend() * * Deallocate Crend renderer handle *------------------------------------------------------------------------*/ -void ivas_rend_closeCrend( +void ivas_rend_closeCrend_fx( CREND_WRAPPER_HANDLE *pCrend ) { Word16 i; + Word16 pos_idx; CREND_HANDLE hCrend; test(); @@ -1639,13 +1697,15 @@ void ivas_rend_closeCrend( return; } - IF( ( *pCrend )->hHrtfCrend != NULL ) + test(); + IF( ( *pCrend )->hHrtfCrend != NULL && ( *pCrend )->hHrtfCrend->init_from_rom ) { ivas_hrtf_close( &( *pCrend )->hHrtfCrend ); } + FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) { - hCrend = ( *pCrend )->hCrend; + hCrend = ( *pCrend )->hCrend[pos_idx]; IF( hCrend != NULL ) { FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) @@ -1676,16 +1736,28 @@ void ivas_rend_closeCrend( free( hCrend->lfe_delay_line_fx ); hCrend->lfe_delay_line_fx = NULL; } + IF( hCrend->freq_buffer_re_diffuse_fx[0] != NULL ) + { + free( hCrend->freq_buffer_re_diffuse_fx[0] ); + hCrend->freq_buffer_re_diffuse_fx[0] = NULL; + } - IF( hCrend->freq_buffer_re_diffuse_fx != NULL ) + IF( hCrend->freq_buffer_im_diffuse_fx[0] != NULL ) { - free( hCrend->freq_buffer_re_diffuse_fx ); - hCrend->freq_buffer_re_diffuse_fx = NULL; + free( hCrend->freq_buffer_im_diffuse_fx[0] ); + hCrend->freq_buffer_im_diffuse_fx[0] = NULL; } - IF( hCrend->freq_buffer_im_diffuse_fx != NULL ) + + IF( hCrend->freq_buffer_re_diffuse_fx[1] != NULL ) + { + free( hCrend->freq_buffer_re_diffuse_fx[1] ); + hCrend->freq_buffer_re_diffuse_fx[1] = NULL; + } + + IF( hCrend->freq_buffer_im_diffuse_fx[1] != NULL ) { - free( hCrend->freq_buffer_im_diffuse_fx ); - hCrend->freq_buffer_im_diffuse_fx = NULL; + free( hCrend->freq_buffer_im_diffuse_fx[1] ); + hCrend->freq_buffer_im_diffuse_fx[1] = NULL; } IF( hCrend->hTrack != NULL ) { @@ -1693,7 +1765,7 @@ void ivas_rend_closeCrend( hCrend->hTrack = NULL; } - ivas_reverb_close( &hCrend->hReverb ); + ivas_reverb_close_fx( &hCrend->hReverb ); IF( hCrend->reflections != NULL ) { @@ -1712,7 +1784,7 @@ void ivas_rend_closeCrend( } free( hCrend ); hCrend = NULL; - ( *pCrend )->hCrend = hCrend; + ( *pCrend )->hCrend[pos_idx] = hCrend; } } @@ -1723,37 +1795,61 @@ void ivas_rend_closeCrend( } +/*------------------------------------------------------------------------- + * ivas_rend_closeCldfbRend() + * + * Close CLDFB based fastconv binaural renderer memories + *------------------------------------------------------------------------*/ + +void ivas_rend_closeCldfbRend( + CLDFB_REND_WRAPPER *pCldfbRend ) +{ + IF( pCldfbRend->hCldfbRend->hInputSetup != NULL ) + { + free( pCldfbRend->hCldfbRend->hInputSetup ); + pCldfbRend->hCldfbRend->hInputSetup = NULL; + } + + ivas_binRenderer_close_fx( &pCldfbRend->hCldfbRend ); + ivas_binaural_hrtf_close_fx( &pCldfbRend->hHrtfFastConv ); + ivas_HRTF_fastconv_binary_close_fx( &pCldfbRend->hHrtfFastConv ); + + return; +} + + /*-----------------------------------------------------------------------------------------* * Function ivas_rend_crendConvolver() * * Convolver block *-----------------------------------------------------------------------------------------*/ -static ivas_error ivas_rend_crendConvolver( +static ivas_error ivas_rend_crendConvolver_fx( const CREND_WRAPPER *pCrend, AUDIO_CONFIG inConfig, AUDIO_CONFIG outConfig, Word32 *pcm_in[], // Qx Word32 *pcm_out[], // Qx const Word32 output_Fs, - const Word16 i_ts ) + const Word16 i_ts, + const Word16 pos_idx ) { Word16 i, j, k, m; - Word16 subframe_length, idx_in; + Word16 subframe_length, idx_in, index_in; Word16 lfe_idx_in; - Word16 offset, offset_in, offset_diffuse; + Word32 offset, offset_in, offset_diffuse; Word16 nchan_in, nchan_out; const Word32 *pIn; Word32 *pFreq_buf_re, *pFreq_buf_im; - const Word32 *pFreq_filt_re, *pFreq_filt_im; - Word32 pOut[L_FRAME48k * 2]; - Word32 tmp_out_re[L_FRAME48k]; - Word32 tmp_out_im[L_FRAME48k]; + Word32 *pFreq_buf2_re = NULL, *pFreq_buf2_im = NULL; + Word32 *pFreq_buf3_re = NULL, *pFreq_buf3_im = NULL; + const Word16 *pFreq_filt_re, *pFreq_filt_im; + Word32 pOut[2 /*Re,Im*/ * L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 tmp_out_re[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp_out_im[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; CREND_HANDLE hCrend; ivas_error error; - - hCrend = pCrend->hCrend; + hCrend = pCrend->hCrend[pos_idx]; IF( NE_32( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ), IVAS_ERR_OK ) ) { @@ -1783,54 +1879,77 @@ static ivas_error ivas_rend_crendConvolver( } } - offset = imult1616( hCrend->delay_line_rw_index, subframe_length ); /* subframe_length * ( pCrend->hHrtfCrend->max_num_iterations - 1 ); */ - offset_diffuse = imult1616( hCrend->diffuse_delay_line_rw_index, subframe_length ); /* subframe_length *( pCrend->hHrtfCrend->num_iterations_diffuse[0] - 1 ); */ + offset = L_mult0( hCrend->delay_line_rw_index, subframe_length ); /* subframe_length * ( pCrend->hHrtfCrend->max_num_iterations - 1 ); */ + offset_diffuse = L_mult0( hCrend->diffuse_delay_line_rw_index, subframe_length ); /* subframe_length *( pCrend->hHrtfCrend->num_iterations_diffuse[0] - 1 ); */ IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { - set32_fx( &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse], 0, subframe_length ); - set32_fx( &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse], 0, subframe_length ); + pFreq_buf2_re = &hCrend->freq_buffer_re_diffuse_fx[0][offset_diffuse]; + pFreq_buf2_im = &hCrend->freq_buffer_im_diffuse_fx[0][offset_diffuse]; + set_val_Word32( &hCrend->freq_buffer_re_diffuse_fx[0][offset_diffuse], 0, subframe_length ); + set_val_Word32( &hCrend->freq_buffer_im_diffuse_fx[0][offset_diffuse], 0, subframe_length ); + IF( pCrend->hHrtfCrend->same_inv_diffuse_weight == 0 ) + { + set_val_Word32( &hCrend->freq_buffer_re_diffuse_fx[1][offset_diffuse], 0, subframe_length ); + set_val_Word32( &hCrend->freq_buffer_im_diffuse_fx[1][offset_diffuse], 0, subframe_length ); + pFreq_buf3_re = &hCrend->freq_buffer_re_diffuse_fx[1][offset_diffuse]; + pFreq_buf3_im = &hCrend->freq_buffer_im_diffuse_fx[1][offset_diffuse]; + } } i = 0; - move16(); FOR( idx_in = 0; idx_in < nchan_in; idx_in++ ) { pIn = &pcm_in[idx_in][i_ts * subframe_length]; - + pFreq_buf_re = &hCrend->freq_buffer_re_fx[i][offset]; + pFreq_buf_im = &hCrend->freq_buffer_im_fx[i][offset]; IF( NE_16( idx_in, lfe_idx_in ) ) { IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { - pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse]; // Qx - pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse]; // Qx - pFreq_filt_re = &hCrend->freq_buffer_re_fx[i][offset]; // Qx - pFreq_filt_im = &hCrend->freq_buffer_im_fx[i][offset]; // Qx FOR( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) { - pFreq_buf_re[k] = L_add( Mpy_32_16_r( pFreq_filt_re[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[i] ), pFreq_buf_re[k] ); // Qx - pFreq_buf_im[k] = L_add( Mpy_32_16_r( pFreq_filt_im[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[i] ), pFreq_buf_im[k] ); // Qx - move32(); - move32(); + pFreq_buf2_re[k] = Madd_32_16( pFreq_buf2_re[k], pFreq_buf_re[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i] ); + pFreq_buf2_im[k] = Madd_32_16( pFreq_buf2_im[k], pFreq_buf_im[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i] ); + } + IF( pCrend->hHrtfCrend->same_inv_diffuse_weight == 0 ) + { + FOR( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) + { + pFreq_buf3_re[k] = Madd_32_16( pFreq_buf3_re[k], pFreq_buf_re[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[1][i] ); + pFreq_buf3_im[k] = Madd_32_16( pFreq_buf3_im[k], pFreq_buf_im[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[1][i] ); + } } } - pFreq_buf_re = &hCrend->freq_buffer_re_fx[i][offset]; // Qx - pFreq_buf_im = &hCrend->freq_buffer_im_fx[i][offset]; // Qx - ivas_mdft_fx( pIn, pFreq_buf_re, pFreq_buf_im, subframe_length, subframe_length ); -#ifdef DEBUGGING - dbgwrite_txt( (const float *) pFreq_buf_re, subframe_length, "Fixed_pFreq_buf_re_mdft.txt", NULL ); - dbgwrite_txt( (const float *) pFreq_buf_im, subframe_length, "Fixed_pFreq_buf_im_mdft.txt", NULL ); -#endif i = add( i, 1 ); } } + IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) + { + FOR( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) + { + pFreq_buf2_re[k] = L_shl( pFreq_buf2_re[k], pCrend->hHrtfCrend->factor_Q_inv_diffuse_weight ); + pFreq_buf2_im[k] = L_shl( pFreq_buf2_im[k], pCrend->hHrtfCrend->factor_Q_inv_diffuse_weight ); + } + IF( pCrend->hHrtfCrend->same_inv_diffuse_weight == 0 ) + { + FOR( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) + { + pFreq_buf2_re[k] = L_shl( pFreq_buf2_re[k], pCrend->hHrtfCrend->factor_Q_inv_diffuse_weight ); + pFreq_buf2_im[k] = L_shl( pFreq_buf2_im[k], pCrend->hHrtfCrend->factor_Q_inv_diffuse_weight ); + pFreq_buf3_re[k] = L_shl( pFreq_buf3_re[k], pCrend->hHrtfCrend->factor_Q_inv_diffuse_weight ); + pFreq_buf3_im[k] = L_shl( pFreq_buf3_im[k], pCrend->hHrtfCrend->factor_Q_inv_diffuse_weight ); + } + } + } + FOR( j = 0; j < nchan_out; j++ ) { - set32_fx( tmp_out_re, 0, subframe_length ); - set32_fx( tmp_out_im, 0, subframe_length ); + set_zero_fx( tmp_out_re, subframe_length ); + set_zero_fx( tmp_out_im, subframe_length ); i = 0; move16(); FOR( idx_in = 0; idx_in < nchan_in; idx_in++ ) @@ -1841,23 +1960,21 @@ static ivas_error ivas_rend_crendConvolver( move16(); FOR( m = 0; m < pCrend->hHrtfCrend->num_iterations[i][j]; m++ ) { - offset_in = add( add( hCrend->delay_line_rw_index, sub( pCrend->hHrtfCrend->max_num_iterations, pCrend->hHrtfCrend->num_iterations[i][j] ) ), add( m, 1 ) ); - offset_in = offset_in % ( pCrend->hHrtfCrend->max_num_iterations ); - move16(); - offset_in = imult1616( offset_in, subframe_length ); - pFreq_buf_re = &hCrend->freq_buffer_re_fx[i][offset_in]; // Qx - pFreq_buf_im = &hCrend->freq_buffer_im_fx[i][offset_in]; // Qx - pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_re_fx[i][j][offset]; // Q29 - pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_im_fx[i][j][offset]; // Q29 + index_in = add( add( hCrend->delay_line_rw_index, sub( pCrend->hHrtfCrend->max_num_iterations, pCrend->hHrtfCrend->num_iterations[i][j] ) ), add( m, 1 ) ); + index_in = index_in % ( pCrend->hHrtfCrend->max_num_iterations ); + offset_in = L_mult0( index_in, subframe_length ); + pFreq_buf_re = &hCrend->freq_buffer_re_fx[i][offset_in]; + pFreq_buf_im = &hCrend->freq_buffer_im_fx[i][offset_in]; + pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_re_fx[i][j][offset]; + pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_im_fx[i][j][offset]; FOR( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max[i][j][m]; k++ ) { - tmp_out_re[k] = L_add( Msub_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_re[k] ), pFreq_buf_im[k], pFreq_filt_im[k] ), tmp_out_re[k] ); // Qx - 2 - tmp_out_im[k] = L_add( Madd_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_im[k] ), pFreq_buf_im[k], pFreq_filt_re[k] ), tmp_out_im[k] ); // Qx - 2 - move32(); - move32(); + tmp_out_re[k] = L_add( tmp_out_re[k], Msub_32_16( Mpy_32_16_r( pFreq_buf_re[k], pFreq_filt_re[k] ), pFreq_buf_im[k], pFreq_filt_im[k] ) ); + tmp_out_im[k] = L_add( tmp_out_im[k], Madd_32_16( Mpy_32_16_r( pFreq_buf_re[k], pFreq_filt_im[k] ), pFreq_buf_im[k], pFreq_filt_re[k] ) ); } - offset = add( offset, k ); + offset = L_add( offset, k ); + move32(); } i = add( i, 1 ); } @@ -1867,207 +1984,51 @@ static ivas_error ivas_rend_crendConvolver( move16(); FOR( m = 0; m < pCrend->hHrtfCrend->num_iterations_diffuse[j]; m++ ) { - offset_diffuse = add( hCrend->diffuse_delay_line_rw_index, add( m, 1 ) ); - offset_diffuse = offset_diffuse % pCrend->hHrtfCrend->num_iterations_diffuse[0]; - move16(); - offset_diffuse = imult1616( offset_diffuse, subframe_length ); - pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse]; // Qx - pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse]; // Qx - pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_re_fx[j][offset]; // Q31 - pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_im_fx[j][offset]; // Q31 + index_in = add( hCrend->diffuse_delay_line_rw_index, add( m, 1 ) ); + index_in = index_in % pCrend->hHrtfCrend->num_iterations_diffuse[0]; + offset_diffuse = L_mult0( index_in, subframe_length ); + IF( pCrend->hHrtfCrend->same_inv_diffuse_weight ) + { + pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[0][offset_diffuse]; + pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[0][offset_diffuse]; + } + ELSE + { + pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[j][offset_diffuse]; + pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[j][offset_diffuse]; + } + pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_re_fx[j][offset]; + pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_im_fx[j][offset]; + FOR( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max_diffuse[j][m]; k++ ) { - tmp_out_re[k] = L_add( L_shr( Msub_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_re[k] ), pFreq_buf_im[k], pFreq_filt_im[k] ), 2 ), tmp_out_re[k] ); // Qx - 2 - tmp_out_im[k] = L_add( L_shr( Madd_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_im[k] ), pFreq_buf_im[k], pFreq_filt_re[k] ), 2 ), tmp_out_im[k] ); // Qx - 2 - move32(); - move32(); + tmp_out_re[k] = L_add( tmp_out_re[k], Msub_32_16( Mpy_32_16_r( pFreq_buf_re[k], pFreq_filt_re[k] ), pFreq_buf_im[k], pFreq_filt_im[k] ) ); + tmp_out_im[k] = L_add( tmp_out_im[k], Madd_32_16( Mpy_32_16_r( pFreq_buf_re[k], pFreq_filt_im[k] ), pFreq_buf_im[k], pFreq_filt_re[k] ) ); } - offset = add( offset, k ); + offset = L_add( offset, k ); } ivas_imdft_fx( tmp_out_re, tmp_out_im, pOut, subframe_length ); - scale_sig32( pOut, shl( subframe_length, 1 ), 2 ); -#ifdef DEBUGGING - dbgwrite_txt( (const float *) pOut, subframe_length << 1, "Fixed_imdft_out.txt", NULL ); -#endif - pFreq_buf_re = &pcm_out[j][i_ts * subframe_length]; + + pFreq_buf_re = &pcm_out[j][L_mult0( i_ts, subframe_length )]; FOR( k = 0; k < subframe_length; k++ ) { - pFreq_buf_re[k] = L_add( pOut[k], hCrend->prev_out_buffer_fx[j][k] ); // Qx - hCrend->prev_out_buffer_fx[j][k] = pOut[k + subframe_length]; // Qx - move32(); - move32(); + pFreq_buf_re[k] = L_shl( L_add( pOut[k], hCrend->prev_out_buffer_fx[j][k] ), pCrend->hHrtfCrend->factor_Q_pOut_to_bin ); + hCrend->prev_out_buffer_fx[j][k] = pOut[k + subframe_length]; } } hCrend->delay_line_rw_index = add( hCrend->delay_line_rw_index, 1 ); hCrend->delay_line_rw_index = hCrend->delay_line_rw_index % ( pCrend->hHrtfCrend->max_num_iterations ); - move16(); - move16(); IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { hCrend->diffuse_delay_line_rw_index = add( hCrend->diffuse_delay_line_rw_index, 1 ); hCrend->diffuse_delay_line_rw_index = hCrend->diffuse_delay_line_rw_index % ( pCrend->hHrtfCrend->num_iterations_diffuse[0] ); - move16(); - move16(); } return IVAS_ERR_OK; } -/*-----------------------------------------------------------------------------------------* - * Function ivas_rend_crend_Process() - * - * Process call for IVAS Crend renderer - *-----------------------------------------------------------------------------------------*/ - -ivas_error ivas_rend_crendProcess( - const CREND_WRAPPER *pCrend, - const AUDIO_CONFIG inConfig, - const AUDIO_CONFIG outConfig, - DECODER_CONFIG_HANDLE hDecoderConfig, - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, - IVAS_OUTPUT_SETUP_HANDLE hIntSetup, - EFAP_HANDLE hEFAPdata, - Word32 *output_fx[], /* i/o: input/output audio channels Qx */ - const Word32 output_Fs, - const Word16 num_subframes /* i : number of subframes to render */ -) -{ - Word16 i, subframe_idx, subframe_len; - Word16 nchan_out; - Word32 pcm_tmp_fx[BINAURAL_CHANNELS][L_FRAME48k]; - Word32 *p_pcm_tmp_fx[BINAURAL_CHANNELS]; - IVAS_REND_AudioConfigType inConfigType; - Word8 combinedOrientationEnabled; - ivas_error error; - CREND_HANDLE hCrend; - - hCrend = pCrend->hCrend; - - combinedOrientationEnabled = 0; - move16(); - IF( hCombinedOrientationData != NULL ) - { - FOR( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) - { - IF( hCombinedOrientationData->enableCombinedOrientation[subframe_idx] != 0 ) - { - combinedOrientationEnabled = 1; - move16(); - BREAK; - } - } - } - - push_wmops( "ivas_rend_crendProcess" ); - inConfigType = getAudioConfigType( inConfig ); - - IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ), IVAS_ERR_OK ) ) - { - return error; - } - subframe_len = L_SUBFRAME_48k; - move16(); - SWITCH( output_Fs ) - { - case 48000: - subframe_len = L_SUBFRAME_48k; - move16(); - BREAK; - case 32000: - subframe_len = L_SUBFRAME_32k; - move16(); - BREAK; - case 16000: - subframe_len = L_SUBFRAME_16k; - move16(); - BREAK; - case 8000: - subframe_len = L_SUBFRAME_8k; - move16(); - BREAK; - default: - BREAK; - } - - FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - p_pcm_tmp_fx[i] = pcm_tmp_fx[i]; - move32(); - } - - FOR( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) - { - /* Early Reflections */ - IF( hCrend->reflections != NULL ) - { - test(); - IF( EQ_16( hCrend->reflections->use_er, 1 ) && EQ_16( hCrend->reflections->is_ready, 1 ) ) - { - IF( NE_32( ( error = ivas_er_process( hCrend->reflections, subframe_len, subframe_idx, output_fx, inConfig ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - - test(); - IF( hDecoderConfig && combinedOrientationEnabled ) - { - /* Orientation tracking */ - - /* Rotation in SHD for: - MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL - SBA SPAR -> BINAURAL or BINAURAL_ROOM - */ - test(); - test(); - test(); - IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_FOA ) || EQ_16( inConfig, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_16( inConfig, IVAS_AUDIO_CONFIG_HOA3 ) ) - { - rotateFrame_shd( hCombinedOrientationData, output_fx, subframe_len, *hIntSetup, subframe_idx ); - } - /* Rotation in SD for MC -> BINAURAL_ROOM */ - ELSE IF( ( hIntSetup != NULL ) && hIntSetup->is_loudspeaker_setup ) - { - rotateFrame_sd( hCombinedOrientationData, output_fx, subframe_len, *hIntSetup, hEFAPdata, subframe_idx ); - } - } - test(); - IF( EQ_16( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || EQ_16( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) - { - - IF( NE_32( ( error = ivas_rend_crendConvolver( pCrend, inConfig, outConfig, output_fx, p_pcm_tmp_fx, output_Fs, subframe_idx ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( hCrend->hReverb != NULL ) - { - IF( NE_32( ( error = ivas_reverb_process_fx( pCrend->hCrend->hReverb, inConfig, 1, output_fx, p_pcm_tmp_fx, subframe_idx ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /* update combined orientation access index */ - ivas_combined_orientation_update_index( hCombinedOrientationData, subframe_len ); - } - ELSE - { - return IVAS_ERR_INVALID_INPUT_FORMAT; - } - } - /* move to output */ - FOR( i = 0; i < nchan_out; i++ ) - { - MVR2R_WORD32( pcm_tmp_fx[i], output_fx[i], imult1616( num_subframes, subframe_len ) ); - } - - pop_wmops(); - return IVAS_ERR_OK; -} /*-----------------------------------------------------------------------------------------* * Function ivas_rend_crendProcessSubframe() @@ -2075,7 +2036,7 @@ ivas_error ivas_rend_crendProcess( * *-----------------------------------------------------------------------------------------*/ -ivas_error ivas_rend_crendProcessSubframe( +ivas_error ivas_rend_crendProcessSubframe_fx( const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ const AUDIO_CONFIG inConfig, /* i : input audio configuration */ const AUDIO_CONFIG outConfig, /* i : output audio configuration */ @@ -2087,19 +2048,20 @@ ivas_error ivas_rend_crendProcessSubframe( Word32 *input_f[], /* i : transport channels Qx */ Word32 *output[], /* i/o: input/output audio channels Qx */ const Word16 n_samples_to_render, /* i : output frame length per channel */ - const Word32 output_Fs /* i : output sampling rate */ -) + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 pos_idx ) { Word16 subframe_idx, subframe_len; Word16 nchan_out, nchan_in, ch, first_sf, last_sf, slot_size, slots_to_render; Word32 *tc_local_fx[MAX_OUTPUT_CHANNELS]; - Word32 pcm_tmp_fx[BINAURAL_CHANNELS][L_FRAME48k]; + Word32 *p_output_fx[BINAURAL_CHANNELS]; + Word32 pcm_tmp_fx[BINAURAL_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; Word32 *p_pcm_tmp_fx[BINAURAL_CHANNELS]; IVAS_REND_AudioConfigType inConfigType; ivas_error error; Word8 combinedOrientationEnabled; CREND_HANDLE hCrend; - hCrend = pCrend->hCrend; + hCrend = pCrend->hCrend[pos_idx]; combinedOrientationEnabled = 0; move16(); @@ -2132,25 +2094,68 @@ ivas_error ivas_rend_crendProcessSubframe( FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { p_pcm_tmp_fx[ch] = pcm_tmp_fx[ch]; + p_output_fx[ch] = output[ch]; } - slot_size = hTcBuffer->n_samples_granularity; - move16(); - /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ - slots_to_render = s_min( sub( hTcBuffer->num_slots, hTcBuffer->slots_rendered ), idiv1616( n_samples_to_render, slot_size ) ); - first_sf = hTcBuffer->subframes_rendered; - move16(); - last_sf = first_sf; - move16(); + IF( hTcBuffer != NULL ) + { + slot_size = hTcBuffer->n_samples_granularity; + move16(); + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = s_min( sub( hTcBuffer->num_slots, hTcBuffer->slots_rendered ), idiv1616( n_samples_to_render, slot_size ) ); + first_sf = hTcBuffer->subframes_rendered; + move16(); + last_sf = first_sf; + move16(); + + WHILE( slots_to_render > 0 ) + { + slots_to_render = sub( slots_to_render, hTcBuffer->subframe_nbslots[last_sf] ); + last_sf = add( last_sf, 1 ); + } - WHILE( slots_to_render > 0 ) + subframe_len = -1; /* will be set later */ + move16(); + } + ELSE { - slots_to_render = sub( slots_to_render, hTcBuffer->subframe_nbslots[last_sf] ); - last_sf = add( last_sf, 1 ); + Word16 n_den, den, last_sf_tmp; + + SWITCH( output_Fs ) + { + case 48000: + subframe_len = L_SUBFRAME_48k; + move16(); + BREAK; + case 32000: + subframe_len = L_SUBFRAME_32k; + move16(); + BREAK; + case 16000: + default: + subframe_len = L_SUBFRAME_16k; + move16(); + BREAK; + } + + first_sf = 0; + move16(); + last_sf = idiv1616( n_samples_to_render, subframe_len ); + + n_den = norm_s( subframe_len ); + den = shl( subframe_len, n_den ); + last_sf_tmp = div_s( n_samples_to_render, den ); + last_sf = shr( last_sf_tmp, sub( 15, n_den ) ); } + FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { - subframe_len = imult1616( hTcBuffer->subframe_nbslots[subframe_idx], hTcBuffer->n_samples_granularity ); + if ( hTcBuffer != NULL ) + { + subframe_len = imult1616( hTcBuffer->subframe_nbslots[subframe_idx], hTcBuffer->n_samples_granularity ); + } + /* Early Reflections */ IF( hCrend->reflections != NULL ) { @@ -2188,39 +2193,48 @@ ivas_error ivas_rend_crendProcessSubframe( test(); IF( EQ_32( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || EQ_32( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { - - IF( NE_32( ( error = ivas_rend_crendConvolver( pCrend, inConfig, outConfig, tc_local_fx, p_pcm_tmp_fx, output_Fs, 0 ) ), IVAS_ERR_OK ) ) - + IF( NE_32( ( error = ivas_rend_crendConvolver_fx( pCrend, inConfig, outConfig, tc_local_fx, p_pcm_tmp_fx, output_Fs, 0, pos_idx ) ), IVAS_ERR_OK ) ) { return error; } - IF( pCrend->hCrend->hReverb != NULL ) + IF( pCrend->hCrend[0]->hReverb != NULL ) { - IF( NE_32( ( error = ivas_reverb_process_fx( pCrend->hCrend->hReverb, inConfig, 1, tc_local_fx, p_pcm_tmp_fx, 0 ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_process_fx( pCrend->hCrend[pos_idx]->hReverb, inConfig, 1, tc_local_fx, p_pcm_tmp_fx, 0 ) ), IVAS_ERR_OK ) ) { return error; } } + FOR( ch = 0; ch < nchan_in; ch++ ) { tc_local_fx[ch] += subframe_len; } - FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + + if ( hTcBuffer != NULL ) { - p_pcm_tmp_fx[ch] += subframe_len; + hTcBuffer->slots_rendered = add( hTcBuffer->subframe_nbslots[subframe_idx], hTcBuffer->slots_rendered ); + move16(); } - hTcBuffer->slots_rendered = add( hTcBuffer->subframe_nbslots[subframe_idx], hTcBuffer->slots_rendered ); - move16(); } ELSE { return IVAS_ERR_INVALID_INPUT_FORMAT; } + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + /* move to output */ + Copy32( pcm_tmp_fx[ch], p_output_fx[ch], subframe_len ); + + p_output_fx[ch] += subframe_len; + } + /* update combined orientation access index */ ivas_combined_orientation_update_index( hCombinedOrientationData, subframe_len ); } - IF( pCrend->hCrend->hReverb != NULL ) + + IF( pCrend->hCrend[0]->hReverb != NULL ) { *pCrend->p_io_qfactor = sub( *pCrend->p_io_qfactor, 2 ); move16(); @@ -2233,15 +2247,197 @@ ivas_error ivas_rend_crendProcessSubframe( } } } - /* move to output */ - FOR( ch = 0; ch < nchan_out; ch++ ) + + if ( hTcBuffer != NULL ) { - MVR2R_WORD32( pcm_tmp_fx[ch], output[ch], n_samples_to_render ); // Qx + hTcBuffer->subframes_rendered = last_sf; + move16(); } - hTcBuffer->subframes_rendered = last_sf; - move16(); pop_wmops(); return IVAS_ERR_OK; } + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_rend_crend_ProcessSubframesSplitBin() + * + * Process call for IVAS Crend renderer + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_rend_crendProcessSubframesSplitBin( + const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ + const AUDIO_CONFIG inConfig, /* i : input audio configuration */ + const AUDIO_CONFIG outConfig, /* i : output audio configuration */ + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ + const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ + DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ + Word32 *input_f[], /* i : transport channels */ + Word32 *output[], /* i/o: input/output audio channels */ + const Word16 n_samples_to_render, /* i : output frame length per channel */ + const Word32 output_Fs /* i : output sampling rate */ +) +{ + Word16 i, j; + Word16 sf; + Word16 pos_idx; + ivas_error error; + Word16 gain_lfe; + Word32 tmpLfeBuffer[L_FRAME48k]; + Word16 original_subframes_rendered, original_slots_rendered; + Word32 tmpInputBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + Word32 *p_tmpInputBuffer[MAX_OUTPUT_CHANNELS]; + Word32 tmpSplitBinBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + + COMBINED_ORIENTATION_DATA combinedOrientationDataLocal; + COMBINED_ORIENTATION_HANDLE pCombinedOrientationDataLocal; + + /* save current head positions */ + pCombinedOrientationDataLocal = hCombinedOrientationData; + combinedOrientationDataLocal = *pCombinedOrientationDataLocal; + original_subframes_rendered = hTcBuffer->subframes_rendered; + move16(); + original_slots_rendered = hTcBuffer->slots_rendered; + move16(); + + /* copy input */ + FOR( i = 0; i < hIntSetup->nchan_out_woLFE; ++i ) + { + Copy32( input_f[i], tmpInputBuffer[i], n_samples_to_render ); + } + + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; ++i ) + { + p_tmpInputBuffer[i] = tmpInputBuffer[i]; + move32(); + } + + /* save current head positions */ + pCombinedOrientationDataLocal = hCombinedOrientationData; + combinedOrientationDataLocal = *pCombinedOrientationDataLocal; + move32(); + move32(); + IF( EQ_32( pMultiBinPoseData->poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) ) + { + FOR( sf = 1; sf < hCombinedOrientationData->num_subframes; ++sf ) + { + Copy_Quat_fx( &combinedOrientationDataLocal.Quaternions[0], &combinedOrientationDataLocal.Quaternions[sf] ); + FOR( i = 0; i < 3; i++ ) + { + FOR( j = 0; j < 3; j++ ) + { + combinedOrientationDataLocal.Rmat_fx[sf][i][j] = combinedOrientationDataLocal.Rmat_fx[0][i][j]; + move32(); + } + } + } + } + + /* copy LFE to tmpLfeBuffer and apply gain only once */ + IF( GT_16( hIntSetup->num_lfe, 0 ) && NE_16( hIntSetup->index_lfe[0], -1 ) ) + { + Copy32( output[hIntSetup->index_lfe[0]], tmpLfeBuffer, n_samples_to_render ); + gain_lfe = ( ( pCrend != NULL ) && ( pCrend->hHrtfCrend != NULL ) ) ? pCrend->hHrtfCrend->gain_lfe_fx : GAIN_LFE_FX; + v_multc_fx_16( tmpLfeBuffer, gain_lfe, tmpLfeBuffer, n_samples_to_render ); // q_input_fx - 1 + Scale_sig32( tmpLfeBuffer, n_samples_to_render, 1 ); // q_input_fx + } + ELSE + { + set32_fx( tmpLfeBuffer, 0, n_samples_to_render ); + } + + FOR( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses; ++pos_idx ) + { + /* Update head positions */ + IVAS_QUATERNION Quaternions_orig[MAX_PARAM_SPATIAL_SUBFRAMES], Quaternions_abs; + + FOR( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + Copy_Quat_fx( &combinedOrientationDataLocal.Quaternions[i], &Quaternions_orig[i] ); + Quaternions_abs.w_fx = L_negate( 12582912 ); // Q22 + move32(); + modify_Quat_q_fx( &combinedOrientationDataLocal.Quaternions[i], &combinedOrientationDataLocal.Quaternions[i], Q22 ); + Quat2EulerDegree_fx( combinedOrientationDataLocal.Quaternions[i], &Quaternions_abs.z_fx, &Quaternions_abs.y_fx, &Quaternions_abs.x_fx ); /*order in Quat2Euler seems to be reversed ?*/ + + Quaternions_abs.x_fx = L_add( Quaternions_abs.x_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][0] ); + Quaternions_abs.y_fx = L_add( Quaternions_abs.y_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][1] ); + Quaternions_abs.z_fx = L_add( Quaternions_abs.z_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][2] ); + combinedOrientationDataLocal.Quaternions[i] = Quaternions_abs; + move32(); + move32(); + move32(); + move32(); + Euler2Quat_fx( deg2rad_fx( combinedOrientationDataLocal.Quaternions[i].x_fx ), + deg2rad_fx( combinedOrientationDataLocal.Quaternions[i].y_fx ), + deg2rad_fx( combinedOrientationDataLocal.Quaternions[i].z_fx ), + &combinedOrientationDataLocal.Quaternions[i] ); + modify_Quat_q_fx( &combinedOrientationDataLocal.Quaternions[i], &combinedOrientationDataLocal.Quaternions[i], Quaternions_orig[i].q_fact ); + QuatToRotMat_fx( combinedOrientationDataLocal.Quaternions[i], combinedOrientationDataLocal.Rmat_fx[i] ); + modify_Rmat_q_fx( combinedOrientationDataLocal.Rmat_fx[i], combinedOrientationDataLocal.Rmat_fx[i], sub( shl( Quaternions_orig[i].q_fact, 1 ), 32 ), Q30 ); + } + + + pCombinedOrientationDataLocal = &combinedOrientationDataLocal; + move32(); + + hTcBuffer->subframes_rendered = original_subframes_rendered; + hTcBuffer->slots_rendered = original_slots_rendered; + move16(); + move16(); + + /* update combined orientation access index */ + ivas_combined_orientation_set_to_start_index( pCombinedOrientationDataLocal ); + + FOR( i = 0; i < 3; i++ ) + { + Copy32( hCombinedOrientationData->Rmat_prev_fx[pos_idx][i], pCombinedOrientationDataLocal->Rmat_prev_fx[0][i], 3 ); + } + + IF( ( error = ivas_rend_crendProcessSubframe_fx( pCrend, inConfig, outConfig, hDecoderConfig, pCombinedOrientationDataLocal, + hIntSetup, hEFAPdata, hTcBuffer, p_tmpInputBuffer, p_tmpInputBuffer, n_samples_to_render, output_Fs, pos_idx ) ) != IVAS_ERR_OK ) + { + return error; + } + + FOR( i = 0; i < 3; i++ ) + { + Copy32( pCombinedOrientationDataLocal->Rmat_prev_fx[0][i], hCombinedOrientationData->Rmat_prev_fx[pos_idx][i], 3 ); + } + + FOR( i = 0; i < BINAURAL_CHANNELS; ++i ) + { + /* accumulate LFE to output */ + v_add_fx( tmpInputBuffer[i], tmpLfeBuffer, tmpInputBuffer[i], n_samples_to_render ); + + /* move to split bin output buffer */ + Copy32( tmpInputBuffer[i], tmpSplitBinBuffer[add( i_mult( pos_idx, BINAURAL_CHANNELS ), i )], n_samples_to_render ); + } + + /* overwrite rendered channels with input again for next iteration */ + FOR( i = 0; i < hIntSetup->nchan_out_woLFE; ++i ) + { + Copy32( output[i], tmpInputBuffer[i], n_samples_to_render ); + } + + /* restore original headrotation data */ + FOR( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + Copy_Quat_fx( &Quaternions_orig[i], &combinedOrientationDataLocal.Quaternions[i] ); + } + } + + /* copy split binaural rendered signals to final output */ + FOR( i = 0; i < i_mult( BINAURAL_CHANNELS, pMultiBinPoseData->num_poses ); ++i ) + { + Copy32( tmpSplitBinBuffer[i], output[i], n_samples_to_render ); + } + + /* update main combined orientation access index */ + ivas_combined_orientation_update_index( hCombinedOrientationData, n_samples_to_render ); + + return IVAS_ERR_OK; +} diff --git a/lib_rend/ivas_dirac_ana_fx.c b/lib_rend/ivas_dirac_ana_fx.c index 8124c4967cdeac890fdaf3c55d94f20489afe838..52bedea05801655c7a812900dfeb783bde16df88 100644 --- a/lib_rend/ivas_dirac_ana_fx.c +++ b/lib_rend/ivas_dirac_ana_fx.c @@ -43,7 +43,7 @@ /*------------------------------------------------------------------------- * Local function prototypes *------------------------------------------------------------------------*/ -static void ivas_dirac_param_est_ana_fx( DIRAC_ANA_HANDLE hDirAC, Word32 data_f[][L_FRAME48k], Word32 elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const Word16 input_frame ); +static void ivas_dirac_param_est_ana_fx( DIRAC_ANA_HANDLE hDirAC, Word32 data_f[][L_FRAME48k], Word32 elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const Word16 input_frame, const Word16 data_q ); static void ivas_dirac_dmx_fx( Word32 data_in_fx[][L_FRAME48k], const Word16 input_frame, const Word16 nchan_transport ); @@ -127,7 +127,21 @@ ivas_error ivas_dirac_ana_open_fx( } set32_fx( hDirAC->direction_vector_m_fx[i][j], 0, MASA_FREQUENCY_BANDS ); } + IF( ( hDirAC->direction_vector_e[i] = (Word16 **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( Word16 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); + } + + FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + IF( ( hDirAC->direction_vector_e[i][j] = (Word16 *) malloc( MASA_FREQUENCY_BANDS * sizeof( Word16 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); + } + set16_fx( hDirAC->direction_vector_e[i][j], 31, MASA_FREQUENCY_BANDS ); + } } + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) @@ -140,7 +154,8 @@ ivas_error ivas_dirac_ana_open_fx( } } set32_fx( hDirAC->buffer_energy_fx, 0, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); - + set16_fx( hDirAC->buffer_intensity_real_q, 31, DIRAC_NO_COL_AVG_DIFF ); + set16_fx( hDirAC->buffer_energy_q, 31, DIRAC_NO_COL_AVG_DIFF ); hDirAC->index_buffer_intensity = 0; move16(); @@ -181,7 +196,7 @@ void ivas_dirac_ana_close_fx( FOR( i = 0; i < ( *hDirAC )->num_Cldfb_instances; i++ ) { - deleteCldfb_ivas_fx( &( ( *hDirAC )->cldfbAnaEnc[i] ) ); + deleteCldfb_fx( &( ( *hDirAC )->cldfbAnaEnc[i] ) ); } FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) @@ -194,6 +209,15 @@ void ivas_dirac_ana_close_fx( free( ( *hDirAC )->direction_vector_m_fx[i] ); ( *hDirAC )->direction_vector_m_fx[i] = NULL; + FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( ( *hDirAC )->direction_vector_e[i][j] ); + ( *hDirAC )->direction_vector_e[i][j] = NULL; + } + + free( ( *hDirAC )->direction_vector_e[i] ); + ( *hDirAC )->direction_vector_e[i] = NULL; + FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) { free( ( *hDirAC )->buffer_intensity_real_fx[i][j] ); @@ -223,23 +247,26 @@ void ivas_dirac_ana_fx( DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ Word32 data_fx[][L_FRAME48k], /* i/o: Input / transport audio signals, Q7 */ const Word16 input_frame, /* i : Input frame size */ - const Word16 nchan_transport /* i : Number of transport channels */ -) + const Word16 nchan_transport, /* i : Number of transport channels */ + const Word16 data_q ) { - Word32 elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word32 azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word32 energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word32 spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 energyRatio_q, surroundingCoherence_q = 0, spreadCoherence_q = 0; - move16(); - move16(); + Word32 elevation_m_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word32 azimuth_m_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word32 energyRatio_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word32 spreadCoherence_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word32 surroundingCoherence_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + /* Estimate MASA parameters from the SBA signals */ - ivas_dirac_param_est_ana_fx( hDirAC, data_fx, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame ); - energyRatio_q = 30; - move16(); + ivas_dirac_param_est_ana_fx( hDirAC, data_fx, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, spreadCoherence_fx, surroundingCoherence_fx, input_frame, data_q ); + + /* Add zeros to higher bands in case of lower sampling rates */ + IF( LT_16( hDirAC->nbands, MASA_FREQUENCY_BANDS ) ) + { + ivas_masa_zero_high_bands_fx( hDirAC->nbands, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, spreadCoherence_fx, surroundingCoherence_fx ); + } + /* Create MASA metadata buffer from the estimated values */ - ivas_create_masa_out_meta_fx( hDirAC->hMasaOut, hDirAC->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, energyRatio_q, spreadCoherence_q, surroundingCoherence_q ); + ivas_create_masa_out_meta_fx( hDirAC->hMasaOut, hDirAC->sph_grid16, nchan_transport, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, spreadCoherence_fx, surroundingCoherence_fx, Q31, Q31, Q31 ); /* Downmix */ ivas_dirac_dmx_fx( data_fx, input_frame, nchan_transport ); // output Q of data_fx is same as that of input @@ -255,39 +282,44 @@ void ivas_dirac_ana_fx( /* Estimate MASA parameters from the SBA signals */ static void ivas_dirac_param_est_ana_fx( DIRAC_ANA_HANDLE hDirAC, - Word32 data_fx[][L_FRAME48k], /* Q7 */ - Word32 elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q22 */ - Word32 azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q22 */ - Word32 energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q30 */ - Word32 spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Qx */ - Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Qx */ - const Word16 input_frame ) + Word32 data_fx[][L_FRAME48k], /* Q7 */ + Word32 elevation_m_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q22 */ + Word32 azimuth_m_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q22 */ + Word32 energyRatio_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q30 */ + Word32 spreadCoherence_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Qx */ + Word32 surroundingCoherence_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Qx */ + const Word16 input_frame, + const Word16 data_q ) { Word32 reference_power_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; Word16 ts, i, d, j; Word16 num_freq_bands, index; - Word32 dir_v[DIRAC_NUM_DIMS]; - Word16 dir_q; + Word32 dir_v_fx[DIRAC_NUM_DIMS]; + Word16 dir_v_q; Word16 l_ts; Word32 Foa_RealBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 Foa_ImagBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 intensity_real_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + Word16 intensity_real_q[MASA_FREQUENCY_BANDS]; Word32 direction_vector_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; - Word16 diffuseness_vector_exp[MASA_FREQUENCY_BANDS]; Word32 diffuseness_vector_fx[MASA_FREQUENCY_BANDS]; Word32 diffuseness_m_fx[MASA_FREQUENCY_BANDS]; - + Word16 diffuseness_e[MASA_FREQUENCY_BANDS]; + Word16 diffuseness_q = 0; + move16(); Word16 band_m_idx, block_m_idx; Word32 renormalization_factor_diff_fx[MASA_FREQUENCY_BANDS]; + Word16 renormalization_factor_diff_e[MASA_FREQUENCY_BANDS]; Word32 norm_tmp_fx; Word16 mrange[2]; Word16 brange[2]; Word16 numAnalysisChannels; - Word16 io_q; - Word16 scale_fact, scale_fact2; - Word16 q_factor_intensity, q_factor_intensity_old = 0; - Word16 q_factor_energy = 0, q_factor_energy_old = 0; - Word16 exp = 0, exp_div = 0; + Word16 inp_q; + Word16 intensity_q, reference_power_q; + Word16 temp_e, sf, scaled_data_q, s, shift = 31; + move16(); + Word32 temp; + Word64 W_temp; num_freq_bands = hDirAC->nbands; /* l_ts = input_frame / CLDFB_NO_COL_MAX; */ l_ts = shr( input_frame, 4 ); @@ -300,6 +332,16 @@ static void ivas_dirac_param_est_ana_fx( move16(); move16(); move16(); + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + shift = s_min( shift, L_norm_arr( data_fx[i], input_frame ) ); + } + shift = sub( shift, find_guarded_bits_fx( l_ts ) ); + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + scale_sig32( data_fx[i], input_frame, shift ); + } + scaled_data_q = add( data_q, shift ); /* do processing over all CLDFB time slots */ FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) @@ -317,34 +359,45 @@ static void ivas_dirac_param_est_ana_fx( move32(); hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = 0; move32(); + + hDirAC->direction_vector_e[0][block_m_idx][band_m_idx] = 0; + move16(); + hDirAC->direction_vector_e[1][block_m_idx][band_m_idx] = 0; + move16(); + hDirAC->direction_vector_e[2][block_m_idx][band_m_idx] = 0; + move16(); } /* Need to initialize renormalization_factors, and variables to be normalized */ set32_fx( renormalization_factor_diff_fx, 0, hDirAC->nbands ); + set16_fx( renormalization_factor_diff_e, 31, hDirAC->nbands ); set32_fx( diffuseness_m_fx, 0, hDirAC->nbands ); + set16_fx( diffuseness_e, 0, hDirAC->nbands ); set32_fx( hDirAC->energy_fx[block_m_idx], 0, MASA_FREQUENCY_BANDS ); - set32_fx( hDirAC->energy_fx[block_m_idx], 0, MASA_FREQUENCY_BANDS ); + set16_fx( hDirAC->energy_e[block_m_idx], 0, MASA_FREQUENCY_BANDS ); FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { + Word16 cr_q = MAX_16, ci_q = MAX_16; + inp_q = scaled_data_q; // Q of data_fx after scaling + move16(); + move16(); + move16(); FOR( i = 0; i < numAnalysisChannels; i++ ) { - io_q = Q7; // Input Q of data_fx + inp_q = scaled_data_q; move16(); - cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][imult1616( l_ts, ts )] ), Foa_RealBuffer_fx[i], Foa_ImagBuffer_fx[i], l_ts, hDirAC->cldfbAnaEnc[i], &io_q ); + cldfbAnalysis_ts_fx_var_q( &( data_fx[i][l_ts * ts] ), Foa_RealBuffer_fx[i], Foa_ImagBuffer_fx[i], l_ts, hDirAC->cldfbAnaEnc[i], &inp_q ); + cr_q = s_min( cr_q, getScaleFactor32( Foa_RealBuffer_fx[i], l_ts ) ); + ci_q = s_min( ci_q, getScaleFactor32( Foa_ImagBuffer_fx[i], l_ts ) ); } - scale_fact = getScaleFactor32( (const Word32 *) Foa_RealBuffer_fx, FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ); - scale_fact = s_min( getScaleFactor32( (const Word32 *) Foa_ImagBuffer_fx, FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ), scale_fact ); - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + sf = sub( s_min( cr_q, ci_q ), 4 ); + FOR( i = 0; i < numAnalysisChannels; i++ ) { - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - Foa_RealBuffer_fx[i][j] = L_shl( Foa_RealBuffer_fx[i][j], sub( scale_fact, Q3 ) ); // Q( scale_fact + Q1 ) - move32(); - Foa_ImagBuffer_fx[i][j] = L_shl( Foa_ImagBuffer_fx[i][j], sub( scale_fact, Q3 ) ); // Q( scale_fact + Q1 ) - move32(); - } + scale_sig32( Foa_RealBuffer_fx[i], l_ts, sf ); // Q-> inp_q + sf + scale_sig32( Foa_ImagBuffer_fx[i], l_ts, sf ); // Q-> inp_q + sf } + inp_q = add( inp_q, sf ); /* Compute omni energy for metadata processing */ FOR( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) { @@ -354,191 +407,104 @@ static void ivas_dirac_param_est_ana_fx( move16(); FOR( j = brange[0]; j < brange[1]; j++ ) { - hDirAC->energy_fx[block_m_idx][band_m_idx] = ( L_add( hDirAC->energy_fx[block_m_idx][band_m_idx], L_add( Mpy_32_32( Foa_RealBuffer_fx[0][j], Foa_RealBuffer_fx[0][j] ), Mpy_32_32( Foa_ImagBuffer_fx[0][j], Foa_ImagBuffer_fx[0][j] ) ) ) ); // 2*( scale_fact + Q1 )-31 + W_temp = W_mac_32_32( W_mult_32_32( Foa_RealBuffer_fx[0][j], Foa_RealBuffer_fx[0][j] ), Foa_ImagBuffer_fx[0][j], Foa_ImagBuffer_fx[0][j] ); // Q-> 2*inp_q + 1 + sf = W_norm( W_temp ); + temp = W_extract_h( W_shl( W_temp, sf ) ); // 2*inp_q + 1 + sf - 32 + temp_e = sub( 63 - 1, add( shl( inp_q, 1 ), sf ) ); // 31 - ( 2 * inp_q + 1 + sf - 32 ) + hDirAC->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->energy_fx[block_m_idx][band_m_idx], hDirAC->energy_e[block_m_idx][band_m_idx], temp, temp_e, &hDirAC->energy_e[block_m_idx][band_m_idx] ); move32(); } } /* Direction estimation */ - computeIntensityVector_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); // 2 * ( scale_fact + Q1 ) - 31 - exp = sub( shl( sub( scale_fact, Q1 ), 1 ), 31 ); + computeIntensityVector_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, intensity_real_q, inp_q ); - computeDirectionVectors_fx( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], &exp ); + computeDirectionVectors_fx2( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], 0, intensity_real_q ); /* Power estimation for diffuseness */ - computeReferencePower_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); //( 2 * ( scale_fact - Q1 ) - 31 - 1 ); // computeReferencePower_ana( hDirAC->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, reference_power[ts], num_freq_bands ); + computeReferencePower_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands, inp_q, &reference_power_q ); + + /* Aligning intensity_real to a common Q-factor */ + minimum_fx( intensity_real_q, num_freq_bands, &intensity_q ); + + Word16 tmp; + FOR( i = 0; i < num_freq_bands; i++ ) + { + tmp = sub( intensity_q, intensity_real_q[i] ); + intensity_real_fx[0][i] = L_shl( intensity_real_fx[0][i], tmp ); + move32(); + intensity_real_fx[1][i] = L_shl( intensity_real_fx[1][i], tmp ); + move32(); + intensity_real_fx[2][i] = L_shl( intensity_real_fx[2][i], tmp ); + move32(); + } /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hDirAC->index_buffer_intensity = add( ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ move16(); index = hDirAC->index_buffer_intensity; move16(); - Word16 guard_bits = find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ); - scale_fact2 = getScaleFactor32( (const Word32 *) intensity_real_fx, DIRAC_NUM_DIMS * MASA_FREQUENCY_BANDS ); - IF( GT_16( guard_bits, scale_fact2 ) ) - { - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - intensity_real_fx[i][j] = L_shr( intensity_real_fx[i][j], sub( guard_bits, scale_fact2 ) ); - move32(); - } - } - q_factor_intensity = sub( sub( shl( sub( scale_fact, 1 ), 1 ), 31 ), sub( guard_bits, scale_fact2 ) ); - } - ELSE - { - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - intensity_real_fx[i][j] = L_shl( intensity_real_fx[i][j], sub( scale_fact2, guard_bits ) ); - move32(); - } - } - q_factor_intensity = add( sub( shl( sub( scale_fact, 1 ), 1 ), 31 ), sub( scale_fact2, guard_bits ) ); - } - scale_fact2 = getScaleFactor32( reference_power_fx[ts], MASA_FREQUENCY_BANDS ); - IF( GT_16( guard_bits, scale_fact2 ) ) - { - - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - reference_power_fx[ts][j] = L_shr( reference_power_fx[ts][j], sub( guard_bits, scale_fact2 ) ); - move32(); - } - - q_factor_energy = sub( sub( shl( scale_fact, 1 ), 31 ), sub( guard_bits, scale_fact2 ) ); - } - ELSE - { - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - reference_power_fx[ts][j] = L_shl( reference_power_fx[ts][j], sub( scale_fact2, guard_bits ) ); - move32(); - } - - q_factor_energy = add( sub( shl( scale_fact, 1 ), 31 ), sub( scale_fact2, guard_bits ) ); - } - - IF( q_factor_intensity_old != 0 ) - { - - IF( LT_16( q_factor_intensity_old, q_factor_intensity ) ) - { - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - intensity_real_fx[i][j] = L_shr( intensity_real_fx[i][j], sub( q_factor_intensity, q_factor_intensity_old ) ); - move32(); - } - } - q_factor_intensity = q_factor_intensity_old; - move16(); - } - ELSE - { - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - FOR( j = 0; j < index - 1; j++ ) - { - /* only real part needed */ - FOR( Word16 k = 0; k < num_freq_bands; k++ ) - { - hDirAC->buffer_intensity_real_fx[i][j][k] = L_shr( hDirAC->buffer_intensity_real_fx[i][j][k], sub( q_factor_intensity_old, q_factor_intensity ) ); - move32(); - } - } - } - } - } - IF( q_factor_energy_old != 0 ) - { - - IF( LT_16( q_factor_energy_old, q_factor_energy ) ) - { - - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - reference_power_fx[ts][j] = L_shr( reference_power_fx[ts][j], sub( q_factor_energy, q_factor_energy_old ) ); - move32(); - } - - q_factor_energy = q_factor_energy_old; - move16(); - } - ELSE - { - FOR( i = 0; i < index - 1; i++ ) - { - FOR( j = 0; j < num_freq_bands; j++ ) - { - FOR( Word16 k = 0; k < num_freq_bands; k++ ) - { - hDirAC->buffer_energy_fx[add( imult1616( i, j ), k )] = L_shr( hDirAC->buffer_energy_fx[add( imult1616( i, j ), k )], sub( q_factor_energy_old, q_factor_energy_old ) ); - move32(); - } - } - } - } - } - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { /* only real part needed */ - Copy32( intensity_real_fx[i], &( hDirAC->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); + Copy32( intensity_real_fx[i], &( hDirAC->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); // intensity_q } - Copy32( reference_power_fx[ts], &( hDirAC->buffer_energy_fx[imult1616( sub( index, 1 ), num_freq_bands )] ), num_freq_bands ); - - computeDiffuseness_fx( hDirAC->buffer_intensity_real_fx, hDirAC->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, q_factor_intensity, q_factor_energy, diffuseness_vector_exp ); - q_factor_intensity_old = q_factor_intensity; + hDirAC->buffer_intensity_real_q[index - 1] = intensity_q; move16(); - q_factor_energy_old = q_factor_energy; + Copy32( reference_power_fx[ts], &( hDirAC->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + hDirAC->buffer_energy_q[index - 1] = reference_power_q; move16(); - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - if ( LT_16( diffuseness_vector_exp[j], 10 ) ) - { - diffuseness_vector_fx[j] = 0; - move16(); - } - } + computeDiffuseness_fx( hDirAC->buffer_intensity_real_fx, hDirAC->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hDirAC->buffer_intensity_real_q, hDirAC->buffer_energy_q, &diffuseness_q ); FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { - norm_tmp_fx = Mpy_32_32( reference_power_fx[ts][band_m_idx], ( L_sub( ONE_IN_Q30, L_shr( diffuseness_vector_fx[band_m_idx], sub( 30, diffuseness_vector_exp[band_m_idx] ) ) ) ) ); // q_factor_energy-1 + norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*reference_power_q*/ - hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] = L_add( Mpy_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] ); // Q (q_factor_energy + exp -32) + hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx], hDirAC->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hDirAC->direction_vector_e[0][block_m_idx][band_m_idx] ); move32(); - hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] = L_add( Mpy_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] ); // Q (q_factor_energy + exp -32) + hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx], hDirAC->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hDirAC->direction_vector_e[1][block_m_idx][band_m_idx] ); move32(); - hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = L_add( Mpy_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] ); // Q (q_factor_energy + exp -32) + hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx], hDirAC->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hDirAC->direction_vector_e[2][block_m_idx][band_m_idx] ); move32(); - diffuseness_m_fx[band_m_idx] = L_add( diffuseness_m_fx[band_m_idx], Mpy_32_32( reference_power_fx[ts][band_m_idx], L_shr( diffuseness_vector_fx[band_m_idx], sub( 30, diffuseness_vector_exp[band_m_idx] ) ) ) ); // Qq_factor_energy-1 + W_temp = W_mult0_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ); + s = W_norm( W_temp ); + temp = W_extract_h( W_shl( W_temp, s ) ); + temp_e = sub( 63, add( add( reference_power_q, diffuseness_q ), s ) ); // 31 - ( reference_power_q + diffuseness_q + s - 32 ) + + diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], temp, temp_e, &diffuseness_e[band_m_idx] ); move32(); - renormalization_factor_diff_fx[band_m_idx] = L_add( renormalization_factor_diff_fx[band_m_idx], reference_power_fx[ts][band_m_idx] ); // Qq_factor_energy + + renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( 31, reference_power_q ), &renormalization_factor_diff_e[band_m_idx] ); move32(); } } - FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { + Word16 max_e = MIN_16; + move16(); FOR( d = 0; d < DIRAC_NUM_DIMS; d++ ) { - dir_v[d] = hDirAC->direction_vector_m_fx[d][block_m_idx][band_m_idx]; + max_e = s_max( max_e, hDirAC->direction_vector_e[d][block_m_idx][band_m_idx] ); + } + max_e = add( max_e, 1 ); /*1 as guard bit to prevent overflow*/ + FOR( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + dir_v_fx[d] = L_shr( hDirAC->direction_vector_m_fx[d][block_m_idx][band_m_idx], sub( max_e, hDirAC->direction_vector_e[d][block_m_idx][band_m_idx] ) ); move32(); } - dir_q = add( q_factor_energy, sub( exp, 32 ) ); - ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( dir_v, dir_q, &azimuth_m_values[block_m_idx][band_m_idx], &elevation_m_values[block_m_idx][band_m_idx] ); + dir_v_q = sub( 31, max_e ); + ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( dir_v_fx, dir_v_q, &azimuth_m_values_fx[block_m_idx][band_m_idx], &elevation_m_values_fx[block_m_idx][band_m_idx] ); } /* Determine energy ratios */ FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { + Word16 diffuseness_m_e; IF( GT_32( renormalization_factor_diff_fx[band_m_idx], EPSILON_FX ) ) { - diffuseness_m_fx[band_m_idx] = BASOP_Util_Divide3232_Scale( diffuseness_m_fx[band_m_idx], renormalization_factor_diff_fx[band_m_idx], &exp_div ); + diffuseness_m_fx[band_m_idx] = BASOP_Util_Divide3232_Scale( diffuseness_m_fx[band_m_idx], renormalization_factor_diff_fx[band_m_idx], &diffuseness_m_e ); + move32(); + diffuseness_m_e = add( diffuseness_m_e, sub( diffuseness_e[band_m_idx], renormalization_factor_diff_e[band_m_idx] ) ); + diffuseness_m_fx[band_m_idx] = L_shl_sat( diffuseness_m_fx[band_m_idx], add( 16, diffuseness_m_e ) ); // Q31 move32(); } ELSE @@ -546,20 +512,22 @@ static void ivas_dirac_param_est_ana_fx( diffuseness_m_fx[band_m_idx] = 0; move32(); } - exp_div = sub( 30, exp_div ); - energyRatio[block_m_idx][band_m_idx] = L_sub( L_shl( 1, 30 ), L_shl( diffuseness_m_fx[band_m_idx], sub( 30, exp_div ) ) ); // Q30 + energyRatio_fx[block_m_idx][band_m_idx] = L_sub( ONE_IN_Q31, diffuseness_m_fx[band_m_idx] ); move32(); } - FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { - spreadCoherence[block_m_idx][band_m_idx] = 0; + spreadCoherence_fx[block_m_idx][band_m_idx] = 0; move32(); - surroundingCoherence[block_m_idx][band_m_idx] = 0; + surroundingCoherence_fx[block_m_idx][band_m_idx] = 0; move32(); } } + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + scale_sig32( data_fx[i], input_frame, negate( shift ) ); + } return; } @@ -576,10 +544,10 @@ static void ivas_dirac_dmx_fx( IF( EQ_16( nchan_transport, 2 ) ) { v_add_fx( data_in_fx[0], data_in_fx[1], data_out_fx[0], input_frame ); - v_multc_fixed( data_out_fx[0], ONE_IN_Q30, data_out_fx[0], input_frame ); // ONE_IN_Q30 = 0.5* ONE_IN_Q31 + v_multc_fx( data_out_fx[0], ONE_IN_Q30, data_out_fx[0], input_frame ); // ONE_IN_Q30 = 0.5* ONE_IN_Q31 - v_sub_fixed( data_in_fx[0], data_in_fx[1], data_out_fx[1], input_frame, 0 ); - v_multc_fixed( data_out_fx[1], ONE_IN_Q30, data_out_fx[1], input_frame ); + v_sub_fx_no_hdrm( data_in_fx[0], data_in_fx[1], data_out_fx[1], input_frame ); + v_multc_fx( data_out_fx[1], ONE_IN_Q30, data_out_fx[1], input_frame ); FOR( i = 0; i < nchan_transport; i++ ) { diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index f93885e97adffce75b8d071fd212a0cf7a41cc32..79db88281fda43e5db7aea9fc604709a5771a772 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -51,20 +51,9 @@ Word16 slot_fx[4] = { 32767, 16384, 10922, 8192 }; * Local constants *------------------------------------------------------------------------*/ -#define CLDFB_HALF_BIN_FREQUENCY_OFFSET 0.5f -#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f ) -#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f ) -#define SBA_CARDI_TARGET_ENERGY_GAIN 0.5f - -#define STEREO_PREPROCESS_IIR_FACTOR ( 0.9f ) -#define STEREO_PREPROCESS_IIR_FACTOR_Q15 ( 29491 ) +#define STEREO_PREPROCESS_IIR_FACTOR_Q15 ( 29491 ) // 0.9f in Q15 /* powf(0.95f, 4.0f) for sub-frame smoothing instead of CLDFB slot */ -#define ADAPT_HTPROTO_IIR_FAC 0.81450625f - -#define ADAPT_HTPROTO_ILD_LIM_DB0 1.0f -#define ADAPT_HTPROTO_ILD_LIM_DB1 4.0f -#define ADAPT_HTPROTO_ROT_LIM_0 0.4f -#define ADAPT_HTPROTO_ROT_LIM_0_FX 429496736 // Q30 +#define ADAPT_HTPROTO_ROT_LIM_0_FX 429496736 // 0.4f in Q30 #define TWO_POINT_FIVE_IN_Q13 20480 // Q13 #define ADAPT_HTPROTO_IIR_FAC_FX 26689 // Q15 #define LOG_10_BASE_2_Q29 1783446528 // Q29 @@ -72,11 +61,10 @@ Word16 slot_fx[4] = { 32767, 16384, 10922, 8192 }; #define INV_TAN30_FX 28377 // Q14 #define EPSILON_MANT 1180591621 /* 1e-12 = 0.5497558*(2^-39) in Q70 */ #define EPSILON_EXP ( -39 ) -#ifdef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC -#define ONE_DIV_EPSILON_MANT 1953125000 /* 1e+12 = 0.9094947*(2^40) */ -#define ONE_DIV_EPSILON_EXP ( 40 ) -#endif -#define ADAPT_HTPROTO_ROT_LIM_1 0.8f +#define ONE_DIV_EPSILON_MANT 1953125000 /* 1e+12 = 0.9094947*(2^40) */ +#define ONE_DIV_EPSILON_EXP ( 40 ) + +#define SMALL_EIGENVALUE 50 #define MAX_GAIN_CACHE_SIZE ( ( MASA_MAXIMUM_DIRECTIONS * 3 ) + MAX_NUM_OBJECTS ) /* == different calls to get gains */ @@ -106,51 +94,44 @@ typedef struct parambin_rend_config_data * Local function prototypes *------------------------------------------------------------------------*/ -static void ivas_dirac_dec_binaural_internal_fx( Decoder_Struct *st_ivas, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, Word32 *output_f[] /*Q11*/, const Word16 nchan_transport, const Word16 subframe ); +static void ivas_dirac_dec_binaural_internal_fx( Decoder_Struct *st_ivas, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, Word32 *output_fx[] /*Q11*/, const Word16 nchan_transport, const Word16 subframe ); -static void ivas_dirac_dec_decorrelate_slot_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, const Word16 num_freq_bands, const Word16 slot, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME] /*q_inp*/[CLDFB_NO_CHANNELS_MAX], Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, Word16 q_inp, Word32 decRe[][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, Word32 decIm[] /*q_inp*/[CLDFB_NO_CHANNELS_MAX] ); +static void ivas_dirac_dec_decorrelate_slot_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, const Word16 num_freq_bands, const Word16 slot, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME] /*q_inp*/[CLDFB_NO_CHANNELS_MAX], Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, const Word16 q_inp, Word32 decRe[][CLDFB_NO_CHANNELS_MAX], Word32 decIm[][CLDFB_NO_CHANNELS_MAX], Word16 *q_out ); -static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, PARAMBIN_REND_CONFIG_HANDLE hConfig, Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q*/, Word32 inIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q*/, Word32 Rmat_fx[3][3] /*Q30*/, const Word16 subframe, const Word16 isHeadtracked, const MASA_ISM_DATA_HANDLE hMasaIsmData, Word16 q ); +static void ivas_dirac_dec_binaural_formulate_input_covariance_matrices_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, PARAMBIN_REND_CONFIG_HANDLE hConfig, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const Word16 subframe, Word32 *subFrameTotalEne, Word16 *subFrameTotalEne_e, Word32 *IIReneLimiter, const Word16 q ); + +static void ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, const SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, const PARAMBIN_REND_CONFIG_HANDLE hConfig, Word32 Rmat[3][3], const Word16 subframe, const Word16 isHeadtracked, const Word32 *subFrameTotalEne, Word16 *subFrameTotalEne_e, const Word32 *IIReneLimiter, const MASA_ISM_DATA_HANDLE hMasaIsmData ); static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, PARAMBIN_REND_CONFIG_HANDLE hConfig, const Word16 max_band_decorr, Word32 Rmat[3][3] /*Q30*/, const Word16 subframe, const Word16 isHeadtracked, const Word16 nchanSeparateChannels, const MASA_ISM_DATA_HANDLE hMasaIsmData ); -static void ivas_dirac_dec_binaural_process_output_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, HANDLE_CLDFB_FILTER_BANK cldfbSynDec[MAX_OUTPUT_CHANNELS], Word32 *output_fx[] /*q_out*/, Word16 *q_out, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, const Word16 q_inp, const Word16 max_band_decorr, const Word16 numInChannels, const Word16 processReverb, const Word16 subframe, const Word16 q_mat ); +static void ivas_dirac_dec_binaural_process_output_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, HANDLE_CLDFB_FILTER_BANK cldfbSynDec[MAX_OUTPUT_CHANNELS], Word32 *output_fx[] /*q_out*/, Word16 *q_out, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, const Word16 q_inp, const Word16 max_band_decorr, const Word16 numInChannels, const Word16 processReverb, const Word16 subframe, const Word16 q_mat, Word32 outRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 outIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 reverbRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 reverbIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 decorrRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 decorrIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word16 *Q_inp_mix, const Word8 recompute ); static void adaptTransportSignalsHeadtracked_fx( COMBINED_ORIENTATION_HANDLE hHeadTrackData, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, Word16 q_inp, const Word16 nBins, const Word16 nSlots, Word32 Rmat[3][3] /*Q30*/ ); static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( COMBINED_ORIENTATION_HANDLE hHeadTrackData, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const Word16 nBins, const Word16 nSlots, Word32 Rmat[3][3] /*Q30*/ ); +static void hrtfShGetHrtf_fx( const Word16 bin, const Word16 aziDeg, const Word16 eleDeg, Word32 *lRealp, Word32 *lImagp, Word32 *rRealp, Word32 *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const Word16 useCachedValue, HRTFS_PARAMBIN_HANDLE hHrtfParambin ); + +static void getDirectPartGains_fx( const Word16 bin, Word16 aziDeg, Word16 eleDeg, Word32 *lRealp, Word32 *lImagp, Word32 *rRealp, Word32 *rImagp, const UWord8 renderStereoOutputInsteadOfBinaural, Word32 Rmat[3][3] /*Q30*/, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const Word16 isHeadtracked, HRTFS_PARAMBIN_HANDLE hHrtfParambin ); + +static void ivas_masa_ext_rend_parambin_internal_fx( MASA_EXT_REND_HANDLE hMasaExtRend, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, Word32 *output_fx[] /*Q11*/, const Word16 subframe, const SPLIT_REND_WRAPPER *hSplitRendWrapper, Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] ); -static void hrtfShGetHrtf_fx( const Word16 bin, const Word16 aziDeg, const Word16 eleDeg, Word32 *lRealp, Word32 *lImagp, Word32 *rRealp, Word32 *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const Word16 useCachedValue ); -static void getDirectPartGains_fx( const Word16 bin, Word16 aziDeg, Word16 eleDeg, Word32 *lRealp, Word32 *lImagp, Word32 *rRealp, Word32 *rImagp, const UWord8 renderStereoOutputInsteadOfBinaural, Word32 Rmat[3][3] /*Q30*/, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const Word16 isHeadtracked ); -static void ivas_masa_ext_rend_parambin_internal_fx( MASA_EXT_REND_HANDLE hMasaExtRend, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, Word32 *output_fx[] /*Q11*/, const Word16 subframe ); static void formulate2x2MixingMatrix_fx( Word32 Ein1_fx /*q_Ein*/, Word32 Ein2_fx /*q_Ein*/, Word16 q_Ein, Word32 CinRe_fx /*q_Cin*/, Word32 CinIm_fx /*q_Cin*/, Word16 q_Cin, Word32 Eout1_fx /*q_Eout*/, Word32 Eout2_fx /*q_Eout*/, Word16 q_Eout, Word32 CoutRe_fx /*q_Cout*/, Word32 CoutIm_fx /*q_Cout*/, Word16 q_Cout, Word32 Q_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*Q31*/, Word32 Mre_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_M*/, Word32 Mim_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_M*/, Word16 *q_M, const Word16 regularizationFactor_fx /*Q14*/ ); static void matrixMul_fx( Word32 Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, Word32 Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, Word16 *q_A, Word32 Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_B*/, Word32 Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_B*/, Word16 *q_B, Word32 outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_out*/, Word32 outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_out*/, Word16 *q_out ); -static void matrixTransp2Mul_fx( - Word32 Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, - Word32 Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, - Word16 *q_A, - Word32 Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_B*/, - Word32 Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_B*/, - Word16 *q_B, -#ifdef FIX_1072_SPEEDUP_matrixTransp2Mul_fx - Word32 Ascale, - Word32 Bscale, -#endif - Word32 outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_out*/, - Word32 outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_out*/, - Word16 *q_out ); +static void matrixTransp2Mul_fx( Word32 Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, Word32 Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, Word16 *q_A, Word32 Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_B*/, Word32 Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_B*/, Word16 *q_B, Word32 Ascale, Word32 Bscale, Word32 outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_out*/, Word32 outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_out*/, Word16 *q_out ); + /*------------------------------------------------------------------------- * ivas_dirac_dec_init_binaural_data() * * Initialize parametric binaural renderer *------------------------------------------------------------------------*/ + ivas_error ivas_dirac_dec_init_binaural_data_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : HRTF structure for rendering */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + HRTFS_PARAMBIN_HANDLE *phHrtfParambin /* i : HRTF structure for rendering */ ) { DIRAC_DEC_BIN_HANDLE hDiracDecBin; @@ -164,19 +145,15 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( Word16 tmp_e; Word16 tmp2; ivas_error error; - hDiracDecBin = st_ivas->hDiracDecBin; + Word16 num_poses, pos_idx; + const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pRoomAcoustics; - IF( hDiracDecBin == NULL ) + num_poses = 1; + move16(); + IF( st_ivas->hSplitBinRend != NULL ) { - IF( ( hDiracDecBin = (DIRAC_DEC_BIN_HANDLE) malloc( sizeof( DIRAC_DEC_BIN_DATA ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC binaural handle " ); - } - - hDiracDecBin->hTdDecorr = NULL; - hDiracDecBin->hReverb = NULL; - hDiracDecBin->h_freq_domain_decorr_ap_params = NULL; - hDiracDecBin->h_freq_domain_decorr_ap_state = NULL; + num_poses = st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; + move16(); } output_Fs = st_ivas->hDecoderConfig->output_Fs; @@ -186,167 +163,207 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( renderer_type = st_ivas->renderer_type; move32(); - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) { - FOR( k = 0; k < BINAURAL_CHANNELS + MAX_NUM_OBJECTS; k++ ) - { - set16_fx( hDiracDecBin->processMtxRe_fx[j][k], 0, nBins ); - set16_fx( hDiracDecBin->processMtxIm_fx[j][k], 0, nBins ); - set16_fx( hDiracDecBin->processMtxRePrev_fx[j][k], 0, nBins ); - set16_fx( hDiracDecBin->processMtxImPrev_fx[j][k], 0, nBins ); - } + hDiracDecBin = st_ivas->hDiracDecBin[pos_idx]; + move32(); - FOR( k = 0; k < BINAURAL_CHANNELS; k++ ) + IF( hDiracDecBin == NULL ) { - set16_fx( hDiracDecBin->processMtxDecRe_fx[j][k], 0, nBins ); - set16_fx( hDiracDecBin->processMtxDecIm_fx[j][k], 0, nBins ); - } - set32_fx( hDiracDecBin->ChEnePrev_fx[j], 0, nBins ); - set32_fx( hDiracDecBin->ChEneOutPrev_fx[j], 0, nBins ); - set16_fx( hDiracDecBin->ChEnePrev_e[j], 0, nBins ); - set16_fx( hDiracDecBin->ChEneOutPrev_e[j], 0, nBins ); - } - set32_fx( hDiracDecBin->ChCrossRePrev_fx, 0, nBins ); - set32_fx( hDiracDecBin->ChCrossImPrev_fx, 0, nBins ); - set16_fx( hDiracDecBin->ChCrossRePrev_e, 0, nBins ); - set16_fx( hDiracDecBin->ChCrossImPrev_e, 0, nBins ); - set32_fx( hDiracDecBin->ChCrossReOutPrev_fx, 0, nBins ); - set32_fx( hDiracDecBin->ChCrossImOutPrev_fx, 0, nBins ); - set16_fx( hDiracDecBin->ChCrossReOutPrev_e, 0, nBins ); - set16_fx( hDiracDecBin->ChCrossImOutPrev_e, 0, nBins ); - hDiracDecBin->renderStereoOutputInsteadOfBinaural = 0; - move16(); + IF( ( hDiracDecBin = (DIRAC_DEC_BIN_HANDLE) malloc( sizeof( DIRAC_DEC_BIN_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC binaural handle " ); + } - hDiracDecBin->q_processMtx = Q15; - hDiracDecBin->q_processMtxSCCR = Q15; - hDiracDecBin->q_processMtxPrev = Q15; - hDiracDecBin->q_processMtxPrevSCCR = Q15; - hDiracDecBin->q_processMtxDec = Q15; - hDiracDecBin->q_processMtxDecPrev = Q15; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); + hDiracDecBin->hTdDecorr = NULL; + hDiracDecBin->hReverb = NULL; + hDiracDecBin->h_freq_domain_decorr_ap_params = NULL; + hDiracDecBin->h_freq_domain_decorr_ap_state = NULL; + hDiracDecBin->phHrtfParambin = NULL; + } - FOR( bin = 0; bin < nBins; bin++ ) - { - binCenterFreq_fx = L_mult0( extract_l( L_shr( output_Fs, 1 ) ), div_s( add( shl( bin, 1 ), 1 ), shl( nBins, 1 ) ) ) /*( (float) bin + 0.5f ) / (float) nBins * ( (float) output_Fs / 2.0f )*/; /*Q15*/ - /* These formulas and values are from Christian Borss's publication for binaural diffuse field coherence */ - tmp = BASOP_Util_Divide3232_Scale( binCenterFreq_fx, 2700 << Q15, &tmp_e ); - IF( tmp_e < 0 ) + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { - tmp = shl( tmp, tmp_e ); /*q15*/ - tmp_e = 0; - move16(); - } - tmpFloat_fx = s_max( 0, sub( shl_sat( 1, sub( 15, tmp_e ) ), tmp ) ) /*max( 0.0f, 1.0f - binCenterFreq / 2700.0f )*/; /*Q15-tmp_e*/ - tmp2 = extract_l( Mult_32_32( binCenterFreq_fx, 1952258 /*=2^31*180/(550)/360*/ ) % 32767 ); /* Q15 */ //*binCenterFreq_fx * EVS_PI / 550.0f*/ - hDiracDecBin->diffuseFieldCoherence_fx[bin] = L_shl( L_mult0( divide3232( tmpFloat_fx, Mult_32_16( binCenterFreq_fx, 187 /*2^15*pi/550*/ ) ), getSineWord16R2( tmp2 ) ), tmp_e ); /*tmpFloat * sinf( binCenterFreq * EVS_PI / 550.0f ) / ( binCenterFreq * EVS_PI / 550.0f );*/ /* Q30 */ - hDiracDecBin->diffuseFieldCoherence_fx[bin] = L_shl( hDiracDecBin->diffuseFieldCoherence_fx[bin], 1 ); /* Q31 */ - move32(); - move32(); - } + FOR( k = 0; k < BINAURAL_CHANNELS + MAX_NUM_OBJECTS; k++ ) + { + set16_fx( hDiracDecBin->processMtxRe_fx[j][k], 0, nBins ); + set16_fx( hDiracDecBin->processMtxIm_fx[j][k], 0, nBins ); + set16_fx( hDiracDecBin->processMtxRePrev_fx[j][k], 0, nBins ); + set16_fx( hDiracDecBin->processMtxImPrev_fx[j][k], 0, nBins ); + } - FOR( bin = 0; bin < BINAURAL_COHERENCE_DIFFERENCE_BINS; bin++ ) - { - hDiracDecBin->diffuseFieldCoherenceX_fx[bin] = L_add( hDiracDecBin->diffuseFieldCoherence_fx[bin], diffuseFieldCoherenceDifferenceX_fx[bin] ); - hDiracDecBin->diffuseFieldCoherenceY_fx[bin] = L_add( hDiracDecBin->diffuseFieldCoherence_fx[bin], diffuseFieldCoherenceDifferenceY_fx[bin] ); - hDiracDecBin->diffuseFieldCoherenceZ_fx[bin] = L_add( hDiracDecBin->diffuseFieldCoherence_fx[bin], diffuseFieldCoherenceDifferenceZ_fx[bin] ); - move32(); - move32(); - move32(); - } + FOR( k = 0; k < BINAURAL_CHANNELS; k++ ) + { + set16_fx( hDiracDecBin->processMtxDecRe_fx[j][k], 0, nBins ); + set16_fx( hDiracDecBin->processMtxDecIm_fx[j][k], 0, nBins ); + } + set32_fx( hDiracDecBin->ChEnePrev_fx[j], 0, nBins ); + set32_fx( hDiracDecBin->ChEneOutPrev_fx[j], 0, nBins ); + set16_fx( hDiracDecBin->ChEnePrev_e[j], 0, nBins ); + set16_fx( hDiracDecBin->ChEneOutPrev_e[j], 0, nBins ); + } + set32_fx( hDiracDecBin->ChCrossRePrev_fx, 0, nBins ); + set32_fx( hDiracDecBin->ChCrossImPrev_fx, 0, nBins ); + set16_fx( hDiracDecBin->ChCrossRePrev_e, 0, nBins ); + set16_fx( hDiracDecBin->ChCrossImPrev_e, 0, nBins ); + set32_fx( hDiracDecBin->ChCrossReOutPrev_fx, 0, nBins ); + set32_fx( hDiracDecBin->ChCrossImOutPrev_fx, 0, nBins ); + set16_fx( hDiracDecBin->ChCrossReOutPrev_e, 0, nBins ); + set16_fx( hDiracDecBin->ChCrossImOutPrev_e, 0, nBins ); + hDiracDecBin->renderStereoOutputInsteadOfBinaural = 0; + move16(); - IF( EQ_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC ) ) /* Indication of binaural rendering without room effect */ - { - set32_fx( hDiracDecBin->earlyPartEneCorrection_fx, ONE_IN_Q28, CLDFB_NO_CHANNELS_MAX ); - hDiracDecBin->q_earlyPartEneCorrection = Q28; + hDiracDecBin->q_processMtx = Q15; + hDiracDecBin->q_processMtxSCCR = Q15; + hDiracDecBin->q_processMtxPrev = Q15; + hDiracDecBin->q_processMtxPrevSCCR = Q15; + hDiracDecBin->q_processMtxDec = Q15; + hDiracDecBin->q_processMtxDecPrev = Q15; move16(); - hDiracDecBin->hReverb = NULL; - } - ELSE IF( EQ_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) /* Indication of binaural rendering with room effect */ - { - Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); - hDiracDecBin->q_earlyPartEneCorrection = Q28; move16(); - /* reconfiguration needed when Reverb. parameters are changed -> close and open the handle again */ - test(); - test(); - IF( hDiracDecBin->hReverb != NULL && ( ( NE_16( hDiracDecBin->hReverb->numBins, nBins ) ) || - ( NE_16( hDiracDecBin->hReverb->blockSize, CLDFB_SLOTS_PER_SUBFRAME ) ) ) ) + move16(); + move16(); + move16(); + move16(); + + FOR( bin = 0; bin < nBins; bin++ ) + { + binCenterFreq_fx = L_mult0( extract_l( L_shr( output_Fs, 1 ) ), div_s( add( shl( bin, 1 ), 1 ), shl( nBins, 1 ) ) ) /*( (float) bin + 0.5f ) / (float) nBins * ( (float) output_Fs / 2.0f )*/; /*Q15*/ + /* These formulas and values are from Christian Borss's publication for binaural diffuse field coherence */ + tmp = BASOP_Util_Divide3232_Scale( binCenterFreq_fx, 2700 << Q15, &tmp_e ); + IF( tmp_e < 0 ) + { + tmp = shl( tmp, tmp_e ); /*q15*/ + tmp_e = 0; + move16(); + } + tmpFloat_fx = s_max( 0, sub( shl_sat( 1, sub( 15, tmp_e ) ), tmp ) ) /*max( 0.0f, 1.0f - binCenterFreq / 2700.0f )*/; /*Q15-tmp_e*/ + tmp2 = extract_l( Mult_32_32( binCenterFreq_fx, 1952258 /*=2^31*180/(550)/360*/ ) % 32767 ); /* Q15 */ //*binCenterFreq_fx * EVS_PI / 550.0f*/ + hDiracDecBin->diffuseFieldCoherence_fx[bin] = L_shl( L_mult0( divide3232( tmpFloat_fx, Mult_32_16( binCenterFreq_fx, 187 /*2^15*pi/550*/ ) ), getSineWord16R2( tmp2 ) ), tmp_e ); /*tmpFloat * sinf( binCenterFreq * EVS_PI / 550.0f ) / ( binCenterFreq * EVS_PI / 550.0f );*/ /* Q30 */ + hDiracDecBin->diffuseFieldCoherence_fx[bin] = L_shl( hDiracDecBin->diffuseFieldCoherence_fx[bin], 1 ); /* Q31 */ + move32(); + move32(); + } + + FOR( bin = 0; bin < BINAURAL_COHERENCE_DIFFERENCE_BINS; bin++ ) { - ivas_binaural_reverb_close_fx( &( hDiracDecBin->hReverb ) ); + hDiracDecBin->diffuseFieldCoherenceX_fx[bin] = L_add( hDiracDecBin->diffuseFieldCoherence_fx[bin], diffuseFieldCoherenceDifferenceX_fx[bin] ); + hDiracDecBin->diffuseFieldCoherenceY_fx[bin] = L_add( hDiracDecBin->diffuseFieldCoherence_fx[bin], diffuseFieldCoherenceDifferenceY_fx[bin] ); + hDiracDecBin->diffuseFieldCoherenceZ_fx[bin] = L_add( hDiracDecBin->diffuseFieldCoherence_fx[bin], diffuseFieldCoherenceDifferenceZ_fx[bin] ); + move32(); + move32(); + move32(); } - IF( hDiracDecBin->hReverb == NULL ) + IF( EQ_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC ) ) /* Indication of binaural rendering without room effect */ + { + set32_fx( hDiracDecBin->earlyPartEneCorrection_fx, ONE_IN_Q28, CLDFB_NO_CHANNELS_MAX ); + hDiracDecBin->q_earlyPartEneCorrection = Q28; + move16(); + hDiracDecBin->hReverb = NULL; + } + ELSE IF( EQ_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) /* Indication of binaural rendering with room effect */ { - /* Todo Philips: Room acoustics should be passed here once the underlying part works. Probably enough to pick it from st_ivas but you know best. */ - IF( NE_32( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { - return error; + Copy32( ( *phHrtfParambin )->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); + pRoomAcoustics = NULL; + } + ELSE + { + set32_fx( hDiracDecBin->earlyPartEneCorrection_fx, ONE_IN_Q28, CLDFB_NO_CHANNELS_MAX ); + pRoomAcoustics = &( st_ivas->hRenderConfig->roomAcoustics ); + } + hDiracDecBin->q_earlyPartEneCorrection = Q28; + move16(); + + /* reconfiguration needed when Reverb. parameters are changed -> close and open the handle again */ + test(); + test(); + IF( hDiracDecBin->hReverb != NULL && ( ( NE_16( hDiracDecBin->hReverb->numBins, nBins ) ) || + ( NE_16( hDiracDecBin->hReverb->blockSize, CLDFB_SLOTS_PER_SUBFRAME ) ) ) ) + { + ivas_binaural_reverb_close_fx( &( hDiracDecBin->hReverb ) ); + } + + IF( hDiracDecBin->hReverb == NULL && EQ_16( pos_idx, 0 ) ) /* open reverb only for the main direction */ + { + IF( NE_32( ( error = ivas_binaural_reverb_init_fx( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, pRoomAcoustics, output_Fs, ( *phHrtfParambin )->parametricReverberationTimes_fx, ( *phHrtfParambin )->parametricReverberationEneCorrections_fx, hDiracDecBin->earlyPartEneCorrection_fx ) ), IVAS_ERR_OK ) ) + { + return error; + } } } - } - ELSE IF( EQ_32( renderer_type, RENDERER_STEREO_PARAMETRIC ) ) - { - set32_fx( hDiracDecBin->earlyPartEneCorrection_fx, ONE_IN_Q28, CLDFB_NO_CHANNELS_MAX ); - hDiracDecBin->q_earlyPartEneCorrection = Q28; - hDiracDecBin->hReverb = NULL; - hDiracDecBin->renderStereoOutputInsteadOfBinaural = 1; - move16(); - move16(); - } - ELSE /* Not valid renderer type for this renderer */ - { - assert( false ); - } + ELSE IF( EQ_32( renderer_type, RENDERER_STEREO_PARAMETRIC ) ) + { + set32_fx( hDiracDecBin->earlyPartEneCorrection_fx, ONE_IN_Q28, CLDFB_NO_CHANNELS_MAX ); + hDiracDecBin->q_earlyPartEneCorrection = Q28; + hDiracDecBin->hReverb = NULL; + hDiracDecBin->renderStereoOutputInsteadOfBinaural = 1; + move16(); + move16(); + } + ELSE /* Not valid renderer type for this renderer */ + { + assert( false ); + } - hDiracDecBin->hDiffuseDist = NULL; /* Memory is allocated from stack during runtime when needed */ + hDiracDecBin->hDiffuseDist = NULL; /* Memory is allocated from stack during runtime when needed */ - if ( hDiracDecBin->hTdDecorr == NULL ) - { - hDiracDecBin->useTdDecorr = 0; - move16(); - } + if ( hDiracDecBin->hTdDecorr == NULL ) + { + hDiracDecBin->useTdDecorr = 0; + move16(); + } - IF( hDiracDecBin->h_freq_domain_decorr_ap_params != NULL ) - { - ivas_dirac_dec_decorr_close_fx( &hDiracDecBin->h_freq_domain_decorr_ap_params, &hDiracDecBin->h_freq_domain_decorr_ap_state ); - } + IF( hDiracDecBin->h_freq_domain_decorr_ap_params != NULL ) + { + ivas_dirac_dec_decorr_close_fx( &hDiracDecBin->h_freq_domain_decorr_ap_params, &hDiracDecBin->h_freq_domain_decorr_ap_state ); + } - IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( hDiracDecBin->hTdDecorr ), &( hDiracDecBin->useTdDecorr ) ) ), IVAS_ERR_OK ) ) - { - return error; - } + IF( pos_idx == 0 ) /* open decorrelator only for the main direction */ + { + IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( hDiracDecBin->hTdDecorr ), &( hDiracDecBin->useTdDecorr ) ) ), IVAS_ERR_OK ) ) + { + return error; + } - test(); - test(); - IF( !hDiracDecBin->useTdDecorr && !( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) ) - { - Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; - ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, output_Fs, nBins ); - - IF( NE_32( ( error = ivas_dirac_dec_decorr_open_fx( &( hDiracDecBin->h_freq_domain_decorr_ap_params ), - &( hDiracDecBin->h_freq_domain_decorr_ap_state ), - nBins, - BINAURAL_CHANNELS, - BINAURAL_CHANNELS, - DIRAC_SYNTHESIS_PSD_LS, - frequency_axis_fx, - BINAURAL_CHANNELS, - output_Fs ) ), - IVAS_ERR_OK ) ) + test(); + test(); + IF( !hDiracDecBin->useTdDecorr && !( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) ) + { + Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; + + ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, output_Fs, nBins ); + + IF( NE_32( ( error = ivas_dirac_dec_decorr_open_fx( &( hDiracDecBin->h_freq_domain_decorr_ap_params ), + &( hDiracDecBin->h_freq_domain_decorr_ap_state ), + nBins, + BINAURAL_CHANNELS, + BINAURAL_CHANNELS, + DIRAC_SYNTHESIS_PSD_LS, + frequency_axis_fx, + BINAURAL_CHANNELS, + output_Fs ) ), + IVAS_ERR_OK ) ) + { + return error; + } + } + } + ELSE { - return error; + hDiracDecBin->useTdDecorr = st_ivas->hDiracDecBin[0]->useTdDecorr; /* copy the flag, but the implementation re-uses the decorrelated signal */ + move16(); } - } - hDiracDecBin->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); /* Q14 */ - move16(); + hDiracDecBin->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); /* Q14 */ + move16(); - st_ivas->hDiracDecBin = hDiracDecBin; + hDiracDecBin->phHrtfParambin = phHrtfParambin; + + st_ivas->hDiracDecBin[pos_idx] = hDiracDecBin; + } /* allocate transport channels */ IF( st_ivas->hTcBuffer == NULL ) @@ -354,39 +371,45 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( Word16 nchan_to_allocate; Word16 n_samples_granularity; - nchan_to_allocate = 2 * BINAURAL_CHANNELS; + nchan_to_allocate = BINAURAL_CHANNELS; move16(); - if ( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + IF( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr ) { - nchan_to_allocate = 2 * BINAURAL_CHANNELS + 2; + nchan_to_allocate = 2 * BINAURAL_CHANNELS; move16(); } - - n_samples_granularity = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); - test(); - test(); - IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + ELSE IF( st_ivas->hOutSetup.separateChannelEnabled ) + { + nchan_to_allocate = add( nchan_to_allocate, 1 ); + } + if ( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - n_samples_granularity = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); /* Use the same granularity as tdrend */ + nchan_to_allocate = add( BINAURAL_CHANNELS, st_ivas->nchan_ism ); } + n_samples_granularity = ivas_jbm_dec_get_render_granularity_fx( st_ivas->renderer_type, ivas_renderer_secondary_select_fx( st_ivas ), output_Fs ); + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ), nchan_to_allocate, nchan_to_allocate, n_samples_granularity ) ), IVAS_ERR_OK ) ) { return error; } } + return IVAS_ERR_OK; } + /*------------------------------------------------------------------------- * ivas_dirac_dec_close_binaural_data() * * Close parametric binaural renderer *------------------------------------------------------------------------*/ -void ivas_dirac_dec_close_binaural_data( + +void ivas_dirac_dec_close_binaural_data_fx( DIRAC_DEC_BIN_HANDLE *hBinaural /* i/o: decoder DirAC binaural data handle */ ) { + Word16 pos_idx; test(); IF( hBinaural == NULL || *hBinaural == NULL ) @@ -394,33 +417,44 @@ void ivas_dirac_dec_close_binaural_data( return; } - IF( ( *hBinaural )->hReverb != NULL ) + FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) { - ivas_binaural_reverb_close_fx( &( ( *hBinaural )->hReverb ) ); - } + IF( hBinaural[pos_idx] != NULL ) + { + IF( hBinaural[pos_idx]->hReverb != NULL ) + { + ivas_binaural_reverb_close_fx( &( hBinaural[pos_idx]->hReverb ) ); + } - ivas_td_decorr_dec_close( &( ( *hBinaural )->hTdDecorr ) ); - IF( ( *hBinaural )->h_freq_domain_decorr_ap_params != NULL ) - { - ivas_dirac_dec_decorr_close_fx( &( *hBinaural )->h_freq_domain_decorr_ap_params, &( *hBinaural )->h_freq_domain_decorr_ap_state ); - } + ivas_td_decorr_dec_close( &( hBinaural[pos_idx]->hTdDecorr ) ); + + if ( hBinaural[pos_idx]->h_freq_domain_decorr_ap_params != NULL ) + { + ivas_dirac_dec_decorr_close_fx( &( hBinaural[pos_idx]->h_freq_domain_decorr_ap_params ), &( hBinaural[pos_idx]->h_freq_domain_decorr_ap_state ) ); + } - free( *hBinaural ); - *hBinaural = NULL; + free( hBinaural[pos_idx] ); + hBinaural[pos_idx] = NULL; + } + } return; } + + /*------------------------------------------------------------------------- * ivas_dirac_dec_binaural_copy_hrtfs() * * Temporary function for copying HRTF data from rom tables if no binary * file was given. *------------------------------------------------------------------------*/ + ivas_error ivas_dirac_dec_binaural_copy_hrtfs_fx( HRTFS_PARAMBIN_HANDLE *hHrtfParambin /* i/o: HRTF structure for rendering */ ) { Word16 i, j; + test(); IF( hHrtfParambin != NULL && *hHrtfParambin != NULL ) { @@ -435,52 +469,56 @@ ivas_error ivas_dirac_dec_binaural_copy_hrtfs_fx( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for parametric binauralizer HRTF tables" ); } + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) { FOR( j = 0; j < HRTF_SH_CHANNELS; j++ ) { Copy( hrtfShCoeffsRe_fx[i][j], hrtfParambin->hrtfShCoeffsRe_fx[i][j], HRTF_NUM_BINS ); /*Q14*/ + Scale_sig( hrtfParambin->hrtfShCoeffsRe_fx[i][j], HRTF_NUM_BINS, Q14 - hrtfShCoeffs_factorQ_fx ); Copy( hrtfShCoeffsIm_fx[i][j], hrtfParambin->hrtfShCoeffsIm_fx[i][j], HRTF_NUM_BINS ); /*Q14*/ + Scale_sig( hrtfParambin->hrtfShCoeffsIm_fx[i][j], HRTF_NUM_BINS, Q14 - hrtfShCoeffs_factorQ_fx ); } } - Copy32( parametricReverberationTimes_fx, hrtfParambin->parametricReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX ); /*Q31*/ - Copy32( parametricReverberationEneCorrections_fx, hrtfParambin->parametricReverberationEneCorrections_fx, CLDFB_NO_CHANNELS_MAX ); /*Q31*/ - Copy32( parametricEarlyPartEneCorrection_fx, hrtfParambin->parametricEarlyPartEneCorrection_fx, CLDFB_NO_CHANNELS_MAX ); /*Q28*/ + + Copy_Scale_sig_16_32_r( parametricReverberationTimes_fx, hrtfParambin->parametricReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX, Q26 - parametricReverberationTimes_factorQ_fx ); /*Q26*/ + Copy_Scale_sig_16_32_r( parametricReverberationEneCorrections_fx, hrtfParambin->parametricReverberationEneCorrections_fx, CLDFB_NO_CHANNELS_MAX, Q31 - parametricReverberationEneCorrections_factorQ_fx ); /*Q31*/ + Copy_Scale_sig_16_32_r( parametricEarlyPartEneCorrection_fx, hrtfParambin->parametricEarlyPartEneCorrection_fx, CLDFB_NO_CHANNELS_MAX, Q28 - parametricEarlyPartEneCorrection_factorQ_fx ); /*Q28*/ + *hHrtfParambin = hrtfParambin; - } - return IVAS_ERR_OK; + return IVAS_ERR_OK; + } } /*------------------------------------------------------------------------- - * void ivas_dirac_dec_binaural_render_fx() + * void ivas_dirac_dec_binaural_render() * * *------------------------------------------------------------------------*/ + void ivas_dirac_dec_binaural_render_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */ const Word16 nchan_transport, /* i : number of transport channels */ - Word32 *output_f[] /* o : rendered time signal, Q11 */ + Word32 *output_fx[] /* o : rendered time signal, Q11 */ ) { - Word16 slots_to_render, first_sf, last_sf, subframe_idx; + Word16 slots_to_render, first_sf, last_sf, subframe_idx, n_samples_sf; UWord16 slot_size, ch; UWord16 nchan_out; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; Word32 *output_fx_local[MAX_OUTPUT_CHANNELS]; - Word32 output_fx_local_buff[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - Word16 output_length; hSpatParamRendCom = st_ivas->hSpatParamRendCom; nchan_out = BINAURAL_CHANNELS; move16(); FOR( ch = 0; ch < nchan_out; ch++ ) { - output_fx_local[ch] = output_fx_local_buff[ch]; + output_fx_local[ch] = output_fx[ch]; } slot_size = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); @@ -499,11 +537,10 @@ void ivas_dirac_dec_binaural_render_fx( last_sf = add( last_sf, 1 ); } - output_length = 0; - move16(); FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { - Word16 n_samples_sf = imult1616( slot_size, hSpatParamRendCom->subframe_nbslots[subframe_idx] ); + n_samples_sf = imult1616( slot_size, hSpatParamRendCom->subframe_nbslots[subframe_idx] ); + ivas_dirac_dec_binaural_internal_fx( st_ivas, st_ivas->hCombinedOrientationData, output_fx_local, nchan_transport, subframe_idx ); FOR( ch = 0; ch < nchan_out; ch++ ) @@ -511,17 +548,10 @@ void ivas_dirac_dec_binaural_render_fx( output_fx_local[ch] += n_samples_sf; } - output_length = add( output_length, n_samples_sf ); - /* update combined orientation access index */ ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_sf ); } - FOR( ch = 0; ch < nchan_out; ch++ ) - { - Copy32( output_fx_local_buff[ch], output_f[ch], output_length ); - } - IF( EQ_16( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->num_slots ) ) { hSpatParamRendCom->dirac_read_idx = add( hSpatParamRendCom->dirac_read_idx, DEFAULT_JBM_SUBFRAMES_5MS ) % hSpatParamRendCom->dirac_md_buffer_length; @@ -534,11 +564,13 @@ void ivas_dirac_dec_binaural_render_fx( return; } + /*------------------------------------------------------------------------- * ivas_dirac_dec_binaural_sba_gain() * * loudness correction for parametric binaural renderer *------------------------------------------------------------------------*/ + void ivas_dirac_dec_binaural_sba_gain_fx( Word32 *output[], /* i/o: synthesized core-coder transport channels/DirAC output, inp Qx, out Qx-1 */ const Word16 nchan_remapped, /* i : num channels after remapping of TCs */ @@ -561,7 +593,7 @@ void ivas_dirac_dec_binaural_sba_gain_fx( FOR( n = 0; n < nchan_remapped; n++ ) { - v_multc_fixed_16( output[n], gain, output[n], output_frame ); /* Qx to Qx-1*/ + v_multc_fx_16( output[n], gain, output[n], output_frame ); /* Qx to Qx-1*/ } return; @@ -571,6 +603,7 @@ void ivas_dirac_dec_binaural_sba_gain_fx( /*------------------------------------------------------------------------- * Local functions *------------------------------------------------------------------------*/ + static void ivas_dirac_dec_binaural_internal_fx( Decoder_Struct *st_ivas, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, @@ -578,7 +611,7 @@ static void ivas_dirac_dec_binaural_internal_fx( const Word16 nchan_transport, const Word16 subframe ) { - Word16 q_input = 11; + Word16 q_input = Q11; move16(); IF( st_ivas->hSCE[0] ) { @@ -600,7 +633,7 @@ static void ivas_dirac_dec_binaural_internal_fx( move16(); } } - + Word16 q_cldfb_temp = sub( q_input, 1 ); DIRAC_DEC_BIN_HANDLE hDiracDecBin; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; PARAMBIN_REND_CONFIG config_data; @@ -614,13 +647,27 @@ static void ivas_dirac_dec_binaural_internal_fx( Word16 nBins, offsetSamples; Word16 i, j; Word16 q_mat, q_out; - hDiracDecBin = st_ivas->hDiracDecBin; + Word16 pos_idx; + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData; + Word32 tmp_Cldfb_out_re[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 tmp_Cldfb_out_im[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + /* these allow re-using the reverb and freq-domain decorrelator signals from ivas_dirac_dec_binaural_process_output() in split rendering for the side renderings */ + Word32 reverbRe_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 reverbIm_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 decorrRe_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 decorrIm_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 subFrameTotalEne_fx[CLDFB_NO_CHANNELS_MAX]; + Word16 subFrameTotalEne_e[CLDFB_NO_CHANNELS_MAX]; + Word32 IIReneLimiter_fx[CLDFB_NO_CHANNELS_MAX]; + Word16 Q_inp_mix; + + hDiracDecBin = st_ivas->hDiracDecBin[0]; assert( hDiracDecBin ); hSpatParamRendCom = st_ivas->hSpatParamRendCom; nBins = hSpatParamRendCom->num_freq_bands; move16(); offsetSamples = imult1616( hSpatParamRendCom->slots_rendered, nBins ); - + Word32 tmp_arr[CLDFB_NO_CHANNELS_MAX]; /* Setup internal config */ config_data.separateCenterChannelRendering = st_ivas->hOutSetup.separateChannelEnabled; move16(); @@ -698,7 +745,7 @@ static void ivas_dirac_dec_binaural_internal_fx( move32(); move32(); move32(); - + Word16 ch_len = s_max( 4, numInChannels ); FOR( i = 0; i < 6; i++ ) { FOR( j = 0; j < 4; j++ ) @@ -707,6 +754,7 @@ static void ivas_dirac_dec_binaural_internal_fx( set32_fx( Cldfb_ImagBuffer_in_fx[i][j], 0, 60 ); } } + /* CLDFB Analysis of input */ FOR( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ ) { @@ -715,13 +763,21 @@ static void ivas_dirac_dec_binaural_internal_fx( test(); IF( ch == 0 || EQ_16( nchan_transport, 2 ) ) { - q_cldfb[ch][slot] = q_input; + q_cldfb[ch][slot] = q_cldfb_temp; move16(); + Copy_Scale_sig32( &( st_ivas->hTcBuffer->tc_fx[ch][nBins * slot + offsetSamples] ), tmp_arr, nBins, -1 ); + scale_sig32( st_ivas->cldfbAnaDec[ch]->cldfb_state_fx, sub( st_ivas->cldfbAnaDec[ch]->p_filter_length, st_ivas->cldfbAnaDec[ch]->no_channels ), sub( q_cldfb_temp, st_ivas->cldfbAnaDec[ch]->Q_cldfb_state ) ); cldfbAnalysis_ts_fx_fixed_q( - &( st_ivas->hTcBuffer->tc_fx[ch][add( imult1616( nBins, slot ), offsetSamples )] ), + tmp_arr, Cldfb_RealBuffer_in_fx[ch][slot], Cldfb_ImagBuffer_in_fx[ch][slot], nBins, st_ivas->cldfbAnaDec[ch], &q_cldfb[ch][slot] ); + scale_sig32( st_ivas->cldfbAnaDec[ch]->cldfb_state_fx, sub( st_ivas->cldfbAnaDec[ch]->p_filter_length, st_ivas->cldfbAnaDec[ch]->no_channels ), sub( q_input, st_ivas->cldfbAnaDec[ch]->Q_cldfb_state ) ); + st_ivas->cldfbAnaDec[ch]->Q_cldfb_state = q_input; + scale_sig32( Cldfb_RealBuffer_in_fx[ch][slot], nBins, 1 ); // Q6 + scale_sig32( Cldfb_ImagBuffer_in_fx[ch][slot], nBins, 1 ); // Q6 + q_cldfb[ch][slot] = add( q_cldfb[ch][slot], 1 ); + move16(); } ELSE IF( EQ_16( config_data.nchan_transport, 2 ) ) /* Stereo signal transmitted as mono with DFT stereo */ { @@ -738,30 +794,31 @@ static void ivas_dirac_dec_binaural_internal_fx( IF( st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) { Word16 numCoreBands, b; - Word16 slotInFrame; numCoreBands = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->numCoreBands; move16(); - slotInFrame = add( hSpatParamRendCom->slots_rendered, slot ); generate_masking_noise_dirac_ivas_fx( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], - st_ivas->hTcBuffer->tc_fx[nchan_transport], + &st_ivas->hTcBuffer->tc_fx[nchan_transport][hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->slots_rendered], Cldfb_RealBuffer_in_fx[2][slot], Cldfb_ImagBuffer_in_fx[2][slot], - slotInFrame, + slot, st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag, - 11, &q_cldfb[2][slot] ); + st_ivas->hTcBuffer->q_tc_fx, &q_cldfb[2][slot] ); generate_masking_noise_dirac_ivas_fx( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], /*nothing will be analyzed, just get cnst*/ NULL, Cldfb_RealBuffer_in_fx[1][slot], Cldfb_ImagBuffer_in_fx[1][slot], - slotInFrame, + slot, st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag, 0, &q_cldfb[1][slot] ); + scale_sig32( Cldfb_RealBuffer_in_fx[1][slot], CLDFB_NO_CHANNELS_MAX, negate( add( sub( q_cldfb[1][slot], q_input ), 5 ) ) ); + scale_sig32( Cldfb_ImagBuffer_in_fx[1][slot], CLDFB_NO_CHANNELS_MAX, negate( add( sub( q_cldfb[1][slot], q_input ), 5 ) ) ); + /* LB: Copy first channel + LB-CNG to first and second channels with same scaling (dual-mono)*/ FOR( b = 0; b < numCoreBands; b++ ) { @@ -783,11 +840,10 @@ static void ivas_dirac_dec_binaural_internal_fx( { Cldfb_RealBuffer_in_fx[0][slot][b] = Mpy_32_16_1( Cldfb_RealBuffer_in_fx[0][slot][b], 23170 ); Cldfb_RealBuffer_in_fx[1][slot][b] = L_add( L_add( Cldfb_RealBuffer_in_fx[0][slot][b], L_shr( Cldfb_RealBuffer_in_fx[1][slot][b], 1 ) ), Cldfb_RealBuffer_in_fx[0][slot][b] ); - Cldfb_RealBuffer_in_fx[0][slot][b] = L_add( Cldfb_RealBuffer_in_fx[0][slot][b], L_shr( Cldfb_RealBuffer_in_fx[2][slot][b], 1 ) ); - + Cldfb_RealBuffer_in_fx[0][slot][b] = L_add( Cldfb_RealBuffer_in_fx[0][slot][b], L_shr( Cldfb_RealBuffer_in_fx[2][slot][b], add( sub( q_cldfb[2][slot], q_input ), 6 ) ) ); Cldfb_ImagBuffer_in_fx[0][slot][b] = Mpy_32_16_1( Cldfb_ImagBuffer_in_fx[0][slot][b], 23170 ); Cldfb_ImagBuffer_in_fx[1][slot][b] = L_add( Cldfb_ImagBuffer_in_fx[0][slot][b], L_shr( Cldfb_ImagBuffer_in_fx[1][slot][b], 1 ) ); - Cldfb_ImagBuffer_in_fx[0][slot][b] = L_add( Cldfb_ImagBuffer_in_fx[0][slot][b], L_shr( Cldfb_ImagBuffer_in_fx[2][slot][b], 1 ) ); + Cldfb_ImagBuffer_in_fx[0][slot][b] = L_add( Cldfb_ImagBuffer_in_fx[0][slot][b], L_shr( Cldfb_ImagBuffer_in_fx[2][slot][b], add( sub( q_cldfb[2][slot], q_input ), 6 ) ) ); move32(); move32(); move32(); @@ -800,8 +856,8 @@ static void ivas_dirac_dec_binaural_internal_fx( { /* At mono input duplicate the channel to dual-mono, and apply gain correction to ensure same overall level as in stereo mode */ - v_multc_fixed_16( Cldfb_RealBuffer_in_fx[0][slot], 23170, Cldfb_RealBuffer_in_fx[0][slot], nBins ); - v_multc_fixed_16( Cldfb_ImagBuffer_in_fx[0][slot], 23170, Cldfb_ImagBuffer_in_fx[0][slot], nBins ); + v_multc_fx_16( Cldfb_RealBuffer_in_fx[0][slot], 23170, Cldfb_RealBuffer_in_fx[0][slot], nBins ); + v_multc_fx_16( Cldfb_ImagBuffer_in_fx[0][slot], 23170, Cldfb_ImagBuffer_in_fx[0][slot], nBins ); Copy32( Cldfb_RealBuffer_in_fx[0][slot], Cldfb_RealBuffer_in_fx[1][slot], nBins ); Copy32( Cldfb_ImagBuffer_in_fx[0][slot], Cldfb_ImagBuffer_in_fx[1][slot], nBins ); @@ -813,12 +869,8 @@ static void ivas_dirac_dec_binaural_internal_fx( IF( hDiracDecBin->useTdDecorr ) { -#ifdef FIX_ISSUE_1185 - Word32 tmp_arr[60]; -#endif FOR( ch = BINAURAL_CHANNELS; ch < ( 2 * BINAURAL_CHANNELS ); ch++ ) { -#ifdef FIX_ISSUE_1185 q_cldfb[ch][slot] = sub( q_input, 1 ); move16(); @@ -836,23 +888,14 @@ static void ivas_dirac_dec_binaural_internal_fx( scale_sig32( st_ivas->cldfbAnaDec[ch]->cldfb_state_fx, sub( st_ivas->cldfbAnaDec[ch]->p_filter_length, st_ivas->cldfbAnaDec[ch]->no_channels ), sub( q_input, st_ivas->cldfbAnaDec[ch]->Q_cldfb_state ) ); st_ivas->cldfbAnaDec[ch]->Q_cldfb_state = q_input; move16(); -#else - q_cldfb[ch][slot] = q_input; - move16(); - cldfbAnalysis_ts_fx_fixed_q( - &( st_ivas->hTcBuffer->tc_fx[ch][nBins * slot + offsetSamples] ), - Cldfb_RealBuffer_in_fx[ch][slot], - Cldfb_ImagBuffer_in_fx[ch][slot], - nBins, st_ivas->cldfbAnaDec[ch], &q_cldfb[ch][slot] ); -#endif /*FIX_ISSUE_1185*/ test(); test(); IF( EQ_16( config_data.nchan_transport, 1 ) && ( EQ_32( config_data.ivas_format, SBA_FORMAT ) || EQ_32( config_data.ivas_format, SBA_ISM_FORMAT ) ) ) { - v_multc_fixed_16( Cldfb_RealBuffer_in_fx[ch][slot], 23170, Cldfb_RealBuffer_in_fx[ch][slot], nBins ); - v_multc_fixed_16( Cldfb_ImagBuffer_in_fx[ch][slot], 23170, Cldfb_ImagBuffer_in_fx[ch][slot], nBins ); + v_multc_fx_16( Cldfb_RealBuffer_in_fx[ch][slot], 23170, Cldfb_RealBuffer_in_fx[ch][slot], nBins ); + v_multc_fx_16( Cldfb_ImagBuffer_in_fx[ch][slot], 23170, Cldfb_ImagBuffer_in_fx[ch][slot], nBins ); } } } @@ -867,39 +910,34 @@ static void ivas_dirac_dec_binaural_internal_fx( Scale_sig( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, CLDFB_NO_COL_MAX, Q15 - st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q ); st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q = Q15; move16(); - FOR( Word16 idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) - { - Scale_sig32( st_ivas->hSpar->hFbMixer->pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band_fx[idx], IVAS_MAX_NUM_FB_BANDS, Q31 - Q22 ); /*Q31 to Q22*/ - } ivas_sba_prototype_renderer_fx( st_ivas, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_cldfb, subframe ); - FOR( Word16 idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) - { - Scale_sig32( st_ivas->hSpar->hFbMixer->pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band_fx[idx], IVAS_MAX_NUM_FB_BANDS, Q22 - Q31 ); /*Q31 to Q22*/ - } } Word16 q_inp = Q6; move16(); - FOR( Word16 cha = 0; cha < 6; cha++ ) + FOR( Word16 cha = 0; cha < ch_len; cha++ ) { FOR( slot = 0; slot < 4; slot++ ) { - scale_sig32( Cldfb_RealBuffer_in_fx[cha][slot], 60, sub( q_inp, q_cldfb[cha][slot] ) ); // Q6 - scale_sig32( Cldfb_ImagBuffer_in_fx[cha][slot], 60, sub( q_inp, q_cldfb[cha][slot] ) ); // Q6 -#ifdef FIX_ISSUE_1185 - q_cldfb[cha][slot] = 6; + Word16 q_diff = sub( q_inp, q_cldfb[cha][slot] ); + IF( q_diff != 0 ) + { + Scale_sig32( Cldfb_RealBuffer_in_fx[cha][slot], 60, q_diff ); // Q6 + Scale_sig32( Cldfb_ImagBuffer_in_fx[cha][slot], 60, q_diff ); // Q6 + q_cldfb[cha][slot] = 6; + } move16(); -#endif } } test(); test(); test(); - IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_16( nchan_transport, 2 ) && NE_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && NE_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) + test(); + test(); + IF( ( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && ( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || ( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) ) ) ) || EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { - /* Un-tested function. No test-case is hitting.*/ - ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( st_ivas, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, &q_inp, nBins, subframe ); + ivas_omasa_preProcessStereoTransportsForEditedObjects_fx( st_ivas, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, &q_inp, nBins, subframe ); } IF( hCombinedOrientationData ) @@ -915,13 +953,13 @@ static void ivas_dirac_dec_binaural_internal_fx( IF( EQ_16( nchan_transport, 2 ) ) { + /* in case of split rendering, determine the prototype rotation based on the main direction and use the same prototypes for the offset directions */ adaptTransportSignalsHeadtracked_fx( hCombinedOrientationData, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat_fx ); ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( hCombinedOrientationData, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat_fx ); } } test(); - ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, Rmat_fx, subframe, hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, st_ivas->hMasaIsmData, q_inp ); IF( EQ_32( config_data.ivas_format, ISM_FORMAT ) ) { @@ -939,6 +977,11 @@ static void ivas_dirac_dec_binaural_internal_fx( move16(); } + ivas_dirac_dec_binaural_formulate_input_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, subframe, + subFrameTotalEne_fx, subFrameTotalEne_e, IIReneLimiter_fx, q_inp ); + + ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Rmat_fx, subframe, + hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, subFrameTotalEne_fx, subFrameTotalEne_e, IIReneLimiter_fx, st_ivas->hMasaIsmData ); nchanSeparateChannels = 0; move16(); @@ -1005,42 +1048,179 @@ static void ivas_dirac_dec_binaural_internal_fx( hDiracDecBin->q_processMtxDecPrev = q_mat; move16(); - ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat ); - - hDiracDecBin->hDiffuseDist = NULL; + pMultiBinPoseData = NULL; + IF( st_ivas->hSplitBinRend != NULL ) + { + pMultiBinPoseData = &st_ivas->hSplitBinRend->splitrend.multiBinPoseData; + move32(); + } - hSpatParamRendCom->slots_rendered = add( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->subframe_nbslots[subframe] ); - hSpatParamRendCom->subframes_rendered = add( hSpatParamRendCom->subframes_rendered, 1 ); + test(); + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat, + tmp_Cldfb_out_re, tmp_Cldfb_out_im, reverbRe_fx, reverbIm_fx, decorrRe_fx, decorrIm_fx, &Q_inp_mix, 1 ); - move16(); - move16(); - FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe]; i++ ) + { + ivas_CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[ch], tmp_Cldfb_out_re[ch][i], tmp_Cldfb_out_im[ch][i], CLDFB_NO_CHANNELS_MAX ); + } + } + } + ELSE { - scale_sig32( output_fx[ch], imult1616( nBins, hSpatParamRendCom->subframe_nbslots[subframe] ), sub( 11, q_out ) ); // Scaling to Q11 - scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, sub( Q11, st_ivas->cldfbSynDec[ch]->Q_cldfb_state ) ); - st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11; - move16(); + ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat, NULL, NULL, + reverbRe_fx, reverbIm_fx, decorrRe_fx, decorrIm_fx, &Q_inp_mix, 1 ); } + hDiracDecBin->hDiffuseDist = NULL; - return; -} + test(); + IF( pMultiBinPoseData != NULL && GT_16( pMultiBinPoseData->num_poses, 1 ) ) + { + /* quaternion-based rotation from ivas_binRenderer_internal.c:ivas_binRenderer(), but using absolute rotation instead of delta rotations */ + IVAS_QUATERNION Quaternions_rot, Quaternions_abs, *Quaternions_ref; + Word32 Rmat_local[3][3]; + IF( hCombinedOrientationData ) + { + Quaternions_ref = &hCombinedOrientationData->Quaternions[0]; + Copy_Quat_fx( Quaternions_ref, &Quaternions_abs ); + modify_Quat_q_fx( &Quaternions_abs, &Quaternions_abs, Q22 ); + Quaternions_rot.w_fx = L_negate( 12582912 ); /* signal to use Euler */ + Quat2EulerDegree_fx( Quaternions_abs, &Quaternions_abs.z_fx, &Quaternions_abs.y_fx, &Quaternions_abs.x_fx ); /*order in Quat2Euler seems to be reversed ?*/ + Quaternions_abs.w_fx = L_negate( 12582912 ); /* signal to use Euler */ -static void ivas_dirac_dec_decorrelate_slot_fx( - DIRAC_DEC_BIN_HANDLE hDiracDecBin, - const Word16 num_freq_bands, - const Word16 slot, - Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /*q_inp*/ - Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /*q_inp*/ - Word16 q_inp, - Word32 decRe[][CLDFB_NO_CHANNELS_MAX], /*q_inp*/ - Word32 decIm[][CLDFB_NO_CHANNELS_MAX] /*q_inp*/ ) -{ - Word16 offset, ch, bin; - Word32 onset_filter_fx[BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, 60 bins */ - Word32 decorrelatedFrameInterleaved_fx[2 * BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, real + imag, 60 bins */ - Word32 protoFrame_fx[2 * BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, real + imag, 60 bins */ - Word16 q_decorrelatedFrameInterleaved, q_protoFrame; + FOR( pos_idx = 1; pos_idx < pMultiBinPoseData->num_poses; pos_idx++ ) + { + Quaternions_rot.x_fx = L_add( Quaternions_abs.x_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][0] ); + Quaternions_rot.y_fx = L_add( Quaternions_abs.y_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][1] ); + Quaternions_rot.z_fx = L_add( Quaternions_abs.z_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][2] ); + move32(); + move32(); + move32(); + Euler2Quat_fx( deg2rad_fx( Quaternions_rot.x_fx ), deg2rad_fx( Quaternions_rot.y_fx ), deg2rad_fx( Quaternions_rot.z_fx ), &Quaternions_rot ); + modify_Quat_q_fx( &Quaternions_rot, &Quaternions_rot, Quaternions_ref->q_fact ); + QuatToRotMat_fx( Quaternions_rot, Rmat_local ); + modify_Rmat_q_fx( Rmat_local, Rmat_local, sub( shl( Quaternions_ref->q_fact, 1 ), 32 ), Q30 ); + + hDiracDecBin = st_ivas->hDiracDecBin[pos_idx]; + assert( hDiracDecBin != NULL && "No DiracDecBin handle for this position" ); + test(); + IF( EQ_32( config_data.ivas_format, SBA_FORMAT ) || EQ_32( config_data.ivas_format, SBA_ISM_FORMAT ) ) + { + hDiracDecBin->hDiffuseDist = &diffuseDistData; + } + + /* re-use input covariance for the side renderings */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + Copy32( st_ivas->hDiracDecBin[0]->ChEne_fx[ch], hDiracDecBin->ChEne_fx[ch], hSpatParamRendCom->num_freq_bands ); + Copy( st_ivas->hDiracDecBin[0]->ChEne_e[ch], hDiracDecBin->ChEne_e[ch], hSpatParamRendCom->num_freq_bands ); + } + Copy32( st_ivas->hDiracDecBin[0]->ChCrossRe_fx, hDiracDecBin->ChCrossRe_fx, hSpatParamRendCom->num_freq_bands ); + Copy32( st_ivas->hDiracDecBin[0]->ChCrossIm_fx, hDiracDecBin->ChCrossIm_fx, hSpatParamRendCom->num_freq_bands ); + Copy( st_ivas->hDiracDecBin[0]->ChCrossRe_e, hDiracDecBin->ChCrossRe_e, hSpatParamRendCom->num_freq_bands ); + Copy( st_ivas->hDiracDecBin[0]->ChCrossIm_e, hDiracDecBin->ChCrossIm_e, hSpatParamRendCom->num_freq_bands ); + + ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Rmat_local, subframe, + hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, + subFrameTotalEne_fx, subFrameTotalEne_e, IIReneLimiter_fx, st_ivas->hMasaIsmData ); + + ivas_dirac_dec_binaural_determine_processing_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, max_band_decorr, Rmat_local, subframe, + hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, + nchanSeparateChannels, st_ivas->hMasaIsmData ); + + q_mat = hDiracDecBin->q_processMtx; + move16(); + q_mat = s_min( q_mat, hDiracDecBin->q_processMtxPrev ); + q_mat = s_min( q_mat, hDiracDecBin->q_processMtxDec ); + q_mat = s_min( q_mat, hDiracDecBin->q_processMtxDecPrev ); + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( slot = 0; slot < BINAURAL_CHANNELS; slot++ ) + { + Scale_sig( hDiracDecBin->processMtxRe_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtx ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxIm_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtx ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxRePrev_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtxPrev ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxImPrev_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtxPrev ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxDecRe_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtxDec ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxDecIm_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtxDec ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxDecRePrev_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtxDecPrev ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxDecImPrev_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtxDecPrev ) ); // scaling to q_mat + } + FOR( slot = 0; slot < nchanSeparateChannels; slot++ ) + { + Scale_sig( hDiracDecBin->processMtxRe_fx[ch][slot + BINAURAL_CHANNELS], nBins, sub( q_mat, hDiracDecBin->q_processMtx ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxIm_fx[ch][slot + BINAURAL_CHANNELS], nBins, sub( q_mat, hDiracDecBin->q_processMtx ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxRePrev_fx[ch][slot + BINAURAL_CHANNELS], nBins, sub( q_mat, hDiracDecBin->q_processMtxPrev ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxImPrev_fx[ch][slot + BINAURAL_CHANNELS], nBins, sub( q_mat, hDiracDecBin->q_processMtxPrev ) ); // scaling to q_mat + } + } + hDiracDecBin->q_processMtx = q_mat; + move16(); + hDiracDecBin->q_processMtxPrev = q_mat; + move16(); + hDiracDecBin->q_processMtxDec = q_mat; + move16(); + hDiracDecBin->q_processMtxDecPrev = q_mat; + move16(); + + /* re-use reverb and decorr from main direction for the sides */ + ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat, + tmp_Cldfb_out_re, tmp_Cldfb_out_im, reverbRe_fx, reverbIm_fx, decorrRe_fx, decorrIm_fx, &Q_inp_mix, 0 ); + + /* copy from temporary buffer to the main split rendering buffer */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe]; i++ ) + { + ivas_CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], tmp_Cldfb_out_re[ch][i], tmp_Cldfb_out_im[ch][i], CLDFB_NO_CHANNELS_MAX ); + } + } + + hDiracDecBin->hDiffuseDist = NULL; + } + } + } + + /* update this counter only after the last rendering of split directions */ + + hSpatParamRendCom->slots_rendered = add( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->subframe_nbslots[subframe] ); + hSpatParamRendCom->subframes_rendered = add( hSpatParamRendCom->subframes_rendered, 1 ); + + move16(); + move16(); + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + scale_sig32( output_fx[ch], imult1616( nBins, hSpatParamRendCom->subframe_nbslots[subframe] ), sub( 11, q_out ) ); // Scaling to Q11 + scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, sub( Q11, st_ivas->cldfbSynDec[ch]->Q_cldfb_state ) ); + st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11; + move16(); + } + + return; +} + + +static void ivas_dirac_dec_decorrelate_slot_fx( + DIRAC_DEC_BIN_HANDLE hDiracDecBin, + const Word16 num_freq_bands, + const Word16 slot, + Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /*q_inp*/ + Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /*q_inp*/ + const Word16 q_inp, + Word32 decRe[][CLDFB_NO_CHANNELS_MAX], + Word32 decIm[][CLDFB_NO_CHANNELS_MAX], + Word16 *q_out ) +{ + Word16 offset, ch, bin; + Word32 onset_filter_fx[BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, 60 bins */ + Word32 decorrelatedFrameInterleaved_fx[2 * BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, real + imag, 60 bins */ + Word32 protoFrame_fx[2 * BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, real + imag, 60 bins */ + Word16 q_decorrelatedFrameInterleaved, q_protoFrame; const Word16 protoIndexDir[BINAURAL_CHANNELS] = { 0, 1 }; move16(); q_protoFrame = q_inp; @@ -1086,50 +1266,40 @@ static void ivas_dirac_dec_decorrelate_slot_fx( move32(); } } - // q_decorrelatedFrameInterleaved will be same as q_inp/q_protoFrame // + + *q_out = q_decorrelatedFrameInterleaved; // q_decorrelatedFrameInterleaved will be same as q_inp/q_protoFrame // + return; } -static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_fx( + +static void ivas_dirac_dec_binaural_formulate_input_covariance_matrices_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, PARAMBIN_REND_CONFIG_HANDLE hConfig, Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /*q*/ Word32 inIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /*q*/ - Word32 Rmat_fx[3][3], /*Q30*/ const Word16 subframe, - const Word16 isHeadtracked, - const MASA_ISM_DATA_HANDLE hMasaIsmData, - Word16 q ) + Word32 *subFrameTotalEne_fx, + Word16 *subFrameTotalEne_e, + Word32 *IIReneLimiter_fx, + const Word16 q ) { Word16 ch, slot, bin; - Word16 separateCenterChannelRendering; - Word16 nBins, idx, shift; - Word32 frameMeanDiffusenessEneWeight_fx[CLDFB_NO_CHANNELS_MAX]; + Word16 nBins; Word32 IIReneLimiterFactor_fx; // Q26 Word32 qualityBasedSmFactor_fx; Word32 lowBitRateEQ_fx[CLDFB_NO_CHANNELS_MAX]; UWord8 applyLowBitRateEQ; - Word16 dirac_read_idx; - Word32 subFrameTotalEne_fx[CLDFB_NO_CHANNELS_MAX]; - Word16 subFrameTotalEne_e[CLDFB_NO_CHANNELS_MAX]; - PARAMBIN_HRTF_GAIN_CACHE gainCache[MAX_GAIN_CACHE_SIZE]; IVAS_FORMAT ivas_format; - MC_MODE mc_mode; Word32 ivas_total_brate; Word16 nchan_transport; - Word16 gainCacheBaseIndex; - Word16 q_earlyPartEneCorrection; Word16 exp, exp1; Word64 temp64; Word32 temp; - separateCenterChannelRendering = hConfig->separateCenterChannelRendering; - move16(); ivas_format = hConfig->ivas_format; move32(); - mc_mode = hConfig->mc_mode; - move32(); ivas_total_brate = hConfig->ivas_total_brate; move32(); nchan_transport = hConfig->nchan_transport; @@ -1141,40 +1311,21 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric nBins = hSpatParamRendCom->num_freq_bands; /* Actually bins */ move16(); - q_earlyPartEneCorrection = s_min( Q31, add( getScaleFactor32( hDiracDecBin->earlyPartEneCorrection_fx, nBins ), hDiracDecBin->q_earlyPartEneCorrection ) ); - scale_sig32( hDiracDecBin->earlyPartEneCorrection_fx, nBins, sub( q_earlyPartEneCorrection, hDiracDecBin->q_earlyPartEneCorrection ) ); - hDiracDecBin->q_earlyPartEneCorrection = q_earlyPartEneCorrection; - move16(); - set32_fx( hDiracDecBin->ChCrossRe_fx, 0, nBins ); set32_fx( hDiracDecBin->ChCrossIm_fx, 0, nBins ); - set32_fx( hDiracDecBin->ChCrossReOut_fx, 0, nBins ); - set32_fx( hDiracDecBin->ChCrossImOut_fx, 0, nBins ); set16_fx( hDiracDecBin->ChCrossRe_e, 0, nBins ); set16_fx( hDiracDecBin->ChCrossIm_e, 0, nBins ); - set16_fx( hDiracDecBin->ChCrossReOut_e, 0, nBins ); - set16_fx( hDiracDecBin->ChCrossImOut_e, 0, nBins ); + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { set32_fx( hDiracDecBin->ChEne_fx[ch], 0, nBins ); - set32_fx( hDiracDecBin->ChEneOut_fx[ch], 0, nBins ); set16_fx( hDiracDecBin->ChEne_e[ch], 0, nBins ); - set16_fx( hDiracDecBin->ChEneOut_e[ch], 0, nBins ); } - set32_fx( hDiracDecBin->frameMeanDiffuseness_fx, 0, nBins ); - - set32_fx( frameMeanDiffusenessEneWeight_fx, 0, CLDFB_NO_CHANNELS_MAX ); set16_fx( subFrameTotalEne_e, 0, CLDFB_NO_CHANNELS_MAX ); - FOR( idx = 0; idx < MAX_GAIN_CACHE_SIZE; idx++ ) - { - gainCache[idx].azi = -1000; /* Use -1000 as value for uninitialized cache. */ - move16(); - } - /* Determine EQ for low bit rates (13.2 and 16.4 kbps) */ applyLowBitRateEQ = 0; move16(); @@ -1204,8 +1355,6 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Formulate input and target covariance matrices for this subframe */ set32_fx( subFrameTotalEne_fx, 0, CLDFB_NO_CHANNELS_MAX ); - dirac_read_idx = hSpatParamRendCom->render_to_md_map[subframe]; - move16(); exp = sub( 63, shl( q, 1 ) ); // exp for the energy (inRe_fx * inRe_fx + inIm_fx * inIm_fx) computed below @@ -1280,12 +1429,14 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric temp64 = W_add( W_mult0_32_32( tempRe, tempRe ), W_mult0_32_32( tempIm, tempIm ) ); // 2q exp1 = W_norm( temp64 ); temp64 = W_shl( temp64, exp1 ); // 2q + exp1 - subFrameSumEne_fx[bin] = BASOP_Util_Add_Mant32Exp( subFrameSumEne_fx[bin], subFrameTotalEne_e[bin], W_extract_h( temp64 ), sub( exp /* 63 - 2q */, exp1 ) /*31 - (2q + exp1 - 32)*/, &subFrameTotalEne_e[bin] ); + subFrameSumEne_fx[bin] = BASOP_Util_Add_Mant32Exp( subFrameSumEne_fx[bin], subFrameSumEne_e[bin], W_extract_h( temp64 ), sub( exp /* 63 - 2q */, exp1 ) /*31 - (2q + exp1 - 32)*/, &subFrameSumEne_e[bin] ); move32(); } } FOR( bin = 0; bin < nBins; bin++ ) { + subFrameTotalEne_e[bin] = sub( subFrameTotalEne_e[bin], 1 ); + move16(); temp = L_shl_sat( subFrameTotalEne_fx[bin], sub( subFrameTotalEne_e[bin], subFrameSumEne_e[bin] ) ); // subFrameSumEne_e[bin] IF( GT_32( subFrameSumEne_fx[bin], temp ) ) { @@ -1297,6 +1448,156 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric } } + test(); + /* Temporal IIR-type smoothing of covariance matrices. Also apply encoding quality based smoothing factor. */ + IF( EQ_32( ivas_format, MASA_FORMAT ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) + { + IIReneLimiterFactor_fx = L_add( L_shl( 16, Q26 ), L_sub( L_shl( 1, Q26 ), L_shr( qualityBasedSmFactor_fx, 5 ) ) ); // Q26 + } + ELSE + { + IIReneLimiterFactor_fx = L_add( L_shl( 8, Q26 ), L_sub( L_shl( 1, Q26 ), L_shr( qualityBasedSmFactor_fx, 5 ) ) ); // Q26 + } + + FOR( bin = 0; bin < nBins; bin++ ) + { + /* Temporally smooth cov mtx estimates for resulting mixing matrix stability. The design principle is that + * the energy history (IIR) must not be more than double of the current frame energy. This provides more + * robust performance at energy offsets when compared to typical IIR averaging. */ + Word16 num_e, den_e; + Word32 num, den; + num = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEne_fx[0][bin], hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_fx[1][bin], hDiracDecBin->ChEne_e[1][bin], &num_e ); + num = Mpy_32_32( num, IIReneLimiterFactor_fx ); /*Q = (31 - num_e + 26 - 31) = (26 - num_e)*/ + den_e = 0; + move16(); + den = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEnePrev_fx[0][bin], hDiracDecBin->ChEnePrev_e[0][bin], hDiracDecBin->ChEnePrev_fx[1][bin], hDiracDecBin->ChEnePrev_e[1][bin], &den_e ); + den = L_max( 1, den ); + IIReneLimiter_fx[bin] = BASOP_Util_Divide3232_Scale_newton( num, den, &exp ); + exp = add( sub( num_e, den_e ), add( 5, exp ) ); + IF( L_shr_sat( IIReneLimiter_fx[bin], sub( 31, exp ) ) > 0 ) + { + IIReneLimiter_fx[bin] = ONE_IN_Q31; /*Q31*/ + move32(); + } + ELSE + { + IIReneLimiter_fx[bin] = L_shl( IIReneLimiter_fx[bin], exp ); /*Q31*/ + } + + hDiracDecBin->ChCrossRe_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossRe_fx[bin], qualityBasedSmFactor_fx ); + hDiracDecBin->ChCrossIm_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossIm_fx[bin], qualityBasedSmFactor_fx ); + + move32(); + move32(); + move32(); + move32(); + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + hDiracDecBin->ChEne_fx[ch][bin] = Mpy_32_32( hDiracDecBin->ChEne_fx[ch][bin], qualityBasedSmFactor_fx ); + move32(); + } + + hDiracDecBin->ChCrossRe_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossRe_fx[bin], hDiracDecBin->ChCrossRe_e[bin], Mpy_32_32( hDiracDecBin->ChCrossRePrev_fx[bin], IIReneLimiter_fx[bin] ), hDiracDecBin->ChCrossRePrev_e[bin], &hDiracDecBin->ChCrossRe_e[bin] ); + hDiracDecBin->ChCrossIm_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossIm_fx[bin], hDiracDecBin->ChCrossIm_e[bin], Mpy_32_32( hDiracDecBin->ChCrossImPrev_fx[bin], IIReneLimiter_fx[bin] ), hDiracDecBin->ChCrossImPrev_e[bin], &hDiracDecBin->ChCrossIm_e[bin] ); + move32(); + move32(); + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + hDiracDecBin->ChEne_fx[ch][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEne_fx[ch][bin], hDiracDecBin->ChEne_e[ch][bin], Mpy_32_32( hDiracDecBin->ChEnePrev_fx[ch][bin], IIReneLimiter_fx[bin] ), hDiracDecBin->ChEnePrev_e[ch][bin], &hDiracDecBin->ChEne_e[ch][bin] ); + move32(); + } + + /* Store energy values and coefficients for next round */ + hDiracDecBin->ChCrossRePrev_fx[bin] = hDiracDecBin->ChCrossRe_fx[bin]; + move32(); + hDiracDecBin->ChCrossImPrev_fx[bin] = hDiracDecBin->ChCrossIm_fx[bin]; + move32(); + hDiracDecBin->ChCrossRePrev_e[bin] = hDiracDecBin->ChCrossRe_e[bin]; + move16(); + hDiracDecBin->ChCrossImPrev_e[bin] = hDiracDecBin->ChCrossIm_e[bin]; + move16(); + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + hDiracDecBin->ChEnePrev_fx[ch][bin] = hDiracDecBin->ChEne_fx[ch][bin]; + move32(); + hDiracDecBin->ChEnePrev_e[ch][bin] = hDiracDecBin->ChEne_e[ch][bin]; + move16(); + } + } + + return; +} + + +static void ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( + DIRAC_DEC_BIN_HANDLE hDiracDecBin, + const SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, + const PARAMBIN_REND_CONFIG_HANDLE hConfig, + Word32 Rmat_fx[3][3], + const Word16 subframe, + const Word16 isHeadtracked, + const Word32 *subFrameTotalEne_fx, + Word16 *subFrameTotalEne_e, + const Word32 *IIReneLimiter_fx, + const MASA_ISM_DATA_HANDLE hMasaIsmData ) +{ + Word16 ch, bin; + Word16 separateCenterChannelRendering; + Word16 nBins, idx, shift; + Word32 frameMeanDiffusenessEneWeight_fx[CLDFB_NO_CHANNELS_MAX]; + Word32 qualityBasedSmFactor_fx; + Word16 dirac_read_idx; + PARAMBIN_HRTF_GAIN_CACHE gainCache[MAX_GAIN_CACHE_SIZE]; + IVAS_FORMAT ivas_format; + MC_MODE mc_mode; + Word16 gainCacheBaseIndex; + Word16 q_earlyPartEneCorrection; + Word16 exp, exp1; + Word32 temp; + + separateCenterChannelRendering = hConfig->separateCenterChannelRendering; + move16(); + ivas_format = hConfig->ivas_format; + move32(); + mc_mode = hConfig->mc_mode; + move32(); + qualityBasedSmFactor_fx = hConfig->qualityBasedSmFactor_fx; /*Q31*/ + move32(); + qualityBasedSmFactor_fx = Mpy_32_32( qualityBasedSmFactor_fx, qualityBasedSmFactor_fx ); /*Q31*/ + + nBins = hSpatParamRendCom->num_freq_bands; /* Actually bins */ + move16(); + + q_earlyPartEneCorrection = s_min( Q31, add( getScaleFactor32( hDiracDecBin->earlyPartEneCorrection_fx, nBins ), hDiracDecBin->q_earlyPartEneCorrection ) ); + scale_sig32( hDiracDecBin->earlyPartEneCorrection_fx, nBins, sub( q_earlyPartEneCorrection, hDiracDecBin->q_earlyPartEneCorrection ) ); + hDiracDecBin->q_earlyPartEneCorrection = q_earlyPartEneCorrection; + move16(); + + set32_fx( hDiracDecBin->ChCrossReOut_fx, 0, nBins ); + set32_fx( hDiracDecBin->ChCrossImOut_fx, 0, nBins ); + set16_fx( hDiracDecBin->ChCrossReOut_e, 0, nBins ); + set16_fx( hDiracDecBin->ChCrossImOut_e, 0, nBins ); + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + set32_fx( hDiracDecBin->ChEneOut_fx[ch], 0, nBins ); + set16_fx( hDiracDecBin->ChEneOut_e[ch], 0, nBins ); + } + set32_fx( hDiracDecBin->frameMeanDiffuseness_fx, 0, nBins ); + + set32_fx( frameMeanDiffusenessEneWeight_fx, 0, CLDFB_NO_CHANNELS_MAX ); + + FOR( idx = 0; idx < MAX_GAIN_CACHE_SIZE; idx++ ) + { + gainCache[idx].azi = -1000; /* Use -1000 as value for uninitialized cache. */ + move16(); + } + + dirac_read_idx = hSpatParamRendCom->render_to_md_map[subframe]; + /* Determine target covariance matrix containing target binaural properties */ FOR( bin = 0; bin < nBins; bin++ ) { @@ -1372,18 +1673,18 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric UWord16 ismDirIndex; ismDirIndex = sub( dirIndex, hSpatParamRendCom->numParametricDirections ); assert( hMasaIsmData != NULL && "hMasaIsmData should not be NULL if we use it" ); - IF( hMasaIsmData->ism_is_edited[ismDirIndex] ) + IF( hMasaIsmData->ism_dir_is_edited[ismDirIndex] ) { - aziDeg = hMasaIsmData->azimuth_ism_edited[ismDirIndex]; + aziDeg = hMasaIsmData->azimuth_ism_edited_fx[ismDirIndex]; move16(); - eleDeg = hMasaIsmData->elevation_ism_edited[ismDirIndex]; + eleDeg = hMasaIsmData->elevation_ism_edited_fx[ismDirIndex]; move16(); } ELSE { - aziDeg = hMasaIsmData->azimuth_ism[ismDirIndex][dirac_read_idx]; + aziDeg = hMasaIsmData->azimuth_ism_fx[ismDirIndex][dirac_read_idx]; move16(); - eleDeg = hMasaIsmData->elevation_ism[ismDirIndex][dirac_read_idx]; + eleDeg = hMasaIsmData->elevation_ism_fx[ismDirIndex][dirac_read_idx]; move16(); } ratio_fx = hMasaIsmData->energy_ratio_ism_fx[ismDirIndex][dirac_read_idx][bin]; @@ -1438,7 +1739,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric spreadCoh_fx = s_max( spreadCoh_fx, altSpreadCoh_fx ); } - getDirectPartGains_fx( bin, aziDeg, eleDeg, &lRealp_fx, &lImagp_fx, &rRealp_fx, &rImagp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex], isHeadtracked ); + getDirectPartGains_fx( bin, aziDeg, eleDeg, &lRealp_fx, &lImagp_fx, &rRealp_fx, &rImagp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex], isHeadtracked, *hDiracDecBin->phHrtfParambin ); Word16 q_lr = Q28; move16(); @@ -1489,7 +1790,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric rImagp_fx = Mpy_32_32( rImagp_fx, centerMul_fx ); // Q25 /* Apply the gain for the left source of the three coherent sources */ - getDirectPartGains_fx( bin, add( aziDeg, 30 ), eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 1], isHeadtracked ); + getDirectPartGains_fx( bin, add( aziDeg, 30 ), eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 1], isHeadtracked, *hDiracDecBin->phHrtfParambin ); hrtfEneSides_fx = L_add( Mpy_32_32( lRealpTmp_fx, lRealpTmp_fx ), // Q25 L_add( Mpy_32_32( lImagpTmp_fx, lImagpTmp_fx ), // Q25 @@ -1503,7 +1804,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Apply the gain for the right source of the three coherent sources. * -30 degrees to 330 wrapping due to internal functions. */ - getDirectPartGains_fx( bin, aziDeg + 330, eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 2], isHeadtracked ); + getDirectPartGains_fx( bin, aziDeg + 330, eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 2], isHeadtracked, *hDiracDecBin->phHrtfParambin ); hrtfEneSides_fx = L_add( hrtfEneSides_fx, L_add( Mpy_32_32( lRealpTmp_fx, lRealpTmp_fx ), // Q25 @@ -1673,97 +1974,38 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric move32(); /* Formulate average diffuseness over frame */ - frameMeanDiffuseness = BASOP_Util_Divide3232_Scale_cadence( frameMeanDiffuseness, L_max( EPSILLON_FX, frameMeanDiffusenessEneWeight_fx[bin] ), &exp ); // exp = exp + 31 - q_meanEnePerCh - exp1 + frameMeanDiffuseness = BASOP_Util_Divide3232_Scale_newton( frameMeanDiffuseness, L_max( EPSILLON_FX, frameMeanDiffusenessEneWeight_fx[bin] ), &exp ); // exp = exp + 31 - q_meanEnePerCh - exp1 exp = sub( exp, sub( sub( 31, q_meanEnePerCh ), exp1 ) ); hDiracDecBin->frameMeanDiffuseness_fx[bin] = L_shl( frameMeanDiffuseness, sub( exp, 2 ) ); // Q29 move32(); } - test(); - /* Temporal IIR-type smoothing of covariance matrices. Also apply encoding quality based smoothing factor. */ - IF( EQ_32( ivas_format, MASA_FORMAT ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) + FOR( bin = 0; bin < nBins; bin++ ) { - IIReneLimiterFactor_fx = L_add( L_shl( 16, Q26 ), L_sub( L_shl( 1, Q26 ), L_shr( qualityBasedSmFactor_fx, 5 ) ) ); // Q26 - } - ELSE - { - IIReneLimiterFactor_fx = L_add( L_shl( 8, Q26 ), L_sub( L_shl( 1, Q26 ), L_shr( qualityBasedSmFactor_fx, 5 ) ) ); // Q26 - } - - FOR( bin = 0; bin < nBins; bin++ ) - { - Word32 IIReneLimiter_fx; - - /* Temporally smooth cov mtx estimates for resulting mixing matrix stability. The design principle is that - * the energy history (IIR) must not be more than double of the current frame energy. This provides more - * robust performance at energy offsets when compared to typical IIR averaging. */ - Word16 num_e, den_e; - Word32 num, den; - num = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEne_fx[0][bin], hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_fx[1][bin], hDiracDecBin->ChEne_e[1][bin], &num_e ); - num = Mpy_32_32( num, IIReneLimiterFactor_fx ); /*Q = (31 - num_e + 26 - 31) = (26 - num_e)*/ - den_e = 0; - move16(); - den = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEnePrev_fx[0][bin], hDiracDecBin->ChEnePrev_e[0][bin], hDiracDecBin->ChEnePrev_fx[1][bin], hDiracDecBin->ChEnePrev_e[1][bin], &den_e ); - den = L_max( 1, den ); - IIReneLimiter_fx = BASOP_Util_Divide3232_Scale_cadence( num, den, &exp ); - exp = add( sub( num_e, den_e ), add( 5, exp ) ); - IF( L_shr_sat( IIReneLimiter_fx, sub( 31, exp ) ) > 0 ) - { - IIReneLimiter_fx = ONE_IN_Q31; /*Q31*/ - move32(); - } - ELSE - { - IIReneLimiter_fx = L_shl( IIReneLimiter_fx, exp ); /*Q31*/ - } - - hDiracDecBin->ChCrossRe_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossRe_fx[bin], qualityBasedSmFactor_fx ); - hDiracDecBin->ChCrossIm_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossIm_fx[bin], qualityBasedSmFactor_fx ); hDiracDecBin->ChCrossReOut_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossReOut_fx[bin], qualityBasedSmFactor_fx ); hDiracDecBin->ChCrossImOut_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossImOut_fx[bin], qualityBasedSmFactor_fx ); - move32(); - move32(); - move32(); - move32(); FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - hDiracDecBin->ChEne_fx[ch][bin] = Mpy_32_32( hDiracDecBin->ChEne_fx[ch][bin], qualityBasedSmFactor_fx ); hDiracDecBin->ChEneOut_fx[ch][bin] = Mpy_32_32( hDiracDecBin->ChEneOut_fx[ch][bin], qualityBasedSmFactor_fx ); move32(); - move32(); } - - hDiracDecBin->ChCrossRe_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossRe_fx[bin], hDiracDecBin->ChCrossRe_e[bin], Mpy_32_32( hDiracDecBin->ChCrossRePrev_fx[bin], IIReneLimiter_fx ), hDiracDecBin->ChCrossRePrev_e[bin], &hDiracDecBin->ChCrossRe_e[bin] ); - hDiracDecBin->ChCrossIm_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossIm_fx[bin], hDiracDecBin->ChCrossIm_e[bin], Mpy_32_32( hDiracDecBin->ChCrossImPrev_fx[bin], IIReneLimiter_fx ), hDiracDecBin->ChCrossImPrev_e[bin], &hDiracDecBin->ChCrossIm_e[bin] ); - hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_32( hDiracDecBin->ChCrossReOutPrev_fx[bin], IIReneLimiter_fx ), hDiracDecBin->ChCrossReOutPrev_e[bin], &hDiracDecBin->ChCrossReOut_e[bin] ); - hDiracDecBin->ChCrossImOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossImOut_fx[bin], hDiracDecBin->ChCrossImOut_e[bin], Mpy_32_32( hDiracDecBin->ChCrossImOutPrev_fx[bin], IIReneLimiter_fx ), hDiracDecBin->ChCrossImOutPrev_e[bin], &hDiracDecBin->ChCrossImOut_e[bin] ); - move32(); - move32(); + hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_32( hDiracDecBin->ChCrossReOutPrev_fx[bin], IIReneLimiter_fx[bin] ), hDiracDecBin->ChCrossReOutPrev_e[bin], &hDiracDecBin->ChCrossReOut_e[bin] ); + hDiracDecBin->ChCrossImOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossImOut_fx[bin], hDiracDecBin->ChCrossImOut_e[bin], Mpy_32_32( hDiracDecBin->ChCrossImOutPrev_fx[bin], IIReneLimiter_fx[bin] ), hDiracDecBin->ChCrossImOutPrev_e[bin], &hDiracDecBin->ChCrossImOut_e[bin] ); move32(); move32(); FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - hDiracDecBin->ChEne_fx[ch][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEne_fx[ch][bin], hDiracDecBin->ChEne_e[ch][bin], Mpy_32_32( hDiracDecBin->ChEnePrev_fx[ch][bin], IIReneLimiter_fx ), hDiracDecBin->ChEnePrev_e[ch][bin], &hDiracDecBin->ChEne_e[ch][bin] ); - hDiracDecBin->ChEneOut_fx[ch][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[ch][bin], hDiracDecBin->ChEneOut_e[ch][bin], Mpy_32_32( hDiracDecBin->ChEneOutPrev_fx[ch][bin], IIReneLimiter_fx ), hDiracDecBin->ChEneOutPrev_e[ch][bin], &hDiracDecBin->ChEneOut_e[ch][bin] ); - move32(); + hDiracDecBin->ChEneOut_fx[ch][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[ch][bin], hDiracDecBin->ChEneOut_e[ch][bin], Mpy_32_32( hDiracDecBin->ChEneOutPrev_fx[ch][bin], IIReneLimiter_fx[bin] ), hDiracDecBin->ChEneOutPrev_e[ch][bin], &hDiracDecBin->ChEneOut_e[ch][bin] ); move32(); } - /* Store energy values and coefficients for next round */ - hDiracDecBin->ChCrossRePrev_fx[bin] = hDiracDecBin->ChCrossRe_fx[bin]; - move32(); - hDiracDecBin->ChCrossImPrev_fx[bin] = hDiracDecBin->ChCrossIm_fx[bin]; - move32(); + hDiracDecBin->ChCrossReOutPrev_fx[bin] = hDiracDecBin->ChCrossReOut_fx[bin]; move32(); hDiracDecBin->ChCrossImOutPrev_fx[bin] = hDiracDecBin->ChCrossImOut_fx[bin]; move32(); - hDiracDecBin->ChCrossRePrev_e[bin] = hDiracDecBin->ChCrossRe_e[bin]; - move16(); - hDiracDecBin->ChCrossImPrev_e[bin] = hDiracDecBin->ChCrossIm_e[bin]; - move16(); hDiracDecBin->ChCrossReOutPrev_e[bin] = hDiracDecBin->ChCrossReOut_e[bin]; move16(); hDiracDecBin->ChCrossImOutPrev_e[bin] = hDiracDecBin->ChCrossImOut_e[bin]; @@ -1773,10 +2015,10 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric { hDiracDecBin->ChEnePrev_fx[ch][bin] = hDiracDecBin->ChEne_fx[ch][bin]; move32(); - hDiracDecBin->ChEneOutPrev_fx[ch][bin] = hDiracDecBin->ChEneOut_fx[ch][bin]; - move32(); hDiracDecBin->ChEnePrev_e[ch][bin] = hDiracDecBin->ChEne_e[ch][bin]; move16(); + hDiracDecBin->ChEneOutPrev_fx[ch][bin] = hDiracDecBin->ChEneOut_fx[ch][bin]; + move32(); hDiracDecBin->ChEneOutPrev_e[ch][bin] = hDiracDecBin->ChEneOut_e[ch][bin]; move16(); } @@ -1785,6 +2027,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric return; } + static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, @@ -1866,65 +2109,74 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( q_CrEne = Q31; move16(); - IF( GT_16( hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_e[1][bin] ) ) + Word16 q_diff = sub( hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_e[1][bin] ); + + IF( q_diff > 0 ) { - hDiracDecBin->ChEne_fx[1][bin] = L_shr( hDiracDecBin->ChEne_fx[1][bin], sub( hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_e[1][bin] ) ); + hDiracDecBin->ChEne_fx[1][bin] = L_shr( hDiracDecBin->ChEne_fx[1][bin], q_diff ); hDiracDecBin->q_ChEne = sub( 31, hDiracDecBin->ChEne_e[0][bin] ); hDiracDecBin->ChEne_e[1][bin] = hDiracDecBin->ChEne_e[0][bin]; } ELSE { - hDiracDecBin->ChEne_fx[0][bin] = L_shr( hDiracDecBin->ChEne_fx[0][bin], sub( hDiracDecBin->ChEne_e[1][bin], hDiracDecBin->ChEne_e[0][bin] ) ); + hDiracDecBin->ChEne_fx[0][bin] = L_shl( hDiracDecBin->ChEne_fx[0][bin], q_diff ); hDiracDecBin->q_ChEne = sub( 31, hDiracDecBin->ChEne_e[1][bin] ); hDiracDecBin->ChEne_e[0][bin] = hDiracDecBin->ChEne_e[1][bin]; } move32(); move16(); + move16(); - IF( GT_16( hDiracDecBin->ChEneOut_e[0][bin], hDiracDecBin->ChEneOut_e[1][bin] ) ) + q_diff = sub( hDiracDecBin->ChEneOut_e[0][bin], hDiracDecBin->ChEneOut_e[1][bin] ); + IF( q_diff > 0 ) { - hDiracDecBin->ChEneOut_fx[1][bin] = L_shr( hDiracDecBin->ChEneOut_fx[1][bin], sub( hDiracDecBin->ChEneOut_e[0][bin], hDiracDecBin->ChEneOut_e[1][bin] ) ); + hDiracDecBin->ChEneOut_fx[1][bin] = L_shr( hDiracDecBin->ChEneOut_fx[1][bin], q_diff ); hDiracDecBin->q_ChEneOut = sub( 31, hDiracDecBin->ChEneOut_e[0][bin] ); hDiracDecBin->ChEneOut_e[1][bin] = hDiracDecBin->ChEneOut_e[0][bin]; } ELSE { - hDiracDecBin->ChEneOut_fx[0][bin] = L_shr( hDiracDecBin->ChEneOut_fx[0][bin], sub( hDiracDecBin->ChEneOut_e[1][bin], hDiracDecBin->ChEneOut_e[0][bin] ) ); + hDiracDecBin->ChEneOut_fx[0][bin] = L_shl( hDiracDecBin->ChEneOut_fx[0][bin], q_diff ); hDiracDecBin->q_ChEneOut = sub( 31, hDiracDecBin->ChEneOut_e[1][bin] ); hDiracDecBin->ChEneOut_e[0][bin] = hDiracDecBin->ChEneOut_e[1][bin]; } move32(); move16(); + move16(); - IF( GT_16( hDiracDecBin->ChCrossRe_e[bin], hDiracDecBin->ChCrossIm_e[bin] ) ) + q_diff = sub( hDiracDecBin->ChCrossRe_e[bin], hDiracDecBin->ChCrossIm_e[bin] ); + IF( q_diff > 0 ) { - hDiracDecBin->ChCrossIm_fx[bin] = L_shr( hDiracDecBin->ChCrossIm_fx[bin], sub( hDiracDecBin->ChCrossRe_e[bin], hDiracDecBin->ChCrossIm_e[bin] ) ); + hDiracDecBin->ChCrossIm_fx[bin] = L_shr( hDiracDecBin->ChCrossIm_fx[bin], q_diff ); hDiracDecBin->q_ChCross = sub( 31, hDiracDecBin->ChCrossRe_e[bin] ); hDiracDecBin->ChCrossIm_e[bin] = hDiracDecBin->ChCrossRe_e[bin]; } ELSE { - hDiracDecBin->ChCrossRe_fx[bin] = L_shr( hDiracDecBin->ChCrossRe_fx[bin], sub( hDiracDecBin->ChCrossIm_e[bin], hDiracDecBin->ChCrossRe_e[bin] ) ); + hDiracDecBin->ChCrossRe_fx[bin] = L_shl( hDiracDecBin->ChCrossRe_fx[bin], q_diff ); hDiracDecBin->q_ChCross = sub( 31, hDiracDecBin->ChCrossIm_e[bin] ); hDiracDecBin->ChCrossRe_e[bin] = hDiracDecBin->ChCrossIm_e[bin]; } move32(); move16(); + move16(); - IF( GT_16( hDiracDecBin->ChCrossReOut_e[bin], hDiracDecBin->ChCrossImOut_e[bin] ) ) + q_diff = sub( hDiracDecBin->ChCrossReOut_e[bin], hDiracDecBin->ChCrossImOut_e[bin] ); + IF( q_diff > 0 ) { - hDiracDecBin->ChCrossImOut_fx[bin] = L_shr( hDiracDecBin->ChCrossImOut_fx[bin], sub( hDiracDecBin->ChCrossReOut_e[bin], hDiracDecBin->ChCrossImOut_e[bin] ) ); + hDiracDecBin->ChCrossImOut_fx[bin] = L_shr( hDiracDecBin->ChCrossImOut_fx[bin], q_diff ); hDiracDecBin->q_ChCrossOut = sub( 31, hDiracDecBin->ChCrossReOut_e[bin] ); hDiracDecBin->ChCrossImOut_e[bin] = hDiracDecBin->ChCrossReOut_e[bin]; } ELSE { - hDiracDecBin->ChCrossReOut_fx[bin] = L_shr( hDiracDecBin->ChCrossReOut_fx[bin], sub( hDiracDecBin->ChCrossImOut_e[bin], hDiracDecBin->ChCrossReOut_e[bin] ) ); + hDiracDecBin->ChCrossReOut_fx[bin] = L_shl( hDiracDecBin->ChCrossReOut_fx[bin], q_diff ); hDiracDecBin->q_ChCrossOut = sub( 31, hDiracDecBin->ChCrossImOut_e[bin] ); hDiracDecBin->ChCrossReOut_e[bin] = hDiracDecBin->ChCrossImOut_e[bin]; } move32(); move16(); + move16(); formulate2x2MixingMatrix_fx( hDiracDecBin->ChEne_fx[0][bin], hDiracDecBin->ChEne_fx[1][bin], hDiracDecBin->q_ChEne, @@ -1983,10 +2235,8 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( matrixMul_fx( Mre_fx, Mim_fx, &q_M, CxRe_fx, CxIm_fx, &q_Cx, tmpMtxRe_fx, tmpMtxIm_fx, &q_tmp ); matrixTransp2Mul_fx( tmpMtxRe_fx, tmpMtxIm_fx, &q_tmp, Mre_fx, Mim_fx, &q_M, -#ifdef FIX_1072_SPEEDUP_matrixTransp2Mul_fx 1 /*int Ascale*/, 0 /*int Bscale*/, -#endif resultMtxRe_fx, resultMtxIm_fx, &q_res ); /* When below the frequency limit where decorrelation is applied, we inject the decorrelated @@ -2113,6 +2363,21 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( exp = sub( get_min_scalefactor( resultMtxRe_fx[0][0], resultMtxRe_fx[1][1] ), 2 ); tmp2 = L_add( L_shl( resultMtxRe_fx[0][0], exp ), L_shl( resultMtxRe_fx[1][1], exp ) ); q_tmp2 = add( q_res, exp ); + + /*Limiting value to Q63*/ + IF( GT_16( q_tmp2, 63 ) ) + { + tmp2 = L_shl( tmp2, sub( 63, q_tmp2 ) ); + q_tmp2 = 63; + move16(); + IF( EQ_32( tmp2, -1 ) ) + { + tmp2 = 0; + move32(); + q_tmp2 = 31; + move16(); + } + } IF( LT_16( q_CrEne, q_tmp2 ) ) { realizedOutputEne_fx = L_add( tmp1, L_shr( tmp2, sub( q_tmp2, q_CrEne ) ) ); @@ -2152,13 +2417,11 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( tmp1 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), missingOutputEne_fx, sub( 31, q_missingOutputEne ), &exp1 ); { - Word16 exp_temp; - tmp2 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), EPSILON_MANT, EPSILON_EXP, &exp_temp ); - tmp2 = BASOP_Util_Divide3232_Scale_cadence( tmp1, tmp2, &exp ); - exp2 = add( exp, sub( exp1, exp_temp ) ); + tmp2 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), EPSILON_MANT, EPSILON_EXP, &exp2 ); + tmp2 = ISqrt32( tmp2, &exp2 ); + gain_fx = Mpy_32_32( tmp2, Sqrt32( tmp1, &exp1 ) ); + q_gain = sub( 31, add( exp2, exp1 ) ); } - gain_fx = Sqrt32( tmp2, &exp2 ); - q_gain = sub( 31, exp2 ); // 1073741824 = 4 in Q28 IF( LT_16( q_gain, Q28 ) ) @@ -2252,7 +2515,8 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( q_tmp_sq = sub( 31, exp ); IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { - gainFactor_fx = Mpy_32_32( 1705746262, tmp1 ); // 1705746262 = 0.7943f in Q31 + Word32 gainfactor_fx = L_shl( (Word32) OMASA_TDREND_MATCHING_GAIN_FX, Q16 ); // constant in Q31 as Word32 + gainFactor_fx = Mpy_32_32( gainfactor_fx, tmp1 ); // 1705746262 = 0.7943f in Q31 } ELSE { @@ -2269,17 +2533,38 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( { IF( EQ_16( ism_mode, ISM_MASA_MODE_DISC ) ) { - aziDeg = hMasaIsmData->azimuth_ism[chB][dirac_read_idx]; - move16(); - eleDeg = hMasaIsmData->elevation_ism[chB][dirac_read_idx]; - move16(); + IF( hMasaIsmData->ism_dir_is_edited[chB] ) + { + aziDeg = hMasaIsmData->azimuth_ism_edited_fx[chB]; + move16(); + eleDeg = hMasaIsmData->elevation_ism_edited_fx[chB]; + move16(); + } + ELSE + { + aziDeg = hMasaIsmData->azimuth_ism_fx[chB][dirac_read_idx]; + move16(); + eleDeg = hMasaIsmData->elevation_ism_fx[chB][dirac_read_idx]; + move16(); + } } ELSE { - aziDeg = hMasaIsmData->azimuth_separated_ism[dirac_read_idx]; - move16(); - eleDeg = hMasaIsmData->elevation_separated_ism[dirac_read_idx]; - move16(); + test(); + IF( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ && hMasaIsmData->ism_dir_is_edited[hMasaIsmData->idx_separated_ism] ) + { + aziDeg = hMasaIsmData->azimuth_ism_edited_fx[hMasaIsmData->idx_separated_ism]; + move16(); + eleDeg = hMasaIsmData->elevation_ism_edited_fx[hMasaIsmData->idx_separated_ism]; + move16(); + } + ELSE + { + aziDeg = hMasaIsmData->azimuth_separated_ism_fx[dirac_read_idx]; + move16(); + eleDeg = hMasaIsmData->elevation_separated_ism_fx[dirac_read_idx]; + move16(); + } instantChange = 1; move16(); } @@ -2287,23 +2572,23 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { - hDiracDecBin->processMtxRePrev_fx[chA][add( chB, 2 )][bin] = hDiracDecBin->processMtxRe_fx[chA][add( chB, 2 )][bin]; + hDiracDecBin->processMtxRePrev_fx[chA][chB + 2][bin] = hDiracDecBin->processMtxRe_fx[chA][chB + 2][bin]; move16(); - hDiracDecBin->processMtxImPrev_fx[chA][add( chB, 2 )][bin] = hDiracDecBin->processMtxIm_fx[chA][add( chB, 2 )][bin]; + hDiracDecBin->processMtxImPrev_fx[chA][chB + 2][bin] = hDiracDecBin->processMtxIm_fx[chA][chB + 2][bin]; move16(); } q_processMtxPrev_SCCR[bin] = q_processMtx_bin; move16(); - getDirectPartGains_fx( bin, aziDeg, eleDeg, &lRealp_fx, &lImagp_fx, &rRealp_fx, &rImagp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[chB], isHeadtracked ); + getDirectPartGains_fx( bin, aziDeg, eleDeg, &lRealp_fx, &lImagp_fx, &rRealp_fx, &rImagp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[chB], isHeadtracked, *hDiracDecBin->phHrtfParambin ); - hDiracDecBin->processMtxRe_fx[0][add( chB, 2 )][bin] = extract_h( Mpy_32_32( lRealp_fx, gainFactor_fx ) ); + hDiracDecBin->processMtxRe_fx[0][chB + 2][bin] = extract_h( Mpy_32_32( lRealp_fx, gainFactor_fx ) ); move16(); - hDiracDecBin->processMtxIm_fx[0][add( chB, 2 )][bin] = extract_h( Mpy_32_32( lImagp_fx, gainFactor_fx ) ); + hDiracDecBin->processMtxIm_fx[0][chB + 2][bin] = extract_h( Mpy_32_32( lImagp_fx, gainFactor_fx ) ); move16(); - hDiracDecBin->processMtxRe_fx[1][add( chB, 2 )][bin] = extract_h( Mpy_32_32( rRealp_fx, gainFactor_fx ) ); + hDiracDecBin->processMtxRe_fx[1][chB + 2][bin] = extract_h( Mpy_32_32( rRealp_fx, gainFactor_fx ) ); move16(); - hDiracDecBin->processMtxIm_fx[1][add( chB, 2 )][bin] = extract_h( Mpy_32_32( rImagp_fx, gainFactor_fx ) ); + hDiracDecBin->processMtxIm_fx[1][chB + 2][bin] = extract_h( Mpy_32_32( rImagp_fx, gainFactor_fx ) ); move16(); q_processMtx_SCCR[bin] = sub( sub( add( Q28, q_gain ), 31 ), 16 ); move16(); @@ -2312,9 +2597,9 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( { FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { - hDiracDecBin->processMtxRePrev_fx[chA][add( chB, 2 )][bin] = hDiracDecBin->processMtxRe_fx[chA][add( chB, 2 )][bin]; + hDiracDecBin->processMtxRePrev_fx[chA][chB + 2][bin] = hDiracDecBin->processMtxRe_fx[chA][chB + 2][bin]; move16(); - hDiracDecBin->processMtxImPrev_fx[chA][add( chB, 2 )][bin] = hDiracDecBin->processMtxIm_fx[chA][add( chB, 2 )][bin]; + hDiracDecBin->processMtxImPrev_fx[chA][chB + 2][bin] = hDiracDecBin->processMtxIm_fx[chA][chB + 2][bin]; move16(); } q_processMtxPrev_SCCR[bin] = q_processMtx_SCCR[bin]; @@ -2369,13 +2654,13 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( { FOR( chB = 0; chB < nchanSeparateChannels; chB++ ) { - hDiracDecBin->processMtxRe_fx[chA][add( chB, 2 )][bin] = shr( hDiracDecBin->processMtxRe_fx[chA][add( chB, 2 )][bin], sub( q_processMtx_SCCR[bin], hDiracDecBin->q_processMtx ) ); // hDiracDecBin->q_processMtx + hDiracDecBin->processMtxRe_fx[chA][chB + 2][bin] = shr( hDiracDecBin->processMtxRe_fx[chA][chB + 2][bin], sub( q_processMtx_SCCR[bin], hDiracDecBin->q_processMtx ) ); // hDiracDecBin->q_processMtx move16(); - hDiracDecBin->processMtxIm_fx[chA][add( chB, 2 )][bin] = shr( hDiracDecBin->processMtxIm_fx[chA][add( chB, 2 )][bin], sub( q_processMtx_SCCR[bin], hDiracDecBin->q_processMtx ) ); // hDiracDecBin->q_processMtx + hDiracDecBin->processMtxIm_fx[chA][chB + 2][bin] = shr( hDiracDecBin->processMtxIm_fx[chA][chB + 2][bin], sub( q_processMtx_SCCR[bin], hDiracDecBin->q_processMtx ) ); // hDiracDecBin->q_processMtx move16(); - hDiracDecBin->processMtxRePrev_fx[chA][add( chB, 2 )][bin] = shr( hDiracDecBin->processMtxRePrev_fx[chA][add( chB, 2 )][bin], sub( q_processMtxPrev_SCCR[bin], hDiracDecBin->q_processMtxPrev ) ); // hDiracDecBin->q_processMtxPrev + hDiracDecBin->processMtxRePrev_fx[chA][chB + 2][bin] = shr( hDiracDecBin->processMtxRePrev_fx[chA][chB + 2][bin], sub( q_processMtxPrev_SCCR[bin], hDiracDecBin->q_processMtxPrev ) ); // hDiracDecBin->q_processMtxPrev move16(); - hDiracDecBin->processMtxImPrev_fx[chA][add( chB, 2 )][bin] = shr( hDiracDecBin->processMtxImPrev_fx[chA][add( chB, 2 )][bin], sub( q_processMtxPrev_SCCR[bin], hDiracDecBin->q_processMtxPrev ) ); // hDiracDecBin->q_processMtxPrev + hDiracDecBin->processMtxImPrev_fx[chA][chB + 2][bin] = shr( hDiracDecBin->processMtxImPrev_fx[chA][chB + 2][bin], sub( q_processMtxPrev_SCCR[bin], hDiracDecBin->q_processMtxPrev ) ); // hDiracDecBin->q_processMtxPrev move16(); } } @@ -2398,7 +2683,15 @@ static void ivas_dirac_dec_binaural_process_output_fx( const Word16 numInChannels, const Word16 processReverb, const Word16 subframe, - const Word16 q_mat ) + const Word16 q_mat, + Word32 outRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + Word32 outIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + Word32 reverbRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + Word32 reverbIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + Word32 decorrRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + Word32 decorrIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + Word16 *Q_inp_mix, + const Word8 recompute ) { Word16 slot, bin, chA, chB; Word16 nBins; @@ -2411,80 +2704,138 @@ static void ivas_dirac_dec_binaural_process_output_fx( move16(); move16(); move16(); - - Word32 decSlotRe_fx[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX], decSlotIm_fx[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + Word32 decSlotRe_fx[CLDFB_SLOTS_PER_SUBFRAME][BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX], decSlotIm_fx[CLDFB_SLOTS_PER_SUBFRAME][BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 outSlotRe_fx[CLDFB_NO_CHANNELS_MAX], outSlotIm_fx[CLDFB_NO_CHANNELS_MAX]; - Word32 reverbRe_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - Word32 reverbIm_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; Word16 q_inp[6][CLDFB_SLOTS_PER_SUBFRAME]; Word16 interpVal_fx; Word32 *decSlotRePointer_fx; Word32 *decSlotImPointer_fx; Word16 q_inp_mix, q_reverb = 31; move16(); - + Word16 ch_len = s_max( 4, numInChannels ); + Word16 eff_q; + Word16 q_decSlot[CLDFB_SLOTS_PER_SUBFRAME]; + Word16 q_decSlotMin = 31; + move16(); IF( processReverb ) { - /* Process second / room effect part of binaural output when needed */ - ivas_binaural_reverb_processSubframe_fx( hDiracDecBin->hReverb, numInChannels, nSlots, inRe_fx, inIm_fx, reverbRe_fx, reverbIm_fx ); + if ( recompute == 1 ) + { + /* Process second / room effect part of binaural output when needed */ + ivas_binaural_reverb_processSubframe_fx( hDiracDecBin->hReverb, numInChannels, nSlots, inRe_fx, inIm_fx, reverbRe_fx, reverbIm_fx ); + } } - // scaling input and reverb to same q// - // input scaling is to maintain precision in ivas_dirac_dec_decorrelate_slot fn// - Word16 shift = s_min( L_norm_arr( cldfbSynDec[0]->cldfb_state_fx, cldfbSynDec[0]->p_filter_length ), L_norm_arr( cldfbSynDec[1]->cldfb_state_fx, cldfbSynDec[1]->p_filter_length ) ); - q_inp_mix = 31; - move16(); - FOR( Word16 i = 0; i < 6; i++ ) + IF( EQ_16( recompute, 1 ) ) { - FOR( Word16 j = 0; j < nSlots; j++ ) + // scaling input and reverb to same q// + // input scaling is to maintain precision in ivas_dirac_dec_decorrelate_slot fn// + Word16 shift = s_min( L_norm_arr( cldfbSynDec[0]->cldfb_state_fx, cldfbSynDec[0]->p_filter_length ), L_norm_arr( cldfbSynDec[1]->cldfb_state_fx, cldfbSynDec[1]->p_filter_length ) ); + q_inp_mix = 31; + move16(); + + FOR( Word16 i = 0; i < ch_len; i++ ) + { - q_inp[i][j] = s_min( L_norm_arr( inRe_fx[i][j], nBins ), L_norm_arr( inIm_fx[i][j], nBins ) ); - move16(); - test(); - IF( ( processReverb ) && LT_16( i, 2 ) ) + FOR( Word16 j = 0; j < nSlots; j++ ) { - q_reverb = s_min( L_norm_arr( reverbRe_fx[i][j], CLDFB_NO_CHANNELS_MAX ), L_norm_arr( reverbIm_fx[i][j], CLDFB_NO_CHANNELS_MAX ) ); - q_inp[i][j] = s_min( q_reverb, q_inp[i][j] ); + q_inp[i][j] = s_min( L_norm_arr( inRe_fx[i][j], nBins ), L_norm_arr( inIm_fx[i][j], nBins ) ); move16(); + test(); + IF( ( processReverb && EQ_16( recompute, 1 ) ) && LT_16( i, 2 ) ) + { + q_reverb = s_min( L_norm_arr( reverbRe_fx[i][j], CLDFB_NO_CHANNELS_MAX ), L_norm_arr( reverbIm_fx[i][j], CLDFB_NO_CHANNELS_MAX ) ); + q_inp[i][j] = s_min( q_reverb, q_inp[i][j] ); + move16(); + } + q_inp_mix = s_min( q_inp[i][j], q_inp_mix ); } - q_inp_mix = s_min( q_inp[i][j], q_inp_mix ); } - } - q_inp_mix = sub( q_inp_mix, 3 ); // gaurded bits// + q_inp_mix = sub( q_inp_mix, 3 ); // gaurded bits// - Word16 cldfb_state_shift = sub( add( add( q_inp_mix, q_mat ), sub( q_input, 16 ) ), cldfbSynDec[0]->Q_cldfb_state ); - IF( GT_16( cldfb_state_shift, shift ) ) - { - q_inp_mix = sub( add( q_inp_mix, shift ), cldfb_state_shift ); - cldfb_state_shift = shift; - move16(); - } + Word16 cldfb_state_shift = sub( add( add( q_inp_mix, q_mat ), sub( q_input, 16 ) ), cldfbSynDec[0]->Q_cldfb_state ); + IF( GT_16( cldfb_state_shift, shift ) ) + { + q_inp_mix = sub( add( q_inp_mix, shift ), cldfb_state_shift ); + cldfb_state_shift = shift; + move16(); + } - FOR( Word16 i = 0; i < 6; i++ ) - { - FOR( Word16 j = 0; j < nSlots; j++ ) + IF( !hDiracDecBin->useTdDecorr && ( max_band_decorr > 0 ) ) { + FOR( slot = 0; slot < nSlots; slot++ ) + { + ivas_dirac_dec_decorrelate_slot_fx( hDiracDecBin, nBins, slot, inRe_fx, inIm_fx, q_input, decSlotRe_fx[slot], decSlotIm_fx[slot], &q_decSlot[slot] ); - scale_sig32( inRe_fx[i][j], nBins, q_inp_mix ); /*q_input + q_inp_mix*/ - scale_sig32( inIm_fx[i][j], nBins, q_inp_mix ); /*q_input + q_inp_mix*/ - test(); - IF( processReverb && LT_16( i, 2 ) ) + Word16 scf = s_min( getScaleFactor32( decSlotRe_fx[slot][0], nBins ), getScaleFactor32( decSlotRe_fx[slot][1], nBins ) ); + scf = s_min( scf, getScaleFactor32( decSlotIm_fx[slot][0], nBins ) ); + scf = s_min( scf, getScaleFactor32( decSlotIm_fx[slot][1], nBins ) ); + + scale_sig32( decSlotRe_fx[slot][0], nBins, scf ); + scale_sig32( decSlotRe_fx[slot][1], nBins, scf ); + scale_sig32( decSlotIm_fx[slot][0], nBins, scf ); + scale_sig32( decSlotIm_fx[slot][1], nBins, scf ); + q_decSlot[slot] += scf; + + q_decSlotMin = s_min( q_decSlotMin, q_decSlot[slot] ); + } + + Word16 q_tmp = add( q_input, sub( add( q_inp_mix, q_mat ), hDiracDecBin->q_processMtxPrev ) ); + Word16 q_shift = sub( q_decSlotMin, q_tmp ); + + IF( GT_32( q_decSlotMin, q_tmp ) ) + { + q_decSlotMin = sub( q_decSlotMin, q_shift ); + } + ELSE + { + q_inp_mix = add( q_inp_mix, q_shift ); + cldfb_state_shift = add( cldfb_state_shift, q_shift ); + } + + FOR( Word16 ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - scale_sig32( reverbRe_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( add( q_inp_mix, q_mat ), 15 ) ); /*q_inp_mix+q_mat-15*/ - scale_sig32( reverbIm_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( add( q_inp_mix, q_mat ), 15 ) ); /*q_inp_mix+q_mat-15*/ + FOR( slot = 0; slot < nSlots; slot++ ) + { + scale_sig32( decSlotRe_fx[slot][ch], nBins, sub( q_decSlotMin, q_decSlot[slot] ) ); + scale_sig32( decSlotIm_fx[slot][ch], nBins, sub( q_decSlotMin, q_decSlot[slot] ) ); + } } } - } - // scaling cldfb states to q_result-1// - scale_sig32( cldfbSynDec[0]->cldfb_state_fx, cldfbSynDec[0]->p_filter_length, cldfb_state_shift ); - cldfbSynDec[0]->Q_cldfb_state = add( cldfbSynDec[0]->Q_cldfb_state, cldfb_state_shift ); - scale_sig32( cldfbSynDec[1]->cldfb_state_fx, cldfbSynDec[1]->p_filter_length, cldfb_state_shift ); - cldfbSynDec[1]->Q_cldfb_state = add( cldfbSynDec[1]->Q_cldfb_state, cldfb_state_shift ); - move16(); - move16(); + eff_q = sub( add( q_inp_mix, q_mat ), 15 ); + + FOR( Word16 i = 0; i < ch_len; i++ ) + { + FOR( Word16 j = 0; j < nSlots; j++ ) + { + scale_sig32( inRe_fx[i][j], nBins, q_inp_mix ); /*q_input + q_inp_mix*/ + scale_sig32( inIm_fx[i][j], nBins, q_inp_mix ); /*q_input + q_inp_mix*/ + test(); + IF( ( processReverb && EQ_16( recompute, 1 ) ) && LT_16( i, 2 ) ) + { + scale_sig32( reverbRe_fx[i][j], CLDFB_NO_CHANNELS_MAX, eff_q ); /*q_inp_mix+q_mat-15*/ + scale_sig32( reverbIm_fx[i][j], CLDFB_NO_CHANNELS_MAX, eff_q ); /*q_inp_mix+q_mat-15*/ + } + } + } + + // scaling cldfb states to q_result-1// + scale_sig32( cldfbSynDec[0]->cldfb_state_fx, cldfbSynDec[0]->p_filter_length, cldfb_state_shift ); + cldfbSynDec[0]->Q_cldfb_state = add( cldfbSynDec[0]->Q_cldfb_state, cldfb_state_shift ); + scale_sig32( cldfbSynDec[1]->cldfb_state_fx, cldfbSynDec[1]->p_filter_length, cldfb_state_shift ); + cldfbSynDec[1]->Q_cldfb_state = add( cldfbSynDec[1]->Q_cldfb_state, cldfb_state_shift ); + move16(); + move16(); + *Q_inp_mix = q_inp_mix; + move16(); + } + ELSE + { + q_inp_mix = *Q_inp_mix; + } q_inp_mix = add( q_inp_mix, q_input ); @@ -2510,7 +2861,22 @@ static void ivas_dirac_dec_binaural_process_output_fx( test(); IF( !hDiracDecBin->useTdDecorr && ( max_band_decorr > 0 ) ) { - ivas_dirac_dec_decorrelate_slot_fx( hDiracDecBin, nBins, slot, inRe_fx, inIm_fx, q_inp_mix, decSlotRe_fx, decSlotIm_fx ); + if ( recompute == 1 ) + { + FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + Copy32( decSlotRe_fx[slot][chA], decorrRe_fx[chA][slot], CLDFB_NO_CHANNELS_MAX ); + Copy32( decSlotIm_fx[slot][chA], decorrIm_fx[chA][slot], CLDFB_NO_CHANNELS_MAX ); + } + } + else + { + FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + Copy32( decorrRe_fx[chA][slot], decSlotRe_fx[slot][chA], CLDFB_NO_CHANNELS_MAX ); + Copy32( decorrIm_fx[chA][slot], decSlotIm_fx[slot][chA], CLDFB_NO_CHANNELS_MAX ); + } + } } FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) @@ -2536,8 +2902,8 @@ static void ivas_dirac_dec_binaural_process_output_fx( } ELSE { - decSlotRePointer_fx = decSlotRe_fx[chB]; - decSlotImPointer_fx = decSlotIm_fx[chB]; + decSlotRePointer_fx = decSlotRe_fx[slot][chB]; + decSlotImPointer_fx = decSlotIm_fx[slot][chB]; } } ELSE @@ -2546,7 +2912,6 @@ static void ivas_dirac_dec_binaural_process_output_fx( decSlotImPointer_fx = NULL; } - FOR( bin = 0; bin < nBins; bin++ ) { Word16 gain; @@ -2561,7 +2926,7 @@ static void ivas_dirac_dec_binaural_process_output_fx( move32(); move32(); -#ifdef IMPROV_PRECISION_EVSBE +#ifdef IMPROV_PRECISION gain = mac_r( L_mult( sub( 32767, interpVal_fx ), hDiracDecBin->processMtxImPrev_fx[chA][chB][bin] ), interpVal_fx, hDiracDecBin->processMtxIm_fx[chA][chB][bin] ); // Q11 #else gain = add( mult( sub( 32767, interpVal_fx ), hDiracDecBin->processMtxImPrev_fx[chA][chB][bin] ), mult( interpVal_fx, hDiracDecBin->processMtxIm_fx[chA][chB][bin] ) ); // Q11 @@ -2569,7 +2934,6 @@ static void ivas_dirac_dec_binaural_process_output_fx( // interpVal * hDiracDecBin->processMtxIm[chA][chB][bin]; outSlotRe_fx[bin] = Msub_32_16( outSlotRe_fx[bin], inIm_fx[chB][slot][bin], gain ); // q_inp_mix-4//q_result outSlotIm_fx[bin] = Madd_32_16( outSlotIm_fx[bin], inRe_fx[chB][slot][bin], gain ); // q_inp_mix-4//q_result - move32(); move32(); @@ -2577,19 +2941,21 @@ static void ivas_dirac_dec_binaural_process_output_fx( test(); IF( LT_16( bin, max_band_decorr ) && LT_16( chB, 2 ) ) { -#ifdef IMPROV_PRECISION_EVSBE +#ifdef IMPROV_PRECISION gain = mac_r( L_mult( sub( 32767, interpVal_fx ), hDiracDecBin->processMtxDecRePrev_fx[chA][chB][bin] ), interpVal_fx, hDiracDecBin->processMtxDecRe_fx[chA][chB][bin] ); // Q11 #else gain = add( mult( sub( 32767, interpVal_fx ), hDiracDecBin->processMtxDecRePrev_fx[chA][chB][bin] ), mult( interpVal_fx, hDiracDecBin->processMtxDecRe_fx[chA][chB][bin] ) ); // Q11 #endif // interpVal * hDiracDecBin->processMtxDecRe[chA][chB][bin]; + outSlotRe_fx[bin] = Madd_32_16( outSlotRe_fx[bin], decSlotRePointer_fx[bin], gain ); // q_inp_mix-4//q_result outSlotIm_fx[bin] = Madd_32_16( outSlotIm_fx[bin], decSlotImPointer_fx[bin], gain ); // q_inp_mix-4//q_result move32(); move32(); + gain = add( mult( sub( 32767, interpVal_fx ), hDiracDecBin->processMtxDecImPrev_fx[chA][chB][bin] ), mult( interpVal_fx, hDiracDecBin->processMtxDecIm_fx[chA][chB][bin] ) ); // Q11 -#ifdef IMPROV_PRECISION_EVSBE +#ifdef IMPROV_PRECISION gain = mac_r( L_mult( sub( 32767, interpVal_fx ), hDiracDecBin->processMtxDecImPrev_fx[chA][chB][bin] ), interpVal_fx, hDiracDecBin->processMtxDecIm_fx[chA][chB][bin] ); // Q11 #else gain = add( mult( sub( 32767, interpVal_fx ), hDiracDecBin->processMtxDecImPrev_fx[chA][chB][bin] ), mult( interpVal_fx, hDiracDecBin->processMtxDecIm_fx[chA][chB][bin] ) ); // Q11 @@ -2602,7 +2968,6 @@ static void ivas_dirac_dec_binaural_process_output_fx( } } - IF( processReverb ) { /* Combine second (reverb) part with the first (HRTF) part to obtain binaural output signal with room effect */ @@ -2610,21 +2975,33 @@ static void ivas_dirac_dec_binaural_process_output_fx( v_add_fx( outSlotIm_fx, reverbIm_fx[chA][slot], outSlotIm_fx, CLDFB_NO_CHANNELS_MAX ); } - outSlotRePr_fx = &( outSlotRe_fx[0] ); outSlotImPr_fx = &( outSlotIm_fx[0] ); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( &outSlotRePr_fx, &outSlotImPr_fx, &( output_fx[chA][nBins * slot + offsetSamples] ), nBins, 0, cldfbSynDec[chA] ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( &outSlotRePr_fx, &outSlotImPr_fx, &( output_fx[chA][nBins * slot + offsetSamples] ), nBins, cldfbSynDec[chA] ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynDec[chA]->Q_cldfb_state = sub( q_result, 1 ); - move16(); + IF( outRe_fx != NULL && outIm_fx != NULL ) + { + /* provide the data outside in CLDFB domain => mainly for split rendering */ + Copy32( outSlotRePr_fx, outRe_fx[chA][slot], CLDFB_NO_CHANNELS_MAX ); + Copy32( outSlotImPr_fx, outIm_fx[chA][slot], CLDFB_NO_CHANNELS_MAX ); + Scale_sig32( outRe_fx[chA][slot], CLDFB_NO_CHANNELS_MAX, sub( Q6, q_result ) ); // Q6 + Scale_sig32( outIm_fx[chA][slot], CLDFB_NO_CHANNELS_MAX, sub( Q6, q_result ) ); // Q6 + } + if ( recompute == 1 ) + { + /* Inverse filter bank */ + cldfbSynthesis_ivas_fx( &outSlotRePr_fx, &outSlotImPr_fx, &( output_fx[chA][nBins * slot + offsetSamples] ), nBins, 0, 0, cldfbSynDec[chA] ); + cldfbSynDec[chA]->Q_cldfb_state = sub( q_result, 1 ); + move16(); + } } } - *q_out = sub( q_result, 1 ); - move16(); + + if ( recompute == 1 ) + { + *q_out = sub( q_result, 1 ); + move16(); + } + return; } @@ -2641,17 +3018,15 @@ static void adaptTransportSignalsHeadtracked_fx( Word16 slot, ch, bin, louderCh; Word32 mono_factor_ILD, mono_factor; Word32 y_val, mono_factor_rotation, ene_proc, ene_target, ILD; + Word16 ene_proc_e, ene_target_e; Word16 max_band; Word32 eqVal; Word16 band_idx, bin_lo, bin_hi, norm, shift = 31; - Word16 q_chEneIIR = 0, q_procChEneIIR = 0; Word32 temp_div; - Word16 e_div, tmp, is_zero, i; - move16(); - move16(); + Word16 e_div, is_zero, i; move16(); - FOR( i = 0; i < 6; i++ ) + FOR( i = 0; i < 2; i++ ) { FOR( Word16 j = 0; j < nSlots; j++ ) { @@ -2690,16 +3065,17 @@ static void adaptTransportSignalsHeadtracked_fx( shift = sub( shift, 5 ); // 5 is gaurded bits needed// Word32 re, img, temp; - Word16 q_temp = sub( imult1616( 2, add( q_inp, shift ) ), 31 ); + Word16 s, q_band_nrg, q_temp[2]; FOR( band_idx = 0; band_idx < max_band; band_idx++ ) { - Word32 ch_nrg[2]; /* storage for input signal channel energies */ + Word32 ch_nrg[2]; /* storage for input signal channel energies */ + Word64 W_ch_nrg[2]; /* storage for input signal channel energies */ bin_lo = MASA_band_grouping_24[band_idx]; bin_hi = s_min( MASA_band_grouping_24[band_idx + 1], (Word16) nBins ); FOR( ch = 0; ch < 2; ch++ ) { - ch_nrg[ch] = 0; + W_ch_nrg[ch] = 0; move32(); FOR( slot = 0; slot < nSlots; slot++ ) { @@ -2708,24 +3084,31 @@ static void adaptTransportSignalsHeadtracked_fx( re = L_shl( inRe_fx[ch][slot][bin], shift ); img = L_shl( inIm_fx[ch][slot][bin], shift ); - ch_nrg[ch] = L_add( ch_nrg[ch], ( L_add( Mpy_32_32( re, re ), Mpy_32_32( img, img ) ) ) ); // 2(q_inp +shift) -31 - move32(); + W_ch_nrg[ch] = W_add( W_ch_nrg[ch], ( W_add( W_mult0_32_32( re, re ), W_mult0_32_32( img, img ) ) ) ); // 2(q_inp +shift) + move64(); } } + s = W_norm( W_ch_nrg[ch] ); + ch_nrg[ch] = W_extract_h( W_shl( W_ch_nrg[ch], s ) ); // Q: 2*(q_inp+shift) + s - 32 + q_temp[ch] = sub( add( shl( add( q_inp, shift ), 1 ), s ), 32 ); + move32(); + move16(); + hHeadTrackData->chEneIIR_fx[ch][band_idx] = Mpy_32_16_1( hHeadTrackData->chEneIIR_fx[ch][band_idx], ADAPT_HTPROTO_IIR_FAC_FX ); // q_chEneIIR move32(); - temp = Mpy_32_16_1( ch_nrg[ch], sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); - IF( LT_16( hHeadTrackData->q_chEneIIR, q_temp ) ) + temp = Mpy_32_16_1( ch_nrg[ch], sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); // q_temp[ch] + IF( LT_16( hHeadTrackData->q_chEneIIR[ch][band_idx], q_temp[ch] ) ) { - hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp, hHeadTrackData->q_chEneIIR ) ), hHeadTrackData->chEneIIR_fx[ch][band_idx] ); + hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp[ch], hHeadTrackData->q_chEneIIR[ch][band_idx] ) ), hHeadTrackData->chEneIIR_fx[ch][band_idx] ); // hHeadTrackData->q_chEneIIR[ch][band_idx] } ELSE { - hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->chEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_chEneIIR, q_temp ) ), temp ); + hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->chEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_chEneIIR[ch][band_idx], q_temp[ch] ) ), temp ); // q_temp[ch] } move32(); + hHeadTrackData->q_chEneIIR[ch][band_idx] = s_min( hHeadTrackData->q_chEneIIR[ch][band_idx], q_temp[ch] ); + move16(); } - q_chEneIIR = s_min( hHeadTrackData->q_chEneIIR, q_temp ); /* Determine ILD */ IF( EQ_32( L_max( 1, hHeadTrackData->chEneIIR_fx[0][band_idx] ), L_max( 1, hHeadTrackData->chEneIIR_fx[1][band_idx] ) ) ) @@ -2736,7 +3119,7 @@ static void adaptTransportSignalsHeadtracked_fx( ELSE { temp_div = L_deposit_h( BASOP_Util_Divide3232_Scale( L_max( 1, hHeadTrackData->chEneIIR_fx[0][band_idx] ), L_max( 1, hHeadTrackData->chEneIIR_fx[1][band_idx] ), &e_div ) ); - + e_div = add( e_div, sub( hHeadTrackData->q_chEneIIR[1][band_idx], hHeadTrackData->q_chEneIIR[0][band_idx] ) ); temp = BASOP_Util_Log2( temp_div ); // Q25 IF( e_div > 0 ) { @@ -2750,7 +3133,7 @@ static void adaptTransportSignalsHeadtracked_fx( temp = Mpy_32_32( temp, 646462464 ); // logx base 10 = 0.30103* logx base 2// ILD = L_abs( Mpy_32_16_1( temp, 20480 ) ); // Q21 } - IF( GT_32( hHeadTrackData->chEneIIR_fx[1][band_idx], hHeadTrackData->chEneIIR_fx[0][band_idx] ) ) + IF( BASOP_Util_Cmp_Mant32Exp( hHeadTrackData->chEneIIR_fx[1][band_idx], sub( 31, hHeadTrackData->q_chEneIIR[1][band_idx] ), hHeadTrackData->chEneIIR_fx[0][band_idx], sub( 31, hHeadTrackData->q_chEneIIR[0][band_idx] ) ) > 0 ) { louderCh = 1; } @@ -2783,8 +3166,9 @@ static void adaptTransportSignalsHeadtracked_fx( { IF( NE_16( ch, louderCh ) ) { - Word32 band_nrg = 0; - move32(); + Word32 band_nrg; + Word64 W_band_nrg = 0; + move64(); FOR( slot = 0; slot < nSlots; slot++ ) { @@ -2795,24 +3179,31 @@ static void adaptTransportSignalsHeadtracked_fx( inIm_fx[ch][slot][bin] = L_add( ( Mpy_32_32( mono_factor, L_add( inIm_fx[0][slot][bin], inIm_fx[1][slot][bin] ) ) ), ( Mpy_32_32( L_sub( ONE_IN_Q31, mono_factor ), inIm_fx[ch][slot][bin] ) ) ); move32(); move32(); - re = L_shl( inRe_fx[ch][slot][bin], shift ); // q_inp +shift - img = L_shl( inIm_fx[ch][slot][bin], shift ); // q_inp +shift - band_nrg = L_add( band_nrg, ( L_add( Mpy_32_32( re, re ), Mpy_32_32( img, img ) ) ) ); // 2(q_inp +shift) -31 + re = L_shl( inRe_fx[ch][slot][bin], shift ); // q_inp +shift + img = L_shl( inIm_fx[ch][slot][bin], shift ); // q_inp +shift + + W_band_nrg = W_add( W_band_nrg, ( W_add( W_mult0_32_32( re, re ), W_mult0_32_32( img, img ) ) ) ); // 2(q_inp + shift) } } - hHeadTrackData->procChEneIIR_fx[ch][band_idx] = Mpy_32_16_1( hHeadTrackData->procChEneIIR_fx[ch][band_idx], ADAPT_HTPROTO_IIR_FAC_FX ); // q_procChEneIIR + s = W_norm( W_band_nrg ); + band_nrg = W_extract_h( W_shl( W_band_nrg, s ) ); // Q: 2*(q_inp+shift) + s - 32 + q_band_nrg = sub( add( shl( add( q_inp, shift ), 1 ), s ), 32 ); + + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = Mpy_32_16_1( hHeadTrackData->procChEneIIR_fx[ch][band_idx], ADAPT_HTPROTO_IIR_FAC_FX ); // hHeadTrackData->q_procChEneIIR[ch][band_idx] move32(); - temp = Mpy_32_16_1( band_nrg, sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); - IF( LT_16( hHeadTrackData->q_procChEneIIR, q_temp ) ) + temp = Mpy_32_16_1( band_nrg, sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); // q_band_nrg + IF( LT_16( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_band_nrg ) ) { - hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp, hHeadTrackData->q_procChEneIIR ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] ); + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_band_nrg, hHeadTrackData->q_procChEneIIR[ch][band_idx] ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] ); // hHeadTrackData->q_procChEneIIR[ch][band_idx] } ELSE { - hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR, q_temp ) ), temp ); + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_band_nrg ) ), temp ); // q_band_nrg } move32(); + hHeadTrackData->q_procChEneIIR[ch][band_idx] = s_min( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_band_nrg ); + move16(); } ELSE { @@ -2821,27 +3212,27 @@ static void adaptTransportSignalsHeadtracked_fx( move32(); temp = Mpy_32_16_1( ch_nrg[ch], sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); - IF( LT_16( hHeadTrackData->q_procChEneIIR, q_temp ) ) + IF( LT_16( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_temp[ch] ) ) { - hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp, hHeadTrackData->q_procChEneIIR ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] ); + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp[ch], hHeadTrackData->q_procChEneIIR[ch][band_idx] ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] ); // hHeadTrackData->q_procChEneIIR[ch][band_idx] } ELSE { - hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR, q_temp ) ), temp ); + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_temp[ch] ) ), temp ); // q_temp[ch] } move32(); + hHeadTrackData->q_procChEneIIR[ch][band_idx] = s_min( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_temp[ch] ); + move16(); } } - q_procChEneIIR = s_min( hHeadTrackData->q_procChEneIIR, q_temp ); - /* Equalize */ - ene_target = L_add( hHeadTrackData->chEneIIR_fx[0][band_idx], hHeadTrackData->chEneIIR_fx[1][band_idx] ); // q_chEneIIR// + ene_target = BASOP_Util_Add_Mant32Exp( hHeadTrackData->chEneIIR_fx[0][band_idx], sub( 31, hHeadTrackData->q_chEneIIR[0][band_idx] ), hHeadTrackData->chEneIIR_fx[1][band_idx], sub( 31, hHeadTrackData->q_chEneIIR[1][band_idx] ), &ene_target_e ); - ene_proc = L_add( hHeadTrackData->procChEneIIR_fx[0][band_idx], hHeadTrackData->procChEneIIR_fx[1][band_idx] ); // q_procChEneIIR// + ene_proc = BASOP_Util_Add_Mant32Exp( hHeadTrackData->procChEneIIR_fx[0][band_idx], sub( 31, hHeadTrackData->q_procChEneIIR[0][band_idx] ), hHeadTrackData->procChEneIIR_fx[1][band_idx], sub( 31, hHeadTrackData->q_procChEneIIR[1][band_idx] ), &ene_proc_e ); temp_div = L_deposit_h( BASOP_Util_Divide3232_Scale( ene_target, L_max( 1, ene_proc ), &e_div ) ); - e_div = add( e_div, sub( q_procChEneIIR, q_chEneIIR ) ); + e_div = add( e_div, sub( ene_target_e, ene_proc_e ) ); eqVal = Sqrt32( temp_div, &e_div ); @@ -2891,16 +3282,8 @@ static void adaptTransportSignalsHeadtracked_fx( } IF( is_zero ) { - hHeadTrackData->q_chEneIIR = 31; - move16(); - } - ELSE - { - tmp = sub( s_min( getScaleFactor32( hHeadTrackData->chEneIIR_fx[0], MASA_FREQUENCY_BANDS ), getScaleFactor32( hHeadTrackData->chEneIIR_fx[1], MASA_FREQUENCY_BANDS ) ), 1 ); - scale_sig32( hHeadTrackData->chEneIIR_fx[0], MASA_FREQUENCY_BANDS, tmp ); - scale_sig32( hHeadTrackData->chEneIIR_fx[1], MASA_FREQUENCY_BANDS, tmp ); - hHeadTrackData->q_chEneIIR = add( q_chEneIIR, tmp ); - move16(); + set16_fx( hHeadTrackData->q_chEneIIR[0], 31, MASA_FREQUENCY_BANDS ); + set16_fx( hHeadTrackData->q_chEneIIR[1], 31, MASA_FREQUENCY_BANDS ); } is_zero = 1; @@ -2917,17 +3300,10 @@ static void adaptTransportSignalsHeadtracked_fx( } IF( is_zero ) { - hHeadTrackData->q_procChEneIIR = 31; - move16(); - } - ELSE - { - tmp = sub( s_min( getScaleFactor32( hHeadTrackData->procChEneIIR_fx[0], MASA_FREQUENCY_BANDS ), getScaleFactor32( hHeadTrackData->procChEneIIR_fx[1], MASA_FREQUENCY_BANDS ) ), 1 ); - scale_sig32( hHeadTrackData->procChEneIIR_fx[0], MASA_FREQUENCY_BANDS, tmp ); - scale_sig32( hHeadTrackData->procChEneIIR_fx[1], MASA_FREQUENCY_BANDS, tmp ); - hHeadTrackData->q_procChEneIIR = add( q_procChEneIIR, tmp ); - move16(); + set16_fx( hHeadTrackData->q_procChEneIIR[0], 31, MASA_FREQUENCY_BANDS ); + set16_fx( hHeadTrackData->q_procChEneIIR[1], 31, MASA_FREQUENCY_BANDS ); } + return; } @@ -3263,7 +3639,8 @@ static void eig2x2_fx( /* Numeric case, when input is practically zeros */ // IF( D_fx[0] < EPSILON_FX ) - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( D_fx[0], *q_D, EPSILON_MANT, EPSILON_EXP ), -1 ) ) + + IF( LT_32( L_shl_sat( D_fx[0], sub( sub( 31, *q_D ), EPSILON_EXP ) ), EPSILON_MANT ) ) { Ure_fx[0][0] = ONE_IN_Q31; move32(); @@ -3276,7 +3653,7 @@ static void eig2x2_fx( } /* Numeric case, when input is near an identity matrix with a gain */ - tmp1 = Mpy_32_32( 2147484, add_fx ); // 2147484 = 1e-3f in Q31 + tmp1 = Mpy_32_32( INV_1000_Q31, add_fx ); IF( LT_16( q_tmp1, q_tmp2 ) ) { @@ -3315,17 +3692,18 @@ static void eig2x2_fx( /* Eigenvectors */ FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - IF( LT_16( *q_D, q_e ) ) + Word16 q_diff = sub( q_e, *q_D ); + IF( q_diff > 0 ) { - tmp1 = L_sub( D_fx[ch], L_shr( e1, sub( q_e, *q_D ) ) ); - tmp2 = L_sub( D_fx[ch], L_shr( e2, sub( q_e, *q_D ) ) ); + tmp1 = L_sub( D_fx[ch], L_shr( e1, q_diff ) ); + tmp2 = L_sub( D_fx[ch], L_shr( e2, q_diff ) ); q_tmp1 = *q_D; move16(); } ELSE { - tmp1 = L_sub( L_shr( D_fx[ch], sub( *q_D, q_e ) ), e1 ); - tmp2 = L_sub( L_shr( D_fx[ch], sub( *q_D, q_e ) ), e2 ); + tmp1 = L_sub( L_shl( D_fx[ch], q_diff ), e1 ); + tmp2 = L_sub( L_shl( D_fx[ch], q_diff ), e2 ); q_tmp1 = q_e; move16(); } @@ -3343,28 +3721,22 @@ static void eig2x2_fx( tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); -#if 1 - tmp2 = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, tmp3, &exp ); + tmp2 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, tmp3, &exp ); exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); normVal_fx = Sqrt32( tmp2, &exp ); // q_tmp2 q_tmp2 = sub( 31, exp ); -#else - /* Note: This code part does not work yet, see pipeline issue for BASOP #1009 */ - /* although the same code works at other places: mantissa and q_format is fine */ - normVal_fx = ISqrt32( tmp3, &exp ); - q_tmp2 = sub( 31, exp ); -#endif - IF( LT_16( q_tmp1, q_c ) ) + q_diff = sub( q_c, q_tmp1 ); + IF( q_diff > 0 ) { - c_re = L_shr( c_re, sub( q_c, q_tmp1 ) ); - c_im = L_shr( c_im, sub( q_c, q_tmp1 ) ); + c_re = L_shr( c_re, q_diff ); + c_im = L_shr( c_im, q_diff ); q_c = q_tmp1; move16(); } ELSE { - s_fx = L_shr( s_fx, sub( q_tmp1, q_c ) ); + s_fx = L_shl( s_fx, q_diff ); q_tmp1 = q_c; move16(); } @@ -3379,11 +3751,12 @@ static void eig2x2_fx( IF( q_U_2 != 0 ) { - IF( LT_16( q_U_1, q_U_2 ) ) + q_diff = sub( q_U_2, q_U_1 ); + IF( q_diff > 0 ) { - Ure_fx[1][ch - 1] = L_shr( Ure_fx[1][ch - 1], sub( q_U_2, q_U_1 ) ); - Ure_fx[0][ch - 1] = L_shr( Ure_fx[0][ch - 1], sub( q_U_2, q_U_1 ) ); - Uim_fx[0][ch - 1] = L_shr( Uim_fx[0][ch - 1], sub( q_U_2, q_U_1 ) ); + Ure_fx[1][ch - 1] = L_shr( Ure_fx[1][ch - 1], q_diff ); + Ure_fx[0][ch - 1] = L_shr( Ure_fx[0][ch - 1], q_diff ); + Uim_fx[0][ch - 1] = L_shr( Uim_fx[0][ch - 1], q_diff ); q_U_2 = q_U_1; move32(); move32(); @@ -3392,9 +3765,9 @@ static void eig2x2_fx( } ELSE IF( GT_16( q_U_1, q_U_2 ) ) { - Ure_fx[1][ch] = L_shr( Ure_fx[1][ch], sub( q_U_1, q_U_2 ) ); - Ure_fx[0][ch] = L_shr( Ure_fx[0][ch], sub( q_U_1, q_U_2 ) ); - Uim_fx[1][ch] = L_shr( Uim_fx[1][ch], sub( q_U_1, q_U_2 ) ); + Ure_fx[1][ch] = L_shl( Ure_fx[1][ch], q_diff ); + Ure_fx[0][ch] = L_shl( Ure_fx[0][ch], q_diff ); + Uim_fx[1][ch] = L_shl( Uim_fx[1][ch], q_diff ); q_U_1 = q_U_2; move32(); move32(); @@ -3419,28 +3792,22 @@ static void eig2x2_fx( tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); -#if 1 - tmp2 = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, tmp3, &exp ); + tmp2 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, tmp3, &exp ); exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); normVal_fx = Sqrt32( tmp2, &exp ); // q_tmp2 q_tmp2 = sub( 31, exp ); -#else - /* Note: This code part does not work yet, see pipeline issue for BASOP #1009 */ - /* although the same code works at other places: mantissa and q_format is fine */ - normVal_fx = ISqrt32( tmp3, &exp_tmp3 ); - q_tmp2 = sub( 31, exp_tmp3 ); -#endif - IF( LT_16( q_tmp1, q_c ) ) + q_diff = sub( q_c, q_tmp1 ); + IF( q_diff > 0 ) { - c_re = L_shr( c_re, sub( q_c, q_tmp1 ) ); - c_im = L_shr( c_im, sub( q_c, q_tmp1 ) ); + c_re = L_shr( c_re, q_diff ); + c_im = L_shr( c_im, q_diff ); q_c = q_tmp1; move16(); } ELSE { - s_fx = L_shr( s_fx, sub( q_tmp1, q_c ) ); + s_fx = L_shl( s_fx, q_diff ); q_tmp1 = q_c; move16(); } @@ -3449,17 +3816,18 @@ static void eig2x2_fx( move32(); Ure_fx[0][ch] = Mpy_32_32( c_re, normVal_fx ); move32(); - Uim_fx[0][ch] = Mpy_32_32( -c_im, normVal_fx ); + Uim_fx[0][ch] = Mpy_32_32( L_negate( c_im ), normVal_fx ); move32(); q_U_2 = sub( add( q_tmp1, q_tmp2 ), 31 ); IF( q_U_1 != 0 ) { - IF( LT_16( q_U_1, q_U_2 ) ) + q_diff = sub( q_U_2, q_U_1 ); + IF( q_diff > 0 ) { - Ure_fx[1][ch] = L_shr( Ure_fx[1][ch], sub( q_U_2, q_U_1 ) ); - Ure_fx[0][ch] = L_shr( Ure_fx[0][ch], sub( q_U_2, q_U_1 ) ); - Uim_fx[0][ch] = L_shr( Uim_fx[0][ch], sub( q_U_2, q_U_1 ) ); + Ure_fx[1][ch] = L_shr( Ure_fx[1][ch], q_diff ); + Ure_fx[0][ch] = L_shr( Ure_fx[0][ch], q_diff ); + Uim_fx[0][ch] = L_shr( Uim_fx[0][ch], q_diff ); q_U_2 = q_U_1; move32(); move32(); @@ -3468,9 +3836,9 @@ static void eig2x2_fx( } ELSE IF( GT_16( q_U_1, q_U_2 ) ) { - Ure_fx[1][ch - 1] = L_shr( Ure_fx[1][ch - 1], sub( q_U_1, q_U_2 ) ); - Ure_fx[0][ch - 1] = L_shr( Ure_fx[0][ch - 1], sub( q_U_1, q_U_2 ) ); - Uim_fx[1][ch - 1] = L_shr( Uim_fx[1][ch - 1], sub( q_U_1, q_U_2 ) ); + Ure_fx[1][ch - 1] = L_shl( Ure_fx[1][ch - 1], q_diff ); + Ure_fx[0][ch - 1] = L_shl( Ure_fx[0][ch - 1], q_diff ); + Uim_fx[1][ch - 1] = L_shl( Uim_fx[1][ch - 1], q_diff ); q_U_1 = q_U_2; move32(); move32(); @@ -3483,15 +3851,17 @@ static void eig2x2_fx( } } - IF( q_U_1 != 0 ) + if ( q_U_1 != 0 ) { *q_U = q_U_1; + move16(); } - ELSE + + if ( q_U_1 == 0 ) { *q_U = q_U_2; + move16(); } - move16(); return; } @@ -3546,11 +3916,6 @@ static void matrixMul_fx( Word16 chA, chB; Word16 min_q_shift1, min_q_shift2; Word16 size = i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ); -#ifndef FIX_1113_OPT_DIRAC_BIN_REND -#ifndef IVAS_ENH64_CADENCE_CHANGES - Word32 tmp1, tmp2; -#endif -#endif min_q_shift1 = sub( s_min( L_norm_arr( Are_fx[0], size ), L_norm_arr( Aim_fx[0], size ) ), 1 ); min_q_shift2 = sub( s_min( L_norm_arr( Bre_fx[0], size ), L_norm_arr( Bim_fx[0], size ) ), 1 ); @@ -3579,7 +3944,6 @@ static void matrixMul_fx( outIm_fx[chA][chB] = L_add( outIm_fx[chA][chB], W_extract_h( W_mac_32_32( W_mult_32_32( Are_fx[chA][0], Bim_fx[0][chB] ), Are_fx[chA][1], Bim_fx[1][chB] ) ) ); move32(); #else -#ifdef FIX_1113_OPT_DIRAC_BIN_REND outRe_fx[chA][chB] = Msub_32_32( Msub_32_32( Madd_32_32( Mpy_32_32( Are_fx[chA][0], Bre_fx[0][chB] ), Are_fx[chA][1], Bre_fx[1][chB] ), Aim_fx[chA][0], Bim_fx[0][chB] ), @@ -3590,110 +3954,10 @@ static void matrixMul_fx( Are_fx[chA][0], Bim_fx[0][chB] ), Are_fx[chA][1], Bim_fx[1][chB] ); move32(); -#else - test(); - test(); - test(); - IF( ( Are_fx[chA][0] >= 0 && Bre_fx[0][chB] >= 0 ) || ( Are_fx[chA][0] < 0 && Bre_fx[0][chB] < 0 ) ) - { - tmp1 = Mpy_32_32( Are_fx[chA][0], Bre_fx[0][chB] ); - } - ELSE - { - tmp1 = L_negate( Mpy_32_32( L_abs( Are_fx[chA][0] ), L_abs( Bre_fx[0][chB] ) ) ); - } - test(); - test(); - test(); - IF( ( Are_fx[chA][1] >= 0 && Bre_fx[1][chB] >= 0 ) || ( Are_fx[chA][1] < 0 && Bre_fx[1][chB] < 0 ) ) - { - tmp2 = Mpy_32_32( Are_fx[chA][1], Bre_fx[1][chB] ); - } - ELSE - { - tmp2 = L_negate( Mpy_32_32( L_abs( Are_fx[chA][1] ), L_abs( Bre_fx[1][chB] ) ) ); - } - outRe_fx[chA][chB] = L_add( tmp1, tmp2 ); - move32(); - - test(); - test(); - test(); - IF( ( Aim_fx[chA][0] >= 0 && Bim_fx[0][chB] >= 0 ) || ( Aim_fx[chA][0] < 0 && Bim_fx[0][chB] < 0 ) ) - { - tmp1 = Mpy_32_32( Aim_fx[chA][0], Bim_fx[0][chB] ); - } - ELSE - { - tmp1 = L_negate( Mpy_32_32( L_abs( Aim_fx[chA][0] ), L_abs( Bim_fx[0][chB] ) ) ); - } - test(); - test(); - test(); - IF( ( Aim_fx[chA][1] >= 0 && Bim_fx[1][chB] >= 0 ) || ( Aim_fx[chA][1] < 0 && Bim_fx[1][chB] < 0 ) ) - { - tmp2 = Mpy_32_32( Aim_fx[chA][1], Bim_fx[1][chB] ); - } - ELSE - { - tmp2 = L_negate( Mpy_32_32( L_abs( Aim_fx[chA][1] ), L_abs( Bim_fx[1][chB] ) ) ); - } - outRe_fx[chA][chB] = L_sub( outRe_fx[chA][chB], L_add( tmp1, tmp2 ) ); - move32(); - test(); - test(); - test(); - IF( ( Aim_fx[chA][0] >= 0 && Bre_fx[0][chB] >= 0 ) || ( Aim_fx[chA][0] < 0 && Bre_fx[0][chB] < 0 ) ) - { - tmp1 = Mpy_32_32( Aim_fx[chA][0], Bre_fx[0][chB] ); - } - ELSE - { - tmp1 = L_negate( Mpy_32_32( L_abs( Aim_fx[chA][0] ), L_abs( Bre_fx[0][chB] ) ) ); - } - test(); - test(); - test(); - IF( ( Aim_fx[chA][1] >= 0 && Bre_fx[1][chB] >= 0 ) || ( Aim_fx[chA][1] < 0 && Bre_fx[1][chB] < 0 ) ) - { - tmp2 = Mpy_32_32( Aim_fx[chA][1], Bre_fx[1][chB] ); - } - ELSE - { - tmp2 = L_negate( Mpy_32_32( L_abs( Aim_fx[chA][1] ), L_abs( Bre_fx[1][chB] ) ) ); - } - outIm_fx[chA][chB] = L_add( tmp1, tmp2 ); - move32(); - - test(); - test(); - test(); - IF( ( Are_fx[chA][0] >= 0 && Bim_fx[0][chB] >= 0 ) || ( Are_fx[chA][0] < 0 && Bim_fx[0][chB] < 0 ) ) - { - tmp1 = Mpy_32_32( Are_fx[chA][0], Bim_fx[0][chB] ); - } - ELSE - { - tmp1 = L_negate( Mpy_32_32( L_abs( Are_fx[chA][0] ), L_abs( Bim_fx[0][chB] ) ) ); - } - test(); - test(); - test(); - IF( ( Are_fx[chA][1] >= 0 && Bim_fx[1][chB] >= 0 ) || ( Are_fx[chA][1] < 0 && Bim_fx[1][chB] < 0 ) ) - { - tmp2 = Mpy_32_32( Are_fx[chA][1], Bim_fx[1][chB] ); - } - ELSE - { - tmp2 = L_negate( Mpy_32_32( L_abs( Are_fx[chA][1] ), L_abs( Bim_fx[1][chB] ) ) ); - } - outIm_fx[chA][chB] = L_add( outIm_fx[chA][chB], L_add( tmp1, tmp2 ) ); - move32(); -#endif -#endif /* #ifdef IVAS_ENH64_CADENCE_CHANGES */ - } - } - *q_out = sub( add( *q_A, *q_B ), 31 ); +#endif /* #ifdef IVAS_ENH64_CADENCE_CHANGES */ + } + } + *q_out = sub( add( *q_A, *q_B ), 31 ); move16(); if ( L_and( is_zero_arr( outRe_fx[0], size ), is_zero_arr( outIm_fx[0], size ) ) ) @@ -3718,97 +3982,54 @@ static void matrixTransp1Mul_fx( { Word16 chA, chB; Word16 size = i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ); -#ifndef FIX_1113_OPT_DIRAC_BIN_REND - Word32 tmp1, tmp2; -#endif + + Word64 tmp_outRe_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word64 tmp_outIm_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 q_tmp_outRe_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 q_tmp_outIm_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word64 tmp64_1, tmp64_2; + Word16 tmp16, q_common = 63; + move16(); FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) { -#ifdef FIX_1113_OPT_DIRAC_BIN_REND - outRe_fx[chA][chB] = Madd_32_32( Madd_32_32( Madd_32_32( Mpy_32_32( Are_fx[0][chA], Bre_fx[0][chB] ), - Are_fx[1][chA], Bre_fx[1][chB] ), - Aim_fx[0][chA], Bim_fx[0][chB] ), - Aim_fx[1][chA], Bim_fx[1][chB] ); - move32(); - outIm_fx[chA][chB] = Msub_32_32( Msub_32_32( Madd_32_32( Mpy_32_32( Are_fx[0][chA], Bim_fx[0][chB] ), - Are_fx[1][chA], Bim_fx[1][chB] ), - Aim_fx[0][chA], Bre_fx[0][chB] ), - Aim_fx[1][chA], Bre_fx[1][chB] ); - move32(); -#else - test(); - test(); - test(); - IF( ( ( ( Are_fx[0][chA] >= 0 ) && ( Bre_fx[0][chB] >= 0 ) ) || ( ( Are_fx[0][chA] < 0 ) && ( Bre_fx[0][chB] < 0 ) ) ) ) - tmp1 = Mpy_32_32( Are_fx[0][chA], Bre_fx[0][chB] ); - ELSE - tmp1 = L_negate( Mpy_32_32( L_abs( Are_fx[0][chA] ), L_abs( Bre_fx[0][chB] ) ) ); - test(); - test(); - test(); - IF( ( ( ( Are_fx[1][chA] >= 0 ) && ( Bre_fx[1][chB] >= 0 ) ) || ( ( Are_fx[1][chA] < 0 ) && ( Bre_fx[1][chB] < 0 ) ) ) ) - tmp2 = Mpy_32_32( Are_fx[1][chA], Bre_fx[1][chB] ); - ELSE - tmp2 = L_negate( Mpy_32_32( L_abs( Are_fx[1][chA] ), L_abs( Bre_fx[1][chB] ) ) ); - outRe_fx[chA][chB] = L_add( tmp1, tmp2 ); - move32(); - test(); - test(); - test(); - IF( ( ( ( L_negate( Aim_fx[0][chA] ) >= 0 ) && ( Bim_fx[0][chB] >= 0 ) ) || ( ( L_negate( Aim_fx[0][chA] ) < 0 ) && ( Bim_fx[0][chB] < 0 ) ) ) ) - tmp1 = Mpy_32_32( -Aim_fx[0][chA], Bim_fx[0][chB] ); - ELSE - tmp1 = L_negate( Mpy_32_32( L_abs( -Aim_fx[0][chA] ), L_abs( Bim_fx[0][chB] ) ) ); - test(); - test(); - test(); - IF( ( ( ( Aim_fx[1][chA] >= 0 ) && ( Bim_fx[1][chB] >= 0 ) ) || ( ( Aim_fx[1][chA] < 0 ) && ( Bim_fx[1][chB] < 0 ) ) ) ) - tmp2 = Mpy_32_32( Aim_fx[1][chA], Bim_fx[1][chB] ); - ELSE - tmp2 = L_negate( Mpy_32_32( L_abs( Aim_fx[1][chA] ), L_abs( Bim_fx[1][chB] ) ) ); - outRe_fx[chA][chB] = L_sub( outRe_fx[chA][chB], L_sub( tmp1, tmp2 ) ); - move32(); + tmp64_1 = W_mac_32_32( W_mult_32_32( Are_fx[0][chA], Bre_fx[0][chB] ), Are_fx[1][chA], Bre_fx[1][chB] ); // Q: add( add( q_A, q_B ), 1 ) + tmp64_2 = W_mac_32_32( W_mult_32_32( Aim_fx[0][chA], Bim_fx[0][chB] ), Aim_fx[1][chA], Bim_fx[1][chB] ); // Q: add( add( q_A, q_B ), 1 ) + tmp_outRe_fx[chA][chB] = W_add( tmp64_1, tmp64_2 ); // Q: add( add( q_A, q_B ), 1 ) + move64(); + tmp16 = W_norm( tmp_outRe_fx[chA][chB] ); + tmp_outRe_fx[chA][chB] = W_shl( tmp_outRe_fx[chA][chB], tmp16 ); // Q:add( tmp16, add( add( q_A, q_B ), 1 ) ) + move64(); + q_tmp_outRe_fx[chA][chB] = add( tmp16, add( add( q_A, q_B ), 1 ) ); + move16(); + q_common = s_min( q_tmp_outRe_fx[chA][chB], q_common ); - test(); - test(); - test(); - IF( ( ( ( L_negate( Aim_fx[0][chA] ) >= 0 ) && ( Bre_fx[0][chB] >= 0 ) ) || ( ( L_negate( Aim_fx[0][chA] ) < 0 ) && ( Bre_fx[0][chB] < 0 ) ) ) ) - tmp1 = Mpy_32_32( -Aim_fx[0][chA], Bre_fx[0][chB] ); - ELSE - tmp1 = L_negate( Mpy_32_32( L_abs( -Aim_fx[0][chA] ), L_abs( Bre_fx[0][chB] ) ) ); - test(); - test(); - test(); - IF( ( ( ( Aim_fx[1][chA] >= 0 ) && ( Bre_fx[1][chB] >= 0 ) ) || ( ( Aim_fx[1][chA] < 0 ) && ( Bre_fx[1][chB] < 0 ) ) ) ) - tmp2 = Mpy_32_32( Aim_fx[1][chA], Bre_fx[1][chB] ); - ELSE - tmp2 = L_negate( Mpy_32_32( L_abs( Aim_fx[1][chA] ), L_abs( Bre_fx[1][chB] ) ) ); - outIm_fx[chA][chB] = L_sub( tmp1, tmp2 ); - move32(); - test(); - test(); - test(); - IF( ( ( ( Are_fx[0][chA] >= 0 ) && ( Bim_fx[0][chB] >= 0 ) ) || ( ( Are_fx[0][chA] < 0 ) && ( Bim_fx[0][chB] < 0 ) ) ) ) - tmp1 = Mpy_32_32( Are_fx[0][chA], Bim_fx[0][chB] ); - ELSE - tmp1 = L_negate( Mpy_32_32( L_abs( Are_fx[0][chA] ), L_abs( Bim_fx[0][chB] ) ) ); - test(); - test(); - test(); - IF( ( ( ( Are_fx[1][chA] >= 0 ) && ( Bim_fx[1][chB] >= 0 ) ) || ( ( Are_fx[1][chA] < 0 ) && ( Bim_fx[1][chB] < 0 ) ) ) ) - tmp2 = Mpy_32_32( Are_fx[1][chA], Bim_fx[1][chB] ); - ELSE - tmp2 = L_negate( Mpy_32_32( L_abs( Are_fx[1][chA] ), L_abs( Bim_fx[1][chB] ) ) ); - outIm_fx[chA][chB] = L_add( outIm_fx[chA][chB], L_add( tmp1, tmp2 ) ); + tmp64_1 = W_mac_32_32( W_mult_32_32( Are_fx[0][chA], Bim_fx[0][chB] ), Are_fx[1][chA], Bim_fx[1][chB] ); // Q: add( add( q_A, q_B ), 1 ) + tmp64_2 = W_mac_32_32( W_mult_32_32( Aim_fx[0][chA], Bre_fx[0][chB] ), Aim_fx[1][chA], Bre_fx[1][chB] ); // Q: add( add( q_A, q_B ), 1 ) + tmp_outIm_fx[chA][chB] = W_sub( tmp64_1, tmp64_2 ); // Q: add( add( q_A, q_B ), 1 ) + move64(); + tmp16 = W_norm( tmp_outIm_fx[chA][chB] ); + tmp_outIm_fx[chA][chB] = W_shl( tmp_outIm_fx[chA][chB], tmp16 ); // Q:add( tmp16, add( add( q_A, q_B ), 1 ) ) + move64(); + q_tmp_outIm_fx[chA][chB] = add( tmp16, add( add( q_A, q_B ), 1 ) ); + move16(); + q_common = s_min( q_tmp_outIm_fx[chA][chB], q_common ); + } + } + FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + outRe_fx[chA][chB] = W_extract_h( W_shl( tmp_outRe_fx[chA][chB], s_max( -63, sub( q_common, q_tmp_outRe_fx[chA][chB] ) ) ) ); + move32(); + outIm_fx[chA][chB] = W_extract_h( W_shl( tmp_outIm_fx[chA][chB], s_max( -63, sub( q_common, q_tmp_outIm_fx[chA][chB] ) ) ) ); move32(); -#endif } } - *q_out = sub( add( q_A, q_B ), 31 ); - + *q_out = sub( q_common, 32 ); move16(); if ( L_and( is_zero_arr( outRe_fx[0], size ), is_zero_arr( outIm_fx[0], size ) ) ) { @@ -3826,26 +4047,17 @@ static void matrixTransp2Mul_fx( Word32 Bre_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_B*/ Word32 Bim_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_B*/ Word16 *q_B, -#ifdef FIX_1072_SPEEDUP_matrixTransp2Mul_fx Word32 Ascale, Word32 Bscale, -#endif Word32 outRe_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_out*/ Word32 outIm_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_out*/ Word16 *q_out ) { Word16 chA, chB; Word16 min_q_shift; - Word16 size = i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ); -#ifndef FIX_1113_OPT_DIRAC_BIN_REND -#ifndef IVAS_ENH64_CADENCE_CHANGES - Word32 tmp1, tmp2; -#endif -#endif + Word16 size = BINAURAL_CHANNELS * BINAURAL_CHANNELS; -#ifdef FIX_1072_SPEEDUP_matrixTransp2Mul_fx IF( Ascale == 1 ) -#endif { min_q_shift = sub( s_min( L_norm_arr( Are_fx[0], size ), L_norm_arr( Aim_fx[0], size ) ), 1 ); scale_sig32( Are_fx[0], size, min_q_shift ); @@ -3854,9 +4066,7 @@ static void matrixTransp2Mul_fx( move16(); } -#ifdef FIX_1072_SPEEDUP_matrixTransp2Mul_fx IF( Bscale == 1 ) -#endif { min_q_shift = sub( s_min( L_norm_arr( Bre_fx[0], size ), L_norm_arr( Bim_fx[0], size ) ), 1 ); scale_sig32( Bre_fx[0], size, min_q_shift ); @@ -3879,7 +4089,6 @@ static void matrixTransp2Mul_fx( outIm_fx[chA][chB] = L_add( outIm_fx[chA][chB], W_extract_h( W_mac_32_32( W_mult_32_32( Are_fx[chA][0], L_negate( Bim_fx[chB][0] ) ), Are_fx[chA][1], L_negate( Bim_fx[chB][1] ) ) ) ); move32(); #else -#ifdef FIX_1113_OPT_DIRAC_BIN_REND outRe_fx[chA][chB] = Madd_32_32( Madd_32_32( Madd_32_32( Mpy_32_32( Are_fx[chA][0], Bre_fx[chB][0] ), Are_fx[chA][1], Bre_fx[chB][1] ), Aim_fx[chA][0], Bim_fx[chB][0] ), @@ -3890,75 +4099,6 @@ static void matrixTransp2Mul_fx( Are_fx[chA][0], Bim_fx[chB][0] ), Are_fx[chA][1], Bim_fx[chB][1] ); move32(); -#else - test(); - test(); - test(); - IF( ( Are_fx[chA][0] >= 0 && Bre_fx[chB][0] >= 0 ) || ( Are_fx[chA][0] < 0 && Bre_fx[chB][0] < 0 ) ) - tmp1 = Mpy_32_32( Are_fx[chA][0], Bre_fx[chB][0] ); - ELSE - tmp1 = L_negate( Mpy_32_32( L_abs( Are_fx[chA][0] ), L_abs( Bre_fx[chB][0] ) ) ); - test(); - test(); - test(); - IF( ( Are_fx[chA][1] >= 0 && Bre_fx[chB][1] >= 0 ) || ( Are_fx[chA][1] < 0 && Bre_fx[chB][1] < 0 ) ) - tmp2 = Mpy_32_32( Are_fx[chA][1], Bre_fx[chB][1] ); - ELSE - tmp2 = L_negate( Mpy_32_32( L_abs( Are_fx[chA][1] ), L_abs( Bre_fx[chB][1] ) ) ); - outRe_fx[chA][chB] = L_add( tmp1, tmp2 ); - move32(); - - test(); - test(); - test(); - IF( ( Aim_fx[chA][0] >= 0 && L_negate( Bim_fx[chB][0] ) >= 0 ) || ( Aim_fx[chA][0] < 0 && L_negate( Bim_fx[chB][0] ) < 0 ) ) - tmp1 = Mpy_32_32( Aim_fx[chA][0], -Bim_fx[chB][0] ); - ELSE - tmp1 = L_negate( Mpy_32_32( L_abs( Aim_fx[chA][0] ), L_abs( -Bim_fx[chB][0] ) ) ); - test(); - test(); - test(); - IF( ( Aim_fx[chA][1] >= 0 && L_negate( Bim_fx[chB][1] ) >= 0 ) || ( Aim_fx[chA][1] < 0 && L_negate( Bim_fx[chB][1] ) < 0 ) ) - tmp2 = Mpy_32_32( Aim_fx[chA][1], -Bim_fx[chB][1] ); - ELSE - tmp2 = L_negate( Mpy_32_32( L_abs( Aim_fx[chA][1] ), L_abs( -Bim_fx[chB][1] ) ) ); - outRe_fx[chA][chB] = L_sub( outRe_fx[chA][chB], L_add( tmp1, tmp2 ) ); - move32(); - - test(); - test(); - test(); - IF( ( Aim_fx[chA][0] >= 0 && Bre_fx[chB][0] >= 0 ) || ( Aim_fx[chA][0] < 0 && Bre_fx[chB][0] < 0 ) ) - tmp1 = Mpy_32_32( Aim_fx[chA][0], Bre_fx[chB][0] ); - ELSE - tmp1 = L_negate( Mpy_32_32( L_abs( Aim_fx[chA][0] ), L_abs( Bre_fx[chB][0] ) ) ); - test(); - test(); - test(); - IF( ( Aim_fx[chA][1] >= 0 && Bre_fx[chB][1] >= 0 ) || ( Aim_fx[chA][1] < 0 && Bre_fx[chB][1] < 0 ) ) - tmp2 = Mpy_32_32( Aim_fx[chA][1], Bre_fx[chB][1] ); - ELSE - tmp2 = L_negate( Mpy_32_32( L_abs( Aim_fx[chA][1] ), L_abs( Bre_fx[chB][1] ) ) ); - outIm_fx[chA][chB] = L_add( tmp1, tmp2 ); - move32(); - - test(); - test(); - test(); - IF( ( Are_fx[chA][0] >= 0 && L_negate( Bim_fx[chB][0] ) >= 0 ) || ( Are_fx[chA][0] < 0 && L_negate( Bim_fx[chB][0] ) < 0 ) ) - tmp1 = Mpy_32_32( Are_fx[chA][0], -Bim_fx[chB][0] ); - ELSE - tmp1 = L_negate( Mpy_32_32( L_abs( Are_fx[chA][0] ), L_abs( -Bim_fx[chB][0] ) ) ); - test(); - test(); - test(); - IF( ( Are_fx[chA][1] >= 0 && L_negate( Bim_fx[chB][1] ) >= 0 ) || ( Are_fx[chA][1] < 0 && L_negate( Bim_fx[chB][1] ) < 0 ) ) - tmp2 = Mpy_32_32( Are_fx[chA][1], -Bim_fx[chB][1] ); - ELSE - tmp2 = L_negate( Mpy_32_32( L_abs( Are_fx[chA][1] ), L_abs( -Bim_fx[chB][1] ) ) ); - outIm_fx[chA][chB] = L_add( outIm_fx[chA][chB], L_add( tmp1, tmp2 ) ); - move32(); -#endif #endif /* #ifdef IVAS_ENH64_CADENCE_CHANGES */ } } @@ -4023,25 +4163,16 @@ static void chol2x2_fx( // 4611686 = 1e-12 in Q62 IF( outRe[0][0] == 0 ) { - outRe[1][0] = BASOP_Util_Divide3232_Scale_cadence( c_re, 4611686, &exp ); + outRe[1][0] = BASOP_Util_Divide3232_Scale_newton( c_re, 4611686, &exp ); move32(); q_re2 = add( sub( 31, exp ), sub( q_c, 62 ) ); - outIm[1][0] = BASOP_Util_Divide3232_Scale_cadence( c_im, 4611686, &exp ); + outIm[1][0] = BASOP_Util_Divide3232_Scale_newton( c_im, 4611686, &exp ); move32(); q_im = add( sub( 31, exp ), sub( q_c, 62 ) ); } ELSE { -#ifndef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC - outRe[1][0] = BASOP_Util_Divide3232_Scale_cadence( c_re, outRe[0][0], &exp ); - move32(); - q_re2 = add( sub( 31, exp ), sub( q_c, q_re1 ) ); - - outIm[1][0] = BASOP_Util_Divide3232_Scale_cadence( c_im, outRe[0][0], &exp ); - move32(); - q_im = add( sub( 31, exp ), sub( q_c, q_re1 ) ); -#else Word32 denom; Word16 den_exp; Word32 my_outRe, my_outIm; @@ -4067,7 +4198,6 @@ static void chol2x2_fx( outIm[1][0] = Mpy_32_32( denom, my_outIm ); move32(); q_im = sub( q_im, den_exp ); -#endif } if ( outRe[1][0] == 0 ) { @@ -4086,20 +4216,15 @@ static void chol2x2_fx( // 4611686 = Q62 IF( e1 == 0 ) { -#ifndef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC - temp = BASOP_Util_Divide3232_Scale_cadence( temp, 4611686, &exp ); - q_tmp = add( sub( 31, exp ), sub( q_tmp, 62 ) ); -#else Word16 norm = norm_l( temp ); temp = L_shl( temp, norm ); q_tmp = add( q_tmp, norm ); temp = Mpy_32_32( temp, ONE_DIV_EPSILON_MANT ); q_tmp = sub( q_tmp, ONE_DIV_EPSILON_EXP ); -#endif } ELSE { - temp = BASOP_Util_Divide3232_Scale_cadence( temp, e1, &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( temp, e1, &exp ); q_tmp = add( sub( 31, exp ), sub( q_tmp, q_e ) ); } if ( temp == 0 ) @@ -4144,17 +4269,7 @@ static void chol2x2_fx( // 4611686 = Q62 IF( outRe[1][1] == 0 ) { -#if !defined( FIX_1072_REDUCE_DIVS ) - outRe[0][1] = BASOP_Util_Divide3232_Scale_cadence( c_re, 4611686, &exp ); - move32(); - q_re2 = add( sub( 31, exp ), sub( q_c, 62 ) ); - - outIm[0][1] = BASOP_Util_Divide3232_Scale_cadence( -c_im, 4611686, &exp ); - move32(); - q_im = add( sub( 31, exp ), sub( q_c, 62 ) ); - -#else - // outRe[0][1] = BASOP_Util_Divide3232_Scale_cadence( c_re, 4611686, &exp ); + // outRe[0][1] = BASOP_Util_Divide3232_Scale_newton( c_re, 4611686, &exp ); Word32 tmp1 = 1953125005; /* 1/4611686 Q62 */ exp = 9; @@ -4162,36 +4277,25 @@ static void chol2x2_fx( move32(); q_re2 = add( sub( 31, exp ), sub( q_c, 62 ) ); - // outIm[0][1] = BASOP_Util_Divide3232_Scale_cadence( -c_im, 4611686, &exp ); + // outIm[0][1] = BASOP_Util_Divide3232_Scale_newton( -c_im, 4611686, &exp ); outIm[0][1] = Mpy_32_32( tmp1, -c_im ); move32(); q_im = add( sub( 31, exp ), sub( q_c, 62 ) ); -#endif } ELSE { -#if !defined( FIX_1072_REDUCE_DIVS ) - outRe[0][1] = BASOP_Util_Divide3232_Scale_cadence( c_re, outRe[1][1], &exp ); - move32(); - q_re2 = add( sub( 31, exp ), sub( q_c, q_re1 ) ); - - outIm[0][1] = BASOP_Util_Divide3232_Scale_cadence( -c_im, outRe[1][1], &exp ); - move32(); - q_im = add( sub( 31, exp ), sub( q_c, q_re1 ) ); -#else { - // outRe[0][1] = BASOP_Util_Divide3232_Scale_cadence( c_re, outRe[1][1], &exp ); - Word32 tmp1 = BASOP_Util_Divide3232_Scale_cadence( 0x7FFFFFFF, outRe[1][1], &exp ); + // outRe[0][1] = BASOP_Util_Divide3232_Scale_newton( c_re, outRe[1][1], &exp ); + Word32 tmp1 = BASOP_Util_Divide3232_Scale_newton( 0x7FFFFFFF, outRe[1][1], &exp ); outRe[0][1] = Mpy_32_32( tmp1, c_re ); move32(); q_re2 = add( sub( 31, exp ), sub( q_c, q_re1 ) ); - // outIm[0][1] = BASOP_Util_Divide3232_Scale_cadence( -c_im, outRe[1][1], &exp ); + // outIm[0][1] = BASOP_Util_Divide3232_Scale_newton( -c_im, outRe[1][1], &exp ); outIm[0][1] = Mpy_32_32( tmp1, -c_im ); move32(); q_im = add( sub( 31, exp ), sub( q_c, q_re1 ) ); } -#endif } if ( outRe[0][1] == 0 ) { @@ -4210,12 +4314,12 @@ static void chol2x2_fx( // 4611686 = 1e-12 in Q62 IF( e2 == 0 ) { - temp = BASOP_Util_Divide3232_Scale_cadence( temp, 4611686, &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( temp, 4611686, &exp ); q_tmp = add( sub( 31, exp ), sub( q_tmp, 62 ) ); } ELSE { - temp = BASOP_Util_Divide3232_Scale_cadence( temp, e2, &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( temp, e2, &exp ); q_tmp = add( sub( 31, exp ), sub( q_tmp, q_e ) ); } if ( temp == 0 ) @@ -4356,19 +4460,14 @@ static void formulate2x2MixingMatrix_fx( // 4611686 = Q62 IF( maxEne_fx == 0 ) { -#ifdef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC maxEneDiv_fx = ONE_DIV_EPSILON_MANT; move32(); q_maxEneDiv = 31 - ONE_DIV_EPSILON_EXP; move16(); -#else - maxEneDiv_fx = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, 4611686, &exp ); // 4611686 = 1e-12f in Q62 - q_maxEneDiv = add( sub( 31, exp ), sub( Q30, 62 ) ); -#endif } ELSE { - maxEneDiv_fx = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, maxEne_fx, &exp ); + maxEneDiv_fx = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, maxEne_fx, &exp ); q_maxEneDiv = add( sub( 31, exp ), sub( Q30, q_maxEne ) ); } exp = norm_l( maxEneDiv_fx ); @@ -4405,9 +4504,10 @@ static void formulate2x2MixingMatrix_fx( Sx_fx[1] = Sqrt32( Sx_fx[1], &exp1 ); move32(); q_Sx = sub( 31, s_max( exp, exp1 ) ); - Sx_fx[0] = L_shr( Sx_fx[0], sub( sub( 31, exp ), q_Sx ) ); // q_Sx + Word16 q_diff = sub( 31, q_Sx ); + Sx_fx[0] = L_shr( Sx_fx[0], sub( q_diff, exp ) ); // q_Sx move32(); - Sx_fx[1] = L_shr( Sx_fx[1], sub( sub( 31, exp1 ), q_Sx ) ); // q_Sx + Sx_fx[1] = L_shr( Sx_fx[1], sub( q_diff, exp1 ) ); // q_Sx move32(); matrixDiagMul_fx( Uxre_fx, Uxim_fx, q_Ux, Sx_fx, q_Sx, Kxre_fx, Kxim_fx, &q_Kx ); @@ -4419,12 +4519,11 @@ static void formulate2x2MixingMatrix_fx( move32(); q_Sx = sub( add( q_Sx, Q14 ), 15 ); - temp = Mpy_32_32( E_in2, 2147484 ); // 2147484 = 0.001f in Q31 + temp = Mpy_32_32( E_in2, INV_1000_Q31 ); temp = L_max( temp, E_in1 ); IF( temp == 0 ) { -#ifdef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC IF( E_out1 == 0 ) { Ghat_fx[0] = 0; @@ -4434,35 +4533,25 @@ static void formulate2x2MixingMatrix_fx( } ELSE { - temp = BASOP_Util_Divide3232_Scale_cadence( E_out1, 4611686, &exp ); // 4611686 = Q62 + temp = BASOP_Util_Divide3232_Scale_newton( E_out1, 4611686, &exp ); // 4611686 = Q62 exp = sub( exp, sub( q_eout, 62 ) ); Ghat_fx[0] = Sqrt32( temp, &exp ); // Q = 31 - exp } -#else - temp = BASOP_Util_Divide3232_Scale_cadence( E_out1, 4611686, &exp ); // 4611686 = Q62 - exp = sub( exp, sub( q_eout, 62 ) ); -#endif } ELSE { temp = BASOP_Util_Add_Mant32Exp( temp, sub( 31, q_ein ), EPSILON_MANT, EPSILON_EXP, &exp_temp ); - temp = BASOP_Util_Divide3232_Scale_cadence( E_out1, temp, &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( E_out1, temp, &exp ); exp = sub( exp, sub( q_eout, sub( 31, exp_temp ) ) ); -#ifdef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC Ghat_fx[0] = Sqrt32( temp, &exp ); // Q = 31 - exp -#endif } -#ifndef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC - Ghat_fx[0] = Sqrt32( temp, &exp ); // Q = 31 - exp -#endif move32(); - temp = Mpy_32_32( E_in1, 2147484 ); // 2147484 = 0.001f in Q31 - temp = L_max( temp, E_in2 ); // q_ein + temp = Mpy_32_32( E_in1, 2147484 ); + temp = L_max( temp, E_in2 ); // q_ein IF( temp == 0 ) { -#ifdef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC IF( E_out2 == 0 ) { /* We can set hard-coded results */ Ghat_fx[1] = 0; @@ -4471,35 +4560,26 @@ static void formulate2x2MixingMatrix_fx( } ELSE { - temp = BASOP_Util_Divide3232_Scale_cadence( E_out2, 4611686, &exp1 ); // 4611686 = Q62 + temp = BASOP_Util_Divide3232_Scale_newton( E_out2, 4611686, &exp1 ); // 4611686 = Q62 exp1 = sub( exp1, sub( q_eout, 62 ) ); Ghat_fx[1] = Sqrt32( temp, &exp1 ); // Q = 31 - exp1 } -#else - temp = BASOP_Util_Divide3232_Scale_cadence( E_out2, 4611686, &exp1 ); // 4611686 = Q62 - exp1 = sub( exp1, sub( q_eout, 62 ) ); -#endif } ELSE { temp = BASOP_Util_Add_Mant32Exp( temp, sub( 31, q_ein ), EPSILON_MANT, EPSILON_EXP, &exp_temp ); - temp = BASOP_Util_Divide3232_Scale_cadence( E_out2, temp, &exp1 ); + temp = BASOP_Util_Divide3232_Scale_newton( E_out2, temp, &exp1 ); exp1 = sub( exp1, sub( q_eout, sub( 31, exp_temp ) ) ); -#ifdef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC Ghat_fx[1] = Sqrt32( temp, &exp1 ); // Q = 31 - exp1 -#endif } -#ifndef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC - Ghat_fx[1] = Sqrt32( temp, &exp1 ); // Q = 31 - exp1 -#endif move32(); q_Ghat = sub( 31, s_max( exp, exp1 ) ); - - Ghat_fx[0] = L_shr( Ghat_fx[0], sub( sub( 31, exp ), q_Ghat ) ); // q_Ghat + q_diff = sub( 31, q_Ghat ); + Ghat_fx[0] = L_shr( Ghat_fx[0], sub( q_diff, exp ) ); // q_Ghat move32(); - Ghat_fx[1] = L_shr( Ghat_fx[1], sub( sub( 31, exp1 ), q_Ghat ) ); // q_Ghat + Ghat_fx[1] = L_shr( Ghat_fx[1], sub( q_diff, exp1 ) ); // q_Ghat move32(); /* Matrix multiplication, tmp = Ky' * G_hat * Q */ @@ -4513,8 +4593,8 @@ static void formulate2x2MixingMatrix_fx( q_GhatQ = sub( add( Q31, q_Ghat ), 31 ); exp = sub( s_min( L_norm_arr( KyRe_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ), L_norm_arr( KyIm_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ) ), 1 ); - scale_sig32( KyRe_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), exp ); - scale_sig32( KyIm_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), exp ); + scale_sig32( KyRe_fx[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, exp ); + scale_sig32( KyIm_fx[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, exp ); q_ky = add( q_ky, exp ); FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) @@ -4522,7 +4602,7 @@ static void formulate2x2MixingMatrix_fx( FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) { tmpRe_fx[chA][chB] = Madd_32_32( Mpy_32_32( KyRe_fx[0][chA], GhatQ_fx[0][chB] ), KyRe_fx[1][chA], GhatQ_fx[1][chB] ); - tmpIm_fx[chA][chB] = Msub_32_32( Mpy_32_32( -KyIm_fx[0][chA], GhatQ_fx[0][chB] ), KyIm_fx[1][chA], GhatQ_fx[1][chB] ); + tmpIm_fx[chA][chB] = Msub_32_32( Mpy_32_32( L_negate( KyIm_fx[0][chA] ), GhatQ_fx[0][chB] ), KyIm_fx[1][chA], GhatQ_fx[1][chB] ); move32(); move32(); } @@ -4539,42 +4619,43 @@ static void formulate2x2MixingMatrix_fx( eig2x2_fx( tmpRe_fx[0][0], tmpRe_fx[1][1], q_temp, tmpRe_fx[1][0], tmpIm_fx[1][0], q_temp, Ure_fx, Uim_fx, &q_U, D_fx, &q_D ); + IF( D_fx[0] != 0 && D_fx[1] == 0 ) // Due to an eig2x2 error, sometimes D_fx[1] becomes zero, which implies that the input matrix should be singular (i.e., determinant = 0). + { + Word32 det_fx = L_sub_sat( Mult_32_32( tmpRe_fx[0][0], tmpRe_fx[1][1] ), + L_add_sat( Mult_32_32( tmpRe_fx[1][0], tmpRe_fx[1][0] ), + Mult_32_32( tmpIm_fx[1][0], tmpIm_fx[1][0] ) ) ); + if ( det_fx != 0 ) + { + D_fx[1] = SMALL_EIGENVALUE; // Setting D_fx[1] to epsilon has no effect, as the value is too small to affect the output. + move32(); + } + } + IF( D_fx[0] == 0 ) { -#ifndef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC - temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, 4611686, &exp ); // 4611686 = 1e-12 in Q62 - exp = sub( exp, sub( Q30, 62 ) ); -#else temp = ONE_DIV_EPSILON_MANT; /* Result of 1.0/eps with full precision */ + move32(); exp = ONE_DIV_EPSILON_EXP; -#endif + move16(); } ELSE { - temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, D_fx[0], &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, D_fx[0], &exp ); exp = sub( exp, sub( Q30, q_D ) ); } div_fx[0] = Sqrt32( temp, &exp ); // Q = 31 - exp move32(); - IF( D_fx[1] == 0 ) - { -#ifndef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC - temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, 4611686, &exp1 ); // 4611686 = 1e-12 in Q62 - exp1 = sub( exp1, sub( Q30, 62 ) ); -#else - temp = ONE_DIV_EPSILON_MANT; /* Result of 1.0/eps with full precision */ - exp1 = ONE_DIV_EPSILON_EXP; -#endif - } - ELSE + // Sqrt(1) + div_fx[1] = L_add( 0, 2047986068 ); // Q = 31 - exp1 + exp1 = add( 0, 20 ); + + IF( D_fx[1] != 0 ) // This is the new code: replace div sqrt by isqrt { - temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, D_fx[1], &exp1 ); - exp1 = sub( exp1, sub( Q30, q_D ) ); + exp1 = sub( 31, q_D ); + div_fx[1] = ISqrt32( D_fx[1], &exp1 ); + move32(); } - div_fx[1] = Sqrt32( temp, &exp1 ); // Q = 31 - exp1 - move32(); - q_div = sub( 31, s_max( exp, exp1 ) ); div_fx[0] = L_shr( div_fx[0], sub( sub( 31, exp ), q_div ) ); // q_div @@ -4583,22 +4664,9 @@ static void formulate2x2MixingMatrix_fx( move32(); // 1310720000 = 10,000.0f in Q17 - IF( LT_16( q_div, Q17 ) ) - { - div_fx[0] = L_min( L_shr( 1310720000, sub( Q17, q_div ) ), div_fx[0] ); // q_div - move32(); - div_fx[1] = L_min( L_shr( 1310720000, sub( Q17, q_div ) ), div_fx[1] ); // q_div - move32(); - } - ELSE - { - div_fx[0] = L_min( 1310720000, L_shr( div_fx[0], sub( q_div, Q17 ) ) ); - move32(); - div_fx[1] = L_min( 1310720000, L_shr( div_fx[1], sub( q_div, Q17 ) ) ); - move32(); - q_div = Q17; - move16(); - } + Word32 thresh = L_shl_sat( 1310720000, sub( q_div, Q17 ) ); // q_div + div_fx[0] = L_min( div_fx[0], thresh ); // q_div + div_fx[1] = L_min( div_fx[1], thresh ); // q_div matrixMul_fx( Are_fx, Aim_fx, &q_A, Ure_fx, Uim_fx, &q_U, tmpRe_fx, tmpIm_fx, &q_temp ); @@ -4615,12 +4683,10 @@ static void formulate2x2MixingMatrix_fx( W_tmp = W_mult0_32_32( tmpRe_fx[chA][chB], div_fx[chB] ); IF( W_tmp != 0 ) { - hdrm_re[chA][chB] = sub( W_norm( W_tmp ), 0 ); - move16(); - W_tmp = W_shl( W_tmp, hdrm_re[chA][chB] ); - tmpRe_fx[chA][chB] = W_extract_h( W_tmp ); + Word16 hdrm = sub( W_norm( W_tmp ), 32 ); + tmpRe_fx[chA][chB] = W_shl_sat_l( W_tmp, hdrm ); move32(); - hdrm_re[chA][chB] = sub( add( add( q_temp, q_div ), hdrm_re[chA][chB] ), 32 ); + hdrm_re[chA][chB] = add( add( q_temp, q_div ), hdrm ); move16(); } ELSE @@ -4632,12 +4698,11 @@ static void formulate2x2MixingMatrix_fx( W_tmp = W_mult0_32_32( tmpIm_fx[chA][chB], div_fx[chB] ); IF( W_tmp != 0 ) { - hdrm_im[chA][chB] = sub( W_norm( W_tmp ), 0 ); + Word16 hdrm = sub( W_norm( W_tmp ), 32 ); move16(); - W_tmp = W_shl( W_tmp, hdrm_im[chA][chB] ); - tmpIm_fx[chA][chB] = W_extract_h( W_tmp ); + tmpIm_fx[chA][chB] = W_shl_sat_l( W_tmp, hdrm ); move32(); - hdrm_im[chA][chB] = sub( add( add( q_temp, q_div ), hdrm_im[chA][chB] ), 32 ); + hdrm_im[chA][chB] = add( add( q_temp, q_div ), hdrm ); move16(); } ELSE @@ -4651,8 +4716,9 @@ static void formulate2x2MixingMatrix_fx( minimum_s( hdrm_re[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), &exp ); q_temp = exp; move16(); - minimum_s( hdrm_im[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), &exp ); + minimum_s( hdrm_im[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, &exp ); q_temp = s_min( q_temp, exp ); + q_temp = sub( q_temp, 1 ); FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { @@ -4666,10 +4732,8 @@ static void formulate2x2MixingMatrix_fx( } matrixTransp2Mul_fx( tmpRe_fx, tmpIm_fx, &q_temp, Ure_fx, Uim_fx, &q_U, -#ifdef FIX_1072_SPEEDUP_matrixTransp2Mul_fx - 1 /*int Ascale*/, + 0 /*int Ascale*/, 0 /*int Bscale*/, -#endif Pre_fx, Pim_fx, &q_P ); /* Nearest orthonormal matrix P to matrix A formulated */ /* These are the final formulas of the JAES publication M = Ky P Kx^(-1) */ @@ -4680,7 +4744,6 @@ static void formulate2x2MixingMatrix_fx( { IF( Sx_fx[chB] == 0 ) { -#ifdef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC Pre_fx[chA][chB] = Mpy_32_32( Pre_fx[chA][chB], ONE_DIV_EPSILON_MANT ); // q_Pre[chA][chB] = add(sub(31, q_P), 31 - ONE_DIV_EPSILON_EXP); q_Pre[chA][chB] = sub( 62 - ONE_DIV_EPSILON_EXP, q_P ); @@ -4689,27 +4752,13 @@ static void formulate2x2MixingMatrix_fx( Pim_fx[chA][chB] = Mpy_32_32( Pim_fx[chA][chB], ONE_DIV_EPSILON_MANT ); // q_Pim[chA][chB] = add(sub(31, q_P), 31 - ONE_DIV_EPSILON_EXP); q_Pim[chA][chB] = sub( 62 - ONE_DIV_EPSILON_EXP, q_P ); -#else - Pre_fx[chA][chB] = BASOP_Util_Divide3232_Scale_cadence( Pre_fx[chA][chB], 4611686, &exp ); // 4611686 = 1e-12 in Q62 - q_Pre[chA][chB] = add( sub( q_P, 62 ), sub( 31, exp ) ); - Pim_fx[chA][chB] = BASOP_Util_Divide3232_Scale_cadence( Pim_fx[chA][chB], 4611686, &exp ); // 4611686 = 1e-12 in Q62 - q_Pim[chA][chB] = add( sub( q_P, 62 ), sub( 31, exp ) ); -#endif } ELSE { -#ifdef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC Word16 Pre_shift, Pim_shift; -#endif temp = BASOP_Util_Add_Mant32Exp( Sx_fx[chB], sub( 31, q_Sx ), EPSILON_MANT, EPSILON_EXP, &exp_temp ); -#ifndef FIX_1009_REPLACE_DIV_SQRT_BY_ISQRT_LC - Pre_fx[chA][chB] = BASOP_Util_Divide3232_Scale_cadence( Pre_fx[chA][chB], temp, &exp ); - q_Pre[chA][chB] = add( sub( q_P, sub( 31, exp_temp ) ), sub( 31, exp ) ); - Pim_fx[chA][chB] = BASOP_Util_Divide3232_Scale_cadence( Pim_fx[chA][chB], temp, &exp ); - q_Pim[chA][chB] = add( sub( q_P, sub( 31, exp_temp ) ), sub( 31, exp ) ); -#else - temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, temp, &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, temp, &exp ); Pre_shift = norm_l( Pre_fx[chA][chB] ); Pim_shift = norm_l( Pim_fx[chA][chB] ); Pre_fx[chA][chB] = Mpy_32_32( L_shl( Pre_fx[chA][chB], Pre_shift ), temp ); @@ -4717,7 +4766,6 @@ static void formulate2x2MixingMatrix_fx( q_temp = add( sub( sub( q_P, exp ), sub( 31, Q30 ) ), exp_temp ); q_Pre[chA][chB] = add( q_temp, Pre_shift ); q_Pim[chA][chB] = add( q_temp, Pim_shift ); -#endif } if ( Pre_fx[chA][chB] == 0 ) { @@ -4754,7 +4802,7 @@ static void formulate2x2MixingMatrix_fx( { Word16 Pre_shift, Pim_shift; temp = BASOP_Util_Add_Mant32Exp( Sx_fx[chB], sub( 31, q_Sx ), EPSILON_MANT, EPSILON_EXP, &exp_temp ); - temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, temp, &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, temp, &exp ); q_temp = add( sub( sub( q_P, exp ), sub( 31, Q30 ) ), exp_temp ); Pre_shift = norm_l( Pre_fx[0][chB] ); @@ -4801,9 +4849,9 @@ static void formulate2x2MixingMatrix_fx( move16(); } #endif - minimum_s( q_Pre[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), &exp ); + minimum_s( q_Pre[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, &exp ); q_P = s_min( q_P, exp ); - minimum_s( q_Pim[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), &exp ); + minimum_s( q_Pim[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, &exp ); q_P = s_min( q_P, exp ); FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) @@ -4820,10 +4868,8 @@ static void formulate2x2MixingMatrix_fx( matrixMul_fx( KyRe_fx, KyIm_fx, &q_ky, Pre_fx, Pim_fx, &q_P, tmpRe_fx, tmpIm_fx, &q_temp ); matrixTransp2Mul_fx( tmpRe_fx, tmpIm_fx, &q_temp, Uxre_fx, Uxim_fx, &q_Ux, -#ifdef FIX_1072_SPEEDUP_matrixTransp2Mul_fx 1 /*int Ascale*/, 0 /*int Bscale*/, -#endif Mre_fx, Mim_fx, q_M ); return; } @@ -4840,14 +4886,14 @@ static void getDirectPartGains_fx( const UWord8 renderStereoOutputInsteadOfBinaural, Word32 Rmat[3][3], /*Q30*/ PARAMBIN_HRTF_GAIN_CACHE *gainCache, - const Word16 isHeadtracked ) + const Word16 isHeadtracked, + HRTFS_PARAMBIN_HANDLE hHrtfParambin ) { - // float aziRad, eleRad; Word32 y, mappedX; Word16 aziRadMapped, A, A2, A3; const Word16 LsAngleRad = 17157; // Q15 move16(); - Word32 *ptr_sin, *ptr_cos; + const Word32 *ptr_sin, *ptr_cos; Word32 sin_val, cos_val; Word16 e_mappedX; @@ -4856,120 +4902,144 @@ static void getDirectPartGains_fx( IF( renderStereoOutputInsteadOfBinaural ) /* In stereo (i.e. non-binaural) rendering mode */ { - /* Convert azi and ele to an azi value of the cone of confusion */ - - // y = ( sinf( aziRad ) * cosf( eleRad ) ); - - IF( GT_16( abs_s( eleDeg ), 180 ) ) - { - // cos(180 + x) = -cos(x) - cos_val = -ptr_cos[sub( abs_s( eleDeg ), 180 )]; // Q31 - } - ELSE - { - cos_val = ptr_cos[abs_s( eleDeg )]; // Q31 - } - move32(); - - IF( GT_16( aziDeg, 180 ) ) - { - // sin(180 + x) = -sin(x) - sin_val = -ptr_sin[sub( aziDeg, 180 )]; // Q31 - } - ELSE IF( LT_16( aziDeg, -180 ) ) - { - // sin(-(180 + x)) = sin(180 + x) = sinx - sin_val = ptr_sin[sub( abs_s( aziDeg ), 180 )]; // Q31 - } - ELSE - { - sin_val = ptr_sin[aziDeg]; // Q31 - } - move32(); - - y = Mpy_32_32( sin_val, cos_val ); // Q31 - e_mappedX = 0; - move16(); - mappedX = Sqrt32( L_max( 0, L_sub( ONE_IN_Q31, Mpy_32_32( y, y ) ) ), &e_mappedX ); - - aziRadMapped = BASOP_util_atan2( y, mappedX, negate( e_mappedX ) ); // Q13 - - /* Determine the real valued amplitude panning gains */ *lImagp = 0; *rImagp = 0; move32(); move32(); - IF( GE_16( aziRadMapped, shr( LsAngleRad, 2 ) ) ) - { /* Left side */ - *lRealp = ONE_IN_Q31; - *rRealp = 0; - move32(); - move32(); - } - ELSE IF( LE_16( aziRadMapped, negate( shr( LsAngleRad, 2 ) ) ) ) - { /* Right side */ - *lRealp = 0; - *rRealp = ONE_IN_Q31; + + test(); + IF( EQ_16( aziDeg, gainCache->azi ) && EQ_16( eleDeg, gainCache->ele ) ) + { + *lRealp = gainCache->shVec_fx[0]; /* Reused memory */ + *rRealp = gainCache->shVec_fx[1]; /* Reused memory */ move32(); move32(); } - ELSE /* Tangent panning law */ + ELSE { - Word16 e_div, div, e_a, e_a3, temp_16_1, temp_16_2, e_num, e_den; - div = BASOP_Util_Divide3232_Scale( y, mappedX, &e_div ); - e_div = sub( e_div, e_mappedX ); + /* Convert azi and ele to an azi value of the cone of confusion */ - A = mult( div, INV_TAN30_FX ); - e_a = add( e_div, 1 ); + // y = ( sinf( aziRad ) * cosf( eleRad ) ); - e_num = BASOP_Util_Add_MantExp( A, e_a, -32767, 0, &temp_16_1 ); - e_den = BASOP_Util_Add_MantExp( A, e_a, 32767, 0, &temp_16_2 ); - IF( temp_16_2 <= 0 ) + IF( GT_16( abs_s( eleDeg ), 180 ) ) { - temp_16_2 = 32; - e_den = 0; - move16(); - move16(); + // cos(180 + x) = -cos(x) + cos_val = -ptr_cos[sub( abs_s( eleDeg ), 180 )]; // Q31 + } + ELSE + { + cos_val = ptr_cos[abs_s( eleDeg )]; // Q31 } - A2 = BASOP_Util_Divide1616_Scale( temp_16_1, temp_16_2, &e_div ); - e_div = add( e_div, sub( e_num, e_den ) ); - - e_den = BASOP_Util_Add_MantExp( mult( A2, A2 ), add( e_div, e_div ), 32767, 0, &temp_16_2 ); - A3 = BASOP_Util_Divide1616_Scale( 32767, temp_16_2, &e_a3 ); - e_a3 = sub( e_a3, e_den ); - // A3 = 1.0f / ( A2 * A2 + 1.0f ); // Q15 - Word32 temp_32 = L_shr( L_deposit_h( A3 ), sub( 0, e_a3 ) ); - Word16 temp_e = 0; - e_a3 = 0; - move16(); - move16(); - *lRealp = Sqrt32( temp_32, &e_a3 ); - *rRealp = Sqrt32( L_sub( ONE_IN_Q31, temp_32 ), &temp_e ); - *lRealp = L_shr( *lRealp, sub( 0, e_a3 ) ); // Q31 - *rRealp = L_shr( *rRealp, sub( 0, temp_e ) ); // Q31 - move32(); - move32(); move32(); + + IF( GT_16( aziDeg, 180 ) ) + { + // sin(180 + x) = -sin(x) + sin_val = -ptr_sin[sub( aziDeg, 180 )]; // Q31 + } + ELSE IF( LT_16( aziDeg, -180 ) ) + { + // sin(-(180 + x)) = sin(180 + x) = sinx + sin_val = ptr_sin[sub( abs_s( aziDeg ), 180 )]; // Q31 + } + ELSE + { + sin_val = ptr_sin[aziDeg]; // Q31 + } move32(); - } - /* Scaling to have the same expected gain as for the HRTF rendering */ - *lRealp = Mpy_32_32( *lRealp, SQRT2_FIXED ); // Q30 - *rRealp = Mpy_32_32( *rRealp, SQRT2_FIXED ); // Q30 + y = Mpy_32_32( sin_val, cos_val ); // Q31 + e_mappedX = 0; + move16(); + mappedX = Sqrt32( L_max( 0, L_sub( ONE_IN_Q31, Mpy_32_32( y, y ) ) ), &e_mappedX ); - *lRealp = L_shr( *lRealp, 2 ); // Q28 - *rRealp = L_shr( *rRealp, 2 ); // Q28 - move32(); - move32(); - move32(); - move32(); - } - ELSE /* In regular binaural rendering mode */ + aziRadMapped = BASOP_util_atan2( y, mappedX, negate( e_mappedX ) ); // Q13 + + /* Determine the real valued amplitude panning gains */ + move32(); + move32(); + IF( GE_16( aziRadMapped, shr( LsAngleRad, 2 ) ) ) + { /* Left side */ + *lRealp = ONE_IN_Q31; + *rRealp = 0; + move32(); + move32(); + } + ELSE IF( LE_16( aziRadMapped, negate( shr( LsAngleRad, 2 ) ) ) ) + { /* Right side */ + *lRealp = 0; + *rRealp = ONE_IN_Q31; + move32(); + move32(); + } + ELSE /* Tangent panning law */ + { + Word16 e_div, div, e_a, e_a3, temp_16_1, temp_16_2, e_num, e_den; + div = BASOP_Util_Divide3232_Scale( y, mappedX, &e_div ); + e_div = sub( e_div, e_mappedX ); + + A = mult( div, INV_TAN30_FX ); + e_a = add( e_div, 1 ); + + e_num = BASOP_Util_Add_MantExp( A, e_a, -32767, 0, &temp_16_1 ); + e_den = BASOP_Util_Add_MantExp( A, e_a, 32767, 0, &temp_16_2 ); + IF( temp_16_2 <= 0 ) + { + temp_16_2 = 32; + e_den = 0; + move16(); + move16(); + } + A2 = BASOP_Util_Divide1616_Scale( temp_16_1, temp_16_2, &e_div ); + e_div = add( e_div, sub( e_num, e_den ) ); + + e_den = BASOP_Util_Add_MantExp( mult( A2, A2 ), add( e_div, e_div ), 32767, 0, &temp_16_2 ); + A3 = BASOP_Util_Divide1616_Scale( 32767, temp_16_2, &e_a3 ); + e_a3 = sub( e_a3, e_den ); + // A3 = 1.0f / ( A2 * A2 + 1.0f ); // Q15 + Word32 temp_32 = L_shr( L_deposit_h( A3 ), sub( 0, e_a3 ) ); + Word16 temp_e = 0; + e_a3 = 0; + move16(); + move16(); + *lRealp = Sqrt32( temp_32, &e_a3 ); + *rRealp = Sqrt32( L_sub( ONE_IN_Q31, temp_32 ), &temp_e ); + *lRealp = L_shr( *lRealp, sub( 0, e_a3 ) ); // Q31 + *rRealp = L_shr( *rRealp, sub( 0, temp_e ) ); // Q31 + move32(); + move32(); + move32(); + move32(); + } + + /* Scaling to have the same expected gain as for the HRTF rendering */ + *lRealp = Mpy_32_32( *lRealp, SQRT2_FX ); // Q30 + *rRealp = Mpy_32_32( *rRealp, SQRT2_FX ); // Q30 + + *lRealp = L_shr( *lRealp, 2 ); // Q28 + *rRealp = L_shr( *rRealp, 2 ); // Q28 + move32(); + move32(); + move32(); + move32(); + + /* Store to gain cache */ + gainCache->azi = aziDeg; + gainCache->ele = eleDeg; + gainCache->shVec_fx[0] = *lRealp; /* Reuse memory */ + gainCache->shVec_fx[1] = *rRealp; /* Reuse memory */ + move16(); + move16(); + move32(); + move32(); + } + } + ELSE /* In regular binaural rendering mode */ { test(); IF( EQ_16( aziDeg, gainCache->azi ) && EQ_16( eleDeg, gainCache->ele ) ) { - hrtfShGetHrtf_fx( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, TRUE ); + hrtfShGetHrtf_fx( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, TRUE, hHrtfParambin ); } ELSE { @@ -4984,13 +5054,14 @@ static void getDirectPartGains_fx( // eleDeg = L_shr(eleDeg_32, 22); // aziDeg = L_shr(aziDeg_32, 22); } - hrtfShGetHrtf_fx( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, FALSE ); + hrtfShGetHrtf_fx( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, FALSE, hHrtfParambin ); } } return; } + static void hrtfShGetHrtf_fx( const Word16 bin, const Word16 aziDeg, @@ -5000,9 +5071,15 @@ static void hrtfShGetHrtf_fx( Word32 *rRealp, Word32 *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, - const Word16 useCachedValue ) + const Word16 useCachedValue, + HRTFS_PARAMBIN_HANDLE hHrtfParambin ) { Word16 k; + Word16( *hrtfShCoeffsReInt_fx )[16][60]; + Word16( *hrtfShCoeffsImInt_fx )[16][60]; + + hrtfShCoeffsReInt_fx = hHrtfParambin->hrtfShCoeffsRe_fx; + hrtfShCoeffsImInt_fx = hHrtfParambin->hrtfShCoeffsIm_fx; *lRealp = 0; *lImagp = 0; @@ -5020,10 +5097,10 @@ static void hrtfShGetHrtf_fx( FOR( k = 0; k < HRTF_SH_CHANNELS; k++ ) { - *lRealp = Madd_32_16( *lRealp, shVec[k], hrtfShCoeffsRe_fx[0][k][bin] ); // Q28 - *lImagp = Madd_32_16( *lImagp, shVec[k], hrtfShCoeffsIm_fx[0][k][bin] ); // Q28 - *rRealp = Madd_32_16( *rRealp, shVec[k], hrtfShCoeffsRe_fx[1][k][bin] ); // Q28 - *rImagp = Madd_32_16( *rImagp, shVec[k], hrtfShCoeffsIm_fx[1][k][bin] ); // Q28 + *lRealp = Madd_32_16( *lRealp, shVec[k], hrtfShCoeffsReInt_fx[0][k][bin] ); // Q28 + *lImagp = Madd_32_16( *lImagp, shVec[k], hrtfShCoeffsImInt_fx[0][k][bin] ); // Q28 + *rRealp = Madd_32_16( *rRealp, shVec[k], hrtfShCoeffsReInt_fx[1][k][bin] ); // Q28 + *rImagp = Madd_32_16( *rImagp, shVec[k], hrtfShCoeffsImInt_fx[1][k][bin] ); // Q28 move32(); move32(); move32(); @@ -5034,19 +5111,15 @@ static void hrtfShGetHrtf_fx( { Word32 shVec[HRTF_SH_CHANNELS]; - ivas_dirac_dec_get_response_fx( aziDeg, - eleDeg, - shVec, - HRTF_SH_ORDER, - Q29 ); + ivas_dirac_dec_get_response_fx( aziDeg, eleDeg, shVec, HRTF_SH_ORDER, Q29 ); FOR( k = 0; k < HRTF_SH_CHANNELS; k++ ) { - *lRealp = Madd_32_16( *lRealp, shVec[k], hrtfShCoeffsRe_fx[0][k][bin] ); // Q28 - *lImagp = Madd_32_16( *lImagp, shVec[k], hrtfShCoeffsIm_fx[0][k][bin] ); // Q28 - *rRealp = Madd_32_16( *rRealp, shVec[k], hrtfShCoeffsRe_fx[1][k][bin] ); // Q28 - *rImagp = Madd_32_16( *rImagp, shVec[k], hrtfShCoeffsIm_fx[1][k][bin] ); // Q28 - gainCache->shVec_fx[k] = shVec[k]; // Q29 + *lRealp = Madd_32_16( *lRealp, shVec[k], hrtfShCoeffsReInt_fx[0][k][bin] ); // Q28 + *lImagp = Madd_32_16( *lImagp, shVec[k], hrtfShCoeffsImInt_fx[0][k][bin] ); // Q28 + *rRealp = Madd_32_16( *rRealp, shVec[k], hrtfShCoeffsReInt_fx[1][k][bin] ); // Q28 + *rImagp = Madd_32_16( *rImagp, shVec[k], hrtfShCoeffsImInt_fx[1][k][bin] ); // Q28 + gainCache->shVec_fx[k] = shVec[k]; // Q29 move32(); move32(); move32(); @@ -5139,29 +5212,51 @@ Word16 configure_reqularization_factor_fx( return reqularizationFactor; } + /*-------------------------------------------------------------------* - * ivas_omasa_preProcessStereoTransportsForMovedObjects_fx() + * ivas_omasa_preProcessStereoTransportsForEditedObjects() * * *-------------------------------------------------------------------*/ -void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( +void ivas_omasa_preProcessStereoTransportsForEditedObjects_fx( Decoder_Struct *st_ivas, - Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /*cldfb_buf_q*/ - Word32 inIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /*cldfb_buf_q*/ + Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + Word32 inIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word16 *cldfb_buf_q, const Word16 nBins, const Word16 subframe ) { - Word16 bin, ch, inCh, outCh, ismDirIndex, slot; + Word16 bin, ch, inCh, outCh, ismDirIndex, slot, band_idx, bin_lo, bin_hi, max_band, n_ism; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; MASA_ISM_DATA_HANDLE hMasaIsmData; + PARAM_ISM_DEC_HANDLE hParamIsmDec; UWord8 enableCentering; Word16 dirac_read_idx; Word16 nSlots; + Word16 panGainsOut[4][2]; + Word16 panGainsIn[4][2]; + Word16 panEnesOut[4][2]; + Word16 panEnesIn[4][2]; + UWord8 ismGainEdited[4]; + UWord8 ismDirEdited[4]; + UWord8 masaGainEdited; + UWord8 masaIsmMode; hSpatParamRendCom = st_ivas->hSpatParamRendCom; hMasaIsmData = st_ivas->hMasaIsmData; + hParamIsmDec = st_ivas->hParamIsmDec; + + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + masaIsmMode = 1; + move16(); + } + ELSE + { + masaIsmMode = 0; + move16(); + } test(); test(); @@ -5176,317 +5271,1146 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( move16(); } - /* Bypass processing until first object is moved */ - IF( hMasaIsmData->objectsMoved == 0 ) + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + n_ism = st_ivas->nchan_ism; + move16(); + } + ELSE + { + n_ism = hSpatParamRendCom->numIsmDirections; + move16(); + } + + FOR( ismDirIndex = 0; ismDirIndex < n_ism; ismDirIndex++ ) + { + ismGainEdited[ismDirIndex] = hMasaIsmData->ism_gain_is_edited[ismDirIndex]; + move16(); + ismDirEdited[ismDirIndex] = hMasaIsmData->ism_dir_is_edited[ismDirIndex]; + move16(); + } + masaGainEdited = hMasaIsmData->masa_gain_is_edited; + move16(); + + /* Bypass processing until first object is moved or gained */ + IF( EQ_32( hMasaIsmData->objectsEdited, 0 ) ) { - FOR( ismDirIndex = 0; ismDirIndex < hSpatParamRendCom->numIsmDirections; ismDirIndex++ ) + FOR( ismDirIndex = 0; ismDirIndex < n_ism; ismDirIndex++ ) { - if ( hMasaIsmData->ism_is_edited[ismDirIndex] ) + IF( ismDirEdited[ismDirIndex] ) { - hMasaIsmData->objectsMoved = 1; + hMasaIsmData->objectsEdited = 1; + move16(); + } + + IF( ismGainEdited[ismDirIndex] ) + { + hMasaIsmData->objectsEdited = 1; move16(); } } - IF( hMasaIsmData->objectsMoved == 0 ) + + IF( masaGainEdited ) + { + hMasaIsmData->objectsEdited = 1; + move16(); + } + + IF( EQ_32( hMasaIsmData->objectsEdited, 0 ) ) { /* No objects have moved so far */ return; } } - /* Perform object-movement based processing */ - nSlots = hSpatParamRendCom->subframe_nbslots[subframe]; - move16(); - dirac_read_idx = hSpatParamRendCom->render_to_md_map[subframe]; - move16(); + /* OMASA gaining for discrete OMASA mode with stereo_param/bin_room_param renderer */ + test(); + test(); + test(); + IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + /* ISM gaining */ + FOR( ch = 0; ch < n_ism; ch++ ) + { + IF( st_ivas->hMasaIsmData->ism_gain_is_edited[ch] ) + { + FOR( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ ) + { + Word16 gain; + gain = st_ivas->hMasaIsmData->gain_ism_edited_fx[ch]; + move32(); - FOR( bin = 0; bin < nBins; bin++ ) + v_multc_fx_16( inRe_fx[ch + 2][slot], gain, inRe_fx[ch + 2][slot], nBins ); // Q = *cldfb_buf_q - 3 + Scale_sig32( inRe_fx[ch + 2][slot], nBins, Q3 ); // Q = *cldfb_buf_q + + v_multc_fx_16( inIm_fx[ch + 2][slot], gain, inIm_fx[ch + 2][slot], nBins ); // Q = *cldfb_buf_q - 3 + Scale_sig32( inIm_fx[ch + 2][slot], nBins, Q3 ); // Q = *cldfb_buf_q + } + } + } + + /* MASA gaining */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + IF( masaGainEdited ) + { + FOR( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ ) + { + Word16 gain_masa; + gain_masa = st_ivas->hMasaIsmData->gain_masa_edited_fx; + move32(); + + v_multc_fx_16( inRe_fx[ch][slot], gain_masa, inRe_fx[ch][slot], nBins ); // Q = *cldfb_buf_q - 3 + Scale_sig32( inRe_fx[ch][slot], nBins, Q3 ); // Q = *cldfb_buf_q + + v_multc_fx_16( inIm_fx[ch][slot], gain_masa, inIm_fx[ch][slot], nBins ); // Q = *cldfb_buf_q - 3 + Scale_sig32( inIm_fx[ch][slot], nBins, Q3 ); // Q = *cldfb_buf_q + } + } + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && st_ivas->hISMDTX.dtx_flag ) /* If dtx on, perform just the smoothing of the processing gains */ { - Word16 ismPreprocMtxNew_fx[2][2]; - Word16 ismPreprocMtxIncrement_fx[2][2]; - Word16 eneMove_fx[2]; - Word16 enePreserve_fx[2]; - Word16 ismRatioAcc_fx; - Word32 subframeEne_fx; - Word32 Enes_fx[2]; - Word16 normEnes_fx[2]; - Word16 remainderNormEne_fx; - Word16 normEnes_q_fx[2], temp_q = 0; - Word16 eneMove_q_fx[2], enePreserve_q_fx[2], temp1; + Word32 totalTargetEne; + Word32 ismPreprocMtxNew[2][2]; + Word32 ismPreprocMtxIncrement[2][2]; + Word32 outSlotRe[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 outSlotIm[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 eqVal; Word32 temp; + Word16 temp_q; + Word64 temp64; + Word16 exp1; + Word16 totalTargetEne_e; - set16_fx( ismPreprocMtxNew_fx[0], 0, 2 ); - set16_fx( ismPreprocMtxNew_fx[1], 0, 2 ); - set16_fx( ismPreprocMtxIncrement_fx[0], 0, 2 ); - set16_fx( ismPreprocMtxIncrement_fx[1], 0, 2 ); - set16_fx( eneMove_fx, 0, 2 ); - set16_fx( enePreserve_fx, 0, 2 ); - ismRatioAcc_fx = 0; + nSlots = hSpatParamRendCom->subframe_nbslots[subframe]; move16(); - subframeEne_fx = 0; + + /* Use diagonal mixing matrix as the instant mixing matrix, to slowly fade away the editing during dtx */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + ismPreprocMtxNew[ch][ch] = ONE_IN_Q28; + move32(); + ismPreprocMtxNew[sub( 1, ch )][ch] = 0; + move32(); + } + + /* Determine the highest band */ + max_band = 0; + move16(); + test(); + WHILE( GT_16( sub( MAX_PARAM_ISM_NBANDS, max_band ), 0 ) && GT_16( sub( nBins, hParamIsmDec->hParamIsm->band_grouping[max_band] ), 0 ) ) + { + max_band++; + } + + /* Init out array */ + FOR( slot = 0; slot < nSlots; slot++ ) + { + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + set32_fx( outSlotRe[ch][slot], 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( outSlotIm[ch][slot], 0, CLDFB_NO_CHANNELS_MAX ); + } + } + + // /* Perform the processing in frequency bands */ + FOR( band_idx = 0; band_idx < max_band; band_idx++ ) + { + bin_lo = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + bin_hi = s_min( hParamIsmDec->hParamIsm->band_grouping[band_idx + 1], nBins ); + move16(); + move16(); + + /* Determine transport energies */ + totalTargetEne = 0; + totalTargetEne_e = 0; + move32(); + move16(); + FOR( slot = 0; slot < nSlots; slot++ ) + { + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + + Word32 instEne_fx; + temp64 = W_mult0_32_32( inRe_fx[ch][slot][bin], inRe_fx[ch][slot][bin] ); // 2q-3 + temp64 = W_add( temp64, W_mult0_32_32( inIm_fx[ch][slot][bin], inIm_fx[ch][slot][bin] ) ); // 2q-3 + exp1 = W_norm( temp64 ); + instEne_fx = W_extract_h( W_shl( temp64, exp1 ) ); // 2*cldfb_buf_q - 32 + exp1 + exp1 = 31 - ( 2 * ( *cldfb_buf_q ) - 32 + exp1 ); + move16(); + + BASOP_Util_Add_Mant32Exp( totalTargetEne, totalTargetEne_e, instEne_fx, exp1, &totalTargetEne_e ); + } + } + } + + /* Get increment value for temporal interpolation */ + FOR( inCh = 0; inCh < BINAURAL_CHANNELS; inCh++ ) + { + FOR( outCh = 0; outCh < BINAURAL_CHANNELS; outCh++ ) + { + temp = L_sub( ismPreprocMtxNew[outCh][inCh], hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][band_idx] ); // Q28 + ismPreprocMtxIncrement[outCh][inCh] = L_shr( temp, 2 ); // Divide by 4 + move32(); + } + } + + /* Mix signals */ + hMasaIsmData->preprocEneTarget_fx[band_idx] = Mpy_32_16_1( hMasaIsmData->preprocEneTarget_fx[band_idx], STEREO_PREPROCESS_IIR_FACTOR_Q15 ); // Q = preprocEneTarget_e + move32(); + + hMasaIsmData->preprocEneRealized_fx[band_idx] = Mpy_32_16_1( hMasaIsmData->preprocEneRealized_fx[band_idx], STEREO_PREPROCESS_IIR_FACTOR_Q15 ); // Q = preprocEneRealized_e + move32(); + + hMasaIsmData->preprocEneTarget_fx[band_idx] = BASOP_Util_Add_Mant32Exp( hMasaIsmData->preprocEneTarget_fx[band_idx], hMasaIsmData->preprocEneTarget_e[band_idx], totalTargetEne, totalTargetEne_e, &hMasaIsmData->preprocEneTarget_e[band_idx] ); // Q = 31-preprocEneTarget_e + move32(); + + FOR( outCh = 0; outCh < BINAURAL_CHANNELS; outCh++ ) + { + FOR( slot = 0; slot < nSlots; slot++ ) + { + FOR( inCh = 0; inCh < BINAURAL_CHANNELS; inCh++ ) + { + hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][band_idx] = L_add( hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][band_idx], ismPreprocMtxIncrement[outCh][inCh] ); // Q28 + + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + temp = Mpy_32_32( inRe_fx[inCh][slot][bin], hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][band_idx] ); // Q = q_cldfb* + 28 - 31 = q_cldfb - 3 + outSlotRe[outCh][slot][bin] = L_add( outSlotRe[outCh][slot][bin], L_shl( temp, 3 ) ); // Q = q_cldfb* + move32(); + + temp = Mpy_32_32( inIm_fx[inCh][slot][bin], hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][band_idx] ); // Q = q_cldfb* + 28 - 31 = q_cldfb*-3 + outSlotIm[outCh][slot][bin] = L_add( outSlotIm[outCh][slot][bin], L_shl( temp, 3 ) ); // Q = q_cldfb* + move32(); + } + } + + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + Word32 instEne_fx; + temp64 = W_mult0_32_32( outSlotRe[outCh][slot][bin], outSlotRe[outCh][slot][bin] ); // 2q-3 + temp64 = W_add( temp64, W_mult0_32_32( outSlotIm[outCh][slot][bin], outSlotIm[outCh][slot][bin] ) ); // 2q-3 + exp1 = W_norm( temp64 ); + instEne_fx = W_extract_h( W_shl( temp64, exp1 ) ); // 2*cldfb_buf_q - 32 + exp1 + exp1 = 31 - ( 2 * ( *cldfb_buf_q ) - 32 + exp1 ); + move16(); + + hMasaIsmData->preprocEneRealized_fx[band_idx] = BASOP_Util_Add_Mant32Exp( hMasaIsmData->preprocEneRealized_fx[band_idx], hMasaIsmData->preprocEneRealized_e[band_idx], instEne_fx, exp1, &hMasaIsmData->preprocEneRealized_e[band_idx] ); // Q= *cldfb_buf_q + *cldfb_buf_q - 31 = Q-19); + move32(); + } + } + } + + test(); + IF( hMasaIsmData->preprocEneTarget_fx[band_idx] > 0 && hMasaIsmData->preprocEneRealized_fx[band_idx] > 0 ) + { + temp = BASOP_Util_Divide3232_Scale_newton( hMasaIsmData->preprocEneTarget_fx[band_idx], L_max( 1, hMasaIsmData->preprocEneRealized_fx[band_idx] ), &temp_q ); + temp_q = sub( Q31, sub( sub( Q31, temp_q ), sub( hMasaIsmData->preprocEneTarget_e[band_idx], hMasaIsmData->preprocEneRealized_e[band_idx] ) ) ); + temp = Sqrt32( temp, &temp_q ); // Q: 31-temp_q + temp = L_shl( temp, sub( temp_q, 3 ) ); // Q28 + temp_q = Q28; + move32(); + } + ELSE + { + temp = 0; + move32(); + } + + IF( GT_32( ONE_IN_Q30, temp ) ) + { + eqVal = temp; + move32(); + } + ELSE + { + eqVal = ONE_IN_Q30; // 4 in Q28 + move32(); + } + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( slot = 0; slot < nSlots; slot++ ) + { + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + temp = Mpy_32_32( outSlotRe[ch][slot][bin], eqVal ); // Q = (cldfb_q) + 28 -31 = cldfb_q - 3 + inRe_fx[ch][slot][bin] = L_shl( temp, 3 ); + move32(); + + temp = Mpy_32_32( outSlotIm[ch][slot][bin], eqVal ); // Q = (cldfb_q) + 28 -31 = cldfb_q - 3 + inIm_fx[ch][slot][bin] = L_shl( temp, 3 ); + move32(); + } + } + } + } + } + ELSE /* Other processing modes */ + { + Word32 subframeEne; + Word32 subframeEneCh[2]; + Word32 normEnes[2]; + Word32 ratioAccOrig; + Word32 ratioAccNew; + Word32 ratio; + Word32 ismEneThis; + Word32 ismTargetEneThis; + Word32 ismTargetEneThisCh[2]; + Word32 totalTargetEneCh[2]; + Word32 totalTargetEne; + Word32 masaTargetEneThisCh[2]; + Word32 ismPreprocMtxNew[2][2]; + Word16 ismPreprocMtxNew_e[2][2]; + Word32 ismPreprocMtxIncrement[2][2]; + Word16 ismPreprocMtxIncrement_e[2][2]; + Word32 eneMove[2]; + Word32 enePreserve[2]; + Word32 ismRatioAcc; + Word32 remainderNormEne; + Word16 centeringFactor; + Word16 eneMoveThis; + Word16 enePreserveThis; + Word32 normVal; + Word32 eqVal; + Word32 outSlotRe[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 outSlotIm[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 newRatios[6]; + Word16 gainIsmThis; + Word16 gainMasaPow2; + Word32 tempDivisor; + Word32 masaEneThisCh[2]; + Word32 ratioAccNewDivisor; + Word32 temp; + Word16 temp_q = 0; + Word16 temp1; + Word64 temp64; + Word16 norm, shift = 31; + Word16 exp, exp1; + Word16 subframeEneCh_e[2]; + Word16 subframeEneCh_Q[2]; + Word16 subQ = 0; + move16(); + move16(); + move16(); + + set16_fx( subframeEneCh_e, 0, 2 ); + temp = 0; move32(); - set16_fx( normEnes_fx, 0, 2 ); - set32_fx( Enes_fx, 0, 2 ); - set16_fx( normEnes_q_fx, Q31, 2 ); - set16_fx( eneMove_q_fx, Q31, 2 ); - set16_fx( enePreserve_q_fx, Q31, 2 ); - /* Determine transport normalized energies and subframe energy */ + gainMasaPow2 = ONE_IN_Q9; + move16(); + IF( masaGainEdited ) + { + gainMasaPow2 = hMasaIsmData->gain_masa_edited_fx; // Q12 + move16(); + gainMasaPow2 = mult( gainMasaPow2, gainMasaPow2 ); // Q = 12 + 12 - 15 = 9 + move16(); + } + + nSlots = hSpatParamRendCom->subframe_nbslots[subframe]; + move16(); + dirac_read_idx = hSpatParamRendCom->render_to_md_map[subframe]; + move16(); + + /* Determine panning gains and energies for each object */ + FOR( ismDirIndex = 0; ismDirIndex < n_ism; ismDirIndex++ ) + { + /* Get input and output panning gains */ + ivas_get_stereo_panning_gains_fx( hMasaIsmData->azimuth_ism_fx[ismDirIndex][dirac_read_idx], + hMasaIsmData->elevation_ism_fx[ismDirIndex][dirac_read_idx], + panGainsIn[ismDirIndex] ); // Q15 + + IF( ismDirEdited[ismDirIndex] ) + { + ivas_get_stereo_panning_gains_fx( hMasaIsmData->azimuth_ism_edited_fx[ismDirIndex], + hMasaIsmData->elevation_ism_edited_fx[ismDirIndex], + panGainsOut[ismDirIndex] ); // Q15 + } + ELSE + { + /* When not edited, input and output pan gains are the same */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + panGainsOut[ismDirIndex][ch] = panGainsIn[ismDirIndex][ch]; + move16(); + } + } + + /* Determine pan enes */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + panEnesOut[ismDirIndex][ch] = mult( panGainsOut[ismDirIndex][ch], panGainsOut[ismDirIndex][ch] ); // Q15 + move16(); + panEnesIn[ismDirIndex][ch] = mult( panGainsIn[ismDirIndex][ch], panGainsIn[ismDirIndex][ch] ); // Q15 + move16(); + } + } + + /* Determine the highest band */ + max_band = 0; + move16(); + IF( masaIsmMode ) + { + test(); + WHILE( GT_16( sub( MASA_FREQUENCY_BANDS, max_band ), 0 ) && GT_16( sub( nBins, MASA_band_grouping_24[max_band] ), 0 ) ) + { + max_band++; + } + } + ELSE + { + test(); + WHILE( GT_16( sub( MAX_PARAM_ISM_NBANDS, max_band ), 0 ) && GT_16( sub( nBins, hParamIsmDec->hParamIsm->band_grouping[max_band] ), 0 ) ) + { + max_band++; + } + } + + /* Init out array */ FOR( slot = 0; slot < nSlots; slot++ ) { - FOR( ch = 0; ch < 2; ch++ ) + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + set_zero_fx( outSlotRe[ch][slot], CLDFB_NO_CHANNELS_MAX ); + set_zero_fx( outSlotIm[ch][slot], CLDFB_NO_CHANNELS_MAX ); + + norm = s_min( L_norm_arr( inRe_fx[ch][slot], nBins ), L_norm_arr( inIm_fx[ch][slot], nBins ) ); + shift = s_min( norm, shift ); + } + } + + /* Perform the processing in frequency bands */ + FOR( band_idx = 0; band_idx < max_band; band_idx++ ) + { + ratioAccOrig = 0; + move32(); + ratioAccNew = 0; + move32(); + ismRatioAcc = 0; + move32(); + + set32_fx( eneMove, 0, 2 ); + set32_fx( enePreserve, 0, 2 ); + set32_fx( subframeEneCh, 0, 2 ); + set32_fx( normEnes, 0, 2 ); + set32_fx( ismTargetEneThisCh, 0, 2 ); + set32_fx( totalTargetEneCh, 0, 2 ); + set32_fx( masaTargetEneThisCh, 0, 2 ); + set32_fx( ismPreprocMtxNew[0], 0, 2 ); + set32_fx( ismPreprocMtxNew[1], 0, 2 ); + set16_fx( ismPreprocMtxNew_e[0], 0, 2 ); + set16_fx( ismPreprocMtxNew_e[1], 0, 2 ); + set32_fx( ismPreprocMtxIncrement[0], 0, 2 ); + set32_fx( ismPreprocMtxIncrement[1], 0, 2 ); + set16_fx( ismPreprocMtxIncrement_e[1], 0, 2 ); + set16_fx( ismPreprocMtxIncrement_e[1], 0, 2 ); + + IF( masaIsmMode ) + { + bin_lo = MASA_band_grouping_24[band_idx]; + move16(); + bin_hi = s_min( MASA_band_grouping_24[band_idx + 1], nBins ); + move16(); + } + ELSE + { + bin_lo = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + move16(); + bin_hi = s_min( hParamIsmDec->hParamIsm->band_grouping[band_idx + 1], nBins ); + move16(); + } + + exp = sub( 63, shl( *cldfb_buf_q, 1 ) ); + Word16 guardBits = 5; + move16(); + + /* Determine transport normalized energies and subframe energy */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( slot = 0; slot < nSlots; slot++ ) + { + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + + Word32 instEne_fx; + temp64 = W_mult0_32_32( inRe_fx[ch][slot][bin], inRe_fx[ch][slot][bin] ); // 2q + temp64 = W_add( temp64, W_mult0_32_32( inIm_fx[ch][slot][bin], inIm_fx[ch][slot][bin] ) ); // 2q + exp1 = W_norm( temp64 ); + instEne_fx = W_extract_h( W_shl( temp64, exp1 ) ); // 2*cldfb_buf_q - 32 + exp1 + /* exp of instEne_fx = 31 - (2q -32 + exp1) = 63 - 2q - exp1 = exp - exp1*/ + + subframeEneCh[ch] = BASOP_Util_Add_Mant32Exp( subframeEneCh[ch], subframeEneCh_e[ch], instEne_fx, sub( exp, exp1 ), &subframeEneCh_e[ch] ); + subframeEneCh_Q[ch] = 31 - subframeEneCh_e[ch]; + move32(); + move32(); + } + } + } + + // Align subframeEneCh Q values, shift 1 bit right to avoid overflow from sum + IF( EQ_32( subframeEneCh_Q[0], subframeEneCh_Q[1] ) ) + { + subframeEneCh[0] = L_shr( subframeEneCh[0], 1 ); + subframeEneCh[1] = L_shr( subframeEneCh[1], 1 ); + subframeEne = L_add( subframeEneCh[0], subframeEneCh[1] ); // subQ + subframeEneCh_Q[1] = sub( subframeEneCh_Q[1], 1 ); + subframeEneCh_Q[0] = sub( subframeEneCh_Q[0], 1 ); + subQ = subframeEneCh_Q[0]; + + move16(); + move16(); + move16(); + move16(); + move16(); + } + ELSE + { + IF( GT_32( subframeEneCh_Q[0], subframeEneCh_Q[1] ) ) + { + temp1 = sub( subframeEneCh_Q[0], subframeEneCh_Q[1] ); + subframeEneCh[0] = L_shr( subframeEneCh[0], temp1 ); + subframeEneCh[0] = L_shr( subframeEneCh[0], 1 ); + subframeEneCh[1] = L_shr( subframeEneCh[1], 1 ); + subframeEne = L_add( subframeEneCh[0], subframeEneCh[1] ); // subQ + subframeEneCh_Q[0] = sub( subframeEneCh_Q[1], 1 ); + subframeEneCh_Q[1] = sub( subframeEneCh_Q[1], 1 ); + subQ = subframeEneCh_Q[1]; + + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + ELSE + { + temp1 = sub( subframeEneCh_Q[1], subframeEneCh_Q[0] ); + subframeEneCh[1] = L_shr( subframeEneCh[1], temp1 ); + subframeEneCh[0] = L_shr( subframeEneCh[0], 1 ); + subframeEneCh[1] = L_shr( subframeEneCh[1], 1 ); + + subframeEne = L_add( subframeEneCh[0], subframeEneCh[1] ); + subframeEneCh_Q[1] = sub( subframeEneCh_Q[0], 1 ); + subframeEneCh_Q[0] = sub( subframeEneCh_Q[0], 1 ); + subQ = subframeEneCh_Q[0]; + + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + } + + /* Shift subframeEnes right by the number of guard bits to avoid overflow */ + subframeEne = L_shr( subframeEne, guardBits ); + subframeEneCh[0] = L_shr( subframeEneCh[0], guardBits ); + subframeEneCh[1] = L_shr( subframeEneCh[1], guardBits ); + + subQ = sub( subQ, guardBits ); + subframeEneCh_Q[0] = sub( subframeEneCh_Q[0], guardBits ); + subframeEneCh_Q[1] = sub( subframeEneCh_Q[1], guardBits ); + + move16(); + move16(); + move16(); + move16(); + + totalTargetEneCh[0] = subframeEneCh[0]; // subQch[0] + move32(); + totalTargetEneCh[1] = subframeEneCh[1]; // subQch[1] + move32(); + masaEneThisCh[0] = subframeEneCh[0]; // subQch[0] + move32(); + masaEneThisCh[1] = subframeEneCh[1]; // subQch[1] + move32(); + + /* Gain editing */ + /* For each object, estimate new target energy per channel based on the applied gain */ + FOR( ismDirIndex = 0; ismDirIndex < n_ism; ismDirIndex++ ) + { + ratio = hMasaIsmData->energy_ratio_ism_fx[ismDirIndex][dirac_read_idx][bin_lo]; // Q30 + move32(); + + ratioAccOrig = L_add( ratioAccOrig, ratio ); // Q30 + + /* Calculate MASA energy as a residual of original channel energies subtracted with ISM energies */ + FOR( ch = 0; ch < 2; ch++ ) + { + temp = Mpy_32_32( ratio, subframeEne ); // Q = 30 + subEneQ - 31 = subEneQ-1 + temp = Mpy_32_16_1( temp, panEnesIn[ismDirIndex][ch] ); // Q = subEneQ-1 + + temp_q = sub( subframeEneCh_Q[ch], sub( subQ, 1 ) ); + masaEneThisCh[ch] = L_sub( masaEneThisCh[ch], L_shl( temp, temp_q ) ); // Q = subframeEneCh_Q + move32(); + } + + /* Calculate target energy, gained ratio for accumulation, and transports gains, if ism gain is edited */ + IF( ismGainEdited[ismDirIndex] ) + { + gainIsmThis = hMasaIsmData->gain_ism_edited_fx[ismDirIndex]; // Q12 + move16(); + + /* ISM original energy */ + ismEneThis = Mpy_32_32( ratio, subframeEne ); // Q = 30 + subEneQ - 31 = subQ-1 + move32(); + + /* ISM target energy */ + temp1 = shl_sat( mult( gainIsmThis, gainIsmThis ), 2 ); // Q = 12 + 12 - 15 + 2 = 11 + ismTargetEneThis = Mpy_32_16_1( ismEneThis, temp1 ); // Q = (subQ-1) + 11 - 15 = subQ-5 + move32(); + + ratio = L_shl( Mpy_32_16_1( ratio, temp1 ), 1 ); // Q = 30 + 11 - 15 + 1 = 27 + move32(); + + + /* Determine panning energies and channel target energies */ + FOR( ch = 0; ch < 2; ch++ ) + { + /* Ism target energy per channel */ + ismTargetEneThisCh[ch] = Mpy_32_16_1( ismTargetEneThis, panEnesIn[ismDirIndex][ch] ); // Q = subQ-5 + 15 + 1 - 16 = subQ-5 + move32(); + + /* Reduce original ism energy */ + temp = Mpy_32_16_1( ismEneThis, panEnesIn[ismDirIndex][ch] ); // subEneQ-1 + 15 + 1 - 16 = subQ-1 + totalTargetEneCh[ch] = L_sub( totalTargetEneCh[ch], L_shl( temp, 1 ) ); // subEneQ + move32(); + + /* Add ism target energy per channel */ + totalTargetEneCh[ch] = L_add( totalTargetEneCh[ch], L_shl( ismTargetEneThisCh[ch], 5 ) ); // SubQ + move32(); + } + + + /* If separated ism edited, apply gain directly to the separated ism */ + IF( EQ_16( ismDirIndex, hMasaIsmData->idx_separated_ism ) ) + { + /* Separated object gaining is done elsewhere with DIRAC renderer */ + IF( NE_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) + { + /* Gain transport channel of separated ism */ + FOR( slot = 0; slot < nSlots; slot++ ) + { + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + temp = Mpy_32_16_1( inRe_fx[2][slot][bin], gainIsmThis ); // Q = *cldfb_buf_q + 12 + 1 - 16 = *cldfb_buf_q - 3 + inRe_fx[2][slot][bin] = L_shl( temp, Q3 ); + move32(); + + temp = Mpy_32_16_1( inIm_fx[2][slot][bin], gainIsmThis ); // Q = *cldfb_buf_q + 12 + 1 - 16 = *cldfb_buf_q - 3 + inIm_fx[2][slot][bin] = L_shl( temp, Q3 ); + move32(); + } + } + } + } + ratioAccNew = L_add( ratioAccNew, ratio ); // Q27 + move32(); + } + ELSE + { + ratioAccNew = L_add( ratioAccNew, L_shr( ratio, 3 ) ); // Q27 + move32(); + } + } + + IF( masaIsmMode ) { - Enes_fx[ch] = L_add( Enes_fx[ch], Mpy_32_32( inRe_fx[ch][slot][bin], inRe_fx[ch][slot][bin] ) ); // Q = *cldfb_buf_q + *cldfb_buf_q - 31 = Q-19 + /* MASA original ratios */ + ratio = L_add( hSpatParamRendCom->energy_ratio1_fx[dirac_read_idx][bin_lo], hSpatParamRendCom->energy_ratio2_fx[dirac_read_idx][bin_lo] ); // Q30 + move32(); + ratioAccOrig = L_add( ratioAccOrig, ratio ); // Q30 + move32(); + + /* Estimate MASA original energies and determine adjusted target energies and gained ratio for accumulation, if a gain is applied to MASA */ + IF( masaGainEdited ) + { + /* Gained MASA ratio */ + ratio = L_shl( Mpy_32_16_1( ratio, gainMasaPow2 ), 3 ); // Q = 30 + 9 - 15 + 3 = 27 + move32(); + + + /* Calculate MASA target energies and add to total target energy estimation */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + /* MASA original energy per channel */ + masaEneThisCh[ch] = L_max( masaEneThisCh[ch], 0 ); // Q5 + move32(); + + /* MASA target energy per channel */ + temp = Mpy_32_16_1( masaEneThisCh[ch], shl( gainMasaPow2, 2 ) ); // Q = SubQ + 11 + 1 - 16 = SubQ-4 + masaTargetEneThisCh[ch] = L_shl( temp, 4 ); // SubQ + move32(); + + /* Reduce original energy per channel */ + totalTargetEneCh[ch] = L_sub( totalTargetEneCh[ch], masaEneThisCh[ch] ); // SubQ + move32(); + + /* Add target energy per channel */ + totalTargetEneCh[ch] = L_add( totalTargetEneCh[ch], masaTargetEneThisCh[ch] ); // SubQ + move32(); + } + ratioAccNew = L_add( ratioAccNew, ratio ); // Q27 + } + ELSE + { + ratioAccNew = L_add( ratioAccNew, L_shr( ratio, 3 ) ); // Q27 + } + } + + + /* Limit target energies to non-negative values */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + totalTargetEneCh[ch] = L_max( 0, totalTargetEneCh[ch] ); + } + + /* due to rounding, the sum may exceed 1.0f ever so slightly, so clip it */ + ratioAccOrig = L_min( ratioAccOrig, ONE_IN_Q30 ); + move32(); + IF( masaGainEdited ) + { + temp = Mpy_32_16_1( L_sub( ONE_IN_Q30, ratioAccOrig ), gainMasaPow2 ); // Q = 30 + 9 + 1 - 16 = 24 + ratioAccNew = L_add_sat( ratioAccNew, L_shl_sat( temp, 3 ) ); // Q27 + move32(); + } + ELSE + { + ratioAccNew = L_add( ratioAccNew, L_shr( L_sub( ONE_IN_Q30, ratioAccOrig ), 3 ) ); // Q27 + move32(); + } + + /* New target total energy ratio divider */ + IF( ratioAccNew > 0 ) + { + ratioAccNewDivisor = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q27, ratioAccNew, &temp_q ); + ratioAccNewDivisor = L_shl_sat( ratioAccNewDivisor, sub( temp_q, 4 ) ); // Q27, saturate to 16 in Q27 + + /* Determine and process object energy ratios based on gaining */ + FOR( ismDirIndex = 0; ismDirIndex < n_ism; ismDirIndex++ ) + { + newRatios[ismDirIndex + 2] = hMasaIsmData->energy_ratio_ism_fx[ismDirIndex][dirac_read_idx][bin_lo]; // Q30 + move32(); + + IF( ismGainEdited[ismDirIndex] ) + { + gainIsmThis = hMasaIsmData->gain_ism_edited_fx[ismDirIndex]; + move16(); + + /* Gain original object energy ratio, if edited */ + temp1 = mult( gainIsmThis, gainIsmThis ); // Q = 12 + 12 - 15 = 9 + newRatios[ismDirIndex + 2] = Mpy_32_16_1( newRatios[ismDirIndex + 2], temp1 ); // Q = 30 + 9 + 1 - 16 = 24 + move32(); + } + ELSE + { + newRatios[ismDirIndex + 2] = L_shr( newRatios[ismDirIndex + 2], 6 ); + move32(); + } + /* Divide with new target total ratio */ + newRatios[ismDirIndex + 2] = Mpy_32_32( newRatios[ismDirIndex + 2], ratioAccNewDivisor ); // Q = 24 + 27 - 31 = 20 + move32(); + } + + /* Determine and process MASA energy ratios based on gaining */ + newRatios[0] = hSpatParamRendCom->energy_ratio1_fx[dirac_read_idx][bin_lo]; // Q30 + newRatios[1] = hSpatParamRendCom->energy_ratio2_fx[dirac_read_idx][bin_lo]; // Q30 + move32(); + move32(); + + IF( masaGainEdited ) + { + newRatios[0] = Mpy_32_16_1( newRatios[0], gainMasaPow2 ); // Q = 30 + 9 + 1 - 16 = 24 + newRatios[1] = Mpy_32_16_1( newRatios[1], gainMasaPow2 ); // Q = 30 + 9 + 1 - 16 = 24 + move32(); + move32(); + } + ELSE + { + newRatios[0] = L_shr( newRatios[0], 6 ); // Q = 30 + 9 + 1 - 16 = 24 + newRatios[1] = L_shr( newRatios[0], 6 ); + move32(); + move32(); + } + newRatios[0] = Mpy_32_32( newRatios[0], ratioAccNewDivisor ); // Q = 24 + 27 - 31 = 20 + newRatios[1] = Mpy_32_32( newRatios[1], ratioAccNewDivisor ); // Q = 24 + 27 - 31 = 20 move32(); - Enes_fx[ch] = L_add( Enes_fx[ch], Mpy_32_32( inIm_fx[ch][slot][bin], inIm_fx[ch][slot][bin] ) ); // Q = *cldfb_buf_q + *cldfb_buf_q - 31 = Q-19 move32(); + + /* Set adjusted energy ratios */ + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + FOR( ismDirIndex = 0; ismDirIndex < n_ism; ismDirIndex++ ) + { + hMasaIsmData->energy_ratio_ism_fx[ismDirIndex][dirac_read_idx][bin] = L_shl( newRatios[ismDirIndex + 2], 10 ); // Q30 + move32(); + } + + IF( masaIsmMode ) + { + hSpatParamRendCom->energy_ratio1_fx[dirac_read_idx][bin] = L_shl( newRatios[0], 10 ); + hSpatParamRendCom->energy_ratio2_fx[dirac_read_idx][bin] = L_shl( newRatios[1], 10 ); + move32(); + move32(); + } + } } - subframeEne_fx = L_add( Enes_fx[0], Enes_fx[1] ); // Q = *cldfb_buf_q + *cldfb_buf_q - 31 = Q-19 + /* Direction editing */ + /* Determine new energetic values after gaining */ + totalTargetEne = L_add( totalTargetEneCh[0], totalTargetEneCh[1] ); // SubQ - IF( subframeEne_fx != 0 ) + IF( GT_32( totalTargetEne, 0 ) ) { - normEnes_fx[0] = BASOP_Util_Divide3232_Scale( Enes_fx[0], subframeEne_fx, &temp_q ); + tempDivisor = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q28, max( EPSILON_FX, totalTargetEne ), &temp_q ); + + temp_q = sub( sub( Q31, temp_q ), sub( sub( Q31, Q28 ), sub( Q31, subQ ) ) ); + + normEnes[0] = Mpy_32_32( totalTargetEneCh[0], tempDivisor ); // Q = 25 + normEnes[1] = Mpy_32_32( totalTargetEneCh[1], tempDivisor ); // Q = 25 + temp_q = sub( add( subQ, temp_q ), Q31 ); + normEnes[0] = L_shl( normEnes[0], sub( Q25, temp_q ) ); + normEnes[1] = L_shl( normEnes[1], sub( Q25, temp_q ) ); move32(); - normEnes_fx[0] = shr( normEnes_fx[0], sub( sub( 15, temp_q ), Q12 ) ); // Q12 move32(); - normEnes_fx[1] = BASOP_Util_Divide3232_Scale( Enes_fx[1], subframeEne_fx, &temp_q ); move32(); - normEnes_fx[1] = shr( normEnes_fx[1], sub( sub( 15, temp_q ), Q12 ) ); // Q12 move32(); } ELSE { - normEnes_fx[0] = BASOP_Util_Divide3232_Scale( Enes_fx[0], EPSILON_FX, &temp_q ); - move32(); - normEnes_fx[0] = shr( normEnes_fx[0], sub( sub( 15, temp_q ), Q12 ) ); // Q12 + normEnes[0] = 0; + normEnes[1] = 0; move32(); - normEnes_fx[1] = BASOP_Util_Divide3232_Scale( Enes_fx[1], EPSILON_FX, &temp_q ); - move32(); - normEnes_fx[1] = shr( normEnes_fx[1], sub( sub( 15, temp_q ), Q12 ) ); // Q12 move32(); } - - /* For each ismDir, formulate a mix-matrix that moves object audio signals between - * left and right channels when needed. Make a combined matrix by a ratio-weighted sum */ - FOR( ismDirIndex = 0; ismDirIndex < hSpatParamRendCom->numIsmDirections; ismDirIndex++ ) + /* For each ismDir, determine moved and preserve energy ratio per channel */ + FOR( ismDirIndex = 0; ismDirIndex < n_ism; ismDirIndex++ ) { - Word16 panGainsOut_fx[2]; - Word16 panGainsIn_fx[2]; - Word16 ratio; - Word16 panEnesOut_fx[2]; - Word16 panEnesIn_fx[2]; - Word16 centeringFactor_fx; - - ratio = extract_l( hMasaIsmData->energy_ratio_ism_fx[ismDirIndex][dirac_read_idx][bin] ); // Q14 - ismRatioAcc_fx = add( ismRatioAcc_fx, ratio ); + ratio = hMasaIsmData->energy_ratio_ism_fx[ismDirIndex][dirac_read_idx][bin_lo]; // Q30 + move32(); - /* Get input and output panning gains */ - ivas_get_stereo_panning_gains_fx( hMasaIsmData->azimuth_ism[ismDirIndex][dirac_read_idx], - hMasaIsmData->elevation_ism[ismDirIndex][dirac_read_idx], - panGainsIn_fx ); + ismRatioAcc = L_add( ismRatioAcc, ratio ); // Q30 - IF( hMasaIsmData->ism_is_edited[ismDirIndex] ) - { - ivas_get_stereo_panning_gains_fx( hMasaIsmData->azimuth_ism_edited[ismDirIndex], - hMasaIsmData->elevation_ism_edited[ismDirIndex], - panGainsOut_fx ); - } - ELSE + IF( enableCentering ) { - /* When not edited, input and output pan gains are the same */ + temp1 = abs_s( sub( panEnesIn[ismDirIndex][0], panEnesOut[ismDirIndex][0] ) ); // 2*sub(enes) -> Q14 + centeringFactor = max( 0, sub( temp1, ONE_IN_Q14 ) ); // Q14 + FOR( ch = 0; ch < 2; ch++ ) { - panGainsOut_fx[ch] = panGainsIn_fx[ch]; + temp1 = sub( ONE_IN_Q14, centeringFactor ); + panEnesOut[ismDirIndex][ch] = mult( panEnesOut[ismDirIndex][ch], temp1 ); // Q = 15 + 14 - 15 = 14 move16(); - } - } - - /* Determine pan enes */ - FOR( ch = 0; ch < 2; ch++ ) - { - panEnesOut_fx[ch] = mult( panGainsOut_fx[ch], panGainsOut_fx[ch] ); // Q15 - move16(); - panEnesIn_fx[ch] = mult( panGainsIn_fx[ch], panGainsIn_fx[ch] ); // Q15 - move16(); - } - IF( enableCentering ) - { - centeringFactor_fx = s_max( 0, sub( mult( shl( 2, 13 ), abs_s( sub( panEnesIn_fx[0], panEnesOut_fx[0] ) ) ), ONE_IN_Q13 ) ); // Q13 - FOR( ch = 0; ch < 2; ch++ ) - { - panEnesOut_fx[ch] = mult( panEnesOut_fx[ch], sub( ONE_IN_Q13, centeringFactor_fx ) ); // Q13 + temp1 = shr( centeringFactor, 1 ); // * 0.5f = Divide by 2 + panEnesOut[ismDirIndex][ch] = add( panEnesOut[ismDirIndex][ch], temp1 ); // Q14 + panEnesOut[ismDirIndex][ch] = shl( panEnesOut[ismDirIndex][ch], 1 ); // Q15 move16(); - panEnesOut_fx[ch] = add( panEnesOut_fx[ch], shr( centeringFactor_fx, 1 ) ); // Q13 move16(); } } - FOR( ch = 0; ch < 2; ch++ ) + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - Word16 eneMoveThis_fx; - Word16 enePreserveThis_fx; - - eneMoveThis_fx = s_max( 0, sub( shr( panEnesIn_fx[ch], 2 ), panEnesOut_fx[ch] ) ); // Q13 - enePreserveThis_fx = sub( shr( panEnesIn_fx[ch], 2 ), eneMoveThis_fx ); // Q13 - - eneMove_fx[ch] = mult( ratio, eneMoveThis_fx ); // Q = 14 + 13 - 15 = 12 + eneMoveThis = s_max( 0, sub( panEnesIn[ismDirIndex][ch], panEnesOut[ismDirIndex][ch] ) ); // Q15 move16(); - enePreserve_fx[ch] = mult( ratio, enePreserveThis_fx ); // Q = 14 + 13 - 15 = 12 + + enePreserveThis = sub( panEnesIn[ismDirIndex][ch], eneMoveThis ); // Q15 move16(); + temp = Mpy_32_16_1( ratio, eneMoveThis ); // Q = 30 + 15 + 1 - 16 = 30 + eneMove[ch] = L_add( eneMove[ch], temp ); // Q30 + move32(); + + temp = Mpy_32_16_1( ratio, enePreserveThis ); // Q = 30 + 15 + 1 - 16 = 30 + enePreserve[ch] = L_add( enePreserve[ch], temp ); // 30 + move32(); + /* Subtract object parts from normEnes */ - normEnes_fx[ch] = sub( normEnes_fx[ch], shr( mult( panEnesIn_fx[ch], ratio ), 2 ) ); // Q12 - move16(); + temp = Mpy_32_16_1( L_shr( ratio, 5 ), panEnesIn[ismDirIndex][ch] ); // Q = 25 + 15 + 1 = 16 = 25; + normEnes[ch] = L_sub( normEnes[ch], temp ); // Q25 + move32(); } } /* Any remaining (non-object) energy is set to be preserved at both channels */ - remainderNormEne_fx = s_max( 0, sub( sub( shr( sub( ONE_IN_Q14, ismRatioAcc_fx ), Q14 - Q12 ), normEnes_fx[0] ), normEnes_fx[1] ) ); // Q12 + temp = L_sub( ONE_IN_Q25, L_shr( ismRatioAcc, 5 ) ); + temp = L_sub( temp, normEnes[0] ); + temp = L_sub( temp, normEnes[1] ); + remainderNormEne = L_max( 0, temp ); // Q25 - FOR( ch = 0; ch < 2; ch++ ) + /* Normalize */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - enePreserve_fx[ch] = add( enePreserve_fx[ch], s_max( 0, add( enePreserve_fx[ch], shr( remainderNormEne_fx, 1 ) ) ) ); // Q12 - move16(); + temp = L_shr( remainderNormEne, 1 ); // Division by 2, Q25 + temp = L_add( normEnes[ch], temp ); // Q25 + enePreserve[ch] = L_add( L_shr( enePreserve[ch], 5 ), L_max( 0, temp ) ); // Q25 + + temp = L_add( L_shr( eneMove[ch], 5 ), enePreserve[ch] ); // Q25 + temp = L_max( EPSILON_FX, temp ); + normVal = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q25, temp, &temp_q ); + normVal = L_shl_sat( normVal, sub( temp_q, 6 ) ); // Q25 + + temp = L_max( EPSILON_FX, subframeEneCh[ch] ); // SubQ + temp = BASOP_Util_Divide3232_Scale_newton( totalTargetEneCh[ch], temp, &temp_q ); + temp = L_shl_sat( temp, sub( temp_q, 6 ) ); // Q25 + normVal = Mpy_32_32( normVal, L_min( 335544320, temp ) ); // Q = 25 + 25 + 1 - 32 = 19 + + eneMove[ch] = Mpy_32_32( eneMove[ch], normVal ); // Q = 30 + 19 + 1 - 32 = 18 + move32(); + + enePreserve[ch] = Mpy_32_32( L_shl_sat( enePreserve[ch], 5 ), normVal ); // Q = 30 + 19 + 1 - 32 = 18 + move32(); + + enePreserve[ch] = L_shl_sat( enePreserve[ch], 8 ); // Q26 + eneMove[ch] = L_shl_sat( eneMove[ch], 8 ); // Q26 + move32(); + move32(); } - /* Temporally average energy moving and preserving, and generate the transport signal preprocessing matrix */ - FOR( ch = 0; ch < 2; ch++ ) + /* Temporally average target energy */ + hMasaIsmData->eneOrigIIR_fx[band_idx] = Mpy_32_16_1( hMasaIsmData->eneOrigIIR_fx[band_idx], STEREO_PREPROCESS_IIR_FACTOR_Q15 ); // Q = origIIR_Q + 15 + 1 - 16 = origIIR_Q + hMasaIsmData->eneOrigIIR_fx[band_idx] = BASOP_Util_Add_Mant32Exp( hMasaIsmData->eneOrigIIR_fx[band_idx], hMasaIsmData->eneOrigIIR_e[band_idx], totalTargetEne, sub( Q31, subQ ), &hMasaIsmData->eneOrigIIR_e[band_idx] ); + move32(); + move32(); + + /* Temporally average energy moving and preserving, and generate the transport signal preprocessing matrix for + * gaining objects and moving objects between left and right */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - Word32 normVal_fx; - hMasaIsmData->eneMoveIIR_fx[ch][bin] = Mpy_32_16_1( hMasaIsmData->eneMoveIIR_fx[ch][bin], STEREO_PREPROCESS_IIR_FACTOR_Q15 ); + hMasaIsmData->eneMoveIIR_fx[ch][band_idx] = Mpy_32_16_1( hMasaIsmData->eneMoveIIR_fx[ch][band_idx], STEREO_PREPROCESS_IIR_FACTOR_Q15 ); // Q = Enemove_Q + 15 + 1 -16 = Enemove_Q + move32(); + + temp = Mpy_32_32( totalTargetEne, eneMove[ch] ); // Q = SubQ + 26 + 1 - 32 = SubQ-5 + shift = norm_l( temp ); + temp = L_shl( temp, shift ); // Q = subQ-5+shift + hMasaIsmData->eneMoveIIR_fx[ch][band_idx] = BASOP_Util_Add_Mant32Exp( hMasaIsmData->eneMoveIIR_fx[ch][band_idx], hMasaIsmData->eneMoveIIR_e[ch][band_idx], temp, sub( Q31, add( sub( subQ, 5 ), shift ) ), &hMasaIsmData->eneMoveIIR_e[ch][band_idx] ); + move32(); + + hMasaIsmData->enePreserveIIR_fx[ch][band_idx] = Mpy_32_16_1( hMasaIsmData->enePreserveIIR_fx[ch][band_idx], STEREO_PREPROCESS_IIR_FACTOR_Q15 ); // Q = enePreserve_Q + 15 + 1 - 16 = enePreserve_Q = 31- enePreserve_e move32(); - temp = Mpy_32_16_1( subframeEne_fx, eneMove_fx[ch] ); - hMasaIsmData->eneMoveIIR_fx[ch][bin] = L_add( hMasaIsmData->eneMoveIIR_fx[ch][bin], temp ); // Q = *cldfb_buf_q + *cldfb_buf_q - 34 = Q-22 + + temp = Mpy_32_32( totalTargetEne, enePreserve[ch] ); // Q = subQ + 26 + 1 - 32 = subQ-5 + shift = norm_l( temp ); + temp = L_shl( temp, shift ); // Q = subQ-5+shift + hMasaIsmData->enePreserveIIR_fx[ch][band_idx] = BASOP_Util_Add_Mant32Exp( hMasaIsmData->enePreserveIIR_fx[ch][band_idx], hMasaIsmData->enePreserveIIR_e[ch][band_idx], temp, sub( Q31, add( sub( subQ, 5 ), shift ) ), &hMasaIsmData->enePreserveIIR_e[ch][band_idx] ); move32(); - hMasaIsmData->enePreserveIIR_fx[ch][bin] = Mpy_32_16_1( hMasaIsmData->enePreserveIIR_fx[ch][bin], STEREO_PREPROCESS_IIR_FACTOR_Q15 ); + temp_q = norm_l( hMasaIsmData->enePreserveIIR_fx[ch][band_idx] ); + hMasaIsmData->enePreserveIIR_fx[ch][band_idx] = L_shl( hMasaIsmData->enePreserveIIR_fx[ch][band_idx], temp_q ); + hMasaIsmData->enePreserveIIR_e[ch][band_idx] = sub( hMasaIsmData->enePreserveIIR_e[ch][band_idx], temp_q ); move32(); - temp = Mpy_32_16_1( subframeEne_fx, enePreserve_fx[ch] ); - hMasaIsmData->enePreserveIIR_fx[ch][bin] = L_add( hMasaIsmData->enePreserveIIR_fx[ch][bin], temp ); // Q = *cldfb_buf_q + *cldfb_buf_q - 34 = Q-22 move32(); - normVal_fx = L_add( hMasaIsmData->eneMoveIIR_fx[ch][bin], hMasaIsmData->enePreserveIIR_fx[ch][bin] ); - IF( normVal_fx != 0 ) + IF( GT_32( hMasaIsmData->enePreserveIIR_fx[ch][band_idx], 0 ) ) + { + temp = BASOP_Util_Divide3232_Scale_newton( hMasaIsmData->enePreserveIIR_fx[ch][band_idx], L_max( 1, hMasaIsmData->eneOrigIIR_fx[band_idx] ), &temp_q ); + temp_q = sub( Q31, sub( sub( Q31, temp_q ), sub( hMasaIsmData->enePreserveIIR_e[ch][band_idx], hMasaIsmData->eneOrigIIR_e[band_idx] ) ) ); + temp = Sqrt32( temp, &temp_q ); // Q = 31-temp_q + temp = L_shl_sat( temp, sub( temp_q, 3 ) ); // Q28 + } + ELSE { + temp = 0; + move32(); + } - temp1 = BASOP_Util_Divide3232_Scale( hMasaIsmData->enePreserveIIR_fx[ch][bin], normVal_fx, &temp_q ); - ismPreprocMtxNew_fx[ch][ch] = Sqrt16( temp1, &temp_q ); - move16(); - ismPreprocMtxNew_fx[ch][ch] = shl( ismPreprocMtxNew_fx[ch][ch], temp_q ); // Q15 - move16(); - temp1 = BASOP_Util_Divide3232_Scale( hMasaIsmData->eneMoveIIR_fx[ch][bin], normVal_fx, &temp_q ); - ismPreprocMtxNew_fx[sub( 1, ch )][ch] = Sqrt16( temp1, &temp_q ); - move16(); - ismPreprocMtxNew_fx[sub( 1, ch )][ch] = shl( ismPreprocMtxNew_fx[sub( 1, ch )][ch], temp_q ); // Q15 - move16(); + IF( GT_32( ONE_IN_Q30, temp ) ) + { + ismPreprocMtxNew[ch][ch] = temp; + move32(); } ELSE { - ismPreprocMtxNew_fx[ch][ch] = 0; - move16(); - ismPreprocMtxNew_fx[sub( 1, ch )][ch] = 0; - move16(); + ismPreprocMtxNew[ch][ch] = ONE_IN_Q30; // 4 in Q28 + move32(); } - } - /* Get increment value for temporal interpolation */ - FOR( inCh = 0; inCh < 2; inCh++ ) - { - FOR( outCh = 0; outCh < 2; outCh++ ) - ismPreprocMtxIncrement_fx[outCh][inCh] = BASOP_Util_Divide1616_Scale( sub( ismPreprocMtxNew_fx[outCh][inCh], hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][bin] ), nSlots, &temp_q ); - move16(); - ismPreprocMtxIncrement_fx[outCh][inCh] = shl( ismPreprocMtxIncrement_fx[outCh][inCh], temp_q ); // Q15 + ismPreprocMtxNew_e[ch][ch] = Q28; + move32(); + + temp_q = norm_l( hMasaIsmData->eneMoveIIR_fx[ch][band_idx] ); + hMasaIsmData->eneMoveIIR_fx[ch][band_idx] = L_shl( hMasaIsmData->eneMoveIIR_fx[ch][band_idx], temp_q ); + hMasaIsmData->eneMoveIIR_e[ch][band_idx] = sub( hMasaIsmData->eneMoveIIR_e[ch][band_idx], temp_q ); + move32(); move16(); - } - } - /* Mix signals */ - FOR( slot = 0; slot < nSlots; slot++ ) - { - Word16 eqVal_fx = 0; - Word16 eqVal_q_fx = 0; - move16(); - move16(); - Word32 outSlotRe_fx[2]; - Word32 outSlotIm_fx[2]; + IF( GT_32( hMasaIsmData->eneMoveIIR_fx[ch][band_idx], 0 ) ) + { + temp = BASOP_Util_Divide3232_Scale_newton( hMasaIsmData->eneMoveIIR_fx[ch][band_idx], L_max( 1, hMasaIsmData->eneOrigIIR_fx[band_idx] ), &temp_q ); + temp_q = sub( Q31, sub( sub( Q31, temp_q ), sub( hMasaIsmData->eneMoveIIR_e[ch][band_idx], hMasaIsmData->eneOrigIIR_e[band_idx] ) ) ); + temp = Sqrt32( temp, &temp_q ); + temp = L_shl_sat( temp, sub( temp_q, 3 ) ); // Q28 + } + ELSE + { + temp = 0; + move32(); + } - set_zero_fx( outSlotRe_fx, 2 ); - set_zero_fx( outSlotIm_fx, 2 ); + IF( GT_32( ONE_IN_Q30, temp ) ) + { + ismPreprocMtxNew[1 - ch][ch] = temp; + move32(); + } + ELSE + { + ismPreprocMtxNew[1 - ch][ch] = ONE_IN_Q30; // 4 in Q28 + move32(); + } + ismPreprocMtxNew_e[1 - ch][ch] = Q28; // This may be removed + move32(); + } - FOR( outCh = 0; outCh < 2; outCh++ ) + /* Get increment value for temporal interpolation */ + FOR( inCh = 0; inCh < BINAURAL_CHANNELS; inCh++ ) { - FOR( inCh = 0; inCh < 2; inCh++ ) + FOR( outCh = 0; outCh < BINAURAL_CHANNELS; outCh++ ) { - hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][bin] = add( hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][bin], ismPreprocMtxIncrement_fx[outCh][inCh] ); // Q = 15 - move16(); - outSlotRe_fx[outCh] = Mpy_32_16_1( inRe_fx[inCh][slot][bin], hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][bin] ); // Q = *cldfb_buf_q; - move32(); - outSlotIm_fx[outCh] = Mpy_32_16_1( inIm_fx[inCh][slot][bin], hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][bin] ); // Q = *cldfb_buf_q; + temp = L_sub( ismPreprocMtxNew[outCh][inCh], hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][band_idx] ); // Q28 + ismPreprocMtxIncrement[outCh][inCh] = L_shr( temp, 2 ); // Divide by 4 move32(); } } - /* IIR average the energy measures and determine and apply energy-preserving equalizer */ - hMasaIsmData->preprocEneTarget_fx[bin] = Mpy_32_16_1( hMasaIsmData->preprocEneTarget_fx[bin], STEREO_PREPROCESS_IIR_FACTOR_Q15 ); + /* Mix signals */ + hMasaIsmData->preprocEneTarget_fx[band_idx] = Mpy_32_16_1( hMasaIsmData->preprocEneTarget_fx[band_idx], STEREO_PREPROCESS_IIR_FACTOR_Q15 ); // Q = preprocEneTarget_e + move32(); + + hMasaIsmData->preprocEneRealized_fx[band_idx] = Mpy_32_16_1( hMasaIsmData->preprocEneRealized_fx[band_idx], STEREO_PREPROCESS_IIR_FACTOR_Q15 ); // Q = preprocEneRealized_e move32(); - hMasaIsmData->preprocEneRealized_fx[bin] = Mpy_32_16_1( hMasaIsmData->preprocEneRealized_fx[bin], STEREO_PREPROCESS_IIR_FACTOR_Q15 ); + + hMasaIsmData->preprocEneTarget_fx[band_idx] = BASOP_Util_Add_Mant32Exp( hMasaIsmData->preprocEneTarget_fx[band_idx], hMasaIsmData->preprocEneTarget_e[band_idx], totalTargetEne, sub( Q31, subQ ), &hMasaIsmData->preprocEneTarget_e[band_idx] ); // Q = 31-preprocEneTarget_e move32(); - FOR( ch = 0; ch < 2; ch++ ) + + FOR( outCh = 0; outCh < BINAURAL_CHANNELS; outCh++ ) { - hMasaIsmData->preprocEneTarget_fx[bin] = L_add( hMasaIsmData->preprocEneTarget_fx[bin], Madd_32_32( Mpy_32_32( inRe_fx[ch][slot][bin], inRe_fx[ch][slot][bin] ), inIm_fx[ch][slot][bin], inIm_fx[ch][slot][bin] ) ); // Q= *cldfb_buf_q + *cldfb_buf_q - 31 = Q-19 - move32(); - hMasaIsmData->preprocEneRealized_fx[bin] = L_add( hMasaIsmData->preprocEneRealized_fx[bin], Madd_32_32( Mpy_32_32( outSlotRe_fx[ch], outSlotRe_fx[ch] ), outSlotIm_fx[ch], outSlotIm_fx[ch] ) ); // Q= *cldfb_buf_q + *cldfb_buf_q - 31 = Q-19 + FOR( slot = 0; slot < nSlots; slot++ ) + { + FOR( inCh = 0; inCh < BINAURAL_CHANNELS; inCh++ ) + { + hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][band_idx] = L_add( hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][band_idx], ismPreprocMtxIncrement[outCh][inCh] ); // Q28 + move32(); + + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + temp = Mpy_32_32( inRe_fx[inCh][slot][bin], hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][band_idx] ); // Q = q_cldfb* + 28 - 31 = q_cldfb - 3 + outSlotRe[outCh][slot][bin] = L_add( outSlotRe[outCh][slot][bin], L_shl( temp, 3 ) ); // Q = q_cldfb* + move32(); + + temp = Mpy_32_32( inIm_fx[inCh][slot][bin], hMasaIsmData->ismPreprocMatrix_fx[outCh][inCh][band_idx] ); // Q = q_cldfb* + 28 - 31 = q_cldfb*-3 + outSlotIm[outCh][slot][bin] = L_add( outSlotIm[outCh][slot][bin], L_shl( temp, 3 ) ); // Q = q_cldfb* + move32(); + } + } + + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + Word32 instEne_fx; + temp64 = W_mult0_32_32( outSlotRe[outCh][slot][bin], outSlotRe[outCh][slot][bin] ); // 2q-3 + temp64 = W_add( temp64, W_mult0_32_32( outSlotIm[outCh][slot][bin], outSlotIm[outCh][slot][bin] ) ); // 2q-3 + exp1 = W_norm( temp64 ); + instEne_fx = W_extract_h( W_shl( temp64, exp1 ) ); // 2*cldfb_buf_q - 32 + exp1 + exp1 = 31 - ( 2 * ( *cldfb_buf_q ) - 32 + exp1 ); + + hMasaIsmData->preprocEneRealized_fx[band_idx] = BASOP_Util_Add_Mant32Exp( hMasaIsmData->preprocEneRealized_fx[band_idx], hMasaIsmData->preprocEneRealized_e[band_idx], instEne_fx, exp1, &hMasaIsmData->preprocEneRealized_e[band_idx] ); // Q= *cldfb_buf_q + *cldfb_buf_q - 31 = Q-19); + move32(); + } + } + } + + test(); + IF( hMasaIsmData->preprocEneTarget_fx[band_idx] > 0 && hMasaIsmData->preprocEneRealized_fx[band_idx] > 0 ) + { + temp = BASOP_Util_Divide3232_Scale_newton( hMasaIsmData->preprocEneTarget_fx[band_idx], L_max( 1, hMasaIsmData->preprocEneRealized_fx[band_idx] ), &temp_q ); + temp_q = sub( Q31, sub( sub( Q31, temp_q ), sub( hMasaIsmData->preprocEneTarget_e[band_idx], hMasaIsmData->preprocEneRealized_e[band_idx] ) ) ); + temp = Sqrt32( temp, &temp_q ); // Q: 31-temp_q + temp = L_shl_sat( temp, sub( temp_q, 3 ) ); // Q28 + temp_q = Q28; + move16(); + } + ELSE + { + temp = 0; move32(); } - temp1 = BASOP_Util_Divide3232_Scale( hMasaIsmData->preprocEneTarget_fx[bin], L_max( EPSILON_FX, hMasaIsmData->preprocEneRealized_fx[bin] ), &eqVal_q_fx ); - eqVal_fx = Sqrt16( temp1, &eqVal_q_fx ); - temp1 = 4 << Q12; // Q12 - move16(); - IF( LT_16( eqVal_q_fx, Q12 ) ) + + IF( GT_32( ONE_IN_Q30, temp ) ) { - IF( GT_16( eqVal_fx, shr( temp1, sub( Q12, eqVal_q_fx ) ) ) ) - { - eqVal_fx = temp1; - move16(); - eqVal_q_fx = Q12; - move16(); - } + eqVal = temp; + move32(); } ELSE { - if ( GT_16( shr( eqVal_fx, sub( eqVal_q_fx, Q12 ) ), temp1 ) ) + eqVal = ONE_IN_Q30; // 4 in Q28 + move32(); + } + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( slot = 0; slot < nSlots; slot++ ) { - eqVal_fx = temp1; // eqVal_q_fx - move16(); + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + temp = Mpy_32_32( outSlotRe[ch][slot][bin], eqVal ); // Q = (cldfb_q) + 28 -31 = cldfb_q - 3 + inRe_fx[ch][slot][bin] = L_shl_sat( temp, 3 ); + move32(); + + temp = Mpy_32_32( outSlotIm[ch][slot][bin], eqVal ); // Q = (cldfb_q) + 28 -31 = cldfb_q - 3 + inIm_fx[ch][slot][bin] = L_shl_sat( temp, 3 ); + move32(); + } } } + } - FOR( ch = 0; ch < 2; ch++ ) + IF( !masaIsmMode ) + { + Word16 obj_idx1, obj_idx2; + + FOR( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) { - inRe_fx[ch][slot][bin] = Mpy_32_16_1( outSlotRe_fx[ch], eqVal_fx ); - move32(); - inIm_fx[ch][slot][bin] = Mpy_32_16_1( outSlotIm_fx[ch], eqVal_fx ); - move32(); + bin_lo = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + bin_hi = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; + move16(); + move16(); + + obj_idx1 = hParamIsmDec->hParamIsm->obj_indices[band_idx][0][0]; + obj_idx2 = hParamIsmDec->hParamIsm->obj_indices[band_idx][0][1]; + move16(); + move16(); + + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + hSpatParamRendCom->energy_ratio1_fx[dirac_read_idx][bin] = hMasaIsmData->energy_ratio_ism_fx[obj_idx1][dirac_read_idx][bin]; + hSpatParamRendCom->energy_ratio2_fx[dirac_read_idx][bin] = hMasaIsmData->energy_ratio_ism_fx[obj_idx2][dirac_read_idx][bin]; + move32(); + move32(); + } } - *cldfb_buf_q = sub( add( *cldfb_buf_q, eqVal_q_fx ), 15 ); - move16(); } } return; } - static void ivas_masa_ext_rend_parambin_internal_fx( MASA_EXT_REND_HANDLE hMasaExtRend, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, Word32 *output_fx[], /* Q11*/ - const Word16 subframe ) + const Word16 subframe, + const SPLIT_REND_WRAPPER *hSplitRendWrapper, + Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] ) { - DIRAC_DEC_BIN_HANDLE hDiracDecBin; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; PARAMBIN_REND_CONFIG config_data; @@ -5496,7 +6420,22 @@ static void ivas_masa_ext_rend_parambin_internal_fx( Word16 i, j; Word16 nchan_transport; Word16 q_mat; - hDiracDecBin = hMasaExtRend->hDiracDecBin; + Word16 pos_idx; + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData; + Word32 tmp_Cldfb_out_re[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 tmp_Cldfb_out_im[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + + /* these allow re-using the reverb and freq-domain decorrelator signals from ivas_dirac_dec_binaural_process_output() in split rendering for the side renderings */ + Word32 reverbRe_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 reverbIm_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 decorrRe_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 decorrIm_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 subFrameTotalEne_fx[CLDFB_NO_CHANNELS_MAX]; + Word16 subFrameTotalEne_e[CLDFB_NO_CHANNELS_MAX]; + Word32 IIReneLimiter_fx[CLDFB_NO_CHANNELS_MAX]; + Word16 Q_inp_mix; + + hDiracDecBin = hMasaExtRend->hDiracDecBin[0]; hSpatParamRendCom = hMasaExtRend->hSpatParamRendCom; Word32 Cldfb_RealBuffer_in_fx[6][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; @@ -5511,8 +6450,7 @@ static void ivas_masa_ext_rend_parambin_internal_fx( } } Word32 Rmat_fx[3][3]; - - hDiracDecBin = hMasaExtRend->hDiracDecBin; + hDiracDecBin = hMasaExtRend->hDiracDecBin[0]; assert( hDiracDecBin ); hSpatParamRendCom = hMasaExtRend->hSpatParamRendCom; nBins = hSpatParamRendCom->num_freq_bands; @@ -5593,8 +6531,8 @@ static void ivas_masa_ext_rend_parambin_internal_fx( { /* At mono input duplicate the channel to dual-mono, and apply gain correction to ensure same overall level as in stereo mode */ - v_multc_fixed( Cldfb_RealBuffer_in_fx[0][slot], 1518500224 /* INV_SQRT_2 in Q31 */, Cldfb_RealBuffer_in_fx[0][slot], nBins ); - v_multc_fixed( Cldfb_ImagBuffer_in_fx[0][slot], 1518500224 /* INV_SQRT_2 in Q31 */, Cldfb_ImagBuffer_in_fx[0][slot], nBins ); + v_multc_fx( Cldfb_RealBuffer_in_fx[0][slot], 1518500224 /* INV_SQRT_2 in Q31 */, Cldfb_RealBuffer_in_fx[0][slot], nBins ); + v_multc_fx( Cldfb_ImagBuffer_in_fx[0][slot], 1518500224 /* INV_SQRT_2 in Q31 */, Cldfb_ImagBuffer_in_fx[0][slot], nBins ); Copy32( Cldfb_RealBuffer_in_fx[0][slot], Cldfb_RealBuffer_in_fx[1][slot], nBins ); Copy32( Cldfb_ImagBuffer_in_fx[0][slot], Cldfb_ImagBuffer_in_fx[1][slot], nBins ); @@ -5616,18 +6554,22 @@ static void ivas_masa_ext_rend_parambin_internal_fx( IF( EQ_16( nchan_transport, 2 ) ) { + /* in case of split rendering, determine the prototype rotation based on the main direction and use the same prototypes for the offset directions */ adaptTransportSignalsHeadtracked_fx( hCombinedOrientationData, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat_fx ); ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( hCombinedOrientationData, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat_fx ); } } test(); - ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, Rmat_fx, subframe, - hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, NULL, q_inp ); - /* Always using CLDFB decorrelation in MASA EXT renderer */ max_band_decorr = hDiracDecBin->h_freq_domain_decorr_ap_params->max_band_decorr; + ivas_dirac_dec_binaural_formulate_input_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, subframe, + subFrameTotalEne_fx, subFrameTotalEne_e, IIReneLimiter_fx, q_inp ); + ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Rmat_fx, subframe, + hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, + subFrameTotalEne_fx, subFrameTotalEne_e, IIReneLimiter_fx, NULL ); + ivas_dirac_dec_binaural_determine_processing_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, max_band_decorr, Rmat_fx, subframe, hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, 0, NULL ); @@ -5677,11 +6619,137 @@ static void ivas_masa_ext_rend_parambin_internal_fx( move16(); move16(); - ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, hMasaExtRend->cldfbSynRend, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat ); + pMultiBinPoseData = NULL; + if ( hSplitRendWrapper != NULL ) + { + pMultiBinPoseData = &( hSplitRendWrapper->multiBinPoseData ); + + ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, hMasaExtRend->cldfbSynRend, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat, tmp_Cldfb_out_re, tmp_Cldfb_out_im, + reverbRe_fx, reverbIm_fx, decorrRe_fx, decorrIm_fx, &Q_inp_mix, 1 ); + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + for ( i = 0; i < CLDFB_SLOTS_PER_SUBFRAME; i++ ) + { + Copy32( tmp_Cldfb_out_re[ch][i], Cldfb_Out_Real[ch][subframe * CLDFB_SLOTS_PER_SUBFRAME + i], CLDFB_NO_CHANNELS_MAX ); + Copy32( tmp_Cldfb_out_im[ch][i], Cldfb_Out_Imag[ch][subframe * CLDFB_SLOTS_PER_SUBFRAME + i], CLDFB_NO_CHANNELS_MAX ); + } + } + } + else + { + ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, hMasaExtRend->cldfbSynRend, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat, NULL, NULL, + reverbRe_fx, reverbIm_fx, decorrRe_fx, decorrIm_fx, &Q_inp_mix, 1 ); + } hDiracDecBin->hDiffuseDist = NULL; + if ( pMultiBinPoseData != NULL && pMultiBinPoseData->num_poses > 1 ) + { + /* quaternion-based rotation from ivas_binRenderer_internal.c:ivas_binRenderer(), but using absolute rotation instead of delta rotations */ + IVAS_QUATERNION Quaternions_rot, Quaternions_abs, *Quaternions_ref; + Word32 Rmat_local[3][3]; + + + if ( hCombinedOrientationData ) + { + Quaternions_ref = &hCombinedOrientationData->Quaternions[0]; + Copy_Quat_fx( Quaternions_ref, &Quaternions_abs ); + modify_Quat_q_fx( &Quaternions_abs, &Quaternions_abs, Q22 ); + Quaternions_rot.w_fx = L_negate( 12582912 ); /* signal to use Euler */ + Quat2EulerDegree_fx( Quaternions_abs, &Quaternions_abs.z_fx, &Quaternions_abs.y_fx, &Quaternions_abs.x_fx ); /*order in Quat2Euler seems to be reversed ?*/ + Quaternions_abs.w_fx = L_negate( 12582912 ); /* signal to use Euler */ + + FOR( pos_idx = 1; pos_idx < pMultiBinPoseData->num_poses; pos_idx++ ) + { + Quaternions_rot.x_fx = L_add( Quaternions_abs.x_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][0] ); + Quaternions_rot.y_fx = L_add( Quaternions_abs.y_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][1] ); + Quaternions_rot.z_fx = L_add( Quaternions_abs.z_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][2] ); + move32(); + move32(); + move32(); + Euler2Quat_fx( deg2rad_fx( Quaternions_rot.x_fx ), deg2rad_fx( Quaternions_rot.y_fx ), deg2rad_fx( Quaternions_rot.z_fx ), &Quaternions_rot ); + modify_Quat_q_fx( &Quaternions_rot, &Quaternions_rot, Quaternions_ref->q_fact ); + QuatToRotMat_fx( Quaternions_rot, Rmat_local ); + modify_Rmat_q_fx( Rmat_local, Rmat_local, sub( shl( Quaternions_ref->q_fact, 1 ), 32 ), Q30 ); + + hDiracDecBin = hMasaExtRend->hDiracDecBin[pos_idx]; + assert( hDiracDecBin != NULL && "No DiracDecBin handle for this position" ); + + /* re-use input covariance for the side renderings */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + Copy32( hMasaExtRend->hDiracDecBin[0]->ChEne_fx[ch], hDiracDecBin->ChEne_fx[ch], hSpatParamRendCom->num_freq_bands ); + Copy( hMasaExtRend->hDiracDecBin[0]->ChEne_e[ch], hDiracDecBin->ChEne_e[ch], hSpatParamRendCom->num_freq_bands ); + } + Copy32( hMasaExtRend->hDiracDecBin[0]->ChCrossRe_fx, hDiracDecBin->ChCrossRe_fx, hSpatParamRendCom->num_freq_bands ); + Copy32( hMasaExtRend->hDiracDecBin[0]->ChCrossIm_fx, hDiracDecBin->ChCrossIm_fx, hSpatParamRendCom->num_freq_bands ); + Copy( hMasaExtRend->hDiracDecBin[0]->ChCrossRe_e, hDiracDecBin->ChCrossRe_e, hSpatParamRendCom->num_freq_bands ); + Copy( hMasaExtRend->hDiracDecBin[0]->ChCrossIm_e, hDiracDecBin->ChCrossIm_e, hSpatParamRendCom->num_freq_bands ); + + ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Rmat_local, subframe, + hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, + subFrameTotalEne_fx, subFrameTotalEne_e, IIReneLimiter_fx, NULL ); + + ivas_dirac_dec_binaural_determine_processing_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, max_band_decorr, Rmat_local, subframe, + hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, + 0, NULL ); + + q_mat = hDiracDecBin->q_processMtx; + move16(); + q_mat = s_min( q_mat, hDiracDecBin->q_processMtxPrev ); + q_mat = s_min( q_mat, hDiracDecBin->q_processMtxDec ); + q_mat = s_min( q_mat, hDiracDecBin->q_processMtxDecPrev ); + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( slot = 0; slot < BINAURAL_CHANNELS; slot++ ) + { + Scale_sig( hDiracDecBin->processMtxDecRe_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtxDec ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxDecIm_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtxDec ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxDecRePrev_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtxDecPrev ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxDecImPrev_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtxDecPrev ) ); // scaling to q_mat + } + } + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( slot = 0; slot < numInChannels; slot++ ) + { + Scale_sig( hDiracDecBin->processMtxRe_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtx ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxIm_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtx ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxRePrev_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtxPrev ) ); // scaling to q_mat + Scale_sig( hDiracDecBin->processMtxImPrev_fx[ch][slot], nBins, sub( q_mat, hDiracDecBin->q_processMtxPrev ) ); // scaling to q_mat + } + } + hDiracDecBin->q_processMtx = q_mat; + hDiracDecBin->q_processMtxPrev = q_mat; + hDiracDecBin->q_processMtxDec = q_mat; + hDiracDecBin->q_processMtxDecPrev = q_mat; + move16(); + move16(); + move16(); + move16(); + /* re-use reverb and decorr from main direction for the sides */ + ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, hMasaExtRend->cldfbSynRend, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat, tmp_Cldfb_out_re, tmp_Cldfb_out_im, + reverbRe_fx, reverbIm_fx, decorrRe_fx, decorrIm_fx, &Q_inp_mix, 0 ); + + /* copy from temporary buffer to the main split rendering buffer */ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + for ( i = 0; i < CLDFB_SLOTS_PER_SUBFRAME; i++ ) + { + Copy32( tmp_Cldfb_out_re[ch][i], Cldfb_Out_Real[pos_idx * BINAURAL_CHANNELS + ch][subframe * CLDFB_SLOTS_PER_SUBFRAME + i], CLDFB_NO_CHANNELS_MAX ); + Copy32( tmp_Cldfb_out_im[ch][i], Cldfb_Out_Imag[pos_idx * BINAURAL_CHANNELS + ch][subframe * CLDFB_SLOTS_PER_SUBFRAME + i], CLDFB_NO_CHANNELS_MAX ); + } + } + + hDiracDecBin->hDiffuseDist = NULL; + } + } + } + + /* update this counter only after the last rendering of split directions */ + hSpatParamRendCom->slots_rendered = add( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->subframe_nbslots[subframe] ); hSpatParamRendCom->subframes_rendered = add( hSpatParamRendCom->subframes_rendered, 1 ); move16(); @@ -5698,10 +6766,14 @@ static void ivas_masa_ext_rend_parambin_internal_fx( } void ivas_masa_ext_rend_parambin_render_fx( - MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA ext rend structure */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ - Word32 *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output Q11*/ - const Word16 num_subframes ) /* i : number of subframes to render */ + MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA ext rend structure */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ + Word32 *output_fx[], /* i/o: synthesized core-coder transport channels/DirAC output Q11*/ + const Word16 num_subframes, /* i : number of subframes to render */ + const SPLIT_REND_WRAPPER *hSplitRendWrapper, /* i : split rendering orientation data */ + Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : rendered orientations for split rend. real part of cldfb */ + Word32 Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] /* o : rendered orientations for split rend. imag part of cldfb */ +) { Word16 subframe; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; @@ -5712,7 +6784,7 @@ void ivas_masa_ext_rend_parambin_render_fx( FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - p_output[ch] = output_f[ch]; + p_output[ch] = output_fx[ch]; } hSpatParamRendCom->subframes_rendered = hSpatParamRendCom->dirac_read_idx; @@ -5723,8 +6795,7 @@ void ivas_masa_ext_rend_parambin_render_fx( hSpatParamRendCom->slots_rendered = 0; move16(); - ivas_masa_ext_rend_parambin_internal_fx( hMasaExtRend, hCombinedOrientationData, p_output, hSpatParamRendCom->dirac_read_idx ); - + ivas_masa_ext_rend_parambin_internal_fx( hMasaExtRend, hCombinedOrientationData, p_output, hSpatParamRendCom->dirac_read_idx, hSplitRendWrapper, Cldfb_Out_Real, Cldfb_Out_Imag ); FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { p_output[ch] += n_samples_sf; diff --git a/lib_rend/ivas_dirac_decorr_dec_fx.c b/lib_rend/ivas_dirac_decorr_dec_fx.c index 1ffe0da7424b728fc644a9f70c40b1d3a50eb587..acbfb3bd2a5ca36e8b63b3ea9959d4c26272d66d 100644 --- a/lib_rend/ivas_dirac_decorr_dec_fx.c +++ b/lib_rend/ivas_dirac_decorr_dec_fx.c @@ -55,18 +55,16 @@ #define DIRAC_DUCK_ALPHA_FX 1717986944 /* Q31 */ #define ONE_M_DIRAC_DUCK_ALPHA 429496736 /* Q31 */ -#ifdef FIX_1110_OPTIM_DIRAC_DECORR_PROC /* Maximal useful q-format, represents range of 2^-126 (float min) */ #define MAX_Q_FX 157 -#endif /*------------------------------------------------------------------------- * Local function prototypes *------------------------------------------------------------------------*/ -static void get_lattice_coeffs_fx( const Word16 band_index, const Word16 channel_index, Word16 *lattice_coeffs ); -static void lattice2allpass_fx( const Word16 filter_length, const Word16 *lattice_coeffs_fx, Word16 *filter_coeffs_num_real_fx, Word16 *filter_coeffs_den_real_fx ); +static void get_lattice_coeffs_fx( const Word16 band_index, const Word16 channel_index, Word32 *lattice_coeffs ); +static void lattice2allpass_fx( const Word16 filter_length, const Word32 *lattice_coeffs_fx, Word32 *filter_coeffs_num_real_fx, Word32 *filter_coeffs_den_real_fx ); /*------------------------------------------------------------------------- * ivas_dirac_dec_decorr_open() @@ -92,7 +90,8 @@ ivas_error ivas_dirac_dec_decorr_open_fx( Word16 split_frequencies_bands[DIRAC_DECORR_NUM_SPLIT_BANDS + 1] = { 0, 0, 0, 23768 }; move16(); Word16 *split_freq_ptr; - Word16 cur_lattice_delta_phi_fx, lattice_coeffs_fx[2 * DIRAC_MAX_DECORR_FILTER_LEN]; + Word16 cur_lattice_delta_phi_fx; + Word32 lattice_coeffs_fx[2 * DIRAC_MAX_DECORR_FILTER_LEN]; ivas_error error; @@ -279,12 +278,12 @@ ivas_error ivas_dirac_dec_decorr_open_fx( freq_domain_decorr_ap_state->q_decorr_buffer = Q31; move16(); - IF( ( freq_domain_decorr_ap_params->filter_coeff_num_real_fx = (Word16 *) malloc( sizeof( Word16 ) * imult1616( add( ap_filter_length[split_band_index_start], 1 ), imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) ) == NULL ) + IF( ( freq_domain_decorr_ap_params->filter_coeff_num_real_fx = (Word32 *) malloc( sizeof( Word32 ) * imult1616( add( ap_filter_length[split_band_index_start], 1 ), imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); } - IF( ( freq_domain_decorr_ap_params->filter_coeff_den_real_fx = (Word16 *) malloc( sizeof( Word16 ) * imult1616( add( ap_filter_length[split_band_index_start], 1 ), imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) ) == NULL ) + IF( ( freq_domain_decorr_ap_params->filter_coeff_den_real_fx = (Word32 *) malloc( sizeof( Word32 ) * imult1616( add( ap_filter_length[split_band_index_start], 1 ), imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); } @@ -416,7 +415,7 @@ void ivas_dirac_dec_decorr_process_fx( Word32 frame_ma_fx[2 * ( DIRAC_MAX_DECORR_FILTER_LEN + 1 )]; Word32 *p_frame_dec_fx, *decorr_buffer_fx; Word16 *phase_coeff_real_fx, *phase_coeff_imag_fx; - Word16 *filter_coeff_num_real_fx, *filter_coeff_den_real_fx; + Word32 *filter_coeff_num_real_fx, *filter_coeff_den_real_fx; Word32 *decorr_buffer_start_ptr_fx, *decorr_buffer_ptr_fx; Word32 input_real_fx, input_imag_fx, filter_frame_imag_fx, filter_frame_real_fx; Word16 q_aux_buffer, q_onset_dec, q_frame_f; @@ -483,13 +482,14 @@ void ivas_dirac_dec_decorr_process_fx( q_shift = 0; move16(); } + set32_fx( aux_buffer_fx, 0, 2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX ); FOR( ch_idx = 0; ch_idx < num_protos_dir; ch_idx++ ) { - v_shr( &input_frame_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], negate( q_shift ), &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], imult1616( 2, num_freq_bands ) ); // Q - q_shift + v_shr( &input_frame_fx[2 * ch_idx * num_freq_bands], negate( q_shift ), &aux_buffer_fx[2 * ch_idx * num_freq_bands], imult1616( 2, num_freq_bands ) ); // Q - q_shift } FOR( ch_idx = 0; ch_idx < num_protos_dir; ch_idx++ ) { - v_mult_fixed( &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, max_band_decorr_temp ) )], imult1616( 2, max_band_decorr_temp ) ); // q_aux_buffer + v_mult_fx( &aux_buffer_fx[2 * ch_idx * num_freq_bands], &aux_buffer_fx[2 * ch_idx * num_freq_bands], &aux_buffer_fx[2 * ch_idx * max_band_decorr_temp], imult1616( 2, max_band_decorr_temp ) ); // q_aux_buffer } q_aux_buffer = sub( add( add( add( q_input_frame, q_input_frame ), q_shift ), q_shift ), 31 ); @@ -497,10 +497,18 @@ void ivas_dirac_dec_decorr_process_fx( { v_add_inc_fx( &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, max_band_decorr_temp ) )], 2, &aux_buffer_fx[add( imult1616( 2, imult1616( ch_idx, max_band_decorr_temp ) ), 1 )], 2, &aux_buffer_fx[imult1616( ch_idx, max_band_decorr_temp )], 1, max_band_decorr_temp ); // q_aux_buffer } + if ( is_zero_arr( aux_buffer_fx, 2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX ) ) + { + q_aux_buffer = 31; + move16(); + } + /* compute onset filter */ max_band_decorr = h_freq_domain_decorr_ap_params->max_band_decorr; move16(); + Word16 decorX2 = shl( max_band_decorr, 1 ); + set32_fx( onset_filter_fx, ONE_IN_Q31, imult1616( num_protos_diff, num_freq_bands ) ); Word16 q_temp = s_min( q_onset_dec, q_aux_buffer ); @@ -539,9 +547,9 @@ void ivas_dirac_dec_decorr_process_fx( FOR( ch_idx = 0; ch_idx < num_protos_dir; ch_idx++ ) { //** this might effect when max_band_decorr is not equal to max_band_decorr_temp// - v_mult_inc_fixed( &input_frame_fx[2 * ch_idx * num_freq_bands], 2, &onset_filter_fx[ch_idx * num_freq_bands], 1, &aux_buffer_fx[2 * ch_idx * max_band_decorr], 2, max_band_decorr ); // q_input_frame + v_mult_inc_fx( &input_frame_fx[2 * ch_idx * num_freq_bands], 2, &onset_filter_fx[ch_idx * num_freq_bands], 1, &aux_buffer_fx[2 * ch_idx * max_band_decorr], 2, max_band_decorr ); // q_input_frame - v_mult_inc_fixed( &input_frame_fx[2 * ch_idx * num_freq_bands + 1], 2, &onset_filter_fx[ch_idx * num_freq_bands], 1, &aux_buffer_fx[2 * ch_idx * max_band_decorr + 1], 2, max_band_decorr ); // q_input_frame + v_mult_inc_fx( &input_frame_fx[2 * ch_idx * num_freq_bands + 1], 2, &onset_filter_fx[ch_idx * num_freq_bands], 1, &aux_buffer_fx[2 * ch_idx * max_band_decorr + 1], 2, max_band_decorr ); // q_input_frame } q_aux_buffer = q_input_frame; move16(); @@ -590,18 +598,6 @@ void ivas_dirac_dec_decorr_process_fx( Word16 decorr_buff_tot_len = imult1616( imult1616( shl( decorr_buffer_len, 1 ), max_band_decorr ), num_channels ); guarded_bits = 0; -#ifndef FIX_1110_OPTIM_DIRAC_DECORR_PROC - FOR( Word16 i = 0; i < decorr_buff_tot_len; i++ ) - { - IF( h_freq_domain_decorr_ap_state->decorr_buffer_fx[i] != 0 ) - { - guarded_bits = s_max( find_guarded_bits_fx( 2 ), 3 ); - } - } - q_shift = sub( getScaleFactor32( h_freq_domain_decorr_ap_state->decorr_buffer_fx, decorr_buff_tot_len ), guarded_bits ); - Scale_sig32( h_freq_domain_decorr_ap_state->decorr_buffer_fx, decorr_buff_tot_len, q_shift ); - q_decorr_buf = add( q_decorr_buf, q_shift ); -#else Flag is_zero = is_zero_arr( h_freq_domain_decorr_ap_state->decorr_buffer_fx, decorr_buff_tot_len ); if ( is_zero == 0 ) { @@ -617,7 +613,6 @@ void ivas_dirac_dec_decorr_process_fx( q_decorr_buf = add( q_decorr_buf, q_shift ); } } -#endif q_shift = getScaleFactor32( aux_buffer_fx, imult1616( imult1616( 2, num_protos_dir ), max_band_decorr_temp ) ); Word16 buf_len = shl( imult1616( num_protos_dir, max_band_decorr_temp ), 1 ); @@ -681,19 +676,12 @@ void ivas_dirac_dec_decorr_process_fx( /* MA part of filter impulse response */ FOR( l = 0; l < filter_length; l++ ) { -#ifndef FIX_1110_OPTIM_DIRAC_DECORR_PROC - frame_ma_fx[2 * l] = Mpy_32_16_1( input_real_fx, filter_coeff_num_real_fx[l] ); // Q_qux -3 = q_deorr - // frame_ma_fx[2 * l] = L_shr(frame_ma_fx[2 * l],3); // scaling to q_decorr_buf - frame_ma_fx[add( shl( l, 1 ), 1 )] = Mpy_32_16_1( input_imag_fx, filter_coeff_num_real_fx[l] ); // Q_qux - 3 = q_deorr - // frame_ma_fx[2 * l + 1] = L_shr(frame_ma_fx[2 * l + 1], 3); // scaling to q_decorr_buf -#else - frame_ma_fx[2 * l] = Mpy_32_16_1( input_real_fx, filter_coeff_num_real_fx[l] ); // Q_qux -3 = q_deorr - frame_ma_fx[2 * l + 1] = Mpy_32_16_1( input_imag_fx, filter_coeff_num_real_fx[l] ); // Q_qux - 3 = q_deorr -#endif + frame_ma_fx[2 * l] = Mpy_32_32( input_real_fx, filter_coeff_num_real_fx[l] ); // Q_qux -3 = q_deorr + frame_ma_fx[2 * l + 1] = Mpy_32_32( input_imag_fx, filter_coeff_num_real_fx[l] ); // Q_qux - 3 = q_deorr move32(); move32(); } - decorr_buffer_ptr_fx = decorr_buffer_start_ptr_fx + shl( imult1616( ( sub( pre_delay, 1 ) ), decorr_buffer_step ), 1 ); + decorr_buffer_ptr_fx = decorr_buffer_start_ptr_fx + ( pre_delay - 1 ) * decorr_buffer_step * 2; /*add MA part to state */ decorr_buffer_ptr_fx[0] = L_add( decorr_buffer_ptr_fx[0], frame_ma_fx[0] ); @@ -705,45 +693,26 @@ void ivas_dirac_dec_decorr_process_fx( filter_frame_real_fx = decorr_buffer_ptr_fx[0]; // q_decorr filter_frame_imag_fx = decorr_buffer_ptr_fx[1]; // q_decorr -#ifndef FIX_1110_OPTIM_DIRAC_DECORR_PROC - decorr_buffer_ptr_fx += shl( decorr_buffer_step, 1 ); -#else Word16 decorr_buffer_step2x = shl( decorr_buffer_step, 1 ); decorr_buffer_ptr_fx += decorr_buffer_step2x; move16(); -#endif FOR( l = 1; l < filter_length; l++ ) { // q adjustment needed// -#ifndef FIX_1110_OPTIM_DIRAC_DECORR_PROC - decorr_buffer_ptr_fx[0] = L_add( decorr_buffer_ptr_fx[0], frame_ma_fx[2 * l] ); // q_decorr - Word32 temp_1 = Mpy_32_16_1( filter_frame_real_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 - temp_1 = L_shl( temp_1, 3 ); // q_decorr - decorr_buffer_ptr_fx[0] = L_sub( decorr_buffer_ptr_fx[0], temp_1 ); // q_deocor - decorr_buffer_ptr_fx[1] = L_add( decorr_buffer_ptr_fx[1], frame_ma_fx[add( shl( l, 1 ), 1 )] ); // q_decorr - Word32 temp_2 = Mpy_32_16_1( filter_frame_imag_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 - temp_2 = L_shl( temp_2, 3 ); // q_decorr - decorr_buffer_ptr_fx[1] = L_sub( decorr_buffer_ptr_fx[1], temp_2 ); // q_decorr - decorr_buffer_ptr_fx += imult1616( 2, decorr_buffer_step ); - move32(); - move32(); - move32(); -#else - Word32 temp_1 = Mpy_32_16_1( filter_frame_real_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 + Word32 temp_1 = Mpy_32_32( filter_frame_real_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 temp_1 = L_shl( temp_1, 3 ); // q_decorr decorr_buffer_ptr_fx[0] = L_sub( L_add( decorr_buffer_ptr_fx[0], frame_ma_fx[2 * l] ), temp_1 ); // q_deocor move32(); - Word32 temp_2 = Mpy_32_16_1( filter_frame_imag_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 + Word32 temp_2 = Mpy_32_32( filter_frame_imag_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 temp_2 = L_shl( temp_2, 3 ); // q_decorr decorr_buffer_ptr_fx[1] = L_sub( L_add( decorr_buffer_ptr_fx[1], frame_ma_fx[2 * l + 1] ), temp_2 ); // q_decorr move32(); decorr_buffer_ptr_fx += decorr_buffer_step2x; move16(); -#endif } } } @@ -757,38 +726,34 @@ void ivas_dirac_dec_decorr_process_fx( Word16 q_direct_energy; Word64 aux_64[2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX]; Word16 e_reverb_energy_smooth, e_direct_energy_smooth; - Word16 offset1, offset2; + Word16 offset1; + Word16 norm = 63; move16(); e_reverb_energy_smooth = sub( 31, h_freq_domain_decorr_ap_state->q_reverb_energy_smooth ); e_direct_energy_smooth = sub( 31, h_freq_domain_decorr_ap_state->q_direct_energy_smooth ); // scaling to get max precision for aux_buffer values// -#ifdef MSAN_FIX q_shift = Q31; move16(); - offset = shl( max_band_decorr, 1 ); FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { q_shift = s_min( q_shift, - L_norm_arr( &frame_dec_fx[2 * ch_idx * num_freq_bands], offset ) ); + L_norm_arr( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2 ) ); } FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { - scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], offset, q_shift ); + scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2, q_shift ); } -#else - q_shift = L_norm_arr( frame_dec_fx, ( 2 * max_band_decorr + incr_aux ) * num_channels ); - Scale_sig32( frame_dec_fx, ( 2 * max_band_decorr + incr_aux ) * num_channels, q_shift ); -#endif q_frame_f = add( q_frame_f, q_shift ); IF( h_freq_domain_decorr_ap_params->use_ducker ) { Word16 len1 = shl( imult1616( max_band_decorr, num_protos_dir ), 1 ); + /* compute direct power w/o onsets for the energy ratio, signal is still in the aux buffer */ - v_mult_fixed( aux_buffer_fx, aux_buffer_fx, aux_buffer_fx, len1 ); // 2 *q_aux -31 + v_mult_fx( aux_buffer_fx, aux_buffer_fx, aux_buffer_fx, len1 ); // 2 *q_aux -31 q_aux_buffer = sub( shl( q_aux_buffer, 1 ), 31 ); @@ -802,24 +767,8 @@ void ivas_dirac_dec_decorr_process_fx( q_direct_energy = q_aux_buffer; move16(); -#ifdef FIX_1110_OPTIM_DIRAC_DECORR_PROC /* Attention: this loop reports norm=0, whenever any data is 0. */ /* Therefore, useful left-shifts are skipped, accuracy is lost. */ -#endif -#ifndef FIX_1110_OPTIM_DIRAC_DECORR_PROC - /* calculate the power of the decorrelated signal */ - FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) - { - offset1 = shl( imult1616( ch_idx, num_freq_bands ), 1 ); - offset2 = shl( imult1616( ch_idx, max_band_decorr ), 1 ); - FOR( Word16 i = 0; i < 2 * max_band_decorr; i++ ) - { - aux_64[add( offset2, i )] = W_mult0_32_32( frame_dec_fx[add( offset1, i )], frame_dec_fx[add( offset1, i )] ); - move64(); - norm = s_min( norm, W_norm( aux_64[add( offset2, i )] ) ); - } - } -#else /* calculate the power of the decorrelated signal */ Word64 *m64_aux = aux_64; move32(); @@ -828,12 +777,11 @@ void ivas_dirac_dec_decorr_process_fx( Word32 *m32_frame_dec_fx = frame_dec_fx; move32(); offset1 = shl( num_freq_bands, 1 ); - offset2 = shl( max_band_decorr, 1 ); FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { - FOR( Word16 i = 0; i < offset2; i++ ) + FOR( Word16 i = 0; i < decorX2; i++ ) { m64_aux[i] = W_mult0_32_32( m32_frame_dec_fx[i], m32_frame_dec_fx[i] ); move64(); @@ -843,20 +791,19 @@ void ivas_dirac_dec_decorr_process_fx( move64(); } } - m64_aux += offset2; + m64_aux += decorX2; m32_frame_dec_fx += offset1; move64(); move32(); } norm = W_norm( min64 ); -#endif - norm = sub( norm, 1 /*find_guarded_bits_fx( 2 )*/ ); + norm = sub( norm, 33 ); FOR( Word16 i = 0; i < 2 * num_channels * max_band_decorr; i++ ) { - aux_buffer_fx[i] = W_extract_h( W_shl( aux_64[i], norm ) ); + aux_buffer_fx[i] = W_shl_sat_l( aux_64[i], norm ); move32(); } - q_aux_buffer = add( shl( q_frame_f, 1 ), sub( norm, 32 ) ); + q_aux_buffer = add( shl( q_frame_f, 1 ), norm ); FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) @@ -866,48 +813,22 @@ void ivas_dirac_dec_decorr_process_fx( /* smooth energies */ -#ifndef FIX_1110_OPTIM_DIRAC_DECORR_PROC - v_multc_fixed( aux_buffer_fx, ONE_M_DIRAC_DUCK_ALPHA, aux_buffer_fx, imult1616( num_channels, max_band_decorr ) ); // q_aux_buffer - - v_multc_fixed( h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, DIRAC_DUCK_ALPHA_FX, h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, imult1616( num_channels, max_band_decorr ) ); // same-q - - v_add_fixed_me( aux_buffer_fx, sub( 31, q_aux_buffer ), h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, e_reverb_energy_smooth, h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, &e_reverb_energy_smooth, imult1616( num_channels, max_band_decorr ), 0 ); - h_freq_domain_decorr_ap_state->q_reverb_energy_smooth = sub( 31, e_reverb_energy_smooth ); - - v_multc_fixed( direct_energy_fx, ONE_M_DIRAC_DUCK_ALPHA, direct_energy_fx, imult1616( num_protos_dir, max_band_decorr ) ); // same q - - v_multc_fixed( h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, DIRAC_DUCK_ALPHA_FX, h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, imult1616( num_protos_dir, max_band_decorr ) ); // same q - - v_add_fixed_me( direct_energy_fx, sub( 31, q_direct_energy ), h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, e_direct_energy_smooth, h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, &e_direct_energy_smooth, imult1616( num_protos_dir, max_band_decorr ), 0 ); - h_freq_domain_decorr_ap_state->q_direct_energy_smooth = sub( 31, e_direct_energy_smooth ); - move16(); - - // scaling energy buffers for better precision for higher values// - q_shift = L_norm_arr( h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, imult1616( num_protos_dir, max_band_decorr ) ); - Scale_sig32( h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, imult1616( num_protos_dir, max_band_decorr ), q_shift ); - h_freq_domain_decorr_ap_state->q_direct_energy_smooth = add( h_freq_domain_decorr_ap_state->q_direct_energy_smooth, q_shift ); - move16(); - - - q_shift = L_norm_arr( h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, imult1616( num_channels, max_band_decorr ) ); - Scale_sig32( h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, imult1616( num_channels, max_band_decorr ), q_shift ); - h_freq_domain_decorr_ap_state->q_reverb_energy_smooth = add( h_freq_domain_decorr_ap_state->q_reverb_energy_smooth, q_shift ); - move16(); -#else Word16 len = imult1616( num_channels, max_band_decorr ); Word16 aux_e = sub( 31, q_aux_buffer ); Word16 max_e = s_max( aux_e, e_reverb_energy_smooth ); Word16 shr_aux = sub( max_e, aux_e ); /* Note: headroom is zero */ Word16 shr_res = sub( max_e, e_reverb_energy_smooth ); /* Note: headroom is zero */ + Word32 temp1 = L_shr( ONE_M_DIRAC_DUCK_ALPHA, shr_aux ); + Word32 temp2 = L_shr( DIRAC_DUCK_ALPHA_FX, shr_res ); /* Note: DIRAC_DUCK_ALPHA_FX and ONE_M_DIRAC_DUCK_ALPHA are both in Q31 (e=0) */ /* => a multiplication with this values does not change the q/e value. */ FOR( Word16 i = 0; i < len; i++ ) { - h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx[i] = L_add( - L_shr( Mpy_32_32( aux_buffer_fx[i], ONE_M_DIRAC_DUCK_ALPHA ), shr_aux ), - L_shr( Mpy_32_32( h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx[i], DIRAC_DUCK_ALPHA_FX ), shr_res ) ); + h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx[i] = Madd_32_32( + Mpy_32_32( aux_buffer_fx[i], temp1 ), + h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx[i], temp2 ); move32(); } e_reverb_energy_smooth = max_e; @@ -920,12 +841,14 @@ void ivas_dirac_dec_decorr_process_fx( Word16 max_x = s_max( den_e, e_direct_energy_smooth ); Word16 shr_den = sub( max_x, den_e ); /* Note: headroom is zero */ Word16 shr_des = sub( max_x, e_direct_energy_smooth ); /* Note: headroom is zero */ + temp1 = L_shr( ONE_M_DIRAC_DUCK_ALPHA, shr_den ); + temp2 = L_shr( DIRAC_DUCK_ALPHA_FX, shr_des ); FOR( Word16 i = 0; i < len; i++ ) { - h_freq_domain_decorr_ap_state->direct_energy_smooth_fx[i] = L_add( - L_shr( Mpy_32_32( direct_energy_fx[i], ONE_M_DIRAC_DUCK_ALPHA ), shr_den ), - L_shr( Mpy_32_32( h_freq_domain_decorr_ap_state->direct_energy_smooth_fx[i], DIRAC_DUCK_ALPHA_FX ), shr_des ) ); + h_freq_domain_decorr_ap_state->direct_energy_smooth_fx[i] = Madd_32_32( + Mpy_32_32( direct_energy_fx[i], temp1 ), + h_freq_domain_decorr_ap_state->direct_energy_smooth_fx[i], temp2 ); move32(); } e_direct_energy_smooth = max_x; @@ -934,46 +857,29 @@ void ivas_dirac_dec_decorr_process_fx( move16(); // scaling energy buffers for better precision for higher values// - q_shift = L_norm_arr( h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, imult1616( num_protos_dir, max_band_decorr ) ); - IF( q_shift != 0 ) - { - Scale_sig32( h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, imult1616( num_protos_dir, max_band_decorr ), q_shift ); - h_freq_domain_decorr_ap_state->q_direct_energy_smooth = add( h_freq_domain_decorr_ap_state->q_direct_energy_smooth, q_shift ); - move16(); - } - q_shift = L_norm_arr( h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, imult1616( num_channels, max_band_decorr ) ); - IF( q_shift != 0 ) - { - Scale_sig32( h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, imult1616( num_channels, max_band_decorr ), q_shift ); - h_freq_domain_decorr_ap_state->q_reverb_energy_smooth = add( h_freq_domain_decorr_ap_state->q_reverb_energy_smooth, q_shift ); - move16(); - } h_freq_domain_decorr_ap_state->q_reverb_energy_smooth = s_min( MAX_Q_FX, h_freq_domain_decorr_ap_state->q_reverb_energy_smooth ); h_freq_domain_decorr_ap_state->q_direct_energy_smooth = s_min( MAX_Q_FX, h_freq_domain_decorr_ap_state->q_direct_energy_smooth ); -#endif e_reverb_energy_smooth = sub( 31, h_freq_domain_decorr_ap_state->q_reverb_energy_smooth ); e_direct_energy_smooth = sub( 31, h_freq_domain_decorr_ap_state->q_direct_energy_smooth ); // this step is b/c we are left shifting frame_dec_fx at the end of below for loop/ -#ifdef MSAN_FIX q_shift = Q31; move16(); FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { q_shift = s_min( q_shift, - sub( L_norm_arr( &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ) ), - Q2 ) ); + L_norm_arr( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2 ) ); } + q_shift = sub( q_shift, 2 ); FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { - Scale_sig32( &frame_dec_fx[shl( imult1616( ch_idx, num_freq_bands ), 1 )], shl( max_band_decorr, 1 ), q_shift ); + Scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2, q_shift ); } -#else - q_shift = sub( L_norm_arr( frame_dec_fx, ( 2 * max_band_decorr + incr_aux ) * num_channels ), 2 ); - Scale_sig32( frame_dec_fx, ( 2 * max_band_decorr + incr_aux ) * num_channels, q_shift ); -#endif q_frame_f = add( q_frame_f, q_shift ); + Word16 diff1 = sub( e_direct_energy_smooth, e_reverb_energy_smooth ); + Word16 diff2 = add( Q30, diff1 ); + diff1 = sub( Q30, diff1 ); FOR( ch_idx = 0; ch_idx < num_channels; ch_idx++ ) { @@ -993,33 +899,27 @@ void ivas_dirac_dec_decorr_process_fx( move32(); move32(); - Word32 temp_1 = Mpy_32_32( direct_energy_loc, DIRAC_DUCK_GAMMA_FX ); // e+1 - Word32 temp_2 = Mpy_32_32( reverb_energy_loc, DIRAC_DUCK_GAMMA_FX ); // e+1 - Word16 comp_flag_1 = BASOP_Util_Cmp_Mant32Exp( reverb_energy_loc, e_reverb_energy_smooth, temp_1, add( e_direct_energy_smooth, 1 ) ); - Word16 comp_flag_2 = BASOP_Util_Cmp_Mant32Exp( direct_energy_loc, e_direct_energy_smooth, temp_2, add( e_reverb_energy_smooth, 1 ) ); - IF( EQ_16( comp_flag_1, 1 ) ) + Word64 temp_1 = W_sub( W_shl( reverb_energy_loc, diff1 ), W_mult0_32_32( direct_energy_loc, DIRAC_DUCK_GAMMA_FX ) ); + Word64 temp_2 = W_sub( W_shl( direct_energy_loc, diff2 ), W_mult0_32_32( reverb_energy_loc, DIRAC_DUCK_GAMMA_FX ) ); + + IF( temp_1 > 0 ) { - duck_gain = BASOP_Util_Divide3232_Scale( temp_1, L_add( reverb_energy_loc, EPSILON_FX ), &e_duck_gain ); + duck_gain = BASOP_Util_Divide3232_Scale( Mpy_32_32( direct_energy_loc, DIRAC_DUCK_GAMMA_FX ), L_add( reverb_energy_loc, EPSILON_FX ), &e_duck_gain ); e_duck_gain = add( e_duck_gain, sub( add( e_direct_energy_smooth, 1 ), e_reverb_energy_smooth ) ); duck_gain = Sqrt16( duck_gain, &e_duck_gain ); duck_gain = shl( duck_gain, sub( e_duck_gain, 1 ) ); // Q14 -#ifndef FIX_1110_OPTIM_DIRAC_DECORR_PROC - frame_dec_fx_ptr[2 * band_idx] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx], duck_gain ), 1 ); // q_frame_f - frame_dec_fx_ptr[add( shl( band_idx, 1 ), 1 )] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[add( shl( band_idx, 1 ), 1 )], duck_gain ), 1 ); // q_frame_f -#else frame_dec_fx_ptr[2 * band_idx] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx], duck_gain ), 1 ); // q_frame_f frame_dec_fx_ptr[2 * band_idx + 1] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx + 1], duck_gain ), 1 ); // q_frame_f -#endif move32(); move32(); } - ELSE IF( EQ_16( comp_flag_2, 1 ) ) + ELSE IF( temp_2 > 0 ) { - duck_gain = BASOP_Util_Divide3232_Scale( direct_energy_loc, L_add( temp_2, EPSILON_FX ), &e_duck_gain ); + duck_gain = BASOP_Util_Divide3232_Scale( direct_energy_loc, L_add( Mpy_32_32( reverb_energy_loc, DIRAC_DUCK_GAMMA_FX ), EPSILON_FX ), &e_duck_gain ); e_duck_gain = add( e_duck_gain, sub( e_direct_energy_smooth, add( e_reverb_energy_smooth, 1 ) ) ); duck_gain = Sqrt16( duck_gain, &e_duck_gain ); @@ -1029,13 +929,8 @@ void ivas_dirac_dec_decorr_process_fx( } */ duck_gain = shl_sat( duck_gain, sub( e_duck_gain, 1 ) ); // Q14 -#ifndef FIX_1110_OPTIM_DIRAC_DECORR_PROC - frame_dec_fx_ptr[2 * band_idx] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx], duck_gain ), 2 ); // q_frame_dec - frame_dec_fx_ptr[add( shl( band_idx, 1 ), 1 )] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[add( shl( band_idx, 1 ), 1 )], duck_gain ), 2 ); // q_frame_dec -#else frame_dec_fx_ptr[2 * band_idx] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx], duck_gain ), 1 ); // q_frame_dec frame_dec_fx_ptr[2 * band_idx + 1] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx + 1], duck_gain ), 1 ); // q_frame_dec -#endif move32(); move32(); } @@ -1054,34 +949,26 @@ void ivas_dirac_dec_decorr_process_fx( Word16 sf = MAX_16; FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { - sf = s_min( sf, getScaleFactor32( &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ) ) ); + sf = s_min( sf, getScaleFactor32( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2 ) ); } sf = s_min( sub( sf, 1 ), q_shift ); q_if_local = sub( q_shift, sf ); q_shift = sf; move16(); // scaling it to sf -#ifdef MSAN_FIX FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { - scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ), q_shift ); + scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2, q_shift ); } -#else - Scale_sig32( frame_dec_fx, ( 2 * max_band_decorr + incr_aux ) * num_channels, q_shift ); // scaling it to input q -#endif q_frame_f = add( q_frame_f, sf ); } ELSE IF( q_shift < 0 ) { // scaling it to input q -#ifdef MSAN_FIX FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { - scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ), q_shift ); + scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2, q_shift ); } -#else - Scale_sig32( frame_dec_fx, ( 2 * max_band_decorr + incr_aux ) * num_channels, q_shift ); // scaling it to input q -#endif q_frame_f = q_input_frame; q_if_local = 0; move16(); @@ -1091,19 +978,41 @@ void ivas_dirac_dec_decorr_process_fx( IF( EQ_16( h_freq_domain_decorr_ap_params->add_back_onsets_on, 1 ) ) { - FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + IF( q_if_local ) { - offset = imult1616( proto_index_dir[ch_idx], num_freq_bands ); - - FOR( k = 0; k < max_band_decorr; ++k ) + FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { - aux_buffer_fx[2 * k] = Mpy_32_32( L_shr_r( input_frame_fx[2 * ( offset + k )], q_if_local ), L_sub( ONE_IN_Q31, onset_filter_fx[offset + k] ) ); - aux_buffer_fx[add( shl( k, 1 ), 1 )] = Mpy_32_32( L_shr_r( input_frame_fx[2 * ( offset + k ) + 1], q_if_local ), L_sub( ONE_IN_Q31, onset_filter_fx[offset + k] ) ); // q_frame_f - move32(); - move32(); + offset = imult1616( proto_index_dir[ch_idx], num_freq_bands ); + + FOR( k = 0; k < max_band_decorr; ++k ) + { + Word32 op2 = L_shr( L_sub( ONE_IN_Q31, onset_filter_fx[offset + k] ), q_if_local ); + aux_buffer_fx[2 * k] = Mpy_32_32( input_frame_fx[2 * ( offset + k )], op2 ); + aux_buffer_fx[2 * k + 1] = Mpy_32_32( input_frame_fx[2 * ( offset + k ) + 1], op2 ); // q_frame_f + move32(); + move32(); + } + + v_add_fx( &frame_dec_fx[2 * ch_idx * num_freq_bands], aux_buffer_fx, &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2 ); } + } + ELSE + { + FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + offset = imult1616( proto_index_dir[ch_idx], num_freq_bands ); + + FOR( k = 0; k < max_band_decorr; ++k ) + { + Word32 op2 = L_sub( ONE_IN_Q31, onset_filter_fx[offset + k] ); + aux_buffer_fx[2 * k] = Mpy_32_32( input_frame_fx[2 * ( offset + k )], op2 ); + aux_buffer_fx[2 * k + 1] = Mpy_32_32( input_frame_fx[2 * ( offset + k ) + 1], op2 ); // q_frame_f + move32(); + move32(); + } - v_add_fx( &frame_dec_fx[2 * ch_idx * num_freq_bands], aux_buffer_fx, &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ) ); + v_add_fx( &frame_dec_fx[2 * ch_idx * num_freq_bands], aux_buffer_fx, &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2 ); + } } } @@ -1261,16 +1170,16 @@ void ivas_dirac_dec_decorr_close_fx( static void get_lattice_coeffs_fx( const Word16 band_index, // Q0 const Word16 channel_index, // Q0 - Word16 *lattice_coeffs ) // Q12 + Word32 *lattice_coeffs ) // Q31 { Word16 k; FOR( k = 0; k < ap_filter_length[band_index]; k++ ) { - Word16 cur_lattice_coeff = ap_lattice_coeffs_fx[band_index][add( imult1616( channel_index, ap_filter_length[band_index] ), k )]; // Q12 - lattice_coeffs[k] = cur_lattice_coeff; // Q12 - move16(); - move16(); + Word32 cur_lattice_coeff = ap_lattice_coeffs_fx[band_index][add( imult1616( channel_index, ap_filter_length[band_index] ), k )]; // Q31 + lattice_coeffs[k] = cur_lattice_coeff; // Q31 + move32(); + move32(); } return; @@ -1280,40 +1189,40 @@ static void get_lattice_coeffs_fx( /* convert lattice filter coeffs to all pass transfer function coeffs */ static void lattice2allpass_fx( const Word16 filter_length, // Q0 - const Word16 *lattice_coeffs_fx, // Q15 - Word16 *filter_coeffs_num_real_fx, // Q12 - Word16 *filter_coeffs_den_real_fx ) // Q12 + const Word32 *lattice_coeffs_fx, // Q31 + Word32 *filter_coeffs_num_real_fx, // Q28 + Word32 *filter_coeffs_den_real_fx ) // Q28 { Word16 i, p; - Word16 alpha_real_fx[2][DIRAC_MAX_DECORR_FILTER_LEN + 1]; - Word16 *alpha_real_p_old_fx = &alpha_real_fx[0][0]; - Word16 *alpha_real_p_fx = &alpha_real_fx[1][0]; - Word16 *tmp_fx; + Word32 alpha_real_fx[2][DIRAC_MAX_DECORR_FILTER_LEN + 1]; + Word32 *alpha_real_p_old_fx = &alpha_real_fx[0][0]; + Word32 *alpha_real_p_fx = &alpha_real_fx[1][0]; + Word32 *tmp_fx; FOR( i = 0; i < 2; i++ ) { - set16_fx( alpha_real_fx[i], 0, DIRAC_MAX_DECORR_FILTER_LEN + 1 ); + set32_fx( alpha_real_fx[i], 0, DIRAC_MAX_DECORR_FILTER_LEN + 1 ); } - alpha_real_p_fx[0] = ONE_IN_Q12; - move16(); - alpha_real_p_old_fx[0] = ONE_IN_Q12; - move16(); + alpha_real_p_fx[0] = ONE_IN_Q28; + move32(); + alpha_real_p_old_fx[0] = ONE_IN_Q28; + move32(); /* recursion */ - Word16 lattice_alpha = 0; - move16(); + Word32 lattice_alpha = 0; + move32(); FOR( p = 1; p < filter_length; p++ ) { - alpha_real_p_fx[p] = shr( lattice_coeffs_fx[( p - 1 )], 3 ); /* Q12 */ + alpha_real_p_fx[p] = L_shr( lattice_coeffs_fx[( p - 1 )], 3 ); /* Q28 */ move16(); FOR( i = 1; i < p; i++ ) { - lattice_alpha = mult( lattice_coeffs_fx[( p - 1 )], alpha_real_p_old_fx[sub( p, i )] ); /* Q12 */ - alpha_real_p_fx[i] = add( alpha_real_p_old_fx[i], lattice_alpha ); /* Q12 */ - move16(); + lattice_alpha = Mpy_32_32( lattice_coeffs_fx[( p - 1 )], alpha_real_p_old_fx[sub( p, i )] ); /* Q28 */ + alpha_real_p_fx[i] = L_add( alpha_real_p_old_fx[i], lattice_alpha ); /* Q28 */ + move32(); } /* switch pointers */ tmp_fx = alpha_real_p_old_fx; @@ -1323,10 +1232,10 @@ static void lattice2allpass_fx( FOR( i = 0; i < filter_length; i++ ) { - filter_coeffs_den_real_fx[i] = alpha_real_p_old_fx[i]; /* Q12 */ - move16(); - filter_coeffs_num_real_fx[i] = alpha_real_p_old_fx[sub( sub( filter_length, i ), 1 )]; /* Q12 */ - move16(); + filter_coeffs_den_real_fx[i] = alpha_real_p_old_fx[i]; /* Q28 */ + move32(); + filter_coeffs_num_real_fx[i] = alpha_real_p_old_fx[sub( sub( filter_length, i ), 1 )]; /* Q28 */ + move32(); } return; diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 1b4ee91b20b3edc92728aad7dcf97d6766a8c469..29184695ce35ebc52a47cfc9f626e504e1ca7f34 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -43,7 +43,7 @@ #include "ivas_rom_dec.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" + /*------------------------------------------------------------------------- * Local constants @@ -200,6 +200,12 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( } dirac_output_synthesis_state->cy_cross_dir_smooth_prev_len = size; move16(); + + IF( ( dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx = (Word16 *) malloc( hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + IF( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { dirac_output_synthesis_state->cy_auto_dir_smooth_prev_fx = NULL; @@ -305,7 +311,9 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } set32_fx( dirac_output_synthesis_state->reference_power_smooth_prev_fx, 0, hSpatParamRendCom->num_freq_bands ); - dirac_output_synthesis_state->reference_power_smooth_prev_q = Q31; + dirac_output_synthesis_state->reference_power_smooth_prev_q[0] = Q31; + dirac_output_synthesis_state->reference_power_smooth_prev_q[1] = Q31; + move16(); move16(); IF( ( dirac_output_synthesis_state->direction_smoothness_prev_fx = (Word32 *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( Word32 ) ) ) == NULL ) @@ -487,7 +495,9 @@ void ivas_dirac_dec_output_synthesis_init_fx( IF( h_dirac_output_synthesis_state->proto_power_smooth_prev_fx != NULL ) { set32_fx( h_dirac_output_synthesis_state->proto_power_smooth_prev_fx, 0, imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_protos_dir ) ); - h_dirac_output_synthesis_state->proto_power_smooth_prev_q = Q31; + h_dirac_output_synthesis_state->proto_power_smooth_prev_q[0] = Q31; + h_dirac_output_synthesis_state->proto_power_smooth_prev_q[1] = Q31; + move16(); move16(); } set32_fx( h_dirac_output_synthesis_state->gains_dir_prev_fx, 0, size ); @@ -595,6 +605,11 @@ void ivas_dirac_dec_output_synthesis_close_fx( free( ( dirac_output_synthesis_state )->cy_cross_dir_smooth_prev_fx ); ( dirac_output_synthesis_state )->cy_cross_dir_smooth_prev_fx = NULL; } + IF( ( dirac_output_synthesis_state )->Q_temp_cy_cross_dir_smooth_fx != NULL ) + { + free( ( dirac_output_synthesis_state )->Q_temp_cy_cross_dir_smooth_fx ); + ( dirac_output_synthesis_state )->Q_temp_cy_cross_dir_smooth_fx = NULL; + } IF( ( dirac_output_synthesis_state )->cy_auto_diff_smooth_prev_fx != NULL ) { free( ( dirac_output_synthesis_state )->cy_auto_diff_smooth_prev_fx ); @@ -623,20 +638,18 @@ void ivas_dirac_dec_output_synthesis_close_fx( *------------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_process_slot_fx( - const Word32 *reference_power, /* i : Estimated power Q(q_reference_power)*/ - const Word16 q_reference_power, /* i : Estimated power Q */ - const Word32 *onset, /* i : onset filter Q31*/ + const Word32 *reference_power, /* i : Estimated power Q(q_reference_power)*/ + const Word16 *q_reference_power, /* i : Estimated power Q */ + const Word32 *onset, /* i : onset filter Q31*/ const Word16 *azimuth, const Word16 *elevation, const Word32 *diffuseness, /* Q(q_diffuseness)*/ Word16 q_diffuseness, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ - const Word16 sh_rot_max_order, - const Word32 *p_Rmat, /* i : rotation matrix Q30*/ - const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ - const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ - const Word16 nchan_transport, /* i : number of transport channels*/ + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ + const Word16 nchan_transport, /* i : number of transport channels*/ const Word16 md_idx, const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ const Word16 dec_param_estim ) @@ -645,7 +658,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( Word16 num_freq_bands_diff, num_channels_diff; Word16 ch_idx; Word32 aux_buf[CLDFB_NO_CHANNELS_MAX]; - Word16 diff_start_band, tmp16; + Word16 diff_start_band; DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; @@ -687,8 +700,6 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( md_idx, NULL, 0, - 2, - p_Rmat, hodirac_flag ); { @@ -713,8 +724,8 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { - v_multc_fixed( hSpatParamRendCom->energy_ratio1_fx[md_idx], -MAX_32 /*-1 Q31*/, aux_buf, num_freq_bands ); /* 30 + 31 - 31 -> 30 */ - v_addc_fixed( aux_buf, ONE_IN_Q30 /*1 Q30*/, aux_buf, num_freq_bands ); /*30*/ + v_multc_fx( hSpatParamRendCom->energy_ratio1_fx[md_idx], -MAX_32 /*-1 Q31*/, aux_buf, num_freq_bands ); /* 30 + 31 - 31 -> 30 */ + v_addc_fx( aux_buf, ONE_IN_Q30 /*1 Q30*/, aux_buf, num_freq_bands ); /*30*/ Copy32( hSpatParamRendCom->energy_ratio1_fx[md_idx], h_dirac_output_synthesis_state->direct_power_factor_fx, num_freq_bands ); /*Q30*/ @@ -722,8 +733,8 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( h_dirac_output_synthesis_state->diffuse_power_factor_fx, num_freq_bands ); /*Q30*/ - v_multc_fixed( hSpatParamRendCom->energy_ratio2_fx[md_idx], -MAX_32 /*-1 Q31*/, aux_buf, num_freq_bands ); /*30+31-31->30*/ - v_addc_fixed( aux_buf, ONE_IN_Q30 /*1 Q30*/, aux_buf, num_freq_bands ); /*30*/ + v_multc_fx( hSpatParamRendCom->energy_ratio2_fx[md_idx], -MAX_32 /*-1 Q31*/, aux_buf, num_freq_bands ); /*30+31-31->30*/ + v_addc_fx( aux_buf, ONE_IN_Q30 /*1 Q30*/, aux_buf, num_freq_bands ); /*30*/ Copy32( hSpatParamRendCom->energy_ratio2_fx[md_idx], &h_dirac_output_synthesis_state->direct_power_factor_fx[hSpatParamRendCom->num_freq_bands], num_freq_bands ); /*Q30*/ @@ -759,8 +770,6 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( md_idx, NULL, 0, - sh_rot_max_order, - p_Rmat, hodirac_flag ); { @@ -790,315 +799,277 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( h_dirac_output_synthesis_state->direct_power_factor_q = sub( 31, h_dirac_output_synthesis_state->direct_power_factor_q ); h_dirac_output_synthesis_state->diffuse_power_factor_q = sub( 31, h_dirac_output_synthesis_state->diffuse_power_factor_q ); - v_multc_fixed( h_dirac_output_synthesis_state->direct_power_factor_fx, - ONE_IN_Q29 /*0.25f Q31*/, - h_dirac_output_synthesis_state->direct_power_factor_fx, - num_freq_bands ); /*h_dirac_output_synthesis_state->direct_power_factor_q+Q31-Q31->h_dirac_output_synthesis_state->direct_power_factor_q*/ - v_multc_fixed( h_dirac_output_synthesis_state->diffuse_power_factor_fx, - ONE_IN_Q29 /*0.25f Q31*/, - h_dirac_output_synthesis_state->diffuse_power_factor_fx, - num_freq_bands ); /*h_dirac_output_synthesis_state->diffuse_power_factor_q+Q31-Q31->h_dirac_output_synthesis_state->diffuse_power_factor_q*/ - + v_multc_fx( h_dirac_output_synthesis_state->direct_power_factor_fx, + ONE_IN_Q29 /*0.25f Q31*/, + h_dirac_output_synthesis_state->direct_power_factor_fx, + num_freq_bands ); /*h_dirac_output_synthesis_state->direct_power_factor_q+Q31-Q31->h_dirac_output_synthesis_state->direct_power_factor_q*/ + v_multc_fx( h_dirac_output_synthesis_state->diffuse_power_factor_fx, + ONE_IN_Q29 /*0.25f Q31*/, + h_dirac_output_synthesis_state->diffuse_power_factor_fx, + num_freq_bands ); /*h_dirac_output_synthesis_state->diffuse_power_factor_q+Q31-Q31->h_dirac_output_synthesis_state->diffuse_power_factor_q*/ /*Direct gain*/ + Word16 *exp_temp_cy_cross_dir_smooth_fx = (Word16 *) malloc( num_freq_bands * num_channels_dir * sizeof( Word16 ) ); + Word16 cy_cross_dir_smooth_e = sub( 31, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ); - Word16 *Q_temp_cy_cross_dir_smooth_fx = (Word16 *) malloc( num_freq_bands * num_channels_dir * sizeof( Word16 ) ); - - tmp16 = imult1616( num_freq_bands, num_channels_dir ); - FOR( Word16 kk = 0; kk < tmp16; kk++ ) + FOR( Word16 kk = 0; kk < ( num_freq_bands * num_channels_dir ); kk++ ) { - Q_temp_cy_cross_dir_smooth_fx[kk] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; + exp_temp_cy_cross_dir_smooth_fx[kk] = cy_cross_dir_smooth_e; // h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; move16(); } + Word16 q_temp = sub( add( shl( h_dirac_output_synthesis_state->direct_responses_q, 1 ), q_diffuseness ), 62 ); + Word32 one_in_qdiff = L_shl( 1, q_diffuseness ); + Word32 c1 = Madd_32_16( ONE_IN_Q29 /*1 Q29*/, L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx, ONE_IN_Q29 /*1 Q29*/ ), 5461 /*1.0 / 6.0 Q15*/ ); /*Diffuseness modellling nrg compensation*/ /*Q29*/ + Word16 q_diff_c = sub( q_diffuseness, 2 ); + FOR( ch_idx = 0; ch_idx < s_min( 4, nchan_transport ); ch_idx++ ) { Word16 k; IF( ch_idx != 0 ) { Word32 a, c; - Word16 b, b_exp, sqr_exp, q_diff_aab, q_diff_c; + Word16 b, b_exp, sqr_exp, q_diff_aab; // , q_diff_c; Word32 mpy_a_a_b, mpy_diff_c, mpy_diff_aab; Word32 sqr_inp, sqr; /*Directonal sound gain nrg compensation*/ - c = L_add( ONE_IN_Q29 /*1 Q29*/, Mpy_32_16_1( L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx, ONE_IN_Q29 /*1 Q29*/ ), 5461 /*1.0 / 6.0 Q15*/ ) ); /*Diffuseness modellling nrg compensation*/ /*Q29*/ FOR( k = 0; k < num_freq_bands_diff; k++ ) { a = h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands + k]; // Q = h_dirac_output_synthesis_state->q_direct_responses move32(); - IF( reference_power[k + num_freq_bands] == 0 ) + + + b_exp = 0; + move16(); + + b = 0; + move16(); + + if ( 0 == reference_power[k + ( ch_idx + 1 ) * num_freq_bands] ) { - b = 0; - move16(); - b_exp = 0; + b = MAX_16; move16(); } - ELSE + + test(); + IF( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] && reference_power[k + num_freq_bands] ) { - IF( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] == 0 ) - { - b = MAX_16; - move16(); - b_exp = 0; - move16(); - } - ELSE - { - b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], reference_power[k + ( ch_idx + 1 ) * num_freq_bands], &b_exp ); /*Q(15-b_exp)*/ - } + b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], reference_power[k + ( ch_idx + 1 ) * num_freq_bands], &b_exp ); /*Q(15-b_exp)*/ } - mpy_a_a_b = Mpy_32_32( a, Mpy_32_16_1( a, b ) ); // Q = (h_dirac_output_synthesis_state->q_direct_responses + (15 - b_exp) - 15) + (h_dirac_output_synthesis_state->q_direct_responses) - 31 - mpy_diff_aab = Mpy_32_32( L_sub( L_shl( 1, q_diffuseness ), diffuseness[k] ), mpy_a_a_b ); // Q(q_diff_aab) = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31 - mpy_diff_c = Mpy_32_32( diffuseness[k], c ); // Q(q_diff_c) = q_diffuseness - 2 - q_diff_aab = add( sub( add( h_dirac_output_synthesis_state->direct_responses_q, sub( 15, b_exp ) ), 15 ), add( sub( h_dirac_output_synthesis_state->direct_responses_q, 31 ), sub( q_diffuseness, 31 ) ) ); - q_diff_c = sub( q_diffuseness, 2 ); + mpy_a_a_b = Mpy_32_32( a, Mpy_32_16_1( a, b ) ); // Q = (h_dirac_output_synthesis_state->q_direct_responses + (15 - b_exp) - 15) + (h_dirac_output_synthesis_state->q_direct_responses) - 31 + mpy_diff_aab = Mpy_32_32( L_sub( one_in_qdiff, diffuseness[k] ), mpy_a_a_b ); // Q(q_diff_aab) = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31 + mpy_diff_c = Mpy_32_32( diffuseness[k], c1 ); // Q(q_diff_c) = q_diffuseness - 2 - test(); - IF( mpy_diff_c != 0 && mpy_diff_aab != 0 ) - { - sqr_inp = BASOP_Util_Add_Mant32Exp( mpy_diff_c, sub( 31, q_diff_c ), mpy_diff_aab, sub( 31, q_diff_aab ), &sqr_exp ); /*Q(31-sqr_exp)*/ - } - ELSE - { - IF( mpy_diff_c == 0 ) - { - sqr_inp = mpy_diff_aab; /*Q(q_diff_aab)*/ - move32(); - sqr_exp = sub( 31, q_diff_aab ); - } - ELSE - { - sqr_inp = mpy_diff_c; /*Q(q_diff_c)*/ - move32(); - sqr_exp = sub( 31, q_diff_c ); - } - } + q_diff_aab = sub( q_temp, b_exp ); // add( sub( add( h_dirac_output_synthesis_state->direct_responses_q, sub( 15, b_exp ) ), 15 ), add( sub( h_dirac_output_synthesis_state->direct_responses_q, 31 ), sub( q_diffuseness, 31 ) ) ); + + Word16 minq = sub( s_min( q_diff_aab, q_diff_c ), 1 ); + Word32 op1 = L_shr( mpy_diff_aab, sub( q_diff_aab, minq ) ); + Word32 op2 = L_shr( mpy_diff_c, sub( q_diff_c, minq ) ); + sqr_inp = L_add( op1, op2 ); + sqr_exp = sub( 31, minq ); sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/ sqr = L_shr( sqr, 2 ); /*Q(31-sqr_exp)*/ IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 ) { - IF( LT_16( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ) + IF( GT_16( sqr_exp, cy_cross_dir_smooth_e ) ) { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth-> (31-sqr_exp) */ + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth-> (31-sqr_exp) */ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); move16(); } ELSE { - sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); /*( 31- sqr_exp )-> h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; - move16(); + sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*( 31- sqr_exp )-> h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ } - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q_temp_cy_cross_dir_smooth_fx*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*exp_temp_cy_cross_dir_smooth_fx*/ move32(); } ELSE { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*31-sqr_exp*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr; // L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*31-sqr_exp*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); move16(); } } c = Madd_32_16( ONE_IN_Q27 /*1 Q27*/, L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_fx, ONE_IN_Q27 /*1 Q27*/ ), 5461 ); /*Diffuseness modellling nrg compensation*/ /* 1.0 / 6.0 = 5461 in Q15*/ /*Q27*/ + Word16 diff_c_exp = sub( q_diffuseness, 4 ); FOR( ; k < num_freq_bands; k++ ) { a = h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands + k]; // Q = h_dirac_output_synthesis_state->q_direct_responses move32(); IF( reference_power[k + num_freq_bands] == 0 ) { - b = 0; - move16(); - b_exp = 0; - move16(); + sqr_inp = Mpy_32_32( diffuseness[k], c ); + sqr_exp = sub( 31 + 4, q_diffuseness ); } ELSE { + Word16 diff_aab_exp; IF( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] == 0 ) { - b = MAX_16; - move16(); - b_exp = 0; + mpy_a_a_b = Mpy_32_32( a, a ); // Q = (h_dirac_output_synthesis_state->q_direct_responses + (h_dirac_output_synthesis_state->q_direct_responses) - 31 + mpy_diff_aab = Mpy_32_32( L_sub( one_in_qdiff, diffuseness[k] ), mpy_a_a_b ); // Q = 2*(h_dirac_output_synthesis_state->q_direct_responses) - 31 + q_diffuseness -31 + mpy_diff_c = Mpy_32_32( diffuseness[k], c ); // Q = q_diffuseness - 4 + diff_aab_exp = q_temp; move16(); } ELSE { b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], reference_power[k + ( ch_idx + 1 ) * num_freq_bands], &b_exp ); /*q(15-b_exp)*/ - } - } - - mpy_a_a_b = Mpy_32_32( a, Mpy_32_16_1( a, b ) ); // Q = (h_dirac_output_synthesis_state->q_direct_responses + (15 - b_exp) - 15) + (h_dirac_output_synthesis_state->q_direct_responses) - 31 - mpy_diff_aab = Mpy_32_32( L_sub( L_shl( 1, q_diffuseness ), diffuseness[k] ), mpy_a_a_b ); // Q = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31 - mpy_diff_c = Mpy_32_32( diffuseness[k], c ); // Q = q_diffuseness - 4 - q_diff_aab = add( h_dirac_output_synthesis_state->direct_responses_q + sub( sub( 15, b_exp ), 15 ), add( sub( h_dirac_output_synthesis_state->direct_responses_q, 31 ), sub( q_diffuseness, 31 ) ) ); - q_diff_c = sub( q_diffuseness, 4 ); - - test(); - IF( mpy_diff_c != 0 && mpy_diff_aab != 0 ) - { - sqr_inp = BASOP_Util_Add_Mant32Exp( mpy_diff_c, sub( 31, q_diff_c ), mpy_diff_aab, sub( 31, q_diff_aab ), &sqr_exp ); /*q(31-sqr_exp)*/ - } - ELSE - { - IF( mpy_diff_c == 0 ) - { - sqr_inp = mpy_diff_aab; /*q_diff_aab*/ - move32(); - sqr_exp = sub( 31, q_diff_aab ); - } - ELSE - { - sqr_inp = mpy_diff_c; - move32(); - sqr_exp = sub( 31, q_diff_c ); /*q_diff_c*/ + mpy_a_a_b = Mpy_32_32( a, Mpy_32_16_1( a, b ) ); // Q = (h_dirac_output_synthesis_state->q_direct_responses + (15 - b_exp) - 15) + (h_dirac_output_synthesis_state->q_direct_responses) - 31 + mpy_diff_aab = Mpy_32_32( L_sub( one_in_qdiff, diffuseness[k] ), mpy_a_a_b ); // Q = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31 + mpy_diff_c = Mpy_32_32( diffuseness[k], c ); // Q = q_diffuseness - 4 + diff_aab_exp = sub( q_temp, b_exp ); // sub(sub(add(sub(31 + 62, h_dirac_output_synthesis_state->direct_responses_q), b_exp), h_dirac_output_synthesis_state->direct_responses_q), q_diffuseness); } + Word16 minq = sub( s_min( diff_aab_exp, diff_c_exp ), 1 ); + Word32 op1 = L_shr( mpy_diff_aab, sub( diff_aab_exp, minq ) ); + Word32 op2 = L_shr( mpy_diff_c, sub( diff_c_exp, minq ) ); + sqr_inp = L_add( op1, op2 ); + sqr_exp = sub( 31, minq ); } sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/ sqr = L_shr( sqr, 2 ); /*Q(31-sqr_exp)*/ + + IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 ) { - IF( LT_16( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ) + IF( GT_16( sqr_exp, cy_cross_dir_smooth_e ) ) { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q( 31- sqr_exp )*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q( 31- sqr_exp )*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); move16(); } ELSE { - sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); /*Q(31- sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; - move16(); + sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*Q(31- sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ } - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ move32(); } ELSE { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31- sqr_exp)*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; move16(); } } } ELSE { - Word32 sqr_inp, mpy_diff, sqr; + Word32 sqr_inp, sqr; Word16 sqr_exp; + Word32 One_in_qdiff = L_shl( 1, sub( q_diffuseness, 1 ) ); + Word32 diff = L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx /*q29=0.5 * q30*/, ONE_IN_Q29 /*0.5 Q30*/ ); // Q30 + Word16 sq_e = sub( 32, q_diffuseness ); // 31-(q_diffuseness-1) /*Diffuseness modellling nrg compensation*/ FOR( k = 0; k < num_freq_bands_diff; k++ ) { /*diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) )*/ - mpy_diff = Mpy_32_32( diffuseness[k], L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx /*q29=0.5 * q30*/, ONE_IN_Q29 /*0.5 Q30*/ ) /*q30*/ ); // Q = q_diffuseness - 1 - sqr_inp = L_add( L_shl( 1, sub( q_diffuseness, 1 ) ), mpy_diff ); // Q = q_diffuseness - 1 - sqr_exp = sub( 31, sub( q_diffuseness, 1 ) ); + sqr_inp = Madd_32_32( One_in_qdiff, diffuseness[k], diff ); // Q = q_diffuseness - 1 + sqr_exp = sq_e; + move16(); sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/ sqr = L_shr( sqr, 2 ); /*Q(31-sqr_exp)*/ IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 ) { - IF( LT_16( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ) + IF( LT_16( cy_cross_dir_smooth_e, sqr_exp ) ) { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q(31- sqr_exp)*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q(31- sqr_exp)*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); move16(); } ELSE { - sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); /*Q(31-sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; - move16(); + sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*Q(31-sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ } - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ move32(); } ELSE { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31-sqr_exp)*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr; /*Q(31-sqr_exp)*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); move16(); } } + diff = L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_fx, ONE_IN_Q27 /*1 Q27*/ ); + diff = L_shl( diff, 2 ); // Q29 FOR( ; k < num_freq_bands; k++ ) { - mpy_diff = Mpy_32_32( diffuseness[k], L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx, ONE_IN_Q29 /*1 Q29*/ ) ); // Q = q_diffuseness - 1 - sqr_inp = L_add( L_shl( 1, sub( q_diffuseness, 1 ) ), mpy_diff ); // Q = q_diffuseness - 1 - sqr_exp = sub( 31, sub( q_diffuseness, 1 ) ); + sqr_inp = Madd_32_32( One_in_qdiff, diffuseness[k], diff ); // Q = q_diffuseness - 1 + sqr_exp = sq_e; + move16(); sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/ sqr = L_shr( sqr, 2 ); /*Q(31-sqr_exp)*/ IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 ) { - IF( LT_16( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ) + IF( GT_16( sqr_exp, cy_cross_dir_smooth_e ) ) { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, Q( 31- sqr_exp )*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, Q( 31- sqr_exp )*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); move16(); } ELSE { - sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); /*Q( 31- sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; - move16(); + sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*Q( 31- sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ } - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ move32(); } ELSE { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31-sqr_exp)*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; move16(); } } } } - Word16 temp = MAX_16; /*q0*/ + Word16 temp = exp_temp_cy_cross_dir_smooth_fx[0]; /*q0*/ move16(); - tmp16 = imult1616( num_freq_bands, num_channels_dir ); - FOR( Word16 kk = 0; kk < tmp16; kk++ ) + FOR( Word16 kk = 1; kk < ( num_freq_bands * num_channels_dir ); kk++ ) { - temp = s_min( Q_temp_cy_cross_dir_smooth_fx[kk], temp ); + temp = s_max( exp_temp_cy_cross_dir_smooth_fx[kk], temp ); } - h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = temp; - move16(); - FOR( Word16 kk = 0; kk < tmp16; kk++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk] = L_shl( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk], sub( temp, Q_temp_cy_cross_dir_smooth_fx[kk] ) ); /*Q_temp_cy_cross_dir_smooth_fx[kk]->temp*/ - move32(); - } - free( Q_temp_cy_cross_dir_smooth_fx ); + + /*Directional gain (panning)*/ Word16 temp_q = sub( add( h_dirac_output_synthesis_state->direct_power_factor_q, h_dirac_output_synthesis_state->direct_responses_q ), 31 ); - IF( LT_16( temp_q, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ) + Word16 temp_exp = sub( 31, temp_q ); + + IF( LT_16( temp, temp_exp ) ) { -#ifdef FIX_1072_SPEEDUP_gainpanning /*is there any difference in any bitstream?*/ - Word16 temp_q1 = sub( temp_q, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ); - FOR( Word16 kk = 0; kk < tmp16; kk++ ) + FOR( Word16 kk = 0; kk < ( num_freq_bands * num_channels_dir ); kk++ ) { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk] = L_shl( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk], temp_q1 ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ->temp_q*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk] = L_shl( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk], sub( exp_temp_cy_cross_dir_smooth_fx[kk], temp_exp ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ->temp_q*/ move32(); } h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = temp_q; move16(); -#else - FOR( Word16 kk = 0; kk < tmp16; kk++ ) + } + ELSE + { + FOR( Word16 kk = 0; kk < ( num_freq_bands * num_channels_dir ); kk++ ) { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk] = L_shl( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk], sub( temp_q, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ->temp_q*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk] = L_shl( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk], sub( exp_temp_cy_cross_dir_smooth_fx[kk], temp ) ); /*exp_temp_cy_cross_dir_smooth_fx[kk]->temp*/ move32(); } - h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = temp_q; + h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = sub( 31, temp ); move16(); -#endif } -#ifdef FIX_1072_SPEEDUP_gainpanning + free( exp_temp_cy_cross_dir_smooth_fx ); + Word16 temp_q1 = sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, temp_q ); FOR( ch_idx = s_min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) { @@ -1108,11 +1079,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( Word32 aux; IF( temp_q1 < 0 ) { -#ifdef FIX_USAN_ISSUES Word32 temp_q1_equiv = L_lshl( (Word32) 0x80000000, temp_q1 ); -#else - Word32 temp_q1_equiv = L_lshl( 0x80000000, temp_q1 ); -#endif FOR( i = 0; i < num_freq_bands; i++ ) { aux = Mpy_32_32( h_dirac_output_synthesis_state->direct_power_factor_fx[i], h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands + i] ); @@ -1142,42 +1109,23 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( } } -#else - FOR( ch_idx = s_min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) - { - v_mult_fixed( h_dirac_output_synthesis_state->direct_power_factor_fx, - &h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands], - aux_buf, - num_freq_bands ); /*temp_q*/ - - IF( NE_16( temp_q, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ) - { - Scale_sig32( aux_buf, num_freq_bands, sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, temp_q ) ); /*temp_q->(h_dirac_output_synthesis_state->q_cy_cross_dir_smooth)*/ - } - - v_add_fixed( aux_buf, - &h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], - &h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], - num_freq_bands, 0 ); /*Q(h_dirac_output_synthesis_state->q_cy_cross_dir_smooth)*/ - } -#endif /*Diffuse gain*/ FOR( ch_idx = s_min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) { - v_multc_fixed_16( h_dirac_output_synthesis_state->diffuse_power_factor_fx, - hDirACRend->diffuse_response_function_fx[ch_idx], - aux_buf, - num_freq_bands_diff ); /* h_dirac_output_synthesis_state->diffuse_power_factor_q+15-15*/ + v_multc_fx_16( h_dirac_output_synthesis_state->diffuse_power_factor_fx, + hDirACRend->diffuse_response_function_fx[ch_idx], + aux_buf, + num_freq_bands_diff ); /* h_dirac_output_synthesis_state->diffuse_power_factor_q+15-15*/ temp_q = h_dirac_output_synthesis_state->diffuse_power_factor_q; IF( NE_16( temp_q, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ) ) { Scale_sig32( aux_buf, num_freq_bands, sub( h_dirac_output_synthesis_state->q_cy_auto_diff_smooth, temp_q ) ); /*temp_q->(h_dirac_output_synthesis_state->q_cy_auto_diff_smooth)*/ } - v_add_fixed( aux_buf, - &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], - &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], - num_freq_bands_diff, 0 ); /*h_dirac_output_synthesis_state->q_cy_auto_diff_smooth*/ + v_add_fx_no_hdrm( aux_buf, + &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], + &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], + num_freq_bands_diff ); /*h_dirac_output_synthesis_state->q_cy_auto_diff_smooth*/ } return; @@ -1209,7 +1157,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( hDirACRend->proto_index_diff, h_dirac_output_synthesis_state->diffuse_power_factor_fx, reference_power, - &q_reference_power, + q_reference_power, h_dirac_output_synthesis_state->diffuse_responses_square_fx, onset, h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, @@ -1222,9 +1170,9 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( /* process other PSDs only slot wise for 4 transport channels */ IF( EQ_16( dec_param_estim, TRUE ) ) { - computeTargetPSDs_direct_fx( num_channels_dir, num_freq_bands, h_dirac_output_synthesis_state->direct_power_factor_fx, reference_power, &q_reference_power, h_dirac_output_synthesis_state->direct_responses_fx, h_dirac_output_synthesis_state->direct_responses_square_fx, h_dirac_output_synthesis_state->cy_auto_dir_smooth_fx, &h_dirac_output_synthesis_state->q_cy_auto_dir_smooth, h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx, &h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ); + computeTargetPSDs_direct_fx( num_channels_dir, num_freq_bands, h_dirac_output_synthesis_state->direct_power_factor_fx, reference_power, q_reference_power, h_dirac_output_synthesis_state->direct_responses_fx, h_dirac_output_synthesis_state->direct_responses_square_fx, h_dirac_output_synthesis_state->cy_auto_dir_smooth_fx, &h_dirac_output_synthesis_state->q_cy_auto_dir_smooth, h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx, &h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ); - computeTargetPSDs_diffuse_fx( num_channels_dir, num_freq_bands, diff_start_band, h_dirac_output_synthesis_state->diffuse_power_factor_fx, reference_power, &q_reference_power, h_dirac_output_synthesis_state->diffuse_responses_square_fx, h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, &h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ); + computeTargetPSDs_diffuse_fx( num_channels_dir, num_freq_bands, diff_start_band, h_dirac_output_synthesis_state->diffuse_power_factor_fx, reference_power, q_reference_power, h_dirac_output_synthesis_state->diffuse_responses_square_fx, h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, &h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ); } return; @@ -1305,14 +1253,14 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( /*Direct gain*/ FOR( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) { - v_multc_fixed( diffuseness, // Q30 - ONE_IN_Q31, // Q31 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q30 - num_freq_bands ); - v_multc_fixed( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q30 - L_sub( h_dirac_output_synthesis_params.diffuse_compensation_factor_fx, ONE_IN_Q27 ), // Q27 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q26 - num_freq_bands ); + v_multc_fx( diffuseness, // Q30 + ONE_IN_Q31, // Q31 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q30 + num_freq_bands ); + v_multc_fx( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q30 + L_sub( h_dirac_output_synthesis_params.diffuse_compensation_factor_fx, ONE_IN_Q27 ), // Q27 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q26 + num_freq_bands ); FOR( l = 0; l < num_freq_bands; l++ ) { @@ -1343,20 +1291,21 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( move32(); } - v_mult_fixed( aux_buf, ratio_float, ratio_float, num_freq_bands ); //(Q30, Q31) -> Q30 - v_mult_fixed( aux_buf, &ratio_float[num_freq_bands], &ratio_float[num_freq_bands], num_freq_bands ); //(Q30, Q31) -> Q30 + v_mult_fx( aux_buf, ratio_float, ratio_float, num_freq_bands ); //(Q30, Q31) -> Q30 + v_mult_fx( aux_buf, &ratio_float[num_freq_bands], &ratio_float[num_freq_bands], num_freq_bands ); //(Q30, Q31) -> Q30 /*Directional gain*/ FOR( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) { - v_mult_fixed( ratio_float, // Q30 - &h_dirac_output_synthesis_state.direct_responses_fx[ch_idx * num_freq_bands], // Q31 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], //(Q30, Q31) -> Q30 - num_freq_bands ); - v_mult_fixed( &ratio_float[num_freq_bands], // Q30 - &h_dirac_output_synthesis_state.direct_responses_fx[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], // Q31 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], //(Q30, Q31) -> Q30 - num_freq_bands ); + v_mult_fx( ratio_float, // Q30 + &h_dirac_output_synthesis_state.direct_responses_fx[ch_idx * num_freq_bands], // Q31 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], //(Q30, Q31) -> Q30 + num_freq_bands ); + + v_mult_fx( &ratio_float[num_freq_bands], // Q30 + &h_dirac_output_synthesis_state.direct_responses_fx[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], // Q31 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], //(Q30, Q31) -> Q30 + num_freq_bands ); // Scale to bring in common Q-factor q_com = s_min( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, Q30 ); @@ -1382,10 +1331,10 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( /*Diffuse gain*/ FOR( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ ) { - v_multc_fixed_16( h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 - hDirACRend->diffuse_response_function_fx[ch_idx], // Q15 - &h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], // Q31 - num_freq_bands_diff ); + v_multc_fx_16( h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 + hDirACRend->diffuse_response_function_fx[ch_idx], // Q15 + &h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], // Q31 + num_freq_bands_diff ); // Scale to bring in common Q-factor q_com = s_min( h_dirac_output_synthesis_state.q_cy_auto_diff_smooth_prev, Q31 ); @@ -1407,18 +1356,18 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( /*Direct gain*/ FOR( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) { - v_mult_fixed( h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 - h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q31 - num_freq_bands ); - v_multc_fixed( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q31 - L_sub( L_shr( h_dirac_output_synthesis_params.diffuse_compensation_factor_decorr_fx, Q3 ), ONE_IN_Q26 ), // Q26 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q26 - num_freq_bands_diff ); - v_multc_fixed( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + num_freq_bands_diff], // Q31 - L_sub( L_shr( h_dirac_output_synthesis_params.diffuse_compensation_factor_fx, Q1 ), ONE_IN_Q26 ), // Q26 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + num_freq_bands_diff], // Q26 - num_freq_bands - num_freq_bands_diff ); + v_mult_fx( h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 + h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q31 + num_freq_bands ); + v_multc_fx( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q31 + L_sub( L_shr( h_dirac_output_synthesis_params.diffuse_compensation_factor_decorr_fx, Q3 ), ONE_IN_Q26 ), // Q26 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q26 + num_freq_bands_diff ); + v_multc_fx( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + num_freq_bands_diff], // Q31 + L_sub( L_shr( h_dirac_output_synthesis_params.diffuse_compensation_factor_fx, Q1 ), ONE_IN_Q26 ), // Q26 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + num_freq_bands_diff], // Q26 + num_freq_bands - num_freq_bands_diff ); FOR( l = 0; l < num_freq_bands; l++ ) { @@ -1442,10 +1391,10 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( /*Directional gain*/ FOR( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) { - v_mult_fixed( h_dirac_output_synthesis_state.direct_power_factor_fx, // Q31 - &h_dirac_output_synthesis_state.direct_responses_fx[ch_idx * num_freq_bands], // Q31 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q31 - num_freq_bands ); + v_mult_fx( h_dirac_output_synthesis_state.direct_power_factor_fx, // Q31 + &h_dirac_output_synthesis_state.direct_responses_fx[ch_idx * num_freq_bands], // Q31 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q31 + num_freq_bands ); // Scale to bring in common Q-factor q_com = s_min( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, Q31 ); @@ -1466,10 +1415,10 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( q_com = s_min( h_dirac_output_synthesis_state.q_cy_auto_diff_smooth_prev, Q31 ); FOR( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ ) { - v_multc_fixed_16( h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 - hDirACRend->diffuse_response_function_fx[ch_idx], // Q15 - &h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], // Q31 - num_freq_bands_diff ); + v_multc_fx_16( h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 + hDirACRend->diffuse_response_function_fx[ch_idx], // Q15 + &h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], // Q31 + num_freq_bands_diff ); // Scale to bring in common Q-factor Scale_sig32( &h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], @@ -1500,7 +1449,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( } q_shift = sub( 26, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ); - move16(); /* Direct gains */ IF( hodirac_flag ) @@ -1616,11 +1564,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( /*Direct input->output*/ p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx; // (p_gains_dir_q) p_gains_dir_prev = h_dirac_output_synthesis_state.gains_dir_prev_fx; + q_shift = sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev_q ); FOR( ch_idx = 0; ch_idx < num_channels_dir; ch_idx++ ) { Scale_sig32( &h_dirac_output_synthesis_state.gains_dir_prev_fx[ch_idx * num_freq_bands], num_freq_bands, - sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev_q ) ); /*h_dirac_output_synthesis_state.gains_dir_prev_q->h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev*/ + q_shift ); /*h_dirac_output_synthesis_state.gains_dir_prev_q->h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev*/ } h_dirac_output_synthesis_state.gains_dir_prev_q = h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev; move16(); @@ -1987,23 +1936,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx, &h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ); - // Scale cy_auto_diff_smooth_fx if required - IF( diff_start_band != 0 ) - { - q_com = s_min( *q_reference_power_smooth, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ); - scale_sig32( reference_power_smooth, num_freq_bands, sub( q_com, *q_reference_power_smooth ) ); /**q_reference_power_smooth->q_com*/ - scale_sig32( h_dirac_output_synthesis_state->reference_power_smooth_prev_fx, num_freq_bands, sub( q_com, *q_reference_power_smooth ) ); /**q_reference_power_smooth->q_com*/ - scale_sig32( h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, - i_mult( num_freq_bands, nchan_target_psds ), - sub( q_com, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ) ); /*h_dirac_output_synthesis_state->q_cy_auto_diff_smooth -> q_com*/ - *q_reference_power_smooth = q_com; - move16(); - h_dirac_output_synthesis_state->reference_power_smooth_prev_q = q_com; - move16(); - - h_dirac_output_synthesis_state->q_cy_auto_diff_smooth = q_com; - move16(); - } computeTargetPSDs_diffuse_subframe_fx( nchan_target_psds, num_freq_bands, diff_start_band, h_dirac_output_synthesis_state->diffuse_power_factor_fx, @@ -2032,9 +1964,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move16(); exp1 = 0; move16(); - tmp32 = BASOP_Util_Divide3232_Scale_cadence( L_shl( p_cy_auto_dir_smooth[num_freq_bands], sub( q_com, q_cy_auto_dir_smooth_local[1] ) ), - ( L_add( Sqrt32( h_dirac_output_synthesis_state->direct_power_factor_fx[0], &exp ), EPSILON_FX ) ), // (Q31 - exp) - &exp1 ); + tmp32 = BASOP_Util_Divide3232_Scale_newton( L_shl( p_cy_auto_dir_smooth[num_freq_bands], sub( q_com, q_cy_auto_dir_smooth_local[1] ) ), + ( L_add( Sqrt32( h_dirac_output_synthesis_state->direct_power_factor_fx[0], &exp ), EPSILON_FX ) ), // (Q31 - exp) + &exp1 ); target_power_y = L_shr( tmp32, 1 ); // Q31 + (q_com - (31 - exp)) q_target_power_y = add( sub( Q31, exp1 ), sub( q_com, sub( Q31, exp ) ) ); q_target_power_y = sub( q_target_power_y, 1 ); @@ -2043,9 +1975,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move16(); exp1 = 0; move16(); - tmp32 = BASOP_Util_Divide3232_Scale_cadence( L_shl( p_cy_auto_diff_smooth[num_freq_bands], sub( q_com, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ) ), - ( L_add( Sqrt32( h_dirac_output_synthesis_state->diffuse_power_factor_fx[0], &exp ), EPSILON_FX ) ), // (Q31 - exp) - &exp1 ); + tmp32 = BASOP_Util_Divide3232_Scale_newton( L_shl( p_cy_auto_diff_smooth[num_freq_bands], sub( q_com, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ) ), + ( L_add( Sqrt32( h_dirac_output_synthesis_state->diffuse_power_factor_fx[0], &exp ), EPSILON_FX ) ), // (Q31 - exp) + &exp1 ); target_power_y1 = L_shr( tmp32, 1 ); // Q31 + (q_com - (31 - exp)) q_target_power_y1 = add( sub( Q31, exp1 ), sub( q_com, sub( Q31, exp ) ) ); q_target_power_y1 = sub( q_target_power_y1, 1 ); @@ -2062,9 +1994,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move16(); } - subtract_power_y = masa_stereo_type_detect->subtract_power_y_fx; // q_subtract_power_y - move32(); - a = 858993; /* ( 0.0004f in Q31 ); Temporal smoothing coefficient */ move32(); b = L_sub( ONE_IN_Q31, a ); /* Temporal smoothing coefficient */ @@ -2080,24 +2009,52 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move32(); masa_stereo_type_detect->q_target_power_y_smooth = q_com; move16(); - masa_stereo_type_detect->subtract_power_y_smooth_fx = - L_add( Mpy_32_32( a, subtract_power_y ), - Mpy_32_32( b, masa_stereo_type_detect->subtract_power_y_smooth_fx ) ); //(Q31, q_subtract_power_y) -> q_subtract_power_y + + IF( NE_16( masa_stereo_type_detect->q_subtract_power_y, masa_stereo_type_detect->q_subtract_power_y_smooth ) ) + { + exp = s_min( add( masa_stereo_type_detect->q_subtract_power_y, norm_l( masa_stereo_type_detect->subtract_power_y_fx ) ), add( masa_stereo_type_detect->q_subtract_power_y_smooth, norm_l( masa_stereo_type_detect->subtract_power_y_smooth_fx ) ) ); + masa_stereo_type_detect->subtract_power_y_fx = L_shl( masa_stereo_type_detect->subtract_power_y_fx, sub( exp, masa_stereo_type_detect->q_subtract_power_y ) ); + move32(); + masa_stereo_type_detect->subtract_power_y_smooth_fx = L_shl( masa_stereo_type_detect->subtract_power_y_smooth_fx, sub( exp, masa_stereo_type_detect->q_subtract_power_y_smooth ) ); + move32(); + masa_stereo_type_detect->q_subtract_power_y = exp; + move16(); + masa_stereo_type_detect->q_subtract_power_y_smooth = exp; + move16(); + } + subtract_power_y = masa_stereo_type_detect->subtract_power_y_fx; // q_subtract_power_y move32(); + W_temp = W_add( W_mult0_32_32( a, subtract_power_y ), W_mult0_32_32( b, masa_stereo_type_detect->subtract_power_y_smooth_fx ) ); // Q31 + masa_stereo_type_detect->q_subtract_power_y_smooth + IF( W_temp ) + { + exp = W_norm( W_temp ); + masa_stereo_type_detect->subtract_power_y_smooth_fx = W_extract_h( W_shl( W_temp, exp ) ); // Q31 + masa_stereo_type_detect->q_subtract_power_y_smooth + exp - 32 + move32(); + masa_stereo_type_detect->q_subtract_power_y_smooth = sub( add( masa_stereo_type_detect->q_subtract_power_y_smooth, exp ), 1 ); + move16(); + } + ELSE + { + masa_stereo_type_detect->subtract_power_y_smooth_fx = 0; // Q31 + move32(); + masa_stereo_type_detect->q_subtract_power_y_smooth = Q31; + move16(); + } exp = 0; move16(); - IF( masa_stereo_type_detect->target_power_y_smooth_fx != 0 ) + test(); + IF( masa_stereo_type_detect->target_power_y_smooth_fx && masa_stereo_type_detect->subtract_power_y_smooth_fx ) { subtract_target_ratio = L_sub( BASOP_Util_Log2( masa_stereo_type_detect->subtract_power_y_smooth_fx ), BASOP_Util_Log2( masa_stereo_type_detect->target_power_y_smooth_fx ) ); // Q25 - exp = sub( masa_stereo_type_detect->q_subtract_power_y, q_com ); + exp = sub( masa_stereo_type_detect->q_subtract_power_y_smooth, q_com ); L_tmp = Mpy_32_32( L_sub( subtract_target_ratio, L_shl( exp, 25 ) ), LOG10_2_Q31 ); // Q25 } ELSE { subtract_target_ratio = BASOP_Util_Log2( masa_stereo_type_detect->subtract_power_y_smooth_fx ); // Q25 - exp = sub( 31, masa_stereo_type_detect->q_subtract_power_y ); + exp = sub( 31, masa_stereo_type_detect->q_subtract_power_y_smooth ); L_tmp = L_sub( Mpy_32_32( L_add( subtract_target_ratio, L_shl( exp, 25 ) ), LOG10_2_Q31 ), -503316480 /* L_shl( -15, 25 ) */ /*log(EPSILON)*/ ); // Q25 } subtract_target_ratio_db = Mpy_32_32( 1342177280 /* 10.0f * in Q27*/, L_tmp ); // (Q27, (Q25, Q31)) -> (Q27, Q25) -> Q21 @@ -2106,6 +2063,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move32(); masa_stereo_type_detect->subtract_power_y_fx = 0; move32(); + masa_stereo_type_detect->q_subtract_power_y = Q31; + move16(); } /*-----------------------------------------------------------------* @@ -2138,6 +2097,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( prevWeight = Mpy_32_32( L_sub( ONE_IN_Q31, DIRECTION_SMOOTHNESS_ALPHA_Q31 ), h_dirac_output_synthesis_state->reference_power_smooth_prev_fx[l] ); //(Q31, q_reference_power_smooth) -> q_reference_power_smooth + assert( q_reference_power_smooth[0] == h_dirac_output_synthesis_state->reference_power_smooth_prev_q[0] ); + assert( q_reference_power_smooth[1] == h_dirac_output_synthesis_state->reference_power_smooth_prev_q[1] ); weightedDirectionSmoothness = L_add( Mpy_32_32( currWeight, instDirectionSmoothness ), Mpy_32_32( prevWeight, h_dirac_output_synthesis_state->direction_smoothness_prev_fx[l] ) ); //(q_reference_power_smooth, Q31) -> q_reference_power_smooth @@ -2145,6 +2106,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( exp = 0; move16(); + tmp = BASOP_Util_Divide3232_Scale( weightedDirectionSmoothness, L_add( sumWeight, EPSILON_FX ), &exp ); /*Q(15-exp)*/ smoothedDirectionSmoothness = L_shl_sat( L_deposit_l( tmp ), add( sub( Q31, Q15 ), exp ) ); // Q31 @@ -2187,10 +2149,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( *( p_power_smooth_prev ) = L_add( *( p_power_smooth_prev ), Mpy_32_32( g1, ( *p_power_smooth ) ) ); //(Q31, q_proto_power_smooth) -> q_proto_power_smooth move32(); + assert( h_dirac_output_synthesis_state->proto_power_smooth_prev_q[0] == h_dirac_output_synthesis_state->proto_power_smooth_q[0] ); + assert( h_dirac_output_synthesis_state->proto_power_smooth_prev_q[1] == h_dirac_output_synthesis_state->proto_power_smooth_q[1] ); IF( EQ_32( *( p_power_smooth_prev ), EPSILON_FX ) ) { p_power_smooth_prev++; - L_tmp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q31, EPSILON_FX, &exp ); /*Q=31-(exp-(31-q_proto_power_smooth))*/ + L_tmp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q31, EPSILON_FX, &exp ); /*Q=31-(exp-(31-q_proto_power_smooth))*/ exp_arr[k * num_freq_bands + l] = exp; move16(); @@ -2199,7 +2163,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( } ELSE { - L_tmp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q31, *( p_power_smooth_prev++ ), &exp ); /*Q=31-(exp-(31-q_proto_power_smooth))*/ + L_tmp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q31, *( p_power_smooth_prev++ ), &exp ); /*Q=31-(exp-(31-q_proto_power_smooth))*/ exp_arr[k * num_freq_bands + l] = exp; move16(); @@ -2210,41 +2174,58 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( } // Move proto_power_smooth_fx to common Q-factor + + Word16 min_exp2 = -64; min_exp = MIN_16; move16(); + move16(); + Word16 q_tmp2 = Q31; q_tmp = Q31; move16(); + move16(); FOR( k = 0; k < num_protos_dir; k++ ) { - FOR( l = 0; l < num_freq_bands; l++ ) + FOR( l = 0; l < s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ); l++ ) { - IF( GT_16( exp_arr[k * num_freq_bands + l], min_exp ) ) - { - min_exp = exp_arr[k * num_freq_bands + l]; - move16(); - } + min_exp = s_max( min_exp, exp_arr[k * num_freq_bands + l] ); + } + FOR( l = CLDFB_NO_CHANNELS_HALF; l < num_freq_bands; l++ ) + { + min_exp2 = s_max( min_exp2, exp_arr[k * num_freq_bands + l] ); } } - p_power_smooth_prev = h_dirac_output_synthesis_state->proto_power_smooth_prev_fx; p_power_smooth = h_dirac_output_synthesis_state->proto_power_smooth_fx; FOR( k = 0; k < num_protos_dir; k++ ) { - FOR( l = 0; l < num_freq_bands; l++ ) + FOR( l = 0; l < s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ); l++ ) { *p_power_smooth = L_shr( *p_power_smooth, sub( min_exp, exp_arr[k * num_freq_bands + l] ) ); /*(31-(exp-(31-q_proto_power_smooth)))->(31-(min_exp-(31-q_proto_power_smooth)))*/ move32(); p_power_smooth++; - q_tmp = add( sub( Q31, min_exp ), sub( Q31, h_dirac_output_synthesis_state->proto_power_smooth_q ) ); + } + FOR( l = CLDFB_NO_CHANNELS_HALF; l < num_freq_bands; l++ ) + { + *p_power_smooth = L_shr( *p_power_smooth, sub( min_exp2, exp_arr[k * num_freq_bands + l] ) ); /*(31-(exp-(31-q_proto_power_smooth)))->(31-(min_exp-(31-q_proto_power_smooth)))*/ + move32(); + p_power_smooth++; } } // Update the Q-factor - h_dirac_output_synthesis_state->proto_power_smooth_prev_q = h_dirac_output_synthesis_state->proto_power_smooth_q; + h_dirac_output_synthesis_state->proto_power_smooth_prev_q[0] = s_min( h_dirac_output_synthesis_state->proto_power_smooth_q[0], h_dirac_output_synthesis_state->proto_power_smooth_prev_q[0] ); + h_dirac_output_synthesis_state->proto_power_smooth_prev_q[1] = s_min( h_dirac_output_synthesis_state->proto_power_smooth_q[1], h_dirac_output_synthesis_state->proto_power_smooth_prev_q[1] ); + move16(); + move16(); + + q_tmp = add( sub( Q31, min_exp ), sub( Q31, h_dirac_output_synthesis_state->proto_power_smooth_prev_q[0] ) ); + q_tmp2 = add( sub( Q31, min_exp2 ), sub( Q31, h_dirac_output_synthesis_state->proto_power_smooth_prev_q[1] ) ); + + h_dirac_output_synthesis_state->proto_power_smooth_q[0] = q_tmp; + h_dirac_output_synthesis_state->proto_power_smooth_q[1] = q_tmp2; move16(); - h_dirac_output_synthesis_state->proto_power_smooth_q = q_tmp; move16(); /*Direct gains and diffuse gains on number of output channels*/ @@ -2290,9 +2271,13 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move16(); move16(); + Word32 cmp = W_shl_sat_l( DIRAC_GAIN_LIMIT_Q26, sub( h_dirac_output_synthesis_state->gains_dir_prev_q, 26 ) ); + Word32 cmp2 = W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_diff_prev_q ) ), Q5 ) ); + FOR( k = 0; k < nchan_out_woLFE; k++ ) { Word32 power_smooth_temp; + Word16 qidx; p_power_smooth = h_dirac_output_synthesis_state->proto_power_smooth_fx + i_mult( proto_direct_index[k], num_freq_bands ); // q_proto_power_smooth FOR( l = 0; l < h_dirac_output_synthesis_params->max_band_decorr; l++ ) { @@ -2300,18 +2285,22 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( g1 = alpha[l]; // Q31 move32(); g2 = L_sub( ONE_IN_Q31, g1 ); // Q31 + assert( q_cy_auto_dir_smooth_local[k] == q_cy_auto_dir_smooth_prev_local[k] ); *( p_cy_auto_dir_smooth_prev ) = L_add( Mpy_32_32( g1, ( *( p_cy_auto_dir_smooth++ ) ) ), Mpy_32_32( g2, ( *( p_cy_auto_dir_smooth_prev ) ) ) ); // (Q31, q_cy_auto_dir_smooth_prev_local) -> q_cy_auto_dir_smooth_prev_local move32(); + assert( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth == h_dirac_output_synthesis_state->q_cy_cross_dir_smooth_prev ); *( p_cy_cross_dir_smooth_prev ) = L_add( Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth++ ) ) ), Mpy_32_32( g2, ( *( p_cy_cross_dir_smooth_prev ) ) ) ); // (Q31, q_cy_cross_dir_smooth_prev) -> q_cy_cross_dir_smooth_prev move32(); power_smooth_temp = L_shl( *p_power_smooth, norm_l( *p_power_smooth ) ); // proto_power_smooth_q + norm_l( *p_power_smooth ) L_tmp = Mpy_32_32( power_smooth_temp, ( *( p_cy_auto_dir_smooth_prev++ ) ) ); // proto_power_smooth_q + norm_l( *p_power_smooth ) ) + q_cy_auto_dir_smooth_prev_local - 31 - exp = sub( Q31, sub( add( add( h_dirac_output_synthesis_state->proto_power_smooth_q, norm_l( *p_power_smooth ) ), + qidx = s_min( 1, s_max( 0, sub( l, CLDFB_NO_CHANNELS_HALF - 1 ) ) ); + exp = sub( Q31, sub( add( add( h_dirac_output_synthesis_state->proto_power_smooth_q[qidx], norm_l( *p_power_smooth ) ), q_cy_auto_dir_smooth_prev_local[k] ), Q31 ) ); + p_power_smooth++; *( p_gains_dir ) = Sqrt32( L_tmp, &exp ); // (Q31 - exp) @@ -2324,9 +2313,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( *( p_gains_dir ) = 0; move32(); } - ELSE IF( GT_32( *( p_gains_dir ), W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_dir_prev_q ) ), Q5 ) ) ) ) + ELSE IF( GT_32( *( p_gains_dir ), cmp ) ) { - *( p_gains_dir ) = W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_dir_prev_q ) ), Q5 ) ); /*26 + h_dirac_output_synthesis_state->gains_dir_prev_q + 1 + 5 - 32 -> h_dirac_output_synthesis_state->gains_dir_prev_q*/ + *( p_gains_dir ) = cmp; /*26 + h_dirac_output_synthesis_state->gains_dir_prev_q + 1 + 5 - 32 -> h_dirac_output_synthesis_state->gains_dir_prev_q*/ move32(); } @@ -2348,7 +2337,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( exp = 0; move16(); - L_tmp = BASOP_Util_Divide3232_Scale_cadence( *( p_cy_auto_diff_smooth_prev++ ), ( *( p_power_diff_smooth_prev++ ) ), &exp ); // (Q31 - exp) + (q_a - q_b) + L_tmp = BASOP_Util_Divide3232_Scale_newton( *( p_cy_auto_diff_smooth_prev++ ), ( *( p_power_diff_smooth_prev++ ) ), &exp ); // (Q31 - exp) + (q_a - q_b) exp = sub( Q31, add( sub( Q31, exp ), sub( h_dirac_output_synthesis_state->q_cy_auto_diff_smooth_prev, h_dirac_output_synthesis_state->proto_power_diff_smooth_q ) ) ); *( p_gains_diff ) = Sqrt32( L_tmp, &exp ); // (31 - exp) @@ -2361,9 +2350,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( *( p_gains_diff ) = 0; move32(); } - ELSE IF( GT_32( *( p_gains_diff ), W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_diff_prev_q ) ), Q5 ) ) ) ) /*h_dirac_output_synthesis_state->gains_diff_prev_q*/ + ELSE IF( GT_32( *( p_gains_diff ), cmp2 ) ) /*h_dirac_output_synthesis_state->gains_diff_prev_q*/ { - *( p_gains_diff ) = W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_diff_prev_q ) ), Q5 ) ); /*h_dirac_output_synthesis_state->gains_diff_prev_q*/ + *( p_gains_diff ) = cmp2; /*h_dirac_output_synthesis_state->gains_diff_prev_q*/ move32(); } p_gains_diff++; @@ -2376,15 +2365,15 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( g1 = alpha[l]; // Q31 move32(); g2 = L_sub( ONE_IN_Q31, g1 ); // Q31 - W_temp = W_add( W_mult_32_32( g1, ( *( p_cy_auto_dir_smooth++ ) ) ), - W_mult_32_32( g2, ( *( p_cy_auto_dir_smooth_prev ) ) ) ); /*32+q_cy_auto_dir_smooth_prev_local*/ + W_temp = W_mac_32_32( W_mult_32_32( g1, ( *( p_cy_auto_dir_smooth++ ) ) ), + g2, ( *( p_cy_auto_dir_smooth_prev ) ) ); /*32+q_cy_auto_dir_smooth_prev_local*/ q_tmp = W_norm( W_temp ); L_tmp = W_extract_h( W_shl( W_temp, q_tmp ) ); // q_cy_auto_dir_smooth_prev_local + q_tmp *( p_cy_auto_dir_smooth_prev++ ) = L_shr_r( L_tmp, q_tmp ); // q_cy_auto_dir_smooth_prev_local move32(); - *( p_cy_cross_dir_smooth_prev ) = L_add( Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth ) ) ), - Mpy_32_32( g2, ( *( p_cy_cross_dir_smooth_prev ) ) ) ); // (Q31, q_cy_cross_dir_smooth_prev) -> q_cy_cross_dir_smooth_prev + *( p_cy_cross_dir_smooth_prev ) = Madd_32_32( Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth ) ) ), + g2, ( *( p_cy_cross_dir_smooth_prev ) ) ); // (Q31, q_cy_cross_dir_smooth_prev) -> q_cy_cross_dir_smooth_prev move32(); test(); if ( *( p_cy_cross_dir_smooth_prev ) == 0 && ( *( p_cy_cross_dir_smooth ) != 0 ) ) @@ -2395,7 +2384,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( ( p_cy_cross_dir_smooth++ ); power_smooth_temp = L_shl( *p_power_smooth, norm_l( *p_power_smooth ) ); L_tmp = Mpy_32_32( power_smooth_temp, L_tmp ); // proto_power_smooth_q + norm_l( *p_power_smooth ) ) + q_cy_auto_dir_smooth_prev_local - 31 - exp = sub( Q31, sub( add( add( h_dirac_output_synthesis_state->proto_power_smooth_q, norm_l( *p_power_smooth ) ), + qidx = s_min( 1, s_max( 0, sub( l, CLDFB_NO_CHANNELS_HALF - 1 ) ) ); + exp = sub( Q31, sub( add( add( h_dirac_output_synthesis_state->proto_power_smooth_q[qidx], norm_l( *p_power_smooth ) ), add( q_cy_auto_dir_smooth_prev_local[k], q_tmp ) ), Q31 ) ); @@ -2409,9 +2399,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( *( p_gains_dir ) = 0; move32(); } - ELSE IF( GT_32( *( p_gains_dir ), W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_dir_prev_q ) ), Q5 ) ) ) ) /*gains_dir_prev_q*/ + ELSE IF( GT_32( *( p_gains_dir ), cmp ) ) /*gains_dir_prev_q*/ { - *( p_gains_dir ) = W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_dir_prev_q ) ), Q5 ) ); /*gains_dir_prev_q*/ + *( p_gains_dir ) = cmp; /*gains_dir_prev_q*/ move32(); } @@ -2446,7 +2436,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move32(); } ( p_cy_auto_diff_smooth_prev++ ); - exp = sub( Q31, sub( add( add( h_dirac_output_synthesis_state->proto_power_smooth_q, norm_l( *p_power_smooth ) ), + exp = sub( Q31, sub( add( add( h_dirac_output_synthesis_state->proto_power_smooth_q[qidx], norm_l( *p_power_smooth ) ), h_dirac_output_synthesis_state->q_cy_auto_diff_smooth_prev ), Q31 ) ); p_power_smooth++; @@ -2494,7 +2484,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( shl( i_mult( proto_direct_index[k], num_freq_bands ), Q1 ); FOR( l = 0; l < num_freq_bands; l++ ) { - g = L_add( Mpy_32_32( g1, *( p_gain_1++ ) ), Mpy_32_32( g2, *( p_gain_2++ ) ) ); // (Q31, gains_dir_prev_q) -> gains_dir_prev_q + g = Madd_32_32( Mpy_32_32( g1, *( p_gain_1++ ) ), g2, *( p_gain_2++ ) ); // (Q31, gains_dir_prev_q) -> gains_dir_prev_q Cldfb_RealBuffer64_fx[k][buf_idx][l] = W_mult0_32_32( g, ( *( p_power_smooth++ ) ) ); // (gains_dir_prev_q, q_proto_direct_buffer) -> gains_dir_prev_q + q_proto_direct_buffer move64(); @@ -2516,7 +2506,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( { FOR( l = 0; l < h_dirac_output_synthesis_params->max_band_decorr; l++ ) { - g = L_add( Mpy_32_32( g1, *( p_gain_1++ ) ), Mpy_32_32( g2, *( p_gain_2++ ) ) ); // (Q31, gains_diff_prev_q) -> gains_diff_prev_q + g = Madd_32_32( Mpy_32_32( g1, *( p_gain_1++ ) ), g2, *( p_gain_2++ ) ); // (Q31, gains_diff_prev_q) -> gains_diff_prev_q Cldfb_RealBuffer64_fx[k][buf_idx][l] = W_add( Cldfb_RealBuffer64_fx[k][buf_idx][l], W_shr( W_mult0_32_32( g, ( *( p_power_smooth_diff++ ) ) ), negate( q_align ) ) ); // (gains_diff_prev_q, q_proto_direct_buffer) -> gains_diff_prev_q + q_proto_direct_buffer move64(); @@ -2565,15 +2555,17 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( } } q_align = W_norm( W_temp ); + Word16 shift = sub( q_align, 32 ); + FOR( buf_idx = 0; buf_idx < nbslots; ++buf_idx ) { FOR( k = 0; k < nchan_out_woLFE; k++ ) { FOR( l = 0; l < num_freq_bands; l++ ) { - RealBuffer[k][buf_idx][l] = W_extract_h( W_shl( Cldfb_RealBuffer64_fx[k][buf_idx][l], q_align ) ); /*( ( ( h_dirac_output_synthesis_state->proto_direct_buffer_f_q+h_dirac_output_synthesis_state->gains_dir_prev_q )+ q_align )- 32 )*/ + RealBuffer[k][buf_idx][l] = W_shl_sat_l( Cldfb_RealBuffer64_fx[k][buf_idx][l], shift ); /*( ( ( h_dirac_output_synthesis_state->proto_direct_buffer_f_q+h_dirac_output_synthesis_state->gains_dir_prev_q )+ q_align )- 32 )*/ move32(); - ImagBuffer[k][buf_idx][l] = W_extract_h( W_shl( Cldfb_ImagBuffer64_fx[k][buf_idx][l], q_align ) ); /*( ( ( h_dirac_output_synthesis_state->proto_direct_buffer_f_q+h_dirac_output_synthesis_state->gains_dir_prev_q )+ q_align )- 32 )*/ + ImagBuffer[k][buf_idx][l] = W_shl_sat_l( Cldfb_ImagBuffer64_fx[k][buf_idx][l], shift ); /*( ( ( h_dirac_output_synthesis_state->proto_direct_buffer_f_q+h_dirac_output_synthesis_state->gains_dir_prev_q )+ q_align )- 32 )*/ move32(); } } @@ -2619,289 +2611,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( } -/*------------------------------------------------------------------------- - * ivas_dirac_dec_get_response_split_order() - * - * calculate reponse, 1 degree resolution - *------------------------------------------------------------------------*/ - -static void ivas_dirac_dec_get_response_split_order_fx( - const Word16 azimuth, /*q0*/ - const Word16 elevation, /*q0*/ - Word32 *response, /*q_response*/ - const Word16 shd_rot_max_order, - const Word32 *p_Rmat /* Q30 */, - Word16 *q_response ) -{ - Word16 index_azimuth, index_elevation; - Word16 el, e, az; - Word32 cos_1, cos_2, sin_1, cos_az[3]; - Word32 sin_az[3]; - Word32 f, c; - Word16 l, m; - Word16 b, b1, b_2, b1_2, a; - Word32 dv_0, dv_1, dv_2, dv_r_0, dv_r_1, dv_r_2; - Word32 w; - Word16 tmp; - Word32 temp; - Word16 exp; - - push_wmops( "ivas_dirac_dec_get_response_split_order" ); - - /* Corner case for handling crash in idiv1616 when numerator is 0 */ - IF( EQ_16( azimuth, -180 ) ) - { - tmp = 0; - move16(); - } - ELSE - { - tmp = idiv1616( add( azimuth, 180 ), 360 ); - } - index_azimuth = sub( add( azimuth, 180 ), i_mult( tmp, 360 ) ); // index_azimuth = (azimuth + 180) % 360 - index_elevation = add( elevation, 90 ); - - IF( GT_16( index_elevation, 90 ) ) - { - e = -ONE_IN_Q14; /*-1 in Q14*/ - move16(); - el = sub( 180, index_elevation ); - } - ELSE - { - e = ONE_IN_Q14; /*1 in Q14*/ - move16(); - el = index_elevation; - move16(); - } - - IF( GT_16( index_azimuth, 180 ) ) - { - az = sub( 360, index_azimuth ); - f = -ONE_IN_Q30; /*-1 Q30*/ - move32(); - } - ELSE - { - az = index_azimuth; - move16(); - f = ONE_IN_Q30; /*1 Q30*/ - move32(); - } - - // dirac_gains_trg_term_int Q30 - cos_1 = L_shr( dirac_gains_trg_term_int[az][0], 1 ); // Q29 - cos_2 = L_shl( Mpy_32_32( cos_1, cos_1 ), 2 ); // Q29 - sin_1 = Mpy_32_32( f, dirac_gains_trg_term_int[az][1] ); // Q29 - - cos_az[0] = cos_1; // Q29 - move32(); - cos_az[1] = L_shl( L_sub( Mpy_32_32( TWO_IN_Q29, cos_2 ), ONE_IN_Q27 ), 2 ); // Q29 - move32(); - cos_az[2] = L_sub( L_shl( Mpy_32_32( Mpy_32_32( TWO_IN_Q29, cos_1 ), cos_az[1] ), 4 ), cos_az[0] ); // Q29 - move32(); - - sin_az[0] = sin_1; // Q29 - move32(); - sin_az[1] = L_shl( Mpy_32_32( Mpy_32_32( sin_1, TWO_IN_Q29 ), cos_1 ), 4 ); // Q29 - move32(); - sin_az[2] = L_shl( Mpy_32_32( sin_1, L_sub( Mpy_32_32( FOUR_IN_Q28, cos_2 ), ONE_IN_Q26 ) ), 5 ); // Q29 - move32(); - - response[0] = ONE_IN_Q29; - move32(); - - FOR( l = 1; l <= shd_rot_max_order; l++ ) - { - b_2 = i_mult( l, l ); - b1_2 = add( b_2, i_mult( 2, l ) ); - FOR( m = 0; m < l; m += 2 ) - { - b = add( b_2, m ); - a = dirac_gains_P_idx[b]; - move16(); - - c = Mpy_32_32( Mpy_32_32( SQRT2_FIXED, dirac_gains_norm_term_int[a] ), dirac_gains_Pnm_int[el][a] ); // Q25 - - response[b] = L_shl( Mpy_32_32( c, sin_az[l - m - 1] ), 6 ); // Q29 - move32(); - - b1 = sub( b1_2, m ); - response[b1] = L_shl( Mpy_32_32( c, cos_az[l - m - 1] ), 6 ); // Q29 - move32(); - } - - FOR( m = 1; m < l; m += 2 ) - { - b = add( b_2, m ); - a = dirac_gains_P_idx[b]; - move16(); - - c = Mpy_32_32( Mpy_32_32( SQRT2_FIXED, dirac_gains_norm_term_int[a] ), dirac_gains_Pnm_int[el][a] ); // Q25 - c = Mpy_32_16_1( c, e ); // Q24 - - response[b] = L_shl( Mpy_32_32( c, sin_az[l - m - 1] ), 7 ); // Q29 - move32(); - - b1 = sub( b1_2, m ); - response[b1] = L_shl( Mpy_32_32( c, cos_az[l - m - 1] ), 7 ); // Q29 - move32(); - } - - b = add( b_2, l ); - a = dirac_gains_P_idx[b]; - move16(); - - c = L_shl( Mpy_32_32( dirac_gains_norm_term_int[a], dirac_gains_Pnm_int[el][a] ), 3 ); // Q29 - IF( EQ_16( l % 2, 1 ) ) - { - c = L_shl( Mpy_32_16_1( c, e ), 1 ); // Q29 - } - - response[b] = c; // Q29 - move32(); - } - - /*Conversion spherical to cartesian coordinates*/ - w = L_negate( dirac_gains_trg_term_int[el][1] ); // Q30 - dv_0 = Mpy_32_32( w, cos_1 ); // Q28 - dv_1 = Mpy_32_32( w, sin_1 ); // Q28 - dv_2 = L_shr( Mpy_32_16_1( dirac_gains_trg_term_int[el][0], e ), 1 ); // Q28 - - /*Rotation mtx multiplication*/ - dv_r_0 = Madd_32_32( Madd_32_32( Mpy_32_32( L_shr( p_Rmat[0], Q1 ), dv_0 ), L_shr( p_Rmat[1], Q1 ), dv_1 ), L_shr( p_Rmat[2], Q1 ), dv_2 ); // Q26 - dv_r_1 = Madd_32_32( Madd_32_32( Mpy_32_32( L_shr( p_Rmat[3], Q1 ), dv_0 ), L_shr( p_Rmat[4], Q1 ), dv_1 ), L_shr( p_Rmat[5], Q1 ), dv_2 ); // Q26 - dv_r_2 = Madd_32_32( Madd_32_32( Mpy_32_32( L_shr( p_Rmat[6], Q1 ), dv_0 ), L_shr( p_Rmat[7], Q1 ), dv_1 ), L_shr( p_Rmat[8], Q1 ), dv_2 ); // Q26 - - tmp = BASOP_util_atan2( dv_r_1, dv_r_0, 0 ); // Q13 - index_azimuth = shr( mult( tmp, _180_OVER_PI_Q9 ), 7 ); // Q0; - IF( EQ_16( index_azimuth, -180 ) ) - { - tmp = 0; - move16(); - } - ELSE - { - tmp = idiv1616( add( index_azimuth, 180 ), 360 ); - } - index_azimuth = sub( add( index_azimuth, 180 ), i_mult( tmp, 360 ) ); // index_azimuth = (index_azimuth + 180) % 360 - - temp = L_add( Mpy_32_32( dv_r_0, dv_r_0 ), Mpy_32_32( dv_r_1, dv_r_1 ) ); // Q21 - exp = sub( 31, Q21 ); - temp = Sqrt32( temp, &exp ); - - tmp = BASOP_util_atan2( dv_r_2, temp, sub( sub( 31, Q26 ), exp ) ); // Q13 - index_elevation = shr( mult( tmp, _180_OVER_PI_Q9 ), Q7 ); // Q0 - index_elevation = add( index_elevation, 90 ); - - IF( GT_16( index_elevation, 90 ) ) - { - e = -ONE_IN_Q14; /*-1 Q14*/ - move16(); - el = sub( 180, index_elevation ); - } - ELSE - { - e = ONE_IN_Q14; /*1 Q14*/ - move16(); - el = index_elevation; - move16(); - } - - IF( GT_16( index_azimuth, 180 ) ) - { - az = sub( 360, index_azimuth ); - f = -ONE_IN_Q30; /*-1 Q30*/ - move32(); - } - ELSE - { - az = index_azimuth; - move16(); - f = ONE_IN_Q30; /*1 Q30*/ - move32(); - } - - // dirac_gains_trg_term_int Q30 - cos_1 = L_shr( dirac_gains_trg_term_int[az][0], 1 ); // Q29 - cos_2 = L_shl( Mpy_32_32( cos_1, cos_1 ), 2 ); // Q29 - sin_1 = Mpy_32_32( f, dirac_gains_trg_term_int[az][1] ); // Q29 - - cos_az[0] = cos_1; // Q29 - move32(); - cos_az[1] = L_shl( L_sub( Mpy_32_32( TWO_IN_Q29, cos_2 ), ONE_IN_Q27 ), 2 ); // Q29 - move32(); - cos_az[2] = L_sub( L_shl( Mpy_32_32( Mpy_32_32( TWO_IN_Q29, cos_1 ), cos_az[1] ), 4 ), cos_az[0] ); // Q29 - move32(); - - sin_az[0] = sin_1; // Q29 - move32(); - sin_az[1] = L_shl( Mpy_32_32( Mpy_32_32( sin_1, TWO_IN_Q29 ), cos_1 ), 4 ); // Q29 - move32(); - sin_az[2] = L_shl( Mpy_32_32( sin_1, L_sub( Mpy_32_32( FOUR_IN_Q28, cos_2 ), ONE_IN_Q26 ) ), 5 ); // Q29 - move32(); - - FOR( l = shd_rot_max_order + 1; l <= 3; l++ ) - { - b_2 = i_mult( l, l ); - b1_2 = add( b_2, i_mult( 2, l ) ); - - FOR( m = 0; m < l; m += 2 ) - { - b = add( b_2, m ); - a = dirac_gains_P_idx[b]; - move16(); - - c = Mpy_32_32( Mpy_32_32( SQRT2_FIXED, dirac_gains_norm_term_int[a] ), dirac_gains_Pnm_int[el][a] ); // Q25 - - response[b] = L_shl( Mpy_32_32( c, sin_az[l - m - 1] ), 6 ); // Q29 - move32(); - - b1 = sub( b1_2, m ); - response[b1] = L_shl( Mpy_32_32( c, cos_az[l - m - 1] ), 6 ); // Q29 - move32(); - } - - FOR( m = 1; m < l; m += 2 ) - { - b = add( b_2, m ); - a = dirac_gains_P_idx[b]; - move16(); - - c = Mpy_32_32( Mpy_32_32( SQRT2_FIXED, dirac_gains_norm_term_int[a] ), dirac_gains_Pnm_int[el][a] ); // Q25 - c = Mpy_32_16_1( c, e ); // Q24 - - response[b] = L_shl( Mpy_32_32( c, sin_az[l - m - 1] ), 7 ); // Q29 - move32(); - - b1 = sub( b1_2, m ); - response[b1] = L_shl( Mpy_32_32( c, cos_az[l - m - 1] ), 7 ); // Q29 - move32(); - } - - b = add( b_2, l ); - a = dirac_gains_P_idx[b]; - move16(); - - c = L_shl( Mpy_32_32( dirac_gains_norm_term_int[a], dirac_gains_Pnm_int[el][a] ), 3 ); // Q29 - - IF( EQ_16( l % 2, 1 ) ) - { - c = L_shl( Mpy_32_16_1( c, e ), 1 ); // Q29 - } - - response[b] = c; // Q29 - move32(); - } - - *q_response = Q29; - move16(); - - pop_wmops(); - - return; -} - /*------------------------------------------------------------------------- * ivas_dirac_dec_compute_directional_responses() * @@ -2919,9 +2628,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( const Word16 md_idx, const Word32 *surCohRatio_fx, /*i:Q_surCohRatio*/ Word16 Q_surCohRatio, - const Word16 shd_rot_max_order, /* i : split-order rotation method */ - const Word32 *p_Rmat, /* i : rotation matrix Q30*/ - const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { Word16 k, l, i; @@ -3008,14 +2715,14 @@ void ivas_dirac_dec_compute_directional_responses_fx( /* Panning gains have to be computed only for the first bin of the coding band in MASA, for other bins the previous values can be used */ IF( NE_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { - mvr2r_inc_fixed( &hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx[k - 1], - hSpatParamRendCom->num_freq_bands, &hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx[k], - hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*direct_response_square_q*/ + mvr2r_inc_fx( &hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx[k - 1], + hSpatParamRendCom->num_freq_bands, &hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx[k], + hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*direct_response_square_q*/ } - mvr2r_inc_fixed( &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[k - 1], - hSpatParamRendCom->num_freq_bands, - &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[k], - hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*direct_response_q*/ + mvr2r_inc_fx( &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[k - 1], + hSpatParamRendCom->num_freq_bands, + &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[k], + hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*direct_response_q*/ } ELSE { @@ -3034,23 +2741,11 @@ void ivas_dirac_dec_compute_directional_responses_fx( exp_direct_response_dir2 = 0; move16(); - IF( p_Rmat != 0 ) - { - ivas_dirac_dec_get_response_split_order_fx( azimuth[k], elevation[k], direct_response_hoa_fx, shd_rot_max_order, p_Rmat, &Q_direct_response_hoa ); + ivas_dirac_dec_get_response_fx_29( azimuth[k], elevation[k], direct_response_hoa_fx, hDirACRend->hOutSetup.ambisonics_order ); - IF( hodirac_flag ) - { - ivas_dirac_dec_get_response_split_order_fx( azimuth2[k], elevation2[k], direct_response_dir2_fx, shd_rot_max_order, p_Rmat, &Q_direct_response_dir2 ); - } - } - ELSE + IF( hodirac_flag ) { - ivas_dirac_dec_get_response_fx( azimuth[k], elevation[k], direct_response_hoa_fx, hDirACRend->hOutSetup.ambisonics_order, Q_direct_response_hoa ); - - IF( hodirac_flag ) - { - ivas_dirac_dec_get_response_fx( azimuth2[k], elevation2[k], direct_response_dir2_fx, hDirACRend->hOutSetup.ambisonics_order, Q_direct_response_dir2 ); - } + ivas_dirac_dec_get_response_fx_29( azimuth2[k], elevation2[k], direct_response_dir2_fx, hDirACRend->hOutSetup.ambisonics_order ); } test(); @@ -3059,11 +2754,11 @@ void ivas_dirac_dec_compute_directional_responses_fx( test(); IF( masa_band_mapping == NULL && EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { - mvr2r_inc_fixed( direct_response_hoa_fx, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*Q_direct_response_hoa*/ + mvr2r_inc_fx( direct_response_hoa_fx, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*Q_direct_response_hoa*/ IF( hodirac_flag ) { - mvr2r_inc_fixed( direct_response_dir2_fx, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[k + hSpatParamRendCom->num_freq_bands * num_channels_dir], hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*Q_direct_response_dir2*/ + mvr2r_inc_fx( direct_response_dir2_fx, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[k + hSpatParamRendCom->num_freq_bands * num_channels_dir], hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*Q_direct_response_dir2*/ } } ELSE IF( ( ( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) && ( masa_band_mapping != NULL ) ) || @@ -3158,13 +2853,13 @@ void ivas_dirac_dec_compute_directional_responses_fx( FOR( dir = 0; dir < hSpatParamRendCom->numIsmDirections; dir++ ) { - IF( hMasaIsm->ism_is_edited[dir] ) + IF( hMasaIsm->ism_dir_is_edited[dir] ) { - ivas_dirac_dec_get_response_fx( hMasaIsm->azimuth_ism_edited[dir], hMasaIsm->elevation_ism_edited[dir], direct_response_temp_fx, hDirACRend->hOutSetup.ambisonics_order, Q29 ); + ivas_dirac_dec_get_response_fx( hMasaIsm->azimuth_ism_edited_fx[dir], hMasaIsm->elevation_ism_edited_fx[dir], direct_response_temp_fx, hDirACRend->hOutSetup.ambisonics_order, Q29 ); } ELSE { - ivas_dirac_dec_get_response_fx( hMasaIsm->azimuth_ism[dir][md_idx], hMasaIsm->elevation_ism[dir][md_idx], direct_response_temp_fx, hDirACRend->hOutSetup.ambisonics_order, Q29 ); + ivas_dirac_dec_get_response_fx( hMasaIsm->azimuth_ism_fx[dir][md_idx], hMasaIsm->elevation_ism_fx[dir][md_idx], direct_response_temp_fx, hDirACRend->hOutSetup.ambisonics_order, Q29 ); } exp_direct_response_temp = 2; move16(); @@ -3292,10 +2987,10 @@ void ivas_dirac_dec_compute_directional_responses_fx( direct_response_fx = direct_response_hoa_fx; IF( NE_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { - v_mult_fixed( direct_response_fx, direct_response_fx, direct_response_square_fx, num_channels_dir ); /*Q(2*direct_response_q-31)*/ + v_mult_fx( direct_response_fx, direct_response_fx, direct_response_square_fx, num_channels_dir ); /*Q(2*direct_response_q-31)*/ direct_response_square_q = sub( add( direct_response_q, direct_response_q ), 31 ); - mvr2r_inc_fixed( direct_response_square_fx, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*direct_response_square_q*/ + mvr2r_inc_fx( direct_response_square_fx, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*direct_response_square_q*/ IF( EQ_16( transport_signal_type, MASA_STEREO_SPACED_MICS ) ) { @@ -3314,7 +3009,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( } } - mvr2r_inc_fixed( direct_response_fx, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*q29*/ + mvr2r_inc_fx( direct_response_fx, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*q29*/ } ELSE { @@ -3409,13 +3104,13 @@ void ivas_dirac_dec_compute_directional_responses_fx( FOR( dir = 0; dir < hSpatParamRendCom->numIsmDirections; dir++ ) { - IF( hMasaIsm->ism_is_edited[dir] ) + IF( hMasaIsm->ism_dir_is_edited[dir] ) { - vbap_determine_gains_fx( hVBAPdata, direct_response_temp_fx, hMasaIsm->azimuth_ism_edited[dir], hMasaIsm->elevation_ism_edited[dir], 1 ); + vbap_determine_gains_fx( hVBAPdata, direct_response_temp_fx, hMasaIsm->azimuth_ism_edited_fx[dir], hMasaIsm->elevation_ism_edited_fx[dir], 1 ); } ELSE { - vbap_determine_gains_fx( hVBAPdata, direct_response_temp_fx, hMasaIsm->azimuth_ism[dir][md_idx], hMasaIsm->elevation_ism[dir][md_idx], 1 ); + vbap_determine_gains_fx( hVBAPdata, direct_response_temp_fx, hMasaIsm->azimuth_ism_fx[dir][md_idx], hMasaIsm->elevation_ism_fx[dir][md_idx], 1 ); } Word32 tmp = 0; move32(); @@ -3569,11 +3264,11 @@ void ivas_dirac_dec_compute_directional_responses_fx( /* Set computed gains */ direct_response_fx = direct_response_ls_fx; - v_mult_fixed( direct_response_fx, direct_response_fx, direct_response_square_fx, num_channels_dir ); /*2*direct_response_q-31*/ + v_mult_fx( direct_response_fx, direct_response_fx, direct_response_square_fx, num_channels_dir ); /*2*direct_response_q-31*/ direct_response_square_q = sub( add( direct_response_q, direct_response_q ), 31 ); - mvr2r_inc_fixed( direct_response_square_fx, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*direct_response_square_q*/ - mvr2r_inc_fixed( direct_response_fx, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*direct_response_q*/ + mvr2r_inc_fx( direct_response_square_fx, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*direct_response_square_q*/ + mvr2r_inc_fx( direct_response_fx, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); /*direct_response_q*/ } ELSE { @@ -3669,16 +3364,15 @@ void ivas_dirac_dec_compute_power_factors_fx( { Word16 i; - v_multc_fixed( diffuseness_fx, L_negate( ( ONE_IN_Q31 ) ), direct_power_factor, num_freq_bands ); // Q30 + v_multc_fx( diffuseness_fx, L_negate( ( ONE_IN_Q31 ) ), direct_power_factor, num_freq_bands ); // Q30 - v_addc_fixed( direct_power_factor, ONE_IN_Q30, direct_power_factor, num_freq_bands ); // Q30 + v_addc_fx( direct_power_factor, ONE_IN_Q30, direct_power_factor, num_freq_bands ); // Q30 Copy32( diffuseness_fx, diffuse_power_factor, num_freq_bands ); // Q30 - v_mult_fixed( &direct_power_factor[max_band_decorr], &direct_power_factor[max_band_decorr], &direct_power_factor[max_band_decorr], num_freq_bands - max_band_decorr ); // Q29 - - v_mult_fixed( &diffuse_power_factor[max_band_decorr], &diffuse_power_factor[max_band_decorr], &diffuse_power_factor[max_band_decorr], num_freq_bands - max_band_decorr ); // Q29 + v_mult_fx( &direct_power_factor[max_band_decorr], &direct_power_factor[max_band_decorr], &direct_power_factor[max_band_decorr], num_freq_bands - max_band_decorr ); // Q29 + v_mult_fx( &diffuse_power_factor[max_band_decorr], &diffuse_power_factor[max_band_decorr], &diffuse_power_factor[max_band_decorr], num_freq_bands - max_band_decorr ); // Q29 FOR( i = 0; i < max_band_decorr; i++ ) { @@ -3687,6 +3381,7 @@ void ivas_dirac_dec_compute_power_factors_fx( diffuse_power_factor[i] = L_shr( diffuse_power_factor[i], 1 ); // Q29 move32(); } + return; } @@ -3696,6 +3391,7 @@ void ivas_dirac_dec_compute_power_factors_fx( * * *------------------------------------------------------------------------*/ + void ivas_lfe_synth_with_filters_fx( MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, /* i/o: LFE synthesis structure for McMASA */ Word32 *data_fx[], /* o : output signals (Q11) */ @@ -3814,10 +3510,10 @@ void ivas_lfe_synth_with_filters_fx( } ELSE { - lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_cadence( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); /*Q(31-(lfeGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneLfeSmooth_q))-16*/ + lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_newton( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); /*Q(31-(lfeGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneLfeSmooth_q))-16*/ lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); - lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp - lfeGain_fx = shl_r( lfeGain_fx, lfeGain_fx_exp ); // Q15 + lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp + lfeGain_fx = shr_r_sat( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 } IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, sub( Q31, hMasaLfeSynth->targetEneTransSmooth_q ), /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, sub( Q31, hMasaLfeSynth->transportEneSmooth_q ) ), 1 ) ) { @@ -3826,11 +3522,10 @@ void ivas_lfe_synth_with_filters_fx( } ELSE { - Flag overFlow; transportGain_fx = BASOP_Util_Divide3232_Scale( hMasaLfeSynth->targetEneTransSmooth_fx, /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, &transportGain_fx_exp ); /*Q=15-(transportGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneTransSmooth_q)*/ transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); - transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp - transportGain_fx = shl_ro( transportGain_fx, transportGain_fx_exp, &overFlow ); // Q15 + transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp + transportGain_fx = shr_r_sat( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 } j = 0; move16(); @@ -3911,25 +3606,27 @@ static void computeTargetPSDs_direct_fx( Word32 aux_buffer_res[CLDFB_NO_CHANNELS_MAX]; /* size: num_freq_bands. */ /* estimate direct and diffuse power */ - v_mult_fixed( direct_power_factor, reference_power, direct_power, num_freq_bands ); /* Q31 + Q(q_reference_power) - Q31 = Q(q_reference_power) */ + v_mult_fx( direct_power_factor, reference_power, direct_power, num_freq_bands ); /* Q31 + Q(q_reference_power) - Q31 = Q(q_reference_power) */ - Word16 common1_q = s_min( *q_cy_auto_dir_smooth, *q_reference_power ); - Word16 common2_q = s_min( *q_cy_cross_dir_smooth, *q_reference_power ); + Word16 common1_q = s_min( *q_cy_auto_dir_smooth, s_min( q_reference_power[0], q_reference_power[1] ) ); + Word16 common2_q = s_min( *q_cy_cross_dir_smooth, s_min( q_reference_power[0], q_reference_power[1] ) ); /* compute target auto and cross PSDs of current frame (smoothed) */ FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { cur_idx = imult1616( ch_idx, num_freq_bands ); - v_mult_fixed( direct_power, &direct_responses_square[cur_idx], aux_buffer_res, num_freq_bands ); /* Q31 + Q(q_reference_power) - Q31 = Q(q_reference_power) */ - scale_sig32( aux_buffer_res, num_freq_bands, sub( common1_q, *q_reference_power ) ); /* Q(common1_q) */ - scale_sig32( &cy_auto_dir_smooth[cur_idx], num_freq_bands, sub( common1_q, *q_cy_auto_dir_smooth ) ); /* Q(common1_q) */ - v_add_fixed( &cy_auto_dir_smooth[cur_idx], aux_buffer_res, &cy_auto_dir_smooth[cur_idx], num_freq_bands, Q1 ); /* Q(common1_q) - Q1 */ - - v_mult_fixed( direct_power, &direct_responses[cur_idx], aux_buffer_res, num_freq_bands ); /* Q31 + Q(q_reference_power) - Q31 = Q(q_reference_power) */ - scale_sig32( aux_buffer_res, num_freq_bands, sub( common2_q, *q_reference_power ) ); /* Q(common2_q) */ - scale_sig32( &cy_cross_dir_smooth[cur_idx], num_freq_bands, sub( common2_q, *q_cy_cross_dir_smooth ) ); /* Q(common2_q) */ - v_add_fixed( &cy_cross_dir_smooth[cur_idx], aux_buffer_res, &cy_cross_dir_smooth[cur_idx], num_freq_bands, Q1 ); /* Q(common2_q) - Q1 */ + v_mult_fx( direct_power, &direct_responses_square[cur_idx], aux_buffer_res, num_freq_bands ); /* Q31 + Q(q_reference_power) - Q31 = Q(q_reference_power) */ + scale_sig32( aux_buffer_res, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( common1_q, q_reference_power[0] ) ); /* Q(common1_q) */ + scale_sig32( aux_buffer_res + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( common1_q, q_reference_power[1] ) ); /* Q(common1_q) */ + scale_sig32( &cy_auto_dir_smooth[cur_idx], num_freq_bands, sub( common1_q, *q_cy_auto_dir_smooth ) ); /* Q(common1_q) */ + v_add_fx_hdrm( &cy_auto_dir_smooth[cur_idx], aux_buffer_res, &cy_auto_dir_smooth[cur_idx], num_freq_bands, Q1 ); /* Q(common1_q) - Q1 */ + + v_mult_fx( direct_power, &direct_responses[cur_idx], aux_buffer_res, num_freq_bands ); /* Q31 + Q(q_reference_power) - Q31 = Q(q_reference_power) */ + scale_sig32( aux_buffer_res, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( common2_q, q_reference_power[0] ) ); /* Q(common2_q) */ + scale_sig32( aux_buffer_res + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( common2_q, q_reference_power[1] ) ); /* Q(common2_q) */ + scale_sig32( &cy_cross_dir_smooth[cur_idx], num_freq_bands, sub( common2_q, *q_cy_cross_dir_smooth ) ); /* Q(common2_q) */ + v_add_fx_hdrm( &cy_cross_dir_smooth[cur_idx], aux_buffer_res, &cy_cross_dir_smooth[cur_idx], num_freq_bands, Q1 ); /* Q(common2_q) - Q1 */ } /* Q adjustment */ @@ -3955,53 +3652,38 @@ static void computeTargetPSDs_direct_subframe_fx( Word32 *cy_cross_dir_smooth, /*q_cy_cross_dir_smooth*/ Word16 *q_cy_cross_dir_smooth ) { - Word16 ch_idx, cur_idx, i, q_tmp; - Word64 W_tmp[CLDFB_NO_CHANNELS_MAX], W_max; - set64_fx( W_tmp, 0, CLDFB_NO_CHANNELS_MAX ); + Word16 ch_idx, cur_idx, q_tmp; + Word32 L_tmp[CLDFB_NO_CHANNELS_MAX]; + Word16 q_cy_auto_dir_smooth_local[2]; /* segment auxiliary buffer */ Word32 direct_power[CLDFB_NO_CHANNELS_MAX]; /* size: num_freq_bands. */ /* estimate direct and diffuse power */ - FOR( i = 0; i < num_freq_bands; i++ ) - { - direct_power[i] = Mpy_32_32( direct_power_factor[i], reference_power[i] ); - move32(); - test(); - if ( direct_power[i] == 0 && ( direct_power_factor[i] != 0 && reference_power[i] != 0 ) ) - { - direct_power[i] = 1; - move32(); - } - } + v_mult_fx( direct_power_factor, reference_power, direct_power, num_freq_bands ); + /* compute target auto and cross PSDs of current frame (smoothed) */ FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { cur_idx = imult1616( ch_idx, num_freq_bands ); - W_max = 0; - move64(); - FOR( i = 0; i < num_freq_bands; i++ ) - { - W_tmp[i] = W_mult_32_32( direct_power[i], direct_responses_square[cur_idx + i] ); // q_reference_power + Q31 + 1 - move64(); - IF( LT_64( W_max, W_abs( W_tmp[i] ) ) ) - { - W_max = W_abs( W_tmp[i] ); - } - } - q_tmp = W_norm( W_max ); - FOR( i = 0; i < num_freq_bands; i++ ) - { - cy_auto_dir_smooth[cur_idx + i] = W_extract_h( W_shl( W_tmp[i], q_tmp ) ); /*q_reference_power+q_tmp*/ - move32(); - } - q_cy_auto_dir_smooth[ch_idx] = add( *q_reference_power, q_tmp ); + q_tmp = L_norm_arr( &direct_responses_square[cur_idx], num_freq_bands ); + Copy_Scale_sig32( &direct_responses_square[cur_idx], L_tmp, num_freq_bands, q_tmp ); + v_mult_fx( direct_power, L_tmp, &cy_auto_dir_smooth[cur_idx], num_freq_bands ); // (q_reference_power, q_tmp) -> q_reference_power + q_tmp + + q_cy_auto_dir_smooth_local[0] = add( add( q_reference_power[0], q_tmp ), L_norm_arr( cy_auto_dir_smooth + cur_idx, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ); + q_cy_auto_dir_smooth_local[1] = add( add( q_reference_power[1], q_tmp ), L_norm_arr( cy_auto_dir_smooth + cur_idx + CLDFB_NO_CHANNELS_HALF, s_max( sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ), 0 ) ) ); + q_cy_auto_dir_smooth[ch_idx] = s_min( q_cy_auto_dir_smooth_local[0], q_cy_auto_dir_smooth_local[1] ); move16(); - v_mult_fixed( direct_power, &direct_responses[cur_idx], &cy_cross_dir_smooth[cur_idx], num_freq_bands ); // (q_reference_power, Q31) -> q_reference_power + + Scale_sig32( cy_auto_dir_smooth + cur_idx, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( q_cy_auto_dir_smooth[ch_idx], add( q_reference_power[0], q_tmp ) ) ); + Scale_sig32( cy_auto_dir_smooth + cur_idx + CLDFB_NO_CHANNELS_HALF, s_max( sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ), 0 ), sub( q_cy_auto_dir_smooth[ch_idx], add( q_reference_power[1], q_tmp ) ) ); + + v_mult_fx( direct_power, &direct_responses[cur_idx], &cy_cross_dir_smooth[cur_idx], num_freq_bands ); // (q_reference_power, Q31) -> q_reference_power + Scale_sig32( &cy_cross_dir_smooth[cur_idx] + CLDFB_NO_CHANNELS_HALF, s_max( sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ), 0 ), sub( q_reference_power[0], q_reference_power[1] ) ); } - *q_cy_cross_dir_smooth = *q_reference_power; + *q_cy_cross_dir_smooth = q_reference_power[0]; move16(); return; @@ -4026,19 +3708,20 @@ static void computeTargetPSDs_diffuse_fx( Word32 aux_buffer_res[CLDFB_NO_CHANNELS_MAX]; /* size: num_freq_bands. */ /* estimate direct and diffuse power */ - v_mult_fixed( diffuse_power_factor, reference_power, diffuse_power, num_freq_bands ); /* Q31 + Q(q_reference_power) - Q31 = Q(q_reference_power) */ + v_mult_fx( diffuse_power_factor, reference_power, diffuse_power, num_freq_bands ); /* Q31 + Q(q_reference_power) - Q31 = Q(q_reference_power) */ - Word16 common_q = s_min( *q_cy_auto_diff_smooth, *q_reference_power ); + Word16 common_q = s_min( *q_cy_auto_diff_smooth, s_min( q_reference_power[0], q_reference_power[1] ) ); /* compute target auto and cross PSDs of current frame (smoothed) */ FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { cur_idx = imult1616( ch_idx, num_freq_bands ); - v_multc_fixed( &diffuse_power[start_band], diffuse_responses_square[ch_idx], aux_buffer_res, sub( num_freq_bands, start_band ) ); /* Q31 + Q(q_reference_power) - Q31 = Q(q_reference_power) */ - scale_sig32( aux_buffer_res, sub( num_freq_bands, start_band ), sub( common_q, *q_reference_power ) ); /* Q(common_q) */ - scale_sig32( &cy_auto_diff_smooth[cur_idx + start_band], sub( num_freq_bands, start_band ), sub( common_q, *q_cy_auto_diff_smooth ) ); /* Q(common_q) */ - v_add_fixed( &cy_auto_diff_smooth[cur_idx + start_band], aux_buffer_res, &cy_auto_diff_smooth[cur_idx + start_band], sub( num_freq_bands, start_band ), Q1 ); /* Q(common_q) - Q1 */ + v_multc_fx( &diffuse_power[start_band], diffuse_responses_square[ch_idx], aux_buffer_res, sub( num_freq_bands, start_band ) ); /* Q31 + Q(q_reference_power) - Q31 = Q(q_reference_power) */ + scale_sig32( aux_buffer_res, s_min( sub( num_freq_bands, start_band ), CLDFB_NO_CHANNELS_HALF ), sub( common_q, q_reference_power[0] ) ); /* Q(common_q) */ + scale_sig32( aux_buffer_res + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( sub( num_freq_bands, start_band ), CLDFB_NO_CHANNELS_HALF ) ), sub( common_q, q_reference_power[1] ) ); /* Q(common_q) */ + scale_sig32( &cy_auto_diff_smooth[cur_idx + start_band], sub( num_freq_bands, start_band ), sub( common_q, *q_cy_auto_diff_smooth ) ); /* Q(common_q) */ + v_add_fx_hdrm( &cy_auto_diff_smooth[cur_idx + start_band], aux_buffer_res, &cy_auto_diff_smooth[cur_idx + start_band], sub( num_freq_bands, start_band ), Q1 ); /* Q(common_q) - Q1 */ } /* Q adjustment */ @@ -4062,19 +3745,34 @@ static void computeTargetPSDs_diffuse_subframe_fx( { Word16 ch_idx, cur_idx; Word32 diffuse_power[CLDFB_NO_CHANNELS_MAX]; /* segment auxiliary buffer; size: num_freq_bands. */ + Word16 q_cy_auto_diff_smooth_new, q_diffuse_power; /* estimate direct and diffuse power */ - v_mult_fixed( diffuse_power_factor, reference_power, diffuse_power, num_freq_bands ); // (Q31, q_reference_power) -> q_reference_power + v_mult_fx( diffuse_power_factor, reference_power, diffuse_power, num_freq_bands ); // (Q31, q_reference_power) -> q_reference_power + q_diffuse_power = s_min( q_reference_power[0], q_reference_power[1] ); + Scale_sig32( diffuse_power, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( q_diffuse_power, q_reference_power[0] ) ); + Scale_sig32( diffuse_power + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( q_diffuse_power, q_reference_power[1] ) ); + q_cy_auto_diff_smooth_new = q_diffuse_power; + IF( LT_16( *q_cy_auto_diff_smooth, q_diffuse_power ) ) + { + Scale_sig32( diffuse_power, num_freq_bands, sub( *q_cy_auto_diff_smooth, q_cy_auto_diff_smooth_new ) ); + q_cy_auto_diff_smooth_new = *q_cy_auto_diff_smooth; + move16(); + } /* compute target auto and cross PSDs of current frame (smoothed) */ FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { cur_idx = imult1616( ch_idx, num_freq_bands ); - v_multc_fixed( &diffuse_power[start_band], diffuse_responses_square[ch_idx], &cy_auto_diff_smooth[cur_idx + start_band], sub( num_freq_bands, start_band ) ); // (q_reference_power, Q31) -> q_reference_power + IF( GT_16( *q_cy_auto_diff_smooth, q_diffuse_power ) ) + { + Scale_sig32( &cy_auto_diff_smooth[cur_idx], start_band, sub( q_diffuse_power, *q_cy_auto_diff_smooth ) ); + } + v_multc_fx( &diffuse_power[start_band], diffuse_responses_square[ch_idx], &cy_auto_diff_smooth[cur_idx + start_band], sub( num_freq_bands, start_band ) ); // (q_reference_power, Q31) -> q_reference_power } - *q_cy_auto_diff_smooth = *q_reference_power; + *q_cy_auto_diff_smooth = q_cy_auto_diff_smooth_new; move16(); return; @@ -4099,24 +3797,15 @@ static void computeTargetPSDs_diffuse_with_onsets_fx( /* segment auxiliary buffer */ Word32 diffuse_power[CLDFB_NO_CHANNELS_MAX]; /* size: num_freq_bands. */ Word32 aux_buffer_res[CLDFB_NO_CHANNELS_MAX]; /* size: num_freq_bands. */ + Word16 q_common, q_reference_power_min_one[2]; - Word16 q_common, q_reference_power_min_one; - - q_reference_power_min_one = sub( *q_reference_power, Q1 ); + q_reference_power_min_one[0] = sub( q_reference_power[0], Q1 ); + q_reference_power_min_one[1] = sub( q_reference_power[1], Q1 ); /* estimate direct and diffuse power */ - v_mult_fixed( diffuse_power_factor, reference_power, diffuse_power, num_decorr_freq_bands ); // (Q31, q_reference_power) -> q_reference_power + v_mult_fx( diffuse_power_factor, reference_power, diffuse_power, num_decorr_freq_bands ); // (Q31, q_reference_power) -> q_reference_power - IF( GT_16( *q_cy_auto_diff_smooth, q_reference_power_min_one ) ) - { - q_common = q_reference_power_min_one; - move16(); - } - ELSE - { - q_common = *q_cy_auto_diff_smooth; - move16(); - } + q_common = s_min( *q_cy_auto_diff_smooth, s_min( q_reference_power_min_one[0], q_reference_power_min_one[1] ) ); /* compute target auto and cross PSDs of current frame (smoothed) */ FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) @@ -4126,22 +3815,26 @@ static void computeTargetPSDs_diffuse_with_onsets_fx( cur_idx = imult1616( ch_idx, num_freq_bands ); diff_idx = imult1616( proto_frame_diff_index[ch_idx], num_freq_bands ); - v_multc_fixed( &onset_filter[diff_idx], diffuse_responses_square[ch_idx], aux_buffer_res1, num_decorr_freq_bands ); // (Q31, Q31) -> Q31 - v_multc_fixed( &onset_filter[diff_idx], INT_MIN, aux_buffer_res, num_decorr_freq_bands ); // (Q31, Q31) -> Q31 - v_addc_fixed( aux_buffer_res, ONE_IN_Q31, aux_buffer_res, num_decorr_freq_bands ); // Q31 - v_multc_fixed( aux_buffer_res, diffuse_response_p4, aux_buffer_res, num_decorr_freq_bands ); // (Q31, Q31) -> Q31 - v_add_fixed( aux_buffer_res1, aux_buffer_res, aux_buffer_res, num_decorr_freq_bands, Q1 ); // Q30 - v_mult_fixed( aux_buffer_res, diffuse_power, aux_buffer_res, num_decorr_freq_bands ); // (Q30, q_reference_power) -> q_reference_power - Q1 + v_multc_fx( &onset_filter[diff_idx], diffuse_responses_square[ch_idx], aux_buffer_res1, num_decorr_freq_bands ); // (Q31, Q31) -> Q31 + v_multc_fx( &onset_filter[diff_idx], INT_MIN, aux_buffer_res, num_decorr_freq_bands ); // (Q31, Q31) -> Q31 + v_addc_fx( aux_buffer_res, ONE_IN_Q31, aux_buffer_res, num_decorr_freq_bands ); // Q31 + v_multc_fx( aux_buffer_res, diffuse_response_p4, aux_buffer_res, num_decorr_freq_bands ); // (Q31, Q31) -> Q31 + v_add_fx_hdrm( aux_buffer_res1, aux_buffer_res, aux_buffer_res, num_decorr_freq_bands, Q1 ); // Q30 + v_mult_fx( aux_buffer_res, diffuse_power, aux_buffer_res, num_decorr_freq_bands ); // (Q30, q_reference_power) -> q_reference_power - Q1 - IF( NE_16( q_common, q_reference_power_min_one ) ) + IF( NE_16( q_common, q_reference_power_min_one[0] ) ) + { + scale_sig32( aux_buffer_res, s_min( num_decorr_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( q_common, q_reference_power_min_one[0] ) ); // q_common + } + IF( NE_16( q_common, q_reference_power_min_one[1] ) ) { - scale_sig32( aux_buffer_res, num_decorr_freq_bands, sub( q_common, q_reference_power_min_one ) ); // q_common + scale_sig32( aux_buffer_res + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( num_decorr_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( q_common, q_reference_power_min_one[1] ) ); // q_common } IF( NE_16( q_common, *q_cy_auto_diff_smooth ) ) { scale_sig32( &cy_auto_diff_smooth[cur_idx], num_decorr_freq_bands, sub( q_common, *q_cy_auto_diff_smooth ) ); // q_common } - v_add_fixed( &cy_auto_diff_smooth[cur_idx], aux_buffer_res, &cy_auto_diff_smooth[cur_idx], num_decorr_freq_bands, Q1 ); // (q_common - Q1) + v_add_fx_hdrm( &cy_auto_diff_smooth[cur_idx], aux_buffer_res, &cy_auto_diff_smooth[cur_idx], num_decorr_freq_bands, Q1 ); // (q_common - Q1) scale_sig32( &cy_auto_diff_smooth[cur_idx + num_decorr_freq_bands], sub( num_freq_bands, num_decorr_freq_bands ), sub( sub( q_common, Q1 ), *q_cy_auto_diff_smooth ) ); // (q_common - Q1) } diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 4e0d3ab71e1f9eba35f4b6b6f05e73752ca4f5cf..bde35181ee7c12d7d3da54a92c1be9e4cb051725 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -778,16 +778,18 @@ ivas_error ivas_dirac_alloc_mem_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } -#ifdef MSAN_FIX set_zero_fx( hDirAC_mem->frame_dec_f_fx, 2 * num_outputs_diff * num_freq_bands ); -#endif hDirAC_mem->frame_dec_f_len = imult1616( imult1616( 2, num_outputs_diff ), num_freq_bands ); } } hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx = hDirAC_mem->proto_power_smooth_fx; - hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q = Q31; + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0] = Q31; + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] = Q31; + move16(); + move16(); + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] = Q31; + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] = Q31; move16(); - hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q = Q31; move16(); hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx = hDirAC_mem->proto_power_diff_smooth_fx; hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q = hDirAC_mem->proto_power_diff_smooth_q; @@ -813,12 +815,7 @@ ivas_error ivas_dirac_alloc_mem_fx( } hDirACRend->h_output_synthesis_psd_state.cy_cross_dir_smooth_len = size_ho; move16(); -#ifdef MSAN_FIX set_zero_fx( hDirAC_mem->cy_cross_dir_smooth_fx, size_ho ); -#else - set_zero_fx( hDirAC_mem->cy_cross_dir_smooth_fx, size ); - hDirACRend->h_output_synthesis_psd_state.cy_cross_dir_smooth_len = size_ho; -#endif IF( NE_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { @@ -870,9 +867,7 @@ ivas_error ivas_dirac_alloc_mem_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_len = imult1616( imult1616( 2 * MAX_PARAM_SPATIAL_SUBFRAMES, num_protos_dir ), num_freq_bands ); -#ifdef MSAN_FIX set_zero_fx( hDirAC_mem->proto_direct_buffer_f_fx, hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_len ); -#endif move16(); hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q = Q31; move16(); @@ -896,9 +891,7 @@ ivas_error ivas_dirac_alloc_mem_fx( } hDirAC_mem->proto_diffuse_buffer_f_len = imult1616( imult1616( 2 * MAX_PARAM_SPATIAL_SUBFRAMES, num_outputs_diff ), num_freq_bands ); } -#ifdef MSAN_FIX set_zero_fx( hDirAC_mem->proto_diffuse_buffer_f_fx, hDirAC_mem->proto_diffuse_buffer_f_len ); -#endif } } hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx = hDirAC_mem->proto_direct_buffer_f_fx; @@ -951,9 +944,13 @@ ivas_error ivas_dirac_alloc_mem_fx( hDirAC_mem->reference_power_len = imult1616( 2, num_freq_bands ); move16(); - hDirAC_mem->reference_power_q = Q31; + hDirAC_mem->reference_power_q[0] = Q31; + hDirAC_mem->reference_power_q[1] = Q31; + move16(); + move16(); + hDirAC_mem->reference_power_smooth_q[0] = Q31; + hDirAC_mem->reference_power_smooth_q[1] = Q31; move16(); - hDirAC_mem->reference_power_smooth_q = Q31; move16(); IF( hDirACRend->proto_signal_decorr_on ) { @@ -961,9 +958,7 @@ ivas_error ivas_dirac_alloc_mem_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } -#ifdef MSAN_FIX set_zero_fx( hDirAC_mem->onset_filter_fx, imult1616( num_outputs_diff, num_freq_bands ) ); -#endif } } } @@ -977,6 +972,7 @@ ivas_error ivas_dirac_alloc_mem_fx( } hDirAC_mem->reference_power_len = imult1616( 5, num_freq_bands ); + set16_fx( hDirAC_mem->reference_power_q, Q31, 2 ); } IF( hDirACRend->proto_signal_decorr_on ) @@ -985,9 +981,7 @@ ivas_error ivas_dirac_alloc_mem_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } -#ifdef MSAN_FIX set_zero_fx( hDirAC_mem->onset_filter_fx, imult1616( 2, num_freq_bands ) ); -#endif } } @@ -1481,7 +1475,8 @@ void protoSignalComputation_shd_fx( *proto_direct_buffer_f_q = add( q_cldfb, min_q_shift ); move16(); - *reference_power_q = sub( add( *proto_direct_buffer_f_q, *proto_direct_buffer_f_q ), 31 ); + Word16 qidx = s_min( 1, s_max( 0, sub( l, CLDFB_NO_CHANNELS_HALF - 1 ) ) ); + reference_power_q[qidx] = sub( add( *proto_direct_buffer_f_q, *proto_direct_buffer_f_q ), 31 ); move16(); Word16 shift = sub( *proto_direct_buffer_f_q, q_cldfb ); @@ -1517,7 +1512,9 @@ void protoSignalComputation_shd_fx( } *proto_direct_buffer_f_q = q_cldfb; move16(); - *reference_power_q = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); + reference_power_q[0] = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); + reference_power_q[1] = reference_power_q[0]; + move16(); move16(); } @@ -1580,7 +1577,7 @@ void protoSignalComputation1_fx( { Word16 l, k, idx; Word32 *p_proto_buffer_fx; - Word16 proto_power_smooth_fx_q, min_q_shift, q_shift; + Word16 proto_power_smooth_fx_q[2], min_q_shift, q_shift; Word32 re, im; min_q_shift = Q31; @@ -1603,32 +1600,36 @@ void protoSignalComputation1_fx( q_shift = sub( q_shift, find_guarded_bits_fx( 2 ) ); Scale_sig32( proto_power_smooth_fx, num_freq_bands, q_shift ); /*proto_power_smooth_q+q_shift*/ - *proto_power_smooth_q = add( *proto_power_smooth_q, q_shift ); - proto_power_smooth_fx_q = *proto_power_smooth_q; + proto_power_smooth_q[0] = add( proto_power_smooth_q[0], q_shift ); + proto_power_smooth_q[1] = add( proto_power_smooth_q[1], q_shift ); + proto_power_smooth_fx_q[0] = proto_power_smooth_q[0]; + proto_power_smooth_fx_q[1] = proto_power_smooth_q[1]; + move16(); move16(); FOR( l = 0; l < num_freq_bands; l++ ) { + Word16 qidx = s_min( 1, s_max( 0, sub( l, CLDFB_NO_CHANNELS_HALF - 1 ) ) ); re = L_shl( RealBuffer_fx[0][0][l], min_q_shift ); // q_cldfb+min_q_shift im = L_shl( ImagBuffer_fx[0][0][l], min_q_shift ); // q_cldfb+min_q_shift reference_power_fx[l] = Madd_32_32( Mpy_32_32( re, re ), im, im ); // 2*(q_cldfb+min_q_shift)-31 move32(); - *reference_power_q = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); + reference_power_q[qidx] = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); move16(); - IF( LT_16( *reference_power_q, *proto_power_smooth_q ) ) + IF( LT_16( reference_power_q[qidx], proto_power_smooth_q[qidx] ) ) { - proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( *proto_power_smooth_q, *reference_power_q ) ), reference_power_fx[l] ); // reference_power_q + proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( proto_power_smooth_q[qidx], reference_power_q[qidx] ) ), reference_power_fx[l] ); // reference_power_q move32(); - proto_power_smooth_fx_q = *reference_power_q; + proto_power_smooth_fx_q[qidx] = reference_power_q[qidx]; move16(); } ELSE { - proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( reference_power_fx[l], sub( *reference_power_q, *proto_power_smooth_q ) ) ); // proto_power_smooth_q + proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( reference_power_fx[l], sub( reference_power_q[qidx], proto_power_smooth_q[qidx] ) ) ); // proto_power_smooth_q move32(); - proto_power_smooth_fx_q = *proto_power_smooth_q; + proto_power_smooth_fx_q[qidx] = proto_power_smooth_q[qidx]; move16(); } @@ -1652,7 +1653,9 @@ void protoSignalComputation1_fx( move16(); *proto_direct_buffer_f_q = q_cldfb; move16(); - *proto_power_smooth_q = proto_power_smooth_fx_q; + proto_power_smooth_q[0] = proto_power_smooth_fx_q[0]; + proto_power_smooth_q[1] = proto_power_smooth_fx_q[1]; + move16(); move16(); return; @@ -1690,27 +1693,30 @@ void protoSignalComputation2_fx( Word32 RealSubtract_fx, ImagSubtract_fx; Word32 left_bb_power_fx, right_bb_power_fx, total_bb_power_fx, lr_bb_power_fx; Word32 left_hi_power_fx, right_hi_power_fx, total_hi_power_fx, lr_hi_power_fx; - Word32 sum_power_fx, Left_power_fx, Right_power_fx; + Word32 sum_power_fx, Left_power_fx, Right_power_fx, Total_power_fx; Word16 q_lr_bb_power, q_lr_hi_power; Word32 lr_total_bb_ratio_fx, lr_total_hi_ratio_fx; Word32 min_sum_total_ratio_fx, min_sum_total_ratio_db_fx; Word32 sum_total_ratio_fx[MASA_SUM_FREQ_RANGE_BINS]; - Word16 q_sum_total_ratio; + Word16 exp_sum_total_ratio_fx[MASA_SUM_FREQ_RANGE_BINS]; + Word16 q_sum_total_ratio = 0; + move16(); Word32 a_fx, b_fx, a2_fx, b2_fx; Word16 interpolatorSpaced_fx, interpolatorDmx_fx; Word32 tempSpaced_fx, tempDmx_fx; - Word16 q_shift, min_q_shift, exp, q_temp, temp_q_shift, q_temp2; + Word16 q_shift, min_q_shift[2], exp, q_temp[2]; Word32 temp; - Word64 W_tmp1, W_tmp2; + Word64 W_tmp1, W_tmp2, W_tmp3; Word64 reference_power_64fx[CLDFB_NO_CHANNELS_MAX]; Word16 q_reference_power_64fx; Word16 head_room, q_Left_Right_power; + Word16 num_proto = 3; /* Calculate maximum possible shift for the buffers RealBuffer_fx and ImagBuffer_fx */ - min_q_shift = Q31; + min_q_shift[0] = Q31; + min_q_shift[1] = Q31; move16(); - temp_q_shift = Q31; move16(); - q_sum_total_ratio = Q31; + q_sum_total_ratio = 0; move16(); exp = 0; move16(); @@ -1722,47 +1728,74 @@ void protoSignalComputation2_fx( /* Calculate the max shift possible for the buffers RealBuffer_fx and ImagBuffer_fx */ FOR( l = 0; l < 2; l++ ) { - q_shift = s_min( L_norm_arr( RealBuffer_fx[l][0], num_freq_bands ), L_norm_arr( ImagBuffer_fx[l][0], num_freq_bands ) ); - min_q_shift = s_min( min_q_shift, q_shift ); - -#ifdef MSAN_FIX + q_shift = s_min( L_norm_arr( RealBuffer_fx[l][0], s_min( CLDFB_NO_CHANNELS_HALF, num_freq_bands ) ), L_norm_arr( ImagBuffer_fx[l][0], s_min( CLDFB_NO_CHANNELS_HALF, num_freq_bands ) ) ); + min_q_shift[0] = s_min( min_q_shift[0], q_shift ); + q_shift = s_min( L_norm_arr( RealBuffer_fx[l][0] + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ), L_norm_arr( ImagBuffer_fx[l][0] + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ) ); + min_q_shift[1] = s_min( min_q_shift[1], q_shift ); +#if ( MASA_SUM_FREQ_RANGE_BINS > CLDFB_NO_CHANNELS_HALF ) +#error MASA_SUM_FREQ_RANGE_BINS if greater than CLDFB_NO_CHANNELS_HALF, this does not work +#endif q_shift = s_min( L_norm_arr( RealBuffer_fx[l][0], s_min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ) ), L_norm_arr( ImagBuffer_fx[l][0], s_min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ) ) ); -#else - q_shift = s_min( L_norm_arr( RealBuffer_fx[l][0], MASA_SUM_FREQ_RANGE_BINS ), L_norm_arr( ImagBuffer_fx[l][0], MASA_SUM_FREQ_RANGE_BINS ) ); -#endif // MSAN_FIX - temp_q_shift = s_min( temp_q_shift, q_shift ); } - min_q_shift = sub( min_q_shift, 2 ); // guard bits - temp_q_shift = sub( temp_q_shift, 2 ); // guard bits + min_q_shift[0] = sub( min_q_shift[0], 2 ); // guard bits + min_q_shift[1] = sub( min_q_shift[1], 2 ); // guard bits /* Upscaling of the buffer proto_power_smooth_fx */ IF( isloudspeaker ) { - q_shift = getScaleFactor32( proto_power_smooth_fx, i_mult( 3, num_freq_bands ) ); - scale_sig32( proto_power_smooth_fx, i_mult( 3, num_freq_bands ), sub( q_shift, 1 ) ); // q_proto_power_smooth+q_shift-1 + num_proto = 3; + q_shift = L_norm_arr( proto_power_smooth_fx, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ); + q_shift = s_min( q_shift, L_norm_arr( proto_power_smooth_fx + num_freq_bands, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ); + q_shift = s_min( q_shift, L_norm_arr( proto_power_smooth_fx + num_freq_bands + num_freq_bands, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ); + scale_sig32( proto_power_smooth_fx, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( q_shift, 1 ) ); // q_proto_power_smooth+q_shift-1 + scale_sig32( proto_power_smooth_fx + num_freq_bands, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( q_shift, 1 ) ); // q_proto_power_smooth+q_shift-1 + scale_sig32( proto_power_smooth_fx + num_freq_bands + num_freq_bands, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( q_shift, 1 ) ); // q_proto_power_smooth+q_shift-1 + } + ELSE + { + num_proto = 2; + q_shift = L_norm_arr( proto_power_smooth_fx, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ); + q_shift = s_min( q_shift, L_norm_arr( proto_power_smooth_fx + num_freq_bands, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ); + scale_sig32( proto_power_smooth_fx, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( q_shift, 1 ) ); // q_proto_power_smooth+q_shift-1 + scale_sig32( proto_power_smooth_fx + num_freq_bands, s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( q_shift, 1 ) ); // q_proto_power_smooth+q_shift-1 + } + q_proto_power_smooth[0] = add( q_proto_power_smooth[0], sub( q_shift, 1 ) ); + move16(); + IF( isloudspeaker ) + { + q_shift = L_norm_arr( proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ); + q_shift = s_min( q_shift, L_norm_arr( proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + num_freq_bands, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ) ); + q_shift = s_min( q_shift, L_norm_arr( proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + num_freq_bands + num_freq_bands, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ) ); + scale_sig32( proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( q_shift, 1 ) ); // q_proto_power_smooth+q_shift-1 + scale_sig32( proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + num_freq_bands, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( q_shift, 1 ) ); // q_proto_power_smooth+q_shift-1 + scale_sig32( proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + num_freq_bands + num_freq_bands, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( q_shift, 1 ) ); // q_proto_power_smooth+q_shift-1 } ELSE { - q_shift = getScaleFactor32( proto_power_smooth_fx, i_mult( 2, num_freq_bands ) ); - scale_sig32( proto_power_smooth_fx, i_mult( 2, num_freq_bands ), sub( q_shift, 1 ) ); // q_proto_power_smooth+q_shift-1 + q_shift = L_norm_arr( proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ); + q_shift = s_min( q_shift, L_norm_arr( proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + num_freq_bands, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ) ); + scale_sig32( proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( q_shift, 1 ) ); // q_proto_power_smooth+q_shift-1 + scale_sig32( proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + num_freq_bands, s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( q_shift, 1 ) ); // q_proto_power_smooth+q_shift-1 } - *q_proto_power_smooth = add( *q_proto_power_smooth, sub( q_shift, 1 ) ); + q_proto_power_smooth[1] = add( q_proto_power_smooth[1], sub( q_shift, 1 ) ); move16(); IF( isloudspeaker ) { p_proto_buffer_fx = proto_direct_buffer_f_fx + i_mult( i_mult( i_mult( slot_index, 2 ), num_freq_bands ), 3 ); // q_proto_direct_buffer_f - q_temp = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); - move16(); + q_temp[0] = sub( add( add( q_cldfb, min_q_shift[0] ), add( q_cldfb, min_q_shift[0] ) ), 31 ); + q_temp[1] = sub( add( add( q_cldfb, min_q_shift[1] ), add( q_cldfb, min_q_shift[1] ) ), 31 ); FOR( l = 0; l < num_freq_bands; l++ ) { - re1 = L_shl( RealBuffer_fx[0][0][l], min_q_shift ); // q_cldfb+min_q_shift - im1 = L_shl( ImagBuffer_fx[0][0][l], min_q_shift ); // q_cldfb+min_q_shift - re2 = L_shl( RealBuffer_fx[1][0][l], min_q_shift ); // q_cldfb+min_q_shift - im2 = L_shl( ImagBuffer_fx[1][0][l], min_q_shift ); // q_cldfb+min_q_shift + Word16 qidx = s_min( 1, s_max( 0, sub( l, CLDFB_NO_CHANNELS_HALF - 1 ) ) ); + + re1 = L_shl( RealBuffer_fx[0][0][l], min_q_shift[qidx] ); // q_cldfb+min_q_shift + im1 = L_shl( ImagBuffer_fx[0][0][l], min_q_shift[qidx] ); // q_cldfb+min_q_shift + re2 = L_shl( RealBuffer_fx[1][0][l], min_q_shift[qidx] ); // q_cldfb+min_q_shift + im2 = L_shl( ImagBuffer_fx[1][0][l], min_q_shift[qidx] ); // q_cldfb+min_q_shift Real_aux_fx = L_add( re1, re2 ); // q_cldfb+min_q_shift Imag_aux_fx = L_add( im1, im2 ); // q_cldfb+min_q_shift @@ -1779,14 +1812,14 @@ void protoSignalComputation2_fx( temp = Madd_32_32( Mpy_32_32( Real_aux_fx, Real_aux_fx ), Imag_aux_fx, Imag_aux_fx ); // 2*(q_cldfb+min_q_shift)-31 - IF( LT_16( q_temp, *q_proto_power_smooth ) ) + IF( LT_16( q_temp[qidx], q_proto_power_smooth[qidx] ) ) { - proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( *q_proto_power_smooth, q_temp ) ), temp ); // q_temp + proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( q_proto_power_smooth[qidx], q_temp[qidx] ) ), temp ); // q_temp move32(); } ELSE { - proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( temp, sub( q_temp, *q_proto_power_smooth ) ) ); // q_proto_power_smooth + proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( temp, sub( q_temp[qidx], q_proto_power_smooth[qidx] ) ) ); // q_proto_power_smooth move32(); } @@ -1797,14 +1830,14 @@ void protoSignalComputation2_fx( temp = Madd_32_32( Mpy_32_32( re1, re1 ), im1, im1 ); // 2*(q_cldfb+min_q_shift)-31 - IF( LT_16( q_temp, *q_proto_power_smooth ) ) + IF( LT_16( q_temp[qidx], q_proto_power_smooth[qidx] ) ) { - proto_power_smooth_fx[l + num_freq_bands] = L_add( L_shr( proto_power_smooth_fx[l + num_freq_bands], sub( *q_proto_power_smooth, q_temp ) ), temp ); // q_temp + proto_power_smooth_fx[l + num_freq_bands] = L_add( L_shr( proto_power_smooth_fx[l + num_freq_bands], sub( q_proto_power_smooth[qidx], q_temp[qidx] ) ), temp ); // q_temp move32(); } ELSE { - proto_power_smooth_fx[l + num_freq_bands] = L_add( proto_power_smooth_fx[l + num_freq_bands], L_shr( temp, sub( q_temp, *q_proto_power_smooth ) ) ); // q_proto_power_smooth + proto_power_smooth_fx[l + num_freq_bands] = L_add( proto_power_smooth_fx[l + num_freq_bands], L_shr( temp, sub( q_temp[qidx], q_proto_power_smooth[qidx] ) ) ); // q_proto_power_smooth move32(); } @@ -1814,14 +1847,14 @@ void protoSignalComputation2_fx( move32(); temp = Madd_32_32( Mpy_32_32( re2, re2 ), im2, im2 ); // 2*(q_cldfb+min_q_shift)-31 - IF( LT_16( q_temp, *q_proto_power_smooth ) ) + IF( LT_16( q_temp[qidx], q_proto_power_smooth[qidx] ) ) { - proto_power_smooth_fx[l + ( 2 * num_freq_bands )] = L_add( L_shr( proto_power_smooth_fx[l + ( 2 * num_freq_bands )], sub( *q_proto_power_smooth, q_temp ) ), temp ); // q_temp + proto_power_smooth_fx[l + ( 2 * num_freq_bands )] = L_add( L_shr( proto_power_smooth_fx[l + ( 2 * num_freq_bands )], sub( q_proto_power_smooth[qidx], q_temp[qidx] ) ), temp ); // q_temp move32(); } ELSE { - proto_power_smooth_fx[l + ( 2 * num_freq_bands )] = L_add( proto_power_smooth_fx[l + ( 2 * num_freq_bands )], L_shr( temp, sub( q_temp, *q_proto_power_smooth ) ) ); // q_proto_power_smooth + proto_power_smooth_fx[l + ( 2 * num_freq_bands )] = L_add( proto_power_smooth_fx[l + ( 2 * num_freq_bands )], L_shr( temp, sub( q_temp[qidx], q_proto_power_smooth[qidx] ) ) ); // q_proto_power_smooth move32(); } @@ -1892,19 +1925,24 @@ void protoSignalComputation2_fx( } } - min_q_shift = sub( min_q_shift, idiv1616( find_guarded_bits_fx( num_freq_bands ), 2 ) ); - - q_temp = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); - q_temp2 = sub( add( add( q_cldfb, temp_q_shift ), add( q_cldfb, temp_q_shift ) ), 31 ); + Word16 total_shift[2]; + /* total_shift shift required to get common Q of sum power values */ + total_shift[0] = shl( s_max( 0, sub( min_q_shift[0], min_q_shift[1] ) ), 1 ); + total_shift[1] = shl( s_max( 0, sub( min_q_shift[1], min_q_shift[0] ) ), 1 ); + min_q_shift[0] = sub( min_q_shift[0], idiv1616( find_guarded_bits_fx( num_freq_bands ), 2 ) ); + min_q_shift[1] = sub( min_q_shift[1], idiv1616( find_guarded_bits_fx( num_freq_bands ), 2 ) ); + q_temp[0] = sub( add( add( q_cldfb, min_q_shift[0] ), add( q_cldfb, min_q_shift[0] ) ), 31 ); + q_temp[1] = sub( add( add( q_cldfb, min_q_shift[1] ), add( q_cldfb, min_q_shift[1] ) ), 31 ); head_room = 63; move16(); FOR( l = 0; l < num_freq_bands; l++ ) { - re1 = L_shl( RealBuffer_fx[0][0][l], min_q_shift ); // q_cldfb+min_q_shift - im1 = L_shl( ImagBuffer_fx[0][0][l], min_q_shift ); // q_cldfb+min_q_shift - re2 = L_shl( RealBuffer_fx[1][0][l], min_q_shift ); // q_cldfb+min_q_shift - im2 = L_shl( ImagBuffer_fx[1][0][l], min_q_shift ); // q_cldfb+min_q_shift + Word16 qidx = s_min( 1, s_max( 0, sub( l, CLDFB_NO_CHANNELS_HALF - 1 ) ) ); + re1 = L_shl( RealBuffer_fx[0][0][l], min_q_shift[qidx] ); // q_cldfb+min_q_shift + im1 = L_shl( ImagBuffer_fx[0][0][l], min_q_shift[qidx] ); // q_cldfb+min_q_shift + re2 = L_shl( RealBuffer_fx[1][0][l], min_q_shift[qidx] ); // q_cldfb+min_q_shift + im2 = L_shl( ImagBuffer_fx[1][0][l], min_q_shift[qidx] ); // q_cldfb+min_q_shift W_tmp1 = W_add( W_mult0_32_32( re1, re1 ), W_mult0_32_32( im1, im1 ) ); W_tmp2 = W_add( W_mult0_32_32( re2, re2 ), W_mult0_32_32( im2, im2 ) ); @@ -1912,14 +1950,22 @@ void protoSignalComputation2_fx( head_room = s_min( head_room, W_norm( W_add( W_tmp1, W_tmp2 ) ) ); } head_room = sub( head_room, find_guarded_bits_fx( num_freq_bands ) ); - q_Left_Right_power = add( shl( add( q_cldfb, min_q_shift ), 1 ), sub( head_room, 32 ) ); +#if ( MASA_SUM_FREQ_RANGE_BINS > CLDFB_NO_CHANNELS_HALF ) +#error MASA_SUM_FREQ_RANGE_BINS must be less than CLDFB_NO_CHANNELS_HALF +#endif + q_Left_Right_power = add( shl( add( q_cldfb, min_q_shift[0] ), 1 ), sub( head_room, 32 ) ); + Word16 exp_left_hi_power = 0, exp_right_hi_power = 0, exp_total_hi_power = 0, exp_temppp; + move16(); + move16(); + move16(); FOR( l = 0; l < num_freq_bands; l++ ) { - re1 = L_shl( RealBuffer_fx[0][0][l], min_q_shift ); // q_cldfb+min_q_shift - im1 = L_shl( ImagBuffer_fx[0][0][l], min_q_shift ); // q_cldfb+min_q_shift - re2 = L_shl( RealBuffer_fx[1][0][l], min_q_shift ); // q_cldfb+min_q_shift - im2 = L_shl( ImagBuffer_fx[1][0][l], min_q_shift ); // q_cldfb+min_q_shift + Word16 qidx = s_min( 1, s_max( 0, sub( l, CLDFB_NO_CHANNELS_HALF - 1 ) ) ); + re1 = L_shl( RealBuffer_fx[0][0][l], min_q_shift[qidx] ); // q_cldfb+min_q_shift + im1 = L_shl( ImagBuffer_fx[0][0][l], min_q_shift[qidx] ); // q_cldfb+min_q_shift + re2 = L_shl( RealBuffer_fx[1][0][l], min_q_shift[qidx] ); // q_cldfb+min_q_shift + im2 = L_shl( ImagBuffer_fx[1][0][l], min_q_shift[qidx] ); // q_cldfb+min_q_shift /* Compute sum signal */ Real_aux_fx = L_add( re1, re2 ); // q_cldfb+min_q_shift @@ -1929,6 +1975,7 @@ void protoSignalComputation2_fx( // Left_power_fx = Madd_32_32( Mpy_32_32( re1, re1 ), im1, im1 ); W_tmp1 = W_add( W_mult0_32_32( re1, re1 ), W_mult0_32_32( im1, im1 ) ); // 2*(q_cldfb+min_q_shift) Left_power_fx = W_extract_h( W_shl( W_tmp1, head_room ) ); // q_Left_Right_power + // Right_power_fx = Madd_32_32( Mpy_32_32( re2, re2 ), im2, im2 ); W_tmp2 = W_add( W_mult0_32_32( re2, re2 ), W_mult0_32_32( im2, im2 ) ); // 2*(q_cldfb+min_q_shift) Right_power_fx = W_extract_h( W_shl( W_tmp2, head_room ) ); // q_Left_Right_power @@ -1937,69 +1984,82 @@ void protoSignalComputation2_fx( reference_power_64fx[l] = W_add( W_tmp1, W_tmp2 ); // 2*(q_cldfb+min_q_shift) move64(); + Left_power_fx = L_shr( Left_power_fx, total_shift[qidx] ); + Right_power_fx = L_shr( Right_power_fx, total_shift[qidx] ); left_bb_power_fx = L_add( left_bb_power_fx, Left_power_fx ); // q_Left_Right_power right_bb_power_fx = L_add( right_bb_power_fx, Right_power_fx ); // q_Left_Right_power // total_bb_power_fx = L_add( total_bb_power_fx, reference_power_fx[l] ); - total_bb_power_fx = L_add( total_bb_power_fx, W_extract_h( W_shl( reference_power_64fx[l], head_room ) ) ); // q_Left_Right_power - + total_bb_power_fx = L_add( total_bb_power_fx, W_extract_h( W_shl( reference_power_64fx[l], sub( head_room, total_shift[qidx] ) ) ) ); // q_Left_Right_power IF( GT_16( l, MASA_HI_FREQ_START_BIN ) ) { - left_hi_power_fx = L_add( left_hi_power_fx, Left_power_fx ); // q_Left_Right_power - right_hi_power_fx = L_add( right_hi_power_fx, Right_power_fx ); // q_Left_Right_power - // total_hi_power_fx = L_add( total_hi_power_fx, reference_power_fx[l] ); - total_hi_power_fx = L_add( total_hi_power_fx, W_extract_h( W_shl( reference_power_64fx[l], head_room ) ) ); // q_Left_Right_power + W_tmp1 = W_add( W_mult0_32_32( RealBuffer_fx[0][0][l], RealBuffer_fx[0][0][l] ), W_mult0_32_32( ImagBuffer_fx[0][0][l], ImagBuffer_fx[0][0][l] ) ); + q_shift = W_norm( W_tmp1 ); + Left_power_fx = W_extract_h( W_shl( W_tmp1, q_shift ) ); + exp_temppp = sub( 31, sub( add( shl( q_cldfb, 1 ), q_shift ), 32 ) ); + + left_hi_power_fx = BASOP_Util_Add_Mant32Exp( left_hi_power_fx, exp_left_hi_power, Left_power_fx, exp_temppp, &exp_left_hi_power ); // exp:exp_left_hi_power + + W_tmp2 = W_add( W_mult0_32_32( RealBuffer_fx[1][0][l], RealBuffer_fx[1][0][l] ), W_mult0_32_32( ImagBuffer_fx[1][0][l], ImagBuffer_fx[1][0][l] ) ); + q_shift = W_norm( W_tmp2 ); + Right_power_fx = W_extract_h( W_shl( W_tmp2, q_shift ) ); + exp_temppp = sub( 31, sub( add( shl( q_cldfb, 1 ), q_shift ), 32 ) ); + + right_hi_power_fx = BASOP_Util_Add_Mant32Exp( right_hi_power_fx, exp_right_hi_power, Right_power_fx, exp_temppp, &exp_right_hi_power ); // exp:exp_right_hi_power + + W_tmp2 = W_add( W_tmp1, W_tmp2 ); + q_shift = W_norm( W_tmp2 ); + Total_power_fx = W_extract_h( W_shl( W_tmp2, q_shift ) ); + exp_temppp = sub( 31, sub( add( shl( q_cldfb, 1 ), q_shift ), 32 ) ); + + total_hi_power_fx = BASOP_Util_Add_Mant32Exp( total_hi_power_fx, exp_total_hi_power, Total_power_fx, exp_temppp, &exp_total_hi_power ); // exp:exp_total_hi_power } IF( LT_16( l, s_min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ) ) ) { - re_aux = L_shl( Real_aux_fx, sub( temp_q_shift, min_q_shift ) ); // q_cldfb+temp_q_shift - im_aux = L_shl( Imag_aux_fx, sub( temp_q_shift, min_q_shift ) ); // q_cldfb+temp_q_shift + re_aux = L_add( L_shr( RealBuffer_fx[0][0][l], 1 ), L_shr( RealBuffer_fx[1][0][l], 1 ) ); + im_aux = L_add( L_shr( ImagBuffer_fx[0][0][l], 1 ), L_shr( ImagBuffer_fx[1][0][l], 1 ) ); - sum_power_fx = Madd_32_32( Mpy_32_32( re_aux, re_aux ), im_aux, im_aux ); // 2*(q_cldfb+temp_q_shift)-31 - temp = Mpy_32_32( a_fx, sum_power_fx ); // 2*(q_cldfb+temp_q_shift)-31 + W_tmp3 = W_add( W_mult0_32_32( re_aux, re_aux ), W_mult0_32_32( im_aux, im_aux ) ); + q_shift = W_norm( W_tmp3 ); + sum_power_fx = W_extract_h( W_shl( W_tmp3, q_shift ) ); + exp_temppp = sub( 31, sub( add( shl( sub( q_cldfb, 1 ), 1 ), q_shift ), 32 ) ); - IF( LT_16( q_temp2, stereo_type_detect->q_sum_power ) ) - { - stereo_type_detect->sum_power_fx[l] = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->sum_power_fx[l] ), sub( stereo_type_detect->q_sum_power, q_temp2 ) ) ); // q_temp2 - move32(); - } - ELSE - { - stereo_type_detect->sum_power_fx[l] = L_add( L_shr( temp, sub( q_temp2, stereo_type_detect->q_sum_power ) ), Mpy_32_32( b_fx, stereo_type_detect->sum_power_fx[l] ) ); // stereo_type_detect->q_sum_power - move32(); - } + stereo_type_detect->sum_power_fx[l] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, sum_power_fx ), exp_temppp, Mpy_32_32( b_fx, stereo_type_detect->sum_power_fx[l] ), stereo_type_detect->exp_sum_power[l], &stereo_type_detect->exp_sum_power[l] ); + move32(); + W_tmp1 = W_add( W_mult0_32_32( RealBuffer_fx[0][0][l], RealBuffer_fx[0][0][l] ), W_mult0_32_32( ImagBuffer_fx[0][0][l], ImagBuffer_fx[0][0][l] ) ); + W_tmp2 = W_add( W_mult0_32_32( RealBuffer_fx[1][0][l], RealBuffer_fx[1][0][l] ), W_mult0_32_32( ImagBuffer_fx[1][0][l], ImagBuffer_fx[1][0][l] ) ); - temp = Mpy_32_32( a_fx, W_extract_l( W_shr( reference_power_64fx[l], 31 ) ) ); // 2*(q_cldfb+min_q_shift) -31 - IF( LT_16( q_temp, stereo_type_detect->q_total_power ) ) - { - stereo_type_detect->total_power_fx[l] = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ), sub( stereo_type_detect->q_total_power, q_temp ) ) ); // q_temp - move32(); - } - ELSE - { - stereo_type_detect->total_power_fx[l] = L_add( L_shr( temp, sub( q_temp, stereo_type_detect->q_total_power ) ), Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ) ); // stereo_type_detect->q_total_power - move32(); - } + W_tmp2 = W_add( W_tmp1, W_tmp2 ); + q_shift = W_norm( W_tmp2 ); + Total_power_fx = W_extract_h( W_shl( W_tmp2, q_shift ) ); + exp_temppp = sub( 31, sub( add( shl( q_cldfb, 1 ), q_shift ), 32 ) ); + + stereo_type_detect->total_power_fx[l] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, Total_power_fx ), exp_temppp, Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ), stereo_type_detect->exp_total_power[l], &stereo_type_detect->exp_total_power[l] ); + move32(); test(); IF( ( stereo_type_detect->sum_power_fx[l] == 0 ) && ( stereo_type_detect->total_power_fx[l] == 0 ) ) { sum_total_ratio_fx[l] = MAX_32; // q15 move32(); + exp_sum_total_ratio_fx[l] = 16; + move16(); } ELSE IF( stereo_type_detect->total_power_fx[l] == 0 ) { sum_total_ratio_fx[l] = MAX_32; // q15 move32(); + exp_sum_total_ratio_fx[l] = 16; + move16(); } ELSE { - sum_total_ratio_fx[l] = BASOP_Util_Divide3232_Scale( stereo_type_detect->sum_power_fx[l], stereo_type_detect->total_power_fx[l], &exp ); // 15-(exp+s_min( stereo_type_detect->q_total_power, q_temp )-s_min( stereo_type_detect->q_sum_power, q_temp2 )) - move32(); - q_sum_total_ratio = add( sub( 15, exp ), sub( s_min( stereo_type_detect->q_sum_power, q_temp2 ), s_min( stereo_type_detect->q_total_power, q_temp ) ) ); - sum_total_ratio_fx[l] = L_shl( sum_total_ratio_fx[l], sub( Q15, q_sum_total_ratio ) ); // q15 + sum_total_ratio_fx[l] = BASOP_Util_Divide3232_Scale_newton( stereo_type_detect->sum_power_fx[l], stereo_type_detect->total_power_fx[l], &exp ); // 15-(exp+s_min( stereo_type_detect->q_total_power, q_temp )-s_min( stereo_type_detect->q_sum_power, q_temp2 )) move32(); + exp_sum_total_ratio_fx[l] = add( exp, sub( stereo_type_detect->exp_sum_power[l], stereo_type_detect->exp_total_power[l] ) ); + move16(); } + q_sum_total_ratio = s_max( q_sum_total_ratio, exp_sum_total_ratio_fx[l] ); } IF( l == 0 ) @@ -2008,16 +2068,17 @@ void protoSignalComputation2_fx( ImagSubtract_fx = L_sub( im1, im2 ); // q_cldfb+min_q_shift temp = Madd_32_32( Mpy_32_32( RealSubtract_fx, RealSubtract_fx ), ImagSubtract_fx, ImagSubtract_fx ); // 2*(q_cldfb+min_q_shift)-31 - IF( LT_16( q_temp, stereo_type_detect->q_subtract_power_y ) ) + assert( qidx == 0 ); + IF( LT_16( q_temp[qidx], stereo_type_detect->q_subtract_power_y ) ) { - stereo_type_detect->subtract_power_y_fx = L_add( L_shr( stereo_type_detect->subtract_power_y_fx, sub( stereo_type_detect->q_subtract_power_y, q_temp ) ), temp ); // q_temp + stereo_type_detect->subtract_power_y_fx = L_add( L_shr( stereo_type_detect->subtract_power_y_fx, sub( stereo_type_detect->q_subtract_power_y, q_temp[qidx] ) ), temp ); // q_temp move32(); - stereo_type_detect->q_subtract_power_y = q_temp; + stereo_type_detect->q_subtract_power_y = q_temp[qidx]; move16(); } ELSE { - stereo_type_detect->subtract_power_y_fx = L_add( stereo_type_detect->subtract_power_y_fx, L_shr( temp, sub( q_temp, stereo_type_detect->q_subtract_power_y ) ) ); // stereo_type_detect->q_subtract_power_y + stereo_type_detect->subtract_power_y_fx = L_add( stereo_type_detect->subtract_power_y_fx, L_shr( temp, sub( q_temp[qidx], stereo_type_detect->q_subtract_power_y ) ) ); // stereo_type_detect->q_subtract_power_y move32(); } } @@ -2033,14 +2094,14 @@ void protoSignalComputation2_fx( Imag_aux_fx = Madd_32_16( Mpy_32_16_1( Imag_aux_fx, shr( interpolatorSpaced_fx, 1 ) ), Imag_aux_fx, interpolatorDmx_fx ); // q_cldfb+min_q_shift temp = Madd_32_32( Mpy_32_32( Real_aux_fx, Real_aux_fx ), Imag_aux_fx, Imag_aux_fx ); // 2*(q_cldfb+min_q_shift) -31 - IF( LT_16( q_temp, *q_proto_power_smooth ) ) + IF( LT_16( q_temp[qidx], q_proto_power_smooth[qidx] ) ) { - proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( *q_proto_power_smooth, q_temp ) ), temp ); // q_temp + proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( q_proto_power_smooth[qidx], q_temp[qidx] ) ), temp ); // q_temp move32(); } ELSE { - proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( temp, sub( q_temp, *q_proto_power_smooth ) ) ); // q_proto_power_smooth + proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( temp, sub( q_temp[qidx], q_proto_power_smooth[qidx] ) ) ); // q_proto_power_smooth move32(); } @@ -2055,14 +2116,14 @@ void protoSignalComputation2_fx( tempDmx_fx = Madd_32_32( Mpy_32_32( Real_aux_fx, Real_aux_fx ), Imag_aux_fx, Imag_aux_fx ); // 2*(q_cldfb+min_q_shift)-31 temp = Madd_32_16( Mpy_32_16_1( tempSpaced_fx, interpolatorSpaced_fx ), tempDmx_fx, interpolatorDmx_fx ); // 2*(q_cldfb+min_q_shift)-31 - IF( LT_16( q_temp, *q_proto_power_smooth ) ) + IF( LT_16( q_temp[qidx], q_proto_power_smooth[qidx] ) ) { - proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( *q_proto_power_smooth, q_temp ) ), temp ); // q_temp + proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( q_proto_power_smooth[qidx], q_temp[qidx] ) ), temp ); // q_temp move32(); } ELSE { - proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( temp, sub( q_temp, *q_proto_power_smooth ) ) ); // q_proto_power_smooth + proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( temp, sub( q_temp[qidx], q_proto_power_smooth[qidx] ) ) ); // q_proto_power_smooth move32(); } @@ -2079,14 +2140,14 @@ void protoSignalComputation2_fx( Real_aux_fx = L_shr( Real_aux_fx, 1 ); // q_cldfb+min_q_shift Imag_aux_fx = L_shr( Imag_aux_fx, 1 ); // q_cldfb+min_q_shift temp = Madd_32_32( Mpy_32_32( Real_aux_fx, Real_aux_fx ), Imag_aux_fx, Imag_aux_fx ); // 2*(q_cldfb+min_q_shift)-31 - IF( LT_16( q_temp, *q_proto_power_smooth ) ) + IF( LT_16( q_temp[qidx], q_proto_power_smooth[qidx] ) ) { - proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( *q_proto_power_smooth, q_temp ) ), temp ); // q_temp + proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( q_proto_power_smooth[qidx], q_temp[qidx] ) ), temp ); // q_temp move32(); } ELSE { - proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( temp, sub( q_temp, *q_proto_power_smooth ) ) ); // q_proto_power_smooth + proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( temp, sub( q_temp[qidx], q_proto_power_smooth[qidx] ) ) ); // q_proto_power_smooth move32(); } @@ -2098,14 +2159,14 @@ void protoSignalComputation2_fx( ELSE { temp = Madd_32_32( Mpy_32_32( re1, re1 ), im1, im1 ); // 2*(q_cldfb+min_q_shift)-31 - IF( LT_16( q_temp, *q_proto_power_smooth ) ) + IF( LT_16( q_temp[qidx], q_proto_power_smooth[qidx] ) ) { - proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( *q_proto_power_smooth, q_temp ) ), temp ); // q_temp + proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( q_proto_power_smooth[qidx], q_temp[qidx] ) ), temp ); // q_temp move32(); } ELSE { - proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( temp, sub( q_temp, *q_proto_power_smooth ) ) ); // q_proto_power_smooth + proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( temp, sub( q_temp[qidx], q_proto_power_smooth[qidx] ) ) ); // q_proto_power_smooth move32(); } @@ -2118,14 +2179,14 @@ void protoSignalComputation2_fx( ELSE { temp = Madd_32_32( Mpy_32_32( Real_aux_fx, Real_aux_fx ), Imag_aux_fx, Imag_aux_fx ); // 2*(q_cldfb+min_q_shift)-31 - IF( LT_16( q_temp, *q_proto_power_smooth ) ) + IF( LT_16( q_temp[qidx], q_proto_power_smooth[qidx] ) ) { - proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( *q_proto_power_smooth, q_temp ) ), temp ); // q_temp + proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( q_proto_power_smooth[qidx], q_temp[qidx] ) ), temp ); // q_temp move32(); } ELSE { - proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( temp, sub( q_temp, *q_proto_power_smooth ) ) ); // q_proto_power_smooth + proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( temp, sub( q_temp[qidx], q_proto_power_smooth[qidx] ) ) ); // q_proto_power_smooth move32(); } @@ -2161,14 +2222,14 @@ void protoSignalComputation2_fx( } temp = Madd_32_32( Mpy_32_32( p_proto_buffer_fx[2 * ( num_freq_bands + l )], p_proto_buffer_fx[2 * ( num_freq_bands + l )] ), p_proto_buffer_fx[2 * ( num_freq_bands + l ) + 1], p_proto_buffer_fx[2 * ( num_freq_bands + l ) + 1] ); // 2*(q_cldfb+min_q_shift)-31 - IF( LT_16( q_temp, *q_proto_power_smooth ) ) + IF( LT_16( q_temp[qidx], q_proto_power_smooth[qidx] ) ) { - proto_power_smooth_fx[l + num_freq_bands] = L_add( L_shr( proto_power_smooth_fx[l + num_freq_bands], sub( *q_proto_power_smooth, q_temp ) ), temp ); // q_temp + proto_power_smooth_fx[l + num_freq_bands] = L_add( L_shr( proto_power_smooth_fx[l + num_freq_bands], sub( q_proto_power_smooth[qidx], q_temp[qidx] ) ), temp ); // q_temp move32(); } ELSE { - proto_power_smooth_fx[l + num_freq_bands] = L_add( proto_power_smooth_fx[l + num_freq_bands], L_shr( temp, sub( q_temp, *q_proto_power_smooth ) ) ); // q_proto_power_smooth + proto_power_smooth_fx[l + num_freq_bands] = L_add( proto_power_smooth_fx[l + num_freq_bands], L_shr( temp, sub( q_temp[qidx], q_proto_power_smooth[qidx] ) ) ); // q_proto_power_smooth move32(); } } @@ -2191,14 +2252,14 @@ void protoSignalComputation2_fx( move32(); temp = Madd_32_32( Mpy_32_32( p_proto_buffer_fx[2 * ( num_freq_bands + l )], p_proto_buffer_fx[2 * ( num_freq_bands + l )] ), p_proto_buffer_fx[2 * ( num_freq_bands + l ) + 1], p_proto_buffer_fx[2 * ( num_freq_bands + l ) + 1] ); // 2*(q_cldfb+min_q_shift)-31 - IF( LT_16( q_temp, *q_proto_power_smooth ) ) + IF( LT_16( q_temp[qidx], q_proto_power_smooth[qidx] ) ) { - proto_power_smooth_fx[l + num_freq_bands] = L_add( L_shr( proto_power_smooth_fx[l + num_freq_bands], sub( *q_proto_power_smooth, q_temp ) ), temp ); // q_temp + proto_power_smooth_fx[l + num_freq_bands] = L_add( L_shr( proto_power_smooth_fx[l + num_freq_bands], sub( q_proto_power_smooth[qidx], q_temp[qidx] ) ), temp ); // q_temp move32(); } ELSE { - proto_power_smooth_fx[l + num_freq_bands] = L_add( proto_power_smooth_fx[l + num_freq_bands], L_shr( temp, sub( q_temp, *q_proto_power_smooth ) ) ); // q_proto_power_smooth + proto_power_smooth_fx[l + num_freq_bands] = L_add( proto_power_smooth_fx[l + num_freq_bands], L_shr( temp, sub( q_temp[qidx], q_proto_power_smooth[qidx] ) ) ); // q_proto_power_smooth move32(); } } @@ -2220,14 +2281,14 @@ void protoSignalComputation2_fx( move32(); temp = Madd_32_32( Mpy_32_32( p_proto_buffer_fx[2 * ( num_freq_bands + l )], p_proto_buffer_fx[2 * ( num_freq_bands + l )] ), p_proto_buffer_fx[2 * ( num_freq_bands + l ) + 1], p_proto_buffer_fx[2 * ( num_freq_bands + l ) + 1] ); // 2*(q_cldfb+min_q_shift)-31 - IF( LT_16( q_temp, *q_proto_power_smooth ) ) + IF( LT_16( q_temp[qidx], q_proto_power_smooth[qidx] ) ) { - proto_power_smooth_fx[l + num_freq_bands] = L_add( L_shr( proto_power_smooth_fx[l + num_freq_bands], sub( *q_proto_power_smooth, q_temp ) ), temp ); // q_temp + proto_power_smooth_fx[l + num_freq_bands] = L_add( L_shr( proto_power_smooth_fx[l + num_freq_bands], sub( q_proto_power_smooth[qidx], q_temp[qidx] ) ), temp ); // q_temp move32(); } ELSE { - proto_power_smooth_fx[l + num_freq_bands] = L_add( proto_power_smooth_fx[l + num_freq_bands], L_shr( temp, sub( q_temp, *q_proto_power_smooth ) ) ); // q_proto_power_smooth + proto_power_smooth_fx[l + num_freq_bands] = L_add( proto_power_smooth_fx[l + num_freq_bands], L_shr( temp, sub( q_temp[qidx], q_proto_power_smooth[qidx] ) ) ); // q_proto_power_smooth move32(); } } @@ -2247,13 +2308,6 @@ void protoSignalComputation2_fx( move32(); } - stereo_type_detect->q_sum_power = s_min( stereo_type_detect->q_sum_power, q_temp2 ); - move16(); - stereo_type_detect->q_total_power = s_min( stereo_type_detect->q_total_power, q_temp ); - move16(); - q_sum_total_ratio = Q15; - move16(); - IF( stereo_type_detect->interpolator > 0 ) { stereo_type_detect->interpolator++; @@ -2322,8 +2376,8 @@ void protoSignalComputation2_fx( q_lr_bb_power = stereo_type_detect->q_right_bb_power; move16(); } - q_lr_bb_power = sub( q_lr_bb_power, 1 ); /* = (lr_bb_power_fx * 2) */ - temp = BASOP_Util_Divide3232_Scale_cadence( lr_bb_power_fx, L_add( stereo_type_detect->total_bb_power_fx, EPSILON_FX ), &exp ); // Q(31-(exp+stereo_type_detect->q_total_bb_power-q_lr_bb_power)) + q_lr_bb_power = sub( q_lr_bb_power, 1 ); /* = (lr_bb_power_fx * 2) */ + temp = BASOP_Util_Divide3232_Scale_newton( lr_bb_power_fx, L_add( stereo_type_detect->total_bb_power_fx, EPSILON_FX ), &exp ); // Q(31-(exp+stereo_type_detect->q_total_bb_power-q_lr_bb_power)) exp = sub( 31, add( sub( 31, exp ), sub( q_lr_bb_power, stereo_type_detect->q_total_bb_power ) ) ); temp = BASOP_Util_Log2( temp ); // q25 IF( NE_32( temp, MIN_32 ) ) @@ -2333,15 +2387,16 @@ void protoSignalComputation2_fx( // 20480 = 10 in Q11 lr_total_bb_ratio_fx = Mpy_32_16_1( temp, 20480 ); // Q21 - stereo_type_detect->left_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, left_hi_power_fx ), sub( 31, q_temp ), Mpy_32_32( b2_fx, stereo_type_detect->left_hi_power_fx ), sub( 31, stereo_type_detect->q_left_hi_power ), &stereo_type_detect->q_left_hi_power ); + stereo_type_detect->left_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, left_hi_power_fx ), exp_left_hi_power, Mpy_32_32( b2_fx, stereo_type_detect->left_hi_power_fx ), sub( 31, stereo_type_detect->q_left_hi_power ), &stereo_type_detect->q_left_hi_power ); move32(); stereo_type_detect->q_left_hi_power = sub( 31, stereo_type_detect->q_left_hi_power ); move16(); - stereo_type_detect->right_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, right_hi_power_fx ), sub( 31, q_temp ), Mpy_32_32( b2_fx, stereo_type_detect->right_hi_power_fx ), sub( 31, stereo_type_detect->q_right_hi_power ), &stereo_type_detect->q_right_hi_power ); + + stereo_type_detect->right_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, right_hi_power_fx ), exp_right_hi_power, Mpy_32_32( b2_fx, stereo_type_detect->right_hi_power_fx ), sub( 31, stereo_type_detect->q_right_hi_power ), &stereo_type_detect->q_right_hi_power ); move32(); stereo_type_detect->q_right_hi_power = sub( 31, stereo_type_detect->q_right_hi_power ); move16(); - stereo_type_detect->total_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, total_hi_power_fx ), sub( 31, q_temp ), Mpy_32_32( b2_fx, stereo_type_detect->total_hi_power_fx ), sub( 31, stereo_type_detect->q_total_hi_power ), &stereo_type_detect->q_total_hi_power ); + stereo_type_detect->total_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, total_hi_power_fx ), exp_total_hi_power, Mpy_32_32( b2_fx, stereo_type_detect->total_hi_power_fx ), sub( 31, stereo_type_detect->q_total_hi_power ), &stereo_type_detect->q_total_hi_power ); move32(); stereo_type_detect->q_total_hi_power = sub( 31, stereo_type_detect->q_total_hi_power ); move16(); @@ -2358,8 +2413,8 @@ void protoSignalComputation2_fx( move32(); q_lr_hi_power = stereo_type_detect->q_right_hi_power; } - q_lr_hi_power = sub( q_lr_hi_power, 1 ); /* = (q_lr_hi_power * 2) */ - temp = BASOP_Util_Divide3232_Scale_cadence( lr_hi_power_fx, L_add( stereo_type_detect->total_hi_power_fx, EPSILON_FX ), &exp ); // Q=31-(exp+ stereo_type_detect->q_total_hi_power-q_lr_hi_power) + q_lr_hi_power = sub( q_lr_hi_power, 1 ); /* = (q_lr_hi_power * 2) */ + temp = BASOP_Util_Divide3232_Scale_newton( lr_hi_power_fx, L_add( stereo_type_detect->total_hi_power_fx, EPSILON_FX ), &exp ); // Q=31-(exp+ stereo_type_detect->q_total_hi_power-q_lr_hi_power) exp = sub( 31, add( sub( 31, exp ), sub( q_lr_hi_power, stereo_type_detect->q_total_hi_power ) ) ); temp = BASOP_Util_Log2( temp ); // q25 IF( NE_32( temp, MIN_32 ) ) @@ -2369,8 +2424,15 @@ void protoSignalComputation2_fx( // 20480 = 10 in Q11 lr_total_hi_ratio_fx = Mpy_32_16_1( temp, 20480 ); // Q21 + FOR( Word16 i = 0; i < s_min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ); i++ ) + { + sum_total_ratio_fx[i] = L_shl( sum_total_ratio_fx[i], sub( exp_sum_total_ratio_fx[i], q_sum_total_ratio ) ); + move32(); + } + minimum_l( sum_total_ratio_fx, s_min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ), &min_sum_total_ratio_fx ); // q_sum_total_ratio - exp = sub( 31, q_sum_total_ratio ); + exp = q_sum_total_ratio; + move16(); temp = BASOP_Util_Log2( min_sum_total_ratio_fx ); // q25 IF( NE_32( temp, MIN_32 ) ) { @@ -2392,14 +2454,16 @@ void protoSignalComputation2_fx( { p_proto_buffer_fx = proto_direct_buffer_f_fx + ( slot_index * num_freq_bands * 4 ); // q_proto_direct_buffer_f - q_temp = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); + q_temp[0] = sub( add( add( q_cldfb, min_q_shift[0] ), add( q_cldfb, min_q_shift[0] ) ), 31 ); + q_temp[1] = sub( add( add( q_cldfb, min_q_shift[1] ), add( q_cldfb, min_q_shift[1] ) ), 31 ); FOR( l = 0; l < num_freq_bands; l++ ) { - re1 = L_shl( RealBuffer_fx[0][0][l], min_q_shift ); // q_cldfb+ min_q_shift - re2 = L_shl( RealBuffer_fx[1][0][l], min_q_shift ); // q_cldfb+ min_q_shift - im1 = L_shl( ImagBuffer_fx[0][0][l], min_q_shift ); // q_cldfb+ min_q_shift - im2 = L_shl( ImagBuffer_fx[1][0][l], min_q_shift ); // q_cldfb+ min_q_shift + Word16 qidx = s_min( 1, s_max( 0, sub( l, CLDFB_NO_CHANNELS_HALF - 1 ) ) ); + re1 = L_shl( RealBuffer_fx[0][0][l], min_q_shift[qidx] ); // q_cldfb+ min_q_shift + re2 = L_shl( RealBuffer_fx[1][0][l], min_q_shift[qidx] ); // q_cldfb+ min_q_shift + im1 = L_shl( ImagBuffer_fx[0][0][l], min_q_shift[qidx] ); // q_cldfb+ min_q_shift + im2 = L_shl( ImagBuffer_fx[1][0][l], min_q_shift[qidx] ); // q_cldfb+ min_q_shift Real_aux_fx = L_add( re1, re2 ); // q_cldfb+ min_q_shift Imag_aux_fx = L_add( im1, im2 ); // q_cldfb+ min_q_shift @@ -2408,14 +2472,14 @@ void protoSignalComputation2_fx( reference_power_64fx[l] = W_add( W_mult0_32_32( Real_aux_fx, Real_aux_fx ), W_mult0_32_32( Imag_aux_fx, Imag_aux_fx ) ); // q_temp move64(); - IF( LT_16( q_temp, *q_proto_power_smooth ) ) + IF( LT_16( q_temp[qidx], q_proto_power_smooth[qidx] ) ) { - proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( *q_proto_power_smooth, q_temp ) ), W_extract_l( W_shr( reference_power_64fx[l], 31 ) ) ); // q_temp + proto_power_smooth_fx[l] = L_add( L_shr( proto_power_smooth_fx[l], sub( q_proto_power_smooth[qidx], q_temp[qidx] ) ), W_extract_l( W_shr( reference_power_64fx[l], 31 ) ) ); // q_temp move32(); } ELSE { - proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( W_extract_l( W_shr( reference_power_64fx[l], 31 ) ), sub( q_temp, *q_proto_power_smooth ) ) ); // q_proto_power_smooth + proto_power_smooth_fx[l] = L_add( proto_power_smooth_fx[l], L_shr( W_extract_l( W_shr( reference_power_64fx[l], 31 ) ), sub( q_temp[qidx], q_proto_power_smooth[qidx] ) ) ); // q_proto_power_smooth move32(); } @@ -2430,14 +2494,14 @@ void protoSignalComputation2_fx( move32(); temp = Madd_32_32( Mpy_32_32( p_proto_buffer_fx[2 * ( num_freq_bands + l )], p_proto_buffer_fx[2 * ( num_freq_bands + l )] ), p_proto_buffer_fx[2 * ( num_freq_bands + l ) + 1], p_proto_buffer_fx[2 * ( num_freq_bands + l ) + 1] ); // q_temp - IF( LT_16( q_temp, *q_proto_power_smooth ) ) + IF( LT_16( q_temp[qidx], q_proto_power_smooth[qidx] ) ) { - proto_power_smooth_fx[l + num_freq_bands] = L_add( L_shr( proto_power_smooth_fx[l + num_freq_bands], sub( *q_proto_power_smooth, q_temp ) ), temp ); // q_temp + proto_power_smooth_fx[l + num_freq_bands] = L_add( L_shr( proto_power_smooth_fx[l + num_freq_bands], sub( q_proto_power_smooth[qidx], q_temp[qidx] ) ), temp ); // q_temp move32(); } ELSE { - proto_power_smooth_fx[l + num_freq_bands] = L_add( proto_power_smooth_fx[l + num_freq_bands], L_shr( temp, sub( q_temp, *q_proto_power_smooth ) ) ); // q_proto_power_smooth + proto_power_smooth_fx[l + num_freq_bands] = L_add( proto_power_smooth_fx[l + num_freq_bands], L_shr( temp, sub( q_temp[qidx], q_proto_power_smooth[qidx] ) ) ); // q_proto_power_smooth move32(); } @@ -2456,29 +2520,82 @@ void protoSignalComputation2_fx( move32(); } } - q_reference_power_64fx = shl( add( q_cldfb, min_q_shift ), 1 ); + q_reference_power_64fx = shl( add( q_cldfb, min_q_shift[0] ), 1 ); + Word16 norm_shift = 63; move16(); - FOR( l = 0; l < num_freq_bands; l++ ) + FOR( l = 0; l < s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ); l++ ) { IF( reference_power_64fx[l] ) { norm_shift = s_min( norm_shift, W_norm( reference_power_64fx[l] ) ); } } - FOR( l = 0; l < num_freq_bands; l++ ) + FOR( l = 0; l < s_min( num_freq_bands, CLDFB_NO_CHANNELS_HALF ); l++ ) { reference_power_fx[l] = W_extract_h( W_shl( reference_power_64fx[l], norm_shift ) ); // q_reference_power_64fx+norm_shift-32 move32(); } - *q_reference_power = sub( add( q_reference_power_64fx, norm_shift ), 32 ); + q_reference_power[0] = sub( add( q_reference_power_64fx, norm_shift ), 32 ); move16(); - *q_proto_frame_f = add( q_cldfb, min_q_shift ); + q_reference_power_64fx = shl( add( q_cldfb, min_q_shift[1] ), 1 ); + norm_shift = 63; + move16(); + FOR( l = CLDFB_NO_CHANNELS_HALF; l < num_freq_bands; l++ ) + { + IF( reference_power_64fx[l] ) + { + norm_shift = s_min( norm_shift, W_norm( reference_power_64fx[l] ) ); + } + } + FOR( l = CLDFB_NO_CHANNELS_HALF; l < num_freq_bands; l++ ) + { + reference_power_fx[l] = W_extract_h( W_shl( reference_power_64fx[l], norm_shift ) ); // q_reference_power_64fx+norm_shift-32 + move32(); + } + q_reference_power[1] = sub( add( q_reference_power_64fx, norm_shift ), 32 ); move16(); - *q_proto_direct_buffer_f = add( q_cldfb, min_q_shift ); + + IF( GT_16( min_q_shift[0], min_q_shift[1] ) ) + { + FOR( l = 0; l < i_mult( num_proto, num_freq_bands ); l += num_freq_bands ) + { + Scale_sig32( proto_frame_f_fx + shl( l, 1 ), shl( s_min( CLDFB_NO_CHANNELS_HALF, num_freq_bands ), 1 ), sub( min_q_shift[1], min_q_shift[0] ) ); + } + *q_proto_frame_f = add( q_cldfb, min_q_shift[1] ); + move16(); + } + ELSE + { + FOR( l = 0; l < i_mult( num_proto, num_freq_bands ); l += num_freq_bands ) + { + Scale_sig32( proto_frame_f_fx + shl( add( l, CLDFB_NO_CHANNELS_HALF ), 1 ), shl( s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), 1 ), sub( min_q_shift[0], min_q_shift[1] ) ); + } + *q_proto_frame_f = add( q_cldfb, min_q_shift[0] ); + move16(); + } + IF( GT_16( min_q_shift[0], min_q_shift[1] ) ) + { + FOR( l = 0; l < i_mult( num_proto, num_freq_bands ); l += num_freq_bands ) + { + Scale_sig32( p_proto_buffer_fx + shl( l, 1 ), shl( s_min( CLDFB_NO_CHANNELS_HALF, num_freq_bands ), 1 ), sub( min_q_shift[1], min_q_shift[0] ) ); + } + *q_proto_direct_buffer_f = add( q_cldfb, min_q_shift[1] ); + move16(); + } + ELSE + { + FOR( l = 0; l < i_mult( num_proto, num_freq_bands ); l += num_freq_bands ) + { + Scale_sig32( p_proto_buffer_fx + shl( add( l, CLDFB_NO_CHANNELS_HALF ), 1 ), shl( s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), 1 ), sub( min_q_shift[0], min_q_shift[1] ) ); + } + *q_proto_direct_buffer_f = add( q_cldfb, min_q_shift[0] ); + move16(); + } + q_proto_power_smooth[0] = s_min( q_proto_power_smooth[0], q_temp[0] ); + q_proto_power_smooth[1] = s_min( q_proto_power_smooth[1], q_temp[1] ); move16(); - *q_proto_power_smooth = s_min( *q_proto_power_smooth, q_temp ); move16(); return; @@ -2517,16 +2634,41 @@ void protoSignalComputation4_fx( Word16 min_q_shift, q_shift; Word32 re, im; Word16 proto_power_smooth_fx_q, sq_tmp_q; + Word64 ref_pow64[CLDFB_NO_CHANNELS_MAX], re64; + Word16 sf1, sf2; - min_q_shift = Q31; - move16(); - q_shift = Q31; - move16(); - sq_tmp_q = 0; - move16(); + FOR( l = 0; l < num_freq_bands; l++ ) + { + re64 = W_mult_32_32( RealBuffer_fx[0][0][l], RealBuffer_fx[0][0][l] ); + re64 = W_mac_32_32( re64, ImagBuffer_fx[0][0][l], ImagBuffer_fx[0][0][l] ); + ref_pow64[l] = W_shr( re64, 1 ); // 2*q_cldfb +1 + move64(); + } + FOR( k = 1; k < 4; k++ ) + { + FOR( l = 0; l < num_freq_bands; l++ ) + { + re64 = W_mult_32_32( RealBuffer_fx[k][0][l], RealBuffer_fx[k][0][l] ); + re64 = W_mac_32_32( re64, ImagBuffer_fx[k][0][l], ImagBuffer_fx[k][0][l] ); + ref_pow64[l] = W_add( ref_pow64[l], W_shr( re64, 1 ) ); // 2*q_cldfb +1 + move64(); + } + } + sf1 = W_norm_arr( ref_pow64, s_min( CLDFB_NO_CHANNELS_HALF, num_freq_bands ) ); + FOR( l = 0; l < s_min( CLDFB_NO_CHANNELS_HALF, num_freq_bands ); l++ ) + { + reference_power_fx[l] = W_extract_h( W_shl( ref_pow64[l], sf1 ) ); + } + reference_power_q[0] = sub( add( shl( q_cldfb, 1 ), sf1 ), 31 ); - set_zero_fx( reference_power_fx, num_freq_bands ); + sf2 = W_norm_arr( &ref_pow64[CLDFB_NO_CHANNELS_HALF], s_max( 0, sub( num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ); + FOR( l = CLDFB_NO_CHANNELS_HALF; l < num_freq_bands; l++ ) + { + reference_power_fx[l] = W_extract_h( W_shl( ref_pow64[l], sf2 ) ); + } + reference_power_q[1] = sub( add( shl( q_cldfb, 1 ), sf2 ), 31 ); + min_q_shift = Q31; /* calculate the shift possible for both RealBuffer_fx and ImagBuffer_fx buffers*/ FOR( k = 0; k < s_max( 4, nchan_transport ); k++ ) { @@ -2535,27 +2677,7 @@ void protoSignalComputation4_fx( q_shift = L_norm_arr( ImagBuffer_fx[k][0], num_freq_bands ); min_q_shift = s_min( q_shift, min_q_shift ); } - q_shift = min_q_shift; - min_q_shift = sub( min_q_shift, find_guarded_bits_fx( i_mult( 2, 4 ) ) ); - - FOR( k = 0; k < 4; k++ ) - { - FOR( l = 0; l < num_freq_bands; l++ ) - { - re = L_shl( RealBuffer_fx[k][0][l], min_q_shift ); // q_cldfb+min_q_shift - im = L_shl( ImagBuffer_fx[k][0][l], min_q_shift ); // q_cldfb+min_q_shift - - sq_tmp_fx = Madd_32_32( Mpy_32_32( re, re ), im, im ); // 2*(q_cldfb+min_q_shift)-31 - - reference_power_fx[l] = Madd_32_16( reference_power_fx[l], sq_tmp_fx, 16384 /*0.5 in Q15*/ ); // 2*(q_cldfb+min_q_shift)-31 - move32(); - } - } - sq_tmp_q = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); - *reference_power_q = sub( add( sq_tmp_q, Q15 ), 15 ); - move16(); - - min_q_shift = sub( q_shift, find_guarded_bits_fx( 2 ) ); + min_q_shift = sub( min_q_shift, find_guarded_bits_fx( 2 ) ); /*For decorrelated diffuseness*/ FOR( l = 0; l < num_outputs_diff; l++ ) @@ -2613,23 +2735,10 @@ void protoSignalComputation4_fx( sq_tmp_fx = Madd_32_32( Mpy_32_32( proto_frame_f_fx[idx], proto_frame_f_fx[idx] ), proto_frame_f_fx[idx + 1], proto_frame_f_fx[idx + 1] ); // 2*(proto_frame_f_q)-31 sq_tmp_q = sub( add( *proto_frame_f_q, *proto_frame_f_q ), 31 ); + proto_power_smooth_fx_q = s_min( *proto_power_smooth_q, sq_tmp_q ); - IF( LT_16( *proto_power_smooth_q, sq_tmp_q ) ) - { - proto_power_smooth_fx[l + ( k * num_freq_bands )] = L_add( proto_power_smooth_fx[l + ( k * num_freq_bands )], L_shr( sq_tmp_fx, sub( sq_tmp_q, *proto_power_smooth_q ) ) ); // proto_power_smooth_q - move32(); - proto_power_smooth_fx_q = *proto_power_smooth_q; - move16(); - } - ELSE - { - proto_power_smooth_fx[l + ( k * num_freq_bands )] = L_add( L_shr( proto_power_smooth_fx[l + ( k * num_freq_bands )], sub( *proto_power_smooth_q, sq_tmp_q ) ), sq_tmp_fx ); // sq_tmp_q - move32(); - proto_power_smooth_fx_q = sq_tmp_q; - move16(); - } - - p_proto_buffer_fx[idx] = proto_frame_f_fx[idx]; // proto_frame_f_q + proto_power_smooth_fx[l + ( k * num_freq_bands )] = L_add( L_shr( proto_power_smooth_fx[l + ( k * num_freq_bands )], sub( *proto_power_smooth_q, proto_power_smooth_fx_q ) ), L_shr( sq_tmp_fx, sub( sq_tmp_q, proto_power_smooth_fx_q ) ) ); // proto_power_smooth_fx_q + p_proto_buffer_fx[idx] = proto_frame_f_fx[idx]; // proto_frame_f_q move32(); p_proto_buffer_fx[idx + 1] = proto_frame_f_fx[idx + 1]; // proto_frame_f_q move32(); @@ -2638,7 +2747,9 @@ void protoSignalComputation4_fx( *proto_direct_buffer_f_q = *proto_frame_f_q; move16(); - *proto_power_smooth_q = proto_power_smooth_fx_q; + proto_power_smooth_q[0] = proto_power_smooth_fx_q; + proto_power_smooth_q[1] = proto_power_smooth_fx_q; + move16(); move16(); return; @@ -2775,13 +2886,8 @@ void ivas_dirac_dec_compute_diffuse_proto_fx( Word16 new_diff_e = s_max( diff_e, old_diff_e ); Scale_sig32( h_dirac_output_synthesis_state->proto_diffuse_buffer_f_fx, diffuse_start, sub( old_diff_e, new_diff_e ) ); // 31-new_diff_e -#ifdef MSAN_FIX Scale_sig32( h_dirac_output_synthesis_state->proto_diffuse_buffer_f_fx + diffuse_start, i_mult( shl( num_freq_bands_diff, 1 ), hDirACRend->hOutSetup.nchan_out_woLFE ), sub( diff_e, new_diff_e ) ); // 31-new_diff_e -#else - Scale_sig32( h_dirac_output_synthesis_state->proto_diffuse_buffer_f_fx + diffuse_start, - sub( h_dirac_output_synthesis_state->proto_diffuse_buffer_f_len, diffuse_start ), sub( diff_e, new_diff_e ) ); -#endif h_dirac_output_synthesis_state->proto_diffuse_buffer_f_q = sub( 31, new_diff_e ); move16(); @@ -2855,7 +2961,7 @@ void computeDirectionAngles_fx( } ELSE { - temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, intensityNorm, &exp ); // Q=31-(exp-(30-q_intensityNorm)) + temp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, intensityNorm, &exp ); // Q=31-(exp-(30-q_intensityNorm)) exp = sub( exp, sub( Q30, q_intensityNorm ) ); temp = Sqrt32( temp, &exp ); // Q=31-exp q_temp = sub( 31, exp ); @@ -2957,10 +3063,8 @@ void ivas_masa_init_stereotype_detection_fx( set32_fx( stereo_type_detect->sum_power_fx, 0, MASA_SUM_FREQ_RANGE_BINS ); set32_fx( stereo_type_detect->total_power_fx, 0, MASA_SUM_FREQ_RANGE_BINS ); - stereo_type_detect->q_sum_power = Q31; - move16(); - stereo_type_detect->q_total_power = Q31; - move16(); + set16_fx( stereo_type_detect->exp_sum_power, 0, MASA_SUM_FREQ_RANGE_BINS ); + set16_fx( stereo_type_detect->exp_total_power, 0, MASA_SUM_FREQ_RANGE_BINS ); stereo_type_detect->subtract_power_y_fx = 0; move32(); @@ -2972,10 +3076,8 @@ void ivas_masa_init_stereotype_detection_fx( move16(); stereo_type_detect->target_power_y_smooth_fx = 0; move32(); -#ifdef MSAN_FIX stereo_type_detect->q_target_power_y_smooth = 31; move16(); -#endif stereo_type_detect->lr_total_bb_ratio_db_fx = 0; move32(); @@ -3369,7 +3471,7 @@ void rotateAziEle_DirAC_fx( Word32 dv_0_fx, dv_1_fx, dv_2_fx; Word32 dv_r_0_fx, dv_r_1_fx, dv_r_2_fx, tmp, w_fx; Word16 exp, temp; - Word32 *ptr_sin, *ptr_cos; + const Word32 *ptr_sin, *ptr_cos; ptr_sin = &sine_table_Q31[180]; // sin[x] = sine_table_Q31[180 + x] q31 ptr_cos = cosine_table_Q31; // q31 @@ -3467,7 +3569,7 @@ void rotateAziEle_DirAC_fx( /* A reduced rewrite of the corresponding decoder side function */ static void ivas_masa_ext_dirac_render_sf_fx( MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: IVAS decoder structure */ - Word32 *output_f_fx[] /* i/o: synthesized core-coder transport channels/DirAC output q11*/ + Word32 *output_fx[] /* i/o: synthesized core-coder transport channels/DirAC output q11*/ ) { Word16 i, ch, idx_in, idx_lfe; @@ -3603,7 +3705,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i] = L_add( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i], surCohEner_fx ); // q29 move32(); - surCohRatio_fx[i] = L_deposit_h( BASOP_Util_Divide3232_Scale( surCohEner_fx, L_add( L_add( 1, dirEne_fx ), surCohEner_fx ), &surCohRatio_exp[i] ) ); // 31-surCohRatio_exp + surCohRatio_fx[i] = BASOP_Util_Divide3232_Scale_newton( surCohEner_fx, L_add( L_add( 1, dirEne_fx ), surCohEner_fx ), &surCohRatio_exp[i] ); // 31-surCohRatio_exp move32(); temp_exp = s_max( temp_exp, surCohRatio_exp[i] ); } @@ -3661,8 +3763,6 @@ static void ivas_masa_ext_dirac_render_sf_fx( md_idx, surCohRatio_fx, Q_surCohRatio, - 0, - NULL, 0 ); Word16 proto_direct_buffer_f_temp_q[60]; @@ -3683,7 +3783,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( move16(); hMasaExtRend->cldfbAnaRend[ch]->Q_cldfb_state = q_cldfb; move16(); - cldfbAnalysis_ts_fx_fixed_q( &( output_f_fx[ch][hSpatParamRendCom->num_freq_bands * index_slot] ), + cldfbAnalysis_ts_fx_fixed_q( &( output_fx[ch][hSpatParamRendCom->num_freq_bands * index_slot] ), Cldfb_RealBuffer_fx[ch][0], Cldfb_ImagBuffer_fx[ch][0], hSpatParamRendCom->num_freq_bands, @@ -3707,7 +3807,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q, - reference_power_fix, &DirAC_mem.reference_power_q, slot_idx, nchan_transport, + reference_power_fix, DirAC_mem.reference_power_q, slot_idx, nchan_transport, hDirACRend->num_outputs_diff, hSpatParamRendCom->num_freq_bands, 0, q_cldfb ); @@ -3720,22 +3820,40 @@ static void ivas_masa_ext_dirac_render_sf_fx( protoSignalComputation2_fx( Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, hDirACRend->proto_frame_f_fx, &hDirACRend->proto_frame_f_q, hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, - reference_power_fix, &DirAC_mem.reference_power_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, - &hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, + reference_power_fix, DirAC_mem.reference_power_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, 0, slot_idx, hSpatParamRendCom->num_freq_bands, hDirACRend->masa_stereo_type_detect, q_cldfb ); proto_direct_buffer_f_temp_q[slot_idx] = hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q; move16(); - IF( LT_16( DirAC_mem.reference_power_q, DirAC_mem.reference_power_smooth_q ) ) + IF( LT_16( DirAC_mem.reference_power_q[0], DirAC_mem.reference_power_smooth_q[0] ) ) + { + FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + Scale_sig32( reference_power_fix + i, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( DirAC_mem.reference_power_q[0], DirAC_mem.reference_power_smooth_q[0] ) ); // DirAC_mem.reference_power_q + } + DirAC_mem.reference_power_smooth_q[0] = DirAC_mem.reference_power_q[0]; + move16(); + } + ELSE { - Scale_sig32( reference_power_fix + hSpatParamRendCom->num_freq_bands, sub( DirAC_mem.reference_power_len, hSpatParamRendCom->num_freq_bands ), sub( DirAC_mem.reference_power_q, DirAC_mem.reference_power_smooth_q ) ); // DirAC_mem.reference_power_q - DirAC_mem.reference_power_smooth_q = DirAC_mem.reference_power_q; + Scale_sig32( reference_power_fix, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( DirAC_mem.reference_power_smooth_q[0], DirAC_mem.reference_power_q[0] ) ); // DirAC_mem.reference_power_smooth_q + DirAC_mem.reference_power_q[0] = DirAC_mem.reference_power_smooth_q[0]; + move16(); + } + IF( LT_16( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ) + { + FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q + } + DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; move16(); } ELSE { - Scale_sig32( reference_power_fix, hSpatParamRendCom->num_freq_bands, sub( DirAC_mem.reference_power_smooth_q, DirAC_mem.reference_power_q ) ); // DirAC_mem.reference_power_smooth_q - DirAC_mem.reference_power_q = DirAC_mem.reference_power_smooth_q; + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); } temp_proto_frame_q = sub( getScaleFactor32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f_len ), 2 ); @@ -3753,9 +3871,9 @@ static void ivas_masa_ext_dirac_render_sf_fx( &hDirACRend->proto_frame_f_q, hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, - reference_power_fix, &DirAC_mem.reference_power_q, + reference_power_fix, DirAC_mem.reference_power_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, - &hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->hOutSetup.is_loudspeaker_setup, slot_idx, hSpatParamRendCom->num_freq_bands, @@ -3763,18 +3881,37 @@ static void ivas_masa_ext_dirac_render_sf_fx( proto_direct_buffer_f_temp_q[slot_idx] = hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q; move16(); - IF( LT_16( DirAC_mem.reference_power_q, DirAC_mem.reference_power_smooth_q ) ) + IF( LT_16( DirAC_mem.reference_power_q[0], DirAC_mem.reference_power_smooth_q[0] ) ) { - Scale_sig32( reference_power_fix + hSpatParamRendCom->num_freq_bands, sub( DirAC_mem.reference_power_len, hSpatParamRendCom->num_freq_bands ), sub( DirAC_mem.reference_power_q, DirAC_mem.reference_power_smooth_q ) ); // DirAC_mem.reference_power_q - DirAC_mem.reference_power_smooth_q = DirAC_mem.reference_power_q; + FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + Scale_sig32( reference_power_fix + i, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( DirAC_mem.reference_power_q[0], DirAC_mem.reference_power_smooth_q[0] ) ); // DirAC_mem.reference_power_q + } + DirAC_mem.reference_power_smooth_q[0] = DirAC_mem.reference_power_q[0]; move16(); } ELSE { - Scale_sig32( reference_power_fix, hSpatParamRendCom->num_freq_bands, sub( DirAC_mem.reference_power_smooth_q, DirAC_mem.reference_power_q ) ); // DirAC_mem.reference_power_smooth_q - DirAC_mem.reference_power_q = DirAC_mem.reference_power_smooth_q; + Scale_sig32( reference_power_fix, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( DirAC_mem.reference_power_smooth_q[0], DirAC_mem.reference_power_q[0] ) ); // DirAC_mem.reference_power_smooth_q + DirAC_mem.reference_power_q[0] = DirAC_mem.reference_power_smooth_q[0]; move16(); } + IF( LT_16( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ) + { + FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q + } + DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; + move16(); + } + ELSE + { + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; + move16(); + } + temp_proto_frame_q = sub( getScaleFactor32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f_len ), 2 ); Scale_sig32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f_len, temp_proto_frame_q ); // hDirACRend->proto_frame_f_q+temp_proto_frame_q hDirACRend->proto_frame_f_q = add( hDirACRend->proto_frame_f_q, temp_proto_frame_q ); @@ -3787,9 +3924,9 @@ static void ivas_masa_ext_dirac_render_sf_fx( &hDirACRend->proto_frame_f_q, hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, - reference_power_fix, &DirAC_mem.reference_power_q, + reference_power_fix, DirAC_mem.reference_power_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, - &hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, slot_idx, hDirACRend->num_protos_diff, hSpatParamRendCom->num_freq_bands, q_cldfb ); @@ -3797,16 +3934,34 @@ static void ivas_masa_ext_dirac_render_sf_fx( proto_direct_buffer_f_temp_q[slot_idx] = hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q; move16(); - IF( LT_16( DirAC_mem.reference_power_q, DirAC_mem.reference_power_smooth_q ) ) + IF( LT_16( DirAC_mem.reference_power_q[0], DirAC_mem.reference_power_smooth_q[0] ) ) + { + FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + Scale_sig32( reference_power_fix + i, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( DirAC_mem.reference_power_q[0], DirAC_mem.reference_power_smooth_q[0] ) ); // DirAC_mem.reference_power_q + } + DirAC_mem.reference_power_smooth_q[0] = DirAC_mem.reference_power_q[0]; + move16(); + } + ELSE + { + Scale_sig32( reference_power_fix, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( DirAC_mem.reference_power_smooth_q[0], DirAC_mem.reference_power_q[0] ) ); // DirAC_mem.reference_power_smooth_q + DirAC_mem.reference_power_q[0] = DirAC_mem.reference_power_smooth_q[0]; + move16(); + } + IF( LT_16( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ) { - Scale_sig32( reference_power_fix + hSpatParamRendCom->num_freq_bands, sub( DirAC_mem.reference_power_len, hSpatParamRendCom->num_freq_bands ), sub( DirAC_mem.reference_power_q, DirAC_mem.reference_power_smooth_q ) ); // DirAC_mem.reference_power_q - DirAC_mem.reference_power_smooth_q = DirAC_mem.reference_power_q; + FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q + } + DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; move16(); } ELSE { - Scale_sig32( reference_power_fix, hSpatParamRendCom->num_freq_bands, sub( DirAC_mem.reference_power_smooth_q, DirAC_mem.reference_power_q ) ); // DirAC_mem.reference_power_smooth_q - DirAC_mem.reference_power_q = DirAC_mem.reference_power_smooth_q; + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); } @@ -3844,9 +3999,9 @@ static void ivas_masa_ext_dirac_render_sf_fx( hDirACRend->h_freq_domain_decorr_ap_params, hDirACRend->h_freq_domain_decorr_ap_state ); - v_multc_fixed( onset_filter_fx, 536870912 /* 0.25f in Q31 */, onset_filter_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ - v_add_fixed( onset_filter_fx, onset_filter_subframe_fx, onset_filter_subframe_fx, hSpatParamRendCom->num_freq_bands, 0 ); /* Q31 */ - p_onset_filter_fx = onset_filter_subframe_fx; /*q31*/ + v_multc_fx( onset_filter_fx, 536870912 /* 0.25f in Q31 */, onset_filter_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ + v_add_fx_no_hdrm( onset_filter_fx, onset_filter_subframe_fx, onset_filter_subframe_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ + p_onset_filter_fx = onset_filter_subframe_fx; /*q31*/ } ELSE { @@ -3916,8 +4071,6 @@ static void ivas_masa_ext_dirac_render_sf_fx( hSpatParamRendCom->q_diffuseness_vector, hSpatParamRendCom, hDirACRend, - 0, - 0, hMasaExtRend->hVBAPdata, hDirACRend->hOutSetup, nchan_transport, @@ -3928,11 +4081,15 @@ static void ivas_masa_ext_dirac_render_sf_fx( IF( NE_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { Scale_sig32( DirAC_mem.reference_power_fx, DirAC_mem.reference_power_len, -1 ); // DirAC_mem.reference_power_q-1 - DirAC_mem.reference_power_q = sub( DirAC_mem.reference_power_q, 1 ); + DirAC_mem.reference_power_q[0] = sub( DirAC_mem.reference_power_q[0], 1 ); + DirAC_mem.reference_power_q[1] = sub( DirAC_mem.reference_power_q[1], 1 ); + move16(); + move16(); + DirAC_mem.reference_power_smooth_q[0] = DirAC_mem.reference_power_q[0]; + DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; move16(); - DirAC_mem.reference_power_smooth_q = DirAC_mem.reference_power_q; move16(); - v_add_fixed( reference_power_fix, reference_power_smooth_fx, reference_power_smooth_fx, hSpatParamRendCom->num_freq_bands, 0 ); // DirAC_mem.reference_power_smooth_q + v_add_fx_no_hdrm( reference_power_fix, reference_power_smooth_fx, reference_power_smooth_fx, hSpatParamRendCom->num_freq_bands ); // DirAC_mem.reference_power_smooth_q } } /*Rescaling proto_direct_buffer_f*/ @@ -4042,9 +4199,11 @@ static void ivas_masa_ext_dirac_render_sf_fx( Word16 reference_power_temp_q = getScaleFactor32( DirAC_mem.reference_power_fx, DirAC_mem.reference_power_len ); scale_sig32( DirAC_mem.reference_power_fx, DirAC_mem.reference_power_len, reference_power_temp_q ); /*DirAC_mem.reference_power_q + reference_power_temp_q*/ - DirAC_mem.reference_power_q = add( DirAC_mem.reference_power_q, reference_power_temp_q ); + DirAC_mem.reference_power_q[0] = add( DirAC_mem.reference_power_q[0], reference_power_temp_q ); + DirAC_mem.reference_power_q[1] = add( DirAC_mem.reference_power_q[1], reference_power_temp_q ); move16(); - DirAC_mem.reference_power_smooth_q = add( DirAC_mem.reference_power_q, reference_power_temp_q ); + DirAC_mem.reference_power_smooth_q[0] = add( DirAC_mem.reference_power_q[0], reference_power_temp_q ); + DirAC_mem.reference_power_smooth_q[1] = add( DirAC_mem.reference_power_q[1], reference_power_temp_q ); move16(); Word16 q_cy_auto_diff_smooth = getScaleFactor32( h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, h_dirac_output_synthesis_state->cy_auto_diff_smooth_len ); @@ -4076,11 +4235,30 @@ static void ivas_masa_ext_dirac_render_sf_fx( move16(); } - Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len, sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) - hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ); + FOR( i = 0; hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + i, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0] = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] ); move16(); - Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_len, sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ) - hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ); + FOR( i = 0; hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ); + move16(); + + FOR( i = 0; hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + i, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ) + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] ); + move16(); + FOR( i = 0; hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ) + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ); move16(); Word16 proto_power_diff_smooth_prev_temp_q = getScaleFactor32( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_len ); @@ -4104,14 +4282,24 @@ static void ivas_masa_ext_dirac_render_sf_fx( /*Buffer rescaling*/ - Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx, hSpatParamRendCom->num_freq_bands, sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) - Scale_sig32( DirAC_mem.reference_power_fx, DirAC_mem.reference_power_len, sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ), DirAC_mem.reference_power_q ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) - - hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ); + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) + FOR( i = 0; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + Scale_sig32( DirAC_mem.reference_power_fx + i, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ), DirAC_mem.reference_power_q[0] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) + Scale_sig32( DirAC_mem.reference_power_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), DirAC_mem.reference_power_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) + } + hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0] = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ); + move16(); + hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1] = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ); + move16(); + DirAC_mem.reference_power_q[0] = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ); + move16(); + DirAC_mem.reference_power_q[1] = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ); move16(); - DirAC_mem.reference_power_q = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ); + DirAC_mem.reference_power_smooth_q[0] = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ); move16(); - DirAC_mem.reference_power_smooth_q = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ); + DirAC_mem.reference_power_smooth_q[1] = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ); move16(); ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( Cldfb_RealBuffer_fx, @@ -4121,24 +4309,43 @@ static void ivas_masa_ext_dirac_render_sf_fx( hSpatParamRendCom->subframe_nbslots[subframe_idx], diffuseness_vector_fx, reference_power_smooth_fx, - &DirAC_mem.reference_power_smooth_q, + DirAC_mem.reference_power_smooth_q, ONE_IN_Q31, 0, &q_cldfb ); hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_q = hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q; move16(); - hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q = DirAC_mem.reference_power_smooth_q; + hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0] = DirAC_mem.reference_power_smooth_q[0]; + hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); - IF( LT_16( DirAC_mem.reference_power_q, DirAC_mem.reference_power_smooth_q ) ) + IF( LT_16( DirAC_mem.reference_power_q[0], DirAC_mem.reference_power_smooth_q[0] ) ) { - Scale_sig32( reference_power_fix + hSpatParamRendCom->num_freq_bands, sub( DirAC_mem.reference_power_len, hSpatParamRendCom->num_freq_bands ), sub( DirAC_mem.reference_power_q, DirAC_mem.reference_power_smooth_q ) ); // DirAC_mem.reference_power_q - DirAC_mem.reference_power_smooth_q = DirAC_mem.reference_power_q; + FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + Scale_sig32( reference_power_fix + i, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( DirAC_mem.reference_power_q[0], DirAC_mem.reference_power_smooth_q[0] ) ); // DirAC_mem.reference_power_q + } + DirAC_mem.reference_power_smooth_q[0] = DirAC_mem.reference_power_q[0]; move16(); } ELSE { - Scale_sig32( reference_power_fix, hSpatParamRendCom->num_freq_bands, sub( DirAC_mem.reference_power_smooth_q, DirAC_mem.reference_power_q ) ); // DirAC_mem.reference_power_smooth_q - DirAC_mem.reference_power_q = DirAC_mem.reference_power_smooth_q; + Scale_sig32( reference_power_fix, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( DirAC_mem.reference_power_smooth_q[0], DirAC_mem.reference_power_q[0] ) ); // DirAC_mem.reference_power_smooth_q + DirAC_mem.reference_power_q[0] = DirAC_mem.reference_power_smooth_q[0]; + move16(); + } + IF( LT_16( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ) + { + FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q + } + DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; + move16(); + } + ELSE + { + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); } } @@ -4161,13 +4368,13 @@ static void ivas_masa_ext_dirac_render_sf_fx( { FOR( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) { - scale_factor = s_min( scale_factor, getScaleFactor32( Cldfb_RealBuffer_fx[ch][slot_idx], - hSpatParamRendCom->num_freq_bands ) ); - scale_factor = s_min( scale_factor, getScaleFactor32( Cldfb_ImagBuffer_fx[ch][slot_idx], - hSpatParamRendCom->num_freq_bands ) ); + scale_factor = s_min( scale_factor, L_norm_arr( Cldfb_RealBuffer_fx[ch][slot_idx], + hSpatParamRendCom->num_freq_bands ) ); + scale_factor = s_min( scale_factor, L_norm_arr( Cldfb_ImagBuffer_fx[ch][slot_idx], + hSpatParamRendCom->num_freq_bands ) ); } } - scale_factor = sub( scale_factor, 3 ); // guard bits + scale_factor = sub( scale_factor, find_guarded_bits_fx( hSpatParamRendCom->num_freq_bands ) ); // guard bits FOR( ch = 0; ch < hDirACRend->num_outputs_dir; ch++ ) { @@ -4195,7 +4402,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( IF( hDirACRend->hOutSetup.num_lfe > 0 && ( EQ_16( hDirACRend->hOutSetup.index_lfe[idx_lfe], ch ) ) ) { /* No LFE for MASA rendering */ - set32_fx( &( output_f_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), 0, imult1616( hSpatParamRendCom->subframe_nbslots[subframe_idx], hSpatParamRendCom->num_freq_bands ) ); + set32_fx( &( output_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), 0, imult1616( hSpatParamRendCom->subframe_nbslots[subframe_idx], hSpatParamRendCom->num_freq_bands ) ); IF( LT_16( idx_lfe, sub( hDirACRend->hOutSetup.num_lfe, 1 ) ) ) { @@ -4205,22 +4412,31 @@ static void ivas_masa_ext_dirac_render_sf_fx( ELSE { /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + /* cldfb_state_fx should be in 1 less q-factor compared to cld buffers for cldfbSynthesis_ivas_fx function */ Word16 q_out = sub( q_cldfb, 1 ); - scale_sig32( hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_fx, hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_length, sub( q_out, hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state ) ); // q_out - hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state = q_out; - move16(); + Word16 max_shift = L_norm_arr( hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_fx, hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_length ); + IF( GT_16( max_shift, sub( q_out, hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state ) ) ) + { + scale_sig32( hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_fx, hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_length, sub( q_out, hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state ) ); // q_out + hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state = q_out; + move16(); + } + ELSE + { + FOR( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + scale_sig32( Cldfb_RealBuffer_fx[idx_in][i], hSpatParamRendCom->num_freq_bands, sub( hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state, q_out ) ); + scale_sig32( Cldfb_ImagBuffer_fx[idx_in][i], hSpatParamRendCom->num_freq_bands, sub( hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state, q_out ) ); + } + } FOR( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) { RealBuffer_fx[i] = Cldfb_RealBuffer_fx[idx_in][i]; // q_cldfb ImagBuffer_fx[i] = Cldfb_ImagBuffer_fx[idx_in][i]; // q_cldfb } Word16 out_size = imult1616( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ); -#ifdef OPT_SBA_AVOID_SPAR_RESCALE - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_f_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), out_size, 0, hMasaExtRend->cldfbSynRend[idx_in] ); -#else /* OPT_SBA_AVOID_SPAR_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_f_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), out_size, hMasaExtRend->cldfbSynRend[idx_in] ); -#endif /* OPT_SBA_AVOID_SPAR_RESCALE */ - scale_sig32( &( output_f_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), out_size, sub( 11, q_out ) ); // q11 + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), out_size, 0, 0, hMasaExtRend->cldfbSynRend[idx_in] ); + scale_sig32( &( output_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), out_size, sub( 11, q_out ) ); // q11 idx_in++; } } @@ -4237,7 +4453,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( void ivas_masa_ext_dirac_render_fx( MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA renderer structure */ - Word32 *output_f[], /* i/o: input/output signals in time domain q11*/ + Word32 *output_fx[], /* i/o: input/output signals in time domain q11*/ const Word16 num_subframes /* i : number of subframes to render */ ) { @@ -4252,7 +4468,7 @@ void ivas_masa_ext_dirac_render_fx( FOR( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) { - output_f_local[n] = output_f[n]; // q11 + output_f_local[n] = output_fx[n]; // q11 } hSpatParamRendCom->subframes_rendered = hSpatParamRendCom->dirac_read_idx; diff --git a/lib_rend/ivas_efap_fx.c b/lib_rend/ivas_efap_fx.c index 543decbddee50bf407465f629883234eb976979b..23ffbe0bd17bffb0c2f17d128bac4ba46e9325d4 100644 --- a/lib_rend/ivas_efap_fx.c +++ b/lib_rend/ivas_efap_fx.c @@ -37,6 +37,7 @@ #include "options.h" #include "prot_fx.h" #include "ivas_prot_rend_fx.h" +#include "ivas_rom_rend.h" #include "ivas_stat_dec.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" @@ -49,19 +50,22 @@ #define EFAP_MAX_GHOST_LS 5 /* Maximum number of ghost Loudspeakers, for memory allocation purpose */ #define POLY_THRESH_Q29 53687LL // Q29 #define POLY_THRESH_Q28 26843 // Q28 -#define Q22_1 4194304 -#define Q22_45_DEG 188743680 -#define Q22_90_DEG 377487360 -#define Q22_180_DEG 754974720 -#define Q22_360_DEG 1509949440 -#define Q22_120_DEG 503316480 -#define Q22_240_DEG 1006632960 +#ifdef DEBUG_EFAP_POLY_TOFILE +#define PANNING_AZI_RESOLUTION 2 +#define PANNING_ELE_RESOLUTION 5 +#endif +#define Q22_1 4194304 +#define Q22_45_DEG 188743680 +#define Q22_90_DEG 377487360 +#define Q22_180_DEG 754974720 +#define Q22_360_DEG 1509949440 +#define Q22_120_DEG 503316480 +#define Q22_240_DEG 1006632960 /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ - static ivas_error poly_init_fx( EFAP *efap, const Word16 efip_flag ); static ivas_error sphere_triangulation_fx( const Word16 numSpk, EFAP_VERTEX_DATA *vtxData, EFAP_POLYSET_DATA *polyData, Word32 ***dmTranspose /*q31*/, Word16 *numTot, const Word16 efip_flag ); static void initial_polyeder_fx( EFAP_VERTEX_DATA *vtxData, EFAP_LS_TRIANGLE *triArray, Word16 *numTri, Word16 *vtxInHull ); @@ -70,7 +74,6 @@ static void add_vertex_to_convex_hull_fx( const EFAP_VERTEX_DATA *vtxData, const static void sort_vertices_fx( const EFAP_VERTEX *vertexArray, const Word16 *numVtx, Word16 *order ); static void visible_edges_fx( const EFAP_LS_TRIANGLE *triArray, const Word16 *visible, const Word16 numSurface, Word16 *numEdges, Word16 *edges ); - static void flip_plane_fx( const EFAP_VERTEX *vtxArray, Word16 *surface, const Word32 centroid[3] /*q31*/ ); static void remap_ghosts_fx( EFAP_VERTEX *vtxArray, EFAP_LS_TRIANGLE *triArray, Word16 numSpk, Word16 *numVertex, Word16 numTri, Word32 **downmixMatrix /*q31*/ ); static void vertex_init_fx( const Word32 *aziSpk /*q22*/, const Word32 *eleSpk /*q22*/, EFAP_VERTEX_DATA *efapVtxData ); @@ -78,6 +81,7 @@ static void efap_panning_fx( const Word32 azi /*q22*/, const Word32 ele /*q22*/, static void get_poly_gains_fx( const Word32 azi /*q22*/, const Word32 ele /*q22*/, const Word32 aziPoly[EFAP_MAX_CHAN_NUM] /*q22*/, const Word32 elePoly[EFAP_MAX_CHAN_NUM] /*q22*/, const Word16 numChan, Word32 *buffer /*q31*/ ); static Word32 get_tri_gain_fx( const Word32 A[2] /*q22*/, const Word32 B[2] /*q22*/, const Word32 C[2] /*q22*/, const Word32 P_minus_A[2] /*q22*/ ); + /*-----------------------------------------------------------------------* * EFAP Utils *-----------------------------------------------------------------------*/ @@ -85,7 +89,6 @@ static Word32 get_tri_gain_fx( const Word32 A[2] /*q22*/, const Word32 B[2] /*q2 static void add_vertex_fx( EFAP_VERTEX *vtxArray, const Word32 azi /*q22*/, const Word32 ele /*q22*/, const Word16 pos, const EFAP_VTX_DMX_TYPE ); static void efap_sort_s_fx( Word16 *x, Word16 *idx, const Word16 len ); - static Word32 vertex_distance_fx( const EFAP_VERTEX *vtxArray, const EFAP_LS_TRIANGLE tri, const Word16 vtxIdx ); static Word32 point_plane_distance_fx( const Word32 P1[3] /*q31*/, const Word32 P2[3] /*q31*/, const Word32 P3[3] /*q31*/, const Word32 X[3] /*q31*/ ); static Word32 point_poly_distance_fx( const EFAP_POLYSET poly, const Word32 X[3] /*q31*/ ); @@ -105,6 +108,7 @@ static Word16 in_poly_fx( const Word32 P[2] /*q22*/, const EFAP_POLYSET poly ); static Word16 in_tri_fx( Word32 A[2] /*q22*/, Word32 B[2] /*q22*/, Word32 C[2] /*q22*/, Word32 P_minus_A[2] /*q22*/ ); static void sph2cart_fx( const Word32 azi /*q22*/, const Word32 ele /*q22*/, Word32 *pos /*q31*/ ); + /*-----------------------------------------------------------------------* * Global function definitions *-----------------------------------------------------------------------*/ @@ -124,6 +128,7 @@ ivas_error efap_init_data_fx( ) { /* Handle instance declaration */ + Word8 polyset_size; EFAP *efap; ivas_error error; @@ -142,7 +147,7 @@ ivas_error efap_init_data_fx( * Allocate memory *-----------------------------------------------------------------*/ - /* Memory Allocations for efap */ + /* Memory allocation for main EFAP structure */ IF( ( efap = (EFAP *) malloc( sizeof( EFAP ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP handle\n" ) ); @@ -158,7 +163,7 @@ ivas_error efap_init_data_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP speaker elevations\n" ) ); } - /* Memory Allocation for vertexArray */ + /* Memory allocation for vertexArray */ IF( ( efap->vtxData.vertexArray = (EFAP_VERTEX *) malloc( ( num_speaker_nodes + EFAP_MAX_GHOST_LS ) * sizeof( EFAP_VERTEX ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP Vertex Array\n" ) ); @@ -170,6 +175,21 @@ ivas_error efap_init_data_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP bufferS\n" ) ); } + /* get upper bound of number of polygons required */ + polyset_size = efap_poly_limit[num_speaker_nodes - 1]; + + /* Memory allocation for the polyset array */ + IF( ( efap->polyData.polysetArray = (EFAP_POLYSET *) malloc( polyset_size * sizeof( EFAP_POLYSET ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP bufferS\n" ) ); + } + + /* Memory allocation for the triangle array */ + IF( ( efap->polyData.triArray = (EFAP_LS_TRIANGLE *) malloc( polyset_size * sizeof( EFAP_LS_TRIANGLE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP bufferS\n" ) ); + } + /*-----------------------------------------------------------------* * Initialize values *-----------------------------------------------------------------*/ @@ -333,6 +353,12 @@ void efap_free_data_fx( free( ( *hEFAPdata )->vtxData.vtxOrder ); ( *hEFAPdata )->vtxData.vtxOrder = NULL; + free( ( *hEFAPdata )->polyData.polysetArray ); + ( *hEFAPdata )->vtxData.vtxOrder = NULL; + + free( ( *hEFAPdata )->polyData.triArray ); + ( *hEFAPdata )->vtxData.vtxOrder = NULL; + free( ( *hEFAPdata )->bufferLong_fx ); ( *hEFAPdata )->bufferLong_fx = NULL; @@ -403,7 +429,7 @@ static ivas_error poly_init_fx( if ( GT_32( efap->vtxData.vertexArray[n].ele /*Q22*/, ( Q22_90_DEG /*90.0 Q22*/ - 4 /*1e-6 Q22*/ ) ) || LT_32( efap->vtxData.vertexArray[n].ele /*Q22*/, ( 4 /*1e-6 Q22*/ - Q22_90_DEG /*90.0 Q22*/ ) ) ) { - efap->vtxData.vertexArray[n].isNaN = 1; + efap->vtxData.vertexArray[n].isNaN = true; move16(); } } @@ -610,11 +636,11 @@ static void initial_polyeder_fx( /* 2. attempt to create a triangle with nonzero area */ tmp = 0; move32(); - v_sub_fixed( vtxData->vertexArray[tetrahedron[1]].pos, vtxData->vertexArray[tetrahedron[0]].pos, tmp1, 3, 1 ); // tmp1 Q(31-1) + v_sub_fx( vtxData->vertexArray[tetrahedron[1]].pos, vtxData->vertexArray[tetrahedron[0]].pos, tmp1, 3, 1 ); // tmp1 Q(31-1) WHILE( LT_16( tetrahedron[2], numVtx ) ) { - v_sub_fixed( vtxData->vertexArray[tetrahedron[2]].pos, vtxData->vertexArray[tetrahedron[0]].pos, tmp2, 3, 1 ); // tmp2 Q(31-1) - efap_crossp_fx( tmp1, tmp2, tmpCross ); // tmpCross Q29 + v_sub_fx( vtxData->vertexArray[tetrahedron[2]].pos, vtxData->vertexArray[tetrahedron[0]].pos, tmp2, 3, 1 ); // tmp2 Q(31-1) + efap_crossp_fx( tmp1, tmp2, tmpCross ); // tmpCross Q29 FOR( i = 0; i < 3; i++ ) { tmp = L_add( tmp, Mpy_32_32( tmpCross[i], tmpCross[i] ) ); // tmp Q27 @@ -633,8 +659,8 @@ static void initial_polyeder_fx( move32(); WHILE( LT_16( tetrahedron[3], numVtx ) ) { - v_sub_fixed( vtxData->vertexArray[tetrahedron[3]].pos, vtxData->vertexArray[tetrahedron[0]].pos, tmp3, 3, 1 ); // tmp3 Q30 - tmp = dotp_fixed( tmp3, tmpCross, 3 ); // tmp Q28 + v_sub_fx( vtxData->vertexArray[tetrahedron[3]].pos, vtxData->vertexArray[tetrahedron[0]].pos, tmp3, 3, 1 ); // tmp3 Q30 + tmp = dotp_fx32( tmp3, tmpCross, 3 ); // tmp Q28 IF( GT_32( L_abs( tmp ), POLY_THRESH_Q28 /*1e-4f Q28*/ ) ) { BREAK; @@ -841,7 +867,7 @@ static void add_ghost_speakers_fx( { tmpAngleDiff[i] = L_sub( tmpAzi[i + 1], tmpAzi[i] ); // q22 move32(); - sectors[i] = ceil_fixed( Mpy_32_32( tmpAngleDiff[i], maxAngle ), Q22 ); // q22 + sectors[i] = ceil_fx( Mpy_32_32( tmpAngleDiff[i], maxAngle ), Q22 ); // q22 move32(); if ( GT_32( sectors[i], Q22_1 /*1 q22*/ ) ) @@ -851,7 +877,7 @@ static void add_ghost_speakers_fx( } tmpAngleDiff[k - 1] = L_sub( L_add( tmpAzi[0], Q22_360_DEG /*360 q22*/ ), tmpAzi[k - 1] ); // q22 - sectors[k - 1] = ceil_fixed( Mpy_32_32( tmpAngleDiff[k - 1], maxAngle ), Q22 ); // q22 + sectors[k - 1] = ceil_fx( Mpy_32_32( tmpAngleDiff[k - 1], maxAngle ), Q22 ); // q22 if ( GT_32( sectors[k - 1], Q22_1 /*1 q22*/ ) ) { @@ -1525,7 +1551,7 @@ static void get_poly_gains_fx( A[1] = elePoly[i - 1]; // q22 move32(); - v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) q22*/ + v_sub_fx_no_hdrm( P, A, P_minus_A, 2 ); /* Precalculate value of (P-A) q22*/ FOR( j = i; j < numChan - 2 + i; ++j ) { @@ -1578,18 +1604,18 @@ static Word32 get_tri_gain_fx( tmpN[1] = L_sub( C[0], B[0] ); // q22 move32(); - v_sub_fixed( B, A, tmpSub1, 2, 0 ); // tmpSub1 q22 + v_sub_fx_no_hdrm( B, A, tmpSub1, 2 ); // tmpSub1 q22 - tmpDot1 = dotp_fixed( tmpN, tmpSub1, 2 ); // Q13 + tmpDot1 = dotp_fx32( tmpN, tmpSub1, 2 ); // Q13 Word16 exp = Q18; move16(); Word32 inv_tmpDot2 = L_shl( tmpDot1, norm_l( tmpDot1 ) ); exp = sub( exp, norm_l( tmpDot1 ) ); - Word16 inv_tmpDot1 = Inv16( extract_h( inv_tmpDot2 ), &exp ); // 15-exp - v_multc_fixed( tmpN, L_shl( inv_tmpDot1, add( Q16, exp ) ), N, 2 ); // 22+31-31->22 + Word16 inv_tmpDot1 = Inv16( extract_h( inv_tmpDot2 ), &exp ); // 15-exp + v_multc_fx( tmpN, L_shl( inv_tmpDot1, add( Q16, exp ) ), N, 2 ); // 22+31-31->22 - tmpDot2 = dotp_fixed( P_minus_A, N, 2 ); // 22+22-31->13 + tmpDot2 = dotp_fx32( P_minus_A, N, 2 ); // 22+22-31->13 if ( EQ_32( tmpDot2, 8191 ) ) { @@ -1634,15 +1660,23 @@ static void add_vertex_fx( move32(); IF( LT_32( Q22_180_DEG /*180 q22*/, ele ) ) - tmp = Q22_180_DEG /*180 q22*/; + { + tmp = Q22_180_DEG /*180 q22*/; + } ELSE + { tmp = ele; // Q22 + } move32(); + IF( GT_32( -Q22_180_DEG /*180 q22*/, tmp ) ) - vtxArray[pos].ele = -Q22_180_DEG /*180 q22*/; + { + vtxArray[pos].ele = -Q22_180_DEG /*180 q22*/; + } ELSE - vtxArray[pos] - .ele = tmp; // q22 + { + vtxArray[pos].ele = tmp; // q22 + } move32(); /* Converting spherical coordinates to cartesians, assuming radius = 1 */ @@ -1652,7 +1686,7 @@ static void add_vertex_fx( /* IdxAziTmp */ tmp = L_abs( L_sub( Q22_90_DEG /*90 q22*/, L_abs( vtxArray[pos].azi ) ) ); // Q22 - idxAziTmp = L_shr( anint_fixed( tmp, Q22 ), Q22 ); // q22-q22->q0 + idxAziTmp = L_shr( anint_fx( tmp, Q22 ), Q22 ); // q22-q22->q0 /* IdxEleTmp */ tmp = L_abs( vtxArray[pos].ele ); // q22 @@ -1664,7 +1698,7 @@ static void add_vertex_fx( vtxArray[pos].idx = add( extract_l( idxAziTmp ), i_mult( 181, extract_l( L_shr( idxEleTmp, Q22 ) ) ) ); // q0 /* Setting the nan flag to 0 */ - vtxArray[pos].isNaN = 0; + vtxArray[pos].isNaN = false; move16(); /* Set the default downmix type */ @@ -1811,20 +1845,21 @@ static Word32 point_plane_distance_fx( // returns output in Q28 } /* Cross Product */ - v_sub_fixed( P1, P2, tmpCross1, 3, 1 ); // tmpCross1 q30 - v_sub_fixed( P1, P3, tmpCross2, 3, 1 ); // tmpCross2 q30 + v_sub_fx( P1, P2, tmpCross1, 3, 1 ); // tmpCross1 q30 + v_sub_fx( P1, P3, tmpCross2, 3, 1 ); // tmpCross2 q30 /* resultCross = cross(P1-P2,P1-P3) */ efap_crossp_fx( tmpCross1, tmpCross2, resultCross ); // Q29 /* Dot Product */ - tmpNorm = dotp_fixed( resultCross, resultCross, 3 ); // Q27 + tmpNorm = dotp_fx32( resultCross, resultCross, 3 ); // Q27 Word16 exp = 4; move16(); - tmpNorm = ISqrt32( tmpNorm, &exp ); // Q29 - v_sub_fixed( X, P1, tmpDot1, 3, 1 ); // Q30 - v_multc_fixed( resultCross, tmpNorm, tmpDot2, 3 ); // Q29 - exp - dist = L_shl( dotp_fixed( tmpDot1, tmpDot2, 3 ), exp ); // Q28 + tmpNorm = ISqrt32( tmpNorm, &exp ); // Q29 + v_sub_fx( X, P1, tmpDot1, 3, 1 ); // Q30 + v_multc_fx( resultCross, tmpNorm, tmpDot2, 3 ); // Q29 - exp + dist = L_shl( dotp_fx32( tmpDot1, tmpDot2, 3 ), exp ); // Q28 + return dist; } @@ -2220,16 +2255,16 @@ static void sort_channels_vertex_fx( } /* First Base Vector */ - v_sub_fixed( P2, P1, tmpU, 3, 1 ); // tmpU Q30 + v_sub_fx( P2, P1, tmpU, 3, 1 ); // tmpU Q30 Word16 exp1 = 2; move16(); - normU = ISqrt32( dotp_fixed( tmpU, tmpU, 3 ) /*q29*/, &exp1 ); /*q=31-exp1*/ + normU = ISqrt32( dotp_fx32( tmpU, tmpU, 3 ) /*q29*/, &exp1 ); /*q=31-exp1*/ // normU = L_shl_sat( normU, exp ); //normU Q31 - v_multc_fixed( tmpU, normU, U, 3 ); // U Q30 - exp1 + v_multc_fx( tmpU, normU, U, 3 ); // U Q30 - exp1 /* Second Base Vector */ - v_sub_fixed( P3, P2, tmpV1, 3, 1 ); // tmpV1 Q30 - v_multc_fixed( U, dotp_fixed( U, tmpV1, 3 ), tmpV2, 3 ); // tmpV2 Q28 - 2*exp1 + v_sub_fx( P3, P2, tmpV1, 3, 1 ); // tmpV1 Q30 + v_multc_fx( U, dotp_fx32( U, tmpV1, 3 ), tmpV2, 3 ); // tmpV2 Q28 - 2*exp1 FOR( i = 0; i < 3; i++ ) { @@ -2237,12 +2272,12 @@ static void sort_channels_vertex_fx( move32(); } - v_sub_fixed( tmpV1, tmpV2, tmpV3, 3, 0 ); // tmpV3 Q30 + v_sub_fx_no_hdrm( tmpV1, tmpV2, tmpV3, 3 ); // tmpV3 Q30 Word16 exp2 = 2; move16(); - normV = ISqrt32( dotp_fixed( tmpV3, tmpV3, 3 ) /*q29*/, &exp2 ); // q=31-exp2 + normV = ISqrt32( dotp_fx32( tmpV3, tmpV3, 3 ) /*q29*/, &exp2 ); // q=31-exp2 - v_multc_fixed( tmpV3, normV, V, 3 ); // V Q30 - exp2 + v_multc_fx( tmpV3, normV, V, 3 ); // V Q30 - exp2 /* Center of the first Triangle */ FOR( i = 0; i < 3; ++i ) @@ -2260,10 +2295,10 @@ static void sort_channels_vertex_fx( move32(); } - v_sub_fixed( tmpP, MC, P, 3, 1 ); // P Q30 + v_sub_fx( tmpP, MC, P, 3, 1 ); // P Q30 - x = dotp_fixed( P, U, 3 ); // x Q29 - exp1 - y = dotp_fixed( P, V, 3 ); // y Q29 - exp2 + x = dotp_fx32( P, U, 3 ); // x Q29 - exp1 + y = dotp_fx32( P, V, 3 ); // y Q29 - exp2 // Executing azi[i] = atan2f( y, x ); azi[i] = L_shl( BASOP_util_atan2( y, x, sub( exp2, exp1 ) ), Q16 ); // azi 2Q29 @@ -2271,7 +2306,7 @@ static void sort_channels_vertex_fx( } /* Sorting the azi vec */ - v_sort_ind_fixed( azi, order, lengthChannels ); + v_sort_ind_fx( azi, order, lengthChannels ); /* Updating the channel array */ FOR( i = 0; i < lengthChannels; ++i ) @@ -2419,7 +2454,7 @@ static Word16 in_poly_fx( /* Angles are in Q22 */ A[1] = poly.polyEle[0]; // q22 move32(); - v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) q22*/ + v_sub_fx_no_hdrm( P, A, P_minus_A, 2 ); /* Precalculate value of (P-A) q22*/ FOR( n = 1; n < sub( numVertices, 1 ); ++n ) { @@ -2474,7 +2509,8 @@ static Word16 in_tri_fx( Word32 tmpDot1[2], tmpDot2[2]; Word32 matInv[2][2]; Word32 invFactor; - Word16 tmp16, tmp_e; + Word16 tmp_e; + Word32 tmp32; Word64 S[2]; /* Threshold adjusted */ Word64 thresh_int = 35184640; // 1e-6f in Q45 @@ -2487,11 +2523,11 @@ static Word16 in_tri_fx( I'll just compute the determinant and if it's equal to 0, that means the two vectors are colinear */ - v_sub_fixed( B, A, tmpDot1, 2, 0 ); // tmpDot1 q22 - v_sub_fixed( C, A, tmpDot2, 2, 0 ); // tmpDot2 q22 + v_sub_fx_no_hdrm( B, A, tmpDot1, 2 ); // tmpDot1 q22 + v_sub_fx_no_hdrm( C, A, tmpDot2, 2 ); // tmpDot2 q22 /* Verification of the non-colinearity : Q22 * Q22 = Q13 */ - invFactor = L_sub( Mpy_32_32( tmpDot1[0], tmpDot2[1] ), Mpy_32_32( tmpDot1[1], tmpDot2[0] ) ); /*q22+q22-q31->q13*/ + invFactor = Msub_32_32( Mpy_32_32( tmpDot1[0], tmpDot2[1] ), tmpDot1[1], tmpDot2[0] ); /*q22+q22-q31->q13*/ IF( invFactor == 0 ) { @@ -2499,8 +2535,8 @@ static Word16 in_tri_fx( } /* invFactor = 1.f / invFactor; */ - tmp16 = BASOP_Util_Divide3232_Scale( ONE_IN_Q13, invFactor, &tmp_e ); /*15-tmp_e*/ - invFactor = L_shl_sat( tmp16, add( Q16, tmp_e ) ); /* Q31 */ + tmp32 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q13, invFactor, &tmp_e ); /*31-tmp_e*/ + invFactor = L_shl_sat( tmp32, tmp_e ); /* Q31 */ Word16 invFactor_exp = norm_l( invFactor ); invFactor = L_shl( invFactor, invFactor_exp ); // 31+invFactor_exp diff --git a/lib_rend/ivas_hrtf_fx.c b/lib_rend/ivas_hrtf_fx.c index 93f9fbd83ad15a678ebf73f29f0f0e2d4f617709..dee0fe052a902bb55841b54c10646c6ff79fcce7 100644 --- a/lib_rend/ivas_hrtf_fx.c +++ b/lib_rend/ivas_hrtf_fx.c @@ -33,6 +33,7 @@ #include #include "options.h" #include "prot_fx.h" +#include "ivas_rom_binaural_crend_head.h" #include "ivas_prot_rend_fx.h" #include "ivas_error.h" #include "wmc_auto.h" @@ -41,7 +42,7 @@ /*-----------------------------------------------------------------------* * ivas_HRTF_binary_open() * - * Allocate HRTF binary handle + * Allocate HRTF binary handle for TD renderer *-----------------------------------------------------------------------*/ ivas_error ivas_HRTF_binary_open_fx( @@ -54,6 +55,8 @@ ivas_error ivas_HRTF_binary_open_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF binary!" ); } + set_c( (Word8 *) ( *hHrtfTD ), 0, (Word32) sizeof( TDREND_HRFILT_FiltSet_t ) ); + return IVAS_ERR_OK; } @@ -61,7 +64,7 @@ ivas_error ivas_HRTF_binary_open_fx( /*-------------------------------------------------------------------* * ivas_HRTF_binary_close() * - * Close HRTF binary handle + * Close HRTF binary handle for TD renderer *-------------------------------------------------------------------*/ void ivas_HRTF_binary_close_fx( @@ -83,24 +86,45 @@ void ivas_HRTF_binary_close_fx( /*-----------------------------------------------------------------------* * ivas_HRTF_CRend_binary_open() * - * Allocate HRTF binary handle + * Allocate HRTF binary handle for Crend renderer *-----------------------------------------------------------------------*/ ivas_error ivas_HRTF_CRend_binary_open_fx( - HRTFS_CREND **hSetOfHRTF ) + HRTFS_CREND_DATA **hHrtfCrend ) { - /* Allocate HR filter set for headphones configuration */ - *hSetOfHRTF = (HRTFS_CREND *) malloc( sizeof( HRTFS_CREND ) ); - IF( *hSetOfHRTF == NULL ) + ivas_error error; + + IF( ( *hHrtfCrend = (HRTFS_CREND_HANDLE) malloc( sizeof( HRTFS_CREND_DATA ) ) ) == NULL ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for set of HRTF binary!" ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend HRTFS Handle\n" ); } - ( *hSetOfHRTF )->hHRTF_hrir_combined = NULL; - ( *hSetOfHRTF )->hHRTF_hrir_hoa3 = NULL; - ( *hSetOfHRTF )->hHRTF_hrir_hoa2 = NULL; - ( *hSetOfHRTF )->hHRTF_hrir_foa = NULL; - ( *hSetOfHRTF )->hHRTF_brir_combined = NULL; + IF( ( error = ivas_Crend_hrtf_init_fx( *hHrtfCrend ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ivas_HRTF_CRend_binary_open_buffers_int16() + * + * Allocate buffer with dynamic length for HRTF binary Crend handle + *-----------------------------------------------------------------------*/ + +ivas_error ivas_HRTF_CRend_binary_open_buffers_int16( + Word16 **buffer, /* o : buffer to allocate */ + const UWord32 mem_size /* i : size of buffer */ +) +{ + *buffer = (Word16 *) malloc( mem_size ); + + IF( *buffer == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF binary data\n" ); + } return IVAS_ERR_OK; } @@ -109,20 +133,56 @@ ivas_error ivas_HRTF_CRend_binary_open_fx( /*-------------------------------------------------------------------* * ivas_HRTF_CRend_binary_close() * - * Close HRTF CRend binary handle + * Close HRTF CRend binary handle for Crend renderer *-------------------------------------------------------------------*/ void ivas_HRTF_CRend_binary_close_fx( - HRTFS_CREND **hSetOfHRTF ) + HRTFS_CREND_DATA **hHrtfCrend ) { + UWord16 i, j; + test(); - IF( hSetOfHRTF == NULL || *hSetOfHRTF == NULL ) + IF( *hHrtfCrend == NULL || hHrtfCrend == NULL ) { return; } - free( *hSetOfHRTF ); - *hSetOfHRTF = NULL; + FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + IF( ( *hHrtfCrend )->pIndex_frequency_max[i][j] != NULL ) + { + free( ( *hHrtfCrend )->pIndex_frequency_max_dyn_fx[i][j] ); + } + IF( ( *hHrtfCrend )->pOut_to_bin_re_fx[i][j] != NULL ) + { + free( ( *hHrtfCrend )->pOut_to_bin_re_dyn_fx[i][j] ); + } + IF( ( *hHrtfCrend )->pOut_to_bin_im_fx[i][j] != NULL ) + { + free( ( *hHrtfCrend )->pOut_to_bin_im_dyn_fx[i][j] ); + } + } + } + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + IF( ( *hHrtfCrend )->pIndex_frequency_max_diffuse[j] != NULL ) + { + free( ( *hHrtfCrend )->pIndex_frequency_max_diffuse_dyn_fx[j] ); + } + IF( ( *hHrtfCrend )->pOut_to_bin_diffuse_re_fx[j] != NULL ) + { + free( ( *hHrtfCrend )->pOut_to_bin_diffuse_re_dyn_fx[j] ); + } + IF( ( *hHrtfCrend )->pOut_to_bin_diffuse_im_fx[j] != NULL ) + { + free( ( *hHrtfCrend )->pOut_to_bin_diffuse_im_dyn_fx[j] ); + } + } + + free( *hHrtfCrend ); + *hHrtfCrend = NULL; return; } @@ -142,7 +202,9 @@ ivas_error ivas_HRTF_fastconv_binary_open_fx( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FASTCONV HRTF tables!" ); } + ivas_init_binaural_hrtf_fx( *hHrtfFastConv ); + return IVAS_ERR_OK; } @@ -184,6 +246,8 @@ ivas_error ivas_HRTF_parambin_binary_open_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for parametric binauralizer HRTF tables!" ); } + set_c( (Word8 *) ( *hHrtfParambin ), 0, (Word32) sizeof( HRTFS_PARAMBIN ) ); + return IVAS_ERR_OK; } @@ -208,3 +272,155 @@ void ivas_HRTF_parambin_binary_close_fx( return; } + +/*-----------------------------------------------------------------------* + * ivas_HRTF_statistics_binary_open() + * + * Allocate HRTF binary handle for statistics handler + *-----------------------------------------------------------------------*/ + +ivas_error ivas_HRTF_statistics_binary_open_fx( + HRTFS_STATISTICS **hHrtfStatistics ) +{ + *hHrtfStatistics = (HRTFS_STATISTICS *) malloc( sizeof( HRTFS_STATISTICS ) ); + IF( *hHrtfStatistics == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for statistics HRTF tables!" ); + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ivas_HRTF_statistics_close() + * + * Close HRTF binary handle for statistics handler + *-----------------------------------------------------------------------*/ + +void ivas_HRTF_statistics_close_fx( + HRTFS_STATISTICS **hHrtfStatistics ) +{ + test(); + IF( hHrtfStatistics == NULL || *hHrtfStatistics == NULL ) + { + return; + } + + free( *hHrtfStatistics ); + *hHrtfStatistics = NULL; + + return; +} + + +/*-----------------------------------------------------------------------* + * ivas_HRTF_statistics_init() + * + * Allocates HRTF statistics handle and initializes from ROM + *-----------------------------------------------------------------------*/ + +ivas_error ivas_HRTF_statistics_init_fx( + HRTFS_STATISTICS_HANDLE *hHrtfStatistics, + const Word32 sampleRate ) +{ + HRTFS_STATISTICS *HrtfStatistics; + + test(); + IF( hHrtfStatistics != NULL && *hHrtfStatistics != NULL ) + { + /* Tables already loaded from file */ + return IVAS_ERR_OK; + } + + /* Initialise tables from ROM */ + IF( ( HrtfStatistics = (HRTFS_STATISTICS *) malloc( sizeof( HRTFS_STATISTICS ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for statistics HRTF tables!" ); + } + + HrtfStatistics->average_energy_l = NULL; + HrtfStatistics->average_energy_r = NULL; + HrtfStatistics->inter_aural_coherence = NULL; + + SWITCH( sampleRate ) + { + case 48000: + HrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); + IF( HrtfStatistics->average_energy_l_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); + IF( HrtfStatistics->average_energy_r_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); + IF( HrtfStatistics->inter_aural_coherence_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_left_avg_power_48kHz_fx, HrtfStatistics->average_energy_l_dyn, LR_IAC_LENGTH_NR_FC, Q28 - defaultHRIR_Q_48kHz_fx ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + Copy_Scale_sig_16_32_r( defaultHRIR_right_avg_power_48kHz_fx, HrtfStatistics->average_energy_r_dyn, LR_IAC_LENGTH_NR_FC, Q28 - defaultHRIR_Q_48kHz_fx ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + Copy_Scale_sig_16_32_r( defaultHRIR_coherence_48kHz_fx, HrtfStatistics->inter_aural_coherence_dyn, LR_IAC_LENGTH_NR_FC, Q26 - defaultHRIR_Q_48kHz_fx ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; + HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; + HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; + BREAK; + case 32000: + HrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); + IF( HrtfStatistics->average_energy_l_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); + IF( HrtfStatistics->average_energy_r_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); + IF( HrtfStatistics->inter_aural_coherence_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_left_avg_power_32kHz_fx, HrtfStatistics->average_energy_l_dyn, LR_IAC_LENGTH_NR_FC, Q28 - defaultHRIR_Q_32kHz_fx ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + Copy_Scale_sig_16_32_r( defaultHRIR_right_avg_power_32kHz_fx, HrtfStatistics->average_energy_r_dyn, LR_IAC_LENGTH_NR_FC, Q28 - defaultHRIR_Q_32kHz_fx ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + Copy_Scale_sig_16_32_r( defaultHRIR_coherence_32kHz_fx, HrtfStatistics->inter_aural_coherence_dyn, LR_IAC_LENGTH_NR_FC, Q26 - defaultHRIR_Q_32kHz_fx ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; + HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; + HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; + BREAK; + case 16000: + HrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( Word32 ) ); + IF( HrtfStatistics->average_energy_l_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( Word32 ) ); + IF( HrtfStatistics->average_energy_r_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( Word32 ) ); + IF( HrtfStatistics->inter_aural_coherence_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_left_avg_power_16kHz_fx, HrtfStatistics->average_energy_l_dyn, LR_IAC_LENGTH_NR_FC_16KHZ, Q28 - defaultHRIR_Q_16kHz_fx ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + Copy_Scale_sig_16_32_r( defaultHRIR_right_avg_power_16kHz_fx, HrtfStatistics->average_energy_r_dyn, LR_IAC_LENGTH_NR_FC_16KHZ, Q28 - defaultHRIR_Q_16kHz_fx ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + Copy_Scale_sig_16_32_r( defaultHRIR_coherence_16kHz_fx, HrtfStatistics->inter_aural_coherence_dyn, LR_IAC_LENGTH_NR_FC_16KHZ, Q26 - defaultHRIR_Q_16kHz_fx ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; + HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; + HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; + BREAK; + } + HrtfStatistics->fromROM = TRUE; +#ifdef FIX_1990_SANITIZER_IN_REVERB_LOAD + HrtfStatistics->fromROM = FALSE; // TODO: temporary hack until HRTF statistics ROM tables are converted from Word16 to Word32 +#endif + + *hHrtfStatistics = HrtfStatistics; + + return IVAS_ERR_OK; +} diff --git a/lib_rend/ivas_masa_merge_fx.c b/lib_rend/ivas_masa_merge_fx.c index fd20a9fabb262fe00e70c28aa6319e405ec7707b..6837a3e1ab982dc9031114b938ffdfe476dd82c4 100644 --- a/lib_rend/ivas_masa_merge_fx.c +++ b/lib_rend/ivas_masa_merge_fx.c @@ -37,8 +37,10 @@ #include "ivas_cnst.h" #include "prot_fx.h" #include "wmc_auto.h" +#include "ivas_rom_com.h" #include "ivas_prot_fx.h" +#define INV_UINT8_MAX 8421505 /* 1/UINT8_MAX in Q31 */ /*---------------------------------------------------------------------* * Local function prototypes @@ -46,9 +48,25 @@ static void copy_masa_meta_tile_fx( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta, const UWord8 sf, const UWord8 band ); -static void full_stream_merge_fx( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, Word32 inEne1[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word16 *inEne1_e, MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, Word32 inEne2[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word16 *inEne2_e ); +static void full_stream_merge_fx( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ + Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + Word16 inEne1_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1 Exponent */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ + Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ + Word16 inEne2_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 Exponent */ +); -static void diffuse_meta_merge_1x1_fx( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta, Word32 inEne_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word16 *inEne_e, MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, Word32 inEneISM_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word16 *inEneISM_e ); +static void diffuse_meta_merge_1x1_fx( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i : Input metadata 1 */ + Word32 inEne_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 1 */ + Word16 inEne_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 1 Exponent */ + MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i : Input metadata 2 */ + Word32 inEneISM_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ + Word16 inEneISM_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 Exponent */ +); /*---------------------------------------------------------------------* @@ -141,62 +159,69 @@ void copy_masa_descriptive_meta_fx( *---------------------------------------------------------------------*/ void diffuse_meta_merge_1x1_fx( - MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ - MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i : Input metadata 1 */ - Word32 inEne_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 1 */ - Word16 *inEne_e, /* i : TF-energy of input 1 Exponent */ - MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i : Input metadata 2 */ - Word32 inEneISM_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ - Word16 *inEneISM_e /* i : TF-energy of input 2 Exponent */ + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i : Input metadata 1 */ + Word32 inEne_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. energy after merge */ + Word16 inEne_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 1 Exponent */ + MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i : Input metadata 2 */ + Word32 inEneISM_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ + Word16 inEneISM_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 Exponent */ ) { Word8 sf, band; - Word16 max_e, in1_e[MASA_FREQUENCY_BANDS], i; FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { Word32 energyTimesRatio_fx, energyTimesRatioISM_fx, total_diff_nrg_fx, dir_nrg_ratio_fx, total_nrg_fx = 0; - Word32 dir_ratio_ism_fx, L_tmp1, L_tmp2; + Word32 dir_ratio_ism_fx, L_tmp, L_tmp1, L_tmp2; Word16 scale, energyTimesRatio_e, tmp, total_nrg_e = 0, total_diff_nrg_e, dir_ratio_ism_e, energyTimesRatioISM_e, dir_nrg_ratio_e; move32(); move16(); - tmp = BASOP_Util_Divide1616_Scale( inMeta->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); - energyTimesRatio_fx = Mpy_32_16_r( inEne_fx[sf][band], tmp ); /* Q( 31 - ( nEne_e[sf] + scale ) ) */ - energyTimesRatio_e = add( inEne_e[sf], scale ); + L_tmp = Mpy_32_16_1( INV_UINT8_MAX, inMeta->directToTotalRatio[0][sf][band] ); // Q31 - 15 => Q16 + scale = 15; + move16(); + energyTimesRatio_fx = Mpy_32_32_r( inEne_fx[sf][band], L_tmp ); /* Q( 31 - ( nEne_e[sf] + scale ) ) */ + energyTimesRatio_e = add( inEne_e[sf][band], scale ); + total_nrg_fx = BASOP_Util_Add_Mant32Exp( inEne_fx[sf][band], inEne_e[sf][band], inEneISM_fx[sf][band], inEneISM_e[sf][band], &total_nrg_e ); - IF( GT_16( inEne_e[sf], inEneISM_e[sf] ) ) - { - total_nrg_fx = L_add( L_shr( inEne_fx[sf][band], 1 ), L_shr( inEneISM_fx[sf][band], add( sub( inEne_e[sf], inEneISM_e[sf] ), 1 ) ) ); /* Q(30 - inEne_e[sf]) */ - total_nrg_e = add( inEne_e[sf], 1 ); - } - ELSE - { - total_nrg_fx = L_add( L_shr( inEneISM_fx[sf][band], 1 ), L_shr( inEne_fx[sf][band], add( sub( inEneISM_e[sf], inEne_e[sf] ), 1 ) ) ); /* Q(30 - inEneISM_e[sf]) */ - total_nrg_e = add( inEneISM_e[sf], 1 ); - } /* target is original MASA diffuseness */ - tmp = BASOP_Util_Divide1616_Scale( inMeta->diffuseToTotalRatio[sf][band], UINT8_MAX, &scale ); - total_diff_nrg_fx = Mpy_32_16_r( inEne_fx[sf][band], tmp ); /* Q( 31 - ( nEne_e[sf] + scale ) ) */ - total_diff_nrg_e = add( inEne_e[sf], scale ); + L_tmp = Mpy_32_16_1( INV_UINT8_MAX, inMeta->diffuseToTotalRatio[sf][band] ); // Q31 - 15 => Q16 + scale = 15; + move16(); + total_diff_nrg_fx = Mpy_32_32_r( inEne_fx[sf][band], L_tmp ); /* Q( 31 - ( nEne_e[sf] + scale ) ) */ + total_diff_nrg_e = add( inEne_e[sf][band], scale ); /* criterion is mean of ISM ratio and new ratio */ - dir_ratio_ism_fx = L_deposit_h( BASOP_Util_Divide1616_Scale( inMetaISM->directToTotalRatio[0][sf][band], UINT8_MAX, &dir_ratio_ism_e ) ); + dir_ratio_ism_fx = Mpy_32_16_1( INV_UINT8_MAX, inMetaISM->directToTotalRatio[0][sf][band] ); // Q31 - 15 => Q16 + dir_ratio_ism_e = 15; + move16(); tmp = BASOP_Util_Divide3232_Scale( total_diff_nrg_fx, L_add( total_nrg_fx, EPSILON_FX ), &scale ); L_tmp1 = L_deposit_h( tmp ); /* Q( 31 - ( scale + total_nrg_e - total_diff_nrg_e ) ) */ scale = add( scale, sub( total_diff_nrg_e, total_nrg_e ) ); - L_tmp2 = L_sub( L_shl( 1, scale ), L_tmp1 ); + IF( L_tmp1 == 0 ) + { + scale = 0; + move16(); + L_tmp2 = MAX_32; + move32(); + } + ELSE + { + L_tmp2 = BASOP_Util_Add_Mant32Exp( ONE_IN_Q31, 0, L_negate( L_tmp1 ), scale, &scale ); + } L_tmp1 = BASOP_Util_Add_Mant32Exp( dir_ratio_ism_fx, dir_ratio_ism_e, L_tmp2, scale, &tmp ); L_tmp1 = L_shr( L_tmp1, 1 ); energyTimesRatioISM_fx = Mpy_32_32( L_tmp1, inEneISM_fx[sf][band] ); /* Q( 31 - ( tmp + inEneISM_e[sf] ) ) */ - energyTimesRatioISM_e = add( tmp, inEneISM_e[sf] ); + energyTimesRatioISM_e = add( tmp, inEneISM_e[sf][band] ); IF( ( BASOP_Util_Cmp_Mant32Exp( energyTimesRatioISM_fx, energyTimesRatioISM_e, energyTimesRatio_fx, energyTimesRatio_e ) > 0 ) ) { Word32 new_dir_ratio_fx, new_diff_ratio_fx; Word16 new_dir_ratio_e; + outMeta->directionIndex[0][sf][band] = inMetaISM->directionIndex[0][sf][band]; move16(); outMeta->directToTotalRatio[0][sf][band] = inMetaISM->directToTotalRatio[0][sf][band]; @@ -209,13 +234,16 @@ void diffuse_meta_merge_1x1_fx( tmp = BASOP_Util_Divide3232_Scale( total_diff_nrg_fx, L_add( EPSILON_FX, total_nrg_fx ), &scale ); scale = add( scale, sub( total_diff_nrg_e, total_nrg_e ) ); - dir_nrg_ratio_fx = L_sub( L_shl( 1, scale ), L_deposit_h( tmp ) ); + Word32 temp32 = L_shr( L_deposit_h( tmp ), sub( sub( 31, scale ), Q30 ) ); // Q30 + scale = 1; + move16(); + dir_nrg_ratio_fx = L_sub( ONE_IN_Q30, temp32 ); dir_nrg_ratio_e = scale; move16(); - new_dir_ratio_fx = dir_nrg_ratio_fx; + new_dir_ratio_fx = dir_ratio_ism_fx; move32(); - new_dir_ratio_e = dir_nrg_ratio_e; + new_dir_ratio_e = dir_ratio_ism_e; move16(); tmp = BASOP_Util_Cmp_Mant32Exp( dir_nrg_ratio_fx, dir_nrg_ratio_e, dir_ratio_ism_fx, dir_ratio_ism_e ); IF( tmp <= 0 ) @@ -226,7 +254,8 @@ void diffuse_meta_merge_1x1_fx( move16(); } - outMeta->directToTotalRatio[0][sf][band] = (UWord8) imult1616( extract_l( L_shr( new_dir_ratio_fx, sub( 31, new_dir_ratio_e ) ) ), UINT8_MAX ); + outMeta->directToTotalRatio[0][sf][band] = (UWord8) extract_l( L_shr( Mpy_32_16_1( new_dir_ratio_fx, UINT8_MAX ) /* (31 - new_dir_ratio_e) - 15*/, sub( 31 - 15, new_dir_ratio_e ) ) ); /* Q0 */ + move16(); IF( GT_16( sub( 31, new_dir_ratio_e ), Q30 ) ) { @@ -239,7 +268,7 @@ void diffuse_meta_merge_1x1_fx( { new_diff_ratio_fx = L_sub( L_shl( 1, sub( 31, new_dir_ratio_e ) ), new_dir_ratio_fx ); /* Q(31 - new_dir_ratiio_e) */ } - outMeta->diffuseToTotalRatio[sf][band] = (UWord8) imult1616( extract_l( L_shr( new_diff_ratio_fx, new_dir_ratio_e ) ), UINT8_MAX ); + outMeta->diffuseToTotalRatio[sf][band] = (UWord8) extract_l( L_shr( new_diff_ratio_fx, sub( sub( 31, new_dir_ratio_e ), 8 ) ) ); move16(); } ELSE @@ -264,29 +293,9 @@ void diffuse_meta_merge_1x1_fx( outMeta->spreadCoherence[1][sf][band] = 0u; move16(); - inEne_fx[sf][band] = BASOP_Util_Add_Mant32Exp( inEne_fx[sf][band], inEne_e[sf], inEneISM_fx[sf][band], inEneISM_e[sf], &in1_e[band] ); /* Update energy for subsequent mergings */ - move16(); - } - - max_e = in1_e[0]; - move16(); - FOR( i = 1; i < MASA_FREQUENCY_BANDS; i++ ) - { - if ( LT_16( max_e, in1_e[i] ) ) - { - max_e = in1_e[i]; - move16(); - } - } - - FOR( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) - { - inEne_fx[sf][i] = L_shr( inEne_fx[sf][i], sub( max_e, in1_e[i] ) ); /* Q(31 - max_e) */ + inEne_fx[sf][band] = BASOP_Util_Add_Mant32Exp( inEne_fx[sf][band], inEne_e[sf][band], inEneISM_fx[sf][band], inEneISM_e[sf][band], &inEne_e[sf][band] ); /* Update energy for subsequent mergings */ move32(); } - - inEne_e[sf] = max_e; - move16(); } /* Set descriptive meta for mixed format */ @@ -318,16 +327,15 @@ void full_stream_merge_fx( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ - Word16 *inEne1_e, /* i/o: TF-energy of input 1 Exponent */ + Word16 inEne1_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1 Exponent */ MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ - Word16 *inEne2_e /* i : TF-energy of input 2 Exponent */ + Word16 inEne2_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 Exponent */ ) { UWord8 n_dirs_1, n_dirs_2; UWord8 sf, band; - Word16 scale, tmp, dir_nrg_1_e, dir_nrg_2_e, max_e, i; - Word16 in1_e[MASA_FREQUENCY_BANDS]; + Word16 scale, dir_nrg_1_e, dir_nrg_2_e; Word32 dir_nrg_1_fx, dir_nrg_2_fx, L_tmp; /* full stream select based on total direct energy */ @@ -338,27 +346,35 @@ void full_stream_merge_fx( { FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { - tmp = BASOP_Util_Divide1616_Scale( inMeta1->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); - dir_nrg_1_fx = Mpy_32_32( L_deposit_h( tmp ), inEne1_fx[sf][band] ); /* Q( 31 - ( scale + inEne1_e[sf] ) ) */ - dir_nrg_1_e = add( scale, inEne1_e[sf] ); + L_tmp = Mpy_32_16_1( INV_UINT8_MAX, inMeta1->directToTotalRatio[0][sf][band] ); // Q31 - 15 => Q16 + scale = 15; + move16(); + dir_nrg_1_fx = Mpy_32_32( L_tmp, inEne1_fx[sf][band] ); /* Q( 31 - ( scale + inEne1_e[sf] ) ) */ + dir_nrg_1_e = add( scale, inEne1_e[sf][band] ); - tmp = BASOP_Util_Divide1616_Scale( inMeta1->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); - dir_nrg_2_fx = Mpy_32_32( L_deposit_h( tmp ), inEne2_fx[sf][band] ); /* Q( 31 - ( scale + inEne2_e[sf] ) ) */ - dir_nrg_2_e = add( scale, inEne2_e[sf] ); + L_tmp = Mpy_32_16_1( INV_UINT8_MAX, inMeta2->directToTotalRatio[0][sf][band] ); // Q31 - 15 => Q16 + scale = 15; + move16(); + dir_nrg_2_fx = Mpy_32_32( L_tmp, inEne2_fx[sf][band] ); /* Q( 31 - ( scale + inEne2_e[sf] ) ) */ + dir_nrg_2_e = add( scale, inEne2_e[sf][band] ); IF( EQ_16( n_dirs_1, 2 ) ) { - tmp = BASOP_Util_Divide1616_Scale( inMeta1->directToTotalRatio[1][sf][band], UINT8_MAX, &scale ); - L_tmp = Mpy_32_32( L_deposit_h( tmp ), inEne1_fx[sf][band] ); /* Q( 31 - ( scale + inEne1_e[sf] ) ) */ - scale = add( scale, inEne1_e[sf] ); + L_tmp = Mpy_32_16_1( INV_UINT8_MAX, inMeta1->directToTotalRatio[1][sf][band] ); // Q31 - 15 => Q16 + scale = 15; + move16(); + L_tmp = Mpy_32_32( L_tmp, inEne1_fx[sf][band] ); /* Q( 31 - ( scale + inEne1_e[sf] ) ) */ + scale = add( scale, inEne1_e[sf][band] ); dir_nrg_1_fx = BASOP_Util_Add_Mant32Exp( L_tmp, scale, dir_nrg_1_fx, dir_nrg_1_e, &dir_nrg_1_e ); } IF( EQ_16( n_dirs_2, 2 ) ) { - tmp = BASOP_Util_Divide1616_Scale( inMeta2->directToTotalRatio[1][sf][band], UINT8_MAX, &scale ); - L_tmp = Mpy_32_32( L_deposit_h( tmp ), inEne2_fx[sf][band] ); /* Q( 31 - ( scale + inEne2_e[sf] ) ) */ - scale = add( scale, inEne2_e[sf] ); + L_tmp = Mpy_32_16_1( INV_UINT8_MAX, inMeta2->directToTotalRatio[1][sf][band] ); // Q31 - 15 => Q16 + scale = 15; + move16(); + L_tmp = Mpy_32_32( L_tmp, inEne2_fx[sf][band] ); /* Q( 31 - ( scale + inEne2_e[sf] ) ) */ + scale = add( scale, inEne2_e[sf][band] ); dir_nrg_2_fx = BASOP_Util_Add_Mant32Exp( L_tmp, scale, dir_nrg_2_fx, dir_nrg_2_e, &dir_nrg_2_e ); } @@ -371,29 +387,9 @@ void full_stream_merge_fx( copy_masa_meta_tile_fx( outMeta, inMeta2, sf, band ); } - inEne1_fx[sf][band] = BASOP_Util_Add_Mant32Exp( inEne1_fx[sf][band], inEne1_e[sf], inEne2_fx[sf][band], inEne2_e[sf], &in1_e[band] ); - move32(); - } - - max_e = in1_e[0]; - move16(); - FOR( i = 1; i < MASA_FREQUENCY_BANDS; i++ ) - { - if ( LT_16( max_e, in1_e[i] ) ) - { - max_e = in1_e[i]; - move16(); - } - } - - FOR( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) - { - inEne1_fx[sf][i] = L_shr( inEne1_fx[sf][i], sub( max_e, in1_e[i] ) ); /* Q( 31 - max_e ) */ + inEne1_fx[sf][band] = BASOP_Util_Add_Mant32Exp( inEne1_fx[sf][band], inEne1_e[sf][band], inEne2_fx[sf][band], inEne2_e[sf][band], &inEne1_e[sf][band] ); move32(); } - - inEne1_e[sf] = max_e; - move16(); } /* Set descriptive meta for mixed format */ @@ -436,11 +432,11 @@ void ivas_prerend_merge_masa_metadata_fx( MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ IVAS_REND_AudioConfigType inType1, /* i : Type of input 1 */ Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ - Word16 *inEne1_e, /* i/o: TF-energy of input 1 Exponent */ + Word16 inEne1_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1 Exponent */ MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ IVAS_REND_AudioConfigType inType2, /* i : Type of input 2 */ - Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ - Word16 *inEne2_e /* i : TF-energy of input 2 Exponent */ + Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2. may be altered */ + Word16 inEne2_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 Exponent */ ) { /* mixing ISMs with non-ISM use different merge */ @@ -453,7 +449,15 @@ void ivas_prerend_merge_masa_metadata_fx( IF( EQ_32( inType1, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) && NE_32( inType2, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) && ( inMeta1->descriptiveMeta.numberOfDirections == 0u && inMeta2->descriptiveMeta.numberOfDirections == 0u ) ) { /* meta_1 is ISM and both are 1dir */ - diffuse_meta_merge_1x1_fx( outMeta, inMeta2, inEne2_fx, inEne2_e, inMeta1, inEne1_fx, inEne1_e ); + Word8 sf; + + diffuse_meta_merge_1x1_fx( outMeta, inMeta2, inEne2_fx, inEne2_e, inMeta1, inEne1_fx, inEne1_e ); /* post-merge energy is now in inEne2 and needs to be copied to inEne1 */ + + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + Copy32( inEne2_fx[sf], inEne1_fx[sf], MASA_FREQUENCY_BANDS ); + Copy( inEne2_e[sf], inEne1_e[sf], MASA_FREQUENCY_BANDS ); + } } ELSE IF( EQ_32( inType2, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) && NE_32( inType1, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) && ( inMeta1->descriptiveMeta.numberOfDirections == 0u && inMeta2->descriptiveMeta.numberOfDirections == 0u ) ) { @@ -484,6 +488,7 @@ ivas_error masaPrerendOpen_fx( { MASA_PREREND_HANDLE hMasaPrerend; Word16 i; + Word16 maxBin; ivas_error error; error = IVAS_ERR_OK; @@ -495,6 +500,24 @@ ivas_error masaPrerendOpen_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA prerenderer\n" ) ); } + /* Determine the number of bands and band grouping */ + hMasaPrerend->nbands = MASA_FREQUENCY_BANDS; + move16(); + mvs2s( MASA_band_grouping_24, hMasaPrerend->band_grouping, MASA_FREQUENCY_BANDS + 1 ); + + maxBin = extract_l( Mpy_32_32( input_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ); /* Q0 */ + FOR( i = 1; i < hMasaPrerend->nbands + 1; i++ ) + { + IF( GE_16( hMasaPrerend->band_grouping[i], maxBin ) ) + { + hMasaPrerend->band_grouping[i] = maxBin; + move16(); + hMasaPrerend->nbands = i; + move16(); + break; + } + } + hMasaPrerend->num_Cldfb_instances = numTransports; move16(); FOR( i = 0; i < hMasaPrerend->num_Cldfb_instances; i++ ) @@ -548,7 +571,7 @@ void masaPrerendClose_fx( FOR( i = 0; i < ( *hMasaPrerendPtr )->num_Cldfb_instances; i++ ) { - deleteCldfb_ivas_fx( &( ( *hMasaPrerendPtr )->cldfbAnaEnc[i] ) ); + deleteCldfb_fx( &( ( *hMasaPrerendPtr )->cldfbAnaEnc[i] ) ); } free( ( *hMasaPrerendPtr )->hMasaOut ); diff --git a/lib_rend/ivas_mcmasa_ana_fx.c b/lib_rend/ivas_mcmasa_ana_fx.c index f3b4d175551867a1866ac1c6bdd7601e0fcdea4f..a6d9968406ddb669983ddd5a487fd76a7e4d99f8 100644 --- a/lib_rend/ivas_mcmasa_ana_fx.c +++ b/lib_rend/ivas_mcmasa_ana_fx.c @@ -41,7 +41,7 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_rom_com_fx.h" + /*------------------------------------------------------------------------- * Local constants @@ -60,13 +60,12 @@ /* Structure for covariance matrix */ typedef struct { - float xr[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; - float xi[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; Word32 xr_fx[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; Word32 xi_fx[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; Word16 xr_e[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; /*Stores exponent for xr_fx*/ Word16 xi_e[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; /*Stores exponent for xi_fx*/ } CovarianceMatrix; + void ivas_mcmasa_param_est_ana_fx( MCMASA_ANA_HANDLE hMcMasa, /* i : McMASA analyzer structure */ Word32 data_fx[][L_FRAME48k], /* i : Audio frame in MC-format */ @@ -80,7 +79,6 @@ void ivas_mcmasa_param_est_ana_fx( const Word16 nchan_inp /* i : Number of input channels */ ); - static void computeVerticalDiffuseness_fx( Word32 **buffer_intensity, /* i : Intensity vectors */ const Word32 *buffer_energy, /* i : Energy */ @@ -88,6 +86,7 @@ static void computeVerticalDiffuseness_fx( Word32 *diffuseness, /* o : Estimated diffuseness Q31 */ Word16 *buffer_intensity_q, Word16 *buffer_energy_q ); + static void compute_cov_mtx_fx( Word32 sr[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Input matrix, real, s[ch][freq] */ Word32 si[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Input matrix, imag, s[ch][freq] */ @@ -96,6 +95,7 @@ static void compute_cov_mtx_fx( CovarianceMatrix *COVls, /* o : Output matrix, contains upper part of cov mtx */ Word16 inp_exp /* i : Stores exponent for sr and si */ ); + static void computeEvenLayout_fx( const Word32 *ls_azimuth, /* i: Q22 */ Word32 *ls_azimuth_even, /* o: Q22 */ @@ -414,7 +414,7 @@ void ivas_mcmasa_ana_close( FOR( i = 0; i < ( *hMcMasa )->num_Cldfb_instances; i++ ) { - deleteCldfb_ivas_fx( &( ( *hMcMasa )->cldfbAnaEnc[i] ) ); + deleteCldfb_fx( &( ( *hMcMasa )->cldfbAnaEnc[i] ) ); } /* intensity 3-dim */ @@ -486,6 +486,12 @@ void ivas_mcmasa_ana_fx( /* Analysis */ ivas_mcmasa_param_est_ana_fx( hMcMasa, data, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, spreadCoherence_fx, surroundingCoherence_fx, q_data, input_frame, nchan_inp ); + /* Add zeros to higher bands in case of lower sampling rates */ + IF( LT_16( hMcMasa->nbands, MASA_FREQUENCY_BANDS ) ) + { + ivas_masa_zero_high_bands_fx( hMcMasa->nbands, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, spreadCoherence_fx, surroundingCoherence_fx ); + } + /* Create MASA metadata buffer from the estimated values */ ivas_create_masa_out_meta_fx( hMcMasa->hMasaOut, hMcMasa->sph_grid16, nchan_transport, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, spreadCoherence_fx, surroundingCoherence_fx, Q31, Q31, Q31 ); @@ -521,6 +527,7 @@ void ivas_mcmasa_param_est_ana_fx( Word16 q_vdv[MASA_FREQUENCY_BANDS]; Word16 out_exp[MASA_FREQUENCY_BANDS]; Word32 reference_power_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 reference_power_q; Word32 dir_v_fx[DIRAC_NUM_DIMS]; Word32 Chnl_RealBuffer_fx[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; Word32 Chnl_ImagBuffer_fx[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; @@ -529,7 +536,10 @@ void ivas_mcmasa_param_est_ana_fx( Word32 FoaEven_RealBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 FoaEven_ImagBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 intensity_real_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + Word16 intensity_real_q[MASA_FREQUENCY_BANDS]; Word32 intensity_even_real_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + Word16 intensity_even_real_q[MASA_FREQUENCY_BANDS]; + Word16 intensity_q, intensity_even_q; Word32 direction_vector_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; Word32 diffuseness_vector_fx[MASA_FREQUENCY_BANDS]; Word32 vertical_diffuseness_vector_fx[MASA_FREQUENCY_BANDS]; @@ -571,15 +581,32 @@ void ivas_mcmasa_param_est_ana_fx( Word16 i1, i2, i3; Word16 numAnalysisChannels; Word16 spreadCoh_e; + Word64 W_temp; + Word32 temp; + Word16 temp_e; + Word16 sf, scaled_data_q, s, shift = 31; + move16(); num_freq_bins = hMcMasa->cldfbAnaEnc[0]->no_channels; move16(); num_freq_bands = hMcMasa->nbands; move16(); - l_ts = idiv1616( input_frame, CLDFB_NO_COL_MAX ); + l_ts = shr( input_frame, CLDFB_NO_COL_MAX_LOG2 ); numAnalysisChannels = sub( nchan_inp, 1 ); set16_fx( q_vdv, 31, MASA_FREQUENCY_BANDS ); set16_fx( out_exp, 30, MASA_FREQUENCY_BANDS ); + + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + shift = s_min( shift, L_norm_arr( data_fx[i], input_frame ) ); + } + shift = sub( shift, find_guarded_bits_fx( l_ts ) ); + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + scale_sig32( data_fx[i], input_frame, shift ); + } + scaled_data_q = add( q_data, shift ); + /* do processing over all CLDFB time slots */ FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) { @@ -625,24 +652,24 @@ void ivas_mcmasa_param_est_ana_fx( FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { - Word16 cr_q = MAX_16, ci_q = MAX_16, sf, c_e; + Word16 cr_q = MAX_16, ci_q = MAX_16, c_e; move16(); move16(); - Word16 inp_q = q_data; + Word16 inp_q = scaled_data_q; move16(); FOR( i = 0; i < numAnalysisChannels; i++ ) { - inp_q = q_data; + inp_q = scaled_data_q; move16(); - cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hMcMasa->cldfbAnaEnc[i], &inp_q ); - cr_q = s_min( cr_q, getScaleFactor32( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); - ci_q = s_min( ci_q, getScaleFactor32( Chnl_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); + cldfbAnalysis_ts_fx_var_q( &( data_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hMcMasa->cldfbAnaEnc[i], &inp_q ); + cr_q = s_min( cr_q, getScaleFactor32( Chnl_ImagBuffer_fx[i], l_ts ) ); + ci_q = s_min( ci_q, getScaleFactor32( Chnl_RealBuffer_fx[i], l_ts ) ); } sf = sub( s_min( cr_q, ci_q ), 4 ); FOR( i = 0; i < numAnalysisChannels; i++ ) { - scale_sig32( Chnl_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf - scale_sig32( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf + scale_sig32( Chnl_RealBuffer_fx[i], l_ts, sf ); // Q-> inp_q + sf + scale_sig32( Chnl_ImagBuffer_fx[i], l_ts, sf ); // Q-> inp_q + sf } inp_q = add( inp_q, sf ); c_e = sub( 31, inp_q ); @@ -659,8 +686,12 @@ void ivas_mcmasa_param_est_ana_fx( { FOR( i = 0; i < numAnalysisChannels; i++ ) { - Word32 temp = L_add( Mult_32_32( Chnl_RealBuffer_fx[i][j], Chnl_RealBuffer_fx[i][j] ), Mult_32_32( Chnl_ImagBuffer_fx[i][j], Chnl_ImagBuffer_fx[i][j] ) ); // Q-> 2*inp_q - 31, e = 31 - (2*inp_q - 31) = 62 - 2*inp_q = 2*(31 - inp_q) = 2*c_e - hMcMasa->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->energy_fx[block_m_idx][band_m_idx], hMcMasa->energy_e[block_m_idx][band_m_idx], temp, shl( c_e, 1 ), &hMcMasa->energy_e[block_m_idx][band_m_idx] ); + W_temp = W_mac_32_32( W_mult_32_32( Chnl_RealBuffer_fx[i][j], Chnl_RealBuffer_fx[i][j] ), Chnl_ImagBuffer_fx[i][j], Chnl_ImagBuffer_fx[i][j] ); // Q-> 2*inp_q + 1 + sf = W_norm( W_temp ); + temp = W_extract_h( W_shl( W_temp, sf ) ); // 2 * inp_q + 1 + sf - 32 + temp_e = sub( 31 + 31, add( shl( inp_q, 1 ), sf ) ); // e = 31 - (2 * inp_q + 1 + sf - 32) + + hMcMasa->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->energy_fx[block_m_idx][band_m_idx], hMcMasa->energy_e[block_m_idx][band_m_idx], temp, temp_e, &hMcMasa->energy_e[block_m_idx][band_m_idx] ); move32(); } } @@ -690,8 +721,8 @@ void ivas_mcmasa_param_est_ana_fx( } /* Y */ - v_multc_fixed( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[1][0], Foa_RealBuffer_fx[1], num_freq_bins ); /*inp_q*/ - v_multc_fixed( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[1][0], Foa_ImagBuffer_fx[1], num_freq_bins ); /*inp_q*/ + v_multc_fx( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[1][0], Foa_RealBuffer_fx[1], num_freq_bins ); /*inp_q*/ + v_multc_fx( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[1][0], Foa_ImagBuffer_fx[1], num_freq_bins ); /*inp_q*/ FOR( i = 1; i < numAnalysisChannels; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hMcMasa->chnlToFoaMtx_fx[1][i], Foa_RealBuffer_fx[1], num_freq_bins ); /*inp_q*/ @@ -706,8 +737,8 @@ void ivas_mcmasa_param_est_ana_fx( } ELSE { - v_multc_fixed( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[2][0], Foa_RealBuffer_fx[2], num_freq_bins ); /*inp_q*/ - v_multc_fixed( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[2][0], Foa_ImagBuffer_fx[2], num_freq_bins ); /*inp_q*/ + v_multc_fx( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[2][0], Foa_RealBuffer_fx[2], num_freq_bins ); /*inp_q*/ + v_multc_fx( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[2][0], Foa_ImagBuffer_fx[2], num_freq_bins ); /*inp_q*/ FOR( i = 1; i < numAnalysisChannels; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hMcMasa->chnlToFoaMtx_fx[2][i], Foa_RealBuffer_fx[2], num_freq_bins ); /*inp_q*/ @@ -715,8 +746,8 @@ void ivas_mcmasa_param_est_ana_fx( } } /* X */ - v_multc_fixed( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[3][0], Foa_RealBuffer_fx[3], num_freq_bins ); /*inp_q*/ - v_multc_fixed( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[3][0], Foa_ImagBuffer_fx[3], num_freq_bins ); /*inp_q*/ + v_multc_fx( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[3][0], Foa_RealBuffer_fx[3], num_freq_bins ); /*inp_q*/ + v_multc_fx( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaMtx_fx[3][0], Foa_ImagBuffer_fx[3], num_freq_bins ); /*inp_q*/ FOR( i = 1; i < numAnalysisChannels; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hMcMasa->chnlToFoaMtx_fx[3][i], Foa_RealBuffer_fx[3], num_freq_bins ); /*inp_q*/ @@ -729,8 +760,8 @@ void ivas_mcmasa_param_est_ana_fx( Copy32( Foa_ImagBuffer_fx[0], FoaEven_ImagBuffer_fx[0], num_freq_bins ); /*inp_q*/ /* Y */ - v_multc_fixed( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[1][0], FoaEven_RealBuffer_fx[1], num_freq_bins ); /*inp_q*/ - v_multc_fixed( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[1][0], FoaEven_ImagBuffer_fx[1], num_freq_bins ); /*inp_q*/ + v_multc_fx( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[1][0], FoaEven_RealBuffer_fx[1], num_freq_bins ); /*inp_q*/ + v_multc_fx( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[1][0], FoaEven_ImagBuffer_fx[1], num_freq_bins ); /*inp_q*/ FOR( i = 1; i < numAnalysisChannels; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hMcMasa->chnlToFoaEvenMtx_fx[1][i], FoaEven_RealBuffer_fx[1], num_freq_bins ); /*inp_q*/ @@ -742,8 +773,8 @@ void ivas_mcmasa_param_est_ana_fx( set_zero_fx( FoaEven_ImagBuffer_fx[2], num_freq_bins ); /* X */ - v_multc_fixed( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[3][0], FoaEven_RealBuffer_fx[3], num_freq_bins ); /*inp_q*/ - v_multc_fixed( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[3][0], FoaEven_ImagBuffer_fx[3], num_freq_bins ); /*inp_q*/ + v_multc_fx( Chnl_RealBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[3][0], FoaEven_RealBuffer_fx[3], num_freq_bins ); /*inp_q*/ + v_multc_fx( Chnl_ImagBuffer_fx[0], hMcMasa->chnlToFoaEvenMtx_fx[3][0], FoaEven_ImagBuffer_fx[3], num_freq_bins ); /*inp_q*/ FOR( i = 1; i < numAnalysisChannels; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hMcMasa->chnlToFoaEvenMtx_fx[3][i], FoaEven_RealBuffer_fx[3], num_freq_bins ); /*inp_q*/ @@ -751,18 +782,38 @@ void ivas_mcmasa_param_est_ana_fx( } /* Direction estimation */ - computeIntensityVector_ana_fx( hMcMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); /* Q intensity_real_fx = 2*inp_q-31, e = 31 - 2*inp_q + 31 = 62 - 2*inp_q = 2*(31-inp_q)=2*c_e */ + computeIntensityVector_ana_fx( hMcMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, intensity_real_q, inp_q ); - computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], shl( c_e, 1 ) -#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC - , - NULL -#endif - ); /* Q direction_vector_fx = Q30*/ + computeDirectionVectors_fx2( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], 0, intensity_real_q ); /* Q direction_vector_fx = Q30*/ /* Power and intensity estimation for diffuseness */ - computeIntensityVector_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, num_freq_bands, intensity_even_real_fx ); /*2*inp_q-31*/ - computeReferencePower_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); /*2*inp_q-30*/ + computeIntensityVector_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, num_freq_bands, intensity_even_real_fx, intensity_even_real_q, inp_q ); + + computeReferencePower_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands, inp_q, &reference_power_q ); + + /* Aligning intensity_real and intensity_even_real to a common Q-factor */ + minimum_fx( intensity_real_q, num_freq_bands, &intensity_q ); + minimum_fx( intensity_even_real_q, num_freq_bands, &intensity_even_q ); + + Word16 tmp; + FOR( i = 0; i < num_freq_bands; i++ ) + { + tmp = sub( intensity_q, intensity_real_q[i] ); + intensity_real_fx[0][i] = L_shl( intensity_real_fx[0][i], tmp ); + move32(); + intensity_real_fx[1][i] = L_shl( intensity_real_fx[1][i], tmp ); + move32(); + intensity_real_fx[2][i] = L_shl( intensity_real_fx[2][i], tmp ); + move32(); + + tmp = sub( intensity_even_q, intensity_even_real_q[i] ); + intensity_even_real_fx[0][i] = L_shl( intensity_even_real_fx[0][i], tmp ); + move32(); + intensity_even_real_fx[1][i] = L_shl( intensity_even_real_fx[1][i], tmp ); + move32(); + intensity_even_real_fx[2][i] = L_shl( intensity_even_real_fx[2][i], tmp ); + move32(); + } /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hMcMasa->index_buffer_intensity = add( ( hMcMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ @@ -773,29 +824,37 @@ void ivas_mcmasa_param_est_ana_fx( /* only real part needed */ Copy32( intensity_even_real_fx[i], &( hMcMasa->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); } - hMcMasa->buffer_intensity_real_q[index - 1] = sub( shl( inp_q, 1 ), 31 ); + hMcMasa->buffer_intensity_real_q[index - 1] = intensity_even_q; move16(); Copy32( reference_power_fx[ts], &( hMcMasa->buffer_energy_fx[i_mult( index - 1, num_freq_bands )] ), num_freq_bands ); - hMcMasa->buffer_energy_q[index - 1] = sub( shl( inp_q, 1 ), 30 ); + hMcMasa->buffer_energy_q[index - 1] = reference_power_q; move16(); - computeDiffuseness_fixed( hMcMasa->buffer_intensity_real_fx, hMcMasa->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hMcMasa->buffer_intensity_real_q, hMcMasa->buffer_energy_q, out_exp ); // out_exp = Q30 + computeDiffuseness_fx( hMcMasa->buffer_intensity_real_fx, hMcMasa->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hMcMasa->buffer_intensity_real_q, hMcMasa->buffer_energy_q, out_exp ); // out_exp = Q30 + /* Compute vertical diffuseness, and tune original diffuseness if needed */ IF( !hMcMasa->isHorizontalSetup ) { Copy32( intensity_real_fx[2], &( hMcMasa->buffer_intensity_real_vert_fx[index - 1][0] ), num_freq_bands ); - hMcMasa->buffer_intensity_real_vert_q[index - 1] = sub( shl( inp_q, 1 ), 31 ); + hMcMasa->buffer_intensity_real_vert_q[index - 1] = intensity_q; move16(); computeVerticalDiffuseness_fx( hMcMasa->buffer_intensity_real_vert_fx, hMcMasa->buffer_energy_fx, num_freq_bands, vertical_diffuseness_vector_fx, hMcMasa->buffer_intensity_real_vert_q, hMcMasa->buffer_energy_q ); // Q vertical_diffuseness_vector_fx = 31 v_min_fx( diffuseness_vector_fx, out_exp, vertical_diffuseness_vector_fx, q_vdv, diffuseness_vector_fx, out_exp, num_freq_bands ); } FOR( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) { - norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*2*inp_q-30*/ - hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx] ); - hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx] ); - hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx] ); - diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ), 1 ), sub( shl( c_e, 1 ), 1 ), &diffuseness_e[band_m_idx] ); - renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( shl( c_e, 1 ), 1 ), &renormalization_factor_diff_e[band_m_idx] ); + norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*reference_power_q*/ + hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx] ); + hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx] ); + hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx] ); + + W_temp = W_mult0_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ); + s = W_norm( W_temp ); + temp = W_extract_h( W_shl( W_temp, s ) ); + temp_e = sub( 63, add( Q30, add( reference_power_q, s ) ) ); // 31 - ( reference_power_q + diffuseness_q + s - 32 ) + + diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], temp, temp_e, &diffuseness_e[band_m_idx] ); + + renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( 31, reference_power_q ), &renormalization_factor_diff_e[band_m_idx] ); move32(); move32(); move32(); @@ -831,7 +890,7 @@ void ivas_mcmasa_param_est_ana_fx( { FOR( j = i; j < numAnalysisChannels; j++ ) { - Word32 temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( COVls[band_m_idx].xr_fx[i][j], COVls[band_m_idx].xr_fx[i][j] ), shl( COVls[band_m_idx].xr_e[i][j], 1 ), Mult_32_32( COVls[band_m_idx].xi_fx[i][j], COVls[band_m_idx].xi_fx[i][j] ), shl( COVls[band_m_idx].xi_e[i][j], 1 ), &absCOVls_e[i][j] ); + temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( COVls[band_m_idx].xr_fx[i][j], COVls[band_m_idx].xr_fx[i][j] ), shl( COVls[band_m_idx].xr_e[i][j], 1 ), Mult_32_32( COVls[band_m_idx].xi_fx[i][j], COVls[band_m_idx].xi_fx[i][j] ), shl( COVls[band_m_idx].xi_e[i][j], 1 ), &absCOVls_e[i][j] ); absCOVls_fx[i][j] = Sqrt32( temp, &absCOVls_e[i][j] ); move32(); } @@ -884,7 +943,7 @@ void ivas_mcmasa_param_est_ana_fx( move16(); } Word16 temp_exp = add( lsEnergy_e[i1], lsEnergy_e[i2] ); - Word32 temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_exp ); + temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_exp ); tempCoh_e = 0; move16(); tempCoh_fx = L_shl( BASOP_Util_Divide3232_Scale( absCOVls_fx[i1][i2], temp, &tempCoh_e ), 16 ); @@ -936,8 +995,8 @@ void ivas_mcmasa_param_est_ana_fx( move16(); i3 = hMcMasa->rightNearest[i1]; move16(); - Word16 temp_e = add( lsEnergy_e[i2], lsEnergy_e[i3] ); - Word32 temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i2], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ); + temp_e = add( lsEnergy_e[i2], lsEnergy_e[i3] ); + temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i2], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ); IF( LT_16( i2, i3 ) ) { stereoCoh_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i2][i3], temp, &stereoCoh_e ); @@ -956,36 +1015,34 @@ void ivas_mcmasa_param_est_ana_fx( temp2 = L_add( temp2, EPSILON_FX ); lsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( temp1, temp2, &lsEnergyRelation_e ); lsEnergyRelation_e = add( lsEnergyRelation_e, sub( temp1_e, temp2_e ) ); - lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); // Q31 + lsEnergyRelation_fx = L_shl_sat( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); // Q31 stereoness_fx = Mult_32_32( stereoCoh_fx, lsEnergyRelation_fx ); stereoness_e = stereoCoh_e; move16(); IF( LT_16( i1, i2 ) ) { temp_e = add( lsEnergy_e[i1], lsEnergy_e[i2] ); - tempCoh_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i1][i2], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_e ) ), &tempCoh_e ); + tempCoh_fx = BASOP_Util_Divide3232_Scale_newton( absCOVls_fx[i1][i2], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_e ) ), &tempCoh_e ); tempCoh_e = add( tempCoh_e, sub( absCOVls_e[i1][i2], temp_e ) ); } ELSE { temp_e = add( lsEnergy_e[i1], lsEnergy_e[i2] ); - tempCoh_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i2][i1], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_e ) ), &tempCoh_e ); + tempCoh_fx = BASOP_Util_Divide3232_Scale_newton( absCOVls_fx[i2][i1], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_e ) ), &tempCoh_e ); tempCoh_e = add( tempCoh_e, sub( absCOVls_e[i2][i1], temp_e ) ); } - tempCoh_fx = L_shl( tempCoh_fx, 16 ); IF( LT_16( i1, i3 ) ) { temp_e = add( lsEnergy_e[i1], lsEnergy_e[i3] ); - tempCoh2_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i1][i3], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ) ), &tempCoh2_e ); + tempCoh2_fx = BASOP_Util_Divide3232_Scale_newton( absCOVls_fx[i1][i3], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ) ), &tempCoh2_e ); tempCoh2_e = add( tempCoh2_e, sub( absCOVls_e[i1][i3], temp_e ) ); } ELSE { temp_e = add( lsEnergy_e[i1], lsEnergy_e[i3] ); - tempCoh2_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i3][i1], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ) ), &tempCoh2_e ); + tempCoh2_fx = BASOP_Util_Divide3232_Scale_newton( absCOVls_fx[i3][i1], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ) ), &tempCoh2_e ); tempCoh2_e = add( tempCoh2_e, sub( absCOVls_e[i3][i1], temp_e ) ); } - tempCoh2_fx = L_shl( tempCoh2_fx, 16 ); IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tempCoh_fx, tempCoh_e, tempCoh2_fx, tempCoh2_e ), -1 ) ) { cohPanCoh_fx = tempCoh_fx; @@ -1000,7 +1057,7 @@ void ivas_mcmasa_param_est_ana_fx( cohPanCoh_e = tempCoh2_e; move16(); } - cohPanCoh_fx = L_shl( cohPanCoh_fx, cohPanCoh_e ); /*Q31*/ + cohPanCoh_fx = L_shl_sat( cohPanCoh_fx, cohPanCoh_e ); /*Q31*/ cohPanCoh_e = 0; move16(); lsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( lsEnergy_fx[i2], L_add( lsEnergy_fx[i1], EPSILON_FX ), &lsEnergyRelation_e ); @@ -1109,12 +1166,12 @@ void ivas_mcmasa_param_est_ana_fx( lsEnergySum_fx = L_add_sat( lsEnergySum_fx, EPSILON_FX ); lsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( temp1, lsEnergySum_fx, &lsEnergyRelation_e ); lsEnergyRelation_e = add( lsEnergyRelation_e, sub( temp1_e, lsEnergySum_e ) ); - lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); // Q31 + lsEnergyRelation_fx = L_shl_sat( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); // Q31 stereoRatio_fx = L_sub( Mult_32_32( L_shl_sat( stereoCoh_fx, stereoCoh_e ), lsEnergyRelation_fx ), surrCoh_fx ); // Q31 - + temp2 = L_sub( temp2, EPSILON_FX ); lsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( temp2, lsEnergySum_fx, &lsEnergyRelation_e ); lsEnergyRelation_e = add( lsEnergyRelation_e, sub( temp2_e, lsEnergySum_e ) ); - lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); // Q31 + lsEnergyRelation_fx = L_shl_sat( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); // Q31 cohPanRatio_fx = L_sub( Mult_32_32( cohPanCoh_fx, lsEnergyRelation_fx ), surrCoh_fx ); // Q31 IF( GT_32( stereoRatio_fx, cohPanRatio_fx ) ) @@ -1196,6 +1253,12 @@ void ivas_mcmasa_param_est_ana_fx( } } } + + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + scale_sig32( data_fx[i], input_frame, negate( shift ) ); + } + return; } @@ -1440,24 +1503,33 @@ static void computeVerticalDiffuseness_fx( { Word16 tmp_e1, tmp_e2; tmp = BASOP_Util_Divide3232_Scale( intensity_slow_abs[i], L_add( energy_slow[i], EPSILON_FX_SMALL ), &tmp_e1 ); - tmp_e1 = add( tmp_e1, sub( intensity_slow_e[i], energy_slow_e[i] ) ); - tmp = BASOP_Util_Divide3232_Scale( L_sub( tmp, L_shr( VERTICAL_ENERGY_RATIO_OFFSET_FX, tmp_e1 ) ), L_sub( ONE_IN_Q15, VERTICAL_ENERGY_RATIO_OFFSET_FX ), &tmp_e2 ); /* Tuned to avoid effect due to ambience of vertically un-even setups */ - tmp_e2 = add( tmp_e2, tmp_e1 ); - tmp = L_sub( L_shl( 1, sub( 15, tmp_e2 ) ), tmp ); - IF( tmp < 0 ) + IF( tmp != 0 ) { - tmp = 0; - move32(); + tmp_e1 = add( tmp_e1, sub( intensity_slow_e[i], energy_slow_e[i] ) ); + tmp = BASOP_Util_Divide3232_Scale( L_sub( tmp, L_shr( VERTICAL_ENERGY_RATIO_OFFSET_FX, tmp_e1 ) ), L_sub( ONE_IN_Q15, VERTICAL_ENERGY_RATIO_OFFSET_FX ), &tmp_e2 ); /* Tuned to avoid effect due to ambience of vertically un-even setups */ + tmp_e2 = add( tmp_e2, tmp_e1 ); + tmp = L_sub( L_shl( 1, sub( 15, tmp_e2 ) ), tmp ); + IF( tmp < 0 ) + { + tmp = 0; + move32(); + } + ELSE IF( GE_32( tmp, L_shl( 1, sub( 15, tmp_e2 ) ) ) ) + { + tmp = ONE_IN_Q31; // Q31 + move32(); + } + ELSE + { + tmp = L_shl( tmp, add( 16, tmp_e2 ) ); // Q31 + } } - ELSE IF( GE_32( tmp, L_shl( 1, sub( 15, tmp_e2 ) ) ) ) + ELSE { tmp = ONE_IN_Q31; // Q31 move32(); } - ELSE - { - tmp = L_shl( tmp, add( 16, tmp_e2 ) ); // Q31 - } + diffuseness[i] = tmp; // Q31 move32(); } @@ -1554,11 +1626,8 @@ void ivas_create_masa_out_meta_fx( Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Estimated surround coherence */ Word16 energyRatio_q, Word16 spreadCoherence_q, - Word16 surroundingCoherence_q - -) + Word16 surroundingCoherence_q ) { - const UWord8 ivasmasaFormatDescriptor[8] = { 0x49, 0x56, 0x41, 0x53, 0x4D, 0x41, 0x53, 0x41 }; /* "IVASMASA" */ Word16 i, sf, band; UWord8 numFrequencyBands; UWord8 numDirections; @@ -1608,7 +1677,7 @@ void ivas_create_masa_out_meta_fx( /* Direct-to-total ratio */ FOR( band = 0; band < numFrequencyBands; band++ ) { - extOutMeta->directToTotalRatio[0][sf][band] = (UWord8) L_shr( energyRatio[sf][band], sub( energyRatio_q, 8 ) ); // Q8 + extOutMeta->directToTotalRatio[0][sf][band] = (UWord8) L_shr( Mpy_32_16_1( energyRatio[sf][band], UINT8_MAX ), sub( energyRatio_q, 15 ) ); // Q0 move16(); extOutMeta->directToTotalRatio[1][sf][band] = 0; move16(); @@ -1617,7 +1686,7 @@ void ivas_create_masa_out_meta_fx( /* Spread coherence */ FOR( band = 0; band < numFrequencyBands; band++ ) { - extOutMeta->spreadCoherence[0][sf][band] = (UWord8) L_shr( spreadCoherence[sf][band], sub( spreadCoherence_q, 8 ) ); // Q8 + extOutMeta->spreadCoherence[0][sf][band] = (UWord8) L_shr( Mpy_32_16_1( spreadCoherence[sf][band], UINT8_MAX ), sub( spreadCoherence_q, 15 ) ); // Q0 move16(); extOutMeta->spreadCoherence[1][sf][band] = 0; move16(); @@ -1626,17 +1695,55 @@ void ivas_create_masa_out_meta_fx( /* Diffuse-to-total ratio = 1 - sum(direct-to-total ratios) */ FOR( band = 0; band < numFrequencyBands; band++ ) { - extOutMeta->diffuseToTotalRatio[sf][band] = (UWord8) sub( UINT8_MAX, (UWord8) L_shr( energyRatio[sf][band], sub( energyRatio_q, 8 ) ) ); // Q8 + extOutMeta->diffuseToTotalRatio[sf][band] = (UWord8) sub( UINT8_MAX, (UWord8) L_shr( Mpy_32_16_1( energyRatio[sf][band], UINT8_MAX ), sub( energyRatio_q, 15 ) ) ); // Q0 move16(); } /* Surround coherence */ FOR( band = 0; band < numFrequencyBands; band++ ) { - extOutMeta->surroundCoherence[sf][band] = (UWord8) L_shr( surroundingCoherence[sf][band], sub( surroundingCoherence_q, 8 ) ); // Q8 + extOutMeta->surroundCoherence[sf][band] = (UWord8) L_shr( Mpy_32_16_1( surroundingCoherence[sf][band], UINT8_MAX ), sub( surroundingCoherence_q, 15 ) ); // Q0 move16(); } } return; } + + +/*------------------------------------------------------------------------- + * ivas_masa_zero_high_bands() + * + * + *------------------------------------------------------------------------*/ + +void ivas_masa_zero_high_bands_fx( + const Word16 nbands, /* i : Number of frequency bands with estimated values */ + Word32 elevation_m_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated elevation */ + Word32 azimuth_m_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated azimuth */ + Word32 energyRatio_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated direct-to-total ratio */ + Word32 spreadCoherence_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated spread coherence */ + Word32 surroundingCoherence_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i/o : Estimated surround coherence */ +) +{ + Word16 sf, band; + + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + FOR( band = nbands; band < MASA_FREQUENCY_BANDS; band++ ) + { + elevation_m_values_fx[sf][band] = 0; + move32(); + azimuth_m_values_fx[sf][band] = 0; + move32(); + energyRatio_fx[sf][band] = 0; + move32(); + spreadCoherence_fx[sf][band] = 0; + move32(); + surroundingCoherence_fx[sf][band] = 0; + move32(); + } + } + + return; +} diff --git a/lib_rend/ivas_objectRenderer_fx.c b/lib_rend/ivas_objectRenderer_fx.c index 1b5bc0d1b5e5644d47cd293d00556fb30dbe3cc0..dd99c0070055fe74b7b4d7a45cb0d31a37d98cd7 100644 --- a/lib_rend/ivas_objectRenderer_fx.c +++ b/lib_rend/ivas_objectRenderer_fx.c @@ -40,15 +40,12 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #include "debug.h" -#include "ivas_rom_com_fx.h" -#define float_to_fixed( n, factor ) ( round( n * ( 1 << factor ) ) ) -#define fixed_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) + /*---------------------------------------------------------------------* * Local function prototypes *---------------------------------------------------------------------*/ - static void TDREND_Clear_Update_flags_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd /* i/o: TD renderer handle */ ); @@ -74,6 +71,7 @@ ivas_error ivas_td_binaural_open_unwrap_fx( const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ const AUDIO_CONFIG transport_config, /* i : Transport configuration */ const Word16 *directivity, /* i : Directivity pattern (used for ISM) */ + const Word32 *distAtt, /* i : Distance attenuation (used for ISM) */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */ BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */ Word32 *binaural_latency_ns, /* i : Binauralization delay */ @@ -86,6 +84,7 @@ ivas_error ivas_td_binaural_open_unwrap_fx( Word32 Pos_fx[3]; // Q25 Word32 Dir_fx[3]; // Q30 TDREND_DirAtten_t *DirAtten_p; + TDREND_DistAtten_t DistAtten; Word16 nchan_rend; ivas_error error; @@ -202,6 +201,15 @@ ivas_error ivas_td_binaural_open_unwrap_fx( DirAtten_p->ConeOuterGain_fx = ONE_IN_Q30; move32(); + DistAtten.DistAttenModel = TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED; // Q0 + move16(); + DistAtten.MaxDist_fx = 2113929216; /* Maximum radius (2^ISM_RADIUS_NBITS-1)*0.25 */ /*15.75 in Q27*/ + move32(); + DistAtten.RefDist_fx = ONE_IN_Q30; // Q30 + move32(); + DistAtten.RollOffFactor_fx = ONE_IN_Q30; // Q30 + move32(); + // TDREND_SRC_SPATIAL_t *SrcSpatial_p = pBinRendTd->Sources[nS]->SrcSpatial_p; IF( NE_32( ( error = TDREND_MIX_SRC_SetPos_fx( pBinRendTd, nS, Pos_fx ) ), IVAS_ERR_OK ) ) { @@ -220,8 +228,13 @@ ivas_error ivas_td_binaural_open_unwrap_fx( { return error; } + IF( NE_32( ( error = TDREND_MIX_SRC_SetDistAtten( pBinRendTd, nS, &DistAtten ) ), IVAS_ERR_OK ) ) + { + return error; + } } } + test(); test(); IF( EQ_16( ivas_format, ISM_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) @@ -245,10 +258,38 @@ ivas_error ivas_td_binaural_open_unwrap_fx( move32(); move32(); move32(); + + IF( NULL == distAtt ) + { + DistAtten.DistAttenModel = TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED; // Q0 + move16(); + DistAtten.MaxDist_fx = 2113929216; /* Maximum radius (2^ISM_RADIUS_NBITS-1)*0.25 */ /*15.75 in Q27*/ + move32(); + DistAtten.RefDist_fx = ONE_IN_Q30; // Q30 + move32(); + DistAtten.RollOffFactor_fx = ONE_IN_Q30; // Q30 + move32(); + } + ELSE + { + DistAtten.DistAttenModel = TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED; // Q0 + move16(); + DistAtten.MaxDist_fx = distAtt[0]; + move32(); + DistAtten.RefDist_fx = distAtt[1]; + move32(); + DistAtten.RollOffFactor_fx = distAtt[2]; + move32(); + } + IF( NE_32( ( error = TDREND_MIX_SRC_SetDirAtten_fx( pBinRendTd, nS, DirAtten_p ) ), IVAS_ERR_OK ) ) { return error; } + IF( NE_32( ( error = TDREND_MIX_SRC_SetDistAtten( pBinRendTd, nS, &DistAtten ) ), IVAS_ERR_OK ) ) + { + return error; + } } } @@ -256,7 +297,7 @@ ivas_error ivas_td_binaural_open_unwrap_fx( test(); IF( NE_16( ivas_format, MASA_ISM_FORMAT ) && NE_16( ivas_format, SBA_ISM_FORMAT ) ) { - *binaural_latency_ns = Mult_32_32( ( *hBinRendererTd )->HrFiltSet_p->latency_s_fx, 1000000000 /* 1000000000.f in Q0 */ ); + *binaural_latency_ns = L_shr_r( Mpy_32_32_r( ( *hBinRendererTd )->HrFiltSet_p->latency_s_fx, (Word32) 1000000000 ), ( *hBinRendererTd )->HrFiltSet_p->latency_s_Q_fx ); move32(); } @@ -373,13 +414,17 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( Word16 tmp_headRotEnabled; tmp_headRotEnabled = 0; move16(); - if ( enableCombinedOrientation != NULL ) + Word16 tmp_CombinedOrient_subframe_idx; + tmp_CombinedOrient_subframe_idx = 0; + move16(); + IF( enableCombinedOrientation != NULL ) { tmp_headRotEnabled = enableCombinedOrientation[hCombinedOrientationData->subframe_idx]; move16(); + tmp_CombinedOrient_subframe_idx = hCombinedOrientationData->subframe_idx; } - IF( NE_32( ( error = TDREND_Update_listener_orientation_fx( hBinRendererTd, tmp_headRotEnabled, &Quaternions[hCombinedOrientationData->subframe_idx], &Pos[hCombinedOrientationData->subframe_idx] ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = TDREND_Update_listener_orientation_fx( hBinRendererTd, tmp_headRotEnabled, &Quaternions[tmp_CombinedOrient_subframe_idx], &Pos[tmp_CombinedOrient_subframe_idx] ) ), IVAS_ERR_OK ) ) { return error; } @@ -410,12 +455,11 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( } /* Render subframe */ - IF( NE_32( ( error = TDREND_GetMix_fx( hBinRendererTd, output_fx, subframe_length, subframe_idx, ism_md_subframe_update ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = TDREND_GetMix_fx( hBinRendererTd, output_fx, subframe_length, subframe_idx ) ), IVAS_ERR_OK ) ) { return error; } - /* Advance subframe pointer */ c_indx = 0; move16(); @@ -453,8 +497,7 @@ ivas_error TDREND_GetMix_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ Word32 *output[], /* i/o: ISM object synth / rendered output in 0,1 Q11 */ const Word16 subframe_length, /* i/o: subframe length */ - const Word16 subframe_idx, /* i : Subframe index to 5 ms subframe */ - const Word16 ism_md_subframe_update /* i : Number of subframes to delay ism metadata to sync with audio */ + const Word16 subframe_idx /* i : Subframe index to 5 ms subframe */ ) { Word16 i; @@ -466,14 +509,13 @@ ivas_error TDREND_GetMix_fx( Word32 hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; Word32 hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; Word16 intp_count; - Word16 subframe_update_flag; + Word16 currShift, prevShift, transition_len, length_in2; + Word16 tmp1, tmp2, tmp_e, tmp3, tmp4, tmp_e2, tlen1, tlen2; + Word16 hrf_left_delta_e = 0, hrf_right_delta_e = 0; move16(); move16(); - subframe_update_flag = (Word16) EQ_16( subframe_idx, ism_md_subframe_update ); - move16(); - error = IVAS_ERR_OK; move32(); /* Clear the output buffer to accumulate rendered sources */ @@ -504,7 +546,28 @@ ivas_error TDREND_GetMix_fx( hrf_left_delta, &hrf_left_delta_e, hrf_right_delta, &hrf_right_delta_e, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain_fx, - Src_p, subframe_update_flag ); + Src_p ); + /* For large ITD values at lower sampling rate, check if the transition can be done */ + IF( LT_16( i_mult( Src_p->previtd, Src_p->itd ), 0 ) ) + { + currShift = abs_s( Src_p->itd ); // Q0 + prevShift = abs_s( Src_p->previtd ); + transition_len = sub( subframe_length, s_max( 0, sub( SFX_SPAT_BIN_SINC_M, currShift ) ) ); + tmp1 = imult1616( transition_len, prevShift ); // Q0 + tmp2 = add( prevShift, currShift ); // Q0 + tmp3 = BASOP_Util_Divide1616_Scale( tmp1, tmp2, &tmp_e ); // exp(tmp_e) + tmp_e2 = BASOP_Util_Add_MantExp( tmp3, tmp_e, ONE_IN_Q14, 0, &tmp4 ); // exp(tmp_e2) + tlen1 = shr( tmp4, sub( 15, tmp_e2 ) ); // Q0 + tlen2 = sub( transition_len, tlen1 ); // Q0 + length_in2 = sub( tlen2, currShift ); // Q0 + + IF( LE_16( length_in2, 0 ) ) + { + /* Subframe too short for ITD transition -- change to ITD=0 and push the rest of the transition to next subframe */ + Src_p->itd = 0; + move16(); + } + } } /* Render source if needed */ @@ -547,6 +610,8 @@ static void TDREND_Clear_Update_flags_fx( { hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; move16(); + hBinRendererTd->Sources[i]->SrcRend_p->SrcGainUpdated = FALSE; + move16(); } return; @@ -566,14 +631,11 @@ ivas_error TDREND_Update_object_positions_fx( const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ ) { - TDREND_DirAtten_t *DirAtten_p; Word16 nS; Word32 Pos_fx[3]; // Q25 Word32 Dir_fx[3]; // Q30 ivas_error error; - DirAtten_p = hBinRendererTd->DirAtten_p; - /* For each source, write the frame data to the source object*/ FOR( nS = 0; nS < num_src; nS++ ) { @@ -597,8 +659,7 @@ ivas_error TDREND_Update_object_positions_fx( { return error; } - - IF( NE_32( ( error = TDREND_MIX_SRC_SetDirAtten_fx( hBinRendererTd, nS, DirAtten_p ) ), IVAS_ERR_OK ) ) + if ( ( error = TDREND_MIX_SRC_SetGain( hBinRendererTd, nS, hIsmMetaData[nS]->gain_fx ) ) != IVAS_ERR_OK ) // TODO: Check Gain has correct Q-value { return error; } @@ -745,12 +806,14 @@ ivas_error TDREND_Update_listener_orientation_fx( * * *---------------------------------------------------------------------*/ + ivas_error ivas_td_binaural_open_ext_fx( TDREND_WRAPPER *pTDRend, AUDIO_CONFIG inConfig, RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ LSSETUP_CUSTOM_STRUCT *customLsInput, const Word32 outFs, + const Word16 object_id, /* i: Object ID */ Word16 *SrcInd, Word16 *num_src ) { @@ -759,7 +822,7 @@ ivas_error ivas_td_binaural_open_ext_fx( IVAS_FORMAT ivas_format; IVAS_OUTPUT_SETUP hTransSetup; ivas_error error; - + Word32 *distAtt_fx = NULL; Word16 *directivity_fx = NULL; IF( NE_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) @@ -800,11 +863,14 @@ ivas_error ivas_td_binaural_open_ext_fx( if ( NULL != hRendCfg ) { - directivity_fx = hRendCfg->directivity_fx; + directivity_fx = hRendCfg->directivity_fx + 3 * object_id; /* Address calculation -- no BASOPs */ + distAtt_fx = hRendCfg->distAtt_fx; } - return ivas_td_binaural_open_unwrap_fx( &pTDRend->hHrtfTD, outFs, *num_src, ivas_format, transport_config, directivity_fx, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns, SrcInd ); + return ivas_td_binaural_open_unwrap_fx( pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity_fx, distAtt_fx, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns, SrcInd ); } + + /*---------------------------------------------------------------------* * ivas_td_binaural_renderer_ext() * @@ -897,6 +963,7 @@ ivas_error ivas_td_binaural_renderer_ext_fx( move32(); hIsmMetaData[0]->radius_fx = currentPos->radius_fx; move32(); + hIsmMetaData[0]->gain_fx = ONE_IN_Q29; // TODO: check Q value hIsmMetaData[0]->non_diegetic_flag = currentPos->non_diegetic_flag; move16(); } @@ -912,7 +979,9 @@ ivas_error ivas_td_binaural_renderer_ext_fx( move16(); Word16 pos_q = Q25; move16(); - IF( ( *hCombinedOrientationData )->listenerPos != NULL ) + + test(); + IF( *hCombinedOrientationData != NULL && ( *hCombinedOrientationData )->listenerPos != NULL ) { ( *hCombinedOrientationData )->listenerPos[idx].x_fx = L_shr( ( *hCombinedOrientationData )->listenerPos[idx].x_fx, sub( ( *hCombinedOrientationData )->listenerPos[idx].q_fact, pos_q ) ); move32(); @@ -932,13 +1001,13 @@ ivas_error ivas_td_binaural_renderer_ext_fx( } } - IF( NE_32( ( error = ivas_td_binaural_renderer_unwrap_fx( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, *hCombinedOrientationData, ism_md_subframe_update_ext, p_output_fx, output_frame, num_subframes ) ), IVAS_ERR_OK ) ) { return error; } + IF( hReverb != NULL ) { *exp = sub( *exp, 2 ); diff --git a/lib_rend/ivas_objectRenderer_hrFilt_fx.c b/lib_rend/ivas_objectRenderer_hrFilt_fx.c index 01e35efe1711b619d8dd6dfc821e79639d355904..2a67d7a39a5277407bf20b818de4324978ac5b66 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt_fx.c +++ b/lib_rend/ivas_objectRenderer_hrFilt_fx.c @@ -44,13 +44,13 @@ * Local function prototypes *---------------------------------------------------------------------*/ -static Word32 round_fixed( Word32 n, Word16 q ); static void getPeriodicBSplineSampVec_fx( Word32 *BfVec_fx, Word16 *AzIdx, const Word16 NumBFs, const Word32 t_fx, Word16 *num_az_idx, const Word32 knot_interval_fx, const Word32 azimKSeq_0_fx, const Word16 azimSegSamples, const Word32 *azimBsShape_fx, const Word16 subSampFactor ); static void getStandardBSplineSampVec_fx( Word32 *BfVec_fx, Word16 *NzIdx, Word16 *num_idx, const Word16 NumBFs, const Word32 t_fx, const Word32 *KSeq_fx, const Word16 SegSamples, const Word16 *BsLen, const Word16 *BsStart, const Word32 *BsShape_fx ); static void GenerateFilter_fx( const Word32 elev, Word32 azim, ModelParams_t *model, ModelEval_t *modelEval ); static void GenerateITD_fx( const Word32 elev, Word32 azim, ModelParamsITD_t *model, ModelEval_t *modelEval ); static void SkipSmallest_ValueIndex_fx( Word16 *use_inds, const ValueIndex_t *VI, const Word16 N, const Word16 n_smallest ); + /*-------------------------------------------------------------------* * TDREND_REND_RenderSourceHRFilt() * @@ -97,7 +97,7 @@ ivas_error TDREND_REND_RenderSourceHRFilt_fx( TDREND_firfilt_fx( RightOutputFrame_fx, Src_p->hrf_right_prev_fx, right_filter_e, hrf_right_delta_fx, intp_count, Src_p->mem_hrf_right_fx, subframe_length, Src_p->filterlength, Src_p->Gain_fx, Src_p->prevGain_fx ); Src_p->prevGain_fx = Src_p->Gain_fx; - move16(); + move32(); /* Copy to accumulative output frame */ v_add_32( LeftOutputFrame_fx, output_buf_fx[0], output_buf_fx[0], subframe_length ); // Same Q as Src_p->InputFrame_p_fx Q11 @@ -151,12 +151,19 @@ void GetFilterFromAngle_fx( return; } -static Word32 round_fixed( /* o : Output value Q0 */ - Word32 num, /* i : Input value */ - Word16 q /* i : Input q-factor */ + +/* o : Output value Q0 */ +static Word32 round_hrFilt_fx( + Word32 num, /* i : Input value */ + Word16 q /* i : Input q-factor */ ) { - Word32 half = L_shl( 1, sub( q, 1 ) ); + Word32 half; + if ( q == 0 ) + { + return num; + } + half = L_shl( 1, sub( q, 1 ) ); half = L_shr( half, 1 ); // one guard bit num = L_shr( num, 1 ); // one guard bit @@ -193,7 +200,6 @@ static void GenerateFilter_fx( ) { Word16 qp, p, k, i; - Word32 index; Word16 AzIdx[HRTF_MODEL_BSPLINE_NUM_COEFFS][HRTF_MODEL_BSPLINE_NUM_COEFFS], EvIdx[HRTF_MODEL_BSPLINE_NUM_COEFFS]; /* non-zero basis functions */ Word16 num_az_idx[HRTF_MODEL_BSPLINE_NUM_COEFFS]; Word16 num_ev_idx; @@ -255,99 +261,129 @@ static void GenerateFilter_fx( move16(); FOR( p = 0; p < num_ev_idx; p++ ) { + Word32 expt = L_shl_sat( modelEval->elevBfVec_fx[p], 1 ); FOR( i = 0; i < num_az_idx[p]; i++ ) { - modelEval->BM_fx[add( qp, i )] = L_shl( Mpy_32_32( modelEval->elevBfVec_fx[p], modelEval->azimBfVec_fx[p][i] ), 1 ); /*Q30 - ( Q30 * 2 - 31 )*/ // Q30 + modelEval->BM_fx[qp + i] = Mpy_32_32( expt, modelEval->azimBfVec_fx[p][i] ); /*Q30 - ( Q30 * 2 - 31 )*/ // Q30 move32(); - BM_idx[add( qp, i )] = add( model->azim_start_idx[EvIdx[p]], AzIdx[p][i] ); + BM_idx[qp + i] = add( model->azim_start_idx[EvIdx[p]], AzIdx[p][i] ); move16(); } qp = add( qp, num_az_idx[p] ); } + Word16 expL = add( model->AlphaL_e, 1 ); + Word16 expR = add( model->AlphaR_e, 1 ); + BMEnergiesL_e = add( model->EL_e, 2 ); + BMEnergiesR_e = add( model->ER_e, 2 ); + /* Compute HR filters, approximate optimized model evaluation */ FOR( iSec = 0; iSec < HRTF_MODEL_N_SECTIONS; iSec++ ) { - ETotL = 0; - move32(); - ETotR = 0; - move32(); - ESynL = 0; - move32(); - ESynR = 0; - move32(); - ETotL_e = 0; - move16(); - ETotR_e = 0; - move16(); - ESynR_e = 0; - move16(); - ESynL_e = 0; - move16(); - - BMEnergiesL_e = add( model->EL_e, 2 ); - BMEnergiesR_e = add( model->ER_e, 2 ); - + Word64 temp1 = 0; + move64(); + Word64 temp2 = 0; + move64(); /* Energy is precalculated part updated with square of BM value. Store index for sorting */ FOR( i = 0; i < qp; i++ ) { - modelEval->BMEnergiesL[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->EL_fx[add( i_mult( iSec, model->AlphaN ), BM_idx[i] )] ); // exp: model->EL_e + 2 - modelEval->BMEnergiesR[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->ER_fx[add( i_mult( iSec, model->AlphaN ), BM_idx[i] )] ); // exp: model->ER_e + 2 + modelEval->BMEnergiesL[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->EL_fx[( iSec * model->AlphaN ) + BM_idx[i]] ); // exp: model->EL_e + 2 + modelEval->BMEnergiesR[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->ER_fx[( iSec * model->AlphaN ) + BM_idx[i]] ); // exp: model->ER_e + 2 move32(); move32(); modelEval->BMEnergiesL[i].i = i; move16(); modelEval->BMEnergiesR[i].i = i; move16(); - - ETotL = BASOP_Util_Add_Mant32Exp( ETotL, ETotL_e, modelEval->BMEnergiesL[i].val_fx, BMEnergiesL_e, &ETotL_e ); - ETotR = BASOP_Util_Add_Mant32Exp( ETotR, ETotR_e, modelEval->BMEnergiesR[i].val_fx, BMEnergiesR_e, &ETotR_e ); + temp1 = W_add( temp1, modelEval->BMEnergiesL[i].val_fx ); // BMEnergiesL_e + temp2 = W_add( temp2, modelEval->BMEnergiesR[i].val_fx ); // BMEnergiesR_e } + ETotL_e = W_norm( temp1 ); + ETotL_e = sub( ETotL_e, 32 ); + ETotL = W_shl_sat_l( temp1, ETotL_e ); + ETotL_e = sub( BMEnergiesL_e, ETotL_e ); + + ETotR_e = W_norm( temp2 ); + ETotR_e = sub( ETotR_e, 32 ); + ETotR = W_shl_sat_l( temp2, ETotR_e ); + ETotR_e = sub( BMEnergiesR_e, ETotR_e ); /* Number of basis components actually used. */ p = s_min( HRTF_MODEL_N_CPTS_VAR[iSec], qp ); SkipSmallest_ValueIndex_fx( modelEval->UseIndsL, modelEval->BMEnergiesL, qp, sub( qp, p ) ); SkipSmallest_ValueIndex_fx( modelEval->UseIndsR, modelEval->BMEnergiesR, qp, sub( qp, p ) ); + temp1 = 0; + move64(); + temp2 = 0; + move64(); + /* Account for lost energy */ FOR( i = 0; i < p; i++ ) { - ESynL = BASOP_Util_Add_Mant32Exp( ESynL, ESynL_e, modelEval->BMEnergiesL[modelEval->UseIndsL[i]].val_fx, BMEnergiesL_e, &ESynL_e ); - ESynR = BASOP_Util_Add_Mant32Exp( ESynR, ESynR_e, modelEval->BMEnergiesR[modelEval->UseIndsR[i]].val_fx, BMEnergiesR_e, &ESynR_e ); + temp1 = W_add( temp1, modelEval->BMEnergiesL[modelEval->UseIndsL[i]].val_fx ); // BMEnergiesL_e + temp2 = W_add( temp2, modelEval->BMEnergiesR[modelEval->UseIndsR[i]].val_fx ); // BMEnergiesR_e } + ESynL_e = W_norm( temp1 ); + ESynL_e = sub( ESynL_e, 32 ); + ESynL = W_shl_sat_l( temp1, ESynL_e ); + ESynL_e = sub( BMEnergiesL_e, ESynL_e ); + ESynL = BASOP_Util_Add_Mant32Exp( ESynL, ESynL_e, EPSILON_FX_M, EPSILON_FX_E, &ESynL_e ); + + ESynR_e = W_norm( temp2 ); + ESynR_e = sub( ESynR_e, 32 ); + ESynR = W_shl_sat_l( temp2, ESynR_e ); + ESynR_e = sub( BMEnergiesR_e, ESynR_e ); + ESynR = BASOP_Util_Add_Mant32Exp( ESynR, ESynR_e, EPSILON_FX_M, EPSILON_FX_E, &ESynR_e ); + tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( ETotL, ESynL, &ScaleL_e ) ); ScaleL_e = add( ScaleL_e, sub( ETotL_e, ESynL_e ) ); ScaleL = Sqrt32( tmp32, &ScaleL_e ); + ScaleL_e = sub( ScaleL_e, 1 ); tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( ETotR, ESynR, &ScaleR_e ) ); ScaleR_e = add( ScaleR_e, sub( ETotR_e, ESynR_e ) ); ScaleR = Sqrt32( tmp32, &ScaleR_e ); + ScaleR_e = sub( ScaleR_e, 1 ); /* Build using only the most energetic components. */ FOR( k = model->iSecFirst[iSec]; k <= model->iSecLast[iSec]; k++ ) { - modelEval->hrfModL_fx[k] = 0; - move32(); - modelEval->hrfModR_fx[k] = 0; + temp1 = 0; + move64(); + temp2 = 0; + move64(); + + FOR( i = 0; i < p; i++ ) + { + temp1 = W_add( temp1, Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i], model->AlphaL_fx[BM_idx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i] + ( model->AlphaN * k )] ) ); // add(model->AlphaL_e, 1) + temp2 = W_add( temp2, Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i], model->AlphaR_fx[BM_idx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i] + ( model->AlphaN * k )] ) ); // add(model->AlphaR_e, 1) + } + + tmp_hrfModL_e = W_norm( temp1 ); + tmp_hrfModL_e = sub( tmp_hrfModL_e, 32 ); + modelEval->hrfModL_fx[k] = W_shl_sat_l( temp1, tmp_hrfModL_e ); move32(); + tmp_hrfModL_e = sub( expL, tmp_hrfModL_e ); + if ( temp1 == 0 ) + { + tmp_hrfModL_e = 0; + move16(); + } - tmp_hrfModL_e = 0; - move16(); - tmp_hrfModR_e = 0; - move16(); + tmp_hrfModR_e = W_norm( temp2 ); + tmp_hrfModR_e = sub( tmp_hrfModR_e, 32 ); + modelEval->hrfModR_fx[k] = W_shl_sat_l( temp2, tmp_hrfModR_e ); + move32(); + tmp_hrfModR_e = sub( expR, tmp_hrfModR_e ); - FOR( i = 0; i < p; i++ ) + if ( temp2 == 0 ) { - index = L_add( BM_idx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i], imult3216( model->AlphaN, k ) ); - tmp32 = Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i], model->AlphaL_fx[index] ); - modelEval->hrfModL_fx[k] = BASOP_Util_Add_Mant32Exp( modelEval->hrfModL_fx[k], tmp_hrfModL_e, tmp32, add( model->AlphaL_e, 1 ), &tmp_hrfModL_e ); - move32(); - index = L_add( BM_idx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i], imult3216( model->AlphaN, k ) ); - tmp32 = Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i], model->AlphaR_fx[index] ); - modelEval->hrfModR_fx[k] = BASOP_Util_Add_Mant32Exp( modelEval->hrfModR_fx[k], tmp_hrfModR_e, tmp32, add( model->AlphaR_e, 1 ), &tmp_hrfModR_e ); - move32(); + tmp_hrfModR_e = 0; + move16(); } + /* Account for lost energy */ modelEval->hrfModL_fx[k] = Mpy_32_32( modelEval->hrfModL_fx[k], ScaleL ); move32(); @@ -355,8 +391,8 @@ static void GenerateFilter_fx( move32(); /* NOTE: Assuming that finally, hrfMod values will be <= 1. Hence making it Q30 */ - modelEval->hrfModL_fx[k] = L_shl( modelEval->hrfModL_fx[k], sub( add( tmp_hrfModL_e, ScaleL_e ), 1 ) ); // assuming Q30 - modelEval->hrfModR_fx[k] = L_shl( modelEval->hrfModR_fx[k], sub( add( tmp_hrfModR_e, ScaleR_e ), 1 ) ); // assuming Q30 + modelEval->hrfModL_fx[k] = L_shl( modelEval->hrfModL_fx[k], add( tmp_hrfModL_e, ScaleL_e ) ); // assuming Q30 + modelEval->hrfModR_fx[k] = L_shl( modelEval->hrfModR_fx[k], add( tmp_hrfModR_e, ScaleR_e ) ); // assuming Q30 move32(); move32(); } @@ -393,9 +429,7 @@ static void GenerateITD_fx( Word16 num_az_idx, num_ev_idx; Word16 BM_idx[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; Word16 itdMod_e; -#ifdef MSAN_FIX set16_fx( AzIdx, 0, HRTF_MODEL_BSPLINE_NUM_COEFFS ); -#endif // MSAN_FIX /* Wrap the requested azimuth to the range of the BSplines */ azim_fx = L_add( azim_fx, model->azimKSeq_fx[0] ); @@ -489,11 +523,12 @@ static void GenerateITD_fx( } ELSE { + Word16 temp_e = add( imult1616( EvIdx[p], model->azimDim3 ), elev_offset ); FOR( i = 0; i < num_az_idx; i++ ) { modelEval->BM_ITD_fx[qp + i] = L_shl( Mpy_32_32( modelEval->elevBfVecITD_fx[p], modelEval->azimBfVecITD_fx[i] ), 1 ); // Q30 move32(); - BM_idx[qp + i] = add( add( imult1616( EvIdx[p], model->azimDim3 ), elev_offset ), AzIdx[i] ); + BM_idx[qp + i] = add( temp_e, AzIdx[i] ); move16(); } qp = add( qp, num_az_idx ); @@ -508,22 +543,23 @@ static void GenerateITD_fx( } /* Matrix multiplcation (row x column) */ - modelEval->itdMod_fx = 0; - move16(); - itdMod_e = 0; - move16(); + Word64 temp = 0; + move64(); + Word16 res_e = add( model->W_e, 1 ); FOR( i = 0; i < qp; i++ ) { - Word16 tmp_e; index = BM_idx[i]; move32(); - modelEval->itdMod_fx = BASOP_Util_Add_Mant32Exp( modelEval->itdMod_fx, itdMod_e, Mpy_32_32( modelEval->BM_ITD_fx[i], model->W_fx[index] ), add( model->W_e, 1 ), &tmp_e ); - itdMod_e = tmp_e; - move16(); + temp = W_add( temp, Mpy_32_32( modelEval->BM_ITD_fx[i], model->W_fx[index] ) ); } + itdMod_e = W_norm( temp ); + itdMod_e = sub( itdMod_e, 32 ); + modelEval->itdMod_fx = W_shl_sat_l( temp, itdMod_e ); + itdMod_e = sub( res_e, itdMod_e ); Word32 tmp32 = Mpy_32_16_1( modelEval->itdMod_fx, model->resamp_factor_fx ); // Q = 31 - ( itdMod_e + 1 ) Word16 tmp_q = sub( 30, itdMod_e ); + IF( tmp_q < 0 ) { tmp32 = L_shr( tmp32, tmp_q ); @@ -536,7 +572,7 @@ static void GenerateITD_fx( tmp_q = 31; move16(); } - modelEval->itdMod_fx = L_negate( round_fixed( tmp32, tmp_q ) ); // Q0 + modelEval->itdMod_fx = L_negate( round_hrFilt_fx( tmp32, tmp_q ) ); // Q0 return; } @@ -586,7 +622,7 @@ static void getPeriodicBSplineSampVec_fx( tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( L_sub( t_fx, azimKSeq_0_fx ), tmp32, &tmp_e2 ) ); tmp_e2 = add( tmp_e2, sub( 9, tmp_e1 ) ); tmp32 = L_shr( tmp32, sub( 9, tmp_e2 ) ); // Q22 (assuming tmp32 will be in range of Q22) - d0 = extract_l( round_fixed( tmp32, Q22 ) ); + d0 = extract_l( round_hrFilt_fx( tmp32, Q22 ) ); } /* find segment */ @@ -654,7 +690,7 @@ static void getStandardBSplineSampVec_fx( tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( L_sub( t_fx, KSeq_fx[0] ), tmp32, &tmp_e3 ) ); tmp_e3 = add( tmp_e3, sub( 9, tmp_e2 ) ); tmp32 = L_shr( tmp32, sub( 9, tmp_e3 ) ); // Q22 (assuming tmp32 will be in range of Q22) - d0 = extract_l( round_fixed( tmp32, 22 ) ); + d0 = extract_l( round_hrFilt_fx( tmp32, 22 ) ); /* find segment */ nI = 0; @@ -741,6 +777,11 @@ void BSplineModelEvalDealloc_fx( IF( model->modelROM ) { + FOR( i = 0; i < model->num_unique_azim_splines; i++ ) + { + free( model->azimBsShape_dyn_fx[i] ); + } + free( model->azimBsShape_dyn_fx ); free( (void *) model->azimBsShape_fx ); /* void* cast needed to please both gcc and Visual studio compilers. Deallocating const float** should be fine and gcc agrees, but Visual studio complains. */ FOR( i = 0; i < model->elevDim3; i++ ) { diff --git a/lib_rend/ivas_objectRenderer_mix_fx.c b/lib_rend/ivas_objectRenderer_mix_fx.c index 0e61282d474afcbfe1fafe00f76aced101e92bb7..28ee13931346b1418d16bbc945f33fc3765e62a7 100644 --- a/lib_rend/ivas_objectRenderer_mix_fx.c +++ b/lib_rend/ivas_objectRenderer_mix_fx.c @@ -40,20 +40,11 @@ #include "ivas_rom_rend.h" #include "ivas_prot_fx.h" -/*-------------------------------------------------------------------* - * Local constants - *-------------------------------------------------------------------*/ - -#define RESAMPLE_FACTOR_16_48 ( 16.0f / 48.0f ) -#define RESAMPLE_FACTOR_32_48 ( 32.0f / 48.0f ) - -#define RESAMPLE_FACTOR_16_48_FX ( 5461 ) // Q14 -#define RESAMPLE_FACTOR_32_48_FX ( 10922 ) // Q14 - /*------------------------------------------------------------------------- - * Local functions + * Local functions declaration *-------------------------------------------------------------------------*/ + static ivas_error DefaultBSplineModel_fx( TDREND_HRFILT_FiltSet_t *HrFiltSet_p, const Word32 output_Fs ); /*-------------------------------------------------------------------* @@ -153,7 +144,8 @@ void TDREND_MIX_Dealloc_fx( hBinRendererTd->Listener_p = NULL; } /* Dealloc HR filter set */ - IF( hBinRendererTd->HrFiltSet_p != NULL ) + test(); + IF( ( *hBinRendererTd->pHrFiltSet_p != NULL ) && ( hBinRendererTd->HrFiltSet_p != NULL ) ) { IF( EQ_16( hBinRendererTd->HrFiltSet_p->FilterMethod, TDREND_HRFILT_Method_BSplineModel ) ) { @@ -182,8 +174,31 @@ void TDREND_MIX_Dealloc_fx( hBinRendererTd->HrFiltSet_p->RightFiltSet_p_fx = NULL; } } - free( hBinRendererTd->HrFiltSet_p ); - hBinRendererTd->HrFiltSet_p = NULL; + + IF( hBinRendererTd->HrFiltSet_p->ModelParams.modelROM ) + { + IF( hBinRendererTd->HrFiltSet_p->ModelParams.UseItdModel ) + { + free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.elevKSeq_dyn_fx ); + free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.azimKSeq_dyn_fx ); + free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.W_dyn_fx ); + free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.azimBsShape_dyn_fx ); + free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.elevBsShape_dyn_fx ); + } + free( hBinRendererTd->HrFiltSet_p->ModelParams.elevKSeq_dyn_fx ); + free( hBinRendererTd->HrFiltSet_p->ModelParams.AlphaL_dyn_fx ); + free( hBinRendererTd->HrFiltSet_p->ModelParams.AlphaR_dyn_fx ); + + free( hBinRendererTd->HrFiltSet_p->ModelParams.elevBsShape_dyn_fx ); + } + + + IF( EQ_16( hBinRendererTd->HrFiltSet_p->ModelParams.modelROM, 1 ) ) + { + free( hBinRendererTd->HrFiltSet_p ); + hBinRendererTd->HrFiltSet_p = NULL; + *hBinRendererTd->pHrFiltSet_p = NULL; + } } return; @@ -247,6 +262,9 @@ ivas_error TDREND_MIX_Init_fx( { hBinRendererTd->HrFiltSet_p = *hHrtfTD; } + + hBinRendererTd->pHrFiltSet_p = hHrtfTD; + IF( NE_32( hBinRendererTd->HrFiltSet_p->SampleRate, output_Fs ) ) { return ( IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "The sampling rate for the HR filter set does not match the output sampling rate.\n" ) ); @@ -305,8 +323,6 @@ ivas_error TDREND_MIX_AddSrc_fx( TDREND_SRC_t *Src_p; ivas_error error; - error = IVAS_ERR_OK; - move32(); /* Get unique source index */ *SrcInd = add( hBinRendererTd->MaxSrcInd, 1 ); // Q0 move16(); @@ -349,9 +365,10 @@ ivas_error TDREND_MIX_AddSrc_fx( } } - return error; + return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * BSplineModelEvalAlloc() * @@ -392,111 +409,94 @@ static ivas_error DefaultBSplineModel_fx( ModelParamsITD_t *modelITD; Word16 i, j; ivas_error error; + Word16 azimSegSamples; HrFiltSet_p->FilterMethod = TDREND_HRFILT_Method_BSplineModel; move16(); model = &( HrFiltSet_p->ModelParams ); modelITD = &( HrFiltSet_p->ModelParamsITD ); - SWITCH( output_Fs ) - { - case 48000: - HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_48kHz_fx; // Q23 - HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_48kHz_fx; // Q23 - HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_48kHz_fx; // Q23 - BREAK; - case 32000: - HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_32kHz_fx; // Q23 - HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_32kHz_fx; // Q23 - HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_32kHz_fx; // Q23 - BREAK; - case 16000: - HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_16kHz_fx; // Q23 - HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_16kHz_fx; // Q23 - HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_16kHz_fx; // Q23 - BREAK; - } /* Set ROM flag for correct deallocation */ model->modelROM = TRUE; move16(); - /* int16_t parameters */ - model->UseItdModel = 1; // Q0 - move16(); - model->SplineDegree = 4; // Q0 - move16(); - model->elevDim2 = 17; // Q0 - move16(); - model->elevDim3 = 15; // Q0 - move16(); - model->AlphaN = 470; // Q0 - move16(); - model->num_unique_azim_splines = 1; // Q0 - move16(); - model->elevSegSamples = 4; // Q0 - move16(); - model->elevBsLen[0] = 5; // Q0 - move16(); - model->elevBsLen[1] = 9; // Q0 - move16(); - model->elevBsLen[2] = 13; // Q0 + model->UseItdModel = defaultHRIR_rom_model_configuration[0]; // Q0 move16(); - model->elevBsLen[3] = 9; // Q0 + model->elevDim3 = defaultHRIR_rom_model_configuration[1]; // Q0 move16(); - model->elevBsStart[0] = 0; // Q0 + model->AlphaN = defaultHRIR_rom_model_configuration[2]; // Q0 move16(); - model->elevBsStart[1] = 5; // Q0 + model->num_unique_azim_splines = defaultHRIR_rom_model_configuration[3]; // Q0 move16(); - model->elevBsStart[2] = 14; // Q0 + model->elevSegSamples = defaultHRIR_rom_model_configuration[4]; // Q0 move16(); - model->elevBsStart[3] = 27; // Q0 - move16(); - - model->azimDim2 = defaultHRIR_rom_azimDim2; // Q0 + model->elevBsLen = defaultHRIR_rom_elevBsLen; // Q0 + model->elevBsStart = defaultHRIR_rom_elevBsStart; // Q0 model->azimDim3 = defaultHRIR_rom_azimDim3; // Q0 model->azim_start_idx = defaultHRIR_rom_azim_start_idx; // Q0 model->azimSegSamples = defaultHRIR_rom_azimSegSamples; // Q0 model->azimShapeIdx = defaultHRIR_rom_azimShapeIdx; // Q0 model->azimShapeSampFactor = defaultHRIR_rom_azimShapeSampFactor; // Q0 - model->elevKSeq_fx = defaultHRIR_rom_elevKSeq_fx; // Q22 - model->elevBsShape_fx = (const Word32 *) defaultHRIR_rom_elevBsShape_fx; // Q30 + model->elevKSeq_dyn_fx = (Word32 *) malloc( ( model->elevDim3 - 2 ) * sizeof( Word32 ) ); + IF( model->elevKSeq_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_rom_elevKSeq_fx, model->elevKSeq_dyn_fx, ( model->elevDim3 - 2 ), Q22 - defaultHRIR_rom_elevKSeq_Q_fx ); // Q22 + model->elevKSeq_fx = model->elevKSeq_dyn_fx; + + model->elevBsShape_dyn_fx = (Word32 *) malloc( sizeof( defaultHRIR_rom_elevBsShape_fx ) * sizeof( Word32 ) / sizeof( Word16 ) ); + IF( model->elevBsShape_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_rom_elevBsShape_fx, model->elevBsShape_dyn_fx, sizeof( defaultHRIR_rom_elevBsShape_fx ) / sizeof( Word16 ), Q30 - defaultHRIR_rom_elevBsShape_Q_fx ); // Q30 + model->elevBsShape_fx = model->elevBsShape_dyn_fx; IF( ( model->azimBsShape_fx = (const Word32 **) malloc( model->num_unique_azim_splines * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } - model->azimBsShape_fx[0] = defaultHRIR_rom_azimBsShape_fx; // Q30 - IF( ( model->azimKSeq_fx = (Word32 **) malloc( 18 * sizeof( Word32 * ) ) ) == NULL ) + model->azimBsShape_dyn_fx = (Word32 **) malloc( sizeof( Word32 * ) ); + IF( model->azimBsShape_dyn_fx == NULL ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } - IF( ( model->azimKSeq_fx[0] = (Word32 *) malloc( 2 * sizeof( Word32 * ) ) ) == NULL ) + model->azimBsShape_dyn_fx[0] = (Word32 *) malloc( sizeof( defaultHRIR_rom_azimBsShape_fx ) * sizeof( Word32 ) / sizeof( Word16 ) ); + IF( model->azimBsShape_dyn_fx[0] == NULL ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } - IF( ( model->azimKSeq_fx[model->elevDim3 - 1] = (Word32 *) malloc( 2 * sizeof( Word32 * ) ) ) == NULL ) + Copy_Scale_sig_16_32_r( defaultHRIR_rom_azimBsShape_fx, model->azimBsShape_dyn_fx[0], sizeof( defaultHRIR_rom_azimBsShape_fx ) / sizeof( Word16 ), Q30 - defaultHRIR_rom_azimBsShape_Q_fx ); // Q30 + model->azimBsShape_fx[0] = model->azimBsShape_dyn_fx[0]; + + IF( ( model->azimKSeq_fx = (Word32 **) malloc( model->elevDim3 * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } - model->azimKSeq_fx[0][0] = 0; - model->azimKSeq_fx[model->elevDim3 - 1][0] = 0; - model->azimKSeq_fx[0][1] = 360 << Q22; // Q22 - model->azimKSeq_fx[model->elevDim3 - 1][1] = 360 << Q22; // Q22 - move32(); - move32(); - move32(); - move32(); - FOR( i = 1; i < sub( model->elevDim3, 1 ); i++ ) + FOR( i = 0; i < model->elevDim3; i++ ) { - IF( ( model->azimKSeq_fx[i] = (Word32 *) malloc( model->azimDim2[i] * sizeof( Word32 * ) ) ) == NULL ) /* azimDim2[i] = 91, i=2..15 */ + if ( ( model->azimKSeq_fx[i] = (Word32 *) malloc( ( model->azimDim3[i] + 1 ) * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } - FOR( j = 0; j < model->azimDim2[i]; j++ ) + + IF( LT_16( model->azimShapeIdx[i], 0 ) ) { - model->azimKSeq_fx[i][j] = L_shl( L_mult0( defaultHRIR_rom_azimSegSamples[0], j ), Q22 ); // Q22 + azimSegSamples = 360; + } + ELSE + { + azimSegSamples = defaultHRIR_rom_azimSegSamples[model->azimShapeIdx[i]]; // Q0 + } + move16(); + + assert( azimSegSamples == 360 / model->azimDim3[i] ); + FOR( j = 0; j < model->azimDim3[i] + 1; j++ ) + { + model->azimKSeq_fx[i][j] = L_shl_r( L_mult0( defaultHRIR_rom_azimSegSamples[0], j ), Q22 ); // Q22 move32(); } } @@ -504,19 +504,33 @@ static ivas_error DefaultBSplineModel_fx( SWITCH( output_Fs ) { case 48000: - model->AlphaL_fx = (const Word32 *) defaultHRIR_rom_AlphaL48_fx; // Q30 - model->AlphaL_e = 1; + model->AlphaL_dyn_fx = (Word32 *) malloc( 60160 * sizeof( Word32 ) ); + if ( model->AlphaL_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_rom_AlphaL48_fx, model->AlphaL_dyn_fx, 30080, Q30 - defaultHRIR_rom_Alpha48_Q_fx ); // Q30 + Copy_Scale_sig_16_32_r( &defaultHRIR_rom_AlphaL48_fx[30080], &model->AlphaL_dyn_fx[30080], 30080, Q30 - defaultHRIR_rom_Alpha48_Q_fx ); // Q30 + model->AlphaL_fx = model->AlphaL_dyn_fx; + model->AlphaL_e = Q15 - defaultHRIR_rom_Alpha48_Q_fx; move16(); - model->AlphaR_fx = (const Word32 *) defaultHRIR_rom_AlphaR48_fx; // Q30 - model->AlphaR_e = 1; + model->AlphaR_dyn_fx = (Word32 *) malloc( 60160 * sizeof( Word32 ) ); + if ( model->AlphaR_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_rom_AlphaR48_fx, model->AlphaR_dyn_fx, 30080, Q30 - defaultHRIR_rom_Alpha48_Q_fx ); // Q22 + Copy_Scale_sig_16_32_r( &defaultHRIR_rom_AlphaR48_fx[30080], &model->AlphaR_dyn_fx[30080], 30080, Q30 - defaultHRIR_rom_Alpha48_Q_fx ); // Q22 + model->AlphaR_fx = model->AlphaR_dyn_fx; + model->AlphaR_e = Q15 - defaultHRIR_rom_Alpha48_Q_fx; move16(); model->EL_fx = (const Word32 *) defaultHRIR_rom_EL48_fx; // Q28 - model->EL_e = 3; + model->EL_e = Q31 - defaultHRIR_rom_E48_Q_fx; move16(); model->ER_fx = (const Word32 *) defaultHRIR_rom_ER48_fx; // Q28 - model->ER_e = 3; + model->ER_e = Q31 - defaultHRIR_rom_E48_Q_fx; move16(); - model->K = 128; // Q0 + model->K = defaultHRIR_rom_model_configuration[5]; // Q0 move16(); IF( HrFiltSet_p->ModelParams.UseItdModel ) { @@ -525,19 +539,33 @@ static ivas_error DefaultBSplineModel_fx( } BREAK; case 32000: - model->AlphaL_fx = (const Word32 *) defaultHRIR_rom_AlphaL32_fx; // Q30 - model->AlphaL_e = 1; + model->AlphaL_dyn_fx = (Word32 *) malloc( 40420 * sizeof( Word32 ) ); + if ( model->AlphaL_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_rom_AlphaL32_fx, model->AlphaL_dyn_fx, 20210, Q30 - defaultHRIR_rom_Alpha32_Q_fx ); // Q22 + Copy_Scale_sig_16_32_r( &defaultHRIR_rom_AlphaL32_fx[20210], &model->AlphaL_dyn_fx[20210], 20210, Q30 - defaultHRIR_rom_Alpha32_Q_fx ); // Q22 + model->AlphaL_fx = model->AlphaL_dyn_fx; + model->AlphaL_e = Q15 - defaultHRIR_rom_Alpha32_Q_fx; move16(); - model->AlphaR_fx = (const Word32 *) defaultHRIR_rom_AlphaR32_fx; // Q30 - model->AlphaR_e = 1; + model->AlphaR_dyn_fx = (Word32 *) malloc( 40420 * sizeof( Word32 ) ); + if ( model->AlphaR_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_rom_AlphaR32_fx, model->AlphaR_dyn_fx, 20210, Q30 - defaultHRIR_rom_Alpha32_Q_fx ); // Q22 + Copy_Scale_sig_16_32_r( &defaultHRIR_rom_AlphaR32_fx[20210], &model->AlphaR_dyn_fx[20210], 20210, Q30 - defaultHRIR_rom_Alpha32_Q_fx ); // Q22 + model->AlphaR_fx = model->AlphaR_dyn_fx; + model->AlphaR_e = Q15 - defaultHRIR_rom_Alpha32_Q_fx; move16(); model->EL_fx = (const Word32 *) defaultHRIR_rom_EL32_fx; // Q28 - model->EL_e = 3; + model->EL_e = Q31 - defaultHRIR_rom_E32_Q_fx; move16(); model->ER_fx = (const Word32 *) defaultHRIR_rom_ER32_fx; // Q28 - model->ER_e = 3; + model->ER_e = Q31 - defaultHRIR_rom_E32_Q_fx; move16(); - model->K = 86; // Q0 + model->K = ( RESAMPLE_FACTOR_32_48_FX * defaultHRIR_rom_model_configuration[5] + ( 1 << 14 ) - 1 ) >> 14; // Q0 move16(); IF( HrFiltSet_p->ModelParams.UseItdModel ) { @@ -546,19 +574,31 @@ static ivas_error DefaultBSplineModel_fx( } BREAK; case 16000: - model->AlphaL_fx = (const Word32 *) defaultHRIR_rom_AlphaL16_fx; // Q30 - model->AlphaL_e = 1; + model->AlphaL_dyn_fx = (Word32 *) malloc( 20210 * sizeof( Word32 ) ); + if ( model->AlphaL_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_rom_AlphaL16_fx, model->AlphaL_dyn_fx, 20210, Q30 - defaultHRIR_rom_Alpha16_Q_fx ); // Q22 + model->AlphaL_fx = model->AlphaL_dyn_fx; + model->AlphaL_e = Q15 - defaultHRIR_rom_Alpha16_Q_fx; move16(); - model->AlphaR_fx = (const Word32 *) defaultHRIR_rom_AlphaR16_fx; // Q30 - model->AlphaR_e = 1; + model->AlphaR_dyn_fx = (Word32 *) malloc( 20210 * sizeof( Word32 ) ); + if ( model->AlphaR_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_rom_AlphaR16_fx, model->AlphaR_dyn_fx, 20210, Q30 - defaultHRIR_rom_Alpha16_Q_fx ); // Q22 + model->AlphaR_fx = model->AlphaR_dyn_fx; + model->AlphaR_e = Q15 - defaultHRIR_rom_Alpha16_Q_fx; move16(); model->EL_fx = (const Word32 *) defaultHRIR_rom_EL16_fx; // Q28 - model->EL_e = 3; + model->EL_e = Q31 - defaultHRIR_rom_E16_Q_fx; move16(); model->ER_fx = (const Word32 *) defaultHRIR_rom_ER16_fx; // Q28 - model->ER_e = 3; + model->ER_e = Q31 - defaultHRIR_rom_E16_Q_fx; move16(); - model->K = 43; // Q0 + model->K = ( RESAMPLE_FACTOR_16_48_FX * defaultHRIR_rom_model_configuration[5] + ( 1 << 14 ) - 1 ) >> 14; // Q0 move16(); IF( HrFiltSet_p->ModelParams.UseItdModel ) { @@ -570,67 +610,66 @@ static ivas_error DefaultBSplineModel_fx( BREAK; } - modelITD->N = 4; // Q0 - move16(); - modelITD->elevDim2 = 20; // Q0 - move16(); - modelITD->elevDim3 = 18; // Q0 - move16(); - modelITD->azimDim2 = 41; // Q0 - move16(); - modelITD->azimDim3 = 41; // Q0 - move16(); - modelITD->elevSegSamples = 3; // Q0 + modelITD->elevDim3 = defaultHRIR_rom_ITD_model_configuration[0]; move16(); - modelITD->elevBsLen[0] = 4; // Q0 + modelITD->azimDim3 = defaultHRIR_rom_ITD_model_configuration[1]; move16(); - modelITD->elevBsLen[1] = 7; // Q0 + modelITD->elevSegSamples = defaultHRIR_rom_ITD_model_configuration[2]; move16(); - modelITD->elevBsLen[2] = 10; // Q0 + modelITD->azimSegSamples = defaultHRIR_rom_ITD_model_configuration[3]; move16(); - modelITD->elevBsLen[3] = 7; // Q0 - move16(); - modelITD->elevBsStart[0] = 0; // Q0 - move16(); - modelITD->elevBsStart[1] = 4; // Q0 - move16(); - modelITD->elevBsStart[2] = 11; // Q0 - move16(); - modelITD->elevBsStart[3] = 21; // Q0 - move16(); - modelITD->elevKSeq_fx = defaultHRIR_rom_ITD_elevKSeq_fx; // Q22 + modelITD->elevBsLen = defaultHRIR_rom_ITD_elevBsLen; + modelITD->elevBsStart = defaultHRIR_rom_ITD_elevBsStart; - modelITD->azimBsLen[0] = 11; // Q0 - move16(); - modelITD->azimBsLen[1] = 21; // Q0 - move16(); - modelITD->azimBsLen[2] = 31; // Q0 - move16(); - modelITD->azimBsLen[3] = 21; // Q0 - move16(); - modelITD->azimBsStart[0] = 0; // Q0 - move16(); - modelITD->azimBsStart[1] = 11; // Q0 - move16(); - modelITD->azimBsStart[2] = 32; // Q0 - move16(); - modelITD->azimBsStart[3] = 63; // Q0 - move16(); + modelITD->elevKSeq_dyn_fx = (Word32 *) malloc( sizeof( defaultHRIR_rom_ITD_elevKSeq_fx ) * sizeof( Word32 ) / sizeof( Word16 ) ); + IF( modelITD->elevKSeq_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_rom_ITD_elevKSeq_fx, modelITD->elevKSeq_dyn_fx, sizeof( defaultHRIR_rom_ITD_elevKSeq_fx ) / sizeof( Word16 ), Q22 - defaultHRIR_rom_ITD_elevKSeq_Q_fx ); // Q22 - modelITD->azimSegSamples = 10; // Q0 - move16(); - modelITD->azimKSeq_fx = defaultHRIR_rom_ITD_azimKSeq_fx; // Q22 - modelITD->W_fx = (const Word32 *) defaultHRIR_rom_ITD_W_fx; // Q25 - modelITD->W_e = 6; + modelITD->elevKSeq_fx = modelITD->elevKSeq_dyn_fx; + + modelITD->azimBsLen = defaultHRIR_rom_ITD_azimBsLen; + modelITD->azimBsStart = defaultHRIR_rom_ITD_azimBsStart; + + modelITD->azimKSeq_dyn_fx = (Word32 *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( Word32 ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */ + IF( modelITD->azimKSeq_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_rom_ITD_azimKSeq_fx, modelITD->azimKSeq_dyn_fx, ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ), Q22 - defaultHRIR_rom_ITD_azimKSeq_Q_fx ); // Q22 + modelITD->azimKSeq_fx = modelITD->azimKSeq_dyn_fx; + modelITD->W_dyn_fx = (Word32 *) malloc( sizeof( defaultHRIR_rom_ITD_W_fx ) * sizeof( Word32 ) / sizeof( Word16 ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */ + IF( modelITD->W_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_rom_ITD_W_fx, modelITD->W_dyn_fx, sizeof( defaultHRIR_rom_ITD_W_fx ) / sizeof( Word16 ), Q25 - defaultHRIR_rom_ITD_W_Q_fx ); // Q22 + modelITD->W_fx = modelITD->W_dyn_fx; + modelITD->W_e = Q15 - defaultHRIR_rom_ITD_W_Q_fx; move16(); - modelITD->azimBsShape_fx = defaultHRIR_rom_ITD_azimBsShape_fx; // Q30 - modelITD->elevBsShape_fx = defaultHRIR_rom_ITD_elevBsShape_fx; // Q30 + modelITD->azimBsShape_dyn_fx = (Word32 *) malloc( sizeof( defaultHRIR_rom_ITD_azimBsShape_fx ) * sizeof( Word32 ) / sizeof( Word16 ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */ + IF( modelITD->azimBsShape_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_rom_ITD_azimBsShape_fx, modelITD->azimBsShape_dyn_fx, sizeof( defaultHRIR_rom_ITD_azimBsShape_fx ) / sizeof( Word16 ), Q30 - defaultHRIR_rom_ITD_azimBsShape_Q_fx ); // Q22 + modelITD->azimBsShape_fx = modelITD->azimBsShape_dyn_fx; + modelITD->elevBsShape_dyn_fx = (Word32 *) malloc( sizeof( defaultHRIR_rom_ITD_elevBsShape_fx ) * sizeof( Word32 ) / sizeof( Word16 ) ); + IF( modelITD->elevBsShape_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + Copy_Scale_sig_16_32_r( defaultHRIR_rom_ITD_elevBsShape_fx, modelITD->elevBsShape_dyn_fx, sizeof( defaultHRIR_rom_ITD_elevBsShape_fx ) / sizeof( Word16 ), Q30 - defaultHRIR_rom_ITD_elevBsShape_Q_fx ); // Q22 + modelITD->elevBsShape_fx = modelITD->elevBsShape_dyn_fx; HRTF_model_precalc( model ); HrFiltSet_p->latency_s_fx = defaultHRIR_rom_latency_s_fx; // Q31 move32(); - HrFiltSet_p->SampleRate = output_Fs; // Q0 + HrFiltSet_p->latency_s_Q_fx = sub( Q31, defaultHRIR_rom_latency_s_Q_fx ); // Q31 + HrFiltSet_p->SampleRate = output_Fs; // Q0 move32(); HrFiltSet_p->FiltLength = HrFiltSet_p->ModelParams.K; // Q0 move16(); diff --git a/lib_rend/ivas_objectRenderer_sfx_fx.c b/lib_rend/ivas_objectRenderer_sfx_fx.c index 210706d5be5ff42adb52c59029465e96f58dfdcf..361cc403d19ccad22d98321d5b7c5da190877b9d 100644 --- a/lib_rend/ivas_objectRenderer_sfx_fx.c +++ b/lib_rend/ivas_objectRenderer_sfx_fx.c @@ -191,6 +191,7 @@ static void sincResample_fx( Word16 t_step_e; Word32 t_frac_fx; Word16 t_frac_e; + Word64 t_frac_fx_acc; Word64 tmp64_fx; // Qx + 32 const Word32 *p_mid_fx; const Word32 *p_forward_fx; @@ -212,6 +213,8 @@ static void sincResample_fx( /* Compute fractional time step */ t_step_fx = L_deposit_h( BASOP_Util_Divide1616_Scale( length_in, length_out, &t_step_e ) ); // exp(t_step_e) + t_frac_fx_acc = 0; + move64(); t_frac_fx = 0; move32(); t_frac_e = 0; @@ -224,13 +227,13 @@ static void sincResample_fx( t = extract_l( L_shr( t_frac_plus_eps, sub( 31, t_frac_plus_eps_e ) ) ); // Q0 /* Calculate the sinc-index for the center value of the sinc */ - Word32 center_val; Word16 center_val_e; - center_val = BASOP_Util_Add_Mant32Exp( t_frac_plus_eps, t_frac_plus_eps_e, L_negate( L_deposit_h( t ) ), 15, ¢er_val_e ); // exp(center_val_e) - center_val_e = add( center_val_e, 6 ); // center_val * SFX_SPAT_BIN_NUM_SUBSAMPLES (i.e. 64) - center_val = BASOP_Util_Add_Mant32Exp( center_val, center_val_e, ONE_IN_Q29, 1, ¢er_val_e ); // exp(center_val_e) - snc0 = extract_l( L_shr( center_val, sub( 31, center_val_e ) ) ); // Q0 - + Word64 center_val; + center_val = W_sub( t_frac_plus_eps, W_shl( t, s_min( sub( 31, t_frac_plus_eps_e ), 63 ) ) ); // exp( center_val_e ) + center_val_e = add( t_frac_plus_eps_e, 6 ); + Word16 com_e = s_max( 0, center_val_e ); + center_val = W_add( W_shr( center_val, sub( com_e, center_val_e ) ), W_shl( 1, sub( 30, com_e ) ) ); // exp(center_val_e) + snc0 = extract_l( W_shl_sat_l( center_val, sub( com_e, 31 ) ) ); /* Run convolution forward and backward from mid point */ p_mid_fx = input_fx + t; // Qx p_forward_fx = p_mid_fx + 1; // Qx @@ -249,13 +252,16 @@ static void sincResample_fx( p_backward_fx--; // Qx } - tmp64_fx = W_mac_32_32( tmp64_fx, *p_forward_fx, *p_sinc_forward_fx ); /* Integer index always rounded down --> 4 steps backward, 5 steps forward */ // Qx + 32 - output_fx[i] = W_extract_h( tmp64_fx ); // Qx move32(); /* Advance fractional time */ - t_frac_fx = BASOP_Util_Add_Mant32Exp( t_frac_fx, t_frac_e, t_step_fx, t_step_e, &t_frac_e ); // exp( t_frac_fx ) + t_frac_fx_acc = W_add( t_frac_fx_acc, t_step_fx ); // t_step_e + Word16 hdrm = W_norm( t_frac_fx_acc ); + hdrm = sub( hdrm, 32 ); + t_frac_fx = W_shl_sat_l( t_frac_fx_acc, hdrm ); + t_frac_e = sub( t_step_e, hdrm ); + move16(); } return; @@ -278,8 +284,8 @@ void TDREND_firfilt_fx( Word32 *mem_fx, /* i/o: filter memory Qx */ const Word16 subframe_length, /* i : Length of signal Q0 */ const Word16 filterlength, /* i : Filter length Q0 */ - const Word16 Gain_fx, /* i : Gain Q14 */ - const Word16 prevGain_fx /* i : Previous gain Q14 */ + const Word32 Gain_fx, /* i : Gain Q30 */ + const Word32 prevGain_fx /* i : Previous gain Q30 */ ) { /* NOTE: this function is implemented with the assumption that the exponent/Q-factor of input signal will not change. */ @@ -289,29 +295,27 @@ void TDREND_firfilt_fx( Word32 *p_filter_fx; // exp(filter_e) Word16 i, j; Word32 tmp_fx; - Word16 step_fx /* Q15 */, gain_tmp_fx /* Q15 */, gain_delta_fx /* Q14 */; + Word32 step_fx /* Q31 */, gain_tmp_fx /* Q31 */, gain_delta_fx /* Q30 */; Word16 tmp_e; Word64 tmp64_fx; - - gain_delta_fx = sub( Gain_fx, prevGain_fx ); // Q14 - step_fx = BASOP_Util_Divide1616_Scale( gain_delta_fx, subframe_length, &tmp_e ); // exp(tmp_e) - tmp_e = sub( tmp_e, Q14 ); - step_fx = shl_sat( step_fx, tmp_e ); // Q15 - gain_tmp_fx = shl_sat( prevGain_fx, 1 ); // Q15 + Word16 shift = sub( filter_e, 32 ); + gain_delta_fx = L_sub( Gain_fx, prevGain_fx ); // Q30 + step_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( gain_delta_fx, subframe_length, &tmp_e ) ); // exp(tmp_e) + tmp_e = sub( tmp_e, Q30 ); + step_fx = L_shl_sat( step_fx, tmp_e ); // Q31 + gain_tmp_fx = L_shl_sat( prevGain_fx, 1 ); // Q31 /* Handle memory */ - p_signal_fx = buffer_fx + sub( filterlength, 1 ); // Qx - Copy32( mem_fx, buffer_fx, sub( filterlength, 1 ) ); /* Insert memory */ // Qx - Copy32( signal_fx, buffer_fx + sub( filterlength, 1 ), subframe_length ); /* Insert current frame */ // Qx - Copy32( signal_fx + add( sub( subframe_length, filterlength ), 1 ), mem_fx, sub( filterlength, 1 ) ); /* Update memory for next frame */ // Qx + p_signal_fx = buffer_fx + sub( filterlength, 1 ); // Qx + Copy32( mem_fx, buffer_fx, sub( filterlength, 1 ) ); /* Insert memory */ // Qx + Copy32( signal_fx, p_signal_fx, subframe_length ); /* Insert current frame */ // Qx + Copy32( p_signal_fx + add( sub( subframe_length, filterlength ), 1 ), mem_fx, sub( filterlength, 1 ) ); /* Update memory for next frame */ // Qx /* Convolution */ - FOR( i = 0; i < subframe_length; i++ ) + FOR( i = 0; i < intp_count; i++ ) { tmp64_fx = 0; move64(); - tmp_e = 0; - move16(); p_tmp_fx = p_signal_fx + i; // Qx p_filter_fx = filter_fx; // exp(filter_e) @@ -324,17 +328,36 @@ void TDREND_firfilt_fx( } // This is done to keep the output Q same as input Q for signal - tmp64_fx = W_shl( tmp64_fx, filter_e ); // Qx + 32 - tmp_fx = W_extract_h( tmp64_fx ); // Qx + tmp_fx = W_shl_sat_l( tmp64_fx, shift ); // Qx /* Apply linear gain interpolation in case of abrupt gain changes */ - gain_tmp_fx = add( gain_tmp_fx, step_fx ); // Q15 - signal_fx[i] = Mpy_32_16_1( tmp_fx, gain_tmp_fx ); // Qx + gain_tmp_fx = L_add_sat( gain_tmp_fx, step_fx ); /* Saturating values which just exceeds 1, Q31*/ + signal_fx[i] = Mpy_32_32( tmp_fx, gain_tmp_fx ); // Qx move32(); - IF( LT_16( i, intp_count ) ) + v_add_fx( filter_fx, filter_delta_fx, filter_fx, filterlength ); // exp(filter_e) + } + FOR( ; i < subframe_length; i++ ) + { + tmp64_fx = 0; + move64(); + p_tmp_fx = p_signal_fx + i; // Qx + p_filter_fx = filter_fx; // exp(filter_e) + + + FOR( j = 0; j < filterlength; j++ ) { - v_add_fx( filter_fx, filter_delta_fx, filter_fx, filterlength ); // exp(filter_e) + tmp64_fx = W_mac_32_32( tmp64_fx, *p_filter_fx, *p_tmp_fx ); // Qx + (Q31 - filter_e) + 1 + p_filter_fx++; // exp(filter_e) + p_tmp_fx--; // Qx } + + // This is done to keep the output Q same as input Q for signal + tmp_fx = W_shl_sat_l( tmp64_fx, shift ); // Qx + + /* Apply linear gain interpolation in case of abrupt gain changes */ + gain_tmp_fx = L_add_sat( gain_tmp_fx, step_fx ); /* Saturating values which just exceeds 1, Q31*/ + signal_fx[i] = Mpy_32_32( tmp_fx, gain_tmp_fx ); // Qx + move32(); } return; diff --git a/lib_rend/ivas_objectRenderer_sources_fx.c b/lib_rend/ivas_objectRenderer_sources_fx.c index 5787ded3f45254dc9ffa2bd706c747e51a257c52..33c519c8eb5f931bcb7f01f69f2e5ff463239ff1 100644 --- a/lib_rend/ivas_objectRenderer_sources_fx.c +++ b/lib_rend/ivas_objectRenderer_sources_fx.c @@ -48,6 +48,8 @@ static void TDREND_SRC_SPATIAL_Init_fx( TDREND_SRC_SPATIAL_t *SrcSpatial_p, cons static Word16 TDREND_SRC_SPATIAL_GetDirGain_fx( const TDREND_DirAtten_t *DirAtten_p, const Word32 *Front_p_fx, const Word32 *RelPos_p, const Word16 RelPos_p_e ); static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( const TDREND_DistAtten_t *DistAtten_p, const Word32 Dist_fx, const Word16 Dist_e ); static void TDREND_SRC_SPATIAL_SetDirAtten_fx( TDREND_SRC_SPATIAL_t *SrcSpatial_p, const TDREND_DirAtten_t *DirAtten_p ); +static void TDREND_SRC_SPATIAL_SetDistAtten( TDREND_SRC_SPATIAL_t *SrcSpatial_p, const TDREND_DistAtten_t *DistAtten_p ); +static void TDREND_SRC_SPATIAL_SetGain( const TDREND_SRC_t *Src_p, const Word32 Gain ); static ivas_error TDREND_SRC_REND_Alloc( TDREND_SRC_REND_t **SrcRend_pp ); static void TDREND_SRC_SPATIAL_Dealloc( TDREND_SRC_SPATIAL_t *SrcSpatial_p ); @@ -129,11 +131,30 @@ ivas_error TDREND_MIX_SRC_SetDir_fx( } +/*-------------------------------------------------------------------* + * TDREND_MIX_SRC_SetGain() + * + * Set source gain + --------------------------------------------------------------------*/ + +ivas_error TDREND_MIX_SRC_SetGain( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const Word16 SrcInd, /* i : Source index */ + const Word32 Gain /* i : Gain */ +) +{ + TDREND_SRC_SPATIAL_SetGain( hBinRendererTd->Sources[SrcInd], Gain ); + + return IVAS_ERR_OK; +} + + /*-------------------------------------------------------------------* * TDREND_MIX_SRC_SetDirAtten() * * Set directional attenuation for the mixer. --------------------------------------------------------------------*/ + ivas_error TDREND_MIX_SRC_SetDirAtten_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ const Word16 SrcInd, /* i : Source index Q0 */ @@ -154,6 +175,33 @@ ivas_error TDREND_MIX_SRC_SetDirAtten_fx( return IVAS_ERR_OK; } +/*-------------------------------------------------------------------* + * TDREND_MIX_SRC_SetDistAtten() + * + * Set distance attenuation for the mixer. + --------------------------------------------------------------------*/ + +ivas_error TDREND_MIX_SRC_SetDistAtten( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const Word16 SrcInd, /* i : Source index */ + const TDREND_DistAtten_t *DistAtten_p /* i : Distance attenuation specifier */ +) +{ + TDREND_SRC_SPATIAL_t *SrcSpatial_p; + + IF( GT_16( SrcInd, hBinRendererTd->MaxSrcInd ) ) + { + return ( IVAS_ERROR( IVAS_ERR_INVALID_INDEX, "Index exceeds max index\n" ) ); + } + ELSE + { + SrcSpatial_p = hBinRendererTd->Sources[SrcInd]->SrcSpatial_p; + TDREND_SRC_SPATIAL_SetDistAtten( SrcSpatial_p, DistAtten_p ); + } + + return IVAS_ERR_OK; +} + /*-------------------------------------------------------------------* * TDREND_MIX_SRC_SetPlayState() @@ -227,7 +275,7 @@ static void TDREND_SRC_REND_Init_fx( move16(); SrcRend_p->SrcGain_p_fx[nC] = ONE_IN_Q14; // Q14 move16(); - SrcRend_p->SrcGainMax_p_fx[nC] = 32767; /* Q15 */ + SrcRend_p->SrcGainMax_p_fx[nC] = 32767; // TODO: make it 2, this is one in Q15, i thinki, need to change Q for that move16(); } SrcRend_p->SrcGainUpdated = FALSE; @@ -243,6 +291,7 @@ static void TDREND_SRC_REND_Init_fx( return; } + /*-------------------------------------------------------------------* * TDREND_SRC_REND_UpdateFiltersFromSpatialParams() * @@ -253,32 +302,20 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ TDREND_SRC_REND_t *SrcRend_p, /* i/o: Source object */ TDREND_SRC_SPATIAL_t *SrcSpatial_p, /* i : Spatial aspects of source */ - Word32 *hrf_left_prev, - /* i/o: Left filter */ // exp(hrf_left_prev_e) - Word16 *hrf_left_prev_e, - /* i/o: Left filter exponent */ // Q0 - Word32 *hrf_right_prev, - /* i/o: Right filter */ // exp(hrf_right_prev_e) - Word16 *hrf_right_prev_e, - /* i/o: Right filter exponent */ // Q0 - Word32 *hrf_left_delta, - /* o : Left filter interpolation delta */ // exp(hrf_left_delta_e) - Word16 *hrf_left_delta_e, - /* o : Left filter interpolation delta exponent */ // Q0 - Word32 *hrf_right_delta, - /* o : Right filter interpolation delta */ // exp(hrf_right_delta_e) - Word16 *hrf_right_delta_e, - /* o : Right filter interpolation delta exponent */ // Q0 - Word16 *intp_count, - /* o : Interpolation count */ // Q0 - Word16 *filterlength, - /* o : Length of filters */ // Q0 - Word16 *itd, - /* o : ITD value */ // Q0 - Word16 *Gain, - /* o : Gain value */ // Q14 - TDREND_SRC_t *Src_p, /* i/o: Source pointer */ - const Word16 subframe_update_flag ) + Word32 *hrf_left_prev, /* i/o: Left filter exp(hrf_left_prev_e) */ + Word16 *hrf_left_prev_e, /* i/o: Left filter exponent Q0 */ + Word32 *hrf_right_prev, /* i/o: Right filter exp(hrf_right_prev_e) */ + Word16 *hrf_right_prev_e, /* i/o: Right filter exponent Q0 */ + Word32 *hrf_left_delta, /* o : Left filter interpolation delta exp(hrf_left_delta_e) */ + Word16 *hrf_left_delta_e, /* o : Left filter interpolation delta exponent Q0 */ + Word32 *hrf_right_delta, /* o : Right filter interpolation delta exp(hrf_right_delta_e) */ + Word16 *hrf_right_delta_e, /* o : Right filter interpolation delta exponent Q0 */ + Word16 *intp_count, /* o : Interpolation count Q0 */ + Word16 *filterlength, /* o : Length of filters Q0 */ + Word16 *itd, /* o : ITD value Q0 */ + Word32 *Gain, /* o : Gain value Q30 */ + TDREND_SRC_t *Src_p /* i/o: Source pointer */ +) { TDREND_MIX_Listener_t *Listener_p; TDREND_HRFILT_FiltSet_t *HrFiltSet_p; @@ -366,11 +403,11 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( move32(); } - /* Update total gains */ - *Gain = extract_h( L_shl( Mpy_32_32( L_shl( L_mult( *SrcRend_p->SrcGain_p_fx, *SrcRend_p->DirGain_p_fx ), 1 ), L_shl( L_mult( *SrcRend_p->DistGain_p_fx, hBinRendererTd->Gain_fx ), 1 ) ), 1 ) ); // Q14 - move16(); - /* Delta for interpolation, in case the angular step exceeds MAX_ANGULAR_STEP */ + *Gain = L_shl( Mpy_32_32( L_shl( L_mult( *SrcRend_p->SrcGain_p_fx, *SrcRend_p->DirGain_p_fx ), 1 ), L_shl( L_mult( *SrcRend_p->DistGain_p_fx, hBinRendererTd->Gain_fx ), 1 ) ), 1 ); // Q30 + move32(); + + /* Delta for interpolation, in case the angular step exceeds MAX_ANGULAR_STEP=0.01f */ Word32 ele_tmp = Src_p->elev_prev_fx; // Q22 move32(); IF( GT_32( ele_tmp, DEG_180_IN_Q22 ) ) @@ -417,8 +454,8 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( { *itd = 0; // Q0 move16(); - *Gain = ONE_IN_Q14; // Q14 - move16(); + *Gain = ONE_IN_Q30; // Q30 + move32(); set32_fx( hrf_left, 0, *filterlength ); set32_fx( hrf_right, 0, *filterlength ); hrf_left[0] = L_shr( L_add( SrcSpatial_p->Pos_p_fx[1], ONE_IN_Q25 ), 1 ); // Q25 @@ -437,8 +474,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( move16(); } - test(); - IF( ( *intp_count > 0 ) && subframe_update_flag ) + IF( ( *intp_count > 0 ) ) { /* Set deltas for interpolation */ Word16 tmp_e; @@ -458,8 +494,8 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( *hrf_left_delta_e = tmp_e; move16(); - Word32 fac = L_deposit_h( div_s( 1, *intp_count ) ); // Q15 - v_multc_fixed( hrf_left_delta, fac, hrf_left_delta, *filterlength ); // exp(hrf_left_delta_e) + Word32 fac = L_deposit_h( div_s( 1, *intp_count ) ); // Q15 + v_multc_fx( hrf_left_delta, fac, hrf_left_delta, *filterlength ); // exp(hrf_left_delta_e) tmp_e = s_max( *hrf_right_prev_e, hrf_right_e ); FOR( Word16 i = 0; i < *filterlength; i++ ) @@ -477,7 +513,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( *hrf_right_delta_e = tmp_e; move16(); - v_multc_fixed( hrf_right_delta, fac, hrf_right_delta, *filterlength ); // exp(hrf_right_delta_e) + v_multc_fx( hrf_right_delta, fac, hrf_right_delta, *filterlength ); // exp(hrf_right_delta_e) } ELSE { @@ -499,6 +535,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( return; } + /*-------------------------------------------------------------------* * TDREND_SRC_SPATIAL_Alloc() * @@ -573,10 +610,8 @@ static void TDREND_SRC_SPATIAL_Init_fx( TDREND_SPATIAL_VecInit_fx( SrcSpatial_p->Front_p_fx + nC * 3, 0, 0, ONE_IN_Q30 ); /*Assuming Q30*/ } -#ifdef MSAN_FIX SrcSpatial_p->q_Pos_p = Q31; move16(); -#endif /* Source directional attenuation */ SrcSpatial_p->DirAttenEnabled = FALSE; // Q0 @@ -626,6 +661,47 @@ static void TDREND_SRC_SPATIAL_SetDirAtten_fx( return; } + +/*-------------------------------------------------------------------* + * TDREND_SRC_SPATIAL_SetDistAtten() + * + * Sets the distance attenuation. + --------------------------------------------------------------------*/ + +static void TDREND_SRC_SPATIAL_SetDistAtten( + TDREND_SRC_SPATIAL_t *SrcSpatial_p, + const TDREND_DistAtten_t *DistAtten_p ) +{ + /* Set distance attenuation */ + SrcSpatial_p->DistAttenEnabled = TRUE; + SrcSpatial_p->DistAtten.DistAttenModel = DistAtten_p->DistAttenModel; + SrcSpatial_p->DistAtten.MaxDist_fx = DistAtten_p->MaxDist_fx; + SrcSpatial_p->DistAtten.RefDist_fx = DistAtten_p->RefDist_fx; + SrcSpatial_p->DistAtten.RollOffFactor_fx = DistAtten_p->RollOffFactor_fx; + move16(); + move32(); + move32(); + move32(); + + return; +} + +/*-------------------------------------------------------------------* + * TDREND_SRC_SPATIAL_SetGain() + * + * Set the object gain + --------------------------------------------------------------------*/ + +static void TDREND_SRC_SPATIAL_SetGain( + const TDREND_SRC_t *Src_p, /* i : Directional attenuation specification */ + const Word32 Gain /* i : Front-pointing vector */ +) +{ + Src_p->SrcRend_p->SrcGain_p_fx[0] = shl_sat( extract_h( Gain ), Q1 ); // TODO: Check incoming Q-value and fix this + + return; +} + /*-------------------------------------------------------------------* * TDREND_SRC_SPATIAL_GetDirGain() * @@ -633,11 +709,11 @@ static void TDREND_SRC_SPATIAL_SetDirAtten_fx( --------------------------------------------------------------------*/ /*! r: Gain value */ -static Word16 TDREND_SRC_SPATIAL_GetDirGain_fx( /* o : Directional Gain Output Q14 */ - const TDREND_DirAtten_t *DirAtten_p, /* i : Directional attenuation specification */ - const Word32 *Front_p_fx, /* i : Front-pointing vector Q30 */ - const Word32 *RelPos_p_fx, /* i : Relative position */ - const Word16 RelPos_p_e /* i : Relative position exp RelPos_p_e */ +static Word16 TDREND_SRC_SPATIAL_GetDirGain_fx( + const TDREND_DirAtten_t *DirAtten_p, /* i : Directional attenuation specification */ + const Word32 *Front_p_fx, /* i : Front-pointing vector Q30 */ + const Word32 *RelPos_p_fx, /* i : Relative position */ + const Word16 RelPos_p_e /* i : Relative position exp RelPos_p_e */ ) { Word16 DirGain_fx; // Q14 @@ -658,7 +734,7 @@ static Word16 TDREND_SRC_SPATIAL_GetDirGain_fx( Vec_fx[i] = L_negate( RelPos_p_fx[i] ); // exp(RelPos_p_e) move32(); } - ProjCoef_fx = dotp_fixed( Vec_fx, Front_p_fx, 3 ); // exp: RelPos_p_e + 1 + ProjCoef_fx = dotp_fx32( Vec_fx, Front_p_fx, 3 ); // exp: RelPos_p_e + 1 ProjCoef_e = add( RelPos_p_e, 1 ); NormRelPos_fx = TDREND_SPATIAL_VecNorm_fx( RelPos_p_fx, RelPos_p_e, &NormRelPos_e ); // exp(NormRelPos_e) @@ -718,37 +794,40 @@ static Word16 TDREND_SRC_SPATIAL_GetDirGain_fx( --------------------------------------------------------------------*/ /*! r: Gain value */ -static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( /* o : Distance gain Q14 */ - const TDREND_DistAtten_t *DistAtten_p, /* i : Distance attenuation parameters */ - const Word32 Dist_fx, /* i : Distance value Dist_e */ - const Word16 Dist_e /* i : Distance value exp */ +static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( + const TDREND_DistAtten_t *DistAtten_p, /* i : Distance attenuation parameters */ + const Word32 Dist_fx, /* i : Distance value Dist_e */ + const Word16 Dist_e /* i : Distance value exp */ ) { Word16 DistGain_fx; // Q14 Word32 Dist2_fx; Word16 Dist2_e; Word16 tmp_e; - Word16 DistGain_e; Word32 tmp32; Word16 flag; + Word16 Dist_s; + Word16 tmp16; DistGain_fx = ONE_IN_Q14; // Q14 move16(); - DistGain_e = 1; - move16(); Dist2_fx = Dist_fx; move32(); Dist2_e = Dist_e; move16(); + tmp32 = 0; + move32(); + tmp_e = 0; + move16(); SWITCH( DistAtten_p->DistAttenModel ) { case TDREND_DIST_ATTEN_MODEL_INV_DIST: - tmp32 = BASOP_Util_Add_Mant32Exp( Dist2_fx, Dist2_e, L_negate( DistAtten_p->RefDist_fx ), 1, &tmp_e ); // exp: tmp_e - tmp32 = Mpy_32_32( tmp32, DistAtten_p->RollOffFactor_fx ); // exp: 1 + tmp_e - tmp32 = BASOP_Util_Add_Mant32Exp( DistAtten_p->RefDist_fx, 1, tmp32, add( 1, tmp_e ), &tmp_e ); // exp: tmp_e - DistGain_fx = BASOP_Util_Divide3232_Scale( DistAtten_p->RefDist_fx, tmp32, &DistGain_e ); // exp: DistGain_e - DistGain_e = add( DistGain_e, sub( 1, tmp_e ) ); + /* DistGain = powf( DistAtten_p->RefDist / Dist2, DistAtten_p->RollOffFactor ); */ + tmp16 = BASOP_Util_Divide3232_Scale( DistAtten_p->RefDist_fx, Dist2_fx, &Dist_s ); /* tmp16 is Q(15 - Dist_s + Dist2_e - 1) */ + tmp32 = L_deposit_h( tmp16 ); /* tmp32 is Q(31 - Dist_s + Dist2_e - 1) */ + /* tmp32 exponent: 31 - (31 - Dist_s + Dist2_e - 1) = Dist_s - Dist2_e + 1, RollOffFactor_fx exponent: 31 - 30 = 1 */ + tmp32 = BASOP_Util_fPow( tmp32, add( sub( Dist_s, Dist2_e ), 1 ), DistAtten_p->RollOffFactor_fx, 1, &tmp_e ); /* Q(31 - tmp_e) */ BREAK; case TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED: @@ -768,25 +847,33 @@ static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( Dist2_e = 4; move16(); } - tmp32 = BASOP_Util_Add_Mant32Exp( Dist2_fx, Dist2_e, L_negate( DistAtten_p->RefDist_fx ), 1, &tmp_e ); // exp: tmp_e - tmp32 = Mpy_32_32( tmp32, DistAtten_p->RollOffFactor_fx ); // exp: 1 + tmp_e - tmp32 = BASOP_Util_Add_Mant32Exp( DistAtten_p->RefDist_fx, 1, tmp32, add( 1, tmp_e ), &tmp_e ); // exp: tmp_e - DistGain_fx = BASOP_Util_Divide3232_Scale( DistAtten_p->RefDist_fx, tmp32, &DistGain_e ); // exp: DistGain_e - DistGain_e = add( DistGain_e, sub( 1, tmp_e ) ); + /* DistGain = powf( DistAtten_p->RefDist / Dist2, DistAtten_p->RollOffFactor ); */ + tmp16 = BASOP_Util_Divide3232_Scale( DistAtten_p->RefDist_fx, Dist2_fx, &Dist_s ); /* tmp16 is Q(15 - Dist_s + Dist2_e - 1) */ + tmp32 = L_deposit_h( tmp16 ); /* tmp32 is Q(31 - Dist_s + Dist2_e - 1) */ + /* tmp32 exponent: 31 - (31 - Dist_s + Dist2_e - 1) = Dist_s - Dist2_e + 1, RollOffFactor_fx exponent: 31 - 30 = 1 */ + tmp32 = BASOP_Util_fPow( tmp32, add( sub( Dist_s, Dist2_e ), 1 ), DistAtten_p->RollOffFactor_fx, 1, &tmp_e ); /* Q(31 - tmp_e) */ BREAK; } - DistGain_fx = shr( DistGain_fx, sub( 1, DistGain_e ) ); // Reducing it to Q14 + tmp16 = extract_h( L_shr( tmp32, sub( 1, tmp_e ) ) ); // Reducing it to Q14: Go to Q30 and extract_h. right shift by 31-tmp_e-30 = 1-tmp_e + IF( GT_16( tmp16, ONE_IN_Q14 ) ) + { + tmp16 = ONE_IN_Q14; + } + + DistGain_fx = tmp16; return DistGain_fx; } + /*-------------------------------------------------------------------* * TDREND_SRC_Alloc() * * Allocate a source. --------------------------------------------------------------------*/ + ivas_error TDREND_SRC_Alloc( TDREND_SRC_t **Src_pp /* i/o: Source */ ) @@ -794,8 +881,6 @@ ivas_error TDREND_SRC_Alloc( ivas_error error; TDREND_SRC_t *Src_p; - error = IVAS_ERR_OK; - move32(); *Src_pp = NULL; /* Allocate the TDREND_SRC_t variable */ @@ -818,9 +903,10 @@ ivas_error TDREND_SRC_Alloc( *Src_pp = Src_p; - return error; + return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * TDREND_SRC_Dealloc() * @@ -842,13 +928,17 @@ void TDREND_SRC_Dealloc( /* Free the Src_p variable */ free( Src_p ); Src_p = NULL; + return; } + + /*-------------------------------------------------------------------* * TDREND_SRC_Init() * * Initializes a source. --------------------------------------------------------------------*/ + void TDREND_SRC_Init_fx( TDREND_SRC_t *Src_p, /* i/o: Source to initialize */ const TDREND_PosType_t PosType /* i : Position type specifier */ @@ -888,9 +978,10 @@ void TDREND_SRC_Init_fx( move32(); Src_p->elev_prev_fx = 0; // Q22 move32(); - Src_p->Gain_fx = ONE_IN_Q14; // Q14 - move16(); - Src_p->prevGain_fx = ONE_IN_Q14; // Q14 - move16(); + Src_p->Gain_fx = ONE_IN_Q30; // Q30 + move32(); + Src_p->prevGain_fx = ONE_IN_Q30; // Q30 + move32(); + return; } diff --git a/lib_rend/ivas_objectRenderer_vec_fx.c b/lib_rend/ivas_objectRenderer_vec_fx.c index 0d8c11aabc2d1f7bbbca125f01563c194a940636..140861539307a16b008dcd1fc0a29922d844c8b6 100644 --- a/lib_rend/ivas_objectRenderer_vec_fx.c +++ b/lib_rend/ivas_objectRenderer_vec_fx.c @@ -141,12 +141,13 @@ void TDREND_SPATIAL_VecMapToNewCoordSystem_fx( v_sub_32( Vec_p, TranslVec_p, LisRelPosAbs, 3 ); /* Evalute the relative Vec in the coordinates of the Orientation vectors, */ /* which form an orthonormal basis */ - MappedVec_p[0] = dotp_fixed( LisRelPosAbs, DirVec_p, 3 ); // Q: Qy + Qy - Q31 + MappedVec_p[0] = dotp_fx32( LisRelPosAbs, DirVec_p, 3 ); // Q: Qy + Qy - Q31 move32(); - MappedVec_p[1] = dotp_fixed( LisRelPosAbs, RightVec_p, 3 ); // Q: Qy + Qy - Q31 + MappedVec_p[1] = dotp_fx32( LisRelPosAbs, RightVec_p, 3 ); // Q: Qy + Qy - Q31 move32(); - MappedVec_p[2] = dotp_fixed( LisRelPosAbs, UpVec_p, 3 ); // Q: Qy + Qy - Q31 + MappedVec_p[2] = dotp_fx32( LisRelPosAbs, UpVec_p, 3 ); // Q: Qy + Qy - Q31 move32(); + return; } @@ -157,7 +158,6 @@ void TDREND_SPATIAL_VecMapToNewCoordSystem_fx( *-------------------------------------------------------------------*/ /*! r: Flag if the orientation has been updated */ - Word16 TDREND_SPATIAL_EvalOrthonormOrient_fx( Word32 *FrontVecON_p_fx, /* i/o: Normalized front vector Q30 */ Word32 *UpVecON_p_fx, /* i/o: Normalized up vector Q30 */ diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index ba632c6ba13d6c9cb6cfda1d137ad77445dcd078..b95f5500df00136594444fc6f98909eb248c5c35 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -41,14 +41,12 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" - /*------------------------------------------------------------------------- * Local function prototypes *------------------------------------------------------------------------*/ - static void ivas_omasa_dmx_fx( - Word32 data_in_f_fx[][L_FRAME48k], + Word32 data_in_fx[][L_FRAME48k], Word16 *data_in_q, const Word16 input_frame, const Word16 nchan_transport, @@ -58,7 +56,6 @@ static void ivas_omasa_dmx_fx( Word32 prev_gains_fx[][MASA_MAX_TRANSPORT_CHANNELS], const Word16 interpolator_fx[L_FRAME48k] ); - static void ivas_omasa_param_est_ana_fx( OMASA_ANA_HANDLE hOMasa, Word32 data_f_fx[][L_FRAME48k], @@ -74,6 +71,7 @@ static void ivas_omasa_param_est_ana_fx( const Word16 input_frame, const Word16 nchan_ism ); + /*--------------------------------------------------------------------------* * ivas_omasa_ana_open() * @@ -159,6 +157,19 @@ ivas_error ivas_omasa_ana_open( } set_zero_fx( hOMasa->direction_vector_m_fx[i][j], MASA_FREQUENCY_BANDS ); } + IF( ( hOMasa->direction_vector_e[i] = (Word16 **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( Word16 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); + } + + FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + IF( ( hOMasa->direction_vector_e[i][j] = (Word16 *) malloc( MASA_FREQUENCY_BANDS * sizeof( Word16 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); + } + set16_fx( hOMasa->direction_vector_e[i][j], 0, MASA_FREQUENCY_BANDS ); + } } FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) @@ -172,7 +183,8 @@ ivas_error ivas_omasa_ana_open( set_zero_fx( hOMasa->buffer_intensity_real_fx[i][j], MASA_FREQUENCY_BANDS ); } } - + set16_fx( hOMasa->buffer_intensity_real_q, 31, DIRAC_NO_COL_AVG_DIFF ); + set16_fx( hOMasa->buffer_energy_q, 31, DIRAC_NO_COL_AVG_DIFF ); set_zero_fx( hOMasa->buffer_energy_fx, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) @@ -238,7 +250,7 @@ void ivas_omasa_ana_close( FOR( i = 0; i < ( *hOMasa )->num_Cldfb_instances; i++ ) { - deleteCldfb_ivas_fx( &( ( *hOMasa )->cldfbAnaEnc[i] ) ); + deleteCldfb_fx( &( ( *hOMasa )->cldfbAnaEnc[i] ) ); } FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) @@ -249,6 +261,12 @@ void ivas_omasa_ana_close( ( *hOMasa )->direction_vector_m_fx[i][j] = NULL; } + FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( ( *hOMasa )->direction_vector_e[i][j] ); + ( *hOMasa )->direction_vector_e[i][j] = NULL; + } + FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) { free( ( *hOMasa )->buffer_intensity_real_fx[i][j] ); @@ -257,6 +275,9 @@ void ivas_omasa_ana_close( free( ( *hOMasa )->direction_vector_m_fx[i] ); ( *hOMasa )->direction_vector_m_fx[i] = NULL; + + free( ( *hOMasa )->direction_vector_e[i] ); + ( *hOMasa )->direction_vector_e[i] = NULL; } free( ( *hOMasa )->hMasaOut ); @@ -270,20 +291,20 @@ void ivas_omasa_ana_close( return; } + /*--------------------------------------------------------------------------* * ivas_omasa_ana() * * OMASA analysis function *--------------------------------------------------------------------------*/ - void ivas_omasa_ana_fx( - OMASA_ANA_HANDLE hOMasa, /* i/o: OMASA analysis handle */ - Word32 data_in_f_fx[][L_FRAME48k], /* i/o: Input / transport audio signals */ - Word16 *data_in_q, - const Word16 input_frame, /* i : Input frame size */ - const Word16 nchan_transport, /* i : Number of transport channels */ - const Word16 nchan_ism /* i : Number of objects for parameter analysis */ + OMASA_ANA_HANDLE hOMasa, /* i/o: OMASA analysis handle */ + Word32 data_in_fx[][L_FRAME48k], /* i/o: Input / transport audio signals */ + Word16 *data_in_q, /* o : audio signals Q factor */ + const Word16 input_frame, /* i : Input frame size */ + const Word16 nchan_transport, /* i : Number of transport channels */ + const Word16 nchan_ism /* i : Number of objects for parameter analysis */ ) { Word32 elevation_m_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; @@ -294,14 +315,20 @@ void ivas_omasa_ana_fx( Word16 spreadCoherence_q, sorroundingCoherence_q, energyRatio_q; /* Estimate MASA parameters from the objects */ - ivas_omasa_param_est_ana_fx( hOMasa, data_in_f_fx, *data_in_q, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, &energyRatio_q, spreadCoherence_fx, &spreadCoherence_q, surroundingCoherence_fx, &sorroundingCoherence_q, input_frame, nchan_ism ); + ivas_omasa_param_est_ana_fx( hOMasa, data_in_fx, *data_in_q, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, &energyRatio_q, spreadCoherence_fx, &spreadCoherence_q, surroundingCoherence_fx, &sorroundingCoherence_q, input_frame, nchan_ism ); - /* Create MASA metadata buffer from the estimated values */ + /* Add zeros to higher bands in case of lower sampling rates */ + IF( LT_16( hOMasa->nbands, MASA_FREQUENCY_BANDS ) ) + { + ivas_masa_zero_high_bands_fx( hOMasa->nbands, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, spreadCoherence_fx, surroundingCoherence_fx ); + } - ivas_create_masa_out_meta_fx( hOMasa->hMasaOut, hOMasa->sph_grid16, nchan_transport, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, spreadCoherence_fx, surroundingCoherence_fx, energyRatio_q, spreadCoherence_q, sorroundingCoherence_q ); + /* Create MASA metadata buffer from the estimated values */ + ivas_create_masa_out_meta_fx( hOMasa->hMasaOut, hOMasa->sph_grid16, nchan_transport, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, spreadCoherence_fx, surroundingCoherence_fx, Q31, Q31, Q31 ); /* Downmix */ - ivas_omasa_dmx_fx( data_in_f_fx, data_in_q, input_frame, nchan_transport, nchan_ism, hOMasa->ism_azimuth_fx, hOMasa->ism_elevation_fx, hOMasa->prev_object_dm_gains_fx, hOMasa->interpolator_fx ); + ivas_omasa_dmx_fx( data_in_fx, data_in_q, input_frame, nchan_transport, nchan_ism, hOMasa->ism_azimuth_fx, hOMasa->ism_elevation_fx, hOMasa->prev_object_dm_gains_fx, hOMasa->interpolator_fx ); + return; } @@ -311,8 +338,6 @@ void ivas_omasa_ana_fx( *--------------------------------------------------------------------------*/ /* Estimate MASA parameters from the objects */ - - static void ivas_omasa_param_est_ana_fx( OMASA_ANA_HANDLE hOMasa, Word32 data_f_fx[][L_FRAME48k], @@ -332,7 +357,7 @@ static void ivas_omasa_param_est_ana_fx( Word16 num_freq_bins, num_freq_bands, index; Word16 l_ts; - Word32 reference_power_fx[MASA_FREQUENCY_BANDS]; + Word32 reference_power_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; Word32 Chnl_RealBuffer_fx[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; Word16 Chnl_RealBuffer_q[MAX_NUM_OBJECTS]; Word16 Chnl_ImagBuffer_q[MAX_NUM_OBJECTS]; @@ -340,24 +365,20 @@ static void ivas_omasa_param_est_ana_fx( Word32 Foa_RealBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 Foa_ImagBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 intensity_real_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + Word16 intensity_real_q[MASA_FREQUENCY_BANDS]; Word32 direction_vector_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; Word32 diffuseness_vector_fx[MASA_FREQUENCY_BANDS]; Word16 diffuseness_q = 0; move16(); + Word16 diffuseness_e[MASA_FREQUENCY_BANDS]; Word32 diffuseness_m_fx[MASA_FREQUENCY_BANDS]; - Word16 diffuseness_m_q = 0; - move16(); + Word32 renormalization_factor_diff_fx[MASA_FREQUENCY_BANDS]; - Word16 renormalization_factor_diff_q = 0; - move16(); + Word16 renormalization_factor_diff_e[MASA_FREQUENCY_BANDS]; Word32 norm_tmp_fx; - Word16 scale; - Word16 tmp_ener_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - - Word32 dir_v_fx[DIRAC_NUM_DIMS], L_tmp1, L_tmp2; - Word16 dir_v_q, norm_tmp_q; - Word16 foa_q; + Word32 dir_v_fx[DIRAC_NUM_DIMS] /*, L_tmp1, L_tmp2*/; + Word16 dir_v_q /*, norm_tmp_q*/; Word16 band_m_idx, block_m_idx; Word16 mrange[2]; @@ -367,13 +388,10 @@ static void ivas_omasa_param_est_ana_fx( move16(); num_freq_bands = hOMasa->nbands; move16(); - - // l_ts = input_frame / CLDFB_NO_COL_MAX; l_ts = shr( input_frame, 4 ); - move16(); Word16 intensity_q; - Word16 direction_q, reference_power_q; + Word16 reference_power_q; set16_zero_fx( Chnl_RealBuffer_q, MAX_NUM_OBJECTS ); set16_zero_fx( Chnl_ImagBuffer_q, MAX_NUM_OBJECTS ); @@ -381,37 +399,14 @@ static void ivas_omasa_param_est_ana_fx( /* Compute ISM to FOA matrices */ FOR( i = 0; i < nchan_ism; i++ ) { - Word16 tmp, tmp1; - // 180 in Q22 754974720 - hOMasa->chnlToFoaMtx_fx[0][i] = 32767; // 1 in Q15 - move16(); - - tmp = BASOP_Util_Divide3232_Scale( hOMasa->ism_azimuth_fx[i], 754974720, &scale ); - tmp = mult( tmp, EVS_PI_FX ); // Q13 + Q15 - Q15 --> Q13 - tmp = getSinWord16( tmp ); // Q15 sine value - - tmp1 = BASOP_Util_Divide3232_Scale( hOMasa->ism_elevation_fx[i], 754974720, &scale ); - tmp1 = mult( tmp1, EVS_PI_FX ); - tmp1 = getCosWord16( tmp1 ); - hOMasa->chnlToFoaMtx_fx[1][i] = shl( mult( tmp, tmp1 ), 1 ); // Q14 + Q15 - Q15 + Q1 -> Q15 - move16(); - - tmp = BASOP_Util_Divide3232_Scale( hOMasa->ism_elevation_fx[i], 754974720, &scale ); - tmp = mult( tmp, EVS_PI_FX ); // Q13 + Q15 - Q15 --> Q13 - hOMasa->chnlToFoaMtx_fx[2][i] = getSinWord16( tmp ); // Q15 - move16(); - - tmp = BASOP_Util_Divide3232_Scale( hOMasa->ism_azimuth_fx[i], 754974720, &scale ); - tmp = mult( tmp, EVS_PI_FX ); // Q13 + Q15 - Q15 --> Q13 - tmp = getCosWord16( tmp ); // Q14 - - - tmp1 = BASOP_Util_Divide3232_Scale( hOMasa->ism_elevation_fx[i], 754974720, &scale ); - tmp1 = mult( tmp, EVS_PI_FX ); // Q13 + Q15 - Q15 --> Q13 - tmp1 = getCosWord16( tmp ); // Q14 - - hOMasa->chnlToFoaMtx_fx[3][i] = shl( mult( tmp, tmp1 ), 2 ); // Q14 + Q14 - Q15 + Q2-> Q13 + Q2 -> Q15 - move16(); + hOMasa->chnlToFoaMtx_fx[0][i] = ONE_IN_Q31; + move32(); + hOMasa->chnlToFoaMtx_fx[1][i] = L_mult( getSineWord16R2( extract_l( Mpy_32_32( hOMasa->ism_azimuth_fx[i], 46603 /*32767/360*/ ) /*Q22+Q24-31=>Q15*/ ) ), getCosWord16R2( extract_l( Mpy_32_32( hOMasa->ism_elevation_fx[i], 46603 /*2^24/360*/ ) ) ) ); // Q31 + move32(); + hOMasa->chnlToFoaMtx_fx[2][i] = L_shl( getSineWord16R2( extract_l( Mpy_32_32( hOMasa->ism_elevation_fx[i], 46603 /*2^24/360*/ ) ) ), 16 ); // Q31 + move32(); + hOMasa->chnlToFoaMtx_fx[3][i] = L_mult( getCosWord16R2( extract_l( Mpy_32_32( hOMasa->ism_azimuth_fx[i], 46603 /*2^24/360*/ ) ) ), getCosWord16R2( extract_l( Mpy_32_32( hOMasa->ism_elevation_fx[i], 46603 /*2^24/360*/ ) ) ) ); // Q31 + move32(); } /* do processing over all CLDFB time slots */ @@ -430,75 +425,47 @@ static void ivas_omasa_param_est_ana_fx( move32(); hOMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = 0; move32(); + + hOMasa->direction_vector_e[0][block_m_idx][band_m_idx] = 0; + move16(); + hOMasa->direction_vector_e[1][block_m_idx][band_m_idx] = 0; + move16(); + hOMasa->direction_vector_e[2][block_m_idx][band_m_idx] = 0; + move16(); } /* Need to initialize renormalization_factors, and variables to be normalized */ set_zero_fx( renormalization_factor_diff_fx, hOMasa->nbands ); + set16_fx( renormalization_factor_diff_e, 0, hOMasa->nbands ); set_zero_fx( diffuseness_m_fx, hOMasa->nbands ); + set16_fx( diffuseness_e, 0, hOMasa->nbands ); set_zero_fx( hOMasa->energy_fx[block_m_idx], MASA_FREQUENCY_BANDS ); - - set16_fx( tmp_ener_e[block_m_idx], 0, MASA_FREQUENCY_BANDS ); + set16_fx( hOMasa->energy_e[block_m_idx], 0, MASA_FREQUENCY_BANDS ); FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { + Word16 cr_q = MAX_16, ci_q = MAX_16, sf, c_e; + move16(); + move16(); + Word16 inp_q = data_f_q; + move16(); FOR( i = 0; i < nchan_ism; i++ ) { - Word16 in_q = Q11; - move16(); - - /* Keep input to cldfbAnalysis_ts_fx in Q11 */ - IF( NE_16( in_q, data_f_q ) ) - { - scale_sig32( &( data_f_fx[i][i_mult( l_ts, ts )] ), l_ts, sub( in_q, data_f_q ) ); /* Q11 */ - } - - cldfbAnalysis_ts_fx( &( data_f_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &in_q ); - - /* Restore data_f_fx to it's original Q */ - IF( NE_16( data_f_q, Q11 ) ) - { - scale_sig32( &( data_f_fx[i][i_mult( l_ts, ts )] ), l_ts, sub( data_f_q, Q11 ) ); /* Q(data_f_q) */ - } - - FOR( Word16 ind = 0; ind < CLDFB_NO_CHANNELS_MAX; ind++ ) - { - Chnl_RealBuffer_fx[i][ind] = L_shr( Chnl_RealBuffer_fx[i][ind], 4 ); // Q: in_q - 4 - move32(); - Chnl_ImagBuffer_fx[i][ind] = L_shr( Chnl_ImagBuffer_fx[i][ind], 4 ); // Q: in_q - 4 - move32(); - } + inp_q = data_f_q; + cldfbAnalysis_ts_fx_var_q( &( data_f_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &inp_q ); - Chnl_RealBuffer_q[i] = sub( in_q, 4 ); - move16(); - Chnl_ImagBuffer_q[i] = sub( in_q, 4 ); - move16(); + cr_q = s_min( cr_q, L_norm_arr( Chnl_ImagBuffer_fx[i], l_ts ) ); + ci_q = s_min( ci_q, L_norm_arr( Chnl_RealBuffer_fx[i], l_ts ) ); } - - IF( GT_16( nchan_ism, 1 ) ) + sf = sub( s_min( cr_q, ci_q ), 4 ); + FOR( i = 0; i < nchan_ism; i++ ) { - Word16 anaBuf_com_q; - minimum_fx( Chnl_RealBuffer_q, nchan_ism, &anaBuf_com_q ); - - FOR( i = 0; i < nchan_ism; i++ ) - { - IF( NE_16( anaBuf_com_q, Chnl_RealBuffer_q[i] ) ) - { - FOR( Word16 ind = 0; ind < CLDFB_NO_CHANNELS_MAX; ind++ ) - { - Chnl_RealBuffer_fx[i][ind] = L_shr( Chnl_RealBuffer_fx[i][ind], sub( Chnl_RealBuffer_q[i], anaBuf_com_q ) ); // Q: anaBuf_com_q - move32(); - Chnl_ImagBuffer_fx[i][ind] = L_shr( Chnl_ImagBuffer_fx[i][ind], sub( Chnl_ImagBuffer_q[i], anaBuf_com_q ) ); // Q: anaBuf_com_q - move32(); - } - Chnl_ImagBuffer_q[i] = anaBuf_com_q; - move16(); - Chnl_RealBuffer_q[i] = anaBuf_com_q; - move16(); - } - } + scale_sig32( Chnl_RealBuffer_fx[i], l_ts, sf ); // Q-> inp_q + sf + scale_sig32( Chnl_ImagBuffer_fx[i], l_ts, sf ); // Q-> inp_q + sf } - + inp_q = add( inp_q, sf ); + c_e = sub( 31, inp_q ); /* Compute channel-based energy for metadata processing */ FOR( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) @@ -511,20 +478,8 @@ static void ivas_omasa_param_est_ana_fx( { FOR( i = 0; i < nchan_ism; i++ ) { - Word16 tmp_e, tmp_r_q, tmp_i_q; - Word32 tmp_r, tmp_i, L_tmp_sum; - tmp_r_q = norm_l( Chnl_RealBuffer_fx[i][j] ); - tmp_r = L_shl( Chnl_RealBuffer_fx[i][j], tmp_r_q ); /* Q(Chnl_RealBuffer_q[i] + tmp_r_q) */ - tmp_r_q = add( tmp_r_q, Chnl_RealBuffer_q[i] ); - L_tmp1 = Mpy_32_32( tmp_r, tmp_r ); /* Q(2*tmp_r_q - 31)*/ - tmp_r_q = sub( add( tmp_r_q, tmp_r_q ), 31 ); - tmp_i_q = norm_l( Chnl_ImagBuffer_fx[i][j] ); - tmp_i = L_shl( Chnl_ImagBuffer_fx[i][j], tmp_i_q ); /* Q(Chnl_ImagBuffer_q[i] + tmp_i_q)*/ - tmp_i_q = add( tmp_i_q, Chnl_ImagBuffer_q[i] ); - tmp_i_q = sub( add( tmp_i_q, tmp_i_q ), 31 ); - L_tmp2 = Mpy_32_32( tmp_i, tmp_i ); /* Q(2*tmp_i_q - 31) */ - L_tmp_sum = BASOP_Util_Add_Mant32Exp( L_tmp1, sub( 31, tmp_r_q ), L_tmp2, sub( 31, tmp_i_q ), &tmp_e ); /* Q(31 - tmp_e) */ - hOMasa->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->energy_fx[block_m_idx][band_m_idx], tmp_ener_e[block_m_idx][band_m_idx], L_tmp_sum, tmp_e, &tmp_ener_e[block_m_idx][band_m_idx] ); /* Q(31 - tmp_ener_e[block_m_idx][band_m_idx]) */ + Word32 temp = L_add( Mult_32_32( Chnl_RealBuffer_fx[i][j], Chnl_RealBuffer_fx[i][j] ), Mult_32_32( Chnl_ImagBuffer_fx[i][j], Chnl_ImagBuffer_fx[i][j] ) ); // Q-> 2*inp_q - 31, e = 31 - (2*inp_q - 31) = 62 - 2*inp_q = 2*(31 - inp_q) = 2*c_e + hOMasa->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->energy_fx[block_m_idx][band_m_idx], hOMasa->energy_e[block_m_idx][band_m_idx], temp, shl( c_e, 1 ), &hOMasa->energy_e[block_m_idx][band_m_idx] ); move32(); } } @@ -533,70 +488,66 @@ static void ivas_omasa_param_est_ana_fx( /* Compute FOA */ /* W */ - Copy32( Chnl_RealBuffer_fx[0], Foa_RealBuffer_fx[0], num_freq_bins ); - Copy32( Chnl_ImagBuffer_fx[0], Foa_ImagBuffer_fx[0], num_freq_bins ); + Copy32( Chnl_RealBuffer_fx[0], Foa_RealBuffer_fx[0], num_freq_bins ); // inp_q + Copy32( Chnl_ImagBuffer_fx[0], Foa_ImagBuffer_fx[0], num_freq_bins ); // inp_q FOR( i = 1; i < nchan_ism; i++ ) { - v_add_fixed( Chnl_RealBuffer_fx[i], Foa_RealBuffer_fx[0], Foa_RealBuffer_fx[0], num_freq_bins, 0 ); // Q: Chnl_RealBuffer_q - v_add_fixed( Chnl_ImagBuffer_fx[i], Foa_ImagBuffer_fx[0], Foa_ImagBuffer_fx[0], num_freq_bins, 0 ); // Q: Chnl_ImagBuffer_q + v_add_fx_no_hdrm( Chnl_RealBuffer_fx[i], Foa_RealBuffer_fx[0], Foa_RealBuffer_fx[0], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_add_fx_no_hdrm( Chnl_ImagBuffer_fx[i], Foa_ImagBuffer_fx[0], Foa_ImagBuffer_fx[0], num_freq_bins ); // Q: Chnl_ImagBuffer_q } /* Y */ - v_multc_fixed( Chnl_RealBuffer_fx[0], L_deposit_h( hOMasa->chnlToFoaMtx_fx[1][0] ), Foa_RealBuffer_fx[1], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_fixed( Chnl_ImagBuffer_fx[0], L_deposit_h( hOMasa->chnlToFoaMtx_fx[1][0] ), Foa_ImagBuffer_fx[1], num_freq_bins ); // Q: Chnl_ImagBuffer_q + v_multc_fx( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[1][0], Foa_RealBuffer_fx[1], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_fx( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[1][0], Foa_ImagBuffer_fx[1], num_freq_bins ); // Q: Chnl_ImagBuffer_q FOR( i = 1; i < nchan_ism; i++ ) { - v_multc_acc_32_16( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[1][i], Foa_RealBuffer_fx[1], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_acc_32_16( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[1][i], Foa_ImagBuffer_fx[1], num_freq_bins ); // Q: Chnl_ImagBuffer_q + v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[1][i], Foa_RealBuffer_fx[1], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_acc_32_32( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[1][i], Foa_ImagBuffer_fx[1], num_freq_bins ); // Q: Chnl_ImagBuffer_q } /* Z */ - v_multc_fixed( Chnl_RealBuffer_fx[0], L_deposit_h( hOMasa->chnlToFoaMtx_fx[2][0] ), Foa_RealBuffer_fx[2], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_fixed( Chnl_ImagBuffer_fx[0], L_deposit_h( hOMasa->chnlToFoaMtx_fx[2][0] ), Foa_ImagBuffer_fx[2], num_freq_bins ); // Q: Chnl_ImagBuffer_q + v_multc_fx( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[2][0], Foa_RealBuffer_fx[2], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_fx( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[2][0], Foa_ImagBuffer_fx[2], num_freq_bins ); // Q: Chnl_ImagBuffer_q FOR( i = 1; i < nchan_ism; i++ ) { - v_multc_acc_32_16( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[2][i], Foa_RealBuffer_fx[2], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_acc_32_16( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[2][i], Foa_ImagBuffer_fx[2], num_freq_bins ); // Q: Chnl_ImagBuffer_q + v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[2][i], Foa_RealBuffer_fx[2], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_acc_32_32( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[2][i], Foa_ImagBuffer_fx[2], num_freq_bins ); // Q: Chnl_ImagBuffer_q } - v_multc_fixed( Chnl_RealBuffer_fx[0], L_deposit_h( hOMasa->chnlToFoaMtx_fx[3][0] ), Foa_RealBuffer_fx[2], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_fixed( Chnl_ImagBuffer_fx[0], L_deposit_h( hOMasa->chnlToFoaMtx_fx[3][0] ), Foa_ImagBuffer_fx[2], num_freq_bins ); // Q: Chnl_ImagBuffer_q + v_multc_fx( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[3][0], Foa_RealBuffer_fx[3], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_fx( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[3][0], Foa_ImagBuffer_fx[3], num_freq_bins ); // Q: Chnl_ImagBuffer_q FOR( i = 1; i < nchan_ism; i++ ) { - v_multc_acc_32_16( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_RealBuffer_fx[3], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_acc_32_16( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_ImagBuffer_fx[3], num_freq_bins ); // Q: Chnl_ImagBuffer_q - } - - /* Direction estimation */ - FOR( i = 0; i < FOA_CHANNELS; i++ ) - { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - Foa_RealBuffer_fx[i][j] = L_shr( Foa_RealBuffer_fx[i][j], 5 ); // Q: ( Chnl_RealBuffer_q - 5 ) - move32(); - Foa_ImagBuffer_fx[i][j] = L_shr( Foa_ImagBuffer_fx[i][j], 5 ); // Q: ( Chnl_RealBuffer_q - 5 ) - move32(); - } + v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_RealBuffer_fx[3], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_acc_32_32( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_ImagBuffer_fx[3], num_freq_bins ); // Q: Chnl_ImagBuffer_q } - foa_q = sub( Chnl_ImagBuffer_q[0], 5 ); - computeIntensityVector_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); + computeIntensityVector_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, intensity_real_q, inp_q ); - intensity_q = sub( shl( add( foa_q, Q1 ), 1 ), 31 ); - direction_q = intensity_q; - move16(); - - computeDirectionVectors_fx( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], &direction_q ); + computeDirectionVectors_fx2( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], 0, intensity_real_q ); /* Q direction_vector_fx = Q30*/ /* Power estimation for diffuseness */ + computeReferencePower_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands, inp_q, &reference_power_q ); - computeReferencePower_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx, num_freq_bands ); // 2 * inputq - 30 - reference_power_q = sub( shl( Chnl_ImagBuffer_q[0], 1 ), 30 ); + /* Aligning intensity_real to a common Q-factor */ + minimum_fx( intensity_real_q, num_freq_bands, &intensity_q ); + + Word16 tmp; + FOR( i = 0; i < num_freq_bands; i++ ) + { + tmp = sub( intensity_q, intensity_real_q[i] ); + intensity_real_fx[0][i] = L_shl( intensity_real_fx[0][i], tmp ); + move32(); + intensity_real_fx[1][i] = L_shl( intensity_real_fx[1][i], tmp ); + move32(); + intensity_real_fx[2][i] = L_shl( intensity_real_fx[2][i], tmp ); + move32(); + } /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hOMasa->index_buffer_intensity = add( ( hOMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ @@ -611,68 +562,58 @@ static void ivas_omasa_param_est_ana_fx( } hOMasa->buffer_intensity_real_q[index - 1] = intensity_q; move16(); - Copy32( reference_power_fx, &( hOMasa->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + Copy32( reference_power_fx[ts], &( hOMasa->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); hOMasa->buffer_energy_q[index - 1] = reference_power_q; move16(); - computeDiffuseness_fixed( hOMasa->buffer_intensity_real_fx, hOMasa->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hOMasa->buffer_intensity_real_q, hOMasa->buffer_energy_q, &diffuseness_q ); + computeDiffuseness_fx( hOMasa->buffer_intensity_real_fx, hOMasa->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hOMasa->buffer_intensity_real_q, hOMasa->buffer_energy_q, &diffuseness_q ); // diffuseness_q=Q30 FOR( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) { - norm_tmp_fx = Mpy_32_32( reference_power_fx[band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ); // reference_power_q + 30 - 31 - norm_tmp_q = sub( add( reference_power_q, 30 ), 31 ); - - hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = L_add( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], Mpy_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ) ); // Q: hOMasa->direction_vector_m_q: ( ( norm_tmp_q + direction_q ) - 31 ) + norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*reference_power_q*/ + hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], hOMasa->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hOMasa->direction_vector_e[0][block_m_idx][band_m_idx] ); move32(); - - hOMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = L_add( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], Mpy_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ) ); // Q: hOMasa->direction_vector_m_q: ( ( norm_tmp_q + direction_q ) - 31 ) + hOMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx], hOMasa->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hOMasa->direction_vector_e[1][block_m_idx][band_m_idx] ); move32(); - hOMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = L_add( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], Mpy_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ) ); // Q: hOMasa->direction_vector_m_q: ( ( norm_tmp_q + direction_q ) - 31 ) + hOMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx], hOMasa->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hOMasa->direction_vector_e[2][block_m_idx][band_m_idx] ); move32(); - hOMasa->direction_vector_m_q = sub( add( norm_tmp_q, direction_q ), 31 ); - - - diffuseness_m_fx[band_m_idx] = L_add( diffuseness_m_fx[band_m_idx], Mpy_32_32( reference_power_fx[band_m_idx], diffuseness_vector_fx[band_m_idx] ) ); // diffuseness_m_q: ( ( reference_power_q + diffuseness_q ) - 31 ); + diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ), 1 ), sub( 31, reference_power_q ), &diffuseness_e[band_m_idx] ); move32(); - diffuseness_m_q = sub( add( reference_power_q, diffuseness_q ), 31 ); - renormalization_factor_diff_fx[band_m_idx] = L_add( renormalization_factor_diff_fx[band_m_idx], reference_power_fx[band_m_idx] ); + renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( 31, reference_power_q ), &renormalization_factor_diff_e[band_m_idx] ); move32(); - renormalization_factor_diff_q = reference_power_q; - move16(); } } FOR( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) { + Word16 max_e = MIN_16; + move16(); FOR( d = 0; d < DIRAC_NUM_DIMS; d++ ) { - dir_v_fx[d] = hOMasa->direction_vector_m_fx[d][block_m_idx][band_m_idx]; - move32(); + max_e = s_max( max_e, hOMasa->direction_vector_e[d][block_m_idx][band_m_idx] ); } - dir_v_q = hOMasa->direction_vector_m_q; - move16(); - - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + max_e = add( max_e, 1 ); /*1 as guard bit to prevent overflow*/ + FOR( d = 0; d < DIRAC_NUM_DIMS; d++ ) { - dir_v_fx[i] = L_shr( dir_v_fx[i], 1 ); + dir_v_fx[d] = L_shr( hOMasa->direction_vector_m_fx[d][block_m_idx][band_m_idx], sub( max_e, hOMasa->direction_vector_e[d][block_m_idx][band_m_idx] ) ); move32(); } + dir_v_q = sub( 31, max_e ); - dir_v_q = sub( dir_v_q, 1 ); ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( dir_v_fx, dir_v_q, &azimuth_m_values_fx[block_m_idx][band_m_idx], &elevation_m_values_fx[block_m_idx][band_m_idx] ); } /* Determine energy ratios */ FOR( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) { - IF( BASOP_Util_Cmp_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], sub( 31, renormalization_factor_diff_q ), L_deposit_h( EPSILON_FX ), 2 ) > 0 ) + Word16 diffuseness_m_e; + IF( GT_32( renormalization_factor_diff_fx[band_m_idx], EPSILON_FX ) ) { - diffuseness_m_fx[band_m_idx] = BASOP_Util_Divide3232_Scale( diffuseness_m_fx[band_m_idx], renormalization_factor_diff_fx[band_m_idx], &scale ); + diffuseness_m_fx[band_m_idx] = BASOP_Util_Divide3232_Scale( diffuseness_m_fx[band_m_idx], renormalization_factor_diff_fx[band_m_idx], &diffuseness_m_e ); move32(); - scale = add( scale, sub( sub( 31, diffuseness_m_q ), sub( 31, renormalization_factor_diff_q ) ) ); - - diffuseness_m_fx[band_m_idx] = L_shr( diffuseness_m_fx[band_m_idx], sub( 31, add( scale, diffuseness_m_q ) ) ); + diffuseness_m_e = add( diffuseness_m_e, sub( diffuseness_e[band_m_idx], renormalization_factor_diff_e[band_m_idx] ) ); + diffuseness_m_fx[band_m_idx] = L_shl_sat( diffuseness_m_fx[band_m_idx], add( 16, diffuseness_m_e ) ); // Q31 move32(); } ELSE @@ -680,7 +621,7 @@ static void ivas_omasa_param_est_ana_fx( diffuseness_m_fx[band_m_idx] = 0; move32(); } - energyRatio_fx[block_m_idx][band_m_idx] = L_sub( L_shl( 1, diffuseness_m_q ), diffuseness_m_fx[band_m_idx] ); // Q: diffuseness_m_q + energyRatio_fx[block_m_idx][band_m_idx] = L_sub( ONE_IN_Q31, diffuseness_m_fx[band_m_idx] ); move32(); } @@ -693,47 +634,19 @@ static void ivas_omasa_param_est_ana_fx( move32(); } } - - Word16 q_ener_min = MAX_16; - move16(); - FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) - { - Word16 e_max; - maximum_fx( tmp_ener_e[block_m_idx], num_freq_bands, &e_max ); - e_max = sub( 31, e_max ); - if ( GT_16( q_ener_min, e_max ) ) - { - q_ener_min = e_max; - move16(); - } - } - - FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) - { - FOR( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) - { - hOMasa->energy_fx[block_m_idx][band_m_idx] = L_shr( hOMasa->energy_fx[block_m_idx][band_m_idx], sub( sub( 31, tmp_ener_e[block_m_idx][band_m_idx] ), q_ener_min ) ); /* Q(q_ener_min) */ - move32(); - } - } - - hOMasa->energy_q = q_ener_min; - move16(); - - *spreadCoherence_q = 0; + *energyRatio_q = Q31; + *spreadCoherence_q = Q31; + *surroundingCoherence_q = Q31; move16(); - *surroundingCoherence_q = 0; move16(); - *energyRatio_q = 0; move16(); - return; } /* Compute downmix */ static void ivas_omasa_dmx_fx( - Word32 data_in_f_fx[][L_FRAME48k], + Word32 data_in_fx[][L_FRAME48k], Word16 *data_in_q, const Word16 input_frame, const Word16 nchan_transport, @@ -744,7 +657,6 @@ static void ivas_omasa_dmx_fx( const Word16 interpolator_fx[L_FRAME48k] ) { Word16 i, j, k, l, tmp1, tmp2; - Word16 azimuth_fx, elevation_fx; Word16 gains_fx[MASA_MAX_TRANSPORT_CHANNELS]; Word16 g1_fx, g2_fx, scale; @@ -759,100 +671,114 @@ static void ivas_omasa_dmx_fx( } set16_fx( data_e, 0, 4 ); set16_fx( in_e, 0, 960 ); + max_e = 0; FOR( i = 0; i < nchan_ism; i++ ) { + IF( EQ_16( nchan_transport, 1 ) ) + { + FOR( j = 0; j < input_frame; j++ ) + { + data_out_f_fx[0][j] = L_add_sat( data_out_f_fx[0][j], data_in_fx[i][j] ); + move32(); + } + } + ELSE + { + azimuth_fx = extract_l( L_shr( ism_azimuth_fx[i], Q22 ) ); // Q0 + elevation_fx = extract_l( L_shr( ism_elevation_fx[i], Q22 ) ); // Q0 - azimuth_fx = extract_l( L_shr( ism_azimuth_fx[i], Q22 ) ); // Q0 - elevation_fx = extract_l( L_shr( ism_elevation_fx[i], Q22 ) ); // Q0 - - ivas_ism_get_stereo_gains_fx( azimuth_fx, elevation_fx, &gains_fx[0], &gains_fx[1] ); + ivas_ism_get_stereo_gains_fx( azimuth_fx, elevation_fx, &gains_fx[0], &gains_fx[1] ); - /* Downmix using the panning gains */ - FOR( j = 0; j < nchan_transport; j++ ) - { - test(); - IF( abs_s( gains_fx[j] ) > 0 || L_abs( prev_gains_fx[i][j] ) > 0 ) + /* Downmix using the panning gains */ + FOR( j = 0; j < nchan_transport; j++ ) { - FOR( k = 0; k < input_frame; k++ ) + test(); + IF( abs_s( gains_fx[j] ) > 0 || L_abs( prev_gains_fx[i][j] ) > 0 ) { + FOR( k = 0; k < input_frame; k++ ) + { + g1_fx = interpolator_fx[k]; // Q15 + move16(); + scale = BASOP_Util_Add_MantExp( 16384, 1, negate( g1_fx ), 0, &g2_fx ); - g1_fx = interpolator_fx[k]; // Q15 - move16(); - scale = BASOP_Util_Add_MantExp( 16384, 1, negate( g1_fx ), 0, &g2_fx ); + tmp1 = mult( g1_fx, gains_fx[j] ); + tmp2 = mult( g2_fx, (Word16) L_shr( prev_gains_fx[i][j], 16 ) ); // Q: ( ( ( 15 - scale ) + ( Q31 - Q16 ) ) - Q15 ) -> ( 15 - scale ) + scale = BASOP_Util_Add_MantExp( tmp1, 0, tmp2, scale, &tmp1 ); - tmp1 = mult( g1_fx, gains_fx[j] ); - tmp2 = mult( g2_fx, (Word16) L_shr( prev_gains_fx[i][j], 16 ) ); // Q: ( ( ( 15 - scale ) + ( Q31 - Q16 ) ) - Q15 ) -> ( 15 - scale ) - scale = BASOP_Util_Add_MantExp( tmp1, 0, tmp2, scale, &tmp1 ); + L_tmp = data_in_fx[i][k]; // data_in_q + move32(); + tmp_e = sub( 31, *data_in_q ); + move16(); - L_tmp = data_in_f_fx[i][k]; // data_in_q - move32(); - tmp_e = sub( 31, *data_in_q ); - move16(); + L_tmp = Mpy_32_16_1( L_tmp, tmp1 ); + scale = add( scale, tmp_e ); - L_tmp = Mpy_32_16_1( L_tmp, tmp1 ); - scale = add( scale, tmp_e ); + data_out_f_fx[j][k] = BASOP_Util_Add_Mant32Exp( data_out_f_fx[j][k], data_e[j], L_tmp, scale, &in_e[k] ); + move32(); + } + max_e = in_e[0]; + move16(); + FOR( l = 1; l < L_FRAME48k; l++ ) + { + IF( LT_16( max_e, in_e[l] ) ) + { + max_e = in_e[l]; + move16(); + } + } - data_out_f_fx[j][k] = BASOP_Util_Add_Mant32Exp( data_out_f_fx[j][k], data_e[j], L_tmp, scale, &in_e[k] ); - move32(); - } - } - max_e = in_e[0]; - move16(); - FOR( l = 1; l < L_FRAME48k; l++ ) - { - IF( LT_16( max_e, in_e[l] ) ) - { - max_e = in_e[l]; + FOR( l = 0; l < L_FRAME48k; l++ ) + { + data_out_f_fx[j][l] = L_shr( data_out_f_fx[j][l], sub( max_e, in_e[l] ) ); // exponent: max_e, Q: ( 15 - max_e ) + move32(); + } + data_e[j] = max_e; move16(); } - } - FOR( l = 0; l < L_FRAME48k; l++ ) - { - data_out_f_fx[j][l] = L_shr( data_out_f_fx[j][l], sub( max_e, in_e[l] ) ); // exponent: max_e, Q: ( 15 - max_e ) + prev_gains_fx[i][j] = L_deposit_h( gains_fx[j] ); // Q31 move32(); } - data_e[j] = max_e; - move16(); - - prev_gains_fx[i][j] = L_deposit_h( gains_fx[j] ); // Q31 - move32(); } } - max_e = data_e[0]; - move16(); - FOR( i = 1; i < nchan_transport; i++ ) + IF( NE_16( nchan_transport, 1 ) ) { - if ( LT_16( max_e, data_e[i] ) ) + max_e = data_e[0]; + move16(); + FOR( i = 1; i < nchan_transport; i++ ) { - max_e = data_e[i]; - move16(); + IF( LT_16( max_e, data_e[i] ) ) + { + max_e = data_e[i]; + move16(); + } } - } - FOR( i = 0; i < nchan_transport; i++ ) - { - FOR( j = 0; j < input_frame; j++ ) + FOR( i = 0; i < nchan_transport; i++ ) { - data_out_f_fx[i][j] = L_shr( data_out_f_fx[i][j], sub( max_e, data_e[i] ) ); // exponent: max_e, Q: ( 15 - max_e ) - move32(); + FOR( j = 0; j < input_frame; j++ ) + { + data_out_f_fx[i][j] = L_shr( data_out_f_fx[i][j], sub( max_e, data_e[i] ) ); // exponent: max_e, Q: ( 15 - max_e ) + move32(); + } } } FOR( i = 0; i < nchan_transport; i++ ) { - Copy32( data_out_f_fx[i], data_in_f_fx[i], input_frame ); - *data_in_q = sub( 31, max_e ); - move16(); + Copy32( data_out_f_fx[i], data_in_fx[i], input_frame ); + IF( NE_16( nchan_transport, 1 ) ) + { + *data_in_q = sub( 31, max_e ); + move16(); + } } return; } -/* Compute downmix */ - /*--------------------------------------------------------------------------* * computeIntensityVector_ana() @@ -865,8 +791,9 @@ void computeIntensityVector_ana_fx( Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal Qx */ Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input sig Qx */ const Word16 num_frequency_bands, /* i : Number of frequency bands */ - Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] /* o : Intensity 2 * Qx -31 */ -) + Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /* o : Intensity */ + Word16 q_intensity_real[MASA_FREQUENCY_BANDS], + Word16 inp_q ) { /* Reminder * X = a + ib; Y = c + id @@ -875,42 +802,70 @@ void computeIntensityVector_ana_fx( Word16 i, j; Word32 real, img; Word16 brange[2]; - + Word16 shift_value = add( shl( inp_q, 1 ), 1 ); + Word16 tmp_norm; FOR( i = 0; i < num_frequency_bands; i++ ) { brange[0] = band_grouping[i]; move16(); brange[1] = band_grouping[i + 1]; move16(); + Word16 num_bins = sub( brange[1], brange[0] ); + Word16 gb = find_guarded_bits_fx( num_bins ); + Word16 norm; - intensity_real[0][i] = 0; - move32(); - intensity_real[1][i] = 0; - move32(); - intensity_real[2][i] = 0; - move32(); + Word64 tmp_1 = 0, tmp_2 = 0, tmp_3 = 0; + move64(); + move64(); + move64(); FOR( j = brange[0]; j < brange[1]; j++ ) { - real = Cldfb_RealBuffer[0][j]; // Qx - img = Cldfb_ImagBuffer[0][j]; // Qx - /* Intensity is XYZ order, audio is WYZX order. */ - intensity_real[0][i] = L_add( intensity_real[0][i], L_add( Mpy_32_32( Cldfb_RealBuffer[3][j], real ), Mpy_32_32( Cldfb_ImagBuffer[3][j], img ) ) ); // output Q = 2 * Qx -31 - move32(); - intensity_real[1][i] = L_add( intensity_real[1][i], L_add( Mpy_32_32( Cldfb_RealBuffer[1][j], real ), Mpy_32_32( Cldfb_ImagBuffer[1][j], img ) ) ); // output Q = 2 * Qx -31 + real = Cldfb_RealBuffer[0][j]; move32(); - intensity_real[2][i] = L_add( intensity_real[2][i], L_add( Mpy_32_32( Cldfb_RealBuffer[2][j], real ), Mpy_32_32( Cldfb_ImagBuffer[2][j], img ) ) ); // output Q = 2 * Qx -31 + img = Cldfb_ImagBuffer[0][j]; move32(); + Word64 t1, t2, t3; + t1 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[3][j], real ), Cldfb_ImagBuffer[3][j], img ); /* 2 * q_cldfb + 1 */ + t2 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[1][j], real ), Cldfb_ImagBuffer[1][j], img ); /* 2 * q_cldfb + 1 */ + t3 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[2][j], real ), Cldfb_ImagBuffer[2][j], img ); /* 2 * q_cldfb + 1 */ + t1 = W_shr( t1, gb ); + t2 = W_shr( t2, gb ); + t3 = W_shr( t3, gb ); + /* Intensity is XYZ order, audio is WYZX order. */ + tmp_1 = W_add( tmp_1, t1 ); /* 2 * q_cldfb + 1 */ + tmp_2 = W_add( tmp_2, t2 ); /* 2 * q_cldfb + 1 */ + tmp_3 = W_add( tmp_3, t3 ); /* 2 * q_cldfb + 1 */ } + norm = 63; + move16(); + IF( tmp_1 != 0 ) + { + tmp_norm = W_norm( tmp_1 ); + norm = s_min( norm, tmp_norm ); + } + IF( tmp_2 != 0 ) + { + tmp_norm = W_norm( tmp_2 ); + norm = s_min( norm, tmp_norm ); + } + IF( tmp_3 != 0 ) + { + tmp_norm = W_norm( tmp_3 ); + norm = s_min( norm, tmp_norm ); + } + norm = sub( norm, 32 ); + intensity_real[0][i] = W_shl_sat_l( tmp_1, norm ); // shift_value - (gb - norm) + move32(); + intensity_real[1][i] = W_shl_sat_l( tmp_2, norm ); // shift_value - (gb - norm) + move32(); + intensity_real[2][i] = W_shl_sat_l( tmp_3, norm ); // shift_value - (gb - norm) + q_intensity_real[i] = sub( shift_value, sub( gb, norm ) ); + move16(); } return; } -/*--------------------------------------------------------------------------* - * computeIntensityVector_ana() - * - * - *--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------* @@ -923,42 +878,43 @@ void computeReferencePower_ana_fx( const Word16 *band_grouping, /* i : Band grouping for estimation */ Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal input_q */ Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal input_q */ - Word32 *reference_power, /* o : Estimated power 2 * inputq - 31 */ - const Word16 num_freq_bands /* i : Number of frequency bands */ + Word32 *reference_power, /* o : Estimated power */ + const Word16 num_freq_bands, /* i : Number of frequency bands */ + const Word16 input_q, /* i : Q-factor Real and Imag part of input signal */ + Word16 *reference_power_q /* o : Q-factor of the estimated power */ ) { Word16 brange[2]; - Word16 ch_idx, i, j; - + Word16 ch_idx, i, j, s; + Word64 reference_power64[MASA_FREQUENCY_BANDS]; FOR( i = 0; i < num_freq_bands; i++ ) { brange[0] = band_grouping[i]; move16(); brange[1] = band_grouping[i + 1]; move16(); - reference_power[i] = 0; - move32(); + reference_power64[i] = 0; + move64(); FOR( ch_idx = 0; ch_idx < FOA_CHANNELS; ch_idx++ ) { /* abs()^2 */ FOR( j = brange[0]; j < brange[1]; j++ ) { - // Q = 2*inputq - 31 - reference_power[i] = L_add( L_add( Mpy_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), Mpy_32_32( Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ) ), reference_power[i] ); - move32(); + reference_power64[i] = W_add( W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ), reference_power64[i] ); // 2 * input_q + 1 + move64(); } } } - // v_multc( reference_power, 0.5f, reference_power, num_freq_bands ); + s = sub( W_norm_arr( reference_power64, num_freq_bands ), 1 ); + FOR( i = 0; i < num_freq_bands; i++ ) + { + reference_power[i] = W_extract_h( W_shl( reference_power64[i], s ) ); // 2 * input_q + 1 + s - 32 + move32(); + } + *reference_power_q = sub( add( shl( input_q, 1 ), s ), 30 ); /* Bypassing the v_multc ,so output q = 2 * input_q + s - 30 */ + move16(); - /* Bypassing the v_multc ,so output q = 2*inputq - 30*/ return; } - -/*--------------------------------------------------------------------------* - * computeReferencePower_ana() - * - * - *--------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_orient_trk_fx.c b/lib_rend/ivas_orient_trk_fx.c index a25a8db5370058a5d12419ce0ac6340e0040a601..ee91e7060e252c6d06e9827ba3f2e5d353710038 100644 --- a/lib_rend/ivas_orient_trk_fx.c +++ b/lib_rend/ivas_orient_trk_fx.c @@ -33,6 +33,7 @@ #include "common_api_types.h" #include #include "options.h" +#include "ivas_prot_fx.h" #include "ivas_prot_rend_fx.h" #include "ivas_cnst.h" #include @@ -140,22 +141,22 @@ static void QuaternionDivision_fx( { Word16 scale_e, result_e = 0, w_q, x_q, y_q, z_q, result_q; - r->w_fx = BASOP_Util_Divide3232_Scale_cadence( ( q.w_fx ), d, &scale_e ); + r->w_fx = BASOP_Util_Divide3232_Scale_newton( ( q.w_fx ), d, &scale_e ); move32(); result_e = add( scale_e, sub( sub( Q31, q.q_fact ), den_e ) ); // e+e1-e2// w_q = sub( Q31, result_e ); - r->x_fx = BASOP_Util_Divide3232_Scale_cadence( ( q.x_fx ), d, &scale_e ); + r->x_fx = BASOP_Util_Divide3232_Scale_newton( ( q.x_fx ), d, &scale_e ); move32(); result_e = add( scale_e, sub( sub( Q31, q.q_fact ), den_e ) ); x_q = sub( Q31, result_e ); - r->y_fx = BASOP_Util_Divide3232_Scale_cadence( ( q.y_fx ), d, &scale_e ); + r->y_fx = BASOP_Util_Divide3232_Scale_newton( ( q.y_fx ), d, &scale_e ); move32(); result_e = add( scale_e, sub( sub( Q31, q.q_fact ), den_e ) ); y_q = sub( Q31, result_e ); - r->z_fx = BASOP_Util_Divide3232_Scale_cadence( ( q.z_fx ), d, &scale_e ); + r->z_fx = BASOP_Util_Divide3232_Scale_newton( ( q.z_fx ), d, &scale_e ); move32(); result_e = add( scale_e, sub( sub( Q31, q.q_fact ), den_e ) ); z_q = sub( Q31, result_e ); @@ -505,15 +506,15 @@ static IVAS_VECTOR3 VectorNormalize_fx( move16(); length_fx = VectorLength_fx( p, &q_len ); - result_fx.x_fx = BASOP_Util_Divide3232_Scale_cadence( p.x_fx, length_fx, &scale ); + result_fx.x_fx = BASOP_Util_Divide3232_Scale_newton( p.x_fx, length_fx, &scale ); move32(); x_qfact = sub( Q31, add( scale, sub( q_len, p.q_fact ) ) ); // e+(e1-e2)// - result_fx.y_fx = BASOP_Util_Divide3232_Scale_cadence( p.y_fx, length_fx, &scale ); + result_fx.y_fx = BASOP_Util_Divide3232_Scale_newton( p.y_fx, length_fx, &scale ); move32(); y_qfact = sub( Q31, add( scale, sub( q_len, p.q_fact ) ) ); - result_fx.z_fx = BASOP_Util_Divide3232_Scale_cadence( p.z_fx, length_fx, &scale ); + result_fx.z_fx = BASOP_Util_Divide3232_Scale_newton( p.z_fx, length_fx, &scale ); move32(); z_qfact = sub( Q31, add( scale, sub( q_len, p.q_fact ) ) ); @@ -696,9 +697,10 @@ ivas_error ivas_orient_trk_SetReferenceRotation_fx( } /* check for Euler angle signaling */ - IF( EQ_32( refRot.w_fx, -1610612736 /* -3.0f in Q29 */ ) ) + IF( EQ_32( refRot.w_fx, L_negate( 12582912 ) ) && EQ_16( refRot.q_fact, Q22 ) ) { Euler2Quat_fx( deg2rad_fx( refRot.x_fx ), deg2rad_fx( refRot.y_fx ), deg2rad_fx( refRot.z_fx ), &pOTR->refRot ); + modify_Quat_q_fx( &pOTR->refRot, &pOTR->refRot, Q29 ); } pOTR->refRot = refRot; @@ -789,7 +791,7 @@ ivas_error ivas_orient_trk_SetReferenceVector_fx( case IVAS_HEAD_ORIENT_TRK_REF: case IVAS_HEAD_ORIENT_TRK_AVG: case IVAS_HEAD_ORIENT_TRK_REF_VEC: - acousticFrontVector = VectorSubtract_fx( listenerPos, refPos ); + acousticFrontVector = VectorSubtract_fx( refPos, listenerPos ); BREAK; case IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV: /* ignore the height difference between listener position and reference position */ @@ -816,7 +818,7 @@ ivas_error ivas_orient_trk_SetReferenceVector_fx( refPosLevel.q_fact = q_min; move16(); - acousticFrontVector = VectorSubtract_fx( listenerPosLevel, refPosLevel ); + acousticFrontVector = VectorSubtract_fx( refPosLevel, listenerPosLevel ); BREAK; default: return IVAS_ERR_WRONG_PARAMS; @@ -833,7 +835,7 @@ ivas_error ivas_orient_trk_SetReferenceVector_fx( return IVAS_ERR_WRONG_PARAMS; } - ivasForwardVector.x_fx = L_negate( ONE_IN_Q31 ); + ivasForwardVector.x_fx = ONE_IN_Q31; move32(); ivasForwardVector.y_fx = 0; move32(); diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c deleted file mode 100644 index 9945d630ed96dc9b354bb1b962713581a70ed7c9..0000000000000000000000000000000000000000 --- a/lib_rend/ivas_output_init.c +++ /dev/null @@ -1,489 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#include -#include "options.h" -#include "ivas_cnst.h" -#include "prot_fx.h" -#include "ivas_prot_rend_fx.h" -#include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" -#include "wmc_auto.h" -#include "ivas_prot_fx.h" -/*-------------------------------------------------------------------------* - * audioCfg2channels() - * - * Map Audio configuration to number of channels - *-------------------------------------------------------------------------*/ - -/*! r: number of audio channels */ -Word16 audioCfg2channels( - AUDIO_CONFIG output_config /* i : output audio configuration */ -) -{ - Word16 nchan_out; - - SWITCH( output_config ) - { - case IVAS_AUDIO_CONFIG_MONO: - nchan_out = 1; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_STEREO: - nchan_out = 2; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_5_1: - nchan_out = 6; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_7_1: - nchan_out = 8; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_5_1_2: - nchan_out = 8; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_5_1_4: - nchan_out = 10; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_7_1_4: - nchan_out = 12; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_FOA: - nchan_out = 4; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_HOA2: - nchan_out = 9; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_HOA3: - nchan_out = 16; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_OBA: - nchan_out = 8; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_BINAURAL: - case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: - case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: - nchan_out = 2; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_ISM1: - nchan_out = 1; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_ISM2: - nchan_out = 2; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_ISM3: - nchan_out = 3; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_ISM4: - nchan_out = 4; - move16(); - BREAK; - default: - IVAS_ERROR( IVAS_ERR_INTERNAL, "Error: illegal output configuration\n" ); - nchan_out = -1; - move16(); - BREAK; - } - - return ( nchan_out ); -} - -/*-------------------------------------------------------------------------* - * ivas_output_init() - * - * Initialize and configure IVAS output parameters - *-------------------------------------------------------------------------*/ -void ivas_output_init( - IVAS_OUTPUT_SETUP *hOutSetup, /* o : IVAS output setup structure */ - const AUDIO_CONFIG output_config /* i : output audio configuration */ -) -{ - Word16 nchan_out; - - /* set general default values */ - hOutSetup->output_config = output_config; - move16(); - hOutSetup->is_loudspeaker_setup = 0; - move16(); - hOutSetup->is_binaural_setup = 0; - move16(); - hOutSetup->ambisonics_order = -1; - move16(); - hOutSetup->separateChannelEnabled = 0; - move16(); - hOutSetup->separateChannelIndex = 0; - move16(); - - IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - hOutSetup->is_loudspeaker_setup = 1; - move16(); - /* set in ivas_init_decoder: */ - /* hOutSetup->ls_azimuth */ - /* hOutSetup->ls_elevation */ - /* hOutSetup->num_lfe */ - /* hOutSetup->index_lfe[0] */ - /* hOutSetup->is_planar_setup */ - } - ELSE - { - /* Set default values for all other than custom LS setup */ - hOutSetup->ls_azimuth_fx = NULL; - hOutSetup->ls_elevation_fx = NULL; - hOutSetup->num_lfe = 0; - move16(); - hOutSetup->index_lfe[0] = -1; - move16(); - hOutSetup->is_planar_setup = 0; - move16(); - - /* set output setup specific values */ - SWITCH( output_config ) - { - case IVAS_AUDIO_CONFIG_MONO: - hOutSetup->is_loudspeaker_setup = 1; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_STEREO: - hOutSetup->is_loudspeaker_setup = 1; - move16(); - hOutSetup->ls_azimuth_fx = ls_azimuth_CICP2_fx; // Q22 - hOutSetup->ls_elevation_fx = ls_elevation_CICP2_fx; // Q22 - BREAK; - case IVAS_AUDIO_CONFIG_FOA: - hOutSetup->ambisonics_order = SBA_FOA_ORDER; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_HOA2: - hOutSetup->ambisonics_order = SBA_HOA2_ORDER; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_HOA3: - hOutSetup->ambisonics_order = SBA_HOA3_ORDER; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_5_1: - hOutSetup->num_lfe = 1; - move16(); - hOutSetup->index_lfe[0] = 3; - move16(); - hOutSetup->is_loudspeaker_setup = 1; - move16(); - hOutSetup->ls_azimuth_fx = ls_azimuth_CICP6_fx; // Q22 - hOutSetup->ls_elevation_fx = ls_elevation_CICP6_fx; // Q22 - hOutSetup->is_planar_setup = 1; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_7_1: - hOutSetup->num_lfe = 1; - move16(); - hOutSetup->index_lfe[0] = 3; - move16(); - hOutSetup->is_loudspeaker_setup = 1; - move16(); - hOutSetup->ls_azimuth_fx = ls_azimuth_CICP12_fx; // Q22 - hOutSetup->ls_elevation_fx = ls_elevation_CICP12_fx; // Q22 - hOutSetup->is_planar_setup = 1; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_5_1_2: - hOutSetup->num_lfe = 1; - move16(); - hOutSetup->index_lfe[0] = 3; - move16(); - hOutSetup->is_loudspeaker_setup = 1; - move16(); - hOutSetup->ls_azimuth_fx = ls_azimuth_CICP14_fx; // Q22 - hOutSetup->ls_elevation_fx = ls_elevation_CICP14_fx; // Q22 - hOutSetup->is_planar_setup = 0; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_5_1_4: - hOutSetup->num_lfe = 1; - move16(); - hOutSetup->index_lfe[0] = 3; - move16(); - hOutSetup->is_loudspeaker_setup = 1; - move16(); - hOutSetup->ls_azimuth_fx = ls_azimuth_CICP16_fx; // Q22 - hOutSetup->ls_elevation_fx = ls_elevation_CICP16_fx; // Q22 - hOutSetup->is_planar_setup = 0; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_7_1_4: - hOutSetup->num_lfe = 1; - move16(); - hOutSetup->index_lfe[0] = 3; - move16(); - hOutSetup->is_loudspeaker_setup = 1; - move16(); - hOutSetup->ls_azimuth_fx = ls_azimuth_CICP19_fx; // Q22 - hOutSetup->ls_elevation_fx = ls_elevation_CICP19_fx; // Q22 - hOutSetup->is_planar_setup = 0; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_BINAURAL: - case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: - case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: - case IVAS_AUDIO_CONFIG_ISM1: - case IVAS_AUDIO_CONFIG_ISM2: - case IVAS_AUDIO_CONFIG_ISM3: - case IVAS_AUDIO_CONFIG_ISM4: - hOutSetup->is_binaural_setup = 1; - move16(); - case IVAS_AUDIO_CONFIG_EXTERNAL: - /* Default values are used */ - BREAK; - default: - return; - } - } - - test(); - IF( NE_16( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && NE_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out = audioCfg2channels( output_config ); - hOutSetup->nchan_out_woLFE = sub( nchan_out, hOutSetup->num_lfe ); - move16(); - } - - return; -} - - -/*-----------------------------------------------------------------* - * ivas_get_nchan_buffers_dec() - * - * Return number of decoder audio buffers - *-----------------------------------------------------------------*/ - -/*! r: number of decoder buffers */ -Word16 ivas_get_nchan_buffers_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 sba_analysis_order, /* i : SBA order evaluated in SBA decoder */ - const Word32 ivas_total_brate /* i : total IVAS bitrate */ -) -{ - Word16 nchan_out_buff; - AUDIO_CONFIG output_config; - - output_config = st_ivas->hDecoderConfig->output_config; - move16(); - - nchan_out_buff = MAX_OUTPUT_CHANNELS; - move16(); - - IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) - { - nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; - move16(); - } - ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) - { - nchan_out_buff = s_max( st_ivas->hDecoderConfig->nchan_out, CPE_CHANNELS ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) - { - nchan_out_buff = st_ivas->nchan_ism; - move16(); - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - nchan_out_buff = s_max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) - { - Word16 nchan_internal; - nchan_internal = ivas_sba_get_nchan_metadata_fx( sba_analysis_order, ivas_total_brate ); - nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; - move16(); - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE - { - nchan_out_buff = s_max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - } - nchan_out_buff = s_max( nchan_out_buff, nchan_internal ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) - { - nchan_out_buff = CPE_CHANNELS; - move16(); - - test(); - test(); - test(); - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { - nchan_out_buff = shl( CPE_CHANNELS, 1 ); - } - ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) - { - nchan_out_buff = add( st_ivas->nchan_ism, CPE_CHANNELS ); - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - Word16 nchan_internal; - nchan_internal = ivas_sba_get_nchan_metadata_fx( sba_analysis_order, ivas_total_brate ); - nchan_out_buff = add( st_ivas->nchan_ism, st_ivas->nchan_transport ); - - IF( st_ivas->hMCT != NULL ) - { - nchan_out_buff = shl( shr( add( nchan_out_buff, 1 ), 1 ), 1 ); /* ensure odd number of channels in MCT */ - } - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) ) - { - nchan_out_buff = s_max( add( nchan_out_buff, st_ivas->nchan_ism ), audioCfg2channels( output_config ) ); /* needed for ivas_sba_upmixer_renderer() */ - } - ELSE - { - nchan_out_buff = s_max( add( nchan_out_buff, st_ivas->nchan_ism ), audioCfg2channels( output_config ) ); /* needed for ivas_spar_dec_upmixer_sf() which is based on 'nchan_out' */ - } - } - ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - nchan_out_buff = add( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_ism ); /*take into account sba_ch_idx' in ivas_dec() */ - } - - test(); - IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( nchan_internal, st_ivas->nchan_ism ) ); - } - nchan_out_buff = s_min( nchan_out_buff, MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) - { - nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE - { - nchan_out_buff = s_max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - } - } - - - return nchan_out_buff; -} - -/*-------------------------------------------------------------------* - * ivas_output_buff_dec() - * - * Allocate/reallocate output audio buffers - *-------------------------------------------------------------------*/ -ivas_error ivas_output_buff_dec_fx( - Word32 *p_output_f[], /* i/o: output audio buffers */ - const Word16 nchan_out_buff_old, /* i : previous frame number of output channels */ - const Word16 nchan_out_buff /* i : number of output channels */ -) -{ - Word16 ch; - IF( GT_16( nchan_out_buff, nchan_out_buff_old ) ) - { - FOR( ch = nchan_out_buff_old; ch < nchan_out_buff; ch++ ) - { - /* note: these are intra-frame heap memories */ - IF( ( p_output_f[ch] = (Word32 *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( Word32 ) ) ) == NULL ) /* note: 32000 == max internal sampling rate */ - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); - } - } - } - ELSE - { - FOR( ch = nchan_out_buff; ch < nchan_out_buff_old; ch++ ) - { - free( p_output_f[ch] ); - p_output_f[ch] = NULL; - } - } - return IVAS_ERR_OK; -} diff --git a/lib_rend/ivas_output_init_fx.c b/lib_rend/ivas_output_init_fx.c index 8beb5a0ecfd10a2b42e5a935127c62d97da94e05..053cb43c1e4ee0083dd07e708cd709cc14e3fd99 100644 --- a/lib_rend/ivas_output_init_fx.c +++ b/lib_rend/ivas_output_init_fx.c @@ -1,11 +1,312 @@ +/****************************************************************************************************** -#include "ivas_prot_fx.h" -#include "ivas_prot_rend_fx.h" -#ifdef FIX_DISCLAIMER + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include #include -#endif +#include "options.h" +#include "ivas_cnst.h" +#include "prot_fx.h" +#include "ivas_prot_rend_fx.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" +#include "ivas_prot_fx.h" + + +/*-------------------------------------------------------------------------* + * audioCfg2channels() + * + * Map Audio configuration to number of channels + *-------------------------------------------------------------------------*/ + +/*! r: number of audio channels */ +Word16 audioCfg2channels( + AUDIO_CONFIG output_config /* i : output audio configuration */ +) +{ + Word16 nchan_out; + + SWITCH( output_config ) + { + case IVAS_AUDIO_CONFIG_MONO: + nchan_out = 1; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_STEREO: + nchan_out = 2; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_5_1: + nchan_out = 6; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_7_1: + nchan_out = 8; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_5_1_2: + nchan_out = 8; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_5_1_4: + nchan_out = 10; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_7_1_4: + nchan_out = 12; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_FOA: + nchan_out = 4; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_HOA2: + nchan_out = 9; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_HOA3: + nchan_out = 16; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_OBA: + nchan_out = 8; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + nchan_out = 2; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_ISM1: + nchan_out = 1; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_ISM2: + nchan_out = 2; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_ISM3: + nchan_out = 3; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_ISM4: + nchan_out = 4; + move16(); + BREAK; + default: + IVAS_ERROR( IVAS_ERR_INTERNAL, "Error: illegal output configuration\n" ); + nchan_out = -1; + move16(); + BREAK; + } + + return ( nchan_out ); +} + +/*-------------------------------------------------------------------------* + * ivas_output_init() + * + * Initialize and configure IVAS output parameters + *-------------------------------------------------------------------------*/ +void ivas_output_init( + IVAS_OUTPUT_SETUP *hOutSetup, /* o : IVAS output setup structure */ + const AUDIO_CONFIG output_config /* i : output audio configuration */ +) +{ + Word16 nchan_out; -Word16 ivas_get_nchan_buffers_dec_ivas_fx( + /* set general default values */ + hOutSetup->output_config = output_config; + move16(); + hOutSetup->is_loudspeaker_setup = 0; + move16(); + hOutSetup->is_binaural_setup = 0; + move16(); + hOutSetup->ambisonics_order = -1; + move16(); + hOutSetup->separateChannelEnabled = 0; + move16(); + hOutSetup->separateChannelIndex = 0; + move16(); + + IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + hOutSetup->is_loudspeaker_setup = 1; + move16(); + /* set in ivas_init_decoder: */ + /* hOutSetup->ls_azimuth */ + /* hOutSetup->ls_elevation */ + /* hOutSetup->num_lfe */ + /* hOutSetup->index_lfe[0] */ + /* hOutSetup->is_planar_setup */ + } + ELSE + { + /* Set default values for all other than custom LS setup */ + hOutSetup->ls_azimuth_fx = NULL; + hOutSetup->ls_elevation_fx = NULL; + hOutSetup->num_lfe = 0; + move16(); + hOutSetup->index_lfe[0] = -1; + move16(); + hOutSetup->is_planar_setup = 0; + move16(); + + /* set output setup specific values */ + SWITCH( output_config ) + { + case IVAS_AUDIO_CONFIG_MONO: + hOutSetup->is_loudspeaker_setup = 1; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_STEREO: + hOutSetup->is_loudspeaker_setup = 1; + move16(); + hOutSetup->ls_azimuth_fx = ls_azimuth_CICP2_fx; // Q22 + hOutSetup->ls_elevation_fx = ls_elevation_CICP2_fx; // Q22 + BREAK; + case IVAS_AUDIO_CONFIG_FOA: + hOutSetup->ambisonics_order = SBA_FOA_ORDER; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_HOA2: + hOutSetup->ambisonics_order = SBA_HOA2_ORDER; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_HOA3: + hOutSetup->ambisonics_order = SBA_HOA3_ORDER; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_5_1: + hOutSetup->num_lfe = 1; + move16(); + hOutSetup->index_lfe[0] = 3; + move16(); + hOutSetup->is_loudspeaker_setup = 1; + move16(); + hOutSetup->ls_azimuth_fx = ls_azimuth_CICP6_fx; // Q22 + hOutSetup->ls_elevation_fx = ls_elevation_CICP6_fx; // Q22 + hOutSetup->is_planar_setup = 1; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_7_1: + hOutSetup->num_lfe = 1; + move16(); + hOutSetup->index_lfe[0] = 3; + move16(); + hOutSetup->is_loudspeaker_setup = 1; + move16(); + hOutSetup->ls_azimuth_fx = ls_azimuth_CICP12_fx; // Q22 + hOutSetup->ls_elevation_fx = ls_elevation_CICP12_fx; // Q22 + hOutSetup->is_planar_setup = 1; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_5_1_2: + hOutSetup->num_lfe = 1; + move16(); + hOutSetup->index_lfe[0] = 3; + move16(); + hOutSetup->is_loudspeaker_setup = 1; + move16(); + hOutSetup->ls_azimuth_fx = ls_azimuth_CICP14_fx; // Q22 + hOutSetup->ls_elevation_fx = ls_elevation_CICP14_fx; // Q22 + hOutSetup->is_planar_setup = 0; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_5_1_4: + hOutSetup->num_lfe = 1; + move16(); + hOutSetup->index_lfe[0] = 3; + move16(); + hOutSetup->is_loudspeaker_setup = 1; + move16(); + hOutSetup->ls_azimuth_fx = ls_azimuth_CICP16_fx; // Q22 + hOutSetup->ls_elevation_fx = ls_elevation_CICP16_fx; // Q22 + hOutSetup->is_planar_setup = 0; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_7_1_4: + hOutSetup->num_lfe = 1; + move16(); + hOutSetup->index_lfe[0] = 3; + move16(); + hOutSetup->is_loudspeaker_setup = 1; + move16(); + hOutSetup->ls_azimuth_fx = ls_azimuth_CICP19_fx; // Q22 + hOutSetup->ls_elevation_fx = ls_elevation_CICP19_fx; // Q22 + hOutSetup->is_planar_setup = 0; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + case IVAS_AUDIO_CONFIG_ISM1: + case IVAS_AUDIO_CONFIG_ISM2: + case IVAS_AUDIO_CONFIG_ISM3: + case IVAS_AUDIO_CONFIG_ISM4: + hOutSetup->is_binaural_setup = 1; + move16(); + case IVAS_AUDIO_CONFIG_EXTERNAL: + /* Default values are used */ + BREAK; + default: + return; + } + } + + test(); + IF( NE_16( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && NE_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_out = audioCfg2channels( output_config ); + hOutSetup->nchan_out_woLFE = sub( nchan_out, hOutSetup->num_lfe ); + move16(); + } + + return; +} + + +/*-----------------------------------------------------------------* + * ivas_get_nchan_buffers_dec() + * + * Return number of decoder audio buffers + *-----------------------------------------------------------------*/ + +/*! r: number of decoder buffers */ +Word16 ivas_get_nchan_buffers_dec_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word16 sba_analysis_order, /* i : SBA order evaluated in SBA decoder */ const Word32 ivas_total_brate /* i : total IVAS bitrate */ @@ -17,151 +318,210 @@ Word16 ivas_get_nchan_buffers_dec_ivas_fx( output_config = st_ivas->hDecoderConfig->output_config; move16(); - nchan_out_buff = MAX_OUTPUT_CHANNELS; + nchan_out_buff = st_ivas->nchan_transport; move16(); - IF( EQ_16( st_ivas->ivas_format, MONO_FORMAT ) ) + IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) { nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; move16(); } - ELSE IF( EQ_16( st_ivas->ivas_format, STEREO_FORMAT ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) { nchan_out_buff = s_max( st_ivas->hDecoderConfig->nchan_out, CPE_CHANNELS ); } - ELSE IF( EQ_16( st_ivas->ivas_format, ISM_FORMAT ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { - nchan_out_buff = st_ivas->nchan_ism; - move16(); + nchan_out_buff = s_max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_ism ); - IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE IF( NE_16( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { - nchan_out_buff = s_max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); + nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); } } - ELSE IF( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) { Word16 nchan_internal; nchan_internal = ivas_sba_get_nchan_metadata_fx( sba_analysis_order, ivas_total_brate ); - nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; - move16(); - IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE - { - nchan_out_buff = s_max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - } - nchan_out_buff = s_max( nchan_out_buff, nchan_internal ); + nchan_out_buff = s_max( nchan_internal, st_ivas->hDecoderConfig->nchan_out ); } - ELSE IF( EQ_16( st_ivas->ivas_format, MASA_FORMAT ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { - nchan_out_buff = CPE_CHANNELS; - move16(); + nchan_out_buff = s_max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport ); test(); - test(); - test(); - IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + IF( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr ) { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_STEREO ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { - nchan_out_buff = shl( CPE_CHANNELS, 1 ); + nchan_out_buff = 2 * BINAURAL_CHANNELS; move16(); } - ELSE IF( NE_16( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - } } - ELSE IF( EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - nchan_out_buff = add( st_ivas->nchan_ism, CPE_CHANNELS ); - - IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE IF( NE_16( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - } + nchan_out_buff = s_max( st_ivas->hDecoderConfig->nchan_out, add( st_ivas->nchan_transport, st_ivas->nchan_ism ) ); } - ELSE IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { Word16 nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata_fx( sba_analysis_order, ivas_total_brate ); - nchan_out_buff = add( st_ivas->nchan_ism, st_ivas->nchan_transport ); - IF( st_ivas->hMCT != NULL ) + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) { - nchan_out_buff = shl( shr( add( nchan_out_buff, 1 ), 1 ), 1 ); /* ensure odd number of channels in MCT */ + nchan_internal = add( nchan_internal, st_ivas->nchan_ism ); } - IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + if ( st_ivas->hMCT != NULL ) { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); + nchan_internal = shl( shr( add( nchan_internal, 1 ), 1 ), 1 ); /* ensure odd number of channels in MCT */ } - ELSE IF( NE_16( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + + nchan_out_buff = s_max( nchan_internal, st_ivas->hDecoderConfig->nchan_out ); + + if ( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) + { + nchan_out_buff = max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport ); + IF( st_ivas->hOutSetup.separateChannelEnabled ) + { + nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->nchan_transport, 1 ) ); + } + + IF( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr ) + { + nchan_out_buff = 2 * BINAURAL_CHANNELS; move16(); - IF( EQ_16( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || EQ_16( st_ivas->renderer_type, RENDERER_OSBA_LS ) ) - { - nchan_out_buff = s_max( add( nchan_out_buff, st_ivas->nchan_ism ), audioCfg2channels( output_config ) ); /* needed for ivas_sba_upmixer_renderer() */ - } - ELSE - { - nchan_out_buff = s_max( add( nchan_out_buff, st_ivas->nchan_ism ), audioCfg2channels( output_config ) ); /* needed for ivas_spar_dec_upmixer_sf() which is based on 'nchan_out' */ - } } - ELSE IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + ELSE { - nchan_out_buff = add( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_ism ); /*take into account sba_ch_idx' in ivas_dec() */ + nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); } + } - test(); - IF( !( EQ_16( output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) + test(); + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses * BINAURAL_CHANNELS ); + } + + return nchan_out_buff; +} + + +/*-------------------------------------------------------------------* + * ivas_output_buff_dec() + * + * Allocate/reallocate output audio buffers + *-------------------------------------------------------------------*/ + +ivas_error ivas_output_buff_dec_fx( + Word32 *p_output_fx[], /* i/o: output audio buffers */ + const Word16 nchan_out_buff, /* i : number of output channels */ + const Word16 Opt_tsm, /* i : TSM option flag */ + DECODER_TC_BUFFER_HANDLE hTcBuffer /* i : TSM buffer handle */ +) +{ + Word16 ch, nchan_tc_jbm, nsamp_to_allocate, n_samp_full, offset; + + FOR( ch = 0; ch < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; ch++ ) + { + p_output_fx[ch] = NULL; + } + + IF( hTcBuffer->tc_buffer2_fx != NULL ) + { + free( hTcBuffer->tc_buffer2_fx ); + hTcBuffer->tc_buffer2_fx = NULL; + } + + nchan_tc_jbm = 0; + move16(); + if ( Opt_tsm ) + { + /* JBM decoding: output audio buffers are shared with audio buffers from 'hTcBuffer->tc[]' */ + nchan_tc_jbm = s_max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); + } + + test(); + IF( LE_16( nchan_out_buff, nchan_tc_jbm ) && !Opt_tsm ) + { + FOR( ch = 0; ch < nchan_out_buff; ch++ ) { - nchan_out_buff = s_max( nchan_out_buff, add( nchan_internal, st_ivas->nchan_ism ) ); + p_output_fx[ch] = hTcBuffer->tc_fx[ch]; } - nchan_out_buff = s_min( nchan_out_buff, MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS ); } - ELSE IF( EQ_16( st_ivas->ivas_format, MC_FORMAT ) ) + ELSE { - nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; + FOR( ch = 0; ch < nchan_tc_jbm; ch++ ) + { + p_output_fx[ch] = hTcBuffer->tc_fx[ch]; + } + + /* non-JBM decoding: allocate output audio buffers */ + /* JBM decoding: when not enough audio buffers 'hTcBuffer->tc[]', allocate additional buffers */ + n_samp_full = ( 48000 / FRAMES_PER_SEC ); move16(); + nsamp_to_allocate = imult1616( sub( nchan_out_buff, nchan_tc_jbm ), n_samp_full ); - IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + IF( GT_16( nsamp_to_allocate, 0 ) ) { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); + /* note: these are intra-frame heap memories */ + IF( ( hTcBuffer->tc_buffer2_fx = (Word32 *) malloc( nsamp_to_allocate * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for output audio buffer!\n" ) ); + } + + set_zero_fx( hTcBuffer->tc_buffer2_fx, nsamp_to_allocate ); } - ELSE + + offset = 0; + move16(); + FOR( ; ch < nchan_out_buff; ch++ ) { - nchan_out_buff = s_max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); + p_output_fx[ch] = &hTcBuffer->tc_buffer2_fx[offset]; + offset = add( offset, n_samp_full ); } } + return IVAS_ERR_OK; +} + - return nchan_out_buff; +/*---------------------------------------------------------------------* + * is_split_rendering_enabled() + * + * + *---------------------------------------------------------------------*/ + +/*! r: flag to indicate if split rendering is enabled */ +Word16 is_split_rendering_enabled( + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ + const IVAS_RENDER_CONFIG_HANDLE hRenderConfig /* i : Render config data structure */ +) +{ + test(); + test(); + test(); + test(); + IF( EQ_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || + ( EQ_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && hDecoderConfig->Opt_non_diegetic_pan && hRenderConfig->split_rend_config.dof == 0 ) ) + { + return 1; + } + else + { + return 0; + } } -#ifdef FIX_DISCLAIMER + /*---------------------------------------------------------------------* * get_channel_config() * @@ -272,4 +632,3 @@ ivas_error get_channel_config( return IVAS_ERR_OK; } -#endif diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 04afce118f8d9539a944126a311e5298e16aafac..563e2be0548d35ee3c49a09025b09d4c78b745f1 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -49,11 +49,13 @@ IVAS_REND_AudioConfigType getAudioConfigType( const AUDIO_CONFIG config ); + ivas_error getAudioConfigNumChannels( const AUDIO_CONFIG config, Word16 *numChannels ); + /*----------------------------------------------------------------------------------* * output setup prototypes *----------------------------------------------------------------------------------*/ @@ -69,80 +71,63 @@ void ivas_output_init( ); /*! r: number of decoder buffers */ -Word16 ivas_get_nchan_buffers_dec( +Word16 ivas_get_nchan_buffers_dec_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 sba_analysis_order, /* i : SBA order evaluated in SBA decoder */ - const Word32 ivas_total_brate /* i : total IVAS bitrate */ + const Word16 sba_analysis_order, /* i : SBA order evaluated in SBA decoder */ + const Word32 ivas_total_brate /* i : total IVAS bitrate */ ); -Word16 ivas_get_nchan_buffers_dec_ivas_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 sba_analysis_order, /* i : SBA order evaluated in SBA decoder */ - const Word32 ivas_total_brate /* i : total IVAS bitrate */ +/*! r: flag to indicate if split rendering is enabled */ +Word16 is_split_rendering_enabled( + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ + const IVAS_RENDER_CONFIG_HANDLE hRenderConfig /* i : Render config data structure */ ); -#ifdef FIX_DISCLAIMER ivas_error get_channel_config( const AUDIO_CONFIG config, /* i : audio configuration */ Word8 *str /* o : string with the configuration name */ ); -#endif -/*----------------------------------------------------------------------------------* - * Limiter prototypes - *----------------------------------------------------------------------------------*/ - -void ivas_limiter_dec_fx( - IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ - Word32 *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ - const Word16 num_channels, /* i : number of channels to be processed */ - const Word16 output_frame, /* i : number of samples per channel in the buffer */ - const Word16 BER_detect, /* i : BER detect flag */ - Word16 q_factor /* i : Q factor of the output samples */ -); - -void limiter_process_fx( - IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ - const Word16 output_frame, /* i : number of samples to be processed per channel in the I/O buffer */ - const Word32 threshold, /* i : signal amplitude above which limiting starts to be applied */ - const Word16 BER_detect, /* i : BER detect flag */ - Word16 *strong_saturation_cnt, /* i/o: counter of strong saturations (can be NULL) */ - Word16 q_factor /* i : Q factor of output samples */ -); /*----------------------------------------------------------------------------------* * TD decorr. function prototypes *----------------------------------------------------------------------------------*/ + ivas_error ivas_td_decorr_dec_open_fx( ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ - const Word32 output_Fs, /* i : output sampling rate */ - const Word16 nchan_internal, /* i : number of internal channels */ - const Word16 ducking_flag /* i : ducking flag */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 nchan_internal, /* i : number of internal channels */ + const Word16 ducking_flag /* i : ducking flag */ ); + void ivas_td_decorr_dec_close( ivas_td_decorr_state_t **hTdDecorr /* i/o: TD decorrelator handle */ ); + void ivas_td_decorr_process_fx( ivas_td_decorr_state_t *hTdDecorr, /* i/o: TD decoderrelator handle */ - Word32 *pcm_in[], /* i : input audio channels */ - Word32 **ppOut_pcm, /* o : output audio channels */ - const Word16 output_frame /* i : output frame length */ + Word32 *pcm_in[], /* i : input audio channels */ + Word32 **ppOut_pcm, /* o : output audio channels */ + const Word16 output_frame /* i : output frame length */ ); + ivas_error ivas_td_decorr_reconfig_dec( const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word32 ivas_total_brate, /* i : total IVAS bitrate */ - const Word16 nchan_transport, /* i : number of transport channels */ - const Word32 output_Fs, /* i : output sampling rate */ + const Word32 ivas_total_brate, /* i : total IVAS bitrate */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word32 output_Fs, /* i : output sampling rate */ ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ - UWord16 *useTdDecorr /* i/o: TD decorrelator flag */ + UWord16 *useTdDecorr /* i/o: TD decorrelator flag */ ); void ivas_td_decorr_APD_iir_filter_fx( ivas_td_decorr_APD_filt_state_t *filter_state, /* i/o: TD decorrelator filter handle */ - Word32 *pIn_out, /* i/o: audio channels */ - const Word16 num_APD_sections, /* i : numbef of APD sections */ - const Word16 output_frame /* i : output frame length */ + Word32 *pIn_out, /* i/o: audio channels */ + const Word16 num_APD_sections, /* i : numbef of APD sections */ + const Word16 output_frame /* i : output frame length */ ); + + /*----------------------------------------------------------------------------------* * Amplitude Panning EFAP prototypes *----------------------------------------------------------------------------------*/ @@ -155,6 +140,10 @@ ivas_error efap_init_data_fx( const Word16 efap_mode /* i : indicates whether EFAP or EFIP is used */ ); +void efap_free_data_fx( + EFAP_HANDLE *hEFAPdata /* i/o: EFAP handle to be freed */ +); + void efap_determine_gains_fx( EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ Word32 *gains, /* o : gain vector for speaker nodes for given direction Q30 */ @@ -162,24 +151,26 @@ void efap_determine_gains_fx( const Word32 ele_deg, /* i : elevation in degrees for panning direction (positive up) Q22 */ const Word16 efap_mode /* i : indicates whether EFAP or EFIP is used */ ); + + /*----------------------------------------------------------------------------------* * Amplitude Panning VBAP prototypes *----------------------------------------------------------------------------------*/ ivas_error vbap_init_data_fx( - VBAP_HANDLE *hVBAPdata, /* i/o: handle for VBAP data structure that will be initialized */ - const Word32 *speaker_node_azi_deg_fx, /* i : vector of speaker node azimuths (positive left) Q22 */ - const Word32 *speaker_node_ele_deg_fx, /* i : vector of speaker node elevations (positive up) Q22 */ - const Word16 num_speaker_nodes, /* i : number of speaker nodes in the set */ - const IVAS_FORMAT ivas_format /* i : IVAS format */ + VBAP_HANDLE *hVBAPdata, /* i/o: handle for VBAP data structure that will be initialized */ + const Word32 *speaker_node_azi_deg_fx, /* i : vector of speaker node azimuths (positive left) Q22 */ + const Word32 *speaker_node_ele_deg_fx, /* i : vector of speaker node elevations (positive up) Q22 */ + const Word16 num_speaker_nodes, /* i : number of speaker nodes in the set */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ ); void vbap_determine_gains_fx( - const VBAP_HANDLE hVBAPdata, /* i : prepared VBAP structure */ - Word32 *gains_fx, /* o : gain vector for loudspeakers for given direction Q29 */ - const Word16 azi_deg, /* i : azimuth in degrees for panning direction (positive left) Q0 */ - const Word16 ele_deg, /* i : elevation in degrees for panning direction (positive up) Q0 */ - const Word16 use_object_mode /* i : select between object mode panning and spatial mode panning */ + const VBAP_HANDLE hVBAPdata, /* i : prepared VBAP structure */ + Word32 *gains_fx, /* o : gain vector for loudspeakers for given direction Q29 */ + const Word16 azi_deg, /* i : azimuth in degrees for panning direction (positive left) Q0 */ + const Word16 ele_deg, /* i : elevation in degrees for panning direction (positive up) Q0 */ + const Word16 use_object_mode /* i : select between object mode panning and spatial mode panning */ ); void vbap_free_data_fx( @@ -192,47 +183,55 @@ void vbap_free_data_fx( *----------------------------------------------------------------------------------*/ void ivas_sba_prototype_renderer_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ Word32 inIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ - Word16 q_cldfb[6][CLDFB_SLOTS_PER_SUBFRAME], - const Word16 subframe /* i : Subframe to render */ + Word16 q_cldfb[6][CLDFB_SLOTS_PER_SUBFRAME], + const Word16 subframe /* i : Subframe to render */ ); ivas_error ivas_sba_get_hoa_dec_matrix_fx( - const IVAS_OUTPUT_SETUP hOutSetup, /* i : target output setup */ - Word32 **hoa_dec_mtx, /* o : ALLRAD decoder matrix, Q29 */ - const Word16 ambisonics_order /* i : Ambisonics order */ + const IVAS_OUTPUT_SETUP hOutSetup, /* i : target output setup */ + Word32 **hoa_dec_mtx, /* o : ALLRAD decoder matrix, Q29 */ + const Word16 ambisonics_order /* i : Ambisonics order */ ); + void ivas_dirac_dec_binaural_sba_gain_fx( - Word32 *output[], /* i/o: synthesized core-coder transport channels/DirAC output, inp Qx, out Qx-1 */ - const Word16 nchan_remapped, /* i : num channels after remapping of TCs */ - const Word16 output_frame /* i : output frame length */ + Word32 *output[], /* i/o: synthesized core-coder transport channels/DirAC output, inp Qx, out Qx-1 */ + const Word16 nchan_remapped, /* i : num channels after remapping of TCs */ + const Word16 output_frame /* i : output frame length */ ); void ivas_dirac_dec_binaural_render_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ - UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ - UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - const Word16 nchan_transport, /* i : number of transport channels */ - Word32 *output_f[] /* o : rendered time signal, Q11 */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + const Word16 nchan_transport, /* i : number of transport channels */ + Word32 *output_fx[] /* o : rendered time signal, Q11 */ ); + void ivas_masa_ext_rend_parambin_render_fx( - MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA ext rend structure */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ - Word32 *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output Q11*/ - const Word16 num_subframes ); /* i : number of subframes to render */ + MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA ext rend structure */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ + Word32 *output_fx[], /* i/o: synthesized core-coder transport channels/DirAC output Q11*/ + const Word16 num_subframes, /* i : number of subframes to render */ + const SPLIT_REND_WRAPPER *hSplitRendWrapper, /* i : split rendering orientation data */ + Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : rendered orientations for split rend. real part of cldfb */ + Word32 Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] /* o : rendered orientations for split rend. imag part of cldfb */ +); + ivas_error ivas_dirac_dec_init_binaural_data_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : HRTF structure for rendering */ + HRTFS_PARAMBIN_HANDLE *phHrtfParambin /* i : HRTF structure for rendering */ ); -void ivas_dirac_dec_close_binaural_data( +void ivas_dirac_dec_close_binaural_data_fx( DIRAC_DEC_BIN_HANDLE *hBinaural /* i/o: decoder DirAC binaural data handle */ ); + ivas_error ivas_dirac_dec_binaural_copy_hrtfs_fx( - HRTFS_PARAMBIN_HANDLE *hHrtfParambin /* i/o: HRTF structure for rendering */ + HRTFS_PARAMBIN_HANDLE *hHrtfParambin /* i/o: HRTF structure for rendering */ ); ivas_error ivas_dirac_alloc_mem_fx( @@ -240,7 +239,8 @@ ivas_error ivas_dirac_alloc_mem_fx( const RENDERER_TYPE renderer_type, const Word16 num_freq_bands, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem, - const Word16 hodirac_flag); + const Word16 hodirac_flag +); void ivas_dirac_free_mem_fx( DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem @@ -376,11 +376,11 @@ void ivas_lfe_synth_with_cldfb_fx( ); void rotateAziEle_DirAC_fx( - Word16 *azi, /* i/o: array of azimuth values */ - Word16 *ele, /* i/o: array of elevation values */ - const Word16 band1, /* i : bands to work on (lower limit) */ - const Word16 band2, /* i : bands to work on (upper bound) */ - const Word32 *p_Rmat_fx /* i : pointer to real-space rotation matrix q30*/ + Word16 *azi, /* i/o: array of azimuth values */ + Word16 *ele, /* i/o: array of elevation values */ + const Word16 band1, /* i : bands to work on (lower limit) */ + const Word16 band2, /* i : bands to work on (upper bound) */ + const Word32 *p_Rmat_fx /* i : pointer to real-space rotation matrix q30*/ ); ivas_error ivas_dirac_dec_onset_detection_open_fx( @@ -388,7 +388,8 @@ ivas_error ivas_dirac_dec_onset_detection_open_fx( const Word16 num_freq_bands, //Q0 const Word16 max_band_decorr, //Q0 DIRAC_ONSET_DETECTION_PARAMS *ph_dirac_onset_detection_params, - DIRAC_ONSET_DETECTION_STATE *ph_dirac_onset_detection_state ); + DIRAC_ONSET_DETECTION_STATE *ph_dirac_onset_detection_state +); ivas_error ivas_dirac_dec_decorr_open_fx( DIRAC_DECORR_PARAMS **ph_freq_domain_decorr_ap_params, @@ -415,7 +416,7 @@ void ivas_dirac_dec_decorr_process_fx( Word16 num_channels, const Word16 num_protos_diff, const DIRAC_SYNTHESIS_CONFIG synthesisConf, - const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 nchan_transport, /* i : number of transport channels */ const Word32 *input_frame_fx, Word16 q_inp_frame, const Word16 num_protos_dir, @@ -436,16 +437,16 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ const RENDERER_TYPE renderer_type, /* i : renderer type */ - const Word16 nchan_transport, /* i : number of transport channels */ - const Word32 output_Fs, /* i : output sampling rate */ - const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); void ivas_dirac_dec_output_synthesis_init_fx( - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ - DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ - const Word16 nchan_out_woLFE, /* i : number of output audio channels without LFE */ - const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const Word16 nchan_out_woLFE, /* i : number of output audio channels without LFE */ + const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); void ivas_dirac_dec_output_synthesis_close_fx( @@ -453,27 +454,26 @@ void ivas_dirac_dec_output_synthesis_close_fx( ); void ivas_dirac_dec_output_synthesis_process_slot_fx( - const Word32 *reference_power, /* i : Estimated power */ - const Word16 q_reference_power, /* i : Estimated power */ - const Word32 *onset, /* i : onset filter */ + const Word32 *reference_power, /* i : Estimated power */ + const Word16 *q_reference_power, /* i : Estimated power */ + const Word32 *onset, /* i : onset filter */ const Word16 *azimuth, const Word16 *elevation, const Word32 *diffuseness, Word16 q_diffuseness, - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ - DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ - const Word16 sh_rot_max_order, - const Word32 *p_Rmat, /* i : rotation matrix */ - const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ - const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ - const Word16 nchan_transport, /* i : number of transport channels*/ + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ + const Word16 nchan_transport, /* i : number of transport channels */ const Word16 md_idx, - const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - const Word16 dec_param_estim); + const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + const Word16 dec_param_estim +); void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( - Word32 RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ - Word32 ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ + Word32 RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ + Word32 ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ const Word16 nchan_transport, /* i : number of transport channels */ @@ -481,18 +481,18 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( const Word32 *onset_filter, Word32 *diffuseness, const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - const Word16 dec_param_estim, /* i : flag to indicate parameter estimation mode */ + const Word16 dec_param_estim, /* i : flag to indicate parameter estimation mode */ Word16 *q_cy_cross_dir_smooth_prev, Word16 *q_cy_auto_diff_smooth_prev ); void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( - Word32 RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ - Word32 ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ + Word32 RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ + Word32 ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ - const Word16 nbslots, /* i : number of slots to process */ - Word32 *diffuseness_vector, /* i : diffuseness (needed for direction smoothing)*/ + const Word16 nbslots, /* i : number of slots to process */ + Word32 *diffuseness_vector, /* i : diffuseness (needed for direction smoothing)*/ Word32 *reference_power_smooth, Word16 *q_reference_power_smooth, Word32 qualityBasedSmFactor, @@ -505,7 +505,8 @@ void compute_hoa_encoder_mtx_fx( const Word32 *elevation, /*q22*/ Word32 *response_fx, /*q31*/ const Word16 num_responses, - const Word16 ambisonics_order ); + const Word16 ambisonics_order +); void ivas_dirac_dec_compute_gain_factors_fx( const Word16 num_freq_bands, @@ -535,8 +536,6 @@ void ivas_dirac_dec_compute_directional_responses_fx( const Word16 md_idx, const Word32 *surCohRatio_fx, Word16 Q_surCohRatio, - const Word16 shd_rot_max_order, /* i : split-order rotation method */ - const Word32 *p_Rmat, /* i : rotation matrix */ const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); @@ -561,19 +560,21 @@ ivas_error ivas_spat_hSpatParamRendCom_config_fx( ivas_error ivas_dirac_allocate_parameters_fx( SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common data for spatial parametric rendering */ - const Word16 params_flag /* i : set of parameters flag */ + const Word16 params_flag /* i : set of parameters flag */ ); void ivas_dirac_deallocate_parameters_fx( SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common data for spatial parametric rendering */ - const Word16 params_flag /* i : set of parameters flag */ + const Word16 params_flag /* i : set of parameters flag */ ); void ivas_masa_ext_dirac_render_fx( - MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA renderer structure */ - Word32 *output_f[], /* i/o: input/output signals in time domain q11*/ - const Word16 num_subframes /* i : number of subframes to render */ + MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA renderer structure */ + Word32 *output_fx[], /* i/o: input/output signals in time domain q11 */ + const Word16 num_subframes /* i : number of subframes to render */ ); + + /*----------------------------------------------------------------------------------* * HRTF *----------------------------------------------------------------------------------*/ @@ -603,30 +604,49 @@ void ivas_HRTF_parambin_binary_close_fx( ); ivas_error ivas_HRTF_CRend_binary_open_fx( - HRTFS_CREND **hSetOfHRTF /* i/o: Set of HRTF handle */ + HRTFS_CREND_DATA **hHrtfCrend /* i/o: Crend HRTF handle */ +); + +ivas_error ivas_HRTF_CRend_binary_open_buffers_int16( + Word16 **buffer, /* o : buffer to allocate */ + const uint32_t mem_size /* i : size of buffer */ ); void ivas_HRTF_CRend_binary_close_fx( - HRTFS_CREND **hSetOfHRTF /* i/o: Set of HRTF handle */ + HRTFS_CREND_DATA **hHrtfCrend /* i/o: Crend HRTF handle */ +); + +ivas_error ivas_HRTF_statistics_init_fx( + HRTFS_STATISTICS_HANDLE *hHrtfStatistics, /* i/o: HRTF statistics structure */ + const Word32 sampleRate /* i : Sample rate */ +); + +void ivas_HRTF_statistics_close_fx( + HRTFS_STATISTICS **hHrtfStatistics /* i/o: HRTF statistics structure */ +); + +ivas_error ivas_HRTF_statistics_binary_open_fx( + HRTFS_STATISTICS **hHrtfStatistics /* i/o: HRTF statistics structure */ ); /*----------------------------------------------------------------------------------* * TD object renderer *----------------------------------------------------------------------------------*/ + ivas_error ivas_td_binaural_renderer_unwrap_fx( - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const AUDIO_CONFIG transport_config, /* i : Transport configuration */ - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD binaural object renderer handle */ - const Word16 num_src, /* i : number of sources to render */ - const Word16 lfe_idx, /* i : LFE channel index */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i/o: combined orientaton data handle */ - const Word16 ism_md_subframe_update, /* i : Number of subframes to delay ism metadata to sync with audio */ - Word32 *output_fx[], /* i/o: SCE channels / Binaural synthesis Q11 */ - const Word16 output_frame, /* i : output frame length */ - const Word16 num_subframes /* i : number of subframes to render */ + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const AUDIO_CONFIG transport_config, /* i : Transport configuration */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD binaural object renderer handle */ + const Word16 num_src, /* i : number of sources to render */ + const Word16 lfe_idx, /* i : LFE channel index */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i/o: combined orientaton data handle */ + const Word16 ism_md_subframe_update, /* i : Number of subframes to delay ism metadata to sync with audio */ + Word32 *output_fx[], /* i/o: SCE channels / Binaural synthesis Q11 */ + const Word16 output_frame, /* i : output frame length */ + const Word16 num_subframes /* i : number of subframes to render */ ); ivas_error ivas_td_binaural_renderer_ext_fx( @@ -636,20 +656,21 @@ ivas_error ivas_td_binaural_renderer_ext_fx( const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData,/* i : Combined head and external orientations */ const IVAS_ISM_METADATA *currentPos, /* i : Object position */ const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const Word16 ism_md_subframe_update_ext, /* i : Metadata Delay in subframes to sync with audio delay */ - const Word32 output_Fs, /* i : output sampling rate */ - const Word16 output_frame, /* i : output frame length */ - Word32 output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis Q11 */ + const Word16 ism_md_subframe_update_ext, /* i : Metadata Delay in subframes to sync with audio delay */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 output_frame, /* i : output frame length */ + Word32 output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis Q11 */ Word16 *exp ); ivas_error ivas_td_binaural_open_unwrap_fx( TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HR filter model (from file or NULL) */ - const Word32 output_Fs, /* i : Output sampling rate */ - const Word16 nchan_transport, /* i : Number of channels */ + const Word32 output_Fs, /* i : Output sampling rate */ + const Word16 nchan_transport, /* i : Number of channels */ const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */ const AUDIO_CONFIG transport_config, /* i : Transport configuration */ - const Word16 *directivity, /* i : Directivity pattern (used for ISM) */ + const Word16 *directivity, /* i : Directivity pattern (used for ISM) */ + const Word32 *distAtt, /* i : Distance attenuation (used for ISM) */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */ BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */ Word32 *binaural_latency_ns, /* i : Binauralization delay */ @@ -662,6 +683,7 @@ ivas_error ivas_td_binaural_open_ext_fx( RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ LSSETUP_CUSTOM_STRUCT *customLsInput, const Word32 output_Fs, + const Word16 object_id, /* i : Object ID */ Word16 *SrcInd, Word16 *num_src ); @@ -671,11 +693,10 @@ void ivas_td_binaural_close_fx( ); ivas_error TDREND_GetMix_fx( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - Word32 *output[], /* i/o: ISM object synth / rendered output in 0,1 */ - const Word16 subframe_length, /* i/o: subframe length Q11 */ - const Word16 subframe_idx, /* i : Subframe index to 5 ms subframe */ - const Word16 ism_md_subframe_update /* i : Number of subframes to delay ism metadata to sync with audio */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + Word32 *output[], /* i/o: ISM object synth/rendered output in 0,1 */ + const Word16 subframe_length, /* i/o: subframe length Q11 */ + const Word16 subframe_idx /* i : Subframe index to 5 ms subframe */ ); void BSplineModelEvalDealloc_fx( @@ -686,15 +707,15 @@ void BSplineModelEvalDealloc_fx( /* ----- Object renderer - hrfilt ----- */ void GetFilterFromAngle_fx( - TDREND_HRFILT_FiltSet_t *HrFiltSet_p, /* i/o: HR filter set structure */ - const Word32 Elev_fx, /* i : Elevation, degrees Q22 */ - Word32 Azim_fx, /* i : Azimuth, degrees Q22 */ - const Word16 filterlength, /* i : Filter length */ - Word32 *hrf_left_fx, /* o : Left HR filter */ - Word16 *hrf_left_e, /* o : Left HR filter exponent */ - Word32 *hrf_right_fx, /* o : Right HR filter */ - Word16 *hrf_right_e, /* o : Right HR filter exponent */ - Word16 *itd /* o : ITD value Q0 */ + TDREND_HRFILT_FiltSet_t *HrFiltSet_p, /* i/o: HR filter set structure */ + const Word32 Elev_fx, /* i : Elevation, degrees Q22 */ + Word32 Azim_fx, /* i : Azimuth, degrees Q22 */ + const Word16 filterlength, /* i : Filter length */ + Word32 *hrf_left_fx, /* o : Left HR filter */ + Word16 *hrf_left_e, /* o : Left HR filter exponent */ + Word32 *hrf_right_fx, /* o : Right HR filter */ + Word16 *hrf_right_e, /* o : Right HR filter exponent */ + Word16 *itd /* o : ITD value Q0 */ ); void HRTF_model_precalc( @@ -702,60 +723,78 @@ void HRTF_model_precalc( ); ivas_error TDREND_REND_RenderSourceHRFilt_fx( - TDREND_SRC_t *Src_p, /* i/o: The source to be rendered */ - Word32 *hrf_left_delta_fx, /* i/o: Left filter interpolation delta */ - Word16 *hrf_left_delta_e, /* i/o: Left filter interpolation delta exp */ - Word32 *hrf_right_delta_fx, /* i/o: Right filter interpolation delta */ - Word16 *hrf_right_delta_e, /* i/o: Right filter interpolation delta exp */ - const Word16 intp_count, /* i : Interpolation count */ - Word32 output_buf_fx[][L_SPATIAL_SUBFR_48k], /* o : Output buffer same Q as Src_p->InputFrame_p_fx Q11 */ - const Word16 subframe_length /* i : Subframe length in use */ + TDREND_SRC_t *Src_p, /* i/o: The source to be rendered */ + Word32 *hrf_left_delta_fx, /* i/o: Left filter interpolation delta */ + Word16 *hrf_left_delta_e, /* i/o: Left filter interpolation delta exp */ + Word32 *hrf_right_delta_fx, /* i/o: Right filter interpolation delta */ + Word16 *hrf_right_delta_e, /* i/o: Right filter interpolation delta exp */ + const Word16 intp_count, /* i : Interpolation count */ + Word32 output_buf_fx[][L_SPATIAL_SUBFR_48k], /* o : Output buffer same Q as Src_p->InputFrame_p_fx Q11 */ + const Word16 subframe_length /* i : Subframe length in use */ ); /* ----- Object renderer - sources ----- */ ivas_error TDREND_MIX_SRC_SetPos_fx( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - const Word16 SrcInd, /* i : Source index */ - const Word32 *Vec_p /* i : Position vector */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const Word16 SrcInd, /* i : Source index */ + const Word32 *Vec_p /* i : Position vector */ ); ivas_error TDREND_MIX_SRC_SetDir_fx( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - const Word16 SrcInd, /* i : Source index */ - const Word32 *Vec_p, /* i : Direction vector */ - const Word16 Vec_p_q /* i : Direction vector q */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const Word16 SrcInd, /* i : Source index */ + const Word32 *Vec_p, /* i : Direction vector */ + const Word16 Vec_p_q /* i : Direction vector q */ +); + +ivas_error TDREND_MIX_SRC_SetGain( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const Word16 SrcInd, + const Word32 Gain /* i : Gain */ ); + ivas_error TDREND_MIX_SRC_SetDirAtten_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - const Word16 SrcInd, /* i : Source index */ + const Word16 SrcInd, /* i : Source index */ const TDREND_DirAtten_t *DirAtten_p /* i : Directional attenuation specifier */ ); +ivas_error TDREND_MIX_SRC_SetDistAtten( + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const Word16 SrcInd, /* i : Source index */ + const TDREND_DistAtten_t *DistAtten_p /* i : Distance attenuation specifier */ +); + ivas_error TDREND_MIX_SRC_SetPlayState( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - const Word16 SrcInd, /* i : Source index */ + const Word16 SrcInd, /* i : Source index */ const TDREND_PlayStatus_t PlayStatus /* i : Play state */ ); +// ivas_error TDREND_SRC_SPATIAL_SetGain( +// BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ +// const Word32 SrcGain_p /* i : Source gain */ +// ); + void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - TDREND_SRC_REND_t *SrcRend_p, /* i/o: Source object */ - TDREND_SRC_SPATIAL_t *SrcSpatial_p, /* i : Spatial aspects of source */ - Word32 *hrf_left_prev, /* i/o: Left filter */ - Word16 *hrf_left_prev_e, /* i/o: Left filter exponent */ - Word32 *hrf_right_prev, /* i/o: Right filter */ - Word16 *hrf_right_prev_e, /* i/o: Right filter exponent */ - Word32 *hrf_left_delta, /* o : Left filter interpolation delta */ - Word16 *hrf_left_delta_e, /* o : Left filter interpolation delta exponent */ - Word32 *hrf_right_delta, /* o : Right filter interpolation delta */ - Word16 *hrf_right_delta_e, /* o : Right filter interpolation delta exponent */ - Word16 *intp_count, /* o : Interpolation count */ - Word16 *filterlength, /* o : Length of filters */ - Word16 *itd, /* o : ITD value */ - Word16 *Gain, /* o : Gain value */ - TDREND_SRC_t *Src_p, /* i/o: Source pointer */ - const Word16 subframe_update_flag); + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + TDREND_SRC_REND_t *SrcRend_p, /* i/o: Source object */ + TDREND_SRC_SPATIAL_t *SrcSpatial_p, /* i : Spatial aspects of source */ + Word32 *hrf_left_prev, /* i/o: Left filter */ + Word16 *hrf_left_prev_e, /* i/o: Left filter exponent */ + Word32 *hrf_right_prev, /* i/o: Right filter */ + Word16 *hrf_right_prev_e, /* i/o: Right filter exponent */ + Word32 *hrf_left_delta, /* o : Left filter interpolation delta */ + Word16 *hrf_left_delta_e, /* o : Left filter interpolation delta exponent */ + Word32 *hrf_right_delta, /* o : Right filter interpolation delta */ + Word16 *hrf_right_delta_e, /* o : Right filter interpolation delta exponent */ + Word16 *intp_count, /* o : Interpolation count */ + Word16 *filterlength, /* o : Length of filters */ + Word16 *itd, /* o : ITD value */ + Word32 *Gain, /* o : Gain value Q30 */ + TDREND_SRC_t *Src_p /* i/o: Source pointer */ +); ivas_error TDREND_SRC_Alloc( TDREND_SRC_t **Src_pp /* i/o: Source */ @@ -770,36 +809,31 @@ void TDREND_SRC_Init_fx( const TDREND_PosType_t PosType /* i : Position type specifier */ ); -/* ----- Object renderer - vec ----- */ void TDREND_SPATIAL_VecInit_fx( - Word32 *Pos_p, /* o : Output vector */ - const Word32 PosX, /* i : X value */ - const Word32 PosY, /* i : Y value */ - const Word32 PosZ /* i : Z value */ + Word32 *Pos_p, /* o : Output vector */ + const Word32 PosX, /* i : X value */ + const Word32 PosY, /* i : Y value */ + const Word32 PosZ /* i : Z value */ ); -/*! r: Euclidian norm value */ - void TDREND_SPATIAL_VecNormalize_fx( - const Word32 *Vec_p_fx, /* i : Input vector Qx */ - Word16 q, /* i : Input vector Q-factor */ - Word32 *VecNorm_p_fx /* o : Normalised output vector Q30 */ + const Word32 *Vec_p_fx, /* i : Input vector Qx */ + Word16 q, /* i : Input vector Q-factor */ + Word32 *VecNorm_p_fx /* o : Normalised output vector Q30 */ ); Word16 TDREND_SPATIAL_EvalOrthonormOrient_fx( - Word32 *FrontVecON_p_fx, /* i/o: Normalized front vector Q30 */ - Word32 *UpVecON_p_fx, /* i/o: Normalized up vector Q30 */ - Word32 *RightVecON_p_fx, /* i/o: Normalized right vector Q30 */ - const Word32 *FrontVec_p_fx, /* i : Input front vector Qx */ - const Word32 *UpVec_p_fx, /* i : Input up vector orient_q */ - const Word16 orient_q /* i : Input up Q-factor */ + Word32 *FrontVecON_p_fx, /* i/o: Normalized front vector Q30 */ + Word32 *UpVecON_p_fx, /* i/o: Normalized up vector Q30 */ + Word32 *RightVecON_p_fx, /* i/o: Normalized right vector Q30 */ + const Word32 *FrontVec_p_fx, /* i : Input front vector Qx */ + const Word32 *UpVec_p_fx, /* i : Input up vector orient_q */ + const Word16 orient_q /* i : Input up Q-factor */ ); -/* ----- Object renderer - mix ----- */ - ivas_error TDREND_MIX_AddSrc_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - Word16 *SrcInd, /* o : Source index */ + Word16 *SrcInd, /* o : Source index */ const TDREND_PosType_t PosType /* i : Position type (absolute/relative) */ ); @@ -816,32 +850,30 @@ ivas_error TDREND_MIX_Init_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HRTF data (initialized in case of NULL) */ const TDREND_MixSpatSpec_t *MixSpatSpec_p, /* i : Mixer spatial specification */ - const Word32 output_Fs /* i : Output sampling rate */ + const Word32 output_Fs /* i : Output sampling rate */ ); - /* ----- Object renderer - sfx ----- */ - void TDREND_Apply_ITD_fx( - Word32 *input_fx, /* i : Input subframe to be time adjusted Qx */ - Word32 *out_left_fx, /* o : Output left channel with ITD applied Qx */ - Word32 *out_right_fx, /* o : Output right channel with ITD applied Qx */ - Word16 *previtd, /* i/o: Previous ITD value */ - const Word16 itd, /* i : Current subframe ITD value */ - Word32 *mem_itd_fx, /* i/o: ITD buffer memory Qx */ - const Word16 length /* i : Subframe length */ + Word32 *input_fx, /* i : Input subframe to be time adjusted Qx */ + Word32 *out_left_fx, /* o : Output left channel with ITD applied Qx */ + Word32 *out_right_fx, /* o : Output right channel with ITD applied Qx */ + Word16 *previtd, /* i/o: Previous ITD value */ + const Word16 itd, /* i : Current subframe ITD value */ + Word32 *mem_itd_fx, /* i/o: ITD buffer memory Qx */ + const Word16 length /* i : Subframe length */ ); void TDREND_firfilt_fx( - Word32 *signal_fx, /* i/o: Input signal / Filtered signal Qx */ - Word32 *filter_fx, /* i/o: FIR filter Qy */ - const Word16 filter_e, /* i : FIR filter exp */ - const Word32 *filter_delta_fx, /* i : FIR filter delta Qy */ - const Word16 intp_count, /* i : interpolation count */ - Word32 *mem_fx, /* i/o: filter memory Qx */ - const Word16 subframe_length, /* i : Length of signal */ - const Word16 filterlength, /* i : Filter length */ - const Word16 Gain_fx, /* i : Gain Q14 */ - const Word16 prevGain_fx /* i : Previous gain Q14 */ + Word32 *signal_fx, /* i/o: Input signal / Filtered signal Qx */ + Word32 *filter_fx, /* i/o: FIR filter Qy */ + const Word16 filter_e, /* i : FIR filter exp */ + const Word32 *filter_delta_fx, /* i : FIR filter delta Qy */ + const Word16 intp_count, /* i : interpolation count */ + Word32 *mem_fx, /* i/o: filter memory Qx */ + const Word16 subframe_length, /* i : Length of signal */ + const Word16 filterlength, /* i : Filter length */ + const Word32 Gain_fx, /* i : Gain Q30 */ + const Word32 prevGain_fx /* i : Previous gain Q30 */ ); @@ -849,39 +881,32 @@ void TDREND_firfilt_fx( * Crend renderer *----------------------------------------------------------------------------------*/ -ivas_error ivas_rend_openCrend( +ivas_error ivas_rend_openCrend_fx( CREND_WRAPPER_HANDLE *pCrend, const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, - HRTFS_CREND_HANDLE hSetOfHRTF, - const Word32 output_Fs + HRTFS_CREND_HANDLE hHrtfCrend, + HRTFS_STATISTICS_HANDLE hHrtfStatistics, + const Word32 output_Fs, + const Word16 ext_rend_flag, + const Word16 num_poses ); -void ivas_rend_closeCrend( +void ivas_rend_closeCrend_fx( CREND_WRAPPER_HANDLE *pCrend ); -ivas_error ivas_hrtf_init( - HRTFS_DATA *hHrtf /* i/o: HRTF handle */ +ivas_error ivas_Crend_hrtf_init_fx( + HRTFS_CREND_DATA *hHrtf /* i/o: Crend HRTF handle */ ); -ivas_error ivas_rend_initCrendWrapper( - CREND_WRAPPER_HANDLE *pCrend +ivas_error ivas_rend_initCrendWrapper_fx( + CREND_WRAPPER_HANDLE *pCrend, + const Word16 num_poses ); -ivas_error ivas_rend_crendProcess( - const CREND_WRAPPER *pCrend, - const AUDIO_CONFIG inConfig, - const AUDIO_CONFIG outConfig, - DECODER_CONFIG_HANDLE hDecoderConfig, - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, - IVAS_OUTPUT_SETUP_HANDLE hIntSetup, - EFAP_HANDLE hEFAPdata, - Word32 *output[], /* i/o: input/output audio channels */ - const Word32 output_Fs, - const Word16 num_subframes /* i : number of subframes to render */ -); -ivas_error ivas_rend_crendProcessSubframe( + +ivas_error ivas_rend_crendProcessSubframe_fx( const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ const AUDIO_CONFIG inConfig, /* i : input audio configuration */ const AUDIO_CONFIG outConfig, /* i : output audio configuration */ @@ -890,10 +915,11 @@ ivas_error ivas_rend_crendProcessSubframe( const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ - Word32 *input_f[], /* i : transport channels */ - Word32 *output[], /* i/o: input/output audio channels */ - const Word16 n_samples_to_render, /* i : output frame length per channel */ - const Word32 output_Fs /* i : output sampling rate */ + Word32 *input_f[], /* i : transport channels */ + Word32 *output[], /* i/o: input/output audio channels */ + const Word16 n_samples_to_render, /* i : output frame length per channel */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 pos_idx ); @@ -901,112 +927,104 @@ ivas_error ivas_rend_crendProcessSubframe( * Reverberator *----------------------------------------------------------------------------------*/ -ivas_error ivas_binaural_reverb_open_fastconv_fx( - REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ - const Word16 numBins, /* i : number of CLDFB bins */ - const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ - IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ - const AUDIO_CONFIG internal_config, /* i : internal audio config for FastConv */ - const Word32 sampling_rate, /* i : sampling rate */ - const HRTFS_FASTCONV_HANDLE hHrtfFastConv /* i : FastConv HRTF handle */ -); - -ivas_error ivas_binaural_reverb_open_parambin( +ivas_error ivas_binaural_reverb_init_fx( REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ - const Word16 numBins, /* i : number of CLDFB bins Q0 */ - const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame Q0 */ - IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ - const Word32 sampling_rate, /* i : sampling rate Q0 */ - const HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : Parametric binauralizer HRTF handle */ + const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ + const Word16 numBins, /* i : number of CLDFB bins */ + const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ + const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ + const Word32 sampling_rate, /* i : sampling rate */ + const Word32 *defaultTimes, /* i : default reverberation times */ + const Word32 *defaultEne, /* i : default reverberation energies */ + Word32 *earlyEne /* i/o: Early part energies to be modified */ ); void ivas_binaural_reverb_close_fx( REVERB_STRUCT_HANDLE *hReverb /* i/o: binaural reverb handle */ ); -void ivas_binaural_reverb_close( - REVERB_STRUCT_HANDLE *hReverb /* i/o: binaural reverb handle */ -); void ivas_binaural_reverb_processSubframe_fx( - REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ - const Word16 numInChannels, /* i : num inputs to be processed */ - const Word16 numSlots, /* i : number of slots to be processed */ + REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ + const Word16 numInChannels, /* i : num inputs to be processed */ + const Word16 numSlots, /* i : number of slots to be processed */ Word32 inReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */ - Word32 inImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ - Word32 outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ - Word32 outImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* o : output CLDFB data imag */ + Word32 inImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ + Word32 outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ + Word32 outImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* o : output CLDFB data imag */ ); ivas_error ivas_reverb_open_fx( - REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ - const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ - const HRTFS_HANDLE hHrtf, /* i : HRTF handle */ - const Word32 *lr_energy_and_iac_fx[], /* i : precomuputed lr energies and iac */ - RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ - const Word32 output_Fs /* i : output sampling rate */ + REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ + const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ + RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ + const Word32 output_Fs /* i : output sampling rate */ ); -void ivas_reverb_close( - REVERB_HANDLE *hReverb /* i/o: Reverberator handle */ +void ivas_reverb_close_fx( + REVERB_HANDLE *hReverb /* i/o: Reverberator handle */ ); + ivas_error ivas_reverb_process_fx( - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ - const Word16 mix_signals, /* i : add reverb to output signal */ - Word32 *pcm_in[], /* i (Q11): the PCM audio to apply reverb on */ - Word32 *pcm_out[], /* o : the PCM audio with reverb applied */ - const Word16 i_ts /* i : (Q0) subframe index */ + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ + const Word16 mix_signals, /* i : add reverb to output signal */ + Word32 *pcm_in[], /* i (Q11): the PCM audio to apply reverb on */ + Word32 *pcm_out[], /* o : the PCM audio with reverb applied */ + const Word16 i_ts /* i : (Q0) subframe index */ ); void ivas_rev_delay_line_init( - ivas_rev_delay_line_t *pDelay, /* o : the delay line to initialize */ - Word32 *memory_buffer, /* i : the memory buffer to use for the delay line Q11 */ - const UWord16 delay, /* i : the delay */ - const UWord16 maxdelay /* i : maximum delay to be supported */ + ivas_rev_delay_line_t *pDelay, /* o : the delay line to initialize */ + Word32 *memory_buffer, /* i : the memory buffer to use for the delay line Q11 */ + const UWord16 delay, /* i : the delay */ + const UWord16 maxdelay /* i : maximum delay to be supported */ ); -/*! r: sample gotten out of delay line, and amplified by set gain */ -Word32 ivas_rev_delay_line_get_sample_fx( /* Q11 */ - ivas_rev_delay_line_t *pDelay /* i/o: the delay line */ + +/*! r: sample gotten out of delay line, and amplified by set gain, Q11 */ +Word32 ivas_rev_delay_line_get_sample_fx( + ivas_rev_delay_line_t *pDelay /* i/o: the delay line */ ); void ivas_rev_delay_line_feed_sample_fx( - ivas_rev_delay_line_t *pDelay, /* i : the delay line */ - Word32 input /* i : the sample to feed Q11 */ + ivas_rev_delay_line_t *pDelay, /* i : the delay line */ + Word32 input /* i : the sample to feed Q11 */ ); void ivas_rev_delay_line_get_sample_blk_fx( ivas_rev_delay_line_t *pDelay, /* i : the delay line */ - const UWord16 blk_size, /* i : number of samples in the data block */ - Word32 *output /* i/o: amples gotten out of delay line, and amplified by set gainin */ + const UWord16 blk_size, /* i : number of samples in the data block */ + Word32 *output /* i/o: amples gotten out of delay line, and amplified by set gainin */ ); void ivas_rev_delay_line_feed_sample_blk_fx( - ivas_rev_delay_line_t *pDelay, /* i/o: the delay line */ - const UWord16 blk_size, /* i : number of samples in the input data block */ - Word32 *input /* i : the samples to feed Q11 */ + ivas_rev_delay_line_t *pDelay, /* i/o: the delay line */ + const UWord16 blk_size, /* i : number of samples in the input data block */ + Word32 *input /* i : the samples to feed Q11 */ ); + void ivas_reverb_iir_filt_init( ivas_rev_iir_filter_t *iirFilter, /* o : IIR filter */ - const UWord16 maxTaps /* i : maximum number of filter taps */ + const UWord16 maxTaps /* i : maximum number of filter taps */ ); - void ivas_reverb_iir_filt_set( ivas_rev_iir_filter_t *iirFilter, /* i/o: IIR filter */ - UWord16 nr_taps, /* i : number of IIR filter taps */ - const Word16 *coefA, /* i : A filter coefficients to set */ - const Word16 *coefB /* i : the B filter coefficients to set */ + UWord16 nr_taps, /* i : number of IIR filter taps */ + const Word16 *coefA, /* i : A filter coefficients to set */ + const Word16 *coefB /* i : the B filter coefficients to set */ ); + void ivas_reverb_iir_filt_2taps_feed_blk_fx( ivas_rev_iir_filter_t *iirFilter, /* i/o: IIR filter */ - const UWord16 blk_size, /* i : size */ - const Word32 *input, /* i : input buffer */ - Word32 *output /* i : output buffer */ + const UWord16 blk_size, /* i : size */ + const Word32 *input, /* i : input buffer */ + Word32 *output /* o : output buffer */ ); UWord16 int_log2( UWord32 powerOf2 ); + Word16 ivas_reverb_t2f_f2t_init( ivas_reverb_t2f_f2t_t *t2f_f2t, const Word16 fft_size, @@ -1016,6 +1034,7 @@ Word16 ivas_reverb_t2f_f2t_init( void ivas_reverb_t2f_f2t_ClearHistory( ivas_reverb_t2f_f2t_t *t2f_f2t ); + void ivas_reverb_t2f_f2t_in_fx( ivas_reverb_t2f_f2t_t *t2f_f2t, Word32 *input_L, // i: Qx @@ -1031,6 +1050,7 @@ void ivas_reverb_t2f_f2t_out_fx( Word32 *output_L, // i/o: Qx Word32 *output_R // i/o: Qx ); + Word16 ivas_reverb_fft_filter_init( ivas_reverb_fft_filter_t *fft_filter, const Word16 fft_size @@ -1040,6 +1060,7 @@ void ivas_reverb_fft_filter_ComplexMul_fx( ivas_reverb_fft_filter_t *fft_filter, /* i */ Word32 *buffer /* i/o: Qx */ ); + void ivas_reverb_fft_filter_CrossMix_fx( Word32 *buffer0, // i/o: Qx Word32 *buffer1, // i/o: Qx @@ -1049,13 +1070,16 @@ void ivas_reverb_fft_filter_CrossMix_fx( void ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR_fx( rv_fftwf_type_complex_fx *spectrum, // i: Qx Word32 *fft_real, // o: Qx - const Word16 fft_size); + const Word16 fft_size +); + void ivas_reverb_define_window_fft_fx( Word32 *pWindow, //output in Q31 const Word16 transitionStart, const Word16 transitionLength, const Word16 spectrumLength ); + Word16 ivas_reverb_calc_color_filters_fx( const Word32 *pTargetL, const Word32 *pTargetR, @@ -1066,6 +1090,7 @@ Word16 ivas_reverb_calc_color_filters_fx( Word16 *q_pBeqL, Word16 *q_pBeqR ); + Word16 ivas_reverb_calc_correl_filters_fx( Word32 *pTargetICC, //input in Q30 const Word32 *pWindow, //input in Q30 @@ -1075,6 +1100,7 @@ Word16 ivas_reverb_calc_correl_filters_fx( Word16 *q_pU, //Output q Word16 *q_pV //output q ); + void ivas_reverb_calc_color_levels_fx( const Word32 output_Fs, const Word16 freq_count, @@ -1086,41 +1112,27 @@ void ivas_reverb_calc_color_levels_fx( const Word16 *pLoop_delays, const Word32 *pT60_filter_coeff, //input in Q31 Word32 *pTarget_color_L, //output in Q30 - Word32 *pTarget_color_R); //output in Q30 + Word32 *pTarget_color_R //output in Q30 +); + ivas_error ivas_reverb_prepare_cldfb_params( - IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, - const HRTFS_FASTCONV_HANDLE hHrtfFastConv, - const AUDIO_CONFIG input_audio_config, - const int16_t use_brir, - const int32_t output_Fs, - float *pOutput_t60, - float *pOutput_ene ); -void ivas_reverb_interpolate_acoustic_data_fx( - const Word16 input_table_size, - const Word32 *pInput_fc, //input in Q16 - const Word32 *pInput_t60, //input in Q26 - const Word32 *pInput_dsr, //input in Q30 - const Word16 output_table_size, - const Word32 *pOutput_fc, - Word32 *pOutput_t60, - Word32 *pOutput_dsr, - Word16 *pOutput_t60_e, //output e - Word16 *pOutput_dsr_e //output e -); -void ivas_reverb_get_hrtf_set_properties_fx( - Word32 **ppHrtf_set_L_re, - Word32 **ppHrtf_set_L_im, - Word32 **ppHrtf_set_R_re, - Word32 **ppHrtf_set_R_im, - const AUDIO_CONFIG input_audio_config, - const Word16 hrtf_count, - const Word16 in_freq_count, - const Word16 out_freq_count, - Word32 *pOut_avg_pwr_L, //output in Q23 - Word32 *pOut_avg_pwr_R, //output in Q23 - Word32 *out_i_a_coherence //output in Q27 + const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, + const HRTFS_STATISTICS_HANDLE hHrtfStatistics, + const Word32 output_Fs, + Word32 *pOutput_t60, + Word32 *pOutput_ene +); + +void ivas_reverb_interp_on_freq_grid_fx( + const Word16 input_table_size, + const Word32 *pInput_fc, //input center frequencies in Q16 + const Word32 *pInput_grid, //input data vector in an arbitrary Q-format + const Word16 output_table_size, + const Word32 *pOutput_fc, + Word32 *pOutput_grid //output in the same Q-format as input ); + /*---------------------------------------------------------------------------------* * Shoebox Prototypes *-----------------------------------------------------------------------------------*/ @@ -1135,7 +1147,6 @@ void ivas_shoebox_init( shoebox_config_t *cal ); - void ivas_shoebox_set_scene ( shoebox_obj_t *obj, shoebox_output_t *ER_PARAMS, @@ -1165,7 +1176,8 @@ ivas_error ivas_er_compute_reflections( ivas_error ivas_er_encoder_init( er_struct_t *reflections -); +); + ivas_error ivas_er_process( er_struct_t *reflections, const Word16 frame_size, @@ -1174,6 +1186,7 @@ ivas_error ivas_er_process( const AUDIO_CONFIG inConfig ); + /*---------------------------------------------------------------------------------* * Rotation Prototypes *-----------------------------------------------------------------------------------*/ @@ -1186,11 +1199,12 @@ void ivas_headTrack_close_fx( HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* i/o: head track handle */ ); + void Euler2Quat_fx( - const Word32 yaw, /* i : yaw (x) Q22 */ - const Word32 pitch, /* i : pitch (y) Q22 */ - const Word32 roll, /* i : roll (z) Q22 */ - IVAS_QUATERNION *quat /* o : quaternion describing the rotation */ + const Word32 yaw, /* i : yaw (x) Q22 */ + const Word32 pitch, /* i : pitch (y) Q22 */ + const Word32 roll, /* i : roll (z) Q22 */ + IVAS_QUATERNION *quat /* o : quaternion describing the rotation */ ); Word32 deg2rad_fx( @@ -1202,118 +1216,128 @@ Word32 rad2deg_fx( ); void rotateAziEle_fx( - Word16 azi_in, /* i : output elevation */ - Word16 ele_in, /* i : input elevation */ - Word16 *azi, /* o : rotated azimuth */ - Word16 *ele, /* o : rotated elevation */ - Word32 Rmat[3][3], /* i : real-space rotation matrix */ - const Word16 isPlanar /* i : is roation planar and elevation meaningless? */ + Word16 azi_in, /* i : output elevation */ + Word16 ele_in, /* i : input elevation */ + Word16 *azi, /* o : rotated azimuth */ + Word16 *ele, /* o : rotated elevation */ + Word32 Rmat[3][3], /* i : real-space rotation matrix */ + const Word16 isPlanar /* i : is roation planar and elevation meaningless? */ ); void rotateAziEle_fx_frac_az_el( - Word32 azi_in, /* i : output elevation */ - Word32 ele_in, /* i : input elevation */ - Word32 *azi, /* o : rotated azimuth */ - Word32 *ele, /* o : rotated elevation */ - Word32 Rmat[3][3], /* i : real-space rotation matrix */ - const Word16 isPlanar /* i : is roation planar and elevation meaningless? */ -); - -void rotateAziEle_fixed( - Word16 azi_in, /* i : output elevation */ - Word16 ele_in, /* i : input elevation */ - Word32 *azi, /* o : rotated azimuth */ - Word32 *ele, /* o : rotated elevation */ - Word32 Rmat[3][3], /* i : real-space rotation matrix */ - const Word16 isPlanar /* i : is roation planar and elevation meaningless? */ + Word32 azi_in, /* i : output elevation */ + Word32 ele_in, /* i : input elevation */ + Word32 *azi, /* o : rotated azimuth */ + Word32 *ele, /* o : rotated elevation */ + Word32 Rmat[3][3], /* i : real-space rotation matrix */ + const Word16 isPlanar /* i : is roation planar and elevation meaningless? */ ); + +void rotateAziEle_fx32( + Word16 azi_in, /* i : output elevation */ + Word16 ele_in, /* i : input elevation */ + Word32 *azi, /* o : rotated azimuth */ + Word32 *ele, /* o : rotated elevation */ + Word32 Rmat[3][3], /* i : real-space rotation matrix */ + const Word16 isPlanar /* i : is roation planar and elevation meaningless? */ +); + void SHrotmatgen_fx( - Word16 SHrotmat[SBA_NHARM_HOA3][SBA_NHARM_HOA3], /* o : SHD rotation matrix */ - Word32 Rmat[3][3], /* i : real-space rotation matrix */ - const Word16 order /* i : ambisonics order */ + Word16 SHrotmat[SBA_NHARM_HOA3][SBA_NHARM_HOA3], /* o : SHD rotation matrix */ + Word32 Rmat[3][3], /* i : real-space rotation matrix */ + const Word16 order /* i : ambisonics order */ ); + void rotateFrame_shd( COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ - Word32 *output[], /* i/o: unrotated HOA3 signal buffer in TD */ - const Word16 subframe_len, /* i : subframe length per channel */ + Word32 *output[], /* i/o: unrotated HOA3 signal buffer in TD */ + const Word16 subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ - const Word16 subframe_idx /* i : subframe index */ + const Word16 subframe_idx /* i : subframe index */ ); void rotateFrame_sd( COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ - Word32 *output[], /* i/o: unrotated SD signal buffer in TD */ - const Word16 subframe_len, /* i : subframe length per channel */ + Word32 *output[], /* i/o: unrotated SD signal buffer in TD */ + const Word16 subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - const Word16 subframe_idx /* i : subframe index */ + const Word16 subframe_idx /* i : subframe index */ ); + void ivas_combined_orientation_update_index( COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i/o: combined orientation handle */ - const Word16 samples_rendered /* i : samples rendered since the last call */ + const Word16 samples_rendered /* i : samples rendered since the last call */ ); + void ivas_combined_orientation_update_start_index( COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i/o: combined orientation handle */ - const Word16 samples_rendered /* i : samples rendered since the last call */ + const Word16 samples_rendered /* i : samples rendered since the last call */ ); + void ivas_combined_orientation_set_to_start_index( COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ); -void rotateFrame_shd_cldfb( +void rotateFrame_shd_cldfb_fx( Word32 Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part */ Word32 Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ - Word32 Rmat[3][3], /* i : real-space rotation matrix */ - const Word16 nInChannels, /* i : number of channels */ - const Word16 numTimeSlots, /* i : number of time slots to process */ - const Word16 shd_rot_max_order /* i : split-order rotation method */ + Word32 Rmat[3][3], /* i : real-space rotation matrix */ + const Word16 nInChannels, /* i : number of channels */ + const Word16 numTimeSlots, /* i : number of time slots to process */ + const Word16 shd_rot_max_order /* i : split-order rotation method */ ); -void rotateFrame_sd_cldfb_fixed( - Word32 Rmat[3][3], /* i : real-space rotation matrix */ + +void rotateFrame_sd_cldfb_fx( + Word32 Rmat[3][3], /* i : real-space rotation matrix */ Word32 Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part */ Word32 Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ - const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ - const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - const Word16 numTimeSlots, /* i : number of time slots to process */ - const Word16 nb_band /* i : number of CLDFB bands to process */ + const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + const Word16 numTimeSlots, /* i : number of time slots to process */ + const Word16 nb_band /* i : number of CLDFB bands to process */ ); -ivas_error ivas_external_orientation_open( - EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData, /* o : external orientation handle */ - const Word16 num_subframes /* i : number of subframes */ +ivas_error ivas_external_orientation_open_fx( + EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData, /* o : external orientation handle */ + const Word16 num_subframes /* i : number of subframes */ ); + void ivas_external_orientation_close_fx( - EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData /* i/o: external orientation handle */ + EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData /* i/o: external orientation handle */ ); -ivas_error ivas_combined_orientation_open( - COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* o : combined orientation handle */ - const Word32 fs, /* i : sampling rate */ - const Word16 num_subframes /* i : number of subframes */ +ivas_error ivas_combined_orientation_open_fx( + COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* o : combined orientation handle */ + const Word32 fs, /* i : sampling rate */ + const Word16 num_subframes /* i : number of subframes */ ); + void ivas_combined_orientation_close_fx( - COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* i/o: combined orientation handle */ + COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* i/o: combined orientation handle */ ); + ivas_error combine_external_and_head_orientations_dec( - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ - EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ + HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ); ivas_error combine_external_and_head_orientations_rend( - IVAS_REND_HeadRotData *hHeadTrackData, /* i : head track handle */ - EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ + IVAS_REND_HeadRotData *hHeadTrackData, /* i : head track handle */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ); + /*----------------------------------------------------------------------------------* * Renderer configuration *----------------------------------------------------------------------------------*/ -ivas_error ivas_render_config_open( +ivas_error ivas_render_config_open_fx( RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ ); -void ivas_render_config_close( +void ivas_render_config_close_fx( RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ ); @@ -1321,6 +1345,11 @@ ivas_error ivas_render_config_init_from_rom_fx( RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ ); +ivas_error ivas_render_config_change_defaults( + RENDER_CONFIG_HANDLE hRenderConfig, /* i/o: Renderer config handle */ + IVAS_DefaultReverbSize reverbDefault /* i: Reverb default size */ +); + /*----------------------------------------------------------------------------------* * Quaternion operations @@ -1344,47 +1373,49 @@ void QuaternionSlerp_fx( IVAS_QUATERNION *const r ); + /*----------------------------------------------------------------------------------* * Orientation tracking *----------------------------------------------------------------------------------*/ ivas_error ivas_orient_trk_Init_fx( - ivas_orient_trk_state_t *pOTR /* i/o: orientation tracker handle */ + ivas_orient_trk_state_t *pOTR /* i/o: orientation tracker handle */ ); ivas_error ivas_orient_trk_SetReferenceRotation_fx( - ivas_orient_trk_state_t *pOTR_fx, /* i/o: orientatoin trakcer handle */ - const IVAS_QUATERNION refRot /* i : reference rotation */ + ivas_orient_trk_state_t *pOTR_fx, /* i/o: orientatoin trakcer handle */ + const IVAS_QUATERNION refRot /* i : reference rotation */ ); ivas_error ivas_orient_trk_SetReferenceVector_fx( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - const IVAS_VECTOR3 listenerPos, /* i : Listener position */ - const IVAS_VECTOR3 refPos /* i : Reference position */ + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + const IVAS_VECTOR3 listenerPos, /* i : Listener position */ + const IVAS_VECTOR3 refPos /* i : Reference position */ ); ivas_error ivas_orient_trk_SetTrackingType_fx( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ ); ivas_error ivas_orient_trk_GetMainOrientation_fx( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - IVAS_QUATERNION *pOrientation /* i/o: average/reference orientation */ + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION *pOrientation /* i/o: average/reference orientation */ ); ivas_error ivas_orient_trk_GetTrackedRotation_fx( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - IVAS_QUATERNION *pRotation /* i/o: processed rotation */ + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION *pRotation /* i/o: processed rotation */ ); ivas_error ivas_orient_trk_Process_fx( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ - IVAS_QUATERNION absRot, /* i : absolute head rotation */ - Word32 updateRate_fx, /* i : rotation update rate [Hz] */ - IVAS_QUATERNION *pTrkRot /* o : tracked rotation */ + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + IVAS_QUATERNION absRot, /* i : absolute head rotation */ + Word32 updateRate_fx, /* i : rotation update rate [Hz] */ + IVAS_QUATERNION *pTrkRot /* o : tracked rotation */ ); + /*----------------------------------------------------------------------------------* * Rendering & merging to MASA format *----------------------------------------------------------------------------------*/ @@ -1392,15 +1423,16 @@ ivas_error ivas_orient_trk_Process_fx( ivas_error ivas_mcmasa_ana_open( MCMASA_ANA_HANDLE *hMcMasaPtr, /* i/o: McMASA data handle pointer */ const AUDIO_CONFIG inConfig, /* i : Input config */ - Word32 input_Fs /* i : Sampling frequency */ + Word32 input_Fs /* i : Sampling frequency */ ); + void ivas_mcmasa_ana_fx( - MCMASA_ANA_HANDLE hMcMasa, /* i/o: McMASA encoder handle */ - Word32 data[][L_FRAME48k], /* i/o: Input / transport audio signals */ + MCMASA_ANA_HANDLE hMcMasa, /* i/o: McMASA encoder handle */ + Word32 data[][L_FRAME48k], /* i/o: Input / transport audio signals */ Word16 q_data, - const Word16 input_frame, /* i : Input frame size */ - const Word16 nchan_transport, /* i : Number of transport channels */ - const Word16 nchan_inp /* i : Number of input channels */ + const Word16 input_frame, /* i : Input frame size */ + const Word16 nchan_transport, /* i : Number of transport channels */ + const Word16 nchan_inp /* i : Number of input channels */ ); void ivas_mcmasa_ana_close( @@ -1409,36 +1441,41 @@ void ivas_mcmasa_ana_close( ivas_error ivas_omasa_ana_open( OMASA_ANA_HANDLE *hOMasaPtr, /* i/o: OMASA data handle pointer */ - Word32 input_Fs, /* i : Sampling frequency */ - UWord16 total_num_objects /* i : Number of objects */ + Word32 input_Fs, /* i : Sampling frequency */ + UWord16 total_num_objects /* i : Number of objects */ ); void ivas_omasa_ana_fx( OMASA_ANA_HANDLE hOMasa, /* i/o: OMASA analysis handle */ - Word32 data_in_f_fx[][L_FRAME48k], /* i/o: Input / transport audio signals */ - Word16 *q, - const Word16 input_frame, /* i : Input frame size */ - const Word16 nchan_transport, /* i : Number of transport channels */ - const Word16 nchan_ism /* i : Number of objects for parameter analysis*/ + Word32 data_in_fx[][L_FRAME48k], /* i/o: Input / transport audio signals */ + Word16 *data_in_q, /* o : audio signals Q factor */ + const Word16 input_frame, /* i : Input frame size */ + const Word16 nchan_transport, /* i : Number of transport channels */ + const Word16 nchan_ism /* i : Number of objects for parameter analysis*/ ); void ivas_omasa_ana_close( OMASA_ANA_HANDLE *hOMasa /* i/o: analysis OMASA handle */ ); + void computeIntensityVector_ana_fx( - const Word16 *band_grouping, /* i : Band grouping for estimation */ - Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal Qx */ - Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal Qx */ - const Word16 num_frequency_bands, /* i : Number of frequency bands */ - Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] /* o : Intensity vector 2 * Qx -31 */ + const Word16 *band_grouping, /* i : Band grouping for estimation */ + Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal Qx */ + Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input sig Qx */ + const Word16 num_frequency_bands, /* i : Number of frequency bands */ + Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /* o : Intensity */ + Word16 q_intensity_real[MASA_FREQUENCY_BANDS], + Word16 inp_q ); void computeReferencePower_ana_fx( - const Word16 *band_grouping, /* i : Band grouping for estimation */ - Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal input_q */ - Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal input_q */ - Word32 *reference_power, /* o : Estimated power */ - const Word16 num_freq_bands /* i : Number of frequency bands 2 * input_q - 31 */ + const Word16 *band_grouping, /* i : Band grouping for estimation */ + Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal input_q */ + Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal input_q */ + Word32 *reference_power, /* o : Estimated power */ + const Word16 num_freq_bands, /* i : Number of frequency bands */ + const Word16 input_q, /* i : Q-factor Real and Imag part of input signal */ + Word16 *reference_power_q /* o : Q-factor of the estimated power */ ); void ivas_create_masa_out_meta_fx( @@ -1453,7 +1490,16 @@ void ivas_create_masa_out_meta_fx( Word16 energyRatio_q, Word16 spreadCoherence_q, Word16 surroundingCoherence_q - ); +); + +void ivas_masa_zero_high_bands_fx( + const Word16 nbands, /* i : Number of frequency bands with estimated values */ + Word32 elevation_m_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated elevation */ + Word32 azimuth_m_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated azimuth */ + Word32 energyRatio_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated direct-to-total ratio */ + Word32 spreadCoherence_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated spread coherence */ + Word32 surroundingCoherence_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i/o : Estimated surround coherence */ +); ivas_error ivas_dirac_ana_open_fx( DIRAC_ANA_HANDLE *hDirACPtr, /* i/o: DIRAC data handle pointer */ @@ -1461,10 +1507,11 @@ ivas_error ivas_dirac_ana_open_fx( ); void ivas_dirac_ana_fx( - DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ - Word32 data_in_fx[][L_FRAME48k], /* i/o: Input / transport audio signals, Q7 */ - const Word16 input_frame, /* i : Input frame size */ - const Word16 nchan_transport /* i : Number of transport channels */ + DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ + Word32 data_in_fx[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const Word16 input_frame, /* i : Input frame size */ + const Word16 nchan_transport, /* i : Number of transport channels */ + const Word16 data_q /* i : Q of data_in_fx */ ); void ivas_dirac_ana_close_fx( @@ -1476,23 +1523,131 @@ void ivas_prerend_merge_masa_metadata_fx( MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ IVAS_REND_AudioConfigType inType1, /* i : Type of input 1 */ Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ - Word16 *inEne1_e, /* i/o: TF-energy of input 1 Exponent */ + Word16 inEne1_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1 Exponent */ MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ IVAS_REND_AudioConfigType inType2, /* i : Type of input 2 */ Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ - Word16 *inEne2_e /* i : TF-energy of input 2 Exponent */ + Word16 inEne2_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 Exponent */ ); ivas_error masaPrerendOpen_fx( MASA_PREREND_HANDLE *hMasaPrerendPtr, /* o : handle to the opened prerenderer */ - Word16 numTransports, /* i : number of transport channels */ - Word32 input_Fs /* i : signal sampling rate */ + Word16 numTransports, /* i : number of transport channels */ + Word32 input_Fs /* i : signal sampling rate */ ); + void masaPrerendClose_fx( MASA_PREREND_HANDLE *hMasaPrerendPtr /* i/o: prerenderer handle to be closed */ ); +/*----------------------------------------------------------------------------------* + * Split rendering + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_renderer_sf_splitBinaural( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word32 *output[], /* i/o: SCE channels / Binaural synthesis */ + const Word16 nSamplesRendered /* i : number of samples to render */ +); + +ivas_error ivas_rend_crendProcessSubframesSplitBin( + const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ + const AUDIO_CONFIG inConfig, /* i : input audio configuration */ + const AUDIO_CONFIG outConfig, /* i : output audio configuration */ + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ + const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ + DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ + Word32 *input_f[], /* i : transport channels */ + Word32 *output[], /* i/o: input/output audio channels */ + const Word16 n_samples_to_render, /* i : output frame length per channel */ + const Word32 output_Fs /* i : output sampling rate */ +); + +ivas_error ivas_rend_openMultiBinCrend( + CREND_WRAPPER_HANDLE *pCrend, + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig, + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const Word32 output_Fs +); + +void ivas_rend_CldfbMultiBinRendProcess( + const BINAURAL_RENDERER_HANDLE hCldfbRend, + const COMBINED_ORIENTATION_HANDLE *pCombinedOrientationData, + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + Word32 Cldfb_In_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_In_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_Out_Real[MAX_HEAD_ROT_POSES*BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ + Word32 Cldfb_Out_Imag[MAX_HEAD_ROT_POSES*BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const Word16 low_res_pre_rend_rot, + const Word16 num_subframes, + const Word16 Q_in +); + +ivas_error ivas_rend_openCldfb( + HANDLE_CLDFB_FILTER_BANK cldfbAna[MAX_INPUT_CHANNELS], + const AUDIO_CONFIG inConfig, + const Word32 output_Fs +); + +ivas_error ivas_rend_openCldfbRend( + CLDFB_REND_WRAPPER *pCldfbRend, + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig, + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, + const Word32 output_Fs +); + +void ivas_rend_closeCldfbRend( + CLDFB_REND_WRAPPER *pCldfbRend +); + +/*----------------------------------------------------------------------------------* + * Time domain ring buffer prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_TD_RINGBUF_Open( + TD_RINGBUF_HANDLE *ph, /* i/o: Ring buffer handle */ + const Word16 capacity_per_channel, /* i : Number of samples stored per channel */ + const Word16 num_channels /* i : Number of channels */ +); + +void ivas_TD_RINGBUF_Close( + TD_RINGBUF_HANDLE *ph /* i/o: Ring buffer handle */ +); + +void ivas_TD_RINGBUF_PushInterleaved( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const Word32 *data, /* i : Input audio in interleaved channels layout */ + const Word16 num_samples_per_channel /* i : Number of samples per channel to push */ +); + +void ivas_TD_RINGBUF_PushChannels( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const Word32 *p_channels[], /* i : Array of pointers to each input channel */ + const Word16 num_samples_per_channel /* i : Number of samples per channel to store */ +); + +void ivas_TD_RINGBUF_PushConstant( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const Word32 value, /* i : Value to push */ + const Word16 num_samples_per_channel /* i : Number of samples per channel to push */ +); + +void ivas_TD_RINGBUF_PopChannels( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + Word32 *p_channels[], /* i : Array of pointers to each output channel */ + const Word16 num_samples_per_channel /* i : Number of samples per channel to pop */ +); + +Word16 ivas_TD_RINGBUF_Size( + const TD_RINGBUF_HANDLE h /* i : Ring buffer handle */ +); + /* clang-format on */ #endif /* IVAS_PROT_REND_H */ diff --git a/lib_rend/ivas_reflections_fx.c b/lib_rend/ivas_reflections_fx.c index 310bc77e4cf3c62a6227926dcec3eb5ef55b5ef3..3bf9f71693b040f72bdd32bf21cdd60853a4b8f6 100644 --- a/lib_rend/ivas_reflections_fx.c +++ b/lib_rend/ivas_reflections_fx.c @@ -42,7 +42,7 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" #include "debug.h" -#include "ivas_rom_com_fx.h" + /*-----------------------------------------------------------------------------------------* * Local constants/tabels @@ -56,9 +56,9 @@ static UWord16 LC_mixing_7_1[7] = { 0, 1, 2, 3, 4, 3, 4 }; static UWord16 LC_mixing_5_1_2[7] = { 0, 1, 2, 3, 4, 0, 1 }; -static UWord16 LC_mixing_5_1_4[9] = { 0, 1, 2, 3, 4, 0, 1, 2, 3 }; +static UWord16 LC_mixing_5_1_4[9] = { 0, 1, 2, 3, 4, 0, 1, 3, 4 }; -static UWord16 LC_mixing_7_1_4[11] = { 0, 1, 2, 3, 4, 3, 4, 0, 1, 2, 3 }; +static UWord16 LC_mixing_7_1_4[11] = { 0, 1, 2, 3, 4, 3, 4, 0, 1, 3, 4 }; /*-----------------------------------------------------------------------------------------* @@ -66,6 +66,7 @@ static UWord16 LC_mixing_7_1_4[11] = { 0, 1, 2, 3, 4, 3, 4, 0, 1, 2, 3 }; * * Initializes the reflections data structure according to the requested input config. *-----------------------------------------------------------------------------------------*/ + ivas_error ivas_er_init( er_struct_t *reflections, const AUDIO_CONFIG inConfig ) @@ -338,10 +339,13 @@ ivas_error ivas_er_encoder_init( p_y_fx = reflections->shoebox_data.az_angle.data_fx[i]; // Q23 move32(); move32(); + p_x_fx = L_shr( p_x_fx, 1 ); // Q22 + p_y_fx = L_shr( p_y_fx, 1 ); // Q22 + rad_el_angle = deg2rad_fx( p_x_fx ); // Q22 + rad_az_angle = deg2rad_fx( p_y_fx ); // Q22 - rad_el_angle = deg2rad_fx( p_x_fx ); // Q23 - rad_az_angle = deg2rad_fx( p_y_fx ); // Q23 - + rad_el_angle = L_shl( rad_el_angle, 1 ); // Q23 + rad_az_angle = L_shl( rad_az_angle, 1 ); // Q23 rad_el_angle = L_shr( rad_el_angle, 10 ); // Q13 rad_az_angle = L_shr( rad_az_angle, 10 ); // Q13 diff --git a/lib_rend/ivas_render_config_fx.c b/lib_rend/ivas_render_config_fx.c index 056ae1651d98ac3db2c5d519a5a01de150d2cba0..9a6f79fea2823261123f4e7e1beaa45f995f516b 100644 --- a/lib_rend/ivas_render_config_fx.c +++ b/lib_rend/ivas_render_config_fx.c @@ -42,10 +42,14 @@ * Local constants *-----------------------------------------------------------------------*/ -#define IVAS_REVERB_DEFAULT_PRE_DELAY 0.016f -#define IVAS_REVERB_DEFAULT_PRE_DELAY_FX 2147484 -#define IVAS_REVERB_DEFAULT_INPUT_DELAY 0.1f -#define IVAS_REVERB_DEFAULT_INPUT_DELAY_FX 13421773 +#define IVAS_REVERB_DEFAULT_L_PRE_DELAY_FX 2147484 // 0.016 +#define IVAS_REVERB_DEFAULT_L_INPUT_DELAY_FX 13421773 // 0.1 + +#define IVAS_REVERB_DEFAULT_S_PRE_DELAY_FX 1677722 // 0.0125f +#define IVAS_REVERB_DEFAULT_S_INPUT_DELAY_FX 0 // 0.0f + +#define IVAS_REVERB_DEFAULT_M_PRE_DELAY_FX 1677722 // 0.0125f +#define IVAS_REVERB_DEFAULT_M_INPUT_DELAY_FX 0 // 0.0f #define IVAS_REVERB_DEFAULT_USE_ER 0 @@ -56,7 +60,7 @@ * Allocates the renderer configuration structure *-----------------------------------------------------------------------*/ -ivas_error ivas_render_config_open( +ivas_error ivas_render_config_open_fx( RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ ) { @@ -76,7 +80,7 @@ ivas_error ivas_render_config_open( * Deallocates the renderer configuration structure *-------------------------------------------------------------------*/ -void ivas_render_config_close( +void ivas_render_config_close_fx( RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ ) { @@ -109,13 +113,13 @@ ivas_error ivas_render_config_init_from_rom_fx( { return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Unexpected null pointer while attempting to fill renderer configuration from ROM" ); } - ( *hRenderConfig )->roomAcoustics.override = FALSE; + ( *hRenderConfig )->roomAcoustics.aeID = IVAS_DEFAULT_AEID; move16(); - ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_N_BANDS; + ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_L_N_BANDS; move16(); - ( *hRenderConfig )->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_PRE_DELAY_FX; + ( *hRenderConfig )->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_L_PRE_DELAY_FX; move32(); - ( *hRenderConfig )->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_INPUT_DELAY_FX; + ( *hRenderConfig )->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_L_INPUT_DELAY_FX; move32(); ( *hRenderConfig )->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; move16(); @@ -123,9 +127,9 @@ ivas_error ivas_render_config_init_from_rom_fx( set32_fx( &( *hRenderConfig )->roomAcoustics.pAcoustic_rt60_fx[0], 0, CLDFB_NO_CHANNELS_MAX ); set32_fx( &( *hRenderConfig )->roomAcoustics.pAcoustic_dsr_fx[0], 0, CLDFB_NO_CHANNELS_MAX ); - Copy32( ivas_reverb_default_fc_fx, ( *hRenderConfig )->roomAcoustics.pFc_input_fx, IVAS_REVERB_DEFAULT_N_BANDS ); - Copy32( ivas_reverb_default_RT60_fx, ( *hRenderConfig )->roomAcoustics.pAcoustic_rt60_fx, IVAS_REVERB_DEFAULT_N_BANDS ); - Copy32( ivas_reverb_default_DSR_fx, ( *hRenderConfig )->roomAcoustics.pAcoustic_dsr_fx, IVAS_REVERB_DEFAULT_N_BANDS ); + Copy32( ivas_reverb_default_large_fc_fx, ( *hRenderConfig )->roomAcoustics.pFc_input_fx, IVAS_REVERB_DEFAULT_L_N_BANDS ); + Copy32( ivas_reverb_default_large_RT60_fx, ( *hRenderConfig )->roomAcoustics.pAcoustic_rt60_fx, IVAS_REVERB_DEFAULT_L_N_BANDS ); + Copy32( ivas_reverb_default_large_DSR_fx, ( *hRenderConfig )->roomAcoustics.pAcoustic_dsr_fx, IVAS_REVERB_DEFAULT_L_N_BANDS ); FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) { @@ -136,6 +140,104 @@ ivas_error ivas_render_config_init_from_rom_fx( ( *hRenderConfig )->directivity_fx[add( i_mult( i, 3 ), 2 )] = 32767 /*1.0f in Q15*/; /* Back attenuation */ move16(); } + ( *hRenderConfig )->distAtt_fx[0] = 2113929216; /* Maximum radius (2^ISM_RADIUS_NBITS-1)*0.25 */ /*15.75 in Q27*/ /* Default max dist */ + move32(); + ( *hRenderConfig )->distAtt_fx[1] = ONE_IN_Q30; // Q30 /* Default ref dist */ + move32(); + ( *hRenderConfig )->distAtt_fx[2] = ONE_IN_Q30; // Q30 /* Default rolloff factor */ + move32(); + ( *hRenderConfig )->split_rend_config.splitRendBitRate = ISAR_MAX_SPLIT_REND_BITRATE; + move32(); + ( *hRenderConfig )->split_rend_config.dof = 3; + move16(); + ( *hRenderConfig )->split_rend_config.hq_mode = 0; + move16(); + ( *hRenderConfig )->split_rend_config.codec_delay_ms = 0; + move16(); + ( *hRenderConfig )->split_rend_config.isar_frame_size_ms = 20; + move16(); + ( *hRenderConfig )->split_rend_config.codec_frame_size_ms = 0; /* 0 means "use default for selected codec" */ + move16(); + ( *hRenderConfig )->split_rend_config.codec = ISAR_SPLIT_REND_CODEC_DEFAULT; + move32(); + ( *hRenderConfig )->split_rend_config.poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB; + move32(); + ( *hRenderConfig )->split_rend_config.rendererSelection = IVAS_BIN_RENDERER_TYPE_DEFAULT; + move32(); + ( *hRenderConfig )->split_rend_config.lc3plus_highres = 0; + move16(); + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_render_config_change_defaults() + * + * Changes default values from ROM + *-------------------------------------------------------------------*/ + +ivas_error ivas_render_config_change_defaults( + RENDER_CONFIG_HANDLE hRenderConfig, /* i/o: Renderer config handle */ + IVAS_DefaultReverbSize defaultReverbSize /* i: Reverb default size */ +) +{ + SWITCH( defaultReverbSize ) + { + case DEFAULT_REVERB_SMALL: + hRenderConfig->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_S_N_BANDS; + move16(); + hRenderConfig->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_S_PRE_DELAY_FX; + move32(); + hRenderConfig->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_S_INPUT_DELAY_FX; + move32(); + hRenderConfig->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; + move16(); + set_zero_fx( &hRenderConfig->roomAcoustics.pFc_input_fx[0], CLDFB_NO_CHANNELS_MAX ); + set_zero_fx( &hRenderConfig->roomAcoustics.pAcoustic_rt60_fx[0], CLDFB_NO_CHANNELS_MAX ); + set_zero_fx( &hRenderConfig->roomAcoustics.pAcoustic_dsr_fx[0], CLDFB_NO_CHANNELS_MAX ); + + Copy32( ivas_reverb_default_small_fc_fx, hRenderConfig->roomAcoustics.pFc_input_fx, IVAS_REVERB_DEFAULT_S_N_BANDS ); + Copy32( ivas_reverb_default_small_RT60_fx, hRenderConfig->roomAcoustics.pAcoustic_rt60_fx, IVAS_REVERB_DEFAULT_S_N_BANDS ); + Copy32( ivas_reverb_default_small_DSR_fx, hRenderConfig->roomAcoustics.pAcoustic_dsr_fx, IVAS_REVERB_DEFAULT_S_N_BANDS ); + BREAK; + case DEFAULT_REVERB_MEDIUM: + hRenderConfig->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_M_N_BANDS; + move16(); + hRenderConfig->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_M_PRE_DELAY_FX; + move32(); + hRenderConfig->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_M_INPUT_DELAY_FX; + move32(); + hRenderConfig->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; + move16(); + set_zero_fx( &hRenderConfig->roomAcoustics.pFc_input_fx[0], CLDFB_NO_CHANNELS_MAX ); + set_zero_fx( &hRenderConfig->roomAcoustics.pAcoustic_rt60_fx[0], CLDFB_NO_CHANNELS_MAX ); + set_zero_fx( &hRenderConfig->roomAcoustics.pAcoustic_dsr_fx[0], CLDFB_NO_CHANNELS_MAX ); + + Copy32( ivas_reverb_default_medium_fc_fx, hRenderConfig->roomAcoustics.pFc_input_fx, IVAS_REVERB_DEFAULT_M_N_BANDS ); + Copy32( ivas_reverb_default_medium_RT60_fx, hRenderConfig->roomAcoustics.pAcoustic_rt60_fx, IVAS_REVERB_DEFAULT_M_N_BANDS ); + Copy32( ivas_reverb_default_medium_DSR_fx, hRenderConfig->roomAcoustics.pAcoustic_dsr_fx, IVAS_REVERB_DEFAULT_M_N_BANDS ); + BREAK; + case DEFAULT_REVERB_LARGE: + hRenderConfig->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_L_N_BANDS; + move16(); + hRenderConfig->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_L_PRE_DELAY_FX; + move32(); + hRenderConfig->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_L_INPUT_DELAY_FX; + move32(); + hRenderConfig->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; + move16(); + set_zero_fx( &hRenderConfig->roomAcoustics.pFc_input_fx[0], CLDFB_NO_CHANNELS_MAX ); + set_zero_fx( &hRenderConfig->roomAcoustics.pAcoustic_rt60_fx[0], CLDFB_NO_CHANNELS_MAX ); + set_zero_fx( &hRenderConfig->roomAcoustics.pAcoustic_dsr_fx[0], CLDFB_NO_CHANNELS_MAX ); + + Copy32( ivas_reverb_default_large_fc_fx, hRenderConfig->roomAcoustics.pFc_input_fx, IVAS_REVERB_DEFAULT_L_N_BANDS ); + Copy32( ivas_reverb_default_large_RT60_fx, hRenderConfig->roomAcoustics.pAcoustic_rt60_fx, IVAS_REVERB_DEFAULT_L_N_BANDS ); + Copy32( ivas_reverb_default_large_DSR_fx, hRenderConfig->roomAcoustics.pAcoustic_dsr_fx, IVAS_REVERB_DEFAULT_L_N_BANDS ); + BREAK; + default: + return IVAS_ERR_ACOUSTIC_ENVIRONMENT_MISSING; + } return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_reverb_fft_filter_fx.c b/lib_rend/ivas_reverb_fft_filter_fx.c index bbe077f8bacdb8d40e1e1cba411dc34bf727a88f..b7f890ec39673d50daea8655d5a4bad9462be7e3 100644 --- a/lib_rend/ivas_reverb_fft_filter_fx.c +++ b/lib_rend/ivas_reverb_fft_filter_fx.c @@ -37,15 +37,17 @@ #include #include "wmc_auto.h" #include "debug.h" -#define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) -#define fix_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) + /*------------------------------------------------------------------------------------------* * Static functions declarations *------------------------------------------------------------------------------------------*/ + static void fft_wrapper_2ch_fx( Word32 *buffer_L, Word32 *buffer_R, const Word16 fft_size ); static void ifft_wrapper_2ch_fx( Word32 *buffer_L, Word32 *buffer_R, const Word16 fft_size ); + + /*-----------------------------------------------------------------------------------------* * Function int_log2() * @@ -232,6 +234,9 @@ void ivas_reverb_t2f_f2t_ClearHistory( move32(); } + t2f_f2t->prev_shift = 31; + move16(); + return; } /*-----------------------------------------------------------------------------------------* diff --git a/lib_rend/ivas_reverb_filter_design_fx.c b/lib_rend/ivas_reverb_filter_design_fx.c index 62c97f88f4b4c78c399967ee85854c694ac44929..e826596ba7b686df5683cee85499ded94bbf2265 100644 --- a/lib_rend/ivas_reverb_filter_design_fx.c +++ b/lib_rend/ivas_reverb_filter_design_fx.c @@ -411,7 +411,7 @@ static void response_step_limit_fx( IF( X[i] ) { - desiredChange = BASOP_Util_Divide3232_Scale_cadence( X[i], X[i - 1], &div_e ); + desiredChange = BASOP_Util_Divide3232_Scale_newton( X[i], X[i - 1], &div_e ); desiredChange_q = sub( 31, ( div_e ) ); } @@ -459,7 +459,7 @@ static void response_step_limit_fx( IF( X[i] ) { - desiredChange = BASOP_Util_Divide3232_Scale_cadence( X[i], X[i + 1], &div_e ); + desiredChange = BASOP_Util_Divide3232_Scale_newton( X[i], X[i + 1], &div_e ); desiredChange_q = sub( 31, ( div_e ) ); } IF( GT_16( desiredChange_q, 30 ) ) @@ -671,7 +671,7 @@ void ivas_reverb_calc_color_levels_fx( const Word32 output_Fs, const Word16 freq_count, const Word16 loop_count, - const Word32 *pFc, // input in Q14 + const Word32 *pFc, // input in Q16 const Word32 *pAcoustic_dsr, // input in Q31 const Word32 *pHrtf_avg_pwr_L, // input in Q28 const Word32 *pHrtf_avg_pwr_R, // input in Q28 @@ -689,8 +689,8 @@ void ivas_reverb_calc_color_levels_fx( /* Pre-computing inverse values for optimisation (to avoid divisions in inner loops) */ Word16 fs_inverted_q; - const Word32 fs_inverted = BASOP_Util_Divide3232_Scale( ONE_IN_Q11, L_shl( output_Fs, 11 ), &fs_inverted_q ); // q= 15 - fs_inverted_q = 29 - const Word32 loop_count_inverted = divide3232( ONE_IN_Q27, L_shl( loop_count, 27 ) ); // q= 15; + const Word32 fs_inverted = BASOP_Util_Divide3232_Scale( ONE_IN_Q11, L_shl( output_Fs, 11 ), &fs_inverted_q ); // q= 15 - fs_inverted_q = 29//Q29 + const Word32 loop_count_inverted = divide3232( ONE_IN_Q27, L_shl( loop_count, 27 ) ); // q= 15;Q15 const Word32 log__0_001 = -1854286438; // logf( 0.001f ) in q28 move32(); @@ -740,11 +740,11 @@ void ivas_reverb_calc_color_levels_fx( Word16 temp = 0, result_e = 0; move16(); move16(); - cos_w = getCosWord16R2( (Word16) L_abs( L_shl( Mpy_32_32( pFc[freq_idx], fs_inverted ), 3 ) ) ); // q = 15 + cos_w = getCosWord16R2( (Word16) L_abs( L_shl( Mpy_32_32( pFc[freq_idx], fs_inverted ), 1 ) ) ); // q = 15 H_filter = L_add( L_shr( L_add( L_shr( Mpy_32_32( coefB[0], coefB[0] ), 1 ), L_shr( Mpy_32_32( coefB[1], coefB[1] ), 1 ) ), 2 ), L_shr( Mpy_32_32( coefB[0], Mpy_32_32( coefB[1], L_shl( cos_w, 15 ) ) ), 1 ) ); // q = 28 - H_filter = BASOP_Util_Divide3232_Scale_cadence( H_filter, L_add( ONE_IN_Q28, L_shr( L_add( L_shr( Mpy_32_32( coefA[1], coefA[1] ), 2 ), Mpy_32_32( coefA[1], L_shl( cos_w, 15 ) ) ), 1 ) ), &temp ); + H_filter = BASOP_Util_Divide3232_Scale_newton( H_filter, L_add( ONE_IN_Q28, L_shr( L_add( L_shr( Mpy_32_32( coefA[1], coefA[1] ), 2 ), Mpy_32_32( coefA[1], L_shl( cos_w, 15 ) ) ), 1 ) ), &temp ); H_filter = Sqrt32( H_filter, &temp ); - T60_est = BASOP_Util_Divide3232_Scale_cadence( L_shl( i_mult( -3, pLoop_delays[loop_idx] ), 2 ), Mpy_32_32( Mpy_32_32( L_add( BASOP_Util_Log2( H_filter ), L_shl( temp, 25 ) ), LOG10_2_Q31 ), L_shl( output_Fs, 8 ) ), &temp ); // conversion of log2 to log10. + T60_est = BASOP_Util_Divide3232_Scale_newton( L_shl( i_mult( -3, pLoop_delays[loop_idx] ), 2 ), Mpy_32_32( Mpy_32_32( L_add( BASOP_Util_Log2( H_filter ), L_shl( temp, 25 ) ), LOG10_2_Q31 ), L_shl( output_Fs, 8 ) ), &temp ); // conversion of log2 to log10. t60[freq_idx] = BASOP_Util_Add_Mant32Exp( T60_est, temp, t60[freq_idx], t60_e[freq_idx], &result_e ); move16(); t60_e[freq_idx] = result_e; @@ -775,14 +775,14 @@ void ivas_reverb_calc_color_levels_fx( { Word16 temp, temp1, temp2, temp3 = 0, temp4, temp5; move16(); - Word32 var1 = BASOP_Util_Divide3232_Scale_cadence( (Word32) i_mult( -6, minDelay ), L_shr( Mpy_32_32( t60[freq_idx], L_shl( output_Fs, 11 ) ), sub( 11, t60_e[freq_idx] ) ), &temp ); + Word32 var1 = BASOP_Util_Divide3232_Scale_newton( (Word32) i_mult( -6, minDelay ), L_shr( Mpy_32_32( t60[freq_idx], L_shl( output_Fs, 11 ) ), sub( 11, t60_e[freq_idx] ) ), &temp ); var1 = Mpy_32_32( var1, LOG2_10_Q29 ); // e = temp + (31 - 29) Word32 A0_square_est = BASOP_util_Pow2( var1, add( temp, 31 - 29 ), &temp ); Word16 alpha_e; - Word32 alpha = BASOP_Util_Divide3232_Scale_cadence( -log__0_001, t60[freq_idx], &alpha_e ); // alpha_e = 1 + alpha_e + (3 - t60_e[257]) + Word32 alpha = BASOP_Util_Divide3232_Scale_newton( -log__0_001, t60[freq_idx], &alpha_e ); // alpha_e = 1 + alpha_e + (3 - t60_e[257]) - Word32 div11 = BASOP_Util_Divide3232_Scale_cadence( A0_square_est, alpha, &temp1 ); // e = temp1 + (temp - alpha_e) - Word32 div2 = BASOP_Util_Divide3232_Scale_cadence( L_shl( output_Fs, 11 ), L_shr( L_add( Mpy_32_16_1( 1884631649, shl( minDelayDiff, 3 ) ), 14037339 ), 8 ), &temp2 ); // e = temp2, 26.7741 in Q19, 0.8776 in Q31 + Word32 div11 = BASOP_Util_Divide3232_Scale_newton( A0_square_est, alpha, &temp1 ); // e = temp1 + (temp - alpha_e) + Word32 div2 = BASOP_Util_Divide3232_Scale_newton( L_shl( output_Fs, 11 ), L_shr( L_add( Mpy_32_16_1( 1884631649, shl( minDelayDiff, 3 ) ), 14037339 ), 8 ), &temp2 ); // e = temp2, 26.7741 in Q19, 0.8776 in Q31 const Word32 revPredNormEnergy = Mpy_32_32( div2, div11 ); // q = (15 - temp2) + (15 - temp1) - 15 + 1 // L_max @@ -794,7 +794,7 @@ void ivas_reverb_calc_color_levels_fx( L_tmp = W_extract_h( W_shl( W_tmp1, W_shift ) ); temp4 = sub( 3, W_shift ); div2 = Sqrt32( L_tmp, &temp4 ); - pTarget_color_L[freq_idx] = BASOP_Util_Divide3232_Scale_cadence( div2, div1, &temp5 ); + pTarget_color_L[freq_idx] = BASOP_Util_Divide3232_Scale_newton( div2, div1, &temp5 ); move32(); temp5 = add( temp5, sub( temp4, temp3 ) ); pTarget_color_L_e[freq_idx] = temp5; @@ -807,7 +807,7 @@ void ivas_reverb_calc_color_levels_fx( L_tmp = W_extract_h( W_shl( W_tmp2, W_shift ) ); temp4 = sub( 3, W_shift ); div2 = Sqrt32( L_tmp, &temp4 ); - pTarget_color_R[freq_idx] = BASOP_Util_Divide3232_Scale_cadence( div2, div1, &temp5 ); + pTarget_color_R[freq_idx] = BASOP_Util_Divide3232_Scale_newton( div2, div1, &temp5 ); move32(); temp5 = add( temp5, sub( temp4, temp3 ) ); pTarget_color_R_e[freq_idx] = temp5; @@ -825,7 +825,7 @@ void ivas_reverb_calc_color_levels_fx( Word32 div1; Word16 temp = 0; move16(); - div1 = BASOP_Util_Divide3232_Scale_cadence( L_mult0( 1000, sub( freq_count, 1 ) ), L_shr( output_Fs, 1 ), &temp ); + div1 = BASOP_Util_Divide3232_Scale_newton( L_mult0( 1000, sub( freq_count, 1 ) ), L_shr( output_Fs, 1 ), &temp ); div1 = BASOP_Util_Add_Mant32Exp( div1, temp, ONE_IN_Q30, 1, &temp ); idx_pivot = extract_l( L_shr( div1, sub( 31, temp ) ) ); /* Perform step limiting */ @@ -839,54 +839,49 @@ void ivas_reverb_calc_color_levels_fx( } /*-------------------------------------------------------------------* - * ivas_reverb_interpolate_acoustic_data() + * ivas_reverb_interp_on_freq_grid_fx() * - * Interpolates data from the input T60 and DSR tables to the FFT pFilter uniform grid + * Interpolates data from an input grid of center frequencies to an output grid of center frequencies * Note: the fc frequencies both for the input and the output must be in the ascending order *-------------------------------------------------------------------*/ - - -void ivas_reverb_interpolate_acoustic_data_fx( - const Word16 input_table_size, - const Word32 *pInput_fc, // input in Q16 - const Word32 *pInput_t60, // input in Q26 - const Word32 *pInput_dsr, // input in Q30 - const Word16 output_table_size, - const Word32 *pOutput_fc, // Q16 - Word32 *pOutput_t60, // pOutput_t60_e - Word32 *pOutput_dsr, // pOutput_dsr_e - Word16 *pOutput_t60_e, // output e - Word16 *pOutput_dsr_e // output e +void ivas_reverb_interp_on_freq_grid_fx( + const Word16 input_grid_size, + const Word32 *pInput_fc, // input center frequencies in Q16 + const Word32 *pInput_data, // input data vector in an arbitrary Q-format + const Word16 output_grid_size, + const Word32 *pOutput_fc, + Word32 *pOutput_data // output data vector in the same Q-format as input ) { - Word16 input_idx, output_idx; + Word16 input_idx, input_idx_next, output_idx; Word32 rel_offset; Word16 rel_offset_e; input_idx = 0; + input_idx_next = 0; + move16(); move16(); - FOR( output_idx = 0; output_idx < output_table_size; output_idx++ ) + FOR( output_idx = 0; output_idx < output_grid_size; output_idx++ ) { /* if the bin frequency is lower than the 1st frequency point in the input table, take this 1st point */ IF( LT_32( pOutput_fc[output_idx], pInput_fc[0] ) ) { input_idx = 0; move16(); + input_idx_next = 0; + move16(); rel_offset = 0; move32(); - rel_offset_e = 0; - move16(); } ELSE { /* if the bin frequency is higher than the last frequency point in the input table, take this last point */ - IF( GT_32( pOutput_fc[output_idx], pInput_fc[input_table_size - 1] ) ) + IF( GT_32( pOutput_fc[output_idx], pInput_fc[input_grid_size - 1] ) ) { - input_idx = sub( input_table_size, 2 ); - rel_offset = ONE_IN_Q30; // Q30; + input_idx = sub( input_grid_size, 2 ); + input_idx_next = add( input_idx, 1 ); + rel_offset = ONE_IN_Q31; move32(); - rel_offset_e = 1; - move16(); } /* otherwise use linear interpolation between 2 consecutive points in the input table */ ELSE @@ -895,281 +890,13 @@ void ivas_reverb_interpolate_acoustic_data_fx( { input_idx = add( input_idx, 1 ); } - rel_offset = BASOP_Util_Divide3232_Scale( L_sub( pOutput_fc[output_idx], pInput_fc[input_idx] ), L_sub( pInput_fc[input_idx + 1], pInput_fc[input_idx] ), &rel_offset_e ); // q15 - rel_offset = L_shl_sat( rel_offset, add( 16, rel_offset_e ) ); - rel_offset_e = 0; - move16(); + input_idx_next = add( input_idx, 1 ); + rel_offset = BASOP_Util_Divide3232_Scale( L_sub( pOutput_fc[output_idx], pInput_fc[input_idx] ), L_sub( pInput_fc[input_idx_next], pInput_fc[input_idx] ), &rel_offset_e ); // Q15 + rel_offset = L_shl_sat( rel_offset, add( 16, rel_offset_e ) ); // Q31 } } - Word32 mult1; - Word16 mult_e = 0; - move16(); - mult1 = Mpy_32_32( rel_offset, L_sub( pInput_t60[input_idx + 1], pInput_t60[input_idx] ) ); - pOutput_t60[output_idx] = BASOP_Util_Add_Mant32Exp( pInput_t60[input_idx], 5, mult1, add( 5, rel_offset_e ), &mult_e ); // 31 - (31 - rel_offset_e + 26 - 31) - move32(); - pOutput_t60_e[output_idx] = mult_e; - move16(); - - mult1 = Mpy_32_32( rel_offset, L_sub( pInput_dsr[input_idx + 1], pInput_dsr[input_idx] ) ); - pOutput_dsr[output_idx] = BASOP_Util_Add_Mant32Exp( pInput_dsr[input_idx], 1, mult1, add( 1, rel_offset_e ), &mult_e ); // 31 - (31 - rel_offset_e + 26 - 31) - move32(); - pOutput_dsr_e[output_idx] = mult_e; - move16(); - } - - return; -} -/*-------------------------------------------------------------------* - * ivas_reverb_get_hrtf_set_properties() - * - * Function analyses the HRTF set and computes avarage left/right power spectrum - * and frequency-dependent IA coherence. Expects frequency-domain HRTF input - *-------------------------------------------------------------------*/ - -void ivas_reverb_get_hrtf_set_properties_fx( - Word32 **ppHrtf_set_L_re, // Q29 - Word32 **ppHrtf_set_L_im, // Q29 - Word32 **ppHrtf_set_R_re, // Q29 - Word32 **ppHrtf_set_R_im, // Q29 - const AUDIO_CONFIG input_audio_config, - const Word16 hrtf_count, - const Word16 in_freq_count, - const Word16 out_freq_count, - Word32 *pOut_avg_pwr_L, // output in Q23 - Word32 *pOut_avg_pwr_R, // output in Q23 - Word32 *out_i_a_coherence ) // output in Q27 -{ - const Word16 foa_sum_coeffs[4][3] = { - { MAX_WORD16, MAX_WORD16, 0 }, - { MAX_WORD16, -MAX_WORD16, 0 }, - { MAX_WORD16, 0, MAX_WORD16 }, - { MAX_WORD16, 0, -MAX_WORD16 } - }; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - const Word32 inp_freq_step = divide3232( ONE_IN_Q22, L_shl( in_freq_count, 23 ) ); // q= 15 - const Word32 inp_freq_offset = L_shr( inp_freq_step, 1 ); // q= 15 - const Word16 out_freq_step = divide3232( ONE_IN_Q21, L_shl( L_sub( out_freq_count, 1 ), 22 ) ); // q = 15 - - Word16 hrtf_count_inverted, used_hrtf_count, freq_idx, hrtf_idx, out_bin_idx, ch_index, is_ambisonics; - Word32 relative_pos, weight_1st, base_idx; - Word32 avg_pwr_left[2]; - Word32 avg_pwr_right[2]; - Word32 IA_coherence[2]; - - test(); - test(); - IF( EQ_16( input_audio_config, IVAS_AUDIO_CONFIG_FOA ) || EQ_16( input_audio_config, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_16( input_audio_config, IVAS_AUDIO_CONFIG_HOA3 ) ) - { - is_ambisonics = 1; - move16(); - used_hrtf_count = 4; /* Using only 1st order HRTFs */ - move16(); - } - ELSE - { - is_ambisonics = 0; - move16(); - used_hrtf_count = hrtf_count; - move16(); - } - - /* Interpolation (linear to a new grid) */ - base_idx = 0; - move32(); - relative_pos = 0; - move32(); - hrtf_count_inverted = divide1616( ONE_IN_Q11, shl( used_hrtf_count, 11 ) ); // q = 15 - - /* Loop over output frequency bins */ - FOR( out_bin_idx = 0; out_bin_idx < out_freq_count; out_bin_idx++ ) - { - /* Computing normalized frequency for the current bin (1.0 corresponds to sampling rate) */ - - const Word32 norm_freq = L_mult( out_freq_step, shl( out_bin_idx, 5 ) ); // q = 21 - - /* Computing the bin index in the source data */ - Word16 div_q = 0; - move16(); - // Word32 tbl_index = BASOP_Util_Divide3232_Scale(L_sub(norm_freq , L_shl(inp_freq_offset, 6)), L_shl(inp_freq_step, 6), &div_q);//q =15 - div_q - Word32 tbl_index = Mpy_32_32( L_sub( norm_freq, L_shl( inp_freq_offset, 6 ) ), L_shl( in_freq_count, 22 ) ); // q = 11 - IF( div_q < 0 ) - { - tbl_index = L_shl( tbl_index, div_q ); - div_q = 0; - move16(); - } - IF( tbl_index <= 0 ) /* In case of extrapolation (below 1st bin), choose nearest */ - { - base_idx = 0; - move32(); - relative_pos = 0; - move32(); - } - ELSE - { - base_idx = ( tbl_index ); // q = 21 - move32(); - relative_pos = L_shl( L_sub( tbl_index, L_shl( L_shr( base_idx, 11 ), 11 ) ), 20 ); // q = 31 - base_idx = L_shr( base_idx, 11 ); - IF( GT_32( base_idx, L_sub( in_freq_count, 2 ) ) ) /* In case of extrapolation (above last bin), choose nearest */ - { - base_idx = L_sub( in_freq_count, 2 ); - relative_pos = ONE_IN_Q31; // Q31 - move32(); - } - } - - /* Computing 2 bins data for later interpolation */ - - /* Zeroing before accumalation for average value computing */ - avg_pwr_left[0] = 0; - move32(); - avg_pwr_left[1] = 0; - move32(); - avg_pwr_right[0] = 0; - move32(); - avg_pwr_right[1] = 0; - move32(); - IA_coherence[0] = 0; - move32(); - IA_coherence[1] = 0; - move32(); - - /* Get power spectra and cross - correlation between left and right hrtfs */ - /* Loop over all the HRTFs available */ - FOR( hrtf_idx = 0; hrtf_idx < used_hrtf_count; hrtf_idx++ ) - { - /* Pointers to current HRTF data */ - Word32 *current_base_L_ptr_re, *current_base_L_ptr_im, *current_base_R_ptr_re, *current_base_R_ptr_im; - - /* combined HRTF data used for FOA */ - Word32 combined_channels_L_re[2]; - Word32 combined_channels_L_im[2]; - Word32 combined_channels_R_re[2]; - Word32 combined_channels_R_im[2]; - - /* Process the frequency bins containing both real and img parts */ - /* In case of 5.1 or 7.1 formats, use the available HRTF paires directly*/ - IF( !is_ambisonics ) - { - current_base_L_ptr_re = ( ppHrtf_set_L_re[hrtf_idx] + base_idx ); // Q29 - current_base_R_ptr_re = ( ppHrtf_set_R_re[hrtf_idx] + base_idx ); // Q29 - current_base_L_ptr_im = ( ppHrtf_set_L_im[hrtf_idx] + base_idx ); // Q29 - current_base_R_ptr_im = ( ppHrtf_set_R_im[hrtf_idx] + base_idx ); // Q29 - } - - /* In case of FOA format, combine the W channel with the X/Y channels */ - ELSE - { - FOR( freq_idx = 0; freq_idx < 2; freq_idx++ ) - { - combined_channels_L_re[freq_idx] = 0; - move32(); - combined_channels_R_re[freq_idx] = 0; - move32(); - combined_channels_L_im[freq_idx] = 0; - move32(); - combined_channels_R_im[freq_idx] = 0; - move32(); - - FOR( ch_index = 0; ch_index < 3; ch_index++ ) - { - combined_channels_L_re[freq_idx] = L_add( combined_channels_L_re[freq_idx], Mpy_32_16_1( ppHrtf_set_L_re[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); // Q29 + Q15 - 15 - move32(); - combined_channels_R_re[freq_idx] = L_add( combined_channels_R_re[freq_idx], Mpy_32_16_1( ppHrtf_set_R_re[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); // Q29 + Q15 - 15 - move32(); - combined_channels_L_im[freq_idx] = L_add( combined_channels_L_im[freq_idx], Mpy_32_16_1( ppHrtf_set_L_im[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); // Q29 + Q15 - 15 - move32(); - combined_channels_R_im[freq_idx] = L_add( combined_channels_R_im[freq_idx], Mpy_32_16_1( ppHrtf_set_R_im[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); // Q29 + Q15 - 15 - move32(); - } - } - - current_base_L_ptr_re = &combined_channels_L_re[0]; // Q29 - current_base_R_ptr_re = &combined_channels_R_re[0]; // Q29 - current_base_L_ptr_im = &combined_channels_L_im[0]; // Q29 - current_base_R_ptr_im = &combined_channels_R_im[0]; // Q29 - } - - FOR( freq_idx = 0; freq_idx < 2; freq_idx++ ) - { - Word32 L_re, L_im, R_re, R_im, C_re; - - L_re = current_base_L_ptr_re[freq_idx]; // Q29 - R_re = current_base_R_ptr_re[freq_idx]; // Q29 - L_im = current_base_L_ptr_im[freq_idx]; // Q29 - R_im = current_base_R_ptr_im[freq_idx]; // Q29 - move32(); - move32(); - move32(); - move32(); - avg_pwr_left[freq_idx] = L_add( L_shr( L_add( Mpy_32_32( L_re, L_re ), Mpy_32_32( L_im, L_im ) ), 4 ), avg_pwr_left[freq_idx] ); // q = 23 - move32(); - avg_pwr_right[freq_idx] = L_add( L_shr( L_add( Mpy_32_32( R_re, R_re ), Mpy_32_32( R_im, R_im ) ), 4 ), avg_pwr_right[freq_idx] ); // q = 23 - move32(); - /* Cross product (Re part) */ - C_re = L_add( Mpy_32_32( L_re, R_re ), Mpy_32_32( L_im, R_im ) ); // q = 27 - - IA_coherence[freq_idx] = L_add( C_re, IA_coherence[freq_idx] ); // q = 27 - move32(); - } - } - - /* Compute the averages and the IA coherence */ - FOR( freq_idx = 0; freq_idx < 2; freq_idx++ ) - { - Word16 sqrt_exp = 0; - move16(); - Word32 var1; - avg_pwr_left[freq_idx] = Mpy_32_16_1( avg_pwr_left[freq_idx], hrtf_count_inverted ); // q = 23 - move32(); - avg_pwr_right[freq_idx] = Mpy_32_16_1( avg_pwr_right[freq_idx], hrtf_count_inverted ); // q = 23 - move32(); - IF( EQ_32( avg_pwr_left[freq_idx], avg_pwr_right[freq_idx] ) ) - { - var1 = avg_pwr_left[freq_idx]; - move32(); - sqrt_exp = 4; - move16(); - } - ELSE - { - var1 = Sqrt32( Mpy_32_32( avg_pwr_left[freq_idx], avg_pwr_right[freq_idx] ), &sqrt_exp ); - move32(); - } - Word16 temp; - IA_coherence[freq_idx] = BASOP_Util_Divide3232_Scale( Mpy_32_16_1( IA_coherence[freq_idx], hrtf_count_inverted ), L_shl( var1, sqrt_exp ), &temp ); // q =15 - move32(); - IA_coherence[freq_idx] = L_shl( IA_coherence[freq_idx], sub( 27, sub( 15, temp ) ) ); // q = 27 - move32(); - /* Limiting to (0...1) range in case of small numerical errors or negative values */ - IA_coherence[freq_idx] = L_min( IA_coherence[freq_idx], ONE_IN_Q27 ); // Q27 - move32(); - IA_coherence[freq_idx] = L_max( IA_coherence[freq_idx], 0 ); // Q27 - move32(); - } - - /* Computing weighted average of 2 nearest values (1 below + 1 above) for linear interpolation */ - weight_1st = L_sub( ONE_IN_Q31, relative_pos ); // q = 31 - - pOut_avg_pwr_L[out_bin_idx] = L_add( Mpy_32_32( weight_1st, avg_pwr_left[0] ), Mpy_32_32( relative_pos, avg_pwr_left[1] ) ); // q = 23 - move32(); - pOut_avg_pwr_R[out_bin_idx] = L_add( Mpy_32_32( weight_1st, avg_pwr_right[0] ), Mpy_32_32( relative_pos, avg_pwr_right[1] ) ); // q = 23 - move32(); - out_i_a_coherence[out_bin_idx] = L_add( Mpy_32_32( weight_1st, IA_coherence[0] ), Mpy_32_32( relative_pos, IA_coherence[1] ) ); // q = 27 - move32(); + pOutput_data[output_idx] = L_add( pInput_data[input_idx], Mpy_32_32( rel_offset, L_sub( pInput_data[input_idx_next], pInput_data[input_idx] ) ) ); } return; diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 870f8795dd4ab6fd0d1a45dbf17205e15df3fda5..6ab0c7a6355243b49f77be91ab4511707aec6c93 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -40,28 +40,7 @@ #include #include "wmc_auto.h" #include "debug.h" -#define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) -#define float_to_fixQ31( n ) ( round( n * 0x7fffffff ) ) -#define fix_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) -static Word16 wrap_rad_fixed( - Word32 angle /* Q13 */ ) -{ - Word32 L_tmp = angle; - move32(); - - /* Wrap azimuth value */ - WHILE( GT_32( L_tmp, EVS_PI_FX ) ) - { - L_tmp = L_sub( L_tmp, EVS_2PI_FX ); - } - WHILE( LE_32( L_tmp, -EVS_PI_FX ) ) - { - L_tmp = L_add( L_tmp, EVS_2PI_FX ); - } - - return extract_l( L_tmp ); -} /* The reverberator structure implemented here is described in detail in: * Vilkamo, J., Neugebauer, B., & Plogsties, J. (2012). Sparse frequency-domain reverberator. @@ -75,24 +54,20 @@ static Word16 wrap_rad_fixed( #define CLDFB_SLOTS_PER_SECOND 800 /* Used for initializing reverb */ +#define REV_TIME_THRESHOLD ( 13421773 ) /* 0.2f in Q26 */ +#define Q26_REV_TIME_THRESHOLD_TIMES_0_5 ( 6710886 ) /* 0.2 * 0.5 in Q26 */ +#define Q29_0_5_PER_REV_TIME_THRESHOLD ( 1342177280 ) /* 0.2 / 0.5 in Q29 */ + #define INNER_BLK_SIZE 80 /* size of data blocks used for more efficient delay line and IIR filter processing */ /* should be a divisor of the frame length at any sampling rate and an even number*/ -#define FFT_FILTER_WND_FLAT_REGION ( 0.40f ) /* flat section (==1) length of FFT filter window, in proportion to overlap */ -#define FFT_FILTER_WND_TRANS_REGION ( 0.15f ) /* transition (1->0) length of FFT filter window, in proportion to overlap */ #define FFT_FILTER_WND_FLAT_REGION_FX ( 26214 ) /*Q16 flat section (==1) length of FFT filter window, in proportion to overlap */ #define FFT_FILTER_WND_TRANS_REGION_FX ( 9830 ) /*Q16 transition (1->0) length of FFT filter window, in proportion to overlap */ -#define REF_LF_MIN ( 100.0f ) -#define REF_LF_MAX ( 250.0f ) -#define REF_HF_MIN ( 5000.0f ) -#define REF_HF_MAX ( 7950.0f ) #define REF_LF_MIN_FX ( 100 ) #define REF_LF_MAX_FX ( 250 ) #define REF_HF_MIN_FX ( 5000 ) #define REF_HF_MAX_FX ( 7950 ) -#define LF_BIAS ( 0.5f ) -#define DEFAULT_SRC_DIST ( 1.5f ) /* default source distance [m] for reverb dmx factor computing */ #define DMX_GAIN ( 1410542208 ) #define IVAS_REVERB_FFT_SIZE_48K ( 512 ) #define IVAS_REVERB_FFT_SIZE_32K ( 512 ) @@ -103,62 +78,83 @@ static Word16 wrap_rad_fixed( #define MAX_NR_OUTPUTS ( 2 ) -const Word16 init_loop_delay[IVAS_REV_MAX_NR_BRANCHES] = { 37, 31, 29, 23, 19, 17, 13, 11 }; -const Word16 default_loop_delay_48k[IVAS_REV_MAX_NR_BRANCHES] = { 2309, 1861, 1523, 1259, 1069, 919, 809, 719 }; -const Word16 default_loop_delay_32k[IVAS_REV_MAX_NR_BRANCHES] = { 1531, 1237, 1013, 839, 709, 613, 541, 479 }; -const Word16 default_loop_delay_16k[IVAS_REV_MAX_NR_BRANCHES] = { 769, 619, 509, 421, 353, 307, 269, 239 }; +#define M60Q9 ( -30720 ) //-60 in Q9 +#define M120Q8 ( -30720 ) //-120 in Q8 + +static const Word16 init_loop_delay[IVAS_REV_MAX_NR_BRANCHES] = { 37, 31, 29, 23, 19, 17, 13, 11 }; +static const Word16 default_loop_delay_48k[IVAS_REV_MAX_NR_BRANCHES] = { 2309, 1861, 1523, 1259, 1069, 919, 809, 719 }; +static const Word16 default_loop_delay_32k[IVAS_REV_MAX_NR_BRANCHES] = { 1531, 1237, 1013, 839, 709, 613, 541, 479 }; +static const Word16 default_loop_delay_16k[IVAS_REV_MAX_NR_BRANCHES] = { 769, 619, 509, 421, 353, 307, 269, 239 }; + /*------------------------------------------------------------------------------------------* * Local Struct definition *------------------------------------------------------------------------------------------*/ + typedef struct ivas_reverb_params_t { - Word16 pre_delay; /* Delay of the FDC reverb, first peak after pre_delay samples. Note that */ - /* there may be non-zero samples earlier due to the filters being */ - /* linear-phase. */ - Word16 nr_loops; /* Number of feedback loops (= L) */ - Word16 pLoop_delays[IVAS_REV_MAX_NR_BRANCHES]; /* Delay for each feedback loop in samples. */ /* Feedback [L][L] matrix that mixes the signals of the loops. */ - Word32 pLoop_feedback_matrix_fx[IVAS_REV_MAX_NR_BRANCHES * IVAS_REV_MAX_NR_BRANCHES]; /* Feedback [L][L] matrix that mixes the signals of the loops. */ - Word16 nr_outputs; /* Nr of signals extracted from the loops (= S). */ - /* Currently this is fixed to 2. */ /* Mix [S][L] matrix from feedback loops to outputs. */ - Word16 pLoop_extract_matrix_fx[MAX_NR_OUTPUTS * IVAS_REV_MAX_NR_BRANCHES]; /* Mix [S][L] matrix from feedback loops to outputs. */ /* In Matlab: [S x L] - Currently S=2, later may be more than 2 for speaker playback. */ - Word16 t60_filter_order; /* Filter order (length of vector) */ - // float pT60_filter_coeff[MAX_NR_OUTPUTS * IVAS_REV_MAX_NR_BRANCHES * IVAS_REV_MAX_IIR_FILTER_LENGTH]; /* Filters [][] in feedback loops, controlling T60. */ - Word16 pT60_filter_coeff_fx[MAX_NR_OUTPUTS * IVAS_REV_MAX_NR_BRANCHES * IVAS_REV_MAX_IIR_FILTER_LENGTH]; + Word16 pre_delay; /* Delay of the FDC reverb, first peak after pre_delay samples. Note that */ + /* there may be non-zero samples earlier due to the filters being */ + /* linear-phase. */ + Word16 nr_loops; /* Number of feedback loops (= L) */ + Word16 pLoop_delays[IVAS_REV_MAX_NR_BRANCHES]; /* Delay for each feedback loop in samples. */ + Word32 pLoop_feedback_matrix_fx[IVAS_REV_MAX_NR_BRANCHES * IVAS_REV_MAX_NR_BRANCHES]; /* Feedback [L][L] matrix that mixes the signals of the loops. */ + Word16 nr_outputs; /* Nr of signals extracted from the loops (= S). */ + /* Currently this is fixed to 2. */ + Word16 pLoop_extract_matrix_fx[MAX_NR_OUTPUTS * IVAS_REV_MAX_NR_BRANCHES]; /* Mix [S][L] matrix from feedback loops to outputs. */ + /* In Matlab: [S x L] - Currently S=2, later may be more than 2 for speaker playback. */ + Word16 t60_filter_order; /* Filter order (length of vector) */ + Word16 pT60_filter_coeff_fx[MAX_NR_OUTPUTS * IVAS_REV_MAX_NR_BRANCHES * IVAS_REV_MAX_IIR_FILTER_LENGTH]; /* Filters [][] in feedback loops, controlling T60. */ /* In Matlab: IIR: [(2 * L) x ( + 1)] (odd: b-vector, even: a-vector) */ /* In Matlab: FIR: [L x ] */ - // float *pFc; /* Center frequencies for FFT filter design */ - // float *pRt60; /* RT60 values at these frequencies */ - // float *pDsr; /* DSR values at these frequencies */ - Word32 *pFc_fx; /* Center frequencies for FFT filter design */ - Word32 *pRt60_fx; /* RT60 values at these frequencies */ - Word16 *pRt60_e; /* exponents for RT60 values at these frequencies */ - Word32 *pDsr_fx; /* DSR values at these frequencies */ - Word16 *pDsr_e; /* DSR values at these frequencies */ - // float *pHrtf_avg_pwr_response_l; /* The HRTF set's average left ear power response */ - // float *pHrtf_avg_pwr_response_r; /* The HRTF set's average right ear power response */ - // float *pHrtf_inter_aural_coherence; /* The HRTF set's inter-aural coherence for diffuse sound */ - // const float *pHrtf_avg_pwr_response_l_const; /* The HRTF set's average left ear power response */ - // const float *pHrtf_avg_pwr_response_r_const; /* The HRTF set's average right ear power response */ - // const float *pHrtf_inter_aural_coherence_const; /* The HRTF set's inter-aural coherence for diffuse sound */ - - Word32 *pHrtf_avg_pwr_response_l_fx; /* The HRTF set's average left ear power response */ - Word32 *pHrtf_avg_pwr_response_r_fx; /* The HRTF set's average right ear power response */ - Word32 *pHrtf_inter_aural_coherence_fx; /* The HRTF set's inter-aural coherence for diffuse sound */ + Word32 *pFc_fx; /* Center frequencies for FFT filter design */ + Word32 *pRt60_fx; /* RT60 values at these frequencies */ + Word16 *pRt60_e; /* exponents for RT60 values at these frequencies */ + Word32 *pDsr_fx; /* DSR values at these frequencies */ + Word16 *pDsr_e; /* DSR values at these frequencies */ const Word32 *pHrtf_avg_pwr_response_l_const_fx; /* The HRTF set's average left ear power response */ const Word32 *pHrtf_avg_pwr_response_r_const_fx; /* The HRTF set's average right ear power response */ const Word32 *pHrtf_inter_aural_coherence_const_fx; /* The HRTF set's inter-aural coherence for diffuse sound */ - Word16 do_corr_filter; /* Flag indicating whether correlation filters should be used. */ - /* Correlation only supported and needed for binaural playback (i.e. */ - /* when nr_outputs != 2 correlation filtering is never supported). */ + + Word16 do_corr_filter; /* Flag indicating whether correlation filters should be used. */ + /* Correlation only supported and needed for binaural playback (i.e. */ + /* when nr_outputs != 2 correlation filtering is never supported). */ } ivas_reverb_params_t; + /*------------------------------------------------------------------------------------------* * Static functions declarations *------------------------------------------------------------------------------------------*/ static ivas_error calc_jot_t60_coeffs_fx( Word16 *pH_dB_fx, Word16 pH_dB_exp, const UWord16 nrFrequencies, Word16 *pFrequencies_fx, Word16 *pCoeffA_fx, Word16 *pCoeffB_fx, const Word16 fNyquist_fx ); + +/*------------------------------------------------------------------------- + * wrap_rad_fx() + * + * + *------------------------------------------------------------------------*/ + +static Word16 wrap_rad_fx( + Word32 angle /* Q13 */ ) +{ + Word32 L_tmp = angle; + move32(); + + /* Wrap azimuth value */ + WHILE( GT_32( L_tmp, EVS_PI_FX ) ) + { + L_tmp = L_sub( L_tmp, EVS_2PI_FX ); + } + WHILE( LE_32( L_tmp, -EVS_PI_FX ) ) + { + L_tmp = L_add( L_tmp, EVS_2PI_FX ); + } + + return extract_l( L_tmp ); +} + + /*------------------------------------------------------------------------- * binRend_rand() * @@ -194,9 +190,9 @@ static void ivas_binaural_reverb_setPreDelay_fx( return; } - IF( GT_16( delaySamples, REVERB_PREDELAY_MAX ) ) + IF( GT_16( delaySamples, IVAS_REVERB_PREDELAY_MAX ) ) { - hReverb->preDelayBufferLength = REVERB_PREDELAY_MAX; + hReverb->preDelayBufferLength = IVAS_REVERB_PREDELAY_MAX; move16(); return; @@ -215,16 +211,14 @@ static void ivas_binaural_reverb_setPreDelay_fx( * *------------------------------------------------------------------------*/ - static void ivas_binaural_reverb_setReverbTimes_fx( REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ const Word32 output_Fs, /* i : sampling_rate */ - const Word32 *revTimes_fx, /*Q31 i : reverberation times T60 for each CLDFB bin in seconds */ + const Word32 *revTimes_fx, /*Q26 i : reverberation times T60 for each CLDFB bin in seconds */ const Word32 *revEnes_fx /*Q31 i : spectrum for reverberated sound at each CLDFB bin */ ) { Word16 bin, ch, tap, sample; - Word32 binCenterFreq_fx, diffuseFieldICC_fx, tmpVal_fx, attenuationFactorPerSample_fx, L_tmp; Word32 intendedEnergy_fx, actualizedEnergy_fx, energyBuildup_fx, currentEnergy_fx, attenuationFactorPerSampleSq_fx; Word16 tmp, tmp_exp, scale, tmpVal_exp, attenuationFactorPerSample_exp, attenuationFactorPerSampleSq_exp, energyBuildup_exp, currentEnergy_exp, intendedEnergy_exp, actualizedEnergy_exp; @@ -247,6 +241,9 @@ static void ivas_binaural_reverb_setReverbTimes_fx( L_tmp = Mpy_32_16_1( output_Fs, tmp ); /*- exp */ binCenterFreq_exp = add( 31, exp ); binCenterFreq_fx = L_shr( L_tmp, 1 ); // divide by 2 + norm = norm_l( binCenterFreq_fx ); + binCenterFreq_fx = L_shl( binCenterFreq_fx, norm ); + binCenterFreq_exp = sub( binCenterFreq_exp, norm ); IF( bin == 0 ) { diffuseFieldICC_fx = ONE_IN_Q31; @@ -261,7 +258,7 @@ static void ivas_binaural_reverb_setReverbTimes_fx( tmp = add( mult( EVS_PI_FX, tmp ), EPSILLON_FX ); // to avoid divide by 0 issue tmp_exp = sub( add( binCenterFreq_exp, 2 ), norm ); - sine_inp = wrap_rad_fixed( L_shl( tmp, sub( tmp_exp, 2 ) ) ); // Q13 + sine_inp = wrap_rad_fx( L_shl( tmp, sub( tmp_exp, 2 ) ) ); // Q13 sine = getSinWord16( sine_inp ); // Q15 div1 = BASOP_Util_Divide1616_Scale( sine, tmp, &scale ); @@ -270,9 +267,7 @@ static void ivas_binaural_reverb_setReverbTimes_fx( /* binCenterFreq / 2700.0f */ L_tmp = Mpy_32_32( binCenterFreq_fx, 795364 /* 1 / 2700 in Q31 */ ); - norm = norm_l( L_tmp ); - L_tmp = L_shl( L_tmp, norm ); /* Q31 */ - + L_tmp = L_shl( L_tmp, binCenterFreq_exp ); /* Q31 */ /* ( 1.0f - binCenterFreq / 2700.0f ) */ L_tmp = L_sub( ONE_IN_Q31, L_tmp ); /* Q31 */ @@ -324,7 +319,7 @@ static void ivas_binaural_reverb_setReverbTimes_fx( /* Determine attenuation factor that generates the appropriate energy decay according to reverberation time */ L_tmp = Mpy_32_32( 1677721600, revTimes_fx[bin] ); // e10 --> 800 * 2^21, + e0 tmp = BASOP_Util_Divide3232_Scale( 1073741824, L_tmp, &scale ); - scale = add( scale, sub( 1, 10 ) ); + scale = add( scale, sub( 1, 15 ) ); // revTimes_fx in Q26 L_tmp = Mpy_32_16_1( -1610612736, tmp ); // * -3 scale = add( 2, scale ); L_tmp = Mpy_32_32( 1783446563, L_tmp ); // scale + 2 @@ -344,7 +339,6 @@ static void ivas_binaural_reverb_setReverbTimes_fx( /* Design sparse decorrelation filters. The decorrelation filters, due to random procedures involved, * may affect the spectrum of the output. The spectral effect is therefore monitored and compensated for. */ - intendedEnergy_fx = 0; move32(); intendedEnergy_exp = 0; @@ -356,7 +350,6 @@ static void ivas_binaural_reverb_setReverbTimes_fx( FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - energyBuildup_fx = 0; move32(); energyBuildup_exp = 0; @@ -405,6 +398,23 @@ static void ivas_binaural_reverb_setReverbTimes_fx( currentEnergy_fx = Mpy_32_32( currentEnergy_fx, attenuationFactorPerSampleSq_fx ); currentEnergy_exp = currentEnergy_exp + attenuationFactorPerSampleSq_exp; } + + /* In some configurations with small T60s it is possible the number of taps randomizes to zero. + Ensure at least 1 filter tap. */ + IF( EQ_16( tap, 0 ) ) + { + hReverb->tapPhaseShiftType[bin][ch][0] = (Word16) ( binRend_rand( hReverb ) % 4 ); + move16(); + hReverb->tapPointersReal_fx[bin][ch][0] = &( hReverb->loopBufReal_fx[bin][0] ); + hReverb->tapPointersImag_fx[bin][ch][0] = &( hReverb->loopBufImag_fx[bin][0] ); + tap = 1; + move16(); + actualizedEnergy_fx = ONE_IN_Q30; + move32(); + actualizedEnergy_exp = 1; + move16(); + } + hReverb->taps[bin][ch] = tap; /* Number of taps determined at the above random procedure */ move16(); } @@ -436,9 +446,11 @@ static void ivas_binaural_reverb_setReverbTimes_fx( hReverb->reverbEqGains_fx[bin] = L_shl( hReverb->reverbEqGains_fx[bin], reverb_exp ); // making as Q31 move32(); } + return; } + /*-----------------------------------------------------------------------------------------* * Function compute_feedback_matrix() * @@ -473,7 +485,6 @@ static ivas_error compute_feedback_matrix_fx( } } - return IVAS_ERR_OK; } @@ -505,6 +516,8 @@ static void compute_2_out_extract_matrix_fx( return; } + + /*-----------------------------------------------------------------------------------------* * Function set_base_config() * @@ -558,6 +571,7 @@ static ivas_error set_base_config_fx( } compute_2_out_extract_matrix_fx( pParams->pLoop_extract_matrix_fx, pParams->nr_loops ); + /* pre-set the various filters; they will be set later based on reverb configuration */ pParams->t60_filter_order = 1; /* set to 1 in base config. */ move16(); @@ -576,17 +590,22 @@ static ivas_error set_base_config_fx( return IVAS_ERR_OK; } + /*-----------------------------------------------------------------------------------------* * Function calc_dmx_gain() * * Computes the downmix gain *-----------------------------------------------------------------------------------------*/ + static Word32 calc_dmx_gain_fx( void ) { - const Word32 gain = DMX_GAIN; // Q25 + const Word32 gain = DMX_GAIN; // Q23 move32(); + return gain; } + + /*-----------------------------------------------------------------------------------------* * Function calc_predelay() * @@ -599,6 +618,7 @@ static void calc_predelay_fx( const Word32 output_Fs ) { Word16 predelay, fbdelay, output_frame; + predelay = round_fx( L_shl( Mult_32_32( L_shl( output_Fs, 15 ), acoustic_predelay_sec ), 5 ) ); output_frame = extract_l( Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); fbdelay = pParams->pLoop_delays[sub( pParams->nr_loops, 1 )]; @@ -619,16 +639,17 @@ static void calc_predelay_fx( pParams->pre_delay = predelay; // Q0 move16(); - move16(); - move16(); + return; } + /*-----------------------------------------------------------------------------------------* * Function compute_t60_coeffs() * * Calculate Jot reverb's T60 filter coefficients *-----------------------------------------------------------------------------------------*/ + static ivas_error compute_t60_coeffs_fx( ivas_reverb_params_t *pParams, const Word16 nr_fc_fft_filter, /*Q0*/ @@ -636,76 +657,80 @@ static ivas_error compute_t60_coeffs_fx( { Word16 bin_idx, loop_idx, tf_T60_len, len; ivas_error error; - - Word16 loop_delay_sec_fx, norm_f_e, tmp; + Word16 loop_delay_sec_fx, tmp, tmp_e; Word32 freq_Nyquist_fx = L_shr( output_Fs, 1 ); - Word16 target_gains_db_fx[RV_LENGTH_NR_FC]; + Word16 target_gains_db_fx[RV_LENGTH_NR_FC]; // Q8 Word16 norm_f_fx[RV_LENGTH_NR_FC]; - Word32 *targetT60_fx, *pFc_fx; - Word16 *pCoeffs_a_fx, *pCoeffs_b_fx, *targetT60_e; - Word16 target_gains_db_exp[RV_LENGTH_NR_FC]; + Word16 *pCoeffs_a_fx, *pCoeffs_b_fx; + Word16 e; error = IVAS_ERR_OK; move32(); tf_T60_len = nr_fc_fft_filter; move16(); len = add( pParams->t60_filter_order, 1 ); - pFc_fx = pParams->pFc_fx; - targetT60_fx = pParams->pRt60_fx; - targetT60_e = pParams->pRt60_e; - move16(); - FOR( bin_idx = 0; bin_idx < tf_T60_len; bin_idx++ ) { - norm_f_fx[bin_idx] = BASOP_Util_Divide3232_Scale( pFc_fx[bin_idx], freq_Nyquist_fx, &norm_f_e ); + norm_f_fx[bin_idx] = BASOP_Util_Divide3232_Scale( pParams->pFc_fx[bin_idx], freq_Nyquist_fx, &e ); move16(); - norm_f_e = add( norm_f_e, sub( 17, 31 ) ); - norm_f_fx[bin_idx] = shl( norm_f_fx[bin_idx], sub( norm_f_e, 1 ) ); // making Q14 + e = add( e, sub( 15, 31 ) ); + norm_f_fx[bin_idx] = shl( norm_f_fx[bin_idx], sub( e, 1 ) ); // making Q14 move16(); } FOR( loop_idx = 0; loop_idx < pParams->nr_loops; loop_idx++ ) { - - Word16 loop_delay_sec_fx_exp; - loop_delay_sec_fx = BASOP_Util_Divide3232_Scale( pParams->pLoop_delays[loop_idx], output_Fs, &loop_delay_sec_fx_exp ); + loop_delay_sec_fx = BASOP_Util_Divide3232_Scale( pParams->pLoop_delays[loop_idx], output_Fs, &e ); + loop_delay_sec_fx = shl( loop_delay_sec_fx, e ); // Q15 FOR( bin_idx = 0; bin_idx < tf_T60_len; bin_idx++ ) { - tmp = BASOP_Util_Divide3232_Scale( L_deposit_h( loop_delay_sec_fx ), targetT60_fx[bin_idx], &target_gains_db_exp[bin_idx] ); - target_gains_db_exp[bin_idx] = add( target_gains_db_exp[bin_idx], sub( loop_delay_sec_fx_exp, targetT60_e[bin_idx] ) ); - move16(); - target_gains_db_fx[bin_idx] = mult( -30720, tmp ); // -60 in Q9 -> -30720 - move16(); - target_gains_db_exp[bin_idx] = add( target_gains_db_exp[bin_idx], 6 ); // Q9 -> e6 - move16(); - - tmp = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( target_gains_db_fx[bin_idx] ), target_gains_db_exp[bin_idx], -2013265920, 7 ); - IF( tmp < 0 ) + IF( EQ_32( pParams->pRt60_fx[bin_idx], 0 ) ) { - target_gains_db_fx[bin_idx] = -30720; // -60 in Q9 -> -30720 - move16(); - target_gains_db_exp[bin_idx] = 7; + // If RT60 is 0, target gain is -120dB + target_gains_db_fx[bin_idx] = M120Q8; move16(); } + ELSE + { + tmp = BASOP_Util_Divide3232_Scale( L_deposit_h( loop_delay_sec_fx ), pParams->pRt60_fx[bin_idx], &e ); + tmp_e = add( e, sub( 0, 5 ) ); // L_deposit_h( loop_delay_sec_fx ):Q0.31, pParams->pRt60_fx[bin_idx]:Q5.26 + + tmp_e = add( tmp_e, 6 ); // + Q6.9(M60Q9) + target_gains_db_fx[bin_idx] = mult( M60Q9, tmp ); + + // gain < - 120 ? -120: gain + tmp_e = sub( tmp_e, 7 ); // - Q7.8(M120Q8) + IF( GT_16( tmp_e, 0 ) ) + { + IF( LT_16( target_gains_db_fx[bin_idx], shr( M120Q8, tmp_e ) ) ) + { + target_gains_db_fx[bin_idx] = M120Q8; // Q8 + move16(); + } + ELSE + { + target_gains_db_fx[bin_idx] = shl_r( target_gains_db_fx[bin_idx], tmp_e ); // Q8, gain must be less than 128 + } + } + ELSE + { + target_gains_db_fx[bin_idx] = shl_r( target_gains_db_fx[bin_idx], tmp_e ); // Q8, gain must be less than 128 + IF( LT_16( target_gains_db_fx[bin_idx], M120Q8 ) ) + { + target_gains_db_fx[bin_idx] = M120Q8; // Q8 + move16(); + } + } + } } pCoeffs_a_fx = &pParams->pT60_filter_coeff_fx[add( shl( i_mult( len, loop_idx ), 1 ), len )]; // Q14 pCoeffs_b_fx = &pParams->pT60_filter_coeff_fx[shl( i_mult( len, loop_idx ), 1 )]; // Q14 - Word16 val = target_gains_db_exp[0]; move16(); - FOR( Word16 i = 1; i < nr_fc_fft_filter; i++ ) - { - val = s_max( val, target_gains_db_exp[i] ); - } - - FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ ) - { - target_gains_db_fx[i] = shr( target_gains_db_fx[i], sub( val, target_gains_db_exp[i] ) ); - move16(); - } + Word16 val = 7; IF( NE_32( ( error = calc_jot_t60_coeffs_fx( target_gains_db_fx, val, tf_T60_len, norm_f_fx, pCoeffs_a_fx, pCoeffs_b_fx, extract_l( freq_Nyquist_fx ) ) ), IVAS_ERR_OK ) ) { @@ -719,6 +744,7 @@ static ivas_error compute_t60_coeffs_fx( pParams->pLoop_delays[loop_idx] = sub( pParams->pLoop_delays[loop_idx], len ); // Q0 move16(); } + return error; } @@ -729,7 +755,6 @@ static ivas_error compute_t60_coeffs_fx( * Calculate 1st order low shelf filter *-----------------------------------------------------------------------------------------*/ - static void calc_low_shelf_first_order_filter_fx( Word16 *pNum, /* Q14 */ Word16 *pDen, /* Q14 */ @@ -852,6 +877,7 @@ static void calc_low_shelf_first_order_filter_fx( move16(); pDen[0] = shl( 1, 14 ); // Q14 move16(); + return; } @@ -862,7 +888,6 @@ static void calc_low_shelf_first_order_filter_fx( * Calculate Jot reverb's T60 filters *-----------------------------------------------------------------------------------------*/ - static ivas_error calc_jot_t60_coeffs_fx( Word16 *pH_dB_fx, Word16 pH_dB_exp, @@ -981,23 +1006,30 @@ static ivas_error calc_jot_t60_coeffs_fx( L_tmp = BASOP_util_Pow2( L_deposit_h( tmp_fx ), exph, &e ); lin_gain_hf_fx = extract_l( L_shr( L_tmp, sub( 16, e ) ) ); + IF( EQ_16( lin_gain_hf_fx, 0 ) ) + { + lin_gain_hf_fx = 1; + move16(); + } + /* call low-pass iir shelf */ calc_low_shelf_first_order_filter_fx( pCoeffB_fx, pCoeffA_fx, f0_fx, lin_gain_lf_fx, lin_gain_hf_fx ); + return IVAS_ERR_OK; } + /*-----------------------------------------------------------------------------------------* * Function initialize_reverb_filters() * * Set the number of branches (feedback loops) and Initializes the memory structure (pointers to data) *-----------------------------------------------------------------------------------------*/ + static ivas_error initialize_reverb_filters_fx( REVERB_HANDLE hReverb ) { ivas_error error; - error = IVAS_ERR_OK; - /* init correlation and coloration filters */ IF( NE_32( ( error = ivas_reverb_t2f_f2t_init( &hReverb->fft_filter_ols, hReverb->fft_size, hReverb->fft_subblock_size ) ), IVAS_ERR_OK ) ) { @@ -1024,9 +1056,10 @@ static ivas_error initialize_reverb_filters_fx( return error; } - return error; + return IVAS_ERR_OK; } + /*-----------------------------------------------------------------------------------------* * Function set_t60_filter() * @@ -1055,6 +1088,7 @@ static ivas_error set_t60_filter( return IVAS_ERR_OK; } + /*-----------------------------------------------------------------------------------------* * Function set_feedback_delay() * @@ -1076,6 +1110,8 @@ static ivas_error set_feedback_delay_fx( return IVAS_ERR_OK; } + + /*-----------------------------------------------------------------------------------------* * Function set_feedback_gain() * @@ -1101,6 +1137,8 @@ static ivas_error set_feedback_gain_fx( return IVAS_ERR_OK; } + + /*-----------------------------------------------------------------------------------------* * Function set_correl_fft_filter() * @@ -1184,6 +1222,8 @@ static ivas_error set_mixer_level_fx( return IVAS_ERR_OK; } + + /*-----------------------------------------------------------------------------------------* * Function clear_buffers_fx() * @@ -1213,6 +1253,7 @@ static void clear_buffers_fx( return; } + /*-----------------------------------------------------------------------------------------* * Function set_fft_and_datablock_sizes_fx() * @@ -1256,29 +1297,23 @@ static void set_fft_and_datablock_sizes_fx( return; } + /*-----------------------------------------------------------------------------------------* - * Function set_reverb_acoustic_data() + * Function set_reverb_acoustic_data_fx() * * Sets reverb acoustic data (room acoustics and HRTF), interpolating it to the filter grid *-----------------------------------------------------------------------------------------*/ static void set_reverb_acoustic_data_fx( ivas_reverb_params_t *pParams, - const AUDIO_CONFIG input_audio_config, - const HRTFS_HANDLE hHrtf, IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pRoomAcoustics, - const Word16 subframe_len, const Word16 nr_fc_input, const Word16 nr_fc_fft_filter ) { - Word16 nr_out_ch, hrtf_idx, offset, iter_idx, bin_idx; - Word32 *pHrtf_set_l_re_fx[MAX_INTERN_CHANNELS]; - Word32 *pHrtf_set_l_im_fx[MAX_INTERN_CHANNELS]; - Word32 *pHrtf_set_r_re_fx[MAX_INTERN_CHANNELS]; - Word32 *pHrtf_set_r_im_fx[MAX_INTERN_CHANNELS]; + Word16 bin_idx; Word32 ln_1e6_inverted_fx, delay_diff_fx, L_tmp; - Word16 exp_argument_fx, tmp, tmp_flag, exp_argument_e; - Word16 pow_exp; + Word32 exp_argument_fx, tmp; + Word16 pow_exp, exp_argument_e; Word32 *pFc_input_fx = pRoomAcoustics->pFc_input_fx; Word32 *pAcoustic_rt60_fx = pRoomAcoustics->pAcoustic_rt60_fx; @@ -1286,105 +1321,46 @@ static void set_reverb_acoustic_data_fx( Word32 *pFc_fx = pParams->pFc_fx; Word32 *pRt60_fx = pParams->pRt60_fx; - Word16 *pRt60_e = pParams->pRt60_e; Word32 *pDsr_fx = pParams->pDsr_fx; - Word16 *pDsr_e = pParams->pDsr_e; - - /* use crend hrtf filters */ - IF( hHrtf != NULL ) - { - /* Compute HRTF set properties: average left/right energies, IA coherence */ - /* First, find the offset of the frequency-domain data for the 1st frame and assign HRTF pointers */ - FOR( nr_out_ch = 0; nr_out_ch < BINAURAL_CHANNELS; nr_out_ch++ ) - { - FOR( hrtf_idx = 0; hrtf_idx < hHrtf->max_num_ir; hrtf_idx++ ) - { - offset = 0; - move16(); - FOR( iter_idx = 0; iter_idx < hHrtf->num_iterations[hrtf_idx][nr_out_ch] - 1; iter_idx++ ) - { - offset = add( offset, hHrtf->pIndex_frequency_max[hrtf_idx][nr_out_ch][iter_idx] ); - } - - IF( EQ_16( nr_out_ch, 0 ) ) - { - pHrtf_set_l_re_fx[hrtf_idx] = &hHrtf->pOut_to_bin_re_fx[hrtf_idx][0][offset]; - pHrtf_set_l_im_fx[hrtf_idx] = &hHrtf->pOut_to_bin_im_fx[hrtf_idx][0][offset]; - } - ELSE - { - pHrtf_set_r_re_fx[hrtf_idx] = &hHrtf->pOut_to_bin_re_fx[hrtf_idx][1][offset]; - pHrtf_set_r_im_fx[hrtf_idx] = &hHrtf->pOut_to_bin_im_fx[hrtf_idx][1][offset]; - } - } - } - - /* Compute HRTF set properties using frequency-domain HRTF data */ - Word32 *pHrtf_avg_pwr_response_l_fx = pParams->pHrtf_avg_pwr_response_l_fx; - Word32 *pHrtf_avg_pwr_response_r_fx = pParams->pHrtf_avg_pwr_response_r_fx; - Word32 *pHrtf_inter_aural_coherence_fx = pParams->pHrtf_inter_aural_coherence_fx; - ivas_reverb_get_hrtf_set_properties_fx( pHrtf_set_l_re_fx, pHrtf_set_l_im_fx, pHrtf_set_r_re_fx, pHrtf_set_r_im_fx, input_audio_config, hHrtf->max_num_ir, subframe_len, - nr_fc_fft_filter, pHrtf_avg_pwr_response_l_fx, pHrtf_avg_pwr_response_r_fx, pHrtf_inter_aural_coherence_fx ); - - pParams->pHrtf_avg_pwr_response_l_const_fx = (const Word32 *) pParams->pHrtf_avg_pwr_response_l_fx; - pParams->pHrtf_avg_pwr_response_r_const_fx = (const Word32 *) pParams->pHrtf_avg_pwr_response_r_fx; - pParams->pHrtf_inter_aural_coherence_const_fx = (const Word32 *) pParams->pHrtf_inter_aural_coherence_fx; - } /* interpolate input table data for T60 and DSR to the FFT filter grid */ - ivas_reverb_interpolate_acoustic_data_fx( nr_fc_input, pFc_input_fx, pAcoustic_rt60_fx, pAcoustic_dsr_fx, - nr_fc_fft_filter, pFc_fx, pRt60_fx, pDsr_fx, pRt60_e, pDsr_e ); - /* adjust DSR for the delay difference */ + ivas_reverb_interp_on_freq_grid_fx( nr_fc_input, pFc_input_fx, pAcoustic_rt60_fx, nr_fc_fft_filter, pFc_fx, pRt60_fx ); // Q26 + ivas_reverb_interp_on_freq_grid_fx( nr_fc_input, pFc_input_fx, pAcoustic_dsr_fx, nr_fc_fft_filter, pFc_fx, pDsr_fx ); // Q30 - delay_diff_fx = L_sub( pRoomAcoustics->inputPreDelay_fx, pRoomAcoustics->acousticPreDelay_fx ); + /* adjust DSR for the delay difference */ + delay_diff_fx = L_sub( pRoomAcoustics->inputPreDelay_fx, pRoomAcoustics->acousticPreDelay_fx ); // Q27 ln_1e6_inverted_fx = 155440049; // Q31 /* 1.0f / logf( 1e06f ) */ move32(); FOR( bin_idx = 0; bin_idx < nr_fc_fft_filter; bin_idx++ ) { - L_tmp = Mpy_32_32( pRt60_fx[bin_idx], ln_1e6_inverted_fx ); // exp = pRt60_e[bin_idx] + 0 - exp_argument_fx = BASOP_Util_Divide3232_Scale( delay_diff_fx, L_tmp, &exp_argument_e ); - exp_argument_e = add( exp_argument_e, sub( 4, pRt60_e[bin_idx] ) ); // Q27 -> e4 - /* Limit exponent to approx +/-100 dB in case of incoherent value of delay_diff, to prevent overflow */ + L_tmp = Mpy_32_32( pRt60_fx[bin_idx], ln_1e6_inverted_fx ); // Q26 - // 23 in Q26 - tmp_flag = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( exp_argument_fx ), exp_argument_e, 1543503872, 5 ); - IF( tmp_flag > 0 ) + exp_argument_fx = BASOP_Util_Divide3232_Scale_newton( delay_diff_fx, L_tmp, &exp_argument_e ); + exp_argument_fx = L_shr_sat( exp_argument_fx, sub( 6, exp_argument_e ) ); // Q26 + + /* Limit exponent to approx +/-100 dB in case of incoherent value of delay_diff, to prevent overflow */ + IF( GT_32( exp_argument_fx, 1543503872 ) ) // 23 in Q26 { - exp_argument_fx = 23552; - move16(); - exp_argument_e = 5; - move16(); + exp_argument_fx = 1543503872; } - - tmp_flag = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( exp_argument_fx ), exp_argument_e, 0, 31 ); - IF( tmp_flag < 0 ) + IF( LT_32( exp_argument_fx, -1543503872 ) ) // 23 in Q26 { - tmp_flag = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( negate( exp_argument_fx ) ), exp_argument_e, 1543503872, 5 ); - IF( tmp_flag < 0 ) - { - exp_argument_fx = -23552; - move16(); - exp_argument_e = 5; - move16(); - } + exp_argument_fx = -1543503872; } - Word16 tmp_exp; - /* expf(exp_argument) -> pow(2, log2(e) * exp_argument) */ - tmp = mult( 23637, exp_argument_fx ); // exp_argument_e + 1 - tmp_exp = add( exp_argument_e, 1 ); - L_tmp = BASOP_util_Pow2( L_deposit_h( tmp ), tmp_exp, &pow_exp ); + tmp = Mpy_32_32( 96817114, exp_argument_fx ); // Q21 + + L_tmp = BASOP_util_Pow2( tmp, 10, &pow_exp ); L_tmp = Mpy_32_32( L_tmp, pDsr_fx[bin_idx] ); - tmp_exp = add( pow_exp, pDsr_e[bin_idx] ); + L_tmp = L_shl_sat( L_tmp, add( 1, pow_exp ) ); // Q31 pDsr_fx[bin_idx] = L_tmp; move32(); - pDsr_e[bin_idx] = tmp_exp; - move16(); } + return; } @@ -1401,7 +1377,6 @@ static ivas_error setup_FDN_branches_fx( { Word16 nr_coefs, branch_idx, channel_idx; ivas_error error; - Word16 *pCoef_a, *pCoef_b; error = IVAS_ERR_OK; /* initialize feedback branches */ @@ -1425,14 +1400,6 @@ static ivas_error setup_FDN_branches_fx( { FOR( branch_idx = 0; branch_idx < pParams->nr_loops; branch_idx++ ) { - pCoef_b = &pParams->pT60_filter_coeff_fx[shl( i_mult( nr_coefs, branch_idx ), 1 )]; /*Q14*/ - pCoef_a = &pParams->pT60_filter_coeff_fx[add( shl( i_mult( nr_coefs, branch_idx ), 1 ), nr_coefs )]; /*Q14*/ - - IF( NE_32( ( error = set_t60_filter( hReverb, branch_idx, nr_coefs, pCoef_a, pCoef_b ) ), IVAS_ERR_OK ) ) - { - return error; - } - IF( NE_32( ( error = set_feedback_delay_fx( hReverb, branch_idx, pParams->pLoop_delays[branch_idx] ) ), IVAS_ERR_OK ) ) { return error; @@ -1454,23 +1421,25 @@ static ivas_error setup_FDN_branches_fx( return error; } + + /*------------------------------------------------------------------------- * ivas_reverb_open_fx() * - * Allocate and initialize Crend reverberation handle + * Allocate and initialize FDN reverberation handle *------------------------------------------------------------------------*/ ivas_error ivas_reverb_open_fx( - REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ - const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ - const HRTFS_HANDLE hHrtf, /* i : HRTF handle */ - const Word32 *lr_energy_and_iac_fx[], /* i : precomuputed lr energies and iac */ - RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ - const Word32 output_Fs /* i : output sampling rate */ + REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ + const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ + RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ + const Word32 output_Fs /* i : output sampling rate */ ) { ivas_error error; - REVERB_HANDLE pState = NULL; + REVERB_HANDLE pState = *hReverb; + UWord16 nr_coefs, branch_idx; + Word16 *pCoef_a, *pCoef_b; Word16 bin_idx, subframe_len, output_frame, predelay_bf_len, loop_idx, i; ivas_reverb_params_t params; Word32 pColor_target_l_fx[RV_LENGTH_NR_FC]; @@ -1482,17 +1451,18 @@ ivas_error ivas_reverb_open_fx( rv_fftwf_type_complex_fx pFft_wf_filter_ch0_fx[RV_LENGTH_NR_FC]; rv_fftwf_type_complex_fx pFft_wf_filter_ch1_fx[RV_LENGTH_NR_FC]; - error = IVAS_ERR_OK; output_frame = extract_l( Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); subframe_len = shr( output_frame, 2 ); /*output_frame / MAX_PARAM_SPATIAL_SUBFRAMES*/ predelay_bf_len = output_frame; move16(); nr_fc_input = hRenderConfig->roomAcoustics.nBands; - /* Allocate main reverb. handle */ - IF( ( pState = (REVERB_HANDLE) malloc( sizeof( REVERB_DATA ) ) ) == NULL ) + IF( *hReverb == NULL ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Reverberator " ); + IF( ( pState = (REVERB_HANDLE) malloc( sizeof( REVERB_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for FDN Reverberator" ); + } } IF( NE_32( ( error = set_base_config_fx( ¶ms, output_Fs ) ), IVAS_ERR_OK ) ) @@ -1500,38 +1470,37 @@ ivas_error ivas_reverb_open_fx( return error; } - /* Allocate memory for feedback delay lines */ - FOR( loop_idx = 0; loop_idx < IVAS_REV_MAX_NR_BRANCHES; loop_idx++ ) + IF( *hReverb == NULL ) { - IF( ( pState->loop_delay_buffer_fx[loop_idx] = (Word32 *) malloc( params.pLoop_delays[loop_idx] * sizeof( Word32 ) ) ) == NULL ) + /* Allocate memory for feedback delay lines */ + FOR( loop_idx = 0; loop_idx < IVAS_REV_MAX_NR_BRANCHES; loop_idx++ ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CREND Reverberator" ); + IF( ( pState->loop_delay_buffer_fx[loop_idx] = (Word32 *) malloc( params.pLoop_delays[loop_idx] * sizeof( Word32 ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for FDN Reverberator" ); + } } - } - /* Allocate memory for the pre-delay delay line */ - IF( ( pState->pPredelay_buffer_fx = (Word32 *) malloc( output_frame * sizeof( Word32 ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CREND Reverberator" ); + /* Allocate memory for the pre-delay line */ + IF( ( pState->pPredelay_buffer_fx = (Word32 *) malloc( output_frame * sizeof( Word32 ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CREND Reverberator" ); + } } pState->nr_of_branches = IVAS_REV_MAX_NR_BRANCHES; move16(); set_fft_and_datablock_sizes_fx( pState, subframe_len ); + nr_fc_fft_filter = add( extract_l( L_shr( pState->fft_size, 1 ) ), 1 ); /* === 'Control logic': compute the reverb processing parameters from the === */ /* === room, source and listener acoustic information provided in the reverb config === */ /* Setting up shared temporary buffers for fc, RT60, DSR, etc. */ - params.pHrtf_avg_pwr_response_l_fx = &pFft_wf_filter_ch0_fx[0][0]; - params.pHrtf_avg_pwr_response_r_fx = params.pHrtf_avg_pwr_response_l_fx + nr_fc_fft_filter; params.pRt60_fx = &pFft_wf_filter_ch1_fx[0][0]; params.pDsr_fx = params.pRt60_fx + nr_fc_fft_filter; params.pFc_fx = &pState->fft_filter_color_0.fft_spectrum_fx[0]; - params.pHrtf_inter_aural_coherence_fx = &pState->fft_filter_color_1.fft_spectrum_fx[0]; -#ifdef MSAN_FIX set32_fx( pState->fft_filter_color_1.fft_spectrum_fx, 0, RV_FILTER_MAX_FFT_SIZE ); -#endif /* Note: these temp buffers can only be used before the final step of the FFT filter design : */ /* before calls to ivas_reverb_calc_correl_filters(...) or to ivas_reverb_calc_color_filters(...) */ @@ -1539,37 +1508,21 @@ ivas_error ivas_reverb_open_fx( freq_step_fx = L_mult0( extract_l( L_shr( output_Fs, 2 ) ), div_s( 1, ( nr_fc_fft_filter - 1 ) ) ); /*Q14:0.5f * output_Fs / ( nr_fc_fft_filter - 1 )*/ FOR( bin_idx = 0; bin_idx < nr_fc_fft_filter; bin_idx++ ) { - params.pFc_fx[bin_idx] = W_extract_l( W_mult0_32_32( freq_step_fx, bin_idx ) ); /*Q14*/ + params.pFc_fx[bin_idx] = W_extract_l( W_mult0_32_32( freq_step_fx, bin_idx ) ); /*Q16*/ } test(); - IF( hHrtf == NULL && lr_energy_and_iac_fx != NULL ) - { - params.pHrtf_avg_pwr_response_l_const_fx = lr_energy_and_iac_fx[0]; - params.pHrtf_avg_pwr_response_r_const_fx = lr_energy_and_iac_fx[1]; - params.pHrtf_inter_aural_coherence_const_fx = lr_energy_and_iac_fx[2]; - } + /* set up reverb acoustic data on the basis of HRTF data and renderer config */ Scale_sig32( params.pFc_fx, nr_fc_fft_filter, 2 ); - Word16 *pRt60_e = (Word16 *) malloc( sizeof( Word16 ) * nr_fc_fft_filter ); - Word16 *pDsr_e = (Word16 *) malloc( sizeof( Word16 ) * nr_fc_fft_filter ); - params.pRt60_e = pRt60_e; - params.pDsr_e = pDsr_e; + set_reverb_acoustic_data_fx( ¶ms, &hRenderConfig->roomAcoustics, nr_fc_input, nr_fc_fft_filter ); - set_reverb_acoustic_data_fx( ¶ms, input_audio_config, hHrtf, &hRenderConfig->roomAcoustics, subframe_len, nr_fc_input, nr_fc_fft_filter ); - Scale_sig32( params.pFc_fx, nr_fc_fft_filter, -2 ); - FOR( i = 0; i < nr_fc_fft_filter; i++ ) - { - params.pRt60_fx[i] = L_abs( params.pRt60_fx[i] ); - move32(); - params.pDsr_fx[i] = L_abs( params.pDsr_fx[i] ); - move32(); - } + params.pHrtf_avg_pwr_response_l_const_fx = hHrtfStatistics->average_energy_l; + params.pHrtf_avg_pwr_response_r_const_fx = hHrtfStatistics->average_energy_r; + params.pHrtf_inter_aural_coherence_const_fx = hHrtfStatistics->inter_aural_coherence; /* set reverb acoustic configuration based on renderer config */ - pState->pConfig.roomAcoustics.override = hRenderConfig->roomAcoustics.override; - move16(); pState->pConfig.roomAcoustics.nBands = hRenderConfig->roomAcoustics.nBands; move16(); @@ -1581,18 +1534,20 @@ ivas_error ivas_reverb_open_fx( move32(); } - /* set up input downmix */ - pState->dmx_gain_fx = calc_dmx_gain_fx(); + IF( *hReverb == NULL ) + { + pState->dmx_gain_fx = calc_dmx_gain_fx(); + } /* set up predelay - must be after set_base_config() and before compute_t60_coeffs() */ calc_predelay_fx( ¶ms, hRenderConfig->roomAcoustics.acousticPreDelay_fx, output_Fs ); /* set up jot reverb 60 filters - must be set up after set_reverb_acoustic_data() */ - IF( NE_32( ( error = compute_t60_coeffs_fx( ¶ms, nr_fc_fft_filter, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } + /* Compute target levels (gains) for the coloration filters */ Word32 *pHrtf_avg_pwr_response_l_const = (Word32 *) malloc( nr_fc_fft_filter * sizeof( Word32 * ) ); Word32 *pHrtf_avg_pwr_response_r_const = (Word32 *) malloc( nr_fc_fft_filter * sizeof( Word32 * ) ); @@ -1603,11 +1558,9 @@ ivas_error ivas_reverb_open_fx( FOR( i = 0; i < nr_fc_fft_filter; i++ ) { - params.pDsr_fx[i] = L_shl( params.pDsr_fx[i], params.pDsr_e[i] ); - move32(); - pHrtf_avg_pwr_response_l_const[i] = L_shl( params.pHrtf_avg_pwr_response_l_const_fx[i], 5 ); /*Q23+5*/ + pHrtf_avg_pwr_response_l_const[i] = params.pHrtf_avg_pwr_response_l_const_fx[i]; /*Q28*/ move32(); - pHrtf_avg_pwr_response_r_const[i] = L_shl( params.pHrtf_avg_pwr_response_r_const_fx[i], 5 ); /*Q23+5*/ + pHrtf_avg_pwr_response_r_const[i] = params.pHrtf_avg_pwr_response_r_const_fx[i]; /*Q23+5*/ move32(); } FOR( i = 0; i < lenT60_filter_coeff; i++ ) @@ -1630,60 +1583,65 @@ ivas_error ivas_reverb_open_fx( /* Compute the window used for FFT filters */ ivas_reverb_define_window_fft_fx( pTime_window_fx, transition_start, transition_length, nr_fc_fft_filter ); - /* === Now, copy parameters from ivas_reverb_params_t into DSP blocks === */ - /* === to be used for subsequent audio signal processing === */ - pState->do_corr_filter = params.do_corr_filter; - move16(); - - /* clear & init jot reverb fft filters */ - IF( NE_32( ( error = initialize_reverb_filters_fx( pState ) ), IVAS_ERR_OK ) ) + /* === Copy parameters from ivas_reverb_params_t into DSP blocks === */ + /* === to be used for subsequent audio signal processing === */ + IF( *hReverb == NULL ) { - return error; + pState->do_corr_filter = params.do_corr_filter; + move16(); + + /* clear & init jot reverb fft filters */ + IF( NE_32( ( error = initialize_reverb_filters_fx( pState ) ), IVAS_ERR_OK ) ) + { + return error; + } } + Word16 q_pFft_wf_filter_ch0_fx = 23, q_pFft_wf_filter_ch1_fx = 23; move16(); move16(); + IF( pState->do_corr_filter ) { /* Computing correlation filters on the basis of target IA coherence */ -#ifdef MSAN_FIX FOR( i = 0; i < shl( sub( nr_fc_fft_filter, 1 ), 1 ); i++ ) { pTime_window_fx[i] = L_shr( pTime_window_fx[i], 1 ); /*Scaling signal down to 30*/ move32(); } -#else - FOR( i = 0; i < RV_FILTER_MAX_FFT_SIZE; i++ ) + + Word32 *pHrtf_inter_aural_coherence_const = (Word32 *) malloc( nr_fc_fft_filter * sizeof( Word32 ) ); + IF( pHrtf_inter_aural_coherence_const == NULL ) { - pTime_window_fx[i] = L_shr( pTime_window_fx[i], 1 ); /*Scaling signal down to 30*/ + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); } -#endif // MSAN_FIX - Word32 *pHrtf_inter_aural_coherence_const = (Word32 *) malloc( nr_fc_fft_filter * sizeof( Word32 ) ); FOR( i = 0; i < nr_fc_fft_filter; i++ ) { - pHrtf_inter_aural_coherence_const[i] = L_shl( params.pHrtf_inter_aural_coherence_const_fx[i], 3 ); /*Scaling up to Q30*/ + pHrtf_inter_aural_coherence_const[i] = L_shl( params.pHrtf_inter_aural_coherence_const_fx[i], 4 ); /*Scaling up to Q30*/ move32(); } + ivas_reverb_calc_correl_filters_fx( pHrtf_inter_aural_coherence_const, pTime_window_fx, pState->fft_size, pFft_wf_filter_ch0_fx, pFft_wf_filter_ch1_fx, &q_pFft_wf_filter_ch0_fx, &q_pFft_wf_filter_ch1_fx ); free( pHrtf_inter_aural_coherence_const ); FOR( i = 0; i < nr_fc_fft_filter; i++ ) { - pFft_wf_filter_ch0_fx[i][0] = L_shl( pFft_wf_filter_ch0_fx[i][0], sub( 31, q_pFft_wf_filter_ch0_fx ) ); + pFft_wf_filter_ch0_fx[i][0] = L_shl( pFft_wf_filter_ch0_fx[i][0], sub( 31, q_pFft_wf_filter_ch0_fx ) ); // Scale to Q31 move32(); - pFft_wf_filter_ch0_fx[i][1] = L_shl( pFft_wf_filter_ch0_fx[i][1], sub( 31, q_pFft_wf_filter_ch0_fx ) ); + pFft_wf_filter_ch0_fx[i][1] = L_shl( pFft_wf_filter_ch0_fx[i][1], sub( 31, q_pFft_wf_filter_ch0_fx ) ); // Scale to Q31 move32(); } FOR( i = 0; i < nr_fc_fft_filter; i++ ) { - pFft_wf_filter_ch1_fx[i][0] = L_shl( pFft_wf_filter_ch1_fx[i][0], sub( 31, q_pFft_wf_filter_ch1_fx ) ); + pFft_wf_filter_ch1_fx[i][0] = L_shl( pFft_wf_filter_ch1_fx[i][0], sub( 31, q_pFft_wf_filter_ch1_fx ) ); // Scale to Q31 move32(); - pFft_wf_filter_ch1_fx[i][1] = L_shl( pFft_wf_filter_ch1_fx[i][1], sub( 31, q_pFft_wf_filter_ch1_fx ) ); + pFft_wf_filter_ch1_fx[i][1] = L_shl( pFft_wf_filter_ch1_fx[i][1], sub( 31, q_pFft_wf_filter_ch1_fx ) ); // Scale to Q31 move32(); } + /* Copying the computed FFT correlation filters to the fft_filter components */ IF( NE_32( ( error = set_correl_fft_filter_fx( pState, 0, pFft_wf_filter_ch0_fx ) ), IVAS_ERR_OK ) ) { @@ -1714,9 +1672,6 @@ ivas_error ivas_reverb_open_fx( move32(); } - Scale_sig32( params.pHrtf_inter_aural_coherence_fx, nr_fc_fft_filter, 4 ); /*Scaling ( *hReverb )->fft_filter_color_0.fft_spectrum_fx to Q31*/ - Scale_sig32( params.pFc_fx, nr_fc_fft_filter, 17 ); /*Scaling ( *hReverb )->fft_filter_color_1.fft_spectrum_fx to Q31*/ - /* Copying the computed FFT colorations filters to the fft_filter components */ IF( NE_32( ( error = set_color_fft_filter_fx( pState, 0, pFft_wf_filter_ch0_fx ) ), IVAS_ERR_OK ) ) { @@ -1728,27 +1683,49 @@ ivas_error ivas_reverb_open_fx( return error; } - /* init predelay */ - ivas_rev_delay_line_init( &( pState->predelay_line ), pState->pPredelay_buffer_fx, params.pre_delay, predelay_bf_len ); + IF( *hReverb == NULL ) + { + /* init predelay */ + ivas_rev_delay_line_init( &( pState->predelay_line ), pState->pPredelay_buffer_fx, params.pre_delay, predelay_bf_len ); - /* set up feedback delay network */ - IF( NE_32( ( error = setup_FDN_branches_fx( pState, ¶ms ) ), IVAS_ERR_OK ) ) + /* set up feedback delay network */ + IF( NE_32( ( error = setup_FDN_branches_fx( pState, ¶ms ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE { - return error; + pState->predelay_line.Delay = params.pre_delay; + move16(); + } + + nr_coefs = params.t60_filter_order + 1; + + FOR( branch_idx = 0; branch_idx < params.nr_loops; branch_idx++ ) + { + pCoef_a = ¶ms.pT60_filter_coeff_fx[2 * nr_coefs * branch_idx + nr_coefs]; + pCoef_b = ¶ms.pT60_filter_coeff_fx[2 * nr_coefs * branch_idx]; + + IF( NE_32( ( error = set_t60_filter( pState, branch_idx, nr_coefs, pCoef_a, pCoef_b ) ), IVAS_ERR_OK ) ) + { + return error; + } } - free( pDsr_e ); - free( pRt60_e ); + *hReverb = pState; - return error; + return IVAS_ERR_OK; } + + /*------------------------------------------------------------------------- * ivas_reverb_close() * * Deallocate Crend reverberation handle *------------------------------------------------------------------------*/ -void ivas_reverb_close( +void ivas_reverb_close_fx( REVERB_HANDLE *hReverb_in /* i/o: Reverberator handle */ ) { @@ -1780,6 +1757,8 @@ void ivas_reverb_close( return; } + + /*-----------------------------------------------------------------------------------------* * Function post_fft_filter() * @@ -1805,12 +1784,15 @@ static void post_fft_filter_fx( { ivas_reverb_t2f_f2t_in_fx( &hReverb->fft_filter_ols, input_L_fx, input_R_fx, buffer_L_fx, buffer_R_fx ); } + ivas_reverb_fft_filter_ComplexMul_fx( &hReverb->fft_filter_color_0, buffer_L_fx ); ivas_reverb_fft_filter_ComplexMul_fx( &hReverb->fft_filter_color_1, buffer_R_fx ); ivas_reverb_t2f_f2t_out_fx( &hReverb->fft_filter_ols, buffer_L_fx, buffer_R_fx, input_L_fx, input_R_fx ); return; } + + /*-----------------------------------------------------------------------------------------* * Function reverb_block() * @@ -1833,6 +1815,7 @@ static void reverb_block_fx( Word32 pTemp_fx[INNER_BLK_SIZE]; Word32 *ppOutput_fx[IVAS_REV_MAX_NR_BRANCHES]; Word32 Output_fx[IVAS_REV_MAX_NR_BRANCHES][INNER_BLK_SIZE]; + Word16 shift; move16(); move16(); move16(); @@ -1894,7 +1877,7 @@ static void reverb_block_fx( Word32 *pOutput = &ppOutput_fx[j][0]; FOR( ns = 0; ns < inner_bsize; ns++ ) { - pFeedback_input_fx[ns] = ( L_add( Mpy_32_32( gain_matrix_j_i, pOutput[ns] ), pFeedback_input_fx[ns] ) ); + pFeedback_input_fx[ns] = ( L_add_sat( Mpy_32_32( gain_matrix_j_i, pOutput[ns] ), pFeedback_input_fx[ns] ) ); move32(); } } @@ -1903,6 +1886,27 @@ static void reverb_block_fx( } } + shift = s_min( L_norm_arr( pOut0_fx, hReverb->fft_filter_ols.block_size ), L_norm_arr( pOut1_fx, hReverb->fft_filter_ols.block_size ) ); + + IF( LT_16( shift, hReverb->fft_filter_ols.prev_shift ) ) + { + scale_sig32( pOut0_fx, hReverb->fft_filter_ols.block_size, shift ); + scale_sig32( pOut1_fx, hReverb->fft_filter_ols.block_size, shift ); + scale_sig32( hReverb->fft_filter_ols.fft_history_L_fx, hReverb->fft_filter_ols.hist_size, sub( shift, hReverb->fft_filter_ols.prev_shift ) ); + scale_sig32( hReverb->fft_filter_ols.fft_history_R_fx, hReverb->fft_filter_ols.hist_size, sub( shift, hReverb->fft_filter_ols.prev_shift ) ); + + hReverb->fft_filter_ols.prev_shift = shift; + move16(); + } + ELSE + { + scale_sig32( pOut0_fx, hReverb->fft_filter_ols.block_size, hReverb->fft_filter_ols.prev_shift ); + scale_sig32( pOut1_fx, hReverb->fft_filter_ols.block_size, hReverb->fft_filter_ols.prev_shift ); + + shift = hReverb->fft_filter_ols.prev_shift; + move16(); + } + Word16 r_shift; r_shift = add( find_guarded_bits_fx( hReverb->fft_filter_ols.fft_size ), 1 ); // Applying guard bits for the DoRTFT inside the post_fft_filter function @@ -1922,14 +1926,16 @@ static void reverb_block_fx( FOR( k = 0; k < hReverb->fft_filter_ols.block_size; k++ ) { - pOut0_fx[k] = (Word32) L_shl( pOut0_fx[k], 1 ); + pOut0_fx[k] = (Word32) L_shl( pOut0_fx[k], sub( 1, shift ) ); move32(); - pOut1_fx[k] = (Word32) L_shl( pOut1_fx[k], 1 ); + pOut1_fx[k] = (Word32) L_shl( pOut1_fx[k], sub( 1, shift ) ); move32(); } return; } + + /*-----------------------------------------------------------------------------------------* * Function downmix_input_block() * @@ -1946,6 +1952,7 @@ static ivas_error downmix_input_block_fx( Word16 i, s, nchan_transport; Word32 dmx_gain_fx = hReverb->dmx_gain_fx; move32(); + SWITCH( input_audio_config ) { case IVAS_AUDIO_CONFIG_STEREO: @@ -1991,6 +1998,8 @@ static ivas_error downmix_input_block_fx( return IVAS_ERR_OK; } + + /*-----------------------------------------------------------------------------------------* * Function predelay_block() * @@ -2004,6 +2013,7 @@ static void predelay_block_fx( { UWord16 i, idx, n_samples, blk_size; UWord16 max_blk_size = (UWord16) hReverb->predelay_line.Delay; + IF( LT_32( max_blk_size, 2 ) ) { IF( max_blk_size == 0 ) /* zero-length delay line: just copy the data from input to output */ @@ -2049,6 +2059,8 @@ static void predelay_block_fx( return; } + + /*-----------------------------------------------------------------------------------------* * Function mix_output_block() * @@ -2074,6 +2086,8 @@ static void mix_output_block_fx( return; } + + /*-----------------------------------------------------------------------------------------* * ivas_reverb_process() * @@ -2081,12 +2095,12 @@ static void mix_output_block_fx( *-----------------------------------------------------------------------------------------*/ ivas_error ivas_reverb_process_fx( - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ - const Word16 mix_signals, /* i : add reverb to output signal */ - Word32 *pcm_in_fx[], /* i Q11 : the PCM audio to apply reverb on */ - Word32 *pcm_out_fx[], /* o Q11 : the PCM audio with reverb applied */ - const Word16 i_ts /* i : subframe index */ + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ + const Word16 mix_signals, /* i : add reverb to output signal */ + Word32 *pcm_in_fx[], /* i : the PCM audio to apply reverb on, Q11 */ + Word32 *pcm_out_fx[], /* o : the PCM audio with reverb applied, Q11 */ + const Word16 i_ts /* i : subframe index */ ) { Word32 tmp0_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp1_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp2_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; @@ -2107,22 +2121,16 @@ ivas_error ivas_reverb_process_fx( } ELSE { - MVR2R_WORD32( tmp1_fx, &pcm_out_fx[0][i_mult( i_ts, hReverb->full_block_size )], hReverb->full_block_size ); - MVR2R_WORD32( tmp2_fx, &pcm_out_fx[1][i_mult( i_ts, hReverb->full_block_size )], hReverb->full_block_size ); + Copy32( tmp1_fx, &pcm_out_fx[0][i_mult( i_ts, hReverb->full_block_size )], hReverb->full_block_size ); + Copy32( tmp2_fx, &pcm_out_fx[1][i_mult( i_ts, hReverb->full_block_size )], hReverb->full_block_size ); } return IVAS_ERR_OK; } -/*------------------------------------------------------------------------- - * ivas_binaural_reverb_processSubFrame() - * - * Compute the reverberation - room effect - *------------------------------------------------------------------------*/ - /*------------------------------------------------------------------------- - * ivas_binaural_reverb_processSubFrame_fx() + * ivas_binaural_reverb_processSubFrame() * * Compute the reverberation - room effect *------------------------------------------------------------------------*/ @@ -2154,8 +2162,8 @@ void ivas_binaural_reverb_processSubframe_fx( /* Add the data from the end of the loop to the beginning, with an attenuation factor * according to RT60. This procedure generates an IIR decaying response. The response * is decorrelated later on. */ - v_multc_fixed( hReverb->loopBufReal_fx[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor_fx[bin], hReverb->loopBufReal_fx[bin], numSlots ); - v_multc_fixed( hReverb->loopBufImag_fx[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor_fx[bin], hReverb->loopBufImag_fx[bin], numSlots ); + v_multc_fx( hReverb->loopBufReal_fx[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor_fx[bin], hReverb->loopBufReal_fx[bin], numSlots ); + v_multc_fx( hReverb->loopBufImag_fx[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor_fx[bin], hReverb->loopBufImag_fx[bin], numSlots ); } /* 2) Apply the determined pre-delay to the input audio, and add the delayed audio to the loop. */ @@ -2186,13 +2194,13 @@ void ivas_binaural_reverb_processSubframe_fx( { IF( s_and( ch, 1 ) ) { - v_add_fixed( hReverb->preDelayBufferReal_fx[idx], inReal[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins, 0 ); - v_add_fixed( hReverb->preDelayBufferImag_fx[idx], inImag[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins, 0 ); + v_add_fx_no_hdrm( hReverb->preDelayBufferReal_fx[idx], inReal[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins ); + v_add_fx_no_hdrm( hReverb->preDelayBufferImag_fx[idx], inImag[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins ); } ELSE { - v_sub_fixed( hReverb->preDelayBufferReal_fx[idx], inImag[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins, 0 ); - v_add_fixed( hReverb->preDelayBufferImag_fx[idx], inReal[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins, 0 ); + v_sub_fx_no_hdrm( hReverb->preDelayBufferReal_fx[idx], inImag[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins ); + v_add_fx_no_hdrm( hReverb->preDelayBufferImag_fx[idx], inReal[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins ); } } idx = add( idx, 1 ) % hReverb->preDelayBufferLength; @@ -2222,20 +2230,20 @@ void ivas_binaural_reverb_processSubframe_fx( SWITCH( phaseShiftTypePr[tapIdx] ) { case 0: /* 0 degrees phase */ - v_add_fixed( hReverb->outputBufferReal_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots, 0 ); - v_add_fixed( hReverb->outputBufferImag_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots, 0 ); + v_add_fx_no_hdrm( hReverb->outputBufferReal_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots ); + v_add_fx_no_hdrm( hReverb->outputBufferImag_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots ); BREAK; case 1: /* 90 degrees phase */ - v_sub_fixed( hReverb->outputBufferReal_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots, 0 ); - v_add_fixed( hReverb->outputBufferImag_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots, 0 ); + v_sub_fx_no_hdrm( hReverb->outputBufferReal_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots ); + v_add_fx_no_hdrm( hReverb->outputBufferImag_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots ); BREAK; case 2: /* 180 degrees phase */ - v_sub_fixed( hReverb->outputBufferReal_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots, 0 ); - v_sub_fixed( hReverb->outputBufferImag_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots, 0 ); + v_sub_fx_no_hdrm( hReverb->outputBufferReal_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots ); + v_sub_fx_no_hdrm( hReverb->outputBufferImag_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots ); BREAK; default: /* 270 degrees phase */ - v_add_fixed( hReverb->outputBufferReal_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots, 0 ); - v_sub_fixed( hReverb->outputBufferImag_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots, 0 ); + v_add_fx_no_hdrm( hReverb->outputBufferReal_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots ); + v_sub_fx_no_hdrm( hReverb->outputBufferImag_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots ); BREAK; } } @@ -2250,14 +2258,14 @@ void ivas_binaural_reverb_processSubframe_fx( { Word32 leftRe_fx, rightRe_fx, leftIm_fx, rightIm_fx; - leftRe_fx = L_add( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferReal_fx[bin][0][sample] ), - Mpy_32_32( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferReal_fx[bin][1][sample] ) ); // Q_in - rightRe_fx = L_add( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferReal_fx[bin][1][sample] ), - Mpy_32_32( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferReal_fx[bin][0][sample] ) ); // Q_in - leftIm_fx = L_add( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferImag_fx[bin][0][sample] ), - Mpy_32_32( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ) ); // Q_in - rightIm_fx = L_add( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ), - Mpy_32_32( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][0][sample] ) ); // Q_in + leftRe_fx = Madd_32_32( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferReal_fx[bin][0][sample] ), + hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferReal_fx[bin][1][sample] ); // Q_in + rightRe_fx = Madd_32_32( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferReal_fx[bin][1][sample] ), + hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferReal_fx[bin][0][sample] ); // Q_in + leftIm_fx = Madd_32_32( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferImag_fx[bin][0][sample] ), + hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ); // Q_in + rightIm_fx = Madd_32_32( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ), + hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][0][sample] ); // Q_in hReverb->outputBufferReal_fx[bin][0][sample] = leftRe_fx; // Q_in move32(); @@ -2301,17 +2309,19 @@ void ivas_binaural_reverb_processSubframe_fx( return; } + /*------------------------------------------------------------------------- * ivas_binaural_reverb_open() * * Allocate and initialize binaural room reverberator handle *------------------------------------------------------------------------*/ + static ivas_error ivas_binaural_reverb_open_fx( REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ const Word16 numBins, /* i : Q0 number of CLDFB bins */ const Word16 numCldfbSlotsPerFrame, /* i : Q0 number of CLDFB slots per frame */ const Word32 sampling_rate, /* i : Q0 sampling rate */ - const Word32 *revTimes_fx, /* i : Q31 reverberation times T60 for each CLDFB bin in seconds */ + const Word32 *revTimes_fx, /* i : Q26 reverberation times T60 for each CLDFB bin in seconds */ const Word32 *revEnes_fx, /* i : Q31 spectrum for reverberated sound at each CLDFB bin */ const Word16 preDelay /* i : Q0 reverb pre-delay in CLDFB slots */ ) @@ -2338,7 +2348,7 @@ static ivas_error ivas_binaural_reverb_open_fx( hReverb->blockSize = numCldfbSlotsPerFrame; move16(); - FOR( k = 0; k < REVERB_PREDELAY_MAX + 1; k++ ) + FOR( k = 0; k < IVAS_REVERB_PREDELAY_MAX + 1; k++ ) { set32_fx( hReverb->preDelayBufferReal_fx[k], 0, hReverb->numBins ); set32_fx( hReverb->preDelayBufferImag_fx[k], 0, hReverb->numBins ); @@ -2371,9 +2381,9 @@ static ivas_error ivas_binaural_reverb_open_fx( * but not excessively long loops to generate reverberation. */ /* Note: the resulted length is very sensitive to the precision of the constants below (e.g. 1.45 vs. 1.45f) */ // hReverb->loopBufLength[bin] = (int16_t) ( 1.45 * (int16_t) ( revTimes[bin] * 150.0 ) + 1 ); - Word32 L_tmp_BufLength = L_shl( L_shr( Mpy_32_32( revTimes_fx[bin], 1258291200 /*150.0 in Q23*/ ), 23 ), 23 ); - L_tmp_BufLength = L_add( Mpy_32_32( 1556925645 /*1.45 in Q30*/, L_tmp_BufLength ), ONE_IN_Q22 ); - hReverb->loopBufLength[bin] = (Word16) L_shr( L_tmp_BufLength, 22 ); /*Q0*/ + Word32 L_tmp_BufLength = L_shl( L_shr( Mpy_32_32( revTimes_fx[bin], 1258291200 /*150.0 in Q23*/ ), 18 ), 18 ); + L_tmp_BufLength = L_add( Mpy_32_32( 1556925645 /*1.45 in Q30*/, L_tmp_BufLength ), ONE_IN_Q17 ); + hReverb->loopBufLength[bin] = (Word16) L_shr( L_tmp_BufLength, 17 ); /*Q0*/ move16(); hReverb->loopBufLength[bin] = s_min( hReverb->loopBufLength[bin], hReverb->loopBufLengthMax[bin] ); @@ -2417,107 +2427,105 @@ static ivas_error ivas_binaural_reverb_open_fx( ivas_binaural_reverb_setReverbTimes_fx( hReverb, sampling_rate, revTimes_fx, revEnes_fx ); - /*free(revTimes_fx); - free(revEnes_fx);*/ - ivas_binaural_reverb_setPreDelay_fx( hReverb, preDelay ); return IVAS_ERR_OK; } + /*------------------------------------------------------------------------- - * ivas_binaural_reverb_open_fastconv() + * ivas_binaural_reverb_init() * - * Allocate and initialize binaural room reverberator handle for FastConv + * Initialize binaural room reverberator handle for FastConv renderer *------------------------------------------------------------------------*/ -ivas_error ivas_binaural_reverb_open_fastconv_fx( - REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ - const Word16 numBins, /* i : number of CLDFB bins */ - const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ - IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ - const AUDIO_CONFIG internal_config, /* i : internal audio config for FastConv */ - const Word32 sampling_rate, /* i : sampling rate */ - const HRTFS_FASTCONV_HANDLE hHrtfFastConv /* i : FastConv HRTF handle */ + +ivas_error ivas_binaural_reverb_init_fx( + REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ + const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ + const Word16 numBins, /* i : number of CLDFB bins */ + const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ + const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ + const Word32 sampling_rate, /* i : sampling rate */ + const Word32 *defaultTimes, /* i : default reverberation times */ + const Word32 *defaultEne, /* i : default reverberation energies */ + Word32 *earlyEne /* i/o: Early part energies to be modified */ ) { ivas_error error; - const Word32 *revTimes; - const Word32 *revEne; - Word32 t60[CLDFB_NO_CHANNELS_MAX]; - Word32 ene[CLDFB_NO_CHANNELS_MAX]; - Word16 preDelay; + Word16 preDelay, bin; + Word32 revTimes[CLDFB_NO_CHANNELS_MAX]; + Word32 revEne[CLDFB_NO_CHANNELS_MAX]; + Word32 temp32; - error = IVAS_ERR_OK; - - IF( ( roomAcoustics != NULL ) && roomAcoustics->override ) - { - /* THIS PART IS YET TO BE CONVERTED AS REVERB_UTILS.C IS NOT INVOKED IN GPROF */ - float t60_flt[CLDFB_NO_CHANNELS_MAX]; - float ene_flt[CLDFB_NO_CHANNELS_MAX]; - revTimes = t60; - revEne = ene; - if ( NE_32( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, - hHrtfFastConv, - internal_config, - false, - sampling_rate, t60_flt, ene_flt ) ), - IVAS_ERR_OK ) ) + IF( roomAcoustics != NULL ) + { + IF( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, revTimes, revEne ) ) != IVAS_ERR_OK ) { return error; } - preDelay = (Word16) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); - floatToFixed_arrL( t60_flt, t60, Q31, CLDFB_NO_CHANNELS_MAX ); - floatToFixed_arrL( ene_flt, ene, Q31, CLDFB_NO_CHANNELS_MAX ); + + /* Convert preDelay from seconds to CLDFB slots as needed by binaural reverb */ + temp32 = Mult_32_16( roomAcoustics->acousticPreDelay_fx, ( CLDFB_SLOTS_PER_SECOND >> 1 ) ); // Q11 + preDelay = extract_l( L_shr( L_add( temp32, L_shl( 1, 10 ) ), 11 ) ); // Q0 } ELSE { - revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q31*/ - revEne = hHrtfFastConv->fastconvReverberationEneCorrections_fx; /*Q31*/ + FOR( bin = 0; bin < numBins; bin++ ) + { + revTimes[bin] = defaultTimes[bin]; + move32(); + revEne[bin] = defaultEne[bin]; + move32(); + } preDelay = 10; - move16(); } - error = ivas_binaural_reverb_open_fx( hReverbPr, numBins, numCldfbSlotsPerFrame, sampling_rate, revTimes, revEne, preDelay ); - - return error; -} + FOR( bin = 0; bin < numBins; bin++ ) + { + /* Adjust the room effect parameters when the reverberation time is less than a threshold value, to avoid + spectral artefacts with the synthetic reverberator. */ + IF( LT_32( revTimes[bin], REV_TIME_THRESHOLD ) ) + { + Word32 adjustedEarlyEne; /* Q28 to match earlyEne */ + Word32 adjustedLateEne; /* Q31 to match revEne */ + Word32 adjustedRevTime; /* Q26 to match revTime */ + Word32 energyModifier; /* Q30 as range is [0,1] */ + Word16 scale; + + /* Adjust reverberation times, higher towards a threshold */ + /* Float code equivalent is: + * revTimeModifier = fmaxf( 0.0f, 1.0f - ( revTimes[bin] / REV_TIME_THRESHOLD ) ); + * adjustedRevTime = ( 1.0f - revTimeModifier ) * revTimes[bin]; + * adjustedRevTime += revTimeModifier * ( revTimes[bin] + REV_TIME_THRESHOLD ) * 0.5f; */ + adjustedRevTime = L_shl( revTimes[bin], 5 ); /* Store revTimes[bin] in Q31 for multiplication as it is under REV_TIME_THRESHOLD, i.e., smaller than 1 */ + /* Do revTimes[bin]^2 in Q31, result in Q31, multiply with constant in Q29, shift result from Q29 to Q26 for addition and result. */ + adjustedRevTime = L_add( L_shr( Mpy_32_32( Mpy_32_32( adjustedRevTime, adjustedRevTime ), Q29_0_5_PER_REV_TIME_THRESHOLD ), 3 ), Q26_REV_TIME_THRESHOLD_TIMES_0_5 ); + + energyModifier = L_sub( adjustedRevTime, revTimes[bin] ); /* Q26 */ + IF( GT_32( energyModifier, 0 ) ) /* Very close to threshold, numeric accuracy is not sufficient and energyModifier would be negative. Correct way is to not adjust here. */ + { + energyModifier = BASOP_Util_Divide3232_Scale_newton( energyModifier, adjustedRevTime, &scale ); /* Inputs in Q26 */ + energyModifier = L_shl_sat( energyModifier, sub( scale, 1 ) ); /* Store in Q30 as range is [0,1] */ -/*------------------------------------------------------------------------- - * ivas_binaural_reverb_open_parambin() - * - * Allocate and initialize binaural room reverberator handle for ParamBin - *------------------------------------------------------------------------*/ -ivas_error ivas_binaural_reverb_open_parambin( - REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ - const Word16 numBins, /* i : number of CLDFB bins Q0 */ - const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame Q0 */ - IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ - const Word32 sampling_rate, /* i : sampling rate Q0 */ - const HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : Parametric binauralizer HRTF handle */ -) -{ - ivas_error error; - const Word32 *revTimes; - const Word32 *revEne; - Word32 t60[CLDFB_NO_CHANNELS_MAX]; - Word32 ene[CLDFB_NO_CHANNELS_MAX]; - Word16 preDelay; + /* Adjust early and late energies, by moving late energy to early energy */ + IF( earlyEne != NULL ) + { + adjustedEarlyEne = L_shr( Mpy_32_32( revEne[bin], energyModifier ), 2 ); /* Q31 * Q30 mult, shift from Q30 to Q28 */ + adjustedEarlyEne = L_add( adjustedEarlyEne, earlyEne[bin] ); /* Q28 */ + earlyEne[bin] = adjustedEarlyEne; /* Store already here */ + move32(); + } - error = IVAS_ERR_OK; + adjustedLateEne = L_sub( ONE_IN_Q30, energyModifier ); /* Q30 */ + adjustedLateEne = L_shl_sat( Mpy_32_32( adjustedLateEne, revEne[bin] ), 1 ); /* Q30 * Q31 mult, shift back to Q31 */ - IF( ( roomAcoustics != NULL ) && roomAcoustics->override ) - { - revTimes = t60; - revEne = ene; - preDelay = (Word16) L_shr_r( Mpy_32_32( 1677721600 /*800 in Q21*/, roomAcoustics->acousticPreDelay_fx /*Q27*/ ), Q17 ); /*Q0*/ - move16(); - } - ELSE - { - revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q31*/ - revEne = hHrtfParambin->parametricReverberationEneCorrections_fx; /*Q31*/ - preDelay = 10; - move16(); + /* Store adjusted room effect parameters to be used in reverb processing */ + revTimes[bin] = adjustedRevTime; + move32(); + revEne[bin] = adjustedLateEne; + move32(); + } + } } error = ivas_binaural_reverb_open_fx( hReverbPr, numBins, numCldfbSlotsPerFrame, sampling_rate, revTimes, revEne, preDelay ); @@ -2525,8 +2533,9 @@ ivas_error ivas_binaural_reverb_open_parambin( return error; } + /*------------------------------------------------------------------------- - * ivas_binaural_reverb_close() + * ivas_binaural_reverb_close_fx() * * Close binaural room reverberator handle *------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_reverb_iir_filter_fx.c b/lib_rend/ivas_reverb_iir_filter_fx.c index e09ec70055ccf358879a06134430ec4765136b78..981a40466474a3b428557c4682243db0234cb885 100644 --- a/lib_rend/ivas_reverb_iir_filter_fx.c +++ b/lib_rend/ivas_reverb_iir_filter_fx.c @@ -116,6 +116,8 @@ void ivas_reverb_iir_filt_set( return; } + + /*-----------------------------------------------------------------------------------------* * Function ivas_reverb_iir_filt_2taps_feed_blk() * @@ -126,7 +128,7 @@ void ivas_reverb_iir_filt_2taps_feed_blk_fx( ivas_rev_iir_filter_t *iirFilter, /* i/o: IIR filter */ const UWord16 blk_size, /* i : size */ const Word32 *input, /* i : input buffer Q30 */ - Word32 *output /* i/o : output buffer Q30 */ + Word32 *output /* i/o: output buffer Q30 */ ) { UWord16 i; diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index b3e1e72fa1f947d9930e486943970c422f2097a3..6433da8195e7deba7874d9b3b325bf6cc9b350f2 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -37,35 +37,19 @@ #include "ivas_rom_rend.h" #include #include "wmc_auto.h" -#include "options_warnings.h" + /*-----------------------------------------------------------------------------------------* * Local constants *-----------------------------------------------------------------------------------------*/ -#define DEFAULT_SRC_DIST ( 1.5f ) /* default source distance [m] for reverb dmx factor computing */ -#define MAX_SAMPLING_RATE ( 48000 ) -#define CLDFB_CONVOLVER_NTAPS_MAX ( 16 ) -#define FFT_SPECTRUM_SIZE ( 1 + ( RV_FILTER_MAX_FFT_SIZE / 2 ) ) - -#define N_INITIAL_IGNORED_FRAMES 4 +#define FFT_SPECTRUM_SIZE ( 1 + ( RV_FILTER_MAX_FFT_SIZE / 2 ) ) /*-----------------------------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------------------------*/ -typedef struct cldfb_convolver_state -{ - const float *filter_taps_left_re[CLDFB_NO_CHANNELS_MAX]; - const float *filter_taps_left_im[CLDFB_NO_CHANNELS_MAX]; - const float *filter_taps_right_re[CLDFB_NO_CHANNELS_MAX]; - const float *filter_taps_right_im[CLDFB_NO_CHANNELS_MAX]; - float filter_states_re[BINAURAL_CONVBANDS][CLDFB_CONVOLVER_NTAPS_MAX]; - float filter_states_im[BINAURAL_CONVBANDS][CLDFB_CONVOLVER_NTAPS_MAX]; -} cldfb_convolver_state; - -static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCONV_HANDLE hHrtfFastConv, const AUDIO_CONFIG input_audio_config, const int16_t use_brir, const int32_t sampling_rate, float *avg_pwr_left, float *avg_pwr_right ); - +static void ivas_reverb_set_energies( const Word32 *avg_pwr_l, const Word32 *avg_pwr_r, const Word32 sampling_rate, Word32 *avg_pwr_l_out, Word32 *avg_pwr_r_out ); /*-----------------------------------------------------------------------------------------* * Function ivas_reverb_prepare_cldfb_params() @@ -74,187 +58,79 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCO *-----------------------------------------------------------------------------------------*/ ivas_error ivas_reverb_prepare_cldfb_params( - IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, - const HRTFS_FASTCONV_HANDLE hHrtfFastConv, - const AUDIO_CONFIG input_audio_config, - const int16_t use_brir, - const int32_t output_Fs, - float *pOutput_t60, - float *pOutput_ene ) + const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, + const HRTFS_STATISTICS_HANDLE hHrtfStatistics, + const Word32 output_Fs, + Word32 *pOutput_t60, + Word32 *pOutput_ene ) { - int16_t idx; - float fc[CLDFB_NO_CHANNELS_MAX]; - float avg_pwr_left[CLDFB_NO_CHANNELS_MAX]; - float avg_pwr_right[CLDFB_NO_CHANNELS_MAX]; - float delay_diff, ln_1e6_inverted, exp_argument; - const float dist = DEFAULT_SRC_DIST; - const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; - ivas_error error; - - for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) - { - fc[idx] = ( (float) idx + 0.5f ) * ( (float) MAX_SAMPLING_RATE / (float) ( 2 * CLDFB_NO_CHANNELS_MAX ) ); - } - Word32 *fc_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 * ) ); - Word32 *pOutput_t60_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 * ) ); - Word16 *pOutput_t60_e = (Word16 *) malloc( pInput_params->nBands * sizeof( Word16 * ) ); - Word32 *pOutput_ene_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 * ) ); - Word16 *pOutput_ene_e = (Word16 *) malloc( pInput_params->nBands * sizeof( Word16 * ) ); - Word32 delay_diff_fx; - - for ( int i = 0; i < pInput_params->nBands; i++ ) - { - fc_fx[i] = (Word32) fc[i] * ONE_IN_Q16; - } - - ivas_reverb_interpolate_acoustic_data_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_rt60_fx, pInput_params->pAcoustic_dsr_fx, - CLDFB_NO_CHANNELS_MAX, fc_fx, pOutput_t60_fx, pOutput_ene_fx, pOutput_t60_e, pOutput_ene_e ); + Word16 idx; - /* adjust DSR for the delay difference */ - delay_diff_fx = L_sub( pInput_params->inputPreDelay_fx, pInput_params->acousticPreDelay_fx ); + Word32 output_fc_fx[CLDFB_NO_CHANNELS_MAX]; + Word32 output_t60_fx[CLDFB_NO_CHANNELS_MAX]; + Word32 output_ene_fx[CLDFB_NO_CHANNELS_MAX]; - delay_diff = (float) delay_diff_fx / ONE_IN_Q27; - for ( int i = 0; i < pInput_params->nBands; i++ ) - { - pOutput_t60[i] = (float) fabs( me2f( pOutput_t60_fx[i], pOutput_t60_e[i] ) ); - pOutput_ene[i] = (float) fabs( me2f( pOutput_ene_fx[i], pOutput_ene_e[i] ) ); - } - free( fc_fx ); - free( pOutput_t60_fx ); - free( pOutput_t60_e ); - free( pOutput_ene_fx ); - free( pOutput_ene_e ); - ln_1e6_inverted = 1.0f / logf( 1e06f ); - for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) - { - exp_argument = delay_diff / ( pOutput_t60[idx] * ln_1e6_inverted ); - /* Limit exponent to approx +/-100 dB in case of incoherent value of delay_diff, to prevent overflow */ - exp_argument = min( exp_argument, 23.0f ); - exp_argument = max( exp_argument, -23.0f ); - pOutput_ene[idx] *= expf( exp_argument ); - } + Word32 delay_diff_fx, ln_1e6_inverted_fx, L_tmp; + const Word32 dmx_gain_2_fx = 1852986624; // Q16 + const Word32 cldfb_band_width = 26214400; // 400 in Q16 + Word16 pow_exp, tmp_exp; + Word32 tmp, exp_argument_fx; - if ( ( error = ivas_reverb_get_fastconv_hrtf_set_energies( hHrtfFastConv, input_audio_config, use_brir, output_Fs, avg_pwr_left, avg_pwr_right ) ) != IVAS_ERR_OK ) - { - return error; - } + Word32 avg_pwr_left_fx[CLDFB_NO_CHANNELS_MAX]; + Word32 avg_pwr_right_fx[CLDFB_NO_CHANNELS_MAX]; - for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) + FOR( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { - pOutput_ene[idx] *= 0.5f * ( avg_pwr_left[idx] + avg_pwr_right[idx] ) * dmx_gain_2; + output_fc_fx[idx] = L_add( L_shr( cldfb_band_width, 1 ), L_shl( Mult_32_16( cldfb_band_width, idx ), 15 ) ); } - return IVAS_ERR_OK; -} - - -/*-----------------------------------------------------------------------------------------* - * Function ivas_cldfb_convolver() - * - * Function for convolving CLDFB-domain data with filter taps - *-----------------------------------------------------------------------------------------*/ - - -/*-----------------------------------------------------------------------------------------* - * Function get_IR_from_filter_taps() - * - * Function converts CLDFB filter taps into time-domain data - *-----------------------------------------------------------------------------------------*/ + ivas_reverb_interp_on_freq_grid_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_rt60_fx, CLDFB_NO_CHANNELS_MAX, output_fc_fx, output_t60_fx ); // Q26 + ivas_reverb_interp_on_freq_grid_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX, output_fc_fx, output_ene_fx ); // Q30 + /* adjust DSR for the delay difference */ + delay_diff_fx = L_sub( pInput_params->inputPreDelay_fx, pInput_params->acousticPreDelay_fx ); // Q27 -/*-----------------------------------------------------------------------------------------* - * Function ivas_reverb_get_cldfb_hrtf_set_properties() - * - * Function analyses the HRTF set and computes avarage left/right power spectrum - * and frequency-dependent IA coherence. - * Uses fastconv renderer filter taps to compute energies - *-----------------------------------------------------------------------------------------*/ + ln_1e6_inverted_fx = 155440049; // Q31 /* 1.0f / logf( 1e06f ) */ -static ivas_error ivas_reverb_get_cldfb_hrtf_set_properties( - AUDIO_CONFIG input_audio_config, - const HRTFS_FASTCONV_HANDLE hHrtfFastConv, - const int16_t use_brir, - const int32_t sampling_rate, - float *avg_pwr_left, - float *avg_pwr_right ) -{ - float current_HRTF_data_L[L_FRAME48k]; - float current_HRTF_data_R[L_FRAME48k]; - int16_t freq_idx, hrtf_idx, hrtf_count; - float hrtf_count_inverted; - int16_t fft_size, log2_fft_size, half_fft_size, freq_count; - ivas_error error; - UNUSED_PARAM( error ); - fft_size = RV_FILTER_MAX_FFT_SIZE; - Word16 IR_length; - IR_length = CLDFB_NO_CHANNELS_MAX * ( ( fft_size + CLDFB_NO_CHANNELS_MAX - 1 ) / CLDFB_NO_CHANNELS_MAX ); - log2_fft_size = int_log2( fft_size ); - half_fft_size = fft_size >> 1; - freq_count = 1 + half_fft_size; - - /* chosing between ambisonics, 5.1 and 7.1 MC audio */ - if ( ( input_audio_config == IVAS_AUDIO_CONFIG_FOA ) || ( input_audio_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( input_audio_config == IVAS_AUDIO_CONFIG_HOA3 ) ) - { - hrtf_count = 1; - } - else if ( input_audio_config == IVAS_AUDIO_CONFIG_7_1 ) + FOR( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { - hrtf_count = 7; - } - else - { - hrtf_count = 5; - input_audio_config = IVAS_AUDIO_CONFIG_5_1; - } + L_tmp = Mpy_32_32( output_t60_fx[idx], ln_1e6_inverted_fx ); // Q26 - /* Zeroing before accumalation for average value computing */ - for ( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) - { - avg_pwr_left[freq_idx] = 0.0f; - avg_pwr_right[freq_idx] = 0.0f; - } + exp_argument_fx = BASOP_Util_Divide3232_Scale_newton( delay_diff_fx, L_tmp, &tmp_exp ); + exp_argument_fx = L_shr_sat( exp_argument_fx, sub( 6, tmp_exp ) ); // Q26 - /* Get power spectra and cross - correlation between left and right hrtfs - Loop over all the HRTFs available */ - for ( hrtf_idx = 0; hrtf_idx < hrtf_count; hrtf_idx++ ) - { - UNUSED_PARAM( hHrtfFastConv ); - UNUSED_PARAM( use_brir ); - UNUSED_PARAM( sampling_rate ); - UNUSED_PARAM( IR_length ); + /* Limit exponent to approx +/-100 dB in case of incoherent value of delay_diff, to prevent overflow */ + IF( GT_32( exp_argument_fx, 1543503872 ) ) // 23 in Q26 + { + exp_argument_fx = 1543503872; + } + IF( LT_32( exp_argument_fx, -1543503872 ) ) //-23 in Q26 + { + exp_argument_fx = -1543503872; + } - /* Perform forward FFT on both L/R channels */ - fft_rel( current_HRTF_data_L, (int16_t) fft_size, (int16_t) log2_fft_size ); - fft_rel( current_HRTF_data_R, (int16_t) fft_size, (int16_t) log2_fft_size ); + tmp = Mpy_32_32( 96817114, exp_argument_fx ); // Q21 - /* Process the DC bin (without img part) */ - avg_pwr_left[0] += current_HRTF_data_L[0] * current_HRTF_data_L[0]; - avg_pwr_right[0] += current_HRTF_data_R[0] * current_HRTF_data_R[0]; + L_tmp = BASOP_util_Pow2( tmp, 10, &pow_exp ); + L_tmp = Mpy_32_32( L_tmp, output_ene_fx[idx] ); + L_tmp = L_shl_sat( L_tmp, add( 1, pow_exp ) ); // Q31 - /* Process the Nyquist frequency bin (without img part) */ - avg_pwr_left[half_fft_size] += current_HRTF_data_L[half_fft_size] * current_HRTF_data_L[half_fft_size]; - avg_pwr_right[half_fft_size] += current_HRTF_data_R[half_fft_size] * current_HRTF_data_R[half_fft_size]; + pOutput_ene[idx] = L_tmp; // Q31 + move32(); - /* Process the other frequency bins containing both real and img parts */ - for ( freq_idx = 1; freq_idx < half_fft_size; freq_idx++ ) - { - float L_re, L_im, R_re, R_im; - L_re = current_HRTF_data_L[freq_idx]; - R_re = current_HRTF_data_R[freq_idx]; - L_im = current_HRTF_data_L[fft_size - freq_idx]; - R_im = current_HRTF_data_R[fft_size - freq_idx]; - - avg_pwr_left[freq_idx] += L_re * L_re + L_im * L_im; - avg_pwr_right[freq_idx] += R_re * R_re + R_im * R_im; - } + pOutput_t60[idx] = output_t60_fx[idx]; // Q26 } - /* Compute the averages and the IA coherence */ - hrtf_count_inverted = 1.0f / (float) hrtf_count; - for ( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) + ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left_fx, avg_pwr_right_fx ); // Q28 + + FOR( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { - avg_pwr_left[freq_idx] *= hrtf_count_inverted; - avg_pwr_right[freq_idx] *= hrtf_count_inverted; + Word32 tmp_ene; + + tmp_ene = L_shr( L_add( avg_pwr_left_fx[idx], avg_pwr_right_fx[idx] ), 1 ); // Q28 + tmp_ene = Mpy_32_32( tmp_ene, dmx_gain_2_fx ); // Q13 + pOutput_ene[idx] = Mpy_32_32( pOutput_ene[idx], tmp_ene ); // Q13 + pOutput_ene[idx] = L_shl_sat( pOutput_ene[idx], 18 ); // Q31 } return IVAS_ERR_OK; @@ -262,73 +138,49 @@ static ivas_error ivas_reverb_get_cldfb_hrtf_set_properties( /*-----------------------------------------------------------------------------------------* - * Function ivas_reverb_get_fastconv_hrtf_set_energies() + * Function ivas_reverb_set_energies() * - * Function analyses the HRTF set and computes avarage left/right power spectrum. - * Uses fastconv renderer filter taps to compute energies. Output interpolated - * to CLDFB bin center frequencies + * Function gets the precalculated left/right energies and computes average + * left/right energies to CLDFB bin center frequencies. *-----------------------------------------------------------------------------------------*/ -static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( - const HRTFS_FASTCONV_HANDLE hHrtfFastConv, - const AUDIO_CONFIG input_audio_config, - const int16_t use_brir, - const int32_t sampling_rate, - float *avg_pwr_left, - float *avg_pwr_right ) +static void ivas_reverb_set_energies( + const Word32 *avg_pwr_l, + const Word32 *avg_pwr_r, + const Word32 sampling_rate, + Word32 *avg_pwr_left, + Word32 *avg_pwr_right ) { - int16_t freq_idx; - float avg_pwr_left_fft[FFT_SPECTRUM_SIZE]; - float avg_pwr_right_fft[FFT_SPECTRUM_SIZE]; - float input_fc[FFT_SPECTRUM_SIZE]; - ivas_error error; + Word16 freq_idx; + Word32 input_fc_fx[FFT_SPECTRUM_SIZE]; + Word32 output_fc_fx[IVAS_CLDFB_NO_CHANNELS_MAX]; + Word32 avg_pwr_left_fx[IVAS_CLDFB_NO_CHANNELS_MAX]; // Q28 + Word32 avg_pwr_right_fx[IVAS_CLDFB_NO_CHANNELS_MAX]; // Q28 + const Word32 cldfb_band_width = 26214400; // 400 in Q16 + Word16 s; + Word16 temp; - for ( freq_idx = 0; freq_idx < FFT_SPECTRUM_SIZE; freq_idx++ ) - { - input_fc[freq_idx] = freq_idx * ( 0.5f * sampling_rate / (float) ( FFT_SPECTRUM_SIZE - 1 ) ); - } + const Word16 avg_pwr_len = sampling_rate == 16000 ? LR_IAC_LENGTH_NR_FC_16KHZ : LR_IAC_LENGTH_NR_FC; + temp = BASOP_Util_Divide3216_Scale( sampling_rate, sub( avg_pwr_len, 1 ), &s ); - - if ( ( error = ivas_reverb_get_cldfb_hrtf_set_properties( input_audio_config, hHrtfFastConv, use_brir, sampling_rate, avg_pwr_left_fft, avg_pwr_right_fft ) ) != IVAS_ERR_OK ) + FOR( freq_idx = 0; freq_idx < avg_pwr_len; freq_idx++ ) { - return error; + input_fc_fx[freq_idx] = L_shl( L_mult( temp, freq_idx ), add( 15, s ) ); } - Word32 *input_fc_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); - Word32 *avg_pwr_left_fft_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); - Word32 *avg_pwr_right_fft_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); - - Word32 *output_fc_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); - Word32 *avg_pwr_left_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); - Word16 *avg_pwr_left_e = (Word16 *) malloc( 257 * sizeof( Word16 * ) ); - Word32 *avg_pwr_right_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); - Word16 *avg_pwr_right_e = (Word16 *) malloc( 257 * sizeof( Word16 * ) ); - for ( int i = 0; i < 60; i++ ) + FOR( freq_idx = 0; freq_idx < IVAS_CLDFB_NO_CHANNELS_MAX; freq_idx++ ) { - input_fc_fx[i] = (Word32) input_fc[i] * ( 1 << 16 ); - avg_pwr_left_fft_fx[i] = (Word32) ( avg_pwr_left_fft[i] ) * ONE_IN_Q26; - avg_pwr_right_fft_fx[i] = (Word32) avg_pwr_right_fft[i] * ONE_IN_Q30; + output_fc_fx[freq_idx] = L_add( L_shr( cldfb_band_width, 1 ), L_shl( Mult_32_16( cldfb_band_width, freq_idx ), 15 ) ); } - for ( int i = 0; i < 257; i++ ) - { - output_fc_fx[i] = (Word32) input_fc[i] * ONE_IN_Q16; - } + // Avg Energy Left + ivas_reverb_interp_on_freq_grid_fx( avg_pwr_len, input_fc_fx, avg_pwr_l, IVAS_CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left_fx ); + // Avg Energy Right + ivas_reverb_interp_on_freq_grid_fx( avg_pwr_len, input_fc_fx, avg_pwr_r, IVAS_CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_right_fx ); - ivas_reverb_interpolate_acoustic_data_fx( FFT_SPECTRUM_SIZE, input_fc_fx, avg_pwr_left_fft_fx, avg_pwr_right_fft_fx, - CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left_fx, avg_pwr_right_fx, avg_pwr_left_e, avg_pwr_right_e ); - for ( int i = 0; i < 257; i++ ) + FOR( freq_idx = 0; freq_idx < IVAS_CLDFB_NO_CHANNELS_MAX; freq_idx++ ) { - avg_pwr_left[i] = (float) fabs( me2f( avg_pwr_left_fx[i], avg_pwr_left_e[i] ) ); - avg_pwr_right[i] = (float) fabs( me2f( avg_pwr_right_fx[i], avg_pwr_right_e[i] ) ); + avg_pwr_left[freq_idx] = avg_pwr_left_fx[freq_idx]; + avg_pwr_right[freq_idx] = avg_pwr_right_fx[freq_idx]; } - free( input_fc_fx ); - free( avg_pwr_left_fft_fx ); - free( avg_pwr_right_fft_fx ); - free( output_fc_fx ); - free( avg_pwr_left_fx ); - free( avg_pwr_left_e ); - free( avg_pwr_right_fx ); - free( avg_pwr_right_e ); - return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_rom_TdBinauralRenderer.h b/lib_rend/ivas_rom_TdBinauralRenderer.h index 89d86f112bf712e86e7cf0f64b309464d8c148bc..ed4ece7b68432695c1a93c241c62a93bc2733b81 100644 --- a/lib_rend/ivas_rom_TdBinauralRenderer.h +++ b/lib_rend/ivas_rom_TdBinauralRenderer.h @@ -30,6 +30,9 @@ *******************************************************************************************************/ +#ifndef _IVAS_ROM_TDBINAURALRENDERER_ +#define _IVAS_ROM_TDBINAURALRENDERER_ + #include #include "options.h" #include "cnst.h" @@ -40,32 +43,57 @@ *------------------------------------------------------------------------*/ /* TD renderer default HRIR model */ -extern const Word32 defaultHRIR_rom_latency_s_fx; /* Q31 */ -extern const Word16 defaultHRIR_rom_azimDim2[15]; /* Q0 */ -extern const Word16 defaultHRIR_rom_azimDim3[15]; /* Q0 */ -extern const Word16 defaultHRIR_rom_azim_start_idx[15]; /* Q0 */ -extern const Word16 defaultHRIR_rom_azimSegSamples[1]; /* Q0 */ -extern const Word16 defaultHRIR_rom_azimShapeIdx[15]; /* Q0 */ -extern const Word16 defaultHRIR_rom_azimShapeSampFactor[15]; /* Q0 */ -extern const Word32 defaultHRIR_rom_elevKSeq_fx[13]; /* Q22 */ +extern const Word16 defaultHRIR_rom_latency_s_Q_fx; +extern const Word32 defaultHRIR_rom_latency_s_fx; +extern const Word16 defaultHRIR_rom_model_configuration[6]; +extern const Word16 defaultHRIR_rom_azimDim3[15]; +extern const Word16 defaultHRIR_rom_azim_start_idx[15]; +extern const Word16 defaultHRIR_rom_azimSegSamples[1]; +extern const Word16 defaultHRIR_rom_azimShapeIdx[15]; +extern const Word16 defaultHRIR_rom_azimShapeSampFactor[15]; +extern const Word16 defaultHRIR_rom_elevKSeq_Q_fx; +extern const Word16 defaultHRIR_rom_elevKSeq_fx[13]; +extern const Word16 defaultHRIR_rom_Alpha48_Q_fx; +extern const Word16 defaultHRIR_rom_AlphaL48_fx[470 * 128]; /*Q30*/ +extern const Word16 defaultHRIR_rom_AlphaR48_fx[470 * 128]; /*Q30*/ +extern const Word16 defaultHRIR_rom_Alpha32_Q_fx; +extern const Word16 defaultHRIR_rom_AlphaL32_fx[470 * 86]; /*Q30*/ +extern const Word16 defaultHRIR_rom_AlphaR32_fx[470 * 86]; /*Q30*/ +extern const Word16 defaultHRIR_rom_Alpha16_Q_fx; +extern const Word16 defaultHRIR_rom_AlphaL16_fx[470 * 43]; /*Q30*/ +extern const Word16 defaultHRIR_rom_AlphaR16_fx[470 * 43]; /*Q30*/ +extern const Word16 defaultHRIR_rom_E48_Q_fx; +extern const Word32 defaultHRIR_rom_EL48_fx[HRTF_MODEL_N_SECTIONS * 470]; /*Q28*/ +extern const Word32 defaultHRIR_rom_ER48_fx[HRTF_MODEL_N_SECTIONS * 470]; /*Q28*/ +extern const Word16 defaultHRIR_rom_E32_Q_fx; +extern const Word32 defaultHRIR_rom_EL32_fx[HRTF_MODEL_N_SECTIONS * 470]; /*Q28*/ +extern const Word32 defaultHRIR_rom_ER32_fx[HRTF_MODEL_N_SECTIONS * 470]; /*Q28*/ +extern const Word16 defaultHRIR_rom_E16_Q_fx; +extern const Word32 defaultHRIR_rom_EL16_fx[HRTF_MODEL_N_SECTIONS * 470]; /*Q28*/ +extern const Word32 defaultHRIR_rom_ER16_fx[HRTF_MODEL_N_SECTIONS * 470]; /*Q28*/ +extern const Word16 defaultHRIR_rom_elevBsShape_Q_fx; +extern const Word16 defaultHRIR_rom_elevBsShape_fx[36]; /*Q30*/ +extern const Word16 defaultHRIR_rom_elevBsLen[4]; +extern const Word16 defaultHRIR_rom_elevBsStart[4]; +extern const Word16 defaultHRIR_rom_elevBsShape_Q_fx; +extern const Word16 defaultHRIR_rom_elevBsShape_fx[36]; /*Q30*/ +extern const Word16 defaultHRIR_rom_azimBsShape_Q_fx; +extern const Word16 defaultHRIR_rom_azimBsShape_fx[21]; /*Q30*/ -extern const UWord32 defaultHRIR_rom_AlphaL48_fx[470 * 128]; /*Q30*/ -extern const UWord32 defaultHRIR_rom_AlphaR48_fx[470 * 128]; /*Q30*/ -extern const UWord32 defaultHRIR_rom_AlphaL32_fx[470 * 86]; /*Q30*/ -extern const UWord32 defaultHRIR_rom_AlphaR32_fx[470 * 86]; /*Q30*/ -extern const UWord32 defaultHRIR_rom_AlphaL16_fx[470 * 43]; /*Q30*/ -extern const UWord32 defaultHRIR_rom_AlphaR16_fx[470 * 43]; /*Q30*/ -extern const UWord32 defaultHRIR_rom_EL48_fx[HRTF_MODEL_N_SECTIONS * 470]; /*Q28*/ -extern const UWord32 defaultHRIR_rom_ER48_fx[HRTF_MODEL_N_SECTIONS * 470]; /*Q28*/ -extern const UWord32 defaultHRIR_rom_EL32_fx[HRTF_MODEL_N_SECTIONS * 470]; /*Q28*/ -extern const UWord32 defaultHRIR_rom_ER32_fx[HRTF_MODEL_N_SECTIONS * 470]; /*Q28*/ -extern const UWord32 defaultHRIR_rom_EL16_fx[HRTF_MODEL_N_SECTIONS * 470]; /*Q28*/ -extern const UWord32 defaultHRIR_rom_ER16_fx[HRTF_MODEL_N_SECTIONS * 470]; /*Q28*/ +extern const Word16 defaultHRIR_rom_ITD_W_Q_fx; +extern const Word16 defaultHRIR_rom_ITD_W_fx[658]; +extern const Word16 defaultHRIR_rom_ITD_azimBsShape_Q_fx; +extern const Word16 defaultHRIR_rom_ITD_azimBsShape_fx[84]; +extern const Word16 defaultHRIR_rom_ITD_azimKSeq_Q_fx; +extern const Word16 defaultHRIR_rom_ITD_azimKSeq_fx[19]; +extern const Word16 defaultHRIR_rom_ITD_elevBsShape_Q_fx; +extern const Word16 defaultHRIR_rom_ITD_elevBsShape_fx[28]; +extern const Word16 defaultHRIR_rom_ITD_elevKSeq_Q_fx; +extern const Word16 defaultHRIR_rom_ITD_elevKSeq_fx[16]; +extern const Word16 defaultHRIR_rom_ITD_model_configuration[4]; +extern const Word16 defaultHRIR_rom_ITD_elevBsLen[4]; +extern const Word16 defaultHRIR_rom_ITD_elevBsStart[4]; +extern const Word16 defaultHRIR_rom_ITD_azimBsLen[4]; +extern const Word16 defaultHRIR_rom_ITD_azimBsStart[4]; -extern const Word32 defaultHRIR_rom_elevBsShape_fx[36]; /*Q30*/ -extern const Word32 defaultHRIR_rom_azimBsShape_fx[21]; /*Q30*/ -extern const UWord32 defaultHRIR_rom_ITD_W_fx[658]; /*Q25*/ -extern const Word32 defaultHRIR_rom_ITD_elevKSeq_fx[16]; /*Q22*/ -extern const Word32 defaultHRIR_rom_ITD_elevBsShape_fx[28]; /*Q30*/ -extern const Word32 defaultHRIR_rom_ITD_azimKSeq_fx[19]; /*Q22*/ -extern const Word32 defaultHRIR_rom_ITD_azimBsShape_fx[84]; /*Q30*/ +#endif diff --git a/lib_rend/ivas_rom_TdBinauralRenderer_fx.c b/lib_rend/ivas_rom_TdBinauralRenderer_fx.c index cee2a9753ba9544860c85e301953e7bf59fcd8db..531c45f83ff655c5775f70eada06f56194777f4d 100644 --- a/lib_rend/ivas_rom_TdBinauralRenderer_fx.c +++ b/lib_rend/ivas_rom_TdBinauralRenderer_fx.c @@ -40,10116 +40,10173 @@ #define WMC_TOOL_SKIP +#ifdef DEBUGGING +/* Generated on 31-Jul-2024 with Matlab version 9.9.0.2037887 (R2020b) Update 8 by tmu on MACI64 */ +#endif + + /*------------------------------------------------------------------------- * TD Binaural rendering related ROM tables *------------------------------------------------------------------------*/ /* TD renderer default HRIR model */ -const Word32 defaultHRIR_rom_latency_s_fx = 44741; /* Q31 */ -const Word16 defaultHRIR_rom_azimDim2[15] = { -1, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 1, - }; -const Word16 defaultHRIR_rom_azimDim3[15] = { +#ifdef DEBUGGING +/* Generated on 09-Sep-2025 with Matlab version 23.2.0.2668659 (R2023b) Update 9 by marcemerit on MACA64 */ +#endif + + +const Word16 defaultHRIR_rom_latency_s_Q_fx = 31; +const Word32 defaultHRIR_rom_latency_s_fx = 44741; +const Word16 defaultHRIR_rom_model_configuration[6] = { +1, /* UseItdModel */ +15, /* elevDim3 */ +470, /* AlphaN */ +1, /* num_unique_azim_splines */ +4, /* elevSegSamples */ +128, /* K_48k */ +}; +const Word16 defaultHRIR_rom_elevBsLen[4] = { +5, 9, 13, 9, +}; +const Word16 defaultHRIR_rom_elevBsStart[4] = { +0, 5, 14, 27, +}; +const Word16 defaultHRIR_rom_azimDim3[15] = { 1, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 1, - }; -const Word16 defaultHRIR_rom_azim_start_idx[15] = { +}; +const Word16 defaultHRIR_rom_azim_start_idx[15] = { 0, 1, 37, 73, 109, 145, 181, 217, 253, 289, 325, 361, 397, 433, 469, - }; -const Word16 defaultHRIR_rom_azimSegSamples[1] = { +}; +const Word16 defaultHRIR_rom_azimSegSamples[1] = { 10, - }; -const Word16 defaultHRIR_rom_azimShapeIdx[15] = { +}; +const Word16 defaultHRIR_rom_azimShapeIdx[15] = { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, - }; -const Word16 defaultHRIR_rom_azimShapeSampFactor[15] = { +}; +const Word16 defaultHRIR_rom_azimShapeSampFactor[15] = { -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, - }; - -const Word32 defaultHRIR_rom_elevKSeq_fx[13]/*Q22*/ = { --377487360, -314572800, -251658240, -188743680, -125829120, -62914560, 0, 62914560, 125829120, 188743680, 251658240, 314572800, 377487360 }; -const Word32 defaultHRIR_rom_elevBsShape_fx[36]/*Q30*/ = { -1073741824,452984832,134217728,16777216,0,0,532676608,637534208,490733568,268435456,113246208,33554432,4194304,0,0,85284184,279620256,490733568,626349376,619358912,503316480,336942432,178956976,75497472,22369622,2796202,0,0,2796202,22369622,75497472,178956976,338340512,514501280,657107648,715827904 +const Word16 defaultHRIR_rom_elevKSeq_Q_fx = 8; +const Word16 defaultHRIR_rom_elevKSeq_fx [13] = { +-23040, -19200, -15360, -11520, -7680, -3840, 0, 3840, 7680, 11520, 15360, 19200, 23040, }; -const Word32 defaultHRIR_rom_azimBsShape_fx[21]/*Q30*/ = { -715827904,705627328,677173184,633686656,578388928,514501280,445244928,373841120,303511008,237475904,178956976,130459632,91625968,61382240,38654704,22369622,11453246,4831838,1431655,178956,0 - }; - -const UWord32 defaultHRIR_rom_AlphaL48_fx[470 * 128] /*Q30*/= { -0x08946b90,0x01b51044,0x0a3be7e0,0x08059140,0x08956970,0x08977810,0x0902edf0,0x092d8070,0x09514fc0,0x09037030,0x08d22420,0x089c8890,0x086fde70,0x084b4aa0,0x0835ecf0,0x08249b70,0x08116dd0,0x08085020,0x07e77410,0x0773bf10,0x095b7f10,0x01583d2c,0xfee45aca,0xfbd573d8,0x02d72514, -0xff01b3a9,0xfc39200c,0xfc096278,0xfc3dc844,0xfd17e024,0xfc2228c0,0xfbd986e0,0xfc0bded8,0xff02a7ec,0x03e2cc90,0xfc372258,0xfe92ec80,0xfe04a288,0x08e19d20,0x0a0943f0,0x09fe5830,0x0a947bb0,0x0bc07e70,0x0c4e2300,0x0c63c590,0x0ba72080,0x0af61460,0x0a475af0,0x09bd4da0,0x09633a90, -0x0933ee10,0x0906f870,0x08c19050,0x08b9f000,0x08125690,0x0850f510,0x06f136a8,0xfecea9ee,0x041a5f78,0x0324e7d4,0x0320b0d8,0x02092f50,0x03aa0f60,0x0410f470,0x037ff800,0x01f8011c,0x03dc8dbc,0x05a77198,0x03c94958,0x04436480,0x0298d478,0x0237f498,0x068949c8,0x0242ea64,0x07d952a0, -0x0bc0ce10,0x0af51ad0,0x0c4fe4f0,0x0e9011e0,0x0f9b6ef0,0x0fead610,0x0e81c550,0x0d28b5b0,0x0c0f8f00,0x0b0412a0,0x0a497200,0x09dcd440,0x097ea8e0,0x08fd84f0,0x08f109b0,0x07943bb8,0x082c0b40,0x04a0e558,0x012e894e,0x0194b69e,0x01c456cc,0x01e917c4,0x00335c69,0x01f3984c,0x00231440, -0x033aa9a4,0xff7bfc4b,0x02c45048,0x0018472a,0x01678198,0x019671c0,0x01f7255e,0x0127b1ee,0x03fe3df0,0x00f2d39b,0x076a9240,0x0c463f20,0x0bff3570,0x0e2d9980,0x11ec3260,0x13b00d80,0x13ea7640,0x115b7da0,0x0f0a50a0,0x0d191820,0x0b770370,0x0a667dd0,0x09fa3600,0x096cc8d0,0x08c2d510, -0x08a2b6d0,0x07337980,0x06f2c640,0x03c058b0,0xffde1337,0x025052d4,0xffab3160,0x00cee703,0x00c07aaa,0x00a76d4d,0x0024fb1d,0x00153dfb,0x01085b52,0x0039fecd,0x011c03a8,0x015e7096,0x018cbf10,0x0101a0aa,0x01a361ba,0x03b8e424,0x027a2360,0x0bb7e9f0,0x10b37e20,0x108bc1c0,0x120a9fe0, -0x1380e3c0,0x14a9f8a0,0x15700da0,0x15fb32a0,0x1534eec0,0x12087ea0,0x11f01060,0x10b22c80,0x0ec06bd0,0x0e1a7220,0x0cd29110,0x0bd71ed0,0x09003290,0x08a0aa70,0x049ce3e0,0xffd0204e,0x0253e3c8,0x009803e4,0x00abe363,0xffee6f01,0x00446d53,0x0044b542,0x00a877b4,0x00feb38d,0x008cda38, -0x01119fce,0x009ed653,0x022c9e80,0x00f7d604,0x028b8cd8,0x028ca24c,0x00af1521,0x085fe240,0x131ca2a0,0x125352e0,0x1524cac0,0x15eea660,0x167a9380,0x15ee4020,0x154e59a0,0x13f58880,0x11c53960,0x11526880,0x11159c20,0x11404760,0x0ffab710,0x0e6d64d0,0x0d9166d0,0x0a346f10,0x09e064b0, -0x04d14758,0x00d78178,0x01923ea6,0x00ee1a29,0x01fe1452,0x01763f46,0x008059e0,0x00b5024a,0x007553d5,0x0056ff43,0x007311a7,0x00737e12,0x01b04bca,0x011abb0a,0x03bfe704,0x02a67180,0x051c26f0,0x00f211c4,0x0b770940,0x18d6e840,0x1902d140,0x1c8db540,0x19769cc0,0x17f3d460,0x1669cde0, -0x142074e0,0x13de3e00,0x16240ce0,0x17a20620,0x17aae800,0x1667c700,0x13665540,0x1020e260,0x0d78f260,0x0a1b0900,0x0a4cd990,0x048af5c0,0x0235c8ac,0x02f6ec08,0x00bba57d,0x01303cdc,0x011f69ec,0x0092a8a4,0x007b26f6,0x00b5e6bf,0x01173c5a,0x00f1f25d,0x009d3070,0x009fb5cb,0xfedf9bb6, -0x037b95f8,0xff3b0da5,0x0560ec28,0x01eb9f56,0x0f331a20,0x1a9f83c0,0x189837e0,0x1825dfe0,0x1646a240,0x15ea4b60,0x159ed820,0x15d68e20,0x15c66dc0,0x14fa2c00,0x14b897a0,0x13c58560,0x11f1b780,0x10602480,0x0e268370,0x0bf04910,0x096eae30,0x09833c80,0x054f9fd0,0xffa84895,0x022e24c8, -0x01c6514a,0x01791232,0x013b7744,0x008d359a,0x015592bc,0x00351d23,0x01e6ce3a,0x013d1738,0x00abcfc6,0x0281b798,0x00faa108,0x0434bd00,0x0115c04c,0x05890da0,0x03a74e24,0x107e8300,0x17e2adc0,0x15fc8220,0x15d474a0,0x137da700,0x12cefbc0,0x139df000,0x1298cbc0,0x135b8ba0,0x14ff5c20, -0x137ddf20,0x11cee600,0x0ffe7720,0x0cfa9ec0,0x0a8b0220,0x094d67c0,0x08698430,0x0985a4a0,0x068c82c8,0x00ad00b2,0x03c59b54,0x0126c60c,0x011c57b0,0x01b6a31c,0x017121c0,0x00d7b628,0x017d830a,0xffbc0bd5,0x013191b8,0x01420536,0x0206d550,0x022b0974,0x01d8dffc,0x01dd2cc4,0x07038a58, -0xfe2ce4ca,0x0b86ba20,0x1132ed60,0x0e73a6c0,0x0ef214f0,0x0f1a15a0,0x0f87d1b0,0x0fd13bb0,0x0ed18060,0x0da3fe70,0x0d034f00,0x0d1f7f90,0x0d2b48e0,0x0cb57cf0,0x0c2203e0,0x0afae720,0x09f084e0,0x090a2920,0x0a546dc0,0x053abae0,0x00a94def,0x04378cd0,0x00f82adc,0x02075c5c,0x01e3ac92, -0x01271768,0x00ebc881,0x0065d20c,0x034aa6f8,0x0180a24e,0x01796fc4,0x026a3ce4,0x01c6f980,0x02f6eda0,0x02f9b12c,0x05b79388,0x040690a0,0x089ba980,0x0ca6f1a0,0x0b89dec0,0x0d4bc220,0x0d80e4c0,0x0e2ae150,0x0e9a8870,0x0e4ca0d0,0x0e1bb610,0x0dbf1bb0,0x0c787110,0x0b2c2240,0x0993fcc0, -0x0926f660,0x08578350,0x07fae140,0x072cd620,0x09034bf0,0x062e11f0,0x0196d54e,0x02254604,0x021e71c0,0x025e5f60,0x00085956,0x023db8b0,0xffd8b3a5,0x040a9df0,0xfecd207c,0x02f06a5c,0xfff01789,0x0163fee8,0x01f5fb5e,0x01fad2f6,0x014021be,0x04d85d78,0xfccb9c64,0x08e0b770,0x0a1fbb10, -0x09d45cc0,0x0a8e3d00,0x0ac5a0d0,0x0b443700,0x0bc4bf20,0x0b287610,0x0a979700,0x0a1ab520,0x09728aa0,0x08dcd070,0x07e52a98,0x07f79a88,0x07db4db8,0x08002210,0x07a8f1c0,0x082457b0,0x0723dd38,0xfe767a60,0x04cfb048,0x03ed0d5c,0x03fcfea0,0x02b49400,0x04db9ee0,0x05742028,0x04813318, -0x02a0ef70,0x0507adb0,0x06de3210,0x04648ed8,0x050089e0,0x032d1c8c,0x02ce98f8,0x07018828,0x021fd1c0,0x0c114600,0x096fda30,0x0a0795b0,0x0a220240,0x0a45bb90,0x0a63cc70,0x0aa360f0,0x0a48a4c0,0x0a0f7330,0x09cb8460,0x099d3030,0x09725c60,0x09342810,0x0950f220,0x094bc550,0x094f6910, -0x09482980,0x08edaa30,0x0b5c5880,0x018d9b3c,0xfe8485dc,0xfabe30f0,0x037817a4,0xfea6dc00,0xfb16e458,0xfad06e18,0xfb236ce8,0xfc3abd04,0xfb03c990,0xfacf8b20,0xfb2941a8,0xfea30fb0,0x0482fda0,0xfb39a4b0,0xfe413b62,0x0aff1bf0,0x17a7dac0,0x10bfe4a0,0x18efece0,0x1622da60,0x177e13c0, -0x17a5bac0,0x18a7c400,0x1908c3e0,0x1963dea0,0x18963540,0x18172340,0x1791eb60,0x1724cf00,0x16c37600,0x16784b20,0x163c4240,0x1602f2c0,0x15d2f980,0x159569c0,0x14824260,0x17057c40,0x0f5924e0,0x09b28ef0,0xfe9e5720,0x11733020,0x0a146630,0xff92565e,0xffa02c9b,0xffdf126c,0x0143992e, -0x005ee753,0x0054f3ee,0x00cf1d3d,0x0a847f30,0x135ff400,0x0014e039,0x0a0848a0,0x086be5f0,0x1a5ca300,0x1a8672a0,0x1c11dc20,0x1d601320,0x20669b80,0x219b6180,0x21cd0500,0x1fb48e40,0x1df1efa0,0x1c570840,0x1b054da0,0x19fd2ca0,0x194479c0,0x1894dde0,0x17e2c3a0,0x17783800,0x1652f0e0, -0x1597c9a0,0x14d1d4e0,0x07066c30,0x0f3cb530,0x0eddf350,0x0d14c0d0,0x0b695e70,0x0ed060c0,0x0f40a6f0,0x0f967b60,0x0ce97980,0x100fb860,0x1182c620,0x0ec4d120,0x105d5cc0,0x0d9504e0,0x0e19e630,0x14f48d00,0x10468980,0x187e1ce0,0x1d938ca0,0x1f1a9980,0x2244d980,0x284b8180,0x2a8acb00, -0x2b4b7b80,0x27760a80,0x24037d40,0x21461c80,0x1eba1940,0x1cc79880,0x1b472b20,0x19efd960,0x188cf900,0x17c6c060,0x150fdfa0,0x146654a0,0x0f322990,0x0a5710c0,0x0914bd50,0x0997a720,0x0940d1e0,0x05b4e140,0x08fb2220,0x04e92bc0,0x0ad57c30,0x053bf0e8,0x09bd1f70,0x0646b330,0x090db410, -0x099f3960,0x0ae0a330,0x0ae39260,0x10c80880,0x0cda63d0,0x18e297c0,0x1efc6600,0x2227b900,0x27d1b780,0x31c6ad00,0x35b0d2c0,0x35e39340,0x2ebcefc0,0x28bf7480,0x24120e80,0x20426640,0x1d2eb660,0x1b5b75c0,0x197049c0,0x17864b60,0x166f3920,0x13361120,0x10ed2d80,0x0c025580,0x045c6c98, -0x06fdc7d0,0x01eded1e,0x0380db50,0x02d0e9b0,0x02486b94,0x01988354,0x00cc10e4,0x036486a4,0x01fa2aac,0x042922f8,0x05409b78,0x06c109e0,0x07950d78,0x0856df60,0x0e9127d0,0x143204a0,0x2106bc80,0x28fc15c0,0x2d87dc00,0x326ba300,0x3626a000,0x39741b40,0x3c8ed040,0x3e03d140,0x3b9dd580, -0x32511840,0x319c3e40,0x2ea41e40,0x2ad5f380,0x2800b880,0x248b69c0,0x21620c00,0x1b200020,0x176d48a0,0x0ffff7b0,0x06350618,0x082122b0,0x0562e190,0x03daa080,0x021433b8,0x01d013d0,0x01e80ab0,0x0290fb6c,0x03ec6fa4,0x0368c8f4,0x051ca0e8,0x0555e5e8,0x08f08280,0x08f41620,0x0c4b5070, -0x106eb860,0x106621a0,0x1f682ea0,0x317c0240,0x3539a9c0,0x3b79a800,0x3e8b4040,0x40901900,0x4068ab00,0x402b2500,0x3cf7f500,0x36ecb280,0x359f3240,0x339c24c0,0x31d71300,0x2cefe940,0x27f57400,0x244c0200,0x1d3a9f60,0x1a5e3cc0,0x118b28e0,0x09ffbad0,0x08ee18c0,0x06fc4e38,0x070deaa0, -0x05808c10,0x03460084,0x033a127c,0x02e2e5c0,0x02904020,0x03a7faa0,0x03970e20,0x075d4588,0x07525378,0x0e52c850,0x0e1e9fc0,0x15098460,0x130a3f40,0x29259200,0x3d381700,0x4083f980,0x43ba3c00,0x3ff338c0,0x3d6b56c0,0x3cb0ac40,0x3a31b040,0x3b12f680,0x3ef90580,0x3ecfdb80,0x3c044900, -0x3746bd00,0x300cf2c0,0x2932d100,0x23f60900,0x1c834c80,0x19e0b200,0x10ab6060,0x0ccb6a10,0x0b6976c0,0x07f4c5a0,0x0718ef38,0x05dab248,0x04597728,0x035d91f8,0x0405c138,0x05de4d18,0x04404bc0,0x0457be50,0x051ef350,0x041e3670,0x0e19ee30,0x0a9208f0,0x156426e0,0x17de4c20,0x2f746e00, -0x3b573500,0x3b901840,0x3654b700,0x38522480,0x3b4fb440,0x3ec0e200,0x3eda5000,0x3dfc67c0,0x3a610f40,0x39318d00,0x3627a800,0x30f655c0,0x2c90f380,0x26aeb0c0,0x1fbfdd20,0x1a247d40,0x17e5e6c0,0x12ca56c0,0x0825b1f0,0x0bc35e00,0x0a68af50,0x07f4d4e8,0x06ef3180,0x04acfd78,0x0547b238, -0x03c0d7f0,0x0a3c5410,0x066cf258,0x04fb7748,0x094d7600,0x067e9418,0x0f5c01b0,0x0b231300,0x148b7040,0x1a6dba60,0x2e9b5640,0x38935d40,0x39a60000,0x385ba200,0x36f5cc80,0x367ea5c0,0x398dbe40,0x36b74e80,0x377a01c0,0x393fdc80,0x354b2340,0x309e7d40,0x2bcac480,0x2431fcc0,0x1e80cd80, -0x1ab117c0,0x1a78f600,0x1b2d33c0,0x1787ea20,0x0aa05bd0,0x0f77ba30,0x08aaaab0,0x07d67298,0x09468530,0x0739b318,0x05190048,0x06f041e8,0x03b66fb0,0x0747b090,0x0816a330,0x0b08a430,0x0c033460,0x0befba10,0x0d344260,0x1ced7060,0x0fea3e40,0x26501480,0x2e15d100,0x2c1aa6c0,0x2c59ad40, -0x2eaba540,0x2fdf0040,0x30928200,0x2f40b240,0x2ced7540,0x2af4e540,0x2949a340,0x27625300,0x24b32680,0x21f56040,0x1ed261e0,0x1c263380,0x1be56700,0x1df922c0,0x149dfe60,0x0c6bad40,0x11b83ee0,0x0bb8a500,0x0c20b020,0x09769870,0x06bedb60,0x067c7de8,0x04f171b8,0x0c559240,0x0851fd30, -0x08b86bf0,0x0b895ab0,0x0af689a0,0x0f6d3310,0x100b2340,0x18ee0ee0,0x15f23fc0,0x1f1079a0,0x2575fc40,0x256b1840,0x28db2f80,0x2a18d340,0x2b9221c0,0x2cdb6a00,0x2b9893c0,0x2a905380,0x2941f100,0x261f3040,0x22f81700,0x1f11d020,0x1ddc1e20,0x1bf17e60,0x1a5867e0,0x18b96220,0x1b1cfe60, -0x16b17540,0x0e52aa10,0x0d6d3e20,0x0cb42800,0x0c8898c0,0x06a2b168,0x0c062680,0x055132e8,0x0f89e3e0,0x0541c690,0x0c4e16f0,0x06b32260,0x097fde10,0x0c142600,0x0d7ee3a0,0x0dbdffb0,0x159e6d00,0x06163630,0x1f391760,0x1f9830c0,0x2012bb80,0x2151d640,0x22187f00,0x2331f040,0x2499e180, -0x23233c40,0x21f3b780,0x20d8cc40,0x1f595020,0x1dfa89a0,0x1bdf8d60,0x1b95a4c0,0x1b0519e0,0x1ad463a0,0x1a3bdc20,0x1a288940,0x19991e60,0x06dde208,0x14436a00,0x144081a0,0x12ab6060,0x105773a0,0x15740ae0,0x16811320,0x1650c360,0x11bc48a0,0x16dec3a0,0x186e8e20,0x1367b840,0x1579b660, -0x11872c80,0x122a6900,0x1a682e60,0x1555df00,0x224e9640,0x1da82360,0x1f30a0e0,0x1f488200,0x1fb41420,0x1ff80d80,0x208aba00,0x1fb7b640,0x1f314280,0x1e939c00,0x1e291220,0x1dc435c0,0x1d40cac0,0x1d680140,0x1d59d760,0x1d4240c0,0x1d3aff80,0x1c247420,0x207376c0,0x13c63460,0x0bd0aa30, -0xfc5c28cc,0x176c5060,0x0c815090,0xfdd0cf70,0xfd93ba90,0xfdf2adb0,0x0034eee0,0xfe6cc8ce,0xfe84e79a,0xff53ca4d,0x0ca99e70,0x19ab31a0,0xfe207adc,0x0baadf30,0x220b2240,0x0d5be8d0,0x15c5f6c0,0x093efa30,0x0cbd7680,0x0c9c3520,0x0d3db900,0x0d329080,0x0d36bdb0,0x0d360110,0x0d1f1370, -0x0d108c00,0x0d0ce850,0x0cf11a30,0x0cc67820,0x0c74ee50,0x0c381d80,0x0c04ac50,0x0bd15a60,0x0bb8f900,0x0bec61e0,0x093435a0,0x14f3cba0,0x1805db60,0x1843eb20,0x127bf860,0x178f7f00,0x17b74560,0x183d7360,0x180405a0,0x170c47c0,0x18b15dc0,0x194ada00,0x192e6060,0x17ffff60,0x119ee200, -0x190fcde0,0x19af4e40,0x1bd7da00,0x0f162070,0x0db3b5c0,0x0f96a4e0,0x106dd640,0x10aae580,0x10b48f60,0x1089d240,0x10259100,0x0ffc3b80,0x101107a0,0x0fd369a0,0x0f32ca30,0x0e35f140,0x0d638870,0x0ce02580,0x0c46ddf0,0x0c59a030,0x0b0e64c0,0x0cdb36e0,0x15f29400,0x0e9e24b0,0x0fed26b0, -0x0edbf3c0,0x0f9b5e00,0x0dc7e2d0,0x0cfd7850,0x0e4f15a0,0x10734680,0x0dc946a0,0x0b6ed830,0x0e987fa0,0x0ef4cd20,0x11e95360,0x132f1100,0x0eab2ec0,0x15a3c340,0x10ebf780,0x0cb6b860,0x11b47d60,0x1380a900,0x14221220,0x140b43a0,0x13c5e4e0,0x137d26c0,0x134d07a0,0x13178360,0x128b24e0, -0x11998b20,0x0fcc4920,0x0e557150,0x0d323930,0x0bf9c1e0,0x0be9d750,0x095e2f20,0x0c946e50,0x0f9a8680,0x0d077a10,0x0c9b60e0,0x0b0ea830,0x0bc972b0,0x09c8e320,0x0b29cfe0,0x08104990,0x0cd5b5e0,0x089974c0,0x0ca3abf0,0x0c3a9a50,0x0d93b030,0x0e7cd830,0x1135fbc0,0x10764140,0x15fef300, -0x13018100,0x0e2e4df0,0x13870bc0,0x1697bd00,0x17cc0a60,0x17c14ee0,0x16b62e00,0x15b06fc0,0x152cd240,0x1539d980,0x14a426c0,0x12c5e560,0x0fc54f60,0x0d8e9000,0x0be8a960,0x0a3826f0,0x098331b0,0x0799c440,0x0981f3d0,0x0ac80910,0x069309c8,0x06eff490,0x04ac2068,0x03656f00,0x029afc70, -0x02d16684,0x02938480,0x0296dbc4,0x03a12798,0x0400e1a8,0x05db3c98,0x08401be0,0x0b935ab0,0x0bc23b20,0x0d7a5b40,0x1a2d45e0,0x0dc721e0,0x0d1f9ce0,0x158d7120,0x1a726fa0,0x1a2c8460,0x1baf9700,0x1dbb7940,0x203dff40,0x209df640,0x1f810fc0,0x1d11ef00,0x1bed2580,0x1cb602a0,0x1878ccc0, -0x1618aea0,0x142682e0,0x13424840,0x0e8e85b0,0x0e40d170,0x0edcf1a0,0x092cc970,0x0884db30,0x0618fca0,0x0542b540,0x0395307c,0x03914c84,0x0382b4cc,0x048330d8,0x04abde90,0x05acf668,0x0829ab10,0x085e38f0,0x0d08cbf0,0x0dde8a50,0x1460e7c0,0x21d60140,0x1bf19f00,0x10a337c0,0x195d19c0, -0x1c4196e0,0x1f47fc20,0x221d8940,0x23f8e640,0x285a4a80,0x28c5b700,0x27545dc0,0x255b8fc0,0x20cb6640,0x1a58ad00,0x15d69680,0x12a0c860,0x0fa9b9e0,0x111ce180,0x0ea84d30,0x111c2ce0,0x1299c720,0x0d84edd0,0x0b3547c0,0x0680a688,0x04e346e8,0x04a04ae0,0x03d4431c,0x046ebe28,0x052e84e0, -0x05e34c50,0x070abe50,0x096793a0,0x0c9c2a00,0x0dfa00b0,0x13fca560,0x166e2f80,0x25027c40,0x1ef33680,0x0c76ed50,0x109e4540,0x0bcdd8c0,0x14ce7400,0x18f9bd40,0x1d77a5c0,0x249d8900,0x267ac780,0x20503b80,0x160f6860,0x0e8e60c0,0x0a3d2660,0x09e5f390,0x0b243000,0x0d538170,0x0dc9fcf0, -0x09f8a640,0x0f987d20,0x10e40780,0x0d315420,0x0f21d190,0x0a91f8e0,0x08c73510,0x086c74c0,0x073f4ee8,0x074d7378,0x0a4d1d90,0x06d92398,0x080b7bc0,0x0a0ee880,0x106d38e0,0x105ef640,0x1b94ac00,0x163f48c0,0x264988c0,0x170fe8a0,0x04803f28,0x0e2b9670,0x0fd428a0,0x18a4e640,0x1ee22820, -0x25f17940,0x2388f380,0x1f81ed80,0x19ec1a20,0x16c8e500,0x1404c620,0x11c8b5a0,0x10bd03e0,0x0f824a20,0x0c70f2c0,0x0c7e88e0,0x09f1bd00,0x10066060,0x14c810a0,0x109b1ce0,0x0f87a160,0x0c54a590,0x0a7e3f30,0x08b6aff0,0x06385418,0x08467230,0x10c5e2a0,0x09b28ea0,0x088d6930,0x08d66fe0, -0x0c756380,0x0dc54300,0x15247d40,0x16618880,0x228016c0,0x133dbac0,0x0de85f60,0x189818a0,0x1a30ad20,0x22eb1ec0,0x26190740,0x2659a900,0x23da5500,0x1f153b00,0x183c7900,0x156bcc00,0x13158ee0,0x11b800a0,0x10a22bc0,0x10a3bc00,0x0f5e2f70,0x12e0de40,0x11828cc0,0x156b69e0,0x174bed40, -0x12a28ea0,0x10bee1a0,0x0f110320,0x0de05400,0x0b361250,0x093323a0,0x0a05bc60,0x0ccd5c70,0x0c102490,0x0d24d4b0,0x0ea03ad0,0x0fe2ef60,0x119b84a0,0x15dfd1e0,0x15edfec0,0x2b24e900,0x1bdb1cc0,0x1820fc40,0x207bbd00,0x220f8100,0x26366480,0x26e98900,0x25873280,0x25f57100,0x25ad6100, -0x23b0d740,0x1e036e60,0x18ccdea0,0x150963e0,0x11f7d360,0x1116c640,0x114c0520,0x1594d680,0x14e0b4a0,0x182145e0,0x1a735d80,0x14f9d5e0,0x16191a20,0x118fb940,0x0df5e0b0,0x0bf3ac70,0x0bdc32d0,0x0c046100,0x0dd4c4d0,0x0e08dc70,0x0e7eb530,0x0ebe66d0,0x11cde5a0,0x146851c0,0x1714b660, -0x1a7fb9a0,0x1ede5ac0,0x1f347ac0,0x1d2b4f00,0x214ba500,0x22191440,0x21f35fc0,0x214b0bc0,0x21511500,0x1f571720,0x1d459a60,0x1b7c2200,0x1b32a120,0x1ae70480,0x1a5b63c0,0x1a26bf40,0x1a244980,0x190ab460,0x18743680,0x15739700,0x17694640,0x19d2dde0,0x16e67940,0x15368340,0x1397c8c0, -0x12af1020,0x12134320,0x1155e140,0x10bf3720,0x133c3520,0x101267e0,0x124e4340,0x10f8ef00,0x1445b460,0x16d89160,0x1ab37960,0x1b7808a0,0x237de500,0x1daac9e0,0x1b731160,0x1cd38460,0x1cbfcf00,0x1d751b20,0x1deb16a0,0x1eac5f80,0x1ea88e00,0x1f0867c0,0x1f201920,0x1f474680,0x1f4f4360, -0x1fbad780,0x1e6fc260,0x1d44ecc0,0x1c10a0c0,0x1b954f00,0x19e5d020,0x1a99f0a0,0x1ccd7340,0x1932b860,0x1ac612e0,0x19712040,0x19537b40,0x17f217c0,0x17758900,0x19d183e0,0x1ad93140,0x196b95e0,0x16fae320,0x18a542c0,0x19c2f660,0x1be81ec0,0x1d84bfa0,0x1bd7b6a0,0x21d2b180,0x16dfbc20, -0x19221180,0x192f7620,0x191cd9e0,0x195ac620,0x19722aa0,0x19954c40,0x199c8b60,0x19a6f6a0,0x19b90640,0x19b88180,0x19b453a0,0x19ddf200,0x196c3220,0x193e10e0,0x18e40c80,0x18a91400,0x18456b20,0x164899e0,0x21212e40,0x22d45640,0x1e340da0,0x1efd0720,0x2274e3c0,0x1eba6680,0x1f5103a0, -0x1ec50800,0x1e187c00,0x1f6df600,0x1ff1a1e0,0x1fa6f220,0x22e31740,0x1f0f41a0,0x1f528bc0,0x23ef52c0,0x1ae6ca60,0xfa6ff298,0xff1495c8,0xf79aa180,0xfaebdfb8,0xf98fbd48,0xf9cae1c0,0xf8f546c0,0xf8a723b0,0xf80f5b20,0xf90b5e08,0xf98f63d0,0xfa1e0348,0xfa598648,0xfa857210,0xfa89ae58, -0xfa7663c0,0xfa78d818,0xfa869080,0xfab4a1d8,0xfbe15d60,0xf9194ef8,0x003fc415,0x0719cdf8,0x166cd440,0xfd3751f4,0x0608f400,0x149ea300,0x145d7ca0,0x13ffa8a0,0x12aa0da0,0x13370be0,0x134e7180,0x12dcf3a0,0x05ba9878,0xfb35fe80,0x15198b40,0x07106958,0x0bf00d20,0xf80775d8,0xf8dcde60, -0xf781dab0,0xf6f8eca0,0xf460ea70,0xf3671590,0xf29b2520,0xf56d3850,0xf75f75b0,0xf9161828,0xf9fc7538,0xfa64b118,0xfa368800,0xf9e26c80,0xf9e55f00,0xfa03e968,0xfaea1228,0xfbcebc28,0xfbbe8db0,0x0af78830,0x0119dae4,0x002416b0,0x0266ad70,0x03c2bf5c,0xff025385,0xfec27930,0xfdef3628, -0x00fe0a99,0xfd63d8bc,0xfc629440,0x004d7653,0xff15b5be,0x0319ff7c,0x0285d0a8,0xfbda7fb8,0x0109d756,0xfbc3e160,0xf77f0f60,0xf71afdc0,0xf55b5010,0xef80b4c0,0xed967be0,0xeb7193a0,0xf1180a00,0xf54a3430,0xf8219608,0xf9bb32e8,0xfa449a30,0xf9f88f60,0xf95840e0,0xf94f4238,0xf97f6538, -0xfbc67df8,0xfc76e580,0x00cbe932,0x043866b0,0x05282e50,0x0386b7bc,0x02dcc030,0x05a93cd8,0x01b3640e,0x061e3488,0x0018258c,0x05772578,0x00decd69,0x0447caf0,0x0251f6dc,0x036478f8,0x03542938,0x03973e14,0xfed8c9f4,0x055dc140,0xfd6d4a40,0xf8db20e0,0xf6621250,0xf22c7580,0xe8174b80, -0xe462f960,0xe2559b80,0xecdc3ec0,0xf473c5e0,0xf9907d50,0xfbe0dd48,0xfcfe52c4,0xfbae9938,0xfa4cf8e0,0xfa158458,0xfa2ecf90,0xfcb9cde0,0xff178829,0x025ed934,0x07279378,0x040b74c8,0x066a5a40,0x03a3dfa8,0x02f54a24,0x02a89d14,0x02a5a0f0,0x0359f000,0x01b76f3c,0x0275b82c,0x0173dfd2, -0x0233fad4,0x032e32dc,0x03aaf10c,0x04345498,0x003928ae,0xfd11d630,0xf11a87a0,0xeef71d60,0xed07d340,0xeb1f81e0,0xe8a4f020,0xe677a2e0,0xe29be520,0xe22ba480,0xe58754a0,0xf3edb490,0xeffea060,0xeffae920,0xf1d02580,0xf0ec9cb0,0xf1de4020,0xf3b76c70,0xf9670c38,0xfc063a54,0x014102d6, -0x091f2530,0x0556d370,0x04864980,0x0423c7e0,0x042c8220,0x035efd60,0x03857060,0x02e7379c,0x01fb5284,0x0150dfaa,0x009a55f4,0x01e977dc,0x000bf7f7,0x01c62b9e,0x00c30b1f,0xffb07483,0x0b7ddb60,0xf94fcc18,0xe19b9a80,0xe03292e0,0xe1b1e400,0xe2a340a0,0xe2442a40,0xdffbc580,0xe14f7420, -0xe3d4b4e0,0xe9cecfa0,0xe6b108c0,0xe4804440,0xe1ec8f00,0xe5abb400,0xea8449c0,0xee805820,0xf7bd2a40,0xfadd64b8,0x01f8b046,0x07bd5970,0x059abf68,0x040c2f48,0x0161adbc,0x00a9a5fd,0x01907d56,0x01583896,0x02988f70,0x05646db8,0x0415edd0,0x05d57198,0x059d5048,0x072acfe0,0x02477b4c, -0x06f2c508,0x01e69e5a,0x07efb790,0xed87fb60,0xda195440,0xdcc3fcc0,0xe35a12e0,0xebd4d1c0,0xf0b5b310,0xec244bc0,0xee6bdca0,0xe86a3360,0xdb4634c0,0xd4ed7840,0xd3df13c0,0xd7356a40,0xde355e40,0xe4f911e0,0xea4a1200,0xf38685b0,0xf7aecf30,0x016c057c,0x03d3893c,0x04f3f178,0x07963880, -0x04993aa8,0x04c236b8,0x06a88ca8,0x07a69160,0x07193f60,0x092b33a0,0x058951d0,0x05b22b10,0x06ad2820,0x0b315fa0,0x02b37010,0x09db7f50,0x0110486e,0x019715d6,0xe9526560,0xe63d7900,0xee29b800,0x063655e0,0xfc8eabc0,0xf46b5e30,0xeb29b1e0,0xe7bb2fa0,0xe2998f40,0xe0bbdde0,0xdc7b3700, -0xdbc82800,0xdf4bef00,0xe3135960,0xe94a4a20,0xf0d33350,0xf6f08f30,0xf9da1ec8,0xff2fddd4,0x0b560f20,0x06cf1188,0x06eb2bd0,0x06e5e568,0x05859f10,0x063affc8,0x02f1b79c,0x06778f28,0x0c63d690,0x065a8998,0x05c3a448,0x0387f4ac,0x08769c70,0x01e963b6,0x09c4d210,0x049d1ed0,0xfda81394, -0xea02d520,0xeb5ead20,0xef5096c0,0xf6412220,0xf96d7490,0xf9b93440,0xf0340400,0xee69aba0,0xe7716940,0xe0f420a0,0xe12f38c0,0xe3d55de0,0xe78e9b00,0xef0a7380,0xf4b2b640,0xf8139a88,0xf8c45808,0xf8f8d9d8,0xfe9ba20e,0x0d8b32e0,0x05e92cd8,0x0ac7c240,0x0a3d9e20,0x0695fcd8,0x0766bbc8, -0x07851140,0x06e7ff08,0x0d9d2dc0,0x079c7b48,0x06a5b628,0x037dec18,0x04184610,0x062a0d00,0x08019300,0xf705b580,0x0e60ff60,0xf63b7fb0,0xf204e7d0,0xf8e8b4a8,0xfdd499e8,0xfcb734fc,0xfad74df0,0xf64c9250,0xf3f6ac70,0xf37d30d0,0xf3234900,0xf1110070,0xf0e41380,0xf2c99c40,0xf4e64700, -0xf80a8560,0xfa9eb3f8,0xfca4471c,0xf9708f48,0x03eb26b4,0x0dcfc820,0x044c9ad8,0x09980770,0x066674c0,0x07be86a0,0x094cc890,0x0957d800,0x0b81f290,0x04bb2dd0,0x09d43f00,0x090b5830,0x04be4010,0x07e50e90,0x04bf1cd0,0x0738b920,0xff81c9e1,0x0aca47e0,0x012538f8,0xfbd24820,0xff366aa2, -0xfe665e5c,0xfad1b6c0,0xf7f31600,0xf6093ab0,0xf5ab9a30,0xf52556f0,0xf4ecd030,0xf7e71680,0xfa964378,0xfdecc8a0,0xff071f57,0x011a210c,0x029e1660,0x02ddf6bc,0xfe1b82f8,0x0226fc04,0x0b4b4ba0,0x0b07cc70,0x0a79d3e0,0x098a2910,0x0f9aa4f0,0x0824dc40,0x0ff648f0,0x039da488,0x0f3878e0, -0x07634ae0,0x0edc1260,0x0b8582d0,0x0bb35ab0,0x0c0b3590,0x0ec72d10,0x080675b0,0x1ef9d860,0xfe3b18ce,0xfe996a52,0xfebba630,0xfe29befe,0xfe665814,0xfe52f4b2,0xfdc6af48,0xff36ebab,0x008b9cab,0x019aba82,0x034a5b54,0x04cf1000,0x07609a50,0x06804a08,0x05dd7e00,0x04f24fd8,0x046b3fd8, -0x03557c64,0x02d48c84,0x1a591260,0x0752ef38,0x062cb6a0,0x07ad93a0,0x0956d300,0x0111f1ae,0x00651027,0x00eb92e2,0x07275a28,0x010539c6,0xff036fd4,0x05c0bb08,0x04ae5e30,0x0b877d20,0x0ba84560,0x01d54d36,0x08299940,0xf6780350,0xfd1fe580,0xfb675790,0xfb7e5d98,0xfb68bc88,0xfb6810b8, -0xfb409928,0xfc255cd4,0xfcd7bd04,0xfda6dca4,0xfe1cafb4,0xfe8680d0,0xff4366c7,0xfe63eed4,0xfdfd9f50,0xfd9378c8,0xfd33b834,0xfe2b15a2,0xf7f34360,0x08fac000,0x13b14760,0x28d59480,0x02ac0684,0x119fe480,0x25c37b00,0x2636c4c0,0x25a6bf00,0x22f210c0,0x2521c740,0x25461f80,0x2420bb80, -0x121420a0,0x00637eba,0x27bcf1c0,0x15224240,0xf9ec1880,0x044c6aa0,0xfd6c3a00,0x07467e60,0x03ffcb58,0x04555230,0x038ac674,0x041c7168,0x042bde70,0x03de0854,0x03cb65dc,0x03a53318,0x0382cdc8,0x03700ed8,0x0376f240,0x03c0949c,0x03c33ec0,0x03e8da84,0x04189ba0,0x045de130,0x04178e58, -0x066347f8,0xfdad3c78,0xf9a5d760,0xf7292f30,0xff74d465,0xf9dca088,0xf766b5b0,0xf711fdc0,0xf726c4d0,0xf82447a8,0xf68ca010,0xf62481b0,0xf6667f90,0xf9a0b328,0x0082a60d,0xf66a9b10,0xf842e588,0xf70432a0,0x05307eb0,0x058789a8,0x046d4180,0x0346cdcc,0x04299088,0x04056678,0x034e57e4, -0x03b0de08,0x03947fc4,0x0344f4ac,0x02ff4c34,0x03401b7c,0x041c2558,0x042d1ae8,0x047d2ca0,0x0507b8b8,0x055ee218,0x0630d100,0x04f29898,0xfba5f1b8,0x01f46b0c,0x00a3a8a7,0x00b38a62,0xffe63da5,0x0163ce38,0x025429e8,0x01b0a35e,0xffa9f11a,0x01e14d26,0x036f2da8,0x00ecdf88,0x012978b2, -0xfe8de1ba,0xfe09d5e8,0x036aefac,0xff0b35f1,0x05dfa9f8,0x09cc0cb0,0x059af5b8,0x02c7a430,0x03e8e400,0x0417e648,0x0251efb8,0x029ac130,0x021b81b4,0x01f6abbe,0x0183e52a,0x0171e36c,0x02d4a520,0x02c67644,0x038ea84c,0x04baa218,0x057fc580,0x078a0940,0x04887d08,0x010bb814,0x022b68dc, -0x014f937e,0x02434fcc,0x00c96a1c,0x020b2628,0x00c29f99,0x0446c0d8,0x00059c1f,0x02c3e0f4,0xfef85422,0x005f992f,0x00026ec2,0x008afecd,0xfe8cf038,0x01c01716,0xff48782a,0x06c01ce8,0x0b535dd0,0x070cf808,0x022f4274,0x024263ac,0x019de66e,0x0018c6f8,0x02af6ce0,0x03cfcd90,0x03a0bebc, -0x0300800c,0x039f39b0,0x05c522a8,0x056411b8,0x05fb32a8,0x07681c80,0x089acb80,0x09a215e0,0x074aa698,0x03492fc0,0x04d9ecb8,0x02f9f0b0,0x03d0c6dc,0x03d6cb48,0x03556568,0x031000cc,0x02ac1014,0x041dab20,0x02387708,0x02dd20ec,0x029ed9ec,0x0228a6d4,0x00b078f9,0x018b8678,0x055d4290, -0xfef8a2da,0x12963d20,0x151e6340,0x0ca14aa0,0x082faa60,0x0c187bb0,0x0a69c510,0x05c69890,0xfa41ffa0,0xf3bc7560,0xf3446150,0xf2a6e7c0,0xf1add7d0,0xeefeeec0,0xf2cbbe70,0xf6267970,0xf9391450,0xfcc65af0,0x019bb29a,0x028a7194,0x019f424e,0x042f4620,0x0387cf60,0x02d95518,0x02013e84, -0x0267c99c,0x031021cc,0x0320f690,0x024c2644,0x0172a6b2,0x01f82946,0x01ab3378,0x05984978,0x03239038,0x04d24170,0x0262cb28,0xf5726b80,0x0179aba2,0x1487cda0,0x0da31100,0x0f31bef0,0x0addd2d0,0x04374828,0xfe58bf96,0xf1249070,0xebefbfa0,0xeaf0ac60,0xea0a3e60,0xedf4fae0,0xf5dc64d0, -0xfc22a4cc,0x00d8ad49,0x0462ff48,0x04929bf0,0x06597cf8,0x0331bcec,0xfe558380,0x0044a4bb,0x0027580b,0x02e9ebd8,0x02cc8fa8,0x00e2d560,0x01ce274c,0x02600240,0x05158c88,0x043d4c48,0x0444b3a0,0x05253168,0x025b2790,0x04cf3e08,0x00d3218c,0x0213e1fc,0xf4269510,0x03bbcdac,0x2450e980, -0x22ae3840,0x2915e380,0x1ed5e900,0x19577060,0x0e4822a0,0xfed9388c,0xf51d5b80,0xf5ba6a90,0xffe87880,0x077c3bf8,0x0c487c40,0x0c7e34c0,0x0b6f4390,0x08ced890,0x0a18b1c0,0x0e2f5210,0x06858e78,0x02afc9dc,0x046ae040,0x001a2269,0x0222b838,0x023e97c8,0x02a6f92c,0x04da4a90,0x056b9238, -0x075025a0,0x045e5858,0x03037df0,0x02cb2674,0xfd609e80,0x00e8f164,0xf5e32ae0,0x02f35dcc,0xf95fde80,0x155a5760,0x29ea36c0,0x225dc2c0,0x26639f80,0x1993eda0,0x0e1ef750,0xfebe0832,0x00395cba,0x024f980c,0x062946e8,0x0732be00,0x079cdca0,0x0804e440,0x0662b588,0x07079ab0,0x0bd98b30, -0x0bc87680,0x0debe920,0x06331310,0xff68b79c,0x03712a6c,0x029bf504,0x036449fc,0x0328d278,0x03fa1aa0,0x02fef090,0x03dd5104,0x080c4c30,0x0520e878,0x049f1728,0x0731d748,0x03890160,0x06cf4ee0,0x008e8865,0x049e3020,0xfd64741c,0x0e289270,0x140a16a0,0x0b417cf0,0x0c0cfbf0,0x00ffc1b9, -0xfa7545b8,0xf4e4d710,0xf4e4b7f0,0xf90e2618,0x03178cfc,0x06bd3710,0x09705850,0x09ea9fb0,0x0ba6af50,0x0b033010,0x0b3bdf60,0x03f1ca68,0x02fea038,0xff4caefb,0xfdaacb08,0x00234aaf,0x011ca32a,0x01508b70,0x00c850d4,0x031ca6c0,0x0531b6c8,0x0532c630,0x05dca930,0x0350f770,0x0245e640, -0x00c921b8,0x0352aa30,0x046288d0,0x01dede3e,0x08c86ab0,0xefc09f80,0xff2ae907,0xffd58986,0xfa666af8,0xfa7f8f10,0xf62ffb90,0xf41221c0,0xf32fb3d0,0xf2ae4ab0,0xf23d4550,0xf4468bc0,0xfa9afe28,0x0174eabc,0x0677e530,0x0aa13790,0x0b2051f0,0x08cbf190,0x011ac0da,0xfe54fbf0,0xfae4b5c8, -0xfb9f56d0,0xfe1a2352,0xfcf03268,0x005f30ab,0x02fdbb04,0x049a12d8,0x04f7a8e8,0x0502b478,0x008133ed,0x02cf17f4,0x0284666c,0x0232a058,0xff336cd2,0xfdcc9ecc,0xfdecf054,0xfc3f81a4,0xfcfc4cc0,0xf7a53280,0xf7cb89c0,0xf6cf88b0,0xf6555ae0,0xf6fd2a90,0xf8579cd8,0xf95858b0,0xfcaf9b48, -0x002281cb,0x036d3364,0x039f2c80,0x03ae8c04,0x0454d3d8,0x02efa348,0x01df2c00,0x021600e8,0x011001bc,0x00cfc6a9,0xfdea8fd4,0xfc6800b8,0xfe0e1d70,0xfe9d4166,0xff71dd07,0x015d4bd6,0xffbab902,0x021e7fec,0xffe5c1c9,0x00eeb628,0x01ef0792,0x02843398,0x0369b7dc,0x023ed2e8,0x01a3f6cc, -0x0068da9a,0xfd92aa5c,0xfa91ce50,0xf54e3800,0xf789fa40,0xf7068d20,0xf73bc950,0xf711ef40,0xf6d06250,0xf6536920,0xf65c2640,0xf5f702e0,0xf5e92a90,0xf6098a90,0xf6687f80,0xf69e5a20,0xf75e2750,0xf8348ea8,0xf8c61ea8,0xf8ba8548,0xf9412a28,0xf8fa1338,0xff55d470,0xfc3651c4,0xfaa08048, -0xfb3e6360,0xfbe9e1a0,0xfa651c20,0xfad9ba40,0xf942f568,0xf99c72f8,0xf94ef0f0,0xf9e9e348,0xfa26ad98,0xf972e6d0,0xf988c298,0xf947cd68,0xf7730260,0xf5b514a0,0xf6e55940,0xf76a7000,0xf71080a0,0xf750a8b0,0xf747c3d0,0xf7653960,0xf7803cb0,0xf7a5d4f0,0xf7d638b0,0xf7f80c50,0xf833ad50, -0xf861f880,0xf88ac048,0xf86c2e08,0xf8308fd0,0xf81fad38,0xf82cc668,0xf8a7b9a8,0xf7f72540,0xf6615fa0,0xf6c34ab0,0xff98c4c3,0xf5e4afe0,0xf64c4410,0xfd1a37a0,0xfcd3dde4,0xfd21aa64,0xfd261354,0xfcc74ca0,0xfcaf90a4,0xfcb5f21c,0xf6157650,0xf4f084d0,0xfea5f228,0xf675f180,0xf637e150, -0x067405a8,0x09947d60,0x06622800,0x06ab5630,0x06d99208,0x06b44398,0x0695f580,0x066a90d0,0x067659a8,0x05ab8058,0x0541dce0,0x04fca950,0x0513e080,0x0535d4f0,0x0575b870,0x05a68ff8,0x05d1dcd0,0x05eef0b0,0x05f23820,0x05c09d10,0x05416860,0x08530060,0x07b420d0,0x021162b8,0x084e5b20, -0x07f2ecc8,0x028980e8,0x031993a8,0x03394de0,0x0321ac24,0x03b00618,0x03c9792c,0x03dd038c,0x081ac800,0x08c4a380,0x02a6c01c,0x08be67f0,0x083961c0,0x09709660,0x08772560,0x0955aa60,0x08ed8050,0x089fba00,0x07cef738,0x07bbc260,0x058f9988,0x04a5bda8,0x04582e00,0x048a4068,0x04e53be8, -0x05a3c6c0,0x062e1190,0x0698b348,0x06a242c8,0x06c5bcf8,0x05e34670,0x06ad7688,0x06583140,0x05b22420,0x06ed0b88,0x05bba010,0x05b8b628,0x06514660,0x063f36d0,0x073aa408,0x0796eef0,0x06f78ec8,0x06230ca8,0x063fce40,0x066bf418,0x069065a8,0x07b68ff0,0x08490a40,0x0cf3a020,0x0b36fcb0, -0x0a2ac460,0x0b057170,0x0a480b00,0x0ab5f730,0x096083b0,0x099a0320,0x049ea848,0x0187d248,0x00901a2f,0x00d8ebe4,0x020ad1ac,0x03a475cc,0x0505c900,0x063d26d0,0x0682f5e0,0x06cf7a88,0x054dad88,0x05e8d590,0x06ac0a08,0x04a44308,0x04f92608,0x04e63600,0x04d268e8,0x04398fd8,0x04a9fa98, -0x04de9f98,0x06163ab0,0x049f0ca8,0x055ffd48,0x05f978d0,0x05a53ae8,0x0668e5c8,0x08b1b340,0x0acceba0,0x0cbc3c50,0x0b92f740,0x09fdfcf0,0x0c4040c0,0x0bf55f30,0x0c62b660,0x0a8089a0,0x0a7522f0,0x03089720,0xff5953eb,0xfed07b00,0x00295cba,0x0136a55a,0x03e85a14,0x05fe53c8,0x072e3ff8, -0x0726b388,0x070219e0,0x0534e098,0x05826e78,0x063a2ab0,0x0366460c,0x03a2241c,0x0350976c,0x03625a38,0x025bbef4,0x0325a808,0x0303dca4,0x03beecf0,0x0354a3b0,0x0344e824,0x04400d38,0x03b8ef98,0x05a13558,0x06fb6098,0x0aedbdf0,0x1bb10a40,0x1fc7d980,0x1ae0a0a0,0x1ae8bfe0,0x19916340, -0x1529fc40,0x10cbe820,0x0f6b7560,0x07443a00,0xff3efdb7,0xef0f8ee0,0xf3aba9d0,0xf6e4b1e0,0xfab02ab0,0xfe433b86,0x02997890,0x06658190,0x06ec7d98,0x05a93920,0x0467e478,0x0385d428,0x029a1360,0x0474f1f8,0x030645c8,0x02950de0,0x01f3f0e4,0x02aaa4c8,0x03580090,0x0427ea58,0x049dd688, -0x06949c38,0x08fc18d0,0x0c68b910,0x0f8ec760,0x111a7f00,0x14e10b00,0x0e448290,0x1a3996e0,0x279b7740,0x297dde80,0x1c46c400,0x13247ee0,0x0f5eb7d0,0x15eb33c0,0x0f5a93b0,0x0c6e8800,0x0784de00,0x0c875370,0x104e6100,0x1465b2a0,0x1425d980,0x11d5d7c0,0x0ea1a790,0x0a9c0570,0x08496200, -0x085ae010,0x056db9d0,0x03dcc728,0x04a878d8,0x046ebfe8,0x047039f0,0x0304dbe0,0x041416c0,0x041cb9f8,0x04e212e0,0x04f9d590,0x04cc13b0,0x043739e8,0x05223a28,0x07fbeb78,0x0865ed20,0x0e2e8810,0x166e6ce0,0x2348cd40,0x14bd9780,0x09505bc0,0xeef9e560,0xf5eff860,0xfa5d4330,0x07ccda30, -0x09a29da0,0x0e75c700,0x1467e620,0x16805820,0x16548dc0,0x153fcbc0,0x15e66b80,0x16fbc940,0x17f24a80,0x14acfc80,0x0f9fd120,0x0ce2e830,0x0c03d990,0x08269d90,0x04f38518,0x054e16c0,0x03b1d530,0x013c241c,0x01ed2b18,0x035b94e0,0x074acb58,0x051cc870,0x04fe8a08,0x05646320,0x066d5dc8, -0x09edfb50,0x0dd7a8c0,0x0cf6f180,0x18ba7b00,0x0d4435a0,0xeb663c40,0xe66a69a0,0xcdfc5940,0xe39821c0,0xeff03660,0xfd9d12a4,0x00534d2a,0x06459858,0x0ad70940,0x11985ce0,0x159b3860,0x169056c0,0x16761360,0x14f08360,0x12c46a20,0x120fd080,0x0fd7d1c0,0x0df926f0,0x08d44f80,0x06a28808, -0x05a4b170,0x05068518,0x05354ff0,0x049f2988,0x051e7618,0x054ba668,0x055dae48,0x0547ed88,0x0634b698,0x05498690,0x06b95bf8,0x06308f48,0x095e72e0,0x09867250,0x0f754990,0xffdbc05e,0xe86e10a0,0xe9ac8600,0xe4a65e40,0xeaac9b60,0xee73b1e0,0xf89f2348,0xfe105f3c,0x04ddd628,0x08ef99d0, -0x0dae2af0,0x10896960,0x126cc440,0x12d8fc20,0x1359f1a0,0x1453bb60,0x113f41c0,0x0c4c1db0,0x06d68488,0x01b308d6,0x028d6c40,0x02b82c10,0x0151780e,0x021c8518,0x01ba146e,0x04b2e0f0,0x04417db8,0x027c207c,0x033494f4,0x04080d78,0x04163118,0x06b05260,0x07fdd2c8,0x089dbbb0,0x08ad1670, -0x0a1e3f10,0xfc8c83e0,0xf41752b0,0xf43852f0,0xef9ff4a0,0xf4012b30,0xf735b710,0xfce8edbc,0x05b72d08,0x0ba3c2b0,0x0f4ea1c0,0x113b2400,0x114f4a60,0x108e1dc0,0x0ff8ac50,0x0e9b6500,0x0d523230,0x08850ee0,0x06ddf1d8,0x03051744,0x0040190b,0x02267974,0x00b16614,0x021743d4,0x020e3db4, -0x02415734,0x02a81a34,0x01b65140,0xffeef682,0xffbd2304,0x012e4b02,0x049ad298,0x02389e90,0x01c97dd8,0x01f0f848,0x029d6740,0xf9bd5f28,0xf9e62d90,0xf767bfd0,0xf5d1c4c0,0xf283d820,0xf7ea9c50,0xfbd141f8,0xff07d6f3,0x0235da3c,0x051b4848,0x085eb170,0x08e78a40,0x0a1615f0,0x0b96b470, -0x095305f0,0x07259ba0,0x051710f0,0x0437f0e0,0x0371c2b8,0x029abd2c,0x01e551c0,0x01357394,0x01019b46,0x00f4d904,0x001b9668,0x00fee226,0x0008e4cd,0x00e857a6,0x0123150e,0x00d1067e,0x007559af,0x00769cf3,0xffae672e,0xffd4df85,0xfec59ffc,0xfc091b7c,0xf904da48,0xfa2d46c0,0xf90069b0, -0xf8f4bfe8,0xf84319e8,0xf75fd510,0xf6192b10,0xf547e5a0,0xf588d0c0,0xf5d729d0,0xf654a5d0,0xf6a285c0,0xf6ee0bc0,0xf75ee860,0xf7bd61b0,0xf882d388,0xf9069d00,0xf9d28550,0xfa3ea578,0xfb2b6840,0xf9ced8d8,0xfc23ca1c,0xfd6cab04,0xfd266ac0,0xfddd0b34,0xff5898ac,0xfed72270,0xff32f46c, -0xfe5640c6,0xfe41b648,0xfe039102,0xfd1510cc,0xfc7bcd44,0xfac393d8,0xfaee93f8,0xfb5c39e0,0xfa706478,0xfae8dc18,0xfa823da0,0xfa7df858,0xfa6b1250,0xfa10d768,0xf9d88ec8,0xf95fa050,0xf974c968,0xf95826f0,0xf92f3700,0xf947f2e8,0xf959ca50,0xf9568398,0xf9d38f88,0xfa3027e8,0xfa894800, -0xfacf9800,0xfaf29ae8,0xfb9f5270,0xfbd9d740,0xfaa7a270,0xf63cc310,0xfcf97554,0xfb71c968,0xf73b8380,0xf7345410,0xf714abf0,0xf7139ea0,0xf723d7c0,0xf6f19ee0,0xf70c5950,0xfae55518,0xfcb57ccc,0xf57680f0,0xf954cda8,0xfafcb998,0x0246f2bc,0x017182e0,0x0128ccda,0x023e49a8,0x01c94ca6, -0x022272b0,0x011a7690,0x00d04aa2,0x00e5aa34,0x0173085a,0x01cf46d0,0x0217174c,0x02553e24,0x0282afb0,0x0288c310,0x0295f5ec,0x02852cc4,0x026c0274,0x022099b4,0x023e24bc,0x01c11050,0x015159be,0x0333b81c,0x0832f670,0x00df7d0c,0x02e1ab58,0x07ab0df8,0x079cd860,0x07a2be48,0x0793d418, -0x076a01d0,0x0771d448,0x07652940,0x02e92478,0x00763b8d,0x08cddf90,0x03fd8610,0x07896060,0x00a57fb1,0x01cad916,0x01033d02,0x012d3648,0xfec432fa,0xfe731606,0xff449fcd,0x0063cc16,0x0163e37a,0x021a21b4,0x02ee99b8,0x03512454,0x0343cc1c,0x038677e0,0x034de120,0x02ed1ae4,0x0236e110, -0x024a20ec,0x01728264,0x04c2fc70,0x0317621c,0x025a483c,0x034acd18,0x035b31c8,0x020f23bc,0x02687854,0x01d1f846,0x02780d88,0x01951000,0x01917d8e,0x02856370,0x026b443c,0x03e40f1c,0x04319088,0x021a8dcc,0x04090c40,0x00f042bf,0xff49870d,0xffa9611d,0x008f3324,0xfbf99430,0xfaa80298, -0xfc939e14,0xfec20c6a,0x009c1a97,0x013abdf0,0x02a6d8f8,0x03e955c4,0x044a1930,0x0515a690,0x04cdbda8,0x0425cc58,0x0300cb5c,0x0283a7c0,0x0232368c,0x02f15db0,0x032e0064,0x037b2cd4,0x03113988,0x03419a30,0x025c604c,0x03af8c1c,0x0305f13c,0x039d3d98,0x029ddd7c,0x02f6e81c,0x02ebc878, -0x03805a8c,0x03b52808,0x055f2090,0x0359f348,0x04e425e0,0xff7370cf,0xfcd47008,0xfc8488a8,0xfe0a50e6,0xf90b01d8,0xf874b078,0xfb4d3ef0,0xfd58494c,0xfeb6ef2c,0xffe28b68,0x01a4e470,0x030d5d48,0x036d1550,0x04d10938,0x04b6dd68,0x03a82768,0x0250ebec,0x023cec40,0x01a7cdb0,0x03cd306c, -0x047374f8,0x0356ffcc,0x038e0ba8,0x0356daf0,0x02bca7f0,0x03234438,0x035c7f14,0x039706a0,0x020ab478,0x0160794e,0x01ff0bc8,0x02f2ff10,0x0475dea0,0x05d57158,0x011cb25a,0x0b58ac80,0xfaf730a0,0xf548a9f0,0xf6e0d0a0,0xf2288f70,0xe7dfeca0,0xe5392760,0xe8bdc980,0xf6972b00,0x012dc0d8, -0x05b344f0,0x0754bc28,0x09f44cb0,0x0dddb7e0,0x0e6678c0,0x0d6f7300,0x0c6c49b0,0x086fb760,0x06b4a7a0,0x04dfa8d8,0x036ed6cc,0x047cf180,0x0343a034,0x039ab2e8,0x032b77a0,0x01e494da,0x030d5108,0x0382cea4,0x0438d5d0,0x03f63214,0x04887340,0x06884bd0,0x03973670,0x0630e010,0x06553398, -0x084df2b0,0x128e2860,0xfe81683a,0xdd7a75c0,0xdca0d740,0xd2d690c0,0xdb5f7100,0xe47ba440,0xed775000,0xfb8bc8d8,0x03c1026c,0x096b15b0,0x0b930df0,0x0b490750,0x08810960,0x06cecd08,0x05706998,0x04d71998,0x0372549c,0x033a18c0,0x04877940,0x06888080,0x05651278,0x04add5a8,0x0377fb98, -0x02f4e054,0x0311add0,0x042a6870,0x04247f70,0x044ff328,0x037814f4,0x03ec63e8,0x01e35a4c,0x0508c1c0,0x0140496c,0x0612a5e0,0x02940fc4,0x07b038a8,0xe771f860,0xbba4bf80,0xbe9a8b00,0xc0f2e540,0xcddaad00,0xd46a6e40,0xdbc3f1c0,0xeaac4e40,0xf39d2ba0,0xf69c6e20,0xf4c78460,0xf5bbfab0, -0xf871b8a8,0xfb6bfa88,0xfd7ef248,0xfef6c6b2,0x00257479,0xfffb0c6b,0x04d11388,0x071d5a88,0x065ba260,0x0603b400,0x04a95778,0x03e166b4,0x01afc4ca,0x0122cd40,0x0265da54,0x069f56d0,0x04911a60,0x0492a838,0x041edf10,0x09e94a70,0x00fcf4fa,0x0bc39190,0xf9d8cc78,0xf11cca10,0xc8f3f980, -0xc4cdc540,0xcb91bdc0,0xd5ddb840,0xd54ba500,0xd7664d40,0xde00b240,0xdefda340,0xdf6cf640,0xe15a6d20,0xe27eeac0,0xe7569e60,0xee77b340,0xf719c2b0,0xfc9cf818,0xfd1a2198,0x00e55b7c,0x0186ef8e,0x03ea9198,0x06eda710,0x026dbf94,0x031f5558,0x0399fd18,0x03ce5728,0x02e8eb54,0x059b75b0, -0x048f4970,0xfec7dbce,0x01d11836,0x02cc2750,0xfdc791a8,0x03414b1c,0xfaa591e8,0x0097cb1f,0xf61d9820,0xe78e06c0,0xda1ed800,0xdba55d00,0xdce76100,0xdf57e180,0xe8346640,0xf09e0420,0xf59c8c10,0xf867b3f8,0xf4e8c8b0,0xec2ead80,0xea16eee0,0xeb03a860,0xefa3fb20,0xf1e7df70,0xf6b319c0, -0xfbe8fdd0,0x01d67444,0x034afb1c,0x02acb8ec,0x051fbbd8,0x03b0c048,0x0477ce10,0x0357a478,0x02cd3bb8,0x01f88e22,0x02d33194,0x02245d4c,0x00986328,0x0162ebb8,0x0064fc4e,0xfdfc31a0,0xfa2eeb60,0xf8ec0260,0xf7d674f0,0xe581eac0,0xf91aa870,0xead75940,0xec3c5500,0xecfd1600,0xeed23ee0, -0xf3745130,0xf802b188,0xfb7b28e0,0xfb1d5528,0xfd1093c0,0xfe25d568,0xfb773c18,0xf90f3ca0,0xf93923f0,0xf7d3e870,0xf8d5cc78,0xfb55e828,0xff9f33e9,0x008b2f5c,0x0326a1c8,0x025657e8,0xffe69cd2,0x00d4d5c2,0xff41fad4,0xffe1d4ce,0x00ca2872,0x0098bf9f,0x00b75be5,0x008ca086,0x0063e458, -0x008e8554,0xff5317ac,0x001c37b2,0xfd370734,0xfb917520,0xf6c5b130,0xf50b2d40,0xf6e41320,0xf7675d50,0xf620b4c0,0xf5c6aa50,0xf4d82580,0xf3832680,0xf2743020,0xf0fbe0f0,0xef4af7c0,0xed7477e0,0xeeb02f40,0xf00e6d30,0xf1619fb0,0xf2eedd40,0xf4934e60,0xf5503000,0xf69f6d60,0xf6bf6290, -0xfa9de7f8,0xff508c6d,0xfe7fcc7e,0xfeefb2b6,0xff6738c8,0x00acff40,0xff72c902,0x0060095e,0xfe9f3892,0xff26f3c4,0xfe61ced6,0xfe4365fa,0xfdcc8eec,0xfb490398,0xf97f4848,0xf74a7810,0xf6e7cc60,0xfb165968,0xfbfb9220,0xfbd3a688,0xfb26c870,0xfad60f48,0xfa832c88,0xfa674180,0xfa11d398, -0xfa670a68,0xfae552a0,0xfb37ae38,0xfb7b9af8,0xfb867208,0xfbf7a760,0xfbb3b030,0xfb4dee18,0xfb23d848,0xfb7f6a10,0xfbd0b1e8,0xfb1e0da0,0xfbc05208,0xfbaf1ff8,0xfb88e9c8,0xfbf0ea28,0xfc560e58,0xfc98a810,0xfcdcb284,0xfc723a7c,0xfcfda104,0xfd2dc100,0xfe54355c,0xfe63dd12,0xfde5837c, -0xfd603394,0xfc6f4664,0xfd129638,0xf930d708,0xfdab6fb0,0xfcfcc778,0xfcc2a7e0,0xfc9b10a0,0xfc542664,0xfc12d638,0xfbc85be0,0xfbaefa48,0xfb7b9868,0xfb59e4d0,0xfb129130,0xfad3d950,0xfa82dfc0,0xfae10a10,0xfb53c798,0xfbb16e88,0xfbb79418,0xfc084cc0,0xfc55c508,0xf960f570,0xf9ee97a0, -0xfbe72770,0xfa6a3500,0xfa47a8b0,0xfc8417cc,0xfc5b2434,0xfc76b6c8,0xfc4d708c,0xfc0c9c1c,0xfbb09f28,0xfbb97a28,0xfa784c98,0xfaf80f40,0xfb016ac8,0xf99a7cd0,0xfce0edcc,0x07ba81d0,0x05b05de0,0x069cf248,0x05c6f190,0x0609be80,0x05d4dc10,0x06c63e38,0x07754708,0x0843b750,0x08f36610, -0x094b6c60,0x094471f0,0x08e2a680,0x08908bc0,0x084ff880,0x07f9c878,0x07b07138,0x0773c778,0x0738e738,0x06c481a0,0x07901140,0x06480118,0x03a14b70,0xff0fc01e,0x06fdb2e8,0x03c50904,0xff4aa18a,0xff69aba3,0xff7617d2,0xffed158f,0xff6da35f,0xff69fc07,0xff8f2af4,0x03e2ecb4,0x070eafc8, -0xff912b82,0x03175104,0x02045cbc,0x05691a68,0x04152f00,0x04629f30,0x0479c928,0x0711ee88,0x097c6b70,0x0b97b560,0x0d93af60,0x0ded3580,0x0ce4dde0,0x0b9e56b0,0x0ab2da50,0x0a2ac8c0,0x09684f20,0x08dade90,0x088209b0,0x07c11008,0x0736f520,0x0773f978,0x02f115e0,0x0624b650,0x0640fa70, -0x05233068,0x04cba5c0,0x05fea570,0x0664d920,0x06cb0290,0x05c13018,0x066a79e0,0x062fee30,0x04e25a48,0x0564ed68,0x0448b918,0x04f0cfc8,0x058fac80,0x01915b2e,0x0192c51e,0x003b5a05,0x00afec0a,0x00dd4d60,0x05578a38,0x09de5880,0x0ddd0030,0x129b42a0,0x14a22f00,0x13b8e680,0x11d91d40, -0x0fa60a40,0x0e6bc750,0x0c54c270,0x0ab9ba10,0x09acc1f0,0x07c31368,0x0756cdd8,0x06071a40,0x056867a0,0x0599ae50,0x054c6b98,0x05050000,0x03f1240c,0x04b667a8,0x03e952f0,0x05c2a210,0x046837a0,0x042252f0,0x02b1254c,0x02fc3db4,0x03636e94,0x03781abc,0x032030e0,0x026b55d0,0xff73eec4, -0xffc4a00a,0xfdc61d64,0xfe4ad58e,0xff48c76c,0x071c7b30,0x0e3e3d20,0x14550060,0x1a3b9be0,0x1b0abb60,0x16f4cea0,0x12905a00,0x100398e0,0x0e8cb140,0x0c3d7ba0,0x0a9bab60,0x09f9b140,0x07e5a508,0x06bc30a8,0x05a7ffe8,0x03fed574,0x0522c340,0x04392c98,0x04506760,0x03b503ac,0x032810c8, -0x03afedbc,0x03307a24,0x03fb1734,0x01ebf874,0x01a494f0,0x011d06a8,0x022bf620,0x02e8445c,0x026e7cf0,0x0011f4bf,0xf77a2340,0xedcf3fc0,0xeaee8fe0,0xea72cf40,0xe89231c0,0xf212ec30,0xfb6981c0,0x05024d48,0x0fed19e0,0x1a348b40,0x27676e40,0x256ca300,0x227b12c0,0x1c96eca0,0x18f91420, -0x138883c0,0x0dc7f960,0x0962a5c0,0x07d36670,0x08f94920,0x07b0e9c8,0x073bf3c8,0x05c39b88,0x04f6fd30,0x042b01f0,0x02b9566c,0x040a3df0,0x041c4080,0x03d0a938,0x033080ec,0x02475c68,0x01eacf4a,0xff42f683,0xfd89b234,0xfce19ac0,0xfcb98ce8,0xf2a96e00,0xe6eb88a0,0xe05d75a0,0xe01d7ca0, -0xee0a0de0,0xf9978d68,0xfcc9930c,0xf3fc1f20,0xfc3bfc6c,0x02209650,0x0afce330,0x094670a0,0x0a76b0e0,0x0c7c6af0,0x0c6477a0,0x0cbfeff0,0x0cad2550,0x0ab714f0,0x093a3d70,0x06d62850,0x05dfc318,0x06441b80,0x04bdd930,0x04868380,0x03e0c498,0x02e2b938,0x03baf5f4,0x03fcd138,0x04d0c3b8, -0x03de134c,0x0373485c,0x0300344c,0x029854e4,0x0007542d,0xfd5103d4,0xf553a110,0xe0232cc0,0xdfcbabc0,0x089a5e90,0x15bad4c0,0x2e52fa00,0x134b9a40,0x0156db6a,0xed501460,0xe9bbb9a0,0xebe4a8e0,0xf62f3810,0xfecc777a,0x069e3108,0x0bba1020,0x08cfee30,0x06de53d0,0x05eafc68,0x06d0c4a0, -0x0917e6c0,0x065254d8,0x04d92458,0x0550dbc0,0x05362a40,0x04f11ef0,0x047c77a8,0x039779a8,0x02f5ee88,0x039020b0,0x0598c1c8,0x027401e4,0x00ee9613,0x00a3c51e,0xfc03fe6c,0xf8840fc8,0xef37c000,0xf4d96240,0xe43c72e0,0x0a8392b0,0x331958c0,0x2b9b1b00,0x2e9316c0,0x1ae6d180,0x115d8400, -0x0464bae0,0x05c40538,0x053e1c40,0x04145480,0x03dd0ec8,0x04081b58,0x046a44e0,0x04f878b8,0x05aa4670,0x0616dc58,0x04617f20,0x041b2910,0x044f25e0,0x026171d0,0x03ac4bc8,0x0369007c,0x033d492c,0x02fc5274,0x027323ec,0x05092ea8,0x04246000,0xff8edaf2,0x02a30700,0x0149206c,0x00e73808, -0xfd1cf110,0x00fa50d1,0xf6e60f80,0xf6104bf0,0xf6bc5160,0x147f1120,0x24c3f3c0,0x1cc91b00,0x1d965c20,0x12e38040,0x0def7e70,0x0a857d30,0x075cca88,0x07e109c8,0x0d157810,0x0c0b7a70,0x09ad02c0,0x06799ac0,0x02c30420,0xffbdad8f,0xfcef8d18,0x00fee6ba,0x04621880,0x067ddf10,0x04dd7550, -0x04ccfe70,0x02a1bd38,0x038db578,0x03f64d3c,0x037746dc,0x02b40a54,0x02bdbf7c,0x004c6f32,0x00f38d38,0x0011e55c,0x01e53b66,0xfe2f437e,0xfb94f480,0xf82fbb68,0x07353190,0xecc1be00,0x0caa8760,0x12355000,0x0b898940,0x0c4509f0,0x06e91340,0x0531b648,0x03ccfff8,0xfed3e9a0,0xfb0f4570, -0xfa324168,0xfc103470,0xfed3ef22,0x0092f42b,0xff6e85fe,0xfe61d88a,0xfcaa39cc,0xffd95673,0x01e220b0,0x017fea28,0x016f866a,0x0318c394,0x039098c8,0x02270178,0x01738f98,0x0219a360,0x01006b90,0x007ae847,0x02f44b30,0x027315f0,0x01d4bb74,0x006d4881,0xff5f43c0,0x00902cad,0xfdb6407c, -0x00aa2e2e,0x02d6d6f8,0x03a4fc98,0x07e1a8e0,0x07cafdb8,0x0a81a000,0x07dd2978,0x05abace0,0x032bf4b8,0x01c5ee2c,0x009cd737,0xff161482,0xfc642220,0xf9442f38,0xf5c0cb30,0xf76d9a50,0xf8a4ca58,0xf9d2d508,0xfaa89110,0xfd4326bc,0xfc8c3838,0xfac47e70,0xfb79c238,0xfc54cd88,0xfdfd970c, -0xfd755e18,0x001446c8,0xfe06ab2a,0x028aee7c,0xfe44bb90,0x0114743a,0xfe2efb62,0xffc91f7a,0xffbe9a63,0xff7d7377,0xfeb84dd6,0x02c37930,0xf91b13f0,0x08680d50,0x08ef2cf0,0x08d098a0,0x095c72a0,0x09b50420,0x0aa0abc0,0x0b740e30,0x0a500770,0x08edf250,0x07a683f8,0x0633d240,0x05078a70, -0x02dbe204,0x035651e8,0x0339261c,0x0380e0b8,0x037b1a34,0x03f35fb4,0x03ddf52c,0xfafcf258,0x02c42c78,0x033a11e0,0x028c62c8,0x020f07f4,0x05c3d660,0x0642c678,0x05e611f0,0x03ba2fc4,0x065552a0,0x06dbb9e8,0x0494c868,0x050f8478,0x02a2c844,0x028245d0,0x05f00dc8,0x051ab678,0x0b1e8290, -0x081941f0,0x08f73390,0x08ee3290,0x09402d20,0x096141e0,0x09cacf60,0x092349b0,0x08d217d0,0x08793030,0x082ad510,0x07e38550,0x0778d930,0x07a66ba0,0x079d6e68,0x0799b6c8,0x079da338,0x071dfa80,0x095351c0,0x0278abcc,0xfde87364,0xf5c07800,0x0590e1f8,0xff36fd2b,0xf6e56340,0xf6cde1e0, -0xf7588780,0xf8837d98,0xf7dd4400,0xf81b3dc0,0xf8b7d738,0xff847e54,0x06fc4660,0xf72aaa10,0xff038515,0x09e39a10,0xfc6c7a58,0x01f476ae,0xf94c0af0,0xfba44860,0xfb0d3c68,0xfb57d2e8,0xfbd310c8,0xfc33de14,0xfc8fbf28,0xfc7ebc70,0xfc954cd4,0xfcbfc230,0xfca007f8,0xfc8bd7dc,0xfc6cc0bc, -0xfc7ad904,0xfc7d7fd8,0xfc81725c,0xfc7cc660,0xfd1a53a8,0xfac42ee0,0x02f790ac,0x076c3920,0x0cc7afb0,0x00d2e033,0x06f3b5e0,0x0c068b10,0x0c589aa0,0x0c36df90,0x0b14cb80,0x0bfd80e0,0x0c006590,0x0b9e57c0,0x06bfa818,0xff64568f,0x0bbfd2b0,0x07338c00,0x069564d0,0xf98655c8,0xf926f6f0, -0xf9a2b428,0xfa373fe0,0xfb3baf90,0xfbd560b8,0xfc5acfdc,0xfc337020,0xfc54a8f8,0xfcb82580,0xfc74daf0,0xfc47b150,0xfc09d038,0xfc127f84,0xfc3721d4,0xfc3a896c,0xfc8daf84,0xfc4e2a30,0xfd6a8dac,0x07e058a8,0x00994afd,0x0184821e,0x01c5b030,0x02e1572c,0x0092a72f,0x0032354c,0x00a01bfd, -0x02f09cf0,0x0035dd31,0xfee81c9c,0x01136dee,0xff86cbc2,0x01944744,0x01bae7bc,0xfd136eb8,0xfefb541a,0xf8ac8010,0xf5903610,0xf6791920,0xf6c64b30,0xf95ecd18,0xfb222450,0xfc38cd10,0xfc039a4c,0xfcdfd100,0xfe5294a6,0xfdfa5d10,0xfd60c9d0,0xfc689528,0xfc34be84,0xfc291c08,0xfbf67958, -0xfcd205d4,0xfbf2ff10,0x001f3a00,0x0349ae4c,0x02eb1e30,0x024e2a24,0x017776ac,0x03ba7d8c,0x011c625c,0x0490e480,0x006885c9,0x0547b9a0,0x0185ecfa,0x04497160,0x02932860,0x0164585c,0x00b78e3d,0x010e3fb4,0xfe110ce8,0xfef23fd8,0xf7a7d580,0xf5e49200,0xf6dc5050,0xf6d0f120,0xf922e1e0, -0xfae18838,0xfc271bf0,0xfc27108c,0xfd9931d0,0xff60e083,0xff4ce6cd,0xfe638dbe,0xfd1fcdb8,0xfcb88618,0xfcaa7fd8,0xfc7b89c8,0xfcb7b304,0xfcfcd3c0,0x00bcf998,0x048f5aa8,0x012a8170,0x04ce42c0,0x020bfb94,0x01e37fac,0x01be445c,0x02d49b90,0x03b8b5a8,0x02831904,0x030e8d90,0x020cf398, -0x02237c44,0xff208593,0xfe90feaa,0xff047650,0xfecb75c8,0xf49de350,0xf4e40590,0xf57c5640,0xf36ebe30,0xf9796f78,0xfeea81d4,0x00e0f0f4,0xff48a4ae,0xfac51900,0xf78dd350,0xf97c0c88,0xfbba5dc0,0xfc58782c,0xfca19184,0xf8b16ff0,0xf86ba400,0xfa18a1f0,0xfd0b41f8,0xfcb0b1bc,0xffa523a0, -0x05e69018,0x02017098,0x03710564,0x0300b650,0x038525f8,0x02b1c4bc,0x036ae114,0x0338d038,0x02a99dcc,0x022e590c,0x013cb378,0x00c0c1fa,0x015480ae,0x008a2668,0xfdb9d468,0xf904d3e8,0xedfe6d80,0xf9df3688,0x1630b040,0x1903f760,0x18ac6e20,0x059394b0,0xf9988078,0xf2884a60,0xee9d1640, -0xee278fc0,0xedc4c780,0xf3e10230,0xf7e07290,0xfa23e5f0,0xfc8454a8,0xfdd2be98,0xfd2f698c,0xffe49bed,0xff08538d,0x021ee168,0x055f6a38,0x03f572c4,0x03c61e98,0x02898e28,0x0297fb58,0x023d8dbc,0x02ea33c0,0x037c54a4,0x0460bd88,0x02c756a0,0x01c995e0,0x0072ea4f,0xfe3573ce,0xfc755068, -0xf8d822b8,0xf8cac6b8,0x0005a212,0x174bdda0,0x215add40,0x11069100,0xf707b180,0xf4daaef0,0xf5482860,0xfc79ab04,0xfab5add0,0xfc677b18,0xf9ebd908,0xf62a0230,0xf172ba30,0xed6e0060,0xf02e29a0,0xf5a2ee30,0xfdb0a51c,0xff22ecb0,0xfcc29b80,0x01b2d2f4,0x02e9d3c4,0x0147472c,0x0484a808, -0x039656a4,0x03eb82b0,0x036b34b8,0x04642498,0x03e06120,0x02ed12d0,0x012e10a8,0x00656672,0x008e5652,0xfd397cdc,0x00ebe1c2,0xfcb1fdbc,0x02905ce0,0x1770a080,0x1e0d2160,0xf9fcc1b0,0xf26311b0,0xd9a4ca40,0xf16f2620,0xff5d52e9,0x0d5fd710,0x0a45c9a0,0x0af24030,0x09aae7f0,0x0dbb3ff0, -0x0c28b050,0x06086870,0x0225acac,0xfeeb8fb4,0xfde93218,0xfc9d9388,0xfa3e4a70,0xfe7c5f06,0x05c61c68,0x01e33288,0x015a620e,0x00bc40c6,0x0079ec06,0x00b8f5fa,0x02bab138,0x04940ac0,0x0353443c,0x04bb0c40,0x03c8d510,0x01b48382,0x00f11382,0x023e7264,0x022870c8,0x07149598,0x18283c80, -0x0a9414c0,0xf6116a90,0xf81e4c00,0xf25d4100,0xf7de09c0,0xf8cd43a0,0xfe5c6e02,0x016069f2,0x077268d8,0x0c7b99b0,0x0fd42e70,0x10228c60,0x0d4fa0f0,0x0b6df7b0,0x07684be0,0x01686fbe,0xfe4cdf96,0xfa782a80,0xfd1349b4,0x0319706c,0xfe461dec,0x00a23987,0x02052b80,0x0206bdbc,0x020b6474, -0x02e4f434,0x02d41c78,0x03308ae0,0x01c21a78,0x02c2984c,0x05110968,0x06d5f848,0x078471f0,0x0a8d6190,0x0f8f27c0,0x1311e8e0,0x07380f48,0x002b66b6,0x032b16bc,0x00b92c76,0xfefdc7ec,0xfcd75980,0xfcd7e218,0x045c0990,0x080fc320,0x094c3f20,0x0917d200,0x070bc840,0x0396eeac,0x0131743a, -0x000ef052,0xfffe551d,0xff5bc043,0xff04fdaf,0x006d1ee9,0x0329b7a4,0x0250f8c8,0x02ee1798,0x02ad2e60,0x02d93be4,0x02d37740,0x01b11fa6,0x01493e20,0x018024aa,0x0120628e,0x0140414a,0x0265cb58,0x038c6904,0x04cb5340,0x05525e80,0x06d9eb38,0x05c49e38,0x05545e50,0x02bcebe8,0x0353b0fc, -0x01beeaa4,0x03295510,0x04952ce8,0x0585e498,0x0688f048,0x07a969d8,0x09ade2a0,0x0a0bb9f0,0x0ab6cf20,0x0b6f6450,0x0aca27d0,0x09d8e7d0,0x09367f60,0x0852ecd0,0x087f2d60,0x056c4578,0x022ff68c,0x046f03b8,0x04855348,0x03d35c78,0x02a1d410,0x04026d08,0x035c4e0c,0x0326f668,0x0476d2e8, -0x029a06e8,0x03a80f20,0x023eb538,0x041491b8,0x056d5760,0x07cc6458,0x05d4dd40,0x0ae371e0,0x04284f58,0x02eaaa04,0x03651514,0x030edfac,0x02e0dca4,0x02450dcc,0x020055b8,0x029115ac,0x030da5b0,0x037e7ac8,0x03fd67a8,0x046af1f0,0x04a72648,0x050a0538,0x05b3dda0,0x0640aab0,0x065f65c0, -0x06b53bc0,0x07b59820,0x05b0e7f8,0x0551a560,0x05daeb40,0x069b37d8,0x061cccc8,0x055fe668,0x043b1ca8,0x05423a68,0x06157628,0x04682038,0x03015624,0x046c35b8,0x0426a588,0x05bd7e58,0x0624f4b8,0x0430fad0,0x08273fb0,0x0142ff52,0x02fdfccc,0x02ccce7c,0x02c70fd8,0x02c6d124,0x02d45de8, -0x02ae47f0,0x03435590,0x03aec99c,0x0411ab00,0x048731b0,0x05008180,0x0599ec50,0x0560af68,0x05231cf0,0x04ef7dd0,0x0501c290,0x04aeb9f0,0x047c88b8,0x091285a0,0x0b017640,0x09c860c0,0x074a6f28,0x0aa1c6b0,0x0b3df5a0,0x0b8aaa80,0x0b1e7140,0x0a83aab0,0x0b499420,0x0b73b000,0x0b0e3720, -0x0a787e00,0x063c1970,0x0af018a0,0x0b10b860,0x03500718,0xfe36a842,0xf9f51b00,0x00a4f90d,0xff3fd414,0xff86b52b,0xff8b93e6,0xfe5ea85e,0xfd806920,0xfc4f2e08,0xfc44c938,0xfc4d0dfc,0xfca5297c,0xfd29c218,0xfd90a988,0xfdd8da54,0xfe1aa53c,0xfe456788,0xfe577c2c,0xfe824f82,0xfe97b036, -0xff8c5318,0xfa2fb838,0xf95a9098,0xfcee2b18,0xfad159d8,0xf9582ea8,0xfcb11684,0xfc5b85f8,0xfc66dba0,0xfcd2b908,0xfbfc3000,0xfbb8e508,0xfbcb8298,0xf90fc050,0xfb74df68,0xfbbefba0,0xf8709db0,0xf7a3c6b0,0xff6f7caa,0x022a9bb0,0x011d077c,0x0106f84a,0xfde5cdfc,0xfb51a450,0xf85d0d48, -0xf7a9b3d0,0xf806aea0,0xf9b6cbd0,0xfb7dcc18,0xfcb61d18,0xfd2ccc00,0xfdd55dd0,0xfe170a1e,0xfe302e62,0xfe718a12,0xff57ee65,0xfe30ef00,0xfbc54408,0xfde75f08,0xfcb38f94,0xfda57eec,0xfd80e510,0xfd8bbc84,0xfe5d5114,0xfd9920bc,0xfcd935e0,0xfe0fa272,0xff17bc0d,0xfe326dd6,0xfda82940, -0xfc79a21c,0xfb553a70,0xfe68ec74,0xfb31b2d8,0x000a689c,0x07ead398,0x04db8700,0x04d3d328,0xfe43a3a8,0xf8e9aa10,0xf3229bb0,0xf1c3f740,0xf29629c0,0xf51bf350,0xf7ea3c40,0xfa594958,0xfb4266b0,0xfcdbae14,0xfd78add8,0xfde3df0c,0xfeb9079e,0x00288551,0xfecc9bae,0xfd64fe24,0xfe8cd81a, -0xfe2b555e,0xfebecc80,0xfead8dea,0xff359b5d,0xffaeacc5,0x012572ce,0xff4232c9,0x014ea19a,0xffa7a06c,0x00303adf,0xfe61290a,0xfe090598,0xfc900f6c,0xfec78888,0xfc0eb394,0x025c8bf8,0x0c810dd0,0x08a9dc70,0x07728588,0xfd3a0d64,0xf538bbf0,0xec7b5f20,0xea728c00,0xecef57c0,0xf35ed580, -0xf88864e8,0xfbcea088,0xfc6e365c,0xfd997a04,0xfe5716ba,0xfe69b0bc,0xff94fb92,0x00cc20c0,0x00a05ddb,0x008b6cd6,0x01e4cb8c,0x018b4a20,0x01a7560e,0x01dcf3ec,0x01e6314e,0x0291622c,0x0333396c,0x03cd166c,0x029d4b68,0x02cc17a0,0x02b74578,0x00465ba4,0xfdec6a10,0xff96eede,0x01aba3be, -0xfc446a0c,0x0b93da20,0x1249a820,0x101c04a0,0x0e5b5f30,0x02e13e54,0xf9a31d70,0xeff2a360,0xedafddc0,0xea1b4ea0,0xe734efa0,0xe9f6ce00,0xecf49240,0xf238af50,0xf5dece50,0xf85b5450,0xf9a8d808,0xfce15518,0xff70f3cf,0xfeb0038e,0xfde2fe10,0xff7f6f78,0xffdc5629,0x00fbc3d0,0x01bea892, -0x01f7b8c2,0x02c97988,0x02a1c200,0x0240beb8,0x02215ebc,0x02793548,0x01d65a12,0x03af5104,0x0222c544,0x012ba97c,0xfc2b966c,0x026726d8,0x0868d980,0x01dcaee8,0xfcd6f920,0xf14616c0,0xf02b80a0,0xf33f7f70,0xfc39a344,0xf6813760,0xf01d1880,0xe59c16c0,0xe83cdb20,0xe81da0c0,0xe79a7040, -0xec95c6c0,0xf1f0e480,0xf7be2300,0xfa52e970,0xfbe86620,0xfc7ba56c,0xff2acc66,0x003c7575,0x0111514c,0x01bac3a2,0x0227d9dc,0x02415b94,0x031582ec,0x0347b8a8,0x032e27c8,0x00f47a3e,0xff737101,0xfe17eba0,0xfc7660dc,0xfd456f30,0xfdd459c8,0x01da1292,0x0dbaf1f0,0xff003b8d,0xd5644e00, -0xd3772b80,0xd3dd7780,0xf3734690,0x06cbce48,0x167468e0,0x15d1f520,0x102a1480,0x06092a78,0x035abd54,0xffbf1eb7,0xfc2ee5c4,0xfd483c90,0xfb7b5228,0xf7f771c0,0xf5fadf70,0xf5d0da40,0xf89115a8,0xfa3ab0e0,0xfbd87d10,0xfddb0558,0xff758949,0x01583d64,0x00e7767d,0x044b1908,0x0421f6c0, -0x00aa0f14,0x02c470cc,0x031a9790,0x00a6d5bf,0x0427e448,0x034850a8,0x08465340,0xff8cd24a,0xfc915554,0xd96d7200,0xd9473880,0xe92ec6e0,0xfb352758,0xfc79cfc0,0xfd513d78,0x03d9157c,0x078068b0,0x0a6b0370,0x0e52b3c0,0x08c494b0,0x0545d618,0x03a2848c,0x02edc4a0,0x0130418c,0xff0600e4, -0xff41cd37,0xfe3f6648,0xf89559c8,0xfaad2620,0xfb3059c0,0xfb5121c0,0xfcf4c44c,0xfddf47d4,0xfe0e25da,0x0223af48,0x03144f10,0x00af47f1,0x02b2348c,0x02be1460,0xfeb649e4,0x0190ead6,0xfc6ca998,0x009520eb,0xfd1ca160,0xf26f5600,0xed622440,0xf80b2c80,0xf8efa438,0xf6cff2e0,0xfc056ac8, -0x0191f846,0x04946788,0x09dc42c0,0x0a106020,0x068a82b0,0x047c0018,0x04b52038,0x05a32790,0x0533d6f8,0x0424e760,0x03b5c1dc,0xfca50ef4,0xfa888430,0xf7db3c30,0xf9e5b420,0xfc18be98,0xfe1c96a4,0xfead3112,0xff61fdde,0x01bf9ef6,0x0243291c,0x02bbeaac,0x0371327c,0x034f5fd4,0x0291b8ac, -0xffab4e23,0xfec5a10e,0xfe101f78,0xfd920a58,0xeebe2680,0xff90d134,0xf458d4b0,0xf913f828,0xfa6d48d8,0xfadd7020,0xfe2467c0,0xff526493,0xffbf18fb,0xfd8cf4d8,0xfe7253f2,0xff93cafd,0xff849fb7,0xfff02d5e,0x01f2e574,0x03eb5bc0,0x052b6010,0x065477f0,0x0300ba54,0x01bb726a,0x00194e9e, -0xfe819b26,0xffd252df,0xfe942282,0x01f30e20,0x0372685c,0x029bb100,0x031da6b8,0x03034354,0x02850110,0x0136d128,0x007c38fd,0xffd15dff,0x017de79e,0x0095b3cf,0x0134b7c8,0xfde99bf8,0xfd46f2a0,0xfded3424,0xfdf23940,0xfdf96bcc,0xfe8ba8c6,0xfe0cda0e,0xfe4b0012,0xff4b96f9,0xff18ced0, -0xfeee3c04,0xfe8cb26a,0x00c9a137,0x02f2ce64,0x052f4ab8,0x05117970,0x054e6860,0x05f6ae18,0x06ee4eb8,0x079d5dd0,0x08637f10,0x0792a148,0x07cad338,0x07b45d90,0x062b1818,0x0558cfa8,0x0379820c,0x03d36650,0x0154fe86,0x016d47d4,0x01325daa,0x01d95de0,0x014bacd8,0x00075274,0xfec9a6e4, -0xfdb05164,0xfcfc61b0,0x03130c24,0xfd8497e4,0xfe42095c,0xfe2fd624,0xfe5f4454,0xfea91ba0,0xfec78404,0xfe87895c,0xff1ca81a,0xffd60e55,0x006c5d5c,0x01388a3a,0x01cf8c08,0x03152df4,0x03420fd8,0x038f5ac0,0x0388d870,0x03533988,0x02f89514,0x031573d4,0x064366a0,0x029c0d00,0x010724ca, -0x00f0637f,0x00902ca0,0xfe5d8700,0xfeacb780,0xfe14d90c,0xfea854aa,0xfe6bbcd2,0xfecb7a60,0xff7d6bdc,0xff6c290e,0x00562cb0,0x003dd471,0xff54fa45,0xfd5e4b9c,0xfe8151e8,0xff76ed75,0xff22ecf5,0xff3d358a,0xff310cb9,0xff3f972d,0xff4f3489,0xffa258c4,0xffd91251,0x001ccaeb,0x002f1448, -0x00428bf8,0x0054f012,0x0024a684,0x0016c86e,0x001edcfe,0x00383ac4,0x0089f855,0x00057aaf,0x000621e8,0x00e055b3,0x0672c540,0xfe3f095e,0xff5a04e0,0x04a383b0,0x0494cbe8,0x048632b8,0x045ad510,0x041324e0,0x03e6edf4,0x03ab4a60,0xfef187ca,0xfd06cb08,0x04fee3f0,0xff208804,0xff31d98d, -0x0260f998,0x0545d798,0x038c21bc,0x038e8158,0x03d960f4,0x037c7288,0x029671a8,0x0212ad24,0x01c390d0,0x01aef44c,0x0190bc68,0x017469fc,0x01981d68,0x01b238ca,0x01d64e86,0x01bb400a,0x01ba8de8,0x01b3d986,0x01d35ef0,0x01a621a0,0x019fdd1c,0x03a7d6e4,0x01e5cfda,0xfbb895b0,0x042818a8, -0x026328d0,0xfc6ccf7c,0xfce0b978,0xfd067568,0xfd15bdf8,0xfd9032a8,0xfdb039c4,0xfdc0bb64,0x02b92148,0x052d9250,0xfc3eb580,0x02da5cf0,0x030419dc,0x074c4ad0,0x06319108,0x06ccd000,0x05cd8b50,0x03875830,0x02087228,0x016af514,0x00c79d1a,0x00992ec0,0x0086290f,0x00c161e1,0x00e3c845, -0x012bc908,0x00f88429,0x0102e91e,0x00f31bf4,0x015d7788,0x00c42f73,0x01d8beb6,0x005fee72,0x01325e3a,0x0276881c,0x014f0d46,0x016f00f8,0x02afe1a4,0x02ce9120,0x03cca1fc,0x0377f338,0x03ad6df0,0x02fb7224,0x026d3c7c,0x03625ba0,0x0323fef0,0x03e11150,0x04f51f00,0x08c67ad0,0x09155640, -0x09a8f4b0,0x0aac79a0,0x0949fa30,0x04564300,0x0193b0ec,0x0022ee0b,0xff269554,0xfe247d50,0xfd77117c,0xfdee3110,0xfe95040e,0xff86a57c,0xff534b52,0xff976eef,0xff94ad4c,0x00099c5b,0xff44792a,0x0028ef90,0x017e61cc,0x00716b35,0x005c6ca4,0x010b76a6,0x01611108,0x01943bb6,0x01bb36cc, -0x025f26e0,0x02dc1f8c,0x023d6438,0x02c6d1a4,0x02cee6f0,0x0349bbdc,0x03ac6974,0x055c2e88,0x074327d8,0x0bcb9630,0x0d689b20,0x0c435e40,0x0ef44ce0,0x0ddfd410,0x067a2178,0x00fd6f75,0xfeb89c36,0xfc7ffcf0,0xfc088fc8,0xfbfdad68,0xfc787b34,0xfcfd30e4,0xfe2b5fae,0xfde1ef18,0xfe245884, -0xfe4d5efa,0xff0ad850,0xfd8bb7a8,0xfeb497ec,0x0168a5f6,0xff124242,0x00d3cda1,0x00c93318,0x012a722c,0x007b119f,0x022914e4,0x029fb138,0x02b3b1ec,0x026a20b8,0x024678f8,0x028cc708,0x04404468,0x06b8ed48,0x06fc75e8,0x08a30a60,0x098532e0,0xffe685bb,0xfad131d0,0xff54dfd2,0xfc011a60, -0xff86b8d4,0x03d356d4,0x09b1a8c0,0x03e286d0,0xfec60028,0xf6584da0,0xf54aaf10,0xf5c01a50,0xf6759ab0,0xfaef86b0,0xfccc98c8,0xfb38bff0,0xfd23618c,0xfc543018,0xfe3965aa,0x00502444,0xfe1e10ae,0x00d5975d,0x006a101a,0x01966648,0x020a65fc,0x027bcab4,0x02a714e8,0x02944ba4,0x0398e0c4, -0x0415a200,0x0460c578,0x024cb0e8,0x02e67fac,0x025ac958,0x06232310,0x048b6d28,0xf8643ad8,0xe3a959a0,0xe62b2b60,0xf23ca950,0x041eede8,0x0ebdd2e0,0x16ef7820,0x161a1a20,0x13fc83e0,0x12f1d380,0x0a675830,0x05ab41c8,0x0411a848,0x01939730,0xff70fb3a,0xfd733de0,0xfba03750,0xfa9e2240, -0xfca502b8,0xfd529c0c,0xff20620d,0x009ae868,0x00ace122,0x01cd080e,0x02894184,0x03a20c1c,0x03b4c77c,0x0260d7d0,0x01866af8,0x0070abcb,0xff5b7e9e,0x019d9a50,0x0151f3ea,0x01f2614a,0xfe086080,0xef6e3620,0xe46323e0,0xff4316ed,0x13ac25e0,0x2c9cf940,0x1fc18aa0,0x1850c540,0x10edf720, -0x13acfce0,0x1520bf60,0x1da05aa0,0x22c59f00,0x26e3bb80,0x28530640,0x23be7f40,0x1c64b760,0x11b35160,0x0a690950,0x068e8e90,0xfe250a2e,0xfb42ef70,0xfb3fac68,0xfa8e1ba8,0xfd432084,0xfe3a53fe,0xfeba7502,0x02ba6cc4,0x03ab3f24,0x00219385,0x03952edc,0x03362064,0x001bed64,0x00ad6336, -0xfcf14364,0xfb6499a8,0xf9e35300,0xec24ed80,0x0440e0f8,0x29a647c0,0x278c7580,0x2e3e76c0,0x1a645560,0x12e384e0,0x0aa09230,0x135d96a0,0x18ba5920,0x1ba9e8e0,0x19c14a20,0x19939ca0,0x1b206620,0x15daad00,0x11e04d20,0x0f7076b0,0x0b2bd8e0,0x096058e0,0x03c7cfdc,0xfb6f7d88,0xff8969da, -0xfeeac800,0xffe3fff5,0x010347dc,0x00bc390c,0x02f56d24,0x02df0758,0xfef31cbe,0x01a0915a,0x00e05c52,0xffa23964,0xfe7ed032,0x006058b5,0xfc33f2e0,0xf8885e68,0xff75b4aa,0x105493c0,0x19f8e420,0x185eb780,0x1943b800,0x0b7e74a0,0x0533af08,0x017db87a,0xffdf7354,0xff801a3d,0x01cf60fc, -0x0607cd98,0x0787d970,0x07560688,0x0961eb60,0x0a577710,0x0b1d0000,0x092baf60,0x08a6fdf0,0x05cff428,0xfe261456,0x02713340,0x01708fd4,0x0050ba0b,0x018459b8,0x01f6e078,0x02636f1c,0x02513d08,0x03033a2c,0x03ba93f8,0x0312b6cc,0x01fbbc90,0x0102515a,0xff7cac24,0xfc4f52f4,0x05903178, -0xf9427078,0x0a8440d0,0x0b3312b0,0x07826e38,0x04826710,0x03797d8c,0x035f2d70,0x023b73fc,0xfd86b2d0,0xfa951640,0xfa4ca498,0xfbe87bd0,0xfeea4292,0x0185a03c,0x03ead17c,0x0432d930,0x0396312c,0x03a095bc,0x03ed06b8,0x03c5a058,0x032a6600,0x043e6c60,0x04db7fa0,0x04ad9370,0x030107bc, -0x02780154,0x039f42f8,0x03b29c30,0x026c599c,0x0271eacc,0x01f623da,0x013c3026,0xffc7c1f6,0x00ae09f5,0x0123a332,0x02d720f0,0x02902ee4,0x00499826,0x00beca95,0x01401fda,0x020193b0,0x022c2390,0x01571cd0,0x0081fd31,0x0112f6dc,0x014dbfd8,0x0116ec48,0x0035a36a,0xff1fdd9c,0xfdeafc38, -0xfe532e8a,0xff0b6b19,0xff4fa5e4,0x005d0829,0xff6619bc,0x02713370,0x059ae230,0x02bbba54,0x021aa6a4,0x01e3836a,0x0298b038,0x0100b22a,0x013c65ac,0x012cc066,0x0130e6de,0x0129f040,0x00a98c2e,0x00fe2c80,0x011dc2b0,0x0159b264,0x013a0a9a,0x01f99c58,0xfd3312c4,0x01b58fd0,0x01cc7e4a, -0x01c40a40,0x01a86be0,0x018e62de,0x01ee0a88,0x0241c0b8,0x01f712de,0x0194324c,0x013c25a2,0x00cf2489,0x009f2040,0x006db07b,0x005beca1,0x001f1103,0xffda2b78,0x000ecd8d,0xffa81f30,0xffc1ac84,0x02513844,0x01ba1324,0x029bfb6c,0x015cc4b2,0x021a7bb0,0x02d92c0c,0x02e24d4c,0x02e05158, -0x02327464,0x0238aa1c,0x0199aa68,0x00d66cb6,0x00ee6e4e,0x001f62b5,0x004a35bf,0x0093a155,0x030c5ec8,0x022c6d00,0x0163abee,0x01a6c77a,0x01a26346,0x01b6b844,0x01a1792a,0x019e40f8,0x01329afa,0x00f0683d,0x00bd9855,0x009e3ee7,0x00723707,0x00341b81,0x00619ff6,0x008d9d33,0x00af1b70, -0x00b1e137,0x00f05de9,0x006f4fcd,0x0232cd0c,0x01552c38,0xfea0d066,0x03118e40,0x01ea77ec,0xfdbb894c,0xfdb415c8,0xfdd0b920,0xfdeb7fc4,0xfe094ca2,0xfe2a26e4,0xfe4cfc24,0x013a0ad4,0x031179a0,0xfd848560,0x0125f330,0x020f845c,0xf9e29458,0xfc4f0404,0xf7c09870,0xf9b8f618,0xf8a618b0, -0xf8c931f0,0xf8e5a5d0,0xf94aa6f0,0xfa080148,0xfa2350a8,0xfa459008,0xfa582270,0xfa3e7258,0xfa2d1078,0xfa257478,0xfa1c1188,0xfa1f5d08,0xfa364d20,0xfa041f98,0xfa7be368,0xf9574b48,0xfc25df14,0xfff5fa0b,0x06ac7a30,0xfb229a88,0xffc78157,0x064b84d8,0x0655d250,0x064aefa0,0x05a1c918, -0x060af618,0x061f7ce0,0x05cc4da0,0x0010f08f,0xfa4a5b60,0x0782ef50,0x013569a2,0x05eeba10,0xf69efe10,0xf6596d20,0xf5b53250,0xf58ae4e0,0xf592b770,0xf677f220,0xf8ad2310,0xf9396338,0xf9c29078,0xf9ddb0e8,0xf9c08af8,0xf9d47f70,0xfa0bf530,0xfa05c368,0xf9e0ec48,0xf9d708d0,0xf9663b08, -0xf9a6d890,0xf97e9fb0,0x007f3d7e,0xfc5fcd74,0xfc3b9778,0xfdb0f328,0xfe75347c,0xfcbddd70,0xfcb26464,0xfc62e088,0xfdc03ba8,0xfc6ae920,0xfc1163cc,0xfd906f20,0xfd06eda4,0xff382d4c,0xffb96b87,0xfb544f30,0xff45ac41,0xf764db30,0xefe1e7c0,0xf0b9c770,0xf069ede0,0xf1924bf0,0xf442c2c0, -0xf8dbe690,0xf8b0db80,0xf87a8cf8,0xf85f4d98,0xf81d6838,0xf80aa000,0xf887f588,0xf8a90e50,0xf8ef1d18,0xf952fba8,0xf8e70ed8,0xf8ee0e80,0xfac98c18,0xfc43e2b4,0xfd5c286c,0xfda3f044,0xfdb8ebc0,0xff70ba0a,0xfe9d863a,0x00cd8ac9,0xfe4a455c,0x0085c7c4,0xff6497eb,0x0102111a,0xff5d71ff, -0xfff62070,0xffd0173f,0x014e6556,0xfcb819e8,0x02abbcec,0xf4890120,0xeb946a80,0xec9319a0,0xebd6f0c0,0xec9531a0,0xef8ff780,0xf71611b0,0xf78b9150,0xf72db0b0,0xf682c860,0xf6c98270,0xf7b9e1a0,0xf980e5c0,0xfa495d88,0xfa2a7608,0xfa218298,0xf8f8f580,0xf9e26788,0xfa7ccc38,0xfcfe80dc, -0xfd65c458,0xfe908c6e,0xff292a9a,0xfff78b10,0x00382e16,0x015c1440,0x02c15c48,0x01bcdd60,0x02359b80,0x01aa433c,0x0158234c,0x0180a420,0x02b42450,0x02bfa0e0,0xfe70f94e,0xf39c5700,0xe60192c0,0xe3b04220,0xe2aecb20,0xe81eaea0,0xf152e2f0,0xf781bea0,0xfc3fe1d0,0xf978a1c0,0xf9232508, -0xf920bfd8,0xf554c670,0xf363d070,0xf199fe30,0xf0f972c0,0xf285e090,0xf604d470,0xf6759260,0xf7923950,0xf7a1a9c0,0xfbe48e58,0xfdddaa2c,0xfeaa7dbc,0xff9e3f0a,0x00a0cfc5,0x01d534de,0x02491c34,0x025c9aa8,0x01fc7800,0x0179f266,0xffd12801,0xfe35ecf4,0xfa84e730,0xf9f05408,0xf77e35a0, -0xf6c9a010,0xf364f3f0,0xf2082710,0x04245160,0x097369d0,0x0fae3580,0x01b194d0,0xfa4f1ce8,0xf6e69d80,0x023a3524,0x0e8f81f0,0x1c367000,0x1d408b60,0x1d7e15e0,0x1aa3c280,0x13a6f7c0,0x0b442d50,0x02e179b8,0xff0d885d,0xfe41934c,0xfd2cf2d0,0xfae04cb0,0xfc311938,0xfd13f388,0xfee74fdc, -0x0063d583,0x00cec50d,0x02ba5588,0x02f58e1c,0x0180e486,0x0140c9de,0x00d296d1,0xfffaeb08,0x0085cf87,0xfda5e07c,0xfbbc44e8,0xf8935ad8,0xf7d159e0,0x09141f70,0x1a0f52e0,0x0d5ff480,0xfd9d90d4,0xf1b358c0,0xf0a85420,0xf3a912d0,0xfbf0b5e0,0x03cfa4ec,0x0541dcf8,0x0162da9a,0xffa5812f, -0x005f81e8,0x03d211a8,0x0670a7c8,0x0860b8d0,0x05a8eb18,0x0367c8e0,0x028cc180,0x001cbd11,0xfeaf402c,0xfc761ef8,0xfcb4ad0c,0xfd04e6c8,0xfd5edb44,0x00ffca3c,0x021a9cbc,0xff0ee6a1,0x022a6b90,0x00feb3c2,0xfe5f740c,0xfc3c61ac,0xfd8f92a0,0xf9ec8880,0xfd6f87bc,0x0eda6960,0x11f9f2e0, -0xf2b9e2d0,0xe6a944c0,0xd73f70c0,0xe24fa600,0xe7f2ee80,0xee84b020,0xe760aca0,0xe3e3c200,0xdfbbb180,0xe99779c0,0xef473cc0,0xf1a78a00,0xf3ba88a0,0xf6d83130,0xfafa1528,0xfbd4da68,0xfcc59498,0x026eeac0,0x0385d3e4,0x00d81af3,0x024711d4,0x01b5d0aa,0x02465844,0x02286c84,0x0293cc74, -0x024cf704,0xfeacf974,0x0190ebfc,0x01b7b610,0x0144ac22,0x00ec8e32,0x004e78c9,0x0182190a,0x05a4d420,0x093af830,0xf6967240,0xe47ae380,0xe9156d20,0xec31a720,0xeeb9f840,0xed0054c0,0xeabf0480,0xe824ad80,0xe72f31e0,0xe591ed80,0xe68f24a0,0xe8584ac0,0xec3b7940,0xf0862c00,0xf4ebc130, -0xf8061530,0xfce64958,0xfdeec810,0x01d7a08a,0x056730a0,0x0256a444,0x0331faa0,0x0226a234,0x00ac6960,0xff290d88,0x00695748,0x0073f304,0x0160b7b2,0x00d3fc4d,0x001dab61,0xff1292dd,0x0156032c,0x02991124,0x04945b80,0x02451b88,0x0a37c250,0xfb734de8,0xf59bf610,0xf8a49bc0,0xf9965fa0, -0xf836ec10,0xf7deac40,0xf84638b8,0xfdcf2588,0xff3f503b,0xfdb56800,0xfb4d8900,0xf77d5be0,0xf34fce60,0xf25cfb00,0xf3682eb0,0xf60243f0,0xf9f51760,0xfa51ea60,0xfe6bf7de,0x02ab4858,0xfdf69adc,0xff0a5e22,0xfd9dbd58,0xfeb0c54a,0x002b1396,0x007c025f,0x0105728a,0xff6c20e9,0x00e75f31, -0x011be104,0x009cdf39,0x0004dff7,0xfeb6e920,0xff64fc14,0xfe7a5510,0xfe12223c,0xfe8e6dde,0xfbf51f38,0xfa0aed80,0xf7144d70,0xf7d4d730,0xf82f8240,0xf803fd38,0xf8a9fe98,0xf96a4bb0,0xfaad6440,0xfb375cb8,0xfc14aed4,0xfd0f2860,0xfd8c4ea8,0xfdd5e254,0xfdbe0d00,0xfc171cb4,0xf9bd75f0, -0xf9605598,0xfc831728,0xfd4529a4,0xfd601280,0xfdd45290,0xffd85fc2,0xfeaa85f8,0x00d9f9a3,0xff09354e,0x01d7ccac,0x001edb6a,0x00df3e95,0xffd5c607,0x00822257,0x00fb1165,0x021f4358,0xffc7834f,0x02bfcf58,0xfc0a4c18,0xfbb08b00,0xfba8bd78,0xfb5bfbe0,0xfb083fb0,0xfa7e22e0,0xfa2891f0, -0xfaaa9c80,0xfb1622d8,0xfb955648,0xfc12c4b0,0xfc844404,0xfcf4b0f4,0xfc8ffbc8,0xfc577484,0xfc608364,0xfcbfce7c,0xfd5dc760,0xfd1e4f60,0x010d5eee,0xfdabd848,0xfda2463c,0xfed5abe4,0xff4bcfe6,0xfdd4ccf4,0xfd3862d8,0xfd2d00a8,0xfe848d92,0xfcc37fa8,0xfcb53650,0xfdbc0e30,0xfd58e338, -0xfe998ae6,0xfdfb9dd4,0xfc936598,0xfd60f38c,0xfa201900,0xfb672560,0xfafe9630,0xfafb4370,0xfabfd7d0,0xfa9abdc0,0xfa48bc18,0xfa903090,0xfab239e8,0xfac87900,0xfaec8398,0xfb0f8d88,0xfb54c488,0xfb67fe78,0xfb8635b8,0xfb8636b0,0xfb669658,0xfb841fe0,0xfa78fd00,0xfd4c875c,0x0083856f, -0x05b98968,0xfc603804,0x00850cfb,0x065a2508,0x06280918,0x05bfe3c8,0x04e632e0,0x052dacb0,0x04f14918,0x048520a8,0x00671b2a,0xfc0f5698,0x05530ed8,0x00e48ea8,0xfa4738e8,0x03854534,0xfd02bc50,0x04a269f8,0x02422a60,0x02ca241c,0x024db14c,0x036343fc,0x03bc8ba8,0x03d8cd84,0x03f28d18, -0x04156a28,0x042141f8,0x04484c20,0x0451ce58,0x04719220,0x044a6da0,0x042cfe98,0x04083778,0x03e0a138,0x0334d938,0x057c6398,0xfdf28f94,0xf9e60308,0xf5cd93b0,0xffa4876f,0xfa4b1e58,0xf6954f30,0xf65875e0,0xf67be880,0xf754f560,0xf6745b70,0xf64c0690,0xf6766840,0xfa4aece8,0x0040dd80, -0xf665bfe0,0xf8e400a0,0xf640f080,0x00afc61c,0x0141de8a,0x00788988,0xfff54631,0x030aa214,0x0476be48,0x04b79098,0x051a7380,0x051ff6d0,0x0509a168,0x059fafa0,0x0622e120,0x0695c0f8,0x06699b98,0x060f6800,0x05cbff88,0x04f3c688,0x0505aa60,0x04037218,0xf99a7850,0x00953eec,0xff991228, -0xff37f231,0xfe7f4530,0x00f6aed5,0x0165b81a,0x01303f0a,0xff18d68c,0x01acf9d2,0x0293ec24,0xffd6fd06,0x0004e873,0xfd4751c4,0xfd030fe0,0x00ad50f9,0xf8c3f048,0xfcc0c0d4,0x00edd085,0xfead07c6,0xfdadbb44,0x03fd52d0,0x063af570,0x06e97cf8,0x073b3630,0x07c89e70,0x07e48688,0x08fdd260, -0x0957f170,0x09f7a4b0,0x094332a0,0x085f72c0,0x07bec9c0,0x05d5eef8,0x068c2eb0,0x0274f6f0,0xfe519c0c,0xff5e1f34,0xffad5ea8,0xffdee726,0xfe4045ec,0x017e74d6,0xfefa6a1a,0x02695f60,0xfe7d84ee,0x01a63e1c,0xfebb7904,0xfed2194c,0xfe32fc54,0xfe40ae02,0xfbce0118,0xfc820180,0xf422c020, -0xf84c6a38,0xfd86a914,0xf8981768,0xf661ab70,0x00e43d9b,0x068af370,0x07c9ed38,0x083f9e40,0x071ff5a8,0x061f1718,0x083db6c0,0x0a83af50,0x0c453830,0x0bb9cac0,0x0ac79360,0x0a1a6e70,0x0840cda0,0x07e415d8,0x043ab780,0xfd46ca8c,0x01a50b9a,0xfe351b52,0x00719a00,0x00c13e13,0x01b796b4, -0x01dc17a4,0x01fcbe3c,0x02b66818,0x02372d0c,0x028dd1c4,0x0043fde8,0xff350a5c,0xfc8d2a60,0xfbc92098,0xfbaaf2f0,0xf62d5940,0x08b77ad0,0x11535400,0x102e2540,0x13f7cc80,0x128b6700,0x0f1d5910,0x09eafe70,0x11070c40,0x16d24f80,0x1dd32560,0x1c791ba0,0x19f28fa0,0x16c13500,0x13fd4900, -0x0ff1f050,0x0bb8f770,0x06dd4bd8,0x072468e8,0x03ee5e38,0xfcbf08e0,0x01e45d90,0x002d5b10,0x0131e290,0x0135996e,0x0208b4a0,0x02f0d53c,0x02af55c4,0x017c593c,0x00f862b8,0xff53a7e6,0xfc9e43f4,0xfeef6e7a,0xfc603364,0xfcbaa3d8,0xf9a0f788,0xfb383510,0x093228c0,0x16ebf800,0x11f9c260, -0x09d80f90,0x08023d90,0x0771d490,0x02c12680,0x031d0d08,0x04a3b168,0x04dd13e8,0x0cf49600,0x10dc0220,0x129966e0,0x110f1a20,0x0ff47b20,0x0ec56ab0,0x0c5f6560,0x0b2aee40,0x05b3dae8,0x00ad07b5,0xfff95bec,0x001900cb,0x01bb1074,0x02420ddc,0x01421cd0,0x0289b828,0x02bd82c0,0x01d8a62e, -0x0135a106,0x007e10f6,0x0133123c,0xfe6c2f64,0x00c99239,0xfef79e26,0x0313580c,0x0d100260,0x0f2dc1e0,0xf5fc8aa0,0xf08a2470,0xf2cf3ff0,0xfe3c3244,0x042ed768,0x05730a10,0xf93512e0,0xf17a70d0,0xeaba6c00,0xed4ee7e0,0xf00e4c40,0xf48d99e0,0xf4bdb620,0xf5b0a4e0,0xf6f9ea40,0xfac82390, -0xfdde9434,0x01f46256,0x02d2dc84,0x02be4b14,0x01b5a6de,0x010e3030,0x00c6da9d,0xff5b2b9e,0x0182514c,0x025255c4,0xff2666e1,0x02b42338,0x024b8a9c,0xffb861f4,0xffc85614,0x03195e18,0x02cb7cb0,0x0548ade8,0x00485134,0xf0cc1bd0,0xf72b2e00,0x025715f4,0x0be68660,0x081419e0,0x0157407a, -0xfad734e8,0xf8463ff8,0xf4c5e3d0,0xf31171e0,0xee2e2480,0xeb98a220,0xebac7240,0xef689be0,0xf3141dd0,0xf4ee98d0,0xf7a55010,0xf97094e0,0xfc4fe398,0xff6adb7b,0xff24f85d,0x00d005dd,0x0071121a,0x00b9095a,0x0142629e,0x01c17e80,0x01abb2a4,0xff2e0645,0x01dd75d4,0x023f1a34,0x022bf62c, -0x01d3d196,0x01011802,0x002a517c,0x01d3a990,0xf1b4a390,0xfa500610,0x08a804c0,0x060326c8,0x05cb27c8,0x09eb3ba0,0x0baf5f10,0x09da99f0,0x0a5bdd90,0x09436b70,0x0827dd60,0xff13c844,0xfa80ebe8,0xf955c230,0xf50c98c0,0xf3d9c7f0,0xf4665560,0xf6d87e80,0xfa278f20,0xfc2aec4c,0x00192a9b, -0xff615777,0xfe54996c,0xff421d79,0xfef1d2ba,0xffdea94b,0xff993381,0x0094a1f4,0x00474685,0x0147c98c,0x00aeb965,0xffc0a997,0xfe4e54de,0xfd792ce0,0xfc914884,0xf72fd080,0xf6c786e0,0xfbb87388,0x01d18d52,0x007ed9b9,0x030837d4,0x025a54d8,0x015964ca,0x012e19f0,0xff1dd817,0xfe4e3108, -0xfddaa8b0,0xfe4f5b1e,0xff9e5479,0x01b31ab2,0x02200510,0x0199568e,0xfefe2798,0xfcd83d74,0xfc1a7ecc,0xfa97c8a0,0xf98785e0,0xfb1959b0,0xfb5f4310,0xfce6f92c,0xfea37b2e,0xff92ab7e,0xffc4200a,0xffc731c5,0x00c7ca4a,0x01066688,0x01006944,0x006516ff,0xffb3b1fb,0xfefa42f2,0xfdb673dc, -0xfda66780,0xff40080d,0x01001436,0x0254bd24,0x01b8cf48,0x0290b2d0,0x015e08a0,0x01673e28,0x01cb3e86,0x007547e3,0xff9740ca,0xfe6ea5c6,0xfe455682,0xfdd6914c,0xfd927e60,0xfd30c924,0xfcf0113c,0xfd62e014,0xfd65eb58,0xfe8a8572,0xfd27e70c,0xfb47f690,0xfc40de9c,0xfcbca52c,0xfda5c718, -0xfd738240,0xfe816fe8,0xfe7b615c,0x006bbfdf,0xff83ab63,0x00bb02e0,0xffc37a0d,0x00b781b1,0xffaa791d,0xfeb71370,0xfcf6e5d4,0xfeb0f0ae,0xfa9e8af0,0xffbd2a9d,0x0065f34e,0x00b03f4b,0x014d79a6,0x01df84ac,0x023000a0,0x026c762c,0x01940724,0x00df2d72,0x00359401,0xffa9225a,0xff1a24a3, -0xfe7a4bfa,0xfe8f9e1c,0xfe76b3f2,0xfe3b2c42,0xfde2a4a4,0xfdb37320,0xfdb96d44,0xfc0d8710,0xfe5177ae,0xfdd900f0,0xfd6cf5e4,0xfd727658,0xfe72b64e,0xff154288,0xfe885e92,0xfdb4f368,0xff45af48,0x004d5589,0xff338455,0xff941279,0xfe457302,0xfe6dca20,0x00299e4e,0xfcb72434,0x01bd4b2c, -0x00b5fa8a,0x0103f432,0x011a1f4a,0x013fc6bc,0x017680f2,0x01e6b09c,0x019c5ee2,0x0174a0ac,0x013c1ea6,0x00e642d9,0x0094a79e,0x002a63e4,0x001a818b,0xfffd5f77,0xfff1efe4,0xffeef33d,0xffc0695e,0x00614457,0xfc67c190,0xf9eb2558,0xf8b2bc08,0xfd98fdb0,0xfa08e8e0,0xf85f25c0,0xf84569d8, -0xf8885fe0,0xf90de178,0xf8826368,0xf8668d10,0xf8b40ce0,0xfa8a6bd8,0xfe74b6b2,0xf889c3a8,0xf9daf570,0x00c663da,0x033115cc,0x05938a80,0x027a8f34,0x031bc1e4,0x03795c80,0x036852d8,0x03ae4098,0x03d73e10,0x04557510,0x03db0c80,0x03a9901c,0x0372d8f0,0x03658ebc,0x035594d0,0x03345f50, -0x0325057c,0x030353f0,0x02cdf3e0,0x02d5c404,0x02cc7f5c,0x01f2f160,0x05957368,0x06046078,0x02c99d44,0x0503f0d0,0x05fbbbd0,0x033332d0,0x03724d14,0x0383e2f4,0x032636d0,0x03e8a8fc,0x03e6827c,0x039eddf0,0x05daf480,0x04f76e30,0x028236b0,0x05e16020,0x032434ac,0x0453b478,0x03a97980, -0x04846960,0x04794678,0x052160d0,0x05927c28,0x068815c8,0x059478e0,0x04ffff68,0x04296720,0x03a3bbdc,0x02fca5cc,0x027c71b8,0x02580ad8,0x025c37b8,0x0219ad50,0x028bd168,0x01f467d8,0x02fc9854,0x04fe0090,0x02ded180,0x0405bc78,0x02e14038,0x0319a2b8,0x03d4bb78,0x0337b2c4,0x03dcb398, -0x0442cab8,0x03d25fac,0x033325f8,0x02f6748c,0x0300ccd4,0x03354194,0x034e972c,0x02998f40,0x03331298,0x03f06294,0x060aea80,0x07723258,0x07256bc0,0x0841a950,0x087dc070,0x0a5fa5b0,0x0922d6d0,0x08be97a0,0x079fa118,0x06e91df0,0x063a36e8,0x051c82f8,0x0456abf0,0x03a45f44,0x024dc160, -0x02c7fb30,0x01310fcc,0x02d87a74,0x044376a0,0x022c6b7c,0x02600684,0x01778b26,0x02173684,0x02805cd0,0x025eea98,0x0154a7a6,0x02a8e9f0,0x020a504c,0x02ffdc54,0x0195d994,0x01e12afa,0x01a96520,0x021f272c,0x02d3c268,0x017a6768,0x05691888,0x0732a040,0x07f798d0,0x07b5e9a0,0x08fb6270, -0x0a4670d0,0x0c7af4e0,0x0aea80e0,0x0a59e1c0,0x0810f400,0x05b67c48,0x0306cc58,0x010dd9e4,0x00746a47,0x0031fb74,0xff333ce0,0x000ad9c0,0xff1dc982,0x0156af7e,0x0345ee94,0xffff075e,0x01684ba2,0xffa3c56e,0xfff3e81d,0x00ebfc2b,0x013a4cae,0x01b258f2,0x00bdf5e8,0x02553fd0,0x01ad141c, -0x005d8f58,0xfff604df,0xfffc1748,0xfffebf76,0x011a3ee4,0x0c1b0180,0x0f0fef60,0x0e372790,0x147ec200,0x15b28b00,0x13928920,0x12af4fa0,0x1238be60,0x12aaea00,0x12171b80,0x104f1840,0x167360a0,0x18526dc0,0x18231680,0x128d0180,0x0edcb960,0x0be22440,0x0955c0c0,0x047042d0,0x04161c80, -0x04521178,0x007791e0,0x01a2b752,0x00fc5fd0,0x01b7c600,0x020aa16c,0x0243da10,0x0207fbe4,0x00ea229f,0x01566c96,0x01bea08e,0x0292aa58,0x04896bc0,0x060f4c70,0x075bc3c0,0x08708310,0x0b6b3ac0,0x07f11a68,0xf58ea4e0,0xf30c0450,0xf3237400,0xfe788706,0x058dbc90,0x0a7926e0,0x0178c25a, -0xf8fed808,0xf2ac4340,0xef988e60,0xee668be0,0xf0ef12c0,0xf23ca4d0,0xf3fc4210,0xf3565460,0xf86ccca0,0xf9fdf9b0,0x013ecaa8,0x069f7508,0x0401fe08,0x03dee2d4,0x014c1f7e,0x01544832,0x02180d8c,0x0226637c,0x02808b88,0x01949b66,0x0161a47e,0x0135ea84,0x0084e734,0x018f94ea,0x023881f8, -0x0434fb28,0x04608b88,0x03c743e0,0xf66ee320,0xf83facb8,0x026fd6d4,0x0808c4a0,0xfcd8af50,0xf329e050,0xefdde660,0xf1498c50,0xf1715910,0xf5fcfe20,0xf5594db0,0xf56624d0,0xf5f06e00,0xf23f8d00,0xf32c5080,0xf6043590,0xfa301da0,0xf9ec93a0,0xfc89cb08,0xffa0a9c2,0x0035fd86,0x03473bec, -0x02220048,0x020fecac,0x01d9cea4,0x0251d36c,0x02913088,0xff84d3b2,0x034a7bb4,0x0382304c,0x0191487a,0x046fe0e0,0x02ce63a4,0x05ee3a48,0x03bae2cc,0xf9a0e180,0x03cd13d0,0x0ee8b080,0x0cdfe9a0,0x0951e320,0x04651d38,0x0611bbf8,0x05799dd8,0x0b155fe0,0x0ef59570,0x119dfd60,0x0c2fb510, -0x0821e350,0x05612e48,0x020bbc74,0xfed19058,0xfbd6c790,0xfadf0680,0xfab9e328,0xfc68cc84,0xfecf3be6,0xfef7005e,0xfe1ed00c,0xfe54cc02,0xfeea81cc,0x009ca3a1,0x002f9b40,0x012b6bea,0xffdade82,0x01bb3848,0x01817290,0x003dfc8c,0x0092d04d,0x00d73c38,0x008b1696,0xfc333134,0x06931c40, -0x09095f40,0x074ee110,0x06c0c780,0x038140a0,0xfe50b900,0xfcb80d38,0xffcfa08d,0x00964191,0x01f130d2,0x0331bd9c,0x0900f110,0x09dd9900,0x056fb1d0,0x056c25a8,0x042b1db8,0x02036f40,0x004fc6a7,0xfebcfbcc,0xfcfebdc4,0xfc226258,0xfbf5d740,0xfd6b2d4c,0xfe908b70,0xffe0fa46,0x009ebbda, -0xfff88646,0xffa9a745,0x009042b1,0x016ab9f2,0x02cb3d40,0x046fc6c0,0x02a0bf68,0x0158a306,0x01123b5c,0x05faccb0,0x014f354c,0x06b64950,0x04c84740,0x03e60858,0xff7d3593,0xff3be60c,0xfedc1dd8,0xfe7649cc,0xfdfacb00,0xfeb827d8,0x00fe0c14,0x01e57eb8,0x032f538c,0x04012100,0x02a539a4, -0x00c61ae6,0xfe8dda06,0xfd7623ac,0xfe5c5cde,0xfef7e720,0xfd98bcb4,0x0015b313,0x01d48a42,0x007f7042,0xff833ea3,0xffc77af5,0x001de23b,0x006da5ba,0x001698c6,0x0038cad2,0x00547a5f,0x00c080e3,0xffeeea15,0x003125aa,0x0070cfbb,0x00e51462,0x027e8538,0x00075633,0xff761ec7,0x010651ae, -0x018ad230,0x01fa1722,0x018f8d52,0x0104237a,0x00d7170c,0x004a90f1,0x00099929,0xff95323c,0xff4c288c,0xff407365,0xfe807e24,0xfde175e8,0xfcfc3754,0xfdf9e2e0,0xfe64e95c,0xff3a5c02,0xff7612c9,0xfefe4016,0xff20a4ad,0xff52d6c9,0xff37f846,0x00399262,0xffd15d50,0x0016c97a,0x011d203e, -0x0039dc60,0x00fa7837,0x00b4d81f,0x011d8dd6,0x0199af9c,0x022ed664,0x01cc6c8a,0x014f4602,0x002653f8,0xff8eb712,0xff87d698,0xff2ea219,0xfed6a43e,0xfebd3e70,0xfec35d1c,0xfeea8032,0xff14c39e,0xfefdcbbc,0xfed65142,0xfe983aa2,0xfe57be98,0xfe5eff10,0xfe882884,0xfe934f20,0xfe7cd4a6, -0xfe46015a,0xfe2c0d5a,0xfddf0268,0xfe95f3da,0xffb0fb91,0xffe2ec47,0x002de825,0x00e3f68f,0x009459e2,0x012d30ec,0x015b9ef2,0x00d0df81,0x00165a9d,0x00b9eb03,0x005fb42d,0x00b3a30b,0x00fd87f6,0xffd4835e,0x02d173d8,0xff2ea3d9,0xff876bad,0xff7d11ec,0xff633097,0xff714a07,0xff646885, -0xff429bb0,0xff40aff9,0xff3f1ca3,0xff59b020,0xff831804,0xffb3e102,0xffdef3d7,0xffdb2975,0xffcc0eb7,0xffc7ef7a,0xffc53ba7,0xffc4c265,0xffa46774,0x01fc5382,0x02908a00,0xfffc7e98,0x021819a0,0x03203fc0,0x00b753f3,0x00ff657d,0x0111d512,0x0104a24c,0x019e9138,0x01d6ff0a,0x01ea93ec, -0x03681b94,0x02378f18,0x0100df3e,0x0374aca0,0xffc43696,0x0197891e,0xffdc543f,0x01e02b66,0x01b9eb4e,0x01cafe46,0x027d7334,0x020f5c90,0x0201a738,0x0228886c,0x019bfe9e,0x014f23c8,0x0121780c,0x00de3b2e,0x00c19324,0x00a2f823,0x00d234cd,0x00e5ed6d,0x00ed9119,0x010c3622,0x013ac4b2, -0x013561c8,0xffb69527,0x00634a69,0x03cf2810,0xffb151e8,0x003986d2,0x03980ee0,0x0337d0b4,0x0320d648,0x032fcc70,0x02fec424,0x02f293c8,0x02bcf2d4,0x001c6c89,0xffb7ca92,0x037738b4,0x00487987,0x01700aa6,0x01d3a6b4,0x03395d54,0x03817e3c,0x04ec18b0,0x037894b4,0x0336be88,0x03aa5bec, -0x02a3b358,0x01fd615a,0x0182cf92,0x00975188,0x0012dcd5,0xffb47e7a,0x0000f222,0x000a7bdb,0xfff12f2b,0x00212780,0x00ad32fd,0xffea0f04,0x014e9e6c,0x00fe595b,0x005869ce,0x0106c228,0x0117bc06,0x00ff6422,0x01126486,0x008c4544,0x003f6d53,0x00efe419,0x0154ad6a,0x01086d08,0x014cf33e, -0x017aaf4c,0x00ed3f82,0x0133ee04,0x015f9362,0x030289a4,0x04414310,0x0487b1b0,0x07a861b8,0x04da5be0,0x048f3c80,0x0593da50,0x03338eb8,0x01b92646,0x00b739a7,0xfec890e0,0xfdf622f0,0xfd451d78,0xfdfab064,0xfe4b81bc,0xfe5df51c,0xff392af2,0xfff84e87,0xff6411b3,0xfff8ebeb,0x007eb5f8, -0x005fbc6f,0x003fba49,0x005d7b72,0x016ddc90,0x00faf9bb,0x0165a108,0x002c9293,0x01f18e56,0x015c9ca8,0x008a7141,0x00c4e759,0x008becbe,0x00cdd1cf,0x016603ce,0x02d8d46c,0x048f8cf0,0x074ba530,0x0946b230,0x0d70eb90,0x08529190,0x078457a8,0x09752c40,0x06ccf4d8,0x0513c288,0x040e8da0, -0x008d57df,0xfe7c45e4,0xfcf7ceb4,0xfd70da60,0xfd4b9398,0xfcadb598,0xfd8e9dc8,0xfebe8458,0xfe524b86,0x00108e3d,0x00c538ff,0x0051a632,0xffe4fcb3,0x004ad333,0x01af90da,0x013ad4fc,0x0191ff5a,0x01518832,0x01ffa354,0x01e4495a,0x00c9e794,0x01a6e87a,0x01c31b7a,0x028e06f4,0x023ca1ac, -0x049b2818,0xffa7b2c8,0xfd8809c4,0xfad5aec0,0xf99d0498,0xf8042f28,0xf789faa0,0xf5cad390,0xf5afb330,0xf55b7180,0xf4f5ed50,0xf5256610,0xf4b3d3e0,0xf403ba70,0xf5134f80,0xf71dcb40,0xfa916b98,0xfc3f8fa0,0xfdf458f0,0xff211b55,0x00e5755a,0x0105d144,0x005e82bd,0x007eef3f,0x00d3fcec, -0x018e17a0,0x01a5de7e,0x01881928,0x00fc240d,0x00c973c6,0x01601e7a,0x0206e004,0x0078bbb8,0x00bef736,0x01bdf4fa,0x03384f44,0xffd731b2,0xf7ace0c0,0xf30d9210,0xf52c8dc0,0xf6e03e90,0xf3167570,0xf0b8fdd0,0xf0792c30,0xf62ee460,0xf72ded90,0xf75d14e0,0xf1f65790,0xeeec7640,0xec3aa740, -0xeccb36c0,0xee6abe60,0xf23cfd50,0xf4e393c0,0xf8bea1d0,0xfb014bb0,0xfe687d4e,0x00983820,0xfffbd6e1,0x00414216,0x0072869b,0x015a29ba,0x01acf37c,0x023a00e4,0x016402f6,0x023a001c,0x023646a4,0x01fd44e8,0x020f528c,0x00c1a7ad,0x00ff0ebd,0xfef04bf2,0xf82d6a20,0xfbcca488,0x0109f2b8, -0xfd251c7c,0xfae546a0,0xf972d428,0xfb221848,0xfab9a728,0x05440a78,0x0ae38530,0x0b1c5070,0x07a759b8,0x038e46f4,0xfda2d820,0xfd7b8290,0xfc32b880,0xfbb767f8,0xf9b4ccb0,0xfac29038,0xfb62ce70,0xfc369844,0xfe6ae098,0xff525baf,0xffc60632,0x00d87006,0x0263a6d4,0x02b980f8,0x02bd3008, -0xffb800c3,0x02ae2fe0,0x020ead74,0xffe755cf,0x00a06710,0xff355ce0,0xfe432a42,0xfc350710,0x03b668f8,0xfef2001a,0xebd9c040,0xe88aab40,0xefebb900,0xf18f51d0,0xf33bd3e0,0xf5386420,0xf2703ee0,0xf118d220,0xf15b45c0,0xf80085f0,0xfb3a1ab0,0xfa000c70,0xfd1e90d0,0xfe67276e,0xff8ab5a4, -0xffb7d504,0xff714ffc,0xfd070f74,0xfc084e54,0xfcb7004c,0xfc5b7a58,0xfd96bdf0,0xfef0aea2,0xffdf5dd4,0x008b2b2c,0x00368558,0xff30e5bb,0x010766e2,0x01a54fc2,0x01b8b45a,0x012f53c0,0xff94de17,0x00e7f561,0x01ef0db8,0xff78be72,0xf4595270,0xf0b06280,0xf437cfa0,0xf7afe380,0xf7723120, -0xf775d8d0,0xf5bc1490,0xf533bf10,0xf45a87d0,0xf2ee5450,0xf4772150,0xf7104930,0xfa66e460,0xfc0b2670,0xfce3d4c4,0xfdd5ca0c,0xfcc8d88c,0xfd37fde4,0xfd9e9198,0xfce244f8,0xfe9c4c32,0xff122086,0xffe891c8,0x005e37ee,0x0075a25a,0xff98f070,0xff5ea2f5,0xff1471ec,0x00291d21,0x001c4cab, -0xff9641d3,0xffdf3462,0x00638a80,0x0111e27c,0xfda1d970,0x01b86c16,0xf9c1d888,0xfb11b740,0xfcdcb34c,0xfda6e230,0xfd4d07d8,0xfe398bfe,0xff3735bb,0xff40930e,0xff260e32,0xfea0cc50,0xfde748ac,0xfb33ed80,0xf836d430,0xf6631ea0,0xf7bc89e0,0xfc01bc3c,0xff3b764c,0x009f6d53,0xffc94a24, -0x001e65dd,0xffe37fa7,0xfe528c04,0xfef65270,0xff887664,0xffeccd8d,0x0057c44f,0x0094f1d2,0x0058ca93,0x001b296e,0x0017591e,0x003243a1,0xfff90d5c,0xfeff2a5e,0xfed13c86,0xfd518ee4,0xfdbe0d80,0xfffc619e,0xffdf6bfe,0xfe223c90,0xfd3af828,0xfccd6160,0xfc42cf58,0xfb8e9fb8,0xfbee9f70, -0xfc4fe940,0xfc7a4dd4,0xfce0e2f4,0xfd8e053c,0xfe1470f0,0xff045e54,0xff4389f7,0xff0f06b1,0xfef94a8e,0x0025be22,0xfffc9f91,0xfee3c342,0x0063ec83,0x0110fa7a,0x0114eda4,0x00e6f3c2,0x017a9d50,0x00b1a9a1,0x004781f2,0xfef8b98e,0x000e099a,0xffcad24d,0x001b97b2,0xffe325c1,0xff872db3, -0xff783b75,0xff30c228,0xfede45aa,0xfce93db0,0xfd20ea58,0xfcaf4870,0xfc9836a4,0xfc55bca4,0xfc2de92c,0xfbd079e0,0xfc4af860,0xfc9f1df4,0xfd209c24,0xfd8359f8,0xfdc1b77c,0xfde8ba20,0xfe2ee6c2,0xfe9eb264,0xff60bb06,0xffc6fea6,0x0062204c,0x0062b2d7,0xfef5c53a,0xff051021,0xfe155114, -0xfeff34ea,0xfe56179a,0xfd937dbc,0xfdb357d0,0xfd7544d8,0xfd7d3338,0xfda6b424,0xfe3345f0,0xfe30b73e,0xfe054ac6,0xfe38b200,0xfd721300,0xfd9766e8,0xfc0757cc,0xfd86cf94,0xfda09e64,0xfd637b1c,0xfd5298c0,0xfd1e8740,0xfcf93d48,0xfcc012e0,0xfcfce844,0xfd1abff4,0xfd2f1ea0,0xfd4719e0, -0xfd6dc264,0xfd9a435c,0xfdce4ff0,0xfdef467c,0xfe0683ec,0xfe27a682,0xfe477e0e,0xfeebcaee,0xfd2f48e8,0xfdca2e00,0x00fe7a55,0xfc67d6d0,0xfd2acf98,0x01067996,0x00d94125,0x00bfdb6b,0x00d7f17d,0x00747ccc,0x005887ca,0x004b1322,0xfd29517c,0xfc074cec,0x0149a62a,0xfd3ebb44,0xfd20766c, -0x01cce832,0x04b8edf0,0x023d8df0,0x0292cfc4,0x02b91f20,0x02b55660,0x01d8d8ae,0x015d57fc,0x00ec139b,0x00f5e01c,0x00fad390,0x0114f684,0x0122051a,0x012cf3fc,0x014f619a,0x01309f18,0x01352f3a,0x013c9144,0x0168adbc,0x01624e00,0x0102814e,0x03e55af4,0x03551fcc,0x00bcc3e4,0x03caab48, -0x0390cd70,0x0128e5ce,0x01474768,0x01397b0c,0x0101afdc,0x0197a860,0x01b6c730,0x018bde22,0x03a77680,0x041931f0,0x00e01178,0x03c88bf4,0x0375b584,0x049801c8,0x042bcb38,0x04a4d8e8,0x049223f0,0x02f330d8,0x01f1ee0e,0x00e1bbfc,0x00745571,0x0055f40e,0x00d5b4a0,0x0123fcf4,0x017026b2, -0x01ad60dc,0x0140e960,0x01402292,0x01510010,0x01c6a62a,0x01537a68,0x01c0ca3c,0x01fc8d48,0x01bbf234,0x02709d94,0x01d59b60,0x02243fc4,0x02bd3d30,0x026bbb2c,0x03116098,0x03180ea0,0x02e37000,0x020c4564,0x01e0ffec,0x02a0c3f8,0x02cb1f94,0x02ffc48c,0x0355fb78,0x05b8c650,0x060b0810, -0x060edd18,0x068a6788,0x06c98258,0x03285b18,0x00fea198,0xfe54b0e0,0xfd9ccf1c,0xfd6cb9ac,0xfe1e6bb2,0xfeae10aa,0xfef23afa,0xffc5b2c2,0xff4e1f7c,0xff7c0172,0xffd350ee,0x008f7315,0x00893ef2,0x008f7e5c,0x01b0629a,0x019e447c,0x01180700,0x01734f5c,0x01f96af2,0x0259c6dc,0x022913ec, -0x01a54e32,0x02633a78,0x019c6798,0x02636398,0x01537770,0x026f7c34,0x0315fcbc,0x037b0c4c,0x04c0b208,0x0554de70,0x06fc1070,0x06f567b8,0x0880cee0,0x09899cb0,0x05c7a3b8,0x0294a034,0xfe6f0772,0xfcb7ee94,0xfbc48f60,0xfd742c40,0xff64d91d,0x00e6b07f,0x019c7f96,0x005b8fcc,0x00691428, -0x00fda276,0x022528ec,0x01164f24,0x00477d39,0x00b507bd,0xff8727e3,0x007d8609,0xffcbc3b5,0x00030948,0x00e1d8ee,0x013c24a2,0x01500c46,0x007c5fc2,0x01b7c9a8,0x0148cf5e,0xffa7a63d,0x021f2684,0x038d5390,0x0298b3b0,0x03d62874,0x0632ef40,0x002b7c13,0xfd5d7dec,0xfd1dcf44,0xff5dd79e, -0x005eee46,0x00ac62c9,0xffb87b96,0xfeb20dc4,0xfdf33988,0xfce6b548,0xf5e81c60,0xf318b0a0,0xf2e78360,0xf7097b60,0xf7e3ec30,0xf54bf3f0,0xf83661c0,0xfa9f33b8,0xff062d26,0x01064f02,0xff8f6996,0x008e4f56,0x004b8fd4,0x01015a54,0x01f65cb2,0x014ac4d6,0x016fb98c,0x01769942,0x02729150, -0x02067770,0x0124368e,0x00c1b06f,0x0160f1ce,0x02082f1c,0x06c1fcd0,0xf9f2d580,0xfcb3e2bc,0x053a2f68,0x08aaf0f0,0x0ccd1d70,0x1128e9a0,0x120cf840,0x0be5eca0,0x0d75a820,0x0bfe5270,0x06d24c70,0x06ff0df0,0x04cb3fe0,0x003d03d6,0xfddc2684,0xfe5ee28c,0x02bd88a8,0x00cdd569,0xff474612, -0xfe6e7576,0xfcff5a60,0xfe8ed196,0xff47cba6,0xff868ec9,0x003cf85f,0x01604082,0x01ae58dc,0x02568e44,0x01d55788,0x0317a07c,0x03429688,0x038a7550,0x0219a308,0x011ba8cc,0xff2eb7d1,0xfdf3b420,0xffceadf0,0x0471e218,0x0333c608,0x05653a30,0x0bdeb360,0x14e85820,0x158901a0,0x0bfa0650, -0x05e3cfd8,0x02d71b18,0x022ebcd4,0x084ddf90,0x0b5284d0,0x0bbec2b0,0x0bc74bd0,0x096c2e40,0x061a9560,0x036b2204,0x02f849ac,0x00b40440,0xffe700ef,0xff7dbb28,0xff6d2efe,0x004cdd66,0x00e70dd3,0x02c74408,0x0243311c,0x020adb68,0x0037512a,0x01fc6c6a,0x01368e72,0x008b5509,0xff4b5c08, -0xff436aba,0xfe29bdd2,0x000d828f,0xfe131070,0xffad231d,0x0b42b500,0x11ba3cc0,0x180687e0,0x156409e0,0x0f3d1fa0,0x04a5d530,0x05ffbcd8,0x04c48460,0x054ef0d0,0x02f81968,0x02dc2e44,0x04c2f408,0x03d88b18,0x03d04704,0x03ffd978,0x032044a8,0x02a112e4,0x00d554b7,0xfe046244,0x00495477, -0x00c79bfc,0x00f596d7,0x016c5d64,0x01b422f4,0x0127caf4,0x00b761ff,0xff7c8a44,0x00ef8a4b,0x01576ff0,0x02b620f4,0x00fe441e,0x0163cc7a,0xff698c4d,0x00b7cc0c,0xfc9aac60,0x089f0150,0x0fa4a410,0x0e960350,0x12996660,0x118498c0,0x0f984020,0x0a496fa0,0x0a5d78d0,0x0aafa0d0,0x0ddbfec0, -0x06ee56c0,0x03881e0c,0x03e3559c,0x01156078,0xffc775c9,0x003407a7,0x01ac83c8,0x036928a0,0x03d1e20c,0x01476334,0x02b7bda4,0xfff608e9,0x005d2df1,0x011463cc,0x01e84f30,0x01344fa0,0x0118e532,0xffad1f8d,0x00f5939d,0x010a6ea4,0x011e1f40,0x00a0d0e3,0x0058442c,0xfeee6ebe,0x01f805be, -0xfb662228,0x0359e6e4,0x06509c10,0x06275428,0x083f2af0,0x06c6b300,0x046c0198,0x016a597a,0xfec86656,0xfca289f4,0xfbaee248,0xfc8b00f0,0xfe8b8e1c,0x0068a8f9,0x02b760c4,0x03e44af0,0x04294bb8,0x03e5a868,0x039fa128,0x01968dbe,0x00b0e7b6,0x020a2c70,0x0188eaf4,0x023666c4,0x015ef154, -0x00f13aa5,0x00beca96,0x009d7a60,0x015fd2e2,0x01441230,0x01781cea,0x015652ea,0x01390f7c,0x01c81cd8,0x00989bb0,0x01e6b274,0x03df5ef8,0x03cca824,0x03efa12c,0x04345e80,0x04dd0ac0,0x03885808,0x02d56270,0x024e56fc,0x0274593c,0x02742920,0x01d72cd2,0x0180e8c2,0x00b00cc8,0xff6ac0be, -0x00143bf4,0x00b86ebf,0x019ac58a,0x02283d80,0x030196dc,0x039fa8c4,0x02787324,0x0174f090,0x00e26aba,0x01418f72,0x0124195e,0x01634ace,0x00e23745,0x0223baa8,0x00fad36f,0x01bd0c5c,0x00e923b8,0x01be660c,0x01582112,0x015e130e,0x009e6978,0x025c209c,0xfd278460,0x03ea5034,0x039347f8, -0x036ea010,0x034b6bf4,0x033e78a4,0x032f3580,0x02fa71a4,0x02492508,0x019b7504,0x012854b6,0x00b9b83c,0x00877d3f,0x00343e23,0x0094fc47,0x00aaf78a,0x00b26270,0x00e55bf0,0x00bdfd92,0x01684066,0xfff510bb,0x01f98880,0x0253b1ac,0x01136164,0x01215098,0x0236f5dc,0x029a1c98,0x02db4e20, -0x021d4044,0x03368130,0x035a7698,0x02418528,0x02ac9be4,0x0143d77c,0x018ec11e,0x031ebbb0,0x02049970,0x049fb368,0x033ec1a0,0x038395ac,0x0364a8e4,0x036b79f8,0x03690d84,0x0384f3f0,0x0340f620,0x0310d16c,0x02d19924,0x0282d8b0,0x022a90e0,0x01b852a0,0x01d998b4,0x01f2093c,0x020c4188, -0x022ea6b8,0x02293a4c,0x02a44798,0x0171ae96,0xff2b6686,0xfae70fe0,0x0299276c,0xff933904,0xfaa0c7b8,0xfab2d1a8,0xfada84a8,0xfb371630,0xfb1001b8,0xfb1edd08,0xfb705770,0xffb22b3f,0x037e7a14,0xfa65d338,0xff07d0f8,0x03d0d4e8,0xf9b08e40,0xfc5d6d70,0xf86f2370,0xfa35d8f8,0xf952cde8, -0xf93f2c80,0xf8eb40a8,0xf8f68600,0xf9343c08,0xf9a38ea0,0xf9dfd2e8,0xfa0704d0,0xfa0fed20,0xfa0f6a60,0xf9efd218,0xf9f66678,0xf9fc1148,0xfa235c20,0xfa094728,0xfa8aed38,0xf953f100,0xfc2553d8,0xff9c8745,0x0622afa8,0xfb2343f0,0xff70d3ee,0x05c00e20,0x05a33f18,0x05824c10,0x04d8fb98, -0x0527d348,0x051f34e0,0x04c00968,0xff84438d,0xfa5b9508,0x063134c8,0x007ca5fe,0x040518f0,0xf7a4a7c0,0xf6ef3a50,0xf61ab9e0,0xf5cb2a60,0xf52c62a0,0xf53d22f0,0xf5fa3a30,0xf748f1c0,0xf840cdf0,0xf8b2c490,0xf912b920,0xf90e4e48,0xf8cc8c40,0xf8f1a070,0xf926ab98,0xf99045c8,0xf98dc7b0, -0xf9e10d20,0xf9d308e0,0x00b74891,0xfc5de854,0xfc4d93b4,0xfda83f08,0xfe6255c6,0xfcb7ff14,0xfc783d8c,0xfc071a30,0xfd4817ec,0xfbe86878,0xfbb1d688,0xfcef8eb8,0xfc4dac90,0xfe153a52,0xfe3366c2,0xfaf566f8,0xff47fc3c,0xf9fbd3f0,0xf47c3a90,0xf4cfa940,0xf3774030,0xf219dfb0,0xf21d1f30, -0xf3221700,0xf5ac3d30,0xf71bfcd0,0xf7c302e0,0xf84c0de0,0xf85e5100,0xf7e36340,0xf83eb820,0xf89baf30,0xf96e6840,0xf9a2e030,0xf99f4920,0xfbb8edc8,0xfd08385c,0xfd8deec0,0xfdde76c4,0xfe17dc4c,0xffc94f0b,0xfed695fc,0x007b33dc,0xfde82ae4,0xffbc23e6,0xfece39d6,0xffff54cb,0xfe8469f4, -0xff52534b,0xff40f0c0,0xffcf24f8,0xfcf12c04,0x00e5eba4,0xf68c1580,0xede05800,0xed42a780,0xebe28880,0xea2a5100,0xe9d6aee0,0xeba2cea0,0xf08a5c40,0xf4244ba0,0xf56b0d00,0xf6a4a120,0xf662b020,0xf5e9d7e0,0xf713f160,0xf830e468,0xf95fb498,0xf93a5090,0xfa10d7e8,0xfb8b73c0,0xfe7845a6, -0xfd5d5170,0xff17a06a,0xfeb6dc5e,0xff86d7ac,0x006205ac,0x00a53e16,0x015f1e02,0xffec73b9,0x01267e6a,0x004e0f2d,0xff223528,0xfecd69ba,0xff3893e5,0xfeb7d85e,0xfd34e260,0xfb7bc568,0xfacb3270,0xfe252ec2,0xffcd3c8c,0x02075abc,0x0351a714,0x02d95f9c,0x01cdbefa,0xfba63b50,0xf7361e40, -0xf3f3bc10,0xf467d180,0xf56e3760,0xf65a3510,0xf4763fd0,0xf4eedac0,0xf7fb6f00,0xf9d1a360,0xfa0ed880,0xf887d7c8,0xfc58532c,0xfcb53300,0xfe0bacac,0xfebadc7a,0xffccc590,0x01a6be54,0x00761a12,0x00b9f008,0x0163b7e8,0x0111e71e,0x0061d43f,0x001d58eb,0x00a77265,0x010159bc,0xfff9562f, -0xfd917d40,0xffac928a,0x0405b248,0x03ea8094,0x023aea94,0x0518efa8,0x010d4bb0,0x0048a308,0x02433b34,0xfde6ccb0,0xfda4a068,0x00942090,0x00580ded,0xffc7a0b4,0xff647c73,0xff1ee398,0xfe07cfa6,0xfc1f64b0,0xfa48ced0,0xf95dacc0,0xfaf952e8,0xfbe51e10,0xfbec37a8,0xfd56ed74,0xfe38a186, -0xff611f5e,0x0188622e,0x0117d778,0x0140916c,0x00ec771a,0x025aba44,0x029952a0,0x00ef9289,0x00450e2c,0xfebe4294,0xfe742b5a,0xff54af1a,0x030f1bcc,0xffdf965b,0x00ca3566,0xfdeb9614,0xf29199e0,0xf0b705e0,0xee507b80,0xf04d37a0,0xf4967b10,0xf6eda680,0xfa2a4148,0xf8380df8,0xf8015970, -0xfa212278,0xfad05250,0xfcfbb314,0xff6a5968,0x01efb762,0x01b0bb40,0x006c9cac,0x00803361,0xffe02f73,0xff7b03e3,0xff25274b,0xffdfba98,0x027196f0,0x00b95de6,0x005af0f4,0xffd6f053,0x013afae8,0x00fa50d2,0x016053ea,0x0075b661,0x00cf1d76,0x01c8c4dc,0x01e8c360,0x01c369a4,0x05b7d0c8, -0xff3ed372,0xf7681f70,0xea512a00,0xf50d6750,0xfc51740c,0x02f73dec,0xff50e344,0xfeb08046,0xff9b47af,0xfd42cb8c,0xfd60f614,0x0037675c,0xfdf8b348,0xfcf8f7b8,0xfcb9f408,0xfca18118,0xfe07ba12,0x00bc5dd8,0x01f02692,0x01a6b11a,0x02e40010,0x016aed78,0x0141cf7a,0x0301b2f8,0x005c556b, -0xffec494a,0xff5cd85c,0x002b63a0,0x00981011,0x0155d760,0x007b7c03,0xff8cce3a,0x011fbfbe,0xffc8628a,0x06c806b8,0xff2f9518,0xf13aa730,0xf13ddf60,0xf2668830,0xf61190a0,0xf718ff70,0xf9694ad0,0xf6d08e20,0xf60d06d0,0xf524e020,0xf9adf370,0xfb3c8730,0xf9711840,0xfd90db1c,0x00128b30, -0x01ea7b98,0x02f28cd4,0x019bc2da,0x016a233e,0x01bae932,0x000521db,0x0158b430,0x00e3cd17,0x011087e6,0x014ba90c,0x01cd846a,0x0180cee0,0x0054d258,0x003dc092,0x00858c81,0x01294d62,0x01bfbc28,0x01c35514,0x0278bd94,0x017660ea,0x04350d88,0xfccc70cc,0xf91b3a10,0xfbd261e0,0xfc58b528, -0xfd5ae92c,0xfd48fa0c,0xfc4729c4,0xfd7e0cc8,0xfdde2c8c,0xfda5d640,0xfcce4110,0xfc83b45c,0xfbfb2f38,0xfdfb3564,0xfe8cd450,0xff55f04b,0xff4ceb4f,0xff409860,0x01813402,0x02ac7764,0x0159752a,0x02250dc0,0x00ec7f80,0x009a24e2,0x005905c8,0xffc82cab,0xfff00170,0x0067fed0,0x007c1982, -0x0070e0f9,0x000e0eaa,0x011987e0,0x007fcd67,0x005c2f83,0xfe7e0164,0xff8d2da2,0xfd702c4c,0xfc7c0c90,0xfd6ed80c,0xfd015240,0xfd618030,0xfd7f6d9c,0xfda589a8,0xfda189d0,0xfd6f0b18,0xfdc71030,0xfe82b73a,0xff4d0983,0x001bc06a,0x004cd29a,0x00c77a98,0x016fb266,0x00f806cc,0xffb60002, -0xffc2c9c7,0x01305324,0x008f5726,0x00008073,0x000fbac0,0x00c874c5,0x0065f776,0x017b3692,0x00957cca,0x02519020,0x00848cdb,0x01190860,0xffbda2d9,0xffc3fe75,0xffe05398,0x00971922,0xff30754a,0x05aaadf8,0x007ee223,0x00078e85,0xffdc39a7,0xff750c26,0xff2bb32f,0xfedb96f0,0xfea0e53c, -0xff40a34c,0xffe601aa,0x003a51a2,0x0092b966,0x00dcf55d,0x015408d0,0x01155a18,0x00dd4127,0x009d1f26,0x0093088a,0x00c24869,0x0066f4c1,0x019ebed0,0x0036dcf4,0x007b738b,0x0122ac52,0x0128f52a,0x00b8af49,0x006a0322,0x007cd618,0x0161c880,0x006f8874,0x00098771,0x0156e274,0x00f8230e, -0x024274b0,0x0251beac,0x00abfb93,0x01a81242,0xfe84526c,0xff78c880,0xff28a6a9,0xff1d3d61,0xff07e54e,0xfef2ef74,0xfeb5153e,0xff011c30,0xff2c944b,0xff73f2f0,0xffba455b,0xfff94052,0x0046dc09,0x00245ad2,0x001ca870,0x000e478a,0xfff08649,0xffedf3e4,0xff59e699,0x013c2ab0,0x033b88ac, -0x04f633b0,0x00da526d,0x037954e0,0x057e0c60,0x0598a480,0x05971e10,0x053e8590,0x05b87278,0x05d42640,0x05ad84e8,0x03ab1044,0x008d32de,0x05bb3008,0x04206200,0xff1f1a16,0x0187f8c2,0xfc772e98,0x0277bc20,0x007c34bf,0x00ea8e75,0x00f8bd88,0x01f347c2,0x023db614,0x01f7e9fe,0x021e3344, -0x020a6a2c,0x01d10dac,0x01c0880e,0x01ae3e54,0x01a49d2a,0x01bf545a,0x01cf4b7e,0x01ee36dc,0x01c736ba,0x01501b26,0x03338d7c,0xfd33a770,0xf9df7178,0xf69fbd50,0xfed951e8,0xfa6c5c48,0xf7430930,0xf705cdf0,0xf711b7b0,0xf7c95b10,0xf7017940,0xf6eb6030,0xf7258b00,0xfa3e65d8,0xff13af81, -0xf6e53d40,0xf9131828,0xf7132770,0xfeeb453e,0xff7a2f15,0xffa72991,0x00671892,0x03095580,0x03dd6d28,0x02f85e3c,0x03ab6aac,0x03378ba4,0x024bd534,0x01e1ef4e,0x01d2d4de,0x02043310,0x027bb3e0,0x02926004,0x02c6b2bc,0x01ffe266,0x02315cd0,0x01bd1398,0xf9b29488,0xff528652,0xfeb02262, -0xfeb7f024,0xfe37dd1a,0x00097cf0,0x00508d27,0x0018c18c,0xfe80121a,0x0071699f,0x010ca7cc,0xfefe3c7c,0xfef696ea,0xfc9b32fc,0xfc388200,0xff1b04f8,0xf9b72eb8,0xfcad5f2c,0xff1747c8,0xfdf1d9c4,0xfef3a834,0x03dac260,0x058e7990,0x0419d1c8,0x059f80f8,0x04e8f010,0x039cfa88,0x02de2a48, -0x02868b14,0x029ae564,0x0325ce2c,0x035e35d0,0x03f98930,0x025c02d4,0x031f7878,0x00931696,0xfd8ae528,0xfe78f5e8,0xff101882,0x00088fa1,0xfed323e0,0x013b5624,0xfebd2aa6,0x01a84c72,0xfe744b36,0x00ee23ba,0xfe5f1e96,0xfee031f6,0xfdd1bdf0,0xfd356268,0xfb20e3d8,0xfc26ad24,0xf58c0d00, -0xf82b8620,0xfd0244a4,0xfc2cdfc0,0xfde1d094,0x05bd7510,0x08bf25a0,0x071e0ff0,0x0967e680,0x07be9758,0x04609908,0x0268a988,0x023baa84,0x032c2914,0x0471d930,0x04bb07e0,0x0520d288,0x031057bc,0x02fd4430,0x0101fa4a,0xfcb17160,0x001a793e,0xfdebcfa0,0x0058a58f,0x00d9c319,0x01ca4350, -0x01474cba,0x00db5bc1,0x01c33890,0x016d9d96,0x01379ba8,0xff57e2a0,0xfdefb624,0xfb7d0fa0,0xfa8c4aa8,0xfb05b348,0x01664f2e,0x0fc7c310,0x14983220,0x0e5ecd90,0x021343c4,0xffa12102,0xfb7ecbb8,0xf6e2c7d0,0xfa647f80,0xfc9cd564,0x0049584d,0x030a3e44,0x03c301a4,0x020e2e9c,0x03bbccdc, -0x0401b340,0x04a0d028,0x02dc2520,0x03f85aa4,0x0129d444,0xfc618b78,0x008afafa,0xff9c5614,0x0069861d,0x0041629b,0x014dc0f8,0x00ba7846,0x00ccbbb7,0x0154ad5e,0x001790db,0x0089bd48,0x01ca6d3e,0x027d4ed0,0x00c85d71,0x020f8cec,0x002b0c53,0x0409dfe0,0x063f9d50,0x03665978,0x012629d4, -0xfcefc45c,0xfc0603a4,0xfa062498,0xfa2872c8,0xf94ef400,0xfaf81870,0x01d7b236,0x01a1b450,0x03634314,0x059704b0,0x077ff788,0x07e67900,0x0798dc78,0x0635cba8,0x0640eb58,0x00c6cf16,0xfda4e1d0,0xfe7c15a0,0xfec24fea,0x00df0556,0x0160b2f6,0x024c54dc,0x01496d7c,0x010f5722,0x00f412bf, -0x02843894,0x0230d34c,0x0182b6a8,0x00978f01,0x0362e1a0,0x03e6420c,0x05a606e0,0x016973d6,0x04587c28,0x0075708e,0xfe28cd58,0x014e8b20,0x04a8f700,0x09acfa20,0x0e1a42c0,0x087fb3d0,0x05dfa758,0x056d7348,0x03950514,0x034d7a58,0x02c7b9bc,0x01e0c4fe,0x00015d56,0xfdceb4a8,0xff2aa8cc, -0x013bed86,0x01b003c4,0x01d69ada,0x0232d0f8,0x01077086,0x00b6f92b,0x011551be,0x0371d324,0x003aeab6,0xffddc0fe,0x004b02e3,0x01a62734,0x01fe142c,0x02ddc464,0x00f4505f,0x01d4b76e,0x0179580c,0x0223e6dc,0x01e246fc,0xfd55c594,0xfce65150,0xff56dfe5,0x069d6360,0x0428d6d0,0x0164b334, -0x0110a48c,0xfd1a8f34,0xf9f7a160,0xf792a5c0,0xf9445558,0xfa97a480,0xfa5abec0,0xfea425c2,0x00ff87f9,0x01a38988,0x022cec1c,0x021e0294,0x012cd434,0x005cdc38,0x00cedace,0x01511a12,0x010e6af6,0x0198bcf8,0x034ed168,0x00e9eea4,0xfff701ac,0x003eba12,0x001fa0b1,0x01023090,0x036b0784, -0x013a98e4,0x01686a7e,0x00e2991e,0x02a98290,0xfa94ed60,0xfd88f164,0x048ed4f0,0x029c67f8,0x00fc8d46,0x042fa1d8,0x0548caf0,0x03657028,0x006b0b2a,0xfde4d94c,0xfc3b93ac,0xfb94c438,0xfc95c0c4,0xfe66ebf8,0xfdfc9814,0xfde53690,0xfe4c998c,0xfe35f7ee,0xff8b99f9,0x0053a704,0x00c9c8be, -0x01990bba,0x0126bdb6,0x0132e6ec,0x00f6318e,0x0141f686,0x0157b4ea,0x01acd3ae,0x0103697e,0x0118501e,0x004cbe57,0xffe81340,0xffe009a2,0xfff18baa,0xff11f9d0,0xfe034114,0xfaa160e0,0xfc9afc4c,0xff7ed5be,0xfe254362,0x0040d7a2,0x00289e28,0x022552c0,0x05705060,0x0339305c,0x016b6d02, -0xff51778a,0x002a536c,0x009841e2,0x0184beb4,0x01b7b1d4,0x01b25fb8,0x01583c94,0x00b1fafe,0x00464b4d,0xff6b2c90,0xffffe78d,0x00286c22,0xff5eaac7,0x007e0850,0x010fc0b8,0x00c57607,0x010ce10a,0x00f50090,0x017f9e08,0x01791fbc,0x0151b958,0x01389efc,0x01265720,0x01174a1a,0x0027e8ae, -0x0037f771,0xfde38ccc,0xffa0d634,0x019d4e14,0x00f14936,0x018bbcf8,0x01acb76a,0x021f4814,0x029d6d30,0x02790ab4,0x02f982b8,0x0326a58c,0x02348768,0x01394d7e,0x00612b2a,0x00a2bec4,0x00d3f749,0x01511bd0,0x012a95ac,0x01a32e5e,0x00d58d55,0xffe4be3b,0x00659485,0x00bc9bad,0x00d0f42b, -0x00538778,0x013c5ff2,0x006cae02,0x015fbedc,0x0021c0a0,0x00bc851d,0xffa938ee,0xffc4318c,0xff4f9297,0xfe8e22f0,0xfdb44284,0xfe88191a,0xfea498fa,0x004a2b23,0x00e307ed,0x012e5ec4,0x01ba6e22,0x02379a00,0x029ccc4c,0x02ed851c,0x02a73924,0x0239b2fc,0x021251d8,0x01f0b6c4,0x01f1e1ce, -0x01c320ce,0x01dbb08e,0x01d1cf02,0x01d05d9e,0x01addf28,0x019de80a,0x01c3606c,0x00aa02e2,0x019f68de,0x01585ab6,0x01667a32,0x012e5dec,0x017e937c,0x0193f3f8,0x011f169c,0x00424f5d,0x00fd1c88,0x016fd2f4,0x009c098e,0x00d1e7c8,0x0031fb11,0x0014632c,0x00d89448,0xff179412,0x0156313e, -0x0112d22c,0x01402d74,0x015d4e92,0x016cdc22,0x018b21e6,0x01ca9444,0x01ba6066,0x01c4677a,0x01b51574,0x01afe0fa,0x01a5e160,0x019dba14,0x0189fa52,0x0176253a,0x01660014,0x016ac78a,0x014fea74,0x01b10dda,0xffd995f9,0xfebbdf30,0xfeb18cd4,0x0002179f,0xfe76c4c0,0xfe5971b6,0xfe287eda, -0xfe354334,0xfe88a510,0xfe17939c,0xfe029cb6,0xfe124218,0xfe0dafee,0xff93fe83,0xfe9f4878,0xfde91b4c,0x010de9e2,0xff7e755b,0x02e22a2c,0xff2e0c65,0xffbd708c,0xffca6377,0xffaa3ad1,0xff409a95,0xff07c424,0xfedcf81c,0xfeeca708,0xff0190ab,0xff369e38,0xff445b1c,0xff599e62,0xff648800, -0xff7aab26,0xff84c84c,0xff8d7834,0xff7ecaf1,0xff9015d5,0xfebccff6,0x02d41650,0x03dc7f8c,0x020e4e0c,0x0247ed8c,0x03ffeab0,0x0276c8a0,0x02a9c3d4,0x02aef35c,0x024c1994,0x0305a340,0x03049b24,0x02c9a058,0x039dad04,0x020f3178,0x017d7d9a,0x03bead7c,0x0117d2e4,0x01978ba0,0x0143ab58, -0x01d71632,0x016ea124,0x002d05e0,0xff4b6255,0xfe9ef9de,0xfe508a68,0xfe4fea7e,0xfec434b2,0xfea47a14,0xfea81fce,0xfeae2e22,0xfecac32e,0xff0fd30a,0xff53c6e6,0xff847fe2,0xff0d1de2,0x0025a6ab,0x02bec3ec,0x006f4304,0x017bbfb4,0x010c8dde,0x01711184,0x0183b8b6,0x00c9ebb5,0x014a2cb0, -0x0244eca8,0x00fbcd0d,0x0032e44b,0x00ad3dd5,0x00ab5fe0,0x015e9168,0x011b5598,0xffebfb73,0x01553a30,0x01b00036,0x02b5bc18,0x02bdf39c,0x01f1db74,0xfef40aee,0xfd789244,0xfc668a28,0xfc7815b0,0xfd122b98,0xfe6f303c,0xfee205f8,0xff4398c4,0xff529910,0xff93b936,0xffc3ac63,0xffbd215c, -0xffb387ea,0xfeabd672,0x009fffba,0x01caa740,0x00a87618,0x00fd349d,0x00ee934f,0x01df31ee,0x01959ed2,0x019236be,0xffe64505,0x0230d42c,0x0055d5f5,0x01adcf5c,0x00988445,0x00bf8e9b,0x004f3cde,0x00e3ded2,0x017f25b4,0xffd5ef70,0x056859e8,0x07ed3908,0x089e5230,0x07700d08,0x02a101f4, -0xff93c316,0xfcbfc3ec,0xfb9862d8,0xfb69fbc8,0xfd03a00c,0xfd2f7380,0xfd4c3230,0xfd276f68,0xfd4e6d38,0xfdf9e154,0xfeda99e6,0xfee83614,0xfe4e97a2,0xfff1ac11,0x0091f3d7,0xfebdf290,0x0056d391,0xffcbdc80,0x0027d6d9,0x01247d56,0x00cb77f2,0x00d45560,0x0050a033,0x013e312c,0x001f30e3, -0xff3eb7a6,0xffb1317a,0xffdec5e2,0xffa25b14,0xff761257,0x0f966d90,0x0599f528,0xfc7d4a2c,0xfd0c8dd8,0xf8631a80,0xf71deba0,0xf7dcb690,0xfb0ae600,0xffcc12a0,0x0419b610,0x078dddf0,0x0865e580,0x09791f80,0x0af9a800,0x09545e90,0x07683428,0x04b39be0,0x029a3ab0,0xffdc4ba3,0x01411fba, -0x02236c4c,0xffb76fe2,0x00480236,0x008ac37c,0x00f68f11,0x017319c8,0x005d3b07,0x008821c8,0x013ce9e4,0x01b362da,0x02cf6cc4,0x0414a0e8,0x02e5f528,0x0484aff8,0x0614dc60,0x0bba2760,0x04655b68,0x008b27c5,0xfe5a40a8,0x0140aee2,0xffe8c131,0x0b781fc0,0x0ed32ee0,0x0d73dbd0,0x091caf40, -0x044ac3c0,0xfe4a9980,0xfdb4ab88,0xfcfa15fc,0xfb722328,0xfbc45550,0xfb06f870,0xf90b8d60,0xfd7334ec,0xfe9dcb46,0x01d2751a,0x040a7798,0x0283bf78,0x02244640,0x00cd9ac2,0x00b15fac,0x0241a030,0x017e5822,0x0162f196,0x00abd4b5,0x02061b08,0x022a1e14,0x01cffa80,0x03942f18,0x0374a994, -0x041553b0,0x012bf5d8,0x03cc9afc,0x001a5303,0xfe816a36,0x03595edc,0x05312008,0x0556bce8,0x03611830,0x0276fa0c,0xfd9683c8,0xfb820700,0xfa611d28,0xfa510d38,0xf9df4be0,0xf8e90b18,0xfa3e3a10,0xfc80a7ec,0xff4657c7,0xffdb139e,0xfe99ae2a,0xffc5dc90,0x0069bd9f,0x00185966,0x01b13388, -0x00ebd97e,0x0173c41a,0x04a4e498,0xffef317d,0xff080ee7,0x00706818,0x0124c7de,0x021ccc54,0x04b029f8,0x02e78d4c,0x00a2a558,0x0403e990,0x02ccb6f8,0x0073ab2f,0x02813478,0x088b8ab0,0x0a12fb50,0x0258e5f8,0x034883c0,0x02d1b468,0x001be7f6,0x0428b548,0x05357f08,0x03d05178,0x0441a408, -0x04828678,0x04b93a10,0x03150504,0x0170c434,0xffee41f9,0xff151f36,0xfea5e2c6,0x0087e5c7,0x0254e4b0,0x015992d0,0x0061e4b1,0x011dc770,0x0170d0f6,0x033a8584,0x0102dbfe,0x00eef3c5,0x01786d02,0x0025c035,0x006928cc,0x01b16c9c,0x01478204,0x0108be34,0x00d3a72e,0xff80b575,0x045a1e68, -0x06855ce8,0x068c3e48,0x05d9cc48,0x01711210,0x0192a878,0x0080b77c,0xff84aecc,0x01730e70,0x027ec7b0,0x03a342ac,0x03cd5b34,0x03b9c47c,0x04d39100,0x03ad5d18,0x02cd429c,0x00b5a5fd,0x00ee86b4,0x00db4016,0x00b18d31,0x01411392,0x008d2005,0x00933a3c,0x00c42669,0x00948eaf,0x00ac7ad4, -0x00c8615c,0x006b3f09,0x017342b2,0x010378ea,0x01a074de,0x027cfdc8,0x01aab3ce,0x0194beaa,0x017e9db8,0x040d5638,0x03497944,0x0596eda0,0x01aa72a4,0x002b4d25,0xfecaea2a,0xfede1a40,0xfde5fcdc,0xfc147bc4,0xfeb955cc,0x0050a9e2,0x01d4562e,0x015d3e2c,0x023ba2a4,0x03e7bca0,0x03f058d4, -0x031769c4,0x004f8c72,0xff399f16,0xff26a040,0x00a15a72,0x00782520,0x00fd088c,0x01ffcc42,0x0159a15a,0x00e7951f,0x011fef70,0x0139c99e,0x0169b3a8,0x0064966c,0x014f66aa,0x01a5f5c8,0x01db42ea,0x017446b4,0x01df905c,0x024cf324,0x0358c814,0x01bfa18a,0x0038ff46,0xffe2e33d,0x012b552e, -0x01871e3a,0x0115ab8e,0x00a5357f,0xffd4070e,0x00806cf0,0x00beceab,0x01405566,0x016442f8,0x0177b9b2,0x016badc2,0x00abd0da,0x003f64ad,0xffc7e458,0x00412d03,0xff8eb3d0,0x0035113c,0x0198a692,0x01255c56,0x0140310c,0x01241f2c,0x0185cda0,0x0123c920,0x0169dd88,0x007b40e0,0x01a38a28, -0x0083cd69,0x0108011e,0x00a7622c,0x010a2a56,0x0186e194,0x01e1eaca,0x01784d24,0x01a0fe24,0x016f6c32,0x00bf4726,0x005871bb,0xffdd882a,0xff70a46c,0xff15566d,0xfec453fc,0xfed7b032,0xfee9d3de,0xfefd7aa0,0xff17e96c,0xff394a0b,0xff772b51,0xff7316ab,0xff79f411,0xff50f0dc,0xff3e7bc7, -0xff00b2f4,0xff121dcd,0x01baa9a0,0x00a3b72b,0x0176c4a8,0x0140de9e,0x01f66a9e,0x01de8c44,0x01a9f906,0x02297d2c,0x02b3d02c,0x0215734c,0x01d71816,0x0214463c,0x01fbe602,0x01d32312,0x01dbbdc6,0x0154b3d8,0x024226c4,0x007c544c,0x007acda1,0x00686a2d,0x0040a2b4,0x00359d34,0x001ec9e3, -0xfff0db73,0xfff71bb8,0xfff1716b,0xffeedddd,0xfff0503b,0xfff2f075,0xfffdd2d1,0xfff29ab7,0xffef2ef5,0xfff3e42f,0xfff35581,0x00123bed,0xff6fac94,0x01c59048,0x026590f0,0x01b66cf0,0x01c0e6b2,0x02b0fb18,0x01e94552,0x020070a8,0x01d4058a,0x017032ae,0x01bf5922,0x01a62ab0,0x01928760, -0x02a646c4,0x0221c71c,0x00eabb5e,0x0286d378,0x00a859fe,0xfee1050c,0xfca46518,0xfeeb26b0,0xfe966f24,0xfe543e48,0xfe50b556,0xfe6c34b6,0xfe9274fa,0xfeba2a5a,0xfeea72b8,0xfefd81c8,0xff156a70,0xfef1fcca,0xfee643c4,0xfebaf538,0xfefa2dac,0xff0daef1,0xff2a0c9e,0xff1c37f9,0xff2c8e96, -0xff8dbc7a,0xfcbf876c,0xfd0ca5e0,0x005371a9,0xfcf8be50,0xfcfdfd2c,0x00390839,0xffca68be,0xffbb1811,0xfffa877b,0xff706670,0xff47f483,0xff3c885e,0xfcf568dc,0xfcf41460,0x004d5d56,0xfd0ba7fc,0xff73216c,0xfdcf3e50,0xfd61426c,0xfc5cf54c,0xfc1a8a10,0xfbee3110,0xfc5b8bd4,0xfd178a0c, -0xfe041ec4,0xfeb11982,0xff10a4ce,0xfed97b78,0xfe95ac46,0xfe1bec46,0xfeab89f2,0xfee5eec8,0xff3827c4,0xfef4e0ba,0xff7f8c64,0xfeaf4dec,0xfe5f4f92,0xff0f3199,0xfe1e576a,0xff17f9bd,0xff06b5ba,0xfee13f9c,0xfee95374,0xfe24fdd6,0xfdda992c,0xfe40cf80,0xff078707,0xfee51d7a,0xfeffca06, -0xff0d1b11,0xfeff1588,0xfef39888,0xff39b697,0xfe3931ea,0xfb84c450,0xfb10f6f0,0xfa8cd660,0xfa67f2e0,0xfb4c3c40,0xfc892684,0xfe188c10,0xfef3e110,0xff49ccef,0xfecf566a,0xfe620260,0xfd5c9e80,0xfea66fd2,0xff0f5eee,0xffb35ab2,0xff92660b,0x003e1298,0xff4f68c4,0xfe88a12a,0xff448935, -0xff683513,0xffae45ed,0xff90da60,0x0076b72a,0xffa9c216,0x0022e2a7,0xfeea8cca,0x0019d30c,0xff489b6a,0xff893805,0xffa03e7e,0xff80c367,0x0004cca0,0xff2622ec,0x02e216a4,0xfe7232aa,0xf81f8a60,0xf6b3cc00,0xf549c4b0,0xf4493320,0xf58b9d60,0xf7dae190,0xfb8f5f30,0xfea424e6,0x0008a559, -0xff611d24,0xfe2d45c2,0xfc6c085c,0xfe4e6068,0xff1d5e1c,0xffe692bd,0xff63a0a0,0x006f4550,0xffef9b1d,0xff251d0c,0x0123a2a2,0xffec2199,0x00c3c0c1,0x01118dc2,0x02542ce0,0x010e63f0,0x00ba8fc0,0x00d52e16,0x008918a1,0x00884231,0x00b9b66e,0x012b1d50,0x01d39ca6,0x02b50aec,0x01b3233e, -0xfb5ff120,0xf79d5ea0,0xf79c9680,0xf9104460,0x01243f50,0x00f0a2cd,0x02d42210,0x066a0550,0x028fb7ac,0x015ae45a,0x01386fbc,0x007e0b70,0xff82fdbe,0xfe209390,0xfbcd2198,0xfc66e5e8,0x00bbf5db,0x00d38016,0x021d73f8,0x0050d0d1,0xff3e4fca,0x01376148,0xff49f835,0x007882bd,0x00764f62, -0x013f16d8,0x0063e8dc,0x00a8c8ff,0x01cc6b3e,0x020f69a0,0x01e64220,0x0057b636,0xfed5bd78,0xfed78190,0xfe7a12f0,0xfdd718c0,0xffbdf43f,0xfeef9ada,0x02082510,0x01cd61ea,0x01c417e8,0x00521f60,0xfee18b0c,0xfe5591c2,0xfcfd9c3c,0xfb313990,0xf6aa0a10,0xf573db70,0xf5526480,0xf608d550, -0xf89d84c8,0xfa1936f0,0xfb808008,0xfbed24d0,0xfe1b9312,0xfe9cfc3c,0xffef513f,0x00ed010b,0x0044f9d0,0x01117f5c,0x00fe8cd3,0x02208528,0x014bfb00,0x0102fdaa,0x002f4c50,0x01e43de2,0x01f04d36,0x0195ae6c,0x0274e0d4,0x013f3e32,0xffe98827,0x004e8d1c,0xfd728278,0xfc9b526c,0xfe943d46, -0xfa26ea80,0xf199b1c0,0xf1d0acd0,0xf4665c00,0xf9e82f00,0x009818dd,0x030524bc,0x01c5f930,0x007aa1b1,0xfe33be9c,0xfbee0528,0xfb148c68,0xfaddefd8,0xfbc7a108,0xfc948ed4,0xfe40994e,0xfe77d684,0xfe5893e8,0xff554b92,0xff2fd75c,0xffc00759,0x00e70950,0x04250160,0x006ac2fa,0xff61230f, -0x000d98fc,0x004e7c48,0x010d41be,0x035db514,0x001c551b,0xfeb273cc,0xfedc0a44,0xfdbad5c4,0xffefd214,0xfe42c784,0xf6433250,0xf1580ce0,0xecd33c00,0xf171cb90,0xf4664ef0,0xf89d0e60,0xf5039590,0xf59a1e80,0xf85aa5d0,0xfc4d4fe8,0xfedcd7fa,0x0058beac,0x00d0b45e,0x007f85da,0xff9ffb2b, -0x00ba03df,0x015b250c,0xffee40df,0xffa0f1c2,0xff92af21,0xff87b07e,0xffac2d30,0x0026d389,0x0269cf94,0x00ea8e02,0x00375bad,0x0155fe82,0x00227aad,0x0047d037,0x01583c64,0x00991aff,0xff7ab0c3,0x0036cb50,0xff6cbedb,0xff929879,0xf8367240,0xf3b31d10,0xf42146d0,0xf25bc550,0xf4f7dff0, -0xf71036c0,0xfa5912f0,0xfa263810,0xf987b9d8,0xf73fa5f0,0xf95e7730,0xfb238090,0xfc09b1e0,0xfe5a322a,0x00000fb8,0x01087f56,0xffe5b0cc,0xff276e6c,0xff02930b,0xfedca636,0xff5f449e,0x00b238d7,0x008e72cc,0x00729292,0x005e7d8c,0x004e9196,0x004ad8d0,0xffd44270,0xfff05833,0xffe5144a, -0xffe26801,0xffb14028,0xffc42528,0x008d5bf2,0xfd778f28,0x0188ca14,0xfc872920,0xfb2585f8,0xfba8d1b0,0xfbdc5b10,0xfede4560,0xff8aea08,0xfe6bb2d8,0xfefeb3c4,0x002622a2,0x018b877c,0x0074f9df,0xfe9c0306,0xfc5c9dc0,0xfc9025e4,0xfd632a98,0xfe76ea04,0xff9a7789,0x002edef8,0x006c7f24, -0x001dd80d,0xff9e13d9,0xff1d12f0,0xff6ad97e,0x003c62af,0x009bab23,0x007bb8fc,0x008585d1,0x0098dfdc,0x00eb9afd,0x00cbce1c,0x002ba906,0x005dfbfd,0xff9475c1,0x00098130,0xfe0e63de,0xfd68c71c,0xfd957840,0xfdf4edc0,0xfdedc0e8,0xfddd7d1c,0xfdc4fc48,0xfdc68bb0,0xfdee46e0,0xfd55bfb0, -0xfc6d14b0,0xfbb9d410,0xfd33588c,0xfefda89a,0x00b9366f,0x007e85cd,0x000d1d58,0xff70a582,0xfef5adde,0xfee266d6,0xfe6139b8,0xfecdb7e6,0xffdd5ccb,0x00928dae,0x00ab7075,0x00b9a998,0x008be389,0x008e647f,0x001d6b72,0xff94caee,0xffdf7ada,0xffce7d79,0xffbeaacf,0xff868e9b,0xff283f18, -0xff30644f,0xfe744e8a,0x013e6df0,0xff92e656,0xffa1eb8c,0xff2592a7,0xfef679d0,0xfec6b8e4,0xfea30926,0xfe7fbd9e,0xfed8775e,0xff6c9db2,0xffaa0494,0xffc3530a,0xff764151,0xff6c7010,0xff39833b,0xff519c58,0xff8d1e11,0xffad1b0c,0x00192a9f,0xffbc516f,0xff10a1d8,0xff4daa5c,0xfec69faa, -0xff567c8c,0xff3d28f2,0xff2ac42a,0xff5f5836,0xff136c45,0xff56c9f2,0xff891d78,0xffca4131,0x005954dc,0xfffb2817,0x006484f4,0x001dbeb1,0xfff54c92,0xfe7b7332,0xffb696ec,0xffc01709,0xff9a4427,0xff96f124,0xff7e33e4,0xff68622d,0xff3f1a27,0xff512d46,0xff43fb00,0xff50fca3,0xff55094a, -0xff709278,0xff8116f5,0xffb1621c,0xffcb8943,0xffd9f33f,0xffd9e960,0xffe4220e,0x003bf950,0xfe7f7378,0xfeb4ec86,0x00c408d1,0xfe91a534,0xfeb13312,0x0104ef10,0x00fd8962,0x01195e92,0x0130fc54,0x0110eba8,0x011a667a,0x01108080,0xfefca6fe,0xfe7b69c6,0x0160255a,0xff1e6f2b,0xffe54909, -0x028d9334,0x02a4b6a4,0x022d1ac4,0x0219cec0,0x028eaf08,0x02bd07bc,0x034565bc,0x034d6d0c,0x02f2c388,0x02e69a14,0x02bd2e14,0x026ecd40,0x0268f048,0x02560010,0x025c1c2c,0x024ddd4c,0x024de458,0x02439dd8,0x0264527c,0x022f8a78,0x026a0b70,0x030853a4,0x0158267a,0xfcd5e3a0,0x0373cb20, -0x01a7840a,0xfd66ceac,0xfd7a6ca4,0xfd7d08c4,0xfd958d84,0xfdbfee8c,0xfddba548,0xfe11feec,0x01af5a68,0x037d25fc,0xfd42a714,0x011b4b38,0xff94813f,0x0166b0d6,0x01580458,0x02469998,0x02ef4b04,0x051367c8,0x05b684c0,0x04cfcbd0,0x0495d8c8,0x03db3dec,0x03107814,0x0312c024,0x0316177c, -0x0324571c,0x02f9af88,0x02e4b490,0x02afea54,0x02f3dc2c,0x0274f7e0,0x02dc9ff4,0x0063e616,0x01cf19ca,0x0243be8c,0x01975440,0x01909d04,0x029d0548,0x02546688,0x02c7b094,0x02527898,0x029c8f34,0x0240e4cc,0x01dfdc2e,0x01fb2d26,0x0116e4c8,0x017c0a08,0x020dd34c,0x000ff476,0xff55edd4, -0x003baf5d,0x01bd64ea,0x02f26270,0x07951388,0x085faa10,0x06442a08,0x06269580,0x04a49958,0x02df90f4,0x027b9884,0x021b3608,0x026d5250,0x0236927c,0x024904b0,0x0221ca14,0x0289ac80,0x025c6410,0x01f0ef82,0x023d7a04,0x01b62156,0x011483a4,0x01dd8c7e,0x01c9de28,0x0235ec9c,0x0141a922, -0x01a72a00,0x0163d594,0x011a62d2,0x010eab10,0x0186425c,0x013ae0b6,0x013991e0,0x00a05606,0x007f0499,0xfd947ef0,0xfa66c5e8,0xfbe506f8,0xfe20400e,0x011c74ba,0x0a80d1d0,0x0d18b350,0x0a529e20,0x09937bb0,0x07059cb8,0x03ee9978,0x03e1f584,0x041ca658,0x044ff388,0x03cc98cc,0x0383895c, -0x031c9d64,0x03f04400,0x026d2018,0x020c05d8,0x019a10e6,0x00bbd535,0x00b1418b,0x01061ec0,0x013c8cb6,0x01cae37a,0x01321bcc,0x00787000,0x006cf154,0x00d7e136,0x00d7a6f7,0x00b27416,0x00c26917,0x00b5ca71,0xff7c96a4,0xff7fd129,0xfe64466c,0x053e6b08,0x0823c980,0x06cc51d8,0x05a28f48, -0x02c21e6c,0x0139ed92,0x0217fb60,0xffd026dc,0xfdf7f1cc,0xfc800860,0xfb1ca268,0xfa780170,0xf9b40010,0xfe97d7fc,0xff5c6489,0xfc0d5ce8,0xfe4a5ad4,0x002a0d04,0x04404468,0x02dc702c,0x0159d216,0x017ac02c,0x015788fc,0x014cde8e,0x01973f06,0x00e31600,0x0104fcac,0x01bd76de,0x01d67876, -0x011c432a,0x0001f2b8,0xfff5f53a,0xff3b3ffd,0xff5c52bc,0xfe33ab6a,0x0218c90c,0x039db348,0x07d25818,0x07ec50f8,0x051e5d20,0x03abc51c,0x031935b4,0x0234b240,0x0116a4cc,0x0197b2b8,0x03876370,0x03eda404,0x046552a0,0x0560e170,0x044a9508,0x057614b0,0x085e5bc0,0x063f77f8,0x04310a00, -0x02cba5fc,0x00fdef07,0x013dd3a4,0x00fbb65c,0x0132cd58,0x01696c14,0x026560d8,0x00f13caa,0x00c341cd,0x00f46665,0x021e99a0,0x0210a088,0x023350b8,0x024d1c60,0x035fc2b4,0x02cac964,0x041e9018,0xff8b1c2e,0x04214510,0x065134a8,0x043c7ea0,0x069130d8,0x08665270,0x09b031d0,0x0a333e50, -0x052ae7d0,0x044dd0b8,0x0536f1f8,0x083a5c20,0x0a2f4eb0,0x0a613fd0,0x082ef220,0x049bb278,0xffc059eb,0x0044f623,0x00ccc5d5,0x0046bd99,0x00d1aaf3,0x007fa88c,0x015743a0,0x015d6a86,0x017a9afc,0x03c91c38,0x010c50ca,0xfffd88b0,0x0036177c,0x005423b8,0x01067fe0,0x03452794,0xffaec9bf, -0xffdf61be,0xfe075cae,0x00065761,0xffddf124,0x00c72113,0x071f9020,0x0b92b650,0x13bce140,0x0a73a9b0,0x04c51b08,0x016c44b6,0x020077f8,0x02cdb1a0,0x046450b0,0x04992e88,0x04d116a8,0x04468498,0x0534bfa8,0x059726f0,0x04d36098,0x05ed2610,0x04d958d8,0x0234cda8,0x00763e99,0x00d7d780, -0x00cc5762,0x011b9394,0x017cd2c2,0x027c3ff8,0x009aff7c,0x002c80a4,0x017e2654,0x00ace9be,0x00c4b87e,0x024300a0,0x00a0e77f,0x01c5e96a,0xfffcc81c,0x018e108e,0xfdc9a4b0,0x05a474a8,0x0c627de0,0x0adb16f0,0x0a3dc070,0x07ed3ca0,0x07e0a408,0x08402f40,0x08409af0,0x07f647d0,0x08ad1620, -0x051c7748,0x0360233c,0x0317469c,0x01d0e724,0x00f0db0e,0x009db0a8,0x014585be,0x0186c49c,0x01a5a866,0x00d97d4e,0x0198b2f6,0x007721ee,0x00ce3086,0x011a970e,0x014848dc,0x0140636e,0x01105a06,0x008293a2,0x00d1350e,0x010059ba,0x0166ddd0,0x00d33d99,0x00796a0f,0xffa36c2a,0x01d5de90, -0xfd63b760,0x0350b04c,0x05a409f8,0x03c56f70,0x028ba1c8,0x0285ffec,0x02c9ced0,0x043efc08,0x00ce9d43,0xff2119da,0xfebfa70c,0x00efb0be,0x022335c8,0x0253f48c,0x01c4c004,0x01afe198,0x01d8d58c,0x01e70332,0x020df7a0,0x00fc9db6,0x00420abb,0x00e6d45f,0x01195f78,0x01c5b64e,0x0144500c, -0x0094c70c,0x00b7aefc,0x00b843f2,0x00d2508d,0x00e85e35,0x00e0f562,0x011def16,0x00a2b8a5,0x015d95f8,0x015c8cee,0x02800340,0x015b72b2,0x01578fe0,0x019eb8ba,0x01548c66,0x018acc1e,0x02575410,0x03140b84,0x043fba20,0x03e3ec94,0x03c20d68,0x02e24114,0x01bddcdc,0x008f9d1a,0xffa46c0e, -0xffc6d41e,0xffb3e713,0xff7c6170,0xffc4b558,0x0062adf5,0x00d615e6,0x00516fbc,0x00375d10,0x002f75fb,0x0078a11a,0x007861e3,0x0113bcb4,0x008c2222,0x011986c8,0x009969ba,0x0114a846,0x00ee4929,0x01854d90,0x018c66fa,0x01620662,0x0113b8ee,0x01674184,0xff030d74,0x01d91ec6,0x01fff540, -0x028b0c84,0x02d11348,0x0321181c,0x035922b4,0x03a01994,0x02d42878,0x022bdf1c,0x01c68b78,0x0176a626,0x0142221c,0x00da4f88,0x00fdcb0a,0x010bd44a,0x011d960c,0x01442f9e,0x0110d052,0x01716f08,0x0032d109,0x018a8f62,0x01e5a468,0x015479b8,0x0171f352,0x02234cb8,0x01f19f4a,0x02208de8, -0x0185e44c,0x01b85704,0x015db4dc,0x00d645cf,0x00e9061e,0x0073d7a2,0x00d71031,0x0169fe3a,0x0271c9f8,0x029adb94,0x024abaf0,0x028f36b0,0x02ab1c9c,0x02cedb04,0x02ed4160,0x03355cb8,0x02eeb1e0,0x02c815a8,0x0287fc60,0x02425a50,0x01f922a0,0x01a2105e,0x01c0830a,0x01cdd970,0x01d7d644, -0x01e6a412,0x01d91b24,0x0221d810,0x024792cc,0x0118e2ce,0xfe2d2d22,0x02cf6990,0x0156793e,0xfe4d62fc,0xfe5b4400,0xfe6602b8,0xfe8a6afc,0xfe8d9104,0xfe9f9790,0xfea47a5e,0x00fa5869,0x02b16838,0xfe36e32c,0x00dcaac8,0x02ee9d94,0xfc94bb3c,0xfe4e5c56,0xfbfcd1b0,0xfd08b710,0xfc9133bc, -0xfc7f3adc,0xfbdcdbe8,0xfbc3d798,0xfc12a6c8,0xfc1206cc,0xfc2f5680,0xfc5bc178,0xfc76a2bc,0xfc8bb9f8,0xfc9b9888,0xfc9dfd90,0xfca2728c,0xfca053dc,0xfca8b280,0xfd0dbab8,0xfbff3220,0xfe6b8798,0x01231854,0x0580ab30,0xfda72e68,0x00f838f8,0x0543c628,0x05300318,0x05158498,0x049c6280, -0x04dbd100,0x04db97a0,0x04b5a670,0x00cbdbac,0xfd276030,0x050124d0,0x0120bda6,0x01383980,0xfc2b0c0c,0xfcf35ca0,0xfcc26a18,0xfc8ece40,0xfacbd940,0xfa017608,0xfa9f5950,0xfa567928,0xfac11518,0xfb4b1da0,0xfbbc9c68,0xfbfcf5b0,0xfc0c1a5c,0xfbfc7308,0xfc03287c,0xfbf8b7c8,0xfc54b9c0, -0xfc89ae00,0xfc60d144,0x01e4fbd6,0xfe559aea,0xfe52abca,0xff680c7a,0xffe847c2,0xfe80379a,0xfe4bee52,0xfdf43228,0xfef24b6a,0xfdcf1724,0xfdb0cebc,0xfef15632,0xfe581952,0xff8b7c20,0xfeffafd6,0xfcc7f5b8,0xfd2ee638,0xfc5c9018,0xfc7b4c28,0xfbbfa220,0xfb12cd68,0xf7efed60,0xf6ca2f20, -0xf84e2ed8,0xf7b3caf0,0xf85999e8,0xf9803488,0xfa41d270,0xfaeee588,0xfb326948,0xfb4fb728,0xfb6e0ab0,0xfb685548,0xfc30172c,0xfc2686dc,0xfda6041c,0xff066f31,0xff235570,0xff0f8b6b,0xff947998,0x00c01bc9,0xff7a4877,0x00e3975f,0xfef89e5a,0x005baa0c,0xff80f1bf,0x0083dd61,0xfff16f31, -0x0001620d,0xff6bf8a8,0xff3ac336,0xfd5fbf14,0xfb620618,0xfbc318d0,0xfd55b6dc,0xfd25faa8,0xfd0fc888,0xf81f8250,0xf4fa3010,0xf6280980,0xf4c832b0,0xf5f3ebf0,0xf7d61640,0xf9563408,0xf9f62690,0xfa1cfff8,0xf9fe4e48,0xfa5e51d8,0xfa893278,0xfbaa8e08,0xfc61e17c,0xfd31bf30,0x00174073, -0xfecb0334,0xffdd06d6,0x000ef053,0x00d2029d,0x0114f1c6,0x00c2c319,0x00d0ccae,0x003ade71,0x00bdcc3c,0x0044516a,0x00264bed,0xffb16d21,0xfeba98f6,0xfe4109e6,0xfb83c4e8,0xff96b3bd,0xfcbd70f4,0xfc2cff3c,0xfae48ce8,0xf6462880,0xf3d68170,0xf3da44b0,0xf834c050,0xf777ab80,0xf6cc0700, -0xf57700e0,0xf76aedd0,0xf9f78f50,0xfd2e5cac,0xfcd4d450,0xfc572c64,0xfb356fe8,0xfca30014,0xfbeee6d8,0xfc7ecb5c,0xffd25d7d,0xfe7b6c46,0xffc1adfb,0xffe78ef8,0x00608534,0x016cbe7a,0x00c76360,0x00b813a6,0x00e9c193,0x009779c7,0x00880798,0x0086fb12,0xffb8179d,0xff5acfd5,0xff05211d, -0xfe2749a2,0x0420b8c0,0x04d02f20,0x056d6ce0,0x037ba0d0,0x011a67c6,0xfc448c94,0xfbcd6310,0x00d4c3ec,0xff465a90,0x00668f95,0x019c2f40,0x012f9154,0xffe0e4e3,0xfe56f3ca,0xfda4a18c,0xfc7158b0,0xf9d7caf8,0xfa74f398,0xfa14c728,0xfdc9e358,0x00158138,0xff47d77d,0xff821329,0xffa13d03, -0x000b5fbb,0x018ce192,0x008f3c03,0x005becf9,0x0093a0b9,0x00fd63eb,0x011dd0a4,0x017ae040,0x019ba718,0x013fc44e,0x02aac818,0x024f1b14,0x03a4357c,0xffdb4123,0xff7069e6,0xfff89f2f,0xfab12e68,0xf7e6bfc0,0xf4a95840,0xf6ec3750,0xf9416880,0xfa392738,0xf8167d00,0xf61b9c60,0xf55b8e70, -0xf6267840,0xf94d60a0,0xfc21c468,0xfe162754,0xff45a34c,0xfef61b4a,0xfe9c1a70,0xff515865,0xffb53593,0x009f43a6,0xffe681a7,0x007da0f5,0x02d97534,0x00e087d3,0xffe2d673,0x005c306e,0x0002912c,0x00d3cfa2,0x0320d170,0x01de84fc,0x01845f82,0x019247da,0x015fb3e4,0x01b6eef2,0x0177be38, -0xfe811844,0xfbe8c6f8,0xf48aa950,0xf6b61c50,0xfa3de3b8,0xffa67330,0x00b9d495,0x01e35e36,0x013f5f0e,0x00721b1e,0xff9b310b,0xff6193ea,0xfd7a93e8,0xfccdc9dc,0xfd343c94,0xfd3fd9f4,0xfdf8e4c0,0x002a0d94,0x021edcc8,0x01250d1a,0x017868ec,0x01c7607a,0x015eb6e4,0x01b462f4,0x001c98f9, -0xffc568bd,0x00cd47b4,0x002a4df2,0x006cf013,0x009c07bc,0x00e8c6f4,0x007059dd,0x01107bde,0x002f653d,0x03f99290,0xfea5df8a,0xf70fa4e0,0xf7c61920,0xf98049e8,0xf82f7358,0xf809b188,0xfa1f7250,0xfab336d0,0xfbc074e8,0xfc16b964,0xfde748b4,0xfdeea6d0,0xfd1f4334,0xff239284,0xffcec4f6, -0xff0c5089,0x010c62c6,0x00439798,0xff64d76f,0x00878f6c,0xff2aefbb,0x000264ff,0x006d88f5,0x00880ea8,0x008a7f84,0x00f4ba97,0x007035f6,0x0048569e,0x00329e2c,0x00d8ac06,0x0184cc46,0x014eaf28,0x011d1d54,0x01951092,0x001ba376,0x0509a288,0xffd61a7b,0xfdbb5c14,0xfe5d8076,0xfc1d0e88, -0xfba6b1d0,0xfb708d98,0xfbded218,0xfded68d8,0xff5c0f39,0x0022fb1c,0xffadf6f8,0xff671eb2,0xff3706af,0xfdf16b2c,0xfd7a0854,0xfe2d0db2,0xfea65238,0xfee952e8,0x00a76568,0x01213642,0x002f450e,0x00ce3603,0x00467cb5,0x004dccff,0x00299d91,0xfff57495,0x0036d2b3,0xffe7bcd9,0xffacec9b, -0xffb33ab7,0x007fde04,0x004f0391,0x00174209,0x00bada9a,0x00626834,0x0030d38b,0xffa18bc8,0xfe327db0,0xfda4c898,0xfc921ed0,0xfd25a824,0xfd53eeac,0xfd7aca3c,0xfdb97a40,0xfdf8b494,0xfe8bb0d0,0xfeb8f65e,0xfedf5de0,0xff2a1af0,0xff1f2c21,0xff43d039,0xff6abbfb,0xff65ad44,0xfef64f18, -0xff1060d0,0xffc9fab9,0x0009140d,0xffecbb51,0xffdb790d,0x00a02d55,0x002d1a25,0x010b5c90,0xff9cb147,0x00f69206,0x00743ef9,0x0190da8c,0x013bf89e,0x015ff1b6,0x018f5364,0x0204607c,0x00b01709,0x022df514,0xfe5bab32,0xfe671668,0xfe7f04b2,0xfe724fba,0xfe444fe2,0xfe14b0a8,0xfdf0674c, -0xfe31752a,0xfe688d1c,0xfe8c93ae,0xfed5935a,0xff278eba,0xff768f4f,0xff861ed1,0xff8ca8d9,0xff7fde92,0xff7611f8,0xff88e41c,0xff514569,0x0157ef4e,0xff4cd86c,0xff23fcf9,0xffa794e5,0xffa9a059,0xfea9a674,0xfe6f53c8,0xfe7fc1d4,0xff59be2d,0xfe5bb9b6,0xfe20f652,0xfedb6b90,0xfeb475d4, -0xff9c4a32,0xff7c9e71,0xfe82f590,0xffff52db,0xfde8c164,0xfeb775ce,0xfe83a2ba,0xfe8900a8,0xfe832c1c,0xfe81804c,0xfe6b0b84,0xfe9815a0,0xfeb91c9a,0xfeddf426,0xfef9bcee,0xff0fdc8d,0xff36f11a,0xff100c9a,0xfefbe12c,0xfef2b746,0xfee12ac0,0xfef624a0,0xfe5ea528,0xfff40da3,0x01c00046, -0x04834568,0xff37a72d,0x019bf662,0x04b33ce8,0x04aa0440,0x04745b00,0x03fe0d24,0x042cab38,0x041402d8,0x03d5ab5c,0x019d9f46,0xff0855b8,0x043fd588,0x02018928,0xfe890560,0x01d64aca,0xfed8d6f0,0x02d68e60,0x014b8666,0x01810860,0x01465584,0x01af9e34,0x01d35ef2,0x01b8bcf0,0x01f20844, -0x01efe440,0x01c0e0bc,0x01d72074,0x01dc095c,0x01e6b91e,0x01e6d8b4,0x01efc982,0x02044f28,0x01fe505a,0x01a9c636,0x02e58ac4,0xfef5fd7a,0xfc918ce0,0xfa4faa58,0x0016a7e4,0xfce82a28,0xfaaed890,0xfa915378,0xfa961a90,0xfb173058,0xfa8dc7e0,0xfa806dd8,0xfabaa698,0xfce6d82c,0x007da463, -0xfa797308,0xfc24ce28,0xfb793b60,0x01f87b42,0x019adfe2,0x01314984,0x00aef15a,0x011ccc5a,0x013e2c4a,0x01229572,0x0230bdd0,0x026d1e54,0x01e04538,0x01ef58be,0x01fea8f2,0x025018cc,0x027b1fd0,0x028de438,0x02b74c8c,0x02604aec,0x0283a3dc,0x02070720,0xfc6ad094,0x005c92f0,0xffe9b028, -0xfffe625c,0xff9ca7f4,0x008f8684,0x00e70d4c,0x00c4ce35,0xffa25feb,0x00dbfd99,0x0160b3d0,0x0058bdf2,0x00baddad,0xff4cbed0,0xff1f8588,0x01186124,0xfe59090c,0x01250c46,0x01dc7fd4,0x0086b8fd,0xfff871d0,0x00c1bebb,0x015d3ed0,0x00e9b0c9,0x02afae7c,0x0302f6d0,0x02178024,0x028436ac, -0x028225f0,0x02d8c160,0x02c9f1b8,0x02e670c8,0x0386f988,0x02babaf0,0x0360b098,0x0131de6e,0xff20f61d,0xffede310,0x00268525,0x00fe4f58,0xfff63af9,0x00fbc8d3,0xffbbe72a,0x01b7d37c,0xff916deb,0x00e3fbd4,0xff6bf86e,0x006a614b,0xfff556c8,0xffb01eb2,0xfed889e4,0xffa1c60f,0xfdc44c88, -0x01f2636e,0x02f1a8e4,0x015d523e,0xff40c624,0xff032bca,0xfef684da,0xfef7432a,0x02b2e3c8,0x040f5538,0x02924e4c,0x029a99a8,0x02c9967c,0x03d9bb04,0x040e19e8,0x0433d628,0x04bc51f0,0x03a05524,0x03ac9e54,0x01d51450,0xfec4e466,0x0139fac8,0xff697217,0x01b55836,0x01e11a3c,0x01d453c6, -0x01568ba0,0x00ac757c,0x0192d352,0x00bd285d,0x00fa0bf3,0x011d01f4,0x01397bb8,0x0046915d,0x0057bb2e,0x007c8546,0xfe8f13ae,0x03170cb4,0x04e150c0,0x01c57a06,0xff89ae83,0x0077790c,0x01be118e,0x0268ae3c,0x009460bb,0xffe31073,0xff7dbcfd,0x00141504,0xffafe884,0xfec9c0ba,0xff4bffc6, -0x006e649a,0x020db4ac,0x0284d768,0x03cdcfc4,0x012194b8,0xfe27ee2e,0x01009842,0x005fe9f0,0x00ec8330,0x00bb70f5,0x012004ee,0x0157f276,0x0130653e,0x00d135a0,0x01255b4c,0x013b2170,0x00703620,0xffe7a6b5,0xfeba51fc,0xfecd6e84,0xfeb96a44,0x057f1168,0x054d8e68,0x03678138,0x037da814, -0x0684da90,0xfe5eddae,0xf983ed38,0xfab514b0,0xfbddcbd8,0xfc901ec4,0xface6a98,0xfc0ab324,0xfe110b8c,0x007e96e0,0x035e8ef0,0x047e9788,0x04780f10,0x031477d4,0x0294a82c,0xfee396e2,0xfd5c24cc,0xfea0c994,0xfeff9f40,0x00d45f10,0x011cd3c8,0x015bddfa,0x00e37192,0x0073a51f,0x0054ff09, -0x00fb15ba,0x01164a9a,0x02b3975c,0x00fac10d,0x026305e8,0x03fdf9e8,0x059e4150,0xfd7b9fc4,0xfe0f310c,0xff0e6d23,0x00ad856c,0x04a83d88,0x0612a598,0x0a296800,0x0be57a50,0x0aace710,0x06ee4cd0,0x02eaa594,0x01c00698,0x00b2b53b,0x00619298,0xff2da4ba,0xfe0036d8,0xfd8934dc,0xfd49e970, -0xff3d1fd3,0x00c8bed4,0x00ddf874,0x01554b24,0xffaa366b,0x0137184c,0x0199bc9a,0x01d420ac,0x0113747a,0x006ad36f,0x00e55344,0x001f472a,0x00e8dead,0x02ed53a8,0x02486290,0x01b5b910,0xff5a3125,0xfe335b2e,0xfef51170,0xfdc1c134,0xff4f9bcb,0x003c4853,0x049004b8,0x03926214,0x028390c0, -0x02316584,0x017f5046,0x01ed5b72,0x02c3d8ec,0x025dedf4,0x012abc2e,0xffdc1547,0x0107c9ee,0x01cd4d32,0x01c2e034,0x016a877a,0x011092f2,0x001ba5b9,0xff4e8baa,0x003e65f9,0x00d2ea02,0x015a6410,0x01296584,0x010dfccc,0x00c68a0f,0x00403241,0x00f01f42,0x0080ccca,0x00c9eac5,0x01467674, -0x00ea0e21,0x01616b02,0x0099da25,0x008256e8,0xfc661434,0xfeb1ada0,0x02d0c074,0x0223f218,0x02e5867c,0x02ebe138,0x03560f74,0x03a6fa28,0x01cc2a04,0x0174d8da,0x0222e508,0x01ea5da0,0x023742d0,0x01c7c784,0x008c535e,0xffce0c66,0xff8c394a,0xff4cd09a,0xffbf031f,0xff4043ad,0xff3652fa, -0xffdb80df,0xffbfcbe1,0x000a1eda,0x00606f70,0x01062508,0x00aa71c4,0x00c53b6b,0x002e0a29,0x009dbb1b,0x008b6a67,0x00a6ab98,0x001998a3,0xffb2b475,0xfefa0d84,0xfeb52192,0xfcd56ed4,0xfe642152,0x00ad880f,0x008eaece,0x01d28f76,0x01fe48f2,0x030aa798,0x05245910,0x03d9ca10,0x02ee7bf0, -0x0163c464,0x017c332c,0x01743cca,0x01ba0268,0x02105658,0x0217302c,0x0205409c,0x01db2710,0x01298d9c,0xff53a041,0xff980c32,0x000956e7,0xff63373c,0x0022d18d,0x00c9bf72,0x0124c592,0x00caa4c1,0x007fe078,0x011fed14,0x009857ce,0x0076d7c6,0x007b6313,0x003fe9bb,0x002b5feb,0xff84c2fd, -0xff92849d,0x0078b84f,0x01c6f7f6,0x026ba578,0x01a44102,0x01884a9c,0x01dc835e,0x02221450,0x0272b900,0x0184ad9a,0x011fb6b6,0x00a9ab48,0x00b4c0ba,0x009f9333,0x007967d5,0x00768f41,0x00680b5a,0x009edd9b,0x00d31cf8,0x01d70dee,0x015fd55e,0x00123fdd,0x006f2908,0x00a675dd,0x00890210, -0xffc7c1ee,0x0002b7c0,0xff83a189,0x00e1e55a,0xff8593f0,0x00e1045d,0x004a45d7,0x010e7fde,0x0087ee33,0x003756f3,0xff8b1274,0x007389ee,0xfd361638,0x004ec701,0x00f73493,0x01622430,0x01fcf15a,0x02841574,0x02fa7084,0x038e544c,0x03232500,0x02b07a00,0x0220d228,0x01685ab8,0x00b2ee13, -0xfff710c7,0x00348913,0x005b8feb,0x007acc47,0x00713126,0x007d33ab,0x00b0f3fa,0xfeadd830,0x0046e82f,0xfff9f639,0xffc15fa0,0xff847fed,0x003d378c,0x007ca868,0x00010e68,0xff179910,0xffec7105,0x0006d24a,0xff40ca2b,0xff7cfc6c,0xfeeca0b4,0xff051a44,0x00202362,0xff4dd0b0,0x01f1543e, -0x0170d29c,0x01b0f6b4,0x01d41a0a,0x01eb46be,0x020a0ac4,0x024b9944,0x0203b084,0x01e465a6,0x01cb5926,0x01ba9df0,0x01ad46f8,0x017a8982,0x018cfa14,0x0184e6aa,0x01891048,0x0198410e,0x01816a7a,0x02186ef4,0xffac1c84,0xfe215242,0xfd05f270,0x00310d82,0xfe10592a,0xfcab15f8,0xfc8d47c8, -0xfcbe2930,0xfd31a804,0xfcd8180c,0xfce88b3c,0xfd0e1380,0xfdec9d90,0x000f6624,0xfd232f18,0xfdb2c684,0x01d28f64,0xfe98c106,0x01fe36c0,0xfdebeae8,0xff0c99ce,0xff006305,0xff02f1f5,0xfeb4c684,0xfe72bdd2,0xfe094c12,0xfe61ca44,0xfe6c7c90,0xfe35a558,0xfe6c0f12,0xfe7c97f8,0xfe97c0de, -0xfe7c265a,0xfe7bd4e0,0xfe7eebbc,0xfe856d5a,0xfeb98344,0xfdc255fc,0x01e690c4,0x035e85f0,0x032cf4ec,0x01393e2e,0x035c9a14,0x0328d100,0x036a056c,0x036afafc,0x02f6610c,0x038ed174,0x03a16c48,0x03931bf4,0x034a6678,0x00e72f7f,0x0305d1f8,0x039cae54,0x032d14f4,0xffa97a1c,0xff82d08d, -0xffd135a3,0xff5d131f,0xfeb2dbf8,0xfe56e9e6,0xfd65a16c,0xfe074d92,0xfde508d0,0xfd4399b8,0xfdb5e4e4,0xfddb3320,0xfe252bbc,0xfdd0f5c0,0xfdd97588,0xfdf22218,0xfe535126,0xfe0daf36,0xff12c5ed,0x02d6b7c8,0xffebe5c7,0x00df0384,0x00ac9fb7,0x01225a86,0x00740e16,0x001db032,0x00741a59, -0x016c9c88,0x00115610,0xff744a2b,0x00a0a3b2,0x007edd09,0x0180acde,0x01a7d0ac,0xffcbbc87,0x021f1ac4,0x0077b591,0x009c522d,0x019d87aa,0x010df3e4,0xfef70efe,0xfdef51a4,0xfbbd7360,0xfd9f1018,0xfdc76d60,0xfc81bc88,0xfd8168d0,0xfdc90bcc,0xfe6477c8,0xfdc532cc,0xfdd4ce6c,0xfdc97e44, -0xfe3569b8,0xfd7b9604,0xffdbb098,0x0163105a,0x0092fac5,0x00be2fd1,0x00b7f7eb,0x01b2d58c,0x005499a2,0x0181b014,0xff9fe979,0x01dcece0,0xffc4f587,0x0151642a,0x011d4744,0x014485a4,0x0149c9f4,0x02023d6c,0x014a1016,0x035041f4,0x02909604,0x037f1b2c,0x0457cae0,0x023f3b64,0xff9f393f, -0xfe772154,0xfb6ea588,0xfd85e0bc,0xfd139ccc,0xfafeafa0,0xfc52baf4,0xfcf0679c,0xfdceeccc,0xfc9f941c,0xfc92c980,0xfcff59b4,0xfda832c0,0xfd583c20,0xffa1de46,0x01395742,0xff0022c4,0x00fcc598,0x007b2a43,0x00b86657,0x00a4a8ab,0x00c80a49,0x00bd14a6,0x0042ad5b,0x007af45b,0x002ac568, -0x012426bc,0x0194d268,0x024434c0,0x026a3d14,0x02018634,0x03a47cb4,0xfed0c2d6,0xf9d9ffd0,0xfb562580,0xfcbb2f7c,0xfbca8888,0xfc2cba4c,0xfb0b1b78,0xfcd382ac,0xfe032288,0xfd942a34,0xfe663d1a,0xff1b4372,0x01157070,0x01fc23de,0x01f898f2,0xffc9214b,0xffaa374a,0xfe3cc6e2,0x002ef3fe, -0x018d8d78,0xff4ae403,0x00cee549,0x00f76a1d,0x0135261c,0x00eed605,0x0132a0da,0x01319d2e,0x00bcb787,0x01df13f2,0x01a84132,0x0065f67f,0x007a6383,0x0178c630,0x0134e25c,0x02643fd4,0x03453b50,0x00b62144,0xfff77ac5,0x021159a0,0x03ecb7f8,0x00e6ed17,0xff956edd,0xfdbbda10,0xff4ae2e0, -0xfeefa684,0xfda8d648,0xfef882d4,0xff8d9074,0xffbcbbd4,0xfdaec32c,0xfcaf2b0c,0xfbf8f568,0xfec1b5f0,0xfea1cc8a,0xff9b3d20,0x009c7950,0x00124bb9,0x00427c77,0x003d1635,0x008225cf,0x01020370,0x00bcd7c3,0x005df969,0x00389a0d,0x008a00e3,0x013ee3a0,0x02a7d1f8,0x01d51ec0,0x013c7534, -0x02c095c8,0x01903484,0xfee18bc6,0x0047f8e1,0x00c515db,0x01abed5e,0x04730500,0x02f5decc,0x036af7ec,0x017967fa,0xff8ed957,0xff065ef4,0xff58a1ef,0xfe7c04a0,0xfd3ce9e8,0xfc212954,0xfb4ed230,0xfc46cb18,0xfe06f782,0xfdffa41c,0xfcf85598,0xfebe82a0,0xffaa1b86,0xff667abb,0x00283318, -0x01d0927c,0x01b529c8,0x008aa973,0x0064d697,0xffc26cac,0x00710a60,0xff9a3999,0x007b78c4,0x02b15e94,0x02a2fcf0,0x018a6ed6,0xfff0661c,0xff7a6ad8,0x00f8a62c,0x02a53ce4,0x03684a00,0x04016850,0x0370cf24,0x01c0ab74,0x02287430,0x02dc54cc,0x07d8a4d0,0x0a27a490,0x099e0cf0,0x07a87020, -0x061c3b00,0x055cb820,0x02c19a90,0x012740fa,0xfff901ca,0xff5faea3,0xfea8d766,0xff56c883,0x004c032e,0xffdcb0db,0xff83498b,0x014dec7c,0x014d31c2,0x00691f9d,0x00cf7c48,0x010526de,0x014d98ca,0x01249bce,0x00f7076c,0x001a484f,0x00625786,0x00c3a236,0x00d88c81,0x00c56ecb,0x0301fa5c, -0x046046f8,0x04032de0,0x03d913ec,0x018e5ca6,0xff92f20e,0xff8fb382,0x016d5ba8,0x02be2f34,0x03d14558,0x04d06238,0x0528a130,0x04fc26e0,0x0504b2e8,0x0310d720,0x0226fb64,0x013d18aa,0x00754d28,0xfff3d828,0xffa5825a,0x002d6a36,0xffbb225c,0xffd5db0d,0xffead439,0x0022b68c,0x009eeff2, -0x0081df55,0x002ade12,0x00e1af46,0x005dc053,0x012374fa,0x0215b390,0x01f4f594,0x01a3577a,0x0132098a,0x027e0d0c,0x01ea0b86,0x02a9b1fc,0x00a888af,0x0057678d,0xffddfaee,0xfede1b1e,0xfe8ab9aa,0xff02e1dd,0x00cfc0a5,0x01428858,0x00713d99,0x008726d0,0x00fa5240,0x01c46358,0x02911740, -0x0222fbbc,0x00a951c7,0xfff74210,0xffc875da,0x0059dc77,0x008380ac,0x00e2d252,0x018a487c,0x00e54210,0x00966471,0x013dcd80,0x00d4595a,0x00a55969,0xffc70e0d,0x00266748,0x0047c4d7,0x003a17f8,0x0034f8f6,0x00812675,0x0092428d,0x0173509a,0x01e4a224,0x006fab48,0xff8ffc38,0x003b863b, -0x001dfdc2,0x00a939a1,0x00f90027,0x01004866,0x013764ec,0x015a9b42,0x01941d30,0x011fbb7e,0x00a49e3e,0x001ddc08,0xffdf7fb0,0xffcb4c98,0xffa6e3d7,0x005b46a4,0x005eef5d,0x015f168a,0x01d03ed6,0x011e2a92,0x00affd1b,0x007fe02f,0x007c1577,0x0027316e,0x00a74df3,0x00ad57e8,0x01bb19f2, -0x00dbaf02,0x0121f3e8,0x00be17b0,0x00f95ad1,0x016150b4,0x01c179d6,0x014b9368,0x018d6686,0x00b27946,0x007b1531,0x00b7630a,0x008fc57b,0x00911a8a,0x00809245,0x009e70bf,0x00c0ccf5,0x00e03463,0x0109ca46,0x01206170,0x014d63a4,0x0171fa98,0x01603cee,0x014bfe40,0x01197eb4,0x0102e308, -0x00cbe6f2,0x00b950fc,0x011cfee2,0x00c7ff40,0x0154b96e,0x014fc0b6,0x01886d8e,0x01791d5e,0x00fa1d2c,0x0125fd6a,0x0147666e,0x008ac874,0x0017af52,0x001e1106,0x00396640,0x0079103e,0x00b7cfc1,0x0037bbcb,0x0242697c,0xfff1e17f,0x00465a84,0x003ec8e7,0x0043bd0a,0x0049a81c,0x004af706, -0x003f5c5b,0x00492e99,0x004fa668,0x0052cb4a,0x00672ee6,0x00740565,0x008739c7,0x007d24f2,0x007e96fb,0x0082f68a,0x007cae9c,0x007bb82b,0x0028f951,0x0249e518,0x02fbfd94,0x020c2250,0x01fa70c6,0x0312fafc,0x02551b78,0x025963b8,0x023356c0,0x01e7b668,0x022ae87c,0x0220fac8,0x02039c88, -0x02cf77fc,0x01d4a24c,0x01c44336,0x02e8174c,0x0044432d,0xfe8d152c,0xfc56c9a4,0xfee4dfea,0xfe79ebe2,0xfe2dd7d8,0xfde542d8,0xfdf4d458,0xfe141f32,0xfe2ed716,0xfe820f2c,0xfea10600,0xfeaa4b4a,0xfe9eeb26,0xfea6a510,0xfeb7de3c,0xfeca69fc,0xfed0b088,0xfed38cde,0xfecc1bc4,0xfed154d6, -0xff49ca2d,0xfc6b5f50,0xfc795ee0,0xff3a4cbb,0xfcc9e8c0,0xfc7a03a8,0xfeff14ae,0xfec164c2,0xfebb40fa,0xfef59922,0xfe69d3bc,0xfe56e9d4,0xfe74d706,0xfc86e200,0xfcd62b60,0xff43f20b,0xfc6b8048,0xfe1aca58,0xfdbb0f70,0xfddc3940,0xfcf68d6c,0xfc6b770c,0xfc4fed3c,0xfc6e0768,0xfcae8944, -0xfd83f208,0xfe182490,0xfe52d208,0xfe637ca4,0xfe75b600,0xfe8d7ef6,0xfeb5bc76,0xfeb780ac,0xfec0e95e,0xfe88d1d6,0xff133b8e,0xfe61dab0,0xfd8634b0,0xfe94e2f6,0xfdda90b0,0xfeaf36ac,0xfe9bf2ca,0xfe4d71de,0xfeaec7be,0xfe0b8d76,0xfd8e5d90,0xfe16c5b8,0xfebe74cc,0xfebe2c04,0xfea6b862, -0xfe7c437a,0xfe5adeee,0xfe78060a,0xfdee46c4,0xfe177e3a,0xfd1fa7f0,0xfbd73fb0,0xfa2300f8,0xfa420430,0xfae64850,0xfbd2b238,0xfd1a4dd4,0xfde577a8,0xfe348a78,0xfe16a376,0xfe52b85e,0xfe81d2e4,0xff118799,0xff36566c,0xff46bbdb,0xff2d19a9,0xffd09408,0xfed9a1ee,0xfdb72d6c,0xfea6fb76, -0xff0ea0ef,0xff5f1044,0xff0c5b9c,0xff6f2843,0xff6884a6,0x002048fc,0xfeb3021e,0xffbcddcc,0xfee6a210,0xff8792ab,0xff59adb9,0xff5a2836,0xff4d97b2,0xfe36a6ac,0x0079db00,0xfe4db8ae,0xfb9fd3d8,0xf98f8010,0xf791a4c0,0xf73e9380,0xf7ec6c20,0xf8f1c600,0xfad56b80,0xfcc53248,0xfde3fe5c, -0xfdeb68a0,0xfe15773a,0xfe23abaa,0xfefafdc2,0xff213d91,0xff14979b,0xfed9065a,0x00281501,0xffb4c73d,0xfeacd614,0x00c7ecec,0xffd4dcc1,0x00f87af4,0x01584a6e,0x018fb554,0x012d5ec4,0x00d1b201,0x00f560fd,0x0030f63c,0x008601a7,0x012050c4,0x014bca32,0x013fd0fe,0x01c5b912,0x006a20f1, -0xf794b1a0,0xf91985e0,0xf9eb4808,0xfb4a6680,0xfe6b9164,0xfcbe1e4c,0xfc9c0048,0xfd478058,0xff3217b5,0xffd40259,0x0072fbe7,0x012e8018,0x0166de30,0x013488f0,0xff185998,0xff890122,0x02d4141c,0x018b1376,0x01a05af6,0xff3bd588,0xfe30232c,0x00589d9b,0xffad8344,0x00bb94ed,0x0075b084, -0x002d3b0a,0x01265412,0x01436526,0x00cd03cc,0x0146d600,0x0083f578,0xfe89f0ba,0xfefca836,0xfe58fa1c,0xfd0c1cc0,0xf98f0380,0x009906e0,0x035683a4,0x03da90ec,0xfeb37aec,0xfa6c8f10,0xf83db3a0,0xf85f4d00,0xf741c3c0,0xfc29c4dc,0xff092ab0,0x00183dea,0xfdfc1028,0xfc3562c0,0xfbe21e30, -0xfb75e008,0xfb487e00,0xfb250ea8,0xfc2064a8,0xfe276474,0xfdf3abac,0xfe881e30,0xff7ca14d,0xff972b92,0x0143321e,0x016bfb7e,0x01151c6c,0x008762fb,0xfff71bad,0x001685ce,0x004f489a,0x00cb80cf,0x01fb28b8,0x009a4f11,0x00094a54,0x0015ee1d,0x014556d2,0xff7e4c97,0xff5c96bd,0xfe638368, -0xff5286dc,0x01f5b4d6,0xff41d394,0xfde36fa4,0xfe27bbf2,0x01a1c624,0x0292bbb4,0x0109aff0,0xffd6b2aa,0xfe6a45a6,0xfd414870,0xfdc42f5c,0xfe530fea,0xfec8e2d6,0xfe2e515a,0xfe9c731e,0xfe2bf248,0xfdc934e4,0xfef322ca,0xfe612f56,0x00ad4036,0x00de2512,0xff0cc825,0x002c4f83,0xffdbff35, -0xfff1a8a2,0xff5c3246,0x002190d7,0x015a4cd4,0x019e83d6,0x022f5508,0xffa07cb8,0xff8ff5b8,0x00e026ba,0xfefbb5e0,0xfabe9778,0xf853e770,0xf82d7720,0xf9194e58,0xfbe957b0,0x00d73727,0xffe9fcae,0xff452735,0xfd05fcc8,0xfe46a1de,0xfeadbdc6,0xfec22126,0xfd8ab134,0xfd5a24b4,0xfe645386, -0xfe9d0208,0xff5ab7dd,0xfeffac76,0xfe7a744e,0xff1706d6,0xff3521dd,0x00eb008a,0x00f8a725,0xffcb48a2,0x00e75c51,0x0097104a,0x00e293b2,0x014a17ae,0x016079c6,0x0052ea88,0x0042b295,0xffcee828,0x0034a62a,0x009ef78f,0xff0016a4,0xfb550490,0xfa2ceff8,0xfab88560,0xfb2ea2a8,0xfb022728, -0xfbf9d568,0xfdbecdd0,0xfda34a34,0xfd343e2c,0xfade9f80,0xfcc137c0,0xfd95227c,0xfedc61bc,0xff64ee9a,0x00090217,0x007912df,0xfef8afea,0xfebe8b78,0xff42e67a,0xff20d0df,0xffd85830,0x004c6266,0x001af9b5,0x000f506e,0x001f3964,0xffdcfea0,0xfff5bf66,0x000bc342,0xfffd9211,0xfffe2311, -0xfffc1f39,0x00c89b88,0x00ce3177,0x006377a6,0xfe001b5a,0x008152b0,0xfe3d09ae,0xfea9abfc,0xfe9f62ac,0xfea5dd28,0xfe18eb30,0xfe4035ca,0xfe92733e,0xffa7a79f,0x00362208,0xfff9db5b,0xff323ab9,0xfe557960,0xfd972720,0xfdaf5514,0xfdffc588,0xfe7a7ce2,0xff88817c,0xffe6274d,0xfff0df33, -0x001734f8,0xff890d02,0xff0878b4,0xff549d86,0xffefc818,0x0085386d,0x007c6f3c,0x0041f2bd,0xffe872b6,0x000831db,0xfff954e4,0xffe8d74f,0xffdc7c06,0xff618501,0xff4f8faa,0xfef988d2,0xfe4c57cc,0xff1afae6,0xff2e4725,0xfe7b2d44,0xfe60b206,0xfe0977d2,0xfdcf03f0,0xfd74b0a4,0xfddafc80, -0xfe36c854,0xfeda4ae4,0xfee01ef2,0xfef9a69a,0xfee6626c,0xff8fe90f,0x00298411,0x00aa09cd,0x005ce482,0x00393461,0xfff69817,0xffdbac40,0x0037c4d4,0x004b2f18,0x003946e6,0x003f482e,0x000d04e8,0x006e3bfa,0x005ce54b,0x006d4e12,0x0061fd64,0x000f1542,0xffc7bf21,0xffb0da97,0xff779b53, -0xff6a5f75,0xff22249a,0x001d127f,0xfeb05b06,0xfef8ea1a,0xfecbf016,0xfec46a8e,0xfeb521ee,0xfeb9a100,0xfe98697a,0xff311646,0xffad0ca9,0x002d9c4d,0x00b37055,0x013ca226,0x01be8cc6,0x017b179e,0x0133ef4a,0x0120e06c,0x01053b26,0x01227d7a,0x00d88fa5,0x00e6edc8,0x001ff378,0xff799fcf, -0xffcaa038,0xff6cabff,0xfeb7de50,0xfee073b6,0xfe911888,0xfebe43c4,0xfed9258a,0xff536bda,0xff521e42,0xff6f647c,0xff88cf30,0xff2530d2,0xff1f68b6,0xfe11fd32,0xfe8b97fc,0xfeb07abe,0xfe9379b4,0xfe97546e,0xfe89050c,0xfe7f8ebe,0xfe64d534,0xfe9ad4a2,0xfeb92072,0xfed7489c,0xfef9b9ca, -0xff18244d,0xff55defd,0xff41b13a,0xff45ae9e,0xff398d6d,0xff2dcf04,0xff28a77b,0xff256908,0xfe86a53c,0xfefd8328,0x01696b48,0xfdfc47e0,0xfe9239ec,0x012ad468,0x010c76a4,0x00ff3fdc,0x00f821c2,0x00c494b2,0x00ac7f3c,0x00b03130,0xfec9b114,0xfdf33294,0x01530c66,0xfed608ec,0xfe32531c, -0x01ceef10,0x01eabdc6,0x019d24fc,0x01587e70,0x01a04d0c,0x019aa13e,0x021afcc4,0x022ee444,0x01eec284,0x01fc1afe,0x01f0ca1a,0x01e2d6bc,0x01ca9d0a,0x01c7164e,0x01ee2fe4,0x01cc42be,0x01c45922,0x01b14870,0x01d3cc32,0x019e1a08,0x01d494fc,0x023769c4,0x00c785b3,0xfccdab60,0x02962098, -0x01090f66,0xfd347618,0xfd6d1464,0xfd7c433c,0xfd824b4c,0xfdafb8c4,0xfdc26f74,0xfdef5034,0x010f080a,0x02a54b30,0xfd277024,0x009a29fe,0xff28e4f1,0x017f5540,0x012f8eb0,0x01d07a98,0x01f06e02,0x035aa6e4,0x03991ec8,0x02fc3a3c,0x03232a84,0x02e7c774,0x02aae844,0x02380ee4,0x02308580, -0x029cef30,0x0260b570,0x02574394,0x021e6698,0x0266df14,0x01fa1c38,0x02502f94,0xffd8e076,0x012f67b4,0x01c69a8a,0x0113686a,0x00fac45b,0x01b74f16,0x01aca7e4,0x02170724,0x01a1180c,0x01da4b44,0x01928402,0x01425f80,0x015e1042,0x00a83013,0x0101e4ce,0x0141696a,0xffde220c,0xffa57313, -0xff898482,0x0070b6aa,0x00cfd97a,0x048e0f88,0x04ea4bd0,0x036f5568,0x0374ce58,0x031c0ea0,0x02f6d758,0x02568a38,0x021d50dc,0x02fa40d0,0x02563814,0x025207f0,0x01ea8058,0x02758ea8,0x022d61dc,0x01a724f2,0x01855dec,0x010e4574,0x00f07bf3,0x014f7166,0x0117f988,0x01116624,0x00d6b637, -0x0122898e,0x00e51af5,0x00759b55,0x007988e3,0x00ec6dad,0x00b73429,0x00acb9a7,0x006dd125,0x00100da0,0xfe024cec,0xfd9aae28,0xfe15b5f4,0xff5c93ef,0x00c6b6d8,0x06ad70b8,0x07b1b0a0,0x05b46398,0x059ad500,0x04c60fa8,0x03f518dc,0x02c26598,0x02efbc34,0x041dd998,0x039a8cec,0x033e59b4, -0x028690d8,0x037a36e8,0x0277a884,0x0211e590,0x013b4aa6,0x0099eace,0x00e3f3c2,0x012cf764,0x013eb558,0x00fab1f3,0x0145675a,0x00bf28f8,0x0080c388,0x00824bf9,0x00706e4a,0x00a72674,0x00b3fe70,0x008b62a6,0xffc64454,0xff2cb3b4,0xfdf577c0,0x02a6321c,0x02eea17c,0x027be018,0x02bf7ea4, -0x024bd200,0x01f8f990,0x011c9fc4,0x016f99a8,0x014b8c42,0x023aff8c,0x003f2c33,0xfed1d8d8,0xfd412eb0,0xff37eb40,0x004814f4,0xff811a14,0xffdb57c4,0x00138a85,0x0264929c,0x01bc5974,0x00907e8c,0x00a96992,0x012dc582,0x011c9ace,0x00090ff0,0x0126b2ae,0x015267c4,0x0072caec,0x013ff7b0, -0x00751a78,0xff85793d,0x00289a1d,0xffa37fe8,0xfef5497a,0xfdcf7f28,0x046dd3f8,0x0378888c,0x005aba49,0xffe1807e,0xff3949ed,0x01a500ac,0x01746462,0xfe1d165a,0x0145bc70,0x02193c88,0x00fba3c1,0x01bb6aa2,0x026219dc,0x0374e58c,0x032211c4,0x03ade42c,0x04588d98,0x0379f7f8,0x02d1bf70, -0x01d9f186,0x00693f99,0x01081ad6,0x01429c58,0x018c5456,0x01aa4564,0x01831174,0x00788b9e,0xffd74370,0x006e9165,0x003c6962,0x00c01c81,0x01c5b948,0x00cbffe7,0x012ed0e4,0x018f7db2,0x0366f150,0xfecc2e5e,0x011ae4e6,0x041c6988,0x082b2de0,0x0f34b620,0x0ec8c6a0,0x0cb70750,0x086eb910, -0x0413ca90,0x01795a7e,0x015096b4,0x01e207b0,0x03544920,0x05727098,0x0436da48,0x02f26e84,0x013092ba,0x007017fd,0xffc96e6d,0x00089f6a,0x0033486f,0xfff452fe,0xff991d4f,0x022bcb20,0x01a13f78,0xfeb4c8d0,0x003d95af,0x0008f105,0x00023ddd,0xffad27ad,0x005eff86,0x011eafde,0x028101c0, -0x02ea56b8,0x0144de56,0xffdfaf5f,0xff80df88,0x00f652c2,0x06005370,0x081147b0,0x0af89ae0,0x079b9b20,0x05c18038,0x03428efc,0x053afe58,0x04c23fc8,0x036edde0,0x02c817a0,0x014c5370,0xff8b6a22,0xff766369,0xffbf2576,0x005dfa31,0x009ba510,0x0051a55e,0x004e5d2f,0xffb8b7aa,0x0046a5a9, -0x002fd789,0x0180a5d4,0x01a2b33c,0x004e7bf3,0x00de4a36,0x00d58ffc,0x00ede9b3,0x0176bc30,0x01986fbc,0x00d39f0a,0x00d4d93b,0x013783d2,0xffbfe080,0x0046c97b,0x0002dda2,0x0490ff78,0x08c0f1d0,0x088925a0,0x09271450,0x082b3b10,0x06c5d4c0,0x03d2c2bc,0x04de1e88,0x04e9a6f0,0x04ade648, -0x039af6cc,0x031d19fc,0x03721ddc,0x02433b60,0x01651ab6,0x00cbad76,0x003739f0,0x004a49ac,0x00deaf70,0x00df6b34,0x015c9bba,0x0074369b,0x008ce1bc,0x00a9eae8,0x00b7ed5c,0x0029184d,0x001232ac,0x006eea8e,0x0086f76f,0x00ae03bc,0x00b578ca,0x011fda7a,0x0131ebd0,0x003363e1,0x026f38cc, -0xfee8fe8a,0x0324fe3c,0x04785c30,0x0393aa4c,0x02ed0c4c,0x01b40410,0x0130f046,0x01026ac6,0x00092dc6,0xff5a562b,0xff129054,0xffdd1de9,0x00d008a4,0x01d37154,0x01671c4c,0x011ab3ec,0x005af83f,0x00cea220,0x00e69783,0x0002b34f,0xffc688c3,0x002c1f68,0x009b73e1,0x00e2290b,0x009195de, -0x005a2efc,0x0097c366,0x008482e8,0x00764a61,0x00bcda02,0x00e3a2d7,0x00eb3b78,0x00b81a04,0x01061ef2,0x00a29caf,0x016f3f3c,0x01f7351a,0x02177d74,0x0219a7e8,0x0216f5d8,0x0247896c,0x01d01af0,0x014692ce,0x00a642b1,0x00f699ee,0x014ebb7a,0x01820d46,0x00d65b4a,0x000ef79d,0xff473e7e, -0xffc0f49f,0x00367aac,0x00832637,0x005fe24b,0x000dd7b0,0x005af066,0x00d45547,0x00603c46,0x00763720,0x00636cf7,0x003e88d0,0x0050623d,0x0035bea6,0x00b3aef0,0x00c5d7c2,0x00b5c002,0x0085ac17,0x00b61de7,0x00dbb769,0x0113e00a,0x010cc69c,0x01a93054,0xfebafd28,0x01424d7c,0x01108ad4, -0x010adcd6,0x0101673c,0x00f52251,0x00ffd79b,0x00f7480f,0x00c37ab8,0x006b9b6b,0x003f46ea,0x001b5e76,0x00296549,0x001e2ace,0x002e3429,0x001b9164,0x0026a13b,0x00405540,0x002b97bd,0x0073f814,0x008a21d6,0x00cb39e9,0x0105c2b8,0x0068c64f,0x0096de93,0x00e4822a,0x0102c12c,0x013a1380, -0x01034dd8,0x014e2968,0x015142ea,0x0112eda2,0x01201e94,0x008cb6cc,0x009a4bf5,0x010afc32,0x00a65602,0x010e15de,0x009c3c07,0x00bf86e9,0x00b301ca,0x00b94f66,0x00b7d470,0x00c15e7f,0x009cd936,0x008bfc21,0x0073b4ed,0x0061f146,0x0047b591,0x002e1505,0x0037c6f6,0x00416623,0x0040b5ef, -0x004cde90,0x00536ff3,0x0059f3f1,0x007071f9,0xffaa5b26,0xfdce4738,0x00d2d2dd,0xffc4b856,0xfd80eb94,0xfda11fdc,0xfdb7a0ac,0xfdd7f86c,0xfdf00d68,0xfdff3c68,0xfe25ba80,0xffcd5e3d,0x011c4b70,0xfd8a1900,0xff7edf4d,0x008cbfbf,0xfdcd677c,0xfe8d58f2,0xfd6b2f7c,0xfe2c3a56,0xfe0276ba, -0xfe18671a,0xfd8b36b4,0xfd5aa618,0xfd8acd74,0xfd6eab64,0xfd896764,0xfdd05e8c,0xfdbed32c,0xfdc669e8,0xfdcf6d84,0xfdcaa024,0xfdc562c8,0xfdaf3c6c,0xfdc5e7cc,0xfe11ed7c,0xfd536448,0xfeaaff94,0x00976503,0x03e316e4,0xfe2e0bae,0x00682664,0x038df9c4,0x03880d48,0x03798f78,0x0327f020, -0x033fc814,0x0338ca9c,0x0323e7c0,0x004b22d4,0xfdd24f48,0x0383bb94,0x00822322,0x00a53634,0xfdd6672c,0xfeacb02e,0xfe650652,0xfe23a344,0xfcafa2e4,0xfc5191b8,0xfcf9dc0c,0xfc745fb4,0xfc9aba4c,0xfd490138,0xfd2d9bbc,0xfd373a90,0xfd43550c,0xfd287e74,0xfd278058,0xfd00c950,0xfd772f84, -0xfdace4d4,0xfd61ca9c,0x0156a76c,0xfedd59e0,0xfef34b7c,0xff9cd264,0xffdda733,0xfebd3dfa,0xfece136c,0xfe7cf0c8,0xff032446,0xfe5ab91a,0xfe6cfd82,0xff45fc32,0xfed68566,0xffae726e,0xff618e2e,0xfdbf7824,0xfda83ca0,0xfd93ea18,0xfeb7a49c,0xfeb4bd02,0xfed3c72e,0xfbe2c270,0xfa9e7130, -0xfbefd0a0,0xfae34ae0,0xfb787040,0xfcc9d04c,0xfc7a4998,0xfcb11a60,0xfcd57eb8,0xfcbb3234,0xfcae0924,0xfc2d65f4,0xfd34fd5c,0xfd291b04,0xfe141ee2,0xff428c08,0xff3e6854,0xff9a733b,0xff9797f0,0x003fc533,0xff157ced,0x006d798b,0xff3942b8,0xffdf65af,0xff6f7725,0x00047e5c,0xffed4bcd, -0xffbdc9e1,0xff5c8de0,0xff781f33,0xfdfc8fa0,0xfd004388,0xff00282d,0x01420a0a,0x0089ea34,0xff9b4435,0xfaf0efe8,0xf9adc258,0xfbc7ab40,0xf9d0abd0,0xf9f6b360,0xfc0975a8,0xfb92af58,0xfb8c7de0,0xfbb28590,0xfb5de328,0xfb87d2c0,0xfb283090,0xfcc719a4,0xfd730cc4,0xfdcb3d94,0x003b9143, -0xff4c4aaf,0x007029dc,0x0048d4df,0x00b05654,0x0040a022,0x00dc65c6,0x00f36701,0x00370d23,0x00475a19,0x00149fe0,0x00a48b82,0xfff3db56,0xff2d9038,0xff7dee28,0xfd0473fc,0xfe8c6970,0xfbcb20a8,0xf9298078,0xf9fb5878,0xfc6d5974,0xfbde9ef0,0xfa9a0190,0xf8532df8,0xfa5845b0,0xfba39b68, -0xfc87613c,0xfca91250,0xfd40a814,0xff4e4121,0xfe3bdf80,0xfd5bc8b8,0xfcb4d294,0xfccd45a8,0xfbf9bf40,0xfc46d970,0xff2848c8,0xfe6dfc68,0xff24617c,0xfff27378,0x005aa3de,0x000c9dca,0x00b30781,0x00d83316,0x00242c13,0x009836ca,0x0046d429,0xff9d58b6,0xffb232c3,0xffb38d3f,0xfebc05a8, -0xfe04e55a,0x0098a8e6,0xff033cf7,0xfe8b07ca,0xfe3bd620,0xfc91f0cc,0xfc186f0c,0xfc4d0a60,0xfc1ed084,0xfd35e57c,0xfcc34178,0xfcf006a0,0xfe10e4e8,0xfe336f74,0xfd41e8c0,0xfc1e5a08,0xfbdafd30,0xfbf3b0c0,0xfc0f2b28,0xfc76513c,0xff3030af,0x006e4a05,0x003b2a9c,0x002e6115,0x004d4a8d, -0x008a7fed,0x00eb111c,0x006a4926,0xffcc51a4,0x001f584b,0xff8cf778,0x004b7be7,0x014abe34,0x00c3d01d,0xff518966,0xfecee198,0xff1068a6,0x0086a14e,0x0185b45a,0x027a1ca0,0x0168210a,0xfc517d58,0xfb1315f0,0xf8357a38,0xf516cdd0,0xf88bd250,0xfa83b8f8,0xfabf1010,0xf923db18,0xf88ce8e8, -0xf98531d8,0xfaed72a8,0xfce2d8fc,0xfefc2214,0xff5c90e5,0xfec996ca,0xfe3cbfae,0xfe914baa,0xff3317df,0xff85ea15,0x013862e8,0x0105cc54,0xfebb47da,0x00083ccf,0xffd97508,0x0001bf42,0xffa24560,0xfff6e1ef,0xffcf0f6d,0x023ecf4c,0x02f40204,0x024150c4,0x00ca9a81,0x010c26f2,0x010e35aa, -0xfd162668,0xfa000978,0xf484e420,0xf82bb168,0xfb8d0948,0xfe289f3a,0x004c0bc3,0x00431210,0xfe6d5b22,0xfcfb3358,0xfbb3e478,0xfb8f6dc8,0xfadbee28,0xfacc4840,0xfb8b00b0,0xfba69840,0xfca3cf64,0xfe9dcc8c,0x0047724a,0x0022f332,0x00118279,0x01485054,0x01353332,0xfff2939a,0x00b5e986, -0x0087c56b,0x0035e8ff,0x00f13ffb,0x01439340,0x004fb857,0x01094f0a,0x00429c90,0x004a920b,0x0025a821,0x02b500ec,0xfe2bbb3c,0xf90f37c8,0xfa022108,0xfabecb00,0xfaa01a28,0xf9d66f70,0xf8ae0978,0xfb94e080,0xfd0fd008,0xfd21e0e4,0xfec2da30,0xff55a1ad,0xfef5a592,0xffe1f71a,0x0026fabb, -0x0077ea99,0x00b44552,0x005160c3,0xffd937fa,0x00496167,0xfffb2a82,0x0054145d,0x00aa2913,0x00a8dfc9,0x0047e96d,0xfff8c04b,0xffac8fc8,0xffcd5aa1,0xffb3f9ad,0xffffe152,0x000e7f85,0x00d41f51,0x01165a46,0x01474512,0x0027b4ae,0x02c52f10,0xff42e6b7,0xfe0a1498,0xfee9dff0,0xfdf151f0, -0xfdf26ee0,0xfd5635c4,0xfb7359b8,0xfe1d43f6,0xff6581e4,0x006702a6,0xff45f216,0xfe62e458,0xfdf29564,0xfda16740,0xfdc02bb4,0xfe20c408,0xfe353d7a,0xfea8c8de,0x000961b3,0x001c9772,0xffaf8702,0x000c2908,0xffeb959e,0x000514ed,0xffe2e643,0xfff88fd6,0x00247502,0x00463b77,0x003bc7b1, -0x0054a0bc,0x00801b3a,0x00a612e5,0x002bb912,0x0043e962,0xff697c3f,0x0013647c,0xff996b1a,0xfef232aa,0xff052a62,0xfe92082a,0xfe426bf6,0xfdeb0224,0xfd72cee0,0xfe04714c,0xfe44c484,0xfedc2638,0xff540723,0xfff5337b,0x009e8166,0x00195b25,0xffa6c2c0,0xff397456,0xff1d5cba,0xfec04d32, -0xfe80666c,0xff487997,0xffd12d04,0x002854b2,0x001da18a,0x006537f6,0x0046e83f,0x00902dbc,0xffe36c73,0x006818ec,0xfff9fe48,0x0059f44a,0xfff0740c,0x001e155c,0x004d6944,0x00b0a708,0x00082e76,0x01da5836,0xff57743f,0xfef62308,0xfe99927e,0xfe442c02,0xfde2c6e8,0xfd914b50,0xfd2f910c, -0xfdae97f8,0xfe251c76,0xfe89732a,0xfef1eb66,0xff3b9cbd,0xff8fe456,0xff9c683d,0xffcaf8ba,0xffe6f659,0xffe4c24b,0x000f13ce,0xffd09c02,0x0051e486,0xff72517c,0xff346e7b,0xff89fcaf,0xff738d05,0xfef87442,0xfef6d2ec,0xff08f5bd,0xff9bdece,0xff4b24c5,0xff61e97c,0x0012e5f3,0xffcb6ecb, -0x0054ee79,0x00419e68,0xff94dc2d,0xff4b717c,0xfe7b4258,0xfed4d540,0xfe9fdcde,0xfe87f3b2,0xfe703be0,0xfe5868b6,0xfe1df80a,0xfe6342ce,0xfe865f88,0xfeafd26c,0xfed8cc88,0xff06af6f,0xff422419,0xff2ed35e,0xff215dac,0xff1b94ba,0xff125d5e,0xff1e2a1b,0xfefb074a,0xff3e6b2b,0x002957f1, -0x01a2a9e0,0xfee534c8,0x000be48a,0x01c65834,0x01d9ef64,0x01d1b81a,0x01a96fd4,0x01c90052,0x01c61c70,0x01b282f4,0x004f4593,0xfef00696,0x01cfce38,0x007f3a4a,0xfe8bb0e8,0x01f44d9e,0xfff48051,0x0297eb84,0x01a9ba40,0x01e6e00c,0x01af010a,0x020e5914,0x022cb900,0x02346938,0x021939bc, -0x020f381c,0x0224b634,0x0209c63c,0x02044834,0x01ee9714,0x01fe1586,0x01fdbc80,0x01faf09e,0x01fb9b5c,0x01b1b4d6,0x02853188,0xfff95dfd,0xfe155ba8,0xfbe5be20,0x00d4dbef,0xfe54ee90,0xfc115670,0xfc14d850,0xfc1b7094,0xfc6efa40,0xfc206230,0xfc1f4cb8,0xfc578770,0xfe58428a,0x010cb73e, -0xfc0fa8c4,0xfdc81a8c,0xfd6e6518,0x02378c94,0x01cd3bfe,0x019f7f40,0x01372d72,0x020d9254,0x0253f778,0x0265c048,0x0247c7fc,0x0269ec88,0x02da89ac,0x02a5cdd0,0x0285ad24,0x024833f4,0x027d9474,0x027ffce0,0x0277f650,0x02486a38,0x02458e78,0x01d30460,0xfdba3c14,0x00c81439,0x00a500a2, -0x006e9ae0,0x00123f0c,0x00bfb60a,0x0116edaa,0x011dd6c0,0x00265932,0x01206b7a,0x016b523a,0x00b26e58,0x00dccd59,0xffbff1a7,0xffdc7975,0x015d2c76,0xffa5a203,0x01d30286,0x028e0798,0x01df26c6,0x0106cf82,0x02fbaef0,0x03b664a0,0x04019ce8,0x034de040,0x03260eac,0x03c79224,0x0341ccc4, -0x03362f40,0x02c4c8b0,0x02f789f8,0x02dbcc64,0x02e9aaf8,0x02699740,0x02b53cbc,0x00b39622,0xff9baded,0x0037b5c6,0x009ec173,0x00f1d960,0x000bd93a,0x0094faff,0xffe1fcc1,0x014fa176,0xffa71676,0x00a4260c,0xffb0118c,0x00a67ac5,0xffeb91c6,0xffd3cb93,0xff7dc92b,0x002661c2,0x003bad64, -0x02fbbf14,0x026bb200,0x01366926,0xffae3ab3,0x01e18bf6,0x03419f18,0x03ee28dc,0x0345a88c,0x03a29a00,0x05468968,0x04788348,0x041f4a08,0x038ba484,0x03f9250c,0x03ff2164,0x03c24c40,0x0328e058,0x02d97a04,0x00ed5fc8,0xff45b3d9,0x012e64a4,0x00305106,0x018b077a,0x014ebae6,0x0090f926, -0x012a0994,0x00cafe69,0x00d33ed3,0x0051e581,0x00a12c3b,0x012b17e0,0x00b7f77e,0x00531849,0x00bdc052,0x01246940,0xfda5a984,0x00593196,0x01372d04,0x01bc7ce4,0x02f2e2ac,0x05491780,0x04ac0178,0x0247e2b8,0x02145048,0x017e9702,0x01e11426,0x01faaa06,0x01e70264,0x00f0fa2e,0x005af55d, -0x004d6c52,0x012772e8,0x0176aef4,0x029b83b8,0x00870862,0xfe3670b8,0x005de2e6,0xffda4a78,0x00765090,0x0091af82,0x006c7f9b,0x00ebecd1,0x00f2a7d6,0x00758e37,0x01003ea2,0x0098813a,0xffb3c01a,0xffba95b9,0xff42c6a3,0xfec69972,0xfe8fc4e0,0x00016a3c,0x018a5ff0,0xfffaff09,0xfdea9b38, -0xfb74bcf0,0xfc7ec2f4,0xfcbfb9d0,0xfbeb32e0,0xfb7cba08,0xfbf79a78,0xff0f4076,0xfe22609a,0xfe389c04,0xff23163d,0x0001ada0,0x01be786a,0x04df1ff0,0x02edb35c,0x02837b60,0x0075a9c6,0xfeeb94a2,0xffc17d06,0x0011d4f0,0x014df762,0x015cd85a,0x009954ad,0x00932fd8,0x001f606f,0x0034667d, -0x0005dd1d,0x00977c74,0x01b4a01a,0x00a69bd0,0x00a76f44,0xff49445b,0x00de0eaa,0x015b8c70,0x03714d24,0x03a16388,0x04ce9590,0x078d4cd0,0x091a2100,0x08511160,0x0422d490,0x044fff60,0x02f0222c,0x02376d0c,0x03ad5abc,0x0465d248,0x04683028,0x037a439c,0x01cbb8f8,0x00317797,0xff5b0a49, -0x003ecd89,0x007e6d25,0x000dabc0,0x00a6c6d6,0x00188890,0x01d15fa2,0x01865236,0xff572ca6,0x008bc7ae,0x006ca5ce,0x00755c1a,0x00349ff3,0x00640a5e,0xff73bcf8,0x01be976c,0x032ad82c,0x020977b8,0x01f0c46e,0xffdc399f,0xff00f34d,0x014528ca,0x033f9114,0x081795b0,0x0791f620,0x05b68398, -0x01ddada8,0x011534da,0xffacf039,0xfeae65c4,0xfd23b790,0xfc574e70,0xfc3aa070,0xfe2ec276,0xff8fff68,0x00530bef,0x008512bb,0x00825936,0xffbf6434,0xfefcb974,0x005bb4a6,0x007524f0,0x011a01f6,0x00f41387,0xffac6cf3,0x00d91398,0x00a48c05,0xfffd3571,0x00c2accd,0x01513656,0x018f168c, -0x0142564c,0x01373994,0x0015ff81,0x00a4537c,0xfdaf0b08,0x00f033ed,0x04fbc4d8,0x04b083b8,0x05152d88,0x051f87d0,0x048881f0,0x027b2ffc,0x025867dc,0x02cd0918,0x04de4df8,0x03d70120,0x035526bc,0x0253a554,0x00f110a8,0x0002c50a,0x00940449,0x0066b120,0x01192044,0x0156e7e6,0x0075048b, -0x0122a6e4,0x008240f6,0x0104fd2c,0x012772ea,0x00ee6998,0x005dce2c,0x0069a784,0xfff29eb7,0x0088e9fb,0x0042e3ce,0xfff03a6a,0x006df656,0x009a8da4,0xfff45b46,0x0006ddff,0xfdd17e10,0x00200b4f,0x025d3f8c,0x02644b28,0x03426e50,0x035d01e4,0x0373dc10,0x03663c8c,0x0205812c,0x011acf42, -0x00f77fcf,0x00a268ff,0x00219422,0xff4908c8,0xffc92d3f,0x00814bdf,0x015a97ea,0x00efff81,0x00895ca0,0xff632c00,0xff561849,0xffdb7b1f,0xff863a69,0x00762ca4,0x00c39602,0x00a7abf4,0x00b7cc0e,0x009ce07d,0x0136acf0,0x010880ac,0x011e585a,0x013b572c,0x00fdbce4,0x00eb7074,0x004f682d, -0x00b1126a,0x006e8536,0x018cb4ba,0x022802b4,0x01a07f6a,0x01c6427a,0x01b06ac4,0x01d0ecde,0x02227b24,0x01f65a7e,0x020d6748,0x02104d50,0x01fb26bc,0x01ea5948,0x01c062ea,0x01879b04,0x011775e2,0x00d3b574,0x00f61912,0x01ddea34,0x016aada6,0x001dfff7,0x00935ac6,0x00bddaf5,0x00c984bc, -0x00503383,0x00be17d8,0x001586e7,0x0105ddae,0xffd14a8a,0x0098abd1,0xffe245a6,0x0054871d,0x0023d016,0xffee750d,0xff73f139,0x004986da,0xfe67ea2c,0x00687c99,0x009fd97c,0x00d3b60a,0x011a5a74,0x015b444a,0x019669f6,0x01c71a6a,0x017f56e2,0x0133b688,0x00eebf4d,0x00b49bfc,0x0082414e, -0x0061f422,0x0078f585,0x009cf4eb,0x00b507cf,0x00b0add3,0x008fbad6,0x00d7a8b4,0xff8f487b,0x00b48417,0x00996811,0x004b7984,0x001bb8d5,0x00aba193,0x00e8d507,0x00bfc0e4,0x001bf9a5,0x00e0eb0a,0x010e93f6,0x007cf4dc,0x008b22e9,0xffef2be6,0x0000e6bb,0x00a4b104,0xffd12da8,0x015ff5c8, -0x0101c860,0x0127aaa4,0x013238d4,0x013d78a4,0x0148d56c,0x016a65b0,0x014d50f2,0x0144448c,0x01375afe,0x01283fa8,0x0115d75a,0x00f48c09,0x00fbfec1,0x00f862e2,0x00f92290,0x0105dfae,0x00f46e43,0x01584e64,0x0012b05c,0xfed877ae,0xfd75d6ec,0x00729845,0xfed43b50,0xfd258524,0xfd257514, -0xfd501994,0xfdafcf44,0xfd786ba0,0xfd8d0770,0xfdb980e4,0xfed1c4be,0x0072b226,0xfdb73c24,0xfe91de92,0x01508b02,0xfec08582,0x013ea166,0xfe21b562,0xff1eca5e,0xfeff50e0,0xff2257c8,0xfee1b7f0,0xfeb5cf0e,0xfe76c7ec,0xfe77636a,0xfe7fdbda,0xfe9e4d60,0xfeb4a6be,0xfeb6f43e,0xfe9f9020, -0xfe9b3af2,0xfe9ca62e,0xfea86dc6,0xfea908ba,0xfedbfae0,0xfe06e76e,0x013e6ad0,0x02b89008,0x035eb7e4,0x009cb4da,0x02a04c84,0x032e5d80,0x03625be4,0x035de5ec,0x02ede004,0x03697a54,0x03796014,0x036e1240,0x0284600c,0x00328cd3,0x03207dbc,0x02dff340,0x02bd1a8c,0xfef4985e,0xff105940, -0xff994b7c,0xffe36707,0xff6fc175,0xfeecb54a,0xfe402adc,0xfe0ee52a,0xfe117958,0xfe63ce4e,0xfe9dbb20,0xfe9abf66,0xfe424724,0xfe1aa124,0xfe12d3ae,0xfe2af592,0xfe5e4810,0xfe3773cc,0xfedc2abe,0x026f4b88,0xfff4a376,0x00a25da9,0x00848ec8,0x00cc556f,0x0009db8e,0xffce6750,0x0001b3d5, -0x00c9f021,0xffc1f2e4,0xff59cac1,0x005a2e46,0xfff45769,0x00bee6b0,0x00c6751e,0xff413132,0x014d1408,0xffbb5559,0xff1b5c59,0x003480f0,0x00cf24b8,0xffb70341,0xfea05752,0xfd1be314,0xfcd06fc0,0xfd05477c,0xfdd9f6f0,0xfe65f05e,0xfe7439b4,0xfdea5a34,0xfdb006c0,0xfdac00f4,0xfdd36830, -0xfe0fa36e,0xfd9a72f4,0xff58bd46,0x00dc0c2f,0x007ae1d3,0x00b62f48,0x006304d9,0x0124247c,0xffe80491,0x00fe814a,0xff568bef,0x010023bc,0xff9e426b,0x00d676df,0x00c6db5c,0x00869e29,0x00608d06,0x00e2e250,0x004a13e2,0x01a4f034,0xffa49f9d,0xff9924fe,0x01d71ba8,0x034402a0,0x01af1220, -0xffbb42bd,0xfd456be8,0xfc9582b8,0xfca79f8c,0xfdd3d174,0xfeb9680e,0xfeab0930,0xfd9859f4,0xfcf37d50,0xfcbbe36c,0xfcfeb688,0xfd3b50b8,0xfd13fea0,0xfea21db0,0x00ab4c62,0xff2ca945,0x011a960e,0x0054eca7,0x002145e5,0xff89f462,0x006dda42,0x00c71e19,0xffd940fb,0x00373bef,0xfff79ed8, -0x00e4cda0,0x0047327d,0x0081c8ce,0x00614674,0xffefcbf7,0x0146ada4,0xfd7610a8,0xfb5fa340,0xfbaa4ce0,0xfa7673c0,0xfcad27d0,0xfd7f56cc,0xfca97ff0,0xfc1685c8,0xfbec2e28,0xfc8ff404,0xfcc6e94c,0xfdfd026c,0xfeea38da,0xff6fa173,0xff59e480,0xfe3783c6,0xfe71c056,0xfd654424,0xff01a62c, -0x00c627ce,0xff030f20,0x00376e55,0x001b68fc,0x00be0656,0x01016000,0x00b7d027,0x00a2b541,0x0065ab22,0x00e31e80,0x004b04f5,0x0003b43d,0xffa0ffb6,0x0041a31b,0x003c84a0,0x01040820,0x002f9578,0xfe245fae,0xfadc8d38,0xfc3bf1a4,0xfe3b3928,0x00423b0a,0x00d7804f,0x003344d5,0xfe103798, -0xfe169930,0x007e0bfc,0x00063cd9,0xffbc371d,0xff5344a1,0xfe28c37a,0xfd751b9c,0xfcc3d30c,0xfe5a21ea,0xfe4fead8,0x000bf427,0x00c0baf4,0x002d0dda,0x009a875b,0x0072d237,0x006137d3,0xffe6794a,0x002b7937,0x00187dc8,0x002de722,0xffdf4819,0x008377b2,0x006981c2,0x012571d6,0x002cbd51, -0xff5327fe,0xfe9fb3c8,0x034738cc,0x031d7688,0x04b20a20,0x04f87c48,0x01ec4d00,0x01e8ee7c,0xff0dda74,0xfaafa820,0xfa4bccf8,0xfa8c8f80,0xfce26168,0xfbd14728,0xfbd535b8,0xfc62eb18,0xfc64954c,0xfdac6e80,0xff76ae4b,0xff59a822,0xfe5377f4,0xff1e3041,0xff72d719,0xff81390e,0x00c2adc7, -0x0191bbc6,0x01568a14,0xffdc6b85,0x005bf4d9,0x000695bf,0x00320120,0x003d3685,0x008fbc44,0xffe3f57f,0x02269200,0x029a8c04,0x03ddfb14,0x032b97dc,0x00518bf3,0x0104c872,0x013063a2,0x01ddb224,0x00289594,0x026ce770,0x02d20778,0x00c0c989,0x02d7d2cc,0x02cd21e0,0x02f77cb4,0x0014a157, -0xfebfa0da,0xfe84b702,0xfd534524,0xfcc28c84,0xfcecaa40,0xfd72e670,0xfdc9cc00,0xff2d4dc9,0x00a7c24a,0x004341fe,0x00207617,0x009a2c57,0x006c17c2,0xff7504b5,0x00431d46,0x00a1416d,0x0014a3c0,0x007e7448,0x00d696df,0x00efb6d6,0x01508756,0x00c63ce8,0x0062f9c4,0xffd92455,0x031cad80, -0x0296334c,0x004476db,0x0089c4cd,0x008037c4,0xff8783c9,0xfecf94ca,0xfe91dcaa,0x0038c7a7,0x018d74a6,0x03a860c8,0x02e8caa4,0x0250edc4,0x016e78b2,0x0178a9a0,0x01466b34,0x00b41100,0x01118b78,0x00aeb6ee,0x0082a522,0x00fece95,0x001f1278,0x00800111,0x01249e10,0x0133940a,0x00a99d87, -0x00ac28c9,0x0056c03a,0x009143f1,0x00878987,0x00c06f7b,0x0101fb54,0x01522db8,0x019087a0,0x01b31d72,0x0200a2ac,0x025b070c,0x0192c536,0xffd7c2ca,0x00472d77,0x0097df18,0xff95e4ee,0xfec14baa,0xfe0f9efc,0xfe391738,0xfebfa43c,0xffeab174,0xffcd8bf6,0xffe78bf5,0xffb0764b,0xff463f10, -0xff35c590,0x00154e2f,0xffcfaa4f,0xffed9be7,0x006bda65,0x00388245,0x00973f30,0x012f6712,0x00ae117e,0x00723f8c,0x00b3febb,0x00ac04d0,0x00c581fe,0x00467caf,0x00d03dc1,0x01158b24,0x00d3595f,0x00f01d31,0x00d1872a,0x00cc620e,0x00eafa78,0x0183b064,0x00a8288f,0xffed7809,0x00557ca1, -0x00209306,0x000da87b,0xffe1c5f1,0xff892cb9,0xffd4f726,0xfff3171e,0x00135736,0x00572995,0x00909b1a,0x00c08c4e,0x00dd0b65,0x00eeb9ec,0x00da5fa3,0x00d9390c,0x0081bac8,0x011c05ce,0x01a87ea2,0x010fd842,0x00be8100,0x00b1135d,0x00e5c55a,0x009a0627,0x00ec927e,0x00829ea2,0x014b18a0, -0x0089cd5f,0x00d4e9fd,0x0089e52a,0x00ae4453,0x00f90a45,0x0145db62,0x01108b90,0x014365ec,0x0035e0bd,0xffe3f082,0xffc71ae7,0xff81dad0,0xff508132,0xff193a98,0xfee91722,0xfef38868,0xfef56716,0xfef55942,0xff037bc8,0xff1d8735,0xff50a4f4,0xff46fd61,0xff44d927,0xff374b7b,0xff60b580, -0xff58b242,0xff637130,0x00d31e0e,0x00295662,0x00a0f467,0x00bf5d69,0x011c2980,0x0106333a,0x00cf92cc,0x01054bb0,0x015d1f70,0x00dba979,0x00b07356,0x00e6e6f6,0x00c4dc0f,0x00de3369,0x00c9ecde,0x003b2486,0x013337ee,0xffbff00f,0xfff53d49,0xffdc3011,0xffcd5e47,0xffbfe45a,0xffb19025, -0xff98f8f9,0xff9baec3,0xff9e08d2,0xffa5fa1d,0xffa73fcc,0xffa356d6,0xffa0974d,0xffa7cd62,0xffb6a18a,0xffc474cb,0xffc1c66b,0xffd90ef4,0xff7f1820,0x010504ae,0x01cc2cc8,0x01d52af8,0x00f15b5d,0x0206318c,0x020da894,0x021394ac,0x01f99b90,0x01ba3534,0x01eda0c0,0x01e0b01a,0x01ce34a0, -0x01e77c3e,0x00f976ab,0x0195c69e,0x01e919f4,0xfffcfc12,0xffce8c27,0xfdc01f08,0x004ca9d3,0xffa7bccd,0xff98bac1,0xff98b5f1,0xff89c34b,0xff92335c,0xffadd4c3,0xffb0e621,0xffc50a35,0xffe66159,0xffe6ea4d,0xffe2d7fd,0xffcaf787,0xffde7db1,0xffe551e1,0xfffa9244,0xffe5ae12,0xffd93ebd, -0x0077f2b0,0xfdccdb18,0xfd575e50,0xfeadc774,0xfe393ae8,0xfd56e1a0,0xfe7dd62e,0xfe4bd09e,0xfe459816,0xfe86a536,0xfe130cf8,0xfe08a634,0xfe301b62,0xfd570f00,0xfe4da75a,0xfe8b86c4,0xfd24fd80,0xfdbcfd8c,0xff4f00a9,0xff8392c9,0xff15c4cc,0xff23cc72,0xfee37b42,0xfef49150,0xff310088, -0xff180086,0xff433de3,0xff95c740,0xffce730b,0xffe4b3fc,0xffb6f21c,0xffe821e0,0xffeb513d,0x002665c8,0xffb59fe1,0x001bbba7,0xff9e0c73,0xfdf3109c,0xff8d25e4,0xfef5fd9a,0xff57b084,0xff1bf415,0xff29df22,0xff6902ba,0xff01ad15,0xfe79606a,0xff26fe40,0xffaece8b,0xff720ebb,0xff4e118f, -0xfec83dd2,0xfe78008a,0xff3265b5,0xfe4b4e98,0xff4d1e73,0xff513e29,0xfe90df3a,0xfea88cf8,0xfdbc6314,0xfe059fa4,0xfee19b10,0xfecb8c54,0xff3ee823,0xffc05fe3,0xfff1c76f,0xfff4a3d3,0xff636880,0xffef9b35,0x00023ca8,0x008add48,0xffee7686,0x00939da7,0xff94440c,0xfe91e328,0xff811183, -0xffe3014d,0xffd942a6,0xff416ef0,0xfff0800e,0xff5d7ed4,0x00449130,0xfee80f80,0x00009ffb,0xff328f9a,0xfffce0b3,0xff63e3ef,0xff2a8546,0xfeb5302c,0xfec7cc08,0xfe30856a,0xff0865dc,0xff235d09,0xfe47a0b2,0xfe2e4e3c,0xfc9b6538,0xfccb8e38,0xfdf9ea9c,0xfd983c88,0xfe3dbdb8,0xff206837, -0xffc77a01,0xffc9c511,0xff3770b0,0xfffb551f,0x00371fb9,0x00dd3f73,0xffb07fce,0x00af61b2,0xfff315ea,0xfe97f4b0,0x00ea4101,0x001563a5,0x00d82098,0x00b0458f,0x008c8d47,0x00a92d42,0x00a9169b,0x009627e3,0x001e81be,0x00672bca,0x00f6c49b,0x0046f44f,0xff8f6aac,0xff612d1c,0xfeaeec28, -0xfbe7c718,0xfcb26e48,0xfda0156c,0xfd2a64bc,0xfced4744,0xfe216828,0xfebe3212,0xfefe12c0,0xff640e89,0xffcba926,0x00484445,0x01047c50,0x014809a2,0x0101693e,0xff3beb8b,0xff1e2e02,0x02218a5c,0x0137f852,0x01878b52,0xfefac3fc,0xfe456a0a,0x00b46055,0x004b5810,0x004f584c,0x004ea3f6, -0x01039398,0x00c6a335,0x008f7577,0x0074c412,0x004d2a54,0xffbebddf,0xff8466c9,0xfeeafa18,0xfe30873c,0xfe2c68fa,0xfd1ebcdc,0xfd8c69ec,0xfed1e504,0xfee373da,0xfdbe445c,0xfe2b3574,0xfdd4fbb0,0xfdb46d94,0xfe30f788,0xfd7b4c1c,0xfd747950,0xfecd619e,0xfdc81820,0xfd6e9034,0xfd1cbe38, -0xfea92834,0xfefeb6aa,0xfe924424,0xfe477332,0xff3f9fa2,0xfed150de,0xfee4d8f0,0xff813fef,0xffef8bc9,0x013b18d0,0x01085bdc,0xffae03aa,0xfff96304,0xffe698ca,0x001c2ba4,0xffcedc76,0xfffda97b,0xffcb43bc,0x0097e66b,0x006ef8e8,0xfea13f1c,0xfed8f7ac,0x0273312c,0x03a33d9c,0x032ed9e8, -0x01346590,0xfe1f565a,0xfd457b00,0xfcec6ec4,0xfd472500,0xfee2aaaa,0xfff440f0,0x017ada4c,0x006ffcd8,0xff963e01,0xfe1a68c6,0xfdc5ee88,0xfdbb477c,0xfea97b4e,0xff3ae238,0x0031ea95,0xff679796,0xfeef779c,0xffeed8ee,0x000c47c6,0x009f4725,0x00b6bf7a,0xffe73874,0x00666efe,0x00388931, -0x000ee5c8,0x00463fcd,0x007d7940,0xff991b27,0x00e8c578,0x020b9330,0x025f5b18,0x02a527d8,0xffc1f099,0xfe9262e6,0xfc6555fc,0xfc23f678,0xfd370b74,0x0064ca4a,0x012ef7e0,0x00e73b13,0xfdfc03a0,0xfc42a10c,0xfc7fb9dc,0xfc42ee10,0xfcb04450,0xfcfce764,0xfd2a69b8,0xfd5f3cf8,0xfe00784a, -0xfe5b0cde,0xff39a20c,0xff03f532,0xfee57898,0xffad8dc7,0x00483644,0x0023237f,0x0017f8b1,0xffa8b8ad,0x002a05ea,0x0021941f,0x00276ca0,0x0042ec8f,0x00b6e445,0x0179d08e,0x015ee3dc,0x00ffd27d,0x0080479d,0x00597b4c,0xff1d9196,0xfd37b3a8,0xfcdf2ee0,0xfcb79cc4,0xfd637f84,0xfdde6f1c, -0xfe674390,0xff681ba6,0xff0a3525,0xff3b325f,0xff8e4208,0xff259614,0xff181118,0xfee9df3c,0xffb26a98,0x00432866,0x00970c63,0x001d469d,0x0029192a,0x0022d62c,0xff78d105,0x00179a29,0x00a754e3,0x012445e2,0x012a007e,0x006922f3,0x00854bda,0x00b76005,0x008829a4,0x007c2d93,0x00094a61, -0xffdfab17,0x004d8d00,0x007a2085,0x00793c08,0xff453e31,0xff4f7136,0xfe4ad868,0xfee96c7a,0xff33f662,0x0049f345,0x0049c1b3,0x00521f63,0x00731e13,0xff073ce5,0xff0dd0f5,0x0048b34d,0x005b1606,0x00339f67,0xffacebbd,0xff3c0e45,0xff3da8b5,0x00404ed0,0x00ae8989,0x00c9fcd4,0x007bb250, -0x006fd311,0x005fbbab,0xffe3d4fa,0xffc83769,0x0009cf9e,0x005d7f5e,0x00a66724,0x00a87ecc,0x00cc2d0b,0x01017bb2,0x00fbe85f,0x00880e42,0x00c2084c,0x005846de,0xfffa6285,0xff3712e3,0xff2d133b,0xffaaef15,0x0034e6fa,0x0011a0c9,0x00316587,0xffce0d4f,0xff90cbd2,0xff6d1683,0xff567369, -0xff18579b,0xfea83ac4,0xff4c40b0,0xfffe7394,0x00ae67ca,0x00e9a450,0x01149b8a,0x0145233c,0x00fbfab6,0x01165832,0x00968170,0x0018be20,0x004bda43,0x005cdb58,0x00993853,0x0097e7e3,0x00cca44a,0x007c2823,0x008c700d,0xfffac6b2,0x0041ada4,0xfff83577,0x0004d3c0,0xffc57ec4,0xff6e2bf7, -0xff2a104c,0xff68cb39,0xffe881e6,0x000dcdbb,0x0024dbe2,0xffe3bf93,0xffdeca56,0xffd811fc,0xffd433a2,0xffacc39a,0xffb76feb,0xffce518b,0xffd5fa8b,0xffcdf3fe,0xff95ae96,0xff59e04c,0xff5d6b23,0xff694470,0xff83af3a,0xff9e04de,0xffdadb39,0xffda297e,0xff7ef586,0xfff36253,0xffb0b5f6, -0xfff9e77c,0xffe53ac0,0x00062c25,0x003a49bb,0x000ac35f,0xfff95ff0,0x005aa04a,0x00b0a1f1,0x00a73f84,0x00936005,0x006c87db,0x002d0bbc,0x005b7ecb,0xff2bc16c,0x0068d2c3,0x003ccf11,0x0035b597,0x0030caa6,0x00222623,0x001b1e9c,0x001a2e91,0x00216d73,0x001e81d8,0x00218548,0x0018d476, -0x001ec2db,0x001e9288,0x002e47c9,0x00334d2f,0x0036ddc6,0x0035fbd9,0x002f5b0c,0x0063b830,0xff384047,0xfeff3396,0xffe7f49a,0xff604914,0xff00a2af,0xfff44d08,0xffdf6403,0xffe9c9bb,0x0008411d,0xffd78311,0xffce4752,0xffdb23bc,0xff273575,0xff746099,0x000daa2d,0xff13bd76,0x00473706, -0x01086892,0x01fa8470,0x00a69387,0x00cc0b8d,0x00fe7258,0x0123fd38,0x01632c34,0x016d26a8,0x014a1560,0x0123ec16,0x010ac728,0x0103ccda,0x01024798,0x01035882,0x010b3a0e,0x00f538d3,0x00f3910f,0x0100bcd0,0x0102175a,0x00eb9c0f,0x00ecaf75,0x022d7cd4,0x019c856a,0xff0b6e6d,0x022a6498, -0x01b51916,0xff3da98c,0xff655e99,0xff6c8b7c,0xff55c240,0xffa0eacc,0xffb5b77c,0xffcff651,0x01a8c1fc,0x0211d0c4,0xff10a237,0x01836ed8,0x0074ab94,0x00d04ac6,0x0079c2dd,0x0110e6d6,0x01601cec,0x02276b14,0x0241e920,0x01c72f38,0x01629dfe,0x01283f02,0x01328714,0x0123610a,0x01262e9e, -0x014b474e,0x012ad106,0x0139f230,0x0164b306,0x01667bd0,0x0117e73e,0x01b15108,0x00e57b46,0x01275e20,0x01a964ba,0x010362f0,0x00f899db,0x0168a7f4,0x0115ee0e,0x0172cd40,0x017908c0,0x0150bd90,0x00fe66ee,0x011284fc,0x010b835c,0x00c190e4,0x00d06976,0x00bfa8d6,0x00c69920,0x00187482, -0xffae2db5,0x0091158d,0x0159127e,0x038bcad4,0x03fe76e4,0x02fafadc,0x021b81e8,0x01614244,0x0147f91c,0x0135fdb4,0x01410198,0x017fdcea,0x01128e10,0x011e468e,0x016bcab6,0x015b519e,0x011d70e4,0x0182e5f2,0x01c2c140,0x0168d320,0x0146ec3a,0x0126256e,0x011bf6da,0x012c34ec,0x00b8d78b, -0x005fa088,0x00e3b378,0x003789f3,0x00b7601d,0x00fd8c9d,0x00b0dbe7,0x00809018,0x00420cb8,0x0075d860,0xff3ee95c,0xff0dd68a,0xfecc9674,0xffde1d37,0x0113c72e,0x04af89b0,0x056bd9d8,0x03c62664,0x025154b0,0x0166189e,0x01485454,0x013ebcf0,0x0167e7de,0x01fec57c,0x01af78e4,0x01b982c6, -0x022e9d68,0x021a6b24,0x016fc418,0x01ef7902,0x016493c8,0x00bc01ad,0x0144b1d4,0x00ca8687,0x0072b081,0x006cbf08,0x00880a6f,0x0081b6dd,0x00032346,0x0047b866,0x002eded9,0x00a92b0a,0x003ff824,0x000d5fa3,0xfefa9f08,0xff16bbc4,0x01d170fe,0x019d2104,0x009b2f1f,0x00e58c48,0x00bb1f73, -0x017b0390,0x01de50c4,0x022b1550,0x01825fc8,0x007a65de,0xfee3b0d6,0xff45b745,0xfeb99340,0xfdc2dd78,0xfee73902,0xffa9828d,0xff8cc44f,0xffea76ba,0x00175697,0x018101d2,0x01876a9a,0x00d5e291,0x0158ef16,0x00cef13b,0x00e4b374,0x0122f616,0x00c313f4,0x007f3bfe,0x0046f9bd,0x007566e5, -0x002a0bd1,0x008dada2,0xffcf132e,0xffcc17a2,0x00547c2a,0x017ccea4,0xff3a33aa,0xfea57144,0xfd548190,0xfe909f62,0x00032bf6,0x032ec730,0x03621fc8,0x026dff50,0xff537109,0xfe48a16a,0xff0d4f42,0x00840a94,0x01a4fb9a,0x019ab50a,0x021b03e8,0x022fde38,0x029565c0,0x024beb60,0x0196be1e, -0x01086e4e,0x00806dbe,0x00a4b9e7,0x011a8edc,0x0144bbdc,0x01143e56,0xffdde7d0,0xffe4446c,0xffe0220b,0x00406e1f,0xffc339be,0xffef2c64,0xffab80c5,0x00f587cf,0x01350d10,0x00612aa3,0xff647215,0x03afe318,0x056e2668,0x0474fa88,0x04b8b298,0x0671c378,0x03edc2e8,0x0341317c,0x03f6b670, -0xff35ba77,0xfe47aa10,0x00760114,0x01a67e0c,0x0274561c,0x01b3ac08,0x00ea5213,0x000a9b95,0xffa9ee95,0x00324b51,0xffff1bc7,0x003983a5,0x00840038,0x0058c58a,0x016c4b3c,0x0104579a,0x009b4189,0xffe9d352,0x0030de26,0x001b90a7,0x0005b5a2,0x00390216,0x007befd9,0x0013d4bf,0x013a9f38, -0x01de91f8,0x034b6aa0,0x0357e750,0xffcc910e,0x009b0e6c,0x0336cb18,0x0643cae8,0x0a065000,0x09204650,0x06e49908,0x0324c154,0x00b21c6a,0xff84ab0a,0x009246e1,0x00469670,0x00aaee4d,0x0000e891,0x00cfe9dd,0x00b82e81,0x00181934,0x00118b66,0xfff0fb18,0x0023746e,0x0002a868,0x00810b4b, -0x013b7f48,0x00a093bb,0x009a4fc4,0x0077e126,0x00117043,0x004c9c0d,0x00728653,0x002612e5,0x006bac19,0x0154da3a,0x018473c2,0x01c4951a,0x00e61626,0x00a04499,0x011c2e08,0x0423c7f0,0x06127e90,0x05376858,0x0405de38,0x04a4e4b0,0x047ddfc0,0x048b5f60,0x0376a7ec,0x0393f4cc,0x05632190, -0x03e1df74,0x02e38934,0x02067190,0x00bb678e,0x003b2bc1,0x0049d286,0x0071f276,0x00893c43,0x00f2a92d,0x00f1a595,0x00f4200a,0x00b70a9a,0x0112bf42,0x01184d84,0x00b28a46,0x00d02e57,0x00e1df65,0x01911210,0x01094712,0x00ecbab8,0x00ee5d8b,0x00eeac91,0x011791d0,0x00f7cdc4,0x026dab0c, -0xffc1518d,0x018a90f0,0x01d6bb8c,0x01a8e6aa,0x016d19a0,0x01bd31e6,0x01acb110,0x01a50604,0x001b6cca,0xff79d460,0xff84a4df,0x00e3d973,0x023b2824,0x03121384,0x035f7d88,0x02d81ca4,0x01658d2c,0x012ba342,0x00f49b1f,0x0099f09e,0x00c183b0,0x011a1962,0x0178b6ba,0x010a5736,0x00853f10, -0x005f7b09,0x00a9e880,0x00cca34d,0x00d64630,0x0107b3da,0x011f3f50,0x010e3832,0x01300100,0x01760014,0x013c44e6,0x01731712,0x014790ee,0x00da1e90,0x011d2cf0,0x0199ee76,0x0200d954,0x01e46034,0x01d128da,0x01ea35b0,0x01b28624,0x0181bcea,0x010df918,0x00d9aacd,0x00923c74,0x007a8dfe, -0x00747d54,0x008f78f1,0x00a7411a,0x00f090ce,0x00f31fb2,0x015a065a,0x0141eb20,0x00a309a7,0x0043db9b,0x0098c513,0x00d8947b,0x01291530,0x00c99da1,0x00b5be4e,0x00a34aaa,0x008cf621,0x009fef66,0x00c2dd68,0x00cd5c9a,0x00dc0c0a,0x00de33c3,0x010ac558,0x00667e50,0x01a22dc0,0x0172b004, -0x0178ec82,0x0172b218,0x0171ea7a,0x01706362,0x016ec8e6,0x010be8ca,0x00b5cd45,0x006f94f2,0x003a7667,0x000ec440,0xffe0aa4c,0xffed1ec2,0xffef9812,0xffebb0ee,0xffeca896,0xffcf26d2,0xfffd1ce9,0x001bd4ed,0x009fd951,0x0114ba4c,0x00e7e461,0x01273cc0,0x018fb842,0x0182a934,0x01cb1252, -0x01b754b2,0x01b61abc,0x0185d7ce,0x0176c1ee,0x016b9b92,0x01354412,0x014946b8,0x0163f7aa,0x01b95f6a,0x01681586,0x0139498a,0x01495a10,0x013cf986,0x01430814,0x01437970,0x01510ce0,0x01349fb0,0x012560de,0x0110bc26,0x00f301b7,0x00d38190,0x00a92643,0x00b537ad,0x00b78eca,0x00b8270e, -0x00bfbb8b,0x00c00ac3,0x00aec36c,0x0154f772,0x011518de,0xffb2c56f,0x01adf2ec,0x01629d32,0xffd93404,0xffea0b7d,0xffee32f8,0xfff12ffa,0x00105a52,0x001ba8f9,0x00250c46,0x0151387a,0x01d75a92,0xffb4f31e,0x0135c472,0x01517b2c,0xfe6cd792,0xfe613c7a,0xfe436a9c,0xfe90e00c,0xfe635334, -0xfe796f80,0xfe2c6086,0xfe1a4f26,0xfe43af74,0xfe168db8,0xfe20f13e,0xfe5c6bd8,0xfe522e4c,0xfe5b0f68,0xfe5ffcb0,0xfe694f8e,0xfe700de6,0xfe785810,0xfe72296c,0xfea87060,0xfe630626,0xfe8e20e4,0xffca77a0,0x029332f4,0xfe3ad22a,0xff98ac75,0x024bba0c,0x021bb2b0,0x020aa3a8,0x01eb0ee4, -0x01dcce2a,0x01d5f26a,0x01ce5ac4,0xff83dcd4,0xfe05b828,0x0224f200,0xffa42ce6,0xffeabc99,0xfdee3040,0xfe71ff68,0xfe3818ae,0xfe61ec82,0xfd939bc8,0xfd570770,0xfdc75174,0xfd4ac6fc,0xfd6a0874,0xfdfd5360,0xfde7b8ec,0xfdf2ceb4,0xfdeb1fbc,0xfdedb998,0xfdf5ad00,0xfe14a5a0,0xfe29a8c6, -0xfe7eb462,0xfe6683e0,0x00b97c8a,0xff583217,0xff18768f,0xff9243bb,0xffa8fff3,0xff103316,0xfee5a224,0xfe844f92,0xfed8e686,0xfe94b304,0xfed5e04c,0xff5a69bf,0xff1602d6,0xff7e49cc,0xfef08fdc,0xfe455b24,0xfe348abc,0xfe0c8384,0xfe286f7a,0xfde93cc4,0xfe654c36,0xfc880058,0xfbe553e8, -0xfce50638,0xfbd81210,0xfc1c6350,0xfd627fe0,0xfd14d58c,0xfd5b860c,0xfd722a10,0xfd9e30b4,0xfdbd66c8,0xfdd37ce0,0xfe127036,0xfe4e2b64,0xff26ad67,0xffaa5417,0xffd6ef9a,0xfff44e96,0xffbb0e24,0x0000d44c,0xffda8345,0xfff40b1a,0xff44cdaf,0xff84ddc2,0xff954800,0xffe0739e,0xfff7c53f, -0xffd5adae,0xff7bd79b,0xff086fad,0xfe85cc96,0xfdebd774,0xfe26bba6,0xfeb1cf78,0xfe697f76,0xff08e855,0xfc0f8788,0xfaf91be0,0xfc429864,0xfaab1880,0xfb1a2a30,0xfd2472ec,0xfcafcdc0,0xfcaa77f0,0xfcb79e10,0xfc99b038,0xfcc15be0,0xfd1880b0,0xfd9f0e68,0xfe796bc6,0xff49692b,0x00a8ff2c, -0x00647bd6,0x00c10b87,0x00474de7,0x005d0b2d,0x00acbe5c,0x005d8316,0x007d3cc5,0x0006a4d8,0x000dbacd,0x001cfd25,0x00c510db,0x0028369e,0xff69d07e,0xfed53b84,0xfde19b14,0xff6bb8ef,0xfcb402bc,0xfb920380,0xfb312dd8,0xfbc36d28,0xfbff7088,0xfc56efc0,0xfcdb023c,0xfdaa6504,0xfd8d26b4, -0xfbd9ea18,0xfd0508bc,0xfd9dae18,0xfe87d314,0xff06a4d7,0xfedd0c3a,0xfeb07602,0xfe3cf2be,0xfdb862f8,0xfdc2b164,0xff70b691,0xffbe2f17,0x004bdac0,0x001be76f,0x0040ff77,0x00fef376,0x0074b0b1,0x00285822,0x0023b34f,0x000b6998,0x0001d02a,0x000ce38c,0xff6a48fd,0xff566be0,0xff4f0976, -0xff90ebb6,0xfcf4d364,0xfcddbf04,0xfd8a2f58,0xfde30208,0xfe4031ac,0xfe465ade,0xfe4e6826,0xff0b49bd,0xfcf9de18,0xfd172ca0,0xfd2c8a8c,0xff623f5e,0xffd84391,0xfeb81036,0xfe11ef08,0xfcf868bc,0xfc4b935c,0xfd080ea0,0xfdc1aef4,0xff1e9e47,0x00591d14,0x003ea533,0x0040bb1f,0x00aacf2e, -0x00ac2722,0xffe3b9ad,0xffdfa427,0xffecce99,0x000eb49f,0xffa80c51,0xffc9ee80,0xff5902b9,0x00aaff0c,0x0014891c,0xff483901,0xfd696970,0x043aa290,0x0375af28,0x02023478,0xff3b4de8,0xf97cc998,0xf6317250,0xf55e4860,0xf9498e18,0xf9042928,0xfa6e3d08,0xfb1ba4a8,0xfb47f858,0xfafacbf0, -0xf9f72118,0xfbd85580,0xfd5c1e28,0xfeb77f5c,0xff616165,0xff89b364,0xfeae7682,0xfef65378,0xffcccd27,0x01330d2a,0xff9c3622,0xff731f49,0xffc5ef65,0xffbe1790,0xffe2804c,0xffd8c0eb,0xffd5b857,0xfff8ae06,0xffb751ef,0x008f6c0f,0x0158a75c,0x03805ed0,0x03595fe8,0x0098acd2,0x007ed086, -0xfd5d0ca0,0xfc05c274,0xfa87d170,0xfc61bf18,0xfdae057c,0x0012bec9,0xfc230a00,0xfb8e2548,0xfc8b1628,0xfd6899dc,0xfe4847b6,0xfe3d4586,0xfda7905c,0xfd0a7c98,0xfd421a50,0xfd300444,0xfdff01d0,0xff37f584,0x0008a4b6,0x000d3a38,0x0136cda0,0x005fed30,0x0037e351,0x00721937,0x000da550, -0xfffb9a9c,0x001b88a8,0xffca489c,0x00069c6e,0x00c31f96,0x016236a6,0x010dd282,0x014fed5c,0x009aa998,0x01a89918,0xfe615f58,0xfab791e0,0xfab803c0,0xfa785c00,0xfb04f098,0xfc142cc8,0xfe6d1aac,0xfe1f3964,0xfe2aded8,0xfd4a58e0,0xfe1546ac,0xfe02ac42,0xfd36d264,0xfddb4300,0xfe6978e8, -0xff2c492d,0xff8c2cfd,0xff6b2980,0xff664ccd,0xfff7fc45,0xffcd4cf9,0x009a5554,0x00a95f32,0x009e1071,0x00443eb0,0x007865a5,0x0090f1bf,0x012038d4,0x00a2758f,0x008d6152,0x00501cb6,0x007b728f,0x00ae5085,0x01420c8c,0xffe93ab5,0x012e890a,0xfe621dfc,0xfd563c18,0xfdd04698,0xfdb50864, -0xfeb408f2,0xfed260a6,0xfdc67714,0xff2d938b,0xffe6ff9f,0xffdb53ea,0x005dda99,0x00b38257,0x00fd04d3,0x00f1d526,0x009accc5,0xfffa8498,0xffc04d5e,0xffea87fc,0x00c45af7,0x00ec14f6,0x00a2d3c5,0x0096f5c9,0x00541dd5,0x004816ab,0x00198fe9,0x002625a3,0x0059d4af,0x009dfca5,0x0053fdfe, -0x005a6ca0,0x00889082,0x00bd19d4,0x005de957,0x006c15a7,0xff5f3735,0xff851e24,0xff54060f,0xff51b874,0xff69a9c3,0xff56a653,0xff32af9d,0xff387b13,0xff3a333e,0xff32eb63,0xff09f8ab,0xff0a29d6,0xff436864,0xff78e9dd,0xffd4b8cf,0xffc1b188,0xffd9e770,0xfff4a1d2,0xffdc3ab8,0xff74a1de, -0xff6977d6,0xffe5b550,0xffd3a50b,0xffb1a12a,0x000e12db,0x00a81a73,0x00db0bd6,0x00e86af6,0x002f3451,0x0048691d,0x0033cd57,0x0081ec26,0x005de5c2,0x0043bf5f,0x00333a37,0x005941e6,0xffdbf740,0x01c40132,0x00079fcd,0xffe6af7b,0xffa56122,0xff7ddcee,0xff49377b,0xff10e21a,0xfedb0a10, -0xff1b9ad3,0xff6a1b6f,0xffaa8a96,0xffed77ee,0x002464db,0x0056a016,0x00465968,0x00391f59,0x002ede54,0x001abadf,0x00367a08,0xffeeb910,0x004481a5,0xffd7076a,0xffb88ca4,0x001e4541,0x00018780,0xffb0fc02,0xffb30a00,0xffb99c5b,0x00190fd7,0xffe564cf,0xfff5ea62,0x005c7676,0x00440b43, -0x00af9c33,0x008a2005,0x00299c2d,0xffe10f75,0xff8acf43,0xffc28dc0,0xff9ca7c9,0xff8c5339,0xff7c84ed,0xff70384d,0xff4d29db,0xff7c5432,0xff913684,0xffa7410a,0xffb97016,0xffcb86ba,0xffe83be2,0xffdaddb4,0xffd59a54,0xffd047c6,0xffc7f321,0xffce56db,0xffb622cf,0xffae7462,0x00611c9d, -0x01ec8890,0xff795c7b,0x005bd82c,0x022bc07c,0x0223f3bc,0x0215d514,0x01f80a8a,0x01f82256,0x01eeae4c,0x01d86afa,0x0080fdc3,0xff7d19b9,0x0226fc8c,0x00bdf76a,0xff85b6b1,0x01b0f3fc,0x009daf8e,0x020b64d0,0x01366086,0x0160802e,0x01432a26,0x01b14906,0x01dc169c,0x01f156c4,0x01d2f204, -0x01c96282,0x01d0bb18,0x01b605fa,0x01b0ca2c,0x01b0b3c8,0x01c13166,0x01c5c84a,0x01c81b44,0x01bfe892,0x01869872,0x02238838,0x00bb7656,0xff36e2eb,0xfce3eb8c,0x014097c6,0xff5eb3ae,0xfd20f248,0xfd1148f4,0xfd143a10,0xfd4f6c04,0xfd339bfc,0xfd3d2ce8,0xfd6ab4dc,0xff678d07,0x016bb0ae, -0xfcef5e00,0xfef78768,0xfe4f99bc,0x01c67404,0x00ebb16a,0x00efcf32,0x010683c6,0x023b801c,0x02b66be8,0x02c2fd54,0x0272242c,0x023b5ec0,0x024d9c14,0x0209264c,0x01fd1e22,0x01ff5994,0x02361648,0x02483544,0x024c63fc,0x021d1d74,0x02057068,0x02092854,0xfef62702,0x011821e2,0x01027358, -0x00a18ef5,0x005d0cfc,0x0123d5fe,0x0105434c,0x0119f55e,0x007ff536,0x012f629c,0x01518ada,0x00d001c4,0x010166d6,0x0021ba92,0xfff7ce70,0x013b20c8,0x0025d0a6,0x015270b0,0x00beb6b8,0x003f7d5e,0xffda5112,0x021d7780,0x033f3368,0x03bbb648,0x0355cb04,0x02f9d154,0x03188d54,0x026dabb4, -0x025707c8,0x027e3f20,0x02c5705c,0x02d135c4,0x02e16860,0x02589d14,0x027e5cd8,0x01777fb0,0x00c58966,0x00fadd1c,0x00e3ffda,0x01105036,0x0069a521,0x012822a0,0xfff5e518,0x00c58656,0xffe3e19e,0x007cd6e3,0x001c5e32,0x00bbc2b2,0x0065633a,0x00487991,0xff81e4b7,0x0092de60,0xffdc9754, -0x016d4316,0xffeb5a97,0xff411c71,0xff4e589e,0x02b5bc90,0x04a04eb8,0x05368480,0x04505340,0x039d92d4,0x03e12a2c,0x02fe0944,0x02e1b4b4,0x0326362c,0x03a05a4c,0x03c86380,0x03bdd588,0x0329e6c8,0x02c389e4,0x01e9bf50,0x00ab675b,0x01af9338,0x00c254cb,0x014387be,0x0100cdde,0x012c9344, -0x00a82592,0x004383c7,0x003d9a4e,0x00260307,0x007d201c,0x00e345d8,0x00c4ba54,0x0073d9f0,0xff85cd5c,0x00a580e3,0x00548592,0x00de0042,0x01672078,0x00e4ac70,0x006ed4cd,0x01ea4278,0x027af150,0x02c81390,0x03c49038,0x03669330,0x01949f0a,0x010563ac,0x00b80255,0x004c88ce,0x0139efa6, -0x013d9af4,0x00b8bccb,0x00f94957,0x01f53422,0x01701f70,0xffcbe1d5,0x011481a6,0x00e64100,0x00a3a912,0x00874ace,0x00e951df,0x007f1704,0x0037e2fc,0x00466f15,0x005b337b,0x002775c7,0x002b1b5a,0xffe74cd9,0xff8bc6cf,0xff672758,0x00b7c811,0xfe7a91fc,0xff30546f,0xffce32be,0x0095d62b, -0x0038cfac,0x00a72ec3,0x00f5d7b8,0x013e16a6,0xffd38c91,0xfee888c0,0xfd87ad90,0xfece85fc,0xff710f4f,0x0083acbf,0x015d94bc,0x026fa454,0x042f3f40,0x02f69314,0x0259cc04,0x00aafd7d,0xffeee48e,0x007021a7,0x00d91a4f,0x013e6b76,0x013ada50,0x004ab3df,0x000d559c,0x00219b8e,0x00339755, -0x002c9166,0x002ba867,0xffcf3482,0x008b007b,0x010a18a8,0x008f982d,0xffcf6b21,0x031256f0,0x02f34880,0x01e10868,0x00b89b87,0x01c67b48,0x02039918,0x03070d48,0x056f7920,0x02210744,0x00df55fc,0x003b4b31,0x02ded294,0x03e0ec30,0x03374010,0x033419e0,0x01bd5f9a,0xffdd077a,0xffb2a144, -0x007eb405,0x00a7fa42,0x00ad07d8,0x0122e9a2,0x01e74e5c,0x00278845,0xffabcc43,0x0012ff7e,0xffe82d0f,0x004299a8,0x0025e377,0x0009815c,0x001bc7c5,0xffe74d26,0x002a015b,0x00f17657,0x02c6f6e0,0x02dff798,0x009ad9d5,0x00e02e1d,0x03fa4abc,0x065b43c0,0x0a8abf40,0x07cf1338,0x04e44108, -0x0276fefc,0xfe72da66,0xfdaae074,0xfe60545a,0x00913df3,0x011ac7ca,0x0007586e,0x00b88d76,0x0113cf70,0x017e185a,0x012649b4,0x00a516ae,0xffff54c9,0xff329035,0x001bc6ee,0x018f6fd2,0x005d5469,0x003e6cd9,0x008acc99,0x00327a26,0x0020a02d,0x001f0f14,0xffe358e3,0x00228785,0x013a7346, -0x016c1f22,0x01fe0928,0x018fee1e,0x014ff750,0xff2921a9,0x02182d64,0x0564b8d0,0x04cd1318,0x04540a28,0x052af428,0x063f2a58,0x06d3f8c0,0x04f3e600,0x03aefc14,0x02605990,0x016be470,0x00df7ad0,0x00742afb,0xff68d6a9,0xfec35b4e,0xff0492fa,0xfefb62a8,0xffa67545,0x0045f8d4,0x001dbd99, -0x00cbb13c,0x00d0023e,0x009f104d,0x00a40c5c,0x009979c4,0x00a11b3d,0x00ebbf7d,0x01300b36,0x0145aca0,0x010598dc,0x00ae7863,0x008e0899,0x00968add,0x00713be8,0x011ed1ea,0xfe456e50,0x00a3d246,0x01b32ee0,0x015ad804,0x02121e18,0x0259f1a4,0x028ae76c,0x03531408,0x022d300c,0x0160f72a, -0x00aa6a86,0x01c180fe,0x026bf260,0x02ff100c,0x02febff0,0x02f2428c,0x0268c50c,0x01e001ac,0x0144627c,0x0069f9a9,0x0079fff4,0x00a9db9d,0x006eee76,0x01009056,0x00f754d0,0x009517e5,0x00896e86,0x008c6b74,0x0102d1ac,0x00ac976b,0x00b6f78d,0x00ffa694,0x00fe5bb8,0x012c28e2,0x00d7fe39, -0x00e447b1,0x00a742b4,0x01156f5c,0x0185d3d6,0x0156a358,0x017c7776,0x01a47ff6,0x01f005aa,0x024b8fbc,0x02028740,0x01daa56c,0x017419d4,0x00f197bc,0x005fb0cf,0xffdd9a34,0xffebeaaf,0xfffb9832,0x001dd61f,0x0021bcf6,0x005bb03a,0x002eee85,0xffee4856,0xfff06049,0x000c678f,0x00485122, -0x0050a631,0x00d11d52,0x006b4386,0x00d0c462,0x002c2cd7,0x00a8b1e2,0x0063f741,0x00bf5587,0x0086d5e2,0x005979f1,0x00071c38,0x0090ad35,0xff823c41,0x011a4606,0x01346548,0x015acd50,0x01822822,0x01acce14,0x01c56a2c,0x01e69022,0x019c7332,0x01627d8a,0x014043c8,0x01060bd0,0x00dd29ec, -0x00a29489,0x00b0e585,0x00a734ad,0x00a2cb85,0x009a82db,0x008535a5,0x00b1bfcc,0x0010f508,0x00d8d82e,0x00fd9787,0x00b9fb40,0x00b179e9,0x0120200c,0x01303b1a,0x012c37c4,0x00c15da1,0x0123b670,0x01166a2c,0x00c3a908,0x00d9cf41,0x0086e917,0x00aa4a24,0x01128f9a,0x00b3f206,0x01874cb0, -0x013e9b6e,0x015ac3b6,0x01620382,0x0169e73a,0x01750286,0x0191ee0a,0x0174de8e,0x01608548,0x01449624,0x01342cd4,0x012338c2,0x0109ba5e,0x010e36da,0x010ec5c8,0x010f2854,0x0118a62c,0x010e4790,0x013f262a,0x00aa616b,0xffd90e84,0xfea1e9d8,0x00ff711b,0xffeb7bba,0xfe8681fe,0xfe886f70, -0xfea0bb06,0xfed49816,0xfebef666,0xfecfb104,0xfee3c492,0xffd94ec9,0x00ff63f7,0xfecc73ec,0xffbe1525,0x017d792e,0xfeb83ffc,0x00561dab,0xfe3ba3cc,0xfee53c48,0xfec13588,0xfeff15b2,0xfebca082,0xfeaaa6f6,0xfeb0f0c2,0xfe999ee8,0xfe955d58,0xfe9e932e,0xfe9984fe,0xfe996530,0xfe99cef0, -0xfea013b4,0xfea4b160,0xfea4f0d6,0xfeaa3e34,0xfee28088,0xfe3f83ca,0x007b7a72,0x01ddaf76,0x031dfba4,0xffe79bc1,0x01b4bac2,0x02f9a9f4,0x02f6f518,0x02ea83e8,0x02979da4,0x02eec3bc,0x02fbc844,0x02e9c888,0x019c127e,0xff91b0bb,0x02ca139c,0x01e5177a,0x01dc586a,0xfea72006,0xfe9aff12, -0xfed11332,0xff59293b,0xfec4a450,0xfe82e9e0,0xfe7d13b0,0xfe37324c,0xfe23abc0,0xfe4511bc,0xfe499f14,0xfe47290e,0xfe36ca2c,0xfe318740,0xfe3704a6,0xfe320f7a,0xfe71c7d6,0xfe754e38,0xfeed0d34,0x02213fe8,0xffed5589,0x003202e3,0x004a0b52,0x007f6ce7,0xffde1c17,0xff7e3818,0xff76785b, -0x001fc903,0xff6c8a40,0xff411e2c,0x00066833,0xffc706a7,0x0070d6b9,0x00124f27,0xfef418c0,0x004c6e21,0xff2b3e30,0xfe043c84,0xfe89f448,0xffc675ad,0xfeccd6c8,0xfe4183d8,0xfe35e3e4,0xfdb1cea8,0xfd87b1d8,0xfdc9ab58,0xfdb474e0,0xfdb62894,0xfdbd82fc,0xfdcf181c,0xfde63984,0xfdda04cc, -0xfe3f48d4,0xfe15d2b8,0xffb86a7a,0x00f1a7c1,0x00996ed9,0x00774278,0x00445e43,0x00e4a1d4,0x0014175a,0x0082616e,0xff221274,0x005c9f74,0xffa12633,0x009d00a0,0x005f1251,0x0074028c,0x0038ce51,0x001da54c,0xffd877a1,0x0044edf4,0xfefc7fd6,0xfdcbdda0,0xfee44dc2,0x0116cbb8,0xff9e3d00, -0xfe9aeae0,0xfe2895d6,0xfd3e5bf0,0xfcc178b8,0xfd571968,0xfd94efd4,0xfd7be05c,0xfd459e50,0xfd12b98c,0xfd1b8e68,0xfd281ee4,0xfdd03b3c,0xfe08c514,0xff9b223e,0x017a4742,0x002fdae5,0x0139b712,0x0053ad2e,0x003fa685,0x00824c6c,0x0028b794,0x003e6a98,0xffa75f32,0x000f1de5,0x00161705, -0x009737bf,0x00641a2d,0x0060bc71,0xff5729c3,0xff241e27,0x01c54b92,0xfcc873c4,0xfc1e9100,0xfbeadef8,0xfb224ed0,0xfbaaa678,0xfc5e0f08,0xfc800e00,0xfe6d1174,0xfeb40578,0xfcf000d4,0xfc5dd814,0xfcd994bc,0xfe960102,0xff932470,0xff94f26e,0xfdcba46c,0xfe2ec49e,0xfda0f9c0,0xff3efd0f, -0x00dd7126,0xff750ba0,0x00577c2c,0x002e778a,0x0089726d,0x00e800f8,0x0029a758,0xfff18a79,0x00369ede,0x00010a95,0xffc01cf6,0x003ea0ba,0xffc750cd,0x00175a91,0xfff258bc,0x019e0610,0xfe52fcea,0xfcddb004,0xfddb9968,0xfff57bec,0x01bb010c,0x00ff7dce,0x00eb30d9,0x01d7c998,0xffe813c6, -0xfe94bc26,0xfdfa2570,0xfed273aa,0xff3526ce,0xff720f53,0xfe3399a4,0xfd9ed674,0xfd306474,0xfe585056,0xfe5cc5b2,0xffcacd38,0x0106ed4e,0x00b5caa0,0x01247618,0x00227847,0x000f97c4,0x002a1190,0xfff291c4,0x000e66b4,0x00131317,0xffe2cb0f,0x000bebaf,0xff8508f3,0x00715cf2,0xffe1de0b, -0x00258db1,0xfde90188,0x034e8934,0x00cf004f,0xff4809a8,0xfce4daf8,0xf87c8010,0xf8b24aa0,0xf8bb92c8,0xf9d40b38,0xfa73ca30,0xfb80cab0,0xfba17288,0xfb6130e8,0xfb858ad8,0xfc89b5dc,0xfd8159b0,0xfe8b781c,0xff7b9ccf,0xff78d035,0xfed1475e,0xff47daa4,0xffcffeb6,0x0021a6e4,0x01e80ec0, -0xffedb90e,0xff899415,0x0040f6d0,0xffaf60c6,0x0002b126,0x000eb641,0xffeb34f5,0xfff23f49,0xfff92849,0x00273813,0x00545cbe,0x02c6afcc,0x02b7395c,0x01a3d554,0x02874a7c,0x02de6900,0x029534d4,0xff9e8771,0xff4a93f0,0xfec91be8,0xfe9fd94a,0xfe9063ec,0xff1f921c,0xff5d3072,0x00a55a6e, -0x00a19518,0xfff6cd27,0xfece9434,0xfe24db70,0xfe01860a,0xfe0c7b06,0xfe273932,0xff35cc82,0x000e7efc,0xffce70e5,0x00fffb5d,0x001d9fa8,0x000ac5f6,0x005ad02f,0xffec16f2,0x0010fc8e,0xffffc467,0xffe992e9,0x000844c3,0x0080578d,0x01336cea,0x0144786a,0x02028ad0,0x01230b3c,0x0288507c, -0x00c5aea8,0xfe0a30c0,0xfe39d890,0xfdd56b18,0xfee32a12,0xffe05a44,0x00ff8bb8,0x00e82ae9,0xfffec178,0xfe22dd72,0xfe62a400,0xfe7f533c,0xff003446,0xff3d1610,0xff36a761,0xfe99635c,0xff3bfed8,0xff39f5c5,0xff545293,0x004632a0,0x00044788,0x00bc52f0,0x00759912,0x0048af52,0x00324e8a, -0x00b99a23,0x00b8644b,0x01035828,0x00e1dd00,0x01218918,0x01568d54,0x010f8d2c,0x010a4b66,0x018e9b8e,0x01174802,0x023eaf28,0x00a1405c,0xff56a9b1,0xff9520eb,0xff5c3a7c,0xff027ea9,0xfeb4e8e0,0xfeeedb06,0x002feb10,0x00fc89eb,0x016c1372,0x010be996,0x00ec9063,0x016a709e,0x01213c84, -0x01038d9a,0x00d09320,0x0071a707,0x0057ca55,0x00cc46e3,0x00af1776,0x0093acc2,0x00ce361d,0x00bfd9f7,0x00ba6d6a,0x00a0f912,0x00516995,0x005b87ad,0x000da032,0x0018e073,0x0035cb20,0x006458b4,0x00b39a5d,0x00c7573d,0x011e7900,0x00cd6121,0x008c8053,0xffb52c34,0xff21b57e,0xff56916f, -0xff2e5cce,0xff5bd7c6,0xff6cd355,0xff46c99f,0xff70047d,0xff6a787e,0xff7e3d7c,0xff6d9f1f,0xff6c285c,0xff667154,0xff491f82,0xff39a9e8,0xff1d99a8,0xff3118bf,0xff00fab3,0xff4b1724,0x000602bc,0x001f8187,0x00481ab1,0x0035a9ec,0x007b1736,0x005243da,0x00c14364,0x0043b869,0x00fb4d05, -0x00886d31,0x00e3763e,0x00a35c7a,0x00aa4218,0x00c32e2c,0x01052ea6,0x00806358,0x01a4a8d8,0x005d9b23,0x002ce96c,0x0014e561,0xffd166e3,0xff984015,0xff5a1029,0xff284253,0xff58861b,0xff8cf000,0xffc040ab,0xfff1663b,0x001fd5e7,0x0052612f,0x004a8085,0x0042d32c,0x00308d86,0x002a95e4, -0x0020e61e,0xfff0b7ac,0x00cbe4ee,0x00289bc5,0x0055b911,0x0086ec40,0x00b977ac,0x0078db7d,0x0045d7a7,0x005f7d7e,0x00b6d747,0x00379793,0x000f58de,0x0058da97,0x004bddc6,0x00a73107,0x00acaad7,0x003e107e,0x00d51de3,0xffdbdbaa,0x000edba2,0xffec9767,0xffe350f4,0xffd6cee2,0xffcbbfc5, -0xffb012db,0xffc16d2c,0xffc470c7,0xffca69c9,0xffd44a20,0xffdf7bfb,0xfff4cf6e,0xffec5016,0xffee1900,0xfff29254,0xffed5d17,0xfffc6f23,0xffc20703,0x00a5bbcf,0x0160ab18,0x01f5795e,0x007c5a6e,0x0179271e,0x023ba7d8,0x023b088c,0x0220b08c,0x01e5b34e,0x02080744,0x01fdba66,0x01df6332, -0x016e7232,0x007e5c38,0x01dd0ba8,0x01933f7e,0x00123e68,0x008e40fb,0xfed05124,0x0123d992,0x00566f94,0x005bbf51,0x0055a0c7,0x0050d363,0x006457e5,0x00a12b27,0x00925ff6,0x0095951c,0x009c0cc6,0x00890174,0x00833f65,0x007de490,0x00971686,0x009de039,0x009d07c3,0x0099d613,0x0082dcb6, -0x011fe5a0,0xfedd57e2,0xfe07c3f2,0xfe1b3e00,0xff52cbf0,0xfe10539e,0xfe18c6fc,0xfde57224,0xfddf7f14,0xfe22aa0c,0xfdd259a0,0xfdce6e70,0xfdebd28c,0xfe19e1bc,0xff822c89,0xfe00e598,0xfdc9b73c,0xfde4a4e0,0x007dd465,0x00503ed1,0xffea4ef4,0xffe8fbf2,0xffae3c33,0xffe7e5fa,0x008aa268, -0x0090e716,0x00a8f07a,0x00a8f646,0x00911c3f,0x008c9cfb,0x0085b653,0x00c9c9fd,0x00d00f76,0x00ca581d,0x009419d7,0x00d7a056,0x0087c55c,0xfe74c23a,0x003191ff,0xffb57a70,0xffdc10e2,0xff991016,0xffe1892f,0xfff96fec,0xffb6f963,0xff2d5e5a,0xffed429a,0x005b0eed,0xffed7440,0x00110b44, -0xff69a8d0,0xfef95e96,0x000e426a,0xfedd8fd4,0x0050a0d2,0x0042df63,0xff83ce77,0xffc63516,0xfed1e460,0xff3d6aa1,0x00c60464,0x00a5e205,0x00dae71a,0x00e30d13,0x008185e6,0x006536e3,0x0035cd05,0x00dc52e6,0x00f64008,0x010e1b5a,0x00baffc6,0x01448480,0x006aaed3,0xff8f145a,0x002234ae, -0x0037849e,0x00530acd,0xffb7e6c0,0x004eeb7c,0xff6c1ec4,0x0056a0d1,0xff272bc4,0x0037a56b,0xff9c27c2,0x001e55d2,0xfff3d1dc,0xffca3981,0xfefbf3f8,0xff858861,0xfe75cac0,0x001146a4,0xfff83a83,0xff0a1638,0xff0e86b9,0xfd634674,0xfdf2e8bc,0x003e49e4,0x005b1451,0x00c888c5,0x00f2d2b9, -0x00aebf4d,0x006f8674,0x00334d67,0x011c3f68,0x01522774,0x0154c84e,0x00bc5da1,0x01583180,0x00e6785a,0xffe7bb8e,0x019fe69e,0x0083286b,0x00fef21a,0x00d79f9a,0x01199206,0x00791026,0x001e472f,0x0047fa08,0x00103170,0x008bc7b9,0x00bbba83,0x00a7b4c9,0x00135736,0xff0abf7a,0xff291cec, -0xfe869162,0xfde86540,0x001e845e,0xff4c704d,0xfec16f44,0xffe254bd,0x009862f2,0x009d0f95,0x02907444,0x02bc6420,0x015372ec,0x00e09887,0x004796d1,0x0051fbfb,0x002ea9f5,0x00586b5c,0x01af29e6,0x01877a84,0x022a7598,0x0066280e,0xff0cf8c2,0x00c5f4b2,0x0049b332,0x00880c7f,0x006f4f05, -0x00ab08e4,0x0030a709,0xfffc961a,0x005864c6,0xffa58250,0xff90be52,0x00249e92,0xffbfda35,0xff3284ee,0xfeeee9de,0xffa905af,0xfda781f4,0xff210e56,0x0137e292,0x00d898a6,0x00942b67,0xfe912f72,0xfd948094,0xfdf2c4b0,0xff00b3f8,0xff60c6d6,0xfeff70c0,0xfe1278ee,0xfdffc340,0xfefd7e3a, -0xffc83baa,0x005e658c,0x00cc86f7,0xfff8bd1d,0x00489d3d,0xff69b792,0xff8c4f6e,0x0048a21f,0x00dae1a8,0x009cf707,0x0063941e,0x002f0778,0x00037cd1,0x0001e500,0xfff5f84e,0xffdeb9bc,0xffca6e88,0xffc90556,0xffad83c8,0x000e2881,0x001ba8bd,0xff43bf24,0x0175d862,0xff63ee2a,0xfd2ebc78, -0xfb8177a8,0xf9f52330,0xfc39b328,0xfe7867fa,0xff9be266,0x01f69a76,0x01f2a33c,0xffe34129,0x005a7024,0x00cb27b5,0x01d893da,0x018554b0,0x00e15315,0x0010e7c0,0x000e361a,0x00dcb7c1,0x004af911,0x0010aae2,0x00c66bd7,0x011df30a,0xffd0c5f1,0xff8da5f9,0x004157f4,0xffe9a139,0x005615c5, -0x0021e25a,0x000efc97,0x000187e3,0xffe83d8a,0xff885b2b,0x0001085f,0x00cf153b,0x0191116c,0x01a65478,0x01e86cf0,0x0389fef0,0x037ed4e8,0x033595b0,0x01df4548,0x0022766e,0xfead1732,0xfde5f594,0xfda7d56c,0xfd2b61d8,0xfe402b14,0xfecccdc4,0xffb1a162,0xff838471,0xffc83c50,0xffeb9f16, -0xffda62c8,0xffeffad4,0xff70c522,0xfedf1950,0xffb89606,0x00dd1946,0x0018fd0d,0x00174d5a,0x0064edaf,0xffff85a0,0xffe21c98,0xfff4c70d,0x001ec8ea,0x005b3a17,0x00fd348f,0x01113134,0x0192b07c,0x02025d54,0x01bcffb4,0xfeca25c8,0xfe952ab6,0xff8e1816,0xffb7ab08,0x00dcb9b8,0x01f5d5ac, -0x02f6a0b4,0x0344f9d8,0x02050a30,0x0052abf9,0xfe077584,0xfd9a756c,0xfd9bb1c8,0xfe7e126c,0xfedb1518,0xff35ef58,0xff0b34c9,0xff3b4e28,0xffb5726e,0xffc62ed3,0xff89baac,0x006f090b,0x00d42023,0x00677bb7,0x00422b67,0x0027e74a,0x00b655cc,0x010fb78a,0x009181c6,0x00e62cef,0x00cc08aa, -0x00eb9857,0x00983255,0x00623900,0x0068109f,0xff9dc2ca,0xff951bce,0x00045062,0x011347b2,0x00bda297,0x00d0c87e,0x00db573b,0x01759eb6,0x0281d9f8,0x021510a8,0x0234f024,0x026d7ecc,0x01b4ba16,0x0112e4f8,0x00ccb760,0x00b354e0,0x00dc7cbe,0x014ba37c,0x014e7478,0x0121c006,0x0094f713, -0x00704972,0x00503842,0xffe372b4,0x005c498f,0x00c1aba0,0x00ce187b,0x00a0b530,0x0056757d,0x00443bc9,0x003464fc,0x0036530c,0x006fd365,0x0085e4a4,0x00a60f7c,0x00b147d3,0x009972f2,0xff862fab,0xffe8ef82,0x0041f1bc,0xffe4fd61,0x0002d54a,0x002e2d1a,0x00551980,0x00841ff0,0x005b7a2c, -0x00359044,0x000d4668,0x00116600,0x002aa104,0x0024c521,0x0032326c,0x0020973b,0x00262434,0x0023316d,0x009afe34,0x00343968,0xffa5cdfe,0x00452843,0x009af609,0x007e37d5,0x002fb111,0x003a641d,0x00263041,0x0094b43d,0x003876f9,0x00a58b7e,0x006379c8,0x008f6f61,0x005988c5,0x000e197a, -0xffc3bc8f,0xffe2ae5b,0xffcd4987,0x007e1b4c,0x00b1a779,0x00be93b5,0x00d69ddf,0x00e6c2fd,0x00f8b849,0x010738da,0x0101323c,0x010482b8,0x0100623e,0x00f578c0,0x00d38cd2,0x00a9253e,0x00a6f2e0,0x00a86fbe,0x00adf51c,0x00a1b0ee,0x00a36733,0x009f36f0,0xffdc5e83,0x005ccbb7,0x00237833, -0x00295b90,0x00101a83,0x003f32aa,0x006273c1,0x002cc4a6,0xffeef4da,0x0042dcf3,0x00706f75,0x00376aea,0x00514a03,0x002c3705,0x0031a25a,0x00882d48,0xfff5e390,0x00f85bef,0x00cb628d,0x00d5616b,0x00deb6f5,0x00e25038,0x00e93758,0x00f74b2b,0x00ecde58,0x00e30304,0x00d9661e,0x00cf198e, -0x00cdb6e7,0x00cc4574,0x00ceca86,0x00cb3a31,0x00c9563a,0x00ca45bb,0x00bd4185,0x00fa25e1,0xfffe3dbd,0xff79bcc9,0xff80808f,0x0023f41f,0xff6f39f5,0xff7d4ff9,0xff6fd049,0xff7fbc4e,0xffa4d450,0xff7d80de,0xff7d82d3,0xff885f9c,0xff863696,0x002a25f3,0xffb25f0b,0xff7de029,0x01040652, -0x0032262f,0x0193a406,0xffd10a9e,0x001bbcee,0x00227cb3,0x003e41c8,0x00469230,0x004ba1aa,0x004390c9,0x00442a42,0x003c4b5e,0x002a23ac,0x002d96e4,0x002a682d,0x0027b2ec,0x001f4caa,0x001cc059,0x001ae4ca,0x0025f36a,0x002d953b,0xffe7ce8d,0x01a61542,0x01cfbfa8,0x00967f6b,0x016f5862, -0x01d1bd02,0x00a4439f,0x00c10fad,0x00c2c47b,0x00942d97,0x00eed9d6,0x010284ca,0x01022294,0x01cd724e,0x014f3bd8,0x00845be7,0x01d78110,0x0154da98,0x004ebce0,0xffdd1bcc,0x003ddc4d,0x00773235,0x00bceeba,0x00d000a5,0x009622bd,0x008cc35a,0x005efb65,0x00225eb9,0x001db203,0x001308cc, -0x001a00a8,0x0019c180,0x00262577,0x001f85b1,0x00483f00,0x00124d30,0x00a8287c,0x016cc5ba,0x00b67a47,0x012c04aa,0x00cd34cd,0x00d6eee5,0x00ca80fc,0x007cc11b,0x00b99cd8,0x01045b56,0x00ad0924,0x00679ac7,0x00b36ac7,0x00bdb9e2,0x00db9ff6,0x00b79cb9,0x005f9d2a,0x0106584c,0x004ceb06, -0xff69387c,0xffe87557,0x000bcc3e,0x00d4178b,0x012d7216,0x00b5285f,0x00e504c5,0x009d064a,0x00196ec1,0x003a38b7,0x0016660c,0x00178529,0xffe93c79,0xffedc527,0xffed3ac1,0x00266e40,0xffe90bc7,0x00e0e0bb,0x018643d2,0x0121e086,0x00fb775f,0x00e5e2b8,0x011a4b5e,0x00930ba3,0x00832c5f, -0xffc5ff6a,0x00a020c6,0x0002b161,0x00cd4aab,0x00ae98fb,0x00dcb10f,0x00c3ae3c,0x00789ef2,0x00979f63,0x004cd5ce,0x0014a9fd,0xff596bd9,0xffe0255d,0x0041b88a,0x01f04266,0x026b6b0c,0x017449dc,0x0170bab2,0x00bd0790,0xffb8f67d,0xfff4d97e,0xffefe664,0xfff59be1,0x000bfe34,0x0011a52a, -0x000898c1,0x004a0ea4,0xffdf4fac,0x0108a39c,0x01a14456,0x00b6d201,0x01607a52,0x00a7af84,0x00684708,0x008850c3,0x0038a7f8,0x000e3703,0xffb6b862,0x0021a569,0x003d62f3,0x007e4c37,0x0087ab57,0x0085b888,0xff2f719f,0xffa3c241,0x0287c32c,0xff477015,0xfea804d4,0xfeec1b32,0xfe26e4a6, -0xfe9ff69e,0xff3b6cb2,0xffa79f8c,0x00a81933,0x00a6899e,0xff9b2ebd,0xff0394db,0xfe6bee72,0xfdd3a938,0xfebdd2d6,0xff57e0d7,0xfecdc924,0xff78e755,0xffa21995,0x015a9cca,0x01b4e65c,0x0062e5a5,0x00c6ef93,0x00d6ec98,0x00f6fd01,0x00a0bb9e,0x00217b7a,0xfff391a7,0x0028ed63,0xffbd2572, -0xffdab085,0x00e107a9,0x006851ff,0x00a131f1,0x00971576,0x02a7916c,0xffaff66d,0xfe70c3ec,0xfef227d4,0x008409c8,0x00fd7e01,0x0178b7b8,0x013cf84c,0x0062fcaa,0x00e0c018,0x00864ded,0xff0eebe6,0xff27ccf6,0xff7f93ca,0x0074d3ce,0x01208154,0x0170a496,0x013a19b2,0x01342a1a,0x008c76b8, -0x0087eb3a,0x00945298,0x00c2b60e,0x0186dcb0,0x00226fd9,0xffdb20d1,0x00085b99,0xffef3e92,0xfffa6faf,0xffde573e,0xffb3d5c0,0xffae84ab,0xff691386,0xff7e45a7,0xffe9526b,0x0138ef6a,0xff7b3eba,0x00acca70,0xfe4dfc3c,0xfca0df10,0xfce4443c,0xfe50a488,0x0027ccfc,0x0162a8ce,0x008f5e56, -0xffe19e44,0xff002cb1,0xfe367b3c,0xff137681,0xfffc7828,0x01740da0,0x00b926b3,0x008ad028,0x003ee5c6,0x007fedc5,0x000b292e,0x00873a7c,0x011a6024,0x00beb2d8,0x01819ae4,0x005e47d0,0xffe14ff3,0x0030bf0b,0xffd33714,0x001728ef,0xfff79064,0x0016712c,0x002d28c9,0x0063e62d,0x001a5559, -0xffa6dbfa,0x00afb41e,0x00ad56f5,0x02985848,0x03f3aca0,0x06cb29b0,0x07a748d8,0x06198d00,0x036ce0e8,0x012d8ea2,0xfe8b3b7a,0x00f50550,0x011e8284,0x000666b9,0xff9018cf,0xffab784a,0x00e521d1,0x011002bc,0x011001c4,0x00041a4f,0x00020cac,0xff9b857b,0xffcc118e,0x003ff01f,0x0066ba5a, -0x00da9df3,0x005a8ec4,0x00591a6c,0x008597ce,0xffe3ea1d,0x001075ab,0x00120b40,0x0042f04a,0x005fbf73,0x007f6f34,0x0116cd66,0x01c4a65c,0x023b478c,0x0215ea5c,0x015e607c,0x0277b658,0x02ace794,0x03126450,0x03bb1a40,0x04b73460,0x04c7f708,0x03a54e7c,0x02d7c46c,0x01a874da,0x012746e4, -0xff64461f,0xfeb0944e,0xff65a5cd,0xff260cc9,0xff76c332,0xff5eadfe,0x00093b84,0x00296eed,0x0037cec7,0x00a433eb,0x00989f92,0x00dac42b,0x00610da1,0x003483a5,0x0037330c,0x00d8a7a9,0x00f037bd,0x00e3dd17,0x00f826db,0x014407ce,0x01a4db5c,0x0139dd14,0x011a673a,0x0145913c,0x01c6c8b2, -0x01b8d77e,0x02470f70,0x01ec6d92,0x01aeff5c,0x00d03b13,0x006e3522,0x0096a1de,0x017165de,0x01a83ace,0x01cbbcb8,0x01c8e15e,0x01aa0988,0x018dea96,0x012cd05c,0x015f93de,0x01150546,0x007b3519,0x007a4441,0x006f3fdc,0x0082ffc8,0x008d8f45,0x008c2e35,0x010571de,0x00e4f6b1,0x00d67fe3, -0x00d02669,0x00a5aaf7,0x0066ac84,0xffe47f51,0x0023e0f6,0x004d8aa5,0x00a560f5,0x00acde12,0x0116e6a0,0x017209ee,0x01e9861e,0x01128200,0x0081df86,0x002bc8d1,0x0048ac59,0x0040a402,0x008a3040,0x00a02b22,0x00a7489d,0x00b8b7ac,0x00d66177,0x00f26761,0x00abc90e,0x00754d60,0x003fbd62, -0x0061afc5,0x007c20fc,0x0093f36a,0x00b249d4,0x009af652,0x00e9216b,0x011e9d3a,0x00f8b22c,0x00e5255d,0x00a453ed,0x007a01a1,0x00414d57,0x0073289d,0x00825150,0x00f77910,0x00cbfa3c,0x0101a596,0x00fee156,0x01153510,0x0136f302,0x0156907c,0x0112278c,0x00c5b08a,0x00dd9ead,0x00cd0ecb, -0x00ead5cf,0x00e2eeaf,0x00dcb835,0x00da252c,0x00e8fa85,0x00bf8f78,0x008fd833,0x006bd738,0x004f6621,0x0042677c,0x0038bd55,0x00341e4a,0x002e77ad,0x0027ceec,0x002e91a7,0x00258a4f,0x003fcf4a,0x0095e771,0x006d9266,0x00b63c86,0x00aa1604,0x00e41a2f,0x00f30416,0x00cd6cd1,0x00ed142a, -0x00f82da6,0x00b8cbe3,0x008bba73,0x009a6bc0,0x009ffbf7,0x00a9e2b8,0x00c324c9,0x00a341ee,0x016c0eb6,0x008a30ea,0x009db5d7,0x00a37acc,0x00a6715a,0x00af21e3,0x00b372c7,0x00bb82ca,0x00a390d0,0x00984818,0x008a455d,0x008054d3,0x0072e25b,0x00628726,0x006bd3a8,0x0072311d,0x0076cb58, -0x007ca122,0x0082ddde,0x0061419c,0x0144f870,0x01798512,0x00df55df,0x0145f5ca,0x0194de88,0x00f50aa1,0x00ff78cc,0x00f8f309,0x00e3bee5,0x0105892e,0x0106b066,0x00fe6b53,0x017ea96a,0x014653dc,0x00c80f3e,0x017d4bc6,0x00bc7944,0xff1ac093,0xfe700792,0xff3bdf47,0xff27e10e,0xff08e546, -0xff1d3bae,0xfee282da,0xfeda0b1c,0xfef34fb8,0xfef7d536,0xff03b1a5,0xff11ba4d,0xff1636f6,0xff149ccc,0xff071087,0xff159c27,0xff180de2,0xff150b91,0xff16ddad,0xff35bbeb,0xff3c7b01,0xfe7edf8e,0xff0ae12e,0x0107118e,0xfe7db1c4,0xfef18e32,0x00c63f5d,0x0098f083,0x008caab3,0x00913817, -0x006ca8f7,0x00686dd5,0x00649ba6,0xfef04ce2,0xfe77048c,0x00bc46bf,0xfeefcc7e,0xff68bc2d,0xfeddb5d0,0xff284231,0xfed5d1f2,0xfefd482a,0xfe42e95a,0xfe1149f8,0xfe5c7798,0xfe6ba46e,0xfe93161c,0xfeb4ecd4,0xfed8f118,0xfee04c32,0xfeb7bed0,0xfece3d46,0xfec848aa,0xfec6b782,0xfecc5054, -0xff1f6c36,0xfeeeb1fa,0xffcb60cc,0xff7c5b9f,0xff2f9cbb,0xff9c8a01,0xff90b74b,0xff22b251,0xff277fd4,0xfecf0a2c,0xfed6ba90,0xff008b90,0xff589c15,0xff75917c,0xff786dbc,0xff8dbcd0,0xff03f4ff,0xff1277d7,0xfecaef02,0xff1af4fd,0xfefa87b6,0xfe7dbfe6,0xff01f632,0xfd9baa28,0xfd2bfda4, -0xfdafa8a8,0xfdc9a740,0xfe17923a,0xfe5c67ca,0xfe90bc06,0xfe8b5a9a,0xfe399e80,0xfe84b362,0xfe8e263c,0xfe827572,0xfeb222f0,0xff0e2cf1,0xff5f647e,0xff674a18,0xffc39c7d,0xfff0a5d6,0xffefbd05,0xffe1fd96,0xffb324be,0xff8fb232,0xff8093b9,0xff3e64ba,0xffd960f2,0xffd5c146,0xffdf757d, -0x0008696b,0xffdb4e76,0xff3690f3,0xff2ea60e,0xff3ce661,0xffacdd87,0xff781610,0xfed157a4,0xff6966bb,0xfcffdfe4,0xfbedf8d8,0xfc9bd94c,0xfcc4f3c4,0xfd3ebb64,0xfdbaade8,0xfe2bd984,0xfe2daabe,0xfdb362a4,0xfdef3fb8,0xfdeccc14,0xfdf949a8,0xfe3e608e,0xff1ea0ef,0xff9ec039,0x0037aabe, -0x00b5862c,0x009a897f,0x007f452d,0x008cafb2,0x00b2c325,0x002ea274,0xffffb964,0xfffffda4,0x0002d881,0x0069d4ef,0x00a7f779,0x009bdd32,0x00274ef8,0xff687a94,0xff641b37,0xfe724a2a,0xfc8a02a4,0xfce8b9f4,0xfc6cdc34,0xfc980e74,0xfc536b5c,0xfcd79e3c,0xfde19adc,0xfed7b3f6,0xff98851a, -0xffa61f57,0xffa7f694,0xff9a5807,0xff25fd70,0xff26b837,0xff3df091,0x000092b8,0xff6428eb,0xff2a8edd,0xfed808e6,0xffae36cf,0x0037325d,0x001aca7d,0x00a230c0,0x009ad347,0x0071b73e,0x000b0c65,0xffd3e2d9,0x00029b5e,0xff7fe95c,0xffaf6c38,0x00414e84,0x00226a46,0xffe6319c,0xff7a33de, -0xff719208,0xfdde8fa8,0xfe0cc6fc,0x0073f749,0x0021d36e,0xfffe58c6,0xfea807a2,0xfe448338,0xfe5f827c,0xff6c0d3d,0xff94806b,0xfecc4bfa,0xfeb3857a,0xfe7486ae,0xfdfd3298,0xfedd9512,0xfece0e7a,0xfde568bc,0xfe4a1fda,0xff04aef1,0xff789030,0x000eef45,0x004d9297,0x00aec3a0,0xfff204c8, -0xffb3770a,0xffe90d81,0xfff2ae79,0xfffdddf0,0xffa91c56,0xff9e3781,0xff7be1a7,0xff1ea989,0xff17ead6,0xff684779,0x00266739,0xfec12cb6,0xff3901d7,0xfcb4417c,0xfb03d540,0xf9e1df50,0xf8cfaee8,0xf93fc418,0xfa42cfd0,0xfb1559a0,0xfdf73014,0xfebfcdea,0xfe02127e,0xfd81b76c,0xfd1e7b7c, -0xfd61c160,0xfe43060c,0xff32b507,0xffce2a81,0x000cfc1c,0x0031248d,0xff93f05a,0xffe85426,0x005b4042,0x0085496c,0xffb2b46b,0xff97590e,0xfff59c99,0xffae6520,0xffe76a96,0xffc44454,0xfff4c7eb,0xfff74d78,0x00085efc,0xff8387ad,0xff535e67,0xff57fd1d,0xffaa77d3,0x033104e8,0x03c072e0, -0x02015920,0xff705e96,0xfc028ba4,0xfad1f7f0,0xfb303580,0xfd6cef1c,0xfe63b36e,0xfe498bd6,0xfcf247e4,0xfc53f294,0xfcbbac18,0xfe7d3e78,0xfef25bec,0xff334100,0xfec46422,0xff0cb582,0xff7bf70c,0xff801333,0x0019d7b9,0x004f2158,0x0074c3d7,0x002c7083,0x0018a24f,0x002de377,0xffffdaca, -0xffea61a8,0xffeb7a6b,0x0030e8f0,0x005ca715,0x004f1791,0x0108902c,0x0186820e,0x0254d950,0x029c8470,0x00659322,0xfe0cde6a,0xfc397568,0xfd0f817c,0xfec011be,0xff196e64,0xff57df09,0xff4c4288,0xfe78f040,0xfd823520,0xfc614c00,0xfbd14c30,0xfbcfedc8,0xfc8c8378,0xfd6b5614,0xfe5d6ce8, -0xff273871,0xff739cf3,0xff7f7098,0xff7184a8,0xffb9eec4,0xffef4b67,0x00ac62cd,0x0025f1ac,0x0005c64b,0x0011dac8,0x007f3e4d,0x00a92c8b,0x0056aebf,0x0088e5db,0x00a2f1ce,0x00be35e8,0x00af4cd0,0x00a7b8ee,0x010abff4,0xffc32797,0x014c4d34,0xff99242f,0xff5d5565,0xff5f4a29,0xff2657e2, -0xff71d426,0xffc81b94,0xfff6e8da,0x014f6f92,0x01e94708,0x01f4be20,0x015573ec,0x00792923,0xff575b53,0xff60e3c7,0xff2ce942,0xff0b31cb,0xff652792,0xffc3c0d5,0x004778d9,0x0061d256,0x00284d54,0x003b257e,0x003c65d1,0x007c03f6,0x00752eb8,0x004f8cc3,0x001d9787,0x0018e54f,0x000a955f, -0x00160513,0x0051ca2f,0x0058797b,0x003f40a9,0x008a0e13,0x0033df6e,0xffad348f,0xffcca551,0xffc16399,0xff7eebc5,0xff50cb9a,0xff4097da,0xff269b3a,0xfef099bc,0xff2a01af,0xff63763f,0xffcaad3d,0xfff4b9b9,0x003e6089,0x007a7930,0x00a5778d,0x00c7750c,0x00f4e691,0x00bf5a93,0x0085d4b5, -0x002982aa,0x0043baca,0x008fbaab,0x00af24a6,0x008a3ac9,0x006a513f,0x0051df1f,0x0074ecec,0x00790cba,0x006ef13d,0x009dc17f,0x00a54516,0x009ec68d,0x0088035e,0x007017a2,0x0071e1d0,0x00168181,0x00b3d127,0xffe7935d,0xfff92544,0xffdda716,0xffd5ddaa,0xffc2e2bc,0xffbcef9e,0xffb125aa, -0xffe48d68,0x0005ad4c,0x001e67f0,0x00309eaf,0x00385afd,0x0037218f,0x003a5e17,0x00430f93,0x00594a4e,0x005e8fdc,0x009c629d,0x008bb1bc,0x003fd383,0x0010b455,0xffc1f2d5,0x00027589,0xffdbb8d4,0xff9d1183,0xffab4b4c,0xff8a8a78,0xffa4b738,0xffae6f5d,0xffd309de,0xfffcc77e,0xfffcb399, -0x002aba72,0x000e6ec2,0xffff527a,0xff949dac,0xffc38afd,0xffdbb9be,0xffcdf9f9,0xffcfe8d3,0xffcaff60,0xffc6978a,0xffb93275,0xffc7b2c1,0xffcf24fb,0xffd884ab,0xffe5759f,0xfff31671,0x0000e83e,0x000ac9a9,0x0010d2f2,0x0015ff94,0x001d8365,0x00228a0a,0x004043f1,0xffb77eff,0xfff5133c, -0x010bcf88,0xff80f2f3,0xffc6d507,0x010d12b2,0x01039af6,0x00ffb1a9,0x01005162,0x00ec2fd7,0x00e5b939,0x00e02648,0xffeb65d9,0xff793602,0x011dcf2e,0xfffdaec5,0xffcb1010,0x0137f82c,0x010c429a,0x0159daee,0x00f13489,0x01146f5a,0x01040f6e,0x0147b5f4,0x015d3092,0x0158ad7c,0x0158d0de, -0x01543950,0x0148cfec,0x014b0bb4,0x0146763c,0x01396152,0x013e67f8,0x013bb0e4,0x0134c58a,0x0137f8d4,0x0111c1a0,0x0159ea60,0x010d5ca8,0x0015c94b,0xfe0c0866,0x0162821e,0x003bdc4c,0xfe2f56d8,0xfe39eaa2,0xfe40b880,0xfe5a17a8,0xfe6e712c,0xfe7c2a44,0xfe8f5be0,0x0049b73c,0x017dbd60, -0xfe18087a,0x00028ec3,0xff938574,0x018626fe,0x00e00f46,0x00f09dc8,0x00e650e2,0x018d9082,0x01ce8878,0x01bfcc80,0x01c33ae2,0x01b1f960,0x0198591a,0x019ae010,0x01927ff4,0x0173e43a,0x018c3492,0x018e53de,0x0183475a,0x017ba00c,0x01509b5c,0x017428e2,0xffa4091c,0x00dc341a,0x010da814, -0x00b5e449,0x0088f192,0x00e9f79f,0x00d144e9,0x00fc4dcd,0x00b1535c,0x01186400,0x0114c78e,0x00bdc6db,0x01055410,0x0088e719,0x006aad7c,0x01320678,0x00d28552,0x012edf20,0x00ce3141,0x00d39af5,0x00a01b26,0x01d0d406,0x026af75c,0x025b6ee4,0x027758a4,0x025e2594,0x02274ea0,0x022e1c20, -0x02108354,0x01d32e48,0x01e8c0ce,0x01de846e,0x01c25118,0x019895aa,0x01880378,0x010dc98c,0x00c934dc,0x00d09776,0x00d76f9a,0x010f9344,0x00ac5207,0x00ab1ac5,0x00005354,0x00545d37,0x0013ea9e,0x0066e1e4,0x0073e3d0,0x0096960e,0x00bb8eda,0x00b7023d,0x0004d14b,0x00e52a03,0x010a0112, -0x0190d538,0x00a8fba0,0x007e9e58,0x003f808f,0x01f03748,0x02e89674,0x02e8e964,0x02fe8c34,0x02d8aadc,0x0273da8c,0x02883490,0x028d9ee8,0x0245741c,0x0289a484,0x0281fd84,0x025365e0,0x02242240,0x01b2fe68,0x016165fe,0x00b71512,0x0119f33e,0x00d3d242,0x01243fa6,0x00ec0939,0x00afd444, -0x0043ba6c,0xffd54127,0xffe45144,0x002af468,0x0097fd29,0x00a2e80e,0x00eef202,0x00ed0524,0xffe5811f,0x0134f188,0xffe5b0fb,0x005ae310,0x00d1c315,0x00c86373,0x011be0fe,0x01ae57ba,0x0214d1fc,0x02bd4c90,0x025216fc,0x0245c860,0x027e3374,0x01c23284,0x01174df0,0xffe8cf2f,0x00895784, -0x00c3fefc,0x00c1c854,0x00e8d754,0x0173dbfa,0x017eb2cc,0x00b8043a,0x0102b926,0x00a7c3d7,0x0118487e,0x00f7b085,0x0065800f,0x002116dd,0xffe6dca6,0xfff33feb,0xffc2dbe9,0xffdcc1f4,0x0059e9bd,0x00a7b8a0,0x009a2f4e,0x0030415d,0x008396a1,0xffd9ca4d,0x0023aca8,0x00abb2e6,0x00c8b1f1, -0x006401cc,0x00f184d8,0x00f837ba,0x0026cfbb,0x00f275f9,0x00cec3d6,0x00758bc1,0xff897a8b,0xff5bdd0a,0xff96dd87,0x00c1a91f,0x01d9b2ca,0x02cd65e0,0x023f7378,0x01c68d48,0x00e30712,0x005e77aa,0x00ab9661,0x0126f0fc,0x00569593,0x0013ff79,0x001659df,0x000f4362,0x0016ce40,0xffba54aa, -0xffd10d90,0xffae64a6,0xff739e75,0xff77eb4f,0x002e2654,0x00b6433c,0x0086ace0,0xfe3e791a,0xfd55653c,0xfc46c048,0xfd501720,0x025d80cc,0x033c6c2c,0x0433efe8,0x04150510,0x02f4c1d0,0x01cf4138,0x01772e8c,0x01f1fb60,0x026ce5d4,0x029051bc,0x0282cbfc,0x01c2b726,0x0062ddf9,0x003beedd, -0x00659735,0x00d40d4f,0x01292dac,0x00e649b0,0x00955ed4,0x00354fe9,0x00029f91,0xfff2cded,0xffd5e1ae,0x0000aafa,0xffe5637f,0x001e32cf,0x001489f4,0x001fad99,0xffae5588,0xff645bfd,0xff2255a0,0xff188b06,0x039a6270,0x0437c1f8,0x05960a50,0x05e113c0,0x07328140,0x02f14ca0,0x00cfd588, -0x0016f1a7,0x0052dcc7,0x003e6974,0xfff68e88,0xff496a32,0xff2eef04,0xff99278f,0x00bb2f7f,0x01865e50,0x018d485c,0x01b711b4,0x013bf926,0x004d4a2c,0x005bb4b6,0x00c635d7,0x009b12c0,0x0054f488,0x003118ca,0x00233f97,0x00174722,0x002715e7,0x000578be,0x0036d382,0x0065285b,0x006e9785, -0x011ecd54,0x021c6c94,0x0279883c,0x03207334,0x0029e45e,0x02980904,0x058559e0,0x05f3c610,0x06c84320,0x066784e8,0x058ac3d8,0x03d40cb4,0x01ea7820,0x00c40365,0x00acd514,0xfff075ce,0xffb37d9c,0xff974837,0xff3ce47f,0xff06b7b4,0xff5b64ec,0xff220a98,0xff69ae36,0x00116c53,0x005f43ca, -0x00a3318a,0x00808e02,0x001beadf,0x0027263c,0x00898c94,0x007fd6d3,0x00a00556,0x009d87e4,0x00e823d5,0x00fd28f7,0x010ad17c,0x00f7abeb,0x00fc5b30,0x00e07ffc,0x01b8c314,0xfffc7ae4,0x01b7170c,0x022d41f0,0x01b1ab92,0x01b8e3fe,0x01e04c74,0x0257b9d0,0x034873f0,0x02b7d590,0x02281b84, -0x01870b02,0x01a0fd62,0x017648ac,0x00e68506,0x00ddb5c3,0x00a57365,0x000b17fb,0x002d774e,0x002151e1,0xffe330d1,0x00218a71,0x0071b682,0x00f14a26,0x00fceb75,0x00cf9147,0x00826690,0x006f9ac0,0x005a6225,0x00899e0e,0x008af4dd,0x00992f80,0x00b98f6b,0x00a5129e,0x00f4a682,0x00ecace2, -0x0184b2d2,0x012bb444,0x015650da,0x01611636,0x013d71a8,0x01348054,0x015bcaec,0x015f56c4,0x01655284,0x017800e8,0x01b6f516,0x01e5474c,0x019f67e0,0x0159cc58,0x010f0c04,0x011d4cd4,0x0124f200,0x012ddbf8,0x01385194,0x0141f3c4,0x01240ace,0x00ef1fd6,0x00d8e36a,0x00cfe77c,0x00c2a13c, -0x008db9a4,0x00ac37b4,0x00863120,0x00f81114,0x00babcbf,0x00e9b81a,0x00c64a9f,0x00f555f3,0x00f80177,0x00fffa67,0x00e7be49,0x011b4edc,0xffaf6304,0x00bc0699,0x00d0b1d8,0x010416ee,0x012a13a8,0x0152a51a,0x0181b4fa,0x01b6f9b6,0x01813508,0x013b5572,0x010474f8,0x00c5ee13,0x009d66e5, -0x006d73ed,0x008be7cc,0x009fa2f0,0x00bb9e4f,0x00cbf255,0x00d8643b,0x011fdde6,0x00874f21,0x00f67ccc,0x010a4412,0x00c16353,0x00b2e9e9,0x00ea6bc1,0x00e7953b,0x00eb5a80,0x00a624a1,0x00d21667,0x00b3871c,0x00830ca5,0x008c55c6,0x005463bd,0x00740e77,0x00a9ec0f,0x00cb9563,0x00e79f54, -0x00cb9247,0x00e720f4,0x00f2751a,0x00ff0ec8,0x0106feb0,0x011d7c3e,0x00fc3b63,0x00eeb45c,0x00dd1947,0x00d432fb,0x00c63bf7,0x00aab724,0x00bfcc4a,0x00ca1be7,0x00d2866c,0x00e668b3,0x00e73a58,0x011014f0,0x00f7eae3,0x0074c07c,0xff4bceac,0x01112e38,0x006b87aa,0xff1c199f,0xff2a7a46, -0xff3c562e,0xff5bb18d,0xff5f9f04,0xff704af9,0xff80aaed,0x00551a56,0x00f8766b,0xff491bca,0x0034dbeb,0x00f2a51d,0xfee111be,0xffaa988a,0xfe963156,0xff16220e,0xfef21f76,0xff0d92f8,0xfec69a24,0xfeb31640,0xfeb8cbf8,0xfeb27b30,0xfebba53a,0xfed00b4e,0xfee0a0b0,0xfee13024,0xfeccb758, -0xfeccc6ce,0xfecb3920,0xfec80d30,0xfed24c14,0xff00dba4,0xfe8dd6d6,0xffb41be9,0x00d5aacf,0x02709c08,0xff602ab4,0x00b91ff9,0x0234d810,0x022b612c,0x022179ac,0x01eee3f4,0x021d5604,0x02238eb0,0x0209673c,0x00ae3265,0xff294333,0x022971d0,0x00e2527b,0x0146bc76,0xfece6af0,0xff0a8ba0, -0xff0a1d17,0xff48d011,0xfea97b62,0xfe64f53e,0xfe666678,0xfe3861a4,0xfe4a14ae,0xfe7af6de,0xfeae743c,0xfeb34dc4,0xfe74feac,0xfe6b1984,0xfe5e0fea,0xfe51555e,0xfe876e36,0xfea294c6,0xfebee756,0x012c803a,0xffa4ba40,0xffcbc2a1,0x00137435,0x002edcd9,0xff77e7dc,0xff540205,0xff30b6aa, -0xff9cd2c5,0xff506c72,0xff572e8e,0xffc27ed0,0xffb400f9,0x003738e3,0xffd5ee6f,0xff2c7a83,0xfff578c3,0xff2aea0e,0xfee7472c,0xff1aeaa0,0xff6fa5b3,0xfe34728a,0xfdb22ab0,0xfdb3dedc,0xfd663aa4,0xfd9f2d64,0xfe0be856,0xfe82d31e,0xfe8d1f1a,0xfe031216,0xfe02c934,0xfdf8ec04,0xfdd9719c, -0xfe548712,0xfe4d3e46,0xff487007,0x001e4836,0x000cd10d,0x003708e7,0x002e06c8,0x008c8c94,0xffa35e4d,0x000ffd82,0xff34ec8d,0xffd6a13a,0xffd10075,0x006a1e82,0x0005991d,0x00641480,0x0040f134,0xffd8666d,0xffb46db4,0x0098a6b8,0xff74d650,0xff369dc4,0xff99f471,0x0063b888,0xfeba0902, -0xfdcfd25c,0xfd76bab8,0xfcd76c94,0xfced03a4,0xfd7ad6b0,0xfe3ecf4c,0xfe57af92,0xfd6f9134,0xfd4ffee8,0xfd2d5ab0,0xfd02a7bc,0xfdbc2bb0,0xfe192d6c,0xff0d5314,0x00a252a6,0xfff9a7df,0x00d2b5f8,0x0089a350,0x0086b45d,0x003606d9,0xffeb0b72,0xffd7a0ba,0xff9d5126,0x002203b5,0x00701606, -0x007931e3,0x00a0740b,0x006f3a3a,0xff9c267a,0xffbb3f87,0xfeefb294,0xfce7fa98,0xfce12be0,0xfd17900c,0xfd0cf37c,0xfc1ebe08,0xfbfbee10,0xfc8b5c54,0xfd03ad1c,0xfdf757a8,0xff22971e,0xfee64c12,0xfeec8742,0xff473f9a,0xff4e4739,0xff46a5f1,0xfea79498,0xfe9121f2,0xfe3094b6,0xff3ec1cc, -0x00990dff,0xffd518dd,0x00170307,0x009eca05,0x00c04265,0x0060e3f6,0xfff764c0,0xffbb456a,0xffd1efa0,0xff7cb77d,0xff9d8a14,0x00019c60,0x00499ace,0x008eb3b2,0x00397bb6,0xff7f99be,0xffa73177,0xfecd44b4,0xfeecf51e,0xff15fca9,0x00052ec4,0x000f9e1a,0x00372d4a,0x0028d5bf,0x001c45c6, -0xffe40174,0x0002b36e,0xff4664af,0xff175d0d,0xfec07090,0xfdfe98e4,0xfd70ceac,0xfcceb488,0xfde992c4,0xfe66bf26,0xffc21cb7,0x00ca7c09,0x00993379,0x0095e745,0xffacd09b,0xff87ab21,0xffef94e1,0x000e8937,0x000f9b18,0xff9c8dd8,0xff955b56,0xff967b60,0xff725d58,0xff98bb03,0xff2b558c, -0xff899d83,0xff2a881e,0xfe2c1992,0xfc7788f0,0xfc36a9dc,0xfc4bb838,0xfbf75650,0xfafa51d0,0xfa217648,0xfa61f7e0,0xfbcef9b0,0xfd2f8f5c,0xfe1da222,0xfc395ca8,0xfb666538,0xfb9ab300,0xfcb3ad94,0xfe34c186,0xff7efcf4,0xff86f829,0xff329a7a,0xff693a73,0x00020110,0xffec11cb,0xffe32749, -0xffb242b0,0xffd5d778,0xffe215fa,0xffbc2541,0xffcf05f1,0xffcf576a,0x00020355,0xffdfa03b,0xffd17ffc,0xffb72f78,0xff625f5d,0xff6e5eb2,0xfeb40db4,0x03c52850,0x036ef7ac,0x00bec36c,0xfe22875e,0xfacf76f0,0xf9cd4040,0xfaebc308,0xfe0becf0,0xfe4d813a,0xfe9345c2,0xfeecd266,0xfea27e88, -0xfe8636de,0xfe75d2d8,0xfe43b91c,0xfe27b82c,0xfe757a40,0xfed2ccee,0xff3a7af0,0xff8d38af,0x00edffcd,0x0084e88c,0xffff1b34,0x0007809a,0xffeb7c19,0xffda518c,0xfffac7b6,0x000ec29f,0xffe330af,0x0009643e,0x002f053e,0xffe5f54e,0x00e4b599,0x0144295a,0x0279059c,0x02cb88d4,0x0255b678, -0x00ac223f,0xfeffe182,0xff9d754d,0x0011e657,0xff5cafda,0xfe4335e6,0xfd2c0980,0xfcdd1fe0,0xfca1a448,0xfc19b004,0xfd7d11d4,0xfdeecb58,0xfd78dfb8,0xfe9490c6,0xfedaf4a6,0xfecdfe34,0xfedbb44e,0xfeb2f242,0xfeeaf0c4,0xfffeb90f,0xffc3eb07,0x00255785,0xfffb403d,0x000809f0,0x00680554, -0x0048409e,0x002c20f9,0x00566339,0x007a146d,0x00c99002,0x00ecd5c6,0x0100e880,0x0120256a,0x01803468,0x0105774a,0x01ff33fe,0x002a758c,0xff16db9c,0xff5cfb12,0xff3ddd53,0xff7ad893,0xffc0ffbd,0xffb0f33d,0x00e0a98c,0x01468176,0x01020e84,0x0063648c,0xffbdb60e,0xff1f9ac6,0xfeaaef16, -0xfe8b2416,0xfeac6ab0,0xfee40680,0xff49cb62,0x000868fc,0x003feace,0x0067792e,0x00de2f5a,0x009aa402,0x007a6ee3,0x004d5aa0,0x002b8bf5,0x004910b1,0x0052833e,0x0066eeec,0x0064d0ab,0x00425046,0x006ab6f1,0x0052e72a,0x00829e2f,0x005f1f66,0x009e0969,0x004dbfed,0xffdf4af3,0xffdb8afd, -0xff8ea740,0xff8ead88,0xff71dd01,0xff3d0984,0xff8b1919,0xffd444bf,0x0052ecb2,0x00899288,0x00c8d8bb,0x010825b2,0x00e82bab,0x00d21868,0x00a89577,0x008986e0,0x003bef98,0x00413966,0x009b37d0,0x0096a492,0x008d9052,0x0087bc68,0x00b882b8,0x0098bda1,0x00e6bca4,0x0096970d,0x00fb3910, -0x00a55e6b,0x00d7817c,0x00989c85,0x00b709e4,0x00e1684e,0x012acce2,0x00b83860,0x00ffd200,0xffd42591,0xffc447fd,0xffaac1cc,0xff8e5fd5,0xff735ad4,0xff607329,0xff4c779d,0xff995274,0xffcfd98c,0xfffc3237,0x0028fe61,0x00572514,0x008a64c9,0x00940412,0x00a51c1d,0x00b6dc43,0x00cefff8, -0x00f4a238,0x00e4b32b,0x0122fc5a,0x00924ec1,0x006edeb6,0x008e8a99,0x006f0c26,0x0009a397,0xffe82de3,0xffe28fa4,0x0020a373,0xffd2c359,0xffc9af12,0x000080e6,0xfff5913d,0x00387b54,0x0022157a,0xffd59390,0x0004b999,0xff71cb5c,0xffa6ed53,0xff91cf78,0xff8ef074,0xff84f67d,0xff7a8e99, -0xff5f59ad,0xff788d5a,0xff892656,0xff9eb38e,0xffb7890a,0xffcd3568,0xffe7346c,0xffe8959b,0xffef8dec,0xfff62c3f,0xfff5471a,0x00005ede,0xffef2375,0x00433f09,0x00d5f14d,0x01a999e8,0xffee3b7f,0x00b4dacb,0x01b04194,0x01ade206,0x019b12f8,0x0174e512,0x018035cc,0x017467fe,0x015f9cc6, -0x009dfe3b,0xffc37339,0x0177d1c8,0x00b82172,0xff7c0b49,0x0102262c,0xffc9e9e2,0x016aede4,0x00d20a4b,0x00e6915a,0x00cb5bfb,0x00e4df91,0x00f35cff,0x010d8474,0x00fd2b01,0x010081fa,0x010891e2,0x01132328,0x0111afb0,0x00fe804c,0x01092272,0x0106d9aa,0x00ff98c4,0x01030070,0x00e0e88a, -0x015b4942,0xffbf2f4f,0xfec9cd44,0xfdfcd3cc,0x003a58d9,0xfee3d000,0xfdfdaca4,0xfdeb58cc,0xfdec6098,0xfe23390c,0xfdfc5524,0xfdfe5f94,0xfe0d1bea,0xfef59cca,0x0069890f,0xfdf59aa8,0xfea6c232,0xfeafd5c2,0x011ec2de,0x00f0b5dd,0x00c42fa5,0x00a9f6e4,0x00e17015,0x010bc908,0x0150455a, -0x012b5f46,0x0132f8ea,0x013f190c,0x015e249a,0x0163174e,0x012f83c0,0x01516f92,0x01471c06,0x01366dec,0x0115cb8c,0x01246d62,0x00db0c18,0xfebb3274,0x006ee4cd,0x004ad62e,0x004210dc,0x0004f0d0,0x0044bac9,0x00628b0f,0x005182b3,0xffd1cfc1,0x008ef8a5,0x00cf75e7,0x0043a2ae,0x00897ada, -0xffebcfe5,0xffab55bd,0x00ca3194,0xffdaa5d2,0x00b4baef,0x010e8436,0x00a9e40b,0x006caae6,0x009efbf7,0x00edf1db,0x01863b14,0x012691fe,0x014daaec,0x0173b022,0x01bbf4ea,0x01b78ac0,0x013252ee,0x0183f84e,0x01710ee0,0x015bf764,0x012bb8ca,0x016f43dc,0x0063c900,0xffc8d2c2,0x0039dd4e, -0x007d24e5,0x00aa311f,0x00129967,0x0038e26e,0xff995bfd,0x0069bbba,0xff72dab6,0x007736cd,0x0009da74,0x002d57be,0x005204fa,0x004e9f68,0xff679c2c,0x003ceba0,0x001664dc,0x00c8caad,0x00cdbf76,0x005b1db2,0x00319c38,0x0086d104,0x0107d8f0,0x01eba942,0x016c837a,0x0188ab62,0x01a3aaa4, -0x021852e8,0x02301e54,0x0168eef8,0x01f69566,0x01ecc4c2,0x01af8010,0x015120f4,0x015f8492,0x0073b8c2,0xff9e0049,0x0103870e,0x00687e1b,0x013470aa,0x010b5f74,0x00867780,0x002e25d2,0xffbff159,0xfff336bc,0x003e3360,0x00ce5efe,0x00836796,0x00e72ec7,0x00759c10,0xff8ab372,0x009271a5, -0xfd5a02b4,0xff997d3d,0x01afc04a,0x016bc8d8,0x00ac10b9,0x007d609b,0x007d9c64,0x011854b6,0x00ec32a0,0x01a140bc,0x0300c120,0x025c090c,0x01b7ef20,0x00cf8da3,0x0058426a,0x0050725e,0x015a38b0,0x014e3036,0x01fca580,0x0113fc70,0xffbbeee5,0x0105bdce,0x008dee34,0x00e61534,0x00a364b4, -0x00428ee4,0x00172984,0xffdd70f1,0xffdf438b,0xff8c4e4c,0xffad1777,0xffee23b6,0x00514b46,0x0026c5bf,0x000dc1a9,0xfe83bd70,0x00260bca,0x00ec0848,0x00833b15,0xfface98e,0xfffc1a1b,0x00592171,0x005c11fd,0x00011b9d,0x00660d72,0x005cf496,0x0074798c,0xff5fe9f1,0xff297a0c,0xff98265f, -0x001f056b,0x00ab3a7e,0x0137be2a,0x0096fd27,0x00cd5e79,0x0024035a,0x00060de8,0x0063e5ff,0x002db099,0x003f67fe,0x002937c9,0x000743c6,0x002735da,0x001726cb,0xffaadc9f,0xffc73231,0xffae3d85,0xffe1a49d,0xff5911db,0xff818c50,0xff7bb636,0x00b8c0fb,0xfd45b494,0xfd0a7ce0,0xfe48fbac, -0xff754e04,0x0159eaee,0x0159167a,0x01510658,0x0160e07a,0x01c91c7c,0x01d9de06,0x01f11552,0x01cfcb24,0x0194fc22,0x01234fd6,0x00df903c,0x0050ea45,0xffbebcc1,0xffb37148,0x00787334,0x007032c3,0x00a30e9f,0x00a0d6b2,0xff80f2f6,0xffd94f26,0x000dcb4b,0xfff13fe2,0x000eb78b,0x0026398d, -0xfff9a94c,0x002c3b5e,0xfff7c302,0xffba5054,0xffab4266,0xff9cfe79,0xfebe4738,0xfe4caea2,0x02fb4ea8,0x01de9b0e,0x019521b4,0x009be4c3,0x0107cf1c,0xffff2ddc,0xffb6f662,0xfff8d231,0xfec372ba,0xfe4ad43a,0xfe807e88,0xff1753d5,0xff49063f,0xfee76502,0xffb60b0a,0x003ea76b,0x00dbbd06, -0x00cd0bfb,0x00c5eb7e,0xffed27c6,0x0026369b,0x008bb4ef,0xffdb3d11,0xfffec06e,0xfff4f749,0xffd97b77,0x000c24cf,0x0009a162,0xffea9f91,0x000ece42,0x00456fa7,0x004c942f,0x00ae97f2,0x017060b4,0x022cccec,0x02d247dc,0x005cd169,0x01ec811e,0x0491b568,0x0494cee0,0x04b22e78,0x03839a40, -0x0210ef3c,0x003013b6,0xff5c1155,0xff24d3ea,0xff07fd9c,0xffdf9727,0xffdf6826,0xfefe5982,0xff2b1add,0xfee7e712,0xfeb8d198,0xfe9d5c56,0xff208936,0xff7bcc5b,0xff9c976e,0x00412492,0x001900fb,0x001decea,0x0044aef1,0x00a3042a,0x0035c6c4,0x003a528c,0x00243ee9,0x00a417e3,0x00bb676a, -0x00c7929f,0x00df73e3,0x00f055e2,0x00bf6b03,0x014300aa,0xff555113,0x008dfbb8,0x01777a78,0x01524876,0x01d3ce98,0x02778cd4,0x030cf210,0x03595d70,0x02541b24,0x016fe6a8,0x00944d18,0x004e0203,0xffee0f98,0xff810a34,0xff32859a,0xff6d37e2,0x0020b677,0x002fe575,0x0020fe71,0xffcc98ea, -0x0025cfb9,0x00715ed2,0x005a1302,0x0093c2a2,0x00916201,0x00776940,0x0089daf0,0x0092d3ec,0x00d62f20,0x00dd6507,0x00c8d7b4,0x00a579b1,0x00945d3f,0x009e4a39,0x005f423e,0x00a2b417,0x00a2790c,0x01159e0e,0x0162f25a,0x012e1c98,0x012b9a6e,0x0137b282,0x014bd648,0x018b8962,0x018a9da4, -0x01b7b188,0x01ddf1e4,0x01cbd47a,0x01b49dfc,0x019c686a,0x018906e4,0x015f7f3c,0x0141ddbc,0x0125ff8e,0x0166e880,0x011a1ca0,0x007daa21,0x00988cf1,0x00a03d7d,0x00aa41f5,0x008e9e4a,0x00aa66da,0x00877c93,0x00d8ddb9,0x007bc797,0x00a7c6cb,0x0063ce20,0x007a31e0,0x0084432e,0x00835a3d, -0x006b0c54,0x00b0b3ae,0xff78c42f,0x008a9dd5,0x00a7356e,0x00b4fd2b,0x00d868b4,0x00fc946c,0x01208e0a,0x0138fa5e,0x0132b946,0x012136a8,0x0113ceb6,0x01029494,0x00f4f8f3,0x00de2bb4,0x00f3ea82,0x01084b82,0x0118e502,0x012af356,0x012b9086,0x0156db92,0x00c6b02f,0x01243e92,0x00f3ef4d, -0x00b3d7da,0x00812c1c,0x009c2a23,0x00acb81d,0x0089c312,0x0043c4a7,0x008f5061,0x00a4f4ca,0x005b5c38,0x006ff78c,0x002905c6,0x00339875,0x008f5011,0x000189e8,0x00e0c691,0x00ae4f85,0x00c56980,0x00cd2e69,0x00cfd5c7,0x00d367d0,0x00df0efa,0x00d8f3eb,0x00d947cb,0x00d805b9,0x00da7ef6, -0x00dd2ae2,0x00dc7fc2,0x00dbc7b9,0x00d857a0,0x00d6c9f9,0x00d68288,0x00c97970,0x00f4362c,0x00498d86,0xffadcdb9,0xff2ee4ec,0x005f45c9,0xff923e66,0xfef1d51a,0xfeef3cd8,0xfefe52c2,0xff1e6314,0xff039835,0xff054855,0xff15d662,0xff8130be,0x004d7f1a,0xff100ca0,0xff6385ff,0x00c706f4, -0xffbb9bb7,0x00ff19d9,0xff4823db,0xffcbb029,0xffc60179,0xffdefe39,0xffcc7813,0xffc0de2a,0xffb688f2,0xffa7f6fe,0xffa4ab61,0xff9ea106,0xffbecfef,0xffc5560f,0xffbc8856,0xffae1fe4,0xffa73d6b,0xffa2ce2a,0xffacf43d,0xffc172a3,0xff5880a6,0x01041922,0x01a07170,0x018a956e,0x00bc5e1e, -0x0194894c,0x016e4448,0x0189a18a,0x018954da,0x0153a10c,0x01a73a8c,0x01b4e552,0x019d7dfa,0x0190ca48,0x008f3306,0x016164e4,0x01b741f2,0x01b6fade,0xffc2f1d4,0xffb9a845,0xffffb942,0x00247d20,0x0020398c,0x000a4531,0xffe4ce9f,0xffa07b0a,0xff855a99,0xff79a839,0xffbbff52,0xffc5f96a, -0xffa7bf90,0xff833b0a,0xff7a4861,0xff751974,0xffa51900,0xff831ad1,0xffd379a6,0x015f4118,0x0048bbfd,0x00bafd69,0x0093635f,0x00a812c0,0x0043bb79,0x00138da4,0x0035064d,0x0093cf13,0x00407980,0x000c1860,0x00574c95,0x0058a2fe,0x00af8a90,0x008a0f65,0x00114451,0x00dd416d,0xffb7b609, -0xff73a607,0x0000ecdd,0x00254ec9,0x004bf0b8,0x0021239c,0xffbc10c2,0xff574fbe,0xff3f839b,0xff1cc574,0xffca7b50,0xffe8b1d6,0xffb4e7c7,0xff5f2503,0xff3f16d0,0xff2b6d31,0xff7f79af,0xff42317f,0x0004d14b,0x00d6bdd7,0x00a0e83b,0x00c33522,0x009abe9b,0x00db2075,0x00014a19,0x005d8573, -0xff94e0ca,0x005888e7,0x000d4e0b,0x00bc9b39,0x00478fe9,0x00ae7a2c,0x00a627a8,0x00409aac,0x006cf51b,0x01258cf0,0xffd49ab2,0xffa6bb67,0x004de905,0x009e26de,0x014a2766,0x0125a19c,0x0075a99b,0xffa11896,0xff1e9739,0xfec3a61a,0xffa9f3bb,0xffe9544e,0xff837056,0xff223cd9,0xfef6f572, -0xfee0f018,0xff56c967,0xff1330f8,0xffc05fee,0x00c7be96,0x000e31b6,0x010c1d16,0x00aafe0c,0x0082de6d,0xfffb7700,0xffe4302b,0xffc8c23a,0xff7c3801,0x00493481,0x007ae993,0x004902f6,0x0098e64b,0x0075fc49,0xff7ea3d7,0x00503cac,0xffbd16f5,0xff0ea8f2,0xfeca3762,0xff591c39,0xfed79afa, -0xfe3defb4,0xfdfd62b4,0xfe2faa86,0xfda38c70,0xfe3133a2,0xff75879f,0xff1678ef,0xff2f43b3,0xff44423f,0xfefce43e,0xff002643,0xfe92a884,0xff17abcb,0xff1b36ae,0x00b646ce,0x015870fe,0x003eb2a2,0x00d686b6,0x00b537f5,0x00afbd39,0x003cfe23,0x000c2805,0xffdba084,0xffbe1596,0xff970c79, -0xffbace95,0x0034f161,0x00603ea9,0x00e4f037,0x01303338,0x000c7ee5,0x01234d60,0xff66b5dd,0xfe2a21aa,0xff1b98fa,0x00555aea,0x01402960,0x0182ee94,0x010569d4,0x008ac1e0,0x00382759,0x0076ac2b,0x0028c26e,0xfff736c0,0xffb6b6d4,0xff7c7dad,0xff5610fd,0xfee80444,0xff80ec28,0xff6b2d23, -0x00409f1a,0x00d9be6b,0x008fa2d4,0x0033ff42,0xffb90e4a,0xffb902cf,0xffe112fd,0x0006c7da,0x0005c11c,0xffab9583,0xffb1bab5,0xffab1558,0xff8391b0,0xff35b991,0xfed3557c,0xff6ac5e6,0x00067494,0xfdf9c564,0xfdd56b24,0xffd9a93d,0x008e4c49,0x000119a3,0xff7edaf9,0xfe6f06f0,0xfd99be68, -0xfd3f0960,0xfd880344,0xfe41eaa2,0xfe31f41e,0xfe4ecec4,0xfe3c1c98,0xfe3da0aa,0xfe96189c,0xff24aec9,0xff6a7f87,0xff2d1217,0xffd86257,0x00bd7f18,0x0044ab5f,0xffb012e6,0x00083960,0x003bdcab,0xfffc7336,0x0003d12c,0xfff9a296,0xffe97d5f,0x001d03eb,0xfff68752,0xfff4ca50,0x003b925f, -0xff9dc269,0xff4ba366,0xfe64216e,0x02a7ecec,0x015f7cbc,0x001d932e,0xff406c96,0xfd4512ec,0xfe7e4948,0xff05794e,0xfe6d1250,0xffd111f4,0x00137749,0x00083e6d,0x000093f8,0xffbdc915,0xff20193a,0xff61dcd0,0xff59cfbc,0xff599428,0xff3b65bb,0xff4709b1,0xffb381b2,0x00f75acb,0x009d2038, -0xffa0e6ef,0xffe9e8b8,0xffdef821,0xffc2be31,0xffdbaf55,0x000a6d83,0xffe1ea3c,0xfff7c433,0x000e8d31,0xffc1c847,0x005e912b,0x00cba5df,0x01eb9420,0x0231b654,0x03336828,0x03bce104,0x03749da0,0x035e627c,0x022f29d4,0x012cb6d4,0xff769c9d,0xfd9990e4,0xfe39cba4,0xfecc0e78,0xffaa6f44, -0x003c5ef7,0x0034992d,0xffa8b1a0,0xff57f446,0xff0eef59,0xfebb39ba,0xff147d5c,0xff419dea,0xff598cf0,0x001cfc0e,0xffe71431,0xffe81eaf,0x0029f1f1,0x00403221,0x0087846c,0x003936e0,0xfff4fd7f,0x003818fc,0x0079c653,0x00e62ad2,0x0138efe2,0x015e3e68,0x0186d89e,0x01a95722,0x025b753c, -0x01ae4862,0x015a823c,0x00e88912,0x015295b4,0x01646f04,0x01b2d7d2,0x019c5b5a,0x011c96c0,0x00d4725c,0x0029b615,0xff71feb8,0xfeea076a,0xfec22114,0xfed6b2d6,0xfedc3660,0xff0251f9,0xff64239d,0xff5b1e91,0xff79a045,0xffe08551,0x00408876,0x0073840a,0x00bf8727,0x0079985e,0x004e8456, -0x005d8166,0x00834d05,0x00b5567f,0x00890c15,0x00c32484,0x00cc524b,0x00b9a09e,0x00ba8294,0x00c9de56,0x00e06c94,0x0119b03c,0x0139ad8c,0x00cf6977,0x0088d0ce,0x00b919c8,0x00970728,0x00bc1204,0x00ce2838,0x00eab72f,0x011587dc,0x0152eb46,0x01a2b934,0x01854f12,0x01610ab4,0x0148d886, -0x01207668,0x00f9fa12,0x00cdfe4f,0x00d7c86a,0x00b0de6b,0x00fc3292,0x012cbf52,0x00d30c93,0x009cd540,0x008cb035,0x00b0ad56,0x00721beb,0x00b3cc81,0x00646cfd,0x00d61630,0x007129f1,0x00a1d24a,0x00711eb0,0x00b72bde,0x0103cea0,0x0157a0fe,0x011568fc,0x00e82652,0x008606b1,0x0067e5d3, -0x006992f8,0x005ae7a2,0x004efa6e,0x00408905,0x00358c07,0x0038a50d,0x0032dbba,0x00347702,0x00449482,0x0067e0fd,0x00962ff6,0x0093aeec,0x0095fb55,0x0087825a,0x008ca570,0x0072b1b4,0x00704791,0x012c4806,0x00b8c027,0x00dc34e6,0x00ca4c82,0x00e8e3fe,0x00c58737,0x00a05ced,0x00b4708c, -0x00df2463,0x009088f7,0x007493f6,0x008734a1,0x007cf697,0x0091ddbd,0x009d7687,0x006b795d,0x00d7568b,0x003800a4,0x0054171d,0x004e67c2,0x004aa91a,0x0047c9da,0x00432c06,0x0038be84,0x0041a282,0x004b750f,0x00543a97,0x005f452a,0x0063f2fc,0x006db122,0x005f1be0,0x0058b4f3,0x0054f984, -0x004a8237,0x004f13a2,0x0014162a,0x00cdc2d5,0x01257f6a,0x011725a4,0x00bf4ccf,0x013560de,0x011a7806,0x0121dbca,0x01158582,0x00f212e5,0x010da00c,0x01072cf2,0x00fab787,0x011920fa,0x00b923b5,0x00d76668,0x011dacdc,0x0055e1bb,0xfff65cd9,0xfef0b8dc,0x002843c5,0xfff0f474,0xffedef30, -0xfff40847,0xffd67658,0xffd10044,0xffe74bf0,0xffd69c0b,0xffd844aa,0xffd6d7b4,0xfff2673d,0xfff92902,0xfff73210,0xfff49ae7,0xfff3e0c2,0xfff34633,0xfff45c89,0xfff69271,0x002ff8e6,0xfef95eec,0xfee6d11c,0xffdd31d9,0xff2996b4,0xfedad97c,0xffa9c255,0xff8c5446,0xff86aea7,0xffa41b46, -0xff774f4f,0xff720d33,0xff6dcc37,0xfee2d2ba,0xff3bced3,0xffa57b4c,0xfec4c49a,0xff2d573a,0xffc38c1e,0x000f3950,0xffd5e147,0xffe468f2,0xff8dd2e5,0xff7acaa1,0xffbee53d,0xff906587,0xff97cfda,0xff9c18b3,0xffe77e66,0x000912ec,0x0002f60f,0xffece09f,0xffd68078,0xffd97668,0xffc9367c, -0x0005c995,0xffb7c235,0xff4b1efe,0xffe4cc0c,0xffad17f4,0xffd946d7,0xffb662c0,0xff90da62,0xffad5afc,0xff75957d,0xff46380b,0xffb2b3bc,0xfffcd489,0xffbf8f40,0xffd9bd01,0xffa8cf35,0xff54d213,0xffddacb2,0xff2b99a4,0xff9d49d7,0x001d8989,0xffba2afb,0x0004ca33,0xff412fea,0xff02b33e, -0xff861997,0xff16f316,0xff2bb002,0xff32eff7,0xffc555e2,0xfff887d6,0xffdfae7e,0xffd43a20,0xffbd889c,0xffc23505,0xffc3ead2,0x001d753e,0xffab5c1b,0xff6cefd8,0xffeb7707,0x0040e920,0x00248628,0xffc8c775,0xffcaab9c,0xff8eee60,0x00004824,0xff623e6b,0x003aa758,0xffe16521,0xffd7034c, -0x00098b00,0xfffcb157,0xff3d9c14,0xff99fac9,0xfff2bf77,0x00034fc2,0x005cd8c7,0xffd9b692,0x0012fd31,0xfef88154,0xfe7c979e,0xff53b4c7,0xfeb48b0a,0xfeb9bb32,0xfed03200,0xff9501ea,0x000241b7,0xfffbba6c,0xffac6b0a,0xff73e947,0xff73c5b9,0xff72a2b5,0x0005f1ab,0xffac675e,0xffa1056a, -0x00a5d9f4,0x007b1ac4,0x00bc9c30,0x00b1af49,0x004b5fee,0xffffc535,0xffc1ec50,0xffe9ce83,0x00456ce9,0x00b04d81,0x0066d5e2,0x00a801fc,0x00177ebf,0xff93b644,0x0041d4db,0xfca5af9c,0xfe758fd2,0xffaa4b22,0xffa57da7,0xff3dd584,0xfec1472c,0xfe8503fa,0xfed81a5c,0xfe79143a,0xff208c80, -0x00cb491e,0x00e637f0,0x00f1373d,0x00c8a4a7,0xffe4b3b2,0xffb9bcc9,0x00c55121,0x00662a00,0x007bf97a,0xffc71fa9,0xff8dfdea,0x0096b368,0x00be12df,0x0092d6f4,0x00452c93,0x0014e7ef,0x001aeedc,0xffeb87b5,0xffc276ea,0xff80fa4b,0xffa542de,0xffdc8b51,0x00187462,0x001796ca,0x00695e54, -0xfdb77f10,0xffd00b71,0xffc5dc1a,0x0052c4b2,0xff8f8544,0xff6cddce,0xff298736,0xff0e67d6,0xfee0ac80,0xff85faf1,0xffffd2f8,0x003dbfab,0xffe2c088,0xffa136e9,0xfee037d8,0xff3a3217,0xff26fd04,0xfecbdd4a,0xfed9f212,0xff8f995e,0xffa6408a,0x00283851,0x00327900,0xff7e61fa,0xffe682f4, -0xfff7e645,0xffe1e47c,0x0005cc7f,0xfffb8afc,0xffaa8650,0xffc62e83,0xff90cb78,0xff71ced1,0xfedabdc2,0xfec0f8de,0xfeae9106,0x0016dbf5,0xfe321fd2,0xfeb62f56,0x004b25d9,0x00137e9f,0xfe1f0c20,0xfdaabf0c,0xfd43da34,0xfd1a66e8,0xfed82308,0xff5e4752,0xfef3e6b8,0xff6ab44b,0xff564cb6, -0xfe9b10c6,0xfed47ffc,0xfef0b132,0xff39a736,0xff67a733,0x0002c491,0xff9a9286,0x00089f30,0x00531c41,0xff34be2e,0xffc27109,0x00256dfe,0xfffb5049,0x000ca982,0x000b5ae2,0xfff586e2,0x000a8fb2,0xffd2e688,0xffcc3b77,0xffd7a2a3,0xffa4369f,0xfeade9b8,0xfe8f0ae4,0x0170be70,0xff90abde, -0xfcef64a4,0xfb45e670,0xfa4961e0,0xfcc34590,0xfdf5840c,0xfe3ad004,0xfe8a8816,0xfe9853d8,0xfe775dec,0xfe925238,0xfe99797c,0xfe917eec,0xfee29dc2,0xff0679fd,0xff5887ce,0xff2cc29b,0xffaa646a,0xffbf885a,0x002b62ca,0x00560b4e,0xff8f1b6d,0xffb8fdec,0xffb0fdfd,0xff9c8c57,0xffedcf16, -0xffdb0357,0xffbef91e,0xffe366ab,0xfffc9001,0xffc9df14,0x00005ee3,0x0061ab47,0x015595f6,0x01b787a0,0x01b241e2,0x01952aee,0x01430608,0x00b7ffa5,0xfff12c01,0xfe8641ea,0xfd68a0c0,0xfcc7f0a8,0xfd86225c,0xfe023dc8,0xfe2bd52e,0xfe9f5138,0xff0bb175,0xff511a1d,0xff12bd52,0xff005d6d, -0xff42a0d0,0xff2ffe8c,0xff6b1824,0xff5293b8,0xff44c1a8,0xffa22432,0xffce0baf,0x0017fff8,0x003a6d95,0x00586cc8,0x001411f8,0xfffeeeb3,0xffdaa542,0x004b70b4,0x007f3e5c,0x00bcc6e1,0x0122b3c8,0x0143c768,0x013e6f10,0x01349a74,0x005591cf,0x000ca3de,0x00cb0b6b,0x0136ef44,0x01f75f4e, -0x027f52fc,0x02815c78,0x01b221ba,0x00d7382b,0xfff30752,0xff4a10a1,0xfe654bd8,0xfdf05870,0xfdf97500,0xfe49e720,0xfea15be8,0xff356f9e,0xff6e5e17,0xffb9c7e1,0xffdf7673,0x0028ae14,0x003895ef,0xffd4517e,0xffdcd521,0x0002ebbb,0x003144f6,0x00863b73,0x00b06882,0x00d7bdc3,0x00cce68f, -0x00c554ca,0x00b45cf3,0x00b7433d,0x00993ead,0x007a55c9,0x0063ab76,0x0044295a,0x00b536f4,0x010974c6,0x00e00fc7,0x00e20dff,0x00d9c4fc,0x00f11451,0x012b96e8,0x012f2562,0x0144ae40,0x0167a97c,0x015d8e68,0x014f4d6a,0x012b9b3c,0x0110b8e2,0x00ee5af4,0x00d83635,0x00c528ce,0x00d178fd, -0x009fcd34,0x006c4fce,0x00733edf,0x00771d86,0x007cd753,0x007122fe,0x006b7fd5,0x005b92c8,0x006a0e91,0x0025f290,0x0053699d,0x002ab17a,0x0032b4b0,0x003e9b58,0x004228ec,0x00462869,0x005e6f3e,0x003b81ba,0x006bc29c,0x0088da2f,0x00874fd1,0x00a3b8f2,0x00b869fe,0x00c89a7b,0x00cc68d3, -0x00d1a1ce,0x00d7728c,0x00daca28,0x00e09ea7,0x00e5e122,0x00ebb5ca,0x00dc8c0a,0x00d00c08,0x00c0516a,0x00ac000c,0x00a1c325,0x0083d6d3,0x00556adc,0x007a1953,0x004bc8cc,0x00572164,0x003ec448,0x004277ad,0x005aee87,0x003ce155,0x002db5fa,0x005df322,0x008d3414,0x0070af21,0x007960cf, -0x00614bd7,0x0053ee06,0x008393d0,0xfff83ba5,0x00b0b254,0x00a0a05b,0x00a5e6c8,0x00a8aed6,0x00a73aea,0x00a8f165,0x00acc315,0x00b87395,0x00c1397d,0x00c8d72c,0x00d11cbc,0x00d86daf,0x00e37a5c,0x00d39742,0x00c7eaef,0x00be808a,0x00b22407,0x00a671c4,0x00b2a39b,0x00012539,0xffd22b8d, -0x0031b273,0x000f62cc,0xffc49785,0x002ab07d,0x001fcc17,0x0022955c,0x0030c7a8,0x00135321,0x000c487b,0x00119951,0xffd6dd06,0x001a81cf,0x003733fb,0xffd481e4,0x00b445b2,0x00b35a32,0x012f5f28,0x008130e0,0x00928495,0x00ab908f,0x00ae7e83,0x00d05b0e,0x00d529a0,0x00c79714,0x00bbbad2, -0x00b0dc9c,0x0096bea4,0x00b2490d,0x00baaacf,0x00c9dcce,0x00b3a34e,0x00ae83ed,0x00ae5154,0x00b246e2,0x00a1ca75,0x00a0448a,0x013c3940,0x00e37589,0xff89f7b3,0x0142ed98,0x00eb54fe,0xff8c69f8,0xffa6899f,0xffae41c7,0xffaad39f,0xffd78ca2,0xffe1a019,0xffdde85c,0x00f37b38,0x01420066, -0xff7e5c54,0x00dc063a,0x009594f1,0x00c32957,0x00799701,0x00ba2d42,0x00c5ef5d,0x01377ce8,0x0157988a,0x01301696,0x01043a9a,0x00d1a016,0x0095d95f,0x00c2fdcd,0x00df6784,0x010d9d80,0x00dd5c6d,0x00d74aa8,0x00debf26,0x00e867aa,0x00bbf6b1,0x00f31ebb,0x0074fd35,0x00be6823,0x01148920, -0x00aba085,0x0099a9e1,0x00bb7288,0x009a3c31,0x00d02ed9,0x00db5970,0x00df8045,0x00b3c9a4,0x00991d4f,0x00b90a4e,0x009d320b,0x00aa48a0,0x00d754bc,0x00df6a9c,0x00717a62,0x00649b66,0x00d21b23,0x00d640af,0x01a04f14,0x01e9f538,0x0182004a,0x01476074,0x00fa7eef,0x0083f3ba,0x010566b4, -0x01305540,0x018ca8b6,0x01154ffa,0x00fadb19,0x00ffa01a,0x00f7870f,0x00d350b8,0x00bf3f9b,0x00eb9d02,0x00e0a389,0x00f8349c,0x00cff75a,0x009df76f,0x00620e7d,0x0034cf7c,0x00273ebd,0x006e9db7,0x0053c4b8,0x008dc807,0x005c5007,0x009c4596,0x00aa596a,0x00466fd8,0x00b17e6d,0x013c0ca2, -0x006f5766,0x0035e6f2,0x00c4dd71,0x00ceb64f,0x0243f244,0x02cfc994,0x0262b00c,0x01ec4868,0x013279be,0x0050fba7,0x00e0a936,0x01719ad4,0x021826a4,0x017fe2cc,0x0152abe0,0x01576232,0x014f88de,0x00e34394,0x00c474e6,0x00a72e23,0x009a4136,0x00ffcb1b,0x00d6d306,0x009a5030,0x0023cea3, -0xfff298fb,0xffb88cc8,0xffb4cb8b,0x005d1100,0x008672a0,0x0036abbb,0x00976810,0x008970a4,0xffe5ac6f,0x00ffa741,0xff3a733d,0x00c093a2,0x00d6794e,0x012df00c,0x00b427e4,0x011684e0,0x010bb410,0x010bd532,0xff87d7f1,0xff7f2b88,0x0118c722,0x00b9a8b6,0x0075cf11,0x0015c739,0x00237b45, -0x00333f1d,0x000dda08,0x0097a20a,0x00d368c4,0x013785a4,0x00f2f290,0x00c2c1b3,0x0145488e,0x00b87383,0x0071ee7d,0x000c08cc,0x00274dad,0x00045546,0xffba3be4,0xffbeb295,0xffdb53b3,0x0035818e,0x006887b9,0x00c5bfa7,0x0140203e,0xff851cc7,0x0158b67e,0x004bb971,0xff8a6579,0xffbfd78f, -0xff2deab8,0x00bdf980,0x010e2cec,0x0017d747,0x007b344f,0x0061986f,0xfff9c763,0x0041be65,0x006cb0f5,0x001ebdfb,0x0078b507,0x00d7e11a,0x0159910a,0x012176f4,0x00d528fc,0x00a2da4a,0x009f7e64,0x007888ab,0xfff51446,0xfffe6c56,0x00160209,0xfffdac86,0x0004018f,0xfff21c9e,0xffc3d74d, -0xffd5d94c,0xffa557a5,0xff7c25e9,0xff2c17c7,0xff394db7,0xff758cee,0x00da7a90,0xfefefba0,0x0000fd76,0x0123ae32,0x020d76e8,0x03332438,0x03541674,0x02f6ff5c,0x0192c450,0x00665c6e,0xff9f40a2,0xffb8c268,0x00ffedaa,0x01878614,0x01233e96,0x00b34f13,0x00141325,0xff8e7a3e,0xff9be69c, -0xffb381ef,0x00401581,0x00d1d13a,0x008334c8,0xffc8307c,0x002c7bb1,0x005a9124,0x0008ba6a,0x000bfc42,0x00071054,0x00101d1f,0x000dbe60,0xffe03008,0x00006791,0x002cf573,0xffb42207,0xff5a255f,0xff001974,0x00a19b6b,0xff402107,0xfe5c4db8,0xff33ab70,0x00fff314,0x01ea6df2,0x01a18d62, -0xff729ea4,0x00621b92,0x009d22b0,0x00addc1d,0x0095cdac,0x0071c346,0x0020ca19,0x007a70a4,0x00973e04,0x0078ab45,0x004e297f,0x0025c6ef,0x004c418e,0x00708951,0x006c586a,0xffcc31a3,0xffd8f649,0xffd49dde,0xffbf1874,0xfff096a6,0xfffb4674,0xffbe699a,0xffd21940,0xffcf0781,0xff79cb86, -0xffbaa7fc,0x00272d66,0x00d5c986,0x00f0d8fc,0x02ef1214,0x050ad928,0x05dda918,0x04f5fd90,0x037dd9a0,0x01b7ceda,0x0078c6d1,0xffc65c91,0x0030d5aa,0x0081fbde,0x01373270,0x00b9e1c6,0x00ce8dae,0x0132f376,0x005b0d2f,0xffd618a4,0xffc45907,0xffb08029,0xffc3a060,0xffef627b,0x000ebdba, -0x000f1b34,0xffce1f2a,0x0018ad4b,0x0035bc77,0x005009e9,0x00257f6c,0x000cc560,0x003e6469,0x00828165,0x00dcf488,0x0146389a,0x01c154ea,0x01f45b7c,0x01bc1242,0x03159a3c,0x00ed7da4,0x020a8138,0x027ab848,0x02b05610,0x030c4a40,0x0326d964,0x02cd46d8,0x02225f88,0x0078380b,0xff42f097, -0xfea042c4,0xfe575cc2,0xfe878b16,0xff0a14cb,0xff6f31c4,0xffa1ae38,0xff819bec,0xff9ff524,0xffbdbf5a,0xffd95dff,0x00365843,0x005fc13d,0x005ee5a9,0x002f5ee6,0x0010cdc2,0x00388073,0x009ed5da,0x00dba3e5,0x00db720b,0x00ee8ef3,0x00f7f5e4,0x00ef79b8,0x0109ed3e,0x01499046,0x013101c6, -0x01aea136,0x0181aa7a,0x0190ae54,0x01b67ac8,0x01e93fac,0x0205e04c,0x022a8cd0,0x02596b18,0x02b8b414,0x02985120,0x02895c90,0x02642570,0x01f11558,0x016cdefc,0x00dd1414,0x00b68de8,0x0093d7a5,0x0068cba1,0x00926a9e,0x008f7930,0x00cdc29b,0x00ee167d,0x00a240af,0x0092c8c8,0x00981adc, -0x00936bcd,0x00921938,0x00737157,0x0082e66a,0x0084bb72,0x00795398,0x0076c475,0x008383f5,0x00af2392,0x00dcb80d,0x00f6af3c,0x01343ea4,0x00852402,0x013da08e,0x013fd1de,0x0165682c,0x0186698c,0x01ab1070,0x01c53938,0x01e48958,0x019d473e,0x0163e522,0x01372d22,0x011334a4,0x01048fac, -0x00fb04cf,0x00e7b0a7,0x00cda6ea,0x00aea902,0x0095e915,0x006492ef,0x006140c7,0x008e256f,0x00b794d6,0x00f7401a,0x00d03249,0x00f3c9d6,0x012795a8,0x0124bebe,0x0144129a,0x0134a560,0x0136f8ac,0x01273b52,0x010fc866,0x011479ec,0x00f05cba,0x01042740,0x011f02ce,0x01648322,0x01447386, -0x01385e2a,0x014ba8b2,0x014f241e,0x01581190,0x015f78bc,0x017441d4,0x0160d216,0x015957ee,0x014cf4b8,0x01431996,0x01346e28,0x0125ae78,0x011b367a,0x01135496,0x010b3bac,0x01027636,0x00fa4dfe,0x00dde90e,0x013733e6,0x011025ca,0x0040448e,0x015ecbf0,0x012d68ae,0x0040b328,0x0049b7fb, -0x004cc06e,0x00502e94,0x005f5c18,0x0065178a,0x006ce1e8,0x01270bda,0x017aa2e8,0x00399061,0x011628fa,0x015d346e,0xff3e0093,0xff3d7c27,0xff12382c,0xff5b6f63,0xff4652d7,0xff5b2ed8,0xff2d79dc,0xff1fcead,0xff224f35,0xff19d228,0xff1a667b,0xff19bf1d,0xff2c9615,0xff356185,0xff44eb7c, -0xff32c924,0xff31c8a9,0xff373b15,0xff3b1b86,0xff5ae883,0xff2e5b3a,0xff5931d2,0x000d4ff4,0x01962022,0xff2669e8,0xffe83dd6,0x0152887a,0x01417c8a,0x013af540,0x01301ac0,0x012a48ba,0x0125f356,0x0111c9b4,0xffe1bf0a,0xff0b9c0d,0x01552bf2,0xfffdda1d,0x005f9104,0xfee2e88a,0xff4a4ea0, -0xff3b4457,0xff649262,0xfef688a8,0xfeca27ea,0xfecca762,0xfea61e30,0xfe9f5d86,0xfea59e9a,0xfed37d3e,0xfef6342c,0xff20b92f,0xfeef4b7c,0xfee3dce2,0xfef164e0,0xff0802f8,0xff3a68c3,0xff291a33,0x0083fc16,0xffc16f7e,0xffb4a062,0xffe21868,0xffe54f37,0xff71d30d,0xff6bb22b,0xff41f46f, -0xff82a453,0xff63e2a1,0xff7c9481,0xffa7f38f,0xff9295e2,0xffdd90a8,0xffb00846,0xff57683b,0xff65e390,0xfeefece8,0xff3311bd,0xff442054,0xff986f3b,0xfebfe0e4,0xfe6632a4,0xfe584b38,0xfe1731a6,0xfe15cb4c,0xfe1868e4,0xfe82c662,0xfeb8d3d8,0xff033c55,0xfea6dd3a,0xfe9b588a,0xfeb4661e, -0xfef48d3c,0xff20ffa3,0xff8a089c,0xffeb4253,0x0015c0d9,0x00456cc5,0xfffe17ec,0x00075b58,0xffab9637,0xffdf7a92,0xffa318e9,0xffd8d708,0xfffc9373,0x000db76e,0xffcd334b,0x0001db9f,0xfff9f715,0xffc1dcb1,0xff7a5c18,0xfff248d1,0xfee54d34,0xff3b5e97,0xff75fe17,0xffef020e,0xfeb6b0e8, -0xfe13cafa,0xfdf217e4,0xfd85fe70,0xfd44f83c,0xfd43ef60,0xfdc6c148,0xfe4ae456,0xfec13564,0xfe228e2a,0xfdf9a5cc,0xfe22b7b0,0xfe8bd816,0xff1a687d,0xff7a34d1,0x004a506b,0x0041c41d,0x00c8fe4d,0x006e2185,0x005e1e34,0x001629bd,0xffd1052f,0xffc81698,0xffdb3c74,0x00468260,0x00679669, -0x002a1659,0x004deacd,0xfffe0417,0xffd2e1ea,0xffcc1ba2,0xfdcb0324,0xfe5a2e50,0xfe4e7486,0xfe53270e,0xfe711e60,0xfe183d2e,0xfdbfc4ec,0xfd881308,0xfd1a1fe8,0xfdd18cb8,0xffcc8bd6,0xffbb1e31,0xffdba435,0x0039cc3a,0xffcb2a46,0xffaf9d86,0xffa8a82e,0xff7e0683,0xff2575b9,0xff2a98e8, -0x001ca234,0x002d6fd6,0x00b6e9d4,0x00572185,0x0026639b,0xfffdf737,0x0011d2b6,0xfff8654d,0xffb505a2,0xffa1d5a1,0xffc5217b,0xffe60907,0x001968c0,0x0049c4df,0x009b500d,0xfe3512ce,0x0032b56d,0xff4d44b8,0xffa842f1,0xff3122d7,0xfe99df64,0xfeee79aa,0xff0f0523,0xfecf26b2,0xff148e37, -0xff178917,0xff19162e,0xff80479a,0xff9e457d,0xff441e40,0xfec94fcc,0xfe2e0bc2,0xfda69864,0xfe4c4866,0xfef8da7a,0xffc3cece,0x00687787,0x002ee878,0xff8f7249,0xffc3516a,0xffeae57b,0xfffd77f3,0x0006080b,0xffea3b4d,0xffbfba11,0xffbc0182,0xff914f70,0xff7c90e0,0xff32b03f,0xfed65c8c, -0xfef80048,0xffd9d395,0xff6d5ecc,0xffddb789,0x005da658,0xffce74d6,0xfd543a34,0xfca63014,0xfbf04110,0xfb669fa0,0xfcb43d38,0xfda2fa10,0xfe2a3796,0xfdc67770,0xfd539c3c,0xfd37c08c,0xfdac6f24,0xfe742aa2,0xff6cafff,0xff62e09d,0xff6d0c1f,0xff58725d,0xffb13d66,0xffe56c51,0xff814583, -0xffb5c161,0x000d71e2,0xfffeddd3,0xffe5e186,0xffe7a682,0x0003ca18,0xffeb9cfc,0xffaec1e9,0xffa791c5,0xffdc2c19,0xff95dd55,0xff64db2d,0xff28530e,0xff8bad8b,0xfdee0ccc,0xfa3f7498,0xf91bdd80,0xf8f9b640,0xfaef5d80,0xfcbb3a2c,0xfe6c61e6,0xfe994692,0xfec272b2,0xfedcca8e,0xfee5d8a2, -0xff12027e,0xff4cd55e,0xfed92f76,0xfe85c7e4,0xfe90ad60,0xfeb17f56,0xff49a6f7,0x000374c9,0x003485d5,0xffed6fee,0xff9f1337,0xffb37098,0xffb9b624,0xffba7928,0xfffd6a93,0xffdfeb91,0xffa0bae8,0xffaa6b96,0xff970eee,0xff1c8e18,0xff569242,0xff432c69,0x002340d6,0xfff70c0c,0x033ab0ec, -0x01eb9772,0xff80fa06,0xfe8bd368,0xfd6f09f8,0xfbc5f0a0,0xfb5a6c68,0xfc63b890,0xfd38e124,0xfd9d7e28,0xfd687450,0xfdaff8b0,0xfe1cab26,0xfeb4d524,0xff6403f8,0xffb5bbe7,0xffc8893c,0xffba2171,0xff881fff,0xff6cd343,0xffb9d657,0xffaf1779,0xffb1ba63,0xfff7bad3,0x00008778,0xffede6c2, -0xfff20224,0xfff115dd,0x00118343,0x002f2527,0x00861b82,0x00e2f7a9,0x01b01340,0x01f900d8,0x01fe9d80,0x01d98d5a,0x01c47c30,0x00775bf8,0x00549ee8,0x00ca03a3,0x0101c762,0x0116f60a,0x0070dc9e,0xfee030c8,0xfec9923a,0xfeb23336,0xfec14248,0xfe20ec4a,0xfde689c4,0xfe0e5b92,0xfe11cc9c, -0xfe4633b6,0xfe8ad21c,0xfed90f98,0xff4e4e54,0xfff38f28,0x002c498e,0x0016abf3,0xffddbd17,0xffb74aeb,0xffdad61b,0x0023ae0a,0x006f7eb6,0x00af5719,0x00cd1475,0x00c27245,0x00bd596f,0x009e49f1,0x00dda5d5,0x00cc06bb,0x00da03f3,0x00b1e708,0x00a88bdf,0x00d34da5,0x01037d4e,0x012b990e, -0x01495890,0x0125d548,0x012dc488,0x014376e4,0x0116b11c,0x00cb2774,0x009ee212,0x009576c2,0x008c8146,0x00791bbc,0x0049c647,0x001fb35b,0xffe5239e,0xffdad329,0xffb02460,0xffb42c69,0x001a4cda,0x00335494,0x006092f9,0x00752f41,0x00957758,0x00952565,0x0091f1c2,0x005e8baa,0x005fb2f3, -0x00613991,0x006d9902,0x005b34d6,0x0073d7be,0x0082f9bc,0x00abe362,0x00a5fa9e,0x01560d9a,0x00df7535,0x00dad6b8,0x00be096a,0x00b7538e,0x00a8b99d,0x00946347,0x007eda85,0x008f419d,0x00b2ab09,0x00c622bd,0x00e22902,0x00f1c503,0x01027726,0x00e45e05,0x00cd35fd,0x00b8ffe4,0x00a3b0ff, -0x009e8f1b,0x005dbfaf,0x00816582,0x00524e0b,0x003c41d0,0x006d138a,0x00674a83,0x00460aab,0x00592ce5,0x005fd34c,0x008c99be,0x008659a6,0x00a7a353,0x00ca2867,0x00cc232a,0x00f36a12,0x00daa4f2,0x00d5d0e6,0x00924c2c,0x00a76114,0x00b3c8b7,0x00a71310,0x009fedc1,0x009b6e2a,0x0098d333, -0x008ef6bf,0x009fc890,0x00a588e7,0x00adad5f,0x00b0d864,0x00b6888e,0x00c58057,0x00b8a204,0x00b0feec,0x00a8efc2,0x009879b1,0x0093c98e,0x00838a42,0x00610c5c,0x00af7884,0x016e22c4,0x004d8624,0x00ae0912,0x018c3e8e,0x0185630c,0x017c5d00,0x0172e45c,0x016dc446,0x0167db46,0x01639fb6, -0x00d46e1d,0x0076b866,0x018b9394,0x00ec5899,0x00a0106a,0x00fed772,0x0069d85f,0x0124d6aa,0x00c7d8be,0x00e4097f,0x00ce689f,0x0108da4c,0x0118ffa0,0x0113ee4a,0x010a5da0,0x0101120e,0x00f42772,0x00f6d082,0x00fc648a,0x0111746c,0x01062c0a,0x01054254,0x0107888c,0x0107f36a,0x00e9479c, -0x013be6e6,0x00789966,0xffa6ca3b,0xfe72b526,0x00bb690c,0xffb20a65,0xfe78d270,0xfe7b1bae,0xfe81c694,0xfead501c,0xfe9881e2,0xfe9898ce,0xfea41f34,0xffbb5c45,0x00db769b,0xfe777942,0xff859d80,0xff417d73,0x010028a4,0x00bee2b7,0x00c020a9,0x00a2015c,0x012f49d4,0x015f5fa8,0x014f57c2, -0x0141e6b2,0x01267dda,0x010ec1b0,0x0104973c,0x0119684a,0x01587fb4,0x014a9510,0x014e661e,0x0157e68e,0x01428a28,0x01395424,0x0127ca60,0xff7cc919,0x00b038c9,0x00ad21dd,0x006691f2,0x0038a809,0x008bbc4a,0x0092dd1b,0x00ab4533,0x006fa70f,0x00c4c09d,0x00c95275,0x006a936a,0x008b1386, -0x0022ad7d,0x003e1f9e,0x00ddcf91,0x00272776,0x006ad4c7,0x00a7437a,0x009afdf0,0x0065369d,0x017a113e,0x01e69cf2,0x01c0da14,0x019faa70,0x01648b96,0x01286874,0x0127ce08,0x014409be,0x01b98c26,0x018df7ba,0x018acc9c,0x01a00592,0x016e9d02,0x0189b566,0x00d3fca9,0x007982f1,0x00a9cae7, -0x00b914af,0x00a31205,0x00294cdf,0x006037d9,0xffe8fa30,0x0083304c,0x00297c65,0x006fadd5,0x001e9a35,0x003ab8dc,0x00360a0f,0x004fa3ea,0x00116644,0x0073787b,0x001a02ea,0x0032cd7d,0x002b2201,0x001bf443,0xffd5ba8d,0x015ae00e,0x020aaa0c,0x01fc5ed2,0x01e958b2,0x01835a62,0x011954d4, -0x00f6e6b1,0x0160f3ac,0x022317d0,0x020e5044,0x020f3db8,0x02221d68,0x01d4059a,0x01b4e586,0x01053d70,0x0040b1c4,0x00f90438,0x00ba1a78,0x00e2f873,0x00a1ee68,0x0044996a,0x0004ca9c,0xffc50f92,0x0010d471,0x005391a7,0x007a8a92,0x0028a692,0x006107fa,0x003aab02,0x00165a80,0x00b53b63, -0xfe90e6d8,0x010ab784,0x019e5e78,0x01a87162,0x018ef916,0x02619648,0x02702808,0x022a0194,0x011cf0ec,0x01179f1c,0x028f776c,0x01c3717a,0x0142decc,0x00ccad3b,0x00a5bc65,0x00b542f9,0x01308ad0,0x015b01d6,0x01c49db0,0x010d6d98,0x00474787,0x0116c624,0x010a4e70,0x00a34148,0x0043b171, -0xfff4b0e0,0x0025eb08,0x001c3600,0xffd02094,0xffea1837,0x0001d291,0x00115e67,0x0074dfa8,0x00774b60,0x00aa3ad5,0xfeecf028,0x00bdb18b,0x00f4529d,0x00c1da52,0x0015d5ba,0xfeb9dca6,0xff96dee4,0xffc22351,0xff58eb37,0xffa140a2,0xffa28c08,0xffbc66d2,0xff84fd73,0xffbea0e2,0x007b95e1, -0x00bf12f6,0x01260ea8,0x01dd8eca,0x01536862,0x014cebb6,0x00a450f4,0x001aeda8,0x00313618,0xffe82464,0x004713d5,0x006843d3,0x002a4854,0x0015fd68,0xfff40b1f,0xffe1cb6a,0xffecbc8d,0xffbe7b92,0xffd25a88,0xff56a9e6,0xff8c50c5,0xffad178e,0x00f3e5b3,0xff764363,0x009e712f,0x00f65842, -0x018081f0,0x0321e0e4,0x0386fd68,0x03a41324,0x02d45a48,0x01c9b630,0x010ffe26,0x0106770c,0x01e020c6,0x0244deb4,0x0263d664,0x01aafea6,0x00da2817,0x0036ce44,0xffea44bb,0x00577601,0x0097d2a0,0x0080d0ed,0x007ce25d,0xffe12dfd,0x001054a1,0x002dd220,0x00148dfb,0x00115fa1,0x001932e3, -0x001e60a8,0x0002fe83,0xffc28759,0xff9b30b1,0xffc8b26b,0xff9e7de0,0xff2ffb6b,0xff56bf35,0xfe9937cc,0xfd784108,0xfd454cc0,0xfe7be5ac,0x022122cc,0x01831334,0x011c4ba8,0x00a8477a,0xffd8ebf3,0xffc59700,0x002dc839,0x003350a1,0x005149a4,0x006d6372,0x008b2524,0x00b288db,0x00e3e9b1, -0x00de0c84,0x00ccaa23,0x00b25591,0xffd02553,0xfff717f8,0xffe44f07,0xffe88881,0xfff6f5d6,0xfff5367e,0x0014edcf,0xffffce66,0xffc59c98,0xffb42f73,0xff99675d,0xff59e1b9,0xff385c03,0xff62a23b,0xff7c1f02,0xff64c099,0x020e3170,0x037ec61c,0x0495bae8,0x034c7a0c,0x01de6e88,0x008b9b33, -0x004f96b2,0x00efefda,0x009448e4,0x0077fcc5,0x00867df1,0x001e6bed,0xfffa79de,0xfffdd0f9,0x00173e4f,0x001dda87,0x00091e95,0xffc52d4b,0xfff77df6,0x00499460,0x00238107,0x00725355,0xffd1715d,0x000a03d2,0x0015e7e8,0xffffae58,0xfff70f14,0x001d669b,0x0046eeb8,0x006ac69f,0x009efc68, -0x00e7fbd2,0x01c59228,0x021b5a5c,0x01bc14ec,0x02b12458,0x0075747d,0x01cd7904,0x029d3570,0x026d8a6c,0x028a0728,0x0262eb3c,0x01b6369c,0x00c1f522,0xff7ebdd2,0xfef165f2,0xfeddc2a4,0xff10a861,0xff4f1a09,0xff8bfba7,0xff641c02,0xff8214a1,0xff9acee7,0xffc8b60c,0xffcf17cc,0xffb6d0f0, -0xfff80457,0x00129443,0xfffb84b2,0x00270267,0x003b9abe,0x0070fd55,0x00ac20f4,0x00ce6d5b,0x010e03bc,0x010e28d0,0x0114024a,0x010e4d94,0x0110fd62,0x013e53a4,0x011d860a,0x01964c1c,0x01676d0a,0x01d36bc6,0x02507ed0,0x027c4e50,0x02df5960,0x02c9bc20,0x02e17c60,0x0319475c,0x02875b60, -0x01f4e7da,0x014eb7e0,0x0108f8be,0x00b78cf2,0x006b1bec,0x0059ccde,0x003d5c70,0x00169a35,0x001f91db,0x00451a2b,0x0033afec,0x0023da1e,0x0048520c,0x007dd9df,0x0099467f,0x008de567,0x00be207c,0x0078ca06,0x00bbdf8b,0x00684be8,0x00aad182,0x00861b2b,0x00bbc29c,0x00d3a53c,0x00d788d9, -0x00c7662c,0x013aa6fa,0x00ad9793,0x01bcde28,0x01c238f6,0x01d30738,0x01ebf990,0x020483d8,0x021356e0,0x022a333c,0x01eac4b8,0x01c92d8c,0x019f2180,0x01784cb4,0x0149c460,0x01118f8e,0x01074b42,0x00f8e661,0x00ef3e89,0x00e3d01b,0x00ca8ad7,0x00d25900,0x00785d0d,0x00e932d3,0x00fc6943, -0x00d5f8bd,0x00d99695,0x0120c2dc,0x01428f72,0x01534152,0x01287976,0x016ba5a8,0x01785ed2,0x014cce80,0x0162b0f8,0x0134cbc8,0x014be20a,0x019d66e2,0x0157d302,0x01caafee,0x019d8528,0x01b09a32,0x01b07956,0x01ba6ef0,0x01c3248e,0x01d72f28,0x01c30a3e,0x01b459d6,0x01a49c42,0x018f1f26, -0x017e3436,0x016b37c6,0x0169fcd8,0x01636cfa,0x015b9a92,0x01553614,0x01459c4a,0x01559dc8,0x0117ffd4,0x00a4040f,0xffe36bf7,0x014d5f24,0x00b54fae,0xffd60a4d,0xffdc1b15,0xffec7389,0x000d4c29,0x0008b663,0x0015c803,0x002a306b,0x00d1a7f8,0x017f44b8,0x001e6e27,0x00c82262,0x01baca30, -0xff6c910a,0x003cebde,0xff0ad616,0xff7e0bd3,0xff6f70d2,0xff8529a0,0xff74731a,0xff6890a1,0xff561d6d,0xff53c1d8,0xff4f96bd,0xff4b6977,0xff53c14b,0xff5cb386,0xff72a9b4,0xff613801,0xff60ba53,0xff65c221,0xff6b6473,0xff88a394,0xff2f01a8,0x0059d406,0x0116aeec,0x01c54076,0x00020af7, -0x00f5855a,0x019b3f04,0x01a63d2e,0x01a54606,0x01866f3c,0x01a70c08,0x01a79f4e,0x0194aba0,0x00e7a86b,0xffd77c8b,0x01a52618,0x011c4cee,0x012d8300,0xff3fe958,0xff6108db,0xff7ffcc2,0xff97228f,0xff812047,0xff629662,0xff2c7ef9,0xff1af6cc,0xff053880,0xfeff8fb4,0xff013d21,0xff11b37a, -0xff4b5ec7,0xff2101f6,0xff27b0a4,0xff370221,0xff60d25b,0xff64f6c0,0xff92a4f1,0x013fb176,0x0015bc01,0x003d6460,0x003a00ee,0x004bf013,0xffe36960,0xffc80f09,0xffd00fc6,0x00400e50,0xffce6062,0xffabd5dc,0x0003245d,0xffd95b78,0x00492bf1,0x005fb45f,0xffa6f6e6,0x001c1271,0xff2fd09f, -0xff0e2f80,0xff5f37e1,0xff8d8748,0xff937392,0xff56257a,0xfed44ec2,0xfec37c52,0xfe9f1758,0xfe872850,0xfeaa3072,0xfed46376,0xff55e8f4,0xfef30406,0xfef5205a,0xff0b02dc,0xff59421d,0xff459664,0xfffea12c,0x00af2d3c,0x0083a839,0x007bb15b,0x0035889e,0x006db854,0xffdf03ef,0x00404e35, -0xffb4586a,0x00765e67,0xfff941ac,0x00502b2c,0x0011b178,0x0026b004,0x0030b825,0x007987df,0x0003221b,0x003311e2,0xff27ab6a,0xff2a6fbe,0xff8543c0,0xffaf5d92,0xffda3316,0xff851a7e,0xfeb9f824,0xfea55bc0,0xfe3737f8,0xfdfc9924,0xfe05effe,0xfe539068,0xff01bff4,0xfe83087e,0xfe842976, -0xfeb3d4f0,0xff3332f8,0xff523a7f,0xfff0579e,0x00e74271,0x0039b01d,0x00f71e87,0x005a87b5,0x002f5903,0xffec7e2e,0xffd20138,0xffe6634a,0xffeed5d5,0x004266e5,0x002b2747,0x0010d034,0x00011242,0x0000f26f,0x003130bb,0xffecceb4,0xffb0a808,0xfefc2764,0xfe3a0644,0xfec383bc,0xfef274de, -0xff25f12c,0xfef30386,0xfe642788,0xfdad50b0,0xfde2b58c,0xff396018,0xfeb2b4ac,0xfee548e0,0xffc93677,0xff8be8e3,0xff7fee0f,0xfefab014,0xff395fd4,0xff07aca5,0xffef1f5c,0x010dcad6,0x0053bf48,0x00b73875,0x005e7df4,0x0042d5b9,0xfffdc6e6,0x00105525,0x00106187,0xffcfc865,0xffe83981, -0x00010855,0x00214e04,0x007396eb,0x00beb5e3,0x00d0d445,0xffa2ee38,0x0072a0ed,0xffd94570,0xff80c94c,0xff66d501,0xfec15aa6,0xfee2f00e,0xff3ccfba,0xffdae250,0xff6cfe06,0xff549ee3,0xff925ae5,0xff815ed6,0xff9a3686,0xffc12eb2,0xff3c0725,0xfed68826,0xfe6fbb08,0xff305ff0,0xff6ae836, -0x005488c3,0x007e0ab2,0x002f86c5,0x00064f15,0xffe1a605,0x00047f72,0x000f1d5c,0xfffe0329,0xffe71940,0xffe2fac2,0xffd47f11,0xffbbb0e6,0xff9656dd,0xff70c7c8,0xff1a38f2,0xff810ae9,0xffaadfc7,0x00332704,0x0071c16e,0x0049d426,0xffdd11ce,0xff0f0bca,0xfedaad0c,0xfe3d28c0,0xfd9ba230, -0xfd2f58c8,0xfd874348,0xfe36e2d0,0xfde32ae8,0xfde83bac,0xfe3e9698,0xfe7bf006,0xff18683c,0xffe5c319,0xffca5104,0xff7dded5,0x000d42bc,0x00158550,0xfff53d33,0x000d1d0e,0xfffaf50f,0x001248cb,0x001681ec,0xfffbc319,0xffed5f79,0xffffe889,0xffe1e7e3,0xffa92d34,0xff8b6184,0xffdc43dd, -0xff8adc49,0xff70769d,0xffa78ad2,0xfe2e91f6,0xfd4ed268,0xfc455154,0xfc623188,0xfc7b6208,0xfcfc4480,0xfdc61980,0xfef99a38,0xff5ed78c,0xffcc39ad,0x0021d71f,0xffda96aa,0xffb6db39,0xff9e817c,0xff545518,0xff0db433,0xfee2f6cc,0xff303213,0xff802e1e,0x00577bac,0x004d0938,0xffccc0b0, -0xffbf3342,0xffe5baa9,0xfff60385,0xfff1e8b5,0xffff7e3e,0xfffe15a3,0xffd10252,0xffa61538,0xff7a4e70,0xff1853f7,0xff314a61,0xfed834e4,0xff027df5,0xfe964a04,0x03552bac,0x01e34fec,0xffa1bfe3,0xfeb9f358,0xfd20bbdc,0xfcdc33dc,0xfd13a80c,0xfde1deb8,0xfe408cae,0xfe6f6292,0xfe72abfc, -0xfee19f5e,0xfef84ae0,0xfec30aa6,0xff53d41e,0xffccf484,0xffd2fa08,0xffe3216d,0xffd515bd,0xfff8af76,0x0055b498,0x000a6f91,0xffcdfec2,0x0007be30,0xfffb290f,0xffc98101,0xffeca7e5,0xffef659f,0x00410918,0x00201cac,0x007124f4,0x00bc5dc8,0x01a9b934,0x02239478,0x02462724,0x023d8db8, -0x02844ae4,0x01880f56,0x00eabdde,0x00f78d08,0x0072d7a5,0xffb9f389,0xfea65548,0xfd713b70,0xfe02f61c,0xfe73170e,0xfebf6a88,0xfecae780,0xfedc3e52,0xff10d790,0xfeb1b55e,0xfe987fb0,0xfec0ca50,0xfed904a8,0xff1763e2,0xffb3c4f1,0xffd5e358,0xffdb437b,0x001a2bb7,0x0018dff7,0x003e69ea, -0x0086e0c3,0x008a65ca,0x00b04805,0x00bacc6e,0x00df0466,0x00fb97ad,0x010b85aa,0x00fc815a,0x00f0d6d4,0x013bc360,0x015c26ac,0x015e80be,0x012a16f0,0x0119891a,0x0169cef2,0x019e2872,0x0178fd5a,0x016c0d48,0x01466276,0x00c1d207,0x001f997a,0xff92db98,0xffa10acc,0xffa74f21,0xffbe873e, -0xffb9ee05,0xffbb4190,0xffa2591b,0xffab934f,0xff89ebb3,0xffb60edb,0x002b806d,0x0042e1ae,0x005d0f23,0x0067976d,0x0099b89e,0x00894b47,0x00b4be74,0x0077219d,0x00c2ff4e,0x00a98294,0x00e12cbb,0x00db8a9a,0x010a0030,0x01303b2c,0x01675770,0x0144dea6,0x01fd1f82,0x0142184a,0x011e7d88, -0x01021f6a,0x00dac0b8,0x00b7a7b8,0x0090286f,0x007b15f0,0x0088f302,0x00aee5d3,0x00bcbdcf,0x00d05711,0x00d751f3,0x00e197de,0x00ca4dad,0x00b727c7,0x00a46044,0x0098db70,0x008ba83e,0x0063cce9,0x00e58091,0x0088879f,0x009e744f,0x00c4a718,0x00e2ef72,0x00c3c8ce,0x00c3c5d7,0x00e280da, -0x0120a0cc,0x00f10b50,0x00f18342,0x0121a10e,0x011fac2e,0x01567892,0x01582312,0x01293d28,0x0147cee6,0x00c1211c,0x00de71e7,0x00cc024f,0x00c2931e,0x00bfae91,0x00bae732,0x00aad2e8,0x00b46a0a,0x00b450d6,0x00ba5a34,0x00b79dc3,0x00b80fa2,0x00bf13a9,0x00b50a26,0x00afa477,0x00a9dea0, -0x009d9d77,0x009e0106,0x0072238c,0x00f4d878,0x0167c5ba,0x01d5195c,0x00e1e145,0x017a50d8,0x01f6056e,0x01f86536,0x01ee9192,0x01d79f60,0x01eb428c,0x01eaeb98,0x01e2d70a,0x0198d088,0x010d1a3e,0x01f9adae,0x01b8b3d6,0x00d19c0a,0x00848aef,0xff847f3f,0x00be4e05,0x00611031,0x006e1b38, -0x00614d55,0x0076d298,0x007d6296,0x0082f4b1,0x007de162,0x00787b1b,0x006f052a,0x006d0fc4,0x0071b695,0x0085f27d,0x00858ed4,0x0089599f,0x008c3c28,0x008c938d,0x007e8d31,0x00d143dc,0xff97ccc5,0xff17c98b,0xff0b98b0,0xffd0c346,0xff129849,0xfefa46de,0xfeea283e,0xfeebe084,0xff1efcaa, -0xfee30d6c,0xfeda60c2,0xfee77504,0xff1555f3,0xffef3d77,0xff0dd489,0xfef0c142,0xfef5d37c,0x0069599f,0x0074a5d4,0x00485fd2,0x002ca32b,0x00551951,0x0067efa3,0x0078b91c,0x007af78b,0x006eefdd,0x0059875a,0x00501707,0x0064d7c9,0x00a29ced,0x00a45655,0x00a863e6,0x00af609c,0x009bbdaa, -0x00bf16ae,0x00838485,0xff5a3998,0x0050b33a,0x000b5974,0x000bf147,0xffe0711b,0x000254e8,0x0023ccad,0x0012ffd5,0xffe358e7,0x002efdc9,0x00585ce0,0x001088b2,0x00132566,0xffcae662,0xffeb6d91,0x005a5b1d,0xff7bd108,0x001544c4,0x006c21e3,0x0014c4c6,0x000c7857,0x004d23a8,0x0064e19b, -0x0090a728,0x008890ba,0x00668344,0x003117f8,0x001b7e0f,0x00393e3f,0x00ad5112,0x00b33bf3,0x00bfafff,0x00d41b36,0x00bcf771,0x010616b6,0x0068ccd7,0x0008db95,0x0054b8a4,0x005b139e,0x004782d0,0xffd99b9f,0x001b1e71,0xffc293d5,0x0071fd64,0x0002a554,0x0056ac2a,0xffd51997,0x001964b0, -0xffe5c9d2,0xfff98fd6,0x001848a2,0x0006157c,0xffa64cc0,0x004675ea,0x006b82a3,0xffd6cf05,0xff885625,0xffd92c36,0xfffaf059,0x004fc941,0x0073f3be,0x004681b1,0xfff7619b,0xffc5216b,0x000d276a,0x00d3e946,0x00db2884,0x00e67243,0x00fa3fb0,0x00d9301e,0x012fe8b2,0x00a04bcf,0x00258d29, -0x00ff095a,0x00802154,0x00a84929,0x00790769,0x003d3894,0x0007538b,0xffef74ab,0x0067f13e,0x00449436,0x005bfa85,0x003cddf8,0x001e88ad,0xfffd2567,0x0098dceb,0x006967bd,0xfe242780,0xffa5d972,0x008c9297,0x00c07271,0x00e5a827,0x0139ebc4,0x0122e234,0x01163ab8,0x0082b919,0x0090411f, -0x01726894,0x0114db38,0x00e8fc64,0x010143c2,0x0085bdbf,0x0072c87e,0x012cec8c,0x00f4250f,0x013289ba,0x005857c5,0x001198f5,0x010b8d40,0x00a9fdc3,0x007c9419,0x002b2a4f,0xfff9aeee,0x00264169,0x002495b4,0xffea9855,0xfff50f1d,0x00137520,0x001ebe99,0x0082970d,0x0041755b,0x00116057, -0xfeabe210,0xffbe8f0b,0x017b5e44,0x017f9cf4,0x000a6d02,0xfecc0c10,0xfe1d3f0a,0xfe46ef8a,0xff6ab350,0xff8ca2e4,0xffd2f0aa,0xfff129e1,0xff717fe6,0xff633422,0xffa6bd32,0x000d018d,0x0046b38a,0x0085815c,0x004cb9c3,0x00aa9635,0x0066523b,0xffe74154,0x0005eef7,0xffef98c4,0x004a62f3, -0x00618ab3,0x001d1592,0x0001fed6,0xffe82420,0xfff29478,0xfff85cbd,0xffc359af,0xffba871b,0xff62c7ac,0xff9280d3,0xff84b771,0x00140875,0x0023e50f,0x008caec6,0x001d7807,0x00064646,0x007320da,0x00f7c3ea,0x01336d44,0x00f7b29d,0x00faa3ae,0x00da78a7,0x009bbb6b,0x00ea52e0,0x010319d0, -0x00c463fc,0x00fce4a0,0x00c0c9f5,0x00632df2,0x0033c886,0x00ad4900,0x00bd1de2,0x0017f37a,0x0049c0c3,0xfff80339,0x0008b2d9,0x00176834,0x001a89e6,0x001f6d05,0x0015b6c2,0x000d9af2,0xffe42d5c,0xffa89b66,0xff78df4c,0xffa101b1,0xffa31d4a,0xfee31266,0xffe14d04,0xfd952d7c,0xfd1c6bfc, -0xfe21efd6,0xfe716c66,0xff45613e,0xff2d1aa5,0xff3ad05c,0xffd00677,0xff4108f1,0xff53004b,0xff71a19b,0xff648ba4,0xff6055d0,0xff4f4dcd,0xffa594f2,0xfff2f12f,0x002852a1,0x005ceb46,0x00978908,0x00995617,0xffa8714a,0xffc869ec,0xffe648e3,0xfff44910,0x00076acc,0xffff0df2,0x00172712, -0xfff7e398,0xffece83d,0xffb9ec93,0xff9ea5f0,0xff8be823,0xff5b9c2f,0xff22b32c,0xfe9a72fc,0xfe66b410,0x00d475be,0x004dad15,0x000234b0,0xff264009,0xfe6cc966,0xfeba637a,0xff4a093a,0xffab62d3,0xff6c0992,0xff569767,0xff3bd949,0xff682587,0xff8519e5,0xff683a5d,0xff52e9db,0xff84e85c, -0xffe89246,0xffbf62f0,0x00128523,0x005e02fa,0xffda66de,0x00265152,0xfff9f3e8,0x0019b609,0x00179c1d,0xffd80602,0xffed6b8c,0x00154916,0x00083056,0x00172945,0x001c4393,0x002d974e,0x010906f6,0x0178268e,0x016ea63a,0x013ed14c,0x00f84376,0x017d3f82,0x01f9d394,0x017b2040,0x01319b6c, -0x0038f8d5,0xff7cfe92,0xff0c1b0f,0xfef0e618,0xff05eee0,0xff282911,0xff537ea4,0xff50fc58,0xff68decd,0xff375c45,0xff37769c,0xff95b1cd,0xff8ccfb0,0xff982419,0xff8fc6d6,0xff979c54,0xffb9e08c,0xffa341bf,0x001886d4,0x006f1ce9,0x00b46f1a,0x00af7519,0x00ae43d2,0x00fa676e,0x010c7e3c, -0x012e7dc4,0x01649a00,0x011390c0,0x0104c780,0x0131a544,0x016cf0f0,0x00fd1fbe,0x01626fe6,0x01b6ad16,0x01ade76c,0x01fb4ef8,0x01bf92b6,0x01a904b8,0x0187db9e,0x00e409f7,0x00400781,0xff8e7301,0xffa14a56,0xffa7447c,0xffa791d5,0xffc71162,0xffdc1eac,0xfff11b81,0xfffd6059,0x003d752d, -0x00176a08,0xffe04e19,0x00242864,0x00487d93,0x005e8514,0x0056ff61,0x00769303,0x006cd5a9,0x00b93ac3,0x007eae8a,0x00dae420,0x00c0b33f,0x00ff6ca0,0x00fc45a5,0x00e81f5f,0x00c08af8,0x0103c6ac,0x00f65b3c,0x015ca9a8,0x015fe508,0x0153cbac,0x014d6cfc,0x014c52be,0x01492e7c,0x014e2104, -0x0145a8f4,0x015008b0,0x0146d86a,0x0133b9c2,0x01108170,0x00eb7457,0x00df67c8,0x00cfa474,0x00c2431f,0x00ad2b9c,0x00982acc,0x008f470a,0x0064f21e,0x00aaa55c,0x00a00fc0,0x00a5a4d0,0x00aa7861,0x00d2cbbe,0x00fc5142,0x00f6849d,0x00e02d36,0x012470a2,0x014857ea,0x01321af8,0x01411896, -0x012830a4,0x01321ed4,0x0166eb4a,0x00dea49d,0x016fb378,0x01502cae,0x0153e3fa,0x01539de4,0x01562368,0x01583a8e,0x015c3e2c,0x0153f12e,0x0149838a,0x0143cae0,0x013746c6,0x0130479e,0x01272eba,0x01211734,0x01196802,0x01130626,0x010efeda,0x010555b6,0x01144f88,0x00a494f8,0x00568fb3, -0x005078f4,0x00c9148e,0x005d6d48,0x004b21b7,0x0048e40b,0x0055caf5,0x00729f1b,0x0062025d,0x0069e03f,0x0079c09a,0x00920023,0x00ff38d7,0x00970575,0x008f6939,0x01775a88,0x002f71a0,0x00f25054,0xffdf7eef,0x00221dcf,0x00299c2c,0x002dc7a7,0x004817d7,0x00486fab,0x0030583e,0x003172d2, -0x002678d9,0x000fa358,0x0015d21e,0x001cc11e,0x0032cffa,0x0029f939,0x002ab7fd,0x002b6856,0x00304a50,0x00350bc5,0x000551eb,0x010916c6,0x012dd9ae,0x0097e4c1,0x00d83e05,0x0121a63c,0x0091c310,0x00ac688e,0x00b39d57,0x00a76e9e,0x00c6cea6,0x00ca3b1d,0x00c91baa,0x011a8562,0x00c25106, -0x00a8a98c,0x0132e77e,0x00fcf197,0x002b11f1,0x000a0b7a,0x003b0bc2,0x0030c8a7,0x008515cb,0x009140f6,0x004ebbe7,0x00512176,0x00289bc8,0xfff01b64,0xffe9b25a,0xfff57e85,0x00346224,0x00294336,0x00397a01,0x003e2c55,0x005aeba0,0x003bb4e6,0x00781455,0x0106990a,0x008bea2c,0x00bdef35, -0x0084a8c5,0x0087aab2,0x00712e97,0x00576e2f,0x00857f56,0x00d61ec0,0x00777b5e,0x003fb5ec,0x00735252,0x0052dbdd,0x008a9417,0x00e7a643,0x0064df8b,0x00ba8779,0xfffe90df,0xffd0aab7,0x003ed444,0x00226714,0x00dd1b5f,0x00fef2d9,0x0062b54f,0x007f1bb3,0x002c0d8b,0xffaeaa2a,0xffbfa95a, -0xffe0b255,0x006bae62,0x003a0259,0x00478a0c,0x004ab7c7,0x006a830c,0x00432ab6,0x00a50dab,0x011575a0,0x00d98a38,0x00ae475c,0x0086479d,0x00947621,0x00384a26,0x005e5cdf,0x001543cd,0x00d408cd,0x0027f714,0x006f76a4,0x006cc927,0x004f9a56,0x00690661,0x0109a2f2,0x00950708,0x00c6e0c7, -0x00026d2e,0xffdbcbe1,0x003cc159,0xfff5f5b1,0x012b7f74,0x01736648,0x00a0ea00,0x00cfacac,0x0040f072,0xff62e313,0xff5a7e8e,0xff9ff8db,0x0072e1ff,0x00559895,0x0071957e,0x00802d34,0x00b1f9eb,0x0072574c,0x00b70f04,0x011c3e0e,0x008faed8,0x00ea035b,0x007d552c,0x003ce525,0xfffceba5, -0xffe87abd,0x00040053,0x003c50ac,0x004be86a,0x001f02ca,0x002b2eae,0xffed888c,0x004655be,0x00f5963f,0x009e86b4,0x00681fae,0xfff0b474,0xffa05a5a,0x0054be31,0x00976682,0x00ef1734,0x00eea18d,0x00daac06,0xffb1d6a0,0xff45744a,0xff839867,0xff5fff82,0xff69fcbd,0xffab0de6,0xffd1b8d4, -0xffdb9eed,0xff6ea810,0xfff84a0b,0x0016ebba,0x00ca85d7,0x01702994,0x00cc5904,0x00c736dd,0x007d1e71,0x005ec6aa,0x000f4e81,0x0026cbbe,0x00241d99,0xffe3ee05,0x000bbcb0,0x0033942e,0x0082abe2,0x00b45a91,0x00c32a5d,0x0076161c,0x00498da7,0x00b6c5f9,0x016e2410,0xfff5f856,0xffa4a7f1, -0xff2dd5e1,0xfefde7b2,0xff6430d5,0x008dc966,0x002738d4,0x001cca72,0x0012c852,0xfff46166,0xffe95a67,0x000982a0,0xfff6d3f0,0x002296bb,0x008846c6,0x00ad080a,0x006cc3d4,0x00c675a4,0x0069071c,0x0037ebb5,0x005ebd79,0x00209748,0x002e1014,0x00143c3c,0xfff1efd3,0xffdf5f76,0xfff722ae, -0xffefef27,0xffd3531a,0xff9fb000,0xffa787f8,0xffacfc29,0x00001887,0xffd6cca2,0x0085ec6d,0x0057d423,0xfff52c93,0x005926a4,0x0139425e,0x01f5ac44,0x01e90fc0,0x00ffe5c6,0xffc28531,0xff44b8f0,0xff62cc88,0xff75be02,0xffcbf2e3,0x0024f2d2,0x0037d221,0x003ec914,0x003c35a5,0x003420d7, -0x000f7737,0x00f50433,0x0083d9fb,0x002e69ca,0x006fda1d,0x004ca4e7,0x00310961,0x001b1ef7,0x001730d9,0xfffbeb76,0x0005a392,0xffd9c84a,0xffb3e7b9,0xffac62fe,0xfff62b2a,0xff953285,0xff6a41f7,0x0011f50b,0xfddd9af0,0xfe37eeb2,0x0003fa9e,0x00e5ce7e,0x0067dbfc,0x005086bd,0x000219fd, -0xff538f10,0x0046a99b,0x00b25029,0x00beac12,0x00546ba2,0x00092f48,0xffd0965d,0xffb56853,0xffe60873,0xfffccad1,0x003a2bdd,0x00325d93,0x00a38ea0,0x003bcee1,0xffec94e4,0xfffccc9b,0x000756f1,0x001a5f03,0x001179d0,0x00027e1e,0x000b913c,0xffffbf5c,0xffc2ba8e,0xff9c51ad,0xff6c585a, -0xff908085,0xff286fc1,0xfe8ac168,0xfe1c1112,0x018839d4,0x00db6e20,0xffcba9c7,0xff83c0f2,0xfef19fa8,0xffdd91fd,0x0035c8b6,0xffece4f9,0xffe9955a,0xfffd5053,0x00879a8a,0x00456798,0x003a39d5,0x004d6652,0xffce8f6f,0xffa38835,0xffaa84c9,0xffdf6eb2,0x0003aeca,0x0063eb27,0x004fa62d, -0x00144416,0x001dcc86,0x00278542,0x00140e31,0xffe14346,0x000c1c31,0x000b5b41,0x0029ecf9,0x00047cbc,0x00247120,0x003f4b5d,0x00d84a09,0x014de984,0x018a310c,0x019845b6,0x028a326c,0x02a71bc0,0x02138bf8,0x0182c12e,0x009405a4,0xff2bb5ee,0xfe633282,0xfe605db6,0xfe93d26e,0xfec79a82, -0xfee832de,0xff44f5e9,0xff81a5a2,0xffb3a0cb,0xffb127b8,0xff96dc00,0xff94f5b6,0xff643897,0xff6752f2,0xffaa735d,0xff9b35b2,0xffc11820,0x00167f79,0x004aef03,0x00777cdd,0x00b62406,0x00a632fe,0x00b262bf,0x00b46140,0x010677f8,0x01475996,0x018bc57c,0x0149ae20,0x016144fe,0x01d0a6b0, -0x02340440,0x0198a74c,0x015c2d92,0x011f7a46,0x0144164a,0x015efaa0,0x013667ee,0x00fce0b9,0x00a350bf,0x003f282e,0xffd82ec4,0xff5e1a93,0xff5bb172,0xff4a0f0a,0xff39c4bb,0xff58bedf,0xff79f629,0xff95043e,0xffcc3cd0,0xffdb3e57,0x00316f96,0x00727de3,0x005876b8,0x004887e2,0x004c444c, -0x00634ff0,0x00545c2d,0x009450ca,0x00a101e8,0x0101a082,0x00f577f7,0x0129a1ba,0x0141f6a0,0x01594704,0x0173fa12,0x01822390,0x0177ea34,0x018f853a,0x0147efe2,0x012751f2,0x0122ef10,0x010174c6,0x00eb1f3c,0x00d99ee9,0x00d7705e,0x00bfe193,0x00aea97f,0x009a02e9,0x00821dc2,0x006fb34f, -0x0069c7bc,0x005d5e40,0x004cbd36,0x00354b1f,0x00246057,0x0000c012,0xfff4ee26,0x00930a66,0x0068f3a5,0x00afa644,0x00beabaa,0x01013ea2,0x0112bc96,0x010f9b3e,0x013327a2,0x01573c82,0x0137cff6,0x012a7f2e,0x014c9a9c,0x0144042c,0x0155c64c,0x01669a70,0x013d3046,0x0190b3e6,0x00fed278, -0x010f6022,0x01084496,0x0104ec44,0x0107628c,0x01057c80,0x010382f8,0x00f42f14,0x00e9578a,0x00e16a99,0x00d60cd5,0x00c9be3f,0x00ba55c3,0x00b5a235,0x00b254d8,0x00b03d42,0x00adbf71,0x00b37fb3,0x0085ace3,0x01316ed6,0x01696018,0x0140be36,0x01433cd6,0x018fcc30,0x015bdf74,0x01670648, -0x0166ea82,0x015b9186,0x01778ccc,0x017f13cc,0x017fbcf4,0x01afd9d2,0x017726e6,0x01688d66,0x01b3b16c,0x013618c2,0xffd27e5a,0xff4616aa,0xffde0aba,0xffd47451,0xffcc0fa6,0xffce3cb2,0xffc122a4,0xffbc2118,0xffb8afc5,0xffbe73f9,0xffbc4431,0xffb136f9,0xffb2add0,0xffb6ac08,0xffc28fae, -0xffc95596,0xffceb70a,0xffd0f199,0xffd34bb0,0xffe12105,0xfff2812f,0xff5ed4c1,0xff8de43f,0x008198f0,0xff58c134,0xff74dbee,0x0059b930,0x00485d11,0x0046dee8,0x005f84b6,0x002f01dd,0x002596ea,0x002a5b9d,0xff6e7a81,0xff5916e7,0x008026e3,0xff774e47,0xffb37503,0xff993a5e,0xffe24034, -0xffb51908,0xffb12d1d,0xff811a7a,0xff70a705,0xff6f3bd3,0xff861616,0xff82b784,0xff6416b0,0xff669446,0xff7486a3,0xff99c034,0xffac28d7,0xffb5c1cd,0xffb84aad,0xffbc67a1,0xffee99f8,0xffc6a56b,0x00077d4e,0x000145ce,0xffbc032a,0xffeaf5a5,0xffdb97f0,0xffaa2af7,0xffc1ca01,0xffa0557e, -0xffb8827c,0xffb35907,0xffd5ec68,0xffe0b199,0xffbaa0b4,0xffd089a2,0xfffe0b8d,0xffcf92c2,0xff66d6eb,0xff87dd62,0xffde6a9c,0xffa72d61,0xffb9762c,0xff5c3e83,0xff2ea0f6,0xff1e64af,0xff4b4100,0xff3c6955,0xfef47efa,0xfef799e6,0xff136f20,0xff55e028,0xff7e4de6,0xff981f83,0xffa5212d, -0xffc06e6e,0x0002f1f6,0x00078f64,0x00065557,0x003191c1,0x0025b59c,0x000ae18b,0xffe7c080,0xffe1faa8,0xffe050a3,0x001dc11c,0x0020b964,0x0024d0a2,0xffe42a2e,0x00180284,0xffd84cfb,0xffe30509,0x00645813,0xffc9176e,0xffacd672,0xffad172a,0x000cd783,0xffa453ee,0xff8dd8a2,0xfee713c8, -0xfe93dcfc,0xfe8bd0c6,0xfee81116,0xfedf47e0,0xfe721862,0xfe626370,0xfe895c38,0xfefbec14,0xff30b5eb,0xff57f6aa,0xff6c8c8f,0xff9670b2,0x001d37a4,0x0028326a,0x006cb6d4,0x00b7d9f4,0x0080555d,0x006b1e7c,0x004e4519,0x002ce86b,0xfff23f2d,0x0014e1ff,0x00985f21,0x004074f0,0x0037269d, -0x0055d5a1,0xffe85d90,0xfff7996e,0x0105377a,0x002058d5,0xfe7d249e,0xfed1e4d4,0xff616a15,0xff9e142c,0x003731a0,0xffce2fba,0xff8bbac7,0xff981967,0xff57702f,0xff6aa439,0xffa6cbc1,0x0017943c,0x00480681,0x0081250d,0x00220dfe,0xffff15aa,0x0044b29c,0x0011d7be,0x0018f832,0xffbd7357, -0x0055f210,0x00c22d27,0x00674598,0x00590e91,0x0032b4e3,0x0014ec32,0x002bd42e,0x001efc81,0xffe982bf,0xffebb969,0x0022f884,0x0059ce10,0x008086ee,0x001ccf76,0xff8e9b1c,0xfecd9316,0xff9c4a26,0x016efd88,0x00bee600,0xff742a2b,0xff2c4a39,0xfdc2ccdc,0xfdec899c,0xff9cc6cc,0xffa02227, -0xfff42b26,0x00123344,0xffc7cdfa,0xff875177,0xff5d3df9,0xff333213,0xff084430,0xfef95f4c,0xff3b3626,0xffbd2af2,0x001b612f,0xfffa8c9f,0xfffc54f2,0x000b21d4,0x0028dc6c,0x00326997,0x0016d4b3,0xfff81506,0xffe36c21,0xffeff600,0xfffac18f,0xffd87506,0xffb3622a,0xffa9bd4f,0xffad0aee, -0xff9965bd,0xff65677f,0x0026bb2c,0xffc74b8a,0xff82a308,0xff2d13c2,0xfdeecd48,0xfe5a8830,0xfe709296,0xfe479f6e,0xff3ac4d6,0xff95104c,0xff5c08de,0xfed02388,0xfea48746,0xfef6de94,0xff24587d,0xff8d2807,0x002233e6,0x002b2112,0x0076d438,0x00966d3a,0xffda8809,0xfffd6d7b,0x002c3ed3, -0x000c2c96,0x000a9b14,0x001240f4,0x0011831a,0xfffbb01c,0xfffebbcb,0xffc76b56,0xffa1e0fd,0xff8e87e1,0xff8fd422,0xff705759,0xff0b35fb,0xfff5fa5e,0xfddf25b4,0xfe9405a6,0xfed64808,0xfe07132e,0xfc3aca30,0xfce7e9d4,0xfda3cd80,0xfec98628,0xff1575f6,0xff3be649,0xff29a0f5,0xfeff5a3e, -0xfefb160a,0xff382a3a,0xfedde3ce,0xfef8535e,0xff4935ae,0xff9e4d50,0x00113b95,0x00622bb8,0xffebcd51,0xffc72fa5,0xffe8eb93,0xffed73e2,0x000733f1,0x000bfbc9,0x000a7fd9,0xffef46e1,0xfff71d35,0xffd07be0,0xffb4b046,0xffa32aee,0xffa58b10,0xff1bf8ce,0xfe7aa4a6,0xfe21e29e,0xffb903dd, -0xfd708588,0xfb9eeac0,0xfbbda778,0xfc7c5c60,0xfd758204,0xfe1a627a,0xfe63b644,0xfe968b5e,0xfea81260,0xfe8aee34,0xfe8a9ff8,0xfeb15504,0xff0ecce8,0xff526e42,0xff7b2997,0xffa1bdfa,0xffda12b8,0xfff45a8b,0x00052fba,0xffa370da,0xffc61b55,0x00339104,0x001a8e21,0x00057b37,0xffd6548b, -0x000388e2,0x0016cca9,0xffd93674,0xffbcd246,0xffa709b5,0xff965773,0x00046530,0x00607c97,0x00c54601,0xffbddaf9,0x021c1784,0x01632a44,0x01062078,0x005ae67a,0xff7e1c3a,0xfe7c3020,0xfe147bfc,0xfdf9ff3c,0xfeb7567e,0xff2d2d5e,0xff5575de,0xff6af368,0xff4e8a5d,0xff2debef,0xff214395, -0xff25b4f1,0xff6d85cd,0xff673377,0xff952f70,0xffd7330a,0xffa147c6,0xff9f29ab,0xff8eb3e3,0xffed270a,0x004d2014,0x00899c16,0x008a6be6,0x0091e7fa,0x00bcf261,0x01037006,0x01396876,0x01646c22,0x013cbd46,0x012673ac,0x01882a4a,0x0174c094,0x00b2730a,0x00db7afe,0x00bfeb73,0x00911997, -0x008be5cb,0x0027ca16,0xffbf920f,0xff363926,0xfefdd1da,0xfebc9552,0xfe7cf6fa,0xfeb99e68,0xfef007ae,0xff1b02c4,0xff39334d,0xff5335b2,0xff727bcd,0xff85bc30,0xffa122eb,0xffac47dd,0xffd389ca,0x000887e2,0x00282c5e,0x00391fc0,0x0042e1c8,0x00511219,0x00808090,0x00ac01aa,0x00c027c6, -0x00f08bf8,0x00fe8f84,0x012067be,0x01101f08,0x00fdd520,0x00ee6374,0x00e39fc4,0x012caff8,0x00c08a1c,0x00bc03f3,0x009b6824,0x00816791,0x00661a20,0x0058b483,0x0047b79c,0x0057e1a8,0x00634f39,0x006469ba,0x005c34b5,0x0048c02e,0x0037a78f,0x002f45be,0x0028007a,0x002023db,0x0015c511, -0x0018f752,0xfff6dbc8,0x000bd688,0x0007c2b1,0xfffeec8b,0x0038eb1c,0x0049e608,0x0046b5e7,0x00653c67,0x00645196,0x0082cae5,0x009fd876,0x00cb0a2c,0x00ecf7a3,0x00ea1065,0x00f96314,0x00e54b94,0x00db6a63,0x00896dd5,0x00aa3ab4,0x00af4685,0x00a3229f,0x009fceb1,0x009cb23d,0x0097f9e1, -0x008fa105,0x008f1258,0x008b32fd,0x008b4159,0x008734ff,0x00863444,0x00831419,0x00828e88,0x008082aa,0x00801de4,0x007c9585,0x007dfbe9,0x007f4e77,0x004a9f2f,0x006afedb,0x010f6f00,0x004c486a,0x00701501,0x012c0598,0x012921fe,0x012b3bc0,0x0131a33a,0x0129d8a0,0x012b0b38,0x01310d92, -0x00b1c8fc,0x008228b3,0x0155486a,0x00b8eb5d,0x00c4b3a9,0x00d2479d,0x00de6b5c,0x00ce2c53,0x00aa23f3,0x00bfe1c9,0x00b10173,0x00e49008,0x00eeaad5,0x00da0835,0x00e306a3,0x00d81a86,0x00ba0f4f,0x00bb8261,0x00bdcd67,0x00c83d63,0x00d07a2f,0x00d42b69,0x00d33640,0x00d5a5aa,0x00c3d39a, -0x00e36763,0x00eacc4c,0x006f2332,0xff4514a4,0x00fbc174,0x007475e2,0xff5467b3,0xff664b74,0xff703830,0xff8725a1,0xff847037,0xff85fb6c,0xff963c67,0x00767516,0x0108886a,0xff72a777,0x006566df,0x001e6ca3,0x00f63b7a,0x00a6dff5,0x00b6c905,0x0099400f,0x011b6d78,0x0144ff7a,0x0111103c, -0x01329012,0x010fff56,0x00c1df90,0x00b2e6cb,0x00b415a3,0x00d8bbeb,0x00fc09b0,0x0113f14e,0x01140692,0x01129518,0x00f861d1,0x01159afc,0x003d1124,0x00c05a08,0x00c902b1,0x00886265,0x007318a7,0x00a86fa7,0x00a50504,0x00d04a3c,0x00d559c3,0x00cbda0d,0x00adb131,0x009b4446,0x008fcca1, -0x00710d33,0x00dea9f8,0x00e62531,0x00a6e96b,0x009f2e8b,0x008cdb51,0x00b5352a,0x007bccfe,0x0175e8fa,0x01c88f3e,0x015255a0,0x01a46b6c,0x015babfa,0x00b711dd,0x00a6f124,0x00add887,0x00f75697,0x0128ec60,0x014856fa,0x01487c4a,0x013496b6,0x012e4cea,0x00fcf41a,0x00e9dd58,0x00d56100, -0x00a1c841,0x009fb9bf,0x00698fba,0x006d1668,0x003b341b,0x0075bb33,0x00b4c4ee,0x005994d8,0x00518c06,0x008c529e,0x0049c923,0x006acf67,0x00ff565f,0x00c270b2,0x009e922a,0x00a7c523,0x0066f234,0x005e8726,0x0002c041,0x017bb686,0x021a9558,0x019201d4,0x02113600,0x01b07f54,0x009f0cd5, -0x006b2eb6,0x00809a13,0x01026750,0x017e732a,0x01c76e16,0x01cb65f6,0x019fa892,0x015ea5ee,0x012b0a2e,0x00d8a078,0x00eb3949,0x00aa7a7a,0x00a74e78,0x006ad4ae,0x0031a26a,0x0004fbe2,0x0016f36c,0x0090f733,0x004fd7c8,0x003619d2,0x005690ae,0xfffee001,0x005ce85b,0x01439644,0x00fa16de, -0x00038fae,0x00e38884,0x012af634,0x01a9a9fa,0x0233bb2c,0x02285364,0x02169a38,0x02396da0,0x018845ca,0x0111aaf0,0x00b82bfc,0x00cd4245,0x009839e0,0x002d6c83,0x0051449c,0x005a7f17,0x00699e70,0x00d2a227,0x01459afe,0x01502a58,0x011021aa,0x011ed500,0x00bcd6cf,0x00968840,0x006e74d9, -0x0024ad4a,0x003cd930,0x002dc8ae,0xffed95f3,0x001598a5,0x0051ed00,0x00aff537,0x00ce4532,0x007fd283,0xffe44a84,0xfff32850,0x0091c43c,0x0246d074,0x00528b07,0xffa3838e,0xff69fd77,0xff3244fb,0xff9f3b0b,0x00b7ce2a,0x0085dca1,0x00821510,0x007d8f50,0x0044b608,0x00286314,0x0052e36e, -0x00795113,0x00e43b2f,0x01884392,0x014250d4,0x00ffc71a,0x00c1599f,0x0024647b,0x003077cf,0x0073c0ca,0x005e9109,0x0057e7db,0x00308dd2,0xffff1763,0xffed63f4,0x00031971,0x0023323e,0x0008c825,0xffe035f0,0xffe887e6,0x001f9153,0x003591cc,0x0012fa53,0xfff57509,0x0006f63f,0x00173541, -0x00dc0262,0x025f4d88,0x03639798,0x03a77978,0x02f01740,0x01de1408,0x01064e9a,0x00bfe6b1,0x011557e0,0x017d2040,0x01e2b8cc,0x014a3c56,0x00b6ccde,0x00412c04,0x0060099a,0x00983734,0x01443fc4,0x00a0d3a2,0x0053578d,0x008ae211,0x006b3a02,0x0038ce2b,0x0019f7e1,0x002897cf,0x00105594, -0x00094f86,0xffd417e9,0xffc1e40d,0xffca8140,0xffa6463e,0xff662807,0xff4ac1a0,0xffe9ca4a,0xfe701360,0xffdf1058,0x019ec4a6,0x02537b64,0x029b4570,0x01c4f750,0x010b212e,0x0002a852,0x005accf3,0x0070df08,0x008f39a2,0x004f3177,0x0030d066,0x00452572,0x006bdaf7,0x00af189c,0x00b0854f, -0x00d6737e,0x00a6c403,0x009675e2,0x002015de,0x0019216a,0x00213487,0x00190b94,0x002fa8a2,0x0034e520,0x0004aefc,0x00064e76,0x0010daac,0xfff2a5cf,0xffd07a39,0xffd3dad6,0xffc78b02,0xff75d9fc,0xfea893a2,0xfe5b8036,0xff1164e9,0xfef1baa6,0xff7a0012,0xffdeffe5,0x00c62a7e,0x01821b8c, -0x01be6b88,0x0157d7c4,0x011760f4,0x00f99bb0,0x0144b9e2,0x00a7e4ec,0x005c7e9c,0x0079f6fc,0x0016353b,0xffde6f1e,0xffcf177d,0x001f06c3,0x004fd260,0x007e38c0,0x0016a21b,0x002db956,0x0053e67b,0x00252ac7,0x0014b861,0x0009ab12,0x002a8429,0x00332464,0x00079aab,0xffd7ff70,0xffbfce11, -0xffb9dbba,0xffd0b43e,0x0013c4b1,0x005433e9,0x004c739c,0x01c94870,0x0288c8e8,0x0228dbc8,0x012b2556,0x001c3286,0xff603fda,0xff3b7754,0xffa4c848,0xff7b127a,0xff6a0f92,0xff4bc1c5,0xffd50ecf,0x0024f7da,0x003ce5a2,0x0043437b,0x003fd99e,0x000b2e5a,0xfffd0c68,0xffe37c89,0xffd3b9e4, -0xffc15c11,0xffd71db1,0x000728c5,0x0047f483,0x0067392c,0x00799bee,0x009383dc,0x00a6bd0e,0x00bb6f08,0x01281150,0x0166ae30,0x018c7920,0x016c2a50,0x019ca122,0x01e1f59c,0x023542f0,0x01769f78,0x0171a084,0x012fd02c,0x01143de6,0x00fb311e,0x00af9b7e,0x00461c08,0xffd83b93,0xffab09ab, -0xff874a9c,0xff442f3d,0xff3b0497,0xff262dc5,0xff13b9fb,0xff28e931,0xff3a616c,0xff4dc984,0xff84ff5f,0xffb08e88,0xffedca23,0x00189aaf,0x0028ce1a,0x00440eb6,0x0057fc5e,0x005d4863,0x007d23c8,0x00944da4,0x00d4b9f7,0x00fa7ef6,0x010bca26,0x012304aa,0x01529e28,0x015c101e,0x016a3560, -0x01669f02,0x01791d96,0x00c41cfe,0x010a2442,0x00fba1ff,0x00feae2a,0x00f84601,0x00f6fee1,0x0102f6bc,0x010da49e,0x00dd510a,0x00a75cc4,0x0079a5c0,0x00477968,0x001a74a6,0xffee179b,0xfff8549b,0xfffc86d3,0xfffc8416,0xffffe116,0xfff5519d,0x0007313c,0x001957b1,0x003af15c,0x006b01c1, -0x0065fb36,0x008cbec5,0x00b62cf2,0x00c88e81,0x00ebb0d9,0x00f48ed2,0x010f0126,0x011291da,0x0123ac4c,0x011e13e2,0x0107265c,0x010d7c10,0x010a5e68,0x0123cc66,0x00e39eef,0x00de1d39,0x00e48c3d,0x00e40a86,0x00e85d03,0x00e7941d,0x00f06202,0x00d63b7f,0x00c778b6,0x00b760be,0x00a5e9fd, -0x00954589,0x007b80ae,0x0085971a,0x0088a65a,0x008ce2d2,0x009213c2,0x0094a6b1,0x0090172d,0x00e009b4,0x00c8d4e8,0x005b0544,0x00fb63ad,0x00e0695b,0x0060e91a,0x007045ae,0x007bb5df,0x0087d31c,0x009a1089,0x00a7cf67,0x00b8af5a,0x010aff72,0x012c7eb2,0x009397ad,0x00f9ec9b,0x00fc198e, -0xff8c2304,0xffd254b5,0xff5d4bb4,0xffa03bb6,0xff8f8383,0xff9bfeca,0xff86a266,0xff7bd641,0xff6bb4cf,0xff786b7a,0xff75da88,0xff65f78c,0xff6ba2dd,0xff6e45ff,0xff70f400,0xff7b56ee,0xff8119bd,0xff839035,0xff884dd9,0xffa4168c,0xff73e900,0xffe6ff45,0x007faf78,0x01795666,0xffa79af6, -0x00607c20,0x0154d18c,0x01525b0a,0x015136b8,0x0146f1c0,0x01419a2e,0x013e119e,0x01398716,0x00555283,0xff8d79a5,0x017bec80,0x0083058c,0x00c5f457,0xff70e658,0xff9edcfb,0xff90bbae,0xff9b88de,0xff670884,0xff4c13cc,0xff24db4c,0xff45a206,0xff3cb9d5,0xff0f011f,0xff165944,0xff171858, -0xff21c5a0,0xff3c2d73,0xff4f10b5,0xff551560,0xff71b3d1,0xff8e92a6,0xffa20c5f,0x00db9fea,0x00064346,0xffef8d20,0x0013ce10,0x00207a65,0xffc88d54,0xffc765bd,0xffb89c63,0x0007befe,0xffb915c2,0xffb454cc,0xfffd9084,0xffc64f57,0x0024aa64,0x0061dfbb,0xffc39c82,0xfff763cb,0xff868dd0, -0xff85d983,0xff9e30b1,0xffb0188b,0xff5bc6f8,0xff15e7c8,0xfebaf8a6,0xfeffb35a,0xfeee26e8,0xfe9847a6,0xfea54d7a,0xfeb02100,0xfec86268,0xfef8f026,0xff1e7547,0xff28caa1,0xff694581,0xff7fbf7d,0x00125b80,0x006bdf3a,0x0056778d,0x002c31f1,0x00110e88,0x0037fd9a,0xffe44ea4,0x002d0ae3, -0xffe615dc,0x0064ca75,0x0009488c,0x002b668b,0x003268ab,0x0006e8ca,0x0012b99d,0x00c2fbf9,0x0005897b,0x0047c611,0xffbc8556,0xffcf6e8d,0xffb2fd58,0xffb164cf,0xff37c982,0xfee2440e,0xfe50b05c,0xfebb6d4c,0xfe9c5a56,0xfe10158c,0xfe0f7db6,0xfe0103aa,0xfe26fa30,0xfe7433d2,0xfeb769a0, -0xfed9c8a2,0xff3b4015,0xff9206c1,0x0022c6e0,0x00d77c5a,0x0075692c,0x0093cac8,0x00458c08,0x0035360d,0x001837a8,0xffebcafd,0x002cfcde,0x00915bbd,0x0041aa3e,0x0020e215,0x0059386c,0xffd74637,0x001b0e2b,0x01338304,0x004bba45,0xff77a32a,0xfef38d46,0xfebcabda,0xff526ee1,0x0049f15d, -0xff529fc9,0xfed7b9d6,0xfea30c4e,0xfedf58aa,0xfef6523c,0xfea5aca2,0xff3913b9,0xff83bb6e,0xffd3fcd4,0xffb251b7,0xff9869e6,0xff58c0cb,0xff5e1a62,0xff57a91a,0x00001697,0x00d528db,0x006eb123,0x00614ee6,0x005c22df,0x005c650e,0x002e92f0,0x00303588,0x001a2577,0xffe2c8e4,0xfff3d2ee, -0x0040b248,0x00980607,0x00a10104,0x004cd01b,0xff936c2b,0xff58cd52,0xfff72e66,0x01220dae,0xffb8756e,0xff0a306e,0xff42026c,0xfe7e5930,0xfeeb81e2,0x006fd32a,0xfff56ed8,0xfff37f1a,0x0053f0dc,0x00481e36,0x000a8dca,0xffae395d,0xff28fb75,0xfec24780,0xfe5990b2,0xff016e22,0xff55fc11, -0x0017a508,0x003edb31,0x0025ece5,0x004224b7,0x00165f28,0x000b95e5,0x00223e1e,0xfffcda30,0xfff0d462,0x00035273,0x001d1d99,0x00067910,0xffca12c7,0xffddb43b,0xffa0f977,0xffd4c909,0xff310e53,0xfff372a5,0xff965cb2,0xff8a0855,0xff3fa432,0xfde5229c,0xfe0a7022,0xfdbea61c,0xfdb31eb4, -0xfe475b5c,0xfebc0a06,0xfef441b8,0xfe099ee8,0xfdca4700,0xfe36a902,0xfe8c2dbe,0xff31ae9b,0xffe0e4a4,0x0021feb5,0x000cd80c,0x00584286,0xfff7b434,0xffde11d5,0x00502bc4,0x002db19e,0x0017ec27,0x000cc2cb,0x0015ee23,0xfff93551,0xffef72bb,0xffbbe98d,0xffb0aacc,0xffbef351,0xff7729f8, -0xff4f1410,0xff6dd6bd,0xffce77f9,0xfef0dfca,0x00254e1c,0xff4d32ed,0xfe36698c,0xfc447610,0xfcaea470,0xfd7af940,0xfebf7084,0xff34ad70,0xff635c5a,0xff8c92c5,0xff3558bf,0xff2c00fa,0xff8ff618,0xff5bd71f,0xff38963b,0xff11d907,0xff5dc3aa,0xffa91b87,0x000b3840,0x00545e12,0x000f5072, -0x00034c09,0x000d260a,0x001aefad,0x00263226,0xfffbdbd9,0xfff0f188,0x000b0cba,0xfffb666d,0xffd4066d,0xffc7e841,0xffc78ff5,0xff331b1a,0xfed99938,0xfe80e7a0,0xff1ab207,0xfc951114,0xfb079c48,0xfbc0c840,0xfce7dbf0,0xfd6ed0ac,0xfdd35f40,0xfe3951ea,0xfeab9ba4,0xfeccb198,0xfe940db4, -0xfedcb5fa,0xfee67b74,0xff0252c8,0xff52313e,0xff98bd19,0xffb5081e,0x002bc2ba,0x00275dc9,0xfffdc3c9,0xffeb4ca8,0xffc8cf05,0x003d3bfe,0x001080a6,0xfffc7acf,0xfff50a78,0x00230994,0x001499c3,0xffd5efca,0xff84dc07,0xff72cd0b,0xff7455cd,0xff5bfb5b,0xff8f013a,0x00253f23,0xff09ff39, -0x0263d85c,0x00efefcd,0xffc10b09,0xff31e17d,0xfe3ca9d2,0xfdf32a08,0xfde4dadc,0xfdd0581c,0xfecdbd92,0xff4e76ae,0xff62e144,0xff745969,0xff6cc5bd,0xff644a79,0xff55005b,0xff5aba74,0xff520f2e,0xff6786bd,0xff939118,0xfff3a1fc,0xffdcbb66,0xffd45f49,0xfff5a2fc,0x0006f14e,0x0031a7a9, -0x003bf384,0x005369a1,0x007c4f0c,0x008a0470,0x00eb4be2,0x011c7270,0x0129bc8a,0x0127ad5c,0x01123210,0x016865e6,0x01254616,0x00e46eac,0x00b286b5,0x003205d9,0x00020883,0xffa650bc,0xff36dd23,0xfeaf416e,0xfe0f35be,0xfe1c431c,0xfe152a40,0xfe1c8220,0xfe5856b4,0xfe95adee,0xfed7895a, -0xfedd7dba,0xfee7ac0c,0xfeee4930,0xff0abd03,0xff0b4231,0xff3a304e,0xffab372e,0xffe95026,0x001cbce1,0x0039ec89,0x006d828d,0x007f222f,0x00bc1b75,0x009d76a4,0x00e7425f,0x00daced4,0x0114b8d2,0x011939bc,0x012ac094,0x01459ece,0x01772b4e,0x011f55d8,0x012f3f20,0x0047e118,0x002c43c2, -0x0000317d,0xffdb140a,0xffb36714,0xff9bfa13,0xff7af83b,0xff93a787,0xff9fd63b,0xffa7766b,0xffaec26c,0xffae9f03,0xffaf881c,0xffbafc9a,0xffc9ca7d,0xffd5aaaf,0xffe1b6fd,0xfffa3f6b,0xffe677a8,0x0025472e,0xffd25ce2,0xffc74252,0xfffde0ca,0x0005eeff,0xffd74b33,0xffe89be5,0x0002c54d, -0x004c17d9,0x003e9580,0x005735b5,0x00a230cb,0x008cc77f,0x00b5101c,0x00961cfe,0x0058b79a,0x0040130c,0xffd8b414,0xfff7fddd,0xffe2820e,0xffd8d304,0xffce2d4f,0xffc15dac,0xffacc714,0xffb3ffaf,0xffb5d6a9,0xffba7c1b,0xffbb8126,0xffbe7ff8,0xffbfd5ca,0xffc7f1a6,0xffcdc6cf,0xffd5880e, -0xffd7d526,0xffe37226,0xffd95103,0x001356ef,0x007f2ecc,0x0142f824,0xfff0ba07,0x007e82cc,0x015c6606,0x01632672,0x015f9bda,0x015296b4,0x015fe9d2,0x01622d7a,0x0163f3d8,0x00b34fdb,0x00151c51,0x0173d13c,0x00c11f3c,0xffd6df98,0x00d64f91,0x0038f79a,0x010971f6,0x00b22f42,0x00c4600e, -0x00afda90,0x00d67188,0x00dfb768,0x00d84c8d,0x00dfe804,0x00d8b021,0x00c264c1,0x00bfc2d6,0x00be5c9a,0x00bf8554,0x00d13700,0x00d7de21,0x00d84209,0x00d9d3ed,0x00c699e0,0x0112c660,0x003e4471,0xffa12b78,0xfeef9e8c,0x006ed44f,0xffa5ef3d,0xfefa2800,0xfef821b6,0xfefd980e,0xff25aef5, -0xff0136f4,0xfefeb03e,0xff121bb8,0xffabe40e,0x008c4626,0xff18d48e,0xff8cc992,0xff80c8de,0x00f9913b,0x00c88e2b,0x00aaaffe,0x00861ada,0x00db9f7a,0x00fd682e,0x00ed8673,0x0113aa6c,0x0103475e,0x00c3d01c,0x00b7ecb7,0x00b68b38,0x00c4ee9a,0x00fac615,0x010f7782,0x0110dd0c,0x0101f5d4, -0x010af48e,0x00ff6d27,0xffad67c9,0x00944630,0x0065cecd,0x004a3703,0x002aa9b7,0x006ae090,0x008404cc,0x008f0655,0x005d356e,0x0099ea8e,0x00a3e030,0x00660462,0x00654e45,0x00251f30,0x0077f324,0x00d480bf,0x0040cd82,0x00b9d750,0x00de9e52,0x00af9f24,0x0073e612,0x010c012a,0x013aab22, -0x01268862,0x0161fe18,0x01393248,0x00cb6afa,0x00a22fa8,0x00993778,0x00abb1b2,0x010dcce0,0x01371630,0x013d5e54,0x0122dc0a,0x014f66d6,0x00de9131,0x0070469c,0x008a7feb,0x005ed4bc,0x006e1358,0x001a9402,0x0058064e,0x000c6056,0x0094c927,0x004fb998,0x006aa59c,0x001b555d,0x00680340, -0x001dd324,0x003861e6,0x00a59e40,0x008d4552,0x0073b619,0x00faaa06,0x00d7f5b0,0x004c9528,0xffddc328,0x00b22f3b,0x01263dbc,0x0116cace,0x0188e1b6,0x016b97a2,0x00b8bb01,0x00749495,0x005f04ea,0x009eef70,0x014bd7ec,0x0195e758,0x019ec586,0x016ef37c,0x01834558,0x012dbbac,0x00847cc4, -0x0106164e,0x0058879e,0x0098fbd8,0x007c492e,0x004fd7b7,0x001edb45,0x002a023f,0x00bc3455,0x00508ce1,0x004ed810,0x00652d38,0x00087c4c,0x004ec2e0,0x0154c650,0x0114fdb0,0xff260342,0x009f0731,0x0155a424,0x01d97acc,0x02ab32d8,0x0210345c,0x01b00772,0x01a8dc34,0x01de1f6a,0x01a37c7a, -0x00e622ef,0x016a3306,0x013c3cd6,0x008e205b,0x00825e4c,0x008563be,0x01056c3e,0x00ee5601,0x0153f55a,0x010ead24,0x0063291a,0x00f423a7,0x0096f9b9,0x00966494,0x006f47fb,0x002f29d7,0x0042ad74,0x0028c5d9,0xffe9d57b,0x0010f532,0x006746e6,0x00b69c63,0x00cca024,0x00329b8f,0xff5ff675, -0xff2bbe64,0x0033d566,0x021ccce4,0x00b1504f,0xff9ddb45,0xff4595f6,0xff279f02,0xff8fe768,0x0090cab3,0x0066c742,0x00701da0,0x00bb674f,0x005ea5c9,0x0032642c,0x00634710,0x0094f79b,0x00d791e5,0x01349200,0x00ecab54,0x00f16d0d,0x00833d4c,0x001387e1,0x00418617,0x005cd5b8,0x00740f78, -0x0058cc6e,0x003af24f,0x000f610b,0x0003aefe,0x002217d9,0x00454b57,0x001b049e,0xfffdf9bf,0xffc42ddd,0x000035cb,0x0034c3b8,0x0025b122,0xffafaded,0xfff1f943,0xffe74581,0x0064513c,0x016f9a12,0x02113f14,0x02639960,0x0280d1b4,0x0221095c,0x0198f666,0x0144eb86,0x014940ec,0x01768ec4, -0x01a465f6,0x01645c98,0x00f1b7c0,0x005de3c2,0x00846a64,0x00d6bebc,0x00d985fa,0x0064768d,0x00519824,0x005156fe,0x00608783,0x0036ab1e,0x00122c67,0x003a6a85,0x00264b26,0x00009247,0xffd1c618,0xffc96f23,0xffd8c6d6,0xff639306,0xff70c039,0xff518d79,0xffc834cc,0xff3b3c39,0x003c447c, -0x010755e2,0x0128e4a0,0x01d92bf0,0x010c5190,0x008559cd,0x00352848,0xffccae98,0xffbc6f63,0x000f18d6,0xffda6e29,0xffe5c67a,0x00465c60,0x009bb4f1,0x00d3d46a,0x00dab0ac,0x00ec3c0d,0x00cce40b,0x0057f25b,0x000d1a6a,0x00506abd,0x0048a482,0x003b5683,0x003b3004,0x003bfb5a,0x000f39b1, -0xffff6dfb,0x002696d6,0x001c8701,0xfffedbca,0x0031eecd,0xffda6d25,0xff9fb1dc,0xff149385,0xff0298b1,0xfda35e64,0xfd8cdf30,0xff1f0702,0xff864760,0x006cfd52,0x008c823a,0x00c20046,0x00e07b16,0x00c1c671,0x00a7f549,0x006c72fe,0x007242e2,0x004fd77f,0x001ccd88,0xffe95fd1,0xffdfe7a3, -0x00023027,0x002a44f2,0x006d4c2e,0x0078ab16,0xfffc363c,0x0036e3d4,0x00493753,0x001baf1b,0x001e83a6,0x0028a074,0x00323dcb,0x002f21b9,0xffd1ad91,0xffa07672,0xff6e4f17,0xff6af1b4,0xff154b4d,0xff2800d9,0xff6b0866,0xff108131,0x00750b49,0x00d40af7,0x0093c73e,0xffdffc82,0xff847504, -0xff9c6b07,0xffe62ffc,0x004aaeaf,0x00063b75,0xffd1ffff,0xff8dc088,0xffd8a248,0xfffd897c,0x000da154,0x001b7aa3,0x00366e6d,0x003a3c5e,0x0040b622,0x002547c5,0xffde6854,0xffe3f3c6,0x0003c58f,0x0011ddf2,0x0045f300,0x00578f8f,0x0043b31d,0x00664427,0x00835636,0x00b085c8,0x00f42645, -0x011ade8c,0x01311424,0x0113ee86,0x01156fde,0x010b5cb6,0x0112af26,0x010e9368,0x012b15ca,0x00ee0231,0x0094d903,0x0041d786,0xffe75bba,0xff811072,0xff232354,0xff25e3a4,0xff2df7da,0xff217dd7,0xff217c75,0xff1b70a2,0xff142162,0xff251ebd,0xff2de6d5,0xff3ec30d,0xff637864,0xffaca699, -0xffb1689e,0xff9e9256,0xffe62adb,0x001edaf8,0x004c4d41,0x00602d5b,0x00a209a9,0x0097ef01,0x00d3da70,0x00b49a46,0x00e842e3,0x00e5df83,0x011ad8fa,0x012347be,0x01329342,0x013497a8,0x01351536,0x001ccbc5,0x007c15ed,0x00752a01,0x006d7932,0x006fa464,0x00717464,0x007ae500,0x0076e092, -0x005a718d,0x00332b4d,0x0013c056,0xfff0138e,0xffcdf886,0xffa334f6,0xffc3116f,0xffdc0cea,0xfff385c6,0x0005b157,0x00128ac0,0x0037995f,0xfff33ec9,0x002b9008,0x0024b83e,0x00135153,0x0008fe3f,0x0024a213,0x0047a88f,0x00595ea4,0x00521633,0x0090192e,0x00a3b5e6,0x00a7a2f1,0x009eabcb, -0x0077f880,0x0074a845,0x008a1f35,0x003350dd,0x006b341a,0x00548f60,0x0058ad1b,0x0055184e,0x0050e4bc,0x004bdb4a,0x004e79ce,0x004048b6,0x00378c56,0x002cde03,0x00216d80,0x001763c6,0x0003d630,0x00133522,0x0019d168,0x002270c9,0x002d832f,0x00300c5a,0x004ccae0,0x001f514c,0xffd9de1b, -0xff97e654,0x00329daf,0xffdaaca2,0xff84523f,0xff9057f8,0xffa125b5,0xffbb22a2,0xffbb61ef,0xffc95df0,0xffdf4816,0x0000e2d0,0x00508945,0xffcf0c3a,0xffefb642,0x004c62f9,0xffdafada,0x0094ccfb,0xff95f19e,0xffe80d1c,0xffdfe703,0xffe88576,0xffe49248,0xffdcfd44,0xffc8ebdc,0xffd270c6, -0xffcd6a95,0xffbc14a8,0xffc12539,0xffc27b5f,0xffc39b29,0xffcb8215,0xffd00f77,0xffd1c7a8,0xffd71e4c,0xffea202b,0xffaea8e1,0x00a02148,0x011176fa,0x013ba61c,0x005b82d7,0x00fc5754,0x012f1868,0x013f79fe,0x0141b1de,0x01281a3a,0x01452f26,0x01484b3c,0x01416e7a,0x00f486cb,0x003db463, -0x014b780c,0x01224190,0x013e7ede,0xffe26307,0xffdcbece,0xfff0cdaf,0xfff54a15,0xfff8de3c,0xffeeaa50,0xffb97388,0xffcef1f2,0xffba6720,0xff85aced,0xff87f36d,0xff83b03c,0xff8a73ad,0xffa381d1,0xffb9da0f,0xffc1164f,0xffe3b760,0xffde2802,0x001d4076,0x012463ae,0x004b3039,0x0063b491, -0x0054ba15,0x00678ab1,0x0030b74a,0x0023ef31,0x0038ae0b,0x008152a1,0x002b9525,0x00015a90,0x004298be,0x0018dea0,0x0073a777,0x00c150e5,0x00295b98,0x00b03ce3,0xfffb1d87,0xffc77b89,0x0017e5ed,0x000e9cb1,0x001f4c92,0xfffa92c9,0xff8ab5f9,0xffbdc8cf,0xff97d4b5,0xff41974e,0xff4a69db, -0xff4abe0a,0xff5f1e96,0xff80410f,0xffa6b711,0xffab590d,0xffe3bc99,0xffd04ee0,0x0079b53d,0x00d3d4bb,0x0092f5bc,0x005b7830,0x00427ed0,0x00774a8e,0x00153172,0x006cdf03,0xffffc911,0x009af8ae,0x00202060,0x006f1674,0x0057875d,0x003b70f4,0x0049d941,0x00f3d655,0x0073633e,0x00fb26cc, -0x00240d24,0xfff405d6,0x0019de02,0x0006dc52,0x003d1073,0x003b6101,0xff898fab,0xffc983c3,0xff885c98,0xfee5d28a,0xfee175ce,0xfec95adc,0xfeef1f68,0xff3fb611,0xff82a6cd,0xffa0560b,0xfff63f65,0xfff9d46a,0x00a596ad,0x011cb83e,0x0067e20c,0x009792a5,0x00420b4b,0x0034b1ad,0x000d1023, -0xffff79e9,0x003bab82,0x007b8f70,0x00518740,0x00214f5f,0x00413e7f,0xffd874cd,0x004acdfe,0x0131ee4e,0x00ba7c0c,0x0051bfd5,0xffb0e19b,0xff5a72e7,0x0031cd00,0x0119672e,0x001a53e1,0xff8d46a5,0xff402dad,0xff7bca5d,0xff5574eb,0xfe90fb10,0xff6dc966,0xffa63508,0xff78080d,0xffa110f6, -0xffa5df24,0xff474a17,0xff7ac5a1,0xff70e674,0x007cde89,0x0104a356,0x00455a1b,0x007c4f6a,0x0071ee00,0x00821db6,0x003b30bd,0x00329a1a,0x0018222b,0xffd9345b,0x0012bfe1,0x00752cf9,0x00d85087,0x00c133f9,0x006d3852,0xff99184b,0xffdc877b,0x009a68c8,0x00c15cfa,0xff0c8593,0xfef4509c, -0xff2dccbc,0xff6f9b1d,0xfffc1b0f,0x00d36dc8,0x0049fcfb,0x001bbb7b,0x004a7363,0x00773df1,0x0061cc3f,0x00330233,0xffd1d81a,0xff9961d9,0xff635bdd,0xffeb2f91,0xffdc11fb,0x0061e42d,0x0091f6d3,0x006b916d,0x007dd6cb,0x00276ce5,0x000702cb,0x0028c49f,0x000a2f43,0x00089c90,0x002adc24, -0x002dea9a,0x0010c8dd,0xffcf35e1,0xffc0fecb,0xffb0ded6,0x004acac7,0xffbfadbb,0xfffe06e3,0xffc6ae87,0xff9b613e,0xffb1db1c,0xff7c2e78,0xffabc69a,0xff7fda7a,0xff9cdb3c,0xff30b821,0xff23d45a,0xff548bb5,0xfeae7c16,0xfead3e86,0xff19d718,0xff487fad,0xffb3636f,0x000b62b1,0x005a65ef, -0x000ae385,0x00409c2d,0x0046594e,0x000619ae,0x0062c765,0x005d0720,0x003083e2,0x000ea653,0x00277ef3,0x000ac653,0xfff24762,0xffca535d,0xffcd5b2e,0xfffb44e3,0xff9a6e33,0xff79dd7c,0xffd33a9f,0xffcf919e,0xffb4e07e,0x003513d1,0xfffffdb4,0xffe34089,0xff03f1a1,0xff1417c2,0xff1c9b29, -0xff1a675d,0xffae46fb,0xfffa0924,0x00537f0a,0x0014acbe,0xfffff30f,0x0022ffaa,0x00214963,0x00008ed7,0xffc76196,0xfffb474b,0xfffa57b7,0x001d2a54,0x009282e4,0x00625bbc,0x0047090e,0x0047f30d,0x003a33ab,0x0033edbc,0x00025ad3,0x000882b5,0x002920e8,0x001ecc9b,0xfffb0c98,0x000e7f12, -0xffd5069f,0xff6cebcb,0xff5d33ed,0xff2ef3a2,0xff008cdb,0xfe0d36e8,0xfdf531dc,0xfe5b2eb8,0xfe74684e,0xfeae7378,0xfecaa8be,0xff007df8,0xff903467,0xffc2b549,0xff9448c5,0xffe97633,0xffe5fc67,0xffb11267,0xffd0a17c,0xffee91bd,0xfff72d46,0x00445c36,0x003eec1f,0x002c591e,0x0053d7d9, -0x000e61f9,0x00395d03,0x001bde20,0x0016a581,0x0022898b,0x00311173,0x0000ef62,0xffd52e88,0xff7ee21a,0xff766deb,0xff8e16b1,0xff1ff34a,0xff2cd637,0xffa1de95,0xff142a83,0x0145f35a,0x0028fc65,0xfef9c988,0xfedc4168,0xfe9e32fc,0xfebb9c30,0xfee54396,0xff1b9dca,0xff612982,0xff76c24b, -0xff5a379f,0xff78fa10,0xff903b50,0xff9a91a0,0xffaf9d9c,0xffb8ce48,0xffc8dac0,0xffc8e373,0xffcf2afc,0xfff626cd,0xfff59980,0x000be9fa,0x0067368e,0x0047b6d1,0x00417dc9,0x003944b1,0x0043b6e3,0x006b22be,0x00569243,0x00961a70,0x00bc3bc1,0x00ceebf9,0x00d20a27,0x00b64c15,0x00b756d9, -0x008f1526,0x010a979c,0x0099fcfe,0xfff611e2,0xffc26522,0xff3f585e,0xfefa8a78,0xfe9cb2ba,0xfe356154,0xfe72501e,0xfea0a296,0xfecea6d4,0xfed55e54,0xfedd7810,0xfee9ec74,0xfef54738,0xff02eda5,0xff0c8c33,0xff376eed,0xff46fa56,0xff8f2fa2,0xffddeaa9,0xfff6299c,0x000d828c,0x002ed135, -0x0072659e,0x0084aa0e,0x00bd331e,0x009290b3,0x00ea16e0,0x00c3efb7,0x00ff8139,0x00fa7a09,0x01185a28,0x014dd60c,0x018d4e8e,0x0122dd86,0x00bae352,0x000acbda,0xffe4ae5b,0xffcbab06,0xffab3b6c,0xff8d6ba3,0xff736c28,0xff4fd8fe,0xff532750,0xff4753f5,0xff45988d,0xff48a8a2,0xff53fad6, -0xff6026a1,0xff77b727,0xff8ddc2a,0xff9e6b41,0xffb2ed2d,0xffc10e5a,0xffcba17a,0x003889e4,0xffe3f249,0xfff486a0,0x0007e142,0x0016a394,0xfff3b340,0xfff16e4b,0x0010f598,0x004ab281,0x00276e4a,0x002097cb,0x005ad3d3,0x003fa5b8,0x0058f576,0x004e5df5,0x000baef2,0x00251eb8,0xff95536e, -0xffb0045f,0xff9cfc03,0xff924e48,0xff84badd,0xff777dd5,0xff662872,0xff69d1ab,0xff6bc35d,0xff6ce4e6,0xff6db7c8,0xff6c373e,0xff67d5aa,0xff714c00,0xff793d86,0xff82fa68,0xff898844,0xff97fde7,0xff81ce2b,0x0006c3a5,0x0061c8a5,0x00aba52a,0xfff06850,0x006e942e,0x00b89004,0x00c361af, -0x00c07435,0x00ae9c49,0x00c63a9c,0x00ca5198,0x00c96e28,0x007e7edf,0x00002de4,0x00bc148e,0x008730fa,0xff7f3498,0x0052ab80,0xffa1aff1,0x0081a19d,0x004b47b8,0x004cc658,0x00425ba0,0x0042fd97,0x0042d221,0x00447fb3,0x0048cf98,0x0046e6c3,0x003ce76c,0x003bc14f,0x003a64cd,0x00388df6, -0x0048c8a0,0x004fa497,0x00514ae3,0x00534183,0x00515d78,0x0087d07c,0xffa7a99a,0xff6f93e0,0xffb552f8,0xffc1c7f4,0xff659be8,0xffa93065,0xff9c8a46,0xff9bfc27,0xffb6edb3,0xff8dc1e0,0xff883882,0xff8f37d0,0xff67fc5d,0xffd27d11,0xffc488d6,0xff5d27cc,0xff92c1c3,0x004cd52f,0x0067c18b, -0x00398b9d,0x0028c4c2,0x001b01d2,0x001d3e69,0x002948f8,0x003ec9d5,0x003d5f81,0x001aa69c,0x001af032,0x001c86c5,0x001f325d,0x004935c6,0x0055b619,0x0059442f,0x00541fba,0x007b2f06,0x00603238,0xffc297cd,0x0037b683,0xfff8563b,0x00065f2e,0xfff17809,0xfffe3a09,0x0024c6c0,0x0012a0d8, -0xffe72b2b,0x00234649,0x003f5472,0x000f42de,0x0007e38e,0xffeb9624,0x00143de1,0x004e8a42,0xffdb9c39,0x0044e3ef,0x00921841,0x004d10a8,0x0037018e,0x0009f03b,0xfff463f0,0x0017c02d,0x00300ba6,0x00276cf8,0xfff7809b,0xffe71254,0xffdfbc5c,0xffd59858,0x002e1e99,0x0053d784,0x005dc92c, -0x0062d33e,0x00a340bf,0x00749f30,0x0014a227,0x0037b987,0x0026d5fd,0x001fada2,0xffe9e781,0x00149571,0x0001bf02,0x006ae887,0x000aa6ea,0x005a447e,0x0005a2d6,0x002a9767,0xfff2c7f2,0xfffc3987,0x004ac6a9,0x00204cb3,0x002c17ef,0x00784560,0x00a647d4,0x001bfb0c,0xffec4772,0xff93cf53, -0xff9490e0,0xffcfbe38,0x0003381d,0x000dfd49,0xffb8ffb5,0xff97e27b,0xff7d82d2,0xff8db0b0,0x0010ae84,0x00468442,0x005a1e38,0x0064c8ca,0x00cf36c2,0x00cdd74b,0x006bd5a0,0x00caff3d,0x003b889f,0x00639b41,0x00636994,0x00409dcc,0x0025e7ca,0x003eb830,0x00b56d2e,0x00579d15,0x00526e13, -0x004ecb4a,0xfffac5bb,0x00257168,0x0106e262,0x00ad62bc,0xfedd2abc,0xffe55386,0x00b800f0,0x01115d5e,0x01d936ca,0x00c539e5,0x002fc59f,0x001528c4,0x00948d22,0x00aa4f13,0x00257b83,0x013715e6,0x014a1c6a,0x00a5343e,0x006cdc77,0x00592de6,0x00d7eda3,0x0073c955,0x0081b5db,0x0031d767, -0xffebc86a,0x007b3e55,0x005c0e00,0x007438e1,0x0066d676,0x00396674,0x00382968,0x001a1724,0xffe12f24,0x00178704,0x00815767,0x00b32441,0x009b0274,0xffe6ca4a,0xff00de1b,0xfece6dfc,0x000617aa,0x00b924a0,0x001daa0c,0xff4800be,0xff17f7ff,0xfef99f08,0xff44dddd,0xffe6b892,0x00110544, -0x0031d19f,0x0024120e,0x004fb18b,0x003853dd,0xfffb688a,0x001449fd,0x001082b5,0xfff90811,0x0017b710,0x00632792,0x002c982a,0x00356c33,0x005620fe,0x00476115,0x005f2751,0x003a80f1,0x00337f3b,0x001a2345,0x0019dbe1,0x003b1f60,0x003fd698,0x000b6ae6,0xffe0511f,0xffac03e9,0xfff52c91, -0x0022bb33,0x003e8872,0xffbfb854,0xffcf5172,0xffa3e628,0xff961123,0xff4c343e,0xff8b53db,0xffd749c9,0x00769c43,0x00fefa2e,0x00fe2ab5,0x00983d46,0x004f431f,0x00296b67,0x00224538,0x00590bdd,0x006a9f60,0x00494fdf,0x008ad58e,0x00c09c69,0x003461c5,0x00021195,0x0027f5ff,0x001c33e5, -0x00422e98,0x0024060f,0x0010d9f1,0x003196e9,0x002357d3,0x00001e8f,0xffd69110,0xffd619f2,0xfff83cb2,0xff634e0e,0xff93881e,0xff8f237f,0xffc8505c,0xffa142ea,0xff9e563d,0xffb5ca7c,0xff69369e,0xff3b16fb,0xff5d8866,0xff5b7007,0xff872eb8,0xff3195cc,0xff2b38ed,0xff62972c,0xffa23b08, -0xffc53f4f,0xffde92c3,0x0035f8c5,0x004ac1b1,0x004cfaa7,0x006cfffe,0x00892ee7,0x0035487a,0x002a3740,0x005e24ec,0x0058553b,0x004d6ad0,0x0039fea3,0x003297b6,0x0018faa9,0x00058360,0x002d1299,0x002ce6ee,0x00187483,0x005976ca,0xffce4ae5,0xff9932ec,0xff7fc886,0xff99bd09,0xfde4af00, -0xfdac5210,0xfe7d715c,0xfe7ea966,0xfea1baac,0xfe9b6360,0xfed70704,0xff414306,0xffbd3116,0xffdc46c8,0xff50a0e0,0xff93ac63,0xffa07eec,0xff8d17cb,0xffbd4e35,0xffe752fa,0x0030b47d,0x003e0890,0x005744ea,0x00309ddd,0xfff8b76d,0x002855ad,0x0040f89d,0x0022f8eb,0x002862a5,0x00304e75, -0x001cab36,0x0001b16e,0xffa3cbfb,0xff7e8824,0xff5167a7,0xff4cdf32,0xfeeea720,0xfedd56e2,0xff03b2ed,0xfe697546,0xff76fdc9,0xff048dec,0xfed9039e,0xfed5b400,0xff482d9a,0xffae2163,0x001196d1,0x0058fda1,0xfff9f8cf,0xffc54ecf,0xffb10499,0xffbd0e6d,0xffadbf35,0xff909e0b,0xffb02dbe, -0xffd46098,0x0032a17b,0x003be0ab,0x00385ffd,0xfffad207,0xffeb7657,0x0001ebad,0x000fd490,0x0027daba,0x0042f01c,0x0048c2a1,0x00564637,0x005cb82e,0x0061ce40,0x006810ab,0x007834e6,0x00859017,0x008e3039,0x005adc84,0x000828ca,0xffc2cb76,0x00580a84,0x0059b9f7,0x00209455,0xffb7212b, -0xff4f543a,0xff0ba5cc,0xfecd2d38,0xfe9ac428,0xfecf4f90,0xfeffd7d4,0xff239882,0xff28392f,0xff33a287,0xff330dd8,0xff4ba488,0xff582f8e,0xff6d603d,0xff8441bc,0xffc5b62c,0xffbee408,0xff9c380b,0xffdb5430,0x000496e8,0x002a6ee5,0x004718fb,0x00771bfe,0x007fa551,0x00a5951d,0x00910778, -0x00b5ef00,0x00a8ac87,0x00bf6432,0x00b233e9,0x00b679f2,0x00b57d20,0x008c75bf,0xffe6ecf1,0xfff38fc4,0xffeaa97c,0xffd501e8,0xffcd229a,0xffc37a68,0xffb81173,0xff98044c,0xff99a622,0xff8d7063,0xff8a2f9b,0xff851ebd,0xff7e46c8,0xff6f04e3,0xff877c7d,0xff9dafff,0xffb3de7f,0xffc32fcb, -0xffd4dbd5,0xffe7b463,0xffc64645,0xffe4ce55,0xffcc8ec0,0xffd6f427,0xffc6988d,0xffcc9f78,0xffe6b64e,0xffdf9ef9,0xffdc7d26,0x00090704,0x0023f922,0x002591bc,0x001dad1c,0x0005f372,0xfffaac9c,0x00072589,0xff83d2cd,0xffe08c82,0xffcd8860,0xffc5f7dc,0xffbec639,0xffb15c1b,0xffa84dd3, -0xffa108cd,0xffa327f2,0xffa2c34c,0xffa0d057,0xff9ee886,0xff9de968,0xff9888ba,0xffa29cfa,0xffa7a57d,0xffae7e0f,0xffb60b49,0xffba53ee,0xffd30c60,0xff7e4955,0xff5b9f9f,0xff8f89a6,0xff898c71,0xff5b4979,0xff8ac7d0,0xff89d5fd,0xff922bb0,0xffa1595a,0xff95fe5c,0xff99c4db,0xffa5a0a2, -0xff76ac08,0xff9c5901,0xffb1a137,0xff6f53ee,0xffa97b26,0x00697190,0x00e6c12f,0x00454d5c,0x00612290,0x00686111,0x006228fb,0x00785687,0x00797668,0x006966c8,0x006d5137,0x006696d3,0x0055651e,0x0058e5fb,0x0059a8d4,0x005c2317,0x00621ebc,0x0065142c,0x0064641b,0x00685055,0x006628ef, -0x00551e98,0x00e98b10,0x00d97111,0x002ce9c8,0x00d10b0d,0x00d53df6,0x00355e58,0x004d383f,0x00530fb9,0x0046b2b1,0x0063b786,0x0068199a,0x00656bee,0x00d57d42,0x00c84d00,0x00455578,0x00e24109,0x00cb7d79,0x008aa507,0x005cc1b0,0x0078bcd3,0x00688fc5,0x00a7e9f0,0x00b786ca,0x008ff969, -0x00998836,0x0081ef44,0x0050e73a,0x004cecdd,0x004a1d88,0x00548270,0x006b779e,0x007d1ab5,0x007f0c41,0x009272ef,0x007a2d02,0x00b22b44,0x00b77f56,0x008a59ac,0x00afaac5,0x0073e50d,0x0076643e,0x00833ec5,0x0082f141,0x00ac151b,0x00bb8c29,0x009e01d2,0x006ed390,0x00715bdc,0x00684fcb, -0x007e2f55,0x00c5e97b,0x0098dbc3,0x00e2ea05,0x007f7290,0x0059032c,0x00a07ea3,0x006e2935,0x00eca9d4,0x01055c42,0x00ac0792,0x00c8b923,0x009a6d1e,0x0048f791,0x004b019a,0x00451ce6,0x005a312c,0x007901d8,0x009689d3,0x00905755,0x00a48bc3,0x008901ca,0x00cc8aeb,0x00e0446c,0x00a7ba8f, -0x00842557,0x00695367,0x0072b281,0x004522b3,0x0074c533,0x004f8948,0x00995622,0x0051d61f,0x007cee05,0x0062e1fb,0x004e4a2b,0x005e65b3,0x00cbdba2,0x00a93982,0x00feb585,0x0085fd36,0x004b831c,0x007a8cf5,0x003ff6d0,0x010dcd50,0x0165e4b0,0x00f49fdb,0x01107538,0x00d1f98e,0x00321632, -0x001bfb2e,0x000e8528,0x003ce235,0x0092d4e4,0x00c566bc,0x00cb77ca,0x00ea560f,0x00bd1de1,0x0110d3ae,0x00feea37,0x00893de7,0x008ce6e2,0x005930b9,0x00446bdd,0x000dd420,0x001fd1fc,0x0045dbf5,0x0072b69d,0x006539d3,0x00368f5d,0x0027b9a3,0xfff3a4d8,0x005c06a9,0x00ed7778,0x00e6649b, -0x00a46df7,0x00beb298,0x00c0c3b4,0x015713a6,0x01e992ca,0x013d9ac0,0x00e5b531,0x00d12598,0x0084b003,0x003a9df9,0xffb0b11a,0x008b419d,0x00944d46,0xffdf0af1,0x001787ff,0x0022d773,0xfff8706e,0x00336cbd,0x003d9bbc,0x00c25ec3,0x00be5511,0x00590ec6,0x00852221,0x007ff687,0x008f3c83, -0x0049533e,0x0032440f,0x00176af4,0xffdd1f92,0x0040b78b,0x00a99086,0x00e1ec15,0x00aa4843,0x004a61e6,0xff86ae53,0x001bc5a7,0x00f80584,0x001c4490,0xfefc7e1a,0xff3bac09,0xff3bbf0d,0xfff0dfe2,0x004a442d,0x00325330,0x0067c606,0x0050aa07,0xffeca21a,0x0086d024,0x009e6e66,0x0071579e, -0x00679b9b,0x008aecef,0x00c1de31,0x00f4e499,0x00ad3f2c,0x008853a2,0x00905d46,0x00834174,0x0093ed80,0x0056ee31,0x002d3f34,0x0034978d,0x001699ab,0x00202d41,0x004d7fa2,0x003e4064,0x00113ffb,0xffcb9b9b,0xffe321fa,0x002653ad,0x006d514b,0x00a87058,0xfff31a6e,0xfff30d76,0xffe3f3f1, -0x004bc2a7,0x0131bee2,0x01a0e180,0x01dc676c,0x01f0a4ca,0x011acea6,0x00878bdb,0x004f4d62,0x007539bd,0x0091af9d,0x009a70c7,0x00a70fcf,0x008c556c,0x00368b4d,0x0089d888,0x005e788a,0x005f45e4,0x006d6788,0x00327e78,0x0058abbc,0x0070f8ee,0x00383792,0x001ad6ab,0x002c71df,0x001ade5e, -0x0006be62,0xffe478a3,0xfff2b690,0x002956d7,0xffa8b84d,0xffaef8e1,0x001657e1,0xffdc9e69,0xfff6cb30,0xffe3a23c,0x00ceb43b,0x019117fe,0x01dd5ef4,0x01a42236,0x00fa30f8,0xffac9da4,0x000913b3,0x002ae4b5,0x0053e841,0x0094c787,0x009520a5,0x0051f82e,0x00b758ce,0x00ce0828,0x00a8556c, -0x00b0522e,0x00713f6a,0x0051648b,0x0089db11,0x00809165,0x006df4ed,0x00654d63,0x004b2fa1,0x004049cc,0x000fb6b8,0x001cbe74,0x0035ecbb,0x002f1f58,0x0012f694,0x003b9892,0xffd76f22,0xffb81c2d,0xffb7634b,0xffcbcd1e,0xff1ad580,0xffffc482,0x00de3a2b,0x00cd460d,0x004c6cc8,0x005a516d, -0x004a4096,0x002e5996,0x00a842a9,0x00d00400,0x00ca8f22,0x00a8c8e9,0x0086b67c,0x00728a72,0x003351c5,0x001fcfe6,0x003534be,0x00654819,0x0062f9ca,0x004bd043,0x007b2ab7,0x00571eaa,0x0048c516,0x0031c9a5,0x002f18ba,0x00435f3a,0x002076ac,0xffea2385,0xffce1f3e,0xff9e041f,0xff9687f4, -0xffa09114,0xff4c6efe,0xff32754b,0xff2b4385,0xff5b263b,0xffa0d9ec,0xff91e5c1,0xff28ff15,0xff57c086,0xffb23c22,0xffffeaf0,0x0039f602,0x0091b01a,0xffceb273,0xff789861,0xff89a4a7,0xffb99bf7,0xffeebf9c,0x000e82b2,0x0036906e,0x0047b213,0x004f0c8a,0x004dbb94,0x00314d4f,0x000072ae, -0xfffc97c9,0x00168ef1,0x00718d1d,0x005831ea,0x004b5538,0x00579499,0x0061ba0f,0x00614e19,0x001da629,0x002cc879,0x003e9034,0x0048e83a,0x0071b420,0x00665b14,0x000e815e,0xfff7b912,0x00abd73a,0x0042f3ad,0xffddd405,0xffb65337,0xff597928,0xff4ebcbe,0xff3598e0,0xff2d624f,0xff632595, -0xff94d961,0xffae2ff2,0xff871c34,0xff664b65,0xff430476,0xff587b99,0xff698fd6,0xff79b4b5,0xffa74452,0xffc6a51c,0x0008fd03,0x0022ac60,0x00184971,0x001a8b77,0x002bab83,0x0050a56b,0x005d5f37,0x00837016,0x0085bd06,0x00ced4ab,0x00a40e8f,0x00b89058,0x00aed0ce,0x00b29c5b,0x00d2208c, -0x00ea4553,0x00ab6dfc,0x00208802,0x00129998,0xfff1e950,0xffed08f0,0xffdb9101,0xffcdf7af,0xffb9f680,0xff9ca8ff,0xff80d5a4,0xff5cc259,0xff492e04,0xff3bc391,0xff37d5b8,0xff32c12a,0xff488b41,0xff593aa4,0xff669bc9,0xff7638f3,0xff755b57,0xff908be9,0xffe62a50,0xffd9ff17,0x00066924, -0x000447c8,0x00234480,0x0031c12b,0x002aa809,0x003f4229,0x004ea4fe,0x003c0c5f,0x002d44b3,0x003d4eab,0x002e91ec,0x00247570,0x002bf534,0x000c97db,0x001a583d,0xffc4f723,0xffc55afa,0xffbd7677,0xffb4f143,0xffaa6b6d,0xffa24733,0xff9d8613,0xff9650c1,0xff920f70,0xff8affea,0xff84b515, -0xff7ce490,0xff70cdbf,0xff7a715b,0xff80c933,0xff87f07a,0xff901245,0xff9ab605,0xff8be919,0xfff91780,0x000cd74c,0xffced28e,0x00093e3f,0x0028594c,0xffd96ec7,0xffe1a968,0xffe42382,0xffdc97c3,0xfff0a4c5,0xfff5cf14,0xfffa181a,0x002b62ee,0x0018debd,0xffd68468,0x00227f33,0xffa0fe3b, -0xffc99d25,0xff963661,0xffc81cf2,0xffdcc66e,0xffcfbb4d,0xffd15179,0xffb9a560,0xffb15829,0xffb1851a,0xffb40fa8,0xffb528a5,0xffb47b8e,0xffb5fe79,0xffb65e19,0xffb52392,0xffbd9436,0xffc1dfb4,0xffc2aaa5,0xffc5bbe7,0xffd6272d,0xffced4ce,0xff9efac9,0xffeb50d4,0x00c9d05c,0xff882660, -0xffd4c6bc,0x00ab593c,0x00a53939,0x00a225c3,0x009efe97,0x008f8db4,0x008a7a3d,0x0080c5e3,0xffd150bc,0xff7fd146,0x00bf90ed,0xffe5cf7f,0x00352e47,0xffac73c5,0xffecbd04,0xffcf1e6a,0xffcd3537,0xff88dcf5,0xff71707e,0xff7afe4d,0xff82176a,0xff89229a,0xff81415c,0xff8715c3,0xff89dc20, -0xff875877,0xff9a05d1,0xff9e7d10,0xff9e1bf0,0xffad1034,0xffd291cd,0xffc86ea1,0x004d1fb0,0xfff9ce73,0xffd9ea42,0xfff32340,0xfff4041c,0xffc54f70,0xffe56243,0xffd0027f,0xffd138a9,0xffd4b5c9,0xffe0b46a,0xffdfee2f,0xffce5f82,0xfff298a6,0xfffef971,0xffd89137,0xffd381f4,0xffcab9f7, -0x000881e5,0xffec7512,0xffe772da,0xff648c6c,0xff2403f3,0xff3197ec,0xff3852b0,0xff427795,0xff44186a,0xff47bbab,0xff472d25,0xff38e427,0xff643a20,0xff7c2a86,0xff7bcb7a,0xffa8eaef,0xffce12ec,0x000f2319,0x00113c5c,0x0017a1d8,0x001c0840,0xfff24ab8,0xfffa6500,0xffe1d85d,0x00287941, -0x002bb824,0x000f8454,0x0038ed12,0x001caf52,0x00020adb,0xfff1ec5d,0xffefb5ec,0x0031a53b,0xffe462c4,0x0025391f,0xffe8c53f,0x00319b15,0xfff56c4d,0xffe170ed,0xff124368,0xfebf23b4,0xfedb2300,0xfeea2058,0xff0cd773,0xff00984d,0xfef1c462,0xfedd6ef2,0xfecfcfc8,0xff0a247e,0xff1ff301, -0xff27a3c2,0xff77bb52,0xffe78f73,0x00491382,0x00861fcd,0x006b8d1b,0x00561644,0x002b5628,0x0033ad1c,0x000edb9f,0x0023362d,0x00549310,0x00873412,0x005c9ace,0x003f008d,0x0025eb53,0xffed437b,0x0009c88b,0x00a7442b,0x00429dbe,0xff5f3aaf,0xff75f65b,0xffdb7bc3,0x00190f88,0x00affe7e, -0xffa62ae7,0xff272137,0xfefe298c,0xff1ba606,0xff4adccf,0xff411130,0x005e2b4f,0x00a6a8eb,0x004b23a4,0x0023a7c9,0x000f8f60,0x002328af,0xffcec6b9,0xff91bdb3,0xff92e8c0,0xfff7a127,0x0010dca4,0x00353844,0x005295db,0x0067a5d9,0x0051a42f,0x002758b8,0x0008a19b,0xffe12c0f,0x0038e287, -0x00a18c1a,0x009af9a3,0x005ae372,0xffda03d2,0xff25aab4,0xff20f055,0x003f1d0c,0xff212127,0xff6379ed,0xff31aae6,0xff307ce3,0xfefbc342,0xfefcb94a,0xfefdf95c,0xffcc2ca6,0x000b50f0,0xffaf33c4,0x00464c2c,0x0048ddc4,0xffebef80,0xff9fa1b9,0xff47ddf0,0xfeeb4c1a,0xff7eb3d7,0xffd9399d, -0xffee3bd3,0x005200cb,0x0054a1cb,0x00419a08,0x004a1778,0x00246c00,0x002d7b8e,0x001759ff,0x0025b0c5,0x00539318,0x00348087,0xfffd11c2,0xffbd4a5f,0xffe7efb9,0x00056264,0xffe3ba8f,0x006eeb8a,0xffd975bc,0xffaa001e,0xff8bf5c8,0xff24f1bd,0xfe187908,0xfdf26bec,0xfe17e612,0xfeae4b64, -0xff8da357,0xffe61e71,0xffacca86,0xff4480b6,0xfed996b2,0xfeb49992,0xff3d717d,0xffc41ecd,0x0014b6dd,0x00618071,0x005c7261,0xffd1036e,0xffcad9f6,0xffeb114d,0x00014a8a,0x00239a01,0x000f66d2,0x001b44d4,0x001dae75,0x001097f3,0x00039cb1,0xffe039d0,0xffedff3a,0x000e4a03,0xff81336d, -0xffca932f,0x00060a6f,0xffd86ad9,0xffe9890a,0xff89b43c,0xff061991,0xfe6eb9aa,0xfd88796c,0xfe2dc17c,0xfe98fa30,0xff10b25d,0xff0e688a,0xff0e5550,0xff017327,0xff6e3ace,0xffa3ea63,0xffa8777f,0xffb8df02,0xffaec8bd,0xffba5c77,0xffd6b7c8,0x0009215d,0x000f8409,0x00576684,0x004b73f2, -0x00461c18,0x004c5f7b,0x00326814,0x002ac0fc,0x001589ee,0x0007f016,0x00251317,0x002462b5,0x000e095a,0x002f5136,0xffd5a6ee,0xffa6f010,0xffc4a2b8,0xfff44777,0xff0e2394,0xfe8f846c,0xfdeed0e4,0xfdd8fc60,0xfdae9f80,0xfdac6bc0,0xfdda9178,0xfe5315fc,0xfefa41d2,0xff2c5a75,0xfecd2c24, -0xff233d10,0xff502dd3,0xff69b495,0xffb86a97,0xfff90f1d,0x002d4ea3,0x0050ca81,0x003852ef,0xffe60365,0x00171c75,0x0016524c,0x0037fa41,0x0027c1e7,0x0022261c,0x002fba77,0xffffbc17,0xffd2388d,0xff9b49f0,0xff8223fd,0xff70a20d,0xff6049f3,0xff375ac3,0xff0de2a5,0xfef7bb38,0xfe7feec2, -0xff34b2b5,0xfe4603c8,0xfe14d19a,0xfe80f1b0,0xff0ce1fc,0xff8adb6b,0xffb89c06,0xff82f66b,0xff6df085,0xff806263,0xffd3ecb4,0xff9f196d,0xff8532da,0xff82e155,0xff925d35,0xffb61af4,0xffeffc18,0x0016bcee,0x002e4f6e,0x001cb176,0x000427d2,0xfffd926d,0x0005c89e,0x000569ce,0x00242679, -0x0043fe9a,0x004c0c13,0x003bdc6d,0xffff3654,0xffe66efa,0xffe0737e,0xffd5f630,0x001920d9,0xffe0d7d8,0xff867167,0xfefc3382,0xffbc0efc,0xff8a8dbc,0xff5e7cf2,0xff29959f,0xfee5e7a8,0xfecaaef2,0xfebb1716,0xfeb21c70,0xfee1c34a,0xfefc5e90,0xff1d8fda,0xff2f6731,0xff4f3932,0xff64f82c, -0xff785dfd,0xff878a19,0xff980f39,0xff9c1622,0xffa96302,0xffb16c6e,0xffc849d2,0xffea5e6d,0x000150e0,0x0012ae20,0x0031f5b6,0x003ca877,0x0061fd69,0x005c18bf,0x00845dd4,0x006e9382,0x0069837e,0x004d766c,0x00343309,0x002f50d5,0x003763ce,0xffeced56,0x0019d1ca,0xffae8f4e,0xff9ab086, -0xff77f147,0xff5e9763,0xff41055c,0xff1e9c07,0xfeef1d68,0xff018b11,0xff0fd542,0xff1cffa2,0xff2d6c15,0xff346cb7,0xff353421,0xff443f66,0xff52f0b3,0xff6477cd,0xff71d3b6,0xff89c322,0xff846065,0xff997805,0xff90d55a,0xff8588d2,0xffb051aa,0xffb29783,0xffa6fd35,0xffb068ed,0xffa7fdea, -0xffbf26f6,0xffc13c87,0xffd9e14f,0xfff0d503,0xffe71bb3,0xffedfed1,0xffda8fae,0xffc3c653,0xff59f434,0xff72247b,0xff71ecff,0xff5fee63,0xff555cbd,0xff461001,0xff3b75b4,0xff2af469,0xff3743b1,0xff3a9366,0xff3ef7de,0xff4163ad,0xff468679,0xff4c0819,0xff52b132,0xff57a84c,0xff5d5500, -0xff614757,0xff6962f8,0xff723230,0xff49e8af,0xff6e80fa,0xfff362ae,0xff481053,0xff7490cb,0x000bbcde,0x00061275,0x00049484,0xffffa6a9,0xfffbba5a,0xfff80ab1,0xfff92dff,0xff8d3241,0xff583a10,0x000aa1b8,0xff8fd693,0xff3b1f15,0x00ba2c97,0x00975382,0x00cb069c,0x00a3b6ce,0x00b27565, -0x009e150d,0x00bfc9ea,0x00c75977,0x00c2f38a,0x00c0feae,0x00bc337d,0x00b56595,0x00b28620,0x00b20a47,0x00b42882,0x00b9ec62,0x00bb79dd,0x00b8f883,0x00b9e718,0x00a8bbff,0x00cc6f8f,0x00959e40,0x00227f75,0xff4a7f76,0x00b099d0,0x00294793,0xff56e276,0xff6725fd,0xff6ce827,0xff7789c9, -0xff794a7b,0xff79a807,0xff7bde47,0x002fab42,0x00c00ced,0xff5e1d6d,0x001a03b2,0xfffbef1d,0x00dbc19c,0x00acf798,0x00b019f1,0x008b28fb,0x00db62bc,0x00f73fdf,0x00f2ef15,0x00f63f39,0x00ecedc7,0x00d828ff,0x00c8b5e0,0x00c8091a,0x00d0cef1,0x00e8302d,0x00ef93aa,0x00e8baa4,0x00e2af56, -0x00d27a97,0x00dddc26,0x0003e0c7,0x008b57f8,0x009704a8,0x005959b7,0x0048413d,0x0081de1d,0x009cc84c,0x00bc2d12,0x008b3aa6,0x00b2f0b2,0x009dd8d4,0x00611399,0x0073b913,0x0046359a,0x007321bb,0x00b96d6a,0x008970e3,0x00b3e4b6,0x00cb02d6,0x00caa48f,0x007848f2,0x010f6956,0x0143f472, -0x0136e308,0x0137e614,0x011b7e48,0x0101ae5c,0x00e4f40b,0x00ddcb5b,0x00e7f3f3,0x010c0e7c,0x011a9620,0x010c1c8c,0x00faf32d,0x00f59b4d,0x00b93c47,0x0084d27e,0x007d41e7,0x007a9857,0x00613111,0x0037283f,0x004ed2e2,0x0053ac79,0x0094edc0,0x005c4d9e,0x0070c1e9,0x004ff379,0x00487b7b, -0x00360af5,0x004184da,0x0064c19d,0x0086fcff,0x0099cefb,0x00b99474,0x009fb8c5,0x0082a169,0x00150b3d,0x00f1acf1,0x015ea31a,0x017046f0,0x017b7f82,0x0178336e,0x013381e2,0x00f21b1f,0x00ea0059,0x0107cac0,0x01604498,0x01735e90,0x015a6186,0x013f611c,0x011d5fc2,0x00fad8f2,0x00902cf0, -0x00a59928,0x00696383,0x0062f6b9,0x004d2dda,0x00102bb9,0x0040991b,0x00549e12,0x00747d83,0x0066e5ec,0x00458af8,0x0013cd99,0x000c3091,0x00442dda,0x009eb772,0x00d0a417,0x00185995,0x010ed0bc,0x01a4fec6,0x01e4b972,0x021a4b14,0x01c5b180,0x01a0a600,0x01b9a6c8,0x01194138,0x00c94342, -0x009ca87b,0x0149d2c6,0x013eb968,0x006afa83,0x00877c8a,0x00981be7,0x00cd69cd,0x00cfa263,0x00e31e94,0x009fa120,0x00308bd5,0x006ee41c,0x00771be6,0x007d3f9a,0x0081525c,0x005f2431,0x002d69c5,0x00103334,0xffee8e3d,0x006d7e1c,0x00c82d26,0x00acaff6,0x00738922,0x00079acc,0xff731f1c, -0xffc130f7,0x00f4b4f7,0xff8f256b,0xff9fd442,0xffaee4f0,0xff6326dc,0xffde1420,0xffcc7d71,0xff28ae0e,0x00575938,0x00914029,0xffe91801,0x00532f11,0x0077100f,0x00a74709,0x00ca79b0,0x0103882a,0x015724a6,0x0143a144,0x0115cfa6,0x006c42ea,0x004c5979,0x0066b3c0,0x00732ab3,0x008b755c, -0x005f142a,0x003d3375,0x001d3c35,0x002fd1ac,0x006bfafc,0x00469942,0x000cde0c,0xffd6f997,0x00115af5,0x006e35f7,0x0033399d,0x0152b558,0xffc60b67,0xfff76755,0x0000e7e5,0x0081b0a3,0x01de9db0,0x0219735c,0x028feefc,0x02bc5b30,0x02221dec,0x017aff64,0x01060d28,0x0190e046,0x01a42a82, -0x0174a09a,0x01423b06,0x00e3baa5,0x004cf930,0x008176bf,0x00970c66,0x0060154b,0x0050505b,0x0033ca0e,0x002442bb,0x00514867,0x00270765,0x0028e0c3,0x002f844b,0x0022d547,0x0017fcdc,0xfff88707,0x0010aa9c,0x0032e8d1,0xffc23c14,0x00050de8,0x002934e9,0xffe16012,0x000f8123,0xffee2948, -0x00fc1a21,0x01bc7670,0x02e0acb4,0x0258a434,0x018d2608,0x0043f766,0x000bafdb,0xfff294d3,0xffdd2808,0x0053691c,0x00854d75,0x0072db40,0x00bd54c5,0x00eee955,0x01065992,0x00f1dbba,0x00ad9573,0x00576190,0x00421acf,0x0062f5f4,0x005e6d18,0x0062f09b,0x0048193e,0x00385a18,0x0018474a, -0x0017f621,0x002ee3c3,0x0025f17b,0x00114d87,0x00340e21,0xffec9d2a,0x00053eeb,0xffe21eed,0x002d0f02,0xff013410,0x00716508,0x01a698d0,0x017b3bc0,0x01334e82,0x010c414e,0x00ffd8f5,0x00ec3450,0x00dfb1ee,0x00d222a7,0x00dc1a9e,0x00c909a0,0x00be34aa,0x00a62e3e,0x007185e5,0x005a3b56, -0x005ecd6d,0x00569e16,0x005d6b4a,0x00492e8b,0x0058ebff,0x006eac7c,0x003dc4b4,0x0032d336,0x003358b8,0x004ff72e,0x00057ab4,0xffde2c48,0xffc4a10b,0xffc0c722,0xffb0aed4,0xff98e66f,0xff6fed99,0xff3afe7a,0xfecf6e30,0xff5aa74d,0xfe78c7e8,0xff32425b,0xff8b3a25,0xffb5a1a6,0x002bf1fc, -0x0095fd9d,0x00b85879,0x00b5f4f7,0x0003b3ac,0xffc063b8,0xffdcae5b,0xfff72a57,0x0024ecbd,0x0050940a,0x00695b91,0x0088265f,0x007f6771,0x00980b05,0x00771f7e,0x00133f58,0x00182c5e,0x00227039,0x00315630,0x003cf8d6,0x003bcdca,0x004ed016,0x0059bc6c,0x003e6ee4,0xfffb46db,0xffe146b3, -0xffd7ebbd,0xffd53b25,0x000a7014,0x000d4dff,0xffa5a365,0xff77db5b,0x00071761,0xffe1c2bf,0xffe013c1,0xffd0b4ef,0xffc2293b,0xffd4e9a3,0xfff07cf7,0x00215f68,0x00244446,0x00240306,0x00146da3,0xfff2ec9e,0xffd39204,0xffaf01a5,0xffc62b3b,0xffd6a974,0xffe79e99,0xfff32b79,0x000bd622, -0x0015e3d7,0x0006e809,0x00077fe7,0x0010e297,0x0020bb96,0x0027b3c0,0x003ee580,0x0040f9c4,0x0067f88f,0x007dec41,0x0065b66f,0x004a0bb9,0x003b9c59,0x0026a6ee,0x00208bf4,0x000f4cbd,0x00078ad3,0xffad3ccb,0x000e0c1e,0xfffe7318,0xfffdb14b,0xfff8f1d4,0xfff5e30c,0xffea25f5,0xffdd3b72, -0xffbc08ff,0xffa06679,0xff894ae9,0xff7391de,0xff5f1dcc,0xff42d89d,0xff576b29,0xff63f76e,0xff7458b6,0xff82be72,0xff88f352,0xffa91a0e,0xff95be10,0xffd8e023,0xfff8c219,0xffeceeb4,0x00002be9,0x002fc7fc,0x00350e01,0x003b52f5,0x002918be,0x003dfbf0,0x003ed69f,0x0033e5b8,0x002f1b8b, -0x000a6b46,0x001235d8,0x001978ea,0xffe216aa,0xfff5694e,0xffdef6a3,0xffe16ddc,0xffdcfc3c,0xffd8e86f,0xffd6aae2,0xffd8ebe8,0xffcf74ae,0xffc79e7d,0xffbe248d,0xffb4b5b4,0xffaccbb0,0xffa00c44,0xffaa5dae,0xffaf8be1,0xffb44b88,0xffbcd828,0xffbfba1c,0xffcd7395,0xffceaada,0xff9a4a7d, -0xff25bb3e,0xfff2e84b,0xffaee2d3,0xff2a2575,0xff2f764d,0xff399aeb,0xff43f922,0xff4b1cd3,0xff515a7d,0xff5d3060,0xffb79a87,0x0000d3b2,0xff3b804c,0xffa2de8d,0xffc923af,0xffaaccd6,0x000d6565,0xff7a783a,0xffc3c328,0xffb44b23,0xffb907e7,0xffa4a4fa,0xff9c1851,0xff97b2b4,0xff97bac6, -0xff99256f,0xff9f1bff,0xff9f8ab9,0xffa10bdc,0xffa1e3f4,0xffa20e4d,0xffa27ab5,0xffa20f14,0xffa3a897,0xffb7887c,0xff824e1d,0x0014f0d2,0x0094b8d8,0x013e272e,0xffe02e6f,0x007fc860,0x012339c8,0x012ea1c6,0x012d4af0,0x011195ba,0x012378a8,0x01219474,0x010fda50,0x007926ea,0xffc6cd4f, -0x012c58ea,0x009cd33b,0x00cfd9af,0xff8ea741,0xffbaa995,0xffbf090b,0xffbf6e98,0xff8ff598,0xff7922b1,0xff74a53a,0xff70b0b7,0xff7763fa,0xff82c98d,0xff7f6f69,0xff7f1f57,0xff7d0922,0xff7d3dfc,0xff7f13b3,0xff7c8d76,0xff90c098,0xff988b12,0xffae2886,0x00c47309,0x0002b332,0x00157d90, -0x00159b28,0x002615ae,0xffe8eee0,0xfffa1182,0xfffa3e8d,0x001af3c0,0xffe89aed,0xffd3f348,0xfff4e5a5,0xffe2ae93,0x002a1927,0x0033b260,0xffcb6c17,0x0028d0c1,0xffb8dd54,0xffc42f19,0xffe14cab,0xffce39c4,0xff7e386a,0xff4d1dd2,0xff3570c5,0xff2d9a30,0xff359b0b,0xff5a1920,0xff583b5f, -0xff5e4449,0xff5cab2d,0xff5a4a21,0xff608a86,0xff574289,0xff835eb2,0xff762ee0,0xfff39907,0x004b9696,0x002f84ab,0x003b4379,0x0000bbb0,0x003363f0,0xffe9cfe5,0x0066febd,0x001649f3,0x0045c829,0x00258113,0x00483c33,0x00089db6,0x00135039,0x000bce46,0x00466c0a,0xfffa481e,0x005b2608, -0xffb608e4,0xffd15e5a,0xfff16008,0xffda538c,0xff6b18ae,0xff2a6468,0xff11bf60,0xff088d59,0xff27f1a8,0xff484c12,0xff2c3bba,0xff1e0815,0xff0db3bd,0xff131f2d,0xff153e97,0xff107055,0xff582f01,0xff7a4a58,0x0000b28c,0x00a09b71,0x002728e5,0x007fe72d,0x0012c975,0x000f5858,0xffe396dc, -0x002b424e,0x00674b6e,0x004fcb53,0x0056653e,0x00222a31,0xffff3c20,0xffe9085f,0x000dd881,0x0061b2aa,0x001dfbbc,0x000af25b,0xff9b0de9,0xffa3bf47,0xffdf739f,0x002107bb,0xff7991a3,0xff32ad84,0xff134167,0xfea6a020,0xfe9d7ce0,0xfeac9dbe,0xff7f4a31,0xffe9d575,0xffe8a6d0,0xffe3bd0b, -0xffdd84d1,0xff9c671f,0xff926881,0xff45ddae,0xff9e8f13,0x003fe4f1,0xffe00192,0x00385c09,0x0044fb2f,0x006ca7f0,0x006e3f7b,0x001b6a7a,0xfffcb929,0xfff2ef42,0x006b43a3,0x00ba26c4,0x007e8d15,0x00397e6c,0xfff29d2a,0xff6e0e09,0xff96923b,0x00c06385,0xfe586132,0xfee16e8e,0xff42030f, -0xff6f2d2f,0xff684401,0xff40af0b,0xfedafd44,0xffeedbc0,0x0032f52c,0xff9a0003,0x00361810,0x0051ad7c,0x002b6ca3,0xffc5fad4,0xff6c9851,0xff0a4215,0xffa53e2b,0xffc894a7,0x00006f43,0x00666d85,0x00509cfc,0x004b719c,0x004fc97c,0x002955b7,0x002c05b4,0x001a02d0,0x00329577,0x0069ed2d, -0x002debb1,0xffffaf5c,0xffb9fc70,0x001b5796,0x001c8019,0xffe6d147,0x00c75f80,0xffd62421,0xff96d9c1,0xffb2fcf2,0xff8148fc,0xfeda398c,0xfe60f5f6,0xfe57fb88,0xfeadf394,0xff092a23,0xff51dbdb,0xff462c54,0xfefe2888,0xfea81592,0xfe987b64,0xfedd4faa,0xff6f0e02,0xfff58491,0x002774f1, -0xffe90077,0xffba4486,0xffd941d6,0xffc92f53,0xfff8d970,0x001371c0,0x00062889,0x0024b86d,0x00194d65,0x000619b7,0x000d4125,0xfff23422,0x000ecc0b,0x002c9875,0xfff1a3dd,0x001a529a,0x004a8fba,0xffcf0119,0x0036a3b0,0x00089566,0xff5692de,0xfef19ae4,0xfe4a9316,0xfea503ec,0xfeecb320, -0xff2d9275,0xff6413b1,0xff762d99,0xff3e35f0,0xffad4dc2,0xffe22384,0xffe563b9,0xffbd38f4,0xff9e252d,0xff979331,0xffae9292,0xffc98287,0xffff6ac8,0x0063e10a,0x002f1443,0x00255275,0x00468fba,0x003031f6,0x00201b71,0x000d39c6,0x0009773e,0x001c27d1,0x000ed60b,0xfff75961,0xffe81f73, -0xffe9b5f6,0xffd1cb16,0xfff5528a,0x00229a94,0xffe20f91,0xff69cb28,0xfe7ff86a,0xfe8f1cea,0xfe590ca4,0xfe537ea6,0xfe6b488e,0xfeb660ba,0xfefec186,0xff168ab6,0xff01e1e5,0xff67893d,0xff9d10d0,0xffa753cf,0x00026ed3,0x003d2a39,0x00489adc,0x004b2435,0x00193ddb,0xffe425df,0x00470739, -0x0019b3c3,0x001b9692,0x0023a9f1,0x001b013d,0x003001bd,0xfff38e8f,0xffbfd42d,0xffbdbb4f,0xffaa7f97,0xffad689d,0xff90ce29,0xff72d828,0xff3f6fb5,0xff0926f0,0xfefcbac4,0xff6e7df2,0xfea27ee0,0xfe5fcaca,0xfec582ce,0xfefbfe16,0xff3e8851,0xff23c2ac,0xfeb0b200,0xff3ef1f1,0xff9e1b94, -0xffdf5099,0xffa9c7f5,0xff9c0c84,0xffb1bf66,0xffbaac5f,0xffcdb597,0xffdfa330,0xfffcbbe0,0x001777db,0x002f2ac5,0x002a6190,0x0018a707,0x001affad,0x0005e606,0x00100d34,0x003043d9,0x00208eda,0x000d2497,0xffc0eac1,0xff9f867c,0xff8ee058,0xff82dade,0xffc4c6dc,0xffaa3529,0xff89a975, -0xff037044,0xff8b4cd7,0xff32b4bd,0xff0ef228,0xff202313,0xff11c460,0xff25396c,0xff43d5ed,0xff58361f,0xff61ee24,0xff55116f,0xff6119ac,0xff7821cd,0xff94ca8f,0xffae7626,0xffbe2aa0,0xffd05770,0xffdba448,0xffc9401a,0xffa2c581,0xffa76b5a,0xffe45ec4,0xffeac45e,0xfff450dc,0x0001f1a4, -0x00256731,0x0023761a,0x004a9df7,0x0023d464,0x006d83c8,0x002ae18a,0x002fad8c,0xfff4e7d1,0xffe38834,0xffde6f3e,0xffecf294,0xff9e3f70,0x003e3a38,0xffa353bd,0xff885ed4,0xff67d4a6,0xff44f80a,0xff214d70,0xfef7cb70,0xfed3f622,0xfeeb30c6,0xff08a28e,0xff1c624b,0xff32d4cb,0xff435a69, -0xff51ab86,0xff598493,0xff61927a,0xff6ee910,0xff7bfee2,0xff940886,0xff8d49b2,0xffbe5909,0xff9cac7d,0xffa4851d,0xffc97c51,0xffd87e8b,0xffc9add0,0xffc1fe23,0xffc51713,0xffe7f9a6,0xffc9f43f,0xffd116ea,0xfff7e80c,0xffe65520,0xfffc5c94,0xffec7172,0xffb9f7fc,0xff91cf25,0xff56e746, -0xff6548a1,0xff536ea0,0xff4ad24d,0xff409f68,0xff387fb1,0xff255cab,0xff33d212,0xff37b746,0xff3e3777,0xff433214,0xff49a860,0xff52a310,0xff562dd1,0xff5a8446,0xff5df34b,0xff605000,0xff6848a9,0xff6246df,0xff83e534,0xffc9b82a,0x002b9f65,0xff7c30a0,0xffd51d35,0x004a69f6,0x0049e095, -0x00458a4b,0x0035a9ac,0x003ff670,0x003bed9a,0x0036f653,0xffdf5e69,0xff804e86,0x00357136,0xffe37d83,0xff37d6c0,0x008c1692,0xfffa5c6a,0x00b7825f,0x007ba372,0x0083b7c2,0x006eb826,0x008104eb,0x0087aa7b,0x008fba9f,0x008b2a63,0x008aa47e,0x008ed580,0x0088042f,0x008726d7,0x008861b4, -0x008dbc6b,0x008ea08e,0x008d053c,0x008a3512,0x007b7788,0x00b06055,0xfff9132f,0xff90c951,0xff4924f7,0x00242b77,0xff960b4e,0xff48fb1c,0xff4c311b,0xff4e36fb,0xff613dc0,0xff4901fd,0xff4414dc,0xff467dcc,0xff9ba17b,0x003a74f7,0xff4ba8cc,0xff7e52ff,0xff79e9c8,0x0089b96c,0x0088f4a3, -0x0070d589,0x004d0e74,0x006d8e29,0x00804ade,0x009f1e37,0x009f51ab,0x00a72856,0x00afbcd9,0x009d4a57,0x009df178,0x00a2157b,0x00b3660e,0x00b25eb9,0x00aba363,0x00947f78,0x009baa34,0x007f81d4,0xff9efd96,0x004c4808,0x00376f45,0x001d3b3a,0x000788a1,0x003751e7,0x006545d2,0x00684a49, -0x001fc1cc,0x00624ea0,0x006d4344,0x00233e28,0x003a3bcb,0xffff50bf,0x000846b0,0x006a76b7,0xfff94d64,0x0070d04d,0x00baaa3a,0x007af45c,0x0035ebc8,0x006a7487,0x008b3839,0x00ca1a65,0x00b8b422,0x00ba3708,0x00d81187,0x00a9d660,0x00a8438e,0x00a60f54,0x00caa411,0x00ccc2c7,0x00c3ec60, -0x00a0859d,0x00b6c77f,0x005045dc,0x000a1478,0x00300176,0x004a4cbb,0x002f4402,0xfff9d464,0x00315d3b,0x0032f528,0x009cc32f,0x00172a8f,0x006859f6,0x00177fef,0x001dc154,0x000c2a02,0x000b00b2,0xffff8280,0x0023de67,0xfffc8679,0x006829f5,0x008850e3,0x0033dd55,0xffd0ab39,0x0008cb6f, -0x00428f55,0x00c31352,0x00c53303,0x00f7f76d,0x011bf166,0x00c6e2c7,0x00b92774,0x00bd4c10,0x00fcbfe0,0x00fd2b8c,0x00e560fb,0x00acadb1,0x00bc422d,0x0072d29b,0x001e52df,0x0092053c,0x005171bd,0x00538654,0x0040b6b5,0x0010f672,0x0055b614,0x0065bb88,0x006c1dde,0x0054ef9e,0x0042ff75, -0x000b87a6,0x00177124,0x001bdbd6,0x005857c2,0x0067bf04,0xff64ec31,0x00ae39e5,0x0187879c,0x01708122,0x0176ca14,0x014327bc,0x01284de2,0x013e7e14,0x00b9dfba,0x0086092b,0x00808021,0x01127d8a,0x013a4720,0x00da73f9,0x00ad9ee1,0x00a57b71,0x01105476,0x00d144b8,0x00d98730,0x002be3e1, -0xffb6a876,0x0051c302,0x004e7683,0x005ddb23,0x0060208d,0x007297cb,0x00257bd6,0x00060161,0x000d6efc,0x0089500c,0x00c46e0e,0x005d264d,0x0039c866,0xffbe2d18,0xff34478a,0xff2ecd5c,0x00a1551e,0xff02dbe2,0xfffdbdf6,0xffdcdf87,0xff987cd8,0xff8e763f,0xff5701b9,0xfee649e4,0x003c3d60, -0x009eb2b2,0xffe8d9f9,0x002d99bb,0x00442883,0x0070d85c,0x00a1db2e,0x00c5d1e2,0x00f1338f,0x00c40177,0x00d2e78d,0x0036525a,0x0019e8de,0x003f0883,0x0036f4e3,0x0098888f,0x00737e3d,0x003d59c1,0x002cdf83,0x00431355,0x00763c00,0x0040ff40,0x000b803c,0xffeda9fc,0x00215386,0x007791a4, -0xfffcc35e,0x016a98f4,0xff8a27f1,0xffbe45d4,0x0018c92b,0x005f7a44,0x011251de,0x00dd6234,0x0135745c,0x0183d68a,0x01b476b8,0x0182f7e2,0x00f4f19e,0x016902a2,0x01462db2,0x00e4c0c4,0x00c0324d,0x0087a2c6,0x004727a3,0x004a8546,0x007a3605,0x001a1ad8,0xfffc112e,0x0007bff6,0xffdb6d2e, -0x0012cb7a,0x000ba546,0x002ab44d,0x002d999d,0x0022a63a,0x0020bfc2,0x000bd685,0x0022732d,0x00279228,0xfffafaea,0x0039f6d1,0xfff896ec,0xffb9ae6a,0x002f2e23,0x0027d6b1,0x007123d7,0x00952708,0x018b123e,0x0110e284,0x00a0e06b,0x003e87ca,0xffb55fbf,0xff83558a,0xff3f397f,0xffcc82ee, -0x001a373f,0x002d3267,0x0058e696,0x00874532,0x00b143bb,0x009f7f1a,0x008baba5,0x00358b7c,0xfffaafbd,0x002a6500,0x002d865e,0x004936a0,0x00384cf0,0x0023dc10,0x001ba394,0x000cc06b,0x001ead7a,0x000fcd8a,0x00028e3b,0x0008f915,0xfff44290,0x001d5af9,0xfffb9cb7,0x0052846c,0xfee2c2be, -0xff9ede37,0x008f0f43,0x008001dc,0x00832a87,0x005050e9,0x00644e79,0x008ced6d,0x00360376,0x00155da2,0x000dd1a1,0x001b9f08,0x002d86cd,0x00371d18,0x0045c2c2,0x004f434a,0x00724ae6,0x002e6013,0x003470bc,0x0034da09,0x001cb114,0x004aa747,0x0015e7e9,0x0024823d,0x00288279,0x003b73f9, -0xfff1a677,0xffdb5b7a,0xffc79242,0xffd78861,0xffb95619,0xff84e540,0xff5ab464,0xff18978c,0xfea8dcbc,0xff12a61a,0xfe5c68e4,0xfef8fd3a,0xff8b41e8,0xff94cc87,0xffed3491,0x0014648f,0x00166371,0xfffbf506,0xffff3562,0x0007c3d0,0x00027bb8,0x00053f6d,0x000bbd08,0x001bd29c,0x003856cb, -0x0053f2b9,0x007a779d,0x007be77d,0x006da6a7,0x0026ff20,0x002e74b2,0x002e5839,0xfff9bad0,0x0016fb43,0x001fa30e,0x0034be9e,0x001d240a,0xfff9e4fb,0xffe06856,0xffad1972,0xff95d3e5,0xff922728,0xffb4ca29,0xffb9a5a4,0xff8b68b8,0xff3807d4,0xff5fa462,0xff667eda,0xff9fd06b,0xffa3df23, -0xffc9ddf6,0xffeccadd,0x00268dc8,0x00629b49,0x0043f50c,0x0027580d,0x000e8904,0x00112a0e,0x001146c4,0x000990d8,0x0020c935,0x003080e3,0x0046909e,0x0028ee92,0x002e9a1d,0xfff50bd9,0xffc84c9a,0xffe1f3e2,0xfff5ca14,0x000eda88,0x000da9d5,0x00343644,0x001bc17b,0x0041e655,0x0025ef7c, -0x002234e1,0xffeff47e,0xffddf982,0xffb72737,0xff8ed97b,0xff624973,0xff6b8179,0xff8724ea,0xffdfc7d9,0xffdefa6c,0xffd6b122,0xffd2a9ce,0xffcf1c7c,0xffc3c975,0xffbf5d8b,0xffbc3929,0xffc1dba0,0xffc044b3,0xffb9b237,0xffade28e,0xff99c840,0xffa4ff07,0xffac83d2,0xffbb243a,0xffc43c33, -0xffd2873d,0xffe94418,0xff9cd4ea,0xffeeb9fb,0xffed58ad,0xffe505b0,0xffe27810,0x000e36d8,0x00184fdd,0x000c3e3e,0xffed5cb9,0x001476be,0x0022893c,0x0011e3c9,0x000d6cf3,0xffeae416,0xffeaff8b,0x0000097d,0xff9b33e9,0xfffc8f16,0xffe1ad1b,0xffe59f56,0xffe5073c,0xffe3dfd5,0xffe49fc6, -0xffe450d7,0xffe4245c,0xffe0828c,0xffdd7bdf,0xffda821b,0xffda0407,0xffd7a82a,0xffdc998e,0xffdde797,0xffde1275,0xffe34a98,0xffdfbdc7,0xfffbf82e,0xffa23bc5,0xff5a3534,0xff16f118,0xffc43e0c,0xff615032,0xff1779cd,0xff17d7ad,0xff232d79,0xff352094,0xff2db66e,0xff3099cc,0xff3a6eea, -0xff687bcc,0xffc4d24e,0xff2c8467,0xff5511c7,0xffe21c41,0xfff9933e,0x008be48d,0xffc50a1a,0x00021741,0xfffc2ff2,0xfff991d3,0xfffcd95f,0xfffb413e,0xfff607a0,0xfff3d256,0xfff314a9,0xfff7a116,0xfff4bf25,0xfff6687e,0xfffa4442,0xfff7419d,0xfff5de3d,0xfff5120b,0xfff3be3f,0xfffaeccf, -0xffcb0a3f,0x008e38ba,0x00d10b54,0x00c32bfa,0x006588e6,0x00cac706,0x00bca6ef,0x00d4dd3e,0x00d7604d,0x00ba14d1,0x00d9ef08,0x00dae3f9,0x00cdfc66,0x00c70ae6,0x0052ec37,0x00bbd5ea,0x00dcc9e3,0x00d03b90,0xfff12feb,0xffed204b,0x0007134c,0xfff9606d,0x0008963c,0x0008a5ba,0x0000004e, -0xfff87c81,0xfff71a89,0x000235a0,0xffefcc79,0xffeb5ac0,0xfff178fe,0xffed68aa,0xfff1bf7f,0xfff07b02,0xfff97c8a,0xffe3a7ac,0x0009c2bf,0x00bb7f96,0x0035ca80,0x00653c83,0x0042c839,0x005249b7,0x003bb0df,0x0043c409,0x005bfd70,0x0072b1a2,0x003cd49d,0x001553f5,0x002ddfb5,0x00287347, -0x00588a37,0x006a6ced,0x00148a5d,0x007c7be0,0x00071a36,0xffea9c8b,0x001bb59b,0xffeab19c,0x0018dcd4,0x001db22e,0xfffd208c,0xfff12f32,0xffe87e15,0x0007b0f2,0xffed1b59,0xfff40eb6,0x00077d46,0xfff78ff7,0xfff5d9da,0xffec3cb7,0xfff40349,0xffc879b4,0x00219fca,0x0079c805,0x00545c8f, -0x005ba14d,0x002d8b6b,0x005c6bbd,0x001eebc1,0x008a07c9,0x00399288,0x0073bace,0x0030f41f,0x0063acd1,0x002aba45,0x003be07a,0x0036f362,0x005d5ae0,0x0039f35f,0x006ccca4,0xffe39c82,0xffcbaee0,0x000f9290,0xffd3a3a7,0x001f9a54,0x003778aa,0x001e57ed,0x001136da,0x0016a275,0x003394ee, -0xfff29830,0xffdfd6dc,0xffea4b93,0xffe9abdc,0xfff19694,0xffe8543d,0xfff1c9b8,0xffbea2b8,0x001269d9,0x0089b9e2,0x001d90af,0x0094d823,0x0024d119,0x000c3130,0xffe23c89,0x00419fee,0x0070239b,0x002a6bc3,0x004b6321,0x00197ec2,0xfff58620,0xffffa95f,0x002a5a1b,0x00435ed1,0x003149c9, -0x009ee111,0x00655e96,0x002cd0b5,0x004e0a75,0x00603de2,0x005116f4,0x0045c332,0x0027381d,0xff62fc76,0xff0acba5,0xfef37252,0xff5e8334,0xffca4feb,0x0015879a,0x000f8126,0x0007f316,0xffb9295c,0xffe7c51c,0xffc81f90,0x0022de60,0x006c9423,0xfff6b997,0x00482741,0x0041e5a3,0x0067d337, -0x007db741,0x001b079e,0xffff339d,0x0018f4bb,0x009a6676,0x00c175ca,0x005bc980,0x0038743f,0x000e01d2,0xff907f6a,0x000861bb,0x00f0b177,0xfe599244,0xfefaa488,0xffa3c771,0xffb2b8bc,0xffe12099,0xffda61f3,0xff8cc903,0x00549a5c,0x0078edd3,0xffcebc8b,0x00435402,0x00627f39,0x006b3ec6, -0x003d0137,0x00287203,0x002613e1,0x0058558d,0x002b18ad,0x0042faca,0x00673bb6,0x004a398f,0x004f4e0a,0x00644642,0x004762d7,0x0032ef04,0x002e54d1,0x00484ee5,0x00734228,0x00289b56,0x000c3f42,0xffe98580,0x003f8cc5,0x004bb698,0x000c4148,0x01076d1a,0xffbb0cf0,0xffa1250c,0x002522d3, -0x00585421,0x009b0664,0x00350ab5,0x001b9450,0x000be381,0xffdc8ffd,0xffdbadd8,0xffb773ed,0xffd4d02d,0xffac40cb,0xff7db69b,0xff7f510b,0xffb8e6dd,0x001248fd,0x0010208a,0xffc70cfe,0xffe395d8,0x0008f6f9,0xffd53a51,0xfff36ede,0x000a89fc,0x000a319d,0x002ccbf6,0x00201211,0x000e0ecd, -0x001aa99a,0x001229f7,0x0029026b,0x002b934d,0x00403e4f,0x0040392e,0x003e02c7,0xffb85068,0x0070b4c3,0x007d94c8,0x004a49cb,0x0073f8fd,0x007f4bc4,0x00532794,0x001a9fd9,0xffaff4ae,0xfff6e2a5,0x00040d57,0xffc2cd8e,0x000d8f35,0x00322af2,0x002fa64c,0x00141269,0x001553f9,0x001c35d5, -0x0014ba86,0xfffd043a,0x0018eb82,0x004ac2c3,0x0020eedf,0x00177551,0x003e47b4,0x0030dca9,0x001cf75f,0x000e8ff3,0x00148e3c,0x0017bfc2,0x0003941b,0xfff02c58,0xffc9878b,0xfff666b8,0xfffdd0c6,0x000a0cfa,0x0039664d,0xfffb7835,0x0014c229,0xfff6b8c6,0x001a76ca,0xffd9de44,0xffe1ba2b, -0xffda8884,0xffdd9850,0xffad2675,0xffb03057,0xfffaba1f,0x00071668,0x00107c7c,0x0020bacb,0x003cfd89,0x0046dd48,0x00419108,0x0024a917,0x00050c47,0x0016518c,0x005a3966,0x002384e0,0x0003d6f5,0x001e7bda,0x00182a93,0x00249945,0xfff57759,0xffcd1a0d,0xffee1620,0xffdd7262,0xffd9c844, -0xffb281d3,0xff767327,0xff3d85c6,0xff05c73d,0xff7a77f4,0xff97c7b1,0xff6f64c7,0xff4157d5,0xff61a9ec,0xff565bfd,0xff25df3d,0xfefe6e54,0xfefffcce,0xff72dcbf,0xffb1ebc0,0xffb3c1b5,0xffc604aa,0xffe31906,0xffff919a,0x001fd56a,0x0024bd71,0x003058e3,0x0016d6f1,0x001584a8,0x0033926d, -0x003d03f6,0x0036c94b,0x003a7450,0x0022731f,0x00104ea5,0x0022c48f,0xffef8b9e,0xffd7eaf3,0xffa41710,0xff8a2c1e,0xff7c6687,0xff792335,0xffa3e37f,0xffb8c222,0xffcf8924,0xff80c281,0xff7c7b10,0xff22fc42,0xff185ea9,0xff4f6a6c,0xff6cf600,0xffa76509,0xffde9a21,0x0004d504,0xfff920f4, -0xffeb9aaf,0xffe8fa64,0xfff1cfa9,0xfff63350,0xffff0ed7,0x000f28e6,0x0021a7c3,0x0033968b,0x001d6657,0xfff576ae,0xfff34a04,0x00119a56,0x0000e1ac,0xfff7c5fe,0x000659d3,0x00228e5e,0x00296716,0x00387bf0,0x00118128,0x00490f8c,0x00027d2e,0x00057c1b,0xffd255d2,0xffbde2a3,0xffac4387, -0xffa6c235,0xff73d996,0x001564ee,0xffbc1dae,0xffa959de,0xff9ee51f,0xff872af1,0xff733fb4,0xff5b1422,0xff524f39,0xff5cb60e,0xff6c7055,0xff77c601,0xff83a6a3,0xff9262cf,0xffa2948f,0xffa2a9ff,0xffa326fa,0xffa6112a,0xffac7a0a,0xffb2f068,0xffb76be3,0xfff224c1,0xffdd9edc,0xfffaaad3, -0x00045647,0x001c86c8,0x00220b7a,0x000bf8e1,0x00126860,0x002121bb,0xfffd428a,0xffeea495,0x00060466,0xfff38cef,0xffffb506,0xfffe18f9,0xffd1559a,0xfff405f4,0xffa104e1,0xffaea89b,0xffa7b291,0xffa5c847,0xffa42799,0xffa25ed1,0xff995686,0xff9eecf9,0xffa09b94,0xffa38910,0xffa6c20c, -0xffa93ac5,0xffae00ad,0xffadaa9f,0xffaed5af,0xffae755c,0xffafadb7,0xffb36fa0,0xffa40ac6,0xfff0d849,0x001bc407,0x00100c1c,0xfff74529,0x002f25ee,0x002644c9,0x0029b20a,0x0027913d,0x0019a0ed,0x0028a76e,0x00264c14,0x001f6879,0x0020b48f,0xffea93db,0x00069b00,0x001ca970,0xffadea22, -0x00102e0a,0xff95da4e,0x002cf0b0,0x0012397f,0x000c4b5d,0x0001b511,0xfffb2713,0xfffb6df9,0x000740c1,0x000412fa,0x00074b02,0x0013285a,0x0008ea85,0x0007fb60,0x0008ed02,0x000dce17,0x000f63f4,0x00105bbe,0x000cc2a6,0x000d106a,0x00259732,0xff9791b6,0xff8f253e,0x0003220f,0xffa79dbb, -0xff8be98e,0xfff4e8b3,0xfff0e3e4,0xffef08ea,0xfff619dd,0xffdbd68c,0xffd4fc6e,0xffd1ac90,0xff8d017d,0xffb2ef35,0xfff6addd,0xff826f7e,0xff9ce58a,0xfff18164,0x001b2b8a,0xfffa359e,0xffe52286,0xffc5cf8a,0xffc3a63f,0xffed05c9,0xffeca492,0xfffcb4df,0x00186abb,0xffff3e07,0xfffc2885, -0xfffee1bb,0x00090d13,0x0008bde0,0x00084760,0xfff7f3c4,0x000fa740,0xffed350a,0xffc4b8fe,0xfffe1051,0xffde2c66,0xffee3b74,0xffe714ba,0xffe8a71e,0x00136f2e,0x00005e96,0xffd33e53,0xfff87d9e,0x000e994e,0xffe9fca3,0xfff2b8fe,0xffe12ef1,0xffd0a2e2,0xfff3ad46,0xffaac3fa,0xffff1806, -0x0042ac58,0xfff73896,0xffd14157,0xff964df7,0xff889f66,0xffdb4831,0xffc8d66c,0xffdf5b9e,0x002069ad,0xffe3fc20,0xffe40912,0xffe10c33,0xffff0917,0x0001bb4e,0x00054965,0xfff41104,0x0010eeae,0xffe73a9c,0xffcad975,0xfff47a30,0x000fca9f,0xfff8b42d,0xffea61ff,0x000c7695,0x0030a141, -0x006d881b,0xfffe757d,0x00476add,0x0004974f,0xffff28be,0xfffb9c16,0xffeff195,0xffdc704d,0xffd5b1cc,0xffa77daa,0xfff212ad,0x0031f1d4,0xffdd328c,0xff9866d0,0xff1efbcc,0xff0af770,0xff9fe4eb,0xffa0b7e0,0xffe24aa1,0x0049fdbe,0xffe1fad9,0xffbd9cce,0xffb41118,0xffd4a88e,0xffdef2b7, -0xffdd0b75,0xffc56c78,0xfffba686,0xffe34b85,0xffee1f9c,0x004dc56e,0x00474f98,0x003215b5,0x00278169,0x0011ac86,0x0059e266,0x0072f3a0,0x0052aea6,0x00400540,0x00368186,0x000dcd44,0x0017f391,0x000226a1,0x002c53e5,0xfffbe8d7,0xff68956c,0x001df49d,0x00814633,0x00481ada,0x006b1e5d, -0x0051b164,0x00311dde,0xfffeb258,0xffc24a83,0xffab8619,0xffb8fa7d,0x0020406b,0x008b338d,0x00fab850,0x0092c7a8,0x006ed5cd,0x00ad6605,0x005a2e97,0x0046d9ae,0xffc9aed9,0xffad8b98,0x0019bb15,0x001ec906,0x00304923,0x003f7f3a,0x00786fba,0x001e78b8,0x0003fe38,0x0035717f,0x00998ded, -0x00ad32ca,0x001fb7e8,0x001add02,0xffb5f18a,0xff310f67,0xff347392,0x000c7711,0xfe8ce14a,0x0015c00b,0xffff28be,0xffb50b54,0xff4eb755,0xff2b2bdc,0xff2ae670,0x0021ebd0,0x007a9aea,0xfff45b2f,0x0019ca4e,0x00218d79,0x002c4bc0,0x0033ef66,0x0019f205,0xfffbf393,0xffefb519,0x0025a2b5, -0xfffff7d5,0x000f874f,0x001f3d31,0x000c2daf,0x00773989,0x00658674,0x00370336,0x003f9056,0x00554760,0x006fdd6b,0x0024544e,0x0008b389,0x0014add2,0x0031fd73,0x004e5b12,0xffd0ef8b,0x00d287ac,0xff944754,0xff9af620,0x002d720a,0x0015d23d,0xffa1b506,0xff23afa4,0xff233d93,0xff60475c, -0x0048aae7,0x00a7e34d,0x0052d223,0x004d8622,0xfff62d73,0xffa10447,0xffa705ad,0xffd9697f,0x00437f94,0x001333c5,0x00208d90,0xffc396a9,0xffb3059f,0xffd425b0,0xffb65464,0xffd8f90a,0xfff96178,0x002fb694,0x0024d7ca,0x001b2906,0x001f20a0,0x001a5bf4,0x0022bdd3,0x0003028e,0x001c1314, -0x004e3ced,0xffec3817,0xffbb253d,0x0043c2c2,0x003ffec4,0xffc36bb2,0xff4d8279,0xff314777,0xff4129a0,0xff6dbcec,0xffe1e606,0xff84c38c,0xff5d3c64,0xff1a4f56,0xff6874ff,0xffa3f34a,0xffd77733,0xffc13dd4,0xffd49ec1,0x001757dd,0x00126fec,0x0035cb6c,0x0015702f,0xffeda51e,0xfffe2c0c, -0x00084a83,0x00269ceb,0x00204e7c,0x00132f81,0x001e5a64,0x000c12d3,0x000f9719,0x000613c5,0xfffe59f9,0xffe7d900,0xfff0a20e,0xffff224b,0xfff360b9,0x00413467,0xff1719e9,0xfee8a0fc,0xfee5b35e,0xfef94ee4,0xff35caf7,0xff215655,0xff3e111e,0xff80b84f,0xff3378c0,0xff2f1646,0xff38cbac, -0xff5f42d0,0xff873d1b,0xffa77547,0xfffb8ce2,0x002215c3,0x003abc73,0xffff6c66,0xfffa12cc,0x000417e9,0xffead21e,0x0006c112,0xffff20c0,0x0015a7a5,0x0012c80e,0x000e2c6e,0xffe978c3,0xffdf1877,0xffd4567c,0xffd9d2c6,0xffb1d337,0xff732c45,0xff37dbb5,0xfef85d7c,0xfec64664,0xfed99598, -0xff074484,0xfef20776,0xff3a3945,0xff37a6b5,0xff523326,0xff33d9af,0xff391329,0xff4f4886,0xffa4a581,0xffd82aa2,0xffe2e39c,0xffdc6bf1,0xffd15892,0xffc99ff2,0xffe6c5c7,0xffffbdd1,0x00436f3b,0x002bf050,0x00334f93,0x00377236,0x00335c75,0x002945cf,0xffea557b,0xffffa3cc,0x00077301, -0x0013475b,0xffd7950f,0xffb2e6ee,0xffb34d83,0xff87315a,0xff713ddb,0xff692f03,0xff856bc3,0xff8d1a54,0xffa1b3f2,0xff3a3314,0xfef2eb6c,0xff005461,0xff3ac765,0xff44f084,0xff7162cb,0xff976c75,0xffc7abfa,0xffeda5b2,0xffdd7c64,0xffd12796,0xffccbb3b,0xfff130ca,0x0011f6e8,0x002d98a5, -0x0040950b,0x004e71e8,0x0065209f,0x003e71f0,0x00382457,0xfffcf094,0xffd31ea5,0xffe9e100,0xfff09521,0x00057644,0x000c201e,0x002abda0,0x001722e9,0x0015592f,0xfff57441,0xffef2069,0xffcb99d0,0xffb42195,0xff8206c3,0xff47c5bb,0xff178979,0xff0e1879,0xffa7e8a0,0xffa1d7b0,0xffa9ffd1, -0xff9e3038,0xff99251a,0xff926c21,0xff8a9a98,0xff88e624,0xffa105ea,0xffbc2c39,0xffce949c,0xffdb98da,0xffe15138,0xffe3459e,0xffdfb79d,0xffde6c33,0xffe26067,0xffe36090,0xffefa034,0xffed93d3,0xffbcd428,0xffe72e85,0xffd70152,0xffe5621b,0xffdda10d,0xffed5ede,0xffecc734,0xffd737fd, -0xffc63ed8,0xffd8dbaa,0xffe79365,0xffe1410b,0xffdab783,0xffd101c9,0xffc4b736,0xffcaec83,0xff88fa8d,0xffda6696,0xffd12b1f,0xffd0cb8d,0xffd2a489,0xffd25a42,0xffd36574,0xffcf595f,0xffd7db7b,0xffdae2d5,0xffdfb602,0xffe3f6c8,0xffea01c6,0xfff23ea4,0xfff0fc12,0xffefe101,0xffed892e, -0xffed3409,0xffe953c7,0xfffb8610,0xff9fc1fb,0xff85a48b,0xffa99193,0xffaed2f7,0xff86f04e,0xffb603c2,0xffaf47f9,0xffb211c1,0xffb888f5,0xffaae7ee,0xffa5cd82,0xffa4ade8,0xff82d554,0xff9ffa68,0xffab712a,0xff7995b5,0xffe43f41,0x0060eae7,0x00a42fae,0x0054a5fd,0x00546ba1,0x00596ecc, -0x004c1ec8,0x006446fd,0x006a7488,0x006a07f6,0x0066dca5,0x0064c20d,0x0067eef4,0x005cd02c,0x005bfebb,0x005fb0d4,0x00615cde,0x0061aabd,0x0062096a,0x005f76c8,0x005641ba,0x00520333,0x00a01895,0x007663cc,0xffd63b74,0x009eb4d5,0x008029dc,0xffe600ef,0xfffc07a9,0x0000bf8f,0xfff670dd, -0x0008eea2,0x0009f94e,0x000744b6,0x00832e8a,0x00a33117,0xffdf363c,0x007b5fec,0x00488025,0x007518b6,0x00474375,0x00585be2,0x003b24d4,0x0076fe26,0x008ecc4e,0x0093327a,0x00905825,0x0089e098,0x0090e6ae,0x00685a81,0x005d9f79,0x00696a82,0x00724051,0x007d8aa3,0x0080ba49,0x007af079, -0x005e40db,0x00747944,0x0040a6ce,0x00583153,0x0078c796,0x004c505c,0x005050db,0x00722fc1,0x007ded3c,0x009c10c3,0x0089dd00,0x007f5d0e,0x00605508,0x00500a5a,0x005e0295,0x0055a478,0x00678262,0x0066b2e8,0x00880088,0x007312e5,0x004f6b15,0x005b4178,0x0015e878,0x0093c404,0x00c64d89, -0x00c69d4d,0x00bf5827,0x00ac97dc,0x00c0381e,0x0078b76a,0x007327fe,0x008ca7e5,0x00976908,0x009dffe3,0x009e60df,0x0085085d,0x00627c68,0x0058cda0,0x006ae0e9,0x0056e696,0x0051142d,0x00461c2c,0x00528bc1,0x0053530d,0x007e41e7,0x0077a33d,0x00725ebc,0x004ed3b7,0x005a306c,0x00417906, -0x004bc2cc,0x00498362,0x004c6199,0x0064b39e,0x0052b36b,0x004f4d65,0x001e3de5,0x00318a82,0xffcf6019,0x007d45b8,0x00e0b5c4,0x0107b91a,0x0108df12,0x00fea72e,0x0111d95e,0x009401a9,0x006c45a4,0x008aa6e1,0x00b12bba,0x00d4cbc3,0x00d61d91,0x00ab30f7,0x005c67e7,0x004a0e80,0x0044d289, -0x0035ebf1,0x006ac156,0x00404520,0x0024668e,0x0009952e,0x005f50bf,0x0073b8ab,0x002bff91,0x00434025,0x00290251,0x0004ba2b,0x00211524,0x00402f15,0x0038815c,0x0056f905,0x00bf01a1,0x010a89b0,0x00cf6939,0x00ced828,0x00dda908,0x014d6058,0x0165cdc0,0x01267d24,0x0083ed5b,0x0005f4ca, -0xffce1b8a,0xffd482bf,0x00204f0e,0x0097bb62,0x00785b46,0x006ccd13,0x0055b357,0x00808704,0x009317f8,0x009b7be0,0x005ff4e5,0x003974c7,0x004e0008,0x003ff57a,0x00536820,0x0077bf10,0x002053ff,0x000fef48,0x004befa3,0x00b64556,0x00b3092e,0x00418f9c,0x003dc9a9,0x00115619,0xffa5b30e, -0x00494026,0x006524e7,0xfee2a81a,0xffbae62d,0x0032b08a,0xffc95f99,0x001e7caf,0x002a4628,0xffe0d844,0x008a62ea,0x00a886c2,0x001d2604,0x003379ed,0x0051e971,0x009e1774,0x00be7d9b,0x00f2b929,0x01353c9e,0x00e799bf,0x0095e981,0x0063fb6c,0x003b425c,0x003564a1,0x00453049,0x00743695, -0x00684e86,0x00397c19,0x00489eeb,0x005e8a7c,0x00712936,0x001f6002,0x0017f86c,0x00304cf5,0x004d5257,0x0067ae6b,0x00394d7d,0x00c5fe72,0xffce84a8,0xffeaa3e0,0x00804835,0x00efe1e6,0x01cde57c,0x01a15cd0,0x0190ec88,0x0151e380,0x00e7a7f5,0x00ae2e85,0x009769f1,0x00e9780d,0x00f53d28, -0x00cc9f3e,0x006aaf47,0x00359cb4,0x004d1206,0x00155ec2,0xffef4dc8,0x0015c496,0x0020c6ad,0xfff8efcf,0xfff616fa,0xffffc02c,0x0011e101,0x00397baa,0x002a0dc6,0x001da75a,0x0024708b,0x00268cda,0x002f29f5,0x00159ab7,0x0058cc3f,0x005cfce1,0x002e761e,0xffe0c40a,0x005ebca9,0x0087fd74, -0x0106a3ac,0x0194f05a,0x022ca17c,0x01c3acbc,0x0145927c,0x006b01bb,0x006219fa,0x00510ee7,0x002fd67a,0x003bb3d0,0x00476274,0x00490d9b,0x005979d4,0x007e189b,0x00a6c00c,0x008f8459,0x005e6a93,0x003e523e,0x001ae242,0x0013c3a9,0x0019ee1f,0x002b96bc,0x0027b8bb,0x001e65b2,0x001dec6e, -0x0022fe27,0x0016217f,0x000edf99,0x000413aa,0xffdbb543,0xfff2dd7b,0x000cfc1d,0xffefad99,0x002db745,0xff8c3519,0x0068dd7c,0x010adf2c,0x0128f602,0x0132c94c,0x0127c922,0x00fdd3ca,0x00b5dd62,0x003e69bc,0x0036b414,0x00a853e1,0x007b7296,0x0078dd37,0x00787c19,0x006002be,0x0043b121, -0x0029ef04,0x0008df59,0x00095c2a,0x003af3ab,0x0038a1e6,0x00296b5a,0x0008c1e6,0x0019ef65,0x00116883,0x000a1d89,0xfff7abb0,0xffea1d36,0x000387a9,0xfff7e6b0,0xffdbae3e,0xffabcc9b,0xff60a078,0xff2d1e22,0xff08aaae,0xffa22c4a,0xff6f3bb1,0xffea633a,0xfffaeb34,0xffd8a95a,0xffb3d994, -0xff810514,0xff86c1b0,0xffe2dafc,0xffbb9aad,0xffb3e41b,0xffb732ba,0xffecaa46,0x001e6788,0x0039a337,0x0061a449,0x006e6483,0x0065ced1,0x003faf49,0x00275ade,0x002aa14e,0x003537f0,0x0039a4d3,0x003cbf58,0x0036e355,0x00178c7d,0x000c686d,0xffcbdffa,0xffacabad,0xff9b4c3e,0xff8c4cc9, -0xff829ac9,0xff80d2bb,0xff91c33c,0xffc58450,0xffee4f62,0xffde7dab,0xff79616f,0xff56dcf6,0xff691ff2,0xff8dda10,0xffb0d6fa,0xffee7dce,0x001ff731,0x0051ee39,0x00498203,0x004bf6f5,0x00427211,0x0044e2ee,0x003e6697,0x003970df,0x0043940a,0x004dc88d,0x005b7f4c,0x00562007,0x004e96b4, -0x00507d26,0x003d430b,0x001fcfdb,0x000a42db,0x0011a652,0x001a778c,0x0029459e,0x001cef1d,0x0008d8c3,0x0012b327,0xffec2da2,0xffe796c0,0xffd3b7dc,0xffb534b0,0xff9254ed,0xff703644,0xff6c1aa7,0xffb732af,0xffd2423b,0xffd23b6c,0xffe159fa,0xffe52e3a,0xffebb5f0,0xfff169aa,0x0001fc68, -0xfff8c7f1,0xfff309b3,0xffef511a,0xffea4882,0xffeacee3,0xffef48c4,0xffeae09e,0xffe60402,0xffe14d8a,0xffe12e53,0xffd94fe1,0xffe54068,0xfff29a92,0x000bff34,0x002c5db9,0x0020a96e,0x0033ba2b,0x004ec73b,0x0039271c,0x003b8d05,0x002e171e,0x001ed664,0x000a89cc,0x00056b16,0xfffa8187, -0xffef5502,0xfff497d2,0xffe768dd,0x002a01f3,0x00003699,0x0002940e,0x00094de2,0x000d7d9b,0x0013175b,0x00174bbb,0x001ca447,0x0017f275,0x0016b561,0x0014ff62,0x00141b75,0x0011dbd6,0x000f6ba2,0x000ec25c,0x000ee69a,0x000d8af9,0x000e4c19,0x000cc78c,0x0005ec96,0x0035d050,0x00282201, -0xffc9a72a,0x0049b21d,0x00397c38,0xffd4c8cc,0xffd7832f,0xffd93ae5,0xffd56c5e,0xffdd3941,0xffdbd9be,0xffd82dc0,0x001ef705,0x0033ee93,0xffb664c9,0x001083c1,0x00285c81,0xffaf3086,0xffb152d8,0xffa83675,0xffc06f81,0xffb031ff,0xffb19e24,0xff9d74f5,0xff98f1f5,0xffa0e111,0xff9f35ef, -0xffa290e5,0xffaf84ce,0xffa2da8b,0xffa13a9b,0xffa0f5b6,0xffa61e24,0xffa92fe0,0xffad6064,0xffabf77f,0xffb9b7a8,0xffa32b76,0xffb31bb7,0x00062091,0x00bff555,0xff9972b5,0xfffcb395,0x00b239a4,0x00b2013e,0x00af1b91,0x00a134b8,0x009bd224,0x00974d74,0x008cc242,0xfffa1674,0xff93dd9e, -0x00b0f658,0x0009b22d,0x002ebeab,0xff931055,0xffbaf401,0xffa7d2c2,0xffa427ba,0xff695424,0xff5b89f1,0xff77bae7,0xff76fa6b,0xff8261cc,0xff9fd67f,0xff7d9704,0xff7242bf,0xff723e0b,0xff78ba31,0xff81cf56,0xff8cfb36,0xff91e565,0xffa4af18,0xff98021e,0x003a24aa,0xffd7fdb3,0xffc81555, -0xffe8a274,0xfff7b70b,0xffd61133,0xffec2128,0xffda72b5,0xffdcce20,0xffca6982,0xffd00bc2,0xffdd84e6,0xffd8fcf5,0xfffd9d42,0xffe69ca8,0xffb3a45d,0xffd50e14,0xffca64b6,0xffcc6be2,0xffa4e30a,0xff9d40e9,0xff3524c8,0xff121ed6,0xff453855,0xff384dbd,0xff4a66fb,0xff8ac4e0,0xff461bd0, -0xff3f94b5,0xff3e7f43,0xff552b11,0xff63cb9f,0xff77583b,0xff86e770,0xff909aa2,0xffbff3f4,0xffe70734,0xffec25a2,0xffee7809,0xffe1556c,0x000b0075,0x0003f180,0x0050e6c3,0x0039c604,0x00203fd8,0x002a0ab4,0x001fede5,0xfffed979,0x000ee458,0xfffd9d28,0xfffa450a,0xffd326fe,0xffc90b39, -0xffb90adf,0xffd6fb81,0xffb43bfd,0xff95f70b,0xfedcdb34,0xfeab3c54,0xff09a1f2,0xff0b0f60,0xff2f3e06,0xff98194c,0xff248d5d,0xfee5e596,0xfed4fcaa,0xfee346ae,0xff0b82be,0xff304f25,0xff4e54f5,0xff7b1a4d,0xffa62c23,0x000a263b,0x000039d2,0x00372f7e,0x000ed053,0x0012b0e4,0x0016daa7, -0x005ca808,0x007ef2d4,0x003c906c,0x0038325c,0x002a3ccb,0x0010b4be,0x001ab317,0x00105093,0x001a629d,0xffd160db,0x0013af90,0xffdc2d2f,0xff87c41f,0xff600a9c,0xff9969b5,0xffc12b6a,0xffa5b42a,0xff1750f5,0xff172168,0xfef9a59c,0xfee9e4e2,0xff1a71ea,0xffabb6b7,0x00af549d,0x004dfb8a, -0x00261beb,0x000c9a50,0xffdea651,0xffb5ffae,0xffc01e70,0x0011405f,0xfffd8f24,0x001271cb,0x00149922,0x002d6f49,0x006def05,0x001827b8,0x000f2bb8,0x00618f9d,0x009e1393,0x008c3bf3,0x0018b55e,0x000b7982,0xffcdca6b,0xff73f3a9,0xffca8524,0xff6c3c9c,0xfe75beae,0xffe26336,0x00133069, -0xffbcc3b8,0xff78f57e,0xff6f3325,0xff82e651,0x000ce888,0x00470a54,0x000a40e5,0x000f2693,0x001215ce,0x001abd43,0xfff5ad00,0xffbf6c0c,0xff725587,0xff84fdc7,0xffa74fc6,0xfff02f89,0x0019f1f8,0x00100947,0x000b5e0d,0x0044c24a,0x00464d08,0x002d7e19,0x00525a18,0x0067066b,0x0063b48b, -0x0011039d,0x00114fd8,0x0036cf3f,0x0037ce30,0x002099ec,0x000bf072,0xffe4a65e,0xfff92724,0xffd686c7,0x00498006,0xfffc1f29,0xfef3a758,0xfe527834,0xfdf79444,0xfe190fb8,0xfed9b300,0xff78d50c,0xffb88158,0xff4b9523,0xfefea034,0xfede70e8,0xfef949e8,0xff6259fb,0x001f9828,0xffe6500d, -0xffbf4aad,0xff9edbe4,0xffa4b887,0xffbdfbab,0xffcdf6ef,0xffc804be,0xfff9b790,0x0037780f,0x001cfb0d,0x001238e6,0x001a2b9c,0x001d7375,0x001bfb07,0xfff5d664,0x003e9574,0x00561163,0x002076d8,0xfffe7786,0x002fa4db,0x00392de8,0xff7ac086,0xfee985a8,0xfe1c7a5a,0xfe96c2ca,0xff1e7bf9, -0xffd639e4,0xffafab86,0xff9a2e6d,0xff7ebb94,0xff6ee6c0,0xff8127af,0xffa0d953,0xff81e5f0,0xff7c0bf8,0xffa90a95,0xffb88696,0xffeab9f9,0x00054292,0x000a0a45,0xffe97c74,0xfff93e84,0x0008204e,0x0009905f,0x000cc4e9,0x00243784,0x001b66ce,0x000a8b13,0x00102be7,0x0006f35e,0xffce8249, -0xffe0591f,0xffd18320,0xffd7c5f3,0x00078935,0xff8ed9b1,0xff03dfc8,0xfe35ed2a,0xfe62a948,0xfeb375d4,0xfead8278,0xfea6c120,0xfebbc0ca,0xfeb3da30,0xfed0cc30,0xfeef044a,0xff285f7d,0xff6421af,0xff86bfe2,0xffdec3cd,0x0005e114,0x00033698,0xfff8118b,0xffe4f934,0xffe85da3,0xffecd5ea, -0xffe02244,0xfffce16c,0x000b1e46,0xfffc861e,0xffe1a4b3,0xffe8ecdd,0xffe33873,0xffe1e590,0xffd22c3a,0xffadae41,0xff7950e9,0xff3fb5c0,0xff170297,0xff30be63,0xfefa9d88,0xffc9100f,0xff27795c,0xff03121b,0xff06dfab,0xfee23a28,0xfee14fba,0xfeecff84,0xfee884a8,0xff6123c9,0xffaac577, -0xffd57dc5,0xffbb8d5e,0xffaaa450,0xffa96e5d,0xffc03ac1,0xffd20ed5,0xffe4cad8,0xffddba82,0xfff7d76d,0x00342a37,0x002b8af7,0x001dd5c1,0x0002cf2b,0x0000d57b,0xfffa8b64,0xffea0942,0xffa5a23e,0xff8a78be,0xff8babee,0xff7470fe,0xff644528,0xff550812,0xff64c1bc,0xff6ea7b2,0xffac9822, -0xff610231,0xff123ea1,0xff082d65,0xff13912a,0xff19a3a1,0xff22595a,0xff3a8dcb,0xff500a57,0xff5d39da,0xff6e286b,0xff7b44aa,0xff94d39f,0xffcd2592,0x0002d82c,0x00341b3d,0x002f90f6,0x0030e891,0x003539ca,0x002484e2,0x0011e4cb,0x00046c2c,0x000811ff,0x00093b7d,0x00035b2a,0x0003039c, -0x001001f6,0x00127704,0x001321eb,0xffdf2513,0xffde6858,0xffca0af7,0xffd0fea3,0xffbaec2b,0xff9562ce,0xff6a4a67,0xff523241,0xff2e2edc,0xffdb342e,0xff745bc0,0xff7ca485,0xff774663,0xff768b1e,0xff713d48,0xff6f6246,0xff706213,0xff91a6f5,0xffb2a853,0xffcc416c,0xffe4126a,0xfff68987, -0x000ef6ce,0x00050a9c,0x0000965d,0xfffc7025,0xfffa2001,0x00036266,0xfff07b0c,0xffec8056,0xffdd8531,0xffcfc328,0xffe9fc87,0xffe3cef5,0xffd1c745,0xffc3e9b3,0xffb6b204,0xffc08c97,0xffaee5df,0xffb166ea,0xffbe4ade,0xffb287c5,0xffc25a85,0xffaef295,0xff96dc6a,0xffabfc04,0xffa4f008, -0xffb557db,0xffb098c6,0xffb2789b,0xffb2f7cd,0xffb38536,0xffad91ef,0xffba977d,0xffc293bd,0xffccc4c0,0xffd61ae6,0xffdf7fe3,0xffec6798,0xffe8738d,0xffe83477,0xffe7504a,0xffe3f341,0xffe34517,0xffe38c5e,0xffca14b4,0xffed860b,0x004cab84,0xffbd7a9a,0xffea0c18,0x00622d5e,0x005aef6d, -0x0054df3e,0x004a49d1,0x004389de,0x003a0fed,0x002fac55,0xffdb3758,0xffa353b3,0x003a33de,0xffdcbc5e,0xffc9ea83,0x007e7070,0x00485ceb,0x00a19a1d,0x006b3c25,0x007235c7,0x005fac21,0x0078ad8f,0x0081be99,0x00899db5,0x00852f48,0x00833f71,0x00874fd8,0x007662c4,0x0072b588,0x0073223e, -0x007b8bd6,0x007f6904,0x00835e67,0x00817b87,0x0071fe05,0x0094c9d0,0x003fc3ae,0xffdae755,0xff42a615,0x005d8e04,0xffe9d1e7,0xff5b8085,0xff63c2b9,0xff674607,0xff70f887,0xff6938c6,0xff67ba9c,0xff6b12e1,0xfff1e9da,0x0075f4d3,0xff529535,0xffd77ab2,0xffae303c,0x009bfc0a,0x006cf92e, -0x0061f55e,0x0040269e,0x0073ed6c,0x0090c465,0x00aa5f74,0x00ac6213,0x00a97f1d,0x00b10718,0x00801b15,0x0070e9b6,0x00779b0e,0x008c32ba,0x009c51f1,0x00a9462e,0x009c8296,0x00920a34,0x0084cbb8,0xffbc608c,0x00438ff9,0x003af17b,0x002510d9,0x00205bb6,0x006047eb,0x00757c08,0x00843667, -0x00500df0,0x00740b4e,0x006ea43b,0x003b4b45,0x00579715,0x0027fab1,0x0028cff2,0x007072ff,0x00463a8e,0x009d5bc3,0x008a1da2,0x0057e4cc,0x0019ac0b,0x007a6012,0x00b17c7d,0x00e7b9bf,0x00dd1395,0x00cf6840,0x00e30702,0x00820538,0x006e2469,0x0077283c,0x00a37fac,0x00b989de,0x00d098a5, -0x00b056a6,0x00b19596,0x0055daf2,0x00244728,0x002c291d,0x001c350b,0x002e8881,0x001eb113,0x005fa946,0x0055d11d,0x00998b61,0x0047afab,0x005f8342,0x0034fd6e,0x00355f85,0x003ad413,0x00371794,0x0018f14e,0x00530164,0x0009b942,0x008a0e93,0x005f0dda,0x0022935d,0xffc18102,0x002d99a7, -0x0092c994,0x010822ba,0x0113007a,0x0114e6a4,0x01357b24,0x009e0f27,0x005c7a92,0x006a165e,0x00ab750f,0x00e714e6,0x010b137e,0x00d97813,0x00b546fa,0x00571eb2,0xfffb887e,0x004305c7,0x0018eae4,0x0040404d,0x003a0d13,0x003b74ad,0x007b868e,0x007c5d1f,0x004af705,0x004287d4,0x003fc325, -0x0017d6d8,0x0043ec11,0x004ce2be,0x00318210,0x005415e9,0x007dbe97,0x012cf7b4,0x010d540c,0x00de348b,0x00e7c186,0x0191ed2a,0x01a69928,0x01345a98,0x01058c4a,0x0094baa2,0x003b973f,0x002205f5,0x0060bfb8,0x00f1bbbd,0x00c0afb5,0x00b1c13f,0x00de56df,0x00d0a3f9,0x00f40285,0x00a312e1, -0x002c06fe,0x00700645,0x004c5553,0x0039edb0,0x003421e5,0x0062a2f6,0x002053c8,0x00242e0c,0x007f8b91,0x00af3ede,0x008befec,0x0031a804,0x00214813,0xffdb2ebf,0xffa2855c,0x003a5cef,0xff5d5937,0xff559426,0x0065a64a,0x0086110f,0xffd0764e,0x0019da88,0x00174868,0xffd512d6,0x005f4e7f, -0x008dd3f6,0x005e59c7,0x0020b7f7,0x0026d2b9,0x0080c912,0x00d75572,0x01253462,0x016d0ee8,0x00e1c75c,0x00a89778,0x004fe1e9,0x00025500,0x0017685f,0x0029b6df,0x00676485,0x006bebd8,0x0037e762,0x0061a9be,0x0073ffe2,0x006641b9,0x0023c586,0x0025614f,0x00603aea,0x003b1047,0x006b5aa8, -0x00800c28,0x0012e46b,0x001cafba,0x0053eaa7,0x00bbedd9,0x0101b8a8,0x01b341b6,0x018914da,0x0172bdf2,0x016088e0,0x0108570a,0x00e02c45,0x0101b60a,0x01449bf2,0x0167e682,0x0133eeea,0x00e30e1a,0x007f55c6,0x005055a5,0x000d8549,0x001b8af2,0x0022edb6,0x000ab9a0,0x000e12f5,0xfff7c29e, -0xfff3011a,0x001369dc,0x003f491a,0x002e5c93,0x0027956f,0x00250cc7,0x002e5bd2,0x00284ab4,0x0000081f,0x004693ae,0x005fd01d,0x0023a120,0x0030ec4a,0x00113a7f,0x0042195d,0x00e741f4,0x01617c8e,0x022dd0f0,0x01db579a,0x017fc48c,0x00ff05d0,0x006f0b3e,0x003335ca,0x00412157,0x00110339, -0x0012e075,0x001ba23c,0x005986c5,0x0091996c,0x00ccbf67,0x00ba9514,0x00942e0c,0x0048d466,0xffeb0853,0x000307ab,0x0018d185,0x000feb77,0x0011f423,0x0017f719,0x002e405f,0x00303d85,0x00181848,0x0021ed81,0x0018ff50,0xffef3244,0xffe399de,0x00036271,0xffcfb0b2,0x0003fb31,0xff23b98d, -0x002479e3,0x0107061e,0x0117659a,0x0158659e,0x012d56d6,0x00f2d5db,0x0094fdef,0x00429ef9,0x003ec9be,0x008b41f1,0x00627912,0x00666e47,0x006f5e84,0x0047c9c5,0x00245e11,0x0014218c,0xfff76397,0x000f5137,0x003cf34c,0x000783b6,0x0021a75f,0x0009d2aa,0x00104fa2,0x000823bc,0xffeab03a, -0xfff1e175,0xfff84dbc,0xfff3784e,0xfff15289,0xffc362b5,0xff9369ea,0xff5971c8,0xff36bf0a,0xff30770d,0xff8426a6,0xff31bafb,0xffdcf747,0x002a1afb,0xfff1b9cb,0xffdbcb8d,0xfff2bf63,0x001a17eb,0x00517a56,0x000e00bd,0xffe67c88,0xffd84b9f,0xffffccb4,0x00222269,0x003fd486,0x005edfc0, -0x006c1554,0x00502ca3,0x0046a913,0x0033a6d8,0x001cd686,0x002684cd,0x002e6278,0x00208ec4,0x002e7da1,0x0011b0a2,0xffe827f3,0xffb3409a,0xff968b6f,0xffa365a3,0xff921513,0xff830d64,0xff782a00,0xff6f12e1,0xff9931f0,0xffb683e9,0xffd0ea5d,0xff81cdde,0xff96fe84,0xffb8fb5b,0xffb5eee4, -0xffc639c2,0xffe4ed8f,0xfffe8e21,0x0025090d,0x0026bd37,0x00361bcc,0x0038914f,0x004a0794,0x0053444a,0x005a2a4e,0x004e68ef,0x00471cfd,0x004592ee,0x004c0a3d,0x005d60b4,0x005641bc,0x002efb65,0x00267977,0x0022538f,0x0017fe93,0x00085ff9,0x0011e1a2,0xfff23f2d,0xffeb4f4f,0xffc4ef6e, -0xffceb248,0xffcac454,0xffdb1e3a,0xffbcab58,0xff98d7df,0xff6e98c8,0xff8424d2,0xff61d6c1,0xffb9e412,0xffce711f,0xffe9cace,0x00057836,0x001f8184,0x003aba83,0x00589143,0x004ef7bc,0x0046f9b4,0x0040762f,0x00371aeb,0x002f7406,0x002d1d95,0x002c04fa,0x002b4e06,0x002840f0,0x00264593, -0x001ff65a,0x002d5898,0xfff53147,0x0024e607,0x002a52fd,0x001301eb,0x000e09fe,0x0025a654,0x001cd204,0x0016ef65,0xfff9ddbc,0x000537e1,0xfff82aca,0xffe0effa,0xffdb648d,0xffc0e6fc,0xffc2cbce,0xffd04412,0x00019df0,0x001b676f,0x00157232,0x0022df84,0x002a10c6,0x003286f6,0x0039bd15, -0x0046202a,0x0040b8da,0x00408c5e,0x003f803f,0x003f382d,0x003e5ff2,0x003b6cc0,0x003b2b8e,0x003abb34,0x003a1970,0x003b0f81,0x0035c5c9,0x0040f340,0x00276606,0xfff0cde9,0xff92d042,0x00358229,0xffefeb41,0xff8d6734,0xff8db864,0xff925ef2,0xff997870,0xff94f425,0xff944e06,0xff955610, -0xffd77e9e,0x0019d3a9,0xff7e8d38,0xffc5ac48,0x00447569,0xffad68b9,0x001e4f31,0xff90d9bf,0xffbecbc2,0xffaf3db2,0xffb2e138,0xffa5d604,0xffa24790,0xffa55045,0xffa2f0c2,0xffa38ad8,0xffabba29,0xff9f8813,0xff9d1f01,0xff9bbe25,0xffa06011,0xffa4a617,0xffabf490,0xffad4e31,0xffbba571, -0xff8c376f,0x001b3857,0x0079b34a,0x00d8867c,0xffeed333,0x0072f78f,0x00db2ce0,0x00e42517,0x00e395f7,0x00ca05fb,0x00dbdacb,0x00db52d6,0x00cde677,0x0071e06c,0xffe3e1b4,0x00d569cb,0x008b81e1,0x009a6009,0xffaf0aeb,0xffaf3d37,0xffb0ece3,0xffafc528,0xff8f1ae7,0xff86531f,0xff9012d5, -0xff8c59cd,0xff8d2948,0xff9e07b6,0xff7a65e1,0xff68eac3,0xff65b725,0xff69bf50,0xff7be4c9,0xff928a99,0xffa747a1,0xffa6a1c6,0xffb3604a,0x0085fa90,0xffe86cc2,0xfff27425,0x0002caf5,0x001e1f3b,0x00045d13,0x00047183,0x000655ec,0x00233943,0xffef69e2,0xffdb5acb,0xfffbf9e6,0xfffa5510, -0x00325d63,0x00243076,0xffce817d,0x00427b5c,0xfff6615c,0xffaf8388,0xffb0e3d7,0xffa66371,0xff746cdb,0xff614b46,0xff6fc708,0xff629d83,0xff6272e0,0xff86f7e6,0xff47df4c,0xff382d9b,0xff382c68,0xff4554eb,0xff604200,0xff84adc7,0xffa56620,0xff95cfc5,0xffe43eae,0x002affac,0x0008a353, -0xffef6828,0xffef1cf9,0x0035145e,0x001dbd12,0x007218c4,0x0029b52c,0x005653b3,0x0023e4da,0x00496464,0x001260a5,0x00358150,0x00296c8d,0x00319a23,0x00138163,0x00263a04,0xffe8c1e0,0xffb9f898,0xffc59987,0xffb04b40,0xff51fa55,0xff40018a,0xff60b72b,0xff5a6108,0xff59ab70,0xff92eb38, -0xff2dded7,0xfee23c9e,0xfeccbb82,0xfed0bb7c,0xff1050e9,0xff5889ef,0xff91db80,0xff919008,0xffcb0c49,0x00394fea,0xffd62adc,0x001e0ece,0xfffc3a5c,0x000d92f6,0x0024dd9d,0x00695105,0x0089cadd,0x003541c3,0x003e3c65,0x00278542,0x000ee3f3,0x002ea801,0x0041d302,0x001fb90b,0xfff377d4, -0x00f40a62,0x003c7b46,0xff639d8e,0xff512435,0xff724c49,0xffe318b7,0xffda216c,0xff2544e9,0xff33c98c,0xfee989f4,0xfe932a36,0xfe9e3354,0xff24d11f,0x0038d75a,0x00219646,0x000f7ae2,0xffbae23b,0xffc3db53,0xffa09f9b,0x000e6ecf,0x00818786,0x00135ebb,0x00314a32,0x00174749,0x00283837, -0x005b44b3,0x00121f3f,0x002276b8,0x0090d5d7,0x009967de,0x006b888f,0x002de4bd,0xfffcb049,0xffe2b9da,0xffd4ca50,0x00884831,0xfef79a64,0xfeb94b9c,0xffa3222e,0x00244f3f,0xffd269f3,0xfff9dc01,0xfff5a8a6,0xffca69f8,0xfff83af8,0x0018adca,0x0036f595,0x001dfd57,0x0017eda1,0x001d857a, -0x000bc18c,0xfff19b4d,0xffb86077,0xffbf5e82,0xffa86ade,0x00112278,0x002a4440,0x001117af,0x002074f5,0x001d0ba4,0x002a117b,0x0025b442,0x00610859,0x0075383d,0x0056fb8d,0x001374ef,0x00227924,0x0049b924,0x00399f13,0x0029646d,0x008a400b,0xff339b47,0x007fce0a,0x00606c45,0x0098bf05, -0x004fefc7,0xff9a3b1e,0xff1856fb,0xfe98ff84,0xfe938900,0xfe8758ae,0xfeee0bf4,0xff94ce80,0xff28971f,0xff1b09e1,0xff1a3119,0xff3320aa,0xff7c80f5,0x000189e7,0xffd6942c,0xff94e846,0xffc101d2,0xffd55e05,0xffd0d4a4,0xffff2465,0xffde6604,0x0008870e,0x003b32c8,0x001d13fc,0x00115215, -0x0015bfe3,0x0026ee89,0x001f72e9,0xfffa2b1f,0x00504732,0x0053665a,0x005f2dc9,0x005ece53,0x00038bc6,0x0019fe7c,0xffbe2a37,0xff9cae24,0xff049289,0xff7b5849,0xffdf18f4,0x0044fc94,0x0022d4c7,0x000b3ba3,0x002f2efc,0xffc50e3d,0xffafb884,0xffc19f6a,0xffbcaeca,0xffb5b516,0xffca72ca, -0xffdd057b,0xffecbe7b,0x0013a67a,0x00264f80,0xfff1927e,0xffffde6b,0xfffa624b,0xfffc6c9d,0x0006b962,0x002575d4,0x00314304,0x00135193,0x001ebc29,0x000de666,0xffc7dbcf,0xffdce0f4,0xffccae28,0xffcb7ada,0xffd15ad3,0xfff7adb1,0xffac501b,0xfeff1664,0xff30374a,0xff490c46,0xff432bf4, -0xff0ecf14,0xfed314c2,0xff0a76ce,0xff38dcc2,0xff762443,0xff9a338b,0xffb7c701,0xffd27a7b,0xffef2722,0xfffa4940,0xffe76381,0xfff7e332,0xffe73da1,0xfff1a88e,0x00121f58,0xffe80e0c,0xfffbde77,0x00061164,0xfff5f116,0xffcc626d,0xffe95aeb,0xffdeaa52,0xffe7ea31,0xffd1305e,0xffbbc8d0, -0xff9ce946,0xff7355be,0xff61c96f,0xff960e27,0xff70e167,0x0025362c,0xff9d4eaa,0xff473260,0xff500acb,0xff1d06f9,0xff256de3,0xff2a6518,0xff1963b9,0xff870711,0xffb3248f,0xffbcf74f,0xffbbbbe0,0xffc4de85,0xffdea3b0,0xffe96d38,0xffe3ec58,0xffc6c23c,0xffcd1179,0xffe37e12,0x0024e452, -0x0024bb7d,0x001dc9bd,0x002c1357,0x00102013,0xfff2f285,0xffca4b89,0xff9656bd,0xff891adb,0xff7f8451,0xff760251,0xff64c3bf,0xff4e199f,0xff5383b2,0xff612c7a,0xff99f8aa,0xff99858f,0xff8276d7,0xff59be41,0xff3fe040,0xff494914,0xff3af9a1,0xff48158e,0xff4a910b,0xff482b98,0xff640988, -0xff7e84fb,0xffa1e33a,0xffd0067b,0xfffc2313,0x002df474,0x00160e30,0x000bda0c,0xfffe42ae,0x00056d41,0xfff1819b,0x0009e84f,0x00315830,0x002867f4,0x00258fd1,0x0008c912,0x000bddaa,0xffed4983,0xfff74b01,0xffad9f3c,0xffc28352,0xffab964e,0xffd6073f,0xffcf5192,0xffc2f852,0xffb9f1df, -0xffbde99d,0xff904b52,0xffdbd2f5,0xff6d5b05,0xff76567b,0xff7edd86,0xff85d599,0xff8a8861,0xff92b833,0xff9d3c43,0xffb441c4,0xffc962c4,0xffdc21c8,0xfff0d61e,0x00050f9d,0x002444bd,0x001dc7db,0x001ddb16,0x00198504,0x00187076,0x001ab8f0,0x000d62e4,0x002c059f,0xfff472c2,0xffefe684, -0xfff92bce,0xfff6f682,0xffd5b6ab,0xffc06a80,0xffc00289,0xffd3d524,0xffaacc23,0xff989c56,0xffa9b633,0xff99aa07,0xffaf06ac,0xffa225b8,0xff7bce97,0xffddeca4,0xff92f478,0xffae62ce,0xffab555c,0xffae2cdb,0xffb09c89,0xffb20341,0xffaf939d,0xffb909dc,0xffc1472a,0xffca9f70,0xffd3a58b, -0xffdb6673,0xffe5a981,0xffe204de,0xffe22af0,0xffe29576,0xffe01343,0xffe27fb6,0xffd55bd3,0x00043d3f,0x003bb9ec,0x0078be5d,0xffe9b06f,0x0034f53c,0x0083ac9a,0x00816d95,0x0078d5ff,0x00669ef1,0x006aabed,0x006374ec,0x00572325,0x001a9ec4,0xffc8a523,0x005296d6,0x001d70aa,0xffc15c14, -0x003bd8a5,0xffcd75b4,0x0070efaf,0x00338ff0,0x00325be3,0x002540ec,0x002b63a6,0x003105dd,0x00404be0,0x003a4c92,0x0039f011,0x00400ff9,0x003018ee,0x002b200c,0x00273c56,0x00322425,0x00388c74,0x00408745,0x0040f729,0x00393166,0x005ee610,0xffc3d75a,0xff7efc35,0xff6d40ec,0xffe0f382, -0xff8749b4,0xff7f8f4a,0xff79fb76,0xff7a65df,0xff88c491,0xff71560d,0xff6d0fae,0xff6d4985,0xff906d86,0xfffbee64,0xff78b421,0xff7af1ca,0xff7c8afc,0x0050d678,0x003df29b,0x001c0c9e,0x00060ce9,0x0005c8eb,0x0013a2b9,0x003efe5f,0x003df1e1,0x0042b04c,0x004e3728,0x0028ef12,0x00193cb9, -0x0013e443,0x0027b799,0x00378526,0x004dbd93,0x00486b08,0x00570710,0x003153f0,0xff90e33d,0x000462e2,0xffde2d57,0xffec12c9,0xffe9fb16,0x001b873b,0x0033caee,0x002c2af9,0xfff9ab43,0x002812c3,0x00379beb,0x0002731c,0x001ff466,0xfff724f0,0xffe12898,0x002c785b,0xfff70e34,0x00722944, -0x00638e49,0x000b70d8,0xffed6034,0xffe51cb2,0xfff962e2,0x005ba0b7,0x0042d860,0x004497b9,0x005d8f6b,0x000c367c,0xfff22ebe,0xffe0d9a6,0x0014a4a3,0x0034be5f,0x00616798,0x005ae0f5,0x007a580c,0x001aba89,0xffd86358,0xffedef0f,0xffdee7e9,0xfff7dc6a,0xffec805a,0x004080e0,0x0030b4b4, -0x00823952,0x00193ee6,0x00548e07,0x001467c0,0x000f9ff4,0x001ed9f0,0x0017ee58,0xffeb7e0a,0x001b1b7e,0xffd8b0f1,0x00784628,0x00546ede,0xffe9f33e,0xffb2917c,0xff797f85,0xff9d43da,0x00444c84,0x003e9ad3,0x0056af41,0x008bcd3b,0x0017ede3,0xffcb721f,0xffb034af,0xffe0f968,0x001fb7bf, -0x00669746,0x00643426,0x008384aa,0x002354c6,0xffd1c314,0x00244fbb,0xffd58e67,0x001ded7c,0x0036fa41,0x005720fb,0x0088332f,0x00889c0f,0x00617c59,0x00432d25,0x004a1faa,0x0020796f,0x0055079c,0x004abbd7,0x0023bf96,0x002853a4,0x004a5296,0x00c8227a,0x00a53f1f,0x0054598f,0x004a538b, -0x00e68766,0x00e8e07d,0x004fbf8b,0x0098ffec,0x005112b0,0xffe25ada,0xffe70216,0x002e543b,0x00c8928c,0x00acb98c,0x00a2df8d,0x00dea682,0x00a05257,0x00acf432,0x0046a05e,0x0004851e,0x006fc62c,0x003f5e19,0x002bc664,0x0016f917,0x004bce31,0x0015b65f,0x00317800,0x00afed0d,0x009224c9, -0x0059a63d,0x001f141c,0xffecc2b6,0xffa4caa6,0xffb54435,0x00284bc8,0xfe725de4,0xff6d87be,0x00845245,0x007a0225,0xffebef25,0xfffc82df,0xffd3cdb0,0xff7dc2a2,0xffe119d5,0x002ca9d0,0x0076fb19,0x00136955,0xfffe889b,0x002b049f,0x00800940,0x00af0a2d,0x00b8c6e7,0x004a65ec,0x0048873a, -0x001aff73,0xffe91dfc,0x000274d6,0x000aa808,0x003d20a6,0x004c3c63,0x002d125c,0x006c9827,0x007b9b9d,0x00523232,0x0025276f,0x002a50c7,0x00608fec,0x002ecc10,0x0065bb58,0x00ac4812,0xff47d381,0x008d7c79,0x00bbd141,0x00d090e3,0x00aed8db,0x0097ad26,0x005a4313,0x002dcabe,0x003c2ccc, -0x00409ca8,0x005f13a8,0x00bbb658,0x00aef322,0x00c48ca9,0x00a798a9,0x0083f3e2,0x00465d98,0x002c2dbb,0xfffccb2c,0x001d50c6,0xffff56a3,0xffe11035,0x00054b86,0xfff1e881,0xffe58b1b,0x000f2702,0x003bdfe1,0x002a0b67,0x0025c5d4,0x001cdc6a,0x0032c910,0x00268c46,0xfff5f61b,0x00320fb7, -0x005a3878,0x003172c6,0x0087de33,0xffc0cd3b,0xffd5cb66,0x0025b233,0x003de771,0x009cc151,0x00bb05fe,0x00cfa866,0x01066068,0x0038b70b,0xffe784f6,0x001c2a7b,0xffb9752b,0xffb08802,0xffdd3064,0x00190729,0x004081b5,0x00733238,0x00729069,0x00722acd,0x0035daa9,0xffddcd08,0xfff5d045, -0x000b8d96,0xfff8c78d,0xfffb6c16,0x000427fd,0x002f040a,0x0032e0a6,0x001af81b,0x0027f398,0x001c9fc5,0xfffad066,0xffe3553c,0xfffa3b6d,0xffc686a2,0xffda3730,0xff2ac7e1,0xff8f5a07,0x000accf5,0x00119635,0x004fe67a,0x0022f396,0xfff5adcf,0xffb60028,0xffbfd740,0xffd281de,0xffea5dd8, -0xfff3c94d,0x00018ae0,0x000eda82,0x000530b4,0xfffd8e6f,0x000092b0,0xfff05473,0x000885dc,0x0017f589,0xffe21dc3,0x0008a9ad,0x0002d21f,0x0005ffbf,0xffffda1e,0xffd1ddaf,0xffe22c51,0xffe9a786,0xffd1a7a3,0xffdac369,0xffb30d5d,0xff8f2182,0xff73c8e2,0xff5e01be,0xff60312e,0xff6072ec, -0xff484640,0xff9a40d0,0xffe7a69b,0xffca70e2,0xffe08429,0xfffb1395,0x00205b38,0x002ecef4,0x001aa210,0xffff3021,0xffeb3664,0xfffbb760,0x00065332,0x001c1d39,0x001e4647,0x001e5af7,0x001916e6,0x0024e3cb,0x0025fe88,0x0016474c,0x00189ef2,0x001c8c43,0x000748ee,0x000b245b,0xfff53f17, -0xffc5f766,0xffa65777,0xff91752a,0xffa48d2b,0xff8b6d61,0xff711159,0xff5888ca,0xff4f8ccc,0xff5f3b83,0xff6a660a,0xff964936,0xff7b241d,0xffa70134,0xffcb4527,0xffb25f77,0xffb65af7,0xffb3b441,0xffb56cea,0xffc10ae7,0xffcbb616,0xffe0b050,0xffefb8dd,0x000d307f,0x0027ce79,0x00442a34, -0x0035061b,0x002a08ec,0x00214c4d,0x00259ff1,0x003c966d,0x002b5f55,0x000a8acf,0x001ea8bd,0x002f6a4e,0x000faf71,0xffefabf2,0xffdf49b1,0xffc28796,0xffb8f102,0xff8198b8,0xffa77ecf,0xffaa4711,0xffc87eea,0xffb3e534,0xff9e4f7a,0xff82bdb9,0xff9123c0,0xff4d7f5d,0xff9404bd,0xffb0d5b3, -0xffc4f2ed,0xffe1fcc3,0xfffd0fbb,0x00199d59,0x0031ad76,0x0035a39e,0x0037fa03,0x003a1616,0x0039fbff,0x0036bdaa,0x00367999,0x0037b40b,0x003bec37,0x003e7352,0x003dfafc,0x003e70c2,0x0045a65e,0x000333b1,0x001a9a14,0x000224e4,0xffef51d6,0xffda2d80,0xffdb82f4,0xffdca22b,0xffcd7e2c, -0xffb4232e,0xffc5137c,0xffc0b8d7,0xffa725aa,0xffa4e2a3,0xff8fdcb0,0xff8af009,0xffa222c6,0xffb5ffbf,0xfffa3de9,0xfff2e1ae,0xfffd601a,0x0004074b,0x0009a79d,0x000f4fb6,0x00195946,0x001903d4,0x001b8600,0x001da0da,0x001fc193,0x0022716a,0x0023e9e1,0x0023f51d,0x00235168,0x00234840, -0x0024091f,0x00202fb4,0x00321131,0xffeaef47,0xffb9f716,0xffa41a6c,0xffe937d9,0xffa98567,0xff94e576,0xff90cbfb,0xff931adf,0xff9b4b3b,0xff8deff1,0xff8bb1a4,0xff8c7617,0xff969553,0xffcdce61,0xff89c7ba,0xff8a751a,0x0015f5ab,0xfff7bb39,0x00720975,0xffe69241,0xfffb8e59,0xfff4e710, -0xfff2eff2,0xfff79034,0xfff985ac,0xfffd3bdb,0xfff81a14,0xfff5a2c2,0xfff70095,0xffed8b6b,0xffea8111,0xffe7660a,0xffebad6d,0xfff033c8,0xfff82f2b,0xfffbc447,0xffff582f,0xffdf0207,0x006861bd,0x0082e1ec,0x00462526,0x004cdb24,0x0085c880,0x005c4057,0x0069fc5e,0x006cd9b4,0x0059c810, -0x00722c30,0x0073d037,0x006902ff,0x008ac60c,0x004c1049,0x00526044,0x00970bbe,0x00883a0d,0x001aadc9,0xffeb71d2,0xfff5fb93,0xffecef61,0xfffb1b24,0x0004207d,0x000be77e,0x0003046b,0xfffbc0c2,0xfffd0ef3,0xffe0a16e,0xffce1248,0xffc69ebc,0xffcb89fd,0xffdfaf95,0xfff93352,0x00104121, -0x0000077c,0x0012cf18,0x0063f507,0x000ed4dc,0x002634ce,0x001a3b70,0x00311d39,0x0041d279,0x00383feb,0x004c60c9,0x005e75ed,0x00377d3d,0x00188843,0x00218ff8,0x00311690,0x004ce30e,0x00472284,0x001b824e,0x008e286d,0x005583c5,0xffe8718a,0xfff33482,0xffdac74b,0xfffc549a,0x0010b119, -0x001ff64b,0x0009f4a6,0xfffa0681,0xfffa47f4,0xffcb1ebd,0xffb5af3e,0xffaf0948,0xffb916b4,0xffd7f7a2,0x00015769,0x001f49ab,0x0007838e,0x0026b43a,0x004cdeec,0x001ed4ec,0xfffea29c,0x0007dcea,0x003e41b4,0x004124bb,0x00713dab,0x003e8798,0x006df9e0,0x00351967,0x005be9f1,0x00236e5e, -0x004e536a,0x004977f2,0x0045dd5f,0x005446e2,0x006c32d4,0x004bbb90,0xffdd697f,0xfff0a0f9,0xffcf9b5d,0xfff4bc56,0x0022a1cb,0x0046ec94,0x002d54c4,0x001709d6,0x001bc292,0xffd52682,0xff90570a,0xff75c2cc,0xff7b64c2,0xffbb27fe,0x00094822,0x003e52b1,0x0017bbf4,0x001ba8b4,0x003a5de9, -0xffd5a44f,0xfffc8984,0xfffae5de,0x0014d1ac,0x003991fd,0x00795eb5,0x008d45eb,0x003a0e4b,0x00464a2d,0x0031256d,0x00102357,0x004954df,0x006af91a,0x00213f6a,0x0030b25b,0x0168266e,0x00cce2e7,0xfff59832,0xffdcc9c9,0xffbc08f7,0x00779379,0x008e18fa,0xffe5c7ec,0xfff87541,0xff896e5a, -0xfef1b858,0xfeeae562,0xff3d282f,0xffe88d89,0x00259f54,0x0033ec6b,0xffe77358,0x001666dc,0x0011a506,0x006f92cd,0x00a6e79e,0x0044f3d7,0x00512b49,0x0028bf76,0x00246e67,0x0044ecb7,0x000a4149,0x0033e4c9,0x00beb14c,0x008ada20,0x004a77a8,0x0035b8d4,0xffe56636,0xffe15fce,0x001e358a, -0x0100aca0,0xfec329c6,0xff3e318d,0xff906e24,0x002f8f27,0x0006badc,0x00718d2b,0x00612641,0xffd8ceb0,0xffd78d56,0xfff825f6,0x006c1400,0x002b2160,0x001e4b7b,0x003f4d3f,0x00577693,0x00777ba6,0x00797ca5,0x004b7c7e,0x00045b12,0x003870cc,0x002bb016,0x0019bb9f,0x00325f8f,0x001345f9, -0x002358e1,0x00251ac4,0x0068454a,0x00764d2f,0x00467467,0x001e5feb,0x002d7c8f,0x004503fc,0x004482ef,0x005ca59c,0x00e0c431,0xfeffd006,0x00e910ec,0x00eca64c,0x00da3058,0x00c93245,0x00dff4b1,0x00bf1e6d,0x0060166f,0x0004586c,0xff588b0c,0xff4f9fbe,0xfff6e774,0xffd86ba8,0x00118975, -0x00365108,0x001417c3,0xfff5b555,0xffefe5ce,0xffe44804,0xffb49340,0xfffa872d,0x00132d6c,0xfffa8a63,0x001ef8c8,0xffff2d80,0x001a677b,0x0038eff5,0x0020b72b,0x00178a7e,0x001692c8,0x00340481,0x00313d23,0x00140f42,0x005d346e,0x00536cc3,0x008121d3,0x00b189f2,0xffc894bc,0xffe55dce, -0x003e4780,0x00b4c83c,0x00d4a117,0x01079a6e,0x01088650,0x00c4f6b8,0x009bd83c,0x007a4945,0x00b09020,0x002bfff5,0xfffc8de0,0x00047e7e,0x002e77b5,0x003c3d1d,0x0039a3eb,0x0039c30b,0x001a55b9,0x0029094a,0x0027ccfc,0x000337c8,0x0004d1ed,0xfff92234,0xfffaeb52,0xfffff252,0x001f19c4, -0x0038f4d9,0x001dcbff,0x0022733c,0x000fd09a,0xffe1bd20,0xffeb6e57,0xfff2f2f5,0xffda36b6,0xffbb3107,0x000b5a32,0x0058cbc8,0x005bf886,0x00729054,0x005a497c,0x00540db8,0x000d99b4,0xff9e6747,0xffd76ced,0xfffc59c5,0x00431a1a,0x00462bbf,0x00448daa,0x0042963d,0x001e9267,0x000b6d8c, -0xfff1276d,0x00075fb4,0x0006583c,0x00126f4f,0x002a130e,0x0008224d,0x0004224a,0x0003fc84,0xfff6e8c0,0xffcec00d,0xffe17f5a,0xffd4839f,0xffe34917,0xffdc083c,0xffd61c1b,0xffcbd9cd,0xffb4f819,0xffa8b033,0xffb36333,0xffe5a154,0x000e4e3a,0x000d694a,0xffde842d,0xffe1dd18,0xffd0e648, -0xffbe9262,0xffc24d4e,0xffd8c6fb,0xffd46da3,0xffc995a1,0xffc50528,0xffe56750,0x000a9993,0x0030562f,0x002749be,0x0013c2e8,0xffeb780e,0xfff2f1a0,0xfff5e05d,0x00127e0a,0x001a096a,0x001f0e89,0x00462538,0x00157667,0xffe7cf6c,0xffba8caa,0xffa13b8a,0xff98fc41,0xff85c3a1,0xff7f9574, -0xff6b2f8e,0xff52af25,0xff522af2,0xff6bc455,0xff8a4571,0xffd9eae3,0xffdde324,0xffbd9dd2,0xffa4d510,0xffacf3b1,0xffa15793,0xffa7d09a,0xffa207bb,0xff9ed158,0xffb88540,0xffd69437,0xffef5af7,0xfff80c77,0xffffa7df,0x001282c1,0x0006bce1,0x00035dff,0xfff9bbdf,0x000bde82,0x0006a5ca, -0x002a81d0,0x00461a97,0x00370207,0x0035d873,0x0005e3dd,0xfff2776f,0xffbdb357,0xffc36614,0xff91be21,0xffa325aa,0xff9830af,0xffc0d802,0xffc8d3b7,0xffd2fdd6,0xffe3cf17,0xfff37159,0xffdaf2e4,0xffb2b937,0xff9ebbd9,0xffa6daee,0xffb9b691,0xffc5ea79,0xffd4d459,0xffe55b3a,0xfff56eb4, -0xfff3bd9d,0xffeeac0f,0xffee829e,0xfff23deb,0xfffadd14,0x000a465f,0x000a1ad8,0x000c5ea7,0x000ac75f,0x000cac05,0x0006ecf7,0x000aed0a,0x0034d27d,0x0005641c,0x000d3c57,0xfffe6d38,0x0003ef9d,0xfff199a4,0xffdf5896,0xffe3916d,0xffe9be9f,0xffc5ea7e,0xffaa57d1,0xffa9dc3f,0xffa0aa40, -0xffa6a8c2,0xffa78d57,0xff953e9e,0x0008b001,0xffc196bc,0xffd120ac,0xffd47ba1,0xffd845c9,0xffdc16ec,0xffdeb40a,0xffe3d59e,0xffe26dfa,0xffe54f72,0xffe77326,0xffe9ddea,0xffea9551,0xffeb7160,0xffeb05f2,0xffebff22,0xffed3644,0xffed8b91,0xfff0f70b,0xffe21f09,0x00291cfd,0x0042d324, -0x002d9c0b,0x00185934,0x003ee9f0,0x00285149,0x0029483c,0x0023d1e1,0x0016df07,0x001e9759,0x001be7d1,0x00146d2d,0x002122e6,0xfffe0cab,0x00011334,0x001e6a27,0xffe57d9e,0xffd44bb2,0xff96427d,0xfff45f4d,0xffdd24ed,0xffd1452a,0xffcfb8f6,0xffc05690,0xffbfef4f,0xffd05f8d,0xffca6929, -0xffcbafa5,0xffd26c80,0xffc8f068,0xffc4d82c,0xffbdd45c,0xffc5e42c,0xffcbf932,0xffd4b5d9,0xffd8caf7,0xffdef4f8,0xffe5e1d2,0xff8e87dd,0xff9deb18,0x00119f72,0xff8f53cf,0xff9b7bac,0x0017eba2,0x000dcb23,0x000c0043,0x000ed72a,0xfffe1ef2,0xfff97ae0,0xfff0c5d9,0xffa248e4,0xff9cc42f, -0x00120451,0xffa2029b,0xffc90509,0xffd8b4fd,0xffe19146,0xffbfc7ab,0xffbc9567,0xff8b9945,0xff86ed26,0xffb2fd7b,0xffac4fed,0xffb5cb16,0xffc42fe9,0xffb3cba9,0xffa5631a,0xff934b85,0xff9bc4a6,0xffa7248a,0xffbea008,0xffccc1e3,0xffe72466,0xffc4ff27,0xffcc7553,0xffc95c0b,0xffa6a6cb, -0xffc8e113,0xffd31514,0xffe051fa,0xffed8c87,0xffdb4435,0xffcbec41,0xffdc2975,0xffec78f8,0xffd46baa,0xffe925c5,0xffe835fe,0xffc1829c,0xffd56eb3,0xffda057f,0x0019a65d,0xfffacaaa,0xffb12910,0xffb6c300,0xff518d6a,0xff3f6ee1,0xffa19d82,0xff819f71,0xff90ec80,0xffab0e6c,0xff8257ea, -0xff6bd88f,0xff469623,0xff65ac1b,0xff839046,0xffb2f524,0xffd643be,0xfff97d4d,0xffdb016c,0xffbdb06b,0xffc5e4c6,0xffbe2642,0xffc856d9,0xffdc8227,0x0017287b,0x00230e7e,0x0042ca65,0x000a7034,0x0038abde,0x0011ca91,0xffef8d53,0x00103357,0x0003ae71,0xffdbcc5f,0xffea9a8c,0xffd8715f, -0x002114fc,0x00046418,0xffb42d58,0xffad996b,0xfef81060,0xfed904e8,0xff6fff3e,0xff55ab0b,0xff76f7ef,0xffb674b5,0xff82e2ef,0xff3b557d,0xfef82e88,0xfefd1dce,0xff2ac425,0xff79c602,0xffbdb66f,0x000250c7,0xffdc0df4,0xffd3dff1,0xffe4be6b,0xffbfccff,0xffeb9382,0x001a98a1,0x00545fe4, -0x0080216c,0x008d6bb6,0x005c9607,0x0042c07a,0x0045573f,0x001f00ac,0x0055e495,0x00457b4f,0x0008c41c,0xffeea4c1,0x00684391,0x00413aef,0xffe80581,0xff8ab6e1,0xff635b39,0xffe2ae98,0xffda784e,0xff30938a,0xffbd6126,0xffa15cc1,0xff2edc74,0xff52d39f,0xffa62dfd,0x003e3ecd,0x00514b98, -0x00545bb8,0x005c14f4,0x00272151,0x0015e316,0xffeaf562,0x00114b36,0x0042ee14,0x0028ea5e,0x0019f06e,0x000660cc,0x0034dc50,0x000457fd,0x0034f571,0x00ce8a58,0x006c3ea7,0x002919a0,0x0009687c,0xffb15358,0xff885c2f,0xffdb491d,0x004df13a,0xfe27dff0,0xff3d1496,0xfffe9263,0x0023b470, -0x001c31ac,0xfff2e1d1,0xffbd94ce,0xff6b4f30,0xff7b0914,0xffc63626,0x0072e6d9,0x00119828,0xffee57ab,0xfff1592c,0x000cdcc5,0x00022abb,0xffc15428,0xffa623a9,0xffc5c190,0xffeb05b1,0xfff9c197,0x00046b76,0x00028d17,0x0010b162,0x0023d5ac,0x00261388,0x006c94cf,0x0073e6be,0x003918fa, -0x00221f5f,0x0026315e,0x003e8eae,0x00399713,0x0059a33e,0x009fad32,0xfeca67d0,0x00ef5ba0,0x00f30920,0x00bee3e2,0x004e4c92,0xff7f3aa2,0xff52fc66,0xff007cee,0xfec3e7f8,0xff232794,0xff7edaf2,0xfff7a111,0xffb2db09,0xffb905a3,0xffca399e,0xffe1a87d,0xffe99d5c,0xffeed06d,0xffe522e0, -0xffee9235,0xffc3fb04,0xffc0c065,0xffecb306,0xfff0dfc8,0xffe3dba1,0x000dddeb,0x00318895,0x001c12c3,0x0018d70c,0x00150483,0x0032219a,0x002fa061,0x00113de4,0x003431fe,0x0047f430,0x004d3bcd,0x00c35e22,0xff88045c,0xff8fb0be,0xff6139d1,0xff2c51ac,0xfef1383a,0xff777612,0xfff2d980, -0x008ff7ee,0x0027ed18,0xffee3c79,0xffff68f7,0xffa6df07,0xff8e3391,0xffb0748a,0xffd5e848,0xffe0ac4a,0xffebf7e4,0xfff30e1f,0x000df2ce,0x000dcf97,0xfff3683e,0xffedf314,0xffeefd2e,0xffe7a3c7,0xffecdeb4,0xfff31838,0x001e38da,0x00268f0a,0x001763d4,0x001bfc08,0x000fa1bb,0xfffc7feb, -0xffeab912,0xfff0b172,0xffdb1386,0xffb61c03,0xff9b7b88,0xff597b7c,0xff013cc5,0xfefd1688,0xff2b073d,0xff130f1a,0xff03de5f,0xfef93afa,0xff477da9,0xff65bc5d,0xff4f3a84,0xff8b6fb6,0xffad56d0,0xffbc7296,0xffdb1678,0xfff236d1,0xfffe7807,0x0005d7e7,0x0008e0e4,0xfff23afa,0xffdd4dbe, -0xffee417d,0x0005304a,0xfff94e22,0xffedff90,0xffc8718d,0xffcef00a,0xffceaf42,0xffbea715,0xffcda174,0xffbcf45b,0xffacfb49,0xffa84696,0xff97b71b,0xff98c730,0xff6b4897,0xffaee64e,0xff735d1f,0xff8edca3,0xff9db487,0xffbeea6e,0xffc3b6b5,0xffd4bf61,0xffc73058,0xffe0ae46,0xffee7a3d, -0xfffdb671,0xfff4fbd1,0xffeba072,0xffef90c1,0xffd36102,0xffccee60,0xffda08d0,0xfff04bcd,0x00081589,0x001608b9,0x001296b6,0x000e8d77,0x00014443,0xffe4b509,0xffd242bc,0xffaed87d,0xffa0cf30,0xff93bf1e,0xff96770b,0xff7cc780,0xff5fcc5f,0xff4280b9,0xff3c45eb,0xff38b27a,0xff49f372, -0xff73b685,0xff89b4ec,0xffa999f2,0xffb704aa,0xff9d74cf,0xff95f780,0xff82ada6,0xff72f401,0xff64abc9,0xff7cc78e,0xff94d37a,0xffb07ce6,0xffca348e,0xffe72a40,0x00073de6,0x0005f908,0x0006d3bc,0x0006b189,0x00059fae,0x000e01e5,0x000545cf,0xfffd4662,0x001207f9,0x0023948b,0xfff60b25, -0xffd2a8e0,0xffa4f0a0,0xff9ddf52,0xff8a5df6,0xff6c1f2a,0xff89b27b,0xff9421cb,0xffa46c87,0xffa68e4e,0xffa98365,0xffad890f,0xffa3ea89,0xff8df344,0xff90b6a3,0xffa1a3d5,0xffa44374,0xffafd55e,0xffba348f,0xffc73dad,0xffcc10c7,0xffdd201b,0xffe8c401,0xfff31c9a,0xfffde297,0x00044126, -0x0009cebe,0x00096722,0x000b8c77,0x000dfbb9,0x000ea0c5,0x001472a9,0x000f552d,0xfff9e70d,0xffe86dae,0xffcabf9d,0xffcb973b,0xffbb4951,0xffa80fad,0xffaaa995,0xff9ab726,0xff94c401,0xff963be0,0xff9889af,0xff8b2c80,0xff8cbaa2,0xff8b1c8e,0xff80f837,0xff8ec226,0xff984592,0xffc56dfb, -0xffc4fa5a,0xffc684cc,0xffc923e1,0xffc95cb0,0xffca5a92,0xffcbf148,0xffd128c4,0xffd5d2e7,0xffdb0d6a,0xffdf922c,0xffe4c6ba,0xffeb2c67,0xffea9cb7,0xffeaad7c,0xffeb23a2,0xffea8669,0xffea755b,0xfff28d0d,0xffbea0a7,0xffbb0816,0xfff650ae,0xffadbab4,0xffa9006f,0xffed17f5,0xffe5b21f, -0xffe2519a,0xffe2285d,0xffd5b64a,0xffd0ce94,0xffce029d,0xff9ee4eb,0xff9d6354,0xffdc145c,0xff9ec8b3,0xffce2f18,0x003fb43e,0x0064c7d5,0x004ece34,0x00356a8a,0x00379eec,0x002f0409,0x003e8dbd,0x00454b4f,0x004e1794,0x0046f6f2,0x0043c257,0x0041ee14,0x003b78ff,0x00382132,0x0032cfc2, -0x00374d20,0x003b1257,0x00410489,0x00462d80,0x003e69f3,0x0043e0be,0x0057a02d,0x00203c7c,0xff8e5e10,0x005d90a8,0x002b1f81,0xffadd716,0xffb5f6ad,0xffba543d,0xffb9c6cb,0xffc4d3ab,0xffc5b4e8,0xffbfdc22,0x0036034c,0x006d8dc8,0xffa0b708,0x002bf2f5,0x000f4d2f,0x006d5680,0x002dedbd, -0x002f29db,0x001ef2e1,0x00453962,0x005b6721,0x006f7c87,0x00658a3b,0x005f6a75,0x005b2086,0x004a9329,0x003aa76c,0x002c4402,0x00330dae,0x0041238a,0x005444c3,0x0064364f,0x00569b80,0x005923d1,0xfff614d3,0x001fb680,0x002b9266,0x0012eae5,0x001bfe22,0x00579b51,0x00502300,0x00660557, -0x005af399,0x005d878d,0x004a0548,0x0029f3aa,0x004af4c0,0x0037132d,0x002b7aee,0x004dafb1,0x007a50e8,0x008c1c8d,0x003476f9,0x002495d8,0x0008d9ee,0x004ac7c7,0x00787315,0x00a77e7c,0x008b89d4,0x007cb22b,0x006ea452,0x004ea803,0x00378d4f,0x0020faec,0x002f5322,0x0047e54f,0x006a13ee, -0x007d5595,0x0077560c,0x004933cd,0x002f1d7c,0x0013df79,0xffff0171,0x000bb7db,0x001a901f,0x0052c128,0x0047cea1,0x0056c77d,0x0055fefd,0x004a2997,0x004a5a91,0x001fb58d,0x00462ca8,0x0043f910,0x00216ff3,0x005ee079,0x0054612e,0x0081cf10,0x00150c82,0x00089c8e,0xffe217fd,0x0039c0a7, -0x00893a62,0x00dd11d5,0x00be13e4,0x00b11984,0x00a98a05,0x008251a9,0x0048bb7c,0x001b44c5,0x00263904,0x00517be8,0x008c0ff1,0x00affd63,0x008f7d1c,0x004e229b,0x00077023,0xffebaa7d,0xffd90bd9,0xfffb2c95,0x001a63c3,0x004e9968,0x00800683,0x00843a08,0x0047f097,0x004b6021,0x0042cb02, -0x0015b95b,0x0063041c,0x00758518,0x000d8c61,0x004646b8,0x013ed9ce,0x011f1e1c,0x0098ce29,0x0057d376,0x0002f82f,0x00d66031,0x0102872e,0x0088224b,0x00b14c98,0x004b6a20,0xffa6f78d,0xff903c7b,0xffa9d704,0xffe41aa6,0x00472431,0x006a129a,0x0054d49e,0x007d460a,0x009859ff,0x009ce61e, -0x007422f2,0x0067238d,0x004faa68,0x0032c50c,0x001a3280,0x002ad48b,0x0002fa73,0x003bd3a9,0x00d2fc22,0x006f27ad,0x0027eee4,0x001df7e3,0xffb8b15b,0xffb773a6,0x002f3d47,0x0100dde8,0xfeb0659e,0xff938b0a,0xffa31a9c,0x002cbc2f,0x0041289c,0x0092da21,0x0073068d,0xffdff03d,0xffc76a24, -0xffec13d1,0x008fb692,0x002a37d7,0x001654e4,0x004a422e,0x0091ec91,0x00d2d081,0x00f103e0,0x009d55ab,0x00584dc6,0x003cca73,0x001bb1f6,0x0023cc41,0x00351c1c,0x001d3328,0x002cf076,0x002f4abe,0x006bd866,0x006e57ee,0x0034b3ae,0x002939cd,0x002e2812,0x003ed096,0x00560ffc,0x008a47ef, -0x00cb3483,0xff18b398,0x01135984,0x013217e6,0x00f6d315,0x0105238c,0x0188ee68,0x01ecbeae,0x01bf0432,0x00e9eda2,0x0051f601,0x0004aad6,0x0053028f,0x00a90500,0x0108796a,0x0125c6fc,0x00edbf02,0x0082480d,0xfffafc56,0xfffaaa02,0xfff689a8,0x0016143e,0x001f95db,0x00170111,0x001d2018, -0x00157595,0x0025fec8,0x002f2d15,0x001f43a2,0x001bfb7b,0x001ad2e6,0x003bf0c4,0x0043d661,0x003d9702,0x00509af8,0x003e1cde,0x0068703f,0x00d9f239,0xff89c736,0xffb778ff,0x006c0506,0x0124ad24,0x01ebcbea,0x01d03ae0,0x0190ccaa,0x00ec02a1,0x00dd5711,0x00b74eb0,0x00b96305,0x00691edb, -0x00397c36,0x002f85c1,0x0076d900,0x009ce63f,0x00954143,0x007df2cc,0x00469bad,0x002df00a,0x000bf871,0x000a3a67,0xfffb86f9,0xfff2babc,0xfff87b95,0xfffba07b,0x0010c7eb,0x0028b41e,0x001b98ad,0x00170625,0x00096e90,0x0003e8e4,0xfff3fec0,0x00112018,0xffef4379,0xffafabd9,0xffe33a01, -0x00abe504,0x01285196,0x01148c18,0x010b01d2,0x00f3a8c5,0x00c98287,0x0074888e,0x007a8932,0x0078d7c3,0x009a81da,0x008f84bc,0x00853693,0x00779bc1,0x003d05da,0x001d7c71,0x00118102,0x001aaeb1,0x0026147f,0x002b4546,0x001d9455,0x001d4922,0x00138eca,0xfffb5fd0,0xffeef19f,0xffdcc64d, -0xffd48eb1,0xffd04711,0xffde1d10,0xffee0ad0,0xffec9f21,0xffebbf4c,0xffe409ca,0xffd7d082,0xffc0c89d,0x0021860d,0xffa666e7,0x0028fa05,0x004f694c,0x0048c29e,0x005298f9,0x00466da8,0x00504f41,0x007afeb6,0x001b1e31,0xfff1ca8e,0xffef27e2,0x0019a8bc,0x00410cfe,0x005e6bdd,0x004506e1, -0x0038dbab,0x002062f7,0x00268186,0x001cc724,0x000a90d3,0x0018dc7c,0x001eba52,0x0031ab05,0x0005ace0,0xffdbe287,0xffb6d9c4,0xffb2cc73,0xffa84691,0xff96eb2f,0xff8b2f78,0xff764599,0xff640adb,0xff519922,0xff6b02e6,0xff77e5c3,0xffdec8ae,0x0004f9c6,0x0008c6c6,0x0005f994,0x00034a63, -0x0001ae28,0x0004ed85,0x0000083e,0x00045ae3,0x0010f722,0x0024697e,0x002be305,0x001ad3a0,0x00085e27,0xfffd01bd,0x0001ed47,0x000812bf,0x000ba5f0,0x001be5d0,0x00283024,0x003d2a0e,0x003437d2,0x002742b8,0x0028371c,0xfff7500d,0xffcd8805,0xff9c4821,0xff92e113,0xff8ea89c,0xff86d689, -0xff91076d,0xff9e8f09,0xffafcae1,0xffc85570,0xffe2c447,0xfff1be85,0xfff9d53d,0xff92cfb7,0xffdd0ccb,0xffe2aa93,0xfff4c539,0x0001cfb7,0x001288e1,0x0023f5cb,0x00325baf,0x002394e2,0x00116640,0x0005314b,0xfffb6af8,0xfff718bf,0xfff24d07,0xfff4bff9,0xfff49464,0xfff34999,0xfff3f798, -0xffeafc4b,0xfff829cd,0x0000c9ba,0xfffd2c93,0x000752da,0xffef89fa,0xfff6936f,0xfffdc976,0xfff8e29d,0xfffaa86b,0xffed118c,0xffe61bd3,0xffd4c83a,0xffc06336,0xffc2ecb0,0xffb3c610,0xffbc1a0a,0xffc95007,0x0009cc0d,0xfff97cd1,0xfff58828,0xfffdb08d,0x0000ed10,0x000481fb,0x000739a2, -0x000fc2cc,0x0008380a,0x0006b94f,0x00040f99,0x0001e39f,0xfffeb547,0xfffa6573,0xfffb34dc,0xfffbb902,0xfffc33b5,0xfffdd045,0xfffe1668,0xfff993a2,0x001ae43f,0x00068b89,0xffbd0abc,0x001a95be,0x0003de06,0xffad4dd4,0xffaea2be,0xffaf2cf6,0xffafc0f9,0xffb2b714,0xffb40671,0xffb559bb, -0xfff35b97,0x00112c6a,0xffa313f7,0xffebd164,0x0001ff2b,0xff9bf061,0xffc2aff6,0xff985b6f,0xffad3f89,0xff9d8f6e,0xffa48ed0,0xff8e4e3e,0xff8aaeaf,0xff964442,0xff910038,0xff925b7a,0xff978bd9,0xff95560f,0xff92fc2e,0xff8adb09,0xff8d8fa5,0xff9112f0,0xff97cd19,0xff9e4e89,0xffacb122, -0xff91d561,0xffbc8df4,0x000781f6,0x008f8c57,0xffa0383a,0xffffc667,0x009282f5,0x008cafe7,0x008b4c43,0x00803aa6,0x0083b395,0x00813e68,0x00715f11,0x0003fd3a,0xff9e9b38,0x0089d0ca,0x00163b09,0x003e7561,0xff9b1cce,0xffa5298b,0xff967df1,0xff9fee4b,0xff67c49a,0xff5b41ce,0xff76d673, -0xff6bf272,0xff7423a5,0xff818304,0xff82ea32,0xff75c8a8,0xff5b22ae,0xff56c56d,0xff5d54de,0xff707ca0,0xff8dc005,0xffa05a8c,0xff98a6d6,0x0029af26,0xffbb2a14,0xffb29ea7,0xffce2f6c,0xffe3e849,0xffdc3273,0xffd4465a,0xffc9f8c3,0xffe3ed77,0xffcaac49,0xffca38dc,0xffd191d7,0xffdd3b5c, -0xfffedb0c,0xffd5d182,0xffb0b828,0x0000b109,0xffe39f30,0xffa67101,0xff8c14c6,0xffa48db0,0xff357a01,0xff18c59c,0xff552079,0xff362a91,0xff460d38,0xff5b1bb5,0xff588c8e,0xff4820e1,0xff1b3a73,0xff1b901b,0xff2e395a,0xff538394,0xff8ea34b,0xff9f6506,0xffca3599,0xffde8f86,0xffca69ba, -0xffc382c6,0xffbdf5c6,0xffefbf7a,0x00099b82,0x0028049f,0x0008367d,0x00225429,0x0022bdb9,0x0029e6bc,0xffe85464,0x0017aa00,0x000a1b61,0xffec473f,0xffebbca8,0x0001ce4f,0xffe1f02d,0xffb4fca6,0xffa52a93,0xffbebc4e,0xff1225ab,0xfee03282,0xff309315,0xff0d07ed,0xff258b23,0xff5d60ca, -0xff64f959,0xff292aaf,0xfecc81c4,0xfeaad70a,0xfec21634,0xff053849,0xff6ddc0e,0xffa58e14,0xffc12b38,0xfff46be8,0xffb3d6fb,0xffce8861,0xffc7e54b,0xfff98acc,0x0044413c,0x0069d056,0x00818177,0x00481ff9,0x00464eaa,0x003d5929,0x0016e59f,0x00528b56,0x0046e3d6,0xffe7e1c2,0xffd14f70, -0x00d67d0b,0x000d3aaf,0xff6944fe,0xff15e88e,0xfede4880,0xff4b76ae,0xff5441c8,0xfec70e12,0xff46403b,0xff331f78,0xfec18f18,0xfeda19f6,0xff27284c,0xffac2f48,0xfff2bae7,0x000714c3,0xffccea26,0xffc80015,0xffac490f,0xffe25154,0x00467cbe,0x0014a6b5,0x001741dd,0x0011600e,0x0006d118, -0x001f65ba,0xfff8bf59,0x00323107,0x00c9c55a,0x004c6f6b,0x0007f734,0xfff4b2d6,0xff8244a6,0xff8ca861,0x001b2743,0x00aec17c,0xfe61b3b6,0xfefce194,0xff54eb87,0xffdad0c0,0x00548083,0x00160ecb,0xffe2b810,0xffa4e01b,0xff69bf7c,0xff9a79d2,0x0069f0c5,0x00160a7b,0xfff22fff,0xffe31bad, -0xffd79924,0xffafe334,0xff4ca3af,0xff741e72,0xff8917f0,0xffdfd985,0x001d5246,0x0019b9ee,0x0013cf9d,0xfff5c70c,0x0009ad3a,0x002a2e82,0x0065a20b,0x0063c781,0x0024cf61,0x001b2724,0x0020fecd,0x002d814b,0x005b3606,0x0055100d,0x00609ee2,0xfeaa4f5a,0x0123b1f6,0x00fd5f2b,0x00adeeb9, -0x0027575e,0xff1eaccf,0xff5a7ce2,0xff0084d2,0xfe346a90,0xfe9ceb6a,0xfeeed9d2,0xff499928,0xff2aa273,0xff3e81c2,0xff659b1f,0xff9224d7,0xffc0ac75,0xffd4971d,0xffdc3d4c,0xffc1f48d,0xffade780,0xffc0b015,0xffdc0f34,0xfffb92b7,0xfff832ea,0x0015910a,0x0021cd06,0x000dde37,0x000afb68, -0x00104fea,0x00338b9d,0x003ef20f,0x00429a90,0x0035ab78,0x001e37f5,0x0056d331,0x00d8b977,0xff707a59,0xff86871d,0xff1c5f3e,0xfef35bc0,0xfe87ae2e,0xff0b6bcd,0xff8d42ac,0x00075c30,0x00506eac,0x0045c194,0x0023dd59,0xffe9fef3,0xffc35bcc,0xffce8848,0xffc9a84b,0xffc090e2,0xffaef08f, -0xffb3c97e,0xffc6cabe,0xfff1861b,0x00143ce8,0xfff0a3c3,0xffd9a0bb,0xffdc0032,0xffe538e4,0xffed3434,0x00028762,0x000fd151,0x000bda9c,0x0005d184,0xfff9c736,0xfff44d64,0xffece074,0xffe59478,0xfff31e89,0xff964ab0,0x0034f255,0xffc33068,0xfee725f4,0xfed94a0c,0xfee5d0c8,0xfee1917a, -0xfeee04f0,0xff09d9b6,0xff49fd7a,0xff581133,0xff399b77,0xff837736,0xffa5ceea,0xffb03ddd,0xffdd342f,0xfffbac7a,0x0004f328,0x001bbcd7,0x00092e7c,0xffe50cf2,0xfff64790,0xffe53a0b,0x000b8aa4,0xffee7f53,0xffdbe3bf,0xffceabf3,0xffc6b91e,0xffc1ab38,0xffce6dd0,0xffd8829a,0xffddf58f, -0xffe08b06,0xffe86315,0xffe395e4,0xfff4c512,0xffc6b46d,0xfffff66c,0xff8f88c6,0xff724498,0xff9ab15f,0xff9cb5d9,0xff9e16ef,0xff97c2d3,0xff79dcfd,0xffb5823a,0xffe1af9a,0x00011791,0xfff1af7d,0xffe7116d,0xffe82b0d,0xffc1c828,0xffb8a78d,0xffc8d332,0xffd86f8d,0xfff5aebd,0x0019c6dc, -0x001b34a8,0x000c65cf,0x00024b1f,0xffd1d018,0xffc002fd,0xffabbea2,0xffa64cec,0xff9f07c2,0xff8affb0,0xff7880c5,0xff61c899,0xff4d4c5f,0xff3d1230,0xff304cf2,0xff4f3e15,0xff6c69b1,0xffc02dc5,0xffbd2929,0xffad180c,0xffa6da8d,0xff9b2781,0xff8c0e00,0xff7af9eb,0xff63a3fd,0xff7aefdf, -0xff8a316a,0xffa49339,0xffb4d6e5,0xffc898c7,0xffe05663,0xffe5b421,0xffedff41,0xfff1d16f,0xfff1a6ce,0xffe96d82,0xfff2fb99,0x0003f64f,0x000790ba,0x000de899,0xffe099bb,0xffc23931,0xff8a3a06,0xff92c2fe,0xff7559f3,0xff7a10d1,0xff7e6517,0xff90a39d,0xff8e3daf,0xffa9fa32,0xffc681db, -0xffe90413,0xffcc656e,0xffe5cb60,0xffa76cf7,0xffa70142,0xff9eceee,0xff994120,0xff938a57,0xff90fa65,0xff897bf9,0xff9f49ac,0xffb00bf5,0xffbe2c73,0xffcec97c,0xffdd8ad4,0xffeb65df,0xffe772eb,0xffe52210,0xffe39765,0xffe29bdb,0xffe6d7bf,0xffd981de,0xffeeea7d,0xffc3e8a0,0xffb471db, -0xffc2a1c7,0xffc13ff7,0xffa7cf36,0xffa6ca6a,0xffa179fb,0xffaf259d,0xff9d9d62,0xff9edee6,0xffa2c472,0xffa262a2,0xffaee1ca,0xffa50192,0xff9d43a3,0xffb01b50,0xffa01a11,0xffa9fc1c,0xffa482cf,0xffa360df,0xffa09ce2,0xff9e108e,0xff983332,0xffa0460f,0xffa5b518,0xffaca777,0xffb2c4c5, -0xffb8c6ba,0xffc20a95,0xffbf6dac,0xffbf6a72,0xffbf7363,0xffbd7172,0xffbfb18b,0xffb9a8b8,0xffbd1d4d,0xffe2df25,0x0033c45b,0xffa65421,0xffd7d901,0x0033b775,0x002ee3b3,0x0028a0bc,0x002076cc,0x001dd5eb,0x00197517,0x0014f39e,0xffd68e92,0xffa227a9,0x0023d8f4,0xffde9d12,0xff9ab126, -0x0045d259,0x000aa477,0x006db62f,0x0038a033,0x003c67af,0x0032623f,0x003df3aa,0x00452eab,0x00531102,0x004bc5b1,0x004a2145,0x00499fb1,0x00466edc,0x0043248f,0x003b37e0,0x003f74c4,0x00421474,0x00466bce,0x004b1daf,0x004118a8,0x006234e0,0xfffe3aba,0xffabb1d2,0xff45c890,0x0018c7fe, -0xffb6b612,0xff611ecf,0xff5c4674,0xff5f3abe,0xff6ee2a4,0xff65c241,0xff63dc99,0xff605b6f,0xffc31aeb,0x003215ab,0xff52aba3,0xffadf160,0xff9f8d45,0x0064b7d7,0x003b33fd,0x002a79d4,0x001b5a45,0x00329f47,0x0045f660,0x0066e579,0x005ef55c,0x0061bae4,0x0062b5f1,0x00613591,0x005553ad, -0x003d9d58,0x0042e100,0x004798b6,0x0054c459,0x005ac016,0x005eb671,0x004ddcf6,0xff9b4233,0x0009c45a,0xfffba6c9,0xfff0f10c,0xfff00c30,0x0036e69c,0x0033eef4,0x003bb7c3,0x00218ca9,0x0043c42d,0x00469333,0x000f4b03,0x0033aeee,0x0004ce5a,0xffe8f511,0x003cc507,0x00275ed2,0x007401b1, -0x004a350c,0x0017757f,0x000850c9,0x0025e87a,0x004bd1b4,0x009a82a9,0x007d8848,0x007d822c,0x007881dd,0x006b6c7e,0x0055ad4f,0x0029dc76,0x0039fee2,0x00473296,0x00644d4b,0x006e4609,0x0084d45e,0x00335c81,0xffed8a15,0xffee5cd9,0xffe727ee,0xfff3ab22,0xffe68601,0x004793d8,0x0010635f, -0x00527aa4,0x0027f92f,0x004fac1a,0x0026a998,0x0007d5f6,0x00254ddc,0x0020e16b,0xffe284de,0x00349cbf,0x000ba8b4,0x0070117f,0x002b5c7c,0xfff54cf7,0xffdb92e6,0xfffc03e2,0x0031a5df,0x00a8d0dc,0x0090b360,0x00a34ca3,0x00b41d39,0x00b292b0,0x0080bd36,0x00323b15,0x0036f1e5,0x0046dfd8, -0x007240bc,0x00897715,0x00966d93,0x0042ef2c,0xffce9cd9,0xfffb6f71,0xffbeafa8,0xfff0bb6e,0x00135e8d,0x005bc580,0x007231c4,0x006ec3bd,0x0056b629,0x004ff0d2,0x0053f168,0x001e37f0,0x006c9f93,0x005ad50d,0xffe62acd,0x0025b237,0x00c58d74,0x00e570a8,0x00b7728b,0x00517b75,0xfff959f4, -0x009b3f5e,0x00cf2255,0x00926b93,0x00d978bb,0x009ae77f,0x00108ee2,0xfff6d965,0xfff8cd24,0xfffd2707,0x0054f812,0x007a999a,0x0099869c,0x00958b03,0x00b620d0,0x0075d9c3,0x001f921f,0x005ec778,0x002e56e2,0x002f6aba,0x000e39eb,0x001279fd,0x0000be84,0x00399ad3,0x00bfee95,0x004c23d7, -0x0008573c,0xffecf318,0xff85fa75,0xff8acbce,0x002a0da9,0x00bdc019,0xfe99d882,0xff91f506,0xffc71608,0x0023a9e8,0x007bd0ae,0x0063956f,0x0028a9d6,0xffcc6884,0xffaaa4f1,0xffddcc91,0x009ad46c,0x001bd0bb,0xfffc965f,0x0031210a,0x007a5205,0x00afd64b,0x00bcd797,0x00749ca3,0x005dd378, -0x001b3861,0x00048a88,0x00246b77,0x002336f2,0x001fdf66,0x0031206a,0x0039e4e0,0x0064add8,0x005c80a5,0x00234cd2,0x00247589,0x0025eb26,0x0048a66c,0x006eafcf,0x00924e6c,0x0051b79d,0xff218931,0x0104c0f0,0x01272afe,0x00d7f662,0x00bd38df,0x00f19890,0x01b1094a,0x01bc6f66,0x00c7ae74, -0x00b55c0b,0x006b43fc,0x00535a46,0x00e254ba,0x013b8a60,0x0145353a,0x01114d8e,0x00a38222,0x00091c2a,0x0006c309,0x0027c272,0x000e9112,0xfffe555f,0x00149d1b,0x000683dc,0x001b9d3e,0x002787ad,0x001c76f2,0x001766b9,0x0019b24e,0x001830aa,0x003fe5ea,0x004e8afc,0x005a8d9d,0x0022aa3a, -0x000ad198,0x002edc71,0x00d41bb1,0xff6349c9,0xff8dd964,0x0016fe31,0x009a58f8,0x016dbe6a,0x013a4766,0x0104cddc,0x009b7f6b,0x00b770d0,0x009eb1a6,0x0075f61f,0x005a011c,0x0037f35b,0x003a9fe1,0x0063a77e,0x0089e6a2,0x0089e2ad,0x0070be15,0x004740ae,0x001630c1,0xffec6edf,0x0001ccd7, -0xffea0802,0xffe2db46,0xffedabe9,0xfff7380d,0xfffd4a12,0x0008aadf,0x000c9212,0x000383f9,0xfffd61ef,0x0014cc49,0xfff56ff3,0x001391b9,0xfff88532,0xffa5c6a6,0xffcba90c,0x007ba612,0x00f90254,0x00cc71cb,0x00d6f5de,0x00b7511d,0x00bd5670,0x00b72888,0x0081babf,0x005f6689,0x004de344, -0x0051312a,0x0051cba6,0x0046f803,0x002acb67,0x001d1bb2,0x0026d831,0x001f1d24,0x002c9048,0x00254bd6,0xfffd5e08,0x00184dd3,0x00160fc3,0xfff2915d,0xffe5201a,0xffe3a9be,0xffcbe011,0xffd5c143,0xffe3a951,0xfff9f364,0xfff5ab87,0xfff8e3f9,0xffff7b3c,0xfffb525f,0xffe6c708,0x0021ec60, -0xff4ebfa6,0xffef1d06,0x0044e855,0x003d4ede,0x00527a9e,0x006518ab,0x007557b2,0x008dd211,0x0038b1a6,0x00180cad,0x0011ca11,0x0030b502,0x0041b230,0x004b7f4c,0x00325efa,0x002e77a4,0x003ae5e8,0x003c7090,0x003321e1,0x000ec4f8,0x001d81d3,0x001805d5,0xfffa1b04,0xffe54b82,0xffd119a2, -0xffbd7bf4,0xffc17c37,0xffb23373,0xffa84b18,0xff942dee,0xff80ff4c,0xff78df5e,0xff526556,0xff57e40c,0xff58d32a,0xffa0fcef,0xfff4a42e,0x001a2713,0x002f74b9,0x002527e8,0x002f6c1e,0x002adc92,0x0028003f,0x002cf2a6,0x002d28ec,0x0031bef9,0x002efa0f,0x001f5370,0x000df2a0,0xfffd72ec, -0x000a3628,0x0012ee52,0x001b3077,0x0020a157,0x0036945c,0x0030d092,0x000964bc,0x0008d9ec,0x000c7f96,0xffe8bf74,0xffb756e9,0xff971c5f,0xff7f4108,0xff95b364,0xff71e085,0xff8f1c4e,0xff83a5e8,0xff96fe14,0xffb22cf2,0xffc9cd56,0xffd3bc96,0xffedd2ed,0xff8dd914,0xffecd040,0xfff44629, -0xfffe5197,0x0009f55c,0x00175e4f,0x00257e87,0x002fdf8a,0x00266650,0x001b462c,0x001242c5,0x0008a14e,0x000177ec,0xfff5df15,0xfff73432,0xfff55983,0xfff53842,0xfff3f855,0xffee522e,0xfff9bffc,0xffd2e6ab,0xfff13476,0xffedb9c8,0xffdb620e,0xffdaebab,0xffed8422,0xfff668ac,0xfff319f8, -0xffdd79dc,0xfff0a5a7,0xfff0a7c6,0xffd71748,0xffdc90c3,0xffc292d7,0xffc7e369,0xffe43e37,0xffdec620,0x000b381e,0xfffca867,0x000494ec,0x0006bcf5,0x00092855,0x000b3cac,0x0011f5af,0x000c62c4,0x000a5c19,0x0007d4fa,0x0005bd88,0x00037a01,0x00007a7f,0x0000c4de,0x00005540,0xffffbef4, -0x0000ff1e,0xfffdf9a3,0x00078f1c,0xffe853ed,0xffb9b360,0xff7b5322,0xfff06a43,0xffb343dc,0xff69c248,0xff6a0a0e,0xff6ea960,0xff79c99d,0xff753ec5,0xff7847d4,0xff7f5c26,0xffb45423,0xfff2a383,0xff79af38,0xffac1376,0xfffe4611,0xffb67a9e,0x001d81a5,0xff9f4f83,0xffc20219,0xffb78fa0, -0xffbdf3c6,0xffb2c469,0xffb10e46,0xffb6b9ee,0xffb25cdd,0xffb278ad,0xffb45330,0xffb7080c,0xffb5c57f,0xffad91fe,0xffac0253,0xffacb60d,0xffb132c7,0xffb6fcea,0xffc21494,0xff9f52fe,0x00167a76,0x00569e79,0x007f358f,0xfff4957e,0x0052ba10,0x008b0002,0x008b3e32,0x008c41e2,0x007eef33, -0x00915e99,0x00916fed,0x00819461,0x005696cc,0xffeeda1b,0x007cf5e2,0x006a88fb,0x00775ffb,0xffbd66d1,0xffb1e9cb,0xffb7bb51,0xffbf629f,0xffa99823,0xffa3c2fc,0xffacc712,0xffa18398,0xffa57c44,0xffad6ab9,0xffb8c9a7,0xffacba97,0xff8eba18,0xff833067,0xff862754,0xff9523a1,0xffb14f15, -0xffb27ef9,0xffc5ec50,0x00530c22,0xffd98b3a,0xffe8424f,0xffecbb21,0x00044215,0x00082132,0xffeed89e,0xfff64442,0x0022b162,0xfff71826,0xffe5375b,0xfff4c7ad,0xfffd4060,0x001efe2e,0xffffdd58,0xffd35ffc,0x00436a26,0xfff0b8a1,0xffa28205,0xffb01940,0xffbdf960,0xff94596a,0xff8cded3, -0xffa1173a,0xff8abb34,0xff91e0f7,0xff98c072,0xffaddefb,0xffa021ac,0xff72f3d5,0xff5efe78,0xff64d84c,0xff7fbeb9,0xffafc878,0xffab6430,0xffeed9f3,0x00125447,0xffea8b46,0xffdcfbf4,0xffd6259a,0x000ac160,0x001d9f23,0x002cd07f,0xfff6de48,0x004784a8,0x00221e74,0x0043dedc,0xfff9a3ea, -0x0027b8f3,0x001da2c7,0x00023cae,0x0015cd0d,0x0037b18a,0xffe2d816,0xffa38cf4,0xffc4124d,0xffd74448,0xffa32f78,0xff9011b3,0xff9e335b,0xff8119f6,0xff8d1339,0xffaaf14a,0xffd9500e,0xffaac89f,0xff4630f8,0xff16f95e,0xff1c1925,0xff4e9cdd,0xffa3566c,0xffb18ccd,0xffe85d40,0x0012cd46, -0xffaf1105,0xffe14d34,0xffc233c2,0xffe7c05a,0x003c06d5,0x00503b5b,0x0066c43a,0x003bb302,0x00505829,0x003f3716,0x0015c9a2,0x005200d2,0x00479ae9,0xffcc79f8,0xffe32ca2,0x01344bb2,0x00343596,0xff8201b3,0xff4377b5,0xff07b052,0xff69a494,0xff977955,0xff597ad2,0xff8cdfbd,0xff6401c6, -0xfef19962,0xfedce520,0xff0b587e,0xff63ef9d,0xffcc099f,0xfff0a3b5,0xff9f6340,0xffc39bd4,0xffb4278c,0x001e6c6d,0x006d2cb6,0x00067f79,0x0012a4e3,0x001a6e4d,0x00129e34,0x000acf7f,0xfffadfa6,0x0030e7ab,0x00a38f8e,0x00383a5d,0xfff9f1d3,0xffde221c,0xff700650,0xffaa9452,0x005a2988, -0x010919da,0xfec9a732,0xff071362,0xff0945be,0xffcfd2e6,0x00962765,0x00580432,0x00247f0e,0xfff6e21f,0xff8afb32,0xffa40e5a,0x006c1ea0,0x0022a115,0x000493ec,0x0006a167,0xffea259a,0xffd22f4f,0xff9524f3,0xffc5dc98,0xffb83545,0xfffd6dc7,0x0030101d,0x002a07b4,0x0027b8d2,0xfff41300, -0x0007ca9e,0x003370af,0x0056603f,0x004c27f9,0x00159f5a,0x000dc1d6,0x001b2dbe,0x0039f43d,0x00865906,0x005f9710,0x0006f23a,0xfecd82d8,0x0113092e,0x00fce58f,0x0096c680,0x0024dfa4,0xff8b7f9c,0x00225ad3,0x0002ced6,0xff21fd35,0xff25ba27,0xff20d68d,0xff39227c,0xff6b6f34,0xffa3dd8f, -0xffd2a5c4,0xffdb9dcb,0xffe9f201,0xffd8823c,0xffe1c9ff,0xffba8b58,0xffd19d67,0xffe73d34,0xffe589cc,0x000cdce4,0x0019173e,0x00232bf9,0x0010bd9f,0x0005e808,0x0004aba2,0x000b9388,0x0039c382,0x004da8b2,0x0065136f,0x001e859b,0xffe4cfd1,0x0046b83b,0x00c30dae,0xff7b49e0,0xff902dcb, -0xff6b33e4,0xff9afb09,0xff781967,0xffa84a37,0xffd13e40,0xffd14e95,0x008a912c,0x00ac669c,0x0074b59a,0x0054e7c0,0x00279070,0x001c24bf,0xfffd5887,0xfff2bdf9,0xffd33625,0xffce9d74,0xffc05082,0xffe38da4,0x001d0b59,0xfff61684,0xffd4b954,0xffd632c2,0xffe21460,0xfff17557,0xffea5c71, -0xfffa1308,0x0000b34b,0xfff53086,0xffedd8c4,0xfff3551e,0xfff7540d,0xffef6c99,0xfffc4d38,0xff9075f1,0x008e763d,0x006c6934,0xffdaa02d,0xffccbcf3,0xffa999ae,0xffaf5119,0xffbf27ee,0xffd9062f,0xffd036ab,0xffc0c46c,0xffb0b8ad,0xffd60e1c,0xffe8ca10,0xffebc809,0xffff9dcc,0x000ff1fa, -0x000fbeb2,0x002611eb,0x00112abe,0xfff789c9,0x0019cc82,0xfff5d9b8,0x000a4354,0xffed997d,0xffd7c361,0xffd807d2,0xffcbfe73,0xffcbbe63,0xfff53f08,0xfff15c27,0x00013fb7,0x00121427,0x001c5246,0x0024a213,0x003929ae,0x003700c3,0x0003b1eb,0xffd189c0,0xff9d8460,0xffc28c11,0xffaf149b, -0xffb4eb69,0xffa95f41,0xff9df12a,0xffc60ca7,0xffe8fbd7,0xfffca2bc,0x00025458,0x00037f77,0x0005e5a6,0xffee8619,0xffe2a1d3,0xffee0d67,0xffecdff7,0xfff9d217,0x00199148,0x0021eeaa,0x000eb047,0x0000fbcf,0xffd1c770,0xffc09622,0xffbc1171,0xffb8b67c,0xffb0f6db,0xff8fc519,0xff84fe0c, -0xff77f711,0xff71c4d7,0xff51823c,0xff46ecfd,0xff625d20,0xff8399d0,0xfffd81db,0xffe9bdc4,0xffceaaa3,0xffdc488d,0xffd767e7,0xffd48455,0xffcc4d15,0xffbd3de3,0xffcaf964,0xffd166eb,0xffdf8380,0xffde29d7,0xffde6f17,0xffe2ab41,0xffec1b62,0xfff69324,0xfffaf24c,0xfffe8ae1,0xfff2edbb, -0x0008a707,0x00179f25,0x00060efe,0xfffb8154,0xffda1198,0xffc1e8a4,0xff925354,0xff98fd54,0xff7e5b88,0xff91e136,0xff866e4a,0xff989471,0xff8f02a4,0xffb5cfec,0xffdd4c07,0x0006036d,0xfff1c6d3,0x0004a214,0xffc9432c,0xffc1bdbd,0xffbd3321,0xffb4a19d,0xffad9fa8,0xffa87b66,0xffa375a4, -0xffae07ac,0xffb6551e,0xffbe39b6,0xffc8d477,0xffd6811f,0xffe4b8a8,0xffe06971,0xffdca7be,0xffd962bd,0xffd8f8e0,0xffd7d09a,0xffd10b7e,0xfff4476b,0xffcd3e0f,0xffcf4952,0xffd63290,0xffe04fcb,0xffd11173,0xffccea20,0xffd3465a,0xffe4b4d2,0xffcc6bc2,0xffc6379a,0xffd12c74,0xffcb6f17, -0xffd6255a,0xffd29b27,0xffbfd96e,0xffe67cfc,0xffb25899,0xffbde0dc,0xffb8bc4f,0xffb6c861,0xffb4e681,0xffb269a2,0xffad14cd,0xffb14224,0xffb44753,0xffb82fed,0xffbc0448,0xffbe84ae,0xffc3aa15,0xffc17433,0xffc1d38d,0xffc1dea5,0xffc08463,0xffc336ed,0xffb6c647,0xffe3c5d0,0x000b90fb, -0x00299a9f,0xffd4c993,0x0008eff4,0x002ad427,0x002bbc70,0x00273331,0x001e1fa8,0x00252fbd,0x002453e4,0x00212f36,0x000936fa,0xffd61478,0x0021170a,0x000fd908,0xffaba5ac,0x000ae1bf,0xffb3f3d2,0x002fe98d,0x0006e1e4,0x000511e3,0x0000abcf,0xfffd4cef,0x000065b9,0x000e502c,0x0009983c, -0x000ade3f,0x000e2f76,0x000e405a,0x000b6431,0x00016305,0x0003be44,0x0005115f,0x0008dd0c,0x000c62f4,0x000a02be,0x0027d81a,0xffaaf3c2,0xff82ae5e,0xff93eb85,0xffbedbe9,0xff86feca,0xffa3a5a6,0xff945832,0xff949def,0xffa76f59,0xff94262a,0xff900e7d,0xff8b04da,0xff8fecc6,0xffd33d51, -0xff958b11,0xff830c74,0xff90f271,0x000e46ec,0x000c7c8a,0xfff29848,0xffee269f,0xffde962c,0xffe1d4bf,0x00035307,0xfffea848,0x000b5afb,0x00174428,0x0022fe75,0x001a54df,0xfffa574c,0xfff83977,0xfff4c711,0xffff60b3,0x00028da4,0x0017b251,0x00022f70,0xff96db54,0xffdf14de,0xffbf8312, -0xffcf0c64,0xffcf9779,0xfffe309d,0xfffac5f3,0xfff29ce1,0xffe6c8c9,0x0004ff87,0x0015e432,0xffeb5234,0x00020fd0,0xffdec635,0xffb591df,0xfffd0674,0xffdd50bd,0x001fa6f4,0x001c5611,0xffdf37ed,0xffe4bc95,0xffb9e894,0xffbf21ab,0x000e9958,0xfff9f884,0x000dd1f4,0x001c6baf,0x00248f10, -0x0012366f,0xffd4bf7d,0xffdc6e19,0xffde23c5,0xfff8b77b,0x0005ca79,0x002c15b6,0xfffb9d20,0xffbc8c6d,0xffc9313c,0xffc7ea97,0xffd20b5c,0xffc7c12d,0x00295a15,0xffee6a3f,0x002ef531,0x000c24b4,0x004177e8,0x000e9b52,0xfff11105,0x0004e02e,0xfffbaa1d,0xffb917a2,0xfffc1d28,0xffd396ef, -0x001ca460,0x001236d1,0xffd26c99,0xffd1f833,0xff894147,0xff7da2cb,0xffe77f27,0xffdc7829,0x000d60ed,0x0041a84a,0x0065d0d2,0x0039f7a4,0xffca6903,0xffb8362d,0xffb04468,0xffd511f4,0xfff3d3cd,0x002fa231,0x000c7259,0xffbcd6ef,0xfff08678,0xffb5d849,0xffdabb95,0xffff3547,0x005a9765, -0x0054c06f,0x00562d45,0x005ff761,0x0055a01a,0x005b0ca4,0x0028369c,0x006330b0,0x003155a7,0xffc304d5,0xffeef88d,0x0060f218,0x004f5fa6,0x00453d6e,0xffd9bf79,0xff9bf63e,0xffe46537,0x0015d922,0x0011b255,0x0060355d,0x0053ff09,0xfffe9cef,0xffd9dc1e,0xffe093fa,0xfff8d491,0x00321bf8, -0x005063af,0x00781844,0x004c4fc4,0x00543440,0x0015fc6b,0xffe6bea8,0x002f3c88,0x0003e5a5,0x0024f94b,0x0008676b,0xfffbf35a,0x0005206f,0x0034e8fe,0x008cc6d8,0x002bca5d,0xfff3198f,0xffbc11d2,0xff64c4ae,0xff7e679f,0x002a8627,0x007ec560,0xfe9591a6,0xff6816cf,0xffc2edb9,0x000b62e6, -0x00b94c79,0x0028bbdf,0xffd93592,0xffd07917,0xff903032,0xffc47cab,0x007e652c,0x0015f0cb,0xfff02f01,0xfffff4f7,0x00199638,0x001d3205,0x00015c05,0xfff55ac1,0x001588a0,0xfff51cd0,0xfff868f6,0x00194673,0x000bd0e8,0x0013ff0c,0x00284960,0x003d7c10,0x00534703,0x00423d10,0x000e77b0, -0x000d61a6,0x0016ea0a,0x0055fee9,0x008d0243,0x00784134,0xffb93f02,0xff057fb9,0x00d25295,0x01040332,0x00897762,0x000ed79e,0xffa0772e,0x003bd2e5,0x007222f2,0x0006c090,0x005963d4,0x003e83f7,0xfffcf0e9,0x0064cdcd,0x0096ff37,0x009b2a8a,0x0090d2c3,0x00604dda,0x0008b58a,0xfffc1076, -0x001d24bc,0xffee8766,0xffd80c18,0xfffe7a14,0xfff1834a,0x00177e3c,0x00226820,0x0009f177,0x0008f219,0x000e6eb4,0x000db26d,0x003e6239,0x004e986c,0x005aa3fa,0xffe7e423,0xffcba69d,0xfffd1fcf,0x00a339fa,0xff671efe,0xff69327d,0xff83b97a,0xff9c077d,0xffe7ff8b,0xffe0e90a,0xffedc98d, -0x001a4491,0x006016db,0x006868fe,0x00256067,0x00324b5d,0x00217ac8,0x0022595f,0x001518dc,0x0021fe35,0x0024910b,0x001503eb,0x000eddfc,0xffe80a91,0xffd84529,0xffec9d98,0xffd71005,0xffd0e9b6,0xffde0808,0xfff30265,0xffebc4bf,0xffebf8bc,0xfffc4df6,0xfff4842c,0xfff80b70,0x0015e853, -0xffff7b6b,0x000974ea,0xfff2a6b5,0xffa9ec36,0xffeee742,0x001807a3,0x0037bd9e,0x001684d8,0x00251795,0x00066866,0x0028547d,0x006690bb,0x0021f809,0xfff4dfa8,0xffb6323c,0xffc9a247,0xffdcf0c5,0xffe8db1d,0xfffdcbe5,0x000dd4cd,0x0023bacd,0x001c453a,0x0021ff60,0x000a4313,0xffeb1554, -0x0003897d,0x0007160f,0xffeceebd,0xffdda0de,0xffdcbbd1,0xffcc3dbc,0xffe1324a,0xfff2b56a,0xfffc39f0,0xfff6e2fd,0xfffcdc30,0x000af886,0x00109efc,0x000c16be,0x0004d498,0xff4c538a,0xff94abd2,0xffd2194d,0xffdaca6e,0xfff741b7,0x001acec0,0x002cf68b,0x002f310f,0x0021425f,0x0025a5a1, -0x002b4762,0x002f9d9b,0x00201f91,0x001000c7,0x000005b0,0x00031bd0,0x002ae226,0x0029cc92,0x002b4a61,0x0017907d,0x001b721d,0x0008bb87,0xffcc09db,0xffc3e810,0xffc530d3,0xffc7e2b5,0xffc8ff47,0xffb76489,0xffb256be,0xff98ffc4,0xff894e46,0xff87e4d2,0xff5a2799,0xff489e90,0xff45f3a3, -0xff5caf2c,0xffd178ce,0x000249eb,0x001acad4,0x00102273,0x001ba15c,0x0011ed4c,0x001138ae,0x001233fd,0x000fc662,0x000ceebe,0x000c412c,0x000a5bef,0x000a40c8,0x0006b2bc,0x0014584c,0x001c0039,0x00254f75,0x001f6ae1,0x002f731c,0x001cb132,0xffedd637,0xfff0662d,0xffed757d,0xffdbdbe3, -0xffb63188,0xffa4d462,0xff8ad3ce,0xff9d2f16,0xff72c06f,0xff914738,0xff7ef166,0xff890c6f,0xff9d7410,0xffac9b2f,0xffb3452c,0xffcdcdf3,0xffad6266,0xffdf89db,0xffe66260,0xffe51bcd,0xffea4649,0xffeeddac,0xfff3aafb,0xfff529df,0xfffa7080,0xfffef7ec,0x000182de,0x000241fc,0x000120a0, -0xfffb4e0f,0xfffa8000,0xfff8e6d3,0xfff9d5c1,0xfff930a6,0xfffa718b,0xfffde978,0xffcba403,0xffe655f6,0xffd397be,0xffce676d,0xffc5bbdf,0xffcebc02,0xffdc499f,0xffd542fc,0xffc7b455,0xffde519f,0xffe8e9ab,0xffdaba94,0xffdd5406,0xffcd11ff,0xffcadeb1,0xffe161ae,0xffbc9b79,0xfffeb4fc, -0xfff16d19,0xfff3c51c,0xfff3af20,0xfff33472,0xfff344ae,0xfff3f162,0xfff4f27d,0xfff52b33,0xfff5bbc9,0xfff64dcb,0xfff74f82,0xfff8dd3c,0xfff89528,0xfff827be,0xfff792fe,0xfff7bde4,0xfff4bceb,0x0002ea38,0xffc2dfdf,0xffa0bd4e,0xff9be8d6,0xffc66bf3,0xff966284,0xff901022,0xff8e93f6, -0xff921344,0xff9d18ab,0xff94b641,0xff965cf8,0xff9bf967,0xffa03fab,0xffcbb8a9,0xffa457d7,0xff9e79da,0xffec101e,0x00012b2a,0x0053a27b,0xfff355cf,0xfffefcfe,0xfffe324e,0xfffe5425,0x00035391,0x0005d328,0x0007e979,0x0005876f,0x0004f172,0x00047d91,0x0007f001,0x00067953,0xfffe61f9, -0xfffb7ed8,0xfffa7a07,0xfffccb05,0x0000c24e,0x0001748f,0xfff3f1ba,0x004a1d7d,0x004b2470,0xfffd3b16,0x003c8eee,0x005018d0,0x001540e2,0x001709fa,0x001a6e28,0x0018c205,0x0028da0f,0x0029c64d,0x0020c917,0x0055d828,0x003f7cab,0x00040222,0x005bbcd9,0x004a4832,0x001390b7,0xfff15411, -0xfffd84a4,0xfffcc6d5,0x000f0517,0x00154d5a,0x0014f91c,0x000f52f1,0x0011ce9f,0x0016169c,0x0022279d,0x0017b38f,0xfffadb4d,0xffef18a7,0xffee53d6,0xfff82385,0x0007963d,0xfffdd919,0x00180a39,0x002999a1,0x0001d1c0,0x0012e29b,0x00051d60,0x001425d5,0x0036698a,0x001aa749,0x002e502d, -0x004f4357,0x00327f97,0x001d1e6f,0x001c382f,0x0026cf34,0x00298964,0x0016fa27,0x001508de,0x0061a2dc,0x0023baaa,0xffe3ead2,0xfff5e511,0xfff20665,0x0012aa21,0x00288ab8,0x0029ee16,0x0023adea,0x0026778c,0x00228200,0x0039cdbb,0x002b162d,0xfffcb6c0,0xffe7d0da,0xffe39b9f,0xfff44498, -0x00085b64,0xfffea05f,0x001efe17,0x0025fd7d,0x0001d13d,0xffef63c0,0xfff50a54,0x00107374,0x003acbdc,0x00226657,0x000d1392,0x005ac31f,0x0031f88c,0x00486b9b,0x0011fe95,0x002de123,0x00298e63,0x0007b3ac,0x003eb654,0x004943f5,0x0010d96d,0xffd2aff1,0xfff3b4f5,0xfff353fd,0x00321e47, -0x0046e0a0,0x003c4a13,0x0036442f,0x0042e024,0x004eacb8,0x008447fe,0x0062a437,0x0000e5ac,0xffdac322,0xffd1e2de,0xffedc9e0,0x0011fd1e,0x00031af7,0x00230cc8,0x0011b1ec,0xffcd6644,0xffe13faf,0xffd2a067,0xffe9a7a7,0x0041e3ba,0x003ee1b1,0x004a7053,0x004618d3,0x005ccc73,0x004af9e4, -0x00201da0,0x0054c676,0x00433a01,0xffc579e5,0x000d35b4,0x012710b4,0x0078c1b7,0x00028b34,0xffd0f1b0,0xff954a4c,0xffea7edb,0x003a2c2f,0x0057edfa,0x00426d92,0x000a09e8,0xffabaa26,0xff553d43,0xff54858f,0xff7a1b81,0xffdd6ea5,0x00096cf5,0xffe0446e,0x000992ec,0x000f2949,0x0055bc2c, -0x00578421,0x00123bd4,0x00105789,0x002b5e4e,0x001de73d,0xfff55780,0x0009d5d9,0x0035ca16,0x006ace44,0x002bd849,0xfff82b82,0xffc94b22,0xff769538,0xffc6c6a7,0x007a9959,0x0115fe9a,0xff1f2375,0xff648985,0xff32db19,0xfff1f127,0x00d77686,0x008e4618,0x00555a85,0x0040da58,0xffc13dea, -0xffc82a68,0x0061aa61,0x002a91ed,0x00162b09,0x0021d0af,0x001e9464,0x002b6d6e,0x003125be,0x003c67b5,0x00182a30,0x002377e2,0x0023e078,0x00274977,0x002e4b92,0x0007aeea,0x001b2a4e,0x003cf91b,0x00466534,0x0032baef,0x0004e042,0xfffed0de,0x00172b38,0x0058f39b,0x00aa6b77,0x006c6ff7, -0xffa9a0fd,0xff142b4d,0x00cae568,0x010c56a0,0x007a0756,0x001d47f2,0x0028529b,0x00bd159d,0x00fec929,0x00b9bc7a,0x0039abd6,0xffd7b619,0xffb46cca,0x00281c6d,0x0077592e,0x00953953,0x00798707,0x004971a3,0xfffb5e6e,0xfff1ac97,0xffd97014,0x000967e5,0x0014344b,0x000241cd,0x0014cda3, -0x003226e2,0x002c3901,0x000629aa,0x00013f52,0x0003a210,0x00094c50,0x003f4479,0x00526d77,0x0063095d,0xfff29dd5,0xffb3b8ce,0x001b6e32,0x0082ab5d,0xff949070,0xff917c3f,0xffe98218,0x006dc3a8,0x00c6637e,0x0094ebd8,0x005dd5b3,0x0005afb4,0x00a9f401,0x00dcae07,0x00a37718,0x00a84b71, -0x00872080,0x00602759,0x0040dce5,0x003e1e29,0x00297a3a,0x00140b23,0xffe9c7ff,0xffe3d119,0x000104aa,0xfff39ef6,0xffda9993,0xffd4f30c,0xffe05abd,0xfff7287c,0xffdf3f0b,0xffeca149,0xfffad0ef,0xfff0bde2,0xfff47ddf,0x0002b1a0,0x000b7568,0x000ba0e1,0xfff89317,0xffad1e56,0x0082dc89, -0x00e1df16,0x010a2b2c,0x01043ec0,0x00d55db1,0x00c6f430,0x00c53b77,0x00ca9be3,0x0082622e,0x0055b50a,0x004662a5,0x0031a418,0x002ab11c,0x0030e511,0x00244600,0x001d6730,0x00162782,0x002470f2,0x001f2c59,0x00172759,0x002aed70,0x000e431e,0xffffd9d4,0xffee795d,0xffdca282,0xffdf0f6a, -0xffda3773,0xffe6ede2,0x00162928,0x000a2846,0x00154167,0x0026677d,0x002d9880,0x003b9d68,0x0041ec99,0x0076d8ea,0xffb650f9,0xfffbeb8d,0xffe32d48,0xfff268e1,0xffeba316,0xfff85646,0xfffbe976,0x0016ad3b,0x000600fe,0x00094982,0x000e13ae,0x00264ce7,0x0031b9c1,0x00314d37,0x002aa9c6, -0x002648a9,0x00275947,0x001cbe2a,0x00143087,0x0016b1e5,0x001b6f57,0x000a0872,0xfff7076b,0xffd84232,0xffc95e66,0xffd009de,0xffcd3591,0xffc22cca,0xffa79f8b,0xff9df927,0xff973b1f,0xff9cb226,0xff73c556,0xff6f80a8,0xff7494f1,0xff9b5ea7,0x001b2a72,0x00141fe0,0x00055e05,0x0018d6e0, -0x001d5c60,0x0026fb01,0x002ce881,0x00328769,0x00338860,0x0033f104,0x00337b33,0x00211abf,0x001006d2,0x0001c432,0x000aa4b9,0x00121ec9,0x0017ccb8,0x001e6e80,0x001bbc17,0x0031006e,0x00247f8c,0x00037569,0xffea9090,0xffdbbe6a,0xffc8dcb4,0xffb1c726,0xffa6fa47,0xff9d41af,0xffa15d18, -0xff9816ac,0xff9dae36,0xff97a564,0xffb823a8,0xffd8a581,0xfff1e74f,0xfffcfd58,0xfff05096,0xfff3b401,0xffecf4fe,0xfff0f36f,0xffee9270,0xffee7b18,0xffed7c01,0xffef2d2c,0xffe9c876,0xffe4d45d,0xffe26d62,0xffe21427,0xffe64def,0xffea9d4b,0xffe9bad2,0xffe7a484,0xffe51796,0xffe60889, -0xffe07cc6,0xffe699de,0xfff79b84,0xffed4559,0xfff817ef,0xffee9181,0xfff8a7e9,0xfffb7889,0xfff86734,0x0002361e,0x0006163d,0xfff9564e,0xffeed4ef,0xfff1c4f2,0xffedb573,0xffece5f4,0xfff252c9,0xffe9d6e1,0x0017e961,0xfff1d60e,0xfff3c86e,0xfff35358,0xfff1ea9b,0xfff1c57c,0xfff103ea, -0xfff06d61,0xffeea1f4,0xffee21fe,0xffed204f,0xffeca573,0xffeae969,0xffe9c7dd,0xffe974bf,0xffea1bb5,0xffea69ff,0xffeae957,0xffec2b7c,0xffe4262b,0x000f9e94,0x0017756d,0xffef57b5,0x000ec343,0x00193286,0xffea15b0,0xffee7035,0xffee3992,0xffebf027,0xfff48d7b,0xfff718f7,0xfff74845, -0x0016e75c,0x0010ed65,0xffec4191,0x001968cc,0xffeea09f,0xffc5de19,0xffa42252,0xffd0b9d7,0xffcdd3fd,0xffc5a203,0xffc93b81,0xffb8f797,0xffb6f4e8,0xffbf2003,0xffbed3f4,0xffc23db2,0xffc81a7b,0xffca7169,0xffc849ea,0xffbe4841,0xffbd5939,0xffbd3233,0xffc00472,0xffc344eb,0xffcb031b, -0xffcdefbb,0xff9e1d13,0xffb9fc37,0x0022c544,0xff9a2c0c,0xffb799aa,0x00296ca4,0x001962de,0x001845ce,0x002256e0,0x0014f444,0x0011016f,0x00092677,0xffbb7f84,0xffa12770,0x001d90cb,0xffc0d888,0xffe08cdc,0xffb7f99a,0xffceee0c,0xffbbc7ce,0xffc3894f,0xff974707,0xff8aabcf,0xff9dbf65, -0xff9dd5cc,0xffaeff3d,0xffc23d4c,0xffd37c76,0xffcc9122,0xffab2502,0xff9eddca,0xff96d9d4,0xff9ecbca,0xffa7b9b1,0xffbfd9b7,0xffb7d96a,0xffdc6b3d,0xffc194bf,0xffa7173c,0xffc6dbde,0xffd0ee9c,0xffdb2de6,0xffd13f40,0xffc4c3a4,0xffd9ef55,0xffd68861,0xffe36164,0xffdca1b4,0xffdfa2e2, -0xffdefee7,0xffb6ceb9,0xffc631ba,0xffd0d1f9,0xffd282bf,0xffd4ca15,0xffaf47d9,0xffc55be0,0xff6a2e57,0xff52d88b,0xff7f6741,0xff7cc20f,0xff9bcf4a,0xffb60cae,0xffcd7dd6,0xffbfac76,0xff7f6d4b,0xff759e62,0xff6e2a20,0xff8197d3,0xff9b141a,0xffb9b335,0xffce1ca8,0xffbad2a5,0xffbc5aa0, -0xffb8a98b,0xffc148cb,0xffcfc75b,0x000f97fa,0xffefaec3,0x0002c5be,0x0017b00e,0x002a172c,0x001136b1,0xffed2052,0xfffb8970,0xfff0e07f,0xffc10810,0xffe22d3d,0xffd7759c,0xffd0a1ca,0xffe19041,0xffbf8b85,0xffd7cede,0xff506e2e,0xff0ffe8d,0xff3cf940,0xff44aa41,0xff7f4ba7,0xffc4b786, -0xfffecffe,0xffdc9019,0xff62f3fd,0xff3329a1,0xff1b44e7,0xff3629fe,0xff667dcb,0xffad995c,0xffd2e564,0xffd2dcc0,0xffd1a4e4,0xffc02c21,0xffc66ae5,0xffe835b2,0x004d3c5e,0x0035b86d,0x00423968,0x00628daa,0x005c47bc,0x0055b546,0x002ef719,0x004ef393,0x00164b1e,0xffb81d52,0xffcde061, -0x004b5b31,0xffc9c27b,0xffa96fd0,0xff5a3614,0xff3a747c,0xff3858e1,0xff69de5e,0xff90b0ec,0xffc65a82,0xffd6cedd,0xffb4b548,0xff6eef5b,0xff7e8abd,0xffc7c93f,0xffeca014,0x00049f8d,0x000e564a,0xffe3c74a,0xffcdd03b,0xffc8ae23,0xffe3d2ed,0xfff50746,0xffe6125e,0x001b8106,0x000d427d, -0xffea983a,0x0011438f,0x00352f53,0x004db742,0x00168237,0xffe9c5e6,0xffa5c314,0xff6457d6,0xff9e27f4,0x004529f5,0x00750299,0xfecef808,0xff546d66,0xff903665,0xffef2e23,0x00eb1676,0x0020f0da,0xffcc7b03,0xffff7e1f,0xff8c4ac5,0xffabb150,0x0044809d,0x00197bc9,0xfff9df40,0xffd66236, -0xffbdb609,0xff95fc3f,0xff5f1e10,0xff8d0dfd,0xffbe9d4e,0xffe0a4fe,0xfffc1f9f,0x000b1343,0x0003fe67,0x00040d72,0x001ac5dd,0x003a82ce,0x003e8561,0x0025d63d,0xfff65fc2,0xfff4360a,0x0010067c,0x0063c9b6,0x00a3756d,0x0046dd09,0xff48ac9e,0xfef30f16,0x0090e9d2,0x00ed2e74,0x003cad64, -0xff73c637,0xfe8acb20,0xfeb999dc,0xff119347,0xff8b34a7,0xffb6df88,0xffbd7e37,0xff994d55,0xffb0dca6,0xffbc9454,0xffc8932a,0xffe7f7c4,0x0000c5cd,0x0005b13d,0xffecac2c,0xffee6693,0xffd78a17,0xffd1180b,0xffede773,0xffef2dbd,0x001529ff,0x001aefcf,0x00006634,0xfff868d7,0xfffe1032, -0x00040999,0x0039688f,0x00445ba0,0x0041381f,0xffc2f2d3,0xffa1f29c,0xffe66b21,0x00520e77,0xff8e0698,0xff61a05a,0xff229e48,0xfef540ec,0xfeaedfe0,0xfedb009a,0xff23a541,0xffc8d5f2,0x001e9301,0x0047d0d5,0x000e213f,0x002dd6cb,0x00263760,0x001559a9,0xffd63a06,0xffbafa7c,0xffb8d5af, -0xffb27756,0xffc62b30,0xffc53941,0xffd8bc62,0xffd85dc0,0xffcb81b3,0xffc84a44,0xffd42dd2,0xffee6f49,0xffe0f487,0xffde3566,0xfff24287,0xffedeecf,0xfffa04b6,0x0009cd7e,0x000e1a8b,0xffffddf3,0xffeef69e,0xffbed0f3,0x0040bd65,0xffef5d6e,0xffa738b3,0xffa78a04,0xffadf3cd,0xff90af91, -0xffaa6bc2,0xfff71a2b,0xffd5ec9b,0xffb3159d,0xff622241,0xff778ff3,0xff892330,0xffa2eb60,0xffde5c43,0x00007220,0x0011e1af,0x0017de08,0x0010c56b,0xfff34849,0xfff1b058,0xffee0f5b,0xfff1a719,0xffe654b9,0xffd81694,0xffd48153,0xffd9fce3,0xfff1e04f,0x000589ce,0xfffc6bfa,0xfffa066c, -0xffff488a,0x000f47eb,0x001d25d7,0x00307e4e,0xfffea5ce,0xff89201c,0xff6b65e9,0xff667590,0xff817895,0xff97eda9,0xffbb3e23,0xffcad00c,0xffbfc8e1,0xfff8207c,0x001e9599,0x00331acb,0x001ed464,0x00022970,0xffe88138,0xffdf11fb,0xffe651e6,0x0007ee25,0x0008d209,0x001533f5,0x001f91ad, -0x00111fda,0xfff54bc0,0xffbe5c33,0xffb6b188,0xffc00b91,0xffce4674,0xffca0029,0xffbca1fa,0xffb7abe6,0xffa12c0c,0xff9671a6,0xff99a8c6,0xff76665c,0xff5652c4,0xff4ece1a,0xff3d6df7,0xffc1b74e,0xffdfc5d9,0xffe7ce7f,0xffe6d0b7,0xffeada5f,0xffe4986c,0xffe6a9c1,0xffe4f6c1,0xffe88e6d, -0xffe678de,0xffee2501,0xfff66de1,0x0003e8c4,0x000f008a,0x00151543,0x00189cf5,0x001dec5d,0x0014b536,0x00132577,0x0009e65d,0xffef2edc,0xffe6a0a3,0xffd7cb98,0xffd487f9,0xffc60b78,0xffbe7d3e,0xffac3aa7,0xffa5c420,0xff8a9a66,0xff95fcda,0xff8b386c,0xff84ac1c,0xff945a84,0xffa171db, -0xffae5997,0xffbca7b3,0xffe9e54e,0xffd5017b,0xffd54012,0xffcb6ea8,0xffc78455,0xffc16874,0xffbae382,0xffb292cb,0xffc2a1a5,0xffd2bd60,0xffdf89f7,0xffec1881,0xfff42e93,0xfff98110,0xfff7cae3,0xfff78f2b,0xfff8ac4c,0xfff94b5a,0xffff4eb5,0xfff9e65c,0xffe1b079,0xffdf848c,0xffcad86c, -0xffd244bf,0xffc7a707,0xffbf08f8,0xffc68919,0xffc15ddc,0xffc37b7d,0xffc9bbdb,0xffd35862,0xffd5742e,0xffd5d5e6,0xffd981c1,0xffd338e3,0xffd65435,0xffc508ec,0xffe68f5b,0xffe38083,0xffdec276,0xffdbef80,0xffd888bc,0xffd6368b,0xffd0795b,0xffd7b8d0,0xffdab71b,0xffde5670,0xffe185db, -0xffe57ef9,0xffeb8871,0xffea9989,0xffeaa6e4,0xffeaa73a,0xffe9e982,0xffe99497,0xfff0b415,0xffc6888f,0xffca0968,0xfff9c779,0xffbf2973,0xffc03dce,0xfff6c9b7,0xfff43172,0xfff320b9,0xfff5a2be,0xffefa2ec,0xffee9dc6,0xffee6fc6,0xffc7be57,0xffc16012,0xfffff541,0xffd00ac5,0xffda70b8, -0x00385c37,0x003bc623,0x004355d9,0x002c90a0,0x00321dc9,0x002bd64e,0x00389b74,0x003dbca6,0x003ff6f0,0x00405598,0x00407dd4,0x00401120,0x0041adda,0x003f7ee8,0x0038558a,0x0035e714,0x00345efc,0x0034ea6c,0x003737d2,0x002fadb6,0x004067f4,0x00309feb,0xfff84503,0xff803127,0x003e96b1, -0x0003f910,0xff9cf821,0xff9a2c70,0xff9e2526,0xffacb8b5,0xffac31d4,0xffabbf52,0xffab0087,0x000bae9a,0x004dd689,0xff8d9cd0,0x0000d1f6,0xffe85bfd,0x004e2d06,0x002ace4d,0x002c937c,0x00236c23,0x0042e6b1,0x004ed150,0x0051825c,0x0054be39,0x005aa2df,0x005f4f57,0x00682d43,0x0060f351, -0x00494ba6,0x003f1198,0x00397b9f,0x003d4b18,0x003e2267,0x0037a81a,0x0043c71f,0xffd55ec3,0x000f2eb1,0x000f0b1a,0x0003dafc,0x00079da7,0x003daf18,0x002cfd9e,0x003e3206,0x0046fe1d,0x00487084,0x003f5318,0x00282418,0x00353f17,0x00162ae1,0x0009517d,0x003b9134,0x00419bb6,0x0043f99c, -0x002aae5b,0x00229779,0x0012ef84,0x0047cb1b,0x0069135c,0x00732449,0x007d55ca,0x0085523a,0x00808c0a,0x008eb9a5,0x007f7329,0x00537e11,0x0045cee6,0x003b033a,0x0043001b,0x003f2210,0x0041dc36,0x002c9914,0x00075822,0xfff98651,0xffe948a0,0x0000ab38,0xfffc8f40,0x0044551f,0x0009a711, -0x002a9297,0x004f60b1,0x003f1992,0x00330b9c,0x001c4685,0x00231f7e,0x0022f121,0xfff64804,0x00419150,0x002f7a4b,0x003d0d48,0x0017a2f7,0x0011c4bc,0x000022f6,0x00557ac1,0x0074067f,0x007af16b,0x009040f6,0x00abbc50,0x00b8a656,0x00e3590a,0x00d00cff,0x007c514b,0x005d0c6f,0x00465fd6, -0x004c6bda,0x00469e65,0x003ca161,0x0034c074,0xffec2d6e,0xffec94bf,0xffce15b5,0xffe53b24,0xfff52387,0x004d2bc6,0x0034e8a1,0x00353922,0x0060a59b,0x006628cf,0x005843e4,0x00301e2b,0x0055ceaf,0x00356d00,0xffcceba4,0x00278780,0x00abd9b6,0x007c6cd5,0x006a4dbb,0x00386913,0x000539a1, -0x00374be6,0x00922cb7,0x00f3d427,0x00cc588d,0x00a0a6dd,0x0069040f,0xffe0f80d,0xffba0d9c,0xffbe3ad2,0x000600ff,0x002fe55e,0x0046d463,0x0053d378,0x00647479,0x005611f3,0x0010f70d,0x001c923b,0x00069d1f,0x00335c52,0x00207372,0xffe52c71,0x00204f2b,0x003fa35f,0x0034aa10,0x001f74d5, -0xfff496d5,0xffb9ccaf,0xff896025,0xffd47444,0x0074ecfc,0x00ca715a,0xff4f9060,0xffd51d2a,0xff9c79a5,0x001ce282,0x01012592,0x009d827e,0x00562f81,0x00560492,0xffd9fd2d,0xffde7ae7,0x004963ed,0x00303093,0x0021dfa5,0x001e8ff9,0x0036cb13,0x005982e2,0x008c8f11,0x006bf65f,0x004da49a, -0x002324ef,0xffff3978,0x0011fcc9,0x0023efc2,0x001bb430,0x002fadfc,0x003e83e2,0x0035e1f9,0x0019c76c,0xfff07610,0xfff61d18,0x001a8b7b,0x0076a7ee,0x00ab2fa0,0x005b6af2,0xff64bf5e,0xff5846ab,0x00695a93,0x01160b64,0x00565d25,0xfff2a93d,0x0034f88f,0x008b6760,0x0124bf44,0x01d37654, -0x01017de6,0x0077e6e6,0x00449e64,0x00b7e1c4,0x00fdcdb5,0x010798f0,0x00dac89c,0x008861e7,0x00253fad,0x0005af17,0x000b7dd6,0x002eb00b,0x0027b115,0x001d1925,0x0010e24c,0x0035eda5,0x00276797,0x0002d9b4,0xfffc0116,0x00022bbd,0x000946b8,0x003e65f1,0x004551d1,0x003bf676,0xffccbccc, -0xffa3803f,0xffeaae1a,0x002b5ed7,0xffb07ac2,0xff873077,0x001dcd63,0x00aa6d49,0x01459718,0x00f0553f,0x009b15b0,0x00580da9,0x008b9260,0x00b594fb,0x009a3f8d,0x00b6392c,0x00a63ff7,0x00792feb,0x0060370e,0x00583495,0x0053742e,0x00360f38,0x000c6380,0xffe74799,0xffd683d8,0xffe77832, -0xffdee477,0xffd70985,0xffe0afb2,0xfff78dda,0xffe10fe6,0xffe674d0,0xfff723e4,0xfff1ea8d,0x000160bb,0x0010eaea,0x0019155e,0x00207d50,0xfff4ed89,0xffda835e,0x003a4429,0x00ccedbc,0x0184571a,0x0189aea4,0x01705e50,0x0149524e,0x01387618,0x012fa50e,0x00dbaba1,0x00a8980e,0x008b308c, -0x005655e2,0x003aea13,0x0038f330,0x0028f60a,0x001d6c8c,0x001e1ac4,0x001b888a,0x0024cd54,0x0029b92b,0x001bb90e,0x0015a0f4,0xfff24189,0xffe9019f,0xffe0812f,0xffe2f451,0xffed7e29,0x00074d85,0x00215d04,0x0015d1fc,0x00135ab4,0x0019bc63,0x00239914,0x00337af2,0x0030a5f3,0x006d90d3, -0xff5abcf8,0xfff270cb,0x000dab80,0x0009c3b5,0x0018a0b2,0x00330b95,0x0049b2bd,0x00750845,0x003fb168,0x002a4ecf,0x00257550,0x003c6053,0x004a6244,0x004754fc,0x004ad9f4,0x004f0c97,0x004b4c9a,0x0041f2d3,0x002df4ea,0x001462b0,0x000b992b,0xfffa6b1f,0xffddd8ca,0xffdbf8b1,0xffd51594, -0xffda4fbd,0xffd96415,0xffcd26f0,0xffc6ff59,0xffbb00bf,0xffb74d34,0xffc2d4bf,0xff9fa65b,0xff97d85f,0xff7bcd6e,0xff97ba3c,0x0008c6bf,0x001eaab6,0x00270a31,0x0032445e,0x003d51e9,0x004a8218,0x005993b2,0x006f9601,0x006a420a,0x006843c8,0x005f3b00,0x004a45e1,0x003638ba,0x00236fc8, -0x0027a1c4,0x0028e857,0x002b9444,0x002efad1,0x00350e01,0x003b21c1,0x0016fb8c,0xfff9483d,0xffdfa6e9,0xffe00652,0xffd17e95,0xffd3ab73,0xffb76c8b,0xffbe74d8,0xffa4fb08,0xffa7a1db,0xff999c5d,0xff98ec5f,0xffab2c4f,0xffbc383a,0xffc153ba,0xffe9fcb7,0xffcfb95e,0x000d1349,0x000bb68c, -0x0013cacc,0x001939b7,0x001f6714,0x0022afa0,0x00275e02,0x001a426d,0x000ffc61,0x000972c8,0x00035f78,0xffff8bf2,0xfffa27bb,0xfffcd0b1,0xfffdc3f8,0xfffea386,0x00005a75,0xfffbca3d,0x0008fc61,0xfff510ce,0x00090489,0x000f057f,0xfffc49e8,0xfffc2b71,0x000ae08d,0x000c5df6,0x001146b7, -0x00049e8c,0x000bba10,0x000506ca,0xfffa82a3,0xfffd00ca,0xfff14fb1,0xfffa91fc,0x00048765,0x001fca5e,0x0026913a,0x001d0e48,0x00206c3e,0x001f8276,0x00202b02,0x00210061,0x00245dec,0x00205fb3,0x001e0c59,0x001a3996,0x001712da,0x0013c80d,0x000faade,0x00110858,0x001195c3,0x0011de02, -0x0013ccea,0x0012e932,0x00163bc6,0x001b58fa,0x00005f5d,0xffba2a2b,0x0023fa22,0x00006903,0xffae7104,0xffb1c2ba,0xffb4e97f,0xffbaf706,0xffbd31dc,0xffc0d1b4,0xffc400b2,0xfffca271,0x00240d2f,0xffbc2e9e,0xfffc8b67,0x002318a1,0xffb08c31,0xffdd9b88,0xffa033e3,0xffbcd52a,0xffb3549c, -0xffba3cf7,0xffa99f04,0xffa5bf55,0xffa6b702,0xffaa46c5,0xffade22b,0xffb29b10,0xffb60ff2,0xffb4c509,0xffadb22e,0xffa8f2aa,0xffa74005,0xffa88ab2,0xffab5ba7,0xffb6d3ff,0xffa1380d,0xffd81483,0x00171146,0x00741309,0xffc2233f,0x00143dbd,0x007ad8df,0x0072b00c,0x00728a9f,0x00721bec, -0x0072dbdc,0x0070d1c2,0x00687fd7,0x001504fa,0xffbe61a3,0x0071a2ef,0x0026375f,0x0041709b,0xffa5e8e2,0xffb88dca,0xffb57162,0xffc0106f,0xff9782d6,0xff86e135,0xff87ac02,0xff8c864d,0xff9ab497,0xffab387b,0xffbb763c,0xffb64d43,0xff9c7292,0xff8732e5,0xff7dccc1,0xff823a74,0xff8fab42, -0xff9b3e0d,0xffa84c04,0x002650e0,0xffc60533,0xffbfbfcf,0xffdce186,0xffeefc73,0xffe41f58,0xffd384d2,0xffd01cc0,0xfffe45af,0xffda1e93,0xffd7a360,0xffee8a88,0xffe54925,0xfffe79b6,0xffe4b441,0xffc4c990,0xfffea60f,0xffc01ffc,0xffb129c4,0xffb163f8,0xffc3fa05,0xff767dd3,0xff5cb1eb, -0xff5e0c4a,0xff6e18de,0xff8a19ae,0xff9cce10,0xffba739d,0xffb1bd15,0xff83d8bb,0xff6505a8,0xff570be6,0xff604d2e,0xff7bd4d8,0xff83329b,0xffc94685,0xffdea7b7,0xffcc24f0,0xffc02743,0xffcf90bf,0xfff31b97,0x0009c81e,0x00073c89,0xffebe23e,0x003b3fe5,0x0018fda2,0x0024d60c,0xfffdf6a4, -0x000a4347,0x0003290a,0xffea9952,0xfff49e18,0x000fbab6,0xffc37396,0xffcaa29d,0xffd4376c,0xffed40c2,0xff825d4e,0xff3d86f4,0xff2a5566,0xff4388ad,0xff70031c,0xffa2b544,0xffe21da7,0xffd2a83b,0xff72dc69,0xff290cdc,0xff079dae,0xff147c59,0xff42c8fa,0xff6a90a1,0xffbc5b12,0xfff0de70, -0xffb6941d,0xffce59ac,0xffc3f0dd,0xffded109,0x003c1dfd,0x0020580f,0x0033e8c4,0x0061135b,0x00636332,0x004d2ed9,0x00339d7b,0x003fced2,0x001572c7,0xffc6898d,0xffdc6519,0x0065762c,0xff99a7f4,0xff5b2ad8,0xff343842,0xff213ec1,0xff037fae,0xff3f40ce,0xff89d916,0xff91bb32,0xffa0539e, -0xff9b200d,0xff294d93,0xff2e68c3,0xff87f4ab,0xffb9b539,0xffd52da1,0xffb8b33c,0xffb38ec6,0xff919e72,0xffc57b6a,0x00062f8d,0xffd4d6ec,0xffe48f1e,0x001858cc,0x0017e1b4,0xffe2785c,0x00254662,0x003db923,0x001b36cd,0x000ba332,0xffe4aff8,0xffaa35c0,0xff817321,0xffd676e7,0x00690e9a, -0x00882495,0xff4196b1,0xff7b22ce,0xff612d91,0xffe85b79,0x010214ec,0x00580683,0x000b709c,0x003cdb35,0xffa4cb98,0xffa6008d,0x00120706,0x00348146,0x0021f90d,0xffcfa2f0,0xff9dbb8f,0xff6c7ad8,0xff469995,0xff84543f,0xff9b03c8,0xffdcf0d3,0xfffecb22,0xfffdf0c6,0x000e4472,0xfffb22fd, -0x00120edd,0x003202d1,0x0028915d,0x000ad656,0xffe06fbe,0xffe85503,0x00162573,0x0069de81,0x00996dc7,0x0014f032,0xff301334,0xff122c4c,0x004f2a65,0x00e427c6,0x0009371f,0xff396a6d,0xfe59deba,0xfe3fe64c,0xfeb09850,0xffd7c67e,0xff7a36da,0xff7127c6,0xff84641c,0xff6131e8,0xff60aa72, -0xff7e5cd8,0xffa434dc,0xffd66d22,0x000a8023,0xffecc105,0xffcf5ef4,0xffe5d591,0xfff043d1,0xfff2a66c,0x0001d18f,0x0019c12b,0x00143aa2,0xffff6ae8,0xffecfd32,0xfff18209,0x0001828d,0x0030bea7,0x002f5c26,0x001a7583,0xffc43233,0xffa061f3,0xffeddbd3,0xfffec3d6,0xffc203a3,0xff763fda, -0xff383c93,0xff1b4f9e,0xfea7209c,0xfee8c9ae,0xff2fa8bb,0xffcd5d7a,0x0014a473,0x0051fb1e,0x00445f13,0x00572c6e,0x004b02bf,0x00293b44,0xffdafc6a,0xffa0a44b,0xff8d350d,0xff89f92e,0xff9ba02b,0xffbcc785,0xffe27b13,0xffcf36d1,0xffcade35,0xffcda6dc,0xffd73d80,0xffed4699,0xffe01690, -0xffdf9b11,0xffedef0d,0xffeb71c2,0xfffcf473,0xfffb13cc,0x00139f4f,0xfffbed2a,0xfff6493e,0xffde8b90,0x007e8679,0x00095de9,0xffbc35ce,0xffdf13a0,0xffcfd7dd,0xffc00858,0xffbec851,0xffe5626d,0xffe377eb,0xffd2384d,0xff9e5a30,0xff9df0e2,0xff9c703f,0xffa62aa9,0xffdf0860,0x0001915f, -0x000ab967,0x0017a687,0x0007b33b,0xfff504c6,0x00088e3c,0xffe6b6d2,0xffe24d22,0xffde5f55,0xffd5982e,0xffd4d1e7,0xfff22313,0x0006f8f4,0x001788c1,0x0000fa14,0x0002ed5b,0x0007d42f,0x001bb8d7,0x002f9d83,0x004a8274,0x001be39a,0xffcf73c4,0xff8c023d,0xff5fc82c,0xff830d47,0xff854216, -0xff9c694e,0xffa34c90,0xff9abf1f,0xffe2c739,0x000d6a40,0x00244177,0x000cd22f,0xfffd18e1,0xffee264c,0xffed3a7b,0xffeed80b,0xfff75dea,0xfff890d9,0x0001f6a2,0x001bd7e9,0x00026664,0xffe4da4d,0xffc9449c,0xffc394a2,0xffc98b43,0xffd10999,0xffcac14d,0xffc5481d,0xffc08ec1,0xffb5fdff, -0xffb331a9,0xffb923d7,0xffa7a877,0xff87179c,0xff75134e,0xff5dea95,0xffcec890,0xffd2f4f5,0xffc6c43a,0xffd18fdd,0xffcee4b3,0xffd1a263,0xffd7bb39,0xffd9670c,0xffe4284e,0xffe70480,0xfff2d6cf,0xfffad51d,0x00073c29,0x0015259a,0x00135e26,0x0012d9b2,0x00109207,0x0009304b,0xfff794ed, -0xfffd6cf4,0xfffef741,0xffeb06f0,0xffd4c1ea,0xffd5f3cc,0xffd96aed,0xffd3cb4a,0xffcd15d9,0xffb1d752,0xffae4731,0xffa091ea,0xff9f0c8a,0xff8b0c2e,0xff991634,0xffa7df85,0xffba78cc,0xffc0a6b0,0x00196793,0xffdcc473,0xffd685ad,0xffcd8725,0xffc57c29,0xffbb283b,0xffaf7c61,0xffa3cbc2, -0xffb19dff,0xffc0cd62,0xffced51d,0xffde8be4,0xffebcb99,0xfff974a0,0xfff819df,0xfff94091,0xfffab6a4,0xfffca9af,0x0002a3f7,0xfffb5e4d,0x00054d81,0xffe8fc32,0xffdf4892,0xffe8ba50,0xffe2a95f,0xffcfc6da,0xffcd1eb9,0xffce15a7,0xffdb1bb9,0xffcdd8d6,0xffce2a0d,0xffd9dc81,0xffd97f07, -0xffeab103,0xffe64dc0,0xffd80453,0xffeca5c5,0xffd8d8df,0xffdfc715,0xffd80e85,0xffd41054,0xffd03e0a,0xffcd7438,0xffc65f4c,0xffce7ce7,0xffd20e64,0xffd5d25a,0xffd9422d,0xffdcf013,0xffe2fcce,0xffe24ad3,0xffe30e9a,0xffe3a337,0xffe316d9,0xffe579d4,0xffe2154c,0xffea824a,0x000af963, -0x00400ffe,0xffdc594f,0x00058172,0x0042616c,0x0040a979,0x003bebd2,0x00357caa,0x0035dcec,0x0033ac8e,0x002ec54a,0x0003dd98,0xffd8c734,0x003dc1ee,0x00117134,0xffd528c9,0x00331c75,0xfff36670,0x004e5ea6,0x0028e9f4,0x002d5fb6,0x0025cd44,0x002c7902,0x00308e60,0x003517da,0x0037f5ca, -0x0039f5cd,0x003b3293,0x003b6de1,0x00391756,0x0033dcda,0x00315106,0x002fbd5a,0x002f7bac,0x00305409,0x0028c093,0x0047db0f,0xffe8f501,0xffaae613,0xff6c1bb3,0x0003f0fd,0xffb6b610,0xff82afd5,0xff79e51b,0xff7c608f,0xff92ca81,0xff82133f,0xff7f67f3,0xff83192f,0xffbdb602,0x001783db, -0xff79616c,0xffad8576,0xffa87e24,0x0040796d,0x0033bd6d,0x00260e2c,0x001b2095,0x0024a846,0x002a96af,0x00367d00,0x004091bc,0x004c19b3,0x0053f0dd,0x005c770d,0x0059c3cd,0x0048ba3d,0x003c625d,0x0031b831,0x0030fdf7,0x00290b33,0x002eac17,0x00289802,0xff9e8784,0xfffa75bb,0xffe566a5, -0xfff00245,0xffee67cf,0x001a1692,0x0018375b,0x001bdedc,0x0016603b,0x002a49be,0x0032736c,0x001644dc,0x001fa43f,0xfff767eb,0xffe93a61,0x002d678f,0x0001486c,0x0030ef93,0x00401081,0x001b55fe,0x000d28bc,0x0015b6b8,0x0028b31f,0x00471665,0x005b980b,0x006f0947,0x00704ea4,0x0079e030, -0x006dfed9,0x004aa519,0x003d11e0,0x002dbd4a,0x0030f9d3,0x002391e2,0x003644d2,0x000bda81,0xffd28d34,0xffdbe473,0xffd1106a,0xfff711b6,0xffe486d5,0x002fecb7,0xfff39044,0x00311b26,0x0030e1d8,0x00398b00,0x001410b9,0x00164ff9,0x000eb09c,0x000f80ff,0xffe0c8c5,0x001f9646,0x00080e47, -0x003e884c,0x004198f0,0x001594d7,0x000014f4,0x00083e4a,0x000888b0,0x002e0bd9,0x0055d67f,0x00816f95,0x009a317f,0x00bed678,0x00bc9ec9,0x007cbb76,0x0050d2a5,0x002c2180,0x00256bda,0x000ec901,0x002056fb,0x000c7a99,0xffbfca2e,0xfff17476,0xffb59f66,0xffedccd7,0xffff9779,0x004e94d0, -0x002c2795,0x002a0ade,0x00777a15,0x0068e615,0x005edfa0,0x00411351,0x0051c6d7,0x0023b63a,0xffde1fae,0x00249795,0x00092952,0x00233579,0x005a135e,0x0024c0a4,0xfffab18f,0x000492d4,0x00547966,0x00cf3786,0x00c2bfbe,0x00bcabad,0x00b6c6f1,0x0021efcd,0xffecc32b,0xffeae401,0x001b7d7d, -0x003d6298,0x00770c0b,0x00636c8a,0x006b4c0a,0x001f2d46,0xffce8b3e,0x00145dfa,0xfffc3b22,0x002b4dda,0x00199126,0xffde8d62,0x00377472,0x004a6620,0x000f2f86,0x000dac20,0xffe646e1,0xffad20a8,0xff9e2bec,0xffdaa74d,0x0058a501,0x004df328,0xff6d0d20,0x00144abb,0xfff82d4b,0x0034fa9d, -0x01044bda,0x00879f8a,0x0037521b,0x00439aa4,0xffd7a9c0,0xffde6ac9,0x002615c5,0x00401d43,0x00332cc9,0xfff7f7ec,0x0013f0f9,0x0027af3d,0x00559c60,0x0030145f,0x002f6cd5,0xfff7cd59,0xffd6ac72,0xfff40017,0x0010907a,0x001f1676,0x00336165,0x0035d804,0x002353f1,0x0001a129,0xffdbcac5, -0xfff45e30,0x00209717,0x0079986a,0x0085dd95,0x002b775a,0xff440c08,0xff7e4e05,0x0012db4d,0x00ebe14b,0x000b0f6e,0xff95fe08,0xff9e73aa,0xff9e4a01,0x0053f794,0x01ac86b0,0x0101c064,0x00a18c92,0x00815ae2,0x00ad2c08,0x00cab5d5,0x00cfe189,0x00bb91d7,0x007f2592,0x003da636,0x00141960, -0x002b8097,0x002e4b87,0x0019b57c,0x00216497,0x00064e6e,0x002526c0,0x00172d0a,0x0002c9e2,0xfff4c45f,0xfffd2f7d,0x000b546b,0x00305f5c,0x00257cfe,0x0004640c,0xffbec4e2,0xffb1e708,0xffd47745,0xffdb7752,0xffc78f0a,0xff8458d0,0xfff54d08,0x003c5827,0x00a43d50,0x00807f46,0x0057580c, -0x006e988a,0x003fa369,0x005f6538,0x006cfecc,0x00856713,0x0081c054,0x006196f0,0x00440e6a,0x0029c8ae,0x0028ea02,0x0011bc28,0x000257d1,0xffdf71f0,0xffb6f6f9,0xffd524fe,0xffdb3157,0xffd9e02d,0xffe2d391,0xfff327b5,0xffeaf7fa,0xffe5c4cd,0xfff0d21d,0xfff071a9,0x00083471,0x0015038f, -0x0014c313,0x001c8d9a,0xfffd112d,0x00003813,0xfff0e3bd,0x00384c10,0x00f8a0b0,0x010f58ce,0x011811ac,0x00f548de,0x00e82e57,0x00e9b5a8,0x00b048cb,0x008a1f2a,0x00667625,0x0031264b,0x00156a50,0x000bdcee,0x000fa6e0,0x0014a36c,0x002260cd,0x00136a1f,0x001f908d,0x0024fc3a,0xfffeec2d, -0x00064429,0xffe39a31,0xffdda277,0xffdf2352,0xffe2b889,0xffff28b9,0x001e6991,0x001b3670,0x00133735,0x00075dd7,0x0004c60c,0x001a2a94,0x002885c7,0x001aca98,0x002b81bb,0xff497d79,0xffbfafde,0x00058d43,0x00041419,0x001e3491,0x003c8a5c,0x00566bc6,0x007266d3,0x0049f0ca,0x0035d1fa, -0x00327300,0x0034831d,0x0037c430,0x003267ce,0x0039f61b,0x003f7113,0x00425cd5,0x003ffbc5,0x002d9305,0x000bdcff,0xfff6c33f,0xffe44204,0xffc2270b,0xffd8e779,0xffdd78b9,0xffd9b07f,0xffd9ea1f,0xffd10d11,0xffe197b3,0xffd6e450,0xffd5eb64,0xffdf4c86,0xffc9e69a,0xffb793e1,0xff87a89f, -0xff92d49d,0xffd7d4e2,0x000579e7,0x001b7520,0x0018ce79,0x0023ed0d,0x002c2af3,0x003c1f8d,0x0054296f,0x0052b55e,0x005353a4,0x004e3f81,0x00448f8a,0x003b742c,0x0031672f,0x0031da7e,0x002f4809,0x002f005b,0x0028ba9d,0x002ed7ad,0x0020cbba,0xfff8ea79,0xffecd73b,0xffdcc5f4,0xffe197a7, -0xffd696da,0xffe28a05,0xffc51a3e,0xffd1a003,0xffa891a5,0xffb245e1,0xff978e3c,0xff964821,0xff998232,0xff99eaec,0xff907839,0xffc2795b,0xffc7a06c,0x000a75c2,0x000ea070,0x0014d3d7,0x001d74c4,0x00242710,0x0027a645,0x0029e374,0x00218eee,0x001c6f5b,0x0019902a,0x0015b786,0x00110db4, -0x0009d5a8,0x000d8542,0x00105104,0x001436cd,0x00161d38,0x0016cd69,0x00218724,0xfff71f5c,0x00121379,0x000ab0a1,0xfffb7fe4,0xffeff3fc,0xfffa66f9,0xffff9ec2,0xfffc8d85,0xffeb4a94,0xfffdb7c2,0xffff19a9,0xfff01321,0xfff7b24a,0xffec8d66,0xfff2a892,0x00063826,0xfffe49e7,0x00295439, -0x001c679a,0x001fc0ef,0x001f2e4a,0x001fba3e,0x00215df7,0x002563b3,0x00239e80,0x0021ec8f,0x001ee4b5,0x001c5c18,0x001a7e9f,0x0017ba49,0x00198d35,0x0019ed6f,0x001a2062,0x001c33d7,0x001a524a,0x002606ab,0x0002ca4e,0xffddd83d,0xffb42754,0x00094881,0xffd7f551,0xffa72e32,0xffa6fb01, -0xffa9f2a7,0xffb2ad94,0xffad3665,0xffaf38e7,0xffb24000,0xffd491a6,0x0005a99d,0xffb71357,0xffd5fcdc,0x0021e705,0xffd7c631,0x0028ef24,0xffbf9688,0xffde4886,0xffd98144,0xffdcce2f,0xffd6b532,0xffd4f8b2,0xffd222c3,0xffd78eb9,0xffd9fef1,0xffdb0f56,0xffde7be7,0xffdde1a2,0xffdb14d4, -0xffd3bccb,0xffd0d251,0xffd04af0,0xffd1f906,0xffd842a4,0xffc08d71,0x00217224,0x004ab51a,0x004e69aa,0x000eb6a3,0x004daf1e,0x005c18d1,0x005d7615,0x005f6e4f,0x005bc2dc,0x0065b704,0x0065d0c9,0x0061d9e3,0x004e4dc7,0x0009e0ca,0x005602fe,0x005cbaed,0x0063ebf1,0xffde0eb2,0xffdb3623, -0xffe42686,0xffe64310,0xffd93749,0xffd08155,0xffc7c88c,0xffd0434e,0xffd8445a,0xffdfa07d,0xffec092e,0xffe99add,0xffdc21fa,0xffc33414,0xffb97c19,0xffb92d01,0xffc2cc60,0xffbd8dff,0xffd6ee7a,0x00377ce9,0xffe5b736,0xfff0127f,0xfffeb569,0x00102e02,0x00095510,0xfff913bb,0x000296bb, -0x002ea765,0x0004767c,0xfff62c5e,0x0012f528,0x00083d3e,0x001ed11e,0x0018d68b,0xfff562df,0x00381c2e,0xffe8303f,0xffcec7db,0xffe446a8,0xffe2a6f8,0xffccabe5,0xffc7671e,0xffb2e6aa,0xffcf7d75,0xffe0c697,0xffe01291,0xfffb85cd,0xfff71d96,0xffe48ed2,0xffb8686b,0xffa60a2c,0xffa46669, -0xffb164b7,0xffa4dcdb,0xffe693d9,0x0003ff2f,0xffe912f8,0xffd611e3,0xfff32df6,0x00143e9e,0x00152bf7,0x001bfb69,0xfff5dd56,0x0054120b,0x001446f4,0x00322ecf,0x00196d87,0x001e0f0a,0x001e81ac,0x0015397e,0x001f3e02,0x004bf24d,0xfff3357a,0xffe946e7,0x0008f2d9,0x000956fa,0xfff22679, -0xffd053ff,0xffa2fefe,0xffc8dab9,0xffdfc80d,0xffed5ccc,0x00261dc7,0x002e58fd,0xfffc601a,0xffa8038b,0xff801bcf,0xff7ac089,0xff8bfd1b,0xff857f4c,0xffcea84c,0xfffa9324,0xffb539d0,0xffd2b7a5,0xffd7d402,0xffe9fbce,0x002fe587,0x0019095f,0x002a678b,0x0061017e,0x0066d348,0x0049eacd, -0x003cfa88,0x003bb905,0x0024f24d,0xffe72f0d,0x001018fc,0x006b1c66,0xffbea518,0xff81a24d,0xff76f79e,0xff592b46,0xff516825,0xff9b45dc,0x000554f3,0xffe1ed40,0xffdd2a37,0xffe7cedd,0xff52f6ca,0xff3696eb,0xff6b18b9,0xffb7efb4,0xffdbfff4,0xffb5fbd7,0xffd955b7,0xffc39db3,0xfffcac52, -0x0023500e,0xffdf6f6b,0xfffdd3b3,0x001c03b1,0x001f6106,0xffe12a78,0x003ce469,0x004b9e7a,0xfffeee24,0x00044a32,0xffdce756,0xffb67dd2,0xffad1e42,0x000b8b0c,0x007c4f7f,0x0086acd6,0xffbc5c60,0xffd2ff7c,0xff7a4f59,0x00088714,0x00f566e0,0x00a2d7e8,0x00663e88,0x0068c0e3,0xffd32225, -0xffbe1cca,0xfffa55aa,0x005327f6,0x0050e889,0xffe690ad,0xffc3b4b9,0xffab635d,0xffb2f600,0xffd39ffc,0xffc03715,0xffe5bac0,0xfff56ecd,0xfff2fcd7,0x001bee8d,0x0000317c,0x001437c2,0x0029b673,0x00150fdc,0xfff37330,0xffd14cbc,0xffee751d,0x002425da,0x00619bd2,0x00769deb,0xfff3f4e2, -0xff47c7af,0xff5b5656,0x000d54fc,0x00a662e7,0xffc5262f,0xff47b742,0xff0b146e,0xfeca8714,0xff48c78b,0x00a19096,0xffe261e7,0xffb2ee62,0xffd5f849,0xffab2383,0xffb1a95b,0xffd7c9e1,0xffedd93f,0x0004345e,0x001f2a5f,0x0002e162,0xffdbfadd,0x000eb010,0x001c1481,0x0006bd6a,0x0016afca, -0x001f8a93,0x000f5cfa,0x0001f990,0xffe9f370,0xffeead2f,0x00087ebb,0x0021bfc9,0x0012941a,0xfff2b7c1,0xffd9c7e9,0xffbc8c64,0x0000cd18,0xffc36748,0xffeb7e01,0xffabe4b9,0xffbe7b5d,0xffe79b80,0xffb76b30,0xffdb7d44,0xffe2dd34,0x000a20df,0x0031d642,0x0072a233,0x00937498,0x008df8fa, -0x007b3a05,0x005026d7,0x0011cf1b,0xffd5d2ea,0xffb56927,0xffacd6af,0xffa78b6a,0xffc9b2d5,0xffe230aa,0xffcf8d90,0xffd22ad0,0xffdbb56a,0xffe46160,0xffef6da0,0xffe97f28,0xffeaaa46,0xffec1975,0xffeba619,0x00007f9c,0xfff86a74,0x000ef879,0x000280d6,0x000c347e,0xfffc0e7b,0x006b681f, -0x00334e91,0x004073dc,0x007492a5,0x006135a4,0x0068074d,0x0058116a,0x0050c8ac,0x004d8966,0x0040585e,0x003c4f4b,0x00145a7f,0xfffabdea,0xfff04255,0x0000ec9d,0x00100b05,0x000fefaf,0x0018e680,0x000c5e2e,0x000c8bc6,0x001c3dfa,0xffee5392,0xffd91874,0xffd7187d,0xffd78480,0xffde7017, -0x00082e75,0x001960d3,0x0022fe19,0x000cd2bb,0x00119af5,0x00171cf6,0x002e3b00,0x003fb4c2,0x00439203,0x0039e241,0xfff0f7de,0xffd3d732,0xffbe1146,0xffdc2c9f,0xffd2927a,0xffd4da98,0xffd28332,0xffd897bd,0xfff788be,0x00086778,0x0012d334,0x00092d5f,0x000e9def,0x00120b08,0x00186464, -0x00136886,0x0004e7a8,0x0002d29e,0xfffc4b97,0x00081ea4,0xffef86fa,0xffdab1c9,0xffdce5e8,0xffdbe3a0,0xffd9b987,0xffd43c62,0xffcfd80a,0xffd1cd46,0xffd4e460,0xffd8c3f5,0xffdddfec,0xffe48a46,0xffde7d95,0xffcab433,0xffb0045f,0xffb0fe80,0xffe4dd3f,0xffde84a6,0xffcb110e,0xffda6fb5, -0xffd7e069,0xffe5922f,0xfff196c8,0xfffbd539,0x00091727,0x00111e7b,0x001b5ebb,0x00180d2b,0x001628f8,0x0017f13a,0x0013d450,0x0012e775,0x000f89a1,0x000ac0ca,0xfff594aa,0x0001c781,0x000e3f06,0xfff5a1a3,0xffdf39b0,0xffdd1e77,0xffe397f6,0xffdcb124,0xffdcd964,0xffc2d755,0xffcc63df, -0xffb1408d,0xffb152d7,0xff9af039,0xffa50650,0xffb04687,0xffbc9f76,0xffc9765f,0x001ee4ea,0xfff577c5,0xffeec325,0xffef749e,0xffeb4924,0xffe5933c,0xffddc918,0xffd7f15d,0xffd917e6,0xffdc628c,0xffe1ea2e,0xffe98c53,0xfff2f499,0xfffe143b,0xfffe2fd2,0xffff0e3c,0xffff902b,0x000198c1, -0x000331e2,0x0001d812,0x001c505e,0xfffcdcc0,0x0000484a,0xfffff9f5,0xffffb617,0xfff00005,0xffe74e11,0xffecae47,0xfff81f00,0xffe48f8c,0xffdbef04,0xffe5eb30,0xffe74f15,0xfff88fb2,0xfffb5664,0xffeaec41,0x00119d93,0xffe27a10,0xffeb852d,0xffe6e76d,0xffe49967,0xffe39660,0xffe31ee8, -0xffe0d9fa,0xffe3c0fb,0xffe50a2f,0xffe5b44d,0xffe6ccad,0xffe7537f,0xffe90ad9,0xffe90d02,0xffea187a,0xffeadc0f,0xffeb5b3a,0xffee53fa,0xffe5718d,0x00101b33,0x002dc480,0x003a4209,0x0003f408,0x002bf58b,0x0039de49,0x003a702c,0x0035c450,0x002d00fb,0x00323533,0x003107b0,0x002b59d9, -0x0021861c,0xfffbc8ef,0x0030016d,0x002d1c72,0xffe3d311,0xffffba30,0xffbc986e,0x0014edef,0xffffacb8,0xfffe069d,0xfffa94b6,0xfff3a6a3,0xfff3e13a,0xfff9301c,0xfffe5d16,0x00022789,0x0004af6d,0x00056e77,0x0003ecf9,0x0001869f,0xfffd3ecc,0xfffb53bf,0xfffa58c6,0xfffab4ab,0xfff9fa4c, -0x000e113e,0xffb486b0,0xffa2be59,0xffc50ccb,0xffc6e002,0xffa93a1f,0xffcf53d0,0xffc4efab,0xffc51f5b,0xffd575a8,0xffc17f40,0xffbe1bc9,0xffc1f53b,0xffac5645,0xffd2c44d,0xffcda211,0xffa5cc4c,0xffbbddaf,0x0000253b,0x001124a0,0xfffd1f0a,0xfff6d342,0xffdbc477,0xffd4b76b,0xffe45c25, -0xfff1a2e9,0x0000ccba,0x000af866,0x00169c99,0x00184a2b,0x000e7f28,0xfffbe8f1,0xffed6e63,0xffe8d620,0xffe22317,0xfff0c263,0xffe48197,0xffadcd44,0xffdac756,0xffbeef19,0xffe019c7,0xffe1bc1c,0xffebd6d0,0xfff26362,0xffe939c0,0xffe85ebe,0xfff57179,0x0005b500,0xfffd2833,0xfffb1317, -0xffe73333,0xffd899cf,0xffff7acb,0xffd7b06b,0xfffa9730,0x001e60ad,0xfff489bc,0xfff05f1f,0xffb786e0,0xffaf0137,0xffd2d4a5,0xffee964d,0x000bb87d,0x0011d4df,0x00207871,0x001b32c6,0x00073853,0xffee183f,0xffdb1b2f,0xffd864dd,0xffd2f48e,0xffe9c5f7,0xffd8917e,0xffb40146,0xffc587e4, -0xffbf637d,0xffe9a08c,0xffe00765,0x000dc1a8,0xfff077b8,0x001b8f2b,0x001639ed,0x0020670c,0xffffabe5,0x000c5dcd,0xfffe4060,0xffff4527,0xffdfad40,0xfff9f4bd,0xfff86ea8,0x001760e8,0x004006c8,0x000f3cd7,0x00020510,0xffa27730,0xff74250a,0xff9d7869,0xffcd6164,0xfffeee18,0x001f5c75, -0x0049b8f5,0x0058919f,0x00307464,0xffe94b71,0xffb7ba59,0xffa7b972,0xff9cedf9,0xffc41361,0xffc985b7,0xffafa1a9,0xffdd178e,0xffadb7f9,0xffece5f3,0x00036979,0x0041282d,0x00221eaa,0x0026a619,0x007b0a5f,0x00636d57,0x0059377a,0x004d8a5c,0x0043c142,0x00149921,0xfff239d1,0x001196d6, -0xffa659e5,0xffaa3b8a,0xffe19485,0xffb36a1e,0xff946f94,0xff7f8243,0xffba2ee2,0x00307051,0x0044343b,0x0060ea36,0x00890dd4,0xfffe4e81,0xffcc3d9a,0xffdb76ca,0x0004bd33,0x0021a7dd,0x005034f2,0x0032252f,0x002659f4,0xffdd32ec,0xffbdada7,0xffff34be,0xfffc3b50,0x001af75a,0x00110ca5, -0xffde8c54,0x00497219,0x0052c4cb,0xfffac5d5,0xfff8849f,0xffd050a7,0xffa5729b,0xffb48545,0xffeba808,0x0040f8bb,0xfff459f4,0xff8da1fe,0x0017afb6,0x0024e261,0x003caee1,0x00e2178d,0x006f9eb9,0x00263620,0x00289ff5,0xffcabcb3,0xffcf6a90,0x000169e8,0x004dea6b,0x00482f4c,0xffd8261b, -0xffd4c8c8,0xffc283b5,0xffcdca81,0xffc84221,0xffe11bf0,0xffc60815,0xffc6c2ba,0xffdf4d60,0xffff5d1c,0x00113586,0x00248f87,0x0028bdb9,0x00102354,0xffeb911a,0xffccd582,0xfffb4821,0x002a146d,0x0062090d,0x00532578,0xffe9325e,0xff35eea8,0xff7ed96e,0xffd7d087,0x0062f42a,0xff93a706, -0xff262a14,0xfeeb64da,0xfe8ab714,0xff163884,0x008f5dae,0x006bc49e,0x00638614,0x00565f52,0x002a5417,0x001683e1,0x001ee99b,0x003c7edb,0x003fa495,0x003f6cc3,0x001c2d8b,0x00279c9e,0x00103328,0xffff5d67,0x00108cc7,0xffff0ebf,0x000d7a28,0x0003fd5e,0x00017e56,0xffed13a6,0xfff67819, -0x000ee8cb,0x0017aebd,0xffff0ef8,0xffd3d09e,0xffc99c20,0xffcf715d,0xffd97570,0xffb3dac9,0xffe2e7d2,0xffabf430,0xffbbd797,0xffa64328,0xff9a47c8,0xffbbd938,0xffd3c4bf,0x003934f4,0xfff8085a,0x00179017,0x00401da7,0x0047a532,0x00488535,0x0037f1f2,0x000995af,0xffdc8f62,0xffd0c762, -0xffc71166,0xffd50d7a,0xffcf00eb,0xffb37688,0xffc60734,0xffd21409,0xffdd8fb3,0xffe7b866,0xffedbb45,0xfff6572b,0xffea83ec,0xffe9b743,0xffee3524,0x0007b055,0x000cf4fc,0x00097793,0x000c6bbf,0x00129ee5,0x00117179,0xffd5b925,0xff9c77eb,0xffe53c9d,0x00094302,0x00315ce9,0x0030f442, -0x003d6c3e,0x005a0d6a,0x004cf442,0x0039a919,0x001864bf,0xfff8b3ea,0xffe5e757,0xffdada5f,0xfff612d1,0x000a3035,0x001ad529,0x001009c1,0x0012a4cd,0x000e7292,0xffeae351,0xffe9cc5d,0xffd58786,0xffd1b392,0xffdaae1b,0xffe397ed,0x000963ba,0x00244762,0x00112517,0x000deea6,0x0003f0ba, -0xfffe5978,0x001a52b7,0x00228560,0x000fb41f,0xffe784bf,0xff8f0894,0xff9e49e8,0xffe3ed4b,0xfff4d53e,0x000d61e1,0x001a9f5f,0x0023aaaf,0x002018b8,0x0027e715,0x0029f434,0x002cb31b,0x0017782c,0x000cfb58,0x00081d34,0x000d4b44,0x00113bcd,0x0019468b,0x001c433e,0x001374d3,0xfffde18f, -0xffe2f3b9,0xffd196fc,0xffba60c5,0xffd22b76,0xffdceb47,0xffd5504a,0xffd58f26,0xffd51c4c,0xfff27af9,0xffeee8d6,0xfff188e0,0xfff60e0b,0xffef78e6,0xffd702d3,0xffae7f8f,0xffa3419c,0xffac9d2b,0xffd76213,0xffe9626f,0xffe194e8,0xffe8ea95,0xffed900d,0xfffac721,0x0009b7db,0x00104b37, -0x001454b0,0x00192604,0x001d381e,0x00222b39,0x00253fe7,0x0023d6a1,0x00227768,0x0023dc58,0x00144746,0x000fd22a,0xfff97268,0xffe438de,0xffe56275,0xffdeb6e5,0xffe00f9b,0xffd9fec1,0xffe0955d,0xffd0af13,0xffd48e6c,0xffb49089,0xffb84e3d,0xffa0285c,0xff97d670,0xff9146f9,0xff86e122, -0xff7a4f46,0xffa01376,0xffe1adae,0xfff752ee,0xfffd48a2,0xfffe9b6d,0x0003e54d,0x00055ef9,0x0004c887,0x0002a555,0x0005f701,0x000b6d65,0x00107d1a,0x0013dab3,0x001458e3,0x001255b8,0x00139640,0x0014839f,0x00172d47,0x00179fbf,0x001c86de,0x001d3898,0xfffc892a,0x0004d43b,0xfff3bdac, -0xfff00f8f,0xffe03db2,0xffdb4be3,0xffdfb854,0xffd7e0ce,0xffcfb311,0xffdd0e01,0xffe391e3,0xffdc17da,0xffe54040,0xffe6f513,0xffe7f226,0xfff54974,0xffd71e0f,0x000174bd,0xfffb442a,0xfffb73fd,0xfffb5bc0,0xfffbb96b,0xfffd802f,0xffff3c56,0x00016751,0x00019391,0x00015ac5,0x00017ec7, -0x00028ead,0x0003eab0,0x000467a3,0x000487e1,0x0004886e,0x0005735b,0x00045a71,0x000eb576,0xffe1fada,0xffd07b2e,0xffded1ce,0xffddbe7e,0xffc5c53e,0xffd5d455,0xffd2b977,0xffd27696,0xffd69326,0xffce465e,0xffcd50a8,0xffcccbfc,0xffc2595f,0xffd673fa,0xffdd825a,0xffc8f92b,0xfff8bbac, -0x0015fa2a,0x0047e7bb,0x000bdab3,0x0012accb,0x00148cd6,0x001132d5,0x0016371f,0x0017f5f4,0x001606b3,0x001bc6b8,0x001d2053,0x001aadda,0x001d3a95,0x001d0c74,0x001e5804,0x0016736c,0x0012fb88,0x001059ad,0x0011053d,0x000e4801,0x00095b1f,0x003e464a,0x0032804c,0xffe22b42,0x004024fb, -0x003c9d7f,0xfff53040,0xfffad459,0xfffde990,0xffff0e46,0x00062f2b,0x00073d19,0x000a929d,0x003e1844,0x0041cc1e,0xfff2d814,0x003fd63f,0x00366402,0x002b95c6,0x0018fe30,0x00216e32,0x001794eb,0x00229e2c,0x002496b8,0x001f0ca3,0x002a6a1b,0x002e4696,0x002cbe0b,0x0035eef5,0x00377a38, -0x0036ea84,0x001f7a01,0x00145d7f,0x000d6f15,0x000da20d,0x00004aaa,0x001458b5,0x0009965b,0x000539a1,0x0010d89a,0x001416bc,0x001d19dd,0x0027052f,0x001fb9eb,0x002e2a75,0x003fda25,0x002c0408,0x001efde8,0x002cd87f,0x00274dab,0x0025be16,0x002dc179,0x002cb422,0x004abdb8,0x001f60db, -0x00119a9a,0x001ff4bf,0x000b6456,0x0022bc05,0x00337da4,0x0026295c,0x0048bfaa,0x0051ed40,0x003fc76f,0x005393c6,0x005269bf,0x0058e7ce,0x002bc6c7,0x0016bb94,0x0009abcd,0x0003a336,0xfff3c477,0x000578d1,0x000b1b1b,0xfffbe9af,0xffea59f6,0x0014643d,0x001ddf33,0x00221020,0x001e070a, -0x00124565,0x00496705,0x0015468f,0x0027f3ea,0x002ace6d,0x00223e4f,0x002a0cb7,0x0024ca89,0x003bf2a1,0x005dbbd3,0x00345ac8,0x002b17bc,0x003e20c0,0x0022abcd,0x0046955c,0x004a00bb,0x002e5444,0x005c8c86,0x0067a460,0x005790dc,0x0085116d,0x00a1c11c,0x009f09fb,0x004edc30,0x001f59d7, -0x00036ca4,0xfff1eec1,0xffd1dc73,0xffeb8dc4,0xffe80fd9,0xffcca32f,0xffce05b0,0xfff77302,0x00037fea,0x002d2b80,0x001cf512,0x00245eef,0x00619309,0x0061a632,0x004a3ff4,0x0048104e,0x003a7b2c,0x002e2723,0x00072019,0x004006ab,0x003b8f47,0xfff95df9,0xffdfdc52,0xffda037e,0xffb3c877, -0xffcc7291,0x001b9c1c,0x009dbec9,0x006c0960,0x005a6358,0x006f70ea,0xffc92e23,0xff852937,0xff8415a5,0xffd84fee,0x0005df4e,0x00028904,0x002ef5ed,0x002f1afc,0x0034a0e3,0x001f71b0,0x0005d9bb,0x001dac74,0x0020ccd4,0x001e54cb,0xffe1c7f8,0x00502d9a,0x00581a7b,0xfff55008,0xfffad573, -0xffcfb232,0xffbb56b7,0xffd5735a,0x00271e76,0x006dc2f9,0x005de959,0x0000bc30,0x003399d3,0xffe5c27c,0x0043a5be,0x00c8781e,0x00cadfe9,0x00a05780,0x006a9bc0,0xfff98534,0xffddcffe,0xfff93d0a,0x0063c4c7,0x0070ffeb,0x000d1cba,0x0000fa39,0x00062b4b,0x003b1236,0x002df0c6,0x00051072, -0xffec68a3,0xffe5e293,0xffec37b5,0x001a9dfe,0x000b28dc,0x001b86b0,0x00245121,0x000597e2,0xffe1d219,0xffcc3c84,0x000359d0,0x00353432,0x0052a7b2,0x00442644,0xffda0dd1,0xff63e4ad,0xffa1a0e2,0xffd835bf,0x00269366,0xff7985bc,0xff672b29,0xffe48dfd,0xff9fcda4,0x000b4bc5,0x0117bcc8, -0x0094e769,0x0059b548,0x004f08f5,0x00447e67,0x004ed16d,0x00661ef0,0x006949dc,0x0053e9d5,0x003886b2,0x002346cd,0x0009fff0,0x002cdca1,0x0033dd4c,0x001a84d8,0x001ef3d0,0x001d34cd,0x0007b5c0,0x0001c4bb,0xffed8f02,0xfff55b64,0x0012779d,0x000f25c9,0xfff5d1ba,0xffd2ba1d,0xffee4b57, -0xffe236ce,0xfffd9de7,0xffb93506,0x0009e47d,0xfff4310f,0x0054edfa,0x00acc5cc,0x00ea3e18,0x00d17e72,0x0096cc3d,0x004a33b5,0x00443f32,0x00704cc9,0x00aa6249,0x009ff77c,0x009129dd,0x006e2cc4,0x0047c405,0x001ff177,0xffff2df9,0xffee97d1,0xffd440fa,0xffdb086b,0xffd505bd,0xffd2e9bd, -0xffd9f296,0xffea34ac,0xfff42fa3,0xfff30c50,0xfff72694,0xfff668c0,0xffebf478,0xffef68a9,0x00041c87,0x0001013f,0x00089181,0x0012509a,0x00265419,0x0015b863,0x0016b28f,0x00347e8d,0x00a0afea,0x00cb617c,0x00cdd1ed,0x00f1d736,0x00ef4f3b,0x00d255d9,0x00be97d4,0x00adf3e9,0x00c3e7ff, -0x00857192,0x005b9e15,0x003d2a37,0x002917f3,0x001e831f,0x001416b6,0x001712fa,0x0014c2b2,0x001f807e,0x0016a41c,0xfff4d877,0xffd4f018,0xffd1cf2b,0xffdcb175,0xffef1935,0x0013ae10,0x00239427,0x00235c9d,0x001c5f9e,0x001f5c3c,0x0020fc08,0x00351fea,0x003bd3e3,0x0022b385,0x003a5f80, -0xffe2feff,0x00193b4c,0x0039c3ca,0x00483386,0x0044c78d,0x003495b1,0x002acd6e,0x003b9f52,0x001fb37e,0x000f5eea,0x00082e5b,0x000e292d,0x00221a71,0x00327430,0x003cc080,0x00383e6c,0x001ecf3c,0x0019ccd0,0x000302e7,0xfff01119,0xffdef882,0xffd6bdfe,0xffe8b28d,0xffeb3c36,0xffe3fbf7, -0xffd8c115,0xffda4229,0xffe21708,0xfff24ccb,0xffff128c,0x00093e95,0x001096f5,0x00106388,0x000d53c4,0xfff16cb0,0xffffe865,0xffe8eaaa,0xffe9e136,0xffe3d572,0xfff1be04,0xfff91278,0x000c95c6,0x001d83f8,0x002fac45,0x0036801f,0x003cf137,0x003d9c53,0x0030ef3f,0x00227a3e,0x001736bd, -0x0014daf3,0x00162778,0x001771cf,0x0011ac3c,0x00033df4,0x000801a8,0x000c19c3,0xfff7e582,0xffe8297b,0xffe46fc9,0xffe49626,0xffe0bbad,0xffdd05db,0xffd42b30,0xffd640be,0xffc0246a,0xffb93802,0xffaade06,0xffad4c0f,0xffae930d,0xffacfa7e,0xffc91ac8,0xffff855f,0x000b48ef,0x000a6d79, -0x00147e1e,0x0017cf7d,0x001a8dc0,0x001b56ec,0x001f521d,0x00159770,0x000e6288,0x000af399,0x0007face,0x0008a348,0x000a1213,0x000a836f,0x0008e066,0x000759a3,0x00074a4c,0x0003ca42,0x0008a8f9,0x0016fbf2,0x000b502e,0x001380ad,0x00071ec7,0x0007c092,0x000415a1,0xfffcb5ee,0x00013eae, -0x0000fab8,0xfff766a5,0xffecb041,0xffec2d8f,0xfff1ea19,0xfff969a0,0x0002c2ad,0xfffed00b,0x0018d27a,0xfff99fed,0xfffccae5,0xfffe62d6,0xffff6e24,0x000260a7,0x00054d1d,0x0009ae6d,0x00063977,0x00046c0b,0x00019415,0xffffc38b,0xfffd5d35,0xfffac7b7,0xfffb01c0,0xfffb9281,0xfffbb604, -0xfffd0f81,0xfffe3c2b,0xfff885db,0x001c1de3,0x001df142,0xfffae830,0x0017c463,0x001c84f1,0xfff34550,0xfff52529,0xfff37470,0xffef95c3,0xfff40b17,0xfff49c1c,0xfff182b3,0x000e6ac3,0x000d66ce,0xffeedfcc,0x00145eee,0xfffba15c,0xffcf8fd7,0xffc24a4f,0xffcf3d4b,0xffd907d7,0xffd248a7, -0xffd45b0b,0xffc41e26,0xffc0de79,0xffc40228,0xffca926c,0xffcebd2a,0xffd07a98,0xffd2fdab,0xffd2fc71,0xffd44dce,0xffcd4ce8,0xffca9a7f,0xffc85bf6,0xffc9106f,0xffcf48d7,0xffcacc76,0xffbc8fbc,0xffdf3d61,0x00376495,0xffbc0069,0xffe0b3a7,0x0037fb82,0x00325a4a,0x00310565,0x0032a0df, -0x00294c27,0x002747be,0x00295763,0xffde8b6e,0xffba5109,0x003ba6be,0xffe73958,0x000a2df0,0xffca5b28,0xffe94522,0xffdc7f62,0xffdc43f7,0xffac8784,0xff9c5a6b,0xffa5ed54,0xffb2cc78,0xffbfe940,0xffc77284,0xffd6395d,0xffdb5e98,0xffdaaea9,0xffc18521,0xffb1cef8,0xffa8f3db,0xffa93e60, -0xffb5625d,0xffb1fcd4,0xffed6266,0xffcc9ac7,0xffbd9795,0xffe57f4e,0xffee7f37,0xffd7b149,0xffdd7626,0xffd146af,0xffde0bf3,0xffd4bfbb,0xffdf62a5,0xfff3d22f,0xffe60c12,0xfff102f0,0xffe88410,0xffddaa66,0xffe07b68,0xffd06e85,0xffec2e36,0xffd8e018,0xffde0863,0xff84cc1a,0xff6a946d, -0xff7d47e8,0xff9d56a0,0xffb98a90,0xffbbc650,0xffd2f929,0xffd55191,0xffd83a5b,0xffae0c87,0xff987969,0xff8c9e46,0xff94ad19,0xff9ee987,0xffbad415,0xffbfe6a2,0xffc96280,0xffc5c2e6,0xffec211b,0xfff68b5e,0xfff68a07,0x000216b3,0xfffd4d9d,0x000c0a2b,0x0000d778,0xfffcc8d8,0x00083b86, -0xfffb00a8,0xfffdd865,0xfff8cc88,0xffee268d,0x000ddcee,0xfff2d77c,0x0025dd0f,0x00130cce,0x0010dbf9,0xff82fd80,0xff3c96a0,0xff472e27,0xff764223,0xff9b7c5c,0xffb05ea6,0xffe4fb6a,0x00033089,0xfffbd88c,0xff9d2ada,0xff636d37,0xff4773fd,0xff4f21c3,0xff7032d0,0xff9af955,0xffc07703, -0xffc3a332,0xffbdea3a,0xffef5d6c,0x0006c0b6,0x002cb3e7,0x001aecd5,0x0026114c,0x0065e80f,0x00562009,0x00482fda,0x004f09f0,0x002f35e2,0x000e3985,0x00065d6d,0x0006619b,0xffa7488d,0xff6182c6,0xff61c561,0xff476339,0xff3969a1,0xff1bcfaf,0xff475664,0xffb4ec05,0xffcb7424,0xfff36715, -0x00311da9,0xffb09305,0xff833e8c,0xffa65e34,0xffd14a57,0xfff2c186,0x0002f836,0xfff98d9b,0xffe007ad,0xffc612c5,0xffe4d792,0xfff2a434,0x000abd15,0x000cce30,0x000c56e5,0xffe2ab40,0x005190c6,0x005630c3,0xfff42ea0,0xffe91d87,0xffbd63aa,0xffa61e7e,0xffcee92d,0x000a20fe,0x0039db02, -0xffe41569,0xffc1126c,0x000a248d,0x00277b03,0x003bff34,0x00a3f277,0x006d147a,0x003efa9c,0x0027e9e4,0xffcbdeee,0xffc06ce3,0xffe6d603,0x0059b8a1,0x006246e9,0xffdcbce8,0xffabfa1e,0xff78cdf3,0xff663b73,0xff889896,0xffa48c6d,0xffafc627,0xffd53f70,0xffdcb427,0xfff70369,0xfffbebd1, -0x000d91b5,0x001ca2a3,0xfffd9625,0xffda1f84,0xffc8c6f0,0x00084211,0x00345cf9,0x0040cba8,0x001de92f,0xffaa65ab,0xff3f5628,0xff78b647,0xffc5764b,0xffb6ef0e,0xff2eaf58,0xfeed8e56,0xfea4f976,0xfe2d3978,0xfe63310a,0xff592187,0xffd6b039,0x00192ca0,0xfffeeb1c,0xffa70b0a,0xff76de08, -0xff85b4fb,0xffc4055f,0xfffdc079,0x00306475,0x001f1a44,0x000bbebb,0xffed2623,0xfff11590,0xfffce3b3,0x0003ce8d,0xfffd506a,0xfff4bce1,0xfffc65b1,0xffea3488,0xfff46f34,0x00103be2,0x00004305,0xffe1998b,0xffba6321,0xffe534d9,0xfff064b6,0xffe82135,0xffc01903,0x000b21f4,0xfffb237d, -0xffbea609,0xff749018,0xff0f866e,0xff4ceafb,0xff874fac,0xfff0bc28,0xffd3448a,0xfff19373,0x00299f39,0x002b3cb6,0x002bf815,0x00259523,0xffe4e504,0xffad8cae,0xff8f4a5a,0xff90ece2,0xffa9273e,0xffc0e9f0,0xffc749aa,0xffc1899f,0xffcc146b,0xffe4141c,0xfff051e9,0xffece3fd,0xfffcd1d5, -0xfff1ed71,0xffe691ff,0xffee9000,0x0002913e,0x0001022e,0xffffb1a6,0xffff9d29,0x002d0d80,0x001a3430,0xffea6385,0xff59da55,0xff1c47fb,0xff430e61,0xff6fbf6a,0xffab02c5,0xffd14ac4,0xfff01907,0x000ace3f,0x000be83f,0xfffb5f0a,0xfff06d6d,0xffe414c5,0xffd2e521,0xfff4c809,0x0009a833, -0x000bb334,0x000ff235,0x000381cb,0xfff485a5,0xffe63d78,0xffd03f90,0xffcd293b,0xffcaa581,0xffd89000,0xffec810f,0x000e02d2,0x001de889,0x000dcea7,0x000f9d9c,0x000e1b06,0x0008f017,0x00204dcc,0x0021155c,0x0012e641,0xffd11f5e,0xfffcfa07,0xffc00584,0xffdeaefc,0xfffd73fc,0x0006aad4, -0xfff8fb2d,0xffe920e7,0xffce09de,0xfff89496,0x000bd9d8,0x001245ad,0xfff6836d,0xffea9f13,0xffeac483,0xffefb04d,0xffeff995,0xfff0732f,0xfff437c0,0xfff27520,0xffef71b7,0xffd81079,0xffcb057c,0xffca5f58,0xffd0525f,0xffd7e430,0xffd25c54,0xffd536f0,0xffe04ffc,0xfffc67a3,0x000435f5, -0x000c323c,0x000e2fb4,0x001633fd,0x0002e296,0xffefe38d,0xffd19b9e,0xffa1b92d,0xffb1d87d,0xffb7b2fa,0xffba49a3,0xffc2f046,0xffc6d9b0,0xffceafa9,0xffd080be,0xffda9c32,0xffdf687b,0xffe8e707,0xfff4919d,0x0000ed82,0x000cc0e2,0x000a42bc,0x000bdd61,0x000ee9e2,0xfffbdfa5,0xffe97062, -0xffd97195,0xffdfde22,0xffe19189,0xffde2db6,0xffdcbeec,0xffdf282a,0xffdb4971,0xffdbb19f,0xffcecbee,0xffc61fb7,0xffbbb408,0xffb0d224,0xffa112d6,0xff999214,0xff8eab25,0xff8a4d01,0xff999f88,0x0005c971,0xffe5084e,0xffe96ef7,0xffe72dd0,0xffe65058,0xffe27be3,0xffdf0981,0xffdc0dad, -0xffe79fb4,0xfff3ae0c,0xfffdde60,0x0006de1e,0x000d2327,0x0012ca43,0x000fbe3a,0x000cc7ab,0x000b95c9,0x0009bb5e,0x000e43ba,0x000572c6,0x0003898c,0xfff1463d,0xffe1d7ca,0xffe72a94,0xffdba13f,0xffc9659a,0xffc85017,0xffc2331b,0xffc76cfa,0xffc494bc,0xffc86ec2,0xffcc5998,0xffd3d083, -0xffe41147,0xffe26380,0xffe0c224,0xffcac207,0xffd2e9fe,0xffd7b091,0xffd52d73,0xffd611f6,0xffd735ae,0xffd8f3a9,0xffd871bd,0xffdc6386,0xffddf538,0xffe01113,0xffe25838,0xffe53a3c,0xffe9b7a3,0xffe84cfd,0xffe81e5a,0xffe79c02,0xffe70cf3,0xffe78fcd,0xffe8dc89,0xffd6a4e1,0xffe32457, -0x001542e3,0xffc86bea,0xffd8ac4d,0x001205a3,0x000e615d,0x000a5e20,0x00067a2c,0x00018362,0xfffe7b6f,0xfff985a1,0xffd223e5,0xffbdb0bb,0x000cf84f,0xffdd8a27,0xffce538d,0x00373f73,0x0027efb0,0x00420026,0x002f02d2,0x003429fd,0x002c802a,0x003439de,0x00378df3,0x0038e123,0x003e8686, -0x003fb0d0,0x003bab11,0x003d66f8,0x003d85d2,0x0041d324,0x003add18,0x00378d5b,0x00335ea3,0x003350a3,0x002b2440,0x003b94ad,0x001e22c3,0xffed9618,0xff92995e,0x0034928d,0xfffad94a,0xffa31d84,0xffa66f51,0xffa86562,0xffaf661b,0xffabfc52,0xffac5f07,0xffb56a52,0xfffbc7b2,0x003c6e05, -0xffa4b9c4,0xfff2c7b2,0xffea143c,0x004ed4df,0x0040eb01,0x003f0560,0x002e79f6,0x003afec1,0x0040d4a6,0x0044a284,0x00527298,0x005602a1,0x004f8cfd,0x00582c00,0x005e5920,0x0068003d,0x005477e7,0x004723e4,0x0039ca65,0x0030b585,0x00279289,0x002a939e,0xffc93f93,0x000c47a9,0x000d1f1c, -0x00123563,0x00120d36,0x0023f4f0,0x00292a76,0x00302b21,0x00230471,0x002d7fa3,0x002d2e98,0x0029ddb6,0x0028709c,0x0010fce2,0x001cadae,0x003f79b5,0x002a1acf,0x00363340,0x00440754,0x003ac376,0x002104c6,0x0038b59c,0x004df7fa,0x0055ab75,0x0079c837,0x008198c0,0x0068dd06,0x0075e90e, -0x00778208,0x008edc64,0x0068cb11,0x00531e2d,0x003da16c,0x002becb8,0x00269e58,0x0009065b,0xfff091bd,0xfff8abb2,0xfff1d2a3,0x0020ceb0,0x0011df35,0x00208a8c,0x00106500,0x0025acce,0x001da81d,0x000fb6b5,0x0008e72b,0x00266b12,0x001202d8,0x001df266,0x00199f47,0x0033f001,0x0040f616, -0x0054e383,0x0062f946,0x005702eb,0x002eacd6,0x004900e5,0x005455f6,0x0059175b,0x008cfb30,0x0098e089,0x007d0ff7,0x00a2954c,0x00cc6c5f,0x00ed7758,0x00a7b0c3,0x00711d06,0x0041ef80,0x001a4cf5,0x0000df1c,0xffeef91e,0xffc59f5a,0xffe64e28,0xffc8f555,0x0013affe,0x001e76e6,0x002ee1b3, -0x00256535,0x0021128f,0x0058180d,0x00517d16,0x0046ca50,0x004d2881,0x0033fa89,0x00266f99,0x001de237,0x004d780e,0xffdcc421,0x0003f2be,0x0016e6d7,0x00077795,0xffe9b63e,0x0007f8e4,0x004cae81,0x00dc6ef1,0x00b90034,0x00b18b36,0x00d681e4,0x00387c67,0xffdc70ff,0xffb6b3ae,0xfff4ba1b, -0x0026e465,0x0058f3f1,0x0073f1d8,0x00838ee4,0x00465264,0x00064a50,0x002be3b2,0x00317146,0x001d3da9,0x0012ff61,0xffe5e1be,0x00563172,0x005b5d04,0xfff80312,0xfff0fd4a,0xffc2329e,0xffb5c75b,0xffeedcb4,0x00265ca2,0x0047b87d,0x000ffca4,0x00119f5f,0x0070bbf7,0x005fb1c6,0x006a9f68, -0x0082026b,0x00b80532,0x009fb6f9,0x004d9790,0x0007b88b,0xffee04ca,0xfff9b6e0,0x00600c94,0x0078f85a,0x00286781,0x00226896,0x002d7ab3,0x006724d2,0x0042c5fd,0x002994c9,0xffe53dc7,0xffda168b,0xffe8e161,0x00070795,0x000e5109,0x001c41db,0x001ea15a,0xfff794e9,0xffd4f75e,0xffcea95e, -0x0016abbf,0x003d43b0,0x003cfa43,0x0009783c,0xffbb3da7,0xff6c951a,0xffce196b,0xffb8cf17,0xff84ef3e,0xff3416a9,0xff7141d9,0x002f6504,0x0009985d,0x004aab9a,0x00cc89dc,0x0105e54a,0x00eb691c,0x008e1a0b,0x009eebbc,0x009ff1de,0x00a3a651,0x00a1de95,0x007bde7d,0x0043f333,0x0037e464, -0x00332d13,0x002524aa,0x00253c8a,0x001e9f46,0x00197960,0x00105ab2,0xfffbe48c,0xfffb893f,0xfff4f04b,0x0001901a,0x00161ba2,0xfffebc21,0xffe02bc1,0xffbe3c97,0xfffb3f1c,0x000774bb,0xffe78bc8,0xffd2ce2d,0x0024fe99,0x003df60f,0x00a668a4,0x00e15e84,0x01428cba,0x010756da,0x00be2a89, -0x00563c9f,0x0021f027,0x002fd1de,0x00757d23,0x007c962e,0x007b9743,0x006d67ba,0x00555568,0x003fbb99,0x00225078,0x001066c4,0xfff5baa3,0xffdfa05f,0xffc31919,0xffd1eb05,0xffdcbe22,0xfff1fa43,0xfffe8458,0xfff67ba4,0x000094b1,0xfffb747b,0xffec82d5,0xfff52984,0x00066d64,0x000e0fb9, -0x00012659,0x001a64fa,0x0039a690,0x002ab061,0xffb8cadf,0xffecd947,0x00712ca3,0x0089ce1e,0x00abd787,0x00f1d2d1,0x010b3170,0x00ee0192,0x00d8f29e,0x00ca9939,0x00e16e16,0x00a535e0,0x007eb8d5,0x005d11df,0x00381f8d,0x00229131,0x00168d15,0x0010f62d,0x0013069f,0x0017e088,0xfff6db64, -0xffecb1ac,0xffd2f4ab,0xffce8101,0xffe1ddd7,0xffffd7c9,0x0013f3ef,0x00229e85,0x0019d00c,0x002527ff,0x0022ded8,0x001e7178,0x002abb52,0x002698bd,0x000188ec,0x001688d1,0xffd61c0f,0x003aa754,0x0084bbd7,0x00846ea9,0x008c0c9a,0x007371b5,0x0066a91f,0x007330cd,0x0037f0da,0x00153c9a, -0x000420b2,0x000ee97f,0x00209c94,0x002ff357,0x003db1b4,0x003d5ba7,0x0029729b,0x00239b29,0x0007ea58,0xffdfbeee,0xffd6caa6,0xffd6c17a,0xffe4ceca,0xffea35ad,0xffe435c6,0xffda263b,0xffe4bc09,0xfff20b50,0x000e6040,0x001dc981,0x002a4178,0x00311cab,0x0035d25e,0x003b78fb,0x0021d485, -0x002b57aa,0xffd3689c,0xffe4900e,0xfff585d2,0xffff94fd,0x00154254,0x0023e9ca,0x0031c879,0x00417adb,0x003ec0f9,0x00405578,0x0038a738,0x002dedf7,0x00205d23,0x00135430,0x0012b4e2,0x00147b57,0x0019300e,0x000ebe5b,0x0008f58e,0xfffdabd1,0xfff2cc7f,0xffea7a16,0xffe42e31,0xffe36e57, -0xffdec906,0xffdfa2cc,0xffd665a0,0xffddbb07,0xffcf5517,0xffc930ed,0xffb9c4a4,0xffb65ee1,0xffb066b0,0xffa63d35,0xff98a087,0xffbcdb7f,0xffd8ddb0,0x000ae2fd,0x0012804f,0x001f17a6,0x0027cb4f,0x0030d17c,0x0039f626,0x0045df6e,0x003ae3b0,0x00314cdf,0x002a43da,0x002192a2,0x001ad86d, -0x0013b7b3,0x0012b388,0x000ec859,0x000be790,0x00094750,0x00041659,0x000a12d8,0x00000331,0x000a3825,0x000c575e,0xfffb7f43,0xfff7adaa,0xfffcd3ff,0xfffa9963,0xfff9cb50,0xffeeb169,0xfff3b9f4,0xffed9dff,0xffe32595,0xffec976f,0xffeb155f,0xfff576c4,0x0000e80b,0xfffdaef8,0x000539a7, -0x00018ba0,0x0007dbfd,0x000bfff8,0x0011bbbf,0x0016cafe,0x001f0ef6,0x00187f8d,0x0015509a,0x00116099,0x000e65bf,0x000b7158,0x00078f8b,0x000770cb,0x0006ff4d,0x0006109b,0x0007329e,0x0005ca2a,0x00076c72,0x0007c10d,0xffef5b44,0xffbf28ad,0x00093dd9,0xffeb1503,0xffb276fa,0xffb339bd, -0xffb41836,0xffb66635,0xffb59bf2,0xffb6c636,0xffb63597,0xffde5b0b,0xfffe4796,0xffb59a9a,0xffe04181,0x0005255a,0xffcab509,0xfff88641,0xffb7f42a,0xffd5e8d1,0xffcf59ed,0xffd35306,0xffc50fad,0xffc138e7,0xffc05928,0xffc7c66f,0xffcabfb9,0xffc93943,0xffcd658f,0xffceba35,0xffd3c735, -0xffcac995,0xffc74cf1,0xffc38895,0xffc4593d,0xffcb958b,0xffb64470,0xfff3b2b0,0x0027f751,0x006578a4,0xffe80091,0x0029116a,0x00642a9c,0x006668c2,0x0064eeb6,0x0059d796,0x005f4cce,0x005fb6f5,0x0061a9c7,0x00233906,0xffdcd3bd,0x0069ef7a,0x003415bc,0x004dd193,0xffca8de1,0xffe1b17e, -0xffe31d44,0xffe3de12,0xffbd87fe,0xffae2720,0xffabb879,0xffb8650d,0xffbefc80,0xffbddc16,0xffcd2a3c,0xffd4db2b,0xffde71c7,0xffc354fa,0xffb4dc53,0xffa7c263,0xffabd0d0,0xffab77e4,0xffb58f6b,0x00229a2c,0xffdaa7f9,0xffe202c3,0xfffda8d7,0x000aa0f7,0xffe87aba,0xffe93d33,0xffe361bd, -0xfff5308e,0xffdbc2ae,0xffda803f,0x0000c840,0xffed6649,0x0008e4e2,0x000e1cb8,0xffe3a905,0x000c4fbe,0xffd147a1,0xffd9b211,0xffe4c405,0xffe7b19a,0xffa69c6c,0xff902414,0xff8611a9,0xffabd680,0xffbccb32,0xffb0c151,0xffccbd7d,0xffd404e9,0xffef085a,0xffba591f,0xffa42808,0xff8e1f8e, -0xff99be7e,0xff90281a,0xffc4389e,0xffe62a78,0xffe384b2,0xffe2d74d,0x00021da8,0x001846e1,0xfff632c2,0x001966c0,0xffed84e9,0x000b34e1,0xffe98919,0x00021b7e,0x000dcc48,0x00019765,0x00093cc8,0x001e282b,0x00010bbd,0x0035e804,0xffefaf9c,0x00173b84,0x002ab809,0x0027f43a,0xffc3bcd1, -0xff8a4971,0xff68d768,0xff98e6d4,0xffa6e986,0xff9c3d27,0xffd50064,0xfffff2d3,0x001eea0b,0xffbd9ca7,0xff82ab27,0xff57d0e5,0xff5f7108,0xff5f9d27,0xff980bb9,0xffd96885,0xffbacae7,0xffdbe7d6,0xfffe9d2f,0x00105a6e,0x001c188f,0x001b552b,0x002446ad,0x003e5679,0x00423c25,0x0032a3b2, -0x0045ed30,0x001b68b5,0x001006d9,0x001be8ab,0x00122dcc,0xffd9ab39,0xff6f2a2f,0xff38aeec,0xff3679b1,0xff34d3bd,0xff268928,0xff500b97,0xffbe15c8,0xffb7a2cd,0xffd356fe,0x001207a2,0xff9517d7,0xff5d2322,0xff75bad2,0xffa5d7bb,0xffd2c597,0xffd24522,0xfff1beea,0xffe1dba2,0xfff5a5ee, -0x0026755b,0x0000b118,0x0023b715,0x0005c393,0x0009a597,0xffebcbd0,0x004d8823,0x0052b84c,0xfff79c59,0xffe6453e,0xffb7e8ab,0xffafd4e1,0xffeb006a,0x0029bd05,0x00408eeb,0xfffc4ae8,0x000e2acb,0x00144c11,0x001f117e,0x00376dbf,0x005ae4a1,0x00842e54,0x00794957,0x003d23a4,0xffe45a78, -0xffc1549d,0xffd507b0,0x0057422d,0x0075f175,0x000d08af,0xffbcb7fd,0xff842f70,0xff71250f,0xff9d4d6c,0xffa67bf7,0xffbef2c5,0xfff12216,0xffe8cceb,0xfff72d49,0xffed621a,0xfffc2ee6,0x00140d43,0xffed5ba9,0xffce1cb3,0xffcdd2c1,0x0011b6b3,0x0036c421,0x00208859,0xfff00cb7,0xff8549dc, -0xff57a36b,0xff94c5e3,0xffbfda6a,0xff14799f,0xfef64ca6,0xff09e64d,0xfefecd8c,0xfeb2307e,0xfea9bc0c,0xfef48e5c,0xffca8c77,0x00197b46,0xffcd2158,0xff87d9e4,0xff5d91e3,0xff714a80,0xffa991df,0xffeaa68a,0x001f91c1,0x001fbde2,0xfff5fbe1,0xffdf9ee6,0xfff675da,0xfff6a9ee,0x0012b969, -0xfffbdeff,0xffeece3b,0xfff4b437,0xffef87a0,0xfffb85dd,0x000e87b7,0xfff1d228,0xffd46132,0xffb6abde,0x0007c28c,0x001250f9,0xffee55a3,0xffe1b177,0x003ebeda,0x006207a9,0x002057d9,0xffdb6502,0xff676aa8,0xff8b7fb8,0xffade31e,0xffcac819,0xffd41f4b,0xffeebedf,0x00300348,0x00360001, -0x0036f664,0x0033ea25,0xfff5d8e2,0xffc3c321,0xff94541c,0xff961800,0xffa05774,0xffbf8cd6,0xffdb9ff5,0xffc6bdce,0xffcf4212,0xffec4584,0xfffa0f4a,0xfff2977c,0xfffd8682,0xfff84b75,0xffe897b7,0xfff3f83b,0x00000cba,0xfffcea0c,0xfffb19f1,0xfffd7e9c,0x003e40dd,0x0024c996,0xffff2531, -0xff7a20cb,0xff1105c6,0xff359ab5,0xff597aad,0xffc089da,0xffee5b01,0xfff2fd5d,0x001c955d,0x00280cee,0x0033610d,0x00262e5b,0x001921b5,0x0009391b,0x000d468f,0x00111ade,0x0003f1e2,0x000ede0d,0xfff84a60,0xffe4ee8b,0xffea2170,0xffc64328,0xffcac444,0xffc9f087,0xffdb2253,0xfffb8718, -0x000e3180,0x0012c7b1,0x00111f04,0x0016ff2a,0x001d2039,0x001c0be9,0x0024fce7,0x0021a08d,0x001ac038,0xffe78896,0x0057813a,0x00129eba,0x000f83b3,0x002b2b54,0x0020306b,0xfffceb4f,0xffdda31b,0xffc1df29,0xffe6311a,0xfff569fa,0xfff7f84f,0xffe772c4,0xffe369f0,0xffe8e994,0xfff2549e, -0xffef95a9,0xffe4993e,0xffe30098,0xffdf3473,0xffe3b98e,0xffd7aa04,0xffd16186,0xffe3ec2a,0xffd7c178,0xffd5d66e,0xffd2790f,0xffdcc593,0xfff2332e,0x000715c2,0x0019d9b6,0x00272cae,0x00297b9c,0x00389475,0x0032706e,0x002ef7bd,0x00185a7c,0xffb74098,0xffaddb09,0xffaae61f,0xffbc9533, -0xffcb3d42,0xffd13505,0xffd3ac93,0xffccf12a,0xffd2d844,0xffd5d345,0xffdc52d3,0xffe5e5f2,0xffefccf8,0xfffaf7b7,0xfff6ff1d,0xfff8bedb,0xfffb312f,0xffebce8b,0xffd391f2,0xffcf8a13,0xffe4cbb9,0xffdedb53,0xffd9590f,0xffd71f15,0xffdf9af8,0xffd42044,0xffe01b11,0xffcb3864,0xffd777c0, -0xffc36dbc,0xffc577f7,0xffb569d7,0xffb0eb69,0xffaa2dfe,0xffacb6f6,0xffad2e41,0x00129d2c,0xffdf066a,0xffe1e3f2,0xffe17e09,0xffddf886,0xffda358b,0xffd96a61,0xffdba930,0xffe55f4d,0xffee4139,0xfff5b3b8,0xfffcdbe7,0x00032a59,0x000b7cd5,0x00055c91,0xffffa736,0xfffa8fc2,0xfff7297a, -0xfff76e6c,0xffece87f,0x0005a302,0xffe604dc,0xffe0e694,0xffe5e34b,0xffe2c88d,0xffcebe98,0xffc76b7f,0xffc63e33,0xffd1e005,0xffc13eab,0xffbd6129,0xffc68141,0xffcb6f4c,0xffe1207c,0xffe1a1d0,0xffd61c39,0xffdafc6e,0xffbe38d8,0xffc9e54d,0xffc808b7,0xffca79f7,0xffcd73e2,0xffcf7e03, -0xffcf58cb,0xffd10e06,0xffd25b5c,0xffd476f4,0xffd6b54f,0xffd8f177,0xffdcd989,0xffda6ec8,0xffd9e66a,0xffd8ee26,0xffd77e52,0xffd8b06b,0xffd0b753,0xffe410c8,0x0000000d,0x0029109c,0xffd4005a,0xfff9cbac,0x00289591,0x00267a78,0x0020e00f,0x0017b6c6,0x001873c6,0x001569f9,0x000e1e94, -0xffee6377,0xffc76e82,0x001ad7f4,0xfffa60dc,0xffc05fd7,0x0026ed9e,0xffec1fb2,0x003aed26,0x00222dcf,0x002567db,0x001f27da,0x001fb163,0x00216301,0x00248b73,0x002b0f7c,0x002cedc2,0x0028dd2e,0x002af361,0x002b87a5,0x00315bf4,0x002b6b0e,0x00288a0e,0x0023c464,0x002341c7,0x001cb3fb, -0x00332059,0xffe4c7f1,0xffbb88ce,0xff9e876c,0x00006bcb,0xffc5efee,0xffa524f9,0xffa39df2,0xffa2d012,0xffa96616,0xff9e081a,0xff9d71d5,0xffa84396,0xffc3f35b,0x0007480b,0xffaab929,0xffbb1e69,0xffc17d51,0x00331682,0x003a840e,0x002f541e,0x00223ee0,0x0019f648,0x0019cf91,0x0022d0a4, -0x00333d42,0x0038fc38,0x00314920,0x003ca801,0x00469c4e,0x0055be41,0x0045113a,0x0035e687,0x0024a263,0x0017c594,0x00182e90,0x000c14bc,0xffacb077,0xfffb2c11,0xfff2dac8,0x00029dcb,0xfffea698,0x0005ad13,0x00131ecc,0x000c6a22,0xffefd6a1,0x0008a6ac,0x00156e07,0x00110b6b,0x000c5d9f, -0xfff448f7,0xfffeb0a2,0x002514d9,0xfff548ed,0x001d835b,0x00446ced,0x002a44fb,0x001bf58c,0x000c36c6,0x001189aa,0x0024850d,0x004b3986,0x005748e7,0x00402a66,0x004dd633,0x00521075,0x0070a524,0x00518e28,0x003cc544,0x0022bb68,0x00125db0,0x0018ab4f,0xffef08b7,0xffceeba4,0xffe91385, -0xfff1b8b4,0x0018d271,0x00025a58,0x000eb844,0x0001dcc8,0x001f0f80,0xffea397e,0xfffcc29f,0xffe6e3ef,0x001368e6,0xfff7fd1f,0x0004b68c,0x00096110,0x0010fc4b,0x00133ee7,0x003fcd9a,0x006ec2e7,0x00504166,0x003345c7,0x000d48a4,0xfffeca04,0x00108837,0x0049a0ce,0x005bd7af,0x00420548, -0x00684bcc,0x0097b893,0x00ca315e,0x008cac8b,0x0051b86e,0x0017a09a,0xfff02d0d,0xffecc0b9,0xffced953,0xffab8aa9,0xfff010be,0xffd1c863,0x002200b7,0x002dc371,0x002c4b36,0x002b1add,0x001f59b7,0x003cc4ea,0x0037401b,0x0037b227,0x0046d233,0x0021cb61,0x00105229,0x002adaaf,0x0037026f, -0xff848663,0xffd4694c,0xfff57126,0xffdf87eb,0xffd64ecf,0xffe2c432,0x0011d810,0x00965c4b,0x009195c4,0x00a6075d,0x00defd1f,0x005d7bc4,0xfffda844,0xffd12678,0xffecc49f,0x001ee790,0x0072f032,0x007a8c6d,0x008f9ed2,0x003c816a,0xfffc8aa2,0x003c9aba,0x00343f8c,0x000f0d83,0x00029a01, -0xffeff4b1,0x004bdd2c,0x005192b4,0xfffe070c,0xffeb178b,0xffbcede3,0xffb0f6ce,0xfff8e7fc,0x0018957e,0x00225694,0xffc0b413,0x00127f0e,0x0073257a,0x009ee582,0x00640689,0x003b1d1f,0x00857af9,0x007efa2f,0x002c6469,0x0001d689,0xffe62c93,0xffe5ac01,0x0046964f,0x006d5d41,0x003bcf6a, -0x0017d601,0x0009e21f,0x002651f6,0x000bf564,0x0015bf29,0xffd65837,0xffdd79b3,0xffeb81d8,0xffed88ba,0x0003d144,0x000fedb6,0x001740b9,0xffeb621d,0xffcdd504,0xffd5f5c2,0x001bad06,0x0035ed5a,0x00212cf0,0xffd933a3,0xff99f633,0xff6690f3,0xffe167fd,0xffa07783,0xfee0f890,0xff003bc2, -0xff5e9525,0xffd435aa,0xffbc7c49,0xffd16975,0xffe9d339,0x00e83f2a,0x010b144c,0x006d9e35,0x0078767d,0x00639a27,0x005c5809,0x006a0598,0x005d529f,0x00399ea8,0x00350fa2,0x003b8c24,0x0002cd7b,0x00009bec,0x00124177,0x000f2662,0xffffdca5,0xfff046a2,0xfff1a88b,0xfffb630b,0x000befab, -0x001190c7,0xfff1dee5,0xffd4ae05,0xffb69fb3,0x00075183,0x002460f5,0xffc8b7bc,0xffedbc46,0x004af327,0x008624dc,0x00a3d8c9,0x0082f2ad,0x009f9a4e,0x00734a0f,0x0052323e,0x00283195,0xffe31909,0xffdc9cd2,0x001a75f9,0x003745a8,0x0047290d,0x00504d7a,0x0037ce4b,0x00269ab8,0x000b239c, -0xfffd23e7,0xfff348eb,0xffd6744b,0xffba13f2,0xffcd7aa9,0xffdc26a3,0xfff305d7,0x00012fbb,0xfffa12ec,0x0002b394,0xfff98eef,0xffed6319,0xfffc4a79,0x000839e7,0x0014cffc,0xfffd6c40,0x0015c031,0x003d03d2,0x003b61d0,0xff8835d8,0xff8902dd,0xffc60ce6,0xffd57dcf,0x00168cf2,0x0068bc8b, -0x0098d3b5,0x0095cb61,0x0096d983,0x00919363,0x0095c8b1,0x0073e70f,0x005efa9a,0x004ca4f1,0x002e35b3,0x001ba15c,0x0012a073,0x000698cc,0x00030ddd,0xfff78ccc,0xffd2031b,0xffd7a781,0xffce5563,0xffccd2d3,0xffe3a27c,0x00085bbd,0x000bc959,0x00170dc5,0x000ca801,0x00219410,0x001c6864, -0x00167949,0x0016dd9e,0x000dea3c,0xfff3af26,0xffe33351,0xfff3e0eb,0x00336746,0x007fff00,0x007bbecc,0x0086b352,0x006ed2fd,0x006155ae,0x005b2e0c,0x00322972,0x0016f277,0x0006a7d9,0x000673eb,0x0006f144,0x000b6c99,0x0018871f,0x001cb894,0x0018b388,0x00144a4a,0x00016997,0xffdb7912, -0xffd81e7e,0xffd984eb,0xffd9df7e,0xffdea6eb,0xffdd9cce,0xffd8dc03,0xffec5cbd,0xffff4607,0x0021b747,0x002fc198,0x003b7b98,0x003f92b3,0x00469d59,0x004a8029,0x0038129e,0x00378188,0xffb72efd,0xffd1d941,0xffefaf62,0xfff6c8c3,0x00139b59,0x0018038a,0x001d09b1,0x002191c7,0x0018e0a4, -0x0015a499,0x000d2638,0x000dd5ab,0x000d086d,0x000a5e33,0x00091697,0x0008fa21,0x000db60e,0xffff081f,0xfffd2aa9,0xffe6a812,0xffd45c56,0xffd74747,0xffd7f1c2,0xffd9da31,0xffd4ca9f,0xffd6cd4f,0xffd010b8,0xffdd993f,0xffc877aa,0xffcfd679,0xffbf583b,0xffc2c322,0xffb5ff14,0xffa3b650, -0xff90b52b,0xffaeefad,0xffc7453e,0xfff37542,0x00001b14,0x00085126,0x00110071,0x001a4e61,0x00267bbe,0x003421c4,0x00312cea,0x002e18be,0x002a5a44,0x0023e633,0x001bfe8e,0x00137dee,0x000fbae7,0x000a845d,0x00068440,0x00025e29,0xffff27e9,0x00006728,0xffe8d65c,0xfff8595b,0xfff016f2, -0xffe53481,0xffdc5dc0,0xffdfe5fa,0xffe17ac0,0xffdad1da,0xffce2d74,0xffd9986f,0xffd9fba4,0xffcdcbb0,0xffd80cf0,0xffd62fc5,0xffdc7f15,0xffedcc13,0xffd51308,0xfff6ca09,0xfff1f25f,0xfff89301,0xfffdd937,0x0003c4e6,0x00087f2f,0x000fa0e9,0x000aea83,0x0008dc79,0x0006ddf9,0x00053b95, -0x0004419c,0x0002b838,0x0001b1ac,0x000071b1,0xfffed79c,0xfffea300,0xfffba8dd,0x0001834d,0xffe356ff,0xffc77177,0xffb338b3,0xffe3fc97,0xffbfd38d,0xffa7979f,0xffa5bbb0,0xffa67a5e,0xffaaa980,0xffa4bfac,0xffa4b85a,0xffa42f80,0xffb6d062,0xffd99027,0xffac7245,0xffb916e8,0xfff567e8, -0xfff24fb0,0x002ebecd,0xffde10ce,0xfff70224,0xfff58266,0xfff743d6,0xfff2a3b0,0xfff0f0d0,0xffed18c6,0xfff53963,0xfff6818e,0xfff0b593,0xfff5d04a,0xfff7c4c0,0xfffeec0d,0xfff628f6,0xfff26416,0xffed6453,0xffed8fe8,0xffef5a33,0xffdcf5d7,0x0029dd16,0x00439382,0x00369f82,0x0023b99d, -0x00485dbb,0x0038a851,0x004065dd,0x003f767f,0x003137c0,0x003dec90,0x00404610,0x00456c4c,0x00417af4,0x00183b8b,0x003edf25,0x004e6c2b,0x0052597a,0xfffc7e5d,0x0000d5a2,0x000c4a17,0x0009fca5,0xfffe2a7b,0xfff7417c,0xffebce87,0xfffa9043,0xfffabfcf,0xffeeae6d,0xfffcde23,0x00062302, -0x00173c8a,0x0000f430,0xfff49ede,0xffe412ab,0xffe44c5a,0xffd7096e,0xffe5e91b,0x00252b87,0xfff9e218,0x00116996,0x00181c3b,0x00213d85,0x000b462d,0x00099540,0x000b931f,0x0011a56b,0xfffb8fd2,0xfff31756,0x0016d97e,0x00055590,0x00196d65,0x002e73ff,0x0008a76f,0x0030928b,0xfff76be2, -0xfff54f49,0x000fb034,0x000b5955,0xfffe3a83,0xfffa1c96,0xffdc9831,0x00095e3a,0x000dd87e,0xffeedb9c,0x000aaa69,0x00130d4b,0x003c60bc,0x000c2d39,0xfff762af,0xffd96151,0xffdaf160,0xffc4b98c,0xffe67d81,0x0006a720,0x0001c617,0x00079e18,0x001f0fee,0x002df698,0x00055257,0x00240d4c, -0xfff3d1b4,0x0004855e,0xffdfbbc6,0xffffb45d,0x00164a4e,0x0005cd4c,0x00135309,0x0038ba7a,0x001d2508,0x004ac916,0x000eca6b,0x00260b9d,0x004c198f,0x00435b3b,0x002fe06b,0x001947df,0xffdeceb2,0x0014f087,0x000fc723,0xffe1905f,0x0016aea8,0x00490f4a,0x0084bea0,0x003a8ab1,0x00038196, -0xffc97fa6,0xffbc0c7a,0xff983a20,0xffb5d833,0xffe22afe,0xffcd11a1,0xfffbe68f,0x0019141d,0x00204fe8,0x00159fea,0x002252b8,0x001fa24f,0x0013f780,0x0027e624,0x001c297c,0x00363506,0x000a4e90,0x00110fa7,0x0031f931,0x002a0261,0xfff8ddc2,0xffb88554,0xff717a7c,0xff7eb03d,0xff843a04, -0xff90a82f,0xffbd86f0,0x002c3b57,0x000bbaa3,0x0016e465,0x004a4b4f,0xffcea4d9,0xff7d6896,0xff6efd6e,0xff9a1e18,0xffd26bec,0xffe608f1,0x0022d6e9,0x002f3afb,0x00502b66,0x0059e8aa,0x00244d8c,0x0039506b,0x0003fdd7,0x0005944a,0xfffa0832,0x003f4b38,0x00468504,0xfffd4ae5,0xffee2159, -0xffc26fff,0xffc226e6,0x00025004,0x0037da9d,0x003f30eb,0x000a22f6,0x005836e1,0x003ee737,0x002b6b7c,0x00323985,0x001c18a3,0x009ee4f7,0x00b34e67,0x005641f4,0x000ac8da,0xffd116d8,0xffc5ed02,0x0040256c,0x00771b1c,0x00534fbd,0xfffacddb,0xffd370ab,0xffdbd2f5,0xffec7f6f,0xffdfe4fb, -0xffe452bf,0x0007bdd1,0xfffae9ba,0xfff87560,0xffec10e0,0xfff64a25,0x00100910,0xffe3743a,0xffcb4b81,0xffda2ef8,0x00144ab1,0x002f1be5,0x000a2f7e,0xffd0ed09,0xff80dd66,0xff7903c8,0xffd9251b,0xffa59044,0xfe9d4280,0xfef96dc2,0xff65d68e,0xffb53d8f,0xff9cac92,0xff82ba47,0xff52feba, -0x00392f3d,0x006ae286,0xffe5c22f,0xffd7b7d4,0xffc35979,0xffd2e706,0xffec412a,0x000b6e76,0x00194c2a,0x0020144c,0xfffa49d3,0xfff0c1de,0x00097b3b,0x0001d26f,0x0020116f,0x00029c13,0xffefccc7,0xffecea2f,0xfff9e606,0x0008901c,0x000c911b,0xffebfba0,0xffd4d573,0xffc2c6b9,0x0022f2d1, -0x002ac7f8,0xffdd9446,0xfff31c42,0x0076e115,0x00c0832d,0x00a61493,0x007e6dad,0x004774ef,0x0030891c,0x001e1acf,0xffe0f5fb,0xfff0c9e3,0xfffc9a3c,0x0030c244,0x0049b6c7,0x00525180,0x00519c4c,0x00289058,0x0007bc7b,0xffd95141,0xffcf70dc,0xffc01a43,0xffcc86cd,0xffe14841,0xffd2a621, -0xffdcd304,0xfff5a914,0x0002cde5,0xfffd7323,0xfffc2c5d,0xfffb24f4,0xffef1951,0xfffdccd2,0x0002ec84,0x00022d4e,0xffff57a4,0x0008b0de,0x003d4b63,0x003aba20,0xfff0da7e,0xffc5da3b,0xff91141b,0xffadfb7e,0xffcf055d,0x003270f2,0x0058c766,0x0048f898,0x006818f3,0x00732002,0x008dd3f7, -0x0075631c,0x0061d670,0x0053572b,0x00325cbb,0x001cf107,0x00037a49,0x00074b3d,0xfff116a5,0xffe15d73,0xffea1da7,0xffcb855f,0xffc9e02b,0xffcdf230,0xffe0de96,0x000804d3,0x000a34db,0x000957d6,0x001456fe,0x001d8319,0x0025e78e,0x0029b5cf,0x002020b6,0x001b19d1,0x001798c3,0x0006eaa3, -0x00722d03,0x0060dd9e,0x005b5f91,0x0065202b,0x0051d0fc,0x002a0e27,0x000d21e8,0x000182bc,0xfffe41b9,0xfff6f75c,0xffee3914,0xffee16cc,0xfff3aaf8,0xfffcf8f3,0x00093902,0x0006a3d1,0xfff3ae6d,0xffecc03e,0xffe254a6,0xffde5a84,0xffde50fe,0xffdf0edb,0xfff5aaa6,0xffe33e60,0xffd9a2d6, -0xffd860b7,0xffec7044,0x00070958,0x001802a1,0x002e9e40,0x003cb67a,0x003f8ac2,0x004bd704,0x0053a7e3,0x0055499f,0x005805e4,0xffd6ac5f,0xffc5f92d,0xffc50fff,0xffdebadd,0xfff3a8e7,0xfffc1023,0xfffc019d,0xfff5fe1f,0xfff3159c,0xfff2a8cd,0xfff159f8,0xfff27cb6,0xfff2cfe0,0xfff55368, -0xfff0e301,0xfff0fef9,0xfff1fc2e,0xffe9d7f6,0xffd7fa21,0xffdb4788,0xffea1f12,0xffdd5607,0xffd57564,0xffd3ab98,0xffda2cb1,0xffcf40a4,0xffdc13a8,0xffd0d187,0xffe273ec,0xffd23c2e,0xffd91273,0xffd1daf0,0xffcdac2f,0xffc7b7d9,0xffc6e175,0xffc8b734,0xfffc6717,0xffe2a75f,0xffe614e0, -0xffeb3011,0xffea9002,0xffec787f,0xfff286f6,0xfffca226,0xfffd4b18,0xfffd03a2,0xfffca948,0xfffc9b3d,0xfffdd5a8,0x00022210,0xfffb8257,0xfff4ee7e,0xffede4ad,0xffe9fe31,0xffe5205e,0xffe0225f,0xfffc69e8,0xffe5683d,0xffea2b0f,0xffe75743,0xffea3c75,0xffe012b9,0xffd6cb85,0xffd8963c, -0xffdedf59,0xffcd5b4b,0xffc3280f,0xffc7d530,0xffcbb211,0xffdb0c47,0xffe0819b,0xffd76c32,0xfff097c6,0xffc9a2e0,0xffd4105e,0xffd5de11,0xffd9cf93,0xffde86ed,0xffe11e9f,0xffe3b7d5,0xffe15aa5,0xffe147ef,0xffe194ed,0xffe20478,0xffe1f658,0xffe2a508,0xffe057f2,0xffdf819e,0xffde370f, -0xffdcbdd3,0xffdcfdac,0xffd23edc,0xfff6e553,0x00094002,0x000a0b96,0xffeddb14,0x0007da39,0x0007d3bb,0x00079b0f,0x00038402,0xfffba1f5,0xffff75cf,0xfffe14aa,0xfff7ed8f,0xfff96dcd,0xffe1c4a3,0xfffad9a1,0x00012651,0xffd1925f,0xfffb4e2f,0xffca1e16,0x000633af,0xfffe738b,0xfffd3bcb, -0xfffcec6b,0xfff2e2db,0xfff135a6,0xfff31c80,0xfffb3bab,0xfffde5f0,0xfff9f385,0xfffdaa88,0xfffed83e,0x00049cbd,0xffff61e1,0xfffcdb1f,0xfff84395,0xfff76f54,0xfff6e2ac,0x0000635c,0xffc6af6a,0xffc5b58d,0xfff50adc,0xffd685ad,0xffc9ddd8,0xffefea98,0xffec5706,0xffe8f1dd,0xffe7a933, -0xffddb8ea,0xffdd1a5e,0xffe647fb,0xffc3b297,0xffd4fb41,0xfff8f34a,0xffc4dde9,0xffd93e9d,0xfff92889,0x00147e81,0x0009e53c,0x0007eab5,0xffe70df8,0xffdd35cc,0xffe2aa87,0xfff4bf3b,0xfffb6e3b,0xfff2d63f,0x0002271b,0x000dab49,0x001d6695,0x000ee843,0x00002732,0xffee21b4,0xffe3aa16, -0xffe8dd82,0xffd9e772,0xffc8d861,0xffe74518,0xffe22a4d,0xfff92167,0xfff77ead,0xffe80db9,0xfff4c0da,0xffe4780b,0xffcdd464,0xffdbfebd,0xffec4064,0xfff8d917,0xffeb8641,0xffe784da,0xfff34594,0xfff906a3,0xffd69455,0xfff03c5e,0x001bd411,0x0007b593,0x000d63dc,0xffd1c19c,0xffc11054, -0xffcb35b9,0xfff60f44,0x00062425,0xfff119a3,0x000629e0,0x000c9f3a,0x002ae3fd,0x00101a80,0xfffd7b4c,0xffe1f3f2,0xffdb166e,0xffe1f217,0xffd075f3,0xffc5378c,0xffe1ddfa,0xfff71a23,0x000cabfe,0x00015097,0xfff917f9,0xfffe9459,0x0002dcd6,0xffcb601b,0xffe10959,0xffd31f3a,0x00010b4b, -0xffe52274,0xfff0f752,0x000a2ad0,0xffefc91a,0xfff6951c,0x000f7ee3,0x0050784b,0x003dd612,0x003cd022,0xffd7b149,0xffa89499,0xffa8a7fd,0xffe38df6,0xfff58d86,0xffdd04a2,0x000a11d8,0x00392b07,0x006d73e9,0x00392f71,0x00004734,0xffc39be0,0xffaa6cc8,0xffb31519,0xffa65fce,0xffad517b, -0xffeaf317,0xfff0500c,0x00255cc7,0x002f01e3,0x002229d7,0x0029b0f6,0x001c79b9,0x001350b6,0x0015ef1a,0x001a002b,0x00355d5e,0x0005bd77,0xfff90ad2,0x0035594f,0x0011eeb5,0xff684867,0xff965f4d,0xff993189,0xff8b1a7d,0xff9ca301,0xff8f8940,0xffa74ca3,0x000b8c04,0x0025aae2,0x00568189, -0x009ac72e,0x003a05bd,0xffe44256,0xffc4dd97,0xffc377fa,0xfff2adab,0x0047b6ff,0x004d80a0,0x005ef8aa,0x00325633,0x00184a3b,0x003723ea,0x002ad0cb,0xfffb79d1,0xfff51a74,0x0000661b,0x0035e78d,0x003c10e8,0x0000d270,0xffec3071,0xffc5203a,0xffbbc31f,0xfffd6bcc,0x000ff769,0x000b80f0, -0xff9b3d46,0x0027c9df,0x005370a2,0x0089664d,0x00343f50,0xfffefec0,0x005ce5f6,0x006d0182,0x0025443c,0xfffbc0fb,0xffd0a0ad,0xffbee8ff,0x002055ab,0x005771fc,0x004ca782,0xfffb6ca5,0xffc95388,0xffbe5093,0xffc04144,0xffe437bf,0xffd3627f,0xfff35bec,0xfff62593,0xffddfe56,0xfff2912b, -0xfffaed38,0x000e76ef,0xffe2aba6,0xffce4788,0xffdff443,0x00146f4b,0x00257c22,0x00056329,0xffbadd89,0xff7f1ffb,0xff6a642c,0xfff05c05,0xff79bde0,0xfe6e069c,0xff033d7c,0xff622bb1,0xff524ec1,0xff2d226f,0xff16e22d,0xfef609f6,0x005a8f83,0x00b85951,0x00141357,0xffffe498,0xffd455c9, -0xffcf8f53,0xfff1c128,0x001371b7,0x00223d69,0x0022870f,0x00232f75,0xffe514c1,0xffe73f70,0x0001e994,0x00094e0b,0xfff32af9,0xffe89555,0xffe884f4,0xffff0e55,0x0010c09e,0x000b2607,0xffe916dc,0xffd335ec,0xffc2ec9b,0x00145b56,0x002ec6e3,0xffb3a274,0xffe6be35,0x007ed9c9,0x00c6aabe, -0x0074c207,0xfff4e815,0xffa9ef2d,0xffa2b21b,0xffbcb241,0xffe6ac38,0xffb7b073,0xffa8822d,0xffc7dcf0,0xfffc1bcb,0x001a3e59,0x002fd151,0x000ebb2c,0xfff50081,0xffdbd7c7,0xffd1b9e9,0xffd88e34,0xffcc3212,0xffc4043f,0xffceb698,0xffdf935d,0xfff41e14,0x0000a0a1,0xffff0874,0xffff62b2, -0xfff53d9a,0xfff0bee5,0x0002605a,0x0007c340,0x00107c82,0x0001cdd2,0x000d0f70,0x00324a59,0x004dd65a,0xff96baa0,0xff515fa5,0xff1d1732,0xff2c9fc3,0xff745636,0xffbd9ed4,0xfff4daf9,0x0010c664,0x00311314,0x003cdc38,0x003274cd,0x003080d7,0x002c2e86,0x0028bff3,0x001c705f,0x00122845, -0x0007e579,0xfffaf771,0xffead615,0xffd0d547,0xffbd4ac4,0xffc22e0f,0xffc72f29,0xffce6365,0xffe34c5c,0x0006fce4,0x0001c41a,0x00073bc7,0x0002f384,0x0015403e,0x00135074,0x0012112d,0x000530f8,0xfffca59a,0xfff8e05f,0xffc1c291,0x00338411,0x00246cb6,0x004a80be,0x004b2996,0x004ff185, -0x003dc510,0x0030d3d3,0x0019cdb7,0x00194f8a,0x00114c5d,0x0008f34d,0xfff95046,0xffea1db3,0xffe47481,0xffecfe94,0xfff1f370,0xfff63590,0xfff4f44b,0xfff224e9,0xffe2af1a,0xffe09a6d,0xffdf5b93,0xffd7148a,0xffd515e9,0xffd80f7c,0xffdaeff4,0xfff440f8,0x000bdb7e,0x002a0a73,0x0035a708, -0x003d887f,0x003cadb2,0x004516c7,0x00445e55,0x003ff7b4,0x0034e1a7,0xffac7578,0xffbee295,0xffd7fb51,0xffe06826,0xfff97d2d,0xfff63652,0xfff2bfe3,0xffebecd3,0xffe470cc,0xffe0cff3,0xffdedd2f,0xffe9ad57,0xfff4b19b,0xfffd8028,0xfff9f383,0xfff78e3e,0xfff8dae2,0xffea88b9,0xffe5922c, -0xffd14673,0xffc6228c,0xffcc0d94,0xffce1b0b,0xffd0ed65,0xffcfc97d,0xffcf9fea,0xffd115cb,0xffd9b0f3,0xffcdcecb,0xffd8998c,0xffd162e7,0xffd615a6,0xffc6cde6,0xffb2cba6,0xffa2b308,0xffafa58c,0xffcfb356,0xffd39012,0xffdedf3b,0xffe026e3,0xffe43e1d,0xffe9643a,0xfff2e74e,0xfffc8935, -0x000351af,0x0008b05e,0x000b0d41,0x000bd09a,0x000957ee,0x0007275d,0x000115b4,0xfffbc3a9,0xfff7533b,0xfff2fde1,0xfff293c4,0xffecde2d,0xffdd6a0b,0xffe06a98,0xffd3106b,0xffd2f8b5,0xffc97f17,0xffc4d121,0xffc5bf44,0xffbcdef9,0xffb6f678,0xffbbfd75,0xffbe64aa,0xffb870d6,0xffc00ee5, -0xffc5a99b,0xffc6b19c,0xffd10987,0xffbb86cd,0xffd742d4,0xffd7b46a,0xffdb21f1,0xffdf78b1,0xffe358ac,0xffe5e277,0xffe8b38d,0xffe8a0d7,0xffe94b42,0xffeaa851,0xffeba084,0xffed3504,0xffef59de,0xffed38be,0xffebaf8c,0xffe9e537,0xffe81ee2,0xffe5834e,0xffe8f9be,0xffc9381a,0xffc04b30, -0xffd50abb,0xffc4e351,0xffb8a9b9,0xffcfca11,0xffcbdf87,0xffca4926,0xffcb3d70,0xffc45fe0,0xffc2863f,0xffbfa9e4,0xffb1e44b,0xffbb115e,0xffceb3a1,0xffb6dfd6,0xffd89411,0x00220d41,0x003a2ccd,0x001b8599,0x001e868d,0x00229ead,0x0020c680,0x002454d5,0x00252c2c,0x002155bb,0x0029aa91, -0x002a12cb,0x0021e71b,0x0026adaf,0x00286146,0x002f3cae,0x00292b7d,0x0025f52d,0x0020b466,0x001f80a6,0x001a49dd,0x0018e443,0x00358b85,0x00249314,0xffe1e565,0x003f256f,0x002d0da2,0xffe5c919,0xffed341e,0xffec629b,0xffe3c63c,0xffebf169,0xffee9c0c,0xfff88c00,0x0026fd10,0x0039dae4, -0xffecd3b4,0x00290595,0x001c1860,0x0031d266,0x002a8e12,0x0035b730,0x0030680c,0x00381d84,0x0039a6d7,0x002e4c8b,0x003f782d,0x003cd6fb,0x0029eb22,0x0035c92b,0x003fc89c,0x0053473c,0x00474920,0x003d3dac,0x002b6176,0x00227151,0x0010ac83,0x001784e6,0xfffc64f4,0x00126b39,0x002b2464, -0x00239aea,0x0023d45d,0x00214ce6,0x0021cdcc,0x0025112e,0x0016abb7,0x00125f59,0x000d4443,0x0021c43c,0x00159b7a,0x0015162a,0x00341666,0x0029a558,0x002db61b,0x001f07ae,0x00255774,0x0038ed77,0x00303e18,0x00450881,0x004fddf6,0x00349fc7,0x00644f4e,0x00636dd2,0x003ae4b1,0x00509ae8, -0x00570614,0x008000ef,0x00626b20,0x00512e20,0x00312833,0x00225812,0x000d5717,0x0003e4bf,0x000a7169,0x0010c1cc,0x00206a99,0x0030058c,0x002b9236,0x001209e2,0x001a0f8b,0x000264a6,0xfff022ab,0xffdd3ca5,0xffee1db1,0x00180045,0xffff4796,0x00105a5e,0x003b5df0,0x0026cb35,0x0037f470, -0x0032af6e,0x00464a1f,0x00631b77,0x0057a120,0x00746734,0x007a0d00,0x0048d7d0,0x0081fa94,0x0076be1d,0x00375e42,0x005fceb4,0x0091fbe9,0x00d8891d,0x00b5aad7,0x00871247,0x004584b0,0x001b5581,0xffe87a93,0xffd7c434,0xffd6acc9,0xffee4ac9,0x0014cdbc,0x0033a5ca,0x00307c47,0x00181fed, -0x00282ddf,0x0016f9c2,0xfff27ebd,0x0007dce2,0x00056090,0x0025915e,0xfffa83e1,0x00092713,0x004453dd,0x00351a6d,0xffe05305,0xfff9d740,0xffcc4474,0xffdb2804,0xffe8dd8f,0x0000184e,0x002800c9,0x008dac8c,0x0076da43,0x00830528,0x00ab3eb7,0x003fb858,0xffd86d5b,0xff9943d1,0xffad366a, -0xffe54458,0x0024b37a,0x006276e5,0x0088e530,0x0091cf79,0x00663937,0x004729d0,0x003bf5cf,0xffff054d,0xfffc2c8d,0x000a84e3,0x002b43c4,0x0031f9cd,0x00010c8d,0xfff8f847,0xffd65e8f,0xffd95d1c,0x0012a5d1,0x0030e741,0x002a2649,0xfff22e4f,0x008348e8,0x00721462,0x0049dd09,0x00249436, -0xffe4a1d7,0x009d7f9f,0x00c78e66,0x005edb48,0x00276ed2,0xffe0171a,0xffb34246,0x00157b9a,0x005e3e98,0x0085b31b,0x003b3230,0x00277a00,0x004745d7,0x002eefb7,0x001e4892,0x0009016c,0x00116426,0x0009cd68,0xfff5cf6f,0xfff515d8,0xfff803bb,0x000bdb5a,0xffdfa19e,0xffd1a430,0xffe75dde, -0x0011eb4b,0x00212833,0xfffbecbd,0xffb8659f,0xff8ada9d,0xff988e55,0x00272a3d,0xff6330fc,0xfe6b80f2,0xff37e8bc,0xffd89ffe,0x0045f3e1,0x00491f76,0x0033e1dc,0xffdfbfe8,0x00aa5684,0x00c2237c,0x002cbb8f,0x00466787,0x003ef769,0x00434fbd,0x003c8ab5,0x0033eab6,0x001a4e8d,0x0020abc9, -0x0013d4e8,0x000d65a5,0x001934f7,0x00132340,0x002021ed,0x0004e8a0,0xfff19806,0xffe782b5,0x00047f2b,0x00140d29,0x000ab5d5,0xffeb09f6,0xffdc14a6,0xffdc16e4,0x0029a27a,0x002e775f,0xffc4458d,0xffd2b74e,0x00a7089d,0x00f8719c,0x00f225ed,0x00d3ef77,0x00e5c1b4,0x00a1da95,0x006d70e9, -0x00099b3d,0x0000cc1a,0xfff6d309,0x000ee853,0x00427f35,0x005a55f9,0x005eed95,0x00525276,0x0043a6bb,0x00262329,0x000eaf68,0xffeef134,0xffdf14e2,0xffdb30b3,0xffe10d3c,0xffef4d34,0xfffe8e3e,0x00081477,0x0007781b,0xfffb8bf1,0xfffa2465,0xfff661da,0x0005ea96,0x0006ebc1,0x000c9c77, -0x000b6791,0x001a59f9,0x0030df8d,0x005ae5de,0xffc3294e,0xfff24449,0x000e96ed,0x001fe18d,0x00405e0d,0x0085ca1f,0x00a26f6b,0x00905d15,0x009dd526,0x00a7c070,0x00c1e6b7,0x00a2b0f0,0x008b9bf4,0x007f3fde,0x004630c4,0x00208974,0x00059573,0xfffa1b36,0xffea6568,0xffdfb987,0xffdd1a58, -0xffd36e1a,0xffc8b18d,0xffd4d807,0xffe7ee40,0x000c004d,0x0003aeb5,0x00033273,0x000f9cc5,0x001b63a2,0x0021b03e,0x00291891,0x00104fbc,0x0009f0c8,0x00052cbf,0x000bebde,0x00522274,0x00807e98,0x008de451,0x00837b84,0x0077b06b,0x005fa03b,0x0052fbdf,0x00594c80,0x002b4c46,0x000bb6a8, -0xfffab4ea,0x000358d4,0x000b3a4b,0x001074a6,0x001c980a,0x001c13e8,0x0007bf3b,0x0000b22a,0xfff30377,0xffe2307b,0xffe78783,0xffeb95b7,0xfff71e61,0xffea4e69,0xffe10da6,0xffe3b065,0x00001799,0x0019decd,0x0029e5a0,0x003b9fa0,0x00448287,0x00451ccb,0x004be461,0x005ba841,0x005c1f28, -0x006f2d33,0xffe91e0f,0xffe2d7e2,0xffed6e10,0x0002bee4,0x00192298,0x00204d20,0x002028e6,0x0020ade0,0x0017cd8d,0x001687c7,0x00108c08,0x0009f2a4,0x0001ed50,0xfffb32e9,0xfff612b8,0xfff2a9c2,0xfff0cf1a,0xffee5806,0xffe8e1a0,0xffe9e397,0xffe69831,0xffda75d4,0xffd35701,0xffd48bd3, -0xffd5554e,0xffd26f31,0xffd6f128,0xffde5981,0xffe58914,0xffe57dff,0xffe99549,0xffeffb61,0xffe847d4,0xffde1d66,0xffd3ae0c,0xffdeaa58,0xffd1ac87,0xffe33cad,0xffe91e60,0xfff232fe,0xfff74235,0x00001ebe,0x000c37e4,0x001a99be,0x0013458d,0x000b2ee1,0x000443d5,0xfffe0619,0xfff9edd7, -0xfff84735,0xfff3b535,0xffeed944,0xffe93a5b,0xffe5d77a,0xffdefa92,0xffe0c70f,0xffea23bc,0xffe93dee,0xfff0383d,0xffe631bc,0xffe8dd76,0xffebf615,0xffe58a06,0xffe5b9e5,0xffdfdabc,0xffd87c71,0xffcd761c,0xffc7e14d,0xffcc5711,0xffcf8f15,0xffd7da73,0xffda6182,0xfff445ac,0xffe28e76, -0xffe5fff3,0xffeb933d,0xfff004f8,0xfff4eb3d,0xfff7b872,0xfffd06ba,0xfff84841,0xfff75337,0xfff60879,0xfff4c67b,0xfff2dbd2,0xfff08964,0xffeef972,0xffedd6ca,0xffec5906,0xffeb53f5,0xffe9c683,0xffe3ebe9,0xfffa6d3d,0xfff56363,0xffd3615e,0xfffb9b1c,0xfff696d4,0xffce5178,0xffce75e6, -0xffcd5094,0xffcb5bbe,0xffcd6c87,0xffcdaf11,0xffcaa3d1,0xffe8f7e4,0xfff18dae,0xffc7f8e5,0xffea459e,0xffec82f4,0xffdc81d0,0xffda4654,0xffd56112,0xffe54b02,0xffe16cdc,0xffe6631a,0xffd76926,0xffd35a8e,0xffd1cd84,0xffdad9e4,0xffdd8daf,0xffd95ac2,0xffde78d8,0xffe02243,0xffe52df2, -0xffe07bcb,0xffde2e38,0xffda54f1,0xffd8db2c,0xffdcefd5,0xffd321b6,0xffd9e297,0xfffd9585,0x0049e976,0xffd8ca9f,0xfffd14a7,0x003e0e93,0x003cba92,0x00386c60,0x002d9ddd,0x002c8134,0x002d2019,0x00342f87,0xfff3f49e,0xffcdd487,0x0048f3a5,0xffffcda9,0x001436cd,0xffd3f57a,0xfff368c4, -0xfff2b6ef,0xfffa2d9a,0xffd206e3,0xffc34a56,0xffbf117e,0xffd04176,0xffd4828a,0xffca06c4,0xffd9e94f,0xffe4bac4,0xfff372f8,0xffe8432b,0xffdcf49d,0xffcd306c,0xffc697b1,0xffc70b7b,0xffc0d234,0x00017427,0xffe41064,0xffed6068,0x00000979,0x0002cf8d,0xffe2a523,0xffe73bba,0xffd724c5, -0xffd0e61a,0xffc80027,0xffd139fd,0xfff2e17d,0xffddf26f,0xfff0ff62,0x000396d7,0xffdfd4a6,0xffe06fa5,0xffd5694b,0xfff35dc4,0xfff6f5c9,0x00086153,0xffc28ad8,0xffa7558d,0xff9ac938,0xffc70341,0xffd58ba2,0xffc102f8,0xffdaf01d,0xffe25d0b,0xfffe9544,0xffe72f02,0xffd7ff1b,0xffbe379b, -0xffbd1972,0xffb84062,0xffc8926c,0xffda8823,0xffec308b,0x0006af4b,0x000a7539,0x00103c6b,0xffee88dd,0x000547a7,0xffe49f4e,0xffc99fca,0xffc8dbf6,0xffd1ca84,0xfffb1221,0xffe25598,0xffed986d,0x001da502,0xffe6dec5,0xfff8ffed,0xffecfe5e,0x00282c51,0x0035d512,0x004ab00d,0xffdd7f93, -0xffa4eb30,0xff82b113,0xffb6d55e,0xffbe21ee,0xffa0ce04,0xffccbdaa,0xfff7c435,0x002b3eab,0x00071bb2,0xffd9286f,0xffa25b94,0xff9166c6,0xff8e2d73,0xff990b98,0xffc77a29,0xffe2e2d0,0x0018e9c8,0x0026d943,0x0029ac6d,0x0015cd21,0x00213466,0x0014611b,0xffe7711c,0xfff38d12,0xfff62911, -0x001e710d,0xffe8c61a,0xffeb04c3,0x003e9552,0xfff8ed2e,0xff8c6116,0xff7fe8fe,0xff5411b1,0xff598c58,0xff7cad45,0xff606c92,0xff67e594,0xffa79571,0xffd2f806,0x0011c4af,0x0050d41b,0x00168ceb,0xffcc75e0,0xffab64a6,0xff9b2d46,0xffc13d3e,0xfffcd1e9,0x001759eb,0x0026e79e,0x00395784, -0x004a0fcc,0x002a53a8,0x001cadcf,0xffe858b1,0xffec1224,0x0011e295,0x001d12fd,0x00212893,0xffff3cd0,0xfff33395,0xffd861cc,0xffd88f3e,0x0008f481,0x001740cb,0x00070687,0xffa92768,0x005a509a,0x0037e0b3,0x003e97c0,0xfff812f1,0xffca95f4,0x004e1bb8,0x0076dfe0,0x0039a5e0,0x0002f928, -0xffc097fd,0xff948c88,0xfff741c4,0x003dbf5e,0x005dddcf,0xfff3d32a,0xffae8b61,0xff8ed107,0xffa1b9c4,0xffc49e17,0xffe89abe,0x001241c7,0x000665e6,0xffe14c98,0xffe88569,0xffe92c93,0x000367ac,0xffde2649,0xffd5ff21,0xffe9773f,0x00091b50,0x00130cdb,0xffec997c,0xffa77471,0xff71b707, -0xff857f2d,0x000cbd4d,0xff3c0c7c,0xfe4b708e,0xff40ce0f,0xffa0e630,0xff2d56a0,0xfeff93e0,0xfecd1a6c,0xfe9f59b4,0xffccc518,0x003d8941,0xffd5a0a7,0xff9edf94,0xff6aa98f,0xff6ff817,0xff95763b,0xffd3854d,0x00080571,0x000f4de9,0x0003f1c2,0xffe28796,0xffec0c85,0xfffb5ca4,0x0009b620, -0xffeee6ff,0xffe7a64d,0xffe3678c,0x0001a7fd,0x0010fc7c,0x000645cc,0xffe67a33,0xffdabc5a,0xffe1c7ed,0x001a9ff7,0x0022cd53,0xffb9cf2f,0xffadf628,0x00b2c108,0x00eb4d68,0x005049c7,0xffb25f7e,0xff2d81e4,0xff3f5748,0xff730167,0xffb73af7,0xffb125de,0xffa56c39,0xffabacac,0xffe6fb7e, -0x000a740a,0x001eb0a7,0xfffde1ba,0xffdd86c6,0xffc71f5e,0xffbbbaae,0xffc44a47,0xffcd257f,0xffdc00cb,0xffdad9a2,0xffeb0ba3,0xfff9a0bd,0x00011676,0x00041f17,0xfffa827f,0xfff35544,0xfff6028b,0x00041f2c,0x0004654c,0x0008f1b7,0x000fb4f2,0x000ce807,0x0028a33c,0x00640f89,0xffc689ac, -0xff6a127b,0xfef48644,0xff075549,0xff34a857,0xff72455b,0xff9ed3cb,0xffc00b26,0xfff63e41,0x00116678,0x0009d587,0x0017d428,0x00195e11,0x001cdafb,0x00141a41,0x000b1564,0xfffbe2b3,0xffeff6eb,0xffd55d7f,0xffb8f889,0xffbddb7c,0xffb7b964,0xffc1fec9,0xffd48928,0xffe51c87,0x0000af10, -0xfffafb07,0xfff98299,0xfffd8826,0x0006ee67,0x000d4210,0x00150c44,0xfffc2afd,0xfff6664a,0x00034f87,0xffc2dfd1,0x006cba71,0x0029a019,0x001c4549,0x00236b5f,0x001ee012,0x00150011,0x000b6ca5,0xfff3afe0,0x000ad911,0x000e749b,0x000d6a34,0xfff7c2d7,0xffe4468e,0xffd7b8a4,0xffdcb241, -0xffdd8bec,0xffdb8ea3,0xffdd4a48,0xffe57365,0xffee2c10,0xffeb2e9e,0xffe6c76a,0xffe05f72,0xffd5d11d,0xffd9b976,0xffe3d01c,0xffffb2c8,0x0018f9e8,0x0028ead7,0x00322c3e,0x0034fa1a,0x002fe3c9,0x003a0a02,0x00393a99,0x0041bfb9,0x003403c5,0xffc1ea5c,0xffc0a363,0xffcaee02,0xffd62b52, -0xffe38a06,0xffddf871,0xffd66d1a,0xffcaf9cd,0xffc9daf1,0xffcad681,0xffd1a504,0xffdcc490,0xffe9909f,0xfff5b76a,0xffee113c,0xffe859ae,0xffe3d4cc,0xffdb1017,0xffd0f0f3,0xffc9471c,0xffcc4806,0xffcceea6,0xffcb813d,0xffcea856,0xffd39161,0xffd052e2,0xffda58e9,0xffdaa2b7,0xffe0c170, -0xffe83198,0xffeee377,0xfff33544,0xffe6f6e7,0xffd80aef,0xffd06fb0,0xffcade1e,0xffdf0cd2,0xffbe5afa,0xffc3f111,0xffc13fed,0xffc0ecb0,0xffc225dc,0xffc6e77b,0xffcac12c,0xffd528b9,0xffdd5d41,0xffe2fd0e,0xffe97549,0xffedad93,0xfff3cc31,0xffedca0d,0xffea17a5,0xffe6256f,0xffe301e7, -0xffe3bc9b,0xffdaad7b,0xffdf8276,0xffd2144d,0xffc8c16e,0xffcf7e1b,0xffca585e,0xffbf5024,0xffbc090f,0xffb59094,0xffb7763d,0xffafaaeb,0xffae5f17,0xffaf8c4c,0xffb3051d,0xffbf5e3a,0xffbd8572,0xffbc49a4,0xffbfb828,0xffbf5ff7,0xffc63b51,0xffc64209,0xffc8854d,0xffc9c43a,0xffca0245, -0xffc918a4,0xffcc8143,0xffcf6893,0xffd2f6a7,0xffd5cb3e,0xffd88a03,0xffdc95f4,0xffd9e98c,0xffd88e91,0xffd70fab,0xffd4793e,0xffd347fd,0xffd06156,0xffc8ff56,0xffd70d22,0xfffedaed,0xffc13dbd,0xffd338c5,0x0000c139,0xfffcb90f,0xfff8c6bb,0xfff4c14e,0xfff13574,0xffee5f6d,0xffe91b76, -0xffcc48fa,0xffb881a8,0xfff66807,0xffd23dd8,0xffc58fd3,0x00340a60,0x00181dd6,0x003d2b80,0x002d8860,0x0033938b,0x00304a00,0x0034429f,0x0035bbc2,0x0033ed2a,0x003b950d,0x003c409a,0x0034f8dd,0x0038a5f0,0x0039d34a,0x003f1f52,0x003c5176,0x003a2de8,0x0035f3b1,0x00330f37,0x002ac65f, -0x00388545,0x0014c975,0xffed9001,0xffb3492b,0x002a2abc,0xfff61d17,0xffb3f05e,0xffb63927,0xffb48f44,0xffb38425,0xffb1098a,0xffb2c90e,0xffbfdd0f,0xfff0f9a4,0x002a93b2,0xffbc92fa,0xffeb0237,0xffdd57ec,0x003fc205,0x003d25fc,0x0040a526,0x003c1dfb,0x0042a554,0x0045f0a3,0x0040cfec, -0x0051f252,0x00508013,0x003e3ae7,0x0047a8dd,0x0051d8b7,0x0063ddbb,0x0061f76e,0x0059f1be,0x0049ddb8,0x00387059,0x002b8449,0x00246738,0xffd1477f,0x0014eb44,0x0023603f,0x001c056c,0x0014b7b4,0x001abcbd,0x001f1f70,0x001bb73b,0xffff3f05,0x000b5776,0x001059cc,0x0018436f,0x000f5db5, -0x0000793a,0x001fe0b3,0x002bba2b,0x00089717,0x00287ddf,0x00425874,0x0043bc4d,0x003f157c,0x004d8919,0x0057589e,0x004b770b,0x00761ce0,0x007837c9,0x00561150,0x0063d58d,0x006839b3,0x0087cbc1,0x007ef2f0,0x00724e83,0x005756ab,0x003c45f1,0x00317999,0x0007bbfb,0xfff5d99a,0x000b1574, -0x0023f2bd,0x002bb9ed,0x001812e7,0x000fa91d,0x000342ea,0x0006910a,0xffd48f89,0xffd9413b,0xffd4e73e,0x000f0b4c,0xffefaeb4,0x00001626,0x0029ece6,0x00153d1e,0x000aea7c,0x003b4bdf,0x005abcef,0x0061969b,0x005cf16a,0x006c16c6,0x00737ffd,0x005cd396,0x008ecaf2,0x00893608,0x00532594, -0x006a58be,0x009671d6,0x00d93c04,0x00da049c,0x00b675f5,0x007aafa7,0x003db58e,0x0014492c,0xffe48387,0xffc65bd9,0x0008dee5,0x0022cb09,0x0041ba1d,0x0038f6ed,0x001d2fbe,0x0025d447,0x000aa49f,0xffdcbc62,0xffe746d1,0xffef3b24,0x0015e578,0xffe9e118,0xfff70513,0x004ab7ee,0x0026f83f, -0xffa57fab,0x0005610d,0xffff625f,0x0007001f,0x00197284,0x0023b38d,0x0039d0c3,0x008575a3,0x00998469,0x00bda8fd,0x00e2f774,0x00a8ccaf,0x003f42d6,0xffd53489,0xffc9b7cd,0xfff067dc,0x004ce0e1,0x0076aca8,0x00a7922b,0x0092b21d,0x004f7612,0x00510201,0x00274075,0xffefefe9,0xffec674a, -0x001820df,0x00163930,0x001832a8,0xffff518e,0xfffe2ba8,0xffea1100,0xfff17f4f,0x001d9774,0x001f95b9,0x00083671,0xffc0c18d,0x008c76f0,0x0083ff0a,0x005b77f4,0x000928a3,0xffb4dd7f,0x0071b049,0x00a49407,0x005162af,0x002db545,0xffe2df8f,0xff99d425,0xffe57ae7,0x00345a21,0x0089ca13, -0x00572718,0x0048182e,0x00656519,0x0034c823,0x00331fe6,0x001b27bf,0x0012a7e8,0x00123129,0xfff0ddd0,0x000020b4,0xfffa2da6,0x0003738f,0xffe04dc8,0xffdd7dc6,0xfff09da4,0x000b5b88,0x000e76bd,0xffece102,0xffa15053,0xff90cc6a,0xffb0a81b,0x005dee22,0xff0c5c22,0xfe6b1416,0xff86700f, -0x002931c6,0x00505db5,0x005f5730,0x005215ff,0x000ee211,0x00af2321,0x00cce38e,0x00679b9f,0x00736a6e,0x00630bc7,0x005cc3a2,0x004b0241,0x00366939,0x0015c71a,0x001c3290,0x002be68b,0x001e1063,0x0019bfb2,0x001bdca3,0x001192a7,0xfffd742d,0xfff0d936,0xffe41af9,0x0009be9e,0x0016d943, -0x00070f56,0xffeca67a,0xffe5ff9e,0xfff72431,0x0016ee56,0x001a76e4,0xffbb8e40,0xff88774f,0x00c387a0,0x00f176ba,0x00d1106d,0x00a10610,0x00c92259,0x00841eb0,0x0056dab7,0x0016f682,0xfff13e04,0xffd875c2,0xffdd13a3,0x001a6b42,0x003f11c0,0x004b75cf,0x0051ff73,0x004e27de,0x00476eec, -0x00286d41,0x000bdaef,0xffec87b1,0xffd5ccf4,0xffee060f,0xffffd7a5,0x0004b7d8,0x00088067,0x000b4be3,0xfffc15e5,0xfff6d59c,0xfffa908e,0x000675a7,0x00079b45,0x00170d80,0x001cd7b8,0x0029a33b,0x0028b166,0x007b7ca4,0xff992e6c,0xffe34bc5,0x00253930,0x002bdfae,0x004a3170,0x006fcbd1, -0x0086f8be,0x008427f6,0x008dabeb,0x009a1767,0x00a495a3,0x008f95c6,0x007cdb0c,0x00738958,0x003e1f2c,0x001890f5,0x0004c878,0xffe986ca,0xffdee0df,0xffd73745,0xffc6ef97,0xffd254db,0xffc6a1ce,0xffdc594a,0xffee49ec,0x00065163,0xfffc1ba1,0xfffd72e9,0x0000dcfb,0x000dd21a,0x0012729a, -0x001ca9a9,0xfffc526a,0xfff5899a,0xffeebb3d,0xffef9824,0x00247c8b,0x006522f3,0x008111e8,0x0070ae83,0x00768efb,0x0075390b,0x007bbe12,0x008a22cd,0x00503835,0x0028d890,0x00160cf1,0x001a7401,0x001a5b75,0x0013aa7e,0x001b69dd,0x001b6dd7,0x000c9725,0x000a53ae,0x0000551f,0xffeb56df, -0xffee94d4,0xfff079f6,0xffeaa1a9,0xffe8b99a,0xffe7dd8e,0xfff096c7,0x001081a6,0x00254c37,0x00331e95,0x003a21ce,0x003acbcb,0x0038748e,0x003b780d,0x00491f9f,0x0047525f,0x005867c4,0xffedda8d,0xfff6dbbf,0x000c3853,0x0013ebf3,0x00237bd4,0x002457fa,0x002390de,0x002854b5,0x00204d9f, -0x00213a09,0x001d9613,0x001549c6,0x000c71f5,0x000398af,0xfffc8472,0xfff4e81c,0xffef989f,0xffeedb86,0xfff322fd,0xffec70c0,0xffda9a16,0xffd61090,0xffd2a71a,0xffd77f61,0xffd467e0,0xffd91da2,0xffd758eb,0xffedeb1d,0xffe8d101,0xfffb772f,0xfffbd4e3,0x000d4879,0x0001534f,0xfff23fa3, -0xffe0ca8d,0xffef37d9,0xffb0b73c,0xffdb7bfd,0xffe2d19e,0xffead98f,0xfff3b259,0xffff5ac8,0x000c209d,0x0017c677,0x00101897,0x00077d29,0x00004cb6,0xfff9ecdc,0xfff4b2e9,0xfff07f1b,0xffee61fc,0xffec4f0d,0xffe96f11,0xffe6f211,0xffe1f0aa,0xffe61dd2,0xffd94dc4,0xffe91e9b,0xffea600f, -0xffdfecb8,0xffde0edc,0xffe75780,0xffe5f221,0xffe1cb23,0xffd36b15,0xffd782d0,0xffd15f63,0xffc467a9,0xffc9b325,0xffc4075f,0xffca3ddb,0xffd7da61,0xffe39108,0xfff1e67a,0xffee8e51,0xfff4f283,0xfff83c4f,0xfffb4f28,0xfffd735c,0x0002e3af,0xffff8d19,0xffff33b7,0xfffe1a7e,0xfffce7fb, -0xfffb3a74,0xfff8c3db,0xfff7a69b,0xfff64636,0xfff4cb7f,0xfff3e8db,0xfff0e420,0xfff20bf4,0xffeafcc5,0xffd5739b,0xffb12ece,0xfff1b930,0xffd5da6b,0xffab4e43,0xffaa417f,0xffab17c2,0xffae954e,0xffac3f34,0xffacece4,0xffac9bdc,0xffcd78f9,0xffeb6f70,0xffab0622,0xffca1760,0xfff8e775, -0xffe38528,0x0009f80a,0xffd0db0b,0xffeb5540,0xffe8eec0,0xffef330b,0xffe418b6,0xffe03b1e,0xffdb8fbf,0xffe3c184,0xffe59128,0xffe101ef,0xffe62610,0xffe7fd22,0xffec7444,0xffe8a32c,0xffe68fc7,0xffe397e5,0xffe0e25d,0xffe45033,0xffd0d03a,0x000a64e8,0x003228a6,0x005bc740,0x00012625, -0x00312a33,0x0050e22e,0x00539f08,0x0050366d,0x00416081,0x0048ae51,0x004af671,0x0051ae54,0x0027e62d,0xfff2829e,0x005b9b2e,0x0036bca6,0x003d620b,0xffdf1a0d,0xfff1f354,0xfffce575,0x000719ce,0xffed77cb,0xffe1ed3b,0xffd4ae81,0xffe26141,0xffe22703,0xffd5c2ed,0xffe1faf8,0xffeb3924, -0xfff962b3,0xfff3db47,0xffed618c,0xffe0e7f4,0xffda3ed9,0xffd008f9,0xffd4378c,0x00285ceb,0xfff625a1,0x000da249,0x00127732,0x0016587a,0xfff6cf80,0xfff2b9c8,0xffea3150,0xffeeb04b,0xffd63eb8,0xffd511ce,0xffff5147,0xffe96b9e,0x0004a040,0x00202892,0xffea947f,0x000390a8,0xffe0a18d, -0xffec8e88,0x0006d1ea,0x00178a19,0xffeef094,0xffda79e8,0xffba119a,0xffe0d553,0xffe8aa9a,0xffd47287,0xffeb73a4,0xfff2c612,0x000da52a,0xfffc8dd3,0xfff174f5,0xffdb2bd9,0xffd42980,0xffc08aca,0xffdd0a86,0xfffe1de2,0x0002c815,0x001af42f,0x00147c39,0x0021d28b,0xfff2e2d1,0x000b9861, -0xffd734a2,0xffd91790,0xffbe5fe4,0xffd97da3,0x0000ae06,0xffeae84d,0xfff6c5f7,0x00336655,0xfff75194,0x000cee05,0xffee6550,0x00148731,0x003f33f7,0x005a2985,0x001fcede,0xfffab662,0xffbea780,0xffe3fcc9,0xffdc8326,0xffb888e7,0xffd7967c,0xfffe8ebb,0x0033eae1,0x0028abd6,0x000a766f, -0xffdca9cf,0xffc20132,0xffa24a08,0xffb1959f,0xffe79d94,0xffe87304,0x00390dc4,0x002cd0e9,0x0026182e,0x000dfed0,0x0016190b,0x0006947b,0xffc7ddca,0xffd6761f,0xffd76e43,0x0008b434,0xffd3cbc2,0xffe76131,0x004383e7,0xfff8eb92,0xffcabb7e,0xffa6ca18,0xff62a8cb,0xff790fd4,0xff96f38b, -0xff80f1c9,0xff823f4b,0xffa3d88c,0xffd15a6b,0x000ec2b6,0x003bfd8b,0x002c78f9,0xffe5f368,0xff9f33a6,0xff91484e,0xffa9e790,0xffc8b8b1,0xfffd6972,0x00139499,0x005176f7,0x006b9e58,0x001fbcf7,0x000de66b,0xffd9a3ac,0xffe59309,0x001f3acb,0x0008b7fb,0x00072fbc,0xfff92935,0xfff98d28, -0xffef4729,0x00006770,0x001cf672,0x00265f7e,0x000a9df0,0xffd0a02e,0x009439af,0x0030ca7a,0xfff9b2bc,0xffced891,0xffa08883,0x004aff95,0x008655c0,0x0054a7de,0x00197e38,0xffc21c27,0xff7680f6,0xffd43d12,0x0023d4c9,0x0067f384,0x0012b673,0xffd8c649,0xffbf81af,0xffc7b950,0xffd310f7, -0x000ddfca,0x0029f131,0x00172a17,0xfff260dc,0xffee28e5,0xffe51239,0xfff8d80d,0xffde43ab,0xffe1eb5e,0xfff1a5b5,0x00008802,0x00014aaa,0xffd78f1f,0xff99871f,0xff767237,0xffb3842f,0x003b6bed,0xfef6b252,0xfe650294,0xff93475f,0x0000782c,0xff848174,0xff779f9e,0xff423b4c,0xfeff6694, -0xff99f077,0xfff630b5,0xffe7cb22,0xff9f9ba4,0xff706e35,0xff7b9cd1,0xff8e2fa5,0xffc1f72e,0xfff52500,0x000416f1,0xfff7230b,0xfffc8725,0x0008115a,0x00025c34,0x000b240f,0xfff171d2,0xffec1277,0xffe1756c,0x0003d95a,0x000ea822,0x00037fe5,0xffeb1e7e,0xffe8d2d1,0x00029f0a,0x000fc99b, -0x00071c2f,0xffd8bad0,0xff61df0a,0x00d2bc1d,0x00dc9876,0x0049e41c,0xffdf94db,0xff809a44,0xff7fa122,0xff9a989b,0xffbb4baa,0xffd19a30,0xffca2b55,0xffc4a029,0xfff5c18e,0x00169cd0,0x00218a58,0x000ee444,0xfff4d261,0xffe6be5f,0xffd325a0,0xffcd86b8,0xffdd74f2,0xfff39e41,0xffef7c3e, -0xfffe0db1,0x00032de4,0x0003ae29,0x000708be,0xfff81ae5,0xfff49813,0xfffa3fcd,0x0001c059,0x00009c05,0x000991e2,0x0023b061,0x001ae2c8,0x002b5611,0x007eaae0,0xffea2437,0xffbdebbd,0xff64e69e,0xff74fc54,0xff7dc96e,0xffa9aba8,0xffc0edaa,0xffd24a77,0x000554d2,0x0025ed31,0x002d38a5, -0x0036e874,0x00313b75,0x002ee808,0x001cdf40,0x000aa834,0xfff423f0,0xffe55b09,0xffc9ab4f,0xffb85817,0xffc933ba,0xffbbc20e,0xffc16781,0xffddd0df,0xffeb0d86,0xfffac059,0xfff7efbf,0xfff1f5b0,0xfff995c2,0xfffc09dd,0x000aab7d,0x001b7624,0xfffb1c69,0xfff7e966,0x00043af4,0xffdb0d64, -0x0077b61c,0x003b0383,0x00117ed2,0x001c28b6,0x0017a418,0x0014a7ad,0x00137703,0x000ecfb1,0x001c27ad,0x001a36aa,0x0016b5c5,0x0008a652,0xfffd231f,0xffef5468,0xfff0353a,0xffea2205,0xffdaac61,0xffdcc1c1,0xffe43572,0xfff501a2,0xfff19cf0,0xffec860f,0xffece714,0xffdff80c,0xffe32e46, -0xfff2011c,0x000d7aad,0x00238720,0x0023c92f,0x0029d871,0x0027f90d,0x00226537,0x002b15bd,0x002ea92a,0x003c9170,0x00384edc,0xffeff17a,0xffdfc72c,0xffde5c3a,0xffe8cda0,0xffe94664,0xffe5bbbc,0xffdf6738,0xffd7e0ad,0xffdb6c33,0xffe1404c,0xffeb8441,0xffecb6e4,0xffefa047,0xfff4af9a, -0xffea3ed7,0xffe21e94,0xffd92e74,0xffd83780,0xffcd845e,0xffd2ab79,0xffdd49ef,0xffd660a5,0xffd0a679,0xffd403cf,0xffdb9168,0xffd7171c,0xffe62068,0xffe6a200,0xfffb682a,0x0000db9c,0x0011b4d4,0x0018c997,0x0010d68f,0x0008de33,0x0007114e,0xfff889dd,0xffe4261b,0xffc06f84,0xffbfde2c, -0xffbe51e2,0xffbd3b64,0xffbdc30c,0xffbf4141,0xffbf66ca,0xffc55ddb,0xffc9261f,0xffcd05fb,0xffd3baf0,0xffdafa01,0xffe4cfe7,0xffe098c3,0xffdea9c4,0xffdb4319,0xffd944b2,0xffd83984,0xffd1583a,0xffe56ef4,0xffd21ae5,0xffd1e520,0xffd74ae3,0xffd83310,0xffce25ad,0xffc7e60d,0xffc6135f, -0xffca7472,0xffbb3463,0xffb4f970,0xffb88793,0xffb952ed,0xffc516b4,0xffc3fec8,0xffbd2cb0,0xffd949f4,0xffc0d01c,0xffc9641b,0xffc84c26,0xffc8944d,0xffc81af6,0xffc74b90,0xffc5968e,0xffc93e74,0xffcc8ade,0xffcfcfbb,0xffd293ac,0xffd4740b,0xffd79c72,0xffd514a0,0xffd403ea,0xffd2ed34, -0xffd088a9,0xffd04be8,0xffc83ba9,0xffdc7609,0xfff2cd13,0x000bc9f1,0xffd5f7c8,0xfff382a5,0x00100986,0x000de367,0x0009cce7,0x0003dcbd,0x0004f280,0x0002ee80,0xfffde2df,0xffed2d47,0xffd0bd0c,0x000226e3,0xfff062fc,0xffc8b30b,0x001fc002,0xffeb87bc,0x002d38c6,0x001d02bc,0x0020cb70, -0x00203400,0x001d5837,0x001d0e7a,0x001cc2f7,0x00231352,0x00249e65,0x0020bb12,0x0023270e,0x0023f4e2,0x0027524b,0x00271bf9,0x00260c86,0x0023675f,0x001f24d8,0x001953ba,0x0027ef4c,0xffea55d3,0xffd083da,0xffce22e1,0xfffde20c,0xffd4d0b8,0xffc7adeb,0xffc4bac3,0xffc1d3d3,0xffc3a391, -0xffb9c8ae,0xffba8064,0xffc70e07,0xffcf90d1,0xfffe3f6d,0xffd217ca,0xffcadeab,0xffc8f75d,0x0020950c,0x002d151f,0x002a8693,0x002c8d68,0x0021ce2c,0x001f7480,0x001ec306,0x002c9e59,0x002e1768,0x0022d292,0x002a4711,0x0033fa60,0x0041afd0,0x0046b1c9,0x0040aa59,0x0033fb26,0x001f9f01, -0x001a7427,0x000a4191,0xffcaf982,0x000708b1,0x000a8301,0x000c9cbb,0x00036d92,0x0000d899,0x00069a4d,0xfffa7896,0xffe08972,0xffed623f,0xfff9fbd8,0x000255b1,0xfff86ade,0xffed0f6c,0x00065a57,0x001083fe,0xffe2238c,0x00109eb8,0x0038a2ca,0x002fc811,0x00381ff6,0x0023e100,0x001e20b2, -0x001d12c8,0x003c2bdc,0x00450d9c,0x00356d1a,0x003d2f0b,0x00411964,0x0053cb0f,0x0059a1ca,0x0051a891,0x003e752e,0x002121ca,0x001e72e2,0xfff4f442,0xffe1be73,0xfffdeb8a,0x001970cc,0x00196992,0x000572d1,0xfffe9986,0xffef5eee,0xfff86e24,0xffc27081,0xffcf1f0a,0xffc1f295,0xffffdb83, -0xffe09e12,0xffed7456,0x0016149b,0xfff7dba1,0xffe377b4,0x00217f5c,0x0050c986,0x004dddbb,0x005bc742,0x0036cd5a,0x0027f950,0x00209727,0x0041de8b,0x00453ec1,0x002b006b,0x00349786,0x0058856e,0x008c1f3a,0x00a2a8eb,0x008a8e28,0x005c9b5f,0x001f5cca,0x0008ad8e,0xffda94ce,0xffc75882, -0x001380bd,0x002b890c,0x003f5743,0x00350120,0x001c06e6,0x00194974,0xfffc5dc9,0xffd0a337,0xffca8d83,0xffd7c58d,0x00065b56,0xffd79b4e,0xffe1e214,0x0043eaf5,0x0007b6e3,0xff8100c1,0xffe44040,0xfff3b747,0xfff3e876,0x0000cb7e,0xfff513f2,0xfff441fd,0x0016df14,0x005c039a,0x009eb83f, -0x00c480ed,0x00ca479d,0x0072afd6,0xfff2020d,0xffd3d6c9,0xffe28140,0x00365214,0x004b02fa,0x007281f9,0x005be738,0x002c577d,0x0035f2a1,0x0003f7ec,0xffd913c2,0xffdc4771,0x0021ecd3,0x0004092d,0xfffe4b24,0xfff77f5e,0xfffa7b40,0xfff994e8,0x000c73f3,0x00260a37,0x0013221c,0xffee20ad, -0xff9ea500,0x00804c1c,0x0063aa80,0x00481fbf,0xffe3a9d1,0xff903496,0x002c3f74,0x0061e279,0x003b5193,0x002539b4,0xffd97191,0xff7e8aef,0xffbbe0d7,0x000777dd,0x0065ed64,0x004d054a,0x00342830,0x003197b2,0x00074fd0,0x00198e90,0x001c9ed0,0x001535a2,0x00171e65,0xffef8873,0x000693b6, -0xfff8b95b,0xfff7b756,0xffe2cfe1,0xffe98926,0xfff5d558,0x0003d005,0xfffa9d52,0xffd775f9,0xff8d9080,0xff8cef05,0xffc3df7a,0x006cd061,0xfec8d81c,0xfe85c470,0xffbac2a4,0x00389de8,0xfff4e4ce,0x000764b2,0xfff162a8,0xffb80494,0x0035d10e,0x007b4e09,0x00747d9e,0x004648a1,0x001a9081, -0x001096a5,0x0007bc64,0x0006bd02,0x00037b94,0x000ef913,0x002d1af7,0x001aaff0,0x000e4436,0x001579dc,0xfffcf4dc,0xffef891e,0xffed70ea,0xffe2926d,0x0007c1ad,0x00110c2f,0x000327e4,0xfff016ab,0xffef4c83,0x0009b03e,0xfff56a3e,0xfffaa6f2,0xffd351bd,0xff402ee7,0x00c86038,0x00b0dfda, -0x005c3c8b,0x001482ad,0x0027cee2,0xfff57026,0xffed61a9,0x00036627,0xffd99b16,0xffbcaf81,0xffb0fd76,0xffe92fcf,0x00132caa,0x0024faa9,0x002e09ed,0x002b98e8,0x0034d381,0x0016c015,0x0009ffa5,0xfff21b8a,0xffdda5bf,0xfff91ac1,0x000ba04f,0x0008771b,0x00056869,0x000769ef,0xfffc5433, -0xfff472a4,0xfffc64cb,0x000215b5,0x0004f325,0x001ee3f8,0x002c7152,0x002fcbb4,0x002f7a50,0x0094d34f,0xff9599c2,0xffbc486e,0xffe0ca88,0xffde8ecd,0xfff50f04,0x00039db0,0x00196e35,0x002f4d6f,0x00414a47,0x0056788a,0x0052e1f3,0x0051c20c,0x00473b0b,0x003f9968,0x00256fc8,0x000b81c1, -0xfffc2f26,0xffdb584e,0xffd0b204,0xffc89f88,0xffb515ef,0xffc897d0,0xffc54b5d,0xffe2fcb3,0xfff2b27a,0xfffb9796,0xfff5961a,0xfff6471e,0xffefa35f,0xfffac89d,0x00019853,0x000ec8f4,0xffef5903,0xffe8ef90,0xffe08fb0,0xffc8c68f,0x000e7d2f,0x00266d5e,0x0039fad2,0x0035ac53,0x004c6976, -0x005d0b52,0x00704c17,0x007d4609,0x005ba490,0x00403dec,0x00321476,0x002ac9aa,0x001f3e90,0x000c7d1c,0x000aa847,0x00075143,0xffff2739,0x000231b7,0x00001ed5,0xfff35548,0xfff05160,0xffed6732,0xffdc77f0,0xffe2f82b,0xffeca70a,0xfffbbcd5,0x0018dec8,0x00273db8,0x002ec620,0x002bf982, -0x00257dc7,0x0020bc35,0x0022b76f,0x00277cdb,0x0027a7e1,0x002a5801,0xfff25c78,0x00029cdf,0x001905c3,0x00134fd8,0x0016602f,0x000f93b1,0x000d112f,0x00108a5e,0x000db0d8,0x00114a2c,0x0013c1b5,0x000dd5d3,0x0008b032,0x000389cf,0xfffb5fc1,0xfff1f785,0xffea4d41,0xffe8be17,0xffeecc5c, -0xffe375b3,0xffd0c5fe,0xffd3edac,0xffd3eb33,0xffdb6665,0xffd90014,0xffe07ae3,0xffe0e20f,0xfffc0532,0xfff5e07d,0x0011bf54,0x00133f83,0x00281997,0x0019a6c7,0x00098cf2,0xfff85ffb,0xffff8734,0xffb107b5,0xffd12159,0xffd62d13,0xffd8c11f,0xffe04cbc,0xffe8574c,0xffef5fad,0xfff2a87e, -0xfff1a828,0xffef30d1,0xffedaa0e,0xffed269d,0xffec5e38,0xffeb2b49,0xffe9e8a2,0xffe97c6b,0xffe882ac,0xffe666df,0xffe4c0f8,0xffe56544,0xffd100ba,0xffe0c361,0xffda7bb9,0xffd6948e,0xffd0b4c7,0xffd5da22,0xffd8a8e6,0xffd1f13a,0xffc53a96,0xffcdea91,0xffceb525,0xffc374f9,0xffc8801f, -0xffc28d18,0xffc3646a,0xffd2e3bc,0xffce5cb2,0xffecac96,0xffe795a7,0xffeb1ae2,0xffebf5e9,0xffec19c9,0xffecc7f6,0xffef489b,0xfff016e0,0xfff1726b,0xfff220e7,0xfff298cf,0xfff2c6bd,0xfff2f0b5,0xfff195ee,0xfff02941,0xffeed62a,0xffed9a7b,0xffea916d,0xffeef20c,0xffd4b975,0xffc21420, -0xffb98a18,0xffd92f8d,0xffbffb45,0xffb5940c,0xffb35c07,0xffb43c8f,0xffb9309d,0xffb426f6,0xffb449cb,0xffb53278,0xffbfc447,0xffd86ee2,0xffb81f1f,0xffbb806f,0xffed183a,0x0006c6cb,0x002f9bcb,0xfff74e20,0x00088fd4,0x000a7137,0x000e9f00,0x000bb0e2,0x0009deae,0x000447be,0x000a3970, -0x000af33c,0x0006f8bd,0x000a590b,0x000bc9c2,0x000f396a,0x000dab6a,0x000c266c,0x0009dfaf,0x0005b212,0x000430b8,0xfff697f5,0x002f1e68,0x003bc34d,0x00287f8d,0x002ae2ab,0x003d26a2,0x002277a4,0x00276fb3,0x0025aa83,0x001af923,0x002336ff,0x00264bee,0x002e8cea,0x00362364,0x00201130, -0x002bf776,0x003f2481,0x003516b9,0x000afa63,0x000c59cb,0x001c8d34,0x0024d489,0x0021c187,0x001dbc73,0x000d7456,0x0016d4df,0x00136bf3,0x0007fa0c,0x000dcb66,0x00154bdf,0x0021c8ec,0x00251229,0x0022fa0b,0x001913d4,0x000d6cf4,0xfffb0b22,0x0001ae08,0x002519d6,0x0010393e,0x002a7007, -0x0021c75f,0x002196c8,0x00105873,0x000913ee,0x00081ba9,0x000a9df2,0xfff3d4e2,0xffed5e19,0x000e8ef0,0xffff11a2,0x000fe57f,0x002fd082,0x000a3d05,0x001ec270,0x0004b007,0x0008d2b2,0x00294ed5,0x00343c56,0x0034037c,0x002ea546,0x0009a6a0,0x00255a31,0x0026a5d8,0x00177bcc,0x00237a64, -0x00292e6e,0x003e60bd,0x003b649b,0x0034f56a,0x0022922b,0x000d1ba1,0xfff29700,0xfffc6ff8,0x0015d8c8,0x0016c15a,0x0027d7a4,0x00209ce0,0x0026a3bc,0xfffc9677,0x0007686b,0xffdca861,0xffe65fc0,0xffc0ef7a,0xffdc07fb,0x0006bee3,0xfff2fa88,0xffffe897,0x0038b676,0x000e13ad,0x0018667d, -0x000b42ea,0x001d1d70,0x004f50b7,0x006814ad,0x006d7d1e,0x0065f27a,0x00288b6f,0x003cb5b6,0x002d8feb,0x000ce539,0x0017a710,0x00399c97,0x006b53c0,0x007fdb06,0x0071bb14,0x004c0b50,0x001b2690,0xffe48716,0xffdfdfef,0xfffce6b6,0xfffffaeb,0x00458e39,0x00359357,0x00262926,0x000b5208, -0x000a7740,0xfff51786,0xffbd85f9,0xffbf5ba7,0xffc1f1e4,0xfff6e2be,0xffc8f6e8,0xffe7320a,0x003f8274,0x0006de6a,0xfff62040,0xffef56d4,0xffbedb2c,0xffd693ee,0xffd9687a,0xffd72e7d,0xffd82f63,0xffe4be6f,0x0011c307,0x0044b68b,0x005a83fc,0x006ecc5d,0x0025fc68,0xffab080b,0xffa5d6a0, -0xffb0dd9d,0xffc4aee5,0x0003805b,0x00219b03,0x005c02f8,0x005dc7e7,0x0013d4d1,0xfffc63ff,0xffcf8fd2,0xffdfb21e,0x002771ef,0xfffbfe9c,0xfff3c50b,0xfff1bd97,0xfffb5797,0x00045fc7,0x002878fa,0x0033767e,0x003170ae,0x000c648a,0xfff0e1db,0x00b03031,0x003a118b,0xffe12caf,0xffc150f5, -0xff84f648,0x003a79ad,0x007eecd2,0x005cfe62,0x00321262,0xffd34b43,0xff6dc89e,0xffb631f0,0x0005727e,0x00628603,0x00493149,0x003084ca,0x00268aac,0x0011b834,0x00052241,0x0032796a,0x00315ba4,0x0022fa2f,0x0004d982,0x0000882d,0xffeecb36,0xffefe12f,0xffe1ff2b,0xffee1eae,0xfff758ee, -0xffff50fd,0xfff42dfe,0xffc6d3d8,0xff8c7541,0xff86935c,0xffe20751,0x0068ac5d,0xfec5c292,0xfe9e0f62,0xffcaf677,0x0048a902,0x0020455c,0x0038018a,0x000a2c4a,0xffb32a01,0xffbd3382,0xfff9cc6a,0x003fef09,0xfff7465e,0xffcf0ca7,0xffd52c4d,0xffc96729,0xffd694e3,0xffe97301,0xffff7b49, -0xfffff7dd,0x001c9f3a,0x002314d3,0x000e0c8c,0x00062a1a,0xfff3a123,0xfff093ab,0xffe3362f,0x0004d1f8,0x000aec4e,0x00024b9d,0xfff308d2,0xfff583a1,0x00164aa1,0xfff653b0,0xffeb8952,0x0001b95d,0xff2a1132,0x00cf7321,0x0098d9d8,0x004dda81,0x003abd7a,0x0049f7b9,0x00114627,0xfffaec62, -0xffe7e881,0xfffda24c,0xfff3fe96,0xffe71fbf,0x000c17af,0x0028b34d,0x002a9528,0x002f3c50,0x0027d180,0x00256179,0x0008957f,0xfff0ed33,0xfff51648,0x00013d45,0x00053abf,0x001242c1,0x000d58f2,0x00067414,0x00051cbe,0xfff8f749,0xfff73c48,0xfffd3782,0xffffa3a0,0x000097cc,0x0017179d, -0x00321c1d,0x002cfa2c,0x003d013c,0x00962742,0xffeb9a46,0x00130c3a,0x0012d68c,0x0016466b,0x000482fc,0x001a70d4,0x0020e1a9,0x0020eaaf,0x003a9eb0,0x0057b6d0,0x006edb04,0x00688cc0,0x00580e8e,0x004b8d01,0x002c182b,0x000d6f94,0xfff02719,0xffdc3026,0xffc995a6,0xffc75e96,0xffd0fcbb, -0xffc8bcdb,0xffc69331,0xffe793cc,0xfff3bcf2,0xfff828aa,0xfff6e0ac,0xfff05b4b,0xfff42b63,0xfff6853b,0x00085b7f,0x001ce04f,0xfffd632e,0xfff9d129,0xfff5a3b0,0xfff06f3f,0x004a9a4b,0x003ec11b,0x001baf89,0x002537a7,0x002c4164,0x0036c46e,0x0043259a,0x0056d8bb,0x0045a1e1,0x0034729d, -0x002ac851,0x00294b32,0x0027f839,0x001ae452,0x00163934,0x000a110e,0xfff08b91,0xfff0ef67,0xffeeabdc,0xfff445c4,0xfff10088,0xffee2f3d,0xfff290be,0xffecf7b1,0xfff0c5b0,0x00011e72,0x00195e65,0x0027e642,0x001ea6c0,0x0020b153,0x001b78ec,0x00173e6d,0x001c408f,0x00248d3b,0x002f3ccf, -0x00367325,0x001f0e13,0x0010824a,0x000e8c06,0x001369ec,0x000c4471,0x000a3b71,0x00076e54,0x00083d9a,0x000b522f,0x0012402d,0x0018a99a,0x000bbb15,0xffffa38d,0xfff74f4c,0xffedebb0,0xffe5bc64,0xffdbf6c0,0xffe08eff,0xffdbbd52,0xffe54b84,0xffeb2e0a,0xffe0d239,0xffd95b03,0xffdec7dd, -0xffe4a2f4,0xffe438b8,0xfff1b535,0xfffce753,0x0013f3b2,0x001bfd04,0x002d33c2,0x00396799,0x00339cbb,0x00301729,0x002db83d,0x0023aad1,0xffdbf8f1,0xffd44366,0xffd082de,0xffd28be9,0xffd4262b,0xffd6b881,0xffd78f91,0xffd6ca41,0xffd4b319,0xffd1204a,0xffd0947c,0xffd32600,0xffd8cbf8, -0xffe0087f,0xffde3832,0xffdd5b48,0xffdae543,0xffd95993,0xffd5940b,0xffd3ea1b,0xffe4e171,0xffdb434f,0xffe17c39,0xffe01b6a,0xffe3c77b,0xffe0d7b1,0xffdc95af,0xffdeb2e3,0xffdf985c,0xffd4fd14,0xffce25ac,0xffcf2dbb,0xffcfb837,0xffd38165,0xffd4e451,0xffd1d25d,0xfff0eded,0xffd7fafc, -0xffdc31a9,0xffdc4de2,0xffdb6f2d,0xffda95c8,0xffda1765,0xffda1c08,0xffdb6738,0xffdd43f6,0xffde4b8f,0xffdf68cd,0xffdf4182,0xffdfcb26,0xffde0f27,0xffdd4145,0xffdc7294,0xffdb0f3a,0xffdac240,0xffd350f8,0xffeec966,0xfffa01c0,0xfff284b0,0xffed5f81,0xfffce499,0xfff3b97e,0xfff446b3, -0xfff2a18a,0xffefc25c,0xfff372a9,0xfff3a0ce,0xfff202bc,0xfffae87e,0xffee630f,0xffec6f46,0xfff8d40c,0xffdb9ef7,0xfffb9984,0xffda664e,0x00006de0,0xffff6ff8,0xffff71d6,0x0003b1ce,0xfff94f0a,0xfff66f5c,0xfff56c1d,0xfffa2177,0xfffc49e5,0xfffc3e6e,0xfffdb06c,0xfffe5961,0xffffca8e, -0x000133fe,0x0000dc7a,0xffff8d70,0xfffab07c,0xfff9f7ab,0xfffc29f6,0xffdafc19,0xffe2917a,0x0014ce47,0xffe16d33,0xffe1513f,0x000811c0,0x0003c11a,0x00003844,0xffff0d46,0xfff612de,0xfff68f78,0xffff95a2,0xffdb4bcf,0xffdcd54d,0x001335c6,0xffded88a,0xffe84784,0xfff3adca,0x000b11e7, -0x0009c809,0x0014b76d,0xfffa20c5,0xfff05729,0xffed752f,0xfff5fa2c,0xfff91a7a,0xfff6b4a9,0xfffbecb5,0x0003f05b,0x000bccaf,0x0014a8d5,0x00115b60,0x00087a04,0xfff73d2e,0xfff59623,0xffe71795,0xffed87a9,0xfff9a0b8,0xfff9a307,0x0003c6bb,0xfffdddef,0xffea18fe,0xffed0a33,0xffdd7a15, -0xffd37941,0xffd1a47e,0xffdd251a,0xffefa0e9,0xffe3c438,0xffe91e37,0xfffae87a,0xfff0547c,0xffd86a2d,0xfff17208,0x0015c263,0x001398cf,0x0029ce74,0xfff7eaf6,0xffe1d7bb,0xffdc185d,0xffee101b,0xfffb04bf,0xfffff32d,0x00046c3c,0x0008af5a,0x000ebf26,0x001c00c7,0x0018328b,0x000bbc8d, -0xfff3d815,0xfff03091,0xffe142e3,0xffe21857,0xfff88eba,0x000d9e40,0x0008415e,0x0000eec2,0xffea4484,0xffe897f3,0xffdfa892,0xffc3513d,0xffc21f69,0xffbe511e,0xfff1aeb7,0xffdbf5d0,0xffe52814,0x000d39c2,0xffe5c4c1,0xffd9fe47,0xfffd8a2d,0x002e0142,0x00372566,0x005bb110,0x000f67c4, -0xffe91e57,0xffd88f4f,0xffe58c97,0xffecabf4,0xfff041ca,0xfff1bf37,0x000c9681,0x002af225,0x004bd3fc,0x003ffd77,0x00220bef,0xfff12eb9,0xffe4c554,0xffd0860e,0xffe143af,0x001123d0,0x003294c4,0x003299c6,0x0027c042,0x0010bc4d,0x000517bf,0xffed4328,0xffcae733,0xffb3bcba,0xffbf87fe, -0xfff3b954,0xffc6b1cc,0xffd3f7fd,0x00320cb2,0xffeb0fe1,0xff9a34ef,0xffc42c3e,0xffd0b6d3,0xffce566e,0xffc83704,0xffaf49a1,0xff9cfdea,0xff95b7ad,0xfff55075,0x00466554,0x00672702,0x009e0e2c,0x00627c8d,0xffe32d7e,0xffc4e926,0xffbf70d3,0xffeb0b71,0xfffa2f37,0x000cbba6,0x000f5acb, -0x000eb4da,0x0002ab96,0xffe07817,0xffc38e40,0xffd2c719,0x00287ef6,0xfff76fe9,0xffebaffd,0xffeeaaa4,0xfff3bf8e,0x0006d9fe,0x002bca22,0x00316acc,0x00179060,0xffeaff00,0xffacab13,0x0072829b,0x0029d562,0x0011b3c0,0xffbedcaf,0xff7e4d05,0xffee3b53,0x00276d8a,0x002d7cef,0x001deb57, -0xffd24b47,0xff6e10f3,0xffa05d4b,0xffe33ba7,0x0034c7be,0x00364e23,0x00163e39,0xffed2b10,0xffdb987a,0xfff536c1,0x001e7d92,0x001eba87,0x001b9e02,0xfff76746,0x0008bd27,0xfff53a8e,0xffeaa34c,0xffe5c696,0xfff39d20,0xfff904ea,0x00011516,0xffed5c91,0xffbfee45,0xff7d7f0c,0xff844ae5, -0xffd9f046,0x00602ae7,0xfeb36860,0xfeb24d1c,0xffc50d5c,0x0018e280,0xffaef063,0xffa9ee53,0xff77b299,0xff433c78,0xff8ccfe0,0xfff86750,0x005eb775,0xfff20518,0xffad255a,0xffa4413d,0xffa92cd4,0xffc4004e,0xffe6b44e,0xfffb79bc,0x0013b500,0x00087a86,0x000243ab,0x00051f82,0xffece046, -0xffe30b31,0xffe9a5b5,0xffe45027,0x0002aba2,0x00087188,0x0000d70e,0xfff4999a,0xfff57009,0x000f41fc,0xffd8dc12,0xffdfbd99,0xfffda4a8,0xff19f1b0,0x00b381c7,0x0054b40d,0xffea213a,0xffa36cf5,0xff9a7c10,0xff7a7c43,0xff917ce1,0xffe08a0d,0xffcfd90a,0xffbb64e1,0xffa842b3,0xffced1d5, -0xfff32e82,0x00018de3,0x0006e0ee,0x0003ada5,0x000f1077,0xfff7b578,0xfff866ee,0xfff42925,0xfff42f5a,0x00045cae,0x00138561,0x000babf3,0x0001e202,0xfffeda69,0xfffb7319,0xfff5d302,0xffff1f76,0xffff9529,0x00039bac,0x0023e80e,0x0031dffa,0x002b7356,0x00450252,0x009d747a,0xffbd647c, -0xffb2423e,0xff9c1681,0xff93bff8,0xff95a921,0xff9b00be,0xffaf8ce7,0xffd37ecc,0xfff1811f,0x001006f0,0x000c1cdf,0x001aeba4,0x00185f56,0x0011eb51,0x000f4858,0x0000a6ed,0xffef4e0a,0xffd46d22,0xffc6867b,0xffbd5007,0xffb33b27,0xffc03eb8,0xffc8d2a9,0xffe9630c,0xfff61fcd,0xfff32e08, -0xfff2635e,0xffef8e26,0xffe676a9,0xffedc63b,0xfff7f8a4,0x0006759e,0xffef7330,0xffe91361,0xffdf234b,0xffb5e216,0x00125b1b,0xffee411f,0xffe517fa,0xfff401cb,0x00115fca,0x002fe10a,0x004749f7,0x004d9660,0x005240d7,0x004cfbaa,0x00496c96,0x003780da,0x00241243,0x000a8c82,0xffffee0a, -0xfff6257a,0xffedbffe,0xfff2d78c,0xfff5c1ee,0xfff5c657,0xffed6fd3,0xffe778ff,0xffd8dd4a,0xffe20b24,0xfff1dc6f,0x00047fad,0x0019d572,0x002208bf,0x001eba71,0x001863bb,0x000fc7fe,0x000993f1,0x000d581d,0x000a1722,0x000f2637,0x0001fd85,0x00050ab2,0x000fdaef,0x001cc5c2,0x0012490c, -0x0009ae46,0xfffd473a,0xfff829b4,0xfff6cbcf,0xfff9ac01,0xfffe62cc,0x0005f621,0x0000b342,0xfffda28b,0xfffb0ecc,0xfff3556c,0xffeb032e,0xffe2b8d9,0xffe0a3aa,0xffe1e77d,0xffda031f,0xffd30cc2,0xffd7e7a7,0xffd82edf,0xffe1bf7b,0xffe4c687,0xffeb9587,0xfff3929f,0x00086a5f,0x000d90e3, -0x0023d2fb,0x002a55ac,0x0039e4c0,0x002e152b,0x00235de4,0x001a4dab,0x0015437f,0xffce7533,0xffcdde69,0xffcdfc6c,0xffcafd47,0xffcdfdf8,0xffcf64bf,0xffceadcb,0xffc9b922,0xffcf5b82,0xffd3583c,0xffd7fff5,0xffdde1fd,0xffe32461,0xffe77f9e,0xffe617a3,0xffe5f6fc,0xffe5a575,0xffe3cda3, -0xffe48fea,0xffdfcceb,0xffd40b2c,0xffd71c26,0xffcdcd18,0xffd1122b,0xffca7ba0,0xffc644a9,0xffcac20c,0xffc657a4,0xffc39d36,0xffc8f831,0xffceb6e1,0xffcd1a0d,0xffcfcd1f,0xffcf728c,0xffcba855,0xffd32ebc,0xffc838e6,0xffdd61ba,0xffdb8957,0xffdaccb0,0xffd94037,0xffd72903,0xffd66c2b, -0xffd54191,0xffd95664,0xffdbd219,0xffddea4b,0xffdff6f5,0xffe1b6d3,0xffe47941,0xffe2dc93,0xffe1cfbf,0xffe0e154,0xffdf5d3c,0xffddbf56,0xffe06564,0xffc9c2cb,0xffc7b43c,0xffdd2828,0xffc7d986,0xffc42894,0xffdca138,0xffdb0ca7,0xffdaf5a1,0xffdd952c,0xffda1ea2,0xffd9c4e7,0xffdabd4f, -0xffcbc8f6,0xffcd4925,0xffdf6e6f,0xffc92206,0xffd7b149,0x00268399,0x002f01a2,0x0024c07d,0x0022d5f1,0x00282252,0x0029717a,0x002c359e,0x002c42bc,0x0027c331,0x002b266d,0x002b741d,0x0029b448,0x002a87be,0x002b38d3,0x002cfb07,0x002e739c,0x002dc4c4,0x002c0bc5,0x0026e457,0x00209eca, -0x0021722e,0x002d454f,0x0019991d,0xffe40131,0x003447fa,0x001d0a4a,0xffe13ee3,0xffe4db33,0xffe407d4,0xffe1c2c9,0xffe3852d,0xffe61ac4,0xffef8ea2,0x00190a88,0x003105d5,0xffe983e0,0x00191941,0x0007ef55,0x002f913c,0x0027e7f3,0x0034874b,0x003a4720,0x0044abe3,0x0045f369,0x0038b836, -0x003e76eb,0x003b57d3,0x003540ba,0x00351c99,0x003b1fef,0x0043f4ec,0x005016db,0x0050b41e,0x0048a609,0x00373399,0x00251a1d,0x0024d301,0x0003fe55,0x001f12db,0x002e807c,0x00225ff9,0x001bf21b,0x00188a15,0x0014ca83,0x0015bf49,0x000e1105,0x0005b7f7,0x0001ff7f,0x000fe768,0x000b0324, -0x000a24ce,0x0024dcc7,0x0020ef8d,0x001d2991,0x0023966e,0x002c2bc7,0x004130df,0x0048bad0,0x005d4911,0x00619676,0x0045ae00,0x00546f99,0x00546f5e,0x0051fa7f,0x0050faa6,0x005471fa,0x005e82e2,0x006cef80,0x006abd81,0x005ca876,0x003adc01,0x00255050,0x000ff63c,0x0013f802,0x001b0e9a, -0x0024123c,0x00227abe,0x001a8dd7,0xfffe41f4,0xfff84427,0xffe81722,0xffe3ea7a,0xffc886fe,0xffd4d0a0,0x00020b4a,0xfff38c26,0x00004e27,0x00270c09,0x00165570,0x000da661,0x002607d3,0x002e47cb,0x0052cd76,0x006ab7c6,0x008dd3ca,0x009672bb,0x006b7c7f,0x00715d0a,0x0066bcf5,0x005943c6, -0x0050bb45,0x006b45f0,0x009020c4,0x00c01529,0x00bec387,0x00a11b8f,0x005f023d,0x0027f6ea,0x00086dc7,0x00030ee7,0x001be79a,0x003cca7a,0x0039e813,0x0026cda8,0x00087ba1,0xfffdc6a3,0xffe4186e,0xffc47f72,0xffae19b2,0xffb4fce5,0xffe6c614,0xffc624e0,0xffe4c70b,0x002e4d8f,0x000e13bc, -0xffffae65,0x00292301,0x002c85e0,0x003473c8,0x0012c3bc,0x0021f55a,0x00206260,0x001af09d,0x004dfa25,0x00792701,0x007f62d8,0x00adb8a4,0x0068bfa7,0xffcacdf2,0xffc5cafc,0xffc287ee,0xffd9420c,0x000c1a81,0x002afcdb,0x003bb1bd,0x0021eacc,0x0000df52,0xffe57d7d,0xffc88bfe,0xffd9ff0e, -0x002aba7b,0xfff58ad5,0xffe99006,0xffedd457,0xfff9da94,0x0014cd0a,0x0047c200,0x00463cdf,0x0033fb81,0x000804ce,0xfffd1301,0x009d1fa0,0x003e6b11,0xffed4fe8,0xffc37a41,0xff7d1449,0x000f4457,0x005335bb,0x004cf731,0x00409121,0xffebdf4d,0xff786791,0xff9e5d35,0xffe207cd,0x004497aa, -0x006f5352,0x0079dd1c,0x0076baf5,0x004a288c,0x0036a3e1,0x0047d4eb,0x002af2e9,0x0025a997,0x000fdd6c,0x00148e05,0xfffd4150,0xffe854a3,0xffe7936f,0xfff8374a,0xfffb2986,0x000347fb,0xffecf296,0xffbab38a,0xff7be63c,0xff959dfc,0x0003643b,0x007ed070,0xfebe6552,0xfee70888,0xffd877e5, -0x0054ef17,0x009a9a66,0x00b182df,0x00850a86,0x002d59a0,0xffe983b7,0x00154bf1,0x009a7c66,0x00562fd3,0x002ed152,0x00244536,0x0005504e,0xffef0fbd,0xffe12b31,0xfffb1ee9,0x000de783,0x0025ce07,0x0026e6b7,0x00119fd0,0xfff88b3b,0xffef6cd0,0xfff0937f,0xffe82848,0x0003c18d,0x00068b3a, -0x0000bdfe,0xfff9e548,0xfffb087a,0x0014f7ac,0xffdb164a,0xffdab533,0x0016b300,0xff19b110,0x00a861f7,0x0039eab6,0x0043dc44,0x006fb60e,0x00db9e85,0x007fbe3e,0x0047d488,0x00106e5f,0x00121c10,0x00036e4d,0xfff7f7ce,0x000ecf24,0x0026f636,0x00246430,0x003ffef8,0x004e8eeb,0x0056a35f, -0x003708c9,0x0018cc89,0x00090e44,0x0004dcff,0x0014d4fb,0x00206a20,0x0013fdf3,0x0006ddc1,0xfffee241,0xfffaae20,0xfffa1fb4,0x00007f7d,0x00006498,0x0004c30f,0x0027d451,0x0032843a,0x0034fa5f,0x00536c44,0x009e5a56,0xffd7d47e,0x00371b4f,0x00838b20,0x007672a8,0x0058179c,0x005a06d6, -0x005ad54f,0x00559f4d,0x00590ee4,0x006ecae2,0x008974cb,0x007b2540,0x00683f5e,0x005637e5,0x0030b049,0x000c412e,0xffeecfaa,0xffd6684d,0xffcf554c,0xffd5ce12,0xffcecc95,0xffd52d7e,0xffd196f3,0xfff03a87,0xfffc425e,0xfff8a77d,0xfff633f8,0xfff1600d,0xffeea0b3,0xfff4caab,0x0002b799, -0x00136817,0xfffe4545,0xfff807d8,0xffe148cb,0xfff12282,0x00025ef2,0x00225e06,0x0018fd87,0x00211a26,0x003a0e74,0x005741d4,0x00703f51,0x008ffd34,0x006b66c9,0x00532ad3,0x00488869,0x004c32fd,0x004c8671,0x003d26d2,0x0034fa34,0x0025f868,0x000a35ce,0x0008a968,0xfffbb9d6,0xffee8def, -0xffeb7ff5,0xffebb2e6,0xffeea165,0xfff64106,0xfffd7462,0x000cec48,0x001ee8d7,0x002403d3,0x0018437e,0x00170a0c,0x00112235,0x000dcf95,0x000f39b5,0x0017a002,0x001a0578,0x0022f31e,0x003b5e7a,0x003acece,0x004054e6,0x003d0bed,0x00343914,0x002fc5e0,0x002f1485,0x0035c431,0x00353f97, -0x00391ac1,0x00390edf,0x002323d7,0x000dd7a6,0xfffaf122,0xfff475d5,0xffed7412,0xffe59a89,0xffeb1687,0xffee72da,0xfff34325,0xffee397b,0xffe7216a,0xffe1978d,0xffeb5e70,0xffeee1d8,0xfff6780e,0xfffdb736,0x0014e717,0x0022cab5,0x002fb440,0x0038ee21,0x00487826,0x00438eb2,0x00416687, -0x003bc6e8,0x003c8379,0xffd13aa6,0xffea060d,0xffe73bd2,0xffebcf93,0xfff12e6b,0xfff6201c,0xfff7e25f,0xfff7bfd6,0xfff00616,0xffe7ef4a,0xffe402b3,0xffe1da1f,0xffe33a48,0xffe4810e,0xffe4cf19,0xffe481aa,0xffe35b7d,0xffe1e16f,0xffdd1255,0xffdf7d3a,0xffdee26d,0xffe5406a,0xffea75b8, -0xffe2a7d8,0xffe39bf6,0xffe76b2a,0xffe949d8,0xffecc6f8,0xffe8f471,0xffeb4721,0xffe9b283,0xffe7b17b,0xffe8c125,0xffe333e6,0xffe5f155,0xffeb119c,0xfff82757,0xfff462c5,0xfff1d857,0xfff39884,0xfff26b49,0xfff20349,0xfff26893,0xfff494a8,0xfff32b3e,0xfff2f00b,0xfff178c9,0xfff0b259, -0xffeeed94,0xffed116d,0xffec697e,0xffebd468,0xffeb3bd5,0xffeaed14,0xffe9e5d4,0xffe80fb0,0xfff2f3c3,0xffeadc8a,0xffcc8681,0xfff65eda,0xffec7a41,0xffc8aff8,0xffcb743c,0xffcd51f1,0xffd02313,0xffd3494a,0xffd59b24,0xffd87f0c,0xfff22205,0xfffe5f50,0xffce5eb0,0xffebbd3b,0xfff05c75, -0xffe70f08,0xffef0f2d,0xffdf63aa,0xffee9afd,0xffecacda,0xfff44dd0,0xffe8393b,0xffe40376,0xffe04808,0xffe37367,0xffe57f81,0xffe84706,0xffe8d3de,0xffe978c8,0xffe9a470,0xffeba7c9,0xffeb88a3,0xffead04b,0xffe6265c,0xffe8a670,0xffdceb46,0xfff00319,0x000f30e3,0x0048ddc5,0xffe908ab, -0x000ade1b,0x003ae94c,0x00398665,0x00366507,0x003031cc,0x002e8152,0x002fc39e,0x0034665b,0x0004e692,0xffdfdb8b,0x0044fd22,0x000fcf7d,0x001a14a4,0xffde2713,0xfff2a85b,0xfff8d3c6,0x000983b8,0xffef20bc,0xffe24177,0xffd786f6,0xffdb255a,0xffdda196,0xffe248f9,0xffe409e0,0xffe9a2aa, -0xffecfd81,0xfff78a50,0xfff76595,0xfff16ea5,0xffe5ed2e,0xffe15257,0xffdc1359,0x001b1f97,0xfff9bf61,0xfffd6be7,0x000751f5,0x0005ae79,0xffe66bef,0xffe52635,0xffda297e,0xffdfd497,0xffcdca97,0xffd0c739,0xffea62bb,0xffe0fe4c,0xfff517d2,0x0000da5b,0xffe43d75,0xffef6177,0xffe6a507, -0xfff81e29,0x00071050,0x00232fe6,0xfff32591,0xffd8a5aa,0xffc15deb,0xffc91935,0xffd4820a,0xffe86ee2,0xffe9d813,0xffee71a5,0xffed227e,0xfffb776e,0xfffa841f,0xfff18a59,0xffdfe772,0xffd42e53,0xffe0b26b,0xfff74480,0x00000cb6,0x00086553,0x0002c0f1,0x00098636,0xffde5113,0xffed5aa0, -0xffcc8096,0xffd12c11,0xffba8999,0xffc9276a,0xffe9417d,0xffe47736,0xffebea07,0x000f0109,0xffeabbc1,0xffec0a94,0xffe90fe1,0x0007c7ec,0x00297abf,0x005c4392,0x0019a8c9,0xffee7a13,0xffc41dd5,0xffc1bb0a,0xffc626be,0xffdd7ac9,0xffd873c0,0xffeb4cfb,0xfffa57e7,0x001f01a8,0x001ebbf2, -0x000cceb8,0xffe8d62e,0xffd727c7,0xffdb9e40,0x0007558c,0x000c970b,0x00349553,0x0025ab1d,0x0019e4f0,0xfffe1647,0xfff084a3,0xffdfe704,0xffc85457,0xffa563fd,0xffab6414,0xffddd203,0xffbdae38,0xffd389ca,0x0019737c,0xffe072aa,0xffe81986,0xffd08a64,0xffd0d34d,0xffcdbd0d,0xffa96eff, -0xff9a1a8c,0xff834afa,0xff5dba1f,0xffb3bb8d,0xfff994f9,0x000f344a,0x005c4105,0x0039a673,0xffc42178,0xffb03349,0xff9dedd0,0xff984c2f,0xffb3b21d,0xffb61fea,0xffd49aa6,0xfffa0e1c,0xffd2904c,0xffc7c165,0xffb9396f,0xffd30394,0x002b0040,0xfff166d0,0xffe53d9d,0xffed52b3,0xfff387d7, -0x00156b4e,0x004b4903,0x00424545,0x002bc1a7,0xfffe0939,0xffe7903e,0x0067c61a,0xfff94062,0xffd3752c,0xffa85d03,0xff7f82c5,0xffca7786,0x0008aaca,0x002f6b34,0x00260879,0xffdcfdf2,0xff72c9e0,0xff933c8d,0xffc9a405,0x000b7d88,0x002b4548,0x00171368,0xffdd2d58,0xffdfe28a,0xffedc5e4, -0x002bdc06,0x002aacf7,0x001f1aa4,0x00074436,0x000aef4b,0xfff41244,0xffe1711b,0xffe93c2c,0xfffb3bce,0xfffc21c6,0x00018b1e,0xffe6f3d9,0xffae9643,0xff7133cd,0xff82aade,0xfff82c31,0x004d7833,0xfed4a742,0xfefa565e,0xffbcc577,0xfff93cf1,0xffce7a0b,0xffaf02e8,0xff6145e6,0xff1edee4, -0xff2009a0,0xff907cf0,0x00469dc9,0xffc51b2a,0xff7c21fd,0xff6f6df8,0xff77bdbf,0xff9b83fe,0xffcd44e0,0xffe9a56e,0xfff18310,0xfff4b677,0xfffda7dd,0xfff5d946,0xffe66e25,0xffdd45eb,0xffe7ff4f,0xffe9a86b,0xffff99af,0x000320f3,0x00003a30,0xfffa31bf,0xfff8fa84,0x00084433,0xffcee803, -0xffd482a7,0x001785a5,0xff1f9dfe,0x008abfbf,0x0004bf93,0xffc06264,0xffa0a441,0xff954183,0xff82e8fd,0xff971e13,0xffcbc6ea,0xffde5636,0xffd651eb,0xffc92c3d,0xffd577d4,0xffec905a,0xfff0c6dd,0xfff95641,0xfffadc16,0xffff465f,0xffefd314,0xfff25347,0xfffbbbd6,0x000ea2f2,0x00103d18, -0x001a0509,0x000f3996,0x000037fa,0xfff73293,0xfff9f0e5,0xfffa3214,0x0002c198,0x00009935,0x00052f28,0x0022cac1,0x002931b9,0x001fe873,0x00595968,0x00922c37,0xfff54035,0xffdb0ba0,0xffa81b30,0xff9b7966,0xff7fa87c,0xff8275d0,0xff90166e,0xffacc6f2,0xffd11c4f,0xfff2873d,0xfffae998, -0x000d9d93,0x000e4c85,0x0006b7cf,0x000984cc,0xfffcd7cb,0xffe52ef0,0xffd578b1,0xffc5a591,0xffbdd224,0xffc148f0,0xffc35bab,0xffd43294,0xfff12eca,0xfffa83a0,0xfff1fe95,0xfff34a85,0xffed58de,0xffe9ae8a,0xffec91a2,0xfff7c316,0x0003510c,0xfff952d8,0xfff340e0,0xffe71ceb,0xffc3f4ac, -0x0017e6d2,0xffd4247e,0xffb0b124,0xffcd3755,0xffe9c598,0x000d1680,0x0021e1ae,0x002661f6,0x004498a2,0x0051467b,0x0057456b,0x004425f4,0x00314e4c,0x0017e411,0x000abcdc,0xfffaaf70,0xffe9c7f0,0xffeb46db,0xffeb2d36,0xfff1310c,0xffe83beb,0xffe3912f,0xffe1e897,0xffea70e6,0xfff9c61d, -0x000bd9a6,0x00167f55,0x0018cf12,0x000b2f0c,0x0007a7f1,0x0001eb2e,0xfffc2a8d,0x0001204d,0xfffb5720,0x00031292,0xffef9741,0x0025a53f,0x0023ede2,0x0023aebf,0x001c827e,0x000e1e5f,0x00010901,0xfffac8a3,0xfff5eeff,0xfffa883a,0xfffd747a,0x000503ca,0xfffc6bfb,0xfff6bd1a,0xfff1ca32, -0xffeb333f,0xffe50a0e,0xffdd7dfc,0xffdd4a6d,0xffd98612,0xffda9788,0xffe1448c,0xffe207c7,0xffdfe75b,0xffeb727c,0xfff53e00,0xfffb93b8,0x0009957d,0x0014b88a,0x0026be15,0x002f86e5,0x003a5e0c,0x00417a20,0x003c9eae,0x003b1579,0x003c6a5a,0x002f30fa,0xfff13240,0xffd88c04,0xffd48b03, -0xffcff0e3,0xffcf2a3e,0xffcbdb3b,0xffc64397,0xffbe0fa7,0xffc421d8,0xffc93c9d,0xffcf59ff,0xffd6c5ff,0xffde962f,0xffe61cc3,0xffe4a38a,0xffe41223,0xffe3416f,0xffe196ed,0xffe1fd36,0xffdac10a,0xffdeda52,0xffd47bc0,0xffcea877,0xffd3eac7,0xffcfd9bf,0xffc557b1,0xffc91bb4,0xffca3c27, -0xffd18de1,0xffd0ebc1,0xffd72c3a,0xffdfc032,0xffdf3ac1,0xffe43e3c,0xffdf9c8b,0xffdd0235,0xffd93234,0xffd78844,0xffd9bf12,0xffd64b81,0xffd38313,0xffd0f1db,0xffcfa392,0xffccb5d7,0xffd0ae43,0xffd29cc6,0xffd44f1c,0xffd65c52,0xffd7ee99,0xffdad424,0xffd96790,0xffd8eb7b,0xffd87f26, -0xffd72597,0xffd73aec,0xffd5665e,0xffd39c68,0xffe0cd43,0xfffdf7c1,0xffcd3e5b,0xffde346e,0xffff3401,0x00001ee1,0xffffb6bc,0xffff5fc9,0x00007680,0x0000a474,0x00019efc,0xffea3474,0xffd79ce3,0x0002fd05,0xffe97511,0xffce0fc7,0x0029d8cd,0x000e6c7c,0x00344a82,0x00258023,0x002ad5ff, -0x002b7775,0x002da66f,0x002dd681,0x002ab2b8,0x002c45d6,0x002d0b7b,0x002f11f3,0x002d8031,0x002d84e5,0x002d8a9c,0x00315251,0x00316ad2,0x00302430,0x002b0608,0x0023f482,0x002efb25,0x000c699c,0xffed97e9,0xffc78ba2,0x0019cef8,0xfff052ce,0xffc3a7f2,0xffc3e48e,0xffc2c192,0xffc661f6, -0xffc09b70,0xffc21185,0xffca24c9,0xffee7de6,0x001c0efc,0xffcb2dbf,0xffe9cda3,0xffde6243,0x002fccf1,0x002c067a,0x00310a3c,0x003796d1,0x003ef98a,0x003f3790,0x003626ce,0x0039a037,0x0039fe5d,0x003d47b6,0x0038ffd3,0x003db2e9,0x0042126f,0x005330ea,0x0054c150,0x004e0687,0x003b01a1, -0x00306dd7,0x00269e4d,0xffe73f8e,0x001a6b1e,0x00199267,0x0014f04b,0x000ac189,0x000937c4,0x000c3cb6,0x0009a435,0xfff9d59a,0xffffdfb0,0x00029733,0xffffdcde,0x0004a9ed,0xfffa010a,0x00076cc7,0x001c68e4,0x00047584,0x0026faf2,0x00382d4a,0x003c4f51,0x00478777,0x0052bb27,0x0053ba78, -0x0042cf7b,0x0046dd4d,0x004af36a,0x005beeb3,0x0050c51f,0x0052af29,0x005124e7,0x006af989,0x006ba8c2,0x00616a79,0x003e3f04,0x00342516,0x000dd7f1,0x00010106,0x000fdca2,0x0011ebdc,0x00164b99,0x0006808f,0xfff29f59,0xffe703c3,0xffeb2c87,0xffd45646,0xffcced80,0xffca8229,0xfff152c9, -0xffee4bdf,0xfff8e233,0x00092fb8,0x000ae459,0xfff311dc,0x0025a1f2,0x002fd3da,0x00417565,0x005fbb05,0x00729f9c,0x0072ec9d,0x0059cda6,0x00574062,0x005a4328,0x006c8178,0x00568267,0x0067c245,0x007c1e1e,0x00b73020,0x00bd79a7,0x00a7c1e8,0x006763c0,0x00445db4,0x001943d4,0x0003250f, -0x002c0a97,0x0027f70f,0x0033cbd9,0x002342a1,0xffff464c,0xfff08295,0xffd816ca,0xffcfc3d4,0xffa41de6,0xffadda46,0xffd5afc8,0xffc7ae76,0xffdfb3a7,0x0012455e,0x00031e63,0xfffa17c4,0x003b8c6c,0x006cd877,0x005e1e9e,0x001d93c3,0x0031ae72,0x0029c5f4,0x0012f44e,0x004d59f4,0x00759bc4, -0x0079860c,0x00bac085,0x0087524e,0xffea3682,0xffda4934,0xffc83eaa,0xffdc52fc,0xfff881ce,0x000e5d38,0xfff5f096,0xffd8174a,0xffe3f74d,0xffcaedf1,0xffc47a14,0xffd74a91,0x00298e0c,0xfff38c53,0xffe9199d,0xfff188aa,0xfffb1694,0x00214049,0x005a670f,0x0052231e,0x003285b4,0x0004dff2, -0xfffe8d24,0x0065012f,0x0029f4cc,0xfffc2c50,0xffc55032,0xff84791e,0xffd27622,0x000ee838,0x002f33f5,0x00419252,0x0002d67b,0xff8e72e2,0xff8df605,0xffbdf4a4,0x0014039a,0x006be330,0x008acf19,0x007deca0,0x00524d9c,0x00491cb1,0x00497334,0x002044dd,0x001ffeec,0x0011b9ea,0x001f0909, -0x00064ccb,0xffe37d40,0xffeca10d,0xfffe9423,0xfffde13b,0x0004b002,0xffe71a10,0xffb28f5b,0xff6e29e8,0xff9def90,0x0014cd0c,0x0070ee30,0xfee9d05e,0xff368416,0xffc974c4,0x002c4c4f,0x00aeac57,0x00a8ecbb,0x00779bbb,0x002c3a99,0xffdf165e,0x000f0b08,0x00b5814b,0x0076d1da,0x004a2cff, -0x0028e083,0x000c3957,0xffed8df3,0xffd80e7a,0xfff238c6,0x000ea783,0x000fe92d,0x0010f9b3,0x00074e54,0xffe779ef,0xffe4e751,0xffec2a34,0xffeeb193,0x00022354,0x0003277e,0xfffeb5d6,0xfffe53bc,0xfffae74b,0x0002bf24,0xffce4eeb,0xffd90054,0x000a4325,0xff2fcb87,0x006b95b6,0xffec1c00, -0x0024dfb8,0x00596f20,0x00cff967,0x008927ed,0x0053b19f,0x0018df09,0x00087b3a,0xfff5a212,0xfff100ea,0xfff86b3e,0x000cd424,0x000c3f71,0x00335f04,0x004e20a5,0x005a5a32,0x004305a1,0x002ec995,0x001405d4,0x00069ace,0x001b5e04,0x00252784,0x001531b4,0x00041b32,0xfff80017,0xfffb26bc, -0xfffd234b,0x0003cc77,0x00022496,0x0008f479,0x002b7f77,0x00220c50,0x00297375,0x005c39cf,0x008b79bf,0xffcdb1dd,0x002506ee,0x007cf166,0x006478d8,0x0043f428,0x0036a9c9,0x00398b8c,0x003d4c7f,0x003c6a55,0x004dd317,0x0062486f,0x005a702a,0x004f99e1,0x004063df,0x00254a72,0x00065a60, -0xffed8233,0xffd61bc4,0xffd54fb8,0xffda0027,0xffc85ddb,0xffdc2c70,0xffe0718f,0xfff7b0ea,0x00024b95,0xfff96d59,0xfff59666,0xfff2e5fe,0xffee13c5,0xfff5229e,0xfffb4a68,0x0001c093,0xfffd7416,0xfff58728,0xffd79f2c,0xffe2b1a5,0xffc9ff22,0xffeb82e6,0xfff66c30,0x00014e7a,0x0028c2bb, -0x0050b412,0x006ea7f0,0x008b1726,0x00725659,0x0064ad62,0x0060e185,0x006073b5,0x005a2372,0x00461fa0,0x003c22ec,0x002cd23a,0x0016021b,0x0011120c,0xffff7dd3,0xffe7d0f7,0xffe47513,0xffe6a8c1,0xffe66ac0,0xfff9685f,0x0005728d,0x00136b02,0x001b9ae9,0x0017c963,0x000e2e98,0x000b1eed, -0x000747df,0x00046088,0x00034c77,0x0005c0d1,0x0000f45a,0xffffc995,0x003f1ed4,0x004b9c77,0x00570260,0x004d5b6f,0x00463fa3,0x003dce4a,0x003d0481,0x00437ef3,0x003ee1d9,0x003d2ccf,0x003861f3,0x00232fb8,0x000f28ed,0xfffacaea,0xfff7501a,0xfff1e415,0xffecd7ca,0xfff01fb7,0xfff89615, -0xfff5b18d,0xffe97c66,0xffe977d9,0xffe7865d,0xfff5e5e6,0xfff9ed42,0x00091e2c,0x000b5dc0,0x0026fcd3,0x00296f86,0x00387c87,0x0037fbc0,0x0045a9a5,0x004184a4,0x003f8532,0x00387794,0x003fa842,0xffd3ba9e,0xfff933ae,0xfff8f304,0xfffc3854,0x0002540d,0x0006888d,0x0007acd7,0x00070341, -0xffff68e6,0xfff87656,0xfff48299,0xfff07fba,0xffee850b,0xffeb2e03,0xffec39d5,0xffec0046,0xffebc1ff,0xffe9f523,0xffe63300,0xffe88353,0xffd93dc5,0xffe819ff,0xffe75020,0xffdf25fd,0xffdb2b16,0xffe03fa8,0xffe78a36,0xffe9a554,0xffe490dd,0xfff1bc7f,0xfff786ff,0xfff59301,0xfff755ee, -0xffee8cf8,0xfff06f4d,0xfffba169,0xfff0bb59,0x00043fb7,0xfffd1bfc,0xfffed0c7,0xfffd89f0,0xfffd44a4,0xfffdf341,0x00005c90,0xfffe0765,0xfffc6ccd,0xfff9d0be,0xfff827d9,0xfff62364,0xfff3a580,0xfff3b14d,0xfff33874,0xfff2cba2,0xfff2fb89,0xfff188e8,0xfff50c55,0xffe964d4,0xffd7126c, -0xffbd220b,0xffede9cd,0xffd5f601,0xffb66366,0xffb9c51a,0xffbdde87,0xffc4a507,0xffc577df,0xffc89206,0xffce230d,0xffe2adc5,0xfffb1039,0xffc709a8,0xffdc31ed,0xfff70b8e,0xfff023cb,0x0013c470,0xffe34805,0xfff5f4dd,0xfff54489,0xfffcbba0,0xfff5c6a1,0xfff24d47,0xffebbb78,0xffedbbf2, -0xffef1c42,0xfff362de,0xfff2a26d,0xfff325e9,0xfff2afed,0xfff515d5,0xfff4f09b,0xfff40ae0,0xfff004ec,0xfff19c7f,0xffe1e07c,0x0013bd68,0x002ef483,0x0042dc5a,0x000892db,0x002b5210,0x0038cb99,0x003ba94a,0x0039a439,0x00313f02,0x0036b351,0x0038fea8,0x003a7ea1,0x00270da6,0xffffbebb, -0x0040843c,0x003269f0,0x003303f0,0xffed6997,0xfff3c771,0x000119a1,0x0011a559,0x00073432,0xfffd44aa,0xffea892b,0xffebb606,0xffecb478,0xfff5aaf6,0xfff25ac3,0xfff5690b,0xfff69d0f,0x0002e033,0x00058de0,0x0000d6ec,0xfff949e4,0xffeeea47,0xfff21846,0x0030e257,0x0006e5ab,0x000ea292, -0x00111c38,0x0010ad17,0xfff3c952,0xfff12e42,0xffef0c4e,0xfff85c7c,0xffe2cbad,0xffdcc142,0xfff07bc7,0xffefa60c,0x0004dba9,0x000c19d2,0xfff1b956,0x0010ae93,0xfff85e46,0xfff5adee,0x001120a0,0x00292ddc,0x0017d26c,0x00065105,0xffde21a1,0xffe0a9fe,0xffe6b89e,0x000293a0,0xfffda994, -0x00018302,0xfffe1557,0x000cd222,0x000dbecd,0x0004c411,0xfff4dd9f,0xffe1d632,0xfff5171c,0x00106cb5,0x000d58e0,0x0008ba3e,0x00074598,0x0012d8f0,0xffddeb35,0xfff37f66,0xffc9a753,0xffdd73c2,0xffbd4766,0xffd7e7a4,0xffe58c74,0xfff2dbcd,0xfffa889e,0x00113584,0xffff2bc0,0x00036b1b, -0xfff04a86,0xfff4c067,0x0026e60b,0x0059ab2b,0x004a2ad9,0x002dc78e,0xffed568e,0xffe5607b,0xffe6b16b,0x00075b81,0xfff83be4,0x0003f19e,0x000d7254,0x0036a155,0x003ff1f4,0x0032c5af,0x00139436,0xfff4bfac,0xfffde554,0x00254cc3,0x000ff743,0x002d20ba,0x001e1a3c,0x0011646f,0xffeb21d8, -0xffe2ae85,0xffd6dd0c,0xffc895c9,0xffa16513,0xffa28569,0xffc79040,0xffbffe5e,0xffdd728f,0xffffbaa3,0xffe7dca6,0x003b048d,0x000c27e4,0x000a7535,0x0003dce5,0xffc09c8e,0xffc842a1,0xffb919d9,0xff8c065f,0xffbe4268,0xffe5834c,0xffecb121,0x003797fc,0x00235dce,0xffb6016a,0xffaaeda8, -0xff927600,0xff6c9cdd,0xff97021c,0xff969561,0xffbc4f35,0xffe4f93c,0xffb73b60,0xffbb778c,0xffbd97ce,0xffdba792,0x0028eab3,0xfff2cc8b,0xffeb18e7,0xfff5ae37,0xfffd4a47,0x00263d0f,0x0062850f,0x005403cf,0x0042a99b,0x001a2da5,0x002b163a,0x005855dc,0xffe6056b,0xffb02630,0xffa7601b, -0xff8cf0ce,0xffbe3a88,0xfffccc0a,0x0033a322,0x00373faa,0xfff93321,0xff8c966c,0xff903377,0xffb87c3d,0xfff4d612,0x0033826c,0x003e0f52,0x001201a1,0x00170879,0x000eaba7,0x004036fa,0x00302e24,0x001f528f,0x0016ab2d,0x000ff85d,0xfff8c504,0xffdf8041,0xffec63ed,0xffffb658,0xfffe4c73, -0x000074bb,0xffe2d9a0,0xffa99c98,0xff6fd6c9,0xff8fbcde,0x0019aa16,0x0040cdf5,0xff1b39c8,0xff5121e3,0xffb1a832,0xfff0b262,0x0045986e,0x0019b7f8,0xffcadbe2,0xff81f503,0xff2bcbf7,0xff75d0cd,0x0043e017,0xffe56ca7,0xffae00f9,0xff91ad24,0xff9081b2,0xffa17f57,0xffc05957,0xffdf4341, -0xffdc458e,0xffea2d67,0xffff3885,0xffef2239,0xffe6fb90,0xffde3f09,0xffe9bab3,0xfff1579b,0x00010506,0x00024ff5,0xfffeee83,0xffffec66,0xfffb8f3c,0xfff8eb76,0xffd9f051,0xffdb1890,0x000d99fc,0xff461bb8,0x0052cff5,0xffe274e5,0xffef7d14,0x00056a90,0x00116f03,0x000764df,0xfffabdb5, -0xffdbf6b6,0xfffc4a42,0xfff93649,0xfff7df1a,0xffef0c40,0xfffa3cea,0xfff4ce13,0x0009e3d4,0x0014c862,0x0011b808,0x0009327f,0x0003ddb2,0x000b0995,0x002086ef,0x001ad9ed,0x001ff29d,0x00127aad,0x0000f57c,0xfff40321,0xfff9542b,0xfffef1fe,0x0003dc50,0x0001cd1b,0x0006d1eb,0x001b24a3, -0x0014faf9,0x0011a82f,0x0058dc80,0x006c740c,0x001a8ab8,0x001d24c4,0x0003437e,0xfff403c1,0xffc14ec0,0xffbdc6eb,0xffbf282d,0xffc82fba,0xffe39ae3,0xffffdb2d,0x001a4402,0x0022c198,0x0021d785,0x001a1b4c,0x001214c0,0xffffc062,0xffe3b070,0xffdc3a28,0xffcf26f8,0xffcb1390,0xffd5f450, -0xffd40d8c,0xffe5b082,0xfffa0f28,0x00000ecd,0xfff6f525,0xfff5f3b2,0xfff0f22d,0xfff484eb,0xfff3de04,0xfffc1203,0x000125f3,0x0004a62d,0xffffdebe,0xfff250fe,0xffe808a9,0x000714ed,0xffd3a453,0xffae4bf4,0xffcaa616,0xffe2f9bf,0x0000da96,0x0011d660,0x001eced2,0x003d807d,0x004faa10, -0x005a4b63,0x0050a556,0x0045d298,0x0031a260,0x0025722b,0x0011bbed,0xfff78f58,0xfff03e7a,0xffe72716,0xffe8629a,0xffe2a9af,0xffe33af7,0xffef97fb,0xfff8b31e,0x000368fd,0x0011b296,0x00117c9e,0x000e0af1,0xfffce166,0xfffe31ef,0xfffd287c,0xfff979f3,0xfffc7a6a,0xfff89831,0xfffd31ad, -0xffee1cd5,0x0042c95e,0x003829ff,0x002f6147,0x002e5c4d,0x00223898,0x001a3671,0x00165327,0x00132133,0x00138597,0x0011c4a7,0x00131597,0x0004644f,0xfff83b4a,0xffecc727,0xffe8a678,0xffe4cd7c,0xffdf38f3,0xffe2bd20,0xffdf0786,0xffe77751,0xfff2bc74,0xffee190f,0xffe911e9,0xfff68db1, -0x000470c3,0x000da665,0x001bb169,0x00221d92,0x003837a5,0x0034ef46,0x003e2f03,0x003eabfe,0x00408e29,0x0046aefe,0x004d6a78,0x00418655,0x000715ad,0xfff37c6f,0xffedd081,0xffeae55f,0xffe84c1a,0xffe3a6f2,0xffdd198b,0xffd67e4f,0xffd6637a,0xffd6b759,0xffd8c039,0xffdb9e6a,0xffe06346, -0xffe56989,0xffe484c4,0xffe38bdc,0xffe219b8,0xffe06611,0xffde5e06,0xffd91eb7,0xffe72e34,0xffda5edd,0xffdba2a7,0xffddd32a,0xffdd7f09,0xffd4f46d,0xffd728aa,0xffdcdf48,0xffe729e1,0xffe4766e,0xffe8c9c9,0xfff44234,0xfff30822,0xfff899de,0xfff755b4,0xfff1e342,0xfff5218c,0xffe40e6e, -0xffe662a7,0xffe2f649,0xffe040e1,0xffde7bfa,0xffdd5834,0xffdb0244,0xffdbd719,0xffdbaf8b,0xffdb32be,0xffdb84bf,0xffdb3f62,0xffdbaa42,0xffdb04b6,0xffdaf47e,0xffdaf086,0xffda502a,0xffdb5dd8,0xffd690fe,0xffe81224,0xfff7af23,0x00040ba4,0xffe32e43,0xfff81bc6,0x000487de,0x0007ea0f, -0x00086dd6,0x00074bdc,0x000c235d,0x000d8132,0x000f50db,0x0004b820,0xfff0db82,0x000bd5da,0x0004c6b8,0xffd62193,0x0011df09,0xffeca91d,0x001e3f98,0x001197cc,0x001405b0,0x0016a030,0x0013ca35,0x001273b7,0x000f454f,0x00104ee6,0x0011ebae,0x0017a589,0x0014b4da,0x00146d46,0x00130867, -0x0017ccf2,0x00185433,0x0017483c,0x00131914,0x000f5b0e,0x0018e634,0xffeb7194,0xffdc3b27,0xffe35390,0xfff4c8ce,0xffdbb18f,0xffdb68bc,0xffd9414b,0xffd71ec2,0xffda3b31,0xffd26e0f,0xffd31aae,0xffd6f970,0xffdaa548,0xfff78229,0xffe283ce,0xffd84c36,0xffd87604,0x0010a0fa,0x0016e308, -0x001709d4,0x002188c0,0x001c35d7,0x0016a114,0x000dffb1,0x001092ec,0x0014fa1d,0x0021a7c9,0x001b24dd,0x001e3875,0x001e60b9,0x00303de1,0x00322f29,0x002c7f4f,0x001dbf19,0x001b6a7f,0x000da91c,0xffe80dd4,0x0009d20f,0xfffe34f8,0x00043034,0xfffb087f,0xffefb347,0xfff80171,0xfff13e83, -0xffe20b2f,0xffec6f1d,0xfff2aca7,0xffe99aed,0xfff41c44,0xffede0cb,0xffecaba8,0x0002f75a,0xffece656,0x00134ee0,0x0025d6ad,0x0021da2a,0x0034ad37,0x0027545b,0x001c4aaf,0x000ce353,0x000befab,0x00154a28,0x00387400,0x0028825d,0x0029c5f7,0x001fdae3,0x003c9e37,0x003ee709,0x00369b48, -0x001d2c6d,0x001b735a,0xfffea58a,0xfff12fd4,0x0000779a,0xfffd058c,0x000315e6,0xfff7be22,0xffdfded9,0xffdd863a,0xffe1b3ca,0xffc3ef97,0xffcbaf82,0xffc6d2ee,0xffdc6777,0xffea5204,0xfff1cfb7,0xfff14b72,0xfff7bc21,0xffddca1b,0x000db6ac,0x001b284a,0x0024d72a,0x004de789,0x003c86e2, -0x0025fd07,0x000db986,0x0008ff10,0x00198af7,0x0049be01,0x002d0124,0x00339cb7,0x0038ba63,0x00713179,0x007c17b8,0x006cead8,0x00406c1c,0x0034d05d,0x0015bf26,0x0009394c,0x002a1699,0x0013a47f,0x00230b02,0x0018ac4c,0xffee9b45,0xffe4d005,0xffd3b16f,0xffd5dc61,0xffa3d941,0xffac7236, -0xffc340ee,0xffcb2d9d,0xffdc29fc,0xfff31b37,0xffec3858,0x00029a5d,0x002fe3ec,0x006e348a,0x00500b0e,0xffffe65a,0x000bc0b0,0xfffcc436,0xffda0f4b,0x0011a64b,0x0035d0e7,0x003d6e8e,0x0087a05a,0x00704523,0xfff7f78d,0xffd94d87,0xffbacbaf,0xffbb9536,0xffc5a3b2,0xffccfc8d,0xffab54bc, -0xffa37d75,0xffc11b8a,0xffb39740,0xffc5c3e1,0xffdc2b37,0x00248aa2,0xfff6663f,0xfff0ec68,0xfffb770f,0x00023cfa,0x002b32c3,0x005f9404,0x005665c7,0x0034a075,0x000c8998,0x0007f99e,0x002669b5,0x0000301a,0xfff567e4,0xffc078f4,0xff946af9,0xff9e73ef,0xffd108fb,0x001488f1,0x0037ceca, -0x0011239f,0xffa68632,0xff890ade,0xffa4978b,0xffe53649,0x0043a08e,0x0065ea1a,0x004b28ff,0x00384043,0x003c693a,0x003e195c,0x001a7ab7,0x001739bb,0x000f1adc,0x001c9dd2,0x0005f25b,0xffe1bdc6,0xffefe6be,0x00013698,0xfffe91a0,0x000106c1,0xffe23112,0xffb0f835,0xff6f511f,0xffa1f688, -0x001cbd43,0x00474288,0xff35bfed,0xff7c1360,0xffabcb91,0xffec47de,0x007798c5,0x0047ffc4,0x00127471,0xffe4f791,0xff9fce46,0xffd6b035,0x008654ec,0x0050dc63,0x001f247e,0xffe7a045,0xffdea287,0xffd13e15,0xffcc3a8f,0xffe4ef9c,0xfffc7589,0xffea188f,0xfff19bf7,0xfff46afc,0xffdb5691, -0xffdadd7e,0xffe8cf66,0xfff60641,0x0002aec8,0x0001d890,0xfffded0e,0x00018771,0xfffb4949,0xffed2d36,0xffd8f57b,0xffe43e8e,0xffe729a3,0xff5d80d6,0x00296acf,0xffd800d4,0x000f9e99,0x002076a3,0x004f48c3,0x00457a56,0x002f62b2,0x000c01a4,0xfff3a4c1,0xffdf420e,0xffe1281e,0xffdc51a2, -0xffed6841,0xfff0c449,0x0014c5b1,0x002cb6ba,0x003594df,0x002dfd36,0x002c0892,0x0016fd73,0x000deb86,0x001bc0f0,0x0022da25,0x00124cd6,0x00005ee3,0xfff49c13,0xfffaec09,0x000053bd,0x0003df63,0x00019f3f,0x000917c4,0x001f0be1,0x000a0a45,0x00103b89,0x004b4511,0x00555543,0xffe0eb57, -0xffff5a13,0x0025c505,0x000dd5ac,0xffedbb29,0xffd7f91d,0xffdbb21c,0xffed0007,0xfff5f088,0x0007ebbc,0x00158371,0x001ba56c,0x001e0613,0x001981e2,0x00103a83,0xfffe84d9,0xffecce06,0xffdc4b09,0xffda6693,0xffd690e0,0xffc9164b,0xffe052ad,0xfff00233,0xfffdc71d,0x00047f4c,0xfff9cd6f, -0xfff64905,0xfff5d119,0xfff53cba,0xfff84295,0xfff7e27e,0xfff3522d,0xfffc71fc,0xfff6bb8d,0xffe2b291,0xffda5346,0xffb9e4c0,0xffb780fa,0xffc5816d,0xffd4ac7d,0xfffabecd,0x001fbb2a,0x00396354,0x004a613f,0x0055f541,0x005faa29,0x00685910,0x0060acad,0x00525c90,0x003b102e,0x002ecc90, -0x001f6d12,0x000f123d,0x000586f5,0xfff6a32f,0xffe38e5f,0xffdf3acd,0xffe28aad,0xffe2fcf4,0xfff9c9a6,0x00088cb4,0x0013cab1,0x0010f485,0x0007d3e1,0x00010e7e,0xfffe53c7,0xfffdcde6,0xfffabbbf,0xfff95034,0xfff2fb4e,0xffeb374a,0xffdbe8bf,0x0031b354,0x003f523a,0x0047f047,0x003e53a2, -0x003a1bf5,0x003146fc,0x00305fe7,0x00331c82,0x002c693f,0x0025c855,0x001ff49a,0x0011345a,0x0004b672,0xfff5f97f,0xfff49bf8,0xfff0d613,0xffede965,0xffeef60e,0xfff69e01,0xfff057bd,0xffe6a0b7,0xffeb685b,0xffeba1db,0xfffc85d2,0x0004b72a,0x00181079,0x0019ea80,0x002ed0d8,0x002d3948, -0x0036266d,0x002f75c3,0x0034d36c,0x00329fdb,0x00324917,0x002e2dd4,0x0032e233,0xffed16ee,0x00054eb4,0x000568dd,0x0003c791,0x000595df,0x0004e8de,0x00026591,0xffff00df,0xfffb465f,0xfff8e26e,0xfff74e6c,0xfff476bb,0xfff1ab71,0xffed0dff,0xffedbb15,0xffed71ac,0xffed9097,0xffeb8703, -0xffea0742,0xffe8ce82,0xffd87fd5,0xffe46fbb,0xffdf1a90,0xffdce9e0,0xffd66527,0xffd7d0d2,0xffe079da,0xffe12dda,0xffe01184,0xffef58d4,0xfffab2b7,0xfffbe795,0xfffeabd1,0xfff9b114,0xfff9f837,0x00050edb,0xffe7ccf2,0x00027703,0xfffb282e,0xfffac9cc,0xfff92ad5,0xfff84123,0xfff81921, -0xfff84f1b,0xfff6ecec,0xfff5037a,0xfff2a980,0xfff137e2,0xffeff8c0,0xffee5aba,0xffeeae42,0xffee56f0,0xffee2c4e,0xffee51de,0xffed6d3f,0xfff27185,0xffdca253,0xffd00c1b,0xffce0c1e,0xffdf3a3d,0xffce1eee,0xffc988d6,0xffcc1cc0,0xffcff82c,0xffd6505d,0xffd57fa8,0xffd7b95c,0xffdd2ce3, -0xffdebf26,0xffef5a76,0xffdd5ad7,0xffdbe738,0xffed0935,0x000aa691,0x0028d2a3,0x0003bf30,0x000b84b1,0x000daa32,0x001219d8,0x0012a674,0x00111980,0x00096c64,0x000aafd2,0x000b789f,0x001096b3,0x000e33c7,0x000e62c4,0x000d7246,0x0010a88f,0x001091d3,0x000f2aa0,0x000bdab3,0x0009d98b, -0x0001dc02,0x00276074,0x002a0201,0x000f1248,0x0022213b,0x00290575,0x000a3007,0x000f2b2a,0x000e2282,0x0007f89e,0x000f5d32,0x0012043f,0x00120c38,0x0027a926,0x001ecdbb,0x000faab3,0x002ce02b,0x00224c47,0x000f9820,0x000788b8,0x0015e98f,0x0021d12a,0x002a4496,0x00261ec6,0x0010ab80, -0x0011be1c,0x00125b12,0x001e0e34,0x00155557,0x001638be,0x0016af95,0x0025a3b8,0x002a1f5a,0x002575e6,0x001e8987,0x00114803,0x001591b3,0x0023234e,0x001512b3,0x001b5824,0x0015d06e,0x0012dc44,0x0002c4dc,0x0003beba,0x000851d6,0x00082ab3,0xfffeb8e5,0xfff5a32e,0xfff799ac,0x000226e7, -0x000b68f8,0x000dd922,0x0008f43c,0x00219cea,0x001721a7,0x000ab585,0x002478b7,0x0033438e,0x004421a8,0x00403348,0x0013685d,0x00146329,0x00161d36,0x003613c1,0x002811bf,0x002a026d,0x0025b2e8,0x00388b3d,0x003ac7dc,0x00305028,0x001e4f48,0x000b28d5,0x000e9589,0x001acdaa,0x00145ef4, -0x00084754,0x000bb09d,0x00112f69,0xffe2a803,0xfff2534f,0xffd4f2e3,0xffdbd469,0xffc81a00,0xffdfc401,0xffe12733,0xfffd51ac,0x0005d9d8,0x000a8f7e,0x00109102,0x000adf4a,0x00082bac,0xfff90ecb,0x00278d74,0x00500c21,0x00747835,0x006ca38e,0x0029bd14,0x002389c6,0x00272365,0x004daf65, -0x0030bc27,0x0034390f,0x003cf117,0x006ec252,0x007f2ff8,0x0071aac3,0x00511b22,0x002b4a25,0x00254f18,0x002df78c,0x001a8ab3,0x001be35a,0x00190f96,0x000ce3c8,0xffde1ecf,0xffdeb5e3,0xffd4c08c,0xffcca916,0xffa8b58c,0xffa903b3,0xffb65dd4,0xffcb4542,0xffe9115c,0xffe918a1,0xfff4328a, -0x00664c1f,0x00525a34,0x0060b449,0x0051ca22,0xfffbfa88,0x00150a47,0x000f3cb2,0xffee5c22,0xfff9cc73,0x00015597,0xfffd0375,0x003a2307,0x002da3b0,0xffcced8a,0xffbc9773,0xff9fb93a,0xff7543a9,0xff9ff5e3,0xffa619ba,0xffb94340,0xffc6d55a,0xffb04679,0xffb6bcef,0xffcd75a5,0xffe9cd56, -0x0021ed65,0xfff95205,0xfff7ada1,0x0002eea3,0x000a9a03,0x00331520,0x0066c6d9,0x005e2c1d,0x004fbdad,0x002fab14,0x0052cba9,0x003b0e7f,0xffec1a1b,0xffb7269f,0xffb77aab,0xff9df00d,0xffb90434,0xfff23a44,0x002f6b86,0x00452e3b,0x001a43de,0xffb112bf,0xff92a9c4,0xffab2485,0xffe9a9ec, -0x003d1152,0x0069b33e,0x005f34ee,0x005a3223,0x004185c9,0x004d211e,0x002a52e3,0x001b01c0,0x001d3161,0x00161e0f,0x000032e2,0xffe275a1,0xfff0a32f,0x0001b921,0xfffcc87f,0xfffd323e,0xffe12365,0xffb1a8a3,0xff7c11c2,0xffa8ab2b,0x0031da7c,0x00386c3e,0xff665081,0xffa15f1b,0xffa7e6f8, -0xfff45f9a,0x00c4b83b,0x00942380,0x005a7a34,0x001ea66a,0xff870dbd,0xff9aecb6,0x005399f8,0x00380d60,0x0019fb06,0xffe33690,0xffd56790,0xffc71b17,0xffc1904b,0xffdc507d,0xffdb7f8f,0xffe7feb3,0xffff14a5,0xffeffa1c,0xffe7c2c4,0xffe285c7,0xffeda967,0xfff9dce1,0x00049299,0x00016422, -0xffff5c60,0x0003c1a7,0xffffc07d,0xffeaa729,0xfff083bf,0xffed3816,0xffe40f4c,0xff775dd9,0x00159449,0xfff73218,0x004802c7,0x007a4d39,0x009b716e,0x009bd413,0x00725881,0x000df636,0x001661f1,0x000b832a,0x0014621a,0x0001ebb3,0x00082663,0x0000ebe5,0x0022aef9,0x00361c21,0x0032bc21, -0x002ff84b,0x00235ec1,0x001cc775,0x0024aea9,0x0021cbbb,0x0024728f,0x0013a197,0x00023766,0xfff546f8,0xfffb0a06,0x00014350,0x0000e728,0xffff76a2,0x0005f865,0x00104e45,0x00012173,0x0004865c,0x003b92dd,0x002d462d,0x002010ee,0x004a5297,0x0066924d,0x00587f99,0x001eaee9,0x000feb34, -0x0003ce90,0xfffbc396,0x00056125,0x00179f96,0x003b7651,0x0038393d,0x0035fc70,0x003177d8,0x001af80a,0x0003e85e,0xffeb27b4,0xffe51872,0xffdebdaf,0xffde887b,0xffe6e0b9,0xffeb71d7,0xfff8793c,0x00023649,0x000516b6,0xfffcde71,0xfff8d3a0,0xfff8640d,0xfffe4ea4,0xfffcc9ba,0xffff5a1e, -0xfffcb403,0x00080431,0x00070cd4,0xfffd8709,0x000c0186,0xffe0d2aa,0xffda3afe,0xffcda47d,0xffdd0b9c,0xffee3158,0x00033e39,0x0012b776,0x002aafe8,0x003b63de,0x004a4d80,0x00561e96,0x0058ad91,0x005658e2,0x0047da1b,0x003d14d6,0x00295448,0x000b513d,0xfffc0971,0xffea95d5,0xffe0d018, -0xffdefdac,0xffe5b35a,0xfff8ce61,0x0005865e,0x000bd3e0,0x0013849b,0x000ba967,0x0003b262,0xfff774ed,0xfffb03cc,0xfffd6791,0xfffba0e7,0xfffae287,0xfff8be09,0xfff52cf1,0xffeed489,0x004887c8,0x003e4176,0x0035857c,0x00388c11,0x0034000a,0x00341f00,0x003575cf,0x003837bf,0x0032a16d, -0x002c7e89,0x00268b04,0x0012a770,0x0000a99f,0xffeeb4cc,0xffed1096,0xffeaa3e2,0xffe759d5,0xffed97d3,0xffee8f15,0xfff7956a,0xfffd9d02,0xfff72f7e,0xfff1c38b,0x000078ad,0x000e6351,0x001d9634,0x002545ec,0x002c8e5c,0x003b32aa,0x00324201,0x00332683,0x002faf51,0x00352318,0x003e0a66, -0x0043876a,0x003ff882,0x000f44ee,0x0014a030,0x000fb3d4,0x000efbe8,0x000c387d,0x000891e4,0x0003a685,0x0000a37f,0xfff88e8b,0xfff24933,0xffee2c61,0xffea0539,0xffe8754f,0xffe6c364,0xffe72b50,0xffe65baf,0xffe50a86,0xffe35196,0xffdf56bf,0xffde54e1,0xffe8a802,0xffe6437e,0xffecda0a, -0xffeab1d7,0xffec65c4,0xffebfdbc,0xffee35fa,0xfff5932d,0xfffc2923,0xfffe10ab,0x00020821,0x00093b9f,0x0009c917,0x000a8c39,0x000dd5d6,0x000d7935,0x00099937,0xfffbdb50,0xfffa625b,0xfff8dd98,0xfff70eaf,0xfff65e47,0xfff5a774,0xfff511a5,0xfff228db,0xffefa6b4,0xffec8ad8,0xffea8d8b, -0xffe82050,0xffe54765,0xffe5ae42,0xffe5c415,0xffe5fb04,0xffe6487a,0xffe731db,0xffe3b48c,0xfff71fed,0xfffc268b,0xffef954d,0xfff8a712,0xffffeafd,0xffeef662,0xfff37560,0xfff5b12e,0xfff67e44,0xfffbe748,0xfffe4fab,0x0001c805,0x000c4251,0x00089566,0xfffbde3f,0x000b8425,0xffe9047d, -0xfff4f06d,0xffe48f06,0xfff9a17c,0xfff98a0d,0xfff8b376,0xfffddaa7,0xfff6fe68,0xfff3f71f,0xffef25e1,0xfff0643a,0xfff28863,0xfffab271,0xfff72fc5,0xfff6f2fd,0xfff4e197,0xfff94f8d,0xfff9dd48,0xfff8eaa8,0xfff5fd65,0xfff69901,0xfff609aa,0xffe4555b,0xffeed7df,0x0017c1bf,0xffe2e9fb, -0xffead138,0x000c94bd,0x000afa06,0x00083a32,0x0005d764,0x00031b62,0x0003d787,0x00027423,0xffe9efc3,0xffe2b4cf,0x00133dae,0xffedc0bc,0xfff502ff,0xffeedaab,0xfffa92fb,0xfffbdeec,0x0009f0e9,0xfffc3926,0xfff18e51,0xffe4e22b,0xffe6c8da,0xffed2adc,0x0000287c,0xfff772f6,0xfff853a6, -0xfff62bb0,0x0005cbbf,0x00089d67,0x00045196,0xfffd04d8,0xfffddc66,0xfff454bb,0x00030676,0xfffc14f8,0xfff0b51e,0xfffaf0b4,0xfff62d77,0xffdfe3fa,0xffe99301,0xffe2aa1f,0xffda9269,0xffdfd695,0xffe38a5f,0xffdc723d,0xffe90f6e,0xffef27b5,0xffe4a061,0xffeaa4e8,0xffea2f70,0xfffdae67, -0x00063286,0x000787a8,0x001ea868,0x00034f61,0xffeeef14,0xffd6110a,0xffd44ffc,0xffdfbcbd,0x000e38b8,0xfffc750e,0xfffd8390,0xfff11d20,0x0009b8c7,0x000ca3fc,0x00050b51,0xfff9056a,0xfff75d39,0xfff3f219,0xfff1ff82,0xfff877a1,0xfff15d23,0xfff40d78,0xfff4e5a9,0xffd1336d,0xffdf2272, -0xffd3f866,0xffbcd335,0xffc90534,0xffcdf057,0xffcce873,0xffed7410,0xfff2a759,0xffea3e2a,0xffed6a90,0xffdbd14e,0xfff285c7,0xfffbf843,0x000c9eea,0x003c2826,0x00197a30,0xfff33d4c,0xffcb3b1c,0xffc62b89,0xffdcd20b,0x001e7245,0xfffd16b6,0xfff8c8c6,0xfff5ed65,0x00255843,0x00346c7c, -0x002ae662,0x0017792b,0x001699a7,0x000fcd2d,0x00172e7a,0x001b71ec,0x00070741,0x000d4545,0x00089fb0,0xffdcd914,0xffdf907c,0xffd7ff17,0xffd7224f,0xffaebea5,0xffb2ce30,0xffb4381e,0xffd0549e,0xffde9fce,0xffda1a4f,0xffd945c4,0x0025ee46,0x00260770,0x0050d2a7,0x0030d092,0xffe192c3, -0xffdf8796,0xffcbf9d6,0xffa94afb,0xffcc0ef8,0xffe47023,0xffedbe32,0x0035b308,0x003bbb4b,0xfffaec22,0xffcdefe6,0xffa65591,0xff8960b3,0xff8df7b6,0xff89770c,0xff7ee999,0xff93aa51,0xffa476e6,0xffa7727f,0xffd008d7,0xffeaf7bd,0x001c5772,0xfffcbb75,0xfffc9809,0x00075ce7,0x000c2892, -0x0030e7f4,0x00582d44,0x00542df5,0x003e2802,0x00204df7,0x00238b19,0xfffc50cf,0xffd83c73,0xffdafd18,0xffb991e7,0xffa5b483,0xff87f6e5,0xffb57456,0x000ce787,0x0030818a,0x001b3596,0xffbf510c,0xff8e3e5c,0xff97b17a,0xffc7406c,0x00115c68,0x00308b1f,0x00146175,0x00207c83,0x0027f456, -0x0031ead5,0x001aac9f,0x00100456,0x000d68ab,0x00124c28,0xffffdc44,0xffe3a0b2,0xfff43f0c,0x0001f2bb,0xfffbe891,0xfffc3fbe,0xffe1cfca,0xffb83800,0xff82b9f3,0xffab3078,0x0021fe58,0x001962ed,0xff810a79,0xffb48698,0xff9627a1,0xffc0199d,0x0047b5cc,0xfff671f6,0xffbd322e,0xffa58e35, -0xff5a273a,0xff8caf2f,0x003553a8,0x0016d63b,0xffeada62,0xffa35a0f,0xffabdcb7,0xffb43756,0xffc403e3,0xffd836b9,0xffe0f2ee,0xffccba2b,0xffdd427a,0xffe4671a,0xffd89730,0xffd8f30d,0xffeb5e38,0xfffd7635,0x0004ce24,0x0000896b,0xffffe84e,0x00049150,0x0001fcee,0xffe2b10f,0xfff3094e, -0xfff4b548,0xffc03e0d,0xff8b41bf,0xfff1affa,0x0003461c,0x00148619,0xfff75fa8,0xffc90e2b,0x000336c8,0x0014188b,0x0008cd77,0xffee647e,0xffd86e2f,0xffdf7ced,0xffcfaa84,0xffdc092d,0xffe2fbc0,0xfffa278c,0x00064427,0x00096060,0x00118772,0x001db8ef,0x00189457,0x001b52d9,0x001b9c8d, -0x001ef9ee,0x000e2160,0xfffeb3b5,0xfff5a3a9,0xfffc86fa,0x000150e1,0x00008c43,0xfffe0aca,0x0005214b,0x000b8058,0xfff92044,0xfff5c804,0x00203575,0x000675a0,0x000d36ba,0xfff0856b,0xffda515f,0xffce5b6b,0xffa9cc7f,0xff92569c,0xff8dd702,0xffa19cb3,0xffb6a7e0,0xffcab737,0xffd76c4a, -0xffe9d4b2,0xfff65b8f,0xfffc7dd6,0xffffbfd8,0xfffabfda,0xffef9b14,0xffe73775,0xffe0869f,0xffd6b50d,0xffd7e833,0xffe85934,0xfffea191,0x0003642e,0x0004c36e,0xfffb4319,0xfff98830,0xfffb8324,0xffff5988,0xfffe268c,0xfffb0754,0xffefb316,0xfffc8947,0xfffd12a1,0xfffec8df,0xffeb31f9, -0xffcbc6fa,0xffa404c3,0xffa82625,0xffb73d41,0xffcbe087,0xffe2e1de,0xfff352ff,0xfffb1bf4,0x0029871e,0x00486764,0x005bbcc7,0x00511563,0x00414fdf,0x002c7454,0x001ee936,0x000e7a68,0xfffede98,0xfff2118b,0xffe91088,0xffe2c0f6,0xffddee69,0xffe28977,0xffe949e9,0xfffc4f97,0x0009149d, -0x000f12e7,0x00045e9d,0xfffb207e,0xfff66874,0xfff5b554,0xfff74cd7,0xfff311d5,0xfff2891d,0xffe66725,0xffdf7a80,0xffc8bc32,0x001fe9a3,0x002278a8,0x00214647,0x001dbfa3,0x001bcd8d,0x00185c28,0x0018ebad,0x001898e2,0x0013a94e,0x000c4cfb,0x00096ecd,0x00001ef1,0xfff9ca57,0xfff10716, -0xffefe582,0xffed6217,0xffeb3a3a,0xffebd5a1,0xffee390d,0xffeae70a,0xffec0cef,0xfff0f078,0xfff1bca5,0x00017a8a,0x000ec504,0x0021e46c,0x0025899d,0x002c4551,0x002e23c0,0x002af3b1,0x00235ad1,0x001dd041,0x001f77f6,0x0022925c,0x00246fe3,0x002109bc,0x00134a51,0x00112fe5,0x000f1b6b, -0x0008dc40,0x00046efd,0xfffe401a,0xfff7a606,0xfff1b203,0xfff0f426,0xfff1b80b,0xfff1f429,0xfff0facb,0xffef4334,0xffebfed8,0xffec15ec,0xffeba5fa,0xffeb868f,0xffe99135,0xffe9c57f,0xffe4eb2f,0xffdfeffc,0xffe27bb8,0xffde462d,0xffe329ee,0xffde7aa1,0xffdbce4b,0xffe23fc4,0xffe42c74, -0xffe9e94a,0xfff38afb,0xffffb122,0x0005cc3e,0x0007f7d1,0x00093ea2,0x0008a5d1,0x000d5bd1,0xffea8004,0xfff8a46c,0xfff503d6,0xfff2492f,0xfff06e0b,0xffeeb563,0xffed4fbb,0xffeadccc,0xffeaab82,0xffe90f57,0xffe7642b,0xffe67d4d,0xffe5eba4,0xffe545f6,0xffe59052,0xffe564f5,0xffe5831e, -0xffe56b10,0xffe5a7ee,0xffe816f8,0xffda71a0,0xffdc7614,0xffef418f,0xffdb22e7,0xffdcfcdb,0xfff0a7c0,0xfff26dfe,0xfff48987,0xfff748a3,0xfff732fe,0xfff836ff,0xfffbda9e,0xffed995b,0xffebdccc,0x0000d359,0xffeec121,0xffe07f64,0x001dc866,0x001f4ccd,0x00223be1,0x001af4e8,0x001ed6e6, -0x001fed1e,0x0024e50a,0x0024cc65,0x001df292,0x001ec5a0,0x001f86de,0x0025e68f,0x0021af74,0x00217250,0x00202651,0x00243f76,0x00247347,0x0022f299,0x00202603,0x001b4f1d,0x001f1fee,0x001d1380,0x0008ece7,0xffdc59c1,0x0020ad1f,0x00099238,0xffd9c650,0xffdda8cd,0xffdcde4c,0xffdac837, -0xffdf130a,0xffe1212d,0xffe0382f,0x000b023b,0x00241d03,0xffde2095,0x00090047,0xfffa9862,0x0025b418,0x0018c6c0,0x0021cb63,0x00287698,0x0039d0a3,0x00397bfa,0x0027111f,0x0028ba50,0x002aee06,0x003a191f,0x002c80dd,0x002bb7fc,0x002c402c,0x003d1458,0x004233cc,0x003e1492,0x00360e8e, -0x002b9efc,0x002a555c,0x0003181a,0x00180b96,0x001779ce,0x000f0379,0x0008b2f6,0x000559a6,0x000c92bf,0x00120162,0x00043d98,0x000d4efc,0x00080066,0xfff6edab,0x000a630e,0x00055205,0x000178e2,0x001494b6,0x0017e8bd,0x002a29d8,0x0020ee37,0x002d60a4,0x00342abe,0x005377a0,0x0056bc08, -0x0031da4c,0x0031c23b,0x0033470e,0x0058ecf5,0x00411618,0x0040f7ca,0x003b7e2e,0x005383a2,0x0056cd17,0x004cdf9f,0x00393581,0x002d2dfb,0x001b8d39,0x00112646,0x000e96d0,0x0002f4d7,0x00074fb7,0x0002f729,0xffe4029c,0xffe9de00,0xffe30a1e,0xffcc97df,0xffd49012,0xffde9bae,0xffd84b6a, -0xffff0afd,0x00077f24,0xfffae135,0x0011b909,0xfffcc923,0x00191da0,0x00067b90,0x00211b0c,0x003d2ec5,0x0074e701,0x00777c0f,0x004316e8,0x003f5ed5,0x004b7ce5,0x007c752c,0x0050b519,0x004a579c,0x005329bf,0x008af5ea,0x009fe23a,0x00939c87,0x0073297e,0x00547cc2,0x003cdaa8,0x002370eb, -0x002265a9,0x0006859f,0x00100279,0x00072861,0xffd92ad7,0xffe2f9cb,0xffda6d75,0xffd65650,0xffb91fe2,0xffbb3ecd,0xffaf741e,0xffd985f8,0xffefcd19,0xffd80870,0xfff72565,0x0061983c,0x007adae4,0x00a0632b,0x0088583d,0x00333877,0x00474a7f,0x0042d663,0x0036b19f,0x002ac6d4,0x00201a1a, -0x00180e26,0x0049f70d,0x0048256f,0x00028954,0xffdbc322,0xffb7a6ef,0xff9a042d,0xffb211ec,0xffbd7e4e,0xffb4b4b3,0xffa50c88,0xffb3571e,0xffb50deb,0xffe33156,0xfff9a9be,0x001775b6,0x0000ebf0,0x00039f0c,0x000ca1fd,0x0012dbf4,0x0034bb53,0x0056f81f,0x005a04b3,0x004fb37c,0x0038a8ab, -0x005581c2,0x0010a8fe,0xfff775b3,0xffd77882,0xffc9f5ee,0xffac983c,0xffacabd7,0xffddc14a,0x0022be19,0x0047635d,0x00338975,0xffd6f495,0xff964aa9,0xff9bf39f,0xffdc9bda,0x00339a09,0x0073d9d7,0x0087b7a0,0x007afd9d,0x00621dec,0x0048f8bf,0x001b7bde,0x0012023f,0x0018b43d,0x0017530c, -0x0003e093,0xffe7f4e5,0xfff77296,0x000023c9,0xfff94298,0xfffa5f9a,0xffe4aed1,0xffc1bd07,0xff92a68a,0xffc4210e,0x00386eb4,0x0029fbdb,0xff9d0ac0,0xffded32d,0xffa80593,0xfff83af2,0x00fcad29,0x00c669d6,0x00a24c75,0x007cc3ed,0xffd8c893,0xffc9af17,0x0057028b,0x007c7337,0x00739508, -0x0022f3b6,0x000e28a7,0xffeabf06,0xffcbe9e5,0xffdc7430,0xffe585f2,0xffe721f0,0xfff8387b,0xfff26b9b,0xffe54ce8,0xffe6a2b6,0xfff23a78,0x00017fca,0x0004db85,0x00009b44,0x00023516,0x0004e1e9,0x00075033,0xffe6e8f7,0x00037d87,0xfffe7a7a,0xffb3c64e,0xff9f23a3,0xffdfe00e,0x00336336, -0x007ce63b,0x00990c34,0x00b12d5f,0x00ce1595,0x00aedb2a,0x0048b2d2,0x0021f73e,0x00062945,0x001226f0,0xfffe31f2,0x0004f207,0x00056f3e,0x00291a96,0x003e4575,0x00421ff6,0x0045af0f,0x003bbc9f,0x0029a7c8,0x00202d6d,0x0023fa1d,0x00255b55,0x0010bc68,0x0001e8db,0xfff9107d,0xfffdd70d, -0xfffff775,0xfffeced8,0xfffbe3d4,0x00022042,0x0005be35,0xfff79c52,0xfff8b694,0x0003e4e0,0xffe069e1,0x00177c4a,0x004a84bc,0x00895271,0x0081626f,0x00507137,0x00362967,0x001e2439,0x000f6746,0x000c0990,0x00162ec2,0x0035f420,0x003140ab,0x0031b483,0x0032b627,0x0019abc6,0x0006332f, -0xfff849e6,0xffee706b,0xffee14fd,0xfff018ef,0xfff10b61,0x00007b89,0x0009067b,0x0008c6dd,0x0008178a,0xffffd8dc,0xfffc7310,0xffff7d8e,0x00026f6f,0x00020bf0,0x0000ba75,0xfff77b03,0x00024894,0x00076ab1,0x0009c00d,0x00247ae5,0xffbc8e34,0xffda299e,0xffed171e,0xffebb834,0xfff51a96, -0x00011d98,0x00110ac6,0x002d8b43,0x0034bce0,0x003fcf06,0x004a7b2e,0x0053c2f2,0x00559e5e,0x004baf8d,0x0041ed95,0x003037d3,0x00148999,0x0002d884,0xffeff05f,0xffde7bc5,0xffdeb635,0xffe909a9,0xfff9f305,0x000b1745,0x000f78fb,0x000fa1f0,0x00044889,0xfffb06c0,0xfff7af58,0xfffa327c, -0xfffcf263,0xfffa9f9a,0xfff794a5,0xfff48c3f,0xffe94469,0xffe742e6,0x00324d0c,0x002e6d2c,0x002b32f7,0x002e4a29,0x0030ef23,0x00382821,0x003eb9ff,0x004746d4,0x003f45fb,0x00386aac,0x003028b3,0x001c7244,0x0009f18a,0xfff66c28,0xfff5c3f3,0xfff3b569,0xfff20bf6,0xfff79c30,0xfffce4d5, -0xffff82e6,0xfffe7ca4,0xfffc6872,0xfffabaf6,0x00089590,0x0013c6dd,0x002817cb,0x0026cce1,0x002f7afb,0x00305080,0x00286f04,0x001f6105,0x001a0fec,0x001f3a97,0x00259bc7,0x002645d7,0x002a571d,0x0011029b,0x002aea7d,0x00285c03,0x0028279e,0x0025e28c,0x0023e774,0x00213547,0x0020f2b2, -0x0014cc7d,0x000af4d3,0x0002ff4b,0xfffa3a92,0xfff38680,0xffeb9f6a,0xffed2b1f,0xffecc91c,0xffec34bc,0xffea7d11,0xffe6c33f,0xffe881b6,0xffe71232,0xfff24de6,0xfff96782,0xfff604a8,0xfff753e1,0xfffedfa5,0x0002c02a,0x0008da4b,0x000a0c51,0x0012fe40,0x001879dc,0x001a11d4,0x001bf706, -0x00174591,0x001c8fa0,0x0022df67,0x000d0f09,0x000f815b,0x000a0f7a,0x000a7d17,0x0009d343,0x0009a492,0x000930e3,0x0009f51a,0x00052f25,0x00018284,0xfffd0dd5,0xfff9baf4,0xfff64cbb,0xfff1aa75,0xfff2bc6e,0xfff2b2d0,0xfff2e96c,0xfff3c122,0xfff3d8e5,0xfff47297,0xfff99a9c,0xfff18ac8, -0xffd8ab6a,0x0001b683,0xfff74a23,0xffd88f76,0xffdc6742,0xffdfe892,0xffe37811,0xffe6ad6e,0xffe97853,0xffee2901,0x00034019,0x001194f5,0xffe9aecf,0x00016089,0xfffa7c2b,0xffe96be2,0xfff7ec60,0xffe4feee,0xffefc823,0xffedc62d,0xfff3a8d9,0xffed9a9a,0xffea1c52,0xffe32adc,0xffe49512, -0xffe691b3,0xffef92b7,0xffeb7ca9,0xffeb6d82,0xffe9b696,0xffed1935,0xffed7ab2,0xffecbe8e,0xffeaa204,0xffed33d8,0xffe38211,0xfff7f63a,0x0010280e,0x00361c4e,0xffedb6a8,0x000a9b61,0x002b1cc5,0x002c6bda,0x0029fc54,0x00220440,0x00276589,0x0028bea6,0x002348df,0x000a713d,0xffeb48a1, -0x0030e13e,0x00127354,0x00172b30,0xffe4891a,0xffebe603,0xfff20b19,0xfffff6ff,0xfff67eaa,0xffeb9a01,0xffd95fcf,0xffda41d8,0xffdff57d,0xfff55c1a,0xffe8e6a2,0xffe76079,0xffe5e572,0xfff28975,0xfff6fd3c,0xfff4de2f,0xfff357f6,0xfff17603,0xfff04d78,0x001f2aa6,0xfffa5bc8,0xfff718ff, -0xfffbc398,0xfffb5b97,0xffe370f2,0xffeae33d,0xffe8aaa0,0xffe70645,0xffe5ef45,0xffe37435,0xffdf0895,0xffecd034,0xfffb2729,0xffee90e9,0xffe52b42,0xfffbd068,0xfff90488,0xfff22860,0xfffef86d,0x00126269,0x0001543b,0xffedb839,0xffc7ec7b,0xffc6b064,0xffcf70a8,0x0001583c,0xffec3254, -0xffed1961,0xffe46be1,0xfff6912a,0xfff9eb2a,0xfff38370,0xffef514e,0xffe78ead,0xfff89a7b,0x0000a9a9,0xfffad250,0xfff309ef,0xffef2a35,0xfff9592d,0xffce9131,0xffe76a86,0xffcddc5a,0xffc002e7,0xffcb864e,0xffdc5bad,0xffc7885e,0xfff6db92,0xfffbcc8b,0xfff0f471,0xfff2d576,0xffea6bd0, -0xffe867f9,0xffe5afd1,0x0001b856,0x002cac81,0x001e7526,0xfffc47a5,0xffc10254,0xffba8141,0xffcf5431,0x001477bd,0xffeb5d11,0xffdd936a,0xffdce1dd,0x0004af1d,0x001910a5,0x00156c83,0x00112104,0x000ac2d8,0x0015fa1c,0x0024f40a,0x000bf4a9,0x0001981f,0xfffa18dc,0xfff8f819,0xffd37a39, -0xffe2e332,0xffe2eb50,0xffdb79bb,0xffc2a2ab,0xffc1a696,0xffaf9baa,0xffd8d892,0xffe7c3f2,0xffcc4b65,0xffd57d89,0x0054f72e,0x0034e8e9,0x004390a0,0x002d0403,0xffe96302,0xffd8ba63,0xffc447ce,0xffafe673,0xffb16d98,0xffb63673,0xffba778c,0xfff88018,0x00142bf5,0x00050dbe,0xffcc3b23, -0xff9e55e3,0xff69a70e,0xff712e3b,0xff69344a,0xff7d9edd,0xff9fc7ba,0xff9ae021,0xffaa4d5f,0xffe4e35e,0xffff8aaa,0x00127387,0x0003f3b0,0x00062fb6,0x000e42ea,0x00120fba,0x002e997c,0x0046e654,0x004ccce2,0x004acf3b,0x0039d99d,0x0048639e,0xffed5093,0xffc7f2c5,0xffc166fe,0xffb7dee1, -0xffb38e2f,0xff8e05a3,0xffba45e5,0x0016d4cd,0x00300b55,0x0025ba24,0xffdbab47,0xff9a8277,0xff9419f1,0xffbd5d2d,0xfff02500,0x0011a3ef,0x0008eaa6,0x0024cc1a,0x00225405,0x002c6f28,0x001a9e02,0x000aa75d,0x000e1438,0x0008ebc9,0xfffa433b,0xffe97df4,0xfffa6398,0xfffea7f7,0xfff8b758, -0xfff9a51d,0xffe92834,0xffc74c52,0xffa10322,0xffbdbd65,0x00280a2d,0xfffb4462,0xffb865e6,0xffe9d902,0xff9e5aab,0xffc3d1fc,0x0055afbc,0xfffd0c04,0xffc6298d,0xffb5b230,0xff49f7e8,0xff639ba6,0xfff3cc47,0x00018a21,0xffeaa36d,0xff9ae2a7,0xffa31fd1,0xffaf8449,0xffc4acda,0xffd194c3, -0xffcd8560,0xffc7ccdb,0xffde6bd3,0xffe0ab0e,0xffdf1997,0xffe18468,0xfff34af9,0x0003c842,0x000430ca,0x0000a5b7,0x0003ce89,0x0003647d,0x000c2222,0xffe89bd8,0x0009d1f5,0x0002a329,0xffa8dcc9,0xffae6cb5,0xffccc42d,0x0053ce74,0x002be50c,0xfff2b98c,0xff933ced,0xfff3a661,0x00219b8d, -0x0025f32f,0x000444a4,0xffe911e9,0xffef2305,0xffd8f85d,0xffdf754e,0xffe78922,0xfff2255c,0xfff45549,0xfff51ad6,0x00068a9d,0x0015db4b,0x001e019e,0x00286df4,0x001dcca8,0x001c9d21,0x000a0acc,0xfffeb53a,0xfff9835c,0xfffea7db,0xfffede73,0xfffddb9e,0xfffb4705,0x0000833b,0xfffc8d78, -0xfff5e210,0xffe651db,0xffe1cb38,0xffb457db,0x003e594d,0x0009da0c,0xffd9f9d6,0xffdc07b8,0xffb269a3,0xff9cd512,0xff8786c8,0xff8c7a97,0xffa367a1,0xffb757e6,0xffca201a,0xffde1ce5,0xffeca01e,0xfff86d11,0xfffd764a,0xfffe5991,0xfff78da1,0xfff460a8,0xffeaf363,0xffe2ec8f,0xfff1e09d, -0xfff8bb78,0x000c5b06,0x000962b5,0x00058ee1,0xfffe2b34,0xfffea95f,0x0001a283,0x0005055b,0x000322dd,0x00012472,0xfff4fcfe,0xfffdea24,0x00069deb,0x001e698b,0x00189d5f,0xffe494f5,0xffb7e581,0xffb3137b,0xffbaa1b0,0xffb9563a,0xffbe2ce1,0xffc6738e,0xffcdd26e,0x000750c8,0x002bb888, -0x003fe7ff,0x003b3f10,0x0032d4cb,0x0025c3eb,0x00198beb,0x0007a5a2,0xfff31b48,0xffe5144f,0xffe044df,0xffe4225b,0xffe06c44,0xffe6f24a,0xfff5fde0,0x00020592,0x0008a004,0x00081049,0xfffaea7c,0xfff53476,0xfff23bb8,0xfff3e141,0xfff5025c,0xffef9af1,0xffef59bb,0xffe34503,0xffde4d01, -0xffcaca9a,0x00121191,0x000655b9,0xfffb81c9,0xffff9335,0xffff0cd4,0x000523d0,0x0009a510,0x000abff0,0x0009529e,0x00054da3,0x0006509d,0xfffec31b,0xfff9951e,0xfff334d6,0xfff0dc5a,0xffeecb01,0xffec50e1,0xffed99a5,0xffea5e16,0xffebc506,0xfff82c45,0xfffad0b5,0xfffbe561,0x00079834, -0x001748de,0x0027193e,0x002abf08,0x0024a96e,0x002b35d5,0x001d34bf,0x0017c5c9,0x000a92fe,0x000fceea,0x0015d6c7,0x001bf905,0x00122fb4,0x002fbfda,0x001d0590,0x0018caa2,0x001180fb,0x0009478e,0x00010f70,0xfff90710,0xfff32c06,0xfff190d3,0xfff13ad5,0xfff08437,0xffef65c3,0xffee561a, -0xffec4f88,0xffec34bd,0xffeba731,0xffeb0aa3,0xffe96791,0xffe9c96a,0xffe413fa,0xffec620b,0xffe86de3,0xffea3cef,0xfff27781,0xfff2ae55,0xfff035e0,0xfff2ce7d,0xfff7618d,0x000129f6,0x0002e9c9,0x000abd78,0x0013bbe5,0x0013ca01,0x0018a77c,0x0018b862,0x001667aa,0xfffa3b2e,0xfff51e38, -0xfff57bdb,0xfff21c8a,0xfff0a92d,0xffeeb102,0xffecab6a,0xffe94b31,0xffe90d48,0xffe7a9cd,0xffe631b6,0xffe56621,0xffe4ab2b,0xffe3e6c9,0xffe42998,0xffe41f8d,0xffe466ef,0xffe43c86,0xffe5505a,0xffe3f53e,0xffe782ad,0xfff43463,0x000877d5,0xffe8f102,0xfff90780,0x000f5700,0x0010bbe2, -0x00112fb7,0x00104ec4,0x00126773,0x0012ea21,0x001487c6,0x0005407a,0xfff6f8b8,0x0018dcd8,0x0008510f,0xffe0ba17,0x0019d2cb,0x00024851,0x0025e1a9,0x00176712,0x001a82f4,0x001a4e06,0x001e4fdf,0x001e1f1b,0x0018a85e,0x00194b79,0x001a8659,0x0022b0fc,0x001cec9c,0x001c7356,0x001b39b0, -0x001f8079,0x0020136a,0x001f3712,0x001ca309,0x001811c9,0x0021f8e4,0x0000527c,0xffe8e6a9,0xffd17a20,0x000764b9,0xffe87f39,0xffcd4b69,0xffce3fec,0xffccebce,0xffcd08d8,0xffcd7488,0xffce8157,0xffcc0d77,0xffeba004,0x000e9272,0xffd1679d,0xffe6c9e5,0xffddb7d4,0x001edf6b,0x00177480, -0x00193f21,0x001d99ea,0x002a6bf8,0x0029722a,0x001ba943,0x001d3c92,0x00220344,0x0035975e,0x002472f2,0x00225ef5,0x00237d8a,0x0033896a,0x0038ac1e,0x0036ad38,0x002e7345,0x002a548f,0x0022b59a,0xffecab80,0x000d4190,0x00060c98,0xfffff18f,0xfff8e1be,0xfffa12a5,0x00057302,0x00077806, -0xfff2946a,0x0007ef9a,0x0008ac8d,0xffee13a8,0x00048957,0xfff9853b,0xffef19e3,0x000b9936,0xffff4911,0x0025615e,0x0023fa8b,0x0022c214,0x002755a6,0x003c7ec3,0x003c28c2,0x0021ea24,0x00201286,0x00249845,0x005250f2,0x0032cef5,0x0031c740,0x002bdd78,0x0045723b,0x00499da7,0x004396cf, -0x00320728,0x002e77bb,0x0015bcd7,0xfffdd826,0xffffc09c,0xfffab7be,0xfff96fc0,0xfff03034,0xffdffec7,0xffe0e8c2,0xffe871b0,0xffbb5287,0xffdc9ef0,0xffdae105,0xffcd7abe,0xfffaab3c,0x0001dd31,0xffea9ed9,0x0003dbd6,0xffe6b7ed,0x0015717a,0x000a910f,0x001023b4,0x002573a5,0x004cb75e, -0x004a200e,0x00252119,0x00208ef1,0x0036b8ab,0x0075f2bb,0x003e6302,0x002dc949,0x0035d36b,0x006b8aa0,0x00836641,0x007dfc75,0x0064806f,0x00561f9d,0x003af8ec,0x00131753,0x001e9697,0xfff5d00c,0xffffeedc,0xfffd3860,0xffdb3820,0xffeaeae8,0xffe6e601,0xffe508bd,0xffceba82,0xffd1b7f4, -0xffb4d803,0xffe5b701,0xfff0eda3,0xffccfe37,0xffed1bc9,0x00449b7f,0x0076bc34,0x00a936bf,0x008e99ab,0x004b745b,0x00412690,0x0033a4f7,0x0039e6fd,0x002875a7,0x001b850c,0x0016112a,0x004874f8,0x00599322,0x003c34ce,0xfff913f0,0xffca2ced,0xffb6d768,0xffb34616,0xffbc41fc,0xffa5a0f2, -0xff8f51e8,0xffb6db96,0xffb6518c,0xfff90e76,0x00073e2c,0x000c6e5c,0x0006dfc0,0x0007be51,0x000d3a5a,0x0011efa6,0x002a4a29,0x003a8004,0x0049c264,0x004770ed,0x003afd5f,0x0042a5df,0xffe71b86,0xfff796f2,0xfff25e72,0xffd1ee0b,0xffb6a0cf,0xff98e5c7,0xffc055fb,0x00137aee,0x0039de9b, -0x003b48a5,0xfff6ee9c,0xff9db6b6,0xff8ea3e7,0xffc791c5,0x0010d443,0x004fd145,0x00716e79,0x0069437a,0x005c1ce8,0x0034b808,0x000b0ac1,0x00064199,0x000e4bc2,0x00108d7c,0x0000f50a,0xffef1443,0xfffce430,0xfffc68b2,0xfff96c2e,0xfff8c7b8,0xffef62ca,0xffd51034,0xffaeb737,0xffd73afc, -0x002ee665,0x00111195,0xffc3e97d,0x00109251,0xffb7f9e4,0xfff6b9d3,0x00d60ad1,0x009c0656,0x00831e83,0x00760fcd,0xffeb2a34,0xffd414fb,0x00365d53,0x00843833,0x00881075,0x002baa7c,0x0016b444,0xfff35d25,0xffd668f0,0xffdbfeb4,0xffecbbd2,0xffe40813,0xffeec052,0xfff32441,0xffe2bb6d, -0xffeb5137,0xfff7fec7,0x000556b3,0x0002d572,0x00018b1b,0x00042c53,0x00025a9e,0x000c96b1,0xfff0c702,0x000bbbcc,0x0008b5be,0xff9a5579,0xffbbf524,0xffbcf434,0x0074e1da,0x0067f7f2,0x004a720d,0x003c488f,0x00797ccd,0x008c1ee7,0x00734cdc,0x0021ea3b,0xfff65371,0xfff925e3,0xffe9bec5, -0xfff1edef,0xfffc3309,0x00143f5c,0x0023b5ca,0x00304001,0x003b817a,0x003e2609,0x002d5b01,0x001bdb45,0x00221da5,0x00203f5c,0x0009cf1d,0xffff9dd9,0xfffce1ab,0xfffe6247,0xfffdfd57,0xfffe11a6,0xfffba8b3,0xffff1beb,0xfffe0fdf,0xfff7ffb3,0xffee2c6e,0xffc0af88,0xff97cdd5,0x001e28fc, -0x002e6f0f,0x005cb72a,0x005a8ffe,0x003b8d71,0x001bbfb7,0xfffc9846,0xfff0446c,0xffeacdcf,0xfff2f045,0x0007248e,0x000a4c4b,0x0011725d,0x001ae081,0x000e9677,0x00069f0d,0x00045054,0xfff8328c,0xfffa37f5,0xfffc0e67,0xfff96faf,0x000ebafc,0x00154565,0x000d0725,0x000891a4,0x0000573d, -0x0000bb96,0x0003636e,0x00033ba5,0x0003b342,0x0001e7bf,0xfff69890,0xfffaea14,0x0005b8a9,0x0019a79b,0x0036c6da,0xffb20ba9,0xffd3da41,0xfff73aa3,0xffeb4cef,0xffeca524,0xfff05532,0xffff6d9b,0x0016026d,0x00238972,0x002f6901,0x0037e040,0x00409fc6,0x00413a9d,0x00392e3e,0x0030098a, -0x00210c2d,0x000c3f2e,0xfffd87a5,0xfff0d729,0xffe1a82a,0xffe1a9c1,0xffebe65a,0xfff6f225,0x0008ea9d,0x000c7d7b,0x00071d91,0xfffc36b8,0xfff577a2,0xfff85dd8,0xfff8d537,0xfffa143e,0xfff503b2,0xfff1831c,0xffeae1e7,0xffdd63ec,0xffd870da,0x000d1df2,0x000dceb9,0x000ed120,0x000fcd1e, -0x0015234f,0x0021068d,0x002b394d,0x0036976c,0x003117c2,0x002d800a,0x002930c2,0x001c25d4,0x000fc4f5,0x00019e5a,0xfffffd63,0xfffd3f71,0xfffbb42f,0xfffd6206,0x00027a71,0xfffca691,0xfff9f8a5,0xffff495e,0x0002f5e4,0x000df046,0x0016c74a,0x002aa2e0,0x0023b9df,0x00293cb7,0x0020a053, -0x001b4620,0x000cb34f,0x0005ae6d,0x00089709,0x000a5dce,0x00073b09,0x000c07fa,0x0014d69c,0x002f7967,0x002f36f1,0x002d82ae,0x002b15c9,0x0029c221,0x0027f084,0x0028247e,0x001de0a6,0x00154f3f,0x000d9453,0x0004ccd8,0xfffccf62,0xfff2d7e0,0xfff487a7,0xfff48af3,0xfff4ba96,0xfff33246, -0xfff1bb29,0xfff2d90c,0xffe8a9c9,0xfffa740c,0xfffea1f6,0xfffe9034,0xfffe9ba1,0x00093da3,0x000e0319,0x0010fda6,0x000f3bc6,0x001ae861,0x0021c251,0x002098ce,0x002246b2,0x001c3625,0x0020408f,0x0029593b,0x0004a3b2,0x00152dbf,0x000ec9f2,0x000fd0ee,0x00100157,0x000f84f9,0x000ef5e0, -0x000fae7a,0x000bb22b,0x00088a7a,0x0004b743,0x0001bab7,0xfffee634,0xfffac993,0xfffbf1d8,0xfffbb8f3,0xfffbd311,0xfffc8fa2,0xfffc0009,0xfffff622,0xfff4944a,0xffe7e2ef,0xffd7192a,0xffff2742,0xffedccaf,0xffd9a0e0,0xffdb4348,0xffde7591,0xffe2d7f9,0xffe31227,0xffe50c77,0xffe91d48, -0xfff7ae19,0x000b8ec0,0xffe94452,0xfff64c81,0x00022639,0xfff44ccb,0x0011dcde,0xffed754f,0xfff87737,0xfff7cea7,0xfffbce1f,0xfffadf16,0xfff85ed5,0xfff040e2,0xfff163cc,0xfff2c268,0xfffb89d1,0xfff677f7,0xfff68161,0xfff5dbfe,0xfff8277a,0xfff8651a,0xfff828d1,0xfff6262d,0xfff748e2, -0xffecbd17,0x00113a84,0x0021dd37,0x00280212,0x00060c75,0x001d3cab,0x002083c2,0x00243026,0x0022a63f,0x001960f1,0x0023eb21,0x0025caad,0x001f08ac,0x001ed036,0x000504e4,0x0024a64a,0x00258667,0x00218c81,0xfff55e93,0xfff2240f,0xfffb9bfb,0x0005213b,0x000987b3,0x00033261,0xffedefea, -0xffed9e46,0xfff158dd,0x00065c7e,0xfff540b3,0xfff1bbcd,0xfff2eef5,0xfffd3e26,0x00035b8a,0x00041b17,0x0003d446,0xfffd3aff,0x000180e3,0x0024d98e,0x0001f456,0x0006ec7d,0x0000a7ea,0x00018ef5,0xfff3acfd,0xfff7fb38,0xfffbe53b,0xfffa1686,0xfff9bb12,0xfff2b521,0xffeb614f,0xfffb2cf8, -0x0006cebe,0xfffcb82b,0xfff2915b,0x0010532e,0x00074a37,0xfff57d66,0x0008fa1e,0x00129ba5,0x001c16c5,0x0011e48a,0xffe55ebc,0xffe3ef69,0xffe78276,0x001782ea,0xfffc4c05,0xfffcde56,0xfffaac01,0x000802e1,0x000be548,0x0008723f,0x00034d6b,0xfff5e8aa,0x0007eb38,0x000e85ee,0x00010247, -0xfffc7619,0xfff0fd6d,0xfffb0a1e,0xffd87fd4,0xffeda22a,0xffd3e3f2,0xffc7026f,0xffd55bd8,0xffe9a3ee,0xffcb6e30,0x00006051,0x00067708,0xfff97685,0x0000a166,0xfffac94a,0xfff39541,0xffe3a05d,0x00025372,0x001f2179,0x003c61b7,0x002e16a9,0xffea95c8,0xffe148c2,0xfff1577e,0x00310d34, -0xfffd472b,0xffe858a1,0xffef8125,0x00145ff2,0x002e3351,0x00317365,0x002d907c,0x001ac234,0x00257459,0x0027715a,0x0003c7be,0xfffe4537,0xffedf6c8,0xffef6db8,0xffd6cce5,0xffec4448,0xfff0a137,0xffe72701,0xffd99ac4,0xffd61199,0xffb8e57b,0xffe4a034,0xfff359a3,0xffc91c2b,0xffdf5f78, -0x0071770a,0x005694af,0x0059107d,0x004f6408,0x001caef8,0xfffc69bd,0xffe81531,0xffeafb53,0xffcd7169,0xffbe618b,0xffb9d51b,0xfff04252,0x00174e38,0x00230ee0,0xffe0d14c,0xffadd2c5,0xff748ad1,0xff7ba35a,0xff78a153,0xff9ae75e,0xffb29f7a,0xffa65e5c,0xffba529b,0xfffef14c,0x000fe498, -0x0009369c,0x000886fd,0x0006f554,0x000d4196,0x000f28b6,0x00245ce1,0x002e2d2a,0x0040416c,0x004fdfb4,0x004d526d,0x006058f0,0xffede885,0xffd4fd78,0xffbddc9a,0xffbf5b96,0xffbc82ba,0xff9ec607,0xffc80e3f,0x00217336,0x002fe7be,0x002f472b,0xfffc1e8f,0xffa9c01f,0xff93a2d7,0xffbd305d, -0xffe62e69,0x00124ebf,0x0029b4e0,0x003fadac,0x002e147b,0x002925e5,0x0013bf29,0x000503ec,0x000f3317,0x0003eb67,0xfff7e201,0xfff274ad,0xfffdc3b1,0xfffb703d,0xfffa2238,0xfff7c078,0xfff4b798,0xffdd1fbd,0xffc01549,0xffd494eb,0x002acceb,0xfff1f3cb,0xffdfe6d0,0x0021b25d,0xffc1dd94, -0xffebcfc8,0x008f370e,0x00503769,0x00270f18,0x0015f05a,0xff829257,0xff7462ba,0xffdb2316,0x001fede9,0x00278ed6,0xffda5376,0xffcddc7b,0xffc78ead,0xffce5c8e,0xffd3859e,0xffce6f0c,0xffda282c,0xfff027d5,0xffead7dc,0xffea8161,0xffef3201,0xfffcaa84,0x0005a9b7,0x00022635,0x0001fbbb, -0x0004c7fe,0x0001a8f3,0x000c81af,0xfff8d3f9,0x0011bb8d,0x0009a3e5,0xffa96e63,0xffc8cecb,0xffbaea1d,0x0091314b,0x003a8b02,0x00024268,0xffb33073,0x000a7609,0x0044abf3,0x005d85d6,0x002a586d,0x0006c5b7,0x00008932,0xffed02b5,0xffee024e,0xfff40d2d,0xfff89548,0xfff9d356,0xfffe4dd7, -0x00116989,0x001b9bf0,0x0026644a,0x002d7d20,0x0020abf1,0x0019bb05,0x00056ca0,0xfffea20b,0xfffd0463,0xfffe7c6d,0xfffd5292,0xfffd653d,0xfffb74ee,0xfffea804,0xfff83a65,0xfff96213,0xffe2a69a,0xffa33480,0xff756852,0x0061a463,0x003ca7cd,0x001b3ccb,0x0020adba,0xfff9bb22,0xffe5d513, -0xffc0d366,0xffaee2e8,0xffba3895,0xffca5ae8,0xffe45240,0xffeec93a,0xfff9a843,0x0008bc6f,0x00070ff3,0x00072859,0x000283e5,0x00009ecf,0xfffa4bbb,0xfffa0fb0,0x000d4bf5,0x000f32c8,0x001790c1,0x000e0961,0x00066b09,0x0001334f,0x00025ed7,0x0003fc9a,0x00052f06,0x0003ec63,0x00049ddd, -0xfffc4729,0xfffe98b2,0x000ec0f7,0x0034ad1e,0x0051fbe0,0xffedcb31,0xffdf4dff,0xffdd3ff8,0xffd8fa75,0xffc92179,0xffc01373,0xffc4efb2,0xffd25215,0xfffced8b,0x00163ace,0x002230da,0x0027b7f5,0x0029574d,0x0024d5d8,0x001befaa,0x000ad590,0xfff246aa,0xffe56ace,0xffe14cc9,0xffe631dd, -0xffe4e7af,0xffed99bc,0x0001db5b,0x000834b6,0x000779bf,0x00011c97,0xfff71759,0xfff507d0,0xfff397f3,0xfff70241,0xfff686dc,0xfff0ab5d,0xffeef2ea,0xffe6c441,0xffe1c0cc,0xffd99ac6,0x000794db,0xfff44d47,0xffe6d323,0xffeeedb2,0xffef8d0a,0xfffed98b,0x00083ac0,0x000e96a4,0x00103913, -0x00119e8e,0x001568c4,0x000d8f17,0x00068d98,0xffff8286,0xfffb78f8,0xfff8ade8,0xfff55981,0xfff6c981,0xfff15678,0xfff4140c,0x0003e79a,0x0004ff24,0x0006bd25,0x000daf79,0x001b7287,0x00263c2d,0x0026df9c,0x001c0fe3,0x00230bd7,0x0011a52a,0x000db5e5,0xffff00b3,0x0005509c,0x000ba311, -0x00119095,0x00073e2b,0x0035736c,0x002711aa,0x0022ccb6,0x001e4a83,0x0016bfb6,0x00110339,0x000b3e90,0x00087393,0x0003155b,0xfffe5c11,0xfffa3a00,0xfff67b9d,0xfff4231d,0xfff1436f,0xfff18338,0xfff11d7d,0xfff05432,0xffef3a6a,0xffeed02b,0xffeb5c3e,0xfff84826,0xfff693ef,0xfffec106, -0x00056d55,0x000a24e5,0x000d0534,0x000c7e22,0x001203f6,0x0019a9e3,0x001699a6,0x00184bd3,0x001f1f89,0x001dc12f,0x00215bcc,0x00235dde,0x001f1a04,0x000d5234,0xfffe6517,0x00001585,0xfffe40ae,0xfffdde54,0xfffc6d25,0xfffac5ab,0xfff8b810,0xfff71cbc,0xfff5a094,0xfff3c86d,0xfff288b3, -0xfff0fafa,0xffef02ef,0xffef7ebe,0xffef81aa,0xffefc8f1,0xffefce44,0xfff0d85b,0xffede08b,0xfffc5e9a,0x00081ae5,0x000c5a50,0x00010a18,0x001025bc,0x001515c9,0x0015f632,0x0015d21f,0x00139b12,0x001715fe,0x0017b5b6,0x00181200,0x00157406,0x0009be02,0x0018f9de,0x00182194,0xfff14c89, -0x00059d66,0xffeb0619,0x0010e680,0x0006cb5d,0x00078d3b,0x00083584,0x0008571f,0x0006eb01,0x00021ebf,0x00029c5e,0x00044ba2,0x000dec31,0x000758d5,0x0006e04c,0x00061e36,0x00096de7,0x000a3177,0x000a84c7,0x00080793,0x0006401f,0x000d09fc,0xffe9d803,0xffe1a8bf,0xffeec688,0xffec96f0, -0xffde5d5d,0xffe7c103,0xffe64322,0xffe46fca,0xffe38f65,0xffe30c43,0xffe35233,0xffded51d,0xffe1fa02,0xfff3517f,0xffeb64e7,0xffdfae12,0xffdf5a60,0x0005bc37,0x00078fe8,0x000576b8,0x000a507d,0x000d0e5a,0x0008d636,0xfffd4a33,0xfffd6e90,0x0003ba89,0x001a9cab,0x0007c8e7,0x00046905, -0x0005f421,0x0011ef68,0x0016f948,0x0018ad84,0x001276bf,0x00137a9b,0x0009d13c,0xffeeaadc,0xfffde09d,0xfff5b5b9,0xfff2ed47,0xffee09b3,0xffec50f9,0xfff65bf7,0xfff47f30,0xffe29e0d,0xfff8c62a,0xfffd15eb,0xffe5117b,0xfff9572f,0xfff30840,0xffe47640,0xfff84fd5,0xffed9ecf,0x001200e4, -0x0014e662,0x000f7f5f,0x0015f4c9,0x0017fefa,0x000eadad,0xfff90f9f,0xfff49fd1,0xfffb83dd,0x002f2fe9,0x000ccc9c,0x000bf07b,0x0006d60e,0x001b3b88,0x001fcbf7,0x00202331,0x00142173,0x00147ba7,0x00061047,0xfff0f070,0xfff27889,0xfff583ea,0xffe9105b,0xffe3495c,0xffdc723a,0xffde7628, -0xffe517fd,0xffb70d39,0xffe0f35a,0xffdcd5ba,0xffc888d0,0xfff6d759,0xfffc3e1a,0xffe379e5,0xfff45e25,0xffdb13f6,0x00037595,0x0002e0e7,0xffff5f0a,0x0013389d,0x001fd1fd,0x0011f1ad,0xfff146f4,0xffe793c3,0x0002338b,0x004a8ec2,0x000e792e,0xfff55964,0xfffadc2d,0x00249623,0x003e10fe, -0x0044beb4,0x0037dff3,0x0036fd63,0x002724eb,0x0008edc0,0x000f4951,0xffeee3e3,0xffed5453,0xfff27f61,0xffe238a1,0xfff3a1e6,0xfff5517d,0xfff4f8af,0xffe481c9,0xffe590af,0xffc4e1f9,0xffee95a2,0xfff0c313,0xffc9454b,0xffdf29ce,0x00309be8,0x0058cb27,0x0086a66f,0x0073b851,0x004abd72, -0x0018cc3e,0xfffdde95,0x000e267d,0xfffe866f,0xfff66205,0xfff4a618,0x0030b311,0x0058f72b,0x0064caae,0x000e4dbb,0xffd4eb62,0xffbe79ff,0xffa46418,0xffa4fa6d,0xff988315,0xff91e818,0xffb8916a,0xffbf4cc2,0x000ab147,0x000fe856,0x0004823c,0x00085a7f,0x0004cd15,0x00092739,0x0009a1b3, -0x001b2f85,0x001d9def,0x00348a69,0x003d6a71,0x003c67f0,0x00335397,0xffcedea0,0xffee8709,0xfff9d97b,0xffd267f8,0xffc1dd3a,0xff8cc007,0xffab1756,0x000c255c,0x002732ec,0x003790b8,0x00141736,0xffade0fa,0xff8afb9e,0xffb383e4,0xffe66eb7,0x0016de8b,0x0036cfb9,0x003c49e9,0x0039f4ab, -0x0019ce6c,0xffff4277,0xfffbc800,0x00060411,0x00051e11,0xfffaf6dd,0xfff720d4,0xfffe7268,0xfffbdd11,0xfffc506a,0xfff9878f,0xfff8b36b,0xffeb7379,0xffcb3009,0xffe2af06,0x001e2cca,0xfff49218,0xffe838cf,0x0039ec4f,0xffd822f1,0xfff7f01a,0x007f5e83,0x004e0d55,0x00361986,0x0037ab5f, -0xffcf0175,0xffbdc4a5,0xfffc4f48,0x0058878f,0x0065b2b1,0x001413a9,0xfffd4061,0xffe6bb13,0xffdf1683,0xffdc9a67,0xffed8892,0xffe41549,0xffebdae2,0xfff41bce,0xffe5b7db,0xfff2c7dd,0xfffe9705,0x000493f2,0x00016ffd,0x00021ff9,0x00032d5d,0x0001c01c,0x00078029,0xffff0b40,0x000b392b, -0x0009ec50,0xffa342df,0xffd3b887,0xffb01791,0x008eafe2,0x001ec61a,0xffcf48d7,0xff94935e,0xffe2eaa8,0x003171c0,0x0084ab75,0x00280ee3,0xfff6a3be,0xffe2b625,0xffdab970,0xffe03623,0xffedaaf1,0xfff362de,0xfffa3964,0x000b267c,0x001d22b5,0x002e2bc9,0x002a6032,0x001cb56f,0x001e4b23, -0x00158ffc,0x0001f707,0xfffd5d7c,0xfffe922d,0xfffdf1f3,0xfffd9846,0xfffe0db5,0xfffcae1e,0xfffef5a6,0xfffbfe34,0xfffaf7ab,0xffe5a9df,0xff8919d2,0xff66c4f1,0x004311db,0x0021211c,0x00154e95,0x00114e9f,0x000317d5,0xffe60246,0xffc50ead,0xffbbbdcf,0xffbc801e,0xffc7ea88,0xffd2dd61, -0xffdf3d20,0xffed7043,0x0000708c,0x0004b409,0x000905dd,0x000d113b,0x0003d92d,0x00054928,0x0005bab6,0x000682a0,0x00187070,0x001bbb94,0x000eb837,0x0007406e,0x0000be52,0x00036d76,0x0004108a,0x0003814e,0x0003108c,0x0003c6ef,0xfffadf67,0xfff9030a,0x0008bb88,0x002c5ae6,0x004f2ac9, -0xffc6892f,0xffd458e5,0xfff1f182,0xffe4a006,0xffde7c24,0xffda4db2,0xffe5721f,0xfff082c1,0x000ddd43,0x001d791e,0x0023b6e0,0x00267250,0x002328cf,0x001c5de0,0x001406a0,0x00080ee4,0xfffa6ce6,0xfff15d73,0xffee74f0,0xffe8b0ac,0xffe6f2cc,0xffefb7b5,0xfff71546,0x0004533d,0x000652fa, -0xfffea9e9,0xfff72da1,0xfff489c1,0xfff8d664,0xfff8c42c,0xfff871c2,0xfff11e97,0xffed6e11,0xffe2a8ea,0xffd7f225,0xffcfac26,0xffed7619,0xffecbd7a,0xffee27a9,0xffedd51b,0xfff1b792,0xffff4638,0x000a14de,0x0013dc3a,0x0014e338,0x00178bbb,0x001b7908,0x0017df37,0x0014a073,0x000f6ed3, -0x000b4ade,0x00070c23,0x00041060,0x00012933,0x0001e181,0xfff71419,0xfff88392,0x0002a327,0x0009ba08,0x00103d6f,0x00173bd6,0x0024130f,0x001d30ce,0x001c5247,0x001371a4,0x000e792a,0x0000ef09,0xfff80ad8,0xfff8e257,0xfff7e207,0xfff4eb5e,0xfff3e63d,0x001d4e54,0x0027cc89,0x00286622, -0x0024c46b,0x00218b26,0x001fc748,0x001dc06e,0x001d0d66,0x00185d5e,0x0013d49b,0x000f08cd,0x0009a004,0x0003f615,0xfffc6eca,0xfffd5ada,0xfffd94b9,0xfffe162d,0xfffcf80b,0xfffe2e5d,0xfffc47d7,0xfff16152,0x0000c149,0x00023585,0x00078160,0x0007770b,0x0010af39,0x0013f545,0x00138ce2, -0x0011f3ac,0x0019bbc6,0x001ff3a3,0x001ebe71,0x001f706d,0x001c12d6,0x001d5cc8,0x0023f908,0xfffdf3d1,0x0010a9e1,0x000cb922,0x000d19b1,0x000da98e,0x000c92e2,0x000baf9e,0x000b5053,0x000998ea,0x000814b2,0x00063810,0x0004c729,0x00037e3e,0x000162f6,0x000229bb,0x0001daa6,0x0001dc56, -0x000205bb,0x00015d05,0x0005f78e,0xfff35d89,0xffec4b02,0xffed712b,0xfffc0abe,0xfff152d0,0xfff36bf0,0xfff27045,0xfff3ed61,0xfff679e1,0xfff4cf52,0xfff520f4,0xfff6e13f,0xfff6ec50,0x0002a8cd,0xfffbd469,0xfff79d58,0x0003e654,0x000b8346,0x001e9a40,0x000a512f,0x000bcc64,0x000d91b0, -0x000e4c45,0x00130165,0x00121ca7,0x000aa7a1,0x000b04fd,0x000bbbe4,0x0013db76,0x000dac8e,0x000d84b3,0x000db93a,0x000f5194,0x000f9569,0x00102755,0x000dc42c,0x000bbfb6,0x000863ae,0x001cb917,0x0018ee73,0xfffe72f2,0x0017a493,0x00163535,0xfffb2df4,0xfffe8b5a,0xfffe45be,0xfff8a611, -0x0001df1e,0x00039815,0xfffe2ebe,0x001a1694,0x001b2861,0xfffd82d3,0x001b5b9a,0x00104f05,0x0012ce08,0x0007579d,0x000f9a14,0x0012ecc8,0x0024abe8,0x00243bfe,0x0010dce4,0x000f3947,0x00115fa1,0x0024bdce,0x00105429,0x000b5c61,0x000e64cd,0x0016d181,0x001d9377,0x00217d9d,0x001ea4a8, -0x00160295,0x00191460,0x0012e301,0x000b8413,0x00131d09,0x00038c9b,0x00025c01,0x0004c109,0x000681d5,0x000ca682,0x00050a1b,0x000e696f,0x000806f4,0xfff878f8,0x000aace2,0x000b57f6,0x000419fb,0x0007921e,0x00196eaa,0x001de051,0x000cb126,0x001cdd19,0x001c79c6,0x003d3168,0x003d9be8, -0x00162110,0x001247be,0x00116840,0x003d01c1,0x001be953,0x001b688b,0x001cdaf1,0x0027e0e1,0x002c1f21,0x002dbadf,0x0022457c,0x0014cdbb,0x001648ff,0x00115f97,0x000471cf,0x0005e9d2,0xfff33a89,0xfff55c3c,0xffe82a19,0xffecd751,0xffe3b0f1,0xffcf7f77,0xffe38935,0xfff03c60,0xffd5e903, -0x0005c1df,0x000cf204,0xfffbf76f,0x000ca6f7,0x000208ec,0x000aedf7,0xfff6c7a4,0x000b18e8,0x001765c2,0x00586e29,0x005f81a3,0x0025771d,0x0017ebbe,0x00248d2e,0x005c4a19,0x0020eccf,0x0006a6a2,0x0011b4ac,0x0033f915,0x0050ce5f,0x005c71df,0x0050723a,0x0036fecc,0x0031c46a,0x001c3549, -0x0003e644,0xfff9e947,0xffe8c6cd,0xffed46bf,0xffe32ff0,0xfff79bfe,0xfff8a9bf,0xfff3e48d,0xffeea4a8,0xffea301f,0xffccd663,0xfff17c21,0xfffcdf4f,0xffceea1f,0xffee83b2,0x006e4797,0x00758d43,0x0084e928,0x0085cec7,0x00647849,0x00348eab,0x001eb72a,0x0036baeb,0x000a2b89,0xffef366d, -0xffe28e1d,0x0015c291,0x00412b44,0x0056230b,0x000ceb54,0xffd5aef8,0xffa98b08,0xffa46ac9,0xffa7946b,0xffbf29e0,0xffbd90ea,0xffbee1a6,0xffd28050,0x0013d896,0x00162de3,0x000314b2,0x00079f17,0x00035255,0x00090f18,0x0005917e,0x0015874f,0x00176926,0x002e4c59,0x0046f216,0x0050a2c0, -0x006141a0,0xfff106fe,0xfff6f85a,0xffdb51e4,0xffd4b91c,0xffca951a,0xffb0f36e,0xffd274a4,0x0026fdef,0x0031e12c,0x003d807d,0x0025b6b5,0xffc20618,0xff9b5682,0xffc2f83c,0xffeece48,0x0025b786,0x00572067,0x005a08dd,0x003ed604,0x0021db05,0x00067e77,0xffff4eb3,0x000ea1e5,0x0000e0e4, -0xfff8841c,0xfffa8ebc,0xfffe334d,0xfffc9be6,0xfffc8fd9,0xfffb37a8,0xfff958a8,0xfff40b85,0xffda43f0,0xffea2418,0x00258d8e,0xfff8091d,0x000281f9,0x00559cb6,0xfff79f5f,0x0020792e,0x00c11034,0x00ad883f,0x00989f03,0x0087cb29,0xffe89b3f,0xffb7d9ba,0xffe8bfd8,0x005a9224,0x007e2dbf, -0x003e7c08,0x00137400,0xfff09f56,0xffe2a0a7,0xffdfa746,0xffe47541,0xfff8a417,0x00063be5,0xfffd9fa2,0xfff5436a,0xfffbe901,0x00027c4f,0x00035f10,0x00013807,0x00020f22,0x0002850b,0x0001f7ec,0x0004ebbe,0x00028757,0x000de356,0x000886c5,0xffbd5aa3,0xffe34603,0xffb9f7f3,0x00921fb0, -0x002a61e0,0x00052249,0xffe8e364,0x001b5107,0x0059d817,0x00945f0e,0x0055718f,0x002b48d7,0x000b62bb,0x0001d1d8,0xfffda247,0xfffff0c2,0x0003d249,0x000aef92,0x001659dd,0x00261894,0x002aa962,0x002f59e5,0x0029cdd6,0x002285f1,0x00140fd2,0x00010c42,0xfffe0750,0xfffe15d4,0xfffe66a5, -0xfffdc0c2,0xfffe0e9e,0xfffd701a,0xfffec0ac,0xfffb33d8,0xfffcafc7,0xffe68025,0xff7c1069,0xff5d4090,0x0077dae5,0x0071ec8d,0x0067cdcc,0x00621a38,0x0048b823,0x0034bffa,0x000a5cb3,0xffe885d9,0xffe324a3,0xffedaced,0x00089e3e,0x0008329f,0x000ee325,0x001fc8a7,0x0016d0aa,0x0013bb25, -0x0010b71b,0x000df088,0x000f1192,0x0016aa4d,0x002267e9,0x00267fe4,0x001ee601,0x00101726,0x0006c878,0x00021759,0x0002b6b6,0x0003bd61,0x00038e11,0x00025114,0x0003379b,0x0000f5a6,0xffff49f6,0x0014fab4,0x003d1bb0,0x0084b40f,0xffe913e3,0x00054167,0x000fc723,0x00019898,0xffefe2ca, -0xffe20034,0xffe76abe,0xfff925b7,0x000a0956,0x0011727c,0x001239e1,0x001cfccc,0x0023a18a,0x002443bd,0x001f07c3,0x00122656,0xfffbc3bf,0xfff294cd,0xffedffc7,0xffebd816,0xffec4fad,0xfff70ec4,0x0009a2a1,0x000c7bb1,0x00068ff5,0xfffd6d63,0xfff860f5,0xfff713ca,0xfff80372,0xfffb1cdc, -0xfffafccd,0xfff5b352,0xfff201bf,0xffeeafd5,0xffe85284,0xffed0fca,0xffff3546,0xfff0181e,0xffe910ce,0xfff03267,0xfff2971c,0x00057d06,0x00116aa1,0x001c3565,0x0020415c,0x0026e4f7,0x002ca2d9,0x0025ad1c,0x001e1448,0x00168584,0x0010b51d,0x000bfc2d,0x000759d1,0x00074dcd,0x0003a41d, -0x00025bc4,0x000c2bb1,0x000ddfeb,0x001122b3,0x0013ee93,0x001a6a5c,0x00202dcd,0x001bbefe,0x0015c7c5,0x0016d1b3,0x000ad402,0x00052c6f,0xfffab95a,0xffff05fb,0x000295d6,0x000435fc,0xffff6d4a,0x00289291,0x002d59a8,0x002b330a,0x002ae411,0x00276d5d,0x0026b222,0x0025949e,0x0026f9d0, -0x001ef510,0x0016a44d,0x000f9aac,0x00092886,0x0004c0d5,0xfffff3b5,0x0000adb7,0x0000b411,0x00003e77,0xffffa085,0xfffe8ee4,0xfffe5154,0x00026238,0x000b0f63,0x00159882,0x00184010,0x001ea4fd,0x00292368,0x00276bb5,0x002a95c9,0x002b0d8d,0x0028c3ea,0x0026a2b0,0x0026a71b,0x00258d44, -0x0023f48d,0x00279a60,0x00270394,0x001be826,0x0013188c,0x00130c77,0x0013e06d,0x0014b10f,0x0014372b,0x00138bf1,0x0013d51c,0x0010e2e2,0x000f5f33,0x000d49c0,0x000bb5fc,0x0009a2d4,0x0006aa8e,0x00075d1a,0x000746aa,0x0007607a,0x00079d6f,0x0007af76,0x0006d51b,0x0010f1b4,0x001189ac, -0x00012c2e,0x0019642f,0x0019cf9e,0x00085cb7,0x0008523a,0x0008aff8,0x0007dad9,0x000a5afe,0x000b0d95,0x000b3d38,0x00193150,0x001c4c07,0x00096c2c,0x0019d23b,0x000e794f,0xfff09e11,0xffebf4de,0xfff3c74e,0xfff58b4c,0xfff41299,0xfff62bc4,0xfff39694,0xfff100f3,0xffebd096,0xffec2cd3, -0xffedea1b,0xfff7ca93,0xfff1650a,0xfff1131d,0xfff0d0d2,0xfff27707,0xfff3271b,0xfff4b91c,0xfff25cf1,0xfff3ae0d,0xfff0f0fa,0xffeb5c67,0xfff783ec,0x001b1239,0xffe52739,0xfff19efe,0x0012cc7d,0x0010fc41,0x000f9c01,0x000bc708,0x000df0c4,0x000e1858,0x00080df0,0xfff53cfe,0xffe87879, -0x001554ad,0xfff7ee55,0xfffd3d09,0xffee7590,0xfff45784,0xfff39280,0xfff8fc27,0xfff649cc,0xffefd24f,0xffe343a7,0xffe17b14,0xffe76a10,0xfffecde8,0xffec78fe,0xffe7bd0f,0xffe8bc6d,0xffeee39e,0xfff4187f,0xfffa02dd,0xfff75aa7,0xfff8fe4c,0xfff3692f,0x00058fcb,0xfff4e2a0,0xfff31ce5, -0xffef396e,0xffedef6b,0xffe89844,0xffeb22f7,0xffe785b6,0xffe0a311,0xffeec627,0xfff15c84,0xffe43013,0xfff367de,0xfff7bbe6,0xffe9b07a,0xffea3d84,0xfff1428d,0x0000659e,0xfffe1565,0xffffd96d,0x0006a0c9,0xffff65fd,0xfff04df1,0xffd7da80,0xffd166cf,0xffd7ec87,0x000b373d,0xffeb6dd7, -0xffeafa81,0xffe72b9c,0xfff1c5d0,0xfff63bd9,0xfffd59b8,0xfff743a3,0xfff4ea1a,0xfff96969,0xfff40398,0xffefd2f5,0xfff806ef,0xffdf3a75,0xffe2b8ae,0xffe0633f,0xffe48477,0xffe23871,0xffc93523,0xffe51147,0xffe81096,0xffd00a03,0xfff95691,0xfffcddbd,0xffe999bf,0xffefa396,0xffe49e5b, -0xfff2cdd5,0xfff31aa9,0xfff426eb,0x00055d73,0x00086a73,0xfff607c8,0xffcf15e7,0xffbfc28a,0xffd765de,0x001df6d2,0xffe6bad4,0xffc89131,0xffc8e102,0xffe0d474,0xfffb279b,0x000f71de,0x000eabeb,0x0010385e,0x00114a0c,0x0009d31d,0xfffd0319,0xfff2c2b8,0xffe0e04e,0xffec7e2c,0xffec2203, -0xfffb751b,0xfffcd910,0xfffc0cfc,0xfff6b915,0xfff2f486,0xffd9a8d8,0xfff53f62,0xfff558d0,0xffce6ee4,0xffd94525,0x0036c0bb,0x003a01e1,0x00578c5a,0x00555ee3,0x0042e9b4,0xfff3621d,0xffce6efd,0xffe1d800,0xffcff98a,0xffc9c2a3,0xffca77f7,0x00096977,0x0044037a,0x00714183,0x001ac3bb, -0xffdcf60a,0xffb8442d,0xff96d6e2,0xff8e8fa8,0xff9bf272,0xffabfc70,0xffbd6a82,0xffd4381f,0x00150ed8,0x00132568,0x0000afd8,0x000664ca,0x0000ea7b,0x0005514d,0x00027ac2,0x000c4dc9,0x000c5c76,0x001eed07,0x0033ed5f,0x003cf211,0x00355f4d,0xffd41cee,0xffe9aebc,0xffeb9dac,0xffccd669, -0xffc785c1,0xff8b9886,0xffa287ee,0x00078ce1,0x0013c065,0x002cfc5e,0x002b9a3d,0xffc40608,0xff91052b,0xffa46346,0xffc52371,0xffe8c916,0x00038563,0x00159796,0x00134a22,0x0003c3b5,0xfffb281a,0xfff72147,0x00046038,0xfffb1d3b,0xfff80e98,0xfffd2467,0xfffe31da,0xfffe1d21,0xfffdf9d6, -0xfffd6e66,0xfffb761e,0xfffb1617,0xffe64749,0xffeb0d2e,0x001124cc,0xffe2a67b,0x0012c7e4,0x0057e037,0xfff74a82,0xfffa25b2,0x002ece57,0x00196547,0x00029f09,0x0005899a,0xffb2f8d5,0xffa1dcf2,0xffbd6c3e,0x0019f356,0x00336679,0xffffc58d,0xffdfc2d1,0xffd3db7a,0xffe29e7a,0xffdd46e3, -0xffe7f11a,0xffed4886,0xfff5c1b6,0xfff94c36,0xfff10e41,0xfffc6e12,0x00030969,0x000237f1,0x00011ae4,0x000185b9,0x0001668e,0x00019548,0x000297dc,0x00022ccd,0x00099010,0x00051de9,0xffc5cc76,0xffedcc97,0xffb6e42e,0x00654ee3,0xffbfbcee,0xff6bd307,0xff218b61,0xff66aff2,0xffd71005, -0x00758336,0x00379657,0x000cb541,0xffd97b52,0xffd6e8df,0xffd3f5f8,0xffdd1e65,0xffd57c81,0xffd8118a,0xffe89764,0xfffee796,0x00167698,0x0024827b,0x002412d6,0x001aca69,0x000a5632,0xfffd0667,0xfffcb73d,0xfffebfb5,0xfffe4e89,0xfffe2d94,0xfffe9a69,0xfffe1c92,0xfffed01a,0xfffd32dc, -0xfffdc349,0xffe181da,0xff746d85,0xff5d4433,0x007cb7b8,0x0035b86c,0xffe6d877,0xffd95cc1,0xffd5bb1f,0xffc2ee87,0xffa5b35d,0xff99e820,0xff9fc7ee,0xffad5727,0xffb4ae5b,0xffc5847a,0xffd73399,0xfff020a9,0xffffc53e,0x000b8b48,0x00101a82,0x000ecdc8,0x000ef07f,0x0011411f,0x001c00ba, -0x00219041,0x001e2a2b,0x000f0507,0x00054639,0x00017abe,0x0003586a,0x0003217a,0x0002c67e,0x0001efde,0x00035033,0x0000de91,0xfffd3c03,0x0011f9dd,0x003c9b0d,0x006f3e43,0xfff0d633,0xffe2dab9,0xffea74f0,0xffe3b9a8,0xffd7cf9c,0xffce0514,0xffd29493,0xffd272ed,0xfff9d3b7,0x000aefae, -0x000e63fd,0x000acc41,0x0004c6d8,0xffff8179,0xfff9c62b,0xfff1d969,0xffe95e18,0xffe6a4ab,0xffea9273,0xfff0fef5,0xfff0e347,0xfff6a931,0x00003880,0x00036fa6,0x00022377,0xfffaf671,0xfff79cb2,0xfff8737b,0xfffa62f3,0xfffb70ef,0xfffab364,0xfff3655c,0xfff01929,0xffe595d6,0xffe017b5, -0xffd7e6b6,0xffe18fdd,0xffd921d9,0xffd65939,0xffd869c4,0xffd937ba,0xffe57fd9,0xffedb9cb,0xfff30e15,0xfffae03a,0x00037bfb,0x000ef2cc,0x00138b88,0x001838ce,0x001ba986,0x0014fe9c,0x000f7910,0x000a48e6,0x00053251,0xffff772a,0xfff6f921,0x00011e07,0x000a0c9d,0x00112101,0x00122b7b, -0x00176fb0,0x00197d22,0x0016ccd3,0x000dfe9a,0x000d5748,0x0004bfd7,0xfffe8472,0xfff3df23,0xfff3b44a,0xfff2082d,0xfff241a5,0xffe9676f,0x002a0245,0x001a6eaa,0x0019f132,0x00163aa1,0x00125548,0x001050e8,0x000e3f14,0x000cef4d,0x000dea43,0x000d7d23,0x000c392a,0x000b2b81,0x0009ae99, -0x0007af6c,0x00076bfb,0x0007bfa1,0x0007f26a,0x00077880,0x00099568,0x0005abeb,0x00054ee6,0x0009cbb1,0x000bb213,0x00146ed5,0x0016dc63,0x001b8575,0x001b0865,0x001974c4,0x001ab115,0x001935ac,0x001ad275,0x001c01b1,0x001af3c6,0x001c9b6b,0x001bf56f,0x001a0e44,0x000525fb,0x0007ebc6, -0x00099346,0x0008d242,0x0009673e,0x00081723,0x000704b4,0x00059479,0x00061602,0x00066723,0x0006bd7b,0x000724b6,0x00076c5d,0x00077ef6,0x00079746,0x00074955,0x00072f57,0x0006c0e5,0x00069438,0x0007cf4c,0x0000a72e,0x0005063f,0x001382b7,0x00043e3f,0x0008e64f,0x001b9e50,0x00194928, -0x001890b2,0x0017648f,0x001689a4,0x0015a0c6,0x0014a0e9,0x00095370,0x000437ce,0x001a7e8d,0x000bc879,0x0005b7a0,0x001175d1,0x000ecb25,0x00182da6,0x00103d40,0x0012bbce,0x0010df89,0x00178d48,0x0017819c,0x0011d86e,0x00119bcb,0x00123989,0x001a0126,0x00138251,0x00132553,0x001391f1, -0x0014bee6,0x001539c8,0x0016ed2c,0x00144bcc,0x0010c757,0x0014c874,0x000ca79e,0xfffc2e5a,0xffe014bc,0x000d900c,0xfffa2472,0xffde9216,0xffdefaf2,0xffdfa313,0xffdee383,0xffe2bab4,0xffe34137,0xffdfc979,0xffff8a8e,0x00148597,0xffdf0fa3,0xfffc02d1,0xfff252ef,0x0019d1a5,0x000e7bc0, -0x0010e621,0x000f002c,0x0023923b,0x0025f52a,0x001804c5,0x0015dbad,0x00186f40,0x002afa94,0x00173462,0x0011c86f,0x001443c1,0x001a3dce,0x002095b6,0x0027f830,0x0022a9bf,0x001d17cd,0x001a5684,0xfff79d67,0x0008191e,0x000ce333,0xfffb0f83,0xfff770f8,0x00053cb5,0x00035d33,0x000654f2, -0xfffb5e2e,0x000dc3f8,0x000d1e07,0xfff8627d,0x000a2673,0x0002237f,0xfffafc42,0x000ac446,0x000b82f9,0x00213ab8,0x00178608,0x001cc39c,0x0015a207,0x0038fb24,0x003cd518,0x0021fb4e,0x001bae37,0x001af56e,0x00435fba,0x00222246,0x0020d33c,0x0021598b,0x002a83a5,0x002f0e1b,0x0037d05d, -0x00288e94,0x00211d80,0x00120a27,0x0003ec7c,0xfffdfe2c,0x0005b9d4,0xffecabfd,0xffe8d58b,0xfff10aaf,0xffe74e89,0xffee2b51,0xffd7c28e,0xffedb6bf,0xffeee2d5,0xffde40ba,0x0001769c,0x00078030,0xfff2f437,0x0007300f,0xfff8fab8,0x0012666f,0x00029fa7,0x000373ce,0x00018803,0x0044c13f, -0x0053e9f2,0x002e1663,0x001ee548,0x002d701a,0x00617abc,0x00296eb6,0x000ca77d,0x00128b67,0x002ce329,0x0049d15a,0x00608078,0x00509b43,0x003dbb98,0x002a2155,0x0008b64e,0x0003c64a,0xfff58143,0xffe6b493,0xffef2d31,0xfff2c636,0xfffdfbf1,0xfffccfa5,0xfffdf59b,0xfffaf2da,0xfff930c9, -0xffe2c01a,0xfff9d8da,0xfffe926b,0xffd648d5,0xfff215e1,0x00494759,0x006ba4ed,0x00921bdf,0x00975397,0x00841b92,0x0042b69a,0x0026d2cb,0x0048557a,0x001da55a,0x00041ba2,0xfffb3f4b,0x002a520f,0x0059eaf9,0x007740f3,0x002f2ead,0xfff6c454,0xffdab609,0xffc3c181,0xffc91ebb,0xffce1788, -0xffbcfaf6,0xffd580b8,0xffe86c9c,0x001b9aa9,0x00125af1,0xffffc9f0,0x0004951b,0x0000e673,0x00036fb7,0x00018742,0x0006c9de,0x00083e46,0x0017f431,0x002fe717,0x003da250,0x00454e61,0xffea7180,0x000c0dc3,0xfff36494,0xffd74eb6,0xffc32458,0xffa131fa,0xffb5fb26,0x00074524,0x00143a0e, -0x002ea6ba,0x0035f49a,0xffc84d31,0xff927900,0xffad9bc4,0xffe145ec,0x001db25c,0x00583983,0x004f348b,0x003721a3,0x000ca5d1,0xfff4ee85,0xfff796a1,0x0008daa4,0xfffc2b29,0xfff9d7df,0xfffe6369,0xfffe8d75,0xfffeacf6,0xfffe7ff5,0xfffec05e,0xfffca730,0xfffe086f,0xffefb7f0,0xfff677d0, -0x0013d3ed,0xfff82694,0x001d0a83,0x0068cdcd,0x00119f62,0x00285f05,0x009ec06d,0x00b6f4a6,0x00b52c5d,0x00a537e6,0x002538aa,0xffe3a839,0xffdc66fe,0x00607caf,0x00970c5b,0x0072db0c,0x0033069c,0xfffffe4e,0xffe9ca20,0xffe41aa1,0xfff69548,0x000bb5cf,0x000f8c41,0x0009d08e,0xfff9ee62, -0x0002ec67,0x00028943,0x000170a9,0x0000c7c5,0x00012b2a,0x0000e722,0x0000f960,0x00018c37,0x000150c1,0x0007109b,0x00027620,0xffd1a13d,0xfff7e57d,0xffb5c094,0x003bfe0d,0xffe0a1cd,0xffd058d6,0xffe06306,0xffea20ca,0x0028cf89,0x008b1caf,0x005a11ab,0x00318f7a,0xfff25370,0xfff2cc3a, -0xffe9cf18,0xffeb52ba,0xfff13c09,0x00013daf,0x00155a7b,0x00244438,0x002a12eb,0x002a4027,0x001ee556,0x001b5679,0x0007c3bb,0xfffd0571,0xfffd23ec,0xffff3dd2,0xfffed2aa,0xfffeaa64,0xfffef754,0xffff18f8,0xffff072d,0xfffea070,0xfffdd685,0xffe824ab,0xff7604e9,0xff68bcf6,0x007bbcd8, -0x007d3da1,0x006c61ba,0x005174cd,0x004dffb9,0x003a648c,0x001866ac,0xfff5aee0,0xffe4e403,0xffe97574,0xfffc67ec,0xfffa291e,0x00023720,0x00165e1a,0x00125567,0x0011d614,0x0013473f,0x00104b57,0x001877f8,0x0024985b,0x002a9470,0x002fde4f,0x001dc24e,0x000da111,0x0003ad69,0x0000f6df, -0x00022d5c,0x00025f58,0x0001cfd8,0x00011af2,0x00015267,0x0001f73f,0xfffec9d6,0x0016b48a,0x0035707b,0x0091386c,0xffdeaca8,0x000a5eac,0x001dac97,0x000db655,0x0002716d,0xfff604aa,0xfffb1f5b,0x00076a9d,0x0006f1e8,0x00028c32,0xfffc51b5,0x00056fcf,0x000a75e4,0x000b5f4a,0x000b0d2c, -0x00062d40,0xfff9ceab,0xfff5f186,0xfff1e985,0xffed0c0b,0xfff1b6d0,0xfffb0cae,0x000809a9,0x0008c277,0x0003731e,0xfffc2889,0xfffaef8e,0xfffad20d,0xfffc2f50,0xfffe09f7,0xfffdfd4d,0xfff965d0,0xfff46413,0xfff22515,0xffeaeb67,0xfff2a8e0,0xffed2a31,0xffe4d196,0xffe5ca7c,0xffe9a135, -0xffed2d97,0xfffbf8f3,0x0005cbf3,0x00100823,0x00161c6c,0x001ff57f,0x0027a7ac,0x0026a0d7,0x00244382,0x002197de,0x001b3547,0x001556db,0x0010346c,0x000e0662,0x000c2de3,0x00062ac5,0x000a39f8,0x000eb0f7,0x0013fb40,0x001311c5,0x0013c6af,0x00135af7,0x000e7d45,0x000a9da7,0x0008c228, -0x000203be,0xfffc3f22,0xfff5a9af,0xfff50137,0xfff338db,0xffef94c6,0xffee4156,0x00157932,0x001d60ba,0x001e8cec,0x0020b9d7,0x0021393f,0x00246193,0x00271f40,0x002ace20,0x002504e5,0x001df0ab,0x0017c48b,0x0011fd27,0x000d9dcb,0x00096146,0x000a29e4,0x000aed70,0x000b2e8d,0x000b0c82, -0x000a5643,0x000bcda3,0x000b146b,0x00168e59,0x001df987,0x001f2363,0x0024dc2e,0x002fdcd1,0x002df93b,0x002cecc7,0x0028fd3d,0x0027aac1,0x00247bf2,0x0020afd5,0x001f9895,0x001b6356,0x001e253a,0x001e1ad1,0x00178be5,0x00177c23,0x001761a5,0x001963db,0x001af7c2,0x001b2e08,0x001b5a35, -0x001d01ac,0x001a9306,0x0019db70,0x0018b85b,0x0017d68e,0x00167f93,0x00142db5,0x0014aea9,0x0014629f,0x001437f0,0x00146a80,0x0013e06a,0x0014aa0e,0x0015b330,0x000f08cf,0xfffe5617,0x001d2ffe,0x001406df,0x00022c3b,0x00012067,0x0001e249,0x000205fb,0x0002b537,0x0002f48c,0x0002de4e, -0x00103cb5,0x001a5393,0x00016637,0x000f5644,0x001b0866,0xffea7cc9,0xfffa1b67,0xffe857f3,0xfff07fcc,0xffeee849,0xfff0c282,0xffef9d02,0xffed147d,0xffe75ade,0xffe7179b,0xffe8331b,0xfff099a6,0xffeb3a15,0xffeb065d,0xffeb1d06,0xffeafe95,0xffeb7403,0xffee275c,0xffebf8d6,0xffee04f4, -0xffe5aeae,0xfff9559f,0x000b559b,0x0025b1be,0xffeebf53,0x00050c47,0x001f84aa,0x001e4e85,0x001dde2a,0x00199519,0x001e4c20,0x001e8a58,0x00187ad7,0x0008e8e1,0xfff035c9,0x001fce74,0x000d896c,0x0010c4e2,0xffeb006f,0xffedd6a0,0xfff03ccf,0xfff38661,0xfff5c229,0xfff0d229,0xffe2a810, -0xffde7adc,0xffe1d0c2,0xfff5a185,0xffe5b200,0xffdfdee2,0xffdfadd8,0xffe024c1,0xffe59e84,0xffefc700,0xffefaffe,0xffeee85d,0xffee4c97,0x00124958,0xfff3ef13,0xfffa5238,0xfff017e1,0xfff1062b,0xffeff8f4,0xffe8be1e,0xffe6fcd6,0xffe9010b,0xffefe2db,0xfff00670,0xffeb3337,0xfff4eea3, -0xfffdb4ad,0xfff38aab,0xffea978a,0xfffe97aa,0xfffd5572,0xfff4ce3f,0xfffeb464,0x00006663,0x0003965f,0xfff79ee1,0xffdb0363,0xffd1a328,0xffd3a3a1,0xfffe03c2,0xffe4ed83,0xffe45746,0xffe1e6dd,0xffe1c1cc,0xffe5b225,0xfff3bf52,0xffef74a5,0xffe8fab8,0xfff5d23e,0xfffc6f30,0xfff2c51b, -0xfffd57e7,0xffdd7847,0xffe620f1,0xffea2b75,0xffea8324,0xffe3c91b,0xffdf48a0,0xffec08fa,0xfff24e43,0xffde0239,0xfffcc660,0xffff054f,0xfff18932,0xfff40f22,0xfff46d9d,0xfff00e7e,0xffec9eea,0xfff3d116,0xfffbedcf,0x001182a8,0x0008b9ec,0xffdc57ef,0xffc6fc68,0xffd450b8,0x000bd2d0, -0xffe0b964,0xffc1bdb1,0xffbc537d,0xffc23290,0xffdc7780,0xfffe23ec,0x000286b1,0xfffd8ec1,0x000529ae,0x000a9835,0xfff0a953,0xfff8ecc8,0xffde6f66,0xffedab47,0xfff7a94a,0xfffeac40,0x0002640a,0x0002ac11,0xfffe77bb,0xfffc7316,0xffeccdd4,0xfff961d1,0xfffa62cf,0xffd7d1da,0xffdf435b, -0x00449e16,0x00330832,0x0046df95,0x00530bec,0x004e1163,0xfff6b31c,0xffcf7766,0xffe3aa48,0xffc55cd1,0xffb8ec48,0xffb7b8e4,0xffeda010,0x002f2296,0x006b953c,0x00283aa8,0xffed3f35,0xffb9d41e,0xff9b1024,0xff905d3f,0xffb1109f,0xffc81230,0xffcac69f,0xffed7625,0x001688ed,0x000f556f, -0xffffec05,0x00035d91,0xfffec0b6,0x00007035,0x00008d4f,0x0003e9db,0x00037dd1,0x000e2bc6,0x00259112,0x0035e652,0x003b442f,0xffe1d647,0xfff205af,0xffe7b5a9,0xffd3765e,0xffd03e0d,0xff9b154f,0xffa9885c,0x00041ca6,0x0003e13b,0x002027c1,0x0038d50e,0xffd5abf1,0xff99cf2b,0xff9d72e1, -0xffb9de22,0xffdd468a,0xfffa45f0,0x000c1f7a,0x0000b884,0xfff68246,0xfff5c8c3,0xfff534f7,0x0003d7d8,0xfff6e578,0xfffa3967,0xfffec28f,0xfffeec26,0xffffe21a,0xffffe4b4,0xffff545f,0xfffe2289,0xfffea92e,0xfff892bf,0xfff45e51,0x0007545d,0xffe06330,0x003067a8,0x006aee0a,0x0020cfe6, -0x0010ada7,0x001c9582,0x002f91a7,0x001f473a,0x00109334,0xffc1a897,0xff9eb138,0xff974ad1,0xfff9e9b6,0x0028d685,0x001dd655,0xffebae9d,0xffd973f5,0xffea77de,0xffe49d08,0xffeab755,0xfffe11bb,0x00051488,0x00004eca,0xfffb416c,0x0002aeee,0x00034296,0x0000e9d7,0x0000bdde,0x00005a77, -0x00004266,0x00006922,0x000156d4,0x00003726,0x000579eb,0x0001782f,0xffdddf45,0x00034d3e,0xffb959b1,0x000b5015,0xff914fd4,0xff63ead9,0xff2cd3c1,0xff4ad579,0xffae7728,0x0051d578,0x004f1222,0x00358e2c,0xffe698e5,0xffe6e8e2,0xffd8b29d,0xffd8d63b,0xffce40b9,0xffd28617,0xffe01381, -0xfff4d695,0x0008cd56,0x001c8cb1,0x00229031,0x001248f5,0xfffee4ae,0xfffb3413,0xfffddd77,0xffff1a3f,0xfffefff8,0xffff529a,0xffff8c4d,0xffff67f0,0xffff2487,0xfffeaf7f,0xffff6a55,0xffe4b116,0xff7f072e,0xff787b7f,0x00a35613,0x00679ac1,0xfff6e311,0xffd4e856,0xffd62534,0xffc9dee5, -0xffb2fe90,0xffa23126,0xffa47e9b,0xffb1b596,0xffbf7fdf,0xffcd387d,0xffddacb5,0xfff71dbe,0x00065035,0x0010d3a8,0x00133a59,0x00174fd4,0x0018c20a,0x001c5ed3,0x002ae9cb,0x00257033,0x0018197e,0x000a734b,0x0001a713,0x0001ac6e,0x0001e4e0,0x0001459a,0x00010efd,0x0000bb19,0x00016526, -0x0002222e,0x00009206,0x00183666,0x003bd6ae,0x00878ceb,0x00063447,0xfffbd4f4,0xfff3acbe,0xffef9f3a,0xffdfd6dd,0xffd157cd,0xffcea6d3,0xffc91a24,0xffe9d4ec,0xfff5c7a3,0xfff60f22,0xfff422b0,0xfff11d58,0xffee2847,0xffedc8f7,0xffea624b,0xffe426a4,0xffe31fb9,0xffe908f3,0xfff2779f, -0xfff3b29d,0xfffb7194,0x000665f7,0x000271a3,0xffff57c6,0xfffb17ae,0xfffbb2d3,0xfffd9cd5,0xfffd9901,0xffff0898,0xfffe1cd3,0xfff9dd2d,0xfff4d334,0xffee5506,0xffec1412,0xffea36c6,0xffdd53c7,0xffcf8757,0xffcbc7cc,0xffd03eac,0xffd080ed,0xffdadfc7,0xffe09af3,0xffe2b86a,0xffee61f8, -0xfffa94aa,0x00094057,0x00115d2c,0x001933c1,0x0020ee1e,0x0018ffc5,0x00126e10,0x000bd26a,0x00073654,0xffff71dc,0xfffac2df,0x0006d780,0x000bb39d,0x00106cfe,0x000d21d5,0x000f6df8,0x000aa7ac,0x000a9f69,0x00003994,0x0004acef,0xfffb321a,0xfff9bd02,0xffefb9be,0xffee3cb1,0xffebf4bf, -0xffecd7a7,0xffe1cbc5,0x001fc024,0x000753f6,0x00073f6a,0x00058011,0x0002d8c9,0x0001e284,0x00014b62,0x00012d34,0x00047f3b,0x00058c82,0x000606a6,0x00072843,0x0008793e,0x000abaae,0x000a1456,0x000af874,0x000b3550,0x000b6bc7,0x000d3edb,0x00099348,0x0010b08a,0x000f457e,0x0012f80e, -0x001b1fe6,0x001fd5ae,0x00214fae,0x001d7ac8,0x001b5e11,0x001cce8b,0x00153f8a,0x00123f7d,0x00143233,0x00114390,0x001436de,0x0012983d,0x000adc90,0x000b0fe1,0x0001b7d3,0x00063e64,0x00057c51,0x00064317,0x00058c8e,0x0004dcfe,0x000391c3,0x0004cb21,0x000617fa,0x00079534,0x000913d1, -0x000a1c50,0x000b2a5b,0x000af548,0x000abf41,0x000aa599,0x000a0eae,0x000a54fb,0x00090635,0x000c945c,0x0015e8ed,0x00230ed1,0x000d3296,0x00190066,0x002ac6f0,0x002862ec,0x0026988e,0x002368d6,0x00238b69,0x002221ed,0x001f768d,0x00146988,0x0007f81a,0x0021c757,0x001610e7,0x0009032f, -0x000aa72f,0xfff8f115,0x0015df83,0x000b0b87,0x000ccdd3,0x000a3ec3,0x000f448d,0x000f10e3,0x000b87bb,0x000a4ca9,0x000ad07e,0x0011be77,0x000c4c0d,0x000bbfd3,0x000ba8a9,0x000bf825,0x000c8b02,0x000f81a5,0x000cecd2,0x000a1457,0x00109f03,0xfff67a0c,0xffe71a91,0xffddf647,0xfff97199, -0xffe470cc,0xffdc560c,0xffd92e6e,0xffd9f293,0xffdc62ec,0xffdbce9d,0xffdb167e,0xffd8fb20,0xffea63de,0x00018e3d,0xffdb82c3,0xffe5cd71,0xffe2a2a7,0x00117ce1,0x000cdc44,0x000a44fa,0x00065cef,0x00152575,0x0016e43d,0x000f0263,0x000a95eb,0x000d22a0,0x001d8efd,0x000e88bc,0x0008ebaf, -0x00084130,0x0009a927,0x000e9747,0x0019959c,0x001414ef,0x001395da,0x000be009,0xffe87ab3,0xfffe91b4,0x00004fa5,0xfff0697c,0xffebd65b,0xfffdac07,0xfff666d7,0xfff5386a,0xffed54af,0x00018ed7,0x000748d5,0xfff4794b,0x0001e0ff,0xfff7efad,0xfff03ef5,0x0003869b,0xfffb4b5b,0x0019c9d0, -0x00196926,0x00164dd0,0x000e48e6,0x002609f7,0x00267661,0x0018ee3d,0x000cbfc5,0x000c008f,0x002e7eae,0x00151d11,0x00133061,0x000f2788,0x00124d6e,0x00161508,0x0026cc59,0x0018626c,0x0017802c,0x0002c70b,0xfff3f497,0xfff3ac12,0x00009591,0xffe3c27f,0xffe0309f,0xfff5c01d,0xffe5cd7d, -0xfff2b523,0xffe2ba62,0xfff5c3fb,0xffef9251,0xffe8116b,0xfffc526f,0xffff2be5,0xffeb8bd6,0xfffcbc80,0xffeff415,0x000f9e03,0x000ac8f0,0xfffe183c,0xfff6c3a0,0x002676d4,0x0031b7a2,0x001f8906,0x000922ef,0x001533e7,0x00427d00,0x001a36bf,0xfffcbf6e,0xfff5bf66,0xfffe8f5b,0x0017e101, -0x003bad6c,0x00304d63,0x002a70da,0x00138efe,0xfff75998,0xfffe7a2c,0xfff316ac,0xffe6f958,0xfff46a09,0xfffe56f1,0x0000467e,0x00020df8,0x0006df12,0xffffc815,0x00019284,0xfff560ef,0xfffe5a52,0xfffd9253,0xffe075fa,0xfff02e75,0x002ad9c0,0x00510416,0x0087c32a,0x0091a01c,0x008d62ef, -0x003db073,0x001af449,0x003b456f,0x001ab7f6,0x0009220a,0x0003c793,0x003019c7,0x0066794b,0x00908bfa,0x00522d51,0x001a0a49,0x00008489,0xffd5b552,0xffd40e26,0xffcd12b4,0xffbc3554,0xffe55777,0xfff92966,0x0017fac6,0x000961f1,0xffff0f01,0x0001ad3b,0xfffeb6c5,0xfffe6f56,0xffff405f, -0x0001c3a3,0x0000f9d5,0x00081eab,0x001a2a2f,0x0027c220,0x002877b7,0xffe74d08,0x001d45ac,0x0015ea4e,0xffec5731,0xffd1ba4f,0xff9f6c7f,0xffa63d33,0xfff6b5b2,0x0006f90f,0x002cd36c,0x004c0634,0xffe05f56,0xff9f9d62,0xffa4dd4f,0xffd5bba5,0x000af030,0x003a659b,0x0030788e,0x0021c112, -0xfff7f4ac,0xffeb44ba,0xfff4b936,0x000309d1,0xfff95586,0xfffbf99f,0xffffb6a9,0xffff7814,0x0000485a,0x0000b5a6,0x00004e0b,0xffff053c,0x000004fd,0xfffa9758,0xfffed539,0x00056dd1,0xfff94e35,0x003c7d80,0x007a4d8a,0x002f443c,0x0024a42d,0x0047a636,0x0083ac71,0x008ee6fd,0x008063d1, -0x003b3b8b,0xfffe3276,0xffcf3d3a,0x004901d6,0x008665b5,0x00841e98,0x003dc114,0x000a964c,0xfff9628e,0xfff1449b,0x000750fa,0x0014e00d,0x0010d325,0x000d6d03,0xfffcc80c,0x0004d9ff,0x00017c58,0x000091d5,0x00004160,0x000011be,0xffffa577,0xffffdb85,0x00006ccc,0x0000085c,0x0002dc73, -0x00026709,0xffe1097b,0x000b53d7,0xffbae8fc,0xffc834e8,0xff955074,0xff94bf03,0xff9d43f9,0xff967dd1,0xffd7b7d1,0x005cbe09,0x0059a4e0,0x0040ec7e,0xffe88769,0xffee0f09,0xffdebd44,0xffde9575,0xffe213af,0xfff31e15,0x0006e1d0,0x0014cd61,0x001ee9b9,0x001fb559,0x0013f01f,0x000f6b16, -0xfffca17c,0xfffc56a7,0xfffe8abc,0xffffdc89,0xffff566b,0xffffd19a,0x00001e86,0x000033f0,0xffffd283,0xffffa843,0xffffe7b8,0xffee1302,0xff8fb4c3,0xff9607d9,0x008356b0,0x007631dc,0x0039349c,0x000a723b,0x00179495,0x00090642,0xfffa2ff2,0xffea2445,0xffd87a4d,0xffdb7d18,0xffe4b195, -0xffe853a6,0xfff489eb,0x000b30e4,0x000fdaaa,0x00143b12,0x001a4ed0,0x0019adbd,0x0023dae6,0x002c06c6,0x002aab6f,0x002cd7fc,0x0016a089,0x00080198,0x00002d7e,0x0000c43e,0x000108fe,0x0000a10a,0xffffce64,0xffffc7ab,0xffffa27f,0x0001375e,0xfffebb0a,0x0016fb46,0x002c5d0e,0x0083a70b, -0xffe69296,0x00083cd5,0x001a18ab,0x000f6095,0x000893ff,0x000041c5,0x00024a29,0x00036c71,0x0003bcf6,0xffff2540,0xfff88f94,0xfffb2ed1,0xfff9049c,0xfff4c13b,0xfff69495,0xfff81490,0xfff76950,0xfff80d92,0xfff89da2,0xfff3791e,0xfff7667b,0x0000a19b,0x0004aa98,0x000452e4,0x0000ab5e, -0xfffd5471,0xfffe35ff,0xfffe7d2a,0x0000b5b5,0x0000b539,0x000177b8,0xfffeeed7,0xfff9f194,0xfff7d85a,0xfff0ce64,0xfff7d5f2,0xffdb575f,0xffdc8307,0xffe44b90,0xffe45f7c,0xffe8a391,0xfff206da,0xfff8d361,0xffff800b,0x0006bc99,0x0010c5d8,0x0019d065,0x001fe598,0x00251c90,0x002974b0, -0x00230043,0x001c1646,0x00162cd6,0x001210f4,0x0011f35d,0x00086ef3,0x0005f8aa,0x000bdd44,0x00109eb4,0x000cea63,0x0009459b,0x00069536,0x00020840,0x0000d74c,0xfffd28b1,0xfffa6322,0xfff3b649,0xffef6de4,0xffeab0d5,0xffe4815d,0xffdd2599,0xffde1c5b,0x00011ecc,0x0008f1f0,0x000c7e62, -0x000f4f02,0x00122dc5,0x00167e88,0x001aeaf6,0x001f288e,0x001eb750,0x001c9400,0x001a3dc7,0x001799cf,0x0014fea3,0x00130449,0x00132b2d,0x00147c24,0x00155c95,0x0015aa23,0x001625a7,0x00173520,0x000dce66,0x001b38b1,0x001dd625,0x001ef712,0x0021134c,0x0028bc2d,0x002689f6,0x00220cb8, -0x001bda46,0x001bd40c,0x001a451e,0x0014b737,0x0013a41e,0x000e5111,0x000eae82,0x000fbc3a,0x000ce9b8,0x0016fa3c,0x00166a3f,0x00189f58,0x001a5766,0x001af513,0x001b9045,0x001d215f,0x001c65b2,0x001cbd45,0x001d0aaf,0x001d78c5,0x001da348,0x001d1feb,0x001d65d4,0x001d1386,0x001cce8c, -0x001cc122,0x001bb422,0x001ee68a,0x00139060,0x000993dc,0xffff3b3e,0x00187b56,0x000b2cd7,0x00026da1,0x0000a920,0x00012d98,0x0001bcc5,0x000040bf,0xffff5efb,0xfffec5a8,0x0005fb8f,0x00123290,0xfffd982c,0x00036fe5,0x0020d0d2,0xfff3fb50,0x000b6b6b,0xfff104e9,0xfff86b11,0xfff81271, -0xfff81af8,0xfffae34b,0xfff984c9,0xfff45495,0xfff346e0,0xfff393c1,0xfff95de6,0xfff5e27b,0xfff5af57,0xfff577db,0xfff3db74,0xfff3f11e,0xfff76263,0xfff55d37,0xfff60556,0xffedf1a3,0x0009a515,0x0013b7a3,0x001540cd,0x000026db,0x000eb66b,0x00130353,0x0011c830,0x00125fb8,0x00104dfd, -0x0015c13d,0x0016572e,0x0011e57c,0x00136e4d,0x00020f06,0x0011792f,0x0016cdf2,0x0015a8fc,0xfff944b0,0xfff58e63,0xfff9b9a6,0xfff87d87,0x000497f6,0x00042111,0xfff788a1,0xfff19d7a,0xfff21f2e,0xffffbe98,0xfff4eca5,0xffee986f,0xffebb646,0xffe755de,0xffec3b10,0xfff97a60,0xfff9efb7, -0xfff67f32,0xfff833b4,0x0010cf56,0xfffa1eab,0x0005d752,0xfff4c3b4,0xfff5ca86,0xfffd9ea8,0xffeed39d,0xffef96c1,0xfff6834d,0xfffaade0,0xfff94e50,0xfff8512f,0xfffd8945,0x00036af1,0xfffe7b6a,0xfff6cf64,0x000d6c70,0x0007a6eb,0xfffab873,0x0008ab7c,0x0002303b,0x00184ea8,0x00156f96, -0xfffbf2e0,0xffeff297,0xffecf277,0x0008b702,0xfffa9a4c,0xfff963dd,0xfff566f1,0xffebe7fd,0xffee1bb6,0x00019099,0xfffb3a9e,0xfff298b4,0xfff9be9a,0x00033b86,0xfff8436d,0x0003ca87,0xffe29d75,0xffea0bcc,0xfff62cd1,0xffeec5e1,0xffebd3f2,0xfff0b46f,0xfff4b141,0xfffa38ef,0xffee6d57, -0x0000643b,0x00021cb7,0xfff9c74b,0xfffe4492,0x0004250b,0xfffb6ab0,0xfff0f6f4,0xfff8f912,0xfff42694,0x0025cba0,0x002efad0,0x000a289a,0xfff0d115,0xfff2b805,0x0013e033,0xfffbef9b,0xffdfa886,0xffd19475,0xffc71968,0xffde5e5e,0x0009e4b7,0x000cefc8,0x0000dea4,0x00021bf7,0x0005e7ab, -0xffee239e,0xfffc6b25,0xffe468e9,0xfff5fb3c,0xfffeef19,0x0001a1f1,0x0006ba00,0x00039d28,0x0002dcaf,0x00000f8e,0xfffb89cf,0xfffc735a,0xffff3692,0xffe4b942,0xffed1be0,0x004cc25d,0x00362617,0x004ca195,0x006447c3,0x006838ad,0x001732cf,0xfff4820c,0x000be096,0xffe5a835,0xffd5341c, -0xffd4b196,0xfffb35f7,0x00393723,0x0074040f,0x0048718e,0x00128523,0xffd7e8f1,0xffb9c05e,0xffafe7b2,0xffd06d46,0xffdda2bc,0xffe1493f,0x0002f068,0x00117396,0x000798d0,0xffffb479,0x00001584,0xfffd42aa,0xfffea072,0xfffebd81,0x0000d3f3,0x0001352d,0x00031f44,0x0015f16f,0x002678a7, -0x0038b3b6,0xfffce60d,0x0008d58d,0xffe94499,0xffdc81ae,0xffd08440,0xffa97cf9,0xffb0eb99,0xfff99b51,0x00000ecf,0x0022d053,0x004c3af9,0xffefecf1,0xffae607f,0xffa2dec3,0xffc16ce0,0xffec42f0,0x0011df34,0x001a19c1,0x00051b65,0xfff44ca0,0xfff609f5,0xfff96d90,0x00033ca5,0xfff894c2, -0xfffcfd85,0xffff718a,0x00004c79,0x0000fa03,0x0000d7bf,0x00007f00,0xffffa0f9,0xffffa170,0xfffd5c6d,0xfffc6d17,0x0006472b,0xffef71d0,0x004caf49,0x00717d74,0x002e383a,0x0016c0bf,0x0017a906,0x0060516f,0x0065a3dc,0x00470482,0x00004d69,0xffc47959,0xff959c35,0xfffaaf79,0x003c82de, -0x00565b28,0x0015b603,0xfff284ff,0xfff2de99,0xffeea229,0xfff3ca63,0x00115d71,0x0014fce9,0x0007ddca,0x00032589,0x00035847,0x0001a602,0x0000523b,0xffffe69c,0xffff79d1,0xffff8fd0,0xffff8a4d,0x00005910,0xffffa2a3,0x00026059,0x0003cd19,0xffec466f,0x000f86bf,0xffb8d26c,0xff8b05b4, -0xff7de8a9,0xff9277ea,0xff808867,0xff778fe1,0xffafc79e,0x0022ede0,0x005c97ca,0x0057b82d,0xfff99332,0xfff5b245,0xffdc6459,0xffd5fe44,0xffd29d23,0xffdd98ed,0xffe80485,0xfff8775e,0x00021bdf,0x00139860,0x001b48ad,0x00089684,0xfff9c0e8,0xfffd28fe,0xffff3bf3,0xffffa852,0xfffffecd, -0x0000610a,0x00006b53,0x00005e2a,0x000057b8,0xffff541a,0x00010097,0xfff183e2,0xffa2c98c,0xffaa83cb,0x00a25d8f,0x0086f3af,0x001c9dcf,0xffebde1b,0xfff1074a,0xffed788d,0xffe3c3ca,0xffd2e69a,0xffc98a87,0xffcdb515,0xffdbe6a7,0xffe0e99e,0xffed254c,0x0003d32c,0x000a7f4c,0x0010d9c1, -0x00142ab4,0x001d458f,0x0022f53a,0x0029a2b7,0x00366133,0x0027468f,0x00115dfe,0x00052265,0xffff5f41,0x000112a1,0xffffe604,0xffff845d,0xffff78be,0xffff2dce,0xffff45ba,0x0000b37c,0xfffe81a7,0x0016d8e6,0x002ff3dd,0x007e68a5,0x0010c84e,0x0015d3e4,0x000c5c08,0x000b0948,0xfffcaf1d, -0xffed78ad,0xffe5ddbc,0xffdfb18a,0xffeafa3d,0xffed3972,0xffe9fb9d,0xffea91da,0xffe941c2,0xffe65561,0xffe9914c,0xffeb37c4,0xffe8cf1f,0xffeb5803,0xfff02dd4,0xfff78cbf,0xfffbdff9,0x0003da37,0x000cf973,0x0003fc40,0xffff7d7d,0xfffe622a,0xffffce63,0x00018b9f,0x0000afaf,0x00028bb7, -0x00017f88,0x00010c3e,0xfffd2796,0xfffc839e,0xfffacbc4,0x0002c11b,0xffe2bb66,0xffd7e200,0xffd69cdd,0xffdbf0cc,0xffde0511,0xffe5eb9e,0xffe97357,0xffea67bb,0xfff3970f,0xfffd6ee9,0x0007f1b3,0x000fe159,0x00174eb8,0x001f3fa6,0x0018fec5,0x0013524a,0x000d2af7,0x000b6c9b,0x000604dd, -0x000684eb,0x000ec370,0x000e04c5,0x000e6da3,0x0008a469,0x0007891a,0x0000a2c5,0x0000b923,0xfff97ff6,0xfffde735,0xfff6ee68,0xfff70893,0xffefb296,0xffecda61,0xffe99474,0xffe949f5,0xffe28bb7,0x000e7c35,0xfffd80da,0xfffed244,0x00014891,0x0001e928,0x0003c258,0x00065813,0x000975b3, -0x000c1960,0x000cf044,0x000d87ff,0x000e89c0,0x00102599,0x0013d26d,0x0012b6dd,0x00137baa,0x001352ff,0x0013bb91,0x0013bb78,0x0012538c,0x001a1c24,0x00185162,0x001d5e65,0x00205969,0x00249093,0x002462c7,0x001effb2,0x001cd70d,0x001c66fe,0x0013b453,0x000de467,0x000ee303,0x000bad33, -0x000d5867,0x000c0876,0x00037089,0x0016177f,0x00080f42,0x000ce4a8,0x000d4184,0x000e70e2,0x000f035b,0x000f3d7f,0x000f519c,0x000feac8,0x0011360f,0x0012b763,0x00144254,0x00153a61,0x001625bd,0x0015d4f9,0x0015af47,0x0015805f,0x0014fa74,0x00151f6f,0x0012b560,0x001cc74d,0x00230fd2, -0x002315eb,0x001cb1ea,0x002598ca,0x0028ea1c,0x00277f1b,0x0025ea11,0x0022c0bf,0x00237907,0x00223345,0x001f20a1,0x001d7871,0x0014426d,0x001bd77b,0x001cc6dc,0x00173591,0xfff86328,0xffe94df0,0x00013874,0xfffc024a,0xfffbddba,0xfff9ef59,0xfffc181a,0xfffb5aa5,0xfff95fec,0xfff79baf, -0xfff81975,0xfffd6d44,0xfffa7cc9,0xfff9e6b3,0xfff8c42a,0xfff790aa,0xfff7e0f7,0xfffbb6f6,0xfff9c74e,0xfff961a7,0xfffbc67f,0xffe7673b,0xffe56e47,0xfff6e9a6,0xffe6803c,0xffe0e415,0xfff3ffd1,0xffee6538,0xffee6c68,0xfff124cc,0xffef7eaa,0xffeea904,0xffece5d4,0xffe66130,0xffec8bc1, -0xfff26160,0xffe4a082,0xffe8eedc,0xfffb2561,0xfffe47a1,0xfff9c43f,0xfff5acec,0xfffcb38d,0xfffcc8ff,0xfff95be1,0xfff34aa2,0xfff5562b,0x0001b01d,0xfffaa17d,0xfff4f5f3,0xffef660f,0xffea83c3,0xffed81f2,0xfffb4a7f,0xfff90b4c,0xfffca8d2,0xfff4135f,0xffec457b,0xfff2aea3,0xfff45b4d, -0xffe87b0b,0xffe5e846,0xfff3b1b4,0xffe6954f,0xffe2f270,0xffe43ad0,0xfff24b86,0xfff9a1eb,0xfff0da8a,0xfff65493,0xfff16286,0xffe9d62b,0xfff3da3f,0xffef8954,0x00070790,0x000a6bb4,0x00061542,0xfffe5b4d,0x000896df,0x00048c7f,0xffffadcb,0xfff03d54,0xfff00f0c,0x0008e5a9,0xfffef503, -0xfffc67ed,0xfff1dcdb,0xffea294d,0xffeb92cc,0x0002237d,0xfffa0333,0xfffcdcf2,0xffefd0af,0xffea295e,0xffec14cd,0xfffb4328,0xffde400b,0xffe0cf02,0xfff90596,0xffebee1f,0xfff60600,0xfff19ed7,0xfffb3a34,0xfff5b065,0xfff27bc8,0xfff9793c,0xfff84487,0xffe9eeea,0xfff06f1c,0xffeb25d4, -0x00000e66,0x0003b513,0xfff3b642,0xffe97426,0x0002ead1,0x000824fe,0x0002bd88,0xffe8a0d8,0xffef48f4,0x000f6e51,0x0000a4ba,0xffe50dbb,0xffcccab7,0xffbd5f3e,0xffcfe518,0xfffeb061,0x000088f8,0x00067081,0xfff7fda4,0xffeee481,0xfff54215,0xfff52c65,0xffeadb44,0xfffc551a,0x0002c541, -0x000335f4,0x00049be3,0x00046e37,0x0001b85a,0x000302f2,0xffff97a9,0x00000531,0xfffc1169,0xffe95b32,0xffead634,0x0015091c,0x002304d9,0x00585ab3,0x00678df9,0x00725862,0x0020b3ae,0xfffc765d,0x0013fb98,0xfffd868f,0xfff7923f,0xffff3fce,0x0024b503,0x005f234a,0x0094135d,0x0067dd52, -0x0031d0da,0x00094b0c,0xffd44c50,0xffc8f38c,0xffc745b6,0xffc806be,0xffef0987,0x0004c216,0x000db8c9,0x00029b53,0xfffeea90,0xfffef15e,0xfffdf18b,0xfffe2d1d,0xffff015b,0xffff1d93,0x00002281,0x00001537,0x0009457c,0x0012932f,0x001203d0,0xffe7afff,0x0014a43d,0x0015f1ec,0xffeef56b, -0xffdb627a,0xffa0e139,0xff9baa5b,0xffe07e4e,0xfff4f9e8,0x00222c1c,0x00521c7d,0xfff488da,0xffaee675,0xff99d9c4,0xffbcf7ed,0xffe65af8,0x0006f0ea,0x00098cae,0x0004f245,0xffe937b7,0xffed8dd6,0xfff7f6bc,0xfffeb54e,0xfffa5cc3,0xfffe6848,0x000077ae,0x00008284,0x00010403,0x0000d5e9, -0x0000cd43,0xfffffbbc,0x000117b8,0xfffd6921,0x0000c2f0,0xffffd3f4,0xfff6d113,0x004cb24d,0x0071dd2d,0x003e69b2,0x001699e5,0xffef3735,0x003fdfc7,0x00511a4e,0x0039d2c0,0x0025eb96,0xffef9a99,0xffa6f210,0x0004ab39,0x00440c66,0x00670d7e,0x002b897e,0x0005502b,0xfffe20da,0xfff8648d, -0x00093360,0x0011a282,0x000a14a4,0x00087db4,0xffff9e2c,0x00038eef,0x000076a0,0xfffff444,0xffff9aa7,0xffff7ba7,0xffff589f,0xffff8f4e,0xffff7a01,0x00000a77,0xffff51f0,0x000800cd,0xffe6df08,0x001181ab,0xffb1b963,0xff5530d9,0xff738272,0xff83bcf2,0xff6c94a9,0xff624b52,0xff959270, -0x000f53f9,0x004cee55,0x004d3c84,0xffecb156,0xffe8aa0f,0xffced65e,0xffcd441d,0xffca436a,0xffd749e9,0xffe71f31,0xfff583ab,0x0003ceab,0x000c241d,0x00097510,0x000206d5,0xfff77790,0xfffee449,0xffff7690,0x00003898,0x000030b9,0x0000931d,0x00009572,0x0000c619,0x000088c0,0x000095b5, -0x00000fd7,0xfffae15a,0xffb6aba8,0xffc67b81,0x007bbce2,0x006239f9,0xfffbc81f,0xffc31983,0xffd6ded4,0xffcddf71,0xffd066e7,0xffd21084,0xffc3b366,0xffc3b5aa,0xffc60682,0xffd1c501,0xffe1dc90,0xfff7c566,0x0004ddf9,0x000eb810,0x00187534,0x001d46d3,0x002654b1,0x002a2b73,0x0029132b, -0x0021665e,0x000d9961,0x000289bb,0xffff4a10,0x00004655,0xffff74eb,0xffff4f2f,0xfffed060,0xfffef111,0xfffe1f32,0x000031ce,0xfffc8fc6,0x0010aeac,0x00244255,0x005f0e64,0xfffbe43a,0x0009b447,0x001156c4,0x000f77ba,0x000a5770,0x00001d92,0xfff92c4b,0xffec054f,0xfff1a523,0xfff1a329, -0xffeea3a3,0xffeaed19,0xffe394b1,0xffdbc3b6,0xffdf692d,0xffe5594c,0xffed0076,0xfff23bcb,0xfff8a037,0xfffa7be1,0xffff4bdf,0x0005b340,0x000514f2,0x0001b00e,0xffffab43,0x0000329e,0x0000e69c,0x0001b481,0x000250c2,0x0002c4e3,0x00039fd1,0x0002f089,0x0000752a,0xfffedf38,0xfffa1496, -0xfffda96e,0xffd62854,0xffd9d657,0xffe27181,0xffe107c2,0xffe51f17,0xffe86392,0xffeae3e3,0xffeb8dd2,0xfff25d50,0xfff98ce4,0x0001d2f0,0x000ccdb4,0x0017a77e,0x0021a0d1,0x001cde68,0x00175350,0x001272ff,0x000ec815,0x000ea54b,0x00074fb2,0x0003c8ee,0x0007cad7,0x0009854f,0x0005035a, -0x0001a580,0xfffde4e6,0xfffc6ee3,0xfffab592,0xfff9bd39,0xfff7dab9,0xfff36dbe,0xffef6c16,0xffe909b4,0xffe14734,0xffdac0ee,0xffda0985,0xfff9c165,0xfff5afda,0xfffab32c,0xfffdace6,0x00015a2a,0x0004fd37,0x00097eb4,0x000d7a33,0x00126d7f,0x0015e1a9,0x00180a10,0x00197fd3,0x0019e48a, -0x001b78e9,0x001a7103,0x001b78ef,0x001c0eae,0x001c29b3,0x001d3035,0x001c3cd5,0x00144daa,0x001abc53,0x00189fef,0x001a294e,0x0018f083,0x001949aa,0x00162593,0x001071cc,0x000be0b6,0x000a1216,0x00090ef3,0x000652c2,0x0004e552,0x0002c34d,0x00007e66,0xfffea71a,0x0007168e,0x000effbf, -0x00106efa,0x0011a59d,0x00132563,0x00141e99,0x0014ee34,0x0015b20a,0x0016f3ab,0x001869ee,0x001a3f44,0x001c11f1,0x001dcb30,0x001f7683,0x001f0f9f,0x001e9b1f,0x001e271a,0x001d9890,0x001cab5b,0x001f014f,0x0012782f,0x000def49,0x00121992,0x0012d71f,0x000d103c,0x0014fcc1,0x001318cc, -0x00128ec0,0x00120be4,0x000fd61b,0x000e1757,0x000c2cb4,0x0006d87f,0x000a0d06,0x000c01da,0x0004fff3,0x001e070a,0x00004f7f,0x000de419,0x0002220a,0x000283db,0x0003ac2f,0x0000f982,0x0007a40b,0x0007def3,0x0004ae49,0x000253f8,0x0001c61e,0x000484a1,0x00037677,0x00032a11,0x00021052, -0xffffb139,0xffff876c,0x00033a9f,0x0001c957,0x000074c5,0xfffdbc43,0x000b25a2,0x0006d20a,0xfff4902b,0x000716b9,0x0003c273,0xfff64795,0xfff39e5d,0xfff51982,0xfff6d394,0xfff9cf91,0xfffa54f7,0xfff8d1d3,0x00094575,0x000b4130,0xfff298e1,0x0008cc63,0x0003b269,0x00092c38,0x0001923b, -0x000415d9,0xfffd836b,0x0011856a,0x001596a7,0x000e79ea,0x00068fda,0x0004b209,0x000b2f03,0x00078aea,0x0001af6b,0xfffb386f,0xfff3c2d1,0xfff73046,0x00059ff6,0x00061d63,0x0002f897,0x00028c47,0xfffe9e2d,0xfffdb5e4,0x00093623,0xfff4f7b2,0xfff3e6ef,0x00042148,0xfff2d008,0xfff3f685, -0xfffb5171,0x000264d4,0x000283a5,0x000067c4,0x0001ed56,0x000017de,0xffff218d,0x000197e7,0x000e63d3,0x00125618,0x00091943,0x00123976,0x0003049f,0x0027ca0f,0x002de42f,0x002052cc,0x000f7797,0x00084ed3,0x00140b38,0x00136166,0x00115406,0x00087d08,0xfff9b6ac,0xfff9eba5,0x00104dad, -0x0008c727,0x00033da0,0xfffb8d76,0xffff363d,0xfff8bdbd,0x00039d51,0xffe73d5e,0xffeb7b56,0xfffdcf5e,0xfff1f85b,0xfff77d71,0xfffab946,0xfffb7586,0xfffcd576,0xfffaf1cd,0xffff5d56,0xffff9576,0xfff90d54,0x00027b74,0x0005d1ea,0x00093dcf,0xfffe956c,0xfffded73,0xffea7383,0x002cda3a, -0x00451bee,0x00355ceb,0x0017d5d0,0x00108bf2,0x001b79f7,0x001abbab,0x0003ccf6,0xffea8078,0xffd3abad,0xffe4f388,0x0014b620,0x00173652,0x000c1d12,0x000014b9,0xfff9e351,0xfff187de,0xfffb3d9d,0xffeef95a,0xfffef7ab,0x0001f70b,0x0003258a,0x00041ac5,0x000275db,0x00018eb2,0x0000dafe, -0x000073ff,0xffff08c9,0xffffe7d0,0xffee8413,0xfff7e727,0x003ade48,0x003c3973,0x005fcad8,0x0079471f,0x0087abb0,0x0046cefa,0x002a2f22,0x003ff3fd,0x00135230,0xfffea04e,0xffff332e,0x00163f95,0x00499ddb,0x00789d95,0x00655445,0x00380a4a,0xfffffaed,0xffdea25e,0xffd6d671,0xffe6336a, -0xffe50f1f,0xfff6052c,0x000d0116,0x000806cc,0x0001d55c,0xfffee4d4,0xfffed4c0,0xfffe1ecc,0xfffeb763,0xffff5d67,0xffff76cf,0x00005402,0xffff2990,0x00072cff,0x0013d47a,0x00253e30,0x00077b2c,0x0021f407,0x000caaa3,0xfffebd26,0xffe76437,0xffc117cc,0xffba1af0,0xffea5344,0xfffb3a29, -0x0022413a,0x004f13b3,0xffff7d5f,0xffbe8a55,0xffa6c26a,0xffc7788d,0xfff8f458,0x00273a74,0x00263e11,0x00112a8a,0xfff5ca27,0xfff6fee8,0xfffd6e7e,0x00004b18,0xfffb551a,0xffff6241,0x000055f0,0x0000b4c0,0x0000ec5f,0x0000ab14,0x00009257,0xfffff592,0x0000bf87,0xfffee61f,0xfffe1fd4, -0x0004dcdb,0x00018578,0x005b3f04,0x007d62be,0x004a046b,0x002728fc,0x001acfd9,0x008b2eea,0x00aa89bb,0x008516a4,0x004ea97e,0xfffd2c1e,0xffa875a0,0x000889e5,0x00541c5e,0x0087fec8,0x0048b2e7,0x00180e3a,0x0000ee89,0xfffd62d6,0x000417c1,0x001d3039,0x0017e166,0x00097694,0x000385a2, -0x000159e1,0x00008433,0xffffad48,0xffff8c45,0xffff69f0,0xffff683e,0xfffface5,0xffff72e1,0x0000399f,0xfffe6980,0x00075171,0xffeff5da,0x0013623f,0xffb972af,0xff2fd3de,0xff914e1b,0xffd7b1ee,0xffd91ee8,0xffbecb6a,0xffc85e5a,0xfff8e233,0x005e3c1c,0x006f905d,0x0016c58f,0x0007c624, -0xffe47e96,0xffdb5482,0xffdbdb41,0xffea6208,0xfff47cc6,0xfffef436,0xffff6c72,0x0007cfe7,0x000a269f,0xfffecb80,0xfff96f6c,0xfffff783,0xffffde2b,0x00005473,0x000079e8,0x0000b6ec,0x0000920e,0x0000d99e,0x000042e1,0x0001325f,0xffff6cbd,0x00006f6d,0xffcd93ed,0xffdb97ba,0x007c04ad, -0x0085a88f,0x0036c48f,0x00014ca6,0x00069748,0x00079af4,0x000ad5a2,0x00028009,0xffecac4a,0xffe7f2fb,0xfff57d35,0xfff6f910,0x0000c2c0,0x001134ae,0x001103d1,0x001365a0,0x00196801,0x00207906,0x00288f65,0x00301a38,0x0032e44f,0x00209138,0x00091fe0,0x000010e1,0xffff21c3,0xffffd66c, -0xfffef143,0xffff00b9,0xfffeae3f,0xfffefed1,0xfffe1036,0x000055e8,0xfffaf601,0x000c5832,0x00223a7a,0x005d3e36,0x0011bcad,0x002a6c88,0x0027ba86,0x00270ce5,0x001bcf64,0x000cf36d,0x0000e7c4,0xfffab81d,0xfff06f41,0xffea7ea6,0xffe5aaed,0xffe9f105,0xffea2bfa,0xffe5f726,0xffecce45, -0xfff28ca3,0xfff430e8,0xfff7ac2e,0xfffa6fe9,0xfffc0b0f,0x00036089,0x000a24d4,0x000c86c9,0x0003e917,0x00004515,0x00013c62,0x0001e5c4,0x00027c85,0x00024a35,0x00030395,0x0002c4fb,0x00038799,0x0001e690,0x00070b8f,0x00059952,0x00145ba3,0xffea1590,0xffe68251,0xffe924a9,0xffebb614, -0xffeef66b,0xfff56bec,0xfff8fe5c,0xfffb3317,0x0000bb9c,0x0006da02,0x000c12df,0x00120bbe,0x00179ea6,0x001dd01e,0x0019d4ba,0x001561e0,0x0010fc2f,0x00116363,0x0010c8f6,0x0011f4dd,0x001013b0,0x000c0360,0x00094a23,0x00039c89,0x00000719,0xfffb7341,0xfffac682,0xfff8e6ff,0xfffaec83, -0xfff80508,0xfff74cef,0xfff4468c,0xfff04038,0xffeb9596,0xffe8ab16,0xffe85718,0xfff93a8e,0xfff5b5da,0xfff986ed,0xfffff072,0x00044cf8,0x0008d192,0x000e12c0,0x00140395,0x0015745d,0x001618a5,0x0016b350,0x00170ccb,0x0017eb0b,0x001b0028,0x0019f959,0x001ac0a6,0x001a8e18,0x001abab2, -0x001950bd,0x001aa124,0x001cfddb,0x001dc0b2,0x0020714f,0x001d764e,0x001e5a74,0x001d3177,0x00182e04,0x00150dc4,0x00118c9a,0x000c078b,0x00068593,0x00051f67,0x0002db5f,0x000261a6,0x0001fe99,0xfffc3a44,0x00191c1e,0x000edb0d,0x001257e6,0x0013f514,0x00159726,0x00175b9c,0x00189983, -0x001a332a,0x001a2f46,0x001b3776,0x001c61e3,0x001dbfd0,0x001eacd3,0x001f7270,0x001f0327,0x001eb68f,0x001e5572,0x001e0897,0x001daa0c,0x001c0ff6,0x0024352e,0x00234fe7,0x0018e62a,0x002422fe,0x00244170,0x001aff74,0x001a6ce7,0x0019c39d,0x00180c0e,0x00180c9f,0x0016e7ba,0x001465f2, -0x001a75da,0x00198cd9,0x000e9001,0x0017fd9f,0x00221083,0xffe9711e,0xffea18e7,0xffecf1b2,0xfff02792,0xffeebaa6,0xffed760e,0xffedd811,0xffec9c95,0xffeb4cea,0xffe89dc5,0xffe88d1e,0xffeb3c77,0xffebd1b8,0xffeb914f,0xffe987a8,0xffe6fc6a,0xffe6eac6,0xffead9bb,0xffea0e68,0xffebc2bf, -0xffe7b0b2,0xffe83342,0xfff327c3,0x000f78e3,0xffe27be0,0xffee677b,0x000c9410,0x000690c5,0x00059c93,0x0007a0ce,0x00076a0d,0x0007a0d6,0x0006672c,0xfff29753,0xffe57179,0x000a57e6,0xfff43ebb,0xfffb7202,0xffeb5c36,0xfff226ff,0xffef41f1,0xffeae419,0xffedac36,0xffec6602,0xffeac191, -0xffe1c2e0,0xffe191fe,0xffe7e70b,0xffea6977,0xffe5a39a,0xffdbe33f,0xffd20ba9,0xffd35d17,0xffe1c48b,0xffe484bf,0xffe922c7,0xffe39363,0xfff9b21c,0xffec764a,0xfff198d3,0xffe802e4,0xffe746c6,0xffef4c07,0xffdeff27,0xffdd253d,0xffe776e0,0xffececb4,0xfff157e4,0xfff3552c,0xfff0f9d9, -0xfff251c6,0xffed27ed,0xffea9753,0xfff2ead3,0xfffa8452,0xfffd9826,0xfffdfc52,0xfff4a1f8,0xfff92e9b,0xfff289ce,0xfff079a0,0xffdc049b,0xffd90d9b,0xffe3d352,0xffed401c,0xffebf5ca,0xffdce4c8,0xffcbc864,0xffcaca05,0xffe2cca2,0xffe2d000,0xffe579f4,0xffe3a898,0xffeaf2b5,0xffeb07ae, -0xfff93e09,0xffe02afa,0xffe9b972,0xfffd50c5,0xfff7b131,0xfffc5b49,0xfffd1421,0xffffe3bf,0xfffd9b9c,0xfffce58f,0xfffad0a8,0xfff66057,0xfff00c5d,0xffeecfe3,0xfff265e3,0xfff5bdda,0xfffd17c1,0xfff2915d,0xffe4362a,0xfff3418f,0xfff603ec,0xfff51fa5,0xffd43955,0xffcfa1fd,0xffdcce02, -0xffec758d,0xffd7ecad,0xffb265da,0xff8fc210,0xff9ab366,0xffccd23e,0xffdd8a22,0xffe7ba0a,0xffe4647d,0xffef83bd,0xffede3f4,0xfff90a57,0xfff32e1c,0x0003018f,0x00024aca,0x0002b05b,0x000347eb,0x00016140,0x0000e785,0x0000d5a7,0x0000d8bf,0x000110d8,0xfffd226d,0xfff14e30,0xffed0c9e, -0x001a0ffa,0x000ef680,0x00346015,0x0049f773,0x0062c448,0x00161910,0xfff1736d,0xfffb1086,0xffe48b1e,0xffe0fcd1,0xffebd6fa,0x0005a7a3,0x003e2916,0x007995c7,0x006ba11b,0x003f9e02,0x0002eef1,0xffd1ce5f,0xffbebc0f,0xffc8ee28,0xffdc8d34,0xfff4ec94,0x000a5210,0x00042259,0x0000aa24, -0xfffe55a5,0xfffef0d5,0xfffe47d8,0xffff3cbb,0xffff7303,0xffff9a3e,0xffff8d37,0xffffb0b3,0x0001e1d8,0x0008db7d,0x000de9a6,0xfffb4bdc,0x00130c72,0x0012e4fd,0xfffc66cf,0xffeaf8c8,0xffb1dc80,0xffa53677,0xffda0ddf,0xffef0d4a,0x0019f359,0x00497389,0x00052757,0xffc30f12,0xff9899d2, -0xffa8df32,0xffc716dd,0xffdf9816,0xfff09048,0xfff16047,0xffe72dbf,0xfff81690,0xfffcba0c,0xfffd8b23,0xfffd3d3f,0xffffecb3,0x00009ff7,0x0000b6a9,0x0000d5d4,0x00007b48,0x000070b1,0x00001fca,0x0000a455,0xffffcc93,0xfffeac44,0x0001ae01,0xfffd0419,0x005e26e5,0x006e0a10,0x003958a1, -0xfffd1d23,0xffa88398,0x0011896f,0x0030c1ac,0x001655fc,0x001ca386,0xffe75b4f,0xff8e8c42,0xffcc85c7,0x00099153,0x00481cc1,0x0022ee2c,0x000b03b6,0x000533f0,0x000094b8,0x0004385a,0x000af6b7,0x00044854,0x000160b4,0x00020c2f,0x00013d9b,0xfffff52a,0xffffa91f,0xffff71e6,0xffff7e81, -0xffff76cb,0xffffce47,0xffff3ce8,0x00008a60,0xfffd5130,0x00074964,0xfff2ccb5,0x00102c0a,0xffaffe10,0xff02b83e,0xff66d497,0xff92bd1f,0xff63df8a,0xff5ff38b,0xff7915b7,0xffc3e3d9,0x003b281b,0x005903b7,0x0009da93,0xfff14e83,0xffcc3983,0xffc9f9f6,0xffc02ddf,0xffc6ce15,0xffcff91f, -0xffddf9dd,0xffeacbb2,0xfff88259,0x000013c7,0xfff7eb2d,0xfffa0161,0x0000c79e,0xffffb197,0x00009299,0x00007b64,0x0000b877,0x00007f80,0x0000ca49,0x00004b9c,0x00014e3c,0xffff85e1,0x00023b83,0xffe0d8f4,0xffe93ba3,0x005cc1ce,0x003ca699,0xffccf888,0xff9b70f7,0xffa611f7,0xffa9585d, -0xffb9f35f,0xffc919a3,0xffbeb63f,0xffbac881,0xffbaa676,0xffca040d,0xffdb9578,0xffee95c6,0xffff4b10,0x000cb145,0x001950fd,0x00213a10,0x0025bb0e,0x0024f557,0x002455e1,0x0014b905,0x00051fa0,0xffff9a1c,0xffffa0cb,0xffff60ac,0xffff0673,0xfffee805,0xfffedf06,0xfffef6e0,0xfffe5e82, -0xffff6f0c,0xfffcac9d,0x0003bd9b,0x001e5682,0x002fd08f,0x0019a858,0x001127f3,0x0009e06e,0x000fdb34,0x0006d708,0xfffafa70,0xffec0855,0xffd8c979,0xffe04847,0xffe512f8,0xffe5b75e,0xffe0bb3b,0xffd90d90,0xffd0ced4,0xffd7f9ee,0xffdfdfed,0xffe970fc,0xffefe812,0xfff9678c,0x00023e7a, -0x00068d9f,0x00096198,0x00064873,0x0000e103,0x00008899,0x0001be66,0x0001b125,0x0002753d,0x0001fba1,0x000284be,0x0002b13c,0x00035c3b,0x000389fb,0x000459a5,0x00051020,0x000644a4,0xffdc5c00,0xffdc369b,0xffdfe3e6,0xffdea660,0xffe09384,0xffe1f779,0xffe2aadc,0xffe01192,0xffe6377a, -0xffea6578,0xfff0cb1f,0xfffc6090,0x00089382,0x00148efa,0x0011a9e7,0x000e7106,0x000b4dfc,0x000a16fc,0x0008a101,0x0007f6bb,0x0006b52b,0x00059d0f,0x00040747,0xffff4642,0xfffd66da,0xfffad7dc,0xfffc5566,0xfffaa6e7,0xfffbfeab,0xfffb22f8,0xfff963ef,0xfff5a055,0xffef6cac,0xffe7fbb0, -0xffe39452,0xffe04e21,0xfff778b2,0xffe6c791,0xffebb43b,0xffeeee52,0xfff225ff,0xfff42a57,0xfff764ba,0xfffa9003,0x00024460,0x000928a3,0x000e8b46,0x00133515,0x0016a4eb,0x001c0adc,0x001a52d3,0x001af8d8,0x001af8fa,0x001b060a,0x001bc4ba,0x0019d3a6,0x001a5263,0x00155192,0x00114772, -0x001282f6,0x000ff708,0x00098d64,0x00056757,0x0000bf33,0xfffeb4d9,0xfffa0121,0xfff7d15f,0xfff8436f,0xfff67988,0xfff84b8e,0xfff4e78e,0xffeee00c,0x00049736,0x000233d4,0x000640c0,0x000634d1,0x00074f00,0x000869cc,0x00093512,0x0009120a,0x000b8616,0x000d9117,0x001029b1,0x0012c53d, -0x001547c2,0x00183ca1,0x00176c7f,0x00172010,0x0016c78b,0x00161046,0x0015e339,0x00155ac6,0x00124410,0x00164a39,0x0024898e,0x000dd5f8,0x0013e1b4,0x002573dc,0x0023c215,0x0021daed,0x001ff112,0x001e2124,0x001c301d,0x00193074,0x000c3051,0x0003766a,0x0019ae4f,0x000b771b,0x0013d808, -0x0005075c,0x00018c74,0x000c9ab2,0x0006cc7b,0x00086493,0x0003e1e0,0x000af8d3,0x000c0974,0x000bbec7,0x00083a77,0x00072a10,0x000729c7,0x0008d13c,0x000886eb,0x00066153,0x0003d370,0x00037a67,0x0006bc21,0x00062e12,0x00040152,0x0006d737,0xfffe1064,0xfff0fbea,0xffde61ff,0xffff7e68, -0xffefb8ce,0xffe28f22,0xffddf097,0xffdf0c37,0xffe34299,0xffe3a886,0xffe3e231,0xffe51a02,0xfff4ff8d,0x000545df,0xffdd79cb,0xfff1c9e3,0xffee4275,0x000e4f53,0x00090ed6,0x0007b705,0xfffdc31c,0x001065f6,0x001632bb,0x00171b6e,0x000d799b,0x000a660e,0x000a6432,0x000efc77,0x000aa26f, -0x0000c4f9,0xfff7b16c,0xfff8b016,0x0005a3e1,0x0006c3c6,0x00070a49,0x000290d1,0xffea8c5b,0xfffbb446,0x0002bf04,0xfff12c9c,0xffedfa90,0x00013c80,0xfff1fd0a,0xfff366dd,0xfffa7b30,0x0002557c,0x0005597d,0x0002aba8,0xfffff439,0xfff83f38,0xfff905da,0x000373ec,0x00047f4c,0x00148c05, -0x00144f47,0x0014c213,0x00015dee,0x00230ca8,0x002ba4b2,0x002f6678,0x00199b54,0x0010e62f,0x000e272e,0x001bca24,0x001a06a8,0x000b9c76,0xfffb2c3e,0xfff9153b,0x000e5311,0x0008ddfc,0x0009bf1b,0xfff62e4b,0xfff37737,0xfff4a450,0xfffdd236,0xffeac6d1,0xffef498e,0x0000eefc,0xfff83ff0, -0xffffa8f1,0xfffe0c1b,0xfffeff5b,0xfffd089d,0x000082a5,0xfffd757b,0xfffb4f3a,0xfff544c9,0xffffcd76,0xffff0e78,0x000f86c6,0x000c01b7,0x00000cf8,0xffe45b43,0x001bdc69,0x0037847f,0x0042fd24,0x00218d8a,0x0013dd3e,0x000cad23,0x002358ae,0x001442eb,0xfff0b437,0xffd185c1,0xffd9d9a9, -0x00063f02,0x000d40a9,0x000c3070,0xfff73779,0xffecb384,0xfff568d7,0xfff8ecde,0xfffa03ed,0x000429fc,0x00012e13,0x0002895a,0x00011d6b,0x00008cef,0x0000b517,0x0000be48,0x00001d37,0x00009a41,0xffffff51,0xfff64573,0xfffb8ac8,0x002015ab,0x0031a379,0x005b42f4,0x0071c17b,0x008b6a0d, -0x00577cba,0x003fbcb4,0x00516569,0x002e738d,0x001f7c09,0x0022bb3b,0x002c3078,0x005337b8,0x0077fada,0x007bc9ee,0x00591815,0x0024f52d,0xfffc046d,0xfff1863f,0xffeb6289,0xffe3e105,0x000361bf,0x000abf3f,0x000149de,0xffff9aa8,0xfffeb4e1,0xffff2216,0xffff3d82,0xffffc2f1,0xffff97d9, -0xffffb891,0xffffcb3a,0xffffc005,0x000054ec,0x000588fd,0x001108b4,0x000b3f1b,0x002a47bf,0x001f4491,0x000e6cf0,0xfff415da,0xffce2e74,0xffbf7b5d,0xffddd7ac,0xfffc3f4b,0x00260e8d,0x004fa81a,0x00114e96,0xffd506b2,0xffb0195a,0xffc77668,0xfff2493d,0x001e5913,0x001cb98d,0x00133f0d, -0xfff734b1,0xfff97603,0x000035c1,0xfffd0764,0xfffe9d22,0x000074dd,0x00009337,0x00008d09,0x000069ba,0x00003141,0x00004ef4,0x00002320,0x00005162,0x00004425,0xfffef718,0x0001499a,0x000c58de,0x00569ac8,0x006f298c,0x004734f9,0x001e4590,0x00047971,0x007d7812,0x00acdbcd,0x0087fbdc, -0x0076a58c,0x00263981,0xffbf64dc,0x000b929f,0x0053c631,0x0095b769,0x006c0eab,0x003cf6d4,0x00149aea,0x000ee6c0,0x0014b82b,0x001c28b9,0x000d49ba,0x0005d9dd,0x0001244f,0x0000c1e9,0xffff87ae,0xffffa658,0xffff822a,0xffffb6af,0xffffaa19,0xffffe125,0xffff51ac,0x0000937f,0xfffd6eca, -0x00056e63,0xfff59171,0x000d8c04,0xffadcb0c,0xfefda60e,0xffab1190,0x0002c523,0x000b376c,0xffe947c8,0xffd06593,0xffcaf947,0x0041ec55,0x00670215,0x002ab364,0x000a8d6e,0xffe28d3e,0xffde56d5,0xffddcd90,0xffeb4fc9,0xfff5fdbe,0xfffc6021,0xfffac9e0,0xfffa8944,0xfff75f94,0xfff8ab25, -0xfffc86f8,0x00010afb,0x00001605,0x0000ab5b,0x00008319,0x00008533,0x000057e7,0x00009e4c,0x00004fd9,0x00011135,0xffffcbbc,0x0002e0b7,0xfff00516,0xfff57bb8,0x0032c68c,0x004b4744,0x0027e4f2,0xfffb7c03,0xfffe419c,0x0000a1b9,0x000e73c9,0x0012ed62,0xfff784dc,0xffea9244,0xfff0993c, -0xfff3c287,0xfffe4582,0x000a5206,0x000bd612,0x0010ccf4,0x001d452a,0x00228407,0x002ba38e,0x002fd0c4,0x00258e6b,0x001639c8,0x00025e0a,0xfffe7bbb,0xffff6cd4,0xfffefd54,0xfffeee7f,0xffff2d87,0xffff1e91,0xffff316c,0xfffe8e26,0xffff57ac,0xfffd9f3c,0xfffeb95e,0x00127d0f,0x00297a99, -0x000b5ceb,0x002e33a8,0x00340b73,0x00320410,0x002961a5,0x001cfc74,0x000f3c40,0x0007c150,0xfff0d17e,0xffe6f864,0xffe1ced5,0xffe6d27d,0xffe6f49d,0xffe1e893,0xffec53ac,0xfff4eba8,0xfffa8968,0x000091d2,0x00042c45,0x0003cd20,0x000a15fe,0x000d4b6a,0x0007ffcb,0x00026e38,0x00014759, -0x0002501a,0x00022e60,0x0001cb11,0x0001ad57,0x0001f8a4,0x000265b9,0x0002f9db,0x00025c3c,0x0007d294,0x00098844,0x00168fd1,0xffeb6e51,0xffeefc0f,0xfff565c0,0xfff3d941,0xfff7aec7,0xfffb6a14,0xfffe0acf,0xffffcf2d,0x000205b8,0x0003fc9e,0x00047864,0x00082bbc,0x000be24f,0x000fa104, -0x000ed53a,0x000cfc9d,0x000b8b69,0x000d3a52,0x001012d1,0x001165de,0x00091775,0x000487ed,0x0001a470,0xfffe1dec,0xfffaccbd,0xfffa800c,0xfffa6e76,0xfffc07e4,0xfffc3cc9,0xfffbf99e,0xfffa67ff,0xfff98802,0xfff4652b,0xffeedfc3,0xffe79312,0xffeb7148,0xffe6b1c2,0xffef1f26,0xfff50565, -0xfffc245d,0x00023e78,0x00074852,0x000d3baf,0x0013a9b2,0x00152349,0x00169e89,0x0017fd8b,0x00185dd1,0x0018c21b,0x001ac610,0x001a346e,0x001aeac0,0x001b10dd,0x001b5090,0x001a240a,0x001caac4,0x001841bd,0x001a604e,0x0018b380,0x0012e142,0x00109b09,0x000e9aff,0x000adadb,0x00070489, -0x00027614,0x0000666d,0xfffd32e6,0xfffa06f2,0xfff8aa91,0xfff5e85a,0xfff5ca14,0xfff4b8da,0x000ef608,0x000f4c90,0x001026c8,0x0012338b,0x0013d05c,0x0015f4a7,0x00179440,0x0019a5b0,0x0019815e,0x001a34c0,0x001b0822,0x001c303d,0x001d2d6a,0x001dfbd1,0x001dc028,0x001d9600,0x001d4fcd, -0x001d43a0,0x001cb13a,0x001d0740,0x001c49ce,0x0015c3ff,0x000b3f58,0x001bb3de,0x00144c7d,0x0009d7aa,0x00096345,0x000919fa,0x0008623c,0x000751bd,0x000625c4,0x00048a61,0x000b27b1,0x00117a39,0xffffc76c,0x000833e2,0x0020994e,0xffe8e645,0xfff7ed02,0xffe76869,0xffef42e8,0xffedd6c7, -0xffec473c,0xffedff23,0xffed934e,0xffed9394,0xffea0553,0xffe927c7,0xffe89708,0xffec21d7,0xffec24d9,0xffe98df6,0xffe6481f,0xffe5ba14,0xffe8bd18,0xffe9015c,0xffeaf3f8,0xffe3b434,0xfff5ddc4,0x0002f7d3,0x0013bf86,0xffeeb748,0xffffba8f,0x001259d1,0x000cf9bf,0x000c090a,0x000eabc7, -0x000fb1f6,0x0010fd3c,0x001109db,0x00027cfc,0xffef3d0d,0x0010aa60,0x0005b240,0x000a9c9a,0xffeb0d28,0xffef0754,0xffef1e8f,0xffe98987,0xffefb0d1,0xfff0e468,0xfff2487d,0xffe75f99,0xffe425f6,0xffe2b347,0xffec6617,0xffe8d286,0xffdd00c4,0xffd10edd,0xffd0c033,0xffdcbc01,0xffe2d654, -0xffe5c722,0xffe499d6,0x000381e6,0xffef9b0a,0xfff7f137,0xffed3660,0xffec8b9b,0xfff30026,0xffe5a9f2,0xffe6b977,0xfff28f4f,0xfff3bdd9,0xfff45da7,0xfffbaadb,0xfff3e7a2,0xfff7625e,0xfff6e971,0xffed8499,0xfffecb18,0xfff7c295,0xfff5e8bc,0xfffc1f67,0xffef4d11,0xfffc438e,0xfffb6f55, -0xffff0f62,0xffe79fa8,0xffe05dc0,0xffda6646,0xfff265e9,0xfff219b4,0xffe186bb,0xffcba5fa,0xffc81ed2,0xffdbd46b,0xffe09716,0xffe13784,0xffe48f21,0xfff2e158,0xffefd6c2,0xfffa43b2,0xffe9bf64,0xfff5d577,0x0001d66f,0xffff504f,0x00024daa,0x00023f39,0x000189b8,0x00011326,0x00020dc8, -0xfffe3a55,0xfff84d43,0xfff80357,0xfff4c088,0xfffd5517,0xfff294f8,0xfff4a9e5,0xfff2288f,0xffde90b2,0xfff77725,0x00047142,0x000cef13,0xffe86e87,0xffd6c2dd,0xffcb9cbc,0xfff15a0b,0xffe6123b,0xffbc193b,0xff916dc2,0xff943fec,0xffbefde9,0xffd70f04,0xffdeedb8,0xffe07031,0xfff28e5a, -0xffed187f,0xfffcc0ce,0xfffc4378,0x00052b6c,0xffffb16e,0x0000b0bb,0x00000510,0xffff501d,0xffffb88b,0xffffac4a,0xffff5a0c,0x0000ef1b,0x00003355,0xfff758ee,0xfff3823b,0x002078e3,0x0009913f,0x0018e8cb,0x0031c767,0x0056c4dc,0x001f89f6,0x0003f899,0x000632c3,0xfff03573,0xffec64be, -0xfff5f7b6,0xffff2ba7,0x002a0947,0x005c57fb,0x006b1292,0x004cb64b,0x0005c5fd,0xffdf561f,0xffc9c080,0xffd91108,0xfff0f54d,0xfffccff0,0x00096152,0xffff36a1,0xffff7975,0xffff19ee,0x00000399,0xffffafa7,0x00004ea3,0x000007a3,0x00003203,0x00001437,0xffffac59,0x00004cd0,0x0003122e, -0x000d1ca6,0x000b138f,0x000f015d,0x000f904b,0x000f0915,0x000332ec,0xffd2d746,0xffc05995,0xffdacaa6,0xfff336b2,0x0019a98f,0x004329c8,0x001b3e50,0xffe534bd,0xffb1e34d,0xffb014d4,0xffc4109b,0xffdb18af,0xfff0e92e,0xfff24d69,0xfff29672,0x00029e56,0x000008c5,0xfffdb2dc,0xffff25d9, -0x0000d5da,0x000038a7,0x00003955,0x000019e0,0xfffff491,0xfffffcae,0xfffffa28,0xfffff78e,0x00009bdf,0xfffea5d2,0x0001895d,0x0002adc7,0x00576589,0x006697e3,0x003df700,0xffff64d1,0xffacabb3,0x0013cd23,0x003a1153,0x001ae96d,0x00241c4b,0xffeddf11,0xff9452e8,0xffba45e0,0xfff3201e, -0x003d6d32,0x00319504,0x002306af,0x0013eb5d,0x000f511d,0x0007182b,0x000b5d47,0x00041e7a,0xfffe6d0f,0x0003027f,0xffff6179,0xffffe85b,0xffff9342,0xffffd84b,0xffffda6f,0xffffef17,0x00000761,0xffffb7a5,0x000056b0,0xfffe5c87,0x00030817,0xfffaaeed,0x000ab0d8,0xffb24238,0xff0065b9, -0xff900d82,0xffd0d2ec,0xffa3fc8d,0xff9f8225,0xff95ee25,0xff9b2860,0x00221e5f,0x0053a0f7,0x0029ded9,0xffff4cf3,0xffd48c54,0xffd07ac4,0xffc4d6b7,0xffc82c3e,0xffcd1a09,0xffd7f903,0xffde5166,0xffed1612,0xfff9a8f5,0xfff5b569,0xffff9eff,0x00005bb9,0x000067bc,0x00006bb8,0x000059bc, -0x00003b26,0x000024be,0x000021f3,0x000041eb,0x0000562e,0x0000b29c,0x0000daad,0xfffa88e2,0xfffa3dc1,0x002b70af,0x00162429,0xffd18ce0,0xffb40ba6,0xffae26ad,0xffba614d,0xffccebb5,0xffdb5395,0xffcfd4a7,0xffc71dcb,0xffc92699,0xffd4cba0,0xffe374a8,0xfff066b5,0xfffd2203,0x0009b101, -0x0016c1f4,0x00215fd9,0x0023acca,0x002393eb,0x00216762,0x000cdf4b,0xffffefed,0xfffec8b5,0xffff82cc,0xffff10f0,0xffff6cb4,0xffff76e9,0xffffc9a4,0xffff969d,0xffffb76b,0xfffea75a,0x000027d2,0xfffa1591,0x001265e3,0x000dd5f3,0x002a8719,0x0023f57d,0x00142a3e,0x001ae35f,0x000d6d77, -0xffff0f07,0xffebf96f,0xffdc4b01,0xffdc751e,0xffdf5017,0xffdf49bf,0xffde0132,0xffda2c1e,0xffd3c1a3,0xffdddfc1,0xffe57a04,0xffeb9901,0xfff39870,0xfffd306d,0x00091d36,0x000d1dea,0x000bb012,0x0006af3e,0x00012f9f,0x0001ae6a,0x0001be0d,0x00013146,0x00010417,0x00006610,0x00008bd2, -0x00010cfe,0x00018b9f,0x0002efce,0x0003e2cf,0x000b7258,0x000f7ac2,0xffeade7b,0xffe75099,0xffe677eb,0xffe64e1e,0xffe699e4,0xffe84155,0xffe8943e,0xffe54f04,0xffe9aff7,0xffeb63d8,0xffee9fb9,0xfff4d249,0xfffbf181,0x00034987,0x0002e8d2,0x00026a2b,0x000194b5,0x0002c136,0x0000e6a7, -0x00058941,0x00058d79,0x0000de45,0xfffe8661,0xfffb1f15,0xfffb3615,0xfffc4d51,0xfffde1a4,0xfffe6cb5,0x00001b60,0xffffa1e4,0xfffe924f,0xfffd26a4,0xfff7d5b4,0xfff2f493,0xffefe393,0xffecf182,0xfff4fe49,0xffe5ba20,0xffe99334,0xffed49a3,0xffeff476,0xfff100eb,0xfff339c4,0xfff61cf1, -0xfffc3493,0x00021a08,0x00074b9e,0x000bd91b,0x000ff0a2,0x0015d3d2,0x0014bcd3,0x00154ee4,0x001560fa,0x0015e563,0x001665aa,0x0015ad13,0x001a98bc,0x00102bd2,0x000cdea5,0x000bf6b1,0x0008d9bd,0x0000e72a,0xfffd30e1,0xfffa9877,0xfff93ffc,0xfff4cf9a,0xfff17e11,0xfff1fdb4,0xfff06143, -0xfff322b3,0xfff0c6ac,0xffea56e6,0x0006b5a4,0xfffc4d3c,0x000096fd,0x000048e5,0x00010ed8,0x00024c33,0x00031984,0x0002e512,0x0004de25,0x0006895f,0x000898da,0x000ae200,0x000d044e,0x000fa3c8,0x000f14fa,0x000f2019,0x000f0c16,0x000ea609,0x000f00dc,0x000cca25,0x00131bd4,0x001a7024, -0x0024e93e,0x000d8b10,0x001837a2,0x0023fa1e,0x00228cd3,0x00201f6c,0x001de28e,0x001c7558,0x001af555,0x00182cde,0x000f60ad,0x0003856b,0x00180a45,0x000f3ce5,0x000c4a66,0xfffda08b,0xfff0dfc3,0x0006106f,0x000041aa,0x0000fd53,0xfffcb02f,0x00016f9d,0x000285b9,0x0004bc79,0x00007c36, -0xffff450f,0xfffd5974,0x00015d26,0x00014b7a,0xfffe8bbd,0xfffc26e7,0xfffba381,0xfffdd120,0xfffe4724,0xfffd2054,0x00011d94,0xffee64da,0xffe4fc60,0xffe320b9,0xfff1b32f,0xffe50021,0xffe63f2b,0xffe038ee,0xffe08762,0xffe52459,0xffe4692e,0xffe48759,0xffe750c0,0xffe890e3,0xfff60e42, -0xffe1d2be,0xffe4e048,0xffe57d71,0x000209cf,0x000381de,0xffff5c20,0xfff5f070,0x00012aac,0x0006240d,0x000d6a43,0x00029091,0xfffefd50,0xfffa5e97,0x0005ffd6,0x0003ccc0,0xfff836eb,0xffeed21b,0xffed5acd,0xfff697cb,0xfff99c2c,0xfffdfadf,0xfff79655,0xffe492e1,0xfff667f7,0xfff89b97, -0xffed0c6d,0xffea4573,0xfffa4bff,0xfff04984,0xfff16035,0xfff7d874,0xfffcefdb,0x000148e2,0x0001087d,0xfffa364c,0xfff1bfcd,0xfff22149,0xfffb398b,0xfff5dcec,0x0006b466,0x000f44af,0x0009b658,0xfff88fdf,0x000cba5b,0x0012843f,0x0023dce7,0x000acd22,0x0002f22b,0xfff6797e,0x000fd518, -0x000fbad1,0xfffe2a31,0xffee39ec,0xffe9fee5,0xfff9d092,0xfffa09df,0x000061d5,0xffed57b6,0xffeac680,0xfff14c1d,0xfff82cde,0xfff0b757,0xfff8516c,0x000265f1,0x00003ad5,0x00039577,0x0000fbda,0x00014966,0xfffe8597,0x00018bdd,0xfffd72b0,0xfff88481,0xfff21ec0,0xfff7e683,0xfff3ae6d, -0x00031404,0x000b371d,0xfff91ef1,0xffde7563,0xfffcedc5,0x001373bb,0x0031bbb9,0x000de007,0xfffc32eb,0xffe98faf,0x0012a32f,0x000c9deb,0xffe42cea,0xffc147aa,0xffc0310e,0xffe1f0b4,0xfff1b4fa,0xfffd51fb,0xffeb7891,0xffe73ddf,0xfff77169,0xfffa4e9d,0x00015f7e,0x0003f457,0xffff9b22, -0xffffefdd,0xffff1040,0xffff6e04,0xffffc3a4,0x000032e8,0xffffacdb,0x00011ea2,0x00019971,0xfffa7231,0xfff925bf,0x0008cb75,0x001b68b9,0x003eb753,0x004f24bf,0x00759f0e,0x0049968e,0x00325f1c,0x00365935,0x00290261,0x0026333f,0x002d2351,0x003006d6,0x004c6dcb,0x006b8ff2,0x007ea366, -0x00666bfb,0x0034fc3e,0x0008997a,0xfff89b10,0xffe81012,0xffe7ace9,0x00086101,0x0003bc3d,0xffff8aae,0xfffe6fa0,0xffffd433,0x00002038,0x00004b15,0x000049c9,0x0000129a,0xfffff2b3,0x0000218b,0xffff30bc,0x000059f4,0xffff8aa8,0x0003b9a3,0x0006ada3,0x002368cc,0x002db5cc,0x001f8558, -0x000817fd,0xffdad176,0xffc59e36,0xffd4c4d4,0xfff65d88,0x001c0d5d,0x003c02ca,0x00192e99,0xffe920ac,0xffbb67d6,0xffbff630,0xffd8e786,0xfff9be39,0x0001d481,0x000837c4,0xfff95b18,0xffff3a83,0x00013051,0xfffca27d,0x0000d044,0x00007ce8,0x00004fc7,0xffffe5de,0xffffece6,0xffffd57b, -0x00000b74,0xffffe45f,0x00004524,0x00000089,0x0000ba1c,0xfffe3b3a,0x000bb77a,0x004ca3bf,0x00616868,0x00366576,0x00031fe0,0xffccdfc5,0x0036f95f,0x006ade24,0x0053d98e,0x0062ebec,0x00255936,0xffc16239,0xffea5ce6,0x00211fc6,0x00640b70,0x005de88b,0x00444279,0x001ed8df,0x0018b2ef, -0x001911f3,0x0011c73b,0x0001247a,0x0001d0f3,0x0000cd7c,0xffffd2be,0xffff7ae9,0xffffd1ae,0xfffff0ce,0x00000d4a,0xfffffeac,0x000015c0,0xffffc354,0x000052ee,0xfffe915f,0x000224a8,0xfffad57c,0x000823b4,0xffb0553e,0xff0828f5,0xffb1d6e1,0xfffd2eff,0xfff900b5,0xffe7981a,0xffc7b45d, -0xffac2813,0x0015ee81,0x00464aa8,0x00339a3f,0x0004869f,0xffdb2f8c,0xffd83e4e,0xffd3407d,0xffdb2b65,0xffe3fdfb,0xffea3241,0xffec206e,0xffebb9ee,0xffedae15,0xfff84e4e,0x000057fe,0x00007475,0x000076f3,0x000059a6,0x00001e52,0x00000c18,0x000005b4,0x00000645,0x000019eb,0x000040a9, -0x00009231,0x0000ea82,0xfffefeff,0x0000937a,0xfff4789f,0xfff56014,0xfff9fa03,0xffe4212b,0xffde56a3,0xffe5d74a,0xfff80f2d,0x00059e52,0xfff18ada,0xffe2dbc1,0xffe08093,0xffe63b2f,0xfff1c3e0,0xfff9c375,0x0000c6ce,0x0009c3a5,0x00190863,0x001d74b7,0x002452c2,0x00251bca,0x0017d352, -0x000acb15,0xfffe7064,0xffff30a3,0xffff29bf,0xffff5b7e,0xffffbe36,0xffffd7f9,0xfffff57f,0xffffd9ff,0x000006ed,0xfffef932,0x00001c95,0xfffb3a26,0x00073ab2,0x00006f18,0x001044d9,0x0024d041,0x002a90d5,0x002933ef,0x0021e0f6,0x00186080,0x000a3408,0x0000e6fb,0xffed830d,0xffe6d1a5, -0xffe3652e,0xffe59b0d,0xffe404cf,0xffdf3c3c,0xffeacbe2,0xfff3a54a,0xfffaabcb,0x000246f8,0x00084a9b,0x000a9c80,0x000d8928,0x000c3d28,0x00032d56,0x0001b681,0x0001e83d,0x000136af,0x000089cd,0x00003d35,0x0000282b,0xfffff906,0x00006397,0x0000da40,0x0002922c,0x00034636,0x0009467d, -0x00119b71,0xffec15ed,0xfff25915,0xfff8e4b6,0xfff54dcd,0xfff8095f,0xfff8da08,0xfffa414a,0xfffa78d6,0xfffb224b,0xfffa82ff,0xfff93ea1,0xfffb9485,0xfffe7fff,0x0000be9b,0x0001fe1a,0x000240a6,0x00032ce7,0x0004a4c9,0x00082350,0x00086230,0xfffefd9e,0xfffd5d63,0xfffc4b31,0xfffb0c04, -0xfffac652,0xfffe1812,0xfffef2eb,0x00000c8a,0x000013fd,0x0000f004,0xffffab4e,0xffff24d4,0xfffa25d0,0xfff510e0,0xffecfc4b,0xffeefd83,0xffe45d5d,0xffec1dbf,0xfff1e8f3,0xfff6e8c5,0xfffc1848,0xffff8da9,0x0003cd74,0x00083ffe,0x000af835,0x000dfea3,0x0010ab7d,0x00122b8a,0x00131ad9, -0x0014da55,0x0015127f,0x00160641,0x0016dc05,0x001767ad,0x0017ac5d,0x0019e7b6,0x00126b17,0x00123dc1,0x000ce418,0x000808d8,0x0003b90a,0x00008c59,0xfffe5073,0xfffb9953,0xfff88d83,0xfff794cf,0xfff6809b,0xfff3793d,0xfff274f6,0xffef9aae,0xffeecf5b,0xfff059c1,0x00014556,0x0007b8b8, -0x00078a7d,0x0008e835,0x000a0dd8,0x000bbcad,0x000d1c02,0x000e8379,0x000f02ce,0x000fb894,0x00109860,0x0011c72e,0x00130afa,0x0014463f,0x00143955,0x00143e64,0x00142e37,0x001450e7,0x0013ead7,0x001576e4,0x000e801b,0x0008b4ee,0x00070b13,0x000c617d,0x0005a971,0x00041252,0x0003169d, -0x0002267a,0x00016994,0xffffe471,0xfffea94c,0xfffdbc20,0xfffe5322,0x0003d237,0xfffc6d85,0xfffc2f5c,0x00140bf2,0xfff452f9,0x0003946a,0xfff30228,0xfff87675,0xfff85b0d,0xfff5d6b4,0xfff980f7,0xfffa1c43,0xfffb85cc,0xfff73748,0xfff59e30,0xfff27add,0xfff7b8b7,0xfff803f8,0xfff57e81, -0xfff28bba,0xfff1b356,0xfff322dd,0xfff44002,0xfff4e712,0xfff0373c,0x000176d0,0x000580f4,0x0001fd24,0xfffd401f,0x0003e80e,0x00030d98,0xfffeea68,0xffff0426,0x0002dc35,0x00041aea,0x000591d2,0x00073352,0x00061b4a,0xfffd8149,0x00011382,0x0007f349,0x000746b1,0xfff871e1,0xfff87408, -0xfff9f8ab,0xfff30a2e,0xfffd59cd,0x000157d2,0x0005b485,0xfff9d3da,0xfff4507a,0xffeccf20,0xfffa7041,0xfff89e18,0xffed457c,0xffe2ceaa,0xffe12df8,0xffe874bb,0xffef5b2a,0xfff0c6f3,0xfff1f999,0x0000bcc2,0xfff78af5,0xfffea78f,0xfff236ca,0xfff1cd9f,0xfffac0a7,0xfff2f612,0xfff5aa33, -0xfffcfe9c,0xfffd86a9,0xfffcff17,0x00039f32,0xfffa19db,0xfffa179d,0xfffd8d5c,0xfff7e2eb,0x000657e1,0xfffefc8f,0xfffebea9,0x00056cdf,0xfff6699c,0x000b12da,0x00100ea9,0x001a37ad,0x00015375,0xfff713c4,0xffe4a1f5,0x00033f43,0x000492b5,0xfff563d6,0xffe1fc1d,0xffdcd9c6,0xffe83fe5, -0xffee5711,0xffeeaa43,0xffee5f80,0xfff9a79e,0xfff5c654,0xfffb250c,0xfff5f016,0xfffe949d,0x00021697,0x000174c9,0x00023338,0x0000cb07,0x0000996e,0x00002444,0x0000fc90,0x0000305e,0xfffb8522,0xfffb0b8e,0xfffc45dc,0x0002146c,0xfffab38c,0xfffc39be,0xfffbf9ed,0xffe548d6,0x000648d9, -0x001c6b00,0x002ea078,0x00094336,0xfff00806,0xffd3b360,0x0003515c,0x00014e7c,0xffdadf0e,0xffb5033f,0xffb12ae9,0xffcc3f89,0xffe3e7bb,0xffe9561b,0xffe88cbe,0xfff43a8e,0xfff33289,0xffff30b4,0x00015647,0x00021f84,0xfffee943,0xffffbfb2,0xffff4a6c,0xffff9f8e,0xffffd7cb,0xfffff49a, -0xffff7500,0x000024ba,0x0001ad22,0xfffc789d,0xfffa0204,0x001f906a,0x00182c23,0x001aaafa,0x0031c253,0x005b21a6,0x0037cecc,0x0024344c,0x001f9731,0x001120b7,0x000c3de7,0x000e04b5,0x000cac37,0x00261a90,0x00477050,0x0067e4fe,0x00578289,0x00188c39,0xfffc9783,0xffe949f0,0xfff0a2c0, -0xfffd3bc3,0x000365ac,0x00035114,0xfffe68a6,0xffff83d2,0x00001b7f,0x00004309,0x00003328,0x000037f4,0x00000d56,0x00000831,0x00004c07,0xffffb202,0xffffd4bd,0x00006b98,0x000a1544,0x00155ebd,0x0013cb07,0x000f3480,0x00199bba,0x000eb2b4,0xffee6b30,0xffdca399,0xffe2866d,0xfff9dbfb, -0x0015302a,0x002ec24e,0x001d01ec,0xfff58dd5,0xffc63c57,0xffba5db1,0xffc859a1,0xffe4258e,0xfff711c2,0xfffa580d,0xfffefbf0,0x000778a1,0x00006a2e,0xfffe3f65,0x0000a29e,0x00006467,0xfffff11a,0xffffebad,0xffffe665,0xffffe4b0,0xfffffbd8,0xffffeba5,0xfffff1b5,0x00001677,0x00003f30, -0xffff37be,0x00033041,0x0044bf8c,0x00548928,0x0031c02d,0x00033038,0xffcfeb02,0x00297d89,0x00544171,0x003bd92a,0x003daba8,0x0007af1d,0xffb68c09,0xffccba91,0xfffcaea6,0x0040b791,0x00491c72,0x003e2db2,0x00215b78,0x001b0b3f,0x000da396,0x000c7f25,0x000362ac,0xfffe89e8,0x0001cb3d, -0xfffefb06,0x000001d6,0xffffd186,0x000011bd,0x000004e3,0x00000d0d,0x00001252,0xfffff5e8,0x00004625,0xffff5201,0x0001047e,0xfffd3762,0x0004e127,0xffb8079f,0xff298e52,0xffc2591b,0x000c6228,0x00020a2c,0xfff5eb73,0xffd23155,0xffa1e1ac,0x000fbb17,0x0048391d,0x004bfb02,0x0016ae67, -0xffeb3525,0xffe1b8b6,0xffd83e06,0xffd99181,0xffdaab79,0xffe0f305,0xffe07868,0xffe78f53,0xfff2b2ed,0xfff939ef,0x0001f0ab,0xffffe809,0x00008cc1,0x00001138,0x000018d7,0xfffff962,0xfffff8f7,0xffffe8d1,0xfffff7fd,0xffffde8a,0x000059b2,0x00004e27,0x00008128,0x00014519,0xfff4369c, -0xffedc927,0xfffbad45,0xfff5ee39,0xffe18e43,0xffecd3d5,0xfff88907,0xfffe2d21,0xfff0fd8b,0xffe49bb7,0xffe8538b,0xffed3afa,0xfff7612b,0xfffcaccc,0x00030ab9,0x000b4e52,0x0016386c,0x001df843,0x00201150,0x00212587,0x00198de4,0x0006aca7,0xfffd5c8a,0xffff7a01,0xffff5f2e,0xffffa5f1, -0xffffe208,0xffffee54,0x00002421,0x00000216,0x000069e3,0xffff8a7a,0x0000dd75,0xfffc34d4,0x0004408b,0xfffadcbe,0x0026a9c7,0x002fd396,0x0023215f,0x00245118,0x00169a66,0x000a2251,0xfff94c0b,0xfff1d777,0xffe4e1c9,0xffe1b474,0xffdfb0a9,0xffe317ff,0xffe4bc37,0xffe32445,0xffef13fc, -0xfff5aff4,0xfff79fbf,0xfffeeed6,0x0005d3ff,0x000e4864,0x000fd7f3,0x000c3663,0x00041db2,0x0001323b,0x000172e3,0x00008f3e,0x00004a9e,0x00000868,0xffffcf0c,0xffff9928,0xffffc121,0xffff44db,0x0001867a,0x00006e4d,0x0008b4e4,0x00141596,0xfff7b31f,0xfff55401,0xfff3f8bb,0xfff47e12, -0xfff49ae8,0xfff69276,0xfff741e5,0xfff5b09a,0xfff7556a,0xfff6f89b,0xfff66577,0xfff65f2d,0xfff70c16,0xfff7ca4e,0xfff92c1d,0xfffa76f1,0xfffb73d7,0xfffe7861,0xfffe4e97,0x0004b4e6,0x0002cc89,0xfffdb0cd,0xfffcc43a,0xfffb26c6,0xfffd08f4,0xffff37f9,0xffffcefe,0x00004a69,0x0000dc43, -0x00015e2b,0x00016701,0x00023916,0xfffe2fb8,0xfffb85ce,0xfff9ae8d,0xfff807f5,0xfff19f7b,0xffed8587,0xfff06b32,0xfff4490a,0xfff6e51a,0xfff831cc,0xfffa3fb6,0xfffd325d,0xffffbe9e,0x000285e2,0x00056c6e,0x0007ccc5,0x000a6fca,0x000e3655,0x000e7b0f,0x000f4d4c,0x000fda28,0x0010bff2, -0x0010d1eb,0x00125965,0x001608c6,0x000c877c,0x0009ea89,0x0005e188,0x0002a806,0xfffddd35,0xfffbebb2,0xfffb4027,0xfff9e138,0xfff76ebc,0xfff43cb9,0xfff37642,0xfff1b691,0xfff2b132,0xfff199d9,0xffee99c4,0x00078745,0xfffdd122,0x00003dc3,0x00008846,0x00012c01,0x00026e0d,0x000347be, -0x0003b1b3,0x0004509e,0x000518cd,0x00060915,0x0007526b,0x00087aac,0x0009cffd,0x0009c6bf,0x000a1158,0x000a3cba,0x000a6220,0x000ae582,0x00090622,0x0011a497,0x001593ed,0x0015ea72,0x000d70bb,0x001359d9,0x0012d724,0x0011c3aa,0x000fd8e4,0x000e393b,0x000d377c,0x000c5b9b,0x000a93b3, -0x000aab2f,0x0004db36,0x000a01ff,0x000aef53,0x0009446d,0xfff36a5a,0xffec3a8a,0xfff7e84f,0xfff76cc2,0xfff70213,0xfff45e48,0xfff5d84f,0xfff65ef3,0xfff9aeb7,0xfff537f3,0xfff3e3e1,0xfff0d405,0xfff60fa0,0xfff65215,0xfff3b4b5,0xfff1b5a4,0xfff11502,0xfff1e5c9,0xfff33b99,0xfff3dea9, -0xfff4c8ef,0xffead387,0xffeb7d31,0xfff80cc8,0xffec5687,0xffeb3053,0xfff71b06,0xfff1850f,0xfff10741,0xfff528b4,0xfff4e07d,0xfff5b572,0xfff8fb76,0xffed73ce,0xffedfc23,0xfff6736f,0xffebae0a,0xfff00bc8,0xfff3e742,0xfffa3477,0xfff6aae3,0xfff056d0,0xfff33003,0xfff5e080,0xffff47b6, -0xfff3e17d,0xffefcce2,0xffe889ef,0xfff75fc9,0xfff6f595,0xffebf776,0xffe3a605,0xffe0b6ab,0xffe53eff,0xffea9cd6,0xfff0ba33,0xffecaf41,0xffef19c2,0xfff3f6b6,0xfff35f7b,0xffed6c4a,0xffee8ceb,0xfff86af9,0xfff434f8,0xfff561b9,0xfff9d157,0xfffaf893,0xfffd3832,0xfffff80d,0xfff8041e, -0xfff203e0,0xfff26607,0xfff449ac,0xfff354e6,0xfff8a5ec,0x0003607b,0xffff1aaf,0xfff407e6,0xfff920dc,0xfffa2e74,0x000fe81a,0xfff62ebe,0xffeede46,0xffdd1232,0xfffb2a18,0xfffd371c,0xffecf57f,0xffdf7180,0xffda46f6,0xffe245f5,0xffe8d877,0xfff06d63,0xffe87475,0xffecf616,0xfff270a2, -0xfff800f9,0xfffaadf7,0x00011071,0x0002ce08,0x00026be5,0x00042934,0x00021d5b,0x0001ed04,0x00005f1e,0x00014f0b,0x00005ee4,0xfffc2138,0xfff5d4c9,0xfff59814,0xfff44931,0xfff65313,0x0003d81b,0xfff75eb6,0xffe49822,0xffea94e7,0xfff806ef,0x0019fd59,0xfff5a10b,0xffe12f51,0xffc8c368, -0xfff8d956,0xfffa3256,0xffd4909a,0xffb461b6,0xffacb6f5,0xffbf84c8,0xffd6a7ed,0xffe8c080,0xffe36e23,0xffec8609,0xfff9214c,0xfffeb96c,0x0002e8a3,0x00002312,0xfffeeb85,0xfffef4b6,0xfffe60be,0xfffeeb34,0xffff4abd,0xffffb6f2,0xffff6af3,0x00001230,0x00022973,0xffff8654,0xfff997da, -0x0004c219,0x00058ad0,0x00132548,0x001fd688,0x004b3050,0x0028a50b,0x00144c3c,0x000af5f8,0x001084bf,0x00152d33,0x00178842,0x00167f26,0x0029e02d,0x0046567d,0x0063fcd5,0x005843f0,0x002ba041,0x00077c8e,0xfff40606,0xffe80670,0xfff48e4e,0x0005f367,0x00003acb,0xffff19c5,0xffff975a, -0x00008ec8,0x00007ad9,0x0000bc82,0x00008add,0x00005780,0x0000260c,0x00005971,0xffffb4cf,0xffff65dd,0x000009af,0x00014749,0x0006033e,0x000f30aa,0x0020af6a,0x001f1ff2,0x00142f0c,0xffe91a0d,0xffd3571d,0xffd76f1e,0xfff4ba9b,0x00119aca,0x0027cec0,0x001c51c7,0xfff9a6a4,0xffca0040, -0xffb94f7e,0xffbd433a,0xffd0deb8,0xffe32eba,0xfff41355,0xfff930bd,0x00032029,0x00000daa,0xfffe8df4,0x0000fef0,0x0000000d,0xffffdd8d,0xffffaf53,0xffffaa32,0xffffa9c0,0xffffd997,0xffffcb61,0xfffffdcd,0xffffdb07,0x0000e508,0xfffed63d,0x00036066,0x00362151,0x0048acb9,0x00281b43, -0xfff57bf5,0xffb0d2db,0xfff83612,0x0023bd77,0x001cc22d,0x003b2c45,0x0017bf86,0xffca5bd7,0xffd17920,0xfff33b10,0x002cd159,0x00448ff8,0x00430643,0x002966de,0x001fe377,0x00167cf2,0x00065a06,0xfffa421b,0x00008334,0x00008685,0xffff6bee,0xfffff490,0x00000cf7,0x0000308c,0x00003c05, -0x0000392c,0x000034e8,0x00000bc9,0x00005518,0xffff658c,0x0000e40e,0xfffd5f6a,0x00016ca3,0xffbf95f6,0xff42eca6,0xffb68954,0xffe73713,0xffe0dee0,0xffdd7c1d,0xffc45d01,0xffa69cb3,0xfff289ce,0x0025882e,0x003a6017,0x0009c657,0xffe4b3af,0xffdcc3a5,0xffd3a9f3,0xffd3f7ab,0xffd7487a, -0xffddad10,0xffe2a421,0xffe4c467,0xffed4ad4,0xfffccfaa,0x00015923,0x00000029,0x0000521d,0xffffe6a7,0xffffdd32,0xffffbb63,0xffffb748,0xffffbb21,0xffffd728,0xffffba4c,0x00005004,0xfffffc0d,0x0001195a,0x00044ce5,0xffd8d8de,0xffb92271,0xffdecb6c,0xffe2ccde,0xffd400c3,0xffda4c8f, -0xffe5e916,0xfff06eed,0xffe5cff3,0xffd930fe,0xffd48762,0xffdb961d,0xffe7c080,0xffeda0b8,0xfffa9321,0x00064454,0x0013e17a,0x0018e43f,0x001c1e64,0x001b3db4,0x000f47b2,0x00030324,0xfffdd327,0xffffd6ff,0xffff81af,0x00001ccb,0x000034d4,0x00006c58,0x00009158,0x00006337,0x0000903f, -0xfffff6eb,0x0000bc60,0xfffd4278,0x000324db,0xfff16848,0x001ae4a8,0x001b9ca9,0x00176980,0x0016aec1,0x000fbff6,0x0008a3ef,0xfffc11f6,0xfff3631d,0xffe9f3f8,0xffe7f671,0xffe63d53,0xffe58bba,0xffe32ca4,0xffe02854,0xffeb2270,0xfff2f706,0xfff9c661,0x000271f1,0x000a0df6,0x00106727, -0x00102350,0x000a025d,0x00011c7d,0x00019c49,0x00007c03,0xffffe39a,0xffff8e7d,0xffff1495,0xfffeed3a,0xfffee3e6,0xffff5fcd,0xfffec7a3,0x0000c715,0x00007984,0x00054763,0x000c7995,0xfff1b653,0xfff61f22,0xfff8d9c0,0xfff564cb,0xfff51d57,0xfff448bc,0xfff45a5d,0xfff2a9f7,0xfff31746, -0xfff1a150,0xfff06fcd,0xfff1ccf9,0xfff4022e,0xfff52f1b,0xfff7554a,0xfff8f254,0xfffac6e5,0xfffbc74a,0xfffd4284,0xfffe59d9,0xfff9ce27,0xfffa66ff,0xfffb82dc,0xfffc6016,0xffff44ba,0x0000c78c,0x000119e3,0x000256ad,0x00027f31,0x0002d0ca,0x0001c13a,0x000309a5,0x000053e1,0xfffc5fd4, -0xfff83dc4,0xfff681df,0xffed1b95,0xffed2319,0xfff0dfab,0xfff2e946,0xfff594e9,0xfff6c597,0xfff86b05,0xfffa3011,0xfffddc59,0x0001b3b2,0x00051a63,0x00079dfc,0x00096ee4,0x000b8f4a,0x000c44ba,0x000d517d,0x000e92f7,0x000f8722,0x0010ef3c,0x00122a55,0x000e3fd0,0x0008cce6,0x0002edb9, -0x0000274c,0xfffcd290,0xfffa8254,0xfffa0b01,0xfff910a3,0xfff7e407,0xfff71053,0xfff650a4,0xfff403ca,0xfff26d07,0xfff09519,0xffee6d3d,0xffef63c5,0xfff9847d,0xfffd6a90,0xfffdb8f5,0xfffe0390,0xfffe8b03,0xffff520c,0x00000285,0x00003c52,0x0001414c,0x0001fa70,0x0002ec0e,0x0004169b, -0x00056c61,0x0006e925,0x00070e86,0x000754c2,0x0007855b,0x0007bedb,0x0007e7ad,0x0008d912,0x0003f622,0x000384e1,0x000a700b,0x000099b9,0x00000d4a,0x0005c422,0x0004153f,0x00024da0,0x00014251,0xffffe064,0xffff0cb7,0xfffe8306,0xfffa17e7,0xfff9c514,0x00013a0f,0xfffa127e,0x00047aa8, -0xfffd20a4,0x00029669,0xfffe6f42,0xffff2216,0xffffe3f1,0xfffcf9d0,0x0000e2dc,0x00020da4,0x0004ba9a,0x00005fda,0xfffe9eb0,0xfffa91ca,0xffffe7d5,0x00005df2,0xfffe5a50,0xfffc79df,0xfffba7f3,0xfffb9e69,0xfffd178b,0xfffca561,0xfffcbad9,0x0000fc8d,0xfffc4287,0xfff012c9,0x00008e5c, -0xfffb7151,0xfff2af73,0xfff010ad,0xfff17cef,0xfff54eab,0xfff5eead,0xfff7131e,0xfff9da30,0xfffe0f43,0x0001a39c,0xfff07d5e,0xfffd67f9,0xfffae2a8,0x0000d1cc,0xffffd5f9,0x00004fba,0xfff98c8b,0x000379d7,0x000885ed,0x000f8e83,0x00047cc1,0xfffec9c6,0xfff55370,0x00036025,0x00036f66, -0xfffa6575,0xfff3813f,0xfff0f669,0xfff32fca,0xfff8afe6,0xfffa6b59,0xfffb916e,0xfff75a9b,0xfffc9aa7,0xfffe201a,0xfff5609b,0xfff664d6,0x000022c6,0xfffcb30d,0xfffdb3cd,0x0000d35c,0x00017c1d,0x00016c34,0x0004f929,0xfffd8ada,0xfff97c89,0xfffd4b83,0xfffe5258,0x0003ae2e,0x000194d3, -0x000567e8,0x0007f0f3,0xfffafed9,0x000dbf21,0x0014c297,0x00254db2,0x000d9ea5,0x00039f03,0xffed5e60,0x000a679f,0x000d56bd,0x00018966,0xfff57e8a,0xfff036c0,0xfff358e3,0xfff89c5c,0xfffb433e,0xfff5d125,0xfffa46fb,0xfff9673f,0xfffba8f7,0xfffef7c2,0x00017e7b,0x00011785,0x00011564, -0x00012ddc,0xfffff5dd,0xffffe90d,0xffff49d9,0xffff29e0,0x00008df8,0xfffebead,0xfffb5b7e,0xfffe531f,0xffff5ed6,0xfffda609,0x0001a118,0xfffeb184,0xffeaaf0c,0x000619cb,0x001d5c02,0x0037e214,0x00157de9,0xfffc688f,0xffdc85db,0x000ac635,0x00102777,0xfff2916f,0xffd8de98,0xffd0d6f6, -0xffdaecbc,0xffed3e41,0xfff45f9a,0xfff06bf7,0xfff44c20,0xfffafe9d,0x00009e01,0x00011cd3,0xffff9646,0xffff68b8,0xffff7c22,0xffff8129,0xffffe703,0x0000075d,0x000045ba,0x00004335,0xffffbc38,0x0001226f,0x00004b77,0xfffd363c,0x00111a8b,0x0018bc3b,0x0018a0ff,0x0027ad64,0x004fac5f, -0x003c55af,0x002f5bf8,0x0024fcc6,0x00264ad7,0x0023d777,0x001d5510,0x001400d7,0x001d6e9e,0x00303bcb,0x0055b02d,0x00519c71,0x00281579,0x00138885,0x00054b1a,0xffff37c3,0x00001b76,0x00043c0f,0xffff7f99,0xffff9b01,0x000005a2,0x00005814,0x00003bdb,0x00003ced,0x0000120f,0x000001fb, -0xffffdd91,0xfffffd6a,0xffffee3f,0xffffcd72,0xffff2e5d,0x00032966,0x000f08fc,0x00131491,0x001747b7,0x00231030,0x0019d21f,0x000150e0,0xffef68e5,0xffe6ab47,0xfffe9949,0x00136b33,0x002271c6,0x00211279,0x000746e9,0xffdf8b80,0xffcce4df,0xffd1b528,0xffeb8164,0xfff6fb5f,0xfffe22a1, -0x0002def7,0x0003a423,0xffff26db,0xffff8b1d,0x00008b3a,0xffffe0d1,0xffffe4be,0xffffd7b2,0xffffe3ee,0xffffed98,0xfffffcef,0x0000014d,0x00000192,0xfffffcbb,0x00001eb1,0x00008f86,0xfffdf40d,0x002b66a6,0x0041886d,0x0025f577,0x00049ad7,0xffe74765,0x0028dee6,0x00537ec7,0x004b7643, -0x004b96e2,0x002037f6,0xffdd3c6d,0xffe5ed60,0x0007d4be,0x003c53ca,0x0053abc9,0x004e79a9,0x002e1dd2,0x0024091d,0x00167f3e,0x000d3a2f,0x00011426,0x00003d72,0x00002979,0xffff9d56,0x00000f93,0x00000b7e,0x00001c50,0x00001571,0x00001325,0x000011be,0x000009bb,0x000020a2,0xffffdee3, -0x000047f9,0xffff2e5b,0xfffdb6fd,0xffcacac1,0xff699cd3,0xffda5efd,0x0018d7d5,0x00369fb2,0x0023d7db,0xfff942c2,0xffbbf898,0xfff7faf4,0x00288a90,0x004d2063,0x001eb691,0xfffb24be,0xffec2849,0xffe755c5,0xffe85b28,0xffe807df,0xffeb980c,0xffe962cd,0xffe8c9ac,0xfff13456,0xfffecd56, -0x0001142c,0xfffffbb8,0x0000280a,0xffffe6eb,0xffffe880,0xffffe23d,0xffffe01d,0xffffdb9c,0xffffd740,0xffffce24,0x00000029,0xffffebd2,0x000037f5,0x000644af,0xffd39d6d,0xffcb5323,0x001b9083,0x00281673,0x0011a6c6,0x00166fa5,0x0018a59d,0x001390d3,0x000496fe,0xfff6b674,0xfff9e6d7, -0xfff68a90,0xfffc8bb9,0xfffe5cfc,0x00025d6b,0x000804ca,0x00112999,0x0016b4c2,0x001aab98,0x001d9559,0x0011a5ec,0x000181b8,0xfffdc83e,0x00002f99,0xffff9a48,0x00003644,0x00001e14,0x000037a3,0x000040a1,0x000046a7,0x0000692f,0x00004bee,0x00005329,0xffff9152,0x00006ad2,0xfff84ea2, -0x001a8249,0x00295d72,0x0022b322,0x001dcab9,0x001612f8,0x000e3658,0x000345ea,0x0002c5f6,0xfff07119,0xffe96c4f,0xffe55ba4,0xffe9da29,0xffed6d32,0xffef0706,0xfffae078,0x00014239,0x00027cdb,0x0008eb03,0x000c9717,0x00103480,0x000fcf85,0x00093913,0x000096f0,0x00012f7d,0x0000258b, -0xffffd1bb,0xffffaaae,0xffff96dd,0xffff7540,0xffff6037,0xffff363b,0xffff1ad3,0xffffafc1,0xfffffe4b,0x00007f98,0x000fc5f3,0xfffe7ff4,0x0001616e,0x00014537,0x00006ec1,0xffffbb71,0x00007fa8,0x000128b1,0x0001171f,0xfffff9a9,0xfffe2238,0xfffae237,0xfff82c6b,0xfff5b0af,0xfff2b850, -0xfff4f081,0xfff6e57a,0xfff8e537,0xfffb7d8d,0xfffcc19f,0x0000e3b4,0xfffd2f45,0xfffb7495,0xfffc86fe,0xfffde920,0xffffd121,0x0000861a,0x0000b849,0x0000f790,0x00014902,0x000168e3,0x0001da4d,0x000208dc,0x000195f1,0xffffb81d,0xffff2d7a,0xffff8c7e,0xffef9f3c,0xfff5636e,0xfff770d5, -0xfffa71f6,0xfffccb29,0xfffe9508,0x00006362,0x0002d357,0x0002e757,0x00034fce,0x00041f4f,0x00047447,0x00052973,0x00064834,0x0007761d,0x000869f4,0x000968a2,0x000a78e7,0x000a9eb5,0x000d887e,0x000d8036,0x0007bd3e,0x000504dc,0x000006c0,0xfffe547d,0xfffe7dd2,0xfffddd6e,0xfffd2214, -0xfffc5ad2,0xfffbbd7b,0xfffb68c6,0xfff95bb9,0xfff6f471,0xfff54c97,0xfff457a5,0xfff4a98c,0x0002dbdb,0x000047fb,0x00006930,0x00013cb8,0x0001ca3b,0x0002ad01,0x000364cc,0x00043b3c,0x0003d550,0x0003d719,0x0003dce1,0x0004294c,0x000472de,0x00049b62,0x00050524,0x00056b7f,0x0005b70f, -0x00063a1a,0x00069be8,0x00062eb2,0x000a3ab2,0x000936c9,0x00042dff,0x00081cb1,0x0006973e,0xffffab23,0xffff0d1f,0xfffe61f7,0xfffd78cb,0xfffcaad9,0xfffb99ae,0xfffb261b,0xfffff62d,0x0001dc96,0xfffb02a5,0x0000ab1c,0x000615fe,0xfff020ed,0xfff265c6,0xfff017f1,0xfff3ee0c,0xfff32ef7, -0xfff1fcef,0xfff1f5f8,0xfff23108,0xfff56297,0xfff16e5f,0xfff0244a,0xffecd1f8,0xfff1def5,0xfff260d3,0xfff07717,0xffef1437,0xffee67aa,0xffee0514,0xffef9c31,0xfff10e14,0xffef64aa,0xfff21f22,0xfff86036,0x00045809,0xfff0a11a,0xfff67662,0x0000f016,0xfffdae4d,0xfffdba01,0x0000c5ec, -0x0000a327,0x0001cd09,0x0004e8d9,0xfff8438b,0xfff0b0fc,0x0003906c,0xfff8ab28,0xfffcc201,0xffee7b71,0xfff4a659,0xfff363a5,0xffeffe4b,0xffefc939,0xfff16050,0xfff985e5,0xffef4961,0xffeb1252,0xffe34bda,0xfff133c5,0xfff1eed0,0xffe985a0,0xffe3a2f6,0xffe08118,0xffe0f755,0xffe6d8e9, -0xffebdf7b,0xffec0afe,0xfffbb5b2,0xfff61613,0xfff4105a,0xfff436a8,0xfff80bbe,0xfffbd69d,0xfffab8e5,0xfffb049e,0xfffd21a5,0xfffcde82,0xfffd3af8,0xffff94f4,0xfffaddb0,0xfff6cf9d,0xfff63ce2,0xfff3eb02,0xfff81378,0xfff13d4c,0xfff961ac,0xfff9611d,0xfff37701,0xfff34e05,0xfff2b9d6, -0x0005a3fd,0xffef6fba,0xffe8dc6c,0xffd672e3,0xfff1cdd9,0xfff56a3f,0xffe9e128,0xffe085fd,0xffdb7aaa,0xffdc229c,0xffe4b542,0xffea30a6,0xffeca849,0xfff618f8,0xfff6fd2f,0xfffdae8b,0x00019879,0x00027b4a,0x0001cb35,0x0001bf64,0x0001cd29,0x000111d2,0x0001219b,0x0000b90b,0x00008bd6, -0x0001b14d,0x000097fe,0xfffc9bf0,0xfff78a75,0xfff8ec26,0xffee4c54,0xfff993cd,0xfff5ec4e,0xffeadcbc,0xffe9754a,0xfff29fa5,0x000e0ba2,0xffee1ac8,0xffd9b835,0xffc0ef5b,0xffecb9db,0xfff2dc83,0xffd6d91f,0xffbf85c9,0xffb5946c,0xffba5266,0xffd08df4,0xffe093a5,0xffe69783,0xfff63fbc, -0xfffc98bb,0x00018593,0xffffbc48,0xfffef935,0xffff2b31,0xffff3db6,0xffff3d85,0xffff7d18,0xffff856d,0xffffb7f1,0xffffa44a,0xffff5f40,0xfffffe37,0x0001cc61,0xfffd4894,0x00071201,0xffff84b1,0xfffad8fb,0x0005ec8f,0x002d1cab,0x0016fa71,0x00079ac1,0xfff54bfb,0x00070e29,0x000d81d8, -0x0007d8f9,0x0002c365,0x000d1ba8,0x0024d3fd,0x0044f4a0,0x004374f6,0x00204cc7,0x0009e896,0xfff75fb6,0xfff29643,0x0000d334,0x0001f929,0xffffa391,0xffffdd1a,0x000088d1,0x00006169,0x00006157,0x0000588c,0x0000465b,0x00003672,0x00002cfa,0x00002814,0x00005dd4,0xffffcde6,0xffff7250, -0x00011d2b,0x00068a4a,0x00055843,0x00130e17,0x001cde9f,0x001b53cc,0xfffc1e3e,0xffea1696,0xffe48e38,0xfff7ba42,0x000a0b34,0x0018c1a0,0x001f5eae,0x000a68c3,0xffe1284e,0xffc55450,0xffbba96a,0xffc4dc96,0xffd8ad4f,0xffe9993b,0xfffa4cf2,0x00035292,0xfffe6a8b,0x000054a4,0x000008c1, -0xffffc6a6,0xffffc65b,0xffffcea7,0xffffce25,0xffffd9bb,0xffffd954,0xffffee3c,0xffffc49f,0x00001087,0xffff8201,0x000186f5,0xfffcf00a,0x00205582,0x0031080d,0x0019e28c,0xfff32f94,0xffb839aa,0xffdf02b3,0xfffe88ce,0x00047d8c,0x001b39c0,0x00088ae5,0xffd56fe8,0xffc885aa,0xffdaeb52, -0x0008937f,0x002c9ffd,0x003a0db6,0x002d2f0d,0x00228c63,0x001309e1,0x00023e98,0xfffcd28f,0x0000c92a,0xffffc6f7,0xffffedc8,0x00002662,0x000023a7,0x0000252a,0x0000226c,0x00002315,0x00001dbe,0x0000222c,0x000021fc,0x000028a0,0xffffecb0,0x000078a6,0xfffb1dc5,0xffd7dc95,0xff8970b7, -0xffc63a2f,0xffe456f7,0xffef3f8a,0xffe937de,0xffd4c68b,0xffbb50b4,0xffe39134,0x000f0a07,0x003b5ea5,0x0014c4e5,0xfff7272e,0xffe713d6,0xffddee87,0xffd99334,0xffd72f6d,0xffdd0681,0xffe26750,0xffe69d9a,0xfff49089,0x0000cb8d,0x0000632b,0xffffff83,0xffffe704,0xffffd4ff,0xffffd7c2, -0xffffd476,0xffffd2e0,0xffffcec3,0xffffd086,0xffffbad4,0xffffd415,0x000008ef,0xffff0779,0x000815f4,0xffd95182,0xffaecd43,0xffede2c4,0x0001193e,0xffee96d5,0xfff08080,0xfff19755,0xfff14a81,0xffea0def,0xffdfae53,0xffdd9dd9,0xffe029cb,0xffe921ea,0xffec4cab,0xfff95bb4,0x00038936, -0x000c80fa,0x0012de4a,0x00142537,0x0014ac7b,0x000b4c99,0xfffed827,0xfffef8c7,0x00002f20,0x00000cdc,0x0000549d,0x00003d7e,0x00004d36,0x000056d3,0x0000529a,0x000073e8,0x00005715,0x0000b657,0xffff5ca8,0x0001fe1b,0xfff911be,0x001dc6b3,0x00164cdb,0x00084bd3,0x0005f0cf,0x000015c0, -0xfffafc23,0xfff2147e,0xffedddfc,0xffeb9769,0xffec1704,0xffeae4fa,0xffe9e702,0xffe93dfd,0xffe99922,0xfff346c1,0xfff9203e,0xfffce723,0x0003b14a,0x0009bbcf,0x00111f72,0x000ef442,0x00059a8b,0x0000231b,0x000086d3,0xffff7370,0xffff8450,0xffff6f80,0xffff66a8,0xffff5056,0xffff3fc0, -0xffff3d02,0xfffee1dc,0xffff54c4,0xffff4fc7,0x000037e0,0x0005c963,0xfffbbbef,0xfffd76f7,0xfffc4547,0xfffaa8a3,0xfff8286d,0xfff6a9c2,0xfff5c4a0,0xfff33f95,0xfff28b63,0xfff07b22,0xffeee206,0xffef5ac5,0xfff060ba,0xfff092bb,0xfff26643,0xfff4350d,0xfff5f67f,0xfff6b42e,0xfff63b08, -0xfff8340a,0xfff8bfd8,0xfffa8cf8,0xfffdc817,0xfffff5b9,0x00010048,0x00014ff4,0x00013ccd,0x00016d92,0x00019599,0x0001aea7,0x0001d25e,0x00024000,0x00025821,0x00010305,0x00008beb,0xffff6971,0xfff68b16,0xfff238a7,0xfff369fe,0xfff39e37,0xfff42623,0xfff42518,0xfff416b6,0xfff44abb, -0xfff73d3f,0xfffa310f,0xfffcbd8d,0xfffed6c4,0x000080a8,0x00025b75,0x00032886,0x00040818,0x00052418,0x000624c3,0x00079b00,0x00085406,0x000938a2,0x00012830,0xfffd4a58,0xfffcc78f,0xfffca306,0xfffbf8a4,0xfffc3533,0xfffbb16b,0xfffb91ac,0xfffb14e3,0xfffb462b,0xfff9cced,0xfff892d1, -0xfff686db,0xfff40768,0xfff2c93a,0xfff9af22,0xfff8460f,0xfff924a0,0xfff8e981,0xfff90bba,0xfff92790,0xfff95025,0xfff8eebe,0xfff9b0fd,0xfffa1f30,0xfffac9d2,0xfffb8eb0,0xfffc75df,0xfffd82df,0xfffdca72,0xfffe2cd5,0xfffe7b37,0xfffec01c,0xffff4830,0xffff0fc6,0xffff9edb,0x0002f0f2, -0x000a6030,0xfffc6a01,0xffffb006,0x0004c565,0x00037795,0x0002431e,0x00016da5,0x000061de,0xffff8491,0xffff2ef0,0xfffb3456,0xfff7b0be,0x00032d12,0xfffd253a,0xfffb6b55,0xfffeb7bb,0xfffb0f9f,0x000175a1,0xffffab1a,0x00007fcb,0xfffe6181,0x0000ca68,0x0001d5ac,0x0004f8e2,0x00013989, -0xffffc5c8,0xfffc47f9,0x00007d53,0x0000f44f,0xffff9165,0xfffed73f,0xfffe3bb8,0xfffd5102,0xfffeaee3,0xfffe2c6c,0x0000f7d4,0xfffac3c6,0xfff48d69,0xffec0dd9,0xfffbe4b3,0xfff3b7b4,0xffef750f,0xffede5dd,0xffef039b,0xfff1b700,0xfff1f820,0xfff2d1c6,0xfff56d2a,0xfff63fff,0xfffd7653, -0xffecb5eb,0xfff41348,0xfff29eb3,0xffffc140,0x0000d753,0x000006c1,0xfffba0bd,0x0001214d,0x00050b3c,0x000cbd0a,0x0003b76c,0xffff31b8,0xfff7156b,0x000271e7,0x00038123,0xfffd4cb0,0xfffa08a4,0xfff750af,0xfff60a02,0xfff99a6e,0xfffc79e9,0xfffd29dd,0xfff33739,0xfffd9fc7,0xfffab2bc, -0xfffa2db7,0xfffc8241,0x00025748,0x00014428,0x000199d2,0x0002101d,0x00021d84,0x0001b15b,0x000384ec,0xffff55bf,0xfffa1f6e,0xfffa3d8c,0xfffe921d,0xfffc22f8,0xfffd3ab1,0x00055d42,0x00040d6b,0xfffd201e,0x0006a6dc,0x000b629e,0x001ddc6f,0x000a365e,0x0002d026,0xfff016d9,0x0005cfb3, -0x000950e8,0x0001298f,0xfffc7e34,0xfff80ff5,0xfff595ff,0xfff9cc19,0xfffe77ce,0xfff90e59,0xfff9b0fa,0xfffc7da5,0xfffec1f9,0x00021b22,0x0000f695,0xfffff0fc,0xffffecce,0xfffffc02,0xffff8f7d,0xffffa90a,0xffff8a6c,0xffff0fde,0x00008211,0x00017ee0,0xfffd8cef,0xfffd21a8,0xfffab768, -0xfff9c033,0x0002c975,0xfffdcf60,0xfff213c2,0xfffe3fbb,0x000ea364,0x002a1375,0x000e0c59,0xfffa5ebe,0xffe0f1e9,0x00047056,0x000c18bb,0xfff83ce4,0xffeac93f,0xffe1950a,0xffdf7c11,0xffec0dd4,0xfff63356,0xfff4a120,0xfff70fd5,0x000063a6,0x000046b9,0xffff9522,0xffff6580,0xffffff37, -0xffffeb43,0xfffff674,0x00001c33,0x00001a52,0x00002cb7,0x00005ade,0xffffa54d,0xffffbc40,0x00010e3d,0xffffa1cf,0x0003f989,0x0010a595,0x0010e9f7,0x0017d029,0x0036d98a,0x002bd7d4,0x002277ab,0x00133720,0x0025492c,0x0027fcc4,0x001d09ee,0x0013c926,0x0014f301,0x00202e9f,0x003eb1f9, -0x0041dfd2,0x002e5476,0x001e2bbb,0x0012b09d,0x0004dac4,0xfffff3ed,0x00021dae,0xfffefcda,0x0000824a,0x00001f2c,0x00001b17,0x00000392,0x00000a69,0xfffff670,0xfffff5d6,0xffffec8f,0xffffdd71,0x00002d63,0x0000178c,0xffff6c28,0x00007c1f,0x0003eb0c,0x00102ea9,0x0017338b,0x001fb203, -0x00196511,0x0005ec9a,0xfff5f341,0xffe8b6ad,0xfffc1611,0x000aebf6,0x00151f59,0x001cd626,0x000dc101,0xffeeaaa8,0xffda4cf8,0xffd5cb06,0xffe4cfd2,0xffecd548,0xfff82a17,0xfffef7c9,0xffff4cb1,0xffffb7d9,0x000009f4,0x0000080f,0xffffcd52,0x0000002f,0xfffff4af,0xfffffc20,0x00000273, -0xfffffcbc,0x000015c6,0xffffe85b,0x00002e85,0xffff5bee,0x0001728c,0xfffd8f57,0x0013584b,0x00291949,0x00160db3,0xffff2686,0xffe8293f,0x000a5c32,0x002bcb4f,0x0034f16e,0x003bcae7,0x00233c42,0xfff484da,0xffee34c2,0xffff81b6,0x002301ba,0x003fc791,0x0043a11e,0x002e4e65,0x00237bb8, -0x001851f9,0x0009edab,0xffff511e,0x00011428,0xffff5412,0x0000479d,0xfffff7ee,0x000015ad,0x000000e1,0x000008e3,0x00000362,0x00000346,0x00000457,0xfffffd78,0x00002ec5,0xffffbcb4,0x00011c8a,0xfffb1d9c,0xffe59f43,0xffa5e374,0xffdfba23,0x00058cec,0x003662fd,0x001f5672,0xfffe9b26, -0xffd68e4b,0xffe687a6,0x0008a248,0x00392398,0x001d23fa,0x0005799c,0xfff1e885,0xffef962b,0xffeef1b3,0xffed7e79,0xfff01026,0xfff049a1,0xffece950,0xfff62cff,0x000238d0,0xffffa9bf,0x0000289d,0xffffd828,0xfffffe00,0xffffeff4,0xfffff918,0xffffef5b,0xfffffd92,0xffffdf22,0x00001959, -0xffff74b7,0x0000e5f1,0xfffd3093,0x00090329,0xffd71e41,0xffc00d56,0x00224a57,0x0035a336,0x002605c6,0x0022d138,0x001e310c,0x0013ef58,0x00056e5e,0xfff89db1,0xfff8c6e7,0xfff34b22,0xfff7bb21,0xfff8dd7e,0xfffe7316,0x000353d4,0x0009f0fe,0x000e1285,0x00126457,0x0015d757,0x00090979, -0xfffdd610,0xffffbd95,0x0000234f,0x00000c56,0x00001f07,0x00000dac,0x00001ae5,0x000011bf,0x000026e0,0x00000577,0x00005e92,0xffffda58,0x00011501,0xfffe762e,0x0003d2f4,0x00101ab1,0x00180791,0x0012a9e2,0x000aa653,0x00083555,0x0004d39b,0x000083d1,0x0003b872,0xfff794ab,0xfff27686, -0xffeed471,0xfff1659c,0xfff39824,0xfff60fc9,0xfffef3cd,0x00046fd6,0x000687df,0x000ba5e9,0x000d764f,0x000eb3fb,0x000c7ff1,0x00038ff1,0xffffdf7f,0x00002281,0xffffa8ef,0xffffe5a2,0xffffd3ce,0xffffdad2,0xffffc819,0xffffd6cb,0xffffaaba,0xffffd644,0xffff1431,0x00002412,0xfffe149a, -0x00046c7b,0x00013c5e,0x00070a68,0x00080706,0x0006143b,0x000485ce,0x000373ac,0x000329ce,0x0002c337,0xffffea3b,0xfffd3771,0xfff955cc,0xfff758f1,0xfff56169,0xfff2a104,0xfff49ca9,0xfff631f0,0xfff804b0,0xfff92e75,0xfffad5d6,0xfffb9fb8,0xfff8ff85,0xfffb9d74,0xfffee3c4,0x000096de, -0x00007a29,0x00004455,0x00003549,0x000041ba,0x00005693,0x00004f2c,0x000074ad,0x0000977d,0x0001571a,0x0001a3ab,0x000072de,0x0002ada9,0xfff201ac,0xfff8f240,0xfffa04fa,0xfffb45dd,0xfffcb907,0xfffe355b,0xffff48f2,0x00009cab,0x00007198,0x00007036,0x000086d9,0x000028a3,0xffffc635, -0xffff592a,0x000098f0,0x00017e0c,0x0002aab0,0x0003963e,0x00042f1a,0x0006bdb3,0x00045af3,0x0001c248,0xffff4ee2,0xfffda69d,0xfffe68ba,0x00001bcf,0x00005227,0x0000219f,0x00001e5b,0xfffffa40,0x0000369a,0xfffed2e9,0xfffcf291,0xfff9afae,0xfff853dd,0xfff91911,0xfffcc22f,0xffff5714, -0xfffe7ae9,0xffff3a57,0xffff91c7,0xffffe1f9,0x000042d7,0x0000dd4f,0x00004e2b,0x0000036a,0xffffc3db,0xffffa3bf,0xffffa54b,0xffff713f,0xfffffe7b,0x00005820,0x00009edf,0x00012a7d,0x000161a6,0x00020e68,0x00014bd3,0xfffebcad,0xfffb537f,0x00001216,0xfffbf00f,0xfff7bcb9,0xfff73f83, -0xfff6f635,0xfff67fdf,0xfff61fe3,0xfff59b86,0xfff5aede,0xfff88302,0xfffc9e1d,0xfff5a250,0xfff93541,0x0000b783,0xfff58dbf,0xfffba144,0xfff3e9bb,0xfff7e755,0xfff7b1de,0xfff74a6b,0xfff7318e,0xfff75fc3,0xfff9be48,0xfff6aba5,0xfff58c22,0xfff2d065,0xfff67b4e,0xfff701cd,0xfff5f9ec, -0xfff54cd8,0xfff4be7e,0xfff3bcb9,0xfff51583,0xfff62633,0xfff47982,0xfffc0ec9,0x000096e4,0x0001ffed,0xfff91f0c,0xfffe5cd9,0x00010e10,0xfffff5c4,0x0000609f,0x000237af,0x000228d3,0x00030132,0x00053ba6,0xffff6376,0xfff8e537,0x0002995a,0x0000730b,0x00017004,0xfff4a18e,0xfff800d4, -0xfff8b13e,0xfff73caf,0xfff74415,0xfff884f3,0xfffdea2c,0xfff5ec1c,0xfff2204e,0xffebd0e1,0xfff5999f,0xfff6abf4,0xfff1a960,0xffeea564,0xffec360e,0xffea58ad,0xffeed268,0xfff1a6cd,0xfff488a0,0x00017b6a,0xfffa461f,0xfffa0e41,0xfffceffd,0xfffe7830,0xffff2288,0xfffecdb3,0xfffed8a6, -0xffff2631,0xfffefd6d,0xfffef380,0xffff4aa4,0xfffec00d,0xfffd19d8,0xfffb61df,0xfff8a698,0xfffda40d,0xfff47453,0xfffa0885,0xfffc9555,0xfffa6f58,0xfffa8f47,0xfffa6b0f,0x00077728,0xfff6d908,0xfff1400f,0xffe29e2c,0xfff5699c,0xfff91c20,0xfff31b76,0xffee8fce,0xffeaa9b9,0xffe6f440, -0xffedba71,0xfff091ad,0xfff66aa0,0xfffe28cf,0xfffd5a40,0x0001ca50,0x00012448,0x0000b8f4,0x0000682b,0x0000857c,0x000080b3,0x00005311,0x00005e54,0x00005bc0,0x00002030,0x0000b079,0x0000ef9b,0x00012afa,0xfffcedb4,0xfffe2f4c,0xfff22927,0xfffa1102,0xfffc55c5,0xfff76c1a,0xfff6fd41, -0xfffe3520,0x000fe183,0xfff727e5,0xffe6000e,0xffd26d00,0xfff0f4a3,0xfff8160a,0xffe81485,0xffdbb29e,0xffd2e337,0xffce8de3,0xffddb03c,0xffe78ae1,0xfff15f36,0xfffdc7b6,0xffff79bf,0x00004a5d,0xffff1477,0xffffd4d4,0xffffb788,0xffffcb56,0xffffbfc7,0xffffdc02,0xffffd11b,0xffffe341, -0xffffddef,0xffffd3e9,0xffff3e6d,0x000067eb,0x0000058c,0x0006b755,0x0003f515,0xfff655ae,0xfffec2bc,0x0019d7da,0x000fecbe,0x000731c9,0xfff423fc,0x000a8940,0x00102120,0x000561ae,0xfffe4248,0x0000b719,0x000fc9df,0x002a21df,0x002ed546,0x001afbf6,0x00107cd7,0x0003148b,0x0001cd31, -0x0004f269,0xfffef4d8,0x00007462,0x00001942,0x000043d4,0x00000da2,0x000025a7,0x0000181d,0x000018fb,0x00000f4e,0x00001b28,0xfffffa44,0x000045f2,0x00000461,0x00007355,0xfffe65d8,0x00036131,0x00047726,0x0008fb92,0x00178f68,0x001938c9,0x000a20f2,0xfffd6672,0xfff0c515,0xfffc0da3, -0x00059176,0x000ddc06,0x001ab8cf,0x000ff55f,0xfff25ffb,0xffd8e32e,0xffcc7199,0xffd07e43,0xffde8f90,0xffea5d94,0xfffafeaf,0x00010b6a,0xfffed963,0x00008e52,0xffff9bae,0x000002f5,0xffffe4fd,0xfffff50f,0xffffec22,0xfffff7ec,0xffffea72,0x0000080a,0xffffccfc,0x000043ef,0xffff1e0c, -0x00018120,0xfffd6a15,0x000b6f1d,0x001bb7b5,0x000e20af,0xfff88009,0xffd7e2ba,0xffe7c473,0xfffd0627,0x0009565b,0x00124f54,0x0007a5c3,0xffe9bbca,0xffd7d248,0xffe07f71,0xffff3675,0x001e7635,0x002d9c3b,0x00287c7a,0x001ebc5e,0x001050de,0x00034caa,0x0000dd8e,0xfffff8f1,0xffffebf2, -0x00001f84,0x00000f4c,0x00000b65,0x00000d45,0x00000b7d,0x00000d35,0x00000868,0x00001261,0xfffff998,0x00003ff7,0xffff9fe7,0x00017037,0xfffbd1bf,0xfff3758a,0xffbfde95,0xffdbb470,0xfff140e3,0x00126478,0x00021ddb,0xffee76e7,0xffd8bfb0,0xffe3d239,0x00011ecf,0x002fd116,0x001c1e1b, -0x00095889,0xfff488c6,0xffee62ff,0xffe957c5,0xffe4f2c7,0xffe8898d,0xffebae5b,0xffee6d90,0xfffc43d0,0x00012b95,0xffffc7fa,0xfffff327,0xffffea71,0xfffff27c,0xffffefad,0xfffff146,0xffffec3f,0xfffff5ab,0xffffde72,0x000012e0,0xffff8b66,0x0000c15e,0xfffd8b7d,0x0005fe37,0xffebc2ad, -0xffc86b95,0x00105da0,0x00243034,0x001719ef,0x0013193d,0x000c7389,0x00020313,0xfff97e60,0xfff03a75,0xfff086c6,0xffed1f5d,0xfff17d49,0xfff32e32,0xfffb6fe1,0x00015616,0x00057a46,0x000b9e1b,0x000ce224,0x000fdf45,0x000651b5,0xfffd97a7,0x00009341,0x00000027,0x00002bb9,0x00001426, -0x00001cde,0x00001d6d,0x00001bb9,0x00002868,0x000010fc,0x0000474c,0xffffe6e0,0x0000cd0a,0xffff2985,0x00037345,0x00140126,0x00110066,0x0000ee7c,0xfffc34b7,0xfff885a9,0xfff51353,0xfff0d80a,0xfff1ce5d,0xfff1fa07,0xfff2cf5b,0xfff1e1b6,0xfff1f667,0xfff300d4,0xfff5a626,0xfffc946a, -0x0000b0dc,0x00020754,0x00066555,0x00090e8b,0x000df8e7,0x000a1de5,0x0000d9f1,0xffffe28a,0xffff98c2,0xffffd615,0xffffc516,0xffffcd6d,0xffffc4bd,0xffffc176,0xffffbf12,0xffffb7ab,0xffffbe28,0xffff964e,0xffff92ab,0xffff5653,0xfffdef1a,0x0004131e,0x00058cfe,0x00030f00,0x0002cb75, -0xffffe078,0xfffe06b7,0xfffc6ddd,0xfff9d558,0xfff7e570,0xfff58a7e,0xfff33ebf,0xfff2fadc,0xfff2da05,0xfff22cef,0xfff37d26,0xfff4d958,0xfff6179c,0xfff6cf63,0xfff64d3b,0xfff8151e,0xfffa7b88,0xfffd546f,0x0000ff17,0x0000a302,0x000073cc,0x00006db3,0x00006f0f,0x0000795a,0x00007fd4, -0x0000881b,0x00008eb5,0x00008d32,0x0000c257,0x00011f19,0x0001844c,0x0002f88a,0xfffa85d1,0xfff82d3e,0xfff7d738,0xfff75f15,0xfff70759,0xfff6decd,0xfff663f1,0xfff634f4,0xfff77770,0xfff8aa8a,0xfff9a61d,0xfffa7200,0xfffb1680,0xfffbd922,0xfffc9b35,0xfffd4638,0xfffe25e6,0xfffef828, -0xffffec98,0x0000c914,0x00035320,0xfffd215f,0xfffcc224,0xfffe284e,0xffff114f,0xffff09a7,0xffff10d3,0xffff02d9,0xfffefc95,0xfffef897,0xfffee63e,0xffff04d9,0xfffea4be,0xfffcb2c4,0xfffb0f41,0xfff925da,0xfffc4fda,0xfff95257,0xfff9cb62,0xfff9a640,0xfff9998b,0xfff96ec5,0xfff95b1f, -0xfff9018b,0xfff91579,0xfff91047,0xfff93569,0xfff95e7f,0xfff9a232,0xfff9e8f6,0xfffa4a75,0xfffaa546,0xfffaeffe,0xfffb4190,0xfffbc894,0xfffb3380,0xfffe8620,0x000186a5,0x0003db71,0xfffc2c45,0xffff3fb5,0x00005b52,0xffffcf7c,0xffff5523,0xfffeec5b,0xfffe7ec5,0xfffe1368,0xfffdbe43, -0xfffcbe40,0xfffa1bf8,0xffff5711,0xfffe2c42,0xfff99b8e,0xfffbfe2d,0xfff7aeb2,0xfffdc2a1,0xfffcfa02,0xfffd5270,0xfffc8725,0xfffcdccd,0xfffd4ccf,0xffffc0b7,0xfffd3240,0xfffc4dc8,0xfffa2e77,0xfffcc29f,0xfffd2079,0xfffc650e,0xfffc4df5,0xfffbf242,0xfffae66b,0xfffbf02f,0xfffc0985, -0xfffe15f6,0xfff853b6,0xfff601ad,0xfff3fcda,0xfff93c8a,0xfff67669,0xfff83542,0xfff776f0,0xfff7d340,0xfff8eab0,0xfff8d741,0xfff946a5,0xfffae906,0xfff78bf4,0xfff9d9a8,0xfff4ae23,0xfff5287d,0xfff5bf3a,0xfffb4399,0xfffde1c6,0xfffcecdf,0xfffb597d,0xfffbb775,0xfffd5b8b,0x00031a21, -0xfffcfa2a,0xfffa3f55,0xfff56871,0xfffca111,0xfffdcbbe,0xfffa58f0,0xfff93717,0xfff71853,0xfff4b429,0xfff6f69f,0xfff9f7dd,0xfffae366,0xfff7a737,0xfffd55c5,0xfffc5dc6,0xffffffa8,0x00014bad,0x0001ec39,0x00016524,0x0001931d,0x00018c37,0x00018d94,0x00014433,0x0001d6a5,0x00015400, -0xffff3122,0xfffc030c,0xfffcc9ae,0xfff9e5d6,0xfff8bced,0x0000a02a,0xfffeda28,0xfffda49b,0xfffd7382,0xfffe4517,0x000c3ec4,0xfffeeebc,0xfffad8f5,0xffefa0ae,0xfffc7454,0xffff7455,0xfffb1060,0xfffa6307,0xfff76f0c,0xfff32dcf,0xfff6f949,0xfffb4ead,0xfffa2d21,0xfffbafc7,0x00007fa5, -0x0000b111,0x0000acb0,0xffff9e72,0xffff87aa,0xffff9da6,0xffffa1d2,0xffff89ba,0xffff9974,0xffff9ff9,0xffff6791,0xffffb8d3,0x0000ac2f,0x0000fbcb,0xffff646f,0xfffd19ca,0xfff6526c,0xffffb8ca,0xfffc739c,0xfff91d76,0xfff70cc7,0xfffdb55f,0x00112409,0xfffe10d7,0xfff1f9d0,0xffe3c604, -0xfff9923e,0xffffe32d,0xfff51316,0xffef7799,0xffe7e5d2,0xffe12b06,0xffe9c0c5,0xfff38a07,0xfff723e1,0xfffc8f36,0x00015024,0xffff3341,0xffffe5db,0xffffffea,0x00003ce1,0x00001f2b,0x000026c1,0x00002c88,0x000029d9,0x000024e4,0x00004682,0x0000032e,0xffffca05,0xffff61bf,0x00015630, -0x000007aa,0x00032efa,0x0001f193,0x00049dcf,0x00199135,0x0013f3fd,0x000e3127,0xfffea2bc,0x0015e224,0x001b12fe,0x00101cb4,0x0009ae7c,0x00084073,0x0010188c,0x00228bd1,0x00284aa0,0x00238e4f,0x0018f4b6,0x00101e43,0x00051e0c,0x0000641b,0x00003d7a,0xffffe62b,0x000045bd,0xffffe946, -0xfffff0cf,0xffffeb83,0xfffff172,0xffffe99f,0xfffff025,0xffffe77f,0xffffee6a,0xffffe2a4,0x00005e46,0xffffb745,0x00006469,0xfffdf159,0x0008cb25,0x00103f44,0x00161c59,0x00151298,0x00084261,0xfffcba48,0xffefa0f7,0xfffb6343,0x00041ded,0x000ab54b,0x0014afd7,0x000cfebe,0xfff71672, -0xffe54f98,0xffdbb77e,0xffdf25d9,0xffe58993,0xfff0c1e0,0xfff96c39,0xffff1fc3,0x00005341,0xffffd7bf,0xfffff947,0xfffffac0,0x00000f83,0x00000655,0x00000995,0x000009da,0x0000085b,0x00000ccf,0x000007bc,0x00000c6f,0xffffd848,0xfffff987,0x00006e32,0x00036155,0x0012d699,0x000951d5, -0xfffa2e0f,0xffe54a8d,0xffee0aa9,0x00019f75,0x00126e90,0x001cf717,0x00151a6e,0xfffc0263,0xffed7322,0xfff25cea,0x00078e31,0x001ff244,0x002a035c,0x0023dea9,0x001b6652,0x00131d0e,0x00054a6f,0xffff80f7,0x00006ba1,0xffffb4e4,0x00003a21,0xffffe93f,0x000003aa,0xfffff5ca,0xfffffd3e, -0xfffff915,0xfffffb14,0xfffffab9,0xfffff349,0x000013b7,0xffffd1b4,0x0000c87f,0xfffe0aed,0xfffe628a,0xffd12a03,0xffe37fbc,0xfff3364a,0x001ce7a2,0x000ad6d0,0xfff96373,0xffe9bcba,0xffe3feac,0xfff774f8,0x00206a9e,0x00175307,0x000b861b,0xfff913cd,0xfff5b2e2,0xfff2b0f6,0xfff0c285, -0xfff29c0f,0xfff512b2,0xfff3980c,0xfffd4eab,0x0001744e,0xffff7722,0x00001fac,0xffffeeda,0x00000df7,0x00000126,0x00000751,0x00000149,0x00000b78,0xfffff66b,0x0000278d,0xffffb430,0x0000939e,0xfffe79a3,0x0002ba0c,0xfff3c91a,0xffd287d8,0x001a39ee,0x00291e2f,0x0024687c,0x001cfe7d, -0x00165b5a,0x000c71a2,0x00012072,0xfff74b58,0xfff5239f,0xfff0c535,0xfff3b430,0xfff4d034,0xfffb43f2,0xffff9bc3,0x0003a806,0x00077148,0x000a2563,0x000d2702,0x0001def8,0xfffe7839,0x000093f2,0xffffec4d,0x00000d21,0xfffff028,0xfffffa73,0xfffffa10,0xfffff549,0x000001bd,0xffffe6ec, -0x00001ccc,0xffffac98,0x0000e2fe,0xfffe6d6c,0x00047dd1,0x00079b4d,0x0008429f,0x00007b5c,0xfff9ed9c,0xfff9e144,0xfff8f0c6,0xfff858fe,0xfffb412e,0xfff8f1f5,0xfff8538a,0xfff72f2b,0xfff75da1,0xfff7c639,0xfff9c0e5,0xffff0a98,0x00031903,0x0005a274,0x0009434f,0x0009e688,0x000b8a64, -0x00065908,0xffffbc43,0xfffffd5e,0xffffb405,0x00001a0a,0x00000d9e,0x0000126e,0x00000d8d,0x00000eda,0x0000110a,0x000007bf,0x000022a3,0xffffed35,0xffffcc08,0xffffbf1f,0xfffe5854,0x0002b286,0x00082264,0x00082022,0x0006a9b4,0x00049952,0x00025b53,0x0000e272,0xffff3ec1,0xfffc6927, -0xfff9c25e,0xfff6ca77,0xfff69f1e,0xfff677c2,0xfff59a73,0xfff6e782,0xfff7e858,0xfff918e6,0xfff93f9b,0xfffa4415,0xfff98688,0xfffa0764,0xffff5882,0x0000cd2b,0x00003984,0xffffe080,0xffffbf03,0xffffd64d,0xffffd02d,0xffffd1ac,0xffffd079,0xffffd788,0xffffbbde,0xffffe7dd,0x000093cd, -0x0000c9d8,0x00015476,0xfff8187d,0xfffab324,0xfffaf5a6,0xfffa99dd,0xfffae2c9,0xfffb6740,0xfffb880d,0xfffbad96,0xfffc1a59,0xfffc89a2,0xfffcb3b9,0xfffc8aa7,0xfffc073c,0xfffb60a9,0xfffc2654,0xfffcbf09,0xfffda6d5,0xfffe4059,0xffff1b47,0x000055d4,0xfffe565f,0xfffdbeef,0xfffe2f44, -0xffffcd35,0x0000e81e,0x000102f8,0x0000da86,0x0000ef0a,0x0000e795,0x0000f445,0x0000dffb,0x00011733,0x0000f400,0xffff1781,0xfffcf4ce,0xfffd40f4,0xfffa1493,0xfffd57ca,0xfffc8901,0xfffccb59,0xfffcd750,0xfffcb53a,0xfffcb95a,0xfffcc76e,0xfffc8128,0xfffc3bd8,0xfffc1424,0xfffbe7d3, -0xfffbeafb,0xfffbce00,0xfffc3c0d,0xfffc79b3,0xfffcabc4,0xfffd05d0,0xfffd24c4,0xfffde996,0xfffc073f,0xfffabac9,0xfffa3328,0xfffb6bbf,0xfff9d78f,0xfffa2b3b,0xfff9eeb7,0xfff9d783,0xfff9b54f,0xfff99e73,0xfff97701,0xfff97e44,0xfff90f68,0xfffa9332,0xfff80a21,0xfff83f92,0xfffc12d6, -0xfffbcae7,0xffff342d,0xfffaf405,0xfffca6c6,0xfffcecc5,0xfffccd12,0xfffcf679,0xfffd2927,0xfffe91e6,0xfffcb82e,0xfffbfdbe,0xfffa5f6d,0xfffc3e77,0xfffc940c,0xfffc3964,0xfffc1547,0xfffbc455,0xfffad9d3,0xfffbae4f,0xfffc044a,0xfffbc9ce,0xffffdb4f,0xffffe508,0xfffb9717,0xfffeb321, -0xffffb16e,0xfffe961d,0xfffe85b0,0xfffec5f7,0xffff55a4,0xffff5a33,0xffffa06b,0x000061e3,0x0000003e,0xfffe5cdd,0xfffc8853,0xffff828a,0xfffed963,0xfffb8d25,0xfffc8173,0xfffd6ae9,0xfffd07b7,0xfffdb12f,0xfffebbdd,0x0001a9fa,0xfffcf8d8,0xfffa834d,0xfff6d45f,0xfffbc793,0xfffca2ec, -0xfffa912c,0xfff9b212,0xfff8466d,0xfff62736,0xfff85b8a,0xfff9a01d,0xfffc64f8,0xffffcef7,0xfffe5143,0xffff945e,0x00000f49,0xfffff89a,0x00009a51,0x00008f78,0x00007a40,0x00004de4,0x00004536,0x00001a0a,0x000004f4,0xffffdddf,0x00000732,0xffff7fc9,0xfffd8d9e,0xffff9980,0xfff95b3d, -0xfffd43a5,0xffff2523,0xffff2f05,0x00003144,0x0000bd7f,0x0008309f,0xfffea9e3,0xfffb0571,0xfff29337,0xfffb93d2,0xfffe0ddd,0xfffc2452,0xfffb3857,0xfff9063e,0xfff4e78c,0xfff87480,0xfff9e857,0xfffd5c92,0x0000b87c,0x000002b2,0x00007e48,0x000002df,0xffffff65,0xffffcf76,0xffffc9e6, -0xffffd68b,0xffffe095,0xffffe88c,0xfffff6f5,0xfffff8ca,0x0000140f,0xfffffb97,0x00009118,0x00002529,0x0000bac5,0xfff78420,0xfffc0de2,0xfffebf7b,0xfffdd03e,0xffff0525,0x00041c88,0x000de2b6,0xffff73ac,0xfff4ee92,0xffe9bc75,0xfff90707,0xfffe24e4,0xfff814a0,0xfff43a96,0xffee8d5d, -0xffe80285,0xffeeebe5,0xfff38ff0,0xfffaf175,0xfffffcb6,0xffffe846,0xffffdbc5,0xffffe9ef,0x00000aac,0x00000f9b,0x00001a17,0x00001154,0x00000f72,0x000008de,0x0000075e,0xfffffdb3,0x00000391,0xffffe72c,0xffffde51,0xffffcb64,0x0000a9b7,0x000592df,0xfffcd1a0,0x0000cd66,0x000e46c4, -0x000c7d4c,0x0008fd98,0xfffaf7bb,0x000ce33e,0x00100cc0,0x00060e98,0x000036f3,0xfffe9c1c,0x000528d8,0x0013fc71,0x001a023b,0x0015b81e,0x0011b622,0x000aff33,0x0008ac33,0x000094d6,0xffff95bf,0x00004547,0xfffff53c,0x000004e1,0xfffff36f,0xfffff60f,0xfffff5ad,0xfffff953,0xfffff9ec, -0xfffffe0b,0xfffffc55,0x000006ba,0xfffff8c7,0x0000449d,0xffff934f,0xfffee8e3,0x0005fb56,0x00067e01,0x000feb7e,0x0011544b,0x000c443e,0x00048b67,0xfff7828f,0xfffda75c,0x00026948,0x0007a7bf,0x0011fb45,0x000dc871,0xfffd853b,0xffee0a89,0xffe52d6e,0xffe6332d,0xffeba1b9,0xfff19b76, -0xfffb275b,0x00000182,0xfffffa4e,0x00000483,0xffffeeb9,0x000008f7,0x000001d3,0x0000084b,0x000004c5,0x00000598,0x0000027b,0x00000554,0xfffffd2a,0x00000805,0xfffff10e,0xfffff222,0x00003926,0x00003c11,0x000b416f,0x0006628b,0xfffd2a32,0xfff1e468,0xfff4975c,0x00011dff,0x000e9e88, -0x000f811f,0x0009a700,0xfffb5150,0xffedb036,0xfff0b863,0x00011a4a,0x00133ffc,0x001cced2,0x001b4bfe,0x001539da,0x000cc73f,0x0004b88c,0x00008828,0xffffac3c,0x00002225,0xfffffd61,0xffffff62,0xfffffada,0xfffffac8,0xfffffa77,0xfffffbb1,0xfffffa9d,0xfffffe2d,0xfffff6a7,0x00000e01, -0xffffdc57,0x00006b31,0xffff44d6,0x00033aa2,0xffe3f092,0xffed6d33,0xfffbedb3,0x001e59d9,0x000ef292,0x000031a8,0xfff13b6b,0xffeca334,0xfffaa7e9,0x001ac1e8,0x00177e7d,0x000f9352,0xfffece6b,0xfffb2165,0xfff79d58,0xfff4d698,0xfff6153e,0xfff6e779,0xfff86474,0xffffbd27,0x00005bc1, -0xffffd5b5,0x00000297,0x0000034c,0x000005ea,0x00000847,0x00000769,0x00000751,0x00000879,0x0000054d,0x00000d0d,0xfffff5cb,0x000017fc,0xffffc427,0xffffe197,0xfffce522,0xffec4b02,0x001ddb1e,0x0029cc2a,0x00268b3e,0x0020632f,0x001926ec,0x000e3b9d,0x0004d6da,0xfffce817,0xfffc8eb6, -0xfff77a23,0xfff878cd,0xfff91843,0xfffccb5e,0xffff4df3,0x000116be,0x0005556d,0x0006a3b2,0x000a2433,0x00003e7b,0xffff4adb,0x000074c9,0xffffdc57,0x00000ac6,0xffffeb88,0xfffff528,0xfffff03c,0xfffff1c9,0xfffff19a,0xffffee54,0xfffff629,0xffffe9b4,0x00003273,0xffff9944,0x000186c8, -0x00048202,0x0008de7f,0xfffd35d6,0xfff8b954,0xfff74f64,0xfff5bb82,0xfff54c95,0xfff8d8b9,0xfff8bc8e,0xfff938f0,0xfff8e2a1,0xfff9b8d1,0xfffb116c,0xfffd86ba,0x000156bf,0x0003fc8f,0x0004afe8,0x0006fd87,0x0006c772,0x00093ae7,0x00031466,0xffff08b3,0x0000288c,0xffffd13a,0x00002079, -0x0000126d,0x000021c9,0x00001b41,0x0000209f,0x00001caf,0x00002637,0x000015ff,0x00002c60,0xffffa93c,0x000095e0,0xfffdb0e9,0x000433ea,0x0008e442,0x00066bd7,0x0006acc4,0x00047521,0x0002e8c7,0x00014ed5,0xffff73d4,0xfffd5073,0xfffb5715,0xfff92229,0xfff8ac0e,0xfff82a90,0xfff76056, -0xfff840b0,0xfff910a9,0xfff9de57,0xfffa59ca,0xfffa8be0,0xfffb14d2,0xfffda628,0x0000a3c6,0x00005b8c,0xffffff8f,0xffffe648,0xffffbcef,0xffffbfcf,0xffffbbf3,0xffffbb47,0xffffb74a,0xffffb94a,0xffffa971,0xffffe88a,0xfffff9ca,0x00008f1d,0x00000a0b,0xfffd294e,0xfffc91d0,0xfffc279b, -0xfffbc3f1,0xfffb7998,0xfffb8ac4,0xfffb4e39,0xfffb3c67,0xfffb4a3f,0xfffb5028,0xfffb3f50,0xfffb19d2,0xfffae29e,0xfffaac52,0xfffb274a,0xfffb7edc,0xfffc0100,0xfffc68a1,0xfffcdeef,0xfffd9623,0xfffe9473,0xfffda9a9,0xffffcb6a,0x00000801,0x00005ee7,0x0000b84a,0x0000b39f,0x0000bd2e, -0x0000bfb4,0x0000cadc,0x0000c634,0x0000eb3a,0x00006b9b,0x0000152f,0xffff5100,0xfffee58e,0xfffd7f27,0xfffcacc1,0xfffc96d9,0xfffc973f,0xfffc89d7,0xfffc5e0c,0xfffc47fa,0xfffc2fa2,0xfffbdf9e,0xfffb9e94,0xfffb713d,0xfffb3d05,0xfffb1f73,0xfffaeff1,0xfffb3cc1,0xfffb6f43,0xfffb980e, -0xfffbd76d,0xfffc0d7b,0xfffbe691,0xfffe0706,0xfffe7577,0xfffd2fcd,0xfffdde84,0xfffee8a1,0xfffe4040,0xfffe2e6e,0xfffe26b2,0xfffe1245,0xfffe0801,0xfffdec90,0xfffde802,0xfffe5c69,0xfffda752,0xfffc065f,0xfffd5633,0xfffb6753,0xfffbd603,0xfffaa2aa,0xfffc4ef3,0xfffc862f,0xfffcac17, -0xfffcb096,0xfffc3337,0xfffc3719,0xfffd5b05,0xfffc2ab3,0xfffbc970,0xfffaf36f,0xfffc00dc,0xfffc340a,0xfffc0076,0xfffc10f1,0xfffbeb01,0xfffb4ac6,0xfffbd5b2,0xfffc1ecb,0xfffcc31c,0xfffb4b62,0xfffb6005,0xfffc2810,0xfffe61ca,0xfffe2525,0xffff6224,0xffff1ec3,0xffff2d5f,0xffff62a7, -0xffff56c7,0xffff7025,0xffffeb03,0xfffe2a29,0xfffe3fa7,0xfffc64c9,0xfffaac53,0xfffb475a,0xfffaff2d,0xfffd068e,0xfffcb149,0xfffcdc05,0xfffb7b2e,0xfffba950,0xfffe235e,0xfffb32cd,0xfff9f700,0xfff8175b,0xfffb1947,0xfffbc98e,0xfffa9e42,0xfffa5c70,0xfff95170,0xfff7bc2d,0xfff8d2eb, -0xfffa931c,0xfffb9900,0xfffd4a50,0x00006794,0x000020c1,0x00012a30,0x0000781f,0x00006bb1,0x00004a77,0x000059a9,0x0000422b,0x00004b07,0x000027ca,0x0000410c,0x00007659,0x00011cce,0x00005b48,0xffffe97b,0xffff12dd,0xfff89c23,0xfffe534c,0xfffd674d,0xfffec8f1,0xfffbc066,0xfffae652, -0x00011d43,0xfffaf1b3,0xfff946a7,0xfff4eece,0xfff9f0d0,0xfffb9ab3,0xfffa65c7,0xfffab83f,0xfff963db,0xfff6804e,0xfff8d5d6,0xfffb1160,0xfffc40ab,0xffffe85b,0x000085eb,0xffffcfa5,0xffffb54e,0xffffc33e,0xffffe000,0xffffdfea,0xffffe3e2,0xffffe3b0,0xffffe8fd,0xffffecf8,0xffffec17, -0xffffc5a8,0xffffbe16,0xffffa369,0x00011af1,0x000167c4,0xfff8580b,0xfffe0ec3,0xfffdda21,0xfffeaa62,0xfff98fc2,0xfffa6650,0x000273e8,0xfff94c14,0xfff3b6a1,0xffee7ee8,0xfff76759,0xfffab2e2,0xfff73e17,0xfff59a63,0xfff198da,0xffec93c8,0xfff0ea0c,0xfff62326,0xfffb5a91,0x00005dad, -0xffffdd86,0xfffffc16,0x000028b9,0x00001798,0x000010a0,0x00000d65,0x00000cee,0x00000c86,0x00000a69,0x00000834,0x00000b11,0x0000176b,0x000022bf,0x0000153d,0xffff7e9f,0x0000ae7d,0xffff2deb,0xfffc3c98,0xfffd4999,0x0005749a,0x0003f379,0x00016b25,0xfff71ae6,0x0006b7fc,0x000aa533, -0x0004552b,0x00014b2e,0x00003b52,0x0004f00a,0x000c3f0f,0x00109abc,0x0011e4ae,0x000d32bb,0x0008522b,0x0003af47,0xffffd46c,0xfffff6f5,0x00000fd4,0xffffe80d,0xfffff657,0xfffff6b2,0xfffff9d9,0xfffff95a,0xfffff9e5,0xfffffab6,0xfffffbf3,0xfffff929,0xfffff822,0xffffe319,0x0000204c, -0xffffc4ac,0xfffe855a,0x00033a95,0x000733fd,0x000a6be5,0x000bdeed,0x00072010,0x0001847d,0xfff8ac64,0xfffd173f,0x0000bc1f,0x0004bf42,0x000bd983,0x00093a81,0xfffdea0d,0xfff37962,0xffebd209,0xffe99110,0xffed4df8,0xfff319ff,0xfffa2f85,0x0000ee15,0xffffc370,0x00001397,0xfffffec2, -0x00000c3c,0x00000236,0x00000513,0x0000034d,0x000003d4,0x00000371,0x000001fb,0x0000065b,0xfffffecd,0x00001f23,0xffffc2bc,0x00009343,0xffffe0cc,0x000437ea,0x0002619f,0xfffb6018,0xffef48b2,0xffecfcf8,0xfff46439,0x00012420,0x0006bc7a,0x00062df4,0xfffdaaab,0xfff1a6f8,0xfff1439d, -0xfffb1f01,0x00082539,0x00108ee7,0x001268bd,0x000e7e33,0x0009b758,0x00024944,0xffffffe1,0xffffde4d,0x000014a5,0xfffff192,0xfffffd89,0xfffffae2,0xfffffd41,0xfffffc3f,0xfffffd31,0xfffffc15,0xfffffea2,0xfffff93c,0x000001e7,0xffffea04,0x000020e5,0xffffd1c0,0x0003b74e,0xfff0f120, -0xffeec8e7,0xfff4aa4c,0x0008e419,0x000145c0,0xfffae888,0xfff73d3f,0xffefe327,0xfff77aa1,0x000c9244,0x000e0087,0x000a9bf4,0xffff8165,0xfffbc1dc,0xfff8a85e,0xfff777df,0xfff82f17,0xfff9f5b1,0xfffb7639,0x0000677b,0x00000c2d,0xffffef6c,0x00000f07,0x000004a8,0x000005b9,0x000004b8, -0x00000453,0x000005bc,0x000002a2,0x00000942,0xfffffb25,0x00001cbb,0xffffd61a,0x00007673,0xfffec65e,0x0001a3bc,0xfff435c7,0x000df6f9,0x0015eb3e,0x0016fec9,0x0011b1b4,0x000d23a6,0x00076db9,0x0000bd4c,0xfffaef5d,0xfff8735f,0xfff61772,0xfff728d7,0xfff7efbf,0xfffbd992,0xfffe5022, -0x00001344,0x0002a8ff,0x0003bcf3,0x00051624,0xffff1153,0x00002cf3,0x000001ce,0xffffed0b,0xfffff5b5,0xfffff60f,0xfffff7b9,0xfffff6ac,0xfffff802,0xfffff4f0,0xfffffb18,0xffffedd3,0x0000055b,0xffffd094,0x00003b19,0xffff9210,0x000110a2,0x0001216c,0xfff9abb8,0xfff695a4,0xfff65ac6, -0xfff6130e,0xfff69da8,0xfff889a7,0xfffa9a60,0xfffc277e,0xfffca279,0xfffc54cf,0xfffc5665,0xfffd840b,0xffffa090,0x00018eac,0x0003124d,0x00049e61,0x0004bade,0x00063866,0x000090ad,0xffff8c60,0x00001b99,0x00001bd2,0x00001903,0x00001276,0x0000125c,0x0000119e,0x000013c8,0x000010c3, -0x0000170c,0x00000be8,0x00002830,0xfffffa98,0x00005899,0xffff346c,0x0000ca9f,0x00064424,0x0004b4b0,0x00046f6d,0x0002c9a1,0x0001250f,0xffffa94f,0xfffdf79b,0xfffc6fea,0xfffaf005,0xfff991b2,0xfff9f734,0xfffa656e,0xfffa8172,0xfffb18ce,0xfffb9233,0xfffc282a,0xfffc0d11,0xfffc6de2, -0xfffb934b,0xffff1a30,0x0000e5c6,0xffffb16e,0xffffc4b7,0xffffc692,0xffffd7ae,0xffffd6a2,0xffffd794,0xffffd547,0xffffd563,0xffffd689,0xffffce72,0xffffd707,0xffffa391,0x00000e4e,0xffffe36c,0xfffe3c8a,0xfffd25f5,0xfffcd74d,0xfffc484e,0xfffbf995,0xfffbe32b,0xfffb993b,0xfffb4acb, -0xfffbc24b,0xfffc2c5f,0xfffc5947,0xfffc68c5,0xfffc3200,0xfffbe5cf,0xfffc218c,0xfffc5152,0xfffcaf5f,0xfffcd57b,0xfffd7401,0xfffd5ad3,0xfffd20e4,0xffffea59,0x00006037,0x0000ecd3,0x00007973,0x0000811e,0x00006775,0x000076a9,0x0000728b,0x0000794f,0x00007088,0x000088d6,0x000077ae, -0x0000e272,0x00004a64,0x00005a9d,0xfffbc7c1,0xfffd4f08,0xfffd15cc,0xfffcfa14,0xfffce507,0xfffcafcb,0xfffc9336,0xfffc664e,0xfffc55d4,0xfffc3180,0xfffc2384,0xfffc084c,0xfffc0a47,0xfffc0734,0xfffc32ac,0xfffc49c6,0xfffc5d98,0xfffc7d1d,0xfffc80f6,0xfffcf8ef,0xfffbe7d3,0xfffbab6c, -0xfffc9c4b,0xfffeaa4e,0xfffe538b,0xffff00d1,0xfffee563,0xfffee20f,0xfffedd00,0xfffed919,0xfffed356,0xfffedfa6,0xfffe5fa1,0xfffed085,0xfffc9bcf,0xfffbd925,0xfffbc70c,0xffff04d8,0xfffeec02,0xffff2df2,0xffff1c8a,0xffff5417,0xffff5130,0xffff589b,0xffff6b28,0xffffe0bf,0xffff511e, -0xffff18fa,0xfffea8d3,0xffff1947,0xffff32bb,0xffff2bc9,0xffff37b8,0xffff2465,0xfffecfd6,0xffff0e08,0xffff0bd7,0xffff723b,0xffff6968,0xfffeb687,0xfffcff75,0x0000a3bc,0x0000478a,0x000045d8,0x000048cd,0x00004839,0x00004829,0x00004835,0x000048d7,0x000045b8,0x00004873,0x00009bc4, -0xfffd38d5,0xfffe6bc3,0xfffe4940,0xfffec07d,0xffff4ce0,0xffff5efb,0xffff6fcd,0xffff832c,0xffffd80b,0x0000c387,0xffff67c0,0xfffead71,0xfffdb1d6,0xfffee00b,0xffff3231,0xfffedde1,0xfffedcd8,0xfffe7372,0xfffd9d7b,0xfffe0bab,0xfffe7cff,0xffff6730,0xfffecedb,0x0000a1fd,0x0000d067, -0x00001129,0xffffc8d7,0xffffefde,0xffffe2f3,0xffffe702,0xffffe55b,0xffffe6d9,0xffffe36c,0xffffee93,0xffffcc59,0x000009ae,0x0000cef7,0x0000afe8,0x0000d318,0xfffd89ed,0xffff9198,0xffffc366,0x000042db,0x0000361b,0x000063a2,0x0002d0bd,0x000014fa,0xffff02a7,0xfffcc5ab,0xfffeb5b6, -0xffff7eea,0xffff6874,0xffffb5d7,0xffff22fb,0xfffd8492,0xfffe64f0,0xfffeeb72,0xffffaca3,0x00004569,0xffffebaa,0xffffb6cd,0xfffff301,0x0000116d,0x000008bd,0x0000083a,0x000009ce,0x000008b9,0x0000096b,0x00000926,0x0000070b,0x000013e4,0xfffff063,0xffffbe2d,0xffffd800,0x0000a3c0, -0xfffd83a9,0xfffeee18,0xffffbe44,0xfffff5c7,0xffffacc8,0x00010bca,0x000439f2,0x00001937,0xfffd11f6,0xfffa3081,0xfffdc022,0xffff6fed,0xfffeb00a,0xfffe84fc,0xfffcb1a4,0xfff9e404,0xfffb2893,0xfffcb3dc,0xffff373c,0xffffe43e,0x00001d8e,0x00000c79,0x000010db,0xfffff4d6,0xfffffd69, -0xfffffbac,0xfffffc09,0xfffffc10,0xfffffb7c,0xfffffd2a,0xfffff9d7,0xfffffd6c,0xfffffc0d,0x00003b25,0xffffb5ad,0xffff962b,0x0001a090,0x0000124a,0x00007e3f,0x0003c53c,0x00046ce4,0x0003e99c,0xfffebfc0,0x0005d923,0x000716b0,0x00037686,0x00015a47,0x000019c6,0x00018854,0x000519ab, -0x0007cec5,0x0009b7ef,0x00083349,0x0006dbc1,0x0003ab68,0xffff0ac8,0x00004d17,0xffffd670,0x00000786,0xfffffd95,0x000004fc,0x0000008a,0x000002b8,0x0000018e,0x0000029f,0x000000d1,0x00000450,0xffffff11,0x00000452,0xffffdfe9,0x00002dd2,0xfffef07d,0x00024b82,0x00038876,0x00055ed6, -0x000624ac,0x00058765,0x0002f1a3,0xfffd0c8f,0xffff0e53,0x00007e84,0x000266df,0x00063f72,0x000578f0,0x00008a1a,0xfffbf164,0xfff8b2c8,0xfff82359,0xfff8ddb4,0xfffa8c7d,0xfffdb619,0x00005896,0xfffffd06,0x00000065,0x000006b3,0xfffffc54,0xffffff88,0xfffffe50,0xffffff2b,0xfffffe48, -0xffffff9a,0xfffffd14,0x0000029a,0xfffff4e4,0x000018a1,0xffffd2fc,0x000074d7,0xffffe73d,0x00014835,0x00013402,0xffff2fb9,0xfffd02ec,0xfffbdcb7,0xffffd02e,0x00064c8a,0x00062ec3,0x00049f75,0x0000e5fd,0xfffb6c04,0xfffb7927,0x00002180,0x00056ff5,0x0008a553,0x00091374,0x00074956, -0x00052b13,0x0001f698,0xffffae72,0x00000870,0xfffffbd7,0xfffffdc9,0x0000013c,0x00000191,0x000000eb,0x0000013a,0x0000011d,0x00000124,0x00000122,0x0000011d,0x00000223,0xfffffbf7,0x0000011c,0xfffff912,0x00015b00,0xfffaee60,0xfff9ae63,0xfffefd3b,0x000c0f98,0x00070c8d,0x00023182, -0xfffda1a0,0xfff92e47,0xfffc4c34,0x00069a20,0x0008dbb7,0x0007cc77,0x0001d781,0x00000215,0xfffe8b5b,0xfffe0a5b,0xfffde901,0xfffe14ae,0xfffebff2,0x000013d1,0x00000f77,0xfffffa68,0x00000821,0xfffffaf3,0xffffff70,0xfffffdc8,0xfffffe83,0xfffffe61,0xfffffdca,0xffffffbd,0xfffffada, -0x0000057e,0xffffefef,0x000030d7,0xffff8e6e,0xffffc43c,0x000070ac,0x000d50a2,0x0010be96,0x0011e927,0x000f2441,0x000c7a44,0x00089525,0x00041edd,0x00009347,0xffff683c,0xfffd5552,0xfffd41f2,0xfffd7499,0xfffe680b,0xffff0d86,0xffffc979,0x0000ecb2,0x0001d4d3,0x00025cd1,0xffff52e6, -0x0000407d,0xffffd8a2,0x0000094b,0xfffffee0,0x00000609,0x000001d7,0x000003d5,0x000002f0,0x00000373,0x000002d1,0x000003eb,0x00000340,0x00000027,0xffffee5d,0x000013c1,0xffff4958,0x00012711,0xfffdca7a,0xfffba1d2,0xfffb74b3,0xfffb2f6b,0xfffbc6e9,0xfffd9aa7,0xfffdb2a5,0xfffe18cf, -0xfffe43fe,0xfffebb06,0xffff3c04,0x000011f8,0x00012068,0x0002027b,0x00027624,0x0002efb2,0x0002b8f6,0x0002ca06,0xffff5a5d,0x00002eaa,0x00000b1d,0x00000b71,0xfffff289,0xfffffaee,0xfffff8bf,0xfffff99c,0xfffff8e9,0xfffff9cc,0xfffff833,0xfffffc4f,0xffffef2d,0x000013f0,0xfffff26d, -0x0000580f,0xffff8426,0x00045e67,0x00036339,0x0003612d,0x00029bfe,0x0001e91b,0x000129f0,0x000067bc,0xffff7f14,0xfffeb3a9,0xfffdcffb,0xfffdb987,0xfffd9e54,0xfffd6b49,0xfffdbbae,0xfffdf7b7,0xfffe440f,0xfffe5d37,0xfffea332,0xfffe78c8,0x00007cfe,0xffffe7e1,0xffffb4ce,0x00000257, -0x00001487,0x00000fcf,0x00000e31,0x00001040,0x00000e9a,0x0000105d,0x00000de4,0x00001082,0x000012f3,0x00000511,0xffffb655,0x00000cd3,0xffff4a82,0xffff83c7,0xfffede35,0xfffee690,0xfffebd11,0xfffecc21,0xfffeba3e,0xfffeb0d8,0xfffe9676,0xfffe7b37,0xfffe5436,0xfffe23a4,0xfffde305, -0xfffd9b5b,0xfffdb683,0xfffdc3f9,0xfffde6cd,0xfffdeb2a,0xfffe2942,0xfffdefa1,0xfffeb45f,0x0000d744,0x0000ad83,0xfffff68a,0xffffbb1c,0xffffdcc7,0xffffd15f,0xffffd515,0xffffd373,0xffffd507,0xffffd194,0xffffdc19,0xffffbd02,0xfffff3ae,0x0000a2e9,0x0000a249,0xfffea459,0xffff1119, -0xffff05ed,0xffff0401,0xfffef94c,0xfffee868,0xfffedde9,0xfffedc62,0xfffeb004,0xfffe8b7f,0xfffe6cde,0xfffe4910,0xfffe30fb,0xfffe0fdf,0xfffe2852,0xfffe31ed,0xfffe3b22,0xfffe4b08,0xfffe4c27,0xfffe89e7,0xfffe14e1,0xfffe389c,0xfffd9736,0x0000caca,0x0000795b,0x000077ad,0x00007a6e, -0x000079db,0x000079d5,0x000079d9,0x00007a6c,0x000077c2,0x00007981,0x0000c58b,0xfffdc44c,0xfffe8035,0xfffe5828 +const Word16 defaultHRIR_rom_elevBsShape_Q_fx = 15; +const Word16 defaultHRIR_rom_elevBsShape_fx[36] = { +32767, 13824, 4096, 512, 0, 0, 16256, 19456, 14976, 8192, 3456, 1024, 128, 0, 0, 2603, 8533, 14976, 19115, 18901, 15360, 10283, 5461, 2304, 683, 85, 0, 0, 85, 683, 2304, 5461, 10325, 15701, 20053, 21845, }; -const UWord32 defaultHRIR_rom_AlphaR48_fx[470 * 128] /*Q30*/= { -0x08945950,0x08070b50,0x0a49d6a0,0x01bd7c0a,0xfe8e8ea8,0xfc2f2da0,0x03d9eadc,0xff0186c2,0xfc122c50,0xfbe0a0e8,0xfc206c28,0xfd11f02c,0xfc3abd38,0xfc07e728,0xfc3b9950,0xff036bd6,0x02d4bca0,0xfbdbc558,0xfef1f73c,0x015de0c6,0x095c18c0,0x0773d5b8,0x07e73000,0x080876d0,0x081163c0, -0x0824a330,0x0835f7f0,0x084b5f70,0x086feee0,0x089c88a0,0x08d20e60,0x090371e0,0x09517940,0x092d8530,0x09028ae0,0x08987f90,0x08931f20,0x0a0e8e20,0x08b90d00,0xfdf48fbc,0x0693d930,0x02488cdc,0x02b07554,0x04443188,0x03bbc4f4,0x0594cd00,0x03e35c18,0x0205e0c8,0x0385d814,0x04150620, -0x03a53d84,0x0201923c,0x032afa50,0x03171178,0x03f60448,0xfec67ca4,0x06ee54d8,0x0851b610,0x0812b5e0,0x08b99090,0x08c1d7a0,0x0906cf10,0x0933fa90,0x0962ff70,0x09bd4010,0x0a475770,0x0af66880,0x0ba70470,0x0c63a8e0,0x0c4da000,0x0bc22ab0,0x0a9207f0,0x0a00d410,0x0ba14f60,0x082f2360, -0x024f3180,0x03f355fc,0x010cf4e2,0x01cd60c2,0x01981046,0x017afc6a,0x003916ac,0x02b2ca90,0xff687d95,0x0330d3e8,0x001e62b2,0x01f65468,0x00485c85,0x01d01b4e,0x01d883ba,0x01d85f22,0x01308a74,0x04ab9348,0x082685e0,0x07960990,0x08f08cb0,0x08fd7070,0x097edad0,0x09dca8c0,0x0a49ea30, -0x0b041620,0x0c0f8ed0,0x0d283110,0x0e81e310,0x0feb4b40,0x0f9b8e80,0x0e8f5140,0x0c4e6490,0x0afdee80,0x0cc92e20,0x068965e8,0x010db3a0,0x039e2080,0x01f988a2,0x014c2dca,0x0199b6c2,0x01269804,0x00ed584e,0x006ddf1f,0x0120c61c,0x0035041c,0x001decde,0x00bbcbe4,0x0078a1e1,0x0115596a, -0xff860e3b,0x01b69ae8,0xffefcebe,0x039ace00,0x070b9878,0x07264708,0x08a97990,0x08bfcc50,0x096e14b0,0x09f99f30,0x0a663f30,0x0b75f5d0,0x0d1af280,0x0f091a00,0x115dfe80,0x13e48a20,0x13b8bc00,0x11ddab00,0x0e4d7010,0x0bbd2390,0x11aae720,0x09e412c0,0x0291b0ac,0x0324f458,0x0162de28, -0x009cee42,0x01bdb8d8,0x00bf5bba,0x00d40526,0x00a1cecf,0x00c21806,0x00afbff5,0x004beb76,0xffe7dbd1,0x004f60eb,0x0107165a,0x005ca611,0x01f8152c,0x00792d44,0x042ab620,0x08d36fd0,0x08ea62d0,0x0be16e50,0x0ccdf7c0,0x0e1c2aa0,0x0ec10f70,0x10b286c0,0x11f08ee0,0x1206ae20,0x15341780, -0x15fd7420,0x15694120,0x14b4fc80,0x136a76e0,0x123cc0c0,0x101ad800,0x13457a00,0x083191e0,0x00e096cd,0x04329d70,0x04088b80,0x02054c10,0x02cc1de0,0x00e69eeb,0x010211e0,0xffff5040,0x008dafcf,0x007c5152,0x006c0afa,0x00dd5358,0x010dff1e,0x0159705e,0x00789fb2,0x0227ed80,0x00603db9, -0x04e71d60,0x09e71530,0x0a2e4130,0x0d959060,0x0e6b5b30,0x0ffc06a0,0x113e8aa0,0x1115e020,0x1151ae40,0x11c5cba0,0x13f5a960,0x155030a0,0x15eb2060,0x1680a700,0x15e53e60,0x15368500,0x1235b480,0x191c3e60,0x0b3d4180,0xff41ac34,0x04f32a60,0xffe36000,0x03927210,0xff6bf9e6,0x01842b3c, -0x004fa0d5,0x01825a92,0x00ca53a1,0x006e1c6f,0x00ce078a,0x00e133de,0x011fddc8,0x02407110,0x00fe8306,0x02d69d5c,0x01797798,0x04976ee0,0x0a4939f0,0x0a1dd970,0x0d771000,0x1020f800,0x13673ec0,0x166512a0,0x17accb40,0x17a1e420,0x16254a80,0x13db8bc0,0x142067e0,0x16688560,0x17f90540, -0x1968ad00,0x1ca6fc20,0x18d5de80,0x1bad2ce0,0x0d3e71f0,0x01ede7b4,0x07d271f0,0x00a2ef66,0x03e84778,0x01ba308e,0x01214d48,0x004c4881,0x0146b67a,0x01b64d38,0x01032d86,0x009a9dd8,0x00282128,0x01509b3c,0x010dcf5a,0x0124000c,0x034d7180,0xffa615b2,0x055b0ad0,0x098ddc90,0x09666c90, -0x0bf3dfa0,0x0e24a2a0,0x10614c80,0x11f0d2c0,0x13c67320,0x14b8df20,0x14f9c3e0,0x15c6a640,0x15d76560,0x159d63e0,0x15f301a0,0x162d72c0,0x185e23a0,0x181a5580,0x181f46a0,0x1026d560,0x01c2c274,0x03afa760,0x04675948,0x00f6d985,0x036dd6f4,0x030f0b3c,0x00a31b88,0x012e040a,0x00417cb5, -0x00f718b5,0x015924cc,0x01220c68,0x013e4d7e,0x00e95c43,0x023a2ef0,0x02b47550,0xffa7e85a,0x062ef9b8,0x09adb910,0x085d9270,0x094ea980,0x0a8abe10,0x0cfacc00,0x0ffd6b70,0x11cf4cc0,0x137e2580,0x14ff3000,0x135b9bc0,0x1299da20,0x139c7820,0x12d14f20,0x13715e60,0x15e96900,0x15d73860, -0x10e3d700,0x0c321240,0x00d97938,0x03524854,0x016c867e,0x00e6ad21,0x025b035c,0x0163fe78,0x022bf9b4,0x01b0d95a,0x02fc03b4,0x0097188f,0x00c50b5b,0x015ab5c6,0x020e98b0,0x0221fb60,0x0322b83c,0x031d03a0,0x019a1b44,0x05d4cae8,0x0a148c70,0x092056e0,0x09e73f30,0x0afe45f0,0x0c20cef0, -0x0cb5ca80,0x0d2b60f0,0x0d1f68a0,0x0d03a060,0x0da3a260,0x0ed12ac0,0x0fd18650,0x0f86b0a0,0x0f1e50f0,0x0ee6fef0,0x0e916e00,0x0ccdaf70,0x082191e0,0x03154d28,0x05bff740,0x023fc88c,0x02c465c0,0x01f9a4ca,0x01965164,0xffddce8b,0x02d34a14,0xfee5bb0c,0x0405ac60,0xffdc9b39,0x0227cacc, -0x00012c57,0x021f30a8,0x0156aaca,0x02607d54,0x0152b2b8,0x05d90690,0x09185bb0,0x072a78f0,0x07facb00,0x08582380,0x092686e0,0x099443b0,0x0b2bff40,0x0c785370,0x0dbf84a0,0x0e1b9f10,0x0e4c8280,0x0e9ae3c0,0x0e2a6920,0x0d811650,0x0d4cf240,0x0b814bd0,0x0a103740,0x0937ec20,0xfd3ac758, -0x0690bab8,0x021c1b0c,0x02bcae70,0x04e6f730,0x04564040,0x06ddc1e0,0x05166e28,0x0298b38c,0x047de220,0x0576dc50,0x04e61518,0x02b947bc,0x0434eaa0,0x044c1b70,0x04cbd198,0xfe92de14,0x07568ca8,0x082007f0,0x07a5d7b0,0x0801c1e0,0x07da8058,0x07f7e950,0x07e50778,0x08dcdf90,0x097299f0, -0x0a1a6b40,0x0a97a6c0,0x0b288d40,0x0bc480c0,0x0b44b560,0x0ac49e50,0x0a9034f0,0x09d34ed0,0x09710fb0,0x0beaef40,0x01fbaeb2,0xfe69af2a,0xfb881108,0x04b34468,0xfeb304a0,0xfb2d1d30,0xfad0de28,0xfaffa118,0xfc3c096c,0xfb262280,0xface25b8,0xfb13e3e0,0xfea29e1e,0x035d17d4,0xfa9d13f8, -0xfe7cf504,0x0183884c,0x0b495460,0x08ebba60,0x094ab280,0x094eb730,0x094beca0,0x0950f7c0,0x09342600,0x09725db0,0x099d2ee0,0x09cba260,0x0a0f6f00,0x0a48a520,0x0aa36490,0x0a63bfd0,0x0a461660,0x0a20a030,0x0a0aa6b0,0x0aff1420,0x17a7cc00,0x162661a0,0x1908c9e0,0x10d15cc0,0x09f91620, -0xfff9cc1a,0x134d7200,0x0a858e10,0x00dcc5da,0x00618203,0x005a1776,0x01398490,0xffda7e9f,0xff9e9af6,0xff982728,0x0a15c6b0,0x116a35e0,0xfea43f1a,0x09c3a7c0,0x0f60d090,0x170aab00,0x1483efc0,0x15941100,0x15d36e20,0x1602d5e0,0x163c4560,0x16785660,0x16c39100,0x1724e200,0x1791e120, -0x1816d680,0x18963380,0x196448e0,0x1908ab40,0x18a72280,0x17a73600,0x177a1640,0x1a8b25a0,0x1a16e3e0,0x08461160,0x1516e940,0x0e5ccfe0,0x0dbe3300,0x105ac340,0x0ea57470,0x11616140,0x10214960,0x0cff18d0,0x0fa04850,0x0f44e710,0x0ec48830,0x0b5e9450,0x0d339460,0x0ecf8260,0x0f0d49a0, -0x06ff0018,0x14bf01a0,0x15984240,0x16553260,0x1776c9e0,0x17e39d60,0x18947260,0x1944b700,0x19fcbd60,0x1b054fa0,0x1c570880,0x1df2d160,0x1fb47060,0x21cc4c80,0x219adc00,0x206991c0,0x1d5bb540,0x1c17d420,0x1d673080,0x1911ee80,0x106c7520,0x10a3d780,0x0a644bb0,0x0aab4eb0,0x099c9300, -0x0942ac50,0x06813538,0x09932760,0x05224d60,0x0ac11b30,0x04e85950,0x09031720,0x05d98628,0x08fc4660,0x09aeb390,0x09719f90,0x0a4a8340,0x0f6471e0,0x14565740,0x1513d7a0,0x17c5fda0,0x188c9200,0x19f06ae0,0x1b468980,0x1cc89420,0x1eb9eb00,0x21460c40,0x24023040,0x27761c80,0x2b4d2d80, -0x2a8ac080,0x2848f780,0x2244c740,0x1f23c5c0,0x1fd899c0,0x1732fcc0,0x0d060300,0x0e5fe3d0,0x09da56f0,0x07b13f58,0x070c87a0,0x04a176d0,0x03d2d7c0,0x026b77e4,0x037563f8,0x01154fc0,0x0172f86c,0x026f241c,0x024831bc,0x043775f8,0x01c801b4,0x061aa830,0x04aaab38,0x0b67c8d0,0x113d2c60, -0x130ec000,0x1682cee0,0x177d5b60,0x19742e00,0x1b5a0cc0,0x1d2ea5a0,0x20402e40,0x2416c1c0,0x28bcd180,0x2ec1aa80,0x35d75800,0x35bff640,0x31b14fc0,0x28026740,0x21bfa840,0x2a724380,0x1e609e80,0x14903380,0x0fb9b400,0x09c40560,0x07797690,0x0896bd00,0x058b9c48,0x04c39398,0x038f70bc, -0x03791988,0x02a53e6c,0x01e71822,0x0120b14a,0x02a4a5ec,0x04991d98,0x04416848,0x07e45448,0x07ca7a18,0x0eb464d0,0x18032260,0x1add6060,0x21819640,0x247d4600,0x280698c0,0x2ad55b00,0x2ea4dec0,0x319cf0c0,0x324b7500,0x3b9d29c0,0x3e072600,0x3c83d380,0x39863640,0x3600c5c0,0x32bd0a00, -0x2cd6cdc0,0x3259f440,0x1da521c0,0x11603100,0x12f70e20,0x12074be0,0x0b625e70,0x0a25e960,0x059d6398,0x04ab23f8,0x0273b30c,0x030622b8,0x02edb8f0,0x02bff884,0x0408dc10,0x04c757f0,0x05e57ec0,0x069c11d0,0x0a164380,0x08a0d140,0x114f2aa0,0x1a98e2a0,0x1d19d8e0,0x245d50c0,0x27ece780, -0x2cf4a540,0x31d2bbc0,0x339d7600,0x359dffc0,0x36ee6040,0x3cf87a00,0x402e9e80,0x40620280,0x409faa00,0x3e6e3140,0x3bb45340,0x34c72f80,0x3e4a8780,0x27a91c80,0x101f9b40,0x13fe5d60,0x0b0500d0,0x0ed69990,0x04bf2990,0x0739d978,0x03b30f44,0x05fccea8,0x0540e010,0x036fb990,0x040c1e20, -0x04d47648,0x05ac9388,0x096f79a0,0x07f99128,0x0b440370,0x0b5113b0,0x105b4c00,0x1a0e9940,0x1c6e9180,0x23ff9780,0x292cde40,0x301120c0,0x3741be40,0x3c07abc0,0x3ecf3e00,0x3efaf2c0,0x3b0d4a40,0x3a327cc0,0x3cac59c0,0x3d7a6540,0x3fc9ce40,0x440b1480,0x3fe7d940,0x3d40afc0,0x2b96fd80, -0x17de5000,0x198fc860,0x0a5bd130,0x0f25cd20,0x08722030,0x06e68fd8,0x03f7ba00,0x060c1fe8,0x09753d50,0x0598b440,0x03c1d2c8,0x04314e18,0x07359de0,0x06f8f8a8,0x09596670,0x0e103e30,0x08cadc40,0x120b9c00,0x1856bf00,0x19ee3c80,0x1fd66a80,0x26a446c0,0x2c95e240,0x30f43340,0x3629b500, -0x39320d40,0x3a6080c0,0x3dfd2500,0x3edc4e80,0x3ebbbf00,0x3b5f2380,0x3824f400,0x36b88c00,0x3ab0e8c0,0x387e5dc0,0x2ef68180,0x18863f60,0x1527e5c0,0x1303ccc0,0x0a7285d0,0x0cc8cf40,0x0cf61a90,0x0691d608,0x07765d48,0x051f74f8,0x05c05ca8,0x0649db30,0x06841d48,0x078f75d8,0x07823860, -0x0b109720,0x0c86fe60,0x08dce870,0x16a622c0,0x1b85c8c0,0x1a5de600,0x1ab22ae0,0x1e80d100,0x2431d4c0,0x2bc98600,0x309e9240,0x354bd740,0x393edac0,0x377a9940,0x36b8c940,0x398bc200,0x367df600,0x36e94a00,0x3869c9c0,0x399b0280,0x2d8c32c0,0x273fdac0,0x139b3400,0x144c6b60,0x0cb5d640, -0x0bdc4dc0,0x0c902170,0x09434f70,0x0a305e30,0x08aa0620,0x0b9c4410,0x056fc1d0,0x05fe6798,0x078ada28,0x09f20570,0x0c1f4300,0x0fac7230,0x0f6aea50,0x0e24a8b0,0x163981c0,0x1d494ac0,0x1c25dd00,0x1c09a720,0x1edd68e0,0x21f0dd00,0x24b55780,0x2761cc80,0x2949fe80,0x2af51d40,0x2ced6b80, -0x2f3f5940,0x30943f40,0x2fdb7180,0x2eb72780,0x2c3fda00,0x2c56f800,0x25bcf100,0x1e50b3e0,0x14b65e60,0x17876380,0x0fbcfaa0,0x0ed5f2f0,0x0bedecb0,0x09f6b500,0x068a9f10,0x0c146c20,0x05786b98,0x0f7e6320,0x056160e0,0x0bb4b7b0,0x0681b9f8,0x0c264d30,0x0b4d9710,0x0dfdcd80,0x0dcfcc10, -0x15e646c0,0x1b4f3b60,0x18b46260,0x1a57f720,0x1bf35f60,0x1ddad8c0,0x1f126300,0x22f7a880,0x261f2a00,0x29423440,0x2a905940,0x2b987980,0x2cdbde00,0x2b917000,0x2a181600,0x28df8bc0,0x2557c0c0,0x1f7beea0,0x1fc06360,0x069ce9c0,0x19669f60,0x10cde2e0,0x10c855e0,0x15600220,0x13457900, -0x186d19a0,0x16fcffc0,0x11aa2700,0x1647f040,0x168695c0,0x159c6060,0x106bfe00,0x130a9dc0,0x14e5a0e0,0x1428d6c0,0x0716b530,0x1a0d33c0,0x1a1ff1c0,0x1a338580,0x1ad88400,0x1b02f220,0x1b967b20,0x1bdf4d20,0x1dfab120,0x1f595e20,0x20d88b00,0x21f3b5c0,0x23235840,0x24996cc0,0x23330340, -0x2216c7c0,0x2154d9c0,0x20126e80,0x1daacd00,0x22146d00,0x152edf60,0x0c0d30a0,0xfeb89d54,0x19fdbc80,0x0cbfaf60,0xff5be660,0xfe88add6,0xfe63ff8c,0x0037f9c4,0xfdf99bc4,0xfd8dcb5c,0xfdc38e64,0x0c74a110,0x173ccaa0,0xfc24e3b0,0x0bc9d200,0x13b1ade0,0x204899c0,0x1c1f6fc0,0x1d413040, -0x1d40afe0,0x1d5a3f60,0x1d681460,0x1d40bfe0,0x1dc442e0,0x1e291400,0x1e93c480,0x1f314900,0x1fb7c8a0,0x208ac900,0x1ff7e4c0,0x1fb4cac0,0x1f461ca0,0x1f358b60,0x220af480,0x0d5bff90,0x0cbb9580,0x092cedf0,0x15bdc660,0x19b2c520,0x1913d000,0x11a95460,0x18040080,0x1929ff40,0x1944cc00, -0x18b12e60,0x170f53e0,0x18049600,0x183e5ca0,0x17b76880,0x178d33e0,0x12791120,0x183d5e40,0x17fc0a40,0x14ef2fc0,0x09348420,0x0becd9f0,0x0bb8e110,0x0bd14b50,0x0c04b630,0x0c380bb0,0x0c74d060,0x0cc64b70,0x0cf0f960,0x0d0cde80,0x0d107990,0x0d1f19a0,0x0d360560,0x0d368da0,0x0d32f700, -0x0d3c25f0,0x0c9f47f0,0x0daae820,0x0f4d6580,0x1be3d6c0,0x0ea174c0,0x132ce3e0,0x11c8ca20,0x0ef042c0,0x0ea0b110,0x0b7e5f80,0x0dc80f00,0x106ae900,0x0e4fca50,0x0cfa6090,0x0dc6f750,0x0fa19840,0x0ee1b5d0,0x0ffad3c0,0x0eb72780,0x15fb6ac0,0x0cda08c0,0x0b0d4a60,0x0c5a0180,0x0c46d7d0, -0x0ce00130,0x0d63acf0,0x0e361ec0,0x0f332e60,0x0fd3a380,0x10111400,0x0ffc39c0,0x1025bde0,0x108925e0,0x10b5d460,0x10a90440,0x10711c60,0x0f943d60,0x0ce73880,0x1073a2a0,0x15a52d80,0x108275e0,0x112d9e40,0x0ec26b30,0x0d8ea650,0x0c3400c0,0x0c87f820,0x089fb3a0,0x0ce41f10,0x080bd730, -0x0b3086e0,0x09cb2080,0x0bbe37e0,0x0b063510,0x0c889670,0x0cdb1660,0x0f909be0,0x0c95cf10,0x09609530,0x0be87540,0x0bfa5090,0x0d323f10,0x0e554c10,0x0fcc0600,0x1198e460,0x128ad100,0x13177520,0x134d31c0,0x137cc540,0x13c6f580,0x140a28c0,0x1421af00,0x13848a20,0x11a45520,0x0d6e8c90, -0x1437a520,0x15ba5460,0x0d8f6dc0,0x0bd3e900,0x0ae873f0,0x0857f5e0,0x05e83468,0x0426b768,0x038a73e0,0x027acc34,0x02a1b31c,0x02c17220,0x02934838,0x037fa068,0x04bd1140,0x07142660,0x06f11518,0x0ad43360,0x0980b960,0x07931518,0x09885ee0,0x0a351bc0,0x0be9d500,0x0d8e0b00,0x0fc67b00, -0x12c6b380,0x14a595e0,0x1538a8e0,0x152de100,0x15adc0c0,0x16ba5f20,0x17b6d6c0,0x17e52a20,0x16646fe0,0x13edecc0,0x0b8a5c90,0x10d78280,0x1a69ae40,0x12c2e4a0,0x0f56b500,0x0d2132a0,0x09231580,0x07e89ae8,0x05fa1bb0,0x048eaa90,0x04a2b738,0x037cebf0,0x0385ade0,0x03a27be0,0x04fd37b8, -0x05fef0f0,0x081c3c90,0x099164b0,0x0ec3a4e0,0x0e5e02f0,0x0e811cd0,0x1346d460,0x14249940,0x1619b860,0x187927e0,0x1cb1e260,0x1becb180,0x1d112c40,0x1f804360,0x20a0dd40,0x20391800,0x1dc7c0c0,0x1b9d97e0,0x1a4e69a0,0x1a239fe0,0x1642c0a0,0x10ac82c0,0x1b8df260,0x21e09e80,0x171b8f60, -0x132af4c0,0x0fb50500,0x0ae43bb0,0x09de7460,0x06c45be8,0x05cd0d48,0x0536b940,0x04609508,0x04101a68,0x046d2e88,0x0531bef8,0x06f53690,0x0bc34f50,0x0d384490,0x1287ff00,0x10d68000,0x0ebaae50,0x1117eee0,0x0fa83f60,0x12a19620,0x15d55440,0x1a5be260,0x20cb7b00,0x255dc900,0x27539200, -0x28c714c0,0x2855af80,0x23ff7e80,0x22161040,0x1f520260,0x1c31eb80,0x196f0600,0x0c34e200,0x1efbe0c0,0x27595f40,0x168d3900,0x1a76a060,0x10a83ac0,0x0fb39920,0x09fb57c0,0x07e96190,0x076e80a0,0x0a345c00,0x07400340,0x0744fb68,0x08489680,0x089d0d10,0x0a263d10,0x0ea984d0,0x0d505210, -0x117fae60,0x0f72aa60,0x0a0ad2c0,0x0dc1e980,0x0d571d10,0x0b2401e0,0x09e38400,0x0a445360,0x0e8950b0,0x160faf60,0x204cea00,0x267f30c0,0x249d81c0,0x1d792340,0x18f39d80,0x14dffec0,0x0bb07bf0,0x10cdbba0,0x02ab8edc,0x1a6d9260,0x26962dc0,0x1313b520,0x161bf4c0,0x0e0d5850,0x0c33ced0, -0x09dba0d0,0x088a7780,0x0919d7b0,0x10873d40,0x0889cbc0,0x062f6ec8,0x0918e3a0,0x0a953650,0x0c6d4d30,0x0ff07e60,0x10138760,0x1518b560,0x0f9eb7e0,0x0a117c80,0x0c787a90,0x0c6fc440,0x0f83b060,0x10bacda0,0x11cd2a00,0x14021b80,0x16c89540,0x19ecf580,0x1f81f340,0x2388c900,0x25ed8e40, -0x1ed42fc0,0x18ce8300,0x0f743ca0,0x0f059820,0x0d581ff0,0x14118ae0,0x2629c140,0x1a223240,0x13240460,0x12b4f3c0,0x0df63450,0x0dc11130,0x0d4a7190,0x0c342f50,0x0d34c060,0x09d0cb70,0x09623050,0x0b1d9730,0x0d402bf0,0x0f3c8660,0x1099b880,0x126ad520,0x18568280,0x15ab7940,0x115d2820, -0x12ef1c80,0x0f538c50,0x10a8b640,0x109ebb80,0x11bc5a60,0x1312ac60,0x156b4780,0x183c5bc0,0x1f14f320,0x23da4640,0x26576f40,0x26153b00,0x23028340,0x1a060f80,0x18e807e0,0x18959180,0x1ad95b40,0x26b6d880,0x1d556fa0,0x184c0ca0,0x16956fe0,0x118350e0,0x0f4b4000,0x0e37d4f0,0x0e19e090, -0x0da32360,0x0c37f680,0x0bab4180,0x0c59c4b0,0x0e034870,0x116780a0,0x14326900,0x15db43a0,0x19a008c0,0x18072720,0x14e77dc0,0x1594ff80,0x114801a0,0x111940c0,0x11f5c360,0x150c5dc0,0x18cb1a40,0x1e042d80,0x23afe800,0x25ae6e00,0x25f5f440,0x258594c0,0x26ecb000,0x263239c0,0x221e3600, -0x2050fd40,0x1cf154e0,0x1fee6400,0x2078de80,0x1a84c300,0x19c6bc20,0x16035ee0,0x14316280,0x10e38be0,0x124dd260,0x101a5bc0,0x1342e320,0x10b91c80,0x1158a8a0,0x11f4e9c0,0x12975980,0x13d66c80,0x15e2aac0,0x16c49ac0,0x1a054260,0x178d1980,0x156a5ac0,0x18764020,0x190b6980,0x1a241f00, -0x1a26df00,0x1a5ab5e0,0x1ae71be0,0x1b334700,0x1b7a91a0,0x1d462580,0x1f575aa0,0x215107c0,0x214b0600,0x21f24380,0x2217c480,0x215826c0,0x1b8ae400,0x1d240700,0x22b8bd00,0x1c3be8e0,0x1e34ed00,0x1c5d77a0,0x19e24420,0x18a99860,0x170040c0,0x19657900,0x1ad72600,0x19d1fec0,0x17784760, -0x180230c0,0x19626800,0x193edde0,0x1a71e640,0x192c9180,0x1cbbe0e0,0x1a809b80,0x19e92280,0x1b958a60,0x1c0fb1c0,0x1d451200,0x1e6fc260,0x1fbb2ce0,0x1f4f3420,0x1f470000,0x1f210f60,0x1f082440,0x1ea83560,0x1eac8ec0,0x1deac0e0,0x1d770720,0x1cbcc6a0,0x1cd50360,0x191ff740,0x171bc1e0, -0x22168540,0x23d1c700,0x1f036a20,0x1edd11c0,0x22d21940,0x1fa53100,0x1fefb580,0x1f6fbc00,0x1e199140,0x1ec52340,0x1f4f18a0,0x1eb34300,0x2270c080,0x1f13d1c0,0x1e52a180,0x22ddffc0,0x2126c680,0x16528140,0x1845ed40,0x18a839c0,0x18e49460,0x193e0e40,0x196c2540,0x19ddd900,0x19b45d80, -0x19b88b40,0x19b8b220,0x19a708a0,0x199cb020,0x19955500,0x19721b40,0x195a1800,0x191ef500,0x192ae7e0,0x1ae6c460,0xfa6ffc40,0xfae7cb90,0xf77df160,0xfeff8266,0x0725bfc0,0x153dbea0,0xfb4a8d90,0x05b7e8e0,0x12cf8460,0x13433f80,0x133a97c0,0x12afbc60,0x1400ae80,0x145eaae0,0x149ba3a0, -0x06071f68,0xfd3c7f1c,0x16690340,0x070f36f0,0x003a2f54,0xf9136108,0xfbdf88b0,0xfab60b90,0xfa862e30,0xfa78f958,0xfa7660d8,0xfa899ce0,0xfa853d30,0xfa597340,0xfa1e1aa8,0xf98ff2d0,0xf90b7338,0xf80ebde0,0xf8a70bc0,0xf8f5ce78,0xf9c95260,0xf9940e00,0xf8d8aec8,0xf855f6f0,0x0c20b200, -0xfba91630,0x022af414,0x02ef058c,0xff1ba86d,0x006cd96a,0xfc7fe294,0xfd55b180,0x00f2826c,0xfdedeaa0,0xfebf0c9c,0xff076820,0x03ccd4ac,0x0253f6c4,0x002cf5e7,0x0138347e,0x0afbf120,0xfbd327f0,0xfbce6350,0xfae7c910,0xfa051c40,0xf9e48940,0xf9e2dd80,0xfa364908,0xfa657aa0,0xf9fc62b0, -0xf9160210,0xf75df430,0xf56d3720,0xf29c5ab0,0xf36814f0,0xf45e18d0,0xf6fd97a0,0xf77b37c0,0xf7aca490,0xfb20d8f0,0x00d0a154,0xff142f20,0x04441950,0x0384b95c,0x03653d78,0x021a0ad0,0x04169258,0x0100743c,0x05832748,0x001c763a,0x06202e40,0x01b39b08,0x058b5a48,0x0306cc7c,0x037ad444, -0x04e960d8,0x04465598,0x00977ba0,0xfc86ac34,0xfbc28760,0xf9809b70,0xf94f92a8,0xf9579e88,0xf9f952c8,0xfa42e988,0xf9bb7ca8,0xf8220578,0xf54c52c0,0xf1181c00,0xeb6f0ea0,0xed95cd20,0xef82fe60,0xf55b1ba0,0xf7121de0,0xf7f06690,0xff4cc8b3,0x054eea40,0x0046c034,0x023677bc,0x03b0aa74, -0x02d94344,0x02e2de48,0x01b1fc14,0x0224758c,0x01b1a122,0x034194b0,0x02b7d4ac,0x02854f40,0x03596848,0x03378218,0x0671a038,0x04aea868,0x06dd4190,0x02faed20,0xfec8f76e,0xfce0b434,0xfa1a5bb8,0xfa1ec650,0xfa490898,0xfbb01298,0xfcff1ab0,0xfbe4aa20,0xf98753e0,0xf477b9a0,0xecd6b240, -0xe2644380,0xe4541aa0,0xe82f0ea0,0xf1f8c200,0xf6d03a70,0xed58e620,0xf3f573f0,0xfca3632c,0x0162b8fe,0x03c6e45c,0x03977e5c,0x00263b39,0x01bf616e,0x00dc813b,0x0131c786,0x024d4518,0x02d82218,0x0381e24c,0x03c43368,0x03bb2534,0x0396e0cc,0x0572adb8,0x0576d950,0x07aa09d0,0x02946dd4, -0xfb6ad448,0xf9acdb38,0xf394f450,0xf1edda70,0xf0e66fa0,0xf1ce6db0,0xeffaa920,0xeffcc400,0xf3fa1cf0,0xe5872f80,0xe2286700,0xe2a75960,0xe66399c0,0xe8d1d940,0xeac19d40,0xedcecdc0,0xe0297760,0xfc59cc0c,0x0a005e40,0x049d8010,0x01beb57e,0x05abd150,0x0455a8a0,0x0757adf0,0x04f18658, -0x04f604c8,0x0509ff50,0x0289853c,0x01bf9402,0x00e84953,0x0161216c,0x024ad598,0x04850278,0x04554408,0x0943f000,0x0265d2cc,0xfa8a3f80,0xf7e81330,0xee680940,0xea90a1a0,0xe5a3ed20,0xe1f63320,0xe47d7ea0,0xe6b31760,0xe9cb4ce0,0xe3d3b7a0,0xe14ac0e0,0xe003dec0,0xe2306720,0xe2d3d940, -0xe1519880,0xe0f184e0,0xd84a08c0,0xf043d5a0,0x0bd3e1c0,0x02c38068,0x098af040,0x01ab4f34,0x0a6481f0,0x04f97860,0x060e1598,0x04703bc0,0x098686c0,0x0784bd30,0x072ba2d0,0x064cc930,0x04ed83d8,0x02476a28,0x079b47e8,0x051d7820,0x057d0eb8,0x01f46fe2,0xf764c090,0xf3ab3940,0xea352280, -0xe50535a0,0xde2ca000,0xd73fb380,0xd3d77e40,0xd4ee1700,0xdb438ec0,0xe8737f40,0xee6b7cc0,0xec27b8a0,0xf0a36a80,0xec18e360,0xe2d70f60,0xddc307c0,0xe3e00ae0,0xee365f00,0x01d5ee24,0xfe2a6048,0x0afd2e00,0x01b6b118,0x06b4e830,0x057201c8,0x068f9248,0x069bfb08,0x0cea42b0,0x053a6700, -0x03f7f32c,0x06a36038,0x053242f8,0x07e87800,0x07ffec28,0x04539d88,0x0a4ce9b0,0x004b2c15,0xf93ae7b0,0xf73f23c0,0xf0aec640,0xe95bb560,0xe309d1a0,0xdf537a40,0xdbc2e580,0xdc79b600,0xe0bd13e0,0xe2979940,0xe7b97020,0xeb2db340,0xf45a8b60,0xfcc7bd28,0x05b73658,0xef43a5e0,0xebbc3860, -0xe911db20,0xff1db10d,0x00aee7d7,0x01186832,0x07af0b70,0x03ddd7d4,0x0184269c,0x084a8510,0x075efa10,0x0c9bf3e0,0x07bca8f8,0x06b53f30,0x07e3d888,0x085507f0,0x0aac2560,0x0814da40,0x094fdd30,0x0fc7dd40,0xffbd012e,0xf8888008,0xf8e73ff8,0xf80f3910,0xf4b48040,0xef08e100,0xe792c320, -0xe3d3ac20,0xe12d7c20,0xe0f6f5a0,0xe76f4860,0xee6ad020,0xf02f4460,0xf9c42e60,0xf97a8558,0xf63c7c20,0xef3bfa20,0xf2b25fa0,0xf51d7d20,0x0a57d240,0x059ffd20,0x0af58000,0x08ddbb60,0x05e0af20,0x07349cb8,0x07785500,0x0993b740,0x053b3e78,0x0b36e4c0,0x09b81e80,0x08a6e230,0x07302848, -0x06958138,0x04b684d8,0x074f2d70,0x0b9af640,0x01c29134,0xfa5c5520,0xfc4c01c4,0xfac426d0,0xf7fc2ad0,0xf4ebc400,0xf2c7f300,0xf0e3ae50,0xf10ff8f0,0xf32303c0,0xf37c9790,0xf3f9f070,0xf6467380,0xfadfc630,0xfca7b7d4,0xfdf785e4,0xf899eb30,0xfb79ba70,0x020a90c4,0x0c14c680,0x057cbbd8, -0x0c7767f0,0x0a87eec0,0x0bf0d140,0x0b0b13b0,0x0f03b040,0x079e3ba8,0x0f0f5490,0x03a175a8,0x0fe3eea0,0x0872b010,0x0fb22460,0x09f54790,0x0c2b3840,0x0a475ef0,0x0bf48560,0x0334d108,0xfdd935ec,0x02e527dc,0x029f41c8,0x01177728,0xff08ecfb,0xfdeb9bbc,0xfa973340,0xf7e78680,0xf4ec5180, -0xf5256f30,0xf5ab7990,0xf609deb0,0xf7f2b6c0,0xfad25e20,0xfe604b30,0xff4fad46,0xfebc14c6,0xfd9bd238,0x1e7694a0,0x032ce16c,0x0d431a30,0x0c5b92c0,0x04c1f5e8,0x05e06620,0xff07bdd7,0x00e3ee0e,0x07341e68,0x00f5e32a,0x00632b59,0x00eac682,0x094a56e0,0x07401ea8,0x05689c98,0x077aaa58, -0x1a0e7040,0x023b4490,0x036059fc,0x04760cb0,0x04ec7bc0,0x05e060b0,0x067f3450,0x076117b0,0x04ceb078,0x034a0b04,0x019b1db0,0x008ba8f5,0xff36b6fa,0xfdc6d720,0xfe521224,0xfe68efd6,0xfe261b66,0xfebba91a,0xfd1cca3c,0xf6bb2ff0,0x084b8760,0x149f1c40,0x27079780,0x0007f4df,0x11ff1fe0, -0x241a3000,0x254159c0,0x252bdec0,0x22f0e000,0x259f96c0,0x263b3680,0x25cf77c0,0x11a9fde0,0x02e2e2d4,0x291626c0,0x13b738a0,0x0915e8e0,0xf82bce70,0xfe31e564,0xfd2bab70,0xfd95a920,0xfdfd1a38,0xfe63ca4e,0xff436a3f,0xfe867d4a,0xfe1cc422,0xfda6a3b8,0xfcd7aa4c,0xfc2556e8,0xfb409e08, -0xfb681e80,0xfb679f18,0xfb814ac8,0xfb616578,0xf9ec5a60,0x044c6bb8,0x04023798,0x075cb930,0xfd7766f8,0xf8379828,0xf6571b40,0x006b245d,0xf99a7538,0xf66fdd90,0xf62e4380,0xf68a99b0,0xf81e8878,0xf7253fc0,0xf711ef70,0xf7688500,0xf9de1fb8,0xff74b149,0xf72b2e70,0xf9a8be68,0xfdafa518, -0x06662c80,0x04186f00,0x045d63d8,0x0418cb90,0x03e8c880,0x03c34cc8,0x03c0bd98,0x03772108,0x03703894,0x0382de7c,0x03a55e20,0x03cb5830,0x03ddd564,0x042bc960,0x041bafc0,0x038cb4c4,0x04518dc8,0x0591db48,0x04ec69b8,0xf6f25c00,0x0383f438,0xfe331e76,0xfecb9466,0x013324ca,0x00d817e8, -0x03558738,0x01ea5792,0xffb6d658,0x01b2eaa0,0x02550e3c,0x015f8ee8,0xffe1ac47,0x00b5be95,0x009e4d79,0x01ecfa32,0xfba2b530,0x04e98ad0,0x06307cd8,0x055fb9e8,0x05071148,0x047d9b00,0x042cd2a0,0x041bd760,0x033faa2c,0x02feecd4,0x0344cbc8,0x03943b74,0x03b0aa20,0x034f8234,0x040478b8, -0x042c85f8,0x03428f34,0x047049c0,0x098efb50,0x0678c318,0xff08be0f,0x01a87464,0xfe49e5b4,0x001dd1f4,0xfffb9b63,0x007d40a8,0xff26acf0,0x02ab5f88,0xfff4dd32,0x04431ea0,0x00c14567,0x0210b9b4,0x00d3834a,0x023c4188,0x01593532,0x0239af48,0x010a8ec2,0x049da510,0x07851398,0x0580fc18, -0x04bac580,0x038e28f0,0x02c6e4b4,0x02d51fcc,0x01729afe,0x01847222,0x01f70154,0x021bbf74,0x029b2438,0x02503318,0x041825d0,0x03e88cec,0x02c2ccc4,0x05afc9f8,0x0c577900,0x050e53e0,0xffcd4275,0x051ca800,0x025a9de0,0x01878f20,0x024655f4,0x024f091c,0x02942f20,0x027e257c,0x04319350, -0x02b969cc,0x030d3050,0x0351f82c,0x03b9448c,0x03e62584,0x02e44ee4,0x04b51ab8,0x03601bf4,0x070a27b8,0x09bf82c0,0x088c1d00,0x076eb6d8,0x05f89378,0x056542f8,0x05c2cf88,0x039e879c,0x02fee700,0x03a073f0,0x03ce2400,0x02b35fec,0x00138110,0x01af0c8c,0x02213f98,0x02754808,0x06807290, -0x17703b60,0x0e16f140,0xfe8c132a,0x03a359d0,0x01b805aa,0x01f2d536,0x0487e3b0,0x02263698,0x0180e896,0x01a6968e,0x020af2f0,0x03340d58,0x030fc680,0x025adf2c,0x02384904,0x02f0a014,0x0392f508,0x042f9660,0x01900bac,0x025c23c0,0x01b4ccdc,0xfcb9bc60,0xf93e4698,0xf6243510,0xf2cb40b0, -0xef04fba0,0xf1ae13a0,0xf2a63370,0xf34abbf0,0xf3b68250,0xfa4cc588,0x05ac2c18,0x0a88ead0,0x0be73260,0x08a34500,0x0b9756c0,0x14dec380,0x012c00ea,0xf5d7d000,0x00fc5319,0x030b5110,0x02d666dc,0x04a03c98,0x043d16e0,0x04bd7e30,0x03ed1a88,0x05133758,0x02694d3c,0x018d0c06,0x01200ad8, -0x02867368,0x026db7c4,0xfff247d5,0x0059da97,0xfe67cb96,0x03471ee4,0x06586630,0x048dfce8,0x0468ff50,0x00d5cb25,0xfc246400,0xf5da6c90,0xedf3a6a0,0xea05e260,0xeaf24860,0xebeb43e0,0xf12efa10,0xfe46ecaa,0x044ad088,0x0ac40e10,0x0f5e9be0,0x0d5b12e0,0x2546cb40,0x029bddec,0xf0c5c210, -0x0227803c,0xf6c8e140,0x00ce755d,0xfded06b8,0x0337ee40,0x031d8988,0x044975e0,0x076c7138,0x0582a8e8,0x04e28b60,0x02ab0210,0x025a43b4,0x02a056ec,0x004618af,0x048f2160,0x01d7a45c,0x065fa968,0x0e48fcc0,0x0a0a2eb0,0x08d40d50,0x0b6b5ad0,0x0c826b90,0x0c406f50,0x0781c538,0xffe72e94, -0xf5bfebe0,0xf5173300,0xfedb7fe0,0x0e40c500,0x1969af60,0x1eaf5880,0x29617a80,0x221f5a80,0x2cb6c900,0x0fdbec20,0xf896c3d8,0x0a1ada10,0xff36a35b,0x06c92108,0x047def98,0x06106aa8,0x041b47a0,0x05ae3fe8,0x07e96a78,0x03b4d728,0x02f5f94c,0x03bb9e48,0x0306628c,0x034c360c,0x0272c198, -0x03c5ff60,0xff3e9af8,0x061b5f30,0x0e011cf0,0x0bb7ca90,0x0be3fb90,0x07023270,0x066699f8,0x07ff7328,0x07a031c0,0x07331a70,0x06280118,0x024f8104,0x0038c056,0xfec530ae,0x0e33cba0,0x195713e0,0x26ef5100,0x211cf840,0x144c84e0,0x0e25ec20,0xf9f3bb50,0x01b42fa4,0x06276f30,0x030ff174, -0x045b0158,0x0199b764,0x024f04a0,0x03418da0,0x056d8258,0x0582d5f8,0x04ff2360,0x034e5c84,0x01881d34,0x014a3ff6,0x00b955f1,0x00c65ab6,0xfd0e46cc,0xff150be1,0x03270938,0x03dde78c,0x0b4f69b0,0x0af9e2b0,0x0bac83e0,0x09e51c40,0x097498f0,0x06be8128,0x031773d4,0xf90f4d38,0xf4e531f0, -0xf4e87fa0,0xfa7a88d0,0x00ea6912,0x0c3234d0,0x0b06df00,0xff5e9220,0xffe92977,0xf3e71cc0,0xf9ce5d88,0xfcbf6088,0xfc2cc318,0xffa04e43,0x01aed5b6,0x0281cfb8,0x02832064,0x00cda622,0x04c21280,0x052f76c0,0x04232198,0x02ec5718,0x0069ad0c,0xfda1f6e0,0xfdc70f24,0xfc0365dc,0xfabc23a8, -0xfe696054,0x01106c30,0x08d6ccf0,0x0b1ac240,0x0aa50350,0x06737480,0x0176ff94,0xfa99c008,0xf4476850,0xf23bf3c0,0xf2acbae0,0xf333aa50,0xf40d7f90,0xf638a5c0,0xfa68b420,0xfa9d5bf0,0xf80c17f0,0xf6ff4170,0xfb7bf240,0xfe75414a,0x0134ca14,0x02440050,0x02393624,0x0387feec,0x0291bbb0, -0x01fc3a70,0x00e4af90,0xffeb13cc,0x021c14d8,0xffe0ed5a,0x0170e02a,0xff5a117b,0xfe635c20,0xfe133b8e,0xfc53a2dc,0xfded256c,0x00cf9ae1,0x010f3dc6,0x02143bf8,0x01df6fec,0x02ef81cc,0x0455b650,0x03aea4a4,0x039e729c,0x036f5738,0x0021da5c,0xfcaf55c4,0xf957e6b8,0xf8576fe0,0xf6fd40f0, -0xf6596dd0,0xf6bcbb30,0xf76de570,0xf5c9afc0,0xfb4996f0,0xf71393c0,0xf8b0dff0,0xf9323f40,0xf9646478,0xfa1d2ff8,0xf9de0fc8,0xf94b4a18,0xf99d5fc8,0xf944aa00,0xfad56780,0xfa51a568,0xfbdc9130,0xfb507680,0xfabcf680,0xfc3d0ee0,0xff5bc548,0xf8fc4590,0xf93fc350,0xf8bbaa60,0xf8c6cc30, -0xf834bb78,0xf75dfde0,0xf69df0b0,0xf6686f90,0xf609ce80,0xf5e7db80,0xf5f74a80,0xf65ca540,0xf6535980,0xf6d12d40,0xf70ff460,0xf73e4fd0,0xf707ab30,0xf76e67e0,0xf6adffe0,0xf5765990,0xf6922c30,0xfee9b800,0xf515a320,0xf61f7610,0xfcb92538,0xfcb457a8,0xfcc8d244,0xfd262498,0xfd2093f0, -0xfcd6b5d4,0xfd21fea4,0xf6514630,0xf5dd1900,0xff8dfadf,0xf6be4900,0xf65fca00,0xf7f5e5b0,0xf8a82d20,0xf82c7670,0xf81f5898,0xf8307e28,0xf86c48c0,0xf88aedb0,0xf861fc90,0xf833b310,0xf7f886b0,0xf7d62d60,0xf7a5a380,0xf7802880,0xf7651a70,0xf7489b60,0xf74e7140,0xf7147130,0xf637cf20, -0x06741600,0x06aab838,0x0662f390,0x099b2fe0,0x08b75b90,0x0293e54c,0x08bc7d00,0x081d3350,0x03e065fc,0x03ca0e30,0x03ae09f4,0x0321e028,0x0339c978,0x031900b0,0x0288e788,0x07f39788,0x084f4300,0x020fdb40,0x07b143f0,0x0851a380,0x05419620,0x05c0f3f0,0x05f23a90,0x05eecf00,0x05d1dad8, -0x05a68df0,0x0575bef8,0x0535eff0,0x0513cbd0,0x04fc8820,0x05415400,0x05ab5340,0x0676a420,0x066ab0b8,0x06960700,0x06b41438,0x06da0d48,0x087653b0,0x097376c0,0x082471a0,0x08572b90,0x07eb34f8,0x069c5320,0x06685540,0x06366a08,0x062170c0,0x06fdbbf8,0x07950040,0x0739f318,0x06406230, -0x0652d488,0x05b75320,0x05b899f8,0x06f0ed18,0x05b92998,0x065ae4f0,0x06ace080,0x05e26d78,0x06c5bc00,0x06a29410,0x0698a038,0x062e0ad0,0x05a3c8c0,0x04e4c888,0x048a8b70,0x04586200,0x04a6f1f0,0x058ff488,0x07bad360,0x07cee198,0x089f6090,0x08ede390,0x09552b90,0x0a317760,0x0b2b3ac0, -0x0d1a60e0,0x0abf6420,0x084680b0,0x0669ef90,0x05a02580,0x060f97f0,0x0560f7c0,0x0493c998,0x061b5330,0x04deb8b8,0x04a889e0,0x0436ea98,0x04d3f430,0x04ecc798,0x04f21718,0x04986288,0x06a8b2b0,0x05e9bbb0,0x054f3588,0x06cf5148,0x068274f0,0x063d53d0,0x0505e098,0x03a449a8,0x020bc080, -0x00d87543,0x008f5e80,0x018669ec,0x049e25e8,0x099bbc50,0x09608ee0,0x0ab61e70,0x0a48b3e0,0x0b034fb0,0x09eb3f00,0x0ba35cc0,0x0c7e7d70,0x0adf7030,0x082d0380,0x055abda0,0x03f09bc4,0x03f4ddc0,0x034c1fc8,0x036552ec,0x03b774ec,0x030266e0,0x032993f0,0x025f485c,0x03626fdc,0x033e9fd0, -0x03b36974,0x03804fac,0x063d1b90,0x0581e400,0x0530c410,0x07034e90,0x07275580,0x072dcd08,0x05fe74f8,0x03e80bbc,0x01361ed2,0x0027376a,0xfed853b0,0xff5642d8,0x030957f8,0x0a71e570,0x0a7fd070,0x0c645f20,0x0bf05bb0,0x0c4a2500,0x1afc72c0,0x1f9f3360,0x1c1672e0,0x13348f20,0x101dcc80, -0x0e7011f0,0x0cd8acd0,0x08e325c0,0x068d7c00,0x0499c108,0x0417ebd0,0x0360ce5c,0x02ad28b0,0x01f457e8,0x029eefc4,0x03028828,0x04694948,0x02aa993c,0x038c9c78,0x04645af0,0x05ac5ca8,0x06e6e148,0x066c9378,0x02972210,0xfe434bea,0xfab388f8,0xf6e23d10,0xf3abed30,0xef03f200,0xff416c60, -0x07454000,0x0f684a00,0x10cfe2e0,0x151f52a0,0x19a097c0,0x1ad4cf40,0x28d42540,0x17b23340,0x0f0472f0,0x0bfaaef0,0x0af4cda0,0x07696d88,0x056a5020,0x03fd54b8,0x04eb5a28,0x04f0db68,0x04de2820,0x0410ffb8,0x0407c2c8,0x031829e4,0x045a2ee8,0x04762cf0,0x0485ad68,0x04393eb0,0x04f59800, -0x080a3920,0x087039a0,0x0a8b5e60,0x0eab0810,0x11d09de0,0x142951e0,0x146099a0,0x104f5580,0x0c85d700,0x078914f0,0x0c6d8bc0,0x0f5cc340,0x15e45500,0x0f671c60,0x12fa0f40,0x1c973e40,0x28d98d80,0x15d20200,0x20e521c0,0x163a9cc0,0x0de9c610,0x0d311e90,0x0a5841e0,0x06994db8,0x05216a48, -0x05115f38,0x04f1b2d0,0x0787ea88,0x0372b5a4,0x01f2d082,0x01211610,0x03a12778,0x05bf5700,0x04ce1cb0,0x08224a30,0x0babba40,0x0c806600,0x0fd41730,0x14905d60,0x18051100,0x16f2f640,0x15eb3260,0x153d7f80,0x165732c0,0x1680a320,0x146643a0,0x0e745150,0x09a41150,0x07ca5560,0xfa6065e8, -0xf5d4cc90,0xef327fe0,0x08d32390,0xea302bc0,0x0f783c30,0x18ea8b40,0x0745e120,0x099fdf60,0x072461b8,0x06369a38,0x068576c8,0x061a8978,0x0551d7a8,0x058236e0,0x04cb6878,0x055ee588,0x049da840,0x055bbfa8,0x04cefa80,0x05919f88,0x070be8b0,0x0970ad40,0x0d416940,0x102c4aa0,0x11e66620, -0x12d86920,0x14e68960,0x167bb680,0x168afd20,0x159e9c80,0x119a0220,0x0ad68b80,0x0646fd90,0x00521766,0xfd9c7258,0xefe5a200,0xe3aeab60,0xcdc81d40,0xe6e9f780,0xe7ad2980,0x011626e4,0x134ae420,0x0befe140,0x06998540,0x08d2d620,0x04c20140,0x03a017d0,0x041c5058,0x0357f81c,0x02099e30, -0x0496bbd8,0x046e69a8,0x01f2993c,0x01c45eca,0x0144f15c,0x03520840,0x01a86aca,0x014a7b98,0x06966ca8,0x0c638b00,0x1135caa0,0x145af4c0,0x1356fe80,0x12daf2e0,0x126a5cc0,0x108a2a20,0x0daf0830,0x08ecc080,0x04e090a8,0xfe0cb232,0xf8a840e8,0xee613260,0xeabf79c0,0xe47611a0,0xea168400, -0xf46b0720,0xfbc53430,0x06903c00,0x0371ec00,0x02f4371c,0x0305eab4,0x0245cab0,0x04f8d708,0x00ffff28,0xffa5b850,0x00295f73,0x018aae6e,0x02badbcc,0x0224e078,0x023e1b98,0x01ce1e94,0x012f0b5e,0x01a2b35e,0x00b908da,0x03b594c0,0x06911638,0x08a44ad0,0x0d476910,0x0e9f65f0,0x0ff75f70, -0x108dfda0,0x114fa520,0x113c9120,0x0f4d9b00,0x0ba58f80,0x05b42e30,0xfceec6d0,0xf7327be0,0xf4006160,0xefa72f80,0xf41caeb0,0xf7405e80,0xfa6ffa38,0xfb1e88e8,0xfbd79778,0xfe2d59fe,0xff4b61ca,0xff93174a,0x005efc8c,0x007bd8fd,0x00da964a,0x01106138,0x00ef6026,0x000d61de,0x00fe4a9f, -0x00182e31,0x00fed9c6,0x00dfe722,0x015cdf02,0x01b60bca,0x024de0ac,0x03846740,0x043581f0,0x05157eb8,0x0726db10,0x09523c70,0x0b9769c0,0x0a1574e0,0x08e78370,0x085db000,0x051bb7a8,0x0236b794,0xff05931a,0xfbd2da78,0xf7e9b4d0,0xf28435f0,0xf5d885f0,0xf910bfe8,0xf9c82040,0xf84df280, -0xfb604440,0xfb55c4b0,0xfb142ee0,0xfc965788,0xfd1e62c0,0xfe02c966,0xfe3dc986,0xfe5df354,0xff32270c,0xfed26382,0xff5acb47,0xfddb27f0,0xfd27ef4c,0xfd76880c,0xfc170340,0xf9e8a368,0xfb556658,0xfa3c43d0,0xf9cf9560,0xf908f600,0xf881e630,0xf7bdb340,0xf75eb1d0,0xf6ee40c0,0xf6a2ad70, -0xf6555070,0xf5d6c220,0xf5888de0,0xf548d760,0xf6187d20,0xf760c180,0xf840aa20,0xf8f69600,0xfa809ec0,0xfb174250,0xfab3d1a8,0xf95a15d0,0xf54ab7c0,0xfc927b84,0xfad79318,0xf708f530,0xf6f18dd0,0xf7249bb0,0xf7118250,0xf7146500,0xf7361e70,0xf73b0950,0xfb72a548,0xfcf7851c,0xf63b4bb0, -0xfaa98498,0xfbcf94d0,0xfb8fa280,0xfaf095f8,0xfad1a5d8,0xfa8871d8,0xfa303e80,0xf9d39e40,0xf9567bf8,0xf959c428,0xf947cef0,0xf92ef960,0xf9584e10,0xf974ceb0,0xf95f6cf0,0xf9d89580,0xfa109ec8,0xfa6c9080,0xfa7a98b0,0xfafcbf70,0x0246d6f4,0x023d6eac,0x01181126,0x01680d4e,0x04119ac8, -0x08ee2670,0x00906515,0x02ed4e70,0x075aff98,0x0768da00,0x076b3ca0,0x07961808,0x07a1d3f0,0x079c2cf0,0x07ab4168,0x02e0e3d4,0x00ddbe1e,0x0835b910,0x033b6df0,0x01539a6e,0x01bdd78a,0x023cb774,0x02212ee4,0x026bf2d4,0x028530a0,0x02960098,0x0288bcd0,0x0282a394,0x02552058,0x02170084, -0x01cf53b2,0x01731956,0x00e5a792,0x00d0857c,0x011b5e2e,0x02211658,0x01cbbd9a,0x01c1bcb2,0x00d62f3c,0x079e0e38,0x01ece492,0x03e58670,0x03a627dc,0x0263f004,0x029dcde4,0x01a8734a,0x018e22a4,0x0273f1fc,0x01d4b40e,0x0269b204,0x020f04b8,0x035c1a04,0x035007e8,0x02551554,0x030354fc, -0x04bdf0e0,0x017c5e16,0x024c14cc,0x0235778c,0x02edb53c,0x034d9f8c,0x03869390,0x0343d760,0x035158a8,0x02eee16c,0x021a7c54,0x0163bf1a,0x0063d182,0xff447c4a,0xfe7330a2,0xfec17036,0x013003f0,0x01021644,0xff76ecf5,0x00859112,0x03f94c94,0x03933f04,0x05e51e60,0x04145690,0x038ca08c, -0x02c1e15c,0x02cfde74,0x02b06668,0x03a08c78,0x0301655c,0x03ae7d24,0x025b1ca0,0x0342a250,0x0306b338,0x0382183c,0x03506d10,0x02fac448,0x021d0784,0x02849dfc,0x0301de40,0x0424daf8,0x04ce6020,0x05153d40,0x044a2ef8,0x03e8e27c,0x02a67c10,0x013a185a,0x009c2da1,0xfec25ac8,0xfc9307e4, -0xfaa95a88,0xfbfa61a0,0x00936a44,0xff98a35c,0xfc1613bc,0x00ab7cb3,0x049ad468,0x011acf3c,0x04586010,0x03e3c3c0,0x02ad69ec,0x02799f68,0x0199cc10,0x01e002ce,0x039406d4,0x0368ab4c,0x031f61c0,0x02c8ed40,0x0349dda0,0x03aaf6ac,0x034645b4,0x04335210,0x03aaf344,0x01e84766,0x0229a004, -0x0257c778,0x03a5d7d8,0x04b76990,0x04d10e78,0x036d6868,0x030de3fc,0x01a63fbe,0xffe2b51e,0xfeb9c63a,0xfd531128,0xfb56a118,0xf8635418,0xf9237d98,0xfdd50cac,0xfcee30c0,0xf31da960,0xff1b8dda,0x0ba766a0,0x088bf760,0x09f831d0,0x07e1c570,0x04571060,0x0628a830,0x04cd94c0,0x03d50ef0, -0x0451c6c0,0x037fa130,0x0310e9b4,0x01aa69b4,0x0334bde0,0x03c4e148,0x03377ba0,0x0415bb38,0x03e92bac,0x04bec3e8,0x06bb3680,0x08705870,0x0c6d5bc0,0x0d6f1230,0x0e676c00,0x0dda78c0,0x09f377d0,0x0755ec28,0x05abd7c0,0x013416a4,0xf68b5e80,0xe8daccc0,0xe517aca0,0xe80d4940,0xf1bce3d0, -0xf7d7fa60,0xdc4a4c80,0x009ca63f,0x1165c940,0x04796c98,0x01b2005e,0x041b6ba8,0x0284e2b0,0x032e6264,0x035c2cc8,0x03f6dce0,0x042ee398,0x041adaa0,0x0438c758,0x031536e4,0x0312ca74,0x0371720c,0x04a99f30,0x05906758,0x066fc750,0x04cde730,0x031f6c04,0x037eeb88,0x04d19e90,0x05730748, -0x06cd8998,0x08820660,0x0b497f20,0x0b9642a0,0x0969d6c0,0x03c4e794,0xfb808ec8,0xed8a9280,0xe45f0440,0xdb923b00,0xd277ba40,0xdd502180,0xb952cb00,0xeafcd320,0x0cb29490,0xfb7c6e38,0x0b498340,0x0042f434,0x095fe430,0x03000ec4,0x04b7a528,0x03e772c0,0x06c5a468,0x027759f0,0x0116a704, -0x01ae6512,0x03dcdb60,0x0451bbb8,0x062c4ea8,0x0600b348,0x07eb85a8,0x0536e6e0,0xffbbc67e,0x00455693,0xfee9022c,0xfd85c8cc,0xfb683e28,0xf874dc70,0xf5b8b170,0xf4c8ca20,0xf6975260,0xf3a55f30,0xeaa9cca0,0xdbcd1500,0xd44df040,0xce2a1480,0xc0530f00,0xbfda8d80,0xc193c640,0xcfade980, -0xf23f30a0,0xee90dd40,0x020771a8,0xfa4e8878,0x0135b55a,0xff2b39ae,0x03c178c4,0x01cbf4e4,0xff6638d4,0x03f28920,0x05ece500,0x02e0f618,0x03df5294,0x03bfc83c,0x033bd314,0x02088194,0x06a4a218,0x04a29bd0,0x012dcc22,0x010c5b40,0xfd098a50,0xfca47b00,0xf7158a20,0xee7cc980,0xe7524f20, -0xe27cbae0,0xe15c6e80,0xdf6bc140,0xdefd4340,0xddffe480,0xd7503c00,0xd594cc80,0xd53adec0,0xcd01a200,0xdc4b6500,0xd8440500,0xe8148980,0xef41d240,0xf1a32390,0xfa35b508,0xfad05ef0,0xfd183c3c,0x00d9e2de,0x0145c2e6,0x00373a4d,0x02553584,0x02af3458,0x01ebefe0,0x02dbf570,0x0359007c, -0x04579778,0x03e03540,0x05371b60,0x02eb7c9c,0x032bdc78,0x01e26a0e,0xfbe130f0,0xf6b7a1d0,0xf1e450f0,0xefa7fb40,0xeaff8f80,0xea134d60,0xec311340,0xf4e603f0,0xf8686938,0xf5956b40,0xf0a16260,0xe83cc240,0xdf56be80,0xdcc49c00,0xec9c8be0,0xeaabd360,0xf75811d0,0xf9642e00,0xfd92e420, -0xfedd9e16,0xfef05868,0x0076ce0e,0x0027e63b,0x00897589,0x00acbe95,0x00a2f62b,0x00a1ec5a,0x00c0912a,0xffd910d6,0xff57998d,0x00a04003,0x004b5f39,0x021da674,0x02cc394c,0x00b2a674,0xff90297e,0xfb592298,0xf8d4d780,0xf7d3dcc0,0xf9395b48,0xf90e4ab0,0xfb770e78,0xfe25da7a,0xfd106de4, -0xfb2147e0,0xfb726a38,0xf80ae1a8,0xf3659380,0xeef19900,0xecc037e0,0xf72f0230,0xf736ec40,0xf5984130,0xf5a84d00,0xf636b040,0xf8deb400,0xfb863f08,0xfd89d93c,0xfe4550d0,0xfe6572d0,0xff12cc84,0xfea5ad98,0x005f228d,0xff773ebe,0x00adada8,0xff666eac,0xfefaabc0,0xfe5e3938,0xff643ed7, -0xfac59030,0xf6b5a110,0xf6a08170,0xf551b7a0,0xf49279c0,0xf2ef5850,0xf1616fd0,0xf00eb6c0,0xeeb0df60,0xed72e860,0xef4b4280,0xf0fbad20,0xf275f950,0xf382d1b0,0xf4d9a430,0xf5bf4160,0xf6379610,0xfbed21e8,0xfbbce4e8,0xfae32580,0xfdc1ae10,0xfd2c1170,0xfdb61bb4,0xfddd6d34,0xfe76d660, -0xfe5e87d4,0xfd29c288,0xfd07b26c,0xfc7188c4,0xfcdb363c,0xfc96b8e8,0xfc560ed0,0xfbeeade0,0xfb87d178,0xfbbd44a8,0xfbb69650,0xfb088768,0xfbd20588,0xfb80fc80,0xfb225a40,0xfb4e7308,0xfbb38920,0xfbf7b9e0,0xfb8643d0,0xfb7b5850,0xfb38a4c8,0xfae56308,0xfa66af38,0xfa117038,0xfa6649a8, -0xfa84e170,0xfad50d60,0xfb227ad8,0xfcf7aa60,0xfdc654dc,0xf93b5f98,0xf956bfb8,0xfaade488,0xfad37008,0xfa748d40,0xfbb58cc0,0xfbaaf090,0xfc0cfc2c,0xfc4aa618,0xfc75c01c,0xfc5c313c,0xfc849320,0xfa47b980,0xfa6b7390,0xfbe61170,0xf9ea8588,0xf96471f8,0xfc5d9728,0xfc093cf8,0xfbb66988, -0xfbb1d910,0xfb53a630,0xfae0e688,0xfa82cc18,0xfad3d708,0xfb128318,0xfb597088,0xfb7b7058,0xfbaf0d10,0xfbc87c88,0xfc130fd0,0xfc532a48,0xfc9cb2d8,0xfcc09bd4,0xfce15248,0x07ba8290,0x05c985c0,0x069e04e0,0x05a8d0a8,0x031119f8,0xff94e0a9,0x071385d8,0x03e335fc,0xff9072cd,0xff6db86a, -0xff6f20a8,0xffec9fa9,0xff7615fa,0xff6a149c,0xff4b32e4,0x03c45a94,0x06fb2830,0xff0c852e,0x039cc764,0x06479fb0,0x07943348,0x06c59188,0x07380548,0x07740220,0x07b05d38,0x07f9c7d0,0x085001a0,0x0890a810,0x08e2d2e0,0x09446e00,0x094bc920,0x08f3ac70,0x0843b6f0,0x07753038,0x06c648a8, -0x05d4c968,0x0608f350,0x041039e8,0x056206f0,0x02189fcc,0x059fbbd8,0x04e50768,0x043d5d68,0x05661880,0x04df5848,0x0626a988,0x0667e1d0,0x05c272a0,0x06cae100,0x0663ed20,0x05fd67a8,0x04cc7608,0x052a06f8,0x06473c20,0x062fae40,0x02f38b40,0x0766c290,0x07373198,0x07c28b98,0x088144b0, -0x08db5a80,0x09681df0,0x0a2aca30,0x0ab2a130,0x0b9dcc10,0x0ce50d20,0x0dec5ec0,0x0d9325b0,0x0b97cb20,0x097c6b20,0x07124ee8,0x04790bb0,0x04656c90,0x003e0a74,0x01a972ec,0x016b000e,0x024f7b48,0x03391e50,0x0389aa50,0x035ea3f0,0x0301c394,0x02bfd6d4,0x0424af78,0x04668118,0x05c2a110, -0x03eb33a4,0x04b7af10,0x03f18cc0,0x04f872e0,0x05437fb0,0x05895330,0x055f6ab0,0x06250570,0x074ed1d8,0x07c45650,0x09acaa80,0x0ab95220,0x0c550620,0x0e6bbe00,0x0fa65b70,0x11da0ce0,0x13b8bca0,0x14a31340,0x129be4a0,0x0ddcc1a0,0x09deb230,0x05565670,0x00df1f12,0x00ac0b21,0xfddd5d84, -0xff68b491,0xffd2cfce,0x00510c2b,0x022626b8,0x02c84a00,0x023dc43c,0x010a27e8,0x019180e2,0x01ebdbf6,0x03fba780,0x0332831c,0x03aa3b4c,0x03278874,0x03b1ed7c,0x04697738,0x0452cd80,0x05376180,0x0421bfc0,0x05537398,0x06e3fed8,0x07d3c568,0x0a026b20,0x0a9830e0,0x0c3ecfc0,0x0e8c5c10, -0x10024fc0,0x12903f00,0x16f10140,0x1b0e0580,0x1a3c0220,0x145402e0,0x0e3f2fa0,0x071c42f8,0xff4ad686,0xfe454fda,0xea94bda0,0xeeaaa940,0xf6e6ae80,0xfc583704,0xfd3ab8a4,0xfe1f6b94,0xfef9bad0,0x02216010,0x0259b17c,0x034134cc,0x03cd88bc,0x041b2848,0x04023208,0x02aeaed4,0x0421b848, -0x050459a8,0x05392b40,0x078c44d8,0x08048c40,0x0874f0b0,0x081180e0,0x094a84b0,0x0dd0ea90,0x13836460,0x18fc1240,0x1c951200,0x227e1ac0,0x256eaac0,0x276af3c0,0x1a32e220,0x0feb49b0,0x050287b0,0xfb622860,0xf220dcb0,0xe878d940,0xeaa06040,0xdf68d5c0,0xe88453c0,0xf2af1ef0,0xf8e97568, -0xfbd19550,0x007e0ee2,0x0202b6b8,0x031294cc,0x03323090,0x03bedadc,0x04dd57c8,0x0409c940,0x03b7b3a4,0x0301f15c,0x03d80154,0x0468f130,0x04f5a678,0x06453e18,0x05a3e920,0x06b49db0,0x095164b0,0x0aaa0690,0x0cb5b140,0x0cbb8610,0x0c67fa40,0x0c7777b0,0x0a7842f0,0x09463990,0x0afa44e0, -0x0223bad0,0xfc3ad224,0xf405ba00,0xfcc5426c,0xf9bbd9f8,0xedc70c20,0xe0a608c0,0x08c53f00,0xe0b09a60,0xddf56a80,0xf15c9010,0xefbc5da0,0xf8b472e8,0xfbdd0a68,0x0103f5ce,0x010bca70,0x02b487b4,0x056e5ac0,0x03711940,0x02ff6868,0x039fae14,0x04519828,0x052a62b0,0x05152bb8,0x05672e90, -0x0496c130,0x062e3ce8,0x092a2950,0x06c54788,0x05f05840,0x06da4900,0x08d41bf0,0x0bb16170,0x06a274a8,0xfeca83e8,0xf6344640,0xebde73c0,0xe9b75a20,0xed597880,0x015e8512,0x1331fa80,0x2e7fb840,0x157899c0,0x371b32c0,0x0255715c,0xe2c95ea0,0xffb4b98e,0xf5320050,0x0044e066,0xfe6bfcd4, -0xff397bdc,0x013d28a0,0x02817670,0xff4ae022,0x04b633a8,0x04c6fcb8,0x029a1a80,0x031160d0,0x03326464,0x036a62b4,0x03e1a908,0x028294a0,0x0417fde0,0x043b2de0,0x045216e8,0x0620dcf8,0x05a60728,0x04faf118,0x04688fe8,0x04091570,0x03dc27d4,0x04139280,0x053ef710,0x05c52f78,0x046807a8, -0x1178af20,0x1a946240,0x2f50df40,0x29df5d00,0x2514f780,0x149d42e0,0xf1873fb0,0xf9d29410,0x00172ce6,0xf9d4fef8,0xffb0b7ce,0x032749b0,0xff6b553d,0x00f588ea,0x00c413ab,0x0274ba4c,0x02e8e278,0x0350a0fc,0x03b745f0,0x03730b24,0x02a23de8,0x049b2108,0x04aca0d8,0x063f1cd8,0x047a85d0, -0x00f60999,0xfcec921c,0xffbdc367,0x02c3dd50,0x06773000,0x09af3b80,0x0c0cab70,0x0d15c490,0x07e063f8,0x075fb830,0x0a8046b0,0x0dfa5d00,0x12c45420,0x1dcc4c00,0x1c74b6c0,0x114635e0,0x0e3e6990,0xf385ad50,0xfbad8570,0xfa9a5e40,0xfce78058,0x00a363fc,0xfee96e90,0x02880c50,0x026943cc, -0x02cbdfb4,0x0087d348,0x00e80925,0x024a8710,0x017c3882,0x0238b138,0x04680b28,0x02857e04,0x019ea606,0x01bbaf2e,0x01c9547c,0xffe12e96,0xfca42518,0xfe640b06,0xff6e2cdc,0x00914304,0xfed4ca6a,0xfc0f3f30,0xfa337b88,0xfb0dcce8,0xfed36e9e,0x03cf0a74,0x052b9030,0x06f9c9e0,0x0c193100, -0x0bf4c830,0x0858c060,0x02686a74,0x0067e601,0x04b32778,0x00a42d0f,0x00e88548,0xffa01e46,0x0018e6de,0xfe232e36,0x00fe914b,0xfe5b4188,0x028b1220,0xfe0aba2c,0x0001c754,0xfd74010c,0xfde27b40,0xfc0a3670,0xfba24648,0xfabee5c0,0xfc6e14d0,0xfd4a6a10,0xfaa87740,0xf9d3ce20,0xf8a4cb48, -0xf76d73f0,0xf5c186c0,0xf9443810,0xfc63ac5c,0xff179f4b,0x009c3145,0x01c4f216,0x032d19e8,0x05aa8008,0x07dd78b8,0x0a880ab0,0x07aa17f8,0x08bebfe0,0x094a08a0,0xfa418410,0x0506ed48,0x01262932,0x01db48ce,0x04f59618,0x047fef10,0x06d3b9c0,0x0663adf0,0x03b03ce8,0x05e1bde8,0x0643fcf8, -0x05cbfb90,0x02118398,0x02a2e9f0,0x035c65cc,0x02b7b54c,0xfafbc8f0,0x03ee8f08,0x03f258fc,0x03795ee0,0x0380e9e0,0x0338dd94,0x03566644,0x02db7388,0x05077f60,0x0633f9e0,0x07a57ab8,0x08ee67e0,0x0a50b7e0,0x0b732ea0,0x0aa24180,0x09b17b30,0x0961c9d0,0x08d0ace0,0x081edaa0,0x0abb7af0, -0x04b83048,0xff5294d6,0xf7c4e760,0x0751c5c8,0xff99b63e,0xf8bcb1a0,0xf81fb4a8,0xf7d95b70,0xf885a760,0xf75b9fc0,0xf6cc9d50,0xf6e30a90,0xff34c14b,0x05864998,0xf5b52110,0xfdea3cbc,0x0279cffc,0x094dbbb0,0x071d1d30,0x079eda68,0x0799c670,0x079d9578,0x07a68800,0x07791040,0x07e39d78, -0x082aed80,0x0879a3f0,0x08d1f840,0x09233150,0x09caecb0,0x09612510,0x09419430,0x08ea21f0,0x08ff10b0,0x09e34710,0xfc6c98d0,0xfb9ff4c8,0xf93ec258,0x01eac9c6,0x0730a910,0x0bbed1c0,0xff6203c4,0x06bd3d58,0x0b9eeb80,0x0c00ee80,0x0bff4180,0x0b179c90,0x0c387a70,0x0c58fa60,0x0c027d80, -0x06f311b8,0x00d9d465,0x0cc40740,0x075fcd18,0x02f1a998,0xfac09a88,0xfd199810,0xfc7d966c,0xfc80fbb0,0xfc7d9d8c,0xfc7ac444,0xfc6ca220,0xfc8bbb58,0xfca008f0,0xfcbfc61c,0xfc954314,0xfc7ec50c,0xfc8fd244,0xfc33efa8,0xfbd2de08,0xfb574a18,0xfb0fcc18,0xf92b7148,0xf9acc600,0x06a65ac8, -0xfd1c22a8,0x01ba37a8,0x019adb34,0xff8d079a,0x01104640,0xfee81afa,0x00312d55,0x02ea22a4,0x009ca04f,0x0030fc3b,0x009a9a8b,0x02e85c4c,0x01ae74d8,0x018d444a,0x00bbac81,0x07e6da70,0xfd778d64,0xfc4c64b4,0xfc8ccad8,0xfc3ba1a8,0xfc366f24,0xfc12e8d0,0xfc09d498,0xfc480714,0xfc74b1bc, -0xfcb80968,0xfc549420,0xfc3389ac,0xfc5a264c,0xfbd5d2f8,0xfb3af038,0xfa39ff80,0xf99c7548,0xf59bb940,0xf857a768,0xfef2a700,0xfdf80bc8,0x011a2dbe,0x00a70dff,0x015b56a0,0x029a6eb8,0x04472c00,0x018fbdfc,0x054fa560,0x00706f0e,0x048f42b8,0x01176d18,0x03a151d8,0x01aa3234,0x02406b74, -0x02a82d10,0x034fdaf8,0xfffca534,0xfc010f4c,0xfccd4a9c,0xfbf77570,0xfc2947a8,0xfc3459bc,0xfc6897bc,0xfd602358,0xfdfabbac,0xfe52d49c,0xfce04c50,0xfc02d4c4,0xfc3ab82c,0xfb209638,0xf96087d8,0xf6c2fd40,0xf67c7fd0,0xf57f09b0,0xf8af0520,0xfec44770,0xff271068,0xfec365f2,0xfecdb7d8, -0xff266f8c,0x0217a8e8,0x021030b0,0x02f2428c,0x0281d2b0,0x03973128,0x02efbf44,0x01a3c1ee,0x0242da54,0x0185fe54,0x04e4b3e8,0x01ca305a,0x0463e270,0x012248ca,0xfcc0c464,0xfcd7c0dc,0xfc6bdbd4,0xfcb1c8a0,0xfcb51808,0xfd2249ec,0xfe6336e6,0xff4dd50d,0xff5d9a0d,0xfd98ebd4,0xfc280f00, -0xfc249b3c,0xfae0a088,0xf9290338,0xf6c246f0,0xf7013650,0xf5c15df0,0xf43d52a0,0xf447ace0,0xf95b7cc8,0xfd6645a4,0x00b0b0fa,0x012ee4ca,0x00c99895,0x014b7fb2,0x0228579c,0x02d5a3c8,0x032fa4d4,0x0365132c,0x030affec,0x032cd2c0,0x02773ac8,0x044c8028,0x02571714,0x047ed978,0x00d7a1a0, -0xfc2c5c84,0xfd42e9c0,0xfa004ef0,0xf8766460,0xf8ae1d50,0xfc9dab9c,0xfc5ab148,0xfbb97260,0xf98382b8,0xf78b7f10,0xfac7d948,0xff42600d,0x00e8578a,0xfee88dae,0xf9816cf0,0xf358ff50,0x170bafc0,0xf8867538,0xee22ef60,0xf7bf9ff0,0xfa0ba3b8,0xfbacc0a0,0xfe380026,0x009eabd4,0x01aac636, -0x03195de0,0x044d62a0,0x0370e490,0x0326bcac,0x01db019a,0x03138648,0x0334b3e4,0x03f38b90,0x0345fa1c,0x062c3908,0x02066310,0xfef76cf4,0xfff1e6cd,0xfd2787c8,0xfdd5fecc,0xfc8351d4,0xfa233508,0xf7e23070,0xf3e1cba0,0xedc30360,0xee27a7e0,0xee9e6980,0xf2889ab0,0xf9a1cd30,0x056c7bd8, -0x18f43220,0x187d1620,0x23247f00,0x13b79320,0xfdd2cb70,0x03019d28,0xfcc6c890,0x01552288,0xfd8cf2dc,0x004001bd,0x00659a2e,0x00e8bba3,0x0313fa78,0x03f0af7c,0x042b33f8,0x03401b78,0x03d0d5f0,0x025e0670,0x04730f60,0x01615978,0x03d1d0d8,0x01aabf16,0xfcc57508,0xff1df42c,0xfdb8ca40, -0xf5a19560,0xf02c5930,0xed750c00,0xf16fe380,0xf62a1b70,0xf9ec5eb8,0xfc654ea8,0xfab4d240,0xfc7960fc,0xf550e450,0xf4aa8b30,0xf76bb4c0,0x102d2b60,0xf9e79048,0x1e127960,0x170fb3e0,0x07112ff0,0x0201da04,0x02f591b8,0x013bac50,0x024570d8,0x03a34938,0x04b3d518,0x034782cc,0x04724fb8, -0x0301b22c,0x01218286,0x0077f901,0x01522bca,0x01e0b1a0,0x0096ea6a,0x059ddd10,0xfe8c99a4,0xfa268880,0xfcad5f98,0xfde2c46c,0xfeee8ca2,0x0224a120,0x0607ce78,0x0c2c0180,0x0dbf27a0,0x09a86630,0x0af3c210,0x0a46ffa0,0x0d57f310,0xff5a862e,0xf1697de0,0xd9ab1640,0xf2623d30,0xf52a7330, -0x0c5afbf0,0x1c1a8640,0x10e72760,0x09d82960,0x0811dde0,0x0517ebb8,0x04b078f8,0x02bdf4e0,0x01ddfc74,0x032a2404,0x02e83d4c,0x02a88504,0x023d6d54,0x029c6b94,0x02194f70,0xffa3cc83,0xff931414,0x048e1798,0xfd991788,0xfa37a9d0,0xfe668658,0x015e7264,0x076b1220,0x0b6edde0,0x0d4b13a0, -0x10262040,0x0fd79540,0x0c79a3f0,0x0774d6a8,0x015da840,0xfe63c97c,0xf8c11ec8,0xf7ee2f10,0xf232f0a0,0xf885d738,0x008895a3,0x062b5758,0x0f2e8bf0,0x082802c0,0x05c99fc0,0x05cf2a90,0x03a71bf8,0x02be966c,0x010fa27c,0x011e50f0,0x0174b43e,0x015a28ec,0x01b823dc,0x02cacfac,0x0286d348, -0x02dd1a24,0x01617348,0x02f79c28,0x024fd3d8,0x000043ed,0xff2f028d,0xff4ef42c,0x000349c4,0x000dc070,0x0131a024,0x03979a78,0x070c6ca0,0x0919f2e0,0x09498fe0,0x08123f00,0x04582cf8,0xfce08534,0xfcd29a04,0xfefe1346,0x00bd207d,0x0312bf94,0x02940afc,0x06010050,0x0740fc80,0x058f5400, -0x075d6008,0x05099790,0x03f28144,0x0228cad0,0x03abb7a4,0x02a0d4b8,0x04794d00,0x03217f08,0x0355ed44,0x04110920,0x02b1bff0,0x03ebc004,0x050feee8,0x0456bb88,0x0270ccb8,0x05ab27b8,0x0870ba60,0x0853f1d0,0x0936cd10,0x09d85170,0x0aca6ee0,0x0b6f23e0,0x0ab61400,0x0a0b92d0,0x09ad12d0, -0x07aa2230,0x0689e238,0x0582bc08,0x0496f598,0x03285444,0x01c0bacc,0x0357dee0,0x02f96318,0x03ae9d40,0x0a1f01e0,0x04370758,0x06783da8,0x05f6a0e8,0x04421678,0x047647e0,0x030292e0,0x04637e98,0x061401a8,0x0545af88,0x043e0320,0x05566ee0,0x0616d398,0x067c89e8,0x059a3610,0x0549b428, -0x05935c60,0x078f1428,0x06b83378,0x0661c9b8,0x063f7a50,0x05b46bd8,0x0509d180,0x04a74c58,0x046b54a8,0x03fd8848,0x037f191c,0x030cf2fc,0x0290d680,0x0201a538,0x02446cb8,0x02e19c20,0x030bae8c,0x03690870,0x02fe32c4,0x01797124,0x08700b00,0x0b17ec20,0x0acbdae0,0x06227d98,0x0a6bfe20, -0x0b09e400,0x0b72ea20,0x0b4b5580,0x0a847920,0x0b1ce7f0,0x0b8a5140,0x0b411e60,0x0aa52470,0x075aadf0,0x09dee8f0,0x0b0b09d0,0x091db9c0,0x048b7658,0x04b03b38,0x04fff9f0,0x04f01050,0x05231918,0x0560bfb0,0x0599f5c0,0x050070e0,0x04872640,0x041188c0,0x03af23e0,0x03436c74,0x02ae0aa0, -0x02d46758,0x02c6d8e4,0x02c8cc18,0x02c88c28,0x034fb624,0xfe368ed2,0xff4275f9,0x00be2114,0xfa0b13b8,0xf8762a28,0xfbbb68c8,0xfb6b7988,0xf90e0850,0xfbcde198,0xfbb940d8,0xfbfb0f78,0xfcd1ae88,0xfc66f210,0xfc5bc974,0xfcb0d840,0xf957d208,0xfad26790,0xfceff7d8,0xf95bb7a8,0xfa2fcd38, -0xff8bca63,0xfe976d5c,0xfe826d6c,0xfe579316,0xfe456816,0xfe1ab3b6,0xfdd8e744,0xfd907b2c,0xfd29a00c,0xfca53d60,0xfc4d02ec,0xfc447b04,0xfc4ef568,0xfd806be0,0xfe5e550a,0xff8d5361,0xff82d17c,0x0232d474,0xff28601b,0xf7776760,0xfe5c8b46,0xfb5b2af8,0xfc95b23c,0xfda7230c,0xfe2e74c8, -0xff16621d,0xfe130084,0xfcdb94fc,0xfd98a6d8,0xfe5d0476,0xfd8be5f8,0xfd829770,0xfda2be84,0xfcaf42dc,0xfde4e6cc,0xfbc52bd8,0xfe326f1e,0xff587e6f,0xfe714120,0xfe30128c,0xfe17128e,0xfdd55b74,0xfd2c9a04,0xfcb6ab20,0xfb7e3d68,0xf9b67908,0xf806f610,0xf7aa1090,0xf85e4cf8,0xfb509c30, -0xfde7da00,0x0102c1e4,0x012182fe,0x07b7e878,0x009d71dd,0xfb619780,0xfee2ec2a,0xfc874ec8,0xfdd0d8a4,0xfe6e2c2a,0x0030ad54,0xffacfffa,0x01466716,0xff3f9009,0x012669e0,0xffae7723,0xff369216,0xfea91070,0xfec40780,0xfe32a3c4,0xfe906876,0xfd65127c,0xfec9cb96,0x0027dd4c,0xfeb988f6, -0xfde3edcc,0xfd78b95c,0xfcdb7ad8,0xfb42fbf8,0xfa583c98,0xf7e95ce0,0xf51cd3a0,0xf2959040,0xf1c401d0,0xf32027c0,0xf8eaf430,0xfe431eba,0x04d1fa58,0x04e909d8,0x0d572570,0x00dea1ed,0xfbff8018,0x013c1d34,0xffc6f979,0xfe6c8af2,0x0018b860,0x02c27dc4,0x02bc9680,0x02b62fc8,0x03cdfb98, -0x0331b680,0x02938788,0x01e124e4,0x01ea2154,0x019bd608,0x01776182,0x01e03e5a,0x008c15c2,0x00a7295c,0x00cc91c0,0xff940ee1,0xfe69e1a0,0xfe56895c,0xfd9aa164,0xfc6c1dcc,0xfbd19760,0xf889b4a0,0xf35da320,0xecedad20,0xea73b480,0xec7b71c0,0xf541c6c0,0xfd22b4b0,0x07a44698,0x08400fd0, -0x13abb820,0x08d8ba40,0xfc9f8b8c,0xfd990e2c,0x00154b67,0x01700b24,0x038efb74,0x01dfb77a,0x02345a30,0x022cbfcc,0x023087f8,0x02ad06f4,0x02c45864,0x02035c78,0x01ad0636,0x00f35ae9,0x0042fcf2,0xff45ec34,0xfdbd01a4,0xfeafee9c,0xff6eea7e,0xfce198d0,0xf9a74a58,0xf85b4da0,0xf5df9450, -0xf235b4d0,0xecf4f0c0,0xe9f43fc0,0xe73a5ca0,0xea19a0e0,0xedb13580,0xeff35880,0xf9b31fe0,0x02baab48,0x0eadb480,0x0f6dcf50,0x02566c5c,0x07bf3088,0x0247140c,0xfe934266,0xfef46b38,0xfca93570,0xfd9b90dc,0xfdc67fa8,0xffccedf7,0x010a7576,0x03229944,0x033a9eb8,0x03145928,0x021a476c, -0x02572bc0,0x01adb42e,0x011b4008,0x0019dd9e,0xff913c34,0xfcc55954,0xfbc5ff70,0xfa6030f0,0xf7baf640,0xf1f3ac00,0xec92caa0,0xe7a14080,0xe81c24e0,0xe83c4180,0xe59bee40,0xf01ae640,0xf684c2a0,0xfc2c87d4,0xf3440500,0xf01a0a30,0xf166e5e0,0xfc93e74c,0xd4289c00,0x00725f18,0x102f6fe0, -0x024feef8,0x08339680,0x02d28ca4,0x043dd8c0,0x007998bf,0x03010b88,0x02751de4,0x00d892a4,0x04287e30,0x044c8178,0x00ec19fe,0x0191ff82,0xfeeb460c,0xfe1ff078,0xfb954228,0xfaba5928,0xf8f3cac0,0xf5966c10,0xf61ab050,0xf7e898a0,0xfb828048,0xfd4418e8,0xfc32eb60,0xffbd446e,0x035c537c, -0x060889c0,0x102c6c40,0x15d5bd80,0x16675f80,0x06c35e20,0xf3a4a770,0xd37bfdc0,0xd433f880,0xd665a380,0xdfa93640,0xfe535c34,0xf5c75150,0x01dd8b62,0xfc62750c,0x008ec626,0xff3e8ca5,0x02fb34b0,0x02cddc0c,0x00f03248,0x02bf6ff0,0x0227ae70,0xfde04664,0xfda1f620,0xfd2ba16c,0xfb274f00, -0xfaec1540,0xfa4db6d8,0xf9554028,0xfdec9538,0xff627a5a,0xfef6412e,0x01369538,0x02eb3708,0x03a40028,0x0544af48,0x08c4cec0,0x0e522490,0x0a6a83c0,0x07807220,0x03d83760,0xfd3ff0c0,0xfcb53494,0xfaac8e48,0xea6c3860,0xf8aa8220,0xeb730040,0xf2854340,0xf779c2b0,0xf8e17120,0xfea484e8, -0xff5291fe,0xff6e4535,0x02820178,0x0357f1ac,0x034e2a98,0x02b39cb0,0x026b6dbc,0x018677ba,0xffcfeb8a,0xfe9c592e,0xfe34630e,0xfc797be4,0xf9853280,0xf7e0c110,0xfa893898,0xfca8ce58,0x03b9ed88,0x0423c3e8,0x0534bf98,0x05a0d700,0x04b58e68,0x047a9198,0x068cc2d0,0x0a0ed120,0x09da8870, -0x0493f360,0x019374b8,0xfc0bb87c,0xf6d201c0,0xf8c8ee40,0xf9659878,0xf44d6a40,0xfe82d924,0xffa23b10,0x025585b8,0x01f86c1a,0x00a44b34,0x0064409d,0x005a4d6b,0x01554b44,0x028329c8,0x031b9498,0x03174ac0,0x029fc1dc,0x03581430,0x01fb2458,0xffc5c56e,0xff52ba68,0xfecf2294,0xfffc2ab6, -0x01ca1f0e,0x02f9ce38,0x065a1bb8,0x0528bdb8,0x03ecc490,0x01f204fa,0xfff015a8,0xff8423c9,0xff932153,0xfe72250a,0xfd908488,0xffb74ae2,0xff5a0008,0xfe16bbbe,0xfafb1458,0xfa3485c8,0xfdc3a100,0xfe202d0c,0xfd97b8a0,0xfc220490,0xfd0feeb4,0xfe43009e,0x00366cdc,0x012e86c4,0x01d5788e, -0x01333a28,0x0163d2f4,0x014ecc32,0x03d25294,0x0379379c,0x05690cd8,0x060f4630,0x0745fa58,0x07ddbd58,0x07898248,0x0861f420,0x079e5538,0x06ed3e50,0x05f647b0,0x054e4da0,0x05118438,0x052f6178,0x02f2f508,0x00c9fc94,0xfe8c8c10,0xfeee14c8,0xff189afa,0xff4d0f45,0xfe4aba60,0xfe0e2386, -0xfe84acc0,0xfe0e8c56,0xfe5751d0,0xfd5df834,0x02f8fba4,0xffcbf4a7,0x00b27927,0x009a6b1f,0xff658bfb,0xff8204df,0xfed2e3f8,0xfe69ab56,0xfeaec862,0xfe1870a8,0xfeae5fda,0xfe5c27c2,0x00874f97,0x01095a00,0x013d13d4,0x029fd378,0x06419428,0x031949dc,0x02f749f4,0x0354169c,0x03891408, -0x038f8010,0x03420b20,0x0315299c,0x01cf7556,0x01385e2a,0x006c8671,0xffd64055,0xff1c76ab,0xfe873ae6,0xfec6a88c,0xfeaaaa50,0xfe5ea7d6,0xfe2b1c1a,0xff722825,0xfe9170ee,0xfd621628,0xfef2cd92,0x04c93ba0,0xfcebaefc,0xfeeed600,0x03ab794c,0x03e3bd4c,0x04132000,0x04589268,0x04844b70, -0x0493c9a8,0x04a4de50,0xff5c34cc,0xfe32e980,0x065f6358,0x00dac6e4,0x0007a4a3,0x00040502,0x0089f9ee,0x003808d2,0x001e8f5b,0x0016a930,0x00248ddf,0x0054dc4e,0x0042804f,0x002f0cf1,0x001c9eec,0xffd8ec4e,0xffa253ad,0xff4f4c59,0xff3fc913,0xff302344,0xff3e83ce,0xff21c612,0xff323927, -0x0260fcfc,0x0392e594,0x03913e74,0x05490c68,0x02d445b8,0xfc38003c,0x0533f7f0,0x02bfbf40,0xfdc02bc4,0xfdaf6cf8,0xfd90affc,0xfd17dd38,0xfd07f47c,0xfce113b0,0xfc6b20e0,0x02642c80,0x042c2190,0xfbb32c40,0x01d8e07a,0x03a27418,0x01a05330,0x01a65a4e,0x01d36236,0x01b3cbf6,0x01ba8b5a, -0x01bb4676,0x01d663a2,0x01b24c86,0x019803b4,0x017446f0,0x019092c8,0x01aec8ba,0x01c37bbc,0x0212a02c,0x0296ff40,0x037c1a00,0x03d86280,0x062606c8,0x073f4f60,0x02fc95ac,0x0500dd50,0x03f98960,0x030bdf80,0x035688ac,0x026ebf54,0x02fcfe18,0x03aca68c,0x037279f4,0x03c99e40,0x02cd7610, -0x02b38c14,0x016f3906,0x0141b182,0x0282d4b8,0x01544e78,0x00690d5c,0x01d7a4ae,0x00c3cfd0,0x015d6364,0x00f34509,0x0102e572,0x00f878c3,0x012b9798,0x00e38cd1,0x00c1a067,0x00868672,0x00998156,0x00c7ed2a,0x016b42dc,0x02085a14,0x0386b3b0,0x05cc8390,0x06d22760,0x09b98810,0x0933b660, -0x08cb4570,0x073c5000,0x051cca68,0x03ec4620,0x034e2fa8,0x02d216b0,0x02c1d89c,0x0240390c,0x02e41218,0x0264a878,0x01bb8e56,0x01915f60,0x015a1a6c,0x01284c8a,0x00490de8,0x00342220,0x01770c8c,0x0028cb08,0xff460223,0x00092ab2,0xff94afeb,0xff975672,0xff536847,0xff86eecf,0xfe956e3c, -0xfdedd8c0,0xfd764984,0xfe23ff7e,0xff2695c0,0x00219beb,0x0195143c,0x04553288,0x094f1c00,0x0aa03d50,0x0c4c4500,0x0cd821a0,0x0bf0cc80,0x088a1890,0x07c777d0,0x05e74cf8,0x046a12b0,0x026a73e4,0x025db134,0x0255dbf4,0x02b039a8,0x028968b4,0x0235a578,0x006ea0ab,0x014f927c,0x007c24d5, -0x00fd9831,0xff9a0024,0x0168b562,0xfebb6c00,0xfd8487c8,0xff0e81e3,0xfe4bcc70,0xfe25559a,0xfde17ec0,0xfe2a8584,0xfcfcf164,0xfc77efd8,0xfc01a990,0xfc084084,0xfc7ec1f8,0xfebd32cc,0x00f91ce8,0x067cd768,0x0dd83110,0x0eff4410,0xf9d7d300,0x02150c40,0x09b6f840,0x03c2d4d0,0x02f71530, -0x02e26268,0x02d9af8c,0x0443c728,0x04438730,0x038a42d8,0x02a333e4,0x029f9c80,0x027d90b0,0x024697b4,0x0177c8da,0x00423a36,0x00e11216,0xfe5c70ec,0xffec276c,0xfe4acad0,0xfc49e3ec,0xfd277228,0xfb352528,0xfcce367c,0xfaed7620,0xf67b63e0,0xf5bccd60,0xf54bc590,0xf64fa4a0,0xfec77b74, -0x03e26058,0x09ae6f00,0x03c96544,0xff9addc5,0xfbd2f1e8,0xffbd959a,0xe302a6c0,0xf8f7d828,0x0509e338,0x00aac443,0x013e0ec8,0x0225bc74,0x00cd8e63,0xff717777,0x00350903,0x0185e76a,0x025f4420,0x03b2518c,0x03ba5dac,0x02454858,0x01cad92a,0x00fd99d1,0x00bae7c7,0xfeced0da,0xfdbc26c0, -0xfc850e98,0xfaa92848,0xfb9e0ec8,0xfd73fd54,0xff70bd7a,0x01939df8,0x0411f6a0,0x05a8c608,0x0a6542e0,0x12f4eb40,0x13fc2f80,0x161c4720,0x16e9fc00,0x0eb80480,0x043e89a0,0xf1fd5ea0,0xe6a36e80,0xfede694c,0xe6313520,0xef42b6e0,0xf72d09c0,0xfb149c10,0xfd2a16e0,0x0037bb08,0x002cc868, -0x036a1bdc,0x0387d370,0x002c0dd4,0x03bbac2c,0x02b2f1f8,0xfe923a78,0xfe8fadf4,0xfd4b7f84,0xfa780138,0xfb8b3018,0xfa4a0940,0xfdf0f9cc,0x06b53570,0x0a563af0,0x11babb00,0x1c5ec540,0x23c49bc0,0x284870c0,0x26e9e540,0x22c5a100,0x1da16ae0,0x151df7c0,0x13abeb20,0x10f17240,0x18541780, -0x1fbaec80,0x2ca47580,0x13b430e0,0x2c213380,0xfecf01ee,0xeae0b980,0xfee766c4,0xfb56aa20,0xfff54af6,0xff1c044b,0xff2715ea,0x00e8490d,0x01a0d7b8,0xfeee1f48,0x02bdbfe8,0x0312ed40,0x00afe059,0x00c7c1fa,0xff847091,0xfea2603e,0x005f1082,0xfc0d2b08,0x030f8fdc,0x09bec770,0x0afe3240, -0x0f867e20,0x11d57900,0x15e1ab00,0x1b16e3c0,0x1995f120,0x19c02180,0x1baa5fa0,0x18bbd640,0x135b6060,0x0aa8e180,0x12f15ba0,0x1a35c660,0x2eab1300,0x2685b800,0x19faf620,0x10ebabe0,0xfccf0f64,0xfcc2b978,0x00e47894,0xfea4aba4,0x01509af4,0x021320e8,0x032e9d10,0x03ae249c,0x02e170ac, -0x02813964,0x02349f68,0x0229097c,0x00fc3282,0x005a9f5e,0x025d6c40,0x0137be6a,0xfced8510,0x0533a6a0,0x08efe650,0x090f9240,0x0b29ae30,0x0a521360,0x09641f00,0x0756cba8,0x078916c8,0x06092600,0x01cc6e8c,0xff80f10c,0xffdfde26,0x017e8212,0x05366cf8,0x0b6bc4b0,0x19603440,0x1839eda0, -0x0aa23600,0x0b4e48d0,0xfcabed54,0x0087c4a5,0x001f16f4,0xff5e5319,0x0063afa0,0x00aaf6b4,0x02250dec,0x024d3938,0x02953588,0x038db970,0x03b822fc,0x0259a6cc,0x0355358c,0x042c7a28,0x04dde0b0,0x03e400e4,0x03cca620,0x047df1c8,0x03a17ef0,0x03bbd554,0x038b945c,0x04366000,0x03e9a6a0, -0x0185aa1e,0xfee99b3e,0xfbe6fa08,0xfa4f7310,0xfa937f20,0xfd8687a0,0x023bf948,0x035c0538,0x03868440,0x04645b58,0x07c84728,0x01066c68,0xffa390b6,0x0154a15e,0x02e20a6c,0x01e58122,0x01d52486,0x01058faa,0x011da6c2,0x00aab8b8,0x01295724,0x012c445c,0x012ff9cc,0x013ee5fc,0x00fcfc99, -0x02890b14,0x020a6884,0x022b04e4,0x02d97740,0x0558e648,0x0220ea18,0xff778123,0x005c83eb,0xff4e3d82,0xff0cc38e,0xfe527a02,0xfdeb5768,0xff20635e,0x003564b2,0x0117fb88,0x014cb7f6,0x01123ba6,0x0083130e,0x0155e210,0x022b8a64,0x02063ed4,0x012a97ea,0x01af2be8,0x022b0018,0xfdc92e88, -0x002b0a7f,0xffc91819,0xffdf875f,0x00eaeda1,0x00ce53ed,0x01934b32,0x023be038,0x02334f78,0x02e011b8,0x02df3c6c,0x02deb99c,0x021d5cc0,0x014bef44,0x028ae5fc,0x01af2754,0x02765564,0xffee9dd7,0xffa639bf,0x000afd9c,0xffdc3299,0x001e1c6b,0x005c3f2a,0x006d8514,0x009ed745,0x00cf34dd, -0x013b628e,0x0194f1c2,0x01f7a2a6,0x024108a0,0x01ef5c64,0x018c8fd8,0x01ab7c1a,0x01c4fcba,0x0167b3c4,0x01f96f2a,0x02d99da8,0x0146e408,0xfdbf5e7c,0x032ca09c,0x013f55be,0xfe4ee122,0xfe2d116c,0xfe08486e,0xfdeaf05c,0xfdd10930,0xfdb4f8d8,0xfdb92a74,0x01ea8132,0x03176bfc,0xfea987c6, -0x01578f98,0x02240f84,0x005de637,0x00ee4440,0x00b438a1,0x00ae7a16,0x008dbb24,0x0061ad2a,0x00342191,0x007252c4,0x009e4f18,0x00bdddc3,0x00f01c99,0x01326f10,0x019e5496,0x01a13b96,0x01b76bb4,0x019fed20,0x01aaf2e8,0x020f7a60,0xf9e2a188,0xf9b13a18,0xf798d210,0xfc30f8ec,0x013d65d4, -0x079aa7b8,0xfa5d1578,0x00114eca,0x05c3b490,0x06197dc0,0x060cc608,0x05a3da50,0x064ab3e0,0x06556738,0x064aa300,0xffc91735,0xfb26ca10,0x06b066b0,0xfffc6742,0xfc28533c,0xf9529018,0xfa7a09d0,0xfa051740,0xfa35ee40,0xfa1f6ce8,0xfa1c1768,0xfa257970,0xfa2d2a00,0xfa3e69a0,0xfa581ee8, -0xfa4576b0,0xfa237060,0xfa082b68,0xf94b03c0,0xf8e62328,0xf8c71f40,0xf8ac8fb0,0xf6584610,0xf70ef6c0,0x062c4490,0xfb431320,0xff7e2aae,0xff0cdbbf,0xfd07fbb8,0xfda4bee8,0xfc20ae5c,0xfc6361e8,0xfdbcc120,0xfc637534,0xfcb308c4,0xfcc00c54,0xfe72e0b0,0xfda4e60c,0xfc352790,0xfc50675c, -0x0076849a,0xf98eeb78,0xf9a7abf8,0xf9648758,0xf9d83ac0,0xf9e05788,0xfa05eb58,0xfa0bcf30,0xf9d43940,0xf9c099e0,0xf9ddc828,0xf9c29708,0xf9397688,0xf8abe8d0,0xf678abd0,0xf58f0620,0xf591eaa0,0xf5a9cd50,0xf01b7c30,0xf6781600,0xff0a0942,0xfcbce674,0x01c34136,0x000baee1,0xfff76af3, -0xff39a119,0x00e8acde,0xff7691bd,0x00877aa6,0xfe4adde0,0x00cb8ceb,0xfe9b68dc,0xff707588,0xfdd14fa4,0xfdaa18c8,0xfd73525c,0xfc5a288c,0xfaa29448,0xf8f6ef08,0xf8e51fa0,0xf952c658,0xf8ef9238,0xf8a8e640,0xf8883110,0xf80b0c60,0xf81d7940,0xf85ebb58,0xf87b0ca8,0xf8b02818,0xf8de7d28, -0xf4415c50,0xf1965c40,0xf0675240,0xf0b20cb0,0xea56c540,0xf7378d00,0x027a0038,0xfee6d7a2,0x015105c4,0x027ab914,0x014fe89a,0x01c49fc0,0x01c8fe0c,0x020d68ec,0x01c093f4,0x02bb6048,0x0164a23e,0x00370fd2,0x00028d3e,0xfeec9ed0,0xfe84e374,0xfd44dd48,0xfcb6bce8,0xfaef8340,0xf9af9458, -0xf9118570,0xfa165b48,0xfa2f8cf8,0xfa46b2f0,0xf981c1e8,0xf7b88aa0,0xf6c93380,0xf684ddd0,0xf72d3720,0xf788ea20,0xf719b3e0,0xef813080,0xecb02840,0xeb97a120,0xed20e480,0xe2771bc0,0xe8141d00,0xf37df300,0xf7707930,0xf9bbe348,0xfbaf4dd8,0xfabb76c8,0xfded3418,0x002221d1,0x01520baa, -0x022b3910,0x0248c6b0,0x0254f460,0x01b71934,0x00c5cb06,0xff9c8ec8,0xff27da8d,0xfd9b8f34,0xfba4cfd8,0xf84883e8,0xf745ccd0,0xf6974e60,0xf5f73140,0xf28d66c0,0xf0f4f020,0xf19f9040,0xf360b060,0xf555c8b0,0xf91a8cc8,0xf926aa18,0xf978b678,0xfc3f3ec0,0xf7746e50,0xf177dfe0,0xe7d0c8a0, -0xe351cda0,0x03f1b100,0xf2c2dcd0,0xf2bd9e50,0xf99e79b0,0xfa1deed8,0xfda42efc,0xffae9ded,0x008192bf,0x00944eee,0x0188075c,0x016c7fba,0x02fb6a20,0x02c18670,0x00dfc389,0x0040882a,0xfeeed124,0xfcbc87ac,0xfc26f674,0xfb0b01b0,0xfd44bc80,0xfe3314dc,0xff196b5f,0x02d73e8c,0x0b474de0, -0x13a76720,0x1a9cd240,0x1d813ee0,0x1d445a60,0x1c363300,0x0e902fd0,0x0232d40c,0xf6f84510,0xfa479ec0,0x01afa482,0x0fae4870,0x097a3850,0x1b249740,0x06cad468,0xf6712230,0xfde02180,0xfa6345b0,0xfda16890,0xfc9164bc,0xfe28c03a,0x01056b10,0x01e461fe,0xff1b7246,0x022b9cfc,0x00d7f647, -0xfd4e1bec,0xfd0133bc,0xfcd7a0f0,0xfc90be14,0xfec87c68,0x00032ba3,0x027aa5b4,0x03770e94,0x05a25158,0x08655470,0x066f2fc8,0x03d26c90,0x00621004,0xffa3a60c,0x0163e874,0x053c2268,0x03d5fbb0,0xfbf00ae0,0xf3ae6fd0,0xf0a91290,0xf199cd40,0xfdd3f014,0x0ce36570,0xf27811c0,0x127de2c0, -0x0e613340,0x049de2f0,0x01873a98,0x009a534c,0x00e783c1,0x0193f162,0x01a4c490,0x01c657e0,0xfebfb90e,0x021134fc,0x02e73054,0x022aa200,0x0261fecc,0x019fa7e2,0x028c2edc,0x00a2b004,0x0367e744,0x026a7c8c,0xfcb8f528,0xfbdfec30,0xfaf71670,0xf6da1e70,0xf3b97770,0xf1a6cac0,0xef491b00, -0xe9988500,0xdfbcedc0,0xe3e21a60,0xe7615240,0xee7d8520,0xe7f08720,0xe24f3c60,0xd73a6c80,0xe6be63e0,0xe3ff2380,0xf7a5fe70,0x0c5dfd10,0x061ac6d8,0x022c5cc8,0x03564f24,0x00916cbf,0xfe8d39e2,0x009e5898,0x00b053be,0x0123e870,0x00bc8aa2,0xfff76145,0xff8c269c,0x00ecb53a,0x025bd604, -0x02790ebc,0x02c5ee1c,0x0628a1a8,0x025166e8,0xfdbe21a8,0xfcf3fdcc,0xf8004340,0xf4ee0140,0xf08462b0,0xec3efca0,0xe85568a0,0xe68dd140,0xe5921540,0xe72fde20,0xe82518e0,0xeac23920,0xecfc6b40,0xeec5a3e0,0xec171780,0xe9532e80,0xf612a4a0,0xfa53efe0,0x068ae5d0,0x00e27e1b,0x00a1fb60, -0xffe784b8,0xffa17ea2,0x013f06cc,0x00c8def6,0x00e29937,0xff901703,0x00d731c6,0x00ab8e11,0xffde56a1,0xfe91cf00,0xfdd212e8,0xfcaff5fc,0xff8dc997,0x01db1598,0xfdb575d8,0xfa9ce490,0xf9d98468,0xf60ce570,0xf364fcd0,0xf25d1e70,0xf3527600,0xf77cf4a0,0xfb4ee2a0,0xfdb475a4,0xff40b44d, -0xfdccd0ec,0xf849a180,0xf7dd8ec0,0xf832ee20,0xf9a27788,0xf87d4248,0xfbc05f18,0xff4e7580,0xff6ccf4b,0xfef2224c,0x014e0c90,0x0088b849,0x0085f523,0xffb06277,0x00e73250,0x0027f347,0x01ce0738,0xff12a7df,0x00d0b502,0xfecc3678,0xffd381eb,0xfdf996e4,0xfe2a6706,0xfcdd1ee8,0xfcb26200, -0xf9c08ed0,0xf9a655e8,0xfc1a14a4,0xfdbe801c,0xfdd4e9f8,0xfd8d1340,0xfd0dcb38,0xfc14876c,0xfb377d60,0xfaac2630,0xf96b5830,0xf8ab2b78,0xf8023798,0xf830e048,0xf7d41300,0xf7149bf0,0xfa1390b8,0xfbc31088,0xfb861260,0x02153e38,0xfcef918c,0xfe8ed602,0xfedae3aa,0xfd647814,0xfdc8ba4c, -0xfcb71ea0,0xfcbe168c,0xfe86ce20,0xfd2c5300,0xfd376e20,0xfdc54d38,0xff4f2f63,0xfeaa20c6,0xfd48fab0,0xfdc67974,0x00fefdae,0xfce7114c,0xfd618904,0xfcc34600,0xfc5e7064,0xfc5868cc,0xfc8f9ebc,0xfcf55740,0xfc8471e4,0xfc12b9c0,0xfb961e08,0xfb155330,0xfaa9faf0,0xfa295ae0,0xfa7d5d38, -0xfb098758,0xfb5866d0,0xfbac81c8,0xfb672ec0,0xfa599cd0,0xfd9cbfd8,0x00c868c5,0x0512d4f8,0xfbf151f0,0x005f6e9c,0x04816aa8,0x04ef9768,0x052f6040,0x04e657f0,0x05bf15a8,0x062a7188,0x065e2f08,0x008621a3,0xfc76b09c,0x05d63088,0x0082a21d,0xfd50a994,0xfa8ce408,0xfb86eaf8,0xfb63d720, -0xfb8718e8,0xfb861af8,0xfb67f740,0xfb54a5d8,0xfb0f7ab0,0xfaec80b0,0xfac84278,0xfab29590,0xfa906de0,0xfa48a8a8,0xfa9acb78,0xfabf9b70,0xfafd4d88,0xfaf9a6f8,0xfa471390,0x03853e64,0x024262c8,0x04b63688,0xfd105d5c,0xf8de0e38,0xf6562d60,0x002b805c,0xfa42b9f8,0xf678bb20,0xf64ddf60, -0xf673dac0,0xf7542c20,0xf67c9da0,0xf658b470,0xf6977610,0xfa4a4cb0,0xff9e10d7,0xf5d12020,0xf9f0a7b0,0xfdfa04e4,0x0583ee18,0x0336b488,0x03df0804,0x0408cc28,0x042cd550,0x044a82d0,0x0471c678,0x0451daa8,0x04486010,0x04217d30,0x04157e30,0x03f29d08,0x03d8efdc,0x03bc8118,0x0362569c, -0x024f69e4,0x02c74590,0x014f444c,0x00762d8a,0xf62541f0,0x00bd44ee,0xfd211ad8,0xfd81fa94,0x00112e37,0xffd29533,0x028ef1f8,0x01af2932,0xff1ac0df,0x012ddf6a,0x0165bba0,0x00f2bff6,0xfe7cba4a,0xff4ca660,0xff909f73,0x00775536,0xf9916b38,0x03ead5e0,0x05069080,0x04f65b18,0x05ca32c8, -0x06107090,0x06690d20,0x069571f0,0x0622b1d0,0x059fb488,0x0508e718,0x05201398,0x051a1458,0x04b7a500,0x04761ba0,0x030d9a08,0xfff2195f,0x0079476c,0x00b5f106,0xfd3899a8,0xf8e0b7f8,0xfc6a40e8,0xfba82880,0xfdcebf64,0xfe304d16,0xfed220d2,0xfec7d246,0x019e51a2,0xfe7ccefa,0x026c1b20, -0xfefc295a,0x017fb4b2,0xfe4e300a,0xffb49b96,0xffb81988,0xff9c3944,0xfe4aa07a,0x02b0cd58,0x067a01c0,0x05da1fd8,0x07be67c0,0x085ed800,0x0943bda0,0x09f84690,0x09584040,0x08fd8b10,0x07e5e348,0x07c82458,0x073bafb0,0x06e9fd90,0x063a7b88,0x03fc8ad4,0xfda8b204,0xfec15ff2,0xfe4f0e18, -0xf7248aa0,0xf4279d30,0xfbacb620,0xfc25df34,0xfd9f9148,0xff1afb3f,0x00530aff,0x026e3a64,0x025621ac,0x02aa2b98,0x02024fa0,0x01cb2d02,0x01c9c07e,0x008b9667,0x00d4cc19,0xfe32fe08,0x00fda9ca,0xfd8a4e3c,0x038a0df4,0x083d4610,0x0815bf80,0x0a2f3150,0x0abdd1e0,0x0bbeeef0,0x0c401d60, -0x0a857f20,0x083c6fd0,0x061f1448,0x071e9460,0x08438700,0x07c03f38,0x069a6b18,0x00cc4cca,0xf69815d0,0xf8294248,0x1381cd60,0x0469e208,0xf5f68e20,0xfb390980,0xf9e06af8,0xfafbfdc8,0xfe3588b0,0xfce3edd0,0xff0c27a3,0x010d8450,0x01705b9a,0x02b793b8,0x02ec8bf0,0x01d41708,0x015cdbae, -0x01738364,0xff777a26,0x01cbfaca,0xfe27d746,0x029fe3d0,0x07c13990,0x069990c8,0x0bd687e0,0x0fe36690,0x1404d280,0x16bdb2a0,0x19f5f600,0x1c7881c0,0x1dd765e0,0x16cfbc60,0x110a46e0,0x09e69c60,0x0f35c610,0x12592600,0x146978a0,0x0f317e50,0x17d1be20,0x07d7cef8,0xfb84ee90,0xffbc8ce5, -0x01b9b550,0xff26ccf8,0x0075b70a,0x00504690,0x00fa7170,0x00ff330c,0x01de3af4,0x02ca6e40,0x025d6e24,0x01ad23c2,0x02015194,0x0147b3e6,0xffedb40c,0x00d5347b,0xff483447,0x057e3c78,0x0b5c8a50,0x0c42ac50,0x0ed43dc0,0x0fec9450,0x1114eca0,0x12907400,0x10e1a660,0x0cf5ab40,0x04db9e50, -0x04a294b8,0x03200ea8,0x02bab098,0x07825ac0,0x07e383c0,0x0a1b5080,0x11726fe0,0xf5e49150,0x0ee6d150,0x0ccfdab0,0x06bd95a8,0x03190504,0x02faac48,0x003068de,0x00393df3,0x0229f818,0x02e2f3d0,0xff24c2d5,0x023f4b38,0x018b3a5e,0xff8fee56,0x0065968e,0x01d3e958,0x019c9d30,0x0281d6bc, -0x03161dc4,0x01ec9b90,0xfdd87f90,0xfacd8928,0xf6f4fd70,0xf5b23b70,0xf4bdb070,0xf48b9260,0xf00e1850,0xed4ca8c0,0xeabcaaa0,0xf17966a0,0xf9398708,0x05669d38,0x04322630,0xfe449724,0xf2bd8320,0xf0aad630,0xf64f93d0,0xf2fedfa0,0x019b971c,0xff4ab0c0,0x006a0616,0x010a4ef2,0x01cb3b72, -0x01ab36b0,0x020c23b8,0x01e9e092,0xff00a27b,0x01d1b37c,0x01bcbe68,0x01211b96,0x00f987ed,0x007973ed,0x00e92ac6,0xff1facec,0xff179565,0xfca94230,0xf94aaba8,0xf7b75b90,0xf4e49c50,0xf3195fd0,0xef646240,0xebb3ed40,0xeb94d3a0,0xee2c63c0,0xf311fc80,0xf4c47a70,0xf8467030,0xfadac038, -0x01547286,0x0822aea0,0x0bc4c5e0,0x02aa8c28,0x092afa20,0xf8d6c670,0xefe07620,0xf8bcc2b8,0xfc7d4e58,0xfd0473bc,0xff2a1fbc,0x00934a74,0x00303daa,0x01591b4a,0x0075b989,0x0074ca88,0xffcbbe0d,0xff984efc,0xff2dc180,0xff211c03,0xfdd74fb0,0xffde87f1,0x00849bf5,0xfc42dcb8,0xfa1ac058, -0xf6dd3230,0xf462a670,0xf3dbe200,0xf50af230,0xf9569a18,0xfa7e8018,0xff1119b0,0x082c56c0,0x0941f100,0x0a5bb9a0,0x09d94760,0x0bb2f910,0x09e9ca40,0x05d74378,0x05d79f78,0x01b2c2c4,0xfc61b108,0xf8b09578,0xfc9c744c,0xfcfe1c2c,0xfe7e011a,0xffb4c19a,0xffe8f4b8,0x013b5d50,0x010746c2, -0x00b9c9e9,0xffc8ab02,0xffb5d502,0xffad8d29,0xfe8dab78,0xfd13b27c,0xfcdd9954,0xfa9f67f0,0xf97f50f8,0xfa537890,0xfc383084,0xfcccd1ac,0xff0341dd,0x0196e960,0x0221bf44,0x01b08056,0xff9f3fba,0xfe4ee94c,0xfdd997ac,0xfe4de9e2,0xff1fb92f,0x012a6902,0x015ba21e,0x02561c4c,0x030de76c, -0x007c3831,0x025f6150,0x009f0390,0xfe862956,0xfefa29e0,0xfd6e3ef4,0xfee7dc02,0xffbbc7fd,0x00da8af4,0xffbe2761,0x00b41ada,0xff890080,0x006e9dc3,0xfe7dabf4,0xfe78f102,0xfd7f997c,0xfd75cde0,0xfc2dd80c,0xfc4fe220,0xfb62c598,0xfd3a73fc,0xfe8740e6,0xfd6507ac,0xfd63c324,0xfcef76cc, -0xfd31023c,0xfd9316b0,0xfdd6903c,0xfe4570f4,0xfe6f38dc,0xff976987,0x00750ad3,0x01cc404e,0x01670196,0x015f44dc,0x028df2a4,0x01bc8d5a,0x00643382,0xffffc24f,0xfafdb008,0x000e1556,0xfe1ff3b2,0xfe2514f6,0xff851102,0xff23542d,0x004ba2ca,0xff4a53f7,0xfdb2d020,0xfe855794,0xff15b3ff, -0xfe74ee8e,0xfd6dbaa4,0xfd930a84,0xfe21bb3e,0xfe5726ac,0xfbf7d8f8,0xfdb03550,0xfdb327b8,0xfde41938,0xfe3a7c36,0xfe770a20,0xfe8f7bee,0xfe79fc22,0xff1a17e3,0xffa90d82,0x0035402b,0x00df13dc,0x0193fad0,0x026c1c50,0x022fcd50,0x01df2f6e,0x014f1120,0x00ac31fc,0x00b3c343,0x019fc81a, -0xfc94803c,0xf9e23988,0xf8a9da60,0xfe850c14,0xfa919860,0xf8b9e680,0xf8683308,0xf880bcf8,0xf90e5670,0xf889d2b0,0xf844d2a0,0xf85f66a0,0xfa08db80,0xfd870c70,0xf897ee08,0xf9e510a8,0xfc70e734,0x00659c75,0xffc0bbf8,0xffee633e,0xfff2099c,0xfffd5509,0x001a8162,0x002a7ff7,0x0094ac7a, -0x00e64b12,0x013c38f6,0x0174ab50,0x019c696c,0x01e6c490,0x0176ac10,0x013fb588,0x01199504,0x01066c32,0x00c676a7,0x033116e0,0x031f825c,0x02878d74,0x059e5b90,0x05dc5c80,0x0275c0b0,0x04f1d060,0x05dc91a0,0x03a1c1e4,0x03e83724,0x03e94364,0x032845cc,0x0385a264,0x0372df8c,0x0331a8c0, -0x05fabf50,0x0504f570,0x02c6af90,0x05fd91b0,0x05916ac8,0x01f1a20e,0x02cc8b60,0x02d6117c,0x02cde47c,0x03036890,0x0324f088,0x03344550,0x03558e50,0x03659800,0x0372c2b8,0x03a98778,0x03db2bd0,0x0455c478,0x03d74e58,0x03ae536c,0x0368a198,0x03777e64,0x03a48520,0x04318640,0x030b9758, -0x02a448d8,0x0370ad20,0x033e15d8,0x02fe93f4,0x02ee5360,0x032fd4d0,0x03d18b24,0x043d7a28,0x03d8f5cc,0x033646f8,0x03d7e1b4,0x031d7bb8,0x02dcde7c,0x040c2138,0x02f087c8,0x05055208,0x03007ca8,0x01f366de,0x028b7500,0x0219d2c4,0x025be8a4,0x025853ec,0x027ca304,0x02fcbfa4,0x03a38f40, -0x0429a3e8,0x05001800,0x05944080,0x068762d0,0x05920108,0x052215d8,0x04773a58,0x04893f20,0x06067568,0x043556b0,0x0351b284,0x02cb5ea8,0x01d89dba,0x01a9263c,0x01dc0cfe,0x01a9a046,0x03013740,0x020cf688,0x02b0c310,0x015b4d48,0x025fece0,0x027dd510,0x020d28a8,0x01823688,0x0256a438, -0x020c4674,0x043c9268,0x02cf1df0,0x01359fa0,0x02c6d034,0x024e4b30,0x03a49d78,0x04564a30,0x051c2480,0x063a0e80,0x06e97960,0x079f4a78,0x08be5440,0x09230250,0x0a60d230,0x087ed140,0x083fefb0,0x07289cc8,0x076e1af8,0x07753d30,0x0496c008,0x016cfa52,0x01051506,0x00cd39ca,0xffcb04d4, -0x0026303a,0x00170a45,0x01bda082,0x02410d28,0x00b910b2,0x019b5228,0x01430134,0x00e2560a,0x001650cd,0xff85f8be,0x017aadf4,0x004612b2,0x034abecc,0x017174fe,0xff0c0082,0x00139a2c,0xff2e1d17,0x0033d7cc,0x00739f31,0x01100112,0x03061854,0x05b667c0,0x081093d0,0x0a5b1340,0x0aec4c40, -0x0c7590a0,0x0a485600,0x08f7dec0,0x07be02d8,0x07e13020,0x0dfb39e0,0x0fc723b0,0x0c3c5f70,0x070ff910,0x06dd7cd8,0x05543478,0x04b8a9e8,0x029e42a8,0x01b6d15e,0x01576dd8,0x0100ad4c,0x02064548,0x02425e2c,0x02507eac,0x017ec882,0x00bb9153,0x01b0e102,0x009bbd53,0x03f5a0bc,0x0454bac0, -0x04514d90,0x096451f0,0x0bdcb010,0x0edf2160,0x128e0500,0x181aa480,0x1857a460,0x16757960,0x104e8660,0x1215f360,0x12a92200,0x123af0a0,0x12af2dc0,0x13953580,0x15abd9e0,0x14923760,0xf56e3f30,0x07ae6e28,0x0bf62140,0x0503bff0,0x04836208,0x02e35cc8,0x013955c6,0x0097b113,0x0117ee88, -0x01750896,0x018d569a,0x0276abb0,0x024b6c68,0x01d4954e,0x01963d9c,0x01c460f8,0x041c1cb8,0x03c41a40,0x06e1c068,0x013dd994,0xf9f18f40,0xf8761e98,0xf34d5110,0xf3ffb3e0,0xf23afad0,0xf0f1cd70,0xee63e060,0xef9563a0,0xf2adde20,0xf8ff7bb0,0x017c2d9e,0x0a7020d0,0x058a7940,0xfe82f9cc, -0xf30cf750,0xf333c6e0,0xf7c7a310,0xf7d600c0,0x04afbcf0,0x027a7d18,0x054ab968,0x02f0c7e4,0x04034218,0x016d5d1c,0x03a40980,0x032d7fb4,0xff968a6b,0x029cb8bc,0x023eec48,0x01d8fcf0,0x020cf5e4,0x017306f8,0x03222928,0x003c0272,0x0011c13a,0xfca99aec,0xf9da08c0,0xfa37af20,0xf5ff9bd0, -0xf32f64f0,0xf23d95a0,0xf5f03910,0xf565bc80,0xf557b670,0xf60056b0,0xf16d6e00,0xf145d130,0xefe7ae20,0xf32415e0,0xfcd9d7d8,0x07ff68d8,0x0292b6f4,0x0faa9df0,0x01cd0aa4,0xf905d780,0xfed5a95a,0x00569b8c,0x00c88aa2,0x00ae0998,0x00770d09,0x018d0aa8,0x01b518ac,0xffdca66f,0x00f6aa79, -0x0064c3cd,0x00ba54be,0xfedc4890,0xfea476a6,0xfe3a3ade,0xfe85caea,0xfee48e96,0xfc4ee5b4,0xfac6a208,0xfadbabb8,0xfbd52b50,0xfed21282,0x020b3fb0,0x05622c70,0x08200d70,0x0c2ff840,0x119cec00,0x0ef868f0,0x0b1352d0,0x057f7810,0x06119718,0x045bb3a8,0x096ab8a0,0x0c9be5e0,0x07011f70, -0x09ebff90,0x0681dc90,0x01cc8d16,0x02ec23d8,0x01345370,0x022c89b4,0x040f9d00,0x03107204,0x016ada04,0x005d7032,0xffdd6a22,0xffc9736c,0x00b8d991,0xffd3761d,0xfe85aef2,0xfd8df960,0xfc3118a8,0xfc408820,0xfce7c154,0xfec081e2,0x004fc084,0x020353b0,0x042b7a80,0x056c3bd8,0x056fd028, -0x09e14ba0,0x0905d330,0x032d28fc,0x01f2bcec,0x00954bc0,0xffce7fc5,0xfcb513a4,0xfe4e1424,0x037f2c58,0x06d29ea8,0x049cf338,0x06c51e58,0x019fd1a6,0x007b13a8,0x00607414,0x000f71c0,0x002a535b,0x00d1f135,0x00315bb2,0x00263d7c,0x0026ce1f,0x006dc6d4,0x001e951e,0xffc7c231,0xff8c86e7, -0x00511b36,0x01b518fe,0xffa8332c,0xfda8ee6c,0xff4cb624,0xfe386cdc,0xfd85f97c,0xfe85bb0a,0x00c8c777,0x02a4abe4,0x03ff8fb8,0x032f2c94,0x01e54196,0x00feffcb,0xfeb7fe36,0xfdf9fafc,0xfe7a0a14,0xfed96052,0xff41e232,0xff709feb,0x03ffe874,0xff8c036e,0xffeebe51,0x0264b26c,0x0207324c, -0x0236a500,0x01a4940c,0x010751fa,0x00af89d9,0x0101b704,0x0040d3cd,0x011a2384,0x00127aa2,0xffd429a8,0x00363663,0xff395d2c,0xff64765d,0xff388712,0xff2b7d31,0xff6f8439,0xff186ecd,0xfe6c5556,0xfdf8e5b4,0xfcfc7140,0xfde1fecc,0xfe8011d0,0xff415ec3,0xff4c47a6,0xff94f743,0x0009aeb7, -0x0049ca5c,0x00d684de,0x010380fe,0x018f4f90,0x01f9b566,0x018d2e3e,0x00fdd955,0xff85584d,0x0036e38a,0x0158cca0,0xffb6393d,0x00f2bd66,0x00b18221,0x00697fde,0x00be1be8,0x0013406c,0x00cd49aa,0x015c97f0,0x012fe290,0x009329e3,0x00e5ccc9,0x002bd02a,0xffd91a87,0xff9eb4ac,0xfe7da398, -0xfde1f350,0xfe3d9650,0xfe45bf5c,0xfe7b56ec,0xfe93e76a,0xfe87aa16,0xfe5f28d0,0xfe574be6,0xfe981714,0xfed67610,0xfefdc17e,0xff1552d5,0xfeeb0efe,0xfec38d92,0xfebdc418,0xfed5f5c2,0xff2f4bca,0xff892b7f,0xff896cff,0xff282032,0x02cf51b4,0x037f37e8,0x01074d74,0x02377d48,0x0364e128, -0x01e8a76a,0x01d7e668,0x019ff122,0x010463c6,0x0110e5e4,0x00ff7e14,0x00b6e19c,0x03215588,0x021c4fb0,0x00053bb3,0x0299abac,0x01fb91da,0xff9e2645,0xffc391b1,0xffc63475,0xffc7c28f,0xffcc28ed,0xffdb36f7,0xffdf16c0,0xffb3f7eb,0xff83103c,0xff59af27,0xff3edf5f,0xff40731e,0xff427d5c, -0xff6444d3,0xff7198b1,0xff6284c1,0xff7dccac,0xffc429a0,0x01977898,0x01b9b9ae,0x01dd5a4e,0xffda0c43,0x004fde7a,0x038438e4,0xffc1ac5e,0x001f698c,0x02bbc78c,0x02f15ca4,0x02fe16c0,0x032e9c50,0x03204800,0x03385218,0x03993308,0x0039ee0b,0xffb155dd,0x03d1189c,0x0066d475,0xffb6708c, -0x013210ba,0x0139cf94,0x010cd86a,0x00ed8815,0x00e60195,0x00d229ce,0x00a2d95d,0x00c1909d,0x00de574a,0x0121861c,0x014f2c5e,0x019c1028,0x0228c2e4,0x0201e288,0x020f8b70,0x027d6e28,0x01cb0134,0x03391e00,0x01d9e8f8,0x0177c6ee,0x012206ee,0x00ce3e77,0x01646dc4,0x01462f98,0x010c6a82, -0x0156fe08,0x00f12b80,0x00428299,0x008d7e27,0x01114414,0x00fcc53d,0x011692d0,0x010784d0,0x00540b59,0x00f584cf,0x014e5ae6,0xfff3fffa,0x00adc366,0x001ff71f,0xfff17e65,0x000a25aa,0x00012bca,0xffb4ccb0,0x0012f02e,0x00970e47,0x0182b9fc,0x01fd49f8,0x02a3adb0,0x03a9c86c,0x03364a30, -0x03783a00,0x04ec06b0,0x0381e738,0x044301d8,0x02f88be4,0x01509386,0x0182ce56,0x01026430,0x00ad4175,0x00d122c6,0x0080bba0,0x015ad0cc,0x01ef5ea4,0x0027afec,0x016373f6,0x00fd399d,0x017149aa,0x00609d9b,0x003c654a,0x0067b8e5,0x008c63c9,0xfffbfd6d,0xff4ecee6,0xfffc1b71,0xff3902d0, -0xfe5e2a30,0xfe4bd05c,0xfdfa6ff0,0xfd447f98,0xfdf61314,0xfec8f616,0x00b77439,0x01b95cc6,0x03336c78,0x0594e110,0x048ff610,0x04daa948,0x07a90ab0,0x04860f00,0x074264f0,0x04ac1bd0,0x02ed300c,0x020cff50,0x020aac78,0x0188dad2,0x018201b4,0x00ebcb70,0x01df13c4,0x0207b530,0x0157c1e0, -0x0199f7ec,0x013206e8,0x01aeb3c6,0x003d58c1,0xfff422a0,0x0039a634,0x00af9a76,0x00011d79,0xfe8c57d0,0xfea7ebcc,0xfd9824a8,0xfca81a94,0xfd4de730,0xfd6f75cc,0xfcfa8b38,0xfe7b3200,0x008db508,0x040c47c0,0x0513d818,0x06ccf7f0,0x09735e30,0x07824228,0x08536ea0,0x0d6d11f0,0x094def70, -0xfd202378,0x0046d298,0x04ed9f38,0x03c409d8,0x02e8eb30,0x019b5794,0x00a350e5,0x01e687ba,0x0163578e,0x00cc49de,0x00ebe344,0x018b909c,0x01a64e60,0x017f7924,0x00e6f0d1,0x009a67a1,0x00847053,0x00e7f062,0x00b689f2,0xff62d2dd,0xfdd0fb30,0xfc50fe8c,0xfa89ebf0,0xf72222d0,0xf510b230, -0xf404a4a0,0xf4b39510,0xf5252f80,0xf4fa3770,0xf55b89c0,0xf5ae5730,0xf5ce4860,0xf783e1f0,0xf80ef158,0xf984b730,0xfb08d5c8,0xf2847110,0xf8ffbcd8,0xff6130a2,0xffa13e5f,0xff9f3a6a,0x011434ac,0x01b8e134,0x0227fb80,0x02312f4c,0x021b9e8c,0x01674724,0x023a3e74,0x01a4135c,0x0159722e, -0x005b8e0d,0x001b15c5,0x001190e6,0x0047910e,0xff0454aa,0xfb5c5b20,0xf8942188,0xf4f648a0,0xf2339320,0xee7030a0,0xecc68dc0,0xec42c620,0xeee8a640,0xf1f68e80,0xf75b5430,0xf72f2420,0xf62acc70,0xf0829c60,0xf0b08bf0,0xf3225810,0xf6c694d0,0xf567fce0,0x01164752,0xfb667d70,0xf8553dd0, -0xfcb15da8,0xfe5c9f8c,0xff10e3e1,0x009a6e02,0xfff875fe,0x02170360,0x02bd58e0,0xffae9944,0x02b49994,0x02d1d384,0x026d1c38,0x011d2156,0xffbb2181,0xff7fef46,0xfe66fe6c,0xfc103f08,0xfb834360,0xfab17cf8,0xf9c0a5e8,0xfbb14b98,0xfc366af8,0xfd785740,0xfda75390,0x038ca59c,0x07aaf5a8, -0x0b194440,0x0ae76080,0x05403c20,0xfac25d30,0xfb1db780,0xf97b1c20,0xfad9ef88,0xfd2f5e28,0xeb4fc1e0,0x003982fc,0x03b670c0,0x007b043b,0x01275094,0xff8680d4,0x011361d4,0x01b548da,0x01a9a78a,0x0106d7e8,0xff4a7e95,0x003929d6,0x005b7a8d,0xffb66805,0xfed1d97c,0xfd89ea10,0xfc22ff34, -0xfcf7252c,0xfc0347ac,0xfd35b35c,0xff5e5de2,0xffbdb156,0xff890ea5,0xfe67e2e2,0xfd1e38ac,0xfa01a698,0xfb3c7518,0xf8032008,0xf159b690,0xf118da10,0xf270c9e0,0xf5340c00,0xf338f730,0xf19a80e0,0xefd149a0,0xe8c9ea60,0xf0be5070,0xf4323ad0,0x0078baa2,0x00ff968f,0xff263727,0x00d35e3a, -0xfff969d3,0xff5d8d4a,0x0042ff96,0x001c36a2,0xff14fbe7,0xff4a4e66,0xffba6dfc,0x0066e991,0x0044bb32,0xffdd7040,0xff676d92,0xfe308b72,0xfc422f00,0xfda01c30,0xfd3ae3f8,0xfcc9d7a8,0xfdd5e988,0xfce3d240,0xfc0b72b4,0xfa64c6a0,0xf70fe2a0,0xf4762320,0xf2ef0d50,0xf459ddb0,0xf5341360, -0xf5bca950,0xf7775eb0,0xf775c1d0,0xf7abc5f0,0xf43a53f0,0xfb546bf0,0xf94b3cd8,0x0054b142,0xfe610dcc,0xff369af7,0xff2c905a,0xffc24c01,0x0072d58f,0x001353d5,0x00317da0,0x004a829d,0x00a86b8b,0x0044a933,0x0001c384,0xff830e31,0xff26849e,0xfe7f49a8,0xffe7f92b,0x00605018,0xffd8aaf8, -0x009807f0,0xff3c49cf,0xfc00cb04,0xf7bd6b90,0xf66222b0,0xf838f038,0xfb343548,0xfde81b90,0xfea059de,0xff263c4e,0xff40ea96,0xff3512bb,0xfe3b0994,0xfd471f9c,0xfdb3c988,0xfcbea6a8,0xffc183d9,0x0050cdae,0xfe407a8e,0xfec4f030,0xff38493f,0xff79d040,0xffefc7fc,0x0007b339,0xffc84053, -0x000c148d,0xfef7cb36,0x004564f7,0x00b39b72,0x017650fa,0x00e3d3b4,0x00ff9a74,0x00fa6bb8,0x005db62f,0xfecb2d58,0xfff1d748,0x002908f7,0xfef978b0,0xff0f16aa,0xff4375f1,0xff0474c1,0xfe13c8ea,0xfd8d916c,0xfce0d448,0xfc79f63c,0xfc502c20,0xfbeeec18,0xfb8edc30,0xfc437e04,0xfccd8edc, -0xfd3970d8,0xfe2a31e0,0xfd2bab74,0xfcb0532c,0xfe9f7530,0xfdc91908,0xfda16750,0xfe3f492e,0xfe024c9e,0xfe38cfe4,0xfe36c498,0xfda66848,0xfd7ee4e4,0xfd757af4,0xfdb38b88,0xfd94e7c8,0xfe59e6c0,0xff0c107f,0xfe22bc58,0xff0bd0a4,0xff029c80,0x006a4fb9,0x0060d3f0,0xffc66c87,0xff60dc90, -0xfe9ea7f0,0xfe2ef48a,0xfde91134,0xfdc20720,0xfd836a30,0xfd20d7b0,0xfc9ef1c0,0xfc4ab6a4,0xfbd06b30,0xfc2d3884,0xfc568648,0xfc96aab4,0xfcafe878,0xfd9ff95c,0xfd9ef600,0xfc1cb45c,0xfd2ef948,0x0134483a,0xfc036dcc,0xfd29bac0,0x00488493,0x0056c5af,0x00748bc6,0x00d74bc9,0x00bfbbc3, -0x00d9013e,0x010600a8,0xfd289fc0,0xfc627018,0x00f8e35c,0xfdc64884,0xfd2a60a8,0xfee8698a,0xfe4799a2,0xfe280d70,0xfe066dd4,0xfdef45cc,0xfdce42a0,0xfd9a1c64,0xfd6d9dac,0xfd470800,0xfd2f0558,0xfd1acf34,0xfcfcfb9c,0xfcc02a10,0xfcf962b8,0xfd1e43b0,0xfd53a13c,0xfd6152f0,0xfd208738, -0x01ccfab2,0x02938780,0x023ef700,0x04b9f880,0x03c31ae4,0x00d82f00,0x041676f8,0x03a6c6f0,0x01893f08,0x01b44510,0x0197d326,0x0103c85e,0x013aee6e,0x014774c4,0x01271eee,0x03910d9c,0x03cdcdf0,0x00b88fc2,0x03499838,0x03e14b9c,0x01054132,0x0163673c,0x01684480,0x013c99aa,0x01351f76, -0x0130a60c,0x014f782c,0x012ce984,0x0121f5c4,0x01150f9c,0x00fac2af,0x00f5a43d,0x00ebd4da,0x015d317c,0x01d8ec22,0x02b54a94,0x02b8e780,0x0429e938,0x0494aba0,0x03721264,0x03622f80,0x0314d188,0x02cebd7c,0x02a26fa8,0x01e73886,0x0211ef88,0x02e292d0,0x03130de4,0x030e2388,0x026b1cbc, -0x02c1334c,0x02257984,0x01cbafb8,0x02790f7c,0x01da5e38,0x02043768,0x01b892c8,0x01522a0e,0x01c78276,0x0150a6cc,0x014072e6,0x0140b4fc,0x01ad2342,0x01703104,0x01242ff6,0x00d55762,0x005616c0,0x0074b666,0x00e25f60,0x01f2258a,0x02f31678,0x0491e4b8,0x04a5cdc8,0x0610f460,0x0612fe40, -0x05bdbd18,0x04b07318,0x0351db8c,0x0316fc70,0x026a8bc8,0x014a34dc,0x025aa7ec,0x019f7e0c,0x026a2760,0x01ab6042,0x0228ed60,0x02557f94,0x01f2f632,0x0187b340,0x010ca822,0x0167d41e,0x01a6f0f0,0x009fa581,0x00889251,0x008eecb5,0xffd3d37d,0xff7b54fe,0xff4e95fe,0xffc616b2,0xfef233d4, -0xfead98b0,0xfe1f1ce2,0xfd6c7d68,0xfd9ca970,0xfe533cb8,0x00feae6e,0x03282d04,0x06ca5fc8,0x06889588,0x06ff7670,0x06cf5890,0x055f51a8,0x03e6189c,0x030a6430,0x0377a4d0,0x023348d8,0xffb8bbaa,0x01540b60,0x01a7e796,0x00788ee0,0x013a71c4,0x0146c294,0x00dd150d,0x00209be9,0xff972c89, -0x00933d3f,0xfffa2c07,0x00c98b3d,0x001bf271,0x0121ec64,0x0220aae8,0x00ff688a,0x00692e08,0x005b794b,0x019aab08,0x00e7ad34,0xff65119c,0xfd74389c,0xfbc380a8,0xfcb6bfa4,0xfe734436,0x029407b0,0x05c75258,0x098a6360,0x087e2740,0xfd629044,0x00394ef1,0x06001af8,0x0604c7c8,0x0175251c, -0x00f66c1f,0x00ab5edb,0x01306008,0x0214a3e8,0x0277c0f0,0x01723042,0x016f4c38,0x01466e48,0x022494b8,0x00e09589,0x001e077c,0x00af6bba,0xfff4f362,0x0091c388,0xff12f54e,0xfaa06600,0xf8356800,0xf547d430,0xf7e4a180,0xf7079990,0xf2ef2e00,0xf3136ec0,0xf5e58450,0xfce92aa4,0xfdf325ec, -0xfeb32462,0xffb77b62,0x00abccc8,0x005d379c,0xff5fb6a5,0xfd1b8ce8,0x05758718,0xfc2c1464,0xfa0c8130,0xfe4be7ee,0xff9cca31,0x013557ae,0x02045e68,0x03774124,0x032cb210,0x0305d400,0x01d87e90,0x0264f034,0x01ac653a,0x014cc684,0x003b04f1,0xffbcb03c,0xff5726b5,0xfe469d0c,0xfd2df0a4, -0xfe1c171c,0xff686063,0x00bf2608,0x02c85558,0xfe5bfa4a,0xfddc95d0,0x003d5e04,0x04cd0b90,0x07016ae8,0x06cfb938,0x0bfe5e30,0x0d761050,0x0be489b0,0x12161be0,0x112a3e20,0x0cd4b720,0x0892d3c0,0x0372daf0,0x041b4d68,0xff21da82,0xffa78c5e,0xfe318bac,0xff4e7c9c,0xff5495d3,0x0095a009, -0x014a8e5a,0x020adb20,0x002c75b8,0x02115748,0x024db238,0x02bfd51c,0x00fa89a6,0x006df3d0,0xff5d33f7,0xffbafe39,0xff698361,0x007458ba,0x031eb898,0x035848e8,0x06233360,0x09669b10,0x0bcb5cb0,0x0bb9e420,0x0b562070,0x084eab80,0x022f68c8,0x02d69fac,0x05e621b8,0x0bf5be30,0x159143c0, -0x14e44340,0x0bed50b0,0x0545ae70,0x0bccc540,0xfeb454e4,0xfe230e50,0x01d8f370,0xff2bbe8e,0x01679d28,0x0113a55a,0x0291a4c4,0x016f4ba0,0x00ca8dcf,0xff800159,0x00c055b9,0x0121d318,0x01a44c9e,0x01645cca,0x00c48fee,0x009c6d37,0x00bea5c8,0xfe3d7616,0x008a9521,0x02c95ecc,0x030bdff4, -0x040a5878,0x03cbc864,0x03dae290,0x04c0bd70,0x02dc4bd4,0x02f68ae8,0x054f0b58,0x04c40b70,0x05fdccb0,0x04addce0,0x0f4262e0,0x155a6040,0x18219cc0,0x117a6440,0x0fcb74d0,0x0845abe0,0xfb248d18,0xff6aa3a9,0x009a4a28,0xffe131fe,0x00dc7b9b,0x01845f44,0x00c54556,0x01086066,0xffc85d4b, -0x00f1486c,0x0173dcc2,0x01ba64d4,0x00e12cc1,0x004bb257,0x004815bb,0x02337204,0x0102ecf2,0x0380083c,0x038b66c0,0x01a11eaa,0x00354e1a,0xffc6e972,0x011512b4,0x03e423e8,0x0384f464,0x06eb46a8,0x0ddeecd0,0x0aafdaf0,0x0a5c96e0,0x0a4f29d0,0x0f972090,0x118063e0,0x12a1fae0,0x0e843010, -0x060bf618,0x03f40014,0xfd41a778,0x00877aa8,0xffd87ef1,0x0126388e,0x01844ddc,0x00e6a2c7,0x01a35760,0x013841e0,0x01610a2c,0x009874e0,0x00af93ef,0x010d408a,0x017addc6,0x020a84d4,0x0267dd90,0x018d1cd6,0x0101f1f8,0x01f1d864,0x037a4c54,0x03f24924,0x04251790,0x03e61b8c,0x02b684b8, -0x006990e9,0xfe8b82a8,0xfc8a9340,0xfbaebe28,0xfca1e838,0xfec85c2c,0x016a5d78,0x046b9338,0x06cb86d0,0x08349820,0x064205e8,0x040dc178,0x03647480,0x03312ab8,0x02de6ea0,0x011727fc,0x019a0644,0x014f5aea,0x01daa53e,0x00e6e9d0,0x01b97390,0x00fce134,0x0226d20c,0x00e759e9,0x01544440, -0x0121f72c,0x013c0260,0x00974129,0x0192772a,0x0261b05c,0x03741de8,0x030b9c74,0x0227b538,0x0199fe28,0x00b8e35f,0x00140189,0xff6a9879,0x00b01271,0x0180f086,0x01d80fa6,0x02742da4,0x02743788,0x024ea5e0,0x02d49fd8,0x038839c4,0x04dddc68,0x042e0168,0x0388f4bc,0x04314cc0,0xfd7c3f20, -0x02e2ae1c,0x013a78bc,0x0121f914,0x02a8f9fc,0x02374748,0x03576718,0x0339eb8c,0x021c2b54,0x02d87c38,0x0298dca4,0x023ec498,0x01213fa8,0x011fc95e,0x0274d788,0x01f4629a,0xfffec287,0x018090fa,0x00bcabaa,0x00e36568,0x00b389e0,0x00aa913a,0x009524ec,0x0034532b,0x00878158,0x00b9a3ea, -0x0127c070,0x019b6c84,0x02493b3c,0x02fa4814,0x032fd594,0x033dcf3c,0x034d3610,0x036d0800,0x033eb578,0x048120e8,0x01e75f62,0xff1b7f73,0xfa8aa2d0,0x038e1b74,0xffb59c13,0xfb736710,0xfb20b7b0,0xfb0ece60,0xfb3742a0,0xfadbfe00,0xfab29860,0xfa9e7610,0xff929d39,0x0292007c,0xfadc70c8, -0xff29eec1,0x016e0812,0x029b7834,0x0227f474,0x022ff494,0x020bd888,0x01f20eae,0x01d9989a,0x01b84216,0x022a8c98,0x0282e80c,0x02d1d148,0x0310d7c4,0x0340f2b4,0x0384eaf4,0x0368ed18,0x036ba324,0x03638c80,0x038633e8,0x03d0dc38,0xf9b0a070,0xfa30b258,0xf8557588,0xfc4ae48c,0x0080d8c6, -0x063ca0e0,0xfa61f400,0xff82970c,0x04bd69a0,0x051d7f60,0x05284618,0x04d99f30,0x05820b28,0x05a2fed8,0x05bf38c8,0xff71bafb,0xfb269ba0,0x06242508,0xff9e3f04,0xfc24f7b0,0xf94f4190,0xfa8963d8,0xfa0a38b0,0xfa22ee18,0xf9fc1c38,0xf9f65fb8,0xf9efb500,0xfa0f5c90,0xfa0fc3a8,0xfa06bdc0, -0xf9dfd648,0xf9a39b18,0xf933f9a0,0xf8f6b4b0,0xf8ebb3b0,0xf93db7a0,0xf9572490,0xf6ee6830,0xf7ede5a0,0x0429c1b8,0xfaecbb78,0xfe15ab06,0xfe0718d0,0xfc53a68c,0xfcf3d7bc,0xfbb75988,0xfbe5b170,0xfd4736b8,0xfc07a248,0xfc789b10,0xfcb9cd04,0xfe61965e,0xfd9e7750,0xfc4b3900,0xfc5affd0, -0x00b46652,0xf9e2bf50,0xf9e144a8,0xf98c2650,0xf99199b8,0xf9261948,0xf8f1e380,0xf8ccaa40,0xf90e7518,0xf912e770,0xf8b392c8,0xf8408a58,0xf748f8f0,0xf5fa7560,0xf53da350,0xf5297d00,0xf5d03030,0xf612ef70,0xf4a310b0,0xf95f2cb0,0xff28443a,0xfceffe78,0x000d05b0,0xff51720f,0xff478e0b, -0xfe807fea,0xfff3012d,0xfed6bf3e,0xffbaf73a,0xfde8a74c,0x0079cd49,0xfed4f404,0xffc7893d,0xfe2a80ca,0xfde28754,0xfd8d1c2c,0xfd175ad0,0xfb92ef70,0xf9a934b0,0xf9a0ac70,0xf96e08a8,0xf89c23f0,0xf83e6760,0xf7e33b90,0xf85df8b8,0xf84c1068,0xf7c17030,0xf71caab0,0xf5abfc50,0xf321bf00, -0xf21c67c0,0xf21d69c0,0xf374c6f0,0xf4cac910,0xed0a8980,0xf8535890,0x00b9f2dc,0xfd83bcbc,0xfdf0be88,0xff3a0f30,0xfed601e0,0xff2ce912,0x0068ab6d,0x010ce592,0xfff5c925,0x01592824,0x00abbc55,0x0061712c,0xff8f75a8,0xfe8f9b52,0xff01bf1e,0xfd7887a0,0xfe39bf36,0xfbfcf970,0xf9db6850, -0xf9540468,0xf9548f88,0xf8364448,0xf7112100,0xf5ec2db0,0xf6620c80,0xf6a5c540,0xf56c1f90,0xf425d890,0xf08799d0,0xebaa5fc0,0xe9cb7b00,0xea3ad460,0xebb98aa0,0xeda181e0,0xfd975de0,0xfbcd3f90,0xfb38eb10,0xfe15a3da,0x01040e5c,0x019cbc42,0x00a2adf0,0x000dae5d,0x007ca6eb,0x00fa8491, -0x017d3d3c,0x00ac0042,0x00824b09,0x01a56c52,0xffdaacf2,0xfeb028a0,0xfe985600,0xfc72ffa4,0xfbcc2620,0xf9463798,0xf9b63058,0xf9f6e4d0,0xf7eb4df0,0xf4f6ec50,0xf47241f0,0xf65b8730,0xf56cd590,0xf46979d0,0xf3ecacf0,0xf737c060,0xfba646d0,0x01cc3a70,0x02d64338,0x03630e24,0x01e5a926, -0x00130192,0x0408eba8,0x03b6d348,0xff7eb3ce,0xff3c237e,0xfdf1aec8,0xfe96df5e,0x00115518,0x01368aaa,0x02804860,0x0298d4d0,0x00e2240c,0x014d4a12,0x0116248c,0x0185aa3e,0xff6fa962,0xfe3c77b4,0xfd22b284,0xfbc20fc8,0xfc606dec,0xfb259478,0xf93f6420,0xfa5b3858,0xfc169bc4,0xfe0bdece, -0xff1d2f1a,0xff647614,0xffc77d96,0x0058ab91,0x00967884,0xfda42664,0xfde6a5b0,0x0242762c,0x0044b612,0x0109a49a,0x051b9660,0x0232e1fc,0x00b9bddd,0x0019d19f,0x033bd9c4,0x021525d0,0x02027c30,0x00ca443b,0x00921323,0x01314efa,0x00ed3e31,0x0103474a,0xffd1bd53,0x006a244d,0x00a7b839, -0x02756e10,0xffda1fe7,0xfefe6f96,0xff9ec0da,0xffe82ba8,0x0086d667,0x0085751e,0x01a6c36c,0x01f1e8ee,0xff68e0d7,0xfcfccb24,0xfacf8c98,0xfa227430,0xf80031a8,0xf836d308,0xfa294c50,0xf6ee2210,0xf4963d30,0xf0511700,0xee4e3240,0xf0b4afc0,0xf29527f0,0xfde8dd7c,0xff128d8e,0x05ce39e0, -0x018b04ba,0xff53eaa4,0x012ace7c,0xff99a4c9,0x0066e88e,0x019bd6e4,0x00a6009a,0x00441650,0xff7d0a59,0xffcc3389,0x0082c98a,0x02fb6d34,0x014cae8e,0x016c7da0,0x02ed185c,0x016f502a,0x01d8cd7a,0x00c3fd89,0xfdfeff1c,0xfca8bb40,0xfcb628d4,0xfcfaa804,0xfdf84620,0x00349315,0xfd5f5ba8, -0xfd40c1f4,0xff9e210b,0xfeaf027e,0xff5325a3,0x02f010d0,0xfc5127d0,0xf512d280,0xea4650e0,0xf77d6750,0xf0fe9b50,0xffd2a73e,0x083b6630,0x02c0e870,0x0180416e,0x0219b4e4,0x01574e60,0x00aee752,0x00d9776c,0x002dc02d,0x00453e5d,0x0189289a,0x01aed32c,0x016d475a,0x011abd70,0x010060aa, -0x0148d462,0x004d9c8c,0x0225b894,0x0199a210,0x0186a558,0x02f8280c,0x01e9b7ea,0x00133453,0xfd8fa05c,0xf9762c60,0xfb3d6a18,0xf9b08f80,0xf5219ce0,0xf60d3740,0xf6d2abf0,0xf9640750,0xf7196d00,0xf6168580,0xf25a8600,0xf15adb10,0xf9507970,0xfc3656a8,0x0264f4cc,0xffd5b252,0x010e96f2, -0x012b79ae,0x00dee4b9,0x00885008,0x0033b37f,0x00855163,0x00680916,0xfff0f4ec,0xffd6f6f6,0x003cc9d2,0x0092d790,0x00f6167d,0x01121388,0x01dd9de2,0x02571f38,0x014947b8,0xff57ad3f,0xff45688d,0xff59b273,0xfe8bc700,0xfdfadf68,0xfbfd1788,0xfc823558,0xfcce2e54,0xfda7048c,0xfdde3544, -0xfd7d4d7c,0xfc4936ec,0xfd4964a0,0xfd5a2808,0xfc5cfa48,0xfbc25190,0xfc64ce30,0xfdd0ee08,0x0036de45,0xfeb8be32,0x0020552b,0xffa19172,0xffc3d818,0xff9f548c,0x011ea3c0,0x0089242f,0x02504d1c,0x009428c7,0x0176a78e,0x00730320,0x00c4a6e1,0x00250f9d,0x0060fe44,0x0074c09b,0x0143645e, -0xffe2e10e,0xffadf793,0x00f8d7e7,0x016f656e,0x00c74fc7,0x004d1d46,0x001ae9d9,0xff4d8e1d,0xfe82c344,0xfdc67d78,0xfd6efa50,0xfda1bde8,0xfda4aeec,0xfd7f7350,0xfd60d488,0xfd01c738,0xfd7201d0,0x000f3887,0x003c9002,0x05581518,0x00e1ab13,0x02a487c4,0x0266808c,0x0100be78,0x016257c2, -0x000b72db,0x006b7dd3,0x01621202,0x007ea4e2,0x006ac94b,0x00b2dbdb,0x012aeb76,0x010d116e,0x004e087d,0x00388427,0x0198a21e,0x0054227c,0x00c3d992,0x00944c3a,0x009cadbd,0x00dd820b,0x01153f20,0x0154648e,0x00dcc67f,0x0092aca3,0x003aa57d,0xffe60dd1,0xff409c8a,0xfea14d92,0xfedb99ea, -0xff2c708f,0xff735947,0xffde5a78,0xff795782,0xfea11af6,0x01c4ac46,0x040f0db0,0x059740a8,0x007c75ca,0x03a5beec,0x05a9dac8,0x05d29108,0x05b9f2b0,0x053ebdf0,0x05961958,0x05990340,0x057f63f0,0x0379bb28,0x00e530ec,0x0505d298,0x033eda98,0x013e2b04,0xff60ae39,0xffeecbd2,0xffef8487, -0x000e7f2a,0x001c9ffc,0x00245486,0x0046c9bf,0xfff94a6e,0xffba4c0d,0xff73d746,0xff2c8f34,0xff01162f,0xfeb4ff42,0xfef2d0fc,0xff07b7fd,0xff1e270f,0xff2638ce,0xff1f1040,0x0187f130,0x007c6741,0x0284de20,0xfc7e9628,0xf90f5d20,0xf6dd86d0,0xff088360,0xfa3b8908,0xf7291fc0,0xf6ed5cf0, -0xf7004090,0xf7c787d0,0xf711bfb0,0xf7062100,0xf7456a70,0xfa6c5438,0xfed3a9ac,0xf6a0f6b0,0xf9e705d8,0xfd38c530,0x0338037c,0x0150eb24,0x01c62a8e,0x01ee89ec,0x01cf2b06,0x01bf5a0c,0x01a4a49c,0x01ae569a,0x01c0aa4a,0x01d11b02,0x020a904c,0x021e5a20,0x01f7e122,0x023d7a50,0x01f285fc, -0x00f9e6ff,0x00e85586,0xff83ab33,0xfec3b018,0xf70601f0,0xff24ba72,0xfc462fd8,0xfcbb4cf4,0xfef8ea98,0xfef6af18,0x01078042,0x00752b3a,0xfe846858,0x0018067c,0x00503595,0x0004f796,0xfe342036,0xfec98946,0xfead6594,0xff3ce5e6,0xf9ac3318,0x01ae3890,0x0232f18c,0x02015668,0x02c5d8ec, -0x029301b4,0x027b65ec,0x020455e4,0x01d28762,0x01e1adae,0x024bb610,0x03376258,0x03aae5dc,0x02f8c590,0x03dd6c50,0x030bbd38,0x0064d207,0xffa84568,0xfeef2c36,0xfd01e890,0xf9bf6220,0xfc19377c,0xfb11ff38,0xfcf4958c,0xfdd939b4,0xfee741b0,0xfe6a8752,0x00e48dbc,0xfe6f5b7a,0x01a88de2, -0xfebf80a6,0x013de3b6,0xfee1d34e,0xffe4c22b,0xff128d2a,0xfea59530,0xfd874458,0x00b7c669,0x031205ec,0x025f898c,0x03f85c0c,0x035e2318,0x03260e30,0x029a9ffc,0x0287214c,0x02de7d5c,0x039d3a84,0x04e8e4c0,0x05a03cf8,0x04198f38,0x058d8380,0x03d99490,0xfef05d66,0xfdff4c2c,0xfd916e34, -0xf75be410,0xf5a38140,0xfb05a440,0xfaafe048,0xfc1d950c,0xfdc880fc,0xff55e189,0x011b57c4,0x018dc20a,0x01c03c04,0x00e5725e,0x0135480c,0x01d92648,0x00a39df9,0x00ae6679,0xfdf39a54,0xffa61c63,0xfcd6bfd4,0x00981f2f,0x03385604,0x02f316e8,0x05306f20,0x04b3d278,0x04752620,0x032ae22c, -0x023b4988,0x02677708,0x0460afb0,0x07bed178,0x0969ff40,0x07186e18,0x08cb1ca0,0x05ae50c8,0xfe06e816,0xfbe10630,0x15f02200,0x0cf9f600,0x01806eec,0x00fe10c4,0x007f42bc,0x00283357,0x02453c14,0x01e7e62c,0x0057eb0e,0x0029c24e,0x01435352,0x00d0c218,0x00bd8fd7,0x0122984a,0x006c411a, -0x00ba454d,0xfee81398,0x00729d15,0xfd859a28,0x00215b6c,0x046f3920,0x02a7b110,0x04b971b8,0x03f67a90,0x03c0bb34,0x020d0a34,0x03c5b218,0x030b3870,0x004a3c38,0xfc9b55ec,0xfa652d28,0xf6e37b40,0xfb8c1240,0xff82d328,0x025a9ca0,0x0dbcdfb0,0x03a3ef9c,0x061b53e8,0x046b74f0,0x04057f90, -0x057e0c80,0x02482848,0x01e74596,0x00e31d4e,0x02825408,0x025475a4,0x01002df0,0x011b193e,0x0123b48e,0x02978dac,0x01202c9c,0x0064e78c,0xfeab2644,0xff365e54,0xfc9f2e64,0x00bb19a3,0x065d46e0,0x0622c0d8,0x07a362f0,0x07e12138,0x0782c318,0x05959860,0x03633ba0,0x01a02640,0x01d9c532, -0xfaf6bba0,0xf951f380,0xfa24c138,0xfa0c1d80,0xfbf73f98,0xfd0ace24,0x00f8fcfa,0x00832d3e,0x0408fce0,0x0102bc30,0x028e1d3c,0x01944678,0x01dd69e6,0x01171f14,0x0369d6c8,0x01e7427c,0x01df9ecc,0x0035f48f,0xffd01d93,0x004faa21,0x038f894c,0x00f8565f,0x0168326c,0x00ecb22e,0x020213b8, -0x01bc253a,0x019fea86,0x013feaf2,0xff29b580,0xfdccbd48,0x0001871f,0x01e0e770,0x02c73e08,0x034d6014,0x0394fb14,0x056cc640,0x05dcd530,0x08827ad0,0x0e0fa8e0,0x09b25af0,0x04aacb68,0x014ae950,0xfe2c7c1a,0xfccd79e0,0xfdccecfc,0x025026b4,0x025862f8,0x00d3bd8c,0x01644da8,0x0174e7d8, -0x02f38c1c,0x00d1c304,0x001631d0,0x001b257f,0x0036b486,0x00bd2695,0x033c4d34,0x01a8701c,0x00ede9be,0x014d792c,0x0116c922,0x00690690,0x01270e9c,0x02225b18,0x022a18e8,0x01a52b70,0x00fef0e2,0xfea3fe24,0xfa5d8170,0xfa980aa0,0xf94436d0,0xf793fe20,0xf9f66cb8,0xfd1eb97c,0x0108de28, -0x01694e58,0x04288c40,0x069c1578,0xff5ceb69,0x04d01158,0xfcdf65f4,0xf99960e0,0xfe477006,0xff64f2f4,0xffb5f3fc,0x004f870a,0x005f694d,0x0000d921,0x011be0f6,0x014271fa,0x019312a6,0x0166df14,0x013a12b0,0x00dbf6ee,0x0127e5f0,0x01314450,0x0147e62a,0x007e02de,0x0053c92e,0xff8fc41a, -0xfe334e12,0xfe4efdac,0xfde402e0,0xfdfd71ec,0xfe64e976,0xfc95e1d8,0xfb933e78,0xfc3d6488,0xfde2034c,0x006d8044,0x035ea6ec,0x05515600,0x042f8800,0x0104b0fc,0x02825288,0xff6ad702,0xfcf0ce00,0xfbdd2400,0xff22be9f,0xff73889a,0x007e8fb3,0x01526bc0,0x00c7a7ee,0x0195e9e2,0x017fe5de, -0x016413a6,0x01058a58,0x01030618,0x00d9c287,0x01115b6e,0x00956f87,0x0004ac29,0x000b2286,0x0020fe15,0xff5c9fa2,0x004c0c12,0x00af419b,0x0159f346,0x01b16ad2,0x01b88e7a,0x01838262,0x0098ffc5,0x0029b7a9,0xff51fa14,0x016b20b4,0x033b137c,0x056b55b8,0x0225c37c,0x0025c56f,0x004252c3, -0xfe27f67e,0x01a7022c,0xff6914eb,0xfd73ba68,0xfee8796e,0xfe26337c,0xfec7e3ce,0xff534610,0xffdee767,0xffa16801,0x00b4ce41,0x002af1e0,0x015d6e28,0x006c921b,0x0135477a,0x00536a70,0x00ba470f,0x007c2d87,0x00628010,0xffe10757,0x00d5def7,0x01a3f2cc,0x012a136c,0x01513ef2,0x00d3d940, -0x00a2bd9d,0x006172c8,0x0139477e,0x0234724c,0x032735d0,0x02f964d4,0x0278d794,0x029f2d5c,0x021faa60,0x01ada096,0x018afc6a,0x00f0e8c6,0x00dfc7d8,0x007206cb,0xfed905de,0x00aa99c8,0xffc832cd,0x000f369e,0x00c8af65,0x0091f960,0x016f9050,0x01018b1c,0x003ed7b4,0x011e7ea6,0x0195aa6c, -0x01819ba6,0x012f74a2,0x01786ba8,0x0179f8f4,0x01a7d640,0x00a99102,0x01c4466c,0x019d2226,0x01ae31dc,0x01d050a2,0x01d1dda2,0x01dbab7e,0x01c2fc00,0x01f1e018,0x01f0bc94,0x0211edb4,0x0239c264,0x02a723b4,0x02ecab98,0x029c5790,0x02371d7c,0x01bb37de,0x012d1322,0x01123386,0x01447764, -0xff063718,0xfdf95b34,0xfebfaffc,0xffa44c90,0xfe130df6,0xfe156f6a,0xfe03861e,0xfe163ee2,0xfe895ba2,0xfe35f40a,0xfe277846,0xfe589804,0xfe75883c,0xfff992c5,0xfea4e0f0,0xfeb6a094,0xffd9e962,0x01b0d14c,0x015012f6,0x016ac640,0x0165f754,0x0176268c,0x0189fe74,0x019dc968,0x01a5e3da, -0x01afe7ac,0x01b53bbe,0x01c469fc,0x01ba784e,0x01cae136,0x018b6a42,0x016d015a,0x015ce930,0x01417f6c,0x010de28c,0xff7e6a78,0xffc262a7,0xff3b203b,0x02ed104c,0x03bca810,0x01767d26,0x02103098,0x03a15244,0x02c99eb0,0x0303f1dc,0x03066ba4,0x024df9f0,0x02afcd58,0x02a9e108,0x02756e58, -0x03ff1778,0x02491768,0x020d6418,0x03d9498c,0x02d25900,0xfebc4a6a,0xff903faa,0xff7eec03,0xff8d5515,0xff84d47d,0xff7aa6e5,0xff647d16,0xff5998af,0xff446599,0xff36a86e,0xff018f93,0xfeec9002,0xfedceffa,0xff078f3f,0xff40d56a,0xffaa6f8c,0xffc84a59,0x013b1d24,0x0174e37c,0x0100357c, -0xffef3f7f,0x0131ca30,0x0156e8aa,0x00a4597d,0x00ad5cc6,0x00349a85,0x00f9cf20,0x02405a24,0x0148ae6e,0x00c96525,0x0186a3ac,0x01743724,0x010863fe,0x017dd318,0x0077e4c7,0x02c1916c,0x002792db,0xff0c1833,0xff8487b8,0xff541a50,0xff0fa80b,0xfecae166,0xfeae4696,0xfea83a10,0xfea46308, -0xfec41f56,0xfe4ff12c,0xfe50ae3c,0xfe9f4390,0xff4b6922,0x002da347,0x016c2a48,0x01dda2b2,0x02b7c2f0,0x01f794ca,0x016fc7a6,0x01839c8e,0x00aea428,0x006af4fb,0x00c32ba9,0x009b88b0,0x01a95066,0x005af19b,0x02371a60,0xffe8f0e9,0x019276d2,0x0192a68a,0x01d7282e,0x00f8143e,0x00f9f657, -0x00987306,0x01c90a76,0x009ac7ce,0xfeaf8100,0xffb23149,0xffbd2de0,0xffc3bfcf,0xff939b6d,0xff526341,0xff4373d8,0xfee21cb6,0xfe6f7798,0xfd11fc88,0xfc785b50,0xfc6552ec,0xfd79b2cc,0xfef1544c,0x01f76e34,0x02b51984,0x082a40e0,0x047ff1e8,0xffd60533,0xff4bf3ef,0x00444b81,0xff764854, -0xffc44a9c,0xff2b66c0,0x002cb0e1,0x0127cc82,0x004f296a,0x00c72387,0x00d28f94,0x01201f02,0x0042bced,0xffb2168f,0x005dab8f,0xfee14b02,0x00909827,0x00004f74,0xfe4217ce,0xfeeef3c6,0xfed7efc4,0xfdfb2c7c,0xfd4dbdec,0xfd288fa0,0xfd4c19f4,0xfd2f929c,0xfd029c00,0xfb69f760,0xfb971028, -0xfcc26254,0xff929fc9,0x02a25cac,0x07711118,0x08912580,0xfbaab618,0x0778cb90,0x0fde66b0,0x0a1b8c70,0x06697c10,0x0454ed18,0x033cee54,0x04009068,0x02daceec,0x01bf1dd0,0x013a5aca,0x008c0725,0x005a2971,0x019f38f2,0x00cb145f,0x00588542,0x0067a3b9,0xffd4a10f,0x01e07620,0x017ce062, -0xffc3e4d8,0x02a5fe00,0x04af35b0,0x0769fea8,0x09549840,0x0af62120,0x0979d150,0x086500a0,0x079067b0,0x041a5d68,0xffc9c2dd,0xfb129e80,0xf7d15eb0,0xf72a8400,0xf8408c50,0xfd6322f4,0xfe1c0f0e,0x00a79b94,0x045fac00,0x02769ff4,0x0382d5fc,0x04800c08,0x02b0e768,0x0221ba50,0x01f03282, -0x021fd1b4,0x00abb8c2,0x015b99b4,0x0196a438,0x02142b18,0x00e673bb,0x0129e77e,0x0238cd0c,0x02735628,0x04063538,0x01a38f02,0xfea884e0,0xfd70eb38,0xf9074708,0xfb0840c0,0xfbc39228,0xfb741d60,0xfcf9fe58,0xfdb4ed88,0xfe492338,0x044a7738,0x091d9e40,0x0d6eac70,0x0ed4ea30,0x0b889f60, -0xffcf528f,0x016b6b66,0xfe752274,0x005e15c2,0x045426a0,0x023287d0,0x03863e40,0x00b29f39,0x02a6c138,0x046bee90,0x02391c08,0x010134b4,0x00769c72,0xff1643f8,0xffdcdc66,0x04a33380,0x0161f272,0x0073864e,0x01969c2c,0x001cbdcb,0x00c15426,0xffce096a,0xfe973b44,0xffd9f8f5,0xff496024, -0xfc803c38,0xfa3dac58,0xf8eae5c8,0xf9def470,0xfa516d00,0xfa61bc30,0xfb81e238,0xfd992d3c,0x027343a0,0x0361a78c,0x0555a4e0,0x0531fca0,0x035a2a44,0x08b9eb80,0x01f2f30a,0x001b8200,0x00465e88,0x00d89890,0x01168b3c,0x010f8dac,0x0220d2c4,0x0099c623,0x00149ab6,0x0180fd74,0x00d02299, -0x0126bc42,0x035f0938,0x01610d30,0x01485470,0x0088828d,0x00fecd98,0x02536b9c,0x0076a7f2,0xfeab28a0,0xff14b946,0xffedcc9f,0x0170a488,0x03155e14,0x04b83d38,0x0482adc0,0x0441c6b0,0x03cf3900,0x05368858,0x0425d940,0x0021cbd0,0x02d0b1c8,0x03470e10,0x025fd71c,0x0a00a140,0x0655d998, -0x06f8dd58,0x048c7e70,0x026cb138,0x01fca17c,0x019f3330,0x014bffce,0x023faab0,0x01c8b914,0x0100d704,0x01474642,0x009e8bde,0x0090459e,0x00d30f32,0x00bfc10c,0x00cfdfa3,0x005b3b54,0x00ed5307,0x01ab9fe8,0x00b0958e,0x00d84c2e,0x00f02d22,0x00b3a215,0x02cdc32c,0x03add7f0,0x04d19698, -0x03b992bc,0x03ccac40,0x03a38d3c,0x02805eec,0x017134d0,0xff8a0790,0x007bba48,0x0194fca6,0x016a5ffe,0x05ec3088,0x01938bcc,0x05aed070,0x033abb88,0x0351e294,0x02948640,0x022ee2e0,0x01770792,0x01f85eda,0x01859496,0x013f8e8c,0x007c0b86,0x01557858,0x0147feaa,0x010dd2b4,0x00df6299, -0x0133e988,0x018baa4a,0x0109f452,0x004fa37d,0x00a9337b,0xff23f802,0xff3c9799,0x004d9904,0x0317bae0,0x03f0b500,0x03e67ff4,0x023b8330,0x015cfd12,0x01d3bdfc,0x00511637,0xfeb7fe5a,0xfc188794,0xfde45cc4,0xfee2a362,0xfec3366c,0x003a2847,0xffeb7460,0x002a3465,0x01c3cf7c,0x01813180, -0x01bafa98,0x01641eb0,0x0101ae62,0x00a378b0,0x010c8f04,0x00896966,0x019e9ed0,0x007da622,0x0169802c,0x0128b762,0x018b01e4,0x013c9c94,0x017009b8,0x012a6656,0x01a24522,0x0036cf8f,0xff8d60cc,0x004114bc,0xffc81c84,0x003f91f5,0x00ab9785,0x016c432e,0x0177ccae,0x01649380,0x014004fc, -0x00bf0d79,0x00808340,0xffd2d49e,0x00a4db3b,0x011530c2,0x01883bc4,0x01277fce,0x00bcc3ed,0x0176f98a,0x019f25f6,0x0151368e,0x01f24450,0x01e8dc28,0x02031260,0x02152d20,0x01d5e1c2,0x021310a0,0x02b4fef8,0x0229b320,0x01a8c8f6,0x01dc5f24,0x01f23b6e,0x012f5e22,0x015cda34,0x009bd230, -0x01b72a1c,0xff0fe84d,0xff01af08,0xff3e88ec,0xff50d069,0xff79e071,0xff732045,0xff76e997,0xff392421,0xff17c8fd,0xfefdaaf0,0xfee9ab2a,0xfed7bff2,0xfec4e11e,0xff15d69f,0xff70706f,0xffdded6e,0x0058cf46,0x007aeeae,0x0079e3f2,0x0242bcb0,0x02871ca0,0x00e20387,0x021859b4,0x02a29d50, -0x01924d2a,0x01a67950,0x01c00816,0x01701aee,0x01d3b314,0x02012224,0x01ea0ac2,0x02b3540c,0x01c8e2a4,0x01c0854e,0x026a3ab8,0x01c6cb46,0xff709ded,0x001200d6,0xfff336a0,0xfff3f978,0xffef3422,0xfff29f32,0xfffde878,0xfff3083d,0xfff057f4,0xffeed0a4,0xfff17d3a,0xfff71321,0xfff0a20d, -0x001e9781,0x0035b03f,0x0040568f,0x0068bd32,0x00a856f8,0xfee0f76e,0xfe9469e2,0xfedd7380,0xfc9b78c0,0xfd13bca0,0x005c1e67,0xfcfe2f60,0xfcf7b024,0xff3ca961,0xff48e7ed,0xff70336c,0xfff92687,0xffba1c70,0xffca9103,0x003b1e8b,0xfcfdedb8,0xfcf5bca4,0x0056b536,0xfd1542f4,0xfcc2821c, -0xff8c8f5b,0xff2c1de7,0xff1c4f94,0xff2a103c,0xff0db43c,0xfefa24dc,0xfebaca3c,0xfee63534,0xfef1f86c,0xff1543a0,0xfefda1e8,0xfeea872c,0xfeba07fa,0xfe92831a,0xfe6c7cc2,0xfe500136,0xfe563430,0xfd5f4658,0xfdf50324,0xff876a50,0xfedf70a8,0xfedc7140,0xfef52492,0xfefcdec2,0xfee49574, -0xff0534d7,0xfe417934,0xfddde144,0xfe2752e2,0xfee90930,0xfedcccfe,0xff04c1c0,0xff220d54,0xfe16fb48,0xfef857aa,0xfe5aab96,0xfeb24a4c,0xff805224,0xfef4a16a,0xff383d0e,0xfee5e036,0xfeab9936,0xfe1c6afa,0xfe95d33a,0xfed96c06,0xff112f24,0xfeb0adb8,0xfe041d26,0xfd17bcf8,0xfc5bd5b4, -0xfbece768,0xfc1c92b4,0xfc5a37cc,0xfb992d88,0xfdedaed0,0xff1f0781,0xff45c5be,0x003e606e,0xffa85fbb,0xffa06525,0xff8b8fab,0xff4b9f45,0x001853d3,0xfee5e71c,0x001e12b8,0xffabcb61,0x007adacb,0xff99991b,0xff981796,0xff7402b8,0xff6debfd,0xfe8b7fdc,0xff4b5029,0x003cb64d,0xff932a69, -0xffb2e9ad,0xff0f9beb,0xfea66184,0xfd5bb348,0xfe61cc0c,0xfecf9270,0xff48db98,0xfef4a4e4,0xfe185e9c,0xfc88bc68,0xfb4c0ac0,0xfa6909b8,0xfa8cd3e8,0xfb0ca328,0xf7c0c120,0xff3775a3,0x02fd7d00,0x017c4196,0x022c037c,0x017e1a14,0x01351f34,0x00af23d7,0x0087c73a,0x008f6c55,0x00d8e7b3, -0x00cc52eb,0x00ff641b,0x025bfe98,0x00ebfcf0,0x01004d72,0xffd19b43,0x00c91905,0xff26cba7,0xfff66e1a,0x007267a6,0xff613739,0xffe82087,0xff1c9565,0xfe4e31e4,0xfc6ea6f8,0xfe2cb054,0xff6203fb,0x0007a33a,0xfea55572,0xfb8e53b0,0xf7df1480,0xf5861570,0xf451e390,0xf5359120,0xf6e033e0, -0xf72cec30,0xf8732b40,0xfb47b338,0xfea69964,0xffde23cd,0xffa85454,0xfee2c8d0,0x003cefd0,0x01fe5838,0x0206ba68,0x01bd7ab6,0x00ac202d,0x00656661,0x01101084,0x009c9221,0x00b04d9a,0xff34e807,0x00f3574c,0xff911e02,0x0036ced5,0x022554e0,0x00d09092,0x00bf653a,0xfc66c338,0xfbcc68d8, -0xfe20d42c,0xff82bb1a,0x007eb0ed,0x01379f42,0x015ae3c8,0x0290cb0c,0x06647130,0x02d01ad0,0x00fb78c2,0x010948c8,0xf94b0838,0x01df23e8,0xff4de4fa,0xff506663,0x006ce54e,0xfec427bc,0x01422b68,0x023b69d8,0x01c7d0fa,0x01e98806,0x01d8e358,0x0031a411,0x0105e468,0x01408d32,0x02448894, -0x00e3f111,0x00c78981,0x0048a60e,0x00e62b90,0x0016cc58,0xfee9cd74,0xfdfed50c,0xfbf7dd70,0xfb7c4b58,0xfa1b0700,0xf89c1508,0xf60b8ef0,0xf550f820,0xf573b530,0xf6a96300,0xfb316e58,0xfcfd02f8,0xfe567670,0xfedeb0fa,0x0056e694,0x01ba6d6e,0x01e03d24,0xfe6e19f4,0xfccc2de8,0xfda14aa4, -0xfe41949c,0xff287a3f,0xfe937b0a,0x002e6a9f,0x034cb070,0x0102a4de,0x0054c028,0x000825eb,0xff5d27d1,0x006b0412,0x0436bce8,0x00e87386,0xffe22243,0xff592e22,0xff3cdd38,0xfe559aea,0xfe92411e,0xfe2f35cc,0xfc9e4c78,0xfbc2efb0,0xfae0cbd0,0xfb12a0d8,0xfbf063e8,0xfe32ddc8,0x007b0f4e, -0x01c69636,0x030726c4,0x009688a1,0xf9eb7940,0xf4618680,0xf1d48f20,0xf1904e00,0xfa39c5d8,0xf5d91900,0xff1e0347,0x000f34a9,0xfe3fcd9a,0x005fa54e,0xff5c4ed2,0x007f44fa,0x01548210,0x00479444,0x0030d236,0x01583306,0x0042770b,0x00d61430,0x0259a40c,0x002ccbb9,0xff9edbe6,0xff6d4150, -0xffa633a4,0xff7bfe8a,0x001e356a,0x0146c1dc,0x00c1d8e7,0xff9b1463,0x0080fcf7,0x00d0c388,0x0056df18,0xfeddea9a,0xfc4de5f8,0xf859eda0,0xf5992fd0,0xf504c600,0xf8988e40,0xf463e6c0,0xf1795550,0xecc0c520,0xf184ce50,0xf3c85e20,0xf810fb40,0x002ae36b,0xffd3878a,0xff44c352,0x000adf63, -0xffd8c516,0xffc3a1bc,0xfff92b41,0xffe8eb2a,0xffd7a661,0x0037efaf,0x00674f82,0x004b479b,0x0073794e,0x00915ba8,0x00bf9d1f,0xff64da61,0xfeadeda6,0xff15c4b5,0xff20ed30,0xffe86eb9,0x010a337e,0xffff9d07,0xfe5a6dbe,0xfc09aa10,0xfb241560,0xf95ee148,0xf73f0ff0,0xf987fb98,0xfa270450, -0xfa5695d8,0xf7108210,0xf4f75a80,0xf25d3e90,0xf41b77e0,0xfb55de78,0xfc2dade8,0x00981d9b,0xff0201e2,0x00563e8c,0xffc703b3,0x00228a4f,0x007039fa,0x00b76f2e,0x00fa1d34,0x00919584,0x008c073f,0x0076bcca,0x009db50e,0x0035287a,0xff94941b,0xff1fd3dc,0xffb1ae82,0x002af4cc,0x005527f1, -0x003861e6,0xff962348,0xfe783cb6,0xfd62a450,0xfc8fdec4,0xfc5e6e2c,0xfe9ba8e6,0x0075751d,0x018bbb5a,0x0025c582,0xfefec2d0,0xfe6bb77c,0xff8d52a6,0xfedb4a18,0xfbe54ae8,0xfb935c30,0xfddfa378,0xfdd36a78,0xfdbda7d4,0xfe1304be,0xfefb0cd4,0xff1b0df7,0xff92e6dd,0xffabeabd,0xffced5b4, -0xffdf515c,0xff93d3c3,0x001dba96,0x008ddf44,0x008df852,0x00b838c1,0x009c075d,0x008cbf0c,0xffd4c2f3,0xfec97988,0xfe68f8b8,0xfee10218,0xfef5e01a,0xff70e73c,0x000d0789,0x007ea4a0,0x00b87fdf,0xfefd960c,0xfd335884,0xfbb932a8,0xfc6d2934,0xfd55cdf8,0xfdede7d4,0xfdc6403c,0xfdc4a0c8, -0xfddc6c94,0xfdf35fac,0xffa94942,0xff69c565,0x01175c2e,0x00241dbd,0x0045e6a3,0x006a7804,0xfff89095,0x00605ea2,0xffccb931,0xff882328,0xff57b959,0xff132768,0xff5fa5d7,0xff29525d,0xff3f5fe4,0xff5e7089,0xfecbde06,0xff52b069,0xff129030,0xffb8fe4f,0x0018daef,0xffad7a1a,0xff8cd4e4, -0xff51a7c5,0xff398776,0xff6cc97c,0xff765d6e,0xffc35a16,0xffaa6c53,0xff6ca58d,0xfed86df2,0xfe80056a,0xfea3092c,0xfec79418,0xfef561a2,0xff261cc7,0xffbfdc0c,0xffc7c379,0xfe8814de,0xff0ea260,0x014ddaca,0xfe781ff4,0xfefce154,0x010e6808,0x0118f2ca,0x011139d4,0x0130c274,0x01194dea, -0x00fd9530,0x01055fc0,0xfeaff902,0xfe8ea01a,0x00c15383,0xfeb2d3f4,0xfe7ecde4,0x003cf12a,0xffe489b3,0xffd9b533,0xffda0509,0xffcb8bb6,0xffb152e8,0xff80f5fd,0xff707fe0,0xff54fcd9,0xff50d1ed,0xff43eef9,0xff51273e,0xff3f0685,0xff684774,0xff7de3d6,0xff97a758,0xff98af82,0xffe555ce, -0x028da880,0x02181ff0,0x022c3768,0x02a32198,0x01155f4a,0xfd3bfbcc,0x0378b884,0x01ad9288,0xfe11daa6,0xfddb78f8,0xfdc06540,0xfd96e8d8,0xfd7dff48,0xfd7a39e4,0xfd659e28,0x01a784de,0x0374517c,0xfcd12110,0x014ea600,0x030534e8,0x026d1298,0x02309c38,0x0263c73c,0x0243c110,0x024dd2c4, -0x024ddb04,0x025c289c,0x0255feb8,0x0268f33c,0x026eee90,0x02bd2f84,0x02e69cec,0x02f2a958,0x034d1114,0x0344da98,0x02bd1318,0x028f0edc,0x015c80be,0x016985ec,0xff95bcc4,0x021d3c84,0x018a9546,0x01215418,0x01feedbe,0x01dfa282,0x024191a0,0x029b6998,0x024f2908,0x02c55cec,0x0254e06c, -0x029fb9c4,0x01913652,0x0194a64a,0x024dec3c,0x01e7230e,0x006acf38,0x02d2f660,0x027443b4,0x02f4cf28,0x02af54d8,0x02e50fe0,0x02f9849c,0x03243e18,0x031600d4,0x0312c79c,0x03100ad8,0x03db4a98,0x0495c788,0x04cfd800,0x05b77970,0x05145890,0x02efd2b0,0x02447464,0x00353149,0xff4d6a8b, -0x0013daed,0x0061d979,0x008bc38e,0x012754dc,0x0135efe2,0x018733ec,0x010d37b6,0x011c85ce,0x0168fbba,0x01ab6d14,0x014014ca,0x0232b588,0x01c6d13c,0x01e4b3d6,0x0104b39a,0x018dcc8c,0x02319e14,0x0205f844,0x0258c210,0x028a2e94,0x02221e7c,0x0248839c,0x0236eaac,0x026d6eb0,0x021b72e8, -0x027b6ca0,0x02e03eec,0x04a46ff8,0x06268078,0x06449e48,0x085d7b80,0x079472d0,0x02f04664,0x01c24084,0xfbe41dc8,0xfa910bb0,0xfd7c53ac,0xffc68ea3,0xffa47608,0x00e1ae20,0x00ca04ae,0x00afd0d7,0x00d9c68a,0x00d19f96,0x00645f61,0x006bf6be,0x013b25d6,0x01c93258,0x014cd70a,0x00ede314, -0x00d83d11,0x0108020a,0x01ba865e,0x01d15bf0,0x0283e41c,0x03e5d8b4,0x03211c38,0x038202a8,0x03cd4464,0x044eb758,0x041cdbb8,0x03e18f0c,0x03eefbb8,0x070589b8,0x0994bd50,0x0a503ec0,0x0d1e6c40,0x0a818130,0x011fdf7c,0xfe1afb68,0x08ad80a0,0x041b4ae0,0xfe15447c,0xfe15a8fa,0xfe78f6f8, -0xfedb57b6,0xffd63480,0x00170459,0x01255cb4,0x01cff76e,0x01d1c37e,0x0101ad00,0x00dee3ae,0x01b4737c,0x01354b20,0x013ab57e,0x013c5a5a,0x01bbca76,0x02c8ace8,0x03f7bee8,0x004f5e13,0xfe39fef0,0xfc10ab74,0xff595cd8,0xfe98965e,0xf9b86a18,0xfa76e470,0xfb1c1cd8,0xfc815908,0xfdf65c84, -0xffd1762b,0x0213e678,0x013e2e36,0x02b47770,0x05be2250,0x068e5078,0x081cf770,0x031c2198,0x02816b84,0x03c772e0,0x03c61c38,0x02f43144,0x02a5dd80,0x01faf7ca,0x0210d418,0x0223d4b8,0x00ef4c91,0x00c361f5,0x00ff72ac,0x02569b24,0x015f0246,0x015f839c,0x0112f9e8,0x01382d22,0x00ca8e7d, -0x027fa7a0,0x0454ddb8,0x062e54e0,0x086a8c00,0x0571d760,0x044c7fc8,0x055e9800,0x0465d510,0x03ecbc20,0x03887e7c,0x01973316,0x01196c48,0x0231aac8,0x031f79d0,0x03a12a58,0x0533f338,0x07c2c8a0,0x068d4978,0x03bfdc04,0xfece7a70,0xffaa7c8c,0xfe113282,0xfffd0031,0xffca14e6,0x03590650, -0x01150c62,0x00548d00,0x003aa7ca,0x00037ab7,0x0104f1d8,0x03b4d4d0,0x018e922c,0x017ac2cc,0x01325110,0x009c8a9f,0x00a691c8,0x001f3983,0x00e35193,0x00396004,0xffc2e6e2,0x0498a6d0,0x0831e6b0,0x0a5c8a40,0x0a31f9a0,0x083a2df0,0x053748c0,0x044ab648,0x052bb130,0x0a2d15d0,0x09b5cf40, -0x085d8ef0,0x06a2d3d8,0x041a0c88,0x079d2870,0xffe3714f,0xffea309e,0x02c2ad74,0xffb5ccf6,0x01d2a39e,0x00d45071,0x0213dd04,0x00b7c687,0x00a502d3,0x016b4590,0x002edb54,0x00aa5990,0x0293fc08,0x0171f314,0x0107ad00,0x00d2a30c,0x0109473e,0x00a2b66f,0x01fce0ca,0x04f35fc0,0x05df6648, -0x04d93168,0x05948670,0x05362b18,0x044610c0,0x04d24a18,0x0499a410,0x04646e88,0x02ce2c58,0x020108a0,0x016f4d44,0x04c86b48,0x0a66d390,0x13d64b40,0x0b5aef70,0x0c74de90,0x05752660,0xfcc7da98,0xffc7fac4,0x0108ad88,0x001e3f02,0x00ed52fc,0x01beba10,0x00cac664,0x00df64ad,0x008cb022, -0x010a4dbc,0x014c9930,0x013bfc90,0x00f75c77,0x00bd431a,0x008726a7,0x014f46b8,0x00a5bfce,0x017f3cf8,0x0197e35e,0x013f2c32,0x009f53c1,0x00eff949,0x01d14028,0x03170640,0x035ef310,0x051b2eb0,0x08add770,0x07f52d48,0x08403980,0x083fae90,0x07e1c978,0x07e939f0,0x0a4524e0,0x0acdac00, -0x056f5438,0x03c2b064,0xfed025e8,0x01285598,0x00b99eba,0x00dd7463,0x00e7a717,0x00bb63b7,0x010157da,0x00d62a37,0x00d74e59,0x00b3cefc,0x00b70e93,0x009ac84c,0x01561eb4,0x01ad0966,0x0186c638,0x00a8cc01,0x00682f4a,0x012d4428,0x01f95e3c,0x01ee1f40,0x01d5de92,0x01b0fec0,0x01c49e2c, -0x0252e5b8,0x02248d78,0x00efdb11,0xfec022fe,0xff2085f9,0x00cfe650,0x043c5468,0x02c93390,0x02886cb0,0x02843aa8,0x03d97088,0x01b6eee2,0x01082d6e,0x00dae937,0x01eb0db0,0x017c54a2,0x018f9172,0x01833022,0x019f2d62,0x00ed0b9c,0x01143792,0x009b4e4f,0x011971e2,0x008dcd91,0x010e31bc, -0x0076f8d9,0x00767f10,0x000b78b4,0x00461f54,0x00472b2c,0x00bf5cfc,0x006823b7,0xffc46b4d,0xff7c32c8,0xffb417cd,0xffc6b259,0xffa4d379,0x008f407a,0x01bd5a20,0x02e317ec,0x03c195b0,0x03e35e78,0x04410aa0,0x0313e5c4,0x025796b8,0x018b6ce2,0x014f69da,0x01f74766,0x020f8e10,0xff3e81bb, -0x012a83ce,0x008d34ce,0x005a5b62,0x00e6fb19,0x00cc9e8a,0x015aae92,0x01ba027e,0x018494ea,0x022048a4,0x01f1370c,0x02266408,0x0171c8f8,0x015a51c8,0x01f54f20,0x0187b4a0,0x00373752,0x017ddec8,0x01101752,0x01431638,0x011e186e,0x010ba0d6,0x00fdd4e1,0x00da2211,0x01425362,0x0176e61e, -0x01c60624,0x022c300c,0x02d46bc4,0x039f6c80,0x03593ce4,0x0320664c,0x02d26fac,0x0289edc0,0x024aeb58,0x02838c94,0x025e6d8c,0x00f288cb,0xfe5772a4,0x02bd74b8,0x00fcc758,0xfea76a8c,0xfea169ee,0xfe8d02e2,0xfe8ab62e,0xfe66637e,0xfe5b15a0,0xfe4c808e,0x015650fe,0x02cc04e8,0xfe283852, -0x01185f74,0x0245e268,0x021d6940,0x01d87792,0x01e75f0c,0x01d7ab5a,0x01cde000,0x01c08f38,0x01a21bfe,0x01f911ba,0x02424dc8,0x028829d8,0x02c7fb40,0x02eea3bc,0x03358be8,0x02ed5bf8,0x02cf13c8,0x02aa4204,0x0291466c,0x02ee9348,0xfc94b2d0,0xfd0993a4,0xfbfdfc40,0xfe4f79c0,0x01240d9c, -0x05067ee8,0xfd2b8044,0x00cc3a82,0x04b4b450,0x04dad0c8,0x04dc3248,0x049c47c0,0x0514b9a8,0x052fc800,0x054358e0,0x00f86711,0xfda9c358,0x0582b0a0,0x01250308,0xfe6a9b30,0xfbfa57f0,0xfd0c778c,0xfca9be24,0xfc9fffe8,0xfca28a88,0xfc9dfd24,0xfc9b960c,0xfc8bb158,0xfc769ac4,0xfc5bc918, -0xfc2f4e9c,0xfc11f5dc,0xfc12b6dc,0xfbc41660,0xfbdd4030,0xfc7f1afc,0xfc912440,0xfcf0bd6c,0xfc290780,0x0134ec3e,0xfcc230dc,0xfef19d46,0xff8265c3,0xfe57bdf8,0xfef34d34,0xfdb33b6c,0xfdcd5f54,0xfef2d11c,0xfdf634b8,0xfe4c6552,0xfe80b296,0xffe94c39,0xff60d640,0xfe4e404c,0xfe525ea0, -0x01e3d3a6,0xfc70cb14,0xfc89311c,0xfc531a88,0xfbf9bf40,0xfc029450,0xfbfcbf88,0xfc0bf950,0xfbfd2598,0xfbbcaca0,0xfb4b0ec0,0xfac11e20,0xfa56a5a0,0xfa9f3e48,0xfa00f178,0xfacaeb98,0xfc8eed1c,0xfcc33ae0,0xfc822020,0xfc5c5c98,0xfd38e9f0,0xfd620324,0xff57a306,0xff774ca3,0x0002cd3b, -0xffee0fa9,0x007f23c3,0xff855b26,0x0059f12a,0xfef5b664,0x00e25ef0,0xff7afd19,0x00bc0903,0xffa122c6,0xff18a59c,0xff22cd71,0xff1212f3,0xfd8018e4,0xfc31a434,0xfc2d8ef8,0xfb68aea8,0xfb6e57a0,0xfb4f5310,0xfb32b0a0,0xfaee7ec8,0xfa41c428,0xf9804b80,0xf859a9b0,0xf7b3ac20,0xf84e0ff8, -0xf6cb5720,0xf7f0d460,0xfb13d800,0xfbbc0a38,0xfd3f14c0,0xfbd0a800,0xfb332c70,0xfba06580,0xfde3e430,0xfeb5be94,0xffa1c9bf,0x0034e42f,0x004a8c58,0x00b3848e,0x003f4cf9,0x00d5fa09,0x00c66ff7,0x0110cc2e,0x00dc4aef,0xfffa14ad,0xffb8eb70,0xfee42b06,0xffe4297a,0xfd9f8e88,0xfc2b7ed8, -0xfbc4a368,0xfa7c8868,0xfa642140,0xf9fbcb38,0xfa1e25a8,0xf9f62f90,0xf956b5a0,0xf7d5a0a0,0xf5f34680,0xf4c6e880,0xf62a53b0,0xf4f57490,0xf8212e10,0xfd085538,0xfd3504a4,0xfbb01460,0xfdc3a078,0xffdeb839,0xfe1a8cb4,0xffc0c8d6,0xffbf2dd3,0xffd1f37c,0x007a5c72,0x008889b2,0x0095d0ca, -0x00f515d5,0x00b49dc3,0x00ca7496,0x01764998,0x005ffe34,0xffcebaca,0x004f7011,0xfe51357e,0xff205e02,0xfd558ed8,0xfb8c0530,0xfccea2a8,0xfb2068f0,0xfc602b08,0xfcd1f20c,0xfd2bcd74,0xf9f7fc98,0xf76a9b60,0xf5779400,0xf6cd2bd0,0xf777f090,0xf834cf58,0xf3d491c0,0xf3dce7b0,0xf6332f70, -0xfb14f598,0x0558bcd0,0x04d7af80,0x03d9ffb4,0x025fef24,0x0230c714,0x016ffc94,0x01369042,0x01be4c92,0x0107342a,0x0130220c,0x00922f22,0x00520e87,0x009fa3c6,0x01709b20,0x00246d20,0xffbb8c0d,0xff7452f2,0xfef09a5e,0x00bbaf43,0xfdf2e110,0xf9f2b1b8,0xfa8a1500,0xf9cb7e40,0xfc7711c8, -0xfda1beb4,0xfe596460,0xffdfaf1a,0x012fb6b4,0x019c5602,0x00658c9b,0xff44f5ce,0x00d493e1,0xfbc849b0,0xfc445f50,0x01151366,0x03878534,0xff5641cb,0x000a25b4,0x043677a0,0x019cde56,0x0183af18,0x01868dc2,0x01f6a972,0x02edc594,0x00d57a6a,0xffd22c43,0x00599456,0xffebce32,0x00d2d152, -0x02c61de8,0x0094c33f,0xff9091b9,0x00b883b7,0xffcb171c,0xff6e36b2,0xfec111da,0xfee5c60c,0xff4c483b,0xfe13148a,0xfc23c5e4,0xf94b96c8,0xf629cf30,0xf559a710,0xf61b9720,0xf81541f0,0xfa3c2b58,0xf9423460,0xf6edc5e0,0xf4a596f0,0xf7e6fde0,0xfaae0218,0x00011ee6,0xfe305a54,0x01f36baa, -0x018c884e,0xff610588,0x01426a5c,0x007d085a,0x00c0a8f0,0x00e790f3,0x0085bffe,0x0040508e,0x00e84fa5,0xffaaa289,0x002fc90e,0x01ca2136,0x015df966,0x01e157bc,0x0182a4c8,0x00dc58e5,0x01f7bb74,0x00516c1a,0xfde29980,0xfd4beca0,0xfd2f8ea8,0xfcd03fc0,0xfd7970d0,0xff60cc95,0xff9aad78, -0x007250e6,0x013f9322,0x01e316c2,0x00b86386,0xffa65389,0xfa38fe68,0xf6bc1c00,0xf47b25a0,0xfc0cf010,0xf6e44d30,0xff0a8dfe,0x050135a8,0x01612b46,0x008edf3a,0x015dd5f6,0x0109af7e,0x012a6808,0x01128d8c,0x0025e3f0,0x0026c3d3,0x008808f6,0x00d11f64,0x00a226be,0x00afa194,0x007cdb86, -0xffd2f12b,0xff94e0c3,0x00f20b79,0xff8b0b38,0x00304dbd,0x0112b662,0xff0766c7,0xffd07995,0xff22a3a3,0xfd21be88,0xfdee9c4c,0xfde858d0,0xfc153830,0xfbc1c2d0,0xfab36780,0xfa1fd828,0xf80688c8,0xf832b270,0xf97674f0,0xf7dce800,0xfddfb71c,0xff783597,0x03ae1980,0x017e0892,0x017fb81a, -0x00b7834a,0x0014f0e3,0x00dbd9c5,0xff886dfb,0xffb36143,0xffefe995,0x0032c506,0xfffe6f0e,0x0018d0d0,0x003e61df,0x004c14fe,0x00126420,0x0082bf10,0x00dc7b89,0x00791e66,0xfefcd63a,0xfea010e6,0xfe2f8354,0xfd79900c,0xfdf16178,0xff3693d5,0xff66cc90,0xffae605f,0x0022aa20,0xff5c553a, -0xfdecb7e0,0xfbdfd0c0,0xfb70c150,0xfba59328,0xfc214ae0,0xfe503ebc,0xfe2117e8,0xffe367b9,0x00ada3f4,0x00460214,0x018ef7c0,0x01507aba,0x01643eee,0x0126575c,0x01940c0e,0x0077991e,0x00f28585,0xff9cdd11,0x010927f4,0x0035b5f9,0x00a12f35,0xffeb318e,0x002f7aaa,0xfff9701c,0xffdba96e, -0xff29db4b,0xfeefd9f4,0xff663d42,0xff6ade7b,0xff43726d,0xff1f703c,0xff2a385f,0xfedf73ea,0xfeb90326,0xfe8b265a,0xfdf8fc8c,0xfdb9c790,0xfd7a480c,0xfd542180,0xfd255ec0,0xfc91e83c,0xfda85730,0xfe6d74da,0xfe2d16cc,0x01f2ec5c,0xfeb6177c,0xffcbcd4d,0xffc1198c,0xfeb99296,0xfee2cc52, -0xfe22d872,0xfe5917b6,0xff5b6b89,0xfe80c3fa,0xfe6f470e,0xfea56b60,0xffa93d55,0xff97cf24,0xff044d9b,0xff4c68d0,0x0150f052,0xff425dab,0xff8a2f34,0xff771848,0xff7f58f9,0xff8cf81f,0xff85f682,0xff767cb6,0xff277e51,0xfed59402,0xfe8cee1e,0xfe685fa6,0xfe314b5a,0xfdf0a8ac,0xfe148aec, -0xfe44d2a6,0xfe71407c,0xfe7fd682,0xfeb77888,0xfdfd3e28,0x0013038f,0x01efa076,0x041dc500,0xfef7909e,0x0199ace4,0x03d38fa4,0x0412b7e8,0x042d7bd0,0x03fdbdb8,0x04739e60,0x04aa7f28,0x04b46580,0x019cd3f6,0xff3f93e3,0x048e46d8,0x01c2f598,0xfff69644,0xfe641a1c,0xfef6bd74,0xfee06028, -0xfef2ebbc,0xfefbd1d8,0xff101042,0xff36fd15,0xff0fe321,0xfef9b5f4,0xfeddd2fe,0xfeb92b32,0xfe982162,0xfe6aff10,0xfe817912,0xfe8303c2,0xfe89abf0,0xfe82111e,0xfe89089c,0x01d6405a,0x014ceba2,0x02dfba3c,0xfedf4b6e,0xfc240980,0xfa751250,0x0077fb7e,0xfce6c18c,0xfabd9a10,0xfa825430, -0xfa8d0e68,0xfb160718,0xfa95ffd0,0xfa916c30,0xfab09590,0xfce82ff8,0x0012e9f7,0xfa4ff338,0xfc94e0b4,0xfef8d510,0x02e979ac,0x01aaaa04,0x01fd6e5c,0x020495cc,0x01efb156,0x01e6e324,0x01e6cad8,0x01dc1f04,0x01d72e36,0x01c0e4a8,0x01f0179c,0x01f21bfa,0x01b89ede,0x01d355a6,0x01af75f8, -0x01471048,0x017f46de,0x019d98dc,0x01dca3c2,0xfb6e8e48,0x01185316,0xff2a1d71,0xff5ba52e,0x00b95dfa,0x00526e03,0x015b9d76,0x00deb611,0xffa4e195,0x00c4c3fe,0x00e72438,0x008c1915,0xff9a0544,0x000a506f,0xffe86576,0x0052c0c1,0xfc681f7c,0x01fa04f2,0x02847fe4,0x02619fac,0x02b68434, -0x028e7048,0x027ad3f0,0x025017a0,0x01fe6cae,0x01ef3fb2,0x01e05084,0x026cc284,0x02306dfc,0x01234224,0x013dbbb8,0x011dd6cc,0x00acf813,0x0133b67c,0x01c62eb4,0x0164ebb6,0xfe5a34f4,0xffac6d7c,0xfec1f40c,0xff97b9b8,0xfff9e42e,0x00732b49,0xff75d266,0x00dcf67d,0xff8f0f08,0x01b6ffd2, -0xffbd0aa6,0x00fe0857,0x0000ad9d,0x00e547cf,0x0028b7d7,0x000382a6,0xff1b3370,0x01515700,0x03565804,0x02bd3698,0x03865248,0x02e63740,0x02ca3f98,0x02d8c178,0x02828c84,0x02845c54,0x02176018,0x03033c28,0x02b04de4,0x00e85cd1,0x015dd870,0x00c14625,0xfff7c37e,0x008c4f4d,0x035c759c, -0x0131f6f4,0xfe0189b4,0x002f8054,0x00ae9245,0x006a6c06,0x0136ad86,0x0107f4f2,0x00e6d7ad,0x00d1c797,0x019075ca,0x00b4d938,0x014b740a,0x01dda0d8,0x01ba1e98,0x01f32fba,0xff6af708,0x00fc2d98,0xfee964b6,0x01796e02,0x03dcefd8,0x0388e5bc,0x04c871a0,0x042e5528,0x0410aef8,0x03d802a0, -0x02c9b64c,0x0299b2b4,0x029338ec,0x040fa370,0x02b3e088,0xfef6a174,0xfefbd4a4,0xfef7331c,0xff5a1f57,0x0128baa0,0x058ebb50,0x01bed1a8,0xfe958062,0xff190b3c,0xfe108808,0xfe57253c,0xffd09b17,0x00784435,0x012aa4d2,0x0134527e,0x00bb70cd,0x0134b66c,0x0158791e,0x01089b40,0x00dae54e, -0x0128ea5c,0xffe60516,0x00f9f5ed,0xfedc3a5c,0x006f0397,0x041d1f78,0x026039f4,0x021eb384,0x0066eb6c,0xff4ed075,0xfeca3268,0xffb02097,0x00142f70,0xff7d2284,0xffe251f7,0x00964f42,0x02627ed8,0x01c65294,0x00676ede,0xffae8c34,0x01730386,0x0376ee30,0x054e2910,0x05b6e218,0x04ebe088, -0x049d0308,0x020341b4,0x018565e0,0x027014d0,0x01337a76,0x00d4000a,0x00618dd7,0x00784297,0x00d2d8d1,0x0183dfde,0x00eb5c5e,0x008624d3,0xff133a35,0xfee0dc5a,0xfcf003c0,0xfef1d460,0x029e7d80,0x030b1f9c,0x047ecf38,0x047b1188,0x03605ec0,0x007de34e,0xfe111060,0xfc09e200,0xface9b60, -0xfc9072c0,0xfbde67c0,0xfab59a80,0xf9830ee0,0xfe56bd06,0x068df800,0x037207d8,0xfef844bc,0xfe297ab8,0xfd61d264,0xfe5ca76a,0xff5b53d8,0x01b4ddf2,0x02454ba0,0x0324d088,0x00e57a8c,0x004fa90e,0x00d34698,0x0066f6ac,0x01199830,0x01cc98b2,0x01967f14,0x019780a0,0xff9f3eaa,0x0142bf12, -0x00bfc622,0x00a86df9,0xff47d63c,0xfd478df4,0xfd8979c4,0xfdffcd58,0xff2de583,0x006138ae,0x00b27362,0x01bf1248,0x02ec78b8,0x06ece138,0x0aabc6c0,0x0be38800,0x0a298cb0,0x06163af8,0x04a0bef0,0x00bce799,0xff4ef06b,0xfde3fb38,0xff339b15,0x008712fa,0x009b5e97,0x014f9fa8,0x01052822, -0x00ff16ac,0x00b5a158,0x006fd45a,0x00dae084,0x006f8be3,0x00a019a5,0x0112c5de,0x0140e010,0x0152b64a,0x00c554a1,0x00680cfb,0xff5e4831,0x0019a6c2,0x0115be2e,0x0166e584,0x01c4f8e6,0x01cc7644,0x0107f8a6,0xffdd38b8,0x012aec56,0x025e1610,0x02c356cc,0x01ed1db0,0x0180a8ee,0x022fccb4, -0x0284ba0c,0x03913d34,0x04916028,0x003a6888,0x03068bc4,0xfe3a9f90,0xfba74340,0xfe980448,0xff4dcd07,0xff88a8b5,0x006efe81,0x00f362b4,0x00549821,0x00a3a199,0x005ad65e,0x00a86e30,0x00c90309,0x00e9f078,0x0046d4ce,0xfffcd4df,0xffd73d48,0xff9fd205,0xfef244ec,0xff37ea25,0xffc39670, -0xff4af54f,0xff8ca218,0xffcda8eb,0x008cce43,0x01c63548,0x0238591c,0x01ea9186,0x0224157c,0x01740f04,0x01cd7d76,0x03a4309c,0x03591b90,0x02e839e0,0x02ee9d44,0x020d9320,0x00a1b755,0xfe9453f4,0xfda77704,0xff192121,0xff115b7b,0xffc1a797,0x00534e6f,0x0044db44,0x009aa965,0x00a0ad7e, -0x010b8d7c,0x008d5884,0x00ba04c5,0x0142f9ca,0x00d13c1f,0x002bd854,0x00082798,0xffce6cbf,0xffbd2c98,0xff5a28b3,0x01269a50,0x01db641c,0x020544f8,0x02172b20,0x02106f00,0x01ba1b46,0x01744434,0x017bccaa,0x0163af38,0x02ee1e78,0x03da7b58,0x05216ed0,0x030b0698,0x01fc473e,0x01d40bba, -0x008f7975,0x0271d3d0,0x01a5fba0,0x002b1734,0x009b6452,0xffcf1596,0x006288c4,0x008bc94a,0x011a51b2,0x0045eb54,0x00dbed50,0xff8af0c8,0x00e13c11,0xff85cfc0,0xfff78a36,0xffc5cf7c,0x00773c86,0x0069a0bc,0x0077bba4,0x000d31a7,0x01579c3c,0x01d9ab08,0x00d2b4bb,0x009efd55,0x0067fc14, -0x00768b3a,0x0079585c,0x009fa03d,0x00b4c142,0x00aa3d74,0x011facaa,0x0184b8f2,0x0273bf00,0x02225394,0x01dd2514,0x0187afa8,0x01a43614,0x00f4d0c0,0x006710ba,0xfd5c5d7c,0x000e7f2c,0xfed88f1e,0xfed2aedc,0xff767bcf,0xff3cbe48,0x00070db1,0xffef1c93,0xff15e24d,0xffffbf50,0x007d4ff1, -0x00426933,0xff8667cc,0xffd10914,0x0018081e,0x00495aa1,0xfeaddf78,0x00b649ff,0x007c56d2,0x0070fb82,0x007ae8b4,0x005b8719,0x00349527,0xfff71349,0x00b2ee44,0x01684f68,0x0220764c,0x02b079c4,0x03230718,0x038dd1f8,0x02fa25c0,0x0283c534,0x01fd7588,0x0161547a,0x0170ae68,0x01e63e74, -0xff406828,0xfdb8a29c,0xfd35e728,0x001b1202,0xfdf05b0c,0xfd0f4870,0xfce8c8fc,0xfcd74514,0xfd31f808,0xfcbf0068,0xfc8c8964,0xfca97dd8,0xfe0ecb78,0x00295996,0xfcfb219c,0xfe1e3cbc,0xffac55d5,0x02169dac,0x01814628,0x0198880e,0x0188fa1a,0x0184e82e,0x018cf552,0x017a86ea,0x01ad4430, -0x01baa75c,0x01cb7a02,0x01e46b06,0x0203c17c,0x024bc6d4,0x020a35f4,0x01eb5c6c,0x01d3d726,0x01b1c3a8,0x01d2946c,0xfe98ca1e,0xff0d5f11,0xfde9e65c,0x01fd3890,0x039aaf40,0x0302f980,0x00e917e2,0x034b9ad8,0x039147ac,0x03a00e54,0x038fed1c,0x02f85be4,0x036b69c8,0x0369a4e8,0x03270560, -0x035ce158,0x013c774c,0x032ad9b0,0x03586d98,0x01e3a16e,0xfdc0efa4,0xfeb9434e,0xfe85c5ee,0xfe7ebb72,0xfe7bdcc6,0xfe7c2c1e,0xfe97d322,0xfe7c9a70,0xfe6bfe96,0xfe35acea,0xfe6c9a02,0xfe61d2be,0xfe091922,0xfe72801c,0xfeb4dc7c,0xff02905d,0xff00eb10,0xff7e23f3,0xffb0c2f9,0x032da900, -0xffcfa11a,0x01b1d5ca,0x01786688,0x007da6e0,0x00a48533,0xff77f095,0x000e176c,0x0167ea2e,0x00738302,0x001e4a76,0x0077d048,0x0123d990,0x00a207ac,0x00e4402d,0xfffc5d98,0x02da8210,0xff17cdba,0xfe0cf2e2,0xfe52e162,0xfdf29aac,0xfdd938d0,0xfdd1073c,0xfe24e056,0xfddb35b0,0xfdb605b8, -0xfd438e48,0xfde4ccf0,0xfe072fa4,0xfd6614a0,0xfe5781ba,0xfeb2a3e6,0xff5d784f,0xffd18c74,0x00aa9e59,0x0066b858,0x0221a960,0x014509aa,0x01eadfbc,0x01600caa,0x0140ee1e,0x0119e7c8,0x01498f0e,0xffccb1e3,0x01e2f8a6,0xffa19a07,0x017f7016,0x00517d56,0x01aadf6c,0x00ceeb6b,0x00b55af8, -0x0073b448,0x0164122e,0xffce20d4,0xfd8134e0,0xfe33b3a8,0xfdc9c804,0xfdd4d810,0xfdc51c48,0xfe650c22,0xfdc8f1e8,0xfd813c60,0xfc81b6d0,0xfdc78360,0xfd9f7634,0xfbbc5588,0xfdef0f44,0xfef61624,0x01101266,0x0197fd0a,0x03558324,0x02b55230,0x03440118,0x0211b988,0x02a6d8f8,0x02022180, -0x01aa3736,0x01237d8c,0x003ce7c9,0x0060cc2f,0x004147f4,0x00b0bd81,0x00d72746,0x009b9e6f,0x00daf814,0x003e4915,0x010f03ca,0xff4a2923,0x0127ed6e,0xffcb9604,0xfd3f52bc,0xfdb5063c,0xfcf93714,0xfc95a874,0xfc9e7118,0xfdce2700,0xfcf09f78,0xfc52efa4,0xfaff7b68,0xfd153770,0xfd847c64, -0xfb72a388,0xfe743fea,0xffa6f8a8,0x0231c498,0x046fb6f8,0xf937d7f8,0x00204ec6,0x037a07b0,0x0182dc96,0x017b16e2,0x017672ee,0x00927f9a,0x005f4222,0x01c07a06,0x01dcc252,0x00ca9beb,0x012c4218,0x0133651c,0x011e954e,0x01172adc,0x00c4bfa9,0x00ff3643,0xff6bae0e,0x01122f7a,0x008ef865, -0xfe136e2e,0xffbc5349,0xffc0ec62,0x01fbdf36,0x01fb24aa,0x0115a180,0xff1a2c94,0xfe65ebea,0xfd91af6c,0xfe04716a,0xfccfc054,0xfb12e7f8,0xfc236cb0,0xfbd914b8,0xfc9a0a9c,0xfba16378,0xffca68ff,0x00e86318,0x033e5b88,0x02d9d948,0x02230c40,0x01fac83a,0x0132e914,0x02ed3f8c,0x010d2702, -0x00ab66e6,0x002e016f,0x005d3576,0x00d4188f,0x00d42624,0x00a57e13,0x00857544,0x00433e19,0xfffcf30a,0x00b94f4d,0xff6fa0e7,0xfeaa5488,0xfec075e0,0xfbf63ee8,0xfcb033ec,0xfdaeb6c4,0xffbab150,0xff8e8712,0xfef934c4,0xfda9496c,0xfef122dc,0xff48ddfe,0xfdc0a85c,0xff911e82,0x00eeabde, -0x03dd1c9c,0x022e73d4,0x00de3fc0,0x00357c21,0xfee0258a,0xfee1ce14,0xffc8d5d4,0x0187f96a,0x0287906c,0x0266af0c,0x008f094f,0xff74c20d,0x007c1eb9,0xffd4bd46,0x00493803,0x006fd41b,0x01bdd8c4,0x01715df2,0x00271626,0xff5affe3,0xfff7c4f5,0xfec8c124,0xfcf58950,0xfdff880c,0xfe08a426, -0xfc469714,0xfb4eaaf0,0xfc21cc3c,0xfd3ce1d4,0xfe7c6f12,0xff5702b0,0xff066d96,0xff8e6d0e,0x017a0414,0x036adcb4,0x02f292a4,0x047a3500,0x019d7e3a,0x03a17900,0x02190954,0x00b43bd1,0x0176fbe2,0x00c693b7,0x00da061d,0x003c76ea,0x0065dd06,0x011199f6,0x0121e5aa,0x015663f6,0x00e61e79, -0x00f53c4c,0x008d95cf,0x0136f1d0,0x01643acc,0xff9e8bcd,0xff94b1fb,0x00536708,0xff5298d0,0xfea79220,0xff617a16,0xfff7376f,0x0127dab6,0x02c179f0,0x055bef48,0x061c01a0,0x07a888f0,0x099e4700,0x0a28f990,0x07d6d760,0x02e0a1c4,0x0227aff4,0x01bc09a0,0x037a4e08,0x03eb34a0,0x03d8a6d8, -0x04bec3f0,0x034cd940,0x018b58b6,0x017f07c6,0x01aa2648,0x01adf14a,0x01e84cb2,0x01427c30,0x005c1866,0x00bf9614,0x004fcd5b,0x005153d7,0x00c5c267,0x003e1924,0xfff5f1d9,0xffbe8d77,0xfff156b2,0x005f6202,0xffa56604,0xfff22906,0x0076a3a8,0x013bff86,0x0227791c,0x03111870,0x0502e060, -0x04fcc920,0x0528f1c8,0x04cf9e40,0x03d1b77c,0x02bc9dc8,0x016fd60a,0xff8bab72,0xff92d666,0x018aacde,0x03e68ddc,0x009f339c,0x02a82d60,0x01bd3380,0x0175bf5c,0x00c942b4,0x00bbebde,0x0033ea62,0x005cd2c5,0x0029143a,0x001ada65,0xffd636c8,0x009a59d9,0x00e4505d,0x0125ac9c,0x00950e96, -0x00c75817,0x011e8b1c,0x00f6102e,0x006bd6f5,0x0061b2c6,0xffc57eff,0xfff95717,0x00a84217,0x0223205c,0x02913e10,0x01c44dfa,0x00fa24c7,0x0086f8be,0x00712dc3,0x01434b5a,0x00cef351,0xff057a80,0xfe88f3b2,0xfedfff30,0xffd9c9cd,0x005f69b7,0xff93a9ee,0x006faf8b,0x01f5dc4a,0x015090dc, -0x01a2aa0e,0x01486e04,0x00f2d2f3,0x00b7205a,0x0125d8f8,0x00e09dd2,0x01b86262,0x00acf54d,0x00a5950d,0x002e5cd3,0x007e7eec,0x00940e06,0x00db6bc2,0x011fa1d4,0x01d3c846,0x015f9770,0x005e3453,0x005b5cee,0xffa6d90c,0xffcb7b58,0xffdf548d,0x001df61a,0x00a4adda,0x011fd458,0x019428f2, -0x015aa95a,0x0137884c,0x00ff79b0,0x00f93b91,0x00a93f2d,0x001eba39,0x003920fc,0x0079d67b,0x00b13eb9,0x0184136a,0x00350d65,0x00c9ebfc,0x0088a2f8,0x003f4027,0x00209e6a,0x00172236,0x00884ff5,0x0147e0d8,0x01276c96,0x00f9b8d4,0x01761144,0x0185b03c,0x01412498,0x013d91ca,0x00c2ba4a, -0x011cb544,0x00b84347,0x00cc80f7,0x0102d530,0x01197e9c,0x014bebc8,0x01604ad0,0x0171f160,0x014d5526,0x012053ca,0x0109bf14,0x00e01543,0x00c0cfd1,0x009ec5fd,0x00809f13,0x0090ccd5,0x008fdce8,0x00b7f942,0x00469bdf,0xfff2e9b6,0x0245fcdc,0x02e8b6f8,0x01bd3c5e,0x01cdc002,0x02cc7d38, -0x0202c638,0x0220f0c8,0x022bba08,0x01e7c0f2,0x02329f50,0x0259cc28,0x02560db4,0x0314c7ec,0x02012a14,0x0214ff04,0x02ff6ae8,0x0249e150,0x00295821,0x007b9aa4,0x007ca149,0x008300d9,0x007e9afd,0x007d24b4,0x00873d40,0x00740dee,0x00673574,0x0052d441,0x004fb70f,0x00492b2d,0x003f3fe6, -0x004af0e3,0x0049cbfc,0x0043a119,0x003ebdb9,0x00443d21,0xfe8d08de,0xfe78b714,0xfedf1066,0xfc5308c8,0xfc706338,0xff4cd50d,0xfcdb2524,0xfc86e9b8,0xfe7402aa,0xfe56cec0,0xfe69a112,0xfef46d48,0xfeba5b26,0xfec1ba0e,0xff01463b,0xfc7a43dc,0xfcc784b0,0xff3dccbc,0xfc820d58,0xfc6eb728, -0xff48dcb9,0xfed0e19e,0xfecc37c6,0xfed39eca,0xfed0b5fa,0xfeca6a28,0xfeb7d602,0xfea6a75e,0xfe9ef184,0xfeaa437e,0xfea11ff2,0xfe821a78,0xfe2ec180,0xfe143680,0xfdf4f4b8,0xfde50504,0xfe2ed234,0xfddc8ff0,0xfdcb2690,0xfe22f5be,0xfe6d5e0c,0xfe4407ce,0xfe7226c8,0xfea6f4fc,0xfec0605c, -0xfebe95ea,0xfe1723a6,0xfd91368c,0xfe0db74c,0xfeae22d8,0xfe488e4c,0xfe99b1d0,0xfeb76af4,0xfdd2e628,0xfe7e022a,0xfd8086ec,0xfe64558c,0xff141348,0xfe888452,0xfec0d88a,0xfeb7724a,0xfeb5c550,0xfe8d9a50,0xfe75bb98,0xfe63658e,0xfe52fb1a,0xfe17e0d2,0xfd83e8b8,0xfcaebeb8,0xfc6e003c, -0xfc4f4554,0xfc6c822c,0xfcf49ae0,0xfd269034,0xfdf5c8e8,0xfde650dc,0xfe431a02,0xff792435,0xff658875,0xff5ac88e,0xff828c62,0xfee72e40,0xffbb979b,0xfeaf4018,0x001bb9f1,0xff6abc36,0xff74db75,0xff144eae,0xff4d1016,0xff1a3f0a,0xfed04882,0xfdbc1398,0xfed6222c,0xffcf180c,0xff2df3ff, -0xff468d13,0xff36990b,0xff116050,0xfe81adc6,0xfe52a448,0xfe16d8f6,0xfe34480a,0xfde5e268,0xfd1a4eec,0xfbd24b20,0xfae65ad0,0xfa42f2d0,0xfa222910,0xfbd73608,0xfb758618,0xfeb0c26e,0x00709022,0x00630137,0x014f78ee,0x01392456,0x0140882c,0x01311d0e,0x00827cf7,0x003a1030,0x00f54fe6, -0x00e33a6a,0x011fafee,0x01905c4a,0x0138efe6,0x0128f970,0xffbc5775,0x006e1382,0xfea8e686,0xffbb6620,0x002b1cd6,0xfed6a110,0xff158682,0xff204b96,0xfefb74d8,0xfe2428ec,0xfe1535f4,0xfdebb060,0xfde2e43c,0xfcc5d8f8,0xfad4b6f8,0xf8f411b8,0xf7e9c200,0xf7414410,0xf78a8880,0xf9a07ad0, -0xf9de9090,0xf92f31e0,0xf7ad5260,0xfa4dec70,0xfdadc6c8,0xfece6e30,0xfeedcd9a,0xfe86b796,0x008420ab,0x01429aa2,0x00c90070,0x0141febc,0x012a6580,0x0013885b,0x00990e11,0x00e8469f,0xffa8380c,0x0017b07c,0xfe88316e,0xff1eda70,0x01aa3a92,0x018743ec,0x02d87a08,0xff881c94,0xff18e78b, -0x013218cc,0x0168797e,0x012f56ea,0x0072fae5,0xffd4db30,0xff3139b4,0xfd48549c,0xfc9a2434,0xfcbf75f0,0xfe677656,0xfb53b068,0x03e4e770,0x03522154,0x004b4da6,0x00d1960a,0xffc0fc29,0xffbf1f48,0x00b472f0,0x01ff4ffa,0x00da202a,0x004bff6c,0x0014d578,0xfffc7b95,0x00795a6e,0x01338222, -0x0150ebaa,0x00eecd0f,0xff86aa21,0xff994c04,0xfe883264,0xfe2efe54,0xfe1251de,0xfc27e274,0xfb209238,0xfb49f778,0xfb7510d0,0xfbe31d90,0xfc33fd34,0xfdfbb78c,0x0017ba3d,0xff097375,0xfc26cf4c,0xf747fe40,0xf85d3168,0xf83cd308,0xfa702830,0xfeaadc64,0xfe579b10,0xff5ec95f,0xff9a7135, -0x000df6ac,0xffe7acfe,0x02264e04,0x01c2e40c,0x015eec9e,0x000f11b3,0xff627e6a,0xffefe248,0xffd850c4,0x002d5274,0xff157b94,0x00dd18cc,0x00eb6af4,0xfe7f2f56,0xfedbacbc,0xfdabfb38,0xfe418c36,0xfe8fd1a2,0xfe35dcf0,0xfec5867c,0xfe553892,0xfdc299ac,0xfd439b5c,0xfe696c8a,0xffd76528, -0x01090692,0x0295d80c,0x01a1871e,0xfe2ad6ce,0xfde0c410,0xff437aa2,0x01f083cc,0xff5c85ec,0xfa73de90,0xff9e2212,0x01094d1a,0xffb7dfe8,0x003dbe55,0xffc3cf07,0x004cabb0,0x003d3960,0x0155d9f4,0x0158e920,0x00e09906,0x00a19445,0x00d885a3,0xffb25064,0x01045ff6,0x00c9fcfa,0xff184261, -0xff45189d,0xfe655f42,0xff1cf393,0xff4f0397,0xfea1a0a6,0xfe620f9a,0xfd5b0cc0,0xfd8a7e24,0xfec11a0a,0xfeae45fa,0xfe470930,0xfd05a8d4,0xff446680,0xffea1d8f,0x00d2d768,0xfbe7e790,0xf91e10b8,0xf8208ff0,0xf8736520,0xfa3ef958,0xfb2d7330,0xff2b9f8e,0xff684388,0xffbc0f0a,0x00e654d8, -0x00e577e2,0xffef2190,0xfff8841a,0xfff8de9b,0x00140aa6,0xffe9fd2c,0xffe6fa1a,0x001a01a5,0x0006aff8,0x001fe3ed,0x006b3b96,0xffba7d36,0xfef33ebc,0xff49a595,0xfebd9d96,0xfef99104,0x007a7531,0x00088c9d,0xff655cb0,0xfedb5112,0xfd95a274,0xfcc12d0c,0xfade08c0,0xfd34caac,0xfda45244, -0xfdbcedf8,0xfbfa4cf0,0xfb016390,0xfb2fe638,0xfab3c6a0,0xfec17fec,0xfe17bb32,0x00256f0a,0xff5fec91,0xff5efd90,0xff5a9305,0xffcd7858,0xfff8cc4a,0x000616ee,0x00138457,0xffe37121,0x00448782,0x007dd6bb,0x0081beb3,0xffedd685,0xff7169d0,0xff19854d,0xff9b315c,0x002830e0,0xffe16420, -0xffec904b,0xff85317d,0xfe7bc07e,0xfdff2b34,0xfdaf6c04,0xfd97e320,0xfe5526e2,0xff325ca3,0xfff9dab0,0x0036325a,0xffa78c0b,0xfe91fd7c,0xfe415018,0xfe166302,0xfeab7e06,0xfe931f06,0xff23e45c,0xff35cb07,0xfe6c4a24,0xfef6c380,0xff5eb4a1,0xff7c9ab3,0xffb5fc79,0xffc05abc,0x000bc1d4, -0x005ece6b,0x006d058d,0x005d4822,0x006cc6a3,0x000f5ae3,0x003e1d8f,0x002d0154,0x0040c1ee,0x002eb55d,0xffd5dec6,0xfffb2077,0x0038752f,0x005d16cf,0x00aa2589,0x00297abb,0xff8ff201,0xfee617d0,0xfef9ab0e,0xfee044ac,0xfed9c8ac,0xfe37238a,0xfddb4e18,0xfd749208,0xfdcf1958,0xfe099048, -0xfe5fe508,0xfe7e8340,0xfefc7fd0,0xfe9ed094,0x000ed3e1,0xff345210,0xff2f8ef0,0xff85359c,0xff6d3b81,0xff55c446,0xff558f96,0xfeda8974,0xfebee560,0xfe90e07c,0xfee10df0,0xfeb6a52a,0xff6e127e,0xffd1a39f,0xff80ca63,0x0025d0e2,0x00e9d1bc,0x00d6ea2b,0x01222926,0x010571c6,0x0120b434, -0x0133f9e2,0x017b1956,0x01beb292,0x013ca232,0x00b36470,0x002de88d,0xffacd513,0xff30d787,0xfe988340,0xfeb9764a,0xfeb573da,0xfec3eef8,0xfecbee0c,0xfeb04ea6,0xfe92c816,0xfe1667d2,0xfecf23d4,0x014dea58,0xfdf46370,0xfeca7c9e,0x00aee97b,0x00ab82f5,0x00c41004,0x00f7d050,0x00ff3c10, -0x010c62c6,0x012b2ed6,0xfe916c30,0xfdf97158,0x01662296,0xfefaecbe,0xfe858c6c,0xff25c930,0xff28f396,0xff2db337,0xff3997b1,0xff45aea5,0xff41a975,0xff55d139,0xff182227,0xfef9b668,0xfed72e0c,0xfeb93378,0xfe9aebf2,0xfe64d316,0xfe7f925a,0xfe88e62e,0xfe97ae56,0xfe92d0b6,0xfe325a3c, -0x01cefc6e,0x0157bcde,0x019dfcce,0x01eb0356,0x0095f370,0xfd212fd4,0x02a0f4bc,0x010dd658,0xfdef714c,0xfdc253c8,0xfdb03454,0xfd83b900,0xfd7d4d70,0xfd6cddfc,0xfd332274,0x0108f424,0x0296f6e4,0xfcca9014,0x00c05661,0x02354280,0x01d79a4a,0x019f31be,0x01d34bd2,0x01b17a02,0x01c451e0, -0x01cc417e,0x01ee4352,0x01c7307a,0x01cab80e,0x01e2e860,0x01f0c422,0x01fc15d2,0x01eeb03c,0x022eb0f0,0x021aaa00,0x019abe8a,0x01a04c3c,0x0132546a,0x017d2160,0xff2733d2,0x014ba47a,0x01109ffa,0x00b21952,0x016065ba,0x0141aab0,0x01930d68,0x01d91df4,0x019db58a,0x021476c8,0x01ad36f0, -0x01ba579e,0x00fba128,0x01103508,0x01cd2ee2,0x014187a2,0xffde1535,0x024694c0,0x01f9565e,0x0267c3dc,0x021db014,0x02578ad4,0x0260908c,0x029ccb78,0x02303850,0x0237d2e0,0x02aaaf34,0x02e7da38,0x03232a94,0x02fc52d0,0x03999418,0x035b4fa8,0x01f07650,0x01cf9654,0xff8356a6,0xffa90135, -0xffe2473f,0xffff128f,0x00556d52,0x009d29f9,0x00b3e66a,0x00ee4fde,0x00781305,0x0077ffc9,0x00e9ff6c,0x01278062,0x00d4c62d,0x010dd348,0x01145cbc,0x01576266,0x00e5cc8b,0x00f090e3,0x017b079e,0x01bc6778,0x0229b2f0,0x02763644,0x01eb0490,0x0251ad34,0x02567aa0,0x02fa6f9c,0x021dd968, -0x0256dc90,0x02f739e0,0x031bec80,0x0374bba8,0x036f71ec,0x04e936f8,0x048d9a18,0x00ceadc8,0x00740723,0xfe21d8ca,0xfd993790,0xfdf9090c,0xff4eee4b,0x00009e26,0x00aa949e,0x00bb1183,0x00a166a2,0x0073dd95,0x007a3635,0x007adca1,0x00af917e,0x015064c2,0x00f8aa80,0x0150ead8,0x0112bc18, -0x01013bf8,0x00ce9234,0x015b0b7a,0x01d56fa0,0x028f5ecc,0x036f1744,0x028abda4,0x033c71b0,0x039b72e8,0x041c9730,0x02ef2d94,0x02c15d7c,0x03f4d400,0x04c5e5a8,0x059ba368,0x05b30700,0x07b54308,0x06ac9278,0x00cb6a3e,0xff537cc0,0x034be2dc,0x01e22860,0xfdc9deb8,0xfd8dc720,0xfe3d0fca, -0xff493607,0x001cf26c,0xff92d0e1,0x00792864,0x013e1e02,0x00842c34,0x014f6424,0x0124ba44,0x0028c73a,0x010285ba,0x0110d930,0x0085ff96,0x00df2943,0x01be97c0,0x0221b840,0x003586c3,0xffcbde05,0xff87bf13,0x0044dc56,0xff38ae74,0xfd44225c,0xfed1623c,0x003ee427,0x023d926c,0x014a7bbe, -0x016fa418,0x011cc328,0x01fbe8b0,0x0244d368,0x02d08058,0x02537908,0x007784db,0x03429894,0x04d33ae0,0x034bdc5c,0x0220b1e0,0x0130aa62,0x00e75c1b,0x01b22724,0x00b24261,0x004b41c5,0x0067f4bc,0xffd7858c,0x0081ddcd,0x0171b032,0x01a89124,0x01c16a90,0x014e0da4,0x01137b16,0x0022e55e, -0x019df0de,0x02ef40f4,0x036bb1e8,0x04606328,0x03aa6bac,0x0323e724,0x0372e0dc,0x02629b24,0x01bac1ee,0x00faa267,0x021a74cc,0x01461460,0xfe1f21b2,0x01774c12,0x01a33634,0xff400cc4,0xffd2d5bb,0x04292020,0x01113f28,0xfe8b42f8,0xff925cf5,0x01227cc6,0x02fdf12c,0x026b3358,0x010ecf7a, -0x0071540a,0xffa24d33,0x000a3af4,0x000ec588,0x003b6394,0xfea886c8,0x01a58f42,0x022e9f64,0xff79de29,0x0009ac58,0x0020a4af,0xffe52623,0xffdd0e9b,0x0066dffc,0x01348d8c,0x02efeebc,0x0438c280,0x056f5368,0x0354f1a0,0x01e084dc,0x01532790,0x01761188,0x04128298,0x086e9d40,0x0cb962f0, -0x0ec79350,0x0f385300,0x082474f0,0x064b3d30,0x0064996b,0xff7f6592,0x0123e36a,0xffa1e91a,0x013bd31e,0x00f1f488,0x00cb9deb,0x019ed8f8,0x016e254e,0x00e984b0,0x00c9280e,0x00ef6d85,0x00529966,0x01a64456,0x0182c888,0x003cba16,0x005919bf,0xffd886f2,0x0021da5a,0x006600b9,0x00921049, -0x00622b60,0xffbd7480,0xff76d062,0xff8cb7e0,0x014cab4e,0x02c88184,0x036dcd1c,0x04c3a9d0,0x053ab118,0x0345475c,0x05c27fc0,0x07959d08,0x0b065000,0x07f0f0b0,0x08c47040,0x0485ac68,0xff69b039,0x00dc847d,0x0119b4e2,0x0101c944,0x011ef868,0x00cbf2f9,0x009e42d6,0x0089a5f1,0x006a0425, -0x001a7295,0x00285ef9,0x00b6a874,0x008c736d,0x0080453e,0x007d3320,0x0130e7aa,0x00d5afb5,0x00ca809d,0x0053de76,0x00341fa8,0x00cd12de,0x01646d46,0x0243c8b8,0x0370a774,0x031cdc34,0x039a6dfc,0x04aea0d8,0x04e9b790,0x04dc5f90,0x03d6ca34,0x06c573c8,0x082a2200,0x0929dff0,0x08848270, -0x04573610,0x03681b64,0xffb8196d,0x00c05f67,0x004366af,0x00c176df,0x00e42b2a,0x00b8113a,0x00f5285a,0x00b2884b,0x008188f6,0x0079b174,0x009af871,0x005a7f53,0x009e6f1e,0x00d26254,0x00d115ba,0x000de7ff,0xffd2bcd8,0x001ac357,0x00dc05b3,0x00d2049f,0x00590971,0x011b29f2,0x0167536c, -0x01d25f0c,0x00d08637,0xffdcd0f9,0xff1270fe,0xff5a64f2,0x00092e84,0x01026ee0,0x012f9264,0x01b5e598,0x02e7c018,0x03a104dc,0x02289df0,0x01e8a7aa,0x01ac88da,0x01ee16bc,0x014689e2,0x012cc83c,0x00d3b458,0x00c370a4,0x00848fcc,0x00b4d8a4,0x00c438e4,0x00b594e2,0x0036b4a7,0x004d8630, -0x003d3f82,0x00636d8c,0x0064ced6,0x0067d775,0x00d1aa7c,0x005042d0,0x001084ba,0x005fe71d,0x00833c1c,0x0036a069,0xffc0cb65,0xff47b00e,0x000ee78d,0x00d650ac,0x018281b2,0x014e7a7a,0x00f67611,0x00a67ae1,0x0146b1ec,0x01d04e70,0x02480d6c,0x02138bcc,0x010b37d2,0x016229b0,0xfede65c2, -0x00e9c8ea,0x0071fbe2,0x007ee0c8,0x01208d82,0x010e4f0c,0x014fe240,0x014fd1f0,0x0103b376,0x01395d24,0x01021552,0x00e656d2,0x0096e095,0x006b2f9e,0x010d3a18,0x00c96809,0x008b1640,0x007996a1,0x002b4353,0x003fb0ac,0x0026c574,0x001b7217,0x002e3ee4,0x001df61e,0x002962d9,0x001b6044, -0x003f01ad,0x006bbdc3,0x00c3991d,0x00f71e43,0x00ffe0ef,0x00f49d38,0x01023958,0x010a448a,0x009c6915,0x01007730,0x009a8154,0xff8a3974,0xfd9bca9c,0x0122c28c,0xffce267f,0xfe26ff9e,0xfe00143a,0xfdef5f5c,0xfdd7c5f8,0xfdb7f04c,0xfda143d0,0xfd805d44,0xffc4a389,0x00d14fcb,0xfdcbf654, -0xffaa576b,0x00700eda,0x005806fe,0x0053212a,0x004d4308,0x0040ad26,0x00416b5c,0x0037cd2c,0x002e2518,0x0047bafc,0x0061f606,0x0073cd99,0x008bf22a,0x009ccfb0,0x00c16747,0x00b7e1b3,0x00b97cfc,0x00b27d08,0x00c0bc4b,0x008cbb64,0xfdcd5e9c,0xfe2d6164,0xfd6d70dc,0xfe8e784a,0x00849259, -0x03880528,0xfdd54640,0x004b771a,0x0323cce0,0x0338cae4,0x033ff93c,0x0327bee8,0x03790b50,0x0387bbd4,0x038d6238,0x0067eea8,0xfe2fbe04,0x03e55614,0x009a2a21,0xfeaa7a7c,0xfd4f2b38,0xfe10ea5e,0xfdc6dc08,0xfdaf05a0,0xfdc57c70,0xfdcaa084,0xfdcf6f30,0xfdc66f40,0xfdbed050,0xfdd04650, -0xfd8949fc,0xfd6ea38c,0xfd8afeb4,0xfd5aea28,0xfd8b7a44,0xfe18732c,0xfe022dfa,0xfeaa717c,0xfdd063d4,0x00a31e9a,0xfdbb0858,0xff56282f,0xffa82c96,0xfed6325c,0xff460212,0xfe6d5b32,0xfe59f4ae,0xff03c476,0xfe7e2898,0xfeced096,0xfebe45fc,0xffdf17a3,0xff983606,0xfeee5ff0,0xfed775da, -0x015588f4,0xfd6f7d10,0xfdac594c,0xfd75ad74,0xfd017d60,0xfd26fddc,0xfd28bcc0,0xfd4332b8,0xfd374950,0xfd2d965c,0xfd4941e8,0xfc9aee88,0xfc747dfc,0xfcf96fb4,0xfc50e960,0xfcaf3468,0xfe233e28,0xfe66145e,0xfeba6138,0xfd9e6a5c,0xfdac3dec,0xfdffa9fc,0xff8f098f,0xff640632,0xffbeae52, -0xffed505c,0x00033b76,0xff716a77,0xffddd811,0xff37a653,0x006bf1d1,0xff14bf40,0x003c02b0,0xff9f5b4e,0xffa3c60a,0xff43ff6c,0xff4b9cbb,0xfdf4301c,0xfd328bc0,0xfd331eb8,0xfc2df6e0,0xfcae4a98,0xfcbae310,0xfcd5c528,0xfcb0e5d4,0xfc7a69d8,0xfcc96e60,0xfb784ff8,0xfae32258,0xfbf05e58, -0xfa9fbb98,0xfbe30750,0xfed4f3a8,0xfeb29c0e,0x013fe44c,0xfeea91ba,0xfcecb370,0xfd12d8ec,0xff365806,0xff2b7f14,0xffea96bd,0x00a805fb,0x00175338,0x004316b5,0x003b08f9,0x00f5f9ea,0x00e013eb,0x00413a50,0x00b83584,0x003e15a7,0x004f69be,0xff534a30,0x0013b931,0xfe26c362,0xfd4585f8, -0xfcdc5c68,0xfb1cf4f0,0xfb8cc968,0xfb5bb208,0xfbb36de0,0xfb8c2fd0,0xfb9309b8,0xfc091ee0,0xf9f63b00,0xf9d030b8,0xfbc73fa0,0xf9aa5eb8,0xfaf12800,0xff987f0b,0x008d8235,0xf8c43868,0xfc9c92f0,0xfeae6d1a,0xfe0aaafa,0xff491032,0x0005e2ee,0xffb7ce72,0xff98ddcf,0x00446d78,0x0097cc3c, -0x00255436,0x00d910ee,0x00b2f0dd,0x0009cfb3,0x00576029,0xffde1da2,0xff9362a2,0xfe46da6a,0xfea2a9a4,0xfcf22a7c,0xfbabb6d8,0xfcf00500,0xfca51e9c,0xfd62cab4,0xfe394ee2,0xff4d4397,0xfd3fc9b4,0xfca83eb0,0xfc87ab58,0xfba47df8,0xfa56d588,0xf858e980,0xfa95d8c8,0xfbe86408,0xfc5868bc, -0xfa2a8500,0xfe50752a,0xff709689,0x004ab2cd,0xffa12fa9,0xfe12ee92,0xffa3a660,0x00744aae,0x017a02d2,0x0041804c,0xffa4ccf5,0x001e015f,0xffc4cafd,0x0070cdf4,0x00de70a2,0x009f1203,0x005d31d0,0x00159ded,0x000974f5,0x00dee961,0xff49e5e4,0xfc5f5874,0xfc1dd460,0xfbebcbb0,0xfbdeeb28, -0xfc1c71e0,0xfd42a5b0,0xfe33c612,0xfe11fa94,0xfcef9c3c,0xfcc3ab34,0xfd335974,0xfc2228e8,0xfc4881e0,0xfc1f5828,0xfc8404fc,0xfe581206,0x0276a724,0x01826b62,0x00ba31fb,0x00d3ab63,0x024f1504,0x02e11e74,0x02423d7c,0xffa7c067,0xfff571f5,0xff863376,0x00039307,0xffda7f36,0x00070ed3, -0xfeb92ce0,0x01085780,0x01073e38,0xffa7631a,0xff339021,0xfea6d996,0xfe5fe996,0xfeba255a,0xff62f5a2,0xfef9e9d8,0xfce49628,0xfaebf3c0,0xf9874e20,0xf88b1530,0xf923eb40,0xfabd84f8,0xfa863580,0xf88b3be8,0xf51b9990,0xf8338448,0xfb159c50,0xfc4eefa8,0x016aa042,0xfce7f220,0x015bf5d8, -0x00ea5b41,0xff949b1a,0x00706b7d,0x0045187d,0x00edbc5e,0x0071e144,0x0152d31e,0x01059186,0x004b7c1c,0x0071dfcf,0x00ba3f95,0xfff825ce,0x0131b100,0x0150e28e,0x00113d9f,0xffffe5e6,0x002cacdf,0xfec778b2,0xfc8ebec0,0xfbb16750,0xfb865000,0xface9120,0xfada89d0,0xfb9071a0,0xfbb2a8c8, -0xfcfb02dc,0xfe6dad62,0x0043a427,0x004a67d3,0xfe29b0a8,0xfb89ed30,0xf82f9398,0xf47c8230,0xfa135b98,0xf8f76490,0xfe65f66e,0x037b3198,0x0157e8fe,0x0076d78d,0x0146e954,0x00ba1a15,0xffdac6ca,0x0024877a,0xffab40ec,0xffb4d597,0xffb5b309,0xffeec813,0x005153ef,0x00b9598f,0x00b31178, -0x004845f8,0x0032d885,0x006af62b,0xffea4c9a,0x0049658b,0x00b742e2,0x00768047,0x0027c423,0xffe1723c,0xfef6adca,0xff55f353,0xfec3ec9c,0xfd209418,0xfd10b038,0xfb92d1b0,0xf8b28da0,0xf9d40108,0xfaa30030,0xfab8ece0,0xfa0eff40,0xfe291286,0xfef77814,0x01ce367c,0x0028ca14,0x00b568a5, -0x00816a63,0x007fbed6,0x00b827f9,0x003d013e,0x0043861f,0x00499b72,0x002684d1,0xfff94eee,0xffdbe565,0xfff8a27b,0xfffc8a83,0xff9d0880,0xffe2a11b,0x0002137b,0xffefd937,0xfeb40828,0xfe316336,0xfe225150,0xfdbfb3b8,0xfda158e8,0xfdf2ffb4,0xfe623f90,0xff462c12,0x0066b160,0xff665efc, -0xfe1c3b36,0xfb768f98,0xfd56029c,0xfdf1f194,0xfdf4dd94,0xfede89d2,0xfee425c2,0xffcc9aeb,0x006d3db9,0xffc0a1c6,0x006b63c8,0x002d0076,0x002249bd,0xffe2d525,0x005b6094,0xfffafe9b,0x00655a9c,0xffe2ac81,0x008f8dff,0x004c0899,0x0065ce8e,0x002200a0,0x004e6c16,0xffc6ce2e,0xff4d50be, -0xfe8de468,0xfebcb3b2,0xff1dc07e,0xff397bb1,0xffa6a5ff,0x0019766f,0x009e5f91,0xfff551c4,0xff543f8f,0xfedb77f2,0xfe44e2e8,0xfe04ab00,0xfd717190,0xfdeb1c58,0xfe420932,0xfe91e7fc,0xff07fc66,0xfefb1198,0xff341502,0x01af35e2,0xffb677c6,0x00712ab3,0x0067c034,0xffcd63d1,0x0017ac51, -0xff63566b,0xff49fe20,0xff9d4dff,0xff09d221,0xfef6adb6,0xfef59f92,0xff73dc7e,0xff83246b,0xff22eec6,0xff731a81,0x0050b6c6,0xffc91a6b,0x000fb8b7,0xffe551d4,0xffe6ac53,0xffcb1aeb,0xff9c59a8,0xff8ff369,0xff3b89ef,0xfef1d46c,0xfe89e4aa,0xfe250282,0xfdae931c,0xfd303e90,0xfd915314, -0xfde33d70,0xfe434c66,0xfe9a5122,0xfed4df64,0xfe8a9e94,0xff5a1483,0x0073edcc,0x01bb30c6,0xfee73a10,0x004d7a05,0x01b11f54,0x01c53456,0x01c95588,0x01a90b28,0x01d1317a,0x01da3ee0,0x01c72f0e,0x000c0e4a,0xfee8fba0,0x01a88a36,0x002a8026,0xff3ed1da,0xfefd9c40,0xff1e8641,0xff11ef75, -0xff1bb23c,0xff21589d,0xff2ed194,0xff42220f,0xff06b7bc,0xfed8cd12,0xfeafaa2c,0xfe866596,0xfe6339b0,0xfe1dc356,0xfe584af0,0xfe70199e,0xfe8879ea,0xfe9e9bf2,0xfe8bb1fe,0x01f44aee,0x01aa4a32,0x029cc2fc,0xfff81ff6,0xfdc70f70,0xfc0c1eec,0x0108e00e,0xfe5828fe,0xfc590e54,0xfc200528, -0xfc1fbaa8,0xfc6e8fdc,0xfc1bde70,0xfc14e098,0xfc11cb78,0xfe545b12,0x00d2283c,0xfbe58000,0xfe169aaa,0xfffaea6e,0x028848e8,0x01b26e8c,0x01faf110,0x01fb2ef2,0x01fda960,0x01fe1362,0x01ee8fa6,0x0204446c,0x0209c368,0x02249a2c,0x020f2188,0x021935a0,0x02348034,0x022cb8a0,0x020e263c, -0x01af6ec2,0x01e5f772,0x01cf3fdc,0x0228beb8,0xfd681ec4,0x015e7aac,0xffe52258,0xffc9cef0,0x00dbd8fb,0x00af4252,0x01693716,0x012292dc,0x00273f0e,0x011c7b2c,0x011715ea,0x00bf1654,0x0011ef38,0x0076d4ad,0x00a50fa6,0x00c3dde6,0xfdb970b0,0x01c8b5d8,0x0246362c,0x02495b5c,0x0277491c, -0x02806848,0x027d6994,0x02486578,0x0285a8c4,0x02a5d480,0x02dac9d0,0x026a1b4c,0x0247cbc0,0x02659ea4,0x0253bf28,0x020e66bc,0x01360e20,0x01a0933e,0x0280af98,0x01f5a060,0xffa6e651,0x002ab109,0xff6c1d73,0xffc3e4a0,0xffee9fd0,0x00aaa63d,0xffb4887b,0x009f25cc,0xffa66bf0,0x0151b21e, -0xffe245e3,0x00940b6b,0x001019c1,0x00e14ca5,0x009e82c5,0x0042ae41,0xff9582a8,0x00cc753a,0x02ad1afc,0x026bbd7c,0x02e93c88,0x02dba150,0x02f7b8e8,0x02c46c20,0x033644cc,0x0341c18c,0x03c738b4,0x0325e768,0x034dc88c,0x0401fe40,0x03b673d0,0x02fb286c,0x01064b3c,0x01e2f69e,0x02aa2048, -0x028f8258,0x005f36f8,0x00f8870b,0x00fd5964,0x006a1632,0x00b57365,0x0120dd4e,0x009857b9,0x005f6aaf,0x00d14b08,0x00c93e87,0x012591c0,0x009a6359,0x013c87ce,0x01b1cf6a,0x0036fca1,0x010a0522,0xff64dc3e,0x00a586be,0x02ff39cc,0x03162990,0x03cba0a0,0x03faeae8,0x03fb0888,0x038b58f0, -0x041f8b08,0x04786b88,0x0546f108,0x03a1b4bc,0x0346e238,0x03eb1190,0x0345b6d8,0x01dac3e0,0xffbd71a5,0x01169c10,0x01b82d72,0xff59037a,0xfdb7082c,0xfebded40,0xfe2d7c76,0xfef9bef6,0xffb4f276,0xffb83e8d,0x00922e59,0x0101b0a0,0x006a7e2f,0x00f67a0c,0x00e88e22,0x00579dcf,0x0099004b, -0x00931a81,0xff8403e9,0x005fd8e9,0xfec28dd8,0xffeed12d,0x02df3f58,0x0157d6e0,0x01349aca,0x00474d5d,0x005d8c32,0x00efe333,0x01e7bb46,0x01fb0248,0x01dff870,0x017e2df6,0x0215cd10,0x02451cc8,0x04b3a158,0x053f4880,0x030bdef0,0x018300ba,0x001e2c5b,0x015c65ca,0x00203818,0x0052087c, -0xffec24e2,0x00410b37,0x010a90f6,0x017ab8b6,0x00b3fb08,0xffe49fb0,0x003bc021,0x002168b4,0x008cb985,0x00b33e86,0x0145e600,0x01287d7a,0x001f8108,0xffe82f09,0xfe9e6820,0x00768b49,0x02900e28,0x02e410bc,0x04e833e8,0x01bad4f4,0x00033b64,0xff22bc79,0xfe38a87e,0xfe21d670,0xff0fe767, -0xfbf6bd90,0xfb7e1560,0xfbe971d8,0xfcc2ebc8,0xfc7a2720,0xfb7f5298,0xfdd6006c,0x03ac89f0,0x0352859c,0x0114f902,0x01ff2fa8,0x021dc544,0x033343d0,0x01bda7f2,0xffa69407,0x00586fc1,0x005bc621,0x006e3731,0x0067856a,0x00924d8b,0xff5a92b5,0x0170d034,0x0217a8b0,0x0008e922,0x00a496d0, -0xffdeb1c0,0x005e1698,0x004bfa34,0xff567cad,0x00327e18,0x01ca9174,0x037b211c,0x0466baf8,0x04668cb8,0x03acfea4,0x02387cfc,0x02ef7acc,0x044f5e20,0x04246fb0,0x08538b80,0x091b98e0,0x078d8540,0x04cc05a0,0x0159e506,0xfef1af0c,0x000f0846,0x00d341cf,0xfffd98dc,0x012e4bac,0x0169b146, -0x014f6fe8,0x013e44e4,0x00b724d8,0xffeef275,0x00bca1de,0x00c6daef,0xffac6c42,0x010ad326,0x01090950,0x006b4bb4,0x0090d57f,0xff16e714,0xffa5e1bc,0x00922ae3,0x007ccd01,0x00575a49,0xff8e5540,0xfe2f2a7e,0xfc3c18a0,0xfc56b6c8,0xfd234438,0xfeae3780,0xffacc6fb,0x01156a48,0x01ddbf52, -0x05b8f108,0x0790d980,0x081c0bc0,0x0334b33c,0x051eec68,0x009ceaf9,0xfd099690,0xff8aa637,0x00835569,0x006ffcc4,0x009cd9dc,0x0038722e,0x0008b76d,0x0096158f,0x0014036e,0x004b3b0c,0x0084ddff,0x00ce2b6a,0x0107b5d2,0x00f8bac6,0x009f4e2d,0x00dc412b,0x003799c0,0x01403da0,0x0123ad7a, -0x006263d5,0x0095e15b,0x00021672,0x00f124c9,0x02537e98,0x03555b4c,0x03d72840,0x04df41e0,0x02ccb5cc,0x02594774,0x027acfd0,0x048b4d88,0x051e4050,0x051aa318,0x04a1efc8,0x024a020c,0x0058688b,0xfe9e3dae,0x0007e4d8,0xffd5a004,0x0088ccf5,0x0120bc90,0x00f85b5a,0x01472ffa,0x010a5638, -0x0127d446,0x00aaf1f4,0x00a62b07,0x00c5407b,0x00cb06aa,0x00782bbe,0x00107208,0xffa7aaed,0xff7c550d,0xff78e4ed,0x00809b4e,0x00f2bc5c,0x0159d4bc,0x0081bbbd,0xffc8cd4b,0xff4a0430,0x002191aa,0x00a2a20b,0x00f70427,0x011a80fe,0x0205cf80,0x0364c444,0x03743240,0x035d1f2c,0x03414170, -0x02696b18,0x0231245c,0x01663cf0,0x00251e76,0x0087ab51,0xffbcda22,0x001494a7,0x00231c5d,0x006374e9,0xffde034b,0x0094e089,0xffd57473,0x01042386,0x00186115,0x00b3235f,0x004e9fc0,0x00bcc785,0x008b2ee1,0x009bb64b,0x0015e0b8,0x015d75ea,0x01e13a16,0x00f5b732,0x00d38df4,0x011787ba, -0x01879360,0x01c0146e,0x01ea381a,0x01fb1f12,0x02107b58,0x020d66e4,0x01f64138,0x022317e4,0x01d0c428,0x01b093fa,0x01c61e42,0x019f5c2e,0x009c93ad,0x0083b234,0xfe8ab1c0,0x00869b6d,0xffd03d9a,0xffd88894,0x0086cf3c,0x0077dfeb,0x010e1034,0x00e33a73,0x001ab884,0x00bf2489,0x00e92945, -0x00b0ab91,0x001d2e5e,0x00578557,0x00b219b4,0x00b62807,0xff91c57e,0x00df7d91,0x008f0ba7,0x00b037e9,0x00b55be5,0x009cd8b1,0x007905f0,0x00621af0,0x00825dc1,0x00b49b96,0x00eea82d,0x0133bf1e,0x017f5754,0x01c6d02e,0x0196769a,0x015b10f4,0x011af574,0x00d2e739,0x0101a8b8,0x0153f598, -0xffc58e54,0xfe9c8338,0xfdcc01ec,0x007d20f9,0xfed4a378,0xfdbaf754,0xfd8db50c,0xfd77b31c,0xfdaff4c8,0xfd50b018,0xfd24cbfc,0xfd23ff04,0xfed3034a,0x006c870d,0xfd6d1a34,0xfed5eab4,0x0011d796,0x01558354,0x00f4164f,0x01064430,0x00f8fec2,0x00f866d5,0x00fbfaad,0x00f47b44,0x0115caa0, -0x0128408a,0x01376270,0x01443ffa,0x014d5686,0x016a7a04,0x0148de12,0x013d8396,0x0131df56,0x0128a4f8,0x01508b2c,0xfec09060,0xff1def0b,0xfe1bbac8,0x013a7498,0x02df28d4,0x0320a1cc,0x0034ddc9,0x0284d984,0x036c8180,0x03783ac0,0x036a3850,0x02ef4924,0x035e5ccc,0x0361f620,0x032c5e98, -0x02a03e10,0x009fab97,0x035d99b0,0x02b46ce0,0x013c3b62,0xfe0525de,0xfedb85e6,0xfea96e3c,0xfea83aa0,0xfe9cad4e,0xfe9b386a,0xfe9f8868,0xfeb6df7a,0xfeb49248,0xfe9e4866,0xfe7fc25c,0xfe774b94,0xfe76b25e,0xfeb5b602,0xfee1cd0e,0xff21dee8,0xff005e67,0xff0e7775,0xff068d6d,0x02c45cbc, -0xff431079,0x00c767df,0x00b772b2,0xfff46b41,0x005d5c80,0xff5cffff,0xffbf85c4,0x00c6cf06,0x0000b0b6,0xffcf2087,0x000e3287,0x00ce57f5,0x007aeb0b,0x00a56bcc,0x000024a8,0x02718d38,0xfee24ba0,0xfe370d22,0xfe5dafd6,0xfe2b8234,0xfe128fae,0xfe1ac18c,0xfe423c66,0xfe9af3f8,0xfe9de59a, -0xfe63cb08,0xfe11a52e,0xfe0f229c,0xfe402b4e,0xfeed34cc,0xff6f2782,0xffe49726,0xff97fddd,0xff295581,0xff9374ed,0x014981de,0x0043f11c,0x00e05da6,0x007027af,0x00838e2f,0x00c39fc4,0x00cf95b5,0xffa46679,0x01038bb2,0xff595406,0x00fc157c,0xffe37e49,0x011c132e,0x0077b332,0x00b0ca90, -0x00640178,0x00df4a42,0xff48e46b,0xfd9fe600,0xfe0e2220,0xfdd387e0,0xfdac1ce4,0xfdafe3d8,0xfdea7788,0xfe73ddb2,0xfe65ac9a,0xfdda075c,0xfd051a94,0xfcd01c74,0xfd1bde70,0xfe9fc044,0xffb72be9,0x00cfb5e6,0x0030ae9a,0xff59427a,0x001721cf,0x018dc514,0x0013b7ae,0x005d7204,0x005ee089, -0x0050a636,0x00e8f617,0x0007059e,0x00236ac8,0xffda9cf9,0x00b9a132,0x007ba070,0xff871783,0x0040f415,0x001f2b8f,0x0124a446,0xff66def2,0x00941d82,0xfed2a13c,0xfcf9ccdc,0xfd4876f4,0xfcf89988,0xfcbed558,0xfcf2203c,0xfd98e884,0xfeab59ec,0xfeba34aa,0xfdd36de8,0xfca7d33c,0xfc948b00, -0xfd47e564,0xffb82330,0x01b69820,0x03347760,0x01f74c9e,0xfaedb560,0xfe50b266,0x012acac0,0x008c6f79,0x00848167,0x005e3eac,0xffba35b9,0xfffc3fb5,0x005dbb7e,0x00db4fa7,0x0075c9d1,0x009dfc07,0x00b75eba,0x0116b072,0x00a2ed0d,0xfff1c330,0x00699166,0xff0b4e1d,0x005e92d6,0xff5f97f7, -0xfd3b2d68,0xfe847678,0xfe2ea4ea,0xff5d9d7a,0xff6e4f7a,0xfeea2f3a,0xfdfd0a6c,0xfcc751c0,0xfc8f5ac8,0xfbec7d38,0xfc155c44,0xfcac59f4,0xfd7b147c,0xfcb9b4fc,0xfa5d7280,0xfbdfa070,0xfabc6c40,0xfe50b216,0x002bca5b,0xff56fe89,0xfee8c97a,0x009c4186,0x00b6d388,0x00a1c70b,0x00604319, -0xffffd379,0x00260a48,0x00175af1,0x003e85f2,0xffc3047b,0x00861d69,0x00b5d6c5,0x0091bc25,0x00140634,0x00e9aa88,0xfff4c6a9,0xfe50cdc2,0xfe5cab16,0xfcc05af4,0xfd76b160,0xfe282114,0xff52f689,0xffbc3d7b,0x0006408c,0x007e3e49,0xfe169200,0xfe108f7e,0x00336c9d,0x00d5af1e,0x004876c2, -0xfe2f9a72,0xfc5130e0,0x04af1058,0x032c8a80,0x036a121c,0x02e482a0,0x03beba98,0x029b2694,0x020a478c,0xffb20631,0x00963bf9,0x001e2078,0x0037faf5,0x000f0e79,0x004d431d,0xffd50dcc,0x015584a2,0x01396d6e,0x00c6dc29,0xff822d1b,0xffab580e,0xff2cf674,0xfe4e814c,0xff5acfd3,0xff7783a9, -0xfdac874c,0xfc644154,0xfc636418,0xfbd4b220,0xfbd0e308,0xfce27854,0xfa8bbf38,0xfa4af7f8,0xfab2b970,0xff0db7d0,0x01ea4986,0x01ec7ad8,0x04f6e8c8,0x0137b8b8,0x00dec96a,0x0029c007,0x000706d8,0x007099fc,0x00ca798d,0x013a67ca,0x012665c4,0x00f10a6f,0x007c9943,0x0024f58f,0x00882542, -0x0061ce6e,0xff804a09,0x005fcb61,0x00b7f75a,0x00342026,0x00063033,0x009a65cd,0xff2eff53,0xfdc5c8b0,0xfd75eb58,0xfceacd08,0xfcc39f14,0xfd526ba4,0xfe85842a,0xfebe4974,0x00141a7c,0x02f78a28,0x02cdec54,0x02d6c37c,0x00c3a20c,0x02d18890,0x026ed880,0x00278827,0x01dd41d2,0x0020a1c5, -0x02e6217c,0x037e9614,0x01bf66fc,0x0195cb3e,0x01a5e3c2,0x011f357c,0x00cfc1a8,0x00e4c117,0x0083dc6e,0x007cb526,0x0066dec2,0x0092e227,0x00c14992,0x014c5846,0x012a1806,0x0064d44a,0x005f1315,0x014e2cea,0x008ef29e,0x00a70be6,0x011497bc,0x00b1dfb1,0x014764c2,0x0177fcaa,0x016fc45c, -0x0250a71c,0x02e935f0,0x03a8a43c,0x018dce0c,0x0037af68,0xfe94fcac,0xfeccc984,0xff898997,0x007a60a8,0x00989c54,0xffdc6bd8,0x01794920,0x01e89428,0x01476140,0x0120d1c2,0x01210e4c,0x00dac8b0,0x0101b7de,0x00f786fb,0x00ccdc58,0x004e040e,0x00c087cc,0x00b80d15,0x009ebef8,0x00721ce7, -0x0095e4c2,0x00e2740f,0x00a16751,0x00189a2c,0x0068e2f3,0xffee9e75,0xffd03cee,0x00156132,0xff3605e1,0xff46089e,0xffb06083,0xffe780e4,0xffcddc5d,0xffe9ffc7,0xfebfcf66,0xfe3889ea,0xfe11389a,0xfec06fac,0xff97041f,0x00964331,0x00489d36,0xffeab867,0x00b97fa9,0x01ac62b0,0x00f0e9ba, -0x01135a0c,0x00d98f9e,0x00ad301f,0x007fc8f4,0x00d830f6,0x008d57a3,0x014965a6,0x0081deed,0x00ead1b4,0x00a0b428,0x00e7b79b,0x00c09304,0x00ddebea,0x0112b7fe,0x01b13e78,0x0120720e,0x0080776f,0x00d932f0,0x00da355a,0x00eeadb7,0x00dd197e,0x00c09cf9,0x00909209,0x005720af,0x0013689f, -0xfff2f504,0xffd4dd15,0xff88ba47,0xffe1d8a4,0x000d7c61,0x002106d7,0x0054eef2,0xffe50d78,0x0028f75c,0x01301fae,0x004a9c04,0x00eae14e,0x00f0ee90,0x00c8f8d1,0x00ea4da9,0x00b0a7e2,0x00d97463,0x015d8072,0x01068a42,0x00cf7c67,0x010351da,0x0119c90e,0x00b46526,0x00900b18,0x00243765, -0x00cf5999,0xff603307,0xff5939c0,0xff60e689,0xff375555,0xff44e650,0xff46f34a,0xff509c8d,0xff1d8c8d,0xff037cfc,0xfef55c6c,0xfef57d5a,0xfef3ae9e,0xfee948a6,0xff19468a,0xff50869b,0xff8198d6,0xffc7bb90,0xfff558c3,0xffc5d621,0x0139ac66,0x01e35c9e,0x0187ecb8,0x00f1118f,0x01e4ebd2, -0x01cd37f4,0x01e04cae,0x01ee6200,0x01ba3d3e,0x01f8fc40,0x0213d798,0x020e8e10,0x0207ba08,0x00f65ab1,0x01dbb234,0x01cf4cc2,0x01066d7e,0xff8068b7,0xffd90f36,0xffc1992d,0xffc47526,0xffb69bff,0xffa7d0c7,0xffa09a7d,0xffa35541,0xffa73f52,0xffa5f642,0xff9dfdbd,0xff9b9aa8,0xff98e76b, -0xffb185dc,0xffbfe7b0,0xffcd7c08,0xffdbb59c,0xfffcfc45,0xffce7f80,0xffa7b8dc,0x004d9cbe,0xfdc0652c,0xfd27061c,0xfe8f4ddc,0xfe4eb7e4,0xfd56d414,0xfe309ccc,0xfe094b98,0xfe12ccb2,0xfe8593a6,0xfe4538c0,0xfe4c62ee,0xfe7fd270,0xfd56bf08,0xfe364df4,0xfeb09c88,0xfd5f168c,0xfdd04ed4, -0x007828a0,0xffd91a75,0xffe584c6,0xfffaa151,0xffe54de2,0xffde806a,0xffcaed51,0xffe2c88f,0xffe6e7e1,0xffe66489,0xffc50ee2,0xffb0e23e,0xffade11d,0xff925c7a,0xff89d414,0xff98e164,0xff9882b1,0xff84cd8e,0xff4b83b9,0xfdbd60fc,0xff2e5b0a,0xfe6d2ba6,0xfec7b2cc,0xff4e0fdd,0xff713680, -0xffad1fa5,0xff27c53d,0xfe7bfee0,0xff027c9b,0xff67d190,0xff2599f1,0xff1a68c9,0xff6142b7,0xfeefabde,0xff789dac,0xfded865c,0xff9d03ac,0x001c82a7,0xffb5d582,0x00264cef,0xffeb6a6c,0xffe816cc,0xffb7173a,0xffe4ddde,0xffce7f9d,0xff95c142,0xff4337cb,0xff180f12,0xff30f9fa,0xfef4263c, -0xfee361d6,0xff23945e,0xff15c365,0xff4c5bad,0xff55577c,0xfe491dd2,0xfeccba36,0xfecb5bc6,0xff268c23,0xff667fe5,0xfffc8bc2,0xff363656,0xfffe27ab,0xfee4c088,0x0042502a,0xff60a2df,0xfff4e964,0xff48a031,0xffc4ea02,0xffec704d,0xffa7052a,0xfe953652,0xff98991c,0x009057c2,0xffef60c8, -0x008a65ed,0x00025af9,0xffef933f,0xff63321c,0xfff45ea2,0xfff1ad05,0xffc07cd2,0xff3ef48b,0xfecb701e,0xfee1a61a,0xfe062654,0xfdbcfdc4,0xfea7da7a,0xfe92cfee,0xff33e858,0xfef49408,0xfe368c5a,0xfea5cd9e,0xff26da43,0xffa3f0ea,0x0039b21e,0x00fc6b43,0x005e6127,0x002a4c7a,0x00955f70, -0x00b54f09,0x0099de3e,0x009029d8,0x00923ab1,0x010c9628,0x00047e09,0x009378ca,0xfe9c3b20,0xffe324cf,0x00bc6138,0xffa9efd8,0x00e116a0,0x00352b39,0xfffc4284,0xff37909e,0xffca53d4,0xffc7e411,0xff1f95d7,0xfe3d9a7e,0xfd988c40,0xfdf971f0,0xfccb9ec4,0xfc97d278,0xfe33be18,0xfe3ddf66, -0xfdcf314c,0xfc53832c,0xfbfedb88,0xfda8bdac,0xfe4a2612,0xfe568584,0xfedc7904,0xff882410,0xffb58c14,0x004fe2a3,0x006c844d,0x009059b4,0x00c91afa,0x00e6e395,0x0069fe6d,0x007c7461,0x001d0b53,0x00818862,0xfeaf5e8a,0xfec52ace,0x019d5ff2,0x012e59a4,0x0228370c,0xff1bf8e2,0xff3d0346, -0x00ff25b5,0x014983e8,0x0104c144,0x0049735f,0xffcb319e,0xff65018e,0xfefb8b9c,0xfec12a76,0xfe1e026e,0xfcf5f7fc,0xfd15faf8,0xfee9ec78,0xfedb2eac,0xfd6caf88,0xfe6a1de6,0xfea7a728,0x00198847,0x00d626db,0xffb6cf2c,0x000fdd7b,0xffc56285,0x001fb397,0xffec255a,0xffeb672b,0xffc9b62a, -0x00f3a927,0x00f35429,0xffe874fc,0xffa27c37,0xfecfbcd4,0xfefe4350,0xff327bb0,0xfe4b5500,0xfe908352,0xfeff125e,0xfea8bc54,0xfd1e9a08,0xfd6db174,0xfdc7c870,0xfecd48d4,0xfd738528,0xfd7b69bc,0xfe304dd0,0xfdb53828,0xfdd2db7c,0xfe2f180e,0xfdb7eb84,0x032bfce4,0x03989210,0x026b11b8, -0x02ee8888,0x0285fc0c,0x02082014,0x00f70b36,0xffb0115e,0x0071dbd2,0x0056a392,0x0005b86a,0x0031449e,0x006d39eb,0xfff59890,0x00aeb3c1,0x00df4b13,0x001d04ef,0xffddb34a,0xfecd907c,0xff6d5830,0x002c325c,0xff3ea70f,0xfea78484,0xfdbca3b4,0xfdc4d03c,0xfe1bec60,0xff95d427,0x0070f3f9, -0x017a4150,0xfff5eb5c,0xfee3e826,0xfd46b4cc,0xfcec4aec,0xfd466b08,0xfe1cfec8,0x0138026e,0xfc455cc8,0xfee2cdc8,0xffe3a028,0xffe8aeaf,0x008d1ca5,0x00f00493,0x016ea9de,0x0158259a,0x00b382df,0x003ddf5f,0x00258548,0x00383c39,0x0014f344,0xff90ae16,0x001aff66,0x00087fe2,0x002f1458, -0xffe179fd,0xfed9933c,0xff188016,0xff32ff66,0xfe5cffca,0xfdffaa54,0xfd5fb2ec,0xfd2a09f4,0xfcfd4bec,0xfcafc54c,0xfc42787c,0xfc802124,0xfc414858,0xfdfcf814,0x00e3d972,0x0130e5ba,0x0068505a,0xfd31463c,0xfc310dcc,0xfcf5d418,0xfd08edec,0xff0adba9,0x000057a5,0x003949b8,0x007cf76b, -0x007526b1,0xfff2e16d,0xfff57bc1,0x007e5eec,0x00a5ec2a,0x009bfc39,0x009c565e,0x005b1bc0,0x01263810,0x0125145c,0x00c290ee,0xffefc882,0xff452594,0x0023c7e3,0x0029580b,0x001da4fe,0x009777c4,0x00430835,0xffb24b91,0xfeea8cd6,0xff182f09,0xff2598a4,0xff8ea54a,0xff3ac1d9,0xff0b52a9, -0xff65fb1c,0xfe688bee,0xfddd3f24,0xfd66299c,0xfcafd4bc,0xfef58de6,0xfe3bfb6a,0xff4da2f2,0xff4cb3b1,0xffd4917a,0x002d8b0d,0x00c1f741,0x007f52e3,0x0109e9f0,0x010a127c,0x00bf9d84,0x00ae0a7a,0x00a4c545,0x005ed8fb,0x000b25cf,0xffd5c49d,0x0023b35f,0x00509fe5,0x0089aa59,0x007c90db, -0x00c9750c,0x00adf347,0x00412a17,0xff3d7aa9,0xff3c0bec,0xffacee64,0x0033b07b,0x005b1ab4,0x0048eb8a,0xff0d3b47,0xff07cb23,0x0071ab54,0x00533397,0x00480b43,0x004d6196,0xff2d2a0a,0x00305763,0xffb3fee5,0xff2d644a,0xff5decae,0xff3cda61,0xff81957a,0xffc8b402,0x0004f9e2,0xfff61770, -0x003e8b9e,0xfffddcde,0x008c9cc6,0x007b3334,0x00cc7b89,0x0097b03d,0x008e5866,0x0043cc08,0x004bc599,0x001212b6,0x00933728,0x01178862,0x00fbdb6e,0x0144f5f2,0x01148d8c,0x00e9b6a3,0x00ae59d3,0xfffe7429,0xff4c2c55,0xfea83d4a,0xff183b71,0xff564c3c,0xff6d83fe,0xff90c186,0xffce204a, -0x0030edbd,0x00134730,0x002639d9,0x0008d958,0xffe8c672,0x0060418e,0x0022b24c,0x00608569,0x00905968,0x00a7b9d1,0x00b16763,0x005bf450,0xfff854cc,0x000a1a2f,0x003b1309,0x00062f91,0xffe59ef4,0x00021384,0xffbdc9a2,0xfff67754,0xff8191b4,0xffdcae96,0xffda4b9d,0xff9df812,0xff83d43c, -0xff694a85,0xff5d64a3,0xff59e509,0xff95b274,0xffcdfe21,0xffd5fa93,0xffce72bf,0xffb77d88,0xffac9715,0xffd418d0,0xffd8405a,0xffde942f,0xffe3ba81,0x003cc2f7,0x006a88a2,0xff2b83d4,0xff129650,0x00118c19,0xff79722d,0xff28e201,0xffdae3de,0xffcdfab3,0xffd7258a,0x00087dc7,0xffea1f43, -0xffdf173e,0xfff45496,0xff002cbf,0xff5c89aa,0xffe2fe13,0xfefd10ec,0xff37545a,0x0062b4a2,0x002f6602,0x00361618,0x0036ca32,0x003349f7,0x002e4922,0x001e9116,0x001ebf7e,0x0018d14a,0x0021821e,0x001e7265,0x002167d8,0x001a3f4b,0x001b27f3,0x002214af,0x0030ef6b,0x003576fd,0x004738ce, -0x0108737c,0x00cba629,0x00a5d7de,0x01fa10c6,0x01805b16,0xff0b7e54,0x020f0cf4,0x01a8828a,0xffcfce76,0xffb5805f,0xffa16cac,0xff5701f9,0xff6d8a9a,0xff65864a,0xff3c92fc,0x01b4e1c4,0x022b50b8,0xff093072,0x0196d46a,0x022bb8d0,0x00eee62a,0x00ec6c29,0x0101a47c,0x0100cdc6,0x00f388ef, -0x00f536af,0x010b4032,0x01035a98,0x0102470c,0x0103cefa,0x010aaa92,0x0123dc56,0x014a125c,0x016cfcee,0x0162fa34,0x0123f2da,0x00fe9b77,0x007a555b,0x00d28ea0,0x0075036b,0x00c6098d,0x00ddfd46,0x00c6cbc5,0x010c0314,0x0112bc9a,0x00ff0938,0x014f7642,0x01762134,0x0170747c,0x01158008, -0x016b1f7e,0x00f9dfe1,0x00fff0df,0x01ae3b78,0x0135bdee,0x00e9a6c8,0x01aa4700,0x011743c2,0x01675d00,0x0164575a,0x013a2934,0x012ab6ca,0x014b40ae,0x012618da,0x012368ae,0x013270d2,0x01287f40,0x0162be2e,0x01c716c0,0x02425860,0x0227cdc4,0x01603d0a,0x01107596,0xffae0910,0x00140bf5, -0x00c6413f,0x006e0ef1,0x0027d6b6,0x007b9ff0,0x00aed7e3,0x00fe326e,0x00b5ba36,0x003a4c1a,0x00e7a8a7,0x006417f9,0x00b8b1e8,0x012991a2,0x011766bc,0x012eb5ac,0x013e9148,0x01516898,0x01ba91d6,0x01928de0,0x011ae386,0x015b62aa,0x016bee2e,0x011e024e,0x0112c1b0,0x017fdbc4,0x01413488, -0x0135e634,0x01481932,0x0160f272,0x021b4518,0x02fb55a4,0x03fd9c4c,0x038b3fb8,0x0158e4fe,0x0091a0bd,0xfeca9ab2,0xff16d321,0xff44a411,0xff1dde54,0xff423166,0x000c5071,0x004a6cc6,0x00a3b0ce,0x003390ff,0x003de8f6,0x00001651,0x0073234e,0x008f040f,0x006906a0,0x0087385c,0x00ae5abd, -0x015da8f2,0x00e43f0a,0x017e9b1a,0x01c1e82a,0x01815ea2,0x0212e4b8,0x02324504,0x01b8047e,0x01b02476,0x01fe1aa2,0x016800f0,0x013e4f1a,0x0149312a,0x01658e6e,0x0251e9b4,0x03c517ec,0x056dd090,0x04b0be88,0x01138e70,0xffde3843,0x00b6099d,0x01623686,0x01b6b970,0x011bddce,0xffe01285, -0xff86f234,0xffd57d3c,0x008f6209,0x00317684,0x00738ef0,0x00534084,0x007d8e97,0x00c1b2bd,0x013eb63e,0x00c8a882,0x00b3bf70,0x014207a8,0x010fe0b0,0x017da77e,0x0157d2c2,0x002ce4d0,0xffe03820,0xff918597,0xffa73f0a,0xfee7f1ba,0xfdc3d8a8,0xfeb98374,0xff45cc63,0xfee31b1c,0x0079f7b3, -0x0182b894,0x0229b8f8,0x01dfc246,0x017975ce,0x00bf16fc,0x00db6556,0xfd617624,0xfe87d4fe,0xff71eb9d,0xff8cb5c7,0x00ba1b2d,0x01497072,0x00ec0791,0xffab611b,0xffdd94ce,0xffcf50e7,0x003b55c6,0xffe089dd,0xffecec2b,0xffc7a771,0x0125d7e6,0x017b4390,0x012226be,0x00a9c68b,0x0054a32e, -0x00def5cb,0x01a9bdba,0x0242b920,0x029a5734,0x022da0fc,0x021c3208,0x0199f14e,0x01a61f64,0x0084933c,0xff0d8c24,0xfe4866ce,0xff55c949,0x0269ce78,0x0365ac40,0x032e6d28,0x00056a33,0xfe8b3dfe,0x048400d8,0x055d8d40,0x038b60c8,0x030d13ac,0x032b158c,0x01eb6d6e,0x01217598,0xfffd7c7f, -0x00904a26,0x00293728,0x000b54f6,0x0023a3bf,0x00293f3b,0xffe2d0b8,0x0098626c,0x00eb42f9,0x0153cc6c,0x0063c33b,0x008a8ff5,0x00234ae3,0x000b0ec5,0x002bd6c1,0xfface35a,0x0008fbe4,0x00eb673f,0x01b23586,0x0275a7a4,0x01a6bdf6,0x00765ae1,0xfe453320,0xff3692fd,0x03f3a450,0x03426784, -0x03ea3e20,0x0676aa78,0x04b06680,0x036c5ed8,0x002fb96d,0xffbeca92,0x014022aa,0x00d1b2f2,0x01ce82f0,0x0181db9a,0x016b810a,0x007d4eca,0x0018146d,0x0075145e,0x003deb77,0x0023c273,0x0082b656,0x009087d0,0x00a4b09d,0x014d8d08,0x007d93c4,0x0017c8a2,0x00006b0a,0x00004985,0x000ac852, -0x001abfe9,0x00b6f180,0x00d05156,0x0001d59b,0x00ab1938,0x0046a791,0x0092752f,0xff84753e,0x00b33cfc,0x032484fc,0x06e7cab8,0x091d5e60,0x0a0ed730,0x062e97e8,0x060b7d28,0x042e7e08,0x00dc643c,0x0161c1a2,0x0183cf90,0x0104876a,0x00d7583f,0x00f59a38,0x00e4e68f,0x010ffc00,0x018d2cd2, -0x00ea82cc,0x00c8f511,0x00b248c7,0x011f2688,0x0112a0dc,0x00a9aa3b,0x00e8546f,0x00fd1df4,0x00ea6b76,0x008cb93e,0x007092cf,0x004aa07f,0x003ae866,0x00bb8dd0,0x0205dce0,0x02e37400,0x03e19b10,0x0563a068,0x03936594,0x03775ca0,0x048a1110,0x047e4e10,0x04a46178,0x04066da0,0x05377710, -0x01c21854,0x01b1645e,0x00223b18,0x01100ca6,0x01150fda,0x016ab3d4,0x0144c7a4,0x00fa04f7,0x011e46aa,0x00fbefb9,0x00deadde,0x00c30d74,0x00ae39d7,0x005e37c7,0x008564b8,0x00f97185,0x0180dacc,0x010e85ae,0x00bdbd7e,0x00a825a4,0x00ee5948,0x012e1c36,0x01642b4e,0x02d85394,0x035fcba8, -0x03113598,0x023bbda8,0x00e39aea,0xff84f52b,0xff7968be,0x001bb139,0x01a492c8,0x01ac51fa,0x01bed1e4,0x0169317c,0x01b2496e,0x0125f06e,0x00bff3a5,0x01250490,0x0133e6aa,0x00f5ca34,0x00df0a0a,0x00c7a6e2,0x00c9a7a5,0x00a0fb91,0x008f0eef,0x00a29a3d,0x00b77765,0x00c9af59,0x0128306e, -0x00dab568,0x009e5089,0x0042d20b,0x00a77137,0x01434e0c,0x0154df32,0x00f450bf,0x00f08760,0x00a75448,0x008f9a87,0x00745947,0x007ada23,0x00922720,0x00d980b8,0x010e6f9c,0x01818442,0x01b24d8a,0x01ea968a,0x01d0fe24,0x01e4617a,0x02013ef8,0x019799e2,0x016fbf44,0x01b36f5c,0x00766e07, -0x014fbd80,0x01383534,0x0133cf20,0x016d84a8,0x0173ff76,0x0184878a,0x01b5a9e8,0x01b704e6,0x01ca8802,0x01825e0e,0x019047e4,0x01257f50,0x00e54535,0x011442f8,0x009da6b8,0x001b34ea,0xffff79f6,0xffcf2ab7,0xffec5603,0xffebc057,0xffef8130,0xffed2823,0xffe088ce,0x000ecae3,0x003a899b, -0x006f4943,0x00b5f34d,0x010c0c16,0x016e946a,0x0170856a,0x0171ab08,0x0173300c,0x0178aca0,0x0139534a,0x0160e3be,0x01b44018,0x013cb0de,0xffbca184,0x01d85fd6,0x0150b7ec,0x0025e1e6,0x001c56b4,0x001075cb,0xfff167e2,0xffee6536,0xffea22b1,0xffd91a45,0x01636096,0x01aee5b0,0xffb34b84, -0x0115e1f2,0x01552700,0x00ae0782,0x00bfd69f,0x00bfe9f9,0x00b8264d,0x00b7938b,0x00b53b98,0x00a93087,0x00d380a2,0x00f30113,0x0110d6de,0x012554fa,0x013494c0,0x01511928,0x01437a16,0x01431bb0,0x013caa02,0x014a0368,0x01517670,0xfe6cd00a,0xfe912e6e,0xfe4337ee,0xfe609f1e,0xffa66c83, -0x022966a4,0xfe0887f2,0xff841592,0x01ce2f90,0x01d62324,0x01dce1dc,0x01ea93aa,0x020a47dc,0x021bff7c,0x024c3b64,0xff988e70,0xfe3af3ba,0x02953f30,0xffce63ab,0xfe8ea31c,0xfe6011ca,0xfea7a3b0,0xfe72beaa,0xfe782e8e,0xfe701d4c,0xfe6952f2,0xfe5fffb4,0xfe5b1788,0xfe5229f2,0xfe5c4cb0, -0xfe20c66a,0xfe167c96,0xfe43cde4,0xfe1a7802,0xfe2c8a00,0xfe7965e8,0xfe634d32,0xfe7102f6,0xfdeea6b4,0xffec8f4f,0xfe40c90e,0xfee4f814,0xff786409,0xff15d480,0xff5ad1ed,0xfed57f74,0xfe946bc8,0xfeda2322,0xfe853d50,0xfee4e736,0xff0edfe7,0xffa96ad1,0xff923e8b,0xff1409a5,0xff4eaae5, -0x00b75cd9,0xfe6fee58,0xfe7ea812,0xfe28bd90,0xfe152da8,0xfdf55a54,0xfdedd9d4,0xfdeb09a8,0xfdf2caa8,0xfde7bc0c,0xfdfda0b4,0xfd6a5b1c,0xfd4afa84,0xfdc70244,0xfd56b6a8,0xfd933ff0,0xfe61edd2,0xfe387494,0xfe2b08ac,0xfe0acfaa,0xfe3285ca,0xfe8a7e22,0xff1ebfd8,0xff831017,0xffd64fb9, -0xfff6c6ab,0xffe101db,0xff95b50d,0xff82ee90,0xff4302d6,0xfff58086,0xffdc8e59,0x00006d24,0xffba0965,0xfffc15f0,0xffe50bcd,0xffb14851,0xff115aaf,0xfe53af0c,0xfe1145f0,0xfdd3a4d8,0xfdbd9af0,0xfd9e076c,0xfd7254d8,0xfd5b7d58,0xfd14e2f4,0xfd620600,0xfc1c1e94,0xfbd7bb90,0xfce58740, -0xfbe5e210,0xfc8859c0,0xfe65c7d2,0xfde7c3dc,0xfea85016,0xfe30fcfc,0xfde588e4,0xfde4f738,0xfe95b496,0xff642af4,0x00228d42,0x00c97867,0x001c057b,0x000ecbf5,0x00087cb3,0x00835456,0x0057df44,0x00ab8286,0x0059e21b,0x004f9cbe,0x00a88e07,0x0051edde,0x008e7eea,0xff85be26,0xfe5d4e1a, -0xfdac6d18,0xfd11e24c,0xfcc45210,0xfc984ab0,0xfcb82658,0xfcaa1850,0xfcb00400,0xfd24aec0,0xfb19a058,0xfaab1028,0xfc4246d0,0xfaf71ef0,0xfc103b28,0xff05b366,0xfe6fcf30,0xfb592330,0xfd283c94,0xff85a666,0xffc6569f,0xffbf3181,0xff9a173c,0xff651e6c,0x000b2eb6,0xfffe8672,0x000c0053, -0x00212bbc,0x002a21a9,0x007591c7,0x00fa15f5,0x0044d61f,0x001a5a44,0x00896ee0,0xff93dea5,0xff36fa92,0xfe2621ce,0xfd8a7ec0,0xfe51fe3a,0xfea78e80,0xfee13664,0xff04f3be,0xfe884b0a,0xfd9d4f04,0xfd053280,0xfbd8b158,0xfd8dbf8c,0xfda9a55c,0xfcdc0d04,0xfc54a99c,0xfc0456dc,0xfbb7f2c0, -0xfb4b2bc8,0xfd6a6150,0xfd1bcfd0,0xfcb57d64,0xfd8c6bec,0xfedc66e0,0x0028e458,0x008c5c68,0xff712377,0xffc9a8b2,0xffa9598c,0x000ea9d3,0xffea1d8f,0xffdcadd3,0xffe362c0,0x00bac79d,0x00a35a29,0x00286816,0x002f93c2,0x00934ba0,0xff3b41dc,0xfdaea540,0xfd12c770,0xfc44d73c,0xfcfb5edc, -0xfe10b4b0,0xfeb7efcc,0xffd930e7,0xff63b0fe,0xfd2c4888,0xfd173540,0xfcf99170,0xff0abc2b,0xfe4c7c58,0xfe496134,0xfe390868,0xfdf257dc,0x01f2fd68,0x0389e3f8,0x046f5f98,0x037c710c,0x03913804,0x014ce614,0x009007fa,0xffa7a569,0xfff70779,0xffcc4b54,0xffd87a3a,0xffe1ad81,0xffbce135, -0xffcf35aa,0xff6d2885,0xff8b82ca,0x014b6fb6,0xffc4d509,0xff01bbf0,0xfece6772,0xff7aff47,0xff674d06,0xfeb5497e,0xfd5da06c,0xfbd73bf0,0xf9f943d0,0xfafa9720,0xfb48ee00,0xfb1a1960,0xfa6f3578,0xf9053128,0xf9485388,0xf55be120,0xf63116f0,0xf97a20c8,0xff41d762,0xfd36813c,0x00c5aa84, -0x0089a128,0x001cb9f2,0x016c1c5a,0x0109a9ac,0x014ebdf4,0x00d5d6f4,0x000df20e,0xffd649ad,0x00245deb,0xfff4ae4b,0x0009bc95,0x0070b632,0x0032d9c1,0x005da998,0x0130b686,0xfffec58b,0xffeb4481,0xff58109f,0xfdeed8e8,0xfd3842d4,0xfd3e7b3c,0xfd0c0c94,0xfda6dc34,0xfe3cfde8,0xfe485a38, -0xfd68eb64,0xfc8b8b10,0xfb8d3c10,0xfc24a050,0x000e2941,0xfdae2484,0xfc649b94,0xfa807d58,0xfc174f28,0xfab00cf0,0xfe78ce72,0x021a2070,0x00e99059,0x009dfbb5,0x00cec663,0x007b04ff,0x00352167,0x009ea4a3,0x009f1e23,0x011493a2,0x00965e0a,0x0070e932,0x004925e4,0x00b4d8a6,0x00b6a907, -0x008e9457,0xfff62057,0x00132adb,0xff788bc4,0xff631514,0xff8eeb22,0xff2bea57,0xfe69df1a,0xfddaff8c,0xfd37a58c,0xfe031252,0xfe15c9a6,0xfd49b158,0xfe2aaf32,0xfe1fb622,0xfe6ad03e,0xfc13de88,0xfb0557d8,0xfa763c70,0xfabca4f8,0xfd6d168c,0xfe2f649a,0x0092d496,0xffefb36c,0x00ba6202, -0x0091f342,0x009dbd7a,0x00af00b1,0x004ba7e3,0x0058777f,0x009ecca0,0x005a1117,0x0027517b,0x00155136,0x003a536b,0x0062dfac,0x005626d0,0x00c2fd1c,0x00d97cf4,0x00ae1733,0xfff3e989,0xffbd53b9,0xfffb697d,0x009a521c,0x00f211da,0x00fc96fc,0x00b37c2d,0x005de1d7,0xffdb7f75,0xffe74e33, -0xff2d5185,0xfdc7c858,0xfed3273e,0xfeb36608,0xfdb8214c,0xfdc7a538,0xff4767e8,0xff76fa54,0xffbc7368,0xffa38030,0x0029d8b1,0x00202948,0x0048f421,0x0054513f,0x0082e6f3,0x0034eb36,0x00472f9b,0x002f585a,0x00e7955e,0x00deaa5c,0x00aa6aa1,0x000f3c00,0xffc72cb5,0xffccb746,0xffea0554, -0xff743eb6,0xff71fdc5,0xffdc57db,0xfff4dc3d,0xffd9cffb,0xffc1c2be,0xffd4d137,0xff78f6e4,0xff4362c2,0xff0a0e64,0xff0a0fb9,0xff330f2a,0xff3989c6,0xff384f57,0xff326317,0xff566aed,0xff6bd102,0xffea4762,0xffefc682,0x01aa37c6,0x0045284b,0x00aaeb43,0x00ba8989,0x004406d8,0x005fc2d1, -0xfff6d470,0xffe44e51,0x0019a0b4,0xffb9d4fc,0xffb327f1,0xffaed2d7,0x0000dc70,0x001ac74f,0xffaf00ac,0xffd7e157,0x0042e0c6,0xffe8d1dd,0x0036db83,0x001b3f09,0x002e8f51,0x003935f9,0x00464c7e,0x00569322,0x00245c1d,0xffed7ce7,0xffaa99a6,0xff6a017a,0xff1b9062,0xfedb650e,0xff10fb73, -0xff499f3d,0xff7d4553,0xffa5e749,0xffc28c69,0xff9503ca,0xffe980c3,0x00b462f2,0x0218a5e8,0xff77e426,0x008053c3,0x01d783f2,0x01ee1734,0x01f87f4e,0x01f7f562,0x02159a0c,0x02241ad0,0x022c7788,0x005c3557,0xff7b6f5e,0x01efa152,0x0061a9d6,0xffaf1759,0xffb8349a,0xffcea477,0xffc79b95, -0xffd062a6,0xffd59981,0xffdade38,0xffe8423e,0xffcb8989,0xffb96cbf,0xffa73c3f,0xff91429c,0xff7c521c,0xff4d0db1,0xff701e3a,0xff7c6247,0xff8cafa4,0xff9bc299,0xff85b901,0x01b0f354,0x0136c3e8,0x020f7d94,0x00a0eb36,0xfef61932,0xfcebce58,0x0168d880,0xff676f4f,0xfd6b4c20,0xfd3d6d10, -0xfd336f88,0xfd4f8720,0xfd14de80,0xfd119db8,0xfd215238,0xff5e76e8,0x013edb74,0xfce2dc88,0xff36158f,0x00bc1dab,0x02264fdc,0x01874a36,0x01bf4d44,0x01c8488a,0x01c5b808,0x01c13130,0x01b0b586,0x01b0d3fa,0x01b613de,0x01d0b392,0x01c94c72,0x01d2ef52,0x01f16eb6,0x01dc0808,0x01b11424, -0x014373bc,0x015fb878,0x00ed4bba,0x01ba6daa,0xfe4931fc,0x013dee22,0x0000b12f,0x0028999f,0x0100d16c,0x00ceff49,0x0150af84,0x0130145e,0x007fbde2,0x01183fec,0x01049e08,0x012346e0,0x005c9e2d,0x00a6a23e,0x01047f04,0x01196094,0xfef68d8e,0x020009e4,0x0205cd28,0x021e0ec0,0x024bd9d4, -0x02489220,0x0235ed18,0x01ff7110,0x01fcfa30,0x02090a4c,0x024da790,0x023b9444,0x02722afc,0x02c2c4b8,0x02b66c0c,0x023c4518,0x0105ae66,0x00f0e3f4,0x00b4bfe2,0x016d6300,0x002a8631,0x00926ea9,0xff7066a8,0x003e24b6,0x0067483b,0x00bcaf32,0x001e6cb3,0x007afe06,0xffe47df1,0x00c84a9e, -0xfff72470,0x0127fd04,0x006c5ef1,0x0106919c,0x00e06e0f,0x00fbbc26,0x00bf6708,0x018d0bd2,0x0277e668,0x025a0c98,0x02e11a6c,0x02d0fde0,0x02c5a870,0x027e08ac,0x02575190,0x026dd0d8,0x031884d8,0x02f98f90,0x0355a1cc,0x03bc4f98,0x033eec58,0x021cc1d0,0xffda2121,0x0041af69,0x001981df, -0x011add10,0xffed2530,0x008f1311,0xffbeabb3,0x0080e2cd,0x00c3ba90,0x00e04bd9,0x0078d109,0x002b1322,0x003b2341,0x003e8a5f,0x00a469dd,0x012f895e,0x00f76b30,0x0158467e,0x00d00f95,0x01a1b348,0x00c739ef,0x01ab9a76,0x02e2b4d4,0x031b0280,0x03c568cc,0x03c51fa4,0x03a1c2a0,0x0325bd3c, -0x02e1906c,0x02fd761c,0x03e1632c,0x039d1480,0x0451cc40,0x05332e08,0x04a432f8,0x02b19de0,0xff58a5e1,0xff2b5fc3,0x01c3990a,0x002a1c29,0x005e9635,0x00b3d5f2,0xfef08854,0xff48f8c4,0xffe44fb6,0x00309ea7,0x0025bbc6,0x005cf300,0x0042997d,0x003a02aa,0x007dbd7b,0x00ec08f7,0x0086a235, -0x00b095a3,0x00a3eed9,0x012d5e34,0x002b8a85,0x00fa0d71,0x022aceb0,0x00e191fb,0x00c23925,0x0138db28,0x013bdff6,0x004cefda,0x00b8162a,0x01050c94,0x0195711c,0x0365a498,0x03c4de14,0x02c655cc,0x027f1f38,0x01e1c9a8,0x0081ffc0,0x00b9b886,0xffef1a23,0xfef44a3a,0xfea954b8,0xff656c56, -0x0117dcb2,0x00d5b1cb,0x00bd44b0,0xffad4ea4,0x00359987,0x0019b371,0x0036a3cb,0x00236c67,0x000a02aa,0x005377bd,0x012cf60c,0x01397746,0x00e4b25d,0x008a6c00,0xffab18aa,0x009fa753,0x02680820,0x02ed0e00,0x0436c328,0x026c8894,0x015f15d0,0x008297f2,0xff719b71,0xfece2d86,0xfd8759c4, -0xfee88896,0xffd56708,0x013add48,0x00f9023d,0x00a2d2fb,0x00419c4c,0x0084f23e,0x01e396a8,0x02f25340,0x02ebe044,0x02d43738,0x02b9ecac,0x00fda1a3,0x001d9340,0x0003428f,0x001b0649,0x0020a9d2,0x00236e0a,0x0040ea93,0xffea70f8,0x0019a9b3,0xffa07671,0x0051d5ed,0x01cddd3e,0x01289b04, -0x008d7dd4,0x0088a814,0x008c125e,0xffad2bb2,0xffde73de,0x01bbe652,0x03355330,0x0335eab8,0x03e264fc,0x02def8bc,0x003c7899,0x00dd7f8b,0x0221dd78,0x056b4440,0x0308bc20,0x02018064,0x01c8ab9e,0x00b5f8da,0x041c7eb8,0x00a73f67,0x00ae5a5c,0x01b41f64,0x017d0dee,0x01f98100,0x01808784, -0x011b385e,0x00156f39,0xffdbf880,0x001126b5,0x002d9884,0x002a89e8,0x008a9f0f,0x0047fe9e,0x00551ae4,0x018e082a,0x003aa3c4,0xff48afc3,0xffe897fb,0x00b202a5,0x011fb6f2,0x0181d9d6,0x01124398,0x00b95139,0x00073475,0x011c29d4,0x00920ada,0xfe5fb85c,0xfdaa89dc,0xfe74d51c,0x02749620, -0x04e70548,0x07cba128,0x0a919ad0,0x064c1258,0x057995d8,0x01e80984,0xfea82b24,0x00629791,0x0103e0a2,0x0075b8eb,0x00a4c988,0x00e1a24d,0x00e1625a,0x014e719e,0x013d956e,0x00e251a9,0x00b1df44,0x008cdaf3,0x00963ce1,0x009a5a2c,0x00db38d5,0x009cd084,0xfff8a8e1,0x00387eb1,0xffacefec, -0xfef8db1e,0xff05cf62,0xfec2bcee,0xff693bcd,0x00737e33,0x00df80c4,0x016b7d44,0x0260f794,0x03ae1338,0x04f4b610,0x06d0a638,0x06416ca0,0x05292740,0x04588210,0x04c2c418,0x019e599e,0x00d6ebae,0xfef4da56,0x0047ccdb,0x007502bb,0x00e128ab,0x011d2f6c,0x00cf59d8,0x00cc5eab,0x00a81ce6, -0x00ff6dc7,0x009030e7,0x008020e5,0x00a4e46d,0x00f9a942,0x00fe6151,0x00b209b5,0x0093833a,0x008d66af,0x007694b4,0x013f453e,0x01e1d352,0x0267b25c,0x02f28c14,0x02fed61c,0x02fe7ab4,0x026c75ac,0x01c150fe,0x00aac69c,0x0160bcb0,0x022df978,0x03518098,0x028b0628,0x025a4a0c,0x020fe178, -0x01621f2c,0x018f91d0,0x00f1e89e,0x0068cb78,0x00cc2ad5,0x00429fe8,0x00764c38,0x00841fb2,0x00cae8d8,0x0062b4da,0x00a7931c,0x002dcc58,0x00d07252,0x006d5efd,0x00cb1eca,0x00508502,0x004379d7,0xfff3d66a,0xfff3666e,0xffe9ce58,0x0027c978,0x005d6b0f,0x00218772,0x001dfa0d,0xfffb9fb8, -0xffebde64,0xffddcc1d,0x005f9ae3,0x00f1700a,0x01748478,0x01da8d72,0x02025c54,0x024c34e4,0x01efefc6,0x01a4b938,0x017c8d5c,0x0154c66a,0x0130e5d6,0x01330bb0,0xff9f7517,0x00f58ab2,0x0081e772,0x0075fef5,0x00d7a582,0x00bf968d,0x011525f2,0x0124c0e8,0x00c0bc77,0x012bb5e6,0x0130019a, -0x0122d436,0x00b1d4b3,0x00bf0f60,0x01098bac,0x00da2e51,0x00129674,0x00b5e7b6,0x0084e79d,0x009a3bbe,0x00a2dc7f,0x00a723a3,0x00b0ea08,0x00a27c31,0x00dd343c,0x01061de6,0x013ffb66,0x0162894c,0x019c7c10,0x01e63f10,0x01c56eb0,0x01ac80fc,0x0182bfba,0x015a4302,0x013e9a44,0x017c8762, -0x00aa559b,0xffc84e5e,0xfedde86c,0x01073d52,0xffdb118c,0xfee4f79a,0xfed082f4,0xfebea5c6,0xfed4b23c,0xfea11e20,0xfe883c6c,0xfe85bb52,0xffeb098a,0x00fccbcd,0xfe9db46c,0xffd79e11,0x00a9c507,0x013daa20,0x010e157c,0x0118e0b6,0x010f209c,0x010ecb16,0x010e3a9a,0x0109c24c,0x012335f6, -0x01342bf6,0x0144b192,0x016085a8,0x0174e248,0x019205c0,0x0175113e,0x0169fee8,0x0161a802,0x015ba816,0x017d740e,0xfeb84516,0xfee483e0,0xfe371b3e,0x00533d31,0x01e5afbc,0x02cb8fc0,0xff941050,0x019c7102,0x02e8a354,0x02fb2c78,0x02ef47a0,0x02984400,0x02ea9bfc,0x02f6a5b8,0x02f86468, -0x01b4ed56,0xffea322d,0x031def28,0x01db9880,0x0079d872,0xfe3d716e,0xfee200d6,0xfeaaaf22,0xfea4c36c,0xfea4bcca,0xfea00f8e,0xfe99c87c,0xfe996036,0xfe998128,0xfe9e8f66,0xfe95478c,0xfe999386,0xfeb0f57e,0xfeaaaee4,0xfebcc4e8,0xfefeb90c,0xfec1eb02,0xfe99b84e,0xfeb4c756,0x01e15cce, -0xfef2b910,0x000f9f9c,0x0069fe32,0xffc712c4,0x0008d8a3,0xff42d2dd,0xff6ade40,0x001e735c,0xff76407e,0xff7ed20a,0xffe0d340,0x00805bf2,0x004227d4,0x0032701a,0xfff38b69,0x0222c770,0xfef3fa1a,0xfe74e36c,0xfe712538,0xfe328d0a,0xfe36bc7c,0xfe31ac7c,0xfe36c51c,0xfe473a6e,0xfe49a204, -0xfe45159e,0xfe23d25e,0xfe375804,0xfe7ce23c,0xfe830ef2,0xfec404c2,0xff5a0c78,0xfed0573a,0xfe0ebc4a,0xff0caa47,0x004a7ea2,0xffd8185a,0x0021d645,0x0045ed74,0x0071ee76,0x005c3f5c,0x00993356,0xffa545c0,0x005da670,0xff234071,0x0080912b,0x00116ac4,0x00dfc9c0,0x005450d0,0x0076b892, -0x008bc04c,0x00f51235,0xffa7658e,0xfe1b6cb0,0xfe3dc182,0xfdda4a78,0xfde64fa4,0xfdcef710,0xfdbd89ac,0xfdb6087c,0xfdb474f8,0xfdc9a52c,0xfd878df0,0xfdb1918c,0xfe3635f2,0xfe4170e0,0xfecd2b2c,0xffc70432,0xfe8681d2,0xfd9a9114,0xff5677f8,0x002f95d5,0xff37f11c,0xff44753e,0x004583b0, -0x0069e9fc,0x009bbf56,0x001ef714,0x0002a946,0xffaa0485,0x00374d91,0x0031be40,0x00801ae1,0x0052e5fe,0x002d6813,0x01365c40,0x00573916,0x01649d70,0xffcd6e27,0xfdee3110,0xfddd8fe0,0xfd21961c,0xfd1eb088,0xfd11352c,0xfd467f68,0xfd7bab10,0xfd953c04,0xfd56e604,0xfcc19de4,0xfd3db920, -0xfe29b49c,0xfe97bb5e,0xffa3d75e,0x010a36da,0xfefe956e,0xfbbceeb8,0xfd83f204,0x01bee6d6,0x016731d0,0x0049e7f9,0x003e170e,0xffd3e48c,0x0039ae40,0xffcb33fa,0xfffb4644,0x00402a23,0xffeea92e,0x002ac454,0x00f9c951,0x007bb6c4,0x0014461f,0x0098bd6a,0xff7631aa,0x0074d327,0xffa41603, -0xfd73d3e0,0xfe434e9e,0xfdc11e20,0xff993ecb,0xff9184aa,0xfe964d2a,0xfcd89464,0xfc5d06ec,0xfcf06978,0xfeb46cac,0xfe6b51fa,0xfc8409c8,0xfc598874,0xfbb43218,0xfb0dfd90,0xfc1747c8,0xfdbb6f00,0xfd0e6524,0xfe362358,0xfe6e1f96,0xffb0be9a,0x003d29c8,0x0017355a,0xffb249f5,0xfff3fa75, -0xfffe5a9b,0x000e6d5f,0x000b34af,0xfffdf1e8,0x000fb93b,0x002622f0,0x005198fd,0x0114a658,0x009da115,0x0139fcf0,0xffc421ad,0xfe56cbfe,0xfe5dc6b2,0xfd2c47bc,0xfda0df80,0xfe32cf24,0xff7188e1,0xff3575e7,0xfed2acfe,0xfdfa2d14,0xfe951aa4,0xffe82907,0x01d6ba98,0x00e8b140,0x01036d64, -0x01b1a104,0x00081354,0xff3b521a,0x00eaefc7,0x03841810,0x029a1fb0,0x02b0ca3c,0x004d3f25,0x001ac6b8,0xffdcfbfa,0xfff57e3b,0xffd15514,0x00130474,0x0006bcba,0xffa84ec2,0x00402c63,0xff9426cd,0xffadb80b,0x01ed71c6,0x0024417a,0xfff77159,0xff5d3cb8,0xfec8dff6,0xff7bc917,0xff7b13b5, -0xfe8be670,0xfd81178c,0xfc8a0bec,0xfb84fff8,0xfb60c9c8,0xfba11f50,0xfb806b38,0xfa730f38,0xf9d53f70,0xf8b9ffc0,0xf8b2cbf0,0xf87b4098,0xfce83c7c,0x02d3d728,0x028995dc,0x017d1a0a,0x010fa410,0x021568bc,0x0147a108,0x0117679c,0x00a4606d,0x000f71ba,0xfff6eaa7,0x00092485,0xffff43de, -0xfffb1561,0x006047f0,0xfffbe8c8,0x0033e730,0x010b28d6,0xff9ded0c,0xfffda958,0xff4447f9,0xfe1dd886,0xfe120970,0xfdfed23c,0xfe261b38,0xfece2176,0xfff65b00,0x00a23d84,0x00a604cd,0xff5d28f4,0xff202f00,0xfe902cbe,0xfea0f4e2,0xfec799be,0xff4b80c5,0xff9c0911,0x029a8a78,0xfdf22ad0, -0x00fd8476,0x02fa88cc,0x0161e5fe,0x01330cea,0x0127112a,0x00f07a24,0x0133916c,0x01434638,0x00da7506,0x00e8b047,0x00c9dc37,0x00a67a1c,0x0044bbc4,0x00636068,0x007bd529,0x00a37d1d,0x003b0e70,0x0079ee68,0xff62168b,0xff32e3a2,0xff3ee162,0xfe96dab4,0xff378de6,0xff3cced4,0xff0052d8, -0xfe7ef4ac,0xfe627c26,0xfe2245ac,0xfffee936,0x00e79d26,0x00ff2db5,0xffdf139c,0xfee4a2b0,0xfdd16630,0xfe4410a2,0xff60a03e,0x0081a464,0x01bbfd40,0x01283a4c,0x0173aa72,0x0110e7b6,0x00984ed4,0x008f57b8,0x001a983a,0x001768a6,0x001507c0,0x005abe8b,0x0055c102,0x0094a393,0x00b3a093, -0x00b8b8a1,0x0081e456,0x00ac0839,0x00954006,0x00bf9679,0x005d0eb8,0x00708aff,0x00d0dcc2,0x01038680,0x0121443c,0x016a172e,0x00ec6aa3,0x010bdc62,0x016c37d4,0x00fcd000,0x002fb3dd,0xfef02a2e,0xfeb46444,0xff027a0b,0xff5c7a82,0xff930596,0xff1c9c50,0xffcb82a2,0x00bc20d8,0x005f76eb, -0x00d3f7b2,0x00a61020,0x00ac2640,0x009a31ec,0x00e64dc4,0x008b9285,0x00f8d3fe,0x0042628b,0x00c0f278,0x00575e04,0x007cf9ee,0x003f75a5,0x0064d320,0x001c9104,0x000c7847,0xff52e426,0xfefeee94,0xff312189,0xff1db75d,0xff399234,0xff492a48,0xff66961c,0xff6c3a2e,0xff6dbdfb,0xff7ddb69, -0xff6a8747,0xff7002ee,0xff465009,0xff6cf8db,0xff5bd55c,0xff2e7ddf,0xff571084,0x002eda5b,0x004d6eaa,0x018d99da,0x004df398,0x00cce798,0x00b8524c,0x004e41dc,0x005ba9cc,0x000fa469,0x003596bb,0x00b7ce87,0x0060cef2,0x00456b95,0x0076483c,0x00b8101f,0x007eb735,0x004752fa,0x0026bbf4, -0x00c95e75,0xffec0193,0x00216621,0x002af25d,0x00305f2c,0x0042e6f3,0x004a76dc,0x00524e8f,0x001fc379,0xfff15d17,0xffc07a76,0xff8cea4b,0xff588e37,0xff287cf2,0xff5a045d,0xff984c4d,0xffd10f67,0x0015617a,0x000ee1a9,0xffe31fae,0x00dd018f,0x018d9016,0x01cf7158,0x0076b169,0x016c94ee, -0x01dead20,0x01fd5a20,0x0208ad18,0x01e580b0,0x02200d50,0x023b5bcc,0x023c8108,0x017a195a,0x00804d30,0x01fab99a,0x01627d14,0x00a6aa02,0xffc3c34e,0xfffc9570,0xffed1965,0xfff2a479,0xffee1626,0xffec51b5,0xfff4d7c4,0xffdf8583,0xffd4499c,0xffca55a6,0xffc46f94,0xffc1673a,0xffb00131, -0xffcbbc6b,0xffd6cefb,0xffe3847b,0xffec05df,0x00123e5d,0x008e3865,0x0056ca98,0x012700fc,0xfed238b0,0xfdca5094,0xfe01b602,0xff814206,0xfe198678,0xfdecbd38,0xfdcf2014,0xfdd1ffcc,0xfe21e44a,0xfddf58b4,0xfde5c294,0xfe1a3566,0xfe104ede,0xff50706e,0xfe1ca308,0xfe0c529c,0xfedf93ce, -0x0120b7f8,0x0082e987,0x00999665,0x009d230b,0x009ddb6a,0x0097164e,0x007ddb76,0x00833d8f,0x00890520,0x009c01d1,0x0095961d,0x00926603,0x00a1449c,0x00648c78,0x0050e6bf,0x0055e6f4,0x005b1e54,0x0051a364,0x00742ddc,0xfde1889c,0x000d4057,0xfef61e6e,0xff6d5ed1,0x001134c5,0xffeb7cef, -0x00594989,0xffee62af,0xff2f2f4b,0xffb7351e,0xfff8df1e,0xffde89c9,0xff9782b4,0xffe3c0e3,0xffb228e2,0x00253db9,0xfe719dd6,0x0084cbe6,0x00d85830,0x00946c87,0x00ca193c,0x00d033e1,0x00c9ba7e,0x0085dfcc,0x008c9f88,0x009114f1,0x00a9165c,0x00a8f22e,0x0090d867,0x008a870f,0xffe74778, -0xffae3faa,0xffe86141,0xffeb0fcc,0x003a99ae,0x0066026c,0xfedeb704,0xff87a789,0xff036d1e,0xffc0f96d,0xfff59de8,0x0020716c,0xff9fbb80,0x0034a7b9,0xff251e9e,0x00559021,0xff6df6b5,0x0051a558,0xffbe7133,0x00428a01,0x003cd6b5,0x0039910c,0xff8f62a6,0x0072e074,0x01408dc4,0x00bc1010, -0x010dcb96,0x00f64742,0x00dc5f77,0x0035805b,0x00653ac8,0x00818f71,0x00e2e3e2,0x00dae367,0x00a5f0c1,0x00c62ffb,0xff3e4226,0xfed26cb0,0xffc5a72f,0xff85f9c7,0x001b84b8,0xffd5e00d,0xfe80875e,0xff1bbc5f,0xfefafd66,0x002c1e4f,0x00a0322c,0x00b9544b,0x00841e89,0x001b5bcf,0x00462863, -0x002641a9,0x006e58be,0x011e19b0,0x00bd5505,0x012a0bfc,0x00793ce5,0x0168e362,0xfff0affd,0x00cd7d27,0x01686ea2,0x00b46189,0x0158e814,0x01502ec0,0x011d0d7c,0x0033949f,0x006f891f,0x00aed30b,0x00f2a65e,0x00c882e5,0x005ba883,0x003cbbff,0xfdf38ddc,0xfd5db524,0xff17ae76,0xfef88908, -0x0064c90b,0xfd5f9f14,0xfe9da7ae,0x0005de6b,0xfecba3ba,0xff2643c6,0xffb03785,0x002d2acb,0xff859049,0xffa78d67,0x0052013c,0xfffd08e2,0x00331841,0x009b01cf,0x0085b2b1,0x00ae7038,0x001b0b14,0x00abd4fc,0xff6c83f0,0x001f1619,0x0248bbd4,0x017a0152,0x01b5cb12,0x0055c10f,0x002f9362, -0x0051ed78,0x00475ed3,0x00e03229,0x0153b6d8,0x02bc4e80,0x02908410,0x009c22ad,0x009beb13,0xffdc0253,0xfed0986e,0xff2ab3d3,0x014c858c,0xff03ce93,0xfda3e380,0xfebd9696,0x005d39b0,0xffc6fb3c,0xffe48b86,0xffabf342,0xffdde7bd,0xffd41a2e,0xfff99a88,0x00040652,0xfffafd07,0x00431b89, -0x004b0ae0,0x006905f1,0x00de0ff1,0x005fe5f3,0xff70b351,0xff8346b7,0x0044a378,0xfff8724e,0x00ce3696,0x005d9589,0xffc883f1,0xfefdd310,0xfdff0398,0xfe11b004,0xfeffeff6,0xff606a97,0xff006b93,0xfdf333e8,0xfd94a23c,0xfe8cf8d2,0x009b293e,0x00cbf5ba,0xfd28830c,0xff6a3871,0x0172901c, -0x01c313c2,0x00db9473,0x00027f04,0xff914afe,0x000b59c2,0xfff5882a,0x002159cb,0x001d3a8e,0x00508ac3,0xffef87a0,0x0048416a,0xff8de09d,0x000b1cac,0x011a1940,0x00c73bfe,0xffe45029,0x0044fbcc,0x00dd990b,0x000ec731,0x000fc434,0x00e184f0,0x01858868,0x01d7c18c,0x00cb27e3,0x005a22e9, -0xffe32b77,0x01f3da9c,0x01f6829a,0xff9bde8a,0xfe7891d6,0xfc3ab784,0xf9f37b40,0xfb852b78,0x03839fa0,0x01ff36f4,0x01bc9cea,0x01a2c69e,0x01ff6e9e,0x018737ce,0x0125e656,0x00d75a34,0x00489cb3,0x0020f2ee,0xffea5c5b,0xfff49513,0xffeecd70,0x005a5542,0x001d276f,0x00077d3e,0x00cb68b4, -0xffe469b9,0xfee1d1ee,0xff73bf8a,0xfff185e0,0xffd92c21,0xffec637f,0xffc7e605,0xff83f3c1,0xffb085b1,0xfecd3196,0xfe3fdbdc,0xfd2ba734,0xfda74610,0xfde5ffb4,0xfead3d0e,0x0022fb9b,0x01df2edc,0x0335b408,0x037f0ed4,0xffa64139,0xfe6325dc,0xfe8a3262,0xffcac36f,0x00797c45,0x0055cb45, -0x00baca4e,0x010ca1cc,0x00b2be3a,0x00e85540,0x00a32c93,0x00fef9dd,0x00c8c440,0x001aa0f6,0x0035963f,0x0064757a,0x00eae11e,0x00443a7c,0xff577e7b,0xffbdc5ae,0xffb9959a,0xff39e959,0xff0afbc6,0xff35d34f,0xfedb1a4c,0xfe7e2654,0xfd9b5164,0xfd99c0c0,0xfe07d658,0x00527003,0x0205fde8, -0x0341f124,0x02f8c3c4,0x01f49962,0x00e06017,0xffae5204,0x0110aa98,0x001308ad,0xffe06b2f,0x005f64a3,0x0078bb7f,0x006de6ba,0x00934b31,0x0053ae1c,0x004acde6,0x0037e42c,0x003baf9d,0x005ed3c8,0x00997a59,0x00d82afe,0x00c542a4,0x00638a7e,0x0026b778,0x003ca650,0x008ab48d,0x009d82df, -0x011e3f74,0x014f380c,0x014be228,0x00dc921c,0x00b32e9f,0x00cd0b19,0x0112b6b2,0x01b4b0a2,0x026dadec,0x02349744,0x0215a014,0x02807b48,0x0176105c,0x00da39e7,0x00d1f666,0x00bc9f10,0x0043bbc9,0xffde65c1,0xff6b595b,0xfff64de4,0xffe5762c,0x002490fa,0x005a9f5e,0x0094ed53,0x006101b5, -0x00a31a07,0x003a7fe2,0x00936dcb,0x0027100b,0x0036e324,0x002e840f,0x0075787c,0x0081824e,0x00468cac,0xff9ed16e,0x002e08ea,0x009cac20,0x00230467,0x0025f37a,0x00209514,0x00323869,0x0024ab13,0x002aaa90,0x00117ccd,0x000d0303,0x0035ac13,0x005b61a7,0x008499ae,0x0055234c,0x002e6c68, -0x00028e90,0xffe5423a,0x00b0d99c,0x008623c7,0xffda0983,0x007e9e44,0x001ba8de,0x001ede59,0x004e5967,0x0035cd0f,0x00709465,0x00443218,0xffee797b,0x002cbcf6,0x0062be12,0x0040c372,0x00111e65,0x003095dc,0x00305286,0x005f3a82,0xffdf4066,0x00a328b5,0x00a2eacd,0x00a1819b,0x00ae2972, -0x00a86bb3,0x00a6f451,0x00a930fc,0x00d38701,0x00f5712f,0x0100866e,0x01048218,0x01012b0e,0x010702f6,0x00f89c3d,0x00e6ae28,0x00d6c262,0x00be3fd3,0x00cb5e89,0x00f4a4a6,0xfff199df,0xff81706b,0xffbb9b24,0x003011f0,0xff88015f,0xff88caf0,0xff7da15c,0xff7d162d,0xffa4d1d9,0xff7fe678, -0xff6f8236,0xff7cd8f7,0xff6e7ff5,0x00207c3d,0xff7bc5fa,0xff77cdb7,0xfffd2c73,0x00f8a56c,0x00bd29fb,0x00ca73a0,0x00c93f19,0x00cb38a0,0x00ceca3a,0x00cc4132,0x00cdb952,0x00cf19df,0x00d95965,0x00e2fef2,0x00ece65f,0x00f75d7c,0x00e947de,0x00e25547,0x00dea555,0x00d5a8f4,0x010406e0, -0x00322f71,0x001b9545,0xffcf8ec4,0x0192ac44,0x01d5c83c,0x00816736,0x014e1660,0x01cd7cfe,0x0101b840,0x01021abe,0x00ef46f0,0x009537a2,0x00c3661c,0x00c0d47e,0x00a2ef7d,0x01d1ea80,0x01712422,0x0094737e,0x01ca7470,0x01a41d1a,0xffe87a3e,0x002dd6f0,0x0025d888,0x001ae33e,0x001cc055, -0x001f47c1,0x0027aea8,0x002a63e0,0x002d9501,0x002a2be3,0x003c4976,0x004429e8,0x00438817,0x004b84bd,0x0046841c,0x003e1cf4,0x0022bbe1,0xffdc5d74,0x00534122,0x01566b16,0x0062ee98,0x00bfe604,0x00dd1aca,0x00bdcddb,0x00b43647,0x0068c845,0x00abce8d,0x0101fe06,0x00b8123a,0x007d39f6, -0x00cd84d7,0x00d78c21,0x00c744d2,0x0130b1d8,0x00c448fb,0x017034d6,0x00a63fa1,0x0011f2ee,0x004879df,0x001f7719,0x0026283a,0x0019c300,0x001a0940,0x00130886,0x001db839,0x00224320,0x005f0333,0x008cc157,0x009622c8,0x00d0516d,0x00bcfd2c,0x00777155,0x003dae06,0xff6d0e82,0x00437cbd, -0x0104e3f8,0x0093ba5d,0x0067f94f,0x00c45cdf,0x00db278e,0x00ae5ef1,0x00ca8bb4,0x0005b4c2,0x00a308c0,0xffc95891,0x008181e0,0x008f9f9a,0x011665aa,0x00f2e67d,0x00f3b5ab,0x01097d38,0x0182d2dc,0x00e41ed4,0xffe94c07,0x00260d87,0xffed6bcf,0xffedac61,0xffe94c66,0x00176aa7,0x00167504, -0x003a24c4,0x001996d0,0x009ce8fd,0x00e509f4,0x00b52f77,0x012d0324,0x00d3b479,0x000c2e81,0xffe72aa8,0xff4b30e4,0x002aaf0f,0x004f8210,0xffa9c714,0xff5b7467,0x007c4b1a,0x008f9277,0x007b6dd3,0x00449da8,0x0016cdf3,0xffb606d2,0x0001c906,0x00426fb2,0x0086c3f2,0x007ae4f0,0x0083af1b, -0x01732e50,0x00e9eeb1,0x01a5fcc4,0x01012c86,0xffdfed2d,0x004a7840,0x000837c2,0x0011f033,0x000bc4c1,0xfff5d6b0,0xffefd1ef,0xfff4cd2a,0xffb952f5,0x00bd5fcd,0x0170b66e,0x01746e08,0x026b7d2c,0x01f2db3c,0x003da21c,0xffe7e78e,0xfe8e6b68,0xff7a0a47,0x026c2d70,0x02466738,0x00747e54, -0x007bf8ea,0x00726a24,0x00e1c3ef,0xffdfc94b,0xffbb3ee5,0x0034c533,0xfff0a961,0x0021ffbe,0x00b6c20d,0x00e52c4e,0x00c0d9b4,0x00ca90e5,0x00898f44,0x018bcc6e,0x015fa4e0,0xffa1285b,0xff792d8f,0xfecd1860,0xff581104,0xfebd6418,0xfdd533fc,0xfe6b3420,0xff03b92d,0xff9a9d93,0x00a6b917, -0x00a6e445,0xffa9b4bc,0xff397cbf,0xfea295b0,0xfe2184d2,0xfef7f1c2,0xfeedeebc,0xfe68878a,0xffd2addd,0xffc519d3,0x01411bde,0x00237e8e,0xff4e6cae,0xff7e74b4,0xff9bd2b9,0xffc6706c,0xffd871e8,0xfff93da5,0xfff9eb12,0xfff1e3aa,0xffe78e94,0x00544a1c,0x018e66ba,0x00b579ad,0x0090208f, -0x006a4c81,0x00976933,0x012fdb9c,0x013c2e3a,0x016fc54a,0x0120e4fa,0x0074c160,0xff7f41df,0xff274cd3,0xff0f0819,0x0086d365,0x00e0b19b,0x0063b4fc,0x013ca856,0x017a5460,0x00fac8b8,0x00882141,0xfc9e6520,0xfe5f7aae,0x00bbdb01,0x0071167b,0x0088c849,0xffac5de4,0x0005efb3,0x0047f4bc, -0x003611de,0x0003003a,0xfffed785,0x001e7273,0xffcb79d3,0x0025174e,0xffea90ca,0x0034a74b,0x016dd838,0x00ceb5f9,0x01289c42,0x007d9243,0x00110854,0x007c84c5,0x004078f2,0x0089dbcd,0x00b9fdeb,0x01724c6a,0xfffce642,0xff12b981,0xfe376d48,0xfeff7028,0xffe107ac,0x008f7da7,0x0162e918, -0x00281322,0xfe5112cc,0xfce4429c,0x06e43dd8,0x03b48094,0x028133fc,0x027c9ff0,0x0237c3e4,0x01c96774,0x010e45d6,0x00a1ad95,0x006c3e4f,0x003fe064,0x00175a1e,0xfffe4176,0xfff76b97,0x0093473f,0x005261c4,0x006b769a,0x00eb5eb0,0x004d05eb,0x004a69b5,0xffb98325,0xffa2ab5c,0xffff84ed, -0x00047db4,0x010fa24c,0x011058a2,0x00e4c970,0xffab1e05,0xff8f5a0b,0x00065e75,0x011f2020,0x00f3cc60,0xfe8fb04a,0x012cbadc,0x036b40a4,0x061dad50,0x079c9d38,0x029f48fc,0x02955b28,0x015f2dc8,0x0128434e,0x017e5700,0x011aa342,0x011b2254,0x0190825c,0x0151f506,0x00f63f5f,0x00d4efa7, -0x0100b552,0x00c6b841,0x0040f786,0x003c976a,0x0061031e,0x00c88a46,0x00a99a63,0x00c10976,0x0035f4d3,0x0029b7f8,0x0008cede,0xff5e4612,0xff76f858,0xff25c5db,0xff65ebcd,0xfeaf6c88,0xff6344b1,0x01283b32,0x01a84f64,0x02d7afe0,0x03a5067c,0x04c82bb8,0x04b87598,0x03b93a2c,0x03175770, -0x01e2c51a,0x02538f24,0x01c2e31c,0x01d64b9e,0x0180d846,0x012f7eaa,0x00b03853,0x00ac4852,0x0043f72c,0x001d7ee7,0xffedc316,0x005f145c,0x00ac2e65,0x00c91a47,0x00d6fef2,0x00d86588,0x00e61b6d,0x00938782,0x007e0ff2,0x0085332b,0x006e4ec6,0x007abcb2,0x007b1403,0x01150d92,0x015f9288, -0x012d158c,0x018e1abc,0x01aa49b6,0x01c881da,0x01cbc8ca,0x01a84a54,0x01717232,0x0095d618,0x006ee2d5,0x00cdebd8,0x01b405d6,0x002f83d9,0x0079f057,0x010eebb0,0x011c13d8,0x014eb7ca,0x012c02cc,0x0111c10a,0x00fe5429,0x0102ed34,0x00cdf70e,0x00f56bc5,0x00831cbf,0x00729b73,0x0042f323, -0x007ace62,0x00aba8ff,0x00f20334,0x00f8e092,0x0122d468,0x00e9fb3a,0x009a9797,0x00b26eb4,0x0093dad1,0x007c2f43,0x0061a50e,0x003fa452,0x00752c16,0x00abc62b,0x00f25d10,0x00d67767,0x00b89ec6,0x00a76826,0x00a04b8e,0x008a5248,0x0040f255,0x00477146,0x00cbe1fe,0x00e23d0f,0x00c72f22, -0x009e8d43,0x00c730c2,0x00b0a6a6,0x00a2979d,0x009a7870,0x008b53c4,0x00b80ff4,0x00f8bbbc,0x00ed45b4,0x00cd2daa,0x00f2711d,0x00e32004,0x00a51069,0x00af545b,0x006bdde4,0x00943ed4,0x003ed203,0x0025d164,0x002e822c,0x0027d5c6,0x002e74ac,0x0034226b,0x0038ceda,0x0042798e,0x004f69ae, -0x006bdfcb,0x008fcee9,0x00bf9872,0x00e8e6a6,0x00da1ab2,0x00dc8103,0x00e31942,0x00ead2c9,0x009dc499,0x008878e7,0x016ba626,0x017eaa96,0x00c6a6f3,0x01437e86,0x017d6042,0x00fe66c7,0x0106d116,0x0105b7e4,0x00e3a7c5,0x00f8c613,0x00ffa671,0x00f535e5,0x01957d68,0x0148329a,0x00e2023e, -0x017ab0a6,0x0145862c,0x0061b5be,0x0082d191,0x007c9c10,0x0076ce36,0x00723061,0x006bd271,0x00627fb6,0x0072dba3,0x00805238,0x008a42bc,0x0098499c,0x00a39120,0x00bb87ef,0x00b37c76,0x00af3629,0x00a6554e,0x00a3b18f,0x00bc7826,0xff1ab962,0xff282875,0xff3c5d49,0xfe7017fc,0xfef1adb4, -0x00bf903c,0xfe789ee0,0xfef05344,0x0064ae2c,0x0068d4dc,0x006c995b,0x0090998f,0x008c53c9,0x00990ca8,0x00c6f8f6,0xfef19770,0xfe7cfca4,0x010893b0,0xff0ecb59,0xfe7ff73e,0xff3ac20f,0xff352e61,0xff173586,0xff14fc84,0xff1818e1,0xff159e00,0xff070d5a,0xff149962,0xff1634b5,0xff11bcb8, -0xff03b900,0xfef7d49a,0xfef353b0,0xfeda2566,0xfee2a50c,0xff1d45e1,0xff08b55f,0xff27ee42,0xfedbf804,0xff695dcf,0xff0e5de1,0xfefb4b42,0xff8ad550,0xff785c57,0xff759843,0xff57877f,0xff00c8a2,0xfed842a8,0xfecfc5c6,0xff275365,0xff21120a,0xff901927,0xff9f16d7,0xff2c535a,0xff7280c9, -0xffc8afec,0xfef42cce,0xff1fa93b,0xfecbb8b0,0xfec6f74a,0xfec81544,0xfece512c,0xfeb7bf04,0xfee05d94,0xfed8f804,0xfeb4eb98,0xfe9306ca,0xfe6ba6c6,0xfe5c8022,0xfe110406,0xfe42ab6c,0xfefd1f2e,0xfed6511e,0xfefa2770,0xff1ee522,0xfec8e34e,0xff346902,0xff46febd,0xffddd20c,0x00094a5b, -0xffdeb092,0xffd7e76a,0xffd87531,0xff3c48a0,0xff7f1033,0xff9075ad,0xffb4d473,0xffe4c4ff,0xffe97283,0xfff686e6,0xffd3708c,0xff6cfabc,0xff5327bc,0xff10bf76,0xfeb1bb00,0xfe828cdc,0xfe8e5492,0xfe84950c,0xfe39a306,0xfe8b3a04,0xfe90afee,0xfe5c6ff8,0xfe17a5fc,0xfdc9b270,0xfdaf797c, -0xfd2c86b0,0xfd9bfe50,0xff023278,0xfe7d3320,0xff7bb3d7,0xffa35d82,0xff40c6d7,0xff5af389,0xff3d2396,0x0028584f,0x00972cec,0x00ab6073,0x00659953,0x0007c618,0x0000bbb5,0x00065faa,0x0028a829,0x00b58fa8,0x007efae0,0x00941efe,0x00882323,0x009b4d8d,0x0024eb3c,0xffc1c183,0xff0fb834, -0xfe454c68,0xfdf5a288,0xfdee42c0,0xfdee8f50,0xfdb3d464,0xfe2d9d56,0xfe2c3480,0xfdba4348,0xfd3ec0b8,0xfcc4997c,0xfc9c8d10,0xfbecc438,0xfcff09c8,0xff699d8c,0xfed0e458,0xfcd5d308,0xfcb408e8,0xfe78d390,0xffbeb751,0xffc101f5,0x000eb0df,0x0013bb6a,0x0043db93,0xffa8eed7,0xff81ee7e, -0xfffe6a32,0xffd54ae7,0x000ca283,0x00647d0e,0x00a8dee7,0x00b2a5b0,0x002eed23,0x00107a98,0xffa74030,0xff07c46a,0xff140909,0xff6ebd93,0xfffced76,0xff401d51,0xff2581cb,0xff26f2dc,0xff9a4862,0xffa8865e,0xffa611cc,0xff991e52,0xfed789b4,0xfde1dc4c,0xfcd659f8,0xfc5457f0,0xfc950c58, -0xfc748b28,0x0063a636,0xfe2f0c8e,0xfdb331c8,0xfebc4104,0xffe07652,0xff618f18,0xff255de1,0xff2277b9,0xff838145,0xff9a9919,0xffaa78b0,0xfffd4ad8,0xffecab5a,0xfff40dfa,0xffb009d0,0xffd2cca8,0x00a4a2f1,0x004eff59,0x002922fd,0xff91b1a1,0xfef7477c,0xfe51207c,0xfde0c0c8,0xfecfea5e, -0xfedc8322,0xfdfe87b4,0xfe73df48,0xfeb3c99c,0xfecbdf52,0xff948ec5,0xff6aacf8,0xfe61812e,0xfe42baac,0xfea91cb8,0xfffb774c,0x00283506,0xfaf97a30,0xfcc332d4,0xff5738ee,0xffcdcbe0,0xff6a46e0,0xff4a6321,0xff8d8c44,0x000862e8,0xfff095d1,0xfff5c2b8,0xffc276d7,0xffe43ca0,0xffb0d9a6, -0xfff8fd24,0xff97b4bf,0xffbcae81,0x00930693,0x00552cab,0xffe11668,0xffa9eb9b,0x00271c1c,0x00118bd0,0xffcc5621,0xff33f9a0,0xfe422060,0xfd62ff80,0xfd1db934,0xfd81d53c,0xfe01c1aa,0xfec19cd6,0xfdf70af8,0xfb16c3e0,0xfa417160,0xf9415e90,0xf8cc6f80,0xf9e86938,0x01e7d5be,0x03f22c5c, -0x0331ca54,0x024cc2cc,0x0264c228,0x017fdd2c,0x0106ff18,0x004d4639,0x005da24a,0x0036ab11,0xffee7089,0xffee1ae7,0xfff6bc8e,0x002ba9a4,0x00197aba,0x0027a1f6,0x006b9116,0x0054abe2,0x000b0e95,0xff92e9e9,0xff72b33e,0xff112cb2,0xfec1a564,0xff3431b0,0xfef1fa68,0xfe7d1a82,0xfcbac644, -0xfc530ca8,0xfcf2bd14,0xfe4934dc,0xfe630daa,0xfd6d2b94,0xfb2e4360,0xfad2c708,0xfbfeddf0,0xff79f53a,0xfc3e7a68,0xfe0a08e0,0x008cdf11,0x006bfbfa,0x00aa4869,0x00b566bc,0x00be0509,0x00b31923,0x00a8737f,0x0084c5c7,0x005834bc,0x00a78929,0x007e1b38,0x000ed3e9,0x000c450e,0x00290b10, -0x00ab6861,0xfff907f4,0xffb398ff,0xff7a134a,0xff7c77a3,0xff746bcd,0xff279aaa,0xfe5d94fc,0xfd6afb50,0xfc8d5cd8,0xfbcf3190,0xfbd0ce80,0xfc617b9c,0xfd822de8,0xfe796892,0xff4aea4a,0xff58a722,0xff19c105,0xfebfe54a,0xfd0f48f0,0xff6bb913,0xff7bc0df,0x01059b4a,0x00872c3e,0x00abb24a, -0x004a899c,0x0049847a,0x0062419e,0x00163f75,0x00120611,0x001682e9,0x001cead7,0x0051c052,0x0072d656,0x0077cfa7,0x00490eba,0x0038d54e,0x00329d88,0x00602fe2,0x003ac1de,0xffc8f2ea,0xff630e9a,0xff0c0529,0xff2c8f0f,0xff60d9ce,0xff580b6d,0x0079194d,0x0155e5b0,0x01f46a06,0x01e97d1e, -0x014f4702,0xfff7596b,0xffc87a07,0xff70cbc0,0xff28e3da,0xff58eac1,0xffbb4806,0xffe0476f,0xffc5ce4e,0xfff4717a,0x005d5670,0x006cb60b,0x008bb024,0x00997625,0x00a47d21,0x009c36fc,0x006eab89,0x0079f1fd,0x0073c2d0,0x00537a68,0x006ad43f,0x0085f539,0x00ae54a5,0x008bbd53,0x00449f71, -0x002e6bb3,0x0084d5fb,0x00bf6c7b,0x00f4f902,0x00c76c84,0x00a58499,0x007a30e4,0x003e4699,0xfff4bd9e,0xffca55b5,0xff63b127,0xff2a1db3,0xfef05372,0xff26a1b2,0xff408ef3,0xff5093e1,0xff8079c5,0xfffb1d89,0xffdaab18,0x00a8c694,0x00105509,0x001d17bb,0x002c9e6b,0xfffba87a,0xfffef6ad, -0xffd4086b,0xffaef298,0xffa50953,0xff8a28b2,0xffabb33d,0xff9c3374,0xffdbcd4a,0x000472aa,0xffc33e12,0x0012abd9,0x003f43a6,0x008937d4,0x009c5f1a,0x005ecd2d,0x0059299a,0x004317ac,0x003a5d11,0x003747f2,0x00386e1d,0x0030a1c9,0x001ea0b3,0x00058975,0xffe4791b,0xffb14dda,0xffbce576, -0xffc3140e,0xffd57e18,0xffdde2ba,0xffdbc789,0xffc8e67e,0xff980b53,0xfff7b826,0x01174070,0xff780c63,0xffeb9b59,0x00df7a35,0x00e530cd,0x00ec015d,0x01003300,0x00ffbf0d,0x010393ce,0x010d578c,0xffc6b772,0xff8040e0,0x010b0a3e,0xfff46213,0xffb7bc3d,0x00412122,0x0022b945,0x001d5ed8, -0x0016086c,0x0010d33c,0x000ac462,0x0000d9b5,0xfff30cfd,0xffe56e71,0xffd8700e,0xffcf2fb5,0xffc7b973,0xffb92729,0xffc6917d,0xffcaef85,0xffd0220a,0xffcd7bb8,0xffcb1493,0x0137fbac,0x00f15c25,0x015be83a,0x010e0e9e,0x0000ea42,0xfe14ad44,0x017ba95c,0x00498681,0xfe8f66d8,0xfe7c26f0, -0xfe6e8534,0xfe5a9144,0xfe415392,0xfe39f1c0,0xfe2f12f6,0x003bb153,0x0161d384,0xfe0a589e,0x0013155d,0x010d029c,0x015c14bc,0x011258b8,0x01378c0c,0x0134e7a0,0x013ba79a,0x013e65d8,0x01395de2,0x01467092,0x014b0cbc,0x0148d870,0x01543da6,0x0158d362,0x0158aedc,0x015d1f14,0x01479896, -0x01042e84,0x01141572,0x00e0ce48,0x018066de,0xff8f7b69,0x013588dc,0x00734c73,0x008d5be5,0x010564a0,0x00bdd71f,0x0114ad8a,0x01184cf4,0x00b04508,0x00fab001,0x00d1510c,0x00eabb68,0x0088fd91,0x00b79d4c,0x01112392,0x00e2b8c1,0xffa5a74d,0x016d346e,0x0150aa74,0x017c4a26,0x0182db6a, -0x018e8ed2,0x018c1b1a,0x0173faa8,0x01928150,0x019ae3f6,0x01983d36,0x01b1f52e,0x01c33090,0x01bfca52,0x01ce9ef2,0x018df2cc,0x00e5f45a,0x00f116c1,0x00c9aa64,0x013b7a48,0x00d6b62a,0x00e1d993,0xfff41ecb,0x00b16a3a,0x00bb7254,0x00966dd3,0x00743939,0x0066f84c,0x00156a1e,0x00575fbb, -0xfffffcd2,0x00a9ae28,0x00acc145,0x010cb458,0x00d1f774,0x00c6ebad,0x00c3e94d,0x011d96d6,0x0183dee6,0x01997ab6,0x01c2409c,0x01de5ce6,0x01e8e6c6,0x01d2ffe4,0x02109094,0x022e0704,0x02278344,0x025e202c,0x02776304,0x025b86b8,0x026ab788,0x01d073bc,0x009fff79,0x00d4a0ed,0x00bea679, -0x0168d882,0x010f886a,0x012ebe56,0x0016c404,0x00f12b1e,0x00f292ab,0x00a179f5,0x0097a8b4,0x0029be64,0xffe27d3d,0xffcd604a,0x0045ecc7,0x00b1d287,0x00eb902d,0x01287f84,0x00e2e036,0x01271bda,0x00ca9752,0x0134efc8,0x01c7c98a,0x021a42dc,0x02581c84,0x027fe24c,0x028a8f6c,0x02452fec, -0x028dd230,0x028825cc,0x0273d2d8,0x02d887bc,0x02ff0d7c,0x02e7c07c,0x02eaa5f8,0x01ee5f0c,0x00446494,0x00745a95,0x01033060,0xfffc8848,0xffd8a022,0x005eed35,0xffdaf075,0x006261c5,0x00a72ae2,0x005c0d3c,0xffdede18,0xffc21030,0xfff670fa,0xffe7497a,0x002019a2,0x006ddb3e,0x00eff22d, -0x01182f6c,0x007e2e07,0x0122af88,0x00e5d025,0x0133eea0,0x0196a24a,0x00d9345a,0x00c88753,0x00c0e3d9,0x008a59a9,0xffe9c48a,0x011741f4,0x01c2593a,0x027e86cc,0x0245742c,0x0252bdec,0x02bbbf6c,0x0216d944,0x01a92c7a,0x0126afd6,0x00b0f031,0x00c7fe8b,0xffe88215,0x00092c40,0x005ac6b8, -0x010b91e6,0x0023cb6d,0xff8fc098,0xff636b08,0xffae54a2,0xffcde011,0xffb9fb6e,0x0016c2d4,0x00115975,0x00148451,0x0010cf50,0x0061f7c9,0x0139dc4a,0x00b3ee48,0x00329520,0x00cf7ab8,0x01d40348,0x0237a4ac,0x02d2ad88,0x01d77442,0x00c276bd,0xff973c3a,0xff5b8924,0xff8921b1,0x0075906e, -0x00cec191,0x00f306d5,0x00266cd5,0x00fa6b64,0x00ef238d,0x006a156e,0x00bb6d0b,0xfc501eec,0xfd4d41a4,0xfe1f593e,0xff009e0c,0xff0f9536,0xff6cfbc4,0xffa712eb,0x00228e05,0x001955ae,0x00224809,0xffe7477c,0x00024323,0xffd4a950,0xffef640c,0xffff37d9,0x003929fe,0x007cc781,0x00f14960, -0x011c023c,0x00bbdd14,0x0070fc8a,0x00372708,0x006467ed,0x01c196be,0x02838294,0x028fa8d8,0x026d3190,0x01f1af6a,0x0177e7ea,0x01ce5a06,0x02f4aad4,0x04140788,0x04353208,0x033b4c38,0x025fb4c0,0xfd4c49d8,0x05b2f738,0x040145e8,0x03a6bb34,0x038853dc,0x02666100,0x022179c4,0x0124cba0, -0x006b6bbf,0x00687de4,0x002eab46,0x000014c5,0x0027310a,0x001ba3e6,0x0029a4b3,0x0035a467,0x0059b0a6,0x00a45412,0x00cc7d0b,0x00712b6b,0x003365a7,0x0148385e,0x01b0e6be,0x018ff3f0,0x01852952,0x00bb9eaa,0xff999348,0xff2eaa64,0xff490cf9,0xfff69ada,0x003e8892,0x0052c1b4,0x0018339d, -0x00cf8bda,0x02eda288,0x07387bf8,0x05d42650,0x058c8c38,0x0284df6c,0xffcf1005,0x00f29c98,0x015ac66c,0x00e511d8,0x00f76890,0x01202502,0x00ea58e4,0x00ec9460,0x00a25bf7,0x00a18362,0x00819981,0x0081b42b,0x001fda18,0x001507a4,0x007c0d93,0x008c9b1b,0x0052d2d6,0x0009fc52,0xff6d9062, -0xff20927e,0xff5cbf50,0xff06433a,0xff3d0372,0xff97368d,0xffb34061,0xfff03cdf,0x00ad207e,0x00c3bf8f,0x01eaefbc,0x03d34e08,0x058c3328,0x06673900,0x06c9f528,0x05eff3b8,0x021c58f0,0x01dcd9f6,0x007268e7,0x012215da,0x00b7b124,0x00cf75a1,0x00bb4554,0x009e06dc,0x00a57f13,0x00880f8a, -0x008b6210,0x00566e33,0x006f2a57,0x008817ae,0x00d2facf,0x00f73a22,0x0113cf42,0x0064879f,0x0025f8d1,0xffeb99b3,0x001d9fa0,0x002ec9e4,0x0009e803,0x00a5c1e7,0x00dda373,0x00e69feb,0x017691a0,0x01a12db2,0x0186ea70,0x022808f8,0x02b819c0,0x03475aac,0x02576344,0x01e0df28,0x01b68394, -0x01b8218e,0x0168acb0,0x013c67da,0x010136a8,0x0141797c,0x01081dc2,0x010d76e2,0x00f4820a,0x00fbed92,0x00c57f10,0x00e89b3e,0x00bacc0b,0x00f9512a,0x00869bad,0x00a9445f,0x008d97e9,0x00c1a718,0x00c3efd6,0x00db632e,0x00eefdda,0x012005f4,0x0142f7fe,0x01384604,0x012e1192,0x01250040, -0x011d3e7a,0x010f05da,0x0159a8ae,0x019f4c0c,0x01e56e86,0x01b6f7d8,0x0177f2ca,0x0165d776,0x015f5d80,0x015bf428,0x0134b32c,0x013bd622,0x00ce0bfb,0x00cdc0cb,0xffc38607,0x0097af82,0x005d8a8f,0x004cbb09,0x008c3b57,0x0080d637,0x00b2d7f0,0x00d31f32,0x00a60c3d,0x00ea9efd,0x00e78463, -0x00ebf67b,0x00b2e36a,0x00c33fe4,0x010fd902,0x00f67598,0x00870d67,0x0121f300,0x00d84817,0x00cbb544,0x00bb9897,0x009f8fa6,0x008bf1d5,0x006d7995,0x009d7c8c,0x00c5fc7c,0x01045d3c,0x013b546a,0x01813058,0x01b6b480,0x0181b01c,0x0152626a,0x012a80c6,0x0103b6ba,0x00cb9445,0x00e000dc, -0x00c4daad,0x003b0d2f,0xff52f61e,0x00fc19ce,0x00559afb,0xff81471c,0xff70b8cb,0xff5f3faa,0xff5bae68,0xff3ca7cf,0xff2a694c,0xff1b9ede,0x006b6cd1,0x01101ad6,0xff49ec6d,0x00745c9a,0x00f7ff73,0x010f6a2e,0x00e7178a,0x00e69088,0x00d28963,0x00ca2260,0x00bfcaf0,0x00aab327,0x00c633a2, -0x00d42ed7,0x00dd21ec,0x00eeb5c4,0x00fc4371,0x011d9142,0x01070ca0,0x00ff2449,0x00f23132,0x00e7c929,0x00f2a347,0xfee113a0,0xff15bdbc,0xfe92f678,0xffa84885,0x00e365c3,0x022be408,0xff2b8853,0x00ae5d48,0x0208a850,0x02234890,0x021d8c90,0x01eef9cc,0x022147bc,0x022b159c,0x023434b4, -0x00b93aaf,0xff619b8a,0x0271053c,0x00d58c09,0xffb344d5,0xfe8bacd6,0xff004a88,0xfed2c79c,0xfec7ec6a,0xfecb45ea,0xfeccc32a,0xfeccab2c,0xfee11cf8,0xfee090e8,0xfed00c0a,0xfebb9c84,0xfeb27302,0xfeb8caaa,0xfeb31be4,0xfec6b712,0xff0d53b2,0xfef2a698,0xff096e7b,0xfed7f334,0x014b326a, -0xff2a328f,0xffd0259c,0x0031824d,0xffb42d27,0xffc42b99,0xff57e814,0xff4fb024,0xff9cbc2f,0xff3120ae,0xff54ad9d,0xff793031,0x002f645d,0x000f28d9,0xffcb0c24,0xffa5b71f,0x012cc0b2,0xfec5fff0,0xfea2622a,0xfe86a49e,0xfe51bdd8,0xfe5dc6a0,0xfe6b3e2c,0xfe750816,0xfeb3807a,0xfeae98c8, -0xfe7aeed8,0xfe4a2392,0xfe387a38,0xfe66546e,0xfe650e0a,0xfea902ee,0xff497030,0xff0986c3,0xfeeee838,0xff15af77,0xfff27ff1,0xffb5828f,0xffe34971,0x004a278f,0x00631997,0x000323a3,0x006896e2,0xffd2d04a,0xffd6440a,0xff34b3df,0x000e76c6,0xffa2329f,0x008a1073,0x003647ca,0x0038b205, -0x00087364,0x0022b3bf,0xff377739,0xfe523838,0xfe537a70,0xfdd9b558,0xfdf9133c,0xfe02a1c8,0xfe030580,0xfe8ccbe6,0xfe8295e4,0xfe0bfa76,0xfd9f1ff0,0xfd661db8,0xfdb3f09c,0xfdb22424,0xfe34bede,0xff6ffd00,0xff18a7c2,0xff136fdb,0xffb42b96,0x008bcaf1,0xffc8ff73,0xff788a4b,0x0060ddbb, -0x00a09da1,0x007f3b9c,0x007370c5,0x001d0c8f,0xff9f9276,0xffd64c85,0xfff0231c,0x00358f82,0x008f0e44,0x0078597b,0x00c912ad,0x000dac1b,0x008b84da,0xff3f6734,0xfe003eca,0xfdc805a0,0xfcfc8184,0xfd301c70,0xfd4eaebc,0xfd707fa8,0xfe57e9de,0xfe3f884a,0xfd7a9b68,0xfced14c4,0xfcd6b438, -0xfd780760,0xfdcd72e4,0xfebdda40,0x005b0f22,0xffac085a,0xfc97ede8,0xfd76c620,0xfee80842,0xff7b9955,0x0091e4a6,0x00baa7c6,0x004e788f,0xfffd1e75,0xffa03c2d,0xff7a52b0,0xffd57700,0xffbb0bc5,0xfff79755,0x00657fc7,0x00bb97d1,0x0091166f,0x004b169f,0xffc5f0b1,0x004c85fd,0xff95746d, -0xfe094894,0xfea366de,0xfe9efabe,0xff4a8835,0xff4caeb7,0xff477677,0xfeec07c0,0xfee65540,0xff222371,0xfdf7d424,0xfd0318d0,0xfc8d4738,0xfbf84100,0xfc2500c8,0xfcfe3a74,0xfd38b214,0xfed63bb8,0xfef400ca,0xff86cbcc,0xff793d0b,0xff202230,0xff617ea2,0xff66c352,0xff8e5d5a,0xff8dd572, -0xffa2b425,0xff9a6367,0x000c6a2b,0x00127f22,0xffe51ee9,0xff956320,0xffbd3dba,0x008e0d04,0x00861d68,0x00f9a907,0xffc89d44,0xfe5d03ca,0xfdf02f10,0xfcc9b210,0xfd731e94,0xfdfd6ef4,0xfec0ebc6,0xff170026,0xff469450,0x0002ea60,0xffe436c7,0x001b7d04,0x0029f835,0x00353514,0x00132311, -0xfffe3947,0xff231ab8,0xfc2da19c,0xfc86bd88,0xfe51094a,0xfeb95054,0xff6eed06,0xff5810df,0xffbca1d2,0xffbd7de5,0xffe0382d,0xfff276c1,0xffd1ef95,0xffcf51ec,0xffbaaeb6,0xffe1a1ea,0xffdce6b1,0xff86890c,0xffeebb23,0xffeb71dc,0x001c3729,0xff80c156,0xff28a895,0xff8b2f1a,0xff7dd9be, -0xfe35c120,0xfcb2b8bc,0xfb9c75e0,0xfb653530,0xfc3940e4,0xfe1ce0fc,0xfd3003cc,0xfbce7d88,0xfa63d508,0xfa1fca40,0xfafb4838,0xfbf509f8,0xfc50505c,0x00a31a03,0x039cdc50,0x03bd5994,0x028a3b28,0x0289a16c,0x0147390c,0x00cbfacd,0xfffcc090,0x003892e9,0x00131211,0xffea90b0,0x0004393f, -0x0000d3c1,0xffdb6a32,0xffe3ad95,0x0016fd08,0x0004516b,0x0062c38d,0x00dc4c8d,0xff9fa88d,0xff2fb1c2,0xfed815da,0xfe72dca4,0xfe28ef60,0xfe430668,0xfe761a8e,0xfe85cdc2,0xfea2a85a,0xfeed0c70,0xfe9384d8,0xfe4d101c,0xfe0bd910,0xfae8c868,0xf9ce2068,0xfacab388,0xfe2ec088,0xfef1cc18, -0x00cc2ddb,0x02a6d7b0,0x017930e6,0x011c96ee,0x0135adb6,0x00f5e726,0x00d1d51a,0x00df8e51,0x0073a3b3,0x0046854a,0x003814c3,0x003b1a9f,0x0070d0a5,0x0015e81f,0xfffe49df,0x00148524,0xfff1e89d,0x00242dd9,0xfef856c4,0xfeacd708,0xfede69f6,0xfecceaa4,0xfedb7fec,0xfe943a44,0xfd79d39c, -0xfdef21ec,0xfd7dea44,0xfc18b3cc,0xfca2136c,0xfcdca640,0xfd2d7108,0xfe427cf8,0xff5e361c,0x000ec0e6,0xffa471e6,0xff24e84f,0x0008b04c,0x018b7e00,0x00cdcd9c,0x00cd521a,0x0087b576,0x0052c047,0x0062f2fa,0x00561848,0x006b0c77,0x0055b2d8,0x00480731,0x002f2155,0x00461789,0x007549c3, -0x009e1743,0x00a41583,0x0079898c,0x002b6add,0xfffa8363,0xff4f7387,0xfee275ca,0xfeac6f56,0xfe8b2a5e,0xfeaacb76,0xff1fbf84,0xffbd6fd6,0x00639fda,0x0101d4b8,0x0146f01a,0x00e03725,0xffb1b66e,0xffc0e404,0xff7a92f1,0xff3f4081,0xff58565d,0xffd8ab7a,0x006561ab,0x00c6eb32,0x008d808a, -0x00fedca9,0x00ccecc9,0x00b9faf0,0x0090f9ac,0x00d875fa,0x00a5dcfa,0x00f982a8,0x00965d65,0x00e5f041,0x009c2458,0x00b91498,0x008bc59e,0x00a2c585,0x0094ae02,0x00a0d454,0x0048bc62,0x003a151f,0x00899faa,0x00a8dad9,0x00d201fb,0x00e83be3,0x01081e06,0x00c8e03e,0x00899fb5,0x0052a72b, -0xffd45f49,0xff8b47ea,0xff3caf3f,0xff71f5c3,0xff8e8a9d,0xff8ea138,0xffdcb625,0xffc6b02e,0xffc3abfe,0x00ece830,0xffeae0d3,0x003f912d,0x004498e2,0xfff6804e,0x000308d4,0xffca7fa6,0xffd22f74,0x002179d3,0xffe31688,0xffe828eb,0x0007f143,0x006ecbc7,0x008a16fa,0x00648fc5,0x0090b381, -0x01208498,0x00e05445,0x00f4ff68,0x00cf4f09,0x00b69aec,0x00a52913,0x0093fe47,0x008a671d,0x00572117,0x0028fa5b,0xfffc60a4,0xffcfc2f5,0xff993c20,0xff4ca34d,0xff60691f,0xff738b44,0xff8df750,0xffab295f,0xffa6e74f,0xff78f2a0,0x000ad87f,0x00b07489,0x016b2276,0xffbdd2bf,0x009cf892, -0x015eedbe,0x0173ded8,0x01805ce6,0x0174a956,0x019abda2,0x01ae0d2a,0x01b0c266,0x00b52774,0xfff08e55,0x01ad4094,0x00d764ff,0x004437ba,0xfff0bd75,0x00008af5,0xfff50d42,0xfff6438f,0xffef8e98,0xffe89390,0xffe73432,0xffcd36cd,0xffb78665,0xff9ea28d,0xff892e08,0xff78930e,0xff5f4e5f, -0xff7a87dc,0xff84e88c,0xff8f2e4e,0xff91323c,0xff7c0e56,0x01022282,0x00d26275,0x016ddd20,0xffcbcad4,0xfea65cd4,0xfdf4bba0,0x00681289,0xfef550de,0xfe0db2c2,0xfdfea9fc,0xfdfc0668,0xfe22d9f6,0xfdec68f0,0xfdeb8724,0xfdfe8050,0xfee39e0c,0x0038690e,0xfdfd1704,0xfecbd8f8,0xffc08d95, -0x015c991e,0x00e12939,0x0102b728,0x00ffb9fa,0x0106d2b2,0x01092266,0x00fe77ed,0x0111a120,0x01131e7c,0x01089af0,0x01008560,0x00fd2c9a,0x010d941c,0x00f36ac4,0x00e4d2bc,0x00cb97ad,0x00e6062c,0x00f1e05f,0x0115e576,0xfeac7ee8,0x00cb35a4,0xffacc288,0xfff02aa3,0x00897e2d,0x004277c6, -0x00ce9c60,0x008feba2,0xffd2a379,0x0051551c,0x00624466,0x004300c5,0x00044752,0x00480c5f,0x004a07f4,0x0069102b,0xfeb9a432,0x00d6a0d0,0x0124e58e,0x01162ad2,0x0136182e,0x01474a08,0x01515a44,0x012fa6f4,0x01633208,0x015e3b5a,0x013efafe,0x0132fb0e,0x012b5746,0x01503160,0x010b8cac, -0x00e1bad2,0x00a96740,0x00c4d3bc,0x01071800,0x00c88f52,0xffdc38c8,0x003cb314,0xff65b63a,0x0045e593,0x0053a2e4,0x002e4c6c,0x000bf116,0x0074dc2d,0xff72263f,0x0069a339,0xff9a4a6e,0x003a6700,0x001654b2,0x009de93e,0x007e62a9,0x0045eb21,0xffc73d7c,0x006ec0b6,0x016b3958,0x012ce0b8, -0x015bc2c8,0x017104e8,0x01840fc4,0x013213fe,0x01b76dc6,0x01bbbd5a,0x0173f0ae,0x014d9f56,0x01269c22,0x01866a36,0x00ee24b5,0x009f01c5,0x006c3cc0,0x00abed9c,0x00eef171,0x008ed0e7,0x0022f23d,0x00870323,0xff945298,0x008934ac,0x00e14aef,0x0083485d,0x00c8e16e,0x0045dabd,0xfff10db4, -0xffc34ae4,0x00288fb8,0x0088e615,0x00fc2a9b,0x0152c7c2,0x006888e2,0x00e370c3,0xffaaae8d,0x0053aa21,0x0171792a,0x0148105a,0x01b3e45c,0x01eaae0c,0x01f780d2,0x0168dce4,0x02309c94,0x021893d0,0x01a37880,0x0188487a,0x016d1104,0x01ea1270,0x0109c1ce,0x008295e2,0x0039f7a0,0x004a74fe, -0x01f3e34a,0xff14bae5,0xfd60392c,0xfeb17792,0xffcfbf00,0x00089d5f,0x004c25bf,0xfff267ee,0xffa632e0,0xff8e8c16,0xffda54df,0xffdf2d22,0x00171255,0x003d0586,0x00ac330f,0x00f81b0b,0x005c3a3f,0x00ffd751,0x000ca87d,0x00c7ca49,0x021e4a48,0x013f4d2a,0x01612ca4,0x004d8768,0x00594598, -0x00cfcdf0,0x01b81e66,0x025c0f4c,0x03015ad8,0x01a0d112,0x00ed8df3,0x0115a3b2,0x0080e1f9,0x007649ef,0x00bb2b25,0x014ad4a2,0x009eb7ef,0x00c00b2e,0x0039f4a7,0x004f1bf3,0xffcb1307,0xff50dcb5,0xff819845,0xffc85abb,0xffbbbad3,0xffb9a1a6,0xffad6d0e,0x00183546,0x00222ea6,0x00152034, -0x0018af1f,0x0022f0a2,0x003c1b71,0x007505e4,0xffe1f620,0x002afbd0,0x00d1000b,0x00937678,0x013a91aa,0x00a9f30f,0x001f8276,0xff9824fa,0xff28fbdb,0xff5f4586,0x0074b323,0x005c7f76,0x006643d8,0x0000e68a,0x005dd335,0x0055be3f,0x0003455d,0xff9ed223,0xfe4d2d24,0xfcffa5bc,0xfd273d9c, -0xfe673d66,0xfec2a6ec,0xffa01829,0xffb40a6e,0xffd0c441,0xfff3a070,0x003d04a1,0xfff7cc8a,0x0023421a,0x0012a847,0xfff3a05f,0x0008f44b,0xfffe90f9,0xff771b95,0x00a40d39,0x0083bb5f,0x00621804,0x007dcf75,0xffb1dad1,0xffbec7fb,0x0050a0d6,0x00dfbaaf,0x01235c96,0x01952198,0x01cff822, -0x01f12cee,0x01da0726,0x01c9617e,0x01605f0e,0x0151d9da,0x0158c436,0x015a7e90,0xff740bf0,0x0198b412,0x01e2b4e6,0x031b04ac,0x02e38d84,0x021f0588,0x016e7eea,0x00b82b00,0x003381b9,0x003ce5a5,0x000a9b69,0xffe1845f,0x0013e4cf,0x0004c7a0,0xffd56e7e,0xfffd3cbf,0xfff5be22,0xffd5a767, -0x00a8ad02,0x00326b27,0xffe4b8c0,0x00cbcb18,0x00c976ca,0x00ddfa5c,0x003ddaf4,0xffb650c6,0xfee790de,0xff494be2,0xff17a815,0xfe8048f2,0xfe4a93fa,0xfec3a58e,0xfff7fcf5,0xffb71e22,0xfffde75b,0x01099222,0x00990155,0x04a29de0,0x01c379ae,0x000501e7,0x00fa8b97,0x010ad744,0x00db17f4, -0x00f849d9,0x00e7775b,0x00a34985,0x00a84b4c,0x00310bdf,0x00319f23,0x004205d5,0x00989bbe,0x003391fa,0x00183492,0x0025c06d,0x001f64f4,0xff77327f,0xff72407c,0xff254d8e,0xfe9bef6e,0xfeb90586,0xfee7a79c,0xff2b2bd4,0xfefea94c,0xffe005cd,0xffe050db,0xff0793bb,0xff24f4c7,0xff5c5a8a, -0x00305ac9,0x02124804,0x0382c560,0x04b50a28,0x048d55d0,0x016f1876,0x00a7f3b9,0xffbf3c00,0x00536e75,0x001d632d,0x00626e8c,0x00aa755e,0x00819473,0x00dd4514,0x00de184c,0x00d14a97,0x00970967,0x00850cdc,0x007ffe7c,0x009723bb,0x009573ff,0x008754eb,0x006129f6,0x00385012,0xffd6d019, -0x001cc0df,0x00312dc9,0x00204b1e,0xff6d8a91,0xff32482d,0xff81419b,0xffedece9,0x004df545,0x00945fcd,0x016fc196,0x02545b80,0x0357dc24,0x030d5870,0x02779e10,0x01d35c2e,0x015476b2,0x01673c8e,0x0103279e,0x007c41c2,0x00cd8be0,0x0091fff2,0x009ac353,0x0082c86c,0x00824f4e,0x0061b8af, -0x00a5721a,0x007d5e6e,0x00d83ff1,0x00884564,0x00a6ef2e,0x008cd920,0x00a55497,0x008fb730,0x009ab273,0x0078aa7b,0x011439ee,0x0168649a,0x0125dfc6,0x0141cd72,0x015f7d8c,0x01890c34,0x019c5bd6,0x01b4a77c,0x01cbce90,0x01de14cc,0x01b7acc8,0x018aa8b2,0x018c14be,0x014bc078,0x0137b258, -0x012b90b4,0x012d890e,0x00a598cb,0x0097ef97,0xff8b0d68,0x00816be0,0x0019ba47,0x001b6845,0x006deb62,0x0058b345,0x00a49d32,0x0090d441,0x00434f05,0x008994ba,0x00acdbd1,0x009de20c,0x008251c3,0x00b84c92,0x00fc056b,0x01253d54,0x00c8d489,0x015a5e40,0x012b3eec,0x012ab830,0x0119097a, -0x01084336,0x00f3ecc5,0x00de2e6a,0x00f4f7eb,0x01029404,0x0113b7c8,0x01213932,0x0132a554,0x0138b63c,0x01209026,0x00fc8809,0x00d8adf6,0x00b4a641,0x00ae479a,0x00dad3f4,0xfffb59ee,0xff6878f8,0xff1b0d8d,0x00539374,0xff82c27f,0xff168f92,0xff05a476,0xff03197f,0xff1e625c,0xfefe880c, -0xfeef0452,0xfef143d6,0xff919672,0x005d120f,0xff2bffd9,0xffacbecd,0x0048bee3,0x00f2e76c,0x00c9592c,0x00d6b10f,0x00d6bb3f,0x00d8588d,0x00dbc882,0x00dc7f24,0x00dd2ad5,0x00da818f,0x00d80e75,0x00d948fe,0x00d90086,0x00df2579,0x00d36ef3,0x00cfd7ee,0x00cd0393,0x00c5deaa,0x00c704ff, -0xffbba219,0xffcb5fe6,0xff45b019,0x00fd8360,0x01b6bba2,0x0160a20a,0x008f8bdb,0x0190f4a4,0x019cecbc,0x01b464b8,0x01a774e0,0x01542e70,0x0189808a,0x01895e46,0x016d26b4,0x0194a2b8,0x00be3ea9,0x0189bd28,0x019d2bc8,0x01028b30,0xff5817ff,0xffc16fc1,0xffad155f,0xffa2c0c8,0xffa74168, -0xffae1d5b,0xffbc85c9,0xffc5467c,0xffbec5ec,0xff9eb677,0xffa4aa19,0xffa7f3e5,0xffb68a9c,0xffc0cf1c,0xffcc771b,0xffdeca4e,0xffc671b6,0xffb8be26,0xffca54ae,0x01b9bec0,0x00122f3b,0x008cb2a9,0x00adc723,0x00589e24,0x0058754c,0x000d7475,0x003fa71c,0x00929259,0x00349e25,0x0014164f, -0x00461ce8,0x00a8f85a,0x008d6f4b,0x00bd07d5,0x00518e69,0x016189d8,0xffd4feed,0xff82ad94,0xffa4f1d0,0xff753443,0xff7a31b2,0xff8347eb,0xffa7b894,0xffc61b2a,0xffbc1f67,0xff79665a,0xff85625f,0xffa08508,0xffe4ae93,0x000a8752,0x002014ad,0x0024f45b,0xffff37e8,0xff799553,0xffa78530, -0x00db9eaf,0x006b0bce,0x003b0e16,0x00aae0db,0x00ad6237,0x00466c49,0x00b9c62a,0x000fa167,0x0059c769,0xff963d8e,0x005bd75f,0xffff0843,0x00d6b772,0x00a766db,0x00bfb9ac,0x009070b6,0x00d606de,0x00007155,0xff44752f,0xff7ecd1e,0xff2bb16a,0xff3f0f32,0xff5f1daa,0xffb4f54e,0xffe87fcc, -0xffca38c7,0xff1d3142,0xff3f6f74,0xff574210,0xffbc4f37,0x0020c891,0x004bceca,0x0025a330,0xffff43d9,0xff8cdf72,0x00019102,0x011f338c,0x005b2c72,0xff8970d7,0x0069f30a,0x009c4475,0x004aa6b7,0x0080e121,0x0040c0fe,0xff7da7af,0xffc179e3,0xffed1859,0xfff82d04,0x0095b356,0x0089ad4b, -0x0113d0fe,0x0033d5ac,0x00c3ba60,0xffcdd5f6,0xff0a0ffa,0xff5b76b8,0xfede5ce4,0xfef82878,0xff21befe,0xff838197,0xffe9c387,0xffaa3cf0,0xfec3a482,0xff1e8564,0xffa0d19c,0x0075e33a,0x0124cc22,0x014d95ec,0x0097a66a,0x005b0595,0xfe97d494,0xff6ebd61,0xffa87e9b,0xffca1c78,0x0142fbcc, -0x00e5695d,0x006f5947,0x002fe4fe,0xffc1917a,0xff949321,0xffc51ea3,0xffda2c9a,0x000be95d,0x004e19ac,0x00a0905f,0x009b1a11,0x00effba5,0x0050d665,0x011b6e12,0x00ded96e,0xff09cfb8,0xff1f7743,0xfe8ea42e,0xff01d95e,0xfefc3670,0xff4441aa,0xff2f10b3,0xff165fd0,0xff75d220,0xfe31391c, -0xfda377e0,0xfe30bdc0,0xfdfaf71c,0xfe427486,0xfecd3190,0xff7038bd,0xfe1daf20,0xff778de2,0x012b52ce,0x005b19ca,0xff3ce125,0xff1371ff,0xfefab764,0xffa18b76,0xff99b6ec,0xffc067c2,0xffa71363,0x000421d2,0x000ea768,0xffceac8d,0xffc78e2c,0xffe2cec9,0x0035c818,0x007da0ac,0x00eda40f, -0x00307c39,0xff6de15e,0xff812fc4,0xfee6e086,0xff569b7a,0xff7c4028,0xffb6db74,0xfff7345b,0x0028d057,0x007693f8,0x00384c63,0x008aa7b8,0x0105b4cc,0x01825f58,0x0142c612,0x0050ae49,0xff241d2f,0xffdacc60,0xfdd44198,0xfe009114,0xfe4c314c,0xff38d00d,0xff98b609,0x0033a992,0xffd892d9, -0xfffd45ee,0x000b8819,0xffee8af0,0xfffef89b,0xfffe7413,0xfff5843e,0x00417a10,0xffd857a4,0xffae869b,0x004a28e3,0x00d9643b,0xffdb95ea,0xff2c852a,0xff6a4910,0xff250a65,0xfe960462,0xfe3d9688,0xfe3c1800,0xfe4ed99e,0xfe3216f4,0xfe41daec,0xfd8799b0,0xfd3e9fc8,0xfd9aa7e4,0xfe6e99b0, -0xff7eef1b,0x00019aae,0x008cb32d,0x00189f38,0x0161d67e,0x029fef94,0x023b6cb0,0x01ece1d6,0x00d3f0e5,0x00449016,0xffe44d2c,0x001cda0c,0xfff8f101,0xffe9f195,0xfff87726,0xffec299d,0xffc9baff,0xffda0e01,0xfffba65b,0xffae702c,0x007b7c62,0x00f576ef,0xffb24b2d,0xff45fcbf,0xff3c72e1, -0xff5939ea,0xff5a11a7,0xff61a70b,0xff20b179,0xffbdd0c4,0x000105cd,0x0007d9c7,0x001428bd,0xffd025ed,0xfe6f3b58,0xff0469a0,0xfe7f774e,0xfd438d24,0xff434dd4,0x0363301c,0x03dd24dc,0x035dc870,0x02343938,0x01a132d8,0x0190c046,0x01496730,0x0120e788,0x00faa3cf,0x007653c9,0x002729c4, -0x000375ee,0x0029c06c,0x0094676b,0x004c7590,0x002aeee9,0xffd29453,0x000c8d57,0x00409ac2,0xff5dfa97,0xff3f1bae,0xff1576c4,0xfeba13a4,0xff0f5557,0xff57c444,0xffa8afc0,0x0034cd6f,0x003ce88b,0xffa9ff9a,0xfecc7e6c,0xfe39024e,0xfd9c4ff0,0xff75759c,0x012e6322,0x022c09d8,0x036554c4, -0x00e99f53,0x01535524,0x017fcd42,0x0137bd4c,0x0103fc1e,0x00e9d344,0x00b42357,0x00c93009,0x00bf7513,0x00bff890,0x008ffe69,0x00b1185c,0x0089e877,0x0051e3d1,0x004da7c1,0x0071dc4f,0x0086e979,0x0083b555,0x002e0195,0xffdb6dcf,0xff7bd67b,0xff5aa270,0xff649291,0xff024af2,0xfedc2516, -0xfed6f74a,0xfec1d468,0xfee9df04,0xff71ed4a,0x0029de4f,0x00d431ef,0x011cbfe2,0x019c2e2e,0x01b39728,0x0163950e,0x015371a2,0x0087d062,0x00d4fb84,0x014a8d7e,0x010b95a8,0x01431c50,0x00f6bd82,0x00b5fb01,0x006e837f,0x00a33e3f,0x0072cf6a,0x00d475db,0x00642e9c,0x00b2fbea,0x00761817, -0x00b11c80,0x00946848,0x00b2a8ed,0x00d195e3,0x0131315c,0x01005894,0x00afaca0,0x00d7e730,0x00cddf9d,0x00f9f45a,0x01207a80,0x0148c360,0x016124d2,0x01856876,0x01a2bb62,0x0152e870,0x01159efe,0x00eaab0a,0x00ce2286,0x00bbe1c3,0x0097370a,0x00b8ec57,0x00686f61,0x008190f1,0x00dffab8, -0x00703510,0x00aa8c59,0x0099d60a,0x007edb8f,0x0087e205,0x00747d8f,0x008fbacb,0x00dfa24a,0x00b526bf,0x00a028c6,0x00c3c00a,0x00e82dfe,0x00c41b43,0x00d11754,0x00b6f718,0x012aae1a,0x006d9871,0x00730ff8,0x008ccb82,0x00877e4e,0x00960630,0x0093ad4b,0x00963820,0x0067d419,0x004483dc, -0x003475af,0x0032d8f4,0x00389aa5,0x00358f26,0x0040946f,0x004f0c91,0x005ad2d2,0x0069bca3,0x00540bb6,0x003a21a8,0x00da2256,0x011be90a,0x00d1fa1c,0x00b58f69,0x01180c86,0x00fa8d5c,0x01071eae,0x010ddcc4,0x00f1f9cc,0x011526f8,0x0122174a,0x011b00cc,0x0135fcd0,0x00c240ba,0x011b3e02, -0x0127011c,0x00ce5287,0x0015178e,0x004f22d5,0x004a5daf,0x0054ff21,0x0058b1ae,0x005f1b1e,0x006db05e,0x0063f805,0x005f4c83,0x00543c6d,0x004b778b,0x0041a699,0x0038be64,0x00432641,0x0047c4f8,0x004ab372,0x004e4292,0x0055df71,0xfff656a2,0xfff1322c,0x0029963a,0xfef17996,0xfec5da6c, -0xffa71cad,0xff3c113b,0xfee2bd36,0xff6e2689,0xff7252df,0xff76fd06,0xffa361e4,0xff865756,0xff8c83cd,0xffaaa8ad,0xfedac662,0xff28602e,0xffde9a8e,0xfeea8352,0xfefabe70,0x002f7539,0xfff65ee1,0xfff472e6,0xfff34bd4,0xfff3e2df,0xfff49feb,0xfff73947,0xfff92452,0xfff26238,0xffd6e746, -0xffd84b9a,0xffd69e54,0xffe75bec,0xffd118ac,0xffd6822d,0xfff427dd,0xffeda8ad,0x000fa00c,0xffbf5da2,0xff2c7586,0xffdb5080,0xff501f3e,0xffa936fa,0xffd98e8d,0xffbef49a,0xfffc0697,0xffb397ff,0xff47e8bf,0xff76590b,0xffad0350,0xff8ed316,0xffb5d29d,0xffdd509c,0xffa9e879,0xffdb2964, -0xff48aeb4,0xffb93f80,0x00060c83,0xffc909da,0xffd97209,0xffd67b12,0xffecde88,0x0002e1c5,0x000922f4,0xffe795e9,0xff9bef58,0xff97ca3e,0xff905f39,0xffbece47,0xff7a854e,0xff8dcf3c,0xffe41eb0,0xffd64291,0x001a3cd7,0xffa6b65b,0xff2aff7d,0xff9dcfdc,0xff47087d,0xfff9b4d7,0x000b4751, -0xffd6fa92,0xffe366f6,0x00388124,0xff601ea5,0xfffe96c3,0xff90017d,0xffccf74d,0xffcbb86a,0x001ba251,0x0046244d,0xfffc7057,0xff6f88c5,0xffa8b54a,0x001d60ed,0xffc41dee,0xffc23a93,0xffbd972f,0xffd42eb2,0xffdfddc8,0xfff866bf,0xffc527ff,0xff3333f3,0xff2bb258,0xff17019f,0xff8639eb, -0xff031252,0xff416dba,0x0004a188,0xffbafa93,0x006badf0,0xffe9755c,0xfff95e9d,0x0036fa49,0xff7c2224,0x00231c37,0x00a06761,0x0069ea49,0x00aaa597,0x004d2ccc,0xffe9fed3,0xffc92c31,0xfff9583d,0x004c5fda,0x00a44c44,0x00d54a37,0x006ea9b5,0x00828b09,0xff9cdd89,0xffb2c91d,0x0004ef3a, -0xff72cab7,0xff737a90,0xff73d40d,0xffaca473,0xfffb2609,0x0002c141,0xff9514d9,0xfed043d2,0xfeb94e46,0xfeb4a754,0xff530a1f,0xfe7cd008,0xfef623f6,0x0016bc81,0xffd260f9,0xffbdf2ac,0xfe4fa72e,0xfcb004ec,0xfe002f10,0x0077e5ac,0x0026343c,0x000fd658,0xffddafa9,0xff9f573f,0xff835414, -0xffbb819a,0xffed2cbd,0x001bb0b5,0x000a4e33,0x0051f3ff,0x00a21044,0x00b572f3,0x0079341b,0xffab4a46,0xffc6ab8a,0x007b4e59,0x0066aa3d,0x00c5ea62,0xffb9d565,0xffe4b171,0x00c7ff23,0x00f1971c,0x00e66714,0x00cb63b5,0xff20999d,0xfe7a3016,0xfed6581e,0xfe863b4e,0xfebef91c,0xff426e44, -0xff9baf99,0x0054f2fb,0xffccd2a8,0xffbad819,0xffde67ef,0xfeab891a,0xfe9b6ef0,0xfefecbf8,0xff66222a,0xff9c3e3e,0xffbb7456,0xffad4d19,0xfffce215,0xfffe126d,0xfff00445,0xffedce42,0xffc4ea6c,0xff7b27fa,0x003dadcd,0x0029ae87,0xffba7984,0xff880f63,0xfedd31ee,0xfec9dbd0,0xff27b3c4, -0xff39c2b0,0xfee12326,0xffa110ae,0xffe316dd,0x003d7747,0xffff8bbd,0xff853d36,0xfee1bdb8,0xff0e7d21,0xff28a9bc,0xff6eba0e,0xff8ca146,0x004c6018,0xfea95872,0xfe270226,0xfebcc1d0,0xfec67e62,0xff9d15f4,0xffe32a35,0xffd5e2b2,0xffce4e72,0x0013b164,0xfff20ceb,0x0007d5ec,0x001170b4, -0xffffa30f,0x00228ad3,0xffde5e41,0xff4034ef,0x004ae5ff,0xfffaba76,0xffa2179e,0xfffea43d,0xff69ec63,0xff387225,0xfef165a2,0xfed4075c,0xfe9b8c5a,0xff565a35,0xff6b567d,0xfef36fde,0xff5f95e6,0xfed83838,0xfd1b3264,0xfd4371d0,0xfdab3620,0xfe1e6922,0x0013b4e2,0xfcdc1610,0xffc0cbe3, -0x01882b5e,0x0176869a,0x015181aa,0x00601ebe,0xfffd0bd6,0xffbdc77b,0xfffb583c,0xffe31f94,0xffbe429a,0xffe2d13c,0xffe3ad91,0xff949f88,0xffb5a6f1,0xffaeb9fc,0xff84236c,0x00695013,0x002687e6,0xffc8f257,0xffa73cd3,0xff2e12a4,0xff584870,0xff069532,0xfee2937e,0xfe91b5a6,0xfe998160, -0xfe927f32,0xfe772af4,0xfe982034,0xfe8a2ca4,0xfe3a8bc0,0xfdf5c42c,0xfcc57950,0xfa4614a0,0xfb4d88d0,0x014ce95a,0x017e808c,0x01a26e4a,0x0180a8c4,0x012df2e4,0x013fa602,0x013d06b4,0x00ca2cc0,0x00752a86,0x004c643f,0xffe340e4,0xfff5efaa,0x001b9dfa,0x00561db8,0x003822ee,0x00185f5d, -0xffd6b3e1,0xff9a0612,0xff2bfed3,0xff5124c6,0xff6c4918,0xff2f7db1,0xff42f3aa,0xff003ff5,0xff12d668,0xff50907b,0xff0be6b7,0xfe9f560a,0xfe2bc2ba,0xfe026da0,0xfd8606e0,0xfcc90e58,0xfd6871b8,0xfe85ca1a,0xfff23b38,0x00b49b32,0x00d03a7f,0x0007aa23,0x005fdbb7,0x00654dfc,0x006531cf, -0x0078d93b,0x00bb0841,0x00aa134b,0x00cf15f5,0x00d0ff6e,0x00d2a049,0x00b3e737,0x0085dcc0,0x002fd7d7,0x00042771,0xffe2b73b,0xffe7f962,0x0033a667,0x0034ce64,0xffdf988a,0xffb9c6b7,0xff6e1082,0xff361639,0xfea13420,0xfe49d250,0xfdfa1720,0xfdefe564,0xfe64fc16,0xff4a3bfe,0xfff2e72d, -0x00d74df8,0x01b172ec,0x0282340c,0x027f0c1c,0x01f8c63e,0x0133dedc,0x0107adc4,0x00b7dee5,0x00406a81,0x005bfb8f,0x00521609,0x004fccb2,0x003ffcd6,0x0034380c,0x00297ce3,0x0051872b,0x00273d25,0x00697bfd,0x005b2d44,0x006c3324,0x0070b624,0x0078a87b,0x006f7761,0x0072ed39,0x0068cf50, -0x009e82fa,0x00d1e5e3,0x00c5197c,0x00d806e2,0x00ee5dcc,0x0110bbee,0x012b6190,0x014f766e,0x015db4c2,0x0167a0f8,0x0144afa8,0x012f39de,0x012bb954,0x00f0e7c1,0x00d9946b,0x00e1e321,0x00e0ca70,0x008955b1,0x006aa551,0x003d7281,0x0084bb51,0x004ca4e3,0x00595590,0x00776a48,0x00706d23, -0x008d6b3c,0x005ed9a0,0x002d5d8d,0x003cf209,0x005b3b3b,0x004219ce,0x003f1533,0x005a1d5d,0x004fd2d0,0x007b5527,0x0056f5d8,0x0084e4d8,0x00a189f3,0x00ac0247,0x00c06d2f,0x00d00bd9,0x00dc906c,0x00ebce26,0x00e5cf50,0x00e08689,0x00dacbad,0x00d7731a,0x00d1903a,0x00cc5d86,0x00c8aa1c, -0x00b89c0d,0x00a3a2ed,0x00874472,0x00a09c45,0x00b0f454,0xfff780d9,0xffd450d8,0x003a22b8,0x001dcee7,0xffd80608,0x0011a136,0x000c3bdf,0x001310c2,0x0030cae5,0x00229bd8,0x001fb164,0x002ad0b3,0xffc46113,0x000e0f76,0x003020fe,0xffd15ede,0x00009658,0x00b22f64,0x00a6786c,0x00b22ab6, -0x00be74e3,0x00c7ea05,0x00d3940f,0x00e373a1,0x00d8736d,0x00d126cc,0x00c8d80d,0x00c13a04,0x00b87af8,0x00acc7be,0x00a8e989,0x00a72890,0x00a8bb83,0x00a5d5b0,0x00b444b3,0x00b35fac,0x00925998,0x0080d9d3,0x012f7d5e,0x00dad2d5,0xff7bdcd2,0x0140c0ae,0x00f36d20,0xffdd8f77,0xffe125b7, -0xffd795f4,0xffab476c,0xffae98c5,0xffa67b07,0xff8bd6c9,0x00eb48fa,0x01436322,0xff88b77c,0x00e071c0,0x013b6a28,0x00a19708,0x00a235d4,0x00b20691,0x00ae603c,0x00ae7c69,0x00b3a63f,0x00c9ea26,0x00baac1e,0x00b24822,0x0096d524,0x00b0e205,0x00bbbf4c,0x00c7998c,0x00d51506,0x00d04324, -0x00ae75c4,0x00aba868,0x0079b7e0,0x00c458ce,0x0094e5bd,0x00d9acec,0x00b10da8,0x009f76c5,0x00b901c7,0x0099f780,0x00b4eb56,0x00df455a,0x00da5329,0x00cf52e5,0x009a5ce3,0x00bcbefc,0x009a2057,0x00a9eae3,0x01173c6c,0x00c60741,0x0076ee44,0x00eef503,0x00bbc437,0x00e8d9b2,0x00de826b, -0x00d771e3,0x00dd4706,0x010d7dfc,0x00df5d0d,0x00c30b1e,0x009598f1,0x00d19d7e,0x01042df4,0x013001f4,0x0157d100,0x0137aae4,0x00c604a6,0x00b9f999,0x0064eef4,0x006f1a89,0x00e0a4d2,0x00af1062,0x00392307,0x00a87505,0x009c050c,0x005b1d9e,0x008bdf6f,0x0054a74d,0x006fd72c,0x00291aca, -0x00341b42,0x0060aab6,0x009bff41,0x00d43869,0x00f39606,0x00d43be1,0x00e7a05e,0x00c86db7,0x00d17894,0x00f7c54c,0x00ffb08d,0x00fab0e5,0x01156aa2,0x018ce31c,0x013066b8,0x01054642,0x00845152,0x00fa7614,0x01476da0,0x01823a82,0x01e98636,0x01a00aae,0x00d62fdc,0x00d23a8f,0x00347739, -0x0072e20d,0x013cce04,0x00ffdd4a,0x000a1406,0x0087e424,0x0099c8c4,0x00389b11,0x00898044,0x0058ce43,0xffb4dbfa,0xffb1bd2f,0xfff7922d,0x0021f905,0x00a3f313,0x00c8b9ac,0x010d5668,0x00af96cf,0x00b4304b,0x00aa63fe,0x00ee1d7e,0x014aa4c4,0x0159b4dc,0x0151a8f6,0x018085ce,0x02170b18, -0x017206de,0x00e04654,0x00518aa5,0x01322d86,0x01ec89d0,0x0261df1c,0x02d0e8e0,0x02447b0c,0x00ce909c,0x00c530ab,0x00e24aa7,0x00a7151a,0xff2d0fe8,0xff4f0ac8,0x0110e6b8,0x00a59fc5,0x006ffbfe,0x0032ee55,0xffdfeac4,0xffbd9c2d,0xffbe6820,0x00034a83,0x0026d66e,0x0018d66b,0x00668192, -0x00ab10e8,0x0136ae3e,0x00df2ffe,0x00f7219a,0x0117f468,0x00e29592,0x00904e3c,0x0010b535,0x0031c563,0x00241e06,0x0015c7a3,0x0075d09b,0x00b999fd,0x0118e012,0xff7ed381,0xff88cf70,0x010a8146,0x010c871e,0x0115699a,0x00b690b1,0x01286fc8,0xff97cd85,0x002de5fe,0x017ae026,0x00db3fbd, -0xffa2a876,0xff42ab9e,0xff29145b,0xff7d0e4c,0xff9e51ce,0xffd98b7c,0xffc201ce,0xfff2a091,0x00077c07,0xfff4832e,0x001a936b,0x00167d03,0xfffebdaa,0x007645de,0x008dc7ae,0x008e8b50,0x00df87a4,0x011c57b4,0x015cc394,0x00d68beb,0x00794376,0x001ecfa8,0x006d0c71,0x0041ef3e,0xfff98fcb, -0x0061b325,0x007b67c0,0x0017d833,0x010fd2ac,0x00bdb92d,0xff304628,0xffb9fea8,0x012aff9e,0xfff5ef33,0xfeec377a,0xfeeecb62,0xff4c6403,0xffb63539,0x00231e63,0xfff03f71,0xffe8041d,0x000782b8,0x0012a369,0x000a5035,0x0009c346,0x00049107,0x005ad017,0x001edee4,0xffbce851,0x0088234e, -0x00d9b487,0x002f15a8,0xffbbab6a,0xff9828cf,0xff8fdf65,0x001327c5,0x00b3f419,0x01224be4,0x01883dd6,0x0100229e,0xffb91600,0xff9ea977,0x00663ee9,0x0192a732,0x02f7a6b8,0x03539e74,0x0334c470,0x02099c10,0xfe683aac,0xff29be01,0x00a80761,0x01245d1e,0x00c32ccb,0x00310bc3,0xffabd298, -0xff8dc61a,0xffdb8513,0xffca1e4e,0xffc1afe1,0xfff3bf23,0xfffa03ee,0xffc21402,0xffd38bb6,0xffdfd59e,0xffd67829,0x0063cf36,0x007f0625,0x003a740f,0x002e108e,0x004a8136,0x007a8100,0x00967003,0x007ad0d2,0x0021094f,0x0071fce4,0x0095f5ed,0x00ad78fb,0x009d83c3,0x0061aae5,0xff74537a, -0x01a263d6,0x01eb20a0,0x0100cf4c,0xff3045ff,0x05d87000,0x050e9558,0x02d1ad80,0x028980f4,0x020c1e4c,0x01eb1e88,0x01b57534,0x0147963a,0x00da67f4,0x00851f54,0x003ba6eb,0x001184a1,0x001f1495,0x005701b5,0x0038db1f,0x0016cf10,0xffc6262a,0x000ca466,0x000f5ccc,0xffeae857,0xffc5a55f, -0xffafaf83,0xffc49d42,0xffd5ecae,0x005b4007,0x01321752,0x00ce52c4,0x00b9717e,0x0137a20a,0x0081f986,0x00306b8a,0xffc800fa,0x0077a3aa,0x01b7afa0,0x037d5cb4,0x04f75f78,0x02708ea4,0x021f663c,0x0120f89e,0x01745916,0x01178404,0x013c9e1e,0x0117034c,0x00e5a349,0x00f86c33,0x00ea4cb9, -0x00ded5c1,0x00d81642,0x00a1b0dc,0x00348df1,0x001243f7,0x0026b050,0x0058d97b,0x005fa2f1,0x0034c59a,0xffdf2329,0xffbb5695,0xffa0e0be,0xff8151e4,0xffa1c856,0xff6f2cc4,0xff0a46f2,0xfe876fd4,0xfe56fcdc,0xfea07126,0xff42b3f4,0x00786f4f,0x02219594,0x02cd7890,0x0327e354,0x030a6884, -0x02b4bed4,0x01bad0dc,0x01829eaa,0x016fa240,0x014c4666,0x01060202,0x00e13267,0x00abad74,0x00865eb7,0x0077464e,0x0079cc7f,0x008489d6,0x00833946,0x00736511,0x0092d4cd,0x0093de52,0x009bba51,0x0095fdb9,0x00a2d942,0x00ee2c33,0x00cbd9ca,0x008fd89c,0x00926eb5,0x0068b62d,0x0093e561, -0x00b68271,0x00dd0461,0x016cf6e6,0x01f12482,0x02646110,0x02893868,0x02983dc0,0x02b90bd8,0x02593d28,0x022a68dc,0x02061068,0x01e83082,0x013e6a2e,0x0146e962,0x008d48d7,0x011305f0,0x00f92ed0,0x00edf989,0x01158a6e,0x010ecdfe,0x01269728,0x0136fa62,0x013487c6,0x014414b8,0x01248cca, -0x012759bc,0x00f3281b,0x00ce1b62,0x00f53eae,0x00b6f8c0,0x008e57c7,0x00621b38,0x00649e03,0x0095ca49,0x00aebbd0,0x00cd9ee1,0x00e7b7d1,0x00fb0a7b,0x01048442,0x0113268c,0x01370594,0x0163fdec,0x019d4f6a,0x01e45e1a,0x01c5548c,0x01ab0750,0x0186aa84,0x016536b0,0x013854b8,0x0140961c, -0x0161f56e,0x011a5e52,0x003e7d25,0x017bd3bc,0x0126d318,0x006d220c,0x0065663f,0x005f5c68,0x00503b60,0x004cc15e,0x0049d0b0,0x0040c9e9,0x012dc5f2,0x015fa88a,0x0041206f,0x01107ac2,0x0137130c,0x00dda0b6,0x00fa3ab6,0x01028556,0x010b384c,0x011355ca,0x011b35a4,0x0125adc8,0x0134729e, -0x0143237c,0x014d03e2,0x0159504c,0x0160d180,0x01744dde,0x015f75f4,0x015812ca,0x014efb78,0x014c0618,0x015d305a,0xff3dfedf,0xff5b3a16,0xff107ddd,0xff3c3352,0xffff41df,0x01579af6,0xff0cfeb8,0xffe1b59d,0x01117c2e,0x0125d44e,0x012a214e,0x012fa7bc,0x013a85bc,0x01415d2c,0x015299b0, -0xffe85f0d,0xff26eff3,0x01973db8,0x000f1941,0xff596177,0xff2cce5e,0xff5a7cd8,0xff3b6dc2,0xff3725f3,0xff31cf50,0xff32cdce,0xff44f5eb,0xff3563cd,0xff2c9380,0xff19cc41,0xff1a6b0a,0xff19d256,0xff2250c2,0xff1fd5aa,0xff2d8a06,0xff5b1411,0xff4698c4,0xff49de70,0xfee7c7e8,0x00626f17, -0xff543e20,0xffa9da2f,0xffdaa55b,0xff92cfcc,0xffa8b0df,0xff7cd320,0xff642a43,0xff83b71f,0xff42fc17,0xff6bf713,0xff719153,0xffe537ba,0xffe0c827,0xffb24c8e,0xffbd30a0,0x0082e825,0xff2e19ec,0xff3a5986,0xff0780b6,0xfef1a7f4,0xfee3b3dc,0xfeef58c6,0xff209157,0xfef63732,0xfed387c8, -0xfea57e28,0xfe9f55c2,0xfea620de,0xfecc9d72,0xfeca2a90,0xfef648d6,0xff64dfab,0xff3ae6b2,0xff367f4c,0xfee558e0,0xff62fe5f,0xff7df275,0xffcdc316,0xfffd6727,0x0001d14c,0xffcbaea5,0x000d837e,0xfffc253e,0xffd72de5,0xffa1629b,0xffdf17d9,0xffac2530,0x000738d6,0x0000306e,0x00494651, -0x001bc0e6,0xffef2763,0xff7e8fe4,0xff2413df,0xfef3e7d0,0xfeb48ccc,0xfe9b6d9e,0xfea6c56a,0xff038d06,0xfeb8c0ee,0xfe82b734,0xfe189454,0xfe15d7d2,0xfe1731e2,0xfe5853ee,0xfe663ae4,0xfec019fa,0xff988262,0xff43479a,0xff2a5f80,0xff05ffaa,0xffee2060,0xffcd84e4,0xffafc885,0xfffc9d11, -0x004ae220,0x002f5e14,0x0066f08a,0x00483dba,0xffdd7d94,0xffcc7cdc,0xffd0ef22,0x0015bc30,0x005dc31b,0x006b870a,0x00bd5e67,0x003b3e84,0x003b3cfa,0xff9ae380,0xff0ae7a0,0xfe9331c8,0xfe1ef5d2,0xfdfb4620,0xfe21f584,0xfec0d2d6,0xfe4b0fda,0xfdc6bab0,0xfd440984,0xfd44cbb8,0xfd859f54, -0xfdf2b1cc,0xfe1297a8,0xfeb84b72,0xffeb1652,0xff7e4c5c,0xfe2b98ec,0xfe9c6a3e,0xfdcfb07c,0xfe57dae8,0x00dba557,0x006f959e,0x001376f5,0xffe49092,0xffc270de,0xffa2ffb4,0xffb1a047,0xfff89f3e,0x001275fc,0xfff88ab6,0x002ba0b0,0x0057c0d9,0x00d80499,0x0014d94a,0xfffb1f41,0xff62e575, -0xff0b8648,0xff89cf31,0xffa37afb,0xffb20b49,0xffca4872,0x003977f0,0xffdb94e6,0xffbaffa2,0xffccc2ac,0xfdd1a030,0xfd1a85c4,0xfd8849dc,0xfdbe8254,0xfe1b860e,0xfe69ba4a,0xfe636196,0xff97a433,0xff71196d,0x0010dae1,0xfff03291,0xfeb6c6e0,0xfeddc132,0xff2e004a,0xff85a378,0xff93aa4c, -0xffbb6905,0xffc093eb,0xffea0d3b,0x0002f816,0xffffe3cd,0xffed92b6,0xffb88788,0xff82e536,0x002a0c98,0x008861b4,0xffd0fedc,0xfeef56f4,0xfe51ec08,0xfda2943c,0xfe2fc694,0xfec88874,0xff445600,0xff9e6093,0xff80aae3,0xff18defb,0xff17a3e7,0xff13bc8b,0xfed05040,0xff0dfbae,0xfef095f6, -0xfe963772,0xff387690,0x00578a15,0xffe0dc25,0xff82f254,0xff47e5f5,0xff7560ac,0xff8aa06f,0xffe1e65f,0xff9d6570,0xffacf6d6,0xffe8ef8e,0x00026610,0xffe4a46c,0xffe8d90c,0x00028ba8,0x00101b57,0xffb16010,0xff932092,0xffdbcb2d,0xffbcc975,0xff6a1371,0xff654059,0xff665591,0xff6bafaa, -0xfe74fa98,0xfdabd810,0xfd388f74,0xfd532f84,0xfdc6ad18,0xfe29ad42,0xfda3bd24,0xfcb3fb2c,0xfb684c80,0xfbef0130,0xfca76f28,0xfd51f0e8,0xffd2130b,0xfa22ede0,0xfe28550c,0xff8d7691,0xff9be021,0x002919c2,0xff440a43,0xff45d12d,0xff26633e,0xff9e335d,0xffacab69,0xffa64aa5,0xffe0f66b, -0xfff92533,0xffb3df40,0xffb5e64c,0xffb22a16,0xff9999c9,0xffe6d582,0x0027885f,0x00139b73,0xff41abc3,0xfeb58d08,0xfe8eb994,0xfe86945c,0xfed8df0c,0xff4c952a,0xff11e52d,0xfee5cba8,0xfedcf0be,0xfec260b4,0xfe993374,0xfe6b79f6,0xfcba85c8,0xfaf25190,0xf8f3a138,0xf929c558,0xff7c5b7a, -0x01f5b2b8,0x03750960,0x02619658,0x01ae4c84,0x02082d74,0x01b2f3b4,0x00d3d9e7,0x00912e82,0x002b330c,0x000fdbcd,0xfff111c1,0xffedf6af,0xfff4f409,0x00089ad9,0xfffb6005,0xffb0f8cb,0xffbff440,0xffbdae4d,0xff73514f,0xff8597f8,0xffbb4202,0xffc816c6,0xffb5fbbc,0xff63e100,0xfeb5255a, -0xfe1c6752,0xfdafc79c,0xfd685d88,0xfd9da308,0xfd387b54,0xfc64c3f0,0xfb58ab78,0xfbc5ae88,0xfd6dd99c,0xfe8e9d9c,0x006114bc,0x005d259a,0x0176abf0,0x00f64c6a,0x00fdd41d,0x00df31e6,0x00d0822a,0x00af3a60,0x00b8b5e4,0x00c6b686,0x00cb5495,0x00b07d31,0x00700825,0x00207ee4,0xffd5ebe5, -0xffbf5c8e,0xffc8b97a,0x00217b67,0x0028dbd2,0xffeaeff4,0xff51e9b0,0xfed7d966,0xfe8b3fb6,0xfe461258,0xfe11bd3a,0xfe0e8b52,0xfde635cc,0xfe20bfaa,0xfec16222,0xfeb23a46,0xfec96028,0xfee0e2f8,0x007190ce,0x0116da62,0x01038ce0,0x00c50c1f,0x00fdfda6,0x00e52a33,0x00c48b30,0x008af574, -0x00966d68,0x007c16c2,0x00761ec5,0x0056b005,0x006d925e,0x0060ebfe,0x005fb35d,0x005e778f,0x009189d3,0x00971b0e,0x00963159,0x0074475a,0x00674d51,0x0030c1a5,0x001ac937,0xffb7fe13,0xffaf3f2f,0xffdad9d4,0xffe534c3,0x001fa6e0,0x0049d3db,0x0079094b,0x008ca416,0x0095943b,0x009ebcef, -0x00cb2145,0x0116bea4,0x014317c8,0x012d904e,0x01258d44,0x01493280,0x012cd924,0x00dcc0cf,0x00d358a8,0x0148dadc,0x00e2e7d8,0x00e98242,0x00f77268,0x00cc035c,0x00cbd780,0x00a84cc8,0x008637c3,0x008cb179,0x005fe6e0,0x00593f4e,0x0044ef80,0x006725c4,0x006c9cb7,0x00396d76,0x0052d721, -0x00814d31,0x005bc66b,0x009ea263,0x00a3e456,0x00b8e60f,0x00cd3ead,0x00e459ed,0x01027caa,0x00f1b26c,0x00e2189a,0x00c63940,0x00b2aff1,0x008f4262,0x007f0fd9,0x0094819b,0x00a90440,0x00b705e9,0x00be42f3,0x00b3c1f2,0x00ac8d0e,0x0096aa59,0x00e7dea7,0x01851262,0x0074af8d,0x00d43b01, -0x01631f92,0x01677ace,0x016dd208,0x0172dfc0,0x017c4ab6,0x018573fa,0x018c9bcc,0x00ae1be3,0x004df3e9,0x016efce4,0x00af853c,0x00611b53,0x008432a9,0x0093ea81,0x009859f2,0x00a8f788,0x00b0feac,0x00b8a079,0x00c58021,0x00b68f40,0x00b0dd7c,0x00ada51d,0x00a585d9,0x009fc399,0x008ee4f9, -0x0098be29,0x009b53c3,0x00a01d14,0x00a6a019,0x00a01200,0x00fed749,0x00c80a05,0x0126eba6,0x006b7a11,0xff84f0a3,0xfe7598c4,0x00d9a4cd,0xffbb0d34,0xfea4634a,0xfe988bde,0xfe983fd8,0xfead30c6,0xfe81d64e,0xfe7b29c0,0xfe791e40,0xffb1f74e,0x00ba724f,0xfe7254e8,0xffa6c140,0x00793345, -0x013d7720,0x00e9a8e7,0x01079f24,0x0107a2f4,0x01053820,0x010630cc,0x01118072,0x00fc6e7b,0x00f6d8b0,0x00f433cd,0x010119bc,0x010a6344,0x0113f28a,0x0118f464,0x0108be80,0x00ce90da,0x00e3b02b,0x00bfc14e,0x00fa0852,0xff3e456f,0x00df2b7b,0x00429724,0x00274217,0x008b4583,0x006a1039, -0x00c955df,0x00c57578,0x006fe0af,0x00ab17bd,0x0092c6f5,0x008b2c33,0x00384c5f,0x006968af,0x00addcdf,0x00afd69e,0xff7c877b,0x0122b2f2,0x01398b78,0x01430a10,0x015796d2,0x014e9cc4,0x014a75d2,0x01586eb4,0x01194ada,0x01048be2,0x010ea1b0,0x012673ac,0x0141d5ee,0x014f54ae,0x015f65fc, -0x012faad8,0x00a19b06,0x00c080ea,0x00a2138f,0x00787ddb,0x00299437,0x007315e8,0x000923a9,0x00480def,0x003691c9,0x003b233e,0x001f064e,0x006e31ec,0x00296e2b,0x0083501f,0xffe94f5b,0x00609c83,0x002aed40,0x009db293,0x00b77ba1,0x00ac4dd8,0x0076a721,0x00e00c07,0x01860b4c,0x016f7ce0, -0x019fd944,0x018aadf0,0x018e193e,0x01b9aa68,0x01443abc,0x0127d9a8,0x012897a6,0x01649474,0x019fbcc4,0x01c0f29c,0x01e6712a,0x0179c816,0x0064f8e7,0x009c7e6a,0x00425b1b,0x0009d5fc,0x0021cdd6,0x00ab2c4a,0x00304513,0x004814d6,0x005fe590,0x002845ea,0x00786315,0x00574ff3,0x000fd7ea, -0xffc5aabd,0x00032fc7,0x004532da,0x009cc764,0x00edea50,0x00c1ddda,0x00ec4d08,0x004f9c8f,0x00e24128,0x01c69a8c,0x01cb6aee,0x022673a0,0x020d4728,0x020f4af4,0x02221990,0x01610f56,0x00f66624,0x0119948c,0x0182f94c,0x01e9ddb0,0x01fb2536,0x020caf90,0x01588878,0xffdb603c,0x00102fdf, -0x01d3295c,0x00a35ab5,0xfe9642c8,0xfeef6e84,0x006954b6,0x00539560,0x006f07b0,0x0014c4c7,0xffff01c7,0xffec0a00,0xffccc8d5,0x001c8f7a,0x0025724d,0xfff4880f,0x004582d6,0x00aac973,0x00e67015,0x0120a218,0x0082b51f,0x00ca3a49,0x01e2e822,0x014d20f0,0x0136cc7c,0x00b2730c,0x00a6d060, -0x00ccef03,0x0142e47c,0x01c3170c,0x02904e3c,0x0116f9f0,0x011e47e8,0x0227b964,0x027341fc,0x025ce6a8,0x0199daae,0x01900a4a,0x00d83b39,0x00cca081,0x00d690f1,0x00b43b1b,0xfff6e82e,0xff6dd133,0xff7814c7,0xffbecde2,0xffc4fd16,0xffe250ae,0xffe3a535,0xfff5afb9,0x00140e11,0x00305129, -0x005e749a,0x003cd2a6,0xfff161f2,0x003ce304,0xfff8f4ac,0x009de38a,0x01550bba,0x014e1d52,0x01e1548c,0x01245bee,0x00bfeabd,0x007adc73,0xffbeae77,0xff848165,0xffbc7b3d,0xffa23c8a,0xffa1c3c0,0xff5850a2,0xffc40b6d,0xff945e01,0xfebfd642,0x0009ba08,0x00fd28b5,0x00920312,0xff5d7cd6, -0xff5ed41f,0xff2d626b,0xffa15e92,0xffc6b235,0xffa2c5d0,0xffc3f0be,0x000d49a4,0x001d9178,0x0017b297,0x001350c6,0x00152bc2,0x0029e28f,0x002b8c44,0xffd622bb,0x007f90fb,0x006e6298,0x0084962e,0x00600347,0xffe6e4dc,0x00380051,0x00d94a89,0x01abb7c4,0x0262c87c,0x02457c20,0x01dff138, -0x0107106a,0x010f7b42,0x01c9f1ba,0x02d3b0a4,0x03a525f0,0x03868f94,0x03230dc4,0x017dc9e2,0xfd51625c,0xfd68c864,0xfea680f2,0xff8444a4,0xff69e8c6,0xff647969,0xff41032f,0xff505310,0xff9841b2,0xffab90e1,0xffc0b0ba,0x00066dfa,0x00126f4e,0xfff38c15,0xfffb719d,0xffe06d6a,0xffe394ac, -0x000a8675,0xffdf85c0,0x00a1db3c,0x00d5c66d,0x00d99183,0x00e625e5,0x00b19256,0x008b9e00,0x006d084a,0x005171c3,0x003326d1,0x002dcc0c,0xffc55487,0xffd977f0,0x00a761b0,0x011d6496,0x0182413c,0x0222ec8c,0xfe77d6c4,0x049dc6c0,0x03682d88,0x01d456d6,0x02527a70,0x020a1ea0,0x020d7610, -0x01c7303c,0x00f69771,0x00919e2b,0x006da2df,0x0050cf41,0x00188cc7,0xfffcbcd6,0xfffbf392,0x000a1789,0x000700ce,0xffdb08fe,0x005391a1,0x0009a89a,0x003fefa4,0xfffc5875,0xffc38011,0x0009d43e,0x001d7fab,0x00175809,0xfffe11fe,0xfffa4b34,0x001e30c6,0x0086c698,0x0077d43d,0x009472aa, -0x00efa193,0x004f4045,0x008a0bda,0x01e09e1e,0x0347f04c,0x0292f4e4,0x01e71aae,0x00cbc648,0x0141b5c4,0x00e853b8,0x0118463a,0x0126259e,0x00f3ceae,0x0121aca6,0x010c14fe,0x010bf046,0x00cf5a56,0x00a7be8c,0x0079c2ad,0x003d73b1,0x00274a8d,0x001b1cfc,0x000a78a1,0x00042929,0xffbf53cf, -0xffcba035,0xffc9da2a,0xff9a113e,0xff825735,0xff640c75,0xff8bb136,0xff4f345b,0xff107ae6,0xfede01a2,0xfef118f8,0xff7ef5b4,0x00c18c3e,0x01b69d30,0x026386bc,0x0288e3dc,0x0270fe4c,0x02555a30,0x01c179f2,0x014911a6,0x015b2460,0x00e7398b,0x00e5bc0c,0x00d07347,0x00c1e6a1,0x0084dbf2, -0x00a9e5c1,0x006955f7,0x00bc2071,0x0079c8c6,0x00bab0da,0x008d6454,0x00967bef,0x0071f675,0x0048d041,0x00204a77,0x002f4172,0x004623d6,0x001f84c7,0x0016ae7f,0x003d5ff6,0x0059cbf5,0x006b3796,0x00b795a1,0x0108ea24,0x014eee42,0x01f4c5d0,0x02874064,0x031976ec,0x02e13ffc,0x02c9ac78, -0x02df6148,0x027b72b0,0x01c07eb4,0x01c95828,0x00bb9322,0x018d4608,0x0136601a,0x012c89b4,0x01627892,0x014ad6b0,0x0177ec5a,0x016c6e80,0x0128066e,0x0152c356,0x014278ca,0x0122613c,0x00da141d,0x00d8a6d9,0x01025310,0x00ea640d,0x007a089c,0x00d4eb53,0x00ca5e8f,0x00e39a44,0x00ef48a1, -0x00f8dc0f,0x01074bc6,0x01117fb6,0x0149bf3a,0x01785102,0x019efe66,0x01c945d8,0x01ead4d2,0x022a1e1c,0x021379a0,0x020476d0,0x01ec495e,0x01d2b622,0x019d8008,0x01c54924,0x0153506c,0x00cdebb7,0x0027b40b,0x01831f94,0x00d23be7,0x002ab021,0x001623c3,0x00087447,0x000d645e,0xffecbdca, -0xffdbffe8,0xffd58985,0x00b4f36e,0x014c00a0,0xffe14c20,0x00a3162e,0x0117557e,0x0154a972,0x01457faa,0x01555c16,0x015b96d2,0x01636ffe,0x0169ff82,0x016b3db6,0x017e36a8,0x018f2140,0x01a4a884,0x01b451b4,0x01c304ea,0x01d73288,0x01c31e04,0x01ba6ff0,0x01b04988,0x01b11124,0x01bac7c4, -0xff6c9393,0xff7dc6f2,0xff08b2f1,0x003ba356,0x011ce368,0x01a5e7e6,0xffd85cc5,0x00e7c39f,0x019444de,0x01a757b6,0x01a714b2,0x01867636,0x01a50e0a,0x01a5f708,0x019a938c,0x00f5b95d,0x00039a79,0x01c54cd0,0x01158064,0x0058f780,0xff2dfffb,0xff886cf4,0xff6ba002,0xff65ace9,0xff60beec, -0xff6139b4,0xff72b228,0xff5cb9eb,0xff53c331,0xff4b720d,0xff4f98f6,0xff53c299,0xff561787,0xff688351,0xff747721,0xff84fea9,0xff6fd3db,0xff603fc3,0xff465745,0x012fda5c,0xffa575c0,0x005e4c8d,0x00469fd3,0xffd97e91,0x0003f052,0xffac9622,0xffce1fb7,0x00400069,0xffd09e3a,0xffc898c2, -0xffe4ce20,0x004c512a,0x00353f6d,0x003d8838,0x00192d58,0x01408c1a,0xff960780,0xff64abef,0xff607c83,0xff373b4e,0xff27909c,0xff210e89,0xff4b3dba,0xff11a939,0xff0137d8,0xfeff7b8a,0xff0531ee,0xff1af8ef,0xff2c7c09,0xff62cd83,0xff80f6bc,0xff97882a,0xff7f88fa,0xff1372be,0xff21728e, -0x001aead9,0x00048cde,0x007bc535,0x00359bf4,0x0025a47d,0x0010e705,0x004e9551,0xfffa3931,0x00761772,0xffb3c49d,0x003f0a4f,0xffddce98,0x006afdd9,0x003f53a1,0x007b3314,0x007c64f0,0x00b0abf1,0xfff650d6,0xff487c81,0xff5886a3,0xff0b2f06,0xfef525fc,0xfef2f4da,0xff5626dc,0xfed469a2, -0xfeaa3e2c,0xfe873d04,0xfe9f22ac,0xfec37974,0xfed45120,0xff55e6f8,0xff935cd0,0xff8ddc83,0xff5dbb8e,0xff126834,0xff522b73,0x0029e6f4,0xfff2f6b9,0x00273aa2,0xfff74939,0x00039ba9,0x00121a4a,0x002e8baf,0x003ea43f,0xfff16235,0xffe55d6a,0xffd76929,0xffea7323,0x003b2616,0x0041edce, -0x00f72d15,0x004d6ca5,0x00dd753c,0x00089cae,0xff450d4e,0xff39a235,0xfeb097ce,0xfe85aa48,0xfe826dc6,0xff018b8d,0xfe537eae,0xfe05c064,0xfdfcbab4,0xfe373f42,0xfea4fb30,0xfebac17e,0xff83f8b8,0xffdd6a6b,0xffa93121,0xff917989,0xfe07ffe0,0xff5c845e,0xfface894,0xff8788fc,0x01011e92, -0x00d5ff0f,0x0075faa2,0x001f124e,0x0003b813,0xffe75dba,0xffd1a68e,0x000f3b63,0x00102710,0x000256b3,0x003d577a,0x0050b792,0x00dbdbb7,0x0053ea54,0x00d8f980,0x0022b043,0xfef09cea,0xff43caf6,0xfef59eb6,0xff821d5f,0xff8b24e7,0xffc8e70b,0xfee4d9c0,0xfeb21f3a,0xff39dc01,0xfde28b90, -0xfdad4530,0xfe6542d6,0xfef139c8,0xff2b17eb,0xfee79a0e,0xfedb329c,0xff6f14fd,0xfff7c2b6,0x005ffcf0,0xfff653af,0xff3cc48d,0xff44d9cf,0xff4d9e83,0xffaaf0b1,0xffb2eb89,0xffdc13b7,0xffe15925,0xffe63661,0x0001c962,0x0005a1fd,0x000de45f,0xfff4c8bd,0xfffd7240,0x002212b4,0x00992168, -0x00505ceb,0xff68558d,0xff32f3b7,0xfe6d58fe,0xfed79520,0xff3b9ccf,0xffc10900,0xff9a3d9e,0xff8159de,0xff92693b,0xff54b668,0xff6cf6be,0xffdaa074,0xff3b9364,0xfee51772,0xfebcb6a4,0xff6ff3d2,0x004719e6,0x00758892,0x0049bb4f,0xffa5f335,0xff6f0665,0xff82706b,0xffdbe14e,0xff790e45, -0xffabb6ae,0xffd725f7,0x000186d2,0xffeeab53,0xfff9e280,0x0014b73a,0x00176112,0xffdf97eb,0x00152e70,0xfff3be0b,0x002d0f99,0x0016ebe0,0xff7a34e8,0xffcbc954,0xffe5b558,0xff18b6dd,0xfe7bac4c,0xfe3ee646,0xfde7f5a8,0xfde30454,0xfe36d776,0xfd86f43c,0xfd2f17b8,0xfd9c9550,0xfe3c8336, -0xfedb58fe,0xff0e0c01,0xffde8dc7,0xfc361b54,0xfd67a35c,0xfe1d4b70,0xfe655b92,0xff0b5e51,0xfedb53d0,0xff257775,0xff2dee75,0xff811a25,0xffa98cd4,0xffd73368,0xfff62915,0x00054e96,0xfff31827,0xfff0bb9c,0xffed4de0,0xffc31af0,0xffb4a49b,0x00428d87,0x005f7d71,0xff7b3d43,0xff3312ec, -0xfee128b6,0xff0e6e78,0xff53f152,0xff9eb0f9,0xffb68c68,0xffda8f6a,0x0021f58b,0xffcc6f8d,0xff5ed116,0xfef9611c,0xfdc51c74,0xfcfd8818,0xfc77f93c,0xfc6a1140,0xff944e28,0x01ff1d14,0x03a2853c,0x029744f0,0x01fbd074,0x023944f4,0x019408fc,0x009b4bb5,0x008a8802,0x001970d8,0x0035dde5, -0xfff85489,0xffe27b5b,0xffd296de,0x0002ea0c,0x000b8f5d,0xffc484c2,0x002955d0,0x00744a4a,0xfffea088,0xffd245d8,0xffe448a1,0xffd28357,0xffcd3f9e,0xff53948e,0xfec3b932,0xfef84ea0,0xfee1fa48,0xfe7239e4,0xfe6fa122,0xfe401022,0xfde2b514,0xfd121be4,0xfcdccdc8,0xfd1e7e2c,0xfebf8ce4, -0x00f2a75e,0x01733e2c,0x022e35e8,0x019476be,0x016c7a32,0x011bd958,0x00efc42c,0x01226b82,0x00f032ee,0x00df589a,0x00be3904,0x00aede8d,0x008b769b,0x008432dc,0x00396543,0x001ba136,0xffec4117,0xffece408,0xffc63c4c,0xffa9bd28,0xff1bc421,0xfed7b8f6,0xfec106ce,0xfe986140,0xfeb1ca36, -0xff106bc3,0xfedc31ec,0xfecadbea,0xfebf7fd0,0xfe733ed8,0xfe028e84,0xfd72b6fc,0xfea634ba,0xffba07f9,0x00737a8c,0x00f51bc7,0x011598f8,0x01391266,0x017e0d28,0x013005ac,0x014b3372,0x011edc40,0x010a3bb2,0x00d66b66,0x00e1e4bc,0x00aac007,0x00c1a937,0x00773397,0x00b4a742,0x008aeb8b, -0x009a50fb,0x006af743,0x006d6075,0x004024bc,0x002f557d,0xffbbc037,0xff886075,0xffabb5dd,0xffa27a60,0xffbb32dc,0xffb9f8c9,0xffbeaa76,0xffa75f0d,0xffa10cf4,0xff92ca6a,0x001f91c8,0x00c1dd99,0x0145d05c,0x016c081a,0x0178e412,0x019e2190,0x016a7c96,0x0120030e,0x0137490a,0x01edd302, -0x01330ede,0x016ae040,0x0160a702,0x01217ca8,0x012358ac,0x00f20398,0x00f041af,0x0121250c,0x00e2be81,0x00c394ba,0x00c2e640,0x00e2c52c,0x00c0fff4,0x0096a92b,0x0087e951,0x00e3fe9a,0x00607cad,0x008bffa4,0x009914cc,0x00a43480,0x00b73515,0x00ca442a,0x00e1852b,0x00d745cd,0x00d056b6, -0x00bcc96c,0x00aee629,0x0088fd54,0x007b5d48,0x0090370d,0x00b7c3c0,0x00da8881,0x01025780,0x00de66c0,0x00c5f681,0x014d0e2a,0x01b5528a,0x01f1ad7c,0x01088fac,0x01979414,0x01e256e8,0x01ea9a60,0x01eb7bcc,0x01d787f6,0x01ee6478,0x01f88eae,0x01f64914,0x017a83b6,0x00e3c1ec,0x01d7d49a, -0x0168a7c6,0x00f56a21,0x00735652,0x009e1f2e,0x009d708f,0x00a9ef9c,0x00afa356,0x00b50c55,0x00bf1bb1,0x00b81508,0x00b79d6a,0x00ba55ce,0x00b450c6,0x00b4605a,0x00aabb84,0x00bad99d,0x00bfa59f,0x00c2b7d9,0x00cba3f6,0x00d19c6e,0x00848606,0x0061692f,0x00c09bce,0xff8620e6,0xfef138e2, -0xff0dfb1e,0xffee743d,0xff153057,0xfee80dd4,0xfedabaec,0xfee2b71e,0xff1e6aca,0xfeeba570,0xfeea4668,0xfefb0664,0xff1289fe,0xffcf797f,0xff0c4aff,0xff1a330e,0xff9904a2,0x00d1b7be,0x007e9b7f,0x008c7770,0x008c4c51,0x008955cf,0x00859371,0x0085fce7,0x0071c249,0x006d1875,0x006f0c48, -0x0078858b,0x007de801,0x0082f9a2,0x007d6720,0x0076c9f8,0x00617b90,0x006db15e,0x00754faa,0x00626e82,0xfef2fd5a,0x005947b3,0xffea8a13,0xffcd8ddb,0x00130fe0,0x000f4575,0x005762e9,0x00300310,0xffe49b11,0x00138851,0x002394e3,0x0000ba0f,0xffdfcc52,0x00100848,0x0009bf9f,0x004a2654, -0xff5877f1,0x0081eca1,0x00bf626c,0x009bdfcf,0x00af39f0,0x00a87b47,0x00a44751,0x00a28b65,0x0064bdbf,0x00500704,0x00597b14,0x006ede92,0x007ae53f,0x0078c0a8,0x0067cb85,0x00555649,0x002c2ae1,0x0048ec9a,0x0066e5e6,0x00249f7d,0xff7d4e09,0x0008e754,0x001a3d80,0xfff3d62f,0xffe70083, -0x001acd51,0xffd73fab,0x00543df0,0x0001410b,0x0070a572,0xffc377b6,0x001cb403,0xffdc9413,0x003ef646,0x005d75f6,0x006139d3,0x0009285d,0x006d2600,0x010426a8,0x00bd90e3,0x00d3fc36,0x00bfae03,0x00b342fb,0x00ad73a6,0x003962b7,0x001b98fe,0x0031254a,0x0066970c,0x0088abef,0x009099e5, -0x00650a26,0x004d0c76,0x000c51e1,0x001618f3,0x0083c961,0x001a3ff6,0xffae799b,0x005b4c3d,0x00977d28,0x000a330f,0x001adde2,0x003ad66d,0x0056f544,0x004c47dd,0x00678f6e,0xfff556af,0x0001f27e,0x003ee35b,0x006ce9e6,0x00bdfd9e,0x007c64c3,0x00e14016,0x002a1d50,0x0092f076,0x0138371a, -0x00d4e0a8,0x00fc5f09,0x00e55eaf,0x00dbc35c,0x00d33d2b,0x000d2685,0xffc4b1d7,0xfff78eb1,0x0046439d,0x007448d5,0x004f0d36,0xfffc2c9a,0xffd666c7,0xff8e1109,0xffcad326,0x00b68e00,0xff55c919,0xfe335530,0xfedb8a4a,0xfffc4a96,0x003befdb,0x00776aa3,0x0023525f,0x000ceec1,0xfff7e744, -0xffe45411,0x0025b1cc,0x00260d9f,0xffef5403,0x003588f6,0x008d038f,0x00937ace,0x00fd539c,0x0045c263,0x0034b05d,0x01420118,0x00ed5607,0x013070c4,0x0071627f,0x008655e3,0x0100d668,0x00e919c4,0x0114876e,0x01730552,0x008fd154,0x0083d232,0x011429d8,0x012569ec,0x0135dd64,0x00eeae3d, -0x00acb83b,0x018d1a14,0x016928dc,0xffb823a1,0xffd3535f,0xffa7ff23,0xff664eae,0xff8e1ce2,0xffa55dfc,0xffcfb3b4,0xffebeacd,0xfff5c46e,0xffe9bd4a,0xfffc98b1,0x002a4b83,0x0054fe39,0x002d5c88,0xfff03c3c,0x00140471,0xffd49474,0x00703316,0x00a9f75a,0x004bef95,0x00864e78,0x0046445f, -0x000d1f09,0xffa707ba,0xff62e3a3,0xff712b10,0xfff14572,0xffd28ccb,0xff8ce965,0xff69c53b,0xfe477cf2,0xfe1a6f7e,0xfed0c02a,0x0001f5d2,0x00214b08,0x00828c2a,0x00180683,0xfffdf10e,0xfef29002,0xffa2fa48,0xffa90384,0xff8a3798,0xffa4d358,0xfff1a767,0x000a3923,0x0012a736,0x00231bc3, -0x001ddee7,0x00130d8c,0x002d6c3f,0xfff8fbd2,0x00469b46,0x00033acf,0x00b7e9b3,0x00af238a,0x0033a548,0x0062f324,0x00c0e14a,0x00fccf6e,0x00c49d62,0x010327e0,0x00ea70b8,0x009be7ea,0x00daaaf2,0x00faef51,0x00f757b9,0x0134133a,0x00f7a3f4,0x00737b1c,0x00056aab,0xfe21a9b0,0xfd247274, -0xfd9af9b4,0xfe4e2906,0xfe93cf7a,0xff20af8a,0xff6abf66,0xff79b2bb,0xff957175,0xffb7df02,0xffe6f891,0x0002bf43,0x000d6669,0xfff9ebd4,0x000d89f0,0xffe6c307,0xffdc5d00,0xffe12b67,0xffaa1f60,0x0098430a,0x00999c9e,0x005ba5f6,0x0028c261,0xfff2b6cb,0xffa59934,0xff4fa181,0xff602d6d, -0xff64770f,0xff71a926,0xff52a976,0xff4173a7,0xffceabae,0xff3b6f46,0xff2c8f3e,0xff461c31,0xfe705a3e,0x000e6e0c,0x0033a455,0x00ba6655,0x016bd5e2,0x0170454e,0x0175308c,0x0112f41c,0x0035fd4d,0x0014a2ac,0x0016d052,0x0012cca9,0x000c8772,0xfff83fcc,0xffd0276d,0x000ad0fa,0x0019354f, -0x0009bfdd,0x000ef856,0xffc22d8c,0x00579fa8,0x0015c9ff,0xffbe2ac9,0xffe9837b,0xff8494b2,0xff530ac6,0xff6812a0,0xff856801,0xff68544c,0xff3bbdf6,0xff569b08,0xff6c4967,0xffaad1c9,0xff4a80e2,0xfeb9777a,0xfe6ef1a6,0xff21207b,0x01f7c8b0,0x01863e28,0x012190e4,0x013e1e96,0x010bf1b4, -0x00e34328,0x01204ff4,0x01530e78,0x013b4726,0x010de834,0x00f641a4,0x00b1b8ff,0x00aa8843,0x00bcb11a,0x00712fd0,0x001d1f64,0xffc3a015,0xffb0d160,0xffa5297f,0xff93ef71,0xff969dee,0xff8d2369,0xff95c240,0xff376cd9,0xff376a50,0xff68acd6,0xff510724,0xff536261,0xff286032,0xff05cefd, -0xfef0d814,0xff0c6522,0xff7cf712,0x00388217,0x013223b6,0x017aca52,0x01b801ac,0x015bdcfa,0x00ef3198,0x01147fa4,0x00d775bb,0x00f50109,0x00fb52e5,0x0102be26,0x00bf2bbf,0x00d985fe,0x007fb618,0x00b90bc1,0x006d9031,0x0073aa51,0x0056057d,0x0059ec18,0x003c0185,0x0024bb10,0xffdc8e73, -0x0014675d,0x003e30a5,0xfffd4e1f,0xfff109bb,0xffdc2276,0xffc710c1,0xffa7a1d0,0xffa74ab7,0xffa14313,0xff8e8498,0x00400152,0x00e40bdf,0x0187bd0e,0x01a90ee4,0x01bfb6fc,0x01fb28ea,0x01adfb32,0x015f56a2,0x01618624,0x00fc9059,0x015e4eea,0x0123210a,0x01208b86,0x01402bfc,0x013141b6, -0x01486424,0x01253ffa,0x00dfe790,0x00f63479,0x00fc669c,0x00d4248e,0x00ab526f,0x00a955b0,0x00a66c1e,0x00abe768,0x00668796,0x00913b63,0x0097f67e,0x00ad1518,0x00c257e2,0x00cfa0ec,0x00df66c1,0x00eb6b76,0x01107d86,0x0133bce8,0x0146cb44,0x01500b00,0x0145ad4a,0x014e2ea8,0x014928ec, -0x014c3f74,0x014d8858,0x01539802,0x01502ab8,0x016d84d6,0x00dcb7ee,0x0092bae2,0x009d595b,0x0102abe4,0x0092bff0,0x0079eaaf,0x0069f8cf,0x0061bf7e,0x0072a2c5,0x0055ffc1,0x0048bcce,0x004ab316,0x005ce5dd,0x00c7516d,0x004e1f71,0x0055947e,0x00a40027,0x01138dd8,0x0105485e,0x010f1504, -0x0112fd28,0x0119684c,0x01211954,0x01273244,0x0130497a,0x01374716,0x0143d030,0x014983f6,0x0153ee26,0x015c3a18,0x01583dbe,0x01562984,0x0153915c,0x01541302,0x017758e4,0x002f761c,0x0021e64c,0xffde2aa4,0x00f1b0eb,0x0132767a,0x00a79df0,0x00c21f32,0x011aa0d2,0x00c8dbff,0x00c9f689, -0x00c6e4d6,0x00a7c4ad,0x00b3b804,0x00ac3a8f,0x009110b3,0x0121b818,0x00d94b45,0x0097033a,0x012b3580,0x010818e4,0x0005a7c1,0x003532a6,0x00303e72,0x002b65d2,0x002ab604,0x0029f92d,0x0032d7ae,0x001cc969,0x0015d790,0x000faf7b,0x00268017,0x00317838,0x00304f8a,0x00485729,0x00480a1c, -0x002daaed,0x0029e1a4,0x0009a196,0x002f2cb0,0x00fdcb06,0x00659449,0x00eae044,0x008a48f9,0x0052dc3d,0x0073c2f4,0x00406dc3,0x00772b25,0x00d552b6,0x008546dc,0x0057c5c8,0x0072b5a5,0x0088277f,0x008138f1,0x00bff7ed,0x0092d36b,0x0108539c,0x00772386,0x003b74bb,0x005b0916,0x003e281b, -0x00398027,0x002940d5,0x00344d92,0xfff56798,0xffe9a728,0xffeffe26,0x00288dd1,0x0051151e,0x004ec221,0x0091890b,0x00852016,0x00310b88,0x003aac59,0xffd3c7fe,0xfff5947d,0x00ba99c0,0x00943244,0x0102d25c,0x006b4bc1,0x004e8d95,0x006cc56d,0x006ddd91,0x00290151,0x00d4e73b,0x0015ff29, -0x005d5e61,0x0036baee,0x0091e026,0x008dd64c,0x00aac012,0x00cd624d,0x0113abb4,0x00a6a8ff,0x00436e64,0x006a4d79,0x004acc5b,0x004777b5,0x003a08af,0x006bcfba,0xffe0d70c,0xffbfbbb7,0xffaec9f5,0x002c1a41,0x007f2bac,0x0062b2a5,0x00fe8810,0x00dcd9b4,0x00228ec3,0x003e1c8f,0xffce127c, -0x001a9225,0x00c2e380,0x00a1edf6,0x0106e942,0x003d4316,0xfff2aaba,0x002936a5,0x00230aab,0x00474340,0x003d7b00,0xffff8ac2,0xffee00fb,0xfffb2b0c,0x0048a688,0x006840f8,0x00f31ef4,0x00a8a818,0x011f4880,0x00b30630,0x0072862c,0x00b22602,0x0080199a,0x0071b19d,0x00559c8e,0x0072841d, -0xff9fdaa6,0xff5a118a,0xff6347f6,0x0040f928,0x00cf949b,0x00a12c87,0x0173797c,0x012da9d0,0xfff28abc,0x0043685d,0xff8d6b33,0x0014a2bc,0x005e847e,0x0014a54d,0x00770a3d,0x00bdfbbb,0x00ba778c,0x0080d72b,0x0037488b,0x000a50f4,0xffe863ff,0x0022dc25,0x0025f2e2,0x00178c2f,0x0054ca04, -0x006eb77f,0x00d0a062,0x00e09c24,0x0157ee20,0x00cf880b,0x00154b18,0xfff8c15a,0xff6ddb48,0xffdbc363,0xffd1b94c,0xffab0279,0xff69dc32,0xff5fce52,0xff83aadb,0xff454e06,0xffb21348,0x00da910e,0x00ee1154,0x00f0fb15,0x0093504c,0x005dc2c1,0xfff53616,0x016979fc,0x00c20e71,0x00021cff, -0xfff6e05d,0xffca9935,0xff90741b,0xffaa93d3,0xffcb0a68,0xfff789a3,0xfff4ecdf,0xffdeb7fa,0xfff6f241,0x00098f92,0x00363f1f,0x003b00fc,0x00603d4e,0x002dde6e,0x006b6605,0x00b796d2,0x00720163,0x00ab02fa,0x00897484,0x00223d0e,0xfff6ea68,0x000994f1,0xffe94b2a,0xfff433e9,0x0012f313, -0x001cbbae,0x0027a9fc,0x008ca470,0xff63e378,0xfefdfb12,0xff2ce48e,0xffa64c3a,0xfff653c1,0x005a8ba7,0x008fbffe,0xffff52a7,0xff5d6fb7,0xff94f7e6,0xffed8fde,0xff9f0b03,0xffb87678,0xffd0d11c,0x00084bb5,0xffff7692,0x0013c14e,0x00174ae3,0x00330386,0x0035c1c1,0x006acd26,0x00333e64, -0x0092ffcd,0x00eefeae,0x0012d3f3,0x00328e5e,0x003cf8da,0x003e6594,0x0038001b,0x0024bb72,0xffcbf0e7,0xff7580f5,0xff6324e3,0xff4418f7,0xffc28968,0x00ffbc4e,0x01e9820a,0x01f5a814,0x0139d5e4,0x00582228,0x0009c744,0xfe2588ca,0xfdc7a810,0xfe2a8eb0,0xfe8a93c8,0xff2eecea,0xff8772a6, -0xff82d43d,0xffa04e24,0xffc30650,0x00031c12,0x0002510b,0x000bb0d4,0x0015b7a8,0x001798c4,0x000f5ca0,0x00052ed0,0xffdad07c,0x003cfde2,0x009d0c70,0x0034a257,0x00397340,0xfffce5ff,0xffe608ad,0xffb54f06,0xffd0fd78,0x000906b8,0x0054632e,0x00be9481,0x00b294a3,0x00466876,0xff548c20, -0x000203e2,0x00506a90,0x00689c83,0x00e3586f,0xffc205af,0x00ef3533,0x01aad3a6,0x0192c7fc,0x01791ddc,0x015b6e54,0x00bdbee0,0x0026d4b4,0x00369a01,0x0000818e,0x0020eeac,0x00130251,0x00052472,0xffe61304,0x0019655e,0x0028f54b,0x00157ccf,0x0021da97,0x006687ef,0x0065a15f,0x00027a21, -0xffdfcb96,0xffaa4e87,0xffa39a8d,0xffce98b8,0x004cf965,0x003a2f24,0x004555c6,0x0087b763,0xfffd64cd,0xffe95ea3,0xffed812c,0x003559c8,0xffde8248,0xfef0047c,0xff87b5d9,0x021136a8,0x02a7c6d8,0x0270a1bc,0x022f2328,0x01e23234,0x01792f4a,0x01484ee8,0x01984dd8,0x013e8840,0x0103da3e, -0x00b92d32,0x00af6bee,0x00a8f2cc,0x00b205be,0x0077599b,0x00446aa4,0xfffc34ec,0xffc87fb4,0xff910198,0xffa91496,0xff67fd5e,0xff643bd1,0xff95265b,0xff96ccc0,0xffb14022,0xffb373df,0xff81d136,0xff44f519,0xfee83338,0xfec7a568,0xfe9393da,0xfe612ac2,0xfe625e6a,0xff2bb81e,0x009356bd, -0x01843058,0x01200d78,0x015c9af0,0x01a2dae4,0x017b3254,0x01791218,0x0169a1a0,0x01575b82,0x013f3e90,0x012aa05c,0x00f6e124,0x01005362,0x00a12978,0x009420ee,0x00559a08,0x00639410,0x005100b2,0x0052cc31,0x0057ffe7,0x007505b0,0x00331fe8,0xffdab39f,0xffcc4340,0xff94ee02,0xff79f776, -0xff58baf7,0xff39d24d,0xff4a04b4,0xff5ba55a,0xff5e35dc,0xffd8283d,0x003f2886,0x00a3179f,0x00fd1a79,0x013697aa,0x015f0c86,0x0143cd9c,0x012749dc,0x0146e776,0x018a1500,0x013b1826,0x016c17cc,0x015bddc8,0x01461bc4,0x014d95b4,0x012a75a8,0x01371a8c,0x0157a956,0x01336732,0x010f6ad6, -0x01123c64,0x0100d196,0x00bb346b,0x00aa4f24,0x0067f73f,0x00921690,0xfff3bfc5,0x0000f5a8,0x002472c8,0x00354e93,0x004cc1fd,0x005d5cad,0x0069c251,0x006fb82d,0x00822363,0x0099f271,0x00aea8b8,0x00bfec22,0x00d784d2,0x00d987b1,0x00eaf699,0x01017cf6,0x0122ef5e,0x010f5876,0x00ff8545, -0x0192c370,0x01b47e30,0x01666092,0x0174978e,0x01aeb674,0x017f6c1c,0x017f04f4,0x0177c2b4,0x015b7e78,0x0166c1f8,0x016726fc,0x015c041c,0x019021e4,0x0144d25e,0x0142c1a0,0x016a260c,0x0131c334,0x008622ec,0x00b380b7,0x00adae25,0x00b03e53,0x00b252d4,0x00b5a394,0x00ba57eb,0x00c9bcbd, -0x00d60c09,0x00e17117,0x00e9594c,0x00f42915,0x01037d96,0x010585e0,0x01077258,0x0104eb76,0x01084716,0x013616fa,0xffd27a26,0xffd48e53,0xffde60ba,0xff462b19,0xff785d2d,0x0081f819,0xff59c2fd,0xff6e6f7d,0x002aa8ae,0x0025e967,0x002ecce0,0x005efdc8,0x00468297,0x00485ef2,0x005a3500, -0xff74e9af,0xff585989,0x008299fe,0xff904000,0xff5f84fc,0xfff1ab38,0xffe0de25,0xffd37392,0xffd0eae9,0xffcebb00,0xffc956c1,0xffc292da,0xffb6b30f,0xffb2b29c,0xffb13c21,0xffbc4fe6,0xffbe794b,0xffb8ab51,0xffbc2633,0xffc12ab3,0xffce466e,0xffcbfc1a,0xffe24ff4,0xff98101f,0xffb3b093, -0xffcd5b36,0xfff913b9,0xffcf9386,0xffbabf4f,0xffdffe83,0xffd51643,0xffb3fd61,0xffb9af10,0xffa136fc,0xffc1c8a0,0xffa91112,0xffdb29b5,0xffec7408,0xffb9d3b2,0xfffb40da,0x00060086,0xffc93f56,0xffeeba3f,0xffbc238b,0xffb867a3,0xffb5ad98,0xffac31f9,0xff99b71a,0xff747a8b,0xff66899c, -0xff6411f8,0xff82a09a,0xff86081a,0xff6f53bd,0xff7093db,0xff811009,0xffb11836,0xffb5351d,0xffdd9e77,0xff8a63c8,0xff65febe,0xffcbf1c4,0x006e1e34,0xffe30cd5,0xffd88e89,0x0018db17,0xffe5c9f7,0x00233fa4,0x001f45b9,0x001bf30d,0xffe0b7f0,0xffe3348c,0xffe96d03,0x00074971,0x002955ad, -0x003ba428,0x0008ecff,0x0001f7fb,0x00040449,0xffc04986,0xffa52496,0xff983382,0xff7e3ce2,0xff55f0d3,0xff137e9a,0xfef7af50,0xfef47c88,0xff3c832f,0xff4b5ddd,0xff1e2be0,0xff2ec9a9,0xff5c56eb,0xffb97153,0xffa75bb8,0x000fe42f,0xffa805cf,0xffadbf86,0x001c90bc,0x00eaf6ce,0xfffb9cc1, -0xffe64d45,0x0054be04,0x0033f516,0x0045c849,0x0099103b,0x001b0090,0xffeea5a3,0x002e0665,0x0046a1e9,0x007653dd,0x00768cb7,0x00a5300b,0x006524a8,0x0037a766,0x0016f64c,0xff994401,0xff6b1f89,0xff5885c7,0xff307fae,0xfefbfa38,0xfe892bf2,0xfe6231aa,0xfe723e4a,0xfedf584c,0xfee7e68c, -0xfe8c4d42,0xfe93996c,0xfee69690,0xff8e8970,0xffa2dc1c,0xff6069ad,0xfed4aae0,0xfe847144,0xfefdf748,0xffb0b733,0x0033ac25,0x0076f3c9,0x005c4371,0x001d32f5,0xffed8b64,0xffe4fc6d,0x001fe493,0x002bcaf7,0x00097b4f,0x003c3faa,0x0063e689,0x006f8500,0x00acc8aa,0x00580e9e,0xffd1006c, -0x000f8490,0x00165eaa,0x0042d0ea,0x00000f6f,0x0021b728,0x0080b997,0x00484179,0x0017b735,0xffa6a063,0xff6abdf8,0xff57bb2f,0xff978ba5,0xff8bde46,0xffcdfa43,0x003741d4,0xff9e4112,0x00b94337,0x0180467c,0xff82cc91,0xff5689a0,0xff7e84c2,0xff9b48db,0xffbce6cf,0xffac7787,0xffe20038, -0xfff2f07e,0xfff1fba9,0xffe3b3e4,0xfff352bd,0x00204ce1,0x002d899f,0x00127073,0x000359e9,0x000017eb,0x0005bbfb,0x002a8ba7,0xffb5d9f9,0xff3ecff2,0xfef730b0,0xff093e56,0xff32a93f,0xff5dc00a,0xff87083a,0xffc7c8f3,0x00125370,0xfff3f6e5,0xff9ff1b6,0xff9c6017,0xfdeb6ba0,0xfdc214b0, -0xff2be8f1,0xff7627d6,0xff7fa544,0xffc8b020,0x0032de80,0x0012357b,0xff1bea5a,0xff6b6295,0xff95f792,0xff9a5bf1,0xff9c8100,0xffcef4ec,0xfffc4016,0xfff8760c,0x001525c0,0x00161cb2,0x0009e0f8,0x001cec31,0x0036f718,0xfff70c89,0xffd4ed93,0x00a110d2,0x0071ba38,0x002db91a,0x00212bb5, -0xff8ddbd1,0xff23db2b,0xfef75574,0xfea41242,0xfed00cd4,0xff5bdb45,0xff95b1f3,0xff3ae01c,0xfe481af8,0xfe706c9c,0xfe5b2f3c,0xfdedc7f0,0xff2ef265,0xfecaf96c,0xfeac0d14,0xfdd5da80,0xfde51a28,0xfe821fb6,0xff1a2512,0xffa6387c,0xff9be943,0xffac3940,0xffd42d6f,0xfff558a6,0xfff5e8aa, -0x00022777,0x00062f37,0x00083f11,0xffe5b4eb,0xffdfc863,0xffd14769,0xffe241a9,0x006e2d98,0x000bf3fd,0xffa0a578,0xff47fe79,0xfef8e04a,0xfedd9f04,0xff382338,0xfefaea3c,0xfeff3602,0xff29ca9a,0xff3ba9ac,0xff157e74,0xfec8bd70,0xfda39e1c,0xfce883f0,0xfc395d60,0xfe0aa2fe,0xfba413d8, -0xfd6a8904,0xffd6735a,0x004afcd5,0x00797e18,0x006d3b99,0x000b247c,0xff8f2385,0xffad8975,0xffb934a1,0xffdd6aa4,0x0011034c,0x0009a78e,0xffd228e6,0x00052bed,0x001c9481,0x003bc751,0xffc3d3f4,0xff9c0f2a,0x00074590,0xfff37c00,0xffda6d0a,0xffa189fb,0xff7b443b,0xff52643e,0xff0ecf2f, -0xfeb13e8e,0xfe8a7acc,0xfe8afe40,0xfea81546,0xfe96aa80,0xfe63667a,0xfe1ac286,0xfd75a2ec,0xfc7c94d4,0xfbbcc198,0x010d89d6,0x0154a9ec,0x01f4b00e,0x0192b780,0x0194390a,0x01292ca4,0x0135f7ac,0x016c6268,0x01397d8c,0x0107323c,0x00ba21ba,0x00941c2e,0x008a0b03,0x00890dad,0x004d6022, -0xfff18f4c,0xff9ad99b,0xff9ba8b6,0xffa6a066,0xffd53704,0xff960c29,0xff66dc87,0xff6dfb9c,0xff25982b,0xff2143de,0xff2dfed8,0xff4e91a7,0xff6b0a29,0xff5573a0,0xff2d469e,0xfeb71840,0xfdfacba4,0xfe1436c0,0xfe7b44ba,0xff7fc1c8,0x00573548,0x00bcc75d,0x00e567db,0x00c103ed,0x00d6b74a, -0x00e7bf49,0x00fd16eb,0x0111fda8,0x011db2de,0x00fe309e,0x00efec67,0x00c06278,0x00abcca8,0x00802e50,0x005181fd,0x0042b0a4,0x00364a27,0x00234f3c,0x0008a424,0xffd24097,0xffac60be,0xffa1309c,0xff85a4a2,0xff7266cc,0xff532fee,0xff3939f6,0xff1af8ae,0xfef00156,0xfeb999bc,0xfe7cec62, -0xfebca524,0xfefde57e,0xff35e101,0xffbfc3d5,0x0027f014,0x008bb2f5,0x0092089b,0x00bd0ebc,0x00b9e27e,0x0125ba72,0x00e18084,0x00ea432c,0x00f9a57a,0x00e97edd,0x00ee1884,0x00cb88bf,0x009ff569,0x0082dc0a,0x00645844,0x0065707f,0x00467a3a,0x004a156e,0x003ae4a8,0x0001838d,0x000850a4, -0x000c414c,0xfff70409,0x0018dcc0,0x0015d926,0x00202ef8,0x0028050d,0x002f432f,0x0037ac91,0x0048c4fe,0x005c37ef,0x00647066,0x0063402d,0x0057de9c,0x0047e093,0x00589942,0x00661b1c,0x00813bcb,0x009b7610,0x00af4821,0x00ad0c1a,0x008bc3d7,0x00b6f820,0x015301f2,0x0081f085,0x00b1ea79, -0x0130b33a,0x012ac8b6,0x0129d1b8,0x013197ce,0x012b3674,0x01291256,0x012c1992,0x006ff182,0x004b6956,0x010e6cfe,0x006a9814,0x004a8086,0x007f37b7,0x007e0358,0x007c8ff7,0x00801733,0x008080da,0x00828e60,0x00831211,0x008631c8,0x00873291,0x008b3f48,0x008b3945,0x008f1014,0x008f9620, -0x0097fe76,0x009cb36f,0x009fed81,0x00a2e6c6,0x00c4b543,0x00d249a0,0x00aa3c00,0x00cf29ce,0x00df44d2,0x006482c4,0xff70dc76,0x010764f8,0x007660d3,0xff9657bc,0xff85eceb,0xff847465,0xff876a6b,0xff706b3b,0xff66479d,0xff5440eb,0x007470f1,0x00fb9fda,0xff443244,0x006d7cf5,0x00ea8cae, -0x00e49343,0x00c424de,0x00d56784,0x00d3453a,0x00d4256d,0x00d078b4,0x00c83e7b,0x00bdd3c8,0x00bb8a28,0x00ba18b1,0x00d82621,0x00e30e65,0x00d9ffda,0x00ee955a,0x00e47933,0x00b10f5e,0x00bfbbec,0x00a72e78,0x00f374bc,0x001c8219,0x00e80ec4,0x00e34270,0x00737ad0,0x008fda32,0x009afce3, -0x00add414,0x00cbdcea,0x00d4aaad,0x00cfd833,0x00a509fe,0x00a8d5f0,0x00731e94,0x00889033,0x00caeb13,0x00c459c2,0x003e072d,0x0111dabe,0x00f868de,0x0112f9b6,0x0113d472,0x01141286,0x00fbfc59,0x00d8c3e9,0x00b3fe2e,0x00b2d7b1,0x00c1cad7,0x010febe8,0x013278fe,0x0111280a,0x0145258a, -0x011bb2c0,0x009913ad,0x00b6f7a4,0x008ac579,0x00a54c1d,0x00a8db75,0x00c085ae,0x00f6771f,0x0067d0cf,0x00498626,0x008cfc05,0x00514752,0x005992c5,0x00b5d66d,0x00767c91,0x003b1961,0x006c8407,0x00695912,0x009fe65e,0x009e74d7,0x00cf79ec,0x00e6dbf2,0x01057efc,0x012c10e6,0x013504de, -0x014864ea,0x014840e8,0x01290132,0x00f73f30,0x00ae0934,0x00a70451,0x00b729a9,0x015bb606,0x01a48f14,0x015232e6,0x01c84c92,0x017590d2,0x007bc658,0x00b5c14b,0x007131a2,0x00941c83,0x00a1a03c,0x00f7e18a,0x015d70ec,0x005f021d,0x00017d84,0x0053dca6,0x0036e94a,0x004eeae5,0x00901106, -0x00145c5c,0x00065b1a,0x003160dc,0x006d1f95,0x00a451e7,0x00b4c380,0x00f2c54a,0x00e40fb2,0x0112abc6,0x016a1188,0x019a51c8,0x01ce24f4,0x01c63dea,0x017ef6b2,0x010241da,0x00806b2c,0x006ac41c,0x009f6b52,0x01b0a004,0x02116e94,0x0191b782,0x021bdb14,0x017b3388,0x0004fb64,0x0059879a, -0x0142ff9c,0x00b54842,0xfffe63cf,0xffd621e1,0xffb9206f,0x006487bb,0x00d046f5,0x00b159c1,0x005267d1,0x00159b9c,0xffef8c33,0x002d6e02,0x003c126c,0x00286147,0x006a2cdd,0x009493e2,0x00a834aa,0x013376e4,0x01251d24,0x0127b1a4,0x0158489e,0x00ca0b4e,0x006d19d5,0x0058cf8a,0x0051e8bb, -0x002d9d4b,0x00986514,0x00cd6801,0x00b8059d,0x01117448,0x01888a94,0x023895b4,0x0217a00c,0x0225becc,0x0238f6e0,0x019e5bb0,0x00606ba6,0x022a766c,0x00aa5713,0x00029599,0x006429b9,0x001c800c,0xffed8649,0xffd912bd,0x0008983c,0x00201ecc,0x00027eb8,0xffedabb0,0x0000e26d,0x002e7c85, -0x0056800c,0x00676666,0x007bf0a2,0x0031f7b7,0x000fc101,0x00b64649,0x01073bca,0x013e176c,0x018b3698,0x00e30625,0x0079d76f,0x0052b47b,0x00286466,0x004475ab,0x007db9b4,0x0081f0b6,0x0086965a,0x00b65b1c,0xff9ffb3a,0xff30722d,0xff6cf3f5,0xff9db548,0x001c705d,0x00026289,0xffea9ce0, -0xffdb9be0,0xff3f11ff,0xff6b7b9b,0xff9e3d36,0xffcdcfd4,0xffc3fa4f,0xffd7427d,0x000ad7c8,0x0011766f,0x0027bdf1,0x001796f9,0x0037a87d,0x006e4389,0x007f2387,0x00591503,0x009b4e6a,0x013641c0,0x009e7934,0x005d72bc,0x0041e604,0x00b6378b,0x014ab5ae,0x01e1dbfa,0x017d68fe,0x0114ff10, -0x00c079cf,0x0105a9b2,0x01de4360,0x02ef4810,0x03a8b3fc,0x036313e8,0x0260f3a8,0x00d8dd2c,0x01b1a3a8,0xffb8f4c5,0xfe6593be,0xfe8b19e8,0xfea16164,0xff7a8c0b,0xffc90000,0xffd72035,0xffcd1e81,0xffeedfd2,0x000de5e9,0x00055a7d,0x0008326e,0x0037a796,0x0030e31a,0x001961d7,0x0025dd3d, -0x001d4a91,0x002b4b11,0x008a40c8,0x00acc429,0x00d37f8e,0x00b1d46a,0x00ae9202,0x006c14cc,0x00452f70,0x0030dc60,0x004f173b,0x008f2dd5,0x0070eab4,0x005ad736,0x00034de6,0x010baf5e,0x01c37cba,0x029ecd10,0x024b02ec,0xff7b7894,0xfeee8e46,0xfefa406a,0x000e3ec5,0x0074c5bd,0x0011a20d, -0xffc50510,0xffba01b5,0xffc090bd,0xffd8bd43,0x00087890,0x0033f2e7,0x002b88bc,0x000728a2,0x0011f958,0x00230c85,0x0053e986,0x001f9cd6,0x00105f45,0x00796b9c,0x0051b04e,0x001e441f,0xffcf0c3b,0xffde644b,0x00163fbb,0x0079c280,0x005c40a8,0x00a7938e,0x01451aa6,0x00f9712f,0x01177e46, -0x01578870,0x01bf0f2a,0x01823b6e,0x00c689a5,0xffde44b8,0x02211a54,0x02985b20,0x01edf624,0x020b0e50,0x01d28854,0x019b2b70,0x0172f87c,0x01877c5e,0x0165b70c,0x0124da74,0x00bd8cd9,0x00a46094,0x0094c617,0x0079262c,0x006a7b4a,0x004139be,0x0015be87,0xffd07f08,0xffc47a77,0xffda871f, -0xffe0b050,0xfffe22b8,0x000aa5df,0x00400a54,0x004342b4,0x003cba85,0x00253f12,0xffd51b2b,0xff4bc2f4,0xff6a04b7,0xff7b1f2f,0xffa4c142,0xff3adfc6,0xff605506,0x001b20cf,0x012e1a0e,0x01331d7a,0x0167587a,0x0169d368,0x0189f32a,0x01705d98,0x016a1ba2,0x015a0b14,0x01543f02,0x01238338, -0x010c6982,0x00fa3ea1,0x00d51f01,0x00945716,0x007c9794,0x005d260b,0x0058fd9d,0x003f7243,0x002a3943,0x0017e787,0xffeacdad,0xffb13853,0xff84f0bc,0xff4dcced,0xff3a66e3,0xff28e20d,0xff13c9e3,0xff2617fb,0xff3aec35,0xff446051,0xff8742e4,0xffaafe5e,0xffd851a6,0x004644b8,0x00afccb0, -0x00fb4328,0x01138cd2,0x00fa8ba2,0x0110dab0,0x00c9f16c,0x01020aa6,0x01069276,0x0107207c,0x011efa2a,0x012303f4,0x01122278,0x010ed650,0x00f4898a,0x00eb9338,0x00c87a8b,0x00b6952d,0x008c864a,0x00661ab3,0x006ceefa,0x003ac663,0x0019a767,0x0008bebc,0xfff5484f,0xffffbca4,0xfffc916d, -0xfffc7fb0,0xfff8576e,0xffee1138,0x001a80d9,0x00478515,0x0079875a,0x00a75e19,0x00dd593e,0x010d9416,0x0102e36c,0x00f6cd13,0x00f87750,0x00fe7f98,0x00de1bf9,0x00e0d74c,0x0121f3a6,0x00fcce5b,0x0096a98c,0x012cbb42,0x010aa8da,0x00b8e08f,0x00a80476,0x009a1c85,0x0087dafc,0x007bc136, -0x0070469b,0x0060c913,0x00e082b7,0x00fb2d2f,0x005a7083,0x00c8b79f,0x00dfe2fa,0x008f8f35,0x00948b31,0x00922b18,0x008cde84,0x0088a726,0x0085980b,0x007b81a1,0x009540c6,0x00a5e74c,0x00b76bac,0x00c779c9,0x00d63907,0x00f0674b,0x00e7a03a,0x00e86e1d,0x00e3ef03,0x00e4d2f8,0x00fc194f, -0xff8c227a,0xffa01b65,0xff5c016b,0xffd158bb,0x0083cb96,0x017d8698,0xff8eafd5,0x00556b43,0x0139629a,0x013e1f8c,0x0141a802,0x0146d550,0x0150f700,0x01523b3a,0x0154ac8a,0x0060aa11,0xffa86aa7,0x0179c9e6,0x007ff864,0xffe6ad50,0xff72bd97,0xffa3cb4e,0xff888b57,0xff837d35,0xff8120f6, -0xff7b5468,0xff70f067,0xff6e4745,0xff6ba4b5,0xff65fb11,0xff75e1a8,0xff786e45,0xff6baa55,0xff7bd0b3,0xff86abaa,0xff9be5c2,0xff8fbc55,0xff9e5b69,0xff74ae6f,0x00c7f67d,0xffc1fb2d,0x005deb16,0x0021c655,0xffc66a72,0xfffdd1dc,0xffb439a0,0xffb8f355,0x0007fac0,0xffb9457f,0xffc79fec, -0xffc8cbe1,0x002076d7,0x00117642,0xffeeb46f,0x0005d7a1,0x00db9922,0xffa5d906,0xff8e718a,0xff715733,0xff554ef5,0xff4eea13,0xff3c4294,0xff21c7cf,0xff171863,0xff1652c3,0xff0efdd1,0xff3cab47,0xff459b42,0xff24f36d,0xff4c2a94,0xff66e19b,0xff9bc65b,0xff907b79,0xff890bac,0xff7e05ef, -0xfff5e327,0x0006cf5a,0x00ca7ab0,0x00171ed5,0x00065809,0x00322c02,0x002b6fe8,0x00098bf5,0x006464e5,0xffe4f8dc,0x002ca671,0xffe4442b,0x00372ceb,0x00158d2e,0x002d9752,0x005605c4,0x006e1c5d,0x00097638,0xff825cb1,0xff68a460,0xff28ea4c,0xff1e89f6,0xfef8d9e8,0xfec85a36,0xfeb021ee, -0xfea55aae,0xfe984508,0xfeee3110,0xfeffc7ae,0xfebabe18,0xff15e170,0xff5bc89d,0xffb04c8b,0xff9d42fa,0xffc07df3,0xffd72d60,0x0041f960,0x00510fbf,0x011c9552,0x00149938,0xffd7ef09,0x0059b506,0x00215ee9,0x00411652,0x0092947f,0x002f1fa4,0xffece1e6,0x001771f2,0x00387ed4,0x003bb093, -0x008e89d6,0x007b1056,0x00cce1d7,0x003c4010,0xff855d3f,0xff4168aa,0xfed6b242,0xfeb8ce80,0xfe7385b8,0xfe278b30,0xfe00bd70,0xfe0f7d5e,0xfe102666,0xfe9cbac8,0xfebb0068,0xfe51c24c,0xfee12f0c,0xff39c2af,0xffad8527,0xffbaa185,0xfe9944ee,0xff38954c,0xff767449,0xff5fc048,0xffc6f0f3, -0x0069a7ff,0x00a01622,0x0097a86b,0x003fb572,0xfff3f64a,0xffe30a51,0x0019ff60,0x00305bb2,0x002b296e,0x005e2ce8,0x0059b902,0x007cdbeb,0x006612c9,0x00abe79e,0x00302747,0xff41f1cf,0xff682bc0,0xff540830,0xff9a8948,0xffb18a00,0xffd3b20a,0xff83d7bd,0xff3949c9,0xfea53f40,0xfef69698, -0xfede9f4a,0xfea49ff2,0xfed5c3d8,0xff55ba2f,0x004280a8,0xff631f30,0xffa852b1,0x01420406,0xffe02126,0xff584f48,0xff9dce2f,0xffb2fa21,0xffca7de3,0xffd4cc35,0x0005a248,0x001e0d27,0x0002b7ed,0xffefef4f,0xfffcb740,0x0020f1ed,0x000f7d74,0x001786e0,0x00387d85,0x001ef87b,0x00582b7f, -0x001e6ada,0xff4f593c,0xff059de5,0xfe56718a,0xfec3ac2c,0xff285953,0xffae715b,0x000a7da3,0x00484bee,0x0054087a,0xfff38f48,0xfff56517,0x006f4710,0xfee9f040,0xfe7fa13a,0xff3e0bde,0xff12ba84,0xff858680,0xff9c7c6e,0x0006b8a3,0xffd51012,0xff73c9eb,0xff49dda7,0xff793059,0xffbcb864, -0xffae1837,0xffb9f1bf,0xffef9928,0xfff7fd32,0x0016d9ea,0x000d9efe,0x001b750a,0x002246cc,0x005b35da,0xffd99c85,0x000314b1,0x00674d70,0x00061f25,0x0024ec3b,0xffdfd5a6,0xff326e87,0xfe8ba444,0xfe374906,0xfdc9b638,0xfe09696c,0xfef40d94,0xfebc318e,0xfe4746f4,0xfdb3c4e4,0xfdbe3b28, -0xfe0b2bda,0xfde404a0,0xff419fa0,0xff407a63,0x003a9b53,0xfee32f2a,0xfe4f0666,0xfee8870a,0xff332283,0xffc02b14,0xffce5251,0xffd15dab,0x0000940b,0x000d3a05,0xffefdcd5,0xfffa483c,0x0024cf2a,0x001760d7,0x000f1680,0x0000df44,0x0006a838,0x00493236,0x0018f677,0xffa1d40e,0xff615279, -0xff0fdfdb,0xff3968c2,0xff5b7a68,0xff8feaa8,0xff2bb054,0xff3529c4,0xff8cdc9d,0xff6363bd,0xff34962a,0xfebf577e,0xfd79f8e8,0xfcaf5824,0xfc4244b8,0xfe3bb952,0xfb026660,0xfca4abe4,0xff538d4b,0xff869584,0xffc91fd6,0xffa0f767,0xff5589be,0xff611bda,0xff84af8e,0xff806e43,0xffd05ac8, -0x0017ac62,0x001f8bef,0xfff764b5,0x00033613,0x0012a6c8,0x0039bf4b,0xffd9c21e,0xfff79701,0x0003d5e3,0x00245843,0x002cde23,0xffb446c4,0xff9920e8,0xff51fb44,0xff029f2e,0xfee676b4,0xfedcd30e,0xfe93c5c0,0xfeccc71c,0xfeab6794,0xfe395e78,0xfdd331b0,0xfd6f8124,0xfce67008,0xfbc3fde0, -0xffcbbaaf,0x00d6f84a,0x020f09c4,0x0176c3c8,0x019e94f0,0x013d9e24,0x011311fc,0x014385d2,0x010f16ae,0x00ed29ba,0x008b129d,0x007b6d8f,0x0055a479,0x00374eb5,0x002f846b,0x0009b489,0xffe60802,0xffd9a5db,0xffd69716,0xffed7e12,0xff9622fa,0xff66cd72,0xff521e8d,0xff5aaff3,0xff55005b, -0xff643f1a,0xff6cbc32,0xff74726e,0xff62d6d5,0xff4eb54f,0xfecd7b72,0xfdd146a8,0xfde4a204,0xfdf29e90,0xfe3e1590,0xff2ddfb5,0x002d077b,0x00c415b4,0x01026802,0x00ff6632,0x01572d08,0x0134ec9a,0x012d8c9c,0x01137484,0x0115d7b0,0x00dbdb44,0x00e67641,0x009d9d59,0x00bb8cd4,0x00811e3b, -0x006dfb1b,0x003a479e,0x00223d00,0xffe89a84,0xffad0cb3,0xff3d20af,0xff0a8b14,0xff0abde8,0xfeee6a3c,0xfee7a198,0xfedd83cc,0xfed78d4e,0xfe95ac9a,0xfe58594a,0xfe1c631e,0xfe1538b8,0xfe1c56b4,0xfe0ed03c,0xfeaf6484,0xff36e00a,0xffa63555,0x00031222,0x002e1030,0x003ba79a,0x01216e70, -0x0068a606,0x00abd3d1,0x00bea6dc,0x008d6471,0x00a3f345,0x0057afa6,0x003dbe13,0x004c69c8,0x0002ec9b,0xffe8a27f,0xffd650ca,0x0005aa90,0xfffd0e01,0xffc4b118,0xffd2051c,0x0024624c,0xffe4d541,0xfffa5cfc,0xffe1dc16,0xffd58e87,0xffc9d09b,0xffbafa14,0xffaf8665,0xffae9f28,0xffaec36b, -0xffa78a78,0xff9fc824,0xff93a47b,0xff7b2976,0xff9be9da,0xffb37ece,0xffdac9a7,0x00006fba,0xfff7fa56,0xffddff44,0x004486ff,0x00bb6176,0x016a66ee,0x0010c50e,0x00b28463,0x01638414,0x0161d4b8,0x01602e1c,0x01528ecc,0x015f76b2,0x01633b40,0x015cb63c,0x007eaaf7,0xfff13852,0x0143d594, -0x007f8a95,0x0013b3f0,0xffd9e80d,0xffe38369,0xffd7bcae,0xffd59035,0xffcdc623,0xffc7f011,0xffbfd580,0xffbe7f25,0xffbb7dd0,0xffba7436,0xffb5db2d,0xffb3fc69,0xffacb861,0xffc15ad2,0xffce2656,0xffd901be,0xffe20fc1,0xffd6e4c6,0x00d64da1,0x00b275c6,0x010b8d60,0x003a5def,0xff8c55d8, -0xff1800f6,0x008b5960,0xffabbd35,0xff127454,0xfefee106,0xff012049,0xff259e66,0xfefda5ce,0xfef83f1c,0xfefa942c,0xffa5e26c,0x006de98d,0xfeef7ce2,0xffa1a51d,0x003ed4d8,0x0113b71a,0x00c6d182,0x00d99e67,0x00d854af,0x00d7da61,0x00d135ef,0x00bf841a,0x00be621f,0x00bfca69,0x00c266e1, -0x00d8b834,0x00dfedd5,0x00d849af,0x00dfb14f,0x00d66133,0x00b00139,0x00c403ef,0x00c93709,0x00f3594b,0xff7e1622,0x00d5ae3e,0x00799c4d,0x0027af8c,0x006554f4,0x00654c9a,0x00a35659,0x009a4c02,0x005d4990,0x008eeca2,0x0083c8d1,0x006a0155,0x002a4512,0x004cfd66,0x0065fd3a,0x0092b7f8, -0xffacf543,0x00fc5226,0x010b24a8,0x0102477c,0x0110a800,0x010f93d0,0x00faba7b,0x00c4fe53,0x00b678bb,0x00b7dd38,0x00c3ce89,0x01033c22,0x011396a0,0x00ed9e24,0x00fd5cdf,0x00dbe934,0x0085b4c3,0x00ab236b,0x00d9e9ba,0x00c779be,0x0042d430,0x008c3b06,0x00a2e1e0,0x0033a66f,0x001e76a4, -0x0068caf2,0x001c8f3a,0x006986ec,0x004ff67b,0x0094a129,0x000d0fa9,0x0058cf36,0x001c652c,0x0068870b,0x005e6e06,0x008e6683,0x006eabf4,0x00e611f9,0x014cf9fc,0x01236e28,0x013d4348,0x01370ce6,0x010ddc1c,0x00ab8db2,0x00995fc0,0x00a24423,0x00cb6c07,0x01393218,0x01622076,0x01265ec0, -0x013ab298,0x010bc876,0x0073c1ad,0x00b0d93d,0x00edac48,0x00d2dcda,0x0079ab23,0x010fb434,0x015f0896,0x0058011c,0x0006e9ff,0x0063cc7b,0x004c0b20,0x00541149,0x00ba9c63,0x002bbc38,0x001bcd0b,0x0050aa39,0x00758585,0x00a5e867,0x005b8c98,0x00f94979,0x008de0a6,0x0117b644,0x018ec290, -0x016968f8,0x01a1849c,0x01949f2a,0x014c60b2,0x009ef2d3,0x005ecbec,0x00744f67,0x00b8e690,0x016bbef4,0x01892ac2,0x01164cfc,0x012793e2,0x00b00eb1,0xffe2d135,0x0041db1e,0x017ec214,0x00505003,0xff2bd4f0,0xff3a1545,0xff37d916,0x001f332a,0x00c8c5bc,0x00ba5045,0x006386c3,0x0012cde2, -0xffe7c0e6,0x00296dcc,0x00427c8b,0x002b5322,0x00738b45,0x009ff9ec,0x007c0472,0x00f86860,0x008abdc7,0x00e444fc,0x0167445c,0x00e5c51c,0x0109826a,0x0083a11e,0x00830792,0x008e3ab0,0x013cb920,0x016a9b74,0x00e5d675,0x01a3656c,0x01de2300,0x01a852bc,0x01b18fb8,0x020bf780,0x02b3f154, -0x01c68326,0x00c067ac,0x0203d28c,0x0041fa32,0xffeb6aff,0x006e944e,0xffdecd6c,0xffdeb347,0xffec5cc1,0x00228f45,0x003c17c1,0x0023783e,0x000472c3,0x000cff75,0x004203c8,0x004febc6,0x0066caf9,0x00620b4f,0x004c6455,0xfffc03bc,0x0083bcb7,0x00f4a9fb,0x00ea1342,0x013670be,0x00d6b370, -0x00955f77,0x00630fde,0x00324127,0x005e5dc3,0x00bba20e,0x006fe301,0x006769fe,0x008f85c6,0xff90c710,0xff253ff1,0xff49bc22,0xff961691,0xffebc261,0xffea678e,0xff9c5110,0xffcbf3f1,0xff534b8e,0xff765696,0xff6522f3,0xffe8f982,0xffc738b5,0xffdd2658,0xffff74bc,0x0024b827,0x003c58ac, -0x0013057b,0x003375a6,0x00792a97,0x004aee2a,0x0052a94a,0x0051b6ac,0x00d05ed5,0x00da89c2,0x0082fcd0,0x005e150d,0x00f16eba,0x01649f02,0x01a40efe,0x0176bd36,0x0149069a,0x01454592,0x0198a14e,0x02215ee8,0x027fbffc,0x0264ad48,0x0210d240,0x0170a200,0x006250d0,0x01134b10,0x00297632, -0xff439d9b,0xff1d931a,0xff0f14fd,0xff9f7860,0xffe57750,0x0022739d,0xfff52bef,0x001955ed,0x002011fb,0x0006a866,0x000a4f17,0x003b32ae,0x003f4cae,0x0033151a,0x0044b5e1,0x00656e7c,0x0016b341,0x004ff682,0x00d18d76,0x00e9a211,0x00dbe7aa,0x00d34880,0x009bfdab,0x004627bb,0xffe5b3bb, -0xffda32a3,0x000f476f,0xffbc3d14,0xffccfe11,0x0034f179,0x0085ddc7,0x010addee,0x01dbe9da,0x0122ffc0,0xff28f052,0xfd77c0f0,0xfd725398,0xfeeb1052,0xff8b73f8,0xff1de72a,0xff1c51e9,0xff79420b,0xff6541cc,0xffa390ef,0xffd8c848,0x002ad661,0x0038decb,0x0021bd32,0x00143e7e,0x0018c8d9, -0x0052cef3,0x001c111a,0xffe420b8,0x00722904,0x007056a1,0x002906c6,0x0002ab93,0xffdfb0dc,0xffe977d5,0x001cc0a1,0x00500e3f,0x00725fb2,0x006c5ba9,0x00a7d8f8,0x00c1f582,0x00dfb14a,0x00c2ddf1,0x008bb946,0x006ef264,0xff81cf57,0x008ef554,0x00e19fde,0x00a897dc,0x00f38751,0x00f5f6a0, -0x0107ccac,0x0118f718,0x0126da5a,0x011d791e,0x00f2565a,0x00aedefe,0x0083de6c,0x0063aca3,0x00491df9,0x005b05a5,0x0044cf34,0x0035398d,0xfff798cd,0xfff00f0b,0xffe67188,0x0021eb45,0x0041cbdf,0x0039b24f,0x00369bd9,0x001b7017,0x000d8dd9,0xfffd996a,0xffd8994d,0xff8de0c1,0xffd1f16e, -0x0006714f,0x004a2db7,0xffe63123,0xff9c5273,0xff842868,0xffe1630c,0x00f056b1,0x01219864,0x00fb93c3,0x01400752,0x01415ccc,0x0137e372,0x01230f00,0x011d9f0c,0x00e5fdd4,0x00e86a8f,0x00b54551,0x00d415c2,0x00988743,0x009fa0f4,0x005f8d77,0x004975d4,0x00120012,0xffe7d5f5,0xff9b7323, -0xffacfa17,0xffadc3ce,0xff636194,0xff3ec8f3,0xff2dee42,0xff251933,0xff142b2c,0xff1b6e48,0xff2170ad,0xff21997e,0xff2df03b,0xff25db12,0xff2355ad,0xff8114dc,0xffe773ae,0x0041d03c,0x00947ee1,0x0074515a,0x0082d217,0x002621c7,0x00854992,0x006c1cc4,0x0074b887,0x009e1f01,0x00a68239, -0x00a3482c,0x009017d9,0x0051c27a,0x00590807,0x00479f8c,0x0025d6a6,0x00095cd3,0x00163cb4,0x002af490,0x002c466b,0xfff489ec,0x003a2e01,0x001253c2,0x00058123,0xfff39819,0xffdc025f,0xffc31568,0xffa32ffb,0xffcdfab7,0xfff018f5,0x0013adac,0x00332f32,0x005a723e,0x0076c797,0x007aded7, -0x00715f0d,0x006fcb76,0x006d4e0d,0x00548b3b,0x0068369f,0x00300efe,0xfff13adc,0xffd2abfb,0x00521c3a,0x000143e4,0xffdfa5c2,0xffc99ae0,0xffbb658f,0xffbb3e97,0xffa154a4,0xff904036,0xff83f258,0xffda6260,0x00311dbf,0xff95b0eb,0xffd915c2,0x001ed140,0x004bd933,0x002ff01e,0x002da6c3, -0x00226860,0x0019d2a8,0x001334e5,0x0003d66c,0x00176214,0x00216c17,0x002ce40c,0x00378b45,0x0040494e,0x004e80e7,0x004be0f6,0x0050ea59,0x005500f3,0x0058e7d6,0x004c65ce,0xffdafded,0xffe7c67e,0xff9421a1,0x00938fc4,0x01223380,0x014bc6ae,0x003e833a,0x00f4a6fa,0x01410636,0x014813da, -0x01455d54,0x012861d4,0x0141b03a,0x013f4eda,0x012e8650,0x00fc76d8,0x005cb620,0x013b49aa,0x010fb9f6,0x009f3563,0xffae352d,0xffea100a,0xffd73986,0xffd1ba90,0xffd013d7,0xffcb7ea9,0xffc39842,0xffc27ce1,0xffc126c6,0xffbc1695,0xffcd6c34,0xffd272fb,0xffc8e239,0xffdcf01a,0xffe49259, -0xffe86188,0xffe03d80,0xffdc3ddc,0xffe7d29e,0x0140ab8c,0x002985a5,0x00c0e84d,0x00713618,0x0018efad,0x004374f3,0x0001ed34,0x002b0d56,0x0080aa8e,0x0038c122,0x00244005,0x0031e986,0x0067f302,0x0050ff37,0x006498ca,0x004ff5d8,0x0125a730,0x001ed30d,0xffdde484,0xffe397e4,0xffc1353b, -0xffb9c3b0,0xffa38f8c,0xff8a765d,0xff83aaf8,0xff87ed86,0xff85a98d,0xffba6425,0xffceec80,0xffb97f9d,0xffeeda10,0xfff8c125,0xfff5a63e,0xfff0562e,0xffcb9725,0xffeefda0,0x00af31fe,0x00721156,0x00f46a14,0x004eafc6,0x003a897a,0x00568d16,0x006dd893,0x0021677e,0x009baebe,0xffffea30, -0x006c02e0,0x00141d6d,0x0074e9cd,0x004a3ef1,0x005a0911,0x0089c246,0x00d3dbea,0x0075943f,0xffd212ff,0xffe32f3a,0xffab7de0,0xffa6b9ea,0xff8038f9,0xff5f1240,0xff4acc43,0xff4a73ae,0xff4195e0,0xff97cf1b,0xffbdd662,0xff8a9bf4,0xfffa5d28,0x001f3754,0x000ec6b5,0x0016e4f6,0xffe09cb1, -0x00478f3e,0x00f3b3af,0x00c4aca0,0x012d2eaa,0x00406fe8,0xffdb1148,0x0042afd1,0x00245410,0x004d2e5b,0x007c8759,0x003931b4,0x0003e273,0x000b4f01,0x003ed83d,0x002e46f6,0x0099e0af,0x007dfc7a,0x01188b3a,0x00b1d69b,0xfff25bb8,0xfffa228b,0xff9e5ac8,0xff8399a8,0xff3f366b,0xfeef8f16, -0xfec90cc2,0xfee168b0,0xfee5fd60,0xff88bf5c,0xffc92a19,0xff8a5920,0x003a88d4,0x003fac73,0x00021a0a,0x0023662e,0xff385087,0xfff1c19d,0x004aaf5f,0xffbaf058,0xffb63803,0x007ab5d1,0x00c7cad8,0x00d5d8d0,0x0077e39a,0x00118d4c,0xffdce199,0x001743a8,0x00327ff9,0x00400529,0x007bbe3b, -0x0065dc4a,0x0093686d,0x004f1cd6,0x00d77357,0x009edc6e,0xff6234eb,0xff816c4c,0xff440f1e,0xffa73be0,0xffa0892d,0xff783107,0xffa67476,0xff6e4b51,0xfe9035d8,0xff55d28f,0xff7ac6e0,0xff425011,0xff8b0e6b,0x001d76ce,0x0111f292,0x0042599a,0xff006e70,0x00d4e66d,0x00994413,0xffedd001, -0x002adb21,0xffcc46ff,0xffa486ae,0xffdd2b71,0x000a2110,0x0034a549,0x0028d44c,0x0007585f,0x000dd439,0x00201931,0x000f8561,0x003b5133,0x0079c4d9,0x0060c7ab,0x00a332c9,0x005ba67a,0xffdb7266,0xffec5fd0,0xff6215f9,0xff99f848,0xffd1a25a,0x0032d184,0x0061e382,0x007761e4,0x004a963c, -0x001be2f2,0x004a2ee0,0x00d2c913,0xfffb4601,0xff713e85,0xff2a1bca,0xfefb8692,0xff983a18,0xffcdcbaa,0x000a318f,0xffc127d8,0xffccee56,0xff78b8e4,0xff97a662,0xfff1db56,0xffce9143,0xffc2e07e,0xfff44421,0x000ca5a1,0x0025480c,0x000c5345,0x00342d85,0x0044411a,0x006559f1,0x0006d36d, -0x0056f62e,0x00465f66,0x0008bbcc,0x005aeb38,0x000b5d6b,0xffb37efb,0xff4861ca,0xff1a09d8,0xfeacfb66,0xfeae35ec,0xff54863d,0xff236f2c,0xff30c08f,0xff9ca274,0xff7fc11d,0xffac3328,0xff7b89aa,0xffb312fd,0xfffbf491,0x00371014,0xffabd12e,0xff2937a1,0xff6670cf,0xff6f92af,0xffcb13cf, -0x001cd79a,0xfffc21e7,0x002227cb,0x002c41b4,0x000182fd,0x00080b8c,0x0036f143,0x0035de48,0x004f9772,0x004bcd51,0x00511499,0x008ead3d,0x001ff2a3,0xfff7cbcf,0xfffcaeda,0xffc67620,0x0000ed6e,0x00212005,0x00230364,0xffffc48a,0x0014a410,0x0053a119,0xfffa4761,0xffae0bce,0xff1b55ee, -0xff1bd454,0xff147ae7,0xff02ebe7,0xffe570c3,0xfdebfaa0,0xfe21288e,0xff25548b,0xff2fb7ac,0xff763d6c,0xff374d66,0xff12b883,0xff7b6fbf,0xff87bca9,0xff7cf862,0xffcadaa4,0x0009c48c,0x00280605,0x00284876,0x001cfa2e,0x001d3883,0x0030e06f,0x0020958d,0x00688c4d,0x00315b5e,0x003c568b, -0x00453034,0xfff6ba1d,0xffeec93f,0xffd07efc,0xffb154aa,0xffe60cf9,0xffe9b656,0xff93f166,0xffc2d68d,0xff8fcb41,0xff00f633,0xfeca2738,0xfeaf1d22,0xfe72e8e4,0xfe5ede0a,0xfefed0ca,0x001b5e6f,0x010b8056,0x00cca65d,0x00ea496e,0x00e49cd3,0x00bf7b83,0x00e94be4,0x00a9ed33,0x00946168, -0x0059ea8b,0x00693be1,0x004589e0,0x0035d678,0x003fa05d,0x004596d2,0x004b1c7a,0x0014e3a6,0xffeb2d6e,0xfff1b1b3,0xffd0fa6c,0xffc862ed,0xffc913db,0xffb8bc80,0xffafa09a,0xff9a94a9,0xff903257,0xff79084e,0xff5a2fc5,0xff76ec54,0xff6121ff,0xff1bcc85,0xfee51cae,0xfebb96fc,0xfe9e62fc, -0xfedb2d86,0xfff35839,0x00a41e36,0x011ec480,0x010b694c,0x016f554c,0x013bd2ea,0x0119fb10,0x00f52656,0x0101a368,0x00c63e37,0x00e8f98b,0x0092a309,0x00bd181d,0x008603c1,0x0072cb23,0x003233d5,0x001800cc,0xfff537cf,0xffe097ca,0xff920bba,0xff463fa6,0xff377f81,0xff0c89af,0xff02ea0d, -0xfef54a58,0xfee9e9b4,0xfedd7928,0xfed55c2e,0xfecea120,0xfea09f06,0xfe7252b4,0xfe354e06,0xfe9cc3a0,0xfefa858c,0xff3f5de9,0xffc2b73c,0xffe5c95f,0x00036f15,0x00b1cc16,0x0017c72b,0x00622db0,0x00636d98,0x0040eb4a,0x005c4f18,0x00209610,0x0025fd3e,0x004b043d,0x00113795,0xfff13c34, -0xfff30f04,0x0016545f,0x0004fe87,0xffef492b,0xffe32646,0x003775be,0xffc9dffa,0xffc13b97,0xffb3090a,0xff9e6009,0xff8de286,0xff77b515,0xff602868,0xff53fb39,0xff48a9f2,0xff459d7b,0xff47539d,0xff5327c5,0xff4fe23e,0xff73631d,0xff8d7758,0xffab13c3,0xffcbe079,0xffaff668,0xff989780, -0x0027f6e3,0x008296de,0x00b3a13b,0xfffb87d0,0x007d6a12,0x00c91948,0x00ca29a3,0x00c6b439,0x00ae9fcc,0x00c0466f,0x00c383e1,0x00b8c14d,0x006ed2b5,0xfff1cc08,0x00ad8ccf,0x00627ef9,0x000728b2,0xff8274ff,0xff980bba,0xff896fe0,0xff82fea6,0xff793b03,0xff714aa7,0xff67d456,0xff6c35b0, -0xff6db5f0,0xff6ce1d8,0xff6bc2bc,0xff69cf8a,0xff662583,0xff777d78,0xff84b6f5,0xff92663c,0xff9cb3fc,0xff7f3945,0x0052a7ef,0x004b7367,0x0082e6f9,0xffa2544e,0xff5d6f82,0xffc54f62,0xffd29495,0xff67e042,0xff8f78e8,0xff8875be,0xff8d9ded,0xffb69bee,0xff9bd267,0xff9c9e3c,0xffa9b8f1, -0xff659230,0xffc0fe8f,0xffb5f442,0xff716cd1,0xffa86859,0x0087bfb2,0x00514f39,0x00534061,0x005150d5,0x004fa641,0x0048c806,0x00388c75,0x003a68a8,0x003bc573,0x003ce685,0x0046ebe6,0x0048d37b,0x0044801b,0x0042da41,0x0042fda9,0x00427716,0x004c8bc7,0x00684093,0x0048f0f2,0xff91c199, -0x004e380b,0x0011bc1f,0xffec009b,0x0007f032,0x000ec92c,0x003ea448,0x0023c722,0xffe7db50,0x00130824,0x0024a3ca,0xfffd0bce,0xfff113c4,0x0008f1e1,0xfff6dc28,0x0032d788,0xffc1649e,0x00604cfe,0x007b5a86,0x00541d12,0x0059399f,0x0055b50a,0x00493735,0x001f3b6e,0x001c7d61,0x001ae74b, -0x001aad47,0x003d5868,0x003ebc6e,0x002958b4,0x001d1a95,0x001b1699,0x00288731,0x0039cb02,0x008ef515,0x004d5c54,0xffdbf419,0x0020817d,0x00503645,0xfffa0d01,0xfff392ec,0x002ac036,0x00073c36,0x0058d5c5,0x000a01b3,0x0069dd0f,0x00025ae3,0x0015cf0c,0xffebdae1,0x001a113a,0x002959e2, -0x00407a2a,0x00157fe0,0x0074d2f2,0x00a2b9f4,0x00630451,0x005dc31f,0x0053e23c,0x002e1aec,0xffd58415,0xffdfd06b,0xffe72021,0xfff774a6,0x00276e26,0x00302715,0x00179c0f,0xfff49878,0x0009fd51,0x0036d3a0,0x004df841,0x00b385fc,0x00619b41,0x002f1a17,0x00ab5332,0x00f930c2,0x002d4837, -0xfff6f36a,0x004ff61c,0x004e7f43,0x005cc0ca,0x00b496ad,0x00433248,0x0021f963,0x0041d113,0x005acec2,0x0072e226,0x003587b6,0x00b82e31,0x006ba25d,0x00cca334,0x00d0f7aa,0x0063d503,0x005a8180,0x00463eb2,0x0010c69f,0xff8de105,0xff7d4948,0xff97c6fb,0xffb918fc,0x000e1822,0x0003409c, -0xffcfa260,0xff94f391,0xff9220c1,0xffef9812,0x00153749,0x00cf3444,0xffb827be,0xfee66dec,0xfef69426,0xfefe9610,0xffeb2768,0x009511ce,0x00b5690e,0x007c55b4,0x00195bf3,0xffdd37ca,0x001b1a48,0x00384f76,0x00308182,0x006eee61,0x007fd7a2,0x005386ec,0x006e7dc7,0x00010799,0x0029ef47, -0x0085100f,0x00728de1,0x00d90065,0x0058e15f,0x006cf816,0x00a52143,0x014ac68e,0x0137cdac,0x0024d2d4,0x00aa9891,0x009462bd,0x00153bf8,0x00305330,0x00c2a862,0x01de25c0,0x0106c44c,0x00205627,0x00ba7f25,0x000104ff,0x000cf5a6,0x00369b4f,0xffd27b69,0xffc9c3a0,0xffd1916a,0x0015b734, -0x0035ffa7,0x003d2242,0x001a8c59,0x0015cdbf,0x003d9424,0x003317b7,0x0048e19a,0x0045d389,0x005ec8b2,0x0030ba4c,0x0036ed9b,0x005fcbfd,0x0018bc5d,0xfff85883,0x0010b1d0,0x0014387b,0xfffb7e10,0x00384f61,0x004fd210,0x002416b4,0x0031be8e,0x0010fa1b,0xffe67612,0xff44fc63,0xfef8a8f8, -0xff197f14,0xff45aaaa,0xffa38904,0xffcce3fc,0xffb6bb35,0xffd958be,0xff9b8f00,0xff9513e0,0xff6a4310,0x0007d1da,0xffd16c43,0xffe1a750,0xfffdc576,0x0020b077,0x003489a1,0x00139f6d,0x0021857e,0x00593fbe,0x001fe3ce,0x0024203d,0xfff40ec2,0x0036f58f,0x00bf0d16,0x008b90ce,0x0048c3f2, -0x006ae27f,0x0058e19a,0x00228cc1,0x00294baf,0x004f4a75,0x00981746,0x00fe7f50,0x00ff481f,0x0075f616,0xffd78bbf,0xff8b7d14,0xff4bc025,0xff96e154,0xffb45718,0xffa5d517,0xffad4764,0xff8cee27,0xff80118c,0xff964e4c,0xffd7a6aa,0x00486a40,0x000f71e9,0x002cdf0c,0x00282e32,0x000da41a, -0x00116ab3,0x002ee122,0x003d2ed2,0x00447205,0x00502a7c,0x006fcfdb,0x002a4464,0x0037e81d,0x00889b62,0x006ce6d4,0x004d0386,0x004ab43d,0x00360065,0xffde9b20,0xffc5438f,0xffa246c4,0xff62abf6,0xff2b03ed,0xff31b596,0xff86d356,0xff5baa16,0xff5d5a3d,0xff3b68ee,0xff68ec04,0xfe8682ca, -0xfd9a7b8c,0xfdc8f2a0,0xfe85de22,0xfefe878a,0xfed635f6,0xfefecb94,0xff58dfdd,0xff4a2625,0xff812d23,0xffa9ef39,0xfffd00c7,0x00223b77,0x002b2956,0x0020b8f9,0x00227114,0x004bc551,0x001840ac,0xffe5a064,0x002e4df2,0x00588d18,0x003d6aea,0x00312733,0xffe72b6f,0xffbd51bd,0xff8d396f, -0xffa0954a,0xff93c1ec,0xff507d46,0xffdc4983,0xffbd3199,0xff40ee1b,0xfed77380,0xfe9a9ad6,0xfea37026,0xfe7aa79a,0xfedaf810,0xff0430c9,0xff870df2,0xffcd551e,0x000333c1,0x00525fb8,0x008a6718,0x008598e8,0x00777a07,0x0068b359,0x005e2a46,0x005fa9b5,0x0052fed8,0x004dcd37,0x00447b53, -0x002b0b6c,0x0027cbc6,0xfffa0e0f,0xfff5ceb4,0xfffdf3d0,0x00370049,0x003c14c1,0x0032eb96,0xffd45222,0xffb0244c,0xff90d051,0xffadb853,0xffbd1602,0xffb11660,0xffc53ce2,0xfffa3734,0x00584c3a,0x0011f5c4,0xffadc865,0xff48d7c0,0xfed490c6,0x001ff0c6,0x0059ac86,0x00514558,0x0086c54f, -0x00b7d794,0x00baaa3d,0x00b3ffd8,0x00bf3f77,0x00a9084d,0x00b61f46,0x0091e105,0x00a54a60,0x00801dc1,0x0075572b,0x00467560,0x00271271,0xfffb7e33,0xffdc2afd,0xff9969d5,0xffbc8f08,0xffc665b6,0xff843528,0xff6d3ab5,0xff5833cc,0xff4ba6ed,0xff32f8ef,0xff33a273,0xff283214,0xff239e37, -0xfeffce5e,0xfecf47f4,0xfe9afb50,0xfecd23d8,0xff0ba665,0xff4f3a77,0xffb761b5,0xffeacf7d,0xfff40e8a,0xffeac730,0x000a982d,0xfff97b96,0x000355e0,0x001c8552,0x0025912f,0x0023d186,0x0008c281,0xffdc2fdc,0xffdf8176,0xffe6c5f6,0xffcd6fcc,0xffc7242c,0xffd9ab5a,0xffd123b7,0xffe586ea, -0xffc76f42,0xffe93699,0xffd4a32d,0xffc31d8f,0xffb3fb6c,0xff9dae01,0xff877d4e,0xff6f0f07,0xff7e4a5f,0xff852194,0xff8a2c79,0xff8d788c,0xff99a4a7,0xff97ec8c,0xffb80cd1,0xffc38640,0xffcd1d9b,0xffd50290,0xffcd8532,0xffe02860,0xff824595,0xff6df023,0xffb2013f,0xff9d71fa,0xff773364, -0xffa5aa2a,0xff99d1ec,0xff961f9c,0xffa172c1,0xff9242c0,0xff89ba67,0xff8a8567,0xff5aeedf,0xff884084,0xff8dda94,0xff5af888,0xff7ddd49,0xffd276ce,0xffba4e06,0xffb61bbc,0xffae7161,0xffa7a37d,0xffa29bc9,0xff988428,0xff9de612,0xff9ee718,0xffa0cff2,0xffa2bf58,0xffa328ba,0xffa11027, -0xffa84fb6,0xffb156aa,0xffbec837,0xffc5f0e3,0xffa97efb,0x00697540,0x006100f3,0x0044c007,0x00e66f8a,0x00e179e8,0x00443907,0x00c80f83,0x00d58179,0x006518cb,0x0067cb85,0x0063d9f1,0x0047182d,0x005339fa,0x004d1b4c,0x0034e1c1,0x00d53d54,0x00d1a56f,0x002c1f8e,0x00d7511e,0x00e8d2ec, -0x00559f18,0x0066546c,0x0068398d,0x00646702,0x006512f6,0x00621c10,0x005c21e9,0x0059ab5c,0x0058e8dd,0x0055683e,0x006698d6,0x006d54a0,0x00696158,0x00796748,0x00784aaf,0x00621bb6,0x006881ea,0x005cacaa,0x008c676c,0x00cbc79d,0x009a9a2d,0x00c8f823,0x007e4057,0x00685538,0x00721a50, -0x006f9372,0x009d9ac4,0x00ba9c55,0x00abb831,0x00832b06,0x00845047,0x0076cd40,0x0071dc12,0x00b166d5,0x008fdd35,0x00b8e044,0x00b0a51e,0x007a09c2,0x00929d0f,0x007efbf9,0x007d226a,0x006b769b,0x005487fd,0x004a1192,0x004ce62a,0x0050def6,0x0081ec55,0x00997e67,0x008ffeda,0x00b7aff1, -0x00a7fa37,0x0068b167,0x0078847e,0x005a3742,0x007b8275,0x00e35cc9,0x00a67355,0x00c5f839,0x005f5a33,0x004ddf8d,0x0061e154,0x007b94f0,0x0052d33d,0x009a8e98,0x00505d3a,0x007416c8,0x00440334,0x0070e464,0x006de625,0x00814972,0x009e3211,0x00de6707,0x00cfa3a6,0x00889d35,0x00a485de, -0x009061a3,0x00967e65,0x007909e0,0x005a1fa4,0x004538ec,0x004b09d2,0x0048ff2d,0x009a69c4,0x00c8c7af,0x00ac0461,0x01051b72,0x00ec7e07,0x006e2c88,0x00a05050,0x0045d831,0x009053e6,0x00fc0c61,0x00ecf1ed,0x00fc2cde,0x0057c7c6,0xfff54e71,0x002986ce,0x00390ca0,0x006186b1,0x00727d2b, -0x004205c5,0x0023b6ff,0x000cb208,0x004c72ce,0x004c06dd,0x00944642,0x009c2615,0x01035dfe,0x01087c96,0x00bff5cb,0x00e931b7,0x00cc005c,0x00c5344e,0x0092e011,0x003cfe73,0x000e4dce,0x001bccc6,0x003254d3,0x00d21c25,0x01106ce6,0x00f4aa8f,0x0166266c,0x010ed234,0x003ea47c,0x007d1ee6, -0x00bcdde8,0x00c4ec77,0x009dbc5e,0xfff24873,0xff76f39a,0x003e7a10,0x00b299bc,0x00df642e,0x00acb1e0,0x003f98f6,0xffe0ab0c,0x0016c77e,0x0031c334,0x004f9477,0x00877c21,0x00763248,0x0085d4cf,0x006b21ae,0x00b24bc0,0x00bc1323,0x00410beb,0x0031b65c,0xfff909f0,0x002276ff,0x0017ab7b, -0xffdf553d,0x0094bc02,0x008be5ab,0xffafffbf,0x003ae282,0x00845864,0x00d1bbe5,0x00e504ec,0x013dc6a6,0x01e8a208,0x01594354,0xfefd70ac,0x0015c1f6,0x010ba942,0x00b44ab0,0x007d1bbc,0x00332ae2,0xffd6ee39,0xffd001e9,0x000c47a3,0x0041c560,0x004b9923,0x001fe59f,0x001a4dd2,0x002db740, -0x0032c12f,0x00691fe5,0x00989a09,0x007cddaf,0x008de01c,0x007cae78,0x00b1fc32,0x00f28ff0,0x00c32108,0x008a65a9,0x0067e786,0x00710538,0x009ebbba,0x00870500,0xffec8eeb,0x0050e087,0x0067dd79,0x00324555,0x004a9572,0xfff1697c,0xff3b3512,0xff3c3961,0xffe4a2c7,0xfff5e889,0xffefa873, -0xffc8082f,0x000a92a4,0xffb2d10b,0xffa3e995,0x0021696b,0xfff593d3,0xffe03e7d,0x00091fa3,0x001d7763,0x0029b566,0x001785c0,0x0039207a,0x00616232,0x0051df4a,0x00373a4a,0x00749d68,0x0058622d,0x0061c8be,0x0087f7a3,0x003725a0,0x008be539,0x00a75782,0x009a3112,0x0091d7b2,0x00752a82, -0x004f65b9,0x00871c2c,0x011ae3c0,0x01efd778,0x01dcc760,0x01a0bf1a,0x01322416,0x004b1589,0x00d82bf2,0xffcce903,0xfff3db5c,0xfff2612c,0xffb4d316,0xffbc689d,0xffd4ea71,0x004624ac,0x001611b4,0x002d9f57,0x0036c883,0x00166067,0x0017387b,0x00449601,0x00496ec4,0x006b876d,0x007501c3, -0x00762a8d,0x008fb467,0x0049930a,0x00745fa9,0x00aee1fc,0x00a90a56,0x00cdbfa3,0x00b76df4,0x00524589,0x00953ff9,0x0094fde5,0x0053c123,0x002b2136,0x0008d943,0xffaddf3d,0x00fa5d9d,0x01a3d266,0x01dec226,0x018d567c,0x00d94a4a,0x0008c327,0xff1291d8,0xff18c455,0xff420db9,0xff2f2b8f, -0xff413912,0xff9c057a,0xff9ae0f7,0xffa0187a,0xffc7e289,0xfff10405,0x0019d31b,0x0046d287,0x0030f77b,0x003169f6,0x00425831,0x005b0bf8,0x00848cfb,0x004be849,0x00629cc3,0x006531ee,0x00352a34,0x001fcfdd,0x00334c6d,0x0072795b,0x00869433,0x00a8b6b9,0x00ca9f32,0x00d00b63,0x00a7fa51, -0x002ed7c8,0x004a0006,0x005a837b,0x004c0aee,0x00ce796f,0xff25846f,0xff977385,0xffa68724,0xfffb5b23,0x001a5d40,0x00797eeb,0x006c7e1f,0x0053e318,0x00332c3d,0x002908dd,0x0020ad7a,0x005f4362,0x0062e44f,0x00565006,0x004bb7de,0x0052e99f,0x006342fa,0x0019950c,0xfff78479,0x00020614, -0x00308f99,0x004df826,0x004f1c69,0x0047b367,0x003692ef,0x000e8ab4,0xffeed4e0,0xffb998d6,0xff89ac67,0xff787728,0xffcef550,0x0090f768,0x0039f760,0x000051d1,0xffb13f2a,0xff59e92a,0xffdf0310,0x003fb73f,0x00a90dc2,0x00aac0cb,0x00e2f242,0x00cac382,0x00b22ebc,0x00acee34,0x00ba5f70, -0x00a60739,0x00ce33ef,0x0085d730,0x008391fd,0x005d8e99,0x0050b918,0x002ee4c4,0x00206010,0x001875ec,0x0023d2b3,0x0008ffd0,0xffc69ded,0xffa754da,0xff799b92,0xff699461,0xff5878c9,0xff42ff5f,0xff66463b,0xff8712f9,0xffae461b,0xff94c01c,0xff630ae4,0xff2db36a,0xff3590c7,0xff4eb78a, -0xff59975a,0xffb5d1bf,0xfff19ae6,0x00148450,0x00222adb,0x000d689a,0x00307aa0,0x0028b1d0,0x002faa17,0x003dc0a6,0x002ccc0c,0x003af548,0x004eb92f,0x003f64ae,0x002a7591,0x0031bb97,0x00230d9b,0x0002102f,0x00034438,0xffd93c3b,0xffe5cf73,0xff905b0c,0xff756ce5,0xff762eb7,0xff66a7b5, -0xff593b4d,0xff488bfa,0xff32c48c,0xff37da03,0xff3bc72b,0xff49219c,0xff5cd72c,0xff80e02b,0xff9c81af,0xffb9f6b5,0xffcdf00e,0xffdba1f5,0xffed0ffc,0xffc553b5,0xffc43597,0x0019aeaf,0x0021e7d9,0xffd4ade7,0x001718d4,0x002ab67b,0xfffa0396,0xfff5ed0c,0xfff1053a,0xffdca75d,0xffe40e21, -0xffe1bdf7,0xffd96d80,0x00288669,0x000a397e,0xffd00af0,0x000d5729,0xfff93191,0xff8c005e,0xff9ab21c,0xff90122b,0xff87edcc,0xff80c706,0xff7a70e8,0xff70cbf1,0xff7ce1cf,0xff84b492,0xff8b02ae,0xff92065a,0xff964e05,0xff9d918f,0xffa24ae8,0xffaa6d03,0xffb4e526,0xffbd8599,0xffa0fffa, -0xffc99b46,0xffdcc116,0xffc7bf92,0xff95bfa9,0xffe670c1,0x00c10984,0xff80b5b6,0xffd14f7e,0x0080af3e,0x008a828e,0x008f7d57,0x009ebdfd,0x00a1e4c0,0x00a52d2a,0x00ab86a0,0xffd4d160,0xff8834b6,0x00ca820a,0xffeca530,0xff9f31f1,0xffcdef30,0xffd5e677,0xffc5eac1,0xffc2a137,0xffc1e577, -0xffbd9345,0xffb52180,0xffb65f71,0xffb5fed4,0xffb4792f,0xffb52aca,0xffb410d5,0xffb183b0,0xffb15fcd,0xffb9afe0,0xffd14d6d,0xffcfcb36,0xffeca37f,0xffad6b88,0x0036495c,0xffd75fe2,0xfffb091e,0xfff0d042,0xffce70a2,0xffe0310f,0xffe09137,0xffd4e610,0xffd1c82b,0xffd0a4d9,0xffe57e36, -0xffc4da9b,0xfff3ea3c,0xfff324aa,0xffd86982,0xfff68f67,0x004c5ce8,0xffcb494c,0xffd2967d,0xffacc2ca,0xff9e3e59,0xff9e60e0,0xff9a13cc,0xff875981,0xff89dc45,0xff8712cb,0xff814b06,0xff891cc8,0xff8214d3,0xff7b060b,0xff7160de,0xff88be2e,0xffcd47fd,0xffcf028d,0x00094441,0xffc87001, -0xffd2655d,0xffe52e4a,0x00398951,0xfff18382,0xfff23060,0x00014479,0x001d278e,0x003861bf,0x000ed3c1,0x002a7ecc,0x0028758a,0xffe275a7,0xfffac4df,0xfff1dc5e,0x001ea520,0x001c831e,0x00137fc3,0x0008ae66,0xffcfac09,0xffa89f87,0xff7be016,0xff7c4041,0xff6427f8,0xff38e17c,0xff472c40, -0xff47c3fd,0xff440690,0xff42808a,0xff385b67,0xff317ff6,0xff242591,0xff64b4b8,0xffe76ce1,0xffec564a,0x002d24a3,0xfff1c71d,0x0022c207,0x0045d51d,0x00904a01,0x000a3252,0xffea6388,0x0029199f,0x003d65d2,0x005ef5bf,0x00877a43,0x00584c38,0x0021f191,0x000f24b4,0x003132c3,0x002e4a5e, -0x004e2a4e,0x0064dab5,0x007d9d3d,0x005b73ea,0xffdf292c,0xff7ba7a0,0xff25904c,0xff20d063,0xff09b9a9,0xfed02ac4,0xfedd387c,0xfef1d3ee,0xff00911c,0xff0ceee9,0xfee9e438,0xfedb9b0a,0xfebe81bc,0xff1282f4,0xffe08605,0xfff76c7d,0xffcf24cf,0xff8d94a2,0xff639559,0xff3c62ac,0xff450a42, -0xffeeec67,0x0058c198,0x009a1dad,0x009f0782,0x0039981e,0xffde955a,0x0009658e,0x002761dd,0x004a9fb9,0x006cace1,0x0056c940,0x004330e5,0x000190a9,0xffe8f45b,0xffb00855,0xff84418a,0xffd51d4f,0x002099ed,0x0010d3a4,0x00232cca,0x004b0ea3,0x00a72a60,0x005ed29c,0xff406fe5,0xff4b4ffe, -0xff1b6134,0xfefeb038,0xff2634c2,0xffa70f69,0x00ad6eaf,0x001eee99,0xff58ce9f,0xff3831a9,0x002e63ac,0x006cbb50,0xffc8e657,0xfffd308a,0xffee852f,0xffbc7b7f,0x00024816,0x0030d276,0x00543b79,0x0025c91e,0x0014eea9,0x003269e0,0x00242cef,0x003db5a0,0x003bd87b,0x0053bcc9,0x00621574, -0xfff8bd6c,0xffd2b8ba,0xff820007,0xfee8d548,0xff48e0de,0xff9f36d2,0xffebf8ed,0x0048fb72,0x0046b03b,0xffaf04c2,0x000b9255,0xffcb700c,0xfeff3352,0xfefbd418,0xfefccb4c,0xff2e5e54,0xff3640b7,0xff881278,0xffae45af,0xffe098ff,0xffe62f83,0x001159dc,0xffc80030,0xff8a49ba,0x001187a9, -0xffea4ae1,0xffe320f4,0x000278fb,0x000ec6d3,0x001f5974,0x001d4f38,0x000fd789,0x00264a15,0x000ab6d9,0xffe5fc40,0xffcc6f2c,0xffdbf14b,0x00574144,0x0063952e,0x0013d746,0xffc4ad67,0xff3d06c1,0xfeb55176,0xfed9464a,0xff44af18,0xffac5021,0xffe6b367,0xff8d964c,0xfeae8780,0xfe1746a8, -0xfdf2f290,0xfe173aa2,0xff274a22,0xfefbf8bc,0xff9d98f4,0xffeb887a,0xffd02439,0xffcb8008,0xffa50d81,0xffd79ad8,0x002abda8,0x000bf669,0x0027149a,0x002512d5,0x000a7bf5,0x0011a806,0x00283e53,0x00319760,0x004a46fb,0x00411c94,0x004bb5dc,0x004f8fea,0x001a0b09,0x000413df,0xffd8fa8d, -0xffb95cfb,0xffaf35d7,0xffb8a98f,0xffa887a7,0xffa3e664,0xff6e593b,0xff01835f,0xff0e45a3,0xff0e524f,0xff1089e7,0xfe98c480,0xfe2e962c,0xfd86d16c,0xfe72aa02,0xfdefc758,0xfe907efa,0xff1e374d,0xfec9a2de,0xfecaee54,0xff10aa48,0xff3eebfc,0xff5ef278,0xff72bdc1,0xff8274cc,0xff9b4c25, -0xffd177b8,0xffff9463,0x002fcf48,0x0023b7d9,0x0029477f,0x0039d88d,0x001cb5bd,0x0016b50a,0xffe959b2,0x0036c807,0x0051426c,0x002d246a,0xfff92e73,0xffb850e3,0xff69ea54,0xff50321d,0xff2350f3,0xfeccfa18,0xff2c75bb,0xfefa1bdc,0xfe533f86,0xfdda5704,0xfdac4bc4,0xfdaeae54,0xfdd8cff4, -0xfe1bb1e8,0xfe37ece6,0xff123301,0xff2bd58a,0xff9c9321,0xffef72fe,0x000c63c4,0xffe3ed8d,0xffd9af48,0xffe7fa1b,0xfffdb5eb,0x003ceb7a,0x004bcbb2,0x004380ce,0x0022f013,0x000963d7,0x0002a2be,0xfffddd30,0x0004c191,0x0019e3ed,0x002f5d87,0x0016382f,0xfff04a3d,0xffb605cc,0xff9254af, -0xff8308b1,0xff850c8a,0xff9f14cf,0xffd3fb13,0xff8053f8,0xff6e05aa,0xff82cb95,0xffb910e6,0xff8aaba3,0xff0dd743,0xfe7e5616,0xff5b780f,0xff941b19,0xffc798f7,0xffd99c72,0x00298d30,0x002a8cd7,0x0036be56,0x0049f9f0,0x006a47d6,0x006f29b7,0x008477db,0x005c05bb,0x0061d92a,0x003d28d1, -0x0031fb86,0x00117806,0x00023673,0xffea6616,0xffc81f03,0xffb269de,0xffa93eb3,0xff9c1ca0,0xff980894,0xff878626,0xff7863ff,0xff64e94c,0xff4f4421,0xff2f7313,0xff1d6dd7,0xfefc5a40,0xfee1bdbc,0xfeb21eee,0xfebafd68,0xfeca8ee4,0xfee5d6ae,0xff2a3649,0xff9bb178,0xffa84607,0x0014dc9f, -0xffcdad1f,0xffe44259,0xfff094fd,0xffe6a8a9,0xfff1fd65,0xffda0b7a,0xffc0a818,0xffbf2064,0xffa8057b,0xffb07845,0xffa6b1a5,0xffb2b610,0xffb0cf6e,0xff853917,0xff90bddc,0xff997bbc,0xff83edbb,0xff89b5bc,0xff71dfe0,0xff647656,0xff52f477,0xff443df8,0xff353ab7,0xff346776,0xff2d6708, -0xff1d1513,0xff0fdddd,0xff018c71,0xfeef2152,0xff1ea498,0xff412c8b,0xff5e69d2,0xff781cab,0xff71ef44,0xff74bd30,0xff5b67cd,0xff8c38c7,0x000657cb,0xff56f843,0xff8d2819,0xfff8e29f,0xfff7e101,0xfffbf310,0xffffb2cb,0x00048ba6,0x000612ce,0x000bd495,0xff747e1a,0xff47ebc5,0xfff37233, -0xff6e8e87,0xff49ef6b,0xff72556d,0xff6970c8,0xff613ffe,0xff5d5419,0xff57a6d4,0xff52afc0,0xff4c05ae,0xff46878c,0xff4163bb,0xff3eeec7,0xff3a8d8a,0xff3741d8,0xff2af2a2,0xff3b6e68,0xff4601f4,0xff557604,0xff5fab61,0xff3b2273,0x00ba2dca,0x00a3d1fe,0x00cc09de,0x00980e66,0x00193f79, -0xff5cd5ad,0x00bf4471,0x002f9337,0xff7bce59,0xff79781b,0xff7947cd,0xff77bb9a,0xff6d0cc1,0xff672a97,0xff56e0ee,0x00292f63,0x00b04077,0xff49f3d5,0x0021a7a8,0x00959807,0x00cd51e8,0x00a8f5ee,0x00b9b9c3,0x00b906d9,0x00bb75fe,0x00b9eb6e,0x00b4284a,0x00b20dfd,0x00b289fb,0x00b564b3, -0x00bc3444,0x00c10100,0x00c2f395,0x00c751fe,0x00bfbb46,0x009e2621,0x00b24ffe,0x00ad4ebd,0x00d8dc07,0xfffa5165,0x00bb3712,0x0076457e,0x0047fe6b,0x0073b953,0x006148bb,0x009e426e,0x00b2f925,0x008abc17,0x00bbdaf9,0x009cc10e,0x0081e7be,0x004859e9,0x005a42f6,0x00981fca,0x008d53e2, -0x0004541f,0x00db030d,0x00d28d62,0x00e2f39d,0x00e88f5c,0x00efab6a,0x00e825d1,0x00d0d75e,0x00c7fabc,0x00c8ad41,0x00d82b3a,0x00ecec8a,0x00f637c1,0x00f2f132,0x00f7481e,0x00db91e7,0x008afdc3,0x00b03dac,0x00c8c7e5,0x00ba352c,0x008b1410,0x0084c63d,0x005ef999,0x003ee9cc,0x003653f1, -0x0047fa5c,0x004f730d,0x0070aa9a,0x005d2562,0x00956a14,0x0053b51b,0x004eb647,0x00372e3a,0x005fa95d,0x0078c67c,0x007a9247,0x0082d34d,0x00bfc571,0x00f3c526,0x00fb603d,0x010c0c26,0x011a8b0e,0x010c1c96,0x00e7e01e,0x00dde9a5,0x00e5001c,0x0101a98e,0x011b7fbc,0x0137ecec,0x0136e990, -0x0143d6c8,0x010f43d2,0x0078285d,0x00cb5b6a,0x00aa29a8,0x00a64756,0x009c1f9d,0x00d091f5,0x00af87ee,0x0047de75,0x000b997d,0x00153761,0x0045b947,0x0066d86b,0x007328bb,0x00535349,0x0040e728,0x001009c2,0x004d68d5,0x00654890,0x006f2946,0x00a7dfdf,0x00983a88,0x00e855bc,0x012659be, -0x013b0f00,0x015c7e50,0x01726652,0x0160ae08,0x0107b484,0x00e9da2a,0x00f1ea84,0x0133a470,0x01781b68,0x017bbec4,0x016fc154,0x015fa9cc,0x00f0a203,0x0017ad51,0x007d29ab,0x01bdc3c4,0x00ded93b,0x00172728,0xffb2f4a7,0xff4cdbaa,0xfff2599d,0x00768260,0x00ac451d,0x00c89f30,0x006d8a03, -0xffee9e16,0x00109adf,0x002cafd4,0x006126fd,0x007eb8c1,0x007d1501,0x00645d11,0x007ad5c0,0x00471cfc,0x007df434,0x00f2878b,0x00c89055,0x00d0b96c,0x00969df4,0x00880a99,0x006b47f4,0x013f347e,0x014a5974,0x009c4c52,0x00c952f3,0x0119969c,0x01b8971a,0x01a195c0,0x01c31358,0x021f9b04, -0x01d9381c,0xffaadad8,0xff77dea2,0x010b2c8c,0x013493d6,0x006150fe,0x00603242,0x001ce142,0xffce7a2b,0x000eb1c9,0x00436029,0x006bf3e4,0x003058c2,0x001dfe17,0x003da0e3,0x005d6076,0x008d4288,0x007b8b91,0x006939f8,0x003b87c1,0x00659798,0x011affb8,0x01403ede,0x01594cc4,0x01028cbc, -0x00cafbf2,0x00a6d41e,0x007738bb,0x00532f9e,0xffe8fc15,0x0091782d,0x00572889,0xff298e14,0xffcd520f,0xffdd35e2,0xff65b82a,0xffa96048,0x0004b054,0xfff3eb39,0xffb7da95,0xffd8052d,0x00227fd0,0x000b30da,0xffc3c6e3,0x0035016b,0x0011daf9,0xfffbe8eb,0x0018b04d,0x002394d4,0x002ec1e8, -0x002772b9,0x0024ea34,0x00560d22,0x001b1c67,0x0037b1cf,0x0049813b,0x0054c9b2,0x009bec0b,0x007f269c,0x004d98e6,0x00e33375,0x0142a142,0x0174376a,0x01a48dde,0x0190edea,0x0106301c,0x017ac11a,0x0222209c,0x02bb92c0,0x02906290,0x0218e1dc,0x01dfa146,0x007fe736,0x010a195e,0xffd36b5e, -0x00136fe6,0x005a4d61,0xffd9798c,0x00076a9c,0xfff28dfb,0x00321176,0x0011770e,0x0021a96b,0x002c663a,0x00182247,0x001aa5c7,0x003acb50,0x0049c684,0x00631282,0x0061a863,0x00672036,0x004c046a,0x004d3a91,0x00b2c90d,0x00ef2eef,0x0107d498,0x00ee4ba5,0x00bd9ce3,0x0072cc9a,0x008581d2, -0x005380e2,0xffdd0a81,0xfff29b88,0x000bbc68,0x00447315,0x018df3b0,0x0257c398,0x02e33004,0x01b65c16,0x01a9aa5c,0x0069880f,0xfed9855e,0xff063e1b,0xff046869,0xff30090d,0xff6dfa78,0xffa33708,0xffa7d9df,0xffc51842,0xffc70edc,0xffde2b39,0x00060d59,0x004e8700,0x002f87bb,0x0030c958, -0x003dfba1,0x0062bb77,0x004f992f,0x0044d6d7,0x005f4a17,0x0055ce01,0x005f2702,0x005a0c62,0x00719c4c,0x00a61717,0x00be418e,0x00c90947,0x00dc2841,0x00d21ca7,0x00dfbe93,0x00ec178a,0x010002ce,0x010bc5ce,0x01344b98,0x017932c2,0xff83e64e,0xff426a3b,0xfeacae62,0xff4d96e8,0xff8e2e5f, -0x00033771,0x0010cfa1,0xffce2b01,0xffd84f78,0xffddd9f5,0xfffc4091,0x003c978b,0x00597a15,0x00508ad7,0x003ddf0e,0x00392632,0x003cf042,0x001cbd7a,0x001c5c42,0x00195727,0x00747ecf,0x0098d7ff,0x007ef91b,0x00884cdb,0x006951a9,0x00508a63,0x0024f068,0xfff71169,0xffdccb4d,0xffc02e96, -0x0003f0dc,0x00b54fb4,0x00b8902c,0x00968a4c,0x002ac3b4,0xffb8a0ef,0xffe35b59,0xffd69c36,0xfff44231,0x00181875,0x001ce4ce,0x0024803d,0x0025619f,0x003d8b5d,0x004a956f,0x006666c1,0x007e1bd6,0x006874ea,0x00414ea8,0x003dce6a,0x00278340,0x00210564,0x000d235b,0x0008bc3c,0x0005b721, -0x0013222e,0x000c84a4,0xfff32ff8,0xffe79e8f,0xffd6b0e0,0xffc625e1,0xffaf081c,0xffd39591,0xfff2eb2d,0x00147dc3,0x0023f37f,0x00242da8,0x0021a795,0xfff057a6,0xffd4db73,0xffc2458f,0xffcff3fe,0xfffd4b1f,0x0015bb59,0xffb62b03,0x00119272,0x0008e439,0x0007f96d,0x002f4b2c,0x00332aa7, -0x003e463a,0x003dbcbc,0x0028dc3f,0x003b0d20,0x0034eb6e,0x00306058,0x00002c56,0xffed4564,0xfffa5ca0,0xffd8bc3b,0xff9651f9,0xffaa94bd,0xff88dbb5,0xff8293d3,0xff7464d4,0xff63eff1,0xff576e10,0xff42d520,0xff5f1b87,0xff7391ed,0xff893fb3,0xffa0761f,0xffbc1053,0xffdd19ea,0xffea3935, -0xfff5d93a,0xfff92172,0xfffd8ed7,0xffdef907,0xfff216fe,0xffdf1d0c,0xffa585c3,0xff3f8ee1,0x000216bc,0xffb7a4ee,0xff5d6968,0xff519f26,0xff4b3686,0xff4415bb,0xff39bb57,0xff2f7925,0xff29f5e7,0xffaedc88,0xfff2a675,0xff253c6d,0xff9a2dd8,0xffce6d0c,0xffcced2b,0xffbfa77b,0xffbcf19c, -0xffb44832,0xffaf8cfa,0xffaa5e22,0xffa00d3f,0xffacccab,0xffb4b6ef,0xffbe281b,0xffc797c9,0xffcf7423,0xffd8f475,0xffd6a8f5,0xffd8e9f3,0xffdcdcdb,0xffe1b4a8,0xffc9231b,0xffaace17,0xffc38c67,0xff78d32f,0x000c3515,0x009d3f15,0x012d67c6,0xffc7d9be,0x0079408b,0x010f7980,0x01215e92, -0x012388e4,0x01119db4,0x012d23f6,0x012e847e,0x0122f656,0x007fd9cb,0xffe0f75f,0x013e53b4,0x0094675c,0x00147426,0xff8169b6,0xffb750b7,0xffa3da53,0xffa1ff72,0xffa28010,0xffa20ca0,0xffa1e184,0xffa10c29,0xff9f8970,0xff9f176a,0xff992218,0xff97b92b,0xff97af3e,0xff9c17db,0xffa4ae37, -0xffb8ea2e,0xffb49813,0xffba2bd3,0xff937e2b,0x00d2264b,0xffca8391,0x00313f2b,0x00276761,0xffe2b951,0xfff5bcf4,0xffd47a46,0xffe85bbd,0x001adefa,0xfffaa8c2,0xfffa4983,0xffe96a70,0x0026646c,0x00133f44,0x00152d89,0x0003d61b,0x00c4cef9,0xffb115f5,0xff98694d,0xff907318,0xff7cbc65, -0xff7ef45c,0xff7d4df2,0xff7d0795,0xff7f215c,0xff7f6dde,0xff82d693,0xff7765cf,0xff70b7fd,0xff74a36f,0xff7935d2,0xff8fc3ce,0xffbfc112,0xffbe9cb0,0xffc7d7cf,0xffae2183,0x00272c8c,0xfffa96f2,0x004af6cb,0x00104b71,0x0012da6a,0x000764c0,0x00474263,0x002626d4,0x0045c7a4,0x0015b11b, -0x00667aaa,0xffe9905d,0x0031de63,0x00056760,0x003bef1c,0x002c67f2,0x004d2020,0xffec916d,0xff785b05,0xff82ddcf,0xff575cf0,0xff609ba9,0xff5a384e,0xff5cad95,0xff5e3ebb,0xff5843e2,0xff5a00b5,0xff35a196,0xff2d8dce,0xff35714d,0xff4d0b6c,0xff7e57ee,0xffce4def,0xffe078d9,0xffbffad2, -0xffd640c3,0x005548fb,0x0024c57a,0x0052a7ae,0x00063ca4,0xffe95e35,0x00023975,0x0023f2ce,0x00547ed0,0x00509385,0x0067c75a,0x002d5ad9,0xffe249f5,0x0014ec51,0x0008158e,0x007c493f,0x003214ae,0x0097cf1e,0x00155000,0xff6fc3d4,0xff5d4404,0xff0ddde4,0xff1666f1,0xff12908f,0xff0e13fc, -0xff1dd5e9,0xff2c5225,0xff48429f,0xff2800ea,0xff084159,0xff12667d,0xff29678e,0xff6cef3c,0xffd658ce,0xfff9ae56,0xff83736d,0xffd8cd34,0x0006c81b,0xff90d800,0xff951ae3,0x00081245,0x003c505b,0x007b7283,0x00bba8c6,0x006a7ad6,0xfff3247e,0xfffcfc66,0x001b0723,0x006e9e07,0x006a63cc, -0x003e736c,0x004ff076,0xffdc2571,0x001b39d4,0xffc539b7,0xff345d2c,0xff9a56ee,0xff98d600,0xffdf1e88,0xffe32561,0xffe89810,0xffea1298,0xff7fae67,0xfeac250e,0xfe9dda6e,0xfea65364,0xff13e8b9,0xff30fd34,0xff7c8c12,0x001a255f,0xffeeb490,0xfed33dc8,0xfe70ee32,0x00b59d03,0x00ec70bf, -0xffbb114a,0x002e2e4c,0x0009dbe3,0xffc532de,0xfffd08ad,0x00317e7a,0x00694c34,0x0031b8db,0x001b236e,0x00286f66,0x002fd85b,0x0056d5ab,0x0046dfd2,0x0047f860,0x007ba2e1,0x00022813,0xffc4a3cd,0xffa7c529,0xff082223,0xff6d8027,0xffc5a2e5,0x002b4a98,0x0051d2d3,0x00366894,0xff99cfdb, -0x00336a5d,0xffee04c8,0xfedcb7f8,0xff3f89e5,0xff6a3b05,0xff6b81eb,0xff492379,0xffaeb40f,0xff9e3591,0xffe5c77b,0xffcdff08,0x004b731f,0x00179f74,0xfff60473,0x0023ec39,0x000e70f3,0xffed351b,0x000dd776,0x00063604,0x0018c56c,0x00247e51,0x0008e705,0x00011bb2,0xffff86af,0xffc6feae, -0xffe75b49,0xffc421a3,0xffe498eb,0x00290698,0xfff51bfa,0xff6f6db2,0xfedd0254,0xfe98f80a,0xfea7db94,0xfefe46f6,0xff45c7c2,0xff521d7c,0xff08d704,0xfeae8a6a,0xfe570b58,0xfe61530a,0xfed93b14,0xff8351aa,0xff4df2c3,0x0015b6cd,0x002e8ee8,0x0009d061,0xfffd7376,0xffd215b7,0xffe280d7, -0xfff1e53a,0xfffb2c49,0x00119b48,0x001fc91b,0x0005d8ab,0x000f2da8,0x0020da48,0x002c653d,0x004cc571,0x00274c68,0x001fcc1f,0x005c18ec,0x000818f6,0xffc4aabe,0xffb0f973,0xff966685,0xff9ea13b,0xffbd0306,0xffe55670,0xffe2258f,0xffad6976,0xff3e3833,0xff765295,0xff63e52c,0xff2dcd6c, -0xfeec3e42,0xfea5e618,0xfe48b426,0xfef5bd10,0xfe795510,0xff79bd13,0x00088791,0xff33473b,0xfeda294e,0xff495a6e,0xff6caf83,0xff8461b2,0xffb703e3,0xffa94fc1,0xffb85b92,0xffc3b3a9,0xffee0c07,0x00351690,0x0022a3ca,0x0025369d,0x0013d808,0x002e4810,0x00567a2c,0xffe94eb3,0x0016b9b1, -0x004c1580,0x00484aef,0x003d57dd,0x0002550e,0xffa78e46,0xff9d1b16,0xff67b30e,0xff01a40b,0xff16b458,0xfefe8db8,0xfeb6c082,0xfe6aa38c,0xfe53e86e,0xfe57cfec,0xfe92152a,0xfe659f74,0xfe93953a,0xff3a7311,0xff328a2b,0xffaad626,0xffc75f90,0xffb70a28,0xff95be5d,0xff84c985,0xff9f94c3, -0xffc2d937,0x000b07ff,0x0022a857,0x002c18e6,0x000d6c77,0x000756db,0x00048a5b,0x001f36b8,0x00229143,0x0029e77a,0x00199c06,0xfffc011b,0xffdfd65a,0xffcda13b,0xffbaaa58,0xffb1ccfe,0xff9be1ec,0xffa9c2c6,0xffdf4dd5,0xff9e3211,0xff3ec60e,0xfeb14460,0xff23eeb6,0xff3eaa88,0xfefc6cc0, -0xfec3bba0,0xff0c238a,0xff3d2f82,0xff9dc096,0xff8c5041,0xffd90c14,0xffd367d4,0xffe52f07,0xfff08ff1,0x0030bb14,0x002c0386,0x006cd7f1,0x002442ad,0x004a47e0,0x00253997,0x0025fc52,0x0003746a,0xfffc8deb,0xffea2463,0xffe67b5f,0xffaa448d,0xffa215c0,0xffc953f5,0xffdbaefb,0xffd052aa, -0xffbe2f39,0xffae726f,0xff94d703,0xff783397,0xff60f16a,0xff551e4f,0xff61f919,0xff57f708,0xff43bf8d,0xff251567,0xff11c6f5,0xff2098b2,0xff896218,0xff9c01d7,0x00359874,0xffc2db18,0xfff9dcbb,0x0002a92e,0xffe6e9c9,0xfff94d9e,0xffd147dd,0xffc92b81,0xffe82684,0xffc5175e,0xffc1e3f6, -0xffc8cc50,0xffd82bde,0xffc7c4cb,0xffa0824c,0xff9bfd17,0xffbd6bf0,0xff8ba217,0xff9427d3,0xff7c194e,0xff6ed658,0xff6197e1,0xff598240,0xff51ace1,0xff43523e,0xff32cd57,0xff1c7acd,0xff089b67,0xfeeb2dc8,0xfed417ee,0xfef7dc24,0xff216dd3,0xff44cbbe,0xff6804e1,0xff6549bc,0xff5a16a8, -0xff94a6af,0xffe04782,0x002faaf1,0xff7d7aca,0xffdec12b,0x003699dd,0x003bbc1f,0x00403a15,0x0035b00d,0x004578a0,0x004a01ec,0x004ab2b2,0xffd55196,0xff7d19d5,0x002d0b23,0xffca4d39,0xff844310,0xff62e1b8,0xff685b33,0xff603ad1,0xff5dfa60,0xff5a83a1,0xff562d05,0xff52a30b,0xff49ab9d, -0xff4332df,0xff3e2ec1,0xff37b88f,0xff33d14e,0xff255118,0xff3873e9,0xff409469,0xff4aebb6,0xff5329ac,0xff37d856,0x008c14cb,0x007bd55f,0x00b8f0c9,0xfffb464c,0xff7e2a2e,0xff4b5fee,0x0039f096,0xff9b8396,0xff46ab27,0xff4423df,0xff48e5d7,0xff611d33,0xff4e32ff,0xff4c50a3,0xff49672f, -0xff95effc,0x00235280,0xff493f5f,0xff91aafe,0xfff9a00f,0x00b0d58d,0x007b8b0a,0x008a1a4a,0x008d10a4,0x008e9e24,0x008dbc8b,0x00886113,0x00872a70,0x00880754,0x008ecfa7,0x008aa3b2,0x008b2b62,0x008fbec6,0x0087aff7,0x0080ff17,0x006ed51f,0x00837a6b,0x00896eac,0x0085716f,0xff783ef2, -0x006aed10,0x0008a8ae,0x0000e827,0x003a3c3d,0x0022ebd7,0x006d0d0e,0x0062aa04,0x00200023,0x00685969,0x0065069a,0x00366329,0x00075bd4,0x001fcff7,0x003718f1,0x0049cfef,0xff9e5208,0x007df543,0x009bde66,0x0094a11a,0x00ab87bc,0x00b26ddf,0x00b35f1f,0x00a21dd2,0x009de7a2,0x009d41b4, -0x00afcd9b,0x00a7288a,0x009f4e5f,0x009f1dd5,0x00802f90,0x006db0be,0x004cca14,0x007118ab,0x00b74b23,0x007a471f,0xfffa4a95,0x0023af17,0xffff159d,0x0007c099,0x000ccfbd,0x001de016,0x00182f09,0x0067652e,0x00171c23,0x009c610c,0x00339d84,0x00325ea2,0xfffb2c8f,0x0029fcd3,0x004aea2d, -0x0034f298,0x0009ad55,0x005421e5,0x00b5462f,0x00a0f42e,0x00c3d085,0x00ccc540,0x00caa871,0x00a5ffc8,0x00a8550b,0x00a9e6e7,0x00d7f763,0x00ba3dd3,0x00b8b44f,0x00ca209d,0x008b503c,0x006a7866,0x0035b75c,0x007bf9cd,0x0097a2f1,0x004cd14e,0x000169d5,0x0062f817,0x005bacb5,0x0022fe80, -0x00154774,0x000c0fba,0x0040d59b,0x00582d15,0x006abf62,0x00680ea4,0x0052af0c,0x001142c8,0x003acb6e,0x0060b32a,0x0050bb04,0x00857bbb,0x00224c44,0x0067a795,0x00c2b76d,0x00a96acc,0x00e7053b,0x00fc5d42,0x00fd1b3f,0x00bd42fe,0x00b90bed,0x00c6c5a6,0x011bf54a,0x00f7c69c,0x00c575c5, -0x00c283f0,0x00436aba,0x0006ce22,0xffd49e38,0x002be6c4,0x01a6407c,0x0072ea9e,0xff69611a,0xff44a42e,0xff1b09ee,0xffb37036,0x0035ad34,0x005e6c62,0x00c23752,0x008a719f,0x0009e369,0x00075154,0x0024e823,0x006f647e,0x006371ee,0x00652afd,0x003c6693,0x004eb1c2,0xffd6c293,0x000fdbdc, -0x00e5f336,0x00cbb457,0x01133774,0x00a4494c,0x00ae1c88,0x00da51c2,0x013ab504,0x0112ca60,0x00805b5b,0x008609fd,0x00ba7198,0x013cf6bc,0x0129c2ca,0x01400d20,0x017d63c2,0x01621790,0x00071e1d,0xfef34236,0x00a9e247,0x013ebdb4,0x001fb33b,0x005c3110,0x003a8ba2,0xffe02fb3,0x00123b5c, -0x0039d519,0x00782645,0x0043a58c,0x002a5243,0x0043c9d5,0x006dc23e,0x008b336a,0x003bc03d,0x00468e36,0x000b3954,0x003929e2,0x00d4268a,0x00c2772e,0x00f24e8e,0x00c54064,0x00a224d5,0x0070ad5b,0x00442d65,0x002d94e1,0xffe8ba53,0x009ed9ec,0x003bce35,0xfee76a88,0xff578248,0xff8d29fb, -0xff9b727b,0xffd728cf,0x001b6c2d,0xffb904b0,0xff7de54c,0xffc070c6,0xfffbf78d,0x003d8a90,0xffff8a18,0x00311434,0x0020d0c9,0x001426b2,0x001f433f,0x0020f973,0x002f6939,0x002c416d,0x0008719a,0x0023f2f3,0xffd80947,0x0007d595,0xffeee8d8,0x0014d881,0x007c2cd0,0x0049b1e3,0x00475aad, -0x008777b7,0x00c05242,0x00e4adec,0x01466f6a,0x01693c1a,0x00f4dd60,0x0183367a,0x01b466c0,0x018395de,0x013587aa,0x00dcdfb0,0x0112f5c8,0x005e6bae,0x00786cc8,0x001df4f6,0x0036a89c,0x00637b78,0xfff5082e,0x001c0a77,0xfffcc9e9,0xfffd3041,0xfffef464,0x000c923b,0x001ae661,0x0012f007, -0x001737a1,0x0022e5d9,0x003b4205,0x00445bb1,0x002ac6ad,0x00376559,0xffffd781,0x0031aff2,0x008e59bb,0x009de6f8,0x00b22a39,0x0086dc76,0x00591b8e,0x002d0df0,0x001a643d,0xffcc8bad,0xff3f29b7,0xff832d82,0xffb58c50,0x003e1dd9,0x00a19026,0x01102c66,0x018ca662,0x0091b22b,0x0096793f, -0xff8ee7d0,0xfebce386,0xfef1de70,0xfeca7956,0xff0fa63a,0xff62ea79,0xff93314e,0xffad5456,0xffdaf845,0xffcf27e4,0xffd62667,0xfff71724,0x0037f9e4,0x0022d4de,0x002285c6,0x001b7df9,0x003b832e,0x000b5c40,0x00300fa5,0x0036cd48,0x002d87ce,0x0072f6d0,0x004efb0f,0x0045e58d,0x00370437, -0x002d9b73,0x001b9723,0x000de98c,0x001554be,0x00364aff,0x008c614e,0x0064a471,0x004f839e,0x0084b8e3,0x007c847a,0xff86e691,0xff049dab,0xfe8cecb8,0xff0f9821,0xff6cd2cb,0xffa2abcd,0xffbcd905,0xff85d989,0xff9c6236,0xffabf668,0xffdef756,0xfff98a7e,0x001ba464,0x0037d0ec,0x00216137, -0x00178950,0x00125cd0,0x00252f07,0x003773b4,0x002c62be,0x006b693a,0x007c7df2,0x007a5c9a,0x0053fc4f,0x00384fdf,0x001be44b,0x000bb6d5,0x000532d4,0x000288e9,0x0007ad5f,0xffff3ed5,0xfffbd53d,0x001697bc,0x00148d7f,0xffecd8c7,0xff9616b0,0xffa20c12,0xff5e04d9,0xff4e5953,0xff7a9783, -0xff742ec3,0xff980154,0xffb69f55,0xffe09af1,0xffef8e4c,0x0021db76,0x0026aa4a,0x00425efd,0x001c1b44,0x0032d637,0x000d6f93,0x000c5c14,0xffecd26d,0xffe34cc6,0xffc5fa06,0xfff1fa91,0x002f62e2,0x0028e576,0x00467e37,0x0030898e,0x0020c5da,0x00098c22,0x0011490a,0x00112cd1,0x000e8d13, -0x002761f4,0x0043f7c6,0x0062a634,0x0026733d,0xffecc798,0xffc9df03,0xffa3834d,0xffde1ab5,0xffe5e95e,0xff8f4064,0xfff8a936,0xffdf1ed8,0xffe56795,0x000cb6a5,0x00110fae,0x00223aa3,0x0014be0b,0xffecfef0,0x000bd293,0x0018475c,0x000ee1e9,0xffe2a581,0xffe74c7f,0xfff1b966,0xffef24c9, -0xff9dc826,0xffeb136d,0xffd25bbb,0xffc41a62,0xffbb3a79,0xffac7cea,0xffa50147,0xff99ca7f,0xffade181,0xffb9b0a6,0xffc0401b,0xffc1d5f0,0xffbc34c6,0xffbf59a8,0xffc3d91c,0xffcf15c9,0xffd2cc12,0xffd68e4e,0xffe1b3b2,0xfff9d45b,0xff988805,0xff57b40a,0xff31955e,0xffc7584f,0xff6906a8, -0xff3aa8b6,0xff30cbd1,0xff2da49a,0xff353d89,0xff2362bb,0xff17cdef,0xff17481b,0xff612211,0xffc31f72,0xff1561b3,0xff59b00d,0xffa1e0ee,0xfffb4e17,0xffdfad23,0xffe3639a,0xffde0a3e,0xffdde85e,0xffdc99ff,0xffd7a742,0xffda049b,0xffda8326,0xffdd7e63,0xffe0852f,0xffe4275f,0xffe450da, -0xffe49c24,0xffe3e10b,0xffe4f16e,0xffe5d692,0xffe21b3d,0xfff9965f,0x0001e4c3,0xffc3b0ce,0x008b0cbc,0x00dc9877,0x00bb9829,0x005337f4,0x00c72097,0x00cda20f,0x00da9ffe,0x00da1063,0x00ba550d,0x00d76a56,0x00d4cbe9,0x00bc3a07,0x00cad16a,0x00665a14,0x00c2b4c8,0x00cf73b7,0x008d7fce, -0xffcae2be,0xfffae817,0xfff3c99d,0xfff5098a,0xfff5df24,0xfff73f64,0xfffa41d3,0xfff66989,0xfff4bf48,0xfff79b9a,0xfff30fac,0xfff3d186,0xfff605b9,0xfffb3ab0,0xfffcd929,0xfff977d0,0xfffc72bf,0xffecb922,0xfff53e0c,0x00d1aeac,0x0014d96d,0x006b6eae,0x005755e4,0x0028787e,0x002ea05b, -0x0016064b,0x003c650d,0x00721c15,0x005bf301,0x0043dcb6,0x003c8f86,0x0052bdf3,0x0040246c,0x00665370,0x003a1636,0x00bc8a8e,0x000a5d0b,0xffe38528,0xfff96d91,0xfff09029,0xfff1b53d,0xffed700b,0xfff17b95,0xffeb57c4,0xffefc70b,0x000243ba,0xfff71efa,0xfff88223,0xfffff73e,0x0008c51d, -0x00087ed0,0xfff9a4b2,0x0006b3d7,0xffeda307,0xfffe3546,0x007bb75f,0x00392f89,0x005b0e20,0x0039ed74,0x003b2ec3,0x0029e449,0x00624254,0x003217cf,0x00745fb3,0x0039da4c,0x00898fd2,0x001e40b9,0x005a4ab8,0x003334c5,0x0059ddec,0x004c51d1,0x00798892,0x001fc6bf,0xffc95d6c,0xfff3bcf5, -0xffec4384,0xfff5dca0,0xfff789b2,0x00077705,0xfff412d1,0xffed2a50,0x000795eb,0xffe883e4,0xfff11f3a,0xfffd377c,0x001d837a,0x0018dc52,0xffeac3b7,0x001b0fda,0xffbde1f5,0xfffcb384,0x0068d345,0x003683ac,0x0047e95a,0x002299b6,0x00022ffe,0xfff69d6f,0x001c8e41,0x00477347,0x002af4fd, -0x006db737,0x0044eab6,0xffe0134c,0x00150bc9,0x0015e7eb,0x00985749,0x00302311,0x00875ea9,0x001878f6,0xffbabea6,0xfff3cb89,0xffe76a2e,0xfff20d9b,0xffe96e0e,0xffea898a,0xffdfaffd,0xfff2900c,0x00339ed9,0x00169897,0x001119c9,0x001e93b4,0x003706ee,0x0021353c,0xffd07e25,0x00161484, -0x0017204d,0x008e5fc4,0x009728a6,0xffe9f0f7,0xff9aa14d,0x0010e46e,0x003dd9ac,0x0058be7d,0x00c54c6b,0x00991b00,0x001abc40,0xffff2237,0x001a66c6,0x008454f8,0x0060835d,0x003685e7,0x00568b30,0xfffff9b6,0x00526c02,0x00324506,0xffc16ea1,0xffeaa369,0xffb7a70a,0x000882af,0x000f60ac, -0x00153e5c,0xffca5dab,0xff5e8651,0xfef34596,0xff0aec26,0xff62f571,0x00275768,0x0044d7a4,0x0053411c,0x005b8329,0x0058628f,0xfef3f520,0xfe61675a,0x00f54cfa,0x0130f8a8,0xfff6b4bf,0x0064e89e,0x0029a1b6,0xfff4d2fe,0x0005a578,0x002f26ec,0x00722f33,0x00474518,0x00318b39,0x002aec25, -0x004f3ee7,0x0076bf49,0x004fa21f,0x0040e108,0x007080cc,0x003b9bbb,0x002c8b75,0x00580c4d,0x00260d67,0x00287dea,0x003d082c,0x006b102d,0x0062afad,0x00437c8d,0xffce9aae,0x00794503,0x0054278a,0xff8dce3b,0xffd9dc74,0xffe24e86,0xffb0abcc,0xffa77e3c,0x0023bdbe,0xffa53792,0xffc43c49, -0xffa934c7,0x0036024d,0x003f8368,0x003d772f,0x002022c6,0x002b61ca,0x000aded5,0x001c46ea,0x000f9ba3,0x001e315f,0x002b2a16,0x000c1167,0xfff3ff93,0xfff28c34,0xffd79ea1,0x00169d39,0xffe4649c,0xffc6eea6,0x000fcdc4,0x0012c0dd,0xffb8c300,0xff7f540b,0xff7dcdc7,0xffac4a85,0xffd4f221, -0xffb7452e,0xffdba87e,0xffdc41ed,0x000c44c4,0x001b14df,0x0034f099,0x009b0f48,0x0058733c,0x004a9782,0x00790b7f,0x00678318,0x00415ff8,0x000c54cc,0x00007380,0xffee5647,0xffd6dfc9,0xfff532f6,0x000452d2,0x001b2bee,0x000ed82e,0x0013c5a8,0x00202962,0x002d8133,0x0046c5d9,0x001dc406, -0x00102c76,0x0049294e,0x00188bb7,0xfffc7478,0x00152a3d,0x001c02d5,0x00156c5c,0x00140493,0x002fa8c4,0x00323618,0x000da081,0xffc2baf8,0x00043d18,0xfff6aa36,0xffb08879,0x001a6abb,0x0053682f,0x007ee1f7,0x00749316,0xffef0426,0x00243d85,0x0012d653,0xff70c652,0xfefb1920,0xff444e35, -0xff69c5ea,0xffa6804d,0xffe2b898,0xffdc86ff,0xffe7f028,0xffd2712b,0xffeefae5,0x002acfbb,0x001f440f,0x001eff04,0xfffa5c3a,0x0034174f,0x006c3b9d,0x00192bd9,0x00039206,0x0025426b,0x0041762c,0x0046e74d,0x003cfbbb,0x0020bd86,0x00106a02,0x000713cc,0xfffac044,0xffb042c6,0xffad1ff4, -0xffddca37,0xffda0b05,0xffe229e0,0xffd8af07,0x001d7140,0xff418b3d,0xff6c2003,0xff7fb6c7,0xff8cf61c,0xffe26962,0xffce7acc,0xff9de245,0xff84f0f8,0xff746d29,0xff8833a9,0xffa7acc4,0xffd48e0f,0xfff2310e,0x001e501a,0x000e7803,0x00205726,0x0024c072,0x003d2b7d,0x00340e36,0x00309de9, -0x0016c733,0x00167e1a,0x00309dbb,0x0024a638,0x001fde38,0xffff9484,0xffe31aa8,0xffc6098c,0xffb3b1b0,0xffb1fed6,0xff72af6f,0xff0073e5,0xfefe363a,0xff2611e5,0xff55ff48,0xff6225ca,0xff17f9e2,0xff25b0ab,0xff855b54,0xff701461,0xff9bdab9,0xffa38e0d,0xffbdbdd4,0xffcfdc41,0x0006764c, -0x0003b4a7,0x00483c89,0x001207c9,0x00384003,0x002afbf7,0x00233e94,0x00091c57,0x00000126,0x00006154,0x001404ec,0xfff561db,0xfff4e471,0x001d7460,0x003387aa,0x0021a810,0x000f2974,0xffff0c0e,0xfff63184,0xfff1d211,0xffe8f6ec,0xffeba85c,0xfff92cba,0x0004ace3,0xffdea067,0xffa76542, -0xff6d049f,0xff4f54ef,0xffa9940b,0xffb9e6f5,0x0010fe6d,0xffd319b9,0x00051841,0x0004c282,0xfff49f41,0x0006c874,0xffee9753,0xfffc9877,0x00214e08,0x00126845,0x000bc9ca,0x00214b42,0x001c03bd,0x000202b7,0xfff68676,0xffdcd972,0xfff12259,0xffb61630,0xffb319f1,0xffac8e4f,0xffa60e9c, -0xffa32b81,0xffa2a834,0xffa296b6,0xff926369,0xff83a5c0,0xff77c7e3,0xff6c64cd,0xff5cb25e,0xff52614c,0xff5b1648,0xff733b42,0xff872470,0xff9ef703,0xffaea505,0xffa2174a,0xfff5931a,0x001bfb3f,0x0003b384,0xffe867ab,0x0020006b,0x001f35a2,0x00263f60,0x0028de48,0x0019a682,0x0027822c, -0x0029d859,0x00268473,0x002f7544,0xfff86629,0x001190e3,0x001c63f3,0xfff137b0,0xffa48db9,0xffb377b1,0xffaf9ba9,0xffae77e6,0xffaed441,0xffadaad5,0xffae0041,0xffa93aa3,0xffa6c21b,0xffa38930,0xffa0a08a,0xff9eede7,0xff9950c1,0xffa25cc9,0xffa429ba,0xffa5ccd8,0xffa7a182,0xffade9a9, -0x00102b5d,0x00125abe,0x002d9ce5,0xff962eb4,0xff82dc67,0xfff76c40,0xffb30fdb,0xff8cf415,0xffd1e037,0xffd52c86,0xffdbb8d4,0xfff5c70b,0xffeedbdb,0xfff103fa,0xfff55ce8,0xff8be7a9,0xffa718a4,0x0003a758,0xff90abde,0xff9821ae,0x00254a84,0x000cef73,0x000ccf47,0x00105aea,0x000f652e, -0x000dcd9a,0x0008ea47,0x0007fe13,0x0008ecae,0x00131e92,0x000748e8,0x0004134b,0x00074595,0xfffb7ad1,0xfffb2d90,0x0001c57b,0x000c2c47,0x001b5a8a,0xffef65c4,0xff9c858d,0xfff2cddd,0xffce7828,0xffe151ec,0xfff2bbbb,0xffe992a6,0x000e1810,0xfff8db60,0xffd3f662,0x0000d1ea,0x00132798, -0xffe79b73,0xffe6d4b1,0xffefe823,0xffdd06ae,0xfffa19f7,0xffc3a4b3,0xffee1dc1,0x000fd196,0xfff7d7cc,0x0008524e,0x0008b6b8,0x000911e7,0xfffee9c6,0xfffc2576,0xffff33fd,0x001887c0,0xfffcb45a,0xffeca596,0xffed0248,0xffc3809e,0xffc5cb4c,0xffe4fede,0xfffa592e,0x004111f8,0x0003c2df, -0xffaa7a93,0xffd70984,0xffe0cbe2,0xffeebd82,0xfffc171b,0xffff7fa6,0x0005aac9,0x004671d4,0xfffda479,0x006c7e14,0x00315d27,0x000dc1c0,0xffeb90d0,0xfff5136c,0x0011b075,0xfffb58c0,0xffcc492a,0xffe566b4,0x0010fc33,0xfff426fb,0x000537b0,0x0001cb90,0xfffefe1a,0xffe0ff40,0xffe40a22, -0xffe414be,0x00203ad1,0xffdf69cd,0xffc8d086,0xffdb4c6b,0xff88d45e,0xff967345,0xffd1257d,0xfff7b808,0x003901e2,0xffe5c518,0xffaa24e3,0xfff81b0b,0x00217855,0x0006d139,0x0015c138,0x000ddfcf,0x0034052f,0x0043a103,0x00527482,0x0076f343,0x00566b94,0x001172df,0x00221730,0x003c30e1, -0x00425bf1,0x00402816,0xffeaa9a8,0xffe866a8,0xfffa4eb6,0xffc5e40b,0xffdcdffa,0xffdef7d8,0xffd4a245,0xffb44e26,0xffbd7a39,0xffe1f6c5,0x0049e3aa,0xffe2256e,0xffa0c718,0xff9fbbf3,0xff0af807,0xff1dc5fd,0xff9a5087,0xffd96f57,0x008b99b1,0x000a4a33,0xff6ea237,0xff564dec,0xff34d33f, -0xffbc6392,0x00153115,0x0020ca42,0x00aa99ec,0x009ac5b2,0x0030d10a,0x000553ac,0x001e5dcd,0x00738840,0x0044d12f,0x00373df0,0x001dc4cb,0x000bd18a,0xffbae192,0xffca0d09,0x0046395b,0x005aa6df,0x00ad7bed,0x006ee439,0x0092df56,0x00fa0752,0x008b5e26,0x00202459,0xffb910ef,0xffab8e2d, -0xffc2a631,0xfffdeac5,0x0031d783,0x0050bf40,0x006d4b85,0x004350cf,0x0014dc03,0xfe9250ba,0x0001dbb7,0x00c2e6a5,0xffce344a,0x003c5aca,0x004386ad,0x000ce113,0x000f0e4f,0x001f306a,0x00721974,0x00555733,0x003c440c,0x003d34ce,0x0061aed4,0x00681685,0x0009f846,0x00240adc,0x0010121b, -0x0009009c,0x002234e2,0xfff10cf3,0xfffb3369,0x001a3305,0x0033d5d2,0x002c6b92,0x00218c3b,0x0019dfa0,0xfff43ad8,0x007ab59d,0x0021568e,0xff2beb70,0xff2ad6a0,0xff4e3a2e,0xffb5d87e,0xfffe160a,0x002d1cc8,0xff97ffb2,0xff9392fc,0xffc7e3e9,0xfff6c19d,0x004d1ea5,0x0021f2c1,0x000bafa1, -0x001f9932,0x00203b4b,0x001d09ae,0x00189e98,0x00277ae3,0x0032e3d8,0xfff75cba,0xffe5bae3,0xffbaff14,0xffd0c192,0xffac0a88,0xffc8086d,0x001e439c,0x0014421d,0x00435953,0xffd9a338,0xffa6ce64,0xffa15999,0xfff61906,0x004dc521,0x00527fd9,0x00a87fed,0x00488b36,0xff60bddb,0xff22d82a, -0xff2398ee,0xffa1902a,0x00162a87,0xffbf5204,0x004bf525,0x00482a0c,0x002d166f,0xfff38093,0xfffc7278,0xfff500c9,0xffdd06d9,0xfff9f171,0x000698c6,0x000d9016,0x00128b15,0x001799b4,0x0010585b,0x0021da76,0x0021d725,0x0002c260,0x000726bd,0xffea5506,0x001a25e4,0x00341191,0x001306cc, -0x00172f0d,0xffd4aedb,0xffc13941,0xffd752ec,0xffa3f8e3,0xff686bce,0xff1a5eed,0xff5d0886,0xff84d7d1,0xffe12af3,0xff6de459,0xff4141fc,0xff30daec,0xff4ed8d9,0xfeeb05b0,0xfede5432,0xff111c9f,0xfeff00a4,0xfebc15a8,0xfef7669c,0xff424db5,0xff796004,0xffad2d94,0xffda429e,0xffd9b418, -0xffda1c7a,0xffedd116,0x000cdbdd,0x0010e95f,0x0015aec1,0x0004c03c,0x0001c72d,0xffe1b523,0x00035b89,0xfffaae6d,0xffff4d66,0x003b14eb,0x0021f350,0xfffb9a50,0xffa7871c,0xff874964,0xff5f45fc,0xff38c7ba,0xff2f161c,0xff33c6d1,0xff8038e0,0xff3e4951,0xff20db3d,0xff36a2ec,0xfef74dc4, -0xff3c094f,0xfef0481c,0xff0d0953,0xff375b57,0xff987c2d,0xff820a16,0xff85d8f7,0xff65b7b7,0xff75331d,0xff885313,0xffb160c7,0xffb38711,0xffd6e000,0x0013ef30,0x00075d4b,0x00032d40,0xfff90501,0x0024be72,0x0038c337,0x0037a5db,0x0033440c,0x002bd83c,0x0043bff1,0xffffa74d,0xffe6c353, -0xffc9be70,0xffd14b2a,0xffdc6d6b,0xffe2ea24,0xffd827c7,0xffa49137,0xff4f69ca,0xff392671,0xff338272,0xff52d7e8,0xff367278,0xff3a3685,0xff012ed5,0xfef0f2e2,0xff0e6941,0xff1cd3aa,0xff4c77ac,0xff82e394,0xffb4811b,0xffcb20b9,0xffee985f,0xfff6016f,0x00158497,0x001720f4,0x002a94ab, -0x000c33a1,0x0002cd0f,0xffeae05b,0xffea42aa,0xffd1d5f1,0xfffc35ea,0x00385e8d,0x003e6441,0x006508be,0x004e732f,0x0040981a,0x002d8bce,0x0011f976,0xfff133be,0xffccb111,0xffd137c1,0xffdd8aef,0xffed9125,0xffc7b0f7,0xff977720,0xff714a84,0xff45374b,0xffaa1d8d,0xffa19036,0xffa8d35c, -0xffcabaed,0xffc179bb,0xffce26e1,0xffd9e25e,0xffe1387c,0xffe7a9f5,0xffd9193b,0xffc608bc,0xffd7033a,0xffecd8be,0xffed667a,0xffddb0c4,0xffe753a1,0xffd9f795,0xffe7ab1a,0xffbd4508,0xffee217d,0xffef85e8,0xffe36351,0xffe26f81,0xffde6c6e,0xffdfb6d8,0xffe34bb1,0xffe150d7,0xffdb97b0, -0xffce999b,0xffbc20c9,0xffa0fd79,0xff88f089,0xff8a9669,0xff926e19,0xff991f2b,0xff9e2baf,0xffd12e4c,0xffda6e0c,0xff88accd,0xff79bd38,0xffacbff2,0xffa13604,0xff834579,0xffa4ae50,0xffa5c89a,0xffaad7ef,0xffb89774,0xffb22ae3,0xffaf4045,0xffb606db,0xff86d4a9,0xffadf22e,0xffa8739e, -0xff853d11,0xff9f9db1,0xfffb4e5d,0xffe953c4,0xffed3736,0xffed827f,0xffefe055,0xfff0fc14,0xfff23cb4,0xffea01a1,0xffe3f6c4,0xffdfb4f1,0xffdae797,0xffd7de7f,0xffcf56ce,0xffd365be,0xffd259d5,0xffd2a910,0xffd0c64f,0xffe43f32,0x0060ed33,0x005468b3,0x0054abe8,0x00a4524a,0x007ac944, -0xffde11ad,0x00a2a98f,0x008334bd,0x000731d5,0x0009d5ee,0x0008fdd1,0xfff6a3d1,0x0000e011,0xfffc1354,0xffe5d004,0x00802ad1,0x009eebad,0xffd589d6,0x0074e5ed,0x009fbce0,0x00529db7,0x00566aa0,0x005f58c8,0x00620da3,0x0061a75d,0x00615a95,0x005fadcc,0x005c01bc,0x005cd3a7,0x0067e780, -0x0064bdeb,0x0066ddde,0x006a09ea,0x006a6fa0,0x00643f4a,0x004c1dd7,0x00597424,0x00473f4f,0x0075202e,0x00480a0f,0x0067e27c,0x006a9ea1,0x00568aed,0x005df0c4,0x00502fcf,0x0060b223,0x007f2b91,0x0089637a,0x009bcd2d,0x007dc7b5,0x0072984e,0x005089c7,0x004b6efb,0x007a5826,0x005bf89e, -0x00416f6d,0x00729c88,0x005e3dd3,0x007b1fd6,0x0080aa98,0x007d98e2,0x00723d06,0x00697647,0x005d956a,0x00684d41,0x0090fab3,0x0089e411,0x0090579b,0x009327df,0x008ed908,0x00770f2e,0x003b24be,0x00584fed,0x004f738c,0x0073141e,0x0088a7c1,0x00636fcf,0x00462e99,0x004902d0,0x004b8df7, -0x004177d5,0x005972f1,0x004f5c6c,0x0072fbd4,0x00782cb2,0x007e50e8,0x00530e4a,0x005174f0,0x0048690c,0x004e5789,0x0050b2ff,0x006964a7,0x005cd05f,0x00618d1f,0x008532b5,0x009e4bab,0x009df872,0x00976f09,0x008c8f61,0x00733a08,0x0078d2a4,0x00c014d3,0x00ac9e7c,0x00bf4e2b,0x00c6bb6d, -0x00c630a4,0x0093ac69,0x0015e773,0x005b5658,0x001eba81,0x004dc065,0x00534651,0x00574f6c,0x0049c686,0x003e3d96,0x0022ed43,0x0003ed65,0x002aa241,0x0041143a,0x002beb4e,0x00716526,0x0060cec3,0x0007ae4d,0x0029b49a,0x00389da0,0x00726130,0x0040fcc8,0x0049767c,0x003f194c,0x00613cf5, -0x00a8f2b7,0x00d761c2,0x00d44837,0x00b15c66,0x008acc3d,0x006c1fb3,0x0093d830,0x0111e834,0x00fe8bd8,0x0109085e,0x01075a66,0x00e11338,0x007d5044,0xffcf9137,0x00311326,0x00d4a26e,0x010050a4,0x00ba6b13,0x002dbb15,0xff8e39fe,0x0002f6bf,0x004283b9,0x00403b36,0x00b624a4,0x00b56bea, -0x004cc9be,0x000fe94a,0x001fec8b,0x007ec7b8,0x004d637b,0x0038eb17,0x00492310,0x00460433,0x006476c6,0x008a1007,0x009b36d2,0x007caf74,0x005742e5,0x006bfad6,0x0078cc4f,0x00973a40,0x00203fcf,0xffd42f23,0xffce4a6d,0x0005d0a3,0x008428d1,0x0125fe26,0x01664ef8,0x014d20c4,0x00de8ec7, -0x00ccb835,0xffbf70d1,0xfed6450e,0x007346b3,0x00d4d6f5,0x0049bad9,0x006fc940,0x0045b10e,0x0031f234,0x001425bd,0x00223307,0x0070ec65,0x005dfbb1,0x004b013c,0x0033dddc,0x006b502d,0x00820056,0x0049e9f6,0x0032924c,0x003358b1,0x005afe38,0x009abc24,0x00e51508,0x013709c6,0x00f1f34e, -0x00bee280,0x009de295,0x005208d0,0x003360cd,0x001d1ea9,0x00a8aed4,0x008a5002,0xffe13ef2,0x002a9a4a,0x001e2e28,0xffca6ace,0x00304035,0x0083171b,0xffe78308,0xffca90b7,0xffcfe884,0x0025b4df,0x005fedcc,0x0054135b,0x00114195,0x0031b85d,0x0023d637,0x0025957e,0x001f0458,0x0028a98c, -0x00382cce,0x00112f99,0xfff6e76c,0xffef288f,0xfffd52ff,0x00236196,0x000e10c4,0xfff2ed0e,0x0013a0e9,0x004e13f7,0x00351aa1,0x006af821,0x00cc3ef9,0x00f575ee,0x00e9805b,0x00978153,0x00adf51c,0x00e7865f,0x0151d97c,0x01911632,0x01a0d5a2,0x01ceea84,0x00ee12f3,0x010edce6,0x0076feed, -0x005c1638,0x004d8132,0xffea9fea,0x000f1778,0xfff09fc0,0xffe1a516,0x00061f19,0x000cecb0,0x00167d0d,0x00205ee7,0x00217d77,0x00218789,0x0027513c,0x002ff251,0x001f7b2a,0x000e692a,0x0020461c,0x0036b449,0x0061e2a6,0x008dd9f0,0x00a7ad79,0x007dba15,0x0059a1c1,0x00490d52,0x00477b85, -0x003bb9a1,0x002fc258,0x00512365,0x00620dad,0x006b6152,0x0145e5ae,0x01c338c6,0x022de9d8,0x0191adba,0x0108ad3a,0x006b2c14,0xff82595f,0xff640ace,0xff29a1ac,0xff2aed43,0xff58c3a2,0xffaa990b,0xffdc63c5,0xfff89816,0x0001b2fa,0xffec9d52,0xfff4ed14,0x000d3faa,0x00133e01,0x00192710, -0x00045910,0x0029a150,0x003d3e81,0x00397c75,0x0009fb40,0x0008ac7f,0x002a1abb,0x004392b3,0x006015a9,0x0078618a,0x0078d148,0x007b6552,0x00a86efe,0x0036a84a,0x003e9272,0x00b5cb8e,0x00fddcdb,0x0127dbbe,0x01329b76,0x01298bf2,0xfff5fce6,0xfff40aba,0xff847d17,0xffc36248,0xffe60517, -0xffc63b65,0xff959b03,0xff7ec52d,0xff816644,0xff89968b,0xff9ddea3,0xffa9fd6a,0xffcdb443,0x000a0168,0x0017cce9,0x003331f6,0x0038d291,0x003ac4a3,0x00329abe,0x002c23b2,0x0026c7c9,0x003ff876,0x0065bfce,0x006e6a3d,0x0061a888,0x00399adc,0x001e7db7,0xffeca79e,0xffb737b7,0xffb3d2ae, -0xffbb9dd5,0xffe2b782,0xff8678db,0xff8135ce,0xffb30746,0xffdac69a,0xff6b2cce,0xff508186,0xff720ac9,0xff776281,0xff7552d9,0xff91ae0c,0xffb3dcfc,0xffd4849a,0xffe7f96a,0xffecc5a9,0x001263d3,0x00093eec,0x001cd9d7,0x0029d1ca,0x001adabc,0x001356fb,0x000c0cf0,0x001fcdf3,0x003df3f0, -0x0050349c,0x004e96c8,0x005620d9,0x005b755a,0x004dcc54,0x004390e0,0x003972c0,0x003e6118,0x0044db1f,0x00428587,0x004bf53d,0x00497e77,0x00520849,0x00200708,0xffee92dc,0xffb0e7e6,0xff8d5a04,0xffd192c3,0xffd6646b,0xffba6b20,0xffe1ca7f,0xfff0cdb7,0xffefb547,0xfffb2b70,0x000516c3, -0x000a405d,0x001ea622,0x002e113b,0x003b7d45,0x003908bf,0x004e90b6,0x003354df,0x001fa01e,0x002b5788,0x000bc477,0xfff25d7f,0xffe549a5,0xffd96088,0xffe12903,0xffe153d4,0xffe602bb,0xffeae14d,0xffef4868,0xffead226,0xffea4bf3,0xffef4483,0xfff30a80,0xfff8c926,0x0001ec84,0xfff1621e, -0xffeb9b43,0xffe54d1f,0xffe143bb,0x00029089,0xfffe8400,0x00290a52,0x00127512,0xffb82176,0x0033e659,0x001eb212,0xffd846ed,0xffdbfb09,0xffdd4854,0xffd576de,0xffd93d5b,0xffd7954d,0xffd4dd7f,0x0039b28e,0x004a22fb,0xffca11ee,0x00284c6f,0x0035e0dc,0x0005ef48,0x000cbfea,0x000e4d42, -0x000d8a1a,0x000ee691,0x000ec2f7,0x000f6bdd,0x0011daaf,0x00141b58,0x00150451,0x0016b5dc,0x0017f34d,0x001ca9a5,0x0017523f,0x001320ba,0x000d6bda,0x00097845,0x00285ae5,0xffaf2f73,0xffc06272,0xffa7946b,0xffb0cd71,0x000a470e,0x00b20ab3,0xff948c4e,0xfffa2c51,0x008cc622,0x009765c7, -0x009bc658,0x00a0f215,0x00aee533,0x00b20d47,0x00b25c3a,0xfffcccd7,0xff99adad,0x00c05c89,0x0006da64,0xffb32f20,0xffa2717e,0xffb98201,0xffac1d47,0xffad5460,0xffa93354,0xffa61c36,0xffa0f0be,0xffa13c00,0xffa2db9e,0xffaf7904,0xffa28c37,0xff9f3569,0xffa0e3e7,0xff98fd09,0xff9d81b0, -0xffb195cc,0xffb04ca4,0xffbabb78,0xff94d71a,0x002ff28f,0xffb25420,0xffe3e850,0xfffc1cfc,0xffd8e913,0xffdd7b1d,0xffcfcf19,0xffca8737,0xffdd6701,0xffdaff3a,0xffebfb25,0xffd5b1a7,0xfff7a32b,0xffe7fcbc,0xffc75077,0xffd64541,0x00399ed5,0xff9a5e90,0xffa4afe7,0xff91a6d5,0xff8d239e, -0xff81b8c2,0xff78c7e9,0xff7246de,0xff724414,0xff7d8c8f,0xff9ff8c5,0xff826456,0xff76fff2,0xff77b321,0xff5b75b6,0xff692d8c,0xffa441ba,0xffa7afc4,0xffcdc8e2,0xffc681ae,0xffd3bd45,0xffd4b201,0xffff572c,0xffffa4c9,0x000efa5f,0xfffede14,0x00205599,0x0029c522,0x001f6572,0x0038c2be, -0x005137a8,0x0004a7af,0x000adbcf,0xffe287a4,0xffefa648,0xffee862f,0xffe8f73c,0xffba7ef9,0xff920255,0xff86a100,0xff775540,0xff63dee7,0xff5518f3,0xff3e6fd5,0xff3f8d5e,0xff46381c,0xff8a8b9e,0xff4a72d3,0xff384021,0xff4541f4,0xff1245f5,0xff35518b,0xff9d4a31,0xffa49273,0xffd06187, -0xffc58c5c,0xffc78cdc,0xffd1c884,0x000bc8a6,0x000dfc14,0x0019d7c3,0x00110897,0x00298331,0x00396d0e,0x003d8703,0x0081b48d,0x005b805d,0x00158955,0x00131c2f,0x000cb156,0x0033538f,0xfffe1555,0x000291f2,0xffb5e602,0xff73c982,0xff51bf2e,0xff2eb7c7,0xff0c3c6b,0xfee2e666,0xfed57b16, -0xfee5b54c,0xff249925,0xff97fa07,0xff2f3ebf,0xff0aeec4,0xff09e1b2,0xfeaa70b8,0xfedd4726,0xff9480d6,0xffb75759,0xff7837bf,0xfffa60b3,0x00151bab,0xffdb32c5,0xff8ec7f4,0xffdf9a3b,0x000a774a,0x0017c4ba,0x008c1b61,0x009e0fce,0x005f0e4c,0x000fb2aa,0x00187395,0x006c3ebb,0x002fa09f, -0x0014909e,0x00215e24,0xfff15417,0x00030d03,0xffd930a4,0xffaa5e28,0xffe40aa7,0x000a3d13,0x00272d03,0x004dbade,0x00ae6b1b,0xffab9a00,0xff1a0d57,0xfeea07fa,0xfef9b014,0xff16feb5,0xff17c505,0xffa547f9,0xffc30c41,0xff95cdf8,0xff67bed7,0xffd84bb0,0xfe8a77d4,0xff5a0be6,0xfffd76c9, -0xffeae748,0x0023559c,0x0033dd2f,0x003a973a,0x00126d37,0x0010f21e,0x0064cbe4,0x00664301,0x0051321d,0x002ddbe1,0x0047baef,0x0041b52f,0x000564f0,0x000e1b8f,0x0027b0c7,0xfff70cda,0xffa2ad48,0xff87acc4,0xff70a0cc,0xffc02258,0xfff56298,0x001ae6a3,0x00121363,0x000f3867,0x000a3b13, -0x0047365a,0x000c66bd,0xff83bb07,0xff6e4b63,0xff79b6f5,0xffbb0649,0x0016f84c,0x00474068,0xffd717f7,0x0002eceb,0x00043aa7,0x00284c05,0x00530ad5,0x004170ab,0xfff60199,0x0019faa4,0x001d60ab,0x00192708,0x0010d3bc,0x001e40af,0x00398785,0xfffa5421,0xffc4c80c,0xffd56c36,0xffba7d99, -0xffa95005,0xffa81fca,0xffbb21bf,0xffe81fbc,0x001f5c08,0xff62b862,0xfef8ee9c,0xfedeecae,0xfefe4c82,0xff4bb0af,0xffb82764,0xff79384e,0xfed98360,0xfe19da68,0xfdf6eb28,0xfe52a6e6,0xfef3166a,0xfffd3eb3,0xff70b973,0x004d3fd3,0x002da80d,0xffe6252b,0xffddcb21,0xffcf0bf1,0xffdd985e, -0xffcdc693,0x00060e03,0x0012d3a6,0x000ba987,0x001d18ec,0x0020ce8e,0x000b4086,0x000868cd,0x0008904e,0xfff6ad6d,0xffe66e09,0x00024389,0x000de500,0xffe66e05,0xffba81c4,0xffa82612,0xff7c6ee5,0xff81b619,0xffa0db63,0xff811638,0xff6ee8f5,0xff7ed547,0xff9a215e,0xffafacbf,0xffd5adbf, -0xff1e2683,0xfe977372,0xfe1ac0ca,0xfeedaf02,0xfe34c480,0xff07a55b,0xffa8583a,0xff385838,0xff0c11ce,0xff1d505f,0xff43a17a,0xff73fd36,0xffb2dd35,0xffd028f3,0xffe116a1,0xffe2b736,0xffe84845,0xffe40117,0x00008b69,0x000c811e,0xfffc0b3f,0xffe98a99,0xfff1c652,0xffeba163,0xffe399e5, -0xfff8acbb,0x00030f45,0x0005f65d,0xffdeb984,0xff86decc,0xff642567,0xff286f17,0xfeeedee0,0xfed0d466,0xfeb3e9f8,0xfebbcad8,0xfea6a654,0xfeadb45c,0xfeb2ef6c,0xfe63bbae,0xff0892c8,0xff1bbd20,0xffa6ab24,0xff80d74e,0xffbebac0,0xff79881e,0xff5cdefd,0xff5d5f63,0xff619db5,0xff7621ea, -0xff8b6080,0xff8a6471,0xffa6f3bb,0xffe6e864,0xfff8d1eb,0x00040365,0xfffcc42f,0x00209833,0x00294eda,0x002fe82b,0xfff9a4a9,0xffdd263e,0xffe50b6f,0xffd1f6a3,0xffc03ccc,0xffa97f24,0xffaa8e81,0xffbb9084,0xffd58035,0xffaad715,0xff60fcc7,0xfee8e712,0xfeecf94a,0xfee0fe66,0xfee3188e, -0xff049bcf,0xff11208b,0xff103c47,0xff1e89a5,0xff21840e,0xff47748e,0xff665174,0xff96f988,0xffb8cc10,0xffd10e10,0xffca0092,0xffde53a1,0xffdf2ced,0x0012b862,0x0013d908,0x0010735a,0x00026043,0x000543fc,0x00089e6b,0x0008ce01,0x00063e57,0x00117784,0x00248244,0x00353f44,0x0030e3af, -0x002f9522,0x003413d7,0x0002ddbe,0xffcd2cef,0xff94bab8,0xff7b4f76,0xff6e36bd,0xff5d0cb2,0xff5017f5,0xff3a8c62,0xff22453b,0xff1a3577,0xff7d7a52,0xff6ee859,0xffd570bc,0xff9d1acb,0xffb652be,0xffc4a108,0xffb24887,0xffbf0261,0xffb1b3cc,0xffaeca42,0xffc098dc,0xffb6c171,0xffc3fd51, -0xffd110aa,0xffe39839,0xffea0b7b,0xffceff1e,0xffdd938e,0xffec19e7,0xffef85bb,0x00036d5f,0xfffa3b7a,0xfffc6599,0x00009a85,0x00050927,0x000efa15,0xfff6867f,0xffe40fb3,0xffcc5095,0xffb2a08b,0xff91a1c2,0xff707836,0xff6f5b0c,0xff714c71,0xff766726,0xff776079,0xffb557bc,0xffa74258, -0xffade0fb,0xffda8cc6,0x0036fc98,0xffa23b84,0xffdb2956,0x002f7caa,0x0039e311,0x004393d1,0x004a490f,0x0054d165,0x005af754,0x00626b05,0xffea24c8,0xffbd8a77,0x004ce1b1,0xffed96ff,0xffca4169,0xffe3e33a,0xffe35278,0xffe3e332,0xffe75315,0xffe83420,0xffe872bc,0xffec66ba,0xffdf80db, -0xffd61a9b,0xffccbf75,0xffc29644,0xffba97d5,0xffad8bf2,0xffb383d2,0xffb2f37f,0xffb28f2a,0xffb064df,0xffc9eb89,0x007e704e,0x006b645f,0x00a2ca94,0x00493859,0xffd701cf,0xff51964e,0x00752d2a,0xfff1e28f,0xff6b4311,0xff67c386,0xff692830,0xff70ef72,0xff67567b,0xff63e5b2,0xff5bb41c, -0xffe9cbc2,0x005d1697,0xff4245b7,0xffdaa385,0x003ffe26,0x00958a02,0x00722a62,0x0081537f,0x00836886,0x007f646b,0x007b8a43,0x00731e95,0x0072b8f9,0x00766755,0x008745be,0x00833bb8,0x008530f1,0x0089a368,0x0081c25c,0x0078a6b9,0x005fc2ef,0x00720327,0x006d5255,0x00988011,0xffac7de0, -0x00717763,0x002b3b5b,0x0029e2b5,0x00576f2e,0x003ae92b,0x006e8768,0x00743e69,0x00501c8b,0x00841507,0x0075291b,0x005fda96,0x00203c1b,0x002655e9,0x003bc6e0,0x004404d2,0xffbc4b57,0x00826355,0x009227d2,0x009cbcad,0x00a929da,0x009c6872,0x008c2b24,0x0077ac65,0x0070df28,0x00800b99, -0x00b122fc,0x00a9835e,0x00ac5ee7,0x00aa56b7,0x0090af10,0x00741098,0x003feaa3,0x00623453,0x0087780a,0x00a51883,0x00477b49,0x00524f73,0x0014595e,0x00341ffa,0x003b5de0,0x0035d83a,0x00354f6b,0x005f090e,0x0047ba37,0x0099a322,0x00566eb6,0x00603285,0x001f33be,0x002c5033,0x001a9bf9, -0x002c3748,0x00230e77,0x005b7666,0x00afde41,0x00b0c492,0x00d0702d,0x00b98409,0x00a38889,0x007705ff,0x006e379a,0x008223e7,0x00e2da15,0x00cf6b95,0x00dd0ea4,0x00e7d1cc,0x00b18f78,0x007a513a,0x00199443,0x00589fd8,0x006bafd6,0x0072adfa,0x000e05bc,0x004fdcef,0x003ff922,0x005148d5, -0x0043289a,0x0016d43e,0x003ed15e,0x0043dbd1,0x004a718c,0x007c8c9d,0x007a0072,0x003a8b54,0x0038bf72,0x00444641,0x001e7e45,0x003f8d64,0x0001d5cb,0x00471aea,0x00bd6bbd,0x00d572f1,0x010d400e,0x00e62224,0x00abd5b3,0x006a399c,0x005c5818,0x009de5b5,0x01357f88,0x0114cdde,0x01135294, -0x01076fe4,0x00938472,0x002c1b6f,0xffc49675,0x001c2dae,0x0126deda,0x00fc2990,0x007f02e1,0x00390c67,0xff7fe0ae,0xffc9dcdd,0x00227522,0x00320799,0x008c8cf1,0x00af3711,0x007df8fd,0x00248d60,0x00204eac,0x00651f7c,0x00339d14,0x003b75e3,0x003afd25,0x0074d3dd,0x00478ebb,0x008395eb, -0x01023f22,0x00ca2879,0x00e159f4,0x00b05c4a,0x00c15a4d,0x00f1192b,0x0060b0c6,0x00219856,0x003be0cd,0x009474d3,0x0105cec0,0x0133a47a,0x01a81e36,0x018febf2,0x00ecd5e8,0x00d2bd02,0x006f4a3a,0xff435e27,0xff684761,0x0000ddc3,0x00a3fcbb,0x005c8119,0x00471f5b,0x0057ed68,0x00275ba2, -0x0020d62f,0x00676cda,0x0073f7c8,0x0061a130,0x0038587f,0x0068b3cc,0x006730a3,0x002ec521,0x001c2a9e,0xfff21f02,0x004cc558,0x00ac6e7b,0x00df587b,0x016f07ce,0x01245138,0x00d7c1fe,0x0080b644,0x0026cc8c,0x00207ba3,0x005e6e2b,0x008dd99d,0x005f6a31,0xffd5311f,0x0017f9aa,0x00189026, -0xffd36626,0x00802a89,0x00c05cbf,0x004c2565,0x00101cfc,0x002aefd2,0x00218549,0x0064094d,0x00447ba1,0x0004fb1f,0x0028c4df,0x00326231,0x0024c10c,0x0027898e,0x002e70a3,0x003f6356,0x001112a9,0xfffbacd7,0xfff0f68d,0x0010de9f,0x0001c67f,0x001a4441,0x001f6651,0x000bf9ca,0x00511053, -0x007ee959,0x00e34b24,0x0133a7b2,0x016812a0,0x01449c60,0x0101e2ac,0x00dfec83,0x0108619a,0x01603e0e,0x01732ede,0x01886b4e,0x01b47908,0x00ff7e37,0x00f011b9,0x0033a2e0,0x001697a3,0x00202478,0xffc87440,0x0002dd17,0xffe93134,0xffe928c3,0x00172206,0x001ee3b3,0x00156c71,0x0032a172, -0x002d847d,0x00192700,0x001438be,0x000e127b,0x0019b82c,0x000b2035,0xfff1e331,0x00414a3b,0x00983c92,0x00b868c5,0x00cdfc85,0x00911a18,0x0059ba77,0x001bafea,0x0012f1ab,0x0010fede,0x00411e49,0x00331eec,0x006f49c4,0x00feaa05,0x01805a40,0x01da8f26,0x022f98ec,0x015d6b1c,0x010b0dfa, -0x001a089b,0xff03f8dc,0xff473ac1,0xff5e6b7e,0xff2de094,0xff5ca90f,0xff9d4a38,0xffbc15a6,0xfff33810,0xfff6f8f9,0xfff68e73,0xfff4179e,0xffe94cc6,0x0004ae29,0x000eaeca,0x000c31e1,0x0014c5ae,0xfffd2c9d,0x0038fe54,0x00113e47,0xfff6b522,0x001478c0,0x00242b36,0x0047eaef,0x006f266a, -0x006671d8,0x006260c2,0x008b6250,0x003ea9f5,0x0042cdf1,0x0094d79d,0x00f3419b,0x012d0b08,0x0159332c,0x011583fc,0x00247e34,0xffea6396,0xff5f1d63,0xffa7d725,0xff9e6b9e,0xff87fd81,0xff7788fd,0xff6ca6c3,0xff87c6a9,0xff908d69,0xffa3618e,0xff95dd19,0xffb3749b,0xffe89a3d,0x0013879f, -0x002c3ea8,0x002facc0,0x00298aba,0x002b4c42,0x00210b45,0x0031ed03,0x0047407c,0x004fe52a,0x006c2953,0x005ee2c2,0x003fc58a,0x00223448,0xffffbe9c,0xffd85e2b,0xffe66766,0x000e148e,0x00512e3e,0x0019fdb3,0xfff2e906,0xffdb260f,0xfff3a7bd,0xffbb9cee,0xff8d99ae,0xff71aa1a,0xff93f2bd, -0xff7d187b,0xff9f53f7,0xffbb8fe3,0xffddea56,0xffca88b3,0xffce6d10,0xffc54ea5,0xffeb7461,0xfff24cf2,0x00115891,0x00084f75,0x001762a7,0x001cfc17,0x00270c42,0x002dc055,0x00541f76,0x005de1e2,0x004c0010,0x00459425,0x0047227f,0x004e632e,0x005a3036,0x00534257,0x004a0159,0x0038a804, -0x003614e7,0x0026b817,0x00252d45,0xfffe9108,0xffe4f9f5,0xffc64313,0xffb571d9,0xffcd7ed2,0xffc06cba,0xff6959e9,0xffc89438,0xffb8dd35,0xffbd22f0,0xffdb20ae,0xffdff73c,0xfff7d748,0x000580aa,0xfff9a7de,0x0016cf9e,0x001cd4cb,0x0025f564,0x000df737,0x0013f199,0x002cdd12,0x0025410e, -0xfff5bbba,0x002e8ad5,0x001fe3de,0x00262d76,0x00284a31,0x002b483f,0x002c07d9,0x002d1abd,0x002f751c,0x00371d3f,0x00406710,0x0046fde9,0x004ef8e4,0x00587da4,0x003ab928,0x001f6c91,0x00059fc2,0xffe9a34b,0x0015731e,0x001892be,0xffff28f9,0xffc85b8c,0xff82de36,0x001b97e0,0xffd7cfa1, -0xff959d6f,0xff948091,0xff94de01,0xff998554,0xff9272c2,0xff8db020,0xff8d5111,0xffefeac4,0x0034fdd0,0xff91ee36,0xfff076c8,0x00272d2c,0x004085c9,0x0035b657,0x003b20c2,0x003a164d,0x003abc6e,0x003b2be9,0x003b6d90,0x003e5fba,0x003f38ac,0x003f85f5,0x00408ba2,0x0040b9c7,0x0046263f, -0x0039c17e,0x00328dc5,0x0029f8b1,0x00231d95,0x00447424,0xffad6a1d,0xffbea363,0xff8fa505,0x001d7f78,0x008bb337,0x00d5d091,0xffe47254,0x0072046e,0x00cdb91f,0x00db399b,0x00dbe547,0x00ca026e,0x00e37e13,0x00e41f64,0x00daf3ec,0x007317fd,0xffef8d8e,0x00d86e57,0x00790588,0x001ac8ac, -0xff8bb702,0xffbb8854,0xffad6ba1,0xffabe6f3,0xffa4a81a,0xffa05d6e,0xff9bb8a4,0xff9d1ed1,0xff9f8831,0xffabafc7,0xffa38437,0xffa2efcd,0xffa551f5,0xffa24bf0,0xffa5df37,0xffb2cbcc,0xffaf741c,0xffaedabd,0xffb29d74,0x009beb3f,0xffcdfbfb,0x00237448,0x0030c280,0xfffa34a0,0xfffc58c9, -0xffdba0ba,0xffef3c19,0x0023443d,0x000699fb,0x00046d23,0x0004ca31,0x001e46cc,0x0000834f,0xfff2cf35,0xffea5e4e,0x0086602f,0xffb5158b,0xffa6803e,0xffa71a43,0xff92b21f,0xff7bd2c2,0xff69cb6f,0xff65c0c0,0xff68ed77,0xff7a5df5,0xff9e2407,0xff8d309c,0xff8c60c5,0xff9005fe,0xff86554a, -0xff8ef2f1,0xffaffca3,0xffb0a773,0xffb23fcc,0xffee82a6,0x00416135,0x0013d8c2,0x0032b9d7,0x002c77fc,0x0035470f,0x0011fd11,0x0048c3a7,0x00246dca,0x0056183b,0x0029615a,0x0071f61b,0x001d956e,0x0033b9c5,0xfff3e55d,0xffeeb196,0x0004994a,0x002be466,0xffe0008a,0xff9741a4,0xffa50fdf, -0xff84abf1,0xff604bd2,0xff4548f6,0xff38199f,0xff3826a1,0xff47f558,0xff86c808,0xff6274a5,0xff628c0f,0xff6fddba,0xff615217,0xff748494,0xffa681af,0xffb030ab,0xffad512e,0xffffe0c5,0x00226a88,0xfff748b8,0x001ae86a,0x003b96c1,0x002f526b,0x000f8dad,0x0029047e,0x003c7994,0x00368cec, -0x00898fdf,0x006adffe,0x0022e147,0x00138bb2,0xfff0166b,0x001f0558,0xffe11427,0x0033ce76,0xffd797ff,0xff8adc44,0xff950acd,0xff571dae,0xff110a4d,0xfed055d8,0xfecd3ab6,0xfee2121c,0xff2dec10,0xff92dac8,0xff59c556,0xff5a4163,0xff60f6ef,0xff3f1f73,0xff534e4f,0xffad465e,0xffcbcd22, -0xff4b342c,0x006b8d72,0x00f058b5,0x007c60d8,0xffea42bf,0xffeeb7f5,0x00017216,0x002b3b25,0x006e6ed5,0x0097f920,0x009136ab,0x002232f4,0x001267db,0x005ee9ba,0x00255b80,0x00104405,0x00428e51,0x0012a626,0x0067112d,0x0028420a,0xff950581,0xffc915b2,0xffb8632b,0x00107f89,0x00215636, -0x00381e38,0xff248d68,0xfe9dbf98,0xfe933d96,0xfee988b4,0xff335434,0xff2659f8,0xffd94576,0xffe60da6,0xff6c9f30,0xff5d3596,0xff98a7ae,0xfecb5dec,0xfeed6320,0xff5f489a,0x006a0679,0x003b4a4a,0x0027a25e,0x0053ba39,0x001e71f2,0x00183799,0x0056b2cd,0x007415e6,0x0062ee5a,0x0020061d, -0x002f433a,0x00285db5,0x001c3c42,0x000a6b5c,0x003856e2,0x00105a1d,0xffa69e8d,0xffc0fc3b,0xffb7521a,0xfff217ab,0x000b8e93,0x001daa37,0x0017ef11,0x001e064d,0x003702a4,0x0018e2d4,0xfff8054f,0xffcaf3d6,0xfff4eba5,0xfffb214f,0xffcffaa9,0x0029034b,0x009722a2,0x00623807,0x0089d129, -0x0057b9b8,0x005ea7a2,0x00514d87,0x004f1adc,0xfff3a669,0x001fd744,0x0021a834,0x001664a8,0x00120eda,0x001bf91e,0x003ab914,0x000afcb3,0xffce840e,0x0002b896,0xffd07be4,0xffe05fa3,0xffc6ded5,0xff928fff,0xffd78460,0x0001979c,0xff7ca81a,0xff32e717,0xff1a8a46,0xff1abdd7,0xff288b89, -0xff94aee4,0xfeede790,0xfe8735aa,0xfe9408d2,0xfe988d8e,0xff186ecc,0xff99f9a5,0x00507583,0xffb75284,0x0024bfa0,0xfffe768c,0xffc19bb1,0xffd1acd1,0xffcc003e,0xffd7c930,0xffcea6e2,0x001068ec,0x002163f3,0x0016135c,0x002d6f72,0x0027f2a0,0x00080960,0xfff99ee5,0xffffa452,0x00025392, -0xffe5cc1c,0x0020c9b7,0x001874f8,0xffe9c857,0xffde7e23,0xffc9cb20,0xffb6055d,0xffbc7ff1,0xffc1ca27,0xffaf9097,0xffc50389,0x002f4c6b,0x000b4a8f,0x0022e455,0x0044bb3d,0xffdeb6e2,0xff7bee5d,0xff032b0a,0xff9fd97a,0xfef8e6c0,0xffb9940c,0x00165b73,0xff8c8d9d,0xff7b2a43,0xff68277a, -0xff6f3a63,0xff92e26e,0xffc50780,0xffcee4af,0xffe251ad,0xffe2d31c,0xffe435a0,0xffd0e18c,0xfffc5ff7,0x000757ca,0xfff5b057,0xfff716f3,0x00205f78,0xfff5d603,0xffe54686,0xfff8abb6,0xffe6fd7d,0xfffa7143,0xffef1be1,0xffd2754d,0xffb7c293,0xff9a3807,0xff760af1,0xff38e080,0xff0a46bf, -0xfed3a7d4,0xff0e7d5a,0xff43d202,0xff47b759,0xff332ef0,0xff4b148e,0xff932b81,0xfffedfcf,0xffb99f96,0xffb474c6,0xff75963d,0xff4aac2a,0xff5a3286,0xff5deaa4,0xff766498,0xff8149f5,0xff87ddfc,0xff98e5c3,0xffc58a3f,0xfff14ad9,0x0010042b,0x00193e52,0x0024a1c1,0x001d61f0,0x00200878, -0xffe584e1,0xffcc7bde,0xffc6ebd4,0xffe3d728,0xffe97b6e,0xffde931a,0xffc4d82c,0xffbbbad1,0xffbcf2f9,0xffb346f4,0xff86db8a,0xff19d882,0xff2a3812,0xff25673d,0xff1d5486,0xff4ed81b,0xff3dfbc6,0xff60ea5d,0xff9035b0,0xff84267c,0xffae9a26,0xffb1ea2b,0xffc3fa93,0xffccab2e,0xffd6aefe, -0xffac228e,0xffc1ed51,0xffad9c59,0xfff6cf1d,0xffef21cd,0x000c5bca,0x000a8514,0x002c764d,0x00276480,0x00335dc0,0x000c8b7e,0xfff0d7c7,0x00057531,0xfffe4f56,0x000bd4d8,0x00160f35,0x002df901,0xfffc2678,0xffd00aef,0xffa1d8b0,0xff7e86ca,0xff64153c,0xff47fd57,0xff4aa085,0xff480dc5, -0xff3afb34,0xff4998fe,0xff770b1e,0xff6843f8,0xffd55158,0xff81da28,0xffac3c5a,0xffb3c56d,0xff9a1455,0xffaa84e5,0xff98c5f4,0xffaa6776,0xffd40aa5,0xffc03b0e,0xffc06add,0xffd4d3ab,0xfff697e4,0xfff7816d,0xffec8c32,0xfff41abd,0x002b254a,0x000bd7b5,0x001adb95,0x00188e39,0x00197304, -0x001de088,0x001dc67c,0x00244290,0x00050cd6,0xfff0d449,0xffdc28c8,0xffc95e7c,0xffb43fed,0xff9d5179,0xff92b39e,0xff8a92a3,0xff85b776,0xff7efc52,0xffae60d1,0xff953392,0xffe0166d,0x001b3d89,0x004e4db0,0xffc67d1d,0x001a325e,0x0056f115,0x00634fdf,0x006acc07,0x0066960a,0x0078b2a2, -0x00818160,0x0083f51d,0x00353276,0xffea8845,0x0079ed92,0x003c2477,0x0004928f,0xffd5edca,0xffe28e71,0xffdffdc6,0xffe29c19,0xffe22a52,0xffe2045c,0xffe5aa80,0xffdb6798,0xffd3a587,0xffca9cf3,0xffc148f3,0xffb908c5,0xffaf8d8e,0xffb2016b,0xffb09a20,0xffae3f0a,0xffab26f0,0xffc15ce2, -0x003bd697,0x0033bda2,0x00722d9f,0xffce3ed6,0xff7aeed1,0xff789b2d,0xfffb8fbe,0xff90657d,0xff6d8d32,0xff6d32e2,0xff713568,0xff888a9b,0xff7a5850,0xff7a2130,0xff7ff702,0xff8749c0,0xffe0545e,0xff6d682b,0xff7fe6bf,0xffc45fa0,0x005f287a,0x00393ab3,0x0040e8cd,0x00408cac,0x00388a15, -0x0032237d,0x00273882,0x002b2189,0x00301b83,0x00400606,0x0039ec4e,0x003a4d5a,0x0040543d,0x0031136d,0x002b65e8,0x00255aa8,0x003221dc,0x003e5364,0x004d1e6d,0xff7b2684,0x002c90e6,0xffe11de3,0xfff861f6,0x001fcc49,0x0001e97b,0x00373aef,0x0028754b,0xfffa2cc1,0x002c4e2b,0x0033767a, -0x001aa510,0xffe9a6c3,0xffedf8cf,0xffddd7f8,0x0001db77,0xff901a70,0x00307559,0x00572aa3,0x00487938,0x004db3d4,0x00378fb9,0x0027b469,0x0013f37f,0x0019397e,0x0028e53a,0x004e52c2,0x0042b606,0x003df0e4,0x003ef39e,0x00137537,0x0005d88d,0x0005cc92,0x001c58b9,0x0060bb45,0x007a589d, -0xfff7d4cf,0x001b6452,0xffebd45c,0x00153c5b,0x001fb129,0x001023f3,0x00154758,0x00539920,0x0018b41d,0x0081c344,0x00317b8c,0x00418217,0xffedd5fe,0xfff403bb,0xffdf4ebe,0xfff2de40,0xffd88df5,0x001cf987,0x0079637c,0x005b371e,0x00614299,0x0034c21e,0x0014a678,0xffe0bd2a,0xfff23450, -0x000c4b58,0x005d6556,0x004496df,0x0042d366,0x005bb552,0xfff9a022,0xffe52ecd,0xffed464b,0x000c27ea,0x00615c53,0x0060f603,0xffdc89d3,0x0023d156,0x00247d72,0x00511239,0x00525aa8,0x00201e6d,0x0047ea37,0x00466942,0x006124c3,0x008af8b0,0x008515b2,0x0057034e,0x0031d236,0x002761c9, -0xffd584f3,0x0018488e,0xffd3a6b5,0x001cab4d,0x00879902,0x0061f5fc,0x0067d903,0x001f2945,0xffe12cf6,0xffb068bc,0xffcb5b47,0x0017e4b3,0x008bbf41,0x0056a3e4,0x003edded,0x0043b2cb,0xff9d9d6f,0xff77bca4,0xffb5b928,0xffe3880d,0x00bba993,0x009d8a7f,0x0050a061,0x003eac4e,0xffa2cfd7, -0xff9ed804,0xffeaf989,0x002005b3,0x0058743f,0x00925eb3,0x00acc093,0x00321c6f,0x0016141a,0x0049b71b,0x001b43cc,0x00329b0b,0x0032a8e6,0x0069a879,0x001d7ee3,0x0034e0f0,0x00b4be93,0x009ce764,0x00e07671,0x00a217b7,0x00ad1ee3,0x00c80059,0x002e4969,0xffe6ae66,0xffe28872,0x0050e507, -0x00990ea6,0x004f67ab,0x00ea455b,0x00e4e965,0x004ebd60,0x004a427a,0x008a1239,0xff65b440,0xfe7036c6,0xff2c2cb2,0x00c36ef7,0x004f2aaa,0x00421dec,0x0056118d,0x002fbf99,0x00203d66,0x00540938,0x007bdde2,0x006a89d2,0x0031c2ed,0x0046857a,0x0031ffb1,0x000bb42c,0x00098498,0xffdf4428, -0x001f8c12,0x0048635b,0x004a1084,0x00b95907,0x00aebd50,0x00802a86,0x002b2ec4,0xfffe6350,0x00133cb6,0x00771579,0x002ca096,0xffe11a71,0xff7e1184,0xffd42e5a,0xfffb7fc0,0xffee2dd5,0x0075b648,0x00d33a8d,0x00b5118e,0x00833a67,0x008e83d3,0x0036f933,0x005c44ad,0x00349f02,0x00007351, -0x00248d08,0x0038e8fa,0x001b7324,0x0024a915,0x002b31f2,0x003d4d89,0x000d3ead,0xfff5461e,0xfff0c21e,0x00049ee5,0xffd5af2e,0xfffd1260,0x001e2a41,0xfffca942,0x002c4188,0x004652a9,0x0083f27d,0x00a79a8b,0x00c48698,0x00aeee3e,0x00bbcbf8,0x005f0501,0x0040be60,0x003c03d2,0x002e125d, -0x0059edfe,0x00983b77,0x00adc3d8,0x0027a0e8,0xffd5fc43,0xffc95313,0xffdcf749,0xffc3cc75,0xfff7519e,0xffec47a2,0xffed88b2,0x001820af,0x00272460,0x0017a7d0,0x00377225,0x002b80fe,0x0002d4ae,0xfffe09b6,0xfff38d5e,0x0007fa99,0x00022f29,0xffe02c79,0x003494af,0x00736021,0x0071b1b0, -0x0073cbd5,0x004046d3,0x00191b5b,0xffdd43df,0xffb06b72,0xffb94c56,0x001c5128,0xffe746ed,0x00391f19,0x010560b2,0x00d01fef,0x00ba9ed7,0x009d7dc8,0x003c7fcc,0x0010d101,0xff824d0b,0xff116d8a,0xff533649,0xff7627f0,0xff559dbb,0xff7ec192,0xff9b85a7,0xffaa8a6b,0xffdc3bf5,0xffd6b607, -0xffe60154,0xffe6292b,0xffce9461,0xfffb61d6,0x000516aa,0x0009081e,0xfffb9167,0xffd41780,0x00151723,0x000a0be4,0xffefcbb7,0x0000cfa4,0xfffd6c26,0x000547ce,0x000eb2a1,0x0001a3cc,0xfff3c2e6,0xffea629a,0xffd26718,0xffbfea60,0xffb5ff09,0xfff6192e,0x00229c84,0x0050da63,0x000f2f2d, -0xffe5cbd7,0xffa08eb5,0xff678599,0xff7eb83d,0xff57113e,0xff4c161d,0xff551676,0xff4e0cfc,0xff76ebf9,0xff8bbfe1,0xffa2c19f,0xff927887,0xffa5a6ff,0xffc767c4,0xfff70d58,0x000b77c3,0x001a7659,0x0016d387,0x001fabbd,0x00190c8d,0x0024d862,0x0025334f,0x0018fe6f,0x001e5fce,0x001e4d33, -0x001c0880,0x00065736,0xfffba8c4,0xffeb4949,0xffff2e11,0x001aaad4,0x002ea601,0x0020614e,0xfffb015a,0xffe08e5f,0xffcab45b,0xffcc62e8,0xffa233fc,0xff6ffa41,0xff9984b6,0xff8e5caa,0xffa5db9d,0xffb3f32d,0xffcac821,0xffa9c7c4,0xffa6c9da,0xff823b14,0xffb8d2b7,0xffc29216,0xffde938b, -0xffef5fef,0x000dc167,0x00285375,0x001f1e68,0x0008bd1d,0x00298568,0x003d1408,0x002592a9,0x00214b53,0x002a0b0f,0x00350333,0x004431b5,0x0027d179,0x000d2e79,0xffefc4c0,0xffe0a9d3,0xffcbb80a,0xffc117ff,0xffb56f20,0xffb3b94e,0xffb654e9,0xffb24450,0xffb05cc7,0xff979c76,0xff52c72a, -0xff9e2333,0xff8330a6,0xff8b7693,0xffa3fe6d,0xffa662fc,0xffc09467,0xffc57fe5,0xffb3e9f1,0xffcd6a26,0xffdcbca7,0xffdbe077,0xffda5577,0xfff11b44,0x0005a912,0x001b3e0f,0x0003ef85,0x0046cb6b,0x003e5091,0x003dea92,0x003e7c39,0x003be8e8,0x0037b577,0x0036757a,0x0036bbc7,0x0039fc5f, -0x003a0e04,0x0037fca2,0x0035a245,0x0031a64c,0x00199b9f,0xfffd09c3,0xffe20d96,0xffc4dbaf,0xfff2e5ab,0xfff89c18,0xffb43af3,0xff8be204,0xff8d14fa,0xffcfc220,0xff972999,0xff8caee6,0xff8bce91,0xff8dcfcf,0xff9b5338,0xff932c97,0xff90b802,0xff94c94f,0xffa96415,0xffe85562,0xffa2d3ad, -0xffb9721a,0xffeaa8a2,0x0031a3d6,0x002026ee,0x002417e5,0x0023441b,0x002351f8,0x0023f582,0x0023eb3f,0x0022724e,0x001fc231,0x001da3dc,0x001b85ce,0x00190491,0x00195bc0,0x000f5190,0x0009a99f,0x0003fc80,0xfffd7f6f,0x0015f541,0xfff7bd94,0xfffb6dbd,0xffe5d101,0x00719bae,0x0096bebe, -0x0051e12b,0x004c1c51,0x008ae456,0x0068d3b4,0x00739f6b,0x00723f52,0x0059f8fb,0x006cef21,0x0069f826,0x005bedd3,0x0085dd38,0x004d79c8,0x0045a729,0x0081744f,0x0067da48,0xffdf1f68,0xffff67e1,0xfffbc38f,0xfff82a56,0xfff0326c,0xffebab5a,0xffe761fe,0xffea8013,0xffed8b62,0xfff6fa6d, -0xfff59c66,0xfff819ce,0xfffd3fbe,0xfff98689,0xfff791c6,0xfff2e11d,0xfff50a96,0xffeb3b56,0x001cfd73,0x0088de8a,0x001c1616,0x0048afd7,0x004c61f3,0x0030ec78,0x0021f359,0x00190b43,0x0037362f,0x005e08d9,0x004c33c5,0x00383c7b,0x004283ca,0x0031522a,0x001833bd,0x002760c0,0x00129740, -0x0064cc29,0x00128b23,0xffffe4ba,0x001042d3,0xfff93e67,0xffdfb029,0xffcb8c6c,0xffc6a8a0,0xffce130d,0xffe09d8d,0xfffd1db3,0xfffbcaf6,0x0003087e,0x000bd4a2,0x00042776,0xfffb0b2f,0xffed1388,0xfff5cdcb,0xffea2a70,0x00506ea4,0x008e0c1d,0x005357e8,0x0042a19e,0x004b2494,0x004e25af, -0x00231379,0x005ad945,0x0035e65f,0x006e6419,0x003f05f0,0x007102cb,0x00409146,0x003cd71f,0x000c5524,0xfffc918e,0x001822f1,0x004c4141,0x0026f4ae,0x0007d074,0x001f36e3,0x00014c77,0xffd7f3b9,0xffb91869,0xffaef45f,0xffb5afe8,0xffcb2855,0xfffa2f65,0xfff9fe4e,0x0009e613,0x00201dbf, -0x0010a7a5,0xfffc551b,0xffdadbe3,0xfff2c1c0,0xffd5af5a,0x0059a67e,0x00699885,0x00343e93,0x00290568,0x0065d1bd,0x004a8a4b,0x00105fa2,0x003382a9,0x00435236,0x003ac560,0x008aa8b0,0x007bcc48,0x0037cf54,0x001b8369,0xffee8000,0x0001c007,0xffe3c677,0x003ab4a4,0x001b6778,0x0016f7b5, -0x003ea0c2,0x000946e2,0xffbb4419,0xff7b46ea,0xff760a15,0xff9040c3,0xffd52921,0x001bc8ed,0x00171cb4,0x002d6155,0x0046c1e8,0x00224763,0xfff59e5b,0xffcdbf91,0xfff472b5,0xffe9d45e,0x00e3649a,0x0163faee,0x00e58bf1,0x001cec94,0xffdf5baa,0xffec9445,0x00332b2f,0x004e750a,0x0088db1d, -0x00c0ca96,0x00334565,0x000a7b0a,0x004bb538,0x001f43fa,0x00208c32,0x0057606b,0x004eb02f,0x0097e6a4,0x00747215,0x000fbd65,0x00171c48,0xffe6eddf,0x003402e3,0x0025a9de,0xffe84692,0xff3cee3b,0xfeea97ce,0xfef1b572,0xff895fbc,0xfff80d47,0xffe695f9,0x008dd3b6,0x00795cfb,0xffb9129e, -0xffe2cdcd,0xff8dff83,0xff3f3c88,0xfec71c54,0xff1ac26a,0x00dade10,0x006d7fe8,0x0034149a,0x004c64e2,0x0028206d,0x0023f079,0x004579ac,0x00759db8,0x006b1c5c,0x001e3e4e,0x0027b4dc,0x0022c40c,0x0032e587,0x00142f03,0x002e9eed,0x0031b71f,0x00068c62,0x004adf65,0x0079fa5f,0x00775038, -0x00578f80,0x003f4ab5,0x001e4472,0x002b051c,0x006c34d2,0xfff84022,0xffd7aa9b,0xffd90590,0x00612246,0x00724b82,0x0005c245,0x0030f415,0x00da9ff4,0x00ed6214,0x00eae06d,0x00a45a0d,0x0079916e,0x00540df0,0x00592e41,0x000e947f,0x003311e4,0x002e2c34,0x00180eb2,0x0019aed1,0x001e5bcf, -0x0036e8fb,0x001c3f4e,0xfff09525,0x001c3498,0xfffd386c,0x001b2f83,0xfff8b830,0xffb5a3b7,0xffe3b363,0xfff03eb1,0xfff585ad,0x00142f1e,0x003626a8,0x001182de,0xffd8433f,0xfff71146,0xff4f2249,0xff5887a4,0x00045b12,0x006031e1,0x00bf129b,0x00e03985,0x00c8a77c,0x003f8eb9,0xffdffdf4, -0xffc5378f,0xffc75414,0xffdbf36c,0xfff3b522,0xffe8a118,0xffe88273,0x001293ce,0x00237d51,0x001f9ce7,0x00332649,0x00250bf5,0x00029cca,0xfff90e09,0xfffeb5ea,0x0009fbab,0xfff8dcd0,0x0028b7a6,0x0026d718,0x001adae3,0x00399c0f,0x0039cc81,0x003c3709,0x002e6ec9,0x0004b853,0xfffc6101, -0x002be17f,0x00b0a74a,0x007a5bd6,0x009bf737,0x00c4f89b,0x010888a0,0x0107b5bc,0x00d494cc,0x00b494ef,0x0056aca7,0x0062c469,0x00155777,0xffcaa098,0xffb97f5d,0xffa976c1,0xffadcb25,0xffc6e456,0xffdaf277,0xffdb729f,0xffde0823,0xffd97b4c,0xffdc2705,0xffd2139d,0xfffb652f,0x00047574, -0xfffe119c,0x00104017,0x0034fe60,0x0013e4e4,0x000583d4,0x0007a9ae,0xfff0dd55,0x000b83ac,0x001e8f40,0x00427a73,0x00448f88,0x00462e27,0x004316c6,0xfffc52d3,0xffd731ed,0xff9f0c0b,0x000d6371,0x0054989a,0x005950ef,0x0074c49a,0xffdd99b8,0x000d9696,0x000540dd,0xffddb3ef,0xff952e3e, -0xff780db7,0xff4fa925,0xff578d76,0xff66986c,0xff7e39a8,0xff883915,0xff9737e5,0xffa37fc3,0xffb7168b,0xffe789e3,0x00120851,0x003727b3,0x00240b28,0x00142229,0x0010e8c4,0xfff68b37,0xfff2d2ba,0xffeb6a59,0x0013c2d3,0x00275896,0x00302b09,0x000aa7cd,0xffe5620d,0xffc502d4,0xffc9a756, -0xffd46289,0xffd8dd7f,0xffc20e7d,0xffbebdc6,0xffd07d06,0xffe298e4,0xffa50bc8,0xffbdc90e,0xffe130df,0xffda2821,0xffed4a50,0xffdeba3d,0xffd2b9e1,0xffc813b9,0xffc17490,0xff98d32d,0xffa29975,0xff91c5d1,0xffc32184,0xffbeced6,0xfff2bef8,0x00087c32,0x003ba9fc,0x003668db,0x0047a171, -0x002bc6ef,0x000649c0,0x000be78f,0xfff9c61a,0x00035b9a,0x0006baa6,0x001291e1,0xffffa71c,0xfff8095c,0xffef65f9,0xffd68855,0xffb883b7,0xff9ecf43,0xffa216d1,0xffa7d2f9,0xffa16794,0xffacc9ce,0xffa6d866,0xff9e5db0,0xffb1137f,0xff95ab46,0xffab59b6,0xffa9af97,0xffa14947,0xffa9fe24, -0xffaa3d32,0xffc59a1c,0xffe9e506,0xffe3bfa4,0xffdf48de,0xfff11eb5,0x0003999b,0xfffc7e59,0x000a4028,0x0004fefd,0x00343bb4,0x000a1773,0x00070aa0,0x000cb56b,0x000abc8c,0x000c6154,0x000a1a3b,0x000a3f27,0xfffadc46,0xfff23f1a,0xffee7cc5,0xffeeb193,0xfff3c137,0xfff56d42,0xffe555ba, -0xffd4cc89,0xffc5ebdd,0xffb9bcbc,0xffd11dcf,0xffc1d45e,0x00094558,0x001e2f9b,0xffff8920,0xfffcbfdc,0x0020bf75,0x00146ae1,0x001beae2,0x001eafff,0x0016d990,0x0023b79c,0x00295999,0x00287712,0x003f25d4,0x00193d8a,0x002eb7ec,0x00433568,0x00295110,0xffe27124,0xfff0fac2,0xffed81f2, -0xffed3b30,0xffebfec7,0xffeb066e,0xffeb7409,0xffea9603,0xffe9de0b,0xffe774fe,0xffe54dda,0xffe26c2a,0xffe3d66c,0xffdeb684,0xffdc1a47,0xffd844e0,0xffd47abe,0xffe57d38,0xffd4499d,0xffdd2f9c,0xfff49789,0xff964c88,0xffa268c2,0x0012cc89,0xff9d1b35,0xffa2530f,0xfff0e585,0xfff9966f, -0xfffe0907,0x000e9dd4,0x000be5c4,0x000de0ca,0x00183125,0xff9b898e,0xff8f23c7,0x0012143f,0xff9f09ab,0xff8ee21a,0xffe58146,0xffded865,0xffd8e064,0xffd4b1e4,0xffcbfa5e,0xffc5e3c4,0xffbdd0a5,0xffc4d6ac,0xffc8ef9a,0xffd26548,0xffcbab9a,0xffca68c0,0xffd06778,0xffc00001,0xffc061c7, -0xffcfc095,0xffd13663,0xffe1aa5c,0xffd7f6df,0xffc9214f,0xffd4a099,0xffbf583e,0xffe7b8ec,0xffe901c4,0xffd42c43,0xffec3132,0xffdc66f7,0xffcc7303,0xffdb8398,0xffed5c18,0xffdfb4af,0xffd2d178,0xffc98fe5,0xffa5af61,0xffc67ee7,0xffcbb03c,0xffc63006,0xffe72e9a,0xffcc98da,0xffbeb270, -0xffa71bd3,0xff9bc9af,0xff93548d,0xffa56926,0xffb3cae8,0xffc4437e,0xffb5d1fe,0xffac5304,0xffb2ef3b,0xff86c315,0xff8b83bd,0xffbc86bd,0xffbfdbe1,0xfffa2938,0x001b44ac,0xffd99671,0xffeb9522,0xffe01d64,0x0003af45,0x0010c8c3,0xffefb531,0x00126260,0x003816ac,0x0009beff,0x00423f69, -0x002384b5,0x0017e9a2,0xffdd5b2d,0xffc6bb25,0xffbfb105,0xffcab6a6,0xffbf04c1,0xffd86da8,0xfffa0130,0xffd6483f,0xffb2e80d,0xff839b49,0xff65a50f,0xff46862e,0xff6bcd9f,0xff825cb3,0xffaaf18f,0xff90e84a,0xff8197a6,0xffa1b2b4,0xff3fb0dd,0xff51bb45,0xffb6b8d2,0xffb14ca3,0x0006c20a, -0x001d9b31,0xffd90308,0xffed5efd,0xfffd2c11,0x0047aca3,0x00536452,0x001f7917,0x0043f60c,0x0044ee4c,0x005ce459,0x008f9ae2,0x007dfe8d,0x005450f4,0x001713d7,0xfff07847,0xffbbc327,0xffdbba0a,0xffd00fcb,0xffe33b05,0xffff6514,0xffbecb7e,0xff7948b9,0xff2aff93,0xfefcf6fc,0xfef879a0, -0xff3b4a93,0xff830082,0xffb65cf6,0xff76fe8b,0xff55b785,0xff6fcbb7,0xfed89e38,0xfef7616c,0xffae4417,0xffb301ee,0xffe9cab7,0x003e1fa7,0x006dd18c,0x0066e8f2,0xffe5b435,0xff91d431,0xffaffc19,0x00096d79,0x00281ab4,0x006c0b8a,0x00cc64a2,0x00355a39,0x000502c9,0x0031d922,0x000b2598, -0x001efc9d,0x002bb291,0x0038370d,0x0013a8e3,0xfff395e8,0x0011b78d,0x00292619,0x005b5b8b,0x0054b792,0x005134a6,0x003de4c9,0xffa61a31,0xff52a801,0xff2ed4de,0xffa162f9,0xffbd229a,0xff31014b,0xffdadb44,0xffe3148f,0xff636308,0xff8a321a,0xfffba74e,0xff45aa6a,0xfe1b3522,0xfec08106, -0x00972d7c,0x004fafa4,0x00424b15,0x003afe8f,0x0029f8dd,0x001fec42,0x003a2d7d,0x00740325,0x006a54af,0x002a0953,0x0020bebc,0x00064901,0xfffeda3a,0x0007b604,0xfffd873a,0xfff29444,0xffc24952,0xffa7f884,0xffc0460d,0x000295f9,0x000cac48,0xfff19477,0xffee2902,0x00118520,0x00730461, -0xffc6298b,0xff7aea9e,0xff6bb435,0xffbd5bd5,0xfff303d3,0x001bff84,0x00243ed8,0x00be0947,0x00f20380,0x00ef0a46,0x00ce7bad,0x005484a3,0x00469b9b,0x0037e941,0x00193b8f,0x002cd2cf,0x0034dc5a,0x0013c819,0x0017d9d3,0x001d1a64,0x003321c1,0x000daf84,0xffec38d1,0xfff59385,0xffe973e0, -0xffbd072b,0xffc95870,0xffebfd34,0xffe66445,0xffee46e3,0xffe9ed7f,0xffe1745d,0xffca682a,0xffb8d875,0xffb2d50c,0xfff78d58,0xff7efd7b,0xff2330a0,0xfec44594,0xff006cf3,0xff534c42,0xff7ec25c,0x004f0333,0xff5ba4eb,0xff9c9ff1,0xff8cb32c,0xffa12c43,0xffde91dd,0xffed1a36,0xffeef608, -0xfff34167,0x000c4cbc,0x001e0333,0x00163ba2,0x0028eb55,0x001b9ae0,0xfff0b1c8,0xffede098,0xffe41cb4,0xffeacb18,0xfff37b3c,0xffefcc40,0x00133b12,0x000b9d80,0xfff41007,0xffeb92bf,0xffe0d98d,0xffd5cceb,0xffb099d8,0xff8dfdca,0xffa6b7e4,0xffff9584,0xffee157f,0x0028278d,0x008f2040, -0xfff2e7a4,0xff77cd76,0xfef066e8,0xff2e6055,0xff043c59,0xff546d5a,0xff9be8db,0xff8d0083,0xff8c6fcf,0xff9657a7,0xffb1e847,0xffb28b32,0xffb9aef6,0xffcdb216,0xffc0ff5f,0xffcc4a87,0xffd11338,0xffc6792b,0xffed97b1,0xfffa23bf,0x00090691,0xffec5203,0xffd7b43d,0xfff2a663,0x0008c932, -0x0005e0ed,0xfffe6d9a,0xfff23eeb,0xffdb12ca,0xffbc738b,0xffad70bb,0xff8b7fd5,0xff4f21a5,0xff65b774,0xff476abb,0xfef96d18,0xff03f5dd,0xff12f9a4,0xff2b4af3,0xfefc42da,0xff91add4,0xff6e9f81,0xffa97813,0xff7f2f78,0xff49460c,0xff336cc7,0xff3ab5ea,0xff40a08b,0xff624f5a,0xff7e5508, -0xff94bdb9,0xff9516ab,0xffa07562,0xffaf0966,0xffd26bb3,0xffe6a125,0x0007579a,0x000ccb23,0x0015afbd,0x00154ed4,0x0008610a,0xfff02680,0xffda1005,0xffccea12,0xffd3654c,0xffef7e73,0xffeb99ba,0xfff4f9de,0xfffdba8b,0xffee874a,0xffe0a70d,0xffc73e50,0xffd4d282,0xffc377df,0xffbf8a28, -0xff9c47d9,0xffb5f19c,0xffac900d,0xff8b6c4f,0xff9ee3e0,0xffad9194,0xffabf39f,0xffa7a1bd,0xffa4abfd,0xff93c184,0xff892747,0xff6c7c74,0xff8a26c6,0xff9dc274,0xffa4fa54,0xffd28968,0xfff4be5c,0x00212f64,0x00120f6e,0xfffc7ba2,0x000532b8,0x000e117f,0x0005998c,0x0006b954,0x0006d07e, -0x0005fa5e,0x000744d3,0xffe72dcf,0xffca3658,0xffb075da,0xff94cddb,0xff7ccb8b,0xff649f17,0xff72f8b8,0xff82ab8d,0xff95e711,0xff9dc978,0xffa1f1dd,0xff8eef68,0xff8d4bed,0xff914845,0xff813f5f,0xff89a5d8,0xff8bf659,0xff8b17a7,0xff98a9b1,0xff9677b9,0xff94b016,0xff9abf73,0xffaac695, -0xffa806a5,0xffbb674d,0xffcc836f,0xffcc02d3,0xffe8baf0,0xfffa31b3,0x000f7b77,0x0014638a,0x000ea42c,0x000df855,0x000b8d67,0x00096667,0x0009cad2,0x00043e97,0xfffde1e1,0xfff3219e,0xffe8c6d7,0xffdd1f89,0xffcc1764,0xffc739aa,0xffba3ec4,0xffafc534,0xffa44a58,0xffc4ff32,0xffc61c7a, -0xff986cd5,0xff9dede2,0xffdbdfc7,0xff9df60e,0xff9f4324,0xffce0b50,0xffd0c434,0xffd5a493,0xffe22792,0xffe251ab,0xffe5a62d,0xffed1aff,0xffa8ec10,0xffad513b,0xfff5d3ea,0xffbad19b,0xffbe88d2,0xfff27a78,0xffea78e4,0xffea8734,0xffeb23b0,0xffeaad96,0xffea9ce3,0xffeb2dd2,0xffe4c7e4, -0xffdf921a,0xffdb0b3b,0xffd5d1c1,0xffd127f4,0xffcbefc8,0xffca5a3f,0xffc9599c,0xffc92d77,0xffc6717a,0xffce2f8e,0x003fb574,0x00356c4c,0x004f17a9,0x00650bf9,0x002b718c,0xff9fd098,0x006d1e28,0x00360bbc,0xffbfd2d0,0xffc59453,0xffc4dcf9,0xffb9faa3,0xffba84b1,0xffb603a1,0xffadb5e8, -0x002b1ff8,0x005da102,0xff8de864,0x001f46ba,0x0057733a,0x004470ec,0x003e948a,0x004614ab,0x00410a9c,0x003b0ed4,0x00374c28,0x0032cd14,0x00381f7b,0x003b78d9,0x0041eb1d,0x0043be04,0x0046f768,0x004e1e34,0x00454e2b,0x003e8a5c,0x002f08a8,0x00379333,0x002e0df5,0x006c8ff2,0x000e9f25, -0x004eca21,0x002dd4a3,0x0037ee35,0x004accfc,0x002a0ab5,0x004a5af0,0x005d6512,0x005a810f,0x00658ec2,0x0050042b,0x0057ed04,0x001c0cda,0x00129b3f,0x002c9561,0x002218b1,0xfff697c9,0x00575f5f,0x0056924a,0x00645a74,0x00543191,0x004133c7,0x0033074d,0x002c4eee,0x003aa7f6,0x004a9356, -0x005b25da,0x005f73cc,0x00658a46,0x006f69f8,0x005b5ed3,0x0045452a,0x001ee584,0x002f380e,0x0033ce67,0x008dd52e,0x007b231f,0x005d8e9d,0x001ce7e9,0x00431753,0x00466119,0x001fa307,0x0049b82b,0x004a90b5,0x00568acf,0x0057ae10,0x0047db76,0x005265c9,0x001a2d19,0x000ca72b,0xfffd378c, -0x00102a1f,0x002dc3e5,0x004d239a,0x007668ff,0x007d97a1,0x006a00c1,0x0047da64,0x002f5e80,0x0020e442,0x00379128,0x004ea602,0x006e9dce,0x007ca658,0x008b82bd,0x00a7a704,0x00787761,0x004ac03f,0x0008d41b,0x0024c063,0x00184c0a,0x007bc5b6,0x00551191,0x0046b94a,0x001a4f23,0x00759428, -0x00631d65,0x00159a4f,0x00441365,0x0049aed0,0x0047d182,0x00815d72,0x008108f0,0x004deda4,0x001cd26d,0xfff77346,0xffde7a56,0xfff14c31,0x000c63ed,0x00430c1b,0x009476f3,0x00ad7097,0x008d6469,0x0050f48d,0x0026693e,0x001b5592,0x0048be3e,0x00825202,0x00a99615,0x00b11659,0x00be4abc, -0x00dc8081,0x00897ffc,0x0039591f,0xffe2e549,0x00070354,0x00a2642a,0x010c9cfc,0x013de8ea,0x00ef3181,0x00193d1c,0xffaab03f,0xffbdcbbb,0x001cdd70,0x002a5a0f,0x006dd67a,0x00d4e2de,0x003b67cd,0x00034485,0x002fe101,0x001722b7,0x002fb463,0x0047e4a5,0x0071e1b3,0x007bb195,0x008b3807, -0x00a093a4,0x007968d0,0x00567942,0x00693d9b,0x004776e4,0xffe42e02,0xffa9b334,0xff90160e,0xffa6f233,0x004b51eb,0x00b12a49,0x00883e65,0x01033c12,0x00d60429,0x0004a7b1,0x0053a7ba,0xffa9003b,0xff86271c,0xfebc39aa,0xff12e5ad,0x00dfdad9,0x008d73e8,0x0053cd9a,0x003df21d,0x002be2c9, -0x002ba2d0,0x0033fdec,0x006e6db4,0x006d43f5,0x002c6778,0x002d0af0,0x0024d289,0x0039085e,0x0023b890,0x0012883c,0x00367e2a,0x005c3258,0x009b5944,0x00f279be,0x00d23022,0x009237ba,0x004a357b,0x00163b9e,0x002a006b,0x008fdc6e,0xffec020b,0xffc7b7e0,0xffdfd502,0x00739d75,0x0092965f, -0x00423e32,0x002a1452,0x00f8eb7c,0x01308156,0x010c0362,0x00d0cf30,0x0060622a,0x0040b9c4,0x004c76ec,0x003ea7e1,0x004524d3,0x0039fcda,0x001be3de,0x001dc34e,0x001d7874,0x002d7765,0x0025bd05,0x0013526f,0x00170319,0x001a40ba,0x001e7678,0x000f1746,0xfff9b53c,0xfff94346,0xfffb54b7, -0x0081f0f4,0x00ee0902,0x012548e6,0x0108b5bc,0x00a8e7af,0x00534c1f,0x00043fa6,0x0051f802,0x00e9db7f,0x01bf9622,0x01ecc9c4,0x018968dc,0x01040278,0x007359ff,0xffa89dc8,0xff8b7dc6,0xffcb9f65,0xffebe33c,0x00115d7a,0xfff596c9,0x00046513,0x000a3bc0,0x00160349,0x001b4134,0x002575a4, -0x00157023,0xfffd7114,0xfff938bc,0xfff456f9,0xffff3714,0x0009574b,0x00119884,0x00277b99,0x0049b852,0x007c7f88,0x00961178,0x009c93dc,0x0076f63a,0x002fb626,0x003965f2,0x0069073a,0x00b9602f,0x00b75f55,0x00dd68c5,0x00ec33ac,0x019128fc,0x01cfe606,0x01ece976,0x0121bf64,0x01282d62, -0x00aabf5c,0xffd20db0,0xffe58d4d,0xffe45dd9,0xffd2621e,0xffe15d34,0xfff0abee,0xffe8e0dc,0xffef9f86,0xffdd82b4,0xffd1b9bc,0xffd36f13,0xffdc7684,0xffeee966,0xfffaed99,0x0011c6a3,0x00194213,0x001cb2cd,0x00295b46,0x0026d557,0x001a5300,0x00119027,0x001d6de5,0x003d116d,0x00777444, -0x00853fdf,0x008f8119,0x009a963f,0x0078c86d,0x007a746e,0x0074c3af,0x00c98fe1,0x00f3add0,0x010b167c,0x0114662e,0x004b0134,0x00321bb0,0xffbfb854,0xffc81e69,0xff6b45a8,0xff65440f,0xff56d027,0xff5d98e5,0xff77ce71,0xff896af2,0xff97f9f1,0xffa771b9,0xffb3498b,0xffb6be99,0xffdceba7, -0x00020d95,0x00310770,0x001e664a,0x0018cfff,0x000d097c,0x001bc05e,0x0026e755,0x00201ce7,0x0038f1bb,0x00450cf8,0x005e3ea0,0x00412618,0x0019a245,0xffef29ee,0xfff1bf22,0x001b36ec,0x007ab1db,0x005032f3,0x0046a50e,0x0051e84a,0x004a8962,0x0007e310,0x00029bc5,0xfffbc3e6,0x00032640, -0xfff8e8dd,0xffe4dc04,0xffc73939,0xffb1a0e3,0xff9e9b35,0xff912747,0xff86cdc5,0xff8eac91,0xff92f01c,0xff9c11d4,0xffcd75f7,0xfff8acaa,0x0028d1fd,0x00277611,0x00341ae6,0x003c4679,0x00285d8e,0x001be818,0x000bacf7,0x0008145b,0x0001e92e,0xfffd134a,0x000859ee,0x001acbb9,0x002bf9c6, -0x0024584c,0x0010ead2,0x000480f0,0x00000add,0x0004f4f9,0x0001bd9a,0x0002dc65,0xffe20301,0xffe13305,0xff972891,0xffc4bbdd,0xffb7284c,0xffb291d1,0xffc31f84,0xffbfaf87,0xffd4811b,0xffe62aba,0xffed071e,0xfffaae63,0xfff8d68c,0xfffdf192,0xfff67d5b,0xffeed4cb,0x0006daed,0xfffd0824, -0x0000ed20,0xfff895cd,0xffeaff57,0xfff3e7d7,0xfff34a15,0xfff4922f,0xfff4c09c,0xfff24495,0xfff71a0f,0xfffb6e3e,0x00052409,0x001171ae,0x00239b24,0x00324780,0x0023f413,0x001278ae,0x0001eb4b,0xfff4aebd,0xfff589c0,0xfff7b99d,0x00085d05,0xffed657e,0xffa53eed,0x0011c966,0xfff3607a, -0xffb58ecb,0xffb42e9c,0xffb2b152,0xffafc33b,0xffaf2d7b,0xffaea406,0xffad3fbe,0x0003efb4,0x001ada24,0xffbd4435,0x00069d32,0x001ad0f9,0xfff96ed5,0xfffe0daa,0xfffdd8a7,0xfffc347a,0xfffbb987,0xfffb35f9,0xfffa6855,0xfffeb54f,0x0001e3b7,0x000413f4,0x0006b56b,0x0008369b,0x000fc90b, -0x00073dc6,0x00048759,0x0000dc3a,0xfffdd976,0x0001fde8,0xff9beff2,0xffad24a4,0xff978e05,0xffc2108d,0x0016a038,0x008aabe7,0xff9f4425,0x000413db,0x00714992,0x00813ce1,0x0083b705,0x00802f26,0x008b43e2,0x008cb1c8,0x00927469,0xffffdbc2,0xffa09b7c,0x008fde31,0x0007d4c6,0xffbc74ef, -0xff913829,0xffac8c7d,0xff9e72d0,0xff97c36a,0xff9115db,0xff8d8ed9,0xff8ad743,0xff92f7ad,0xff95525b,0xff9787fb,0xff9256ed,0xff90fea2,0xff964957,0xff8ab9eb,0xff8e5afd,0xffa481fc,0xff9daf5b,0xffa4f2c4,0xff9d6dc8,0x003fbfc5,0xffafde82,0xffd3b3e1,0xfffd50a5,0xffdd28b0,0xffd1beec, -0xffca42d5,0xffca994c,0xffe41246,0xffca093f,0xffd43fd0,0xffdc4c74,0xffe3e237,0xffcd19fa,0xffb1fb8a,0xffba7e8e,0x00298c6a,0xff9aa62c,0xffa04300,0xff8d8463,0xff709bfc,0xff5d42bd,0xff56ceb2,0xff5b2795,0xff75d5b3,0xff82f143,0xff818bfa,0xff742bcb,0xff6bf939,0xff76c69e,0xff5b3011, -0xff679aaa,0xffa012dd,0xff96569d,0xffa8248b,0xffde7e97,0xffff96ef,0xffec6695,0xfff04f5f,0x000c5bce,0x0017ae4e,0xffe81490,0x0029becf,0x0022f94a,0x0021fc75,0x000832a3,0x0027fc90,0x000999b4,0xffef6f69,0xffbffa0a,0xffc48fb6,0xffcaf870,0xffdfda47,0xffc58d0a,0xffa0c996,0xff8e6638, -0xff538d2c,0xff2e4290,0xff1b871c,0xff1b31f3,0xff480b02,0xff588271,0xff5b0fbd,0xff460588,0xff361eca,0xff553823,0xff18e92c,0xff35a532,0xffa49b77,0xff8b9b82,0xffaca790,0xfff1cc06,0xffff0a64,0xffd422ad,0xffdb8ba8,0x0043f6b9,0x0051d177,0x0017b26a,0x003de390,0x0045b112,0x004902f5, -0x00814a7b,0x006a1f97,0x0043df6e,0xfffac917,0xffc3b004,0xffcb0c5f,0xffb5269b,0xffeeb0a8,0xffce817a,0xff9ee80e,0xff70d912,0xff03b5d6,0xfec2ce34,0xfeaa77c0,0xfeccd4d6,0xff292eea,0xff65300e,0xff5d48d3,0xff259eae,0xff0ceb21,0xff30b3f9,0xfedf59c2,0xff12cd45,0xffbccb6d,0xffa95671, -0xff5803d0,0x002e86bb,0x00d77378,0x00b58b25,0x0033a0ce,0xff9b1e3e,0xff83cfb5,0xfff348aa,0x0008a971,0x004b7dec,0x00ca77b1,0x0031f72e,0xfff97825,0x001f09a1,0x0008167d,0x00106c31,0x0025b5d0,0x000ecb6a,0x00333510,0xfffac2c6,0xffa127c5,0xffcd17a7,0xffca9549,0x00081be0,0xfff25568, -0xffac1f9f,0xff26f970,0xfeda0172,0xfec16b76,0xff334345,0xff45cbb3,0xfec80be8,0xff53ac22,0xff4da5fe,0xfeda4a8a,0xff1e418f,0xff4c5a36,0xff0d8c0a,0xfe54e650,0xfebb4854,0x0042a36f,0x005f915d,0x00532edc,0x0032deea,0x00201ca9,0x001e1963,0x0024541c,0x006399ef,0x006544f9,0x0029a3d0, -0x000b488e,0xfff59386,0x000ed1bc,0x0016cfa2,0x002a0bd6,0xffe3e3ff,0xff8597f9,0xff766636,0xff4b0c5f,0xffb091ca,0xffd74aa2,0xffe35150,0xfff204d0,0x001606d0,0x006a0848,0xff9a73f4,0xff69a292,0xffa53278,0xffe2176a,0x00172007,0x0052533e,0xffdf1730,0x00aae5bf,0x010194b8,0x012bd396, -0x00dd468c,0x0059287c,0x001b0db4,0x00362ec8,0x004359c7,0x003d6d5d,0x00308cd4,0x00104c49,0x000b2790,0x000d8055,0x00221d30,0x00172afb,0xfff2c9ce,0x00016e88,0xffd9865e,0xffc6654d,0xffb55376,0xffbe9f9e,0xffdda8a4,0xffd4010b,0xffc105b7,0xff91f063,0xff65c14d,0xff3e5ef2,0xff2a9e31, -0xff4980a3,0xfeeefd8e,0xfe9cc01e,0xfe3542f6,0xff00537c,0xff5b55e3,0xff1da628,0x0028ee7d,0xff14b791,0xff9445a7,0xff6f0097,0xff7f4bf3,0xfff99fab,0xffe353a1,0xffeab0a3,0xfff4b02f,0xfffa1558,0x0008fee4,0x000da9a4,0x000de4e9,0x0003718c,0xffec0616,0xffe4391b,0xffdd268e,0xffd8b408, -0xffeb8228,0x000e675a,0xfff858d5,0xffc3448a,0xffb59207,0xffae15ff,0xffc0ed51,0xffc97ab2,0xffcea5f5,0xffc32809,0xffe9e89d,0x0023ef41,0x0045d353,0x0050517c,0x00075873,0xff8ce445,0xff0c2bba,0xfe861dd8,0xfef6d5f8,0xfee50676,0xffc948dc,0x004aa0bb,0xffef8caf,0xffd94fed,0xffe84a93, -0xffea487c,0xffdd3c86,0xffe1498c,0xffd75fdc,0xffcc9300,0xffc2375e,0xffc56f09,0xffcf9318,0xffdfad3e,0xfff019cb,0x00099293,0xffeedfd1,0xfffc7471,0xffe826c4,0x0007b394,0x001c40d2,0x0004b2ef,0xfffbcebf,0xffdd222c,0xffb05636,0xffa5df5e,0xff8391d3,0xff397c6e,0xff582062,0xff49d8dc, -0xff0a15da,0xfeedbe08,0xfee1ca82,0xfee5371e,0xfeda9d2c,0xff76c85b,0xff852c3e,0xffe075c5,0xff8d5d3e,0xff5f5bae,0xff3a592c,0xff36e432,0xff5336f3,0xff5fc338,0xff79eb1f,0xff8aaa5b,0xff9fac4f,0xffa6be76,0xffaa5012,0xffbea163,0xffd3780f,0xfff708ec,0x000ff7ed,0x001833a2,0x00167484, -0xfff70e25,0xffd7fef3,0xffc8f539,0xffb89b50,0xffc1cd39,0xffe816d3,0xffe70869,0xfff1b45b,0x00010d37,0xffe1c1ac,0xffb56f5b,0xff7a1845,0xff97d3cb,0xff9ded24,0xff9d5341,0xff98f1df,0xffab0bdc,0xffc4522f,0xffcb1b46,0xffbfa6da,0xffdef255,0xffc2e537,0xffab20f7,0xff8cdf96,0xff90a6e6, -0xff7e58d8,0xff79f151,0xff7528fa,0xff928bb6,0xff8b06e8,0xffc25a11,0xffe10502,0x0011ecc0,0x000716f3,0x0004b573,0xfff497fe,0xffe90b8a,0xfff1ab76,0xfff1d9e8,0xffedf9b3,0xffe5b770,0xffe05ddf,0xffc89b90,0xffb4daf4,0xffa484a9,0xff8a3009,0xff7af3ff,0xff638760,0xff7afb10,0xff8c03bc, -0xff9b1cb0,0xffa74bf9,0xffa7b434,0xffa28c38,0xffe0d454,0xffa38909,0xffac00fc,0xffb0fbf7,0xffa23c9f,0xffa32f9a,0xff9f18fd,0xff9d8c63,0xffaf3f05,0xffa19ddb,0xffa6d7ad,0xffa763d0,0xffc13953,0xffc1f4bd,0xffb2888d,0xffc3af7b,0xffee9807,0xffd89fc3,0xffe6e4cb,0xffe2af1d,0xffe38bf3, -0xffe5268b,0xffe7707b,0xffeb61f7,0xffdd883d,0xffcec817,0xffbe36b3,0xffb00c97,0xff9f49ee,0xff898aeb,0xff90f985,0xff939bea,0xff992174,0xff9ee8dc,0xffaa0006,0xffa22dea,0xffb1af77,0xffdc684d,0x0020c75b,0xffa12094,0xffd681db,0x0014d975,0x001955c6,0x001ddab5,0x00206e4d,0x00288e0f, -0x002ee73f,0x0033d809,0xffd7e3ec,0xffa6b5d0,0x00346d7c,0xffe31b65,0xffbd4048,0xffb9f820,0xffbfbd7e,0xffbd6496,0xffbf7717,0xffbf69d6,0xffbf6de2,0xffc20c23,0xffb8c7f3,0xffb2c475,0xffaca356,0xffa5b45a,0xffa04484,0xff982edc,0xff9e0db4,0xffa0975a,0xffa37411,0xffa454c3,0xff9ab1eb, -0x0045d18f,0x0038bed6,0x006ead29,0x000b48c1,0xffada606,0xff522189,0x003193f0,0xffc30e3a,0xff608062,0xff63e5eb,0xff65ba4f,0xff6eef5e,0xff5f6398,0xff5c61bf,0xff61446c,0xffb6ab9b,0x00185b83,0xff45b2b3,0xffabdca9,0xfffe7f01,0x0062b4f4,0x00413951,0x004b056c,0x0046757a,0x00421192, -0x003f74ca,0x003b3595,0x00432152,0x00466d82,0x00499e18,0x004a1ef6,0x004bc5cb,0x00531885,0x00453631,0x003df1c3,0x003274c5,0x003c3ab3,0x003b8583,0x0061ddd5,0xff9e4e98,0x003d7bc9,0xffea2318,0x00062abd,0x00339d22,0x000efecb,0x00467b54,0x0043ddb3,0x00217525,0x003b4c42,0x0033b979, -0x0036a18c,0xffefe3fe,0xfff238c1,0xfffbca2b,0x00092bbb,0xff9b0f9e,0x004c3a08,0x005ec721,0x005ae0d7,0x0054aa15,0x0047a996,0x0042d902,0x003da82f,0x005558d0,0x00613aae,0x0062b7db,0x0061c1ca,0x005ef4b8,0x0066d838,0x0045db66,0x0032b313,0x001b2aa1,0x002ab524,0x0047ff03,0x007a4e16, -0x002846fb,0x0033f2a7,0xffe078c8,0x001e72c1,0x0025c409,0x00082a64,0x0026e4a5,0x004f6f52,0x0028217d,0x00532c2a,0x0010c38c,0x0047becd,0xffe75239,0xfff121c3,0xffe6db37,0xfff00306,0xffecb355,0x003746b7,0x00839fd2,0x006ea31e,0x00643aa9,0x00472ac5,0x003a0a10,0x0029c7a3,0x0055a983, -0x006b6046,0x0078839a,0x007d7758,0x007d85e6,0x009a9deb,0x004bf0ae,0x0025eb08,0x00083b0d,0x0018008a,0x0035a281,0x005d62ab,0x000ebbed,0x00234afb,0xffed0809,0x005f8c98,0x006b680f,0x001db1d8,0x00535cc6,0x00508ea7,0x00563389,0x006d8162,0x00711358,0x005c3ed9,0x001080ab,0xfff67bdb, -0xffc08a79,0xfff58c4f,0xffd369a1,0x003786a3,0x009c43dc,0x0086721a,0x0073bca2,0x00463935,0x00373409,0x00323ae2,0x0080d542,0x00b2a541,0x00b41bdf,0x00a33d55,0x0090f230,0x00a83105,0x00321d77,0xfffab25f,0xffde116b,0xfff04578,0x00cbca0c,0x00be9b90,0x00c8bd73,0x00c2d4bc,0x001235a8, -0xff7eaf29,0xff863943,0xffed96ae,0x00081938,0x004bf7a4,0x00c08198,0x003981df,0x0001431a,0x0012f3cf,0x000f9339,0x003313b0,0x002140d1,0x0061cee4,0x00342430,0x005f56ed,0x00c050f3,0x0090ec89,0x009bb3f2,0x0079a09a,0x00554d27,0xfffd5a82,0xfff8bbf3,0xfff6cd39,0x00108b22,0x009ad3bf, -0x00d98676,0x00920ea2,0x00d04cb0,0x0099a890,0xfffd7e40,0x00481060,0xffcf4718,0xff8308a7,0xfea1a39c,0xff065b9e,0x006b63f7,0x0088b677,0x0079ce0b,0x00419e4f,0x0027b9f8,0x00236f00,0x00234ad7,0x005d39a3,0x0063e24b,0x003c368d,0x002d4291,0x001b4850,0x0026ba80,0x0028d880,0xfff8a7b5, -0x001a6ad2,0x00600d93,0x00731dc1,0x00bdf5b5,0x00af4f46,0x007a8f39,0x00311fd7,0xfffc6374,0x001b8f43,0x009af836,0xffdd9894,0xffaaea1d,0xffcc3f63,0x00294125,0x0062ae49,0x007dcd19,0x001f93b4,0x00d9f733,0x0124775a,0x00fb23d3,0x00d4fc0c,0x002c7cc7,0x000cee11,0x0020aaaa,0x0061dbb2, -0x004e2117,0x00422268,0x00180e60,0x001a10ab,0x00170331,0x001c477b,0x0025d368,0x002590f7,0x00026b2e,0x0015f469,0xfff5edb6,0x00089372,0x002a475f,0x0005c83e,0x00092a93,0x00a34dd8,0x01118cca,0x0144bbbe,0x013bdf42,0x00e2518a,0x0053981b,0x006b30a5,0x00b55721,0x00c7c7ab,0x01bd14a6, -0x01b15494,0x00f1d2a4,0x00bc6994,0x001d5682,0xff835de3,0xff69007f,0xffb9ca6f,0xfff3e476,0x00126346,0xfffb4679,0x000d8c71,0xfffb8229,0x000211a0,0x000ab492,0x0009d5c1,0xfffdbb9a,0xfff6f528,0xfff044df,0xffe00be9,0xffe9c480,0x00099272,0xfff1b665,0x00118e22,0x0049f01d,0x006f5c32, -0x008aa44a,0x00899314,0x0063ce6d,0x003aa276,0x0037e6c0,0x0059e7f2,0x0075e9d4,0x009eb134,0x00b76a41,0x009bb59c,0x01052896,0x0139de78,0x016ee600,0x00978d2a,0x00fd6a82,0x0071cc01,0xffb01567,0xfff66ec8,0x0009abfb,0xfff3d2b6,0x0003f2e2,0x0003f9ac,0xffecd95a,0xfffc27f0,0xffe79754, -0xffd2fa21,0xffcf2316,0xffe09a82,0xffe162e6,0xfff196b8,0x001906a0,0x000d3051,0xfff2ab6f,0x002218d2,0x002e0b39,0x001e7eee,0x0027240d,0x001cf774,0x002adcc5,0x0046e309,0x0051e22e,0x005135f1,0x004df509,0x005f5cb9,0x0081d911,0x00b6d5e4,0x00bd9292,0x00b6e048,0x00d7dcce,0x00ca6d9e, -0x0040ffe6,0xfff8b935,0xff726afd,0xff8533bc,0xff426a5c,0xff46603d,0xff5a4664,0xff6cca0b,0xff870adb,0xff9395aa,0xffa72e36,0xffb30099,0xffc03c13,0xffc001a0,0xffd29374,0xffe42bd6,0x00058a31,0x0013df10,0x00228f81,0x001298ee,0x00318c43,0x003cedf7,0x003ab95d,0x002e8837,0x003260c9, -0x004b600a,0x0041c342,0x0030ae7d,0x0011d003,0x0017f404,0x0038d21a,0x008d759e,0x007572b1,0x00653356,0x005219f4,0x003e8a12,0x00315716,0x00135886,0xffe7ac25,0xfff881f6,0xffe09510,0xffd0a6ac,0xffb153ac,0xff99df8a,0xff831efe,0xff8e98f0,0xff725b32,0xff959c94,0xff7f7e95,0xff960c4d, -0xffb6fd5c,0xffe81afb,0x00087140,0x00096d1e,0x0007ea85,0x002ed901,0x00370ecd,0x00209bbd,0x001b2a7b,0x0012f1b5,0x000a3368,0xfffd7f35,0x000df030,0x001f4ce5,0x002f0d2a,0x0031b614,0x002d1f0d,0x002d1902,0x0027f42d,0x002adfb3,0x002f6fb7,0x0024d72c,0xfff390e5,0xfff1a140,0xff940b1d, -0xffdf0193,0xffbf59b6,0xffbe94ef,0xffdc1f96,0xffd61b7a,0xfff071e1,0xfff10983,0xffdd4b90,0xfff30339,0xfff66eb1,0xffee0c59,0xffdb1e2b,0xffdc3191,0xffefa4c9,0xfff17262,0xffd397d7,0xfffae187,0xffee3c66,0xfff3e156,0xfff543dc,0xfff55601,0xfff734a7,0xfff5d905,0x000178c0,0x0008a403, -0x001236f7,0x001b4d1b,0x00266964,0x002fcd16,0x0025832c,0x0017550f,0x000a1172,0xfffe3376,0xfffcad9c,0x000918ed,0xffdcb153,0xffadf07b,0xff7d5477,0xfff472c6,0xffb4be26,0xff7fa1ef,0xff7871d0,0xff751e8b,0xff79cf6c,0xff6ebcfa,0xff69fb0b,0xff6995f1,0xffb32573,0xffeffa1a,0xff7aa98b, -0xffb96f27,0xffe80e29,0x000723f8,0xfffdedde,0x00010f37,0xffffbae5,0x00005593,0x0000c61f,0x00007c84,0x00037a0a,0x0005bdab,0x0007d90f,0x000a59e0,0x000c62d4,0x0011fb09,0x000b3e1d,0x00092abb,0x0006aba2,0x0004c247,0xfffe44fe,0xffb67bfa,0xffc1daee,0xff9e3b95,0x001cc740,0x006a9970, -0x007d2dbf,0xffef4145,0x0056ac04,0x008167be,0x00915762,0x009174ed,0x007f1661,0x008c5755,0x008b34e1,0x008ab416,0x0052cb4b,0xfff53423,0x007f1fb8,0x0055ec60,0x00160ed7,0xff9f0335,0xffc208a0,0xffb711d2,0xffb12b41,0xffacb7d2,0xffac0134,0xffad8e61,0xffb5bf19,0xffb70304,0xffb45288, -0xffb27479,0xffb25ad6,0xffb6bc25,0xffb110b7,0xffb2cb27,0xffbddf9a,0xffb7be5c,0xffb1990a,0xffc09899,0x0078ba6e,0xffd32d59,0xffff88b8,0x001dca5c,0xfffd3c7d,0xfff52076,0xffe580c3,0xfff6ccc7,0x00226303,0xfff60ba9,0xffeee9db,0x0008c693,0x00046c92,0xffead7aa,0xffe8815b,0xffdb7df1, -0x0053933c,0xffc6fbcc,0xffb2588a,0xffb1304b,0xff95378c,0xff861c1b,0xff833658,0xff8ebedd,0xffacc9b2,0xffb8d56b,0xffad696c,0xffa5847a,0xffa18aef,0xffacb8ef,0xffa3c98e,0xffa97735,0xffbf964a,0xffb78170,0xffa4e59f,0xffe9b641,0x00427deb,0x0015acb2,0x0002b09d,0x00200268,0x0027553a, -0xfff957a0,0x0043279c,0x0022eb97,0x0047b7ff,0xfff77a73,0x002c776d,0x001cfbb1,0x0009ace4,0xffda035e,0xffdc9353,0xffe6a9eb,0x001291f5,0xffec2d7b,0xffac72dd,0xffaf8a4e,0xff7fce34,0xff64d80e,0xff5efc70,0xff72ea93,0xffa00af6,0xffadca12,0xff98c4e0,0xff91d6aa,0xff8aae8b,0xffa12ff3, -0xff8cdba9,0xff946b57,0xffbe1111,0xffaf736e,0xff98851c,0xfff70aeb,0x00348470,0xffe72e03,0xffc9b0ee,0x0042a01f,0x00532c04,0x0015fef4,0x0041258d,0x004d9210,0x003c91a2,0x00642ce3,0x0052662f,0x003b6462,0xffec70b3,0xffb8800c,0xffe1aee6,0xffb8cbb1,0x000ffe45,0xfff03322,0xffad013d, -0xffa57d43,0xff4d814c,0xff1caa0b,0xff16ab80,0xff466eaf,0xffaadef5,0xffd98901,0xffaae668,0xff8d24a6,0xff80fe3c,0xff9e5b3a,0xff8f655f,0xffa45e18,0xffd49feb,0xffc99873,0xff6e27b0,0x005a660a,0x0130f15c,0x00fab7d5,0x006a009b,0xffb17b2f,0xff73c300,0xffdc54cf,0xfffc1965,0x003702b8, -0x00a6a876,0x00301422,0xfffb7eee,0x000e07d6,0x000ffc58,0x0014da4b,0x001ffe77,0x000a09d2,0x00560325,0x003133c3,0xffabda42,0xffc74f24,0xff9d8bf4,0xfff16599,0xffcbb57b,0xff642153,0xff0b1764,0xfedccf44,0xfef172d0,0xff641f29,0xff8c787e,0xff5a5356,0xff96ade8,0xff6be7e9,0xff0341de, -0xff4cec1a,0xff02e6d3,0xff10d808,0xfec638c4,0xfee92a24,0xffed61be,0x0074fb45,0x0075bd19,0x004300fc,0x001664ce,0x00142191,0x00140b9a,0x004bf313,0x0057ef17,0x002f0900,0x000bf30a,0xfffd66fc,0x0025899e,0x0023c9c0,0x003a881d,0xfffb00ad,0xffb79653,0xffc6bac1,0xff945f78,0xffd288ef, -0xffea019d,0x0006a529,0x00047935,0x00229271,0x006c397b,0xffa3ffa0,0xff8b0d18,0xfff6effb,0x00240624,0x00590782,0x009406cc,0xffd3cc0d,0x009487af,0x0101f920,0x011b66f6,0x00bdbf54,0x0042415a,0xffe27e2b,0x001aea12,0x00605b5c,0x004e5d2c,0x003354d9,0x000c9f38,0x00061c59,0x00042598, -0x000f9290,0x002528ad,0x000bc4ad,0x000ef403,0xffe5c8d9,0xfff06b3a,0xffd4b0fe,0xffb94f46,0xffe2390a,0xffd84855,0xffea0c21,0xffdb9c68,0xffd280e3,0xffa3f265,0xff6b6877,0xff392a21,0xff20cf5a,0xff2588eb,0xff2295d0,0x0002cc1f,0x00232116,0xff8acab0,0x0025db56,0xff67bb32,0xff93cea2, -0xff76a619,0xff8b7dec,0x00009241,0xffef71ae,0xfff307fe,0xfff9d0f0,0xfff087e0,0xfff76e69,0x00039d04,0xfff58e0f,0xffee443a,0xfff25d31,0xffe0507a,0xffdac1ad,0xffd7a605,0xffeb86d1,0x001a2292,0xffe67474,0xffbe6af2,0xffcfadfb,0xffd2a8af,0xfff2f8c2,0xfffd3e99,0x001c2f57,0x00277152, -0x0054de8b,0x0074aaca,0x00ac9a2f,0x008a4208,0xffd2091a,0xffd0d28f,0xffa8d1e4,0xff771cff,0xff9cf114,0xffd5bed9,0x00773f09,0x00a3d20d,0x0041c70e,0x0028c514,0x0029d795,0x0016d857,0x000b4c00,0x0006a1a8,0xfff03ab4,0xfff13cbc,0xffce5c3d,0xffc8b19b,0xffdab023,0xffdc7f1b,0xffee8f26, -0x000472ac,0x0001eb97,0x0024f0ce,0xfffa7f85,0x000fa524,0x00269557,0x000f80a7,0x00100fc1,0xffff8cc2,0xffebe051,0xffe8cbad,0xffd62231,0xffb0a783,0xffc0d81d,0xffd01fef,0xffd91515,0xffbeca04,0xffafa0a7,0xffa8bb7a,0xffcedd3f,0xff9fcb91,0xffcad5d0,0xffe7fcd3,0xff9c1de0,0xff73a94f, -0xff553af6,0xff4c95ab,0xff78b17b,0xff743436,0xff854504,0xff90d086,0xffb09f5c,0xffb9a846,0xffba0e18,0xffbf285a,0xffd173bf,0xffef2333,0x00146b57,0x001c1d5d,0x00169038,0xfffb1567,0xffec8290,0xffee34d8,0xffe294f6,0xffee8de3,0x0005ce95,0x00038241,0x00025b49,0xfffc95a0,0xffe9042c, -0xffc60086,0xff9e207b,0xffa961a1,0xffb4f5ed,0xffaf2f8d,0xffc1f219,0xffcd7973,0xffee9b47,0x0007401b,0xffe8cd05,0xfffb90b6,0xffd7b0a9,0xffb6282a,0xff8d95c2,0xff98d7b6,0xff86beb9,0xff9176cb,0xff7e45a9,0xff98cfec,0xff933ed7,0xffc21e53,0xffdbd79c,0x00021d05,0x000562fc,0x00190c8e, -0x000a793e,0xfff27414,0xfffe950d,0xfffaf27c,0xfff68f59,0xffec1d8c,0xffe2b2de,0xffde6e3c,0xffde2a18,0xffdf7dc1,0xffd16799,0xffcaf9a1,0xffbd2bff,0xffcc49fb,0xffd47af8,0xffd76b58,0xffdc7516,0xffc23297,0xffc5c011,0x00001bcc,0xffc43ba5,0xffd9989a,0xffd97753,0xffcbd97c,0xffd19837, -0xffc65b92,0xffcc3651,0xffe4e0af,0xffd36ea6,0xffcce35d,0xffd09d18,0xffe02ce1,0xffd48e63,0xffcc0550,0xffcccc5d,0xfff3b9e6,0xffcff494,0xffd7ec3f,0xffd90b84,0xffd95a30,0xffdcac9d,0xffe066de,0xffe4b52f,0xffd680a5,0xffc8d4dc,0xffbe3e3c,0xffb654b2,0xffae091f,0xffa37eea,0xffa87e10, -0xffada95c,0xffb48e6f,0xffbd4836,0xffbde150,0xffb3e7b7,0xffe7f7e9,0x000e465c,0x001e1937,0xffd49122,0x0008e4c9,0x002113c5,0x00243c3c,0x00253e79,0x001e1566,0x00271c33,0x002bc96e,0x002af69f,0x00091093,0xffd59a14,0x002ac7a7,0x000bfd2f,0xffe3faad,0xffb72c24,0xffc340f7,0xffc07561, -0xffc1e24a,0xffc1d275,0xffc174b1,0xffc3ab7e,0xffbe850c,0xffbc03bc,0xffb82e0c,0xffb44731,0xffb140e5,0xffad11cd,0xffb266f6,0xffb4e35e,0xffb6d414,0xffb89d54,0xffaba5f5,0x000adfdc,0x0006ff59,0x0030a7d0,0xffb4616a,0xff832d00,0xff95bea5,0xffd314d0,0xff8fddbf,0xff8b3825,0xff90348e, -0xff941656,0xffa753a3,0xff94a724,0xff946f5b,0xffa3e7dc,0xff86f829,0xffbe670c,0xff9436eb,0xff83a35d,0xffab5df3,0x0027e0b6,0x000a01c2,0x000c6113,0x0008e187,0x00051154,0x0003be96,0x00016024,0x000b5eb2,0x000e3cab,0x000e2e1e,0x000add29,0x00099714,0x000e5584,0x00006fd2,0xfffd50d9, -0x0000bb58,0x0004ec4c,0x000cb635,0x000c0311,0xff9043c5,0xfffccf7c,0xffb4cef7,0xffdf79e0,0x00021094,0xffeae359,0x001583d3,0x000533ec,0xffe70ddc,0xfff27cd2,0xfffa9b69,0xfffda71e,0xffcf59c4,0xffd0877d,0xffbed2c8,0xffdc8652,0xff96392e,0x0002053f,0x0017c602,0x00028c05,0xffff5786, -0xfff4ca9e,0xfff8371e,0xfffa602c,0x001a61f9,0x00230904,0x00174602,0x000b5ed5,0xfffeaa89,0x00034ce7,0xffe1b52f,0xffde9985,0xffee0045,0xfff2cc93,0x001a9b81,0x0024aac1,0xffdd7fde,0xfffc98fb,0xffbaca81,0xfff9d8b9,0x0005495a,0xfff18dc8,0x000f5909,0x0040effe,0x000bd3cf,0x002f14e8, -0xffeed27a,0x0029d2d4,0xffc8ea91,0xffceda2f,0xffc90ee2,0xffcde56e,0xffbcdaae,0xfffc3e6d,0x002baec7,0x0005f7f1,0xfff8b201,0xffde2465,0xffdc7169,0xffd4b05d,0x0012234b,0x00247a96,0x001c6e6f,0x000dcbd9,0xfff9f5da,0x000ea1cd,0xffbf4e14,0xffb9fdf3,0xffe4aac2,0xffdf9e64,0x001a186d, -0x000e81b7,0xffd650be,0xffebea82,0xffbf65d4,0x003650a1,0x00619237,0x00279733,0x00598463,0x00577419,0x005fae8a,0x0056d2b6,0x0052ba33,0x005b8726,0xfffa5071,0xffe3381e,0xffb35b3c,0xffe5f503,0xffbd827c,0x000a440d,0x00314617,0xfff2dc2d,0xffd57a28,0xffb0121d,0xffb84584,0xffca7d92, -0x003a1de6,0x006602a6,0x00419320,0x000d5401,0xffdc9424,0xffe736aa,0xff7dc4bd,0xff881d5f,0xffd3e504,0xffce9b16,0x00523dcd,0x0036e6ec,0x0065bca5,0x0093c684,0x0023c7d4,0xff7c6ea3,0xff6169bb,0xffbd7b2f,0xfff12c1c,0x002c7529,0x008c5fc5,0x0034e941,0x0005d750,0xfff8d2ad,0x000caf2e, -0x002b4d42,0xfffda8f8,0x0029a74a,0xfff493ae,0x000e967d,0x0057684f,0x004af9c5,0x0078ea2d,0x005019b1,0x0032288c,0xfff90108,0xffe075ef,0xffd9ce59,0xfffe9987,0x0053ff13,0x006046b1,0x0011597c,0x00169a87,0xffe34c8d,0xff9eb395,0xffd397e2,0xffc6b5b7,0xff636cb1,0xfe92db56,0xfeeda540, -0xffc152ca,0x006d3fc2,0x009a1c9d,0x004f8b1c,0x001a46df,0x000b7a28,0x000ee73b,0x004304d7,0x00511a64,0x00423ce1,0x0023eed1,0x0008bfd7,0x000bf40e,0x001da2b4,0xfff4557f,0xfff99f4a,0x00148050,0xfff59662,0x00013598,0x001d33d4,0x00199487,0x000009a2,0xfff0009a,0x0015cc71,0x007e8082, -0xffc43dd9,0xff904fc2,0xffd063ac,0xffd9526d,0x0027fbe3,0x00ba705c,0x00095efa,0x008a0a01,0x010258c8,0x00cdfcf2,0x00ac301e,0x000089bf,0xffcb8716,0xffe88744,0x0062b0fa,0x004cee24,0x004195ea,0x000c9ab4,0x000db436,0x0009a82e,0x000b1e5f,0x0020e47b,0x0023a5c7,0xfff29291,0xfffd23cb, -0xffd01743,0xffee53f7,0x001d0b26,0xfffc4b28,0x00085f90,0x0060653e,0x0090ddc6,0x009af45d,0x009733e6,0x0064df3f,0xfffcfd6e,0x003ec080,0x0059678d,0x0006d8f2,0x007270fd,0x003c3093,0xffa0469a,0x000ee4e9,0xff83fdb8,0xff6afd50,0xff6c7535,0xffa82e7e,0xfff1402b,0x000753ad,0x00054dc4, -0x000c9013,0xfff4fea8,0xfff46ab8,0xfffaafa0,0xffef8919,0xffe8da5e,0xfff1406e,0xffe0474a,0xffccb12a,0xffd3ce4e,0xfff53c9a,0xffd9016a,0xffe901ba,0x000edf7c,0x0014dd66,0x0024ad1e,0x0021ec5d,0x00152743,0x002242f6,0x002177bc,0x00324049,0x002557a7,0x00685dbb,0x006002d4,0x001a516f, -0xffede494,0xffe0caad,0xffe83ca3,0xff9b9f51,0x003c88cf,0x000e9fca,0xffdf8487,0x00078fb9,0x00141e0f,0x000cb6e8,0x0012be20,0x00059631,0xffefbfca,0xfffd5d41,0xfff76d16,0xffdccebb,0xffd0d482,0xffd9738a,0xffda5584,0xffec730e,0x000b2fd4,0xfffbc848,0xffe075f7,0x0008932d,0x0022de3d, -0x001be6fd,0x0023fe0f,0x000dbc1b,0xfffdd1f2,0xffe8e659,0xffdcfb8b,0xffc9a561,0xffb6344b,0xfff4df69,0x002227a0,0x0065fe68,0x00288633,0x0005e4df,0x0025ff6f,0x00147e8d,0xffd1cac7,0xff96ed06,0xff5ca658,0xff53ced8,0xff383be6,0xff39caa2,0xff5e7315,0xff7f9bd1,0xff8f15b1,0xff9a0c13, -0xffb026da,0xffb91866,0xffc75e65,0xffca6c4d,0xffc5e964,0xffc5902f,0xffd79e09,0x00051a33,0x0020d224,0x001963f1,0x002a8c2e,0x0029f79d,0x002aea40,0x00031c47,0x0000042a,0x000ffb8e,0x00202476,0x002fa13f,0x002b4a5b,0x002594ac,0x00215409,0x002f08d2,0x002d2d45,0x001ab82f,0xfff7760d, -0xffda8cdc,0x001b21bd,0x00006ba2,0xffcb741a,0xffd0bda7,0xffbb0def,0xffb29358,0xff9d81c8,0xff8ac33f,0xff7e3ddb,0xff908134,0xff734f9a,0xff9d0601,0xff8afc2e,0xffa3fa9a,0xffb5dc52,0xffda32fa,0xffe91204,0xfff0b51a,0xffec52d4,0x001b6e92,0x002fc8a9,0x001f635f,0x0025458f,0x001c016d, -0x001458fd,0x0006b490,0x000a3ef4,0x000a5910,0x000c41f4,0x000cf0ce,0x000fc3a5,0x00123fa2,0x001129b9,0x0011ead9,0x001b97b8,0x00102be8,0xffe63233,0xffe10f8e,0xffb0593f,0xffdff249,0xffc5e49d,0xffc99721,0xffdc9d6e,0xffda355b,0xffe8f14e,0xffdec204,0xffc78d16,0xffd52cc0,0xffdc5f3e, -0xffcf1fc5,0xffc603b7,0xffcfbb80,0xffd5cf0f,0xffe6be6b,0xffcc4c45,0xfffeb777,0xfffa5903,0xfff92650,0xfff9e01b,0xfff8e57b,0xfffa7f88,0xfffb4d26,0x000121a8,0x000243b4,0x0001822f,0xfffef800,0xfffa7008,0xfff525ed,0xfff3b0c8,0xffeee1bd,0xffea4bf1,0xffe50ff8,0xfff17235,0xfffdf906, -0xffbb92db,0xff9f094b,0xffa668dd,0xffcd398c,0xffa0b925,0xff9c1b62,0xff96672c,0xff94922f,0xff9d1a86,0xff922538,0xff8e81c9,0xff8fefb7,0xff9635bc,0xffc5ca85,0xff9b1803,0xffa06686,0xffc2a1a4,0x00029a71,0xfff4b86e,0xfff7c75f,0xfff78e95,0xfff8279e,0xfff895cc,0xfff8dd76,0xfff74f27, -0xfff64d3b,0xfff5bbf9,0xfff52b18,0xfff4f32a,0xfff3f245,0xfff3430d,0xfff33272,0xfff3ab6d,0xfff3d186,0xffec0fea,0x00012cf8,0xfffee9e3,0xfff2e3d3,0x005367c7,0x005b7395,0x000379bb,0x003f55bc,0x0055ded4,0x0020af47,0x0029acd3,0x0028efc9,0x0018fbba,0x001a966b,0x0017035f,0x0014f8e7, -0x00501af5,0x003ceb0f,0xfffcdbd6,0x004a15b1,0x0049bc42,0xfff4239e,0x000188e4,0x0000bb56,0xfffccb7b,0xfffa7972,0xfffb7de0,0xfffe5eb6,0x00067278,0x0007eb2d,0x00047e98,0x0004ef3d,0x000585bf,0x0007e9d1,0x0005cff0,0x00035273,0xfffe4a16,0xfffe46ad,0xfff12f8d,0x0014f14f,0x004a95a3, -0x001596e7,0x0018840a,0x00299e35,0x0026d105,0x001c6778,0x001d689e,0x00323a89,0x004ec5e5,0x002dea89,0x001ab48c,0x00370d85,0x0014556e,0x0003f06d,0x0013b650,0x00049306,0x002a4d32,0x00177627,0xfffdbfec,0x0007a409,0xfff81e01,0xffee5763,0xffef175e,0xfffae295,0x0017c180,0x00223445, -0x00161051,0x0011d381,0x000f57b8,0x0014f1b8,0x00155acc,0x000effe1,0xfffcdd92,0xfffd6d66,0xffe4f865,0x0020bca8,0x0061a6ab,0x003df4d4,0x000497f9,0x002a1459,0x002d8641,0x0011f50e,0x0047bb1a,0x0032b34f,0x005b496e,0x000df415,0x0022190e,0x003a115c,0x000f8f4f,0xfff79da6,0xffee04f7, -0xfffd03af,0x00252101,0x00201dc1,0xfffe986c,0x0008541a,0xfff44c7f,0xffe392c4,0xffe7d7cc,0xfffca8b5,0x002b034f,0x0039b503,0x00228f42,0x00266fd5,0x0023a537,0x0029fe85,0x0028761e,0x0012a2ec,0xfff213d9,0xfff596ef,0xffce3986,0x00188a02,0x00482905,0x000f19d3,0xffcd7061,0x00409e1d, -0x00567181,0x001f7ea8,0x004cc5c6,0x005a0aee,0x004663d9,0x00474298,0x0040f73a,0x00418c40,0xffedb604,0xffcb6966,0xffe4baa6,0xffd709a4,0x00139ee1,0x0020065a,0x0003df17,0x0011ad68,0xffede5c9,0xffd1e559,0xffdab7c1,0x0000fdf2,0x0062ccde,0x00847747,0x004ea803,0x0042e1f3,0x00364619, -0x003c43df,0x0046c9d7,0x0032b406,0xfff237b1,0xfff6014c,0xfffc7695,0x00849685,0x01236b0e,0x01010492,0x0075312a,0xffc11055,0xff79e3e9,0xffc878bc,0xfffa2c88,0x002b2e80,0x006e398c,0x0034db37,0x000a3a3a,0xfff98231,0x001a2f2a,0x002623eb,0x0012de00,0x001bb1fb,0x004e68a9,0x00552c72, -0x000fb784,0x000934dd,0xffe0514d,0x00095952,0xffdd6497,0xff7a7105,0xff543840,0xff551842,0xffaba4f3,0x000a0948,0x004251f4,0x005809a2,0x0039f6b3,0xffeb3618,0xff93f2bd,0xffd3c964,0xff33f9f5,0xff5f823b,0xff265921,0xff217ab3,0xffa7ef03,0x007c1fd3,0x009ea116,0x005e488e,0x00124cc0, -0x00042759,0x00036122,0x0032cc42,0x00484cf3,0x0038aa9e,0x001dff41,0x0011dc30,0x003025f1,0x0022be60,0x00247ff1,0x001d5239,0x001a893f,0x003b69f4,0x0031aaa0,0x002b38cc,0x001eae5d,0x0021bda2,0x0016269d,0x002a7b1c,0x0061c374,0xffc8055e,0xffc1891c,0x0040909c,0x00556535,0x008e59af, -0x00d7176c,0xfff2735d,0x007a647f,0x010e568c,0x00cc73eb,0x0079880c,0x00134d6a,0xffb3f82b,0xffedb11e,0x005e048b,0x0054848b,0x003a4714,0x000a68db,0x00056bf2,0xffff4cad,0x00048b63,0x002d04cc,0x0028a75c,0x0011fb65,0x0004e55f,0x0018d0be,0x00062b57,0xffdb11dd,0xfff0ee8e,0xfffb8b3b, -0x004941f5,0x0079bbc8,0x0094d0b3,0x00779ca7,0x002815ac,0xffb49730,0xffd78390,0x0039ac9f,0x00b97b77,0x00ff0a5b,0x00bd3af1,0x0028705d,0x001cf068,0xffec8439,0xff891df0,0xff917e00,0xffbd569c,0xfff80ada,0x000d012d,0x000933b8,0x0008b0cf,0xfff73538,0xfff0a3b4,0xfffc8b4b,0xffe9036f, -0xffe327b3,0xfff932e0,0xffdf71c8,0xffd8d5ec,0xffdebf25,0xffec8877,0x0003025e,0xffe112b6,0xffeac99f,0x0013a71f,0x0029ab1e,0x003e097e,0x0040e98b,0x0060232c,0x00872dc3,0x00a857e0,0x00a3581d,0x00dcdb22,0x00a9bb68,0x0006768b,0x005dbffd,0x0094d78b,0x00c6b322,0x006cd05f,0x0106f342, -0x00e7e7c7,0x0085c18a,0x005acecd,0x004b3879,0x003c7e6b,0x0026f0a8,0x002336c9,0x0016f6de,0x000a211e,0x0013a896,0xffe8cb74,0xffd858e3,0xffe0804d,0xffdef384,0xffee4e48,0xfffac240,0x0013501f,0x00315cfd,0x0017a527,0x001ecb31,0x002480a4,0x00161d00,0x001d69d9,0x0024417f,0x0030eb93, -0x002a9aea,0x0031995f,0x004670c5,0x0055b962,0x00826590,0x00ca6ce2,0x00c50f1f,0x00c706be,0x00d5045d,0x010548c0,0xffe1a07f,0xfffdf157,0xffb51f9d,0xff99d058,0xff778ebd,0xff741587,0xff74afed,0xff9d77aa,0xff95f38e,0xff9d304c,0xffa8e268,0xffc179c6,0xffcdcbff,0xffcf27dc,0xffc8f923, -0xffd67ff0,0xffec6913,0x000d94d7,0x0017cf6c,0x00165439,0x00145df8,0x001cbd59,0x00275913,0x00264a69,0x002aad33,0x00313cfd,0x0031ccd5,0x00265661,0x000e0a4c,0x000941fe,0x00060aeb,0x0016a045,0xfffbe175,0xfff8849a,0xffeb36ae,0xfff34e3c,0x0005e679,0x0012fe00,0x001b90fd,0xfffe2ffd, -0xfff02b22,0xffd69b96,0xffb7710f,0xff97aa13,0xff9dcf6d,0xff9852b4,0xffa10f43,0xff9d45eb,0xffa6f27c,0xffb219ae,0xffc8f14a,0xffdd62f3,0xffeea137,0x00030a13,0x00254fed,0x0031970f,0x001b8b3d,0x001e7658,0x0017ca28,0x00121e7a,0x000aa470,0x0001c96b,0x00100020,0x00211528,0x00338112, -0x0033f026,0x00338182,0x00329245,0x002ce34b,0x0026fa56,0x001d691a,0x0018a2b2,0xffecd274,0xfff4476f,0xfff01a8d,0xffe9351b,0xfff34f77,0xffee2b16,0xffee3356,0xfff1bd74,0xffeecbca,0xfff943af,0x00062f17,0x000247d0,0xfff859e1,0xfffb54c5,0xfff88df2,0xffed4adf,0xfff605ee,0xffed00df, -0xfff75a1b,0xffe62ea7,0xffe0900d,0xffe60b55,0xffe515ec,0xffe7a60b,0xffe9b9cf,0xffea9b64,0xffe6512f,0xffe2174c,0xffe26a45,0xffe4d5d4,0xffe9cb81,0xffef27d6,0xffed7f62,0xffee762e,0xffee99d8,0xfff0f36c,0xfff3c6ab,0xfff1a612,0x0017fefb,0x00199b08,0xffebe2ab,0x00106276,0x0016abe5, -0xfff74931,0xfff71c76,0xfff490a1,0xffebea29,0xffee2fa9,0xffee7922,0xffea1ee4,0x00194b20,0x000f5b37,0xfff01c43,0x0017b74a,0x000fb2b5,0xffe44f1c,0xffec2c44,0xffeae48a,0xffea6b9a,0xffea1b38,0xffe9755a,0xffe9c883,0xffeae853,0xffeca487,0xffed2150,0xffee2161,0xffeea16b,0xfff06ea3, -0xfff103e6,0xfff1c6f3,0xfff1e633,0xfff35abe,0xffeea011,0xffc5dcc9,0xffcdd844,0xffd0ab4c,0xffa4043f,0xffc1379a,0x001e3d6b,0xffa16f37,0xffbb7d85,0x00093f92,0x0011227a,0x0014ec56,0x0022362c,0x00183740,0x001967ce,0x00298c57,0xffb79cdc,0xff9a17b8,0x00232670,0xffbad040,0xff9e4c52, -0xffcd85c7,0xffcae628,0xffc35aa4,0xffc00108,0xffbd34d3,0xffbd5938,0xffbe44d4,0xffc842c7,0xffca6bd1,0xffc8196a,0xffc23d42,0xffbed188,0xffbf20e4,0xffb6fc72,0xffb9001f,0xffc93bba,0xffc5a035,0xffcee2cf,0xffb8131d,0xffe0ed71,0xffc566ba,0xffb4fd68,0xffde89ad,0xffdfadaf,0xffdc6583, -0xffe31147,0xffd6a28d,0xffda3f13,0xffc4e13b,0xffd13807,0xffdae789,0xffd0cff6,0xffc735dd,0xffa64230,0xffbf805b,0xffdbf34d,0xffb925e8,0xffbfdc01,0xffa795d5,0xff9ed8d5,0xff96ce75,0xff9ee28e,0xffab2a58,0xffcca445,0xffd38a29,0xffc23ecf,0xffaeffdf,0xff9ddbed,0xff9dbff0,0xff8a9a3b, -0xff9732af,0xffc38a68,0xffbbcf90,0xffd4ea1d,0xffd249d3,0xffd03cd4,0xffe32570,0xffc49aa1,0xfff11765,0xfffb9813,0xffed7061,0x0011c053,0x0029d3ab,0x00173f49,0x000289ec,0xffefcfe1,0x000fdc81,0xffd049fa,0xffc05005,0xffba1b79,0xffbfafd0,0xffbbe17b,0xffcb3f32,0xffba6281,0xff9af7d6, -0xff81a420,0xff6e30c6,0xff75997b,0xff7f6625,0xffbf8caa,0xffcd6611,0xffb60f29,0xff9bcf19,0xff7cbbf2,0xff7f5ff0,0xff52f8cc,0xff6a4d39,0xffc55cf0,0xffaf30b4,0xffe0d9b1,0xffd216fa,0xffd78104,0xffcd184b,0xffae41c2,0x0017795a,0x004e3c47,0x002e87f3,0x0054cc36,0x005d48c1,0x0062d918, -0x00435090,0x0034a632,0x004de26a,0xffe5ad61,0xffc9e7a6,0xffbbf05e,0xffcc1690,0xffcf49fa,0xffdae15d,0xffaa0605,0xff68217a,0xff353e16,0xff1babf5,0xff32f4e9,0xff632247,0xffdcbc07,0xffff18e2,0xffc49106,0xff7f4d19,0xff449576,0xff3d2d47,0xff0f9dc1,0xff504bc2,0xffd7a5a6,0xffc0019e, -0xffa514a0,0xffd2bc77,0x004e3917,0x00869790,0x005257b7,0xffa64c5e,0xff6117db,0xffa6a14b,0xffe8485e,0x001737c7,0x004d8ce8,0x0035036b,0x0011e05c,0xffe736c6,0x0010b74e,0x001ed4f4,0xffebcd77,0xffed0b9a,0xffdf264f,0xffd543d7,0xffc7fb5e,0xffe68937,0x000d4583,0x00052fc3,0xffec57bc, -0xffc7e7b4,0xff7e4733,0xff6ec805,0xffb4c1df,0xffd6dcc4,0xffc64e8f,0xff90b094,0xff69bc25,0xff38c58e,0xff3997b3,0xff5c1af2,0xff8d860d,0xff5b7b24,0xfec54374,0xfef04ca4,0xff3a3abf,0x00458987,0x00a608cc,0x0063c24d,0x00114191,0xfff43fee,0xfff69040,0x0026348c,0x003cf903,0x003d4e6c, -0x0019638a,0xfffc6290,0x0000e966,0x000b4df9,0x0002e001,0xffe61fa3,0xffbb881d,0xff8ead21,0xff5df123,0xff9677e9,0xffbd7a87,0xffd68d8e,0xfff9ce3f,0x0019838a,0x00448caf,0xffab7fb2,0xff8c5595,0xffff6e37,0xffcc14d0,0x0020da0e,0x00ea868b,0xfff0b339,0x003b8ddc,0x00ee5e9c,0x00949913, -0x005b1047,0xffeb0d41,0xff9ff099,0xffc4ebef,0x004360d7,0x00433572,0x0039fc7b,0x00030070,0xfffd60e8,0xfff9187b,0x0001a9b5,0x001afda8,0x00193ff4,0xfff3eae2,0xffeb8c60,0xffcfd415,0xffdc715c,0xffec2b6d,0xffedcbf4,0x000532cb,0x00010dc8,0xffe7d672,0xffc8a07b,0xffbc94f6,0xffb0ec58, -0xff993906,0xffbdbd4f,0xffb6fd30,0xff8af8a3,0xff116cc7,0xfeb9c310,0xfe8a6190,0xff748b21,0xff1d7566,0xff6c3128,0xff8f3079,0xffad1de4,0xfff1d56d,0xfffe294f,0x000f4f83,0x0005f012,0xfff8f303,0xffef2a21,0xfff28fca,0xffe07b0c,0xffddf179,0xffeccf80,0xffd44f24,0xffc646ff,0xffc89124, -0xffda5d84,0xffd4eda2,0xffca64be,0xffc3cb2c,0xffb38cc8,0xffb84f95,0xffbb2f08,0xffd62992,0x00153dfd,0x002641be,0x002de24c,0x000e1c6a,0x0047cc57,0x001e8380,0xffc8bb75,0xff2372b8,0xfedb363c,0xfeae20d2,0xfef74336,0xffa87d8d,0xffee0c5c,0x0047fb01,0x00234558,0x001de281,0x001f0776, -0x00146f11,0xffffeefc,0xfff90d1c,0xfffbd9ea,0x00075436,0xffef0cd0,0xffdcadb5,0xffd30ea0,0xffd84c4a,0xffe6d820,0xfff2d311,0xfff02b85,0xffefc4ac,0xfff4573a,0x00105995,0x0017fd03,0x0011e5a6,0x00007806,0xffde5103,0xffa3136a,0xff89171a,0xff778f06,0xff621726,0xffb31d69,0xffd5fce1, -0xfff6bd7f,0xffaa61df,0xff9074db,0xffae2d00,0xffa7191a,0xff69871e,0xff65641f,0xff7bf3ca,0xff4d3d9f,0xff52430d,0xff538cf9,0xff751b8e,0xff99a698,0xff98844b,0xffa2f7b0,0xffb6257d,0xffbe09cd,0xffc939e6,0xffcef43f,0xffbf5c2b,0xffb99de2,0xffbf2290,0xfff59e25,0x00124bef,0x001e1934, -0x0015d436,0x00089077,0x000818b6,0xffe64635,0xffdf0ed8,0xffe88d6d,0x00022367,0x001ee128,0x003313ed,0x001e996d,0xfff81d82,0xffbfe590,0xffcafa0f,0xffbb1177,0xff987873,0xff802663,0xffe68abb,0xffe3b72a,0xffc64bf1,0xffb624fb,0xffac1b4b,0xffa2bcac,0xff950d66,0xff846486,0xff8ac139, -0xff9573c7,0xff8ad0e5,0xffa59ace,0xffac2bbb,0xffbe81f7,0xffc5f82c,0xffd36946,0xffd73ae5,0xffe65b41,0xffeed5fa,0x000a5759,0x0013104a,0x0014b393,0x001de904,0x00189a82,0x001518db,0x000efb72,0x0003e7a4,0xfff66fd2,0xffee1479,0xffe68118,0xffe8911e,0xffe4e52f,0xffe6a1fa,0xffe4919a, -0xffeacd7c,0xffe71f92,0xffd5a704,0xffd27253,0xffe7db52,0xffd9810c,0xffd4f838,0xffd8ca54,0xffd560c0,0xffd5a0b9,0xffd39471,0xffc9f77e,0xffc37a7e,0xffc15ff9,0xffc6a0b0,0xffbefaff,0xffc7cf12,0xffd2ddfa,0xffcb41df,0xffdfbb9b,0xffe1d25d,0xfff9bb54,0xffff48eb,0xfff95462,0xfff8abd2, -0xfff7912e,0xfff7c966,0xfff983a6,0xfff42f44,0xffec187e,0xffdf9462,0xffd2b904,0xffc29fca,0xffb29d58,0xffbae67c,0xffc175d3,0xffc771c9,0xffcb7d27,0xffe3835b,0xffe79c85,0xffc5a94c,0xffcefa9a,0xffff2385,0xffc19781,0xffc7f63b,0xffee5f3a,0xffee856c,0xffef8ed8,0xfff59cdd,0xfff32158, -0xfff428cd,0xfff6cd7c,0xffc0269f,0xffbeee1c,0xfff995d3,0xffc9ee06,0xffc67f45,0xfff0bf5b,0xffe99ab7,0xffe9e54e,0xffeaa6ac,0xffeaa681,0xffea997b,0xffeb8792,0xffe57ea3,0xffe184f2,0xffde52a9,0xffdab835,0xffd7b91f,0xffd075ff,0xffd63369,0xffd88434,0xffdbfa93,0xffdea818,0xffda712c, -0x00385cf0,0x002c9f74,0x0043cbc0,0x003c2642,0x00007312,0xff8cdc87,0x004d5561,0x000ba564,0xffab10b3,0xffabbd0e,0xffac3893,0xffacdbe3,0xff9e4762,0xff9a2fcb,0xff9ce7d3,0x0003ebf5,0x003e72dc,0xff7fdbcf,0xfff7b901,0x00309207,0x0040dee9,0x002fcdab,0x0037206a,0x0034f1d0,0x00345cf9, -0x0035e6fd,0x00385377,0x003f7941,0x0041aa32,0x0040124b,0x00407e30,0x00405453,0x003ff692,0x003db9f1,0x003896f6,0x002bdce8,0x003209a7,0x002ae905,0x004cdf8c,0xffe787e7,0x003c5cc4,0x000b3892,0x001748c5,0x00354153,0x0027fb4e,0x003f5ce1,0x00485faa,0x0046ae50,0x003ddbe3,0x002cf8b3, -0x003ddd4f,0x0007ac1f,0x00043320,0x000fbc7d,0x00107e13,0xffd5ad58,0x0042494b,0x0037ac8a,0x003e4713,0x003d3366,0x003988ea,0x003f0ad3,0x004952ec,0x0060fe57,0x006837cd,0x005f4995,0x005aa2ff,0x0054c036,0x005183d0,0x004ed36c,0x0042f7a8,0x00235791,0x002cb1c2,0x0029c556,0x0046dc90, -0x00426756,0x0040cbdd,0xfff2a344,0x00217384,0x00231683,0x001c9c54,0x0032ee32,0x003f4689,0x004fccd4,0x002b313f,0x0009a269,0x0044034b,0xfffc8b3d,0x00002248,0xffe82603,0xfff7a440,0x00063ad3,0x0030010e,0x0040f3ed,0x003f5431,0x0042fd95,0x003af8e1,0x0045d9c6,0x0053714e,0x007f644f, -0x008ea404,0x0080999b,0x00854fd6,0x007d5296,0x007324a4,0x00690b0b,0x0047bd01,0x0012eaed,0x0022c883,0x001c62e7,0x0033b029,0x00310d85,0x00264959,0xffd79fd4,0x0036ffa7,0x00569107,0x002ef89c,0x00589e89,0x00654056,0x00605634,0x00337769,0x00355c34,0x004d841b,0xfff5681a,0xffe5cee3, -0xffd1749e,0xffeec08c,0xfff08ec9,0x002b0ec1,0x00413515,0x004473d7,0x004d6fcd,0x0045ef65,0x005d3a43,0x007c4363,0x00d03f81,0x00e37d27,0x00b899ff,0x00abb211,0x00905e71,0x007ac4f5,0x007469fb,0x00550279,0x000139c2,0x000f86ca,0x007473f0,0x00695f43,0x00ab1cbe,0x00c09375,0x00617274, -0xffc8224a,0xff8a009a,0xffba718b,0xfff5491d,0x001fa886,0x00365aff,0x003f18e9,0x002072e4,0xffe70707,0x001edc9c,0x003281d6,0xfffe7376,0x0023f0c6,0x001a42fd,0x0045c3a3,0x006bfba7,0x0050553e,0x004876c5,0x002f2c7f,0x00063239,0xffbe9420,0xffb9bfc5,0xffe0c23f,0x00692f60,0x00a086f1, -0x00cc84a1,0x00f3384a,0x0092adc4,0x00363ea4,0x00077ea5,0x00337acc,0xffa3b45e,0xffc62de4,0xff5a3fb8,0xff4d39de,0xff78aad6,0x005afc86,0x00ab6e5a,0x007553a6,0x00189337,0xfff7732d,0xffeffb3e,0x001a342b,0x0036a4bb,0x003d85b5,0x002efcb2,0x001ea57e,0x0027b0c2,0x0011fc65,0xfff79d0a, -0x001ed7db,0x00509dce,0x006a389f,0x008dbdb9,0x00590182,0x003701d7,0x001e846b,0x0021ed5b,0x00301ff5,0x004971c8,0xffde4483,0xffda6700,0x005586ce,0x0056a620,0x009c9f19,0x01028d08,0x001a19c3,0x0058c258,0x011446de,0x0063bea7,0x002697a1,0xffe53ef3,0xffa5b6aa,0xffca49d2,0x003a72ec, -0x00476455,0x003dadee,0x000982cd,0x00033811,0xfffb1554,0x000206dc,0x0026ade5,0x00373dab,0x000c20fd,0x001fe658,0x00247c0d,0x0028655c,0x000e629d,0x00048c2c,0x00258c8c,0x00881a74,0x00db0c9d,0x010725f6,0x00fe18b7,0x00b7d973,0x0044dd60,0x0077a0d5,0x0101c352,0x01d2574e,0x01251af0, -0x008ae380,0x0035b68a,0xfff16d2f,0x0023e5be,0xff7b16ab,0xffb1c2f8,0xfff120b8,0xfff0cc4a,0x002195f4,0x001a67bf,0x00113b04,0x00028fd4,0xffeff0d8,0xfff6eb24,0xffe62249,0xffe22043,0xfff8e9aa,0xffe14621,0xffd73d68,0xffe10cfa,0xffe8bc1c,0xffdb3a2c,0xffe20959,0x000f07ff,0x0034c600, -0x00541fdb,0x0057ec25,0x00605e46,0x007917ca,0x00a66af5,0x00b64d76,0x009a20a2,0x00b59ea6,0x008b99da,0x00584fca,0x009b5589,0x00efc2a3,0x0146c302,0x00a7ccc3,0x01851d88,0x00ca1214,0x002aa821,0x0043b2b6,0x004b4774,0x002f69e4,0x00221fa0,0x001d5577,0x000f56a0,0x0016dc2f,0x002276fa, -0x00065731,0xffef196a,0xffe1909c,0xffdf3787,0xffe81d20,0xfff14841,0x00111a4d,0x0018b9c8,0x0027baee,0x0025aeef,0x001b2157,0x001e4a64,0x001d541e,0x0028fce2,0x0038f611,0x003ad3d8,0x005642bf,0x008b4c3f,0x00a88d44,0x00dbbe3f,0x012f53b0,0x01389094,0x01491160,0x0170cc06,0x0188e3b4, -0x000a1276,0xfffa43b9,0xff720140,0xff80a566,0xff6e50e4,0xff8dcf77,0xffa600f4,0xffbbb8ae,0xffbaa57e,0xffba2406,0xffc740bd,0xffccfd60,0xffd90440,0xffdb6175,0xffd5b544,0xffdaa444,0xffe09b64,0xfff9db3c,0x000ca967,0x00167483,0x002d1f62,0x004238e7,0x004b3495,0x004f1674,0x004ad8d6, -0x00474ed5,0x004a7491,0x003c64ea,0x0025731a,0x002a3f1b,0x003fcd02,0x0074ca72,0x0049b235,0x0033365e,0x001817c5,0x000b3863,0x0028a97e,0x001940ca,0x00008de7,0xfff32bdc,0xffc96b34,0xffbfe16a,0xffaa0bd8,0xff9a9cd6,0xff994c5f,0xffa76a40,0xffa50ce1,0xffbe7ebb,0xffb78976,0xffd32f61, -0xffd15feb,0xffe048ea,0xffdebd56,0xfff9487a,0x00169686,0x003a44d6,0x00353cb8,0x002efc6c,0x002b8eab,0x0028eb07,0x0027a030,0x002371ae,0x003632b6,0x004a3fc5,0x005f4622,0x00684172,0x006a37ea,0x006fb370,0x00598d75,0x004a8720,0x003d5d2e,0x0031e4fb,0x000b2780,0x0010bf8e,0xffd38679, -0xfffff30e,0xfff500b7,0xffef41d6,0xfffd10c8,0xfff9facd,0x0004e66b,0x000bf534,0x00049468,0x001139b9,0x000c5b25,0x000b20f9,0xfffc3696,0xfffc44da,0x000f6be3,0x000922b9,0xfff54e8b,0x00096f9a,0xfffbc7df,0x00004de0,0xfffea9c8,0xfffdc20e,0xfffcd106,0xfffa2747,0xffff8f4a,0x0003626f, -0x00096bd5,0x000fff33,0x001a457e,0x00274f8b,0x0022b276,0x001f5aee,0x00195206,0x0013b92e,0x001d0e2c,0x00250107,0x001e8f8e,0xfffe2db5,0xffbe9d14,0x0024ffb6,0xfffcbf3a,0xffc421df,0xffc0ea45,0xffbd1c82,0xffbaf62d,0xffb4f2a5,0xffb1be9a,0xffae5ba3,0x00006418,0x0023f309,0xffba0a4a, -0x00004a2f,0x001b3ce9,0x001612ce,0x0012e24b,0x0013d426,0x0011dc82,0x00119600,0x00110903,0x000faafd,0x0013c6f3,0x00171275,0x001a3c2d,0x001e0b6f,0x00205ffb,0x00246209,0x0021023d,0x00202ecf,0x001f738a,0x00208f31,0x00231767,0xffb08c75,0xffbcc0b0,0xff9f7a3c,0xffdd1945,0x00267fe8, -0x00722ae0,0xffbecd75,0x00151175,0x006874eb,0x0070d927,0x0072e529,0x007219f5,0x00727c2b,0x0072a138,0x007aba90,0x0014452c,0xffc273cc,0x007433fc,0x001716f5,0xffd7e696,0xffa0bd4f,0xffb6b601,0xffab75d8,0xffa88378,0xffa742f7,0xffa8f294,0xffadafd0,0xffb4be70,0xffb60a2d,0xffb29b05, -0xffade217,0xffaa43ef,0xffa6b3ed,0xffa5c0ec,0xffa9a723,0xffba2f1d,0xffb372eb,0xffb849a6,0xffa80a9f,0x00427538,0xffc42000,0xffe376e2,0xfffd68e5,0xffe552c3,0xffee9744,0xffd79850,0xffda027e,0xfffe4d17,0xffd03f9d,0xffd3a35f,0xffe45d62,0xffef1396,0xffdbf596,0xffbf8106,0xffc619f8, -0x00266429,0xffa9da9c,0xff9b2dd0,0xff8f8389,0xff824f8b,0xff7dbd9d,0xff873946,0xff9c72c5,0xffb65f48,0xffbb8370,0xffab3736,0xff9ab357,0xff8c8e00,0xff87b060,0xff86e4a3,0xff97642a,0xffc033f2,0xffb54ff2,0xffb2dfdc,0xffbb6a40,0xfffdd626,0xfff541bf,0xffecd981,0x0004efc9,0x0009f0fe, -0xfffe092d,0x0024c8e4,0x001945f6,0x003b1e30,0xffebb8e2,0x0006fddf,0x000989ab,0xfff2a4b7,0xffd15085,0xffc0a62b,0xffcb766f,0xffdf823e,0xffc599da,0xff844ed9,0xff7b90d0,0xff606228,0xff5710bc,0xff64ffc6,0xff83db44,0xffb19d81,0xffba5daf,0xff9cd324,0xff8a1bf7,0xff6e106a,0xff5dfeb3, -0xff5cb6ee,0xff7694ea,0xffc40c08,0xffb0e507,0xffc2d62b,0xffd17c73,0x000d8205,0xffde1267,0xffbf70ee,0x00126015,0x00409c5e,0x00333cb4,0x004da16d,0x00627634,0x0061b948,0x0033f074,0x00211ec9,0x003c39d5,0xffe05523,0xffc04c39,0xffcc084e,0xffba329c,0xffec711f,0xffc6f943,0xff653379, -0xff4568a5,0xff1316e5,0xff0841ab,0xff28bf11,0xff730087,0xffd2d32d,0xffe26256,0xffa29053,0xff7013f2,0xff435c11,0xff2acfc5,0xff3ce9db,0xff83298c,0xffeb5d6f,0xffd82eec,0xff4a77a8,0xffba38c1,0x00644a7a,0x0088a8a0,0x007cdbf0,0xffe04b97,0xff80f0d3,0xffa9f85a,0xffe53dbc,0x000bb64f, -0x001c2cbb,0x003d4017,0x00258831,0xffe1b657,0x0017df35,0x00164351,0xfff084b5,0xffd18508,0xfff42845,0xffd9d016,0xff886419,0xffb7be3a,0xffb6d6eb,0xffd60bfc,0xffb94d7f,0xff88253d,0xff2e0258,0xff291010,0xff9b3dd3,0xffa05abf,0xff9193f3,0xff8a1c14,0xff3e7723,0xff0505da,0xff1dcc71, -0xff3bdd75,0xff5b8fac,0xff85935d,0xff39c6e7,0xff22cba0,0xff192fed,0x001ec915,0x008f6897,0x007057c0,0x00136849,0xffeb3d87,0xffe00311,0x000ab8e1,0x0028e271,0x0030a903,0x00145781,0xfffcef5e,0x000ae037,0xfff9d680,0x000a499f,0xffdee42b,0xff9894f6,0xff85e344,0xff457197,0xff6d01e7, -0xff9d7811,0xffcfcc3c,0x002215c3,0x0034b15d,0x00120107,0xffa5e994,0xffa4e5df,0x003cb2df,0x000aee80,0x00587d0e,0x01006daa,0xffebe56b,0x0007890d,0x00e7736b,0x0057365b,0x0000e665,0xffef1504,0xff9e3c22,0xffc539d2,0x001552cf,0x00303fb0,0x002d7a24,0x000147f8,0xfff1cbea,0xffecc724, -0xffffa4eb,0x0015bc7b,0x0013452c,0x0005f92b,0xfff1714a,0xfff5daad,0xffeb05f0,0xffcd2daf,0xffedc723,0x000a32dd,0xffd6a718,0xffa411fd,0xff7e7a04,0xff608fce,0xff612c7a,0xff8458ff,0xff712085,0xff7a6c1e,0xffd71585,0xfeb039ae,0xfe3fbbf4,0xfe5999ec,0xff3a3140,0xff32667d,0xff7fe071, -0xffbebbc0,0xffcdef34,0xfffad973,0xfffbbfbf,0x000ff8fc,0xfffe6c92,0xffff0334,0xffecff43,0xfff0141d,0xffdea6d0,0xffdf8fd6,0xffed1afe,0xffd56b5a,0xffcf4f9b,0xffcadeae,0xffc96364,0xffdde21b,0xffc1a584,0xff990203,0xff8b5175,0xff8c82d3,0xffa0ee40,0xffdae1d7,0x00292298,0x004b151e, -0x005742fa,0x00445a7c,0x00520551,0x0014a41a,0xffcd4c26,0xff2f573e,0xfee9162c,0xfea61eac,0xff1dde07,0xffb95334,0x001042f0,0x0093e288,0x003f5c40,0x00312bda,0x00348189,0x001b18b6,0x000229a8,0x0006be35,0xffff779e,0x00159ffe,0x0007224f,0xfff1b172,0xffd59c9b,0xffd8ed30,0xffdf54c6, -0xffdf4885,0xfff052a9,0x000f9574,0xfff7a9b5,0x00067858,0x0018141e,0x000a8cc8,0x0001aaec,0xffdef30d,0xffa65f79,0xff9c59ec,0xff9df539,0xff9e4a79,0xffd241cc,0xffe36367,0xffe55cf7,0xffbe90fa,0xffc02d96,0xffcf588b,0xffe04cfe,0xff634a75,0xff839736,0xffb38380,0xff75054c,0xff833ae2, -0xff8eb836,0xffa3a626,0xffbe66a9,0xffb1ebfe,0xffb73e09,0xffc0af59,0xffc58676,0xffcb2c4b,0xffcfd050,0xffc808fc,0xffc57f37,0xffbef7ab,0xffe8f3a6,0xfffecf72,0x001878f4,0x0003616b,0xfff815be,0xfff79667,0xffeec535,0xffed3b43,0xffee3118,0xfffd0e5d,0x000cdca1,0x002435bb,0x000d7ab5, -0xffe2ba84,0xff9afca7,0xffa352e8,0xff9c4e8a,0xff85a9c2,0xff81d91d,0xffc52aa5,0xffd8bcb9,0xffd8e17c,0xffb7c62b,0xffb237c1,0xffa4e5b5,0xff99b6ed,0xff89ad92,0xff9eea75,0xffa07456,0xffae0a4d,0xffb1c6a5,0xffcce207,0xffd48399,0xffd999d0,0xffd63a52,0xffd8541d,0xffea51af,0xffffec36, -0xffff1ae0,0xfff72c22,0x00093793,0x00109243,0x0012d5fc,0x00136215,0x0015204e,0x00073d30,0xfffad99e,0xfff2c48a,0xffe70b6d,0xffe42b04,0xffd94bc2,0xffd7bc90,0xffd19bcd,0xffcedfb7,0xffd1da14,0xffd7176f,0xffd8c123,0x00149f48,0xffdc48ad,0xffebe2eb,0xffec80ca,0xffd987c9,0xffda5f04, -0xffce6f81,0xffcddaf5,0xffdb3fc5,0xffce2bc5,0xffcd2967,0xffcf6461,0xffe29de9,0xffe826c5,0xffdda2da,0xffe8e573,0x0004e231,0xfffa6d6d,0x0002b41b,0xfffcbd3d,0xfffaae97,0xfff944b2,0xfff817d4,0xfff97753,0xffebcae1,0xffde8a62,0xffcee0dd,0xffc0c920,0xffb19d81,0xffa3da0c,0xffaf7c1a, -0xffbb33d8,0xffc563c8,0xffcda092,0xffdfc729,0xffda9775,0xffee3d63,0x000ffb3c,0x003b5977,0xffd7e363,0x0003c285,0x002e9e34,0x00338890,0x0035d96a,0x003570dd,0x003bdd8b,0x0040ae31,0x00427fec,0x00058cba,0xffdcaeef,0x00409e0c,0x000b279f,0xffeaad08,0xffe26c0a,0xffe5856c,0xffe30939, -0xffe3a625,0xffe30e06,0xffe24aa6,0xffe2fc2a,0xffdcf05d,0xffd941d7,0xffd5ce34,0xffd20f78,0xffce7c6e,0xffc65b00,0xffcd71e3,0xffd03aa5,0xffd41f1f,0xffd7e88a,0xffd528ff,0x00331ba8,0x00290b68,0x004f3bce,0xfff3feff,0xffad62e6,0xff790993,0x00171620,0xffbda6ac,0xff8348d2,0xff7f819e, -0xff820bc9,0xff92c6bb,0xff7c692d,0xff79ecc5,0xff82d732,0xffb6a39a,0x0003786f,0xff6c109f,0xffab3b3e,0xffe938c6,0x00482ae8,0x0028d063,0x0030425a,0x002f8368,0x002fbbe2,0x0031521f,0x0033dca5,0x0039139e,0x003b6b22,0x003b333f,0x0039f808,0x0037f4aa,0x00351752,0x00309065,0x002c77a3, -0x0025dc83,0x002d3818,0x0033f338,0x003dee77,0xffa75b68,0x002dbb1f,0xffe9f003,0xfff89460,0x001fa76f,0x0015d923,0x003232c9,0x002a6946,0x00166566,0x001bc85f,0x00182bb3,0x0019c903,0xffee509d,0xfff16ca5,0xffe571a6,0xfff9789d,0xff9e41ed,0x00278cca,0x002ec5c5,0x00292444,0x0030e898, -0x0031c33e,0x003c5b5c,0x0048bcc1,0x0059cc52,0x005c7f42,0x0053edff,0x004c160c,0x0040929c,0x003684db,0x002a885c,0x0024b8be,0x001af7f2,0x00264629,0x003e3f36,0x0036887e,0x00021729,0x001f8496,0xffdf8bab,0x000d648f,0x000ee76c,0x0016e610,0x001490cd,0x0039320b,0x0030f4d1,0x0031277d, -0xfff3c2d7,0x00301a17,0xffe54cb6,0xfff43173,0xffd10740,0xffde0793,0xffd21e32,0x000e68ac,0x00355c91,0x0023ccb4,0x0030f45d,0x002db827,0x003d1997,0x004aa310,0x006df0e6,0x0079cfe3,0x007057c5,0x006f0ba6,0x005b98b4,0x0047072c,0x0028c4fd,0x0015b728,0x000d1893,0x001bc2d0,0x004a65c9, -0x002df565,0x000ad6d0,0x002146f3,0xffe2d9b7,0x0027b49d,0x00516927,0x003fd384,0x005dc784,0x0069ecb0,0x0076eef9,0x002a7ccc,0x002afafe,0x004f83c9,0xfffc38e7,0xfff4eb67,0xffb621e9,0xffeb83a5,0xffc2b908,0x00050c18,0x002467dd,0x000cd126,0x0026548b,0x002bb30c,0x0051061f,0x007c957e, -0x00bcd0fd,0x00bef587,0x009a19d4,0x0081670b,0x0055f41c,0x002decae,0x0008ef2c,0x00072cae,0x00022f93,0x0011507e,0x006982ad,0x000627d7,0x000b9ed9,0x005635ea,0x00489305,0xffd1fdab,0xff9b8ac2,0xffaec5d6,0xffe59eda,0x000e74b8,0x000ecafb,0x004a50c8,0x00377617,0xffdcef25,0x001b2c09, -0x002edf2b,0xfff191a7,0x001415ee,0xffdf8ea7,0x000eed1d,0x00728a08,0x00602195,0x0078b912,0x003cb59c,0x001ba87c,0xffeb34b9,0xffec78a7,0x0021b779,0x00b70abb,0x00bc80df,0x00c3027a,0x00ce61f9,0x005531dd,0x0002e6ae,0xfffe2ed8,0x001d3912,0xffff67bb,0x0007b4fb,0xff7222a4,0xff65ec46, -0xff5998b8,0x001f917b,0x008f1efb,0x00746c14,0x0021a4ae,0xfff235d5,0xffdc5705,0x0002359a,0x00228c09,0x00386176,0x0030271c,0x001969ce,0x0013074d,0xfff78099,0xffceaa53,0xfff8998f,0x003078a2,0x002f1e7e,0x00565eef,0x002759c0,0x00140c76,0xfff810fb,0x00334d07,0x0040326b,0x00260d97, -0xffde398f,0xffd80150,0x004324b2,0x0037cba0,0x00868320,0x01060ade,0x0031c56e,0x000d042c,0x00e96445,0x000c73a3,0xffdea85a,0xffd5154b,0xffb3d552,0xffbfeb85,0x0006733e,0x00269740,0x0032f9ca,0x000a832f,0xfffd181d,0xfff531a4,0x00034613,0x0015d793,0x002e88b2,0x0003bc4b,0x00222e24, -0x00124dae,0x002a5018,0x002d38ac,0x0013933d,0x003dc211,0x007f04ea,0x00bbb4c4,0x00cfa863,0x00cad6b8,0x00ad22bc,0x00818832,0x00a1609b,0x010222ce,0x01ab2d40,0x0054205c,0xff9d8e08,0xff9f1c7d,0xff951eba,0xfff90d67,0xff7ea60a,0xffcb5b7c,0x000a5c67,0xfff9934e,0x001c6916,0x00187bcd, -0x000f8ada,0x00078b51,0xffee93e3,0xffef649f,0xffe87c03,0xffe8aa5e,0xfff2e705,0xffe4202f,0xffd6dace,0xffda28a3,0xffdc3375,0xffba4207,0xffdc7775,0x00042ea3,0x0010c5db,0x00296800,0x00299131,0x00443066,0x00616f73,0x0081ecfe,0x0085768b,0x006cf2f0,0x005f4a41,0x003fdcda,0x006e4412, -0x0057b0d2,0x007ff0ee,0x00a535e6,0x003a6c8b,0x00fc47fe,0x002ff5eb,0xffde49b7,0x0017bfd7,0x002f7faa,0x00232a70,0x001e9df0,0x000c7183,0x00003b40,0x00146c7b,0x001edbbd,0x001b30ab,0x00030da8,0xffdf8cac,0xffdc0253,0xffdcc00c,0xffe6436a,0xfffdc0d1,0xfff6159a,0x002280ff,0x0020cef9, -0x0012e9de,0x0022a893,0x001484f2,0x000fad5b,0x000bee75,0x00155c41,0x003118f8,0x00668976,0x008a0e7e,0x00b0631a,0x00e95ab4,0x00e87467,0x00f4e30d,0x0118e654,0x010d7ddc,0x000309cb,0xffc6392f,0xff632a14,0xff7a5792,0xff7536ca,0xffa6b8a1,0xffd0fe3b,0xffd54357,0xffdc1e54,0xffd6f027, -0xffe09e7d,0xffd1ac16,0xffd8e2da,0xffdbcbf8,0xffde5e48,0xffd93813,0xffcda284,0xffe12213,0xfffada65,0x000e1896,0x002caa26,0x0040347e,0x004253dc,0x003f74dc,0x0039f33f,0x00326d52,0x0037c761,0x0034811e,0x00327772,0x0035c4c2,0x004a0ab5,0x00722f26,0x00567a95,0x003c8e97,0x001e0402, -0x0004d68a,0x001cbf3b,0x0000b06e,0xffcedc62,0xffcbc126,0xff9b8046,0xffa061ba,0xff98d1e0,0xff986f69,0xff96db95,0xffb19c02,0xffa8ee61,0xffd1a0fd,0xffc53c7f,0xffe1b64d,0xffd65e7f,0xffe072e2,0xffd87cce,0xffed09fa,0xfff7d41a,0x001f809a,0x002f2b03,0x0028b81e,0x002ef8ef,0x002f4afc, -0x0031d9f2,0x003164ae,0x003b73b1,0x00448dfc,0x004e4471,0x005352ef,0x0052ae1b,0x00543fef,0x003c1a2b,0x002c309d,0x0023ed35,0x001896fd,0x000e2302,0x000dded4,0xffcbc203,0x00018ce8,0xffeb4756,0xffe8d454,0xfff74292,0xffef6e48,0xffff0d8f,0xfffe2c5f,0xffeb2cd1,0xfffc6fe7,0xffffac3f, -0xfffacd65,0xfff01d27,0xfffc8d75,0x000cd395,0x00127df0,0xfff797ad,0x00224bd1,0x0016bb19,0x00160e76,0x00143fc2,0x00104e5d,0x000d85c0,0x0009d6d9,0x00110e41,0x0015b800,0x00198c91,0x001c7111,0x0021907d,0x0029d8d8,0x0027a7cc,0x00241ee5,0x001d88a8,0x0014c007,0x001c69f3,0x0027d4c8, -0xfffcf441,0xffd7b68f,0xffba3d62,0x00075287,0xffd4f439,0xffb2683a,0xffaf4d8e,0xffad0f07,0xffb2ae19,0xffaa05f1,0xffa6ece4,0xffa70de6,0xffd7d850,0x0008c206,0xffb36137,0xffdd8586,0x00029b64,0x0025be4f,0x001a4b8f,0x001c3ec1,0x001a1d47,0x0019edef,0x00198db5,0x0017ba04,0x001a7e90, -0x001c5c80,0x001ee648,0x0021ec09,0x00239f1f,0x002566d9,0x00215f9a,0x001fbccb,0x001f222b,0x001fe07d,0x0021e5c6,0xffd7c7a1,0xffde3007,0xffbedaf0,0x00287e67,0x005cb780,0x0055fa13,0x000a0d0a,0x004e5bbb,0x0061becd,0x0065bfb7,0x0065cc07,0x005be6dd,0x005f7164,0x005d5f77,0x005bd809, -0x004db0a7,0x000f1950,0x004e35db,0x004a0354,0x002116ec,0xffc06515,0xffd83b9f,0xffd2029d,0xffd046b3,0xffd0d356,0xffd3bd30,0xffdb14dc,0xffdddd6c,0xffde77c6,0xffdb110e,0xffd9ffe7,0xffd78cb3,0xffd21e2f,0xffd4f568,0xffd6b891,0xffdcbec7,0xffd9a2eb,0xffdaf203,0xffe04580,0x0064ae7d, -0xfff55700,0x001922d0,0x001e27e1,0x00084302,0x00132365,0xfff660e8,0x00043738,0x002e5444,0x0002936a,0xfff94157,0x0009e1dd,0x00106543,0xfffd7a88,0xfff08ca5,0xffe79a6f,0x0037fcf2,0xffd77a76,0xffbd7a78,0xffc2c081,0xffb9365a,0xffb9760c,0xffc3358d,0xffdc1d89,0xffe9a5cf,0xffec12e7, -0xffdf9a76,0xffd84158,0xffd0489f,0xffc7ce88,0xffd09077,0xffd922b6,0xffe66944,0xffe3fe36,0xffd08bd7,0xffe34fb7,0x0037bb75,0x001f29a5,0x00146dde,0x00201b3f,0x001d9974,0x00196800,0x0031a78b,0x0014e7c5,0x00546b9c,0xfff60163,0x001b8fd5,0x0014920b,0x001353ce,0xfff5c129,0xffd5584c, -0xffe57457,0x0003f821,0xffe51e8d,0xffa5761a,0xffb133b4,0xffa47710,0xffa6078f,0xffb86898,0xffe49960,0xfff7097b,0xfffb7504,0xffe01dc4,0xffe0c957,0xffcf7757,0xffb2d9aa,0xffc75789,0xffccb2a8,0xffe2b7bd,0xffe3ccc4,0xffe17d8a,0x0000ee24,0x0049ac52,0x00123f83,0xffe87fc7,0x0020c904, -0x003d7aa7,0x003c73ac,0x004b4d83,0x00649256,0x00616a4a,0x0029295d,0x001aeb08,0x002fbe55,0xffed9c6f,0xffd153c1,0xffd3d241,0xffbdf176,0xfff8fdcf,0xffd31d7e,0xff82d72c,0xff8d6617,0xff79ff0a,0xff807a22,0xffa7d9d3,0xfffc5531,0x002e8146,0x00264759,0xffed4554,0xffdfdc6c,0xffc8baf2, -0xffa366cd,0xffcfed91,0xfff30d73,0x00077962,0x000cd7be,0xff734b47,0xffda63a1,0x00678901,0x00784aa2,0x0085a159,0x000e7b29,0xffaecbec,0xffb5d421,0xffdf07e6,0x0003d35c,0x0000d2f4,0x004aefa7,0x003cc6df,0xffe33c9c,0x001c653b,0x0016e725,0x00058a05,0xffe2f55f,0x0013bacf,0x0007ac11, -0xffbeb748,0xffdb6d6e,0xffb4f1be,0xffdc72db,0xffb7aed3,0xff6b703c,0xff3628cd,0xff52b50c,0xffe801b0,0xffdd19b3,0xffe1d1af,0x000577bb,0xff9a8925,0xff52a883,0xff563d78,0xff7d7f1c,0xff772f50,0xffd6e3d2,0xffbc6d31,0xff6ee7e1,0xff3afa52,0x0001a9cc,0x00683372,0x00695ced,0x001f329b, -0xfff23574,0xffd07458,0xfff33305,0x0016d421,0x0025b457,0x0017ced5,0x0008d6f4,0x001b1e92,0xffee2198,0xfffc1731,0xffe303f2,0xffc04acc,0xffd3ddea,0xffb2bd58,0xffab8aa6,0xffc3995c,0xffe6aaf5,0x005128af,0x00536bde,0xfffa3de3,0xffbe1723,0xffd35c28,0x00687010,0x00661864,0x00a3517d, -0x00f411ff,0x000b26d5,0xffc3d41f,0x00aa8b5a,0x001396eb,0xffbda4ba,0xfffd91be,0xffbbd83e,0xffd8e4b0,0xffea7354,0x00153af7,0x001d2b7d,0x00090c4f,0xffefda67,0xffe8e6f1,0x00011af8,0x001111ec,0x0014e0f3,0x0016f44a,0x0007a2a5,0x00231950,0x000fd50a,0xffdba851,0x00030561,0x001f3ca1, -0x000433a5,0xffedd8c1,0xffd7c9da,0xffb19379,0xffab0aed,0xffd60a08,0xffb2a90b,0xffe29cdf,0x00a09ac6,0xff48733d,0xfeca11f0,0xff0b1f13,0xff481f2f,0xffbcd9ac,0xffac5c3c,0xffe6bd4c,0xfffa5a67,0x000ee4ad,0x0003b16d,0x000a7ba1,0xfffef72a,0x000415f6,0xffec2691,0xffee4e73,0xffe7cbaa, -0xffeb5622,0xfff0bf2d,0xffe21baf,0xffdf52d4,0xffd4fa16,0xffc73db8,0xffe08f3d,0xffca7a28,0xffa6c803,0xffad5e2a,0xffb5143e,0xffd5f68f,0x0011c40d,0x005014c8,0x007b5298,0x008e0ecb,0x00936ecb,0x0072afd9,0x0031e665,0x000a30e5,0xffe2bb45,0xffdb9917,0xffb706be,0xffe88970,0x003c5f5f, -0x003baee8,0x007bf1f4,0x003fd33f,0x0039532a,0x004335df,0x002930c0,0x00115857,0x00152d51,0x000bccdf,0x001fc38a,0x001b6ac6,0x0005fe86,0xffdff603,0xffdb1ef8,0xffd79677,0xffd44296,0xfff75a0f,0x00259672,0x000e80be,0x000b66b6,0x00193ace,0x000fcb61,0x00101eb5,0x0000db52,0xfff06984, -0xfffaa032,0x001455cf,0x003c4e2f,0x00405827,0x004d7030,0x0050e209,0x0057e5fa,0x006850dd,0x006090f3,0x00762145,0xffbf06d8,0xffd03b70,0xffdeef2d,0xffbac658,0xffb9e649,0xffd2b4a4,0xffdc9a3f,0xffe865b3,0xffdc3806,0xffd8cecc,0xffd62a75,0xffd10e23,0xffd0d5ee,0xffd29692,0xffd8a5e1, -0xffdb8885,0xffd0e4ef,0xffdf35f5,0xffea79a7,0x0005862c,0xfffd62cc,0x000277eb,0x000507da,0x00135bd6,0x0018675d,0x00120db5,0x000e993f,0x000930d7,0x0012ca49,0x000873af,0xfff78306,0xffd8bf19,0xffd26c15,0xffd4e344,0xffd2880b,0xffdc111f,0xffca82c2,0xffe128aa,0xffeb9136,0xffc62b38, -0xffb6fb2b,0xffacf4f4,0xffa4f0dd,0xff9a12e9,0xffb15689,0xffb15f6b,0xffcbfdc2,0xffc2e18f,0xffdcab1a,0xffdd63f4,0xffe3d2bc,0xffde6298,0xffe39f25,0xfff4f8b9,0x000fa0f9,0x000350ba,0xfff52f50,0x000acc76,0x000f8b8d,0x0012e566,0x0013d647,0x0017eee0,0x00162a19,0x00181049,0x001b569b, -0x001120c6,0x00091594,0xfffbc81b,0xfff19c46,0xffe591e6,0xffd7e568,0xffda7943,0xffeeffd7,0xfff37920,0x001b97ed,0xffec604c,0xffff020f,0xfffa9158,0xffe7af41,0xffe638f8,0xffdc12d8,0xffe48221,0xfff846e7,0xffecc41e,0xffe74b18,0xffefa91b,0xffff8e76,0xfffed356,0xfffe22e2,0xfffca2fb, -0x001bba22,0x0000ea57,0x000348fd,0x0001a671,0xffff87c5,0xffff1148,0xfffe2e67,0xfffe1583,0xfff2f3ac,0xffe98af2,0xffe1ef77,0xffdc6122,0xffd91985,0xffd7f78b,0xffddc74a,0xffe593be,0xffeb4036,0xffef81ea,0xffeb83e0,0xffe36620,0x0012c480,0x002ca290,0x002e780d,0xfffae080,0x002148a6, -0x002b4220,0x0030f412,0x003235ae,0x002cf670,0x0035b57d,0x003a79f7,0x0039f8e4,0x002c12ec,0x00048528,0x003b065b,0x002e09f1,0x001052fb,0xffe5cb0c,0xffee5c30,0xffeb4fac,0xffeadfeb,0xffea1838,0xffe90d13,0xffe90ad2,0xffe75407,0xffe6ccfb,0xffe5b29e,0xffe50a83,0xffe3c04c,0xffe0d834, -0xffe31ef9,0xffe396bc,0xffe49f40,0xffe6d708,0xffe3d277,0xffffb8bc,0xffffc509,0x00157283,0xffbce7e4,0xffa5fb06,0xffcde8cc,0xffd2b9a9,0xffac4c1e,0xffc21c55,0xffbe38f0,0xffc1764c,0xffd55e4f,0xffc50f66,0xffc4f1df,0xffcf879b,0xffa92cda,0xffc677c6,0xffc5485e,0xffa39457,0xffb4d93f, -0x000dfba3,0xfff9ee8d,0xfffab712,0xfffa5b44,0xfffb542e,0xfffd40b2,0x00018850,0x0003eaff,0x00056c1d,0x0004b056,0x00022b05,0xfffe5c08,0xfff92e93,0xfff3e6e0,0xfff3ab34,0xfffa9ec5,0xfffdeddf,0x001140bb,0xfffe94c7,0xffbb5e99,0xffff1f62,0xffd7baa3,0xffe788e7,0xfffb1adb,0xfffcceae, -0x00056bf2,0xfff59492,0xffe88f78,0xffe96238,0xfff262c4,0xffeb679a,0xffe19deb,0xffe163c6,0xffbe6495,0xffd8921b,0xffad4291,0xffe4b9df,0xfff0da2c,0xffe21ca6,0xffe8d1a9,0xffed6e93,0xfffbe612,0x000e79ef,0x00185133,0x0016a322,0x000af651,0x0000c5e9,0xfff1a40c,0xffe4673b,0xffd4a34a, -0xffdbc19d,0xfff6bb5e,0xfffd41b6,0x001d49d2,0xfffe02ea,0xffd7df96,0xfffa9536,0xffe179c0,0xfffe3cb6,0xfffe716b,0x000cce77,0x00003dda,0x001fff6f,0x001613f4,0x001b2497,0xfff0a629,0x000e1ffa,0xffe0df9d,0xffe6d89b,0xffc05a15,0xffc97416,0xffb480d2,0xffd840bd,0xffe99d4c,0xffd305dc, -0xffd867dd,0xffdb1ce2,0xffee18e2,0x00074618,0x001b2370,0x00206d06,0x0011db84,0x000bbf5b,0xffee9896,0xffd2bae3,0xffaf21ee,0xffb79ca7,0xfff04feb,0xfff4cd86,0x00452431,0x000deab7,0xfff9ffaf,0x000f0bc5,0xffee154b,0x00179f5e,0x0042ec5e,0x004ce5fa,0x0057e9f5,0x0064df07,0x007aa4b2, -0x00286da6,0x00209264,0x004225ba,0xffff6497,0xfff48d09,0xffab240d,0xffd4f4cb,0xffaee637,0xffca41e6,0xffc45141,0xff9cca80,0xffa7b5a1,0xffb7b141,0xffe956fa,0x003046c0,0x0058bc1f,0x0049d79d,0x001f3aa8,0xfffef245,0xffcd6208,0xff9d9b69,0xff742826,0xffa1ad4b,0x00035153,0x000cb628, -0xffe8bb58,0xff9cf9e9,0xffa9cfc7,0x0005b233,0x0040d5f1,0xffecffa0,0xffb084f0,0xffa70077,0xffcf3d88,0xfff94cd1,0xfff985e2,0x0052d6c5,0x0049644b,0xffdb29e9,0x001407fb,0x001f67da,0xfff7fb20,0xfff87ca6,0xffc74db5,0xffda7abd,0x00275123,0x0031bc42,0x00509676,0x002194ef,0x0004ae58, -0xffdbbe25,0xffcbf2af,0xfffe1856,0x00895ab7,0x0060ca0a,0x00445e57,0x002fe5ea,0xffba77b4,0xff7e9c87,0xff96296a,0xffafc564,0x0026c3ab,0x0016416b,0xff899cc1,0xff6e5abb,0xff3b086d,0xffde5e37,0x005ae552,0x005ea006,0x002bf367,0xfff848b9,0xffcd9de3,0xffebfa9f,0x000ecf48,0x002c10a9, -0x0021c7fb,0x0008dbff,0xfffecf9d,0xffe2c7e3,0xffc51767,0xffcaa04c,0xffdf98c2,0xffc8be75,0xffcd9300,0xffc29be1,0xffd4af50,0xffd85921,0x00485ef4,0x004e2bf0,0x00014863,0xffcf4e5d,0xffcae1cf,0x00286028,0x0026603a,0x006f210f,0x00e2acd3,0x003bda2a,0xff934e5f,0x00634792,0xffd65395, -0xffbae92c,0xffde7b75,0xffcf7b46,0xffccf2e6,0xffd61747,0xffff30a1,0x001aa100,0x000dc77a,0xfff5abe2,0xffee2727,0x0002b1d6,0x0003694e,0x0016050f,0x0000647a,0x000f1939,0xfffa52f8,0x0011691a,0x0026f4bd,0x001ca403,0x003f42e4,0x003fbf6d,0x003c6ee8,0x001f0589,0x00166951,0x002a4df2, -0x005661f1,0x00639375,0x006c0bbc,0x008e7a4e,0xff15f60c,0xfe8a284c,0xfeeb7b8e,0xff267a9d,0xffbac1b3,0xffaf8d36,0xffe5a470,0x00097d8a,0x0012b1c6,0x000b42b6,0x000c735e,0x0006d2d7,0x000695bb,0xffedab3e,0xffe8980b,0xffedd4fa,0xfff2aeb9,0xffec6922,0xffe8408e,0xffda37df,0xffcf56ea, -0xffcc1177,0xffb2b6b7,0xffd0748d,0xffd4acf5,0xffc73529,0xffd0ab46,0xffdc96de,0x00099999,0x0037ccaf,0x00489cce,0x0047abc4,0x00402806,0x0017678c,0xfff8441a,0x0038a439,0xffd3f4e3,0xffbbb398,0xff9a5b5b,0xffa6679e,0xffe87562,0xff96314c,0xffcf9d4f,0xfff6b8e5,0x000f2302,0x002066c6, -0x0020739f,0x0003d49c,0xfffeb67e,0x000e6385,0x00146419,0x00211618,0x000cd5a1,0xffe0bad4,0xffd8adbd,0xffd18279,0xffd8b3ca,0xffe556f4,0xffe492ab,0x000da97b,0x00132529,0x000fd791,0x001b01bb,0x000a23d8,0xfff60f99,0xffdafdaa,0xffe5dd3a,0xfff8aefa,0x001864cb,0x00399dd4,0x004d0977, -0x0059c4e7,0x003da894,0x0030b434,0x0031ed71,0x0007e61a,0xffe443ff,0xff9e9019,0xff967394,0xff9c3706,0xffa43279,0xffcaf759,0xfff2d4ae,0xffeff6d5,0xfff6a229,0xffeff3be,0xfff109a6,0xffd62713,0xffd4abfa,0xffd6dfd9,0xffdd4857,0xffd3ceab,0xffc3c48b,0xffcf2f48,0xffe60d1e,0xfffe1f0d, -0x00135aef,0x001c31be,0x001957a8,0x00113595,0x000d479e,0x00082b62,0x000cee9c,0x00177508,0x002cb7e4,0x0029f2fb,0x0027ef66,0x00201246,0x0023bf3b,0x001a7d16,0x000da2a2,0xfff46b81,0xffe9662a,0xffd6e92e,0xffaa1e76,0xffa27784,0xff805126,0xff8baf5a,0xff9158c0,0xff98f4c5,0xff9f73fb, -0xffb795f6,0xffb4ee5e,0xffd47bd8,0xffd0b4c6,0xffe012a3,0xffd9d364,0xffde9ed9,0xffdb122c,0xffe57777,0xffe38387,0xfff8fb2d,0x000ff8ae,0x001445bb,0x0023d979,0x002277d4,0x0023d870,0x00253a2e,0x00222f70,0x001d3c2d,0x00191e11,0x001458af,0x00104aed,0x0009b69c,0xfffac514,0xffed92c9, -0xffe8e0d9,0xffe1a9bb,0xfffd39d5,0xfff7d07c,0xffe2ce59,0xfff3f6fe,0xffe41c43,0xffe428fd,0xffe4af70,0xffdbcfdb,0xffe3ae90,0xffdd779d,0xffcf9c4d,0xffd7ce82,0xffdfd053,0xffdb86d7,0xffe06845,0xfff12db9,0xfff59f41,0x00053653,0xfffcc6ce,0x001d8e69,0x001c7699,0x00179bd4,0x00173060, -0x001482c6,0x001395fd,0x0012581a,0x001456c7,0x0013d8a6,0x00108158,0x000b6b89,0x0005f602,0x0002a6cb,0x0004c85b,0x00056035,0x0003e614,0xfffe9574,0xfffb4819,0x000132d8,0xffd6c2da,0xffc98c55,0xffdf1b59,0xffd7a71d,0xffc2b8d4,0xffccda72,0xffcd4ea4,0xffce2326,0xffd691ae,0xffd28363, -0xffd2aad4,0xffd5c1c9,0xffc5a78d,0xffdd3846,0xffde1daa,0xffd033b0,0xffe1e60d,0x000e94f2,0x00045aa1,0x000577e6,0x000486f8,0x00048853,0x000467c3,0x0003ea31,0x00028f9a,0x00017f7f,0x000159a1,0x00019432,0x0001680f,0xffff3c0a,0xfffd8046,0xfffbb916,0xfffb5b88,0xfffb780c,0xfff8baf0, -0x0015fb7d,0x0012a704,0x000bb77c,0x0047e446,0x003f93de,0xfff25473,0x00419758,0x003e19fa,0x000a800d,0x000722c1,0x000642d8,0xffff421f,0xfffdfc77,0xfffac586,0xfff50285,0x003c9227,0x00403cf3,0xffe1d355,0x0031c13a,0x003e0cbb,0x000998cc,0x000e599e,0x0010f94d,0x00105c68,0x0012fa49, -0x001674c4,0x001e5ade,0x001d0b6d,0x001d38e6,0x001ab124,0x001d2349,0x001bc63c,0x001602cd,0x0017f1e6,0x001635b4,0x00112e2e,0x001495e2,0x0018ea2c,0x002c1025,0x0036485b,0x002d39d0,0x002f2fe1,0x0026053a,0x0027529a,0x002cf86f,0x001f4778,0x002bcaa2,0x003f5ecb,0x002e0335,0x001fd86c, -0x00276da1,0x001d4a28,0x0013b49e,0x00119769,0x000721a5,0x000a0f95,0x00139854,0x000045cd,0x000db6e5,0x000d63b4,0x00146457,0x001f746d,0x0036e25b,0x00377c63,0x0035f406,0x002cb46c,0x002e40b0,0x002a6a80,0x001f1475,0x0024a149,0x00229da6,0x00179faf,0x0021626a,0x00120a4e,0x001e530f, -0x004b180f,0x003b5275,0x0021ebfb,0x002a2191,0x0021f6d1,0x002acc55,0x00275a8e,0x0015d265,0x004a0d74,0x00129653,0x001dc040,0x00218cd0,0x001d4e1f,0x00155711,0xffe928ca,0xfff8b087,0x000a54f4,0x00071243,0xfff37039,0x0003a998,0x0009b266,0x0016b2f1,0x002bcdbb,0x0058f917,0x005263f4, -0x005389b5,0x003fd7a3,0x0051f1a5,0x0048c040,0x00261b92,0x00336ec4,0x0022b78f,0x000b64ef,0x001fdc73,0x00298aaf,0x003696af,0x005d31f7,0x0040c64e,0x000eddb3,0x002c8456,0x003bde2e,0x00479b21,0x004b8276,0x005f9efc,0x00614c55,0x0022ee24,0x001e56e8,0x002d3879,0x0005cba5,0xfff483d1, -0xffd0fca8,0xffd2d09a,0xffea26f6,0xffe738a4,0xffd3a488,0xfff1342d,0x0003bd27,0x001f37e1,0x004ef362,0x009ec3c8,0x00a1e731,0x00851a08,0x00578665,0x0067b00e,0x005c8b7b,0x002e7ace,0x004a0a6b,0x0046c9a7,0x002258f7,0x003ed99b,0xffdea96c,0xfffbbe96,0x0038d589,0x004dec9f,0x0066b93a, -0x00218d6e,0xffd6f653,0xffbb3789,0xffd1b3be,0xfffa6b15,0xfff6f5d0,0x00578669,0x004fc84e,0xffe48eb7,0x001aeffa,0x001cffe5,0x001b680a,0x000c50b4,0x001e8f87,0x002eb7de,0x0031da98,0x002d8909,0x00031c99,0x000598c9,0xffd854ff,0xff8485de,0xff84cbc0,0xffc8f06c,0x006fbd12,0x005a3a9d, -0x006c1c3d,0x009d706d,0x001b751e,0xffcc6404,0xffb3a989,0xffda66a0,0xffe7e159,0x002d7492,0x00079d1a,0xffa75535,0xff6a71ea,0xffe0c762,0x003ba44b,0x00563884,0x0031662a,0x000524db,0xffcb8922,0xffe1cb86,0x00076fe4,0x0020f4eb,0x001d7401,0x001321a2,0x001cc627,0xffea6c8e,0xffe31e17, -0xffe7e1a3,0x0007389c,0x002cd18c,0x003bdd9a,0x0005e0c2,0x00011108,0x000d2084,0x00714bd6,0x006406c0,0xfff916d7,0xffddc96f,0xfff9cca0,0x006a3ad0,0x00a0b2bb,0x00cae5bf,0x00c87821,0x004371cf,0xff797994,0x00290aff,0xffd7f2b7,0xffb0ea75,0xfff8fb31,0xffe34ce6,0xffecb836,0xffcd12df, -0xfff89ca2,0x000cc4b4,0x001334dc,0xfff68399,0xffec7bb5,0x00009a59,0x0008743b,0x001737f2,0x001b8a8d,0x001ca332,0x00369825,0x00298e35,0x000b9276,0x002290cd,0x0038dbba,0x0053b581,0x00696ca9,0x00660029,0x004ed1c8,0x004465e2,0x004f2cd4,0x005977da,0x00950bd2,0x0116f9b2,0x000b2360, -0xff9f3927,0xffe4e913,0xff66fbad,0x00587bbc,0xffeb9503,0x000797f7,0x002320b9,0x0025513b,0x0013cb4e,0x0006cefa,0x000516b2,0x0006c261,0xffee4e4f,0xffeca12c,0xfff45df2,0xfff939ba,0xfff4ba35,0xfff2fb03,0xffec988d,0xffdd28ba,0xffcecf93,0xffd71ab5,0xffd7b325,0xffd5ae19,0xffee096f, -0xffff61bf,0x001fdb97,0x0047d155,0x006e1940,0x009141d6,0x00a0024e,0x00aa5baf,0x00704cd2,0x00445721,0x004a4e2b,0x0096f409,0x00d1483c,0x00eac3c0,0x00ab73dc,0x009ed0e1,0x00378b2a,0x0015e7e0,0x0021c8f1,0x002e751d,0x003b43aa,0x00308743,0x002007c8,0x001eeb0a,0x001c98a7,0x0021ea98, -0x00250243,0x00127697,0xffef4468,0xffddc514,0xffd17aa8,0xffd1f7a1,0xfff6b6a9,0x001af5ba,0x001f6d16,0x0014bba5,0x00170bcb,0x0014162b,0x001e8275,0x002913e6,0x003d3ca5,0x005b895d,0x0085687c,0x00c3f522,0x00ade9fd,0x00be96af,0x00d2504f,0x00ef6036,0x00f2038e,0x00cd97a3,0x00cbec47, -0x00379b0e,0x001ce27c,0xffe8aff2,0xfff46da4,0xffed68a4,0x000c37eb,0x001344e6,0x000e87c3,0x000a04d4,0xfffe442c,0xfff364c1,0xffe1477d,0xffdadd5c,0xffd84c40,0xffe416d2,0xffe96ffe,0xffe4832d,0xffd86278,0xffdc5c40,0xffefdfae,0x000316e7,0x0019c513,0x001ec864,0x00383f12,0x003cc190, -0x00327074,0x00221bce,0x000e247b,0x00082e7a,0x000f5c8c,0x001fbd03,0x003b9059,0x002ab131,0x0034b438,0x00445e50,0x004930d6,0xffe4b3e4,0xffe78466,0xffe7204a,0xffce13aa,0xffaf7757,0xffaec36e,0xffac7b04,0xffab6b08,0xffb91e21,0xffc02ade,0xffd611b6,0xffd43c77,0xffdcf9cb,0xffe0cddf, -0xffe4a28d,0xffe58064,0xffe9d3cc,0xfff7b1d1,0x000cdc73,0x000859f3,0x00032381,0x0011b4cf,0x00177360,0x00162808,0x0014dabb,0x0017376e,0x00227b5e,0x0030ef9f,0x003da0a3,0x003cf02e,0x00367b35,0x002fb744,0x001d8813,0x000c9c62,0xfff91cc7,0xfff18281,0x000a2836,0x000cbfc6,0x0000340d, -0xfffc3178,0x0000f33f,0xfff95973,0xfff23c4d,0xffec02c0,0xffeca729,0xfff777b9,0x00010684,0x000143b9,0xfffcb153,0x000413fb,0x0007a923,0x0006671c,0x0012a053,0x000b300b,0x0016a9ef,0x000864a6,0x0003d5d1,0x000748de,0x000756dc,0x0008e075,0x000a832c,0x000a11b1,0x0008a272,0x0007fa3d, -0x000af094,0x000e6383,0x00159952,0x001f4bdf,0x001b5552,0x001a8337,0x0017dbf5,0x00147653,0xfffcca7f,0xfff90cc5,0x0018aa37,0x001555c3,0xffefb387,0x000d777a,0x000e507c,0xfff18b2c,0xfff4a3cb,0xfff402b5,0xffef91ee,0xfff37171,0xfff52839,0xfff3449e,0x001c96da,0x0018147f,0xfffb3e71, -0x001e117a,0x001c3a05,0xfff8a32f,0xfffe3c4a,0xfffd0e32,0xfffbb810,0xfffb92d2,0xfffb0226,0xfffac83e,0xfffd5dd0,0xffffc454,0x00019589,0x00046be6,0x00063998,0x0009b074,0x00054f6e,0x00026470,0xffff6712,0xfffe738d,0xfffba009,0xffcf8f0a,0xffd90706,0xffcf0b1b,0xffc21d46,0xffe7898c, -0x003c387c,0xffba9de7,0xffde8ba9,0x00295723,0x00274d5a,0x00294fdf,0x003298f4,0x0030ef57,0x00325144,0x00380ca0,0xffe0ae10,0xffbbede4,0x0037a7fa,0xffdfd9b4,0xffbcac85,0xffca6dee,0xffcf2d16,0xffc922dd,0xffc858e0,0xffca9c6b,0xffcd4f01,0xffd4512f,0xffd2fc03,0xffd2fba7,0xffd07cac, -0xffcec125,0xffca919d,0xffc3fed8,0xffc0e324,0xffc4261a,0xffd45802,0xffd250e6,0xffe92c45,0xffcae6e6,0x000a9b74,0xffdcfda1,0xffe70849,0xfff0689e,0xffe61876,0xfff3cd3e,0xffdf58bc,0xffd4b7a0,0xffde19ea,0xffd1826f,0xffdd8a36,0xffd7883b,0xffee7f3c,0xffe5c656,0xffbd047e,0xffcb161b, -0xffed0bfd,0xffb32678,0xffb56874,0xffa920d0,0xffa8fea7,0xffb1c5b8,0xffc18657,0xffdaa1fe,0xffdb634a,0xffd63e65,0xffc76e05,0xffbfe0b4,0xffb2cde9,0xffa5f8b5,0xff9c4fd2,0xffac711c,0xffdc4f4f,0xffdc74cb,0xffecaadf,0xffcf3240,0xffe00645,0xffeeeaf6,0xfffbaae1,0xfffe812f,0xfffaf376, -0x00084032,0xfffcd9ff,0x0000dc39,0x000c041f,0xfffcd1e9,0x00020f2b,0xfff6aee4,0xfff6c32d,0xffeb615b,0xffc6ce1f,0xffcbba8c,0xffc0d167,0xffb838fc,0xff9f8612,0xff948ba5,0xff8cad49,0xff987e3f,0xffae07e2,0xffd8564c,0xffd54386,0xffd2f1cc,0xffbbce6e,0xffb993ed,0xff9d5913,0xff7d2bbb, -0xff6aac9f,0xff84ea9b,0xffde04ad,0xffd8c451,0x00238aaa,0xfff7217e,0x000d1574,0x00065e0c,0xfffe3076,0x000e0fa5,0x002edc2b,0x004f4400,0x0047f3bc,0x00564931,0x0065bce9,0x00278bb8,0x001a5ce8,0x002d46ab,0x00052f79,0xfff22f19,0xffba8a22,0xffc03be1,0xffbcffdc,0xffa26921,0xff6cddd2, -0xff50c140,0xff468ce3,0xff63ca9f,0xff9d0cd7,0xfffba4f1,0x000350dd,0xffe5135e,0xffb03f8d,0xff9b8e13,0xff762230,0xff4795e6,0xff3c3042,0xff830817,0x00106b2c,0x00141f29,0xff5b6d16,0xff6dff0e,0xffa8b9fe,0xffef26ce,0x0047f6d6,0x0012cc41,0xffcc4b75,0xffa6aebd,0xffbd159e,0xffe965d5, -0xfff39067,0x00561c08,0x005159ae,0xffe05ab9,0x000dc509,0x000e23c0,0x000f5186,0xffeb6bd5,0xffe09455,0xffd13708,0xffdac0b2,0xfffbeeff,0x0001feb6,0xfff343d6,0xffd10584,0xffa6a002,0xff82efdd,0xffb05d93,0x0031676e,0xfff3562b,0xffcb7828,0xffb4d1ad,0xff46f1b5,0xff1c38a7,0xff38369e, -0xff4a2d43,0x0023c2cf,0x0012490d,0xffb8886c,0xff7b1ec3,0xff32b785,0xffa9a51a,0x001c4682,0x0042a61a,0x003476c7,0x00074d59,0xffc9027c,0xffda2c15,0xfffd30eb,0x001dadbe,0x000d8b3a,0xfff86f49,0xfff45227,0xffdd4cef,0xffda7120,0xffb40a32,0xffa1fdec,0xff89ead2,0xff655b14,0xff793350, -0xffabc04b,0xffdce98a,0x0062844e,0x005a15ae,0xffe6a299,0xffc0684f,0xffcbd968,0x0027db0d,0x003ed3fa,0x006d7867,0x00a305cc,0x003df813,0xff2c7076,0xffba689b,0xffc9b923,0xffc4b53f,0xffece7e8,0xffeec9cd,0xffe84dce,0xffb98cc8,0xffe192c5,0x0000bb38,0x000fb24d,0xfff3d380,0xffeacc5a, -0xfffd2d0b,0xfff580cc,0xfffdf020,0x00075f03,0xfffaae79,0xfff272da,0xfff1efec,0x00098701,0x002015ac,0x0030211a,0xfffdf82e,0xffc3da48,0xff860115,0xff76a173,0xffa707ce,0xfffecd10,0x00196bf9,0xffd6b1e0,0xff591eb4,0xfe62a60e,0xfe2d1176,0xfea48e00,0xfeeeb9da,0xffba7874,0x00032aac, -0x000a7172,0x000974b9,0x00302499,0xfffeb516,0xffff58c0,0xffff3f7a,0x0002894c,0xffef6a9a,0xffe6bf47,0xfff33754,0xfffaac69,0xffebd8bc,0xffef6ffd,0xffe32876,0xffca4e2f,0xffc1792a,0xffc36f7b,0xffc51c33,0xffa71d7a,0xff91f6f4,0xff8eada7,0xffadca79,0xffe4ce3d,0x002576de,0x002bf9f4, -0x002b3dfa,0x0029aee6,0xfff17856,0xffd35a1b,0xfff06083,0xff873504,0xff4d2c8a,0xff0ed2da,0xff764ca1,0xff1c77ac,0xff5a9348,0xfff4906b,0xfff299d8,0x0000f846,0x00235b49,0x00232b06,0x00085d67,0x000df225,0x000ef7d3,0x000e551e,0x001cdf56,0x000ed8ff,0xffeb8b90,0xffd93e31,0xffcb2f30, -0xffcdcb55,0xffd382f1,0xffe7bc5b,0xfff60046,0x0002e1ee,0x00102d61,0x000b9efe,0x0009b792,0xfff4bad2,0xffd30f99,0xffe41052,0xfff07519,0xfffb5027,0x000be961,0x000ad308,0xfff004c6,0xffd16370,0xffab2068,0xff6fa1d8,0xff432cb8,0xffe11729,0xffbacd51,0xffef206f,0xffdcd62c,0xfff32df0, -0x00020988,0x0014f20d,0x000ed343,0x000daab8,0x00057f47,0xfffba551,0xffe0fb0a,0xffd52742,0xffd25632,0xffd771f5,0xffd20609,0xffca13d9,0xffcb858a,0xffd76997,0xffed655d,0xfff349eb,0xfff3e0af,0xfff098d9,0xffefeb99,0xffefaec0,0xffead1ec,0xffea8b49,0xfff680e6,0x001246a7,0x000be2c4, -0xfff88aba,0xffce2ec6,0xffe928ae,0xfff8d081,0x0007152d,0xfffc6ade,0xffb6acfe,0xffb554ff,0xffa6caeb,0xff952206,0xff884728,0xff8f1ff1,0xff9a15be,0xffa0aee4,0xffb07175,0xffbb4ee8,0xffc63709,0xffceb3a0,0xffdb9035,0xffdb6fb1,0xffdf24a9,0xffdc28d2,0xffde1995,0xffe16381,0xffe03376, -0xffda3e76,0xffe9478c,0xfffbe2a7,0x000eebdd,0x000bdb17,0x000a4601,0x000cbb39,0x0000f3d2,0xfff49866,0xffe8d8d7,0xffdf6f2f,0xffdaa194,0xffd06da1,0xffceb2de,0xffc6d912,0xffc2e6f8,0xffba8987,0xffe9c40b,0xffe2b3ff,0x00035e1e,0xffe2d2fc,0xffe3eb2e,0xffe3cf5c,0xffd38a92,0xffcc8d4a, -0xffc8a56f,0xffc4c206,0xffc770ca,0xffc23983,0xffc86528,0xffc94e63,0xffdbb11b,0xffe77391,0xffe1f883,0xfff15902,0x00034fcf,0x000509de,0x000e4334,0x0009c521,0x000b90f7,0x000cc97a,0x000fbd17,0x0012cc82,0x000d1fb3,0x0006dade,0xfffde6b1,0xfff3a9a6,0xffe79d07,0xffdc1799,0xffdf0772, -0xffe282f8,0xffe640ae,0xffe738fd,0xffd7b393,0xffd3e644,0xffcb926d,0xffdce552,0x000c454f,0xffbdbd59,0xffd24200,0xfff97358,0xfffe646f,0x00017395,0x000674e8,0x000a5b6a,0x000e5b57,0x00120c53,0xffd8a358,0xffc8519e,0x00152f9f,0xffe31fa5,0xffd6bed1,0xffe902b7,0xffe79758,0xffe70760, -0xffe79d7a,0xffe81e71,0xffe84cd7,0xffe9b750,0xffe53ba1,0xffe258fb,0xffe00e77,0xffddf6be,0xffdc6431,0xffd86f14,0xffd8f2d0,0xffd733bf,0xffd61bc0,0xffd517b5,0xffce5356,0x00373fa3,0x002f145f,0x00427da2,0x0028507f,0xfff28604,0xffa43154,0x003c085f,0xfffbbaab,0xffb56c5d,0xffac4d09, -0xffac0696,0xffaf8cdb,0xffa878c7,0xffa66dfa,0xffa3219c,0xfffac413,0x00344936,0xff926574,0xffed6c53,0x001e36ac,0x003bf743,0x002b3b16,0x00333beb,0x0033663d,0x00378b40,0x003adf6a,0x0041d82a,0x003d8797,0x003d6760,0x003baf24,0x003fb5df,0x003e8750,0x0038de50,0x00378c7b,0x00343718, -0x002c8814,0x00341702,0x004108aa,0x004d6d23,0xffe94754,0x00400bb4,0x001dfc16,0x0011ebff,0x0028780e,0x0029d728,0x002d5f8d,0x002d64c8,0x0022a4f1,0x00300317,0x00292eee,0x0023f300,0x00121cd7,0x001303fa,0x000d851c,0x000c9843,0xffc94e59,0x0029527a,0x0027a2f8,0x0030d547,0x0039b321, -0x004730c1,0x00546e8c,0x0067f4f3,0x005e54da,0x00582cfd,0x004f8289,0x0055f972,0x00526ec5,0x0044ad86,0x0040d200,0x003b0b7d,0x002e6607,0x003f1bab,0x00430720,0x00394a1d,0x002ad87b,0x0033674e,0x00172cda,0x001c8d55,0x00120ccc,0x0026776a,0x000896c7,0x000feacf,0x001e43b5,0x0025dffb, -0x00106923,0x00206d1c,0x00120f11,0x001f44ed,0xfff1324f,0xfff87f1a,0xffefcb14,0x000bf340,0x0025b9e6,0x002c1dff,0x003da083,0x005315f5,0x0068d39f,0x008ef40f,0x007785d1,0x0075e59e,0x0068ee27,0x0081a030,0x0079cfe7,0x0055974e,0x004df95f,0x0038b21d,0x0020f441,0x003b10b3,0x0067f5c2, -0x004b554d,0x00425d10,0x004c298e,0x002537df,0x002876b3,0x003418d5,0x004d06ba,0x00472a33,0x0050c379,0x00572cd2,0x0020a36b,0x00254b2a,0x002f66f5,0x001d8600,0x001720c4,0xffcaee56,0xffe5357f,0xffc90ff0,0xffe6ad5a,0x00050da7,0x001858f3,0x0042d768,0x0070abce,0x00a7f2ab,0x00ed09e6, -0x00cc8dcd,0x00a286db,0x007d0a6f,0x0098e2c7,0x008d0dd8,0x005912f4,0x0054ab61,0x00486479,0x002ff7e7,0x00546dab,0x0021a906,0xffef7628,0xffdcdac0,0x000b7ef0,0x00387b0c,0x001da594,0xffee6f8e,0xffb67be6,0xffc2c4cc,0xfff10f35,0xfff8707e,0x005b20f1,0x0055aa48,0xffe6ea99,0x00119d31, -0x001d56e8,0x002801aa,0x002f49d9,0x001397d8,0x00360af2,0x008addbb,0x00707f23,0x005a9105,0x00263390,0xfff4e8fc,0xffb71d7e,0xffdc3159,0x00384996,0x00d6dde4,0x00b15807,0x00b94046,0x00dbb5fd,0x004d12fc,0x0006b2ae,0xffec28be,0x000245f1,0x006522ea,0x0065ae4d,0x001912ac,0xffc1a4dc, -0xff7f4a4e,0xffb6caab,0x000b6a0f,0x003afa10,0x003c9aa0,0x0015a4a5,0xffce8eb8,0xffd540c8,0xfff8579a,0x001e4b82,0x001b4824,0x000fc100,0x000a0cb4,0xffeb4b56,0xffd12514,0xffe2e6b6,0x002bc841,0x004153fa,0x006833d3,0x002d0902,0x0022937e,0x00285c15,0x00793c71,0x00604467,0xfff9883b, -0xffedf3ff,0x0007eebc,0x004d47a5,0x00a056e6,0x00b7a204,0x00831bd0,0x0068388d,0xff34b59f,0xff8564a9,0xffb3c4bb,0xffcefcdd,0xffe57eeb,0x00092cf0,0xfffb0e87,0xffbde98c,0xffe1a6a7,0xffffb550,0x00166107,0x0001ed41,0xfff48985,0xfffb0199,0xfffb6a45,0x0012fcc3,0x00157d7f,0x002015a6, -0x002256e2,0x0020b1aa,0x0035146c,0x00370cec,0x004440e4,0x007ba63b,0x00a207ef,0x00a38335,0x009ffe7e,0x009ee10d,0x008e35dd,0x00eb7378,0x0105dfe8,0x00cc5d88,0x004aa5f3,0x00093431,0x002fbdbb,0xff70e874,0x00abd7b8,0x0033a542,0x002621f4,0x003a9a7b,0x00361dcc,0x001b27ee,0x0003121d, -0x000c9cec,0x00069d67,0xfff37d41,0xffeb66fa,0xfffbd644,0x0000f914,0xfff73312,0xfffee91d,0xfff168f9,0xffddef17,0xffd47c96,0xffc67b27,0xffdb7b17,0xfff7de86,0x000f68a3,0x0022bb8f,0x003f8b37,0x00557042,0x006d4ad6,0x007babc7,0x007c964f,0x00757638,0x002fbb92,0x00220588,0x00563cfb, -0x00be70e2,0x0106f5dc,0x01438064,0x00df11ae,0x0072be86,0xffe8d0c2,0xffaa4a6e,0xfff80755,0x00174ba5,0x0022dfe4,0x002a4f19,0x0022cce2,0x001e87b2,0x002629c7,0x001b36c5,0x00221a27,0x0014e5db,0xfffe3448,0xffdffb77,0xffcdad38,0xffd39a21,0xffe75f72,0xfff3d71b,0x001647e1,0x0013c083, -0x0010a7dd,0x0016aae5,0x00228141,0x00382710,0x005d0eb9,0x007eb55a,0x00a52ce8,0x00e182a5,0x00ca8c78,0x00d90b45,0x00edda04,0x010b8322,0x00f1d0f5,0x00ac29ed,0x0088f651,0x00817543,0x0041d9ef,0xffec43c6,0x0013be18,0x00138489,0x00312442,0x003bb139,0x002a0950,0x002de78f,0x001d209f, -0x000e6755,0xfff1e040,0xffe4906c,0xffdb256a,0xffe53977,0xffe8c8ce,0xffeaa708,0xffd4da4f,0xffd80387,0xffe16bc9,0x00073405,0x0023cd36,0x00295d95,0x003d6186,0x003db11e,0x002ff21c,0x00209f25,0x000ee002,0x00042886,0x00152dca,0x00380327,0x0072f916,0x00669bcd,0x00738657,0x008ba27b, -0x0085a20e,0xfff70333,0xffdf9551,0xffcbb0c9,0xffc6277c,0xffa1349a,0xffaa12f9,0xffaf7b54,0xffb7fed6,0xffb96a95,0xffc8e688,0xffcf7d34,0xffddc272,0xffd6769c,0xffdf19f6,0xffde9fa3,0xffe36aea,0xffe225e1,0xffeac0c1,0xfff28f29,0xfffcdfed,0x0009287a,0x000ebfcc,0x00192de4,0x00147df3, -0x0012b37d,0x0013545d,0x00205e9c,0x002deccc,0x0038b229,0x004053e4,0x003ebcb4,0x00419420,0x0031c9d0,0x0023f319,0x001549b4,0xffff481b,0x0011f9f2,0x000e4945,0xffdc601a,0xfffc37d7,0xffefa0f8,0xffe8df6a,0xffec8eaf,0xffe2a344,0xffed83b1,0xfff3fb01,0xffee9e9f,0xfff9bdd8,0xfffa9d75, -0xfffd1e5c,0xfff7bab3,0xfffbc03c,0x000d4879,0x000a4ef3,0x0000196f,0x000a7f81,0x00040f35,0x00093b16,0x000bebea,0x000ec611,0x0012b43e,0x0013b763,0x001ad7c7,0x00219280,0x002a3c46,0x00314e5a,0x003ae3fc,0x0045d243,0x0039f4da,0x0030c432,0x0027e139,0x001f036b,0x00018cf8,0x0003c62e, -0xfffc92a2,0xffe1f4c5,0xffb82319,0xffff4ed6,0xffde80b5,0xffb655e6,0xffb6dc1d,0xffb58590,0xffb667a7,0xffb42230,0xffb3324f,0xffb25e75,0xffeb0d29,0x0009139f,0xffbed7cb,0xffef4056,0x0007b6c0,0x000747e7,0x0005c4ae,0x00073a4f,0x00060fa4,0x0006ffe7,0x0007713b,0x00078feb,0x000b71c8, -0x000e66b9,0x001163bc,0x00155087,0x001880b0,0x001f1331,0x0016ce1f,0x0011c035,0x000bf2e4,0x0007fd9c,0x000523f8,0xffcab576,0xffd5d484,0xffb74967,0xfff81255,0x003444ef,0x006a4992,0xffdd27bf,0x00233eea,0x0061836e,0x005f9b87,0x005f602c,0x0059f3ff,0x0064e7af,0x006657f8,0x00640c90, -0x00290ee2,0xffe83a37,0x00658cb2,0x0027eef5,0xfff38c7f,0xffb5f0ba,0xffcb8049,0xffc46ae2,0xffc38435,0xffc74ea7,0xffcacb97,0xffd3cbf6,0xffcebb5e,0xffcd6478,0xffc93d10,0xffcac430,0xffc7c64a,0xffc053ed,0xffc138b9,0xffc515b8,0xffd3467e,0xffcf7979,0xffe17790,0xffcc86e7,0x004eb135, -0xffe33900,0x000d535d,0x00080757,0xffed740b,0x000115ea,0xffdacddd,0xffdb85c7,0xfff4ec74,0xffe37be3,0xffe95ef6,0xffe8b852,0x000ac797,0xfffcfcbf,0xffe1db59,0xffdad7db,0x0022b34b,0xffb69efb,0xffab6eaa,0xffabb697,0xffa7ce7e,0xffb4d2e5,0xffc35643,0xffde60e5,0xffd4db67,0xffcd2d08, -0xffbdd31c,0xffbef2c9,0xffb86542,0xffabc403,0xffae2d08,0xffbd6e18,0xffe4014e,0xffe2f1c2,0xffdb3af4,0xffcceaba,0x000bb0d9,0x0001612e,0x001f9556,0x000abae6,0x00015111,0x000d6f51,0x00017eb8,0xffea164b,0x000b8edd,0xffed5b4b,0x00192844,0xfff5f0f8,0x0017c5eb,0x000367bf,0xffe32dda, -0xffe2cb2d,0xffe6b7fa,0xffc1b307,0xff90e9e2,0xff998c27,0xff8e336a,0xffa42a3b,0xffba551d,0xffef2b48,0xffd3fe04,0xffccb9e7,0xffb0ce3b,0xffbcd568,0xffabda38,0xff85f6ff,0xff902489,0xffa6b143,0xffe7b6d7,0xffe46bab,0x001021e7,0xfffca1c8,0x0033b070,0x00142f8e,0x0016f557,0x000d7340, -0x001bdd04,0x0046bce5,0x0033d413,0x00409945,0x003e2a29,0x002453b4,0x001c2215,0x001c2ffa,0x0011eb0c,0xfffbf029,0xffda3be0,0xffbdf460,0xffd642f7,0xff9f704c,0xff5be113,0xff615141,0xff56cb44,0xff831996,0xffbd799e,0x001ea6d1,0x00000969,0xffd506dc,0xff9c2c32,0xffa70174,0xff98babf, -0xff6958ea,0xff89cc60,0xffc46cdd,0x00266030,0x002e1695,0xff2b6953,0xff88bf35,0xffd80364,0xfff905e6,0x005009c8,0x0031a6cd,0xffeb2a2f,0xffaf45a2,0xffb8c464,0xffe5fbe2,0xfff85d31,0x00525fd2,0x004d1c68,0xffec28f2,0x000833e8,0x00031646,0x002bd409,0xfffe77ca,0x001a8238,0x000328a2, -0xffdba550,0xfff477d2,0xffd10289,0xffd35cd6,0xffa58d61,0xff7605ac,0xff5cd878,0xff94e61c,0x00124c90,0xffd34ab7,0xffb797fa,0xffbe2bb1,0xff4f4960,0xff279e4c,0xff32185b,0xff3ca319,0x0019c59b,0x001d6f7e,0x0008babc,0xffa47fec,0xff466f60,0xff8ddfdf,0xffe674db,0x00262fc2,0x00348990, -0x001361ac,0xffcd4e6a,0xffcde2f2,0xffee6378,0x001211a0,0xfffea6d7,0xfff1699e,0xfff4cced,0xffe6b1e5,0xfff79c11,0xffbf9663,0xffa516bc,0xff9e3922,0xff7071a9,0xff84839a,0xffbc8ea4,0x000d05f5,0x00763844,0x00579949,0xffd4d1c3,0xffc15b3c,0xffe44c1e,0x003d225e,0x0079206f,0x008515c1, -0x00594e6e,0x003a63f4,0xfef39584,0xff198a32,0xffc66731,0xffe029c8,0xffef4444,0x00108481,0x0008d05b,0xffb28ccc,0xffd4f157,0xffef7b3b,0x000ee723,0xfffbaa2b,0xffef1efd,0xfff472a6,0xfff05b56,0xfff4ecdb,0x0015290c,0xfff59863,0xfffc738b,0xffe3b6b4,0xfff4267a,0x0020683f,0x001f753d, -0xffeac7e4,0xffa9761a,0xff7183e7,0xff5d5ff8,0xff87d683,0xffccff39,0x0019ca2c,0xffca539c,0xfef52b50,0xfea938e4,0xfeb2562e,0xfefe4462,0xff0b1f5e,0x001d4380,0x00665120,0x003af9f0,0x001a5d85,0x00413e1b,0xfffdbc77,0xfff84711,0x00003568,0x00015a64,0xfff541f4,0xffe9bcbc,0xfff6e796, -0xfffe33dc,0xfff2a560,0xfff8551a,0xffee36f1,0xffcfec61,0xffc14db2,0xffd7f02a,0xffc2c1cd,0xff9e7fd1,0xff971f1a,0xff93af96,0xffc4034f,0xfff5c0a2,0x0033d38f,0x0036f2eb,0x003601d8,0x003008e5,0xffeeb7d7,0xffd40bce,0xffcad675,0xffad9e4d,0xff8bd67d,0xff66b1bf,0xffdcee53,0xff0e7e2b, -0xff8051b5,0x000fb676,0xfffea0a8,0x00086f18,0x0025da69,0x0022a36f,0x001715ea,0x0020bc02,0x0015d1c5,0x000f032b,0x00144523,0x000c4cb9,0xfffc9c68,0xffddab16,0xffca9523,0xffc85bf2,0xffcdfb0e,0xfff1a6da,0xffe75880,0xfff71e7c,0x000f4a71,0x0003b90a,0x001136f7,0x000d39b0,0x00094bd5, -0x00191d8e,0x0026331e,0x00335877,0x002815ab,0x001c8cf7,0xfff31d1f,0xffee5c33,0xffc0f0f2,0xff58de26,0xff36da80,0x001195ea,0x000d13c6,0x0042e449,0x00278f14,0x0039ef52,0x003a1f7b,0x00355e1e,0x002e101c,0x0025902c,0x001a8fc5,0x00077847,0xfff20ec6,0xffdd8533,0xffd1257c,0xffd50c28, -0xffd83eb2,0xffdb9d0d,0xffd417d1,0xffd3f358,0xffe10bf2,0xffe04a93,0xffe2a221,0xffe4be04,0xffef86fb,0xfff2568e,0xffe8f255,0xffe35d0f,0xffe77179,0xfff7f548,0xfff572c1,0xffe6212b,0xffc2089a,0xffdd9464,0xfffcd762,0x00206526,0x002a7d22,0xffa9e528,0xffb1c518,0xffbec31c,0xffa777a4, -0xffa65af6,0xffa72183,0xffb14ac2,0xffb44a51,0xffc577f8,0xffc36d79,0xffd742df,0xffcb2c30,0xffdfe973,0xffd4b6eb,0xffdfb9f5,0xffd7b3ee,0xffdc5967,0xffde8f02,0xffe5e91a,0xffd0ec95,0xffd33ef6,0xffebd556,0xfffb33f1,0xfff8bc8a,0xfff7015d,0xfffaf39d,0xffefd10a,0xffe5eae4,0xffdc49aa, -0xffd5d8c5,0xffd2de41,0xffccdf6f,0xffd3b3ee,0xffd13474,0xffcb3c57,0xffbcc250,0xffe241e6,0xffdc4024,0x000f02bc,0xffd8d282,0xffe5e49f,0xffe2ef6a,0xffcb98ea,0xffc6e661,0xffbd8ffc,0xffc13477,0xffd1fa28,0xffc654d7,0xffc7730a,0xffce74dc,0xffe2b6e9,0xffe53fe0,0xffdf73eb,0xffe5c73c, -0x00051ade,0xffec1b0b,0xfff77c29,0xfff737e5,0xfffa8804,0xffffa9ef,0x00055b80,0x000b7e9b,0x00032819,0xfffcd979,0xfff5b93a,0xffee3d28,0xffe55cdd,0xffdbb194,0xffd96707,0xffda3a10,0xffdde84d,0xffe18def,0xffc9e5ff,0xffbf724f,0xffdc34d4,0xfff9735c,0x001904d5,0xffc697dd,0xffee3a9b, -0x000e014b,0x0015500d,0x00187547,0x0017af3c,0x0020d284,0x00267e90,0x0028abb8,0xfff9dad8,0xffd455a0,0x0029934e,0x00003881,0xffe446d2,0xffd10434,0xffd8b97a,0xffd773de,0xffd8f127,0xffd9e636,0xffda6e84,0xffdcd94b,0xffd8f254,0xffd6b5df,0xffd47541,0xffd25cdf,0xffd10e87,0xffcf56aa, -0xffcf7dca,0xffcd72f0,0xffca8406,0xffc7f018,0xffc05fce,0x0026eca6,0x0022470d,0x003b90fb,0xffec8c95,0xffbb1628,0xffaa9932,0x00070503,0xffc3e0ce,0xffa84de5,0xff9d68b9,0xff9e098d,0xffa974ec,0xffa2d804,0xffa3a43a,0xffa54db1,0xffc5da26,0xfffffaf1,0xff9ea00e,0xffbc1271,0xffe5135d, -0x003351aa,0x001cbb30,0x0023363a,0x0023cb48,0x002888f3,0x002b6de6,0x003161e0,0x002b8ad6,0x002af493,0x0028e164,0x002cf458,0x002b10d9,0x00248892,0x002164a6,0x001fb138,0x001f33e1,0x00254cff,0x003aaf67,0x00313108,0xffc0b347,0x00253287,0xfffed812,0xfff5165d,0x000c676c,0x0010f73a, -0x00158705,0x0008a495,0xffefaeef,0x000c5ca3,0x001314f5,0x0005594a,0xfffe9b06,0x0003f977,0xfff29605,0xfff9afb1,0xffac5216,0x000b69b9,0x00184907,0x0017d4f6,0x00248ff5,0x0035eee7,0x00450973,0x0055b062,0x00469609,0x003ca72d,0x00313fb6,0x0038f012,0x003337a6,0x0022df72,0x0019c344, -0x0019ffc0,0x002222ae,0x002f7384,0x0043097a,0x0021aadd,0xfff5d53b,0x001103ee,0x000944ab,0x00031031,0xfff83e19,0x001366be,0xffe6cfbb,0xfffcb41b,0xffea9484,0x001f01ab,0x0002105e,0x000ef28b,0x00030ae0,0x0015feed,0xfff235bd,0xffebf7d5,0xffcec57c,0xfff0be0a,0x0017f8ad,0x00128d25, -0x0022bb87,0x003cc292,0x005192b5,0x0070c248,0x00521607,0x004dd6a2,0x00403938,0x0057541f,0x004b45e6,0x002466bc,0x00119b75,0x000c3e6b,0x001bdec8,0x002aae5e,0x00753fdf,0x0033d7a8,0x00150849,0x0034e143,0x002bdd20,0x00142ae0,0x0020b2d4,0x004748d7,0x00376a47,0x0037a216,0x003ba292, -0x002021af,0x0029d867,0x002d2c8e,0x002a7a8d,0x00294b8e,0xffd0dd37,0xffe90d03,0xffad5519,0xffc9ddc3,0xffefb1e6,0xffeebf8e,0x00183f26,0x00515f5a,0x008ce6fc,0x00c9c0b5,0x0097d1f4,0x006838ac,0x0041fd9a,0x005bd975,0x0049aa32,0x001096bf,0xffff0ea3,0x000c694e,0x0034f4dc,0x004ce573, -0x0001b966,0xffbd1cc3,0xff86f88b,0xffc9cc30,0x0018e264,0x001452c2,0xfff6b121,0xffb1f2d4,0xffbbf91e,0xffeb9f95,0xfffd68c7,0x0051aae2,0x004b5d59,0xffee8692,0x0003a538,0x00123b9e,0x002bbe66,0x003a344b,0x000c8f17,0x002f8842,0x0095499b,0x0077ef52,0x0074462d,0x001e63a9,0xffece508, -0xffd17959,0xfffd8208,0x005d55ef,0x00df551b,0x00a5dfbf,0x0091e042,0x009598c7,0x00124d1d,0xffe152b4,0xffd9123a,0xffd9aa5c,0x00a31862,0x006c0d0b,0x001487ea,0xffcdeda5,0xff759fea,0xff8f0e05,0xffe198bc,0x001c9685,0x0037f770,0x0018f3eb,0xffd6548e,0xffce3496,0xffeae93b,0x001998ed, -0x000d5a7a,0xfffef77e,0xffeedc96,0xffefff99,0xffd5b6a9,0xffd7e028,0x00163ce7,0x000b5322,0x0026cf93,0x0009a612,0x0017f084,0x003bac85,0x006d9423,0x0046c3ab,0xffe57f01,0xffe6149c,0x0001e343,0x002c4070,0x007f7eae,0x0085274c,0x003c2e46,0x0061c486,0xff0045be,0xfee0e904,0xff9c1a95, -0xfff091b1,0xffcacc74,0x00253c32,0x000901c0,0xffba1f45,0xffd4632f,0xfff4d06c,0x00114bb3,0x000b53e1,0xfffbd1e2,0xfff209d4,0xffef5e63,0x0007a3d8,0x000da4bc,0x00120929,0xfffb3c9c,0x0000fdd8,0x003c29ec,0x0034cbda,0x0039b021,0x005d409f,0x006a179c,0x005c5352,0x00639d58,0x00787cbb, -0x006d9738,0x010b775a,0x00e8141b,0xffea48c4,0xffd15722,0xffbc69c7,0xffd44141,0xff5e9e64,0x00a6f676,0x008189d5,0x004d8792,0x00413591,0x0039cf1d,0x00157d1e,0x0001163d,0x000fc2de,0x00068508,0xfffb48fa,0xffeb9fe1,0xfffbd9b1,0x000125d4,0xfff96571,0x000248eb,0xfff05778,0xffdac3f8, -0xffd3bf73,0xffbb9966,0xffd4ed43,0xfff45436,0xfffc9b83,0x000b53b0,0x00267ee2,0x0037e27a,0x00502716,0x00473742,0x00374198,0x001a739a,0xffdc76cb,0xffe320b0,0x00280d85,0x00525b6c,0x007304e9,0x00a03fd9,0x00817449,0xffc96b86,0xff821693,0xff79c954,0xffd8d0ce,0x0000a46e,0x000a8b9f, -0x001a3ae6,0x001c22be,0x001798a3,0x002262e4,0x000f80c3,0x00152b91,0x000def2d,0x00063221,0xffe0c19b,0xffcc1e5f,0xffd160b2,0xffd0a33e,0xffcb8e15,0xfff61a6d,0x0003c358,0x00065036,0x0012c2c7,0x001b91cc,0x002e40a9,0x004c9621,0x005f02a7,0x0073de61,0x0095d982,0x00918d7c,0x0096faaa, -0x00959b02,0x00993512,0x0068a393,0x00171344,0xffd41af2,0x007e2f3f,0x0038255f,0x0006f9dc,0x00260c71,0x002ade72,0x003eeea8,0x004b37cb,0x0038cee2,0x003fa962,0x002fffef,0x0020b497,0xffffe63d,0xffebacd6,0xffda6293,0xffde9cb5,0xffdebe6d,0xffe3eeb1,0xffd61d7a,0xffdb5b61,0xffdd2803, -0x0000afee,0x0014777d,0x0018aa14,0x001cbaf7,0x001884f2,0x000b7488,0x0006ef06,0x00066c36,0x0006b042,0x0016e317,0x0032351a,0x005afe9b,0x00615aae,0x006ecaf4,0x00869970,0x007c38de,0xfff09b12,0xffce6b44,0xffb0785b,0xffb574a3,0xff9899d5,0xffa82d10,0xffb59d83,0xffc431fb,0xffbee482, -0xffcf54c3,0xffc8d05b,0xffdd8b60,0xffd025f1,0xffd62666,0xffd490d2,0xffd8e260,0xffd43e2f,0xffd7ba34,0xffd397a0,0xffe5a0eb,0xfffd728c,0xffff0451,0x000db1ec,0x0008fcae,0x000915c7,0x000a5b49,0x000d0a62,0x000dd583,0x000d2d43,0x0015a5e1,0x0018e0dd,0x0021a3cd,0x001d098d,0x00180a0a, -0x00139a87,0xfff6a733,0xffffbfa8,0xfff5eabc,0xffca61ee,0xffea8c9d,0xffd73c73,0xffd3955b,0xffd7b7dc,0xffcd5cd2,0xffd9f324,0xffd9ea25,0xffce10f5,0xffdac0fa,0xffe188b3,0xffe0399a,0xffdc8219,0xffe61ef5,0xfff1e7fb,0xfff88f8b,0xffe91f91,0x0001040c,0xffff165b,0x000252c3,0x00068ad1, -0x000a81e0,0x000fbbc8,0x00137f0c,0x001bfdf5,0x0023e5b0,0x002a5513,0x002e1841,0x00312af1,0x003418ad,0x00267a9d,0x001a4794,0x00110dfa,0x000840cf,0xfff1f524,0xfff5b3dd,0xffd40fb4,0xffba478d,0xffaeb1d0,0xffdabc18,0xffb71618,0xffa44b28,0xffa4c5e1,0xffa4a538,0xffaaab98,0xffa68762, -0xffa5aecd,0xffa77ccd,0xffbfbabd,0xffe3872f,0xffb29271,0xffc7389f,0xffe33c30,0x00014a8d,0xfffba404,0xfffeabe9,0xfffed524,0x00007235,0x0001b1cc,0x0002b7f1,0x000441d4,0x00053c59,0x0006e02c,0x0008dd0d,0x000aec14,0x000fa3f5,0x00088124,0x0003c719,0xfffdd0fc,0xfff8aa3c,0xfff56735, -0xfff250cd,0xfff6eea6,0xffdd8674,0x002e6df5,0x004e5d2d,0x003ebf7a,0x00184d82,0x00417d62,0x004539fe,0x004014e6,0x003e04d1,0x00316ffe,0x003f8713,0x004057cd,0x003876ce,0x004856a2,0x0023f89d,0x00367f96,0x0043151c,0x0029a0a4,0xffdcee2c,0xffef5a83,0xffed928d,0xffed63a3,0xfff2644d, -0xfff62ad9,0xfffef171,0xfff7c720,0xfff5d07f,0xfff0bafe,0xfff68721,0xfff53a60,0xffed12b1,0xfff0ec1c,0xfff2a4ac,0xfff738b8,0xfff59e26,0x0000a867,0xfffe2222,0x0052ded1,0x0008bbd6,0x002ee910,0x00191451,0x00056075,0x001742ba,0xfff39d0a,0xfffb3fbd,0x001122a9,0x000b7335,0x0009b115, -0x000bb300,0x00217446,0x0017543a,0x0011af39,0xfffb36a8,0x00258bf9,0xffe606b9,0xffd6fe74,0xffe44a5f,0xffe41238,0xfff49d95,0x0000f1c8,0x00172c2e,0x00061e76,0xfffcdea6,0xffeea12e,0xfffab47f,0xfffa8d22,0xffebdb54,0xfff750ea,0xfffe1e11,0x000a1aba,0x000c21e7,0xfff692d9,0xfff3cca9, -0x00306368,0x001ce421,0x0037c24f,0x00143ef5,0x00058504,0x0015ccc3,0xfffeb0e1,0xffe0812e,0x0005317c,0xfff417b6,0x0023c733,0x0004d555,0x002d3e06,0x0020b272,0x000738a0,0xffff49b7,0x00066fa3,0xffe6191b,0xffc4f52c,0xffdad9c7,0xffd97067,0xfff75f6f,0x000c2e64,0x003c8155,0x00131022, -0x000aa93f,0xffeeee2f,0x000de30d,0x00096657,0xffdc7e49,0xfffa0b4d,0xfffe3d42,0x000b5d43,0x000f6d5f,0x002055d1,0x0019037e,0x0048e3a0,0x002c12e3,0x0033b7c0,0x000ebab1,0x000b1544,0x00371f8b,0x001e1e0d,0x00256725,0x001384af,0x001e5be8,0x0023ad3b,0x0015971f,0x002305ef,0x0014edce, -0xfffc8b76,0xffd2cb5b,0xffe1d8ad,0xffb73252,0xff973e4f,0xffbc9fee,0xffc92301,0x0003a56f,0x003a89b9,0x0084683b,0x0049200b,0x0016a101,0xffe18fba,0x000fdbee,0x0014d091,0xffdf3480,0x00190e49,0x00308819,0x00421637,0x004ec442,0xff68c115,0xffc94cf6,0xfff5dd5e,0xfffcf1dc,0x00443131, -0x0038f406,0x00044c4b,0xffc1315c,0xffc3b35d,0xffedb133,0xfffee44e,0x00461e5d,0x003eb76d,0xfffc610b,0x000254e1,0xffffc486,0x003d986a,0x0027cb99,0x005225a7,0x00540024,0x002d8657,0x002375f2,0xffe5aec5,0xffd294b2,0xff99ff5a,0xff6f54e5,0xff7d2f60,0xffce7c09,0x004a8ced,0x0016d2f8, -0x000bc2ac,0x002c2c20,0xffbcf7a3,0xff914f8b,0xff826c29,0xff82cd46,0x0029518d,0x0040c0fc,0x005a1741,0xffe635b6,0xff729f19,0xff8a4398,0xffc70c22,0x000f2b49,0x002c3945,0x0016af58,0xffd9674f,0xffcb0a46,0xffe53ad7,0x000cd24a,0xfff910dc,0xfff3dd2d,0xfff837bf,0xfff89ae9,0x00095824, -0xffe15a3b,0xffe0ad89,0xffec40ac,0xffdbe5d8,0xffd36d5f,0xfffad702,0x005308e0,0x00776062,0x00405894,0xffc5c35b,0xffd1173c,0x000ac99c,0x00562de1,0x00b3729f,0x009fa838,0x001b1eaa,0x0033b93e,0xfef7d738,0xfea11442,0xffa9b389,0xffed5dab,0xffdaa13b,0x002a37e0,0x0021c006,0xffbe8534, -0xffd5cb1e,0xffe937cf,0x000d4ea1,0x00093f27,0xfff8dda0,0xffebe900,0xfff10035,0xfffa8c9c,0x001f5ac6,0x0002a9d2,0x000eb248,0xfff10112,0xfffa38cc,0x001fefe2,0x0019729d,0x000b5cd9,0xffec4d86,0xffd2eb50,0xffc34ddc,0xffd7b448,0xffe5b044,0x006b2cca,0x0038e02f,0xff53cd59,0xff827552, -0xff9cd5ef,0xffb506c2,0xff66532c,0x00a6e4c0,0x00bcfd07,0x0072cf15,0x003ecc94,0x003d6b9c,0x0009e56a,0xfffccbae,0x000736b2,0x000491b6,0xfffe480c,0xfff00873,0xfff8c284,0xfffe8f08,0xfffe74cd,0x00016397,0xfff8732a,0xffdf1ca6,0xffcd077e,0xffe06a09,0xffcc4090,0xffbfef45,0xffcfa989, -0xffd919e9,0x0007ce9c,0x00288df3,0x00518376,0x005259df,0x0049bdb3,0x0030b71b,0xfffc9d65,0xfff0a244,0xffe14996,0x001de6f5,0x0030a138,0x00476187,0x007e5c53,0xff8e53e1,0xffcbced1,0xfff9c922,0x0002fc40,0x0013a9a2,0x001dc0e1,0x001b0033,0x0025037f,0x00298803,0x001cb77a,0x0011c60b, -0x000bc4df,0x00078452,0x0009c257,0xffe2e673,0xffce09ef,0xffc6c300,0xffd0fcfd,0xfff15d3e,0xffe2d446,0xfff04bb7,0x00079103,0x00034dda,0x001d0253,0x00325b05,0x00534b57,0x0061d30c,0x00755ce2,0x008ddf04,0x0073284e,0x0068132c,0x0049212b,0x0058cb76,0x0032d458,0xffce726c,0xffaf34a2, -0x005b48e9,0x005fc6ea,0x0068c94b,0x005ca29d,0x005c9ef6,0x005b2c12,0x004a41cc,0x00430bc1,0x003a7c9a,0x002e806b,0x0018ee00,0x00067a68,0xffed40c5,0xffd72252,0xffd938ab,0xffe253df,0xffed8818,0xffe167f8,0xffdaaae8,0xffdd12c8,0xffe2d642,0xffec9c6f,0xfff3b7b1,0x00069ed8,0x00093b1a, -0xfffcfb2d,0xfff3a9f3,0xffee14f8,0xffee34ea,0xfff6f696,0xfffe397b,0x00018be5,0x000d06bc,0x002a1ae1,0x0051a845,0x00655bf2,0xffc4f7a7,0xffc6eeeb,0xffda2502,0xffc74a51,0xffc2bf57,0xffc499c7,0xffcd83cc,0xffd12363,0xffd94591,0xffd26d33,0xffe23046,0xffd0ce1d,0xffdbf765,0xffcfb2a7, -0xffda4b77,0xffd4bfaf,0xffd88a35,0xffdd3210,0xffeb2690,0xffdc2559,0xffd7c24e,0xffe9de15,0xfff1fdff,0xfff0fe87,0xfff0e31f,0xfff5522a,0xfff2d088,0xfff27dae,0xfff15c8c,0xfff2aadc,0xfff31819,0xfff5fd24,0xfffc0888,0xfffc1240,0xfff3b02c,0xffdeb078,0xffe626ee,0xffe1d5c0,0xfffab065, -0xffd8150c,0xffe3229f,0xffdce5b6,0xffcc18d6,0xffc80df4,0xffc33361,0xffcd3f46,0xffdef820,0xffd8ac0e,0xffd6c6e0,0xffdfdefd,0xffea1fa8,0xffe6753c,0xffe89c36,0xffe515ba,0xfffbf64d,0xffdf956a,0xffe52f15,0xffea052a,0xffeddfde,0xfff4efbd,0xfffb8218,0x000222b1,0xfffdd55c,0xfffc9a73, -0xfffca7a6,0xfffd01e3,0xfffd49fd,0xfffca1a9,0xfff2840c,0xffec7583,0xffea8d59,0xffeb35a5,0xffd40f83,0xffca0a64,0xfff1317c,0x0000e66c,0xfff9c359,0xffe0f6a8,0xfff92dcc,0xfff7ddf4,0xfffe0a98,0xffff7d57,0xfffb9c61,0x0003776b,0x0007a1d5,0x0007e30a,0x0007f042,0xffee46ea,0x000a9ead, -0x00097ff7,0xfff710bf,0xffd27570,0xffdd01a1,0xffdcb765,0xffde395d,0xffdf8181,0xffe057ce,0xffe2a4f9,0xffe1f66f,0xffe204e7,0xffe195b0,0xffe148c7,0xffe15b1f,0xffe3b848,0xffe11fc1,0xffde8841,0xffd9d159,0xffd5d89b,0xffd19238,0xfffb4cf7,0xfffe8072,0x0006736c,0xffca3fa7,0xffc51186, -0xfff945a7,0xffd5067c,0xffc3a57b,0xffe645b3,0xffdd0f7f,0xffddb8f8,0xffe7ac81,0xffe8f0b2,0xffec5c20,0xfff00f1a,0xffc9d03d,0xffd640cf,0xfff55718,0xffc67c52,0xffc6f329,0x00004246,0xfff6d5a7,0xfff774c5,0xfff84587,0xfffcdbda,0xffff6471,0x0004a214,0xfffedb3f,0xfffdab6d,0xfff9f7d8, -0xfffded06,0xfffb3d16,0xfff31883,0xfff13833,0xfff2e683,0xfffcf1e0,0xfffd315e,0x00148d59,0xfff863d9,0xffd91384,0xfff89f72,0xfff25137,0xffe79ee7,0xffeb9362,0xfff8df58,0xffec5fac,0xffdbfb6b,0xffcdcaad,0xffe47ee6,0xfff4b8ec,0xffe7bf54,0xfff77276,0xfffa06d1,0xffe17963,0xffe54078, -0xffc86211,0xffda45a9,0xffe8eee4,0xffe39f83,0xffee1e78,0x00002593,0x000ee574,0x001d57fa,0x000da6ab,0x00022671,0xfff2cd4f,0xfffb608b,0xfff4b9ed,0xffe2bb2d,0xffdd2af7,0xffe708b6,0x0007e0a5,0x0009ef87,0x001b485e,0xfff1e42f,0xffd694d5,0xfff05232,0x000c2a0c,0xfff04f69,0xffe55309, -0x0000e293,0xffd2f8a2,0xffe1056d,0xffcb861c,0x0002b332,0xfffec0c1,0xfff957a6,0x0001e123,0x000aa959,0xfff84e8f,0xffe55fae,0xffc5b9f6,0xffcfc73f,0xffe1f097,0xffdb1e5b,0xffe1fbb3,0xfffd7e5d,0x00101928,0x002b0270,0x000ca174,0x00062aea,0xfff126df,0x000631a9,0xfff61d04,0xffcb10c1, -0xffc1256d,0xffd1d398,0x000d551a,0x0007e5fc,0x0052d459,0x000b52ab,0xfff710b1,0x0010c5d7,0x002ffb6d,0xfffbb1da,0x000478a9,0x0036432d,0x0019f05c,0x00164b87,0x001277f3,0x001d87af,0x002874cf,0x0022fbe9,0x002c1451,0x002b25ef,0xffed23b7,0xffe3ef37,0xffac3ea9,0xffa82fc2,0xffb2aded, -0xffaa97f3,0xffc36d04,0x00004951,0x00393f4c,0x006d1edc,0x00393a6b,0x000a06f9,0xffdcf833,0xfff598f4,0xffe379cb,0xffa8f154,0xffa88565,0xffd742a6,0x003d8051,0x003c877b,0xff9ccc40,0xff8fcec6,0xff6aae95,0xffa8b74c,0x000f4662,0x00131114,0xfffafbf3,0xffbc544e,0xffc3a79e,0xffecc970, -0x0000135a,0x003c4c98,0x003580cf,0xfffe1de9,0xfff6e058,0xfffe6dda,0x0029cce3,0x00313cc6,0x001ef809,0x0031f7c8,0x005ee975,0x004d86c6,0x0047e051,0xfff2b49b,0xffc3669e,0xffc51904,0xffe42974,0x0039ebf1,0x009b0c9d,0x0056729b,0x0025d81b,0x000b27d8,0xffa757a9,0xff8ef823,0xff9d7f2a, -0xff896339,0x00897037,0x0054b22a,0x0023d8e5,0xffe51bda,0xff6b02c1,0xff77388b,0xffc0d751,0x0002e115,0x0027ccda,0x00124f0f,0xffe04b8b,0xffce77a0,0xffe1e339,0x0010fb15,0xfff92b6b,0xffecb6af,0xffdcae1c,0xfff94c81,0xfff21065,0xffd70316,0xffe2e7f0,0xffc0c37e,0xffbdf630,0xffc971dc, -0xfffb688f,0x004c6617,0x00579e24,0x00207763,0xffbec534,0xffd08c18,0xfffba6ee,0x002544a8,0x006d365f,0x005d1034,0xffff1635,0x0033f3eb,0xff022bd2,0xfe6eb70a,0xff7a80bb,0xffed0aea,0xffb7b0e0,0x002e3542,0x00166cd4,0xffc6a87a,0xffd1e416,0xffeb61d3,0x000abd1d,0x000fc5a0,0xffffc2c6, -0xffe94812,0xffe837d7,0xfff8fb8a,0x000af62b,0x00007a98,0xffe411af,0xffe717fd,0x00222449,0x0022f78d,0x00221891,0x001389ea,0xfff1b528,0xffcfb2ba,0xffd442ad,0xfffff275,0x0013ead1,0x00b8edd0,0x005a4bd6,0xfef6f540,0xff16a3f0,0xff2d4dfa,0xff520f3e,0xff62a371,0x0073df00,0x00c995a5, -0x007fcff2,0x0046feb8,0x0031a7dd,0x000c3f5c,0x00044c86,0x000c5c96,0x0005d7ff,0x0002b2c0,0xffefc746,0xfff754a3,0xfffd63be,0xfffdbeb2,0x000132b0,0xfff1ad7d,0xffdd172c,0xffd341a7,0xffc26fdc,0xffce1677,0xffd7d7d9,0xffd20b4c,0xffdba119,0xfff50f1f,0x000ebda1,0x002fa69c,0x001a4a47, -0xfffc1e89,0xffc7d964,0xffa86276,0xffb79f4f,0xffe681a9,0xffbc99af,0xffa2b2ac,0xffa9e03b,0xfff51ef6,0xff1f64e8,0xff4d8df6,0xff9418d4,0xffd1849d,0xfff3b13f,0xfffc719e,0x0008e961,0x00143b16,0x0011e547,0x00152242,0x0004b022,0x0005cb64,0x0003291a,0x0005ef8b,0xffe1b163,0xffce40f7, -0xffc9f3b6,0xffbf614f,0xffb9a006,0xffd0d6e6,0xffeae0ee,0xfffaf405,0x0007eb39,0x00122681,0x001c77a5,0x0028b1cb,0x002c3acf,0x00307bf1,0x00327e00,0x003ce20a,0x003129a7,0x0010ad4a,0xfff5134a,0xffbd97dd,0xff749407,0xff2be65e,0x004b3a95,0x00237b73,0x003515a2,0x00354d26,0x003d2468, -0x003ffa3f,0x004578b4,0x003b152f,0x003f4f68,0x0036ac11,0x0028d8c1,0x000cdc22,0xfff39c83,0xffdbdee1,0xffd84bd4,0xffd66fd8,0xffdcfb63,0xffdd4c2d,0xffe2ba23,0xffe2dc33,0xfff20ac2,0xfff4f0e9,0xfff63f5f,0xfff1efbd,0xffecfbbc,0xffe4827b,0xffea152c,0xfff94d57,0x0008f4b9,0x00114525, -0x00194c34,0x0019c55d,0x0030e14e,0x003da878,0x00502d18,0x004aaf76,0xffd7bee7,0xffbf656f,0xffabe459,0xffaf2276,0xffa45b9b,0xffb49cbd,0xffc719aa,0xffd64893,0xffd12129,0xffd83432,0xffce0df0,0xffd98c86,0xffd11c38,0xffcf54fa,0xffcfa886,0xffcfe215,0xffcbd20e,0xffcc526c,0xffc5a55a, -0xffd0f212,0xffe5b02e,0xffea84b1,0xfff8d8ff,0xfff78ecf,0xfff9f42d,0xfffd7b35,0xfff4b403,0xffe9afb4,0xffdedc12,0xffe0d48b,0xffe47599,0xffebeca1,0xfff2c00f,0xfff636c0,0xfff97655,0xffe08436,0xffdeeb31,0xffd3543d,0xffcfff1c,0xffd14c20,0xffc5b2bb,0xffc49579,0xffbfbd12,0xffb869c5, -0xffbe781a,0xffbc2ba4,0xffb6eaf9,0xffbcde73,0xffc5ceea,0xffc4f18d,0xffc99f8d,0xffd3c04d,0xffd43c64,0xffe08cdd,0xffdd9213,0xffed1b54,0xfff28702,0xfff2fc5e,0xfff755c0,0xfffbc2de,0x0001160a,0x0007297e,0x00095716,0x000bcf28,0x000b0d88,0x0008ad79,0x00034e6c,0xfffc898c,0xfff2e639, -0xffe96744,0xffe43a52,0xffe025ad,0xffd7b727,0xffd75337,0xffbb6a1c,0xffb6cf38,0xffcf180b,0xffbb85a7,0xffb210cf,0xffbfaa3a,0xffc27fff,0xffc451a5,0xffcb3bd3,0xffca4cbd,0xffcbd5b1,0xffcfbfdd,0xffb893d0,0xffc4877f,0xffd49aff,0xffc02769,0xffc92c09,0xffe8e22b,0xffe5839f,0xffe82197, -0xffe9e3c7,0xffebafbc,0xffed3877,0xffef5924,0xffed352f,0xffeba0fd,0xffeaa864,0xffe94c71,0xffe8a212,0xffe8b3b7,0xffe5e26e,0xffe357a5,0xffdf7ae4,0xffdb1f21,0xffd89449,0x00220e07,0x001e8469,0x001b8433,0x003a3b9d,0x0028cf9c,0xffec633a,0x0039a08e,0x0026f513,0xfff86a81,0xffee6e4d, -0xffec021e,0xffe3fe83,0xffec8302,0xffed3270,0xffe5ab3b,0x002d0047,0x003f2c35,0xffe1b7e6,0x0024239f,0x00357198,0x00192553,0x001a5beb,0x001f73b3,0x0020b87d,0x0025f3f7,0x00292d45,0x002f41c5,0x00286460,0x0026af2e,0x0021ecd8,0x002a1937,0x0029ac83,0x00215078,0x002526bf,0x002451db, -0x0020c51d,0x0022a2c3,0x002a8b85,0x0031e3fa,0x001be176,0x002a164f,0x003540db,0x001584e2,0x0015a56e,0x00220bcc,0x000dbf35,0x00122571,0x00162a62,0x0024c6de,0x0021d146,0x0021946d,0x0023f9a3,0x00237c0b,0x002b7fd5,0x00138330,0xfffcaf4e,0x0016b4ed,0x0010ac0a,0x00228714,0x002b5323, -0x003d451f,0x004742de,0x00533acf,0x003fc0cc,0x0035c775,0x0029dd3f,0x003ccae2,0x003f71b6,0x002e5a77,0x0039b258,0x003822fd,0x00306c32,0x0035ad8a,0x002569fb,0x001edd83,0x002e1a6b,0x00263f61,0x003922a1,0x000fed01,0xffff2c86,0x0017a5b1,0xffed39c7,0xffddcf47,0xfff0d4d4,0x0002ed26, -0x0019f84e,0x0011a6fd,0x002b3b38,0x00305a7b,0x001fd8ee,0x000f0325,0x0009bc79,0x0005b65a,0x000ce4db,0x00226a31,0x00312ced,0x005127b7,0x00627103,0x0080190c,0x005710a8,0x00509bf5,0x003af8b3,0x006377ec,0x00645c6a,0x0034857d,0x004fce0a,0x0044ff75,0x00303881,0x0038f800,0x0046254a, -0x0032a63d,0x0037a54a,0x0035a3e8,0x004a4010,0x00094698,0xfffae879,0x00263a6f,0x0006ffbb,0x0005f19e,0xfff1be84,0x001557dc,0x0028ed40,0x00184fea,0x0031ce08,0x00326f1c,0x0016767f,0xfff12434,0xffd91017,0xffd2ac7d,0xffeac6e1,0x001a4f9f,0x0045f9e4,0x0086d625,0x00b5d351,0x00d82c7c, -0x009206bf,0x005fb3f7,0x0037653d,0x0076cb57,0x0081f093,0x0049084d,0x007a2f7f,0x007479c3,0x0057aabd,0x00630a78,0xffce727a,0xfff5c440,0xffde64e1,0xffe6f10d,0x00229cee,0x002b55eb,0x001426f6,0xffd8f4e9,0xffd6f0f9,0xfff8d799,0x00025d75,0x0031d281,0x002ab2eb,0x000cefd3,0xfff970db, -0xfffc6d61,0x00398a43,0x004c75a1,0x00696800,0x00899080,0x008cafe9,0x0060950a,0x00258d8d,0xffe4e6e9,0xffad4ba5,0xff999cde,0xffd8531c,0x003fa255,0x00ab7a0d,0x0082ee97,0x0076ff3f,0x008d5d3a,0x0027f49c,0xffffb616,0xffe95c3a,0xffda335f,0x004c7641,0x006b7da8,0x008a5a80,0x00261ade, -0xffa179c5,0xff8d25a2,0xffb536a3,0xfffce3c1,0x001fb191,0x0012f147,0xffe6e6f1,0xffd18bc5,0xffe0fba2,0x0009e7f6,0xfff8eb01,0xfffa674f,0xfff772c7,0x0009a344,0x000cb95d,0x00053a88,0x00206a6e,0x002dd140,0x0047fead,0x0027291a,0x003b6751,0x0085396e,0x005e74ba,0x0015819d,0xffb32bff, -0xffe009a9,0x00278222,0x005ea768,0x00c80fc5,0x009dbb4c,0xffe4e182,0x00239b02,0xff37fe8f,0xfe6c2194,0xff62e4dd,0xffce148d,0xffc06092,0x002f7fcf,0x002741e3,0xffdb18bb,0xffdcb91e,0xffea2029,0x000b35f8,0x0014a17e,0x00039c83,0xffe69076,0xfff1b07f,0x000239c9,0x001d1e07,0x00150469, -0x00199155,0x000a33e9,0x00154b4d,0x001fed2e,0x001a9a9d,0x0033b5d9,0x003cb4bd,0x00432ba6,0x003f0b68,0x0046654a,0x002cbaca,0x00c2621e,0x00aa142a,0xffe06cc2,0x0033de7b,0x00491d63,0x00462ff7,0xffd82e04,0x00f61384,0x00f03038,0x00a5568d,0x0068d01b,0x002e34b2,0x001b7edd,0x000b8d3e, -0x000f0732,0x0007756b,0x00055f89,0xfff65e1c,0xfff8d051,0xfffd860b,0x000889d8,0x0007e0c7,0xffffc2ed,0xfff12136,0xffdfeaf6,0xffdd2ef0,0xffdbf987,0xfff0600c,0x000e0f33,0x00266bb1,0x00438403,0x00526969,0x005ece29,0x005a6fb6,0x00428bbf,0x000ed016,0xfff6d457,0x0000a79c,0x0009ee54, -0x006d67fb,0x00a1a384,0x00e659ed,0x00d26831,0x000df3cf,0xfff33151,0xffbe6b67,0xfff43573,0x00109d96,0x000939bb,0x000cb774,0x00283089,0x00229b36,0x001b666a,0x000e8fdd,0x0004ae13,0x00024bc9,0x000cda4a,0xffe7a587,0xffd44a9a,0xffc79b2f,0xffd29842,0xffded6c9,0xffdf5899,0xffea7c3e, -0xfffa0dec,0x00058fed,0x002084fd,0x00463de2,0x007f184a,0x008b9f58,0x00a2a297,0x00c2034d,0x00a7c397,0x009dde40,0x009069fa,0x00a28a28,0x0085f100,0x00403cb0,0x00201f9f,0x008bd86f,0x00846246,0x005a66e1,0x0065a5fa,0x0059c778,0x005c5cbb,0x004d5ae4,0x00449697,0x0043cfce,0x003b0df1, -0x002a724a,0x00199b1a,0x00003b49,0xffe3b15f,0xffe15733,0xffe8fa17,0xfff5cd65,0xffeba6cf,0xffe6a368,0xffe301f0,0xfff2a795,0x0000d71c,0x0007ab0a,0x001c19c7,0x001c9820,0x0010758a,0x000b41b8,0x000355d3,0xfffab1e5,0x000ba9c9,0x002b51e3,0x0059286d,0x0052e9e0,0x005fbd11,0x0077537e, -0x00845dd9,0xffee42c4,0xffe05377,0xffe63556,0xffe299c6,0xffd5389f,0xffdda931,0xffe7baaf,0xfff03a39,0xffe9bfa0,0xffe59db8,0xffe571e9,0xffde4f97,0xffd6fea9,0xffd25653,0xffd552ca,0xffd52787,0xffd3f432,0xffda9b5c,0xffe6d32a,0xffe9acf4,0xffe8ec29,0xffee59af,0xfff0cf16,0xfff2ab9c, -0xfff610d8,0xfffb32db,0x0001eb5a,0x0009f082,0x001097ec,0x001686af,0x0017cbbf,0x0020c019,0x00202b07,0x002050f1,0x00192b85,0x00028a94,0xffe8daa9,0xffe4dc17,0xffd2fe52,0xffd87582,0xffd6a9f3,0xffcfd5e6,0xffcca1e3,0xffc7c683,0xffcd5dc5,0xffd8722a,0xffdfe103,0xffe5c424,0xffe581ec, -0xffec0665,0xffe8d46f,0xffe5d563,0xffefd9ad,0xffe91614,0xffea0f15,0xffe0d90f,0xffdefe05,0xffe5d27b,0xffe93b5f,0xffeed80e,0xfff3b619,0xfff84762,0xfff9ef2f,0xfffe0691,0x00043c6c,0x000b2fc6,0x0013459a,0x001a8fe9,0x000c36bf,0x000016d2,0xfff74e15,0xfff229cd,0xffe5feda,0xffe1e42e, -0xfff3db4a,0xffeaeb10,0xffc886af,0xfff17ab6,0xffe8d857,0xffcaab68,0xffcdb949,0xffcd6f8f,0xffcb5a08,0xffcd4cec,0xffce7750,0xffce4bcc,0xfff69e3c,0xfffbc0c3,0xffd3899c,0xfff578be,0xfffa730d,0xffe3e7bc,0xffe9c387,0xffeb560b,0xffec5929,0xffedd6fd,0xffeef964,0xfff0893e,0xfff2db40, -0xfff4c6dc,0xfff60b33,0xfff75328,0xfff848dd,0xfffd09d5,0xfff7ba6a,0xfff4edc9,0xffeffdd2,0xffeba432,0xffec82ad,0xffdc814c,0xffe54389,0xffd51475,0xffda0ae4,0x00000dc9,0x00496788,0xffce1765,0xfff3f117,0x003415c4,0x002d0aa9,0x002c87a0,0x002da9a3,0x00386e68,0x003cba7c,0x003e0ecd, -0xfffd11e7,0xffd8db73,0x004a2cf1,0xfffe017f,0xffd9ee3f,0xffd2d448,0xffdcdb44,0xffd8ea5a,0xffda51d2,0xffde2ff6,0xffe07d87,0xffe53206,0xffe024b2,0xffde7965,0xffd95ed0,0xffdd93b4,0xffdadb12,0xffd1c875,0xffd35b12,0xffd76e22,0xffe65e1a,0xffe17b0f,0xfff34f79,0xffd4d1ec,0x0014b77d, -0xffdf4a4f,0x00026bf5,0xfff073a5,0xffde0251,0xfff317d0,0xffd176c3,0xffc7e4ef,0xffd0cd4f,0xffd721fe,0xffe73c6d,0xffe2a3b0,0x0002d80d,0xffffea0b,0xffeccb0d,0xffe30b8c,0x0001428a,0xffc1c6f0,0xffc70971,0xffc680ce,0xffcd3a2e,0xffdcec50,0xffe8446b,0xfff365d6,0xffe4b76b,0xffd9e8b7, -0xffc9fe60,0xffd47672,0xffd03d77,0xffbf20a0,0xffc34a21,0xffd1f5fa,0xfffa3e02,0xfff2a17c,0xfff40a04,0xffd379ec,0xffe000ff,0xffe7655f,0x001ff0ba,0xffee3927,0xffe2472f,0xfffabc92,0xffd159b8,0xffc91f3b,0xffc9c16c,0xffe4a0cb,0x00054a2b,0xffee8437,0x0010398b,0x000a889e,0x0007b4a6, -0xffedb0ce,0xffdb31f6,0xffc66a57,0xffb8d14a,0xffbcf743,0xffbe44b4,0xffd803a5,0xffe72ace,0xfffeafad,0xffe25e38,0xffdaf165,0xffc10e83,0xffd5976b,0xffc70f48,0xff9aa682,0xffa75ea5,0xffc29c6f,0x00085fee,0xfff6d468,0x0024d706,0xfff342db,0xfff7bdea,0xfff9b918,0x0037a644,0xffeae3b2, -0xffe84d76,0x001f732f,0xfff6eb59,0xfff2f1c5,0xffe7144d,0x00148725,0x0020f9b7,0x00162dde,0x00293fbe,0x0027692a,0x0015db82,0xffe0f450,0xffc4d81c,0xff9f24fe,0xff8b4e98,0xff92cfb0,0xffa1984c,0xffd974cc,0x000704cf,0x002b0caa,0xfff7c60d,0xffccb8a5,0xffa0c3a2,0xffbe38df,0xffb6a937, -0xff8325c8,0xffa494be,0xffddc664,0x0049faff,0x00375cee,0xff4d50bd,0xff8d23f9,0xff8ca450,0xffaf8456,0x0013d652,0x001e5d61,0x0007de29,0xffd86c07,0xffd78f81,0xfff36bee,0xffff5a4d,0x00214cf3,0x001ccbe3,0x00110200,0xffec8aca,0xffe845d2,0x002339db,0x0025f290,0x00441f95,0x0043b269, -0x00221c70,0x001979f1,0xfffbf1db,0xffc1b2c8,0xff9af4f6,0xffab95f5,0xffcc6a81,0x001687d9,0x0050f7c5,0x0011cbf8,0xffd2f769,0xffa7b1cf,0xff676f34,0xff60eeef,0xff7b3f65,0xff5ccb17,0x003b2b77,0x003edfa4,0x0054cd0d,0x0010143c,0xff7a1ce0,0xff72473c,0xffa5f029,0xffee4eec,0x001388a8, -0x00094362,0xffe94ef2,0xffd5e4ba,0xffde066f,0x0003d805,0xffe99ba7,0xffe6f49a,0xffde8f4f,0x000647ee,0x0016e8bc,0xffeb0b08,0xffc2e4ff,0xffa2c4b8,0xff8e0b6d,0xffaedbb2,0xfff3c173,0x005d7ca0,0x003de4c9,0xfff75284,0xff947a30,0xffc090b9,0x0002d76d,0x0039a432,0x0076df12,0x004ecb5f, -0xffc9aa0a,0xfff9b7d3,0xff3eedf7,0xfe4d3f74,0xff417fdb,0xffb25363,0xffbc7414,0x00218ea5,0x001ae427,0xffe2d40f,0xffd980fe,0xffe66b1c,0x00062ba0,0x00107d49,0x0001e4c0,0xffe3bb47,0xffe82c30,0xffee4741,0x000cac9e,0xfffa180a,0xffed44f8,0xffe64fa1,0x000241cc,0x000ff890,0x0007d913, -0xffd3a919,0xff955eec,0xff702ad2,0xff6a8840,0xff9ee812,0xffd56c99,0x003e028a,0xffcc80d4,0xfea0508e,0xfeccc158,0xfeffced4,0xff2d03ff,0xffa178d2,0x004cf617,0x00f1c890,0x00b1319e,0x005850bc,0x002a8048,0x000c4a2b,0x000fc024,0x0008d3a6,0x0003a7e5,0x00056e69,0xfff652cc,0xfff38349, -0xfff9da43,0x000361c8,0x0000a2da,0xfff93fc1,0xffe987da,0xffda7425,0xffd8c242,0xffd06aa1,0xffc2a88b,0xffbc8c9d,0xffc6b424,0xffddaeb4,0xfffdd795,0x001e8d95,0x000a8088,0xffe707b0,0xffaba567,0xffa56558,0xffb0ff21,0xffb73bbb,0xff72b18b,0xff3f915d,0xff2cea6d,0xffb3cfe2,0xfef42ae8, -0xff6be8ce,0xffd02f04,0xffdccccf,0xfff27b05,0xfff92d50,0xfffd003a,0x00122e88,0x0010444c,0x0005ed1e,0xfffcc040,0xfff9e801,0xfffa5485,0x00018001,0xffe59502,0xffd4e6d9,0xffc2781c,0xffbace77,0xffc003aa,0xffba5e12,0xffd4b94f,0xfff0389d,0xfffbc3e0,0x000b2252,0x00141d87,0x001cc810, -0x00196993,0x0017d311,0x0009d849,0x0011747d,0xfff63efc,0xffc01d5c,0xff9ed110,0xff726c24,0xff3467cf,0xff07c95a,0x001e7a4a,0x0024bd2e,0x005e35e1,0x00429654,0x0049f54f,0x003e60cd,0x0036ab79,0x0033e5a1,0x00335fe0,0x00332e0f,0x0028718b,0x0019aa0b,0xffff86a6,0xffe3a983,0xffd92646, -0xffd741c0,0xffde0663,0xffe76e5b,0xffea7249,0xffecd088,0xffe5fdd5,0xffdd1b9f,0xffdba18f,0xffdd8497,0xffdcb0be,0xffd7c820,0xffe43d92,0xfff7c54c,0x000d6316,0x000e7647,0x000acc01,0xfff3c4b0,0x000b7531,0x0014e6a7,0x001f327e,0x00228a22,0xffc9eef5,0xffc40480,0xffc70a2d,0xffc50fd8, -0xffcb8fbe,0xffd626c5,0xffe79175,0xfff23378,0xffeefc24,0xffe82815,0xffe0b9e4,0xffda7aaf,0xffda5027,0xffd08379,0xffd3984a,0xffce590f,0xffcc3cd9,0xffcce174,0xffcc82ae,0xffc9dc38,0xffd0d1cb,0xffdb0fd3,0xffe3d6ea,0xffe8589c,0xffee1250,0xfff5b1f7,0xffe991c1,0xffdcc7eb,0xffd19ee9, -0xffcadb5d,0xffc9e098,0xffcaee6c,0xffd66e8a,0xffddf422,0xffe383dd,0xffd6644b,0xffc448a4,0xffbc0f3b,0xffdcb0e7,0xffbf2d43,0xffc0dec1,0xffc0747a,0xffb2fafb,0xffafe424,0xffae7d62,0xffaf9c17,0xffb784df,0xffb5a3ad,0xffbc0f6c,0xffbf31e7,0xffca61d7,0xffcf8d9d,0xffc8735d,0xffd2024d, -0xffdf609f,0xffda5fb0,0xffe3bde2,0xffe30a1a,0xffe621ea,0xffea18a2,0xffedca0f,0xfff3cecd,0xffedad4d,0xffe973a4,0xffe30108,0xffdd5a14,0xffd52614,0xffcac71a,0xffc6e653,0xffc22e52,0xffc0dd79,0xffc14ba7,0xffc63bed,0xffc05a42,0xffc07a51,0xffd1377b,0xfff4f1ab,0xffb7fc91,0xffcc3b07, -0xffe903a1,0xffee4c31,0xfff13ae4,0xfff4bbfe,0xfff8bdcd,0xfffcb82a,0x0000cacf,0xffd333ea,0xffc13ed6,0xfffef238,0xffd71b4b,0xffc90f26,0xffd07c89,0xffd34cfc,0xffd47460,0xffd71085,0xffd88e79,0xffd9e8ed,0xffdc94fb,0xffd889e7,0xffd5cb5c,0xffd2f531,0xffcf6991,0xffcc81b9,0xffc91709, -0xffca011a,0xffc9c177,0xffc88e7a,0xffc62c24,0xffc59099,0x00340a2b,0x002d975e,0x003d9ef4,0x00187209,0xffead843,0xffbc3897,0x002a4380,0xfff0e9c6,0xffbfd67a,0xffb2b04c,0xffb10cf9,0xffb3a3d2,0xffb4ae9f,0xffb6441c,0xffb3f76b,0xfff60e26,0x0029f64b,0xffb33f98,0xffed985f,0x0014e6c6, -0x0038d0be,0x002ad8fa,0x0032fe74,0x0035f926,0x003a2c6b,0x003c5321,0x003f2390,0x0039d6d3,0x0038a83d,0x0034fd45,0x003c469c,0x003b9732,0x0033e9a5,0x0035b92b,0x00343f5c,0x003051ce,0x003381d9,0x003d47d5,0x003e72c5,0xffdcabb7,0x002c1d1c,0x0020b03b,0x00014654,0x000f67c4,0x001852e7, -0x00109c60,0x000b4778,0xfffef7e5,0x001b6a9f,0x001f0a65,0x001ab5c7,0x0014bb59,0x001ca517,0x0023689a,0x0014c117,0xffd13f16,0x00236ee4,0x002b8ecf,0x00388b5d,0x0049ccbe,0x0059fb73,0x0061f078,0x0063d557,0x0051cfa5,0x0047a564,0x003e30df,0x00507560,0x0051eab8,0x0040dd98,0x0045f076, -0x0042b34b,0x003c0ae9,0x0040b863,0x00415ee6,0x002b5af3,0x00093132,0x0014dc09,0x00287fec,0xfffeb8c5,0xffefcb0b,0x000eea85,0xffd477e5,0xffd96b1f,0xffd4fbc4,0x00070ed1,0x000367c7,0x000f93ef,0x001850d6,0x002a79c4,0x0023e493,0x000bb0aa,0xfff5429c,0x000a0bca,0x0030c62f,0x003c6afb, -0x005752a9,0x00724976,0x007ef966,0x0087db8f,0x006847d9,0x0063d931,0x0056202d,0x00783fef,0x00762c4f,0x004b5c7c,0x00575830,0x004d8158,0x003f06d6,0x00440859,0x005f520b,0x0032c1b6,0x000c0751,0x0025f50b,0x004f0e2b,0xfff99a77,0xffe97cdb,0x001648c6,0xffefdfb4,0xffe6c43d,0xffdbe4e0, -0x0009a644,0x00257273,0x001db0eb,0x0037e701,0x0044a1bf,0x0023757c,0x00064957,0xffc95338,0xffddc71a,0x0017aeb1,0x003c1f17,0x007b770f,0x00b61398,0x00da3ac1,0x00d8ee1f,0x00967196,0x006a3bb4,0x00532bf4,0x00893e38,0x008eccce,0x005ce05b,0x0073cd09,0x006b9606,0x005e19bc,0x005f3701, -0x00096233,0xfff25ed4,0xffa5e69c,0xffc026fe,0xfffc8096,0x0018e6fe,0x001d3614,0xfff1fa9d,0xffe96dc1,0xfffe6c5f,0xffffc497,0x001865ee,0x0015df01,0x0018eafa,0xffebd6bc,0xfff0652e,0x00217573,0x0053a0ea,0x005a09bc,0x00863f33,0x00ad367d,0x0073fe9c,0x004e2d36,0xffefdecc,0xffc9df4d, -0xffd5812c,0x003f5246,0x00a8da82,0x00e318f1,0x00bd9996,0x0099b1f2,0x0085162c,0x003a2395,0x002298cc,0x001b9664,0x000264e1,0x006026a9,0x007b10ad,0x0092de4d,0x004fe201,0xffc0b5bc,0xff8a80a5,0xffa60c3a,0xffe9e296,0x000f4dc5,0x000a8d4c,0xfff092b0,0xffdd96f6,0xffe079d5,0x000403a2, -0xfff8d321,0xffff69b7,0xfff2979f,0x00145095,0x000bcc32,0x00199de9,0x0034ce75,0x0033c634,0x00661eab,0x0047c1ca,0x00576250,0x00894638,0x0034794b,0xffe56386,0xff99d169,0xffe2cbfe,0x002dcb6a,0x00511b10,0x00a53766,0x00718491,0xffb5df92,0x0006d602,0xff871540,0xfe698a3e,0xff095635, -0xff8895fe,0xffba2b53,0x001c2258,0x0014dc67,0xfff9ec47,0xffe5c4d3,0xffedb9ac,0x0007339e,0x0016dc22,0x00098d15,0xffe3ccd7,0xfff000a0,0x0001812f,0x000eee9a,0x001d3c76,0x0015801c,0x001a7fe0,0x002d7c8f,0x001b7db9,0x0015ffee,0x00363ab0,0x004b2907,0x005ca496,0x006320f4,0x00736b5f, -0x00679778,0x00cd16e5,0x00aefeeb,0x000f53f2,0x0052304f,0x005f3cb6,0x0050c07b,0x00286c54,0x00d4b2e7,0x00eb70bc,0x00c52163,0x00872554,0x00259668,0x0029c961,0x001fcb48,0x00152d1e,0x00068207,0x0005cc9c,0xfff9d315,0xfff72cc8,0xfffc6264,0x000b90ad,0x0009791d,0x000377b4,0xffffb09c, -0xfff1e7d8,0xffd87084,0xffe967d1,0x000d8dad,0x00279622,0x0047e8ed,0x004df259,0x00521ea1,0x004b535b,0x003f3102,0x001a784e,0xffdcff51,0xffd86f58,0xfff12979,0x0017176b,0x0056e8a9,0x0083cfbd,0x00c9d545,0x009f71fc,0x00270c6b,0xffdefde5,0xff8c5a59,0xffda3238,0xfffdef03,0xfff2957a, -0xfffcb79a,0x001f7523,0x0010b984,0x000e53c2,0x000196a2,0xfffd4b97,0xfffc9fef,0x0005dffd,0xffebecf4,0xffdb9499,0xffc862b9,0xffcca7c9,0xffc2e8ad,0xffd5b01e,0xffdf978f,0xffe9438b,0x0004e467,0x00187d8c,0x003e3460,0x007358b0,0x007ce843,0x008f894f,0x00a4b088,0x009a170a,0x008dbf64, -0x008416bd,0x0087242a,0x006fb582,0x004a7f5e,0x002b1934,0x007ee459,0x006a59ad,0x00357c20,0x0049cb59,0x003eabb4,0x0043b43c,0x003e5b40,0x0034f5f2,0x003bf0b2,0x0039c308,0x0032e6d5,0x0025a9db,0x000fd6bf,0xfff1d8d0,0xffe88943,0xffe83a0c,0xfff03c5e,0xffee7b33,0xfff09f0c,0xffed38ae, -0xffff89e5,0x000a965d,0x000c7861,0x001b7795,0x001b6791,0x0013b082,0x001a62d0,0x001a7207,0x00160bc4,0x0028c80e,0x005045a4,0x0089e830,0x007bc181,0x007549ee,0x00764e3a,0x007170c1,0x000d35fb,0xfff347e5,0xffe7c0f6,0xfff4d1aa,0xffe5f3bf,0xfff44e2a,0x0000dedd,0x000e23ad,0xfffbd589, -0xfffb64a4,0xffe8ec48,0xffedd526,0xffd785cf,0xffd89160,0xffd44411,0xffd72c03,0xffd0a2a9,0xffd66024,0xffda0646,0xffeb82d0,0xfff35d2c,0xffeed89d,0xffef9820,0xfff4eaef,0xfffc820b,0x0003973a,0x000c6f57,0x00154704,0x001da1e8,0x0021380b,0x00204a80,0x00286da3,0x00238e56,0x00245b09, -0x00237f1d,0x0013bccb,0xffe27861,0xffddf514,0xffb39723,0xffd5262c,0xffc6b989,0xffc2cfd0,0xffc9ae83,0xffc41be9,0xffd13dab,0xffd79471,0xffd362da,0xffe1c97d,0xffe5ed6c,0xffe79c3b,0xffde244f,0xffe05322,0xffeb5619,0xffe93590,0xffd9917d,0xffe6a3a1,0xffe1e75c,0xffe6e6c4,0xffe97387, -0xffec4c59,0xffee638f,0xfff07ff3,0xfff4b4d9,0xfff9edae,0x00004557,0x00077f1e,0x0010189a,0x0017ba00,0x000c20d4,0xffff547d,0xfff3c188,0xffeaca17,0xffee8da4,0xfff0d45d,0xffe29d09,0xffcb0645,0xffac8bfd,0xffec04d4,0xffcd8b72,0xffacb0f9,0xffacff62,0xffac3a29,0xffae9532,0xffab1c7f, -0xffaa3c42,0xffab38b3,0xffd5cc3e,0xfff181d2,0xffb0d9b8,0xffd5559f,0xffeae1b9,0xfff1db53,0xfff0de00,0xfff3f088,0xfff4c9f5,0xfff646ad,0xfff7a66e,0xfff8c351,0xfffb3997,0xfffce831,0xfffe1d19,0xffff3329,0xffff8ddb,0x0002e77f,0xfffd750d,0xfffb50db,0xfff83310,0xfff509f2,0xfff8e753, -0xffe3859e,0xffeb4239,0xffd04f93,0x00099a35,0x0036d591,0x005bce7b,0xfff2bb82,0x0027e876,0x0051868e,0x004ad5ce,0x0048ba01,0x00417d4d,0x0050459b,0x00539b53,0x0050bdd0,0x00312c87,0x000170c7,0x005bd9e6,0x00320004,0x000a39e1,0xffd09a00,0xffe445c5,0xffe0ece4,0xffe3932b,0xffe690fd, -0xffe8a413,0xffec7742,0xffe7ff79,0xffe626e4,0xffe1054f,0xffe5952b,0xffe3c277,0xffdb8abe,0xffe03872,0xffe41b63,0xffef28b7,0xffe908c7,0xfff1c9fe,0xffe0b7e7,0x003e121a,0xffea58fa,0x001fbbfe,0x000403d6,0xffe97993,0xffffa3da,0xffd56c07,0xffd610e9,0xffee7364,0xffea0c48,0xfff2c071, -0xfff71f79,0x001676ed,0x00119cfb,0x000d7bbd,0xfff6a4a6,0x00288e2d,0xffd4e8b4,0xffcff7e8,0xffda3296,0xffe0f36a,0xffed5ac2,0xfff3dcd2,0xfff958be,0xffeb348f,0xffe1f95b,0xffd5bb72,0xffe21eea,0xffe25e24,0xffd4b9c3,0xffe1f7a4,0xffed6856,0x00073651,0xfffcc07d,0xffedc716,0xffdd0c6b, -0x00031fa2,0xfff76481,0x00342cdc,0xfff7de7b,0xffeaaaed,0x00004970,0xffd8c7eb,0xffbedd83,0xffd95706,0xffd78a7a,0x000b74e1,0xfff28ad4,0x00214cef,0x00162822,0x001b3ab7,0x0001a3d1,0xfffe5362,0xffdb6204,0xffc121d3,0xffd3fa26,0xffdb3697,0xfff17605,0xfffc8bd7,0x000db798,0xfff2cbbc, -0xffeb7617,0xffd47c68,0xffe8b157,0xffe0ded4,0xffb9f86d,0xffda724d,0xffeef704,0x0017905f,0x00068bf1,0x000ec1e0,0xfff901bd,0x000b00ab,0xfffaf4d0,0x004075b3,0xffe56d0b,0xffd43ebe,0x00097897,0xffd8ea7e,0xffd4ed78,0xffc7d455,0x000564d7,0x0016ef07,0x000dfb9e,0x002813a4,0x0028e868, -0x0037f8ab,0xffebcd8c,0xffe600f4,0xffb64c4a,0xff9fb13c,0xffc35be8,0xffdbff64,0x000ac259,0x00288ee8,0x0033ce14,0xfffe825d,0xffd78dac,0xffb88787,0xffdc9d6f,0xffe3cf68,0xffbf1382,0xfffa5f55,0x00207853,0x0058d507,0x0041f5cf,0xff588f35,0xffba361d,0xffc8c27b,0xffcba85e,0x00154d7f, -0x002b4ea7,0x001db215,0xffffdc16,0xffef709c,0xfff94a8d,0xfffa5512,0x0007295c,0x00088aaf,0x00207c8c,0xffe41e1d,0xffd69b1a,0x0016615c,0x002064e3,0x005f9624,0x005ca67a,0x000e960b,0xffff8d08,0xffc7b638,0xffaa5e91,0xff9110ba,0xff9f70c1,0xffe5ff38,0x002c95ee,0x003bfa0a,0x000ed558, -0xffd13cea,0xffa440f0,0xff819db4,0xff81dc10,0xff94bde0,0xff7df227,0xfff61eb2,0x0036e4fb,0x00925c93,0x00475571,0xffa8011d,0xff7d29a3,0xff92955b,0xffdba992,0xffffdf04,0x00027fd1,0xfff1098c,0xffe1a9e3,0xffdf0c22,0xfff70d88,0xffe71ee1,0xfff1cefb,0xfff05aec,0x00148b24,0x002fa62b, -0x000d3309,0xffd27706,0xffc8616e,0xffbeff54,0xffd8ff77,0x0012b252,0x006780c8,0x0023f2d0,0xffd43a2a,0xff76812d,0xffc221fc,0x001970d2,0x00548200,0x00865f28,0x004bd295,0xff9f6329,0xffd0d4f7,0xff918a5e,0xfe670c66,0xfefc853c,0xff610fbb,0xffd839b6,0x00066cab,0x000d9e97,0x0000f7c6, -0xffe82892,0xffe98b25,0x0003a6f1,0x000ee95e,0x00035a52,0xffe1040f,0xffecfc99,0xffebcade,0x000cd5ca,0x000262ef,0x000bdf6a,0xfffed179,0xfff63fa8,0x00045e4f,0xfff51f32,0xffc20282,0xff8e25cf,0xff7bc0cb,0xff70507e,0xff9f991d,0xffe7a1f1,0xfff660ca,0xff99c197,0xff00157e,0xff4200d0, -0xff77cc8e,0xff8458c2,0x0000b5b5,0x00474a41,0x00e0b60d,0x00d04346,0x0078a073,0x002dbd51,0x001aeda8,0x0022174f,0x000ce329,0x000131b6,0x0002eb2e,0xfffb1db2,0xfff339ab,0xfff91b99,0x00077f12,0x0002ab6b,0x0004bd6c,0xfffe63b9,0xffeb75ae,0xfff15ed6,0xffdf3046,0xffcc7632,0xffd3beb7, -0xffe67e27,0xfff4ed96,0x000edc83,0x002172cb,0x0016abcf,0xfff5d2bd,0xffc49736,0xffca3c21,0xffd16d9e,0xffbb807b,0xff9a40d6,0xff7fd9c4,0xff800962,0xffe0e86e,0xff62a696,0xffc30926,0xfff6697b,0xffe92e33,0xfff67ef0,0xfffb0deb,0xfff8a66b,0x00164098,0x000f9523,0xfffad865,0xfff74e74, -0xfff3db3b,0xfff5b8cf,0xfffcbdc5,0xffec8f9a,0xffde39ee,0xffbfe142,0xffc13998,0xffcef0d2,0xffb9eb1e,0xffc8e92d,0xffe5a991,0xfff3fb16,0x000ab69a,0x001ce2ea,0x002ed0d4,0x003143e6,0x0036e915,0x002d39e6,0x0025faaa,0x0005480d,0xffd2760d,0xffc0c93e,0xffa9ec66,0xff7d43c0,0xff761e57, -0x00132988,0x0036bc67,0x0066fda9,0x004750ce,0x0048112a,0x0038703b,0x0027016a,0x00284a1c,0x00248eca,0x002a2e41,0x00242228,0x0023928a,0x000db769,0xfff14025,0xffe25e2f,0xffe07978,0xffe56f16,0xffeee66a,0xffeeeb52,0xfff35f69,0xffe4df90,0xffdc9294,0xffdab3d4,0xffea1df9,0xfff034e8, -0xffef5eaf,0xfffd201a,0x0008aba7,0x0016aaef,0x001a3b4d,0x001c1cb0,0x000ee032,0x001373d0,0x0014a26b,0x0017c7af,0x001ba699,0xffdd84a2,0xffe2e1af,0xfff5dd0c,0xfff2d898,0x00004a9f,0x000513a1,0x00113cb9,0x00177cb3,0x00120ce9,0x00012431,0xfffb3355,0xffe68c84,0xffe61729,0xffd779c7, -0xffdbaf1f,0xffd48722,0xffd3566c,0xffd62257,0xffddfdfe,0xffd3973b,0xffcd49d0,0xffd83af1,0xffd93408,0xffe21d46,0xffea3f33,0xfff4ac1b,0xffef9f3b,0xffecb86c,0xffeb80ad,0xffe14261,0xffdb6f1c,0xffd7d9ab,0xffdf69c7,0xffe5b79d,0xffe945c6,0xffe8f1ab,0xffc0306b,0xffbe390f,0xffe16404, -0xffc00347,0xffc88350,0xffc74afb,0xffb993c0,0xffb8ef2d,0xffb50a33,0xffbafc22,0xffca8bcd,0xffc62a83,0xffc7e001,0xffcdf149,0xffd82741,0xffd6b85b,0xffd09849,0xffd1e4e8,0xffe521de,0xffd0ce12,0xffd8455a,0xffd94e80,0xffdb3c4c,0xffdeab1e,0xffe098db,0xffe4d1c9,0xffdafacd,0xffd3ba3d, -0xffcd08c7,0xffc924b8,0xffc55cd5,0xffbf6a40,0xffbf3fd7,0xffbdc909,0xffbd2e9d,0xffbe5edd,0xffc96209,0xffc1c99c,0xffda30dd,0xffef59bc,0x000037fc,0xffcfbf37,0xffecf3fd,0xfffdc846,0x0002de52,0x00050528,0x0003d8cf,0x0009bff7,0x000de9c0,0x001019d5,0xfff38d30,0xffd64413,0x000c3fd2, -0xfff2fc98,0xffdc942b,0xffc86e25,0xffd05134,0xffd08145,0xffd2efa9,0xffd403d4,0xffd513fd,0xffd79bab,0xffd4738d,0xffd29384,0xffcfce8e,0xffcc8b28,0xffc93e67,0xffc595a3,0xffc74aee,0xffc81905,0xffc89c19,0xffc837ac,0xffc8b3c4,0x001fbf15,0x001d1466,0x002db312,0xffebd3a1,0xffcae177, -0xffd217df,0xfffe1837,0xffcf80d9,0xffc71479,0xffba7a1c,0xffb9c26a,0xffc3a72c,0xffc1e61c,0xffc4c901,0xffc7c8d1,0xffd4c6d4,0xfffda526,0xffce4c7a,0xffd0f982,0xffea8cda,0x002806d3,0x0019586b,0x001f1d2d,0x002369a0,0x00260c06,0x00271d4b,0x00275541,0x0023f833,0x0023293e,0x0020bd38, -0x0024a28f,0x002314c1,0x001cc0d9,0x001d0f57,0x001d57b9,0x00203d46,0x0020b6af,0x002d3ad1,0x001f2784,0xffc86f6a,0x00108c2f,0x00063351,0xffed982d,0xfff876be,0x000249a1,0xfffa0d54,0xffed702c,0xffe084f8,0xfffa47f2,0x00067f59,0x0000a47d,0x00035b06,0x000d648d,0x000a1d26,0x0005ca55, -0xffcab2b2,0x0009ebfd,0x001a7ea8,0x001fac74,0x0033f46a,0x0040aead,0x0046ade5,0x0041aa37,0x0033f292,0x002a4324,0x0022ce8d,0x002e1036,0x002c989c,0x001ece95,0x001f6bce,0x0021d6b0,0x002c779b,0x002a9ead,0x00378f45,0x0013bc2b,0xffe27ac4,0xfff7e1b2,0x00168edf,0xffec3b7e,0xffe0ce49, -0xffffd450,0xffc1e1c1,0xffceff20,0xffc28051,0xfff8b632,0xffef99bb,0xfffeb882,0x0005f884,0x0017ba9e,0x001a18ab,0x00004a71,0xffe1a9df,0xfff5e115,0x001e1599,0x00213386,0x003e6fb3,0x0051a7c0,0x0059a4df,0x0053d520,0x004125f9,0x003d3436,0x0035735a,0x00451296,0x003c3930,0x001cfa14, -0x001e2e9c,0x0023e319,0x003810cf,0x003016b0,0x00559f8c,0x0018c06a,0xffe4ae4c,0x0006704b,0x00430fb4,0xffe5053f,0xffd6b3b2,0x0006b86f,0xffd7af3e,0xffcb19e7,0xffd010dc,0xfffc31b9,0x001847d7,0x001cb1c5,0x0032b2a1,0x0043c372,0x002a4312,0x000dca30,0xffc8b81d,0xffd79dc1,0x000a62db, -0x001e93d7,0x005d074b,0x008a56c7,0x00a2c6c6,0x008bf2f5,0x00587793,0x003483d9,0x002b0035,0x004547a4,0x0041d8fc,0x0020a801,0x002825a1,0x003634a5,0x005cfcf6,0x004b66be,0xfffca5e8,0xffd33d06,0xff82f73a,0xffa7b5d8,0xffe84e5b,0x0010d362,0x002412f3,0x000d7652,0xfff81fdc,0xfffae6e6, -0xfff74494,0xfffeabba,0x0003fa85,0x0020f0f5,0xffdda605,0xffdb5ebd,0x0000d04b,0x00347ed2,0x00346aa3,0x00560923,0x00751ffe,0x0049c1a6,0x0036fe56,0xffe243ba,0xffd3e21e,0xfff243e1,0x0072df5c,0x00ca7d53,0x00c47b48,0x009ebd31,0x005c1a37,0x0016be13,0xfff48c66,0xfff423d5,0x0002aff8, -0xffefca29,0x004af8dd,0x005fa33a,0x00818b9b,0x005d9a69,0xffce5118,0xff839ed2,0xff953990,0xffd38a3b,0xfffcb88b,0x00023dc1,0xfff5f1a8,0xffe9bb4e,0xffe2064a,0xfff9e70d,0xfff69430,0x00017120,0xffefabdd,0x00199b72,0x0011d38b,0x001e0ff1,0x001998fe,0x00073881,0x0031b8da,0x0034122e, -0x004d2182,0x0065847f,0x00078028,0xffbbc3c4,0xff7e9573,0xffd9650c,0x00253fb3,0x003b0c9d,0x0062563e,0x002c1735,0xff90fdae,0xffe1fe91,0xffbad0d3,0xfe83f8fc,0xfec69d56,0xff447267,0xffd54679,0xfffbb6de,0xfff4a258,0x000dd87b,0xffee6767,0xfff1b9a0,0x0003248f,0x001092de,0x00083813, -0xffe2de43,0xffec834c,0xfff6265e,0xfffcc8fc,0x00157aac,0x000927dd,0x0019a574,0x002d8d88,0x000ecece,0x00037e60,0x0006b41b,0x0007c509,0x0010a29d,0x001a8967,0x00464b2d,0x00746478,0x007b7800,0x0035c690,0xffb858f1,0xfff177a8,0x00076175,0xfff514ec,0x00382a4e,0x005cb5ea,0x00b1bb18, -0x00cbaf8f,0x009577cd,0x002e7f3c,0x002ef82b,0x002fc217,0x001ad21a,0x0002f958,0x00022849,0xfffb9d8a,0xfff5982e,0xfffb4fc8,0x0006cefc,0x0006ab5f,0x0005ed5d,0x0009a94e,0xfffe8431,0xffdea3a0,0xfff15bb4,0x000a9e61,0x00166583,0x00351cf1,0x002b7a81,0x002e1c87,0x0024da8b,0x00134503, -0xffe93a89,0xffb0f811,0xffbca765,0xffd99120,0x00034f84,0xffed5b14,0xfff54442,0x00280703,0x001436b0,0xffe35ca4,0xffb6cc5c,0xff8bd04c,0xffc6b634,0xffe65d42,0xffe6738b,0xfff2b39e,0x001225be,0xffff7f43,0xfffb2b47,0xfff0e125,0xfff546df,0xfff6efdf,0xfffaa47a,0xfff00a52,0xffe29166, -0xffc88b57,0xffc2fb66,0xffaf7f6e,0xffc7630c,0xffd15b63,0xffdb2132,0xfffc4d10,0x000b6fa2,0x00258236,0x003f77e6,0x00474d10,0x0051bea6,0x0052ec5b,0x00567860,0x00415de2,0x002f30aa,0x001990b5,0x00037354,0xfff57228,0xffdd910c,0x00396eac,0x0028a349,0x001942e3,0x00237d22,0x0020f8a0, -0x0021d6f3,0x00243b0d,0x001df753,0x0026f9fc,0x002c2b97,0x002e1141,0x00280794,0x0017da92,0xfffd5606,0xffed147b,0xffe3c23f,0xffe39a70,0xffeb320d,0xfff336b7,0xfff49a9d,0xffff9547,0x00025926,0xffff127b,0x00075800,0x000aa445,0x000c87e5,0x001f3ff6,0x002acafe,0x0032134f,0x00403424, -0x005bae6c,0x007d18eb,0x0070605a,0x005d01e5,0x004c759a,0x0035b708,0x0019587c,0x0000fecb,0xffee6d36,0x0001e6e5,0xfffc3ced,0x000bdb3a,0x0019a9b1,0x0028af13,0x00132677,0x0011919e,0xfff608f6,0xfffbe917,0xffe11203,0xffdfe581,0xffd8d7ec,0xffda7844,0xffd133c6,0xffd4280c,0xffcff9e9, -0xffe2ab00,0xffef0195,0xffe8b9c6,0xffea4ec3,0xfff1f90a,0xfffb5eab,0x000386a6,0x0008ae93,0x000dd477,0x0013c60e,0x001149a7,0x000dafdb,0x00109a75,0x000d0d46,0x000f93fa,0x00165bdf,0x00134bc3,0xffd60abd,0xffd25840,0xffb2f062,0xffd1c7b3,0xffc0e01a,0xffc12acf,0xffc84218,0xffc34513, -0xffcea6aa,0xffce032d,0xffc53349,0xffd1ec0b,0xffd8a88a,0xffd61e09,0xffd0d986,0xffd7592a,0xffdbd9d9,0xffe0fb1b,0xffd157a6,0xffe5e248,0xffe4b3a4,0xffe65ee8,0xffe88589,0xffe97a47,0xffe9e9e0,0xffeb2cd7,0xffec5fac,0xffed270e,0xffeda76b,0xffef31c9,0xfff1a73c,0xfff2a10e,0xffef6000, -0xffe85788,0xffe0526d,0xffd8b86c,0xffe79543,0xffec1dc5,0xffcdb4cb,0xffbbe3da,0xffb92dae,0xffd90e53,0xffbfed6d,0xffb53fbf,0xffb4537e,0xffb41fd5,0xffb92f4d,0xffb442cd,0xffb354ed,0xffb57f3c,0xffbfe262,0xffd8d0c6,0xffb90a2a,0xffc1e29a,0xffd49917,0xffeec29b,0xffea8db4,0xffeda0f9, -0xffeed4ba,0xfff029b8,0xfff19594,0xfff2efea,0xfff2c600,0xfff298c0,0xfff221b8,0xfff17207,0xfff0179b,0xffef4aeb,0xffecc883,0xffec194e,0xffebf25d,0xffeb24f9,0xffed187c,0x0006c7b5,0x00088183,0xfff6fbd8,0x002f6b97,0x003f085e,0x002bc9cf,0x0020109a,0x00362290,0x002e690f,0x0026292f, -0x0023407c,0x001b1cda,0x0025c547,0x00276d27,0x00224a17,0x003d277a,0x002b26b7,0x0028648e,0x003b43fe,0x002ee740,0xfff6a153,0x00043848,0x0005aed5,0x0009dd08,0x000c2641,0x000dabbc,0x000f3b60,0x000bcc2b,0x000a5a75,0x0006fabd,0x000af50c,0x000a3a19,0x00044418,0x0009da4e,0x000bafa9, -0x000e983c,0x000a81b8,0x000c454a,0x000bf5b8,0x00356003,0x000a769f,0x00305ad5,0x000fc3fb,0xffff1ce9,0x000edb17,0xffedbac3,0xfff3addd,0x000a5255,0x0007d776,0x00091897,0x0010c0a2,0x0021b6c4,0x0020f687,0x002aab00,0x00118ab3,0x00257c63,0x00019447,0xfffaf8b0,0x000d7804,0x00191743, -0x0022fa51,0x0025112e,0x0021c3d2,0x00154550,0x000dc86a,0x0007f52c,0x001368a6,0x0016d22f,0x000d7b96,0x001dc933,0x0021be98,0x0024e65a,0x001c746f,0x00098a43,0x00028306,0x001eb7d3,0x000da53e,0x0037a3f6,0x000066c2,0xfff2c11c,0x000665a0,0xffdb513c,0xffc162a5,0xffe6aed4,0xffdd3c7c, -0x00073f68,0xfffc1c95,0x00261300,0x00225122,0x00277484,0x0014676f,0x00156e4b,0xfffc95c6,0xfff2bad9,0x000cff46,0x0022940a,0x0034f1c6,0x003b6763,0x003e6863,0x00293a28,0x00237e2f,0x00178263,0x0026a6a5,0x00256164,0x00099835,0x002e958c,0x0033fd05,0x00344002,0x00292867,0x0019c31b, -0x00115c79,0x001729b1,0x0008a498,0x0041da07,0xffe5b648,0xffc9b15d,0xfff765ce,0xffc37217,0xffbdcb1c,0xffbd9425,0xfff3254f,0x000b9dd3,0x000b41ce,0x00289d30,0x00310e5b,0x00468ee0,0x0004d38b,0xfffdc24e,0xffdf6063,0xffe453a2,0x001b6667,0x004bfeb1,0x0071c71e,0x007fd57a,0x006b4035, -0x003986b5,0x0017979e,0x000cebf0,0x002da380,0x003c9bf5,0x0028c302,0x0065da49,0x006df48b,0x00674b65,0x0050e8e0,0xffba41a4,0xfff7f2c5,0xfff3c9cb,0xffe6378a,0x000cb1be,0x00307a96,0x0034dfdb,0x00283144,0x0004dd79,0xfffaf263,0xfff3303f,0xfff3ab90,0xfffbecbc,0x0029d19c,0xffdd70b8, -0xffcc0283,0x0000d0fd,0x0018b071,0x0055611e,0x005f7f7f,0x0020362e,0x0003f479,0xffc45e79,0xffb0fc8a,0xffa5bf07,0xffab5a12,0x00262113,0x006f0afe,0x005a626d,0x0044c8c9,0x0011a545,0xffe52160,0xffd7d431,0xffd7a0d2,0xffd85b2d,0xffd8dc77,0xffe078bb,0x003a4f4d,0x00b38874,0x007104ab, -0xffe0c6cd,0xff8c896f,0xff866679,0xffc9ab4c,0xfff28699,0x0000fa82,0xfff6c79c,0xffede35b,0xffe31209,0xffed80d7,0xfff0a31c,0x0005d5c0,0x0004be54,0x00204f6f,0x003378e0,0x002f6e36,0x000612bb,0x00118de2,0x0026a1ed,0x00307d9a,0x00494711,0x00621bb3,0x00058153,0xffb61a2b,0xff6dd8c5, -0xffd3568d,0x00322189,0x005caf4c,0x007f2b92,0x003af6bc,0xff847d21,0xffc1f194,0xffca39f8,0xfe9ee788,0xfec7db4e,0xff25de6a,0xfffeceab,0xffec2337,0xfff30da8,0x00142a9b,0xfff560fd,0xfff1f244,0x00026f2b,0x000b7597,0x00040a50,0xffe26439,0xfff1129d,0xffee4528,0x00058163,0x000f51c7, -0x0025c250,0x001bca90,0x00008211,0xffff2582,0xffe998a1,0xffd67e4e,0xffc97301,0xffd535d7,0xffcefbf0,0xfff73b61,0x003fdae6,0xfff9b476,0xffbd2559,0xffb36f1e,0x000a34cc,0x0038128d,0x00205daa,0x00486497,0x004dcfc1,0x00981be8,0x00ce79ee,0x0099c773,0x003e1db2,0x002d7aea,0x0030b376, -0x001aab18,0x00016cdb,0xffffd2e7,0xfffdafdd,0xfff5f798,0xfffa693e,0x00066428,0x0005cc10,0x000f2674,0x00139bc8,0x0001aaa0,0x000199f0,0xfff403cd,0xfff13f48,0x000882d2,0x00258320,0x0027c7e6,0x002f418e,0x002a880a,0x0028c56c,0x000c275d,0xffe7185f,0xfff419bf,0xfffd8172,0xffe82f02, -0xfffab4c7,0x001147e6,0x0049d81d,0x003b0a60,0x0010d5d5,0x0016bac8,0xfff0094b,0xffe954e5,0xfff512f1,0xfffac25c,0xfff9f8b9,0x00196a94,0x000b8611,0xfff60496,0xfff27a55,0xfff229e2,0xfff4dcb5,0xfff9d156,0xfff478ff,0xffe7a1f5,0xffc522eb,0xffcb7692,0xffd54b7c,0xffc7d78b,0xffc95727, -0xffdc4e61,0xfff01077,0x000d7239,0x002c2133,0x004b710f,0x0058154b,0x00688c12,0x006edfb5,0x0057bab7,0x003a9640,0x00210a19,0x0020c5c2,0x001aa13f,0x00042143,0x00171f27,0x001b97b8,0x003e69bd,0x004524b0,0x003a99f1,0x0034edb3,0x002b49eb,0x001a7301,0x001aa5a1,0x0018cdf6,0x002040b6, -0x001f3a72,0x002792b5,0x00198b98,0x0000c048,0xfff05cdf,0xffec78ae,0xffecd819,0xfff010e1,0xffeed0bf,0xfff3b8a9,0xffeee4b7,0xfff0e76e,0xfff07c91,0x000a14fe,0x001638be,0x001ae73e,0x0027fd5c,0x00295035,0x002ac004,0x00347345,0x0045a2d7,0x0056c932,0x00431e7a,0x0036d3a5,0x002c2196, -0x00256c75,0x000e7b48,0x0010ee63,0x0020f761,0x0022502e,0x002a5f55,0x002d68b1,0x00338c0a,0x0038c1ae,0x002d89ed,0x001c5b35,0x0013cdc1,0xfffce7a4,0xfff1bdfa,0xffe46007,0xffe4b7d0,0xffdf8211,0xffdb7a39,0xffe0a382,0xffebb7d6,0xffe5c2f2,0xffdb9ba7,0xffe092e8,0xffdbfd1c,0xffe5bc04, -0xffedead4,0xfff74ea7,0xffffa083,0x000bb981,0x0018ac84,0x00123e89,0x000b50ad,0x000845a2,0x00076f72,0x000a3a3a,0x000c48f8,0x001360aa,0xffd09281,0xffd3dcd8,0xffdb13a7,0xffd28569,0xffd70b39,0xffd51037,0xffd00cdf,0xffcf5b14,0xffce1d5a,0xffd4c500,0xffdfa08f,0xffdebd14,0xffdc88e0, -0xffe0c3ba,0xffe3b98c,0xffdf7f5b,0xffe06c96,0xffdb176c,0xffe4acfe,0xffd39c3d,0xffd59ecf,0xffd95c7c,0xffdae00d,0xffdd5b89,0xffde38b8,0xffe00916,0xffd8cdcf,0xffd326bf,0xffd0933e,0xffd12183,0xffd4b3a1,0xffd6c61a,0xffd78ea9,0xffd6b84b,0xffd42554,0xffd28fa0,0xffdc2e0a,0xffd82f3a, -0xfff139df,0xfff889ef,0xffeb897d,0xffedb7a1,0xfffab1ef,0xfff1f7fe,0xfff39f1e,0xfff38579,0xffefc458,0xfff29b66,0xfff44d4a,0xfff3bf76,0xfffcf01d,0xffeda9e0,0xfff2e840,0xfffa27b6,0xffeedc00,0xffd36e63,0xffdac3a4,0xffdb0bd9,0xffdc74c2,0xffdd4164,0xffde0ec3,0xffdfcac4,0xffdf40b2, -0xffdf687e,0xffde4bc8,0xffdd4365,0xffdb6721,0xffda1d58,0xffda17fa,0xffda95c2,0xffdb6fbc,0xffdc4a83,0xffdb9f44,0xfffb98b5,0xffff74f4,0x00008c26,0xffda6e04,0xffdeff50,0x0013840f,0xffdceef9,0xffdb427c,0xffff92db,0xfff68dc3,0xfff60bd9,0xffff03c1,0x00003d05,0x0003c7dc,0x000820c4, -0xffe15123,0xffe15f64,0x00150bf1,0xffe30bba,0xffdb1cbe,0xfffc0275,0xfff9edb4,0xfffab547,0xffff8a81,0x0000dd45,0x0001349a,0xffffcbd5,0xfffe5bab,0xfffdb1bb,0xfffc3e49,0xfffc4b3e,0xfffa2198,0xfff56a71,0xfff67169,0xfff9516a,0x0003b4db,0xffff6bd4,0x000b1f69,0xfff34b9d,0xffe84a14, -0xfff00c31,0xfffa072d,0xffe90661,0xffe3d247,0xffefa9a0,0xffdd2928,0xffd1b472,0xffd394e4,0xffdd687d,0xffecfeb3,0xffe9fb5d,0xfffdcb74,0x00040592,0xfff91876,0xfff86820,0xffed4847,0xffe78f64,0xfff5957a,0xfff73909,0x000881f3,0x001157d1,0x0014a983,0x000bc98f,0x0003eba1,0xfffbe9ad, -0xfff6b61b,0xfff91832,0xfff5f85a,0xffed7d39,0xfff04fb1,0xfffa1d1a,0x0014b21d,0x0009cdc2,0x00157250,0xfff24192,0xffd84d87,0xffe60bf7,0x000f0bf5,0xffe4f0b5,0xffdc0abe,0xfff18abd,0xffbe541e,0xffc1fc72,0xffc327f2,0xffdfc592,0xffe8b2dc,0xffea55fe,0x00014327,0x00079acf,0x000e851e, -0xfffaa143,0xffe2748c,0xffe04c92,0xfff06a63,0xfff3c22e,0x000bbad0,0x0018354f,0x001bffaa,0x000ec412,0x0008b742,0x00047101,0xfffff151,0xfffb0578,0xffee177c,0xffdc0518,0xffe1e6b2,0xfff7f4ff,0x0029c754,0x0013b11d,0x002f20ce,0xfffbcf5c,0xffda1377,0xffeae855,0x002d07be,0xffd574eb, -0xffc5f3a6,0xfff454eb,0xffbf6287,0xffb46034,0xffcad69b,0xffed5756,0x0004765d,0x001142b8,0x00263c59,0x0034b892,0x003049a1,0x000d136e,0xffe073fe,0xffd2efc5,0xffe3b91b,0xfff1c1a6,0x0021d49f,0x0040152c,0x004bc891,0x002aef1e,0x000c7e0e,0xfff1ba5f,0xfff03b63,0xffecb977,0xffe5760d, -0xffd8bc1d,0xffe905a7,0x000f3656,0x005bfe2a,0x00368f1c,0xffd1e862,0xffc1c733,0xff9bf516,0xffb6dd2f,0xffeed274,0x001abc9d,0x002f51eb,0x002cab20,0x00058024,0xfff4094c,0xffee671b,0xffebf209,0xfff79845,0x002726b8,0xffd4767c,0xffc53935,0xffe34335,0xffff4ce9,0x000d2d4d,0x0014a390, -0x000a535a,0xfffb37bc,0xffea9d40,0xffbfae0c,0xffc4c55d,0xffe36a8f,0x0062b62e,0x009e5ead,0x0066fbaa,0x00467f4d,0xfff53d41,0xff95ffa4,0xff9cf1d0,0xffaf2ccd,0xffc8714a,0xffcdcf4b,0x0010d90a,0x002d1756,0x006ef7c6,0x005ad4c2,0xffd84c9b,0xff7f3ab7,0xff8199ad,0xffbe6308,0xffeede77, -0x0000220f,0xfff8f78b,0xfff3c51a,0xffe4e538,0xffec63be,0xfff42835,0x0003ef54,0xfff5c28f,0x001c55ee,0x0021498c,0x002117ad,0xfff3e47d,0xffdc6caf,0xffeca2df,0x001673d3,0x00364303,0x00348ac1,0xffe33271,0xffa046f9,0xff6e23a2,0xffd250a7,0x001de03e,0x002d4651,0x00278ca1,0xffee6341, -0xff7e3c8d,0xffbf030f,0xffc43e24,0xfeb19a1a,0xfeb3e83a,0xff1ee021,0x0000b468,0xffdfaa58,0xffd90c65,0x001171a6,0xfff48042,0xfff590b7,0x0000d596,0x0007f159,0x000341c8,0xffe4b51e,0xffe96518,0xffe6a434,0xffef1c61,0x000413ed,0x000037c1,0x000a749c,0x0012d8ac,0xfffbd9cb,0xffe68a95, -0xffc41c1d,0xffa91524,0xffa47999,0xffacfcbc,0xfff20664,0x005e8aa3,0xfff877c1,0xff8cd3d1,0xff437f92,0xff77af1a,0xffaa0d31,0xffaed311,0x0018f9df,0xffe74f79,0x005b60ed,0x00b60756,0x0093f5a5,0x0046cc8f,0x002a6839,0x00330a45,0x0021752f,0x00023e05,0x000020fc,0xfffed170,0xfff6a4fb, -0xfffa5d1d,0xfffe1154,0x00027673,0x0009d564,0x00113d36,0x00071e43,0xfff2f86d,0xfff5ed90,0xfff7a7a2,0xfff80c9a,0x000f0241,0x0003b6a1,0x0006dd90,0x00017d6f,0xfff33804,0xffced930,0xffa84c37,0xffbb6853,0xffcfceb0,0xffe06862,0xff914d56,0xff7a8aa3,0xff9a148a,0xffa49d3f,0xff9d47bf, -0xffb00594,0xffbdd036,0xffc6395b,0xffd7cbda,0xffe8ffc8,0xfff285df,0x000720f3,0xfff7cd42,0xffedabf1,0xffe6fd9c,0xffeef405,0xfff30f9d,0xfff2d0fe,0xfff4dbaf,0xffe9923f,0xffcb6c10,0xffbeaea4,0xffb0cf18,0xffbd4bb5,0xffc6a362,0xffd46f03,0xffef4fe8,0x0000a2dd,0x000f51e9,0x0011daf2, -0x0018700a,0x001af1f2,0x000c13cb,0x0010082b,0xfff187d5,0xffd37343,0xffaf8fee,0xff9af237,0xff95c4b7,0xff936649,0xffe67740,0xffec087a,0x000ed104,0x00084a8a,0x0010307f,0x0009a819,0x000c1116,0x000a4e2e,0x000fe79f,0x0018ed41,0x001e1793,0x0022b841,0x0019152d,0x00057664,0xfff1ac02, -0xffe38225,0xffdbc8ae,0xffe6ccdc,0xffeecbef,0xfff585f7,0xfff5d9b6,0xfff2ca87,0xffedbc91,0xfff6264a,0xffffea93,0x000a98f1,0x00240e1b,0x0037863b,0x00496906,0x004cfe09,0x0052417e,0x004d8a86,0x004761ab,0x002fc8eb,0x0011a5e9,0xfff36128,0x001c37d6,0x00114b62,0x00063300,0x00128fa3, -0x0019860e,0x0023b80a,0x002e833a,0x0039a1a3,0x002a49d4,0x0023c06b,0x000da487,0x0008566a,0xfff3ae41,0xffeb5332,0xffe4b7ea,0xffe0f710,0xffd6f02d,0xffd7e694,0xffd2af75,0xffd9f61e,0xffe1ef7d,0xffe0a19b,0xffe2bd8c,0xffeb028c,0xfff355c4,0xfffb0ae6,0xfffda1c7,0x0000b3f9,0x0005f0e3, -0xfffe6415,0xfff9ad94,0xfff6ccbc,0xfff826af,0xfffd4392,0x0009a6ef,0x00126edd,0xffce29ee,0xffccf9e2,0xffcdfdf0,0xffd48e0c,0xffcc4f99,0xffcf345e,0xffcf9808,0xffcd344a,0xffcec3db,0xffc8f899,0xffc39d9d,0xffc6558c,0xffcac25e,0xffc65d38,0xffca9666,0xffd19603,0xffce7b6f,0xffd742b5, -0xffd42e3d,0xffdfe05c,0xffe48929,0xffe3ce71,0xffe5a36c,0xffe5f6a4,0xffe6182e,0xffe78186,0xffe3252a,0xffdde1dd,0xffd8037a,0xffd357c5,0xffcf5a09,0xffc9b987,0xffceadfb,0xffcf6b9c,0xffcdf65a,0xffcb01ef,0xffdb8876,0xffddbb85,0xffc85803,0xffc8a6bd,0xffdf1cd8,0xffcd5e3d,0xffcbde18, -0xffdab5f3,0xffd9be7b,0xffda1f25,0xffdd93ee,0xffdaf7cc,0xffdb097b,0xffdc9a22,0xffc4168a,0xffc79f8b,0xffdce410,0xffc798b5,0xffc9b78f,0xffe05c0d,0xffddc0af,0xffdf5dce,0xffe0e182,0xffe1cffe,0xffe2dc09,0xffe47866,0xffe1b658,0xffdff695,0xffdde8d4,0xffdbd201,0xffd956cc,0xffd54182, -0xffd66b57,0xffd72686,0xffd944a7,0xffdac255,0xffd7b1ea,0x00268433,0x0022d59b,0x0024df0e,0x002f1ccf,0x0018e4d3,0xffe927cb,0x0030d323,0x0019019e,0xffef7bf4,0xffe60347,0xffe385b0,0xffe1d91c,0xffe4203a,0xffe4db2c,0xffe1262a,0x001d0849,0x003457b2,0xffe3dd15,0x0019375a,0x002d2ebd, -0x0021ab41,0x0020b0da,0x0026d639,0x002c0c1f,0x002dc38a,0x002e73a3,0x002cfbe9,0x002b3b10,0x002a897b,0x0029b44d,0x002b740a,0x002b268e,0x0027c15e,0x002c3f41,0x002c31f0,0x00297312,0x00281e2e,0x0027f975,0x002f3db4,0x0007a95b,0x00216541,0x0025c821,0x000a8d4e,0x000b0d65,0x0010141a, -0x00023950,0x0005af80,0x000de345,0x00157df9,0x0014cc61,0x0018c7b5,0x001bfb39,0x00222c38,0x002ecb26,0x0020065d,0x00044172,0x00241c81,0x0025123e,0x00374f08,0x0048a101,0x0050ba70,0x00501395,0x0043f4c9,0x003b18cc,0x003518cd,0x00354066,0x003b58a8,0x003e7505,0x0038bd04,0x0045f9d1, -0x0044b5c9,0x003a42e1,0x003489be,0x002bde46,0x00244d50,0x001d8191,0x0015bd3f,0x00255190,0xffffcf7c,0xfff37d94,0x0001c868,0xffd46c3f,0xffc8aacb,0xffe41a68,0xffe89c5e,0xfff82d41,0xfffdeba7,0x001a656c,0x0022f5cb,0x00238f96,0x001995c4,0x001349ac,0x001195f4,0x0024f7be,0x003add1c, -0x005ca0a0,0x006ab814,0x006cf545,0x005e80a7,0x00548072,0x0050ff59,0x0051fb64,0x00546bad,0x0054748f,0x0045a618,0x00618b8b,0x005d3d1c,0x0048b611,0x004149d9,0x002f9f00,0x0023a1ff,0x000dd789,0x000e825c,0x0033184d,0xffe533ad,0xffc66f77,0xffe7392d,0xffb5b6e0,0xffad8699,0xffc48530, -0xffe28b03,0xfffe7069,0x0008a660,0x0027bb96,0x00384048,0x003e7d04,0x001dffe4,0x0005a3dc,0x00039dae,0x002a0a26,0x005e2791,0x00a1a535,0x00be8d06,0x00c02a31,0x009014d7,0x006b2c96,0x0050aa78,0x00594b56,0x0066c5bd,0x00715a54,0x006b7d2b,0x00969f6c,0x008dc48f,0x006b0862,0x00521f15, -0x0030a90d,0x0020c397,0xfffecd29,0xfff621ad,0xfffee7a3,0x002e879d,0x0046b946,0x0048264a,0x0014bba3,0xfff9c658,0xffee7d39,0xffe991eb,0xfff59135,0x002c887e,0xffd8b334,0xffc718db,0xffe416a5,0x0005f7b9,0x0022251a,0x0036aaf8,0x002d6ec9,0x000ad26d,0xffd9bccf,0xffc24ca6,0xffc5d3d5, -0xffcb2742,0x0068f74f,0x00ae0d7c,0x007f30bc,0x00793453,0x004debcd,0x001b22ed,0x00207bfc,0x002199f7,0x00139aeb,0x00328a1e,0xffefbf30,0x003978f7,0x00a2dfeb,0x007c95a0,0x000cdfb2,0xff95995a,0xff7bb910,0xffba3106,0xffeca729,0x000356b9,0xfffb0a12,0xfff81eb2,0xffe80ea8,0xffe74997, -0xfffd791d,0x0016fe7a,0x001132b9,0x0024e210,0x0028b49a,0x0044f3ed,0x003837ea,0x00497e45,0x007737a6,0x0079a790,0x006f7677,0x004451c4,0xffe20029,0xff9e3721,0xff788190,0xffebeb08,0x0040aed3,0x004c96b8,0x00539b57,0x000f38c9,0xff7d8b79,0xffc25d8c,0xffd90b44,0xfee5b67a,0xfebb8db6, -0xff16668b,0x0013df71,0xffdc1810,0xffd8db40,0x00140fb4,0xfffb31fc,0xfffa005e,0x0000cdb5,0x0006c3e8,0x00035aa9,0xffe7a6a1,0xfff04177,0xffeeadac,0xfff691f5,0x001312bc,0x00263669,0x0022f84b,0x000f4521,0xfffa7845,0xffe15a7c,0xffeeec2a,0x0005643f,0x0024436d,0x002eca2a,0x0056273a, -0x009a7381,0x00150e1c,0xffe99285,0x002d49d3,0x008547ca,0x00b1782a,0x009adea0,0x00544fa3,0x0045cbf0,0x00365521,0x00a9f613,0x00a718eb,0x0052ab65,0x00358013,0x003259b0,0x00292fcf,0x00050bcf,0xffffd582,0x00006768,0xfff9ec26,0xfffb587d,0xffffe017,0x00072493,0x0014573d,0x002132d0, -0x0014d915,0x000735af,0x00064da6,0x001a1c7b,0x00366e97,0x00570dfb,0x004e6822,0x00400da9,0x0024648b,0x00270401,0x000ed725,0xfff7f7c6,0x0003859c,0x00120f54,0x0010a26b,0x0047cd6a,0x007f8dd8,0x00dbecbe,0x006f0e80,0x0083594e,0x003685cb,0xffd1bc42,0xffdda534,0xffebff1b,0xfff65c64, -0xfffca150,0x0013b859,0x00026e54,0xfff5239f,0xffee86b7,0xfff1dc26,0xfff5c6a1,0xfff8ee27,0xfffb41ab,0xffefea5b,0xffd216f0,0xffd2d658,0xffce67f0,0xffd4e963,0xffcfc4ac,0xffd6460d,0xffeed5b3,0x000c35e9,0x0030bea8,0x005617ef,0x006848cf,0x007b251a,0x00897872,0x006ec438,0x00591060, -0x0055a2eb,0x005ad636,0x005a0b74,0x005819ea,0x00766685,0x00179486,0x00258825,0x000a8193,0x001ba48e,0x0016f8a7,0x001756ac,0x0010614f,0x000d0b21,0x0010bc89,0x00164cc1,0x00188b7c,0x0023ca0e,0x001e9c10,0x000d8fb5,0xfffda2e1,0xfff5848a,0xffef267e,0xffeba644,0xffeb8efe,0xffef5eef, -0xfffb6176,0x0008cb16,0x000a16eb,0x0026020d,0x0034f909,0x003d2786,0x004c8f5a,0x004c3714,0x00488518,0x005327cf,0x006b7310,0x008fd120,0x00704033,0x00575720,0x0039d085,0x0021bad6,0x0040ecff,0x0038b3fa,0x00386d99,0x003f7d9f,0x003d8c15,0x00417666,0x00432d32,0x0048c105,0x00390ef8, -0x002fe7d1,0x0022cc5e,0x0014f21a,0xfffdda4f,0xfff62eba,0xffeedbe8,0xffeb9de9,0xffe16dce,0xffe72660,0xffee2ab0,0xfff2f696,0xffee8276,0xffeb17cf,0xffe59f9e,0xffed74fe,0xfff473e7,0xfffaf19a,0x000dd3ae,0x00232091,0x0039145d,0x0039173c,0x00353b53,0x0035d78d,0x002f124a,0x002fc68f, -0x00343e7a,0x003ce4d8,0xffe70c4b,0xffeb6c98,0xffd29da6,0xffe9a2a9,0xffe4af3c,0xffe327cf,0xffe8ec09,0xffe793cd,0xffe999de,0xffeb3193,0xffe8ebbe,0xffecbf3e,0xffe93d05,0xffe78f24,0xffe39de7,0xffe28c4d,0xffea8399,0xffe541fe,0xffdeef71,0xffdfa279,0xffdd12fe,0xffe1dbb3,0xffe35a49, -0xffe4805b,0xffe4d039,0xffe4811e,0xffe33ca1,0xffe1dbbe,0xffe3ffa1,0xffe7f20d,0xfff00719,0xfff7b64d,0xfff7e2c5,0xfff61c1f,0xfff137bf,0xffebc975,0xfff1d513,0xfff3cb8c,0xfff7b1ec,0xffec3763,0xffceee21,0xfffe6e1f,0xfff21291,0xffd88798,0xffd5a6b8,0xffd350ce,0xffd02826,0xffcd565b, -0xffcb75fd,0xffc8a4a7,0xffec7958,0xfff666d6,0xffcc8486,0xffeada27,0xfff2ecec,0xffe802da,0xffe9e2db,0xffeaf018,0xffeb3c80,0xffebd4c9,0xffec6945,0xffed112a,0xffeeeca4,0xfff0b1ec,0xfff179ad,0xfff2eef7,0xfff32b73,0xfff4977e,0xfff269b1,0xfff20459,0xfff2657d,0xfff3a53a,0xfff05c6c, -0xffe70f02,0xffee8f53,0xffdf190a,0xffeed3f4,0x000ff427,0x00454f59,0xffe016e1,0x0004e465,0x0034504d,0x002fbb2a,0x002e7fa7,0x00302c12,0x003662f0,0x003980f0,0x003ada88,0x000ae6b9,0xffe9379d,0x0049030a,0x000f4d42,0xffeff44b,0xffdcad68,0xffe89902,0xffe63055,0xffeaca25,0xffeb89e2, -0xffeba79c,0xffe9a453,0xffe97a03,0xffe8d457,0xffe84535,0xffe57e1a,0xffe3724a,0xffe04602,0xffe403b2,0xffe83bed,0xfff44907,0xffecb8ba,0xfff29b13,0xffdefd3e,0x001a8fb8,0xffe3f0d3,0x00000bac,0xfff48f09,0xffe10d29,0xffea974b,0xffd0d9ef,0xffcdcab4,0xffdfe7cc,0xffda28bb,0xffe53366, -0xffe68d04,0x0005aa27,0x0006d239,0xfffd1e20,0xfff98684,0x001b1ff9,0xffdcd9ff,0xffe14513,0xffe5e2b0,0xfff17e84,0xfff75e41,0xfff78db9,0xffecfc8f,0xffe9a048,0xffe407ca,0xffe24dd8,0xffdda407,0xffdb274f,0xffd78bac,0xffe24310,0xffef15c1,0x000991da,0xfff8c2bc,0xfff8af68,0xffe4c910, -0xffeef8cc,0xffeaee6f,0x00109222,0xffeca973,0xffe45dac,0xffe8e817,0xffc9093f,0xffba8f5f,0xffd1001a,0xffcc91bd,0xffed3b8a,0xffde28f8,0x00096c77,0x0003a97a,0x0008e722,0x000035f2,0xfff7a689,0xffdeea49,0xffd4c0b7,0xffdfb67c,0xfff18bfd,0xfffa8710,0xfffb74a5,0xffed22cb,0xffee764a, -0xffe9dc03,0xffe867d1,0xffd47e93,0xffc919d5,0xffc15200,0xffd8a837,0xfff32e0d,0x002332aa,0x0006eba2,0x0004cb46,0xffeef2d5,0xffeaf90b,0xffe1a86c,0x0014a4b2,0xffd2b5c7,0xffbd9712,0xffdeb483,0xffab9ba8,0xffa57444,0xffc8b535,0xffdfa50b,0xfff0de8f,0xfffe46ff,0x001a50f8,0x0023c516, -0x00330674,0x000d1752,0x00059b8b,0xffe080af,0xffd49e45,0xffea2cce,0x000c3ce3,0x001f0364,0x001edc89,0xfffa7090,0xffeb2f96,0xffd8783e,0xffdd7314,0xffc6371a,0xffc19a48,0xffc45e6c,0xffee3693,0x0019fc79,0x005b8c62,0x002af797,0xffcac722,0xffdbb49e,0xffe81d19,0xffeabac5,0x0006a4a5, -0x0030cb4b,0x00415079,0x004b9b77,0x0014d1fe,0xfff38e6a,0xffed4f78,0xffe543ed,0xfff18e9f,0x002acba9,0xffd38703,0xffb8ce24,0xffce9e4c,0xffd0d511,0xfff00918,0xffe04b7c,0xffb0e3aa,0xffb5fa74,0xff972b83,0xff9e7063,0xffaff56e,0xffc45dd5,0x0039db41,0x005c9a0f,0x000ef281,0xfff9b802, -0xffb38821,0xff5e4e51,0xff82f180,0xff9ac3cf,0xffa81c07,0xffd08dee,0xffd02cdb,0x000055d8,0x00637c4d,0x00543d52,0xffee5520,0xff84b693,0xff6f8e7b,0xffb02dab,0xffe6fc01,0x0001b768,0xfffbee29,0xfffb40ab,0xffe8ff0a,0xffe15f5b,0xfff4ce3e,0x000a2025,0x000527f4,0x001d6f20,0x0030daf8, -0x002d27dd,0xffec6238,0xffe0ee8c,0xffdc723f,0x001763a4,0x002b2796,0x000b68c5,0xffc98e9b,0xff932b2d,0xff72e0ad,0xffdd15f1,0x0025fa00,0x002f3d41,0x00088ccf,0xffcae159,0xff7ec384,0xffa9e396,0xffbbdd3f,0xfefa7096,0xfed6d51e,0xff21a588,0x0018ecc8,0xffd3aad2,0xffcf443d,0x0006f9f9, -0xfff85ea3,0xfffa63b1,0x00002d46,0x0002e26a,0xffffe477,0xffe9c545,0xffe877ef,0xffdb8266,0xffe92249,0xfff4dce8,0xffff99a9,0xfff7b5ec,0xfff040ef,0xffea2092,0xffcd17f6,0xff9ba7cd,0xff779adf,0xff6fb3f6,0xff7beeed,0xffc51ced,0x00466c73,0xff90651f,0xff2010f1,0xff1f101f,0xff61388f, -0xffaf31da,0xffce391f,0xfff99240,0xffbcbaa0,0x000bd9e2,0x008b0f46,0x00872e13,0x005c22c6,0x001fa034,0x00274fad,0x00242c3a,0x000555fb,0x0000c0d7,0x0002ed06,0xfffa6a78,0xfff97fdb,0xfff70307,0xffffd64c,0x000f40d2,0x0018ea00,0x000edb02,0x000c9a14,0xfffe13ef,0xfff113a7,0xfff07730, -0xffff0a20,0xfffafa10,0xfff94453,0xfff0cf24,0xffec8a22,0xffd57b2f,0xffc93d50,0xffd66747,0xffde453d,0xffcbce5d,0xff96deb9,0xff832075,0xff949551,0xffa25269,0xffa71db7,0xffdd583e,0xfffdc78b,0xffd6eaec,0xffda1508,0xfff54b47,0xfff991b0,0x0000d368,0xfff99b81,0xffec3588,0xffe96665, -0xffed92f9,0xfff2c75e,0xfff2a160,0xfffaef13,0xfff1ba61,0xffd4ee0c,0xffc5e67d,0xffc35eb3,0xffbec6ed,0xffc54439,0xffd5a900,0xffe512b0,0xfffce125,0x00098662,0x0006b01d,0x000e57b8,0x000da982,0xfffad486,0xfff288db,0xffd10fb1,0xffacde5c,0xff8ff6e4,0xff8290af,0xff7f699c,0xff9bfa8b, -0xffb2c093,0xffcfb678,0x000a7f5b,0xfffd6769,0x000aa78e,0x0000a9cf,0xfffe0888,0xfffffaa9,0x00004e2b,0x0007fb5b,0x000afa14,0x0018f41e,0x00164d04,0x000bdd72,0xfff925c8,0xffeb8231,0xffdf1a91,0xffe4bc44,0xffe74bcd,0xffefdc30,0xffebb73a,0xffeb1a26,0xffe9ccb4,0xfffaaccf,0x000abbbd, -0x0017ed92,0x003149f8,0x00442ecd,0x00573e65,0x0051533f,0x00449244,0x002670b0,0x0021eeb4,0x000d05fb,0xffea079b,0xffcc7d5f,0x0022c102,0x0026f752,0x002a59f0,0x0029ca25,0x0037c943,0x00392576,0x003d19ee,0x00408dc8,0x003a7813,0x002fb12e,0x0026b949,0x0014bd19,0x00099a90,0xfffbb036, -0xfff54d87,0xffeb56a6,0xffe0cb42,0xffe1d4f9,0xffe186d1,0xffdb3372,0xffd96290,0xffdd4be1,0xffdd84e9,0xffe50843,0xffeb33cd,0xfff1c744,0xfff6bbc7,0xfffc6d66,0x0004f966,0xfffd7627,0xfffa8a92,0xfff5e63b,0xfffac7a0,0x00010352,0x000e1a79,0x001caf24,0xffd4df70,0xffd67ac6,0xffef0a64, -0xffdfb0a3,0xffe2cc7d,0xffe55afb,0xffdf3f7d,0xffe0109f,0xffd74416,0xffd0c7ac,0xffd18f4f,0xffca39f7,0xffc917b5,0xffc543a5,0xffcfdd0d,0xffd3d9e2,0xffce469c,0xffd4779b,0xffdeb94d,0xffda6d97,0xffe200dc,0xffe19e1c,0xffe33b51,0xffe4132e,0xffe4a3ae,0xffe61e5c,0xffde96f7,0xffd6c5e2, -0xffcf60f4,0xffc93b90,0xffc420b8,0xffbe14aa,0xffc643b4,0xffcbe3a0,0xffcf1c7c,0xffcffee1,0xffd9bd4e,0xffd869dc,0xffd9e2c2,0xffe880e9,0x000198ca,0xffd71642,0xffea2141,0x000188be,0x00009561,0x000082e2,0xffff6291,0xffffb5f1,0x00002232,0xffff3a99,0xffde32bd,0xffcd4cb9,0xfffe167a, -0xffe0d824,0xffd3aac5,0xffd583b5,0xffd73f89,0xffd720f8,0xffd88108,0xffd8eb86,0xffd966f7,0xffdad36e,0xffd7ee33,0xffd65ba9,0xffd44c60,0xffd29cc6,0xffd0ae47,0xffccb454,0xffcfa223,0xffd0ef17,0xffd38b1e,0xffd6365c,0xffce1079,0x0029d8b0,0x00258a47,0x0034b142,0x000eb1a3,0xffe9ac6e, -0xffcaf383,0x001bd998,0xffee6f6f,0xffca2358,0xffc20e92,0xffc0963a,0xffc66068,0xffc2cb17,0xffc3e5bd,0xffc3ad59,0xfff05196,0x0019b04c,0xffc7830d,0xffed9a88,0x000c7dff,0x002f2fe8,0x00240262,0x002af812,0x00302598,0x003169a3,0x0031523a,0x002d8a9c,0x002d86cc,0x002d81cc,0x002f0fcd, -0x002d09e6,0x002c451e,0x002ab20b,0x002dd54a,0x002da32a,0x002b7ef7,0x002ac373,0x002c3019,0x002e9d1b,0xffddda0f,0x001cbb30,0x0007ec23,0xfffa8eed,0x0004b4c2,0xffffea74,0x00029794,0xffffef21,0xfff9dd9f,0x000985c1,0x000c3e44,0x00093300,0x000aacad,0x00155068,0x00199fa7,0x001a53ff, -0xffe73a15,0x0025f11c,0x00307189,0x003b1ae7,0x004e004e,0x0054c7e3,0x00532de6,0x0042152d,0x003dacfe,0x0038fbe0,0x003d4cf5,0x003a0208,0x0039a037,0x00362b0b,0x003f35c6,0x003f0753,0x003783a7,0x0031209d,0x00373460,0x00299769,0x0004e0ad,0x000a8d5c,0x00085592,0xfff7e309,0xffee6877, -0xfff11efb,0xffca97ad,0xffccc537,0xffd448c5,0xffeb653b,0xffe702cd,0xfff28e71,0x0006d2e0,0x00158ade,0x0011cd19,0x0010459e,0x00009178,0x000f780d,0x0033ae2e,0x003e4d71,0x00615ec1,0x006ba57b,0x006afe30,0x00511dc2,0x0052bb92,0x0050cac6,0x005be803,0x004aedcf,0x0046df31,0x0042c87f, -0x0053ba39,0x0052b2c0,0x00477d5a,0x003c8ee1,0x0034250d,0x001dfc8f,0xfff430b3,0x0002596f,0x001516ed,0xffe1a9cb,0xffc74773,0xffd647fd,0xffad7f2d,0xffa4b31a,0xffcfc57a,0xffd7aa3b,0xfff06958,0xffffad3d,0x002235fd,0x00356dcb,0x0028c3c3,0x002a1745,0x00057849,0x00145eef,0x0046c60b, -0x0066549c,0x00a8655b,0x00bd34b5,0x00b74a88,0x007c1e3d,0x0067a870,0x0056774c,0x006c8224,0x005a43fc,0x0057473c,0x0059bad7,0x00732f51,0x00722f66,0x0060bd85,0x003f5bbe,0x00757fea,0x002a6c55,0xfffb0bb4,0x00008b63,0xfffa7c16,0x002d4976,0x005101af,0x005b57a9,0x0020622f,0xfffb6e59, -0xfff11a39,0xffe940fb,0xfff3a79f,0x0029c1a4,0xffd7dae4,0xffc5d704,0xffc6dae9,0xffe5d650,0xffdde283,0xffeec3df,0x0011ad77,0xfff6e3b8,0xffdcfb98,0xffc7f39d,0xffda58c0,0xffea7fea,0x00879227,0x00bb1af0,0x00794fda,0x0075a705,0x004d5602,0x001304e7,0x002a24d5,0x0030e850,0x001f6e4c, -0x0059f6fa,0xffff62cb,0x0024c56a,0x0068a8f2,0x0066ec3b,0x00209fd0,0xff983919,0xff73f1e8,0xffaf7a25,0xffe84e60,0x0003a1da,0xfffe2056,0xfffea499,0xffec3317,0xffe46562,0x0004f262,0x001ce68f,0x001302bb,0x00210e3f,0x001ccb51,0x0048cf44,0x004a00cd,0x0051d752,0x007e4d72,0x008aa1e7, -0x006bf9c4,0x0013f12f,0xffbdd44b,0xff8dcc47,0xff8e8ee0,0x0002e303,0x0041a7dc,0x002ee20a,0x000f3bc2,0xffd21418,0xff855fed,0xffc38b52,0xffcabb79,0xff33ac00,0xfee4c0aa,0xff3085a9,0x0009ae35,0xffd9ff3d,0xffce93f8,0x0002e390,0xfffb3dbe,0xfffebced,0xfffee28e,0x0002e90f,0x00025eb9, -0xffeec1d5,0xffeb66dd,0xffe8c1ef,0xffe62c52,0x0007dd80,0x000db7bd,0x000d9db4,0x000fadef,0xfff1c369,0xffd81fd5,0xffed7b8b,0x000c4056,0x0028ed33,0x004a26c0,0x0076d612,0x00b5736b,0x000ece6a,0xffdf3250,0x002c1053,0x0077e19e,0x00a8deb1,0x00aee289,0x002bc07b,0x002697b6,0xffe9eb35, -0x006e7960,0x0090bbd4,0x005a8030,0x0029b668,0x0022a1d9,0x002a9efb,0x0008dbe8,0x000196c4,0x0003a8af,0xfffd92b4,0xfffaf307,0xfff7ee3f,0x00052103,0x0013ce2a,0x00247ba4,0x001eb8bf,0x0008ed20,0x0011e09f,0x002ff6ca,0x00426ca4,0x005ac00f,0x004dfa9a,0x00336aca,0x000c4c21,0x000cd5fb, -0xfff86a04,0xfff10aee,0xfff5af07,0x00087ead,0x0018ee83,0x0053ccbb,0x0088fae2,0x00d053a5,0x0058af4d,0x007e61c2,0x0021397e,0xffc3407d,0xffd4230f,0xffe32d4d,0xfff2f21d,0xfffe91b4,0x00046fde,0xfff8f032,0xfff5c24d,0xffeee511,0xfff240c0,0xfff67e0e,0xfff89d36,0x00001f79,0xfff75444, -0xffe2f741,0xffd6b85d,0xffc40d5e,0xffd89099,0xffd60cee,0xffd5dc96,0xffed976e,0x00064a35,0x0025587a,0x00404a07,0x004fa598,0x005a72de,0x0062453b,0x004dc7a9,0x003c6fbb,0x003d40d5,0x00399caf,0x003688a5,0x004444db,0x0063b7c4,0xfff52bab,0xffeeef5d,0xffd6c49a,0xfff5e87f,0xfff99d77, -0x00009cfa,0x0005a748,0x000153fc,0x0008a2b1,0x000aaff4,0x000e1c88,0x0017ddd6,0x001ae717,0x0014c2ec,0x0005e787,0xfff93cc5,0xffec1093,0xffe5077e,0xffe68151,0xffe9298c,0xfffeeca7,0x00113f17,0x0015e583,0x002cdb5f,0x003c2163,0x004621da,0x005a2a78,0x006078b9,0x0060e08c,0x0064ac73, -0x007263b5,0x008aeba1,0x006eb3a8,0x0050bda9,0x00289f9c,0x0001c2ff,0x00579e8b,0x00492c26,0x003a8159,0x004367c7,0x003cb28f,0x00418e31,0x00412fde,0x0046625a,0x0037e591,0x00387178,0x002981ba,0x00270660,0x000b8df4,0x0008903d,0xfff9d562,0xfff57780,0xffe56be2,0xffe9a111,0xffe8eb99, -0xfff4f792,0xfff8c482,0xfff01d7b,0xffecdad6,0xfff1e566,0xfff74e27,0xfffacb00,0x000f2530,0x00232ce0,0x003863e4,0x003d2a54,0x003ede69,0x00439026,0x003d004f,0x003dced3,0x0046416b,0x004d3b76,0xfff8bb19,0xfffaee32,0xffd5ed7c,0xfff9d205,0xffed9cc6,0xffed5917,0xfff744e2,0xfff5570f, -0xfff7723d,0xfff1cc92,0xffe48883,0xffe994a4,0xffe78169,0xffe08382,0xffdb3dc0,0xffdf98f9,0xffe858b1,0xffe8462a,0xffd97dc3,0xffe8efea,0xffe62a01,0xffe9ec4b,0xffebc3bb,0xffebfe5b,0xffec3b1a,0xffeb2e3e,0xffee873a,0xfff08160,0xfff48195,0xfff87876,0xffff6939,0x0006fb2a,0x0007ae14, -0x000685b2,0x00025dc5,0xfffc3080,0xfffd1a5b,0x00037ca3,0xffeffe49,0xffdcd3bb,0xffc83e94,0xfffb9e38,0xffe2c544,0xffce328c,0xffc89f69,0xffc5725d,0xffc4a6ab,0xffbde838,0xffb9c25a,0xffb64ea3,0xffd5e7ce,0xffedadd8,0xffbcc3df,0xffd6ec37,0xffe94bbd,0xfff4e447,0xfff1848e,0xfff301d9, -0xfff2cae4,0xfff338e2,0xfff3b11e,0xfff3a522,0xfff6228d,0xfff82741,0xfff9d0eb,0xfffc6be9,0xfffe07db,0x00005ee6,0xfffdf3e6,0xfffd454d,0xfffd83ae,0xfffedf58,0xfff70b8a,0xfff02485,0xfff5e24f,0xffe2dfd0,0x00137f21,0x00326d9e,0x0040980d,0xffffe80a,0x00270e43,0x003a5ece,0x0038f0e3, -0x0036b66e,0x00314118,0x0039a178,0x003b9c87,0x0038a91d,0x002b5e91,0x0008dcb4,0x0042d43d,0x002ea43a,0x00138de8,0xffe1c11a,0xfff19808,0xfff00991,0xfff40588,0xfff4f13a,0xfff51518,0xfff2af09,0xfff326af,0xfff2a2bb,0xfff36001,0xffef1911,0xffedba1c,0xffebb8fd,0xfff24a62,0xfff5c6dc, -0xfffcb404,0xfff555dc,0xfff3b432,0xffee9df4,0x003382c4,0xfff1ad29,0x000bfe35,0x00045f8f,0xffefb1e0,0xfff0c933,0xffdcdde1,0xffe2bfc7,0xfff85c32,0xffef0e7c,0xfff149b4,0xfff4152a,0x0010b25f,0x00103ebf,0x000ebb17,0x0007c439,0x0031221d,0xfff2826c,0xffeed8d7,0xfff9481c,0x0000e347, -0x0005892f,0x0002e328,0xfff69e62,0xfff566e7,0xfff25888,0xfff5b1c5,0xffecba08,0xffebba0e,0xffea8c24,0xfffd4f70,0x00072cf8,0x0011b923,0x0001020f,0xfff67ff3,0xfff5b764,0x00105f4a,0xffff111e,0x001159a2,0xfffb7a5d,0xfff2aca8,0xffe51354,0xffd7b817,0xffbd6815,0xffdd5e66,0xffc9bc48, -0xfff33d28,0xffdd9a76,0x001278c8,0x00090731,0x00088d92,0x000ba69f,0x0010730a,0xfff40dd5,0xffe24634,0xfff4b114,0x0004c516,0x000dbefa,0x000cd0e7,0xfffe10f3,0x00018809,0xfffdadfe,0x00028992,0xffe6b279,0xffe0a5cf,0xffde1bcb,0x000643f0,0x0017d0cc,0x0029357f,0x0010e866,0xfff0b154, -0xfff81117,0x00021274,0xffe98a44,0xfffec0a5,0xffdb7c73,0xffc06cc6,0xffc88d56,0xffa2e42e,0xffa106f8,0xffc92076,0xffd63be7,0xffe3bd7b,0xffeb00c5,0x001335fa,0x0019abde,0x002d62c2,0x00140d5d,0x00247d14,0x0000cb31,0xfff2fc19,0x0014921a,0x003261b7,0x00402923,0x003681af,0x000d920a, -0x0003d3ef,0xfff83f7d,0x000756d1,0xffe6be9b,0xffe54612,0xffed8e45,0x002d95bc,0x004ab513,0x0058a797,0x0028f5bc,0x00035d54,0x00191b5b,0x0039706d,0x0025f902,0x001f6855,0x0044ec4b,0x00546a2f,0x006259b5,0x00264d53,0xfffd2c3d,0xfff5c098,0xffeafe91,0xfff2cfa3,0x002a173f,0xffdae2be, -0xffbbb8bf,0xffc16a7e,0xffb8ee4c,0xffd9e672,0xffc562eb,0xff929804,0xff98b133,0xff6ba4c0,0xff92db86,0xffaabce7,0xffb63a74,0x00238a18,0x0037e985,0xffec6e88,0xffe59f38,0xffbe0baa,0xff8c9879,0xffb8bd5f,0xffc90d26,0xffbf15ca,0x0007191f,0xffad6218,0xffeb1d46,0x00571feb,0x004c46a4, -0x0011432a,0xff95a5cf,0xff6b9660,0xffac27a1,0xffe2289f,0x00010bb1,0xfffe29e5,0xffff9565,0xffecc801,0xffddf9e6,0xfffa60ab,0x0012eaa7,0x0015abfb,0x001c8596,0x00354fd0,0x003f3074,0x000e547b,0x00178a16,0x0011a0c7,0x003e3c61,0x00336e5b,0xfff4dab9,0xffb85c70,0xff901c65,0xff8cae96, -0xfff953e6,0x00373e10,0x003372b6,0xfffca8b0,0xffbe9655,0xff8c3628,0xffa8d4ac,0xffb17cee,0xff511e18,0xff1cb739,0xff44a153,0x000c65a6,0xffda5833,0xffda1b42,0xfff5e158,0xfffb4d3f,0xffffe878,0xfffee025,0x0002365d,0x000110a3,0xfff13f30,0xffea65b2,0xffd97d8d,0xffe823c7,0xffef11ae, -0x0002d1ce,0xffebac34,0xffdbb4bc,0xffdf66b8,0xffc04aa2,0xffa18ea9,0xff906b56,0xff91e0b2,0xffade1f2,0xffe572cb,0x0043bee9,0xff758f2c,0xff2bd69c,0xff81fd07,0xffcadf8d,0x0019d6ed,0x00456dde,0xfff0e26a,0xffedbbfe,0xffe50fa1,0x00513ae5,0x0067e8a8,0x005a4746,0x00125327,0x0011cf0b, -0x001ec224,0x0007f32a,0x0001417c,0x00043a8d,0xffff0088,0xfff94527,0xfff47736,0x00002b32,0x0013ef25,0x0020552e,0x0017588a,0x001f9657,0x000be00e,0x00033c8f,0x00098fc9,0x0011953f,0x0014dbc2,0x0009d3ac,0xfff4e8fe,0xfffa2fc9,0xffef0ca0,0xfff7ed98,0xfff955dd,0xfffc3a9c,0xffdc2ae2, -0xfffa9d12,0x00079a71,0x00110279,0x000653c7,0x00011d66,0x00217dfb,0x0022f88b,0xffedef4b,0xffeab51b,0x00021626,0x00021539,0xfffe2010,0xfffe0a27,0xfff3c28c,0xfff41955,0xfff1726d,0xfff50f33,0xfff7f2c9,0x000127b1,0xfffa7a4c,0xffe50c8d,0xffd75ea1,0xffd9efbc,0xffcbfc04,0xffcebcbe, -0xffdc6941,0xffe38d2c,0xffffcb94,0x00121472,0x001a1219,0x0021db42,0x0022ca57,0x001a3289,0xffffd94e,0xffe3845d,0xffc85cca,0xffbefb79,0xffbdefd7,0xffc0f2dd,0xfff4daa5,0xffaf735b,0xffd0a539,0xfffb87f9,0xfff8a541,0x0004f7e8,0xffff739e,0xfff9dce8,0xfffd727b,0xfffae912,0xfffe057b, -0xfffd12e9,0x000da5bd,0x0011ba2f,0x00112d93,0x0002e55b,0xfff8b79a,0xffea818f,0xffe4fda4,0xffe0ad3a,0xffe73c54,0xffe79eac,0xfff01e58,0xfff78eae,0x0011bada,0x00257380,0x0031a455,0x0045d451,0x0050af92,0x005a423b,0x004fb949,0x003d79fc,0x001ee0bb,0x0011d36d,0x0000dd92,0xffe3066a, -0xffca63d5,0x002ece25,0x003a488a,0x0046de0e,0x003d9962,0x0048bd0b,0x0044097b,0x0040bf76,0x003dccb9,0x003e67f9,0x00353efe,0x00382bd4,0x00223a66,0x001ba932,0x000de545,0x00048915,0xfff70811,0xffeae78e,0xffede41b,0xfff3442c,0xffe81f7f,0xffdedd50,0xffe2bfd5,0xffdf3f27,0xffe4cc1d, -0xffe8a61e,0xffecc6f5,0xfff83823,0x00046464,0x00130d35,0x0011c545,0x00138677,0x001319e4,0x00165414,0x001a32ab,0x00223ab6,0x002e6c17,0xffee0990,0xfff1fa02,0x00052fa1,0xfff3d5cf,0xfffa7634,0xfffa24e8,0xfff33efa,0xfff48961,0xffe8d38c,0xffe44269,0xffe724d4,0xffdcd83b,0xffd721ea, -0xffd4d4e9,0xffdd714c,0xffdd5e81,0xffdabdc6,0xffda3e6f,0xffe6f38e,0xffd8bb5b,0xffde6707,0xffe06ca3,0xffe213c1,0xffe38cf8,0xffe484e9,0xffe56a0a,0xffe064c3,0xffdb9f14,0xffd8c610,0xffd6b6cb,0xffd66352,0xffd6821a,0xffdd1977,0xffe3aadd,0xffe8434a,0xffeaf21a,0xffe6608f,0xffe4b8ab, -0xfff5c067,0x00041103,0x000a7f25,0xfff02983,0x00048d20,0x000f3dc5,0x000d77a1,0x000c3545,0x00075335,0x00086dfc,0x0007f05b,0x00049168,0xfff825fd,0xffe36863,0x00045d62,0xfff7ce73,0xffe828ae,0xffd6b5a8,0xffdb6164,0xffda4b1e,0xffdaf2b0,0xffdaf472,0xffdb0450,0xffdba9e7,0xffdb3ed6, -0xffdb83e4,0xffdb306c,0xffdbaf6c,0xffdbd6e7,0xffdb010c,0xffdd5760,0xffde7ad3,0xffe045e5,0xffe2e718,0xffd62205,0x0011de72,0x0011a0cf,0x001e9326,0xffecdb78,0xffd8543c,0xffe2953a,0xfff77660,0xffda9948,0xffd6fe49,0xffd328b9,0xffd269d7,0xffda27b4,0xffd7183e,0xffd9413f,0xffdb7d08, -0xffdbb5e7,0xfff4a7dd,0xffe36ca9,0xffdc8927,0xffeb95f1,0x0018ed8f,0x000f5b61,0x001314a2,0x0017480d,0x00185400,0x0017cc9e,0x00130788,0x00146e9a,0x0014b5ea,0x0017a19d,0x0011e8f7,0x00104d42,0x000f4481,0x001273f0,0x0013c932,0x0016a6d8,0x0013f4f2,0x001706bb,0x000fa3b0,0xffd81f9b, -0x0002f01c,0xffec66cb,0xffee1b54,0xfff425bf,0xffe99dbf,0xfff28062,0xffec81cc,0xffe23bb3,0xfff147b0,0xfff805de,0xffef8a3c,0xfffae378,0x00049f40,0xfffdfc2f,0x0008ff9a,0xffe7d811,0x000d8ca6,0x001b7170,0x001dc7e3,0x002c7f90,0x0032309b,0x00303dc4,0x001e6491,0x001e3510,0x001b2143, -0x0021b1ed,0x0014ff43,0x0010959c,0x000e0471,0x00169cb1,0x001c3d8f,0x00217825,0x00171f8f,0x00250449,0x00157ad2,0xffed13dd,0xfff7d128,0xfff1e8d7,0xfff12bb6,0xffea7add,0xffdc35b0,0xffc73c02,0xffcb6db7,0xffc3afb3,0xffe19f48,0xffdd8b7e,0xffdffeb7,0xfff83bb4,0x000223d2,0xfffd5bbc, -0x00020457,0xfff13e65,0xfffeff23,0x001b480d,0x001d2f92,0x00369303,0x003ee7da,0x003c9eb4,0x001fd277,0x0029cd19,0x002888f3,0x003865db,0x001544da,0x000bed8d,0x000cda3e,0x001c5010,0x00275312,0x0034a5d9,0x00220a36,0x001eab12,0x0007b15d,0xffdeaf00,0xffeb42ef,0xfff1d89d,0xffddfb66, -0xffca6e80,0xffc3fc56,0xffab7603,0xffa4fb45,0xffd5efba,0xffd4366d,0xffe456af,0xffeefc6e,0x0016dc3a,0x00257fb8,0x001310ac,0x00266c7e,0x0009c192,0x001482f6,0x003598e5,0x00401a2b,0x006d291b,0x007bfdbd,0x00713817,0x0038ceb1,0x00338288,0x002cffd3,0x0049b600,0x00198aac,0x0008ff19, -0x000dbc5e,0x00261f79,0x003c2596,0x004eb366,0x0023302e,0x00741f4a,0x00240ce0,0x00044e87,0x00104d84,0x0008b5bf,0x00336b64,0x00546a5d,0x00606686,0x002a282d,0x0002a742,0xfffa83c8,0xfff10ecf,0xfff69985,0x00238726,0xffde02d8,0xffc88975,0xffb1690f,0xffbf5a05,0xffa7a5cd,0xffa945e6, -0xffcde35f,0xffc52faf,0xffbbb5e4,0xffbabf32,0xffd94959,0xfff81ffa,0x00707e9f,0x0087ef04,0x003d3b1e,0x0035de1c,0x00119c78,0xffda27e6,0xfffd0cec,0x000b3d49,0x000137a9,0x004d12dc,0xfff6b1fd,0xffff5286,0x00259428,0x003e7a9e,0x00218707,0xff9b8e1d,0xff7676b0,0xffadee3c,0xffe3c8e8, -0x000010dd,0xfffef0eb,0x00015b77,0xffef009a,0xffe38181,0x00044951,0x00180b48,0x000f2ec0,0x00188fff,0x00198e09,0x003fbf82,0x003bfad5,0x00386ffa,0x004b177a,0x0065eded,0x00439a76,0xffe54ea7,0xffa46694,0xff88e676,0xffa69ed1,0x0011349b,0x0037d0da,0x001458c0,0xffd11aeb,0xff9e1b91, -0xff94fed0,0xffbf83fb,0xfface332,0xff7959d6,0xff324c36,0xff61b63e,0xffe8d1b4,0xffe42451,0xffdb3111,0xffed64fa,0xfffba14b,0x0001837a,0xfffe0b0c,0x00017dbf,0x00034716,0xfff662cf,0xffe85111,0xffdf9c83,0xffdbe2ee,0xfff3d44d,0xffee95aa,0xffea1ca2,0xfffc65d8,0xffe4f635,0xffcc1fc1, -0xffd14b13,0xffde91da,0xffe7cb2f,0x001f1a9a,0x0050f067,0x00863bb4,0xffd682f7,0xff9fea54,0xffe4d57e,0x00129a28,0x0047fce3,0x007798e2,0xffec28bc,0x000f83ee,0xffd975af,0x002b4280,0x00526606,0x0049f6e8,0x00103c7e,0x000a59e8,0x001dbc97,0x00090b58,0x0001815b,0x0003e9d4,0x000090c7, -0xfffa7ca7,0xfff3b50a,0x00015d8b,0x00105b94,0x0021205b,0x001f8ebb,0x000e9674,0x0016f0c6,0x002c355a,0x002dd8ad,0x0035b5d0,0x002cab58,0x0014c4fa,0xfff0d7e5,0xffed5e74,0xffdc4b89,0xffe1383f,0xffdf479f,0xfff3b118,0x000bf002,0x002f84c0,0x00457b55,0x004f596b,0x0020585a,0x0027572c, -0xfffbe577,0xffdad9bb,0xffdb28b7,0xffe5d0db,0xfff5734c,0xfffed709,0xfff567b1,0xfff60067,0xfff899ec,0xfff5e52f,0xfff50440,0xfff75b80,0xfff8f498,0x0002afdd,0xfffdb42c,0xfff30909,0xffdbd32d,0xffc47e01,0xffd5ac88,0xffdae71c,0xffdc21f6,0xffecdbad,0xfffe7b37,0x0010430c,0x0019728b, -0x001e1037,0x001ba9bf,0x0015796b,0x0007e1af,0xfff5f0c0,0xffecfacf,0xffdbb992,0xffd7d037,0xffee0e7a,0x000d1533,0xffc584d8,0xffb838a7,0xffc0251d,0xffd8d815,0xffe6a567,0xffee8647,0xfffa80b4,0xfff8c67c,0xffff25bb,0xfffe63d7,0x0000da66,0x000810d7,0x00105204,0x0014e413,0x0008cdbe, -0xfffa594b,0xffe8e652,0xffe0d0bb,0xffe186da,0xffe457e9,0xfff64dc6,0x00059e9c,0x000f05e2,0x001f70dc,0x002ecbc4,0x003b13b6,0x00525f81,0x0060b466,0x006855e8,0x005fb095,0x0055f92f,0x004a5429,0x00397194,0x001fb365,0xfffad0c9,0xffd49892,0x004804f3,0x003ea980,0x002f6626,0x0033d898, -0x0030bcf6,0x003421bf,0x003299f4,0x00353707,0x002f4fba,0x00360285,0x002d40ce,0x002ed508,0x001a0d6b,0x0017a46d,0x0004a80a,0xfffbca46,0xffe95fe2,0xffeb8ea4,0xffe604ba,0xffefcabe,0xfff6c421,0xffeef1e5,0xffedeb01,0xfff0d6ae,0xfff49ad7,0xfff5f911,0x0004b340,0x00113361,0x001fef53, -0x0025c8c6,0x002c68fb,0x00331fc9,0x00305ce3,0x00314623,0x003a1947,0x003e53b9,0x00055bd4,0x0005dd69,0xffee38bd,0x00049ee8,0xfff85696,0xfff899da,0xfffe7efc,0xfffbccfa,0xfffab09a,0xffef7128,0xffe013a1,0xffe120e8,0xffe0760b,0xffd80217,0xffd67764,0xffdd869f,0xffe03e58,0xffe4a296, -0xffd8bf8d,0xffe9280c,0xffe9fca4,0xffeb8237,0xffed9255,0xffed707f,0xffedbbea,0xffed0e84,0xfff1ad21,0xfff477d2,0xfff751f0,0xfff8e266,0xfffb45b5,0xfffeffd7,0x00026692,0x0004ea07,0x00059783,0x0003c654,0xfffb2881,0x00023105,0xffe767a1,0xffdc1031,0xffde078f,0xffefd3f8,0xffdedef1, -0xffdd328c,0xffd7bd3b,0xffd576e0,0xffd64d91,0xffcfff38,0xffcc1990,0xffc97a7d,0xffce0f58,0xffdeee89,0xffcda13a,0xffcfe1be,0xffdc8af9,0xfff24f65,0xffed6ae8,0xffee564d,0xffee2b3d,0xffee572c,0xffeeae0b,0xffee5a41,0xffeff821,0xfff13715,0xfff2a812,0xfff50343,0xfff6ed53,0xfff84f4a, -0xfff818c4,0xfff840a0,0xfff92967,0xfffaccd7,0xffed0979,0x000aa770,0x000b7890,0x00038fc8,0x0028bb38,0x002cc373,0x000f79d2,0x001ec8a1,0x0027a892,0x0011f622,0x0011fb8e,0x000f5f1a,0x0007f87b,0x000e1ec7,0x000f2005,0x000a14ca,0x0029115a,0x002254fc,0x000eec06,0x00298abb,0x00273650, -0x0001f045,0x0009e133,0x000bd56a,0x000f28df,0x00109167,0x0010a78b,0x000d70f4,0x000e639a,0x000e347b,0x00109308,0x000b74ca,0x000aadd4,0x000969ed,0x0011149f,0x0012a383,0x001215da,0x000db1ca,0x00078696,0x00102910,0x00226a1e,0x00092d07,0x000e6aff,0x000b5690,0x00022ac0,0xfff7d4cc, -0xfff5b053,0xfffeb3e0,0x00082cdf,0x000857c6,0x0003d63a,0x00030101,0x0012daf4,0x00152d5d,0x001bb0b7,0x00164990,0x00236efc,0x001556a0,0x00113dbe,0x001e95b8,0x0025780f,0x002a2080,0x0025a484,0x0016b38d,0x001635a6,0x001551fd,0x001e16e7,0x001261c1,0x0011c272,0x0010ae7e,0x00262c4f, -0x002a4846,0x0021da2a,0x0015df6d,0x000b0b81,0x0015e668,0x0021a406,0x00103ea1,0x000964d3,0x000637c0,0xfffd3839,0xffe0c417,0xffdfb640,0xffc824de,0xffdbc3ff,0xffd4fb15,0xfff21b4f,0xffe26b9c,0x0010e60b,0x000d105b,0x0007a99b,0x00124379,0x001a7378,0x000f0703,0x000b284b,0x001e3fb6, -0x00304ccf,0x003ac561,0x00388c7e,0x0025a97d,0x002a099d,0x00281823,0x003606c8,0x001616a3,0x00145ce6,0x00136549,0x00401e63,0x00441576,0x003348e6,0x00245da1,0xfff7612f,0x000b7654,0x000a4b87,0xfff51572,0xffec1742,0xffe7c0e6,0xffcbb4cd,0xffb71ca0,0xffa91b83,0xffa89164,0xffcd1970, -0xffd44776,0xffdfab80,0xffddd032,0x000e8c76,0x001535ef,0x001d98a0,0x001eb3c6,0x002ecfd0,0x00240d68,0x002b9915,0x005113c1,0x0071c581,0x007f2da7,0x006ebca2,0x003d0d01,0x00341db6,0x0030b914,0x004dae57,0x00272823,0x002381de,0x0029d5cb,0x006cac9e,0x0074cdab,0x004f924a,0x002878a5, -0x005ea30e,0x0055a810,0x00648606,0x004b035e,0x002d3952,0x004d75ea,0x005f22af,0x00666e47,0x00334777,0x000a80f4,0x0002c6e5,0xfff796d8,0xfff9420e,0x00236acd,0xffe8e783,0xffcc1c91,0xffb7e7d2,0xffb416a4,0xffc20776,0xffba0261,0xffa5e143,0xff9ff22d,0xff75091f,0xff9fc4d0,0xffbc8dad, -0xffcd1383,0x002dcab2,0x003a6203,0xfffccfd9,0x000160ab,0xfff9acfd,0xffeea65c,0x000f2354,0x00155056,0xfffb92c4,0x00529796,0xffb6fc5c,0xffebde85,0x003d99d5,0x003edf47,0x00318526,0xffacd3c5,0xff7a272f,0xffb28ebd,0xffe10425,0xfffd62d8,0xfffce30f,0x00018fb0,0xfff0fc09,0xffe1150c, -0x000114df,0x0019871d,0x001de4f7,0x0019039c,0x002b4faf,0x004ad7c7,0x00424e8c,0x0059ef27,0x005f63e8,0x0069a389,0x003d1413,0xffe9ba81,0xffaafbac,0xff928635,0xffb12af0,0x001a60eb,0x00453d35,0x002f3719,0xfff23861,0xffb908fa,0xff9dd6b8,0xffb7ad45,0xffa8d84c,0xffa053e9,0xff656b7c, -0xff74b863,0xffe18a10,0xffecfc00,0xfff09b1a,0xffe8a09b,0xffffad85,0x0003c5c7,0xffff5a27,0x000147ad,0x0004b110,0xfff9d713,0xffedf910,0xffdf2f4b,0xffe6ddc3,0xfff0cc0b,0x00011372,0xffe70db2,0xffdbfb6f,0xffdc035c,0xffc1a10a,0xffc70f6d,0xffd565d1,0xffe34d8a,0x0019ffc6,0x00381e22, -0x00538f0d,0xff9a9569,0xff872086,0x001e7987,0x005a995e,0x00941c56,0x00c4c18d,0xfff43c01,0x00490e2e,0xfff4846b,0x0013af0b,0x0030d9e4,0x003a67d2,0x0005a459,0xffff0fdf,0x001316bb,0x0006e1d5,0xfffee040,0x000126b9,0x00014b89,0xfffaee3f,0xfff5b6e5,0x0001d3f4,0x00150197,0x00256aad, -0x001f90d3,0x0025a81a,0x001b8c9a,0x0023d0aa,0x002fc80e,0x0032d986,0x00361354,0x0022ac24,0x00010986,0x00081bbf,0x0001e96e,0x001469b5,0x000b9d27,0x00166197,0x000e2c3b,0x007271ae,0x009be76b,0x009b86aa,0x0079eada,0x00650046,0x004d124d,0x00215c37,0x00015d1f,0x0000d385,0x0007abda, -0x0004f9dc,0xfffba651,0xffffe9da,0xfffd108d,0xfffe309a,0xfff88c83,0xfff88784,0xfffd5faf,0x00058449,0x000231a9,0xfff803de,0xffebfc23,0xffe8dc92,0xffde839b,0xffdebacf,0xffe51c96,0xffeb1716,0x0003ea40,0x001afbfd,0x00316549,0x0035fcd5,0x003839f2,0x003b7181,0x001797b3,0x00054f12, -0xfffbea07,0x0003afe7,0x000ffc76,0x001e850a,0x0058f49d,0xffcd380a,0xffdaaa24,0xffdfe74d,0xffef2a11,0xfff75909,0xfffc06d5,0xfffa7074,0xfffd0878,0xfffc1025,0xfffa85ad,0xfff7cd36,0x0003293b,0x000bf311,0x00131fb4,0x000bd5fb,0x0004b6ae,0xfff65963,0xffe672d8,0xffddece9,0xffe0d2fd, -0xffea9435,0xfffc136e,0x000b4378,0x002957b5,0x003d1753,0x0047d555,0x00566181,0x0058b700,0x005615af,0x004a58aa,0x003b6204,0x002ab4b6,0x0012aaa3,0x00035006,0xffee0815,0xffdd5fb1,0x0035a90b,0x003e0118,0x0048d760,0x004008b3,0x004238d0,0x003cb51c,0x0034f625,0x002f7327,0x00335b08, -0x00327f18,0x003b2c37,0x002cae94,0x00254179,0x001db148,0x000e6d2c,0x0000ff14,0xfff2b972,0xfff72523,0xfffde161,0xfff7b3f1,0xffee8431,0xffed9897,0xffe75d46,0xffeaa408,0xffed0ee7,0xffeeb738,0x0000a4af,0x0012a5b9,0x00268798,0x002c7dfc,0x0032a031,0x003837f8,0x00357764,0x00341f2e, -0x003405af,0x003876bc,0x000fac43,0x0014bcb3,0x000f1e19,0x000d76b4,0x000ea451,0x000b54a0,0x000a02e8,0x00094a2d,0x0001fb1b,0xfffdef7a,0xfffc20a4,0xfff5891c,0xffee2f71,0xffebf441,0xffec5765,0xffea5433,0xffec5891,0xffe62a34,0xffe88e68,0xffde3c3f,0xffdf5c69,0xffe351ea,0xffe5085b, -0xffe65ba6,0xffe72bd2,0xffe6c2cb,0xffe87797,0xffea06bd,0xffee2f13,0xfff24975,0xfff88f34,0x0000a329,0x0003a663,0x00088f72,0x000c3a61,0x000eff25,0xfffa6131,0xfffbd3eb,0x0009a6e4,0x000b7de0,0xfffb8acc,0x000840c7,0x000c21bf,0x0001c4d4,0xfffe52d3,0xfffbf304,0xfff6852e,0xfff5b3d8, -0xfff379ba,0xffeef8d2,0xfffff515,0xfff8d0c8,0xffefc6c5,0xfffc39eb,0xfff72872,0xffe3be94,0xffe73145,0xffe6478f,0xffe5fbf9,0xffe5c41d,0xffe5ae27,0xffe54758,0xffe81f94,0xffea8ca4,0xffec89b3,0xffefa66a,0xfff228b7,0xfff5119b,0xfff5a7af,0xfff65f34,0xfff70d48,0xfff8de4a,0xffe90496, -0xfff4eff6,0xfff98898,0xfff9a1e7,0xffe48923,0xffede3d4,0x0013813c,0xffe2d7dd,0xffe9ed9b,0x00027510,0x0003e92e,0x00031a78,0x0005c024,0x00082bf9,0x000af7af,0x000ca18b,0xffeadcbb,0xffe2ee5a,0x0017e43a,0xffef1d58,0xffe4664b,0xfff5e54e,0xfff68e3c,0xfff60308,0xfff8e7fa,0xfff9de0b, -0xfff94ec8,0xfff4dff9,0xfff6f3c8,0xfff7304b,0xfffaad72,0xfff284be,0xfff061e3,0xffef2414,0xfff3f69e,0xfff6ff12,0xfffddb48,0xfff8b0c2,0xfffa9c16,0xffeed1d6,0xfff51bba,0xffea5b9e,0xffe3ec99,0xffeee7c7,0xffe911a0,0xffdc7b54,0xffe3568a,0xffdfe0a8,0xffdaca89,0xffe2c857,0xffe99a2b, -0xffdfc6ef,0xfff60d42,0xfffaefc4,0xfff06ded,0xfffb66a1,0x0002d958,0xfff4c851,0xfffdde0c,0xfffcfd38,0x000459d5,0x00089927,0x0005cf04,0xfff62fbe,0xfff85271,0xfff76f8f,0x000035a4,0xffed30d2,0xffe6ce12,0xffe4e723,0xfff18f36,0xfffc3802,0x0009ef93,0xfffbe3b7,0x00061b1a,0xfffdc110, -0xffea0552,0xffedc1e3,0xffeb9c75,0xfff2d8af,0xffed8c6c,0xffccb875,0xffce5cf6,0xffc8d602,0xffbc8620,0xffd3c1fe,0xffdf1e44,0xffd15678,0xfff52bed,0xfff3fa69,0xfff1cc0e,0xfff991a2,0xfff264b4,0xfff2f21d,0xfff799e9,0xfff8f343,0x0005092e,0x000ca7b0,0x0009b523,0xfff114ca,0xfffd85ec, -0xfffc7ced,0x000e2522,0xffdfb88d,0xffd44988,0xffd6073a,0xffeeef06,0x00035127,0x001ea966,0x0007848f,0xfffc185e,0xfff2b515,0xffdbc659,0xffd9030a,0xffd66397,0xffdee024,0xffcfc510,0xffb4e0c7,0xffb1e8f3,0xffafb00e,0xffd754f6,0xffd8bd7b,0xffdf4adc,0xffdceb3c,0x0007af4c,0x000db389, -0x0005e788,0x0019896f,0x0015ee45,0x00128b4e,0x00156135,0x001818ea,0x002aa577,0x00348bf3,0x002544c3,0xfff615a6,0xfff8add3,0xfffd1bf7,0x001e662e,0xffdcd3f5,0xffc61f3b,0xffcb617d,0xfff32f64,0x00197ef1,0x003c1f5f,0x000cab4e,0x004ff72f,0x002743ff,0x0026d2f6,0x002af5a1,0x00246d46, -0x0040e7aa,0x0052f4cb,0x00584d5a,0x00306a44,0x000c47a4,0x0006a89c,0xfffc9a46,0xfffcf172,0x001b466f,0xffecbba8,0xffd23013,0xffa9184f,0xffa172e6,0xff91b42d,0xff83d9da,0xff872d14,0xff8f0245,0xff88c882,0xffa6971c,0xffcdd5c9,0xfffae995,0x003be695,0x0035e9a9,0xffed920a,0xffe47e51, -0xffcbf7e5,0xffa97f3d,0xffcbf363,0xffdfa3f4,0xffe179e9,0x0030fc4f,0xffd991a9,0xffdc261d,0xfff86952,0x0018e982,0x001d0430,0xffa904a5,0xff866425,0xffb7256a,0xffe2c2f1,0xfffbf37b,0xfffc2656,0x0001fb40,0xfff39af1,0xffe4b34c,0xffff30e6,0x000ef002,0x000c6716,0x001018cf,0x001d6eab, -0x00342399,0x0026b005,0x002128c5,0x0013f536,0x0030b9e4,0x00113ff4,0xffc76db3,0xff977ab2,0xff8e1f64,0xffbf6634,0x001b4c0e,0x00307526,0x000cd58d,0xffb543b0,0xff87e43e,0xffa597c4,0xffba063b,0xff96a9aa,0xffb319c7,0xff80fc83,0xff8fafcf,0xffc281c9,0xfff38c56,0xfff555a8,0xffe2ab64, -0x00020342,0x00046d02,0xfffff614,0x000064dc,0x00056da8,0xfffdb185,0xffeb8a94,0xffdac942,0xffda7c9c,0xffe3510f,0xffdcb467,0xffcebbb1,0xffe0042d,0xffd89958,0xffc3d2a8,0xffb457b2,0xffabbcf8,0xffa39797,0xffead3df,0x0016f74c,0x00353355,0xff8c8ad0,0xff5a3ba6,0xffa57f6b,0xffbd2d7d, -0xfff678aa,0x00478533,0xffc06703,0x0012df34,0x00070863,0xfff10a03,0xfffe1c76,0x001fb4a8,0xfff5d4ce,0xfff894a8,0x000b38cf,0x00054aa0,0xfffdf381,0x0000a61d,0x000145eb,0xfffc349e,0xfff4c5c6,0xffff04fe,0x000d259c,0x001d5e7d,0x001d11ab,0x001a51cc,0x001a3925,0x001cf515,0x0011da89, -0x00093950,0x00065541,0xfffa1b91,0xffe30e9a,0xffdbf90b,0xffcfa34a,0xffdf8d7f,0xffd8723b,0xffee745a,0x0008ab48,0x001432e1,0x00036bb0,0xffc8caf0,0xfff7eae7,0xffda9336,0xfff05033,0x000f3809,0xfff74534,0xfff8bcfc,0xfffdeec0,0xfffde998,0xffefbf1e,0xfffac72a,0xfffe31d8,0xffff7226, -0xfffb2733,0xfffa0388,0xfffb0d1e,0x00044bbd,0x0003a75a,0x000083fe,0xffe76548,0xffd63837,0xffd6cd24,0xffe089fc,0xffe73cba,0xffef9553,0xfffac185,0xffffc206,0xfffc754d,0xfff66275,0xffe9d902,0xffd75f89,0xffcab138,0xffb69dfe,0xffa1ad2d,0xff8dc573,0xff9242e2,0xffa9e2f8,0xffce343f, -0xffa94fa1,0xffa1b82e,0xffc79166,0xffceaf05,0xffe12be4,0xffe680db,0xfff18bbc,0xfff3f157,0xfff74bf2,0xfff600a0,0xfff64f86,0xfffb3a8e,0x000431b7,0x000f3df1,0x0009004f,0xfffd10ad,0xffeb484c,0xffe1f449,0xffdedf76,0xffe291fd,0xffe9237a,0xfff20b8e,0xfffedfe0,0x000e78ef,0x001eea2e, -0x002c7646,0x00414fe5,0x00511f46,0x005bb4f7,0x004875df,0x00297e68,0xfffb3502,0xfff357ae,0xffe2d29c,0xffcc1198,0xffb6c408,0x0020cff0,0x0023ea89,0x00215a35,0x001e8db4,0x00235075,0x0022a799,0x001fbff9,0x001d896e,0x002351be,0x002ae8b6,0x002e18ac,0x002c4afe,0x00258f4f,0x0021db51, -0x000ec782,0x0001045e,0xfff0ebcc,0xfff0fa07,0xffebcec2,0xffeaddb7,0xffee3e2b,0xffebd23f,0xffeb3c3b,0xffed61cf,0xffefe501,0xfff10729,0xfff9c789,0x00001ff0,0x000963c5,0x000c4fe7,0x0013ac07,0x00188cf9,0x0018ec2f,0x00185a5a,0x001bc97a,0x001dd9d7,0x000f3f5d,0x001045db,0x0012a951, -0x000e9d06,0x00097cf1,0x00092fe8,0x0007d9a9,0x0005e8e6,0xffffbd08,0xfff38d7b,0xffe9f253,0xffe427be,0xffe23ee3,0xffdbcfe8,0xffde7fe5,0xffe37ac9,0xffdeb5a7,0xffe290ae,0xffe0063c,0xffe4f8e6,0xffe9c12a,0xffe992f1,0xffeb85db,0xffeba5f9,0xffec1633,0xffebff36,0xffef445d,0xfff0fb32, -0xfff1fb6e,0xfff1b600,0xfff0f301,0xfff1b844,0xfff7a60b,0xfffe4403,0x0004681f,0x0008e35d,0xfff5057e,0xfff902d8,0xffeaafee,0xffee504e,0x00007053,0xffebdc4e,0xffeda474,0xfffbd206,0xfff830a1,0xfff731a1,0xfff74569,0xfff48aad,0xfff26e1e,0xfff0a82e,0xffdcf6d5,0xffdaff45,0xffef1681, -0xffdc658c,0xffda6ac3,0xffe81077,0xffe5a89e,0xffe56b00,0xffe582e8,0xffe564f9,0xffe59015,0xffe54592,0xffe5eb4a,0xffe67c67,0xffe7616c,0xffe90fc5,0xffeaab9d,0xffeadacc,0xffed4eb0,0xffeeb436,0xfff071e0,0xfff23ef9,0xffe07fdf,0x001dc8c8,0x001af58e,0x002261d1,0x001f6ebf,0x0008dcfc, -0xffdddbbe,0x0023f782,0x000b0026,0xffe03835,0xffe12787,0xffdf11f3,0xffdabd90,0xffdcd7e9,0xffdda492,0xffd9c446,0x00099aab,0x0020b0d0,0xffdc37e2,0x0008a8b7,0x001d0bec,0x001f512f,0x001b5b8a,0x00201af4,0x0022f411,0x00247238,0x00243e6d,0x002024ce,0x00217388,0x0021b0b5,0x0025e1f8, -0x001f8302,0x001ec3b1,0x001df08f,0x0024c7ba,0x0024e082,0x001fef4f,0x001ecf58,0x0018db57,0x002547c8,0xfffa4c1e,0x0014dfac,0x00022c5b,0x0005a024,0x000a5cea,0xfff6f8c5,0x0007e83a,0x000d5666,0x000456e1,0x00120dbd,0x000c9c7c,0x00055ed6,0x0008a0ca,0x000ef241,0x0017c51f,0x0018b23e, -0x0003373f,0x0029b9ed,0x002ba129,0x00362129,0x003e0f04,0x004238de,0x003d13ad,0x002c4605,0x002bb3f5,0x002c7c03,0x003a24a2,0x002af49b,0x0028be5e,0x0027150d,0x003985b2,0x0039dd90,0x00286f17,0x0021d5f4,0x00208a6f,0x002b1d4f,0x00183478,0x0011704a,0xfff982a4,0x000720d0,0xffff1f2e, -0xffd8264c,0xffded4bb,0xffd47409,0xffcc730f,0xffe2f9a0,0xffe9ca9f,0xffe40186,0x00030597,0x0007883f,0x00026979,0x000d9ff7,0x0010bb3b,0x001cebe6,0x002cd189,0x00394319,0x004cd758,0x0056ca90,0x00538578,0x003b71b0,0x0041003c,0x00411f94,0x0058db82,0x003341da,0x0031bb6b,0x0031d6ab, -0x0056aa02,0x00536743,0x00342a9f,0x002d7305,0x00083f6b,0x00160418,0xfffd4cb3,0xfff6bbb6,0xffdc16f3,0xffefffed,0xffd982a4,0xffafc0d1,0xffbac517,0xffb98daa,0xffd68fca,0xffda8355,0xffe34086,0xffd8ed74,0x000769e6,0x000efba3,0x00085039,0x00239d7e,0x0025262f,0x0038f1cd,0x005653a7, -0x007255ca,0x00941820,0x009fb050,0x008b0721,0x005341d2,0x004a3e6f,0x0050abb3,0x007c750b,0x004b77c1,0x003f67b8,0x004313ba,0x0077b893,0x0074da13,0x003d849c,0x00205714,0x00a46cc7,0x0072a33e,0x0060f22d,0x0051e243,0x0030fed6,0x004b01d8,0x005ab1d0,0x0056ac5f,0x0034cc9a,0x0012dbeb, -0x000c4a64,0x000397ef,0x0000f2c0,0x00180ded,0xfff9c128,0xffe3c6b0,0xffb1815c,0xffb6402d,0xffa84288,0xffae8f8a,0xffc05295,0xffb0bc41,0xff9a708c,0xffb7697b,0xffdbdd10,0x00028593,0x00484cff,0x004a1f86,0x0017edf7,0x0020163e,0x002ac5dc,0x0036a5da,0x004307fe,0x0046e55e,0x00342d9c, -0x00863a25,0xffd996e9,0xfff34b33,0x00146c69,0x002766ed,0x003f30e4,0xffc33378,0xff953765,0xffc05649,0xffe57c08,0xfffa069a,0xfff97b2f,0x000022ad,0xfff73ef8,0xffe7e61c,0x000353b3,0x00183188,0x001a4a01,0x0011e5e7,0x0018dd4f,0x004767ac,0x00632cc1,0x007a5922,0x00883a09,0x0073a57f, -0x0033aa42,0xffdcb5c3,0xff9bc0a4,0xff961af1,0xffd70d3d,0x00339ae5,0x0047788b,0x00228ce6,0xffdddaeb,0xffac5355,0xffad29f1,0xffc8e547,0xffa9b5fc,0xffdcb32f,0xff99e871,0xff9e338c,0xffb2494c,0xfffe9255,0x0003caea,0xffe6e315,0x00077cd9,0x0004d1b4,0x00023f98,0x000084e3,0x0005134f, -0x0001ad78,0xfff1f836,0xffe735f7,0xffe38cde,0xfff35921,0xfff724e0,0xffe4e48b,0xffe6844f,0xffdbfdee,0xffcc0145,0xffeaa8e5,0x000e3195,0x0022f9d6,0x0073b89a,0x007c92fe,0x00570303,0xffc9613b,0xffd8e37a,0x007c78f4,0x00a2793c,0x00c6423b,0x00fcd965,0xfff7e3f4,0x007f8a3b,0x002e7cb3, -0xffdef1e7,0xffe75d76,0x0000a819,0xfff9984f,0xfff79420,0x00062a0d,0x00025354,0xfffbd2ae,0xfffecb6a,0x00000047,0xfffdab9a,0xfff8fab8,0x00024bd8,0x0010d12c,0x0025c4e0,0x0024de9a,0x00224750,0x002788e6,0x003cc939,0x0045244a,0x00426709,0x003e292a,0x00292416,0x00058031,0x0004ecc1, -0xfffe2c36,0x00122af2,0x00063118,0x00220ec9,0x0048b1e5,0x00af26c4,0x00ce0c46,0x00b19af7,0x0097d9dd,0x00894b9e,0x0049fbce,0x00112719,0x0012d27b,0x0014476a,0x00064580,0x000122dc,0xfff8650e,0x00002dd7,0x00025044,0x00028006,0xffff4c68,0xfffcc8df,0xffffbb39,0x000768b6,0x00087a73, -0x0009daf7,0xfffd645f,0xffef352a,0xffef1f5b,0xffee87e5,0xffee47c0,0xfff855a1,0x000629ba,0x0019b4a4,0x00329e23,0x0031b72e,0x00313b8d,0x0035f9d2,0x0016221b,0x000c041a,0x000f7707,0x001e1fcc,0x00361361,0x0050973b,0x008126bd,0xffebb932,0xffdd0c91,0xffc591de,0xffdf562e,0xffe5370e, -0xfff27e91,0xfff92ef6,0xfff93f69,0xfffd0e00,0xfff9c85c,0xfff7f6ed,0xfffab9f0,0x00045aff,0x000fb130,0x000feb21,0x000a2c19,0xfffc42cd,0xffe82a40,0xffdf8d37,0xffdf9e22,0xffef7972,0x00030679,0x00147162,0x00303e81,0x0041eff7,0x004ba7a2,0x0055a91a,0x0053ca37,0x004a73f9,0x003fd596, -0x0034bde7,0x002d8599,0x0010fd2d,0x00012ec3,0xfff4e3c2,0xffec4a44,0x002bd104,0x002c67c8,0x002f10e8,0x002d77ca,0x0028aa05,0x00265cf9,0x001eda91,0x001a6eaf,0x001f7843,0x002877a4,0x00304e07,0x002f89ee,0x0026d4a6,0x0027f82d,0x0013c2a0,0x0008b348,0xfff9f63d,0xfffc8f64,0xfffe3b91, -0xfffeff7d,0xfffd01e6,0xfff799a4,0xfff20d38,0xfff3b6fb,0xfff5c175,0xfff66ff1,0x0009ec6b,0x001c6ff8,0x00302885,0x00386a08,0x003f4456,0x00474b98,0x003ebbab,0x00382b81,0x0030f395,0x002e2487,0x00282474,0x002c4c70,0x001286ea,0x00215e61,0x001ae51e,0x0016d64b,0x001c0ef6,0x0019f0ef, -0x0018606e,0x0012ffb6,0x000a0908,0x0008d341,0x0002bc1b,0xfffef372,0xfff74cae,0xfff60edd,0xfff9bd64,0xfff2539e,0xffe73313,0xffe8c8d8,0xffe6c0d1,0xffea7716,0xffec367e,0xffecc7b9,0xffed2bfd,0xffeb9e29,0xfff388d1,0xfffa3c44,0x0002ffcd,0x000af52c,0x0014cd12,0x0020eff4,0x002134fa, -0x0023e16b,0x0025ebda,0x002821f2,0x000a102f,0x000ee9ad,0x000c8f13,0x0001e31f,0xffea6a3d,0x0011cc75,0x00033d5a,0xffee31ed,0xffe98401,0xffe6ad67,0xffe37969,0xffdfebf8,0xffdc674f,0xffd8896f,0xfff74ced,0x0001abd8,0xffd89034,0xfff18040,0xfff98c9e,0xfff4590e,0xfff3d4a2,0xfff3c51d, -0xfff2e8db,0xfff2b305,0xfff2bc85,0xfff1aa93,0xfff64c0c,0xfff9ba29,0xfffd0d8b,0x00018251,0x00052f3e,0x0009f5c9,0x000931ca,0x0009a69d,0x0009cd73,0x000a89de,0xfffa7c16,0xffe96bf2,0xffefbcba,0xffe4b7ce,0xfff7bb1b,0x00128f87,0x0031191c,0xffeb79f1,0x000a78ba,0x00234655,0x0028ccf3, -0x0027667d,0x0021f243,0x0029ef46,0x002c6973,0x002b19fc,0x000aab75,0xffede23f,0x003629fb,0x00102495,0xfff7e607,0xffe3566b,0xffed2873,0xffeaaa66,0xffecbab8,0xffed7b90,0xffed1804,0xffe9b49d,0xffeb6e3c,0xffeb7d1a,0xffef8d31,0xffe68d52,0xffe4927c,0xffe3281b,0xffea1973,0xffed9acf, -0xfff3a3c3,0xffedd09d,0xffebd75c,0xffe557cb,0x00178ed9,0xffe4e908,0xffee106b,0xfffaab0d,0xffeccacc,0xffdf1387,0xffe34b3b,0xffe5f227,0xffe7306a,0xffe8c91b,0xffeae6fc,0xffe37309,0xfffb4aa6,0xfffb44e9,0xfff70357,0xfffa724b,0x001f2d03,0xfff0ddb7,0xfff170c4,0xfff34c03,0xfff4e969, -0xfff6f75d,0xfff28e34,0xffe5e999,0xffe75f88,0xffe8e29f,0xfff56aa8,0xffdffc18,0xffda4862,0xffd96438,0xffeba3c1,0xfff67a25,0x00000366,0xfff1ff5f,0xfff2b73d,0xfff73f30,0xfffb7d7f,0xfff317af,0xfff1d978,0xfffc9891,0xfff6d4fe,0xffc76f4a,0xffdca715,0xffcb71dd,0xffbfc52b,0xffcdab3e, -0xffe760d1,0xffcea19c,0xfff945d5,0xfff023d8,0xfff326a4,0xfffa7bb6,0x0001052b,0xfff742a6,0xffe7f63e,0xffef34d2,0xfff383f3,0xfff9eedb,0xfff68c01,0xffe46361,0xffed1ab6,0xffec3c5d,0x00014153,0xffcf6d4f,0xffc6a6b2,0xffc7e4f3,0xffedab97,0x0001519b,0x00126b07,0xfffeca57,0xffe2ebe9, -0xffedbd4e,0xffe99d02,0xffd6162c,0xffc98db8,0xffe65c46,0xffd8e0fb,0xffafd8d6,0xffc122e3,0xffc318ea,0xffdbc1d6,0xffe361df,0xffe301dd,0xffd31ec7,0xfff98bbf,0xfff7c329,0x00012464,0x000d6131,0x00233e50,0x0019db38,0x0008ced3,0x00121aa0,0x0014fda0,0x00194755,0x00049145,0xffdd1309, -0xffdd775a,0xffeb603a,0x00146eee,0xffcf5600,0xffba7005,0xffc13a15,0xfffc25e8,0x001edd43,0x002bede2,0x00033397,0x003dbf53,0x003fbe04,0x00544bdd,0x00495a09,0x0040e44d,0x004e5941,0x004d050c,0x004658e0,0x002ee063,0x0011eb0a,0x000e1729,0x0006143c,0x00040df2,0x00123179,0x000048ff, -0xffe55af4,0xffadede0,0xff996977,0xff994dba,0xff8535c5,0xff65c186,0xff72c353,0xff68c29d,0xff9eb0e3,0xffcc20f1,0x0004e0c3,0x00144ba5,0xfff89ccc,0xffba53c9,0xffb640f1,0xffb150e0,0xffb024b8,0xffc40030,0xffd942a4,0xffe84060,0x002f85fe,0xffbec1dd,0xffcd3081,0xffe9e816,0x0002b602, -0x001e906a,0xffc08c53,0xffa04c29,0xffc8044d,0xffe93b57,0xfff99415,0xfff8d03d,0xfffeaf38,0xfffa5411,0xffe956b0,0xfffaae15,0x0008a691,0x000d2738,0x0009333c,0x001ef175,0x002d6124,0x00214b12,0x00256500,0x00088ab4,0x0011d33a,0xfff007b2,0xffbd8b59,0xff93e498,0xff9a6286,0xffdbc051, -0x0025d100,0x00300191,0x0016c827,0xffb9fc2c,0xff8e26ce,0xffb302f5,0xffb91f87,0xff9ea7a7,0xffe97a84,0xffba20c9,0xffaffcec,0xffaa2237,0x00013c5d,0x000adef1,0xffe8d4b1,0x000bf4cf,0x0003722a,0x0003cf57,0x00007c4d,0x0004934f,0x0003cd8a,0xfff3ec7a,0xffdfd129,0xffe0c391,0xffe002a2, -0xffe0420c,0xffc9ec5a,0xffcc96f3,0xffd1f1a3,0xffc4892b,0xffaf9e69,0xffa304bb,0xff9b1642,0xffeaaee1,0x0001b246,0xfff3b1bc,0xff6370d2,0xff4a081f,0xffb5a1de,0xffc614f1,0xfffd0a33,0x00557f34,0xffc42ed3,0x002a73a7,0x005661aa,0xffca2f5f,0xffad9c78,0xffe17cb7,0xffe6928f,0xfff4e6ae, -0xfffd136c,0x000084bc,0xfffb2f42,0xfffde791,0xfffef2bf,0xfffe73e9,0xfff92cd7,0xfffe6630,0x000a9547,0x001c0fad,0x001c6dec,0x0027156f,0x001fadf8,0x0014f1bc,0x0006f7fd,0xfff4dd83,0xfff46f0e,0xfff21875,0xffe79386,0xffdf67d6,0xffd8f276,0xffef2e80,0xffe916ae,0x00045af0,0x0025c222, -0x0021b4d9,0xfff3e98f,0xff92ea5d,0xfff34fe9,0xffd8b65c,0x000cddfd,0x0044f325,0x0022c426,0x00164aec,0x00087d7e,0xfffd529a,0xfff418ee,0x0001b8e3,0x000328b4,0x0004f9b3,0x00019070,0xfffeaede,0xfffe6fc6,0x00062d01,0x0009b7df,0x000c8656,0xfffaada3,0xfff361ff,0xffe3948d,0xffeaa67a, -0xfff4836e,0xfff77c7c,0xfffe6176,0xfffd7548,0xfff86683,0xffeca2b6,0xffde1dc3,0xffca1930,0xffb75324,0xffa357bb,0xff8c9f18,0xff876508,0xff9cdc83,0xffb23ff8,0xffdc80a3,0xffb45253,0xffb4c7ae,0xffdb39d3,0xffd420c0,0xffe41bc4,0xffe76431,0xffed26c8,0xfff2113f,0xfff3e59c,0xfff40ef4, -0xfff23eab,0xfff50f29,0xfffb33df,0x00076a55,0x00087de8,0x000244a4,0xfff3b66a,0xffe79410,0xffdfc88f,0xffe376cb,0xffe08d4a,0xffe503f0,0xfff31cda,0x0007a2f7,0x00198ebf,0x0025c0c0,0x0032d610,0x003b493c,0x003fdc5f,0x002bcad6,0x00074075,0xffcdffb4,0xffc66787,0xffbe2459,0xffb97937, -0xffba3633,0xfffaf34a,0x00086da3,0x00155ebc,0x000e8e9f,0x00187d15,0x00144802,0x00102c88,0x000a0069,0x0017dd1a,0x001d4d93,0x002b2af5,0x0024b5d3,0x002aabd3,0x00275ddf,0x00174c60,0x0007b0d8,0xfffcb809,0xfffac253,0xfff85607,0xffec1892,0xffea48f4,0xffed984e,0xffec5436,0xffeeca87, -0xfff0dbbe,0xfff336aa,0xfff9921a,0xfffec461,0x00064622,0x000550f0,0x0009567a,0x000aadc6,0x0009a995,0x000522f4,0xffff0b3f,0xffffac2e,0x0018fa87,0x001b97bd,0x002e38fa,0x001837d6,0x001b1528,0x00198f78,0x0013ca49,0x0013e93e,0x000ac9fd,0x0002d4fd,0x00012cce,0xfff760ec,0xfff2cf26, -0xfff01595,0xfff2aa36,0xfff254ca,0xffe9d727,0xffe85cc8,0xffec4f17,0xffe3e639,0xffe9cd04,0xffe96c99,0xffeb07a6,0xffeba7be,0xffec34bf,0xffec4f25,0xffee5724,0xffef6600,0xfff08b50,0xfff13812,0xfff18fe1,0xfff334cb,0xfff905d2,0x00011210,0x00093eeb,0x00118b30,0xfff57de0,0xfff5bb0b, -0xfffab9a5,0x0007aa0e,0x0017d713,0xfff68cd5,0x00053324,0x00147cec,0x0012e156,0x00126e79,0x00104ff3,0x00112dcc,0x0010befc,0x000f60cb,0xfff90b9d,0xffe9048b,0x00089b40,0xfff442b9,0xffe78ac5,0xffe40544,0xffe5523f,0xffe43979,0xffe467c9,0xffe41f83,0xffe4296f,0xffe3e6b0,0xffe4aaf0, -0xffe56549,0xffe62f11,0xffe7aa94,0xffe90d20,0xffe9487c,0xffecaa9f,0xffeeb077,0xfff0ae40,0xfff20e9f,0xffe0ba89,0x0019d282,0x00176fff,0x00263156,0x00027fec,0xffe6bb9f,0xffd148a2,0x000e735f,0xffeb9fe4,0xffcc2096,0xffce9635,0xffcd733f,0xffccf74f,0xffcce4a8,0xffce425c,0xffcd5e43, -0xffe882e7,0x00074547,0xffd1746b,0xffe8f9fb,0x00006ba8,0x00221c8f,0x00181858,0x001c9aae,0x001f3905,0x00201282,0x001f7f85,0x001b3819,0x001c74f2,0x001cee27,0x0022ab59,0x001a827c,0x0019498d,0x0018a6c4,0x001e1bf3,0x001e4c10,0x001a5392,0x001a738c,0x0017917b,0x001df302,0xffdd4ddd, -0x000bbb83,0xffef5c93,0xfff9dc53,0x00047a7c,0xffedf175,0x000873e2,0x0007fa91,0xfff2bdd9,0x000785b7,0x00057052,0xfff9e916,0xfff8c7ad,0x00005001,0x000618a5,0x000d03b7,0xffec8ee7,0x00224230,0x002a5f59,0x002e7f67,0x0036a84d,0x0038b05a,0x00338963,0x002383c0,0x00225ace,0x00246cec, -0x0035a651,0x0022096f,0x001d40bf,0x001bae00,0x0029769e,0x002a7a28,0x001d8a00,0x001954f6,0x00233e7d,0x00276d0d,0xffff9388,0x0003cf6d,0xffea262e,0x00013c32,0xfffae2eb,0xffcd9675,0xffdb509e,0xffdc715d,0xffbb1f34,0xffe854d8,0xffe0f403,0xffe030de,0xfff07fb4,0xfff8b85b,0xfffa9721, -0x0000597f,0xfffdb404,0x0016cfa3,0x002e17ea,0x00321dbf,0x00438c1e,0x00499dd2,0x004571d5,0x002bd105,0x0031ceb9,0x0032dba9,0x005239bf,0x00249536,0x00200b40,0x0021e476,0x003c1e59,0x003c7161,0x002752eb,0x0022e93a,0x000dee09,0x000f649d,0xffe7be79,0xffebf792,0xffcecca1,0xfff21b52, -0xffe530be,0xffb4b8f4,0xffd0d3df,0xffcf873f,0xffe504e6,0xffe76b08,0xffea92a8,0xffdb1e49,0xfffc36cc,0x00017d9a,0xfff686ec,0x001ca90a,0x00142f7c,0x0037e2ef,0x0057cd42,0x0063afe4,0x007e7406,0x0083324e,0x006b9e6c,0x0035eec0,0x002daffd,0x003e57a7,0x0075f08a,0x0036ad4d,0x00209bd9, -0x002519cd,0x004a648a,0x004c7441,0x00262afe,0x000e976c,0x00af4324,0x006aea3a,0x00454412,0x004594d8,0x00349403,0x00443b7d,0x0049e609,0x003a3873,0x002a70c3,0x0011d23f,0x000d36ba,0x0007ac70,0x0007129d,0x000c03df,0x000853c1,0xfffafeb2,0xffb19240,0xffb6cb49,0xff9632a1,0xff9ee71e, -0xffbf42fd,0xffb1f2c8,0xffb756e5,0xffc9eb1e,0xfff938bd,0x003bfc1b,0x0059bdf1,0x00488afe,0x0015fc5d,0x001b7d32,0x00288479,0x0039b097,0x0033e9ae,0x0040771a,0x004ce533,0x008b8372,0xfff4bb33,0xfff3a7f0,0xffe8e7ff,0x0009666f,0x00360e2e,0xffd2be93,0xffb3b2fe,0xffd2b8a2,0xfff0757f, -0xfff86618,0xfff9885c,0xfffc8949,0xfffc4ca4,0xfff003f9,0xffffb234,0x000ec95c,0x000f5ed1,0x00078eb3,0x0007f138,0x0035138d,0x005c7b55,0x0068d63b,0x0071d8fa,0x004fa706,0x0010de2f,0xffc7b7ea,0xff8e6a4b,0xff9d8452,0xfff706e4,0x003b4e41,0x0039ee39,0x001352cb,0xffc067c6,0xff9868e1, -0xffb7639a,0xffd095d3,0xffb9ae47,0x000e0dd5,0xffc03cc6,0xffbd9ab8,0xff9b1d02,0x0008c382,0x000c38dc,0xfff1f6a3,0x000cb373,0x00022877,0x00044088,0x000188b2,0x0002e593,0x00058c23,0xfff77318,0xffee8009,0xffe1a7ad,0xfff37a0c,0xffebc05c,0xffe27956,0xffed5eb6,0xffdbbf95,0xffd66c14, -0xfff352af,0x0016b84b,0x002baffe,0x00884147,0x00846374,0x00365cff,0xffd3e1ba,0xffeb4b97,0x0075bfc6,0x0083450f,0x009bd608,0x00d632cc,0xfff6727f,0x006a0b19,0x0071eb34,0xffbd5577,0xff9bc17c,0xffbd60ef,0xffee6e58,0xfff8e09a,0xfffcfd38,0xffff22f3,0xfffbd39c,0xfffe049c,0xfffdf327, -0xfffe7274,0xfffc6bac,0x00006909,0x0008c6f9,0x001fca77,0x002524b3,0x001d8f8f,0x002c10cc,0x003eeb80,0x003b0e4a,0x003077c5,0x00239e00,0x00144b85,0xfffc311f,0xfff1ee0e,0xffe9b742,0xfff929b6,0xfff648db,0x0022184b,0x0072f3fe,0x008c74a5,0x00796c7c,0x003cabbd,0x0049701e,0x005dd1bc, -0x002bd427,0x0015aee3,0x002b315a,0x0022d06e,0x00041fa3,0xfffbfc06,0xfff7bfc9,0x00015b4d,0x00039095,0x0003610e,0x0003385d,0x0001159a,0x000011d9,0x000787e5,0x000cc562,0x00170468,0x000a439e,0xfff52b69,0xfffadaa5,0xffface0e,0xfff7fed8,0x00046be4,0x00069154,0x000ea028,0x001accb5, -0x0011770e,0x000a440d,0x00072fc3,0xfff2e1b5,0xffead290,0xfff0441c,0xfffca58f,0x001b93d4,0x003bdd30,0x0059ef86,0xfff627fb,0xffd67d37,0xffbccffa,0xffd00f66,0xffd76d54,0xffe61bb3,0xfff38850,0xfff2d988,0xfffaff69,0xfff8bc35,0xfff86fd5,0xfff57128,0xfffc26e1,0x00075923,0x000cf60c, -0x00087725,0xfffc1a7f,0xffea20c0,0xffe3c40c,0xffe30ccc,0xfff045ed,0xfffdba45,0x000c27ad,0x0021123d,0x00300b4c,0x0039270e,0x004142fa,0x0040a5d8,0x0037d992,0x002f6f3f,0x00238765,0x0016024b,0xffff6385,0xfff058f7,0xffec8cb6,0xffeba380,0x000f5bf5,0x000bdf0a,0x00093f4a,0x000f2916, -0x000abef3,0x000c3e93,0x00084b3b,0x00062801,0x000ca894,0x001b272b,0x0020a4b1,0x00293a0d,0x0023c59d,0x002a72d1,0x0016c774,0x000d9e9c,0x00011ce3,0xffff81e8,0xfff96184,0xfffbe647,0x0002a857,0xfffd5d41,0xfffbb4d8,0xfffd4155,0xfffffb25,0x0001a1db,0x000fc0cb,0x001c2436,0x00293070, -0x002d8089,0x00311813,0x003698b0,0x002b3bac,0x00210a94,0x0015238e,0x000fb517,0x002f00cb,0x0030dd56,0x0016ab92,0x0027da9c,0x001de1f8,0x001b1f0e,0x002239e9,0x0020764c,0x0021b2dc,0x001aff25,0x000f3bf4,0x0010fb8b,0x000e0219,0x000956df,0xfffe9613,0xfffeefed,0xffff84c7,0xfffa940f, -0xffe8eddb,0xfff34957,0xfff1b313,0xfff32ad6,0xfff4bdb6,0xfff48916,0xfff48883,0xfff2d6a7,0xfffcd137,0x0004ce1d,0x000d94d5,0x00154e99,0x001de05c,0x0028237b,0x0027efb8,0x0029bd13,0x002b1e23,0x002d7b2c,0x000ecc3e,0x00149012,0x000406ed,0xfff6d15d,0xffea490e,0x000c0cc1,0xfff7c1b4, -0xffe924f9,0xffe514e3,0xffe30ab3,0xffe2d5a7,0xffde77f3,0xffdb40cd,0xffd99a5d,0xffedcaf6,0xfffef522,0xffd6c97a,0xffe7c312,0xfff479b1,0xffffcc70,0xfffbfb20,0xfffc9560,0xfffbd1c3,0xfffbb943,0xfffbf1f6,0xfffac9ad,0xfffee5b2,0x0001ba12,0x0004b708,0x00088abd,0x000bb275,0x000faeb4, -0x000ef6b1,0x000f86b4,0x000ffc2d,0x000fdd8f,0x00022634,0xfff44d49,0xfff86a75,0xffed28bd,0x0011ad58,0x0025858c,0x0024a922,0x00051f01,0x001edc64,0x001f0be2,0x0025d70e,0x0023e9ab,0x0019537e,0x00229db3,0x00243072,0x00207ba8,0x001d4bc2,0x00063cef,0x0027efbc,0x00219641,0x0011190d, -0xffecae64,0xfff745ac,0xfff62951,0xfff82606,0xfff8652e,0xfff8261f,0xfff5da1f,0xfff68282,0xfff678cd,0xfffb8420,0xfff2bdbc,0xfff16178,0xfff03ded,0xfff859ae,0xfffadd11,0xfffbc803,0xfff7db11,0xfff211b6,0xfff642a9,0x0021e1bd,0xfff28b71,0xfffcc801,0x000676e5,0xfffb210a,0xffeb59ae, -0xfff292c0,0xfff9c36f,0xfffa3371,0xfffbfb23,0xfff7f6ec,0xfff3b9ce,0x00018880,0x000010fc,0x00071bb0,0x0002b5f6,0x002503d6,0x0001b6ac,0xfffd3479,0x0003d024,0x000422c4,0x000358d4,0xfffd41d8,0xfff2f365,0xfff1b967,0xfff53b73,0x00066b72,0xfff15fba,0xffeda476,0xffedf360,0x0003421e, -0x000987f9,0x00052f1d,0xfffb8da6,0xfff61fe2,0x00055875,0x00101d33,0x00009bd1,0xfff93c40,0x00073b2c,0x0000495c,0xffcb8766,0xffe9dad8,0xffd545d4,0xffc6d92b,0xffd3c19e,0xffeda124,0xffd88b64,0xfffacd67,0xfff23aa5,0xfffc2293,0xffff9104,0x000e93e1,0x00075793,0xfff6232a,0x00033b62, -0x00086f5e,0x000be6f7,0x0007feea,0xfffaa2d5,0xfffce204,0xfffc5892,0x00176a8d,0xffe77fb5,0xffe3e4c2,0xffe55b18,0x0011cd27,0x001c0b46,0x0012a631,0x0008c844,0xffe0a9d0,0xfff91618,0xfffa0108,0xffe033aa,0xffc97839,0xfff1617e,0xffe5305c,0xffb877e2,0xffd5cc3e,0xffd9e175,0xffe7619f, -0xfff0d9af,0xffec8057,0xffd62f42,0xfff0bd54,0xffeab617,0xfffefc05,0x0007349f,0x0026a630,0x0027405f,0x0019b7ae,0x002e1771,0x003141c5,0x002e50d0,0x00144e3f,0xffefad23,0xffe83c7d,0xfffd41a6,0x00310b02,0xfff1546e,0xffe13ea2,0xffeac03e,0x002e0d28,0x003ce0cb,0x001e535c,0x0003e589, -0x0053a22a,0x0060bd56,0x006fd73a,0x005b34a1,0x0051130c,0x0051413b,0x004174a6,0x002d6cbb,0x002505d9,0x000ec42a,0x000d8382,0x0006cdc8,0x00088b3d,0x0009a053,0x000fc300,0xfffe4a8f,0xffbc53bb,0xffa779b3,0xffad11ce,0xff9ef20c,0xff76d5dc,0xff7c7b1e,0xff73f8d5,0xffae0243,0xffe0d011, -0x0022c09a,0x00176cc3,0xfff04e17,0xffb9b8d3,0xffbe656a,0xffcd5de3,0xffeb1f89,0xffe7c7c7,0xfffcd442,0x001ba772,0x0051bd9e,0xffbc3f86,0xffd77911,0xffed8815,0xfffae065,0x0024801a,0xffd8e48d,0xffbde8cf,0xffddf6f8,0xfff48240,0xfff7ea63,0xfffa0dbb,0xfffb6f3f,0xfffdd8b0,0xfff1d74a, -0xfff87bc1,0x0005bf2e,0x000f4f45,0x00032126,0x0016696c,0x0028606e,0x002df89e,0x003fbfb9,0x0029b902,0x0012574b,0xffe62280,0xffbd5866,0xff937131,0xffa999fc,0xfffc34e0,0x002f55a1,0x002fee60,0x002156e6,0xffc7db07,0xff9eda2c,0xffbc1ba1,0xffc04021,0xffc26c3b,0x00217fd3,0xffe0bb57, -0xffc6e0a5,0xffa95f7d,0x0008c708,0x00118448,0xfff9c234,0x000c4058,0x0001bf43,0x0004c456,0x0001f428,0x00024237,0x000597fc,0xfffd4206,0xffec603a,0xffeac694,0xffeb0580,0xfff269c4,0xffdaae8e,0xffce3e99,0xffd39199,0xffce58ff,0xffc791a5,0xffcdd51c,0xffda6243,0x0027b47e,0x002014ef, -0xffdb1c45,0xff742adb,0xff82a8e4,0x0015bd99,0x00270ff5,0x005023f6,0x008f2a41,0xffebf14b,0x003a90db,0x0090b91a,0xffb8b053,0xff752445,0xffa26ac8,0xffe2fbba,0xfff8a19c,0xfff89561,0xfffe836e,0xfffb71db,0xfffd6135,0xfffd613c,0xfffe5f56,0xfffd0aac,0xfffe34da,0x0006bbbf,0x001a3eda, -0x001e4b17,0x002d2e1a,0x0026b45e,0x001b53b6,0x00118d47,0xfffe31b6,0xfff9df21,0xfff8924a,0xfff40bb7,0xffee004c,0xffecff98,0x00008b34,0x0006c8b4,0x002a7ad4,0x005d38ba,0x0044cb13,0x000a96a1,0xffb31463,0x00025a55,0x001987c0,0x00403a32,0x006615a6,0x00504712,0x0032535a,0x000fd8d3, -0xfffd20a0,0xfffbf13b,0x0004ceec,0x00041547,0x00051b06,0x0003ffa0,0x00025e76,0x00016cf0,0x000739d6,0x000e2784,0x0016a9b9,0x001153c7,0x000fa5f4,0xfffa7b36,0xfffa10f0,0x0000ba36,0x000277fd,0x00072d3c,0x00071096,0x0008b1a4,0xfff9a609,0xffeec212,0xffe45a04,0xffca5292,0xffba2bd8, -0xffaf0c7e,0xffc0b7d4,0xffe5e7fb,0xfff98011,0x00215061,0xffdd900a,0xffddfc43,0xffe82f8f,0xffde6212,0xffe68c25,0xffead859,0xffed6f35,0xfff2503c,0xfff58ef5,0xfff6f96c,0xfff3b52f,0xfff4c542,0xfff781a9,0x000051f9,0x0007890f,0x0007c0f2,0xfffe6e6e,0xffee7a0e,0xffe3c686,0xffe5e33a, -0xffe17039,0xffe56ab4,0xfff23d79,0x000ad5ef,0x001bf34e,0x0024cdad,0x00295d1c,0x0027c05e,0x0022241b,0x00164aab,0xfffcde2c,0xffd27827,0xffc4d6bd,0xffc017a8,0xffc91b58,0xffd8f3bc,0xffe6a6d8,0xfff5396d,0x0009960c,0x00057ffc,0x000eceeb,0x0009fc60,0x00058352,0xfffeadc6,0x000dcda4, -0x0011c0db,0x002306de,0x001c1c6a,0x0026c904,0x002685e4,0x001b6c4a,0x000e22f5,0x00080fe6,0x0004f4c8,0x00042d64,0xfff453d0,0xfff142c3,0xfff6c964,0xfff55d5a,0xfff8ae14,0xfffb77a6,0xffff8614,0x000689d5,0x000d8f24,0x00156435,0x0011a068,0x00103c14,0x000e8970,0x0008419d,0xfffedb1e, -0xffef8f19,0xffeeef77,0x0022dd81,0x0026646c,0x003480c9,0x001ffcf9,0x00252777,0x00225593,0x001dd0e9,0x001f3287,0x00185131,0x0016870b,0x0019a71d,0x0012049c,0x000c7e8d,0x000ce5e1,0x000a1f3e,0x000511a9,0xfffe1341,0xfff671f1,0xfff82deb,0xffeb3348,0xffeed6d4,0xffef3d43,0xfff05141, -0xfff11d9c,0xfff18360,0xfff14243,0xfff42485,0xfff67c2d,0xfffa3d79,0xfffe59f2,0x000314ec,0x00087953,0x000b3c69,0x001101a1,0x0016bcbc,0x001e4ff4,0x000016df,0xfffeb36b,0x000da2c4,0x0017cb35,0x00183957,0x00094f7c,0x001560ed,0x00180f8e,0x0017b13f,0x00171c4f,0x00139e23,0x0015d030, -0x0015f980,0x00151e53,0x00102d87,0x000135b8,0x000c9a82,0x00083482,0xfffc6818,0xffedefbe,0xfff0d8b9,0xffefcbf9,0xffefca11,0xffef81b9,0xffef7eb9,0xffef031d,0xfff0faa6,0xfff2880b,0xfff3c720,0xfff5a153,0xfff71c90,0xfff8b656,0xfffac5dc,0xfffc6e0a,0xfffde024,0xfffe3acd,0xfff14cb9, -0x00059ccb,0x0006d30b,0x00111c8a,0xffeb2537,0xffdfbb37,0xffeb7e0e,0xfff352e3,0xffe1feca,0xffdeefce,0xffe36c39,0xffe30a80,0xffe37d87,0xffe46a93,0xffe6496d,0xffe7d6e6,0xffde5e37,0xffec78c4,0xffeedbce,0xffe1f14f,0xffe9f873,0x000d068b,0x00063c15,0x00080752,0x000a84ab,0x000a3127, -0x00096d04,0x00061ca3,0x0006e1f8,0x00075a2d,0x000de5e6,0x000447a3,0x00029a6e,0x00021d41,0x0006e8fa,0x00085518,0x0008397a,0x00078200,0x0007a1e2,0x00051779,0xffdf291a,0xfff83875,0xffe426ae,0xfff31b5b,0xfff945d7,0xffe4d769,0xfffcd4fc,0xfff8d258,0xffe2c87e,0xfff4889c,0xfff650ed, -0xffec1f43,0xffedf71f,0xfff34c69,0xfff58896,0xfffd20b8,0xffee7121,0x0009da61,0x00138519,0x00127544,0x0018afc5,0x0016f978,0x0011f16c,0x0005f940,0x000465c5,0x0007c2c3,0x001aadcc,0x0003c06f,0xfffd733e,0xfffd4eac,0x0008d911,0x000d170d,0x000a4520,0x000587aa,0x00146778,0x00136beb, -0xffedad20,0xfff48a66,0xffe41d0f,0xfffbf0e6,0xfff70bc0,0xffc8d4b7,0xffdd4a37,0xffe0c599,0xffb6d84c,0xffe50128,0xffde8f91,0xffdcafff,0xffe39122,0xffe84a7b,0xfff5c579,0xfff3d37f,0xfff12a45,0x000608c4,0x001463a8,0x00142c2f,0x00201935,0x001fcf54,0x001b37bb,0x0006cc54,0x000bf510, -0x000cdacc,0x002f14bc,0xfffb8291,0xfff497c5,0xfff9094f,0x000ea74f,0x0017f6ce,0x0015f465,0x000f9668,0x0005180f,0xffff8442,0xffdbc694,0xffde4ca5,0xffc7d907,0xfff1b2af,0xffedfaa6,0xffc45fd6,0xffe4b00e,0xffe5530f,0xfff4e92b,0xfff5da8b,0xfff31850,0xffe2270f,0xfff15d41,0xffef51ac, -0xffee6973,0x000c5e54,0x000895d4,0x00273680,0x003735dc,0x0037b824,0x0044e36a,0x003e0179,0x00249aca,0xfffafe90,0xfff53fdd,0x000e7068,0x004a8a0a,0x000226ed,0xffe798b8,0xfff14fb0,0x0012182b,0x001fa9ab,0x0013aa7b,0xfffe62af,0x0089b9a3,0x0052da49,0x0031c721,0x00398cbf,0x003be8ea, -0x003dd048,0x00346cef,0x001d5630,0x001ba2c3,0x0009257f,0x00094189,0x0004ae7d,0x0008a9ff,0x0003ccb2,0x00111b1b,0x000c6cdd,0xffbce525,0xffb5df8e,0xff96779b,0xff968da0,0xffa5c7bc,0xffa4239c,0xffbe89c3,0xffd4dd8c,0x000e6684,0x00646510,0x005923b4,0x0030be76,0xfff49138,0xfff6612c, -0xfffe90e5,0x000dfe2e,0xfffdf5f1,0x00185304,0x004b9323,0x00720a04,0xfffa9686,0xffee0216,0xffcd8d1c,0xffef1564,0x001fe219,0xffde96fd,0xffcf0cb8,0xffe9cb9b,0xfff93c2f,0xfff97956,0xfffc5a34,0xfffbea2c,0xfffe27dc,0xfff7f344,0xfffa235f,0x0002c2f8,0x0005f08d,0xfffd2151,0xfffe7491, -0x001baab2,0x00395c9c,0x003c5e86,0x0036e532,0x0016da90,0xffe666b0,0xffb3b764,0xff8ac157,0xffadb4e9,0x00142dfd,0x00378e65,0x0027385b,0x000c08c9,0xffab041c,0xff8c63e8,0xffc2477b,0xffd1d0c7,0xffd92851,0x00382fdc,0xffe5b40e,0xffd63fc1,0xffa5a759,0x0009b4cb,0x000bc061,0xffffecfd, -0x00076a54,0x0001a773,0x00032e18,0x00022eba,0x000157d7,0x0004b806,0xfffe2924,0xfff5944b,0xffe5eb4d,0xfff3c2c0,0xffe942a3,0xffe44df2,0xffed5fd7,0xffdcbacc,0xffdefe64,0xffe6c532,0xfffd3903,0x00141978,0x0065e111,0x0058b386,0xfffc4b63,0xffbda9fc,0xffcf253b,0x00376435,0x00362ff7, -0x004dee0e,0x007f62c2,0xfff7eeee,0x001f070c,0x008f635d,0xffb168f6,0xff6576cb,0xff878459,0xffe55a96,0xfffb7d40,0xfffb10a4,0xffff1b7a,0xfffcbf2e,0xfffe1062,0xfffd8666,0xfffe1599,0xfffe4cee,0xfffde805,0x0000ee95,0x0014a6d7,0x002116e8,0x001d071a,0x002abc73,0x002e25bd,0x001d127d, -0x000b288c,0xfffa36f6,0xfff3693f,0xffed9c14,0xffe03b09,0xffdab3c1,0xffe2b8b6,0xfff69215,0x0028459c,0x00840eff,0x0031a727,0xffe2e169,0xff94aa5b,0xffcf18b0,0x001664aa,0x001efc5c,0x003e4e96,0x004eebb5,0x002eb3ba,0x0007e007,0xfffaef7c,0xfffb299f,0x0003b7ee,0x0002d7a9,0x00039b3f, -0x00040418,0x000379c0,0x0000a527,0x0006b463,0x000ea65c,0x001d48d8,0x00159074,0x0002bc54,0x000507ec,0x0005a545,0x0003be85,0x000d2620,0x0008fd79,0x0004ba1d,0x00006431,0xffed7344,0xffdf3342,0xffd2eaa2,0xffc7dda2,0xffbc861c,0xffbbc1db,0xffc51a86,0xffe5dfd8,0x0003511e,0x0010d7ea, -0xfff1de8f,0xffd4df45,0xffcb7fce,0xffccee6d,0xffd4b02d,0xffdef1ba,0xffee71df,0xffefea3a,0xfff93e8c,0xfff8d98a,0xfff8c4b4,0xfff4a63c,0xfff7265f,0xfffeba81,0x00068a3b,0x000465bf,0xfffb993b,0xffee1b00,0xffe8eff7,0xffe9923c,0xffee1a25,0xfff17cd9,0xfffa5d0e,0x00081235,0x001407c6, -0x001c59af,0x00232cbd,0x002677e7,0x0023aeca,0x001d82aa,0x000dd400,0xfff09419,0xffe5691a,0xffda442d,0xffde8cc7,0xffe48a15,0xffee4387,0xffec3c54,0xffebaa85,0xfff4c73d,0xfff6d66c,0xfff96378,0xfff8d338,0xfff841a8,0x0000d77a,0x000e5b42,0x00137867,0x001c46b0,0x001d35a2,0x0023fe3f, -0x0017473f,0x000fc9a6,0x000814b0,0x0002d459,0xfff7f713,0xfff68792,0x00020437,0x00012453,0x000411e7,0x00070d64,0x000b4966,0x000f712a,0x00149d9f,0x0017df3e,0x001b764d,0x00178db2,0x0014e658,0x0013d525,0x000a18d1,0xffff48d8,0xfff1b481,0xffedd7d5,0x00285514,0x00283a9a,0x001e2bdf, -0x002393df,0x001c1af8,0x001b34ba,0x001f5291,0x001eb46c,0x001ff3d4,0x0019ce73,0x0011f460,0x00138fd4,0x0013f6c5,0x0010b878,0x00076f6d,0x0007eab8,0x00030419,0x0000df4f,0xfff19de7,0xfffc9e5a,0xfffe2680,0xfffcf39c,0xfffe17fc,0xfffd934e,0xfffd5b78,0xfffc6e05,0x0003f737,0x0009a068, -0x000f0ad6,0x0013d2a1,0x00185c23,0x001d1080,0x001dbeec,0x001fc59c,0x00218cde,0x0024c162,0x000cbbe9,0x00107438,0xfffda7af,0xfff7c18d,0xfffc5bb3,0x000307e1,0xfff7033b,0xfff6e1ef,0xfff521eb,0xfff4c90d,0xfff6777a,0xfff3ed58,0xfff26dd7,0xfff36afd,0xfff15168,0xfffbd776,0xffed26d3, -0xffec2dc4,0xfff346e5,0x0005d69e,0x000159f2,0x000209ca,0x0001db5a,0x0001daf4,0x000229c2,0x000162f5,0x00037dfb,0x0004c6b4,0x00063755,0x0008157b,0x0009993c,0x000b4f6b,0x000bafec,0x000c939b,0x000da873,0x000d1d34,0x0003e675,0x000b83b4,0x000bc7cd,0x000a3ee5,0x001e9345,0x001b406d, -0xfffd55dd,0x001b1e5f,0x001a22f8,0xfffe3dbe,0x0003a5a6,0x0001dc4e,0xfff89ef3,0xfffe45db,0xfffe90b8,0xfffb2db8,0x00163cb8,0x0017b50d,0xfffe52c9,0x0018a3c0,0x001ca346,0x00087a46,0x000bc5cf,0x000dbf8e,0x001026ca,0x000f9475,0x000f5069,0x000db7b9,0x000d8632,0x000dadc9,0x0013d5da, -0x000bb77d,0x000b0341,0x000aa573,0x001216e8,0x0012fd23,0x000e4a0b,0x000d94a8,0x0007542e,0x00130891,0x0010518f,0x0007c995,0x00049afb,0x000b5858,0x000a98b4,0xfff85458,0x0007e41a,0x000e7622,0x000517aa,0x000ca772,0x000673b0,0x0004be7b,0x0002582d,0x000352df,0x0013645d,0x000c44d3, -0x00130d4f,0x0018cff3,0x0016013d,0x001eabb2,0x00217ee5,0x001d95c0,0x0016d2dc,0x000e698c,0x000b58a1,0x00104e41,0x0024cc8c,0x00116630,0x000f3deb,0x0010df43,0x00244b0e,0x0024b506,0x0012eff5,0x000f97f3,0x000cd947,0x001d63e1,0x00197d37,0x000c6314,0xfffaec3a,0x000d2e16,0x0005be6e, -0xffd634a8,0xfff0708a,0xffe36bae,0xffcf7061,0xffe3ae7d,0xffece96d,0xffe83f74,0xfff53d47,0xfff3c110,0x000572f4,0x000327c9,0x00112312,0x0016d59e,0x0014b083,0x00224a71,0x002db11d,0x002c1ee3,0x0027df16,0x001cd151,0x001b6e88,0x001bf6d7,0x003ce991,0x00116606,0x00123e6a,0x00162102, -0x003d82a1,0x003d1eda,0x001c808d,0x001ccbc5,0xfff625ac,0x000c00bd,0x0001f51c,0xffeedbc6,0xffd1d17d,0xfffba536,0xfff20b49,0xffcbe1c7,0xffe9fe0f,0xffeeeb5f,0xfff3ec92,0xfff8a8bd,0xfff79cf8,0xffe2b010,0xffee0a4b,0xffe72ff3,0xfffb23b3,0x00066e9b,0x001cc581,0x00305944,0x0037953b, -0x005028cd,0x005cad98,0x0050baf4,0x0033feed,0x0011d331,0x00068e3f,0x0020df98,0x005c4d4f,0x0024822c,0x0017ef63,0x00258054,0x005fa763,0x0058b158,0x0017255c,0x000b8181,0x00842933,0x0076d3d0,0x006d1d42,0x005ab27b,0x004e9cfe,0x0045bae9,0x002fabd1,0x0016d733,0x00160f71,0x000531d4, -0x00092fc7,0x000346da,0x00079b78,0x00038a69,0x0015d502,0x00135dd0,0xffd0ceb9,0xffc12279,0xffbd7a10,0xffbcb5c9,0xffa8bbe8,0xffa3f336,0xffa99d86,0xffd59462,0x000d0b8e,0x0055be5c,0x00414f4a,0x0015c6e4,0xffe27682,0xffef3535,0x000a2b65,0x0036ae19,0x001e9906,0x003471eb,0x0064786d, -0x0085f80a,0xffdc02da,0xfff4f690,0xfff38cac,0xfffb899f,0x0026c178,0xffebbe08,0xffd9b502,0xfff409e7,0xfff9229e,0xfffb5309,0xfffc8af2,0xfffc96b7,0xfffe4240,0xfffa62cc,0xfff886d1,0x0002a146,0x000f926b,0xfffe9854,0x0005ad71,0x00205eef,0x003f899f,0x00598fb4,0x00578ff1,0x0025927f, -0xffeed667,0xffc31f63,0xff9b2735,0xffc1da09,0x0025ce53,0x003d8065,0x0031f7b6,0x0026d0c3,0xffd26bc1,0xffb0c521,0xffcabbf3,0xffd47c74,0xfff8ab81,0x0054c45f,0x00007f05,0xffdfa455,0xffbca9ac,0x0008882f,0x000d6fd8,0x00032a07,0x0004c1de,0x00020dc4,0x000278ff,0x000214f8,0x000134c2, -0x00036ca2,0x0002942d,0xfffabf5e,0xfff43642,0xfffe598d,0x0006afe3,0xfff74828,0xffe518d5,0xffdf616b,0xffe2b5fc,0xfff08d58,0x00138123,0x003e5da2,0x007e68dc,0x005ab28b,0xffe8ce40,0xffb79fa5,0xffe8bc7a,0x00876ead,0x0098c65e,0x00ad6458,0x00c1321f,0x002041ce,0x002bf6c3,0x008f034e, -0xffba1d22,0xff6387cf,0xff7ac766,0xffe6a9a0,0xfffc949d,0xfffb22c9,0xfffea294,0xfffd7985,0xfffe0826,0xfffdca2e,0xfffe57c8,0xfffe227f,0xfffdebbc,0x0001db7f,0x0014d6a7,0x0021a5a6,0x002afeb7,0x002e15e3,0x002b3dd5,0x0025cf3d,0x00167518,0x000ae3e7,0x0003dcd9,0xffffe604,0xfffdad18, -0x0001d104,0x000b5b78,0x002b47a4,0x00559d8b,0x0093f0f2,0x0059fc32,0x001b3679,0xffe918e0,0x00049741,0x0066ef12,0x007366a9,0x0075de0b,0x007713b9,0x00431711,0x001458c2,0xfffe8967,0x000136b3,0x00034702,0x00025871,0x00038d29,0x0003b6cc,0x0002c04a,0x00021f8a,0x000710c0,0x000fed9d, -0x001e6028,0x00262b7c,0x0022c330,0x00163dac,0x000f3756,0x000de882,0x0010ba9b,0x0013b825,0x0016d4d8,0x001fb827,0x000ede45,0x00082484,0x0008b3c4,0xffeda058,0xffe321bf,0xffe8a48e,0x000a56c4,0x0034c91e,0x00489db0,0x006269b4,0x000eed2d,0x0006b623,0xffec508d,0xffe949e0,0xffe7e764, -0xffeed096,0xfff279f1,0xfff54f1f,0xfffae551,0xfffafda2,0xfff81dae,0xfff6f137,0xfff89ea6,0xfffd0afe,0x0006da64,0x000b9a48,0x00091240,0xfff6ceff,0xffec35ac,0xffec9802,0xffedb29e,0xfff2b934,0xfffbaab7,0x00122ca1,0x001f09f3,0x00243af4,0x0023aa35,0x001d01d8,0x00122f23,0x00117bf3, -0x000a0027,0xfff9352b,0xffe74fa6,0xffe20dad,0xffefb92b,0x0001f948,0xffe96d81,0xffef1943,0xfffe1891,0x0001054f,0x0004986f,0x00027018,0xfffee2bc,0xfffadad5,0x000537e5,0x000ad5f1,0x0016d4b4,0x0015c822,0x001bb61a,0x0020439d,0x001a6435,0x00144921,0x00117587,0x000e0670,0x000c27a3, -0x000218bd,0x0003af9e,0x00074c8f,0x00075cca,0x000bfd88,0x0010b2f1,0x00168988,0x001e1053,0x0025ac14,0x002ca4aa,0x0026e511,0x002042d0,0x001c3239,0x00117122,0x00058093,0xfff29b70,0xfff01a94,0x002b13fa,0x002dfe47,0x00291053,0x00263eb2,0x00273e2d,0x002410fc,0x00259cd7,0x00269890, -0x00269a31,0x0028c449,0x002b09e7,0x002a9824,0x00276c0c,0x00291d94,0x001e9d5d,0x00180e55,0x001561cf,0x000af4b2,0x00026a09,0xfffe7109,0xfffe910f,0xffff9cef,0x00003e42,0x0000b2ee,0x0000ae61,0xfffff23f,0x0004c279,0x00092942,0x000f9a0e,0x0016a35a,0x001ef4f2,0x0026fa59,0x00259273, -0x0026aca9,0x00277264,0x002ae112,0x00130d41,0x0012d596,0x001bc17f,0x001a1336,0x00099adc,0x001c42ec,0x00192a71,0x000b423b,0x000b113d,0x000a5b47,0x0007dc09,0x0008af2e,0x000852b3,0x00085dea,0x0019d5f4,0x00197822,0x00014428,0x001195da,0x0010ed7e,0x0006ca22,0x0007ac55,0x00079f6b, -0x000760bd,0x000746f2,0x00075d34,0x0006aad2,0x0009a270,0x000bb5a4,0x000d49fd,0x000f5fb7,0x0010e2f1,0x0013d503,0x00138d0b,0x00143944,0x0014ae08,0x0013e74c,0x000e792d,0xfff09daa,0xfff58a36,0xfff3b6d4,0xffebe3a1,0xfff80872,0x00158b2c,0xffe899c6,0xfff54734,0x00082102,0x000e2c7a, -0x000df3aa,0x000bc26c,0x000f9e54,0x001105f6,0x0012d85a,0xfff19ffe,0xffe522fa,0x001b2695,0xfff7b6e2,0xffeb66e7,0xfff0cf08,0xfff3a3b4,0xfff2635a,0xfff4b65c,0xfff32736,0xfff27628,0xfff0cf46,0xfff11446,0xfff165c0,0xfff7c475,0xffede616,0xffec2b04,0xffebcefb,0xfff0feb3,0xfff395da, -0xfff62a86,0xfff413fe,0xfff451e8,0xffeea195,0xfffd67d1,0xffea0687,0xffe9236e,0xfff7757b,0xfff359ee,0xffe3ff7b,0xfff12eb9,0xffeec446,0xffe0ad33,0xffe78172,0xffeb0cd4,0xffe87baa,0xffedecb6,0xffef4835,0xfff2f46f,0xfff46453,0x00056cf8,0xfff3d638,0xfff90117,0xfff74f36,0xfffa0c92, -0xfff41527,0xffeee758,0xffe8c011,0xffe7bb9a,0xffec740e,0xfffede8e,0xffe76f9c,0xffe1801a,0xffe34689,0xffefd8bd,0xfff64b32,0xfff8fe2b,0xfff3934d,0xfffe388d,0x000004c8,0xfff10ef2,0xffefe0a9,0xffeaa4e4,0xfffd3a52,0xfff961bb,0xffd0606c,0xffe853de,0xffe509ff,0xffc92cc2,0xffe23870, -0xffe4ac1f,0xffe08dc7,0xffe2c39c,0xffdf156b,0xfff848a1,0xfff09529,0xfff46449,0xfff87164,0xfff522d2,0xfff73b6a,0xfffd51bf,0xfff64077,0xfff1bfe7,0xffe7251a,0xffeafb38,0xffeb7aa6,0x000b1c5e,0xffd7ec51,0xffd15e08,0xffd7d693,0xfff0443f,0xffff6013,0x0006a6b2,0xffffc76a,0xfff26c08, -0xfff41b90,0xffe47a51,0xffd949a1,0xffcb8ba3,0xfff4e480,0xfff52f2b,0xffd8db34,0xfff29f10,0xfff6f132,0xfffbe1c4,0xfffd0abf,0xfffafb14,0xffebf4ee,0xffec33c4,0xffe16e8c,0xfff1f752,0xfffbeefb,0x0008695e,0x001419c0,0x000efbad,0x000f362c,0x000f41dc,0xfffb40db,0xffe0c75d,0xffc907b4, -0xffc87b4a,0xffe6b779,0x001df07a,0xffd75b88,0xffbfbbbf,0xffcf3273,0xfff60594,0x000897fa,0x00051dcc,0xfff496bd,0x005511ae,0x003ebfe0,0x003750fb,0x0039205d,0x00424ed1,0x0036fb35,0x001f05b1,0x000c27d3,0x000c9cea,0x00026d5a,0x00055a46,0x0000e353,0x00068ab4,0x00007e0a,0x00139dcf, -0x0015639d,0xffd4f6c6,0xffba7e24,0xffab1096,0xff9f80cc,0xff8ce4b1,0xff97bbb2,0xffb7cf77,0xffdd211d,0x001acb15,0x0070c54c,0x0044298a,0x00096c9f,0xffca6049,0xffc9cbc5,0xffcff507,0xffe1dc81,0xffce3b22,0xfff36767,0x004292af,0x0056515d,0xffea6719,0xffec7e94,0xffd10a23,0xffe43787, -0x000c3419,0xffeab94b,0xffe6b133,0xfffb0ffc,0xfffb7726,0xfffd64a6,0xfffdfe43,0xfffe1734,0xfffe2fdd,0xfffd2068,0xfff829c5,0xfffa1970,0x0003efa4,0xfff72eb6,0xfffd31fa,0x00058ac2,0x0012442e,0x00160155,0x00035bc5,0xffe8e37e,0xffc50d45,0xffa4a1fb,0xff90d16f,0xffc3e551,0x002bae0b, -0x002cf6b5,0x0013bf3b,0x00077a5f,0xffa24d91,0xff8b7fef,0xffc760a9,0xffcd551f,0xfff758ca,0x00579362,0x0012f7e6,0xffeefa5a,0xffc7de7a,0x0004b345,0x0009f4b3,0x000225de,0x000294bd,0x000198c3,0x000165d4,0x00018752,0x00011d1c,0x0002373d,0x00030947,0xfffcc345,0xfff1f059,0xfff8a9d1, -0xfff5a965,0xffeebe27,0xffe7449d,0xffdd9e43,0xffe27c83,0xffd3f0a8,0xffdfb62a,0xffffbeb6,0x00338c9d,0x001a1535,0xffbd69a6,0xffa1cde2,0xffb3188f,0x00054e01,0x0002a7f1,0x00196925,0x002ea211,0xfffa7bec,0xffbdd214,0x00699c67,0xffb87606,0xff57cc2e,0xff7561a9,0xffe0fa33,0xfffda29f, -0xfffd1c81,0xfffedefa,0xfffe1718,0xfffe9d92,0xfffe2a6c,0xfffe5106,0xfffeb6e4,0xfffcbb05,0xfffcf1a3,0x0009f1cb,0x001afaf2,0x00233d58,0x0025e9ce,0x0015cea7,0xffff315c,0xffe868e6,0xffd823a3,0xffd57ada,0xffdd0f88,0xffd3fca6,0xffd6e681,0xffd979b2,0x000cab28,0x0037c299,0x0074df83, -0xffd70e1b,0xff66bc64,0xff2136d1,0xff6cb07d,0xffe6e49c,0x0035e5bc,0x007ef978,0x0077f52a,0x0037beda,0x001275e1,0xfffdfa82,0x0000cd5a,0x00034c5d,0x0001ea04,0x0002c8d2,0x00031f2e,0x00035a27,0x00017dba,0x00057e63,0x000f2b6d,0x001e3538,0x00221d9b,0x001b6e4b,0x001178fe,0x000ed921, -0x000edf1a,0x00101935,0x000b8d96,0xffffc4c9,0xfff01cf0,0xffd730fe,0xffc57aad,0xffb4bbe5,0xffad4e49,0xff9fc801,0xff99fd6a,0xffa5aff2,0xffc2f295,0xffd5a8dc,0xffd98309,0xffeb59d8,0xffe106f2,0xffeca1a8,0xffdc9cee,0xffe1d15d,0xffe5ef18,0xffef8271,0xfff3a409,0xfffac86c,0xfffb8dca, -0xfffa5002,0xfff8843d,0xfff7a978,0xfffacb0b,0x00021262,0x0003b827,0x00005da1,0xfff68a7e,0xfff12d67,0xfff0de3e,0xffeaa1fb,0xffe6a2a3,0xffe95975,0xfff1d943,0xfff9c733,0xffff8095,0x0004c73d,0x000ad17e,0x000e59d7,0x000afc52,0xfff9c512,0xffd292ad,0xffd289f0,0xffcdf667,0xffd7f8e5, -0xffe35028,0xffd5fa8d,0xffda52d9,0xffe30d62,0xffe7810c,0xfff130ae,0xfff1efce,0xfff3e241,0xfff3d195,0xfffe7715,0x0004b98b,0x000d5976,0x000df97a,0x0016c7ac,0x0019910f,0x00177418,0x00120add,0x00111186,0x000a0e1c,0x0001081a,0xfff6fe18,0xffff75ad,0x000530ad,0x000a4bb7,0x000f7921, -0x0014fe08,0x001baa6a,0x00183710,0x00138cf9,0x000eee50,0x00037e99,0xfffae4f2,0xfff300af,0xffedbf28,0xffe5804b,0xffd933d4,0xffd88378,0x001a0f1d,0x0019a784,0x0029533c,0x001afd49,0x001cba21,0x001cab7a,0x001adeb9,0x001c047b,0x001adbd0,0x0019385b,0x001ab13c,0x001977c0,0x001b09f4, -0x001b7aaa,0x0016db2d,0x001480d2,0x000bbbe6,0x0009cecf,0x00055815,0x0005ac59,0x000994ec,0x000779b0,0x0007f0fc,0x0007bf6e,0x00076c32,0x0007af44,0x0009af33,0x000b2b17,0x000c3c63,0x000d7a7d,0x000de8ad,0x000cf57e,0x000e3cf5,0x0010529c,0x00124fb0,0x00163d9f,0x00099460,0x00083e5f, -0x00055dd5,0x000b7699,0x001a25e5,0x00042b61,0x00095bb9,0x0014a0b7,0x00159cf9,0x00168859,0x0017642e,0x00188f5d,0x0019492d,0x001ba227,0x0008e63c,0x0004378e,0x00137e16,0x000503db,0x0000a445,0x0007ce51,0x0006947a,0x0006c08f,0x00072fae,0x0007497e,0x0007972e,0x00077ede,0x00076c49, -0x0007247d,0x0006bc5d,0x0006682f,0x00061638,0x000592c2,0x00070499,0x000816da,0x00096abf,0x0008cadd,0x0005b7c6,0x001175d1,0x0010418c,0x00185487,0x000ee5f9,0xfffbece2,0xffdeed24,0x001471d1,0xffff92ad,0xffdfdcce,0xffe34fc4,0xffe2bde1,0xffdee1cf,0xffdfa386,0xffdeffd1,0xffde9a14, -0xfffa22b2,0x000d7eee,0xffe000b8,0xfffc14f5,0x000caae8,0x0014eb1f,0x0010cf5a,0x0014444e,0x0016edde,0x0015384f,0x0014be25,0x001390c6,0x00132699,0x0013836e,0x0019fbfb,0x001235f8,0x00119aa6,0x0011d74f,0x00177d2f,0x0017889b,0x0010e1bd,0x0012b4bc,0x000e88d3,0x00195fa9,0xfff21b81, -0x000af802,0xfffb501c,0x00025156,0x000a10c8,0xfff834ea,0x000cfd7f,0x000dbf36,0xfffb613f,0x00065507,0x000351e1,0x00052a23,0xfff7704c,0xfffb3d50,0x000d0c34,0x00085363,0xfff7a608,0x0019e79a,0x001d1d44,0x0022b407,0x0027f6bb,0x00209a76,0x001a3da4,0x0014483d,0x0011c559,0x00172f42, -0x002b0841,0x0018747d,0x0015dec4,0x0018065f,0x0025fed1,0x00239ff7,0x000ef867,0x0010f078,0x00172d7f,0x00223924,0x000baf94,0x0006f666,0xfff25470,0x00074329,0x000195d4,0xffde8fba,0xffef1023,0xffedba35,0xffd7c1d5,0xffee26e8,0xffe762fd,0xfff125fd,0xffe8deeb,0xffec5c11,0x0005759a, -0xfffdb59a,0x0003acb5,0x00130782,0x0020d04f,0x0028a340,0x0037c159,0x002f0db2,0x002a82c1,0x0021510d,0x0020d7ca,0x00222e28,0x004349b1,0x001af498,0x001ba708,0x0021fcb1,0x003cc249,0x0038e905,0x0015a31c,0x001cd53c,0x000448d7,0x000f4b15,0xfff98a95,0xfff1dd04,0xffd840ef,0xfffeaeba, -0xfff9d343,0xffe1e813,0xfff90f81,0xfffaec7c,0xfffde433,0xfffce7d1,0xfffdcb33,0xfff29058,0xffef170b,0xffe7477d,0xfff6580c,0x0003ec86,0x0009bf8b,0x00276527,0x003f1f43,0x004fe444,0x0060f665,0x0049a2b5,0x002cf6ee,0x00129e6e,0x000c976b,0x0029625f,0x00617ba9,0x002d5f9c,0x001ef11b, -0x002e07f6,0x005429e6,0x0044bacd,0x0001d82c,0x0002b4d5,0x00955e67,0x00654394,0x00493173,0x0043062e,0x0039b46b,0x002ea9df,0x0018e13b,0x0007f733,0x0006ea73,0x000172b7,0x00037a53,0x0000ed52,0x000480f5,0x0000109c,0x00121a3b,0x001b8f7e,0xffe4f293,0xffd682c8,0xffc19ab9,0xffc82416, -0xffcbd2b3,0xffc2a0a0,0xffdb2889,0xfff6830b,0x002f5eb6,0x0076d275,0x005a0fe1,0x002a516b,0xfffb3071,0x0004195f,0x001db59b,0x00482490,0x0026e0fc,0x00422ac1,0x0084fc78,0x00959ac1,0xfff53eea,0x0008734b,0xffecf7a8,0xfff59d2c,0x0018582d,0xfff555b0,0xfff081d4,0xfffd90e7,0xfffcdd1b, -0xfffeae00,0xfffe8308,0xfffeb08f,0xfffe7da2,0xfffe7e18,0xfff99a49,0xfffce51a,0x0009d13b,0xfff83505,0xfff23e13,0x000c065b,0x0037ccae,0x004ea482,0x0058c429,0x001d806d,0xffe151f2,0xffadcfe4,0xff924b05,0xffc82385,0x0036092c,0x002e98e8,0x0014533c,0x00071850,0xffb60358,0xffa0d456, -0xffc3a775,0xffd66447,0x00125993,0x006815d5,0x001a0d4f,0xfff5c909,0xffd14e77,0x0002ce81,0x0006de1a,0x000166ee,0x0001889a,0x0000f8df,0x0000e614,0x00013153,0x0000ba56,0x00019318,0x000243ae,0x000342e0,0xfff899a7,0x000a7d70,0x000e5598,0x0009e715,0xfff75d56,0xffe3d2a1,0xffe9d784, -0xffffecfd,0x003319d4,0x00729da4,0x00974af4,0x00609365,0xffdc815f,0xffe37fca,0x00255d38,0x00a4cf35,0x00b566db,0x00b6e76b,0x009ece3a,0x00284761,0xffe1c899,0x003a5f8d,0xffb85cbd,0xff6e8669,0xff754afd,0xffe7f460,0xfffdfd3f,0xfffea3dd,0xfffef9a5,0xffff1ffe,0xfffef446,0xfffeabc5, -0xfffed175,0xffff3c7a,0xfffd18d6,0xfffd3dd6,0x00086779,0x001bcb6e,0x00206820,0x0028eef0,0x002ac82c,0x0023e486,0x00158553,0x00012b6b,0xfff14abf,0xffeb4730,0xffe9ded6,0xfff2cb9c,0xfff24699,0x00318baa,0x005a3a1d,0x008aa16f,0x0028e3de,0xffe9edeb,0xffe09983,0xffcfeda1,0x006cfa67, -0x007b9b4e,0x0075614f,0x00850772,0x003ca0f2,0x001569f7,0xffff1632,0x0001f221,0x00016804,0x00010e5a,0x0001d740,0x000257e7,0x00023589,0x0000e72a,0x0003f9e9,0x000d6505,0x001d5594,0x002e61de,0x0028ef8c,0x0023e388,0x0018ca2d,0x0010313f,0x00135714,0x0011cdad,0x00125a59,0x00164ff4, -0x000230df,0xfffa18ee,0xfffc837a,0xffe967cc,0xffe4eafd,0xfff5ba9b,0x0018769b,0x003a5f66,0x004e1188,0x005147e7,0x001c92fa,0x000cf510,0xffe6cebc,0xffeb4d77,0xffe767ce,0xffefc852,0xfff5acdb,0xfff85f32,0xfffe5ae2,0xfffde855,0xfffc3bd5,0xfffad1c3,0xfffb076d,0xfffc036c,0x0003a8d3, -0x00080d87,0x00099a18,0xfffa68df,0xfff259cd,0xffeddd6d,0xfff1967e,0xfff60fdc,0xfff9bc22,0x000631eb,0x000b0f04,0x000b59e4,0x000a7e10,0x00057203,0xfffc4a16,0x00028f77,0x0006ef17,0x00076735,0xfffb0f43,0xfff60c55,0x00025069,0x000e14b5,0xffe64a17,0xffe30a59,0xffea4a2d,0xfff113df, -0xfff1cd44,0xfff4166f,0xfff4c162,0xfff5e12d,0xfffc3cea,0x0001fae4,0x0008c910,0x000a94a5,0x000e7cfa,0x00135a2e,0x0013ce6f,0x00132fa6,0x00137e27,0x000ec9fa,0x000a0a19,0x0005cb18,0x000c420f,0x000e0574,0x001035fa,0x00155808,0x001b3388,0x00219a27,0x00244059,0x00269f7a,0x0027aca1, -0x001ff4d5,0x00161cff,0x00100b51,0x0005cfff,0xfffbfcb7,0xffed2f2b,0xffe98b0d,0x001e60a3,0x001e98d4,0x0016cf72,0x001cc0d1,0x001c955c,0x001ae3f6,0x001fa15a,0x0020a249,0x0024739d,0x0027b281,0x0028f9fa,0x002cf112,0x002df9a5,0x002fdf29,0x0024cfc1,0x001f2418,0x001e2e07,0x0016935c, -0x000b2d0d,0x000c015b,0x000a54f6,0x000b07b8,0x000b2f67,0x000aec56,0x000a2a91,0x0009607d,0x000d9f52,0x0011fdc1,0x0017c1d3,0x001df06e,0x002504b4,0x002acbd5,0x00271d98,0x00245c69,0x002140dc,0x0020b115,0x0017610f,0x0016f645,0x00171baf,0x000fcc43,0x00021675,0x001a90cc,0x00103f18, -0x0002e09a,0x0002f8bd,0x0002b312,0x00020605,0x0001e18f,0x00011f69,0x00022c27,0x00140c71,0x001d2ba1,0xfffe4606,0x000f0169,0x0015a895,0x0014977e,0x0013dd38,0x00146d8e,0x001437bf,0x001462db,0x0014aeb8,0x00142dcd,0x00167f1f,0x0017d677,0x0018b95a,0x0019dbc4,0x001a9343,0x001d0273, -0x001b5b71,0x001b2fcd,0x001af356,0x00196fea,0x001b0837,0xffea7ce3,0xfff078cf,0xffe82149,0xfff9f44c,0x000d95ec,0x001feb48,0xfff0520f,0x0008f422,0x00188765,0x001e9865,0x001e4d25,0x0019936c,0x001dde4b,0x001e527b,0x001f8624,0x00050f53,0xffeecc69,0x0025b15e,0x000b5192,0xfff947bd, -0xffe58e5e,0xffedfd07,0xffebff57,0xffee2393,0xffeb73d2,0xffeafdd4,0xffeb1bb4,0xffeb06bd,0xffeb3a1d,0xfff094b7,0xffe82f64,0xffe7161e,0xffe75974,0xffed1129,0xffef9ba6,0xfff0be3a,0xffeef131,0xffedc586,0xffeba088,0x001112af,0xffea7829,0xfff34c03,0xfffd675e,0xfff4e500,0xffeb0eeb, -0xffefe6bf,0xffefe521,0xffe9021b,0xffe6fe7d,0xffe8b4c2,0xffeff15a,0xfff109e1,0xffefee72,0xfffa554f,0xfff402bf,0x00125035,0xffeeb66f,0xffeee426,0xffefa51b,0xffefd2ae,0xffe59b75,0xffe02824,0xffdfb045,0xffdfdf0c,0xffe5af17,0xfff5ae8c,0xffe1d5ee,0xffde7f55,0xffe2a8ba,0xfff0dce2, -0xfff5c281,0xfff38fe6,0xfff03303,0xfff5477f,0xfffbf7ac,0xfffe542a,0xfff42c50,0xfff1f0ba,0xffff98f7,0xfffcafdc,0xffde54c9,0xfff27412,0xffec01b9,0xffdf4ad0,0xffe3c4a4,0xffea8e94,0xffea43af,0xffe605e3,0xffddc894,0xfffd5e49,0xfff27a76,0xfffcad9e,0xfff4d497,0xffe946c9,0xffef65c6, -0xfff3b71b,0xffe5b526,0xffe1bcc9,0xffe1e2c9,0xffe45553,0xffe4f65b,0xfffdee86,0xffd3a337,0xffd19abc,0xffdb044b,0xfff78e97,0x00038d8a,0x00006f06,0xfffe8faf,0xffea7140,0xfff40e1e,0xfff3f5cf,0xffdfb776,0xffd68a76,0xfff90e54,0xfff9edb6,0xffebcbd4,0xfffc74d1,0xfffe7f60,0x0002a14a, -0x00026cda,0xfffea3f7,0xfff757c3,0xffee0915,0xffddd330,0xfff87fbd,0xfff1f409,0x00093f07,0x00081cc3,0xfffc152b,0x00033047,0xfffde97f,0xffdc99df,0xffc221c3,0xffbc7397,0xffc1b0b4,0xffe0b953,0x000bceed,0xffd44673,0xffc6f3eb,0xffdc7116,0x0008b167,0x0011e1e8,0xfffb550f,0xfff4f628, -0x0042394f,0x003be03c,0x004425a0,0x003a1645,0x003b44ab,0x00281e14,0x000e671f,0x0003720b,0x00041642,0x000074c6,0x00007a27,0xfffec0c3,0x0003562c,0x000011f5,0x000f3723,0x0015e10d,0xffef2d8d,0xffc9860c,0xffc3f4b5,0xffb5ee3c,0xff8e2bab,0xff9c2f17,0xffb93f4e,0xffed73b7,0x00283e42, -0x006b1e66,0x002f3c6b,0xffed9b9a,0xffb7a32e,0xffb8f7e7,0xffc5543d,0xffe3bfde,0xffcf2642,0xfff6ed6a,0x004d3f30,0x00550e1d,0xffe61318,0xfff513ad,0xffdfc52c,0xffe67293,0x0001aa84,0xfff5c9b3,0xfff79ecf,0xffff0d47,0xfffdf670,0xffff6521,0xffffe167,0xffffdc37,0xfffefceb,0xfffe94e5, -0xfffa8ce4,0xfff708c5,0x00039548,0xfff47abf,0xfff8651e,0xfff6ffe6,0x00001833,0x000c6aa4,0xfffa2b82,0xffdd5d02,0xffb9c9a7,0xff9db54b,0xff99a5aa,0xffd5931f,0x0038e56f,0x00201f25,0x0003e5fd,0x000407e3,0xffa94ac5,0xff9b18b7,0xffcfe744,0xffd448d3,0x0020c830,0x006b20fb,0x0030a6dd, -0x00019f2c,0xffdee9b6,0x00015e9b,0x0005b077,0x00002ba1,0x0001566b,0x00006a59,0x000042cf,0x00005654,0x0000ca38,0x0000ce58,0x0003925a,0x0001b3d6,0xfffc1c58,0xffffb3ce,0x0006bb20,0xffff4776,0xffea3360,0xffe4dcd8,0xffea6282,0xffd98193,0xffebabb8,0x001dac18,0x0028fba4,0xfff9f9ec, -0xff97569c,0xff9e9d47,0xffc1bf37,0x00105e83,0x001f5b44,0x002fa11f,0x001c7836,0x0010df0a,0xff8fdf23,0x000de569,0xffba842f,0xff75f84d,0xff80ce73,0xffe42d7f,0xffff8cf7,0xfffea15d,0xffff2d69,0xffff643a,0xffff8e37,0xffff5269,0xfffefbd8,0xffff29e3,0xfffd9560,0xfffbb73b,0xfffefac4, -0x0010c116,0x002191b7,0x001db7be,0x00082e0e,0xfff5244a,0xffdfe2f6,0xffd2993b,0xffce3e91,0xffd8ce50,0xffd8bb8b,0xffe6e9f1,0xffe68e7c,0x003593f6,0x004f26bc,0x0051686e,0xffae53d8,0xff4ac9f6,0xff2c967f,0xff649ae6,0xfff62a74,0x00697667,0x00a7f98e,0x008d5558,0x0037621f,0x0018b403, -0x0000855d,0x00022c8a,0x000159b6,0x0000bea2,0x00010e19,0x00014309,0x0001eebd,0x0001948b,0x000211a5,0x000a9b2c,0x00171ef5,0x0027fc98,0x002c992d,0x001cda7f,0x001881ce,0x00176ebb,0x00132ed5,0x0010d9f7,0x00064ca2,0xfff71cab,0xffdda433,0xffcd2ed0,0xffbf8f64,0xffb1b11f,0xffa47a2d, -0xffa251de,0xffb2ef7f,0xffc9f824,0xffd5e936,0xffd57049,0xfff46669,0xfffa0528,0xfffff32d,0xffef7178,0xffef49c4,0xffeff0a2,0xfff40e1b,0xfffa353d,0xfffe1122,0xffff11d4,0xfffd964b,0xfffd9c7c,0xfffbb452,0xfffaf5c9,0xffff3a5f,0x0002ad14,0x00043768,0xfffbd9f3,0xfff30100,0xfff20f0c, -0xffe93682,0xffe31613,0xffe42543,0xffea615b,0xffedca72,0xffee2836,0xfff11f11,0xfff4272e,0xfff604b3,0xfff5d265,0xffe9c640,0xffc93b33,0xffce9808,0xffd15400,0xffdfea75,0xffef59b2,0xffcb7088,0xffd0c9ce,0xffdf95dd,0xffdfd4ac,0xffeaf982,0xffeb4c21,0xffee6ac6,0xffefafbb,0xfff9b308, -0xfffb3501,0x0004ab16,0x00003b7e,0x000a9d24,0x000abf94,0x000f64da,0x000d3b5f,0x00113e4e,0x000bb897,0x0007065c,0xfffafdef,0xffff61a2,0x00073661,0x000bd4f4,0x00126ddf,0x0018ff44,0x0020ee61,0x001931e4,0x00115e0e,0x00093e69,0xfffa965d,0xffee65c2,0xffe2abb9,0xffe09fec,0xffdadf31, -0xffd0809d,0xffd050ce,0x00075eb6,0x00067285,0x001eae64,0x000bccaf,0x0013da0e,0x0014a014,0x0011378c,0x00142f71,0x001247e2,0x00153e16,0x001ccec3,0x001b5e49,0x001d7962,0x00214374,0x001fdd36,0x001afd2a,0x00129049,0x000f2a7c,0x00109baa,0x000970d4,0x000d42b1,0x000b6eab,0x000b330a, -0x000af8b0,0x000a147b,0x000abad1,0x00087a0a,0x000727ef,0x00060856,0x00058a6e,0x00047e60,0x000132e2,0x000149d4,0x0001e3d2,0x0002d31b,0x00058433,0x00063e94,0x00021a3d,0x000b6b12,0x0015bf0f,0x00213cc6,0x0007c49e,0x00146adf,0x001f7927,0x00221ed5,0x00238b4a,0x0023692c,0x0026980b, -0x002864c5,0x002aca1d,0x0018fef7,0x000d45b4,0x0023341e,0x0015fae5,0x000c9d03,0x000912b8,0x000a5608,0x000a0cb6,0x000aa670,0x000abf58,0x000af52e,0x000b2a3c,0x000a1c22,0x000913ba,0x000794a9,0x000618e1,0x0004cb16,0x0003902e,0x0004dccd,0x00058c70,0x00064699,0x00057491,0x00090329, -0x000aa6da,0x000b1411,0x00161ce1,0xfff91697,0xffe5c785,0xffdb805e,0x00018537,0xffea6809,0xffd90bb8,0xffdb1eab,0xffdbce6e,0xffdc623f,0xffd9f2d3,0xffd92e7e,0xffdc5ce1,0xffe46923,0xfff952cc,0xffddf916,0xffe73bf1,0xfff69137,0x0010b1ca,0x000a173c,0x000ce865,0x000f81cb,0x000c899d, -0x000bf7d7,0x000ba7c6,0x000bc036,0x000c4c59,0x0011ba51,0x000acda5,0x000a4bd5,0x000b87c9,0x000f0e8e,0x000f4112,0x000a42d6,0x000cc2e2,0x000cee3a,0x0010c6f3,0xffe25bb4,0x00039ea5,0xfff034d9,0xfff81449,0x0001d0da,0xfff45192,0x000738d2,0x0001910e,0xffed5641,0xfff536cd,0xfff668ec, -0xfffd9dcd,0xffebd9ce,0xfff0c405,0x0000493b,0xfffe3330,0xffe85b76,0x000ba237,0x00139e7c,0x00141983,0x00199696,0x000e9b26,0x0009a8cf,0x00084481,0x0008eb1b,0x000e8647,0x001d99d2,0x000d2701,0x000a9835,0x000f023e,0x0016e828,0x001531b0,0x0006511d,0x000a5426,0x0018e472,0x001b5527, -0xfffb821f,0xfffc9b01,0xffebb0b9,0xfffed3e0,0xfffc7d9f,0xffe84e95,0xffefa7c9,0xfff5bbf3,0xffe2bab8,0xfff2b5fe,0xffe5ccf3,0xfff5cb2f,0xffe04b1f,0xffe3114f,0x00009888,0xfff46ced,0xfff3eea0,0x00035e89,0x0017432a,0x001877a5,0x0026bbd3,0x001615b3,0x00124c23,0x000f2204,0x0013305c, -0x001523e9,0x002e6da4,0x000bfff5,0x000cba45,0x0018f1b3,0x00266c59,0x0025fd17,0x000e47af,0x00166b44,0x000d2cff,0x000b3194,0xfff0758c,0xffefe92e,0xffe04dd9,0xfffe64bf,0xfffde72a,0xfff4e04e,0x000185b8,0xffffe5ef,0x0006ce3d,0x00021da2,0x00002e7a,0xfffe705e,0xfff3dfdd,0xffe8a356, -0xfff33fa4,0xfffc9086,0xfff7d0ef,0x0011e6e2,0x002b6e78,0x002fbdcc,0x003c1111,0x0017b9f6,0xfffea11f,0xfff5cb0f,0xfffcbb59,0x001a31d4,0x00427c89,0x001520c6,0x00092f05,0x001f7131,0x0031f18a,0x00264e1d,0xfff74467,0xfffcf9d0,0x008bc3d3,0x00495244,0x002bc189,0x002ab61f,0x00255ad1, -0x001a2231,0x00089daf,0x0000bce3,0x0001de60,0xffff2f32,0xfffe717e,0xfffebe9c,0x000198f7,0xffff3d61,0x00093066,0x00180374,0xfff6802b,0xffe411cc,0xffc23128,0xffc8223d,0xffd642e1,0xffd4d8f8,0x0000e860,0x0019d416,0x005257d0,0x00901ebc,0x00669762,0x00301558,0x0003ba32,0x000924ca, -0x001acd11,0x003b0f3e,0x001b0d65,0x003d0be1,0x008e723a,0x008f8a8e,0x0017db86,0x001a0505,0xffe83ca3,0xfff36390,0x0009ddbd,0xfffc4cfc,0xfffb93ce,0xffffa1d9,0xffff34bc,0x00003cf0,0x0000bbe5,0x00004a49,0xffff6dc3,0xffffc981,0xfffbd463,0xfff96522,0x000341a6,0xfff65eb4,0xffe8826a, -0xfff8999c,0x0021e2ec,0x00302c69,0x003ac089,0x000ad094,0xffd5be41,0xffa51fd6,0xff9f733b,0xffe03fd6,0x004c15f6,0x002cbf35,0x0007088a,0xfff6996b,0xffa63a91,0xff9efc5b,0xffd2583c,0xffeb4336,0x002fee13,0x007909a0,0x0039b274,0x000ba295,0xffe13c37,0x0002ed38,0x0002d601,0xfffff2ef, -0x000077f5,0xffffd423,0xffffa5d9,0x000017c9,0x0000304e,0x0000bc83,0x00011ac7,0x0005c995,0xfffbf0e5,0x000da4eb,0x000ebcc6,0x0013e4c6,0x0007b390,0xfff12e92,0xfff95ba7,0x000a918c,0x003dd026,0x0083d36f,0x008698c0,0x00490c8c,0xffcf59e6,0xfffe2327,0x003b57b4,0x00801404,0x008f1fce, -0x0083b3c3,0x0047ab33,0x00248c59,0xff94f0bc,0xffc9ac42,0xffbe83e3,0xff97606e,0xff9025d3,0xffedd3dc,0x0000200c,0xffffa088,0xffffd5e1,0x00003510,0x00001eea,0xffffd111,0xffff56be,0xffffdb90,0xfffe8e1a,0xfffc1471,0xfffcc5b7,0x0010da11,0x001514cb,0x001f1521,0x001f57f3,0x00148d3c, -0x0006fe5e,0xfff310e8,0xffe22004,0xffde8e47,0xffdecb0a,0xffee0e68,0xffe877cf,0x0040ec9f,0x0059ba04,0x005c5a39,0xffd7acc9,0xff964e96,0xff9d51fc,0xff94d0bc,0x003a775e,0x0073622c,0x007ea029,0x00814fd1,0x002f9172,0x001652cd,0xfffefe7a,0x0001082c,0xffffbd8c,0xffffb2bb,0xffffd9af, -0x00009885,0x000115c9,0x0000a762,0x00007151,0x0007c962,0x0016c2b6,0x002afee8,0x0027c449,0x002b47d6,0x00243323,0x001991f1,0x001a5fa3,0x001433f0,0x000fdc97,0x000b298e,0xfff4825a,0xffe84694,0xffe4c8b8,0xffdb74d0,0xffd884b1,0xffea22d6,0xfffa3ec7,0x0008fcb6,0x0017acf7,0x000a29e3, -0x00198a3a,0x0009fa41,0xffecd100,0xfff1acfe,0xffed0a31,0xfff50e2a,0xfffb2724,0xfffe2279,0x0001d249,0x00009ae6,0x0000c093,0xfffe7848,0xfffe36b3,0xfffd56c8,0x0000c979,0x0003db02,0x0007d1ae,0xffff3f3e,0xfff8ce19,0xfff48471,0xfff83019,0xfff83205,0xfff758e0,0xfff819f5,0xfff693e9, -0xfff4c290,0xfff909bd,0xfffb30b7,0xfff88a1d,0xffff25c1,0x0003baf3,0x0003692e,0x0002464c,0x000040ba,0x00089059,0x000f77d3,0xffe490f7,0xffdb5059,0xffd92c9c,0xffe065be,0xffdf78c1,0xffe59485,0xffea7aec,0xffef8b5c,0xfff3b944,0xfffa5c11,0xfffd2ce1,0x0000d3e6,0x00020e67,0x000685c3, -0x00095b77,0x000ccd3b,0x000f8b92,0x000c1704,0x00059455,0x0007e2f7,0x001214de,0x00120e69,0x00162ca8,0x001c1794,0x0022fee4,0x002974aa,0x00251a1d,0x001fe49f,0x0019d44a,0x0010c5d9,0x0006bd7d,0xffff81a9,0xfff8d4b9,0xfff20876,0xffe8a21b,0xffe45b8a,0x000c65bb,0x0009caba,0x00021bca, -0x000e9c32,0x000d1c1a,0x000dadc7,0x0013a7a7,0x0014b63a,0x001a3b55,0x001bd92f,0x001bd8d8,0x00220ceb,0x002688d8,0x0028c355,0x00210218,0x001f24e5,0x001e54df,0x001b411f,0x000dfbca,0x001785ae,0x00162003,0x0015a42a,0x00155f2b,0x00147ac2,0x00132bf8,0x00130483,0x00150006,0x00179a2b, -0x001a3b96,0x001c9389,0x001eb6e4,0x001f2772,0x001aea59,0x00167ca5,0x00123216,0x000f467c,0x001668a9,0x00169b5f,0x000c98bf,0x0003d739,0xfffe459c,0x00127e40,0x000600f4,0xfffec39e,0xffff632a,0x00003fcd,0x0001bc77,0x00012e61,0x0000a82c,0x00026d3f,0x000b31ae,0x0018626a,0xffff1058, -0x0009846d,0x00137ebd,0x001ec8d0,0x001bb096,0x001cc577,0x001ccd97,0x001d13c5,0x001d65ce,0x001d1fab,0x001da2d0,0x001d78be,0x001d0b83,0x001cbda7,0x001c65f1,0x001d21c7,0x001b90cc,0x001af5a5,0x001a5507,0x0018a7d0,0x0020d0aa,0xfff3fbaf,0xfff8641b,0xfff0d086,0x000b4bf8,0x0016ce3f, -0x0011782c,0x00021c36,0x001377f1,0x0011e8ff,0x00165bbf,0x0015bfe3,0x00104d95,0x00125fed,0x0011c8a1,0x0012ffbf,0x000eb6f1,0x00002fc7,0x00152e15,0x00138fdc,0x00098fe3,0xffedea75,0xfff604e1,0xfff55ed1,0xfff75f95,0xfff3f030,0xfff3db07,0xfff576ef,0xfff5aeb1,0xfff5e1d4,0xfff95af8, -0xfff390e9,0xfff345fb,0xfff453fe,0xfff980e1,0xfffae0c2,0xfff81699,0xfff81b90,0xfff57cbb,0xfff9e0a8,0x0015e256,0xfff6c653,0xfffe8f22,0x00033893,0xfffd8052,0xfff8438f,0xfff944dc,0xfffab365,0xfff681b8,0xffef97d4,0xffeed0ff,0xfffda56a,0xfff5d077,0xfff4a52d,0x0005fd73,0xfffa8b13, -0x0010ef18,0xfff84cdc,0xfff679d6,0xfff9ec91,0xfff9827a,0xffec3b59,0xffe75733,0xffebb7ee,0xffee9a63,0xfff4ec8c,0xffffc5bb,0xfff2237d,0xfff1a08b,0xfff7869c,0x00042d4f,0x00049b37,0xfff8869f,0xfff9af74,0xfffb2f27,0x000656ef,0x000d415d,0xfffe5393,0xfff98721,0x00029de6,0x00004859, -0xffee9dc1,0xfffa3863,0xfff4aa94,0xfff0b83b,0xffebd0b1,0xffeeca8e,0xfff626b0,0xffe9f5e6,0xffe2d7d1,0x0003a1ef,0xfff76bda,0x00033738,0xfff97652,0xfff2b946,0xfffb3528,0x000185ce,0xffee1bd8,0xffebe5c1,0xfff56486,0xfff95f89,0xfffa9ce2,0x0008ab80,0xffecf14b,0xffefebea,0xfffbf995, -0x00155bc7,0x00184174,0x00023940,0x00088905,0xffeef3b6,0xfffefede,0x0003d2ac,0xffed5772,0xffe55917,0xfffdab64,0xfffd3643,0xfffab393,0x00006df9,0x0002c969,0x0003a2ed,0x0006b9a4,0x00019fda,0xfffeeb81,0xfff63eea,0xffe3fb55,0xfffc6a6f,0xfff056e7,0x00057157,0x00031590,0x0000480d, -0x000d2bec,0x0009e3ba,0xffde69d5,0xffc713e9,0xffd1a474,0xffdfaa10,0xfffbf28a,0x0013df86,0xfff2ac7c,0xfff0ce98,0x000a2c10,0x002f0262,0x00262b49,0xfff398a2,0xfffa053b,0x0048c1b0,0x003d69c3,0x004c04e0,0x00341896,0x00299c6a,0x00172217,0x00036c2c,0x00012b46,0x0000d371,0xfffeb603, -0xfffe9fda,0xfffd4c7f,0xfffffa0f,0xfffff6b2,0x00072024,0x0010d7f1,0x00035610,0xffe1f1d4,0xffdae833,0xffd21fc3,0xffaf2f98,0xffba310a,0xffd7a0f4,0x001293c1,0x0048817f,0x00739fb6,0x0039461e,0xfffb2c6c,0xffd4a19f,0xffd53e80,0xffe5a3c7,0x000beff2,0xfff43a1d,0x00175a6c,0x00678f53, -0x0065f17d,0xffe85346,0x000a2589,0xfffcac96,0xfff541f4,0x0002ed80,0xfffe0304,0xfffc4553,0x000011a0,0xffff7517,0x0000952e,0x0000cf48,0x0000fbc6,0x00005163,0xffff5f26,0xfffd2048,0xfff904f0,0x000378ca,0xfff8d00b,0xfff6ccd5,0xfff37ea2,0x00053e41,0x001a0150,0x001205db,0xffec3e33, -0xffc16423,0xffa320c8,0xffae4149,0xffefda66,0x004c45b0,0x0022c60a,0x00001799,0xfff98e49,0xffb0bbf5,0xffa97fde,0xffd04252,0xffdd14d4,0x002dd2f4,0x00726ea6,0x004db357,0x000ce391,0xffec3be9,0x0003ebd1,0x00026e9a,0xffffa69f,0x000051e5,0xffff8bf4,0xffff8fdd,0xffff75e5,0xfffff22b, -0x00003540,0x0001f334,0x00026276,0x0003871e,0x00076859,0x001749d3,0x00116562,0xfff3c8e7,0xffeea920,0xfff2d74a,0xfff28517,0x0015c133,0x00560de5,0x003ca82e,0xfffaae1e,0xff95b962,0xffc462e9,0x0000591f,0x0046d4d2,0x0065c351,0x00607df2,0x00177a7a,0x00170bab,0xff7c8872,0xff8d2121, -0xffba0c7a,0xffa9ab10,0xffa4ca4a,0xfff11bb2,0x00013f5e,0xffff3766,0x0000656d,0x00005aab,0x00006d24,0x000060bc,0xfffffb90,0xffffb7a9,0xffff0657,0xfffda824,0xfffa2038,0x0006c66e,0x001adf81,0x0013e409,0x0001e5c1,0xfff895ce,0xffe7ee73,0xffdda202,0xffd29d95,0xffd6031c,0xffdc6b07, -0xfff5b36e,0xfff98106,0x0057ca95,0x005c9265,0x0022d2a4,0xffaf95d6,0xff7783af,0xff805495,0xff930c7e,0x001c073c,0x00882503,0x00a6587b,0x0080a9bd,0x002daa7f,0x00171a73,0xfffe48eb,0x0000cc0c,0xffff3ada,0xffff2dd5,0xffff78e3,0xffff8397,0xffffe9f8,0x00010367,0xffff8785,0x000546a5, -0x00101f59,0x0029945a,0x0038ab49,0x0029fc1c,0x0022bb10,0x001d5f5a,0x00141ca9,0x0010e0bb,0x000a79a4,0x0003d238,0xffed17b9,0xffe0df63,0xffdbf8b5,0xffcdb344,0xffc987df,0xffd2fc33,0xffe3b542,0xffed979c,0xfff0c81b,0xffec63dc,0x000c7d50,0x00156b37,0x000cd113,0x000487f8,0xfffce314, -0xfffdc38c,0xfffcc989,0x000100cd,0x00018643,0x00029266,0x0000ab82,0x00018ef1,0xffffc882,0xfffe7188,0xffff66c4,0x00040f9d,0x000a8a68,0x00045762,0xfffada53,0xfff75250,0xfff04844,0xffeb54c5,0xffe8cad2,0xffeb38c8,0xffe99228,0xffe656be,0xffe94606,0xffea94f6,0xffe9f376,0xffed3d8a, -0xffeaf335,0xffdfc19c,0xffe5d321,0xffed7c67,0xfffcac1d,0x000afe54,0xffd67d63,0xffd84fbc,0xffe43418,0xffe1f424,0xffe82c84,0xffe9028d,0xffecf1e7,0xffefc184,0xfff7068a,0xfff6ee01,0xfffde66b,0xfff981b2,0x0000b646,0x0000a6a8,0x00077b9b,0x0008d47d,0x000f57da,0x000e0f44,0x000f09ae, -0x0006b770,0x0005f57f,0x000b6def,0x000d2ceb,0x00135221,0x0018fe22,0x001f3f32,0x00174c6e,0x000fe0fc,0x0007f39c,0xfffd6f2c,0xfff39817,0xffea6288,0xffe975c8,0xffe5eb8b,0xffde058c,0xffdbf89a,0xfffee37f,0xfffd2460,0x000dc3fa,0x0003af52,0x000cbece,0x000db34d,0x000ba8cb,0x000ed696, -0x000de4c3,0x0013b4a3,0x001c6739,0x001cd68d,0x001f0097,0x00246139,0x00249abb,0x002028b2,0x001ce895,0x00182e47,0x0019fdad,0x0012323b,0x0013c0b4,0x0013bd19,0x0013511e,0x00137bde,0x0012b725,0x0013d2e0,0x001026d8,0x000e89da,0x000d8736,0x000cef89,0x000c1989,0x000977e1,0x00065761, -0x0003c260,0x0001e757,0x00014769,0x000ce1c0,0x00083c20,0x00165755,0x001cb3e7,0x001b8bfb,0x00141907,0x001d772d,0x001f2664,0x002233e1,0x002378bc,0x0022c0d9,0x0025ea04,0x00277f79,0x0028e946,0x00259696,0x001ccaa1,0x00234142,0x0023264f,0x001cd31a,0x0012c24a,0x00151fc8,0x0014f8f2, -0x00158140,0x0015af58,0x0015d4de,0x0016258b,0x001539f9,0x00144250,0x0012b7b9,0x0011367c,0x000fea97,0x000f5107,0x000f3d91,0x000f0368,0x000e7272,0x000d3f71,0x0017355d,0xfff862dc,0xfffc07b4,0x000156e6,0xffe95c4c,0xffe4aa69,0xfff27ad8,0xffec9466,0xffe6606c,0xffece8e3,0xffeea8c2, -0xffef7ea0,0xfff12513,0xffee6c41,0xffee6506,0xfff4038b,0xffe0dce4,0xffe66a5d,0xfff6f627,0xffe5a0b1,0xffe77b93,0xfffbbce3,0xfff95d93,0xfff9c8fe,0xfffbb572,0xfff7e004,0xfff790ae,0xfff8c377,0xfff9e5a1,0xfffa7be0,0xfffd6af8,0xfff8178c,0xfff79b14,0xfff960ae,0xfffb59c6,0xfffc1661, -0xfff9f16e,0xfffbd82c,0xfffe4eb5,0xfffac916,0xffe8d8ea,0xfff3cc97,0xffe9888e,0xfff15d8d,0xfff652a1,0xfff0d313,0xfff9a481,0xfff24a7b,0xffe43b4f,0xffe2f1c5,0xffe69787,0xfff3a99b,0xffe5efba,0xffe8bad5,0xfff443c0,0xfff22945,0xffec1d8d,0xfff4314e,0xfffcae1c,0xfff9064e,0xfffb5066, -0xffed82fc,0xffea842e,0xffef678e,0xfff4f93a,0xfffaa2b9,0x0001b5b1,0xfff55943,0xfff34c8c,0xfff959aa,0xfffccaad,0xfffcb9bf,0xfff5a6c6,0xfff9cc45,0x000a2d16,0x0007cc99,0xffef930b,0xfff07718,0xffea938f,0xfff82677,0xfff98f8e,0xfff28015,0xfff5adaf,0xfffb3c0d,0xfff19d6d,0xfff6077b, -0xffebeb50,0xfff90bea,0xffe0d877,0xffddc1f9,0xfffb6177,0xffed020d,0xffea5eec,0xffef9411,0xfffcddbc,0xfffa0b8f,0x00021673,0xffeb941e,0xffea2734,0xfff1db6d,0xfffc613a,0xfffef4b3,0x0008dd81,0xfff00e85,0xfff038fe,0xffffb3b8,0x00048762,0x00089003,0xfffe5bc9,0x00062247,0x0004ce5d, -0xfffe0a71,0xffeb4a2c,0xffeac5ad,0xffe79e58,0xfffcba39,0xffff8bff,0xffffbb02,0x0002f222,0x0001c0da,0x000468af,0x0004a254,0x00032b75,0x0002da61,0xfffc004b,0xffec22b1,0xfff4e872,0xfff35ed4,0xffee5cfc,0xfff8af4e,0x00064534,0x000084d4,0xfffecb5c,0xffcfdfb7,0xffbd62c9,0xffccd25d, -0xffe517a3,0x0000abe4,0x000f6964,0xffef3920,0xffe8a68d,0x0002ab4a,0x00084056,0x0002dbda,0xffe9ab80,0xfff334dc,0x00597f54,0x0020d84a,0x0016001f,0x0015fbc3,0x0013721d,0x000a5c18,0x000000fb,0x00003244,0xffff167e,0xffff0570,0xfffe2882,0xfffdfa35,0xfffedd27,0xffff1c73,0x00023488, -0x000d6a91,0x00045f67,0xffecb07f,0xffcb0141,0xffc6b2da,0xffc92e28,0xffd45c3e,0x0009459f,0x0031ca40,0x0067f32f,0x0093b2ab,0x005f3549,0x0024acb4,0xffff3827,0xfff79a5b,0xfffd9473,0x0013de26,0xfffc710c,0x00205d86,0x0072c462,0x0066d872,0x00163531,0x0014bc34,0xffe6677a,0xfff39f70, -0x0000909b,0xffff5dc0,0xfffdcdf4,0x0000ee32,0x00000c12,0x0000c734,0x0000d789,0x0001045e,0x000082f3,0x00006d31,0xfffe943a,0xfffa4b6e,0xfffe8711,0xfff91f09,0xffecc25d,0xffea9c9f,0x0004723c,0x0009a894,0x0006fb14,0xffe65df1,0xffbcea8e,0xff9a250d,0xffaec4d7,0xfff47954,0x005222ff, -0x00221a9d,0xfff4fa53,0xffe07f8a,0xff9b87bf,0xffa0a200,0xffdb9b0e,0xffeeafaa,0x003e94dd,0x007150e1,0x004b9562,0x0012a2d6,0xffe793fe,0x000822e4,0xffff5e58,0x000001a7,0xffff7f50,0xffff8cb4,0xffff595d,0xffff7cc7,0xffff9591,0x000005da,0x00003fcd,0x0003ee9b,0xffff829a,0x00083cc6, -0x000929c8,0x00121d06,0x0008ee25,0xfff89510,0xfffe000c,0x00055cab,0x002b8f0d,0x0066c37f,0x00442b55,0x0004a7ea,0xffa70eb3,0xffef9e9c,0x0025f630,0x0039aecf,0x00513ffb,0x0040020c,0xffef2379,0x0016a900,0xff7259ee,0xff57ab14,0xffb3ef76,0xffc425ac,0xffb81ddb,0xfffa78ef,0x00000df7, -0x00009b32,0x00008681,0x0000c6b5,0x00009536,0x000093ad,0x00002f4d,0x00003a40,0xffff7aeb,0xfffed554,0xfff764d9,0x0002b09a,0x00094528,0x000cd3c2,0x00039106,0xfff59a45,0xffe71111,0xffd74ef5,0xffca45ca,0xffcd4657,0xffceda34,0xffe8a772,0xffeca192,0x004d4580,0x004ce6ca,0x000f32da, -0xff956f56,0xff6229d4,0xff6c8faf,0xff83fd5d,0xfffcf22b,0x00601d9d,0x007b9c8a,0x00657730,0x0022921c,0x00110a47,0xfffca550,0x00001f50,0xfffe2899,0xfffeec96,0xfffed34f,0xffff4b71,0xffff7c79,0x0000359e,0xffff695c,0x00027223,0x000d64ad,0x0021635c,0x00279483,0x0029faca,0x0026694c, -0x001d4272,0x00187aea,0x000eb7b6,0x0004da8d,0xfff7c6c3,0xffe1d4c4,0xffd1bebb,0xffc613e6,0xffc3b585,0xffc3bc0a,0xffd20659,0xffd06bf9,0xffcdd5c6,0xffd6ef2d,0xffc2e98f,0x001184cf,0x0009bb76,0xfffcd0d1,0xfffc4235,0xfff84141,0xfffda4a2,0x0000c0a7,0x0002d737,0x0003a8c4,0x0002c0a4, -0x00025341,0x0001b268,0x0000e8e6,0x000030d4,0xffffad8f,0x0001ad49,0x0006a0a1,0x0004dc83,0x00001753,0xfffad2f4,0xfff87d73,0xfff2455d,0xffecfd31,0xffe55ac5,0xffdf6817,0xffdbc9fc,0xffe39637,0xffeaeefa,0xffee9fb7,0xfff1a246,0xfff1a1f4,0xffec0cd7,0xfff9310e,0x00001718,0x000a6be0, -0x000f486d,0xffe26050,0xffd9d553,0xffd5db76,0xffda84f8,0xffdbc625,0xffe1cf84,0xffe9009e,0xffef68fe,0xfff370d9,0xfff7d926,0xfff9be20,0xfffab4d4,0xfffc7036,0xfffde0c0,0x0001b190,0x0004de33,0x0008ff8e,0x0007f180,0x00039355,0x000717c7,0x000eb35e,0x000ec6d7,0x001272a2,0x001753b3, -0x001cddfa,0x00219ea5,0x0017a622,0x000ccd59,0x0001d490,0xfff98da1,0xfff25e1f,0xffeb8a5d,0xffeae2b5,0xffe862e0,0xffe51c33,0xffe115ac,0xfffab802,0xfff5b872,0xfff9dfca,0xfffe6125,0xffffdd13,0x00026c78,0x0004e1fb,0x000657d4,0x00090ca1,0x000a12b9,0x000be092,0x001071b4,0x001625ac, -0x00194abf,0x0018e972,0x001a4b25,0x0018de4f,0x001abc32,0x00146399,0x001c5f58,0x001d2ccb,0x001c27a9,0x001c0fd3,0x001b786a,0x001a717d,0x001b7a0c,0x0019e586,0x00197fdf,0x00180937,0x0015e0f7,0x00126d68,0x000d7bfd,0x00097f60,0x0004feb9,0x00015920,0xfffda91d,0x00106e1a,0x000ef9a9, -0x00070f19,0x00051e18,0x000c43d1,0x000a3479,0x0006dd03,0x000c2a1c,0x000e17fd,0x000fd633,0x00120bd0,0x00128efd,0x0013185a,0x0014fd80,0x000d1167,0x0012c710,0x001203f9,0x000de910,0x00127076,0x001ef438,0x001caa4c,0x001d9a4d,0x001e26a3,0x001e9b40,0x001f0f7e,0x001f760f,0x001dcacd, -0x001c11f8,0x001a3fa2,0x00186a4f,0x0016f39a,0x0015b17e,0x0014edc3,0x00141e08,0x00132636,0x0011a65d,0x001e06e5,0x00004fb8,0x0002823a,0x00021bc8,0x000de54c,0x0008c372,0xfff28692,0x000b3d10,0x000947db,0xfff8d076,0xfffa553a,0xfff9cf82,0xfff6d377,0xfff5196e,0xfff39e54,0xfff6481d, -0x0003c0ab,0x00071200,0xfff47ef2,0x0006b133,0x000b1c82,0xfffdceaf,0x00007ad1,0x0001c5ec,0x000339bf,0xffff85f0,0xffffb13e,0x00020fd7,0x0003285b,0x0003753d,0x0004841b,0x0001c477,0x000253ad,0x0004af21,0x0007dbe1,0x0007a070,0x0000f899,0x0003ae19,0x000190ab,0x00094163,0x0003a9c0, -0x0001a98d,0xffff5710,0x00001733,0x0001ea1f,0x00006b78,0x000281b7,0x000265a8,0xfffb5136,0xfff3f694,0xfff2d058,0x00041f91,0xfff3e9e9,0xfff50464,0x000954e9,0xfffe0a8f,0xfffeb60c,0x0002521d,0x0002f61e,0x000621c0,0x0005a25b,0xfff73414,0xfff3c1d0,0xfffb3997,0x0001b356,0x00078dd6, -0x000b2f4e,0x0004b54d,0x0006913f,0x000e754c,0x00159f6b,0x00118db1,0xfffd8459,0x00041311,0x000927c5,0x00122a49,0x000e76d8,0x00026955,0xfff89c28,0xffffb1e3,0xffff54e2,0xfffaf102,0xfffcd767,0xfffb7421,0xfffaba0e,0xfff77cf3,0xfff1f87c,0xfffdd06c,0xffeb7bf2,0xffe720e5,0x00037e22, -0xfff82a12,0xffff0708,0xfffc0aca,0x00032346,0x0008d0d3,0x00104160,0xfff9e948,0xfff9b765,0x00087bc4,0x00114d3e,0x00135ce0,0x00140b53,0x00084c9a,0x000f7338,0x00205ef6,0x002dd323,0x0027bbcc,0x000307ab,0x001236cb,0xfffe65cf,0x000984e9,0x0005cb03,0xfff7e9fc,0xffefc8f5,0xffff4f8a, -0xffff57d0,0x00005276,0x0000e8e9,0x00018935,0x00027747,0x00041c2a,0x000321a9,0x0001fd9a,0xfffee40d,0xffef4ead,0xfffb594b,0xfff2bee5,0xfffa5b9f,0xfffed07e,0x000ca642,0x0016e47c,0x0014f887,0xffe4e0b0,0xffd3b50f,0xffea7ed4,0x0003de77,0x001ac21a,0x001b7b6d,0x00107ccd,0x0017df8d, -0x00353e14,0x00454251,0x002cfe38,0xffea5da6,0xfffe067d,0x005fe4b3,0x003bda21,0x003a3bfc,0x0021d93a,0x00133f41,0x000754db,0xffff3bdd,0x00004c20,0xffff79fb,0xffff5ce1,0xfffeb56b,0xfffe24d9,0xfffec596,0xffff087a,0x00019248,0x0007f845,0x000c0b2c,0xfff74010,0xffe5ea8e,0xffe3ba82, -0xffd805d5,0xffde33be,0x00001cf1,0x0037e9b2,0x006571ec,0x007854e3,0x0049a492,0x001632c5,0xffff2f6d,0xfffea462,0x00135d70,0x003fde0c,0x002a1e05,0x00469aaa,0x0087d4e1,0x00791d8b,0x000d82f1,0x002004fd,0x0008d80a,0x000261fe,0x0005b703,0xfffe6913,0xfffeaafa,0x0000d7ab,0xffffebb7, -0x000096d9,0x0000a888,0x0000ee58,0x0000b2fd,0x000056a8,0xffff60b7,0xfffb9001,0x00008a0c,0xfffd911c,0xfff585a2,0xfff489d7,0x0011d4db,0x0025d228,0x002799d0,0xfff8d5f1,0xffc77afd,0xffa7000d,0xffbe7429,0xffff7049,0x004f1749,0x00223453,0xfffb45ee,0xffea4f23,0xffba0bb6,0xffc0e5a5, -0xffe79bd7,0xfffe5961,0x004a7492,0x007cd1a6,0x005aa010,0x001200ec,0xffef6772,0x0007b44c,0xfffe563c,0x0000478b,0xffff6a53,0xffffb135,0xffff66b8,0xffff693a,0xffff9008,0xffffa2fd,0x0000a013,0x000102ad,0x00037edb,0x000954fc,0x00190d8b,0x001c11bc,0x0004939f,0xfffd3564,0x0000f08d, -0x001802d6,0x0048c910,0x00879f87,0x00543fdb,0x00087aec,0xffa8a194,0xfffd19bb,0x004eac12,0x0084eb10,0x00aaba74,0x008b5032,0x001ad503,0x00270265,0xff90f723,0xff2ff19e,0xffba20f1,0xffdcce26,0xffcea89c,0x00002619,0xffff4cb8,0x00013e56,0x00004052,0x0000d9d5,0x00009244,0x0000b6d0, -0x00007901,0x00005977,0xffffcbee,0x00002808,0xfff9ac6b,0xfffdfb8b,0x000a7d1c,0x000736db,0xffffb3c1,0xfffed386,0xfff48ab6,0xffea5cdd,0xffdbe050,0xffdb5fb0,0xffe480ae,0x0007c491,0x0016afdb,0x006fa697,0x005e22fd,0xfff91108,0xffc83a17,0xffbeaff7,0xffd92ed7,0xffd7a58a,0x0036bc06, -0x00857ca7,0x007d9791,0x005cacb8,0x00225ce7,0x000c7ec4,0xfffb511c,0x00002bb7,0xfffe20ec,0xfffef829,0xfffeb128,0xfffefef2,0xfffef3d4,0xffffcf7d,0xffff320a,0x00000de2,0x00085eb3,0x00216c85,0x0033f34b,0x00300a4f,0x002885e9,0x00207cfd,0x0019662c,0x00136735,0x0010ff9f,0x00113287, -0x0000b6ef,0xfff6f236,0xfff58d36,0xffe7f48e,0xffecb023,0x00027c5d,0x000ace7d,0x0007aa03,0x00067935,0x00018b08,0x00273ea0,0x002b843b,0x00121f0d,0x001131f2,0x000590cd,0x00070e80,0x0001db7f,0x000386de,0x0002c821,0x00030168,0x00024b39,0x00027c5c,0x0001e4b0,0x00014042,0x00004036, -0x0003d5e0,0x000ba440,0x000a14c5,0x0002f4e9,0xfffc4c9a,0xfffa562d,0xfff7b807,0xfff42962,0xfff28f65,0xffecce57,0xffe5fa77,0xffea31ee,0xffe9f2bf,0xffe5a67f,0xffea7ad9,0xfff07030,0xfffab6eb,0x0000e457,0x000cfba8,0x001bbab0,0x0027380d,0xffe94b61,0xffe5edf6,0xffea0dc8,0xffe99d85, -0xffe8ee3c,0xffeb7de9,0xfff04a92,0xfff4459f,0xfff74c43,0xfff8057a,0xfffaec3d,0xfff8e76a,0xfffac5d9,0xfffb7413,0x00000386,0x0003b714,0x0009a635,0x000c226d,0x00102ea0,0x0011e7f1,0x0010c988,0x0011642f,0x0010fc6a,0x00156248,0x0019d3d8,0x001dceca,0x00179c39,0x001209dd,0x000c188d, -0x0006d925,0x0000b9fc,0xfffb3534,0xfff8fdab,0xfff56c81,0xffeef791,0xffebb145,0xfff980a7,0xfff60886,0xfff92f0b,0xfffb8f85,0x0001bd57,0x000270ef,0x0002d7b1,0x00051e5c,0x00068663,0x000c0742,0x00118c9e,0x00150dac,0x00182e22,0x001d315b,0x001e5c7b,0x001d602a,0x00203f5c,0x001da4f6, -0x001cf319,0x001aa3fe,0x00195303,0x001ab946,0x001a8e2c,0x001ac059,0x0019f9e0,0x001b00f9,0x0017eca6,0x00170d79,0x0016b006,0x0016191a,0x00157576,0x00140264,0x000e133c,0x0008d037,0x00044f7e,0xffffea6e,0x001253eb,0x000ebd89,0x001925cc,0x00183c38,0x000eb212,0x00198919,0x001a754d, -0x0014673f,0x0016e75d,0x00180cbe,0x00180c2e,0x0019c3a6,0x001a6d18,0x001aff1b,0x00244181,0x00242dc0,0x0018f9e0,0x00235db5,0x00243934,0x001c0fa7,0x001da8f5,0x001e0918,0x001e55a6,0x001eb6a5,0x001f030d,0x001f721b,0x001eac2f,0x001dbfcf,0x001c6319,0x001b3774,0x001a2ef1,0x001a337e, -0x001899b4,0x00175be6,0x0015962a,0x0013f9be,0x0022103a,0xffe9711b,0xfff02750,0xffece1d4,0xffea0d23,0xfff44e4b,0x000a6dee,0xffe57b9f,0xfff296ad,0x00066635,0x0007a136,0x000769fe,0x0007a0db,0x00059c5d,0x00069135,0x000c9492,0xffee61c9,0xffe272a2,0x000f7f27,0xfff344c5,0xffe83636, -0xffe795d9,0xffebbc08,0xffea1427,0xffead718,0xffe6ea38,0xffe6fc9c,0xffe9871f,0xffeb8eb8,0xffebcfa5,0xffeb3c98,0xffe88be6,0xffe89d3d,0xffeb4e45,0xffec9c37,0xffedd76a,0xffed74e4,0xffeebd75,0xfff21e07,0xffeb8955,0xfffb8e97,0xffea6fb4,0xffecf2f5,0xfff23ba2,0xfff0fe18,0xfff3563c, -0xfff1570c,0xffeced12,0xffe776aa,0xffdd2580,0xffdeff33,0xffef48e8,0xffe75386,0xffe81a4d,0xfff18f02,0xffec2d63,0xfff9a168,0xffe3e92c,0xffe92122,0xffe47a23,0xffe1cd0f,0xffd35c20,0xffd20c87,0xffdbe32a,0xffe5aa62,0xffea6eab,0xffe7e590,0xffe194a2,0xffe1c4b8,0xffeabcab,0xffec685e, -0xffedad2e,0xffeae637,0xffef3f39,0xfffdc0a7,0xfffa2282,0xfff2c6b1,0xffef0d6e,0xfff06982,0xfff67f30,0xfffac652,0xfffce630,0xfffd9c40,0xffffe359,0xfffd1422,0xfffc5bc8,0xfff7af2d,0xfffd5817,0xffe9a7f0,0xffdffea2,0xfff94ee9,0xffeb753f,0xffeb3056,0xffe2e543,0xffe5ad9c,0xffe2cb9e, -0xffe2c533,0xffcacaa0,0xffcbc681,0xffdce683,0xffebe9ac,0xffed3793,0xffe3d6bb,0xffd90b73,0xffdc00ed,0xfff083b8,0xfff284fb,0xfff92a8b,0xfff4a5fd,0xfffdf11b,0xfffc6bb6,0xfff6f0d1,0xfff25a04,0xffecbac3,0xfff04ddb,0xfffcff93,0x000123e2,0x0000d5ce,0x0000d4ff,0x0000e846,0x00016162, -0x000346a0,0x0002b416,0x0002412d,0x00030d43,0xfff3b36e,0xfff8b344,0xffed5c28,0xffee827c,0xffe69913,0xffe6b2cf,0xffddf1c2,0xffccb0a3,0xff9aca98,0xff8fb960,0xffb26857,0xffd804b4,0xffec8682,0xffdcca18,0xffcf957d,0xffd43a70,0xfff50ff9,0xfff604d8,0xfff3604f,0xffe40630,0xfff2e7b5, -0x00324f25,0x0012e299,0x001b08e6,0x000faa13,0x000b5158,0x0002841f,0xffff5e44,0xffffaf3c,0xffff8c44,0xffff78b7,0xffff3ab8,0xfffe47b6,0xfffef27b,0xfffe53aa,0x0000ac13,0x0003efa3,0x000b35ef,0xfff33af5,0xffdbad90,0xffcbe4b6,0xffbd6381,0xffd29259,0x00028f11,0x003fbcfc,0x006ba4a0, -0x00794ffe,0x003e2a37,0x00059a00,0xffebd42c,0xffe107bf,0xffe48e3f,0xfffb134b,0xfff14b5e,0x00161d73,0x00627641,0x004ad27f,0x0011e1ef,0x001538d9,0xfff93565,0xfffd1b1c,0x000021d1,0xfffee44a,0xffffaf20,0x0000b4e0,0x0000176c,0x00007492,0x000079ec,0x0000d558,0x0000b9b3,0x000096e5, -0x00000477,0xfffd1aff,0xfffd6218,0xfffcf8fa,0xfff8f4d1,0xffe83e69,0xfff0b5b1,0xfff0dd76,0xffdf73a5,0xffc72f4a,0xffa8c86a,0xff98e1c2,0xffc2f9dd,0x00052735,0x0049715f,0x0019e8ec,0xffef037c,0xffda2512,0xffa4fd70,0xffb1d029,0xffead3c6,0xfffccf7f,0x0038d2fd,0x006e9d48,0x005fd15f, -0x0011b532,0xfff34421,0x00074c45,0xfffd575b,0x00008701,0xffff3e41,0xffffcdc6,0xffff7734,0xffff7dc7,0xffff7328,0xffffa797,0xfffff5b6,0x000132c2,0x00027b3c,0x0000b8f6,0x00053de1,0x000c51ea,0x000392dd,0x0000e7f2,0x0005084d,0x000b1784,0x0022ee67,0x0047dca0,0x00099de3,0xffcc7619, -0xff8ea915,0xffe767c6,0x001c9d55,0x001653a0,0x0030d051,0x0011cb77,0xffa846f2,0xfffd7518,0xff645460,0xff0719e6,0xffb0a4ed,0xffe2e209,0xffe32b19,0x0001defb,0xffff8d21,0x00014eaa,0x00004b0a,0x0000cab5,0x00007f46,0x0000b86a,0x00007bd6,0x00009148,0xffffb4d0,0x0000c635,0xfff9f319, -0xfff78afc,0xfffeed96,0xfff9f132,0xffea1b0f,0xffde4e14,0xffcfcb9b,0xffc6e155,0xffc02735,0xffca04e6,0xffcc30a5,0xfff14898,0x0009ccb9,0x0059152a,0x003b0616,0xffc416a4,0xff78deeb,0xff600210,0xff6396e2,0xff938532,0xffcd522e,0x003c47f9,0x0062366d,0x003c2d99,0x0018e3c4,0x00049e49, -0xfffc73f2,0xffff87b8,0xfffe523b,0xfffefd17,0xfffedbbc,0xfffeea1f,0xffff0494,0xffff62a0,0xffff9ee5,0xffff9edc,0x0004a498,0x001626ef,0x00250e65,0x00255aeb,0x002584a7,0x00214efd,0x00194ca4,0x000cb73c,0xffff42e9,0xffee9eaa,0xffdb8ca6,0xffca0361,0xffbaaabd,0xffbacf54,0xffbeb9f7, -0xffc90b0c,0xffb9e7f6,0xffa95e65,0xffa5fe5b,0xff9b9498,0x000abacd,0x000f7bf6,0x00142e09,0x0009de3c,0x0005865f,0x00054f21,0x000310bf,0x00038e13,0x00029c36,0x00028e4c,0x0001f69b,0x00027931,0x0001ab49,0x0001cb1b,0x000069f7,0x00012eb1,0x0005c210,0x0009619a,0x00066719,0x0001e955, -0xfff98c24,0xffefdbc9,0xffe976a8,0xffdfde2a,0xffd7f92c,0xffd0d7be,0xffd90cef,0xffe0bd63,0xffe5b42e,0xffe51139,0xffe04580,0xffd8d818,0xffec1196,0xfffaeeff,0x0006fd4f,0x000f745e,0xffdf7efe,0xffdd6aa6,0xffde547a,0xffdefebe,0xffe30b20,0xffe7b3c0,0xffef804a,0xfff5a01a,0xfff96168, -0xfffb24f8,0xfffbfd41,0xfffaa829,0xfffc5400,0xfffad935,0xfffd6824,0xffff34c2,0x00043769,0x0005a4fd,0x0006c2b6,0x000819be,0x000898d4,0x000a16e4,0x000b4e26,0x000e70c3,0x0011aa0e,0x00148b7b,0x000892e0,0xfffc6062,0xfff0cb93,0xffea6674,0xffe637b1,0xffe00ada,0xffe2a8c7,0xffe1f58f, -0xffe08fb3,0xffdec2fb,0xffebd80c,0xffe5f605,0xfff68519,0xffef6a50,0xfff56204,0xfff86b2d,0xfff67895,0xfff83e7d,0xfff7d44b,0xfff9ffdb,0xfffeb565,0x0000beb3,0x0005683b,0x00098b6d,0x000ffa10,0x001285f4,0x00113150,0x0015482b,0x001a4999,0x0019c1c8,0x001bc54c,0x001b081d,0x001af845, -0x001af90a,0x001a5310,0x001c0c91,0x0016a5a5,0x00133505,0x000e8b26,0x000927f2,0x000244cd,0xfffa93ab,0xfff765ac,0xfff42e47,0xfff2200d,0xffeeef8e,0x00063fa6,0x00028d29,0x0004ebaa,0x000b515f,0x0019731f,0x000367af,0x000c2ff4,0x00193271,0x001c2f89,0x001e2136,0x001ff13a,0x0021dae4, -0x0023c213,0x0025747f,0x0013dff9,0x000dd6bb,0x002490e9,0x00164f82,0x00124871,0x0015610d,0x0015e45f,0x00160f24,0x0016c7ca,0x00172023,0x00176c49,0x00183c13,0x0015476b,0x0012c54c,0x001029ce,0x000d916a,0x000b85b3,0x000910ef,0x0009342c,0x00086873,0x000752ea,0x00062db9,0x0013d7d9, -0x00050736,0x0006d130,0x000cbd1c,0x0001a691,0xfff1c3a4,0xffdd7041,0x000540b5,0xfff4fff4,0xffe51b3e,0xffe3e1af,0xffe3a8af,0xffe342a4,0xffdf0c52,0xffddf045,0xffe2904d,0xffefb754,0xffff77b8,0xffde6117,0xfff0f9bb,0xfffe1901,0x0006efec,0x000407b4,0x000629bd,0x0006bcb6,0x000378f8, -0x0003d3db,0x00066133,0x00088450,0x0008cf7a,0x00072b77,0x0007298a,0x00083a94,0x000bc119,0x000c0883,0x000af5e6,0x0003e3f2,0x00086003,0x000916d5,0x000dedd1,0xffee091f,0x00038a4d,0xfff91753,0xfff84f0e,0xffffef78,0x0002aa52,0x00055ad7,0x000254bd,0xfffa7ba3,0xfff3664f,0xfff1fdf0, -0x00013b2a,0xffedf972,0xfff14224,0x0002bdee,0xfffbb63f,0xffea8719,0x00024269,0x00070c60,0x0006c8d4,0x0005a2a7,0xfff8b4e4,0xfff7af41,0x0000c580,0x000aa84a,0x000f0235,0x000a5e6b,0x000a685c,0x000d79d3,0x0017149e,0x0016351d,0x00106edc,0xfffdbd24,0x0007bc2e,0x00140f09,0x0015594f, -0x0004c551,0xffffa5d7,0xfff52eb6,0xfffb2d88,0xfffd86d8,0x00007f09,0xfffd08b1,0xfffeffd2,0xfffe0bad,0xffffa932,0xfff84049,0x0000ec7c,0xffef5478,0xffea9c6c,0xfffdd1d8,0xfff4b456,0xfff355f6,0xfff6e241,0x00098ad1,0x0008f0a9,0x000e4897,0xfff91231,0xfffb2e65,0x000b9c98,0x0019fd48, -0x001bbf10,0x000e3192,0x0010e2c9,0x0019993c,0x002f75d8,0x002b9c9e,0x00230270,0x00015d19,0x0014d4e9,0x000d3661,0x000d2ec0,0xfffefb20,0xfffbac64,0xfff68c8e,0x00004879,0x0000637d,0x000034e6,0x0000b43f,0x0000b9f9,0x000089a0,0x00012191,0x0002818d,0x00013e88,0x0004055b,0xfffa595a, -0xfff91354,0xfff4f9a4,0xffed614a,0xfff54408,0x000d29a9,0x000cb3f8,0x000694fa,0xffd9bb22,0xffd19593,0xfff0a6c0,0x00146101,0x00236406,0x000caff7,0x0013cd3e,0x00219deb,0x0042c908,0x0037b22f,0x001bc9ae,0xffe4a0c6,0xffff7072,0x005d967b,0x002d374b,0x001fa592,0x0010e2e9,0x0003f28c, -0x00007df5,0xffffb35b,0xffffd322,0xffffb3e0,0xffff9af3,0xffffbfa3,0xffff430a,0xffff16b7,0xfffecdf0,0xffff62c9,0x0001c753,0x0009b4bd,0x0003c2e7,0xffe7583d,0xffe7194d,0xfff3834d,0xfffb3a06,0x002548f4,0x0058e4e3,0x007be91c,0x0077d087,0x0053359a,0x002c2297,0x0022bf0f,0x001f7d80, -0x002e85e9,0x00513d1e,0x003fcc71,0x005718e8,0x008c06c3,0x00709454,0x00208611,0x0027c22e,0x000c7440,0x000a6412,0x000316ca,0xfffec101,0x00005590,0x00004930,0x00002690,0x00004e0f,0x000030a5,0x00006bc5,0x000088f0,0x00009a7d,0x00006958,0xfffea9e2,0xfffd113f,0x0000e60d,0xfff7291d, -0xfff6912c,0x0013d739,0x001c4cc0,0x001eb5a6,0xfff22989,0xffc779ae,0xffb05010,0xffd4f7d3,0x00114a26,0x004fa440,0x0026029d,0xfffc42ac,0xffdde7c6,0xffbf7379,0xffcdefdf,0xfff470e3,0x000dc385,0x00478cd3,0x006edbda,0x0055df03,0x000d9f27,0xfff51539,0x000550ce,0xfffd7470,0x000094b3, -0xffff501b,0xffffe244,0xffffa931,0xffffb7c2,0xffff805b,0xffffa9b2,0xffff813f,0x0000d236,0x0000d6f9,0x000614a6,0x000ccd23,0x001aeb98,0x00153dad,0x000eb77f,0x0014966a,0x003cebc0,0x006c2534,0x009560e3,0x0053e015,0x000b7cea,0xffbf9289,0x002637ba,0x00769fb8,0x0087e326,0x00ad0872, -0x007d9d5d,0x00047e4d,0x001e2203,0xffab7b46,0xfefc7092,0xffad8924,0xfff70a95,0xffeff936,0x00036f2b,0xffff9611,0x0001246e,0x000048ef,0x0000a0d9,0x000056fa,0x00008599,0x0000825d,0x0000ae30,0x00000c48,0x0001229d,0xfffc8ef3,0xfff8f385,0xfff81790,0xfff9c1b2,0xfffb3b13,0xfffc25e3, -0xfff61bd5,0xffeb4442,0xffddd3b2,0xffde624c,0xffe285ec,0x000a857e,0x002aa280,0x00671265,0x0041c901,0xffcb563c,0xffd053e7,0xffe92977,0x000b737d,0x00024896,0x0028aa5c,0x0049985c,0x0031a22b,0x002980a8,0x0012fe1f,0xfffe145b,0xfffdd442,0xffff4391,0xfffe96c0,0xffff2d4f,0xffff2132, -0xffff2a82,0xfffef422,0xfffef086,0xffff8a78,0xfffe445a,0x000239ac,0x0015db23,0x0024a22d,0x002f58e5,0x002bd158,0x00226f98,0x001d52c8,0x0010c94a,0x000bd2b6,0x000a53fb,0xfffe3d51,0xfff3bfec,0xfff0a280,0xffea9678,0xfff78fab,0x0012cd35,0x000e78c2,0x00009514,0xfffe5b63,0xfffb4348, -0x00335a18,0x002ff028,0x000ef9fb,0x00117d89,0x0008c18f,0x0007c085,0x00029350,0x0002dd19,0x000272c9,0x0001f294,0x0001b0cb,0x0001c7d5,0x00023351,0x000246e6,0x00015a37,0x000236fc,0x00088d90,0x000cb868,0x000a92e9,0x000476d6,0x0003e78b,0x0000a8ba,0xfffa7f86,0xfff4ef56,0xffec5264, -0xffe1ef47,0xffe6f8c0,0xffe6d294,0xffe1cf2d,0xffe6eeef,0xfff0d847,0x0007b552,0x000f429b,0x001d0143,0x00294f45,0x00323911,0xfff5aaf5,0xffedef3b,0xffea3710,0xffed4b93,0xffe85b49,0xffeecc26,0xfff45aa0,0xfff98ab5,0xfffa6863,0xfffbf8c0,0xfffc3d8f,0xfffc072e,0xfffa6f51,0xfffa7ea1, -0xfffacf30,0xfffe2365,0x00017f0c,0x0004b14f,0x0008ebec,0x00111aca,0x0010233c,0x000d3a67,0x000b8a67,0x000cfdad,0x000ed450,0x000f9e64,0x000be0d5,0x0008294d,0x00047f4e,0x0003fb58,0x00020298,0xffffd512,0xfffe072b,0xfffb6b4c,0xfff7ae6b,0xfff3d132,0xfff4f19e,0xffefcc8b,0xffe73998, -0xfff3d6aa,0xfff52d09,0xfff5f14e,0xfff8b21f,0xfffa0614,0xfffd3239,0x000066f4,0x000275c7,0x000704c6,0x000ada6c,0x000e9c3e,0x00109750,0x0012e474,0x0018bf2b,0x001a52fd,0x00185890,0x001cd3dd,0x001a226c,0x001b4c9a,0x001b129b,0x001ae9de,0x001a3530,0x001ac76a,0x0018c37a,0x00185ead, -0x0017f947,0x00169faa,0x001524d3,0x0013a705,0x000d3d37,0x000746d0,0x00024319,0xfffc1c5b,0x001023cf,0x000f0577,0x000eccb0,0x0008802c,0x00001009,0x00117cf6,0x000b2231,0x00048b00,0x00062601,0x000751a2,0x0008623d,0x00091a0b,0x00096332,0x0009d78f,0x00144dde,0x001bb173,0x000b3d3a, -0x0015c611,0x001c40cf,0x001cf7ff,0x001caf0f,0x001d45fb,0x001d4f4a,0x001d961b,0x001dbff2,0x001dfb3f,0x001d2cb5,0x001c3039,0x001b099f,0x001a3467,0x001980e6,0x0019a64f,0x0017943c,0x0015f4c4,0x0013ce0a,0x00123b2d,0x00209947,0xffe8e67d,0xffef3ea7,0xffe73799,0xfff7ce5e,0x0005bcd5, -0x0010ae14,0xffef3fb9,0x00027fb5,0x00110832,0x0010fd9a,0x000fb1de,0x000eabb0,0x000c08f7,0x000cf9c1,0x001259b8,0xffffba2a,0xffeeb728,0x0013bd79,0x0002fa83,0xfff5d5b7,0xffe39fcd,0xffeaf0a0,0xffe9063d,0xffe8bb04,0xffe5b9a5,0xffe64867,0xffe98dae,0xffec2173,0xffec1f50,0xffe8998b, -0xffe9273f,0xffea0521,0xffed95ba,0xffed930e,0xffedfe8d,0xffec43f9,0xffeddf49,0xffeef460,0xffeb98dd,0x000ae056,0xffed5a25,0xfff6f074,0xfff752be,0xfff3e50c,0xfffbaeb5,0xfff45b97,0xfff3bec7,0xfff28efc,0xffe6b994,0xffe5aa1a,0xfff2ff77,0xffec8daf,0xffed34c5,0xfff7f70e,0xffef9670, -0x000388eb,0xffe4dadf,0xffe5c0b9,0xffe2ce00,0xffdcc202,0xffd0bfa5,0xffd10f21,0xffdcffe6,0xffe8daac,0xffec6dac,0xffe2ab0a,0xffe42849,0xffe760bf,0xfff240a0,0xfff0e7c4,0xffefafff,0xffe990d1,0xffef1435,0xfff64f4b,0xfff6a3a9,0xfffe7123,0xfff51e7e,0xfff7d78d,0xfff880a9,0xfffe2e29, -0x00020e5c,0x00011474,0x000188aa,0x00023fb0,0x00024dbc,0xffff4f92,0x0001d844,0xfff5d20c,0xffe9c00d,0xfffa41fb,0xffefcc9c,0xfff2fa46,0xffe3f7e6,0xffe16ae0,0xffe09098,0xffdbd1df,0xffc81d89,0xffcba5bd,0xffe1899e,0xfff20c43,0xfff25797,0xffda7488,0xffe059a8,0xffe79cfc,0xffff1f10, -0xfffb68fa,0xfffc3f74,0xffef5268,0xfffc0811,0xfff300ee,0xfff592d9,0xfffdaf68,0xfff2b67a,0xfff7e50b,0xffff86f8,0x00013e63,0xffff3877,0xffffba8c,0xffffb26a,0xffff52c5,0x00000426,0x0000b04e,0xffffb3dc,0x000523a7,0xfffc605f,0xfffc89dc,0xffed82b1,0xfff1eb99,0xffe2268a,0xffde055f, -0xffd76d39,0xffbed784,0xff945937,0xff916459,0xffbc13f2,0xffe632f7,0xfff16d92,0xffcb9d4a,0xffd6b93d,0xffe871a1,0x000cd476,0x00046b7e,0xfff7af09,0xffde2b9c,0xfff2f079,0x0015b3c4,0x000f9512,0x00213437,0x000bdf95,0x00053070,0xffffe85b,0xffffcf54,0x00000494,0x00003963,0x00000409, -0x0000508c,0xffffae29,0x000005a8,0xffff15c2,0xffff84be,0xffff0ccb,0x000a2de0,0xfffc6d46,0xffeee9fa,0xffdbeeec,0xffc87a3b,0xffe00959,0x00056458,0x004cd398,0x006b11c8,0x005c34e2,0x0029fd9f,0xffff1bb7,0xfff5f9f8,0xffec6d94,0xfff03234,0x000644fd,0x0003c57e,0x001fbcdf,0x005623c7, -0x003347af,0x000e387b,0x001161b1,0x0009aa1f,0x00050c7d,0xffffb6a2,0xffff17d9,0x000077d5,0x0000047e,0xfffff568,0xfffffe35,0xfffff495,0x00001896,0x00003c95,0x00003180,0x0000e45b,0xffff104a,0xfffd9f4c,0xffffd320,0x00037afd,0xfff29680,0xfff20c4d,0xfff10ffb,0xffdb026a,0xffc4230b, -0xffb00310,0xffb2174a,0xffe52e05,0x001b48af,0x00432085,0x0019a6f1,0xfff3295b,0xffdaf126,0xffc02330,0xffd2e651,0x0002eaa5,0x000fa9ac,0x003db77b,0x00670e3f,0x00592f99,0x000b2f7b,0xfffacc58,0x000300f5,0xfffe59aa,0x000059b8,0xffffb5f2,0x00000817,0xffffef26,0xffffd985,0xffffda82, -0xffff8eaf,0xfffff1c7,0xffff49f3,0x00035714,0xfffde13e,0x0005d85f,0x000c55b2,0x0006a6f2,0x000f84ad,0x0013cd97,0x0023119f,0x003198ad,0x003d38d1,0xfff3227a,0xffba2dde,0xff9471fd,0xffede94e,0x00240bfd,0x001af68a,0x003a196c,0x00140386,0xffac8ba5,0xffff84e2,0xff8ea45f,0xff020dc6, -0xffb11635,0xfff67091,0xfffbc85d,0x0000bfef,0x0000b57d,0x000056bb,0x000040b0,0x00002310,0x000023e8,0x00003bb8,0x00005979,0x00006b32,0x00006a9b,0x00005398,0xffffb1fc,0xfff50515,0xfff87faf,0xffee114d,0xffddc57a,0xffd8423a,0xffccf2a1,0xffc83e8b,0xffc4cd6e,0xffd08b72,0xffd47af5, -0xffff4470,0x0029d455,0x0053b390,0x0021f18f,0xff9b9781,0xff95c240,0xff9f942f,0xffa3d87d,0xffd12bcf,0xffd0fee6,0x0017a040,0x0031ef0b,0x0015fe3b,0x000e5329,0xfffad12e,0xffffdf8a,0xfffec99c,0xffffa6cf,0xffff9ee5,0xffffc4d6,0xffff7b2f,0xffff6666,0xffff1d16,0xffff699b,0xfffefd71, -0xffff718c,0x000e53b3,0x0023924e,0x002439f7,0x0023549e,0x00217d3a,0x0016b8e7,0x0009b934,0xfffd1867,0xfff071dd,0xffe36bf6,0xffd4ce35,0xffc92572,0xffc727d1,0xffcfd57a,0xffdb4292,0xffccda7c,0xffba6e03,0xffae046d,0xffb46138,0x0014df1b,0x00222a00,0x002424cb,0x00131ff2,0x000c7c9b, -0x0004e813,0x0002773b,0x0001be9b,0x0000f6ca,0x00009636,0x0000602a,0x00010972,0x000128da,0x0001cf7c,0x00018585,0x0001a145,0x000529d3,0x000c5349,0x000c4335,0x00087bc9,0xfffd734f,0xfff3843f,0xffeb9ed9,0xffe577d3,0xffdddf3b,0xffd3caef,0xffda2b93,0xffde02fc,0xffdf47f1,0xffdf4cbe, -0xffdc7449,0xffdc57fc,0xffebff13,0xffff0903,0x000d8280,0x001aa04e,0xffe624f4,0xffe88aa7,0xffed357b,0xffebb879,0xffef0d0e,0xfff2a0d2,0xfff7e9a0,0xfffd25de,0xfffe9015,0xffffa3e7,0x000019c0,0xfffe6e77,0xfffddf18,0xfffc51a8,0xfffb2fdc,0xfffb193e,0xffff0750,0x0000c7a4,0x0005ce09, -0x0005dc0b,0x0000d2a4,0x0002c216,0x00019628,0x0002699b,0x0002e91b,0x000345a4,0xfffbf123,0xfff4d17d,0xffeea179,0xffeb6440,0xffe9af0e,0xffe549d4,0xffe8929b,0xffe83fbc,0xffe69998,0xffe65ebf,0xffe9b098,0xffe4ded0,0xfff3d881,0xffead091,0xfff16ab7,0xfff34f8e,0xfff05f05,0xfff1f951, -0xfff180c2,0xfff4ce5b,0xfff94085,0xfffa97eb,0xfffd31fb,0x0000e3dc,0x0008e27a,0x000bea02,0x000ca563,0x001023df,0x001a797c,0x00157d85,0x0016691c,0x0015e917,0x00155ed6,0x00154f53,0x0014bd07,0x0015d5a9,0x000ff157,0x000bd941,0x00074aa5,0x000219c8,0xfffc35a0,0xfff61fb1,0xfff33aa5, -0xfff10398,0xffefeedf,0xffed4e03,0x0000976d,0xfffcad46,0x00071cd2,0x000f1e15,0x0017c0a6,0x00036ee9,0x000f60cd,0x00182ede,0x001af4c1,0x001c757a,0x001de2c4,0x00201f53,0x00228d1b,0x0023fa92,0x00183470,0x000d93df,0x0024fc1d,0x001a7960,0x0013285d,0x000cdbf9,0x000f02eb,0x000ea393, -0x000f0cf4,0x000f203a,0x000f14bd,0x000fa340,0x000d03f2,0x000ae218,0x00089949,0x0006898e,0x0004dd99,0x0002e43f,0x000318d3,0x00024b6b,0x0001123f,0x0000417a,0x000c4a17,0xfffda03f,0x00004741,0x00063837,0xfff0fa1d,0xffe4def0,0xffe1d59b,0xfff60ca5,0xffe88e45,0xffe7524a,0xffe4870c, -0xffe4694c,0xffe52474,0xffe0877e,0xffe038ed,0xffe63f6c,0xffe5001d,0xfff1b20c,0xffe32bb2,0xffe50f75,0xffee735e,0x000128fe,0xfffd2285,0xfffe45d0,0xfffdd206,0xfffba2ac,0xfffc2772,0xfffe8bc2,0x00014849,0x00015b0b,0xfffd5cbf,0xffff4538,0x00007c6e,0x0004bfb6,0x000286ea,0x00016e32, -0xfffcb2ec,0x0000f821,0x00038bc7,0x0001988d,0xffe54549,0xfffb4927,0xfff20db5,0xfff1cd06,0xfffa38d2,0x0001050a,0x00014ab4,0xfffcef05,0xfff7d8bf,0xfff16015,0xfff0495c,0xfffa4c90,0xffea43a7,0xffed119f,0xfff8864f,0xfff6335b,0xffe47ca4,0xfff77289,0xfffdfe54,0xfff99c4b,0xfff69612, -0xffed5dd0,0xffeed05f,0xfff836a3,0x0003d412,0x00060754,0xfffa5467,0xfffeff19,0x0002905f,0x000d61f2,0x00062127,0x0001301a,0xfff5e9e7,0xffff6110,0x000efa92,0x00079c71,0xfff62413,0xfff7bc3d,0xfff25964,0xfff85682,0xfffd7db3,0x00018b1f,0xfffe8495,0x00014a40,0x0000fb75,0x00039569, -0x00003b8d,0x0002643a,0xfff854ad,0xfff0b1a8,0xfff83dfd,0xfff1bae1,0xffeac9f6,0xffedae21,0x000041d6,0xfffa193a,0xfff9cbe7,0xffe9fca1,0xffee3ba9,0xfffe2bf2,0x000faf55,0x000fc5e5,0xfff68b51,0x0002ed95,0x000acc64,0x0023edc7,0x001284ca,0x000cb6e8,0xfff88c9f,0x0009ce7d,0x000c7fa6, -0x0000ad7f,0xfff36b48,0xfff97bed,0xfff9c8b3,0x000237e4,0x0000d546,0xffffcca4,0x00002507,0xffffc9d7,0xffff6b4e,0xffff1140,0xffffeff5,0xffff9954,0x0003fab0,0x00014de5,0xfffa6d21,0xfff63df4,0xffe7839c,0xffea7fb9,0xfffde05a,0xfff15b5a,0xffe21fc8,0xffc01fcf,0xffc15275,0xffe41c55, -0x000cc1fb,0x0012b304,0xffe99187,0xfffc25d2,0x000df020,0x00318347,0x00139206,0xfffcc809,0xffdec86e,0xfff86f88,0x00410b79,0x001724c8,0x00086204,0x0005ffde,0xfffe51c6,0x0000c633,0xfffeff4f,0x000038dc,0xffffe7d2,0x000017b9,0x00004720,0x00004cfc,0x00001dc8,0xffffd93c,0xfffe6380, -0xffffa5cf,0x0003a3cb,0x0007f0f7,0xffeac4cf,0xffe55a99,0xfff9dd76,0x0008245c,0x00352ec9,0x00664bd0,0x007eb768,0x006b7acc,0x004c66c6,0x002ff9a9,0x002d2d5a,0x002634e8,0x00290e9d,0x00364058,0x003272ea,0x00494057,0x00762f96,0x004e0732,0x002e9ba3,0x0021d224,0x0006e435,0x00096125, -0xfffefdff,0x000088eb,0x00001160,0x00003f42,0xffffe62c,0x00000b36,0xffffd50c,0xffffedf6,0xffffe3bf,0x000053c2,0x00007616,0x0000da8c,0xfffc89ac,0x0001b462,0xfffdbaf1,0xfff9a522,0x00085352,0x0001abee,0xfff9e490,0xffd8dcb3,0xffbff1e5,0xffbb92d1,0xffe91af7,0x0019358c,0x003bf7c8, -0x001c065c,0xfff654a8,0xffd4e6c0,0xffc58e7a,0xffda9b3d,0x000867a8,0x001ef57a,0x00368041,0x006148b7,0x004c8e94,0x000940ba,0xfffaa78a,0x00021931,0xfffe983b,0x00005021,0xffffc46c,0x00001576,0xfffffe79,0x00000dfe,0xffffef34,0xffffd538,0xffff72aa,0xffffe7a5,0x00009766,0x00021d8e, -0x00005d3f,0x001168dd,0x00192fa8,0x0018afa0,0x001ec63f,0x00444217,0x005df3d0,0x0063d777,0x002126c2,0xffea45b3,0xffc1868b,0x00256871,0x0062e27b,0x0053d3e2,0x006af7a4,0x00371f4e,0xffccd749,0x000319c7,0xffb1a403,0xff084534,0xffafeea4,0x00001046,0xfffeb63b,0x00012f2c,0x000072b2, -0x00004e45,0x000013f3,0x000008f4,0x0000047c,0x00000cb2,0x00001ddc,0x00005a73,0x00007526,0x000076eb,0x00005d1c,0xfff8a5b9,0xffede852,0xffebab37,0xffec3acb,0xffea20af,0xffe40781,0xffdb290e,0xffd33fb8,0xffd84cd0,0xffdb1e40,0x00047b3b,0x003391ff,0x004650f5,0x0015cc7d,0xffac8c15, -0xffc7a9d9,0xffe79382,0xfff91c94,0xfffcf512,0xfffad0dc,0xfff3a6e4,0xfff3acd0,0x0003b918,0x000622d9,0xfffb7b30,0xffffff28,0xffff080a,0xffffffa6,0xffffdd4b,0xfffff459,0xffffd7a1,0xffffc059,0xffff561e,0xffff3585,0xffff1b67,0xfffe7976,0x000a912f,0x0016c34f,0x0024d546,0x00247042, -0x001d64ea,0x0019174a,0x0009c0f5,0x0000c279,0xfff9ca75,0xfff1bfcd,0xffe63d6b,0xffe0813d,0xffe2e277,0xfff194d7,0x000576d0,0xfff81629,0xffe5c2e0,0xffde8116,0xffe3c3ff,0x002a5e92,0x002587a2,0x0012596d,0x000f29a5,0x0009153a,0x00039077,0x000275c0,0x0000e570,0x00005ee7,0xfffffaf2, -0x000027be,0x00003c69,0x00008c53,0x000130df,0x0001f56b,0x0001939a,0x0003b2d7,0x000bcfe8,0x000e14e9,0x000af40a,0x000827dd,0x0002503f,0xfffaa7e6,0xfff3a679,0xffeaca74,0xffdf4522,0xffe40516,0xffe59a6f,0xffe36767,0xffe6c884,0xffed8a1b,0x0000dd59,0x000a3feb,0x00185b43,0x0021e66f, -0x00293432,0xfff8faa0,0xfff1ea20,0xffeb5eb7,0xffefc9d6,0xffed4cc0,0xfff4e30c,0xfffa311c,0xffff2246,0xffffabdf,0x0000efda,0x00001426,0x00000c2f,0xfffef3a6,0xfffe1695,0xfffac915,0xfffb0a7c,0xfffc252f,0xfffd7490,0xfffed0c6,0x00083407,0x00082e07,0x0004a4fc,0x00032c44,0x0002416f, -0x0001fdae,0x0000bb0e,0xfffe7fe2,0xfffb92e0,0xfff9437f,0xfffa824b,0xfffb1fb0,0xfffa7c8e,0xfffa3d6a,0xfff8db08,0xfff806db,0xfff55039,0xfff1e1be,0xffec6a08,0xffe4af21,0xffefffd3,0xffee8fe7,0xffefb09c,0xfff2748b,0xfff377a8,0xfff68185,0xfff7946b,0xfff88daa,0xfffb995b,0xfffe5030, -0x00008d51,0x0003b614,0x00080efd,0x000cf28c,0x00123a77,0x0012810c,0x001a032f,0x0017aa49,0x0017655f,0x0016dd0a,0x00160599,0x0015131e,0x0014dc04,0x00131b8c,0x00122c02,0x0010a864,0x000dff76,0x000af973,0x00083e9a,0x0003ced2,0xffff8dbf,0xfffc1a21,0xfff6e43e,0x00078959,0x000797f2, -0x00012b94,0xfffc4b4c,0xfffc8a11,0x0003cda1,0xfffe506d,0xfffdbd8f,0xfffea8da,0xffffe480,0x00016988,0x0002267f,0x00031682,0x00041248,0x0005aa4e,0x000c5e18,0x000706f1,0x0008b356,0x000e77ca,0x00156c2f,0x0013e9de,0x0014525f,0x00142ddc,0x00143e7f,0x0014390d,0x0014459c,0x00130a7a, -0x0011c73c,0x00109973,0x000fb84a,0x000f025b,0x000e83ba,0x000d1bc1,0x000bbc53,0x000a0d0c,0x0008eb89,0x00140c08,0xfff45318,0xfff8753e,0xfff2e5ff,0x00038468,0x0007f7a7,0x00010e02,0xfffd7dc8,0x00061d57,0x000732a1,0x000591e6,0x00041ae6,0x0002dc27,0xffff041a,0xfffeea6a,0x00030d95, -0x0003e779,0xfffd41db,0x0001fdb0,0x00057b6f,0x00017136,0xfff03681,0xfff4e915,0xfff4413a,0xfff322a3,0xfff1b2ef,0xfff28c0e,0xfff57e7a,0xfff8008d,0xfff7b670,0xfff27ee3,0xfff59e33,0xfff73768,0xfffb88b2,0xfffa1c6e,0xfff97ff7,0xfff5d4c5,0xfff86090,0xfff8657a,0xfff8c240,0x00076af8, -0xfff7cb4e,0xfffda6fd,0xfffa18fe,0xfffa15f7,0x0003a19b,0xfffcfdf3,0xfffd872c,0xfffcfe6f,0xfff5aa3b,0xfff2f641,0xfffac008,0xfff1cf7a,0xfff23394,0xfffea2ba,0xfff79ab4,0x0000c8b4,0xfff1fb90,0xfff0c106,0xffef58fa,0xffe8750d,0xffe12f15,0xffe2cde9,0xffed44a0,0xfff8a5c5,0xfffa7846, -0xffecc2c7,0xfff452ae,0xfff9d41a,0x0005ab39,0x00015991,0xfffd5b21,0xfff30e0f,0xfff9f1fc,0xfffefe7a,0xfffe5cf7,0x000620dc,0xfffc8488,0xfffac4e0,0xfffb97d8,0x00002d2f,0x0000fc07,0x0000253f,0x000098ba,0x0000cb5c,0x0002333c,0x0001745a,0x000217a1,0xfffe92bf,0xfff5f095,0xfffb3633, -0xfff5a4ff,0xfff998fb,0xffee5971,0xffeeb777,0xffee57f8,0xffe840a8,0xffdcd703,0xffe1fd88,0xfff56642,0x000486f6,0x00032ecf,0xffe4b6e2,0xfff70de6,0x0001522b,0x001a4a2e,0x001009ef,0x000b0db1,0xfff66d6a,0x0005607e,0xfffb4e0c,0xfffc3265,0x00027fc6,0xfff956b1,0xfffd514f,0x0001464e, -0x000053d1,0xffff5fb7,0xfffffe23,0xffffd391,0xffffa15c,0xffff49de,0xffffbf3b,0xfffeeb60,0x00021959,0x000169c6,0xfffeeed0,0xfff38c00,0xfff44e7b,0xffe8a191,0xffe93115,0xffe3ed19,0xffcc3ac3,0xffb1322e,0xffb50274,0xffdad25a,0x000171a1,0x0003620c,0xffd3b7e3,0xfff00035,0x00094d33, -0x002e7436,0x001c71d5,0x0006693c,0xffe51325,0xfffc6150,0x001913f7,0x001b337c,0x001fc597,0x000808d5,0x00015597,0xffff7240,0xffffdaea,0x00003a99,0x00000fd7,0x000009da,0x000039a3,0x00003218,0x00004443,0x00001912,0xffff89f3,0xfffe574c,0x00038332,0x0003dd8d,0xfffc6ac4,0xfff0de8b, -0xffe937c8,0xfffcb546,0x00186d3b,0x005782f0,0x0067eb2e,0x004767c9,0x00260c32,0x000c9e26,0x000e0c38,0x000c4172,0x00111b7b,0x001fa96f,0x00241719,0x0037e7e7,0x005acbd3,0x00329040,0x000e8434,0x0014997c,0x0015389a,0x0005299f,0xfffe67e1,0x000088b3,0xfffffda0,0xfffffa27,0xffffe8c7, -0xfffffcbc,0xffffe4a6,0xffffe5d4,0xffffed14,0xffffee23,0x00006a41,0x00009902,0xfffe44ec,0x00002281,0x0007929c,0xfffe3afe,0xfffa94f1,0xfff6f5b5,0xffe43874,0xffc85940,0xffba5697,0xffc65b0a,0xfff59055,0x001d0ec3,0x002eb5b0,0x001531d3,0xfff9d294,0xffe2a9f3,0xffdc8296,0xffee767e, -0x000e8717,0x0019f649,0x00318779,0x005562b2,0x004619bf,0x00045655,0xfffd3641,0x000112cd,0xffff45c9,0x00004d6d,0xfffff232,0x0000140a,0x00000c71,0x000004b9,0x000012b8,0xffffcf4d,0x00000651,0xfffef0f2,0x0001ed75,0xfffe5dcb,0x00048a0d,0x000c904f,0x000d9b6b,0x001b0d99,0x00215033, -0x003e2c4d,0x00492514,0x0040910b,0xfffcad61,0xffcca08c,0xffb6ad49,0x0007b370,0x003d9c5d,0x003bde6f,0x00544bd5,0x0029a35c,0xffcfdcc0,0x00033b58,0xffc285d8,0xff281ea0,0xffb64898,0x000174cb,0x000082e3,0x00005d86,0x00005104,0xffffe318,0xfffff581,0xffffea2e,0xfffff838,0xfffff9c3, -0x000018d1,0x00001071,0x00008fda,0xffffe003,0x0001f6f5,0xfff8e8e6,0xfff22f7b,0xffe7a9c1,0xffe05d34,0xffe10567,0xffda9f4d,0xffd998f1,0xffd83743,0xffe1cc4e,0xffeb2119,0x0016a5ab,0x004bf41b,0x004844b7,0x000f9593,0xffa25c0e,0xffd21fb8,0xfff5f1a2,0x00021d1e,0x000c2756,0xfffb1001, -0xffef273c,0xfff72485,0xfffc23a8,0x00034ab9,0xfffc750a,0x0000c48a,0xffff9597,0x000064b4,0x000004a6,0x0000227c,0xfffff026,0xffffdee4,0xffffac7e,0xffff5110,0xffff950b,0xfffd47e7,0x00074274,0x001b1c59,0x0021755c,0x001fe161,0x001e059a,0x00163636,0x000b52ef,0x0003038f,0xfffcb57f, -0xfff75b97,0xffed3f60,0xffe8501a,0xffe4a4a9,0xfff0fdf3,0xfffe1aea,0xfff87fde,0xffecd651,0xffe186e0,0xfff6105c,0x00232fbe,0x002f5ccd,0x00243a34,0x0014d4b6,0x00099e61,0x000076e2,0x0001777a,0xffff4c86,0xffffbd74,0xffff9b1d,0xffffcd8e,0x00000a65,0x000046d9,0x00009742,0x0001607b, -0x0001669a,0x00034246,0x000c8e9b,0x000f465e,0x000e0a02,0x0005ed5c,0xfffee920,0xfff79df4,0xfff5afe6,0xffef1374,0xffe32b86,0xffe4bc1a,0xffe317c4,0xffdfb188,0xffe1aeb0,0xffe4e535,0xfff1d85c,0xfff94ed6,0x000a22c8,0x001695d3,0x002456ae,0xfff3f0d5,0xfff5a1cf,0xfff8a209,0xfff7d079, -0xfff937fd,0xfffb79ec,0xfffe37a0,0x000236b6,0x00016785,0x00015e3c,0x0000dbf1,0x00004b0a,0xffffcdcf,0xffff3a56,0xfffd0496,0xfffb2816,0xfffd0c2c,0xfffda92a,0x0002f610,0x0004db20,0xfffe44ea,0xfffe78ef,0xfffb757a,0xfffa76f5,0xfff92bf1,0xfff7c73b,0xfff70c2b,0xfff65ddc,0xfff6696f, -0xfff6f7ac,0xfff7532f,0xfff5b101,0xfff74058,0xfff692a5,0xfff49c7a,0xfff47ba5,0xfff06ee1,0xffed4831,0xfff1273f,0xffeea9fb,0xfff1e22f,0xfff2bed0,0xfff1b160,0xfff376f0,0xfff43cd9,0xfff76e8e,0xfff9e154,0xfffb3ff5,0xfffbec29,0xfffddba2,0x0002acd0,0x0005d863,0x0009ca02,0x000c7f9e, -0x0015f558,0x00124201,0x0010d43c,0x0010c158,0x000fd8b8,0x000f4d35,0x000e7b7b,0x000e37bf,0x000a7048,0x0007cd14,0x000569fd,0x000286a3,0xffffc016,0xfffd323f,0xfffa4074,0xfff831b1,0xfff6e432,0xfff44b26,0x00003e6e,0xfffdee9e,0x0007b212,0x000aed8e,0x0009e588,0x0004d241,0x000aad62, -0x000a93df,0x000c5b6c,0x000d379e,0x000e394a,0x000fd8dd,0x0011c3d7,0x0012d743,0x00135844,0x000d7645,0x0015f586,0x00159a7b,0x0011ac27,0x00090f2f,0x000ae63a,0x000a6112,0x000a3d57,0x000a1185,0x0009c67f,0x0009cf8e,0x00087a57,0x0007528c,0x000609fb,0x00051895,0x0004500a,0x0003b1ac, -0x00034792,0x00026e19,0x00012c89,0x00008693,0x00094442,0xfff36a3d,0xfff76fd3,0xfff7f200,0xffec3e69,0xffebaf00,0xfff67775,0xffedfcc8,0xffed72e8,0xfff8fbd8,0xfff5b56a,0xfff4e085,0xfff528bd,0xfff1074e,0xfff1850c,0xfff71b16,0xffeb30aa,0xffec54a0,0xfff81233,0xffeb8e23,0xffead99d, -0xfff4c1ff,0xfff3dcc8,0xfff33dea,0xfff1e643,0xfff114e9,0xfff1b604,0xfff3b4ab,0xfff64ed1,0xfff60d79,0xfff0d7ee,0xfff3e41d,0xfff53804,0xfff9b210,0xfff6612d,0xfff5d87c,0xfff45f18,0xfff70169,0xfffa32b2,0xfff3cb31,0xfff005c8,0xfff44967,0xfff258ff,0xfff20575,0xfff80574,0xfffff70c, -0xfffd38a5,0xfffaf863,0xfff9d15e,0xfff561c2,0xfff434c4,0xfff86b84,0xffee8b5e,0xffed7054,0xfff35941,0xfff3c800,0xffef0cdf,0xffecc4bb,0xfff0baf8,0xffea97e3,0xffe53e3c,0xffe0b6fb,0xffe3a57d,0xffebf6b0,0xfff6fd14,0xfff76787,0xffe87e07,0xffefcebb,0xfff3e192,0xffff3ee3,0xfff5dbe0, -0xfff33035,0xfff054f9,0xfff6ab09,0x0003555d,0xfff8df00,0xfff35835,0xfff59618,0xfff5f128,0xfffc173d,0x00006088,0x00014f48,0x00005ebe,0x0001ed3c,0x00021d53,0x00042912,0x00026c43,0x0002cd58,0x00011196,0xfffaacbc,0xfff7fbd2,0xfff2ca9d,0xffed0788,0xffe8490e,0xfff07470,0xffe8dd48, -0xffe2483e,0xffda45b8,0xffdf7229,0xffecf7f5,0xfffd2b8c,0xfffb1a13,0xffdd26b9,0xffeed8ac,0xfff62e46,0x000ff8a4,0xfffa337c,0xfff92235,0xfff40710,0xffff2204,0x000416dc,0xfff5cb0f,0xfff4482f,0xfff99c10,0xffff3aec,0x00025317,0x0000004a,0xffff7282,0xffffb3b5,0xffff4c10,0xfffeeaed, -0xfffe6027,0xfffef67d,0xfffee774,0x00002c0c,0x0002d462,0xfffeed93,0xfff8479a,0xffec6453,0xffe3dc4c,0xffe89992,0xffd6ab54,0xffbf79b6,0xffacbc58,0xffb4626b,0xffd483d9,0xfffa5475,0xfff8ea7f,0xffc8c548,0xffe1275f,0xfff5abf3,0x0019cf17,0xfff80a7b,0xffea8412,0xffe4aeef,0xfff730d7, -0x00135420,0x00056851,0x00050842,0x00028def,0xffffc322,0xffff7faf,0xffffa846,0x00005fa4,0x00002323,0x000058b4,0x00008aa7,0x0000bbd6,0x00007ce3,0x00008a02,0xffffa20f,0xffff019a,0x000071f3,0x00058fae,0xfff56ffb,0xffe82c60,0xfff3f6d7,0x00079c9c,0x002b8ec6,0x0058458b,0x00640068, -0x004651a3,0x0029d49f,0x0016738f,0x0017923c,0x0015311e,0x001081a9,0x000b00fd,0x00144788,0x00289494,0x004b3c6f,0x001fcc0d,0x00206fc1,0x000fb10e,0x00058450,0x0002e6a8,0xfffedad1,0x0000ea10,0xffffd836,0xffffff24,0xffffcabe,0xffffd9e5,0xffffa9a9,0xffffaa1d,0xffffaf91,0xffffdd1b, -0x000000af,0x0000fe69,0xfffe8c0b,0x00000fdc,0x0003139e,0xfffa00ed,0xfff3bb92,0xffe35051,0xffd0cab0,0xffbd502f,0xffb942fa,0xffca1d16,0xfff9a8a2,0x001c6145,0x0027c06f,0x00119ae2,0xfff4a944,0xffd79ab6,0xffd337d2,0xffe90bf9,0x00143361,0x001f2608,0x0027f8de,0x004903d4,0x0036c835, -0x0001d2fd,0xfffd520e,0x0000e2a2,0xffff66b8,0x000054cd,0x00000bc2,0x00003509,0x000038fe,0x00003c4e,0x00002fef,0x00000e7b,0xfffff0b5,0xffff7587,0x0000714f,0x0000acdb,0xfff9e589,0x0006dc10,0x00163be7,0x0020046c,0x00295111,0x00430d54,0x0044906b,0x002cc0a2,0xfff331c6,0xffd1642a, -0xffca733b,0x0017d4d6,0x003b2235,0x001cc8fe,0x0023c380,0xfff8530f,0xffb0c658,0xfff5858d,0xffb64922,0xff42f435,0xffbefc87,0x0003b447,0x00011bbb,0x00000e6c,0x000043b6,0xffffc0e6,0xffffd3ce,0xffffbccc,0xffffb679,0xffffbbba,0xffffdd38,0xffffe605,0x00005442,0xfffffac1,0x00015fe6, -0xfffcea3f,0xffed0c64,0xffe52b76,0xffe277f7,0xffddc112,0xffd73be3,0xffd3fe5e,0xffd3a327,0xffdcd44b,0xffe49fb3,0x0009bd57,0x003a5ec0,0x00258725,0xfff2708c,0xffa6eeab,0xffc4550c,0xffdd851d,0xffe0e36c,0xffe72970,0xffdef206,0xffb9095d,0xffd963fd,0xfff40b0b,0x000230e7,0xfffd9935, -0x0000980a,0x00000722,0x000088d1,0x000066a0,0x00008fc1,0x00006d25,0x0000345d,0x00001d34,0xffff8110,0xffffd7d6,0xfffdd459,0x000322a1,0x000f0031,0x001b4d7b,0x001c190c,0x0018e12f,0x0013ea1d,0x000644cb,0xfffa8dcb,0xffedab56,0xffe7be34,0xffdb9b52,0xffd48127,0xffd938f1,0xffe5d412, -0xfff0555e,0xffe5ea97,0xffda3e56,0xffd41d01,0xffe297d7,0x0017b87a,0x001aec65,0x001a0f59,0x000d7a62,0x00053de4,0x0000a0ec,0x0000b04d,0xfffed29f,0xffff5aa4,0xfffee657,0xfffeec00,0xffff1569,0xffff8d79,0xffffe593,0x00007763,0x0001a8f7,0x0000f130,0x000a1766,0x00104818,0x00104d48, -0x000a190b,0x00026c0a,0xfff9c7c9,0xfff2f616,0xffeb210e,0xffe031d7,0xffe32990,0xffe58ab8,0xffe64005,0xffe7f0b8,0xffe9f79a,0xfff36180,0xfffc1b6f,0x00089b76,0x000fd0a3,0x00168c4e,0xfff8bfeb,0xfff682fe,0xfff2015f,0xfff61dbc,0xfff82b54,0xfffc58ab,0x000056eb,0x0003092e,0x0001c105, -0x0002d114,0x00027ef0,0x000256eb,0x00011997,0x0000c7fa,0xffff4440,0xfffc5ee2,0xfffb92b0,0xfffa5dca,0xfff9c09f,0xfffe60f4,0xfffd413f,0xfffbc7eb,0xfffac729,0xfff8f2a0,0xfff7555b,0xfff52b4f,0xfff40332,0xfff1cc7a,0xfff071e8,0xfff1a12c,0xfff31613,0xfff2a9f5,0xfff45824,0xfff448ba, -0xfff51c13,0xfff56a9c,0xfff0e4b6,0xffece7a6,0xffecf6e7,0xffef92c6,0xffee832c,0xfff09639,0xfff26d12,0xfff4032a,0xfff65114,0xfff71018,0xfff7e424,0xfff9108b,0xfffa0b27,0xfffa81ef,0xfffcd389,0x000025fc,0x0002e6a7,0x0008d17a,0x000e46d2,0x00122827,0x0010ee9c,0x000f8752,0x000e929f, -0x000d513c,0x000c451d,0x000b90ff,0x00096ee5,0x00079ded,0x000518f8,0x0001b3ff,0xfffddd08,0xfffa305f,0xfff86bc6,0xfff6c6c4,0xfff59319,0xfff2ebca,0xfffdbb16,0xfffd81cb,0xfff99168,0xfffa036d,0x00012e23,0xfff9c471,0xfffa17fb,0xfffe8332,0xffff0ca5,0xffffe068,0x00014255,0x00024d9c, -0x00041545,0x0005c433,0x00000ce1,0x00009ace,0x000a7229,0x00038359,0x0003f399,0x0008d952,0x0007e840,0x0007bebf,0x0007857e,0x000754e5,0x00070e40,0x0006e89a,0x00056c32,0x000416c8,0x0002ec96,0x0001fa59,0x000140fb,0x00003c2f,0x00000229,0xffff51a8,0xfffe8bec,0xfffe0103,0x00047aa3, -0xfffd2093,0xffff2391,0xfffe6fac,0x000297c7,0xfffd6855,0xfff07ce0,0x0001a379,0xfffe0f6e,0xfff9da2a,0xfff71323,0xfff5eeb4,0xfff54eae,0xfff17cf9,0xfff010a2,0xfff2afa5,0xfffb70ff,0x00008e77,0xfff014dc,0xfffc4068,0x00010041,0xfffcc79c,0xfffca986,0xfffd1626,0xfffb9fbd,0xfffba7b4, -0xfffc7a2d,0xfffe5a6b,0x00005b15,0xffffe61a,0xfffa960a,0xfffe9ee7,0x00006014,0x0004bdcb,0x00020eb4,0x0000e1ff,0xfffcf9de,0xffffe50a,0xffffd217,0x0000d0bf,0xfffadfb1,0xfffe51a0,0xfffd4d11,0xfff97ca3,0xfffd8a79,0x0004f95e,0x00016c1e,0x00017c1e,0x0000d360,0xfffdb3bc,0xfffcb328, -0x000022a2,0xfff664ab,0xfff56280,0xfffe18f4,0xfffc9f6a,0xfff75908,0xfffb699e,0xfffa6971,0xfff8b1c3,0xfff32bcc,0xfff0f856,0xfff37ffe,0xfffa64ea,0x0003758d,0x00036724,0xfff546ad,0xfffecbe6,0x00047c90,0x000f8575,0x00088487,0x00037c1c,0xfff98c3b,0x00004d8a,0x00056d7c,0x00019a04, -0x0003afd0,0xfffe5551,0xfffb5798,0xfffebf82,0x00008e37,0xffff298d,0xffff4a0f,0xffffe8f0,0xfffff5f1,0x00012dc4,0x000115a2,0x000116d7,0x00018077,0xfffef25f,0xfffbb478,0xfff96762,0xfffa349a,0xfff62b76,0xfffb2fbb,0xfff8a3bf,0xfff35be4,0xfff033ed,0xfff5808e,0x00018ae7,0x000d4deb, -0x000a5876,0xffed73f7,0x00039898,0x000d9e32,0x00255f8a,0x0014c224,0x000dbc16,0xfffaff03,0x0007f4b0,0x0001a3dc,0xfffd76b4,0xffff7b7c,0xfffd276a,0x00005c1c,0x00011a91,0xffffbf31,0x00004231,0x00004606,0x00000757,0xffffe6de,0xffff8187,0xffff7b58,0xffff6a61,0xffff92e2,0x000122f6, -0x00009902,0xfffad17a,0xfff4b6ad,0xffef696f,0xfff4cf28,0xffed0152,0xffdb0097,0xffd0cee2,0xffd8e501,0xfff281fb,0x001046d2,0x000ad27f,0xffdc8bd1,0xfffc61f3,0x00158bc2,0x0037aead,0x001d699a,0x00061836,0xffeab5f4,0xfffea107,0x0018f6ac,0x00183a60,0x00106bc6,0x0002b189,0xffff3338, -0xffffd274,0xffffeb79,0xfffffe94,0xffffdd11,0x0000024a,0x000011b3,0x00003d95,0x00003a7c,0x00005b1d,0xfffffea5,0xffffabf2,0xffff5308,0x0004b9c8,0x0000b2ca,0xfffd7885,0x00062088,0x001334a9,0x00283149,0x00518765,0x0055ba9d,0x0030447b,0x001d604a,0x0013f555,0x001d5f0e,0x0023d80c, -0x0026444e,0x00250ce9,0x002f58b7,0x003c4aa6,0x004fb7c0,0x00279b10,0x00176adc,0x00126e36,0x000f5b55,0xffff1eed,0x000052ea,0x00002e58,0xfffff6a8,0x00000494,0xffffffb4,0xfffffdd4,0xffffed04,0xffffe478,0xffffd6ef,0xffffe608,0xffffdecc,0x00008cf2,0xffff9184,0xfffef21d,0x00034152, -0x000219a9,0xfffe8dcb,0xfff6c010,0xffeba887,0xffd1a956,0xffcce56b,0xffdf9835,0x00074f7c,0x00212072,0x00226402,0x00136e2f,0xfffe916b,0xffe6cb76,0xffef5bf9,0x000149bc,0x0019da62,0x0022fe35,0x0025f7c7,0x0041f725,0x002bd5b5,0xfffcda0e,0xffff221f,0x000062ff,0xffffce5f,0x00002917, -0x000005a5,0x000013b0,0x00001236,0x000015e7,0x00001c0b,0x00000bc4,0x00000ede,0xffffa03f,0x00001d0c,0x00007140,0x00012516,0x000ca312,0x0016c413,0x0023ea3c,0x002e22d6,0x004e7034,0x0053b5c8,0x003c3e89,0x0007d039,0xffe5d6d4,0xffdd589d,0x00203c74,0x004b8fc5,0x004b6c14,0x00538ddf, -0x0028eeeb,0xffe74e1d,0x000485e0,0xffdb6410,0xff6716d6,0xffc97599,0x00088d6f,0xffff932d,0x00002226,0xffffec41,0xffffd5e4,0xffffd421,0xffffdcec,0xffffdf80,0xffffe2a0,0xffffe81e,0xffffe767,0x00002785,0xfffffbc9,0x000115b6,0xfffec833,0xfff145e1,0xffe8507f,0xffe99afd,0xffeb7eb7, -0xffe8115e,0xffe858f9,0xffe75210,0xffec3c15,0xfffb1489,0x001eb0d4,0x004d1d7d,0x00288a92,0xfff7e6ab,0xffbc512e,0xfff945f0,0x0023d02a,0x0036cec0,0x00185c2b,0x001b5dd4,0xffcb91a3,0xffd2d27d,0xfff65251,0x0000fcb8,0xffff5998,0x00006ab6,0x00004196,0x00006dbb,0x000044b8,0x00004143, -0x000037df,0x00001cdd,0x00003927,0xffff9427,0x00003b72,0xfffdb5a8,0x000193e3,0x00121196,0x001d875f,0x001aadbf,0x0016af08,0x00112f10,0x00080530,0x000258ff,0xfffe6411,0xfffc875c,0xfff68d68,0xfff9e456,0xfff6bc2a,0x000498e6,0x0013817d,0x0018a86d,0x00166601,0x0011bfec,0x0027ec3c, -0x0022584b,0x002a07d7,0x001b8cc1,0x000f0eb6,0x000143a5,0xffffa8f4,0xffffd493,0xffff0ab3,0xffff3d5a,0xffff5d20,0xffff7663,0xffff96f4,0xffffa94a,0xffffd56d,0x00001cc5,0x000144c9,0x00006159,0x000958b1,0x000fa940,0x00103b56,0x000c947e,0x0008ebd7,0x000279a4,0x0001429b,0xfffadff7, -0xffef0ce2,0xffed6cc3,0xffe9d82c,0xffe55e8f,0xffe965b9,0xfff076c9,0x0002bc1a,0x0003480a,0x000e3817,0x001603f3,0x001df6ce,0x000168d9,0x0000faeb,0xfffe1cfd,0xffffbf6e,0xfffef5db,0xffffc31c,0x000195d2,0x0002075d,0x0001db7b,0x00016832,0x0001494f,0x0000f789,0x0000b810,0x00008684, -0xffffd0eb,0xfffde6a6,0xfffc970d,0xfffb6fdc,0xfffd3810,0x0000e5b4,0xfffcc08c,0xfffb7e6a,0xfff8e5fa,0xfff6e5dc,0xfff4f037,0xfff2b5c4,0xfff5b149,0xfff82b49,0xfffae6b8,0xfffe2104,0xfffff785,0x00011bbd,0x00012755,0x00008188,0xffffbc01,0x0000648f,0xfff7666f,0xfff5a12a,0xffefd337, -0xfff49d35,0xfff46988,0xfff55030,0xfff6f061,0xfff95dd8,0xfffb67e2,0xfffbbdd5,0xfffc5abb,0xfffd220d,0xfffddda4,0xfffe7d4f,0xfffe5596,0x000005d2,0x0004fe57,0x0007bc99,0x000d7d41,0x000d8631,0x000a9f73,0x000a786b,0x0009682d,0x000869a3,0x00077691,0x0006495a,0x0005299f,0x0004747c, -0x00041c6a,0x000350cc,0x0002e85a,0x0002d128,0x000063ba,0xfffe9356,0xfffccdbb,0xfffa70ee,0x000068cc,0x00002fc1,0x0002c7bf,0x0000aa88,0xfffaff11,0x0001d941,0xfffff7d0,0xfffb25ab,0xfffb99ab,0xfffcaadd,0xfffd78bc,0xfffe61f1,0xffff0d16,0xffffab36,0x000696c3,0x00081d86,0x00043000, -0x000937d3,0x000a3b8c,0x00062fad,0x00069bc5,0x00063a2a,0x0005b747,0x00056b97,0x000504e1,0x00049afa,0x00047299,0x00042972,0x0003dde2,0x0003d6c0,0x0003d4fc,0x00043bcc,0x0003650b,0x0002ad65,0x0001c8dd,0x00013f28,0x00061619,0xfff020fb,0xfff3eeeb,0xfff00923,0xfff25743,0xfff8ace9, -0x00039257,0xfff0afe7,0xfff843e4,0x0004e8bf,0x0001cd06,0x0000a327,0x0000c5e5,0xfffdb9ff,0xfffdae4a,0x0000f000,0xfff676aa,0xfff0a03e,0x000458e6,0xfff866a1,0xfff21ca5,0xffef5919,0xfff10bd7,0xffef9f29,0xffee0571,0xffee67fb,0xffef145e,0xfff076ff,0xfff25e14,0xfff1dd30,0xffecd595, -0xfff02454,0xfff16e50,0xfff5657c,0xfff23325,0xfff1f6ab,0xfff1fc37,0xfff331aa,0xfff49c7c,0xffeea271,0xfffce759,0xfff3de81,0xfff63ca2,0xfff6d131,0xfffadca0,0xffff9587,0xfffd3ab4,0xfffcdea4,0xfffd2194,0xfffb04b5,0xfffab8c0,0xfffbd6ec,0xfff80b2b,0xfff4376b,0xfff411e7,0xfff603e6, -0xfffbb85b,0xffec2e14,0xffebddbf,0xffe6d3e0,0xffe0f662,0xffe0802b,0xffe3a31c,0xffe984e1,0xfff1f500,0xfff13a4f,0xffe340da,0xffeb1462,0xffef49ae,0xfff97de1,0xfff15c69,0xffefc726,0xffefffe7,0xfff3605e,0xfff982a1,0xfff0f450,0xfff7d27f,0xfff7aebf,0xfffc90e0,0x00009b00,0x0001b0c9, -0x00008bb1,0x0000b947,0x00012169,0x000111f9,0x0001cd05,0x0001bf82,0x0001cb2c,0x00027ae7,0x00019a7e,0xfffda622,0xfff71d01,0xfff61e71,0xffec5cad,0xffea4611,0xffe4b381,0xffdc28cb,0xffdb79e5,0xffe0861e,0xffe9e331,0xfff560f6,0xfff1c00c,0xffd685aa,0xffe8d670,0xffef6f3a,0x0005b29d, -0xfff2bee7,0xfff3505d,0xfff37801,0xfff95c7e,0xfff91e86,0xffef071a,0xfff96975,0xfffce1da,0x0001ff6e,0xffffe508,0xffff6b72,0xffff9e75,0xffffbabc,0xffff8404,0xffff7df5,0xffff3cb2,0xffff3f05,0xffff2895,0xfffefebb,0xffffb06d,0x00019fea,0xfffc5c0a,0xfff61575,0xffe76294,0xffe0310e, -0xffd0b71a,0xffba2f06,0xffb5a286,0xffbf8230,0xffd6d085,0xfff2f7d4,0xffecc7f0,0xffc0f284,0xffd9b492,0xffee224a,0x000de79d,0xfff296cf,0xffe977d7,0xffeac901,0xfff61804,0xfff9e9a9,0x00016ffb,0x00080436,0x00006af1,0xffffcdb1,0xffffa520,0x00006fba,0x00002026,0x0000308e,0x000034b9, -0x00004760,0x0000578e,0x000062f7,0x00005e09,0x0000904d,0xffffcc6f,0xffffc5f6,0x0001cb3a,0x0000862e,0xfff3d3b7,0xfff6cd5b,0x000a3bee,0x0020225e,0x004383ee,0x0044f0ce,0x0024d885,0x000d0e1a,0x0002b947,0x0007e031,0x000d8616,0x0006ff1b,0xfff5719b,0x00078938,0x0017152b,0x002cded0, -0x00067500,0x001256a3,0x00068338,0x00062382,0xfffd56df,0x000175fe,0xffff836f,0x00001150,0xffffc3cc,0xffffeecd,0xffffd8f4,0xffffda07,0xffffcdd5,0xffffcf16,0xffffc5be,0xffffc755,0x0000088d,0x0000547e,0xfffe5914,0x0003b976,0xfffae2e4,0xffe93c8f,0xffd8ddd4,0xffc4b7c1,0xffbbbbf3, -0xffc54886,0xffe134ff,0x000a7208,0x001f714f,0x0018b409,0x000a101e,0xfff7aa46,0xffe4b3c4,0xffe9f728,0xfffc28ee,0x001b2f6f,0x001d2f63,0x00198fa6,0x0031e19a,0x002110ba,0xfffae419,0x000065c5,0xfffffa8c,0x00002232,0x000024bb,0x00002103,0x00001e36,0x000022f0,0x0000225f,0x00002569, -0x00002324,0x00002751,0xffffec59,0xffffc707,0x0000dd11,0xfffceb66,0x0002fdb4,0x0012b3fa,0x0022b0e7,0x002d2251,0x003a1444,0x002c9c44,0x00089682,0xffdada2d,0xffc872c4,0xffd57ecc,0x00089a18,0x001b3328,0x000481d4,0xfffe864a,0xffdf12b6,0xffb8300a,0xfff33ff5,0xffc65fad,0xff889106, -0xffd76142,0x0008b9e3,0xfffef3e2,0x00000d95,0xffffd0eb,0xffffbcfe,0xffffcf3b,0xffffcf74,0xffffd290,0xffffd47a,0xffffd823,0xffffd3c8,0xffffea42,0xfffff740,0x00007838,0x00009387,0xfff42d8c,0xffe6fa64,0xffe23074,0xffdd24f2,0xffd719d8,0xffd99d49,0xffdde519,0xffe726b7,0xfff71757, -0x0014c1a8,0x003b6052,0x000f055c,0xffe383ac,0xffbb8777,0xffd4bf9a,0xffe93d64,0xffef4135,0xffe44ac3,0xffed7044,0xffaff437,0xffd9cea4,0xfff889fe,0x0001d5df,0xffff7be6,0x0000a6c7,0x00005e58,0x0000707b,0x00005447,0x000055e6,0x00004df4,0x00003c7d,0x00005681,0x000008e7,0x0000378d, -0xfffee567,0xffff124a,0x000bfa3b,0x0014fdb2,0x001402f9,0x0012e62a,0x000c813d,0x00038c89,0xfff9560b,0xffec57eb,0xffe91ef2,0xffe02ed5,0xffdd9609,0xffdfb503,0xffea0d4e,0xfff1424e,0xfff195b7,0xfff07b53,0xffeea1ed,0x00010f57,0x0008aa4a,0x001538ff,0x001c2439,0x0007fcf7,0xffffb797, -0xffff7b67,0xffff41fd,0xfffeea70,0xffff3909,0xffff41aa,0xffff4f3a,0xffff67b7,0xffff6dc4,0xffff87ee,0xffff6b3e,0x00009a11,0xfffff4fe,0x0005fb92,0x000ea1ec,0x0010b51c,0x0009e6c1,0x0003a227,0xfffcebd0,0xfff91df4,0xfff34630,0xffe9a03f,0xffe93a32,0xffe9e577,0xffeae7ac,0xffec1447, -0xffeb9840,0xffede040,0xfff21799,0xfffaf6bd,0x00001f99,0x0005d88f,0xfffc27c9,0xfffe0c87,0xfffc497c,0xfffeb1c8,0x000085f8,0x00010f12,0x000251f8,0x000242f9,0x0001d0e1,0x0001af73,0x0001951e,0x00016df8,0x00013c55,0x0001509e,0x0000ff92,0xfffff526,0xfffdd060,0xfffa6cf0,0xfff8ddd9, -0xfff862cd,0xfff630fd,0xfff6b4a0,0xfff5f790,0xfff434da,0xfff26699,0xfff08fbb,0xfff06232,0xffef5af5,0xffeee2b0,0xfff07b34,0xfff28b3f,0xfff33e44,0xfff5c45c,0xfff6a98f,0xfff82970,0xfffaa8de,0xfff36ede,0xfff1dcda,0xfff64a29,0xfff31732,0xfff421b9,0xfff679e5,0xfff896d2,0xfff9cbc3, -0xfffb4680,0xfffb14c7,0xfffb91b5,0xfffbb157,0xfffc3560,0xfffbf824,0xfffca42a,0xfffcc58a,0xfffd4a9a,0x00013520,0x0009290c,0x00083a1c,0x00079bf5,0x000626df,0x000522c6,0x00040835,0x000328b0,0x00025cbe,0x0000803f,0xfffed66d,0xfffcbd02,0xfffa310b,0xfff73d74,0xfff44b69,0xfff416cc, -0xfff425c1,0xfff4238c,0xfff3a46a,0xfff92865,0xfff86aa8,0xfff9c4eb,0xfffd0e58,0x00031d23,0xfff7b529,0xfffb343a,0xffff2e97,0xffff84cf,0x000061cb,0x00016db7,0x0002431c,0x000377a3,0x0004c573,0xffffafbd,0xfffc6b15,0x000a5ec6,0x0002ed9e,0xffffa4c3,0xffff1995,0xffff4993,0xfffebecd, -0xfffe7bb1,0xfffe2cf4,0xfffdca3c,0xfffd8287,0xfffc75ea,0xfffb8eec,0xfffaca13,0xfffa1f3c,0xfff9b0db,0xfff8ee94,0xfff94ff6,0xfff92790,0xfff90cc5,0xfff8e536,0xfffb6b3f,0xfffeb79e,0xffffad88,0x000186b0,0xfffb1b29,0xfff40da1,0xffecb348,0xfffd77df,0xfff63f9f,0xfff56d40,0xfff2d1d2, -0xfff1f824,0xfff1b70a,0xffef03a5,0xffede5db,0xffef7530,0xfff3b792,0xfffbe4c9,0xffec0eb0,0xfff48b10,0xfffac830,0x000103bd,0xfffe2f21,0xfffead61,0xfffd52b7,0xfffe3bc3,0xfffed769,0xffff916c,0x0000f23b,0x00007c2c,0xfffc4b52,0xffffc5e4,0x000139af,0x0004fbbe,0x0001d76b,0x0000ca28, -0xfffe6291,0x00007e56,0x0000da03,0xffff9369,0xfff2817c,0xfffea818,0xfffa3e7f,0xfffa1cd7,0xffff5719,0x0003844e,0x0001b19c,0x00021d62,0x0002102a,0x000199c3,0x00014430,0x00025745,0xfffc81fa,0xfffa2ef2,0xfffaaf0a,0xfffda58e,0xfff332b2,0xfffd04e1,0xfffc7b59,0xfff99c50,0xfff60538, -0xfff751d8,0xfffa07d3,0xfffd4c82,0x00038585,0x000276fa,0xfff70b62,0xffff33a9,0x0003b73c,0x000cb58f,0x0005077a,0x0001229b,0xfffb9e83,0x00000753,0x000545ab,0xfffd9214,0xfffc54b6,0xfffcedcc,0xfffd98b2,0x00017d08,0x00008205,0xffff1032,0xffff8a24,0xffffa93a,0xffff8f69,0xfffffbfc, -0xffffed00,0xfffff070,0x0000f7f8,0x00021807,0xfffec78c,0xfffc7a4f,0xfff9a6a8,0xfff961a7,0xfffe5fe4,0xfff9d352,0xfff59a70,0xfff80e68,0xfffc7f70,0x00012a3b,0x00094ad9,0x0005c45b,0xfff027f2,0x0002ca79,0x000a362e,0x001dead0,0x000b6643,0x0006a6ef,0xfffd1e7b,0x00041795,0x000333b6, -0xfff8e080,0xfffa5b1a,0x00002b14,0x0000d36b,0xffffd638,0xffff9917,0x000060bc,0x000029e7,0x00001baf,0x00001b7e,0xfffff6ea,0xffffeacb,0xffffffde,0xffff648f,0xffff95b3,0x00004ad5,0x00004811,0xfff75d83,0xfff3b64b,0xfff6a5de,0xffebd4b3,0xffdf8a25,0xffe18bf6,0xffeacfe8,0xfff8315b, -0x000c2f99,0x000478da,0xffe0f648,0xfffa5a76,0x000e18b5,0x0029e713,0x000eac3d,0xfffe2cc8,0xfff233c0,0xfffd8f06,0x0011d71e,0x000f2069,0x0002d770,0x0000fc92,0xffff1b6e,0x0000406d,0x00001a7f,0xffffe5f3,0xffffe8b2,0xfffff7ae,0xfffff56a,0x00000b46,0x0000024d,0x00001daa,0x00001955, -0x0000900e,0xfffedd08,0x000252b7,0x000090df,0x000342bd,0x0013743d,0x001dd9b1,0x002e7a13,0x0041cc6a,0x003eb9b1,0x002039c8,0x0014e81c,0x0013c108,0x001d12e8,0x0027fd5e,0x00253eab,0x00134d97,0x00227e5b,0x002bc53b,0x00370402,0x0017729c,0x00178f16,0x000f49cf,0x00045842,0xfffe0d51, -0x000145c5,0xffff6d38,0x00002608,0xffffecf6,0x0000133e,0xfffffe20,0x000001a0,0xfffffcc7,0xfffff3df,0x00000190,0xffffcad3,0x00000c06,0x000005e5,0xffffb896,0xffff108b,0xfffeb6ab,0xfff86284,0xffecb190,0xffe4e4d5,0xffd5c390,0xffda4db7,0xffeeaede,0x000dcb0a,0x001ce3c9,0x00151353, -0x000aef46,0xfffc0dcb,0xffe8d265,0xfff5ebee,0x0005dffd,0x00197d28,0x001f80fd,0x00161171,0x00295f00,0x001377c3,0xfffacb22,0x00010d18,0xffffd460,0x00001fd1,0x00000542,0x0000008a,0x00000517,0x00000284,0x0000094e,0x000000b2,0x000015ad,0xfffff820,0x00004798,0xffff508b,0x00012aff, -0xfffef9ae,0x00096547,0x00189045,0x00236085,0x002e5850,0x0043993d,0x003fccae,0x0022fe18,0xffff77bd,0xffee23c5,0xfff496b7,0x00234384,0x003bca21,0x0034e2bd,0x002bd669,0x000a5e45,0xffe83466,0xffff10dc,0xffe0b201,0xffa3e0d9,0xffe50e1e,0x000ad68c,0xfffc8717,0x00011eee,0xffff60da, -0x000020bd,0xffffdc40,0xfffffec3,0xffffeed2,0xfffff963,0xffffefaf,0xfffffe66,0xffffd785,0x00002923,0xffffac71,0x0002235f,0xfff66419,0xffec709a,0xfff08809,0xffeff1e4,0xffed898b,0xffeeedc1,0xffef9348,0xfff1fa7e,0x000570d1,0x001d23e5,0x0039235e,0x00089aa4,0xffe682ec,0xffd6b6e0, -0xfffea2eb,0x001f48f5,0x00368973,0x00052e42,0x00225665,0xffbfc730,0xffd4bdde,0x00022566,0xffff1c30,0x0000da4e,0xfffff018,0x00005608,0x000008f7,0x00002572,0x00001243,0x00001ae1,0x00000d36,0x00002040,0x00000986,0x000029ce,0xffffadd2,0xfffdfbf7,0x0008f37b,0x0015b1a8,0x001277e3, -0x000e06ca,0x0009f860,0x00035288,0xfffe70a3,0xfff8e331,0xfff7b804,0xfff34ced,0xfff8c40b,0xfff8a0c6,0x000570e0,0x0013e554,0x001e39ff,0x0022c42f,0x00262850,0x00355e03,0x00125658,0x0018ccaf,0x0011cf1a,0x000459c4,0xfffe4a17,0xffffff9d,0xffff274c,0xffffcd27,0xffffaef1,0xffffd4e8, -0xffffc8e1,0xffffdaa9,0xffffd378,0xffffe6b0,0xffffa683,0x000027f0,0xffffd1cb,0x0003bf9d,0x000c7563,0x000eba23,0x000d7487,0x000ba437,0x000687af,0x00046f52,0xfffef387,0xfff61438,0xfff396db,0xfff16304,0xffeed838,0xfff271a1,0xfff79915,0x0003ada0,0x0000851b,0x0004d378,0x00082a3b, -0x000accf7,0x00082577,0x00069c62,0x0000889a,0x00029ea2,0x0000664b,0x0001ab1d,0x000154c4,0x000097c9,0x000074dc,0x00004ef4,0x000056b3,0x000041b0,0x00003539,0x0000447d,0x000079e0,0x00009729,0xfffee512,0xfffb8bdd,0xfff90041,0xfffb9faa,0xfffad554,0xfff92fcd,0xfff8049c,0xfff63251, -0xfff49c86,0xfff29f0a,0xfff56261,0xfff75886,0xfff9588c,0xfffd36dd,0xffffe93b,0x0002c7c8,0x00032924,0x000375fe,0x00048506,0x00060c83,0xfff9fc1f,0xfff9386a,0xfff26586,0xfff93055,0xfff85621,0xfff9aeab,0xfffcf20b,0xfffed399,0x00003637,0xfffffa78,0x00001e4c,0x000021a8,0x00005237, -0x00001bb2,0xfffe691d,0xfffda5b1,0xffff5039,0x0001caa1,0x00045c76,0x0006bd0d,0x00042f81,0x00039590,0x0002aa9c,0x00017ddb,0x00009939,0xffff5a0b,0xffffc607,0x0000289b,0x000084f3,0x000070c2,0x000071d0,0x00009a83,0xffff48d0,0xfffe33b1,0xfffcbbbb,0xfffb4484,0xfffe7a52,0xffff393f, -0xfffc9ae8,0xfff926d7,0xfff5a1f8,0xfffc9e2a,0xfff88344,0xfff5ae99,0xfff59b89,0xfff61fd1,0xfff67fcf,0xfff6f625,0xfff73f76,0xfff7bca8,0xfffbefef,0x0000126f,0xfffb525e,0xfffeb9c3,0x00014aa6,0x00020ea4,0x0001618c,0x00012a9c,0x00009ef0,0x00005820,0xfffffe45,0xffff70ed,0xffffa52e, -0xffffa3e3,0xffffc481,0x00000336,0x00004e25,0x0000dde8,0x00004335,0xffffe254,0xffff906d,0xffff3ca4,0x0000b7b7,0xfff58dce,0xfff7e813,0xfff3dd79,0xfffb94a8,0x000072ec,0x00029a71,0xfff8e47e,0xffff63b9,0x00053b8f,0x0003012f,0x000228d1,0x000237a9,0x0000609b,0xfffff5c2,0x00010e05, -0xfffe5ce0,0xfff91efa,0x0001ffef,0x000096ec,0xfffc0b2c,0xfff47491,0xfff625e1,0xfff516e4,0xfff3bd58,0xfff4bee1,0xfff54cdc,0xfff5f9d8,0xfff6fffe,0xfff67a39,0xfff2d315,0xfff58bfb,0xfff6ab8a,0xfff9c076,0xfff76140,0xfff731ff,0xfff749c6,0xfff7b3fd,0xfff7f88b,0xfff4c177,0x00018ff7, -0xfff8a0b6,0xfffb6229,0xfffd1ad5,0xfffebf42,0xffff4b15,0xfffef34d,0xfffefd86,0xffff2627,0xfffed8af,0xfffecdac,0xffff2292,0xfffe7836,0xfffcefcf,0xfffa0ed2,0xfffa451d,0x000182ff,0xfff496b5,0xfff1a488,0xffeed08d,0xffea56a3,0xffec3555,0xffeea594,0xfff1a8f8,0xfff6afe7,0xfff59df3, -0xffebc8b2,0xfff2224f,0xfff5ec73,0xfffde412,0xfff88241,0xfff742c5,0xfff73df1,0xfff8aef9,0xfffa23fc,0xfff439e4,0xfffd6cd0,0xfffd032d,0x00012273,0x0000f20f,0x0000b018,0x0000200e,0x00005bed,0x00005e33,0x00005325,0x000080a8,0x00008579,0x00006849,0x0000b896,0x00012523,0x0001c8c0, -0xfffd5c2c,0xfffe1fc4,0xfff64d88,0xfff09d21,0xffedb826,0xffe6fabf,0xffeaa90f,0xffee8ff2,0xfff31c7b,0xfff91678,0xfff56023,0xffe2ac1e,0xfff13ad0,0xfff6d882,0x00078257,0xfffa6e9b,0xfffa9048,0xfffa70c0,0xfffc906d,0xfff9b297,0xfff2b28d,0xfffea055,0xffffc155,0x00008f7c,0xffff2a7d, -0xffffdd71,0xffffd969,0xffffe56b,0xffffd009,0xffffdc94,0xffffbf63,0xffffcbc7,0xffffb6d2,0xffffd61c,0xffff126a,0x00004cc8,0xffff7919,0xfffdd185,0xfff1a8f1,0xffe75e7a,0xffddc667,0xffce744c,0xffd2ebe1,0xffdbb0d2,0xffe80eb8,0xfff82809,0xfff0fd12,0xffd2704a,0xffe5fe62,0xfff72e22, -0x000fc57b,0xfffe2eb2,0xfff701a9,0xfff75a1a,0xfffc7bc1,0xfff5951d,0x00056fdc,0x0007bf56,0xfffdac4c,0x0000c647,0xffffdfa2,0x000056bc,0xfffff274,0x00001ecf,0x00000d8e,0x000019e5,0x00001776,0x00002679,0x00000c13,0x0000474d,0x00001139,0x00008669,0xfffed813,0x0004a479,0x0002751f, -0x0002c5d3,0x0010a86a,0x001ae5ca,0x002edd7c,0x002a1f1c,0x000fd1a0,0x0000abb6,0xfffe3a76,0x00056783,0x00102419,0x000a7720,0xfff44eb5,0x000722ce,0x00100a65,0x00199f8e,0xffff3690,0x00085b5b,0x00056aca,0x00031abb,0xfffd567b,0x0001a2b0,0xffff092b,0x00004e5c,0xffffc81b,0x00000a48, -0xffffe960,0xfffff87f,0xffffebb9,0xfffff587,0xffffe441,0x00000433,0xffff99cb,0x00009097,0xfffed580,0x00014119,0xfffb1910,0xffea3be6,0xffdea566,0xffd06897,0xffcc7bee,0xffd8dd31,0xfff26284,0x00100097,0x001ac876,0x000dd127,0x0005975d,0xfffc0381,0xfff0dee9,0xfffd5359,0x000a329c, -0x0019125a,0x0017de1e,0x000ddb27,0x001c7b3e,0x000be35b,0xfffb9860,0x00017145,0xffffa628,0x00003c0a,0xfffffb58,0x000011b5,0x0000089c,0x00000d39,0x00000b51,0x00000da8,0x00000aa5,0x000010b7,0x00001cd6,0xfffff199,0xffffeb04,0x0000f42a,0x0003b990,0x00102433,0x001ecc96,0x00287cc0, -0x002d9d9c,0x001e73aa,0xffff3e27,0xffe06f64,0xffd7c379,0xffe9c5bb,0x0007ac6b,0x00124d2c,0x00095257,0xfffd03c6,0xffe7c90d,0xffd7df98,0xfff889d2,0xffdc3c8b,0xffbe6cb3,0xfff329d6,0x0006b630,0xfffd4d90,0x0000d36d,0xffff85f3,0x000014bd,0xffffddc0,0xfffff5ef,0xffffec31,0xfffff123, -0xfffff01f,0xfffff154,0xffffed48,0xffffec80,0xffffd56f,0x00011c9b,0xfffc0948,0xffee759c,0xffeb9c4d,0xffe897a5,0xffe4e533,0xffe95e0d,0xffee5bd1,0xfff499bd,0x000951e3,0x001c213b,0x002fd1b1,0x00011986,0xffe3ce1b,0xffd8dd7c,0xffee734d,0x00021941,0x00126f4e,0xfff1212d,0x000fde4c, -0xffc98aac,0xffeb0154,0x0002a510,0xffff748d,0x0000b6d9,0xffffed48,0x00004571,0x00001183,0x0000284f,0x00001ba7,0x00001da2,0x00001c69,0x00001522,0x000029a7,0x0000040f,0x00008f63,0xfffd82ff,0x00071fd8,0x00102a32,0x000cc32a,0x000ba604,0x000576b5,0x00015979,0xfffb6bd1,0xfff33568, -0xfff17963,0xffed21ad,0xfff081a9,0xfff03e92,0xfff97c45,0x00020594,0x000c7302,0x001317a1,0x0017200b,0x00242eae,0x00011051,0x001075ba,0x00137932,0xfffedadb,0xffff0f3b,0xffffa6d2,0xffff902c,0xffffc03d,0xffffb6e0,0xffffbf73,0xffffc124,0xffffc53e,0xffffcc60,0xffffc76c,0xffffd0bb, -0xffffa582,0xffffc1f2,0x000133ce,0x0009bdad,0x000d949b,0x000935ed,0x000657e0,0x00020b96,0x0000aed5,0xfffc947a,0xfff5aa03,0xfff2fe60,0xfff1f497,0xfff1e41f,0xfff2cde8,0xfff1fa19,0xfff1cf11,0xfff0d694,0xfff511fc,0xfff8844e,0xfffc37ae,0x00030a65,0x0005c888,0x00044771,0x0002ab55, -0x00018801,0x00012519,0x0000be54,0x00008f2d,0x00008dca,0x0000888e,0x00007f90,0x0000799b,0x00006eb4,0x00006e4d,0x000072da,0x0000a3e6,0x0001021e,0xfffd391b,0xfffa9ec6,0xfff8428c,0xfff643d0,0xfff6cf9f,0xfff618ab,0xfff4d901,0xfff37d70,0xfff22b29,0xfff2db30,0xfff2fb3c,0xfff33f0c, -0xfff58aa9,0xfff7e5b7,0xfff9d501,0xfffc6eb1,0xfffe06f2,0xffffe28a,0x0002c530,0xfff7d5ac,0xfff809be,0xfffa6d9d,0xfff9465a,0xfffb1743,0xfffcac3e,0xfffea736,0xffff0421,0xfffee665,0xfffef891,0xfffefc93,0xffff02d1,0xffff10ed,0xffff0952,0xffff122f,0xfffe2646,0xfffcc48d,0xfffd2bbe, -0x00034093,0x0000af60,0xffffed8b,0xfffefa38,0xfffe24a5,0xfffd4670,0xfffc9b44,0xfffbd9de,0xfffb1612,0xfffa71a8,0xfff9a5c9,0xfff8aa66,0xfff77755,0xfff634fc,0xfff663a1,0xfff6de56,0xfff70666,0xfff763e4,0xfff9cdd7,0xfff96080,0xfffc57df,0xfffe22dc,0xffff5175,0xfffa1e63,0xfffcbdfb, -0xfffdbe1e,0xfffe138e,0xfffe7eb9,0xfffeec68,0xffff5521,0xffffcf89,0x00005b51,0xffff3f93,0xfffc2d1d,0x0003d97c,0x0001843e,0xfffe8d32,0xfffb3d6c,0xfffbc9e0,0xfffb404b,0xfffaf06e,0xfffaa558,0xfffa4a52,0xfff9e8cb,0xfff9a24c,0xfff95eb2,0xfff93597,0xfff9105d,0xfff91584,0xfff90197, -0xfff95b35,0xfff96f23,0xfff999a8,0xfff9a41e,0xfff99b7f,0xfffbfe1b,0xfffcfb50,0xfffdcda0,0xfff7b8e8,0xfff5288c,0xfff4acdf,0xfff9da37,0xfff78bd8,0xfffae90e,0xfff946ad,0xfff8d744,0xfff8eab7,0xfff7d344,0xfff776f4,0xfff83550,0xfff67650,0xfff93ccc,0xfff3fcef,0xfff5ff93,0xfff85400, -0xfffe195e,0xfffc0a2b,0xfffbefe1,0xfffae794,0xfffbf28b,0xfffc4dfb,0xfffc6503,0xfffd1f3a,0xfffcc1f1,0xfffa3071,0xfffc4dae,0xfffd3238,0xffffc2a5,0xfffd4e7b,0xfffcdd2d,0xfffc87ce,0xfffd5190,0xfffde366,0xfffb279c,0xfff5a58a,0xfffcce25,0xfffc043c,0xffff2fff,0x0001548f,0x0001d662, -0x0001444d,0x00018d85,0x00018c3b,0x00019315,0x0001652d,0x0001ec21,0x00014bcd,0xffffffab,0xfffc5c6d,0xfffd5b52,0xfff7a853,0xfffad841,0xfff9f8f0,0xfff6f6ff,0xfff4b0e7,0xfff71849,0xfff936f8,0xfffa58dc,0xfffdce68,0xfffca414,0xfff56272,0xfffa40e3,0xfffcfa4b,0x0003153e,0xfffd57c9, -0xfffbb6f3,0xfffb5843,0xfffced40,0x00009384,0xfff8eec3,0xfffa1286,0xffff540b,0x0000ff67,0x0000abb6,0xffffb8b1,0xffff67c5,0xffff9fd2,0xffff998e,0xffff89ab,0xffffa1dc,0xffff9da4,0xffff879e,0xffff9eba,0x0000aba2,0x0000b494,0x00007770,0xfffba887,0xfffa4725,0xfffb45f2,0xfff6fb84, -0xfff332c1,0xfff76ea1,0xfffa634a,0xfffb10bb,0xffff70a4,0xfffc6d8b,0xffefab01,0xfffad4f1,0xfffeee66,0x000c47c4,0xfffe49e6,0xfffd7590,0xfffda383,0xfffedf8c,0xffffedfe,0xfff5e0c3,0xfffcb83f,0x00018e4b,0xffff487b,0xffffd5a9,0xfffffda3,0x0000492c,0x0000239e,0x00002a79,0x00002c32, -0x00002700,0x00001eda,0x00003d77,0xfffffe9e,0xffffe8bf,0xffff2d11,0x00015857,0xfffcb29c,0xfff6d6f6,0xfff3b205,0xffe9af5c,0xffe12675,0xffe7e40c,0xffef7a46,0xfff50d68,0xfffff06c,0xfff997b3,0xffe3c82e,0xfff1f7e4,0xfffe17de,0x00110987,0xfffdb43e,0xfff6fe62,0xfff92f2f,0xfffc524e, -0x00025337,0x0002a673,0xffff8f6b,0x0000abd0,0xffff9195,0x00007021,0xffffda9d,0xfffff1fc,0xffffe5e6,0xfffff0e5,0xffffe939,0xfffff1c0,0xffffeb1c,0xfffff190,0xffffe7ae,0x00004932,0xffffdea6,0x00004d3a,0x00004677,0x0004cb46,0x00104c1e,0x0018e24c,0x00239cf5,0x00284568,0x00228d39, -0x00101fe5,0x00083911,0x0009a965,0x00102203,0x001b14db,0x0015d58f,0xfffebda6,0x000e333e,0x0013f2ba,0x00199d70,0x00047dee,0x00104f14,0x00089a24,0xfffdcdfa,0x00008996,0xfffff0d9,0xffffdb5e,0x00000ad9,0x000008b0,0x00000c3d,0x000008b2,0x000009a2,0x000009c5,0x00000618,0x00000fe3, -0xfffffa23,0xfffffa24,0xffffd6ff,0x00005217,0xffff2ac0,0xfff99408,0xfff0b954,0xffe58b09,0xffdf203c,0xffdbb945,0xffe54dd1,0xfff71776,0x000d074b,0x0014bb55,0x000aaca6,0x00042146,0xfffb5b3e,0xffefb69a,0xfffcb245,0x00084037,0x001517f3,0x00161127,0x00093558,0x001333e0,0x00035ada, -0xfffdece5,0x0000cd09,0xffffd464,0x000010f3,0xfffff501,0xfffff9c9,0xfffffb94,0xfffff8ce,0xfffffd70,0xfffff590,0x00000410,0xffffe85b,0x00003c3c,0xffffafc6,0x00007825,0xffff5e9c,0x00051c4f,0x0013347e,0x001b5b2f,0x0023e809,0x0029ffd0,0x001ff277,0x00079458,0xfff250d6,0xffed67fc, -0xfffc0a44,0x001521fa,0x001cf869,0x001264b9,0x0001a15f,0xffee0820,0xffe54ed1,0xfffa2b17,0xffe4080c,0xffd0260d,0xfffde6e0,0x00035a45,0xfffe325a,0x0000afc6,0xffffa8df,0x00002c54,0xfffff455,0x00000c6c,0x000000d1,0x00000799,0x000000e2,0x00000e57,0xffffee34,0x000020dc,0xffff74d5, -0x0001771a,0xfffd63e4,0xfff35717,0xfff533ab,0xfff28ce6,0xfff0c601,0xfff2af60,0xfff5b069,0xfff91f86,0x000b8493,0x00175732,0x00206b1e,0xfff76cb3,0xffe400fa,0xffe9c60b,0xfff96747,0x000acce4,0x001cf832,0xfff30fec,0x001a4bc2,0xffd253ca,0xfff24035,0x000497d4,0xfffe661e,0x0000e9bc, -0xffffa828,0x00001f44,0xffffe5aa,0x00000265,0xfffff4e6,0xfffffa62,0xfffffa03,0xfffff0ee,0x00000bae,0xffffeecb,0x00009119,0xfffe74ea,0x0002006e,0x000d1f59,0x000a2dfc,0x00076a48,0x0003ac11,0xffff9b18,0xfffb4267,0xfff4d4e6,0xfff3b1b9,0xfff0c647,0xfff52049,0xfff74d4e,0x000121de, -0x000c6e22,0x00166212,0x001cf51a,0x00248026,0x0028ed86,0x000064aa,0x00088401,0x00084a68,0xfffe6c69,0xffffb48d,0xffffceef,0xffffec5c,0x00002302,0x00000788,0x00001134,0x00000eb0,0x00000dcc,0x000011f0,0x00000eb4,0x00001786,0xffffba29,0xffffede5,0xffffe14b,0x00064469,0x000b6046, -0x0009f7f5,0x00093aa6,0x0005a667,0x00031754,0xffff0a8f,0xfff9c41f,0xfff7c462,0xfff75ba0,0xfff73249,0xfff85130,0xfff8f37d,0xfffb3c60,0xfff85967,0xfff8ef2a,0xfff9de92,0xfff9fb64,0x0008280e,0x0007ffad,0x00026ac4,0x000141cc,0x0000cfdc,0x000092de,0xffffe7ed,0xffffbbde,0xffffd788, -0xffffd07a,0xffffd1a3,0xffffd03e,0xffffd62b,0xffffbf3d,0xffffe030,0x00003980,0x0000cfc2,0xffff4b9e,0xfffa0fb2,0xfff9983d,0xfffa4052,0xfff9409a,0xfff918c7,0xfff7e852,0xfff6e7b3,0xfff598f6,0xfff678c0,0xfff69f5f,0xfff6cae1,0xfff9c28e,0xfffc6941,0xffff408f,0x0000e276,0x00025cad, -0x000498a4,0x0006a69f,0xfffaf371,0xfffac9eb,0xfff840b9,0xfffd4ffd,0xfffcf1e1,0xffff174c,0x0000f44a,0x0001171a,0x0000e004,0x0000f445,0x0000e799,0x0000ef06,0x0000da97,0x000102cf,0x0000e889,0xffffcc6d,0xfffe2f99,0xfffdc492,0xfffe51d8,0x00004c5d,0xffff1b6c,0xfffe40d7,0xfffda67d, -0xfffcbf22,0xfffc2661,0xfffb614d,0xfffc06df,0xfffc8a6c,0xfffcb345,0xfffc8999,0xfffc1a11,0xfffbacba,0xfffb87c9,0xfffb6675,0xfffae3cc,0xfffa9a0c,0xfffc88b6,0xfffd4db8,0xfffa04b2,0xfff83818,0xfff80ab7,0xfffa93a5,0xfff90f2f,0xfff97e4a,0xfff976fc,0xfff99e6d,0xfff9b54b,0xfff9d77c, -0xfff9eeb5,0xfffa2b37,0xfff9d76f,0xfffb6c20,0xfffa327f,0xfffab924,0xfffc08fb,0xfffded11,0xfffd2560,0xfffd0564,0xfffcabe4,0xfffc79b0,0xfffc3bef,0xfffbcdd0,0xfffbeb08,0xfffbe7f5,0xfffc1453,0xfffc3bdd,0xfffc814e,0xfffcc7b4,0xfffcb993,0xfffcb570,0xfffcd6d3,0xfffccbc7,0xfffc12e7, -0xfffbcae3,0xfffca72e,0xfffaf317,0xffff33ce,0xffff8339,0xfffc8868,0xfffe5cb8,0x00000051,0x000061e0,0xffffa06d,0xffff5a35,0xffff55a5,0xfffec5f9,0xfffe85b2,0xfffe961f,0xffffb16d,0xfffeb32a,0xfffb9709,0xffffe4e8,0xffffdc87,0xfffbcbd4,0xfffc04d9,0xfffbae51,0xfffada84,0xfffbc49b, -0xfffc1543,0xfffc395f,0xfffc9336,0xfffc3e06,0xfffa60e3,0xfffbfd90,0xfffcb81e,0xfffe9334,0xfffd2a09,0xfffcf69a,0xfffccd08,0xfffced44,0xfffc7f89,0xfffb9002,0xfffeda53,0xfffd8b59,0xffff8031,0x00000758,0xffffddb6,0x00000509,0x00001a00,0x00004539,0x00004de1,0x00007a40,0x00008f78, -0x00009a50,0xfffff89b,0x00000f46,0xffff9453,0xfffe51d5,0xffffcc8f,0xfffc5f59,0xfff99f94,0xfff85bc1,0xfff62518,0xfff84628,0xfff9b21f,0xfffa9108,0xfffca4b1,0xfffbc9a3,0xfff6cff2,0xfffa84ae,0xfffcf90c,0x0001a66a,0xfffeba27,0xfffdb0ea,0xfffd07cc,0xfffd6a2f,0xfffd48fc,0xfff95566, -0xffff97df,0x00002a2d,0x00008f06,0xfffffc24,0x000013fa,0xfffff8c5,0xfffff6fd,0xffffe886,0xffffe099,0xffffd688,0xffffc9e8,0xffffcf73,0xffffff6c,0x000002cf,0x00007e7e,0x000001c6,0x0000baff,0xfffd67c9,0xfff9e75f,0xfff87420,0xfff4ebc4,0xfff905eb,0xfffb3874,0xfffc24a7,0xfffe0b7b, -0xfffb8f18,0xfff29ac5,0xfffb0226,0xfffea97d,0x00083748,0x0000bf93,0x0000319f,0xffff2f51,0xffff24f2,0xfffbfccb,0xfff79012,0x0000be9e,0xffffbda9,0xffffe6a1,0xffffe31d,0x0000057b,0xfffffcc9,0x000007cf,0x000008a6,0x00000f8e,0x00001144,0x00001a22,0x00000f90,0x00000abb,0xffffe9d8, -0xffffdbd7,0xffffe89f,0xfffffc9c,0xfffad3ad,0xfff397f9,0xffeeeb18,0xffe7f906,0xffee8eef,0xfff43b34,0xfff81110,0xfffe2db7,0xfff90a61,0xffe9bebd,0xfff4edb4,0xffff7854,0x000dd07e,0x00041b2c,0xffff03e1,0xfffdce4a,0xfffec3e4,0xfffcb777,0x0005c8ec,0x0001181e,0xffff667b,0x000057cd, -0xffffefe4,0x00000afc,0xfffffa48,0xffffff06,0xfffff974,0xfffff98d,0xfffff590,0xfffff623,0xfffff358,0x00000507,0xfffff4f1,0x00004605,0xffff936a,0x00009a35,0x0008a422,0x000b02ce,0x0011b55b,0x0015bae0,0x001a017e,0x0013fc3b,0x00052f0b,0xfffe9578,0x00003285,0x00061227,0x00100e3a, -0x000cd664,0xfffb1493,0x0008f944,0x000c89fc,0x000e3676,0x0000e91b,0x000650ab,0x00062ee0,0xfffeec1a,0x00001c16,0x0000056d,0xffffe753,0x00000c82,0xfffffb28,0x00000637,0x00000217,0x000005c4,0x000004b3,0x00000852,0x000001d0,0x00000900,0xffffee98,0x000004af,0xfffffb6f,0xfffffb7d, -0xfffafd2d,0xfff1a881,0xffeb9e75,0xffe62fa7,0xffe52e9f,0xffee09d4,0xfffd8370,0x000dd0cf,0x001204a1,0x0007a16a,0x00026d2a,0xfffda2d0,0xfff79143,0x0004857d,0x000c4cfd,0x001146a5,0x00100465,0x00063d90,0x000ba5f8,0x000088a5,0xffff372c,0x00006955,0xffffdf55,0x00000c1f,0xfffff7a1, -0xfffffdb4,0xfffffad5,0xfffffb98,0xfffffa80,0xfffffac5,0xfffffae3,0xffffff3a,0xfffffdd7,0x0000217f,0xffffaa3b,0x000098e4,0x0004bde4,0x000cc99a,0x001535c7,0x001b5387,0x001ccc4d,0x00133fe3,0x00011f2b,0xfff0ae54,0xffeda6f7,0xfffb570b,0x0009a855,0x000f81d3,0x000e95dd,0x00011d5f, -0xfff4953e,0xfff1e56d,0xfffd2dc2,0xffedeb2a,0xffe2f776,0x00021a80,0x000059a3,0xffff95c2,0x00002a74,0xffffee1e,0x0000105a,0x000003dc,0x0000091a,0x00000712,0x00000773,0x0000086e,0x00000579,0x0000044b,0x000000a5,0xffffd85a,0x00005d4c,0xffffa4a1,0xfff83b12,0xfff6f1f0,0xfff613fd, -0xfff4d381,0xfff79ee1,0xfffb1e42,0xfffed804,0x000f9431,0x001783ea,0x001ac182,0xfffaa381,0xffeca4ec,0xfff144f1,0x00003373,0x000eea50,0x001e67b2,0xfffbcc30,0x001dd693,0xffec33e4,0xfffd3850,0x0001777f,0xffff9789,0x000035b5,0xffffe78a,0xfffff75a,0xffffedb9,0xfffff1e6,0xfffff1a8, -0xfffff043,0xfffff53d,0xffffeb3e,0x00000ba2,0xffffd9b8,0x00007d8f,0xffff2caf,0x00009a8c,0x000a5af2,0x00068ef4,0x00055acf,0x00011354,0xffff5006,0xfffcc940,0xfff91bba,0xfff875a2,0xfff77a65,0xfffc8c6f,0xfffce968,0x0004d699,0x000e3cd3,0x00192a9b,0x00205dfc,0x00269984,0x0029b04e, -0xfffd31b4,0x0008e8cf,0x000454eb,0xfffdade9,0x00009be8,0xffffa603,0x00002db9,0x0000157c,0x00002662,0x00001ca5,0x00002098,0x00001b58,0x00002190,0x000012fc,0x00001f08,0xffffd52e,0x00001d2a,0xffff28ff,0x0002d5b6,0x0008f941,0x0006dff8,0x0006f4c9,0x0004b323,0x0003fb43,0x000156eb, -0xfffd8868,0xfffb1073,0xfff9b766,0xfff8e4b3,0xfff937ac,0xfff8bd49,0xfff8d645,0xfff54b68,0xfff5ba01,0xfff74d97,0xfff8c171,0x00066c71,0x0008dfea,0x00044470,0x00000f34,0x00008b9d,0xfffffafd,0xffffe844,0xffffa977,0xffffb951,0xffffb747,0xffffbb44,0xffffbc03,0xffffbfab,0xffffbd3b, -0xffffe5bb,0x00000052,0x00005bdf,0x00009bb4,0xfffdc049,0xfffb3186,0xfffa86a6,0xfffa59c9,0xfff9deef,0xfff91052,0xfff840ef,0xfff75f71,0xfff82b36,0xfff8ac46,0xfff92251,0xfffb573b,0xfffd509d,0xffff74c3,0x00014f74,0x0002e9e2,0x000474f3,0x0006aa85,0xfffc2857,0xfffc92d7,0xfffd2155, -0xfffee14b,0xffff52bb,0x000014f6,0x00006b7e,0x0000eb52,0x0000c626,0x0000cae1,0x0000bfb1,0x0000bd2c,0x0000b3a6,0x0000b82b,0x00005f42,0x00000719,0xffffccca,0xfffdab89,0xfffe85a8,0xfffd85d3,0xfffcdf2e,0xfffc69f2,0xfffc0049,0xfffb7f10,0xfffb2747,0xfffaacad,0xfffae25c,0xfffb19a5, -0xfffb3f14,0xfffb5017,0xfffb4a09,0xfffb3be6,0xfffb4dbe,0xfffb8a12,0xfffb79fb,0xfffbc4ad,0xfffc964c,0xfffcace0,0xfffd81ec,0xfffd5832,0xfffc05fa,0xfffda732,0xfffe5c8a,0xfffde7fa,0xfffdec96,0xfffe0804,0xfffe1248,0xfffe26b3,0xfffe2e75,0xfffe403d,0xfffee89b,0xfffdded5,0xfffd2eee, -0xfffe75b0,0xfffe0ce9,0xfffbed02,0xfffc0e60,0xfffbd6a7,0xfffb984a,0xfffb6f49,0xfffb3cb0,0xfffaefe0,0xfffb1f85,0xfffb3d22,0xfffb715c,0xfffb9ea2,0xfffbdfbd,0xfffc2fd6,0xfffc483e,0xfffc5e4d,0xfffc89b2,0xfffc9706,0xfffb6749,0xfffbd5fa,0xfffc86f2,0xfffc539e,0xfffaa6b8,0xfffaac97, -0xfffc6457,0xfffe3fd3,0xfffe2a23,0xffffeb05,0xffff7029,0xffff56c9,0xffff62aa,0xffff2d60,0xffff1ec6,0xffff6225,0xfffe2528,0xfffe61d6,0xfffc27e1,0xfffb6057,0xfffb4c7b,0xfffcc3ad,0xfffc1e9b,0xfffbd5d2,0xfffb4b4c,0xfffbeb3f,0xfffc10ec,0xfffc0070,0xfffc338e,0xfffc0099,0xfffaf438, -0xfffbc94b,0xfffc2a9f,0xfffd5be3,0xfffc3800,0xfffc3394,0xfffcb0d9,0xfffcabaf,0xfffd0694,0xfffaf353,0xfffb3d71,0xffffea5b,0x00005bdf,0x00011c64,0x00007688,0x000040f7,0x000027d1,0x00004b04,0x0000422b,0x000059a7,0x00004a78,0x00006baa,0x00007830,0x000129fd,0x0000212f,0x00006752, -0xfffd4735,0xfffb97e8,0xfffa93ad,0xfff8d2c2,0xfff7bab6,0xfff9510f,0xfffa5c92,0xfffa9e2f,0xfffbcaa0,0xfffb1a76,0xfff814f0,0xfff9f7e0,0xfffb32fe,0xfffe213a,0xfffba73e,0xfffb7a7f,0xfffcdb83,0xfffcb1b5,0xfffe4f8b,0xfff8b0d9,0xffff23d6,0x0001167f,0xffffa413,0xffffbe2b,0xffffc580, -0xffffec36,0xffffece5,0xffffe909,0xffffe3a9,0xffffe3ea,0xffffdfe0,0xffffe012,0xffffc31c,0xffffb58a,0xffffcf6f,0x00008501,0xffffeed8,0xfffc41a4,0xfffb10b3,0xfff8d588,0xfff68368,0xfff963ee,0xfffab81b,0xfffa6602,0xfffb9932,0xfff9ee1e,0xfff4f303,0xfff944a9,0xfffaf173,0x0001210b, -0xfffae948,0xfffbc1dd,0xfffec8b8,0xfffd68a7,0xfffe1ef8,0xfff82d43,0x00013f95,0xffff914c,0x00000d3d,0x0000264c,0x000015cd,0x00000bcd,0x000007dd,0x00000a91,0x00000c72,0x00000cfc,0x00000d53,0x000010c4,0x00001741,0x00002991,0xfffff9cb,0xffffe430,0x00004b79,0xfffb5a50,0xfff62375, -0xfff0ec8e,0xffec8b07,0xfff19a3e,0xfff59abb,0xfff73c36,0xfffab80a,0xfff7698e,0xffee7fb1,0xfff3b60a,0xfff94e9d,0x0002695a,0xfffa631e,0xfff98962,0xfffeaffd,0xfffdd032,0xfffc4200,0xffff3ad0,0x0000a2d9,0xffffcf86,0x00001a78,0xffffe5a7,0xfffff717,0xfffff993,0xfffffbc8,0xfffffac8, -0xfffff9dd,0xfffff95e,0xfffff9d7,0xfffff6b0,0xfffff665,0xffffe7d8,0x000010a6,0xfffff3e2,0xffffdbd4,0x0003e2bf,0x00083e37,0x000d3ba4,0x0011e682,0x00109bc2,0x000c3e58,0x0004f22d,0x000037d3,0x00014879,0x00045782,0x000aa6c3,0x0006af3a,0xfff72e87,0x00016a1c,0x0003f9b3,0x00057013, -0xfffd4e4b,0x000719ce,0x000361a5,0xfffe8b3a,0x00008619,0xffffcaaf,0x00001b76,0x00000056,0x000005be,0x00000237,0x0000035b,0x000003db,0x0000034d,0x0000050e,0x0000023e,0x00000c35,0xfffffec3,0x00001377,0xffffc55d,0x0000e237,0xfffa458d,0xfff30da1,0xffed55e0,0xffe986c2,0xffebd543, -0xfff377f9,0xfffde977,0x00093fe3,0x000be025,0x0004bb06,0x0000be4a,0xfffd12c8,0xfff8b7be,0x00017fa6,0x00072404,0x000bd8dd,0x000a77c8,0x00024b0a,0x00047302,0x00001318,0xffffc3c2,0x00002344,0xffffea09,0x0000019e,0xfffff970,0xfffffe84,0xfffffc26,0xfffffd25,0xfffffc4e,0xfffffd27, -0xfffffb1c,0xfffffcff,0xfffff2cf,0x0000121e,0xffffe1f3,0xffffff0f,0x00025c3a,0x0009b3c1,0x000e7d82,0x00126e7e,0x00108e0a,0x000823fe,0xfffb24e1,0xfff13b63,0xfff1a148,0xfffdacae,0x0006317f,0x0006bdd3,0x00011ef6,0xfff46281,0xffecf8fa,0xffef4b22,0xfffb60a7,0xffef156c,0xfff05ba1, -0x00033374,0xfffefeff,0x00006132,0xffffde42,0x0000196f,0xfffffc87,0x000008a8,0x000002e7,0x0000059b,0x00000467,0x000004a5,0x000005d4,0x0000047a,0x00000f6e,0xffffee02,0x00001223,0x00005319,0xfffb62d2,0xfff9fa9c,0xfff82f19,0xfff77582,0xfff8a93a,0xfffbc030,0xffff85da,0x000a9e06, -0x000e04d4,0x000c9285,0xfff77639,0xffefe621,0xfff73b97,0xfffaeace,0x00014002,0x0008ec16,0xfff497ab,0x000dff23,0xfff42043,0x0001f287,0xffff80db,0x00003cc6,0xffffd17a,0x0000047f,0xffffee57,0xfffffad0,0xfffff516,0xfffff7ea,0xfffff6c3,0xfffff798,0xfffff646,0xfffff55f,0xffffed5e, -0x0000029f,0x000025e7,0xffff2b84,0x00054276,0x0003ae84,0x0002ac48,0x000011d8,0xfffe5127,0xfffbd862,0xfff7f275,0xfff72728,0xfff617c4,0xfff8711d,0xfffaf044,0x0000bdda,0x00076cd4,0x000d26ac,0x0011ad3d,0x0017087b,0x0015d86c,0xfff9b675,0x00010b2b,0x0000ec08,0xffff3a4f,0x0000590b, -0xfffff9d9,0x0000288d,0x00000bc5,0x00001714,0x000010c7,0x000013bc,0x000011b9,0x00001220,0x00001300,0x000017bb,0x00001f03,0x0000131b,0xffffa438,0x0000533a,0x00060660,0x0004cdcb,0x00049736,0x000315a0,0x00018d89,0xffffa083,0xfffd8593,0xfffc553d,0xfffc53ec,0xfffca413,0xfffc26e1, -0xfffa9a63,0xfff8892f,0xfff69d5a,0xfff611b3,0xfff65bae,0xfff69533,0x0004b0cd,0x0006513a,0x0000d934,0xffffe3e0,0x00000cb7,0xffffa453,0xffffd6c5,0xffffce86,0xffffd684,0xffffd567,0xffffd542,0xffffd7a1,0xffffd688,0xffffd7e2,0xffffc633,0xffffc541,0xffffb175,0x0000e09b,0xffff3472, -0xfffbaa15,0xfffc6980,0xfffc0d50,0xfffc2841,0xfffb91f9,0xfffb190e,0xfffa80b8,0xfffa65f9,0xfff9f789,0xfff99127,0xfffaf066,0xfffc7042,0xfffdf7a6,0xffffa9a1,0x0001257e,0x0002c990,0x00046ece,0xfffcd85d,0xfffd1e16,0xfffe340e,0x00005957,0x00004b76,0x0000e226,0x000077b2,0x000088db, -0x00007082,0x00007951,0x00007289,0x000076a7,0x0000677b,0x00008106,0x000079b3,0x0000ec25,0x00006177,0xffffeab6,0xfffd1233,0xfffd4d59,0xfffd7478,0xfffcd667,0xfffcaef9,0xfffc517f,0xfffc217e,0xfffbe61b,0xfffc31c1,0xfffc6896,0xfffc597f,0xfffc2c2a,0xfffbc204,0xfffb4ac1,0xfffb9900, -0xfffbe2f9,0xfffbf96d,0xfffc4952,0xfffd15dc,0xfffd5239,0xfffbcb3c,0xfffbda04,0xfffc9b6c,0xfffed08c,0xfffe5fb0,0xfffedfa3,0xfffed35c,0xfffed91b,0xfffedd04,0xfffee211,0xfffee569,0xffff00d0,0xfffe538a,0xfffeaa86,0xfffc9b92,0xfffbac2f,0xfffbed99,0xfffcfe6e,0xfffc8192,0xfffc7c83, -0xfffc5dbf,0xfffc49c5,0xfffc32a5,0xfffc0726,0xfffc0a5c,0xfffc085f,0xfffc237a,0xfffc3196,0xfffc55f6,0xfffc665b,0xfffc934e,0xfffcafe7,0xfffce518,0xfffcf982,0xfffbc700,0xffff04d4,0xffff1cfa,0xffff2f40,0xfffeecd2,0xfffe6b9f,0xfffd38cd,0x00009bcd,0x00004871,0x000045ba,0x000048d8, -0x00004836,0x0000482a,0x0000483a,0x000048ce,0x000045d9,0x0000478a,0x0000a3c4,0xfffcff66,0xfffeb67a,0xffff6a5c,0xffff73ac,0xffff0c35,0xffff0de3,0xfffed014,0xffff2482,0xffff37b4,0xffff2bca,0xffff328e,0xffff1935,0xfffea931,0xffff18e7,0xffff5119,0xffffe126,0xffff6b78,0xffff58ae, -0xffff5143,0xffff53f6,0xffff4c60,0xfffebcce,0xfffe479a,0x0000b07d,0x0000cedd,0x000009af,0xffffcc5b,0xffffee91,0xffffe36d,0xffffe6d8,0xffffe55a,0xffffe702,0xffffe2f3,0xffffefdd,0xffffc8d9,0x0000111f,0x0000d070,0x0000a256,0xfffeccdd,0xffff633b,0xfffe7cae,0xfffe0c15,0xfffd9cb2, -0xfffe7355,0xfffedce1,0xfffeddd9,0xffff328b,0xfffee07a,0xfffdb0b8,0xfffeaddf,0xffff67d0,0x0000c27f,0xffffd759,0xffff831d,0xffff6f8e,0xffff5f3f,0xffff90d5,0xfffd91c0,0x0000d4b7,0xffffd707,0xffffbe87,0xfffff042,0x000013f1,0x00000706,0x00000929,0x0000096a,0x000008ba,0x000009cd, -0x0000083a,0x000008be,0x0000116b,0xfffff305,0xffffb6dd,0xffffeafd,0x000047d1,0xffffb485,0xfffeea93,0xfffe6485,0xfffd860d,0xffff22ef,0xffffb5d8,0xffff6883,0xffff7e7b,0xfffeb4a5,0xfffcc796,0xffff01b3,0x000014da,0x0002d2a4,0x00006491,0x00003645,0x000042ff,0xffffc3a0,0xfffef5f5, -0xfffd6b47,0x0000a5c9,0xffffb5a5,0x00003b23,0xfffffc0b,0xfffffd6d,0xfffff9d6,0xfffffd2b,0xfffffb7b,0xfffffc12,0xfffffc06,0xfffffbb1,0xfffffd5e,0xfffff4ea,0x000010bc,0x00000c80,0x00001e48,0xffffe258,0xffff21da,0xfffcba7e,0xfffb2761,0xfff9e15c,0xfffcb1b1,0xfffe8561,0xfffeaf17, -0xffff71e3,0xfffdc0ac,0xfffa311d,0xfffd11b6,0x00001ab9,0x00043460,0x00010b6a,0xffffaac9,0xfffff7f9,0xffffb9db,0x0000192d,0x000195f7,0xffff9860,0x00002d54,0xffffe010,0x0000043d,0xffffff1f,0x00000447,0x000000d7,0x0000029c,0x00000192,0x000002b3,0x00000096,0x000004e3,0xfffffdce, -0x000006f5,0xffffd7f6,0x000048b8,0xffff1547,0x0003b144,0x0006db8b,0x000831e2,0x0009bbc8,0x0007cdf4,0x00051992,0x00018a50,0x000017d7,0x00015901,0x000377b3,0x0007173b,0x0005d4b8,0xfffec967,0x0003e963,0x0004705d,0x0003c31c,0x00007f6c,0x00037e4c,0x00025f49,0xfffef0da,0x00007310, -0xffffd40d,0x00001818,0xfffff525,0x0000027c,0xfffffd22,0xffffff94,0xfffffe4c,0xffffff28,0xfffffe55,0xffffff80,0xfffffc60,0x000006a8,0x00000032,0xfffffe78,0x0000554f,0xfffd980c,0xfffa9747,0xfff8da4a,0xfff82325,0xfff8b268,0xfffbf1a5,0x00008910,0x00057be8,0x00064280,0x000264d1, -0x00007fbc,0xffff0cf1,0xfffd11b3,0x0002f0fb,0x00058a2c,0x000621eb,0x00056374,0x00013286,0x00014ce5,0xffffeb0c,0xfffff6fe,0x000001f8,0xfffffba1,0x00000245,0x0000010f,0x00000128,0x00000122,0x0000011f,0x00000138,0x000000ee,0x0000018d,0x00000141,0xfffffdbf,0xfffffc23,0x00000689, -0xffffb5e9,0x0001f48c,0x00052f66,0x00074603,0x00091731,0x0008a418,0x0005700d,0x0000233e,0xfffb75aa,0xfffb68fd,0x0000e795,0x00049fa5,0x00062f86,0x00064858,0xffffcfc9,0xfffbdaa3,0xfffd045c,0xffff2e1f,0xfff9cca9,0xfffab264,0x00015c82,0xffff90e7,0x00002f6e,0xfffff094,0x00000534, -0xfffffafa,0xffffffaf,0xfffffdcf,0xfffffe5f,0xfffffe81,0xfffffdd0,0xffffff5c,0xfffffb23,0x000007bb,0xfffffafc,0x00000fb4,0x0000102e,0xfffeaf5c,0xfffe17e8,0xfffde8d6,0xfffe09c3,0xfffe8b9c,0x0000017a,0x0001d964,0x0007ce81,0x0008de6f,0x000699c9,0xfffc4a69,0xfff92ffb,0xfffda1b8, -0x0002331d,0x00070a79,0x000c1213,0xfffef7a9,0x000d5db1,0x00004ff3,0xffffc426,0x000015c3,0xffffed2f,0x000000bb,0x000002fb,0x0000040b,0x000002c2,0x0000037c,0x000002ea,0x000003dd,0x000001ca,0x00000623,0xfffffeb3,0x00000985,0xffffd8cc,0x00003dd7,0xffff5c0d,0x00027513,0x0001ce60, -0x0000edde,0xffffc8be,0xffff0deb,0xfffe679d,0xfffd755f,0xfffd40e3,0xfffd551a,0xffff6795,0x0000936e,0x00041f47,0x0008947b,0x000c7c32,0x000f2243,0x0011ee43,0x0010b317,0xfffdca35,0x00012ed5,0xffff4a16,0x00005761,0xfffff2a7,0x000013e1,0xffffef2f,0xfffffc50,0xfffff831,0xfffff9cf, -0xfffff8e2,0xfffff9ab,0xfffff89e,0xfffffb39,0xfffff1d8,0x00000d25,0x000006a9,0x00003a88,0xffff406e,0x0002a47f,0x0002c6f0,0x0002ea46,0x00027885,0x00020193,0x000120a7,0x00001257,0xffff3bdd,0xfffeba89,0xfffe44e0,0xfffe1841,0xfffdb319,0xfffd9931,0xfffbc6c1,0xfffb2e67,0xfffb7519, -0xfffba2bb,0x000362f8,0x00045a9a,0xffff839b,0x00000d1c,0xffffb64c,0x0000050d,0x000012f6,0x00001080,0x00000de5,0x0000105e,0x00000e97,0x00001046,0x00000e25,0x00000fe5,0x00001463,0x0000027c,0xffffb52d,0xffffe488,0x00008976,0xfffe8840,0xfffea085,0xfffe5d42,0xfffe4444,0xfffdf780, -0xfffdbbd7,0xfffd6afc,0xfffd9e86,0xfffdb995,0xfffdcff0,0xfffeb3bf,0xffff7f24,0x0000683c,0x00012a30,0x0001e985,0x00029bbd,0x00036100,0xfffedeb1,0xffff85d7,0xffff4b1b,0x0000a216,0x0000a2ea,0xfffff3b2,0xffffbd00,0xffffdc19,0xffffd193,0xffffd506,0xffffd373,0xffffd513,0xffffd163, -0xffffdcba,0xffffbb3e,0xfffff639,0x0000adfa,0x0000d807,0xfffeaced,0xfffde710,0xfffe293d,0xfffdebe1,0xfffde676,0xfffdc41e,0xfffdb677,0xfffd9b79,0xfffde2f1,0xfffe239a,0xfffe542f,0xfffe7b2f,0xfffe965b,0xfffeb097,0xfffeba05,0xfffecbed,0xfffebd35,0xfffee693,0xffff059e,0xffff1055, -0xfffea403,0xfffe8046,0xfffdc451,0x0000c589,0x00007983,0x000077c3,0x00007a6d,0x000079da,0x000079d6,0x000079db,0x00007a70,0x000077ad,0x00007957,0x0000caeb,0xfffd96db,0xfffe38c4,0xfffe17ea,0xfffe8d40,0xfffe4caf,0xfffe4a9f,0xfffe3b3c,0xfffe31ec,0xfffe284d,0xfffe0fda,0xfffe30ff, -0xfffe4917,0xfffe6ce4,0xfffe8b83,0xfffeb014,0xfffedc7c,0xfffede07,0xfffee879,0xfffef944,0xffff0401,0xfffe5825, +const Word16 defaultHRIR_rom_azimBsShape_Q_fx = 15; +const Word16 defaultHRIR_rom_azimBsShape_fx[21] = { +21845, 21534, 20666, 19339, 17651, 15701, 13588, 11409, 9262, 7247, 5461, 3981, 2796, 1873, 1180, 683, 350, 147, 44, 5, 0, }; -const UWord32 defaultHRIR_rom_AlphaL32_fx[470 * 86] /*Q30*/= { -0x100cd6e0,0x03ada060,0x1363aec0,0x0eeb9f60,0x101f3420,0x0ffc18c0,0x10e4c040,0x113b8380,0x117faa40,0x10f36460,0x109615e0,0x1029fa80,0x0fd129a0,0x0f89b9a0,0x0f672bf0,0x0f4293d0,0x0f1fca20,0x0f0cc6c0,0x0edc4f60,0x0de07780,0x11af0240,0x02fb58f8,0xfd048398,0xf50b7dc0,0x06155418, -0xfd68e604,0xf5f7de90,0xf5a34550,0xf5febb10,0xf7c14d10,0xf5e3f200,0xf56df070,0xf5e14d60,0xfd7c6ae4,0x0836d5d0,0xf5ceff80,0xfc4e19a0,0xfa81c158,0x11195200,0x12a23f40,0x12b60200,0x13902ca0,0x1610a420,0x17304340,0x175cbae0,0x16139d80,0x14bec2c0,0x135466e0,0x123a1600,0x118c51c0, -0x1147b520,0x10ed2ba0,0x10739900,0x1066d060,0x0f427540,0x0f908120,0x0d5b2440,0xfc723054,0x07825ef8,0x05f29028,0x05698548,0x035f134c,0x06fd5468,0x07d6dce0,0x070d2a78,0x03aefedc,0x07bd4520,0x0acd1e20,0x06d3d4d0,0x07f90c48,0x04391780,0x03b60b90,0x0c5eb790,0x03ee4574,0x0ec7ef40, -0x16230040,0x148da300,0x169f11e0,0x1b4fb840,0x1d7312c0,0x1e01c8e0,0x1b969e60,0x190ef520,0x16d8fc20,0x14c347a0,0x13497120,0x129cad80,0x11d0a840,0x10e6c140,0x10d29440,0x0e540230,0x0f6c0450,0x08a62a30,0x02285aec,0x02c3d800,0x03268020,0x0391b0bc,0x000747d7,0x03c639b0,0xffbd4537, -0x065fbdb0,0xfebff18e,0x05244be8,0xffbce0c2,0x026b7e20,0x029aa9d8,0x035712c0,0x01a8e7fc,0x07551268,0x011aca3a,0x0e330110,0x17115340,0x1685ee80,0x1a0694a0,0x21b75480,0x25450e80,0x25bdbbc0,0x215558c0,0x1cfcf900,0x18f1c4e0,0x15929940,0x13880b00,0x12f32b80,0x11cc58c0,0x1099d1e0, -0x107970a0,0x0dea8840,0x0d3af3d0,0x074b9e00,0xff7b70c4,0x043e20e0,0xff296f1c,0x018e0988,0x0172e4c4,0x0148ca8e,0x00618182,0xfff7b9f3,0x02204190,0x004d3af9,0x02154c8c,0x025203ec,0x02c4b740,0x01b6cfbc,0x0294dcd0,0x06f2f438,0x03f574c0,0x160f67a0,0x1ecf6520,0x1e3abf80,0x20232dc0, -0x23f5e2c0,0x26956bc0,0x285268c0,0x28ed4dc0,0x276a82c0,0x21f222c0,0x219c43c0,0x1effa1a0,0x1aab64c0,0x19d37ba0,0x176c8160,0x153d2c20,0x1010d3a0,0x0f875ef0,0x08ad3750,0xff7e38a0,0x043c1268,0x01467eda,0x0134534a,0xffd2ef5a,0x006cdd4d,0x00828aa6,0x012704c2,0x01b981f4,0x00f1b331, -0x01e54d5c,0x00e25d4e,0x03e8937c,0x015708ca,0x043cf950,0x045d2090,0xff0df9d8,0x0d7c6610,0x213760c0,0x1f630c40,0x25c81380,0x28c41c40,0x29e7e080,0x28062400,0x25eb6000,0x22f2d400,0x1ef44980,0x1d9dda00,0x1d6fe760,0x1ea076e0,0x1cc7b0c0,0x1a6b86a0,0x1938b600,0x12d4e260,0x121601c0, -0x0888bca0,0x00da8ae1,0x027995c0,0x016604d8,0x03ae44d4,0x02cd173c,0x00e2038f,0x013fe9d2,0x00c84df1,0x009251a8,0x00e79b68,0x00a9eab7,0x031a6730,0x01a21452,0x06e49218,0x042b52d0,0x086aed50,0xfda90f94,0x12007de0,0x30778300,0x33169600,0x3d394640,0x34714d40,0x2f84b880,0x29e9cac0, -0x23915080,0x221959c0,0x276ab800,0x2c2892c0,0x2db311c0,0x2c287d40,0x25f39580,0x1f21b520,0x19348800,0x12f50020,0x139f9fc0,0x0825fec0,0x0398f6f8,0x04fdd260,0x00b726d8,0x01ed2c6a,0x01cda7aa,0x00e1b7ed,0x00be56ec,0x013a4284,0x01c12860,0x01793bf6,0x00ce1308,0x00a74fa6,0xfca489e8, -0x05279d10,0xfbcff270,0x08a6d380,0xffe153b4,0x1e95a9e0,0x39d2a080,0x35a27340,0x35985200,0x2e8e1e80,0x2b862a80,0x27ff8800,0x2908dc80,0x294e6980,0x284466c0,0x278a1580,0x25a47d80,0x224534c0,0x1efb4260,0x1ac112a0,0x16d48800,0x11f52b80,0x11f9ae40,0x09b06130,0xfe16548e,0x03a56fb0, -0x02dec940,0x0255bdb8,0x020400c8,0x00d95841,0x0251c3e8,0x00261bb7,0x0305b41c,0x0209b2f4,0x00f72f08,0x04d2f580,0x00e30b40,0x07f29e88,0x0072d1d8,0x08974570,0x055fe390,0x21d88fc0,0x31d25840,0x2cf8fd80,0x2c813080,0x25be7680,0x23252680,0x23bc06c0,0x2183a2c0,0x2355d980,0x27caf340, -0x252f2d40,0x22036280,0x1e4f6ba0,0x186ca3c0,0x13876620,0x10f6f8a0,0x0efdbff0,0x1117c260,0x0bcbc180,0x00175b15,0x0677f720,0x015afde0,0x0168f926,0x02ca1c8c,0x02713cb4,0x014ec258,0x02937a9c,0xff06af94,0x01e68946,0x01e1ca72,0x036f76ec,0x03905e2c,0x02bb1978,0x01e4b7d0,0x0ea7d720, -0xf8abcbd0,0x1652bce0,0x20f5cf00,0x1ada0fe0,0x1b7564c0,0x1aef0700,0x1b513b40,0x1ba69920,0x18ecc960,0x16267120,0x1502cde0,0x161ee420,0x17429480,0x172c9820,0x168d0ce0,0x146521a0,0x11fc51c0,0x0fd7b970,0x121180c0,0x0857cd20,0x0011263e,0x072149c8,0x013330dc,0x03807a04,0x03270404, -0x01d5378a,0x0185fdbc,0x0063c038,0x05bfb708,0x0277f27c,0x025c8518,0x04134e68,0x026612c0,0x04d6df90,0x04758498,0x0a12dcd0,0x07090788,0x0ecc8230,0x164a4c00,0x145e8ca0,0x17b9dda0,0x180cb120,0x192ff720,0x19e79b00,0x197d9d20,0x1953fde0,0x18be6440,0x1618fd80,0x13578220,0x100c5060, -0x0f4313f0,0x0dc93140,0x0d32d6c0,0x0be5fd60,0x0f6fa360,0x0a4dbc80,0x01c0adce,0x02a0b5b4,0x02b8584c,0x035e7f88,0xff05d42f,0x0368adcc,0xfe9c8b60,0x070b98a8,0xfcf773fc,0x04e3e358,0xff1497db,0x02217f4c,0x02ff5300,0x02fab638,0x0171cb8a,0x08446d10,0xf79d9e90,0x0f770be0,0x11a141a0, -0x11330be0,0x128b05e0,0x12ff43a0,0x13f7f700,0x14f37ae0,0x13aa81c0,0x126a0d60,0x1159e8c0,0x0ff722e0,0x0ec3f430,0x0cc02810,0x0d034ab0,0x0ce782c0,0x0d378290,0x0caab3c0,0x0d778bc0,0x0bfc4630,0xfb93bd90,0x08055ef0,0x069dbd68,0x064b3240,0x0418b7f0,0x08919e50,0x09d12340,0x081f22e0, -0x04213f70,0x090c9130,0x0c201240,0x07342650,0x0871b9d0,0x048acbe8,0x041380b0,0x0bfbb2b0,0x03a53d64,0x158df560,0x10774a40,0x11b0ba40,0x11df3fe0,0x122baae0,0x12680ee0,0x12ec5ec0,0x122f8a60,0x11bc47e0,0x113328a0,0x10d669a0,0x107f7a00,0x0ffdb4c0,0x1039e680,0x102e61a0,0x1034a8c0, -0x1032b640,0x0f809800,0x1413a4a0,0x02683900,0xfba0e968,0xf3244710,0x064efcf0,0xfc186c98,0xf3af1b40,0xf329cea0,0xf3d1b0c0,0xf609c1f0,0xf3bff4c0,0xf37ee660,0xf444e840,0xfc15678c,0x0845d520,0xf41a83c0,0xfb2e0638,0x13699e20,0x1dd3c2c0,0x20c05100,0x1ae6ae80,0x1c2d9f40,0x1d1806c0, -0x1de356e0,0x1e91b580,0x1edcca00,0x1f310e80,0x1e58a600,0x1ddbdf20,0x1d6c3760,0x1d032de0,0x1c94ee60,0x1c105100,0x1bb761e0,0x1b60dce0,0x1b0eef00,0x1abf3cc0,0x1a1c3e60,0x19619600,0x1ec9c380,0x1da519c0,0x153f85a0,0x1e0ee2e0,0x1d87a7a0,0x15861b00,0x161ad4e0,0x161c2460,0x16378b20, -0x17325000,0x17bb8ba0,0x17f94c20,0x1e4a1520,0x1eb8a440,0x1738ca40,0x1fa2d460,0x205ae300,0x21808700,0x206e4600,0x23802080,0x25745ec0,0x27eb0e40,0x28d0f340,0x28e3de40,0x26752d80,0x24caaf80,0x23a15800,0x2274f440,0x21211bc0,0x1fae8320,0x1e886e40,0x1d901440,0x1caa8700,0x1bc74fa0, -0x19ee4fe0,0x1b0c69a0,0x19620840,0x18860520,0x199ed0e0,0x17433060,0x16b25460,0x179ba5a0,0x1720e5e0,0x18a84880,0x18be8b20,0x1891bca0,0x177888c0,0x186a80e0,0x19e46980,0x1aa35960,0x1c466b40,0x1d1eccc0,0x20722a40,0x21b52f00,0x21858380,0x27a301c0,0x2c24b200,0x3179dd00,0x33039840, -0x33a17180,0x2f68d900,0x2c196900,0x29b65900,0x2753a000,0x25287e80,0x22675b00,0x205d0b00,0x1e609460,0x1ca48640,0x1a62e4e0,0x1748ea20,0x16680cc0,0x15aa1420,0x12257220,0x12621c00,0x10a429a0,0x0eb409f0,0x0f54d020,0x0d91c090,0x0f0f95c0,0x0f7253c0,0x0ef5db50,0x104d09a0,0x11fe94c0, -0x13863500,0x15444d60,0x1816b980,0x1bdbc600,0x1df9bf40,0x2391d400,0x23ad7cc0,0x2b945cc0,0x337dc680,0x3c8bc680,0x3f7b3f00,0x3ee4d140,0x36b10f80,0x30c5a740,0x2d39a9c0,0x2a111380,0x261db380,0x221e4b00,0x1f1e8860,0x1c4a79a0,0x19cc3d80,0x16708e00,0x12c33600,0x10d971e0,0x0c80e1f0, -0x0a8cbda0,0x07269500,0x06521fe0,0x04bbc908,0x03a76bf4,0x0360c4d0,0x02a3ad54,0x048a8ed0,0x049f4630,0x0699d558,0x09332730,0x0c38e940,0x0ffa87d0,0x10cea4e0,0x17314a80,0x28dbc080,0x27165400,0x2c75f5c0,0x38415780,0x4160bc00,0x42f04d80,0x464ab900,0x4a779700,0x4dfba580,0x4be85900, -0x413ff500,0x3f5a1400,0x3c92ba00,0x3b2eae00,0x351b1a80,0x308836c0,0x2cbf9880,0x26b3dd40,0x1f09cb00,0x18688160,0x113ac980,0x0d9a3320,0x0b2b8c60,0x07eb1798,0x05e59748,0x0437b128,0x0435aa40,0x04c113b0,0x06e8d120,0x06c6bf08,0x091c04b0,0x0b9c25f0,0x0ea2af20,0x133d1f20,0x1679b6a0, -0x1fc26f60,0x2c33a8c0,0x3478e000,0x3ae5b700,0x46a60180,0x4b9f6100,0x4e391c80,0x51c74d00,0x54b24d00,0x592b6900,0x5759eb80,0x5098b400,0x4f1baa00,0x49ab9180,0x42064600,0x394b22c0,0x3180b1c0,0x2b0f9440,0x26264640,0x214e96c0,0x1cb1b4e0,0x18415800,0x12a55b00,0x0f49a8f0,0x0b042f70, -0x0874d740,0x069360c0,0x05d625e8,0x05fac608,0x05fdcf70,0x079f5c90,0x087f77a0,0x0d5a8b40,0x106038a0,0x17388240,0x1c9e8e00,0x25380800,0x346127c0,0x422bf580,0x3abd1a40,0x3dcc58c0,0x3573b080,0x3daa66c0,0x41945680,0x4971bc80,0x501b7400,0x54753f80,0x523c9800,0x4775c600,0x3cff2f80, -0x342846c0,0x2e67dcc0,0x2a9346c0,0x2930db80,0x22f75d40,0x1c4f6c80,0x1ac5cf60,0x194902c0,0x144f5920,0x137eab40,0x0eac3090,0x0c024a10,0x0a2ea670,0x082c6fe0,0x08c39310,0x0cc49450,0x08def240,0x0a2b5ef0,0x0c9a5ea0,0x120951e0,0x1a80c100,0x233ff840,0x25aeff80,0x3a2a3880,0x39148fc0, -0x2799c0c0,0x30621900,0x28c24400,0x38a4f580,0x44ad3600,0x52c0ab80,0x5055a400,0x4c6fbc00,0x44960900,0x42055f80,0x3da727c0,0x374cf740,0x330ec500,0x2ced91c0,0x23c82180,0x1f4afd60,0x1abde0c0,0x1ce6a7e0,0x192536e0,0x1776a4a0,0x1583ff40,0x109fbb60,0x0e4efcd0,0x0ad1e070,0x095f41e0, -0x09ce5060,0x15c3cd60,0x0d17a680,0x0b30c070,0x0e760d00,0x100b8d80,0x17a901c0,0x1c3c9300,0x24d8cd00,0x35ea8140,0x32cc3680,0x31074b80,0x3ce322c0,0x3c47cb00,0x45e0d780,0x49f74680,0x4f0e2580,0x4b821e00,0x48768580,0x42f75680,0x3d60d200,0x379ca800,0x32cde840,0x2b90b540,0x2715b080, -0x22ea8540,0x263898c0,0x2500d1c0,0x255ba580,0x1c8a7e80,0x1c110140,0x150043a0,0x12c35ce0,0x130d5180,0x0ebee360,0x0b674e20,0x0d8de7c0,0x0d0a50b0,0x0fb9a3c0,0x119d6ae0,0x157dec80,0x179169e0,0x1922a500,0x1e945f80,0x299d54c0,0x367cbb00,0x35993000,0x37458e00,0x3e068180,0x3f036e00, -0x45b54b80,0x47f39d80,0x483d5e00,0x4948f400,0x48437f00,0x451fc280,0x3e14d7c0,0x36c2fcc0,0x30326680,0x2a964c80,0x27182d40,0x2578f380,0x296128c0,0x2aa50000,0x25e00b00,0x20d4a1c0,0x2040ff00,0x1c3cf8c0,0x188142e0,0x1308a0e0,0x0ee6f660,0x0e975e40,0x0d5bf940,0x15591520,0x11db8c20, -0x12d10800,0x15e27ec0,0x18495a80,0x1e3b0a60,0x211eca80,0x2b727180,0x2b5f44c0,0x340d80c0,0x36fb23c0,0x3a4ddb00,0x3d3ef080,0x3ed14ac0,0x3fe491c0,0x4158cf00,0x3e9b6b40,0x3bf01e40,0x39689440,0x36ce2200,0x3450d140,0x30f88300,0x2fac2c40,0x2de89400,0x2b56e4c0,0x2971a200,0x28bf4980, -0x26e91e40,0x2216dbc0,0x1ebffa40,0x1ca0a340,0x1ae7ece0,0x14e54fc0,0x191cd440,0x129bb320,0x1ab52e80,0x1474a360,0x173aa6c0,0x148967c0,0x157185c0,0x1a7a4520,0x1df29120,0x2191afc0,0x28813a00,0x23589680,0x32e72a00,0x30d3d7c0,0x32757a40,0x33469c80,0x3467e840,0x3581ffc0,0x37360d40, -0x361cf900,0x35a5eb00,0x34faa080,0x34005200,0x32f72600,0x31bb0a00,0x30554100,0x2ee3ed80,0x2db8dbc0,0x2ceee880,0x2b73ff00,0x2bc08d80,0x1d621ea0,0x25b4dc40,0x27575900,0x24edb8c0,0x22dfbe80,0x260fb240,0x26526940,0x28743540,0x25913240,0x286e2100,0x27855800,0x24d2a040,0x2774b800, -0x26025b40,0x27ed4400,0x2d639f00,0x2e72bc80,0x2f5fbf40,0x2d8cca00,0x2ed7cc80,0x2ed0a2c0,0x2f4e36c0,0x2f8db940,0x300a6200,0x2f71ae80,0x2f0bcd80,0x2e994b80,0x2e445e40,0x2df28580,0x2db02ec0,0x2d7f3e00,0x2d5e2e80,0x2d09d980,0x2cd8afc0,0x2b93eb80,0x2d8a7e00,0x2cd7f580,0x27e3f680, -0x160e8d20,0x2dffafc0,0x2832ef80,0x18344500,0x188b5a20,0x18481720,0x197b9060,0x193d4740,0x19b84d80,0x1a17bb60,0x28a5df40,0x2fe70f80,0x187c6040,0x2887d040,0x32be8940,0xfcd6548c,0x027067dc,0xf979f730,0xfd217bf4,0xfba5c328,0xfbc001a0,0xfaf9abf0,0xfaab5028,0xf9e50c50,0xfb308040, -0xfbd1eaf8,0xfc746a48,0xfca9d9f8,0xfccf4b74,0xfcd00f74,0xfc9d4624,0xfc9574d4,0xfc9e5644,0xfce7c280,0xfe34954e,0xfb13b068,0x03d66c28,0x0ae2dcc0,0x1b704b60,0x0055fc07,0x09a834f0,0x1954bea0,0x190b8280,0x1890fb40,0x171af4e0,0x17a9f7e0,0x17d2b600,0x175fb7c0,0x095839d0,0xfe15a824, -0x19d55300,0x0aa93bb0,0x1021e060,0xfa9f0af8,0xfb09aa68,0xf98fddb8,0xf8a4f660,0xf61093c0,0xf512a180,0xf3fa04b0,0xf7cada30,0xfa2a2880,0xfc0a3c90,0xfcdf9110,0xfd30e2a0,0xfcebf874,0xfc3b53d4,0xfc2a1da8,0xfc4d34bc,0xfd841040,0xfe770a38,0xfea402c0,0x0f598bd0,0x0462e7a8,0x03462ed4, -0x05816f68,0x07113ff8,0x01b9588c,0x01842204,0x00c53943,0x041116f0,0x0007c02d,0xfe9ba9c8,0x0303b700,0x01e08a38,0x0647ef58,0x05bfbea8,0xfe6ddfa2,0x0446d7c0,0xff2aee0e,0xfa444358,0xf9becdd0,0xf701cc40,0xf0a285f0,0xeeb20400,0xeba6cf20,0xf37855c0,0xf8cbc5d0,0xfc095fb8,0xfd924fec, -0xfdb64808,0xfd305ac8,0xfbbbcdf8,0xfb705df0,0xfb997358,0xfe748a48,0xff544dcd,0x044db668,0x08212370,0x09115ac0,0x06c004f8,0x05f64548,0x08eba0b0,0x045f1050,0x0938dcf0,0x02a181a4,0x08a89dc0,0x030940b8,0x06c9c230,0x04b943d0,0x0645aad8,0x067774d8,0x068d0958,0x0186a5a6,0x0962f2a0, -0x0207cc50,0xfc8aed44,0xf978f110,0xf3798320,0xe8255b20,0xe40415a0,0xe114b740,0xef992b80,0xf95dc520,0xfefef88a,0x00f16e9e,0x01c2997c,0xffdb3a43,0xfd28e684,0xfc872438,0xfcb32368,0xfffaf0ad,0x0294d8fc,0x0655c488,0x0b0cb930,0x070ea090,0x0985abb0,0x060d8120,0x04ee8160,0x04579a90, -0x044db270,0x04d1eed8,0x03474748,0x03d1562c,0x02d7e7c8,0x03ccb150,0x05b4ccd0,0x0692bdc0,0x070bef20,0x034c5cb0,0xfe97e1d8,0xf169a700,0xef08ec00,0xec91f860,0xe963ef80,0xe8e6a700,0xe78ced80,0xe354e9c0,0xe1a09960,0xe573f140,0xf8fa78c8,0xf2d6a470,0xf1b4ec70,0xf24fb170,0xf11b7a80, -0xf1c63ab0,0xf322a510,0xfa7ea0c0,0xfde6d134,0x05145a40,0x0e684aa0,0x09298b50,0x07deb368,0x06b642c0,0x066bd4d0,0x052f7c30,0x0582b5c0,0x04a6c530,0x03606494,0x0278e894,0x01b14ba2,0x036dcc9c,0x01a6e312,0x039d9d80,0x02d4ee80,0x024a62cc,0x0f8f2c00,0xf85f5040,0xd9c58500,0xd7af13c0, -0xdde82e80,0xe2f0a7e0,0xe317c300,0xde072b40,0xdd8e07c0,0xdf5aadc0,0xe6d533a0,0xe0efdf00,0xddcf52c0,0xdb787200,0xe0e89040,0xe7eab000,0xeda2f540,0xf97be0c0,0xfd4152b4,0x059b0d70,0x0bebba80,0x091da700,0x06b55018,0x03404740,0x0212b320,0x02c4abf0,0x026a37ac,0x04311dd8,0x08518cb0, -0x06b4ad08,0x08fcc610,0x097a6c80,0x0b371130,0x05e41c60,0x0b705920,0x04a4a110,0x06f570f8,0xe6e395a0,0xdb8ff280,0xe44e2f20,0xf551fa50,0xfa200cf0,0xfc134ea0,0xefae3f60,0xee539b00,0xe3d96f00,0xd3ded540,0xce689300,0xcf313e80,0xd4b27440,0xdc399440,0xe36716c0,0xe86b1840,0xf463c080, -0xfa71f1f8,0x04eac8d0,0x07039ff8,0x088bb070,0x0b61b3f0,0x078fb140,0x078e04a8,0x0a370740,0x0b9e2650,0x0aff9870,0x0e1a6010,0x08812b50,0x088bb0a0,0x09f19ba0,0x0ec325e0,0x04497be0,0x0aff5a70,0x0359c240,0xffbe0f99,0xee32e160,0xf8a3b490,0x026b89c8,0x2503a880,0x10bd15c0,0x014de348, -0xeeb9c340,0xeb443e00,0xe496c360,0xe20e0680,0xdb13ef80,0xd9181a00,0xdd1be2c0,0xe0a6d7a0,0xe8155ae0,0xf20138a0,0xf91d8170,0xfccb3ea0,0x024dc604,0x0fda2dd0,0x0b8dac80,0x0b4b74c0,0x0af46840,0x08e8d520,0x09bccc80,0x04f4d9f0,0x09c57030,0x133647e0,0x0a103d90,0x08cd4bb0,0x071c0910, -0x0bff1e00,0x060499a0,0x0d79b130,0x07e1bc88,0xffe630dc,0xf0a0b250,0xf864a770,0xfb9ca440,0x051c9c40,0x04815eb0,0x02126d6c,0xf314ec10,0xef4cec80,0xe6454cc0,0xe0365e80,0xe08737e0,0xe3754ec0,0xe717d9c0,0xf0075860,0xf65b8390,0xf9ec7108,0xfa12c5e0,0xfaa35220,0x01f5f0c4,0x13b18f60, -0x0a893860,0x0ff93720,0x0f41f480,0x0a954710,0x0bc3fde0,0x0b9b62f0,0x0b0dcc10,0x13f19a00,0x0bedead0,0x0a87e400,0x06ce8748,0x07b1f6a0,0x0a47ac30,0x0bcd1960,0xfc02a488,0x10d62640,0xfba7a0c0,0xf7614020,0xfed54f14,0x05544008,0x02758d24,0xff19e5cc,0xf827bf48,0xf3120570,0xf0e39ed0, -0xf0229f60,0xee9736c0,0xf0121a20,0xf3c69160,0xf72a9590,0xfaf99f18,0xfd2b8b24,0xfefa2674,0xfa777388,0x074a2f80,0x144923c0,0x08808270,0x0f4da750,0x0b305be0,0x0c7ca640,0x0e61b190,0x0e83ec80,0x113aa840,0x086ddb30,0x0f570db0,0x0e2cabe0,0x086519e0,0x0bf46e30,0x0898ebd0,0x0bc9a4b0, -0x0323d588,0x132b0940,0x059010f0,0xff4bc8af,0x045d7778,0x041da6f0,0xff18389a,0xfb1d9f28,0xf86ba3b0,0xf80a99f0,0xf78346b0,0xf735f3c0,0xfa5bc700,0xfcf4ab30,0x0063f14b,0x01b3506e,0x04537048,0x065a8950,0x06a9a2a0,0x007b1124,0x0574eb70,0x10e15e40,0x102e8e20,0x0f62d500,0x0e57e2b0, -0x162c31a0,0x0ca9ac70,0x16816440,0x0740e260,0x15cf1c60,0x0c2112a0,0x159a17a0,0x11c89fc0,0x125a6b60,0x13173660,0x16d27200,0x0ec18bc0,0x2a104e80,0x019f5e16,0x02485f1c,0x02a5213c,0x0215ef10,0x029c46e4,0x02cc9808,0x025b0d18,0x03e23378,0x0534df28,0x063bdb08,0x0814d740,0x09d364b0, -0x0cc20510,0x0baa03f0,0x0acb31c0,0x098562f0,0x08b86ba0,0x07128d58,0x069b1880,0x24fd8f00,0x0cd9a750,0x0b81c590,0x0ce67de0,0x0f1fb720,0x04cdd6e0,0x042281b8,0x04db67d8,0x0c720c50,0x04f6de90,0x020a512c,0x0a6b0820,0x094a6c30,0x11d0b7c0,0x12561620,0x05cb8ce0,0x0edb8b00,0xf76d98b0, -0xffcce243,0xfdc35de0,0xfdeb47bc,0xfdf1fc78,0xfe06eeb8,0xfe0140c8,0xff0000e9,0xffd990cd,0x00d578e4,0x0163f8b4,0x01dfa246,0x02c26a64,0x018f3354,0x00f1577c,0x00522ec8,0xffd2ac7c,0x00ff6a54,0xf8e4e778,0x0f5a2fc0,0x1c1dd0a0,0x3603e780,0x0776d6f8,0x19959be0,0x319eb740,0x323c3140, -0x319d5ec0,0x2e5a9f00,0x312ec600,0x318b3980,0x3033ce40,0x1a39edc0,0x04a15910,0x34d3a180,0x1e4795e0,0xfc0f46c0,0x0752ff60,0x02e94ba8,0x0a39fd70,0x07569800,0x07c3c810,0x0702e840,0x077289e8,0x075e5930,0x072409a8,0x06402f38,0x05b57588,0x055a4e50,0x055ee4f0,0x058563c8,0x0600b990, -0x063f7e98,0x06913888,0x06dfe3e0,0x071e58d8,0x06bff020,0x088b18e0,0x022a1824,0xfe591196,0xf8641d68,0x03d89b60,0xfebc57e0,0xf8fc7df8,0xf914f770,0xf9476460,0xfa1cc228,0xf90b9140,0xf8b18ac8,0xf8f6c0a8,0xfe9a1618,0x0530c8a8,0xf81ba9e0,0xfde3794c,0xfc414724,0x0a2c7e60,0x0a256610, -0x09c26490,0x089adde0,0x092c8d00,0x084cbfb0,0x07852278,0x059dbf70,0x049847f8,0x041ebbf8,0x041a2368,0x04b89588,0x062ec668,0x06e12438,0x079479d0,0x082a7730,0x0887ae50,0x08b8f8c0,0x07f6f520,0xff352579,0x04814a98,0x04287a38,0x038d6f44,0x02c5ac50,0x049215b8,0x055d4ca0,0x055fad40, -0x03d546d8,0x057a5fc8,0x068a4650,0x044938a0,0x046d2210,0x021ac688,0x025d10f4,0x07ee5390,0x074cccd8,0x0c298410,0x0f4bb020,0x0be490a0,0x09245c90,0x0ad24ff0,0x09dc6d70,0x086c04f0,0x03738608,0xfff35eaf,0xff1a32f6,0xfefba38e,0x00185ebd,0x02c2958c,0x0449bb10,0x063ab278,0x07b773e8, -0x08a9cda0,0x097faab0,0x07115e80,0x04358dc8,0x03d193b0,0x037ece78,0x045e3360,0x0306d7c8,0x03cfecec,0x0303cc4c,0x06640860,0x0343753c,0x05252140,0x02249644,0x03e36e40,0x02f6a8c4,0x03e9b2dc,0x03c46ed4,0x0867db60,0x073a50d8,0x0cb6a560,0x107f4a20,0x0e436b60,0x0a15d6b0,0x0ac26f00, -0x088feb10,0x0707e3b8,0x01a29060,0xfef52902,0xfeab9eb2,0xff989609,0x01492d3e,0x05b15cf8,0x07a02d90,0x095f7dd0,0x0abf3b40,0x0ba32040,0x0b6afdc0,0x095e4b70,0x0635f0b0,0x05d17b10,0x044a5bc0,0x0501e938,0x054bc110,0x0436f5f0,0x04816bd8,0x0437f660,0x06051838,0x042e1b80,0x04c5b898, -0x054813b8,0x03b361f8,0x035b4f60,0x055943a8,0x0c343ee0,0x13008c80,0x2b4706c0,0x2aee6700,0x22749ec0,0x1e9fd620,0x1dec7780,0x17cd6740,0x1104b660,0xfea38584,0xf0b6e820,0xe0dbff60,0xe4c84b20,0xe6df4fa0,0xe8154360,0xee946840,0xf5d3a630,0xfcdd7af8,0x00ae9783,0x04689db0,0x03781064, -0x01bfa59e,0x04288028,0x052d7818,0x03cda368,0x02d21e84,0x03059da4,0x040901b0,0x04b0a0e0,0x04a5f668,0x0433ae00,0x063b34a8,0x0787c350,0x0e4fb140,0x0e3f2370,0x10debb00,0x10b378c0,0xfeb4f3ba,0x1898eba0,0x3d34e600,0x389cd740,0x2c90ad00,0x1ba9d4a0,0x0ffe2a10,0x1028bca0,0xfe476a12, -0xf70c3300,0xf1202540,0xf6176f60,0xfd6fef24,0x07f63728,0x0d397c70,0x0f085ea0,0x0f2fa4b0,0x0b85bae0,0x0b599030,0x07ded0a0,0x00b0ba29,0x0183b0a0,0x0263d870,0x0542cad8,0x055c86b0,0x027f0668,0x0435ace0,0x049a4630,0x07503bc0,0x06b9ee58,0x066b76d8,0x06aaf4b0,0x0452f070,0x0953bbe0, -0x05522060,0x0cc27030,0x0a482f60,0x29357d40,0x3701a740,0x26410640,0x0e4600c0,0x0e379ef0,0x0fe949c0,0x158f62a0,0x09977410,0x057a9710,0x09dde680,0x135e3880,0x1848f600,0x1a245960,0x1b5b6900,0x1bc985a0,0x1b157700,0x18c27f20,0x17d53aa0,0x0ebff930,0x0a9e47d0,0x090388b0,0x02649f5c, -0x04d25258,0x03cf372c,0x021a8610,0x04b26268,0x06400650,0x0a774ed0,0x06ce7290,0x05875178,0x05936260,0x0110e528,0x092234f0,0x01ff90c8,0x0e009700,0x1427f640,0x1fcddd20,0x0b0659c0,0xff4337e1,0xe9e77460,0xf7225d80,0xfab59808,0xfcc249cc,0xff22b5e8,0x05e50e58,0x0cf8a470,0x14fc2840, -0x18f2b7a0,0x19351840,0x17861060,0x1663f140,0x188d79a0,0x17bf8080,0x17c35320,0x0f383590,0x05003470,0x069d3338,0x0537dbd8,0x05814dd8,0x05a0ebc8,0x05f2b558,0x05bb9ea0,0x066a21f8,0x09f2d200,0x07cace18,0x0856cba0,0x0a09cf10,0x07e2db30,0x0a4129b0,0x07fadd18,0x0d671da0,0x0c2572f0, -0x09b23f90,0xf742f310,0xf147bdf0,0xecdf8940,0xea6b43e0,0xe8c508e0,0xedf25ca0,0xf34c7920,0xfda7f3e0,0x0a063780,0x1125cf20,0x16033860,0x18387140,0x19cf4400,0x194c8460,0x1a07baa0,0x1044a100,0x0ae38510,0x02a80064,0xfce2c40c,0x000d12ed,0x0135eaaa,0x00688c26,0x00beb449,0x0286fecc, -0x0705b0b0,0x06b97d60,0x05709990,0x041b6bf8,0x040e2d70,0x02df84bc,0x07f895e0,0x0a4bdff0,0x095055a0,0x0e20b7e0,0xfb9c3d80,0xf9eadf78,0xf31c66c0,0xeeecdfa0,0xeaf23fa0,0xeb3d8880,0xec38cc40,0xf0d50c40,0xf983d150,0xff010234,0x03f5ee54,0x0af68480,0x10435ce0,0x13142f20,0x15f70000, -0x152fec80,0x1266b9a0,0x0710ff60,0x0362ef44,0xfc394420,0xf9db3100,0xfe3aa632,0xfb313340,0x00209336,0x02d725f4,0x0459ade0,0x04fa2bb8,0x04196928,0xff0c1f81,0x006daf93,0x017d54f0,0x04a95190,0x0007d4e2,0xfe6722bc,0xfec58340,0xfde4891c,0xf5af1a70,0xf2660fe0,0xf06a21b0,0xed8ac940, -0xe9e27d80,0xef994980,0xf4be7d50,0xf8e1f768,0xfec4fd56,0x048f93e0,0x0aa1ef00,0x0b7bea30,0x0ce15ea0,0x0f0f0e90,0x0ba53140,0x08789530,0x06b36788,0x04b09ad0,0x0426e090,0xffe24a66,0xfca7ffa8,0xfe2a73e4,0xfe932b00,0xff261dc3,0xff8d0aad,0xff5cce16,0x0044b622,0xff84e588,0xfff4698a, -0x0119096c,0x00f03bb0,0x01bf47de,0x0019415f,0xffa33110,0xfd921f98,0xf8b8fe78,0xf3403540,0xefd4fd60,0xf0e19550,0xf05262c0,0xeff2e640,0xeefae520,0xed836dc0,0xec462ae0,0xeca1cc60,0xecacb060,0xed320c00,0xedb28c40,0xee5cc420,0xef024ce0,0xf01025c0,0xf19c03b0,0xf2b6cf70,0xf35fea00, -0xf46eef00,0xf4e86980,0xf7e46590,0xf7d85fc0,0xf73e1ef0,0xf7dfb410,0xf8c64ad8,0xf8b74590,0xf8a5d030,0xf7636960,0xf6d3eb90,0xf6a44f20,0xf7514ff0,0xf6847280,0xf55f3780,0xf3e5fb70,0xf3a6c3a0,0xf2d97640,0xef868220,0xf259e260,0xf257f080,0xf2019c50,0xf22dce50,0xf1cc62f0,0xf1b5a990, -0xf15b1ae0,0xf1a742d0,0xf1c50e40,0xf1c6de70,0xf21c04b0,0xf261a940,0xf29265f0,0xf2e86530,0xf303e010,0xf344d8b0,0xf392cd70,0xf410e720,0xf473fa00,0xf1c8cc10,0xf1156d00,0xf56dfbb0,0xf24261a0,0xf12e8d70,0xf44a5e40,0xf3f3d010,0xf4121240,0xf424c4c0,0xf3a87bc0,0xf34de950,0xf360e3d0, -0xf075f3f0,0xf11fba30,0xf3f04040,0xef5fcea0,0xf1982900,0x082a8450,0x09884470,0x06546b80,0x07cdbca8,0x079146b0,0x07da6b80,0x06cd5dd0,0x068c3ac8,0x06e47d80,0x07763820,0x07d1da78,0x07fe07c8,0x08327cd0,0x085520e0,0x0852e2f0,0x08488340,0x08209350,0x07eaf5e8,0x07830c38,0x07574808, -0x069714a8,0x08c335e0,0x098973b0,0x097b2f40,0x08619f60,0x0968c070,0x0952a360,0x09a59f50,0x09bbb750,0x09b31ab0,0x09f46770,0x0a290d40,0x0a334d40,0x09a8dfd0,0x0830d980,0x0ad9c2c0,0x0aff4a90,0x0e383b90,0x07db8350,0x07c75e50,0x07c46d40,0x07c69b80,0x05926178,0x05925f48,0x07157cb8, -0x0819b3d0,0x08eed9e0,0x092e1ed0,0x09c78710,0x09ecf230,0x09caeb70,0x09e2e1e0,0x09889d80,0x08e35ad0,0x07f3eb70,0x072a61a8,0x0723b708,0x098dfbe0,0x081b9eb0,0x085083e0,0x08093ac0,0x080cb810,0x077a17a8,0x07bc5990,0x07fc49e0,0x0898d410,0x076cec60,0x068d4a10,0x076e2248,0x07e72c60, -0x096ac810,0x0aaa6eb0,0x085aa380,0x0c2e6dd0,0x07bdba28,0x04b78a30,0x06b5ad68,0x079b92b8,0x037c8d38,0x0285c354,0x05e435e0,0x0826a4e0,0x09aeffd0,0x096458c0,0x0a886170,0x0b9e98b0,0x0c061430,0x0c786440,0x0bd96d20,0x0a8e4a70,0x08ac3e20,0x06d45010,0x06b08a98,0x083ca890,0x072d58e0, -0x07b30700,0x0705d418,0x06d8bc08,0x05ee25c8,0x06fbb5a0,0x06bec1a0,0x07f784d0,0x05b71530,0x06980ad0,0x06d16828,0x07d95170,0x0879a270,0x0b986e00,0x0a14c870,0x0c5257f0,0x066de978,0x013dcd2a,0x0321146c,0x059bf9c0,0x02573954,0x02c9e62c,0x0774e0a8,0x0894d400,0x08b0e340,0x080096f0, -0x08e9e300,0x09bcbc30,0x0a3acef0,0x0b842dd0,0x0b24f730,0x0980b7b0,0x07455970,0x0576cba0,0x04f51120,0x078924c0,0x06ea4790,0x05b64950,0x05cbe2b0,0x054ef390,0x0414ea48,0x0506ac60,0x04e52d20,0x058d8a38,0x03711c18,0x02983fd8,0x038da698,0x05a453f0,0x090cabd0,0x0a7f9a70,0x05e68768, -0x1888b960,0x0013b43e,0xf5bc4e70,0xfa8930d0,0xf3e7e770,0xe9507800,0xe89198e0,0xf0f56e00,0x02d278e4,0x0ff14f90,0x1294e300,0x15246d60,0x184a2480,0x1c5928a0,0x1cd96fc0,0x1ab79fa0,0x177dc1a0,0x10fddaa0,0x0cab69e0,0x0a944140,0x07d6de10,0x077d1488,0x06a66920,0x0610f688,0x054d0310, -0x0319b4ac,0x04d01410,0x0590adc0,0x06c3e2a8,0x06e63508,0x0819eef0,0x0b6be9a0,0x07d806b0,0x0c3e6c60,0x0cef6f40,0x127b2080,0x1c1eda20,0x010da5fe,0xd3bdec00,0xd4a16080,0xcb713880,0xdc9f5600,0xeb0d00c0,0xf701a3a0,0x084470d0,0x11bc21e0,0x185027e0,0x19e71680,0x19619620,0x16ce0200, -0x136a7620,0x1070aae0,0x0e1c6e50,0x0a761ce0,0x0861f5b0,0x0a0d9b70,0x0bc27520,0x0993de30,0x08a490e0,0x0650a050,0x0584cb50,0x054725f8,0x06bdd968,0x06addd98,0x06d55a88,0x0609be58,0x067a9210,0x03ffed84,0x08d80c20,0x04de49c8,0x0b0897d0,0x0613fc48,0x07a43418,0xe018d6c0,0xb4e42a80, -0xbf518280,0xc7752480,0xcede9500,0xd061b140,0xd54da100,0xe75870e0,0xf4685240,0xfe7d17fe,0xff9f6e03,0x033b3ab0,0x07a3fc80,0x08ce4ba0,0x09823d00,0x098c31a0,0x097d6fd0,0x076e8710,0x0b0326b0,0x0d391390,0x0add5100,0x09f182b0,0x083aa670,0x067afb88,0x02fd259c,0x01eabe4c,0x03fb62c0, -0x0a7557e0,0x071ed7c8,0x070a7050,0x06a79fa8,0x0d9cf440,0x0228ce94,0x0f3bd6b0,0xf9ee4ff8,0xeb56c640,0xc6e7e740,0xcc40e6c0,0xd234cf00,0xd94beb40,0xd5841f00,0xd7c75c80,0xde3ddc40,0xe27a7620,0xe52d59c0,0xe8623d80,0xe9cab260,0xefebc560,0xf8d7f168,0x02163348,0x074f9008,0x05e00400, -0x08d7f780,0x083a4c80,0x0acd96c0,0x0b416530,0x06442a40,0x068e2e90,0x06a26508,0x06da6308,0x054e6b90,0x08ed6370,0x0760ee38,0xff5afd58,0x039ec884,0x049b0260,0xfe8ff602,0x04699830,0xfc092634,0x00e1d30d,0xf30790d0,0xe6e33b00,0xdedbd000,0xe1026180,0xe1319840,0xe2d018a0,0xea355e00, -0xf3149e90,0xfab4b608,0xfddb75c8,0xfaf72b28,0xf2b38420,0xf14c5040,0xf1ec0370,0xf61ef720,0xf764b690,0xfc3ae8d0,0x01c4eaec,0x09fbf6c0,0x0b5f37f0,0x09976610,0x087a4be0,0x079b3828,0x0718fda0,0x0557d740,0x0570cbb8,0x03d6bb70,0x04f00208,0x0408bda8,0x010a107c,0x02fcfb74,0x0212be0c, -0x00441400,0xfae7e9f8,0xf8a5cfe0,0xf634f030,0xe7e06480,0xf672e050,0xeeea1780,0xefcd5740,0xeeae0de0,0xef029380,0xf4af9430,0xfaa54488,0xffac4016,0xfedd5272,0x00e20590,0x029b7024,0x002f5753,0xfe421dc0,0xfef0a01a,0xfcb0ac98,0xfcd3d2fc,0xfe5f1126,0x03aef27c,0x053063b8,0x0729e478, -0x04db8ba8,0x03333eb0,0x046c2ec8,0x01c4cb68,0x011e91b8,0x01ea9142,0x01ab8cda,0x015aaeae,0x01ff1d1a,0x015ce1e0,0x01dd22a8,0x011ba620,0x010ff110,0xfea26ef4,0xfbf77370,0xf8a43128,0xf4e51fa0,0xf74f62f0,0xf897a510,0xf75cb3d0,0xf75056c0,0xf7009580,0xf5907710,0xf4436c30,0xf28e3ed0, -0xf07b3170,0xee1d2940,0xee6a5440,0xeeded000,0xef252f80,0xf0dfc340,0xf2a9fe40,0xf32349f0,0xf51818e0,0xf597e830,0xfacd1538,0x0051f157,0xfe2c21ac,0xfe904ae6,0xff7d65e7,0x004cd33b,0x0019f61c,0xffb91aa0,0x000f4b54,0xff4582f9,0xfefaef36,0xfdb7d18c,0xfdc629d8,0xfae7c550,0xf9160cc8, -0xf62ea9d0,0xf70762f0,0xf6cc6a20,0xff6f71e1,0xfe96e2be,0xfdf1faf4,0xfd7ef730,0xfd07121c,0xfcf9512c,0xfcd2cebc,0xfcb717d4,0xfccfa3f4,0xfcbdbaa8,0xfc724828,0xfc0115f0,0xfbc5b6d8,0xfb8a58d0,0xfb083d28,0xfad48fe0,0xfb77c048,0xfbbe3630,0xfb5b2368,0xf85ac2a8,0xfc1b0cb4,0xfd2a99d8, -0xfcb3edcc,0xfd5be954,0xfff02899,0x00403a34,0x0032b496,0xff88915a,0x00c43e7d,0x01c6faf2,0x00952a90,0x00372b82,0xfdfc90e8,0xfd37b4ac,0xff8d1f31,0xfbb18990,0x0212f410,0xffea1f6b,0x0018d524,0xffd5db70,0xff92be21,0xff3d58b5,0xfeebeff8,0xfe7156e2,0xfdf32d7c,0xfd896594,0xfd0c91b8, -0xfc987f48,0xfbf7c188,0xfca1e97c,0xfd4c996c,0xfdd6afec,0xfdf11dfc,0xfe2022f0,0xff531e92,0xfaf64f48,0xf91e8d90,0xf44d6950,0xfde86500,0xfa822078,0xf5de2a20,0xf5bf95f0,0xf6051a50,0xf64cb360,0xf5fde200,0xf5b71c70,0xf6147600,0xfaaa58d0,0xff3b2437,0xf3949aa0,0xf8e23230,0x00ee5aee, -0x022c16e4,0x029518c0,0xfef54ad4,0xff9ae5c6,0xff423c2a,0xff58e4e0,0x00c99a1f,0x01d2f62a,0x02da8670,0x03788fd4,0x03e1b308,0x04061198,0x03881e40,0x032702d4,0x02d249c8,0x02961928,0x025c85d8,0x02350f50,0x01fd1072,0x022226ec,0x016a83be,0x045cbcc8,0x05a9b2e0,0x08334500,0x037c2220, -0x05544708,0x07a159a8,0x07c0e078,0x07aa6a00,0x074f9b18,0x072ccdc0,0x07118aa8,0x06e39280,0x052dc448,0x024ce450,0x07a07bf8,0x049a4ec0,0x0380984c,0xfc5b7f84,0xfb7d69c8,0xfbaf5718,0xfc698990,0xfff91308,0x02eccd74,0x054ca370,0x07435118,0x07c6f8e8,0x07355880,0x05c4bc50,0x04d49ba0, -0x0431e810,0x03956aac,0x032fed00,0x02fc1318,0x027519f0,0x023c4fe4,0x02b2166c,0x063d4698,0x041b3618,0x043d35a0,0x041666c8,0x048e4bf8,0x039907e8,0x03cf0004,0x03fc133c,0x04a64fc0,0x037c9630,0x02d4b044,0x03298844,0x022a1cc8,0x028d8b24,0x02d76ba8,0x000f045d,0xfc2d37a8,0xf7e0a9e0, -0xf47693d0,0xf4a85f50,0xf549cb90,0xfc3cdbe8,0x02763a2c,0x070f75d8,0x0b8689c0,0x0e3e47f0,0x0eca5050,0x0ca195f0,0x09fd19e0,0x08114230,0x06164230,0x04a757b8,0x03d7c3ac,0x02c3d8c0,0x028119c0,0x03ed644c,0x05011f20,0x05ca5768,0x04f64ef8,0x042e39e8,0x04df5880,0x03c644a8,0x05a3bc10, -0x044bcce0,0x06069a08,0x03c42034,0x03ed3f9c,0x02da8d14,0x021dd220,0x017c1052,0x0098457d,0xfd216778,0xfa32cb38,0xf478d760,0xf231bd60,0xf2350280,0xf2f3f230,0xfcc7933c,0x059d5ab0,0x0c9a85d0,0x12ebf8a0,0x151adda0,0x12fc3a60,0x0ec82150,0x0be582e0,0x09a0a430,0x07394b98,0x05a5eb18, -0x05260c20,0x036a0858,0x03783e10,0x04c22030,0x054ea448,0x051001c8,0x068b3ab0,0x04db4778,0x044582d8,0x03f38364,0x04e96328,0x053c3bf0,0x050081a8,0x03827c30,0x029b47f4,0x01f37cc8,0x0017ec02,0xff54765e,0xff304adf,0xfc4522d8,0xe7707980,0xe2525de0,0xe2596cc0,0xddab7b40,0xe1704560, -0xef6b78c0,0xf93b0000,0xff0a98aa,0x051c8cf0,0x0c4d7ab0,0x1c74d520,0x1b775140,0x187b7dc0,0x126e0fa0,0x0bda9ba0,0x06f47610,0x041aee30,0x02e39228,0x02b60e10,0x05e88488,0x09a45a40,0x07a6c520,0x06bb29f0,0x061fd528,0x05b7b090,0x041a6778,0x05bd2468,0x058d1800,0x04a226a0,0x03457408, -0x0146d40a,0xffd8c19d,0xfdec0840,0xfa944e88,0xf7963d10,0xf1e738e0,0xdf06e640,0xe108fca0,0xfa2c9948,0xfb5a54c0,0x079164c8,0xfd5600d4,0xf2fdc350,0xe232b8e0,0xe74b3100,0xedb591a0,0xf73bb8d0,0xfb710048,0x007516d0,0x043557d8,0x067370e8,0x081918d0,0x080f3ac0,0x08ab4980,0x076fb300, -0x064ef228,0x072997e8,0x0718d5d8,0x056b4e78,0x05254d58,0x04a3e480,0x035c1eb0,0x049ef940,0x05527f78,0x06ef4db0,0x04df3d08,0x03cb7d98,0x02a97f64,0xff833eb7,0xfbb8ce40,0xf54d34f0,0xee3d04e0,0xe0e5a240,0xf940af88,0x285f9f80,0x22119040,0x20860ec0,0x07061740,0xf8b99c68,0xec38a5a0, -0xe5f234e0,0xe8002e60,0xec9d53c0,0xf0a676a0,0xf35d9780,0xf4858620,0xf5443d70,0xf8c1b378,0xff6d9966,0x022c6ffc,0x03dace0c,0x05b54fa8,0x050f5bc8,0x04f25290,0x0712c070,0x06237888,0x06420b98,0x057d4d48,0x05aa96f0,0x058fca60,0x063de9e0,0x020d9a98,0xffded384,0xffd1cd0f,0xf7b0c190, -0xf8dc6178,0xeac9cce0,0xf73019b0,0xfbe59148,0x2324be40,0x258d86c0,0x17ded0c0,0x08229d50,0x0aa72670,0x0c6ae010,0x0b2ce9d0,0x07237060,0x053cdf98,0x01f9473a,0x0648a4d0,0x058d6ff0,0x00a53a14,0xff1617fd,0xfe5d5a36,0xffa615bb,0xfddc5430,0xfca0009c,0x006d1259,0x056ef068,0x038cd89c, -0x033881ac,0x02ae2784,0x022ea824,0x0213bd74,0x059f91e8,0x0636e000,0x01e522fc,0x0561d418,0x03778cac,0x023f8dac,0xfda6afc0,0x023b9ba0,0xf8e6fef0,0xfe5a1c48,0x093892d0,0x179274c0,0x1612b560,0x1062bbc0,0x0d7c67f0,0x092fcd10,0x0544b258,0x04fb45b8,0x03f7ad00,0x08e79590,0x119535c0, -0x122ae860,0x103611c0,0x0bc07120,0x07131040,0x01390124,0xfa0ee9d8,0xfb3570a8,0xfbf7f548,0x00f081d1,0x06248ae0,0x01d4beea,0x02054f68,0x04461d20,0x04293e60,0x03de3014,0x03c67700,0x03e2ca04,0x022bb374,0x012b451e,0x00efaa7e,0x0426c2c8,0x02dd8cf8,0x018caf22,0x0169f40c,0x11400340, -0xfcc58504,0x0e396ba0,0x0e7b37b0,0x0b3cbec0,0x0b534530,0x042d0cd0,0x0057a2a4,0xfeb0d45e,0x008bd1f2,0xfff44313,0xffa1612c,0x01147834,0x019233c0,0xffeebe5e,0xfd137c30,0xfba93900,0xfaa8d828,0xfd0a5dc4,0xfe859b76,0xff5b8b89,0x023708c0,0x029a634c,0x031fe030,0x022e9d60,0x02923858, -0x03753d20,0x0174f314,0x00cd87d8,0x03118cf8,0x0291a918,0x01fcacce,0x015da352,0x017b676a,0x032551c0,0x010f06da,0x04457ed0,0x0621bef0,0x06e992b8,0x08c8ad60,0x08a48180,0x09aa8760,0x07f34690,0x071ea260,0x059c84c8,0x053622a8,0x05461610,0x05be6458,0x03d50140,0x01c36ade,0xff6d6db7, -0x0083e326,0x00d90d9a,0x019f24dc,0x0130942c,0x03ce9b88,0xffa5a467,0xfab59540,0xfe2d8cc8,0xff403336,0x004b9043,0xff164842,0x027403d8,0x0087cb94,0x03ff8cfc,0x0130fb0c,0x028f1d10,0x00e06449,0x0137c59c,0x02a2f644,0x0353b51c,0x048e3ca8,0x066108e0,0x028d0738,0x08fe72a0,0x08f83d10, -0x09299280,0x098a8550,0x09cc6710,0x0a258d70,0x0a9bc850,0x0a1fb370,0x094e3660,0x08997c90,0x07d718e8,0x074144b8,0x05955578,0x065d98e8,0x06dac7b0,0x07a7f638,0x07a30830,0x0888e860,0x09095f20,0xfff4854a,0x05e11fb0,0x060122a0,0x06817930,0x05737d60,0x077a00c8,0x0718a520,0x073c04c8, -0x063f94c8,0x072a9318,0x06e89108,0x06365008,0x06660d38,0x05e87570,0x05e23fc0,0x07347768,0x08a5e120,0x0943b710,0x0836e080,0x08b7e160,0x08b94390,0x08ff99b0,0x09334160,0x097f1590,0x097fe1d0,0x09a747b0,0x09b95100,0x09dd0600,0x0a0bbad0,0x0a3d6320,0x0a227e60,0x09d3d230,0x09967cd0, -0x09a0c430,0x08ee8a00,0x0ab8dbb0,0x074bac98,0x05535c28,0xfffc58b5,0x082a1b00,0x05d17ed8,0x01e5d3c8,0x01f58db8,0x0215f3f4,0x0298d27c,0x02730ffc,0x02b760c0,0x02dcd1b4,0x060b9060,0x087073d0,0x0233ef34,0x065abd38,0x0997d970,0xfd6ee660,0xfe3e4d82,0xff3130f5,0xff22a044,0xff627728, -0xff630689,0xfdc4bbbc,0xfc9d9d00,0xfb3482a0,0xfae83d70,0xfad4e140,0xfb3200d0,0xfbd96840,0xfc5b0e48,0xfcb12d0c,0xfd007280,0xfd36e2d0,0xfd4a3a84,0xfd90a388,0xfde0bb10,0xfd6d3c68,0xfe0046ea,0xfeb713fa,0x01629196,0xfda3adb8,0xfeb023b0,0x0126b318,0x013ad8e6,0x0146a0da,0x0114ddba, -0x0128e000,0x00ff13a1,0x00ea8ca9,0xfe6a23ce,0xfe1e8980,0xffcdacc4,0xfe3cda3a,0xfc95edfc,0x00dd4e68,0x02f4702c,0x029648a8,0x023e11ec,0xfdf5ea60,0xfa4ca470,0xf69971d0,0xf4ec51c0,0xf51c4450,0xf728b920,0xf94b7e50,0xfaa891b0,0xfb278b48,0xfbe7a9a0,0xfc666c84,0xfc834afc,0xfd5efae8, -0xfdc1c4d0,0xfdd97638,0x0065643e,0xfeaea126,0xfec3fdfc,0xff190d0a,0xff8c03ab,0xff053d25,0xff7cfffc,0xff842560,0xfff4ba75,0xffb97141,0xffac2242,0xffd843f7,0xff0153e0,0xfed6bd00,0xfe0c5088,0xff836edb,0x000de964,0x02bd68b8,0x0a858a70,0x08973710,0x07eb9368,0xff2913dd,0xf7c6bb70, -0xf07613c0,0xed71c9a0,0xedd84740,0xf0eb3a10,0xf4659f00,0xf76f0650,0xf86b2b60,0xfa41bc28,0xfb359060,0xfb80dfa0,0xfd697874,0xfdb98bd8,0xff211a5b,0x001c3f60,0xffea9aff,0xff571797,0xffb05de8,0x00e585e6,0x000b951b,0x0220e8fc,0x018a6190,0x02af75cc,0x02691424,0x02d46b84,0x02af5634, -0x007c1ba0,0x0012d84b,0xffbb77d0,0x023f0be4,0x01f12156,0x07750410,0x114714a0,0x0f1adb10,0x0d3065e0,0xff11fa52,0xf35bdd60,0xe7ca6260,0xe32032c0,0xe5f951e0,0xee341080,0xf4b0e2d0,0xf810f2b8,0xf87e3058,0xf9d252d8,0xfb160b00,0xfb27dd50,0xfd627998,0xfdd19a64,0x00705862,0x03ae49dc, -0x01655b5a,0x03bc7ee8,0x022bfd84,0x026e0edc,0x02206c4c,0x03c64428,0x04dd8200,0x04d0d680,0x045867b8,0x040ee348,0x04661658,0x01252e1c,0xffa06edf,0x01b40aec,0x05bc6010,0x0312b9cc,0x119b2360,0x16bbc460,0x178cbb60,0x171b6500,0x0ae2a950,0x00e546e9,0xf677f300,0xee2042c0,0xe4b1c0e0, -0xdafc9900,0xe03c3f20,0xe53957e0,0xed259420,0xf11bdb60,0xf4c112e0,0xf6680170,0xfc1ecaa8,0xfd4052c4,0xfe17db96,0x00877028,0xfe75eaca,0x01187404,0x01aa7334,0x0331a614,0x03355800,0x04275dd8,0x03fdaaa8,0x0390b558,0x041322c0,0x04d6fae8,0x04cea330,0x07842408,0x071ebe58,0x05570c98, -0x00b4452d,0x05a35cb0,0x0e1d0520,0x063378b0,0x02cec43c,0xf6da1570,0xf6533a50,0xfa97ddc0,0x0803a390,0xfb95ce08,0xefcca5e0,0xdf3d5cc0,0xe18663e0,0xe0d03700,0xe0be0480,0xe6b60060,0xecda8d20,0xf2606770,0xf69b1680,0xf773f3b0,0xfc09b394,0x01aeebea,0x01c8ecb2,0x03628234,0x02a1bf60, -0x0361f594,0x03de104c,0x04e04a00,0x053d6cc0,0x04f742f8,0x01fbf548,0xffd34c83,0xfd84d068,0xfc55ccc0,0xfd5753dc,0xfe3b4a48,0x0350eb7c,0x1355ea20,0x03ee41a0,0xd95ac1c0,0xd93d6480,0xd47db900,0xf650d940,0x0a64f3b0,0x1f3599a0,0x1f659000,0x19f50c20,0x10967440,0x0ccca8d0,0x07422608, -0x0187024e,0x01bb4b04,0xffb854fc,0xfbdece08,0xf83f1000,0xf4a03f70,0xf782be00,0xf9cb4e28,0xfa474de0,0xfe29170e,0x0022b778,0x025c3b08,0x01bfa982,0x06800ee0,0x0642cc50,0x0156d7d4,0x04393248,0x04c8d460,0x01c6db5c,0x06657a08,0x05ac6e38,0x0ccf0c20,0x028c8710,0x03244bec,0xe1cb8e80, -0xdce35240,0xecaf0620,0xf606d1d0,0xfda8fa4c,0x04552178,0x10fec4c0,0x18bdce00,0x1faefe80,0x25b7e580,0x1e98aac0,0x18f697a0,0x14fb2760,0x0f7f15e0,0x098429b0,0x043dddc8,0x0258fe08,0xff358104,0xf8eccb10,0xfb877790,0xfba8c9b8,0xfb070848,0xfcb2a848,0xfdd89b34,0xfe2af222,0x0346b1fc, -0x055a4f28,0x0243ed8c,0x04dcaa78,0x047f7578,0xfec58fd4,0x0253c460,0xfd76409c,0x02ad4b44,0xfe0b35f6,0xff27d8eb,0xf6235110,0xf91ff180,0xfbb0a758,0xf5f55240,0xfaa88100,0x001dffc1,0x06bf0e40,0x0e49ed50,0x1142cbe0,0x0fa1dc20,0x1185cac0,0x12b31380,0x11c4b1c0,0x11772ba0,0x0f11aa70, -0x0c61f770,0x01baefa8,0xfc41c428,0xf810dd08,0xf9155820,0xfb1bb9a0,0xfe30b3f8,0xfebd17ca,0x00459950,0x03104cec,0x04209400,0x0470a048,0x05efad30,0x05997c40,0x059fe418,0x0358d224,0x02fe3694,0x022be4ac,0x023b80c0,0xf670de90,0x09c75010,0xfa9a0ce8,0xfb2d1bc8,0xfda31250,0xfab1d870, -0xff025ec6,0xfff3cc9c,0x005b494d,0x0024c5fe,0x0292e90c,0x050bba80,0x055046c8,0x05fef340,0x07e14730,0x09fb7f50,0x0a90f100,0x0af8bd40,0x05f056e0,0x04218618,0x02ba2ea0,0x01118eba,0x02ee5960,0x025108e8,0x05941568,0x06071b80,0x0475ba70,0x051e67b8,0x04db7188,0x03c02720,0x0215ac6c, -0x0173e386,0x0199b962,0x039270c8,0x03a3dbcc,0x053cf480,0x02f21bdc,0x0105b2aa,0xfff670ae,0xfe312d4e,0xff6f9247,0xff777616,0x00751de8,0x017c6f4c,0x033b3124,0x03cfd144,0x042a0530,0x04979898,0x072c54e8,0x09ceb600,0x0c91b3e0,0x0bb59ca0,0x0b6b8b80,0x0b757630,0x0cbc9e80,0x0cba1b20, -0x0e177d10,0x0d7c6d50,0x0cc1cac0,0x0c1cf260,0x09afe4f0,0x08558dd0,0x061d1170,0x06419038,0x03083b6c,0x04883618,0x02b38dfc,0x044b29e8,0x02e8ce14,0x026e5664,0x01fbd1a2,0x01f306c2,0x00133182,0x087b4750,0xffa3f9c3,0xff717942,0xffa6b9d5,0xff7097c5,0xff81a9da,0xff52a0f8,0xfef47526, -0xffdb1e7e,0x00f30607,0x01ca6494,0x02d98924,0x03b0c784,0x0568d6f0,0x059d6530,0x06205a60,0x06130580,0x05f82230,0x0546bfe8,0x06031258,0x0a91fcb0,0x058e0018,0x04e6be50,0x046dabf0,0x044e8f08,0x01cb111e,0x0182ec82,0x01b69806,0x02a56d88,0x0148fba2,0x006ece7b,0x01df6d08,0x01a5e302, -0x03392084,0x03a77a78,0x0158f4a4,0x02ce768c,0xfee53004,0x00c9c1a0,0x005f650a,0x006e623c,0x0060ca2c,0x00647283,0x004b6017,0x00c78401,0x0116160e,0x017e6bda,0x01c2e3a0,0x02039e74,0x02499640,0x020b95ac,0x01f9ff3e,0x01ffeb78,0x02274480,0x0281cfd8,0x01503ea0,0x05f31a20,0x07c3ef98, -0x0b491210,0x035d7158,0x063c17e8,0x09ac02e0,0x09de3850,0x099c56b0,0x090f47b0,0x097179b0,0x096d18d0,0x09073560,0x0577bb58,0x0182641a,0x09be4ba0,0x05c9a080,0x00e5b785,0xfe4e9524,0x000d38c7,0xfe59a920,0xfefd4598,0xfe850e8c,0xfe53390e,0xfdb7bd00,0xfd9f5d28,0xfde6e450,0xfe078566, -0xfe0d9648,0xfdfc11f8,0xfdf68e94,0xfdf4e10c,0xfe0ef3ec,0xfde9ce00,0xfdea66f4,0xfdf8dcf4,0xfde8f0e0,0xfdf61320,0xfdec2438,0xfe978e90,0xfeb22afa,0xfe185700,0xfef06a6c,0xff12c7e2,0xfe7c3f36,0xfebb2950,0xfed6c5e4,0xfec6bfe4,0xff0101a3,0xff226c16,0xff107ba2,0xff9b880f,0xff710f99, -0xff653ea1,0x0046cc12,0x0464bb80,0xff9f47d6,0xfed45b58,0xfea3316e,0xfdcb9ea0,0xfc12473c,0xfbb9b0d8,0xfcf287a0,0xfd2ebefc,0xfd6f1174,0xfd441e70,0xfd2ffe70,0xfd55a678,0xfdcdb948,0xfd8f8290,0xfd5f4998,0xfd485c94,0xfd0d4884,0xfcf711d0,0xfd358794,0xfe0aabae,0xfe1aa4d8,0xfe829f08, -0xfecf85ea,0xff2e4c69,0xff756d51,0xffce96e0,0x00208db1,0x001a5d4b,0x002dfa91,0xffd39262,0xffc4d892,0x007aa2ef,0x0138347a,0x02199d94,0x00f952e9,0x05754520,0x0141d2b0,0xfc8c3348,0xfd7952a8,0xfc8078a8,0xf9683a38,0xf9a6dbf8,0xfc120984,0xfbb3d1a0,0xfa9ffcd8,0xf99c2c80,0xf96ea0d8, -0xf9b38800,0xfb0cc140,0xfae64e20,0xfb4638e8,0xfbbaec90,0xfb5a5ff8,0xfb603758,0xfc0d48c4,0xfd2c6974,0xfdd66ef8,0xfdfa6b8c,0xfef05f20,0xffd34248,0x0026593c,0x0115d2a2,0x011d9e3e,0x0181d800,0x015cf444,0x01dee2d2,0x01251d72,0x022135a4,0x02699424,0x048229c0,0x02f8aa80,0x0a8d3680, -0x02460590,0xfb549f08,0xfe13cb34,0xfd3bd3d4,0xf8269ec8,0xf68f5d10,0xfae37258,0xfa265560,0xf90156e8,0xf79f29a0,0xf785f9c0,0xf8cd3dc8,0xfb8380e8,0xfbb4bdb8,0xfb933690,0xfbbcd1f0,0xfb142368,0xfac031f0,0xfac0cd80,0xfd83f94c,0xfd9eb3bc,0xfeca39bc,0x0021a626,0x010d26fe,0x00abfb45, -0x02b52264,0x03f11930,0x03b99aac,0x033d3fb0,0x02fc19ac,0x02dccd48,0x05101988,0x07e94150,0x080c07d0,0x058fa4b0,0xfbb21058,0xe8515ca0,0xe24396a0,0xe355d8c0,0xe2aef1c0,0xedbe6f00,0xf720eb10,0x00b5e72b,0xfbe265e0,0xf97de388,0xf4e66ee0,0xef40dd40,0xed0aab60,0xeaf72240,0xefaa8da0, -0xf29ce950,0xf3c0a770,0xf53e4300,0xf6a7b230,0xf8342728,0xfbf38850,0xfd4db9a4,0xff5dbc25,0xfff27796,0x016c4cac,0x02cde770,0x0394bca0,0x03ced824,0x0380f708,0x03bcff58,0x02c94ac0,0x01911c66,0xfc07b81c,0xfb50e0c8,0xf94168d8,0xfc2b385c,0xf76fa480,0xe8fc1fc0,0xe49a04a0,0xeab20ca0, -0xfbe99210,0x01b1e26a,0x052200b0,0x07b469f0,0x13c397c0,0x1e5101e0,0x2b240bc0,0x237a18c0,0x1f429e80,0x1b136060,0x1301e700,0x0a6a5dd0,0x02e01a94,0xfd2ddfb0,0xfc02fc34,0xfa870060,0xf7b08e10,0xfb6cacf8,0xfd1dd00c,0xff855ae2,0x01952efe,0x02575ba8,0x04d17770,0x05003da0,0x02c9d410, -0x0211ebbc,0x00e96f9b,0xffb61251,0x01edad94,0xff54eb34,0xfdfe1f68,0xf6e39fd0,0xe489bf40,0xe947e660,0x13193f20,0x1c08d0c0,0x2bf44f40,0x15c98a00,0x0e31b0d0,0x06778550,0x0eb8ff90,0x15f9a5c0,0x1ebd0840,0x21a7dcc0,0x254260c0,0x27af76c0,0x265af980,0x20a50fc0,0x16f88180,0x0dbb8b60, -0x09fd6d50,0x0093243d,0xfb431838,0xfae0d7d0,0xf77b3dd0,0xfa65c928,0xfb89e9e8,0xfc7935e0,0x02953c80,0x04584a70,0xff495d9f,0x046510c8,0x02ee61d4,0xfe280460,0xfc139ac0,0xf96a88a8,0xf32b6cf0,0xf5986d50,0xf4961c90,0x0e1fcd50,0x1d402660,0x1262d9a0,0x13470660,0x0460bfa0,0xfdafdfcc, -0xf70c4580,0xf7f3b070,0xf8584848,0xf6cf2870,0xfe15cef2,0x03aaf538,0x07ee8048,0x06f8e458,0x07aa3518,0x0a29cff0,0x07806cb8,0x073ff3a0,0x0587d9f0,0xfd58ce50,0xffc72009,0x00918f3f,0x01405b34,0x02bd93a0,0x02295138,0x047d57c8,0x03932780,0xfd46981c,0x01d2b92c,0x015f4c92,0x00bc0baa, -0xfeb8a856,0x00226823,0xfc03e7ec,0xfccd2b48,0xff7bf6bd,0x04bad8f8,0x058fd2b8,0x06946e60,0x0bddb990,0x0037b993,0xf891f630,0xf0c16d30,0xec0cd780,0xe9a1ccc0,0xea09ab20,0xec79e540,0xeed89d20,0xf30e7460,0xf8002530,0xfcad9030,0x00c1b24e,0x0400c340,0x06165ee0,0x07269e38,0x02acf160, -0x04ff93f8,0x03eeae80,0x02137a38,0x01b44f44,0x00cf22d9,0x01e7095c,0x01fa3604,0x02e3d4d4,0x033bad2c,0x017f3fe6,0xff2ae96a,0xffcacaf5,0xff617b2c,0xfd5df4c0,0x036c4864,0xfb70d998,0x03c55b68,0x02b0bfcc,0x009d421e,0x00641035,0xfd8275d8,0xfd416bc0,0xfc95ec9c,0xfaea8aa8,0xf8106fd8, -0xf5a925f0,0xf5683240,0xf55321e0,0xf4b7b1c0,0xf64c9490,0xf7e70fb0,0xfa0281b8,0xfe09ba48,0xfedc4300,0x015c95e8,0x04228a10,0x0156d17a,0x021c0a40,0x013b5cec,0x01016812,0x01e4e328,0x0332d158,0x03b3ed34,0x01905590,0x02cb5744,0x025dd3a4,0x00d9a906,0xfed579be,0xfe547d36,0xfebea168, -0xff5e2644,0xff346ead,0xfe93513e,0xfe24e754,0xfc558d3c,0xfb1eb538,0xfb059eb0,0xfa168c20,0xf8c643e8,0xf9894058,0xfa3d1828,0xfaa7c650,0xf9f31fa8,0xf93395c0,0xf85b0f08,0xf9a4b270,0xfae7e700,0xfb804aa8,0xfb1942c0,0xf8e59ec0,0xfb2b2ba0,0x0032a512,0xfe96b2a4,0xfe5dd200,0xfee39b00, -0x01429e8a,0xfefd0904,0x00d0fbf3,0xffd24364,0x00e2b89e,0x00a16823,0x000ece63,0x00217033,0x005d74bc,0x0080ffdf,0x00a6925d,0x005c6c49,0xfc4e65e4,0xfdc5f458,0xfe2db6f0,0xfdfe9734,0xfdedc530,0xfdbed1d8,0xfde6ef88,0xfe0ae2e2,0xfdf12ac8,0xfda020cc,0xfd894728,0xfd5c3cbc,0xfd6a58f4, -0xfd518f18,0xfd01e2a8,0xfc8d17ec,0xfc669b7c,0xfcdd0d94,0xfd24bab8,0xfcd2b610,0x015a0e64,0xfeffb158,0xff374254,0xff0c05ce,0xffe66da1,0xffa177b7,0xff878c33,0xff0545b5,0xff0f57cf,0xfe71a068,0xfe790258,0xfdf43d88,0xfde412c0,0xfd9b32e0,0xfcfe0884,0xfd1ee3fc,0xfe323d14,0xfde59258, -0xfd87c4a0,0xfd8d27b4,0xfd8f9acc,0xfd781120,0xfd4f6734,0xfd2a30b4,0xfce156c4,0xfcb01b40,0xfc78e7a0,0xfc58b3e8,0xfc2d5210,0xfc0710f8,0xfc4b85dc,0xfc8fbdf4,0xfcb21500,0xfc9b7df0,0xfcea0658,0xfc124fd0,0xfd40063c,0xfe22ec6c,0x008e4bf2,0xfdc30cc4,0xfe9a3d42,0xffedc5b0,0xff9633c3, -0xff7ad90f,0xff2da738,0xff11584c,0xfeeb93e6,0xfed12204,0xfdec74f8,0xfdc38fd4,0xff18b5a1,0xfe25f9c2,0xfd2eb96c,0x001734d1,0xfccee084,0xff4268e2,0xfea4e76e,0xfe9b4740,0xfe200c3e,0xff7e80b5,0x002811c2,0x00d804cd,0x00e270c5,0x01170fae,0x0130585a,0x0153a118,0x0155ebf6,0x0161657c, -0x0135deb2,0x010dc77a,0x00e3119e,0x009e759e,0x004b485d,0x012e2a1a,0xfdf73d94,0xfd2090cc,0xfcb4f5a4,0xfe69270a,0xfd41f784,0xfd3b2968,0xfd22dc78,0xfd3d74dc,0xfd5f935c,0xfd29d000,0xfd099134,0xfce18c94,0xfd4878c8,0xfe33739a,0xfd63e61c,0xfca369a0,0xfb2d7d38,0xfb4d80b8,0xfb4d5050, -0xfa5eaaf8,0xf9a4fe18,0xfd59ccc4,0xff7d7097,0x012bf2c8,0x01a10684,0x01ee99ba,0x01e59fe6,0x027d0af4,0x02e26298,0x0331b3d4,0x03028ed8,0x02aacb6c,0x025c432c,0x0181c1da,0x0172ba28,0x00e1213a,0xfce9031c,0xff5bead8,0xfed081e2,0xfee10484,0xfec5f4ae,0xfffb3411,0xfffb8e5c,0xffd4457b, -0xff29676b,0x0033949c,0x008a860c,0xff1e39f6,0xfea04fd2,0xfd91ee5c,0xfd9287c4,0xfdbf1414,0xf876d848,0xf79614e0,0xf8009908,0xf6addaf0,0xf4e86690,0xfd0ff434,0x00d3158c,0x046ab2a8,0x048c13c8,0x0577dc00,0x05c855d8,0x06fcb7f0,0x07385d58,0x077371f8,0x069740a8,0x058ff728,0x049f4290, -0x02c72b1c,0x02a9c11c,0x00dc4a3a,0xfe471ea0,0xfee5ea70,0xff723d8f,0xff0c7891,0xfed81ae4,0x011699be,0x00341891,0x00f2837e,0xffb19959,0x0137fd58,0x001e43fe,0xfebef826,0xfe5ed584,0xfe3764be,0xfc9975ec,0xfa991b88,0xf45c59a0,0xf18995d0,0xf1dae2c0,0xecde5860,0xe95011e0,0xf5e5d680, -0xfdef376c,0x0368b0f0,0x04334570,0x03b67cb4,0x029c3030,0x050b7e60,0x06f4f4a8,0x088a5910,0x0854f0a0,0x0771f868,0x06876238,0x046c5850,0x0445e310,0x025d45b0,0xfd753944,0x003650cb,0xfe4389bc,0xffa8098d,0x0054d4b9,0x01b150aa,0x024f0e28,0x033f84e0,0x02d8018c,0x03734004,0x032f9b08, -0x0082ac39,0xfe980520,0xfc2c1760,0xfb628ac0,0xf9a32278,0xf34c6000,0x0334949c,0x0bdb6900,0x0d3a5fe0,0x16a34160,0x17a99d20,0x15705840,0x10d13d40,0x1632f460,0x1b2005a0,0x217fb540,0x219f8600,0x1f778460,0x1c3bf100,0x1539ef20,0x0ff6d4a0,0x0ca96190,0x06f6cd08,0x055c9240,0x016e2406, -0xfc9eef34,0x00d56288,0xffea9133,0x012376ae,0x01c659fe,0x03142348,0x0410f900,0x03c07a14,0x0220d8d0,0x0182e014,0xff1805a3,0xfbd9dce0,0xfe5669dc,0xfc66b780,0xfbcb5d78,0xf78bb270,0xf9ecd010,0x0bd8d6b0,0x21379540,0x1d0e3600,0x13f069c0,0x0b35da00,0x07a6cd58,0x028b6240,0x01d9c6ca, -0x04a40d58,0x06ea2128,0x11ba10a0,0x16e56280,0x19285dc0,0x15bb1020,0x11d37ca0,0x0c25ac30,0x0a59d970,0x08d15200,0x06216008,0x0259c1a0,0x00029d38,0x00767009,0x017931f0,0x02773f08,0x01d0cbee,0x03a8df40,0x04072f88,0x0287979c,0x01b7f13a,0x00f675a3,0x010ea2fc,0xfe7409bc,0xffdfff08, -0xfde3cb60,0x02986c34,0x13a95100,0x1a11d3c0,0xfeffd2e6,0xf2737720,0xe57cb940,0xec2138a0,0xeff9f1c0,0xf5874f40,0xec5bb180,0xe761e700,0xe0bb4e60,0xdfbc8b80,0xe076d5a0,0xe5a979a0,0xe7548a80,0xec903e00,0xf3766e90,0xf9da8718,0xfbb9ba00,0x02d8f548,0x04b04a08,0x0367af9c,0x03018ba8, -0x01378118,0x00b385fb,0xfefe0b22,0x0209ccb4,0x0323ef10,0xfe9e3cd0,0x03c58ae4,0x0336ae54,0xffe5c7b6,0x004b29a7,0x04eba3b8,0x05e157c0,0x09162130,0x0c2a3690,0xfb5cbae0,0xed04c260,0xf257c0d0,0xec2ac2e0,0xf486f310,0xf59c1240,0xf6a248d0,0xf1a76730,0xedd735c0,0xeb2c1120,0xe789dc60, -0xe4fea040,0xe4a55a00,0xe78b7420,0xeb1cb8e0,0xed56b220,0xf0d0caf0,0xf32f4d50,0xfb949f68,0x031101cc,0x00102cb5,0x0235a474,0x01064b5a,0x013b630a,0x02662830,0x023dfff8,0x02c68b68,0xff51bee6,0x030de740,0x0377e26c,0x028d4330,0x030179d8,0x0185e46c,0x02e73954,0x05057c80,0xfcd89c70, -0xf7ea7620,0xf70670b0,0xf6ed6d20,0xf540f6c0,0xfd2b71b4,0xffacb383,0x00dd4cfb,0x019e38bc,0x018d084c,0xffecd269,0xf982a9d0,0xf59bd340,0xf3641120,0xf0b86fe0,0xf0ae0960,0xf128a8b0,0xf523a7f0,0xf74a7290,0xfaafaa30,0x020b4278,0xfe0cbefc,0xfea2da04,0xff9a0df1,0xfee64402,0xff57c447, -0xff9ac766,0x00781211,0x00ef221c,0x019429b0,0x01a9a350,0x017b23d6,0x00d70c0a,0x007950ab,0x018a4528,0xfb060df8,0x0164f62e,0xfb306918,0xfbbb4c40,0xfd067870,0xfe257260,0xfdc738a0,0xfc4de224,0xfc1b3548,0xfeaddc46,0x00624d08,0x00c8999c,0xffeefe24,0xff694d1c,0xff6768e5,0xfeab570e, -0xfd7d26ec,0xfa97d3a0,0xf8e11e38,0xf82cb1b0,0xf946b520,0xf9c163b8,0xf9ca3a70,0xfb9110a0,0xfbaba888,0xfd9e2a3c,0xff3da320,0xff4a4495,0xff95bf9e,0xfffca2c8,0x00eadf30,0x013bab0c,0x00f61055,0x00584784,0xff283e67,0xfe8801bc,0xfdf1ab44,0xffc8111d,0x0071be43,0xff8b1ef9,0xff3c23ba, -0xfe958d74,0xfe6090ac,0xfef7f68c,0xffa668c8,0xfe7d7a14,0xfdaad610,0xfd3b5584,0xfda73750,0xfe16fbdc,0xfee794de,0xfdf16a88,0xfd300648,0xfd06a6dc,0xfc62d098,0xfc506f08,0xfa72feb0,0xf9b0d198,0xfb11d110,0xfb84bd70,0xfc853738,0xfcfaa0f0,0xfe06bfda,0xff0550e0,0xfff3a8f8,0x0191bf32, -0x00d809d2,0x011661e6,0x00f42948,0x0090ffd7,0x00406e23,0xffa881d2,0xff776748,0xff602cc2,0xfe6db616,0xfe4b436c,0xfeaba2b8,0xfee0985c,0xff1e64e6,0xfeead3a4,0xfee4aa38,0xfe85b5b2,0xfe591584,0xfe049c72,0xfdd02b78,0xfd75e740,0xfd2a7350,0xfd01a84c,0xfce4889c,0xfc9a41f0,0xfc4cb2e8, -0xfc42a24c,0xfc35cad4,0xfc566a70,0xfce435e4,0xfd002c0c,0xfd613998,0xfdb72be8,0xfe11458a,0xfe1a5a0c,0xfe0b0b8a,0xfe57a45a,0xfe720aec,0xfee64e2a,0xff1fa2bb,0xff17de6e,0xff04d5e9,0xff3a3755,0xff3429f8,0xfdc26e00,0xfe3e404a,0xfe817eca,0xfe7f7e72,0xfe87e684,0xfe948e0c,0xfeb98ea0, -0xfeeaa86a,0xfee8a852,0xfee64d8e,0xfede7572,0xfec1555a,0xfeab390c,0xfe907a4a,0xfe6e6f54,0xfe48cbd8,0xfe2eb9b6,0xfe1652cc,0xfde2fae8,0xfdc3ec2c,0xfd39a75c,0xfd1abfa0,0xfd428a40,0xfda84bd8,0xfd6751e4,0xfde02b80,0xfdead808,0xfdf29838,0xfddbfe28,0xfdf1999c,0xfdd75040,0xfde343d8, -0xfe22a93e,0xfe534844,0xfd9e1534,0xfdc395bc,0xfe14e44a,0x06d2af18,0x05ec0da0,0x076116a8,0x06cbaa30,0x079c28a0,0x08108d40,0x08008da0,0x07ff2950,0x084cfa50,0x076886a8,0x06ed98a8,0x06829248,0x064376a8,0x061f3fd0,0x05f52200,0x06066008,0x05f66328,0x05c4adf0,0x05f07608,0x05c868c0, -0x05cf41a0,0x05c729a0,0x0494d920,0x00f850a3,0x060035c8,0x049f79d8,0x01760a94,0x01628dcc,0x016d8872,0x018b9a38,0x01cd378a,0x01c08cf0,0x0185f742,0x04647400,0x0674ade8,0x007661b2,0x04019d90,0x010118a8,0x090faeb0,0x09cca050,0x0b177220,0x0c472cb0,0x0be55470,0x0be864d0,0x0c6cdcd0, -0x0a923800,0x0933caa0,0x07cefd40,0x06872ca0,0x058b8818,0x04e64750,0x04f38320,0x04f2af38,0x04939ef0,0x051e2ea0,0x04ed3e00,0x05398bd8,0x03f7ba84,0x048f8f38,0x050f0808,0x04033690,0x03e55f6c,0x057e9bb0,0x052c6178,0x057cb000,0x04c32c78,0x05d0b3d0,0x05c2aeb8,0x0467c038,0x05091228, -0x043d4608,0x03cdcdc0,0x056b2320,0x0417e128,0x08f57470,0x0e7faba0,0x0fa9f7d0,0x12420960,0x1110de20,0x1090cac0,0x11b31660,0x0e9ad290,0x0ca9f060,0x0a6bc440,0x081ac460,0x06d2a150,0x057fbe00,0x053891d8,0x04c2d520,0x0385036c,0x0472f670,0x03cbdb5c,0x03a04778,0x0479bd90,0x02ef1578, -0x02eef458,0x024370f0,0x02158804,0x04028b40,0x027723a8,0x036f0c60,0x0243e730,0x03eb4960,0x0358d270,0x0226f0c4,0x0260c01c,0x02114000,0x02245a84,0x04dd62f0,0x02a1d0b4,0x0c361360,0x13ac30a0,0x161a6a00,0x19e52060,0x177b8380,0x177838e0,0x18f06fe0,0x14c21560,0x11ddece0,0x0e37c020, -0x08d2abd0,0x04d749e0,0x0210c640,0x017f739e,0x00ee8668,0xff6f509c,0x00ee7323,0x0097ff50,0x016d6760,0x032d8e34,0x01691a10,0x018b9486,0x000ef90e,0x00780154,0x023b1334,0x02010474,0x02472694,0x01d9ef16,0x034d3238,0x02e76be8,0x00e93000,0x0187c09c,0x015b110e,0x01dec1e0,0x039812a4, -0x116431c0,0x12b3c120,0x10179060,0x12a60900,0x0eeee9a0,0x0a77dbf0,0x08a05d50,0x06991528,0x08e7f410,0x094a4560,0x0833cb10,0x0dd174c0,0x0f12dae0,0x0e173260,0x0bc51420,0x0a0785f0,0x087ec020,0x0730b450,0x046862a0,0x0573d9d0,0x053a94a8,0x020af158,0x0245dd1c,0x0191cd6a,0x022c0b98, -0x02b37f90,0x0315d620,0x02c3df80,0x015a483c,0x019cfd66,0x02db3b30,0x048222f8,0x0524e198,0x0663c918,0x090d51b0,0x0bf544a0,0x0bfa6610,0xffd826a2,0xe5ffdca0,0xe4d28280,0xe67901e0,0xf3101330,0xfa075548,0xfeb5fd22,0xfb3374e0,0xf36bee50,0xed331ba0,0xe4b68740,0xe0c68980,0xe12e6b80, -0xe37cb560,0xe78da820,0xebb9fe80,0xf2727b30,0xf6f8f550,0xfe07e9e6,0x04e03100,0x04b27810,0x03dbd058,0x01d53944,0x01c30436,0x02de3d50,0x02f3acc8,0x039da984,0x0258ea04,0x02bd9940,0x028140c0,0x020c3094,0x03206a78,0x0397c9d8,0x05e4c170,0x04029bb0,0xf9d90058,0xedd66320,0xf5708a90, -0x00b394c3,0x0e41aeb0,0x039499c4,0xfc196658,0xf5e3c850,0xfc933aa0,0xff4a25d7,0x040a90a0,0x02dcd1c0,0x012c50e8,0xfd09c85c,0xf8520300,0xf5c61690,0xf4ea8ac0,0xf61ca470,0xf7425810,0xf8d97230,0xfc01be94,0xfed4cf5a,0x02342720,0x01f0d1e2,0x02afefb8,0x0395cf30,0x04149f78,0x044b9118, -0xff8d4b6a,0x04e549e0,0x04b649c0,0x015978c8,0x0485c878,0x013525fc,0x02a6feec,0xfee2af62,0xf61e1a40,0xfdd7e030,0x068c8f30,0x05b55b08,0x11403c80,0x0558bdb0,0x030a1604,0xff057ffe,0x040d5d48,0x06eaa2d0,0x09c788e0,0x09031ad0,0x077048b8,0x03bca844,0x03a04470,0x01be4406,0xff9e408a, -0xfe6cdc68,0xfda82bc4,0xfab2d0d0,0xf9f81188,0xfc03cb08,0xfa9b60a8,0xfc45bc64,0xfdfa99b8,0xfff27cc0,0x007c1e62,0x00e8d797,0xff250714,0x01fb117a,0x022f22b8,0x017076ae,0x00da0223,0x007d1cef,0xffac2289,0xfc336980,0xffb659a9,0x022a83f4,0x075467f0,0x07f0c200,0x07db8e00,0xffe99809, -0xfd94adac,0xfd3cb048,0xfd6e3a40,0xfd81dd8c,0xfe0c990a,0x031ded5c,0x05678918,0x044544b8,0x043f1ea8,0x02dbea1c,0x01549ad8,0xfe46eaf0,0xfdf604c0,0xfc07b750,0xf8f47820,0xfbd55108,0xfc97aa4c,0xfe5f3190,0x0028aae8,0x0129779c,0xff995fe8,0xff3a29f4,0xffb109f4,0x0187ae2e,0x026f0360, -0x03386510,0x0123a298,0xfff92605,0xff04b2b4,0x0265adf8,0xfc562184,0x02dfc8f8,0x052da5f8,0x03cea308,0x00a89a4c,0xff9bb8dc,0x00369ef1,0x00e97515,0xfdd79490,0xfcfc9860,0xfe3e77ec,0xff795234,0xffd1ac49,0xffa28ff9,0xfd43174c,0xfc9a7f24,0xfd8261d4,0xfea461cc,0x00919e97,0xff28a4e5, -0xfd4dea38,0x0075b6fc,0x00517120,0x00413b27,0xff9e0be9,0xffe3f088,0x00ba841f,0x011723ee,0x00c49740,0x00750c93,0x006199ad,0x00b87238,0xff7a945f,0xff50c515,0xff114975,0xfefe4bf8,0x0093444d,0x0088997d,0x01298b46,0x011e96fc,0x01c16d98,0x015e47d4,0x0046384c,0xff0b15b5,0xff1304db, -0xfedf02aa,0xfe603708,0xfda8fed4,0xfd294038,0xfcb683b8,0xfcf7ae4c,0xfcc63ae4,0xfc011030,0xfd4dddb8,0xff47f1ae,0x00438906,0xff1a1493,0xff939764,0x0049c9ec,0x0081fabc,0xfff52f49,0x0179e646,0xffe8157a,0x00826729,0xff315b27,0x0038b16b,0x00114880,0x00b454f4,0x00a0cda3,0x00807ef6, -0x005da724,0x00e80712,0xfd577778,0xfe69686a,0xfe751816,0xfe1f6118,0xfdfc9e54,0xfdacafec,0xfdc75394,0xfdb7fe74,0xfde0c7ec,0xfde31eb8,0xfdf1bbcc,0xfdd97294,0xfdaa5f34,0xfd49856c,0xfda8d444,0xfe25ab1e,0xfec8f1c2,0xfef85b54,0xff192739,0xff120d07,0xfcce202c,0xfe8dacb6,0xfeb2e972, -0xff1b5e96,0xfeca6170,0xff569961,0xff6ac71a,0xff917bab,0xff14ebdd,0xff769446,0xff7873ae,0xff3f3981,0xff05b0f7,0xfeb653f4,0xfe63cc04,0xfe64d526,0xff363002,0xff347097,0xfee1c3a4,0xfede5f9e,0xfec23d7a,0xfebac914,0xfe9f8c1a,0xfe7e6b30,0xfe79972c,0xfe76aa1c,0xfe7d0722,0xfe92c87e, -0xfeb8befa,0xfed33bcc,0xff00c406,0xff0df3e1,0xff22548b,0xff4405e7,0xff5cbb38,0x001cc6f4,0xff59ebec,0xfefe210e,0xfddfe390,0xff54e0e9,0xff00f5be,0xfe1b4580,0xfe291f68,0xfe4453fc,0xfe9d901c,0xfe902432,0xfead9e88,0xfedaf806,0xff19b164,0xff49ef5e,0xfebc744a,0xff030a9f,0xff012c24, -0xfdd66820,0x01b90382,0xfd85a2b0,0xff0221a2,0xfe7aedb0,0xfec23222,0xfd659e24,0xfce7bf40,0xfcb23150,0xfcc23b70,0xfcd45058,0xfd0cfb3c,0xfd021f50,0xfd066ba4,0xfd1168ac,0xfd115998,0xfd28530c,0xfd4f2f14,0xfd7a5e40,0xfdebc9ac,0xfcae2518,0x00ae8b93,0x03197290,0x078ce4d8,0xffc06ef2, -0x03042bf0,0x076224e8,0x073f1f78,0x070e7d68,0x066fca20,0x07115bb8,0x0728c720,0x06b4a208,0x032591cc,0xff88137c,0x0790c8b8,0x0421f198,0x075fa438,0xff86a888,0xff65c6eb,0xff392415,0xff783e47,0xfc5afe68,0xfb27a1a0,0xfae4a498,0xfac179d0,0xfb21cd78,0xfc18ab8c,0xfc566c10,0xfc8c9b58, -0xfc8ff8b8,0xfc5d25c0,0xfc791d08,0xfcb9c710,0xfd3afb0c,0xfd578b18,0xfd2b7c34,0x031fbd2c,0xff9bad8f,0xffbfaf66,0x008a9c4e,0x0151aaa0,0x00501eac,0xfffacd43,0xfffbfc8b,0x00dbd433,0xffe1d015,0xff2c1feb,0x001ab109,0x008c0fe5,0x0244a034,0x02547fa4,0x00658a4e,0x05fa4468,0x03180b30, -0xff541fad,0xffe92bb7,0x00b58819,0xfa66d280,0xf82881a8,0xf6efb010,0xf63fc670,0xf66cfd00,0xf7b08840,0xf7eeb090,0xf8132650,0xf8820db8,0xf8be3828,0xf9625dd8,0xfa5f0550,0xfbb50e70,0xfc3cbec0,0xfd3596d8,0xff7764d3,0x004b0eb8,0xffc48320,0x00162de7,0x01a845ae,0x016aaac2,0x028029e0, -0x005bbc36,0x01f4a566,0x011c881e,0x029bd48c,0x009826db,0x0241cbe8,0x02e0cff4,0x0410f4f8,0x036b5ecc,0x08995710,0x039f2990,0xfe5e8e9c,0x0031dccf,0x01ccd36c,0xf951f178,0xf5409410,0xf39fe0c0,0xf31106b0,0xf3c94c10,0xf71d7e90,0xf9050a08,0xfa1bce98,0xfa26efc8,0xf9d32370,0xfa60fd98, -0xfb629b98,0xfcd58f04,0xfd28f848,0xfcc63f48,0xffab001a,0xfe9fda82,0x003898b9,0xff25563e,0xffc24d67,0x014f7b72,0x019082a8,0x0232e8b8,0x009302f8,0x02678480,0x01b0f9c6,0xffc25db9,0x029cdca4,0x04b7dca8,0x043b4798,0x03edf6d8,0x01aa39ba,0xf4f19a20,0xf1fc76b0,0xf10479b0,0xf7850280, -0xf9f59698,0xfb3ad560,0xfa381c90,0xf5350bd0,0xf1ff44a0,0xef38e460,0xe6a33480,0xe3674cc0,0xe38a2c00,0xe73eff00,0xea0ccea0,0xebebaf00,0xf125ac10,0xf54ba440,0xf99af870,0xff23cdf6,0xfe5969c4,0xff5c00ff,0xff9ff6e2,0x00d65ca8,0x02b484b4,0x01a3cee2,0x01e1eaec,0x021982a0,0x02f27e7c, -0x022e8b78,0x00d96361,0xff46de37,0x002e0296,0x0003a0e3,0x0420ade8,0xf561fcf0,0xf817b758,0x06d4a248,0x0bda17a0,0x1220eba0,0x0d934a70,0x0a1f09b0,0x03070994,0x07d3ebf0,0x08f1f210,0x05597028,0x04b7fd40,0x016301ee,0xfa913d80,0xf7aeb5a0,0xf778a440,0xfc110974,0xf9a9c650,0xf9441270, -0xf99a3ab0,0xf989af00,0xfc611514,0xfd666e94,0xfe66d4f4,0xff9e7c21,0x01b5653e,0x0242ccc4,0x03308064,0x02496910,0x044e7a68,0x04abf940,0x0461de10,0x0294ba00,0xff6cc756,0xfcbaba34,0xfaeeaee8,0xfe3fc01e,0x07ca8fd0,0x08049220,0x023e0294,0xfbb83320,0x059b21a8,0x08237ac0,0x01562d36, -0x03c27440,0x05524f08,0x04372af8,0x072e5740,0x074aa958,0x059dcf40,0x07969c70,0x06e2ab30,0x05c01e68,0x026795c4,0x01eabba0,0xffa384df,0xfe967456,0xfe7afc6e,0xfe137256,0xff291fcd,0x00820ecc,0x03c408f8,0x0329a3ac,0x02cdd594,0x0001fdde,0x029c7864,0x015945f2,0x00407c2b,0xfe868696, -0xfea5efd4,0xfd2b1424,0xfe98ca32,0x05c42170,0x03158580,0xf8e01f98,0xf918dd38,0xf88e5828,0x01701010,0x01b1aab6,0xfd99d450,0xfa2e5a98,0xf761ee20,0xf7fadee0,0xf9b8bd30,0xfc37cbf8,0xff6254be,0xff1dca01,0xffc53bd2,0x0130f52c,0x00d2179b,0x0101e21c,0x003ebe2c,0xfe2f7bf4,0xffc20804, -0x00da5c84,0x00c3a8f5,0x017b0ca6,0x02574324,0x016ae5b4,0x00ad43ed,0xff067471,0x0134cb50,0x02020da4,0x0373c9f8,0x01bc4f90,0x00919aad,0x00d7c1ca,0x031c593c,0x01134fa2,0xfee69e72,0xf94ccc10,0xfb394268,0x01ffaeee,0x04ef0048,0x044359e8,0xffa8c446,0xfee78f18,0xfee32bbc,0x00a0a90e, -0xfb835400,0xf9dc0860,0xfbd19018,0xfc0153a0,0xfccf8f60,0xfeeff31e,0x00ff21ff,0x023247d0,0x0368fa70,0x01d6a5be,0x0270d524,0x00a93dd8,0x00efb13d,0x0177c65c,0x020966a8,0x016ec1a0,0x01203730,0xff1e6400,0x0081265a,0x0096b78c,0x0071c503,0x011dcbda,0x01a11884,0x01ba1afc,0x00a83983, -0x01ac5f1e,0xfd12b5c8,0xfda6e210,0x00ce0ba0,0x0428f810,0x0370cd00,0x0134c1c0,0xfdb8cbf8,0xfd9838a0,0xfc8c3640,0xfb564780,0xfa921d30,0xfa0620f0,0xf920a690,0xfb6f2b28,0xfde5f310,0x012e2eb6,0x02f1d144,0x031694d4,0x021c9330,0x02800780,0x02082314,0x01009c3a,0x0165a3e6,0x010fdeac, -0x00e5bfbe,0x00712f20,0x00753cf3,0x0134ffa6,0x011ff960,0x01642fa2,0x01228fa6,0x01b03ec4,0x014ad0dc,0x0041770d,0xffa34cb2,0x022f81a4,0x0299409c,0x018fbe58,0x01207cd8,0x0085c864,0xff3b2e46,0xfe876e88,0xfde590dc,0xfe49cb7c,0xfe68b50c,0xfe3c6ffa,0xff0afeb0,0xff93d3c0,0xff886cee, -0x00adbfc4,0x0193e1b2,0x02990508,0x026b0c38,0x02cfbc04,0x02fca758,0x02294108,0x01e45e52,0x015ee3da,0x01adfc52,0x01f686f0,0x01dcd01c,0x01e89d96,0x0218ce9c,0x017e640a,0x01c008de,0x014f321a,0x0186560e,0x012274f0,0x012a2df8,0x00f2acb3,0x016e5b5e,0x001726e3,0x022a3198,0x019aecea, -0x011ea54a,0x00ac84fb,0x004ecc85,0xffdbf5c7,0xff3e7f35,0xff33d486,0xff2ac180,0xff3fa91a,0xff4cfa18,0xff6d3920,0xff8eb7df,0xffdf2746,0x000db50f,0x00566641,0x00c489c3,0x011ef0a2,0x019eb08c,0x009e3b1a,0x014d7bcc,0x011d88b4,0x00bdc52a,0x007dce78,0x00959d6e,0x00dec2bf,0x010b2326, -0x0114c240,0x0194bf78,0x01d8f20c,0x019d220a,0x01bf33a2,0x014ede8c,0x012f420c,0x01eb833c,0x002c06fa,0x01ef2106,0x01454da2,0x012fe962,0x0102cffc,0x00d8521f,0x00b489c4,0x00878dfd,0x0098a420,0x0090faa5,0x00833e5a,0x00626116,0x003d8de4,0x000c7855,0x003a2ad1,0x0064e755,0x0084be89, -0x00a65456,0x00b1edc6,0x01113c9a,0x0018dd8a,0xff87bccc,0xfeca68e6,0x0073d047,0xffa1b625,0xfed44496,0xfed85f54,0xfedf3ee6,0xfef5a9c0,0xfedb2812,0xfedc079a,0xfefedc38,0xffeb83db,0x01086802,0xfea0bbf8,0xff8fb77a,0x01464314,0xfcf32388,0xfbe52cd8,0xfcaf1d7c,0xfc963c34,0xfc64df84, -0xfc4288a8,0xfcd7eafc,0xfd10878c,0xfcf45d20,0xfd724b5c,0xfd92e1d8,0xfd781d4c,0xfd82b118,0xfd775bdc,0xfd5f6460,0xfd63b200,0xfd6a0274,0xfd944280,0xfd63d27c,0xfd570a0c,0xfdcea290,0xfc4be400,0xfbebeb20,0xfc3e5ffc,0xfcd3a02c,0xfc50751c,0xfca36174,0xfc855f8c,0xfc7e5bcc,0xfc7ecf04, -0xfc50b194,0xfc421ed0,0xfc2f50c4,0xfc3d2374,0xfc746644,0xfc8e8be0,0xfbf24e48,0xfc01d290,0xf9a96128,0xf9502a80,0xf91fd8a0,0xf9530840,0xfb5be7a8,0xfc131f08,0xfba323b8,0xfd246e80,0xfd639cf0,0xfcd3f604,0xfcf0b7a8,0xfced23e0,0xfcf12b48,0xfd3dcec8,0xfd6eb150,0xfdda6380,0xfd581a70, -0xfd750420,0xfd7fa0ec,0xfc10fd60,0xfd21e678,0xfd09e368,0xfd9c0bb0,0xfdc98e5c,0xfe4095d6,0xfe2ab200,0xfdfbb16c,0xfdb98aa0,0xfe0e4e3c,0xfe16c3de,0xfd578aa8,0xfcd4b148,0xfc2c7c28,0xfc190538,0xfbfb4580,0xfae826b8,0xf952a9e8,0xf7d44370,0xf7839200,0xf6dd8620,0xfa56cf48,0xfb754608, -0xfa71c1a0,0xfdd68a2c,0xfe582b66,0xfd91f050,0xfdafedc0,0xfd913b60,0xfd6bcbe4,0xfdb0e874,0xfdf53c74,0xfecef138,0xfdad729c,0xfdd7abb4,0xfddb55d8,0xfcb0f114,0xfd4b1e68,0xfdfac810,0xfeec04b8,0xff534f8f,0x00551e82,0xffa0cc32,0xffd1fa36,0xff1c87d8,0xffd76402,0xfefbb6e0,0xfe3c0d42, -0xfe071e7c,0xfd8b83cc,0xfc2c0758,0xfb0e99c0,0xf7940450,0xf290be30,0xf0cef840,0xefe52e80,0xeffc0960,0xf68ca280,0xf8b96be8,0xf7accfb0,0xfd1d2838,0xfe1fb722,0xfbc05eb8,0xfb866e28,0xfb607378,0xfbfe7658,0xfd6141bc,0xfe5dc1ec,0xff8267d0,0xfdf35718,0xfde2fc7c,0xfde5ad44,0xfcdbf868, -0xfdb7500c,0xfdd15174,0xff2f5bdf,0x0030ae04,0x01613e74,0x016cf158,0x019b5314,0x011c3256,0x01f4fc80,0x010de880,0xfe917e3c,0xfd0a5cd8,0xfb57ef88,0xf9c66380,0xf9734998,0xffaf6722,0x0d152ac0,0x13f2ec40,0x115d5120,0x07977ed8,0x06041e98,0x01a30324,0xfcc93b88,0xfb6c58d8,0xf9c491d8, -0xf9cc4ae8,0xfd1fb9b0,0xff092911,0xfec87d86,0xfee97f3c,0xfe9b1274,0xff3866ec,0xfedbc75e,0xfefb5a40,0xfc16ba5c,0xfb039f20,0xfd8f7f70,0xfe857e5c,0xff61216e,0x0025a0c7,0x02501fb8,0x00e8108b,0x01290082,0x02099310,0x00df2bc8,0x00ad5e1e,0x01b0166c,0x03766c28,0x027ed248,0x02e52604, -0xff82a1ba,0x0521f3d0,0x0ac1ab30,0x04a68f80,0x009b59cc,0xff536b01,0xff7dc033,0xffd9c8c6,0x0288e7a0,0xfc001ac8,0xfbb437e0,0x0377ea3c,0x03380404,0x043cf288,0x065723e8,0x0741e9a8,0x06cbf2d0,0x04cc8aa8,0x023d64a8,0x009a78cd,0xfde638c8,0xfbf25230,0xfbe39850,0xfd68bb00,0xff511382, -0x00a60c2a,0x031143f8,0x01c4647c,0x01af2bea,0x0186933a,0x03ab7360,0x03968038,0x01ad7b26,0x007e852e,0x021e473c,0x02b661d8,0x04f90678,0x04bac8f8,0x0139e8dc,0xfedf388c,0xfec47e0e,0xfd4a0fa0,0xfd375d14,0xfd08936c,0x000690a9,0xfb9274b0,0xf9d27cd8,0xfd8b40fc,0xfc179228,0xfd64e1c4, -0x003a0a16,0xff2ce87d,0xfee9c882,0xfe3928ba,0x02017a6c,0x031a1094,0x020119f0,0x027142f8,0x01e75042,0x010c60ea,0x005116fa,0x00e3df2b,0x046df590,0x009b6b10,0x0014aa24,0x002185f7,0x02480af8,0x0272d96c,0x0377fd0c,0x019448c4,0x027ec6cc,0x035203a8,0x044a0cf8,0xfefecd60,0x024af160, -0x078054f8,0x05109228,0x01d6fa82,0x03d00e74,0x05500968,0x07e45da0,0x044ae3b8,0x0239f5fc,0x0143d38c,0xfdba368c,0xfd5634d8,0xff410e81,0xffb8368f,0x000c67a4,0xffa41b3c,0xff97cc23,0x007c0909,0x01de96a4,0x01f932e6,0x0273d59c,0x03badd0c,0x024460dc,0x026bdaec,0x0509e708,0x00dabdd3, -0xffea7f40,0xffa40178,0x0032ed03,0x011401da,0x03802874,0x00fc3f57,0x01118e22,0x01037244,0x008d653e,0x00a8a0f8,0x0343affc,0x0145cea4,0xfe53a710,0xfd301178,0x0088ffb9,0x01767b00,0x01bb021a,0xfd6916e0,0xfaff83a8,0xf9d71198,0xfccdf0a8,0xfe0fc578,0xfcb9fcb0,0xfee7f706,0x0026b1fd, -0x016272e6,0x0227b480,0x021bf474,0x020a84d8,0x02068bf4,0x0166580c,0x01bf6dce,0x01745450,0x01a28754,0x0240f160,0x02bed4e4,0x02bcfffc,0x015f7f72,0x0156ef58,0x01169fae,0x01999368,0x018c94e2,0x012b115c,0x0058c9bc,0x011016e4,0xfce56768,0xfdeae7a4,0xfdbd32fc,0xfdb5f694,0xfefa4ffa, -0xff32aa34,0x0074d662,0x0238aacc,0x00459f85,0xfe8a660c,0xfcc61ca8,0xfd9ab57c,0xff2241f0,0x00d76d33,0x02f1b814,0x02d25858,0x01e6b3ea,0x005df8e5,0xffda1304,0x00f24e49,0x01ddd80a,0x01ac4b2c,0x023818e8,0x01eacc6a,0x0196938c,0x00e71ac6,0x00b4da44,0x00bdae47,0x01925cd6,0x0197b808, -0x01692672,0x01149bca,0x01b33f8c,0x01a0b784,0x00b082c3,0x0005477c,0xff26ee57,0xfdf31b24,0xfef81806,0xffc93a03,0x0071f5ad,0x00eef9e7,0x01609cc2,0x01f1aa04,0x01ca088c,0x01fed52a,0x0245b08c,0x01852450,0x00ac66f6,0x0006016f,0x003b937f,0x00cb0e8a,0x01c9a634,0x01afccae,0x010fd12c, -0x00eb18c6,0x01799ce0,0x00b55e9c,0x0049c781,0x0073a5f5,0x00a69526,0x01293854,0x0159691c,0x01ad9c00,0x0249f528,0x0121213a,0x00c1179d,0xffc87623,0xff7fb4e9,0xff152229,0xfeebacaa,0xfec8c662,0x033001d0,0x01a740d0,0x01b615fc,0x01fa4a4c,0x021fcf60,0x025a827c,0x02876db4,0x02bb6d2c, -0x02caf3fc,0x02bf7df8,0x02b29504,0x02b8ad0c,0x02e9bd24,0x0308b530,0x02ebddb4,0x02a0a9fc,0x023da3bc,0x01ff2c80,0x01d71794,0x01b62c1c,0x01ec1930,0x01e07272,0x0249d1b8,0x027f407c,0x02845df4,0x02ce4b14,0x028efa28,0x0264f260,0x023f89f0,0x02131934,0x01e221a8,0x021bce10,0x020e646c, -0x02640cf0,0x029b178c,0x01e6c012,0x02395128,0x00ddc728,0x01491246,0x014954b0,0x015a0e52,0x016aeb7c,0x017dabf8,0x01953d72,0x01aa9eba,0x01cafd0e,0x01ec4630,0x021662a8,0x023061d8,0x02555b94,0x021bbb8c,0x01fc10d2,0x01df439a,0x01c6685a,0x01a85f34,0x01622e72,0x021a0a84,0x0274b3c8, -0x0220be70,0x02356674,0x02a97b3c,0x02425b08,0x0242309c,0x0255f0a4,0x02582c2c,0x028071a8,0x0293d578,0x028ef9a0,0x026bdbc0,0x01bc05a4,0x02a3e6cc,0x02a08ec4,0x0133c5c4,0x004ee01c,0xff8ada0a,0x00c3a62d,0xffe33e7e,0x000de306,0xfffd8e7e,0x00086fb9,0x000514bc,0xffd7344e,0xfff1793a, -0xfffdf0c6,0x002bcad6,0x001bbd8b,0x00259046,0x001ea041,0x00624e71,0x007f4cfa,0x00a1ba2a,0x007be88d,0x00539acb,0x00c5584e,0xffd91d9b,0xff37f098,0xfda0e1e0,0x00488136,0xff88d184,0xfe2f933c,0xfe0cc880,0xfe12ca28,0xfe3ff090,0xfe3a6708,0xfe1a0b88,0xfdfc92c8,0xff0b7b6e,0x004882f0, -0xfd1975c8,0xfe9f03c8,0xfc163218,0x012ac5b6,0x012e1344,0x0150eeea,0x0131c5f4,0x00adeca5,0x0037d2cd,0xff92fe01,0xffc36ca3,0xffd20794,0x001edee0,0xff9453e6,0xff7525cf,0xff6d9f02,0x000a63e8,0x006c091b,0x00e050e0,0x00838fb6,0x007e85ef,0x00c706ce,0xfeb697a4,0xfff41fe0,0x000fd9af, -0x001a76fa,0x0017faa9,0x00f333c1,0x00876f86,0x00809f45,0x006dda59,0x008025ee,0x008456d5,0xffd99615,0xfffb0fb4,0xff7905e3,0xfede7bce,0xff7f465f,0xfe0ea41a,0x006d6b03,0x01e90c18,0x00c0e928,0x00845958,0xff100cc4,0xfeba63aa,0xfdec80cc,0xfea757ec,0xff375577,0x006722d2,0x0027f2c8, -0x0038bc77,0xfff25ec0,0x0112dd64,0x01880f70,0x020cc2b0,0x01211cd4,0x00fa6537,0x00c9990f,0xffd460e8,0xffb35577,0x00600465,0x00bb62e9,0x00b6f274,0x020d7578,0x0072df51,0x00d14bf9,0x00a208b1,0x00d89fcd,0x005ae3a4,0xffd32754,0xff6b5e5d,0xfea5c706,0xfe7f8d80,0xffa75b19,0xfca670e4, -0x03b77794,0x06dd0970,0x06561ef8,0x0562a2a0,0x01f5208e,0x00598b88,0xfe5708f4,0xfee5f5f2,0xff15367a,0x0043cc45,0xfee8669a,0xfe77e566,0xfe23541c,0xffa94ede,0x009ec144,0x01d5df74,0x008c9d95,0x00af6239,0x00aaf70c,0xfe6b3c46,0xffc9e70b,0xff5151c3,0x00684b61,0x00ec36ec,0x029d714c, -0x0181823a,0x013799b2,0x017f1a3a,0x01c57010,0x00c586e8,0xff65cb4f,0xff831efd,0xfec2b610,0xfee1a2ca,0xfe988b56,0x0e200b10,0x0758d180,0xff666c79,0xfcbebba0,0xf5fd1dd0,0xf44b8070,0xf4ae6070,0xf7693270,0xfd38cd00,0x02fbdb94,0x08f9a3d0,0x0a5870c0,0x0aebb720,0x0ac79790,0x08ad8250, -0x07815ac8,0x07da6a20,0x04ad2b18,0x033a5b6c,0x0216cfa8,0x00048968,0x00fd149d,0xffcfeb5c,0x00e7d583,0x01055188,0x01ed356a,0x00a6473d,0x00de7bf2,0x01fa85cc,0x01fabad6,0x03716500,0x04cd41e8,0x02dabdb4,0x0398d864,0x05a445b0,0x0ac55d50,0x04ac5480,0x0067e4f2,0xffa6ced2,0x02474824, -0xff3bd894,0x081d2d00,0x089681a0,0x0647ab48,0x038fbf80,0xffd2ed2a,0xfa8bdcb0,0xf97a5838,0xf995b208,0xf8ef7d88,0xfb89a9a0,0xfb822cb8,0xf9ef6700,0xfe49ff14,0x011c32d6,0x017ef9b0,0x02ca3dd4,0x02716af4,0x01ad39b4,0x01b2b57c,0x018b3df6,0x0355a328,0x0236da58,0x01eab422,0x00d3af9d, -0x03228f08,0x031b4d80,0x02b36b9c,0x04549448,0x04e66438,0x053c1388,0x02ea0ba0,0x0243d610,0x018e7092,0xfe969ebc,0xff91b212,0xff0b389e,0x01aa9b56,0x04763ce0,0x081c22f0,0x04afc2c8,0x028f76c8,0xfeff31e8,0xfcc29394,0xfa4b0140,0xf726e1a0,0xf87a2970,0xfa23aad0,0xfcdfe5e4,0xfd527a28, -0xfdcbbee0,0xffd5db0e,0x00380de0,0x00ba7541,0x015dae6e,0x00e05cca,0x01f9354e,0x06ac35a0,0x00022675,0xfec8798e,0x00977a3d,0x01ae4b90,0x02f1eab8,0x064c4c00,0x030c31e8,0x00ad1072,0x03b89478,0x01eac30c,0x0326b454,0xff9493a6,0xfd0bbb30,0xfddd0634,0xf88bc570,0xfbe40e48,0xfbb62040, -0xfac0d8f0,0xfaddde28,0xfa2107d0,0xf81fb900,0xfcc8abb8,0xff424816,0xff6cf9b6,0x00e6de43,0x00dd2015,0xfffeb183,0xffd9dfd4,0xff969b84,0x006db2df,0x01d6c30e,0x00e1ecc7,0x0004422d,0x00ed103b,0x01af30e2,0x048f71d0,0x01a704e8,0x00f41b5d,0x01f23e92,0x0020d72b,0x00d7d05c,0x03441c8c, -0x02121818,0x012f7958,0x01634e0e,0x011cb30e,0x00e1dd9d,0xfec8acae,0x0040f3a7,0xffd6be2f,0xfaa18d50,0xfdefe828,0xfe452cb4,0xfcfa3b14,0xfdcfab5c,0xfd92465c,0xfcd6c2fc,0xfd0a82bc,0xfe5d11bc,0x01ada884,0x00f088ff,0x00972c10,0xff0a7b3b,0xfe9a4e6a,0xff269574,0xffa1a656,0x00c7ffba, -0x00c6b521,0x011edfa8,0x015060b8,0x00c8fccd,0x00d0ebe6,0x00d40706,0x00b86f11,0x0180e134,0x01296db8,0x01370888,0x0183fcbe,0x00dd899b,0x0122f53c,0x0147cbac,0x00e3444e,0x020d9bd0,0x01282098,0xfe539f8e,0xfcd01df4,0xfd10557c,0xfe2d879a,0xfe756862,0xfdd064a8,0x0074d3b0,0x0210d49c, -0x0317eb30,0x020b4208,0x0193b4b0,0x02309828,0x01de3c88,0x0185ee28,0xff8b78f2,0xff24e860,0xff1ad3d9,0xffe61135,0x00128aef,0x003b6327,0x0035ab01,0x00782b4e,0x010344c2,0x01838f5e,0x01c1123c,0x01e1dac4,0x010f0f78,0x0206fb30,0x02473c88,0x023f82e4,0x01d3e044,0x01b5057a,0x01e879d4, -0x02143a08,0xff3214e1,0xff83b52f,0x003aff33,0x00a92264,0x00ffcca4,0x0057de3e,0xfffa68c8,0xff35ec5b,0xffa5905e,0xffdfc4c8,0x0057be27,0x00ea85cf,0x018f0e6e,0x0208d3a0,0x0161c80c,0x00d343d7,0x0044c7ef,0x0050de11,0xfffb193c,0xffba87fa,0x007bcdb3,0x01232238,0x01e2bef0,0x01c2fdbc, -0x01c64e44,0x01acc1d6,0x01763338,0x00cbe21e,0x00c68c07,0x007cd8bb,0x00618140,0x003dd687,0x0048ca32,0x003fc6c6,0x002406c1,0xfff2c504,0x006cd726,0x00787475,0x0031851a,0xffa3bc05,0xff64c832,0xff1e8415,0xfee114be,0xfe9bb412,0xfec2d276,0xfee3e7c6,0xff09804d,0xff21c1f4,0xff1fc494, -0xff42bf22,0xff428ea1,0xff63f61d,0xff750976,0xff6b6bed,0xff6ffbb7,0xff76f0f3,0x01389a72,0x009a93cd,0x00c4e8a9,0x00e75f81,0x015a7486,0x012cc626,0x0139c9dc,0x01486102,0x01801f24,0x0179f400,0x01c8bf1e,0x01b83b92,0x019f6f34,0x013722f0,0x00e427ba,0x00f43a8c,0xffab3dc7,0x006a5314, -0x0034d02a,0x00235b62,0x00058a17,0xffed0b66,0xffd72b58,0xffb06730,0xffbaec9a,0xffb6293e,0xffb136da,0xffb19eb7,0xffbe4936,0xffceaa0d,0xffd69a03,0xffd8305f,0xffde8dd1,0xffe7976b,0x000379a0,0xffd2ee0e,0xffda164a,0xfff1f331,0x00e8eac6,0xffcdb981,0xffe7fe4d,0x00e690f8,0x00d3cb6f, -0x00b26f34,0x008a3e8a,0x006dc9e6,0x00401a89,0x00322438,0xffd5d0cf,0xfffb4715,0x0029197b,0xffa12635,0x004aade1,0xfffaffd1,0x00287d36,0xff421897,0xffc00c74,0xffbe6a2f,0xffd967a5,0x0012be56,0x001eab07,0x0003e986,0x0029337f,0x0024ab70,0x00088f51,0xfff0598a,0xffdc893f,0xffbc6d4b, -0xffdc78b6,0xffe689ba,0xffee770e,0x0001afc7,0x001247ed,0xffdd55c3,0x005f9126,0x008e7919,0x00c27e22,0x004f6262,0x009d4c2f,0x00f76aa4,0x00c216bb,0x00b37f54,0x00b01916,0x00af4d0a,0x00aa2c06,0x00b0e8d1,0x00a3f2f3,0x00264621,0x00fdff3e,0x00a6390c,0x01ed0592,0xfea1eb2a,0xfe09774c, -0xfded303c,0xfe04fa90,0xfefd30b4,0xffac16c8,0xffb4ca9c,0x00324052,0x004ab51d,0x002bd8ec,0x0030f21a,0xffffd81c,0xff8ed800,0xffc065db,0xffdf7f18,0xfff6bdf4,0x002fdc03,0x0025f544,0x001a7b2e,0x00ed458c,0x007342cc,0x005b8525,0x00a3388f,0x00ce3bf9,0x00ee2388,0x008ecdff,0x005f6183, -0x0066d832,0x003187d0,0x00455d1a,0x008a642a,0x0098090d,0x00bf0b61,0x012524dc,0x005fb0ca,0x00df68ee,0xfe0fb7ca,0xfbccf870,0xfd24adb4,0xfd35bb28,0xff7a08d8,0x004c9907,0xffd64a53,0x010c0b46,0x00d71ba0,0xfff74083,0xff8e05eb,0xff059424,0xfe595bac,0xff16d505,0xff6c073e,0xffa5f498, -0x00489887,0x005065b7,0x006fa673,0x011df74a,0x00e29d27,0x006f2a70,0x0104f75a,0x0175e5bc,0x01c6915a,0x012ca9bc,0x00b31020,0x00be37ef,0x008e0f46,0x00bfd691,0x00f5b619,0x01219b92,0x0129e54e,0x01ac7d70,0x005201ee,0x02c0e55c,0xfae268c8,0xf5598050,0xf6307200,0xf6cbc130,0xfbd60a38, -0xfe52eab6,0xfe1f7004,0x0060c06e,0x01505cb6,0x00a19685,0x00bb050f,0xfff0206d,0xfe528d7e,0xff2e7601,0xffafbc18,0x000c2e7d,0x00d9d91e,0x00770938,0x00cb1fc9,0x01636ef0,0x00f1ef51,0x00efef63,0x010d23ba,0x01790998,0x02ddf814,0x018bb5e0,0x00e83b17,0x007d9cf7,0x00e883c5,0x00c7fabb, -0x01149272,0x01acc1b0,0x02cc91bc,0x029fac50,0x019e6866,0xfb69e730,0xfab01570,0xfbde0f60,0xfe4ca8d2,0x06a2c5c8,0x0434caa8,0x04d9c528,0x09036dd0,0x0367f844,0x006315dd,0xfe0a54de,0xfc4b5410,0xfb496db0,0xfa66cc90,0xfbb02b50,0xfc40d020,0xfc768048,0xfe843dfe,0x0048d89d,0x02cf74b4, -0x02687d28,0x0166aaec,0x00882d8a,0x01380340,0x015fc002,0x02343330,0x00d8b3ef,0x01367f80,0x02c2c94c,0x034da780,0x0274f464,0x0017e72c,0xff0372de,0xff126187,0xfe96efce,0xfd5bc6f8,0x00fba4a1,0x017a00fc,0x06dd7108,0x06c7dfb0,0x05188f58,0x04ac3620,0x04bccd38,0x03f9f7a0,0x00a583f7, -0xfe66590e,0xfb2127b0,0xfa598b38,0xfa04a830,0xfadf3f98,0xfb44b5e0,0xfd206fd4,0x0060f9c0,0xff9b08e7,0xff963ef4,0x00d817aa,0x018ba21a,0x01f50cda,0x01474542,0x01740860,0x019192a8,0x03691184,0x01ac30fa,0x015b5dae,0x00d0c2bc,0x02f64c38,0x03122fac,0x02b2cb2c,0x03daff74,0x02f7ab08, -0x01455c3a,0x0227c514,0xfe3cb502,0xff077acb,0x02e21324,0xfe93b272,0xf8614860,0xf8838790,0xf9782778,0xfd33f0c0,0xff9afc8c,0x01d3b170,0x02f0abc0,0x04db5538,0x04f1a220,0x03c4c8a4,0x0157d46e,0xfefff8e8,0xfc984990,0xfe0eb304,0xff205633,0xfe7707a0,0xfef114b0,0xff464f06,0x006be980, -0x00bf8ce1,0x01b6944e,0x06085dc0,0x010e49e2,0xff64b09d,0x0012e54e,0x0054c064,0x0171b452,0x050770b8,0xffcd69da,0xfe8c925c,0xfdc41960,0xfe7687f4,0xfe9330e2,0x0077abcd,0x013ad538,0xffb07898,0xff4fbeec,0xfc142ba8,0xfb012388,0xfc3dd130,0xfb3849c0,0xfd57eed8,0x016f60d8,0x035e6438, -0x05163f70,0x06645fa8,0x05cbff68,0x04ca7430,0x02e534cc,0x0475c370,0x04425920,0x018adf60,0x0052b84c,0x006c8244,0x003bd52c,0x0089ce5c,0x011ff946,0x03b42f60,0x010ee124,0x005c2c4f,0x0231ad68,0x00a27546,0x009ed61e,0x023ae684,0x00a2af9d,0x009c1560,0xfff67084,0xffbec625,0x0016884f, -0x004aa4d2,0xff83df6a,0xfea2d2f4,0xfc5d4024,0xfbc6fa18,0xfd3c4c18,0x01320958,0x01b5e80c,0x0187750c,0x008f213e,0x004cf792,0x00307bd5,0xffd48be7,0x011dfcf2,0x01f3231a,0x02805c50,0x021a0f1c,0x0127c6f4,0x00c4277c,0xffc15c01,0x0067d2d1,0x00d43d7d,0x00e7f3fa,0x0129c4ec,0x0138f1d4, -0x013b4c6c,0x00eec21a,0x003f152c,0x00741b80,0x00db46d9,0x01797c7a,0x00cb33c3,0x006f211e,0x0089a5c4,0x007ced96,0x00897ef1,0x013ec1ca,0x00a53b46,0xffc2f3bf,0xfe247890,0x00aedcef,0x00e8ca0a,0x00235d76,0xfe6ffdd8,0xfe7c0590,0xfff5d887,0x00b92cc9,0x006aef86,0xfedab03e,0xfee644e0, -0xff62fd3b,0x000e330d,0x00cc8c45,0x01886268,0x019cf8e2,0x0096760d,0x00b7df3c,0x00f41ad5,0x0132fa30,0x011abcee,0x00d55494,0x00c09166,0x00d76d5c,0x00d07b41,0x013f538a,0x01266f7c,0x00ca5b48,0x00af391d,0x00b209be,0x015201c0,0x0091a598,0xff88a13b,0xfe8e7e3e,0xfe96210c,0xfeeb3936, -0xff11125c,0xffad65e6,0x00344c8c,0x0132425c,0x008a5365,0xff916af2,0xfe4b6718,0xfeb60016,0xff5fcf76,0x00345cc6,0xfff781b9,0xff8023cc,0xfeba11c2,0xfeb0e748,0xfecb77b0,0xff217fce,0xffa59e35,0x000cfd3a,0x0065d2d4,0x00b80f58,0x01059d2a,0x0122ec2a,0x010e8c14,0x00c152dc,0x009af15d, -0x00a39386,0x00d18c39,0x00efff84,0x00f4251f,0x00bcf1e3,0x00d89b98,0x001a1743,0x019d2c44,0x016bbc4a,0x0151de2a,0x01453450,0x011acdf2,0x01065760,0x00f14ee6,0x00f0348f,0x00bc3cd4,0x00e278b1,0x00e225d1,0x00d916da,0x008b1164,0x0057e614,0x00339049,0x0043d244,0x0067cede,0x009b3528, -0x00bd4a38,0x009f500f,0xffa900b1,0x007e9be9,0x0099eea5,0x00a2dc42,0x00c64c61,0x012ef98a,0x0110b512,0x0127c52c,0x013a5d4e,0x0128e918,0x00dbee31,0x01463efc,0x00eee8ff,0x0139a728,0x0169a2a0,0x013843e8,0x01bcaafa,0x01775e40,0x0175df78,0x017992a0,0x018332d2,0x01893336,0x01865942, -0x018699e8,0x016d8566,0x01489752,0x012c9f2a,0x0103690c,0x00e99eeb,0x00c14c1e,0x00fa77f9,0x011b5850,0x012f3a64,0x01323c3e,0x0134cc54,0x01786dba,0x01480026,0x0117a1f4,0x005596e0,0x01ae633a,0x016cfd36,0x00d9942e,0x00f2d087,0x010ad254,0x0111453c,0x0132fe0a,0x015165a8,0x0141dd94, -0x017837fe,0x01967d0c,0x00f53c78,0x01997f88,0x02169780,0xff7b41e6,0xff2ec926,0xff61d5a5,0xff52bb0e,0xff491453,0xff3d1409,0xff303861,0xff380641,0xff500266,0xff43cb38,0xff404b2c,0xff33b167,0xff4cacfa,0xff5810f4,0xff754aed,0xff6befdd,0xff72b07b,0xff7098d7,0xff85bb83,0xff90a882, -0xff7a20b0,0xff9ba904,0xffbbbe73,0xffe2eefb,0xffc89d12,0xffeaae3e,0x002704ce,0x0016aabe,0x000540e5,0xffef36e6,0xfff2507c,0xfffd3c9a,0x00176822,0xffc1d1e7,0xff95b93a,0xffb958f4,0xff496236,0xfdb70b90,0xfe6b0bb8,0xff3ed5ed,0xff8c9b17,0xffbbed55,0xff994207,0xff32af86,0xff392a87, -0xfefb92a0,0xfef57cee,0xfed8d386,0xff29677e,0xff74b7c2,0xffc3f1b5,0xffaec929,0xffa4c542,0xff7c7740,0xffba5686,0xffb71608,0xff764b0b,0xffbd7bf2,0xffa79a49,0xff9c0667,0x003170db,0x005cff04,0x003b2852,0x0024cc40,0x000b44de,0x0003e6a1,0xfff3b81d,0xffe88d92,0x001e3283,0xffc53859, -0xff77c04f,0xfefa927e,0xfe9e57a0,0xfbd16a80,0xfcc6565c,0xfe6810b4,0xfda01534,0xfdc9e528,0xfe386ee2,0xfde9cbdc,0xfe294ad2,0xfd8486c8,0xfd3962c8,0xfd3f146c,0xfdbd06ac,0xfe356f0a,0xfeed03ba,0xfecdfadc,0xfeef86c0,0xff05e713,0xff75266f,0xffb70fd1,0xff78e7b0,0xffa19ece,0xfff0ff82, -0xffa0b877,0x00ddb99a,0x01340762,0x00e50f25,0x00fdf193,0x00bdd15e,0x008b98d4,0x008a8b7e,0x0080982f,0x00a805ba,0x00379397,0xff7f74fa,0xfe41304e,0xfd31a030,0xf756bbe0,0xf983bd60,0xfe03d450,0xfe798d58,0x0014348f,0x00fce312,0xff3ba55f,0xfee24224,0xfd84999c,0xfd2cd038,0xfcd0a488, -0xfdcf1fe0,0xfebe29ba,0xffc77512,0xff692307,0xff7a8851,0xff612abd,0x0036a50c,0x00134b95,0xff536ae4,0x00003781,0xffc76291,0xffa570a0,0x011904be,0x01e56f6a,0x022ed130,0x01928292,0x01080e0c,0x010726f4,0x014b9d40,0x01028634,0x009027de,0xfff33cea,0xfe1cf502,0xfcd99358,0xfa915ae0, -0xfe8e0f62,0x0374a7b0,0x061035e0,0x01526d04,0xf8198e90,0xf4eb8c20,0xf4260660,0xf846e488,0xf6ce10f0,0xf57b5d70,0xf425a560,0xf59c5500,0xf795e970,0xf98b4cd0,0xfc62e150,0xfce1a1d4,0xfaa28290,0xfd15b628,0xfe02d6c2,0xff5217a8,0x0020de73,0xffb17cb6,0x00a42398,0x00bf2d6f,0x00fcbd17, -0x02240f68,0x017c9abc,0x015c90da,0x0188a558,0x010b79fc,0x00ce405e,0x00a507e0,0xffd37767,0xfe42bda4,0xfe47681c,0xfcbc1b34,0x06d8c9e8,0x088a4570,0x09eab2f0,0x07d61a08,0x04be3960,0xfc77692c,0xf9aa5728,0xfe9ae5a2,0xfdeee1ac,0x00b0271b,0x03d86a78,0x04187e98,0x03f0c150,0x03c8421c, -0x03c50f9c,0x03729e90,0x020e3890,0x00877929,0xfec3139e,0xff399f46,0xff280ed7,0xff1ff4f6,0xff6e7120,0x0071fbc3,0x01027ba6,0x02a0d958,0x00fa2cfe,0x009f3df3,0x0117dab8,0x01f07f2a,0x01ea6360,0x02dd0710,0x02325e20,0x038a412c,0x05658a98,0x0688d308,0x02c3e320,0x02709e48,0x02c2d1dc, -0x0361e468,0x02d578f4,0x024fd4ec,0x01915000,0x0440b4a8,0x021be760,0x00617140,0xfcbacc54,0xfbc6e018,0xfc045a0c,0xfd2c12f4,0xff2d1755,0xff81f0ed,0xfe415ec2,0xff1cb7ef,0xffd6fc14,0xffc46e5d,0x008d014e,0x00e3b0fb,0x0135593a,0x00d3f7e3,0x01652f4c,0x04587600,0x019d04f0,0x0039cb83, -0x00be026a,0x0046d108,0x016eb64e,0x04acc4e0,0x0229c5c0,0x024204fc,0x0095fb52,0x0118d6be,0x01d9f954,0x0055971e,0x0124adf4,0x0278ca78,0x032692ac,0xffcc7ee5,0xff15d79f,0x017f8480,0x01dc3b16,0x0279c6ec,0x01fadd54,0x017c0fec,0x00584c7d,0xfee26588,0xff05c57a,0xffa99a72,0x00676a7d, -0x00d1ddd7,0x00cfe4c3,0x01629c30,0x01f5e13e,0x01a0039e,0x023a6300,0x02a4a7b0,0x0250642c,0x02b6a9d4,0x0072a216,0xffbf45cd,0x01623ee8,0x007b1ac9,0x00fb82ba,0x021d72f4,0x0183063e,0x01e530e0,0x012b38f8,0x019a03fa,0x0034c8d0,0x00a27cec,0xfffd1d03,0xffc1453a,0x025787f0,0x00382d4f, -0xffd397c2,0x008ea413,0x000050e5,0x00701cf0,0x016db5f4,0x008da68d,0xffa843e4,0xfef2ae6e,0xff809377,0xff3270a7,0xfe1b0bfc,0x009dc5a9,0x00a23f47,0xfffebe0b,0x00e3ebf2,0x003e0043,0x0016dc07,0x00cf3bf8,0x01148aa4,0x0157f84e,0x0195cdde,0x0125a434,0x00821763,0x00d30fe7,0x0143f56e, -0x01d5dd48,0x01498384,0x00ed0433,0x00964bfa,0x0021253c,0x01719a58,0x00701108,0x0174dba4,0x010363d2,0xff233774,0xfe1f46be,0xfe8ef7fa,0x010dbaa6,0x006a761f,0x00391ba3,0xffc3b10d,0x009945eb,0x010e7ab2,0x015c27f2,0xff980b59,0xff0e1a52,0xfff5058a,0x00722702,0x00621b1e,0x0073584d, -0x00d56afa,0x005fb665,0x009dda4d,0x00f749e1,0x010df9ce,0x00962d5e,0x0077a5c8,0x009beaf7,0x00b988dc,0x0036d126,0x002f1c61,0x013bfb10,0x00a4748e,0x00d01f2d,0x00fa8872,0x0181501c,0x00f7ffab,0x01a4db9e,0x00e0025f,0xff84c45d,0xfe8816ae,0xff71dcc6,0xfffeb3ad,0x00b865b4,0x00890df7, -0x00d7bf4c,0x00ffdd28,0x005aa3bd,0xff8aa803,0xfef8fe0c,0xff34aa03,0xff77fd7f,0xffd2e76a,0xffe8de55,0x00414015,0x002eca96,0xffce2ab0,0x002e855c,0x0027a959,0x002ac1d5,0x0086b8f0,0x009d60d9,0x00d43497,0x00689897,0x00ac7968,0x013624d6,0x01d3a6ec,0x0241861c,0x02285f78,0x02135bf4, -0x01ef37ec,0x0186ef30,0xff7baec6,0xff24dcf2,0xffa33bd9,0x0037a1dc,0x00acd648,0x00f12678,0x0120247a,0x015f2190,0x00f3d826,0x007676dd,0x00186577,0xffe3d99b,0xffde94b2,0xffa99e6c,0xfff5c50b,0x00125374,0x002178f5,0x00275b7c,0x001f5e64,0x004dbed2,0x00eb1323,0x003a8262,0x0007ba5d, -0x0010d256,0xfffae23b,0xff99d875,0xff7a04d9,0xff6780a3,0xff6b2fef,0xff13b0ce,0xfede49d6,0xfec16e08,0xfed63a16,0xff052f83,0xff0da1f8,0xff1e59a5,0x0046decb,0x0004dbf3,0x0052b0e0,0x0067c3da,0x0089c77c,0x00a0dcce,0x00bfd8e1,0x00f6463e,0x00db5e78,0x00dedc7a,0x00d366b5,0x00bf9fb1, -0x00a1d587,0x0080f77d,0x006a1ed8,0x0054b391,0x004e2334,0x004eae39,0x005294fc,0x002851e0,0x0074778b,0x00ba0be3,0x018bed40,0x0036cea0,0x009465ef,0x01722bba,0x015b67c6,0x013e95aa,0x011c3dac,0x010c275c,0x00fb8555,0x00d9e4ae,0x004dcc31,0xfff30643,0x012b628e,0x007260e1,0x00837cb1, -0xff300441,0xff9291b1,0xff78eede,0xff4fb658,0xff405a10,0xff043704,0xfedcc506,0xfebdd17a,0xfe7b27e8,0xfef97df4,0xff11808d,0xfed89f7c,0xff18c7a7,0xff2ea9fd,0xff4333cc,0xff386102,0xff409c74,0xff580e02,0xff4f3449,0xff52c287,0xff5d0971,0xff73b17e,0xff898e45,0xffaa2c03,0xff9bd398, -0xffadce5c,0xffbe4378,0xffc5d66c,0xffc44347,0xffc086e5,0xffba9dae,0xffb2fbf1,0xffc11bb0,0xff9d0e05,0xff9ef669,0xff84a89d,0xff80c8ee,0xff7b0fb9,0x00679247,0xfff35a0e,0xff6b27e9,0xfe57a15e,0xfd569f4c,0xfd040b24,0xfca047f8,0xfe198aa2,0xfe7babf4,0xfdd37380,0xfe534bc6,0xfe7aefe8, -0xfedaabfe,0xfed1c36a,0xfef4be8e,0xff425199,0xff3f0ec1,0xff58cba5,0xff91afaf,0xff80493d,0xff83623d,0xffb1b7f4,0xfffd32f7,0x001d9ea6,0xffdc7ae0,0xffe9ade8,0xffd73ed1,0xffef138c,0xffa43e11,0xffba2c0e,0x0018d5e2,0x003df164,0x0055b3c6,0x0033295b,0xffdd3d15,0x005fc163,0x01272056, -0x014eee44,0x009deed8,0xff2b8b25,0xfc4bdc28,0xfbb60a70,0xfa873bc0,0xfdb1e6d8,0xfea53b24,0xfd59c3a4,0xfead9942,0xfeff5994,0xff7c82f3,0xff2a8fbe,0xff527dcf,0xffe40d4b,0xff9198b6,0xff98e2af,0xfffdb8da,0xffa5d9f6,0xffd4d32a,0x004dc932,0x00cc321f,0x00e8e32e,0x00760437,0x00bc38dc, -0x008459d6,0x00bbb1fe,0x00311b0d,0x005686f1,0x00d38196,0x00b90a21,0x008373fe,0x00b39ca1,0x00854080,0x0211c0a4,0x04f00350,0x052d3d50,0x03a45514,0xfee5e7b6,0xf94f74e0,0xf7ba5230,0xf6a7f1a0,0xfbe9f8a8,0xfdcba904,0xfbf81d50,0xfd587350,0xfdd11408,0xfefed410,0xfe876bf6,0xfedca536, -0xffe621d4,0xff67a033,0xffc21c21,0x004da08a,0xff977b88,0xffffb1e5,0x002950b3,0x0187f91e,0x01e57aee,0x01d11f42,0x01836d60,0x011dd5a6,0x0163b778,0x00d3b0eb,0x00c10b99,0x01c3e076,0x023ea678,0x022ccfc0,0x02cd6030,0x0252cb5c,0x018a9af4,0xfe83eae4,0xfb30b5b0,0xfaf1e898,0xfc473580, -0xfcc61c5c,0xfea6b610,0xfeb1214a,0xfe5d9104,0xfec990d0,0xfddcd280,0xff741e07,0xfffb888e,0x015ff714,0x00c5fad9,0x01496772,0x01f077f0,0x01e79d26,0x016c2d26,0xff8dcebb,0xfee945de,0xffd54c52,0x0074de03,0x0127cd2a,0x01453974,0x018b0d88,0x01da036c,0x01b8e274,0x011c934c,0x024dc9d0, -0x025963e0,0x00add632,0x00234c96,0x00412839,0xfff3794f,0x01095140,0x064ded80,0x03f8e020,0x01bc5fc8,0x035eaae8,0x07fc8db0,0xfeafeac2,0xf9ed5508,0xfa3d6980,0xfbc12260,0xfb342b88,0xf789beb0,0xf96e5a30,0xfb4fa198,0xfd2587a8,0xfe465f9e,0xfe4e8286,0xfd41594c,0xfed6b456,0xfeed8fbc, -0xfdaced38,0xfe2d5d0e,0xfea70bc4,0xff1954b6,0x0086b752,0x00f45156,0x019adb00,0x0141fd04,0x00a26fd7,0x003e3043,0x00f8f2f7,0x01a645de,0x04000238,0x02189258,0x022c6540,0x04963730,0x049783d0,0xfd2de854,0xfd05ce5c,0xfdd1612c,0xff7615b9,0x02237470,0x016826fc,0x04d18508,0x05661d28, -0x05932478,0x03145ca8,0xfffd49d0,0xfda8d860,0xfb0fa330,0xf992c180,0xf867b4b8,0xf9370a70,0xfbb41520,0xfbc5c168,0xfc9d0468,0xff38db2d,0xfff37852,0x0052972e,0xff8478f7,0x01fa1e4a,0x025f15c0,0x01c6271c,0x010da84a,0x00125dbc,0x010d32ae,0xffb83ce4,0x00fa8548,0x04391018,0x03f0c258, -0x02581ec4,0xffa52c65,0xfdef2538,0xffa40de1,0x002e5ada,0xffef8c0d,0xff0bb42c,0xfea4c640,0xff6dd065,0x0100dd00,0x0312ece0,0x06320410,0x08b06240,0x093c6100,0x07425660,0x05268108,0x0411c8f8,0x02568ed4,0x014618b6,0x00203b31,0xff2aef06,0xfeb5efe4,0xff00a47a,0xff9eb370,0xffed60b0, -0x00278f57,0x01dec46e,0x01a06c2c,0x00f9d2e2,0x013083dc,0x00f260dd,0x019cee30,0x011e7654,0x012a8ccc,0x00a753db,0x00e7d54f,0x01338cb4,0x013a2b94,0x00661319,0x006edab3,0x006b6397,0x005d53cf,0x0007bfa4,0xfeabde80,0xfdb362b4,0xfe613390,0x01168a10,0x00bb3e2c,0x01882cde,0x02a4b130, -0x0422b3a8,0x04cf1a88,0x043a25d0,0x027310d8,0x019c0e4a,0x00f26a95,0xfff27429,0xff97f84e,0xfea41d2a,0xff0d1bc2,0xff055d9a,0xff91d9d7,0xffca4293,0x00386075,0x011816dc,0x00c5bbb8,0x00958d2a,0x00a94925,0x00893538,0x01231a98,0x0202699c,0x017ec39e,0x00ea6c57,0x005782c4,0x0045b2b9, -0x001a2777,0xffb3ff3f,0xfeef2cd0,0xff35108d,0xffe7dfd6,0xffd2eabf,0x005feaf1,0x01cc08c2,0x033759f8,0x037db064,0x02092c80,0x017c9534,0x014d0022,0x01c2c9b6,0x02f5d694,0x02c0ae58,0x019c828a,0x00e4f21b,0x003ad363,0xffb929f4,0x0028789a,0x00957cf9,0x008eccb3,0x00693683,0x00d968ae, -0x01d50038,0x011cfe78,0x00c0ee73,0x00983913,0x006bd5bd,0x006371c2,0x00421bd4,0x0039660c,0x00210b0a,0xffcc00a9,0xffee7d24,0x014a778e,0x00e72761,0x00932754,0x00a9d370,0x006352a9,0x01069bf2,0x016bbf12,0x019614a0,0x00f8648c,0x00953fc3,0x006f1c3c,0x00a242c9,0x00c7f16e,0x00cab490, -0x005fd75a,0x001bd299,0x000d534c,0x00bc52fb,0x0170ed42,0x01b8cc9a,0x0138310a,0x011e08b4,0x01013ca2,0x00bb9cdf,0x002e6a32,0xffecb9ff,0x001b4d9a,0x00f58ce3,0x00dc0682,0x011bad54,0x00fd240a,0x0117d176,0x00d4f7c2,0x00e89baf,0x00ccca75,0x00d690ee,0xffd77bf3,0x0059346e,0x00a5fa6b, -0x0101e842,0x01424532,0x01940bc4,0x01cf2b78,0x024972d0,0x024f8a98,0x0256a390,0x0228fc54,0x01c05fd2,0x014f5582,0x00e97fce,0x00fdf09f,0x01127f34,0x0101cae2,0x00ddd992,0x00d3d2cc,0x00c06a85,0xff9850d0,0x00520d4f,0x0065353e,0x0074c26e,0x00642934,0x00c1b2cc,0x0095c6fa,0x00443846, -0xffdf9db4,0xffd68264,0xff98140e,0xff4c335e,0xff79967c,0xff85af8a,0xffbbd9bd,0xffebefc0,0x00c5a807,0x00d22920,0x00da174d,0x00ee1464,0x0108db40,0x01161a2e,0x01267a60,0x0139b9ce,0x01203abe,0x01157006,0x0118bdba,0x012fb2ae,0x01488f08,0x0149524c,0x014c3b02,0x0143f250,0x0149f018, -0x014a880e,0x013964fe,0x01648834,0x0110e820,0x00d25a91,0x0022ad62,0x01187236,0x00d0c9df,0x002b88fe,0x0015ee23,0x001f5737,0x0032ada2,0x00267587,0x002c8e71,0x002b02d3,0x00a1d728,0x00dc6774,0x002c1a6f,0x00a27749,0x01139bf6,0xff1519e8,0xfef2c416,0xfee3625a,0xff056ba6,0xfee19a44, -0xfeab6b7a,0xfee062f6,0xfeea3756,0xfea74a28,0xff170082,0xff297637,0xff08f445,0xff0aede7,0xff1470fd,0xff40170d,0xff3558d3,0xff3732e8,0xff31c7c5,0xff3c3513,0xff3e824c,0xff480cfb,0xff20bbc8,0xff28da3b,0xff5ae4e2,0xff411386,0xff4440f5,0xff552a2f,0xff5b4845,0xff5edb1e,0xff5cc88c, -0xff4a37e0,0xff50574f,0xff78966c,0xff4e11b8,0xff2a7104,0xff8883e9,0xff2ff1dd,0xffcc13ce,0xfe76dfa6,0xfe6f1168,0xfe481244,0xfde882e8,0xfe8399ec,0xfe9ee130,0xfde7f3fc,0xfed8a980,0xff0d3d3e,0xfeca78ae,0xfedac4f2,0xfef74004,0xff4e5b86,0xff290c3f,0xff1f9053,0xff0ffd3d,0xff25d60f, -0xff3fd087,0xff644db7,0xff4c7008,0xff6bfa21,0xff88b767,0xffb7afa9,0xffd417c8,0xffaae631,0xffc5bde9,0xffa1c413,0xff7a7434,0xff66a9c3,0xff7959f9,0xffdc6839,0xffbfdc96,0xffbf28f2,0xffef0c4f,0xff56234a,0xff7de34f,0xfe5d04b6,0xfd755d2c,0xfd7652b0,0xfc194930,0xfdbe5c64,0xfe2a0d2c, -0xfcf17364,0xfeaadd66,0xfef361fa,0xfe7191ca,0xfe6d1f84,0xfea1f176,0xff6b560c,0xff604e8b,0xff83a64e,0xff4fe01f,0xff9f1146,0xffa7ceff,0xffcf2728,0xff915394,0xffb40f80,0xfff704ca,0x004e65bf,0x00676648,0x002e8b5a,0x00844d20,0x00622776,0x002f2627,0xffdd70e8,0xffebfa20,0x007d41f3, -0x0057c95e,0x00711054,0x00a0fede,0xff463f65,0x01722616,0xfda25a28,0xfbdc1138,0xfba76ff8,0xfaa46418,0xfd868760,0xfe68430e,0xfc462a4c,0xfe328682,0xfeba4334,0xfe282ffa,0xfe45be64,0xfed21dea,0xff9663f8,0xff835f35,0xff4e6bbd,0xfeff46fc,0xff796b64,0xffe0fc3d,0x0093fba4,0x0017cf6e, -0x007052de,0x00b978fe,0x014cda58,0x01b051ae,0x01d18306,0x01a660c2,0x012452e0,0x00ed5858,0x0078fa8d,0x009e16ca,0x018fc54e,0x01f76df4,0x025ffe24,0x0264fea4,0x011e32cc,0xf950ad30,0xfb33e1a0,0xfa54d848,0xfc0a5370,0xfea3478c,0xfc152554,0xfba26a50,0xfb6c7e30,0xfe6f9802,0xff768e01, -0x00515093,0x0066266e,0x005f0230,0x002d9cc0,0x003d88c6,0x012416fc,0x023ba690,0x011a7fa6,0x00a50575,0x012d7052,0x006dba50,0x0064d9d5,0x008ed46b,0x018c7594,0x0153c26c,0x00724769,0x01cbe09e,0x01f8f85a,0x01289f06,0x02428708,0x01182250,0xfe8ba31c,0xff6b8943,0xff283d74,0xfdbe87cc, -0xfa76f498,0x02cdb954,0x044d3e60,0x03be5bb0,0xff854720,0xfb2c0030,0xfa677f58,0xfab992f8,0xf70d3630,0xfd8f30e4,0x00fcb0d2,0x024bc6c8,0x00b3ad7d,0xff19b2ac,0xfefa8e00,0xfcc988c0,0xfc246538,0xfc1d9d68,0xfe19d90c,0xff8dab3c,0xff5d040b,0xff8bdc2f,0x0044bcc2,0x00776a27,0x01d4bac4, -0x02115e70,0x01c717ea,0x00cc79e4,0x0006f134,0x005b8fab,0x009e6a76,0x0175bb86,0x032e0e2c,0x0179c8e4,0x0100c66c,0x01a95ce4,0x02b87ddc,0xff1b07fc,0x00f7f65c,0x0121a738,0x03e739d4,0x0b6ee770,0x083e5fa0,0x060622b0,0x038e41e4,0x02f6d500,0x02ba43cc,0x022436d4,0x018dbbd0,0x00ccbbcf, -0x000d3bdc,0xffa2ec7d,0xffafe692,0xff5e57dd,0xfe4ffd72,0xfdaa85bc,0xfdeb59d8,0xfdfeac30,0xfea8cf1e,0xfeada590,0x020e49a0,0x01de800c,0xfebfac84,0x0047c7e1,0xffbdda20,0xfffb593b,0xff26c639,0x00614200,0x027db844,0x02e70148,0x0348c6a4,0xffdb4dbd,0xffc1269b,0x01584774,0x00d0dae5, -0x000ff8bf,0x000fa259,0x02689ed0,0xff87823d,0x007316e3,0x037f3dec,0x05899800,0x0586ee28,0x028acf10,0x02e9cc30,0x0272d074,0x01920656,0xff5c0249,0xfea20d8e,0xff5e43c7,0xff9740c1,0xffa4d3cb,0xff480243,0xfeb4f4a8,0xff29ea8c,0xfef55fb2,0x01b33a10,0x01e1f088,0xfff794e4,0x015576ee, -0x013ba254,0x01a09ad0,0x0224d5d4,0x02210a58,0x009bb732,0x007b81b8,0x0087e3a9,0x004c6e69,0x014130c6,0x0039101b,0x007e041e,0x02198e10,0x02533ccc,0x01d4f084,0x001459fd,0x005d1d1d,0x017dfd26,0x0249f4dc,0x0220eb3c,0x003ae9d8,0x00ecf30d,0x0108ddfe,0x02ad7e08,0x01a56da4,0x016c008c, -0x011779d8,0xff3b46a6,0xfef10cd6,0xffd47e3f,0xffe9b5c1,0x00907ff8,0x006e60fc,0x00449eb4,0x004cb5e3,0x0087f6c6,0x001f01cb,0x000afed0,0x00ad8b18,0x00654a9f,0x00bf85ad,0x011eaf4a,0x01fa61c8,0x01ef4bd0,0x00ebc73d,0x008a6adc,0x00abac7d,0x01885e20,0x01bca270,0x00d3df94,0x0047e378, -0xfe7f87ce,0xfe3878e4,0xfedd65ee,0xffc5fafc,0xfff56557,0xff325600,0xff3b809c,0xff4f10a3,0xff7bb26e,0xff9663de,0xff867613,0xff0c27f3,0xfff404ef,0x0053aa22,0x003b9c22,0x0040b4a0,0x001ca80b,0x00283d22,0x00412f22,0x00616e6d,0x0106e500,0x0100a848,0x00b28862,0xffc67c91,0x004ae73e, -0x0061dc04,0x00576c97,0x0024bde2,0x001fadea,0xffffc1a4,0x00c62173,0x001046e4,0x003674ee,0xffec3898,0xff8f6ba9,0xff97e110,0xff5a923f,0xff1e5ef0,0xfea07ac4,0xff5c3bbd,0x000c7bdc,0x00db800b,0x00168e97,0xff4e3851,0xfe5cc51a,0xff448913,0x0024fae2,0x00c2665a,0x00ba6b82,0x00660c54, -0x00eadcaa,0x013a76fa,0x00df36a3,0x00a650a2,0x00831d39,0x00909f8d,0x004d2d12,0x00d6c74a,0x00e51175,0x019607f0,0x00fdf196,0x00bb95e6,0x005be030,0x0083ec57,0x0096e201,0x00b5639c,0x008279f2,0x00386bb0,0xffac5c80,0xffbef496,0xffba7979,0xff9a956e,0xff890595,0xff88e775,0xff6d5216, -0xffe308a1,0x002b1e5d,0x00a81742,0x013425b8,0x01f3bc74,0x0293f850,0x02489618,0x01e13f56,0x01b16806,0x019cd684,0x01837cf2,0x016119e0,0x01f26e78,0x01099a82,0x00e1ccf9,0x00d8a1e4,0x00bc38a4,0x001c1a75,0x0004cf57,0xfffc2e58,0x00212001,0xffed7d24,0x00274319,0xfff7ba48,0x0030f558, -0x001564d8,0xffd7bd21,0xffc525e8,0xffce08d4,0xff0f07c3,0xff2ac605,0xff1e2c75,0xff1f1982,0xff19a70a,0xff1284c3,0xfefdc518,0xff22e4da,0xff3b1976,0xff46987d,0xff5ea6d0,0xff6793e9,0xff97f656,0xff835a02,0xff90765d,0xff86effa,0xff7e5274,0xff7e0e4b,0xff4256e6,0x0025d3fb,0x00a100fc, -0x01859aa8,0xff9d3fad,0x0054d9ea,0x014e4dda,0x01400372,0x011f4f46,0x00f4fbc8,0x00f23d87,0x00d6a89b,0x00d8def8,0x0058a3cd,0xffa1ef94,0x0110d880,0x004c6b23,0xfea7d226,0x0015c3e2,0xff74581d,0xfff250fe,0xffd4db32,0xffedb532,0xffe8b21a,0xfff9b4b7,0xfff9b6be,0x000d3a26,0xffff1402, -0x000e67c5,0x0043e362,0x0017b159,0x0018bcea,0x003bf991,0x0024f0b0,0x001b6b73,0xfffc716f,0x0025f426,0x0021c449,0x001f9ed6,0xffc9d3a0,0xff905816,0xff1900a7,0x000294c3,0xffa7d4d0,0xff2da7ec,0xff3cbac1,0xff3d860f,0xff329c68,0xff282faf,0xff285069,0xff459288,0xff9d7250,0xffeb3b37, -0xff23d52e,0xff453300,0xfe7b4762,0xffb50573,0x0004a88c,0x0001ca02,0xffcc1645,0xffdf99bd,0xffebca32,0x004afd7c,0x00171e9d,0x0028dc8a,0x009ad988,0x0013d963,0x001083f3,0x0072ca25,0x004da2ff,0x004b6a1a,0x0004a782,0x00738593,0x0068cbcf,0x0011e234,0xffa12181,0xfff5f0fc,0x00250043, -0x003fb462,0x00366034,0x00258274,0x00513db9,0x003d5f7e,0xffe4fdaf,0x000d48e4,0x00279af2,0x002cc166,0x00049e6f,0xffbcb757,0xffb8508b,0xff493024,0xfd503334,0xfdd25b54,0xfe7ddd94,0xfea222d4,0xfec8cd60,0xffc5d2e0,0xff78f6e9,0x0017c9fb,0xff4f55bb,0xffa8e5fe,0x00bc640c,0xffd3a750, -0xffc3b664,0x007ea1b4,0x0018f608,0x000e06af,0xff6eebc8,0x00780a5c,0x008062e6,0xffe473c6,0xfffb97c8,0xfff6703b,0x002f2ba3,0x00947264,0x00896c0b,0x00171938,0x008a3bf0,0x008fcef6,0xffff875e,0x000903b7,0xffe8a5ad,0x0063630d,0x00062297,0xffab7cee,0xff58cceb,0xfe13d69e,0xfb4fab58, -0xfd613318,0xfeeeb710,0xfe7de81c,0xfe6d3b7e,0xff89e335,0xffccbefb,0x010da70c,0xffc29955,0xffc482f2,0x0116df4a,0xff7f7526,0xff7f7574,0x0093c49b,0x005c26d1,0x005548d3,0xff7e422c,0x012f177c,0x01226fb2,0x0042c553,0x0099c279,0x0065e222,0x00b65cff,0x014f6092,0x01aeba7c,0x012e8c4e, -0x01bb595a,0x01496c94,0x00c278c5,0x0096d966,0x007fb954,0x00f04239,0x00704e99,0xff7b30dd,0xff3367fc,0xfcc49188,0xfbb9ff70,0xfe8d6120,0xfdd16318,0xfdd9ec84,0x0076105e,0xffe3974e,0xfed133dc,0xfcce6c00,0xfe2cdc6c,0xfedc70c4,0x0050dc15,0xfeb5916c,0xfdaee4b8,0xfd7d5d80,0xfd6dd9c0, -0xfdaad358,0xfdc8e848,0xfe0fd7c0,0xfe0dcc28,0xfee3cdf0,0xffec1eb0,0xff8eda20,0xffa4a096,0x00d2f28a,0x00f6abd7,0xffeca3d8,0x01656ee8,0x01a537cc,0x0067fd64,0x0141e262,0x006d4317,0xff349419,0xffb67b39,0xfeef1956,0xfd8fcdc8,0xfbb07108,0x03ef2280,0x0297c050,0xffe3d34c,0xfe9c09b2, -0xfcb63f04,0xfdbb462c,0xfd6fb2e8,0xfb228770,0xfea9e5ee,0xfed42c42,0xfd4edb3c,0xfea8ddda,0xff624a24,0xffccc946,0xffbd2e50,0x007434b6,0x0131eb72,0xffcb016b,0xffbf7be4,0x0080258f,0x0011f69b,0x00c64cec,0x00edf16f,0x0191f6b8,0x01d4e2e2,0x01ea048c,0x00abf09b,0xffa98378,0x0063ac21, -0xffcbee80,0x00aadaed,0x024050cc,0x00ef29d4,0x004c78e4,0x0013f8f9,0x024c15d0,0xff019dd5,0x013edc30,0x04513280,0x06bd3650,0x08327020,0x070d3790,0x039d269c,0xfea9f048,0xfed05f74,0xfe1d6cc6,0xfd74e9b8,0xfc93ee8c,0xfd2b0840,0xffa1ee15,0xffbc4b00,0xfffc39ad,0x000d332e,0xffd0576b, -0xff67dac7,0xfeec470c,0xff128853,0xff8ed43f,0xfeff1a90,0x0266df78,0x01eb3b50,0xfdef3f5c,0x003a02ff,0xfffca659,0x0001d684,0xff79e654,0x0039e97b,0x0092e830,0x03876d00,0x04809660,0x02868b90,0x0013c81a,0x0003268e,0x00c2e16b,0x01327dd4,0xffcdf5f8,0xfdbefbcc,0xfecc3f2c,0x00571394, -0x00ce6e76,0x02bc5dac,0x01ea00fe,0xff8efbf8,0xfe82ce70,0xfc92f408,0xfb2537c0,0xfb148010,0xfb9b1cc8,0xfce5b538,0xfd272e5c,0xfde2687c,0xff290967,0xffa93d55,0x0049435f,0x0056ba98,0x021606fc,0x021e3b04,0x003ce594,0x013850d4,0x00eb0756,0x00ce04c2,0x01c8fe06,0x022f6e94,0x00eaed39, -0x01732dc4,0x011557da,0xffee77c9,0x00215475,0x011c0ea0,0x00886e94,0xfffa5930,0x0090b9f1,0x0223e984,0x01eec770,0x0062fd47,0xfcfcb454,0xff8bce18,0x006f9a38,0xffde2f48,0x009e9763,0x00f57b9d,0x00f06365,0x011d7ad8,0x00dba19f,0x00e3b354,0x00821dc0,0x005addfb,0x006fef7a,0x00931710, -0x01006ca2,0x009dd721,0x00e717aa,0x00fb8a11,0x00b8619e,0xfffd4991,0xffcd8b20,0xfffbc730,0x001c092c,0x004a94c3,0x002eace9,0x01209b14,0x0163ac10,0x00c3de2f,0x0135e88c,0x0099f815,0x00e78fc8,0x019e4768,0x01bec076,0x00b41fe6,0x001f948d,0xff6fe39f,0xfdd84600,0xfed263d6,0xff31bec9, -0xffd1709c,0xff678fb4,0xff3f1963,0xff83daab,0xfeea346c,0xfee25d48,0xfec68a42,0xff67a0cc,0xffcac699,0xffde8d1e,0xffc7ceba,0xffa523ef,0x00042c1c,0x005481a5,0x005b52ed,0x000b1750,0x00570564,0x00668550,0x00bf7043,0x00c8d8c5,0x00e9c7e8,0x010a720e,0x01060306,0x00c28442,0x006e8c3b, -0x000fb047,0x01154794,0x01413e40,0x010a76e4,0x00e5af84,0x00b83232,0xfff8b5ba,0xff305a0f,0xfe4c29d6,0xfed434b8,0xff2b7908,0xffae525c,0xffbb07ac,0xffd6ff23,0xfff57997,0xfff0eb16,0xfff29c25,0xffe72638,0xff8e8e79,0xff1b5a07,0xfec9b9fa,0xff8f3e22,0xffe33282,0x0065f0ad,0x00544381, -0x00544b36,0x005f018a,0x005cd9b9,0x0063552d,0x007232ba,0x0067d039,0x00681afd,0x005e63fe,0x0080f3df,0x00aebba1,0x00d0c605,0x00f44fed,0xffe2e421,0x00581cd2,0x00017132,0xffa65aa5,0xff709e2a,0xff249801,0xfefcd234,0xfeafc640,0xfee89190,0xff003f4a,0xff1e0d39,0xff3dad9a,0xff5e7752, -0xff76ea75,0xff94db56,0xffb3cef0,0xffe31811,0xfff5364b,0x001cab2d,0x002597f0,0x002cebef,0xfff84ecd,0xffbeaf30,0xff87d0d6,0xff7e6753,0xff7188e8,0xffb34b9a,0xffce6c82,0xfff9acf9,0x0040f59c,0x007930a4,0x00c9a8f3,0x0098e017,0x007b535b,0x006a00cd,0x00753e95,0xff34fe2d,0xffca4b0c, -0xff9480a7,0xff8cb070,0xff71bf45,0xff636e2e,0xff50ae65,0xff2fa5a2,0xff440e11,0xff4e2b5b,0xff5bad3b,0xff6c9ace,0xff7f4b23,0xff977b10,0xff942e35,0xff8ee8cc,0xff87ea91,0xff8c6430,0xff9617ec,0xffa9b9d4,0xff09a131,0xfed0f324,0xfeb6df22,0xff307a7b,0xfec2b51a,0xfe79ffe0,0xfe9ff208, -0xfebdad60,0xfed9f7e2,0xfeebf01e,0xfefc5768,0xff18d341,0xff19370e,0xff7be23b,0xfec71bfe,0xfef55760,0xff534995,0xfff9544a,0x0019b479,0x00072e6d,0x002ff01b,0x0042c847,0x002ca76d,0x000ea11b,0xfff61c47,0xfff5ef9b,0xffcb4b91,0xffcdb9b4,0x00079b08,0xfff6dc84,0xfff8535d,0xffdd2f51, -0xffe89e8e,0xffe6ae5b,0xffddc395,0xffe71d36,0xffe9f747,0xffc609e4,0x001c9bbc,0x0047b35d,0x006a05a8,0x003aadbf,0x0056d10a,0x004c822c,0x00665809,0x00624374,0x0046f6c7,0x00558904,0x00590a98,0x0070193f,0x003e0c2e,0x000b83ef,0x003cc727,0x0018598e,0xffd30013,0x00804b70,0x00a0cb9d, -0x00981362,0x0034cd59,0xffe9c8a1,0xffb4e663,0xffc273ab,0xff454c92,0xff6cfebd,0x003be1b4,0x00284488,0x000d78f6,0xffa938b9,0xffb74180,0xffb40449,0xffa3341d,0xffd23c86,0xffd2bc45,0xffa99f1e,0x002d6379,0x001c291c,0x00624563,0x0073b450,0x007063cc,0x0010b1f4,0x003ee52c,0x003ec429, -0x0028d516,0x0015a4be,0x001e03c5,0x006dd6f8,0x003403b5,0x0028dd57,0x0022ec38,0xffe0e729,0xff9a43cf,0x00b52dc8,0x01e2922e,0x01ceb060,0x0150d666,0x00b9ca1b,0x00260537,0x004da57a,0xfefcef92,0xff14daaa,0x007bb807,0x002da372,0x00545871,0xffbb946a,0xffc15a79,0xff9c6587,0xff70b1e2, -0xff96bc06,0xff86fd32,0xff48b882,0xffcc95d8,0x0009ef55,0x00a1885a,0x00b5042d,0x00b2e119,0xfff32f8d,0x00922a13,0x005080fe,0x00380d64,0x0018228f,0x003dde4f,0x00d69cb6,0x0018af66,0xffd3f914,0xffeaddf5,0xffa4f872,0x005772dd,0x02cd0ed4,0x03911040,0x0328e014,0x01bee5e4,0x003b6378, -0xffdc5ada,0x004480ed,0xfe58416c,0xfe963bfa,0x016fd628,0x00ff7c90,0x00a7de44,0xffa3380e,0xff6f087f,0xff6b7f9f,0xff25131b,0xff8b956b,0xff752ce8,0xfee137a6,0xffe193c7,0x0017b00b,0x00c34a66,0x015582d8,0x013ae816,0x0028f7e8,0x01534480,0x014526c4,0x00954b47,0x006a51bb,0x00769ff5, -0x018aa076,0x00a5917c,0x00348b2d,0x00d2b8e4,0x0023decc,0xff25d5be,0xfdae0cbc,0xfbea67b0,0xfd280268,0xfec6be3c,0x015379d8,0x004706e4,0xfc7caa04,0xfd2bfcfc,0xfd31bb94,0xfde1e478,0xfe86c69a,0xff8fc52b,0x007fc8e7,0xfff36278,0xff3f4f6d,0xfe7a16f2,0xfef6cff0,0xff028c08,0xfe33babe, -0xfe6ee800,0xfeeffd96,0xff7f2a8a,0x003e2f2c,0x00d24197,0x00b9557c,0x012e442e,0x013c3af0,0x00898d5f,0x015ecfe4,0x00d4e11e,0xffbf0f46,0xfface5a0,0xffcfecfb,0xff12421c,0xff5419af,0xffbe1b73,0xff983734,0xfd4acb50,0xfc1a7f5c,0xf9a44358,0xfb08f1e0,0xfbcc4370,0xfafbaed8,0xf9b4bb38, -0xf9fabb78,0xfe778fc2,0xfe0115a4,0xfdeab55c,0xfddf599c,0xfd080170,0xfded4620,0x00aa7f5c,0xfffdbc2c,0xffb158e9,0x00150f33,0xffcb03bd,0xffee0c2a,0x003cfa49,0x0112bb6c,0x013a38de,0x00b9886e,0x00bb1cff,0x002070d6,0x003f64e4,0xffc49a4b,0x00d1eeb7,0x022b0c20,0x014e25e2,0x002d5087, -0xfe85152a,0xff3eae57,0x02eeff60,0x04fae8c0,0x058ee038,0x05c0b2e8,0x043672e8,0x052ae868,0x0251d974,0xfbbbf418,0xfd724840,0xfd8c5034,0xfdf341ec,0xfe650ea2,0xfebf20d2,0xff254705,0xff34b22d,0xff488cf0,0xff8de1ab,0xfee8e646,0xfee22c56,0xff468a2e,0xff437148,0xfffed997,0x0063870c, -0x02805418,0x021480f0,0xff013362,0x008ed4eb,0x004659a6,0x0080faf6,0x001f7d05,0x006f599b,0xff41a564,0x02f5c2fc,0x04965e98,0x03efd874,0x0353c94c,0x00c72196,0x0046b594,0x0054cf89,0x01135b56,0x0232ce80,0x03cc27f8,0x03ad7f68,0x00bd349a,0x02420bd8,0x01606ae4,0xffcc15db,0xfc799154, -0xfacb24a0,0xfad16c38,0xfbb40948,0xfc8eefbc,0xfd61f3f8,0xfdb8c344,0xfe22dc50,0xfeec582a,0xffb8ef0b,0x00839a19,0x0064a565,0x01a0bea2,0x01604c70,0xff73d611,0x01113e46,0x00fc5c70,0xfff8c044,0x01158e1a,0x01c928de,0x01a45ec8,0x01d49cf2,0x0144a82c,0x0063f53e,0x00ac063e,0x00a0106d, -0x015354ee,0x016448da,0x01a84318,0x01e0fc6e,0x01460730,0x0036d6c6,0xfe2d29f6,0x000a1c06,0x01bba9a8,0x04ba2d38,0x044c72f8,0x03cb7c04,0x0245e50c,0x0140676a,0x005f7984,0x00d59651,0x011fe22a,0x01700090,0x014d91a8,0x00fea5e3,0x00ea363a,0x00a5889c,0x0176c6d0,0x0197d29c,0x011d16da, -0x008aca0d,0x0046499a,0x000721ad,0x0073cb30,0x0082b153,0x00696392,0x01353902,0x0189eaf0,0x01370d26,0x00d2c0b5,0x008afc9e,0x00751b9e,0x00e13b22,0x017a8efa,0x01d3aa08,0x01a7685c,0x0131e5f8,0x0006f559,0x008139eb,0x008a8c77,0x01175024,0x0028ccd5,0xff46862d,0xfe2c6018,0xfe8a572e, -0xff43dc1c,0x006fe45e,0xffb53baf,0xff8f727d,0xff999812,0xff8a1ed9,0xfffb6ac2,0x002126a5,0x00ae3224,0x00dba4bb,0x00c92fda,0x00c6b374,0x00ce4d46,0x01227da0,0x011bcea6,0x0155ece0,0x0184541e,0x016075d8,0x011d8a78,0x00b9c809,0x00e0737a,0x00f494b8,0x013b441c,0x0113b506,0x00d93b20, -0x00ab5400,0x00a0cbe3,0x00ba0948,0x00df6605,0x01192eb8,0x01605216,0x01c82212,0x01eba484,0x0222ac24,0x0244b6f0,0x01b9a870,0x0103715c,0x006d96b2,0x00a9103a,0x0146242a,0x01203b16,0x007706bc,0x00de71ff,0x00f2f264,0x00f0e078,0x00c476f5,0x00f7137c,0x00b0dd60,0x00f87d74,0x008d9c70, -0x00aa81ca,0x00623f05,0x006c9085,0x006ed657,0x007b5727,0x0067c5b8,0x009c5567,0x004540b8,0x0002366f,0xffe8740c,0xfff8bcff,0xfff7ec09,0xfff8774e,0xfff10e0c,0xffe7888b,0xffe85d8a,0xffe2e84b,0xffdcacd4,0xffee18da,0x00022889,0x0037c7b2,0x00486055,0x007c0e35,0x008c78ba,0x008b438f, -0x006a03ec,0x008808f5,0x003ab3d4,0x007b9872,0x00868d47,0x007edf4b,0x006bb404,0x009982b1,0x009fb993,0x009df8ef,0x007984b4,0x00a86e6d,0x00b34e67,0x0097eb5d,0x007ce7e1,0x00573f10,0x00653863,0x004e4e89,0x004baeba,0x0040d819,0x004c8c68,0x0048470b,0x0044b374,0x0041c441,0x003dffeb, -0x00376ba4,0x00450a0e,0x00536fde,0x0060bacb,0x0069f82f,0x006d5d25,0x006d0474,0x006719ae,0x0060d121,0x0063c5e7,0x0067ae63,0x00659493,0x007b81bc,0x0078e253,0x004bdf59,0xffc17ab4,0x007e6b7e,0x004e4e8f,0xffb29b79,0xffbb30f3,0xffc8d453,0xffe2dc55,0xffdacaf4,0xffe3d39e,0xfff0267a, -0x004c2105,0x0071600b,0xfff8265b,0x003c91b1,0x0078d02c,0xffbaf1e2,0xffbd9a60,0xffbfc3c2,0xffb78a48,0xffa6878b,0xffb6e3cf,0xffb1f1fd,0xffa90df3,0xff7e4c9c,0xff8ab5a2,0xff9b46f5,0xffbe6a94,0xffcf50bc,0xffca5a5a,0xffa37ef1,0xffae6998,0xffb4d235,0xffd1e4ca,0xffc08b58,0xffc00ab9, -0xffd9794e,0xffc6a71e,0xffcecb3b,0xfffcce47,0xffd72500,0xffd34446,0xffd49db1,0xffdfa5fc,0xffdd524b,0xffd27cae,0xffd1cd43,0xffd96fe2,0xfffd3392,0xffc5acb9,0xffaf11d9,0xffd82995,0xffc3d53d,0xfff34ccd,0xff7fb89a,0xff6a257e,0xff9aaa0e,0xffe9fbe8,0xfff09c34,0xffbc42f3,0xff3184f2, -0xff1eb756,0xff3933ee,0xff959289,0xffe5530d,0xffedc615,0xff86c1f5,0xff9670d4,0xff941f33,0xffd7a1a2,0xff8cfc21,0xffa3ef87,0xffce220e,0xffbd1eeb,0x000cdfd5,0x002662e3,0x001eb939,0x000dc033,0xffe44691,0xffec38bc,0xffe29cc0,0xffd29491,0xffced2a0,0xffe1d2f5,0x002edb7c,0xffe2c1d9, -0xffbc844e,0xffa5e28e,0xff8bd850,0x003af6aa,0xfff049a8,0xff0e2bef,0xff574952,0xffc62434,0xff8534f1,0xff587fbd,0xfe6d09ac,0xfe6888ba,0xfecbb842,0xff9354e5,0x0026b426,0x00174a3f,0xff36039d,0xff702387,0xff7aa6bd,0x001ce00b,0xff95f7a9,0xffbc8eff,0xffd323eb,0xffd0e4bd,0x0045d421, -0x00b0857f,0x007c771b,0x005b91b4,0x0037ec43,0x0040c12f,0x0018676f,0x0000ed14,0xffed0aed,0x0007b333,0x00bdba1b,0x000ae970,0xffd38140,0xffd24bd7,0xffc39f3b,0x00692660,0xff40ad39,0xfe86384e,0xffc6ed0b,0x01047466,0x008226ed,0xffad3b39,0xfe11fe40,0xfdbf3bcc,0xfe440c72,0xff6a9e32, -0x0098af65,0x00897863,0xff435f31,0xff7cdfb2,0xff734ea7,0x0026a8a0,0xff0ac570,0xff650446,0xffab70bc,0xff5bff52,0x005ee03b,0x00e61ee7,0x011d817a,0x00b8c41e,0x002076a4,0x00e189c7,0x010d77e6,0x006911e5,0x00471d2c,0x005ae0cc,0x016d0bda,0x008a5734,0x004e9a0e,0xfff93cb0,0xff9a85f8, -0xfda182b8,0xfc892b90,0xfc5d5e48,0xfc045cfc,0xfa6cb150,0xfd8398a8,0xfef7f062,0xfedf58bc,0xfe22e002,0xfdfdcf7c,0xfefe7862,0xff4e4571,0x001ff54f,0xffdd2e93,0xff0dd639,0xff355739,0x00fdb71b,0x009125dc,0x0058e130,0xff8cb703,0xff76cd95,0x0037e6b2,0x00970fe4,0x00770d60,0x00e1f6cb, -0x019020c0,0x012fdbb8,0x00f4a12a,0x00b389a5,0x00fef7b6,0x0007024c,0xffa2f591,0xfee5f770,0xfeb3ff08,0xfec013b2,0xfe95c68c,0xfee16cae,0xfe712bc8,0xfb5a2778,0xfb873578,0xfdccdcd4,0xff821ddb,0xffc83d82,0xff626fc5,0xfd429770,0xfd4333f0,0xffdf11e8,0xfe5b8f96,0xfdeb0908,0xfde62b7c, -0xfec73d5e,0xfee485a6,0xfe3c2742,0xfedd70d4,0xff5bccf1,0xff7bf50a,0xff814c56,0xffbd881a,0x00846727,0x017bd60a,0x013ba228,0xffac6fcc,0x001cfa81,0x0006e591,0x0040ca02,0xffe0f0fb,0x0074057c,0x0028d360,0x01473130,0x00bfdc81,0xfec2896c,0xfecd9f3a,0x0417a150,0x04ee2f00,0x0639eec8, -0x05cc8940,0x03095168,0x02ff5490,0x00d158bb,0xfd555d80,0xfd44204c,0xfd657bf0,0x003ffe8c,0xfef5b836,0xfe9b3624,0xfe070bf6,0xfd2b208c,0xfd6ee6a8,0xfee10b5e,0xff021b98,0xff1af402,0xff604b01,0xff27e1c5,0xffd28d1a,0x009f1b1f,0x01d7eb12,0x01b6f59c,0xffe9a8cc,0x00ad8b96,0x004707ca, -0x003ed3f9,0x007cdca0,0x00ec1b6c,0xffb62c2b,0x02598bec,0x03857768,0x04acacd0,0x044eb420,0xffb21f30,0xff634975,0xff64b2e1,0x00a84478,0x01a9419c,0x051c37c0,0x051822b8,0x0207a124,0x012f4ac8,0xff9efb42,0x001c4ad3,0xfdd507d0,0xfd157450,0xfce903fc,0xfc745444,0xfc60e9cc,0xfd01ba90, -0xfdba54bc,0xfe6d7a3c,0xfee019e6,0xff7e1765,0xfffb0ecc,0x00573647,0x00817ffd,0x00583bb8,0xff4940d4,0x00521e80,0x009b9d58,0x00354de7,0x00980e9f,0x01360570,0x01fdc286,0x020d5f20,0x01814c54,0x008e78b6,0x00142d8c,0x01037c98,0x00aa2e29,0x0053b694,0x003ac52c,0x00ceaa20,0x007f976d, -0x00470e3d,0x006c9850,0x00ecb4a5,0x01d20288,0x03d085e4,0x025e7e28,0x01b841aa,0x00f7848f,0x014f5486,0x0168e4f4,0x0112eff6,0x00d9c2fb,0x00b57f75,0x00b806aa,0x006a99cf,0x005ed8eb,0x00eb5b09,0x01c8ce16,0x01de5f32,0x00e9810b,0x00f63667,0x00e7bf0b,0x00dde1ff,0x00ed2c3b,0x00abdb64, -0x00b3be6d,0x0132fc96,0x017fed00,0x016b086a,0x0138f510,0x007c304c,0x005f93ba,0x000d82aa,0x006b26fc,0x01cdc96a,0x00d13e56,0x00383d1f,0x00350e41,0xfe552378,0xfe595ed4,0x001a7d8a,0x004edd96,0x00757512,0xfff5b767,0xff452725,0xff3e44b0,0x00c2d8a2,0x00f4a30e,0x00fea463,0x009bb534, -0x005edded,0x00c3c870,0x00ccf436,0x00732461,0x0076f1f4,0x00eee7b9,0x012470fe,0x012cca6e,0x00e9de0d,0x018c9e58,0x01bf55e4,0x011f7000,0x01568d18,0x010833b2,0x009cdebe,0x005ca421,0x00cfc2fb,0x00bbc654,0x00be4edf,0x00e4a97a,0x00ebf0d6,0x008aa7d6,0x0031fb9a,0xffcfaffc,0xffdd42f7, -0xffbca255,0xff5beb6d,0xfff5d207,0x0088c80a,0x010c261e,0x017b7e58,0x01ca7dc6,0x01fd3a60,0x01b99e42,0x019e442e,0x01b5f598,0x01965d66,0x012b31f8,0x00f7c253,0x01157588,0x01186ff0,0x010e4300,0x00f3ce1e,0x00f6e2f2,0x00f09148,0x00b71efe,0x0091848e,0x00865b67,0x00660dbe,0x0055a243, -0x003caa33,0x0091d3f8,0x0029076c,0x007abf96,0x005f917d,0x0028483b,0x00038c3b,0xffef307a,0xffd81689,0xffa9ddc4,0xff923cd2,0xff7a5af0,0xff5b0e5d,0xff36f2a7,0xff002c37,0xfed998ec,0xfed8fd1c,0xfedac22a,0xfee67e80,0xff2525c1,0xff48064b,0xff6f95bf,0x0022cea1,0x0044eb95,0x007fb548, -0x00a5f403,0x00eaa3e0,0x0125d00c,0x012fe824,0x0131a050,0x013710aa,0x014ab120,0x016c5594,0x015c69d0,0x013f41ca,0x00f808d9,0x00bb2cbb,0x00af6b16,0x006676a0,0x00a7ab4f,0x00836268,0x007cae79,0x0071b161,0x006120ce,0x00557fd3,0x00520ecb,0x0040ce1f,0x00337388,0x002eb38b,0x001cae21, -0x0011389c,0xfffb986d,0x00163cf8,0x002ab799,0x003aedf6,0x003d2832,0x00487520,0x003be01f,0x004e0cc4,0x0058479a,0x0074e9b7,0x008b01d8,0x00924b08,0x008f708b,0x008432ec,0x00823a53,0x007e3b61,0x0078b8af,0x006c7df2,0x007592b7,0x008c5437,0x00a8e5de,0x00516857,0x00615eb3,0x00a9af7d, -0xfffa9c5a,0xffcbed3f,0xffcb3313,0xffd15390,0xffe3de8c,0x0012d30c,0x000ee114,0x000ecb6a,0x0018d371,0xffe3b2d5,0xffda2d4a,0xfff74c16,0xfff22ee8,0xfff68122,0xfffa782b,0xfff0a4ec,0xfff3a35d,0x00086ef0,0xffffd9f6,0x0003b6da,0x0027326a,0x000e80d8,0x0003227e,0xffe9e831,0x0010f9fc, -0xfffdb137,0xffdc98e0,0xffcfd4ce,0xffcb9b86,0xffc8baa9,0xffc90273,0xffd08166,0xffef22df,0xffead410,0xfff161e7,0xffaffb27,0xffc825e4,0xff4cc688,0xff57b19c,0xff88f6d4,0xffad83bb,0xfff681ed,0xfff300b5,0xfff6697d,0xfffd6c3a,0xff64a2fa,0xff55f515,0xffb86719,0xffbf95d4,0xffd5b04f, -0xfff17c92,0xffe5bf06,0xfff7130e,0x003f6db1,0x001ef87d,0x003517b1,0x0064b541,0x00268ee8,0x005b7d99,0x005ebd4f,0x00424da5,0x002cc9ad,0x00459c50,0x000f8460,0xfffed110,0xfff30719,0xfffce556,0x001208c9,0x003e0426,0x000cc26f,0xffcf6504,0xff7b3558,0xff636da6,0xfed78934,0xfeabe330, -0xfebc8c5e,0xff0916cd,0x00054a13,0x00484bc9,0x0072a01e,0x00a64665,0xff5876ec,0xff00eb34,0xff87f4df,0xff6c9f97,0xffa06e18,0xffb9a567,0xffa5b925,0xffc42809,0x003e2bf7,0x001fe454,0x00532bd3,0x00996ea7,0x009189f1,0x00be57d0,0x00d48f0f,0x009c3fc4,0x007643d8,0x00c5351c,0x003c4bb1, -0x001034d4,0x00008a93,0xfff888ed,0x00208e58,0x00a684ea,0x002553a4,0xffbe771a,0xff2a887a,0xff07dde0,0xfd2c2a40,0xfdc8fee4,0xfe676f32,0xfe8b0cd8,0xff7f8bde,0x0009d466,0x004eec18,0x006f494e,0xfe455090,0xfdec86f0,0xfee57cf8,0xfef78430,0xff26e8d5,0xffa3aa7a,0xffa521d8,0xffe4b844, -0x00b6a952,0x007e3a98,0x00d23744,0x01404a3e,0x00c510b9,0x01113ffc,0x0140e74e,0x00f0e7c1,0x00b0822d,0x00ce4223,0x00c5095a,0x00d1b781,0x003f5cb5,0x00476adc,0x00510afa,0x0116b5ea,0x003b30f5,0xff621953,0xfe3b6a24,0xfd6062a4,0xff8bdd13,0xfec017f6,0xfdc7c8a8,0xfddbc090,0xfe5589c6, -0xfeeb21e8,0xff4bf4e0,0xffc254a8,0xffe3bc92,0xff435bfb,0xfd5a548c,0xfeb5633a,0xfe79dc26,0xfe097956,0xfe384882,0xfeb1c122,0x00021bf1,0xffab5b33,0xffb0dfe2,0xffade2a1,0x00469486,0x00defa00,0x014cc666,0x00ccb3ad,0x00ddfa26,0x019f2de8,0x010b503c,0x00a2b045,0x0067f950,0x005aa315, -0xfff80e60,0x0050b21f,0xff30e0b1,0xfed06426,0xff4bb747,0xffb8861c,0xfcdcbcb8,0xfd1bde90,0xfcf8c6b0,0xfd6988e4,0xfe9b8c7c,0x00e56e7f,0x00ebb6c7,0x00af5a7f,0xfd25ead0,0xfc461720,0xfda5ac38,0xff6b8d27,0x00730861,0xff892b6c,0x0049f5c2,0xfff25690,0xffbfeb01,0xffa10c10,0xffd1d566, -0xffe47f44,0x00192031,0x0069cdc8,0x00e25b72,0x01b3056e,0x0175529e,0xffac0d7f,0xffcdbaa6,0xffc23866,0x003e48e0,0xff7f55b3,0xffb6ce8a,0xff53c5a4,0x0133417c,0x011a69fa,0xff5c93e7,0xfddc4a28,0x05637ca8,0x0765de30,0x0550a4f0,0x0354bf3c,0x010948ec,0xfcc69680,0xfbf4b3a8,0xfecaade4, -0xfbdcf828,0xfc8079cc,0xff42caea,0xffb2c9d9,0xffbb7138,0xfdeaa9a4,0xfdeedecc,0xfddb5074,0xfe976948,0xffbfeb9f,0x00103241,0xff524c21,0xff78eae2,0x000fc830,0x017610d4,0x00c5e6e6,0x0077cd65,0xffc4a1da,0x002ee78c,0x00175963,0xffecdabf,0x00318927,0x008314f0,0xffc3e5d2,0x01647a68, -0x02aafcc0,0x04836710,0x04d14d50,0xfffad798,0x0007898f,0xff601bcb,0x00e89e25,0x0398b564,0x05157fd8,0x046c7778,0x02af0310,0xfde58290,0xfbfde670,0xfd3fffc8,0xfd4a2270,0xfe5a61da,0xfe24405c,0xfec03584,0xfe80b766,0xfe29e804,0xfe32b976,0xfedc5dbc,0xff6d9d7b,0xff90ad2c,0x00494f71, -0x018545fc,0x00b05bc3,0x00a1ec85,0x008041cc,0x0017ba70,0x0035a8ab,0x0080196f,0x001e682e,0x009488ef,0x01dc8a34,0x022e63a8,0x021a82c4,0x01619bfa,0x00e78728,0x012391b4,0x011cc8b2,0x00c4854a,0xfffb1459,0xff0d0b3f,0x0015d774,0x0092be53,0x0216cbec,0x00f1a763,0x01355e78,0x028cb960, -0x01b542f4,0x00f0d769,0xffece61d,0xff7e29de,0xffa562c8,0x003c030d,0x004ef2ad,0x004e7783,0x008fd576,0x007358c1,0x00b228b3,0x0100c100,0x01819a2c,0x017f3f78,0x00b9e5cc,0x00fc200c,0x012ccf2c,0x01e6968c,0x01213544,0x00d28ada,0x00b48c0b,0x00f383b6,0x0135891e,0x015cdb30,0x016656c8, -0x000ae2f3,0xff9bee4d,0xffc01781,0xffeb1a9a,0xffd636be,0x00bcc24c,0x00db6403,0x005aecd4,0xff3da5f2,0xff1906c6,0xffa0ec76,0x00e7395f,0x020b1858,0x02a82600,0x02d61a00,0x02396b94,0x00f06229,0x00e668ff,0x00e912b5,0x00ff7523,0x013a650a,0x01462b44,0x0158869a,0x00bee60a,0x0062e5e7, -0x0053584a,0x00c1832d,0x00f63309,0x012b89be,0x01461e2c,0x014e3cb0,0x0125ce62,0x017487e0,0x015d2e4c,0x011a5f70,0x0078ba7a,0x0036df2b,0xfff12ecb,0x0070dffa,0x00deb097,0x01464d7e,0x00f5788e,0x00cd3135,0x00dec792,0x00a4c4ef,0x004d9ffd,0xffc19f5e,0xfffd817c,0x00354a8b,0x00a9a67a, -0x0096f273,0x00b2e726,0x00d629b8,0x00fd4a6e,0x00ed7c80,0x00fb999c,0x00d3310f,0x0076e3ac,0x00230a4a,0x00ae8e4f,0x0126d00c,0x01983960,0x01269f82,0x00bfe8e4,0x007d7295,0x0080a2ec,0x0099d521,0x00a45c9e,0x008f9a15,0x006b322a,0x0066d038,0x0054ec76,0x012c267c,0x0155fd16,0x012908d6, -0x00f48a1f,0x00dbfb30,0x00be9b38,0x00a41298,0x007883ce,0x004dc6c9,0x003b8fdf,0x002745e3,0x002055d5,0xfffe9717,0xffd53b10,0xffdb8452,0xffe437e6,0xffeacd91,0xffe414c5,0xfff18eb3,0xffee1eec,0xffdda1a1,0x00521aa6,0x0078c278,0x00a809cd,0x00bc7b26,0x00f4d829,0x0102061e,0x012d9624, -0x0148061a,0x01564d5e,0x015c7008,0x01850c88,0x01663070,0x01683ac8,0x015176c0,0x014d3866,0x00efc1df,0x0104aafc,0x00eb2b28,0x00e2c512,0x00ceb087,0x00c7b922,0x00bfaea4,0x00b97db0,0x00c0cb3d,0x00c049dc,0x00bd9df4,0x00aa6af8,0x009db7b0,0x008b60a9,0x00931fba,0x00901cf2,0x008c668c, -0x008d4a13,0x008a1e4d,0x008b6575,0x008a2556,0x0093f6f0,0x0097e7ea,0x00c444dc,0x00cc5ed3,0x00e0852a,0x00e387f6,0x00e45225,0x00e55ac3,0x00eb25e7,0x00ecd01f,0x00ee7450,0x00e7f0cb,0x00f1d0b1,0x00ceff2b,0x00ead1fd,0x00dfdfa8,0x000f9eb7,0xfff63b65,0xfffd268a,0xffd598ff,0xffd3a1d1, -0xffd3aab6,0xfff542d7,0x0005328e,0x00225da9,0xffe71ac6,0xffe322a6,0x0013b5e8,0xfff9f347,0xfffdd934,0x0004169e,0x001112cd,0x00189b19,0x002068fc,0x00192cd1,0x001d415c,0x0028b7bd,0x00338d49,0x003334e3,0x00280ab2,0x002ff4e9,0x002a615a,0x0028ad76,0x000a8765,0x00010f45,0xfffa6dea, -0x0005010d,0x000c7b61,0x002214b1,0x001ceacc,0x0015929d,0xffddfe2c,0xfff32da6,0xff75f718,0xffcaecc7,0xff74a1fb,0xff82473f,0xffc8f389,0x003ffd30,0x005fc650,0x008701e8,0xffe4381d,0xffc3d0bb,0x003d1c59,0xffeee71b,0xffe8f470,0xffe66225,0x0000c4e8,0x0014c72e,0x002c2831,0x00337019, -0x00430aef,0x006d7117,0x00854757,0x0081fdf8,0x007c3384,0x006a850e,0x005ab6c6,0x00702ab9,0x001bd92b,0x00024ec1,0xfffff6e0,0x000deb3b,0x002d5812,0x0059feda,0x00468860,0x00174f25,0xff9de583,0xffbffe28,0xff4e74dd,0xff954208,0xfefbf0f4,0xfebd5bac,0xfedb9fbe,0xffa82a54,0xfff17121, -0x008ad092,0xff677c1b,0xff350478,0x004a8bb1,0xff9368fd,0xffb7fbea,0xfffc0c1a,0x00216aab,0x003f8a2d,0x0051794d,0x003bf573,0x00533d35,0x00a00456,0x00dfecfd,0x00e6e017,0x00d861b9,0x00c38b85,0x00adecc3,0x00e18dd3,0x0039f38f,0xffeba6f7,0xfff0536e,0x00052bb8,0x004a86e0,0x00b039d3, -0x00680fcc,0x0011929b,0xff42353f,0xff9d9da1,0xfedbb48a,0xffa51a31,0xfea76d62,0xfe771bf0,0xff59fecd,0x00824102,0x00f4036e,0x01858a2a,0xff8da112,0xff270b5d,0x00dec07d,0xffc83814,0xffb1e3ae,0xfffc6b15,0xfffdb308,0x00243579,0x004f68d0,0x0087b6bf,0x00971ba5,0x00f19ac7,0x0183210a, -0x015cfa92,0x015cf9d0,0x01174a04,0x00f0237c,0x014a3342,0x00b963a3,0x009021b9,0x001125b5,0x002b306d,0x00600ea1,0x013743c0,0x00b175aa,0x000b5f9f,0xfed55ab8,0xff1cee69,0x00dd0ac4,0xfeac2bc4,0xfdad187c,0xfd13fd8c,0xfcf1c010,0xfe4b63d0,0xff0f525f,0xffc82ea3,0x00d14572,0x003c9683, -0xfd746fc8,0xfdd114a4,0xfe184190,0xfe68eba2,0x0011be99,0x0015dba1,0xfeca1312,0xfedce2c2,0xff10ab3d,0xffa2c68c,0x0006d7a1,0x007794c8,0x010209dc,0x00947e26,0x00ad9236,0x0176062a,0x00b6d6d3,0x00471c12,0x00467aea,0x00642271,0x003c5b8f,0x004ce4c5,0xff9eb497,0xff7ecc5f,0xff6cd6fd, -0x00fd871c,0xfd12d7f4,0xfce3e768,0xfd35ab00,0xfe9b298e,0xfef86b60,0xfffd6083,0x00688fe7,0x00f2ad13,0xfde094e4,0xfd338384,0xfc0008e8,0xff1c55bc,0x001f19f4,0x00208c71,0xfff54742,0xffc031b6,0x007f0b0e,0x006232c9,0x003af332,0x002d34fa,0x008a0d48,0x00acdb85,0x00f983e2,0x01607172, -0x016525d8,0x002849aa,0xfff12372,0x001129b1,0x0036b983,0xffe42071,0x0004d434,0xff569a39,0x00ffb533,0x00e61b6f,0x002b5984,0xfdf4433c,0x05c413d0,0x04dedcb0,0x034b458c,0x00d57e12,0xfdbc1cd8,0xfb31ce00,0xfaf1bbf8,0xff827737,0xfbb43620,0xfb798268,0xfbad1db0,0xfe1020f0,0xfed33b30, -0xfdc0b258,0xff3fcbf1,0xff6da13d,0xff0f0a8c,0xff58a603,0xffc2203a,0xff86487e,0xffee4c96,0x00b4744d,0x02901114,0xffe6f0d2,0xff56f7df,0xffdf9d2b,0xffb0f3a9,0x000f00ed,0xfffc3fc5,0xffe23dc4,0x00124b5d,0xffcece22,0x00b8c0f0,0x01c2f4f6,0x051c69b8,0x04d119c8,0x00e0dc50,0x01548e16, -0x01e0a1ca,0x0304f7d4,0x050651a0,0x03ef832c,0x027b3a3c,0x022e9d64,0xfc7440d8,0xfb988b78,0xfd0b8ce0,0xff38612b,0x00254795,0xff1207aa,0xff15f8be,0xfec0e35c,0xff1753de,0xfec580bc,0xfede2648,0xff8ac740,0xffc10a77,0x0044602a,0x0233c9ac,0x00a0b417,0x00657016,0x00cda9bb,0x002ee9cf, -0x00239659,0x00307df3,0xffbae67f,0x000f4914,0x01683bfa,0x0222f5e0,0x0254a5f0,0x02298a2c,0x015afb6c,0x013edd2a,0x017e42ce,0x011d283c,0x00a3dcfd,0xffdd032e,0x00ccac28,0x02488f10,0x045a0248,0x02cd7828,0x01fb21d2,0x0094b91c,0x004babe5,0xffaac6ab,0xfe90cf84,0xfe0b1a76,0xfdd60de4, -0xfe8d01d0,0xfef43d5e,0xff4e419a,0xffcd7fdf,0x005a5f76,0x007c3dae,0x010e7060,0x00f3c58c,0x00f11ad9,0x00b4f408,0x00da50d7,0x01144c82,0x01deb636,0x0182d5d6,0x0159074c,0x00ea6595,0x00e72ac2,0x011b37d8,0x017738d0,0x01524ce2,0xffedb9e3,0xffcab17c,0xff749d86,0xff8fec2b,0xffe52ec4, -0x00ca4fa9,0x00e7043c,0x00915a5e,0x00f4b2f9,0x00e2753f,0x001f0594,0x018fbde2,0x028c7c3c,0x035d874c,0x035e921c,0x02fd4e3c,0x01dafb48,0x012abca0,0x00cfae55,0x00e3c5a3,0x011046fc,0x01110dd2,0x010a8e42,0x0134eb0c,0x0105a47c,0x0087164d,0x007fe561,0x00b2a929,0x01333b50,0x00bcea2b, -0x00d4a9ca,0x013c39cc,0x015c839a,0x0146c746,0x011c5afc,0x007a87b9,0x00934a9d,0x0090b5c6,0x00b9d869,0x00c10b74,0x00c6ba21,0x00d19f74,0x011182e8,0x0151137e,0x0119b4fa,0x00e7f893,0x00aa04b6,0x0052fb82,0xffe45a85,0xffa558cb,0xffa8550d,0xffd3f06d,0x00073a03,0xfffeb80f,0xffb8e412, -0xffc407e0,0x002b0c86,0xffe6c828,0xffc8d770,0x003a59dd,0x00c94456,0x0147a7f2,0x0116b1e6,0x00bfa7aa,0x0084e1aa,0x00b2306b,0x00d47ad6,0x00f9873e,0x00c8b393,0x00b61127,0x00ab6db0,0x00a95667,0x011ff064,0x00f861a4,0x00e319b7,0x00d4f1ec,0x00ce387f,0x00c22af5,0x00a3a620,0x0095b33c, -0x008609d4,0x00897982,0x00992539,0x009c7dfe,0x00b3324a,0x00bbd6dc,0x00b80b09,0x009f8090,0x008c6794,0x0079053d,0x00733df6,0x00635892,0x0077f3af,0x0093469d,0x00bc30c1,0x00c91eb1,0x00c0602c,0x00d1f2c3,0x00cf7d26,0x00e6aa56,0x00eb8857,0x00edb2b4,0x00d7d7ee,0x00efbae5,0x00ed954b, -0x01062e26,0x010aafd6,0x00fa441b,0x00ce96ac,0x00c563e7,0x00c298a9,0x00bae629,0x00b1e7ae,0x00acfe50,0x00aba497,0x00a4fefc,0x00aecf1e,0x00ae7d02,0x00a87c7e,0x00aa2012,0x00a6b27c,0x00a522d4,0x009dc882,0x009ca150,0x009a4576,0x009bd360,0x009e3d53,0x00990925,0x00914df0,0x009ccf4d, -0x00a74167,0x00a58e14,0x00b23398,0x00c5f48c,0x00c69dda,0x00c9463a,0x00cce1ba,0x00cd2f8a,0x00d35423,0x00cd9243,0x00b28ecd,0x00a82e88,0x00e10803,0x00ce5889,0x00be6cd7,0xfffae048,0xfff231cb,0x000bdf2b,0xffd3927f,0xffccb3fc,0xffef92a0,0xffe8408d,0xfff4fadc,0x001cf5e1,0xfffba88d, -0xfff5ae40,0xfffd2e32,0xffe5b36d,0xffdf9cc7,0xffdc6155,0xfff59129,0xfffe0ed6,0xfffdba39,0xfffbb673,0x0002c74f,0x0010b307,0x001c213f,0x0023b26b,0x002c894c,0x001a970d,0x001a2192,0x002ac0fc,0x000b5fe7,0x0000cb99,0xfffaa701,0x000a7f93,0x001684d9,0x0028e24f,0x000fdacc,0x0000e4e0, -0xffeb6c16,0xfff80b7c,0xffc86959,0xfffe519e,0xff7cad8f,0xff724b2c,0xffe604fb,0xffd53cb0,0xfff24c72,0x003b7fd8,0xffed7347,0xffd10b2e,0xffeb093a,0xffd1d616,0xffca7c14,0xffb89c4e,0xffec3853,0xfff97889,0xfff21312,0xfff1f0c3,0x00081250,0x00388129,0x0067b402,0x00710927,0x005fe2c6, -0x00605645,0x004f9ed5,0x0048badc,0x0003a28a,0xffe86e97,0xffe7a9e4,0x000253b3,0x001fbac3,0x004acff0,0x003d3162,0x00187cb9,0xff96500d,0xffc2325f,0xffe51134,0x002ecf5c,0xfefadcf8,0xfed560b6,0xffd2cea4,0xff8e01c7,0xffcd6984,0x00abbcc0,0x001d48da,0xffe96f36,0x000eb05e,0xff9021d8, -0xff76a482,0xff71fd5f,0xfff4611e,0x00144669,0x00189c87,0xfffc6b5e,0x00292c6b,0x00827035,0x00bbd1de,0x00d66fd4,0x00bb1d48,0x00b9c629,0x00a83c12,0x009dc272,0x00159153,0xffd40503,0xffd487cb,0x00061550,0x004c2e4f,0x009744e0,0x006cd482,0x00281c78,0xff788e20,0xffff3eef,0xffc1ea9b, -0x00103f2e,0xfe47e290,0xfe6ea6fa,0x003c8966,0xffa7f6c2,0xfffa19db,0x00f4b139,0xfffe21b2,0xff74762f,0xfffff089,0xffd2f6f3,0xff97ed0d,0xff664a94,0xffe13bb1,0x0013efe4,0x001727a2,0x0002a212,0x0049ffc6,0x00cc2c08,0x0129db40,0x0178d012,0x01527e4a,0x012962a0,0x00f01c8f,0x014b3080, -0x008e5149,0x004fbf92,0xfff6140c,0x001d3f8c,0x007d4dd3,0x0111e650,0x00e1bfe8,0x009591d1,0xff153557,0xff7e8878,0x00a7a61e,0xfced9998,0xfdc7af98,0xfd149d28,0xfc1b082c,0xfd94ba18,0xfe99a36c,0xfeb0584c,0x018ff2fa,0x01d876bc,0xff439c3b,0xfe36f83c,0xfe4b1a14,0xffc42991,0x009c87a2, -0x008e3bec,0xff827a21,0xffd63366,0x001cc426,0x002689aa,0x0004f3bd,0x0051041b,0x00a82a9c,0x0088f70e,0x00b8368e,0x01477956,0x005cdfb2,0x00058a0e,0x006c5a38,0x00078579,0xffa3be48,0x002eb758,0xffa4771d,0xff7ba0ac,0xff27a4f8,0x01294f60,0xfd21fdb0,0xfd08180c,0xff2fef82,0x00f7034c, -0x021ea0b0,0x0082e418,0x0030a657,0x01739e78,0xffc2b0ae,0xfe3103d8,0xfd1f129c,0xfd97e6ac,0xfe02e5e4,0xff16ba31,0xfec11bda,0xff27309a,0xffe30ec4,0xffea84d6,0xffd2b8a7,0xffd4da9c,0x0089a34c,0x00c8ed5f,0x0182a274,0x00d26d65,0x00af62a3,0x005c4e93,0x0001827f,0x001ecf21,0x00254f26, -0x00016a3e,0x0018f62a,0xff8cbd1a,0x007afd9c,0x005b4707,0x0043b133,0xfe157ba6,0x04316500,0x018ce53e,0xff125a48,0xfbc96560,0xf8119d50,0xf9951138,0xfb0c5188,0xfd312a3c,0xfdc05ecc,0xfe3ce132,0xfd476974,0xfe262094,0xfeb9a552,0xffa11db8,0x0035a873,0x0003a917,0xff8fae63,0xff612288, -0xff907779,0xffd94ec8,0x00199bf3,0x00de1ab5,0x02a149b4,0xffeb92b1,0xff599864,0x00623228,0xffb3cbbe,0x004627ff,0x0033563f,0xfffbb4c6,0xfff9b0af,0xffd9391d,0xffde183a,0x008c0d03,0x0363614c,0x03ca5f50,0x02185114,0x02ded31c,0x0509fb08,0x05c81198,0x0532ec40,0x035c507c,0x0117da34, -0xff621410,0xfd6e101c,0xfd87bc40,0xfdcd1590,0x00666088,0x00ba3367,0xffd9d9a9,0xff1e75ca,0xfeeb261a,0xff2f2568,0xff0f5c21,0xfeed424c,0xff20f37b,0xff1acf66,0xffa530b9,0x01a242b4,0x002d8c7d,0x0014fddb,0x008f9d73,0x0005eb61,0x000de289,0x0001d07a,0xffebc340,0x003278fe,0x013fbc84, -0x01d47eee,0x024e475c,0x02e87548,0x02092954,0x00ef8a9c,0x00aa4017,0x008244b4,0x00739333,0x004e6b94,0x01efbf2c,0x039c0eb8,0x04e429a8,0x03949b70,0x019b8280,0xfe82f280,0xfe566a8c,0xfe60be3c,0xff1c6b70,0xfeffc5d2,0xfeb9751e,0xfe1bfb66,0xfe8c02c4,0xff0b868f,0xff724648,0xfff43010, -0x007ac79e,0x012d9a0c,0x00b91450,0x008922a3,0x006d773e,0x010be664,0x014d0e24,0x016111a8,0x017f6118,0x01861406,0x019a06f8,0x01363e8c,0x011b1ba0,0x016b402e,0x01012c9e,0x00afb20b,0x00a7f028,0x00a106bc,0x008a07c0,0x00dd85ff,0x0098bd1f,0x009d0cd7,0x01b149a2,0x01e26c8a,0x0233ffa0, -0x027ab3a8,0x022f0250,0x01ff055c,0x028f8928,0x023714b8,0x0244137c,0x02411e1c,0x01bea582,0x014a64b4,0x00f87e8c,0x00d05a30,0x00c2c2d5,0x009afd70,0x010ee90e,0x01399ee4,0x01077a2e,0x00ac4234,0x009982a5,0x008a5f6c,0x006aee74,0x0080dbc7,0x00ca6a29,0x01185fb0,0x0147a6c4,0x01675b82, -0x0124aee0,0x0069ebaa,0x001c8401,0xfffdeecb,0xffe9b8ec,0xffe6230d,0x002d9bb4,0x00692823,0x00803934,0x0076734b,0x00500946,0x001b979e,0xffdf3af3,0xffb571a4,0xff7aab31,0xff62cd8a,0xff455946,0xff3064fd,0xff42a40e,0xff7cff31,0xff6a2983,0xff9a9abc,0x000ee01a,0x0075a0c8,0x006f2c57, -0x007dac87,0x00984734,0x00bcea7b,0x00bf4541,0x00dd0a26,0x00e46087,0x00e66e10,0x00e973f7,0x00bf5363,0x0099ec98,0x0085d7cb,0x00705bfc,0x00daa6c9,0x00df40fd,0x00dc186e,0x00df6fe2,0x00c28892,0x00afb247,0x0091a5ee,0x007bd60a,0x008477cd,0x009c3455,0x00b9ee7a,0x00c49a0e,0x00c51e09, -0x00bd79c6,0x00c122ac,0x00bd5eb1,0x00b2cd00,0x00a637e8,0x00959892,0x0080fb35,0x00896af9,0x009eb3ea,0x00b2d79e,0x00bbd86d,0x00d4bbe0,0x00e77d44,0x00d5377b,0x00cb54b8,0x00c283f2,0x00b0baef,0x00a04abf,0x009850e7,0x00a134fa,0x00b24c54,0x00cb2eff,0x00cabd2d,0x00cc6a0d,0x00edc34a, -0x00de7c59,0x00d327f0,0x00d41029,0x00cdd3e4,0x00cc2b07,0x00c92db7,0x00c60172,0x00ba5702,0x00aea24e,0x00ab2eb0,0x00ae9563,0x00b614ca,0x00b26ed1,0x00b2185c,0x00b5bd7a,0x00b62989,0x00b74f12,0x00bdeb76,0x00b1a0d0,0x00a458d7,0x008f7859,0x00c835f7,0x00b91368,0x00b6fc73,0x00b0eb45, -0x00ade38c,0x00a72df1,0x00a5c486,0x00a53c94,0x009b8855,0x00b231b4,0x00cb9bea,0x009fb29e,0x00bb5483,0x011be926,0xfffb5a08,0x00015ba9,0x0007051e,0xffe05904,0xffd894d5,0xfff56a1f,0xffd32cf1,0xffda44a5,0x0003f128,0xfff80fa4,0xfff6f8f9,0xfff44bfc,0xffeb812b,0xffe67643,0xffe12f9a, -0xffec1539,0xffefe0b4,0xffee9aee,0xfff6d164,0x0000eeaa,0x00129e24,0x001be55f,0x0020963d,0x001e6d33,0x001dfbca,0x00179cef,0x0010b50b,0xfffc1569,0xfff50903,0xfff023fa,0x0000ec80,0x000ae17f,0x0015b8a8,0x00159782,0x00164aa4,0xffe7df38,0xfffea5d5,0xffd723cc,0xffeca0e0,0xffb13d04, -0xffacbe82,0xffe59487,0xff8db4be,0xffa1cca8,0xfffa1948,0xfff7596b,0xfff3eab5,0xffd2a729,0xffc3fe86,0xffbab38c,0xffb94cc8,0xffe24fe1,0xffed5fd7,0xffe429fc,0xffeb18d7,0x0005d0fe,0x00411a3a,0x0057e708,0x0066bf05,0x0061aba8,0x00594b26,0x0040e9ce,0x002bbace,0xfffe1a91,0xffe98700, -0xffec3be1,0x000694c2,0x00243bd7,0x003f05b5,0x004cbaa5,0x00253104,0xffa45e72,0xffd0c7c4,0xffae4f58,0xffef751d,0xff441f19,0xff2b959f,0xffb140f1,0xfed4ff7a,0xff1307de,0xffe24e67,0xffdb5efa,0xffe3f16b,0xffabef29,0xff8f9193,0xff68b017,0xff3fd195,0xff9384a1,0xffaea5ad,0xffbfeac8, -0xffd8c16a,0x0013067d,0x0097593d,0x00b5b514,0x00cc9e5f,0x00c3c586,0x00b3eb76,0x0099999c,0x006e9fbd,0xfffc34f2,0xffccd540,0xffd1dea7,0x0001dc92,0x004ff6db,0x007b2d70,0x008cde2b,0x0051b508,0xff935f07,0xffc61c31,0xfecb639e,0xff766ee7,0xff24fe7c,0xff0d8eea,0xffa59cfa,0xfe93eeac, -0xfec064fe,0xffb4c440,0xffbfc089,0xffb33d85,0xff423616,0xff57930e,0xff237eac,0xfee5b5fa,0xff8a5bcc,0xffb05532,0xffb1d180,0xffaaf65d,0x000449e1,0x00f96cc6,0x013b3d76,0x018431d6,0x01779592,0x010d1ff2,0x00cc5422,0x01204d82,0x00734211,0x00265a3a,0xffef0900,0x002098c4,0x008513ee, -0x00e10333,0x00c9f18b,0x004d36a3,0xfe851c12,0xfe974c10,0x00d4494d,0xfd18403c,0xfe2a02a6,0xfdbb17b8,0xfc9f6f20,0xfda1bbf4,0xfea247a8,0xfef6a978,0x01595498,0x018bb88e,0xffaf24e7,0xff123569,0xfe48c550,0xfe258120,0xfec1013e,0xff5e3833,0xffe9b29f,0x003f246b,0x0090be21,0x00ccbb49, -0x009cb738,0x00944bec,0x00ad229e,0x00ed01d0,0x01048344,0x00fb1139,0x0032f8df,0xffeaefd3,0x006071d8,0xff733d74,0xff80e1ec,0x00c86792,0x000c4b8b,0xffdfea21,0xffadfcfc,0x01bf4db2,0xfdda3f60,0xfdc64af8,0xffb547ce,0x00a407ef,0x0114b40a,0xffc21674,0xfeb5c150,0xfe65dc70,0xff923af2, -0xffcf152a,0xfe926c90,0xfdffea20,0xfe339b50,0xff810bd7,0x0035135d,0x007170a5,0x001a1025,0xffdb7293,0xffcfa50c,0xffb0ab22,0x0033a2d9,0x00ca9b59,0x01c1c28c,0x006519f4,0x00033c29,0x001e3ac2,0xffefc263,0xfff620ef,0xffd91240,0xff990c63,0xff8c939d,0xff5b0810,0xff589039,0xffc0c858, -0x00deca3a,0xfeaab322,0x01d14448,0xfe03fb3e,0xfb06d1a8,0xf9c93bc8,0xf8658fa8,0xfb47a740,0xfdab9550,0xfddec7a4,0xffde1ae7,0xff9e5e8e,0xfd80aa94,0xfe085570,0xfee417a0,0x01129ca8,0x007af761,0x0066ff14,0x002891c0,0x00699d92,0x007f6fca,0x004f97b0,0x009fd8e1,0x00ed4ae3,0x01ea5bfa, -0x000c1055,0xff836bcd,0x0055ebb9,0xffc4ee17,0x00483ae2,0x000c992f,0x00142553,0x001b47cc,0x00383cc7,0xffc15e42,0xffb92039,0x013bcae2,0x01c24d1c,0x0332fb08,0x04760df8,0x072da9a0,0x072fca58,0x047bdc18,0x0221f158,0xffb87bda,0xfd3b40a0,0xfee68dac,0xfefd6ca2,0xfdc74674,0xfe0c253a, -0xfe8bc436,0x005d4acc,0xfff9d974,0xfff2091f,0xff2bc40e,0xff2af1ee,0xff220bf7,0xff44e43e,0xff76f6b4,0x0009544d,0x01370266,0x005027c4,0x00506dd0,0x00af6e5f,0xffde6b0b,0xffed0100,0xffff7782,0x0048778f,0x0087ca3c,0x0104c7aa,0x01939fea,0x025533a8,0x032f83d8,0x02bcba00,0x0096a22a, -0x003d9abc,0xffe0c819,0x00696ca3,0x01e16680,0x03770ae4,0x044c7cd0,0x03e1b4b8,0x02b4ee98,0x00aa81a4,0xfe738cf2,0xfd0c7fdc,0xfc9abb64,0xfde24090,0xfe4d00fc,0xff060cec,0xfec3253a,0xff8f315d,0xffe1beca,0xffd0dfa0,0x001d3a56,0x009b5d11,0x013f8dee,0x0092df02,0x004dbdd8,0x00320b25, -0x012e6b94,0x0179d142,0x010f83ae,0x01512040,0x01881baa,0x01fac318,0x0166b3c0,0x01245ec4,0x01697844,0x00dac6e2,0x01999982,0x0183405a,0x01aae18e,0x015b4b12,0x008f46ea,0x0049e64b,0x00d7bfa7,0x020ddd28,0x026044d8,0x02e40870,0x0333b098,0x02586aa4,0x01aa2c00,0x0120aec6,0x012d553e, -0x010eecea,0x010317b6,0x010f9018,0x01068076,0x00ec055e,0x00cf0f26,0x00a31a8a,0x00b1a77e,0x00d92658,0x01216ac0,0x013591fc,0x00ec9b05,0x0084679f,0xfff65b4a,0x00248c08,0x0047532a,0x00b3d61f,0x00d49d0a,0x012d9272,0x0195792c,0x01bbde5c,0x004bbb4e,0x0002994c,0xffe4700c,0xffbdd95d, -0xffc340e2,0x0015aea5,0x003a3acb,0x0051f50e,0x004cda1d,0x0047625d,0x0053bbec,0x003d8375,0x0046467f,0x0036bece,0x00591efa,0x00611d59,0x00740e63,0x008498c8,0x00b73c25,0x00b552d7,0x0095cf52,0x00f33c63,0x0120504a,0x00d1fa74,0x0086429f,0x0048dded,0x00800825,0x00b33ef3,0x00f886d7, -0x010a234a,0x011bb0dc,0x01228f9c,0x0111584a,0x00f9f57e,0x00f0bf22,0x00a3f56b,0x00cc7c35,0x00d89735,0x00e9e875,0x00fac4a9,0x00f78935,0x00ed75be,0x00e9ca86,0x00f10ad9,0x00e6e61f,0x00dd5cc5,0x00d02cd7,0x00c97d68,0x00b8ff1e,0x00a832cc,0x009ab950,0x00940c68,0x008eb6d7,0x00895d2f, -0x0087d827,0x0082a103,0x006a62fa,0x006cefe1,0x00708cc2,0x0087af41,0x00a32809,0x00af3e8f,0x00a78bd7,0x0097bebc,0x00949c86,0x008375f4,0x00883d1b,0x0083c22f,0x0097c6cd,0x00a26d9a,0x00ad9d44,0x00b500cc,0x00f47c9d,0x00cf3529,0x00d1f8c2,0x00d2977c,0x00d86688,0x00dde95e,0x00e2bded, -0x00e88b6e,0x00d9fdb7,0x00d047ff,0x00c6a142,0x00bcee04,0x00b7516b,0x00b3c823,0x00b8e0a8,0x00ba5f80,0x00bbbedf,0x00bc9722,0x00ba9afb,0x00be7603,0x00d54ecf,0x00e0ca48,0x00e76b99,0x00d9bcd2,0x00eb433c,0x010706d6,0x01019e58,0x00fff291,0x00fa3ca0,0x00faaf4c,0x00f502de,0x00ee29b3, -0x00f107f5,0x00dfb52f,0x00f59279,0x00f8c5ce,0x01024596,0xfff368b9,0xfff04a1f,0xffeeaadf,0xffd0ce81,0xffcd0f1c,0xffe038b9,0xffdd352f,0xffe36067,0xffeb2c24,0xfff3e1db,0xfff78b60,0xfff2368f,0xfff8faf3,0xfff47d82,0xffe4551d,0xffeced49,0xffebcf50,0xffe5c51b,0xffebe15a,0xfff46499, -0xfffda568,0x0002edce,0x000bd49b,0x001c3b8d,0x00114a3f,0x000afcb8,0x00013eab,0xfff1a29f,0xffecd2de,0xffe8c129,0xfff9c3a6,0x000453b5,0x000a53d9,0x000f13b6,0x000cad7b,0xffe5f3be,0xfff46a87,0xffe6a31f,0xffef8786,0xffad88ce,0xffa0c648,0xffcffcb4,0xffbfbed1,0xffbff3d9,0xffc9d3b4, -0xffd9a3c6,0xffd828b8,0xffc816e8,0xffe57706,0xffe3f252,0xffbe09f8,0xffd71404,0xffd9f9c6,0xffd44fa5,0xffe42740,0xfff706e7,0x001fa56d,0x003f2dd6,0x0043f188,0x0050bc9a,0x005202b8,0x003a8edb,0x00137a6d,0xffee8e0c,0xffda24c5,0xffdcbc1e,0x00028deb,0x00245826,0x0032b75c,0x00582dc3, -0x003e4ec3,0xffc3500b,0x00018422,0xffe3cc64,0xfff6fe55,0xff4f7860,0xff207cd1,0xff6e0867,0xff81d174,0xff9c4355,0xff9db465,0xffefd7a5,0xfff75584,0xffc7bd51,0x000665f1,0xffe53383,0xff9c0458,0xffbe3269,0xffc02bee,0xffab6478,0xffcf7327,0xfff09750,0x005a45b4,0x00804ddb,0x009e6bef, -0x00b0ba0f,0x00bec091,0x009dc21b,0x004d163b,0xffe19ec3,0xffb1a8c0,0xffbd9a45,0x000f02af,0x00610f17,0x006cfd08,0x00abfbb7,0x008265f4,0xffa6271e,0x000c306a,0x00128cc4,0x009fe7be,0xffa8397c,0xff347dbf,0xff9f7e45,0xffa5c6ec,0xff7cc2cc,0xff63c612,0xffa32996,0xff8ea54d,0xff38566f, -0xffb35777,0xffbc2fe9,0xff5d913e,0xffa56985,0xffa288ab,0xff9d77a5,0xffd51c9c,0x00193839,0x00c58b63,0x011bc2d2,0x013fa2b2,0x014e6de0,0x010b4496,0x00e83621,0x010060f8,0x0055c4bd,0xfff5018b,0xffdb5eb5,0x001cd794,0x009c2ec2,0x00ed3c20,0x01062ac8,0x00b67a2d,0xff479eb5,0x00115318, -0xfff8ea98,0xfd7e7100,0xfd68ff28,0xfd2bb874,0xfd3f8f48,0xfd68596c,0xfe36cb2c,0xff92ea6f,0x006161c2,0x00f147d7,0x00b4077e,0x00322585,0xffb29009,0xfe65e2b4,0xff02ea1f,0xff682e9a,0xffc90f6e,0xff9eee80,0xffbef6ab,0x0049de37,0x00cbc11a,0x00c52a4d,0x00b196d4,0x0144eb78,0x0138a7f2, -0x00b30752,0x0023a8fc,0xffd3a001,0x00078436,0xff77d74c,0xffb8c98f,0x00be507f,0x009475b5,0x0075da29,0xfff6a6a4,0x00f8ee4f,0xfe3e34e0,0xfde2a3f4,0x0047feeb,0x00c8ed42,0x008e46dc,0x000fbb41,0xffcc1d1a,0xff29d05c,0x007e0256,0x0041acdc,0xfea82032,0xfe84e538,0xfe6765ca,0xfe6e8504, -0x002be787,0x00d30252,0x0066b1cb,0x00661a86,0x006e6b40,0x00480410,0x005fae65,0x00bf8f1e,0x018ff7b2,0x0023a8af,0xffbde45a,0xfff3d31f,0xfff0edd1,0x00042a96,0xff93c841,0xff891d65,0xff5951b4,0xfecc1514,0xfecda094,0xff9eecc2,0x010c6cca,0xff2233a0,0xfeccdd26,0xfbb735c0,0xf9675348, -0xf91b5cd8,0xfb502290,0xfcbdf318,0xfe76c91c,0xfea38e56,0xffd87409,0xff752c6d,0xfe7d2afc,0xfef0c5d6,0xff3db73b,0xffde6d49,0x00312ed0,0x006cbb99,0x001d0f58,0x0064511d,0x005e518b,0x0048ba04,0x00efc2bf,0x00fd5a48,0x01411dc4,0x000e70dc,0xffaca389,0x0000618f,0xff9dd286,0xffefe5c0, -0xffbc0e56,0x000b7975,0x001b2587,0x004a39c0,0xff9143b7,0xff0dc320,0xff4184d2,0xff848e4a,0x04d2cd38,0x062546c0,0x068fed38,0x052950d0,0x02985b08,0xfed5398c,0xfd517bb0,0xfd996fec,0xffa349fe,0xff81fda6,0xfd9d8a70,0xfc8d31d4,0xfce2d1c4,0xff0aff36,0x0036753d,0x00d158f3,0xffe5c82e, -0x002968cf,0x00135114,0xffbabf30,0x00594df7,0x00c211d6,0x00ede584,0x006eeb2e,0x00517002,0x00699caa,0x0000b89b,0x0006f423,0xfffd9b65,0x005b12ad,0x009670aa,0x00924dd5,0x01a152b0,0x02b28574,0x03886930,0x040831c0,0x00caf262,0x008c46da,0x007e0f17,0x017b787a,0x0365e7f4,0x03f97b3c, -0x03e4e7b4,0x02b34880,0x00f31f84,0xff53d64b,0xfe78ad98,0xfca4512c,0xfc2203f8,0xfd01e3dc,0xfd4339e0,0xfe0fc0f0,0xfef62688,0xff61da0c,0xff980b4d,0xffd373d2,0x003d279d,0x0076d071,0x01139298,0x004dee7a,0x0025925e,0x00515b1c,0x00e35c7f,0x011ab290,0x00d4c7dc,0x011daa20,0x0154144c, -0x018e1400,0x0155fd5c,0x01485f54,0x019816a0,0x01376fd0,0x0199c94c,0x01517600,0x0137e650,0x00ecfe60,0x006be93d,0x008f2ed5,0x00fc9055,0x01d0807c,0x02bab11c,0x02f58884,0x02b42778,0x025ec0c8,0x01a8f4a8,0x0054441d,0x00871cd0,0x00205bb3,0xff68dd0e,0xffbe58c0,0xfffb436b,0x00512005, -0x008a85a9,0x0075866d,0x00eb79bc,0x00e31198,0x00fc0762,0x00d57b1c,0x00a612f2,0x005a81b7,0x0039a44e,0x004553ec,0x006750b0,0x00d0058f,0x00c559dc,0x00fce739,0x01593f72,0x0186d7b8,0x00a7a993,0x009cb779,0x007bba40,0x004818b3,0x001d907a,0x0038c5c7,0x002c9aee,0x000430e6,0x00427a47, -0x009b39a0,0x010a01c2,0x00e626c6,0x00e3273e,0x00d81805,0x01185a0c,0x014c7d4a,0x018c315a,0x016f3e7e,0x012fcda6,0x00f7a7c5,0x0113a706,0x012a2f60,0x01324ff2,0x00f48048,0x00af91ac,0x0095a70d,0x00acfd96,0x00e9973e,0x00ec778b,0x011cffe8,0x012949f0,0x013cb4fe,0x01348458,0x01335f40, -0x01349ef0,0x00eca186,0x00ae2caf,0x009557f6,0x00a2fd45,0x00aed2b3,0x00b693f3,0x00b74081,0x00c6139f,0x00d9ae24,0x00d219ca,0x00b251af,0x009ace12,0x007c00e9,0x0067158f,0x00479a39,0x00565f10,0x0062bf67,0x007df5cb,0x008b9136,0x00c10e45,0x00e236d5,0x008cf89d,0x008ae9e6,0x0077a476, -0x00862d3d,0x007d9bb3,0x006e9b98,0x006b22cc,0x00641ed5,0x005dd1a0,0x006391b4,0x005f9da6,0x0074e8e0,0x0078e08e,0x0087002e,0x00897251,0x00890d7d,0x008ee3d6,0x00636512,0x0070e1ad,0x00757bf6,0x007ce9a2,0x008297ab,0x0084a805,0x0088d4a6,0x007a1e8e,0x00744942,0x006c21a1,0x006d576b, -0x006adbd5,0x00602304,0x00762d6a,0x00824f7c,0x008c1579,0x009eaf22,0x00a6286c,0x00c0be37,0x00a883e6,0x00b3345e,0x00c64492,0x008c6dcd,0x0096960a,0x00b82a08,0x00bcaf55,0x00bfb964,0x00c7e5b1,0x00c8401a,0x00ccaec8,0x00cddd07,0x00a5204e,0x0080e1a3,0x00cbc0af,0x00a22952,0x0080683a, -0x0010d5c9,0x0004cd81,0x001ae3f2,0x00030b8a,0x0000b697,0x00030578,0xfffa866a,0xfffc5b5e,0x000682b2,0x000063fd,0x000661ae,0x0012deb9,0x001e4f2e,0x001affcb,0x00009d7e,0x0009facd,0x000863c1,0x0000a403,0x0008c164,0x000c4a16,0x000cecf8,0x000b48c0,0x000e5825,0x000f793c,0x002647d4, -0x0015ba0c,0xfff70ec4,0xffe987e1,0xffe58e6e,0xffe44b55,0xfff9ddb6,0x00047144,0x0002ac29,0x001a366c,0x001e0f19,0xffdec20c,0xfffe2ab8,0x001570fa,0x0036fef2,0xfffc3cd9,0xffe4b071,0x00021532,0xffe53fc4,0xffdff5a5,0xfff810aa,0xffde4d08,0xffef4069,0x000ffad1,0x0037b3c8,0x00370256, -0xffebb080,0xffff4190,0xfff3f07e,0xffe18722,0xfff7b515,0x00029cef,0x000a3c61,0x002439d7,0x003e72cb,0x00585b19,0x006891fd,0x0050492c,0x0015252d,0xfff9345e,0xffe7283e,0xffe1adb4,0x0020de9d,0x0042b704,0x003647b1,0x006680dc,0x0051f367,0xffe2bea0,0x002e47a5,0x0031a1cf,0x00386cad, -0xffeb3f83,0xffe240f1,0x0007c60a,0xff9b0265,0xff9b3298,0xffda2788,0xffa80f11,0xffdafb2c,0x002a6d31,0x0079110e,0x006df3f0,0xffc9f2f3,0xfffbe084,0xfff0707b,0xffc28254,0xfff025b9,0xfffea223,0x001b39ef,0x004ed35a,0x006fef13,0x00a1f91b,0x00cfc159,0x00ae3b3f,0x002560f3,0xffda0d83, -0xffb446d5,0xffae2148,0x002f4979,0x00744f00,0x00586d2c,0x00b253d8,0x00918f34,0xffa62cab,0x003fa039,0x00fa8fad,0x00c694b3,0x000f02e5,0x0000b527,0x00666e4b,0xffa9e830,0xff8db4fe,0xffc5891e,0xff6aaf16,0xffa21a90,0x000a0e15,0x009c4e3d,0x00ae7fd8,0xffb74ae0,0xffe93a7c,0xffca7d06, -0xff8573af,0xffd76806,0xfffc30c7,0x0039c722,0x00bae8d7,0x00e9a8f5,0x0114abb2,0x014b5742,0x0127d5a2,0x00c06128,0x0029032c,0xffbf2215,0xffb68dc0,0x0035444c,0x00d3faff,0x00e1145c,0x01353018,0x00f94aef,0xffa92fa9,0x00ad2247,0xfe5a8626,0xfda4e5b0,0xfe65d97a,0xfe596774,0xfeb04018, -0xfe77c632,0xfeb160f8,0xffa33985,0xffb2fc41,0x0064c36e,0x017fa3a4,0x00d7f77d,0x005a7d2e,0xffc2e027,0x0028643e,0x003dec03,0x000f00ae,0xffe43c9e,0x00040f47,0x00445e34,0x008a39d0,0x00abed60,0x006faa0d,0x0142a46e,0x0139aa96,0x0090c2b5,0x0010f4c5,0xffb63855,0xffd500f5,0xff66abc1, -0xff90458c,0x00241061,0x00a6a9e0,0x00b1963e,0x000c0df2,0xff6d3865,0xff41fc78,0xff566321,0x0027b940,0xffea44da,0x001e8abf,0x0037f853,0x003f00bc,0xffb8e6dc,0x007b15d4,0x006f94a5,0x00821c0d,0xff0bd0f0,0xfeae683e,0xfe74e8c6,0xfec0bac2,0xff271bd1,0xff744a39,0xffd02492,0x000976ee, -0x0051dd31,0x00bf33e9,0x00e4f96f,0x0134b5e2,0x000c2ce8,0xffbd10e4,0x00074eed,0x0019ab59,0x001e8e48,0xff7d4198,0xff8ddae8,0xff6f9ba8,0xff303abe,0xff4cd461,0xff87e4c0,0x0000e799,0xffb9255a,0xfd398068,0xfb401240,0xfa14e458,0xfabc5780,0xfe1e27a4,0xfdee14e4,0xfe1ceaa6,0xfe8750b6, -0xff53577c,0xffaa2cca,0xfff147ab,0xfeada470,0xfe471730,0xfe7088aa,0xff6bd2ef,0x000a5af9,0xfff31561,0xffcb4e45,0xffd71602,0x001aa0ae,0x00aca33b,0x009589fb,0x00387223,0xffd1dea3,0xffd37bb7,0xffd98406,0xffaa0670,0xffdbbbe6,0xffc66ab7,0x00143737,0xffed00f5,0xffe18efa,0xff693739, -0xff10ecd2,0xfec5b9b4,0xfe5456f4,0x0593ad18,0x05b3d4f8,0x044070f8,0x022247f8,0x00ba51eb,0xfcc0f590,0xfc2f4174,0xfe98abec,0xfe7d43a6,0xfe9b9320,0xfecb0650,0xfe12e5b0,0xfdf40c00,0xfe452286,0xfeef0a34,0xff828d63,0xfff82942,0x0068a71c,0x00765b7e,0xffe1ee59,0x00d7d145,0x00edd868, -0x0071ad69,0x003fa05d,0x000bbcdb,0xfff35d45,0x0014bb32,0x0022c0fc,0xffe8e602,0x002dcc0c,0x00718798,0x0048e6a9,0x01863594,0x028ac15c,0x03baf644,0x04838648,0x017a7f3c,0x01bd3b0c,0x02b54720,0x03881130,0x04b8bff8,0x03c96aa8,0x0260ab8c,0x007c31ac,0xfeae6f9e,0xfd9037ec,0xfcda2f00, -0xfd9bb2e0,0xfdeb56b0,0xfd7ffcec,0xfe3ec082,0xfe56d92c,0xfea0a3fa,0xfe5ebb1a,0xfe76b196,0xff25021c,0x001c4e27,0x003f8a72,0x007759a4,0x00074c12,0x001d7ffe,0x00b3315b,0x008c6ecb,0x009981db,0x00a5acb6,0x01014160,0x013d930a,0x01558b70,0x015fc08c,0x0179c1fa,0x01aa50da,0x01b2c2a4, -0x01342f2e,0x0104499e,0x00b78336,0x00876bc1,0x0097a204,0x00fc102a,0x01a4e618,0x024dc950,0x02c910dc,0x02b4f220,0x020c9eb0,0x01907bf4,0x00d637a3,0xffe1be60,0xff766809,0xff3b2808,0xfef4269a,0xff45a834,0xff934d2c,0xffebf45b,0x003f51f5,0x00980ff6,0x013a2776,0x011fcdb6,0x00f20f80, -0x0091f090,0x00691426,0x006ea7c6,0x00b36fc6,0x00b3d0db,0x00b6b6f1,0x00aeb33f,0x00bee685,0x00da0943,0x00ec3781,0x012e16d4,0x011b4db2,0x012b58ac,0x00f87e15,0x00c3fff6,0x0084d254,0x0097ae1a,0x00801a19,0x005a086c,0x00a02651,0x010342de,0x018688b2,0x018bd5bc,0x019834b4,0x019a51da, -0x018c1a7e,0x017eaf12,0x0165b6be,0x014d8c94,0x01262320,0x00f2d0f3,0x00f60a96,0x00fda405,0x00fd2e73,0x00f61360,0x00eea507,0x00fa9329,0x010cdcb6,0x0135e7de,0x01304c66,0x012bbee2,0x0124da3e,0x012041ac,0x012ca7b6,0x01426d34,0x01580092,0x0134e6a6,0x005d04a5,0x004dc50a,0x005d4875, -0x006dfece,0x007bb19c,0x008a6834,0x00a5709c,0x00c0bfae,0x00dbdb82,0x00d9aa0b,0x00d70359,0x00cc7091,0x00ce4af6,0x00cc082f,0x00ebf8cb,0x0109cab4,0x01315ca8,0x014e4df2,0x017bfda6,0x01a1dd32,0x0124b3a0,0x012447ac,0x00ff56d1,0x00e543c9,0x00af1323,0x008c286f,0x007cdc65,0x006ddd22, -0x005ecdf3,0x005cfdb6,0x004de701,0x004ab771,0x004c3aa0,0x004fa0b9,0x00509ea1,0x004f4753,0x0055603b,0x00424712,0x004e9006,0x0053db8c,0x005b7464,0x005cbed7,0x005b05f6,0x00579267,0x0054826d,0x0058232e,0x005d1d92,0x006a7f7c,0x0072ebb5,0x0074310e,0x00860127,0x0092f95f,0x009e3a83, -0x00ad561a,0x00b426a2,0x00d84b41,0x00b466d0,0x00a71ec5,0x008bd6b6,0x00863267,0x007c001e,0x006761dd,0x006cddeb,0x006f6828,0x0073a5dd,0x007334b4,0x0076d178,0x00767788,0x0061de00,0x00508acc,0x00711815,0x005d7cf4,0x004a75f5,0x002ea4f1,0x002bc49d,0x002bcb96,0x002a0c69,0x0026d64f, -0x00268566,0x00138bd2,0x0011c995,0x0024096f,0x000f1b2a,0x0014d9d3,0x00233d9a,0x003dbeaa,0x003ecedf,0x0022b550,0x0024afa3,0x001f1d59,0x001682ef,0x002265b5,0x002515cd,0x0021a0ee,0x002769f3,0x002b9411,0x002c06a6,0x0040429c,0x002e8a1a,0x000a6334,0x0005ca31,0x00026340,0xfffe6797, -0x00198109,0x002372ce,0x00197ab6,0x003537c1,0x0038e42c,0xfffca571,0x002336b0,0x0051dd16,0x003eaa4c,0x0033858e,0x003532eb,0x004b4a6b,0x0036c8fe,0x0031f9e5,0x00518b1c,0x0002b5c0,0x000240e9,0x001c7f5b,0x00603a98,0x00676552,0x001730d8,0x00215afa,0x0011f8b1,0xfffbe4b5,0x000eb58c, -0x00137739,0x000acb4b,0x00232b1e,0x004a157e,0x00713221,0x00782c37,0x0060da41,0x001a33ef,0x000eaff0,0x0003b64f,0xfff99231,0x00408f9c,0x0059fe2e,0x003f2b28,0x006b93c7,0x00523cf3,0xffefe687,0x00463f75,0x00469b36,0x00132bbe,0x001e7551,0x00276abe,0x00185dfa,0xffdd70c8,0xffd7c235, -0x0018a5f3,0xff857413,0xffb1c71e,0xfff0fe56,0x009f2c09,0x00a672e0,0xffe7c918,0x0005dd51,0xffe6511c,0xffc1f555,0xfff6e257,0x000a280a,0xfffdf3d2,0x003f00ee,0x006fa016,0x00bee6df,0x00cda97f,0x00a45a3a,0x0001a0d3,0xffe7b0c8,0xffd0c2cc,0xffaf6c0e,0x0048fd14,0x0082d38e,0x00407c2f, -0x00ab1e1b,0x0098779d,0xffa31f52,0x003ad4a5,0x00b2b29d,0x002ebdf5,0x000eff30,0x00381f2e,0x008f742b,0x00967e18,0x00966de2,0x00b68d34,0xffb1c1dc,0xff8c10a1,0xffb03dfd,0x00b8eb11,0x00e6d670,0xffadde82,0xfffabda3,0xffd95f33,0xff8b689b,0xffc0a768,0xffcc5944,0xffc763bf,0x003fcc74, -0x00b13a7d,0x0105b2e6,0x015cb52e,0x012bb0aa,0x006bd2a4,0x000b8687,0xffab192e,0xff967639,0x00588015,0x00f30212,0x00a43304,0x01202d68,0x00a9d75d,0xff40a7c9,0x0051fdd7,0xfd998364,0xfe1fe02a,0xffa2b28e,0xffc04c05,0xfec2c966,0xfddee1e4,0xfda91e9c,0xfe6b4a98,0xfe64f2ca,0xffa8881f, -0x01bca79e,0x00f0ee73,0x007662ec,0xfff483fc,0xff771299,0xff70e10d,0xffc06fc1,0xfff5a395,0x005abfce,0x00db7562,0x009fc186,0x00c035d0,0x00bc3165,0x012bad2a,0x010af6c0,0x0070eff7,0x000eebc1,0xffba4971,0xffbc8b60,0xff4b6247,0xff7fc189,0x000625e2,0x007a25d5,0x00adee85,0x009aeac9, -0xfec8e39e,0x00993f7f,0x0014759b,0xff03d9c3,0xfede2e30,0x002f79f8,0x00ffcf96,0x013e15d6,0x00ca14f8,0x00b0508c,0x0047987b,0x0061a54b,0xff35a089,0xfef76b5a,0xff4696f8,0xff24ba7e,0xff32f585,0xff25162b,0xff5b650e,0xffa8b87a,0x0016a99b,0x00a7b52f,0x00bdfd62,0x006d932e,0xffef7959, -0xffd27e43,0xfff3a99d,0x002a9c40,0x001b6487,0xff795fbf,0xff8a4341,0xff7ded40,0xff9ba647,0xff209315,0xfed7bc82,0xff36670c,0x0041dd75,0xfc58d94c,0xfb617af8,0xfd3b5160,0xfe9a1bca,0xff961c14,0xfee8d47a,0xfdf736e4,0xfdbc5ec0,0xfe60fc22,0xff3cc861,0x0036885c,0xff264fc3,0xfe90af74, -0xfe4c8ee0,0xfe71a9b0,0xfecd675e,0xff3d1806,0xff55c8b1,0xffac03e7,0x000bf7e5,0x00c68525,0x007eee42,0xff6b00bd,0xffc426a7,0x001041e7,0xffe7e8c9,0xfff6a283,0x000abd73,0xffe202f6,0x00317a93,0xffec274e,0xffabffd7,0xffc1e46c,0xff5ac7f1,0xfea4b018,0xfd851054,0x04bfc7e0,0x033a2674, -0x0190234e,0xff707b30,0xfd826984,0xfcdc57e4,0xfd6a78e4,0xfebbdca8,0xfe48e586,0xfe0af0c4,0xfe60b45a,0xfeec5cf2,0xfefaef20,0xfe47f4b2,0xfedfa150,0xff277fb2,0xffbca2b1,0xffc9e28e,0xffefcb0c,0xff9b0b60,0x00e107d2,0x00d47123,0xffb022eb,0xfff71c9b,0xffe61ea7,0xffbf54cb,0xfff88441, -0x001406d7,0xffdbec43,0x000a8ff7,0x004befcf,0x00172982,0x01018c3c,0x01db2b34,0x03564ea8,0x0407f7c8,0x027e3548,0x03321554,0x046f6280,0x04aa0690,0x04707d98,0x02e3ea90,0x00a33023,0xfdeeef4c,0xfd7cf2cc,0xfd8826dc,0xfd9327cc,0xff28456b,0xff43ca9c,0xfe0050d0,0xfe97b78e,0xfe64f5b2, -0xfdf6f424,0xfe1c5e14,0xfe850186,0xfee3a0f0,0xffc20422,0x00122af8,0x0014c6bd,0x00266d69,0x0051ae8c,0x00dc1151,0x00563190,0x002fac27,0x00517680,0x00d78914,0x0135a78c,0x016a8608,0x018c4f50,0x01b5510c,0x01c39bfe,0x02428150,0x00f20164,0x00fb04e4,0x00fbb87a,0x01275b94,0x01757dce, -0x02284250,0x02b02578,0x02b5b5ac,0x025b3264,0x019f2d60,0x009899a8,0xfffffe62,0xff6b7e8c,0xfedd6a28,0xfe5a3ffa,0xfe8db2c4,0xff6c2d86,0xff7f310c,0xff9f282e,0xffd1f31e,0x005327a0,0x00b19575,0x00eb96d6,0x00e2fef7,0x00c0cd58,0x00a16ab2,0x00ab0f9e,0x00d181da,0x00f09f26,0x011cf356, -0x010c2ab0,0x00d2b7b8,0x00d87045,0x00d9ea9e,0x00c4b7d7,0x00fcb01f,0x01361f78,0x01354ad2,0x011fefe2,0x01110422,0x00e0923d,0x00f7a23c,0x01030c5a,0x012c4808,0x015b3218,0x01b18cd4,0x021f1714,0x0220b9a4,0x021f6f34,0x0227ab2c,0x01f98364,0x01bdbae0,0x017fc466,0x015d9aae,0x0162b474, -0x014dd8f6,0x010ad8fc,0x00fa9939,0x00e77556,0x00e78bfb,0x00fb5cb9,0x00e901c7,0x010df1d2,0x0101f122,0x011dbb22,0x00e6f308,0x00defa86,0x00bb4334,0x00ee9f51,0x0120c990,0x0151e1e4,0x013a7142,0x005a23ba,0x00864d3d,0x00842b2b,0x007ea951,0x0082588d,0x0089af32,0x00927513,0x0092a35f, -0x00b4ce28,0x00c19ff2,0x00cffea0,0x00e1c738,0x00fcf8b1,0x01176a60,0x012bd8d4,0x014545ac,0x01536a20,0x01725272,0x017701b2,0x01924c9a,0x019b734c,0x016a6fcc,0x0144a384,0x01174966,0x00f0023f,0x00c5e21e,0x00b266e2,0x009e08fd,0x00969665,0x008a52b8,0x008ad06c,0x0071faa4,0x0079e9a2, -0x0068e5e8,0x006b5be7,0x007b9bb4,0x004dd174,0x00745160,0x006e23e5,0x0073ac10,0x0075ccd7,0x007126d3,0x006cab43,0x0063b4ae,0x006f0795,0x007ac28d,0x0087619a,0x0098be57,0x00a71ded,0x00b7ea72,0x00b0e697,0x00ae5660,0x00ae5edb,0x00a7d7c7,0x00a40484,0x00a11554,0x009e4037,0x008eca1c, -0x0085ab0c,0x0081e542,0x007240b1,0x00597978,0x0058c9b7,0x0055bc2c,0x004c517e,0x0048eb8e,0x00410193,0x003ebe3c,0x004bc05f,0x005fb4e5,0x00347445,0x0041a70e,0x006a7334,0x002cf81c,0x00286f8c,0x0011a660,0x002129d7,0x002699d4,0x00357039,0x00272b13,0x0020901b,0x0029c45a,0x0010e3cd, -0x000d71eb,0x00039ac3,0x002fe3fd,0x0039bc2a,0x0032187f,0x0026fc19,0x0020ee8c,0x001befa8,0x0023081c,0x00250d14,0x002335fa,0x002edb38,0x00390f3e,0x004b6b0a,0x003c7f56,0x003285aa,0x001e730f,0x002019e2,0x001e780a,0x001a1638,0x00317788,0x0038a3b1,0x002ae0d6,0x003a8d33,0x00378b00, -0x000fe30d,0x002b9aa8,0x005c17b9,0x001eed55,0x002f927c,0x0038f1a9,0x004e0644,0x003a9d3e,0x00315314,0x004df498,0xfffbaf7b,0xffe9aeda,0xffdac603,0x0040e02a,0x005ffde7,0x00460394,0x00201e05,0x000a0461,0x0008060a,0x001392bb,0x001c9892,0x001962ee,0x0030a8e4,0x0053f9ad,0x007fcb9d, -0x006a6853,0x0052b46d,0x00196403,0x000fb527,0x000ac3f1,0x000c2abb,0x004261f2,0x00531003,0x0038d503,0x005cd208,0x004ba5ec,0xfffa3d2c,0x004bf661,0x0027d718,0xffd432fb,0x000b11b0,0x002000ea,0x005cc1f5,0x003f72df,0x00188082,0x003b3769,0xff9cbb69,0xff914497,0xff697aee,0x004ed412, -0x008a00e8,0x00563b07,0x0016b407,0xffebf8d6,0xffdf659e,0x0001be5e,0x0016fc49,0x000764d4,0x00422906,0x00830601,0x00dc449b,0x00b2d5c5,0x007a44f4,0xfffeaa73,0xffeae39a,0xffe29a6e,0xffcf21a7,0x005220c0,0x00761884,0x002ab713,0x00964c51,0x008c5331,0xff9dc670,0x0037db25,0x00e3ce2c, -0x0039014f,0x0051f74c,0x0052650f,0x008699e7,0x00ab2758,0x007a6195,0x00c2cf6d,0xffb8f687,0xff5b7087,0xff0d4cda,0x003a2f15,0x00b84fe5,0x007412c0,0x0004a40d,0xffbddd2d,0xffaa360e,0xffd38915,0xffed1d64,0xffe59a26,0x003c533e,0x00b3c10a,0x011e5d10,0x012b8026,0x00fc668e,0x00427cc6, -0xfff7d240,0xffa4cbcf,0xff94b635,0x006f1527,0x00ecdf17,0x0088997d,0x00ffa446,0x0079ea6a,0xff513eb6,0x00ada9b1,0xfd4a7224,0xfeb76bec,0xffa0679f,0x000204f6,0xff4d5c2a,0xfeba639a,0xfe705d48,0xfed3d4dc,0xfdeb9194,0xfea6a900,0x00bcedf2,0x0077199c,0x007b2676,0x0036e6ba,0xff56159a, -0xff3c2d75,0xffe7381c,0x00128637,0x005434dc,0x00c807d0,0x00a7813f,0x00d66037,0x014b07a6,0x0108ecd8,0x00bc4b4d,0x003b319a,0x002346fd,0xffdb6075,0xffa35cb3,0xff59971e,0xff8e1871,0x00140bba,0x0066d1ff,0x00bfc460,0x013bd546,0xfe5f5b44,0x00d1ca61,0xffb0a89a,0xff17ae9e,0xff338f5b, -0xffe7fbe4,0x007398f4,0x00870a22,0xffefd9de,0x002310cd,0x00533e55,0x00c6e7ff,0x00287307,0xffc64da7,0xff151d17,0xff71a209,0xff8903b5,0xff344bcf,0xff671fdd,0xffbbd53e,0x0012be7a,0x00aea044,0x0090fe7e,0xffc96d4c,0xffd0fb60,0xffdcb19c,0xffd55ea5,0x000ab9a4,0x000307e4,0xff837753, -0xffa408a4,0xff72b2cd,0xff3fdb9e,0xfe7f8b18,0xfe4554a0,0xfea4a930,0x0057d669,0xfd014140,0xfd8695f4,0x0066e437,0x00f55e20,0xffbdabba,0xff429c5d,0xfe5d869a,0xfd90b730,0xfe3ad5ce,0xfe71d83a,0xfe71710e,0xff282412,0xff6a9f28,0xfec2b9be,0xfeb1d2ae,0xfea15534,0xfed89756,0xff2d3d51, -0xff94ff2b,0xffcfdf4b,0x00c6ca25,0x009b57fe,0xff2efa54,0xffea15b2,0x0055f273,0xfffd23d2,0x0018dd0e,0x0010652a,0xffebc0ae,0x00257cb2,0xffdef2e1,0xffd78845,0x00125300,0xff76d4d1,0xfe5da556,0xfdabc6e8,0x03152074,0x00b0c3be,0xfe60172c,0xfce70a8c,0xfb5c3cb8,0xfdf2bd9c,0xfecbc528, -0xfdce65b8,0xff09b62a,0xff3a2653,0xff1045fb,0xff1c25e5,0xfee984e0,0xfe65183a,0xff0624c6,0xff40f21b,0xff87c91d,0xff3b9957,0xff805d92,0xffadf46e,0x00c682f8,0x00c42d21,0xff69e271,0xffc01a56,0xffb10bf8,0xff8a118b,0xffd7eae8,0xffeeb68a,0xffbdf4a3,0xffe9d6f9,0x0010c177,0xffbfe3f1, -0x004b3672,0x00ff0530,0x0275c288,0x0305f4a4,0x035ea124,0x04631270,0x04c7d610,0x04426db0,0x02b4c388,0x00e07bdb,0xfeac5d20,0xfc965434,0xfd753a14,0xfe363e2c,0xff25d9ff,0xffb82915,0xffea3fc8,0xffa86175,0xfef19dc2,0xfe8b1d58,0xfe7e10e4,0xfeaafcdc,0xff1644bb,0xff25d8f3,0xff8d6476, -0xffc47907,0xffcc23b1,0x0038f6ba,0x0066e8c1,0x00b675f8,0x003dc428,0xfffdf254,0x000ea2b4,0x00a12d0b,0x011135ee,0x017b1e42,0x01dd0fee,0x02110d88,0x0210ed0c,0x02ce8268,0x011ef75e,0x0143feb6,0x01cab848,0x02542e24,0x03060780,0x03b358b4,0x03b1470c,0x02d65ce8,0x0198059e,0x002ebc46, -0xff068757,0xfe07bf16,0xfda4ed7c,0xfdc84ca8,0xfe1a6e50,0xfe7fccfc,0xff35e92f,0xff514040,0xff89696e,0xffc3db09,0x004860ea,0x00843543,0x006c9a07,0x004d0dd7,0x00472491,0x00738f2e,0x00d6482e,0x0117096e,0x011848a2,0x013be340,0x013e689c,0x012a357e,0x011eb656,0x0120429e,0x010b5ed2, -0x014405e4,0x0133827e,0x014dc9be,0x016e5d70,0x016dd352,0x0160c9f0,0x017eaf14,0x01a59e7a,0x01f6e8de,0x020fcacc,0x024ecbec,0x029a463c,0x026ad034,0x023013b8,0x01ee69ac,0x01bfff7e,0x01895ca4,0x015d1ef0,0x015cd978,0x015d905a,0x016ae51c,0x01452ecc,0x0102056a,0x00d7cf1f,0x00cf4acf, -0x00d33d04,0x00a63c1a,0x00bb77f8,0x00a637cb,0x00af4ba8,0x009741ee,0x008df348,0x007f4a2b,0x00bc1710,0x00f5470c,0x01295394,0x01251898,0x009d64b7,0x00d65f93,0x00db8bd2,0x00e88cb4,0x00fe6d82,0x0110dad6,0x011d2bd2,0x0123163a,0x0114a86a,0x010101ca,0x00f53c5b,0x00f62772,0x010890f4, -0x01224a3c,0x0118840a,0x01120c8e,0x00fb8e83,0x00ee9285,0x00cb803a,0x00c15436,0x0110904a,0x00fdb95e,0x00fd49f4,0x00e46448,0x00ebdca3,0x00ee30c4,0x00e94787,0x00e1053c,0x00dfc289,0x00dca758,0x00e8e8a0,0x00cca44f,0x00cec1c6,0x00b5a966,0x00bea93b,0x00d338d1,0x00b5778a,0x00ed0654, -0x00e7eb42,0x00efb96a,0x00f13f60,0x00f15bec,0x00f20880,0x00f4f8bc,0x00fc7f58,0x0106e214,0x010e0588,0x0117d7c4,0x011bc90e,0x0123f5e8,0x010de76e,0x00ff35b0,0x00f4836a,0x00e52d93,0x00dd2773,0x00c143db,0x00b2babe,0x009fc569,0x0088a952,0x00c74263,0x00a6506b,0x007b7aed,0x007b49f7, -0x007a6402,0x00753758,0x0071d6ca,0x006b9538,0x006c38b3,0x009d32a5,0x00ccf9d2,0x00618f27,0x009511a1,0x01074cde,0x002720d7,0x001a79e5,0x0003099b,0x001b8798,0x00239446,0x0032d506,0x002870fd,0x002301eb,0x002326f7,0x00113447,0x000a3166,0xfff426ae,0x001cd709,0x002968a8,0x003b6b4c, -0x002145ae,0x001d0e7e,0x001f87f1,0x002434a2,0x00271f10,0x00291baa,0x0033afb2,0x003b3814,0x004de282,0x0034e4d7,0x002c1faf,0x001e992d,0x001e7156,0x001f1691,0x00231c5b,0x002f42a0,0x003280bb,0x00256838,0x0032cdfa,0x00301688,0x0012f116,0x00213b16,0x004372bc,0xfff699c3,0x000d5615, -0x00217ddd,0x00480b44,0x0043254e,0x003e65f6,0x003d0c96,0xfffa608b,0xffd2b95c,0xffa4df86,0xfffbb078,0x002f8927,0x0065a39e,0x00203f9b,0x000c64c5,0x00196ebd,0x00235c45,0x0030ef7a,0x00341667,0x004604cd,0x00612cc6,0x00849582,0x005c2cb9,0x00437ddb,0x001d6d94,0x000cf502,0x000bfd03, -0x001e4084,0x003d5938,0x0045376e,0x002d2374,0x00460963,0x00409411,0x0015e19c,0x00441bd5,0x000b568d,0xffbf6d56,0x000377c8,0x003490f4,0x00839b83,0x00550fb8,0x0048b2c4,0x002a4a1a,0xffbc3db1,0xff88ba50,0xff2dbb1b,0xfffce10e,0x00492b4a,0x00a97a6f,0x001ef26c,0xfffd4459,0x000e1490, -0x002311e1,0x003f70ba,0x00336388,0x00633840,0x009fc860,0x00e71992,0x009ee8c5,0x005b0320,0x000ddb0c,0xffeaca7e,0xfff25ab0,0x000201b3,0x004ff7dc,0x005ed0de,0x001ad33c,0x00753020,0x00761947,0xffcad8be,0x001a6ffd,0x00eecc1e,0xffeb11c4,0x000361d0,0x00580c9d,0x00baad72,0x00bc8337, -0x00a37b58,0x0098f8ad,0xffd5c3a6,0xff2b79e0,0xfe7e9e7a,0xff7a4b18,0x00526fc8,0x010f2b18,0x0028270b,0xffd8a4f7,0xffed7a19,0x0014aab0,0x003e9b43,0x0030b69d,0x00715d5c,0x00c62b7e,0x0138c638,0x010a04b0,0x00d67b05,0x003f8a9d,0xffe0c8f9,0xff9c04c0,0xffb05810,0x007b5e91,0x00cfcc4a, -0x00608344,0x00d07e49,0x006ead4b,0xffb773e1,0x00c6cc22,0xfd283564,0xff387bea,0xffbc9bbd,0xfffd3ed3,0xff76f9c9,0xff5fb37c,0xff19f2ec,0xff31101e,0xfdb82924,0xfe3b9d38,0x00eadd43,0x00c36010,0x00a5c153,0x0079556a,0x00077f34,0xfff5ca50,0x0035ed83,0x005f156b,0x006265b2,0x00604e4b, -0x0085140b,0x00d03535,0x0184c0fc,0x00dc8c24,0x0075cb59,0x000d4382,0x002fb8f6,0xfff82bf4,0xff9558f2,0xff75f49e,0xffa6e1db,0x000dd33f,0x00583ea1,0x00b1b20c,0x0155336c,0xfdf778f4,0x00f71f7f,0xffced69a,0xffb46653,0xff51f36c,0xfe82dabe,0xffc0d9d1,0x0004e685,0xff198919,0xffdfb91c, -0x0003771d,0xff9e17ae,0xffff3738,0x001d3dea,0xff46bcd3,0xff81cfa4,0xff7bd251,0xff7d9ec2,0xffa04c6c,0xfff9dd7a,0x00331de1,0x00b4102b,0x0080679f,0xff8c7e78,0xffd5dc1a,0xffff0b25,0xffed72d7,0x00042a13,0xffe863e7,0xff982121,0xffafb2f7,0xff615071,0xff26b50f,0xfe9ebdbc,0xfe7a53ec, -0xfe9cd268,0x0095466b,0xfe7424d4,0xff986acd,0x01244dde,0x017c9fae,0x0077e682,0x001424f6,0xff5b7824,0xfdfe8404,0xfe7155f4,0xfe7779b8,0xfe8d9ec0,0xff9bd373,0xffc26f30,0xff0185ca,0xff0a730a,0xfefa8956,0xff1a8dde,0xff388cbe,0xff889684,0xffb3062b,0x0070d4e2,0x007081e9,0xff505aa8, -0xffea94ba,0x005937a2,0x0003387b,0x0000b5a1,0xfffc5448,0x000a43d0,0x000273cc,0xffb5309b,0xffd484ee,0x00072a14,0xff804e48,0xfecf2c52,0xfe707afe,0x00d50c8b,0xfe6e79f0,0xfb178708,0xfa905858,0xfb6066e8,0xfe06f70a,0xff138476,0xfe25821e,0xff25ec07,0xff711609,0xff7549bf,0xff70d01c, -0xff69a0b2,0xff415e75,0xff756ca9,0xff70abda,0xff6f5235,0xff4d0524,0xffa368ec,0x001b12eb,0x0079fd0a,0x006c3f50,0xff887fe1,0xffa2d99e,0xff9dcbcd,0xff8563c9,0xffeabf2b,0xffdc925f,0xff8b6e52,0xffb07143,0xffb06a48,0xff2a3679,0xff88de63,0xfff66543,0x01340960,0x015b24d6,0x041ddc30, -0x05199798,0x04759eb8,0x032e97dc,0x01693872,0xfeccfdf4,0xfd47a2a4,0xfcfad6ec,0xfe064d0c,0xfea0de5c,0xff18a8fd,0xfefa2da6,0xff76e99d,0x00461eee,0xffbdfd4e,0xff6afcef,0xff90e368,0xff6d0371,0xff6ff807,0xff710341,0xff949cea,0xffb08e18,0xffa5b826,0x00151826,0x003dec00,0x0053daea, -0x001f3bc1,0x00024208,0x001fdf5e,0x008bbd99,0x01053daa,0x0192ae0a,0x02633bd0,0x02ae951c,0x02872014,0x036fc298,0x018413b0,0x01a84b4a,0x02383118,0x02c33f2c,0x0377cc44,0x03c55c78,0x03473a48,0x01dd212c,0x0032a923,0xfedd9226,0xfe247684,0xfd4629a8,0xfd21f190,0xfda34e90,0xfe26c146, -0xfe8417da,0xfeaf61a0,0xff00ec83,0xff6d640c,0xffd93e3d,0x004f3de7,0x0068be30,0x001f58e3,0xffe8ad5d,0xffee889c,0x003b954e,0x00cf6ae0,0x01294dd2,0x01432646,0x01441790,0x0145af2e,0x012c92bc,0x0161cdb8,0x017e2176,0x01645ab0,0x01a204ba,0x016c4f8a,0x01b87e34,0x0206e7c8,0x0228562c, -0x02444d88,0x02509f90,0x02828a68,0x02ef4bc0,0x02cf4214,0x02b66e90,0x029cf980,0x023a85d8,0x01c92480,0x013c4c26,0x0101cd68,0x00cc4cdf,0x008e1daa,0x00a4dc54,0x00922ff7,0x00b1f016,0x00e5afe0,0x00b42b2e,0x00ba8fa8,0x00c934c2,0x00cc4de1,0x00ca2d24,0x00a9164c,0x00a68369,0x008c605b, -0x00979863,0x0089e288,0x008e8f41,0x00b8f330,0x00e0a0f0,0x0103db40,0x013a32ec,0x00f477fc,0x015bde18,0x016b63ce,0x017d395e,0x01a22a06,0x01c4434e,0x01d9ea3e,0x01ecfb4a,0x01c06cc2,0x01a5a568,0x018e4e56,0x01808872,0x017f30cc,0x01837be4,0x015f3622,0x01388f3a,0x010f3d46,0x00e7963b, -0x00bb7b67,0x008d962a,0x00a8f248,0x00c5274e,0x00dad041,0x00db14cd,0x00e9eda1,0x0104355c,0x011332b0,0x01213e0e,0x012251f6,0x0134db54,0x014ad502,0x013de154,0x01450888,0x01300712,0x012b6508,0x014e6ff4,0x0133bdca,0x016caf42,0x0164c70c,0x0170c35c,0x0172b142,0x0176ebc8,0x017c72ea, -0x018ace52,0x01877876,0x0187df26,0x0184e466,0x01831466,0x017db01e,0x017d9b92,0x0169b4fc,0x015c5c6c,0x014f4a44,0x013d09ca,0x013050d8,0x0118fbc2,0x0105694e,0x00fa09ad,0x00dbba72,0x011e5f54,0x0108d29a,0x00e8b858,0x00e6f946,0x00e54298,0x00e8e592,0x00e52ae3,0x00e326cf,0x00e8af28, -0x011a0a4c,0x0146f402,0x00e293b8,0x01154952,0x01809bee,0x00287222,0x00162772,0x00082afc,0x001753cf,0x001d209e,0x001ee653,0x002d6840,0x002f17a6,0x00269f51,0x0019aa2b,0x0011bc46,0x00058218,0x00163c38,0x002181c6,0x003e638b,0x0024d739,0x0022490d,0x0027f2bc,0x002c2166,0x002f1001, -0x00330311,0x0036fcc7,0x0038495d,0x0042d701,0x002f9557,0x0024bdad,0x0018df54,0x00175238,0x0018c24a,0x0024f3ed,0x00255118,0x00250ce2,0x001b84b7,0x00253768,0x00299b9e,0x0018661a,0x001c27f7,0x001eac71,0xffea8cda,0xfff8180a,0x000350ed,0x000dc7f9,0x003834ac,0x003d1d40,0x001ffaa3, -0xfff76d32,0xffd6fa15,0xffc5259a,0xffdcedeb,0x000452c4,0x00568d54,0x0021d149,0x001ed3b7,0x0030b1b4,0x003b2b28,0x0049ec09,0x004a12d8,0x00553594,0x006932ea,0x00795ced,0x005519b2,0x003d7769,0x001f2181,0x00127bc3,0x001521ce,0x002fc91c,0x003939e1,0x00396f4d,0x00275ae0,0x002b9c09, -0x002a7275,0x0027b0fb,0x0033d573,0xfff1039e,0xff838339,0xffc8472b,0xfff81a4f,0x00062756,0x00623221,0x007abaa2,0x0027d2e1,0xffe28697,0xffaa6973,0xff73e5e6,0xffc4d980,0x0001c89d,0x009bf475,0x0022426b,0x0015b51b,0x003773c3,0x004bb71c,0x00686e61,0x005cf855,0x008a61c4,0x00b16b55, -0x00d77fe5,0x008c4d0f,0x004e399f,0x0014c5ee,0xfff72f98,0x000e063a,0x002caa4a,0x004aa438,0x0043077f,0x001624b2,0x00429a38,0x005201b2,0x00098c9c,0x0014d6d9,0x003c294c,0xff3a14e2,0xff6504a1,0xffbfdb0a,0xffe35c81,0x006988c6,0x008c3c17,0x0027b854,0xffc76a65,0xff314b64,0xfec89066, -0xff0f5945,0xffc242d8,0x00b43f9e,0x002111f0,0x0005ab15,0x0034f518,0x005842bb,0x00867b27,0x006fde77,0x009b09f5,0x00d6d62a,0x013da092,0x00f9d403,0x00b72ddb,0x0037e56f,0xffd9ae6a,0xffa86b5f,0xffdf5059,0x0075fb26,0x009fb40d,0x0034878e,0x007e28e2,0x0039da64,0xffeecc57,0x00690b1f, -0xfdc0c5c0,0xffc2c02d,0xffdd6d86,0xfff824ab,0x00073337,0x0076849f,0x0041da7e,0xffcc6c49,0xfe8df9be,0xff038f17,0x01962010,0x00de43b3,0x0096e59e,0x008a2e77,0x003d26d7,0x003c5852,0x00509694,0x007a6e9e,0x008369cf,0x004d9dec,0x0091b2b2,0x00e73397,0x015f3fb4,0x00be07cc,0x00598063, -0xfff6e6dd,0x0028a0b3,0x000f71f1,0xff9ff8aa,0xffae1212,0xffda0818,0x000600d3,0x0072c406,0x00afcf82,0x011a5826,0xfe2d589a,0x00f9ddc2,0x001c3bf9,0xfffb1f10,0xff67c2c9,0xfe05ebf8,0xff2ef132,0xff744a5d,0xfed0d75a,0xff1b3fa2,0xfeffb168,0xff145596,0xff510d32,0xff9ca6ec,0xfffb92ef, -0xffb6f642,0xff8eb541,0xffc046b4,0xffe339a7,0x003b280d,0x006a3797,0x007e2d24,0x00541908,0xffad61ab,0x000109f8,0x00387c63,0x00202b0c,0x00152c6b,0xffe6257a,0xffba2a00,0xffbbd21b,0xff7e3878,0xff7c4e1a,0xfef3cab8,0xfecde2c2,0xff1a4f6b,0x00a77e73,0xff3677b2,0x0069d5a3,0x011260a0, -0x012b5412,0x00c0e89c,0x008db1f8,0x00098167,0xfedcb362,0xfeae03e2,0xfebd407c,0xff462f8b,0xff96d3cf,0xff99d8b9,0xffc239a7,0xff7a3352,0xff731241,0xffb7d0ff,0xff748810,0xffab203b,0xfff94530,0x003fb6ca,0x0046be07,0xff9db15b,0xffdee589,0x0031312e,0x000ebd00,0xfff59f42,0xfffc7806, -0x001aee8a,0xfff43207,0xff97da77,0xff78848a,0xffccf1f8,0xff656075,0xff1251b0,0xfedfd1f0,0xfea024f2,0xfc9b1c88,0xf9b94ee0,0xfa07ec08,0xfcdae898,0xfdb67220,0xfea8afc0,0xff61ce5c,0xff113653,0xff2a31fc,0xff918fbd,0xff9274bf,0xffc46581,0xfffff708,0xffab3aa2,0xff7f24de,0xff9f951a, -0xffb496ad,0x0006a1ce,0x0091b2f6,0x001c299f,0xffeeb6e8,0xffa5dba1,0xffb87e01,0xffc83bea,0xffc8bb75,0x000c2718,0xffed41d5,0xff8b5e64,0xff83e83c,0xff5d22cb,0xfec5fccc,0xfee407ea,0xfef36b5a,0xffb8d3f0,0xff793db6,0x04509218,0x04910330,0x0389f32c,0x01d8fd4e,0xffcf7b23,0xfd805ca4, -0xfcf18368,0xfe311720,0xfe8b033e,0xfec38154,0xfec17c3a,0xfe902a20,0xfeb5933a,0xff27ea27,0xffbee625,0xfff76aa5,0xffdaf218,0xffa8723f,0xff9de9b8,0xffce560c,0x000c28e1,0x0026144c,0xffa06e2b,0x0000c1ba,0x000d7a50,0xfff17dd1,0xfff1198e,0x0008e40b,0x005380a7,0x007aa7dc,0x00ee6d86, -0x0173ca80,0x02b43d0c,0x032dc3a8,0x02ea1654,0x03b0b130,0x01e75024,0x01f1521a,0x024a2e24,0x0282ea88,0x02abbc08,0x029a2700,0x018c66ba,0xff9d32cb,0xfe979cf0,0xfe1e7df4,0xfe21326e,0xfdde5c04,0xfdf5f68c,0xfe4c785a,0xfe2d92ea,0xfe6745ac,0xfe98c7aa,0xfef26138,0xff4beb9e,0xffc345fc, -0x00228e54,0x002677af,0x0000323b,0xfff2b39a,0x000ff2fb,0x006dd5fb,0x00d3faae,0x0122f1e8,0x015d284a,0x015c4f78,0x015e53e4,0x013fc5d2,0x017a61c4,0x019b0a22,0x0191fba6,0x01dca704,0x01b837d8,0x020c98fc,0x027ddd14,0x02d04388,0x0330d96c,0x030c8638,0x03255e48,0x035f58a8,0x02d30b10, -0x022c5858,0x018e39da,0x014791d4,0x00f8474f,0x00a942f6,0x0072dd11,0x003a0f27,0xffe96568,0xffef1d0e,0xffe0f6f7,0xffece2a3,0x0046fee5,0x0066731c,0x00ac89e8,0x00cf1d41,0x00e59bef,0x0103f602,0x00d32465,0x00d0c18b,0x00aa4e82,0x00c987d2,0x00c4704e,0x00d77d28,0x0104dd92,0x011d9ff6, -0x013c8884,0x0186e4ec,0x01a542e6,0x020a9db4,0x02029fb0,0x01fb9cb4,0x02050400,0x0208bebc,0x0200b0b8,0x02006c6c,0x01d68d6e,0x01d276b0,0x01bdf5ba,0x01b53210,0x01a045a0,0x01861b5a,0x0167cb44,0x014be14c,0x01348a34,0x011daff6,0x01034490,0x00d9a903,0x00d04172,0x00f030d3,0x00fe0d32, -0x0102195e,0x010a9276,0x01251b66,0x01456280,0x01617ed0,0x016bf6e2,0x0187e1de,0x019edbd6,0x01a055ac,0x01af5eb6,0x01b1c3be,0x01b433ce,0x01e10ff6,0x01a31760,0x01d3ea74,0x01c1344c,0x01c4e0f4,0x01be22fc,0x01c2c304,0x01c70b82,0x01ce175a,0x01c9c0d4,0x01c23174,0x01bb39b6,0x01ac2c5a, -0x01a1c1d8,0x019d0be0,0x01930724,0x0189102c,0x017d9218,0x016c534c,0x015f3516,0x01544f3a,0x0144225e,0x013c081a,0x01223cfc,0x015bc51c,0x014ec2fc,0x0132f906,0x0135c9d8,0x01397696,0x01448f2a,0x0146ccf4,0x014d33ca,0x01574fbc,0x017c73ee,0x01a1b382,0x015fc016,0x0188c012,0x01c5626c, -0x002feb68,0x001ed20d,0x0013004b,0x001743c8,0x001cd680,0x001eb4e9,0x0032d1f2,0x00332447,0x0025fca1,0x001eb459,0x0016525c,0x000c9ab0,0x00114d3b,0x001bb934,0x003bf2b8,0x002b55c5,0x002c5c37,0x00325ddf,0x00368847,0x00396a61,0x003c2ace,0x0040b05e,0x00400096,0x0040796f,0x0033fbdf, -0x002aa6f7,0x001e66f3,0x002026e7,0x00228dc3,0x0032b7fa,0x0028bbcd,0x00255fc9,0x00218282,0x00250745,0x002f1f84,0x002bb176,0x00270b2c,0x0019071e,0x00097c82,0x00088182,0x000b29bc,0x00042b0b,0x003d317c,0x0040d702,0x001a22be,0x000aa8e1,0xffed8bf6,0xffdd08a9,0xffd16579,0xffec1b16, -0x0046c872,0x0023b8d7,0x002c43e7,0x003ee395,0x004bb6af,0x005a125c,0x005a5b8d,0x00691aa5,0x00738758,0x0070d3be,0x00541665,0x003cf272,0x00212c87,0x001f1872,0x00270173,0x004a8a67,0x003a8a70,0x00351f5f,0x002ff86d,0x00202818,0x00286573,0x004e46bd,0x003992c7,0xffe46da8,0xff9b8014, -0xffb9b803,0xffc1a812,0xffcdd5ce,0x00611e5a,0x006518cb,0x000bc18b,0xffefadfc,0xffb3f89d,0xff812621,0xff87ea93,0xffbbfc4e,0x0076d3ad,0x00231e9a,0x002957d7,0x004b237e,0x00665870,0x0080f327,0x007ab9f0,0x00ad6e1b,0x00c0167d,0x00c2b0a8,0x00802ae5,0x004c2640,0x00179c3a,0x000b0312, -0x002ced83,0x0062cdef,0x00497e24,0x002fd236,0x0029fcf3,0x002182b3,0x003b578c,0x005fbcf9,0x00302e0a,0xfff44cd3,0xff96bed7,0xff9e4e9f,0xff8e1521,0xff741964,0x0058f1de,0x00689571,0xfff31257,0xfff0293a,0xff6ca11e,0xff0b1b7f,0xfedf9ffa,0xff575331,0x006f0fc0,0x0010afed,0x0018faf6, -0x004d23eb,0x007b9fdd,0x00a99ad0,0x009968f6,0x00c8c518,0x00f09ed5,0x012a77e0,0x00db6c6d,0x008ff21c,0x0023dcd9,0xffe510f4,0xffcf8be1,0x0022077e,0x00697214,0x0071f24c,0x0030cc24,0x002fd3c8,0x000c7aa0,0x005a6581,0x00582a16,0xfe7fe3fa,0xff8de8f9,0xff9105a6,0x00114641,0x002d1a75, -0x00d69c9f,0x00b156e4,0x001979c3,0xfefce3f0,0xff282e37,0x01176fda,0x00260a01,0x00056daa,0x009ad9bc,0x0021400c,0x001616fe,0x003929c3,0x005b70ac,0x007ddf47,0x00867b8e,0x00df3ac0,0x01147c34,0x012c5806,0x00b48fa9,0x0059b276,0xfff4c369,0x0027b9b2,0x002686ff,0xffc4b8fb,0xffe69412, -0x000a3fa5,0x00239ba2,0x00b76eb2,0x00d778b5,0x00e7c607,0xfecf4ab8,0x00743926,0x00caab88,0x00944307,0xffa8eeec,0xfe18c7fe,0xfe3d5eb6,0xfea143fc,0xff66e16b,0xff38f259,0xff492805,0xff9a4940,0xff2c2efa,0xff52ba47,0xffe7843a,0xffc94c11,0xffbe09e8,0xffc80152,0x000b1e96,0x005cee5e, -0x00a72622,0x0055b1c8,0x0033c7db,0xfff4898d,0x00259c0b,0x00564552,0x00295ea2,0x000965f5,0xffe19fb0,0xffdbfbec,0xffd8944e,0xffa118ed,0xff8c5f8d,0xff172a7f,0xfefe32b0,0xff51202a,0x00289e56,0x00008342,0x00dc285f,0x00acc18e,0x007b1181,0x00cd017a,0x00fb5513,0x00aa64e4,0xffdc1007, -0xff12a105,0xfef8d1c6,0xff5b2b85,0xff9c94fc,0xffdc281b,0x00133ada,0xfffd0ccb,0xfffe9196,0x0032df8c,0xffe9a45a,0x000dc21b,0x00912e2e,0x004afb89,0x0048d372,0xfffba777,0x00049048,0x0024de3f,0x0025986d,0x0011e243,0x00070b77,0x0010a13a,0xffe156b1,0xff85a93b,0xff477597,0xffa159a5, -0xff5e02b0,0xfecd1250,0xff714d61,0xfd133f6c,0xfbc3ef60,0xfb61e108,0xfc1fe154,0xfe2c36a2,0xfe19d2f0,0xfe7ce75c,0xff89babf,0xff2735b2,0xff78fd31,0x00003ad4,0xffc837d4,0xffb5a7fb,0xffa4c9fa,0xffa637a1,0xff99bdd4,0xff991ef5,0xffe6f127,0x0031574c,0x00c41e8f,0xfffde8d6,0xffbb7115, -0xffba1f60,0xffe18e11,0xfffb7734,0xfff45cb6,0x00118983,0xfffc8994,0xffc0dcea,0xff84377f,0xff4d3b3a,0xfee8e2ce,0xfece4fdc,0xfe873a74,0xfe76d35e,0xfe0a4d5a,0x039a6dd4,0x02e65350,0x01a21988,0x00110dce,0xfdecb248,0xfd5b01ac,0xfdb4cafc,0xfec4a1f0,0xfec02d0c,0xfec5788e,0xfeb19d2e, -0xff031af7,0xff094a7d,0xfeb38452,0xff38f813,0xffbf9659,0xffe547a9,0xffbf7e29,0xffed443f,0x00447046,0x00477a87,0x00506160,0xffc2a29d,0x0011b562,0x000c41bf,0xffc43874,0xffe309de,0x0006fc0f,0x00534583,0x004c47a9,0x009ddcf5,0x00f85ec4,0x025c303c,0x0305893c,0x02f133d0,0x033a7274, -0x0251b89c,0x025a0edc,0x0272a0bc,0x02382bf8,0x01c5352a,0x00d39ec3,0xff721b56,0xfdf570c4,0xfde3ea34,0xfe13963e,0xfe565100,0xfe90fa3e,0xfeb77738,0xfefdb2fe,0xfe7ef3cc,0xfe703392,0xfebfaa68,0xfee4ecd0,0xff16ab0c,0xff78c156,0xffb18303,0xffcd1c15,0xffee092d,0x00306169,0x00768497, -0x00da3b39,0x00ecfb62,0x01136d82,0x0154e4c4,0x01746b14,0x01978dca,0x01b506c4,0x01860496,0x0185d358,0x01bd9e06,0x021e01f4,0x01f471cc,0x022256dc,0x026dfe2c,0x02b9699c,0x032b8a84,0x02f02278,0x02eae268,0x02db1310,0x01f10b28,0x00f0957f,0xfff46b62,0xffef4589,0xffda5828,0xffd5eb47, -0xffdadf91,0xffdb0a55,0xffc1cb9f,0xffcb76c5,0xffdb32b2,0xffdd43ac,0x001361cd,0x0057c673,0x0092f6f0,0x00ae3ecf,0x00cc6498,0x00e1ea6a,0x00dfc70b,0x00ea0567,0x00e4458c,0x01131802,0x0121e2e6,0x014e03e8,0x017a8844,0x0190b3ae,0x01a3e6fe,0x01d3b352,0x021ef8dc,0x02295d2c,0x0212cd64, -0x01ff52d6,0x01e97bf2,0x01d93408,0x01c0098e,0x01bc6b40,0x01ac7c28,0x01c3b6e8,0x01bb2ace,0x01b4007a,0x0197a68e,0x0177296e,0x015dff90,0x0144de1e,0x012fffba,0x011d313a,0x010476a2,0x00e99a93,0x01094290,0x010eaf1e,0x011dbc6e,0x012b6484,0x0140e9cc,0x01554146,0x0173782c,0x018d72ec, -0x019f7362,0x01b3de8c,0x01c7caf0,0x01ce0ecc,0x01dd57ca,0x01e95568,0x01f93356,0x020de8fc,0x01cd4338,0x01d3fa16,0x01cad9a0,0x01c67252,0x01bf5100,0x01c2397c,0x01c319c2,0x01c047d0,0x01bd42ea,0x01b38c6a,0x01b05688,0x01a0defc,0x01987dcc,0x019385a2,0x01899b5e,0x01801aba,0x01761ec0, -0x0168d8d8,0x015dd240,0x014c4c5c,0x0162efa2,0x01672c40,0x01677262,0x017704c6,0x017c22a6,0x0175cad6,0x01787960,0x017d1252,0x01854cd4,0x018a1b94,0x0192148c,0x019a9182,0x01b0d91a,0x01bcfef6,0x01b73de8,0x01c5a59e,0x01d90b38,0x003d1e0b,0x002a0228,0x001d9a7b,0x0025e165,0x002d46cf, -0x002dd297,0x0041a64f,0x0041f69a,0x0034bc03,0x00320397,0x00271dfa,0x0011323b,0x0015a3c1,0x001edb37,0x003eb07e,0x00369b13,0x003a27e0,0x003d779b,0x0042143a,0x00458fbc,0x0049f2a8,0x004c69ab,0x0048f8f8,0x0040962f,0x003ddfd2,0x0033944c,0x00236905,0x0028a48b,0x002d3844,0x00419b75, -0x002e0fff,0x002929b0,0x002d383d,0x002ceff2,0x003a2677,0x00455191,0x0032c771,0x0027409b,0x0015d860,0x0021add1,0x0022eee0,0x000fb501,0x0046dfe1,0x004f3482,0x002b667d,0x002c23bd,0x0007d2e7,0xffd2bd6f,0xffcc3863,0xffe5fb63,0x0042c140,0x0035fd17,0x004399be,0x004d3acb,0x005c5a5b, -0x0068fc48,0x006a3f99,0x0078af4d,0x007f7eb6,0x006e76fa,0x0057277c,0x004104cb,0x0028b91a,0x002d0a96,0x0039074c,0x0067b410,0x004325f7,0x003a88cd,0x00438b0c,0x002234a9,0x0034de37,0x008b4538,0x004ebc2f,0x00093709,0xffcf820a,0xffee0f18,0x000365e7,0xfffab148,0x006fc9b2,0x007a8c6a, -0x00287147,0x0033eef9,0xffe3f768,0xff68b292,0xff6ea1fb,0xffa1490b,0x00607f83,0x003670a8,0x00495eba,0x005c73e2,0x007742ba,0x0092e4d8,0x0097c138,0x00c520b0,0x00cd3587,0x00b35121,0x007e73bd,0x004d8c6b,0x00212044,0x00197d7a,0x004350f4,0x0099add8,0x004bbd21,0x002edf93,0x0053ba35, -0x001c15d5,0x00399d4c,0x00d59ae1,0x004d9620,0x0044b77a,0x0001fb90,0x0011d8dc,0xfff145fd,0xff93f6fc,0x005370bb,0x006d8b6c,0x0008bd69,0x003f113e,0xffb6e3f5,0xfee750de,0xfecab500,0xff348198,0x0063bc93,0x003c7682,0x00549cd8,0x00737801,0x00a26054,0x00d02401,0x00c6494b,0x00f9bdb7, -0x010ee5bc,0x01124e70,0x00c61517,0x0078c83e,0x002130e3,0xffebca02,0xfff9c23d,0x0076f930,0x006943c0,0x00546a3d,0x004ba31a,0xfffe0b95,0x0024b8db,0x0129e20a,0x009ce60e,0xfedcf4e6,0xff3af904,0xff8bcdfb,0x0041967f,0x009ebe1c,0x00fa3a71,0x00d7d4ab,0x00b76644,0xff82f873,0xff559edf, -0x00397e12,0xffed833b,0xfff2ff84,0x006ada9d,0x001d17f8,0x000e82c2,0x002e325c,0x005bf902,0x008288ce,0x008dd55e,0x0124875e,0x013efaf8,0x0103913c,0x00ad4e2d,0x0061d4af,0x00068f9d,0x0035d679,0x0032f08e,0xffd94b4c,0xfffa06fc,0x002f568f,0x0072ab08,0x00dfc460,0x00c03b36,0x00616a08, -0xff2a133f,0x00395ebe,0x01f9717e,0x00fcf017,0xffa847e1,0xfe759364,0xfda2a6a4,0xfe0e993e,0xfff0be4f,0xffad17fc,0xffd9e5e5,0xffee704e,0xff8501b1,0xff69d043,0xff916bd3,0xffb45aa7,0xffd8c7cd,0x001ec4f7,0x0044ac4f,0x0076860b,0x00c5cd8e,0x0045b332,0x002b0c32,0x00323589,0x003dcb09, -0x005a8c2e,0x001e9a1d,0xfff34cec,0xffd2fabf,0xffed5ad7,0xffe78ece,0xffaabb0a,0xff769a60,0xff4349fc,0xff549dc0,0xff8d229b,0xffb97ab8,0x00975fc1,0x009d5fb6,0xffea0d2b,0xffecdb8e,0x004dba51,0x011b7b1a,0x01218844,0x00586392,0xffbb51b3,0xff8a1d01,0xff8f036d,0xff9acdd0,0xffcca84d, -0xffd83037,0x0053a0d2,0x0072e15f,0x0066eefe,0x004299db,0x006d3d24,0x011eb5a6,0x0052e748,0x00404f93,0x00454430,0x003394c5,0x002ff2f7,0x00268066,0x0023e71f,0x00060346,0x0009c2b5,0xffc954d3,0xff7fdecc,0xff56d1f2,0xffb35773,0xff6afd56,0xfebe6a6e,0xffff3632,0xfc8a4dcc,0xfc639198, -0xfe32db56,0xfec76f26,0xfe5f76c2,0xfe8fcbf8,0xfeaffc60,0xff05303d,0xff75c3a4,0xffe197a3,0xfff432c7,0xff95ea3f,0xff57218d,0xff1d277b,0xff38fc01,0xff891355,0xffbc06a8,0x001dee31,0x005f2d25,0x00d92e1c,0xfff54c0f,0xffbe206c,0xffe08789,0xfff7cae1,0x0013e6b3,0x000674d2,0x00113e95, -0xffff56e6,0xffefe395,0xff996e95,0xff674e32,0xff2e4fb4,0xff2f8894,0xfea41524,0xfdd33020,0xfd506ebc,0x01f98bca,0x008a487a,0xfee7f4fc,0xfe1362ba,0xfd16e004,0xfe1a4298,0xfed9a21e,0xff003e98,0xfef43832,0xff03a67a,0xff4dd2a9,0xff672060,0xff8ab4e4,0xff8a14fe,0xff2d5b10,0xff4493a3, -0xffa2c464,0xffb3aecf,0x0003ad6b,0x007abacf,0x001782ff,0x00122420,0x000d2afa,0x002f81ac,0x001ce503,0xffc14386,0xfff6f3d8,0x000fea26,0x001e487f,0x0008d7b7,0x0028d197,0x004a7aa1,0x01690056,0x02192590,0x02518614,0x02011648,0x02e344a8,0x02ee7fc4,0x02b17830,0x01f8726c,0x010744f6, -0xff2b20a5,0xfdf8f538,0xfd8df500,0xfde8c28c,0xfe45133e,0xfe885e62,0xfed6d40c,0xfef03eee,0xff240241,0xfefae21e,0xfee50316,0xff37b2e4,0xff0978ed,0xff228837,0xff6bb98b,0xff613f31,0xff93879f,0xffc3af50,0x003e49b9,0x00a8088f,0x0110d074,0x00fa23d0,0x0102e3ac,0x0139b196,0x0183d1a8, -0x01cecfc2,0x022dcb90,0x01bd82fe,0x01b634ae,0x023a3188,0x029a0758,0x01d8696a,0x01e9043c,0x01ee00b8,0x020471c0,0x024cd300,0x01fdd59e,0x01be532a,0x015681f0,0x0094dde9,0xffcb8578,0xfef1b5be,0xff0d7756,0xff15920f,0xff193c60,0xff48a47c,0xff7412fd,0xff99bbcc,0xffca387b,0xfffc7bfa, -0x002315c7,0x00388aa6,0x0058fed5,0x00656766,0x00772a8d,0x008ac9ae,0x008deae7,0x00c57c2d,0x00f610c7,0x0122c7e8,0x0156d9a6,0x0173e484,0x01abe766,0x01bb488a,0x01c15b5e,0x01b5f740,0x01cba770,0x0210a0e0,0x01e1cf38,0x01c7a3ba,0x01b1e836,0x018a9d9c,0x016f739a,0x0156f22e,0x015055b4, -0x01483e6e,0x01522b50,0x0147b15c,0x0133513a,0x0115218c,0x01013476,0x00ebb408,0x00d1fa8d,0x00b46769,0x0095aa2a,0x006cee47,0x00526f90,0x00c533e8,0x00bcf90d,0x00e3dc44,0x0101c09a,0x0137bcd4,0x0151eb8e,0x016c7cec,0x0180f6ce,0x0199fb06,0x01a8b13a,0x01bc32a4,0x01d206ec,0x01d39200, -0x01dd904e,0x01ebecf6,0x01e514a8,0x01bbc6de,0x01aabc96,0x01a89e44,0x019fbdac,0x019b7e44,0x019c9962,0x019a83a0,0x0195d748,0x018a55c6,0x017d4306,0x01773484,0x01690b00,0x015e4098,0x01515840,0x0146f40a,0x013e4d26,0x0137d544,0x0131a8f0,0x0130f98a,0x011363cc,0x014809c2,0x0157a714, -0x017495fa,0x0165b264,0x0177a7ce,0x018bb5e0,0x019059ce,0x019604fc,0x019c2e6a,0x01a50010,0x01addc70,0x01b61138,0x01ba0e22,0x01b56810,0x01c48ab0,0x01c15d48,0x01dcbc7e,0x00494488,0x0034dea3,0x003099f9,0x0034f6c1,0x003ae75f,0x00376d2f,0x004e6382,0x004f6945,0x003a8ab7,0x004305d8, -0x0038b25c,0x001b98cd,0x001f6f8d,0x00260312,0x003ba46e,0x00406856,0x0045eba4,0x00470e79,0x004b831e,0x004fa15b,0x0056e206,0x0054d9dd,0x00507150,0x0046af47,0x004518af,0x003c4e37,0x002e6244,0x0033fe40,0x003a0952,0x0050dd1b,0x0038d515,0x0034078d,0x003e2f13,0x0035cb1b,0x004212fb, -0x006020ff,0x003e2470,0x00348e1d,0x002a2657,0x00336b7d,0x002d3682,0x0019aeb5,0x004e5f0a,0x0058b3f9,0x0028137b,0x004826d8,0x00283271,0xffdc3612,0xffd4cc66,0xffe41dd3,0x0026c554,0x003ef7fb,0x0055e4ad,0x0058696e,0x00657a10,0x0071bd10,0x0077edf7,0x00824d53,0x00862e28,0x006bce4a, -0x005c5bbf,0x00499738,0x00343215,0x0039863a,0x0045c5b8,0x00793bfe,0x004bd5f9,0x00423cf1,0x0056ee35,0x0029a55e,0x0041bcb5,0x00b5a3d6,0x00629ee0,0x001f1582,0xffe68c8f,0x0011694c,0x0025cf1a,0x000e0e1a,0x007cdd71,0x008e6234,0x00109182,0x00609477,0x00175495,0xff6db4af,0xff70ba2e, -0xff95d375,0x0019ddcc,0x00391c18,0x005d5029,0x00665d9d,0x007c32bf,0x00990f1a,0x00ad34fd,0x00cff8a2,0x00cf1e4d,0x00a0f34d,0x007d902f,0x0052eb30,0x002d6c05,0x00258613,0x004e4414,0x00b65fe2,0x004e2b98,0x003843c3,0x0076c772,0x001fdc03,0x003eac24,0x011ad360,0x00616477,0x004e750b, -0xfffc57a1,0x0021f8ce,0xfffebbde,0xffadafa7,0x00471c6b,0x0068dfab,0xffd76f49,0x0064108b,0x00025313,0xfee9f8e4,0xfec6304c,0xff097ca1,0xffe36176,0x003440ff,0x00795334,0x008c24b7,0x00a7de78,0x00d2d993,0x00de62fe,0x01149dec,0x011aeeda,0x00fbd918,0x00c17fbe,0x0079f5d0,0x003308ca, -0xffee310a,0x001a47b0,0x00c212b0,0x006bddf3,0x00473893,0x0071c2aa,0xffe433f6,0x003b6339,0x01a29e64,0x00b71d40,0xff1a76c7,0xff80f2ce,0xffef5cf2,0x008d30b3,0x01473208,0x0124b6aa,0x00f699ab,0x010f520a,0x0011bc4b,0xffb8b74a,0xffcf4123,0x002b03c7,0x003d9ec3,0x0048a2c8,0x0028e896, -0x001895e8,0x0024af48,0x0065fe2c,0x00a6a236,0x00a2c729,0x013d5822,0x0153e610,0x00e1c87a,0x00ab535b,0x0073e682,0x0023a5c9,0x00474bfe,0x0036fec3,0xffde13ae,0xffff1e4e,0x004e5081,0x00bcc5c7,0x00f3b705,0x008fdb6e,0xffc97870,0xff42d28d,0x003f8126,0x028cbdc8,0x00a56ba5,0xff5355ab, -0xfee699ee,0xfda48450,0xfe0e0ace,0x002d357f,0x00002bfd,0x0041cbf0,0x004853e6,0xffed15a9,0xffacb244,0xffb21202,0xff97188c,0xffb944a5,0x002b6ea7,0x00433c8b,0x00681304,0x00b10343,0x0030dbb0,0x00235e20,0x005cff49,0x005077c4,0x005a5ea4,0x002a5561,0xfff34a32,0xffd5bd16,0xfff04be0, -0x00004d8c,0xffd3a71a,0xff956f7d,0xff993329,0xffbae5b6,0xffd1e236,0xff8a5158,0x004fd667,0xffee27e8,0xff9fd172,0xffe1bb15,0xfff1f317,0x00ffd418,0x013331fc,0x006587b7,0x002d741d,0xffda22e6,0xff8e2984,0xff5398f3,0xff86fe3a,0x0026f822,0xfff4f708,0x0003d201,0x004e9ce4,0x005bda3f, -0x009f5b3e,0x015985a6,0x005b93a6,0x0032e173,0x0089b10e,0x0052c1a0,0x0030a67d,0x00222356,0x002477eb,0x00001702,0x0006234a,0xffb6def9,0xff85b2e1,0xff785764,0xff8d6929,0xff311e53,0xfecbbeba,0xfffc9a95,0xfcf36a30,0xfe3e8abe,0xfff9f929,0x000d9933,0xfe900c68,0xfeb7535c,0xfecc7ba0, -0xfed3ee00,0xffa5a4b4,0xfff7248f,0xfff3d061,0xff90c330,0xff62a330,0xff84c60e,0xff2a49d4,0xff6e9abe,0xffc82b4b,0x002dbbc4,0x006bafcc,0x00cd4fa3,0x0013a5b9,0xffd46c73,0xfffbee9e,0xfffcf90b,0x0021c6a7,0x00242080,0x000a97cf,0xfffbb7fd,0xffffafc6,0xffbee1e2,0xff8fb7c3,0xff7173d4, -0xff82adab,0xfed32dde,0xfdc3f7ac,0xfd36fd9c,0xfffe609e,0xfe075698,0xfc754e28,0xfc9f7150,0xfd5ebb0c,0xfed741c8,0xff8a118c,0xff69c781,0xff70bedb,0xff79378c,0xffc45636,0xff4f8ddf,0xff473658,0xffb26a4e,0xff8c4842,0xff757633,0xff7df517,0xffdd344c,0x000f26d1,0x0058dd8a,0xffdf392a, -0xffec8582,0x0058376c,0x00332783,0x0013f1c9,0xffd8df3f,0x00186fa7,0x002a840c,0xfff66973,0xffc1e1f8,0xffb2a165,0xffa9dff6,0x003e3fa7,0x00cadd97,0x01476318,0x008af91d,0x034874a4,0x03268938,0x028832cc,0x0166a8e8,0xfff27e96,0xfe4c6756,0xfda5cfd4,0xfdcc2a08,0xfe5467d8,0xfeb610d4, -0xfed1ddba,0xff4121e6,0xff65cc1a,0xff638da8,0xff6300b6,0xff5a806d,0xff7a82d8,0xff59e404,0xff724d16,0xffb56d65,0xff772e93,0xff8b45f4,0xffb2eab1,0x0029af83,0x008fd026,0x00deadce,0x00e205db,0x00f0fdbe,0x01168154,0x01981952,0x01f44afc,0x023ec27c,0x01fd0ac6,0x020d38a8,0x029ea31c, -0x02de055c,0x01b1a7ee,0x01b6fde2,0x016fa8c6,0x014f5b00,0x014dedde,0x00d81494,0x0048d91a,0xff914823,0xff34923f,0xfed5d2d4,0xfe6248ea,0xfe883bb0,0xfe9e6266,0xfeabceca,0xfed8ce62,0xff01b81f,0xff2e81b4,0xff690118,0xff9308cc,0xffda4048,0x0022c7b6,0x003d7843,0x0053a689,0x0066a33d, -0x0074bf88,0x0083a5dd,0x00cb4110,0x01103de2,0x015734e6,0x017c85ce,0x01a3a356,0x01d95bda,0x01d61586,0x01d57610,0x01c98502,0x01c87990,0x01c12d70,0x01769836,0x0162ae46,0x014d303e,0x012bbaca,0x010f623a,0x01057070,0x00fe3c6d,0x00ea11e1,0x00d101ac,0x00b44740,0x008d399e,0x0063e0b6, -0x0041e398,0x0039c5ba,0x002e2361,0x001d8f7f,0x00102654,0xffff61f3,0xffe78c47,0x003e615c,0x003d41b2,0x006b4ac2,0x009b6a1a,0x00d5c1ac,0x00ef09eb,0x0109afd6,0x0123d5f4,0x0149ee3e,0x015cad9a,0x0177eb44,0x01a3d26a,0x019c7ac2,0x01a485bc,0x019f643e,0x0186a474,0x017ff622,0x0141edb0, -0x014a42a0,0x0141eb00,0x013ec3da,0x0140420c,0x013c9be0,0x013afc4a,0x0128555e,0x011ad4c2,0x01105972,0x01018556,0x00f45ff7,0x00e05a29,0x00e2407a,0x00e0980f,0x00e0ed9d,0x00df127a,0x00e334a1,0x00cf6436,0x010ede3a,0x0132a490,0x01690662,0x0124d1be,0x015131e2,0x018e54b8,0x01965f94, -0x019c4bc4,0x01a13974,0x01adcae2,0x01b6ba8c,0x01c19b0c,0x019e33b8,0x01748c76,0x01c2d8fe,0x019d5f84,0x017af068,0x0055eeaa,0x0048ca32,0x00470e1d,0x0043884f,0x00483ec7,0x004371ca,0x005966a1,0x0059e1e8,0x00426723,0x0052d23b,0x00498d01,0x00280cc5,0x002c34e7,0x002f53d0,0x00381bf9, -0x0048a1ba,0x00506e90,0x0051b0aa,0x005661f0,0x005aec99,0x006419d7,0x0061140d,0x005bf054,0x004f03bb,0x004f8721,0x0049b3d6,0x003d6f16,0x0041f7c5,0x0047d174,0x005c445f,0x00464f1f,0x0042b3d5,0x004e9cc0,0x00445ddf,0x004e5378,0x0072ddcd,0x004fe3bb,0x0055d2a6,0x0059bd56,0x00481c89, -0x00398c5e,0x0028b730,0x005b55c1,0x00677ca5,0x002f4a40,0x0063e334,0x0047b55d,0xffed1b1a,0xffe74e19,0xffe97886,0x000b1720,0x003eb493,0x005d9c98,0x0061b1fa,0x006e0b25,0x007b2466,0x008c263f,0x008d6d64,0x008c2308,0x006cb506,0x0061edda,0x00540478,0x004346a2,0x0049afac,0x0054bf0b, -0x0080246b,0x00583d98,0x004e177d,0x00649b96,0x0036c945,0x005211a3,0x00cbbd38,0x007f2c55,0x00421b6b,0x002350cf,0x002b93cf,0x003bc97f,0x00206be9,0x0087bbbe,0x0090250b,0x000f7d54,0x0081dfcd,0x0045eed8,0xff8e1719,0xff8611f1,0xff919cc4,0xffd3013d,0x002c23f9,0x00611892,0x006ac006, -0x008356a9,0x00a27b9d,0x00c2e3a7,0x00d5b178,0x00cbed6f,0x008b7dad,0x007a7cf4,0x005b1555,0x00398511,0x00356aa3,0x00554bae,0x00b568ff,0x0051d6f8,0x0044d39a,0x00858cc0,0x002b7cb1,0x004c8d89,0x01331c54,0x007fcdfa,0x007b9778,0x0059bdde,0x00453d26,0x000057bd,0xffb9642d,0x0050b713, -0x0081bf09,0xffd91665,0x008f987d,0x0040a05f,0xff16389a,0xfee8d14a,0xfeeb2a16,0xff6145b5,0x000803de,0x00725cff,0x008ea469,0x00a8a2b9,0x00d248cf,0x00f6cb92,0x011ec538,0x011ccf92,0x00dc62d1,0x00b864dd,0x00815f44,0x004321ad,0xfff9154e,0x003267d5,0x00e9027f,0x006bdc5c,0x00497914, -0x008b323b,0xffe637eb,0x00500c20,0x01d8e2a2,0x00eccc64,0xff43b16b,0xffda8bd6,0x001ba70a,0x00d2aee2,0x01f92858,0x01284048,0x00ba2718,0x00b8dc9a,0x007c5b2a,0x0047234f,0xffd26c63,0x0051b543,0x005ae274,0x003caec5,0x00254719,0x001218f8,0x001a9246,0x004e7fcc,0x00a77aa7,0x00eb240e, -0x0137f79c,0x01392648,0x00ce6e23,0x00b578aa,0x0090de99,0x003d6488,0x00538868,0x0036ec2e,0xffde7ddd,0x00039260,0x006a8f52,0x00ebe958,0x010d9174,0x00809a3f,0xff7c7dad,0xff39b8d2,0x003a2901,0x02a8e850,0x00485aa0,0xff0d25ca,0xfefe8a36,0xfe1bb552,0xfeb6e8a8,0x00bb7ffb,0x0050897e, -0x005911bf,0x009f57d4,0x006035d2,0x0016f760,0xffec3bf5,0xffb7a5c3,0xffbe3e98,0xffe5bbe5,0x00204a37,0x0047d0b6,0x0091b622,0x00314f34,0x003643e5,0x007a5f79,0x00605020,0x00539d4a,0x00406b30,0xfffe8db0,0xffe72be8,0x00035ddd,0x00345675,0x000cfbac,0xffc5fd03,0xffd51c47,0xffd8abea, -0xfff732e6,0xff7385da,0xffdb8c32,0xffb014f0,0xffba3299,0x00091efa,0x0009bb05,0x00e90834,0x00f0fded,0x00756611,0x0058961a,0x001dc168,0xffff4a23,0xff94e091,0xffa68fb2,0x002fc6d4,0xfffdce66,0xfffef8dd,0x001c8082,0x00642b30,0x009b88ce,0x0136e95c,0x00608d76,0x0026fb7e,0x00982bea, -0x006ad906,0x0038b09f,0x001ca60b,0x00300b24,0x000a323e,0xfffb9e32,0xffab3276,0xff93ee12,0xffa121cf,0xff44ae2f,0xff03eff8,0xfef22050,0xffc52959,0xfdfc2768,0x000412c0,0x009bbbb5,0x0028ccca,0xfef370da,0xfea2c400,0xfec2cdec,0xff20ec2a,0xff87d613,0xffa879b0,0xffd859fb,0xff7731cd, -0xff657b35,0xffca4c68,0xffd0ed2f,0xffef126d,0xffd68880,0x002b7e70,0x004b2b48,0x00766365,0x0040a929,0x00188579,0x00183d8e,0x001899e8,0x0035d3ce,0x00444389,0x0002cc32,0xfff58308,0x00135289,0xfff3bbc3,0xffbe622e,0xffbe5455,0xffaae945,0xff010c7c,0xfe1aceee,0xfda55acc,0xfe536434, -0xfc47be50,0xfb989208,0xfc738ad8,0xfe2f84c0,0xff195d41,0xff9d5012,0xffabd456,0xffc853d1,0xffc37cd8,0xffba16e1,0xff7db704,0xff4e47ab,0xff7e4fa1,0xff7d157d,0xff920a67,0xffa8ac04,0x0038d275,0x00601bd8,0x005b1ab1,0xffe62af9,0xfff5e466,0x006f7332,0x0026da79,0x000c68f4,0xfffe408f, -0x00381278,0x003a9dcc,0xffdd2e9d,0xff825ad1,0xff594acf,0xff4f25fd,0xff4faa1f,0xffa58e8c,0x00422b25,0xff50ffc2,0x02f68a58,0x027fa260,0x0176fdea,0x003ef4f7,0xfec06674,0xfe09f262,0xfdefb854,0xfe2cbae8,0xfec9c118,0xff1c4e1c,0xff1418cf,0xff850eed,0xffb23d4f,0xffb5e2c9,0xffaafe25, -0xffb157a0,0xff8b1f6e,0xff9677ac,0xffa57307,0xffd630d2,0xffb5b8b0,0xffbc269e,0xffe60a48,0x00302e53,0x007002df,0x008537a2,0x00ae71f1,0x00d94252,0x00fdfc18,0x019564b4,0x01e6f230,0x020a7f54,0x01f0aa6c,0x0201dd14,0x0271c05c,0x0274e9e4,0x01a87cde,0x01995070,0x01189d28,0x00d4368f, -0x007f8ab2,0xffeb8091,0xff336f3b,0xfe68bad6,0xfe4d0d56,0xfe2a916a,0xfdfb7fc4,0xfe2792d4,0xfe4cb134,0xfe7544c4,0xfe89bb7c,0xfe9caaee,0xfeb036e8,0xfeea1bbe,0xff12bc07,0xff52f43a,0xffb98c07,0x000314fa,0x0047a5c1,0x006f0fa8,0x00936563,0x00c08468,0x00f64281,0x011cee8e,0x015afc9c, -0x016e6182,0x019fc740,0x01cd55fc,0x01db1122,0x01f0baaa,0x02095ae8,0x01e0b3b8,0x015b088e,0x00fb5f86,0x00e1d4b4,0x00c11ceb,0x00a4b4a9,0x0088dedf,0x00840044,0x00748062,0x0064cbc2,0x00476a25,0x002b56fd,0x000a23fc,0xffe4089b,0xffbd107e,0xffce01da,0xffdd335a,0xffe843f1,0xfff3bfad, -0x0001e0ac,0x000086c0,0x001b9a01,0x0008d179,0x0018246c,0x003e1b05,0x0058865f,0x0058520d,0x007b01f9,0x00a33413,0x00d937c0,0x00f407ee,0x01127744,0x01512746,0x013ffd7c,0x0145f8c0,0x01304660,0x010d6212,0x00ec6178,0x0099bc8d,0x00a62f9d,0x009cc06d,0x0095c288,0x00912331,0x00875e27, -0x007fa460,0x0071a942,0x0067b87f,0x005f00b5,0x005249b4,0x0048b196,0x0036b89b,0x00451666,0x004b8c7e,0x00546b39,0x005a3cdc,0x0062f942,0x006272f4,0x009d3ade,0x00c90a10,0x01132b88,0x009a2adc,0x00d4e80d,0x0126cba6,0x0135a506,0x013dbe2a,0x01439866,0x01548d44,0x0160c506,0x0171d148, -0x0122901c,0x00dc2de0,0x0168ac62,0x011da522,0x00a505b7,0x005c1f5f,0x005535fe,0x0051d2d0,0x004f99d4,0x0052adbb,0x004c4d3c,0x005e7f9e,0x005de320,0x0049bb4b,0x00583839,0x004febab,0x00329b04,0x0034d15d,0x00352d6f,0x0036edc4,0x004b4888,0x00544338,0x00563fda,0x005b79d6,0x006079f3, -0x006b55a2,0x00655a30,0x005febd9,0x005395ab,0x0052b4b4,0x004eac20,0x00483699,0x004c48c2,0x00509632,0x005e9159,0x004e8bd3,0x004ccd47,0x0056653c,0x004b6150,0x00514fba,0x00792852,0x005a2bda,0x0078b4e7,0x006fff26,0x005abb68,0x004790d9,0x00323f1a,0x005e111f,0x00676a54,0x003582d8, -0x0067f85f,0x0050dcba,0xfffbc6f2,0xfff6dcde,0xfff3c750,0x00039645,0x003fbb7e,0x005f4abc,0x006595c1,0x0074805a,0x0083bcf4,0x009db430,0x0093b35a,0x008ad838,0x006a6fd8,0x005f89e8,0x005627ac,0x004b2bb5,0x0056cd0b,0x00613a69,0x007a9e23,0x00639699,0x00577483,0x0063af15,0x003c2f33, -0x0059525f,0x00cce5e7,0x00926bc2,0x0076bac8,0x00558322,0x0058d6a2,0x006119ac,0x003687a7,0x008f16ee,0x008537d4,0x00242f8d,0x007e7c78,0x004b43bc,0xffba1981,0xffa1f7ff,0xff9ee715,0xffbbbb2e,0x0023b69b,0x00603eee,0x006a9c29,0x008877d2,0x00a9058b,0x00d7977c,0x00d1324d,0x00c0a8c9, -0x0077ba19,0x00703fd4,0x005a910c,0x003d4f58,0x0046ece6,0x005e8117,0x009f12c5,0x005b0520,0x005159ab,0x00827342,0x00313295,0x004f3090,0x01294a8a,0x00996a68,0x00ddb63a,0x00b08272,0x0087fc7d,0x00235499,0xffc42057,0x004b3249,0x007c888b,0xffea913d,0x008343ec,0x0049e99c,0xff5518b7, -0xff1fa569,0xfefcac54,0xff45aa81,0x000297b4,0x006d86b0,0x008d2e1f,0x00b5979f,0x00e64c0d,0x01277b62,0x01262fa6,0x0112642e,0x00b3a85d,0x00a1ed63,0x0082a1c3,0x0048845a,0x000d8e9d,0x00479409,0x00f19579,0x00725d60,0x00519ca5,0x00875939,0xffe63c45,0x00636eee,0x01ef5dec,0x0136ec5c, -0xff4fe6f9,0xffe52b17,0x0025d90f,0x01201bf4,0x027dd668,0x01468794,0x00963144,0x005394fc,0x00b84ea9,0x00854ca9,0xff7efede,0x006cf112,0x007fb710,0x00135209,0x0012786a,0x000ec28f,0x00288a10,0x002d9404,0x007245eb,0x00fbf49b,0x01080a90,0x00f4ea6d,0x00c47590,0x00be330f,0x00a8e345, -0x004bb86a,0x0057537f,0x00310b7f,0xffd511f5,0x000d12d5,0x00907722,0x0114e8ea,0x01224626,0x00725fb9,0xff3d0064,0xff185318,0x005f3aa0,0x0253b860,0x000bb147,0xfef3c3ba,0xfedf7acc,0xfe9a7328,0xff4a5a4e,0x00f899a3,0x0064ab3c,0x0055891d,0x00dd18d9,0x0096cd33,0x0051cc6a,0x00496b76, -0x0008755b,0xfff3a821,0xfff6d54f,0x003b3de4,0x0058c3f0,0x008ebb66,0x0060ab69,0x0068cedc,0x008eb6dc,0x006b03a8,0x00458ad7,0x004863a5,0x000d7533,0xffff7e4f,0x002b1d3a,0x0051cb25,0x001f58ea,0xffda3a82,0xffae100e,0xffb26ce9,0x0032a86b,0xffa6cb1d,0xffbc4a99,0xffb4a3b7,0xff95610f, -0xffdab91b,0x0002e62e,0x008fbf2c,0x0094e060,0x00b7b64c,0x007b7ce0,0x00450573,0x003cca39,0xff9418a1,0xff9ac7a9,0x00179235,0x0023e708,0x0040fd31,0x003d50ea,0x008efcad,0x009e6bba,0x00d6e726,0x0062f762,0x002eadb7,0x0080ce32,0x007d1684,0x00451686,0x0016b414,0x0043a3b6,0x001dc7cf, -0xfff258e4,0xffad9e74,0xffa4e801,0xffc631cc,0xff2d8fa1,0xff1c98fe,0xff3917c1,0xffae54a5,0xfefaa372,0x006c1fa7,0x007a78fc,0x000dfd6e,0xff7d00e7,0xff0b9d87,0xff002cd0,0xff57d18e,0xff6c8bf8,0xff914ddd,0x000a26e7,0xff952f7f,0xff90c407,0x001e4da1,0x003fb481,0x004b68e3,0x002c9f34, -0x0068897d,0x006c6762,0x0047d2ae,0x0065846e,0x006a81b0,0x00526c93,0x004d5f97,0x004c7cf8,0x004f6053,0x000937b0,0xfffb83cd,0x00318558,0x00209653,0xffec60be,0x00144886,0xffc1a7d3,0xff32c95b,0xfea4d53e,0xfe61dc1a,0xfd7a5aec,0xfbfad1a0,0xfc89b850,0xfd53214c,0xfe83f3c6,0xfedaaa52, -0xff311955,0xff8ee135,0xffd72768,0xffe34e23,0xff8e606e,0xffe25f99,0xffcea111,0xff9444e4,0xff9577c7,0xffb6619f,0xffdbfdf8,0x0047ecdd,0x0077ca79,0x0069c998,0x00189597,0x00164c8a,0x0060d704,0x0022c8c7,0x001c1de9,0x0027aee3,0x00481832,0x002c86eb,0xffbda004,0xff54bb90,0xff25f3d5, -0xff2f9e7d,0xfeb28d30,0xfed8a686,0xff791d7f,0xfe8b891a,0x01d07de0,0x01074a2e,0xffdc7839,0xff126dcd,0xfe516418,0xfe5e3182,0xfea279e8,0xfef40d8e,0xff4f1ff3,0xff6854df,0xff2ee4b6,0xff72faf9,0xff941270,0xffa6d665,0xffb1e33e,0xffcca731,0xffcbf5fe,0xffdb2b6b,0xffdb31dd,0xffddf903, -0xffdd87d8,0xfffbbb58,0x0036801f,0x0053fa9e,0x006b2411,0x0056a2a5,0x007f28f7,0x00b88673,0x00da8d51,0x014d5ec8,0x018b7a00,0x01a6d366,0x018f942a,0x017ce234,0x019acb46,0x01729974,0x018f163c,0x0162b610,0x00be87c9,0x0055d41e,0xffbd3543,0xff31f654,0xfe89fb4a,0xfdd9a85c,0xfdf9e6dc, -0xfe0f4a16,0xfe1dc6a8,0xfe39fce8,0xfe526f26,0xfe6ed51c,0xfe7fc284,0xfe8e4386,0xfe9fa220,0xfed57af4,0xff10446d,0xff4163e8,0xff815496,0xffdb59e2,0x0024ae83,0x0060ef13,0x00a18f03,0x00e1b7cd,0x0106b184,0x010fe9a8,0x013722a8,0x0148a228,0x0177cbe8,0x019e5694,0x01bb39d8,0x01e9953e, -0x021cc670,0x01cd4320,0x00d64846,0x00748f2e,0x0054c605,0x00332faf,0x001921b9,0xfffe4c79,0xfff14eb5,0xffd331b4,0xffcabf9e,0xffaf7346,0xff9b516d,0xff862d9f,0xff72926c,0xff591061,0xff80b0b5,0xffa3c2d4,0xffc24962,0xffde43c3,0xfff91412,0x00126a94,0x00216ca7,0x0004d724,0xffff46ee, -0x000dac1f,0x000bf3d9,0xfffcb59e,0x001c92bf,0x00421836,0x0072a498,0x008beda3,0x00a072be,0x00da6ab4,0x00bf0fc3,0x00be16e2,0x00aaa7bd,0x0085c994,0x0047b4b4,0x000b04f8,0x00126fec,0x0004fe6a,0xfff9f66a,0xffed1871,0xffdec11a,0xffd0cb62,0xffcb7dbc,0xffc70840,0xffc20fd3,0xffbadc88, -0xffb48127,0xffa53d70,0xffb8152d,0xffc2ef26,0xffd0ccfe,0xffdd1578,0xffe9c834,0xfff2f930,0x001e4e01,0x003ba3dd,0x0076b08a,0x0013042b,0x003f2dd9,0x00755ff1,0x0086300b,0x009028bc,0x0096d47a,0x00a67968,0x00b3bb9c,0x00c420a5,0x007588fd,0x003b781b,0x00b8dbdc,0x0072de08,0xffe947a6, -0x0059452a,0x0057e151,0x005053e0,0x0053f78d,0x00552f07,0x004f35b9,0x00586cb6,0x0055efc8,0x00479ba6,0x00517720,0x004afa56,0x00344a87,0x003655b5,0x0035f2cd,0x0035d89f,0x00485096,0x0050bcf3,0x0052d761,0x0057f38b,0x005d4df1,0x0066e364,0x00629322,0x005fbea9,0x00586144,0x004faa89, -0x004e9070,0x004f486d,0x00556c55,0x00586a01,0x005e5925,0x005647c8,0x00558045,0x0059132a,0x004cd3a6,0x004c34dc,0x007789ca,0x005d14ce,0x0085f637,0x0067a4e3,0x00610653,0x0051cc2c,0x0041fa32,0x00582b39,0x005d7d37,0x003ca933,0x005d4ba2,0x0048bf14,0x00017919,0xffffb277,0xfffcfe2a, -0x00065ff5,0x003be6b1,0x005780c5,0x005f28bf,0x007051b7,0x00806e77,0x009e7f85,0x0094c8b6,0x0081b622,0x00695525,0x005818e9,0x00517672,0x0049cd12,0x005cd811,0x00687323,0x00710808,0x006a2ca1,0x005afeb3,0x00588737,0x003af923,0x0055c2c5,0x00b71e9f,0x008d24de,0x008c63f6,0x00658c5e, -0x007261d8,0x007d17a3,0x00590773,0x0078d0ae,0x006466f7,0x00295402,0x0063365e,0x0037bb0e,0xffc7f18f,0xffbbf094,0xffb4548a,0xffc01655,0x001edfa6,0x00587e53,0x00624161,0x0082739a,0x009f8d79,0x00dd23a3,0x00c41ce2,0x00ad02c0,0x007327c7,0x0060fde0,0x0051eb00,0x0036f5cb,0x0057270e, -0x006834fc,0x008899c2,0x00699631,0x005f71d1,0x0071a469,0x002ea86f,0x0044089d,0x00fa9f23,0x0091eb93,0x00f6c057,0x00a7fbb2,0x00920619,0x00466e19,0x000628c3,0x003d7176,0x0065fde4,0x000f4776,0x0067817a,0x00346fa9,0xff66c9f5,0xff41dd83,0xff1d7fab,0xff504ade,0xfffc1d12,0x005a01a0, -0x007b54a3,0x00ac1aa5,0x00e5bbef,0x01486854,0x012874be,0x00f98eae,0x009dfaaf,0x008acc1f,0x007b99a9,0x003fc265,0x00216b63,0x0059c162,0x00e6cb57,0x008156fd,0x005ab26c,0x006c9cdb,0xffe455e3,0x00616eb9,0x01b2ed34,0x01337632,0xff7a7537,0x0003c77c,0x00753e11,0x015e6210,0x02986e28, -0x0120ecb4,0x004fe7c7,0x000d4a4b,0x0087c6a8,0x0064ed25,0xff594865,0x00c123cb,0x00e4fc78,0x00215cdd,0x0021759f,0x001d1ccb,0x004602ba,0x002e96bf,0x00451529,0x00c0571e,0x00bb5eaa,0x00a83634,0x00b0f8d3,0x00b78b3b,0x00b42cf6,0x0056b6b6,0x00530620,0x0028c9a9,0xffcc79a7,0x0024c9ad, -0x00be2c29,0x01324058,0x01114198,0x004797c3,0xfef99aa0,0xff152323,0x0093b3d7,0x015102b6,0xff71655c,0xfebea5b2,0xfeb59776,0xfef956d2,0xffa23a18,0x00aade6f,0x00624db0,0x0051e506,0x00607878,0x00994f76,0x007d3a49,0x0043b52d,0x002bf54a,0x001fdf66,0x000ae397,0x0061a16b,0x0074ed69, -0x008735d7,0x00960a97,0x0098090f,0x009eef7b,0x0071775a,0x003bc728,0x004874ba,0x001cfc3d,0x001b208f,0x004f2e9a,0x0056b9a1,0x0018bcf4,0xffca7ba4,0xff8f0e9e,0xffcc6c82,0x006a2a54,0x0023198f,0xffca9f65,0xffc37d7c,0xff845f7d,0xffb98a55,0xffd5d46f,0x004730c2,0x00744a02,0x00f4d494, -0x00bf0386,0x007dfe3f,0x00451196,0xffbf69b7,0xffbe34c5,0x0008d1a1,0x002f8558,0x005a7a61,0x005001bd,0x00ba2818,0x00afba1b,0x0076f134,0x005397c1,0x0036f8be,0x0068aef7,0x00845775,0x004676ab,0x0018ccbd,0x00483639,0x00285142,0xfff8c61b,0xffbbdbed,0xffbe12e2,0xfffc8b1a,0xff4379f7, -0xff4d7587,0xff8782a3,0xffb302ca,0xff83b865,0xffe5128c,0x002aadc3,0x00269813,0xffc84de4,0xffb48a76,0xff753ba5,0xff336d93,0xff54e0df,0xff85cfe5,0xfff9f43a,0xfffd60c1,0x000567fe,0x002899b0,0x007edcfa,0x008310c7,0x0059a346,0x009148a6,0x008e9767,0x004f3bbc,0x00895d28,0x009aa690, -0x0081e529,0x0076e087,0x005cfe74,0x0050d0d3,0x00160aa4,0x000e4931,0x0044a21a,0x003c3878,0x0012f82e,0x00594640,0xffbc60c8,0xff523b63,0xff28977e,0xff1de5de,0xfd8992e8,0xfd15f4cc,0xfe1d4dc0,0xfe603344,0xfe7d8748,0xfe9ef17a,0xfed66400,0xff332cc3,0xffe3adb7,0x0017f792,0xff970b88, -0xfff33cf6,0xffecf813,0xffa9309f,0xffcc7dbe,0xfff0de28,0x0028ff38,0x00635f92,0x007b9d03,0x005dc451,0x00448044,0x003c0c4f,0x005ed0b3,0x0031b208,0x00347333,0x00456468,0x003e9cd6,0x00074e9f,0xffa05a04,0xff45e4f4,0xff1b3bdd,0xff2ac8e9,0xfe89739e,0xfe84e020,0xfef00262,0xfe3b6fb0, -0x00632dc6,0xff89575b,0xfe9dab34,0xfe78a7c0,0xfea8c20c,0xff0ba4f4,0xff7dbb64,0xfff6f000,0xffb0f45c,0xff7c2607,0xff4509e8,0xff7852b9,0xff8bd32d,0xff826296,0xffaedecc,0xffd0adcc,0x00208124,0x00217c07,0x00161c13,0xffefb86f,0xffe89efb,0x0011329f,0x006570f1,0x00626c6f,0x006ba56a, -0x0065e30f,0x0078946c,0x009a6d27,0x00917b59,0x00c68bd3,0x00f0a0fa,0x010c6fc6,0x010f097c,0x00dbed07,0x0095ae9b,0x0059cf99,0x01261398,0x00d717c2,0x0034e2ef,0xffbd63bd,0xff0eaf08,0xfeacfbd0,0xfe3b7366,0xfdd05d00,0xfe230ec8,0xfe6ca2d4,0xfea537dc,0xfea10990,0xfea0df04,0xfe9b1326, -0xfeb7e400,0xfecbec9c,0xfee435e6,0xff1a4c35,0xff606a0c,0xff92bd33,0xffa5492b,0xffe23adb,0x00107185,0x00472835,0x008b7eea,0x00c27635,0x00eb7995,0x00f443b4,0x011e56a6,0x012258cc,0x01403782,0x0154a18a,0x01626d86,0x018f35f6,0x01b8f88a,0x015741ac,0x005c6854,0x0011b395,0xffeffa09, -0xffd48b4e,0xffbbb68e,0xffa4e696,0xff8e9502,0xff620378,0xff5a85df,0xff3d6992,0xff31b4ab,0xff27d81b,0xff25eb70,0xff1dc6ac,0xff43ed27,0xff65a76a,0xff82d22c,0xff9e2759,0xffb1ac00,0xffd0e85a,0x00011630,0xffe8e3b0,0xffea23cb,0xfff3febc,0xfff4695b,0xffeaa05c,0xfffcad1a,0x0010e73c, -0x002f80e7,0x003cff40,0x00479b10,0x006b56bf,0x00525399,0x00488fc4,0x003e299b,0x001e494d,0xffd4fe9d,0xffb5265e,0xffb4ed1e,0xffa54200,0xff990f46,0xff8669ab,0xff771566,0xff68d21a,0xff687367,0xff677bfe,0xff63ca62,0xff608d4e,0xff5bbb5a,0xff502999,0xff5fb313,0xff697ed9,0xff75f705, -0xff81ae94,0xff8ea5e7,0xff92369d,0xffba9d21,0xffcedf28,0xfffa6900,0xffbaaf3f,0xffdae013,0xfffa72db,0x0003b632,0x000a6aba,0x000c95fd,0x0016b374,0x001ebc79,0x00298cec,0xfff79006,0xffd42625,0x001f6dac,0xfff39f72,0xff7b440a,0x0053a850,0x00532095,0x004bcc5c,0x00533cb1,0x00538644, -0x004c089e,0x0051a84a,0x004ed10c,0x00440d9e,0x0049982d,0x004473fb,0x00336a3c,0x0036b08b,0x0036ed62,0x003779c7,0x00458ada,0x004c2d15,0x004cb795,0x0051a2b2,0x00564df1,0x005c551a,0x005aed24,0x005989ef,0x0056aaa5,0x004a0233,0x004938db,0x004b7871,0x0054cf35,0x00576ad2,0x0057a046, -0x005623c3,0x00551754,0x0051cbd7,0x0048e89c,0x0046c7f6,0x0069b185,0x0056830f,0x007b93e4,0x005c6eab,0x00624e0d,0x005892ad,0x0046938d,0x00501630,0x0051fea5,0x003e6c3d,0x00500e02,0x00410ae9,0x000c0d7e,0x000d4236,0x000d4aee,0x0014b9d5,0x003ca26a,0x004feaa6,0x00531338,0x0065b469, -0x00738434,0x008d1b1a,0x008aa06f,0x0074a437,0x0069706f,0x004edd6c,0x0048f751,0x0043a5f4,0x005f5e51,0x006ca194,0x00675090,0x006bb0d3,0x005a1968,0x0048e19b,0x00384aa6,0x004bba80,0x0092fb3b,0x0079b5a2,0x0080cb3a,0x005ef314,0x007b6541,0x008943db,0x005c3816,0x006b79cc,0x0059bc03, -0x002c51ac,0x004ca4a6,0x002c2bf0,0xffdd38ac,0xffdd3a81,0xffd5bfcd,0xffda8af1,0x0025086e,0x00531187,0x0052dcae,0x0076bf6e,0x008c2594,0x00c6919a,0x00ae6c6e,0x0095be6e,0x0077e209,0x005085ba,0x0045d7e3,0x002c082a,0x0063648c,0x0072ca31,0x00767519,0x0074d526,0x00674252,0x005733fe, -0x002c39b7,0x003a4c50,0x00c16b12,0x0078b504,0x00d2a5c9,0x0080cf30,0x008a5ac3,0x0060cc9e,0x001ffbe5,0x00345be7,0x005066a6,0x0021528d,0x004cf7ea,0x00308c49,0xff94bbc9,0xff768d91,0xff5a87e8,0xff7c8f3f,0x0003701d,0x004637de,0x00574cac,0x00947276,0x00cd9eb8,0x0133cb66,0x0117814e, -0x00dbe3a6,0x009db489,0x00774e11,0x006c8087,0x0029d27f,0x00332648,0x006b9bfe,0x00cf3b0c,0x0090721e,0x006183b7,0x004aac04,0xffedb42c,0x00546e7a,0x0151ea92,0x01004ff8,0xffc84153,0x004931cb,0x00c3d3f1,0x016796c0,0x025dbd88,0x010615fe,0x0057ca89,0x002e690e,0x0038aa5b,0x00237e55, -0xff8a6bd3,0x010b6b3a,0x013741a4,0x004bf148,0x004c327d,0x00416b00,0x005b83d3,0x003b48fd,0x002ddeb6,0x006dee88,0x0079bd23,0x00733181,0x00962e38,0x00a8c9e4,0x00b7ebe3,0x0069f10b,0x00499a60,0x001e9a78,0xffcd8938,0x004c292c,0x00ec1e94,0x012809ae,0x00da3a5a,0x0018fe4a,0xfee739f8, -0xff44f290,0x00c9cabe,0xfffa8ea9,0xff074398,0xfed3943e,0xfec37022,0xff28c832,0xff8a9c5a,0xffb5bc8f,0x0038c933,0x004af7e8,0xffd35070,0x00a20214,0x00abffc8,0x003c4dc5,0x0023218f,0x001aa1b5,0x001536b1,0x00833758,0x00920a07,0x006af77f,0x00a0284f,0x00a41028,0x00a0aa54,0x007e95a5, -0x004365ac,0x004b98bb,0x002468d6,0x0030e87f,0x006f1eed,0x005ac8e6,0x000f7fe6,0xffb1767b,0xffbed8b3,0x001c4330,0x00546e1f,0x00bc628c,0xffd05311,0xffc1830c,0xff9b0aa2,0xffb05921,0xffbe337f,0x001e181f,0x007835b1,0x010461a0,0x010363ae,0x00bef5f0,0x00520445,0x0029e8cf,0x00015f75, -0xffedcff3,0x00502f87,0x007af09f,0x004c8743,0x00c39b3a,0x00b74123,0x0041ed27,0x0037bba1,0x002c65c0,0x004afd03,0x007a73d7,0x003d2012,0x0023b15f,0x003e38db,0x00280030,0x00063c44,0xffcf9d72,0xffdebb02,0x002217e1,0xff4dbeaa,0xff813082,0xffe7033c,0xffc09f72,0xffcce696,0xff86fab7, -0x000b62b4,0x003f9f4c,0xfffbc0bf,0x00310106,0xffe24087,0xff2b2ca8,0xff4ff865,0xff6568b6,0xff927fad,0x000fef58,0x0031c9bf,0xfffea452,0x007ddf90,0x00944d02,0x007b1cf5,0x00982ce6,0x008adb11,0x0056c741,0x00993c1b,0x00a22977,0x00907e9c,0x0086644a,0x00610233,0x0053f688,0x001e6096, -0x001b6bb5,0x00482260,0x0043f2a9,0x001f312e,0x00658011,0xffbb75c5,0xff7de16d,0xff865b13,0xffb39235,0xfe2a79b2,0xfe91daa8,0xff3fb954,0xff21f113,0xfeb25336,0xfeb8bb00,0xfed5e4ae,0xff1acdb5,0xfff737b3,0x003a4d06,0xffd64b52,0xffef1042,0xffeab03b,0xffe8b259,0xffe6ca11,0x00029053, -0x004c45d1,0x0085436f,0x00827bea,0x003dfba6,0x005fd905,0x0057f6db,0x0065d48f,0x0042b19c,0x00405609,0x005635bf,0x00221c2d,0xffdd3a7e,0xff8e04b9,0xff53096b,0xff35248f,0xff354963,0xfec3e992,0xfe98c540,0xfe98e1a8,0xfe4d634c,0xff285688,0xfe8a8cec,0xfe1ccd94,0xfe722fe6,0xff26f686, -0xffbaca1f,0x0021cc03,0x00712c95,0xffa12484,0xff4d0f98,0xff7a3875,0xff8bf736,0xffa0ce07,0xffa8f625,0xffdbb64f,0x00045c5b,0x004a53ba,0x0059d817,0x004d255c,0x00098f76,0xfff3eb3b,0x000d8021,0x005be361,0x0050f85c,0x005f5075,0x0079b867,0x00890669,0x0082f668,0x0038e6ed,0x003a3782, -0x004b1b67,0x00537664,0x0091eda9,0x005cec41,0xffd2abce,0xff6f1b28,0x007f7008,0x001e18d6,0xffac1678,0xff4e485b,0xfec3e132,0xfe984cf2,0xfe68b8e6,0xfe4e6c3a,0xfea1617c,0xfee8071e,0xff186176,0xff03034e,0xfefc0f48,0xfee98652,0xff0b14bc,0xff225e8c,0xff3d84e3,0xff6b1c66,0xffa2b957, -0xffd4c922,0xffe0a01c,0xfffd5f60,0x0016b72c,0x00372826,0x0068e19e,0x00876db6,0x00b6c458,0x00c5b024,0x01038fd4,0x00ea5f94,0x00f1e995,0x00e8aa33,0x00da8c83,0x00f09def,0x0104000a,0x00a7646c,0x0014342c,0xffe54006,0xffc1ce57,0xffa80908,0xff8e2a85,0xff74932e,0xff531112,0xff1c30f9, -0xff106631,0xfef6aa5e,0xfeed12d6,0xfee8ed58,0xfee713be,0xfedf1f06,0xfefda1c8,0xff17ea69,0xff3096da,0xff463602,0xff549583,0xff6cad06,0xffab722d,0xffaa1620,0xffbcd1cf,0xffd17f8d,0xffe38657,0xffebc275,0xfff3d465,0xfffb11fc,0x000d8792,0x0011633e,0x001ac875,0x002eb244,0x001db790, -0x00100450,0x0009caf1,0xffef8ef1,0xff9b8555,0xff8e5760,0xff8689bd,0xff7639ef,0xff68bb6f,0xff551880,0xff47363b,0xff3a5200,0xff3b0ae6,0xff395671,0xff355096,0xff312497,0xff2d48c0,0xff24f408,0xff3223f6,0xff3a62cb,0xff44424e,0xff4e7b6e,0xff5b53b6,0xff5cc7fc,0xff7a1800,0xff8a0756, -0xffa991b1,0xff8a6d2f,0xffa11e69,0xffb9f920,0xffbc84c4,0xffc0861a,0xffbe88ac,0xffc66db9,0xffc9af22,0xffd16d2b,0xffb73928,0xffa3d94b,0xffc411d5,0xffaf1ac1,0xff47f579,0x004d8457,0x0049afad,0x0045a46b,0x004f133f,0x004e8c02,0x0043b143,0x0049cba7,0x0047d06d,0x004148ba,0x004245be, -0x003f21c8,0x0038d5df,0x0038f095,0x003956c4,0x003a8345,0x00437f5f,0x00476a97,0x004607f8,0x0049ae26,0x004cbaf0,0x004e916c,0x004f9e06,0x004fb5bd,0x0051fedb,0x0042b43a,0x0041ddc5,0x00440f64,0x0050b4a0,0x00531e73,0x004f5646,0x00517705,0x004f660f,0x0046b913,0x00428168,0x00402447, -0x00583084,0x004b368d,0x006d04a9,0x0052c625,0x005bb25d,0x00532ded,0x0039cd4c,0x0043b6de,0x0044621e,0x003e822b,0x0044ee15,0x00407d6e,0x00297eb3,0x0022eca4,0x0023c0b5,0x0028e234,0x0044b46b,0x004ea8ae,0x004981f1,0x005773aa,0x006023db,0x006ff4b8,0x0077ee41,0x00659f33,0x0066046b, -0x00454675,0x003fe598,0x003c8d4e,0x00610a47,0x006f06fa,0x005d7a4d,0x0066bf6d,0x0053f681,0x00376b7e,0x00336bb9,0x004037d6,0x006f5c44,0x00655d11,0x00691144,0x0051ee6c,0x007ccf6a,0x00812001,0x00420e12,0x0057e140,0x004b7073,0x00349517,0x003cd291,0x002b4dec,0x0015ab89,0x000870ab, -0x0003ad4e,0x0004cdfc,0x0035dfa8,0x00526ae2,0x004590d2,0x00644f94,0x006dc71f,0x009666d1,0x008ef822,0x007cbf1f,0x0079a871,0x00426b5c,0x003b5cb6,0x0022eb4f,0x006fc2e2,0x007eea46,0x0066affd,0x0076bc28,0x0064013a,0x003ca61d,0x00298aca,0x0030cbb9,0x0088758e,0x005c5b08,0x00b1c7fe, -0x006937b0,0x007e9eb8,0x005c0865,0x000102bf,0x001cfec8,0x002dc3f8,0x002bee43,0x003d671a,0x004a4b0a,0x00046489,0xffcdf9bd,0xffb9a20c,0xffc7c432,0x002b58ab,0x004a5645,0x003dbe26,0x0074e1ef,0x009f40f6,0x00ed9cd2,0x00eeb044,0x00ba1157,0x009dfe7f,0x0062fb4d,0x0057db7f,0x000d0083, -0x00458735,0x007fc3b8,0x00b20610,0x0093a2c3,0x005c45e3,0x002626d6,0xfff5596f,0x003f6b21,0x00f46a5d,0x00cde69c,0xffdf5751,0x005ec6b2,0x00eb1120,0x0159e9ec,0x01f50c5c,0x00f07c0c,0x0077bb51,0x0064b9ed,0xffef5dc8,0xffcf0241,0xffa58030,0x00fb60aa,0x012f5f78,0x0057a8f5,0x006092d7, -0x00622cc8,0x0072fbf1,0x004d9281,0x00261f7c,0x0029def9,0x00467dd8,0x00511461,0x0083e2c8,0x009a6d68,0x00b42f97,0x0085e847,0x003dfe7b,0x00118368,0xffd9374b,0x007e6671,0x0111f8d0,0x00fd81aa,0x009d827b,0xfffbf7a9,0xff09a7f6,0xff5b465e,0x0103e89a,0xfee656aa,0xff088f79,0xff1932f6, -0xfeef410c,0xff39738a,0xff320ef5,0xfeabd112,0x001e6aff,0x006ec530,0xffa94485,0x0079529e,0x009ab789,0x0076ddd6,0x0042b19f,0x0021555f,0x00157fbe,0x008bc386,0x009e576e,0x00494778,0x008898ce,0x00926a3e,0x0091d667,0x009764ef,0x00599a1e,0x004e5ca1,0x00251bc7,0x003ee603,0x00900940, -0x00599e40,0x00070048,0xffa93d04,0x0000ce36,0x0050cc19,0x001641c9,0x01485694,0xffc51fb6,0xffb8e1f0,0xffa6be13,0xffbb7e21,0xfff7e5c8,0x00052dc4,0x006c1d6d,0x00ecb2e0,0x00fc1f1e,0x00bde89c,0x004fa323,0x0060123f,0x0020b973,0xffed4318,0x00333c75,0x00620e4f,0x003ee569,0x00a57b8c, -0x009afd4e,0x00210abc,0x001da735,0x001180ce,0x002668ef,0x005c528f,0x002a6ef0,0x0033c9a0,0x00375dd6,0x00228ffe,0x00133124,0xffe18f3c,0xffff9f53,0x0034d2f9,0xff791426,0xffdb0d0f,0x0039829c,0xffcfca1a,0x00042ec8,0xffa2f02b,0x0005c36b,0x00338fe8,0x00447ced,0x006314fc,0x001b7120, -0xff68783b,0xff65be9a,0xff5f2125,0xff4695c3,0xffe77e1e,0x002e6e75,0x001d1597,0x00551aa0,0x006aa714,0x007d5b7f,0x0084c09a,0x0071d310,0x004a6490,0x008844d0,0x00865c73,0x007c3f7a,0x008548ca,0x005cba94,0x004b3948,0x001f9c80,0x0019eeda,0x003f520e,0x00375a3d,0x00150d15,0x0042a7a5, -0xffd24e2c,0xffbc40f9,0xffc0171f,0x0015d929,0xfec7222c,0xff7583d4,0xffb58227,0xff88f1f6,0xff1e8d3c,0xff09766f,0xff1b254f,0xff5c06fc,0xffdc258c,0xfffd84a3,0xffcd9944,0xfffee74d,0x00167882,0x0015b0c2,0x00261d70,0x0042d99b,0x006244c0,0x00826dc7,0x006d20ea,0x001e756a,0x00664e30, -0x00626691,0x0058faec,0x0044c84d,0x003ed307,0x005fcf6c,0x00051845,0xffbfe083,0xff8cc984,0xff7148b7,0xff5f5595,0xff454eba,0xff08ef0a,0xfec36976,0xfe659c1a,0xfe7d9f36,0xfe6d0164,0xfe2a0cc4,0xfe2710d4,0xfea35732,0xff596b18,0x00047905,0x0038d709,0x0008fa1a,0xff7b3c95,0xff5d0e6b, -0xffb964c6,0xffa57282,0xffbb2917,0xffe21e49,0xfffecbe4,0x002d722c,0x00459f9c,0x007679de,0x0070cc7e,0x00256047,0x00172ae8,0x00189e6f,0x0037d7dd,0x0035e991,0x00473d7b,0x006e1575,0x007c6087,0x005d78f8,0xfff1e657,0xffd0479b,0xffc62667,0xffbb2fa9,0x001b5205,0xfff56548,0xff678ef0, -0xfede4c88,0xffe218c0,0xff8b8c45,0xff5a4068,0xff304ca0,0xfeeef5cc,0xfeec65f8,0xfef51b10,0xff1145e8,0xff3b3c64,0xff50abbf,0xff609a12,0xff52b76d,0xff512f79,0xff465ada,0xff64c75b,0xff7d4038,0xff94d651,0xffa4136c,0xffb82e6a,0xffd4bf62,0xffecbf62,0xfffd1497,0x000fef9d,0x0025cf57, -0x0047b864,0x00598af5,0x0080a277,0x008ca929,0x00cff316,0x009e3d12,0x008fd7ef,0x006895ca,0x004a6b86,0x0048fe3b,0x004b6dee,0x00021c31,0xfff101fc,0xffcb29a5,0xffab8b70,0xff9082e0,0xff75d736,0xff59d420,0xff33c3a9,0xff0455a8,0xfef8a5b0,0xfeee3974,0xfee6f2ac,0xfee4cf06,0xfeddec04, -0xfecddca8,0xfee80660,0xfefbe19a,0xff14098c,0xff296bab,0xff3f076b,0xff50e963,0xff6c89ff,0xff86e872,0xff9ef005,0xffb95e7f,0xffd06a21,0xffe5d4b3,0xffeb3061,0xffeea5be,0xfffb9b2e,0xfffe61ee,0x000bed27,0x001cc149,0x000f9326,0x0000fdfb,0xfff88c7f,0xffe01570,0xff7fb67e,0xff7a4c22, -0xff705af3,0xff6285f8,0xff56742a,0xff478cae,0xff3d3113,0xff30f25e,0xff336c02,0xff3065d0,0xff2d010a,0xff281134,0xff25e503,0xff20d27a,0xff2d5d16,0xff3575e2,0xff3db474,0xff46cf49,0xff50e969,0xff59a523,0xff602c44,0xff69d5fe,0xff7aa26c,0xff75a029,0xff813525,0xff94e9d9,0xff95b60e, -0xff99e005,0xff97cf98,0xff9fb30b,0xffa1158e,0xffa8572e,0xff978f12,0xff8bca1c,0xff983cc8,0xff8c7388,0xff32d305,0x0045c9b6,0x0041c7db,0x003bf2a8,0x00483e17,0x0046533e,0x0038f2b1,0x003f195c,0x003eb692,0x003d2969,0x003a5a31,0x003967f4,0x003d666c,0x0039ad87,0x003a2663,0x003becf5, -0x00404d4c,0x0041691c,0x003f5102,0x003fb451,0x00410410,0x003ebe75,0x0045e23a,0x0048c631,0x004f6619,0x003cecef,0x003ea4e7,0x0040dbd4,0x0050ad2c,0x0052c7ce,0x004b160f,0x004ea310,0x004b6038,0x00405c02,0x003eb88d,0x0039ddeb,0x004af61b,0x004379e4,0x005b59bb,0x003e33fa,0x004aaf11, -0x00452b61,0x00286b9a,0x00337f7e,0x003597e4,0x003d6727,0x003b7f56,0x0040845b,0x00459d47,0x003583cb,0x0035698d,0x003878c8,0x0048836d,0x004bcf5c,0x00440e4f,0x00466ca0,0x00485e58,0x005006f0,0x00649b05,0x00574051,0x0060f12e,0x003dc675,0x0039bf35,0x00386659,0x00625512,0x007008af, -0x0055e474,0x005d569f,0x004ad96a,0x002b6d75,0x002faf99,0x0038324b,0x0053946b,0x004e9837,0x004f3994,0x004257ce,0x007300a7,0x006d5c99,0x0022246b,0x0039a8ef,0x0038fb1e,0x003cd4b6,0x002f1176,0x002b2a6c,0x004aa53a,0x002b5cee,0x002c29c0,0x002d06ed,0x00475b9e,0x00516c3d,0x0040aac9, -0x004b0ad0,0x00484dad,0x005ec2c8,0x006cc67f,0x00657a78,0x0078c234,0x00393d51,0x00367823,0x0022079e,0x007e3cab,0x008a1014,0x005db23a,0x00710ecc,0x005b6b1a,0x002d0616,0x0026a0c7,0x002503f7,0x0056503f,0x003e2dd1,0x007d600f,0x003fe5cb,0x00560f91,0x003f0e67,0xffdb173f,0xfff9b41d, -0x000d2702,0x00370d1f,0x00341e47,0x00608955,0x006f2e15,0x001f53c7,0x000dce94,0x000d9399,0x004cd507,0x0053c0b3,0x003b3e55,0x004c4ec8,0x005d4158,0x00900be9,0x00b6add2,0x00976fb1,0x00a3b3c0,0x00549ff3,0x0042a3cf,0xfff7263e,0x005a7c41,0x00939c80,0x0092096d,0x00885df2,0x004e0f98, -0x0009a5b4,0xfffcd781,0x002e145d,0x00a3d03a,0x0090cb2c,0xffcc757d,0x00640bde,0x0105a86a,0x01404df4,0x01803600,0x00d10cbb,0x008703b5,0x00888d11,0xffc1acc8,0xff876e91,0xff83ba8a,0x0097ea66,0x00ed8fc5,0x006ca60b,0x0064f8ca,0x0065e378,0x0079952e,0x00599f08,0x002c33e8,0x0006b197, -0x001faaa1,0x0034b667,0x00767dea,0x008876dc,0x00a7159a,0x00a24908,0x0033b2a2,0x0005a325,0xfff3a1d9,0x00aecb3b,0x0123487e,0x00c398d5,0x006af0b5,0xffdce4c7,0xff11a370,0xff441fe2,0x01301e6a,0xfe3b0924,0xff0cf8b5,0xff492455,0xff3131fb,0xff5a97a1,0xff17f871,0xfe50fe30,0x0029f50f, -0x009e6038,0xffa0f4b1,0x00549d54,0x0081f161,0x00915f01,0x006b263e,0x005068d8,0x0037a051,0x008df434,0x009cb4be,0x003e23ee,0x006eec60,0x007a824b,0x00794e60,0x00ae7299,0x00718eca,0x004f98c6,0x002e522a,0x0050a0de,0x00a6845c,0x0057450e,0x0008fa14,0xffb34d76,0x00288985,0x0070aad8, -0xffff9a68,0x01acfac8,0xff9d0563,0xff989ce7,0xffce571b,0xfffc2914,0x005bfd5e,0x00024afd,0x0050cf2c,0x00c443c1,0x00d6f323,0x00b2b64b,0x004616b1,0x00790147,0x00378636,0xfff7cd2c,0xfffd3f4b,0x002847ad,0x00315bb4,0x006bf746,0x005c1c65,0xfffdefba,0x0001a1e3,0xffefe29a,0xfffa4015, -0x0035abe8,0x0017a27b,0x003b81ce,0x0036d017,0x001f5874,0x00203ff9,0xfff6d030,0x001fe170,0x00473bb8,0xffdee902,0x0031da3a,0x0047c8b4,0xffb7467d,0x003f3d79,0x000f0371,0x0015e403,0x0026d485,0x008f3818,0x00658ee5,0x001bec0e,0xffa2ca3c,0xff754fc9,0xff6365d1,0xff152e75,0xffd179f7, -0x002bfdf8,0x002f9793,0x003fea9e,0x004d5861,0x0060ba35,0x00633674,0x0053f50f,0x00362f18,0x005df63e,0x0058382c,0x005111e0,0x0076ef66,0x005540e1,0x003af00a,0x001db3be,0x00144ff7,0x0032a60a,0x001f508e,0x00013112,0x0005bb1f,0xffe4f133,0xffeff9d1,0xffeced55,0x004eddab,0xff19295e, -0xffa38583,0xffd2c963,0xffc66677,0xff89fbe3,0xff5c495b,0xff70fa44,0xffaeec6b,0xffb6b220,0xffb18b14,0xff9feece,0xffef6e22,0x001d1c5a,0x0019e7db,0x00505ed1,0x0077530a,0x008d7c2f,0x006d7ff8,0x004d3719,0x001cc0fd,0x0061ec0e,0x005e5bc0,0x00352777,0x003c5222,0x0037edc1,0x005b8be7, -0xfff24761,0xffb4c571,0xffa1734c,0xff9a9e7d,0xff8b9d4d,0xff5828ca,0xff26436f,0xfed1ed2a,0xfe4e55c8,0xfea89a30,0xfe4a0d48,0xfe45ac40,0xfe7a7fa6,0xfed99332,0xff525011,0xffc30e17,0xffba5b36,0xff4cfa24,0xff7805ca,0xffab3928,0xffe51661,0xffc55c89,0xffcd7b11,0xfff58aaf,0x000dff1e, -0x00333d5b,0x00488477,0x006c5124,0x006dd852,0x0038f6b6,0x003bb9bc,0x00318b71,0x00216668,0x00235cf0,0x002ea521,0x00562966,0x0047f699,0x0020ef45,0xffc40fa4,0xff8b4cec,0xff70e513,0xff65555c,0xffb76ae1,0xffa6b096,0xff526167,0xfebdaa82,0xff6df553,0xff245828,0xff2300b4,0xff2c4c42, -0xff2d9cdc,0xff5175e6,0xff8c0470,0xffc8dbac,0xffc13352,0xffa78a43,0xff9d4765,0xffa22b87,0xffaad070,0xffabaa26,0xffc94678,0xffe308c6,0xfff94390,0xffe32a87,0xffd13336,0xffbf773a,0xffd56f1b,0xffe4efc7,0xfff8b5ef,0x0012a080,0x002d75c7,0x00442a0e,0x0057005b,0x005af6de,0x008d81f3, -0x005253e1,0x00355f33,0xfffd0b73,0xffd99553,0xffc3be42,0xffb5ce82,0xff7fc7de,0xffda4b43,0xffb722f9,0xff9cff87,0xff815292,0xff64866a,0xff47e9d9,0xff203b9d,0xfeffa608,0xff01e7a8,0xff0fb655,0xff1438f9,0xff18fc26,0xff176cb4,0xff0da144,0xff2037fe,0xff2e2075,0xff44eb4f,0xff58283a, -0xff72e992,0xff84332b,0xff7bc84d,0xffa12723,0xffb1ff31,0xffc43331,0xffd4ccf2,0xffeef309,0xfff0a0bb,0xfff0df9a,0xfff66e36,0xfffa00b7,0x00060afb,0x00174d32,0x00071aef,0xfffa0524,0xfff167ec,0xffd91a59,0xff798189,0xff7fe51f,0xff75dd39,0xff6baf09,0xff635f50,0xff5a0795,0xff539a46, -0xff465b11,0xff4d2beb,0xff4b3870,0xff4ae85e,0xff497bae,0xff4adae5,0xff4b4bbb,0xff5435b3,0xff5a1c1b,0xff5e9e8c,0xff65f56d,0xff6b4a76,0xff792132,0xff6a92cd,0xff69bb97,0xff65ce8b,0xff80dc31,0xff7c295a,0xff7d865c,0xff7fa64b,0xff856fb2,0xff85dd20,0xff8d3e00,0xff8e40ae,0xff93d7d2, -0xff8b3855,0xff8a5b44,0xff7f9be0,0xff7df7a1,0xff4acc4d,0x003c1e43,0x0037f949,0x003245f6,0x003d2a1c,0x003a21b4,0x002bcd62,0x003261c4,0x0033a9bc,0x003715fa,0x003251fd,0x00328d62,0x003b1b09,0x00345f9a,0x003528f2,0x0038797b,0x003a2282,0x0039e549,0x00387cf7,0x00356da0,0x00351da0, -0x0031bbaa,0x003a6ba9,0x003df0dd,0x0047be37,0x0034b8b1,0x00388b07,0x003b2f85,0x004c4d8e,0x004e2df0,0x0043f4c9,0x0046b401,0x0042a8a5,0x0038856e,0x00383b77,0x00338ed5,0x003dd9fc,0x00390933,0x003dfdfe,0x0027ca7a,0x0037c70d,0x0033d41a,0x0014321c,0x001f38fe,0x0024cdee,0x0039390c, -0x0033756a,0x003c2c10,0x004fdde5,0x003773e5,0x00355afe,0x003ac735,0x004292ba,0x00437f7b,0x003df26b,0x003599ca,0x003325d5,0x0035e0a9,0x004d2b26,0x0048258a,0x0055a8df,0x00361031,0x0034361f,0x003603cf,0x006071cc,0x006bfc30,0x004d7691,0x00519530,0x0041e9ea,0x0025b6dc,0x002de920, -0x00327967,0x003f28af,0x0037bfd5,0x00363d3c,0x003114a6,0x005bc956,0x004af806,0xfffe8547,0x0019334e,0x0022bf29,0x0040daaf,0x00296449,0x002bf8e9,0x0063a926,0x003187e5,0x003764ba,0x003fc5f1,0x004dd874,0x004d8ce7,0x00412b95,0x0034e249,0x002b2a54,0x003392f8,0x004bd751,0x00500fa3, -0x006d8578,0x0032271b,0x00353efe,0x0029532c,0x00877f41,0x0090cbdb,0x00599b91,0x006986f4,0x00528ea3,0x00287248,0x0029adfb,0x002200ea,0x00376687,0x0027909f,0x0035bdc8,0x001161f4,0x0029601e,0x0018a5ff,0xffafbbfc,0xffcb8534,0xffe83f96,0x003c4f23,0x00329218,0x00675225,0x00a9fad0, -0x00406d55,0x002714dc,0x0028a61e,0x004ea362,0x0051725c,0x003bdba0,0x0026d98c,0x0022dd96,0x003df25e,0x00777d7d,0x0077deb2,0x00aa9c33,0x004f9cad,0x00335fc5,0xfff33c05,0x006e735c,0x00a25809,0x00719cbc,0x007614ef,0x0043155c,0x0000657f,0x000c998c,0x0028b120,0x006e4fcd,0x00555417, -0xffdecd97,0x008b515d,0x010263c6,0x010405a4,0x011bfe3e,0x00d26aa6,0x00aab377,0x009c7a06,0xffbaed95,0xff6568b3,0xff5af8a3,0x00289324,0x00a800b4,0x00af6145,0x007dd420,0x006c8dd8,0x007cc997,0x00615447,0x00412bb4,0x00087064,0x000ad4c1,0x0023a79c,0x0064ee33,0x006fb8eb,0x00914307, -0x00b52a70,0x002e500f,0x0000fb1b,0x001b661e,0x00d6692a,0x01210c5a,0x00830738,0x004c0cf1,0xffccf10b,0xff05e259,0xff48cd8a,0x0118c124,0xfddd93dc,0xff2e3bf3,0xff8e6213,0xff771b15,0xff6ff6b7,0xff3c6a74,0xfec049de,0x0055916c,0x00c072c4,0xffbdc7ed,0x005019f4,0x00740a14,0x0089de95, -0x0078e5f9,0x006b9968,0x006ccaad,0x008b30c7,0x008bc2bb,0x0044768e,0x005f84c4,0x00622d9d,0x005a5aaf,0x00b5f2c6,0x0084f37d,0x0051e8cb,0x00439218,0x00681fc4,0x00ae0112,0x004d1e1d,0x000f1c6a,0xffdbf161,0x00458ea2,0x00857887,0xfff60f79,0x01c06658,0xff71992c,0xff75d59c,0x001d2584, -0x005423a4,0x00ab1615,0x001b5a2e,0x003cb1e4,0x007dbe66,0x00be8d7f,0x00c53f70,0x0046b8a5,0x00913dcf,0x0041ea14,0xffd3a477,0xffd61b42,0xfffcbf96,0x00373bd1,0x003a190d,0x00233b23,0xffe35841,0xffead04f,0xffd65985,0xffd09a70,0x000b5f00,0x000a71db,0x003ffa0f,0x003729b1,0x002122d0, -0x002a7dce,0x00143855,0x003630a5,0x003aeac0,0x00296b6d,0x0059e30e,0x0024f236,0xff9088b0,0x00779e29,0x0075816c,0x0039b9bf,0x00374242,0x00ae41cc,0x0059a77a,0x000d2268,0xffc46034,0xff96e692,0xff7dc130,0xff13fd77,0xffb9ea32,0x001458af,0x0026abc9,0x0024705b,0x003e0d9c,0x0061372c, -0x0055719b,0x00488690,0x002c9ef5,0x0033cc95,0x0030f39e,0x002c1924,0x0061a7d7,0x004b3ff1,0x002d11d5,0x001ed09d,0x0015799f,0x002645e7,0x000bd3a1,0xfff32e09,0xffd7951d,0xffee744f,0x000b2ff8,0x00055631,0x00675fbc,0xff318396,0xff7cdc7c,0xffcb7bfa,0xffe03844,0xffb7fe37,0xff9c3405, -0xffb0c53e,0xffeac680,0xff97b10c,0xff877fb7,0xffaa95b2,0xffd2b1d5,0xfff25cb4,0x000ed2eb,0x004871c0,0x00668abe,0x00841593,0x003c3bb3,0x00229d1c,0x00278c8b,0x004edfe9,0x0044c8a3,0x000ecd55,0x002ff5dd,0x002daf42,0x0043fd2d,0xffea4066,0xffba40b0,0xffc21fad,0xffc0f15f,0xffa8178d, -0xff61cf8c,0xff17788d,0xfebacc22,0xfe4461cc,0xfec8a094,0xfe8aeac0,0xfea3ad44,0xfee0b93c,0xff0a704f,0xff44c529,0xff3d8f3c,0xff1c178e,0xfef61128,0xff7d648b,0xffca3b51,0xffcd02ed,0xffccef6e,0xffda4c03,0xfff5bb18,0x002109a0,0x00394aad,0x00694655,0x00599760,0x00582b66,0x0047c84d, -0x005149b0,0x004867f9,0x001ca72d,0x001f97c8,0x001dc3ab,0x003e9b5e,0x00043a63,0xffd8cb61,0xff9ffe67,0xff62e5fb,0xff457ce5,0xff3e7d47,0xff7ac76b,0xff859a2f,0xff798436,0xfeed5edc,0xff0bc5e6,0xfecca3a4,0xfeee6b94,0xff1a0845,0xff4b7276,0xff8d9660,0xffe0dfac,0x0024bcc0,0x0006c7cf, -0xffe5fd6d,0xffd6a137,0xffe96004,0xfff810bb,0x000395c5,0x00206ba3,0x003a3763,0x005862ba,0x002bbc30,0x000bec32,0xffd9402b,0xffd4e4b3,0xffe1e8ff,0xffed0e4c,0x000b93ac,0x0022e5e7,0x00438b3f,0x00404df6,0x00386f9a,0x004eac6d,0x0016259d,0xfff40fd4,0xffbbae1a,0xff8dcb98,0xff608d47, -0xff3da319,0xff150dac,0xffc4a366,0xffa30408,0xff93f720,0xff7fb48d,0xff66dc32,0xff505c08,0xff3129bb,0xff227f79,0xff31d69b,0xff4b6447,0xff59c50d,0xff64acdd,0xff6ba91d,0xff6d8a27,0xff74e44d,0xff7afc4a,0xff889fb6,0xff943936,0xffa7d727,0xffb64e1e,0xffaaf96f,0xffce7713,0xffdb35e1, -0xffe494c5,0xfff14f61,0x000d62cf,0x000521b5,0xfffe0ad3,0xfff7d4c6,0xfff7dbe9,0xfffbbef8,0x00065c34,0xfff42d6a,0xffea6943,0xffe4c0f2,0xffce3817,0xff917771,0xff9fa2cc,0xff98f51b,0xff9389ed,0xff90e05b,0xff8d6341,0xff8b91ca,0xff813320,0xff895da6,0xff89c65f,0xff8c4132,0xff8eac71, -0xff92b225,0xff98140e,0xff9ab32f,0xff9c592c,0xff9c0a10,0xffa00e12,0xffa09c27,0xffaa7250,0xff9635b0,0xff8d6e42,0xff795eac,0xffae9f75,0xff9e6920,0xff8d81e6,0xff8eaa42,0xff93f341,0xff94f15c,0xff98b394,0xff978150,0xff9801f2,0xff9b72f1,0xffa513fd,0xff833a43,0xff8d75e1,0xff93ffd6, -0x00310bc3,0x002e63a3,0x002b8eb6,0x00307f97,0x002c2faf,0x001df2f2,0x0024b71e,0x0026d85c,0x002d00bd,0x00289d52,0x0029e34e,0x0035a256,0x0028d082,0x00289de1,0x002c97ff,0x002f245a,0x002fa0a4,0x002ffe2e,0x002ba081,0x002ab09d,0x0027da85,0x002efcf8,0x0031b0e1,0x003c954a,0x002a4e84, -0x00312b1d,0x0036046f,0x0045c6a0,0x004763ab,0x003cb8d8,0x003e110b,0x0039fb5d,0x00319ee5,0x0031aac1,0x002cec6c,0x003435f1,0x002f194b,0x0026c423,0x001f380c,0x002955ab,0x00237115,0x00028b0f,0x000b70cc,0x001395a5,0x002f6ede,0x002ad35c,0x00336233,0x004f06dc,0x00259a31,0x001da754, -0x00275ff7,0x002fd049,0x00354808,0x00351f0d,0x0029ceae,0x00260e88,0x0025c90e,0x00387cc2,0x0037d756,0x0041bfa2,0x002d0a9a,0x002f578d,0x0035527b,0x005bcf49,0x00640c07,0x004522fb,0x0046593f,0x003a16bd,0x00231099,0x002cbeb3,0x002f3945,0x0031c92f,0x0028a24c,0x0029ea36,0x002f0672, -0x00470ed7,0x0029bd7c,0xffdd4229,0xfffbaf95,0x000857e9,0x003686de,0x002186b0,0x002755f6,0x006b6af7,0x001932d6,0x001a9d53,0x002bb2ae,0x003d5f44,0x003fe6e5,0x003dec87,0x0028b8f2,0x001d8448,0x001e67aa,0x003426fa,0x003bf2d2,0x00513bbc,0x0029c3b3,0x003681c0,0x00368020,0x008b7e66, -0x0094af16,0x0059e684,0x00654069,0x004e2688,0x002a7912,0x0032faa9,0x0028156b,0x00299f8e,0x002095a9,0x000a5ca6,0x0008cde5,0x001a71b1,0x00015a6a,0xff8e8929,0xffa11fc6,0xffc49b07,0x00347c60,0x002fd28e,0x005dc3ea,0x00bd2338,0x0026d216,0xfff6959b,0x00017d48,0x00261454,0x003d1eda, -0x003648d7,0x0015124b,0x00060c71,0x000daddd,0x00429b62,0x0058a4c9,0x009b5c3c,0x004cacbb,0x002e8b7a,0x0002fedc,0x007f6923,0x00aba155,0x005a8028,0x0064db50,0x004022f1,0x0006a7b2,0x001dd25b,0x002aaeee,0x004f1bae,0x00319515,0x001f1c6d,0x00abd695,0x00c3caa0,0x00a6318d,0x00cbfb4f, -0x00e05e07,0x00cfdb47,0x008a8b1e,0xffcae47b,0xff644397,0xff50ce9b,0xffc4e3b5,0x005aa6bf,0x00fbc737,0x00a0a67f,0x007e7c7e,0x00824e83,0x006b82c7,0x0059dfb6,0x00263c33,0x0013e7f3,0x00237de8,0x00504921,0x00550118,0x007743f3,0x00b87d01,0x002d2da0,0x0007b8bf,0x004d6487,0x00f48e40, -0x0110522a,0x005131b8,0x00428219,0xffd9bf3b,0xff1b9149,0xff8e16bb,0x009af873,0xfdd984fc,0xff8dd4c7,0xfff17086,0xff998af2,0xff812d9a,0xff6b9d69,0xff365b00,0x00757224,0x00cda66a,0xfff01030,0x0042950c,0x006096ae,0x00885368,0x008a439e,0x0084348c,0x008a7cd3,0x007547d0,0x00689caf, -0x00437bdb,0x004c4aed,0x0048b841,0x00425aa9,0x00ac430c,0x008f64af,0x00526bd3,0x005bf8e2,0x007e80b5,0x00aaa64a,0x00354e93,0x0013d841,0x00199fd1,0x005de99e,0x00810b71,0xfff300c4,0x0158e2ea,0xff7cdd65,0xff82dc7a,0x0064e460,0x0097e3e3,0x00bb6a44,0x0028f50e,0x00185ce1,0x001f2d82, -0x008d1527,0x00b8c827,0x005b982f,0x00879342,0x003c663d,0xffdabdff,0xffb713a5,0xffddff0a,0x005a318d,0x001c516c,0xfff8b6b7,0xffd1d3e8,0xffda1951,0xffcc0554,0xffbfa9a5,0xffe6b1aa,0x0005c999,0x004a4e4b,0x0037aa6d,0x0024cefb,0x002f8f3a,0x002af08f,0x003d0d2e,0x001a84ee,0x00522822, -0x00773700,0x00192b7e,0xffa040ec,0x0088d056,0x009c106f,0x00612997,0x0056e40d,0x00828a0b,0x004f8538,0x0023b348,0xfff1c7e4,0xffcd3288,0xffb03333,0xff56ebc2,0xffb1da34,0xffef9e2a,0x0018022b,0xfffdff14,0x001b44f2,0x0061f00f,0x00500518,0x004bcd66,0x003281be,0x0019d2dd,0x001315cd, -0x001884f1,0x0045e7da,0x003aabe8,0x00249824,0x00265bdc,0x001dc4cf,0x001cc042,0x0009b646,0xfff8bd0d,0xffc9eedb,0xffee42b5,0x0006d6ec,0xfff743c3,0x005b5d6e,0xff2a291b,0xff69482d,0xffa171c9,0xffca9da0,0xffdf010a,0xffd1f64e,0xffd4d359,0xffe9ffa8,0xff67dc99,0xff621a29,0xffb8f8aa, -0xffc39a76,0xffdf5c4c,0xfffcace1,0x003bc185,0x004f7c1e,0x0053b816,0x000d8dc0,0xfffdda71,0x00237fe4,0x002a48ee,0x002268de,0x0002bb68,0x0025ba5e,0x001e4ee3,0x001d600c,0xffe899bd,0xffcbe904,0xffdd6d28,0xffd68340,0xffad0ee4,0xff5cccb8,0xfefa2454,0xfea03950,0xfe55fa60,0xfed5fd0c, -0xfeeeb776,0xff049fcd,0xff2d41e9,0xff27bde3,0xff254813,0xfeda5360,0xfed00880,0xff129d64,0xff6b95cf,0xffa45db4,0xffa9fdb5,0xffc7fa87,0xffe2444a,0xfff14c54,0x0023cd7e,0x003c1504,0x00732496,0x00435dc6,0x003cb264,0x004e56b0,0x00537681,0x004b9b58,0x001fec13,0x00236041,0x0014daf5, -0x0021d3d9,0xffc6ca03,0xff96202a,0xff7c1ba4,0xff4c7a25,0xff33aedf,0xff2caf92,0xff59308a,0xff7d78fa,0xffa7ec63,0xff37fcfd,0xfecfddc8,0xfea82c6c,0xfed7f370,0xff068615,0xff4458be,0xff926302,0xffe02d31,0x001ec964,0x00094afd,0xfffbcfc9,0xfff2358b,0x000f92d2,0x00248069,0x0039301c, -0x00535270,0x0069e60b,0x00888f83,0x0060406e,0x0048f818,0x001ca9eb,0xffffd19a,0xfffd4e1e,0xfff48ad4,0x000d6477,0x00212aef,0x0040e0ef,0x0032ef64,0x001aeae2,0x001ce7d7,0xffec7228,0xffd0d468,0xffa3315b,0xff69e553,0xff29a297,0xfef596ec,0xfed9df9c,0xffac2c70,0xff916b78,0xff902655, -0xff89aef6,0xff7db574,0xff7394c4,0xff66ead8,0xff699db4,0xff7b51c2,0xff925215,0xffa293d8,0xffae7a9c,0xffb8de41,0xffc251fb,0xffbd330f,0xffb9d28f,0xffbb527b,0xffbe0256,0xffc52093,0xffca3ce8,0xffc67db5,0xffe7656d,0xfff52e36,0xfffe6541,0x000b0677,0x00249252,0x00120987,0x0005918d, -0xfff8bcff,0xfff19f8d,0xffedc33d,0xffef8ed2,0xffdf5ef2,0xffd89723,0xffd1be10,0xffbfd5e0,0xffb99cf8,0xffc374e8,0xffc2d04a,0xffc2c7e4,0xffc55b9e,0xffc6f8f4,0xffc8dba8,0xffc4be57,0xffcad394,0xffcd0e0f,0xffd0cc40,0xffd4a1da,0xffd8d9f5,0xffdfaa4e,0xffde0f95,0xffdd7a8b,0xffdab749, -0xffdb19a3,0xffd90da4,0xffdc93f9,0xffcd4603,0xffc555e2,0xffb2504f,0xffe3df38,0xffd5cb5f,0xffc8888d,0xffc5fad3,0xffc7cc96,0xffc57203,0xffc4999d,0xffbf5d23,0xffba213b,0xffc17464,0xffcb150e,0xffa74327,0xffb31aad,0xffe17149,0x00250688,0x00285032,0x0026e73d,0x0024036b,0x001dfb6a, -0x0011e5b9,0x0017b05b,0x001a7d6a,0x0022ac57,0x001ea4ca,0x001fb652,0x002c0b25,0x0019024d,0x0016b7db,0x00190273,0x001f816a,0x00225e83,0x0025a7b7,0x00222839,0x0021a1a4,0x001ea487,0x0025dcd0,0x002752d8,0x002f2699,0x00200248,0x002a244e,0x003230e7,0x003f2c82,0x004079e8,0x00364ea6, -0x0036bf84,0x00332351,0x002c0124,0x002c0712,0x00265df5,0x002c30f9,0x0028b13a,0x001d78ae,0x001fe955,0x001b62e9,0x0011a0ef,0xfff4f402,0xfff907f9,0x00044b49,0x0024525d,0x0022e190,0x0028184f,0x0043eeb7,0x000a2ee0,0xfffa1b37,0x000342d5,0x00124a87,0x0020d586,0x002ab873,0x0023da46, -0x0020b660,0x001cb3d5,0x002a6008,0x002774f7,0x0028d29e,0x0021857d,0x0029c9bc,0x00365c91,0x0055f039,0x005bb648,0x003f6c43,0x003dba64,0x00334a73,0x0020f1d2,0x002cf5aa,0x002f94e9,0x00297830,0x00219dff,0x002eaf4a,0x003febca,0x0036c98f,0x000e3603,0xffd118c9,0xffe3cb9e,0xfff5425f, -0x002daaa3,0x001dbfb9,0x001f259b,0x005f39d9,0xffefa362,0xffe5317e,0xfff525d6,0x00170a8d,0x0027306d,0x00364aab,0x0025d130,0x001d7bcb,0x00188767,0x0028dca3,0x002b0dfe,0x002bbc7a,0x001e14e9,0x00365fb2,0x004610cf,0x008dcb71,0x0096c03d,0x005ed0cc,0x0063b64e,0x004e96b2,0x002eb8a4, -0x003cfbe0,0x002e8632,0x0023b99c,0x00258690,0xfffd1b31,0x001aa837,0x0015dfa4,0xfff0e410,0xff88c282,0xff7dcf62,0xffaabd9a,0x002c51d7,0x003101e8,0x004b5aa7,0x00acc3a4,0xffef8ea4,0xffa245c7,0xffad08e1,0xffdf4017,0x0017daf4,0x0031b54f,0x0019dadc,0x000927e6,0xffff1d1c,0x0023ba96, -0x0039d76f,0x006f0607,0x0043ae09,0x003162a5,0x00205cca,0x0091abc9,0x00b4f72f,0x005626ac,0x005c2921,0x00448cb9,0x0013cbce,0x0031b632,0x00392d00,0x003e01f1,0x0023a59b,0x006d77a4,0x00bd2a11,0x00795256,0x004e66b7,0x0082d311,0x00f81d9d,0x00f65713,0x00612e0c,0xfff1c1bd,0xff8101c0, -0xff4e239c,0xff7550f5,0x00122ce3,0x011f73d2,0x00b3555d,0x008abf9c,0x0084c5ba,0x0070ef77,0x0068c97f,0x00497c12,0x00361110,0x0037a5d8,0x00470da8,0x0041a8d7,0x005d8426,0x00abf26a,0x002c10cb,0x0018437f,0x0083abb8,0x010081aa,0x00f0215f,0x003e9a3b,0x00370d27,0xffdbceaa,0xff43e8d2, -0xffee5f42,0xffcc40d0,0xfe1b2c32,0xffe941f6,0x00472ca7,0xffa47480,0xffa52b52,0xffa1e41b,0xff7a9cb2,0x0073a2e5,0x00bea36f,0x002556f4,0x002d5168,0x004528a1,0x008df516,0x009b6835,0x00a4c9bb,0x00a6da74,0x0064794b,0x0048f88d,0x003ddef6,0x0031bdc4,0x003047b4,0x00363348,0x009457e2, -0x008ca41a,0x004f671e,0x0075eb30,0x00952875,0x00a09784,0x00260754,0x001eed90,0x005340d8,0x0061eeee,0x006e0317,0x002e59a3,0x008ff569,0xffc96c70,0xffd1dc3b,0x009aa16a,0x00ba6c70,0x00ac8d87,0x0019e9f0,0xffd8d330,0xffcab439,0x00220640,0x00692a8e,0x00755d3a,0x006fa929,0x003f1018, -0x000041e6,0xffbe6bfa,0xffd0f47d,0x005e3a4e,0x0003d4f8,0xffdcf07d,0xffcebfb3,0xffd07d6f,0xffd02499,0xffcc121f,0xffd353b6,0x00082da4,0x00554a82,0x0037b207,0x0027c08f,0x0030e3ec,0x00344063,0x00388e3c,0x00059a6e,0x006bed5e,0x00890df1,0x002d262a,0xffe4f3d9,0x00655835,0x008b4dac, -0x006fcfa1,0x006ca5e9,0x00679bf6,0x00668a99,0x0064c9e9,0x004af257,0x00074351,0xffe02414,0xffb0fff8,0xffb4dcd3,0xffd06d4d,0xffee92ae,0xffed2987,0x000cb85b,0x005604f4,0x004d2e86,0x004ef243,0x0037c5e9,0x000b7cf3,0xfffc8fdc,0x000fcd90,0x0026ccc1,0x002587bd,0x00210f8f,0x0034434f, -0x002dbaca,0x00187590,0x001847ab,0x000b4370,0xffc83dc0,0xffde90bd,0xffed165d,0xffd37f20,0x002de060,0xff23f462,0xff7ca467,0xff89a4d2,0xffbbd5fb,0x00114cf1,0xfffcd139,0xffdbaf8c,0xffb94c85,0xff4a54b7,0xff542f75,0xffb89353,0xffbe06ed,0xffea47a7,0x000313dc,0x0031032d,0x0037c0b7, -0x0026da3c,0xfffe28c3,0xfff75792,0x002049bf,0x000edb69,0x000adcd2,0x0005b4d2,0x001c13ff,0x000c09a6,0xfff1eec9,0xffe7c0d0,0xffde2055,0xffe92943,0xffd9bc65,0xffa30a24,0xff53f057,0xfeefcdcc,0xfea83a40,0xfe996572,0xfee55d50,0xff3d8ab9,0xff437f35,0xff53c5d9,0xff3395b2,0xff06b06f, -0xfee5bc18,0xfefb32b0,0xff441476,0xff6a13ee,0xff91a3f9,0xffb43a0c,0xffc8b015,0xffdeafdd,0xffeed23c,0x001eee53,0x003a101f,0x0047c954,0x0025c631,0x0023e7c0,0x0046379b,0x00471951,0x004155a8,0x00257b2e,0x0028a263,0x000f8dab,0xfffa2a18,0xff96be7e,0xff680f8f,0xff635d49,0xff437caa, -0xff2f1740,0xff22bd53,0xff38a02c,0xff67c3c5,0xffafddb9,0xff6ba014,0xfedb12d6,0xfecbdefc,0xfeefdf00,0xff08f5b7,0xff2dd8d2,0xff6ce844,0xffa39cac,0xffd76ecd,0xffdab01a,0xffe4fba3,0xffed2b44,0x0018f227,0x003bc08f,0x005a4148,0x00603283,0x0068aef0,0x0077bcb8,0x00657531,0x0059b8ae, -0x004768d8,0x002bd12d,0x001b857a,0x00092d45,0x0010c355,0x001c660e,0x002fae02,0x001eec37,0xfff49516,0xffeb9be4,0xffca66e5,0xffc2ee65,0xffa91129,0xff714612,0xff3023cc,0xfefb5e6e,0xfee90144,0xff943299,0xff7a752b,0xff849c9d,0xff8d7ccf,0xff93f34c,0xff987ed8,0xff9ee1bd,0xffae5ba0, -0xffbe426f,0xffd0d0ff,0xffdf2daa,0xffea1ef5,0xfff42fea,0x00046b3b,0xfffa3509,0xfff33aa1,0xffed3e8f,0xffeb017b,0xffec1a91,0xffe94498,0xffdab2ce,0xfff480b7,0xfffe26fd,0x0005f918,0x000b9f54,0x00197b60,0x0002fe1d,0xfff733d4,0xffebdc28,0xffdf1f18,0xffd5d647,0xffd412d7,0xffc59c06, -0xffc172ef,0xffb74724,0xffa6d435,0xffd6c69a,0xffd00b3f,0xffd7b3ea,0xffdb9409,0xffe0dbbe,0xffe60cf4,0xffea7315,0xffec0c6a,0xfff10a37,0xfff546a8,0xfffaad17,0x00000a0c,0x0004d66f,0x000b8fef,0x00088a34,0x00084124,0x00065987,0x0004b3f2,0x00017de1,0x000330ad,0xfff8c58c,0xfff55c41, -0xffeaed23,0x000374fc,0xfffe330e,0x00005785,0xfffc258b,0xfffaea8c,0xfff5381d,0xfff1e735,0xffea3fc0,0xffe1ec68,0xffe10640,0xffe04f89,0xffd22032,0xffd498a3,0x0007bfb8,0x0018106d,0x002133d6,0x0022612e,0x00183fd9,0x00107fbd,0x000563f2,0x000a0fdf,0x000d445d,0x0016e974,0x00125f37, -0x0012937b,0x001dfd6c,0x0007af3c,0x00036c67,0x00032872,0x000d32d2,0x0012eb41,0x001a4e18,0x0018e62a,0x001927ea,0x001586e1,0x001aa697,0x001a608f,0x001dbbd0,0x0013674e,0x001e9862,0x002b2d33,0x00349d5e,0x0035b4b7,0x002ca22a,0x002c55de,0x00295abb,0x00225617,0x0022b707,0x001dfe05, -0x0021cce1,0x0020969b,0x00173fb0,0x00224f98,0x0010c5b4,0x000252f0,0xffe85f07,0xffe92704,0xfff4bed2,0x00153642,0x00158cf5,0x001834f8,0x00303d1f,0xfff05a2d,0xffd9b0c3,0xffdd8196,0xfff0a728,0x00075db5,0x001e36bd,0x001f70a3,0x001efbaa,0x0015f09a,0x001ddebb,0x0016a959,0x000e1cef, -0x0012711b,0x002056aa,0x0035cee6,0x004d513c,0x00518fcc,0x003971a4,0x0036478b,0x002c7194,0x001b5c86,0x002c9bd6,0x00303932,0x0021f528,0x001d546f,0x003bbd0a,0x0055a6b5,0x002c3560,0xfff9fe50,0xffc69702,0xffceaf7f,0xffe07067,0x001f1fbd,0x000e8375,0x000baded,0x0042721f,0xffc6b946, -0xffaf6bc2,0xffb63c54,0xffe4d7f8,0x00056b36,0x002c3139,0x0028292f,0x00264f83,0x00183f2f,0x0021fc65,0x001b691f,0x0005b574,0x000e5976,0x00304d78,0x00521547,0x008b5d45,0x00946777,0x0062e1df,0x006251d1,0x004fdd56,0x002daf31,0x004578e3,0x0036c2bc,0x002383c6,0x0030dfce,0xfffe2e42, -0x003a2d4f,0x00161cd8,0xffe2f16f,0xff890c36,0xff677639,0xff951f25,0x0018555b,0x00207b8b,0x002f019e,0x0087b91d,0xffc21854,0xff5ad3d0,0xff5652cb,0xff8d4896,0xffe2a04a,0x00284a10,0x00273511,0x001e5b27,0x000452af,0x0017bf18,0x001e73d2,0x00338024,0x00324d7c,0x00360891,0x00423e4e, -0x00a62460,0x00c0f84d,0x0061a202,0x005d9877,0x004d6d0a,0x001df3b3,0x004d751c,0x005767a7,0x0039c2f1,0x0022c62c,0x00c430f9,0x00e00ebc,0x004cdbd2,0x00149e9c,0x004293a2,0x00fb9a95,0x00fb65c3,0x00260d7e,0x000b9868,0xff921e19,0xff2ab1b4,0xff2bd5f0,0xffc94f64,0x010d74f2,0x00b69444, -0x00937da9,0x00860167,0x006e0d5a,0x0069935f,0x00625e10,0x005bd709,0x00563e8a,0x00503b31,0x003975a3,0x0046741d,0x0095cee8,0x00282a61,0x002d727d,0x00ba346b,0x00f8e8b5,0x00c5b089,0x003f3d66,0x001c0bba,0xffc6ed7d,0xff736b3e,0x004c4934,0xfee64a1c,0xfe68ca4a,0x001afb41,0x00790b81, -0xffaf19c4,0xffd9eac7,0xffd6172c,0xffa50e3f,0x004b481f,0x008d4b2b,0x005e312a,0x0028a8fe,0x002ba031,0x0073beff,0x009a5410,0x00b15f4b,0x00afad47,0x0056162a,0x0030ba6e,0x00393f4a,0x001bbb5a,0x001cbc23,0x002f10f6,0x007021a5,0x0079e2b2,0x0048e0b2,0x008d7340,0x00aaba29,0x009301fb, -0x00276eb1,0x002f8711,0x007a799a,0x0055fe98,0x00664f1e,0x00973a2e,0xffad4692,0x0042a1b1,0x004e0919,0x00df7918,0x00d5b570,0x00a0d1ea,0x000bf304,0xffa1a53f,0xffa1e999,0xffa87e81,0xfff62119,0x006e211f,0x0045e80c,0x003bb07c,0x0007a84d,0xffe7ae45,0xffe89249,0x0045ab34,0xffecf023, -0xffcca4f3,0xffd8b250,0xffd15f1b,0xffdcb061,0xffe6c31c,0xffd23763,0x000e8cd2,0x005af731,0x0037bd06,0x002a17e1,0x002d85b7,0x003b8b31,0x0032fcfd,0xfff8aa1e,0x006b4b9a,0x0086ea28,0x004b5e96,0x0046c546,0x0021a69c,0x00544bbf,0x005723cb,0x0065e56b,0x0067a712,0x008c75b3,0x00aa6c5e, -0x00c23668,0x003f8ed7,0x0003a1f8,0x0010782f,0xffbcb958,0xffbc8663,0xffd2278f,0xfff1079e,0x001468cb,0x005931c5,0x005a0a2d,0x0058da5b,0x003d617a,0x0003ce6c,0xfff2406e,0x000eb18d,0x000afcd1,0x000e6ada,0x0019ab80,0x003f160c,0x00416452,0x001c5d49,0x002b99be,0x001b13f9,0xffc8be1d, -0xffcf4ea4,0xffd8959f,0xffb713d6,0xfff1c8fc,0xff323fa5,0xff970287,0xff9cff5e,0xffcee449,0x002b953d,0x000718fc,0xffc3d7b2,0xff6f8528,0xff480856,0xff6349f8,0xffbe1869,0xffc5614c,0xffed3612,0x000dea7b,0x001fd20c,0x00196318,0x0003e810,0xfff2e5c8,0xfff5bdc9,0x001ca051,0x000470a0, -0x00009183,0x000467b5,0x0011f8c1,0xffff5035,0xffcec905,0xffe4aba3,0xffe3d8b5,0xffe34df9,0xffd112f8,0xff981c1f,0xff546dd4,0xff02d900,0xfed40a24,0xfef3c18c,0xff06272a,0xff69db12,0xff6b21fe,0xff6f807b,0xff4a9afd,0xff128562,0xff2ddc6d,0xff52859d,0xff6cdfb4,0xff9ab1bc,0xffadcf7e, -0xffb8a3ec,0xffc866f2,0xffdcf7fb,0xfffc704e,0x00215e68,0x00309673,0x0013aafb,0x000e5706,0x0014d84f,0x0037ae85,0x003b594d,0x0038a3d0,0x0029b436,0x002927be,0x00066de9,0xffd00288,0xff796a86,0xff552115,0xff5c443a,0xff43ff24,0xff2ce907,0xff1655ce,0xff16012b,0xff3d8ea2,0xff841a25, -0xff788a62,0xff175d9f,0xff1268c6,0xff22fe42,0xff25cee1,0xff2cef43,0xff5124d1,0xff6bccab,0xff8af2e4,0xff9fa021,0xffbbad71,0xffd7a20a,0x000e8087,0x003d6cbe,0x006a79e6,0x0054560e,0x004a32e6,0x004456b2,0x004661f8,0x004319a9,0x0043f696,0x003a7575,0x003023bb,0x0029255a,0x0016551d, -0x00123188,0x000e999b,0xfffc463d,0xffc3ea3a,0xffb0c546,0xffa66b82,0xffb88d9e,0xffb9619c,0xff8fbce1,0xff611470,0xff3af5c9,0xff29b883,0xff737f60,0xff5a8fa0,0xff7077ca,0xff8606ed,0xff9d4016,0xffb003a8,0xffc6c134,0xffe1594b,0xfff12da3,0x00013e1d,0x000e528a,0x00196d94,0x0023796a, -0x0038a67b,0x00312d54,0x002ec339,0x0028a115,0x00258f3e,0x0025b9a6,0x0021bb14,0x00026db9,0x00086ca6,0x000519bb,0x00030b54,0xfffb9f54,0xfff755f6,0xffe2c1fc,0xffd9a0ca,0xffd15d21,0xffc1c2bc,0xffb221f6,0xffae2d5d,0xff9eebbc,0xff9b2bba,0xff8f2e18,0xff7ed7fc,0xffd46cb4,0xffc32dfa, -0xffd16f12,0xffd7f3c1,0xffdf0678,0xffe67b89,0xffec88be,0xfff21e22,0xfff76c74,0xfffe039d,0x000551eb,0x000cbe5e,0x00133131,0x001a7bc9,0x00171b24,0x0016c41d,0x00163548,0x001467a9,0x00112318,0x0013eafa,0x000b1d1d,0x00097cff,0x0005747c,0x0004ab50,0x000466a9,0x000f0439,0x000b8a34, -0x0008e8a3,0x00023dd8,0xfffe10f6,0xfff6dc58,0xffee70b6,0xffe27fab,0xffd8c41e,0xffe0c643,0xffd7bc17,0x00030b47,0x000ad120,0x0019b645,0x001cac2d,0x000ce25b,0x00039ccf,0xfffa2e1d,0xfffc4b11,0xffffa6e5,0x000c0ac5,0x000581f4,0x0004b59c,0x000dda78,0xfff86de7,0xfff2d226,0xffef5faa, -0xfffadca6,0x0002b3ee,0x000df057,0x000f2f01,0x00107150,0x000b9e21,0x000ed63c,0x000dfd37,0x000df596,0x0006d18c,0x001281b5,0x00239c3a,0x0029b27e,0x002ad67b,0x0022daa8,0x0022ce92,0x00203698,0x0017a2da,0x00199547,0x0014b949,0x0018dc3e,0x00192511,0x0016a695,0x002569b8,0x0007af74, -0xfff54f22,0xffdfe602,0xffdaa0dc,0xffe4be7f,0x0008809a,0x0004d4c4,0x0005a746,0x001718ef,0xffddf897,0xffc467cb,0xffbfcc80,0xffd2b460,0xffed99ad,0x000f498a,0x0019b356,0x001c3bbf,0x000f35db,0x0012c8a3,0x0005977b,0xfff7cb8c,0x0002e5db,0x0014bda2,0x00322ebd,0x0041ee8e,0x004585af, -0x003296f4,0x002f02d1,0x00254bbb,0x0011c3be,0x0029e726,0x002e8e87,0x0019af07,0x00196d00,0x004b03c3,0x006c7838,0x00227314,0xffe95f31,0xffc16dbc,0xffbb2d27,0xffca6d29,0x0016af27,0xfffb5e45,0xfff5c9a5,0x001c2912,0xffacc88f,0xff8c5cd0,0xff839c82,0xffb3fb0c,0xffe0aba9,0x001c9b9e, -0x002a2b8d,0x002ec159,0x001881d5,0x0018bfb9,0x0009d24b,0xffe79db7,0xfffcf5d5,0x0025a223,0x0055555b,0x0082927e,0x008b27cd,0x00628201,0x00601a19,0x00509725,0x0024f737,0x004aa8a6,0x003edd8b,0x00244d98,0x003cb0ca,0x00165695,0x0064b89e,0x00165d18,0xffd739e4,0xff9356df,0xff5b28b1, -0xff81d39f,0x000e3ece,0x0005f39d,0x000e01f3,0x005246d6,0xffaadc5f,0xff398bea,0xff1c6c26,0xff4960e3,0xffab2915,0x0015139c,0x00336a1b,0x0035eee0,0x000dd89b,0x001183b7,0x00022eb8,0xfffaa115,0x001acda6,0x0036e996,0x005da47c,0x00b77fe8,0x00cd27ab,0x006ebf64,0x0062a9a1,0x00556b4b, -0x00225153,0x0065df51,0x0073e9b2,0x003761a8,0x002acc31,0x011522ba,0x00f8e5be,0x00363df1,0xfff1faf7,0xfffde4ae,0x00dabddb,0x00ded010,0xffea2a11,0x0018201c,0xff989cb7,0xfef9ad90,0xfef9163e,0xff8917ef,0x00bdee38,0x00a27ccf,0x0091ea81,0x007e8bd0,0x00651b11,0x005e24ef,0x00676c7d, -0x00767754,0x006ec775,0x005f0d3f,0x00384e44,0x0033b51c,0x007dc190,0x001f3ba0,0x0040cd98,0x00f17ebc,0x00e58379,0x0097b832,0x0040e2cd,0xfff67b80,0xffb05dd5,0xffb3f148,0x00a30fc6,0xfe230e1c,0xfeb472d4,0x001e0705,0x00832ae2,0xffcf7332,0x001864fc,0xfffad696,0xff898c4c,0xfff694eb, -0x0041dae7,0x0089fc04,0x0029e9a6,0x0018f003,0x0049dc4d,0x008ace03,0x00add186,0x00a1ab86,0x0040fcee,0x00196775,0x00344966,0x0011f7dc,0x0012ab3e,0x00293986,0x0048630b,0x005d1261,0x003f6d18,0x009b088f,0x00b5c966,0x00809925,0x002c4609,0x003c3852,0x0083f79d,0x0050b1a1,0x007544a1, -0x00fa5a0e,0xfeec41b6,0x00cc217d,0x00e1d002,0x011e7958,0x00e9e97e,0x009c1497,0x001e804e,0xffa54633,0xff9f17ac,0xff5f7c51,0xffa11281,0x006159fe,0x0021a76c,0x00398739,0x00223b72,0x0006d637,0xfff49595,0x00294a50,0xffe3c7fd,0xffcab9ba,0xffe4d114,0xffdd2adf,0xffeaff3d,0xfffdcbe1, -0xffdb3c7f,0x00161554,0x005aa199,0x0037b7df,0x002b815b,0x00276beb,0x004574c8,0x0036a871,0xfff6d09c,0x0066d0e7,0x008427ce,0x0071afb3,0x00afd022,0xffd75621,0xfffe2bb8,0x002bc0cf,0x0055fdea,0x0064e3af,0x00b2e061,0x00e4f781,0x011cb206,0x00666b96,0x0016867d,0x005f72dc,0xffc02c45, -0xffa5b595,0xffcf91bd,0x000309d9,0x0022aa68,0x005863c5,0x0060d23c,0x005bce90,0x004193db,0x00054e28,0xfff32ba1,0x000e58cf,0xfff9a19f,0xfffcba61,0x000abe6f,0x003fe48b,0x004ea317,0x0024cb3f,0x0036f78e,0x00214979,0xffd33a5b,0xffd12314,0xffdbe8bd,0xffad8959,0xffc1cd9a,0xff5aada4, -0xffaa6e22,0xffc05c5a,0xffe9565c,0x0020da0d,0xfff83019,0xffa4af61,0xff322d3a,0xff564e36,0xff83102d,0xffd1e543,0xffe2c3ba,0xfff8c1dc,0x0011c769,0x000aa6cf,0x00009854,0xffefd4b5,0xffeec126,0xfff88959,0x00144804,0x0002babd,0xffff366e,0x0000955e,0x000ac995,0xfffab050,0xffb973d3, -0xffdb6302,0xffd8bfad,0xffd11bef,0xffc68b25,0xff992dfe,0xff682d7b,0xff326eac,0xff15a8f4,0xff3ab85b,0xff3ad100,0xff88bf52,0xff8df42c,0xff8d233c,0xff766336,0xff5de42d,0xff766e91,0xff970622,0xffa12fc1,0xffcb2ff8,0xffc892de,0xffb8d09f,0xffd069bb,0xffea1da7,0x0014796e,0x0020f4d9, -0x001b3b77,0xfff81670,0x0002dbd4,0x000cd88e,0x0029bf4e,0x002ec70c,0x002fb080,0x0030efa2,0x001e5fee,0xfff2d942,0xffae0d60,0xff700cc0,0xff569fec,0xff5c2e46,0xff4494c9,0xff24d479,0xff02b5ba,0xfefe38ec,0xff1aece1,0xff4b573b,0xff7a30a1,0xff53708d,0xff5215e1,0xff58de57,0xff50827d, -0xff49ff81,0xff562d96,0xff5bd2f0,0xff678e6d,0xff81e10c,0xffa56203,0xffc731a3,0xfff91f55,0x00264e83,0x005a3c8e,0x003bce63,0x002af7be,0x0019116f,0x0025dc7a,0x002aa768,0x0034ee28,0x003840d3,0x003bb271,0x00443235,0x0015eac9,0xfffeb329,0xffdbed2c,0xffcb7a3c,0xff8fab0d,0xff76cc99, -0xff80b39e,0xffa3df72,0xffb860f6,0xffa16a67,0xff8cc6e0,0xff7a3f01,0xff67ecb5,0xff560fac,0xff4bf5f6,0xff68460e,0xff82b9e2,0xffa06aa7,0xffbbcd9b,0xffda6a0b,0xfff86312,0x0005d14e,0x001126dc,0x001c1c4f,0x002717df,0x003119ce,0x00461fe2,0x004319f3,0x0046a0c2,0x0044f9b4,0x0043ed0f, -0x0042e510,0x0042fd14,0x00295964,0x0015b39b,0x000672c5,0xfff82525,0xffe980dc,0xffd6f912,0xffc64b96,0xffbd9adb,0xffb62f80,0xffa3a686,0xff8dfade,0xff84dee8,0xff76ccdd,0xff72f886,0xff696067,0xff5f0bdb,0xffc470b5,0xffb74433,0xffc522af,0xffcce3d7,0xffd4a583,0xffdbdb85,0xffe1fcf4, -0xffe9f6d5,0xffee0851,0xfff4e871,0xfffbda51,0x0002d8ce,0x000904b3,0x000f7732,0x000d2a7f,0x000cd2f1,0x000d2221,0x000c67d9,0x000b2ab4,0x000d7953,0x000855ab,0x0005e075,0x0004a626,0xfff6ad6a,0xfff6992f,0xfffee665,0xfffbed5e,0xfff84cdd,0xfff18f12,0xffed0bcf,0xffe741de,0xffdf7e0f, -0xffd1d07f,0xffc89cdb,0xffd2a265,0xffc8532a,0xfff15df7,0xffff1ed2,0x0011af18,0x00151bfc,0x00025c77,0xfff82ebb,0xfff11069,0xfff06ca9,0xfff3dc23,0x00033e68,0xfffabb4a,0xfff94838,0xffff4a54,0xffee5d47,0xffe884e2,0xffe1e52d,0xffeca208,0xfff4ffbf,0x0001a4cb,0x0005f5ee,0x000809f0, -0x00027ef1,0x0003c408,0x000245e3,0x000008df,0xfffbdbb0,0x00068f15,0x0019a46c,0x001d0cd5,0x001e7cbb,0x0017a2da,0x0018e9a4,0x001680a0,0x000b64fd,0x001079e1,0x000b566c,0x000dc171,0x0010d13b,0x001788eb,0x0022c2cc,0xfffce85b,0xffe9179e,0xffd8ceed,0xffce851d,0xffd85bae,0x0000e6c1, -0xfff73d88,0xfff7a0c8,0x00028db2,0xffd8ec7c,0xffbfa77f,0xffb10b9f,0xffbffaf1,0xffd98725,0xfffeb22f,0x0012c1dd,0x0017c1eb,0x00083025,0x0006a64b,0xfff58091,0xffe8a89e,0xfff41b8d,0x0007d845,0x002c25c3,0x0034613d,0x0038116b,0x002ad2ac,0x0027e583,0x001eb69a,0x0006b2bd,0x0025b6b1, -0x0029749f,0x000d52ba,0x0013929d,0x0052d2c9,0x00758c02,0x0013cd1a,0xffda9ddc,0xffbff135,0xffab0101,0xffb9e4b3,0x0013917d,0xffec8ca6,0xffe7b56a,0xfffb64f3,0xffa970e4,0xff868eaa,0xff6bee85,0xff94897a,0xffc4229f,0x0007a9c1,0x0028db8e,0x0032a915,0x0016ceee,0x000be2e0,0xfff6d791, -0xffd637bb,0xffeb8391,0x00164fd2,0x0050a8c2,0x007213b7,0x007aab99,0x005c0358,0x005d65c1,0x00502ca3,0x00187aa5,0x004a6695,0x003f580e,0x001bbaf3,0x003e3be8,0x002fc563,0x00759cc8,0x000aa964,0xffccf9fd,0xff9d83e7,0xff567d80,0xff783869,0x001169e8,0xfff117cf,0xfff7ab90,0x00285a0f, -0xffb3cce7,0xff47a85d,0xff0f757b,0xff28dcae,0xff82a833,0xfff85ff4,0x00392ec6,0x00461f69,0x00133092,0x0005f8e2,0xffe4974c,0xffd0e8a7,0xffffcb2d,0x002fd571,0x006de0e4,0x00bff9cb,0x00d38bbb,0x00752817,0x0066e660,0x005bbba0,0x0024d86c,0x0077ea4c,0x0085b5e6,0x002a8578,0x002c869f, -0x0148410a,0x00f8f18c,0x002e317d,0xffd83eff,0xffac93d2,0x00a452ac,0x00b17750,0xffb65ced,0x001bb51c,0xffa42180,0xfedba56a,0xfee95fea,0xff624cf8,0x00560caf,0x007f258e,0x0086cc75,0x006b5459,0x005de727,0x0057bb64,0x0061115c,0x00802c3c,0x007936e5,0x00645a5a,0x0038939a,0x0024d637, -0x00640c96,0x00118264,0x004e2b91,0x01216638,0x00c7b984,0x0067fe63,0x00377ce0,0xffc73d11,0xff975c10,0xffeb0e60,0x00e6f92e,0xfdbbee18,0xfef419c4,0xffe8ee52,0x006251f0,0x00075a37,0x004b6072,0x0018c9d0,0xff6f3dbb,0xff9c32ac,0xfff17c5b,0x00ab0b3d,0x002cf799,0x000ca164,0x00372438, -0x0073cfc4,0x0099bd29,0x0085fc58,0x002d85b8,0x0006ba02,0x002a3fe7,0x001263f3,0x00135436,0x0027c0fb,0x002aa411,0x0044128a,0x0039ff57,0x00a05521,0x00b39e56,0x0069155f,0x0031b7de,0x0040d507,0x0070456b,0x00583d47,0x008d53eb,0x012ad3b0,0xfe7d1f0e,0x0141281a,0x01583896,0x013a5d7e, -0x00f27b40,0x00a56e5c,0x005da68f,0xffe79ffc,0xff9d5e85,0xff4543bf,0xff703e66,0x0042d9be,0x0005411a,0x0038ea72,0x00524b17,0x0032e541,0x00072293,0xfffc12dc,0xffdf866a,0xffcebd2e,0xffe4cbc3,0xffe958d4,0xfff72524,0x000b57d2,0xffe90d17,0x001df9c6,0x00543f9f,0x0033781f,0x0029e0f1, -0x002347dc,0x004d43a8,0x0044892c,0x000e3c5b,0x006b33be,0x007d9022,0x00911b88,0x010501b6,0xff8ed91b,0xffabbe48,0xfffa6a20,0x0042a3d1,0x006383a7,0x00ce7eb7,0x010abf88,0x0133c294,0x0092a94f,0x0041d1c2,0x008b65d4,0xffdbdbb6,0xffaba4fc,0xffd40bc8,0x00194083,0x003659b3,0x004c7e4f, -0x005061d3,0x00455f18,0x00387928,0x000a180d,0xfff7166d,0x00021d9a,0xffee9025,0xfff28c47,0xfffbbbbc,0x0035ce01,0x004da55b,0x002a2178,0x0034d8c9,0x001dd508,0xffe73197,0xffde23aa,0xffef0c8d,0xffbeebba,0xffa29300,0xff8b1e93,0xffca90d4,0xffdd7242,0xffef6c2a,0x00054294,0xffe6de52, -0xff9a371d,0xff2a56a9,0xff7beb18,0xffacc31e,0xffe08e7d,0xffff494a,0x00108a9c,0x0019208b,0x00075b6f,0x00004606,0xfff2c3c2,0x000019ee,0x000aeabd,0x00103655,0x000412f2,0x0001eaee,0x0004f69b,0x00031592,0xfff3633c,0xffb326a2,0xffcb1ac8,0xffc43beb,0xffbdc4f6,0xffc21b65,0xffa7d25a, -0xff8c8e00,0xff70a6cb,0xff58f9a5,0xff6076a3,0xff715eff,0xffa4b292,0xffa9d36b,0xffb0dcf3,0xffae3f29,0xffbb90d3,0xffb8c048,0xffd11e83,0xffe1a2e9,0xffe06cad,0xffd1e26f,0xffcb78d1,0xffe5dd46,0x0001224b,0x0026d85c,0x001559c5,0x000330e1,0xffe9b531,0xfffd6ee3,0x0009920c,0x001dcf11, -0x002220e0,0x00267073,0x0036889a,0x00090355,0xffd7f6ae,0xff9629f6,0xff72c656,0xff5fdb87,0xff5afe54,0xff42690e,0xff1d4ad9,0xfef5775a,0xfef06d32,0xff0751c7,0xff266997,0xff84a263,0xff83e231,0xff8b79d5,0xff8dcbae,0xff7ef9b8,0xff751fc6,0xff6f509c,0xff644ab1,0xff5f93d5,0xff80d3c5, -0xffa969c8,0xffccf832,0xffe90103,0x0004ae1b,0x002ae654,0x001bede7,0x00154bda,0x000a30e0,0x0018a187,0x0021d01c,0x0031412f,0x00354aed,0x003be9c3,0x0049956b,0x000769b4,0xffde7936,0xff9e674d,0xff949f9a,0xff64b6b0,0xff4ec901,0xff62d5ed,0xff8614f3,0xff9f333e,0xff9ef024,0xffa3ec57, -0xffa5dc01,0xff95cb47,0xff51a786,0xff60cb12,0xff79a917,0xff909e2d,0xffaa11a5,0xffc46bb7,0xffe180cf,0xfff8d725,0xffffa434,0x00010b54,0x0005b2c6,0x000c916a,0x0013ff58,0x002124c3,0x0021c5a0,0x00267b4b,0x0027e1ca,0x0029bfea,0x00284cd3,0x002c7419,0x00288e25,0x00070b14,0xfff6216b, -0xffe394c8,0xffd8017a,0xffc2a947,0xffb707bc,0xffad5449,0xffa5463e,0xff927ed9,0xff7d799f,0xff6d4eaa,0xff6653c2,0xff61c7c5,0xff5c7ca2,0xff5e685d,0xffbe137f,0xffb9650b,0xffc16f40,0xffc8b7e6,0xffcf446b,0xffd45d48,0xffd8f798,0xffe1981f,0xffe25815,0xffe7380c,0xffeb86d6,0xffefc2fd, -0xfff34500,0xfff6c8ae,0xfff684fb,0xfff7181d,0xfff846bd,0xfff8b570,0xfff9dc1e,0xfff9a641,0xfffb1378,0xfff88ccb,0xfff9484a,0xffe724a0,0xffe787ce,0xffeb136c,0xffe70fd2,0xffe28fbf,0xffdc4d46,0xffd75ba7,0xffd28586,0xffcc27a8,0xffc5d56d,0xffc2291f,0xffc2e99d,0xffbf0316,0xffe265f5, -0xfff53ce7,0x0007acac,0x000ba7e6,0xfff8c597,0xffeedd19,0xffea4951,0xffe6ae8a,0xffe9d7ea,0xfffb1832,0xfff1ad2a,0xfff059b1,0xfff42d81,0xffe911bd,0xffe3d663,0xffdab389,0xffe32132,0xffea54ad,0xfff58524,0xfffcecc0,0xffff9cde,0xfffa7e1a,0xfff8c642,0xfff690ec,0xfff45ed5,0xfff17415, -0xfffa4a3a,0x000e6ef3,0x000f0a2d,0x0010c7b9,0x000bda0e,0x000e6b28,0x000c3797,0xfffec4ee,0x000620bc,0x0001631d,0x000057f8,0x000672f2,0x0011dfaf,0x001872d1,0xfff24504,0xffdf5489,0xffd4c263,0xffc61742,0xffcf3861,0xfffa7873,0xffecf441,0xffeec2c2,0xfff6b5cb,0xffdf4193,0xffc8152d, -0xffaf3b63,0xffb7d8a0,0xffcb803f,0xffec47b6,0x00084f20,0x000fdca3,0xffffd7a0,0xfff99577,0xffe7e720,0xffde789f,0xffe6b0fa,0xfffa5ec8,0x0024c194,0x0024a783,0x0028a55f,0x00225ba4,0x00203c42,0x00182392,0xfffc0806,0x001fd6b8,0x0020a318,0xfffb6465,0x000965e1,0x004c0f70,0x006888d8, -0x0003ffb1,0xffcf0d4e,0xffc2ce3a,0xff9ea263,0xffac1fbd,0x000d07b5,0xffe0b121,0xffe0e17a,0xffea6584,0xffb8c7c6,0xff97c8ff,0xff6c36b4,0xff87a1b1,0xffb0854b,0xffedd274,0x001f9c1a,0x002e7099,0x00113aa8,0xfffd9189,0xffe569cd,0xffce1762,0xffdb6aff,0x0003d016,0x0048f5aa,0x005a03cf, -0x00636e82,0x005194ee,0x0059bc67,0x004da4e0,0x000a9100,0x004492a8,0x0038b19c,0x0008f98c,0x00359744,0x00307a20,0x00641164,0xfff8dea2,0xffc6459a,0xffabc4cf,0xff5b2ad2,0xff757419,0x0011a162,0xffe3f5bc,0xffeed062,0x0017eb2d,0xffd9ba5c,0xff78c0e5,0xff22ed8b,0xff25cbaf,0xff68fb1e, -0xffd2e2a4,0x002ee855,0x004654de,0x0010c210,0xfff4a907,0xffcc26a8,0xffb9d739,0xffe4f089,0x0020beec,0x0073deab,0x00bcc991,0x00cf11e9,0x007510c4,0x0069f3f7,0x0060ce53,0x0024e8f2,0x00863525,0x008cff97,0x000fe890,0x001f12ae,0x015e987a,0x00f12c53,0x0028e401,0xffbac602,0xff5fb61c, -0x0059d1a1,0x00728e43,0xff8ee177,0x0014f9d8,0xffb41990,0xfee2a83c,0xfeef94fa,0xff4aaf1b,0xfff959a6,0x0058d2f9,0x0075c896,0x00526c16,0x00554355,0x00542cdb,0x005ac289,0x007a321a,0x0071d886,0x00594ebf,0x0035ef44,0x001985eb,0x00487204,0x0003977a,0x0053ab1c,0x013a08f8,0x00a3e574, -0x003bb647,0x002032ee,0xff8e8208,0xff776edc,0x0011629a,0x0110fe5a,0xfda94888,0xff04f097,0xff91106b,0x002c3a51,0x0045288a,0x00688825,0x002cb72d,0xff80d11c,0xff6c231a,0xffba3e2b,0x00baa0f3,0x002f2de1,0x0006a001,0x0027677f,0x006111fe,0x007d7cb6,0x0056c92b,0x00178bf3,0xfff88533, -0x001b1fa4,0x001a6ec1,0x001fd21a,0x002cb20b,0x0019cfcf,0x00344358,0x003dc1ee,0x00a183f7,0x00a969e0,0x00515a2c,0x003645da,0x003ea8f1,0x00587c2f,0x006cf563,0x00a307a1,0x0113df12,0xfe589b94,0x018c454a,0x019a219c,0x01439438,0x00f00205,0x009b47f7,0x00b9a3fc,0x00499564,0xff76c2b6, -0xff45e157,0xff5cb654,0x0004e507,0xfffe4b8e,0x0046b0ac,0x0072f493,0x00657b43,0x002fd588,0xffe3ec2b,0xffe06b6f,0xffd49d30,0xffd88c50,0xffe70f10,0xfffb2302,0x000e0ffb,0xfffa2705,0x00263ccd,0x00488ca8,0x002a3f6a,0x00244467,0x00224992,0x00514a30,0x0056319a,0x003c37b3,0x0069a48c, -0x0064b3c7,0x00944754,0x0138a80a,0xff516bf6,0xff77e828,0xffc2a1cd,0x001d3d0d,0x005c5e42,0x00c121c9,0x00feb93a,0x010322ee,0x00c3bae2,0x0083d464,0x00918459,0x000dd81d,0xffd34335,0xffe11c74,0x002b2dc7,0x0047bc8a,0x0042c630,0x0039d02c,0x00277231,0x0026d7a1,0x000bd0ab,0xfff985c9, -0xffed34a8,0xffe30adc,0xffeb1be0,0xfff1e25c,0x0021bba0,0x003c52ab,0x00260f1e,0x002585c5,0x0010d22f,0xfff99c2a,0xffe71c01,0xfffb6b67,0xffd92786,0xff87e3dd,0xffc40f2c,0x0008546c,0xfff0ae76,0xffe442fb,0xfff69fc8,0xffda1864,0xffad3c75,0xff646202,0xffb34bf4,0xffcf388d,0xffdb7b8c, -0x0006684d,0x001a5961,0x001cd781,0x000cdbe2,0x000a0e8b,0x000728a3,0x001aaa11,0x001efcea,0x000ecfca,0x0003d027,0x00033241,0x0011826e,0xfff6f2a1,0xffe3a118,0xffb98300,0xffba3f09,0xffb33ffa,0xffb6601d,0xffc9d836,0xffc0dfd8,0xffb6d342,0xffad915b,0xff99001b,0xff8e3699,0xffaedf10, -0xffa87651,0xffb75183,0xffcdf39b,0xffdca736,0xfff558b7,0xffe9a2f8,0xfff7c482,0x0008cda3,0xffe63485,0xffdc312f,0xffeb9c4d,0x0001ede1,0x00183b0b,0x00319388,0x0007acfb,0xfff7629c,0xffeb3cc3,0x00010cf4,0x000fd4cc,0x00199faf,0x0020fa20,0x00213273,0x002d9465,0xffeeec81,0xffbfa951, -0xff89ed59,0xff7b7370,0xff6bc56d,0xff5b6999,0xff41a9f6,0xff1cd46f,0xfef83b64,0xfee8ad18,0xfef83744,0xff14bf10,0xff7f3bd8,0xffafec20,0xffbd9fa7,0xffbaa61c,0xffa9f30a,0xff9f2a20,0xff93b63d,0xff827526,0xff76dac4,0xff9640f8,0xffb8bbab,0xffd70ead,0xffdeda0f,0xffe8c1e6,0xfffb83b9, -0xfffdc15b,0x0003bea0,0x0005d58c,0x00120369,0x001ad4ad,0x002b8b3e,0x002b7a94,0x002d501f,0x0038f178,0xffeffe27,0xffba0ce4,0xff6d00b8,0xff67d8f5,0xff4bed73,0xff3c1146,0xff5142fc,0xff6a821c,0xff7e75be,0xff95959c,0xffafeffb,0xffc536de,0xffba136a,0xff6e1ca3,0xff8c54a3,0xff99f69e, -0xffa76258,0xffb60c36,0xffc6cd51,0xffda5c82,0xffe5fe5a,0xffea8c11,0xffe8054b,0xffe8ff14,0xffed0fb9,0xfff25523,0xfff78880,0xfff82e72,0xfff9463b,0xfff96041,0xfffa996b,0xfff8979d,0xfffb8882,0x00043c86,0xffe50de2,0xffd8fcdb,0xffcbe484,0xffc7f1de,0xffb8369e,0xffb326fc,0xffaa9cb2, -0xffa36555,0xff956261,0xff87a9c2,0xff74a6ce,0xff761c6a,0xff70c6f3,0xff6e5a1c,0xff79b125,0xffbe9e25,0xffbdaf57,0xffbfa6b4,0xffc4a72e,0xffc85912,0xffca7507,0xffcc676b,0xffd2047b,0xffd1b1f6,0xffd4f0ac,0xffd7ec70,0xffdaa5bc,0xffdcde55,0xffdfb9e6,0xffdf81b9,0xffe02854,0xffe10a44, -0xffe1599b,0xffe2d1ad,0xffe02052,0xffe609b8,0xffe5a7da,0xffea25b2,0xffd44b22,0xffd734ce,0xffdabdc4,0xffd64832,0xffd224a4,0xffcdfec9,0xffc98f29,0xffc606cd,0xffc2bd3b,0xffc1dd6c,0xffc06f88,0xffbfb39c,0xffbee2e5,0xffcc8d3d,0xffee4633,0xffffad50,0x00023b39,0xfff12202,0xffe86f4c, -0xffe61afc,0xffe0f2ba,0xffe3f1bc,0xfff56207,0xffebca0a,0xffeace0c,0xffed7bee,0xffe826c6,0xffe3dbcb,0xffd8cadc,0xffde35bc,0xffe3421e,0xffec04df,0xfff4cae4,0xfff7de13,0xfff47abd,0xfff11e98,0xffeeb9c6,0xffecadd3,0xffea4f5b,0xfff1f41b,0x0006125d,0x0003374a,0x00052743,0x00035e93, -0x00067c64,0x0004567f,0xfff54a82,0xfffe5d77,0xfff9d22b,0xfff509fa,0xfffe9cda,0x000a2b06,0x000c8a75,0xffe984a3,0xffd8ad6d,0xffd3395b,0xffc38166,0xffcb4b9b,0xfff47061,0xffe55fdc,0xffe9ce96,0xfff1d8a8,0xffebefb9,0xffd7a40a,0xffb5762c,0xffb73b4f,0xffc344d2,0xffdd5d9f,0xfffb5d7c, -0x0004ef0a,0xfff90b1e,0xffefc599,0xffdf2f7f,0xffd83f16,0xffdd8309,0xfff0004f,0x001ed989,0x00153112,0x00198c8d,0x001c995d,0x001a0169,0x0013483e,0xfff506f7,0x00198adf,0x00166c16,0xffe93e02,0xfffea5db,0x003fbe31,0x00528537,0xfff30f99,0xffc54a39,0xffc6e4ab,0xff9cc1fd,0xffa9c77b, -0x0007bae5,0xffda610d,0xffdfcb64,0xffe6f0cf,0xffd37187,0xffb61442,0xff7b816b,0xff87f063,0xffa44d99,0xffd775fc,0x000e30d8,0x00212369,0x000b2522,0xfff29219,0xffd9fffd,0xffcab8a7,0xffd04770,0xfff3d981,0x0043ad10,0x003e9fd5,0x0048f215,0x004928c4,0x0055b889,0x004a2189,0xfffe166a, -0x003b60d8,0x002f32d8,0xfff306bb,0x002bc1a7,0x00267bee,0x004c0a59,0xffe42e62,0xffbe1e5f,0xffb86520,0xff6bf341,0xff7dcf70,0x000965e6,0xffd927a3,0xffec939a,0x0017f394,0x000d847a,0xffb8b79d,0xff4569e6,0xff33aa6f,0xff5b5d56,0xffb2bc13,0x00162b17,0x0036748c,0x000ca229,0xffe583cf, -0xffbf5efa,0xffb26b7b,0xffcfa51c,0x000dba53,0x00743601,0x00ac512d,0x00bd38ef,0x0071e1be,0x006eef38,0x006712fc,0x0024457d,0x008dbda1,0x0086514d,0xffea5954,0x00098718,0x01657296,0x00d8dad6,0x001c3e75,0xff9cfb0f,0xff2de8e6,0x0012c638,0x003eed05,0xff8f480f,0x0019dded,0xffcbbe28, -0xff021060,0xff013496,0xff41b8ce,0xffb5bb81,0x00341b23,0x00600e0b,0x003b0298,0x0046ddd2,0x004ba56b,0x00586277,0x006c389e,0x005dfe9c,0x0042acd2,0x0032deb3,0x00140490,0x002e4f2b,0xfffb5289,0x005259a6,0x01323ffc,0x007fe1f8,0x00176c69,0xfffd15af,0xff585b3a,0xff60508a,0x0036ca56, -0x012db4ec,0xfdc4ca8c,0xfef20386,0xff4852a0,0x000346d4,0x008630dd,0x0071ba45,0x00298a5e,0xff9cedee,0xff5bff72,0xffa10f03,0x00c22535,0x002a9645,0xfffcb2c0,0x001a9ef0,0x004f53f8,0x00629749,0x002b8a97,0x00092a5f,0xfff3900c,0x000b0eea,0x0021f2c8,0x002fb3c7,0x003196d1,0x0010b6b1, -0x002bcfb4,0x0047ac22,0x009bda8f,0x009812f7,0x003cbc15,0x00337347,0x003934fa,0x00541581,0x008dc23a,0x00ae9504,0x00ba2dd7,0xfe594ff0,0x01a92298,0x01a57dda,0x01367eaa,0x00d3d9d8,0x006042cf,0x01048f34,0x00b4573f,0xff5f23bb,0xff6a7668,0xff6958f3,0xffbee5f3,0x00074411,0x005f54bb, -0x0089f33f,0x00802d50,0x004a70d6,0xffe2bd8f,0xffe7d44e,0xffe13187,0xffd3203c,0xffde20c0,0xfff80ec9,0x000acb61,0x000deeea,0x002e1bdd,0x00364e42,0x001f8777,0x001d262e,0x002065b3,0x005597ae,0x006721f1,0x006d7c58,0x00564dfe,0x00347839,0x007aadd6,0x01486240,0xff2943d8,0xff5eec16, -0xff90b764,0xfff1c72f,0x004c96a4,0x008a0523,0x00b8c656,0x00a1c700,0x00dcd795,0x00baf58a,0x0090c072,0x003e3a48,0x00022ae3,0x0006be86,0x003129b8,0x0049c147,0x003a382a,0x00298709,0x00103e8f,0x0011f67d,0x000bdd79,0xfffa86b4,0xffd9d3c2,0xffd5ba02,0xffe2ee8b,0xffeceb5f,0x00074bdb, -0x001ef8b1,0x0018a246,0x000e5e80,0xfffdc524,0x00025b9c,0xffe8d761,0xfffbe20b,0xffeeec53,0xff6ff9c1,0x00058abe,0x004c25b8,0x000f3ffe,0xffe990ad,0xfff506aa,0xffdb79e4,0xffd77ed5,0xffc89318,0xffe478e9,0xffdf720b,0xffcf2f28,0x00022f79,0x0016619d,0x00136b91,0x00112d14,0x00146f86, -0x001a7a60,0x002b9753,0x002813db,0x000ccc46,0x0002ea2f,0x00022728,0x001a07dd,0xffeba7ee,0xffd42ae4,0xffc48e77,0xffb08101,0xffaeb6ed,0xffc24c35,0xffda7fba,0xffdca13b,0xffdf6efe,0xffe56492,0xffdb140f,0xffd53d3e,0xfff38652,0xff955cac,0xffbad574,0xffda0e60,0xfff17530,0xffff4653, -0x00029475,0x0007ae2d,0x000c57c9,0xffeccf22,0xffeef0ad,0x0002dcf2,0x00140f2c,0x00231efa,0x0033f90c,0x00026773,0xfff600c9,0xfffcc4b0,0x000b8d25,0x00192382,0x001c163a,0x0028fa37,0x001ea694,0x00137657,0xffd675d1,0xffb0dc61,0xff8b885e,0xff88b148,0xff79a361,0xff60605f,0xff46790a, -0xff261ee4,0xff0cf08f,0xfeead350,0xfeee2200,0xff0a0ac1,0xff64b4bd,0xffd1a73e,0xffdfe9c9,0xffdbddb5,0xffd1e4cb,0xffccd2db,0xffc1676c,0xffb1f56b,0xffa4e0cc,0xffba34d3,0xffce14d5,0xffe2697f,0xffe06f88,0xffdf9b7f,0xffe4c62f,0xffefe956,0xfffc1aa9,0x00040043,0x000c9ce4,0x00148b29, -0x0021556b,0x001a5bd4,0x0017da97,0x001ed2ab,0xffdc37cf,0xffa16db1,0xff58ada8,0xff51b871,0xff453f54,0xff37409a,0xff4a3f4d,0xff577963,0xff644984,0xff8dbe15,0xffb6e869,0xffda748e,0xffd37cbe,0xff961d53,0xffae015a,0xffb23bdf,0xffb7101c,0xffbc5de6,0xffc3bdf6,0xffcdf608,0xffd1db29, -0xffd7d132,0xffd81922,0xffd98d3b,0xffdd9078,0xffe35207,0xffe62f41,0xffe4dc19,0xffe2256c,0xffe04bbc,0xffdf13aa,0xffdc2556,0xffdc177c,0xffdf51bd,0xffcbf667,0xffc3e984,0xffbdc5e1,0xffbfb9b6,0xffb85b8a,0xffb99500,0xffb51b40,0xffb0963c,0xffa98d87,0xffa41f17,0xff941218,0xff97cc12, -0xff901956,0xff8eac10,0xff9a875d,0xffbd4d72,0xffbd795e,0xffbcd611,0xffbf460b,0xffc07e03,0xffc0c72d,0xffc0be5e,0xffc27552,0xffc300be,0xffc56f9f,0xffc85a96,0xffcb00bc,0xffcd2be8,0xffd0fd95,0xffcf6f6f,0xffcf5ec3,0xffcf4601,0xffceeee9,0xffcf5e1f,0xffcd10fe,0xffd01350,0xffd01e9f, -0xffd4042f,0xffc30c21,0xffc4bda8,0xffc6a838,0xffc3c015,0xffc167ee,0xffc07a2b,0xffbdd726,0xffbc79d2,0xffbcd84a,0xffbe64d0,0xffbe1c0d,0xffbea22e,0xffbe1004,0xffb65839,0xffeb87d6,0xfffa91ea,0xfffb4ee6,0xffed48a3,0xffe61a41,0xffe49e47,0xffdfb829,0xffe2b9e7,0xfff2e78c,0xffea33ca, -0xffe9c917,0xffec0d0b,0xffebb146,0xffe838ce,0xffdba52c,0xffde0a0e,0xffe0c6ee,0xffe7ae31,0xffef95bd,0xfff29b31,0xfff23ee7,0xffecd8f1,0xffe9b5ad,0xffe66188,0xffe6f715,0xffece082,0xffff96d8,0xfff8be88,0xfffab8e7,0xfffd74f4,0xffffb888,0xfffd6c97,0xffee43aa,0xfff89ad2,0xfff57982, -0xffeb23d0,0xfff8f519,0x00030f07,0x0000f22d,0xffe532d4,0xffd71857,0xffd3e2bc,0xffc6993c,0xffcc6046,0xfff02f10,0xffe1f733,0xffe9c694,0xfff35e41,0xfffc693d,0xffeaecdf,0xffc11fc6,0xffbc3972,0xffc0ec8d,0xffd638d7,0xffefe2c0,0xfffab169,0xfff66187,0xffe93b7c,0xffdb5a59,0xffd42914, -0xffd8cb23,0xffe9b507,0x001b2165,0x0008a818,0x000d62e5,0x001a8bc9,0x001679cf,0x00116dad,0xfff3f3e8,0x00143d03,0x000c91ab,0xffdacdd3,0xfff7adb5,0x00342232,0x0037d9fa,0xffe78810,0xffc1f57f,0xffc7881c,0xffa267ca,0xffaed400,0x000290df,0xffdaa01c,0xffe54bad,0xffecd3a4,0xfff40d34, -0xffd9befc,0xff932340,0xff91e6fc,0xffa03d14,0xffcbc58a,0xfffac68a,0x00100464,0x000738e2,0xffeb7c9b,0xffd4598c,0xffc7f565,0xffcaf114,0xffe8a031,0x0041bea2,0x00251f31,0x0031ff96,0x0045b93c,0x0052798d,0x00460549,0xfff7aa44,0x00302835,0x00237a0e,0xffdd7e2f,0x00239f5d,0x001cbbd3, -0x002d588a,0xffd76d7b,0xffbc4171,0xffbe11f8,0xff8338cf,0xff8aa886,0xfffa5557,0xffd205b4,0xfff13195,0x001fdd27,0x0043feec,0xfffa4056,0xff6da950,0xff4b0503,0xff58f451,0xffa17c25,0xfff92a36,0x001f73ab,0x000da9e7,0xffde1861,0xffbd7c25,0xffb2572a,0xffc1939f,0xfffb074d,0x00734963, -0x00916e66,0x00a0f1c8,0x0070e813,0x0076f3a9,0x006f691d,0x0028413d,0x008e3f59,0x00723bdd,0xffc1e7dc,0xfff659d5,0x015941f6,0x00aeb448,0x000f2d33,0xff8c4749,0xff218296,0xffd67b46,0x0018494a,0xffb6d82c,0x00264f29,0xffe69cca,0xff305aef,0xff17b47f,0xff433175,0xff91d2f7,0x0018a93d, -0x004cb4fd,0x002b96e3,0x00351724,0x003b9eb3,0x0052747f,0x0057f7d8,0x00456e6a,0x0028efc9,0x0032f11b,0x00145e05,0x00159419,0xfffb93e8,0x004ec6e3,0x010c028c,0x005fcf5f,0xfffe375f,0xffd26772,0xff31bb76,0xff5ca844,0x00580c98,0x013abc60,0xfdf38f30,0xfee315b4,0xff24fb8c,0xfff14596, -0x00cc3dae,0x0073a509,0x001c28d0,0xffc01d01,0xff589de8,0xff982339,0x00c345d2,0x002a4b4d,0xfff8d7de,0x001aaef0,0x0035491d,0x003eae82,0x0008fb55,0x00025b87,0xfff87472,0x00033076,0x00228293,0x003775c0,0x00306e21,0x000bfdfb,0x002856e8,0x0051438b,0x008cabe0,0x007ec2b0,0x0029e9ca, -0x0025346d,0x002f67d4,0x00608a19,0x00b51bee,0x00af99ca,0x0037755a,0xfe6573ca,0x0191ee88,0x0193b266,0x010b8bac,0x008d53b4,0x00074f5e,0x00ff492a,0x00eaea6a,0xff9066bc,0xffb59438,0xff944351,0xff94b4ee,0x00146e1d,0x00754cb4,0x009e218b,0x008ad955,0x00552db7,0xffe683c6,0xffebd1e7, -0xffea9343,0xffd9cd14,0xffdb5ea1,0xfff4a412,0x0006fc4c,0x0020fbe2,0x0034d940,0x002101ac,0x0014d07c,0x0015ee13,0x0019fa35,0x005a2db1,0x0073b387,0x008db67b,0x002c2647,0xfff2d456,0x0052c58e,0x01326764,0xff20ee08,0xff4d24f2,0xff714887,0xffd1b122,0x0030119e,0x004520ac,0x0059746d, -0x003bb9b5,0x00d80025,0x00dd2623,0x0091c9da,0x006763cd,0x002eb9c1,0x002f1aaf,0x002fdf9a,0x00405ab8,0x002a5315,0x001838c7,0xfffb164d,0xfff4ebce,0x000356d1,0xfff5da01,0xffcb22e4,0xffc7e840,0xffd96407,0xffec748b,0xffeddc7d,0xffff855d,0x00086936,0xfff96383,0xffef8a6f,0x0005f673, -0xffefcdf2,0xfffd3034,0xfff6e0c6,0xff668310,0x003c2a6a,0x007c5375,0x00462803,0x00192f82,0x000fdc2f,0xfffc9065,0x0015b569,0x0035f7eb,0x000f95b2,0xffecdd59,0xffc79239,0xfff38101,0x0009963f,0x00071ccc,0x00106e93,0x001c0292,0x0028772c,0x003280d3,0x002ad7a0,0x000c4b04,0x000618bc, -0x0002f1cb,0x001778d0,0xffe6aad9,0xffcbf1bd,0xffca8888,0xffaf69f6,0xffb7899f,0xffdd6a3c,0xffec5a0a,0xfff3ba0e,0x00019e36,0x0010692c,0x00137838,0x00175101,0x002ad6e9,0xff7cf15b,0xffb3c90d,0xffcdcd9b,0xffe82de9,0xffec71d4,0x0002b56c,0x0006732e,0x00059052,0xfff684b5,0x0001dcb4, -0x000f6b03,0x002255e2,0x00278dbd,0x002bd815,0x000581c7,0xfffab878,0x0014c3a9,0x00173bbd,0x001f7ef7,0x00203325,0x002f7fd4,0x001a8dd2,0xfff269c2,0xffc1b0b1,0xffaa1232,0xff9933c4,0xff999102,0xff87f1a3,0xff69fb1a,0xff506672,0xff3716c1,0xff2b4d62,0xfef67552,0xfeecdf18,0xff02eb65, -0xff47bccc,0xffe4d77a,0xfff75e63,0xfff5d97f,0xfff4b4f0,0xfff8518e,0xffeea27b,0xffe43fd4,0xffd9183a,0xffe4b8fe,0xffec8bc4,0xfff776d8,0xfff08799,0xffea2b17,0xffe681f2,0xfff75e32,0x0005bf80,0x000f5917,0x0012f273,0x001a3f7c,0x0020b7b4,0x000dd5b2,0x0005e5aa,0x00039858,0xffd003e6, -0xff989549,0xff5cdc37,0xff504682,0xff4cb0db,0xff3cb55a,0xff4d931c,0xff50c077,0xff579e10,0xff87a0c3,0xffb4e9cb,0xffdab7ed,0xffdc9e34,0xffaf8484,0xffbf6ac6,0xffc06991,0xffc1309d,0xffc272da,0xffc56be1,0xffcabc5d,0xffcc7561,0xffd28b5d,0xffd565dc,0xffd82779,0xffdc131e,0xffe29943, -0xffe5b8d6,0xffe2d54f,0xffde9305,0xffdc7699,0xffdaf1cf,0xffd825c4,0xffd8686d,0xffcfeebd,0xffc890d9,0xffc145af,0xffbd5216,0xffc1576a,0xffc08aa1,0xffc61f25,0xffc5bca7,0xffc3cead,0xffc25cb3,0xffc1dfb0,0xffb7ddcf,0xffb7eef0,0xffae157a,0xffac7e5c,0xffb473e2,0xffc054a1,0xffc5a5ba, -0xffc370a0,0xffc44ed7,0xffc4278a,0xffc3d968,0xffc315fe,0xffc2b6ee,0xffc3c37d,0xffc56894,0xffc7b317,0xffca1038,0xffcb96bd,0xffcf04e4,0xffcd3cf4,0xffcd0962,0xffcc82a5,0xffcc0191,0xffcb8fcf,0xffcba4ba,0xffc7198c,0xffc42ab1,0xffc15bcb,0xffbfb772,0xffbb0bdd,0xffb62f79,0xffb5b740, -0xffb55889,0xffb73630,0xffb69970,0xffb76e11,0xffba2cf3,0xffbeab0d,0xffc2d2b4,0xffbba3bb,0xffbebe7a,0xffb46a94,0xffeba32a,0xfff7d508,0xfff71e62,0xffec5162,0xffe6b07c,0xffe61fc1,0xffe1831e,0xffe41b0c,0xfff11eb4,0xffeaf0b2,0xffeb9cfd,0xffee7103,0xfff12c1d,0xffee1bb0,0xffe0763a, -0xffe0485e,0xffe10759,0xffe66e77,0xffecbc12,0xffef9cd6,0xfff1da88,0xffeaea3d,0xffe78f7b,0xffe3453c,0xffe646e7,0xffeb1064,0xfffcc6d8,0xfff2a5c4,0xfff49b79,0xfffc1a43,0xfffc518d,0xfff9d3f7,0xffec4846,0xfff53a06,0xfff39db6,0xffe601d6,0xfff63e9f,0xfffdc33d,0xfff7e247,0xffe4483c, -0xffd95929,0xffd8e8d3,0xffcd2af2,0xffcfdaab,0xffeb1340,0xffe0ad7a,0xffec2cd6,0xfff9589d,0x000bb154,0xfffca765,0xffce2535,0xffc34ac9,0xffc19a78,0xffd30ba2,0xffe668e1,0xfff1e3dd,0xfff52e11,0xffe6b63c,0xffda9ae1,0xffd104ff,0xffd7cfaa,0xffe76339,0x00183b04,0x00003b35,0x00056483, -0x001bce9b,0x0014be14,0x00111225,0xfff83fe6,0x00102957,0x00052ac7,0xffd3cfb3,0xfff4ec52,0x002962ba,0x001e646c,0xffe3cb31,0xffc56527,0xffcd1569,0xffac9708,0xffb681f2,0xfff7999e,0xffdcdbdd,0xffeeb968,0xfffa0676,0x0012940f,0xfffa5618,0xffa9ef48,0xff9ec064,0xffa04d21,0xffc4a4c8, -0xffe8670f,0xfffdede9,0x00034ddf,0xffe728f2,0xffd1d772,0xffc43ea9,0xffca8e7d,0xffe2b215,0x0040cf51,0x00123585,0x002248f9,0x0048a41e,0x004ff593,0x00423279,0xfff996d8,0x0025412e,0x0018dadc,0xffd09375,0x001eff99,0x00136fd3,0x000e559f,0xffd59d89,0xffc330cd,0xffca22b9,0xff9d3f4d, -0xff966d69,0xffe2b790,0xffcbed1c,0xfff83aa6,0x002d6dc6,0x0070e350,0x0031f8d9,0xff92e455,0xff63efb2,0xff5c5589,0xff95eb93,0xffdb31dd,0x00051ecb,0x000f0654,0xffdf0afc,0xffc11ee5,0xffb33f21,0xffba9e31,0xffec7212,0x0072161a,0x00745b45,0x0082be63,0x00767d27,0x00814976,0x00779def, -0x00317dae,0x0088fed5,0x0059da3c,0xffa6f33f,0xffed139e,0x0136c02e,0x007e4e72,0x000178a9,0xff87ecb5,0xff2c1012,0xffa85af8,0xfffe0ad9,0xffef91ac,0x003255c6,0x0002f347,0xff72770a,0xff2ec662,0xff454143,0xff862251,0x00013e38,0x0037508a,0x00223b67,0x00221b83,0x00244da3,0x003fa47b, -0x003cfb8b,0x002b8366,0x001085df,0x003600a3,0x0018fd6f,0xfffcd62c,0x000499e5,0x004da360,0x00cfee0f,0x0045f725,0xfff07f1d,0xffab48a7,0xff200025,0xff6a1f10,0x0073208c,0x0133818e,0xfe2a189a,0xfef0c8bc,0xff1efe4f,0xffee95f9,0x011593dc,0x0077ec79,0x00144e7f,0xfff44bfe,0xff696eb3, -0xff9b8a67,0x00adc373,0x002eacee,0xffff446a,0x001164c9,0x0015d945,0x0013c856,0xffea3abe,0xfffab5d5,0xfffe09f4,0x0005bba2,0x001c99ab,0x0033633c,0x002ab166,0x000c266c,0x002a0fde,0x00589a35,0x007933e8,0x006148c3,0x0015215d,0x000e6b36,0x00237221,0x007693d5,0x00de0178,0x00a86dd8, -0xffacbc49,0xfe76b28e,0x01557474,0x01864068,0x00ce1bc0,0x0025d4da,0xffa171fd,0x008f5e97,0x00c2ea0d,0xfff54fc4,0x00041e58,0xffc68926,0xff8e89c5,0x001f0239,0x007a262b,0x009bc50d,0x008be9c3,0x005a83ad,0xfff3e487,0xffeb7e55,0xffea310e,0xffe52ea7,0xffe16fbd,0xfff4d0c3,0x000307d6, -0x002f6873,0x00389869,0x000f3b9f,0x000948cd,0x000dba77,0x0011cb99,0x005c873b,0x0078677a,0x0092eb40,0xfff53efb,0xffafb54e,0x00249d93,0x00f87a84,0xff327b6a,0xff3c1dc3,0xff643fc2,0xffbec9a9,0x000c3005,0x00046302,0x000528dd,0xfffcb0d4,0x00c0c263,0x00e9e901,0x008a4cb6,0x0089a293, -0x005e346f,0x004adc54,0x002872a4,0x002d85c3,0x0019e1fe,0x00045cb8,0xffe8a2c7,0xffd79a18,0xfff01cbe,0xffea09aa,0xffc2867f,0xffbc680d,0xffcf3e5c,0xffedda5b,0xffdb0ff4,0xffe6a512,0xfffb1425,0xffec91b9,0xffed8464,0x000be415,0x00006008,0x0004889d,0xfff22a31,0xff73c537,0x006258a5, -0x009911b1,0x0086e393,0x006623f2,0x004dd57e,0x0035f938,0x0055d4df,0x0090cbc2,0x003a89e8,0x0000d663,0xffc87052,0xffdca848,0xfff04392,0xfffc9ebf,0x000d3603,0x001c6365,0x00296381,0x00324aee,0x002be6b6,0x000d534f,0x000d012b,0x0004da33,0x0009c5e2,0xffe48ff1,0xffc97a18,0xffca6138, -0xffb6c8ee,0xffcac76d,0xfffbfc04,0xfffc3a48,0x0003a22f,0x00165a4f,0x002790dc,0x0034e2bf,0x003bb5db,0x004b752f,0xff647dfb,0xffa06462,0xffadfbe2,0xffc918a1,0xffd23933,0xfff312a6,0xfffc1fe7,0x000401d1,0x0002f433,0x001568c7,0x0022db37,0x0032b217,0x002c205e,0x0020d27e,0x000a3f2a, -0x00059fef,0x00288771,0x00221062,0x0024573a,0x0023b178,0x002cdc75,0x0010d7b1,0xffd74af0,0xffb28339,0xffa71e9d,0xffaae2e8,0xffa94e28,0xff950408,0xff79071f,0xff5ef9fd,0xff4c3ffa,0xff4b4aa6,0xff0c3841,0xfef9f224,0xff05f8c3,0xff331e2a,0xffeaaa62,0x0002fb6a,0x0003b82a,0x00099a05, -0x0012182a,0x000dd3d5,0x000c8aa2,0x00096ffd,0x000cd620,0x000cdd7c,0x0011208b,0x00079d59,0x000070a8,0xfff93dc0,0x000af53d,0x0017e898,0x0022d703,0x00228119,0x002887f3,0x002bde9b,0x000aaf38,0xfff871e0,0xffe80db9,0xffc88b17,0xff9c2ef7,0xff73933d,0xff5f7498,0xff5edff8,0xff4a72cd, -0xff581853,0xff5460d4,0xff55783e,0xff80ae6a,0xffa83975,0xffc71697,0xffd6a1fa,0xffc0ec56,0xffcee74a,0xffce186f,0xffcd0341,0xffcc43a7,0xffccbc49,0xffcdb3eb,0xffcd999c,0xffd349ff,0xffd7c18b,0xffdb96ac,0xffdfed9b,0xffe62a67,0xffe95ea9,0xffe68ed3,0xffe2edec,0xffe1302a,0xffe0f245, -0xffdf0654,0xffe176b9,0xffd21f33,0xffd21fa7,0xffca0a22,0xffc51feb,0xffc7603f,0xffc956c3,0xffd05f50,0xffd21065,0xffd1012c,0xffd293cf,0xffd39123,0xffcf54b4,0xffccd4de,0xffc4e10f,0xffc4097e,0xffc91a2c,0xffcf5fd7,0xffdad90c,0xffd69cc7,0xffd61cc9,0xffd4bbdc,0xffd3a152,0xffd266c8, -0xffd08afa,0xffd20e84,0xffd31d36,0xffd499a1,0xffd64b0a,0xffd73105,0xffd9bc72,0xffd889d4,0xffd8a680,0xffd85b99,0xffd82185,0xffd7815f,0xffd98333,0xffcefe44,0xffc9292c,0xffc06e7e,0xffcba477,0xffc1978d,0xffb66b11,0xffb7ae79,0xffb87292,0xffbbf197,0xffbc7213,0xffbe7808,0xffc178be, -0xffc8568b,0xffd1447e,0xffc25d5a,0xffca6fac,0xffc91980,0xffed7a93,0xfff7c3f3,0xfff52e7b,0xffed7dfe,0xffe951bf,0xffe97345,0xffe500d3,0xffe6e2ad,0xffefb5e9,0xffed502f,0xffef2fa3,0xfff2d829,0xfff69752,0xfff39741,0xffe5dfac,0xffe3bc6f,0xffe2fb69,0xffe6b14e,0xffebce38,0xffee8e2b, -0xfff2116c,0xffeb402f,0xffe836d6,0xffe301f6,0xffe82bb5,0xffeca9b2,0xfffccea5,0xfff104c7,0xfff31619,0xfffe9317,0xfffc2414,0xfff990ba,0xffef04c5,0xfff53c9a,0xfff4a6a9,0xffe6785b,0xfff6e134,0xfffc4c89,0xfff43451,0xffe6e94a,0xffde7780,0xffe02879,0xffd4eafd,0xffd44de8,0xffe58d5d, -0xffe2009b,0xfff0c802,0x000185aa,0x00167b61,0x00099e26,0xffdb316f,0xffcb7b70,0xffc4aa3e,0xffd16e61,0xffdf8e8d,0xffeaaa87,0xfff34f07,0xffe63578,0xffdaf508,0xffcf3afa,0xffd9d2bc,0xffe882ad,0x0015890c,0xfffc05ec,0x0001c8ce,0x001fb533,0x00141a9f,0x0010ff7c,0xffffbac1,0x000e0443, -0x0001c0ff,0xffd61770,0xfff60cbe,0x00216b4e,0x000cbc15,0xffe5b7b6,0xffcd6acf,0xffd66fc9,0xffb7fab3,0xffbeb027,0xffe93974,0xffe21ea6,0xfffab1f6,0x000998f4,0x00290b3a,0x001270b5,0xffbe4b78,0xffac5c72,0xffa3b003,0xffbe9f57,0xffd9883c,0xffed88a0,0xfffdbbd0,0xffe2ff16,0xffcf9627, -0xffbfe696,0xffcdaae4,0xffe1bc92,0x003f394e,0x00071b48,0x001962fa,0x00512ba7,0x004c9a55,0x003e97e1,0x0001cbf9,0x001df9aa,0x0013a820,0xffcfffcf,0x001e0e1f,0x0010eb69,0xfffdcaec,0xffdc8240,0xffcec352,0xffd9bfbc,0xffb4c4fc,0xff9fa674,0xffc7813b,0xffca7577,0x0001fb55,0x003d2101, -0x008ca9f6,0x0059c334,0xffb635de,0xff7da612,0xff650fb5,0xff8bee53,0xffbf9de2,0xffe97dcb,0x0008efa2,0xffe0bcef,0xffc44eec,0xffb3b3c6,0xffb97a88,0xffe2ed4b,0x0070962d,0x005a99f0,0x00683447,0x0082cfc5,0x008b99ee,0x007cc249,0x003d3443,0x007f2bfc,0x00448eb8,0xff9ef94c,0xffee516e, -0x01043660,0x004d5fb8,0xfff427ac,0xff8d52db,0xff44b5a6,0xff89f1cf,0xffee3ae5,0x002965e7,0x00405389,0x001f432c,0xffbcc17e,0xff43b5b9,0xff45c106,0xff88ae20,0xffebd570,0x001f79fa,0x001b2b22,0x00135ee1,0x000f2c8c,0x00254355,0x001e63e8,0x00122696,0xfffb51d4,0x00391537,0x002000dc, -0xffe6e6ae,0x00154b22,0x005139e4,0x008b0a67,0x0032c02d,0xffea6514,0xff91d29c,0xff24cc40,0xff86daba,0x008b2d2c,0x011e5e1a,0xfe6e4276,0xff20bc54,0xff2f0ffd,0xfff5db44,0x0154638a,0x0085b655,0x0019772f,0x002e4206,0xff808d0a,0xffa0a3cd,0x00843db3,0x0031725b,0x000a16ad,0x0001346a, -0xfffb6436,0xfff3acc6,0xffdbf9bd,0xfff52cec,0xfffe61f9,0x00092bda,0x00112d15,0x00257a6a,0x0024e288,0x000ff3ff,0x002f56d8,0x005bc3e4,0x0064d7b1,0x00430c94,0xfffd4e4a,0xfff81aca,0x001dd17d,0x0091ba40,0x00fba9c9,0x00901e6d,0xff353902,0xfe93a8d0,0x01002a8a,0x01814418,0x008f7ba3, -0xffbf0830,0xff3d0fbe,0xffda634f,0x005ad183,0x0082d0ba,0x003fb8ba,0xffec00f2,0xffa69888,0x002376db,0x006e1627,0x0086ba91,0x007ee21b,0x0058316d,0x000943d7,0xffeca4f3,0xffe7c089,0xfff3d6ab,0xfff04a9e,0xfffbb20d,0x00019c75,0x0037d161,0x003706bc,0x0004fcd3,0xfffd45d7,0x00042f76, -0x000b55c0,0x005c2848,0x0072c673,0x007c517b,0xffc3f17e,0xff7f737b,0xfff9b552,0x00a02d28,0xff55de1c,0xff344861,0xff6534d6,0xffb5bbfc,0xffeced86,0xffd3bf1d,0xffcdc281,0xfff48477,0x009e1368,0x00dd31ce,0x0085d053,0x00a60d1b,0x008a1fb0,0x0060d1ac,0x00224d5d,0x0013c867,0x0008337b, -0xffef6aa6,0xffd93542,0xffc47821,0xffda3469,0xffda6d7a,0xffbf310b,0xffb6aad6,0xffc83989,0xffed547b,0xffd10c55,0xffd7efe4,0xfff27a94,0xffe7e7bb,0xfff4bfbe,0x000f90ef,0x00143bff,0x000f4ab0,0xffecd716,0xff93d5f9,0x0077864b,0x00a63346,0x00be3cee,0x00b50243,0x009c212b,0x0075002e, -0x0086d4b4,0x00c26adf,0x00657ded,0x002395cc,0xffd92b90,0xffd203ed,0xffd703d5,0xffee7777,0x0009bec8,0x00191b58,0x00222601,0x002c5e49,0x0028ee75,0x000fc057,0x0011f89d,0x00039cb1,0xfff669cd,0xffe07a6e,0xffc96a32,0xffc8adee,0xffc6fcea,0xffe52c45,0x0014efd0,0x0008194d,0x000ba583, -0x001b29b1,0x002c14a2,0x003ffd7e,0x004cbe75,0x0059d276,0xff4f3b99,0xff91f370,0xff9107e4,0xffa94510,0xffbbcc6c,0xffe318de,0xfff67a8a,0x000933c7,0x0012fa68,0x0027958a,0x0035ee75,0x003d9a11,0x00324703,0x001e5682,0x0013469b,0x00173ef2,0x0032a769,0x002aa453,0x002920d6,0x00274a4a, -0x00212c30,0x0000e096,0xffc4b43a,0xffacc3af,0xffa9171c,0xffb89b81,0xffb46413,0xffa06ff3,0xff8c3a1f,0xff727b6c,0xff64ec7a,0xff6c46ac,0xff303d4e,0xff17027e,0xff1089b1,0xff259b09,0xffe65229,0x00014d57,0x0004521d,0x000f2c8c,0x0018c239,0x001b82c0,0x00231e6f,0x0029eb81,0x002a3098, -0x0027bfd8,0x0029992a,0x001ee9e7,0x0018b575,0x00120aa8,0x001e3a3b,0x00264f9c,0x002f9652,0x002dc896,0x003042bc,0x0034b5ba,0x000c9a48,0xffeef290,0xffd201eb,0xffc5ba30,0xffa9207e,0xff961b7d,0xff7a857a,0xff770f23,0xff5c6a6a,0xff6482c4,0xff5b375d,0xff562831,0xff788c23,0xff98294f, -0xffaf72f3,0xffcb4dd2,0xffd1a214,0xffde1113,0xffdb7014,0xffd96208,0xffd7c8dc,0xffd650f4,0xffd38dc9,0xffd123f1,0xffd59b27,0xffdab4b1,0xffdf9f70,0xffe54a1e,0xffeafe23,0xffedddcc,0xffeccd37,0xffeb4f81,0xffeaa8be,0xffebc1f6,0xffeb41f4,0xffef1a70,0xffdcfde4,0xffdffd70,0xffd7e42c, -0xffd1eadf,0xffcff447,0xffd1c514,0xffd77844,0xffd9bf6c,0xffd7eb8e,0xffda7ffa,0xffdaf297,0xffd95241,0xffd7fbbf,0xffd4011e,0xffd4fecc,0xffd85ec4,0xffe62c53,0xfff2ebd8,0xffed9683,0xffebc4f9,0xffe92ec0,0xffe7345b,0xffe59cfa,0xffe2c04c,0xffe52898,0xffe617c2,0xffe6de7d,0xffe7d459, -0xffe899fb,0xffeaca8d,0xffea486b,0xffeab103,0xffead285,0xffeb154e,0xffeacaa2,0xffedd366,0xffe225e0,0xffdbeffb,0xffd0c542,0xffe059c8,0xffd583a3,0xffc78779,0xffc90b13,0xffc9c983,0xffcd8289,0xffcdd618,0xffcfd515,0xffd1a632,0xffda14b7,0xffe44a81,0xffd530ac,0xffdfc7fe,0xffe63419, -0xfff0afab,0xfff89a46,0xfff5ccc1,0xfff06ccf,0xffed560e,0xffed3057,0xffe928fe,0xffea6377,0xffef5510,0xfff1044b,0xfff3f492,0xfff7f304,0xfffb7107,0xfff88203,0xffec80a6,0xffe884a1,0xffe6aa53,0xffe8a44c,0xffecba88,0xffef2247,0xfff33f1f,0xffec2bb4,0xffe8fac5,0xffe2ce53,0xffeb672e, -0xffef1bf9,0xfffc8a70,0xfff0cfc4,0xfff32033,0x0001597c,0xfffc0cd6,0xfff960ad,0xfff2613b,0xfff66155,0xfff75c84,0xffe91a76,0xfff7e0d7,0xfffdb32a,0xfff5fd56,0xffeda9bf,0xffe66070,0xffe77a2c,0xffdc3923,0xffd8dbdb,0xffe1f1c9,0xffe6581c,0xfff71d98,0x0008f188,0x001c981a,0x001293f0, -0xffe9e3e8,0xffd54c0b,0xffca59e6,0xffd1eb0f,0xffdb922c,0xffe52ce0,0xfff03bc1,0xffe41823,0xffdae319,0xffcdeb65,0xffddffce,0xffebf81a,0x0012162b,0xfffb3851,0x00013d32,0x00230c00,0x0013b812,0x00112246,0x000785dd,0x000df7ef,0x0001f9e7,0xffde9eee,0xfffb1840,0x001b5efe,0x000382a9, -0xffeca8a8,0xffd8c969,0xffde2b65,0xffc10299,0xffc4c45b,0xffdc93ae,0xffe9b93c,0x000718ae,0x00161f74,0x003587f3,0x002196fc,0xffd5b60f,0xffbc033c,0xffaba666,0xffbc78ea,0xffcf2c81,0xffe02059,0xfff62119,0xffdd0458,0xffcc1206,0xffba4958,0xffd3ed60,0xffe527fd,0x003acc79,0x0002dc33, -0x001676d5,0x005a0035,0x004770a5,0x003a033d,0x000baf02,0x001af41f,0x0013b070,0xffd74a18,0x001e154e,0x001756bb,0xfffe78fc,0xffee11fe,0xffe0ea11,0xffe8bade,0xffc6111f,0xffa61dbf,0xffb2aef3,0xffcf701d,0x000c87e6,0x00465824,0x0095508c,0x00735bac,0xffe00d57,0xff99f44f,0xff72ebf1, -0xff86ad11,0xffa8b9da,0xffcdf965,0xfff9164d,0xffdb5f5c,0xffc2e237,0xffb07357,0xffbd85ce,0xffe08d43,0x006d65e7,0x0046b960,0x0053b95e,0x009211b1,0x0094af6d,0x007f2189,0x0048e98c,0x0074de8e,0x003615df,0xffa6b9c2,0xfff8d254,0x00c27261,0x00197446,0xffe6bd1b,0xff951b0a,0xff5e34a6, -0xff71e7cd,0xffde1ffb,0x0052a887,0x004d573c,0x003ab3f4,0x00044777,0xff592d13,0xff46076b,0xff8b45a5,0xffdef51f,0x0010f4cd,0x0019ff9f,0x000fa275,0x0004d7c7,0x000e8fa9,0x0002d225,0xfffd6403,0xffedf583,0x003951b4,0x002631ce,0xffd7d37b,0x002c1845,0x005a278f,0x004cf031,0x0023abb5, -0xffe4cd29,0xff8794da,0xff3ae2ad,0xffaa1848,0x009994fc,0x00f72385,0xfebdd848,0xff6811cf,0xff4c20c1,0x0003760d,0x017d3a32,0x009f74f1,0x002c3239,0x0056ccc3,0xff929452,0xffa2921c,0x0055bacd,0x003f5acf,0x002177ee,0xfff253d7,0xffe476d6,0xffd9818d,0xffd94923,0xffeda38a,0xfff50560, -0x00000074,0xfffe82ca,0x0010ca62,0x002093ed,0x00135041,0x0033ba22,0x0057e3f9,0x004f0d72,0x002552aa,0xffe45fa4,0xffe9b13b,0x002154f6,0x00a790b8,0x00fa98bb,0x0065bcd4,0xfef0f224,0xfebe8506,0x00a2e0de,0x0180229e,0x005a50cd,0xff6d7602,0xfee48d06,0xff27f5a9,0xffe755a9,0x0112d7de, -0x0064c3bf,0x00004a2a,0xffd47d84,0x0022ab99,0x0058dca5,0x006f9651,0x006ad6fb,0x004ef6cb,0x0020ddb0,0xfff3d5cd,0xffec771a,0x00066d42,0x00039a70,0x00081afb,0x0005d6ae,0x00399907,0x002f0ee0,0x00016eed,0xfff24485,0xfffabb20,0x000822ca,0x005734ae,0x00607267,0x004fe552,0xffa910dd, -0xff6fe05e,0xffdd23da,0x003e0352,0xff828037,0xff33711d,0xff6bfa23,0xffb1d74b,0xffd4cfd0,0xffc1ef6f,0xffbe6ee1,0x0012e424,0x0076d283,0x00be5724,0x008d29f1,0x00b77180,0x00a4cec8,0x006f7188,0x00244fa3,0xfffbff87,0xfff0b787,0xffd7e046,0xffc95b6d,0xffbbba53,0xffc743ce,0xffcb53bf, -0xffbe7d85,0xffb84656,0xffc78cba,0xffeba3d9,0xffd01f70,0xffd2c6ef,0xffed15d6,0xffe6c7d4,0xfffdb72e,0x000dda88,0x0020d3d5,0x00162972,0xffec29f9,0xffbe4e44,0x007941ff,0x0093233c,0x00d95816,0x00eb32dc,0x00d4f5aa,0x00a53bee,0x00a246d5,0x00ca0faa,0x0080acfa,0x00474fe2,0xfffb5023, -0xffde3041,0xffd08f3f,0xffde0688,0x00021cb5,0x00151609,0x00200887,0x00262633,0x0023756b,0x0013bae0,0x0011d2af,0xfffe4f8c,0xffe479cc,0xffd886fc,0xffc913b9,0xffc8c084,0xffde2afd,0x0002a873,0x00244726,0x000ecde9,0x000cc764,0x00152529,0x0029a879,0x0042ccab,0x005541ca,0x005a5e26, -0xff466efd,0xff8ccf81,0xff896446,0xff9f029c,0xffb3dce0,0xffdeb20d,0xfff88308,0x00101cc2,0x001e76a1,0x00302a36,0x003e4069,0x003cf090,0x003510ea,0x00221b5b,0x0020a696,0x0027eaa4,0x0035921b,0x002f9655,0x002a55c2,0x0027426c,0x0010782c,0xffed1aae,0xffb7a820,0xffb0c418,0xffb21cc7, -0xffbf9a2e,0xffba9581,0xffaa34ea,0xffa1786d,0xff8b65f2,0xff83598d,0xff8fc052,0xff61a5bb,0xff420dc5,0xff23af62,0xff25580c,0xffdab681,0xfff74393,0xfffb7033,0x0007e81f,0x00103dda,0x00188c3a,0x0026cd96,0x0036bc69,0x0038483f,0x0036c394,0x0037bc62,0x002f507f,0x002b8bd0,0x002863b9, -0x002cc305,0x002e9d9a,0x00319358,0x002da421,0x002a22c8,0x002dc622,0x0009f705,0xffe87ed6,0xffc6b3bb,0xffc73016,0xffb95375,0xffb6add2,0xff9819b6,0xff8f2ff3,0xff709e89,0xff71651d,0xff62a685,0xff576583,0xff70366b,0xff87914b,0xff97fa56,0xffbd2124,0xffe01697,0xffea9184,0xffe6ef32, -0xffe4e927,0xffe3c4a9,0xffe15d69,0xffdc22ee,0xffd745ad,0xffd9f3f9,0xffdf54b9,0xffe596d6,0xffecc6f2,0xfff29eb3,0xfff66b79,0xfff71ac8,0xfff836fe,0xfff9db4d,0xfffc2078,0xfffdaea8,0x0001eb3e,0xffee3088,0xfff04733,0xffe89e52,0xffe227af,0xffdb61e6,0xffdaf903,0xffdde1b2,0xffdfd6ce, -0xffdcf2d8,0xffdf1148,0xffde2e3c,0xffdc6b01,0xffde20dd,0xffde551b,0xffe0b1d4,0xffe30133,0xfff91bb0,0x0002f147,0xfffdb3db,0xfffafb85,0xfff77d59,0xfff4f28d,0xfff363c6,0xfff07829,0xfff3e395,0xfff4e2c5,0xfff51fa0,0xfff583d4,0xfff64670,0xfff83e80,0xfff89080,0xfff9498f,0xfff9bac5, -0xfffa93ed,0xfffacc64,0xfffe9257,0xfff5318a,0xfff0c03b,0xffe70832,0xfff2de55,0xffeae7ab,0xffde9e6d,0xffdf4a7a,0xffdf3865,0xffe1f116,0xffe15e7d,0xffe2ab95,0xffe2ddb3,0xffea982f,0xfff27f78,0xffea49de,0xfff36c5a,0xfffa90fa,0xfff3a14f,0xfff9bda0,0xfff70e24,0xfff3a236,0xfff113d0, -0xfff02d2c,0xffec1a6d,0xffece2ad,0xffef928b,0xfff46a32,0xfff8132c,0xfffb9d3c,0xfffe9847,0xfffbfb6d,0xfff31673,0xffed1f02,0xffea69b9,0xffeafb57,0xffedc776,0xffefaf26,0xfff3b302,0xffed3c62,0xffea8aec,0xffe414fe,0xffef222c,0xfff2831d,0xfffcf2f1,0xfff31330,0xfff5966f,0x0004532a, -0xfffd1a21,0xfffa5c04,0xfff6d89f,0xfff88127,0xfffa1f47,0xffee3a66,0xfff9a45d,0x000252ff,0xfffa8874,0xfff60b6e,0xffeee792,0xffeda295,0xffe07127,0xffdb1e89,0xffe06aa0,0xffeb50c6,0xfffc728f,0x000c9892,0x001e57ff,0x0017ff85,0xfff8a9e0,0xffdf0ca5,0xffd0d4f8,0xffd39854,0xffd89aad, -0xffdfdce4,0xffeb504a,0xffe17b8b,0xffda78aa,0xffcd25a2,0xffe3fd35,0xfff152f6,0x000d1eb4,0xfffc21af,0x0001ace3,0x0023470a,0x0011ee6b,0x00106d9b,0x000e7a03,0x000ef1c6,0x0004b7d0,0xffeac333,0x00021173,0x00175241,0x00002ad3,0xfff645f6,0xffe4fa1e,0xffe45a6b,0xffc4afba,0xffc68192, -0xffd4dfd4,0xfff1799e,0x0010fbdc,0x001b6997,0x003924a3,0x0029b0bc,0xffef9535,0xffcbc0e9,0xffb59130,0xffbdc67e,0xffc7194c,0xffd3aa37,0xffec3775,0xffd64bc2,0xffc8f7c7,0xffb51f08,0xffdd69bd,0xffec9051,0x003207c2,0x0003ec81,0x00165eaf,0x005d9051,0x003ed69c,0x0033d265,0x0015d928, -0x001aac40,0x00171b04,0xffe47061,0x001e16d2,0x0024f7f0,0x000a762f,0x000626bf,0xfff82d6f,0xfff7908c,0xffce0ffd,0xffa72be2,0xffa81fa3,0xffd8ddad,0x00142678,0x0043d5ee,0x008eb6b8,0x008281bb,0x000e8aed,0xffb6ad78,0xff83599b,0xff86cfcf,0xff959b44,0xffb25d93,0xffe265c3,0xffcf402a, -0xffbcca8c,0xffa87241,0xffc6cea8,0xffe5f72a,0x00660f7a,0x0038bd27,0x0045c808,0x009f0ba0,0x009a685c,0x007f9523,0x0055d43e,0x006d39cf,0x0030901b,0xffbd0983,0x000afc14,0x00738dc8,0xffe50ad5,0xffd3a180,0xff9533cb,0xff64fa8b,0xff5f0b16,0xffcde74f,0x0066110f,0x0052de2f,0x004e9128, -0x003fd979,0xff731e2d,0xff4b320d,0xff88aec4,0xffdac800,0x000bdc70,0x001a17e1,0x00151341,0x00050e9f,0xffffb113,0xfff04ca0,0xfff0c119,0xffed41aa,0x00357956,0x00289542,0xffd0b5f9,0x0045cf85,0x00669d6f,0x001ea3cc,0x00153918,0xffda6206,0xff85cf76,0xff5b4cc1,0xffce25dc,0x009c7875, -0x00b9eefc,0xff15acbf,0xffb2741f,0xff72eb92,0x00162b3e,0x01879b86,0x00bb3f19,0x004907b1,0x00701cc9,0xffa6fb0d,0xffa73440,0x002aab5c,0x005b0435,0x0045bfc2,0xffe006e8,0xffd1b786,0xffc3625a,0xffd4eed7,0xffe2383a,0xffe4d3a5,0xffea46ac,0xffe5980a,0xfff8909f,0x001dc516,0x00144eec, -0x0034704a,0x004e56bc,0x003898f3,0x00091746,0xffcd5bae,0xffe52338,0x0029f0ba,0x00abcf8a,0x00dadbb4,0x0033c17e,0xfede9d16,0xfef3971a,0x004c6346,0x0165afc6,0x00171abc,0xff2f10ea,0xfeb159be,0xfea7d86e,0xff87f5d8,0x0161d56e,0x00736e8c,0x00111ec2,0x0009d431,0x001bac65,0x003afafe, -0x0057f9cb,0x005bcc2f,0x0049b7c5,0x0035d0cf,0x000110b8,0xfff7aeaf,0x00187531,0x0014177a,0x0013283b,0x000c87d2,0x0034938e,0x0023157f,0x00020ca0,0xffe99ab8,0xfff2de97,0x0009c028,0x004a1a83,0x0041811c,0x001a17ce,0xffa63bf5,0xff7d0212,0xffd71402,0xffe345e7,0xffab878a,0xff416868, -0xff802a1d,0xffbbcd8d,0xffc94397,0xffd10bf5,0xffd36e37,0x0037ed7e,0x00527868,0x009b4fdd,0x009dabe9,0x00bbc9c0,0x00acb5f4,0x0075dd3d,0x0028070f,0xffe9ce97,0xffd7cd61,0xffc18e49,0xffb9efd8,0xffb8b605,0xffb83b08,0xffbe4901,0xffbec257,0xffbf4d43,0xffcce439,0xffe993bd,0xffd73697, -0xffd551a5,0xffe7eeec,0xffe51ff3,0x0003b2a8,0x000ab0f4,0x001f8fc7,0x0014dda6,0xfff71802,0xffe7694f,0x0061edb0,0x0059e6cd,0x00c5c800,0x00f29446,0x00e3f4cd,0x00beed87,0x00ad1ef4,0x00bdec53,0x008c73aa,0x0061c1fc,0x0029a2a9,0xfff896b5,0xffdd2266,0xffd9c849,0xfffd2f26,0x0014cf8f, -0x0021e64d,0x0021d3ca,0x001f38b2,0x00196bb8,0x000f7c54,0xfff6a1d4,0xffd53017,0xffcddd97,0xffc82e11,0xffcb07a6,0xfff6cce8,0x001cce48,0x002ab56a,0x0011f511,0x000c4586,0x000f6caa,0x002d31a3,0x0047ce11,0x00510a21,0x004aa881,0xff58fb0b,0xff8f0c77,0xff9cb720,0xffb3fec0,0xffc49262, -0xffe9fda7,0x00019416,0x001700f1,0x00243404,0x002fb777,0x003c1100,0x00327af7,0x002fcbe2,0x00244095,0x002aa410,0x002e7b3e,0x00308245,0x002df6f0,0x0023b698,0x001d1a45,0xfffb98a5,0xffd8a193,0xffb04e30,0xffbab037,0xffbf3326,0xffc1147c,0xffbc91e1,0xffb253d6,0xffb83458,0xffaa65ad, -0xffa8a38c,0xffb52482,0xff97fec9,0xff757198,0xff43cdbb,0xff41b171,0xffcb29c3,0xffea3c5f,0xffedaea2,0xfff7a77c,0xfffde74c,0x00092718,0x001add9d,0x00301678,0x0036b369,0x0039b2a5,0x003d5d56,0x0037f614,0x0035cbc8,0x00350f7b,0x0033bf24,0x00316b88,0x002edcae,0x00272b69,0x001db7f6, -0x001ce8bf,0x0002c7f5,0xffe5e0c2,0xffc683fd,0xffcab3e7,0xffc604eb,0xffc9f9b3,0xffaf9a75,0xffa31226,0xff86660d,0xff7f3790,0xff6c6169,0xff5bc169,0xff6ae6fc,0xff79266c,0xff81e50e,0xffac22d0,0xffec032b,0xfff365bf,0xfff06421,0xfff0529b,0xfff0d6cd,0xffeed123,0xffe92842,0xffe34922, -0xffe3dff2,0xffe8281a,0xffee50e8,0xfff57993,0xfffb7dbe,0x00007c5d,0x00028871,0x00058020,0x00092c45,0x000c485c,0x000fa297,0x001415fc,0x00029bd1,0xffffdb9e,0xfff845b3,0xfff1516d,0xffe713d3,0xffe249b9,0xffe22b84,0xffe32885,0xffe06738,0xffe0dded,0xffdead69,0xffdc8f9f,0xffe16b2a, -0xffe5c7af,0xffe904d9,0xffeaa1a5,0x00002ed1,0x0004ff77,0x00016e3b,0xfffea0c4,0xfffb4094,0xfff92d44,0xfff879b4,0xfff6d95d,0xfffa564a,0xfffb3be3,0xfffb089b,0xfffb1835,0xfffb8e7c,0xfffce414,0xfffdeaed,0xfffeeb0c,0xffff9969,0x0000fe3a,0x0001ba26,0x0005720b,0x00000eb8,0xfffe2dc5, -0xfff8fab5,0xfffb42cc,0xfff7b2d2,0xfff0dc12,0xfff07fc3,0xffef2fb2,0xffeff1ae,0xffee85a4,0xffeee758,0xffed5bd9,0xfff1ee9c,0xfff58cb7,0xfff7f8dc,0xfffcadfc,0xfffe9bfd,0xfff71da8,0xfffc48e7,0xfff939d3,0xfff7c0da,0xfff56cb8,0xfff35f25,0xffeedfcc,0xffef521b,0xfff1245d,0xfff845fb, -0xfffc5954,0xfffeb18d,0x00017659,0xffff7a3d,0xfffa6af3,0xfff27ed4,0xffef0b21,0xffee3b4c,0xffefd3eb,0xfff10eee,0xfff49a13,0xffefa0d8,0xffed8522,0xffe5fe3e,0xfff45097,0xfff6e440,0xfffcc317,0xfff5ff71,0xfff8790c,0x000578b0,0xfffdb638,0xfffb4ea7,0xfffb7c2f,0xfffb6809,0xfffd7a46, -0xfff41cba,0xfffc94ad,0x0008cb0a,0x0000d3b0,0x0000d22e,0xfff99cf7,0xfff43dbb,0xffe3d651,0xffdd0cc4,0xffe1ad72,0xfff12ccd,0x00019a75,0x000e2b24,0x001edc5d,0x001cb846,0x00086965,0xffea6030,0xffd977ab,0xffd7449e,0xffd81538,0xffdc8df5,0xffe73951,0xffdfb4b0,0xffdbc649,0xffcf570d, -0xffeb9f4e,0xfff80eb6,0x00084569,0xfffeb47f,0x00032a3f,0x00204b7c,0x000f4373,0x000f00a0,0x0014f603,0x00101b98,0x00085672,0xfff8a549,0x0009dc6b,0x001760d7,0xffffaecd,0x000269f4,0xfff231c9,0xffe989ea,0xffc6459e,0xffc668d0,0xffd1fba6,0xfff9c35c,0x00199590,0x001c6037,0x00395fe2, -0x002f684e,0x000bf488,0xffdd4316,0xffc28ab7,0xffc1ddcc,0xffc3354f,0xffcaf29f,0xffe25644,0xffd1ca58,0xffc96603,0xffb4f1b3,0xffe9e954,0xfff652f9,0x00271525,0x00085363,0x00171fd9,0x0058875d,0x0032567c,0x002b7c9d,0x001ff081,0x001a7ab4,0x001b78f7,0xfff59b81,0x001fba26,0x0035e921, -0x0018b266,0x002358d3,0x00147871,0x0006ad6c,0xffd2f1f3,0xffa7f2e6,0xffa6db70,0xffe52230,0x001ac585,0x003b949f,0x0082ebd2,0x008df965,0x0040cb13,0xffd6f67d,0xff98727a,0xff8c0788,0xff8a50ae,0xff9c8f4d,0xffcb72a5,0xffc22edc,0xffb6e047,0xffa0e835,0xffd43c0c,0xfff11091,0x005b017f, -0x003024cd,0x003d92a8,0x00a6062b,0x009a9ffd,0x007dce4d,0x0064159d,0x0065edda,0x00305fb0,0xffdb972e,0x0020e8a0,0x0028a5cf,0xffbad063,0xffbd94f6,0xff8f03c5,0xff5c8cc9,0xff50b945,0xffbc3ec6,0x00682eb4,0x0051a419,0x00581e25,0x006ebd32,0xff925a78,0xff556646,0xff7ff8f4,0xffda218a, -0x000bf4bf,0x0019eb28,0x001f2daa,0x000dbbd1,0xfffa7aee,0xffe96377,0xffef439c,0xfffa428e,0x002f9a77,0x00274b4a,0xffcf55d2,0x005ec562,0x00740e23,0x00017c05,0x00057b13,0xffca6761,0xff8713f1,0xff80775b,0xfff19844,0x0095c03b,0x007767d8,0xff6a98cc,0xfff303d9,0xffab28a9,0x0031dd0e, -0x0171af4a,0x00d5c01e,0x006cad3d,0x00764b5e,0xffbb14d4,0xffb0aa26,0x000a312d,0x0073db87,0x006a5a4d,0xffd8217d,0xffca76be,0xffb9d12e,0xffd5825b,0xffdb9c35,0xffd7b7bd,0xffd227f6,0xffcff243,0xffe3e0fd,0x001a572a,0x00138cac,0x00318c50,0x0042dc93,0x00230c5c,0xffef1f5a,0xffbb39ea, -0xffebc677,0x0036b99d,0x009d40c9,0x00ab0923,0xffff973c,0xfee14598,0xff262949,0xfffe7583,0x01015440,0xffb032ba,0xfefa8450,0xfeb75348,0xfe5f8fda,0xff3d7301,0x015f2692,0x007ade15,0x002e1686,0x0038fec7,0x0016e779,0x001f0394,0x0040ac85,0x0054577b,0x004df15d,0x00487065,0x0014d113, -0x0007532d,0x002441ee,0x001e436e,0x001905c7,0x001236b4,0x002a99a7,0x0015abf7,0x00035a70,0xffe3fac0,0xffee4bfa,0x00103cdc,0x0034e63b,0x001b7c3a,0xffe566a8,0xffb45c60,0xff9d4692,0xffe07aac,0xffa31178,0xffcf5d30,0xff6e943f,0xffaf0142,0xffdf46f2,0xffdec191,0xfffad5cf,0xfffa85fa, -0x004b6344,0x0037c06d,0x007fdc90,0x00aeb898,0x00b67357,0x00a7dbe2,0x0075429b,0x002aea80,0xffe29c40,0xffc6990d,0xffb3adf3,0xffb02d98,0xffb8f429,0xffaea007,0xffb503d1,0xffbeb04d,0xffc95305,0xffd6da62,0xffe7b176,0xffe3c8c9,0xffdda7d6,0xffe2d8d6,0xffe417a9,0x0006f727,0x00080b8f, -0x00169663,0x00116328,0x000e28f5,0x00050f1e,0x003598e7,0x0010f7a0,0x008658be,0x00c488cc,0x00c9d2d8,0x00befbc4,0x00b174c4,0x00b75334,0x0099f41e,0x007a1fe2,0x005c6898,0x001cee48,0xfff81684,0xffe8f952,0x0001547f,0x001738ec,0x002476a7,0x001f9230,0x001c95ee,0x001dd142,0x000b87c1, -0xffed4ecf,0xffc7e379,0xffc2ca7b,0xffc75232,0xffd0a435,0x000a0bce,0x002d9787,0x002aab1c,0x0015af1c,0x00101b66,0x0010c5de,0x0035a60c,0x004b9ef2,0x00414eec,0x002fffe3,0xff7f8d1a,0xff9d3b43,0xffc5f685,0xffe1d229,0xffeeeb65,0x0002a3fd,0x000fa550,0x001dc6ce,0x00278884,0x002c6dad, -0x0033f043,0x0024bc19,0x00257782,0x0023bc9a,0x002d961f,0x002d7dae,0x0027b171,0x0026a15d,0x0017441d,0x000a0331,0xffe4b83c,0xffc757d1,0xffb1e432,0xffc50f1f,0xffc9f91a,0xffc0c2ac,0xffbd9d70,0xffbb2b31,0xffd011a7,0xffcd2490,0xffd17914,0xffdb9f97,0xffcc8a0f,0xffacaf81,0xff7506e2, -0xff767804,0xffbb3329,0xffda808b,0xffdc3bd9,0xffe268f6,0xffe750b1,0xfff6182f,0x000a364d,0x002125eb,0x002d3152,0x0035468f,0x003d13ff,0x0038a1ad,0x0035d538,0x00347ecd,0x0030ef12,0x002e5a0d,0x002bf642,0x001fd7c2,0x00115f4b,0x000b5913,0xfffc0bf5,0xffe68998,0xffcd981a,0xffce966a, -0xffccbeb7,0xffcf6c9d,0xffbdcb11,0xffb1aa85,0xff9b6d1b,0xff8d4924,0xff78d6d9,0xff64d134,0xff6a6836,0xff6e3ace,0xff6df6fb,0xff9a2c44,0xfff43497,0xfff98dbc,0xfff8c078,0xfffc39ba,0xfffedbeb,0xfffdfe64,0xfff97d9a,0xfff51d98,0xfff3db88,0xfff64233,0xfffb0d1c,0x00005480,0x00056937, -0x0009b94c,0x000bf9a7,0x000e62c6,0x0011a320,0x00143655,0x0017d833,0x001b8b05,0x00107dcb,0x0007cff6,0x00005922,0xfff8bd4d,0xffed6f74,0xffe421d2,0xffe1b887,0xffe11a62,0xffdf357c,0xffddead0,0xffdafef7,0xffd9384a,0xffe0e0da,0xffe98bff,0xffee42c4,0xffefa5c1,0xfffbe15f,0xfffc6bfe, -0xfffb45e0,0xfff949f1,0xfff74a0c,0xfff6d643,0xfff7d12f,0xfff874b1,0xfffac7a5,0xfffb22b4,0xfffa53eb,0xfffa2c19,0xfffa3bd1,0xfffade4f,0xfffbe2b5,0xfffcdc10,0xfffd8897,0xffff1d09,0x000015e8,0x00029e75,0x0000ffc7,0x0000afa0,0xffff911b,0xfff91e1a,0xfff8bc3b,0xfff6a3fb,0xfff5a963, -0xfff35b6e,0xfff22817,0xfff04b39,0xffefd3f9,0xffecba2e,0xffee8afb,0xffeee29c,0xfff8d376,0xfffa0eec,0xfff6e222,0xfffaabd5,0xfffea6c9,0xfffbe3e0,0xfffbf609,0xfff9ce24,0xfff707c9,0xfff1914f,0xfff1ad90,0xfff38f85,0xfffc1e60,0x000053fc,0x0000f51a,0x0003e8e4,0x0002d5fc,0x0001f295, -0xfff84965,0xfff42a83,0xfff1a072,0xfff29ae7,0xfff323c1,0xfff5fa1b,0xfff22cd2,0xfff0c242,0xffe90382,0xfff99aef,0xfffae596,0xfffc39c7,0xfff8d7b4,0xfffadc26,0x0004547b,0xfffd363f,0xfffb893a,0xffff4280,0xfffd40ca,0xffffe80f,0xfff9b746,0xffff16bd,0x000e884e,0x000737aa,0x000bf14b, -0x0004be85,0xfffbf7bd,0xffe6f362,0xffdf1f2d,0xffe4ec1b,0xfff71004,0x0005e8e3,0x000dc35d,0x001e9293,0x0020e629,0x001862a3,0xfff6e863,0xffe3991d,0xffdb785b,0xffd9b170,0xffdbb0b0,0xffe4743a,0xffdf0258,0xffdedce9,0xffd4b9b7,0xfff40397,0xffff27ca,0x00042be3,0x0001e6fd,0x000474db, -0x00196cf7,0x000b3410,0x000c37d0,0x00192fc5,0x000fe31d,0x000aad4c,0x00047336,0x00101744,0x00183fc5,0x0000305b,0x000d6626,0xfffe79c7,0xfff0db3c,0xffc846d9,0xffc696b3,0xffd2b775,0x0001e0eb,0x00207343,0x001a03e0,0x0037119a,0x0033201d,0x0028a230,0xfff02892,0xffd1dea1,0xffc67ab3, -0xffc3de63,0xffc732c9,0xffda1368,0xffcff6d7,0xffcdb01a,0xffbb8ac9,0xfff866a5,0x0000efca,0x001c7366,0x000df1ea,0x00171e6b,0x004966a6,0x00224879,0x001fc40c,0x00263a6e,0x00177d0e,0x001d13a0,0x0005af7a,0x0020ddd3,0x00429800,0x002541cd,0x003f3abe,0x00310f3f,0x00197374,0xffd7585c, -0xffaa937c,0xffabc20b,0xfff178c6,0x001f3d8e,0x002f54cd,0x007557ce,0x0095b1e6,0x0072ad01,0xfffa3e2e,0xffb0d077,0xff920b1a,0xff86cdd3,0xff8fa983,0xffb806e9,0xffb82467,0xffb4df9f,0xff9f6e0c,0xffe4e549,0x00003997,0x004f0ff0,0x002c46be,0x0038fb1e,0x00a38cc6,0x0093a8a2,0x00781ea6, -0x006f8ee8,0x005b787e,0x002f74c9,0xfff93035,0x0032d9b5,0xfff03b69,0xff9ebdfd,0xffa50d7b,0xff818e66,0xff510545,0xff4bb236,0xffaf9f1b,0x0063f2a5,0x005113cb,0x005e6856,0x009042f2,0xffaf2577,0xff5e7a3f,0xff770d93,0xffd623e6,0x000cb261,0x001ec80b,0x002bf982,0x001bc67c,0xfffc80fc, -0xffecb83c,0xfff827fe,0x000fa724,0x002951b4,0x00235662,0xffd0538d,0x0072b872,0x007f6a17,0xfff2965c,0xfff4bd57,0xffb67900,0xff87ddb2,0xffa55107,0x00101e57,0x00859f10,0x00407b58,0xffaa2b7a,0x0024f03f,0xfff34599,0x0055ca47,0x0140e9f0,0x00e6731d,0x008fb42d,0x006e29a1,0xffcbfa6f, -0xffb91afe,0xfff564f9,0x0085fc65,0x008b4d7e,0xffe31927,0xffcae3e8,0xffb5396f,0xffd8aa26,0xffda66d9,0xffd21dc9,0xffbe9a33,0xffc545cd,0xffd7db8c,0x0012e26b,0x000f8a1b,0x002ab2f5,0x00385175,0x000f7328,0xffd93e6d,0xffb16f13,0xfffcdf26,0x0046b23a,0x0084d93a,0x00720025,0xffcab3df, -0xfeeef076,0xff4a899a,0xffc63081,0x0062b411,0xff420089,0xfed423ae,0xfee1ba64,0xfe57bddc,0xff0858b3,0x00f45df8,0x007fbf43,0x005cbd83,0x00579335,0x001b4a76,0x000cb852,0x002918ce,0x004d0734,0x0052e69f,0x0053c3df,0x002ab27b,0x0017a48f,0x00238064,0x0020a044,0x00195fc5,0x00160b7d, -0x001d72d8,0x00074453,0x000237ac,0xffe1d7aa,0xffee17d9,0x0017e55e,0x001bb572,0xfff62b39,0xffbb80d0,0xffcaf5db,0xffc40600,0xffe5cf3c,0xff8f72f6,0xfff303f0,0xffb6b85d,0xffee3fdd,0x000ddddc,0x000c49ca,0x00271d09,0x00206d35,0x004ada00,0x00236029,0x00616d86,0x00ab1953,0x00a5980f, -0x0099c5c9,0x0072ebc2,0x002b5fba,0xffe4c602,0xffbf909a,0xffaf7f37,0xffaca3ed,0xffb9ab0e,0xffac0b69,0xffb0857b,0xffbe2d89,0xffd46756,0xffe3850d,0xffe74351,0xfff15003,0xffe819fd,0xffdf2a77,0xffe5193b,0x00077984,0x0005edd7,0x000cd1c4,0x00115418,0x002adcb5,0x001a9d2e,0x0005204c, -0xffcda55c,0x002ae8d6,0x006a3a1f,0x00881d6f,0x00a669fc,0x00af540a,0x00b4f02e,0x00a73c04,0x00908fb8,0x0087077c,0x0047b43d,0x001d96c4,0x00009add,0x000eb1fe,0x001b39ed,0x001fbf41,0x001de32e,0x0019a186,0x001b64f2,0x00027ca3,0xffe124fe,0xffbe4959,0xffb9a9f9,0xffc7b922,0xffdbafe9, -0x0015ac69,0x0034321d,0x0026e78d,0x001cc6a6,0x001997c6,0x001795d3,0x003c990a,0x0048a050,0x002ca373,0x001420cb,0xffad2690,0xffbfa3cb,0xfffc7ce1,0x001ab1c9,0x002690ed,0x002250e8,0x001e23ea,0x002155da,0x002550f8,0x0024bfbd,0x00258123,0x0014cc7b,0x0018cce1,0x002088be,0x002aff4b, -0x00299c5a,0x001d0994,0x001c73cd,0x0008fae7,0xfff3db9c,0xffd13b19,0xffbc6216,0xffbab901,0xffcb55f7,0xffce8c31,0xffc1150e,0xffc13a2d,0xffc7c822,0xffe815d4,0xffefbce0,0xfff97ee9,0x00019f22,0xfffe5a99,0xffe7039a,0xffb7484d,0xffb44265,0xffacab74,0xffc746d5,0xffca7238,0xffd08063, -0xffd8bfbd,0xffea3f1c,0xffffa2f2,0x00153910,0x0022020f,0x002acb1d,0x00324440,0x002ef6d2,0x002b8054,0x00296f49,0x0025ef1b,0x00260fe0,0x00279ae8,0x0016ec03,0x0004693c,0xfff9ce0f,0xfff48df1,0xffe5c532,0xffd47684,0xffd1e0b4,0xffd01d6a,0xffcf75e3,0xffc5199e,0xffbae1e7,0xffaad4d5, -0xff989852,0xff84f87f,0xff7068d5,0xff6e1747,0xff6894dc,0xff619afc,0xff8c5fe7,0xfff75ff0,0xfffb3a6e,0xfffd7725,0x0003b84a,0x0007a055,0x0007fd98,0x000589fa,0x0004784a,0x00033a91,0x000540ec,0x00094923,0x000cc8d9,0x00109b91,0x00139c33,0x00142ed1,0x001379b6,0x00140b29,0x00146517, -0x00168886,0x0017b616,0x00129d1a,0x00068532,0xffff3afd,0xfff74aa0,0xffec7297,0xffe0a1e7,0xffdcfd87,0xffdaef2e,0xffd99c53,0xffd74482,0xffd40c95,0xffd26d9c,0xffdca2ff,0xffe89916,0xffeeab2f,0xfff039c0,0xfff09d5e,0xffeec39c,0xffefe398,0xffef6277,0xffef8f5e,0xfff15fc9,0xfff44721, -0xfff72a5c,0xfff7d980,0xfff779ee,0xfff642b2,0xfff5fc82,0xfff5e474,0xfff6662a,0xfff69108,0xfff72d4d,0xfff761b7,0xfff8b283,0xfff97dd0,0xfffa926e,0xfffa9aa6,0xfffa61fd,0xfffb721f,0xfff06f44,0xfff12273,0xfff173cc,0xfff027e5,0xffed506c,0xffeadd81,0xffe8c60d,0xffe7ada5,0xffe386f7, -0xffe3f104,0xffe2cde1,0xfff03041,0xffef8a99,0xffea4045,0xfffd0dc9,0x00009e5d,0xfffd5ce3,0xffff11a3,0xfffd2089,0xfffa203d,0xfff3b79c,0xfff377c9,0xfff59103,0xfffeb7d7,0x0002afd9,0x00015e45,0x0004cfbe,0x0004ca06,0x00080079,0xfffd17f5,0xfff878d9,0xfff42554,0xfff4e245,0xfff4dbd6, -0xfff68dfe,0xfff4cab7,0xfff4c92b,0xffee9784,0xfffe5e70,0xffff3228,0xfffd2f6f,0xfffcd027,0xfffdeaca,0x00027cbe,0xfffd22d4,0xfffc45fd,0x0002c671,0xfffeadd3,0x0001170e,0xffffa54d,0x0001beac,0x00136416,0x000b9c2f,0x0014816f,0x000dd56d,0x0002f9c2,0xffea7265,0xffe22f04,0xffe8a54c, -0xfffbb814,0x0007ffbf,0x000a3c5c,0x001bbac8,0x00227bde,0x0025bb41,0x0002ab54,0xffedba70,0xffdf5208,0xffdbe8f4,0xffdba403,0xffe23e69,0xffe0105d,0xffe2c0bb,0xffdcba67,0xfffc8921,0x0006520f,0x000137cc,0x0004ce1a,0x0004ba2b,0x000f5e45,0x00055dbc,0x0007b170,0x001a2a56,0x000db740, -0x000b3a83,0x000d1052,0x00135913,0x001801f1,0x0000ede6,0x0014ef53,0x0008db43,0xfff9eb58,0xffcd216e,0xffc9d955,0xffd5aa66,0x00084c76,0x00232c46,0x0013a956,0x00310816,0x003304a7,0x004148be,0x00020620,0xffe19ac0,0xffcb5de7,0xffc76bd6,0xffc65f24,0xffd4b81e,0xffd08bea,0xffd4b2ef, -0xffc8165a,0x00075928,0x000c28a6,0x00139899,0x0013d7e8,0x0014ed24,0x0031deb5,0x000f9d50,0x00112833,0x0026949f,0x00117448,0x001b560d,0x0013ad8d,0x00200a67,0x00493402,0x002e873b,0x0054ac2d,0x00497dc2,0x002c8a05,0xffe01560,0xffb45dcc,0xffb41dd5,0xfffc3c8d,0x001fcccc,0x001d480c, -0x006363d8,0x009543a8,0x009c970e,0x001d2cbe,0xffcb5961,0xff997ef0,0xff8802d4,0xff88b859,0xffa99b44,0xffb1e481,0xffb6b7a1,0xffa66d84,0xfff8aee7,0x001260c6,0x004413f7,0x002d02f9,0x0036631b,0x0093a3aa,0x0084e2c4,0x006d53bd,0x00742be6,0x004dba39,0x002c1423,0x0013ac2a,0x003d9f94, -0xffc9019d,0xff8e1a53,0xff8cd49d,0xff71902b,0xff4c2983,0xff4d7be9,0xffa70568,0x0061ba37,0x00507f55,0x0062d4e4,0x00a6084c,0xffc974ec,0xff697e1a,0xff72fba7,0xffcc11d0,0x0009aa85,0x0027b89d,0x003cbd83,0x003056f1,0x00065b28,0xfffa244a,0x0009dc67,0x00275110,0x0021f412,0x001ca006, -0xffd458ce,0x007d2bd0,0x00852068,0xffef40e4,0xffe70d3f,0xffa44c4c,0xff878c19,0xffc65b7d,0x0026bd7a,0x007069d3,0x0016915d,0xffdae970,0x004a7449,0x003a5018,0x00721bc6,0x00f88bc6,0x00e7cd70,0x00ac5412,0x00654b21,0xffdbe396,0xffbedd75,0xffe973ca,0x008f2359,0x00a3e048,0xfffac8cd, -0xffd23426,0xffb4cc48,0xffd475e5,0xffd8c371,0xffd1e9c2,0xffb3a6f1,0xffc6f7e3,0xffd50390,0x0007276c,0x0007a722,0x0020277b,0x002ec85e,0xfffd0d96,0xffc7b283,0xffb025f4,0x0010f1f7,0x00539bf6,0x00674ead,0x003397df,0xff985d15,0xfeffcaec,0xff671a04,0xffa92871,0xffab9d62,0xfee34066, -0xfec64dbc,0xff14731f,0xfe91f7c4,0xfefc1086,0x00496d15,0x0086063f,0x0094521e,0x005a92d6,0x001d5db6,0xfffec7f0,0x0013bcf8,0x00413d1e,0x005287eb,0x0054feed,0x003b774e,0x0021e0e1,0x0014496e,0x0019ad76,0x0014ed88,0x0018fb76,0x000fd09c,0xfff916b8,0xfffcc7dc,0xffe464de,0xfff3b786, -0x001c40df,0x0005146e,0xffd88874,0xffa10622,0xffe3da2f,0xffec2921,0xffe55895,0xffa2d706,0x00199334,0x000f0bec,0x00353fc3,0x003c5981,0x0036ac40,0x00408662,0x00354dcc,0x003733d7,0x0009c75b,0x0035d8c3,0x0090f911,0x009002ed,0x008a00e6,0x0071fcee,0x002af4d3,0xffeb48c1,0xffbd89cc, -0xffb1275e,0xffad4b88,0xffb822af,0xffae5369,0xffaf7d72,0xffbe0fd6,0xffde6dcc,0xfff00882,0xffe94d6b,0xfffb2598,0xfff0e41b,0xffde1d38,0xffe876be,0x0005eb83,0x000671d7,0x000361dd,0x0011c500,0x00470e5c,0x002c6d2c,0xffdbb857,0xff95b57f,0xffca8eef,0x00008c77,0x002f2145,0x00845171, -0x00a95142,0x00a85376,0x00aaf7b8,0x009f8826,0x00a5d543,0x006d750f,0x00442b1b,0x001caf97,0x001f25d6,0x0021296f,0x0018fc35,0x001b5dc3,0x0012d904,0x000efc40,0xfff375f4,0xffd24bce,0xffb8cdc2,0xffb3e5d7,0xffca0a8c,0xffeb64ed,0x001a63cf,0x0031ed72,0x00220e99,0x002565a1,0x00249ab2, -0x001f7c03,0x003d9c5b,0x003ebf75,0x001a9654,0xfffe0f95,0xffe0668d,0xfff3daf4,0x003586bd,0x00513fce,0x005a14a3,0x003f8466,0x002ac9e6,0x002300c7,0x001dd703,0x0016d7fb,0x001172d7,0x00046d1b,0x000b84a8,0x0018ee6e,0x0025c461,0x0023f44e,0x0011a9cc,0x00104ca4,0xfffabc59,0xffe07386, -0xffc53ffd,0xffb90259,0xffc61b14,0xffcdaecf,0xffcddd36,0xffc14460,0xffc7c3ac,0xffd805cb,0xfffe2bb5,0x000f15e4,0x001dd2be,0x0024d5a6,0x002cbc16,0x00204a5e,0xfffdacf7,0xfff0ead1,0xffa1b2fb,0xffb45e9b,0xffbcf284,0xffc80ab1,0xffd9a2e6,0xffea3d18,0xfffc6a08,0x000b853b,0x00149cd4, -0x001b5b4a,0x001f4d8b,0x001e1663,0x001b5d02,0x0019c360,0x001700a4,0x0019b4a3,0x001e8fff,0x000a603b,0xfff52012,0xffe6eb20,0xffe9248e,0xffdf4e90,0xffd481d1,0xffd1895a,0xffd145fc,0xffcd63cf,0xffc85a72,0xffbebddb,0xffb38142,0xffa0a8c0,0xff8fc66f,0xff7d61dc,0xff7669bf,0xff6ad0f8, -0xff6166bc,0xff863ab0,0xfff4b1a7,0xfff692cd,0xfffc70bb,0x0003f71a,0x00083857,0x000a3571,0x000ba74d,0x000fd105,0x000fb41a,0x00118981,0x00149a9e,0x00164e65,0x00185b83,0x001a0306,0x0017a9c0,0x00133d9a,0x0010a239,0x000e2f6f,0x000de80a,0x000bf40b,0x000c2873,0xfffec1cd,0xfff7e03c, -0xffefe66a,0xffe6607e,0xffda0d92,0xffd58b47,0xffd2a413,0xffd1b5d2,0xffce1f34,0xffca3cc7,0xffc894ad,0xffd41061,0xffe1f5d3,0xffe8ae37,0xffeaa159,0xffe30e83,0xffdfd39e,0xffe2f07a,0xffe45968,0xffe7161a,0xffeb6769,0xffefe928,0xfff4b415,0xfff37644,0xfff28a56,0xfff14887,0xfff0f4cf, -0xfff0d6a1,0xfff16dd2,0xfff0752f,0xfff062d1,0xffefb2ba,0xfff0542f,0xfff09c7f,0xfff00270,0xfff107c8,0xfff089a4,0xfff2b322,0xffe5ca84,0xffe6c2cc,0xffe82cce,0xffe6a759,0xffe38564,0xffe03676,0xffde1ac3,0xffdca74c,0xffd7b6ec,0xffd76a9b,0xffd59a39,0xffe42c96,0xffe28f1d,0xffdd3d4a, -0xfffef3e2,0x0001dc30,0xfffe5868,0x00019e24,0x0000166b,0xfffd1f84,0xfff6578e,0xfff5bf3a,0xfff76062,0x00011ed3,0x00049c87,0x00011d7c,0x00053d50,0x00062f72,0x000cf987,0x0001779e,0xfffc90d2,0xfff6b318,0xfff7311a,0xfff6a285,0xfff760e6,0xfff71b11,0xfff81a71,0xfff3b202,0x00026df1, -0x0002736d,0xfffd7ac4,0xffff4e26,0xffff2c1f,0xfffe6bd6,0xfffb7e4e,0xfffb6a65,0x000413fc,0xfffee2d7,0x000188f2,0x0003902e,0x000340ba,0x0015423c,0x000d86b5,0x001a6c09,0x0015464f,0x00098344,0xffefdc3a,0xffe757cc,0xffec2df8,0x00007073,0x0009b8c4,0x0005867e,0x0017d89c,0x0022ac98, -0x0030abf8,0x000e3d07,0xfff89dcb,0xffe490fd,0xffdf647c,0xffdcaa51,0xffe0ee78,0xffe0dd48,0xffe6d8d6,0xffe69723,0x00042e09,0x000c6084,0xffffb237,0x00071ffe,0x0004016c,0x00035fd3,0xfffe4447,0x00021061,0x0018bb49,0x00098de5,0x00094e27,0x0012f2cb,0x0014242a,0x00162143,0x00007e1b, -0x001a3853,0x001230f9,0x00031e6e,0xffd6ff7b,0xffd2268f,0xffd903b8,0x000f9455,0x00252d14,0x000ccd8e,0x002a8ac5,0x003109e6,0x0054c291,0x00133268,0xfff251a0,0xffd26069,0xffcd7ee5,0xffc86622,0xffd26d20,0xffd28ccf,0xffdcbac4,0xffd91aea,0x0014b378,0x00164a49,0x000d337a,0x00184ed7, -0x00106ca1,0x0014d86f,0xfffbbb7a,0x0000a7d5,0x0022bbdf,0x0008a09a,0x00169c17,0x001f9b81,0x001d5e12,0x004998a9,0x0030bc02,0x00624248,0x005c61b6,0x003d2154,0xffefa683,0xffc56cc8,0xffbc20a2,0x00079f40,0x00209f86,0x000a34fb,0x00503a94,0x008f5c06,0x00bd206b,0x00402261,0xffe9a4db, -0xffa64f50,0xff8e6482,0xff866af1,0xff9eeabd,0xffad0637,0xffbbb6e5,0xffb5d6e2,0x000da4ba,0x0024b0fc,0x003abaf3,0x00314737,0x00341b8d,0x00751d1a,0x006ec5f8,0x005d754d,0x0070718a,0x003c953e,0x0024dfab,0x002a4645,0x004208ae,0xffabe779,0xff883afc,0xff7b94d4,0xff684b18,0xff524064, -0xff577ddb,0xffa65072,0x0064677d,0x0050545a,0x006745ac,0x00b6fffb,0xffe69adf,0xff78c6e7,0xff6fcf90,0xffbbaf81,0x0000e41c,0x002f66e6,0x004f61ea,0x004d5176,0x001ecdd4,0x00114ba6,0x0021cfa3,0x003ca6bc,0x001914a0,0x00130bc7,0xffdc8579,0x007b9c70,0x0082f639,0xfff3c5f7,0xffdf789e, -0xff9981d0,0xff883093,0xffe10f2e,0x0034ce14,0x005d541a,0xfff3d8ab,0x000929db,0x00640f95,0x0071443f,0x007c934e,0x00a51001,0x00df7238,0x00c1b012,0x005c425e,0xffeaca4c,0xffc227d1,0xffdbf4b2,0x00880018,0x00af8525,0x00204fbe,0xffe0e74a,0xffbb0b48,0xffd1cc66,0xffd8607c,0xffd6d3db, -0xffb356e3,0xffd26266,0xffda35a8,0xfff97344,0xfffd9094,0x00136eb1,0x0025ffea,0xffebd0c3,0xffba08f4,0xffb4bb2e,0x001f13aa,0x005711bd,0x0046c006,0xfff87378,0xff6e705a,0xff0cb0e7,0xff86cfe8,0xff9757b8,0xfeef4364,0xfe9a9bcc,0xfecf3e22,0xff4058fa,0xfee53356,0xff0fa542,0xffb07cd3, -0x0099298b,0x00cc6549,0x0048f88d,0x001bd6c8,0xfff68384,0x0004d03d,0x0032ce85,0x004b59cb,0x004ce86d,0x0042f08f,0x0025b136,0xfffe712e,0x000c367d,0x000e6651,0x001c35d5,0x00057b4e,0xffee2876,0xfff3f5c5,0xffeb3ee8,0xfffe23cc,0x001b88aa,0xfff3b783,0xffc5cd8d,0xff94a42a,0xfffe016f, -0x00139365,0xffdb2937,0xffc6f322,0x0046a1b1,0x0072584e,0x0082b816,0x0068eb51,0x0050b377,0x0047196a,0x003622c0,0x0015f2b2,0xffea5357,0x0005522d,0x006a48d6,0x007693ba,0x00795316,0x00707f01,0x002ed8e3,0xfff8d932,0xffc1c215,0xffb71ad3,0xffb1273e,0xffb57b75,0xffb14c70,0xffb0191e, -0xffbf86fd,0xffe58be6,0xfff993e3,0xffede0d9,0xffff9c01,0xfff5cf41,0xffdf1d4f,0xffeea774,0x00054bf1,0x000a4192,0xfffc5491,0x00113490,0x0059be48,0x003c4d8f,0xffba8704,0xff6eff43,0xff7c97d4,0xffa8c5b4,0xffe51abc,0x00663437,0x00a0ae2d,0x0096c96b,0x00a7f5c5,0x00a60a14,0x00b89881, -0x008652ea,0x00630301,0x003f7a49,0x002d3402,0x0023fc0c,0x0014ad31,0x0016d843,0x00083bd0,0xfffacf47,0xffe0a1d3,0xffc379e9,0xffb5e955,0xffb198ba,0xffcd949b,0xfffc058f,0x0018dce3,0x0028b024,0x001cf5e4,0x002bd23a,0x002cb75c,0x0026f34f,0x00381e6c,0x0031a91a,0x00100dd4,0xffef1e5c, -0x00173e2c,0x002a408e,0x006786af,0x007c41e3,0x007e5d2c,0x00541294,0x003479ce,0x0024ed20,0x0017e463,0x000b4a05,0x00014631,0xfff8ff1c,0xfffede92,0x000bdda3,0x001cae8f,0x001bb08c,0x0009476b,0x0004f415,0xffef076f,0xffd2cb84,0xffc1e331,0xffbc77ba,0xffcfe3de,0xffcdcdcf,0xffca8f77, -0xffc0e6f4,0xffd0b762,0xffea3140,0x00121c06,0x002a0770,0x003cb445,0x004312ec,0x00520550,0x004f2f06,0x00381c02,0x00290c9e,0xff9cd00a,0xffa91b73,0xffb82e98,0xffc9a9e4,0xffe5bb36,0xfff2f2c5,0xfffeae42,0x0004bcb8,0x0006dc69,0x0009d0c2,0x00094039,0x000b1c16,0x000b54cc,0x000c0734, -0x0008da76,0x000b604a,0x00112e22,0xfffbbe1c,0xffe69712,0xffd6150b,0xffda5cc8,0xffd3b8ea,0xffcd0624,0xffcb89e1,0xffcd71d0,0xffc6fc08,0xffc75349,0xffbf6b89,0xffb86290,0xffa8c680,0xff9bd9a4,0xff8e54e2,0xff847b21,0xff752d13,0xff6a9f2c,0xff87b3e5,0xffeb7827,0xffec9a63,0xfff5f92d, -0xfffdfb1c,0x00025c82,0x000655ee,0x000cb93e,0x0016d485,0x0017e8fa,0x00194694,0x001ac7c2,0x001a5ae3,0x0019be9f,0x0019cdef,0x0014671c,0x000d4621,0x0007bc42,0x00030aef,0x00008003,0xfffc4055,0xffffbc5e,0xfff31f03,0xffecc9d4,0xffe51e12,0xffdd47ca,0xffd1fa4a,0xffccb394,0xffc91760, -0xffc80f09,0xffc33808,0xffbe85ba,0xffbc341c,0xffc7ccbd,0xffd60cc4,0xffdd03cd,0xffe00705,0xffd6ccb1,0xffd32c83,0xffd7b1f0,0xffdb0a98,0xffe00c6b,0xffe66e56,0xffebc9ab,0xfff1bd1b,0xffeec182,0xffed8d91,0xffec8621,0xffec3ad6,0xffec3332,0xffecca5e,0xffeada9b,0xffe9ff2e,0xffe87944, -0xffe82994,0xffe79577,0xffe56e4e,0xffe6ddf3,0xffe5d8c7,0xffe807d1,0xffdbeb5f,0xffdc5ac0,0xffddb7aa,0xffdbe4cd,0xffd89956,0xffd4c43d,0xffd29b2c,0xffd0f0c7,0xffcb71db,0xffcbc119,0xffca7a4f,0xffd7a2ed,0xffd63348,0xffd304ef,0x00013736,0x00023697,0xffffd507,0x00042b43,0x00034779, -0x000103ab,0xfffa074d,0xfff90de3,0xfff96b2c,0x00042b03,0x000724fa,0x00015087,0x000673cd,0x0008349d,0x00116305,0x00060194,0x00010d28,0xfffa1f72,0xfffa2f31,0xfff9164c,0xfff92d11,0xfff91766,0xfffaa661,0xfff875e5,0x0005abda,0x000474e9,0xfffd84e1,0x00008da2,0xffff08a4,0xfff97b56, -0xfff8d4b4,0xfff98d28,0x0004134d,0xfffdf3aa,0x00017772,0x00063e47,0x00038a38,0x0013d259,0x000e11ee,0x001e290d,0x001b65a7,0x00112a21,0xfff7ae51,0xffeecc80,0xffefa4ab,0x0006154e,0x000cbb96,0x0001f41e,0x0015a61a,0x00239237,0x0039653e,0x0019ad87,0x000432e8,0xffebfeb0,0xffe4a520, -0xffdf642e,0xffe0e2ed,0xffe186e2,0xffeb7c83,0xfff20439,0x000aceac,0x0010d52d,0xffff6cb5,0x0008b9e8,0x000288a6,0xfff77452,0xfff66953,0xfffb7fbb,0x0015c9a8,0x0003d114,0x00059b57,0x001774ff,0x0012fa3d,0x00116982,0xffff42cf,0x001d6499,0x0019d980,0x000e9015,0xffe516d8,0xffde87d1, -0xffdc2298,0x001838fe,0x0028f54d,0x0007552f,0x002702c4,0x00306bed,0x00625dad,0x00239670,0x0003a6de,0xffdc34fb,0xffd5eb82,0xffcd8d85,0xffd24271,0xffd5dfc7,0xffe55a02,0xffed6bee,0x001f4fff,0x001e12e3,0x0008b40e,0x001a3b70,0x000a1c3a,0xfff6a3cc,0xffe7ea7e,0xffef1f87,0x001c5921, -0xfffd7b7e,0x000f0954,0x00297a9f,0x00189b6c,0x0041fd42,0x002d12e6,0x00677f8a,0x0068ca1f,0x004eb49d,0x0005417e,0xffdb9439,0xffc36048,0x00144f22,0x002460e3,0xfffb0a41,0x0041b3d7,0x0088f0df,0x00d266db,0x00619fe8,0x000a2c27,0xffb87b19,0xff9a2e65,0xff893057,0xff966859,0xffa8f6f3, -0xffc49819,0xffce7bda,0x0021bed0,0x00343636,0x0032e175,0x00371feb,0x00314a6b,0x004c090a,0x0051ea25,0x00477334,0x006413e7,0x00274409,0x001920b4,0x003d5c39,0x003fe1ca,0xff967eb8,0xff8b72af,0xff70dce6,0xff65d131,0xff606aec,0xff6967b6,0xffad52fd,0x00641487,0x004fa419,0x006cc59d, -0x00c2e395,0x00043d86,0xff8983ba,0xff6dbb6d,0xffa62ccc,0xfff2434a,0x0034f1e9,0x005f9fd6,0x006d6110,0x0046972d,0x00307397,0x003a3e46,0x004b43ee,0x000ec8b0,0x0007f43b,0xffe9ac68,0x006e8d0d,0x007790ce,0xfffa572a,0xffdf3a3a,0xff9a2e52,0xff8e9d17,0xfff45afe,0x003943fd,0x004b6918, -0xffd5a676,0x00360d2e,0x00733417,0x0090d760,0x00732249,0x0057eea7,0x00d27892,0x00d1d633,0x0059485a,0xfffabf7b,0xffc2b7e8,0xffc64f86,0x006fcdd3,0x00ad4deb,0x00511138,0xfff4240f,0xffc45630,0xffd48776,0xffda4a21,0xffdf7531,0xffbce264,0xffe47de3,0xffe5e6b3,0xffec3c4c,0xfff325c9, -0x0005d63d,0x001eacbf,0xffde23f3,0xffb2e57e,0xffbf00ea,0x0023943c,0x004f70be,0x0027da1e,0xffca1086,0xff5329f3,0xff1a8ca5,0xffaf58fd,0xff81bd63,0xfe4580e4,0xfe736358,0xfeec1420,0xff5f7456,0xff28fd48,0xff2884b3,0xff3e689a,0x00a9043a,0x00f514ab,0x002ef227,0x00168dea,0xffef27cf, -0xfff7dbbc,0x0021fe85,0x003ef9fc,0x003f592b,0x003fad1d,0x002438a8,0xffede834,0xffffdf3b,0x00099af0,0x001f347e,0xffff30fa,0xffe753ef,0xffe9b7d8,0xfff3cb54,0x000a3e9f,0x00173731,0xffe7eb6f,0xffbdee53,0xff95064e,0x0016e3ae,0x0033b883,0xffc4edb4,0xffe5794d,0x007c8c25,0x00d3eadc, -0x00c687c6,0x00855612,0x00559ff2,0x003a87b4,0x0027e494,0xfff9cdb0,0xffd2f9a7,0xffddd345,0x003ad7cf,0x005a5360,0x0068e9e9,0x006e55c3,0x0033f5c9,0x00076273,0xffcd95fd,0xffc0c787,0xffb78e64,0xffb433bb,0xffb3d173,0xffb31818,0xffc4c0a9,0xffeae707,0xffffeae0,0xfff54dee,0xffffa8f4, -0xfff6d94b,0xffe29c26,0xfff7b166,0x0006e95c,0x000e9345,0xfffb2738,0x00119adf,0x005de6b5,0x004f28d3,0xffa3dd95,0xff5e50cc,0xff4a5cd7,0xff6f16ff,0xffb9255b,0x00470a7a,0x008b7d99,0x00836d26,0x00a16148,0x00a64b4d,0x00b91469,0x0091c02d,0x00760cd3,0x005d269e,0x003ad73e,0x0026224b, -0x00102eeb,0x000de224,0xfff99189,0xffe34bf9,0xffce065d,0xffb76730,0xffb27004,0xffb22a2b,0xffd0fe9c,0x00083a0c,0x001254f3,0x001b7fdf,0x0017f328,0x002d5b82,0x002f7d48,0x002c2782,0x002c2fcd,0x00223979,0x000b27d5,0xffe4e2c2,0x0049534d,0x0054ba6b,0x008808a7,0x0093d2c6,0x008f1434, -0x005f1f51,0x003cb867,0x002845ff,0x0017f58a,0x0007b093,0xfff965bc,0xfff32a39,0xfff44dd6,0xfffd87ae,0x000fd7db,0x0010b85a,0x000200f4,0xfffb373c,0xffe7b644,0xffcc848c,0xffc5d6a8,0xffc4f53c,0xffd63f5d,0xffcd19a6,0xffc777ab,0xffc21399,0xffdc14c2,0xfffce2ea,0x00247f21,0x003f6657, -0x005313ba,0x00583f23,0x0068805a,0x006c52a7,0x005e8f37,0x005669c2,0xff9efbcc,0xffa745b0,0xffbb18a3,0xffd1b747,0xfff4e695,0xfffdb780,0x00021068,0xffffd2bb,0xfffa8541,0xfff8fb42,0xfff4a66e,0xfff97cf0,0xfffd193c,0x0000c100,0xfffc8269,0xfffd3a96,0x000225c7,0xffee35a6,0xffdc102d, -0xffcbb2f2,0xffcd3f52,0xffc7f14c,0xffc338fa,0xffc2f91e,0xffc57fbb,0xffbdbb5a,0xffc320f9,0xffbfc067,0xffbcd876,0xffb363fa,0xffab31c3,0xffa4465f,0xff97df12,0xff85f058,0xff794a95,0xff8f80c1,0xffde0600,0xffdedb6f,0xffea7ac3,0xfff24c05,0xfff6d229,0xfffcbae2,0x0007a6f0,0x001692f0, -0x00189379,0x0019beb2,0x0019ccf6,0x0017d9a1,0x0015023d,0x0013d434,0x000bf694,0x00033c3d,0xfffb647c,0xfff575b6,0xfff13736,0xffebe8ee,0xfff090ee,0xffe5cbc5,0xffdfea5b,0xffd8e96e,0xffd2ac1e,0xffc92a37,0xffc39ce0,0xffbf394e,0xffbd7c9a,0xffb7ecb4,0xffb2922e,0xffaf6ed6,0xffba3feb, -0xffc7a802,0xffce94d1,0xffd2ab77,0xffcceb3c,0xffc99d93,0xffcf0446,0xffd3cc43,0xffda31f9,0xffe19cb9,0xffe6e689,0xffed0a31,0xffe941f2,0xffe833fe,0xffe7b0ea,0xffe78f31,0xffe7b6c5,0xffe86872,0xffe5c8a3,0xffe45581,0xffe24844,0xffe0f6f5,0xffdf66c8,0xffdc001d,0xffdd3959,0xffdbc43a, -0xffdda15d,0xffd3a320,0xffd349ab,0xffd43639,0xffd202a0,0xffceae49,0xffcacdbb,0xffc87d9a,0xffc6b7d5,0xffc0fa0d,0xffc28927,0xffc260f1,0xffccf7de,0xffcc042a,0xffcc98c9,0x00043dca,0x000371c3,0x0001c11d,0x0006f5be,0x0006e55c,0x000616dc,0xfffec58d,0xfffd66a9,0xfffc2bf0,0x00082859, -0x000ac162,0x0002c6e6,0x00091aeb,0x000b5b8b,0x001541ee,0x000aff1e,0x00064230,0xfffed812,0xfffe340a,0xfffc8f50,0xfffbd3c0,0xfffc7847,0xfffea59f,0xfffeca60,0x00095c8a,0x00075ea9,0xffff1ac7,0x0002ad51,0xffffe68d,0xfff6a36e,0xfff7b2a8,0xfff9161a,0x000523f5,0xfffe665b,0x00025194, -0x000a1399,0x0004f3dd,0x00115ca8,0x000e42a0,0x002002ab,0x0020751d,0x001a57a8,0x000168a9,0xfff85851,0xfff470c1,0x000d72a5,0x0011cd10,0x0000bfea,0x0015f4f7,0x0025a565,0x003f3841,0x0024d29b,0x00109d3f,0xfff6216b,0xffec388c,0xffe4563c,0xffe32438,0xffe47dfa,0xfff18e5b,0xffff1f08, -0x001138e2,0x00149f38,0x00008efd,0x0009bbd4,0x000104ee,0xffeea621,0xffeed24f,0xfff4bad3,0x0012ab05,0xfffe2fcd,0x000239d2,0x001cab67,0x0010a186,0x000ae752,0xfffe6163,0x001e63cd,0x00207c5c,0x001cc571,0xfff584ae,0xffed2d5c,0xffe08238,0x00229190,0x002fe18b,0x0005a4fa,0x00282d45, -0x0032c994,0x0069d4c2,0x003394c9,0x0016024c,0xffe9fb00,0xffe13349,0xffd5cffc,0xffd48d38,0xffdb5fa3,0xffef33f8,0x00034b0e,0x002731d6,0x0023aab1,0x00057846,0x0019444b,0x0001d2ab,0xffdcbbbe,0xffd52cbf,0xffde2c82,0x00154d7e,0xfff2487e,0x00066a2b,0x0032ccc6,0x00124c82,0x0033945c, -0x002757da,0x0065ebc0,0x00704f70,0x0062a660,0x001e1747,0xfff5702a,0xffce23a0,0x002442bb,0x002c8004,0xfff26610,0x00395965,0x00837d86,0x00db16f5,0x0080c89f,0x002d0113,0xffd18c4b,0xffac5ebc,0xff928f17,0xff927796,0xffa82e45,0xffd16d48,0xffef993a,0x003404ca,0x003f48f6,0x002c1a0c, -0x003b4810,0x002c92be,0x001eba64,0x002f3f77,0x002ab8fc,0x00516d66,0x000ea778,0x000ac251,0x004f97e4,0x00376303,0xff88444a,0xff93cafa,0xff6ad75d,0xff68ed43,0xff76e9e1,0xff7e8af4,0xffb60e70,0x005a86bc,0x004f63a3,0x00767094,0x00ccedd5,0x0022677c,0xff9dc382,0xff6fef95,0xff90c21e, -0xffe0707e,0x0038a6c0,0x006b6487,0x00884990,0x0072e40c,0x00536d18,0x004df92e,0x004f9c8d,0x0002f496,0xfffce82e,0xfffb865c,0x00590abe,0x0063415d,0xffff2660,0xffe501bf,0xffa6720a,0xff9f1fdf,0x00024026,0x00366dd1,0x00383bac,0xffbd44fe,0x0064f31a,0x007ea002,0x00961f63,0x00560720, -0x001452ae,0x00c54ddb,0x00e0f4e7,0x005ef892,0x000c1f1b,0xffc0d3e4,0xffa87c8d,0x00495eab,0x009cd096,0x0080ab74,0x000ab1a3,0xffd1f590,0xffdc555c,0xffdd584e,0xffe94cb8,0xffd02fb7,0xfff9d977,0xfff57668,0xffe240d4,0xffeb37ed,0xfff8f8ee,0x00181c1c,0xffd4cbdf,0xffb30d7b,0xffcc4232, -0x00204990,0x00409763,0x000dbb62,0xffa8bcda,0xff45affa,0xff2e8618,0xffe32a75,0xff568557,0xfdc95a4c,0xfe80368e,0xff26b05b,0xff7b6428,0xff57c77b,0xff3b51a3,0xfef87c8e,0x00a5f021,0x01027158,0x001808c1,0x000f1bad,0xffe64cb8,0xffeb53e7,0x000e5c03,0x002e7ff9,0x0031b668,0x00361b3c, -0x001fd81b,0xffe9ce74,0xfffb12b7,0x0008c1fe,0x0020d409,0xfffb3936,0xffe3af68,0xffe042ad,0xfffc4495,0x0014f4ab,0x0012a7eb,0xffe098cf,0xffbea330,0xffa43ef7,0x002a23c3,0x00453474,0xffaa3c46,0xffe63250,0x00b82e4f,0x0128b03e,0x00f244db,0x0087302c,0x004712f8,0x001e7fb0,0x001174a2, -0xffe9e38b,0xffc91ce8,0xffc3424a,0x0003301f,0x003e8e4a,0x005bf774,0x006afa88,0x0039e2e5,0x001375dc,0xffdfcb52,0xffcd8f70,0xffc09f34,0xffb752cf,0xffb81beb,0xffbaaeb1,0xffcf7b48,0xfff0a822,0x00040269,0xfffe866b,0xfffd590c,0xfff50d6f,0xffe8784e,0x00011134,0x00092eb7,0x00111917, -0x00012ae7,0x0014d2b5,0x0054252f,0x0068658a,0xff982ffa,0xff6271cc,0xff375d1e,0xff563d58,0xffa632bf,0x00251d7f,0x00695967,0x006c3da7,0x009296cc,0x009fe80b,0x00aebe10,0x0093b765,0x007e1865,0x006e60fd,0x0043d79a,0x0026aee3,0x000b4687,0x0001ace3,0xffe85f86,0xffcc3577,0xffbe5eac, -0xffaf7089,0xffaddc28,0xffb5c00e,0xffd46cb1,0x000d7b96,0x0009aadf,0x000e2389,0x0012d2ae,0x0029295c,0x002cbbfa,0x002e20a1,0x001c802e,0x0011bfe2,0x00080925,0xffddd7df,0x006cc7a4,0x006fcf7a,0x00942d75,0x0096ab9b,0x008de12a,0x0062a0e0,0x00455210,0x00315d57,0x001e5782,0x000a3fae, -0xfff99832,0xfff2bdc9,0xffef0599,0xfff38060,0x000423c5,0x00067a54,0xfffa293a,0xfff2e2f0,0xffe4f8c9,0xffceed6d,0xffceedb9,0xffd02c99,0xffda9dcd,0xffcd4493,0xffc729ba,0xffc77a82,0xffea7222,0x000fa0db,0x003468f1,0x004e3038,0x005ef87b,0x006145b3,0x006f6b52,0x00777a36,0x0072aced, -0x00724f42,0xffa6e4e1,0xffabdc7c,0xffc1a5c6,0xffdad0af,0xffff82de,0x0004941e,0x00032b47,0xfffc5a60,0xfff24dda,0xffee7e4f,0xffe92716,0xffef12a8,0xfff3fecb,0xfff8c71e,0xfff35500,0xfff19f40,0xfff3d044,0xffe3c840,0xffd5b9a3,0xffc7d7d5,0xffc56caf,0xffbfe61a,0xffbb9425,0xffbc9fcb, -0xffbea06d,0xffb7fcb4,0xffbfe0b1,0xffc2a6e2,0xffc338e0,0xffc18c62,0xffbeda4a,0xffbf680d,0xffb05d3c,0xff9c1bcb,0xff8ca477,0xff9cf7df,0xffcf1074,0xffcf0fe4,0xffdb2966,0xffe22c77,0xffe6c2c9,0xffee54c6,0xfffc23c3,0x000d2e67,0x000f6372,0x00101757,0x000f05b6,0x000cb58b,0x00095c32, -0x00084026,0xffff3ec5,0xfff6557a,0xffedc139,0xffe7843b,0xffe26609,0xffdcec2f,0xffe16fdf,0xffd92cf6,0xffd41b98,0xffce50f7,0xffc987eb,0xffc2995a,0xffbd0ba8,0xffb7d02c,0xffb475aa,0xffae620b,0xffa800a4,0xffa3e198,0xffad311e,0xffb933e3,0xffbfc931,0xffc4703f,0xffc63f91,0xffc335ca, -0xffc90e00,0xffce7df3,0xffd53128,0xffdc4a78,0xffe0b1a7,0xffe6396d,0xffe2da99,0xffe28639,0xffe2c9eb,0xffe2f894,0xffe34058,0xffe41307,0xffe10b9e,0xffdf3847,0xffdcda0e,0xffdabded,0xffd87965,0xffd450cf,0xffd5770f,0xffd41a08,0xffd55e7c,0xffce52d7,0xffcdb790,0xffcdc322,0xffcb237f, -0xffc7ea97,0xffc47e9a,0xffc20d26,0xffc04fd7,0xffba9589,0xffbd7180,0xffbe0ec0,0xffc5ca50,0xffc55194,0xffca1a0e,0x0007a300,0x0004d640,0x00043b38,0x0009f566,0x000acc13,0x000b7100,0x0003e8df,0x0002301b,0xffff8864,0x000c5dd9,0x000ec8da,0x0005a37e,0x000c9d13,0x000ef850,0x00182c38, -0x000fe967,0x000bb357,0x00048c61,0x0002d546,0x00009efd,0xffff3cd5,0x00001b64,0x000278a0,0x0004ff55,0x000c9901,0x0009dd75,0x0000d506,0x00043b2d,0x00008a76,0xfff55417,0xfff6ef42,0xfff8d6f0,0x00064ea4,0xffff5b44,0x0003a9bf,0x000dcc45,0x00062dc8,0x000d4d55,0x000e63c3,0x0020ccee, -0x00245e80,0x0022f7f5,0x000b2cb7,0x00025f67,0xfffa9754,0x0014fda9,0x00176e5d,0x00022c40,0x00173266,0x00273d0c,0x004147b7,0x002e81a5,0x001cf442,0x0002a26f,0xfff5ac58,0xffeb4e7e,0xffe7c8c1,0xffe8b5f4,0xfff7fff8,0x000b8691,0x0016a132,0x00174b63,0x00023c8a,0x000985f5,0xfffee5d4, -0xffe9144c,0xffe800ed,0xffee78e4,0x000fb754,0xfff94d86,0xffff413c,0x00217ce1,0x000d801d,0x000356bf,0xfffe2d8e,0x001fc4d6,0x002771db,0x002acf4b,0x0005bbfa,0xfffbc2fc,0xffe7023d,0x002bf88c,0x00376ce2,0x0009979f,0x002c0b99,0x00362ce2,0x006ac5bb,0x0041bdb0,0x002808b5,0xfffbb245, -0xffee745e,0xffe04557,0xffd97337,0xffe14e19,0xfff843af,0x0016af6f,0x002b7767,0x00264116,0x0002eaf5,0x00147958,0xfff7bac1,0xffc989eb,0xffc4a4e0,0xffceea70,0x000f3e0a,0xffe8c032,0xfffe2444,0x003a5fdb,0x000ae0ba,0x002122ce,0x0021d5d0,0x00614ff1,0x0074425a,0x00746ccf,0x0034bb21, -0x000f1e51,0xffddc86d,0x003335ab,0x00351aad,0xfff1ec9e,0x0032c98d,0x007a7001,0x00d60bfb,0x0099f6ac,0x004faa2d,0xfff271c4,0xffc4585e,0xffa2783e,0xff95f880,0xffab3cc7,0xffdf654b,0x001318e1,0x0043271a,0x0045d085,0x0026e6dd,0x003ab94c,0x0024240a,0xfff3692d,0x00092cde,0x000a0ad1, -0x003bdd04,0xfff4e4b1,0xfffb4908,0x005f1731,0x0029d32e,0xff7f2697,0xff9e22a2,0xff6c3392,0xff73a706,0xff936fcd,0xff93aab6,0xffbc6911,0x0045ec48,0x00508b72,0x00852ae9,0x00d6207c,0x004a56da,0xffc1321b,0xff7c9c1a,0xff836a01,0xffce2ba5,0x0035ad6f,0x006e92dd,0x009712eb,0x0093d17a, -0x00713cbc,0x0059ffd4,0x004800cd,0xfff46da1,0xfff13bd2,0x000efc72,0x003f76e1,0x0048a32b,0x000136e0,0xffee2c3a,0xffbb1bc5,0xffb92a25,0x000f7726,0x003210d7,0x0025446a,0xffab300c,0x0091125b,0x00886201,0x0084e847,0x002b9f1b,0xffd6207a,0x00b4377e,0x00e96b3a,0x0069044d,0x001b8e1b, -0xffbd1b3c,0xff851f1d,0x0018980d,0x007ebea4,0x00a4988d,0x0022e6bb,0xffe4b5a7,0xffe9ce44,0xffe197a4,0xfff2734a,0xffeb172b,0x000f105a,0x0005bd55,0xffde5184,0xffe8b449,0xffeea020,0x000fbcdb,0xffcf831a,0xffba2d8a,0xffd928c4,0x00188ed3,0x002e1bc0,0xfff752d1,0xff8e5b91,0xff40b5cd, -0xff49f315,0x001a57ee,0xff102a24,0xfd8f0dd0,0xfebf4274,0xff7e4e71,0xff9869b6,0xff78caba,0xff4b224a,0xfeec9b80,0x00893947,0x00ed319b,0x00135421,0x0009b7a4,0xffde8931,0xffe1dbde,0xfff9b461,0x001a3c68,0x00234d1c,0x002abfc1,0x001cd36c,0xfff1e708,0xffff41b7,0x000c09b3,0x001ed218, -0xfff79aca,0xffe29ad2,0xffd9ba2e,0x0003ad38,0x001c10c6,0x000e5cae,0xffdd672f,0xffc565ca,0xffc1bcac,0x00321d09,0x00438446,0xff997d1a,0xffb9a4a0,0x00f11b9e,0x016158b0,0x00fcf6f2,0x0072f7a1,0x002b0918,0xfffea5bd,0xfff940c8,0xffdec471,0xffc40f31,0xffb19df5,0xffd004fd,0x0022ecde, -0x004e808d,0x0062cdb5,0x003f5c7d,0x001dacbd,0xfff54ea1,0xffdc543b,0xffcbfaae,0xffbf5bfd,0xffbfb22d,0xffc74d8b,0xffde9dbb,0xfff79db7,0x000683f1,0x0006dd59,0xfffa4725,0xfff2807c,0xffef49a2,0x00076904,0x0009f19a,0x0012c0f7,0x000e4023,0x001c3ca2,0x00460743,0x0086ade6,0xff945803, -0xff74866d,0xff422c16,0xff5c1e25,0xffa2b8b8,0x0009a9e6,0x004619cf,0x0052440a,0x007e808d,0x0095557d,0x00a0c90a,0x008fb1fe,0x007e9387,0x0076730f,0x004555af,0x0022d965,0x0005506f,0xfff3aa49,0xffd73c62,0xffb95ae2,0xffb24553,0xffaae4bc,0xffa9907f,0xffbc488b,0xffd8ba50,0x000c1cee, -0x000129c2,0x00023c86,0x000b9b6c,0x001efd9a,0x00251b49,0x002ced9d,0x000be110,0x00019856,0x0002aa85,0xffd7821e,0x007c8663,0x007bb1d3,0x008e5efc,0x008991bd,0x00807861,0x0063f2f7,0x00519c49,0x0042e4ed,0x002babeb,0x0013b127,0x00040fcf,0xfffb493d,0xfff2eae3,0xffef89c7,0xfffd9f47, -0xffffd5a4,0xfff2999f,0xffeda843,0xffe656e4,0xffd802df,0xffda2744,0xffdaf7ad,0xffdd4a23,0xffcebde3,0xffcaa4c0,0xffd1a477,0xfffb3976,0x002152d0,0x003f484d,0x00547bec,0x005f2a8f,0x005d1188,0x006942fc,0x00740416,0x00766fd7,0x007a46e7,0xffb5175c,0xffb73367,0xffccc502,0xffe44233, -0x0003f652,0x000586b8,0x0000d19d,0xfff992e8,0xffef79b9,0xffed3b89,0xffeab7c7,0xffef113c,0xfff31fb2,0xfff6ea28,0xffeef070,0xffe95f55,0xffe6d303,0xffdbe9f0,0xffd1feff,0xffc7b593,0xffc23031,0xffbc1802,0xffb7444e,0xffba7b6c,0xffbc9154,0xffb92119,0xffc0f1fb,0xffc98c58,0xffcc7bc8, -0xffd38a03,0xffd66452,0xffde7d63,0xffcdf58b,0xffb8bd35,0xffa7d402,0xffb267f1,0xffbf1c78,0xffbf43e3,0xffca4024,0xffd0143b,0xffd50d01,0xffdddf64,0xffec4a3b,0xfffc1541,0xfffdd08e,0xfffd8d11,0xfffbcc66,0xfffa3cf4,0xfff7fec2,0xfff86822,0xfff03930,0xffe91873,0xffe1b385,0xffdc4843, -0xffd782bb,0xffd2cd83,0xffd57287,0xffd07c05,0xffcc70dd,0xffc81bff,0xffc441b2,0xffc02c7d,0xffba9d07,0xffb4a33e,0xffaefa3e,0xffa878b4,0xffa0fe8d,0xff9b412f,0xffa2c537,0xffac64e8,0xffb1fb3b,0xffb72bfc,0xffc29f4b,0xffc08202,0xffc60c90,0xffcb65d3,0xffd141d8,0xffd6d387,0xffd9e6ee, -0xffde6367,0xffdc552b,0xffdd161d,0xffde2a89,0xffdecb0d,0xffdf28d0,0xffdffd5b,0xffdcf315,0xffdafbf2,0xffd8995b,0xffd61b81,0xffd37fa6,0xffcf7967,0xffd01ea0,0xffcee944,0xffcf3d19,0xffcc1d05,0xffcb45f3,0xffca6885,0xffc75191,0xffc44303,0xffc19281,0xffbeeb12,0xffbd367e,0xffb7bef5, -0xffbc03e5,0xffbd75e6,0xffc14373,0xffc16a24,0xffcad5b4,0x000a6fb3,0x0005ecef,0x00068b64,0x000c81b4,0x000e157c,0x000fe16e,0x000850f1,0x00064a57,0x0002aca6,0x000f5ed3,0x0011ab67,0x000892e5,0x000f8891,0x0011d2b9,0x0019ce9d,0x0013b442,0x001030a4,0x000a0aa6,0x0006e1de,0x00042e25, -0x000243fe,0x0003226f,0x00059b58,0x000aa604,0x000e8d63,0x000b94e5,0x0002e1bc,0x0005757e,0x000140cd,0xfff5d93d,0xfff701c6,0xfff9512e,0x0007dd2c,0x0000841f,0x0004a958,0x00114d3a,0x000716d1,0x00094de3,0x000e6143,0x0020aaf0,0x0026a8bd,0x00294e7c,0x00132de5,0x000aecdb,0x0000b785, -0x001a3763,0x001b1a58,0x00046ab0,0x00176ad7,0x0026e8c8,0x003fde3d,0x0035330e,0x00273593,0x000f6efd,0xffff0e60,0xfff28f38,0xffed4523,0xffedf062,0xfffde046,0x00151266,0x001a77aa,0x0018b2e3,0x00037fce,0x0007c7df,0xfffbd653,0xffe629f5,0xffe26b9c,0xffe925ea,0x000cc1bc,0xfff55062, -0xfffce720,0x0024ab6b,0x000a4c9a,0xfffc80b6,0xfffec514,0x00215739,0x002d4a3f,0x00360822,0x00138d87,0x00081d6d,0xffee5323,0x00308e8e,0x003b0039,0x000f97b7,0x002ee3aa,0x00381a0d,0x0066e7a5,0x004bedca,0x0036e45a,0x000ea09a,0xfffae5be,0xffea2fa4,0xffdf945d,0xffe73fd5,0xffff425f, -0x002472a0,0x002c0871,0x0025fcd2,0x000038ed,0x000c7a3b,0xffecdfbe,0xffbdcc91,0xffb79f64,0xffc2d9bd,0x000a649b,0xffe1cafd,0xfff6fc16,0x003e3427,0x00037a54,0x000f2545,0x001cf9f2,0x005aa472,0x007432d0,0x00806e4a,0x00468f9d,0x00255b82,0xffefa9c2,0x003c1cc8,0x00390113,0xfff57e52, -0x00295ed1,0x006b4f7d,0x00c5fce3,0x00a9b1a1,0x006d309e,0x001707a1,0xffde4c26,0xffb51d0b,0xff9fc1f2,0xffb2db4d,0xffec96e2,0x0031d877,0x004dce01,0x00485778,0x0023a070,0x003469b9,0x00177f1f,0xffcf37cd,0xffe4100f,0xffe9da02,0x0025d4dc,0xffdc8562,0xffec15c2,0x0068312c,0x001a878d, -0xff7b74b7,0xffa8e0a7,0xff75a061,0xff84ee91,0xffadac94,0xffa358d2,0xffbbb43c,0x00243980,0x004baa2d,0x0090f376,0x00d9ab5e,0x007f369e,0xfff89ade,0xff929951,0xff828f24,0xffbde08b,0x00270d0c,0x0063f4c5,0x009478c6,0x00a16855,0x00819d79,0x005b1dfa,0x00358e6c,0xffe297d2,0xffe42d99, -0x0020201c,0x00260d3a,0x002af61e,0xfffecc13,0xfff61f38,0xffd29bf6,0xffd9d89c,0x001e85d5,0x002f33f7,0x00123504,0xff9f390d,0x00b91bf6,0x008a94e9,0x0063ae98,0xfffd549c,0xff9f1644,0x009a19e1,0x00e1fdf4,0x007142de,0x00282297,0xffba1b18,0xff60fa37,0xffe7558b,0x00595940,0x00b332d0, -0x0039457b,0xfffa55ba,0xfffad97c,0xffe6f95e,0xfff8e7d1,0x000733e2,0x0020fd85,0x00147fab,0xffe0feb0,0xffec81b0,0xffe865c5,0x0004d85e,0xffce2bbf,0xffc6417f,0xffe3c062,0x000edd7f,0x00197e83,0xffe2156a,0xff77ba68,0xff40f0da,0xff6c4043,0x00507111,0xfeb8dfdc,0xfd8735dc,0xff16a3ac, -0xffddec1f,0xffae71ce,0xff98687a,0xff65a84f,0xff0b4bfe,0x0054c500,0x00b9fc86,0x002309ca,0x00045893,0xffd473f6,0xffd71038,0xffe426b9,0x0003e494,0x0013df0c,0x001f551f,0x001c73c5,0x0001f874,0x00098cfd,0x00114f64,0x00186133,0xfff37198,0xffe3428c,0xffd593c7,0x00089047,0x001dc0fe, -0x000a256f,0xffde36fe,0xffd0e558,0xffe4782c,0x00299038,0x002ea12d,0xff9bedc6,0xff69894c,0x011d1e7c,0x016cde22,0x00e3e444,0x00528869,0x000c97b9,0xffe42bc1,0xffe34840,0xffd753c8,0xffc19549,0xffa97830,0xffb22c89,0x000af578,0x003ef6fc,0x0054877e,0x0040294b,0x0023d7ed,0x000af67b, -0xffead710,0xffd835b3,0xffcb50c1,0xffca7b7b,0xffd7ce4d,0xfff08444,0xffff6ae4,0x0007cf00,0x000c3446,0xfff8272d,0xfff054d7,0xfff4d37a,0x00081cb2,0x00087080,0x00157cf5,0x002190b3,0x0028446a,0x003d3fc2,0x00a6bbc2,0xff961c48,0xff8ccb35,0xff62a45c,0xff77cc88,0xffaa4887,0xfff7a5c1, -0x00279759,0x003859d2,0x0069478b,0x0087d462,0x008f95ac,0x0087e1ac,0x007935a8,0x00741a5d,0x00416de2,0x001c492a,0xffff54c9,0xffe4270d,0xffc69e6b,0xffac954a,0xffa99cca,0xffa841a6,0xffa657ea,0xffc4ddd9,0xffde502f,0x00059a77,0xfff9f688,0xfff880d5,0x00014937,0x00106cf1,0x001a6a74, -0x00292cc7,0xfffd3be9,0xfff460da,0xfffa8835,0xffd0475c,0x007ab2ba,0x0076fc47,0x0078d0ea,0x00728e44,0x006f03a2,0x0063ed5b,0x005f82bb,0x005a0a53,0x003fd3f4,0x00251973,0x00166596,0x000b8c7e,0xffff9c88,0xfff30501,0xfffd2d12,0xfffcc7b3,0xffec7ac6,0xffeb4d4b,0xffe97fc8,0xffe319ef, -0xffe3f529,0xffe27188,0xffdd92a8,0xffd11c1b,0xffd16030,0xffdf58c9,0x000c220e,0x002f9377,0x0043722f,0x005143b8,0x00548b1a,0x004f2977,0x0059a3f0,0x0064f158,0x006bcede,0x0070d917,0xffcae246,0xffca803f,0xffde0015,0xffef4623,0x00044556,0x0002467a,0xfffc1313,0xfff6c911,0xfff08a46, -0xfff27fd7,0xfff53795,0xfff5fab4,0xfff78000,0xfff92e0d,0xffedc424,0xffe3dd7b,0xffdc11d4,0xffd64aa1,0xffd003cd,0xffc96684,0xffc26437,0xffbc5def,0xffb71796,0xffbc7aa5,0xffbf279b,0xffbeaa95,0xffc6d049,0xffd4f7b9,0xffdad389,0xffea9a84,0xfff2b928,0x0001a286,0xfff11a50,0xffdcb0ba, -0xffcc424b,0xffd073ad,0xffb1e4bf,0xffb3e1ed,0xffbc4cd8,0xffc0c24d,0xffc655bb,0xffcf8e97,0xffdc4ff3,0xffe80f60,0xffe93b77,0xffe811f6,0xffe673af,0xffe6809a,0xffe6705f,0xffe91ac4,0xffe2e3e6,0xffde71bf,0xffd8f0cf,0xffd4d67d,0xffd0f4b3,0xffcd5922,0xffce8447,0xffcc1651,0xffc8ff88, -0xffc60670,0xffc2da50,0xffc0bdee,0xffbb7a37,0xffb5210f,0xffadabf4,0xffa6fd31,0xff9f364d,0xff9810ae,0xff9dd9a3,0xffa476be,0xffa85aa8,0xffae5c51,0xffc24d3e,0xffc1c712,0xffc62c33,0xffcab773,0xffceceb7,0xffd219df,0xffd3c7be,0xffd70534,0xffd6d3f2,0xffd8bd37,0xffda86c1,0xffdbbb8f, -0xffdc4f8b,0xffdd4eb7,0xffda6a36,0xffd875a3,0xffd64b9f,0xffd3ac01,0xffd0f2d3,0xffcd441a,0xffcd974c,0xffccc329,0xffccaeb6,0xffcc3972,0xffcb7044,0xffca893d,0xffc73c5c,0xffc47102,0xffc28f5b,0xffbfda03,0xffbe431e,0xffb974db,0xffbe9f94,0xffc08b60,0xffc04d91,0xffc0eb51,0xffcd43c2, -0x000cfd7a,0x0007d218,0x0008d24b,0x000edf5c,0x00110f41,0x0013f0e1,0x000c7886,0x000a3111,0x00060e0a,0x00117c6d,0x0013a8b7,0x000be4bb,0x001209ea,0x00142516,0x001ac532,0x0016d9c9,0x00141c30,0x000f4b0b,0x000a84e6,0x00075c36,0x0004e475,0x000668da,0x0008ccab,0x000eee43,0x00103269, -0x000d2f77,0x0004c1a4,0x00065730,0x00020e36,0xfff7ccd0,0xfff802f9,0xfffa9c03,0x00099eaa,0x000270b3,0x00061a59,0x0013fcb4,0x0008ac0c,0x00073564,0x000ea30a,0x00202a69,0x00283647,0x002e6f26,0x001a6cf1,0x00129fb4,0x0006fe21,0x001d2b49,0x001cfcb6,0x00082b37,0x0017ac90,0x00262e21, -0x003cf512,0x003a4789,0x00301adf,0x001bdda0,0x0008112e,0xfff9b8c7,0xfff33f4d,0xfff48dfd,0x0003e805,0x001bd61f,0x001d1dd4,0x00194177,0x000446be,0x000566cd,0xfff8fc41,0xffe64ab2,0xffdf0e4e,0xffe56949,0x0009ec34,0xfff2c166,0xfffb9b4b,0x0025e9a1,0x00085eec,0xfff926b2,0x00001dec, -0x002305c7,0x00328306,0x003fce51,0x00207915,0x0013797e,0xfff7713c,0x003093f3,0x003a8c6b,0x0017f646,0x00311195,0x0039909f,0x0060ca6d,0x00538055,0x0043726e,0x00215945,0x0005f9ef,0xfff2d80d,0xffe5cd3d,0xffee36c1,0x00055d93,0x002bfd38,0x0029f712,0x002398b0,0xfffc72cb,0x0002c883, -0xffe298e2,0xffb9d098,0xffae6c4f,0xffba83e3,0x00065aff,0xffddb622,0xfff1ba68,0x003e050c,0xfffe6255,0x000122dd,0x00180224,0x0052b58b,0x007247db,0x0088ffee,0x00566a51,0x00393268,0x0002e909,0x003ece9b,0x00387b17,0xfffe46a1,0x00215ccd,0x005ccd43,0x00b24200,0x00b3dde4,0x0086bed1, -0x003c3cee,0xfff8b783,0xffc8e49f,0xffae1498,0xffc07e19,0xfffa7d37,0x00486a92,0x00537aa3,0x00470719,0x0020d6df,0x00292e02,0x0007b396,0xffb6151b,0xffc3063b,0xffcc59f4,0x001143c1,0xffc774c0,0xffdeaae1,0x00696419,0x000cfb71,0xff81d3f1,0xffb6f1fa,0xff89df1f,0xff9d5064,0xffc0b99c, -0xffafa4c5,0xffb88558,0xfffbe0e6,0x00406b51,0x0095c1a9,0x00d42cd7,0x00b503ec,0x00361503,0xffa65b56,0xff8a8854,0xffb10e1e,0x000df533,0x004c1e43,0x007fa630,0x009a9d4d,0x007f654a,0x004dcaf0,0x001b6408,0xffcef051,0xffd710c8,0x002d8bdb,0x000ff585,0x000d72e0,0xfff7cc4f,0xfff90c46, -0xffe92d2c,0xffff303f,0x002f1ed7,0x002ea335,0x00029122,0xff9cc0de,0x00d54821,0x007f9778,0x003c89bd,0xffd47ae8,0xff70d371,0x00747217,0x00c85aea,0x00745a5b,0x0032fdaa,0xffb8c7cd,0xff417554,0xffbab559,0x003113e7,0x00aa7f06,0x004e2678,0x001469cb,0x000da3e6,0xffef00df,0xfffe2435, -0x00202def,0x002de68c,0x0020ff96,0xffe944a4,0xfff5a5f3,0xffe73b88,0xfff912ab,0xffcfbab8,0xffd431eb,0xffebfdc2,0x0005de90,0x000413b8,0xffcbc951,0xff642f15,0xff44b043,0xff9282e8,0x007c68c7,0xfe652034,0xfda3f038,0xff6ad837,0x002b19f0,0xffc1696e,0xffc643fe,0xff9315d4,0xff32f5d4, -0x0012ab06,0x007b3dc1,0x0044c2fb,0x00043f9a,0xffcb3ab5,0xffcccbe4,0xffcf9742,0xffec3a2b,0x0002c0ff,0x00141e0f,0x001d75bd,0x00147c77,0x0015b15e,0x0015a3dc,0x000ddba5,0xffee33a1,0xffe49273,0xffd34c35,0x000a0552,0x001a9074,0x00064be7,0xffe2fd45,0xffdecb80,0x00035359,0x0010f458, -0x000d7fa3,0xffb4f133,0xff125dde,0x0135288e,0x0146df2a,0x00acf604,0x002f542b,0x000092aa,0xffd2b52f,0xffd1ac96,0xffd8d0df,0xffc8bdcc,0xffadd920,0xffa6da87,0xfff8e1b1,0x002fecd7,0x00440254,0x003d3430,0x0027f474,0x001f85c4,0xfff91ffe,0xffe4ec0f,0xffda39ce,0xffd86df5,0xffea5e1f, -0x00035058,0x00077d44,0x00083573,0x000cf72e,0xfff75117,0xffef6fc2,0xfff85714,0x0004a95e,0x0005408a,0x001ba815,0x0036f6bf,0x0036d5fd,0x003ff7c0,0x00c67b95,0xff9c95c6,0xffa9c49b,0xff92c8e3,0xffa05229,0xffbbaab2,0xffeee7c4,0x0010e795,0x002519da,0x00550bb5,0x0079ac72,0x0080bfdf, -0x007f90c2,0x00702a95,0x00681654,0x003ba791,0x0015986b,0xfff83780,0xffd55056,0xffb8f5e6,0xffa64ce3,0xffa44291,0xffa746b5,0xffa53af8,0xffce2aa9,0xffe4d276,0xfffcf263,0xfff45d25,0xfff0f47d,0xfff51496,0x000034fb,0x000f26d8,0x0024a056,0xfff39cae,0xffec3bd3,0xffefc440,0xffc8c583, -0x006a1f80,0x0062059b,0x0057245c,0x00561120,0x005e1fbc,0x0061f8f1,0x006b8240,0x007313fe,0x0058226e,0x003c160d,0x002c6271,0x002108b8,0x0013fe21,0xffffc92b,0x0002fe86,0xfffd91cf,0xffe99aba,0xffeba158,0xffec9d93,0xffeb9c7d,0xffe9534a,0xffe526e5,0xffdbd30a,0xffd452bc,0xffda2e95, -0xffee5da2,0x001a78dc,0x003840c3,0x0040e750,0x0046aaa6,0x0042c451,0x003bd736,0x0043e843,0x004dcbe5,0x0057306d,0x005c2064,0xffe7429a,0xffe5b5a2,0xfff6281e,0xfffe33d2,0x0005c211,0x0000d56d,0xfffafa47,0xfff8edb8,0xfff745e0,0xfffd69e1,0x00049041,0x00000b33,0xfffce0bf,0xfffb34b1, -0xffed78a5,0xffe0ac62,0xffd4f00d,0xffd37673,0xffd016e8,0xffcc9065,0xffc56d08,0xffc01340,0xffbab417,0xffc1eff4,0xffc50e9c,0xffc6b3be,0xffd0b581,0xffe4daec,0xffeee8be,0x0005c998,0x0012a5c5,0x002739bb,0x001702f7,0x0004c60f,0xfff5a182,0xfff3a8f6,0xffac54c0,0xffb0cb31,0xffb56245, -0xffb87a5c,0xffbe4b9d,0xffc69db8,0xffcfa298,0xffd5a8c7,0xffd67b2b,0xffd4c743,0xffd40d2a,0xffd620ed,0xffd8e49c,0xffddc97b,0xffd984a6,0xffd747a8,0xffd365e0,0xffd038e6,0xffcced09,0xffca0116,0xffcaf052,0xffc9db74,0xffc7a49b,0xffc5df10,0xffc36a38,0xffc21d4a,0xffbe24b8,0xffb852f9, -0xffb0716c,0xffaa9d29,0xffa3f238,0xff9c9816,0xffa13b03,0xffa4e7a5,0xffa6de6b,0xffadb86e,0xffc52536,0xffc5d1f5,0xffc88bcc,0xffcbb84d,0xffcd8e1c,0xffce6dd3,0xffceeced,0xffd0d6e9,0xffd28741,0xffd559dd,0xffd793af,0xffd94adf,0xffda10e9,0xffdb6ab2,0xffd8a23c,0xffd6c03c,0xffd4dd84, -0xffd24c1d,0xffcfafe2,0xffcc30ff,0xffcd0a5c,0xffcce7ae,0xffcd1991,0xffcd0319,0xffccd22e,0xffcc5a7e,0xffc96b03,0xffc728e9,0xffc64c25,0xffc40286,0xffc2d911,0xffbf6d8a,0xffc4b473,0xffc65019,0xffc31b7e,0xffc3e924,0xffceb7e4,0x000f017f,0x0009bb53,0x000b0656,0x0010be15,0x001371d9, -0x00178b12,0x001012fa,0x000d91d7,0x000931f5,0x00129416,0x00149c34,0x000f3cf3,0x0013cc9f,0x00158d8a,0x001a884f,0x00191186,0x00172b88,0x0013a4df,0x000d66bd,0x0009db80,0x0006f07e,0x00091c9c,0x000b3701,0x00117186,0x0011042d,0x000de5d4,0x0005bcc8,0x00067fd3,0x000283eb,0xfffa6128, -0xfff92d24,0xfffbdbd2,0x000aa272,0x0004078c,0x0007535f,0x00152ff1,0x000a087c,0x000650f0,0x000f29dc,0x001f4e83,0x0028e4ca,0x0032d854,0x0020d979,0x001929f2,0x000c9608,0x001de7da,0x001d4b5f,0x000d7143,0x0018464f,0x00254691,0x00385c6e,0x003dba0e,0x00375afa,0x0026b050,0x00100877, -0x00007aae,0xfff91e71,0xfffbab63,0x0009dd28,0x001f657b,0x001e5f40,0x0018b701,0x0003b815,0x00026c40,0xfff64ccb,0xffe84399,0xffdd5d21,0xffe2d731,0x00064d97,0xfff1233b,0xfffab7f9,0x002404df,0x000770cb,0xfff8f70f,0x00026828,0x0024c5fb,0x0036d79c,0x00494bdc,0x002c1f3d,0x001d8272, -0x0000f147,0x002ce80e,0x00369486,0x002202ac,0x00327181,0x003a1870,0x005711ea,0x0057f9aa,0x004d2045,0x00318e4b,0x000efbe4,0xfffa0639,0xffeb196d,0xfff54c61,0x000acffc,0x002d331f,0x002607f9,0x001f758f,0xfff6d752,0xfff87bf9,0xffd998ab,0xffbbccea,0xffa870e6,0xffb4cf89,0x0001769f, -0xffdbcb31,0xffee384d,0x00393812,0xfffc0216,0xfff7f283,0x00146ea4,0x004a3c10,0x006edfe8,0x0090cfa2,0x0064d283,0x0049cdbf,0x0014a745,0x003c2636,0x0035208c,0x000d1b19,0x001e7a58,0x00525fa0,0x009c0483,0x00b8de0c,0x009b8b16,0x005e4778,0x0011bc06,0xffdd96b0,0xffc01d42,0xffd38c06, -0x0009a728,0x0055a3e9,0x00544900,0x00423776,0x001c680b,0x0019a4d0,0xfff59eb7,0xffa98281,0xffa67fc2,0xffb1f403,0xfffddcc3,0xffb64ba3,0xffd3792b,0x0061a666,0x000220b8,0xff93757a,0xffc94df4,0xffaaa467,0xffbcd7e6,0xffcc389f,0xffba5cfd,0xffb69cfc,0xffd5350a,0x0031cc5d,0x00906c55, -0x00c0e312,0x00d96fc9,0x00664fb5,0xffb1a656,0xff948990,0xffa62703,0xffeebf11,0x002aca60,0x005a5208,0x007cab03,0x0067d6ca,0x00315ed8,0xfffce471,0xffbb9c52,0xffcba54f,0x00375861,0xffff0ced,0xfff45a23,0xffee6b20,0xfff713a6,0xfffd574d,0x002638e4,0x0040ea3e,0x00317b95,0xfff99096, -0xffa596da,0x00df94c8,0x006a3411,0x001815cd,0xffb55010,0xff4e8e38,0x0044e844,0x00a01ab8,0x006ef4e1,0x003b7eb4,0xffbb817a,0xff2cf7f6,0xff9462f8,0x000824ef,0x00901068,0x00626248,0x00341808,0x00204310,0xfffab073,0x0005311a,0x00351407,0x00360901,0x002ad0cf,0xfff4e781,0x000203f9, -0xffea7a3b,0xffecc6c5,0xffd338c6,0xffe18ce7,0xfff1a35f,0x00011884,0xfff1f6c1,0xffb4e557,0xff52be76,0xff49b0dc,0xffb81ded,0x0097bfe6,0xfe29d08c,0xfdd554c4,0xffa17c52,0x005390d5,0xffe019a1,0xfff8c6d3,0xffc0368d,0xff5710a4,0xffccfb39,0x003cab2d,0x00720af0,0x000b7b20,0xffc5e4e1, -0xffc4f0fb,0xffbda14b,0xffd43d4f,0xffee8971,0x0008210b,0x001c1516,0x0021c8af,0x001ea1cc,0x00160ef1,0x000059fa,0xffe79903,0xffe51420,0xffd3cf89,0x00087b86,0x00142725,0x0003cfe0,0xffe98b34,0xffeb0193,0x0017ba26,0xffeff3e8,0xffeb8e75,0xffe05aee,0xfecd697a,0x013364d6,0x00f6a9dc, -0x0066fe2c,0x001078b8,0x000eb034,0xffcc9390,0xffc629a9,0xffe0ca8a,0xffd6c538,0xffbb551f,0xffa763f6,0xffed3f1b,0x0022d3c5,0x003332e1,0x003821dc,0x002c673a,0x00309dc1,0x0006e7a5,0xfff1949d,0xffe95df3,0xffe8d097,0xfffcfbed,0x00149986,0x000f39ee,0x0007c3c3,0x0008b7c6,0xfff79892, -0xfff02fc6,0xfffb14db,0x0000bf2c,0x00035c2e,0x00267318,0x0046e9ee,0x004261ce,0x0050ac6f,0x00dfd5ae,0xffa78bd6,0xffc8d5c1,0xffc78303,0xffc9ed40,0xffce9386,0xffeb7e2b,0x000316e5,0x001a1337,0x00426b95,0x006b3d53,0x00767516,0x007762bc,0x0066678b,0x00594da8,0x0035dd16,0x000ff6ba, -0xffef5824,0xffc93c04,0xffb0ad99,0xffa611c2,0xffa20b8f,0xffa84912,0xffa7a32d,0xffd750cb,0xffebcad7,0xfff514a5,0xfff09e04,0xffeb9472,0xffe96c6f,0xfff28427,0x0005a0e0,0x001f1e99,0xfff02998,0xffe903be,0xffe2f779,0xffc25fb1,0x004dde6d,0x00413b04,0x002de9f0,0x0035bf26,0x004b4f4f, -0x005f71e9,0x0075d5c5,0x00892f99,0x006fdd0a,0x0054f722,0x0045bc1e,0x003ac4b3,0x002db9e4,0x001417ae,0x000e440c,0x000286f4,0xffeb4259,0xffeee16b,0xffef1a4c,0xffef3486,0xffe94050,0xffe39b81,0xffd94c07,0xffd8e445,0xffe45115,0xfffcc437,0x002472dc,0x003a8dfc,0x0038c3d2,0x0037bc32, -0x002e9951,0x002741b3,0x002d75d9,0x0034d834,0x003ef5be,0x00417d17,0x0007744e,0x00071a60,0x00149ebf,0x0013b03c,0x000f2a65,0x00073353,0x000217b0,0x0002efec,0x0004a5e1,0x000d0492,0x0015e4d9,0x000aa7d3,0x00010ac6,0xfffa3fea,0xffecabe3,0xffdf63d6,0xffd1fb22,0xffd3570a,0xffd247f1, -0xffd0e7a3,0xffca6ca6,0xffc60808,0xffc0cba0,0xffca5078,0xffce21ef,0xffd2540d,0xffdebcf0,0xfff8953e,0x00073ded,0x0021655d,0x0030e252,0x0048486a,0x0038e28c,0x002a2023,0x001cf20f,0x0016f891,0xffafcf63,0xffb64fd8,0xffb6c012,0xffb8544b,0xffbdc6ea,0xffc40e78,0xffc86eec,0xffc894d0, -0xffc93eca,0xffc7701a,0xffc80d0b,0xffcbe3cd,0xffd15003,0xffd7b629,0xffd4f104,0xffd3f2c4,0xffd15b03,0xffce997d,0xffcb8cad,0xffc8b892,0xffc8c84f,0xffc8ee7b,0xffc72766,0xffc6256a,0xffc3fb5b,0xffc281e0,0xffc12b59,0xffbd30df,0xffb6b078,0xffb3661e,0xffafac9a,0xffaa1240,0xffadea91, -0xffaeeb54,0xffaf16fd,0xffb642cf,0xffc94a04,0xffcb741b,0xffcc4371,0xffcddf4e,0xffcd8394,0xffcc73ff,0xffcc2a5d,0xffcce828,0xffcfcdc9,0xffd2e14e,0xffd502d3,0xffd6ed70,0xffd7b6a2,0xffd95b70,0xffd6c7a1,0xffd51908,0xffd381a6,0xffd13efc,0xffcf0267,0xffcc1f5e,0xffcca930,0xffccc4b8, -0xffcd482d,0xffcccbf5,0xffcccb9f,0xffcca6f5,0xffcadaa1,0xffc98652,0xffc9fc1c,0xffc8b15b,0xffc85b00,0xffc7163e,0xffcb9e9e,0xffccd92b,0xffc75d2b,0xffc8150e,0xffce559e,0x000f838d,0x000b2437,0x000c35e7,0x00116076,0x0014510a,0x001979e5,0x00121d23,0x000f6756,0x000abe26,0x0011bfde, -0x0013aa8a,0x00114ecd,0x0013fe81,0x00154d29,0x00185e2f,0x0019672d,0x00184f40,0x0015d650,0x000e9af8,0x000ae900,0x000790bf,0x000ab528,0x000cd09f,0x0012e618,0x00108867,0x000ddd31,0x0006629d,0x0006abf5,0x00032898,0xfffd5742,0xfffacd84,0xfffd6556,0x000afa33,0x000538a4,0x0007ba1f, -0x00156187,0x000b35cf,0x0006d3d7,0x000f3a1c,0x001d3976,0x0027c16a,0x00350e31,0x00254750,0x001d6355,0x000fc6a6,0x001bb90b,0x001b41db,0x00126d52,0x00185356,0x00236046,0x00316993,0x003e12ca,0x003b3aea,0x002de45c,0x0015d841,0x00060fa0,0xfffe3ae3,0x0002e23b,0x000eada6,0x001f536b, -0x001df9ec,0x0017089d,0x00012d1f,0xfffeba7d,0xfff3a920,0xffea846d,0xffdcd080,0xffe0fc12,0x0000e1d9,0xfff02a84,0xfffa196e,0x001e6a16,0x00067dc6,0xfffba08d,0x000614ad,0x00253646,0x0038e0df,0x004fec3b,0x0034e0ac,0x0024f3db,0x000780fa,0x0024e0b7,0x002e7b37,0x002aca55,0x00322b8c, -0x0038c955,0x00495eb2,0x0057ce31,0x0051d2da,0x003c4709,0x0014e2a6,0xffff1ed2,0xffef7839,0xfffb96d5,0x000ed285,0x0028607b,0x0020b528,0x001a805a,0xffeef19c,0xffef03a6,0xffd1ad6c,0xffbfed4b,0xffa506d8,0xffb1b6c5,0xfff9d107,0xffdc20f4,0xffecd88d,0x002fc22f,0xfffbe4ea,0xfff3e270, -0x0012722d,0x003f5956,0x006813db,0x00953fa8,0x006fac02,0x00557543,0x0020e539,0x0033e8b1,0x002e716c,0x001e4e1e,0x001fd442,0x004ae090,0x0082c829,0x00b64fe7,0x00a81ba8,0x00785d09,0x00273744,0xfff26ad8,0xffd52fe8,0xffea1a85,0x0017c9a6,0x00589a12,0x0050959f,0x003ae034,0x00145380, -0x00070280,0xffe312b0,0xffa7ce4b,0xff8f274c,0xff9b855a,0xffe9d8e0,0xffaa01dc,0xffcbbb2c,0x00500d1c,0xfff99613,0xffb27340,0xffdf5856,0xffd6717c,0xffe1dc20,0xffd1e3cb,0xffc4b04a,0xffb72167,0xffb46cfe,0x001faa26,0x007f44f7,0x00a12238,0x00e41494,0x00811283,0xffb559f6,0xff9c07ba, -0xff9afa1f,0xffcb45f7,0x0002fb36,0x0028ab13,0x0048d298,0x003e1761,0x000aa2e0,0xffdd8ba3,0xffab5e95,0xffc38f4c,0x003db44b,0xfff3afeb,0xffe2ce1d,0xffe62f76,0xfff2c6da,0x000f13df,0x004c27fe,0x00534eaa,0x003867c0,0xfff836b1,0xffbc5a58,0x00d78c38,0x004e45e7,0xfff8cc0c,0xffa041b5, -0xff3d9acc,0x0010ddf4,0x006fbc5c,0x0063bb83,0x0042992b,0xffc517dc,0xff273a89,0xff7752ef,0xffe1afa1,0x0068c6b1,0x00714abf,0x0054aab5,0x00324a59,0x000ae657,0x00102a12,0x0046a26a,0x003aa039,0x0030e694,0x000236be,0x000ee49d,0xfff08e80,0xffe0d933,0xffd7c8aa,0xffed6221,0xfff5d924, -0x0001b25e,0xffe609b8,0xffa00c9c,0xff416f77,0xff4e32ef,0xffdb0fea,0x00a231fe,0xfe12f1bc,0xfe15d490,0xffb46228,0x0053a8b1,0x00110668,0x00220b9c,0xffdb6506,0xff719ec8,0xff8b2cef,0x0000ca19,0x009c7e15,0x0015c886,0xffc4e773,0xffbd8560,0xffaf69bb,0xffbe6868,0xffd8d8d0,0xfffad947, -0x00147c2e,0x002245ce,0x00202253,0x0010f01a,0xfff1d23f,0xffe0210c,0xffe4309a,0xffd736e9,0x00056e9c,0x000ce224,0x0001b8fb,0xfff0855e,0xfff2fd2a,0x001da0e2,0xffd08f6a,0xffd0cb3e,0x000a6b5c,0xfea8a11a,0x01167c16,0x008f567a,0x0028ace5,0x00012e5d,0x002e19ec,0xffd9fd37,0xffcaef32, -0xffe7cb7b,0xffe4c747,0xffcc6878,0xffb4221c,0xffe7ca62,0x0016d94e,0x0020c04d,0x00317512,0x003208e0,0x003d08ff,0x0013f125,0xfffeb065,0xfff71771,0xfffa1407,0x000de21f,0x00227ad8,0x0015c344,0x0006c2e5,0x0000e558,0xfff8041f,0xfff2e598,0xfffe643b,0xffff7dd8,0x000474d0,0x00331ee6, -0x004cc679,0x0046eff1,0x006a6a8a,0x00ebd787,0xffb7d58e,0xffe717db,0xfff75e6f,0xffed73e4,0xffdbac75,0xffe83cbc,0xfff9610d,0x00110791,0x00310f28,0x005b10af,0x006c3968,0x006e2cdc,0x005df0f0,0x004d0463,0x002fc194,0x000aa7c1,0xffe702cf,0xffc1d7eb,0xffadf34a,0xffa98dca,0xffa321cd, -0xffabbe94,0xffaf22b0,0xffe00fa3,0xfff2bbb4,0xfff088b6,0xffeea7c6,0xffe82d79,0xffe1aa6d,0xffea4f7d,0xfffe6fba,0x00180f36,0xfff236dd,0xffe9c411,0xffd7ab31,0xffbef88e,0x002b254f,0x001a5fc8,0x00023253,0x0013ba4b,0x0035871f,0x005b6d73,0x007b8262,0x009518ec,0x0081fe26,0x006d0c72, -0x006215a6,0x00566775,0x00486acd,0x002af779,0x001ddf3e,0x000bff47,0xfff0f0d0,0xfff45ce4,0xfff0910d,0xffedae7b,0xffe50e4a,0xffdfa548,0xffd7d652,0xffdf4788,0xffef054b,0x00091985,0x00294b91,0x0036e455,0x002becb7,0x00275e58,0x001c7636,0x0015046b,0x001a2dd6,0x001e9acc,0x0027877e, -0x0024dcf6,0x00280490,0x0029e188,0x00349108,0x002d5cd5,0x00207604,0x00151112,0x00102294,0x001269c2,0x0015b1c9,0x001d9c52,0x0025ac5b,0x0013cca9,0x000408d5,0xfff73220,0xffeb6960,0xffdf6e8f,0xffd2714e,0xffd51454,0xffd5898a,0xffd5a673,0xffd0d677,0xffcd599e,0xffc86162,0xffd51e30, -0xffdac4d2,0xffe2626d,0xfff05ccb,0x000d469b,0x001fc4ad,0x00384b35,0x00479810,0x005e06cd,0x00513551,0x00474291,0x003d76d7,0x0036215d,0xffbb45f1,0xffc23899,0xffbf8481,0xffbffdd5,0xffc4ee3e,0xffc8ed6e,0xffc958c6,0xffc541f1,0xffc55608,0xffc378df,0xffc5091d,0xffc973cb,0xffd01b9a, -0xffd6a3fa,0xffd51b50,0xffd49e59,0xffd308ae,0xffd08e0a,0xffcdb2d1,0xffcab3ea,0xffc89ca8,0xffc9d5f1,0xffc7d5bd,0xffc680d2,0xffc3bb42,0xffc14068,0xffc38912,0xffc29bb4,0xffbf527e,0xffbfea6c,0xffc0a9d6,0xffbee4a7,0xffc18515,0xffc051bb,0xffbf3c58,0xffc59829,0xffcf3591,0xffd315c9, -0xffd24dd5,0xffd285a3,0xffd0891e,0xffce77d2,0xffcde05e,0xffcde6b8,0xffd0d456,0xffd34a3d,0xffd4a091,0xffd63e3c,0xffd6bb53,0xffd830e6,0xffd6187a,0xffd4cc06,0xffd393c0,0xffd1d66e,0xffd02655,0xffce6b1b,0xffcd65d5,0xffccf07d,0xffcccb2a,0xffccf5aa,0xffcc3f51,0xffcb699c,0xffcb9303, -0xffcb98e8,0xffcd7ec5,0xffcdb870,0xffce7623,0xffcfb6db,0xffd333b3,0xffd4822b,0xffccab29,0xffcdc093,0xffced833,0x000ef008,0x000c1e99,0x000caca1,0x00110080,0x0013efcc,0x0019e739,0x00130b0e,0x001031ad,0x000ae429,0x000faa71,0x001188ab,0x00127e4a,0x00133cff,0x00141b06,0x001565df, -0x001876dc,0x001801f9,0x001636c6,0x000eb27c,0x000b0daa,0x0007897d,0x000b703c,0x000d582c,0x0012441a,0x000f4f03,0x000d13b4,0x0005a260,0x0005fca0,0x0002e582,0xfffed797,0xfffbcb9a,0xfffe4b05,0x0009992e,0x0005f96d,0x0007e1da,0x00138c68,0x000bde13,0x0007b105,0x000e9579,0x0019aafa, -0x0024d8c8,0x0034db79,0x00280d88,0x001fc381,0x00105222,0x00179b51,0x0017d6df,0x00172753,0x00183e55,0x00213240,0x002a33b3,0x003c41b1,0x003c4da5,0x00319ce1,0x001a2521,0x000b0e72,0x00031f39,0x00090a26,0x0011f5f6,0x001c60af,0x001c2864,0x00147184,0xfffd048d,0xfffb217c,0xfff1e66f, -0xffec2296,0xffddd53c,0xffe04783,0xfff9bb6c,0xfff01d02,0xfff9d2bd,0x00159ef3,0x00055f8c,0x0000002e,0x000a620c,0x0023a178,0x00381a48,0x0052afe6,0x003b713c,0x002add04,0x000a6a18,0x001a9c75,0x00244d63,0x003262e4,0x00314647,0x0036f7b1,0x003c2f46,0x00549550,0x00526d21,0x004182ee, -0x0018d4e0,0x00038277,0xfff3fc0a,0x0000bce6,0x001100cf,0x001f35dd,0x001ab66a,0x0015711a,0xffe57f7f,0xffe78414,0xffcb7692,0xffc289ef,0xffa43599,0xffb1c7a1,0xffef2c80,0xffdef460,0xffee0272,0x0022a182,0xfffd68de,0xfff26a7a,0x000f5ad1,0x0030a7e1,0x005d15d2,0x00941a27,0x0076be8a, -0x005c41cb,0x00256c9e,0x00284990,0x002676b3,0x00304867,0x00248582,0x00465e60,0x006c7545,0x00aed9a7,0x00ad664b,0x008967fa,0x0039ac14,0x0007aa24,0xffec0f42,0x0000c7c3,0x00231528,0x0051e624,0x00498831,0x0032a10c,0x0007792d,0xfff3bd4d,0xffd28546,0xffabfab3,0xff7e0b19,0xff89a1d1, -0xffd491a4,0xffa3cb1a,0xffc883fd,0x00360734,0xfff2a45b,0xffdc748f,0xfffb5f13,0x000a49e2,0x0009f4fe,0xffd4f325,0xffd3c0ca,0xffc0446c,0xffa0a95a,0x000d54a8,0x00654265,0x007b4ccb,0x00d9ca88,0x008a54b0,0xffb72d7b,0xffa0d3d1,0xff8fbd13,0xffa5a19d,0xffd961bd,0xfff38709,0x0009bf53, -0x000aa0bf,0xffe1ad88,0xffc0bc12,0xffa1282b,0xffc0287b,0x0040412d,0xffed1219,0xffda8ba5,0xffe403de,0xfff136a6,0x001f4b92,0x006d231b,0x0065ce10,0x00433a3d,0xfffecd84,0xffdf1253,0x00bd3776,0x002f31ae,0xffdeb286,0xff943ca0,0xff3c585f,0xffdd1b6c,0x003d0a5f,0x00574417,0x004b9bab, -0xffd7c2a9,0xff3139c5,0xff62fde0,0xffbdd6c4,0x003a5cdd,0x00770c2a,0x00712104,0x004399d3,0x001fae06,0x001fce54,0x00552286,0x003c4356,0x00329081,0x000f0d47,0x0019eec3,0xfff70e7f,0xffd75d05,0xffdd03a9,0xfff6d31f,0xfff97b2e,0x0004240a,0xffdec2d3,0xff8f84f1,0xff30362c,0xff5383b2, -0xfffaeadd,0x009c8e43,0xfe292068,0xfe6869d4,0xffb0976c,0x003a88d0,0x004cb93c,0x00468a64,0xffedc1b6,0xff7e11f1,0xff55fe9b,0xffcd4af4,0x00b6fe67,0x00234062,0xffcd397c,0xffb91a3b,0xffa7781e,0xffae3a87,0xffc53876,0xffed2a50,0x0006fa07,0x0014f8d4,0x00191888,0x0006fa23,0xffe498a8, -0xffd85f83,0xffe1d754,0xffdd50d5,0x00026822,0x00072485,0x0000945b,0xfff6e5a5,0xfff6acad,0x00158c95,0xffbbefb2,0xffc2cfa7,0x00201dee,0xfea8bcfc,0x00e51df9,0x002a7203,0xffffa566,0x0004ffd6,0x00544376,0xffff186a,0xffe559b3,0xffeaafbd,0xffeff085,0xffdbddfe,0xffc8afad,0xffe51cd0, -0x000a7991,0x000dc920,0x002acd11,0x0038e103,0x00453974,0x00213187,0x000db3fb,0x00045289,0x000a2e93,0x001b7792,0x002c443a,0x001a5f01,0x000519f0,0xfff862f6,0xfff7ec00,0xfff6d934,0x00028cbb,0x0000be90,0x0007fdd6,0x003aa796,0x00457f81,0x0041800d,0x0081ffd8,0x00e71f99,0xffcc46fe, -0x0002aee2,0x001ed9a3,0x000983af,0xffe26425,0xffe34aca,0xffeff2a9,0x000508cd,0x002093b9,0x0048d7f9,0x005f42a1,0x00634eab,0x0056552f,0x00434361,0x002a57dc,0x00060d07,0xffe01639,0xffbfa35e,0xffb03b84,0xffaf1de6,0xffa75403,0xffb26d47,0xffbc3df6,0xffe8fa0c,0xfff983e5,0xffefdc0a, -0xffee9e56,0xffe7423a,0xffe036da,0xffe85b97,0xfffa013d,0x000e7034,0xfff74b36,0xffed8197,0xffd15abd,0xffc0c7b4,0x00072390,0xfff288da,0xffd94c18,0xfff34791,0x001f2fc4,0x005272aa,0x00771a12,0x0092338c,0x008a4071,0x007fbc45,0x007b845b,0x006f13d0,0x005f95f8,0x003fa859,0x002f624c, -0x0018f4fd,0xfff9dbb1,0xfffa79cc,0xfff06691,0xffe7c7b8,0xffde901d,0xffdb18b0,0xffd89ea7,0xffe75c89,0xfff9ab4f,0x0012ec59,0x0028e8c7,0x002dcba4,0x001c8436,0x0017aba6,0x000e5ca4,0x000770c6,0x000ba8b7,0x000cf265,0x0012d1ca,0x000a131d,0x0044b53d,0x0048412f,0x00500ba3,0x0045bf5b, -0x00350112,0x0026c17f,0x0021a47c,0x0023c246,0x00261eed,0x002ad5a1,0x002fdd71,0x001954ef,0x00057662,0xfff36b81,0xffe9e1bf,0xffdfd455,0xffd48c79,0xffd7b40e,0xffd95f2e,0xffda8f72,0xffd7d15f,0xffd54b06,0xffd0c216,0xffe14ef7,0xffe9f7ab,0xfff5e8c6,0x0003e45e,0x0020cfe5,0x00347589, -0x00482902,0x0054d699,0x006778ae,0x005ed59f,0x005a5ad3,0x0054e6c1,0x004e2e71,0xffcb0888,0xffd1fa4f,0xffcdfa33,0xffce0800,0xffd2832d,0xffd48a3e,0xffd25c93,0xffcc5d34,0xffcb3028,0xffc908b2,0xffca9525,0xffce1c2f,0xffd4241c,0xffd9731d,0xffd8cdcb,0xffd84d06,0xffd72d65,0xffd4c43e, -0xffd1cae0,0xffce9fc0,0xffcae7b1,0xffcc4862,0xffc9d77a,0xffc7656e,0xffc3826d,0xffbfd10d,0xffc584f3,0xffc7cf9a,0xffc85ee0,0xffcd1c72,0xffd22ae9,0xffd551fd,0xffd65642,0xffd4000d,0xffd2612f,0xffd744e1,0xffd7e2cb,0xffdcf1c8,0xffdb05d1,0xffda36b0,0xffd75c19,0xffd52d40,0xffd4a93a, -0xffd47786,0xffd6563d,0xffd7832e,0xffd79301,0xffd869cc,0xffd84a5f,0xffd8fe3f,0xffd7861f,0xffd6a5ee,0xffd5d310,0xffd4a64d,0xffd385ba,0xffd2cb06,0xffd0d169,0xffcf8d14,0xffcdf9a9,0xffcf9590,0xffcdf588,0xffcb174d,0xffcd94ca,0xffcf37a7,0xffd28344,0xffd46b62,0xffd6661c,0xffd9f47f, -0xffdc30ee,0xffddb826,0xffd44c18,0xffd628af,0xffd1da17,0x000d8dfc,0x000bf028,0x000caaea,0x000fc4ff,0x001287ec,0x00190340,0x001305fd,0x00101bb8,0x0009ccb8,0x000cde99,0x000ec244,0x00130b45,0x0011d242,0x00124934,0x0012292b,0x0016a021,0x00169a89,0x00151997,0x000dfa9c,0x000a94dc, -0x00075cb9,0x000adf23,0x000c4674,0x000fb770,0x000d0f7f,0x000b07b3,0x00036ff5,0x000439c0,0x0001696b,0xfffe3fe9,0xfffba26f,0xfffe1754,0x00064a7c,0x0005a956,0x00077149,0x000fd38b,0x000b3c99,0x0007627e,0x000d2fc4,0x00150a75,0x00207ab9,0x00326ca0,0x00292c4d,0x002054f7,0x000e319e, -0x00124ffa,0x0013df8d,0x001bb48b,0x0017fc0b,0x001ebd1b,0x00238dbb,0x0038dbd3,0x003b0d23,0x0032287a,0x001d08b3,0x000f77f7,0x0007ca0f,0x000d3520,0x0013519f,0x0017449d,0x0018d50a,0x0010cc12,0xfff7c6c6,0xfff82d26,0xfff13345,0xffec4e2d,0xffe0744d,0xffe1076c,0xfff156f0,0xfff09cde, -0xfff9914b,0x000ab4ab,0x0003a94c,0x0003c306,0x000e9ad8,0x00208922,0x003496eb,0x00516766,0x003f94c9,0x002ee142,0x0009aab1,0x0010080e,0x0019ca53,0x0039199d,0x002fb45c,0x00346f50,0x00313586,0x004f3bbb,0x004fcda0,0x0041aac8,0x001b2e80,0x0007a086,0xfff92c93,0x000442f1,0x0010f865, -0x0013a3ad,0x0013fbf8,0x00101d32,0xffdba03a,0xffe1e8d7,0xffc7055e,0xffc18922,0xffa59351,0xffb469e5,0xffe24ebd,0xffe36366,0xfff0de49,0x001378bd,0xffff4146,0xfff0b259,0x000b44d2,0x00203c8e,0x004e7ec2,0x008ca0b8,0x0079d136,0x005de2e6,0x0021ad50,0x001addf0,0x001efda6,0x00427a16, -0x002ac422,0x00432d2d,0x005af67a,0x00a4134e,0x00ac647a,0x00912172,0x00487583,0x001c124f,0x00030372,0x0014af55,0x002ae059,0x0043ab70,0x003fd034,0x002a21d3,0xfff6950d,0xffe2bba1,0xffc607d5,0xffb1c767,0xff747a8e,0xff7e2a92,0xffbe0712,0xffa3bf1b,0xffc97e48,0x001710f3,0xffec3f41, -0x000abfc9,0x001c6ef9,0x003f3912,0x0030f261,0xffd91deb,0xffe4e601,0xffcff51d,0xff9d9bd2,0xfffdf6f5,0x004623b4,0x0053f6a9,0x00bfd05a,0x0085a47d,0xffbaa647,0xffa3cda0,0xff85c3fd,0xff8215bb,0xffb21865,0xffc20145,0xffcbcf09,0xffd643cd,0xffbc6d75,0xffa858cb,0xff9e808b,0xffc2410b, -0x003f25b5,0xffeb87f4,0xffdbe8fb,0xffe98153,0xfff5d859,0x002f55d1,0x0086707c,0x00765bb2,0x004fc219,0x000ca185,0x000710d1,0x0094db55,0x001048af,0xffcacf5c,0xff8fe07e,0xff473394,0xffaf9a38,0x000c71d0,0x00492998,0x005426f3,0xfff175aa,0xff4902c8,0xff56e50f,0xff9e8745,0x000d80d5, -0x007365fb,0x0085c2ad,0x0053072a,0x0036ecf9,0x00326105,0x005fb1cd,0x003b4065,0x002fd553,0x0019063f,0x00211526,0xfffd0dc8,0xffd24ffa,0xffe193b3,0xfffd675f,0xfffc9342,0x000490cf,0xffd8cfa1,0xff85935d,0xff259815,0xff5be94d,0x00168886,0x00898e2d,0xfe66f7c2,0xfec4bf3c,0xffa0b435, -0x0017414a,0x0085bc8e,0x0063f969,0x00014676,0xff92231d,0xff389f5c,0xffa5fe00,0x00b9e6b5,0x00324791,0xffdf2251,0xffb80629,0xffa5ee09,0xffa4e87a,0xffb5d8fd,0xffe03cb1,0xfff64e00,0xfffe84ca,0x000b4eec,0xfffa758f,0xffda35da,0xffd17600,0xffdf781f,0xffe4f024,0x000182c0,0x00041a38, -0xfffea711,0xfffca7dc,0xfff7e6b0,0x0002ec91,0xffb84e29,0xffc30f30,0x00191fa9,0xfec792be,0x00a4f9a3,0xffe28a7e,0xfff66fff,0x001ab450,0x0072b07a,0x00337056,0x000f9dd2,0xffedc9fd,0xfff7dcc3,0xffe6a466,0xffddae2d,0xffe36eab,0xffff193f,0xfffdd7fd,0x0025b804,0x003e39f8,0x004785e1, -0x002d2ff0,0x001d7259,0x00110c0e,0x0017e081,0x0024fb4e,0x0031b632,0x001caa3e,0x000364b5,0xfff1b1cb,0xfff77214,0xfffb630e,0x0005b5ff,0x0002bfba,0x000b6323,0x00385654,0x00317a28,0x0031a8f4,0x008ab352,0x00caf65e,0xffe3060b,0x0018c17a,0x003967c6,0x001c551d,0xffe52934,0xffdb6eab, -0xffe38cc6,0xfff4ee8d,0x000d9425,0x0032782f,0x004f13c0,0x0054528d,0x004c597d,0x003add32,0x0025ad92,0x00032dd4,0xffdc8c04,0xffc2d123,0xffb6e51b,0xffb5d8e2,0xffaedace,0xffbcd1f5,0xffcda802,0xfff1f887,0xffffaeea,0xfff21161,0xffef919c,0xffe906ce,0xffe5918f,0xffeb8b61,0xfff7bda5, -0x000315e4,0xfffdb9db,0xfff37a79,0xffd31bb9,0xffc97692,0xffe59d3f,0xffcdf547,0xffb7fd1c,0xffd6e80e,0x0008b264,0x003fd083,0x00646184,0x007f85c0,0x0085ecbc,0x0088638d,0x008c387e,0x00805cd1,0x00701a5c,0x004fbd62,0x003e9b64,0x00255d50,0x0003c2dc,0xfffe20e1,0xffedc6ca,0xffdf9893, -0xffd754ba,0xffd735c0,0xffdb659f,0xfff000a3,0x0002fc51,0x0019ea7f,0x0023d5e8,0x00207bbc,0x000cea9e,0x0009d321,0x00046955,0xfffe9681,0x000103ac,0xffff0c3f,0x0000b6d7,0xfff21542,0x0057fcf5,0x005c0531,0x00607b9d,0x00562269,0x00461fad,0x00376471,0x00329ed8,0x0033e787,0x0032c5c5, -0x00321b23,0x003245f3,0x0019bc62,0x00042eae,0xffeef3d5,0xffe83961,0xffe07038,0xffd7a4af,0xffdb4b92,0xffde4d65,0xffe02713,0xffdeca3c,0xffdd3775,0xffd8fff7,0xffed31f6,0xfff97546,0x000a4f05,0x001728bd,0x0031de2e,0x0043cfb1,0x0050c83c,0x0058a122,0x006582ce,0x00618482,0x006215ea, -0x0060766a,0x005b893f,0xffdd4d2b,0xffe61f55,0xffe2111e,0xffe1857a,0xffe4ac51,0xffe490ca,0xffe08dd8,0xffda2c43,0xffd727d6,0xffd4629e,0xffd4e0fa,0xffd6310d,0xffd9ea38,0xffdcaaf9,0xffdc7bc5,0xffdbb09c,0xffda9be1,0xffd7ffab,0xffd4a401,0xffd15381,0xffcdc511,0xffcee456,0xffcc7d86, -0xffc979b2,0xffc4de01,0xffc0c007,0xffc86da6,0xffcccd3f,0xffd05bae,0xffd868bc,0xffe0bf8f,0xffe7a503,0xffe7f7a2,0xffe5e7ab,0xffe4cced,0xffe94f74,0xffe1c95f,0xffe7f0af,0xffe4bcc7,0xffe33310,0xffe013d7,0xffde2ccb,0xffddb961,0xffdd622a,0xffdd9ec9,0xffdd2e6a,0xffdbcbfb,0xffdb9097, -0xffdaa460,0xffda329c,0xffd966e3,0xffd8dcdb,0xffd8643c,0xffd7bea0,0xffd72e09,0xffd7000f,0xffd537ad,0xffd3ad22,0xffd1846f,0xffd3ca7a,0xffd1e52c,0xffcd3f09,0xffd17d0d,0xffd480e1,0xffd8c6cf,0xffdbd956,0xffdebd89,0xffe3deb3,0xffe4e947,0xffe6cd0c,0xffdda912,0xffdfedd5,0xffd56473, -0x000b7429,0x000b1e20,0x000bec59,0x000dd7fb,0x00104b8e,0x0016f146,0x00120678,0x000f1488,0x00078902,0x0009ad9c,0x000ba1ae,0x0012ad6f,0x000fcdcd,0x000ff59e,0x000eb2fb,0x00141f69,0x00145c5b,0x0012c856,0x000c8a96,0x00098e3e,0x0006bd24,0x0009bb14,0x000acaac,0x000ce9b9,0x000a4e5e, -0x0008cdc3,0x00013d05,0x0002aa08,0xfffff371,0xfffca81e,0xfffb8ca6,0xfffdffd8,0x000292c7,0x00053ace,0x0006b2ec,0x000bf5db,0x000a578a,0x00068223,0x000b57c3,0x000ff623,0x001b4c55,0x002e1c91,0x00287eea,0x001f120c,0x0009d4b7,0x000ca13a,0x000fd201,0x001f0291,0x0016f81f,0x001b7a61, -0x001cfe0f,0x00343494,0x00380561,0x003011be,0x001e8758,0x0012d053,0x000bd5a1,0x00100e6f,0x0012d944,0x00116d09,0x00145a6c,0x000c632d,0xfff25bb2,0xfff6371e,0xfff1b4ac,0xffeb929d,0xffe473b4,0xffe34067,0xffe8ffdf,0xfff19683,0xfff99f89,0xffffd4b2,0x0001228a,0x00065a2e,0x0012c19c, -0x001c705d,0x002f5bd1,0x004c8e40,0x0041058c,0x0030879e,0x00057b9b,0x0006cae2,0x00107a85,0x003d9cc5,0x002cf91f,0x00309888,0x00279fb6,0x0048db67,0x004b58af,0x003ddff5,0x001c482b,0x000b0b66,0xfffeceb6,0x00069320,0x000f0edc,0x0008024b,0x000c8318,0x000a96c6,0xffd2a3c7,0xffde315d, -0xffc44340,0xffbc7d55,0xffa8d4bb,0xffb925b8,0xffd492f9,0xffe8a87d,0xfff4c456,0x0004d15d,0x0000835f,0xffee9e60,0x0007c29d,0x00105f22,0x003e6d82,0x007feb73,0x00789717,0x005aa9ed,0x00174966,0x000deeea,0x001923d2,0x0051f949,0x002f9fe1,0x003e03b0,0x004b2b1e,0x00971bf8,0x00a70f30, -0x0090c871,0x00536bc9,0x002da624,0x0017d773,0x00247207,0x002ed0a5,0x0031611a,0x0033aa44,0x00211139,0xffe3bfa9,0xffd5f948,0xffbf1db1,0xffb69099,0xff73a396,0xff7afe26,0xffa7ae20,0xffa9343b,0xffcdd117,0xfff73182,0xffe5e32c,0x003676fe,0x003db362,0x006d4005,0x00526c35,0xffe0cca4, -0xfff5db71,0xffe26e21,0xffa92849,0xfff2a47e,0x002607f7,0x002dca77,0x009aa0cf,0x0075efcc,0xffc26e01,0xffa63033,0xff7e45f6,0xff6476a1,0xff8fdd78,0xff98a892,0xff98e58f,0xffa8bf7e,0xff9e2e9c,0xff95bb38,0xffa40739,0xffca9258,0x003a5ba1,0xffeefc52,0xffe53045,0xfff50ab6,0x00007f49, -0x003e6ef7,0x009404d5,0x00824078,0x005bfd50,0x001f7cd6,0x002d68dd,0x006597e3,0xfff4ce69,0xffbd5c8c,0xff91093e,0xff589f13,0xff8c4448,0xffe228f5,0x0039d85d,0x005856c8,0x000bb5d3,0xff6806a0,0xff5304f8,0xff86dd4d,0xffe8e186,0x0064e806,0x008d784d,0x005ff9ad,0x004e6bda,0x0045484d, -0x0064ad95,0x00385eac,0x002a1776,0x001ee83f,0x0023ee73,0x0001065e,0xffd14c55,0xffe54639,0x0000d130,0xfffdc9bd,0x000174a6,0xffd3e3b9,0xff843950,0xff270925,0xff686d76,0x002d63f0,0x006d4227,0xfebc223a,0xff1da3f9,0xff8988da,0xfff1b44b,0x00b3dc38,0x0075fe28,0x00165e49,0xffb930b0, -0xff34664e,0xff8a15ce,0x00a68e39,0x00406f26,0xfff698dc,0xffb70da1,0xffa8edc8,0xffa1ba65,0xffaab130,0xffd4a6a7,0xffe57206,0xffe579b1,0xfffa85da,0xffee0fe0,0xffd3ba9f,0xffccf60d,0xffdecde6,0xffedbd8d,0x00030da8,0x00035d06,0xfffd85f8,0x00015cc8,0xfff9491f,0xffed2357,0xffc66da6, -0xffcf9603,0xfff90e2b,0xfefa91a6,0x005dd05c,0xffcb0b29,0x00114e00,0x003ef184,0x00812396,0x0066b6a5,0x003ed2ab,0xfff7fdad,0xfffce0cb,0xffead859,0xffec3eb9,0xffe1a26e,0xfff61bb4,0xfff2bc0d,0x0021e048,0x003f571f,0x0044050e,0x0035df1d,0x002b3718,0x001ca3b5,0x0022bb2c,0x002ab778, -0x0033daa5,0x001cbca1,0x0001dc1a,0xffeec51a,0xfff74489,0xffff95d3,0x0005db2e,0x0002bfe1,0x000c48f9,0x002cf76c,0x00178ac0,0x001c10f4,0x007cc9e8,0x0093785e,0xfff9def8,0x0026bfa7,0x004534f7,0x0026b2a9,0xffe639d2,0xffd2727d,0xffd40678,0xffe1e5f0,0xfff7b85b,0x00186177,0x003a0ae5, -0x003fb37d,0x003de746,0x0032dcff,0x001fb0b1,0x0000c427,0xffdd17cb,0xffca5577,0xffc0c7f9,0xffbd4cc8,0xffb9d184,0xffca9095,0xffe0fc35,0xfffa78cd,0x0004419b,0xfff5a9b0,0xfff16975,0xffed8020,0xffef9d51,0xfff1efe7,0xfff7ed42,0xfff8b8c7,0x000244f0,0xfffa3739,0xffde4bfc,0xffd9196e, -0xffcaaf43,0xffb18dd0,0xffa3b9b4,0xffc20694,0xfff145ca,0x002356c6,0x004431e2,0x005f2fe7,0x007544e0,0x00854570,0x0091af40,0x00885382,0x00786f60,0x00593dd6,0x004792e5,0x002d0e1b,0x000b02fc,0xfffd7353,0xffe8c269,0xffd7d49d,0xffd14a33,0xffd52aec,0xffe0283e,0xfff87ae3,0x000a718a, -0x001d357f,0x001b2051,0x00115b51,0xffff43e3,0xfffeb2ae,0xfffdad7a,0xfff926cc,0xfff9a4a5,0xfff401a5,0xfff0903c,0xffddc0a4,0x005dbdc7,0x0060239a,0x00608c19,0x00591360,0x004d7281,0x0041e561,0x003f1588,0x00406f82,0x003aa427,0x00341233,0x002f0e9e,0x00168237,0x00013888,0xffeaf383, -0xffe7156b,0xffe16eb3,0xffdb2f97,0xffdf9a4a,0xffe3c3b7,0xffe63692,0xffe5c561,0xffe49ba6,0xffe068c0,0xfff74786,0x000731a3,0x001d2495,0x00281773,0x003e6c3f,0x004d52ef,0x0051aeb0,0x00534260,0x0058a35a,0x0058cc24,0x005d9779,0x005ee748,0x005bc4be,0xfff35464,0xfffe981d,0xfffa8a34, -0xfff897fb,0xfff8edc9,0xfff616de,0xfff0452e,0xffe9f6d7,0xffe4c052,0xffe10fb6,0xffdfc5d2,0xffde269a,0xffde875b,0xffddc26d,0xffddea0e,0xffdcfac8,0xffdbed58,0xffd92373,0xffd5971f,0xffd24088,0xffd00a0e,0xffd1c988,0xffd08459,0xffce4e97,0xffc9ec07,0xffc6ae73,0xffceb800,0xffd42fc4, -0xffd9af7e,0xffe3ca1a,0xffee85d4,0xfff6d4c8,0xfff819ca,0xfff6e93b,0xfff756e8,0xfffc9c75,0xffeb9689,0xfff22faa,0xffeda54c,0xffeb89a5,0xffe87c85,0xffe6d5b1,0xffe625f2,0xffe55b5b,0xffe3f557,0xffe1efb5,0xffdf2f79,0xffddd0d2,0xffdc1455,0xffda56fb,0xffda4558,0xffd9fcdc,0xffd9dae0, -0xffd9b47b,0xffd9b677,0xffd9d6f8,0xffd90538,0xffd80836,0xffd63389,0xffd8b4b6,0xffd77ec6,0xffd228a5,0xffd7246f,0xffdae873,0xffdf6242,0xffe2ed22,0xffe614ec,0xffebfe27,0xffece887,0xffef2a8a,0xffe77476,0xffe9f699,0xffd7f276,0x0009e27e,0x000a2785,0x000bb973,0x000c4886,0x000e6604, -0x0014b6a7,0x00112919,0x000e4c5f,0x0005a672,0x00076b66,0x0009781d,0x0012aabe,0x000e6a7d,0x000e55f7,0x000c3dec,0x00123570,0x00129424,0x0010c6c1,0x000ba128,0x00090669,0x0006d357,0x00088eba,0x0008df66,0x0009504a,0x0007dc6c,0x000651de,0xfffe3f87,0x00004692,0xfffd96ad,0xfff98516, -0xfffa8d15,0xfffcffad,0xfffdf2c2,0x000494b6,0x000676f7,0x00078d76,0x0008f157,0x00048ff8,0x000a64c6,0x000be28d,0x0016af34,0x0029145b,0x00275475,0x001dcf87,0x00060b34,0x00088aaf,0x000d4c8e,0x00225015,0x001624d4,0x00185608,0x0017ada3,0x002fa9ad,0x0034bdee,0x002d6e1d,0x001fe14b, -0x0015fa7a,0x000fc88d,0x0011013b,0x00113517,0x000c43c1,0x000f12c9,0x00077807,0xffee5af9,0xfff6400f,0xfff412dc,0xffeadfa7,0xffea4845,0xffe7b92e,0xffe2a002,0xfff37232,0xfffa1d86,0xfff6dcb6,0xfffebe3a,0x000798fd,0x0016f18d,0x0018aeaf,0x0029f098,0x004574da,0x0040e66e,0x003173d1, -0x00018261,0x0000f4c5,0x000a77c7,0x0041d7d0,0x002a9a14,0x002ce700,0x0020a99b,0x004355cd,0x00470628,0x00393b40,0x001dc784,0x000eef49,0x0004d2cc,0x00079f19,0x000ba6a1,0xfffe672a,0x0004ad08,0x00048eca,0xffcb85ea,0xffdb783e,0xffc39e98,0xffb3fa0e,0xffad9434,0xffbe909c,0xffc7807d, -0xffee2b7a,0xfff93229,0xfff896a0,0x00010132,0xffebcbd1,0x00058296,0x00039a76,0x002f5017,0x006fda7e,0x00748250,0x00565606,0x000d185b,0x0004c1c4,0x0016fc63,0x005ffc27,0x0032fdb1,0x00366356,0x003cd8b2,0x0089810e,0x009f8aa9,0x008c226f,0x005bff7e,0x003c845e,0x00297ea8,0x002e310e, -0x002eb8cd,0x001e2478,0x0025096b,0x00166b2a,0xffd27ca6,0xffcfdb6f,0xffbf1fae,0xffba6326,0xff7c6bdf,0xff819dbe,0xff94d174,0xffb27b38,0xffd420e7,0xffdad505,0xffe02e36,0x0059ba8c,0x005c9543,0x0090fee2,0x006d2962,0xffefa116,0x0006616b,0xfff4b911,0xffc0a76e,0xffecc41d,0x0009fb9f, -0x000d8609,0x00734ad9,0x0063c5ae,0xffd513ef,0xffac46c0,0xff7bf7e1,0xff51c516,0xff761a37,0xff7b3440,0xff76da6f,0xff865516,0xff88f90e,0xff89c87e,0xffb12f3e,0xffd924d3,0x00320ec3,0xfff5e9ac,0xfff2a624,0x00036403,0x000d6140,0x00497aa7,0x009325c2,0x00874983,0x00663c94,0x0033a747, -0x004cdae9,0x0036b528,0xffe0dde0,0xffb8b882,0xff9750bd,0xff6c7fe4,0xff763dde,0xffc4a60d,0x002e4bcf,0x005a9077,0x0024919f,0xff8acc81,0xff56016d,0xff7606d1,0xffce1812,0x004d55cd,0x00875d97,0x00691cb9,0x00634ada,0x00566ba2,0x00638aee,0x00335c3d,0x0022c74f,0x00205f45,0x0022888c, -0x00029711,0xffd36c0b,0xffe9c2d3,0x0002d5b4,0xfffbcf41,0xfffccade,0xffd1b1f4,0xff8bc3c7,0xff3635b3,0xff7a81b6,0x003cf51f,0x004e06df,0xff129258,0xff6c627c,0xff7501d2,0xffd4971d,0x00d7b8a3,0x00810e6d,0x002c07f5,0xffe6b34e,0xff409fd3,0xff78a868,0x00862566,0x0050296f,0x001504c0, -0xffbb8178,0xffb20782,0xffa626f6,0xffa6af3b,0xffcbe8c1,0xffd7d5c3,0xffd0c5e1,0xffeb20f8,0xffe4835f,0xffd04639,0xffcc5343,0xffe13242,0xfff6ad99,0x00066ce2,0x0001d371,0xfffe6399,0x00053497,0xfffe2c62,0xffdc73a1,0xffe04e06,0xffe34769,0xffc9161e,0xff319ee1,0x0018d8b1,0xffe6ad5b, -0x0041a803,0x00623007,0x0079f317,0x008d26ff,0x006c278d,0x0010386f,0x00035cdd,0xffeb8ae8,0xfff5d923,0xffe01b13,0xfff00336,0xffee8f21,0x001e8b22,0x003afc0c,0x003cd900,0x003b52a1,0x00368bf1,0x00275324,0x002a9fee,0x002e056f,0x0033fbe8,0x001aeec1,0x00011684,0xffef64b7,0xfff8e200, -0x0001ee45,0x000258c6,0xffffaab2,0x000a22d0,0x001c3a84,0x0000d498,0x00052478,0x00575a5f,0x0045e43f,0x000fda3f,0x002e7f68,0x00485df6,0x002f7f2b,0xffeab8fd,0xffce1096,0xffc5afbd,0xffcf2a12,0xffe204cc,0xfffe0b3c,0x0022200e,0x00298751,0x002e1034,0x002ba365,0x00195969,0xffffe408, -0xffe292c8,0xffd4d345,0xffccf435,0xffc70b2a,0xffc820e2,0xffdb31f8,0xfff3ee90,0x00021221,0x00075e96,0xfff962ae,0xfff44590,0xfff49abf,0xfffa9c45,0xfff9eda4,0xfffa04c2,0xfff196be,0x00034742,0x00003dd4,0xfff19e08,0xfff0596a,0xffb87e8a,0xffa234f7,0xffa04409,0xffb7c7c5,0xffdbb5ab, -0x0002d3d1,0x001e664c,0x0039000a,0x005cbaaf,0x00781d7b,0x008c2408,0x00868167,0x00789c6b,0x005c7cf7,0x004a8606,0x002fdf23,0x000e0d2e,0xfff9f9c9,0xffe3dc81,0xffd2ae60,0xffcdb8ec,0xffd5baa3,0xffe652ff,0x00001c2b,0x000fa021,0x001c1a43,0x0010b0f8,0x00034f39,0xfff5e3c9,0xfff72059, -0xfff99895,0xfff59b00,0xfff438cd,0xffeb3259,0xffe2c96f,0xffced125,0x0054fe9d,0x005436ff,0x0050d7d6,0x004dc4d2,0x00482694,0x004322f8,0x0043d477,0x00468da1,0x003daa07,0x003358af,0x002b569c,0x0013a8bc,0xffff78a1,0xffe96206,0xffe76281,0xffe33d9d,0xffdefb0e,0xffe41dfe,0xffe8e566, -0xffeb9916,0xffec5b6e,0xffeb8931,0xffe7eeaa,0xffff9885,0x00122f16,0x002c6c18,0x00343a5e,0x0044702c,0x004f0a44,0x004ac40f,0x00458f61,0x0042daed,0x0046aa45,0x004e51bc,0x00517f8c,0x004f8d91,0x000b578a,0x00180590,0x0013bae0,0x00100323,0x000ceb5b,0x00076fe8,0x00003178,0xfffa44ae, -0xfff2c99b,0xffedc8ad,0xffea5ecc,0xffe5e353,0xffe2ee4c,0xffde8d5b,0xffdf2244,0xffde4427,0xffdd5466,0xffda82ec,0xffd72989,0xffd3f8fa,0xffd2d870,0xffd6c494,0xffd78c3e,0xffd7182c,0xffd3c2c3,0xffd2d13f,0xffda698c,0xffe0a916,0xffe7461b,0xfff29acf,0xfffef53c,0x00070ea4,0x000986e1, -0x0008b315,0x000aef96,0x00110d0f,0xfff4b2cf,0xfffb3d0b,0xfff5c384,0xfff363a1,0xfff0afb0,0xffef2890,0xffee06a6,0xffecabda,0xffe9f417,0xffe6b8af,0xffe2e2c3,0xffe0851a,0xffde11e9,0xffdb2314,0xffdbb12d,0xffdb90be,0xffdbb720,0xffdbf6ae,0xffdc6212,0xffdce0a6,0xffdc8f0d,0xffdc10eb, -0xffda25af,0xffded07c,0xffde17d3,0xffd859bc,0xffdd4f97,0xffe14c03,0xffe57c76,0xffe8f814,0xffebf2b8,0xfff20dc3,0xfff43ce0,0xfff764c3,0xfff005a2,0xfff327ff,0xffdb50ab,0x0007f8e0,0x0008b252,0x000acf18,0x000a5fde,0x000c135c,0x00119a56,0x000f7dea,0x000cc4fd,0x00035c98,0x000507e2, -0x00073074,0x0012170a,0x000c8ad9,0x000c4a18,0x0009ccde,0x000fe64e,0x00106070,0x000e88be,0x000a5da7,0x000826e5,0x000673c8,0x00070f42,0x000702b8,0x0006ff07,0x0005286b,0x0003e005,0xfffc4cec,0xfffeda57,0xfffc362b,0xfff6ea9e,0xfffa5d15,0xfffcb4f6,0xfffa445a,0x0003e471,0x0005d357, -0x00048e57,0x00077eac,0x0002602c,0x0008fe16,0x00080b65,0x0011dd3b,0x00228d3b,0x0024733f,0x001b54d1,0x00021e91,0x00048a7f,0x000a9f25,0x0024414c,0x0013c663,0x0013ac53,0x00124ec5,0x0029e72a,0x00301410,0x0029eba9,0x001ff926,0x0017b9a3,0x00125fbf,0x0010be31,0x000e50b0,0x0007faa9, -0x00090cc7,0x00022b21,0xffebc4a2,0xfff712d4,0xfff6c8ef,0xffea3cc5,0xfff034a7,0xffecee65,0xffdea434,0xfff5a1d5,0xfffaed96,0xfff0862f,0xfffbf5d8,0x00072ea0,0x00196ae1,0x0014d016,0x002417d8,0x003b939a,0x003ddf62,0x002fc94f,0xfffcf6d4,0xfffbe74e,0x000530e8,0x00443fbd,0x00266150, -0x00276699,0x001a7ed2,0x003cf84f,0x004188f7,0x003433b6,0x001e9d79,0x0011d6c2,0x000a39ac,0x00076533,0x00070ab4,0xfff7f73b,0xfffc6459,0xfffdc591,0xffc6933a,0xffd9ef10,0xffc4f749,0xffaa7f72,0xffb3fb33,0xffc4791b,0xffbc0882,0xfff30d49,0xfffd2d67,0xffefa899,0x00005016,0xffe80bfb, -0x00033b5c,0xfffa0e1c,0x00210ecf,0x005bd52c,0x006c0162,0x004fb19f,0x00033d6e,0xfffc37b0,0x00149512,0x0069d34c,0x00318028,0x0029816f,0x002db73e,0x0078d802,0x00941794,0x00843e21,0x0060c55c,0x0046d472,0x0036f809,0x0031c603,0x002a6842,0x000caec8,0x00142ef4,0x000a0b1f,0xffc64566, -0xffd0b0f6,0xffc5e032,0xffc03d81,0xff8d6e2d,0xff90af24,0xff8954cc,0xffbe06ca,0xffdb4b24,0xffc4e394,0xffdab714,0x00720db6,0x0074f320,0x00a797ae,0x00802205,0x0004dfa7,0x001281c5,0x00009470,0xffdb1762,0xffe98b80,0xfff2c7a2,0xfff377f7,0x004ee24f,0x005455a0,0xfff39e06,0xffb75d56, -0xff7ede68,0xff4ad63e,0xff65294c,0xff688323,0xff64f968,0xff71429d,0xff7d8329,0xff84e587,0xffc56500,0xffec368e,0x00272ea1,0xfffe37c2,0x00006ad6,0x000f9e6f,0x0017f9ae,0x004d32a4,0x0085008c,0x00836b91,0x006da6ef,0x004663f8,0x0063444c,0x000d9d73,0xffd4e37c,0xffb960c1,0xff9e7523, -0xff7dc8d3,0xff696e7f,0xffb1bcfb,0x0027204b,0x0059ed32,0x00391f54,0xffaea57c,0xff5c085d,0xff67fc67,0xffba739c,0x002f49d1,0x00748ff3,0x006bc5d3,0x00708e9d,0x006161d9,0x005cb5fb,0x002c0687,0x001a68e3,0x001e1732,0x001d8563,0x00015237,0xffd85ed3,0xfff08e6a,0x0001d06f,0xfff7bb21, -0xfff8a2b5,0xffd46f31,0xff9a719e,0xff506db9,0xff91986b,0x00451ee7,0x002ec989,0xff59bb16,0xffadd396,0xff6c0fc9,0xffc6675e,0x00ecf694,0x0084ff62,0x003b527d,0x000b23ed,0xff521b5d,0xff6e206c,0x005c1071,0x005d2326,0x0034fc52,0xffc4eabd,0xffbdecb7,0xffaea2ca,0xffa8dc14,0xffc56765, -0xffcdeb69,0xffc4488a,0xffe06955,0xffdef3c3,0xffcfb04a,0xffcfcfea,0xffe67bb7,0xffff5944,0x00078b98,0x0000d1a8,0x0001b1b3,0x00077856,0x000757f2,0xffd6ebc8,0xfffb041a,0xfff6626c,0xff99589c,0xff60631d,0xffddd45a,0x00296d38,0x006aefe8,0x006ace46,0x0050a40c,0x00963035,0x008cd7de, -0x00356061,0x000d139c,0xffea6993,0xfff94e0d,0xffdc8c08,0xffe98ade,0xffedb899,0x0017f728,0x002ef8c1,0x0031c97d,0x003ba40f,0x003d6b13,0x003087ee,0x00308880,0x002fe027,0x0032f2cd,0x00174024,0x00009e20,0xfff2dd91,0xfffbc8d5,0x00011a6e,0xffff3ee6,0xfffb327c,0x00053f54,0x000b7224, -0xfff3ef43,0xfff0fe71,0x001c3363,0xffebd88a,0x0026512f,0x0030d445,0x0043d3ff,0x00368125,0xfff29bc3,0xffcf70e7,0xffb9467a,0xffbbdcdd,0xffcc3480,0xffe43327,0x0007c823,0x0012bf45,0x001ca874,0x00224405,0x00125d60,0x00006643,0xffec5826,0xffe0b3c3,0xffd9abf3,0xffd36501,0xffd9781f, -0xffed8903,0x00059455,0x0009337e,0x000952b8,0xfffc7e30,0xfff89fe3,0xfffc4778,0x00026076,0x0000814f,0xfffdc342,0xffeeb1f4,0x0000b1d0,0x00054f5d,0x000a09c6,0x000e6cf7,0xffb0ca6c,0xffa02615,0xffa9d7fe,0xffb64146,0xffca1b6b,0xffe2b72b,0xfff9364d,0x0013a383,0x0040c781,0x00631bb6, -0x007aefbb,0x00799892,0x006f94b4,0x005902a8,0x00476647,0x002d0797,0x000b0eea,0xfff3deb2,0xffdf99de,0xffd10e63,0xffcd8e20,0xffd896a2,0xffecd24e,0x00060993,0x00123653,0x0016f358,0x0005e2a9,0xfff87d99,0xfff11416,0xfff349c3,0xfff6af42,0xfff1ca3c,0xffef9149,0xffe424be,0xffd7f711, -0xffc4fb7e,0x00407f43,0x003b61c2,0x0034d26f,0x003634b8,0x0035e5c6,0x003921db,0x003e1d72,0x00433a60,0x003a4227,0x002fd36e,0x002839ee,0x00128841,0x000018b2,0xffeb6d26,0xffe9e626,0xffe6a7e4,0xffe3964b,0xffe8b982,0xffecba22,0xffeeb751,0xfff254f2,0xfff2e7a2,0xfff15c7b,0x00073ecb, -0x001af0fa,0x00375de0,0x003afd17,0x0043ab6f,0x00495936,0x003e2a14,0x0033c13c,0x002a1078,0x00303586,0x0038bba3,0x003cb0a6,0x003a8c06,0x0021c8c4,0x002c5205,0x0027d56b,0x00228f13,0x001c765a,0x00155a17,0x000d7e34,0x00083d56,0xffff0c76,0xfff8aeb0,0xfff35fef,0xffeccc4c,0xffe77068, -0xffe05532,0xffe15407,0xffe0989c,0xffdfd191,0xffdd1a5a,0xffda61bd,0xffd75cea,0xffd7b80d,0xffddf88f,0xffe14550,0xffe34a43,0xffe1c071,0xffe3c5bc,0xffea82db,0xfff1726e,0xfff8c00c,0x0003f233,0x00104dc9,0x0017da11,0x001a6b5d,0x0019b511,0x001d1be7,0x0022bbb1,0xfffc5eb0,0x0001b16c, -0xfffc5fed,0xfffa0eda,0xfff7faa1,0xfff6689e,0xfff4cef2,0xfff308e1,0xffef92cb,0xffebc613,0xffe76238,0xffe46a27,0xffe185d0,0xffddce81,0xffdeb9a3,0xffdea27b,0xffdef021,0xffdf68d6,0xffe00803,0xffe0b6ff,0xffe0cee0,0xffe10f2e,0xffdf48f6,0xffe64287,0xffe646d9,0xffe12c1a,0xffe58d61, -0xffe9411a,0xffecbf7a,0xfff005c0,0xfff2bd1b,0xfff87623,0xfffb5922,0xfffeb1fb,0xfff888c1,0xfffb7f2f,0xffe03fa8,0x00066710,0x000754a7,0x000a066a,0x0008c7be,0x000a2656,0x000ea712,0x000df2db,0x000b60a0,0x00019331,0x0003288a,0x00055bd0,0x00118a10,0x000aaae9,0x000a52fe,0x000809ef, -0x000dd30a,0x000e6837,0x000ce694,0x00095143,0x000761ff,0x00062c2b,0x0005b182,0x00053d76,0x00050929,0x0002cfbf,0x00016a7f,0xfffa897c,0xfffd6711,0xfffad45c,0xfff470c1,0xfffa0fc2,0xfffc3ea2,0xfff6f5c6,0x000323c9,0x00056a93,0x00020306,0x00060210,0xfffffffc,0x00080df6,0x00053696, -0x000dcb6f,0x001c0ebe,0x00215a2e,0x00191a8d,0xffff6d94,0x000164f3,0x00084469,0x0025511d,0x0010402e,0x000dff12,0x000d7875,0x00239ba8,0x002ad3e8,0x0026c67f,0x001f54db,0x001857a7,0x0013e51f,0x000f4347,0x000ae75d,0x00052e8b,0x0002d7d2,0xfffd3375,0xffeb70c0,0xfff86a5d,0xfff9c663, -0xffea8d35,0xfff63f1d,0xfff2b8de,0xffddc1f2,0xfff86c6b,0xfffbfcba,0xffed159d,0xfff9e344,0x0006049b,0x001afab4,0x0011ff49,0x001f40b6,0x00318ac3,0x003a5711,0x002daabf,0xfff9e6d5,0xfff84745,0x0000eb87,0x00458810,0x00207cdd,0x00209147,0x0015a44c,0x00366eca,0x003bc539,0x0030ae5a, -0x001f1b07,0x0013a665,0x000eaa38,0x00064fe5,0x0001f431,0xfff579ee,0xfff46780,0xfff618c8,0xffc4bdc5,0xffd92e72,0xffc7d708,0xffa257c3,0xffbb9ac3,0xffca9220,0xffb3aa5f,0xfff71eb0,0x0000d198,0xffea54f5,0xffff3da0,0xffe4ef3f,0x0001f6b2,0xfff45a69,0x0014d0a5,0x0046f642,0x00628d81, -0x004a2e20,0xfffcdd63,0xfff534de,0x0011d1da,0x006fb9f4,0x002b0807,0x0017f376,0x001ddc42,0x0065bf25,0x0085f804,0x007c07c8,0x00624fcf,0x004c497f,0x003feda9,0x003016a6,0x0022b53d,0xffff0a23,0x00021f38,0xfffcaaee,0xffc1a344,0xffd7361b,0xffd210df,0xffca6fb4,0xffa4a4c1,0xffa60e58, -0xff88143a,0xffcaa8d8,0xffe27756,0xffb67d36,0xffd6c9cb,0x007edbe5,0x00868a1c,0x00b448c1,0x008f6fb1,0x00223451,0x001b71ec,0x00063eb3,0xfff552ca,0xffea249e,0xffe397da,0xffe12a41,0x003417d2,0x004dd2f4,0x001c975a,0xffca03ef,0xff889a5a,0xff4fa07d,0xff5d09d5,0xff5f7400,0xff60c6a9, -0xff697821,0xff7c2e15,0xff877bf4,0xffde6e5c,0x00006aa4,0x001b3582,0x00061ed5,0x0009e000,0x001539cc,0x001c2cee,0x00477a16,0x006c8871,0x0077fb21,0x00714339,0x00571a24,0x0070745e,0xffedc3be,0xffd0f131,0xffbed0f4,0xffa5ebf7,0xff8cc3d4,0xff656bff,0xffa7e658,0x0025f535,0x00565e99, -0x00481408,0xffd2f8ba,0xff672d29,0xff5eee22,0xffaca90d,0x0010351c,0x005ad7bb,0x006a1655,0x0075cb3b,0x006512cd,0x0051d54f,0x00222f49,0x00113893,0x00195c08,0x00166475,0xfffe1d5b,0xffdf86a6,0xfff7d0f7,0xfffdaa22,0xfff4fc99,0xfff67dcc,0xffddd194,0xffadaf03,0xff70e592,0xffa99b9d, -0x004609ed,0x00139d3a,0xff8f1ff5,0xffea37b6,0xff7a52d2,0xffce0a8f,0x00f89d6e,0x008adbc4,0x004bb162,0x002c8f6b,0xff679c35,0xff6a5c6d,0x003002c1,0x006882df,0x00562aad,0xffd767d3,0xffcd79de,0xffba3874,0xffb1083e,0xffc2b733,0xffc9f10e,0xffc2394c,0xffdd451c,0xffdeca77,0xffd1f9b2, -0xffd7bac6,0xffee20fe,0x0005df82,0x00061978,0x00011cd5,0x000586ca,0x0005414b,0x00117517,0xffde34c3,0x000e12c0,0x0005897a,0xff78944d,0xff85dc5b,0xffb21d16,0x00808e32,0x007ef4de,0x0054d005,0x0012c4fc,0x007d6911,0x00987da3,0x0065e686,0x001dd598,0xffee0b7e,0xfff96c49,0xffdb16a1, -0xffe5b587,0xfff00597,0x000f687f,0x001f41ca,0x00261e79,0x0038984f,0x0040b31d,0x00383692,0x00347040,0x00310a93,0x00303b4e,0x0011cec4,0xffffb8b5,0xfff7724b,0xfffde3cb,0xfffe3aed,0xfffd1044,0xfff90222,0x00009d8b,0xfffe5ca8,0xfff1b263,0xffe35d84,0xffd2f984,0xff930c6b,0x004085c6, -0x003654d8,0x0040b37f,0x003ebf3f,0x00011b06,0xffda1d94,0xffb4c2ed,0xffadc3c2,0xffba9961,0xffcfdfb9,0xfff1d915,0xffffba57,0x000d26c1,0x00198950,0x000e2968,0x0003f1a3,0xfff8fa42,0xffede879,0xffe7db92,0xffe363b0,0xffed15ee,0x0000fcc0,0x001524c7,0x000f794e,0x000ab7bf,0xfffec499, -0xfffdf34b,0x0002be7f,0x00061200,0x0004d839,0x0001b9a7,0xfff06de6,0xfffd345f,0x0009c84b,0x0023a87b,0x00352790,0xffb183f2,0xffaba7d9,0xffbea0a5,0xffbe4624,0xffc1573c,0xffcac33b,0xffdcd81d,0xfff668a6,0x0027cfeb,0x004b37f9,0x00618de5,0x00658cda,0x0060ab46,0x00505887,0x00401c65, -0x0026546d,0x000469dc,0xffed3f41,0xffdd3b8f,0xffd2c1c6,0xffd01b69,0xffdd26cd,0xfff2dfca,0x00099818,0x00118849,0x000ee75a,0xfffc5079,0xfff1a41c,0xffefc5fe,0xfff20042,0xfff48103,0xffedd151,0xffeb0136,0xffde8aba,0xffd0fb2c,0xffc04285,0x0025e8b8,0x001c8160,0x00140358,0x00189f1f, -0x001bc22e,0x0027c198,0x0031ade9,0x003a6014,0x0033cac0,0x002c8398,0x0028034a,0x00158050,0x000571e3,0xfff36538,0xfff0eee1,0xffeda3fc,0xffeab92d,0xffee9849,0xfff09e73,0xfff04452,0xfff7664a,0xfffa9a38,0xfffc3751,0x000e84fe,0x002198d7,0x003d48ee,0x003c534f,0x003dc310,0x003ec687, -0x002f8aa7,0x0021da54,0x00136d2b,0x001a786f,0x00220ef8,0x00256237,0x00223fe3,0x00314c87,0x003972fc,0x00355702,0x002f47a3,0x002773c8,0x00202d97,0x00189dfa,0x00146a3d,0x000a45a3,0x0002b048,0xfffbe5b2,0xfff407f9,0xffed5060,0xffe498da,0xffe5d8ee,0xffe54fed,0xffe4bd78,0xffe24286, -0xffe07bc8,0xffdd919a,0xffde7290,0xffe78c66,0xffed47b4,0xfff1c807,0xfff26c3a,0xfff807f9,0xfffd6b26,0x00045582,0x000b095b,0x0014d34f,0x001f7f54,0x0025ffc2,0x002780cf,0x00268958,0x002a536d,0x002f01cc,0x0002e011,0x00074975,0x0002aa4d,0x0000da28,0xffffa11f,0xfffdf755,0xfffc1b42, -0xfffa4650,0xfff693eb,0xfff2d1dc,0xffee6d43,0xffeb4eb4,0xffe845e6,0xffe435ce,0xffe54c17,0xffe529ee,0xffe57e9c,0xffe60608,0xffe698fd,0xffe79600,0xffe725a0,0xffe7aa94,0xffe55d7c,0xffefcbf6,0xffefd4a4,0xffeb47ba,0xffee7bc2,0xfff184f6,0xfff42822,0xfff6f1b4,0xfff939ba,0xfffdef6d, -0x00016c61,0x000546e0,0xffff5b2d,0x00024714,0xffe881de,0x0003b50c,0x0005449c,0x0007c71c,0x00063272,0x00073946,0x000aa294,0x000b257c,0x0008ab54,0xfffec32a,0x00002c4f,0x00025eb8,0x000f8754,0x00076560,0x00070fc5,0x000583cf,0x000a88ca,0x000b3851,0x000a7abe,0x00071622,0x000569fb, -0x00044e6f,0x0003a860,0x00036eef,0x00046ac8,0xffffb62a,0xfffee207,0xfffa4985,0xfffcedaf,0xfffa747c,0xfff366cf,0xfffab3ba,0xfffca7ae,0xfff562b0,0x00022e07,0x0003e5c8,0x0000c5ea,0x00046b00,0xfffe14ea,0x00060ddf,0x0001ce71,0x0008d7e3,0x0014414a,0x001c6731,0x001548f3,0xfffbdf47, -0xfffce6c7,0x00041ee0,0x0023a06d,0x000a5424,0x00063e6b,0x000792d4,0x001b34b8,0x0023616e,0x00227a5c,0x001c73e1,0x001660f7,0x0012922d,0x000ce111,0x00068ce6,0x0002fffd,0xfffc9411,0xfff83d47,0xffebd521,0xfff85116,0xfffaf429,0xffea7dea,0xfffa35d9,0xfff6ed7c,0xffde5194,0xfffa7677, -0xfffc9917,0xffeb9350,0xfff7763e,0x00040410,0x001a5dff,0x000e3c4b,0x0019d538,0x0026b575,0x0034af43,0x00290d32,0xfff5cf0b,0xfff32309,0xfffae5ab,0x00436300,0x0017aa2f,0x0017719a,0x001046b1,0x002dbf7d,0x0033d6fe,0x002d1862,0x001db904,0x0012df43,0x0010435d,0x00040de9,0xfffc861c, -0xfff5fd6e,0xffebf843,0xffed88ea,0xffc6d668,0xffd936c4,0xffcadfee,0xff9e5efc,0xffc40e1d,0xffd12d18,0xffafbbed,0xfff9bec7,0x000316b1,0xffe7941b,0xfffd466f,0xffe34075,0x000043c6,0xffefdecd,0x0008d28d,0x0030f36e,0x00567a55,0x004351a3,0xfff6e41f,0xffec828f,0x000b9c21,0x006ec8cb, -0x001ecf84,0x000215b5,0x000bae75,0x004e7e2c,0x007350a1,0x00724a3e,0x005f3e5a,0x004ba950,0x004244f3,0x002a0e2d,0x00185a81,0xfff5b69b,0xfff08e3c,0xfff08f3a,0xffc50a6c,0xffe0e723,0xffe20bf4,0xffd9a436,0xffbe202b,0xffbdcb52,0xff91eb26,0xffd7375c,0xffe8fc87,0xffaf16a9,0xffd3eaa3, -0x00806009,0x008e07e1,0x00b65dbd,0x00998e78,0x004270bb,0x001dcdbc,0x0001dd9a,0x0006ada7,0xffe899f6,0xffd7bc2c,0xffd2e6a9,0x00241e1d,0x00512f9d,0x0048be77,0xffe1aabd,0xff96ff55,0xff5d516b,0xff5bfac8,0xff5ddfac,0xff664106,0xff6cceb4,0xff82ad01,0xff919649,0xfff8e8d9,0x0010eddb, -0x000ff822,0x000bc4a1,0x000b172e,0x0013c4b6,0x0018f5f1,0x003aa7f5,0x004d9e55,0x00666029,0x006fabe2,0x0063d01e,0x00737dd2,0xffd952d0,0xffd380de,0xffc46151,0xffaa2698,0xff9562fa,0xff61cdb4,0xff9d6c54,0x0022dbd6,0x004aeaca,0x004d04bf,0xfff48271,0xff73efe9,0xff5718a8,0xff9e05b6, -0xfff0a89c,0x003ca36b,0x0061cfaa,0x00710163,0x005f1c7d,0x00421ff9,0x001665cb,0x00075c98,0x00142557,0x000e038a,0xfff9b006,0xffe8efc8,0xfffc2627,0xfff9c589,0xfff6c12f,0xfff43727,0xffeb6e00,0xffc523af,0xff930ec2,0xffbee97a,0x00406d59,0xfffd08d8,0xffbb5a55,0x0023a633,0xff966d79, -0xffdea94a,0x00ef3899,0x008eb9d6,0x005af0be,0x0048b0ad,0xff7ed7c6,0xff6b49a8,0x0003cb69,0x006b91f6,0x006fea97,0xffefb803,0xffdbde20,0xffc386c2,0xffb9ec11,0xffc1e4f8,0xffca71af,0xffc9466a,0xffe1e933,0xffe3adcf,0xffd7cbc1,0xffe25bc0,0xfff72470,0x0008714f,0x0003b5c0,0x0002b156, -0x0006d60c,0x0002dcd1,0x00136f2f,0xffeef7a3,0x00162a47,0x000dd1ad,0xff70b442,0xffa35d1a,0xff983c08,0x00c44d1f,0x006b5d1b,0x001e2dcf,0xffc8be35,0x0041bf4c,0x0085bfe0,0x00958c63,0x00308900,0xfff4bdfe,0xfff217f3,0xffd800f9,0xffdfd108,0xffedf092,0x0000e6df,0x000b865d,0x00188ddc, -0x003117cc,0x003ed108,0x003cb67b,0x0036c9eb,0x0030ed12,0x002a8637,0x000ac546,0xfffe3e43,0xfffb7671,0xfffd9678,0xfffc74bd,0xfffc94f8,0xfff950e8,0xfffe3596,0xfff802b0,0xfff4d06b,0xffda92ab,0xff89cd3b,0xff47c5a1,0x005f4385,0x00404373,0x003c0c54,0x003f81f3,0x000d3bfc,0xffe68628, -0xffb5423e,0xffa39636,0xffaba5ea,0xffbf0149,0xffde30dd,0xffec86d5,0xfffc6de2,0x00104510,0x000ad001,0x00080b1f,0x000441d7,0xfff9fe37,0xfff5c0fc,0xfff53fd3,0x000262ea,0x0013f248,0x0021832b,0x001427d3,0x000ae680,0x0000c241,0x0002941a,0x00059a94,0x00068891,0x0005cb81,0x0004f48a, -0xfff5743b,0xfffa215a,0x000e176f,0x003b1e48,0x005f2b41,0xffb9cb54,0xffbd0889,0xffd4b5c6,0xffca3dae,0xffbfbb57,0xffbc558f,0xffcb1f5e,0xffe2dbca,0x0013efe5,0x003381db,0x0044666b,0x004c60ef,0x004b915a,0x0040d22b,0x0032ac97,0x001acc4f,0xfffab708,0xffe6b221,0xffdbd0e8,0xffd65e2e, -0xffd4eb21,0xffe232c6,0xfff85343,0x000ae703,0x000e1fb4,0x00058c43,0xfff5769c,0xffef2d60,0xfff06968,0xfff2ecda,0xfff35247,0xffea8bda,0xffe712a9,0xffda3780,0xffccb8fc,0xffbf7167,0x000a700f,0xfffd1457,0xfff3a47f,0xfff9c2fb,0xfffdd4f3,0x00115116,0x001f7e6e,0x002bbb1b,0x00294cad, -0x0027934c,0x00281573,0x001a4754,0x000dd9fb,0xffffd8ab,0xfffb919b,0xfff77536,0xfff3d4e7,0xfff560ea,0xfff47ed6,0xfff12fcc,0xfffbdbd0,0x00020112,0x0006b7b3,0x00143d2e,0x0025c125,0x003cb337,0x00388961,0x00334b52,0x00321166,0x0020fac6,0x0012f980,0x0002038b,0x00088381,0x000e0932, -0x00105663,0x000ae11e,0x003a2e60,0x003e35d6,0x003ada37,0x00351a04,0x002d04f2,0x0026f154,0x00208eff,0x001dbc0f,0x0013ae28,0x000b4bf2,0x00038e50,0xfffb406b,0xfff41be2,0xffeb026b,0xffec4209,0xffebf76f,0xffeb98fc,0xffe99822,0xffe8db0b,0xffe61a7b,0xffe80cc4,0xfff2b069,0xfffa612b, -0x0000e721,0x0003ac80,0x000c51ae,0x000fd6f4,0x0015a9f8,0x001af324,0x0021745c,0x0028ed2e,0x002dfb4a,0x002e300f,0x002d627d,0x00311005,0x00343ce2,0x00085df7,0x000b1ff6,0x000802c4,0x0006e4b9,0x00069d36,0x0004e5f6,0x00030b35,0x00017f90,0xfffdff31,0xfffacfb2,0xfff6f6fa,0xfff42016, -0xfff14225,0xffed460d,0xffee6703,0xffee38da,0xffee7fd0,0xffeeef5f,0xffef56d3,0xfff04f60,0xffefe9de,0xfff0f59f,0xffeec368,0xfffa6366,0xfffade10,0xfff7cc2d,0xfff95191,0xfffb5c92,0xfffcc503,0xffff0c76,0x0000b1e3,0x0003ceec,0x0006ee49,0x000a4d7f,0x0006468e,0x000878ed,0xfff27720, -0x0004841a,0x00042f2c,0x0009a3a9,0x000702f1,0x000811c2,0x000a5632,0x000c109a,0x0009bed4,0x00002622,0x00011676,0x00031921,0x0010a7c7,0x0007758f,0x00071333,0x000665a8,0x000a4b78,0x000b0a02,0x000b62a5,0x0007e2b9,0x00062ffe,0x0005d1e0,0x0002597f,0x0001004d,0x00015579,0xfffe1893, -0xfffbc956,0xfff829f2,0xfff9f12c,0xfff7dc1a,0xfff15e29,0xfff8e6dc,0xfffa874c,0xfff26b95,0x00008d1c,0x00040d54,0xfffd4588,0x0001ed94,0xfffb623e,0x000800f2,0x000358c7,0x0008da49,0x00115203,0x001c5fa8,0x0016ce26,0xfffe74ec,0xfffdc87b,0x00048d2b,0x0024d70e,0x00085499,0x000287dd, -0x00057bd0,0x00157ecf,0x001e3801,0x00214117,0x001b96ef,0x001643cf,0x001242c8,0x0008ef4a,0x0003e1ab,0x0002f5ed,0xfff83b37,0xfff4a585,0xffef1ed8,0xfff8f498,0xfffbe916,0xffeaf689,0xfffe9921,0xfffc62f7,0xffe1c4de,0xfffdd61c,0xfffdced4,0xffec753d,0xfff8894f,0x0003340e,0x001c06bd, -0x0010695b,0x001a773c,0x00228e04,0x00355ce3,0x002b1cba,0xfffa59d2,0xfff523e4,0xfffafdeb,0x004420bb,0x00135b3a,0x0012be03,0x000f14aa,0x0027511c,0x002dcd2f,0x002d3716,0x001e0fab,0x0013bd67,0x0010e06d,0x0001c786,0xfff8553b,0xfff9584a,0xffe4b877,0xffe51a45,0xffcd82b6,0xffd935ae, -0xffd041a7,0xffa12336,0xffce0c10,0xffd7cd2f,0xffb26607,0xfffbe4e9,0x00051186,0xffe72f1d,0xfffcfeaa,0xffe3e164,0x00022e27,0xfff3a7d6,0x00052237,0x00235866,0x00529670,0x00463e14,0xfffd2a96,0xffed3de8,0x000b8ab3,0x006e6365,0x0016c85a,0xfff1fb29,0xfffdbf14,0x0037f964,0x005fe34e, -0x006a612e,0x005af23d,0x0048ae30,0x003f5a7b,0x0020f717,0x000de848,0xfff02b50,0xffe1f73e,0xffe804f9,0xffcedd4e,0xffec4040,0xfff055bc,0xffea6f55,0xffd6cb41,0xffd4b49f,0xffa51d92,0xffe351c2,0xffeee656,0xffaf301a,0xffd4cc4e,0x007b20d8,0x0091ada6,0x00b91f41,0x00a7c481,0x00699343, -0x00266094,0x0002c56b,0x0019cba5,0xfff05f21,0xffd954ef,0xffd0f4bb,0x0025922f,0x006303ef,0x0078c7bd,0x000321d0,0xffaffa2d,0xff77f0c7,0xff65f85c,0xff66d097,0xff74d332,0xff7830b6,0xff8fce3e,0xffa3c49c,0x0010018c,0x001b3b18,0x0007b4a9,0x000cadb1,0x000796c7,0x000f583a,0x000f0de8, -0x002a6ec1,0x002f9348,0x00518ad7,0x0067e2b1,0x006a58c8,0x00717c36,0xffce0b59,0xffde55d6,0xffd379ba,0xffb56257,0xffa4f25d,0xff695097,0xff9c9b83,0x00267b54,0x00434628,0x005338e4,0x001c1149,0xff8a8488,0xff599e3f,0xff978000,0xffdccc13,0x0026b814,0x005b610e,0x0068fbb9,0x005583d6, -0x0030454b,0x00096738,0xfffe57d2,0x000fdb1f,0x0005b944,0xfff63b66,0xfff27203,0xfffd86c0,0xfff99b36,0xfff9d0b8,0xfff5d26e,0xfff47fd0,0xffdfab81,0xffb293f1,0xffd22ce2,0x00358de8,0xffee578e,0xffe22edc,0x005977a4,0xffc969cd,0x0001b42d,0x00e4e202,0x009f6d5c,0x007565a2,0x0068cd84, -0xffa2fa35,0xff7ce6ee,0xffe5d959,0x0072048e,0x008d262c,0x001a0289,0xfff3dac6,0xffd31761,0xffc9fb5c,0xffc8a0a8,0xffd4b06e,0xffd9ee82,0xffed665b,0xffedf783,0xffe04043,0xffee9389,0xffff1744,0x000706d9,0x000239a8,0x00033421,0x00053fa0,0x0002a5ad,0x000c1e5b,0xfffeec59,0x0014a9af, -0x000f00a8,0xff7efd55,0xffbf03f8,0xff8dbcd0,0x00e09558,0x00445916,0xffe43091,0xff8e9c3d,0xfffdabcd,0x0065ee53,0x00c1d7b0,0x004fff24,0x000d4faa,0xfff12611,0xffdfe3c2,0xffe2c3b6,0xffefdd35,0xfff6cf84,0xfffe84ff,0x0010fee7,0x002b8c03,0x003d9b76,0x00407c35,0x00367e77,0x00302b07, -0x00219cb8,0x0003d3bb,0xfffcce16,0xfffd39f2,0xfffd416b,0xfffc375a,0xfffcbd31,0xfffab9c5,0xfffe4792,0xfff7f7f9,0xfff89615,0xffd780c7,0xff4ee2c0,0xff17bb04,0x0084a261,0x005d2354,0x004604c1,0x0043a6b0,0x001fdab2,0xfffa856d,0xffc26e7d,0xffa6a5f3,0xffa95861,0xffbc2d9c,0xffd98071, -0xffe6145b,0xfff70832,0x0011447e,0x000fb4ce,0x0011807d,0x0011816b,0x0008b3b5,0x0007bf07,0x000acbeb,0x00173861,0x0026dfd0,0x002986e4,0x00168686,0x000a8bbf,0x0002007b,0x0004ba84,0x00061f9f,0x00060152,0x0004b84d,0x0006279e,0xfffb4d97,0xfff9f056,0x00141002,0x004cfa73,0x008e3cee, -0xffc4e0f0,0xffd6ce54,0xfff050b0,0xffde6662,0xffcc162c,0xffbf41b5,0xffcb3afa,0xffdfd6be,0x000c12f5,0x0023eb4d,0x002d4f47,0x0036670b,0x0037f1db,0x00320114,0x00267923,0x0011d6e2,0xfff524e2,0xffe5a44f,0xffe041ae,0xffdcd9ab,0xffdae82e,0xffe94e14,0xfffdd27c,0x000b3ce7,0x0009f905, -0xfffe1528,0xfff2dbf8,0xffefba5d,0xfff2d78b,0xfff55ffe,0xfff4bb1d,0xffeb0b3a,0xffe601b4,0xffd99cea,0xffcd4786,0xffc65171,0xfff47aac,0xffe659bd,0xffdf6d23,0xffe525e4,0xffe949c5,0x0000fbe6,0x00117daf,0x001f945e,0x0022937a,0x0027c4fb,0x002e5d35,0x0025b1df,0x001d4ff4,0x00138c82, -0x000cb11c,0x0006b15c,0x00017f03,0xfffff0aa,0xfffd01c6,0xfff593bf,0x00007715,0x0008fdd3,0x001026fb,0x0018b578,0x0025bfaf,0x0035c147,0x002efc24,0x0027e28e,0x002431c9,0x00153067,0x00075631,0xfff6feef,0xfffbdf87,0xffff1f62,0xffffdf6d,0xfff94f48,0x003971e8,0x003e785d,0x003c7c92, -0x0037ee15,0x00314213,0x002d703f,0x00294755,0x00284a0a,0x001f61a6,0x0016b8aa,0x000ea828,0x00068c96,0xffffa92c,0xfff6fbf0,0xfff8197c,0xfff81f92,0xfff80679,0xfff689a2,0xfff6e462,0xfff40c71,0xfff26afe,0x0000dddc,0x0009625a,0x0010e16d,0x00154321,0x00218c66,0x00230acb,0x0026297a, -0x0027fcd1,0x002bab93,0x0030045c,0x0031af19,0x0031304a,0x002f552f,0x003282f3,0x0035bcca,0x000e5e58,0x00133779,0x0010c6c2,0x0010bb1e,0x001157d1,0x000fce4c,0x000e40b5,0x000d541d,0x000a3578,0x0007e36a,0x0004eec1,0x0002b85a,0x00004d33,0xfffcc016,0xfffdcff1,0xfffd9075,0xfffdbb27, -0xfffdf6f8,0xfffdea3a,0xffffe62b,0xfffb8aaa,0xfffaff6a,0xfff6820c,0x00075389,0x00053db3,0x000133d9,0x0000c73b,0x0001f4bb,0x0002ad14,0x0003c0c1,0x000480be,0x0005f8ee,0x000af7b7,0x0010b23b,0x00092e47,0x000cc7c8,0x0002c9cb,0x00036580,0x0006187f,0x0007cf7d,0x000634fa,0x0007086c, -0x00086735,0x000aeeca,0x0008b5fd,0xffffa133,0x00001148,0x0001e002,0x000f5d2f,0x0005af7a,0x00054043,0x00053391,0x0007e3fc,0x0008aa2d,0x000a3b21,0x00069088,0x00051d29,0x0003c445,0x0003fb19,0x0003cfd7,0x000583d2,0xfffe5282,0xfffdfd46,0xfffd6a01,0xfffe2494,0xfffd0414,0xfff74e18, -0xfffe72b9,0xffffb6ef,0xfff7b6ee,0x0003ff9f,0x0004e257,0x00011090,0x00051afd,0xffffe2c8,0x00080b7f,0x0002eb80,0x000749b2,0x000cccbe,0x0019d098,0x0015a2fb,0xfffeda52,0xfffc767b,0x0002afee,0x0022bf26,0x00053e7d,0xfffe0ade,0x0001461f,0x000cf660,0x0015e11f,0x001d102d,0x0017b1fb, -0x0012c7df,0x000f1c42,0x0009a6ae,0x0002362c,0x0004f14c,0xfff5ee84,0xfff2e0da,0xfff39d9a,0xfff7ff50,0xfff9adb0,0xffebbb51,0x0001186b,0xffff70bc,0xffe6664e,0x0000c503,0x0000c318,0xfff0b129,0xfff9b7ac,0x0005ed04,0x001c0598,0x000f96d5,0x0019d89a,0x001d7239,0x00331d29,0x0029de4f, -0xfffccde0,0xfff4d9c5,0xfff9127b,0x00403ddc,0x000e2d14,0x000d399c,0x000b459d,0x001d3f6a,0x0023e5c9,0x002a570f,0x001b3345,0x0010c09a,0x000e9199,0x0001ad9e,0xfff6e91c,0xfffea29f,0xffdebc19,0xffdfd5eb,0xffd7b230,0xffdaefcb,0xffd79d1f,0xffb03b45,0xffd7f4e3,0xffe071cd,0xffbc8a5d, -0xfffed951,0x00072e9b,0xffea1911,0xfffe3705,0xffea5e71,0x000416c3,0xfff58dbe,0x00013c34,0x00157af3,0x004b702a,0x00457ea3,0x00018b10,0xffec322d,0x00087841,0x0067915c,0x000fd2e2,0xffe56507,0xffee9c43,0x001cd678,0x00465952,0x005d8dce,0x0050b94a,0x003f55a9,0x00364817,0x0018fa6f, -0x00042c04,0xffef8374,0xffd85cc9,0xffe42020,0xffdc31a7,0xfff6d353,0xfff7b93e,0xfff4d4b4,0xffec7fbf,0xffe6d547,0xffbd28bd,0xffee17c0,0xfff5dcb7,0xffb6393e,0xffd822df,0x0075a8de,0x008a513a,0x00b32519,0x00b087cd,0x008916c8,0x002a327a,0xfffe922e,0x0021a5aa,0xfff3507c,0xffd9d5bc, -0xffd0071b,0x00257d83,0x0070143f,0x009e19aa,0x0024174c,0xffcc0dae,0xff95c196,0xff75f3e8,0xff740039,0xff872f15,0xff8a4967,0xffa07e7d,0xffbd2c7c,0x001ff07f,0x001ed5ed,0x000273df,0x000a86c3,0x00031bc0,0x000aa195,0x00057918,0x0018fc21,0x001a04b0,0x0039bd3d,0x005b0ab7,0x0068e01f, -0x006d14fa,0xffd25eab,0xffef50b1,0xffdea8a1,0xffbd6c6f,0xffadf34a,0xff6cdeee,0xff96817b,0x00219569,0x003623e0,0x0053705a,0x00401723,0xffa4c4c7,0xff60dbd0,0xff8f27f3,0xffcc652d,0x001357f8,0x004ff55c,0x005aceeb,0x0044fa12,0x001d35e4,0xffff3afc,0xfff85b46,0x000de3b9,0xfffdc404, -0xfff4cd8e,0xfffa15ac,0xfffd48af,0xfffc10af,0xfffc028b,0xfffab6b6,0xfff78b1b,0xfff46b0f,0xffd02d15,0xffe176a5,0x00293399,0xffe7c2f6,0x001007bc,0x00858c08,0xfff42d14,0x00175a83,0x00be59cd,0x00a2aa50,0x0085dab4,0x007dcdc0,0xffc8f178,0xff94681c,0xffc96fe8,0x00694964,0x00980726, -0x003e9bbb,0x0003c33f,0xffdb6a3c,0xffd63992,0xffcf2f4e,0xffde544e,0xffef432d,0xfffdee82,0xfffb543b,0xffec1607,0xfffa5770,0x000418c3,0x00041932,0x0001b411,0x0002bf37,0x0002c5ac,0x0002c5a8,0x00052f32,0x0003de9c,0x00110614,0x000a4e47,0xffa106bf,0xffdd2ed7,0xff94b0f4,0x00bb74c9, -0xfff34cb0,0xff9a5e0d,0xff56f7ca,0xffae01f2,0x002f1014,0x00d0c659,0x006af94b,0x002898c7,0xffea46b0,0xffe27576,0xffde1686,0xffe77df8,0xffe6d920,0xfff00f15,0x0006c33f,0x00226e21,0x00368d90,0x0040e567,0x003850ad,0x002eaae2,0x00176c86,0xfffe80e8,0xfffbe928,0xfffdb70c,0xfffd7369, -0xfffcfbad,0xfffd9040,0xfffccf51,0xfffe2e86,0xfffab156,0xfffbd4a8,0xffd6f3df,0xff32c008,0xff0b15d9,0x00b04172,0x007cf6ba,0x0045e0d9,0x00371dd2,0x00236eda,0x000515b7,0xffcf63b4,0xffad00f2,0xffaa4038,0xffbaddc9,0xffd341e4,0xffde176b,0xffefd14c,0x000ef158,0x00126ca9,0x001821b7, -0x001a180f,0x0015920e,0x00180078,0x00204b52,0x002df8f6,0x0038094a,0x002ebc8d,0x0017a1f3,0x0009507d,0x00027e97,0x0004931d,0x000534ce,0x0004996f,0x000313f2,0x00049af0,0x0001076b,0xfffc9020,0x001c6065,0x00597659,0x00b6e1ca,0xffdbc752,0xffee5f9d,0x00022745,0xfff0a894,0xffdc316f, -0xffcbb029,0xffd4c92b,0xffe3a5ad,0x000906d7,0x0018d0db,0x001acb27,0x0020ca98,0x00213ad1,0x001d911d,0x001546f2,0x00061856,0xffefa730,0xffe6dcf0,0xffe5638d,0xffe5b652,0xffe63b16,0xfff2c826,0x00067b48,0x000c4d6b,0x0006f54e,0xfffa5ade,0xfff409c2,0xfff340fc,0xfff6434f,0xfff8ebbf, -0xfff88217,0xffeef468,0xffe9a20f,0xffdf9a9e,0xffd5922a,0xffd41341,0xffe7f512,0xffd9493c,0xffd41c87,0xffd9f889,0xffdd0e44,0xfff4a588,0x00045400,0x0011a4b0,0x0019c506,0x0024ef42,0x0030fbc1,0x002eb422,0x002be213,0x0027e970,0x001eb839,0x0016eb81,0x000fb263,0x000ba69e,0x0005ff8b, -0xfffd137c,0x000962de,0x001232b9,0x001a79e2,0x001d8fb6,0x0025523b,0x002c08ea,0x0025416a,0x001c3fea,0x0019fa7d,0x000c55aa,0x0001ca59,0xfff316ed,0xfff5ad59,0xfff6521b,0xfff63f2e,0xffee45a5,0x003a080c,0x003861fc,0x00370301,0x00348f2d,0x002fe1c6,0x002eb16d,0x002d10c0,0x002dc442, -0x0027a467,0x0020544f,0x001964a7,0x0012e352,0x000d82d1,0x00073d49,0x0007ca65,0x00081b5f,0x00080cff,0x000732de,0x0007db3b,0x00058318,0x00047a29,0x0011bea1,0x001ab7b3,0x00223f8c,0x00284f38,0x0035564f,0x0034588e,0x0035061a,0x0034a9dc,0x0033d519,0x0033ff14,0x003355dd,0x0032326f, -0x0030ab11,0x003352c3,0x003390c5,0x0018b4d1,0x0018f18e,0x0018fd73,0x0019978b,0x001acfbf,0x00199e5b,0x00187ec3,0x00181f98,0x0015e67a,0x0014c650,0x00132dad,0x00120725,0x00107826,0x000def9c,0x000ea4a6,0x000e5032,0x000e4770,0x000e3d3b,0x000dde13,0x000f4456,0x000d87f4,0x000d5408, -0x0008082c,0x0017b237,0x001646d1,0x0012cb5b,0x0010fd6a,0x00113178,0x00109e24,0x00115341,0x00114fe0,0x00112c9b,0x001655fc,0x0019f592,0x00142237,0x00180d1e,0x00137e72,0xfffcd0bb,0xffffb4d3,0x0001c910,0x00005315,0x0000ca8e,0x00010c15,0x00044209,0x00022ba4,0xfff9c476,0xfff9bd20, -0xfffb5bbc,0x00083d40,0xfffedf0e,0xfffe6ac1,0xfffeb5a3,0x00002775,0x0000f516,0x0003db50,0x00003174,0xffff1d07,0xfffd5b99,0xfffdc7e3,0xfffe857b,0x00040005,0xfff77c2f,0xfff81fe5,0xfffd1d06,0xfffc41a4,0xfffc0538,0xfff8132e,0xfffda4bd,0xfffe2715,0xfff6cddb,0xfffeea0d,0xfffe3426, -0xfffe89c0,0xffff6655,0xfffc0e94,0x0001da25,0xfffd435d,0xffff8a6e,0x00019a85,0x000fe7d3,0x000d0bf4,0xfff871d8,0xfff4cbb6,0xfffa77df,0x001905fa,0xfffd2147,0xfff512c6,0xfff75345,0xfffe3ac4,0x00070801,0x0012a801,0x000ddd58,0x000a43b0,0x0005ec9b,0x0003ce86,0xfffc129e,0x00015e52, -0xffef3278,0xffeca2a4,0xfff3afe9,0xfff07a8e,0xfff063a7,0xffe6cd6c,0xfffc09ba,0xfffc8ccd,0xffe6cfbb,0xfffd62e9,0xfffd2354,0xffee5535,0xfff5a218,0x000124cb,0x00159a45,0x000a1484,0x00126cd5,0x00109462,0x0027bab0,0x001fa1b0,0xfff74303,0xffed145e,0xfff04f39,0x0032ae75,0x00040b89, -0x0002b9f8,0x0000e046,0x000ba075,0x001240b3,0x0020d15a,0x001209e7,0x000937d2,0x0005e078,0xfffc8d18,0xfff2d953,0xffffdb9d,0xffd73002,0xffd98dc0,0xffe000f3,0xffdb2d4a,0xffdbf8b7,0xffc10162,0xffe028e5,0xffe50c53,0xffc71b62,0xfffd0139,0x00039cf4,0xffe7dcc2,0xfff932eb,0xffeb25b0, -0x00006989,0xfff3ad95,0xfff75194,0xffffa7cb,0x0038c5bf,0x0038a96d,0xfffc59bb,0xffe3de9f,0xfffd9454,0x005538a5,0x00059833,0xffd8b4db,0xffdb41d7,0xfffa1192,0x0023b160,0x00492675,0x003f7fb7,0x0030c11e,0x0026aa9a,0x000e7246,0xfffb0e6c,0xfff09c0e,0xffd3bd39,0xffe46815,0xffeba413, -0xfffca2b0,0xfffd6d23,0xfffdbf41,0xfff8f5cb,0xfff51991,0xffd4b7c7,0xfff4ea60,0xfff88c5e,0xffbe55e7,0xffd91002,0x0063a084,0x00757eec,0x00a3b20f,0x00ab689d,0x0094a1d5,0x0023246c,0xfff0f8e2,0x0018e8e9,0xffe77cb0,0xffce36f5,0xffc8c2c4,0x00189651,0x006bee73,0x00ab5cc5,0x003a6515, -0xffe23938,0xffab9d8c,0xff82233e,0xff7eba50,0xff957539,0xff998029,0xffb21f01,0xffd6c078,0x0025c758,0x001b5a02,0xffffda00,0x000712e4,0x00008c60,0x0004c95d,0x00024dd1,0x000a167a,0x000b7844,0x00221516,0x00457099,0x005959eb,0x005d9e4a,0xffd22a49,0xfff79a2b,0xffe0d252,0xffb85824, -0xffa7b72d,0xff635aaa,0xff812d39,0x0006da41,0x00142a1b,0x003c71ed,0x004c25d2,0xffad3fb6,0xff5aa01f,0xff771ac4,0xffb40109,0xfffb3c8e,0x003b9b86,0x0043fe68,0x002d92a6,0x0005abbd,0xfff19c4e,0xfff1b097,0x00097550,0xfff73a7b,0xfff5e133,0xfffd7e4d,0xfffdc952,0xfffe50dd,0xfffdf970, -0xfffe0117,0xfffb42d7,0xfffcd588,0xffe8a9bd,0xffec4a7b,0x0016fb79,0xffe06d9d,0x002e08c2,0x009549e2,0x0013ff69,0x001fa245,0x008e83ba,0x009dc419,0x008c4fd1,0x007bf7f9,0xffdff47c,0xff9c3460,0xff9e485e,0x0048e74e,0x008cf18d,0x005a71b4,0x000c5b9c,0xffdc81dd,0xffd9fc4d,0xffd1cb0e, -0xffe61040,0xffffc1aa,0x0008bb16,0x00047f60,0xfff415ab,0x00025b76,0x00046e0f,0x0002324c,0x00014bb1,0x0001954e,0x0001564e,0x00017742,0x000287d2,0x0001cf3a,0x000ae147,0x0003c195,0xffbb3430,0xfff417c2,0xff902c7d,0x00594fe9,0xffa26e48,0xff621880,0xff3c8842,0xff6927d2,0xffeabcbc, -0x00b253c2,0x0073d982,0x003aea98,0xffd9d34e,0xffd964b7,0xffcc467a,0xffd154bb,0xffce026b,0xffdc626c,0xfff765b6,0x0013815f,0x00295ae8,0x00376c2f,0x00322998,0x00257993,0x0008b790,0xfffa7291,0xfffb8be5,0xfffeabae,0xfffe21df,0xfffe0136,0xfffe75a5,0xfffe5f5d,0xfffe751e,0xfffd85b0, -0xfffd2e14,0xffd751b5,0xff305f4d,0xff1a7bc0,0x00ca24e3,0x0096e31b,0x003f6b58,0x00197769,0x0016b8d4,0xfffbf824,0xffce2ab2,0xffa888d0,0xff9fba08,0xffad60c5,0xffc31521,0xffcda8c4,0xffe10ad6,0x00039594,0x000da2ae,0x00168674,0x001a5b48,0x001975bc,0x00201a2b,0x002baf15,0x003afe8e, -0x003ea663,0x002b1241,0x00141908,0x00055708,0x0001df41,0x0003b6cb,0x00037d25,0x0002eee9,0x0001eb88,0x0002ee5e,0x0002f4a3,0xfffe7ba8,0x00212212,0x00561f78,0x00ca6fa0,0xffe42ec1,0xfff982ae,0x0006c8ac,0xfff6fbfa,0xffe41163,0xffd10f5f,0xffd54c95,0xffdb7564,0xfff75c2e,0xffff5c2b, -0xfffc1cd8,0x0000683d,0x0000bcce,0xfffeb266,0xfffc57f2,0xfff494bf,0xffe5f520,0xffe1fef0,0xffe30608,0xffe6a684,0xffeafc31,0xfff68a58,0x00088415,0x000859b8,0x0002d289,0xfff906d2,0xfff73277,0xfff8826d,0xfff9d850,0xfffc6b6e,0xfffb94b5,0xfff38510,0xffec9caa,0xffe3fc3d,0xffdbf004, -0xffdd01c3,0xffd8500d,0xffc8a757,0xffc670b2,0xffcbee65,0xffcebf95,0xffe20bcc,0xffee5806,0xfff863af,0x0004b507,0x0014461f,0x00246759,0x0028f1f4,0x002c5ff9,0x002f1922,0x0024c066,0x001be3bb,0x0013a491,0x000e3224,0x000728fe,0xfffdce25,0x000a5914,0x001322d3,0x001bd4b4,0x001a31bc, -0x001df4a8,0x001bd41f,0x0017cbe8,0x000c867f,0x000d7602,0x00010be0,0xfffa86bf,0xffed6d4e,0xffec40e1,0xffe9707c,0xffe76f9b,0xffde036a,0x002dda4e,0x0021b63c,0x002255b7,0x0021a8f4,0x001f5aa0,0x002072b8,0x00215a92,0x0023593c,0x00210418,0x001c3526,0x00177d03,0x00137a67,0x00106567, -0x000d9dfb,0x000dcf8f,0x000ed3b5,0x000f2884,0x000ef484,0x0010057c,0x000dfab4,0x00119377,0x0019f4ab,0x00216e93,0x00293636,0x0030786d,0x003a896b,0x00375dc0,0x00351ca8,0x0033b337,0x002e9d9b,0x002b861e,0x002a5bc1,0x0027e5b8,0x002711e0,0x00281895,0x00239ea9,0x0017244f,0x001376a9, -0x001638dd,0x0016f619,0x0018a27f,0x0017f3d4,0x00175d36,0x001772ea,0x00167481,0x0016a65b,0x0016a26f,0x0016cbaa,0x00166254,0x00153731,0x00157b8d,0x00150b27,0x0014d352,0x00148973,0x001441ff,0x0014713b,0x0014a6b5,0x00160859,0x00166e16,0x001b636b,0x001c426c,0x001f4880,0x001c9cd3, -0x001c1837,0x001a4107,0x001a9774,0x0019d980,0x001839bf,0x0017cc19,0x0016fecb,0x001ab8ec,0x001910e3,0x00183673,0xfffb7c0c,0xfffe1da1,0x0001836b,0xffffa385,0x00003c9d,0xffff748c,0x00038abe,0x0001bc89,0xfffa6a87,0xfff93e9a,0xfffa4778,0x000586fa,0xfffd6388,0xfffcdbe8,0xfffd0149, -0xfffd0f90,0xfffdc934,0x0001fe20,0xfffe6657,0xfffd549b,0xfffbb7a2,0xfffb7d24,0xfffb464b,0xfffebebf,0xfff5cc9a,0xfff508d4,0xfff9be25,0xfff72d42,0xfff7b142,0xfff63f50,0xfffa3b3c,0xfffa1aaf,0xfff407d3,0xfffc7f1c,0xfffd001b,0xfff926e1,0xfffc4a2e,0xfff9e062,0x000289e7,0xfffe7abd, -0xffffafeb,0xfffeb7be,0x000ecebc,0x000d63ee,0xfffbbe13,0xfff52182,0xfff8e603,0x001386d7,0xfffbdb51,0xfff32670,0xfff2e69a,0xfff45cc4,0xfffc7ac5,0x000c679c,0x00083a11,0x0005af6e,0x0000dc2d,0xfffe4459,0xfff90d62,0x0000f106,0xffeb2ff9,0xffe87efb,0xfff6aa4d,0xffeb4455,0xffea58f8, -0xffe5e7e5,0xfff9dcb2,0xfffcec67,0xffeb0580,0xfffca4fc,0xfffb5f5f,0xffef1531,0xfff6f6bc,0x0001cf41,0x0015844e,0x000c67c2,0x0013d2d1,0x000da4e1,0x00285033,0x00220ce8,0x000007de,0xffefeffe,0xffef8aac,0x00280296,0x0001c5c5,0xffffebb6,0xfffc2527,0xfffe0f55,0x0003ece1,0x001aca64, -0x000bf1aa,0x0004a4fa,0xfffe7f2f,0xfff8da73,0xffefcb0e,0x0000dd78,0xffd335f8,0xffd697bf,0xffe9ad10,0xffdce39a,0xffe1a34d,0xffd2ed22,0xffe9d7c8,0xffeaa891,0xffd5ef2a,0xfffc9296,0x0000f016,0xffe89649,0xfff90799,0xfff04f0e,0x000331d8,0xfff9d1b6,0xfff85c48,0xfff76ac6,0x0035a5dd, -0x003bd745,0x0009ccaa,0xffe8ae9c,0xfff9d3ab,0x004316d4,0x0003dbb9,0xffd6bd38,0xffcf0717,0xffdad60c,0x00023816,0x00361b33,0x002f5316,0x0022f4a2,0x0016b418,0x0003d583,0xfff39442,0xfff1fdcd,0xffd46bbf,0xffe96c18,0xfff8a200,0xffff1c4f,0x00033d15,0x00076759,0xfffec62c,0xfffeb2c0, -0xffe9be84,0xfff9f2ed,0xfffb5f6a,0xffca975a,0xffdf04b2,0x005c1790,0x006c1f65,0x00a1f6ba,0x00b3f6f0,0x00ac4586,0x003170ff,0xfffb4929,0x0023d05b,0xffefaac4,0xffd558af,0xffcde3ba,0x0015c86b,0x006e8bbb,0x00b9d799,0x005ab0af,0x00053c23,0xffca78e0,0xff97131d,0xff8f8005,0xffa52d36, -0xffa73393,0xffc54676,0xffeed893,0x0023b16b,0x0012eaf0,0xffff4155,0x0003d2d0,0xfffe1f5a,0xffff06e2,0xffffcfab,0x00044aa6,0x0003346a,0x0010ce7a,0x0030d90e,0x0048b3ec,0x0050ef7a,0xffdb7c3b,0x000f0f18,0xfffd7d0f,0xffd28b10,0xffbaf2ac,0xff719002,0xff821bec,0x000026c6,0x000ab51d, -0x003afa23,0x00643b47,0xffc92758,0xff6c45ea,0xff750314,0xffb08f80,0xfff5f322,0x00334f47,0x0036ab3c,0x001ed73f,0xfff5b03e,0xffe948f5,0xffefd380,0x00063d74,0xfff45883,0xfff8e1ef,0xfffecec2,0xfffecb95,0x00001f7e,0x00008691,0xffffbb02,0xfffdd6e0,0xffff04d8,0xfff6fcc2,0xfff72871, -0x000b142f,0xffe5b86f,0x00532d9e,0x00aff4ca,0x003fc01a,0x002f05ed,0x005d89f1,0x009d0113,0x009aa5e6,0x008225d1,0x000824e6,0xffba093b,0xff908372,0x003aafcc,0x008f1b3d,0x008587ff,0x00277b93,0xffef58f8,0xffeb790c,0xffe0f487,0xfff563be,0x001197ce,0x00146eb8,0x000bf873,0xfffb39f9, -0x000611f3,0x0003a474,0x000114e7,0x0000c408,0x00004ce1,0xffffe442,0x000030c1,0x0001567b,0x000015a8,0x000644b6,0x00026730,0xffd076fd,0x000c09b4,0xff9904fe,0xffe17eee,0xff6458a2,0xff4a17c8,0xff301fce,0xff3c9400,0xffb2bf77,0x0087eaae,0x0084e830,0x005f6895,0xffe1a2c0,0xffe622bd, -0xffcf4851,0xffcdb547,0xffc9c703,0xffdac2e0,0xfff3476f,0x000c75fd,0x002045c2,0x002ec904,0x0029fa7e,0x001a0a11,0xfffd011c,0xfff99a73,0xfffd692a,0xffff2f21,0xfffec060,0xffff643d,0xffffc706,0xffffc534,0xffff2a4b,0xfffece1f,0xffff7bea,0xffde4063,0xff4a3aa1,0xff4a4c10,0x00e0bee2, -0x00b29328,0x003709a6,0xfffa32ef,0x0002c4c5,0xffef4f75,0xffd153e6,0xffb4bcc8,0xffa74696,0xffb31e66,0xffc75855,0xffd186b7,0xffe575ee,0x0008d30a,0x001471aa,0x001d9265,0x0022c4b0,0x002558c5,0x002e6282,0x003860ef,0x0042bdab,0x003fa12f,0x00234109,0x000ddd66,0x00014dfa,0x0001de0a, -0x00021d22,0x0001659d,0x000095f0,0x000057d7,0x00009b94,0x000291b9,0xffffbb99,0x0024396a,0x004eb0bc,0x00cf2885,0xfff21eab,0x00095bf6,0x00102085,0x00040e6c,0xfff20779,0xffe025fa,0xffdf985e,0xffdeaa0a,0xfff3d05a,0xfff763a4,0xfff1b8d1,0xfff452db,0xfff256e3,0xffedf88e,0xffef8b4b, -0xffedd5c8,0xffe6f9c9,0xffe5f0e2,0xffe9ab3d,0xffebc600,0xffefe9ef,0xfffd6abe,0x0009dd3a,0x00061059,0x000047d6,0xfffa54fb,0xfffbb078,0xfffd202e,0xfffecc1d,0xffffefc7,0xffffcc23,0xfffb12d3,0xfff33b97,0xffee10ad,0xffe733cb,0xffed8419,0xffcda41b,0xffc2dbbf,0xffc540fd,0xffc97a7a, -0xffccf068,0xffdcc51d,0xffe6afe4,0xffee0e0a,0xfffc3c02,0x000d43fc,0x001ece0e,0x00284cc0,0x0030c644,0x0038c31c,0x002dd19e,0x002396ac,0x001a0cfd,0x00140a67,0x000e29e7,0x00047512,0x000bc8fd,0x0012ccc1,0x00197c03,0x0013f953,0x00129c91,0x000cd57c,0x0009067b,0x0000cfa2,0x00016e17, -0xfff82516,0xfff239f5,0xffe7ca1c,0xffe386e2,0xffddaa9b,0xffd90a11,0xffd1e902,0x00181eef,0x000db302,0x00101533,0x001183e6,0x0011da4b,0x0014b86d,0x0017e15c,0x001b71b1,0x001c82c1,0x001aa1d5,0x00187fe8,0x0016bd9e,0x00158938,0x0015a337,0x00156704,0x0017195b,0x0017e1df,0x00185520, -0x0019a2ff,0x0018493e,0x0017a705,0x0020f305,0x00270fd6,0x002d3859,0x00332255,0x003ac4c1,0x0035ecc4,0x003173a3,0x002d8daa,0x00277097,0x00231230,0x00200b12,0x001ce745,0x001ac0db,0x001a5a53,0x0015154f,0x0015a745,0x0013d6a6,0x0016d4bd,0x00182b6b,0x001a1dd2,0x001a2e22,0x001a345d, -0x001aafd7,0x001aa11c,0x001bb27f,0x001ccce8,0x001e0ce9,0x001eac6b,0x001eb637,0x001ed514,0x001e780f,0x001e37fc,0x001dd449,0x001d4bb7,0x001e49ee,0x001b82f3,0x001ab0cc,0x00185090,0x00202cfa,0x001ec0d8,0x00205398,0x001d6a2e,0x001c8912,0x001a8c0a,0x0019f34f,0x00186d23,0x001603a3, -0x0016c778,0x00175dfe,0x0015ab52,0x0015c68a,0x00212ffc,0xfff87e23,0xfffc3055,0xfffe46bf,0xfffd4ed7,0xfffda7ad,0xfffbf240,0x0000a070,0xffff3a3a,0xfff9568e,0xfff77733,0xfff81e9e,0x00012cba,0xfffb4e59,0xfffab6c5,0xfffa1bb3,0xfff89638,0xfff90022,0xfffe2f41,0xfffae802,0xfffa1f63, -0xfff7da4e,0xfff92ccf,0xfff9b983,0xfffecca1,0xfff31fde,0xfff3360c,0xfffb6c3d,0xfff70fba,0xfff7d333,0xfff85769,0xfffb5f03,0xfffb1af1,0xfff6546c,0xfffb2429,0xfffa103f,0xfff955d1,0xfffb2891,0xfffb2b2b,0x00000a32,0xfffceb13,0xfffcfbae,0xfff8f758,0x0009e1c9,0x000a3038,0xfffcc1be, -0xfff4829a,0xfff6cfaa,0x000c1528,0xfffb7ee9,0xfff279f2,0xffee0182,0xffe96cee,0xfff00e43,0x00036ab6,0x00008e80,0xffff627c,0xfffa1e86,0xfffb08ab,0xfff5e3a9,0xffff90f1,0xffe86f9a,0xffe66b48,0xfff88ff6,0xffe5a45f,0xffe42a4d,0xffe6bb54,0xfff7015a,0xfffb62fb,0xffeffb57,0xfffb22f5, -0xfff9a074,0xfff004bf,0xfff5e75c,0x000133d3,0x00125fa7,0x000a3ddb,0x001147ef,0x00069faf,0x00231625,0x001f542b,0x0005eebb,0xfff2bc49,0xfff073f5,0x001c02fe,0x0003ac75,0x00010e4b,0xfff895d4,0xffefed21,0xfff39147,0x00113127,0x000391aa,0xfffe2e9a,0xfff60973,0xfff4cfc1,0xffeda38f, -0x00012cf9,0xffd21e39,0xffd6fcd5,0xfff211a4,0xffe11e5e,0xffe7aafc,0xffe3e235,0xfff1f33e,0xfff1430c,0xffe49096,0xfffc2f9f,0xfffe2988,0xffeae81f,0xfff73de0,0xfff4ad71,0x0002f2ee,0xfffae618,0xfff52166,0xffeafcca,0x002a7408,0x003731f2,0x00139d34,0xffee9ea8,0xfff7b7d2,0x002e6636, -0x00072087,0xffdc2b3a,0xffc5da17,0xffbb920f,0xffdda13c,0x001db8a3,0x001bdec2,0x00135ede,0x000595a5,0xfff9d510,0xffee2601,0xfff414eb,0xffd97f0e,0xfff2b7ab,0x00002441,0x0002bf8f,0x00085d02,0x00075b12,0x00036fc7,0x000235c2,0xfff9a54f,0xfffcd7f0,0xfffcf8fd,0xffd7836d,0xffe3ac02, -0x00503efe,0x0052e51d,0x008dbe97,0x00a91faa,0x00ae49d1,0x003350ca,0xfffe4795,0x0025c856,0xfff6036b,0xffe1de9e,0xffe2c9aa,0x001ebff9,0x007827ef,0x00c87d7d,0x007eb3ea,0x002c41f9,0xffe88d33,0xffac77f0,0xffa00b3c,0xffb3cd8d,0xffb6a6a2,0xffd93a13,0x0001d760,0x001ba8de,0x0009c93e, -0xffff042c,0x00000e63,0xfffc6f94,0xfffd7ad4,0xfffe15c6,0x0000b433,0x000115a1,0x00048350,0x001d21e1,0x0031e0fa,0x003f655b,0xffeb9456,0x0019f1de,0xfffd8f30,0xffd4290d,0xffb95e36,0xff73b349,0xff7a9e19,0xffeabcc3,0xfffe629b,0x0038b1cd,0x0076fe11,0xffe4aab2,0xff7ff419,0xff70f5d4, -0xffa81289,0xffebcc9a,0x0025c8f4,0x00288cf6,0x0011e125,0xffea9600,0xffe8faf6,0xfff392f9,0x0002d3ab,0xfff5a489,0xfffb8486,0xffffafb6,0x000055b2,0x00015ab6,0x000156d9,0x0000f02c,0xffff8978,0x000029c5,0xfffb3c0f,0xfffddfa3,0x0005ed43,0xffed4851,0x006df72b,0x00abe074,0x00483644, -0x00243985,0x0022b1c1,0x008f1456,0x009ddd19,0x0078f9f4,0x0025704c,0xffcdf0f4,0xff7cce77,0x001a46b6,0x007adf23,0x009aeeed,0x00384b7e,0xfffb9a9e,0xfff2cb3d,0xffea537d,0xfffdb2e7,0x001c0747,0x001a2812,0x000ead37,0x00012c86,0x0005eb43,0x0001d473,0x00007c5b,0xffffcd3a,0xffff5b0e, -0xffff3bfb,0xffff4f5c,0x000034da,0xffffa8ff,0x0002be22,0x0006b10f,0xffdcd5be,0x001713c9,0xff9219e9,0xff4d9614,0xff3c0cf9,0xff51852d,0xff41332f,0xff31bb64,0xff88a066,0x0042b9fd,0x00835b3f,0x0075be3b,0xffe7ab96,0xffe64bec,0xffc4402c,0xffbf3253,0xffbd7ad7,0xffd1a8ca,0xffe72344, -0xfffe436d,0x000f0f30,0x001f78f9,0x001f9619,0x000ce21c,0xfff6211d,0xfffbf5da,0xfffeb233,0xffffd002,0xffffdfd7,0x0000801f,0x0000a79f,0x0000ae2c,0x00009277,0xffff6388,0x00011904,0xffec02f2,0xff73b098,0xff829e73,0x00d9eb31,0x00b5c055,0x0027f5bb,0xffdb5987,0xffed45c2,0xffe18b2a, -0xffd64282,0xffc47191,0xffb12103,0xffb4f375,0xffc2ac2e,0xffcc2156,0xffe016db,0x00025cca,0x000e807c,0x00190bd5,0x0021ee70,0x002abae3,0x0036c5fa,0x00405853,0x0048c496,0x003b9007,0x001adc3e,0x0007d5d9,0xffff1566,0x000139e4,0x00000d39,0xffff8152,0xffff06a2,0xfffec368,0xfffe9704, -0x0000eb38,0xfffd315e,0x0020bbbe,0x004187da,0x00b411b5,0xfffff73c,0x0015ab00,0x00192f75,0x00137040,0x0004d404,0xfff304a1,0xffebf236,0xffe27dce,0xffecc3d0,0xffec59a8,0xffe60cf0,0xffe58651,0xffe07190,0xffd9877e,0xffdde9ea,0xffe24b61,0xffe3d173,0xffe8837f,0xffeee848,0xfff33062, -0xfff9b241,0x0005830a,0x000d5dfc,0x000510f7,0xffff999e,0xfffde45a,0xffffa153,0x00017d85,0x0001d9cd,0x0003817c,0x00034411,0x0001d3bf,0xfffc05a8,0xfff9bf53,0xfff3c086,0xfffd9814,0xffcb16e5,0xffc58545,0xffcb62bd,0xffcec563,0xffd3bf88,0xffde00ec,0xffe3d4a7,0xffe7185c,0xfff322a2, -0x0000e887,0x000f3218,0x001bf3dc,0x0027ee03,0x00338c73,0x002ab67e,0x0021c958,0x0019150c,0x0014c4ca,0x0010b7e3,0x000aa7c1,0x000e9444,0x0011fa7d,0x0014dc89,0x000d4766,0x00099869,0x0001aeee,0xffff87b3,0xfff8d76c,0xfffa458b,0xfff35e8a,0xffef4683,0xffe68a52,0xffdff1a0,0xffd7ffe9, -0xffd231fa,0xffcd75f8,0x000846e3,0xfffd7660,0x0001c75c,0x0005c893,0x0008d617,0x000d5ade,0x0012d5e9,0x0018569c,0x001c29be,0x001d663e,0x001dd0ba,0x001e2080,0x001e6b9e,0x0020f6ec,0x001fc2c3,0x0021347b,0x0021a646,0x002223eb,0x0022bf41,0x0021ba7e,0x00207386,0x00270269,0x002ae09b, -0x002e2504,0x00319640,0x0034895d,0x002e83b8,0x0028e0a0,0x00247026,0x001d50b4,0x00182127,0x0015a799,0x001251cd,0x001087a8,0x000eb8de,0x00083a0e,0x0017ae4e,0x0015025f,0x0018cec1,0x001a6be2,0x001c88ee,0x001d9231,0x001e48bb,0x001f40d1,0x001fe881,0x0021902f,0x002385a5,0x00258777, -0x0026fbc3,0x00281ca2,0x0027d881,0x00277476,0x00270c39,0x00266a02,0x0025bd0f,0x00263616,0x0023c1cd,0x0022791d,0x002027ad,0x0025ba7f,0x00248360,0x0026e53d,0x00246f36,0x00234a79,0x0020f8a2,0x00200cf3,0x001e10d8,0x001ad35c,0x001a3272,0x0019b9cf,0x0017ccc5,0x0017e766,0x0029db73, -0xfff5095b,0xfff90f97,0xfffae896,0xfffa5161,0xfffa8489,0xfff7b069,0xfffd6691,0xfffcae4a,0xfff88ae2,0xfff58d9d,0xfff59459,0xfffbc3b6,0xfff8dfa9,0xfff83f39,0xfff6904b,0xfff3af26,0xfff3c48e,0xfff981c1,0xfff707b1,0xfff68b34,0xfff3e932,0xfff5dea4,0xfff69457,0xfffc0762,0xfff004e3, -0xfff04e23,0xfffa436d,0xfff4268f,0xfff5062b,0xfff79aea,0xfff94238,0xfff93350,0xfff63b87,0xfff84231,0xfff6a29f,0xfff69439,0xfff7f729,0xfff8a317,0xfffca3f4,0xfffaa05f,0xfff9c815,0xfff2baba,0x00052911,0x00075b55,0xfffeb4c9,0xfff42086,0xfff44c50,0x0002b42e,0xfffae3e1,0xfff220fa, -0xffe8e8aa,0xffdefcc3,0xffe3d1be,0xfff94579,0xfff8d6f6,0xfff94d52,0xfff38e15,0xfff66c54,0xfff23d0c,0xfffd07bf,0xffe5a8f8,0xffe3d473,0xfff7fa76,0xffe07af2,0xffde8c14,0xffe6d8fb,0xfff4b2a5,0xfff97ef6,0xfff3c2bd,0xfff822a1,0xfff5c51f,0xffef1568,0xfff3fe2b,0xfffe8e38,0x000df139, -0x00085e38,0x000de71e,0xfffdf9e3,0x001e48c4,0x001e10aa,0x000e5f26,0xfff65133,0xfff11d53,0x000d20cd,0x0005ee4a,0x000290d1,0xfff3fd00,0xffe1b9a8,0xffe2dc7c,0x0004f44e,0xfffacc22,0xfff8180a,0xffedacfa,0xffeff66a,0xffeb39c0,0xfffeffe8,0xffd32f2a,0xffda2642,0xfff8eb7a,0xffe77e68, -0xfff14d8f,0xfff2d0bf,0xfff8fea7,0xfff73b00,0xfff2565d,0xfffaf828,0xfff9cec4,0xffeb4447,0xfff47f88,0xfff57320,0x00018340,0xfffcb476,0xfff2dd4e,0xffde560f,0x001f9016,0x00330f9d,0x001fee01,0xfff5fbf3,0xfff53436,0x00161959,0x000b62c7,0xffe51f75,0xffbf2192,0xffa021fc,0xffbaef65, -0x0002ee91,0x0008ef65,0x0005872c,0xfff65a70,0xfff0b381,0xffea8827,0xfff570e3,0xffe28476,0xfffc6274,0x00038191,0x0004d79d,0x0006e8fe,0x0004c12a,0x00029421,0x0002b75d,0x00005890,0xffff1e4b,0xfffcff01,0xffe19c30,0xffe8232b,0x003ebe0b,0x0040969c,0x007ec0c5,0x009e4d8c,0x00b23681, -0x00428533,0x0010e5cf,0x0030dff5,0xffff0f04,0xffec44a9,0xfff3d267,0x00221a29,0x0076c0ff,0x00c589d0,0x009624f1,0x004b1392,0xfffe080c,0xffbe278b,0xffae13f8,0xffbea8ae,0xffc4d88f,0xffe99619,0x000e176c,0x000ffe91,0x00036e6b,0xfffe6f5b,0xfffe4241,0xfffcf3a4,0xfffdbd28,0xfffedae2, -0xfffedeba,0x0000707c,0xffff23bf,0x000c6dc8,0x001d7905,0x002b2f43,0xfff2ce5e,0x00233cb1,0x0014c438,0xfff02b1f,0xffd3313d,0xff89240d,0xff7fc0b6,0xffd8339d,0xfff1fa9d,0x0030c718,0x0077d089,0xfff78d47,0xff927497,0xff6ec06d,0xff9e6f35,0xffdfcbcd,0x0017b555,0x001d0af0,0x000a3b5f, -0xffe59cb4,0xffec92fb,0xfff8349c,0xffff7641,0xfff81037,0xfffe7c0f,0x000091b6,0x0000f6d9,0x00018089,0x00011c2e,0x00010053,0xfffff3ef,0x00017145,0xfffd767c,0xfffed919,0x0003d327,0xfff756d9,0x007f3340,0x00b324b0,0x00676261,0x002bb058,0xfffb503c,0x0089d450,0x00ab46cc,0x007ce881, -0x004674e5,0xffe3c639,0xff701937,0xfffa810a,0x0061bcc8,0x00a5121b,0x004ada23,0x000e6534,0xfffd5c11,0xfff6e542,0x00063a5b,0x0020c58b,0x0018c3fb,0x000c4fdf,0x00031cce,0x00039041,0x0000e556,0xffffb06c,0xffff5e38,0xffff2087,0xffff1301,0xffff6f47,0xffff3529,0x00002765,0xfffe4c97, -0x000bde6b,0xffe1761f,0x001c4153,0xff90ba43,0xfee2b5fc,0xff3d4138,0xff7a8643,0xff602fde,0xff48b19f,0xff7ab83c,0xfffff423,0x007f93c3,0x008e0d30,0x00017aea,0xfff2ecfa,0xffc46d91,0xffbbca17,0xffb7f17e,0xffcaff6f,0xffdd583c,0xfff10693,0xfffd932a,0x000d8416,0x00107b86,0x0000157d, -0xfff464fe,0xffff2a5a,0xffff910b,0x0000582d,0x00008a4a,0x00010023,0x0000df34,0x00013667,0x00009882,0x000152f9,0xffffa593,0xfffcafc0,0xffa319ff,0xffb9ba9d,0x00c16778,0x00ae0f7f,0x0019d35d,0xffc72330,0xffd95620,0xffd47a28,0xffd90a6e,0xffd4b83d,0xffbc6360,0xffba30ff,0xffc67a6e, -0xffd1dd42,0xffe5f6a2,0x00034adb,0x000ead7f,0x0018d51f,0x00242c87,0x002e5c0e,0x003a20c7,0x004212b4,0x0045faa7,0x0030975a,0x0010d31e,0x0001ce76,0xfffed4a8,0x00003260,0xfffeba4b,0xfffeac5e,0xfffe1eb8,0xfffe729b,0xfffd193d,0x000061b1,0xfff9a7bd,0x001631d6,0x0036c95f,0x008e08b5, -0x00107841,0x00260a89,0x00252d23,0x0024f231,0x00179d9e,0x0003c420,0xfff4354e,0xffe3cd07,0xffe50c7f,0xffe2f9b0,0xffde1839,0xffdd6e2d,0xffd787d8,0xffce5cf2,0xffd6026b,0xffde8b5d,0xffe576d6,0xffec1fc6,0xfff414cc,0xfff9031c,0x0001f6ac,0x000ba2e8,0x000debf7,0x000421b7,0xffffcc97, -0x0001117e,0x000226a0,0x00035f53,0x000359d2,0x00046fe2,0x0004c6cf,0x0004fff5,0x000211b4,0x00047626,0x0000636c,0x000cf3e8,0xffcfcf32,0xffcdff53,0xffd4fefa,0xffd67603,0xffdb7140,0xffe27602,0xffe6920a,0xffe7b25e,0xfff1a8a8,0xfffbefed,0x0006f17f,0x00147a52,0x0021b998,0x002ee831, -0x0028246c,0x0020a1e5,0x0019802d,0x0016ef3b,0x001552f4,0x0011687f,0x000f3a4f,0x000ef25f,0x000dedb6,0x0006132e,0x00017047,0xfffaaf63,0xfff9a5f3,0xfff61d0b,0xfff7ec8d,0xfff3b36a,0xfff06eda,0xffea9dc3,0xffe3086f,0xffd9f466,0xffd404f2,0xffd19036,0xfff9b750,0xffeec113,0xfff4fce5, -0xfffb85f5,0x0000ef1f,0x00066450,0x000d2321,0x00140ebb,0x0019c2ce,0x001da320,0x00206544,0x00228ebb,0x002444e9,0x0028aa63,0x0026eaac,0x00283b10,0x00286daf,0x0028a304,0x00288cbd,0x002815ba,0x00263b48,0x00294b74,0x0029c549,0x0029adcd,0x0029a62f,0x0027d7dc,0x00215eab,0x001afe38, -0x0015d093,0x000f25ab,0x0009e318,0x0007d30f,0x0004c506,0x00040f47,0x0001979d,0xfffa5b0e,0x00180373,0x00133bd3,0x0017d326,0x00198390,0x001bbe42,0x001dab45,0x001f11a8,0x00206f11,0x0021c579,0x0023e08f,0x00266bf6,0x002913ca,0x002b4cc2,0x002d8043,0x002cc1c4,0x002c3168,0x002b9240, -0x002ad0ff,0x002a0445,0x0029e217,0x0028b8d8,0x00279d57,0x0026a929,0x002813aa,0x0027c2ed,0x002af61d,0x0028ff41,0x0027ac14,0x00257a09,0x0023fbeb,0x0021b758,0x001e043e,0x001b9bbd,0x00195dee,0x0019e9e4,0x0018d90d,0x002d50ec,0xfff2296d,0xfff64ae4,0xfff8ae85,0xfff89e78,0xfff8bd7e, -0xfff4eca4,0xfffa9f8a,0xfffa34f8,0xfff7d1b4,0xfff38deb,0xfff2daa5,0xfff5daa8,0xfff68dbf,0xfff6277c,0xfff3682d,0xffef9ee4,0xffef61c8,0xfff5036b,0xfff3a814,0xfff37401,0xfff0b3ba,0xfff26616,0xfff30c26,0xfff88293,0xffed553a,0xffede637,0xfff8de76,0xfff1ab73,0xfff20559,0xfff5e600, -0xfff6f3d1,0xfff761d4,0xfff66dad,0xfff53a6c,0xfff387a5,0xfff3a609,0xfff4e12b,0xfff6862b,0xfffb1639,0xfffae3aa,0xfff92f88,0xffef607a,0x000093b1,0x00036ec5,0xffffa62f,0xfff23137,0xfff01ac8,0xfff74013,0xfff99b29,0xfff22b21,0xffe4a426,0xffd6f571,0xffd9aea8,0xffef0593,0xfff19e76, -0xfff3d320,0xffedc3ec,0xfff1ec82,0xffef55e9,0xfffa5d08,0xffe490e3,0xffe24ceb,0xfff632fe,0xffdd32e0,0xffdcdda6,0xffea303a,0xfff41ca7,0xfff8b078,0xfff82836,0xfff60ac3,0xfff30b07,0xffef4070,0xfff2e94b,0xfffe2135,0x000c2848,0x000b17c2,0x000ef0bc,0xfffa56d4,0x00193fc6,0x001a00e3, -0x0014594b,0xfff64327,0xffedd2f3,0xfff911ae,0x00054507,0x0002e755,0xffeed24d,0xffd61913,0xffd4b1eb,0xfff78208,0xfff25660,0xfff27b22,0xffe5fc40,0xffeb713a,0xffe9796e,0xfffbc6e1,0xffd6b95d,0xffe0c324,0xfffda527,0xfff18d91,0xfffa2c83,0xfffb2ca4,0xfffe1c6f,0xfffbf922,0xfffc8b99, -0xfffac886,0xfff6dbc3,0xffed842d,0xfff4d22a,0xfff86131,0x00039127,0x00039f4c,0xfff6abfe,0xffd952ae,0x0013f3da,0x002a07bb,0x00275642,0xfff6b387,0xffeb3b4e,0xfff65110,0x000ad5a4,0xffed1b97,0xffb9c688,0xff8b366e,0xff9d4a80,0xffe63a48,0xfff5eb95,0xfff86530,0xffe89f61,0xffe9d585, -0xffe93053,0xfff61f9a,0xffedde65,0x0003ea1f,0x000330bf,0x000451fd,0x00049835,0x0002574f,0x00019bc9,0x00013335,0x000121cc,0x0000d4e4,0xfffdada9,0xffeb1c9c,0xffedfa57,0x0036eca2,0x0037b796,0x0072287d,0x0094f6ca,0x00b63ec4,0x0050377d,0x00209b92,0x0036b8a1,0x000660ec,0xfff52ffa, -0xfffe1adc,0x001d94c5,0x006a35cb,0x00b659e9,0x00a6b047,0x0067a9b0,0x00119bae,0xffd0f035,0xffbc2247,0xffc6aef8,0xffd0e1d5,0xfff5f246,0x00116877,0x00063842,0x0000f252,0xfffda1ce,0xfffe56b4,0xfffd9b2d,0xfffec867,0xffff2110,0xffff605a,0xffff7ae5,0xffff5353,0x00038990,0x000fb530, -0x001ed95f,0x0005db5a,0x002e469c,0x001fcf4c,0x0002c243,0xffe11fbe,0xff9aac63,0xff894040,0xffceda3b,0xfff04412,0x002ea068,0x00726ef2,0x00092648,0xffa7d2a2,0xff70fd4c,0xff939d30,0xffce9502,0x00045177,0x000f3d9b,0x00039ff0,0xffe613f8,0xfff42573,0xfffcc93c,0xfffd0982,0xfffbca35, -0xffffde1c,0x0000e598,0x00011664,0x000130ac,0x0000bc9c,0x0000b1a6,0x00002ee7,0x0000ee15,0xffffafdd,0xfffdc773,0x0003dde8,0x00046077,0x008c8c14,0x00acb02c,0x00600d84,0x0016ab3d,0xffc9b1e7,0x007530f8,0x00ac7763,0x007ccecd,0x0065ddf5,0xfffea58f,0xff72e7fa,0xffe3865f,0x004a067d, -0x00a6499c,0x006123bf,0x00294d09,0x000b8c3f,0x0004ac3d,0x000c7446,0x001e7ff1,0x0011de23,0x0006f393,0x00034da5,0x0001a648,0xffffe597,0xffff7b62,0xffff28c3,0xffff4188,0xffff30fc,0xffffad45,0xfffee177,0x0000d02a,0xfffc1a2d,0x000a7faf,0xffecafe3,0x00190038,0xff8ab13d,0xfe8a6e8c, -0xff413524,0xffa1eb69,0xff8520cd,0xff6a13b5,0xff754cbe,0xffbbc8e0,0x006b626d,0x00970db6,0x0022127c,0xfffda179,0xffc4db65,0xffbdf6ba,0xffb712ac,0xffc6f09a,0xffd571a9,0xffe60d91,0xffee8b3d,0xfffb1f99,0x0000125a,0xfff61609,0xfff7805e,0x00013343,0xffffaacc,0x0000e5be,0x0000c634, -0x000113e4,0x0000c1cf,0x00013d15,0x000064c9,0x00020954,0xffff127c,0x0003f9bb,0xffd176fb,0xffdf5222,0x0087b037,0x007f0bd8,0x00003f7a,0xffb51099,0xffc06402,0xffc470e3,0xffd83562,0xffe287eb,0xffc7764e,0xffbd65d7,0xffc4ac0d,0xffd19862,0xffe63f43,0xffff1837,0x000b89bd,0x0017f7fa, -0x002875d4,0x00329f3e,0x003c8bc5,0x00404c81,0x003c9a66,0x00243a29,0x0007e32b,0xfffef3b6,0xffff32e8,0xfffefa86,0xfffe6707,0xfffe655f,0xfffe345c,0xfffe784d,0xfffd65c7,0xffff8334,0xfffa286f,0x0006ad2a,0x002a7ae0,0x0055b6d5,0x001e1701,0x002edf68,0x002b14af,0x002eada6,0x00208907, -0x000db61e,0xfff8cdf9,0xffe5693f,0xffdd152d,0xffda4810,0xffd6fe72,0xffd709fe,0xffd19c66,0xffc80a39,0xffd41e4e,0xffdfa993,0xffe9ba4f,0xfff1e08a,0xfffb0bc8,0x00019aa1,0x000a188b,0x00103dca,0x000c8ba2,0x0003048c,0x000103d6,0x0002cca9,0x0002edad,0x0003a4b2,0x000338aa,0x0003f3c5, -0x00040210,0x000523ed,0x000494ea,0x0009acd2,0x0009f826,0x0015ed49,0xffd57e89,0xffd593d0,0xffdbe2b7,0xffdb577d,0xffdf9128,0xffe491f7,0xffe789ff,0xffe756ee,0xffeeb2ec,0xfff4bd07,0xfffb69ee,0x0007da74,0x00149565,0x002173f8,0x001d71cf,0x00189ba5,0x001403ba,0x00141f94,0x00141801, -0x0014d18d,0x000fa21e,0x000b1d51,0x000782f3,0x00003f91,0xfffbe1e3,0xfff7f415,0xfff8d4b3,0xfff7774c,0xfff92393,0xfff7a520,0xfff59f1e,0xfff15b4c,0xffe92942,0xffdf902a,0xffd85c94,0xffd79666,0xffecb0f1,0xffe26cec,0xffe9e6d6,0xfff1bb54,0xfff8517f,0xfffda7b5,0x0004832f,0x000bc6b2, -0x00128ed4,0x00187f27,0x001d3fb4,0x0020f942,0x0023fc4f,0x002a05f0,0x0028124c,0x00291802,0x0028fec2,0x00292382,0x0028809d,0x0028a50f,0x002868c0,0x0025bb6e,0x00232233,0x00206283,0x001dedb7,0x0017d442,0x001156c3,0x000b22b1,0x00066c58,0x00000818,0xfffb067d,0xfff9a1fb,0xfff6f87d, -0xfff71129,0xfff462dd,0xffed3988,0x00134176,0x000d9127,0x00124968,0x0013b5ed,0x0015ce4a,0x00182ebc,0x0019eb19,0x001b4d9d,0x001d07d7,0x001f33be,0x0021e342,0x0024c799,0x00275d15,0x002a246e,0x00294104,0x0028d71d,0x002851d8,0x0027a7de,0x0027281a,0x00263180,0x00270b87,0x0026eb83, -0x0028e625,0x00236fd7,0x0024d32f,0x00299cc2,0x00280e81,0x00265da1,0x00241381,0x0022585c,0x002004e2,0x001c2feb,0x0017c38b,0x00139978,0x00184a46,0x00150f52,0x00290b45,0xfff0d24a,0xfff51b03,0xfff6865e,0xfff73ee1,0xfff7263e,0xfff29d59,0xfff89541,0xfff8f42e,0xfff90c4d,0xfff3bd0b, -0xfff265fb,0xfff2210c,0xfff602bc,0xfff5c258,0xfff2195c,0xffedcac7,0xffed29db,0xfff1f106,0xfff1b901,0xfff1b93d,0xffef28b9,0xfff10550,0xfff1725d,0xfff5b790,0xffed4d55,0xffee012b,0xfff770f7,0xffef6667,0xffef4186,0xfff471f2,0xfff50544,0xfff5fe24,0xfff70bc1,0xfff40c0f,0xfff24b92, -0xfff253fc,0xfff3be67,0xfff66706,0xfff88abc,0xfff96059,0xfff742be,0xffebb469,0xfffc599d,0x00011972,0x0003c5e7,0xfff46dbb,0xfff02014,0xffef6002,0xfffa5d66,0xfff47b34,0xffe3ed7f,0xffd41941,0xffd465ab,0xffe732d0,0xffec6ead,0xfff00717,0xffea772c,0xffef3665,0xffee738f,0xfff8a72c, -0xffe4bca2,0xffe1c051,0xfff4ce7f,0xffdf6bf2,0xffe0be85,0xffef0dc4,0xfff6079b,0xfff9a90d,0xfffce8eb,0xfff4ea71,0xfff1507d,0xfff0c1f2,0xfff269ea,0xfffda0c9,0x000735ff,0x0007c7e9,0x000a900f,0xfff3109a,0x001227c0,0x0016a552,0x001e48e2,0xfffc1819,0xfff0e515,0xffeb0d78,0x00076e76, -0x0005c6e3,0xffedba84,0xffd14487,0xffcd0b0e,0xffec3951,0xffebedae,0xffee9afa,0xffe1561f,0xffe8f944,0xffe962f0,0xfff887ad,0xffde2aeb,0xffeb1e62,0x0001f3ff,0xfff9f178,0x0001f336,0x00007b8b,0x0000cbaa,0xfffe7c0a,0x0001f3a1,0xfffc15ce,0xfff591b1,0xfff007d0,0xfff4a531,0xfff99c1e, -0x00000ef4,0x000193d0,0xfff3f739,0xffd1087e,0x0006ffda,0x0023017b,0x0034eda6,0x000071ea,0xffea23aa,0xffddd8d6,0x000b990a,0xfff7915b,0xffbc32e1,0xff842ac5,0xff8c1f77,0xffce18cd,0xffe6131b,0xffee40c7,0xffdf0659,0xffe51066,0xffe9e0ca,0xfff798e7,0xfff8f203,0x0007527d,0x0000b9bc, -0x00027741,0x0000bf6a,0xffffb026,0x00004e4c,0x00006dab,0xffffa05c,0x000163fc,0xffffdd40,0xfff2455a,0xfff1b4d8,0x002a0953,0x0026a935,0x00547a99,0x00769c13,0x00a63d17,0x005410b8,0x002cb4ce,0x003b8201,0x0013cd30,0x00080d39,0x001356bd,0x00221497,0x00603ab3,0x00a28bed,0x00af39bc, -0x007dc91a,0x0022c0e5,0xffe3dc34,0xffcaf6f8,0xffcef4ca,0xffdc5600,0x00002a61,0x000ebb4e,0x00003e77,0xffff33bb,0xfffe4ffb,0xffff59a0,0xffff4093,0x0000261f,0xffffbd8c,0xffffe7e7,0xffffd3cd,0xffff9769,0x00000b02,0x00057c9c,0x001384a8,0x000cb88b,0x0029643c,0x0025ce73,0x00157cea, -0xfff933fe,0xffb5172b,0xff9b43ca,0xffc74026,0xfff20772,0x002fe85b,0x006f8dc6,0x0022067b,0xffcb5c6e,0xff8796a4,0xff974ef8,0xffc4f284,0xfff50c00,0x0005053b,0x0001d35c,0xffed07c0,0xfffc014b,0x00001a16,0xfffb9ed0,0xfffe6d1f,0x00010b06,0x0000a892,0x0000952b,0x00005c7a,0x00001068, -0x00003481,0x00001d57,0x000042c8,0x0000d09f,0xfffe6290,0x000192df,0x000ad9b9,0x0081bc36,0x009ef64c,0x0063d075,0x00135e38,0xffba6bb2,0x0060f2ab,0x00a0f9e7,0x006f193b,0x007103de,0x000f3516,0xff7db739,0xffd191a2,0x0031319d,0x009abe61,0x00742535,0x004764e5,0x001f2589,0x0017117a, -0x0016578a,0x001c22cc,0x000a6923,0x0002b75a,0x0002d08a,0x00004e6b,0xffff858e,0xffff6cfe,0xffff7f89,0xffffb23f,0xffffb896,0xfffff226,0xffff3f7f,0x0000ba10,0xfffcbcfb,0x00068959,0xfff3d974,0x00120124,0xff861836,0xfe7a5998,0xff6782a8,0xffd51e1c,0xffb5480b,0xff9a2974,0xff832adf, -0xff891a15,0x00473ada,0x00880ed0,0x003a7f23,0x0002c4b8,0xffc53879,0xffc06995,0xffb6901e,0xffc2f4be,0xffcf7998,0xffdccad3,0xffe22956,0xffece6e1,0xfff360a7,0xfff24ffd,0xfffce67c,0x00012256,0x00005be8,0x0000d84e,0x0000a655,0x00008cfb,0x000057e2,0x00008ca8,0x00007699,0x0001089e, -0x000079f6,0x0002bd77,0xfff0c476,0xfff43a87,0x0043ceba,0x0041e506,0xffefc7c0,0xffb76425,0xffb75225,0xffc177da,0xffdb27a4,0xffec1d9d,0xffcf8470,0xffbf4999,0xffc35dcb,0xffd025bb,0xffe414fe,0xfff78803,0x0004550f,0x0012d61f,0x00271759,0x0032dbcf,0x003b9ee0,0x003dd49e,0x00338458, -0x00198f29,0x00019a9d,0xfffde99b,0xffff41e3,0xfffe859f,0xfffec27a,0xfffeffb6,0xffff38ed,0xffff165f,0xfffead83,0xfffe6301,0xfffe9e65,0xfff9d200,0x001bc907,0x00265ef1,0x00268247,0x0039986f,0x0033898f,0x003746bd,0x0027ae89,0x00141852,0xfffb88b9,0xffe88f72,0xffd91a1e,0xffd4a5e1, -0xffd11db6,0xffd2b977,0xffceb9a5,0xffc55b04,0xffd4a5d3,0xffe136d3,0xffeb6c8a,0xfff674f1,0x000115a2,0x0009f796,0x00117a19,0x0012888d,0x000a46c0,0x00027759,0x00022eec,0x00031e9f,0x00028c08,0x00021658,0x000179d7,0x0001de17,0x0002b993,0x00038655,0x00040cf8,0x00089eaf,0x000f6640, -0x001a5147,0xffdde7db,0xffdf3492,0xffe456c1,0xffe22b14,0xffe55b40,0xffe8af0e,0xffea9d35,0xffe911c2,0xffee0d21,0xfff0a971,0xfff39dba,0xfffbd970,0x0004df79,0x000de3da,0x000d202e,0x000b65d8,0x0009cf40,0x000b81e2,0x000c793b,0x000ff645,0x00092bf1,0x00031cb5,0xffff691a,0xfffa7821, -0xfff82abd,0xfff8ea7e,0xfffa4237,0xfffc0544,0xfffd6835,0xfffce1e1,0xfffa9261,0xfff8b30d,0xfff0a1bd,0xffe853e9,0xffdfc860,0xffe06ff5,0xffe364fe,0xffde288d,0xffe5dba5,0xffeda542,0xfff44c19,0xfff8c4ab,0xfffedc83,0x0005a573,0x000c03d3,0x0012359e,0x001797c9,0x001ba29e,0x001f12d7, -0x0024f732,0x0023a9fa,0x0024a1f2,0x0024e1f0,0x00256e3e,0x00254109,0x00264936,0x00252c91,0x001f6ccb,0x001ab110,0x00161b53,0x0011a7fa,0x0009fed3,0x00048209,0xffff51f0,0xfffaece9,0xfff64c5d,0xfff1fdac,0xffefeae6,0xffedb872,0xffed8a29,0xffeb5b74,0xffe63f18,0x000d2c1c,0x0008575e, -0x000bec8e,0x000d28a7,0x000eef12,0x001169a2,0x001336b9,0x00148023,0x00162007,0x0017ffc9,0x001a4df7,0x001d00cd,0x001f85c2,0x0022505c,0x0021b1f4,0x002194d8,0x00214cfc,0x0020eb52,0x0020ae5d,0x001fcd5d,0x0020eb1f,0x00210b57,0x00239f80,0x001c1fa5,0x001ddd85,0x0021d614,0x002044ae, -0x001e2cad,0x001c0131,0x0019e3b1,0x0017c71c,0x00148b36,0x0010ce11,0x000d0b00,0x0011907e,0x000e7a32,0x0021071c,0xfff08f96,0xfff390b0,0xfff56944,0xfff6890b,0xfff6776e,0xfff1b42f,0xfff75f72,0xfff84675,0xfffa74be,0xfff448e1,0xfff26d74,0xffef7d74,0xfff5f774,0xfff60b78,0xfff20406, -0xffedcaab,0xffecda5c,0xfff02edb,0xfff11393,0xfff14124,0xffef5be1,0xfff02d2a,0xfff02768,0xfff39bb6,0xffee1ba9,0xffee7249,0xfff5e366,0xffedc82f,0xffedb56b,0xfff39494,0xfff3ee4a,0xfff5154d,0xfff7d2ce,0xfff2d402,0xfff176d4,0xfff128e3,0xfff21f3a,0xfff40dfc,0xfff6185e,0xfff89eb6, -0xfff648de,0xffea6f9a,0xfff954e3,0xffff1c68,0x0006b42b,0xfff5e3c7,0xffefcddf,0xffe8b8ea,0xfffa9f19,0xfff6f3a6,0xffe55b91,0xffd59d39,0xffd3c193,0xffe20e90,0xffe96e6a,0xffee3d10,0xffe9abe6,0xffedf80a,0xffef57c0,0xfff7467c,0xffe5cff3,0xffe321e1,0xfff4b55b,0xffe51de7,0xffe77d5b, -0xfff3ef0c,0xfff83a67,0xfffb6dea,0x0000d0b8,0xfff4eb4f,0xfff03184,0xfff1ad01,0xfff21e6f,0xfffac298,0x0000e053,0x0006252c,0x000743c8,0xffef9883,0x000c1ab9,0x00123886,0x00244891,0xffff2b63,0xfff28ee2,0xffdf763c,0x0007f3ee,0x00084ae8,0xffeef6c8,0xffd2e265,0xffcc50cb,0xffe40e3c, -0xffe88b5a,0xffed6c7b,0xffe0cccb,0xffe929cf,0xffeb2c35,0xfff648d7,0xffe84b7d,0xfff648f6,0x00039720,0x00013ef1,0x0004b963,0x00023996,0x0001f858,0xffff97ba,0x0002a267,0xfffd8537,0xfff584ba,0xfff10d8b,0xfff45935,0xfff6c7cc,0xfffa57e0,0x000185c5,0xfff33a3f,0xffceceb6,0xfffc92f1, -0x001b4368,0x003be9ad,0x00050405,0xffe70a1e,0xffc94bcb,0x00099bc9,0x000057b7,0xffc331cd,0xff89c34a,0xff885ee6,0xffbc67bc,0xffdac193,0xffe83adc,0xffdb8341,0xffe426f8,0xffed47d7,0xfffa4a49,0x000094e7,0x00061a63,0xffff0627,0xffffdcb6,0xfffeeac1,0xffff2e07,0xffff989c,0xffffebc1, -0xffff46a1,0x00015d95,0x00021ff1,0xfff71754,0xfff40f62,0x001f9aef,0x002181de,0x00422ff6,0x0061163b,0x009c6e16,0x005956db,0x0035ef97,0x003774a7,0x001f1f97,0x0019b618,0x0023bd70,0x00287a10,0x00578f2b,0x008ead70,0x00afb901,0x008befd7,0x0032d478,0xfff8b301,0xffdcf0e2,0xffd9de4e, -0xffe80091,0x0006daec,0x0007954a,0xfffea727,0xfffe3d2f,0xffff9b5e,0x000050f1,0x0000392b,0x00006a15,0x00001b61,0x00001149,0x00003d7c,0xfffef76e,0x00009f64,0x0000a022,0x000bba10,0x00127883,0x0028950f,0x002f3bd6,0x002918b0,0x000e5db4,0xffcdab82,0xffafb23e,0xffc675e6,0xfff14b12, -0x0026206e,0x005724f1,0x0028c137,0xffe1d69a,0xff99b794,0xff97905a,0xffb715f9,0xffe2dd73,0xfff8e5d3,0xffff27af,0xfff64670,0x0004333b,0x000146b1,0xfffbefa8,0x0000a9b3,0x0000e08d,0x00004aaf,0xffffece3,0xffffeba7,0xffffd127,0x000002c5,0xffffdba7,0x000031eb,0x00004395,0x00003049, -0xfffef013,0x000bcdba,0x00769de5,0x00916600,0x00525003,0x00017532,0xffa49888,0x003f0605,0x00856174,0x005eccdb,0x006de9e0,0x00161107,0xff89b68e,0xffbe49ea,0x000f1f9e,0x00784a5e,0x00731e99,0x0056d15e,0x002a5b71,0x00223c6f,0x0019e322,0x00164ffd,0x00042493,0xfffff767,0x0002ac08, -0xffff0ffa,0xffff9098,0xffff9e19,0xfffff549,0x00000011,0xffffff35,0x00001b49,0xffffbe06,0x00006e11,0xfffe27cc,0x0002bd27,0xfff9d057,0x000c3c07,0xff8be4f2,0xfe916c04,0xff83a8df,0xfff2a7bb,0xffd85e33,0xffc632a2,0xff9c0cd6,0xff7493b6,0x0022ffbb,0x0070600e,0x00546175,0x000b62c1, -0xffcb125f,0xffc3ec93,0xffb7f454,0xffbf89ca,0xffc842d4,0xffd37cae,0xffd6f28d,0xffdf9297,0xffeae4b0,0xfff34ba7,0x00014eb8,0x00005d29,0x0000c52f,0x00007422,0x00003d12,0x00001889,0x0000117b,0xfffffeac,0x000026a3,0x00003966,0x0000f093,0x0000fb98,0xfffec215,0xffff7d29,0x0002379a, -0xfff8b2eb,0xffe65337,0xffc8d396,0xffb9b437,0xffc9beee,0xffe3be21,0xfff6334e,0xffde2379,0xffcb149d,0xffcb71d1,0xffd5dd02,0xffe7ad02,0xfff43738,0x00005822,0x000ee654,0x00236bfa,0x002de07f,0x00346baf,0x00355e31,0x00284f54,0x000f3fac,0xfffd7dde,0xfffec03e,0xfffedd9c,0xfffefc74, -0xffff9ae5,0xffffa830,0xfffff5cd,0xffffc119,0x000038b6,0xfffe653f,0x00009c73,0xfff83be3,0x000d8743,0x00019ab0,0x002c883f,0x003c053a,0x0034e9fa,0x003756d0,0x00271981,0x0015a289,0xfffcfc54,0xffed3127,0xffd9e1f5,0xffd4fc89,0xffd1c95a,0xffd45b76,0xffd2756d,0xffcbdd50,0xffdcff2b, -0xffe8e783,0xfff0e0f3,0xfffc3ba8,0x000705ff,0x0010d29b,0x0015252b,0x0012494e,0x000685c0,0x00022fab,0x0002de50,0x0001c212,0x0000d9e8,0x000087df,0x00002eb6,0xffffe828,0x000061d3,0x0000e324,0x0003ddab,0x0003f26c,0x000f502b,0x001b3f8b,0xffe66e0f,0xffe867a9,0xffec2522,0xffe9cfee, -0xffec024b,0xffee100a,0xffef85b2,0xffedd474,0xfff09605,0xfff0883c,0xfff088ca,0xfff48461,0xfff99641,0xfffe538f,0xffffaa16,0x00003a65,0x00010d99,0x0003de9b,0x0005a55c,0x000a4a9e,0x0002a310,0xfffd71a1,0xfffb46c5,0xfff8502e,0xfff8c782,0xfffd14de,0xfffeabf0,0xffffb360,0x00009bc0, -0x00016ff6,0x000047ec,0xffff7800,0xfff80f4c,0xfff18b88,0xffe9a414,0xffe95977,0xffe1f2da,0xffdfdfcc,0xffe6b4d6,0xffed62e7,0xfff33cb8,0xfff6a561,0xfffb6292,0x0000e9e3,0x00063ae0,0x000bd483,0x0010f7a0,0x0014cd03,0x0018299e,0x001d4900,0x001d21d1,0x001e5d8c,0x001f3147,0x00202190, -0x002084be,0x00228044,0x00208fc3,0x001878d1,0x001249a0,0x000cccf1,0x000711c3,0xffff6be9,0xfffb7d30,0xfff84fa4,0xfff50cff,0xfff1971d,0xffee438f,0xffec054a,0xffea2676,0xffe99be1,0xffe7cbea,0xffe52652,0x0006ae5e,0x00031f81,0x0005afac,0x0006a864,0x00080990,0x000a44ae,0x000bef13, -0x000d0cdc,0x000e6e83,0x000fe8d8,0x0011b717,0x0013f989,0x00162e58,0x0018a0b9,0x00185892,0x00187d95,0x00187b33,0x00187cab,0x00188ac6,0x0017fec0,0x0019261a,0x00197dea,0x001c5bd0,0x0013b832,0x001597a2,0x0018add0,0x00170b5a,0x0014aae6,0x00129c31,0x0010927e,0x000eb8db,0x000c3f45, -0x00095ecf,0x00063acb,0x000ade29,0x0007c724,0x0016e89d,0xfff1c5a7,0xfff4bdeb,0xfff587dc,0xfff740ea,0xfff74909,0xfff2f10b,0xfff7898c,0xfff8a4f2,0xfffc5a81,0xfff5ad86,0xfff3675b,0xffee95a2,0xfff66e59,0xfff6d1df,0xfff2f584,0xffef5249,0xffee37b2,0xffefdc76,0xfff1aeac,0xfff21456, -0xfff0cbe7,0xfff1e607,0xfff18e1f,0xfff3a32d,0xfff124b2,0xfff07b53,0xfff4df89,0xffed9306,0xffed8538,0xfff3d036,0xfff46997,0xfff5fca3,0xfff9e01a,0xfff410b9,0xfff3325b,0xfff20f87,0xfff3428e,0xfff4d294,0xfff6247a,0xfff9d271,0xfff80142,0xffed521a,0xfff8c6ea,0xfffe8917,0x0009547b, -0xfff7db02,0xfff0821d,0xffe5071d,0xfffa5b38,0xfff8b64d,0xffe7ff31,0xffda2afd,0xffd6b84d,0xffdf79f1,0xffe831a9,0xffeda81f,0xffeaff1f,0xffefc39f,0xfff21892,0xfff691dd,0xffe7c355,0xffe7c6c0,0xfff7a742,0xffeec306,0xfff1c22e,0xfff9f564,0xfffbd06d,0xfffd7d01,0x0003bc58,0xfff680a7, -0xfff09d78,0xfff404c6,0xfff3df69,0xfffb6452,0xfffd802c,0x00062a17,0x0006d9ba,0xfff232aa,0x0008268b,0x000e257c,0x0027377c,0x00010e6e,0xfff380d6,0xffd77d2d,0x0004d7eb,0x00074226,0xffefa13d,0xffd77a3c,0xffcfb7e8,0xffde208a,0xffe6a056,0xffece6ed,0xffe34252,0xffec6eae,0xffee7d86, -0xfff5eb9a,0xfff4bf3c,0xffff99bb,0x00037aca,0x0002905c,0x0004a577,0x0001c017,0x0001a3b4,0xffffd7b3,0x00016db1,0x00002796,0xfff9a0a0,0xfff3beed,0xfff66936,0xfff84f56,0xfff8bf7b,0x000403d1,0xfff8cc3f,0xffd83043,0xfff8df7a,0x0015e470,0x003f26b7,0x0007d839,0xffe55a14,0xffbc9c31, -0x00043498,0x0003ee67,0xffcb1b41,0xff977eb7,0xff8ecc64,0xffb0cd38,0xffd245e1,0xffe3577c,0xffdb7a38,0xffe70e71,0xfff243d2,0xfffdf0c7,0x0003b32a,0x00018c7f,0xfffe7b09,0xffff2673,0xfffe43ce,0xfffefd39,0xffff7d87,0xfffff3c8,0xffff4c6c,0x00003144,0x000302d9,0xfffd313b,0xfff736ac, -0x00195996,0x001b2f4d,0x002a1a74,0x00445c10,0x00836ac1,0x00507121,0x00334ecf,0x002a4630,0x0022db00,0x0021d1e2,0x00246aa7,0x0021d328,0x0041e41d,0x006d9065,0x009c9a67,0x0087cbd1,0x003958a3,0x0008bab0,0xffecd349,0xffe592a9,0xfff3cc5c,0x00085c6c,0x00021cba,0xfffe24ac,0xffff382d, -0x000089dc,0x00007a5b,0x0000b876,0x000088bc,0x00003f85,0x00000842,0x00006f9e,0xffff7d33,0xffff343e,0xfffffe7d,0x00079c83,0x00147c74,0x001dd100,0x0026871e,0x002b817c,0x00194263,0xffe24c47,0xffc4afd0,0xffcb1d30,0xfff40489,0x001e5cf5,0x00417267,0x002a5ae3,0xfff2aaf8,0xffac95be, -0xff99485b,0xffa9014c,0xffcf5ae1,0xffe8a7c0,0xfff74494,0xfffb6e06,0x00072f6a,0x00008c53,0xfffd4f40,0x000164e9,0x000042bc,0xffffe6c9,0xffffb519,0xffffaed7,0xffffabe2,0xffffe906,0xffffd032,0x000005d4,0xfffff5a7,0x00012671,0xfffdea7f,0x0005dfee,0x005b2b8a,0x0075f0da,0x00440cfd, -0xfffdc972,0xffab1167,0x0025fa17,0x0068bf17,0x00507542,0x0067000f,0x0020c5ea,0xffa78870,0xffc0a614,0xffff62ef,0x005d13f9,0x0073a51b,0x0066ab0d,0x003958e2,0x002d3fc8,0x001d9695,0x00100f76,0xfffe3779,0xffffa0fa,0x00016ea3,0xfffeec52,0xffffea92,0xffffea6c,0x00002cbd,0x000031f8, -0x000031db,0x0000335d,0xfffff75f,0x00007c7d,0xfffef8bd,0x00018b0c,0xfffb8856,0x0004d0d1,0xff97ffeb,0xfecfd860,0xffa11ce0,0x0000fd49,0xfffbbca3,0xffec5822,0xffba4fee,0xff79a360,0x000346eb,0x0053ca0b,0x00672ccd,0x001a427a,0xffddb89c,0xffd0d3cc,0xffc42b78,0xffc681c5,0xffca84a5, -0xffd32ea4,0xffd54c2a,0xffd9c7ff,0xffe65973,0xfff8aa94,0x0002633e,0xfffff783,0x0000ab4d,0xfffffc5f,0xfffff945,0xffffc896,0xffffc405,0xffffc134,0xffffdb27,0xffffba22,0x00007078,0x0000592d,0x00013266,0x00046c8c,0xffd43736,0xffbe43cd,0xffee54ce,0xffeca7d7,0xffd2622a,0xffde9896, -0xffefd7db,0xfffb2450,0xffe751fc,0xffd39556,0xffd2fc9e,0xffdae243,0xffeb10f9,0xfff2e289,0xffffdcb6,0x000deaba,0x00207e7c,0x00293194,0x002e0e9a,0x002e8e49,0x001e18e4,0x00076768,0xfffc3a98,0xffff7b80,0xffff1c65,0xffffd484,0x00000bed,0x0000460d,0x000083a6,0x000049ce,0x0000ad79, -0xffffb5da,0x0001218f,0xfffb6328,0x00041b41,0xfff0dc50,0x002d1399,0x003a89fb,0x00313a6b,0x003039e0,0x00215046,0x0012e594,0xfffd5d07,0xfff26302,0xffddb8ad,0xffd7e7d8,0xffd463f6,0xffd76198,0xffd780fb,0xffd45a5e,0xffe5ce1b,0xfff0d4be,0xfff753b2,0x000340fb,0x000d7822,0x0016f90a, -0x0018064f,0x00110772,0x0003a459,0x00022522,0x0001780d,0x000059c6,0xffffeea6,0xffff5615,0xffff17ba,0xfffeea56,0xffff6b73,0xfffe8886,0x0001a8d7,0x0000b22f,0x000a34bd,0x00194336,0xffef4992,0xfff22257,0xfff4425e,0xfff1b708,0xfff219b2,0xfff313f8,0xfff3e4a6,0xfff2126f,0xfff330cd, -0xfff1a466,0xffefafd7,0xffeffc4d,0xfff15b67,0xfff1ef41,0xfff4c65f,0xfff70127,0xfff94734,0xfffc7c73,0xfffe4a85,0x00038f7e,0xfffd310b,0xfff9d437,0xfff9f250,0xfff97d6c,0xfffd0f92,0xffffeb0b,0x00007ed3,0x0001eb61,0x00024446,0x00030067,0x0002286c,0x0003f6b7,0xfffecda8,0xfff9ca1e, -0xfff49bd2,0xfff2e05e,0xffe4594a,0xffe516a2,0xffea6810,0xffef429c,0xfff3b6cf,0xfff611ed,0xfff9500c,0xfffd496b,0x00014853,0x0005a536,0x0009e25a,0x000cfeb2,0x000fd7bb,0x0013ae94,0x001495bf,0x0016090d,0x00177720,0x0018db32,0x0019cb4e,0x001c68d7,0x001a9c59,0x0010f2e7,0x000a7c6c, -0x00048278,0xffff56db,0xfffababa,0xfff90d18,0xfff7c632,0xfff59359,0xfff38578,0xfff0ab52,0xffede665,0xffeb4918,0xffe9ff06,0xffe7e6d0,0xffe77633,0x0001273e,0xfffebf55,0x00002d62,0x0000ee74,0x0001e6b3,0x00038e9f,0x0004d4fe,0x0005a049,0x00068f99,0x00078944,0x0008bfa2,0x000a6a4e, -0x000c1fa7,0x000dfcd4,0x000e242e,0x000e8f06,0x000ed294,0x000f2e0d,0x000f9287,0x000f514f,0x0010cda0,0x00115b38,0x001416db,0x000ba06d,0x000d00e3,0x000e2f9d,0x000c3730,0x0009a776,0x0007d411,0x00060d2c,0x0004da5e,0x00034cb2,0x0002027c,0x000015bb,0x00045b03,0x0001de13,0x000c8233, -0xfff20b37,0xfff48fb6,0xfff4831c,0xfff6ab9d,0xfff6acc4,0xfff31b9e,0xfff65c9e,0xfff77997,0xfffc038b,0xfff58b89,0xfff33ec0,0xffedbd89,0xfff5bf2e,0xfff66776,0xfff32a43,0xfff07765,0xffef5a46,0xffef7336,0xfff1b762,0xfff24ea5,0xfff1dae9,0xfff2c101,0xfff2a06c,0xfff44b88,0xfff26d75, -0xfff14e71,0xfff44a79,0xffeef2bc,0xffefdee8,0xfff569f5,0xfff5b651,0xfff75ba1,0xfffbf08d,0xfff4bb35,0xfff3b080,0xfff3a262,0xfff3c1f0,0xfff58c5e,0xfff41467,0xfff877cf,0xfff6ebe0,0xffee4365,0xfff62118,0xfffb5f40,0x00077954,0xfff6ea3e,0xffef8419,0xffe2a1f1,0xfff863f7,0xfff8aa8c, -0xffea7a94,0xffdfdd65,0xffdb9008,0xffdefae1,0xffe78c1b,0xffed4005,0xffeca3eb,0xfff1f0ec,0xfff4c928,0xfff4d4f6,0xffec376a,0xffef18b0,0xfffb4b75,0xfff6e66d,0xfff8092a,0xfffcfb6c,0xfffd9ec6,0xfffe933e,0x00035650,0xfff8e871,0xfff23dc7,0xfff511bf,0xfff50b31,0xfffaa7ea,0xfff7b5cf, -0x0001c0cb,0x0001fe65,0xfff20844,0x0000f13d,0x000605d0,0x00222baa,0xfffe155b,0xfff166f0,0xffd2c1ba,0xfffedffe,0x00035cd7,0xffefeb78,0xffde2a28,0xffd646cd,0xffdbb54b,0xffe5d46f,0xffecf200,0xffe74fd2,0xfff07f34,0xfff26117,0xfff88a35,0xfffe54ce,0x0002feec,0x0002bf5a,0x0002becf, -0x000361eb,0x00017aaa,0x000140bf,0x00000f6b,0x0000163f,0x00015528,0xfffdd286,0xfff7691e,0xfff75586,0xfff86382,0xfff2c48d,0xffff5811,0xfff711ac,0xffdcefc0,0xfff1a1d7,0x000b0eb5,0x00369b00,0x0002bfe2,0xffe0593c,0xffb59bdb,0xfffc11d7,0x0003663e,0xffd42950,0xffab93d9,0xff9e88a5, -0xffaea2e2,0xffce3e7d,0xffe11e30,0xffdee9ba,0xffec2cad,0xfff8437a,0x0000e6b6,0x0001ec6a,0xffff24b0,0xfffecb95,0xfffec200,0xfffea646,0xffff44b3,0xffff84af,0xfffff393,0xffffe664,0xffff9652,0x0001d3d5,0x0000fda9,0xfffa4ae7,0x00111619,0x00122782,0x0014bc81,0x0028d2fc,0x00672f8c, -0x004350c9,0x002bfe11,0x0019139e,0x00238c31,0x0026568c,0x002043b6,0x001687ca,0x00289a22,0x004abc11,0x007ef01f,0x007751d2,0x0039abcc,0x001435ca,0xfffaf433,0xfff04924,0xfffcb221,0x00060f80,0xffff6ffd,0xffff5974,0x00001f1f,0x0000a971,0x000091c8,0x0000a170,0x0000623a,0x00003e4a, -0x000006cb,0x00002a8b,0xffffecf4,0xffff9785,0xffff2e20,0x00030268,0x000ffa2c,0x00148e94,0x0025c1fd,0x00323b74,0x0027241d,0xfff7a41d,0xffdab309,0xffd308c2,0xfff7902b,0x0019150b,0x0031feb2,0x00305fe6,0x0008624c,0xffc8526e,0xffa81b15,0xffa8656c,0xffc6123b,0xffddbd56,0xfff09239, -0xfffd5897,0x0005782e,0xfffe8d51,0xffff6f58,0x0000ce92,0xffffcae0,0xffffc0c8,0xffffa79a,0xffffb10c,0xffffbee3,0xffffdca0,0xffffe221,0xffffef63,0xfffff220,0x0000470f,0x0000cacf,0xfffdd1d6,0x004168f1,0x005f9b6d,0x00356343,0xfff9466f,0xffb06856,0x000ae7a8,0x004776b5,0x0041c6af, -0x00572922,0x00234c8b,0xffc0ae50,0xffc37c9b,0xffefd950,0x003e4fc0,0x00686090,0x006a5dfd,0x00441500,0x0034a4de,0x00207cb6,0x000c8af9,0xfffd04fe,0x0000aa42,0x00005233,0xffff6731,0x0000201d,0x00001eb9,0x00003ddd,0x000038dc,0x0000368d,0x000030e5,0x00001ed3,0x000043c9,0xffffc462, -0x00007229,0xfffec86c,0xfffc9605,0xffb0c120,0xff1bec15,0xffb051ff,0xfffbd4cf,0x0012593c,0x0002d06e,0xffd262c1,0xff8f85c1,0xffe7e346,0x00308171,0x00665251,0x0021c7ba,0xffedcce3,0xffd9a3c9,0xffcec679,0xffcdb224,0xffcdae6f,0xffd52a2d,0xffd7bf2c,0xffda11b6,0xffe95449,0xfffe5e30, -0x0001936d,0xfffff488,0x0000318a,0xffffca34,0xffffc955,0xffffb6d0,0xffffb42a,0xffffadba,0xffffba68,0xffff9823,0x00002121,0xffffb90d,0x0000ba59,0x000979c8,0xffbf7b14,0xff9a7c8a,0xfffd6902,0x0010e6bd,0xfff2fa43,0xfffa40a8,0x0000d4b3,0x000126b5,0xffefecff,0xffdcfd5d,0xffdc9f5c, -0xffddbb1e,0xffea4baa,0xffef1bd9,0xfffc6dbe,0x00094d81,0x0018e0cc,0x0021803b,0x00260338,0x0027e719,0x001743b9,0x000194cd,0xfffd0045,0x00003c5e,0xffff8315,0x000067d1,0x00004fea,0x00007fa6,0x0000985c,0x00008a4d,0x0000c5f1,0x00006170,0x0000cc90,0xfffe755c,0x0002b4bc,0xfff01365, -0x002a8bca,0x00313ab5,0x0024e6fc,0x00205d0c,0x0015d8d0,0x000b6cf2,0xfffae630,0xfff54ebd,0xffe3c04e,0xffde3e24,0xffda2f7a,0xffdc9d43,0xffddf82a,0xffde1ddb,0xffeef07b,0xfff8f57f,0xfffe0522,0x0008d62c,0x0010f471,0x001936ed,0x0017e3c0,0x000cf453,0x0000ab14,0x0001d967,0xfffffe09, -0xffff8620,0xffff3c5e,0xfffeff05,0xfffeca41,0xfffeb0c1,0xfffeb852,0xfffe5713,0xffffbeb5,0xffffe8ac,0x0001ff82,0x00131594,0xfff7be91,0xfffc30dd,0xfffc6ede,0xfff9d258,0xfff80b35,0xfff7a4b3,0xfff7cc82,0xfff6129d,0xfff535ae,0xfff27d70,0xffef1167,0xffedca86,0xffed3c45,0xffeb927b, -0xffeecc0f,0xfff1a614,0xfff495ec,0xfff71fdd,0xfff849bf,0xfffc9603,0xfff88621,0xfff8392b,0xfffa9f94,0xfffd0ac6,0x00004df4,0x00016b55,0x0001b6ab,0x00026c7f,0x0002e0a2,0x00030b45,0x000315a4,0x0003b7e4,0x0002ad41,0xffff0d7a,0xfffd5ae4,0xfffc1f2e,0xffe97834,0xffeb8de5,0xffeee15f, -0xfff1d780,0xfff4b125,0xfff65a3b,0xfff82795,0xfffa90fc,0xfffd42c0,0x0000447b,0x00033e48,0x00055e52,0x00075359,0x0009c4f4,0x000b3e6f,0x000cb120,0x000e59e1,0x000feadb,0x00113445,0x00140aa9,0x00131a71,0x00094a13,0x00036f07,0xfffe70a3,0xfffbcaee,0xfffacddd,0xfffa3d4c,0xfff912f2, -0xfff81c42,0xfff722e1,0xfff6ebf6,0xfff3f1ff,0xfff10970,0xffee795a,0xffebd68f,0xffebf76a,0xfffcb90e,0xfffbae4b,0xfffc477d,0xfffcd8a2,0xfffd7b46,0xfffe6f75,0xffff4376,0xffffc290,0x00003429,0x0000aba7,0x000153a0,0x00024dff,0x000364a7,0x00048443,0x0004fd44,0x00058dcc,0x0005fa57, -0x00068bf6,0x0007203d,0x00070c09,0x00086d49,0x00091f6b,0x000b88d6,0x00045780,0x0004a94d,0x000428f2,0x00028942,0x0000e45c,0xffff74a7,0xfffde556,0xfffc58c6,0xfffbb64b,0xfffbb94a,0xfffb45a7,0xfffe6bd7,0xfffd0be5,0x0003b770,0xfff40095,0xfff54cd7,0xfff56c58,0xfff76a50,0xfff79922, -0xfff513b6,0xfff733c1,0xfff83a45,0xfffcdc79,0xfff71110,0xfff4f0f0,0xffefadec,0xfff6b35b,0xfff77443,0xfff503bb,0xfff35f7f,0xfff25f83,0xfff15772,0xfff39451,0xfff43275,0xfff4aa33,0xfff4c874,0xfff48846,0xfff42e58,0xfff3f115,0xfff215fb,0xfff41222,0xfff0bc8d,0xfff1cfc4,0xfff633fe, -0xfff66116,0xfff7f1fd,0xfffc32d4,0xfff566ee,0xfff51517,0xfff45038,0xfff48f32,0xfff5a16b,0xfff404dd,0xfff88427,0xfff79870,0xfff1a3e5,0xfff6a587,0xfffb142b,0x000695ea,0xfff80f09,0xfff13a03,0xffe4f320,0xfff7f080,0xfff942fc,0xffee5d01,0xffe7737f,0xffe31f4d,0xffe26db7,0xffe9acd2, -0xffef0249,0xfff06200,0xfff4da6d,0xfff79478,0xfff438ec,0xfff34730,0xfff7e17e,0xffff58ce,0xfffdc2fb,0xfffe43f4,0x00000745,0xffffe8f7,0xffffa3e5,0x0002c967,0xfffc0ba7,0xfff53aaa,0xfff58a2f,0xfff6db6d,0xfff97aa4,0xfff3ed4f,0xffff0edf,0xffff44ae,0xfff52c0b,0xfffe4339,0x00022086, -0x001d539a,0xfffdfc7a,0xfff3095a,0xffd66d8b,0xfffb822a,0x0000e97d,0xfff27696,0xffe7a642,0xffe07792,0xffdecf86,0xffe85c15,0xffef31cb,0xffeda80d,0xfff59d2a,0xfff6f410,0xfffdd223,0x0003315e,0x000293a0,0x00012894,0x000109f5,0x0000fe04,0x000028f7,0x00006321,0x00000ba4,0xffff8e6a, -0x0001c023,0x0001e0ce,0xfffc14f6,0xfff84b19,0xfff81382,0xffeeee14,0xfffcbfbd,0xfff7d14c,0xffe63e60,0xfff1ada0,0x00064695,0x002e414a,0x0001289d,0xffe232d5,0xffbb32f4,0xfff6f6cc,0x00019480,0xffde0b78,0xffc27977,0xffb4234a,0xffb5c155,0xffcfb7d7,0xffe1d5d5,0xffe59fc0,0xfff2d2ef, -0xfffdb8c9,0x00019c06,0xffff33d1,0xfffebd6b,0xffff674c,0xffff7b2c,0xffff8857,0xffffd23a,0xffffcee2,0x0000004e,0x00000ecd,0xffff2f56,0xffff92b4,0x00025aaa,0xfffdf9d4,0x000a3c5b,0x000f466b,0x0009b5c0,0x00182dc7,0x004c996c,0x0034ece1,0x0022e69a,0x0009b92a,0x00235508,0x00292775, -0x001bdfe0,0x00105d4a,0x00187a7b,0x00323742,0x00628752,0x00643d43,0x003a00ca,0x001ec034,0x0008743f,0xfffc159b,0x0001eead,0x00030440,0xfffef7ab,0x0000440c,0x00008f14,0x000056a9,0x000040ca,0x00003a14,0x00001fa7,0x0000160d,0x000009f7,0xfffff9c2,0x000078c0,0xffffd1fd,0xfffef6ef, -0x00016459,0x0009981f,0x0010d47b,0x001d95b2,0x002d490d,0x00279ce1,0x0003d792,0xffeae689,0xffdbe121,0xfff7fde0,0x00100b90,0x00225214,0x002dcd8b,0x00133c0c,0xffdd6bd7,0xffb900cc,0xffaed25f,0xffc20a53,0xffd69cb7,0xffea6d94,0xfffc49aa,0x00022f08,0xfffe6c95,0x000056dd,0xfffffa91, -0xffffacf1,0xffffd538,0xffffd965,0xffffdf39,0xffffedad,0xffffe4ed,0x00000b5d,0xffffbce7,0x00003cc2,0xffff08c8,0x0002631a,0xfffb50af,0x00269af3,0x00437f7a,0x00245a70,0xfff7eb01,0xffbea2f4,0xfff5db7e,0x002680f8,0x0030a61a,0x0042f011,0x0020c49f,0xffd7e84e,0xffca3237,0xffe5db19, -0x0023375a,0x005375e8,0x005fbcf0,0x00450793,0x0034f72a,0x002030b4,0x0009f2d2,0xfffe1174,0x00015dd3,0xffff3f6f,0x0000318f,0x000019b6,0x00002a68,0x000018af,0x00001ab7,0x0000175d,0x000013a0,0x00001b24,0x00001482,0x00004c40,0xffffb480,0x0001528b,0xfff83a1b,0xffcda02b,0xff6518e1, -0xffc0c339,0xfff6691e,0x0026380e,0x000e526a,0xffe3fab6,0xffae831e,0xffd985fd,0x00145671,0x005b29cd,0x002862f0,0xffffd55d,0xffe451a7,0xffdc034a,0xffd84d0b,0xffd4dad6,0xffdaee02,0xffde3721,0xffdedadf,0xfff03d71,0x00025802,0xfffffe7a,0x00001d4d,0xffffcae5,0xffffded1,0xffffd98b, -0xffffe0c0,0xffffd8b4,0xffffdf67,0xffffc556,0xffffe0cc,0xffff67ff,0x0000c1a1,0xfffcfe21,0x000d5508,0xffc34840,0xff96462e,0x0012d5a2,0x00307b77,0x00155d4b,0x00147e42,0x0010f946,0x00077d1c,0xfff6be6e,0xffe53e26,0xffe500f1,0xffe1ea37,0xffeb6d1c,0xffee2d70,0xfffb23df,0x0005c817, -0x0010f4c1,0x001904b5,0x001d29d7,0x0020963c,0x000feabb,0xfffd70dc,0xfffefb1b,0x00003e2d,0x0000195b,0x00005639,0x00003217,0x0000433c,0x0000408c,0x0000526a,0x0000540f,0x0000904c,0x00007382,0x00007615,0xfffff61f,0xfffe7fb3,0x0022f692,0x00259b85,0x00163a61,0x000e2da4,0x000764c1, -0x0000a653,0xfff68f46,0xfff690d2,0xffea96f1,0xffe68483,0xffe29e2a,0xffe4831a,0xffe6798a,0xffe926e2,0xfff74e70,0xffff9dfb,0x00033a44,0x000bedf2,0x00118524,0x0017ef31,0x0014cf91,0x0006f814,0x000009b8,0x00006493,0xffff477a,0xffff9213,0xffff7f0d,0xffff8981,0xffff6e2c,0xffff67c2, -0xffff347e,0xffff0c24,0xfffeacb1,0xffff7536,0xfffe64f0,0x00082e09,0xffff3165,0x00044633,0x0003a690,0x000170fb,0xfffe6187,0xfffcc0f1,0xfffbf44f,0xfff9e92d,0xfff72d61,0xfff39f09,0xffef58d4,0xffedb41d,0xffec6e18,0xffea0c4b,0xffece552,0xffef7c55,0xfff22b16,0xfff3dfb7,0xfff4a670, -0xfff75358,0xfff5e6a3,0xfff8a19e,0xfffd902a,0x00009ab9,0x000112f6,0x00011e5f,0x0000f29c,0x000106ab,0x00012984,0x00014254,0x0001a72a,0x00020f68,0x0002da3f,0x00024d4a,0x000151f6,0x00026ed8,0xffeec06e,0xfff10bc3,0xfff296b0,0xfff3dc18,0xfff55299,0xfff67dda,0xfff74b86,0xfff89166, -0xfffa4ae8,0xfffc2873,0xfffde5f9,0xffff02f9,0xfffff010,0x000104e0,0x000297ba,0x0003e7e1,0x00059178,0x00070726,0x00086479,0x000b0b00,0x000aa68d,0x00023732,0xfffdd199,0xfffbc5aa,0xfffc6129,0xfffd6f36,0xfffdcf80,0xfffd4ab4,0xfffd2b2c,0xfffcbd44,0xfffd0a36,0xfffacfec,0xfff858d4, -0xfff45c40,0xfff1b32f,0xfff11fd4,0xfffa6219,0xfff9ee42,0xfffa07d8,0xfffa77b8,0xfffad5c4,0xfffb309b,0xfffb9b59,0xfffbd661,0xfffbd84c,0xfffbe471,0xfffc2119,0xfffc8cf3,0xfffd238e,0xfffda8ab,0xfffe4c8d,0xfffeddc7,0xffff50ca,0xfffff3b3,0x00008f73,0x00009f08,0x000201e3,0x0002becd, -0x00046c2e,0xfffe9c7b,0xfffe23e1,0xfffd30c3,0xfffbefae,0xfffae8cb,0xfff9f35e,0xfff8e8e7,0xfff7daa9,0xfff7a356,0xfff7f15d,0xfff86340,0xfffa8aa1,0xfffa36fc,0xfffd788b,0xfff623b9,0xfff70de6,0xfff6c052,0xfff89dba,0xfff8e84c,0xfff787e5,0xfff86551,0xfff91570,0xfffd0d72,0xfff85470, -0xfff698ff,0xfff269fb,0xfff7bcbd,0xfff874f0,0xfff6e5a6,0xfff6236a,0xfff55c6c,0xfff3ccc1,0xfff5bc7e,0xfff663c0,0xfff72493,0xfff798ba,0xfff7ca86,0xfff520f8,0xfff63a67,0xfff5f6fc,0xfff76c6f,0xfff5c1cf,0xfff6a1d8,0xfff96d22,0xfff96df8,0xfffa8c09,0xfffde631,0xfff81c00,0xfff6f8c7, -0xfff61eb2,0xfff70f87,0xfff79104,0xfff56cfe,0xfff9a045,0xfff95b3d,0xfff6169d,0xfff803c5,0xfffafe51,0x0004491c,0xfff87f45,0xfff2e8d6,0xffe94401,0xfff7abf9,0xfff9669e,0xfff20cba,0xffee46aa,0xffea8f9d,0xffe78dc7,0xffed1253,0xfff190e4,0xfff44b38,0xfff8ccde,0xfff9b202,0xfff7c8dd, -0xfffbe780,0xfffe5471,0x0000f4ca,0x0000201f,0x00005143,0x00009eb3,0x00007968,0x00003c2d,0x00013fa9,0xffff7252,0xfffb57ce,0xfff87b00,0xfff8a20b,0xfff9efb0,0xfff34051,0xfffdf0dc,0xfffe683d,0xfffa028d,0xfffcf936,0xfffecb78,0x0015472b,0xfffc2d4a,0xfff3b0ae,0xffdd5e94,0xfff87d88, -0xfffdd5ac,0xfff4a841,0xffef9547,0xffe9d88f,0xffe42a09,0xffec5111,0xfff211e7,0xfff3fd0a,0xfffa67f7,0xfffd280d,0x00017762,0x0001d92f,0x0000af26,0x00001252,0x000045d7,0x000053a1,0x00000eb6,0x00000f83,0x00000af3,0xffff8c3c,0x00008228,0x0001913e,0x000097c4,0xfffc439f,0xfffb2734, -0xffef7092,0xfffcf37b,0xfffb5302,0xfff24260,0xfff49e3e,0x0002690e,0x0021dd7e,0xfffd4481,0xffe45f5d,0xffc6d06b,0xfff3637d,0xfffe4db5,0xffe6e5c3,0xffd6d81e,0xffc9a82e,0xffc25c34,0xffd5a39d,0xffe506be,0xffed4ddd,0xfff9bafe,0x0000a225,0xffffd18e,0xffff1472,0xffffbdbc,0xffffe916, -0xffffd6ba,0xffffd24a,0xfffff77c,0xfffff07c,0x000002e1,0x00002a0a,0xffffd159,0xffff3237,0x000058f8,0x00009113,0x00061c14,0x0009e16d,0xffff0639,0x0008901a,0x0030aadb,0x00232484,0x0016ed4d,0xfffc7595,0x001e6cd9,0x00262adf,0x00157ec4,0x000a04e1,0x000b4ef0,0x001dac8d,0x00441470, -0x004b6f1d,0x00343aee,0x002225f3,0x00105cdc,0x0005584b,0x00041ea8,0xffffc723,0x000001ad,0x00007127,0x00002877,0x00000b4a,0x00001821,0x00001480,0x00000a8a,0x00000441,0x000006fd,0xffffe2fb,0x0000329e,0x00003dcc,0x0000371d,0xfffe7bbb,0x000285e0,0x000c8d2d,0x00161e1c,0x002699a1, -0x0025212c,0x000d7761,0xfff94209,0xffe54054,0xfff9b09a,0x0009a66b,0x0015f258,0x0026faa5,0x00169b8d,0xffec2c35,0xffca1b49,0xffbab9c9,0xffc44d26,0xffd46cd5,0xffe65f06,0xfff90e07,0xffffd235,0xffff2dc1,0x0000708a,0xffffa7cb,0xfffff456,0xfffff2fb,0xfffff4de,0xfffff0b3,0xfffffcd7, -0xffffef1c,0x000013f1,0xffffd211,0x0000567b,0xfffef04f,0x0001d21e,0xfffd3515,0x0010190a,0x002afcce,0x0015e10f,0xfff74863,0xffcdbe82,0xffe8dd0c,0x000cfcad,0x002124b5,0x002f3aa9,0x001bcb1d,0xffea67bc,0xffd3f5b6,0xffe21227,0x000e1b64,0x003a9b49,0x004c00ae,0x003e495f,0x002f54d3, -0x001d1ae8,0x00080fe1,0x00003d49,0x00008724,0xffff998d,0x00005119,0xfffffcd1,0x00001185,0x0000076e,0x00000d02,0x00000a9c,0x0000071b,0x00000e62,0xfffff156,0x00004c62,0xffff7e1f,0x00020b1d,0xfffa1982,0xffed730e,0xff9dca6c,0xffcccbf6,0xfff05202,0x002d6336,0x0010efbc,0xffef5cd0, -0xffcaeef9,0xffd4d1a1,0xfffec3d6,0x0045137d,0x00290579,0x000ddf0f,0xffef3ebc,0xffe8a050,0xffe35b88,0xffdeb594,0xffe315a0,0xffe6b760,0xffe6a8fa,0xfff8b9e6,0x00026b2b,0xffff6e0b,0x00001075,0xffffd8d1,0xfffffbab,0xffffebe9,0xfffff2c6,0xffffe750,0xfffffb61,0xffffd27b,0x0000333c, -0xffff4585,0x00014e8e,0xfffc299f,0x00097b42,0xffdc7a93,0xffaa8778,0x0023b0d7,0x004032b7,0x002edd15,0x002760f6,0x001dade0,0x000da96d,0xfffd75fb,0xffeddf37,0xffed29cb,0xffe692bd,0xffeca1d8,0xffeee0ca,0xfff9d33f,0x0001c9c6,0x0008deae,0x0010785d,0x00143bac,0x0018f1ca,0x0008b855, -0xfffc66d0,0x0000c049,0x00000573,0x00002df4,0x00001362,0x00001c6b,0x00002395,0x00001c62,0x00003485,0xffffff59,0x00006a87,0xffff9ea1,0x000191a8,0xfffde717,0x0006fa34,0x00181db7,0x001818b8,0x000725e3,0xfffdbfb0,0xfffa6507,0xfff65ccb,0xfff199b4,0xfff4c52d,0xffefd9a2,0xffee6feb, -0xffebeb97,0xffecd985,0xffee7bc1,0xfff236d5,0xfffcb89c,0x00037a0a,0x00065e52,0x000cfa4f,0x000fe830,0x001477e5,0x000eda43,0x00018e8e,0xffffc2e8,0xffff8ec1,0xffffcde7,0xffffccd2,0xffffcaac,0xffffbfd8,0xffffb42c,0xffffbf7e,0xffffa927,0xffffe186,0xffff4eb0,0xffffd17a,0xfffe75d3, -0xfffe7ca6,0x0004c078,0x000a41f2,0x0008edd4,0x000745d9,0x0003a3db,0x0000ce8f,0xfffedc92,0xfffc10e3,0xfff85406,0xfff471b1,0xfff00c8e,0xffef1e61,0xffee4ae7,0xffec71a7,0xffeeaf43,0xfff0ac89,0xfff2c0d4,0xfff3b398,0xfff4605c,0xfff589c4,0xfff68a89,0xfffbe3bc,0x0000ff36,0x0000df1d, -0x0000815e,0x0000529f,0x00006383,0x00007801,0x00008b0a,0x00008500,0x000080f0,0x000078c4,0x0000f247,0x0001bd0f,0x000182b0,0x00043c95,0xfff35d86,0xfff5804e,0xfff5a498,0xfff5879f,0xfff5e114,0xfff681a5,0xfff68e1a,0xfff6e7e1,0xfff7f78f,0xfff909c9,0xfff9db85,0xfffa3b62,0xfffa5157, -0xfffa66d1,0xfffbc310,0xfffcd988,0xfffe55be,0xffff8a94,0x0000de12,0x0002ee7f,0x0003220c,0xfffd4ff3,0xfffc1518,0xfffd8636,0xffff05f2,0xffffb054,0xffffb40b,0xffffa9ee,0xffffab3b,0xffffa4c6,0xffffa409,0xffff79fc,0xfffe8b3e,0xfffaec5f,0xfff861ca,0xfff7460c,0xfff9486c,0xfff999a0, -0xfff940dc,0xfff9875e,0xfff99f41,0xfff98793,0xfff999fc,0xfff99203,0xfff94f14,0xfff91042,0xfff901a5,0xfff8fda4,0xfff92f98,0xfff941dc,0xfff9ef3b,0xfffa6e13,0xfffad5a1,0xfffb6c5f,0xfffbf305,0xfffc2400,0xfffd3ebf,0xfffe0bc9,0xfffe7824,0xfffadab2,0xfffad4a9,0xfffa6d2f,0xfff9bf4c, -0xfff93fec,0xfff8b84d,0xfff84098,0xfff7b621,0xfff77cf4,0xfff77954,0xfff7cbdc,0xfff81f04,0xfff8866b,0xfff9a2f4,0xfff8ab8e,0xfff93a63,0xfff8d8ea,0xfffa42e1,0xfffa9859,0xfffa1028,0xfffa300d,0xfffa9489,0xfffd6ee2,0xfffa27d7,0xfff8f56d,0xfff62e9d,0xfff9894c,0xfffa12bf,0xfff94375, -0xfff91104,0xfff88ddf,0xfff712ba,0xfff87e66,0xfff9027e,0xfff9d45d,0xfffa3c65,0xfff9c068,0xfff618ba,0xfff97549,0xfff9a7fd,0xfffad424,0xfffa3e80,0xfffaa372,0xfffbd62b,0xfffbc146,0xfffc4fbf,0xfffe1de8,0xfffa9051,0xfff970cb,0xfff75451,0xfff8e89c,0xfff92735,0xfff7c1c0,0xfffaa7bc, -0xfffacc76,0xfff98fdf,0xfff9cf89,0xfffb9481,0x0001f228,0xfff9d43d,0xfff5f6a1,0xffefa3ef,0xfff8cdf0,0xfffa51eb,0xfff62bee,0xfff4979e,0xfff1ed91,0xffee824f,0xfff20cb8,0xfff549d1,0xfff84d27,0xfffb2a12,0xfffc3723,0xfffcd794,0x00005822,0x00014f84,0x0001b8a0,0x00015a6a,0x00016e09, -0x00014831,0x000143b9,0x0000e8d4,0x00012f18,0x0000fce8,0xffffd72e,0xfffcb500,0xfffae31c,0xfffb26ff,0xfff4871d,0xfffd0eed,0xfffd9cbd,0xfffd1638,0xfffcd308,0xfffd5d67,0x000d1344,0xfffc064d,0xfff655ee,0xffe7bb1a,0xfff8343c,0xfffc5c53,0xfff7ab04,0xfff64b1d,0xfff269d7,0xffec0c54, -0xfff1f2dd,0xfff62481,0xfff91b0e,0xfffdbcad,0x00008522,0x000141c1,0x0000842e,0xffffacfd,0xffff8cbe,0xffff901b,0xffff9661,0xffff8a60,0xffffa756,0xffffb6ef,0xffff9f8b,0xffffe2ab,0x00007908,0x0001af7f,0xffffc8b2,0xfffed86a,0xfff14a2b,0xfffbab19,0xfffbf1f0,0xfff9428d,0xfff776bc, -0xffff8143,0x0014b573,0xfffb97a7,0xffeaaa81,0xffd7d5ca,0xfff3c581,0xfffc5587,0xffefa12d,0xffe842be,0xffde4254,0xffd4346d,0xffe071cd,0xffeb5d22,0xfff4db21,0xfffe1804,0x0000bd43,0xffff5483,0xffffd150,0x000010e9,0x00003424,0x00002f41,0x00002cf9,0x00002fa7,0x000025bc,0x0000207f, -0x00002afd,0x00000379,0xffffb805,0xffff5b96,0x00010cb6,0x00012b46,0x000532d7,0xfffc3f38,0x0001ade5,0x001bb280,0x0015f4ae,0x000ee38d,0xfff831c2,0x00176d5a,0x001decec,0x000e2012,0x00051e56,0x00032a0b,0x000ea814,0x0027a32a,0x00308a3e,0x00290d31,0x001e8230,0x0012545a,0x0009e236, -0x00017b15,0xffffa829,0x00004e60,0x00001595,0xfffff92e,0xffffe882,0xffffe909,0xffffeaa2,0xffffe956,0xffffeee9,0xffffecf7,0xfffff360,0xfffff095,0x0000380e,0xfffff3e9,0x00000d99,0xfffdfb43,0x0009fff8,0x000f8f1e,0x001bd51b,0x001cf4b9,0x000faac2,0x000170c8,0xffee0672,0xfffab6de, -0x0004705d,0x000d4664,0x001d0920,0x001447a2,0xfff75f42,0xffdd97bf,0xffcee527,0xffd145f5,0xffdb0769,0xffe825a5,0xfff6f658,0xffffaa0d,0x000024ee,0xffffe945,0xffffe73c,0x00000784,0x00000ac4,0x00000d03,0x00000b8a,0x00000cca,0x0000088b,0x00000d65,0x0000020b,0x00000eb0,0xffffd9e8, -0xffffde52,0x000090bc,0x00023bb2,0x0015bf22,0x000b4fe0,0xfff8be73,0xffdeea36,0xffe61b89,0xfffd2e89,0x001412c5,0x001d2990,0x00140dfd,0xfff7a84f,0xffe14f50,0xffe6bb16,0x000311c6,0x002393e7,0x00338c0f,0x002f37a0,0x00245a23,0x00173a27,0x0006d806,0x000045b9,0xfffff9fa,0xffffec60, -0x00002531,0xfffff011,0xfffffd9c,0xfffff410,0xfffff832,0xfffff68d,0xfffff738,0xfffffadb,0xffffefc8,0x000019c8,0xffffc361,0x0000e552,0xfffe0e2f,0x00024d48,0xffc89b53,0xffdc156a,0xfff15398,0x00289933,0x00101b68,0xfff90af9,0xffe38695,0xffdc288a,0xfff573fb,0x002c8e6e,0x00235709, -0x00148d05,0xfff9e7a6,0xfff41ceb,0xffeeb559,0xffeac55c,0xffed4a5c,0xfff01796,0xfff0c677,0xfffe4f31,0x00013aee,0xffff7d61,0x00001604,0xfffff85f,0x00000e76,0x00000907,0x00000ca6,0x0000091e,0x00000fe9,0xfffffea0,0x00002487,0xffffc4df,0x00007775,0xfffee028,0x000198e5,0xfff6afa7, -0xffcebffc,0x0027cf75,0x003c1d8c,0x00360c18,0x002bd311,0x0021475c,0x0011bfb3,0x0002d42f,0xfff5d481,0xfff40f2c,0xffed57f5,0xfff06ae9,0xfff1b765,0xfff9ca2a,0xffff2af4,0x00035ff9,0x0009b58f,0x000c4f74,0x00113ae0,0x00017037,0xfffe5a9b,0x0000d2fc,0xffffcdb2,0x000014de,0xffffe15d, -0xfffff234,0xffffeb2f,0xffffe97e,0xfffff1f7,0xffffe129,0x00000939,0xffffbb2e,0x0000b825,0xfffe9096,0x000424a6,0x0009efb0,0x000ca55d,0xfffcaf31,0xfff4d327,0xfff37736,0xfff18042,0xfff09078,0xfff50dc9,0xfff4697b,0xfff4e599,0xfff40d28,0xfff48cb0,0xfff5c2bf,0xfff91c5e,0xffffe05d, -0x0004d27a,0x00072d3f,0x000ba6a9,0x000c19f5,0x000fc698,0x00071d63,0xfffed6cb,0x0000289d,0xffff9376,0x00003411,0x0000184c,0x00002d9e,0x00002537,0x00002e92,0x000026cb,0x000028bb,0x00002217,0x000027ad,0xffff6e2f,0x000084be,0xfffc9730,0x0005bd6f,0x000c7644,0x000a375c,0x000984a4, -0x00062605,0x00033da3,0x0000ce26,0xfffdf1b5,0xfffa4fcd,0xfff6da7b,0xfff31ef6,0xfff2d0df,0xfff2827c,0xfff17ad8,0xfff30fc4,0xfff46de7,0xfff5e1c0,0xfff65738,0xfff6ff01,0xfff70689,0xfff9c04f,0x00004f98,0x00011169,0x000024d5,0xffffc4e6,0xffff97f9,0xffffa7bd,0xffff9b63,0xffff947b, -0xffff9a90,0xffffadbb,0xffff8d0c,0xffffd09d,0x00006231,0x00015416,0x0000fb7f,0xfff8bd4f,0xfff92358,0xfff8faf0,0xfff83943,0xfff80d9f,0xfff85140,0xfff8149d,0xfff7feae,0xfff88b2b,0xfff90e85,0xfff942de,0xfff92f76,0xfff8c74e,0xfff84ba6,0xfff9312c,0xfff9e1e4,0xfffaeb35,0xfffbaeae, -0xfffcb3c1,0xfffe0e3a,0xfffdb6ee,0xfffbe19c,0xfffe3bf6,0x000005a7,0x00012faa,0x00014842,0x00012157,0x000139dd,0x00012dd6,0x0001454b,0x000125ea,0x00018a24,0x00013d2d,0xffffb886,0xfffd491b,0xfffceb5e,0xfff9aefc,0xfffacf53,0xfffa4912,0xfffa632f,0xfffa5922,0xfffa136c,0xfff9fb15, -0xfff9d8c0,0xfff97c45,0xfff92133,0xfff8ef83,0xfff8b321,0xfff8aa70,0xfff882bb,0xfff90abb,0xfff96090,0xfff9a603,0xfffa1408,0xfffa5e63,0xfffaa845,0xfffb7806,0xfffb6481,0xfffaa773,0xfffa64cf,0xfffae35e,0xfffb27aa,0xfffae95b,0xfffacd36,0xfffaa643,0xfffa8861,0xfffa5555,0xfffa4cf4, -0xfff9ee01,0xfff9b1f9,0xfff830f1,0xfff8cc01,0xfff8da6d,0xfffaed3c,0xfffb23b6,0xfffb1a9a,0xfffbc0df,0xfffc1d05,0xfffc1c66,0xfffbc7d0,0xfffbe2da,0xfffd738f,0xfffba3e1,0xfffafe74,0xfff99b98,0xfffb3961,0xfffb8ab7,0xfffb4971,0xfffb55bf,0xfffb14df,0xfffa1ab0,0xfffaec9d,0xfffb3c21, -0xfffbe849,0xfffc2270,0xfffba9d8,0xfff9b245,0xffff4e9c,0xfffef333,0xffff1118,0xfffee24b,0xffff076f,0xffff55cd,0xffff532b,0xffff7622,0x0000030f,0xffff0249,0xffff0ae5,0xfffa515d,0xfffac5f3,0xfffaca00,0xfffa19aa,0xfffc373c,0xfffc5a39,0xfffc7d70,0xfffba39e,0xfffc4432,0xffff8b3d, -0xfffb0938,0xfff8e26b,0xfff5c35c,0xfffa36fa,0xfffb3733,0xfff991a7,0xfff926ff,0xfff7ac53,0xfff53f78,0xfff6fe12,0xfff8f99e,0xfffb3e1f,0xfffd32e4,0x00009067,0x0000d2e7,0x00010e77,0xfffffba1,0x000074b6,0x0000592f,0x000056dc,0x00002b56,0x00002dd8,0x00000596,0x00000f4d,0x00001173, -0x00010510,0x0000f6a9,0x00000689,0x00000b9f,0xfff68a08,0xfffda318,0xfffd99a9,0xffff2dda,0xfffd0ae6,0xfffca028,0x0005001e,0xfffbbda7,0xfff8b03e,0xfff1849c,0xfff9195a,0xfffba0f5,0xfffa37b6,0xfffa74d1,0xfff86ed1,0xfff3de23,0xfff742c6,0xfff9bc6b,0xfffc302f,0x0000b9ec,0x00005acf, -0xffff9bb6,0xffff9716,0xffffdf66,0xffffda19,0xffffdbf4,0xffffe8a5,0xfffff384,0xfffff0c0,0xfffff9b7,0xfffff9de,0xffffd8c8,0xffff9ad5,0xffff5a94,0x0001222c,0x00021a50,0xfff5dbd5,0xfffcab70,0xfffe0583,0xfffec067,0xfffaf5ad,0xfffddf46,0x0008b724,0xfffac686,0xfff16659,0xffe85a6f, -0xfff5c1ba,0xfffaecfd,0xfff64456,0xfff3eaa4,0xffedfba7,0xffe62f32,0xffec50a4,0xfff28e1d,0xfffa9f35,0x0000781a,0xffffc4ad,0x0000091c,0x0000347b,0x000016b1,0x00001175,0x0000109c,0x00000b45,0x00000842,0x0000069b,0x00000542,0x000003f9,0x00001a0f,0x00002700,0x00004152,0xfffefbe6, -0x0000564b,0x0002602f,0xfffc089b,0xfffe4ab5,0x000a2049,0x000916db,0x0005d3c2,0xfff64281,0x000c7196,0x0011487b,0x000716a9,0x00019f57,0xffff6ba6,0x0005d8c5,0x001209c1,0x00191414,0x001a55d4,0x0014cb70,0x000e2a50,0x00084119,0xffff48b7,0xfffff99e,0x00000c43,0xffffe38c,0xfffff4db, -0xfffff691,0xfffff84c,0xfffff9b8,0xfffffbba,0xfffffbcf,0xfffffe33,0xfffff97f,0xfffffc49,0xffffd248,0x00003df2,0xffff76dd,0xfffdc0a5,0x0005de37,0x00099573,0x00103986,0x001241a3,0x000d03c1,0x0004ca3e,0xfff614f4,0xfffc7906,0x00018ae6,0x00077d71,0x0012ab87,0x000f17c8,0xfffe822c, -0xffeee3ef,0xffe425a2,0xffe21acc,0xffe6fcee,0xffee281c,0xfff8897c,0x0000fdbb,0xffffc230,0x000017d3,0xffffff93,0x00000e21,0x00000208,0x0000063d,0x00000335,0x0000035f,0x000002ea,0x000001b5,0x00000601,0xfffffe07,0x000026a4,0xffffb535,0x0000bb8b,0xffff9170,0x0007082e,0x00045c58, -0xfffb22bf,0xffed8182,0xffeb554c,0xfff71986,0x00095906,0x000d7686,0x000a732e,0xfffda6ba,0xffec9bf5,0xffed09e5,0xfffc46cf,0x000f0636,0x001a84f4,0x001c0ba2,0x00162369,0x000e8806,0x000490ee,0x000009d8,0xffffb4f9,0x00002886,0xffffe87b,0xffffffbd,0xfffff90d,0xfffffce2,0xfffffb7d, -0xfffffd58,0xfffffb68,0xfffffeab,0xfffff727,0x00000479,0xffffdfcc,0x00003637,0xffffc236,0x000562db,0xffe9c885,0xffe94642,0xfff5a03d,0x00180b65,0x000a6217,0xfffdf4de,0xfff3c368,0xffe9742c,0xfff521a4,0x0015659d,0x00179572,0x001236a3,0x0000b056,0xfffb8446,0xfff71e56,0xfff50de9, -0xfff5dea4,0xfff77f94,0xfff9b7e9,0x00006ea6,0x00000f1a,0xffffed8b,0x000010b2,0x00000609,0x00000670,0x0000069e,0x0000052a,0x000006c5,0x0000036b,0x00000c42,0xfffffb0e,0x00002340,0xffffccc6,0x0000a11a,0xfffe6664,0x0000d434,0xfff2cad4,0x001cc6de,0x0028c481,0x00299eb2,0x0021d2b3, -0x001a4950,0x000fef10,0x000504d5,0xfffbdcee,0xfff9160c,0xfff43f6d,0xfff5318b,0xfff621ad,0xfffabec8,0xfffdb9c8,0xfffffb67,0x00040ff9,0x0005d32a,0x00086b52,0xfffeab4b,0x000020d9,0x000008ac,0xffffe65d,0xfffff643,0xfffff2d6,0xfffff4df,0xfffff42f,0xfffff671,0xfffff1c8,0xfffff6fd, -0xffffe845,0x00000332,0xffffcd00,0x000037aa,0xffffaf65,0x00011a60,0x000433b2,0xfff871ce,0xfff37002,0xfff2b4bf,0xfff1d879,0xfff29893,0xfff671d7,0xfff8363b,0xfff9e357,0xfffa4fb5,0xfffaa40c,0xfffb6556,0xfffd9ef3,0x0000f91d,0x0003c9c7,0x00056c85,0x000792d3,0x000756a5,0x0009575c, -0x0000b226,0xffff5445,0x00002836,0x00001ea3,0x00001ae6,0x000017b5,0x00001943,0x00001638,0x00001789,0x00001688,0x00002195,0x00001520,0x00003073,0xfffffbba,0x00007dbc,0xfffebe8a,0x0001c8e8,0x000a9b13,0x0007d912,0x0007ca22,0x00054f4a,0x00031df5,0x0000f7d2,0xfffe94e1,0xfffc2d7a, -0xfff9ef72,0xfff7a9bb,0xfff7c2d0,0xfff7da72,0xfff7904f,0xfff87aa0,0xfff93c2d,0xfffa1e62,0xfffa3dce,0xfffac9df,0xfffa1e0b,0xffff201f,0x00011377,0xffff827a,0xffffbbee,0xffffcd29,0xffffc960,0xffffc8e1,0xffffcd6d,0xffffcea1,0xffffc877,0xffffc0fb,0xffffb788,0xffffdd6d,0xffff8fbe, -0xffffe7f9,0xffffbb34,0xfffd82ba,0xfffc7581,0xfffbbd83,0xfffb2d34,0xfffabc0c,0xfffab61b,0xfffa5bf1,0xfffa0ff3,0xfffa591f,0xfffa93ab,0xfffa930e,0xfffa7209,0xfffa0cfe,0xfff991f7,0xfff9f4b3,0xfffa39d8,0xfffabcc4,0xfffaf8d5,0xfffbba2c,0xfffbbdcc,0xfffc43fe,0xffffd7fb,0x0000e6f1, -0x0000db2f,0x000041c5,0x00009abb,0x0000851d,0x000095be,0x00009916,0x0000a162,0x0000a164,0x0000b4eb,0x00004d25,0x0000db6f,0x00009e83,0x00009d80,0xfffb1900,0xfffc533f,0xfffc15e3,0xfffbfc9d,0xfffbe0e7,0xfffb9dd0,0xfffb7932,0xfffb4d76,0xfffb0a81,0xfffac252,0xfffa9423,0xfffa55a8, -0xfffa3bb0,0xfffa1314,0xfffa5a01,0xfffa801b,0xfffaa084,0xfffad64b,0xfffae77a,0xfffb5e54,0xfffb0242,0xfffadfed,0xfffacb01,0xfffef448,0xfffeb420,0xfffec4cf,0xfffeae2d,0xfffeae01,0xfffea499,0xfffea2cb,0xfffe981b,0xfffea70f,0xfffea03f,0xffff1852,0xfffaab59,0xfffafb4b,0xfffa31d8, -0xffff238c,0xfffea09e,0xffff5b99,0xffff38ca,0xffff57b4,0xffff5986,0xffff4974,0xffff51d6,0xffffa568,0xffff4abc,0xffff2a0d,0xfffee823,0xffff2c55,0xffff3c10,0xffff37b1,0xffff43d5,0xffff3932,0xffff02c6,0xffff2a8e,0xffff2d6e,0xffff831c,0xffff00b2,0xfffeab73,0xfffe248d,0x00002236, -0x00000371,0x00008f7d,0x00008914,0x00007edb,0x00007733,0x00007392,0x000073de,0x000070c7,0xffffff4c,0x0000202c,0xfffe3a85,0xfffe7415,0xfffe994f,0xfffed37d,0xffff6965,0xffff506b,0xffff66a3,0xffff3406,0xffff5a60,0x00000810,0xffff3058,0xfffec6c4,0xfffe33f7,0xfffef2bf,0xffff2b0e, -0xfffef837,0xfffeff5f,0xfffeb847,0xfffe2a47,0xfffe6870,0xfffecec9,0xffff4b8f,0xfffef69a,0x00007865,0x00007b72,0x00002a1d,0x0000118e,0xfffff083,0xffffe288,0xfffff00f,0xfffff842,0xfffff7dc,0xfffff148,0x000006c0,0xfffffdeb,0x00002290,0x00008c10,0x00007b5d,0x00006375,0xfffe12c7, -0xffffa250,0xffff8891,0xfffffbb4,0xffff765f,0xffff6bb2,0x00012bee,0xffff7332,0xfffedd7d,0xfffd8cf4,0xfffeb855,0xffff3970,0xffff27ba,0xffff730c,0xffff1861,0xfffe0af2,0xfffea13a,0xffff19f0,0xffff8872,0xfffff770,0x000006b1,0xffffdc82,0x00000965,0x00000bb6,0x00000cd8,0x00000d91, -0x00000777,0x00000388,0x00000653,0x000006de,0x00000529,0x00000fa9,0x000003ee,0xfffff717,0xffffd9a1,0x00006a56,0xfffe2b6e,0xffff48d1,0xffff8e79,0xffffd2c2,0xfffed59e,0xffff65eb,0x0001b1ec,0xffff250b,0xfffd6544,0xfffbc84d,0xfffdfa39,0xffff0c57,0xfffe9863,0xfffe9255,0xfffd5bc2, -0xfffb80c3,0xfffc4d34,0xfffd9bf7,0xffff41b0,0xffffe8d1,0x000025c9,0x000009eb,0x00000d04,0xfffff658,0xfffffc1d,0xfffffa5a,0xfffffcc1,0xfffffdcb,0xfffffd05,0xfffffda3,0xfffffc32,0xfffffb8b,0xfffff8cc,0x00002931,0xfffff93d,0xffffda2b,0x00003731,0xffffb98a,0xffffc6db,0x0001fdba, -0x0002642a,0x000212ba,0xfffea059,0x00039193,0x00049037,0x0002449f,0x000101b0,0x00003217,0x00012867,0x00032813,0x0004f291,0x0006aff2,0x00056c7c,0x00048f06,0x0001ebf4,0xffff6d15,0x000047bc,0xffffdd2d,0x00000529,0xfffffeed,0x000004cc,0x00000152,0x00000263,0x000000cb,0x0000022f, -0x00000018,0x00000487,0xfffffd8a,0x00000af9,0xffffd050,0x0000559f,0xffff4d02,0x00013ae6,0x0002a2b2,0x00036107,0x00040a1a,0x0003759a,0x0001be16,0xfffdea02,0xffff3843,0x000028b5,0x000161de,0x0003ee80,0x000377da,0x0000352e,0xfffd344f,0xfffadf54,0xfffa2339,0xfffaa79f,0xfffc01a0, -0xfffe3600,0x00006167,0xfffffd12,0x0000000d,0x00000617,0xfffffc44,0xffffff43,0xfffffe09,0xffffff36,0xfffffe98,0xffffffbc,0xfffffd40,0x00000241,0xfffff5c1,0x0000145b,0xffffd813,0x000068d9,0x00000310,0x0000543e,0x00007ce2,0xffff0feb,0xfffceb49,0xfffba6c0,0xfffe1190,0x0002b23d, -0x0003650e,0x0002d98a,0x00009810,0xfffc9ff1,0xfffc550e,0xffff3ebc,0x0002d4ea,0x0005328e,0x0005dae5,0x0004b88b,0x0003796e,0x00010ccf,0xffffb0b7,0x00001607,0xfffff51f,0x000000b1,0x0000006f,0x00000239,0x0000010a,0x00000166,0x000000fd,0x00000156,0x00000151,0x000001c7,0x000001fd, -0xfffffd6d,0x00000194,0xfffff532,0x0000d5cd,0xfffd2a74,0xfffb5c39,0xfffe35fe,0x00061de3,0x00034c81,0x0000a673,0xfffe7c50,0xfffb2ac4,0xfffd0b4c,0x0003bc5f,0x000588c1,0x00050f71,0x00014a91,0xffffe295,0xfffecc85,0xfffe8998,0xfffe6b0e,0xfffeb8a5,0xffff2fc8,0x00001735,0x00001016, -0xfffffbb7,0x00000796,0xfffffa7f,0xffffff27,0xfffffd30,0xfffffe54,0xfffffe2b,0xfffffd85,0xfffffe65,0xfffffada,0x00000256,0xfffff53c,0x00002c63,0xffffbe78,0x00001882,0x000028cb,0x00079867,0x0009c103,0x000ae292,0x0008fe9a,0x00076073,0x00052825,0x0002442d,0xffffeb85,0xfffed958, -0xfffdb90e,0xfffdc06b,0xfffde3f2,0xfffeb9c8,0xffff4494,0xffffd89d,0x0000803a,0x00011e91,0x000134af,0xffff7c7c,0x00003b33,0xffffd6c6,0x00000a5a,0xffffff6c,0x000006cb,0x000002ed,0x0000045f,0x00000340,0x00000483,0x000004e3,0x0000061e,0x00000507,0xffffff3a,0xffffe769,0xfffffff0, -0xffff907e,0x000010ea,0xfffe0e01,0xfffc9b1f,0xfffc94c4,0xfffc8300,0xfffcfc06,0xfffe0fd4,0xfffe6537,0xfffed1d3,0xffff0818,0xffff3865,0xffff6e35,0xffffe565,0x00008b7c,0x00012155,0x00018e4c,0x0001da2c,0x0001cddd,0x0001c883,0xffff69c3,0x00003d68,0x0000088b,0x00000752,0xfffff303, -0xfffff8b5,0xfffff69a,0xfffff85c,0xfffff84c,0xfffff784,0xfffff393,0xfffff704,0xffffed8c,0x00000dd0,0xffffed36,0x00007836,0xffff4412,0x0002c63c,0x000231ee,0x00021cf1,0x00019bf1,0x00011527,0x00008e14,0x000001e8,0xffff685b,0xfffedc21,0xfffe4b59,0xfffe55f2,0xfffe60bc,0xfffe5813, -0xfffe8c3b,0xfffeb167,0xfffee419,0xfffee775,0xffff1697,0xfffee065,0x0000650d,0xffffdba5,0xffffcf37,0x000005cb,0x00001036,0x0000151f,0x0000137e,0x0000130a,0x0000100d,0x00001571,0x000019d7,0x00001d0d,0x000014a8,0x0000165b,0xffffddcb,0x00002ad0,0xffff934a,0xffffa90d,0xffff2a28, -0xffff2add,0xffff091a,0xffff0cbd,0xfffefb24,0xfffeeb9b,0xfffeeb3c,0xfffeea16,0xfffeda42,0xfffec1c9,0xfffe96d6,0xfffe6571,0xfffe7309,0xfffe79e0,0xfffe90e3,0xfffe8f70,0xfffec46e,0xfffe800f,0xffff0625,0x0000bce6,0x0000657b,0xfffffd33,0xffffd8a8,0xffffd14f,0xffffc309,0xffffc858, -0xffffc40c,0xffffc4b2,0xffffbada,0xffffcd42,0xffffd596,0xfffffcd9,0x00007843,0x0000740d,0xfffed1d5,0xffff4a9e,0xffff440e,0xffff3e6d,0xffff34fd,0xffff2752,0xffff1e63,0xffff18a6,0xffff01af,0xfffeeb5a,0xfffeda7f,0xfffec55c,0xfffeb9a5,0xfffea925,0xfffeb804,0xfffebd16,0xfffec275, -0xfffeca6b,0xfffec8a8,0xffff02a2,0xfffe5abf,0xfffe87fd,0xfffe61a0,0x00008947,0x00004c91,0x00009b73,0x00009b06,0x000097a3,0x00009869,0x00009728,0x00009918,0x000093ea,0x000056c5,0x0000849f,0xfffe9273,0xfffed20a,0xfffec5f7, +const Word16 defaultHRIR_rom_Alpha48_Q_fx = 14; +const Word16 defaultHRIR_rom_AlphaL48_fx[470 * 128] = { +2196,437,2620,2054,2197,2199,2307,2350,2385,2307,2258,2205,2160,2123,2102,2085,2065,2056,2023,1908,2395,344,-284,-1067,727, +-254,-967,-1015,-962,-744,-990,-1062,-1012,-253,995,-969,-365,-507,2274,2569,2558,2708,3008,3150,3172,2983,2806,2631,2493,2403, +2356,2311,2242,2234,2066,2129,1777,-305,1050,805,801,521,938,1041,896,504,989,1447,969,1091,665,568,1673,579,2009, +3009,2805,3152,3728,3995,4075,3714,3369,3088,2820,2633,2525,2431,2302,2289,1940,2092,1185,303,405,452,489,51,500,35, +827,-132,708,24,360,406,503,296,1022,243,1899,3142,3071,3630,4588,5040,5098,4443,3850,3353,2935,2662,2554,2413,2243, +2211,1843,1779,960,-34,592,-85,207,192,167,37,21,264,58,284,350,397,258,419,953,634,3000,4275,4236,4619, +4993,5290,5488,5627,5429,4616,4592,4274,3776,3610,3283,3031,2304,2209,1181,-48,596,152,172,-18,68,69,168,255,141, +274,159,557,248,652,653,175,2144,4893,4691,5413,5615,5755,5614,5454,5110,4549,4434,4374,4416,4091,3693,3473,2612,2528, +1233,216,402,238,510,374,128,181,117,87,115,115,432,283,960,678,1308,242,2935,6359,6403,7310,6519,6132,5738, +5152,5086,5668,6050,6059,5736,4966,4129,3449,2587,2637,1163,566,759,188,304,287,147,123,182,279,242,157,160,-288, +892,-197,1377,492,3891,6816,6296,6182,5703,5610,5535,5591,5574,5370,5305,5062,4594,4192,3623,3056,2415,2435,1360,-88,558, +454,377,315,141,342,53,487,317,172,642,251,1077,278,1417,935,4223,6115,5629,5588,4990,4815,5022,4761,4956,5375, +4990,4559,4094,3323,2699,2381,2154,2438,1677,173,966,295,284,439,369,216,382,-68,306,322,519,555,473,477,1796, +-467,2951,4403,3700,3826,3866,3976,4049,3794,3492,3331,3359,3371,3253,3106,2811,2545,2314,2644,1339,169,1080,248,519,484, +295,236,102,843,385,377,618,455,759,762,1464,1031,2204,3239,2954,3404,3457,3627,3739,3661,3612,3519,3192,2860,2452, +2343,2136,2043,1837,2307,1582,407,549,542,606,8,574,-39,1035,-307,752,-16,356,502,507,320,1240,-820,2273,2592, +2516,2702,2758,2884,3013,2856,2712,2587,2419,2269,2021,2040,2011,2048,1961,2084,1828,-394,1232,1005,1021,693,1244,1396,1153, +673,1288,1758,1125,1281,813,719,1794,544,3089,2416,2568,2594,2630,2660,2723,2633,2575,2508,2461,2418,2356,2385,2380,2383, +2376,2286,2908,398,-379,-1346,888,-345,-1257,-1328,-1245,-965,-1276,-1328,-1239,-349,1155,-1222,-447,2815,6056,4288,6384,5667,6014, +6054,6312,6409,6500,6294,6167,6034,5925,5827,5752,5692,5635,5587,5525,5250,5893,3929,2483,-354,4467,2580,-110,-96,-33,324, +95,85,207,2692,4960,21,2568,2156,6749,6790,7186,7520,8295,8603,8653,8117,7666,7255,6917,6653,6468,6293,6115,6008,5715, +5528,5330,1798,3901,3806,3349,2921,3792,3905,3990,3305,4112,4483,3781,4189,3477,3610,5365,4167,6270,7572,7963,8773,10316,10891, +11083,10102,9219,8518,7866,7368,6983,6640,6285,6087,5392,5222,3890,2647,2325,2456,2369,1461,2299,1257,2773,1340,2493,1607,2318, +2463,2785,2788,4296,3290,6371,7932,8744,10194,12743,13745,13796,11965,10431,9234,8258,7471,7003,6512,6022,5743,4918,4333,3074,1116, +1790,494,897,721,584,409,204,869,506,1065,1345,1729,1941,2135,3729,5170,8455,10492,11656,12908,13863,14708,15503,15876,15262, +12881,12700,11940,10966,10241,9355,8546,6944,5997,4096,1589,2081,1379,987,532,464,488,657,1004,873,1309,1366,2289,2292,3147, +4207,4198,8040,12668,13626,15226,16011,16528,16489,16427,15608,14061,13727,13212,12759,11504,10229,9292,7483,6750,4491,2560,2286,1788,1806, +1409,838,826,739,656,936,919,1885,1874,3667,3615,5386,4874,10534,15672,16516,17338,16371,15723,15537,14898,15123,16121,16080,15364, +14151,12301,10547,9206,7299,6625,4267,3275,2921,2037,1817,1499,1113,862,1030,1502,1088,1112,1311,1054,3610,2706,5476,6110,12148, +15191,15248,13909,14418,15184,16065,16090,15868,14945,14642,13864,12534,11409,9903,8128,6692,6118,4810,2086,3011,2665,2037,1775,1197,1352, +961,2620,1645,1275,2381,1663,3932,2851,5259,6766,11931,14483,14758,14428,14070,13951,14734,14007,14202,14656,13643,12446,11211,9266,7809, +6833,6777,6957,6024,2720,3960,2219,2006,2375,1850,1305,1776,950,1864,2071,2825,3075,3056,3380,7405,4074,9808,11798,11291,11354, +11948,12255,12435,12097,11501,10997,10570,10082,9395,8693,7890,7206,7141,7673,5278,3180,4536,3001,3105,2423,1727,1660,1265,3158,2130, +2232,2953,2807,3949,4107,6382,5618,7952,9590,9579,10459,10777,11154,11483,11161,10896,10562,9759,8952,7954,7644,7153,6744,6329,6941, +5809,3667,3437,3252,3209,1699,3078,1361,3978,1346,3150,1715,2432,3092,3455,3518,5534,1558,7993,8088,8211,8530,8728,9010,9370, +8995,8692,8409,8025,7675,7136,7062,6917,6868,6716,6697,6553,1758,5187,5185,4779,4183,5492,5761,5713,4540,5855,6255,4968,5498, +4487,4650,6760,5462,8783,7592,7985,8009,8116,8184,8331,8120,7985,7828,7721,7620,7489,7528,7514,7490,7483,7204,8307,5062,3025, +-932,5996,3201,-559,-620,-525,53,-403,-379,-172,3242,6571,-480,2987,8715,3420,5574,2367,3261,3228,3390,3379,3383,3382,3359, +3345,3341,3313,3270,3189,3128,3077,3025,3001,3052,2356,5364,6150,6212,4732,6031,6071,6205,6148,5900,6321,6475,6446,6144,4511, +6416,6575,7128,3862,3508,3991,4206,4267,4277,4234,4134,4092,4113,4051,3891,3638,3428,3296,3143,3162,2830,3291,5619,3742,4077, +3804,3995,3528,3325,3663,4211,3529,2927,3736,3829,4585,4911,3755,5540,4332,3255,4532,4993,5154,5131,5062,4989,4941,4888,4747, +4506,4044,3669,3378,3066,3050,2398,3220,3995,3335,3227,2831,3017,2505,2858,2064,3286,2201,3236,3131,3476,3709,4406,4214,5631, +4866,3630,4999,5784,6092,6081,5814,5552,5421,5434,5284,4806,4037,3471,3049,2616,2435,1946,2434,2760,1683,1776,1196,869,667, +721,660,663,929,1025,1499,2112,2963,3010,3450,6701,3527,3360,5517,6770,6701,7088,7611,8254,8350,8065,7442,7149,7350,6265, +5657,5159,4930,3727,3649,3805,2349,2181,1561,1347,917,913,899,1155,1196,1453,2090,2142,3337,3551,5217,8662,7154,4259,6493, +7234,8008,8734,9209,10330,10438,10068,9564,8395,6745,5591,4769,4010,4381,3752,4380,4762,3461,2869,1665,1251,1184,980,1135,1327, +1507,1803,2408,3228,3578,5117,5742,9474,7923,3191,4254,3022,5326,6394,7544,9374,9851,8272,5647,3726,2621,2534,2852,3412,3530, +2553,3992,4324,3377,3874,2706,2247,2156,1855,1869,2637,1753,2059,2575,4205,4191,7061,5695,9802,5904,1152,3628,4052,6309,7906, +9713,9097,8066,6636,5833,5125,4553,4285,3970,3185,3199,2546,4102,5320,4251,3976,3157,2686,2231,1592,2118,4294,2483,2189,2262, +3189,3525,5412,5730,8832,4926,3560,6296,6705,8939,9753,9818,9178,7957,6204,5484,4886,4536,4258,4260,3934,4833,4483,5483,5964, +4771,4287,3857,3552,2870,2355,2566,3277,3088,3365,3744,4067,4508,5600,5614,11045,7131,6177,8316,8720,9782,9962,9607,9717,9645, +9137,7683,6349,5385,4600,4375,4428,5525,5345,6177,6771,5370,5657,4496,3574,3060,3036,3076,3541,3593,3711,3774,4558,5224,5909, +6784,7902,7988,7467,8524,8729,8691,8523,8529,8023,7494,7036,6963,6887,6747,6695,6692,6411,6260,5492,5993,6611,5862,5431,5016, +4783,4627,4438,4287,4924,4114,4686,4345,5190,5849,6835,7032,9086,7595,7027,7380,7360,7541,7659,7852,7849,7944,7968,8007,8015, +8123,7792,7493,7185,7061,6630,6810,7373,6451,6854,6513,6483,6130,6006,6610,6873,6508,5883,6309,6595,7144,7557,7128,8659,5856, +6434,6447,6429,6491,6514,6549,6557,6567,6585,6585,6580,6622,6508,6462,6372,6313,6213,5705,8481,8916,7732,7933,8821,7866,8017, +7877,7704,8046,8178,8103,8931,7951,8019,9199,6887,-1424,-235,-2149,-1300,-1648,-1589,-1803,-1881,-2033,-1781,-1649,-1506,-1446,-1403,-1398, +-1418,-1415,-1401,-1355,-1055,-1767,64,1818,5741,-713,1545,5279,5213,5120,4778,4919,4942,4829,1467,-1226,5402,1808,3056,-2041,-1827, +-2174,-2311,-2975,-3225,-3429,-2707,-2209,-1770,-1540,-1435,-1481,-1566,-1563,-1532,-1302,-1073,-1089,2808,282,36,615,963,-254,-318,-529, +254,-668,-925,77,-234,794,646,-1062,266,-1084,-2177,-2277,-2725,-4223,-4714,-5262,-3816,-2742,-2014,-1605,-1467,-1543,-1704,-1713,-1665, +-1082,-905,204,1080,1320,903,733,1449,435,1566,24,1399,223,1096,594,868,852,919,-295,1374,-659,-1829,-2462,-3540,-6121, +-7069,-7594,-4900,-2956,-1648,-1055,-770,-1105,-1459,-1514,-1489,-838,-232,607,1832,1035,1642,932,757,681,678,858,439,630,372, +564,814,939,1076,57,-750,-3813,-4361,-4856,-5344,-5979,-6536,-7524,-7636,-6777,-3090,-4097,-4101,-3632,-3859,-3618,-3145,-1689,-1018,321, +2335,1367,1158,1060,1069,863,901,743,507,337,154,489,12,454,195,-80,2942,-1712,-7780,-8141,-7758,-7517,-7612,-8196,-7857, +-7211,-5681,-6479,-7040,-7699,-6740,-5500,-4480,-2115,-1315,505,1981,1435,1036,354,170,400,344,665,1380,1046,1493,1437,1835,583, +1779,487,2032,-4728,-9703,-9020,-7334,-5163,-3914,-5084,-4500,-6038,-9402,-11027,-11297,-10443,-8651,-6919,-5558,-3193,-2129,364,980,1268,1942, +1177,1218,1705,1959,1817,2347,1417,1458,1709,2865,691,2523,272,407,-5806,-6595,-4566,1590,-881,-2965,-5334,-6213,-7526,-8004,-9093, +-9272,-8372,-7405,-5814,-3885,-2319,-1574,-208,2902,1743,1771,1766,1414,1595,754,1656,3172,1627,1476,904,2167,489,2501,1181,-600, +-5629,-5281,-4271,-2495,-1683,-1607,-4044,-4502,-6287,-7948,-7889,-7211,-6257,-4342,-2893,-2028,-1852,-1799,-356,3467,1513,2760,2622,1686,1895, +1925,1768,3485,1948,1702,894,1048,1578,2050,-2298,3681,-2501,-3579,-1815,-555,-841,-1321,-2483,-3081,-3203,-3293,-3823,-3868,-3382,-2842, +-2037,-1377,-860,-1679,1003,3536,1101,2456,1638,1983,2381,2392,2946,1211,2516,2315,1214,2021,1215,1849,-126,2762,293,-1070,-202, +-410,-1326,-2061,-2551,-2644,-2779,-2835,-2073,-1386,-531,-249,282,670,734,-484,551,2891,2824,2682,2442,3995,2085,4086,926,3896, +1891,3804,2950,2995,3083,3783,2054,7930,-453,-359,-324,-470,-410,-429,-569,-201,140,411,842,1231,1889,1664,1501,1266,1131, +853,725,6745,1875,1581,1966,2391,274,101,236,1831,261,-253,1473,1198,2951,2984,469,2090,-2440,-736,-1177,-1154,-1175,-1176, +-1215,-987,-808,-601,-483,-377,-189,-412,-514,-621,-716,-469,-2061,2299,5041,10454,684,4512,9667,9783,9639,8946,9506,9542,9249, +4628,99,10173,5410,-1556,1100,-660,1862,1024,1109,907,1052,1068,990,971,933,899,880,887,961,963,1001,1049,1118,1048, +1635,-595,-1626,-2263,-139,-1571,-2201,-2286,-2265,-2012,-2419,-2523,-2458,-1631,131,-2453,-1981,-2300,1328,1416,1133,839,1066,1029,846, +945,916,837,767,832,1052,1069,1149,1288,1375,1585,1267,-1114,500,164,180,-26,356,596,433,-86,481,879,237,297, +-370,-502,875,-245,1504,2508,1435,712,1001,1048,594,667,540,503,388,370,725,710,911,1211,1408,1930,1160,268,555, +336,579,201,523,195,1095,6,708,-264,96,2,139,-371,448,-184,1728,2899,1805,559,578,414,25,687,976,929, +769,927,1477,1380,1531,1896,2203,2466,1867,841,1242,762,977,983,853,784,684,1054,568,733,671,553,176,396,1373, +-263,4758,5406,3233,2096,3096,2666,1479,-1470,-3140,-3260,-3417,-3666,-4353,-3380,-2522,-1735,-826,412,650,415,1071,904,729,513, +616,784,801,588,371,504,427,1432,804,1234,611,-2702,378,5256,3491,3890,2782,1079,-423,-3803,-5136,-5391,-5622,-4619,-2596, +-989,217,1123,1171,1625,818,-426,69,39,746,717,227,462,608,1302,1085,1093,1317,603,1231,211,532,-3033,956,9297, +8878,10518,7894,6487,3656,-295,-2787,-2630,-24,1916,3144,3198,2927,2255,2585,3631,1670,688,1131,26,547,575,679,1242,1388, +1872,1118,771,715,-671,233,-2589,755,-1696,5466,10730,8798,9828,6548,3615,-322,57,592,1577,1843,1949,2053,1635,1800,3034, +3016,3564,1587,-151,881,668,868,809,1018,767,989,2060,1313,1183,1842,905,1743,143,1182,-668,3625,5130,2881,3085,256, +-1419,-2843,-2843,-1778,792,1725,2416,2539,2983,2819,2876,1010,767,-179,-597,35,285,337,200,797,1330,1331,1501,849,582, +201,851,1123,479,2248,-4159,-213,-42,-1434,-1408,-2512,-3054,-3280,-3410,-3523,-3001,-1381,373,1656,2721,2848,2252,283,-427,-1307, +-1121,-486,-784,95,766,1178,1272,1283,129,719,644,563,-205,-563,-531,-960,-772,-2139,-2100,-2352,-2475,-2307,-1960,-1704,-848, +35,877,927,943,1109,752,479,534,272,208,-533,-920,-498,-355,-142,349,-69,542,-26,239,495,644,874,575,420, +105,-621,-1390,-2738,-2166,-2297,-2244,-2286,-2352,-2477,-2468,-2569,-2583,-2550,-2456,-2402,-2210,-1995,-1850,-1861,-1727,-1798,-170,-970,-1375, +-1218,-1046,-1435,-1318,-1725,-1636,-1713,-1558,-1497,-1677,-1655,-1720,-2189,-2635,-2331,-2198,-2287,-2223,-2232,-2203,-2176,-2138,-2090,-2056,-1996, +-1950,-1909,-1940,-1999,-2016,-2003,-1880,-2057,-2463,-2365,-103,-2587,-2484,-742,-812,-734,-730,-825,-848,-842,-2539,-2831,-346,-2442,-2504, +1652,2452,1634,1707,1754,1716,1686,1643,1654,1452,1346,1277,1300,1334,1398,1447,1490,1519,1522,1473,1345,2131,1972,529,2126, +2035,650,794,825,802,944,969,989,2075,2245,679,2238,2105,2417,2167,2390,2286,2208,1999,1980,1424,1190,1112,1162,1253, +1444,1582,1689,1698,1734,1507,1709,1624,1458,1773,1468,1465,1617,1599,1851,1943,1784,1571,1600,1644,1680,1975,2121,3316,2871, +2603,2821,2632,2742,2401,2458,1183,392,144,217,523,932,1286,1597,1667,1743,1358,1513,1708,1188,1273,1254,1234,1082,1194, +1247,1558,1183,1376,1529,1445,1641,2226,2765,3260,2963,2558,3136,3061,3171,2689,2677,777,-167,-304,41,311,1000,1534,1838, +1831,1794,1333,1410,1594,870,930,849,866,604,806,772,959,853,837,1088,953,1441,1787,2798,7089,8136,6881,6889,6545, +5418,4300,3947,1860,-193,-4336,-3156,-2331,-1360,-445,665,1638,1772,1449,1128,902,666,1141,774,661,500,683,856,1064,1182, +1685,2300,3177,3983,4378,5345,3653,6714,10139,10622,7239,4900,3935,5611,3931,3183,1925,3207,4174,5222,5158,4566,3746,2716,2121, +2139,1390,989,1192,1135,1136,773,1044,1053,1250,1274,1228,1079,1314,2044,2150,3631,5742,9033,5310,2384,-4358,-2576,-1443,1997, +2467,3702,5224,5760,5717,5440,5606,5884,6130,5293,4000,3299,3076,2087,1268,1358,946,316,493,860,1867,1309,1279,1380,1645, +2542,3544,3319,6330,3396,-5274,-6550,-12804,-7272,-4112,-611,83,1606,2775,4504,5531,5776,5750,5361,4804,4624,4056,3577,2260,1699, +1445,1287,1333,1183,1310,1356,1374,1352,1589,1354,1721,1585,2398,2438,3957,-36,-6034,-5715,-7002,-5459,-4492,-1889,-496,1246,2288, +3502,4233,4717,4825,4954,5204,4415,3148,1751,435,653,696,337,541,442,1203,1089,636,821,1032,1046,1712,2046,2206,2221, +2590,-883,-3049,-3016,-4192,-3071,-2250,-791,1463,2980,3919,4411,4431,4238,4089,3739,3410,2181,1758,773,64,550,177,535,526, +577,680,438,-17,-67,302,1179,569,457,497,669,-1603,-1562,-2200,-2606,-3452,-2069,-1071,-248,566,1307,2143,2280,2582,2967, +2387,1830,1303,1080,882,667,485,309,258,245,28,255,9,232,291,209,117,119,-82,-43,-314,-1015,-1787,-1491,-1792, +-1803,-1981,-2208,-2535,-2744,-2679,-2601,-2475,-2397,-2322,-2209,-2115,-1917,-1785,-1581,-1473,-1237,-1585,-988,-659,-730,-547,-167,-297,-205, +-426,-446,-508,-747,-900,-1340,-1297,-1188,-1424,-1303,-1406,-1410,-1429,-1519,-1575,-1696,-1675,-1704,-1745,-1720,-1702,-1705,-1580,-1488,-1399, +-1328,-1293,-1121,-1062,-1368,-2499,-775,-1166,-2244,-2252,-2283,-2284,-2268,-2318,-2292,-1307,-843,-2697,-1707,-1283,583,370,297,574,457, +546,282,208,230,371,463,535,597,643,649,662,645,620,545,574,449,337,820,2099,223,738,1963,1949,1955,1940, +1898,1906,1893,745,118,2254,1022,1929,165,459,259,301,-316,-397,-187,100,356,538,751,849,836,902,846,749,567, +586,371,1219,791,602,843,859,527,616,466,632,405,401,645,619,996,1074,539,1033,240,-182,-87,143,-1030,-1368, +-876,-318,156,315,679,1001,1098,1302,1230,1062,769,644,562,753,814,891,785,834,604,944,774,925,670,759,748, +896,949,1375,858,1252,-141,-812,-891,-502,-1781,-1931,-1203,-680,-329,-29,421,781,877,1233,1207,936,593,573,424,973, +1139,855,910,855,701,803,860,919,523,352,511,755,1142,1493,285,2905,-1289,-2743,-2335,-3543,-6176,-6855,-5954,-2409,302, +1459,1877,2548,3550,3686,3439,3180,2160,1717,1248,879,1149,836,923,811,485,781,899,1081,1014,1160,1672,919,1585,1621, +2126,4750,-383,-8838,-9055,-11561,-9377,-7044,-4745,-1140,961,2411,2963,2889,2177,1743,1392,1239,882,826,1159,1673,1381,1198,888, +757,786,1066,1060,1104,888,1004,483,1289,320,1555,660,1968,-6286,-17499,-16741,-16141,-12837,-11158,-9276,-5460,-3171,-2404,-2872,-2628, +-1934,-1172,-641,-265,37,-5,1233,1821,1628,1540,1193,993,432,291,614,1695,1169,1171,1055,2537,253,3012,-1575,-3811,-14092, +-15154,-13422,-10786,-10932,-10394,-8703,-8450,-8339,-7846,-7553,-6313,-4488,-2278,-867,-742,229,391,1003,1774,622,799,922,974,745,1435, +1167,-312,465,716,-568,833,-1370,152,-2530,-6258,-9697,-9307,-8985,-8360,-6092,-3938,-2659,-1944,-2839,-5073,-5609,-5372,-4188,-3608,-2381, +-1047,470,843,685,1312,945,1144,856,717,505,723,548,152,355,101,-516,-1489,-1812,-2090,-6782,-1765,-5417,-5060,-4867,-4398, +-3212,-2045,-1157,-1251,-751,-474,-1161,-1777,-1735,-2092,-1834,-1194,-97,139,807,598,-25,213,-190,-30,202,153,183,141,100, +143,-173,28,-713,-1135,-2362,-2805,-2332,-2201,-2527,-2617,-2856,-3197,-3468,-3844,-4277,-4748,-4432,-4082,-3742,-3345,-2925,-2736,-2401,-2369, +-1378,-175,-384,-272,-153,173,-141,96,-353,-217,-414,-445,-563,-1207,-1665,-2230,-2328,-1258,-1028,-1068,-1241,-1322,-1405,-1433,-1518, +-1433,-1307,-1224,-1156,-1146,-1032,-1100,-1202,-1244,-1153,-1071,-1250,-1088,-1105,-1143,-1039,-938,-871,-803,-910,-770,-722,-428,-412,-538, +-672,-913,-749,-1743,-597,-771,-829,-869,-940,-1005,-1080,-1105,-1156,-1190,-1261,-1324,-1405,-1311,-1196,-1103,-1096,-1016,-938,-1695,-1553, +-1049,-1430,-1464,-892,-933,-905,-947,-1011,-1103,-1095,-1416,-1288,-1279,-1638,-799,1979,1456,1693,1479,1546,1493,1734,1909,2116,2291, +2379,2372,2275,2193,2128,2042,1968,1908,1849,1733,1936,1608,929,-240,1790,965,-181,-150,-138,-19,-146,-150,-113,995,1807, +-111,791,516,1385,1045,1123,1146,1810,2428,2968,3476,3565,3301,2974,2739,2603,2408,2267,2178,1985,1847,1908,753,1573,1601, +1315,1228,1535,1637,1739,1473,1642,1584,1250,1381,1097,1265,1424,401,403,59,176,221,1368,2526,3549,4763,5282,5049,4569, +4006,3692,3157,2746,2477,1987,1879,1543,1384,1434,1356,1285,1009,1206,1001,1475,1128,1058,689,764,867,888,800,619,-140, +-59,-570,-437,-183,1820,3646,5205,6716,6923,5877,4752,4100,3725,3133,2716,2554,2022,1724,1448,1023,1315,1081,1104,949,808, +944,816,1019,492,421,285,556,744,622,18,-2182,-4657,-5393,-5517,-5998,-3565,-1174,1282,4077,6709,10087,9581,8827,7319,6393, +5001,3528,2403,2003,2297,1969,1852,1476,1271,1067,697,1034,1052,977,817,583,491,-189,-630,-798,-838,-3415,-6420,-8099,-8163, +-4598,-1640,-822,-3076,-964,545,2813,2374,2679,3196,3172,3264,3245,2743,2362,1750,1504,1604,1214,1159,993,739,955,1021,1233, +990,883,768,664,7,-687,-2732,-8157,-8244,2202,5563,11859,4940,343,-4784,-5700,-5147,-2513,-308,1694,3002,2256,1758,1515,1745, +2328,1618,1241,1361,1334,1265,1148,919,758,912,1433,628,239,164,-1020,-1916,-4296,-2855,-7108,2692,13081,11163,11923,6887,4446, +1125,1476,1342,1044,989,1032,1130,1272,1450,1559,1121,1051,1103,609,940,873,829,764,627,1289,1060,-113,675,329,231, +-739,250,-2330,-2544,-2372,5247,9412,7369,7574,4836,3567,2693,1885,2017,3349,3083,2477,1658,707,-66,-784,255,1122,1662,1245, +1229,674,910,1014,887,692,702,76,244,18,485,-465,-1131,-2000,1845,-4926,3243,4661,2954,3141,1769,1330,973,-300,-1265, +-1486,-1008,-300,147,-145,-414,-854,-39,482,384,368,793,913,551,372,538,256,123,756,627,469,109,-161,144,-586, +170,727,933,2018,1995,2690,2013,1452,812,454,157,-234,-924,-1724,-2623,-2194,-1883,-1581,-1367,-701,-884,-1340,-1158,-939,-514, +-651,20,-505,651,-443,276,-465,-55,-65,-131,-328,707,-1765,2152,2287,2257,2396,2485,2721,2932,2640,2286,1959,1588,1288, +732,854,825,897,891,1011,990,-1283,708,826,652,527,1476,1603,1510,954,1621,1756,1173,1296,675,642,1520,1307,2847, +2073,2295,2286,2368,2401,2507,2339,2258,2169,2091,2020,1913,1958,1949,1946,1950,1822,2387,633,-536,-2624,1425,-201,-2331,-2354, +-2215,-1917,-2083,-2021,-1864,-124,1788,-2261,-252,2532,-916,500,-1716,-1116,-1267,-1192,-1069,-972,-880,-897,-875,-832,-864,-884,-915, +-901,-899,-895,-899,-742,-1340,760,1900,3272,211,1780,3079,3161,3127,2837,3070,3072,2974,1728,-156,3008,1844,1685,-1658,-1753, +-1629,-1481,-1220,-1067,-933,-973,-939,-840,-907,-952,-1014,-1006,-969,-965,-882,-946,-661,2016,153,389,454,737,147,50,160, +753,54,-280,275,-121,404,443,-749,-261,-1875,-2672,-2439,-2362,-1697,-1246,-967,-1020,-800,-429,-518,-671,-919,-971,-983,-1034, +-814,-1037,31,842,747,590,375,954,284,1169,105,1352,390,1097,659,356,184,270,-495,-270,-2136,-2587,-2340,-2351,-1757, +-1310,-985,-985,-615,-159,-179,-412,-736,-839,-854,-900,-840,-771,189,1167,299,1230,524,483,446,725,953,643,783,525, +547,-223,-367,-252,-309,-2914,-2844,-2692,-3217,-1671,-277,225,-183,-1339,-2162,-1668,-1094,-936,-862,-1871,-1940,-1511,-757,-847,-91, +1511,513,881,769,901,690,875,825,682,558,317,193,341,138,-582,-1787,-4610,-1569,5681,6404,6316,1428,-1639,-3448,-4451, +-4568,-4667,-3103,-2080,-1500,-892,-557,-721,-27,-248,543,1375,1013,966,650,664,574,746,892,1121,711,458,115,-459,-907, +-1832,-1845,6,5964,8539,4359,-2296,-2853,-2744,-902,-1354,-921,-1556,-2518,-3725,-4754,-4050,-2653,-591,-221,-829,435,746,327,1157, +918,1004,875,1124,992,749,302,101,142,-711,236,-846,656,6001,7693,-1539,-3485,-9819,-3729,-163,3424,2630,2802,2475,3515, +3113,1544,550,-276,-535,-866,-1474,-388,1478,483,346,188,122,185,699,1172,851,1211,969,437,241,574,552,1813,6184, +2708,-2543,-2018,-3491,-2082,-1843,-420,352,1906,3196,4052,4131,3408,2926,1896,360,-435,-1416,-749,793,-442,162,517,519,523, +741,724,817,450,707,1297,1750,1924,2701,3983,4882,1848,43,811,185,-258,-809,-808,1116,2064,2380,2328,1804,919,305, +15,-2,-164,-251,109,810,593,750,685,729,723,433,329,384,288,320,614,908,1227,1362,1754,1477,1364,701,852, +447,809,1173,1414,1673,1961,2478,2572,2743,2927,2762,2521,2358,2131,2175,1388,560,1135,1157,979,674,1026,860,807,1143, +666,936,575,1045,1389,1996,1493,2787,1064,747,869,783,737,581,512,657,782,894,1021,1131,1191,1290,1460,1601,1631, +1717,1974,1457,1362,1499,1691,1565,1376,1083,1346,1557,1128,769,1132,1063,1469,1573,1073,2087,323,766,717,711,711,724, +686,835,943,1042,1159,1281,1434,1377,1315,1263,1282,1199,1149,2323,2817,2504,1866,2722,2878,2955,2846,2692,2890,2932,2830, +2680,1596,2800,2833,848,-457,-1547,165,-192,-121,-116,-417,-640,-945,-955,-947,-859,-726,-623,-551,-485,-443,-425,-382,-360, +-116,-1488,-1701,-786,-1327,-1704,-847,-932,-921,-813,-1028,-1095,-1076,-1776,-1163,-1089,-1935,-2140,-145,555,285,263,-538,-1198,-1955, +-2134,-2041,-1609,-1154,-842,-723,-555,-489,-464,-398,-168,-463,-1083,-537,-844,-603,-639,-628,-419,-615,-807,-496,-232,-462,-600, +-902,-1195,-407,-1230,10,2027,1244,1236,-444,-1814,-3293,-3644,-3434,-2788,-2070,-1447,-1214,-804,-647,-540,-327,41,-307,-667,-371, +-469,-321,-338,-202,-81,293,-190,335,-88,48,-415,-503,-880,-312,-1009,605,3201,2218,1907,-710,-2759,-4997,-5517,-4881,-3233, +-1912,-1073,-914,-615,-425,-406,-107,204,160,139,485,395,423,477,486,657,819,973,669,716,695,70,-532,-105,428, +-956,2964,4682,4124,3675,737,-1629,-4109,-4688,-5605,-6347,-5641,-4875,-3527,-2593,-1957,-1623,-799,-143,-336,-541,-129,-36,252,447, +504,713,674,577,545,633,470,943,547,300,-980,615,2153,477,-809,-3770,-4052,-3265,-966,-2431,-4067,-6756,-6083,-6114,-6246, +-4970,-3599,-2114,-1453,-1048,-900,-213,60,273,443,552,577,790,840,814,244,-141,-488,-906,-699,-556,474,3515,-256,-10908, +-11401,-11299,-3213,1740,5748,5586,4138,1545,859,-65,-977,-696,-1157,-2057,-2565,-2607,-1903,-1477,-1064,-549,-138,344,231,1099,1058, +170,708,795,167,1064,840,2118,-115,-879,-9875,-9913,-5841,-1227,-902,-687,985,1920,2667,3667,2245,1350,931,750,304,-250, +-190,-449,-1899,-1363,-1232,-1199,-779,-545,-498,548,788,175,690,702,-330,401,-915,149,-739,-3473,-4766,-2037,-1808,-2352,-1019, +402,1172,2524,2576,1675,1148,1205,1443,1332,1061,950,-859,-1399,-2085,-1562,-999,-483,-339,-158,448,579,700,881,847,658, +-85,-314,-496,-622,-4418,-111,-2983,-1772,-1427,-1315,-476,-174,-65,-627,-398,-108,-123,-16,499,1003,1323,1620,769,443,25, +-382,-46,-364,499,882,668,798,771,645,311,124,-47,382,150,309,-534,-697,-531,-526,-519,-372,-499,-437,-180,-231, +-274,-371,202,755,1327,1297,1358,1527,1774,1949,2147,1939,1995,1972,1579,1369,890,979,341,365,306,473,332,7,-310, +-592,-772,787,-635,-446,-464,-417,-343,-312,-376,-227,-42,108,313,464,789,834,911,905,851,761,789,1603,668,263, +240,144,-418,-339,-491,-344,-404,-309,-131,-148,86,62,-171,-674,-383,-137,-221,-195,-207,-192,-177,-94,-39,29,47, +67,85,37,23,31,56,138,5,6,224,1651,-449,-166,1188,1173,1158,1115,1043,999,939,-270,-761,1279,-223,-206, +609,1350,908,911,985,892,662,531,452,431,401,372,408,434,470,443,443,436,467,422,416,936,486,-1095,1064, +611,-915,-799,-762,-746,-624,-592,-575,697,1326,-961,730,772,1868,1586,1741,1486,903,520,363,200,153,134,193,228, +300,249,259,243,349,196,473,96,306,631,335,367,688,719,973,888,941,763,621,866,804,993,1269,2246,2325, +2473,2732,2378,1110,404,35,-217,-476,-649,-530,-363,-121,-173,-105,-107,10,-188,41,382,113,92,267,353,404,443, +607,732,573,711,719,842,940,1372,1859,3020,3433,3139,3828,3552,1658,253,-327,-896,-1015,-1026,-904,-771,-469,-542,-476, +-435,-245,-628,-331,361,-238,212,201,298,123,553,672,692,618,582,653,1088,1721,1788,2211,2437,-25,-1327,-171,-1023, +-121,979,2482,995,-314,-2472,-2741,-2624,-2442,-1296,-819,-1223,-733,-940,-455,80,-482,214,106,406,522,636,679,660,921, +1046,1121,589,742,603,1571,1163,-1948,-7255,-6613,-3523,1055,3774,5871,5658,5117,4850,2663,1451,1042,404,-143,-653,-1120,-1378, +-859,-685,-224,155,173,461,649,930,949,609,390,113,-165,414,338,498,-504,-4242,-7069,-189,5036,11421,8130,6225,4334, +5037,5409,7584,8902,9956,10323,9150,7269,4531,2665,1679,-475,-1213,-1216,-1394,-701,-454,-326,698,939,34,917,822,28,173, +-783,-1179,-1565,-5083,1089,10662,10124,11838,6756,4836,2721,4958,6330,7082,6593,6548,6944,5595,4576,3952,2860,2400,968,-1169,-119, +-277,-28,259,188,757,735,-269,417,224,-94,-385,96,-972,-1912,-138,4181,6649,6239,6468,2942,1332,382,-33,-128,463, +1544,1928,1878,2402,2647,2845,2348,2215,1488,-474,625,369,81,388,503,611,593,771,955,787,508,258,-131,-945,1424, +-1726,2692,2867,1922,1154,889,863,571,-633,-1387,-1459,-1048,-278,390,1003,1075,918,929,1005,966,810,1086,1243,1198,769, +632,927,947,620,626,502,316,-56,174,292,727,656,74,191,320,514,556,343,130,275,334,279,54,-224,-533, +-429,-245,-176,93,-154,625,1435,700,539,484,665,257,316,301,305,298,170,254,286,346,314,506,-717,438,460, +452,424,398,494,578,503,404,316,207,159,110,92,31,-38,15,-88,-62,593,442,668,349,538,729,738,736, +562,569,410,214,238,31,74,148,780,556,356,423,418,439,417,414,307,240,190,158,114,52,98,142,175, +178,240,111,563,341,-351,786,490,-580,-588,-559,-533,-503,-470,-435,314,785,-635,294,528,-1565,-945,-2111,-1607,-1882, +-1847,-1818,-1717,-1528,-1501,-1466,-1448,-1474,-1491,-1499,-1508,-1505,-1482,-1532,-1412,-1705,-986,-10,1708,-1245,-56,1612,1622,1611,1442, +1547,1567,1484,17,-1462,1923,309,1519,-2401,-2471,-2635,-2677,-2669,-2440,-1875,-1735,-1597,-1570,-1599,-1580,-1524,-1530,-1567,-1577,-1690, +-1625,-1665,127,-928,-964,-591,-395,-834,-846,-925,-576,-917,-1007,-624,-761,-200,-71,-1196,-186,-2203,-4126,-3910,-3990,-3694,-3005, +-1828,-1871,-1925,-1953,-2019,-2037,-1912,-1879,-1809,-1709,-1817,-1810,-1334,-956,-676,-604,-583,-143,-354,206,-438,134,-155,258,-163, +-10,-48,334,-840,684,-2935,-5228,-4973,-5161,-4971,-4208,-2282,-2164,-2258,-2429,-2358,-2118,-1663,-1463,-1494,-1502,-1799,-1566,-1411,-769, +-666,-367,-215,-8,56,348,705,445,566,426,344,385,692,704,-399,-3172,-6654,-7248,-7505,-6113,-3757,-2174,-960,-1671,-1757, +-1759,-2731,-3228,-3686,-3847,-3450,-2555,-2442,-2158,-2142,-1051,-546,-342,-98,161,469,585,605,508,378,-47,-458,-1403,-1552,-2178, +-2358,-3227,-3576,1060,2419,4014,434,-1457,-2329,570,3728,7222,7489,7550,6820,5031,2884,737,-242,-446,-723,-1312,-975,-748,-281, +100,207,698,758,385,321,211,-5,134,-602,-1092,-1901,-2095,2324,6671,3424,-610,-3661,-3928,-3159,-1039,976,1346,355,-90, +96,978,1649,2145,1449,872,653,29,-337,-906,-843,-763,-673,256,539,-241,554,255,-417,-964,-624,-1555,-656,3802,4602, +-3398,-6487,-10433,-7600,-6157,-4475,-6303,-7196,-8260,-5737,-4281,-3672,-3141,-2344,-1286,-1067,-826,623,902,216,583,438,582,552,660, +589,-339,401,440,325,237,78,386,1445,2363,-2410,-7045,-5867,-5070,-4422,-4864,-5441,-6107,-6353,-6766,-6513,-6056,-5061,-3962,-2836, +-2042,-794,-529,472,1383,599,818,551,172,-215,105,116,353,212,30,-237,342,665,1172,581,2616,-1165,-2660,-1883,-1642, +-1993,-2081,-1978,-561,-193,-587,-1202,-2179,-3248,-3491,-3224,-2558,-1547,-1454,-404,683,-521,-246,-610,-335,43,124,261,-148,231, +284,157,5,-329,-155,-390,-494,-370,-1035,-1525,-2284,-2091,-2000,-2044,-1878,-1686,-1363,-1225,-1003,-753,-628,-554,-578,-1001,-1603, +-1696,-893,-699,-672,-556,-40,-341,218,-247,472,31,223,-42,130,251,543,-56,704,-1014,-1103,-1111,-1188,-1272,-1410,-1495, +-1365,-1258,-1131,-1005,-892,-779,-880,-937,-927,-832,-674,-738,269,-596,-606,-298,-180,-555,-712,-723,-379,-829,-843,-580,-679, +-358,-516,-877,-671,-1504,-1177,-1281,-1285,-1344,-1381,-1463,-1392,-1358,-1336,-1299,-1264,-1195,-1176,-1146,-1146,-1177,-1148,-1415,-691,132, +1466,-928,133,1626,1576,1472,1254,1326,1265,1157,103,-1009,1363,229,-1465,901,-765,1186,578,714,590,867,957,985,1011, +1045,1057,1096,1106,1138,1098,1069,1032,993,821,1404,-525,-1562,-2610,-91,-1461,-2411,-2472,-2436,-2219,-2444,-2484,-2442,-1461,65, +-2458,-1820,-2495,176,322,121,-11,779,1143,1208,1306,1312,1290,1440,1571,1686,1642,1551,1484,1268,1286,1027,-1638,149,-103, +-200,-385,247,358,304,-231,429,660,-41,5,-697,-765,173,-1852,-831,238,-339,-594,1021,1595,1769,1851,1993,2021,2302, +2392,2552,2371,2143,1983,1494,1676,629,-430,-162,-83,-33,-448,382,-262,617,-386,422,-325,-302,-461,-447,-1074,-894,-3037, +-1972,-633,-1896,-2462,228,1675,1994,2112,1824,1567,2110,2692,3141,3002,2760,2586,2113,2020,1083,-697,421,-459,114,193,440, +476,509,694,567,654,68,-203,-883,-1079,-1109,-2515,2231,4435,4142,5112,4747,3869,2539,4359,5842,7635,7289,6643,5825,5117, +4082,3001,1757,1828,1006,-833,484,45,306,310,521,753,687,380,248,-172,-866,-273,-928,-837,-1631,-1224,2354,5868,4602, +2520,2050,1906,705,797,1188,1245,3317,4316,4761,4367,4084,3781,3167,2859,1460,173,-7,25,443,578,322,650,702,473, +310,126,307,-404,202,-264,787,3344,3886,-2563,-3958,-3377,-452,1071,1395,-1739,-3718,-5446,-4785,-4082,-2930,-2882,-2639,-2310,-1336, +-545,500,723,702,438,270,199,-165,386,594,-218,692,588,-72,-56,793,715,1353,72,-3892,-2261,599,3047,2068,343, +-1321,-1978,-2874,-3311,-4562,-5223,-5204,-4247,-3308,-2833,-2139,-1679,-944,-149,-219,208,113,185,322,449,428,-210,477,575,556, +468,257,42,468,-3659,-1456,2216,1539,1483,2539,2991,2523,2652,2371,2088,-236,-1407,-1706,-2803,-3110,-2970,-2344,-1496,-981,25, +-159,-427,-190,-270,-33,-103,149,71,328,175,-63,-434,-647,-879,-2256,-2360,-1096,466,127,776,602,345,302,-226,-434, +-549,-433,-98,435,544,409,-258,-808,-998,-1384,-1656,-1255,-1185,-793,-349,-109,-60,-57,200,262,256,101,-76,-262,-586, +-602,-192,256,597,441,657,350,359,459,117,-105,-401,-443,-553,-622,-719,-784,-669,-666,-373,-728,-1208,-959,-835,-602, +-652,-383,-389,108,-124,187,-61,184,-86,-329,-777,-335,-1377,-67,102,176,333,480,560,620,404,223,54,-87,-230, +-390,-368,-393,-453,-541,-589,-583,-1010,-431,-551,-659,-654,-397,-235,-376,-587,-186,77,-204,-108,-443,-402,42,-841,445, +182,260,282,320,375,487,412,373,316,230,149,42,27,-3,-14,-17,-64,97,-920,-1557,-1869,-615,-1527,-1953,-1979, +-1912,-1778,-1918,-1945,-1868,-1398,-395,-1910,-1573,198,817,1428,635,796,889,872,942,983,1109,987,938,883,870,854,820, +805,771,718,726,716,499,1429,1540,714,1284,1532,819,882,900,806,1001,999,927,1499,1271,642,1505,804,1108,937, +1156,1145,1313,1426,1672,1428,1280,1065,932,765,636,600,604,538,652,500,765,1278,735,1030,737,794,981,824,989, +1091,978,819,758,769,821,847,666,819,1008,1547,1906,1829,2114,2174,2656,2339,2239,1952,1769,1594,1309,1111,932,590, +712,305,728,1091,556,608,376,535,640,607,341,681,522,768,406,481,425,543,724,378,1385,1843,2040,1974,2299, +2630,3195,2795,2650,2065,1462,775,270,116,50,-205,11,-226,343,838,-1,360,-92,-12,236,314,434,190,597,429, +94,-10,-4,-1,282,3099,3856,3639,5247,5555,5011,4783,4665,4779,4631,4175,5747,6226,6179,4749,3805,3042,2390,1136,1046, +1106,120,419,252,440,523,580,520,234,342,447,659,1161,1551,1884,2161,2923,2033,-2673,-3316,-3293,-391,1422,2681,377, +-1793,-3412,-4199,-4505,-3857,-3523,-3076,-3242,-1939,-1538,319,1695,1026,991,332,340,536,550,641,405,354,310,133,400,569, +1077,1121,967,-2449,-1984,624,2057,-807,-3286,-4130,-3766,-3727,-2563,-2727,-2714,-2576,-3520,-3284,-2556,-1488,-1555,-886,-95,54,839, +546,528,474,594,657,-123,842,898,401,1136,718,1518,955,-1631,973,3817,3296,2386,1125,1554,1402,2837,3830,4510,3120, +2082,1377,524,-302,-1065,-1313,-1350,-919,-305,-265,-481,-427,-277,157,48,299,-37,443,385,62,147,215,139,-973,1683, +2313,1871,1729,897,-431,-840,-48,150,497,818,2305,2526,1392,1388,1067,515,80,-323,-769,-990,-1034,-661,-367,-31,159, +-7,-86,144,363,715,1136,673,345,274,1531,335,1718,1224,998,-131,-196,-292,-394,-517,-328,254,485,815,1025,677, +198,-370,-650,-420,-264,-615,22,469,127,-125,-57,30,110,23,57,84,193,-17,49,113,229,639,7,-138,262, +395,506,400,260,215,75,10,-107,-180,-192,-384,-543,-772,-518,-411,-198,-138,-258,-223,-173,-200,58,-47,23,285, +58,250,181,286,410,559,460,335,38,-113,-120,-209,-297,-323,-317,-277,-235,-258,-298,-360,-424,-417,-376,-365,-387, +-442,-468,-545,-362,-79,-29,46,228,148,301,348,209,22,186,96,180,254,-43,721,-209,-121,-131,-157,-143,-156, +-189,-191,-193,-166,-125,-76,-33,-37,-52,-56,-59,-59,-92,508,657,-4,536,800,183,255,274,261,415,471,491, +872,568,257,885,-60,408,-36,480,442,459,637,527,514,553,412,335,289,222,194,163,210,230,238,268,315, +309,-73,99,975,-79,58,920,824,801,816,767,755,701,28,-72,887,72,368,468,825,897,1260,889,823,938, +676,509,387,151,19,-76,1,10,-15,33,173,-22,335,254,88,263,280,255,274,140,63,240,341,264,333, +379,237,308,352,771,1089,1160,1960,1242,1167,1428,820,441,183,-311,-522,-699,-517,-436,-418,-199,-8,-156,-7,127, +96,64,93,366,251,358,45,498,349,138,197,140,206,358,729,1168,1868,2375,3441,2131,1924,2421,1741,1300,1039, +141,-388,-776,-655,-692,-850,-625,-321,-430,17,197,82,-27,75,432,315,402,338,512,484,202,423,451,654,573, +1179,-88,-632,-1322,-1635,-2044,-2166,-2613,-2640,-2725,-2826,-2779,-2892,-3068,-2797,-2274,-1391,-960,-524,-223,229,262,95,127,212, +398,422,392,252,201,352,519,121,191,446,824,-41,-2131,-3314,-2771,-2336,-3306,-3911,-3975,-2513,-2258,-2211,-3594,-4372,-5061, +-4917,-4501,-3523,-2844,-1857,-1279,-408,152,-4,65,115,346,429,570,356,570,566,509,527,194,255,-272,-2003,-1075,266, +-731,-1307,-1677,-1246,-1350,1348,2788,2844,1959,910,-605,-644,-973,-1097,-1611,-1341,-1181,-969,-405,-174,-58,216,612,698,701, +-72,686,527,-25,160,-203,-445,-971,950,-270,-5158,-6005,-4116,-3697,-3268,-2760,-3472,-3815,-3749,-2047,-1222,-1536,-737,-409,-117, +-72,-143,-761,-1016,-841,-933,-617,-271,-33,139,55,-207,263,421,441,303,-107,232,495,-135,-2983,-3920,-3016,-2128,-2190, +-2186,-2628,-2764,-2981,-3346,-2953,-2288,-1433,-1013,-796,-554,-823,-712,-609,-798,-356,-238,-23,94,118,-103,-161,-236,41,28, +-106,-33,100,274,-606,440,-1598,-1262,-803,-601,-691,-454,-201,-191,-218,-351,-537,-1228,-1993,-2461,-2115,-1022,-197,159,-55, +30,-29,-429,-266,-120,-19,88,149,89,27,23,50,-7,-257,-303,-686,-578,-4,-33,-478,-709,-819,-957,-1137,-1041, +-944,-902,-799,-626,-492,-252,-188,-241,-263,38,-3,-284,100,273,277,231,379,178,72,-263,14,-53,28,-29,-121, +-136,-207,-290,-791,-735,-849,-872,-938,-978,-1072,-949,-865,-735,-637,-574,-535,-465,-353,-159,-57,98,99,-266,-251,-491, +-257,-426,-621,-589,-651,-643,-601,-461,-463,-507,-455,-654,-617,-1017,-633,-607,-669,-685,-737,-775,-832,-771,-741,-721,-697, +-658,-614,-562,-529,-505,-472,-441,-276,-721,-566,254,-920,-725,262,217,192,216,116,89,75,-727,-1017,330,-705,-736, +461,1209,574,659,697,693,473,349,236,246,251,277,290,301,335,305,309,317,361,354,259,997,853,189,971, +913,297,327,313,258,408,439,396,935,1049,224,969,886,1176,1068,1189,1170,755,498,226,116,86,214,292,368, +429,321,320,337,455,339,449,509,444,625,470,548,701,620,785,792,739,524,481,673,715,768,854,1465,1547, +1551,1674,1738,808,255,-427,-611,-659,-482,-338,-270,-58,-178,-132,-45,143,137,143,432,414,280,371,505,602,553, +421,611,412,611,339,623,790,891,1217,1365,1788,1781,2177,2442,1480,661,-401,-840,-1083,-652,-155,231,412,92,105, +254,549,278,71,181,-121,126,-52,3,226,316,336,124,440,329,-88,543,909,665,982,1587,43,-675,-738,-162, +95,172,-72,-334,-525,-793,-2584,-3303,-3352,-2295,-2076,-2740,-1994,-1377,-250,262,-113,142,76,257,502,331,368,375,627, +518,292,194,353,520,1730,-1549,-844,1338,2219,3277,4393,4621,3046,3446,3070,1746,1791,1227,61,-548,-417,702,206,-185, +-402,-769,-369,-184,-121,61,352,430,599,469,792,835,906,538,284,-209,-524,-49,1138,820,1381,3039,5352,5513,3066, +1508,727,559,2126,2899,3007,3015,2412,1563,875,760,180,-25,-130,-147,77,231,711,579,523,55,508,311,139,-181, +-189,-470,14,-493,-83,2883,4538,6151,5476,3901,1190,1536,1221,1359,760,732,1219,985,976,1024,800,673,213,-508,73, +200,246,364,436,296,183,-131,240,343,694,254,356,-150,184,-869,2207,4005,3734,4761,4485,3992,2633,2653,2736,3548, +1774,904,995,277,-57,52,429,873,978,327,696,-10,93,276,488,308,281,-83,246,266,286,161,88,-274,504, +-1178,858,1617,1575,2111,1735,1132,362,-312,-861,-1105,-885,-372,105,695,996,1065,998,928,407,177,522,393,566,351, +241,191,157,352,324,376,342,313,456,153,487,991,973,1008,1076,1245,904,725,590,628,628,471,385,176,-149, +20,184,411,552,770,928,632,373,226,322,292,355,226,548,251,445,233,446,344,350,158,604,-728,1002,915, +879,843,830,815,762,585,411,296,186,135,52,149,171,178,229,190,360,-11,506,596,275,289,567,666,731, +541,823,858,578,685,324,399,799,517,1184,831,900,869,875,873,901,833,785,722,643,555,440,474,498,524, +559,553,676,370,-213,-1305,665,-109,-1375,-1357,-1317,-1225,-1264,-1249,-1168,-78,894,-1434,-248,977,-1615,-931,-1937,-1482,-1709, +-1729,-1813,-1801,-1740,-1628,-1568,-1529,-1520,-1521,-1552,-1546,-1540,-1501,-1527,-1397,-1708,-987,-99,1571,-1245,-143,1472,1443,1410,1241, +1320,1311,1216,-124,-1444,1585,125,1029,-2139,-2321,-2533,-2613,-2772,-2755,-2566,-2231,-1983,-1869,-1773,-1778,-1843,-1806,-1753,-1648,-1650, +-1567,-1581,183,-930,-946,-600,-414,-840,-904,-1017,-696,-1048,-1102,-784,-946,-491,-461,-1291,-184,-1540,-2948,-2864,-3209,-3558,-3555, +-3294,-2644,-2276,-2109,-1972,-1954,-2077,-1985,-1892,-1682,-1629,-1633,-1095,-760,-626,-546,-488,-55,-297,123,-536,-68,-306,-1,-380, +-174,-191,-49,-783,230,-2420,-4640,-4797,-5149,-5590,-5673,-5213,-3958,-3036,-2709,-2395,-2461,-2582,-2284,-1999,-1696,-1734,-1519,-1141,-392, +-675,-232,-329,-121,98,165,351,-20,294,78,-222,-307,-199,-328,-715,-1156,-1333,-475,-51,519,850,729,462,-1114,-2250, +-3084,-2968,-2706,-2470,-2954,-2833,-2053,-1582,-1521,-1912,-936,-843,-500,-325,-51,423,118,186,356,274,98,29,167,257,-7, +-623,-83,1030,1003,571,1305,269,73,579,-537,-603,148,88,-56,-156,-225,-504,-993,-1463,-1698,-1287,-1051,-1044,-681,-455, +-159,392,280,321,236,603,665,240,69,-322,-396,-171,783,-32,202,-532,-3438,-3913,-4528,-4019,-2922,-2322,-1494,-1992,-2047, +-1503,-1328,-772,-150,496,433,109,128,-32,-133,-219,-32,626,185,91,-41,315,250,352,118,207,457,489,451,1464, +-193,-2200,-5551,-2803,-943,759,-175,-335,-101,-701,-671,55,-519,-775,-838,-862,-504,188,496,423,740,363,322,770,92, +-20,-163,43,152,342,123,-115,288,-56,1736,-208,-3781,-3778,-3481,-2542,-2279,-1687,-2351,-2547,-2779,-1618,-1219,-1679,-623,19, +490,755,412,362,443,5,345,228,273,332,462,385,85,62,134,297,448,451,633,374,1077,-820,-1765,-1070,-935, +-677,-695,-953,-642,-546,-602,-818,-892,-1029,-517,-371,-170,-179,-191,385,684,345,549,236,154,89,-56,-16,104,124, +113,14,282,128,92,-386,-115,-656,-900,-657,-767,-670,-641,-602,-606,-657,-569,-381,-179,28,77,199,368,248,-74, +-61,304,143,1,16,200,102,379,149,594,133,281,-66,-60,-32,151,-208,1451,127,8,-36,-139,-212,-292,-351, +-191,-26,58,147,221,340,277,221,157,147,194,103,415,55,123,291,297,185,106,125,354,112,10,343,248, +578,594,172,424,-380,-135,-215,-227,-248,-269,-331,-255,-211,-140,-70,-7,71,36,29,14,-15,-18,-166,316,828, +1270,218,889,1406,1433,1431,1343,1464,1492,1454,939,141,1467,1056,-225,392,-905,632,124,235,249,499,574,504,542, +522,465,449,430,421,447,463,494,455,336,820,-716,-1569,-2400,-295,-1428,-2237,-2298,-2286,-2103,-2303,-2325,-2266,-1474,-236, +-2331,-1773,-2285,-277,-134,-89,103,777,989,760,939,824,588,482,467,516,636,658,711,512,561,445,-1613,-173,-336, +-328,-456,9,81,25,-384,113,269,-258,-265,-869,-967,-229,-1609,-851,-233,-526,-268,987,1422,1050,1440,1257,925,734, +647,667,806,862,1018,604,799,147,-629,-391,-240,9,-301,315,-323,424,-396,238,-417,-288,-558,-715,-1247,-985,-2676, +-2004,-766,-979,-542,1469,2239,1822,2408,1983,1121,617,572,812,1138,1211,1313,784,765,258,-847,26,-532,89,218,458, +327,219,451,366,312,-168,-528,-1155,-1396,-1274,358,4040,5272,3679,531,-95,-1153,-2333,-1436,-867,73,778,963,526,956, +1026,1185,732,1016,298,-926,139,-100,106,65,334,186,205,341,24,138,458,637,200,528,43,1034,1600,870,294, +-784,-1018,-1530,-1496,-1713,-1288,472,418,867,1431,1920,2022,1945,1590,1601,199,-603,-388,-318,223,353,588,329,271,244, +644,561,387,152,867,998,1446,361,1112,117,-471,335,1193,2477,3610,2176,1504,1389,917,845,712,481,1,-561,-213, +316,432,471,563,263,183,277,882,59,-34,75,422,510,734,244,469,377,548,482,-682,-794,-169,1693,1065,357, +273,-741,-1544,-2157,-1724,-1384,-1445,-348,256,420,557,542,301,93,207,337,270,409,847,234,-9,63,32,258,875, +315,360,227,682,-1387,-631,1167,668,253,1072,1353,869,107,-539,-964,-1131,-874,-409,-515,-539,-435,-458,-116,84,202, +409,295,307,246,322,344,429,259,280,77,-24,-32,-14,-238,-509,-1375,-869,-129,-475,65,41,549,1392,825,363, +-175,42,152,389,440,434,344,178,70,-149,0,40,-161,126,272,197,269,245,384,377,338,313,294,279,40, +56,-540,-95,413,241,396,429,543,669,633,762,807,565,313,97,163,212,337,299,419,214,-27,102,189,209, +84,316,109,352,34,189,-87,-60,-176,-370,-588,-376,-347,74,227,302,442,568,669,750,679,570,530,497,498, +451,476,466,464,430,414,451,170,415,344,358,302,383,404,287,66,253,368,156,210,50,20,217,-232,342, +275,320,349,365,395,459,442,452,437,432,422,414,394,374,358,363,336,433,-38,-324,-334,2,-393,-423,-472, +-459,-375,-488,-509,-494,-498,-108,-353,-535,270,-130,738,-210,-67,-54,-86,-191,-248,-291,-275,-254,-201,-188,-166,-155, +-133,-123,-115,-129,-112,-323,724,988,526,584,1024,631,682,687,588,774,773,714,926,527,381,959,280,408,324, +471,367,45,-181,-353,-431,-432,-316,-348,-344,-338,-309,-240,-172,-124,-243,38,703,111,380,269,369,388,202,330, +581,252,51,173,171,351,283,-20,341,432,694,702,498,-268,-647,-921,-904,-750,-401,-286,-188,-173,-108,-60,-67, +-76,-340,160,459,168,253,239,479,406,402,-26,561,86,430,153,192,79,228,383,-42,1384,2029,2206,1904,673, +-108,-832,-1128,-1174,-764,-721,-692,-729,-690,-518,-293,-280,-433,-14,146,-322,87,-52,40,292,203,212,81,318,31, +-193,-79,-33,-94,-138,3990,1434,-899,-755,-1949,-2274,-2083,-1269,-52,1050,1934,2150,2425,2810,2388,1896,1204,666,-36,321, +547,-73,72,139,247,371,93,136,317,435,719,1045,742,1157,1557,3002,1125,139,-422,321,-23,2936,3795,3444,2333, +1099,-437,-587,-774,-1166,-1084,-1273,-1780,-653,-354,466,1034,644,548,206,177,578,382,355,172,518,554,464,916,885, +1045,300,973,26,-383,857,1329,1367,865,631,-617,-1150,-1439,-1455,-1569,-1815,-1474,-895,-186,-37,-358,-58,106,24,433, +236,372,1189,-17,-248,112,293,541,1200,744,163,1028,717,116,641,2188,2579,601,841,722,28,1065,1333,976,1090, +1155,1209,789,369,-18,-235,-346,136,597,346,98,286,369,827,259,239,376,38,105,433,328,265,212,-127,1114, +1669,1676,1498,369,403,129,-123,371,639,931,973,954,1236,941,717,182,239,219,178,321,141,147,196,149,172, +200,107,371,259,416,637,427,405,383,1037,841,1431,426,43,-309,-290,-538,-1004,-327,81,468,349,572,1000,1008, +791,80,-198,-217,161,120,253,512,346,232,288,314,362,101,335,422,475,372,480,589,857,448,57,-29,299, +391,278,165,-44,128,191,320,356,376,364,172,63,-56,65,-113,53,409,293,320,292,390,292,362,123,420, +132,264,167,266,391,482,376,417,367,191,88,-34,-143,-235,-316,-296,-278,-259,-232,-199,-137,-141,-134,-175,-194, +-255,-238,443,164,375,321,502,479,426,553,692,533,471,532,508,467,476,341,578,124,123,104,65,54,31, +-15,-9,-15,-17,-16,-13,-2,-13,-17,-12,-13,18,-144,454,614,438,449,689,489,512,468,368,447,422,403, +678,546,235,647,168,-287,-860,-277,-362,-428,-431,-404,-366,-326,-278,-258,-235,-270,-282,-325,-262,-242,-214,-228,-211, +-114,-832,-755,83,-775,-770,57,-54,-69,-5,-144,-184,-195,-779,-780,77,-756,-141,-561,-671,-931,-997,-1042,-932,-744, +-508,-335,-239,-295,-362,-484,-340,-282,-200,-267,-128,-337,-417,-241,-482,-232,-249,-287,-279,-475,-549,-447,-248,-283,-256, +-243,-257,-268,-198,-455,-1147,-1263,-1395,-1432,-1204,-887,-487,-268,-182,-305,-414,-675,-346,-241,-77,-110,62,-177,-375,-187, +-152,-82,-111,119,-86,35,-277,26,-183,-119,-96,-127,5,-218,738,-398,-2016,-2380,-2742,-2999,-2676,-2085,-1137,-348,9, +-159,-467,-916,-434,-227,-25,-156,111,-16,-219,292,-20,196,274,596,270,187,213,137,136,186,299,468,693,435, +-1184,-2147,-2147,-1776,292,241,724,1642,656,347,312,126,-125,-479,-1075,-921,188,212,541,81,-194,311,-182,121,118, +319,100,169,460,527,486,88,-298,-296,-390,-553,-66,-272,520,461,452,82,-286,-426,-770,-1231,-2390,-2700,-2734,-2551, +-1890,-1511,-1151,-1043,-484,-355,-17,237,69,273,255,545,332,259,47,484,496,406,629,319,-22,79,-653,-869,-364, +-1497,-3686,-3631,-2970,-1560,152,773,454,123,-460,-1042,-1259,-1314,-1080,-875,-447,-392,-423,-171,-208,-64,231,1061,107,-159, +14,78,269,862,28,-334,-292,-581,-16,-445,-2493,-3752,-4909,-3726,-2970,-1891,-2812,-2662,-1957,-947,-291,89,209,128,-96, +186,347,-18,-95,-109,-120,-84,39,618,235,55,342,34,72,344,153,-133,55,-147,-109,-1994,-3149,-3039,-3492,-2824, +-2288,-1447,-1498,-1656,-2240,-1698,-1244,-1014,-422,0,264,-26,-217,-253,-291,-161,178,142,115,94,79,75,-44,-16,-27, +-30,-79,-60,141,-648,393,-889,-1242,-1111,-1060,-290,-117,-404,-257,38,396,117,-356,-931,-880,-669,-393,-102,47,108, +30,-98,-227,-149,60,156,124,134,153,236,204,44,94,-108,10,-498,-663,-619,-523,-530,-547,-571,-569,-530,-682, +-915,-1094,-717,-258,185,127,13,-143,-266,-286,-415,-306,-35,147,171,186,140,142,29,-107,-33,-50,-65,-121,-216, +-208,-396,318,-109,-94,-218,-266,-313,-349,-384,-296,-147,-86,-61,-138,-148,-198,-174,-115,-83,25,-68,-239,-178,-313, +-170,-195,-213,-161,-237,-169,-119,-54,89,-5,101,30,-11,-389,-73,-64,-102,-105,-130,-152,-193,-175,-188,-175,-171, +-143,-127,-79,-52,-38,-38,-28,60,-385,-331,196,-366,-335,261,254,281,305,273,282,273,-259,-389,352,-226,-27, +654,677,557,538,655,701,837,845,755,743,701,623,617,598,604,590,590,580,612,560,618,776,344,-810,884, +424,-665,-646,-643,-618,-576,-548,-494,431,893,-701,283,-107,359,344,583,751,1299,1463,1232,1174,987,784,787,790, +804,762,741,688,756,629,733,100,463,580,407,401,669,596,712,594,669,577,480,507,279,380,526,16,-170, +60,445,754,1941,2144,1604,1575,1189,736,636,539,621,567,585,546,650,604,497,573,438,277,478,458,566,322, +423,356,282,271,390,315,314,160,127,-620,-1433,-1051,-480,284,2689,3353,2643,2451,1798,1007,994,1053,1104,973,900, +797,1008,621,524,410,188,177,262,317,459,306,120,109,216,216,178,194,182,-131,-128,-412,1342,2084,1740,1443, +706,314,536,-48,-520,-896,-1251,-1416,-1612,-360,-164,-1011,-438,42,1088,732,346,379,344,333,407,227,261,445,470, +284,2,-10,-197,-164,-460,537,926,2002,2028,1310,940,793,565,279,408,903,1006,1125,1377,1099,1398,2142,1599,1073, +716,254,318,252,307,361,613,241,195,244,543,529,563,589,864,715,1055,-117,1057,1617,1084,1681,2150,2480,2611, +1323,1102,1335,2106,2607,2657,2095,1180,-64,69,205,71,210,128,343,349,379,969,268,-2,54,84,262,837,-81, +-33,-505,6,-34,199,1824,2963,5053,2676,1221,364,512,718,1124,1177,1233,1095,1333,1431,1235,1517,1241,565,118,216, +204,284,381,636,155,45,382,173,197,579,161,454,-3,398,-566,1444,3170,2779,2622,2029,2017,2112,2113,2038,2221, +1308,864,791,465,241,158,326,391,422,217,409,119,206,283,328,320,272,131,209,256,359,211,121,-93,470, +-668,849,1444,965,652,646,714,1087,207,-223,-320,240,547,596,453,432,473,487,526,253,66,231,281,454,324, +149,184,184,210,232,225,286,163,350,349,640,347,344,415,341,395,599,788,1088,996,962,738,446,144,-92, +-57,-76,-132,-59,99,214,81,55,47,121,120,276,140,282,153,277,238,389,396,354,276,359,-253,473,512, +651,721,801,857,928,724,556,455,375,322,218,254,268,286,324,273,369,51,395,486,340,370,547,498,545, +390,440,350,214,233,116,215,362,626,667,587,655,683,719,749,821,751,712,648,578,505,418,449,462,472, +487,473,546,584,281,-467,719,342,-435,-421,-410,-374,-370,-352,-348,250,689,-457,221,751,-875,-434,-1027,-759,-879, +-897,-1059,-1084,-1005,-1006,-977,-932,-905,-884,-868,-866,-862,-864,-855,-754,-1025,-404,291,1409,-601,248,1348,1328,1302,1180, +1244,1244,1206,204,-729,1281,289,312,-981,-781,-830,-881,-1332,-1535,-1377,-1450,-1343,-1205,-1091,-1027,-1012,-1028,-1021,-1031,-939, +-886,-927,485,-426,-429,-152,-24,-384,-436,-524,-270,-561,-591,-271,-424,-117,-256,-824,-721,-931,-901,-1088,-1261,-2064,-2358, +-1970,-2124,-1958,-1664,-1470,-1297,-1230,-1200,-1170,-1176,-976,-985,-602,-250,-221,-240,-108,192,-134,228,-263,92,-127,132,-15, +1,-148,-197,-672,-1182,-1085,-682,-730,-752,-2016,-2822,-2520,-2872,-2572,-2090,-1706,-1546,-1507,-1538,-1442,-1399,-1109,-926,-718,23, +-309,-35,15,210,277,195,209,59,190,68,38,-79,-325,-447,-1148,-105,-835,-979,-1307,-2490,-3113,-3110,-1995,-2184,-2356, +-2697,-2197,-1544,-722,-811,-937,-1227,-861,-1041,-897,-46,-389,-62,-24,97,365,199,184,234,151,136,135,-72,-165,-251, +-473,1057,1232,1389,892,282,-955,-1075,213,-186,103,412,304,-31,-425,-603,-911,-1576,-1419,-1515,-566,22,-184,-126,-95, +11,397,143,92,148,253,286,379,412,320,683,591,932,-37,-144,-7,-1359,-2073,-2903,-2324,-1727,-1479,-2026,-2532,-2724, +-2522,-1715,-990,-490,-186,-266,-356,-175,-75,159,-25,126,729,225,-29,92,3,212,801,479,388,402,352,439,376, +-383,-1047,-2933,-2378,-1474,-90,186,483,319,114,-101,-158,-645,-818,-716,-704,-519,42,543,293,376,455,351,436,29, +-59,205,42,109,156,233,112,272,47,1018,-346,-2288,-2106,-1664,-2001,-2038,-1505,-1357,-1088,-1001,-537,-529,-737,-220,-49, +-244,268,68,-155,136,-213,2,110,136,138,245,112,72,51,217,389,335,285,405,28,1290,-42,-581,-418,-995, +-1113,-1167,-1057,-531,-164,35,-82,-153,-201,-527,-646,-467,-346,-279,167,289,47,206,70,78,42,-11,55,-24,-83, +-77,128,79,23,187,98,49,-94,-462,-603,-878,-730,-684,-645,-583,-519,-372,-327,-289,-214,-225,-188,-149,-154,-266, +-240,-54,9,-19,-37,160,45,267,-99,247,116,401,316,352,399,516,176,558,-420,-409,-385,-398,-444,-491,-528, +-463,-407,-371,-298,-216,-137,-122,-115,-128,-138,-119,-175,344,-179,-220,-88,-86,-342,-401,-384,-166,-420,-479,-293,-332, +-100,-131,-381,-1,-535,-329,-380,-375,-381,-382,-405,-360,-327,-290,-262,-240,-201,-240,-260,-269,-287,-266,-417,-12,448, +1155,-200,412,1203,1194,1140,1022,1069,1044,982,414,-248,1088,514,-375,470,-295,727,332,385,326,432,467,441,498, +496,449,471,476,487,487,496,516,510,426,742,-266,-878,-1456,23,-792,-1361,-1391,-1386,-1257,-1394,-1408,-1349,-793,126, +-1415,-987,-1159,504,411,305,175,285,318,291,561,621,480,495,511,592,635,654,695,608,644,519,-917,93,-22, +-2,-99,144,231,197,-94,220,353,89,187,-179,-224,280,-423,293,476,135,-8,194,349,234,688,771,536,644, +642,729,714,742,903,699,865,306,-223,-18,39,254,-10,252,-68,440,-111,228,-148,106,-11,-80,-295,-94,-572, +498,754,349,-191,-253,-265,-265,691,1039,658,667,714,986,1038,1076,1212,928,941,469,-315,314,-151,437,481,468, +343,172,403,189,250,285,313,71,88,125,-369,791,1249,453,-118,119,446,617,148,-29,-130,20,-80,-310,-180, +110,526,645,974,290,-472,257,96,237,187,288,344,304,209,293,315,112,-24,-326,-307,-327,1407,1358,872,894, +1669,-417,-1660,-1355,-1058,-880,-1330,-1013,-495,127,863,1151,1144,788,661,-284,-676,-351,-256,212,285,348,227,116,85, +251,278,692,251,611,1022,1438,-644,-497,-242,174,1192,1555,2601,3045,2733,1774,747,448,179,98,-210,-512,-631,-694, +-195,201,222,341,-86,311,410,468,275,107,229,31,233,749,584,438,-166,-461,-267,-574,-176,60,1168,914,644, +561,383,493,708,606,299,-36,264,461,451,363,273,28,-177,62,211,346,297,270,199,64,240,129,202,326, +234,353,154,130,-922,-334,721,548,742,748,854,935,460,373,547,490,567,456,140,-50,-116,-179,-65,-192,-202, +-36,-64,10,96,262,170,197,46,158,139,167,26,-77,-262,-331,-811,-412,174,143,467,510,779,1316,986,750, +356,380,372,442,528,535,517,475,298,-172,-104,9,-157,35,202,293,203,128,288,152,119,123,64,43,-123, +-109,121,455,620,420,392,477,546,627,389,288,170,181,160,121,119,104,159,211,471,352,18,111,166,137, +-56,3,-124,226,-122,225,74,270,136,55,-117,116,-714,79,247,354,509,644,762,910,803,688,545,360,179, +-9,53,92,123,113,125,177,-338,71,-6,-63,-124,61,125,1,-232,-20,7,-191,-131,-275,-251,32,-178,497, +369,433,468,491,522,588,516,484,459,443,429,379,397,389,393,408,385,536,-84,-479,-762,49,-496,-853,-883, +-834,-718,-808,-791,-754,-531,15,-733,-589,467,-359,510,-532,-243,-256,-253,-331,-397,-503,-414,-404,-458,-404,-387,-360, +-388,-388,-385,-379,-326,-574,487,863,813,313,861,809,874,875,758,911,929,915,842,231,774,925,813,-87,-125, +-47,-163,-333,-425,-666,-505,-539,-700,-586,-549,-475,-559,-551,-526,-429,-498,-237,727,-20,223,173,290,116,30,116, +365,17,-140,161,127,385,424,-52,543,120,156,414,270,-265,-529,-1091,-609,-569,-894,-639,-567,-412,-571,-555,-567, +-459,-644,-36,355,147,190,184,435,85,386,-96,477,-59,337,285,325,330,514,330,848,657,895,1112,575,-97, +-393,-1169,-634,-748,-1281,-941,-784,-561,-864,-877,-769,-600,-680,-94,313,-256,253,123,184,165,200,189,67,123,43, +292,405,580,618,514,932,-303,-1574,-1194,-837,-1077,-979,-1269,-812,-509,-620,-410,-229,277,508,505,-55,-86,-451,47, +398,-181,207,247,309,239,307,306,189,479,424,102,122,377,309,612,837,182,-9,529,1005,231,-107,-580,-181, +-272,-599,-263,-114,-67,-593,-849,-1031,-318,-350,-101,156,18,66,61,130,258,189,94,57,138,319,680,469,316, +705,400,-286,72,197,428,1139,758,875,377,-113,-250,-167,-388,-707,-991,-1201,-953,-505,-512,-776,-321,-86,-154,40, +465,437,139,101,-62,113,-102,123,689,675,394,-16,-134,249,677,872,1025,881,449,552,732,2009,2600,2462,1960, +1564,1373,706,295,-7,-160,-343,-169,76,-35,-125,334,333,105,207,261,334,293,247,26,98,196,217,197,770, +1120,1027,985,398,-109,-112,365,702,977,1232,1321,1276,1285,785,551,317,117,-12,-90,45,-69,-42,-21,35,159, +130,43,226,94,291,534,501,419,306,638,490,682,169,87,-34,-290,-373,-253,208,323,113,135,250,452,657, +547,169,-9,-56,90,132,227,394,229,150,318,212,165,-57,38,72,58,53,129,146,371,485,112,-112,60, +30,169,249,256,311,347,404,288,165,30,-33,-53,-89,91,95,351,464,286,176,128,124,39,167,173,443, +220,290,190,249,353,449,332,397,178,123,183,144,145,129,158,193,224,266,288,333,370,352,332,281,259, +204,185,285,200,341,336,392,377,250,294,327,139,24,30,57,121,184,56,578,-14,70,63,68,74,75, +63,73,80,83,103,116,135,125,127,131,125,124,41,586,764,524,506,787,597,601,563,488,555,545,516, +719,469,452,744,68,-371,-937,-283,-390,-466,-539,-523,-492,-465,-382,-351,-342,-353,-345,-328,-310,-303,-300,-308,-303, +-182,-917,-903,-198,-822,-902,-257,-319,-325,-266,-406,-425,-395,-889,-810,-188,-916,-485,-581,-548,-777,-917,-944,-914,-849, +-636,-488,-429,-413,-394,-371,-330,-328,-319,-375,-237,-414,-634,-363,-549,-337,-356,-435,-337,-500,-626,-489,-322,-322,-345, +-388,-421,-392,-530,-489,-736,-1065,-1501,-1470,-1306,-1069,-742,-539,-459,-489,-429,-382,-238,-202,-185,-211,-47,-294,-585,-345, +-241,-161,-244,-145,-151,32,-333,-67,-281,-120,-166,-166,-178,-457,122,-434,-1120,-1648,-2158,-2241,-2068,-1806,-1323,-827,-540, +-533,-491,-476,-261,-223,-235,-295,40,-75,-339,200,-43,248,344,400,301,210,245,49,134,288,332,320,454,106, +-2155,-1766,-1557,-1206,-404,-834,-868,-696,-206,-44,115,303,359,309,-232,-119,724,395,416,-196,-464,89,-82,188,118, +45,294,323,205,327,132,-374,-259,-423,-756,-1649,153,855,987,-333,-1427,-1986,-1953,-2238,-982,-247,24,-516,-971,-1054, +-1162,-1208,-1243,-992,-473,-524,-376,-131,-105,323,364,277,135,-9,23,79,204,507,154,9,22,325,-130,-163,-412, +-173,502,-190,-541,-472,418,659,266,-41,-406,-703,-572,-429,-311,-466,-356,-468,-567,-269,-415,173,222,-243,44,-36, +-14,-164,34,346,415,559,-96,-112,224,-260,-1345,-1964,-2003,-1767,-1047,215,-22,-187,-762,-441,-338,-318,-629,-678,-412, +-355,-165,-256,-390,-233,-203,235,249,-53,231,151,227,330,352,83,67,-49,53,159,-256,-1195,-1491,-1351,-1233,-1278, +-1030,-577,-605,-716,-1313,-831,-619,-292,-155,9,121,-263,-321,-189,-223,-40,76,27,15,31,-35,-10,12,-2,-2, +-4,201,206,99,-512,129,-451,-342,-353,-346,-487,-448,-366,-88,54,-6,-206,-427,-617,-593,-512,-390,-119,-26,-15, +23,-119,-248,-171,-16,133,124,66,-24,8,-7,-23,-36,-158,-176,-262,-436,-229,-210,-389,-415,-503,-561,-651,-549, +-457,-294,-288,-262,-282,-112,42,170,93,57,-9,-36,56,75,57,63,13,110,93,109,98,15,-56,-79,-136, +-150,-222,29,-336,-263,-308,-316,-331,-326,-360,-207,-83,46,179,317,447,379,308,289,261,290,217,231,32,-134, +-53,-147,-328,-288,-367,-322,-295,-173,-174,-145,-119,-219,-225,-494,-372,-336,-365,-361,-375,-384,-411,-357,-327,-297,-262, +-232,-170,-190,-186,-198,-210,-215,-219,-377,-258,361,-516,-366,299,268,255,248,197,172,176,-310,-525,339,-298,-462, +463,491,413,344,416,411,539,559,495,508,497,483,459,455,494,460,452,433,468,414,469,567,200,-818,662, +265,-716,-659,-644,-638,-592,-574,-529,271,677,-729,154,-215,383,304,464,496,859,921,764,803,744,683,568,561, +669,609,599,542,615,506,592,-39,303,455,275,251,439,429,535,417,474,403,322,350,168,258,321,-34,-91, +-118,113,208,1166,1258,879,885,796,759,599,541,762,598,594,491,630,557,423,389,270,240,335,280,273,215, +291,229,118,122,236,183,173,110,16,-510,-613,-490,-163,199,1709,1970,1460,1435,1222,1013,706,752,1054,923,830, +647,890,632,530,315,154,228,301,319,251,325,191,129,130,112,167,180,139,-58,-211,-523,678,751,636,703, +588,505,285,368,332,571,63,-302,-703,-200,72,-127,-37,20,613,444,144,169,302,285,9,295,338,115,320, +117,-123,41,-93,-267,-561,1134,889,91,-30,-199,421,372,-483,326,537,252,443,610,885,802,942,1113,890,722, +474,105,264,323,396,426,387,121,-41,111,60,192,454,204,303,399,871,-308,283,1052,2091,3893,3785,3255,2159, +1044,377,337,482,852,1394,1079,754,305,112,-55,9,51,-12,-103,556,417,-331,62,9,2,-83,95,287,641, +746,325,-32,-127,246,1536,2065,2809,1948,1474,835,1339,1218,879,712,332,-117,-138,-65,94,156,82,78,-71,71, +48,385,419,78,222,214,238,375,408,212,213,312,-64,71,3,1169,2241,2185,2343,2091,1734,979,1246,1258,1198, +923,797,882,579,357,204,55,74,223,223,349,116,141,170,184,41,18,111,135,174,181,288,306,51,623, +-279,805,1144,916,749,436,305,258,9,-166,-237,-35,208,467,359,283,91,207,231,3,-57,44,155,226,146, +90,152,133,118,189,228,235,184,262,163,367,503,535,538,535,584,464,327,166,247,335,386,214,15,-185, +-63,54,131,96,14,91,212,96,118,99,63,80,54,180,198,182,134,182,220,276,269,425,-325,322,273, +267,257,245,256,247,195,108,63,27,41,30,46,28,39,64,44,116,138,203,262,105,151,229,259,314, +259,334,337,275,288,141,154,267,166,270,156,192,179,185,184,193,157,140,116,98,72,46,56,65,65, +77,83,90,112,-86,-562,211,-59,-639,-607,-584,-552,-528,-513,-474,-51,284,-630,-129,141,-563,-371,-661,-468,-510, +-488,-629,-677,-629,-657,-631,-560,-577,-570,-561,-565,-571,-593,-570,-494,-685,-341,151,995,-466,104,910,904,890,808, +832,825,804,75,-558,900,130,165,-554,-339,-411,-476,-848,-942,-774,-908,-869,-695,-722,-713,-701,-728,-728,-767,-649, +-595,-670,343,-291,-269,-99,-34,-323,-306,-387,-253,-421,-403,-186,-297,-82,-158,-577,-600,-620,-328,-331,-300,-1053,-1378, +-1040,-1309,-1160,-822,-902,-847,-811,-837,-850,-979,-715,-727,-492,-189,-194,-102,-104,64,-235,109,-199,-33,-145,4,-19, +-66,-163,-136,-515,-768,-256,322,138,-101,-1295,-1618,-1080,-1583,-1545,-1015,-1133,-1140,-1101,-1186,-1144,-1240,-825,-653,-565,60, +-180,112,73,176,65,220,243,55,71,21,165,-12,-210,-130,-764,-372,-1077,-1750,-1541,-915,-1057,-1382,-1965,-1448,-1116, +-889,-855,-703,-178,-452,-676,-843,-819,-1030,-953,-216,-402,-220,-14,91,13,179,216,36,152,71,-99,-78,-76,-324, +-507,153,-253,-373,-452,-878,-1000,-947,-993,-714,-829,-784,-495,-461,-702,-994,-1061,-1036,-1009,-906,-208,110,59,46,77, +138,235,106,-52,31,-115,75,331,196,-174,-305,-240,135,390,634,360,-943,-1261,-1995,-2793,-1908,-1404,-1345,-1756,-1907, +-1659,-1299,-797,-260,-163,-310,-451,-367,-205,-122,312,262,-325,8,-39,2,-94,-9,-49,575,756,577,203,268,270, +-746,-1536,-2939,-2004,-1139,-471,76,67,-403,-773,-1100,-1137,-1316,-1332,-1141,-1113,-860,-354,71,35,18,328,309,-13,182, +136,54,241,324,80,265,67,75,38,693,-468,-1777,-1534,-1345,-1376,-1578,-1874,-1131,-752,-734,-317,-170,-266,-30,39, +120,180,81,-39,73,-5,84,170,169,72,-7,-83,-51,-76,0,14,212,278,327,40,709,-189,-502,-278,-527, +-526,-682,-1165,-483,-154,103,-186,-413,-525,-607,-576,-479,-459,-343,9,29,-80,12,-20,5,-29,-7,36,70,60, +85,128,166,44,68,-151,19,-103,-270,-251,-366,-446,-533,-653,-508,-443,-292,-172,-11,159,25,-89,-199,-227,-320, +-384,-184,-47,40,30,101,71,144,-29,104,-6,90,-16,30,77,177,8,474,-169,-266,-358,-444,-541,-623,-720, +-593,-475,-375,-270,-196,-112,-100,-53,-25,-27,15,-47,82,-142,-204,-118,-140,-264,-265,-247,-100,-181,-158,19,-53, +85,66,-107,-181,-389,-299,-352,-376,-400,-424,-482,-413,-378,-336,-295,-249,-190,-209,-223,-228,-238,-226,-261,-194,41, +419,-283,12,454,474,466,425,457,454,435,79,-272,464,127,-372,500,-11,664,426,487,431,526,557,564,537, +527,549,522,516,495,510,510,507,508,434,645,-7,-491,-1050,213,-427,-1007,-1003,-997,-913,-992,-993,-936,-424,269, +-1008,-568,-658,568,461,415,311,526,596,614,584,618,731,678,646,584,638,640,632,584,582,467,-582,200,165, +111,18,192,279,286,38,288,363,178,221,-64,-36,349,-90,467,654,479,263,764,950,1026,846,806,968,834, +822,709,760,732,746,618,693,180,-100,56,159,242,12,149,-30,336,-89,164,-80,166,-20,-44,-130,38,60, +764,620,310,-82,482,834,1006,838,931,1351,1145,1055,908,1017,1023,962,809,729,237,-186,302,48,395,335,145, +298,203,211,82,161,299,184,83,190,292,-602,89,311,444,755,1353,1196,584,532,383,481,507,487,241,91, +77,295,375,668,135,-458,94,-38,118,146,108,236,243,118,256,153,-76,-69,-189,-313,-368,1,394,-5,-533, +-1163,-897,-832,-1045,-1155,-1032,-241,-478,-455,-221,2,446,1247,750,643,118,-276,-63,18,334,349,153,147,31,52, +6,151,437,167,167,-183,222,348,881,929,1231,1933,2330,2129,1059,1104,752,567,941,1126,1128,890,460,49,-165, +63,126,14,167,25,465,390,-169,140,109,117,53,100,-140,447,811,521,497,-36,-255,325,832,2072,1938,1463, +478,277,-83,-338,-732,-937,-965,-465,-112,83,133,130,-65,-259,92,117,282,244,-84,217,165,-3,195,337,399, +322,311,22,164,-593,240,1276,1201,1301,1312,1161,635,600,717,1246,983,853,596,241,3,148,103,281,343,117, +291,130,261,295,238,94,106,-13,137,67,-16,110,155,-12,7,-559,32,605,612,834,861,884,870,518,283, +247,162,34,-183,-55,129,347,240,137,-157,-170,-37,-122,118,196,168,184,157,311,265,286,315,254,235,79, +177,111,397,552,416,454,432,465,546,502,525,528,507,490,448,392,279,212,246,478,363,30,147,190,202, +80,190,22,262,-47,153,-30,85,36,-18,-140,74,-408,104,160,212,282,347,406,455,383,308,239,181,130, +98,121,157,181,177,144,216,-113,181,153,75,28,172,233,192,28,225,271,125,139,-17,1,165,-47,352, +258,296,306,317,329,362,333,324,311,296,278,245,252,248,249,262,244,344,19,-296,-650,115,-300,-730,-731, +-688,-592,-648,-627,-582,-302,115,-585,-366,337,-319,319,-478,-225,-257,-222,-286,-330,-393,-393,-384,-354,-331,-329,-352, +-357,-355,-344,-343,-292,-505,318,697,863,157,672,814,866,862,750,873,889,878,644,51,800,736,701,-267,-240, +-103,-29,-144,-275,-448,-497,-495,-412,-354,-357,-446,-485,-493,-469,-418,-457,-292,623,-11,162,133,204,10,-50,2, +202,-62,-166,90,-12,191,198,-191,333,-69,-229,53,207,-73,-352,-740,-816,-763,-550,-410,-396,-534,-592,-596,-557, +-496,-614,-167,220,123,182,99,292,-24,255,-169,256,-98,214,199,135,97,227,74,421,-91,-103,471,836,431, +-69,-699,-874,-856,-556,-327,-341,-616,-781,-836,-769,-709,-748,-350,171,-211,283,85,33,-118,110,199,-39,55,-8, +229,71,130,97,-16,327,-650,-1184,-1110,-1418,-851,-641,-855,-1001,-1044,-880,-825,-515,-278,-144,-166,-456,-398,-667,-254, +198,-253,55,27,190,257,184,163,102,227,75,4,-95,66,61,260,48,-476,-1315,-964,-453,66,216,51,-496, +-489,126,6,-68,-173,-471,-651,-828,-422,-432,12,193,45,155,115,97,-26,43,24,46,-33,131,106,293,45, +-173,-352,839,797,1202,1272,492,489,-242,-1360,-1460,-1395,-798,-1071,-1067,-925,-923,-596,-137,-166,-429,-226,-141,-127,195, +402,343,-36,92,7,50,61,144,-28,551,667,990,812,82,261,304,478,41,621,722,193,728,717,759,21, +-320,-379,-685,-829,-787,-653,-566,-211,168,67,32,154,108,-139,67,161,21,126,215,240,337,198,99,-39,797, +662,68,138,128,-120,-304,-366,57,397,936,745,593,366,377,326,180,274,175,131,255,31,128,293,308,170, +172,87,145,136,192,258,338,401,435,513,603,403,-40,71,152,-106,-319,-496,-455,-320,-21,-50,-24,-80,-186, +-202,21,-48,-18,108,57,151,303,174,114,180,172,198,70,208,278,211,240,210,204,235,388,168,-19,85, +33,14,-30,-119,-43,-13,19,87,145,193,221,239,218,217,130,284,424,272,191,177,230,154,237,131,331, +138,213,138,174,249,326,273,323,54,-28,-57,-126,-175,-231,-279,-268,-267,-267,-253,-226,-175,-185,-187,-201,-159, +-167,-157,211,41,161,191,284,262,208,261,349,220,176,231,197,222,202,59,307,-64,-11,-36,-51,-64,-78, +-103,-100,-98,-90,-89,-93,-95,-88,-73,-60,-62,-39,-129,261,460,469,241,518,526,532,506,442,494,481,462, +487,249,406,489,-3,-49,-576,77,-88,-103,-103,-118,-110,-82,-79,-59,-26,-25,-29,-53,-34,-27,-5,-26,-39, +120,-563,-681,-338,-455,-681,-386,-436,-442,-377,-493,-503,-464,-681,-434,-372,-731,-579,-177,-124,-234,-220,-285,-267,-207, +-232,-189,-106,-50,-27,-73,-24,-21,38,-74,28,-98,-525,-115,-266,-168,-228,-214,-151,-254,-391,-217,-81,-142,-178, +-312,-392,-206,-437,-179,-175,-367,-343,-580,-506,-286,-308,-193,-64,-14,-11,-157,-16,2,139,-18,148,-108,-366,-127, +-29,-39,-191,-15,-163,69,-280,1,-205,-3,-156,-213,-331,-312,-463,-248,-221,-440,-466,-869,-820,-518,-616,-450,-224, +-57,-54,-201,-5,55,221,-80,175,-13,-360,234,21,216,176,141,169,169,150,31,103,247,71,-113,-159,-337, +-1048,-846,-608,-726,-787,-479,-322,-258,-156,-52,72,260,328,257,-196,-226,546,312,392,-261,-443,180,75,79,79, +260,199,143,117,77,-65,-124,-277,-463,-468,-737,-628,-302,-285,-578,-469,-555,-588,-463,-645,-652,-307,-568,-657,-739, +-343,-257,-366,-441,-192,-303,-283,-127,-16,315,264,-82,-7,-25,28,-49,-2,-53,152,111,-351,-295,627,931,815, +308,-481,-699,-788,-697,-285,-12,379,112,-106,-486,-570,-581,-343,-197,50,-152,-273,-17,12,159,183,-25,102,57, +15,70,125,-103,233,524,607,677,-62,-366,-923,-988,-713,101,303,231,-516,-957,-896,-957,-848,-771,-726,-673,-512, +-421,-198,-252,-283,-82,72,35,24,-87,42,34,39,67,183,378,351,256,128,89,-226,-712,-801,-840,-669,-546, +-409,-152,-246,-197,-114,-218,-232,-278,-78,67,151,29,41,35,-135,24,167,292,298,105,133,183,136,124,9, +-32,78,122,121,-187,-177,-437,-279,-204,74,74,82,115,-249,-242,73,91,52,-83,-196,-194,64,175,202,124, +112,96,-28,-56,10,93,166,168,204,257,252,136,194,88,-6,-201,-211,-85,53,18,49,-50,-111,-147,-170, +-232,-344,-180,-2,174,234,277,325,252,278,151,25,76,93,153,152,205,124,140,-5,66,-8,5,-59,-146, +-214,-151,-23,14,37,-28,-33,-40,-44,-83,-73,-50,-42,-50,-106,-166,-163,-151,-124,-98,-37,-38,-129,-13,-79, +-6,-27,6,58,11,-7,91,177,167,147,109,45,91,-212,105,61,54,49,34,27,26,33,31,34,25, +31,31,46,51,55,54,47,100,-200,-257,-24,-160,-255,-12,-33,-22,8,-40,-50,-37,-217,-140,14,-236,71, +264,507,167,204,254,292,355,365,330,292,267,260,258,259,267,245,244,257,258,236,237,557,413,-245,554, +437,-194,-155,-147,-170,-95,-74,-48,425,530,-239,387,117,208,122,273,352,551,578,455,355,296,307,291,294, +331,299,314,357,358,280,433,229,295,425,259,249,361,278,371,377,337,254,275,268,194,208,192,199,24, +-82,145,345,908,1022,763,540,353,328,310,321,384,275,286,364,347,285,387,451,361,327,294,284,300,185, +96,228,56,183,254,177,129,66,118,-193,-242,-307,-34,276,1200,1388,966,593,358,328,319,360,511,431,442, +559,538,368,495,357,188,325,203,115,109,136,130,3,72,47,169,64,13,-261,-233,465,413,155,230,187, +379,478,555,386,122,-284,-186,-326,-573,-281,-86,-115,-22,23,385,391,214,345,207,229,291,195,127,71,117, +42,142,-49,-52,84,381,-198,-347,-683,-367,3,815,866,622,-173,-439,-243,132,421,411,539,560,661,588,407, +264,128,165,283,325,276,-34,-28,-32,64,-61,-17,-84,246,309,97,-156,944,1390,1141,1209,1650,1006,833,1015, +-202,-440,118,422,628,436,234,11,-86,50,-1,58,132,89,364,260,155,-22,49,28,6,57,124,20,315, +479,843,856,-51,155,823,1604,2566,2336,1765,805,178,-123,146,71,171,1,208,184,24,18,-15,35,3,129, +315,161,154,120,17,77,115,38,108,341,388,453,230,160,284,1060,1554,1335,1030,1189,1150,1163,887,916,1379, +994,740,518,187,59,74,114,137,243,242,244,183,275,280,179,208,226,401,265,237,238,239,280,248,622, +-63,395,471,425,365,445,429,421,27,-134,-123,228,571,786,863,728,358,300,245,154,194,282,377,266,133, +95,170,205,214,264,287,270,304,374,316,371,328,218,285,410,513,484,465,490,435,386,270,218,146,123, +116,143,167,241,243,346,322,163,68,153,217,297,202,182,163,141,160,195,205,220,222,267,102,418,371, +377,371,370,368,367,268,182,112,58,15,-31,-19,-16,-20,-19,-49,-3,28,160,277,232,295,400,387,459, +439,438,390,375,364,309,329,356,441,360,313,329,317,323,323,337,309,293,273,243,212,169,181,184,184, +192,192,175,341,277,-77,430,355,-39,-22,-18,-15,16,28,37,337,471,-75,310,337,-403,-415,-445,-367,-413, +-391,-468,-486,-444,-489,-479,-420,-430,-421,-416,-407,-400,-392,-398,-344,-413,-370,-54,659,-453,-103,588,540,523,491, +477,470,462,-124,-506,549,-92,-21,-530,-398,-456,-414,-620,-681,-569,-693,-662,-515,-536,-525,-533,-530,-522,-491,-470, +-385,-409,185,-168,-232,-110,-87,-240,-282,-380,-295,-363,-298,-166,-234,-130,-271,-443,-459,-499,-472,-535,-411,-888,-1051, +-795,-1064,-996,-670,-747,-676,-654,-610,-579,-557,-494,-434,-217,-86,-41,-12,-69,1,-37,-12,-187,-123,-107,-32,-8, +-42,-132,-248,-378,-532,-473,-334,-407,-247,-1008,-1287,-957,-1365,-1254,-732,-848,-854,-840,-870,-831,-743,-609,-391,-183,169, +100,193,71,93,173,94,125,7,14,29,197,40,-150,-299,-542,-148,-844,-1134,-1231,-1085,-1025,-937,-805,-598,-627, +-1062,-763,-610,-376,-249,-291,-336,-451,-584,-573,-143,-66,76,28,65,255,117,40,36,11,2,13,-150,-170,-177, +-111,-779,-802,-630,-541,-448,-442,-434,-245,-774,-745,-723,-158,-40,-328,-494,-776,-948,-760,-574,-225,89,63,65,171, +172,-28,-32,-19,15,-88,-54,-167,171,21,-184,-663,1083,886,514,-197,-1667,-2511,-2722,-1718,-1788,-1426,-1252,-1208,-1285, +-1545,-1064,-676,-329,-159,-118,-338,-266,-51,307,-100,-141,-58,-66,-29,-39,-42,-7,-73,143,345,896,857,153,127, +-675,-1018,-1400,-926,-594,19,-989,-1138,-885,-663,-440,-451,-600,-758,-702,-720,-513,-200,9,13,311,96,56,114,14, +-4,28,-54,7,195,354,270,336,155,425,-415,-1352,-1352,-1416,-1275,-1004,-403,-481,-469,-694,-491,-509,-713,-549,-407, +-212,-116,-149,-154,-8,-51,154,169,158,68,120,145,288,162,141,80,123,174,322,-23,303,-414,-682,-560,-587, +-332,-302,-570,-210,-25,-37,94,180,253,242,155,-5,-64,-21,196,236,163,151,84,72,26,38,90,158,84, +90,137,189,94,108,-161,-123,-172,-174,-150,-169,-205,-200,-198,-205,-246,-246,-189,-135,-43,-62,-38,-11,-36,-139, +-151,-26,-44,-78,14,168,219,232,47,72,52,130,94,68,51,89,-36,452,8,-25,-91,-130,-183,-239,-293, +-228,-150,-85,-19,36,87,70,57,47,27,54,-17,69,-41,-71,30,2,-79,-77,-70,25,-27,-10,92,68, +176,138,42,-31,-117,-61,-99,-116,-131,-144,-179,-132,-111,-89,-71,-52,-24,-37,-42,-48,-56,-50,-74,-82,97, +493,-135,92,556,548,534,504,504,495,472,129,-131,551,190,-122,433,158,523,310,353,323,433,476,497,467, +457,465,438,433,433,449,454,456,448,391,548,187,-201,-796,321,-161,-735,-751,-748,-689,-716,-707,-661,-152,364, +-785,-264,-432,454,236,240,263,572,694,707,626,571,590,521,509,511,566,584,588,541,517,521,-266,280,258, +162,93,292,261,282,128,303,338,208,257,34,-8,315,38,338,191,63,-38,541,831,956,854,762,793,622, +599,638,709,721,737,601,638,375,198,251,228,272,106,296,-10,198,-28,125,28,188,101,72,-126,147,-35, +365,-21,-191,-178,694,1184,1335,1104,926,993,766,738,806,928,968,958,810,708,490,171,432,194,324,257,301, +168,68,62,38,125,227,197,116,-122,166,85,222,359,229,111,490,635,712,965,871,405,261,184,77,314, +318,185,249,501,368,-52,277,230,164,135,233,127,56,70,91,39,43,-25,-116,-153,184,-389,-208,-50,150, +57,167,246,318,-44,-279,-632,-305,-143,132,350,624,1071,759,602,171,-17,112,217,318,315,75,13,34,52, +45,44,-49,139,266,144,-49,786,755,481,185,454,516,775,1391,545,223,59,735,993,823,820,445,-35,-77, +127,168,173,291,487,40,-84,19,-24,67,38,10,28,-25,42,241,711,736,155,224,1018,1627,2699,1999,1252, +631,-397,-597,-416,145,283,7,185,276,382,294,165,-1,-205,28,399,93,62,139,50,33,31,-29,35,314, +364,510,400,336,-215,536,1381,1229,1108,1323,1599,1748,1268,943,608,364,223,116,-151,-317,-251,-261,-90,70,30, +204,208,159,164,153,161,236,304,326,262,174,142,151,113,287,-443,164,435,347,530,602,651,851,557,353, +170,450,620,767,767,754,617,480,324,106,122,170,111,257,247,149,137,140,259,173,183,256,254,300,216, +228,167,277,390,343,380,420,496,588,515,475,372,242,96,-34,-20,-4,30,34,92,47,-18,-16,12,72, +81,209,107,209,44,169,100,191,135,89,7,145,-126,282,308,347,386,429,453,487,412,354,320,262,221, +163,177,167,163,155,133,178,17,217,254,186,177,288,304,300,193,292,278,196,218,135,170,275,180,391, +319,347,354,362,373,402,373,353,325,308,291,266,270,271,271,281,270,319,170,-39,-350,255,-21,-377,-376, +-351,-299,-321,-304,-284,-39,255,-308,-66,381,-328,86,-452,-283,-319,-257,-323,-341,-335,-358,-363,-353,-358,-359,-358, +-352,-347,-347,-342,-285,-448,123,478,798,-24,437,762,759,747,664,751,764,746,412,-110,714,485,476,-345,-357, +-303,-167,-315,-381,-387,-457,-476,-443,-438,-441,-457,-462,-457,-462,-398,-395,-275,545,-19,50,74,127,-34,-130,-138, +32,-147,-191,6,-57,113,18,-268,76,-213,-508,-374,-58,-307,-446,-458,-590,-632,-566,-588,-586,-578,-561,-538,-550, +-449,-490,-72,242,153,119,68,229,20,130,-222,93,-95,157,95,116,57,30,-40,69,-260,-564,-284,279,-98, +-357,-471,-706,-831,-681,-619,-644,-698,-749,-740,-728,-560,-503,-101,378,48,314,84,64,130,41,62,-89,15,22, +151,100,97,-169,-220,453,-824,-993,-1045,-1246,-1109,-930,-896,-403,-332,-784,-930,-806,-362,-109,-107,-564,-465,-607,-193, +221,-139,87,46,137,232,42,-14,55,1,-64,63,-57,23,-14,414,-429,-802,-548,-11,443,255,235,472,-24, +-363,-518,-302,-203,-142,-460,-609,-720,-424,-419,-53,263,182,292,34,16,42,-13,14,19,-29,12,-123,113,-30, +38,-535,847,207,-184,-795,-1923,-1870,-1860,-1580,-1420,-1151,-1119,-1183,-1146,-886,-639,-373,-132,-135,-303,-184,-48,34,488, +-18,-118,65,-81,3,15,-21,-14,-7,39,84,711,695,420,647,734,661,-97,-181,-311,-352,-368,-224,-163,165, +162,-9,-305,-475,-510,-500,-473,-202,14,-50,256,30,11,91,-20,17,0,-22,8,128,307,324,515,291,648, +198,-502,-454,-555,-285,-32,256,232,-1,-477,-413,-385,-256,-195,-201,-359,-196,-198,-172,70,4,188,118,73,50, +186,184,259,226,290,343,272,266,399,279,575,161,-169,-107,-164,-254,-331,-273,48,253,364,268,237,362,289, +260,209,114,88,204,175,148,206,192,186,161,81,92,14,25,54,100,180,199,286,205,141,-75,-222,-169, +-210,-164,-147,-185,-144,-150,-130,-146,-148,-154,-183,-198,-226,-207,-255,-181,6,32,72,54,123,82,193,68,251, +136,227,163,170,195,261,128,421,94,45,21,-47,-104,-166,-216,-167,-115,-64,-15,32,82,75,67,49,43, +33,-15,204,41,86,135,185,121,70,95,183,56,15,89,76,167,173,62,213,-36,15,-19,-29,-41,-52, +-80,-63,-60,-54,-44,-33,-11,-20,-18,-13,-19,-4,-62,166,353,501,124,377,572,571,545,486,520,510,479, +366,126,477,403,18,142,-304,292,86,92,86,81,100,161,146,150,156,137,131,126,151,158,157,154,131, +288,-291,-504,-485,-173,-496,-487,-539,-545,-477,-558,-562,-532,-486,-126,-511,-566,-539,126,80,-22,-23,-82,-24,139, +145,169,169,145,141,134,202,208,202,148,216,136,-395,50,-75,-36,-103,-30,-7,-73,-211,-19,91,-19,17, +-150,-263,14,-290,81,67,-124,-58,-302,-195,198,166,219,227,130,101,54,220,246,270,187,325,107,-113,34, +56,83,-72,79,-148,87,-217,56,-100,30,-12,-54,-260,-122,-394,17,-8,-246,-241,-669,-525,62,91,201,243, +175,112,51,284,338,341,188,344,230,-24,416,131,255,216,282,121,30,72,16,140,188,168,19,-245,-215, +-377,-536,31,-180,-319,-30,152,157,656,700,339,225,72,82,47,88,431,391,554,102,-243,198,74,136,111, +171,49,-3,88,-90,-111,37,-64,-205,-273,-87,-600,-223,312,217,148,-367,-619,-525,-255,-159,-257,-494,-512,-259, +-56,94,205,-7,73,-150,-116,73,219,157,100,47,3,2,-10,-33,-54,-55,-82,14,28,-188,374,-156,-721, +-1151,-1547,-966,-392,-100,503,499,-29,90,203,473,389,225,17,14,221,75,17,198,286,-47,-114,65,-22,86, +34,15,2,-24,-120,1,207,401,422,488,906,895,822,479,34,-339,-538,-600,-725,-448,-307,-78,-124,-56,-20, +-38,-16,-143,-289,-71,221,25,23,101,0,-30,-11,31,91,253,273,403,514,445,-310,-363,-114,-72,221,502, +759,837,517,83,-505,-614,-612,-386,-293,-202,-245,-197,-75,-58,-118,111,212,103,66,40,182,272,146,230,204, +236,152,98,104,-98,-107,4,275,190,209,219,374,642,533,565,621,437,275,205,179,220,332,334,290,149, +112,80,-29,92,194,206,161,86,68,52,54,112,134,166,177,153,-122,-23,66,-27,3,46,85,132,91, +54,13,17,43,37,50,33,38,35,155,52,-90,69,155,126,48,58,38,149,56,166,99,143,90,14, +-60,-29,-51,126,178,191,215,231,249,263,257,261,256,245,212,169,167,168,174,162,163,159,-36,93,35, +41,16,63,98,45,-17,67,112,55,81,44,50,136,-10,248,203,213,223,226,233,247,237,227,217,207, +206,204,207,203,201,202,189,250,-2,-134,-127,36,-145,-131,-144,-128,-91,-130,-130,-120,-122,42,-78,-130,260, +50,404,-47,28,34,62,71,76,68,68,60,42,46,42,40,31,29,27,38,46,-24,422,464,150,367, +466,164,193,195,148,239,259,258,461,335,132,472,341,79,-35,62,119,189,208,150,141,95,34,30,19, +26,26,38,32,72,18,168,365,182,300,205,215,203,125,186,260,173,104,179,190,220,184,96,262,77, +-151,-24,12,212,301,181,229,157,25,58,22,24,-23,-18,-19,38,-23,225,390,290,251,230,282,147,131, +-58,160,3,205,175,221,196,121,152,77,21,-167,-32,66,496,619,372,369,189,-71,-11,-16,-10,12,18, +9,74,-33,265,417,183,352,168,104,136,57,14,-73,34,61,126,136,134,-209,-92,648,-185,-344,-276,-473, +-352,-197,-88,168,167,-101,-252,-404,-556,-322,-168,-306,-135,-94,347,437,99,199,215,247,161,33,-12,41,-67, +-37,225,104,161,151,680,-80,-399,-270,132,253,377,317,99,225,134,-241,-216,-128,117,289,369,314,308,140, +136,148,195,391,34,-37,8,-17,-6,-34,-76,-81,-151,-130,-23,313,-133,173,-434,-863,-796,-431,40,355,143, +-30,-256,-458,-237,-4,372,185,139,63,128,11,135,282,191,386,94,-31,49,-45,23,-8,22,45,100,26, +-89,176,173,664,1012,1739,1959,1562,877,302,-373,245,287,6,-112,-85,229,272,272,4,2,-100,-52,64,103, +219,91,89,134,-28,16,18,67,96,127,279,453,571,534,350,632,685,786,955,1207,1224,933,728,424,295, +-156,-335,-154,-218,-137,-161,9,41,56,164,153,219,97,53,55,217,240,228,248,324,421,314,282,326,455, +441,583,492,431,208,110,151,369,424,460,457,426,398,301,352,277,123,122,111,131,142,140,261,229,214, +208,166,103,-28,36,78,165,173,279,370,490,275,130,44,73,65,138,160,167,185,214,242,172,117,64, +98,124,148,178,155,233,287,249,229,164,122,65,115,130,247,204,258,255,277,311,343,274,198,222,205, +235,227,221,218,233,192,144,108,79,66,57,52,46,40,47,38,64,150,110,182,170,228,243,205,237, +248,185,140,154,160,170,195,163,364,138,158,163,166,175,179,188,164,152,138,128,115,99,108,114,119, +125,131,97,325,378,223,326,405,245,255,249,228,262,263,254,383,326,200,381,188,-229,-400,-196,-216,-247, +-227,-285,-294,-269,-264,-252,-238,-234,-235,-249,-234,-232,-235,-233,-202,-196,-385,-245,263,-386,-270,198,153,141,145, +109,104,101,-272,-393,188,-272,-151,-290,-216,-298,-259,-445,-495,-420,-404,-365,-331,-295,-288,-328,-306,-312,-313,-308, +-225,-273,-53,-132,-208,-99,-111,-221,-217,-305,-297,-255,-167,-138,-136,-114,-252,-238,-309,-229,-261,-386,-254,-612,-724, +-592,-566,-488,-420,-367,-373,-454,-379,-370,-382,-334,-242,-161,-153,-60,-15,-16,-30,-77,-112,-127,-194,-39,-42,-33, +8,-37,-201,-209,-195,-83,-136,-303,-151,-768,-1042,-868,-827,-705,-581,-468,-466,-589,-529,-531,-519,-450,-225,-97,56, +182,155,127,141,179,47,0,0,3,106,168,156,39,-152,-156,-398,-886,-791,-915,-872,-941,-808,-542,-296,-103, +-90,-88,-102,-218,-217,-194,1,-156,-213,-296,-82,55,27,162,155,114,11,-44,3,-128,-81,65,34,-26,-134, +-142,-545,-499,116,34,-2,-344,-443,-416,-148,-107,-308,-332,-395,-515,-290,-306,-539,-438,-251,-135,15,78,175,-14, +-77,-23,-13,-2,-87,-98,-132,-225,-232,-152,38,-319,-199,-844,-1276,-1566,-1840,-1728,-1469,-1259,-521,-320,-510,-638,-738, +-670,-445,-205,-50,13,49,-108,-24,91,133,-77,-105,-10,-82,-25,-60,-11,-9,8,-124,-173,-168,-86,817,960, +513,-144,-1021,-1326,-1232,-659,-412,-438,-782,-940,-836,-387,-270,-205,-316,-243,-132,-128,26,79,117,44,25,46,0, +-22,-21,49,93,79,265,391,597,669,102,-499,-967,-752,-320,-231,-168,-180,-391,-638,-927,-1071,-1072,-883,-661,-419, +-217,-140,-129,-142,-70,-17,172,38,6,18,127,169,87,137,163,190,175,168,267,-61,332,-103,-163,-161,-218, +-142,-56,-9,335,489,501,341,121,-169,-159,-211,-245,-155,-60,71,98,40,59,60,124,117,80,30,25,11, +22,82,88,63,138,52,-83,-51,-63,-129,-175,-191,-217,-271,-214,-157,-53,-11,62,122,165,199,245,191,134, +42,68,144,175,138,106,82,117,121,111,158,165,159,136,112,114,23,180,-24,-7,-34,-42,-61,-67,-79, +-27,6,30,49,56,55,58,67,89,95,156,140,64,17,-62,2,-36,-99,-85,-117,-91,-82,-45,-3,-3, +43,14,-1,-107,-60,-36,-50,-48,-53,-57,-71,-56,-49,-39,-27,-13,1,11,17,22,30,35,64,-73,-11, +268,-127,-57,269,260,256,256,236,230,224,-21,-135,286,-2,-53,312,268,346,241,276,260,328,349,345,345, +340,329,331,326,313,318,316,309,312,274,346,269,22,-500,355,60,-465,-454,-447,-422,-402,-388,-369,74,382, +-488,3,-108,390,224,241,230,398,463,448,451,434,408,411,402,372,396,398,387,380,337,372,-92,220,270, +182,137,234,209,252,177,280,277,190,261,137,107,306,211,303,206,212,160,465,619,603,631,606,551,558, +529,467,489,479,450,409,392,270,201,209,215,272,172,171,0,84,20,103,116,151,188,183,5,229,266, +401,169,127,64,496,745,745,767,729,628,648,654,581,650,642,595,548,435,353,183,282,212,292,236,176, +68,-43,-28,43,152,163,239,237,-26,309,-26,91,210,200,284,430,533,701,594,582,638,450,279,-23,137, +196,194,233,372,383,184,259,168,280,248,102,33,-25,-13,-61,-35,90,168,154,48,132,-38,36,172,201, +100,242,248,39,242,207,118,-119,-164,-105,194,474,717,575,455,227,94,172,295,87,20,22,15,23,-70, +-47,-82,-140,-136,46,182,135,-450,-683,-953,-688,606,828,1076,1045,757,463,375,498,621,656,643,451,99,60, +102,212,297,230,149,53,3,-13,-42,1,-27,30,21,32,-82,-156,-222,-231,922,1080,1430,1505,1843,753,208, +23,83,62,-9,-183,-209,-103,187,390,397,439,316,77,92,198,155,85,49,35,23,39,5,55,101,111, +287,540,634,800,42,664,1413,1524,1736,1640,1419,980,490,196,173,-16,-77,-105,-195,-249,-165,-222,-150,17,95, +163,129,28,39,138,128,160,158,232,253,267,248,252,224,441,-4,439,557,434,441,480,600,840,696,552, +391,417,374,231,222,165,11,45,33,-29,34,114,241,253,208,130,112,90,138,139,153,186,165,245,237, +389,300,342,353,317,309,348,351,357,376,439,485,415,346,271,285,293,302,312,322,292,239,217,208,195, +142,172,134,248,187,234,198,245,248,256,232,283,-81,188,209,260,298,339,386,439,385,315,260,198,157, +109,140,160,188,204,216,288,135,246,266,193,179,234,232,235,166,210,180,131,140,84,116,170,204,232, +204,231,242,255,263,285,252,239,221,212,198,171,192,202,211,230,231,272,248,117,-180,273,108,-228,-214, +-196,-164,-160,-144,-127,85,248,-183,53,243,-287,-85,-362,-234,-270,-242,-313,-333,-327,-334,-324,-304,-287,-287,-307, +-307,-309,-312,-302,-255,-370,-76,214,625,-160,185,565,555,545,495,541,548,521,174,-215,553,226,327,-306,-245, +-246,-183,-343,-411,-410,-456,-438,-389,-338,-333,-395,-405,-418,-431,-377,-349,-321,301,-91,-52,19,47,-136,-172,-207, +-99,-176,-169,-62,-76,55,-42,-212,-11,-213,-281,-229,-144,-460,-590,-588,-666,-609,-500,-381,-371,-509,-509,-519,-551, +-427,-435,-184,30,13,55,46,141,-93,16,-203,-41,-47,106,6,100,65,-40,-76,153,-139,-201,-102,100,-326, +-560,-649,-809,-787,-645,-449,-424,-656,-688,-723,-765,-580,-487,-243,162,-6,211,138,135,54,-21,-40,-99,34,112, +121,160,111,-100,-69,-272,-792,-799,-744,-755,-993,-1028,-885,-764,-521,-221,-282,-275,-185,-178,-185,-344,-367,-463,-193, +153,-43,23,159,192,97,-9,-69,-46,-131,-98,2,74,143,57,-128,-89,-307,-275,-234,5,16,55,41,28, +-28,3,-186,-233,-320,-513,-655,-817,-534,-409,-62,202,153,150,-83,-120,-16,15,16,-99,-107,-106,-142,-103,-213, +-118,-213,-468,-904,-969,-948,-1033,-1286,-1503,-1438,-1073,-720,-482,-967,-1178,-1125,-844,-459,-129,-121,-205,-151,2,-20,-29, +-78,-42,-30,-68,-49,-49,2,-32,-47,-73,-158,-146,-332,965,879,191,-477,-1329,-1587,-1300,-500,-434,-365,-275,-350, +-378,-394,-444,-472,-395,-301,-198,-115,238,133,-1,8,-21,-38,-5,15,-29,9,47,-26,229,324,633,716,598, +172,-256,-99,18,-163,-445,-724,-803,-862,-998,-643,-529,-647,-363,-293,-306,-292,-333,-277,-1,-60,37,-5,8,104, +72,44,86,122,202,237,257,288,384,261,511,42,-233,-163,-194,-133,-63,-79,225,327,258,99,-66,-224,-341, +-373,-340,-284,-182,8,64,103,222,155,122,77,44,73,83,103,101,66,107,83,131,95,158,78,-33,-36, +-113,-113,-142,-195,-117,-44,83,138,201,264,232,210,169,138,60,65,155,151,142,136,185,153,231,151,251, +165,216,153,183,225,299,184,256,-44,-60,-85,-114,-141,-160,-180,-103,-48,-4,41,87,138,148,165,183,207, +245,229,291,146,111,143,111,10,-24,-29,33,-45,-54,1,-10,56,34,-42,5,-142,-89,-110,-113,-123,-133, +-161,-135,-119,-97,-72,-51,-25,-23,-16,-10,-11,0,-17,67,214,426,-18,181,432,430,411,373,384,372,352, +158,-61,376,184,-132,258,-54,363,210,231,203,229,243,270,253,257,265,275,274,255,265,263,256,259,225, +347,-65,-310,-515,58,-284,-514,-533,-532,-477,-516,-514,-499,-266,106,-522,-345,-336,287,241,196,170,225,268,336, +299,307,319,350,355,304,337,327,310,278,292,219,-325,111,75,66,5,69,99,82,-46,143,207,68,137, +-20,-85,202,-37,181,271,170,109,159,238,390,295,334,372,444,440,306,388,369,348,300,367,100,-55,58, +125,170,19,57,-103,106,-141,119,10,45,82,79,-152,61,22,201,206,91,50,135,264,492,365,393,420, +536,560,361,503,493,432,337,352,116,-98,260,104,308,267,134,46,-64,-13,62,206,131,231,118,-117,146, +-678,-103,432,364,172,125,126,280,236,417,769,604,440,208,88,80,346,334,509,276,-68,262,142,230,163, +67,23,-35,-33,-116,-83,-18,81,39,14,-380,38,236,131,-83,-4,89,92,1,102,93,116,-160,-215,-104, +31,171,312,151,205,36,6,100,46,63,41,7,39,23,-85,-57,-82,-30,-167,-126,-132,185,-698,-758,-439, +-139,346,345,337,353,457,474,497,464,405,291,224,81,-65,-77,120,112,163,161,-127,-39,14,-15,15,38, +-6,44,-8,-70,-85,-99,-322,-435,763,479,405,156,264,-1,-73,-7,-317,-437,-384,-233,-183,-281,-74,63,220, +205,198,-19,38,140,-37,-1,-11,-39,12,10,-21,15,69,77,175,368,557,722,93,493,1170,1173,1202,900, +529,48,-164,-219,-248,-32,-33,-258,-213,-280,-327,-355,-223,-132,-99,65,25,30,69,163,54,58,36,164,187, +200,223,240,191,323,-171,142,375,338,468,632,781,857,596,368,148,78,-18,-127,-205,-147,33,48,33,-51, +38,113,90,148,145,119,138,147,214,221,201,165,148,158,95,163,162,278,355,302,300,312,332,396,395, +440,478,460,437,412,393,351,322,294,359,282,126,153,160,170,143,170,135,217,124,168,100,122,132,131, +107,177,-135,139,167,181,216,253,289,313,307,289,276,259,245,222,244,264,281,299,300,343,199,292,244, +180,129,156,173,138,68,143,165,91,112,41,52,143,2,225,174,197,205,208,211,223,217,217,216,218, +221,220,220,216,215,215,201,244,74,-82,-209,95,-110,-270,-273,-258,-226,-252,-251,-234,-127,77,-240,-156,199, +-68,255,-184,-52,-58,-33,-52,-63,-73,-88,-91,-97,-65,-59,-67,-82,-89,-93,-83,-63,-167,260,416,395,188, +405,366,394,393,340,423,437,413,401,143,353,439,439,-61,-70,0,36,32,10,-27,-96,-123,-134,-68,-58, +-88,-125,-134,-139,-91,-125,-45,351,73,187,147,168,68,20,53,148,64,12,87,89,176,138,17,221,-72, +-140,1,37,76,33,-68,-169,-192,-227,-54,-23,-75,-161,-193,-213,-129,-190,5,215,161,195,155,219,1,94, +-107,89,13,189,72,174,166,65,109,294,-43,-89,78,158,330,294,118,-95,-225,-316,-86,-23,-125,-222,-265, +-287,-169,-237,-64,200,14,268,171,131,-5,-28,-55,-132,73,123,73,153,118,-129,80,-67,-241,-310,-167,-296, +-450,-515,-464,-604,-463,-138,-234,-209,-188,-259,-256,-365,-232,-229,182,344,63,215,181,176,61,12,-36,-66,-105, +-69,53,96,229,304,12,291,-153,-470,-228,85,320,387,261,139,56,119,41,-9,-73,-132,-170,-280,-127,-149, +65,218,144,52,-71,-71,-31,7,6,-84,-78,-85,-124,-202,-301,-149,6,-518,-555,-38,142,1,-129,-401,-614, +-705,-632,-446,-462,-433,-452,-450,-362,-219,-150,-211,-40,189,69,-80,8,60,-4,4,-6,-23,29,-9,-11,60, +-98,-180,-412,680,351,30,-192,-699,-386,-251,-403,-47,19,8,1,-66,-224,-158,-166,-166,-197,-185,-76,247,157, +-95,-22,-33,-61,-36,10,-30,-8,15,-62,95,204,492,562,819,957,885,862,559,301,-137,-614,-454,-308,-86, +60,53,-87,-168,-241,-325,-236,-190,-166,29,-25,-24,42,64,136,57,-11,56,122,230,313,350,391,425,603, +430,347,233,339,356,435,412,285,212,42,-142,-278,-318,-297,-292,-254,-156,-165,-134,-31,65,116,192,122,79, +94,131,181,137,195,204,186,187,202,224,282,314,207,137,185,151,188,206,235,278,339,419,389,353,329, +288,250,206,216,177,252,301,211,157,141,177,114,180,100,214,113,162,113,183,260,344,277,232,134,104, +106,91,79,65,54,57,51,52,69,104,150,148,150,136,141,115,112,300,185,220,202,233,198,160,180, +223,145,117,135,125,146,157,107,215,56,84,78,75,72,67,57,66,75,84,95,100,110,95,89,85, +75,79,20,206,293,279,191,309,282,290,278,242,270,263,251,281,185,215,286,86,-10,-271,40,-15,-18, +-12,-42,-47,-25,-41,-40,-41,-14,-7,-9,-11,-12,-13,-12,-9,48,-263,-281,-35,-214,-293,-86,-116,-121,-92, +-137,-142,-146,-285,-196,-91,-315,-211,-60,15,-42,-28,-114,-133,-65,-112,-104,-100,-25,9,3,-19,-41,-39,-55, +6,-72,-181,-27,-83,-39,-74,-111,-83,-138,-186,-77,-3,-64,-38,-87,-171,-34,-212,-99,30,-70,5,-191,-253, +-122,-233,-212,-205,-59,-7,-32,-44,-66,-62,-60,29,-85,-147,-21,65,37,-55,-53,-113,0,-158,59,-31,-41, +10,-3,-194,-102,-13,3,93,-38,19,-263,-387,-172,-331,-326,-304,-107,2,-4,-84,-140,-140,-141,6,-84,-95, +166,123,189,178,75,0,-62,-22,69,176,103,168,23,-108,66,-858,-394,-86,-91,-194,-319,-379,-296,-391,-223, +203,230,241,201,-27,-70,197,102,124,-57,-114,151,190,147,69,21,27,-20,-62,-127,-91,-35,24,24,105, +-585,-48,-58,83,-112,-147,-214,-242,-287,-122,0,62,-29,-95,-288,-198,-217,-308,-294,-112,-90,40,50,-130,-25, +-8,-30,6,-4,-85,-58,-111,-142,-293,-319,-337,23,-462,-330,75,19,-481,-597,-700,-742,-296,-162,-268,-149,-170, +-357,-300,-271,-198,-152,3,-101,9,83,-203,-62,37,-5,13,11,-10,11,-45,-52,-40,-92,-338,-369,369,-111, +-785,-1210,-1463,-829,-522,-453,-373,-360,-393,-366,-359,-367,-285,-250,-167,-211,-86,-64,43,86,-113,-71,-79,-99,-18, +-37,-65,-29,-3,-54,0,98,342,440,434,405,323,184,-15,-378,-663,-824,-634,-510,-468,-353,-244,-175,-237,-256, +-189,-208,-149,-173,-187,-94,-50,24,58,88,20,-1,-37,75,127,189,291,324,318,309,86,13,203,311,503, +639,641,434,215,-13,-182,-411,-528,-519,-438,-351,-203,-146,-70,-33,41,57,-44,-35,3,49,134,176,216,205, +197,180,183,153,122,100,68,181,265,224,226,218,241,300,303,325,360,350,335,300,273,238,216,197,209, +160,108,115,119,125,113,107,92,106,38,83,43,51,63,66,70,94,60,108,137,135,164,184,201,204, +210,215,219,225,230,236,221,208,192,172,162,132,85,122,76,87,63,66,91,61,46,94,141,113,121, +97,84,132,-8,177,161,166,169,167,169,173,184,193,201,209,216,227,212,200,191,178,166,179,1,-46, +50,15,-59,43,32,35,49,19,12,18,-41,27,55,-43,180,179,303,129,147,172,174,208,213,200,188, +177,151,178,187,202,180,175,174,178,162,160,316,227,-118,323,235,-116,-89,-82,-85,-40,-30,-34,243,322, +-130,220,150,195,122,186,198,311,344,304,260,210,150,195,223,270,221,215,223,232,188,243,117,190,277, +172,154,187,154,208,219,224,180,153,185,157,170,215,223,113,101,210,214,416,490,386,327,250,132,261, +304,397,277,251,256,248,211,191,236,225,248,208,158,98,53,39,111,84,142,92,156,170,70,177,316, +111,54,197,207,580,720,611,492,306,81,225,370,536,384,339,343,336,227,196,167,154,256,215,154,36, +-13,-71,-75,93,134,55,151,137,-26,256,-198,193,214,302,180,279,268,268,-120,-129,281,186,118,22,35, +51,14,152,211,312,243,195,325,184,114,12,39,4,-70,-65,-37,54,105,198,320,-123,345,76,-118,-64, +-210,190,270,24,123,98,-6,66,109,31,121,216,346,289,213,163,159,121,-11,-2,22,-2,4,-14,-60, +-42,-91,-132,-212,-199,-138,218,-257,1,292,525,819,852,759,403,102,-97,-71,256,392,291,179,20,-114,-100, +-76,64,210,131,-56,44,91,9,12,7,16,14,-32,0,45,-76,-166,-256,162,-192,-420,-204,256,490,418, +-141,98,157,174,150,114,33,122,151,121,78,38,76,113,108,-52,-39,-43,-65,-15,-5,-66,-46,-49,-134, +-69,39,214,241,751,1291,1502,1270,894,440,121,-58,49,130,311,186,207,307,91,-42,-60,-79,-60,-17,15, +15,-50,25,54,80,37,13,62,131,221,326,449,500,444,790,237,523,635,688,780,807,717,546,120,-189, +-352,-425,-376,-246,-145,-94,-126,-96,-66,-39,54,96,95,47,17,57,159,220,219,239,248,239,266,330,305, +431,386,401,438,489,518,555,601,697,664,649,612,497,365,221,183,148,105,146,143,206,238,162,147,152, +147,146,115,131,133,121,119,132,175,221,247,308,133,318,320,357,390,427,453,485,413,356,311,275,261, +251,232,206,175,150,101,97,142,184,247,208,244,296,293,324,309,311,295,272,276,240,260,287,357,324, +312,332,335,344,351,372,353,345,333,323,308,294,283,275,267,258,250,222,311,272,64,351,301,65,74, +77,80,95,101,109,295,379,58,278,349,-194,-195,-238,-165,-186,-165,-211,-224,-222,-230,-230,-230,-211,-203,-187, +-205,-206,-201,-197,-165,-210,-167,13,406,-218,-24,339,321,315,304,298,294,274,-30,-244,341,-2,96,-285,-182, +-197,-155,-265,-310,-307,-346,-353,-346,-301,-266,-223,-273,-284,-271,-248,-198,-215,132,-63,-75,-30,-27,-142,-148,-190, +-125,-156,-131,-88,-109,-34,-80,-169,-154,-272,-205,-188,-104,-320,-410,-424,-489,-490,-488,-381,-327,-253,-345,-357,-332, +-267,-223,-118,-21,22,69,-2,7,-84,-33,-93,-39,-3,14,-51,2,-6,-62,-134,-14,-283,-197,-138,-17,-329, +-492,-526,-634,-699,-700,-569,-437,-319,-477,-518,-477,-372,-230,-134,74,66,201,110,94,22,-47,-56,-37,71,104, +42,78,-2,-45,-52,-565,-422,-434,-429,-399,-488,-576,-632,-742,-558,-51,-69,-36,58,-53,-80,-87,-130,-219,-213, +29,45,183,87,38,-2,18,-8,-75,-94,-59,-26,25,74,155,-459,51,-179,-88,-207,-358,-274,-241,-305,-235, +-232,-231,-128,-98,-188,-311,-466,-601,-436,-263,-60,104,47,-113,-61,-21,-3,6,-22,-64,-68,-111,-131,-205,-298, +-264,-38,-147,-34,94,-50,-684,-858,-1040,-1177,-844,-605,-470,-570,-684,-712,-596,-396,-147,-157,-147,-168,-79,-27,-127, +-74,13,-1,-26,-24,4,-20,-81,-88,-36,-106,-155,-216,-116,-530,-1473,-1764,-1798,-1297,-837,-404,-359,-318,-291,-282, +-238,-179,-295,-378,-367,-335,-182,3,53,-19,-97,-77,-70,-70,-3,-32,-95,-86,-105,-227,-169,-189,35,-9,827, +492,-127,-372,-657,-1082,-1190,-924,-711,-611,-664,-592,-483,-331,-156,-74,-55,-70,-120,-147,-70,-81,-78,-8,1,-18, +-14,-15,18,47,134,227,432,505,511,474,452,119,85,202,258,279,113,-288,-310,-334,-319,-479,-537,-498,-494, +-442,-373,-295,-178,-12,44,23,-34,-73,-37,36,111,175,205,194,189,158,222,204,218,178,169,211,259,300, +329,294,302,323,279,203,159,149,141,121,74,32,-27,-37,-80,-76,26,51,97,117,149,149,146,95,96, +97,110,91,116,131,172,166,342,223,219,190,183,169,148,127,143,179,198,226,242,258,228,205,185,164, +159,94,129,82,60,109,103,70,89,96,141,134,168,202,204,243,219,214,146,167,180,167,160,155,153, +143,160,166,174,177,183,198,185,177,169,152,148,132,97,175,366,78,174,396,389,380,371,366,360,356, +212,119,396,236,160,255,106,293,200,228,206,265,281,276,266,257,244,247,252,273,262,261,264,264,233, +316,121,-89,-397,187,-78,-391,-389,-382,-339,-359,-359,-348,-69,219,-393,-122,-191,256,191,192,162,303,351,335, +322,294,271,261,281,344,331,334,344,323,313,296,-131,176,173,103,57,140,147,171,112,197,201,107,139, +35,62,222,39,107,167,155,101,378,487,449,416,357,296,296,324,442,398,395,416,367,394,212,122,170, +185,163,41,96,-23,131,41,112,31,59,54,80,17,115,26,51,43,28,-42,347,523,508,489,387,281, +247,353,547,526,527,546,468,437,261,65,249,186,227,162,69,5,-59,17,84,123,41,97,59,22,181, +-367,267,414,424,399,610,624,554,285,280,655,451,323,205,166,181,305,347,453,269,71,279,266,163,68, +-11,38,28,-48,-22,2,17,117,119,170,-275,190,244,194,22,-326,-105,-62,-167,-95,-93,-68,-123,-65,124, +191,294,478,339,333,164,27,49,-24,71,104,42,22,-12,-30,-19,-66,-46,-169,-116,-83,244,-138,158,246, +385,802,903,932,724,458,272,262,480,581,612,427,218,55,-22,87,152,129,125,-31,16,46,21,17,25, +30,3,-61,-101,-55,-98,-208,-169,-359,-648,-699,-388,545,387,284,168,-39,-58,46,51,81,109,139,179,228, +222,205,178,-48,-9,-28,-23,-9,-11,21,0,-58,-76,-103,-166,-200,-157,-132,-155,526,895,1174,844,478,140, +80,240,148,120,134,30,-6,-2,23,30,9,-59,-9,74,36,114,-47,10,22,0,-9,29,71,107,159, +232,454,539,444,689,117,461,669,622,650,611,438,194,-129,-271,-290,-239,-177,-116,-156,-126,-101,-55,-49,-73, +-8,19,-4,39,60,113,172,206,270,270,276,270,273,318,286,406,359,467,592,636,735,714,737,793,647, +501,335,265,184,107,90,61,23,32,69,52,36,72,126,153,142,190,121,188,104,171,134,188,212,216, +199,315,174,445,450,467,492,517,531,554,491,457,415,376,330,274,263,249,239,228,203,210,120,233,252, +214,218,289,323,339,296,364,376,333,355,309,332,413,344,459,414,433,432,442,451,471,451,436,421,399, +382,363,362,355,348,341,326,342,280,164,-29,333,181,-42,-36,-20,13,9,22,42,210,383,30,200,443, +-147,61,-245,-130,-145,-123,-140,-151,-170,-172,-176,-181,-172,-163,-141,-159,-159,-154,-149,-119,-209,90,279,453,2, +246,411,422,421,390,423,424,405,232,-41,421,284,302,-192,-159,-128,-105,-127,-157,-212,-229,-251,-256,-255,-238, +-181,-223,-216,-201,-159,-155,-109,320,22,61,58,76,-29,-56,-48,64,-50,-84,3,-39,73,96,-89,28,-208, +-242,-161,-114,-109,-170,-300,-317,-353,-377,-342,-300,-170,-269,-267,-245,-167,-186,-1,175,132,124,54,110,-33,64, +-76,118,-7,80,18,39,49,122,3,51,-216,-214,-123,-81,-38,-123,-326,-347,-457,-515,-506,-428,-254,-381,-380, +-332,-205,-174,-16,231,58,247,91,47,-20,-46,-26,-17,66,43,17,1,1,49,-19,-79,-260,-454,-316,-270, +-218,-269,-412,-595,-541,-199,-333,-283,-55,-116,-128,-261,-199,-248,-17,270,84,183,94,67,-2,16,16,-48,-24, +1,33,116,191,209,-93,115,-39,-127,-153,-319,-285,-195,-37,-147,-171,-110,-127,-102,-63,-196,-297,-400,-208,-149, +85,126,48,6,-30,4,15,-2,-25,-29,-44,-68,-106,-143,-230,-127,-85,51,114,74,-35,-241,-293,-451,-612, +-721,-633,-457,-541,-536,-449,-388,-232,-26,-54,-130,13,22,-11,13,-5,18,23,-4,-19,0,-30,-87,-117,-36, +-117,-144,-88,-465,-689,-955,-926,-901,-772,-570,-262,-161,-52,34,-37,-73,-97,-172,-242,-285,-208,-128,87,77,-51, +-65,-26,-10,-14,-1,-2,-47,-90,-134,-232,-207,-296,-254,-362,853,483,-94,-326,-735,-804,-748,-542,-447,-401,-397, +-286,-264,-317,-172,-51,-45,-29,-43,-7,86,10,-50,8,-5,-54,-19,-17,65,32,113,188,426,548,582,574, +644,392,235,248,115,-70,-346,-655,-509,-397,-321,-309,-292,-239,-334,-360,-319,-295,-233,-76,-42,-37,26,25,62, +135,138,176,187,223,252,268,253,241,316,348,351,298,282,362,414,377,364,326,194,32,-109,-95,-89,-65, +-70,-69,-94,-84,-118,-74,44,67,93,104,154,137,181,119,195,170,225,220,266,304,359,325,509,322,286, +258,219,184,144,123,137,175,189,208,215,226,202,183,164,153,140,100,230,137,158,197,227,196,196,227, +289,241,242,290,288,342,344,297,328,193,222,204,195,192,187,171,180,180,186,184,184,191,181,176,170, +158,158,114,245,360,469,226,378,502,504,495,472,491,491,483,409,269,506,441,210,133,-124,190,97,110, +97,119,125,131,126,120,111,109,114,134,134,137,140,141,127,209,-104,-232,-244,-47,-237,-262,-278,-276,-225, +-285,-294,-281,-235,-17,-242,-271,-266,105,117,72,45,85,104,121,123,111,90,80,101,163,164,168,175,156, +191,132,-166,81,11,12,-32,2,36,19,-29,47,88,17,19,-53,-21,90,-132,21,108,21,12,77,101, +145,137,103,49,27,57,173,179,192,212,189,262,105,9,85,91,72,-38,27,-61,114,3,87,-43,25, +-26,-6,24,6,-90,70,108,-41,-120,-39,-5,80,116,71,-9,-59,13,212,219,230,250,217,304,160,38, +255,128,168,121,61,7,-17,104,69,92,61,31,-3,153,105,-476,-90,141,192,230,314,291,278,131,144, +370,277,233,257,134,115,301,244,307,88,18,268,170,125,43,-6,38,37,-21,-11,19,31,131,65,17, +-340,-65,379,384,10,-308,-483,-441,-149,-115,-45,-15,-143,-157,-89,13,71,134,77,171,102,-25,6,-16,74, +98,29,2,-24,-13,-8,-61,-69,-157,-109,-123,20,36,141,29,6,115,248,307,248,251,218,156,234,259, +196,253,193,99,52,173,189,24,74,-8,9,23,27,31,22,14,-28,-87,-135,-95,-93,-285,-31,-619,-740, +-478,-399,-187,-211,-197,-48,-191,-173,-142,-155,-160,-177,-90,-13,40,93,152,153,-88,-56,-26,-12,7,-1,23, +-8,-19,-70,-97,-116,-164,-221,-358,-409,212,78,2,-218,-403,-326,-182,-85,-148,-169,-196,-152,-123,-152,-173,-123, +-23,-65,19,94,-38,38,-6,26,24,-40,-19,21,8,23,28,46,265,376,367,319,248,381,506,379,306, +57,-131,-244,-271,-250,-216,-173,-175,-151,-201,-201,-106,-115,-104,-112,-104,-70,-93,25,111,180,175,174,250,268, +302,357,276,261,306,365,253,354,439,430,507,448,425,392,228,64,-114,-95,-89,-88,-57,-36,-15,-3,61, +23,-32,36,72,95,87,119,109,185,127,219,193,255,252,232,193,260,246,349,352,340,333,332,329,334, +326,336,327,308,273,235,223,208,194,173,152,143,101,171,160,166,170,211,252,247,224,292,328,306,321, +296,306,359,223,368,336,340,340,342,344,348,340,330,324,311,304,295,289,281,275,271,261,276,165,87, +80,201,93,75,73,86,115,98,106,122,146,255,151,143,375,47,242,-33,34,42,46,72,72,48,49, +38,16,22,29,51,42,43,43,48,53,5,265,302,152,216,290,146,172,180,167,199,202,201,283,194, +169,307,253,43,10,59,49,133,145,79,81,41,-16,-22,-11,52,41,57,62,91,60,120,263,140,190, +133,136,113,87,133,214,119,64,115,83,139,232,101,187,-1,-47,63,34,221,255,99,127,44,-81,-64, +-31,108,58,72,75,107,67,165,277,218,174,134,148,56,94,21,212,40,111,109,80,105,266,149,199, +2,-36,61,-10,299,371,161,208,65,-157,-166,-96,115,86,114,128,178,114,183,284,144,234,125,61,-3, +-24,4,60,76,31,43,-18,70,246,159,104,-15,-96,85,151,239,239,219,-78,-187,-124,-160,-150,-85,-46, +-36,-145,-8,23,203,368,204,199,125,95,15,39,36,-28,12,52,131,180,195,118,74,183,366,-10,-91, +-210,-258,-156,142,39,29,19,-12,-23,10,-9,35,136,173,109,198,105,56,95,33,46,20,-14,-33,-9, +-16,-45,-96,-88,-83,0,-41,134,88,-11,89,313,502,489,256,-61,-187,-157,-138,-52,37,56,63,60,52, +15,245,132,46,112,77,49,27,23,-4,6,-38,-76,-84,-10,-107,-150,18,-546,-456,4,230,104,81,2, +-172,71,178,191,84,9,-47,-75,-26,-3,58,50,164,60,-19,-3,7,26,17,2,12,0,-61,-100,-148, +-111,-216,-373,-484,392,219,-52,-124,-270,-34,54,-19,-22,-3,136,69,58,77,-49,-92,-85,-33,4,100,80, +20,30,40,20,-31,12,11,42,4,36,63,216,334,394,408,650,679,532,387,148,-212,-413,-416,-364,-312, +-280,-187,-126,-76,-79,-105,-107,-156,-153,-86,-101,-63,22,75,119,182,166,178,180,262,327,396,330,353,465, +564,409,348,287,324,351,310,253,163,63,-40,-162,-164,-182,-198,-167,-134,-107,-52,-37,49,114,88,73,76, +99,84,148,161,258,245,298,322,345,372,386,376,400,328,295,291,257,235,218,215,192,175,154,130,112, +106,93,77,53,36,1,-11,147,105,176,191,257,275,272,307,343,312,298,333,324,342,359,317,401,255, +271,264,261,263,261,260,244,233,225,214,202,186,182,178,176,174,179,134,305,361,321,323,400,348,359, +359,348,376,383,384,432,375,361,436,310,-46,-186,-34,-44,-52,-50,-63,-68,-71,-66,-68,-79,-77,-73,-61, +-55,-49,-47,-45,-31,-13,-161,-114,130,-167,-139,90,72,71,96,47,38,42,-146,-167,128,-137,-77,-103,-30, +-75,-79,-127,-143,-145,-122,-125,-156,-153,-139,-102,-84,-74,-72,-68,-17,-57,7,1,-68,-21,-36,-86,-62,-96, +-71,-77,-42,-31,-69,-47,-2,-48,-153,-120,-34,-89,-71,-164,-209,-226,-181,-196,-268,-264,-237,-170,-130,-104,-91, +-64,3,8,6,50,38,11,-24,-30,-32,30,33,37,-28,24,-40,-29,100,-55,-83,-83,13,-92,-114,-281, +-364,-372,-280,-289,-398,-414,-375,-260,-207,-168,-147,-106,29,40,109,184,128,107,78,45,-14,21,152,64,55, +86,-24,-8,261,32,-387,-302,-159,-98,55,-50,-116,-104,-169,-149,-89,24,72,129,34,-1,69,18,25,-67, +86,194,103,89,51,21,44,31,-22,-20,35,90,129,29,-113,-306,-100,367,191,-140,-212,-573,-531,-99,-96, +-12,18,-56,-121,-163,-205,-248,-263,-197,-67,27,-5,-4,11,41,50,23,-8,-29,-16,-5,-40,-77,-86,-83, +-103,-155,39,-57,-125,-211,-529,-421,-399,-440,-197,-107,-164,-304,-347,-265,-220,-115,34,43,119,150,-37,-3,44, +12,11,18,18,-4,-1,-57,-94,-113,-112,-144,-245,-10,-545,-364,-298,-505,-965,-792,-604,-310,-235,-196,-214,-257, +-261,-200,-290,-264,-183,-98,17,98,-20,-57,-23,-19,7,12,10,-17,-9,-48,-75,-93,-90,-228,-389,-478,-71, +-655,-1121,-1090,-900,-650,-486,-412,-361,-344,-373,-373,-335,-241,-174,-133,-94,-38,-12,5,-93,-58,52,27,5,-42, +4,23,-39,-67,-89,-106,4,96,197,-66,540,355,262,91,-130,-388,-492,-518,-329,-211,-171,-149,-177,-210,-223, +-218,-146,-153,-107,-41,-95,-97,-113,-19,77,138,138,146,189,259,313,356,317,294,392,373,178,219,192,145, +140,40,-64,-202,-258,-323,-387,-326,-272,-229,-199,-173,-142,-122,-95,-84,-44,9,40,57,67,81,129,172,192, +241,255,288,272,254,238,228,301,193,188,155,129,102,89,72,88,99,100,92,73,56,47,40,32,22, +25,-9,12,8,-1,57,74,71,101,100,131,160,203,237,234,249,229,219,137,170,175,163,160,157,152, +144,143,139,139,135,134,131,131,129,128,125,126,127,75,107,271,76,112,300,297,299,306,298,299,305, +178,130,341,185,197,210,222,206,170,192,177,229,239,218,227,216,186,188,190,200,208,212,211,214,196, +227,235,111,-187,252,116,-172,-154,-144,-121,-124,-122,-106,118,265,-141,101,30,246,167,183,153,283,325,273, +307,272,194,179,180,217,252,276,276,275,248,278,61,192,201,136,115,168,165,208,213,204,174,155,144, +113,223,230,167,159,141,181,124,374,457,338,420,348,183,167,174,247,297,328,328,309,302,253,234,213, +162,160,106,109,59,118,181,90,82,140,74,107,255,194,159,168,103,95,3,380,539,402,529,432,159, +107,129,258,382,455,459,416,351,299,217,235,170,167,107,50,5,23,145,80,54,87,-1,93,324,250, +4,228,299,426,564,552,535,569,392,274,184,205,152,45,81,90,106,211,326,336,272,287,189,151,110, +37,61,46,-18,22,82,176,206,128,-28,-13,146,583,83,-92,-150,-206,-97,184,134,130,126,69,40,83, +121,228,392,322,256,193,36,48,116,95,88,49,-1,-19,3,35,9,-32,-23,32,54,19,-11,7,23, +220,607,868,935,752,478,262,192,277,381,483,330,183,65,96,152,324,161,83,139,107,57,26,41,16, +9,-44,-62,-53,-90,-154,-181,-22,-400,-33,415,595,667,453,267,3,91,113,143,79,49,69,108,175,177, +214,167,150,32,25,33,25,48,53,5,6,17,-13,-48,-44,-56,-138,-343,-420,-239,-270,-134,-33,198,386, +446,344,279,250,325,168,92,122,22,-34,-49,31,80,126,23,46,84,37,21,10,43,51,8,-40,-64, +-70,-47,20,84,76,457,649,553,299,28,-160,-197,-91,-133,-150,-180,-43,37,61,67,64,11,-3,-29,-44, +-63,-41,7,72,103,122,148,167,187,296,359,396,364,413,482,565,375,370,304,276,251,176,70,-40,-85, +-121,-188,-197,-218,-236,-215,-198,-178,-123,-79,-18,25,41,68,88,93,125,148,213,250,268,291,339,348,362, +359,377,196,266,252,255,248,247,259,270,221,167,122,71,26,-18,-8,-3,-3,0,-11,7,25,59,107, +102,141,182,201,236,245,271,275,292,286,263,269,266,292,228,222,229,228,232,232,240,214,199,183,166, +149,124,134,137,141,146,149,144,224,201,91,251,224,97,112,124,136,154,168,185,267,300,148,250,252, +-116,-46,-163,-96,-112,-100,-121,-132,-148,-136,-138,-154,-148,-146,-143,-133,-127,-124,-120,-92,-140,-25,128,377,-88, +96,341,338,337,327,322,318,314,85,-115,380,131,198,-143,-97,-111,-100,-153,-180,-219,-186,-195,-241,-234,-233, +-222,-196,-177,-171,-142,-113,-94,220,6,-16,20,32,-55,-57,-71,8,-71,-76,-2,-58,37,98,-60,-9,-121, +-122,-98,-80,-164,-234,-325,-256,-274,-360,-347,-336,-312,-263,-226,-215,-151,-128,18,108,86,44,17,56,-28,45, +-26,101,9,43,50,7,19,195,6,72,-67,-49,-77,-79,-200,-286,-431,-325,-356,-496,-497,-511,-473,-396,-329, +-294,-197,-110,35,215,117,148,70,53,24,-20,45,145,66,33,89,-41,27,308,76,-136,-268,-323,-174,74, +-173,-296,-349,-289,-266,-346,-199,-124,-44,-78,-104,-167,-162,-168,0,213,111,97,92,92,47,48,26,-29,-12, +65,152,161,77,-109,-167,-9,290,-72,-246,-190,-386,-276,112,-11,-13,84,72,11,-82,-215,-318,-422,-255,-170, +24,63,38,66,22,12,34,-3,-15,3,29,6,-54,-34,-95,-43,-207,-13,-106,-118,-192,-539,-502,-577,-589, +-441,-324,-268,-502,-566,-457,-372,-206,-31,34,13,88,-8,-34,80,46,24,13,22,-7,-17,-68,-79,-65,-137, +-177,-146,-50,-271,37,-179,-458,-956,-849,-645,-321,-203,-157,-115,-203,-212,-112,-164,-199,-238,-162,-87,11,84,15, +3,13,27,38,-4,-15,11,-5,-44,-56,-56,-205,-294,-383,-229,-875,-1272,-1087,-792,-657,-557,-455,-340,-307,-364, +-291,-282,-254,-174,-103,-75,44,39,-2,-21,-55,61,17,-4,-11,35,21,-42,-123,-141,-140,-164,-113,37,-246, +612,240,-63,-206,-451,-525,-539,-560,-306,-178,-157,-140,-147,-156,-171,-165,-174,-152,-108,-12,-35,-44,-10,7,50, +60,83,124,138,235,284,298,296,274,360,293,228,179,50,2,-90,-201,-337,-497,-484,-491,-483,-424,-362,-296, +-291,-280,-274,-245,-245,-198,-85,-23,29,58,110,127,188,157,231,219,277,281,299,326,375,287,303,72,44, +0,-37,-77,-100,-133,-108,-96,-89,-81,-81,-80,-69,-54,-42,-30,-6,-26,37,-46,-57,-2,6,-41,-23,3, +76,63,87,162,141,181,150,89,64,-39,-8,-29,-39,-50,-63,-83,-76,-74,-70,-68,-66,-64,-56,-50,-42, +-40,-29,-39,19,127,323,-15,127,348,355,352,339,352,354,356,179,21,372,193,-41,214,57,265,178,196, +176,214,224,216,224,217,194,192,190,192,209,216,216,218,199,275,62,-95,-272,111,-90,-262,-264,-258,-218, +-255,-257,-238,-84,140,-231,-115,-127,250,201,171,134,220,253,238,276,259,196,184,183,197,251,271,273,258, +267,255,-83,148,102,74,43,107,132,143,93,154,164,102,101,37,120,213,65,186,223,176,116,268,315, +295,354,313,203,162,153,172,270,311,317,291,335,223,112,138,95,110,27,88,12,149,80,107,27,104, +30,56,166,141,116,251,216,77,-34,178,294,279,393,364,185,117,95,159,332,406,415,367,387,302,132, +262,89,153,124,80,31,42,188,81,79,101,8,79,341,277,-218,159,342,473,683,528,432,425,478,419, +230,362,316,142,130,133,261,238,340,271,99,244,151,150,111,47,67,41,-22,17,103,183,205,51,-160, +-212,52,541,177,-98,-186,-216,-112,145,103,112,187,95,50,99,149,216,309,237,241,131,20,66,93,116, +89,59,15,4,34,69,27,-2,-60,0,53,38,-80,-14,-25,100,368,529,612,641,545,409,325,329,375, +420,356,242,94,132,215,218,100,82,81,97,55,18,58,38,1,-46,-55,-39,-156,-143,-174,-56,-197,60, +263,297,473,268,133,53,-51,-68,15,-38,-26,70,156,212,219,236,205,88,13,80,73,59,59,60,15, +-1,39,29,-1,50,-38,-96,-235,-253,-605,-627,-225,-122,109,141,194,224,194,168,108,114,80,29,-23,-32, +2,42,109,121,-4,55,73,28,31,41,50,47,-46,-96,-146,-149,-235,-216,-149,-239,117,212,148,-32,-124, +-100,-26,75,6,-46,-114,-39,-2,14,27,54,58,65,37,-34,-28,4,18,70,88,68,102,131,177,244, +283,305,276,277,267,275,271,299,238,149,66,-25,-127,-221,-218,-210,-223,-223,-229,-236,-219,-210,-193,-157,-83, +-79,-97,-26,31,76,96,162,152,212,181,232,230,283,291,307,309,309,29,124,117,109,112,113,123,119, +90,51,20,-16,-50,-93,-61,-36,-12,6,19,56,-13,44,37,19,9,37,72,89,82,144,164,168,159, +120,117,138,51,107,85,89,85,81,76,78,64,56,45,33,23,4,19,26,34,46,48,77,31,-38, +-104,51,-37,-124,-112,-95,-69,-69,-55,-33,1,81,-49,-16,76,-37,149,-106,-24,-32,-23,-27,-35,-55,-46, +-51,-68,-63,-62,-60,-52,-48,-46,-41,-22,-81,160,273,316,92,252,303,319,322,296,325,328,321,245,62, +331,290,318,-30,-35,-15,-11,-7,-17,-71,-49,-70,-122,-120,-124,-118,-92,-70,-63,-28,-34,29,292,75,100, +85,104,49,36,57,129,44,1,67,25,116,193,41,176,-5,-57,24,15,31,-5,-117,-66,-104,-190,-182, +-181,-161,-128,-89,-85,-28,-48,122,212,147,91,66,119,21,109,0,155,32,111,88,59,74,244,115,251, +36,-12,26,7,61,59,-118,-54,-120,-282,-287,-311,-273,-192,-125,-96,-10,-6,166,285,104,152,66,53,13, +-1,60,124,82,33,65,-40,75,306,186,82,-79,-166,50,281,26,-115,-192,-132,-171,-367,-146,-90,-136,-95, +-90,-185,-133,-143,125,261,69,124,114,130,59,51,24,-39,19,117,216,193,109,-103,-35,154,193,-243,-268, +-210,-144,-4,211,74,28,74,119,98,51,-46,-103,-157,-21,-36,98,146,108,126,39,7,41,10,9,43, +46,17,-49,-63,-79,75,-64,-2,-57,-101,-78,-132,-84,-128,-99,-207,-220,-171,-338,-339,-230,-184,-77,11,90, +11,65,70,6,99,93,49,15,39,11,-14,-54,-51,-5,-102,-134,-45,-48,-75,53,0,-29,-252,-236,-227, +-230,-82,-6,83,21,0,35,33,1,-57,-5,-6,29,147,98,71,72,58,52,2,9,41,31,-5,14, +-43,-147,-163,-209,-255,-499,-523,-421,-396,-338,-309,-256,-112,-61,-108,-23,-26,-79,-47,-17,-9,68,63,44,84, +14,57,28,23,35,49,1,-43,-129,-138,-114,-224,-211,-94,-236,326,41,-262,-292,-354,-324,-283,-228,-159,-137, +-166,-135,-112,-101,-80,-71,-55,-55,-49,-10,-10,12,103,72,65,57,68,107,87,150,188,207,210,182,183, +143,267,154,-10,-62,-193,-261,-355,-459,-398,-351,-305,-299,-291,-278,-267,-253,-243,-201,-185,-113,-34,-10,14,47, +114,133,189,147,234,196,256,250,280,334,397,291,187,11,-27,-52,-85,-115,-141,-176,-173,-185,-186,-183,-172, +-160,-136,-114,-98,-77,-63,-52,57,-28,-11,8,23,-12,-15,17,75,39,33,91,64,89,78,12,37,-107, +-80,-99,-110,-123,-137,-154,-150,-148,-147,-146,-148,-152,-143,-135,-125,-118,-104,-126,7,98,172,-16,111,185,195, +192,175,198,202,201,126,0,188,135,-129,83,-94,130,75,77,66,67,67,68,73,71,61,60,58,57, +73,80,81,83,81,136,-88,-144,-75,-62,-154,-87,-99,-100,-73,-114,-120,-113,-152,-46,-59,-163,-109,77,104, +58,41,27,29,41,63,61,27,27,29,31,73,86,89,84,123,96,-61,56,-8,6,-15,-2,37,19, +-25,35,63,15,8,-20,20,79,-36,69,146,77,55,10,-12,24,48,39,-8,-25,-32,-42,46,84,94, +99,163,117,21,56,39,32,-22,21,2,107,11,90,6,43,-13,-4,75,32,44,120,166,28,-20,-108, +-107,-48,3,14,-71,-104,-130,-114,17,71,90,101,207,206,108,203,60,100,99,65,38,63,181,88,82, +79,-5,37,263,173,-291,-27,184,273,473,197,48,21,149,170,37,311,330,165,109,89,216,116,130,50, +-20,123,92,116,103,57,56,26,-31,24,129,179,155,-25,-255,-306,6,185,30,-184,-232,-262,-187,-25,17, +50,36,80,56,-5,20,17,-7,24,99,45,53,86,71,95,59,51,26,26,59,64,11,-32,-84,-11, +35,63,-64,-49,-92,-106,-180,-117,-41,119,255,254,152,79,41,34,89,107,73,139,193,52,2,40,28, +66,36,17,50,35,0,-41,-42,-8,-157,-108,-113,-56,-95,-98,-74,-151,-197,-162,-165,-121,-206,-213,-157,-94, +-59,-33,54,75,77,109,137,53,42,94,88,77,58,51,25,6,45,45,24,89,-50,-103,-128,-102,-539, +-596,-387,-385,-350,-357,-297,-191,-67,-36,-175,-108,-96,-115,-67,-25,49,62,87,49,-7,40,65,35,40,48, +29,2,-92,-129,-175,-179,-273,-291,-252,-407,-137,-251,-295,-298,-184,-82,18,89,-6,-59,-79,-67,-82,-111,-80, +-44,51,60,56,-5,-21,2,16,40,67,73,86,93,98,104,120,134,142,91,8,-61,88,90,33,-73, +-177,-244,-307,-357,-305,-256,-220,-216,-204,-205,-180,-168,-147,-124,-58,-65,-100,-37,5,42,71,119,128,166,145, +182,169,191,178,182,181,140,-25,-12,-21,-43,-51,-61,-72,-104,-102,-115,-118,-123,-130,-145,-121,-98,-76,-61, +-43,-24,-58,-27,-51,-41,-57,-51,-25,-32,-36,9,36,38,30,6,-5,7,-124,-31,-50,-58,-65,-79,-88, +-95,-93,-93,-95,-97,-98,-103,-93,-88,-82,-74,-70,-45,-130,-164,-112,-118,-165,-117,-118,-110,-95,-106,-102,-90, +-137,-100,-78,-145,-87,105,231,69,97,104,98,120,121,105,109,103,85,89,90,92,98,101,100,104,102, +85,234,217,45,209,213,53,77,83,71,100,104,101,213,200,69,226,203,139,93,121,105,168,184,144, +154,130,81,77,74,85,107,125,127,146,122,178,183,138,176,116,118,131,131,172,188,158,111,113,104, +126,198,153,227,127,89,160,110,237,261,172,201,154,73,75,69,90,121,151,144,165,137,205,224,168, +132,105,115,69,117,80,153,82,125,99,78,94,204,169,255,134,76,123,64,270,358,245,272,210,50, +28,15,61,147,197,203,234,189,273,255,137,141,89,68,14,32,70,115,101,55,40,-12,92,237,230, +164,191,193,343,490,318,230,209,133,59,-79,139,148,-33,24,35,-8,51,62,194,190,89,133,128,143, +73,50,23,-35,65,170,226,170,74,-121,28,248,28,-260,-196,-196,-15,74,50,104,81,-19,135,158,113, +104,139,194,245,173,136,144,131,148,87,45,53,23,32,77,62,17,-52,-29,38,109,168,-13,-13,-28, +76,306,417,476,497,283,136,79,117,146,154,167,140,55,138,94,95,109,50,89,113,56,27,44,27, +7,-28,-13,41,-87,-81,22,-35,-9,-28,207,401,477,420,250,-83,9,43,84,149,149,82,183,206,168, +176,113,81,138,129,110,101,75,64,16,29,54,47,19,60,-41,-72,-73,-52,-229,0,222,205,76,90, +74,46,168,208,203,169,135,115,51,32,53,101,99,76,123,87,73,50,47,67,32,-22,-50,-98,-105, +-95,-180,-206,-213,-165,-95,-110,-215,-168,-78,0,58,146,-49,-135,-118,-70,-17,15,55,72,79,78,49,0, +-3,23,114,88,75,88,98,97,30,45,63,73,114,102,15,-8,172,67,-34,-74,-167,-177,-202,-211,-157, +-107,-82,-121,-154,-189,-168,-150,-134,-89,-57,9,35,24,27,44,81,93,131,134,207,164,185,175,179,210, +234,171,33,19,-14,-19,-36,-50,-70,-99,-127,-163,-183,-196,-200,-205,-183,-167,-153,-138,-139,-111,-26,-38,6, +4,35,50,43,63,79,60,45,61,47,36,44,13,26,-59,-59,-67,-75,-86,-94,-98,-106,-110,-117,-123, +-131,-143,-134,-127,-120,-112,-101,-116,-7,13,-49,9,40,-39,-30,-28,-35,-15,-10,-6,43,25,-41,34,-95, +-54,-106,-56,-35,-48,-47,-70,-79,-78,-76,-75,-76,-74,-74,-75,-66,-62,-61,-58,-42,-49,-97,-21,202,-120, +-43,171,165,162,159,144,138,129,-47,-128,192,-26,53,-84,-19,-49,-51,-119,-143,-133,-126,-119,-127,-121,-118, +-121,-102,-98,-98,-83,-45,-56,77,-6,-38,-13,-12,-59,-27,-48,-47,-43,-31,-32,-50,-13,-1,-39,-44,-53, +9,-20,-25,-155,-220,-206,-200,-190,-188,-184,-185,-199,-156,-132,-132,-87,-50,15,17,24,28,-14,-6,-30,40, +44,16,57,29,2,-14,-16,50,-28,37,-23,50,-11,-31,-238,-321,-293,-278,-243,-255,-270,-291,-304,-246,-224, +-216,-136,-24,73,134,108,86,43,52,15,35,85,135,93,63,38,-19,10,167,67,-161,-138,-37,25,176, +-90,-217,-258,-228,-181,-191,94,167,75,36,16,35,-49,-110,-109,-8,17,53,83,104,82,39,9,-31,57, +162,155,91,-38,-218,-223,63,-223,-157,-206,-208,-260,-259,-258,-52,11,-81,70,73,-20,-96,-184,-277,-129,-39, +-18,82,85,66,74,36,45,23,38,84,53,-3,-67,-24,5,-28,111,-39,-86,-116,-219,-488,-526,-488,-338, +-114,-26,-83,-187,-294,-331,-195,-60,21,98,92,-47,-53,-21,1,36,15,27,30,17,4,-32,-18,14,-127, +-53,6,-40,-22,-118,-250,-401,-632,-466,-359,-239,-242,-242,-255,-146,-92,-88,-71,-81,-70,-41,9,16,87,75, +70,76,50,43,22,8,37,36,14,47,-42,-89,-59,-12,-242,-368,-529,-551,-593,-596,-549,-429,-262,-212,-307, +-221,-176,-150,-72,-7,45,81,56,-26,23,22,56,40,34,48,0,-46,-101,-126,-143,-160,-201,-242,-264,-384, +-203,-442,-491,-383,-243,-117,-71,-125,-146,-128,-44,-97,-123,-125,-110,-74,-16,23,46,29,4,-2,6,5,36, +68,76,60,-1,-26,-32,-42,25,-31,-122,-260,-68,-117,-162,-214,-282,-309,-325,-334,-286,-260,-226,-209,-177,-155, +-136,-120,-104,-100,-87,-79,-56,-22,1,19,50,61,98,92,132,111,106,77,52,47,55,-19,26,-81,-101, +-136,-161,-191,-225,-273,-254,-240,-227,-211,-204,-203,-188,-173,-156,-142,-118,-124,-103,-111,-122,-80,-77,-89,-80,-88, +-65,-63,-38,-15,-25,-18,-37,-60,-166,-142,-142,-160,-171,-186,-197,-213,-201,-197,-193,-191,-185,-180,-173,-168,-163, +-159,-151,-142,-182,-145,-13,-184,-139,12,6,5,0,-4,-8,-7,-115,-168,11,-112,-197,186,151,203,164,178, +158,192,199,195,193,188,181,179,178,180,186,187,185,186,169,204,150,34,-182,177,41,-169,-153,-147,-136, +-135,-134,-132,48,192,-162,26,-4,220,173,176,139,219,247,243,246,237,216,201,200,209,232,240,233,227, +210,222,4,139,151,89,72,130,157,188,139,179,158,97,116,70,115,185,137,180,203,203,120,271,324, +311,312,283,258,229,222,232,268,283,268,251,246,185,133,125,123,97,55,79,84,149,92,113,80,72, +54,66,101,135,154,186,160,131,21,242,351,368,379,376,308,242,234,264,352,371,346,319,285,251,144, +166,105,99,77,16,65,85,116,103,70,20,12,68,159,209,24,271,421,485,538,454,417,442,281,201, +157,330,319,107,135,152,205,208,227,160,49,111,119,125,129,95,45,16,-17,109,200,173,116,8,-141, +-63,245,-113,-96,-81,-157,-34,-52,-215,87,145,-23,83,119,167,202,260,343,324,278,108,76,103,115,139, +95,61,29,48,108,71,13,-41,17,110,51,339,-58,-9,1,130,479,537,656,700,546,379,262,401,420, +373,322,228,77,129,151,96,80,52,36,81,39,41,48,35,24,-7,17,51,-62,5,41,-31,16,-18, +252,444,737,601,397,68,12,-13,-35,83,133,115,189,239,262,242,174,87,66,99,94,99,72,56,24, +24,47,38,17,52,-19,5,-30,45,-255,113,423,379,307,268,256,236,224,210,220,201,190,166,114,90, +95,87,93,73,89,111,62,51,51,80,5,-34,-59,-63,-79,-103,-144,-197,-305,-165,-391,-206,-117,-74,44, +150,184,182,4,-64,-35,-9,37,81,105,136,127,152,119,19,24,34,49,61,60,79,90,62,-5,-31, +-40,-43,10,13,-90,-136,7,-30,-32,-47,-62,-43,-16,33,36,36,20,-13,-44,-81,-58,-41,-24,-13,12, +22,7,7,17,33,40,63,65,104,126,102,74,60,39,33,15,8,-83,14,-2,-2,-7,-10,-22,-35, +-68,-96,-119,-140,-161,-189,-169,-156,-140,-125,-119,-87,-106,-39,-7,-19,0,48,53,59,41,62,63,52,47, +10,18,25,-30,-11,-33,-31,-35,-39,-41,-39,-49,-56,-66,-75,-83,-96,-86,-80,-76,-67,-64,-51,-49,-102, +-218,-13,-81,-214,-209,-198,-188,-181,-175,-163,-72,1,-196,-93,-55,-85,13,-134,-60,-76,-71,-91,-100,-104,-104, +-103,-97,-96,-95,-94,-94,-94,-94,-92,-72,-126,21,149,318,-32,128,291,303,301,274,291,290,272,121,-57, +300,157,208,-113,-69,-65,-65,-112,-135,-139,-143,-137,-125,-129,-129,-131,-131,-129,-131,-111,-103,-82,196,3,21, +22,38,-23,-6,-6,27,-23,-44,-11,-29,42,52,-53,41,-71,-60,-31,-50,-130,-179,-203,-210,-202,-166,-168, +-162,-163,-166,-159,-169,-125,-138,-12,76,48,59,1,51,-22,103,22,70,38,72,9,19,12,70,-6,91, +-74,-47,-15,-38,-149,-214,-238,-247,-216,-184,-212,-226,-242,-237,-235,-240,-168,-134,1,161,39,128,19,15,-28, +43,103,80,86,34,-1,-23,14,98,30,11,-101,-92,-33,33,-134,-205,-237,-345,-355,-339,-129,-22,-23,-28, +-34,-100,-110,-186,-97,64,-32,56,69,109,110,27,-3,-13,107,186,127,57,-13,-146,-105,192,-424,-287,-190, +-145,-152,-191,-293,-17,51,-102,54,82,43,-58,-147,-246,-91,-55,0,102,81,75,80,41,44,26,51,106, +46,0,-70,27,29,-25,199,-42,-105,-77,-127,-294,-415,-424,-338,-247,-174,-186,-258,-344,-360,-291,-145,-10,39, +-23,-70,-39,-55,-7,19,6,37,25,6,13,-14,15,45,-14,26,75,-49,55,9,-169,-270,-437,-347,-275, +-210,-156,-138,-194,-83,-30,-27,-67,-98,-104,-81,-54,-1,100,47,37,71,48,32,13,9,28,15,-9,-24, +-22,-46,-11,35,-30,-150,-384,-369,-423,-429,-405,-330,-257,-233,-254,-152,-99,-89,2,61,73,75,25,-28,71, +26,28,36,27,48,-12,-64,-66,-86,-83,-111,-141,-193,-247,-259,-146,-350,-416,-314,-260,-193,-220,-335,-193,-98, +-33,-86,-100,-78,-69,-50,-32,-3,23,47,42,25,27,6,16,48,33,13,-63,-96,-113,-125,-59,-86,-118, +-253,-117,-205,-241,-224,-238,-219,-188,-168,-158,-171,-159,-136,-107,-82,-66,-48,-36,-55,-93,-89,-28,-21,-12,2, +37,35,75,36,110,43,48,-11,-28,-34,-19,-98,62,-93,-120,-152,-187,-223,-264,-300,-277,-247,-228,-205,-189, +-174,-166,-158,-145,-132,-108,-115,-66,-99,-91,-55,-40,-54,-62,-59,-24,-54,-47,-8,-26,-4,-20,-70,-110,-169, +-155,-173,-181,-191,-200,-219,-204,-200,-194,-189,-182,-173,-170,-165,-162,-160,-152,-158,-124,-54,44,-132,-43,74,74, +70,54,64,60,55,-33,-128,53,-29,-200,140,-6,184,124,132,111,129,136,144,139,139,143,136,135,136, +142,143,141,138,123,176,-7,-111,-183,36,-106,-183,-180,-178,-159,-183,-188,-186,-100,58,-180,-130,-134,138,137, +113,77,110,128,159,159,167,176,157,158,162,179,178,172,148,156,128,-97,76,55,29,8,55,101,104, +32,98,109,35,58,-1,8,106,-7,113,187,123,54,106,139,202,185,186,216,170,168,166,203,205,196, +161,183,80,10,48,74,47,-6,49,51,157,23,104,23,30,12,11,0,36,-3,104,136,52,-47,9, +67,195,197,248,284,199,185,189,253,253,229,173,188,115,30,146,81,84,65,17,86,102,108,85,67, +12,23,28,88,104,-155,174,392,369,375,323,296,318,186,134,129,274,314,218,174,165,272,209,218,44, +-73,82,78,94,96,115,37,6,13,137,196,93,58,-66,-204,-209,161,-253,-2,-35,-104,-114,-169,-282,60, +159,-23,46,68,113,162,198,241,196,211,54,26,63,55,153,115,61,45,67,118,65,12,-18,33,120, +-3,363,-118,-66,25,95,274,221,309,388,436,387,245,361,326,229,192,136,71,75,122,26,-4,8,-37, +19,12,43,46,35,33,12,34,40,-5,58,-7,-70,47,40,113,149,395,273,161,63,-75,-125,-193,-51, +26,45,89,135,177,159,140,54,-5,42,46,73,56,36,28,13,31,16,3,9,-12,29,-4,83,-285, +-97,143,128,131,80,100,141,54,21,14,28,46,55,70,79,114,46,52,53,29,75,22,37,41,59, +-14,-37,-56,-40,-71,-123,-165,-231,-343,-237,-420,-263,-117,-107,-19,20,22,-4,-1,8,2,5,12,28,56, +84,122,124,110,39,46,46,-6,23,32,53,29,-6,-32,-83,-106,-110,-75,-70,-117,-200,-160,-154,-96,-92, +-54,-19,39,99,68,39,15,17,17,10,33,49,71,41,47,-11,-56,-30,-10,15,14,52,28,66,38, +34,-16,-34,-73,-113,-158,-148,-121,-32,-33,-41,-45,-49,-60,-65,-68,-62,-64,-70,-82,-102,-91,-83,-69,-60, +-45,-23,-99,-17,-19,-27,-30,14,24,12,-19,20,35,18,13,-21,-21,0,-101,-3,-30,-26,-27,-28,-27, +-28,-28,-31,-35,-37,-38,-40,-35,-34,-34,-29,-32,-4,-94,-166,-233,-60,-159,-233,-232,-221,-203,-210,-207,-198, +-152,-59,-211,-171,-30,-6,140,-59,2,-4,-6,-3,-5,-10,-12,-13,-8,-11,-10,-6,-9,-10,-11,-12,-5, +-53,142,209,195,102,203,189,213,215,186,218,219,206,199,83,188,221,208,-15,-19,7,-7,9,9,0, +-8,-9,2,-16,-21,-15,-19,-14,-16,-7,-28,10,187,54,101,67,82,60,68,92,115,61,21,46,40, +89,106,21,124,7,-21,28,-21,25,30,-3,-15,-24,8,-19,-12,7,-8,-10,-20,-12,-56,34,122,84, +92,46,92,31,138,58,116,49,100,43,60,55,93,58,109,-28,-52,16,-44,32,55,30,17,23,52, +-13,-32,-22,-22,-14,-24,-14,-65,18,138,30,149,37,12,-30,66,112,42,75,25,-10,0,42,67,49, +159,101,45,78,96,81,70,39,-157,-245,-269,-161,-54,22,16,8,-71,-24,-56,35,109,-9,72,66,104, +126,27,-1,25,154,193,92,56,14,-112,8,241,-422,-261,-92,-77,-31,-38,-115,85,121,-49,67,98,107, +61,40,38,88,43,67,103,74,79,100,71,51,46,72,115,41,12,-22,64,76,12,263,-69,-95,37, +88,155,53,28,12,-35,-36,-73,-43,-84,-130,-129,-71,18,16,-57,-28,9,-43,-13,11,10,45,32,14, +27,18,41,44,64,64,62,-72,113,126,74,116,127,83,27,-80,-9,4,-61,14,50,48,20,21,28, +21,-3,25,75,33,23,62,49,29,15,21,24,4,-16,-54,-10,-2,10,57,-5,21,-9,26,-38,-30, +-37,-34,-83,-80,-5,7,16,33,61,71,66,37,5,22,90,36,4,30,24,37,-11,-51,-18,-35,-38, +-77,-138,-194,-250,-134,-104,-145,-191,-158,-170,-218,-258,-256,-141,-78,-76,-58,-29,0,32,37,48,23,22,52, +61,55,58,34,16,35,-16,-40,-92,-118,-132,-135,-92,-71,-48,-127,-132,-221,-232,-177,-147,-89,-33,5,-7, +-20,-23,-14,-10,-1,15,34,52,29,-11,-13,18,1,-8,6,35,41,56,18,73,2,5,-46,-66,-84, +-89,-140,21,-68,-87,-97,-121,-141,-165,-174,-163,-148,-136,-124,-110,-93,-93,-93,-90,-84,-77,-73,-14,-34,-5, +4,29,34,12,18,33,-3,-17,6,-12,0,-2,-47,-12,-95,-81,-88,-90,-92,-94,-103,-97,-95,-92,-89, +-87,-82,-82,-81,-82,-80,-77,-92,-15,28,16,-9,47,38,42,40,26,41,38,31,33,-21,7,29,-82, +16,-106,45,18,12,2,-5,-5,7,4,7,19,9,8,9,14,15,16,13,13,38,-104,-113,3,-88, +-116,-11,-15,-17,-10,-36,-43,-46,-115,-77,-9,-126,-99,-14,27,-6,-27,-58,-60,-19,-19,-3,24,-1,-4, +-1,9,9,8,-8,16,-19,-59,-2,-34,-18,-25,-23,19,0,-45,-8,15,-22,-13,-31,-47,-12,-85,-1, +67,-9,-47,-106,-119,-37,-55,-33,32,-28,-28,-31,-1,2,5,-12,17,-25,-53,-12,16,-7,-22,12,49, +110,-2,71,5,-1,-4,-16,-36,-42,-89,-14,50,-35,-104,-225,-245,-96,-95,-30,74,-30,-66,-76,-43,-33, +-35,-59,-4,-29,-18,78,71,50,40,18,90,115,83,64,55,14,24,2,44,-4,-151,30,129,72,107, +82,49,-1,-62,-84,-71,32,139,251,147,111,173,90,71,-54,-82,26,31,48,63,120,30,4,53,154, +173,32,27,-74,-207,-204,12,-371,22,-1,-75,-177,-213,-213,34,123,-12,26,34,44,52,26,-4,-16,38, +0,16,31,12,119,102,55,64,85,112,36,9,21,50,78,-47,211,-108,-101,45,22,-94,-220,-221,-160, +73,168,83,78,-10,-95,-89,-39,67,19,33,-60,-77,-44,-74,-39,-7,48,37,27,31,26,35,3,28, +78,-20,-69,68,64,-61,-178,-207,-191,-146,-30,-123,-163,-230,-152,-92,-41,-63,-43,23,18,54,21,-18,-2, +8,39,32,19,30,12,16,6,-2,-24,-15,-1,-13,65,-233,-279,-282,-263,-202,-223,-194,-127,-205,-209,-199, +-161,-121,-89,-4,34,59,-1,-6,4,-21,7,-1,22,19,14,-23,-33,-44,-38,-78,-141,-200,-264,-314,-294, +-249,-270,-198,-200,-174,-204,-199,-177,-91,-40,-29,-36,-47,-54,-25,0,67,44,51,55,51,41,-22,0,7, +19,-40,-77,-77,-121,-143,-151,-123,-115,-94,-198,-269,-256,-197,-187,-143,-105,-56,-18,-35,-47,-51,-15,18,46, +65,78,101,62,56,-3,-45,-22,-15,5,12,43,23,21,-11,-17,-52,-76,-126,-184,-232,-242,-88,-94,-86, +-98,-103,-110,-117,-119,-95,-68,-49,-36,-31,-29,-32,-34,-30,-29,-16,-18,-67,-25,-41,-27,-34,-19,-19,-41, +-58,-39,-24,-31,-37,-47,-59,-53,-119,-38,-47,-47,-45,-46,-45,-49,-40,-37,-32,-28,-22,-14,-15,-16,-18, +-19,-23,-4,-96,-122,-86,-81,-121,-74,-81,-78,-71,-85,-90,-91,-125,-96,-85,-134,-28,97,164,85,84,89, +76,100,106,106,103,101,104,93,92,96,97,98,98,95,86,82,160,118,-42,159,128,-26,-4,1,-10, +9,10,7,131,163,-33,123,73,117,71,88,59,119,143,147,144,138,145,104,94,105,114,126,129,123, +94,116,65,88,121,76,80,114,126,156,138,127,96,80,94,86,104,103,136,115,79,91,22,148,198, +199,191,173,192,121,115,141,151,158,158,133,98,89,107,87,81,70,83,83,126,120,114,79,90,65, +76,74,76,101,83,79,30,50,-49,125,225,264,265,255,274,148,108,139,177,213,214,171,92,74,69, +54,107,64,36,10,95,116,44,67,41,5,33,64,57,87,191,267,207,207,222,333,358,294,132,6, +-50,-43,32,152,120,109,86,129,147,155,96,57,78,64,83,120,32,16,76,182,179,66,62,17,-90, +73,101,-285,-69,51,-55,30,42,-31,138,169,29,51,82,158,190,243,309,232,150,100,59,53,69,116, +104,57,73,95,113,31,24,48,77,104,57,198,-49,-21,128,240,462,417,401,338,232,174,151,233,245, +205,107,54,77,21,-17,22,33,-7,-10,0,18,57,42,30,36,39,47,22,89,93,46,-31,95,136, +263,405,557,452,326,107,98,81,48,60,71,73,89,126,167,144,94,62,27,20,26,44,40,30,30, +35,22,15,4,-36,-13,13,-16,46,-116,105,267,297,307,296,254,182,62,55,168,123,121,120,96,68, +42,9,9,59,57,41,9,26,17,10,-8,-22,4,-8,-36,-84,-159,-211,-247,-94,-145,-22,-5,-39,-76, +-127,-121,-29,-68,-76,-73,-19,30,58,98,110,102,64,39,43,53,58,61,55,24,12,-52,-83,-101,-116, +-125,-127,-110,-58,-18,-34,-135,-169,-151,-114,-79,-18,32,82,74,76,66,69,62,57,68,78,91,86,79, +80,61,32,10,18,26,41,29,9,19,-20,-24,-44,-75,-110,-144,-148,-73,-46,-46,-31,-27,-20,-15,2, +-7,-13,-17,-22,-21,-17,-21,-26,-31,-31,-39,-27,-13,12,44,33,52,79,57,60,46,31,11,5,-5, +-17,-11,-25,42,0,3,9,13,19,23,29,24,23,21,20,18,15,15,15,14,14,13,6,54,40, +-54,74,57,-43,-40,-39,-43,-35,-36,-40,31,52,-74,17,40,-81,-79,-88,-64,-80,-78,-99,-103,-95,-97, +-93,-80,-93,-95,-95,-90,-87,-83,-84,-70,-93,-77,6,192,-103,-3,178,178,175,161,156,151,141,-6,-108, +177,10,47,-109,-69,-88,-92,-151,-164,-136,-137,-126,-96,-130,-142,-142,-135,-126,-115,-110,-91,-104,58,-40,-56, +-23,-8,-42,-20,-38,-35,-54,-48,-34,-39,-2,-25,-76,-43,-54,-52,-91,-99,-203,-238,-187,-200,-182,-117,-186, +-192,-194,-171,-156,-137,-121,-111,-64,-25,-20,-18,-31,11,4,81,58,32,42,32,-1,15,-2,-6,-45,-55, +-71,-41,-76,-106,-291,-341,-246,-245,-209,-104,-219,-282,-299,-285,-244,-208,-178,-133,-90,10,0,55,15,19,23, +93,127,61,56,42,17,27,16,26,-47,20,-36,-120,-160,-103,-63,-90,-233,-233,-262,-278,-230,-84,175,78, +38,13,-33,-74,-64,17,-2,18,21,45,110,24,15,98,158,140,25,11,-50,-140,-53,-148,-394,-30,19, +-67,-135,-145,-125,13,71,10,15,18,27,-10,-65,-142,-123,-89,-16,26,16,11,69,70,45,82,103,100, +17,17,55,56,33,12,-27,-7,-41,74,-4,-268,-430,-520,-487,-294,-135,-71,-180,-257,-290,-263,-158,32,-26, +-65,-97,-91,-66,-50,-56,-6,55,29,18,26,29,28,-10,63,86,32,-2,48,57,-133,-278,-484,-361,-226, +-42,-80,-102,-129,-145,-127,-95,-126,-132,-87,-71,-21,5,10,-23,-7,8,10,13,36,27,11,16,7,-49, +-32,-46,-40,8,-113,-252,-458,-413,-333,-338,-345,-324,-332,-303,-273,-216,-156,-121,-33,6,3,-8,-27,-24,-19, +-32,-3,11,-3,-30,-23,-29,-30,-46,-82,-135,-192,-233,-207,-261,-55,-217,-253,-249,-286,-287,-275,-279,-159,-85, +-43,-68,-85,-87,-64,-46,-27,-34,-8,52,44,30,3,1,-5,-22,-90,-118,-116,-140,-156,-171,-155,-145,-83, +-159,-238,-248,-236,-230,-222,-197,-176,-163,-146,-133,-107,-51,3,52,48,49,53,37,18,4,8,9,3,3, +16,18,19,-33,-34,-54,-47,-69,-107,-150,-174,-210,-37,-140,-131,-137,-137,-143,-145,-144,-110,-77,-52,-28,-9, +15,5,1,-4,-6,3,-16,-19,-34,-48,-22,-28,-46,-60,-73,-63,-81,-79,-66,-77,-62,-81,-105,-84,-91, +-75,-79,-78,-77,-76,-82,-69,-61,-51,-42,-33,-20,-24,-24,-25,-28,-29,-28,-54,-18,77,-67,-22,98,91, +85,74,68,58,48,-37,-93,58,-35,-54,126,72,162,107,114,96,121,130,138,133,131,135,118,115,115, +124,127,131,129,114,149,64,-37,-189,94,-22,-164,-156,-153,-143,-151,-152,-149,-14,118,-173,-41,-82,156,109, +98,64,116,145,170,172,169,177,128,113,120,140,156,169,157,146,133,-68,68,59,37,32,96,117,132, +80,116,111,59,88,40,41,112,70,157,138,88,26,122,177,232,221,207,227,130,110,119,163,186,209, +176,178,86,36,44,28,47,31,96,86,154,72,96,53,53,59,55,25,83,10,138,95,35,-62,46, +147,264,275,277,309,158,92,106,171,231,267,217,181,87,-4,67,25,64,58,59,124,124,75,67,64, +24,68,77,50,84,126,301,269,222,232,402,423,308,262,149,60,34,97,242,193,178,222,209,244,163, +44,112,76,58,52,99,32,36,128,175,140,50,33,-37,-93,58,-163,-170,102,134,-48,26,23,-43,95, +142,94,33,39,129,215,293,365,226,169,80,2,23,42,103,108,56,98,116,102,36,37,96,59,107, +128,19,29,84,188,258,435,393,371,353,264,224,258,325,360,308,227,127,80,14,28,35,11,14,-8, +-13,19,63,46,40,37,46,40,0,71,96,36,49,17,66,231,353,558,475,384,255,111,51,65,17, +19,28,90,146,205,187,148,73,-21,3,25,16,18,24,46,48,24,34,25,-17,-28,3,-48,4,-220, +36,263,279,344,301,243,149,67,63,139,98,102,111,72,36,20,-9,15,61,8,34,10,16,8,-21, +-14,-8,-13,-15,-61,-109,-167,-201,-208,-124,-206,-35,42,-14,-36,-13,26,81,14,-26,-40,0,34,64,95, +108,80,71,52,29,39,46,33,46,18,-24,-77,-105,-93,-110,-125,-136,-145,-103,-73,-47,-126,-105,-71,-74, +-58,-27,-1,37,39,54,57,74,83,90,78,71,70,76,93,86,47,38,34,24,8,18,-14,-21,-59, +-49,-53,-37,-67,-103,-145,-124,-158,-70,-50,-22,5,32,59,89,79,71,64,55,47,45,44,43,40,38, +32,45,-11,37,42,19,14,38,29,23,-6,5,-8,-31,-37,-63,-61,-48,2,27,21,35,42,51,58, +70,65,65,64,63,62,59,59,59,58,59,54,65,39,-15,-109,54,-16,-115,-114,-110,-103,-107,-108,-107, +-41,26,-129,-58,68,-83,30,-111,-65,-81,-77,-90,-94,-91,-93,-92,-84,-96,-99,-100,-96,-91,-84,-83,-68, +-116,27,122,217,-17,115,219,228,228,202,220,219,206,114,-28,213,140,154,-81,-81,-79,-80,-113,-122,-112, +-116,-115,-98,-134,-151,-154,-150,-132,-109,-89,-89,-77,134,-24,-14,3,30,4,4,6,35,-17,-37,-4,-6, +50,36,-49,66,-10,-80,-79,-90,-140,-159,-144,-157,-158,-121,-184,-200,-200,-187,-160,-123,-91,-106,-28,43,9, +-17,-17,53,30,114,42,86,36,73,18,54,41,50,20,38,-23,-70,-58,-80,-174,-192,-159,-166,-166,-109, +-210,-286,-307,-303,-240,-167,-110,-110,-53,57,-42,30,-4,14,37,105,138,53,62,40,15,47,66,32,-13, +244,60,-156,-175,-142,-29,-38,-219,-204,-278,-365,-354,-219,57,34,15,-69,-60,-95,14,130,19,49,23,40, +91,18,34,145,153,108,46,-3,-29,-43,136,-264,-327,-93,36,-46,-6,-10,-54,-8,25,55,30,24,30, +12,-14,-72,-65,-88,17,42,17,32,29,42,38,97,117,87,19,34,74,58,41,138,-204,128,96,153, +80,-102,-232,-359,-364,-377,-274,-107,-215,-229,-230,-205,-131,2,-41,-107,-63,-43,-47,-1,-34,9,59,29,17, +22,39,31,-6,80,83,95,95,4,26,-66,-99,-251,-133,-33,69,35,11,47,-59,-80,-62,-67,-74,-54, +-35,-19,20,38,-14,0,-6,-4,7,37,49,19,31,14,-56,-35,-51,-53,-47,-8,-84,-257,-208,-183,-189, +-241,-301,-246,-199,-138,-102,-72,-46,-17,-6,-25,-8,-25,-14,18,-24,-4,6,-10,-52,-23,-33,-24,-47,-68, +-99,-141,-158,-106,-143,37,-99,-185,-176,-227,-219,-214,-231,-121,-77,-67,-68,-59,-33,-23,-28,-57,-51,-29,37, +37,30,44,16,-13,-54,-106,-119,-128,-138,-155,-178,-172,-159,-102,-102,-126,-166,-192,-183,-197,-184,-181,-184,-156, +-129,-94,-48,-4,46,22,12,-2,5,-14,10,49,40,38,9,12,-19,-9,-82,-61,-84,-42,-49,-61,-70, +-66,-112,-36,-147,-138,-129,-122,-117,-109,-99,-76,-55,-36,-15,5,36,30,30,26,24,27,13,44,-12,-16, +-7,-9,-42,-64,-64,-44,-85,-103,-86,-102,-81,-94,-132,-34,-109,-82,-85,-82,-79,-78,-80,-71,-63,-53,-44, +-37,-26,-30,-30,-29,-32,-30,-43,4,60,121,-22,53,132,129,121,103,107,99,87,27,-55,83,29,-63, +60,-51,113,52,50,37,43,49,64,58,58,64,48,43,39,50,57,65,65,57,95,-60,-129,-147,-31, +-121,-128,-134,-134,-119,-143,-147,-147,-112,-4,-135,-133,-131,81,62,28,6,6,20,63,62,67,78,41,25, +20,40,56,78,72,87,49,-111,4,-34,-20,-22,28,52,44,-6,40,56,2,32,-9,-31,44,-9,114, +100,11,-19,-27,-7,92,67,69,94,12,-14,-31,21,53,97,91,122,27,-40,-18,-33,-8,-19,65,49, +130,25,85,20,16,31,24,-21,27,-39,120,84,-22,-77,-135,-99,68,63,87,140,24,-53,-80,-31,32, +103,100,132,35,-46,36,-42,30,55,87,136,137,97,67,74,32,85,75,36,40,74,200,165,84,74, +231,233,80,153,81,-30,-25,46,201,173,163,223,160,173,71,5,112,63,44,23,76,22,49,176,146, +90,31,-19,-91,-75,40,-398,-146,132,122,-20,-3,-44,-130,-31,45,119,19,-1,43,128,175,185,74,73, +27,-23,2,11,61,76,45,109,124,82,37,42,97,47,102,172,-184,141,188,209,175,152,90,46,60, +65,95,188,175,197,168,132,70,44,-3,29,-1,-31,5,-14,-26,15,60,42,38,29,51,39,-10,50, +90,49,136,-63,-42,38,62,157,187,208,262,57,-24,28,-71,-79,-35,25,65,115,115,114,54,-34,-10, +12,-7,-5,4,47,51,27,40,29,-5,-29,-6,-57,-38,-213,-113,11,18,80,35,-10,-74,-64,-45,-22, +-12,2,15,5,-2,1,-16,9,24,-30,9,3,6,0,-46,-30,-22,-46,-37,-77,-113,-140,-162,-160,-160, +-184,-102,-24,-54,-31,-5,32,47,27,-1,-21,-4,6,28,30,30,25,37,38,22,25,29,7,11,-11, +-58,-90,-111,-91,-117,-143,-167,-176,-161,-150,-106,-133,-89,-53,-78,-74,-76,-75,-63,-52,-31,-16,13,40,68, +53,42,33,38,61,43,11,31,47,16,-16,-33,-61,-71,-126,-89,-86,-56,-76,-98,-125,-111,-179,-108,-79, +-59,-30,-3,26,50,54,56,58,58,55,54,56,60,62,62,62,70,3,27,2,-17,-38,-36,-35,-51, +-76,-59,-63,-89,-91,-112,-117,-94,-74,-6,-13,-3,4,10,15,25,25,28,30,32,34,36,36,35,35, +36,32,50,-21,-70,-92,-23,-86,-107,-111,-109,-101,-114,-116,-116,-105,-50,-118,-118,22,-8,114,-25,-4,-11, +-13,-8,-6,-3,-8,-10,-9,-18,-21,-25,-20,-16,-8,-4,-1,-33,104,131,70,77,134,92,106,109,90, +114,116,105,139,76,82,151,136,27,-21,-10,-19,-5,4,12,3,-4,-3,-31,-50,-57,-52,-32,-7,16, +0,19,100,15,38,26,49,66,56,76,94,55,25,34,49,77,71,28,142,86,-24,-13,-37,-4,17, +32,10,-6,-6,-53,-74,-81,-71,-40,1,31,8,39,77,31,-1,8,62,65,113,63,110,53,92,35, +78,73,70,84,108,76,-35,-15,-48,-11,35,71,45,23,28,-43,-112,-138,-133,-69,9,62,24,28,58, +-42,-3,-5,21,58,121,141,58,70,49,16,73,107,33,49,360,205,-10,-35,-68,120,142,-26,-8,-119, +-270,-277,-195,-23,38,52,-25,22,18,112,167,69,81,41,36,69,10,52,191,139,74,54,-27,-31,30, +257,-317,-194,-112,48,7,114,97,-39,-40,-8,108,43,30,63,87,119,121,75,4,56,44,26,50,19, +35,37,104,118,70,30,45,69,69,93,225,-256,233,237,218,201,224,191,96,4,-167,-176,-9,-40,18, +54,20,-10,-16,-28,-75,-5,19,-5,31,-1,26,57,33,24,23,52,49,20,93,83,129,178,-55,-27, +62,181,213,264,265,197,156,122,177,44,-3,4,46,60,58,58,26,41,40,3,5,-7,-5,0,31, +57,30,34,16,-30,-21,-13,-38,-69,11,89,92,115,90,84,14,-98,-41,-4,67,70,69,67,31,11, +-15,7,6,18,42,8,4,4,-9,-49,-31,-43,-29,-36,-42,-52,-75,-87,-77,-26,14,13,-33,-30,-47, +-65,-62,-39,-44,-54,-59,-27,11,48,39,20,-21,-13,-10,18,26,31,70,21,-24,-69,-95,-103,-122,-128, +-149,-173,-174,-148,-118,-38,-34,-66,-91,-83,-95,-88,-94,-97,-71,-41,-17,-8,0,19,7,3,-6,12,7, +43,70,55,54,6,-14,-66,-61,-110,-93,-104,-63,-55,-45,-28,-13,-37,-77,-97,-89,-70,-58,-43,-27,-11, +-12,-17,-17,-14,-5,10,10,12,11,13,7,11,53,5,13,-2,4,-14,-33,-28,-22,-58,-86,-86,-95, +-89,-88,-107,9,-62,-47,-44,-40,-36,-33,-28,-30,-27,-25,-22,-21,-21,-21,-20,-19,-18,-15,-30,41,67, +46,24,63,40,41,36,23,31,28,20,33,-2,1,30,-27,-44,-106,-12,-35,-47,-48,-64,-64,-48,-54, +-52,-46,-55,-59,-66,-58,-52,-43,-39,-33,-26,-113,-98,18,-113,-101,24,14,12,15,-2,-7,-15,-94,-99, +18,-94,-55,-39,-30,-64,-67,-116,-121,-77,-84,-74,-60,-76,-91,-109,-100,-89,-65,-51,-25,-59,-52,-55,-89, +-55,-45,-32,-18,-37,-52,-36,-20,-44,-23,-24,-62,-43,-38,26,-5,-79,-73,-174,-193,-94,-126,-111,-85,-126, +-148,-185,-154,-124,-77,-42,-7,-37,-66,-58,-66,-56,-35,23,35,67,10,57,18,-16,16,4,-36,-21,-40, +33,4,-76,-82,-264,-295,-144,-170,-137,-74,-125,-197,-264,-259,-213,-134,-66,2,-36,-44,-27,-64,-20,27,84, +128,141,93,67,69,31,86,69,9,-17,104,65,-24,-117,-157,-29,-38,-207,-67,-95,-209,-173,-90,62,81, +84,92,39,22,-21,17,67,41,26,6,53,4,53,207,108,41,9,-79,-120,-37,78,-472,-195,-1,36, +28,-13,-66,-149,-133,-58,115,18,-18,-15,13,2,-63,-90,-58,-21,-6,4,3,17,36,38,109,116,57, +34,38,63,58,90,160,-310,239,243,191,78,-129,-173,-256,-316,-221,-129,-8,-77,-71,-54,-30,-22,-17,-27, +-17,-60,-63,-19,-15,-28,14,50,28,25,21,50,48,17,52,72,77,195,-120,-112,-159,-212,-271,-137,-13, +144,40,-18,-1,-89,-114,-80,-42,-31,-20,-13,14,14,-13,-18,-17,-24,-19,-13,30,39,23,28,16,-4, +-21,-15,-37,-74,-101,-167,-255,-259,-213,-237,-252,-263,-185,-154,-177,-117,-83,-68,-37,-14,-2,6,9,-14,-35, +-18,5,-7,-18,-56,-49,-49,-65,-50,-67,-83,-88,-104,-103,-149,-81,-141,-113,-98,-65,-60,-43,-57,-31,-18, +-2,-11,-20,-16,-45,-51,-38,-16,8,22,19,15,1,-27,-46,-81,-95,-108,-106,-131,-160,-189,-196,-199,-182, +-140,-118,-86,-73,-99,-106,-125,-141,-155,-131,-107,-80,-54,-25,7,6,7,7,6,14,5,-3,18,36,-10, +-45,-91,-98,-118,-148,-118,-108,-92,-89,-86,-82,-92,-114,-111,-94,-92,-80,-70,-57,-52,-35,-23,-13,-2,4, +10,9,12,14,15,20,15,-6,-24,-53,-52,-69,-88,-85,-101,-107,-106,-103,-117,-115,-117,-127,-113,-104,-59, +-59,-57,-55,-55,-54,-52,-47,-42,-37,-32,-27,-21,-21,-21,-21,-21,-22,-13,-65,-69,-10,-82,-87,-19,-26, +-30,-30,-42,-47,-50,-97,-99,-36,-97,-50,64,101,79,53,56,47,63,69,78,71,68,66,59,56,51, +55,59,65,70,62,68,88,32,-114,94,43,-82,-74,-70,-70,-59,-58,-64,54,110,-95,44,15,109,46, +47,31,69,91,111,102,95,91,75,59,44,51,65,84,100,87,89,-10,32,44,19,28,88,80,102, +91,94,74,42,75,55,43,78,122,140,52,37,9,75,120,167,140,125,111,79,56,33,47,72,106, +125,119,73,47,20,-1,12,27,83,72,87,86,74,74,32,70,68,33,95,84,130,21,9,-30,58, +137,221,190,177,170,130,73,27,38,81,140,176,143,78,7,-20,-39,-5,26,79,128,132,72,75,67, +22,99,118,14,70,319,287,153,88,3,214,259,136,177,75,-89,-112,-86,-28,71,106,85,125,152,157, +116,103,80,51,26,43,3,60,211,111,40,30,-71,-73,47,257,-336,-108,-93,45,65,147,115,-32,-57, +-20,144,42,22,74,146,211,241,157,88,61,28,36,53,29,45,47,108,110,53,41,46,63,86,138, +203,-231,275,306,247,261,393,493,447,234,82,5,83,169,264,294,238,130,-5,-5,-9,22,32,23,29, +21,38,47,31,28,27,60,68,62,81,62,104,218,-118,-73,108,293,492,464,401,236,221,183,185,105, +57,48,119,157,149,126,71,46,12,10,-4,-13,-8,-4,17,41,28,23,9,4,-12,17,-17,-80,-29, +172,296,277,267,244,202,117,123,121,155,144,133,120,61,29,18,27,38,43,30,29,20,-5,-17,-35, +-43,-48,-34,-18,-19,-20,-28,-40,-63,34,-90,41,79,73,83,70,80,123,27,-14,-17,26,65,94,69, +57,32,39,29,11,25,31,50,6,-36,-73,-77,-88,-105,-117,-138,-156,-174,-149,-136,-33,5,9,6,3, +2,5,0,4,17,36,44,27,8,-3,2,8,12,28,40,61,52,39,40,-9,-50,-100,-109,-113,-121, +-111,-97,-80,-56,-29,-14,-6,-109,-35,-29,-11,2,19,36,50,36,17,5,-5,-9,-14,-11,-11,-13,-12, +-21,-8,1,-3,7,-16,-9,-2,-7,-5,-19,-26,-43,-64,-61,-76,-68,-55,10,-7,-10,-2,1,5,7, +16,8,7,4,2,-1,-6,-5,-4,-4,-2,-2,-6,27,7,-67,27,4,-83,-81,-81,-80,-77,-76,-75, +-13,17,-93,-20,2,-100,-61,-104,-83,-98,-91,-114,-117,-106,-111,-110,-104,-107,-109,-117,-114,-111,-104,-98,-83, +-110,-67,8,144,-96,0,147,141,139,128,132,129,113,4,-97,138,22,62,-101,-91,-106,-96,-152,-165,-137, +-148,-140,-126,-125,-138,-165,-169,-163,-144,-114,-96,-103,42,-69,-77,-50,-28,-36,-44,-54,-28,-53,-54,-46,-35, +-1,-42,-79,1,-28,-90,-116,-91,-203,-231,-171,-202,-186,-165,-167,-184,-229,-228,-210,-172,-113,-97,-54,-33,-54, +-60,-66,-16,10,40,8,34,35,42,-24,24,10,-20,-20,2,-30,-75,-91,-65,-238,-288,-207,-243,-218,-163, +-155,-215,-307,-341,-318,-251,-146,-90,-63,-12,-76,-49,-56,-6,68,106,130,72,70,61,23,83,71,-24,-47, +214,13,-151,-234,-290,-181,-172,-313,-186,-205,-318,-294,-217,-84,-13,7,-51,-56,-84,-30,70,21,23,17,7, +31,-7,50,202,76,8,-11,-126,-115,27,175,-414,-259,-171,-37,85,22,-29,-91,-150,-102,106,22,-14,-29, +-40,-80,-179,-140,-119,-32,29,26,20,-10,10,42,102,100,37,27,33,46,91,85,97,-342,292,253,174, +39,-225,-166,-255,-460,-355,-273,-182,-213,-193,-154,-110,-63,-43,-36,-62,-82,-63,-36,-4,-8,22,34,14,11, +16,52,63,67,54,30,87,217,-144,-121,-228,-269,-376,-245,-115,7,80,70,36,-22,-61,-49,-54,-63,-81, +-76,-57,-14,20,-15,-38,-36,-27,-19,3,16,12,6,-6,-12,-19,-26,-13,-106,53,-61,-281,-295,-282,-286, +-274,-246,-182,-168,-198,-125,-90,-80,-35,-4,5,28,9,-27,-10,-27,12,-18,-36,-49,-57,-62,-50,-39,-34, +-31,-24,-28,-11,-57,0,-112,-142,-101,-99,-98,-104,-134,-74,-30,1,-14,-25,-24,-62,-71,-55,-40,-10,26, +27,12,2,-46,-64,-84,-90,-97,-117,-135,-158,-179,-195,-208,-177,-148,-64,-67,-83,-89,-101,-116,-133,-156,-133, +-118,-91,-75,-55,-32,-26,-18,-14,-14,-23,-13,4,8,14,-31,-62,-118,-109,-139,-134,-130,-111,-114,-86,-57, +-23,-52,-26,-89,-89,-97,-103,-108,-111,-119,-97,-80,-66,-49,-34,-21,-25,-27,-28,-29,-25,-38,-17,-60,-76, +-61,-63,-88,-89,-95,-81,-98,-97,-93,-94,-81,-91,-99,-80,-96,-86,-91,-93,-95,-98,-104,-96,-90,-83,-77, +-71,-62,-65,-65,-65,-67,-64,-70,-67,-29,52,-90,-40,52,47,41,32,30,25,21,-41,-94,36,-33,-101, +70,11,110,57,60,50,62,69,83,76,74,74,70,67,59,63,66,70,75,65,98,-2,-84,-186,25, +-73,-159,-164,-161,-145,-154,-156,-160,-61,50,-173,-82,-96,101,59,42,27,51,70,103,95,98,99,97,85, +62,67,72,85,91,95,78,-101,10,-4,-15,-16,55,52,60,34,68,71,15,52,5,-23,61,39,116, +74,23,8,38,76,155,126,126,121,107,86,42,58,71,100,110,133,51,-18,-18,-25,-12,-25,72,16, +82,40,80,39,8,37,33,-29,53,12,112,43,-11,-36,-4,50,169,145,163,180,179,129,50,55,71, +114,137,150,67,-49,-5,-65,-15,19,92,114,111,87,80,84,30,109,91,-26,38,198,229,183,81,-7, +155,207,146,217,155,17,-9,-7,-3,85,123,154,150,182,118,32,95,46,47,14,18,1,58,192,76, +8,-19,-122,-117,42,190,-358,-110,-57,36,124,100,41,-52,-85,-34,155,28,-3,49,122,176,189,117,94, +27,5,36,35,32,49,58,101,93,35,36,38,73,111,146,82,-222,261,295,216,189,242,433,444,200, +181,107,83,226,316,325,273,164,9,7,40,15,-2,21,7,28,40,28,23,26,24,64,79,91,35, +11,47,212,-157,-114,23,154,366,314,261,155,183,159,118,90,56,59,100,138,138,113,71,22,-20,2, +-22,-29,-18,-9,-3,9,13,4,-3,21,-11,20,-7,-90,-52,124,249,204,215,183,189,183,130,95,78, +81,82,71,43,29,39,31,45,37,-3,24,22,-13,-27,-28,-52,-42,-28,-6,-10,-7,-1,-5,-25,34, +-177,-17,69,61,82,101,117,142,57,24,18,49,66,75,50,46,59,60,51,15,30,24,-6,-27,-47, +-67,-63,-78,-88,-108,-127,-135,-174,-168,-167,-95,-11,26,47,37,47,43,40,45,45,50,47,31,14,-3, +10,19,27,33,55,49,9,9,12,-23,-73,-105,-129,-106,-142,-113,-124,-105,-78,-54,-44,-18,-114,-19,-12, +-2,10,23,37,48,38,27,18,9,1,-10,-9,-11,-11,-12,-18,-6,-45,-15,-18,-37,-37,-18,-10,-13, +-35,-15,-15,-41,-35,-61,-56,-28,-33,11,-3,5,7,9,11,18,12,10,8,6,3,0,1,0,0, +1,-2,8,-24,-70,-133,-16,-77,-150,-150,-145,-134,-139,-136,-129,-76,-13,-134,-84,-2,-74,30,-97,-62,-72, +-66,-77,-79,-73,-78,-78,-76,-73,-74,-82,-84,-83,-79,-73,-62,-97,22,87,127,-11,83,139,139,140,127, +145,145,130,87,-17,125,107,119,-67,-78,-72,-65,-86,-92,-83,-94,-91,-83,-71,-83,-113,-125,-122,-107,-79, +-78,-58,83,-38,-24,-19,4,8,-17,-10,35,-9,-27,-11,-3,31,0,-45,67,-15,-93,-80,-66,-108,-115, +-95,-117,-110,-103,-82,-96,-141,-161,-155,-128,-80,-85,-17,18,-21,-35,-42,11,30,45,-9,72,34,68,-6, +40,30,2,22,56,-29,-92,-60,-41,-93,-112,-98,-127,-115,-85,-39,-85,-186,-233,-228,-177,-93,-78,-24,19, +-81,-31,-62,-24,60,80,103,60,80,63,22,82,72,-52,-29,308,52,-126,-189,-248,-150,-105,-167,-115,-156, +-270,-291,-245,-156,-52,-15,-97,-60,-76,30,109,6,19,26,19,11,-5,49,164,56,-6,-34,-144,-85,90, +265,-310,-249,-247,-48,150,88,36,-9,-117,-92,108,35,5,7,-22,-46,-107,-58,-72,-3,48,42,40,-12, +8,51,86,76,22,14,27,58,134,96,7,-306,275,253,151,37,-117,34,3,-222,-218,-223,-199,-149,-92, +-45,-36,-22,-39,-30,-69,-46,-25,-26,13,25,35,17,6,5,12,58,78,101,31,-27,71,195,-133,-112, +-149,-101,-136,-88,-47,-47,139,172,117,85,40,28,-3,-13,-45,-49,-64,-28,29,-10,-43,-42,-30,-15,-22, +-6,1,-11,-18,-13,-9,-17,-4,-112,142,108,-37,-51,-86,-81,-65,-39,-48,-63,-79,-42,-23,-20,0,16, +16,38,17,-8,26,-10,10,-18,-40,-40,-52,-52,-11,-15,1,18,28,37,57,55,4,-46,-98,-61,-81, +-75,-87,-98,-58,-23,-3,2,3,6,-17,-29,-18,-19,-6,26,34,15,1,-46,-63,-68,-71,-79,-112,-123, +-136,-142,-174,-185,-158,-124,-2,-22,-49,-36,-41,-43,-52,-67,-53,-47,-32,-34,-34,-29,-20,-9,-5,-1,-13, +9,24,6,-4,-38,-62,-110,-103,-130,-110,-122,-103,-113,-74,-35,6,-14,5,-55,-62,-67,-75,-82,-88,-93, +-82,-74,-66,-55,-41,-27,-32,-35,-39,-39,-40,-47,-12,-51,-49,-42,-32,-47,-51,-45,-27,-52,-58,-47,-53, +-42,-45,-64,-26,-78,-66,-71,-73,-75,-78,-83,-79,-76,-72,-68,-65,-60,-63,-62,-62,-63,-61,-73,-28,12, +42,-43,9,43,44,39,30,37,36,33,9,-42,33,16,-84,11,-76,48,7,5,1,-3,0,14,10, +11,14,14,11,1,4,5,9,12,10,40,-85,-125,-108,-65,-121,-92,-108,-107,-89,-108,-112,-117,-112,-45, +-106,-125,-111,14,12,-13,-18,-33,-30,3,-1,11,23,35,26,-6,-8,-11,-1,3,24,2,-105,-33,-64, +-49,-48,-2,-5,-13,-25,5,22,-21,2,-33,-74,-3,-35,32,28,-33,-27,-70,-65,15,-6,14,28,37, +18,-43,-36,-34,-7,6,44,-4,-67,-55,-56,-46,-56,41,-18,47,12,65,15,-15,5,-4,-71,-4,-44, +29,18,-46,-46,-119,-130,-25,-36,13,66,102,58,-54,-72,-80,-43,-12,48,12,-67,-15,-74,-37,-1,91, +85,86,96,86,91,40,99,49,-61,-17,97,79,69,-38,-100,-28,22,18,96,84,-1,-38,-31,-7,50, +80,120,76,84,22,-25,47,4,37,8,-4,5,53,141,44,-13,-68,-155,-130,43,127,-362,-152,-61,11, +185,41,-39,-48,-112,-60,126,22,-16,0,26,29,1,-11,22,-11,-8,25,12,20,40,61,83,66,14, +13,23,86,141,120,-71,-251,210,260,137,15,-96,60,114,7,89,63,-3,101,151,155,145,96,9,-4, +29,-17,-40,-2,-14,23,34,10,9,14,14,62,79,91,-24,-52,-3,163,-153,-151,-124,-100,-24,-31,-18, +26,96,104,37,50,33,34,21,34,37,21,15,-24,-40,-19,-41,-47,-34,-13,-20,-20,-4,-11,-8,22, +-1,9,-13,-86,-17,24,56,23,37,6,40,103,34,-11,-74,-54,-35,-23,-2,14,36,28,34,10,-21, +4,7,-19,-34,-35,-52,-31,-13,-4,-9,-3,11,17,12,5,-180,-107,-46,-37,-9,27,45,47,33,38, +43,48,32,16,0,3,43,42,43,24,27,9,-52,-60,-59,-56,-55,-73,-78,-103,-119,-120,-166,-183,-186, +-163,-47,2,27,16,28,18,17,18,16,13,12,10,10,7,20,28,37,31,47,29,-18,-16,-19,-36, +-74,-91,-117,-99,-141,-111,-129,-119,-99,-83,-77,-50,-83,-32,-26,-27,-22,-17,-12,-11,-6,-1,2,2,1, +-5,-6,-7,-6,-7,-6,-2,-52,-26,-44,-50,-58,-49,-36,-43,-56,-34,-23,-37,-35,-51,-53,-31,-67,-1, +-15,-12,-12,-13,-13,-12,-11,-11,-10,-10,-9,-7,-7,-8,-8,-8,-11,3,-61,-95,-100,-58,-106,-112,-113, +-110,-99,-107,-106,-100,-96,-52,-92,-98,-20,1,84,-13,-1,-2,-2,3,6,8,6,5,4,8,6,-2, +-5,-6,-3,1,1,-12,74,75,-3,61,80,21,23,26,25,41,42,33,86,63,4,92,74,20,-15, +-2,-3,15,21,21,15,18,22,34,24,-5,-17,-18,-8,8,-2,24,42,2,19,5,20,54,27,46, +79,50,29,28,39,42,23,21,98,36,-28,-10,-14,19,41,42,36,38,35,58,43,-3,-24,-28,-12, +8,-1,31,38,2,-17,-11,16,59,34,13,91,50,72,18,46,42,8,63,73,17,-45,-12,-13,50, +71,60,54,67,79,132,99,1,-37,-46,-18,18,3,35,18,-51,-31,-45,-22,66,63,74,70,93,75, +32,85,67,-59,13,295,121,3,-47,-107,-22,58,88,66,10,-84,-171,-171,-134,-35,9,-32,10,15,86, +88,18,16,43,30,-11,10,54,107,44,-8,-55,-137,-57,123,278,-225,-155,-205,-14,215,142,85,65,-63, +-56,98,43,22,34,31,43,49,60,24,35,36,39,46,8,27,61,70,51,5,-1,23,89,170,108, +-86,-236,203,268,122,29,40,189,255,186,58,-40,-76,40,119,149,122,73,-5,-14,-39,9,20,2,21, +50,44,6,1,4,9,63,82,99,-13,-76,27,131,-107,-111,-22,110,198,149,94,6,170,221,163,168, +135,96,65,62,41,20,-22,-28,1,-12,-37,-43,-32,-9,-33,-19,-5,-15,-12,3,11,12,-7,-83,131, +226,266,260,213,199,197,203,130,86,70,50,43,49,36,29,22,36,31,23,43,14,0,-18,-35,-33, +-38,-25,22,10,21,38,46,60,66,119,-74,-4,-29,-14,-20,-8,-4,23,6,9,14,38,50,49,43, +38,39,29,20,23,27,10,-9,-40,-55,-48,-51,-62,-88,-98,-105,-99,-140,-144,-139,-101,27,20,5,25, +29,39,45,51,52,52,51,33,16,2,11,18,24,30,28,49,36,3,-21,-36,-55,-78,-89,-99,-95, +-104,-98,-104,-72,-39,-14,-3,-16,-12,-19,-15,-17,-18,-19,-17,-22,-27,-30,-30,-26,-21,-22,-24,-27,-26, +-32,-25,-8,-19,-8,-17,-7,-5,-8,2,6,-7,-17,-14,-18,-19,-14,-22,24,-14,-12,-13,-14,-14,-15, +-16,-17,-18,-19,-19,-21,-22,-23,-22,-22,-21,-20,-28,16,23,-17,15,25,-22,-18,-18,-20,-11,-9,-9, +23,17,-20,25,-17,-58,-92,-47,-50,-58,-55,-71,-73,-65,-65,-62,-56,-54,-56,-66,-67,-67,-64,-61,-53, +-50,-98,-70,35,-102,-72,41,25,24,34,21,17,9,-69,-95,30,-63,-31,-72,-49,-68,-60,-105,-117,-98, +-98,-81,-62,-45,-51,-85,-97,-105,-97,-88,-64,-72,-36,-62,-89,-57,-47,-37,-47,-59,-38,-41,-29,-35,-32, +-33,-73,-58,-47,-45,-43,-81,-59,-150,-173,-129,-131,-100,-74,-51,-64,-129,-138,-146,-126,-101,-70,-50,-69,-68, +-71,-63,-48,16,-16,3,24,42,17,-19,-4,-15,-63,-30,-41,-47,-30,-64,-40,-176,-240,-195,-187,-129,-59, +-1,-35,-157,-205,-229,-202,-154,-82,-45,-45,-46,-64,-58,-24,77,54,66,99,92,86,47,79,22,-72,-50, +75,-54,-87,-166,-198,-200,-150,-111,-58,-41,-75,-145,-129,-56,-19,5,14,-28,-50,-55,-28,-11,-26,28,13, +-21,17,53,78,23,-22,-90,-156,-98,69,117,-305,-172,-112,-17,235,33,-52,-1,-116,-84,69,25,-6,-42, +-66,-106,-161,-115,-65,-31,-4,11,4,4,27,59,63,38,-10,-12,16,100,163,71,-183,-269,145,237,61, +-140,-373,-326,-238,-117,-73,-67,-103,-79,-67,-55,-24,1,6,-19,-18,-40,-47,-18,-17,21,27,0,-8,-2, +4,57,68,65,-61,-94,-26,82,-114,-158,-221,-267,-337,-293,-220,-55,31,72,14,46,38,21,-42,-69,-71, +-78,-58,-59,-39,-40,-52,-56,-44,-18,-31,-34,-14,-18,-6,10,14,0,-17,-65,65,-17,-89,-88,-82,-111, +-86,-9,-42,-77,-158,-136,-119,-93,-34,0,18,24,17,-13,-14,-18,-14,-26,-40,-43,-38,-14,6,-4,-6, +-1,15,29,48,-1,-119,-149,-154,-127,-104,-69,-53,-64,-8,31,51,31,2,-23,-33,-26,8,9,21,32, +17,-11,-66,-73,-64,-50,-54,-67,-72,-95,-106,-102,-138,-170,-177,-195,-62,-32,-24,-25,-21,-27,-25,-27,-23, +-26,-18,-10,4,15,21,25,30,21,19,10,-17,-25,-40,-43,-58,-66,-84,-90,-117,-106,-117,-123,-108,-95, +-82,-67,-22,-43,-43,-53,-56,-63,-69,-77,-61,-45,-32,-20,-12,-6,-8,-8,-7,-7,-1,-6,-30,-32,-53, +-46,-56,-65,-57,-63,-61,-54,-45,-43,-42,-38,-45,-42,-59,-25,-28,-33,-36,-39,-42,-48,-40,-37,-34,-30, +-27,-20,-21,-21,-21,-22,-22,-15,-57,-54,-6,-65,-64,-9,-12,-13,-10,-16,-17,-18,-56,-63,0,-48,-38, +56,60,67,45,50,44,57,62,64,64,64,64,66,63,56,54,52,53,55,48,64,49,-8,-128,63, +4,-99,-102,-98,-83,-84,-84,-85,12,78,-114,1,-24,78,43,45,35,67,79,82,85,91,95,104,97, +73,63,57,61,62,56,68,-43,15,15,4,8,62,45,62,71,72,63,40,53,22,9,60,66,68, +43,35,19,72,105,115,125,133,129,143,127,83,70,59,67,63,66,45,7,-6,-23,1,-3,68,10, +43,79,63,51,28,35,35,-10,66,47,61,24,18,0,85,116,123,144,172,185,227,208,124,93,70, +76,71,61,53,-20,-19,-50,-27,-11,77,53,53,97,102,88,48,86,53,-51,40,172,124,106,56,5, +55,146,244,204,161,105,-31,-70,-66,6,48,71,84,100,86,17,29,7,51,32,-27,32,64,53,31, +-11,-70,-119,-44,117,202,-176,-43,-100,29,257,158,86,86,-38,-34,73,48,34,31,55,90,141,108,78, +35,-1,18,36,28,48,63,54,26,-16,-10,27,119,171,91,-155,-168,105,278,86,-13,53,139,293,467, +257,120,69,184,254,264,219,136,37,6,11,47,40,29,17,54,39,3,-4,2,9,62,69,60,-51, +-92,-21,43,-80,-121,30,170,326,240,155,88,140,182,154,182,166,121,96,88,83,54,12,-25,-41,-25, +-33,-41,-31,-8,-31,-26,-9,-14,1,17,25,32,-11,-37,58,205,388,394,368,329,312,304,220,169,139, +86,59,57,41,29,30,28,37,42,28,22,-14,-23,-31,-29,-19,7,33,22,19,26,36,51,49,110, +-165,-14,14,10,25,51,74,117,64,42,37,60,74,71,75,79,75,66,46,20,12,-6,-34,-36,-43, +-38,-39,-51,-57,-69,-73,-61,-96,-104,-132,-104,9,31,39,50,61,75,90,112,106,104,95,74,54,35, +40,41,44,47,53,59,23,-7,-32,-32,-47,-44,-73,-66,-91,-88,-102,-103,-85,-68,-63,-22,-48,13,12, +20,25,31,35,39,26,16,9,3,0,-6,-3,-2,-1,0,-4,9,-11,9,15,-4,-4,11,12,17, +5,12,5,-5,-3,-15,-5,5,32,39,29,32,32,32,33,36,32,30,26,23,20,16,17,18,18, +20,19,22,27,0,-70,36,0,-82,-78,-75,-69,-67,-63,-60,-3,36,-68,-3,35,-79,-34,-96,-67,-77, +-70,-86,-90,-89,-86,-82,-77,-74,-75,-82,-87,-89,-87,-85,-73,-95,-40,23,116,-62,20,123,115,115,114, +115,113,104,21,-66,114,38,65,-90,-71,-75,-64,-104,-121,-120,-115,-101,-85,-69,-74,-100,-121,-130,-126,-112, +-101,-88,38,-58,-64,-35,-17,-28,-44,-48,-2,-38,-40,-17,-27,-2,-27,-59,-1,-64,-79,-79,-60,-138,-163, +-162,-146,-118,-99,-70,-78,-124,-155,-169,-160,-132,-125,-55,-33,-52,-64,-48,-13,10,7,-20,59,25,37,-2, +10,3,-21,-11,16,-61,-53,-44,-19,-126,-194,-214,-188,-144,-93,-30,-45,-141,-215,-248,-236,-189,-149,-68,-15, +-73,-50,-60,-33,60,32,52,97,99,77,52,64,21,-57,-36,101,-102,-165,-204,-223,-253,-193,-118,-110,-96, +-101,-215,-210,-120,-70,-43,-71,-76,-110,-59,6,-43,-27,24,24,-30,37,62,27,12,-27,-86,-127,-42,105, +136,-190,-133,-159,-24,258,88,11,61,-91,-90,18,53,34,-48,-98,-148,-185,-124,-101,-35,-1,-2,14,-5, +18,50,41,11,-32,-24,22,106,153,21,-208,-238,79,228,9,-199,-422,-448,-335,-40,-134,-143,-124,-159,-159, +-130,-92,-42,11,-19,-49,-26,-16,-13,2,26,20,-1,-19,-14,2,49,47,26,-60,-96,-18,-1,-62,-138, +-200,-229,-345,-279,-208,-51,21,82,68,87,75,41,-37,-95,-115,-118,-100,-67,-30,-49,-53,-50,-41,-19,-32, +-32,-18,-21,-3,-5,20,-4,-10,-33,127,9,-68,-33,-48,-64,-65,-27,-29,-46,-98,-98,-100,-90,-33,2, +11,24,8,-11,9,-25,-30,-34,-42,-43,-14,7,24,1,3,8,28,48,75,28,-49,-116,-160,-125,-123, +-100,-93,-101,-29,13,36,13,-3,-18,-19,-17,-9,-7,2,28,2,-27,-55,-60,-54,-47,-53,-59,-63,-74, +-77,-71,-88,-121,-139,-162,-49,-45,-57,-46,-49,-46,-40,-39,-28,-25,-13,-5,7,21,19,19,17,9,-8, +-3,-1,-21,-43,-42,-39,-44,-51,-78,-82,-95,-97,-117,-103,-88,-70,-63,25,-35,-41,-50,-59,-69,-81,-92, +-78,-63,-49,-33,-20,-7,-8,-7,-5,-3,3,-5,5,-23,-33,-23,-29,-48,-51,-50,-37,-50,-50,-38,-39, +-21,-26,-40,-19,-39,-32,-40,-44,-48,-51,-58,-50,-46,-42,-39,-35,-29,-30,-29,-28,-29,-27,-30,-21,11, +64,-36,6,66,65,60,53,54,52,47,4,-39,62,17,-43,51,-13,78,41,45,38,44,49,53,56, +58,59,59,57,52,49,48,47,48,41,72,-23,-85,-148,4,-73,-125,-134,-132,-109,-126,-129,-125,-66,24, +-135,-82,-88,64,52,38,27,37,43,54,65,76,84,92,90,73,60,50,49,41,47,41,-97,-6,-27, +-16,-18,26,24,28,22,42,50,22,32,-9,-23,45,1,49,64,27,13,22,41,71,92,111,112,122, +110,75,61,46,49,36,54,12,-45,-36,-47,-9,-27,48,-12,49,49,58,20,22,15,16,-31,32,8, +63,66,22,0,8,9,46,86,129,154,191,189,125,81,44,37,15,32,12,-64,-15,-74,-18,0,79, +44,42,119,105,95,65,82,36,-34,37,9,35,90,37,-5,5,84,207,195,189,183,34,-19,-21,27, +61,119,99,107,31,-49,20,-4,43,26,-33,55,74,15,14,-26,-83,-98,-37,89,78,-147,20,-8,53, +260,136,55,68,-40,-34,38,64,51,-8,20,40,86,48,47,-8,-41,-12,17,31,51,54,35,2,-36, +-12,33,122,134,43,-188,-130,19,236,11,-106,-98,-98,84,429,258,162,129,173,203,208,188,127,62,20, +44,46,26,33,6,37,23,3,-11,-3,11,48,37,4,-65,-78,-44,-37,-56,-124,-11,60,164,128,87, +111,64,95,109,133,130,98,68,42,41,18,2,-33,-73,-43,-37,-38,-29,-13,-21,-26,-15,-16,8,21, +21,29,-3,0,-15,56,249,271,280,245,232,234,176,138,102,49,21,12,16,21,34,19,32,37,-1, +6,-28,-34,-33,-29,-1,30,27,19,7,5,26,41,27,44,-183,-64,6,4,30,61,86,114,74,54, +50,53,56,50,58,63,66,64,46,12,-9,-28,-62,-39,-35,-38,-38,-47,-30,-41,-42,-33,-54,-72,-120, +-109,-40,5,27,25,36,44,60,84,83,83,78,69,59,49,50,47,47,41,47,33,-7,-19,-35,-30, +-41,-29,-59,-46,-87,-78,-104,-106,-102,-102,-112,-62,-56,10,15,21,29,36,40,42,34,28,26,22,17, +10,14,16,20,22,23,34,-9,18,11,-5,-16,-6,0,-3,-21,-2,-1,-16,-8,-19,-13,6,-2,41, +28,32,31,32,33,37,36,34,31,28,26,24,26,26,26,28,26,38,3,-34,-76,9,-40,-89,-89, +-86,-77,-83,-81,-78,-43,6,-73,-42,34,-40,41,-64,-34,-38,-35,-41,-43,-46,-40,-38,-37,-34,-34,-37, +-44,-47,-48,-46,-40,-63,33,75,78,15,78,92,93,95,92,102,102,98,78,10,86,93,100,-34,-37, +-28,-26,-39,-47,-56,-48,-40,-32,-20,-22,-36,-61,-71,-71,-61,-66,-41,55,-26,-16,-1,16,9,-7,3, +47,4,-10,19,8,31,25,-11,56,-24,-49,-28,-29,-51,-57,-77,-49,-31,-32,-4,-9,-27,-72,-90,-92, +-79,-91,-25,4,-23,-42,-13,20,21,28,-10,84,20,50,25,30,31,21,31,76,-13,-23,9,9,-14, +-48,-93,-55,-32,-19,38,46,-4,-88,-128,-133,-116,-123,-49,-5,-75,-45,-40,-22,48,25,42,97,103,74, +61,60,37,-25,16,107,-65,-126,-137,-167,-175,-101,5,-30,-35,-24,-173,-201,-149,-72,-36,-74,-39,-60,-3, +35,-33,-2,28,31,-31,61,76,-1,4,-35,-74,-83,12,124,135,-68,-45,-134,9,245,163,102,105,-45, +-66,-6,83,81,-25,-60,-85,-77,-44,-64,-26,-11,-13,28,0,20,42,21,-13,-47,-18,36,98,119,-12, +-184,-165,13,166,-59,-184,-245,-309,-183,162,-30,-77,-42,-85,-78,-40,-18,4,31,3,-36,15,28,7,23, +32,15,2,-22,-17,8,34,19,-13,-38,-67,1,-61,-21,-84,-66,-24,-73,-37,-29,10,50,115,147,142, +123,80,18,-42,-75,-83,-88,-54,-30,-48,-46,-36,-28,-17,-23,-21,-20,-20,0,-8,15,3,12,-4,107, +51,64,117,97,104,88,81,78,64,60,20,-5,-16,1,16,16,25,12,13,28,-18,-39,-41,-40,-34, +8,25,35,13,18,23,46,64,68,58,-15,-44,-66,-36,-45,-43,-45,-39,-8,8,19,9,15,18,24, +19,5,3,-4,8,-16,-37,-35,-36,-38,-44,-48,-46,-43,-39,-34,-27,-34,-53,-80,-79,-27,-33,-53,-38, +-40,-26,-14,-4,9,17,27,24,22,24,20,19,16,11,-10,2,14,-10,-33,-35,-28,-35,-35,-61,-52, +-79,-79,-101,-91,-80,-67,-55,31,-11,-17,-17,-21,-26,-34,-40,-39,-36,-30,-22,-13,-2,-2,-1,0,2, +3,2,28,-3,0,0,0,-16,-25,-19,-8,-27,-36,-26,-25,-7,-5,-21,18,-30,-20,-25,-27,-28,-29, +-31,-28,-27,-26,-25,-25,-23,-23,-22,-21,-21,-18,-27,16,46,58,4,44,58,58,54,45,50,49,43, +34,-4,48,45,-28,0,-67,21,0,-2,-5,-12,-12,-7,-2,2,5,5,4,2,-3,-5,-6,-5,-6, +14,-75,-93,-59,-57,-87,-49,-59,-59,-43,-63,-66,-62,-84,-45,-50,-90,-68,0,17,-3,-9,-36,-43,-28, +-14,1,11,23,24,14,-4,-19,-23,-30,-15,-27,-82,-37,-65,-32,-30,-20,-14,-23,-24,-11,6,-3,-5, +-25,-39,-1,-40,-5,30,-11,-16,-72,-81,-45,-17,12,18,32,27,7,-18,-37,-40,-45,-22,-39,-76,-58, +-65,-22,-32,14,-16,28,22,32,0,12,-2,-1,-32,-6,-8,23,64,15,2,-94,-140,-99,-51,-1,31, +74,89,48,-23,-72,-88,-99,-60,-54,-80,-35,-82,-19,3,65,34,39,123,99,89,78,68,21,-14,18, +-90,-86,-30,-77,-108,-128,-70,48,68,97,137,-2,-52,-37,5,34,80,50,38,-35,-66,-1,-4,27,17, +-33,73,83,-5,-7,-48,-91,-75,-20,65,-12,-114,24,37,61,226,112,38,41,-53,-49,1,78,72,-40, +-43,-61,-50,-56,-31,-58,-57,-33,-1,17,37,41,16,-20,-51,-5,42,98,83,-23,-202,-129,-40,99,-108, +-218,-277,-373,-234,143,108,100,86,42,23,31,60,64,63,28,40,16,-1,17,-1,13,4,1,-19,-10, +15,24,-1,-44,-54,-49,-39,-76,-29,-84,-68,-90,-102,-68,-44,57,-8,24,64,72,73,56,10,-35,-47, +-57,-43,-49,-77,-58,-46,-34,-24,-18,-10,-21,-22,-18,8,13,9,12,19,17,-42,-100,-27,9,49,49, +61,90,77,58,24,-7,-26,-37,-10,10,27,16,19,14,-21,-22,-42,-46,-37,-28,9,36,17,14,4, +-2,26,35,16,-24,-113,-98,-28,-11,13,27,36,32,40,42,45,23,13,8,13,17,25,28,19,-2, +-29,-46,-70,-46,-35,-43,-42,-43,-14,-17,-14,-10,-17,-41,-82,-93,-83,-41,-23,-30,-23,-18,-5,10,16, +20,25,29,34,37,36,34,36,20,16,-7,-28,-27,-33,-32,-38,-31,-47,-43,-75,-72,-96,-104,-111,-121, +-134,-96,-30,-9,-3,-1,4,5,5,3,6,11,16,20,20,18,20,21,23,24,29,29,-3,5,-12, +-16,-32,-37,-32,-40,-48,-35,-28,-36,-27,-25,-24,-11,-41,1,-5,-5,-5,-4,-2,-1,1,2,1,1, +3,4,4,5,5,5,4,15,-30,-48,-33,-34,-58,-42,-45,-46,-41,-50,-51,-51,-62,-42,-34,-55,-7, +22,72,12,19,21,17,22,24,22,28,29,27,29,29,30,22,19,16,17,14,9,62,51,-30,64, +61,-11,-5,-2,-1,6,7,11,62,66,-13,64,54,44,25,33,24,35,37,31,42,46,45,54,55, +55,31,20,13,14,0,20,10,5,17,20,29,39,32,46,64,44,31,45,39,38,46,45,75,31, +18,32,11,35,51,38,73,82,64,84,82,89,44,23,10,4,-12,5,11,-4,-22,20,30,34,30, +18,73,21,40,43,34,42,37,60,94,52,43,62,35,71,74,46,93,104,88,133,162,159,79,31, +3,-14,-46,-20,-24,-51,-50,-9,3,45,29,36,98,98,74,72,58,46,7,64,60,-7,-32,-38,-76, +-52,28,158,108,90,111,-55,-123,-124,-40,6,3,47,47,53,31,6,30,33,30,-30,80,88,-11,-5, +-48,-69,-43,39,110,94,1,52,-26,68,200,203,160,107,-6,-34,-7,100,113,13,1,6,59,46,5, +-20,-26,-20,27,11,28,36,6,-30,-52,3,53,83,68,-38,-156,-94,-40,39,-134,-153,-27,-96,11,280, +149,90,79,68,79,102,105,84,57,35,10,45,52,27,31,29,8,2,-18,-11,18,15,-10,-45,-18, +-30,-2,-71,10,-12,85,173,234,209,151,74,68,112,170,160,145,110,72,32,-1,-17,-44,-37,-43,-45, +-38,-22,-12,-13,-9,-10,-20,-17,4,1,9,18,38,22,23,52,161,203,206,242,239,210,191,174,196, +133,92,61,41,31,20,23,21,32,23,-11,-43,-46,-35,-17,20,36,35,28,31,33,53,60,35,58, +-29,25,58,72,69,53,43,60,32,15,8,14,34,50,61,56,31,26,3,-16,-33,-41,-23,-21,-28, +-39,-38,-30,-14,-1,9,17,16,13,-15,0,-23,-22,-28,-14,-7,13,30,48,55,61,62,49,34,23, +21,22,23,18,3,8,12,-8,-24,-28,-27,-31,-35,-44,-42,-64,-71,-85,-83,-81,-83,-55,0,11,10, +20,24,27,27,31,22,14,11,8,9,10,11,9,7,7,4,9,23,11,20,7,8,4,-3,1, +1,-9,-19,-20,-14,-7,3,-1,25,-6,-3,-2,-1,2,5,10,6,4,2,0,-3,-5,-5,-4,-4, +-3,-2,-7,28,30,-5,24,29,-13,-11,-13,-16,-12,-11,-14,14,13,-17,20,-4,-48,-62,-49,-39,-46, +-44,-60,-63,-60,-53,-49,-48,-45,-45,-44,-51,-53,-56,-55,-49,-53,-67,-33,55,-68,-31,56,50,49,51, +41,39,41,-33,-70,60,-25,10,-54,-23,-36,-36,-83,-100,-90,-77,-64,-57,-42,-37,-37,-62,-78,-87,-87, +-75,-78,-19,-51,-66,-27,-18,-40,-35,-47,-34,-43,-33,-12,-26,-15,-23,-34,-32,-48,-20,-39,-34,-123,-149, +-131,-99,-70,-68,-45,-43,-40,-82,-104,-115,-107,-97,-69,-64,-55,-58,-20,-9,-9,2,-3,12,1,-3,8, +-5,-2,-7,-18,14,-13,38,19,17,-125,-195,-185,-138,-101,-80,-27,3,-4,-99,-157,-185,-177,-144,-101,-64, +-60,-66,-17,7,45,27,38,102,86,72,79,47,14,6,6,-89,-158,-158,-185,-199,-228,-185,-75,-53,-13, +49,-79,-125,-90,-47,-13,3,-6,-32,-58,-27,-13,11,13,12,-29,82,86,-12,-23,-67,-90,-49,10,58, +-28,-63,10,39,60,164,109,63,40,-52,-64,-25,90,98,-35,-84,-135,-154,-119,-91,-80,-43,-35,-9,-4, +14,29,-2,-38,-55,8,52,65,30,-86,-193,-135,-59,-73,-209,-274,-347,-467,-413,-167,-41,25,-1,-89,-137, +-122,-60,-2,48,31,12,-19,-15,-3,4,-3,-11,-4,-22,-12,16,0,-30,-70,-27,-16,-24,-64,11,-5, +-65,-139,-240,-179,-121,-15,-45,-14,42,43,44,38,-27,-82,-113,-111,-87,-63,-57,-62,-52,-28,-16,-19,-3, +-14,-25,-17,3,1,0,0,45,26,-22,-166,-228,-189,-144,-85,-47,-16,11,12,-5,-16,-28,-45,-11,10, +12,16,4,-11,-26,-48,-51,-53,-39,-19,14,30,14,16,14,9,32,33,19,-47,-3,-64,-33,-3,7, +-7,-23,-50,-7,12,18,-9,-21,-21,-16,-16,-16,-12,-14,-17,-40,-53,-54,-48,-40,-46,-43,-32,-4,4, +12,14,22,3,-16,-46,-94,-78,-72,-70,-61,-57,-49,-47,-37,-33,-23,-11,1,13,10,12,15,-4,-23, +-39,-32,-30,-34,-35,-33,-37,-36,-49,-58,-68,-79,-95,-102,-113,-118,-102,6,-27,-23,-25,-26,-30,-33,-36, +-24,-12,-2,7,13,19,16,13,12,10,14,5,4,-15,-30,-25,-36,-55,-56,-62,-57,-59,-56,-52,-44, +-28,-30,-31,-53,-45,-40,-43,-42,-41,-39,-40,-36,-34,-32,-30,-27,-22,-24,-24,-24,-25,-24,-23,-41,-29, +21,-56,-39,18,14,10,6,2,-2,-6,-46,-66,13,-34,-50,55,40,66,47,52,45,52,56,57,63, +64,60,61,62,66,59,56,51,51,43,60,30,-18,-109,53,-5,-93,-90,-88,-81,-84,-84,-75,-4,60, +-91,-13,-22,79,65,63,46,59,65,69,82,86,80,88,94,104,84,71,58,49,40,43,-55,12,13, +18,18,36,41,48,35,45,45,42,40,17,29,63,42,54,68,59,33,57,78,86,122,130,105,118, +120,143,105,83,62,44,39,9,-15,-7,-14,33,18,33,16,38,30,16,9,38,18,30,26,52,65, +85,99,87,47,73,84,89,141,153,125,163,204,237,168,113,66,26,1,-17,-58,-26,-55,20,30,47, +37,33,88,81,71,77,52,38,30,77,-35,4,23,7,-22,8,77,220,185,178,215,56,-36,-73,-11, +39,89,116,132,70,6,44,49,29,19,-26,86,91,-8,-15,-62,-74,-17,38,72,16,18,113,96,107, +130,184,160,78,8,-18,-6,96,121,40,34,45,103,67,42,-27,-38,-23,7,14,28,31,-8,-43,-49, +23,61,61,9,-69,-147,-50,-71,-123,-204,-143,47,10,75,205,262,235,142,159,160,164,162,124,68,56, +51,37,37,31,25,16,-4,-4,-11,2,22,-1,-32,-66,-5,7,-24,-45,37,62,166,225,323,263,190, +86,34,48,117,125,124,109,85,64,34,16,-10,-32,-61,-46,-35,-14,-1,-10,1,-5,-19,-11,6,14, +1,26,58,43,-71,-19,113,138,172,242,267,238,217,203,225,165,127,93,56,35,23,17,19,24,-9, +-19,-45,-49,-30,0,20,35,26,37,35,30,43,39,2,23,-42,59,133,132,140,115,103,115,56,21, +4,15,33,48,62,61,41,36,8,-32,-41,-41,-27,-22,-28,-38,-27,-14,14,30,42,49,54,59,34, +43,-45,-27,-10,0,21,36,50,65,63,64,57,46,32,19,19,20,25,15,9,-2,-13,-22,-28,-29, +-33,-32,-42,-34,-49,-55,-70,-74,-80,-90,-103,-67,-39,11,19,31,40,49,58,70,59,49,42,34,27, +20,19,15,12,9,4,10,0,10,12,-5,-8,-3,-5,-6,-17,-12,-18,-29,-19,-21,-11,1,-2,5, +2,8,12,18,23,31,24,21,17,14,11,8,7,7,6,7,6,7,8,-17,-65,9,-21,-78,-77, +-76,-74,-74,-73,-74,-34,-2,-74,-32,5,-53,-7,-72,-42,-49,-45,-59,-63,-64,-56,-53,-55,-51,-49,-44, +-53,-57,-60,-60,-52,-74,-12,40,101,-24,41,100,102,101,90,95,96,98,35,-35,106,52,78,-53,-30, +-29,-28,-66,-82,-84,-72,-65,-66,-51,-43,-34,-61,-75,-88,-84,-85,-74,35,-37,-30,-2,11,-24,-23,-29, +-11,-36,-37,1,-19,9,14,-28,12,-47,-38,-27,-24,-89,-112,-122,-84,-67,-79,-51,-44,-17,-70,-92,-114, +-102,-112,-60,-26,-28,-29,2,24,-10,25,-18,11,-22,2,14,2,9,30,1,54,-16,23,43,40,-60, +-118,-151,-103,-89,-100,-43,0,31,-66,-125,-168,-161,-160,-104,-39,-69,-36,-1,16,28,27,36,62,66,51, +70,27,16,28,18,-38,-145,-199,-202,-203,-217,-176,-66,-72,-45,18,-107,-163,-138,-90,-45,-46,-14,-30,-10, +38,1,36,6,10,-20,78,83,-8,-26,-72,-80,-21,42,65,-4,14,20,31,55,91,132,121,61,-28, +-63,-43,87,118,13,-67,-124,-143,-99,-90,-65,-15,-23,-9,-19,-4,20,-19,-50,-50,18,55,33,-16,-123, +-168,-107,-64,-236,-266,-246,-257,-334,-342,-267,-53,25,-51,-120,-162,-143,-86,-21,32,32,-10,-32,-10,-9,19, +-4,-17,-11,-16,-4,15,-14,-44,-73,8,18,-18,-30,63,98,32,-37,-153,-117,-82,-53,-44,-17,48,54, +55,52,-10,-60,-108,-106,-96,-64,-36,-57,-49,-20,-6,-13,-2,-8,-23,-12,0,-3,-5,-3,62,37,-1, +-134,-239,-202,-167,-63,-18,-13,29,40,51,38,25,9,13,17,4,15,-8,-27,-22,-58,-53,-54,-37,-4, +14,19,17,23,29,28,37,34,27,-24,88,19,16,43,32,-3,-34,-62,-26,-11,-8,-25,-29,-23,-14, +-16,-27,-29,-33,-28,-40,-47,-28,-40,-42,-46,-35,-14,7,26,39,41,57,50,47,24,-73,-82,-85,-67, +-53,-47,-44,-51,-45,-42,-36,-26,-16,-5,-9,-7,-5,-20,-44,-48,-27,-33,-39,-41,-32,-44,-32,-53,-41, +-61,-59,-75,-79,-86,-83,-83,19,-33,-30,-31,-34,-38,-39,-36,-27,-18,-10,-3,3,11,5,0,-5,-9, +-9,-19,6,-26,-31,-26,-29,-49,-57,-58,-46,-63,-67,-57,-53,-31,-30,-42,-37,-66,-54,-56,-54,-51,-49, +-49,-47,-46,-44,-41,-39,-35,-38,-38,-39,-41,-39,-47,-28,0,41,-44,-6,41,38,33,24,24,21,14, +-18,-57,27,-6,-64,39,-20,59,34,37,31,32,33,37,43,45,41,43,44,49,43,41,36,35,29, +51,-27,-68,-97,0,-58,-91,-92,-93,-87,-98,-99,-88,-60,7,-85,-69,-63,51,59,47,34,26,26,35, +51,57,49,61,71,86,69,54,37,24,24,12,-83,-5,-13,3,-1,6,19,12,-16,9,21,17,12, +-12,-1,37,-11,30,68,42,28,12,18,37,75,87,64,78,82,113,82,61,35,18,25,-17,-49,-23, +-14,25,2,15,2,31,-22,-3,-25,19,-8,5,9,17,19,64,111,80,51,13,-1,17,74,92,66, +104,152,202,141,82,24,-16,-19,-49,-84,-16,-46,34,46,44,43,31,61,55,56,71,34,16,43,55, +-123,-44,-11,-32,-42,-29,18,150,146,166,223,93,-2,-47,-19,31,115,123,144,61,-3,61,52,15,3, +-16,76,82,-2,-21,-67,-79,-7,25,34,-63,18,115,159,100,59,133,127,44,2,-26,-26,71,109,60, +24,10,38,12,22,-42,-35,-20,-18,4,16,23,-21,-50,-42,28,54,33,-39,-102,-153,-31,-96,-287,-256, +-161,-44,-68,-47,-22,232,267,110,120,100,92,106,93,58,53,60,3,1,18,15,0,-16,-14,-5,12, +18,-14,-43,-73,7,36,-55,-18,75,134,164,131,160,115,82,40,-29,-35,26,55,71,80,56,39,11, +-3,-13,-42,-70,-51,-36,-13,1,-6,3,-6,-19,-4,8,21,-3,22,61,59,-120,-119,-58,-43,23,105, +153,150,151,146,150,116,95,77,46,28,19,7,3,-8,-46,-40,-50,-51,-28,8,12,23,13,34,28, +22,23,14,-12,-29,-12,51,128,124,135,111,97,91,50,23,7,6,7,11,25,29,25,20,1,-37, +-40,-38,-38,-33,-34,-39,-20,-1,34,48,59,64,71,75,56,56,-73,-46,-16,-9,20,24,29,34,25, +22,13,14,13,10,9,9,14,-1,-3,-25,-44,-41,-40,-38,-43,-41,-48,-34,-56,-48,-65,-61,-74,-92, +-111,-81,-57,-13,0,8,17,26,38,52,49,46,42,36,28,19,16,11,7,2,-1,0,-23,-8,-16, +-27,-36,-32,-31,-37,-50,-38,-38,-50,-40,-42,-36,-18,-43,-9,-14,-7,-2,4,8,16,11,9,7,5, +4,3,2,0,-1,-1,-4,2,-29,-57,-77,-28,-64,-88,-90,-90,-85,-91,-91,-92,-73,-38,-84,-71,-11, +-14,47,-34,-9,-10,-9,-13,-15,-19,-11,-9,-15,-10,-8,-1,-10,-14,-19,-18,-17,-35,42,68,55,36, +72,57,64,63,49,62,64,69,65,24,63,78,82,-4,1,12,10,-2,-9,-20,-5,-5,-17,-3,6, +23,1,-11,-28,-28,-41,-26,37,-6,17,24,33,11,10,12,18,-4,-13,23,5,25,46,9,49,-9, +-11,16,11,-2,-6,-35,9,14,-17,11,19,60,12,-9,-39,-37,-59,-26,7,2,8,31,46,5,36, +-12,5,-32,0,22,6,19,57,29,75,15,38,76,67,48,25,-33,21,16,-30,23,73,133,59,4, +-55,-68,-104,-74,-30,-51,-4,25,32,22,34,32,20,40,28,54,10,17,50,42,-7,-71,-143,-129,-124, +-111,-66,44,12,23,74,-49,-131,-145,-102,-46,-26,35,47,80,90,36,57,4,6,-6,63,71,-3,-18, +-62,-62,2,56,63,10,88,63,43,50,28,159,179,86,11,-47,-58,64,119,83,-5,-45,-36,-20,-32, +-28,8,-5,-8,-20,-10,16,-29,-53,-38,20,47,10,-47,-127,-135,-39,-90,-355,-263,-154,-75,-99,-125,-173, +57,107,-26,-40,-61,-45,-20,11,25,32,-6,-15,9,2,32,3,-16,-19,-6,9,13,-20,-43,-61,35, +43,-34,-13,119,193,166,126,71,49,30,-31,-15,-3,49,74,82,82,41,8,-39,-49,-64,-51,-31,-45, +-35,-10,3,-3,-4,-5,-17,-2,3,2,-1,9,61,59,-15,-58,-111,-82,-49,50,89,73,104,115,142, +117,98,83,50,29,3,7,-15,-31,-22,-52,-54,-50,-31,8,10,9,20,30,38,42,32,27,24,7, +114,97,91,101,82,42,13,2,-2,-9,-18,-18,-12,-3,9,7,-12,-19,-30,-34,-34,-33,-10,-29,-38, +-40,-20,7,24,47,61,64,76,84,85,88,-41,-58,-59,-33,-12,-4,-4,-10,-13,-13,-15,-14,-13,-11, +-15,-15,-14,-22,-40,-37,-22,-35,-43,-44,-38,-49,-36,-47,-30,-46,-39,-46,-50,-56,-57,-55,-4,-29,-26, +-21,-21,-20,-13,-3,-3,-3,-3,-3,-2,2,-4,-11,-18,-22,-27,-32,-4,-27,-22,-25,-22,-32,-41,-39, +-33,-51,-61,-56,-52,-37,-31,-41,-15,-54,-44,-42,-38,-33,-31,-28,-31,-31,-30,-30,-30,-29,-32,-32,-34, +-35,-35,-46,-9,9,10,-18,8,8,8,4,-4,-1,-2,-8,-7,-30,-5,1,-46,-5,-54,6,-2,-3, +-3,-13,-15,-13,-5,-2,-6,-2,-1,5,-1,-3,-8,-9,-9,0,-57,-58,-11,-41,-54,-16,-20,-23,-24, +-34,-35,-26,-60,-43,-7,-59,-39,-7,20,10,8,-25,-35,-29,-11,-5,-13,2,14,29,15,0,-18,-28, +-23,-38,-55,-25,-30,-7,-9,-24,-11,-28,-50,-36,-20,-7,-20,-24,-13,-7,-41,-16,28,8,13,-46,-63, +-53,-10,6,-15,6,13,43,16,-3,-30,-37,-30,-48,-59,-30,-9,13,1,-7,-1,3,-53,-31,-45,1, +-27,-15,10,-16,-9,15,80,62,61,-40,-87,-87,-28,-10,-35,10,57,109,57,0,-60,-86,-77,-90,-83, +-21,-16,37,47,34,42,28,19,22,26,53,6,-7,53,18,-152,-106,-103,-117,-99,-112,-89,12,38,87, +155,58,-28,-59,-61,-13,72,78,95,50,24,55,43,-5,-11,0,54,60,1,-20,-59,-68,-3,16,12, +-101,40,83,137,52,-1,93,109,37,-4,-47,-65,32,87,77,-5,-55,-66,-64,-28,-45,-13,-10,-34,-13, +-5,14,-29,-50,-32,20,37,5,-69,-129,-150,-16,-134,-402,-253,-158,-174,-211,-233,-266,91,184,20,0,-44, +-48,-14,19,34,35,35,-27,-25,2,9,-13,-23,-23,-1,17,11,-23,-45,-61,20,47,-76,-25,127,199, +117,-11,-86,-93,-67,-25,-72,-87,-56,-4,26,48,15,-11,-36,-46,-39,-52,-60,-49,-32,-12,1,-1,-1, +-11,-15,2,8,16,2,13,50,78,-105,-175,-227,-211,-140,-66,-11,17,49,61,50,49,44,41,28,18, +8,-5,-21,-47,-67,-62,-57,-50,-29,7,2,7,3,21,19,18,5,-3,-7,-62,52,36,75,75,80, +62,49,26,25,17,9,-7,-22,-28,-19,-14,-10,-11,-14,-29,-31,-33,-41,-43,-40,-37,-12,12,42,54, +62,61,69,68,64,53,-84,-65,-40,-32,-7,-10,-13,-20,-28,-31,-33,-22,-11,-2,-6,-8,-7,-21,-26, +-47,-58,-52,-50,-47,-48,-48,-47,-38,-50,-39,-47,-42,-57,-77,-93,-80,-48,-44,-33,-32,-28,-23,-13,-3, +3,9,11,12,9,7,1,-4,-9,-13,-13,-19,-35,-32,-45,-45,-55,-59,-58,-67,-73,-68,-66,-72,-64, +-58,-57,-47,-68,-41,-40,-37,-33,-29,-26,-23,-23,-23,-21,-20,-19,-17,-19,-20,-22,-24,-26,-23,-55,-64, +-43,-59,-71,-48,-52,-54,-53,-60,-61,-64,-78,-69,-49,-73,-39,34,58,28,31,35,33,36,37,33,42, +42,34,39,40,47,41,38,33,32,26,25,54,37,-30,63,45,-26,-19,-20,-28,-20,-17,-7,39,58, +-19,41,28,50,43,54,48,56,58,46,63,61,42,54,64,83,71,61,43,34,17,24,-4,18,43, +36,36,33,34,37,23,18,13,34,22,21,52,42,46,31,37,57,48,69,80,53,100,99,59,81, +87,128,98,81,49,34,13,4,10,17,32,48,44,18,26,2,-16,-35,-18,24,-1,16,59,39,56, +51,70,99,88,116,122,73,130,119,55,96,146,217,182,135,70,27,-24,-40,-41,-18,21,52,48,24, +40,23,-14,8,5,38,-5,9,68,53,-32,-6,-52,-37,-23,0,40,142,119,131,171,64,-40,-103,-83, +-27,37,98,137,146,102,71,60,-1,-4,11,43,50,1,-7,-42,-39,19,49,42,-14,131,114,74,37, +-27,157,200,95,39,-32,-77,21,94,134,59,39,71,47,30,9,17,10,-10,-11,-8,12,-32,-46,-25, +18,33,-4,-72,-117,-103,39,-157,-404,-200,-39,70,73,52,-32,170,194,45,70,63,67,61,52,26,33, +20,13,25,19,32,5,-14,-24,4,20,11,-21,-36,-36,42,46,-60,-45,167,248,242,212,230,162,109, +10,1,-9,15,66,90,95,82,68,38,15,-17,-33,-37,-31,-17,-1,8,7,-4,-6,-10,6,7,13, +11,26,49,91,-61,-14,15,32,64,134,162,144,158,168,194,163,140,127,70,33,6,-6,-22,-32,-35, +-45,-55,-43,-24,12,4,3,16,27,34,41,16,10,5,12,82,128,142,131,120,96,83,89,43,12, +-5,3,11,16,29,28,8,1,-13,-30,-24,-20,-9,-22,-31,-28,0,26,42,60,69,69,76,92,92, +111,-23,-29,-19,3,25,32,32,33,24,23,17,10,2,-5,-10,-13,-15,-18,-23,-22,-25,-38,-45,-43, +-43,-46,-41,-34,-26,-27,-22,-16,-24,-34,-44,-33,-46,-29,-23,-14,-9,0,12,27,19,11,4,-2,-6, +-8,-12,-17,-23,-26,-33,-31,-22,-23,-16,-26,-23,-20,-26,-26,-32,-40,-51,-56,-52,-48,-40,-38,-12,-29, +-26,-20,-16,-11,-8,-3,-8,-9,-10,-11,-13,-15,-17,-18,-20,-21,-22,-28,-6,-11,-45,-4,-9,-50,-50, +-51,-53,-51,-50,-53,-23,-14,-56,-22,-19,-35,-38,-43,-27,-31,-26,-41,-45,-46,-37,-34,-39,-34,-32,-27, +-32,-34,-38,-39,-35,-45,-38,-2,74,-39,-3,62,61,56,46,45,45,52,-12,-50,73,0,20,-44,-13, +-13,-6,-46,-61,-65,-48,-43,-54,-38,-27,-13,-24,-35,-51,-57,-57,-63,1,-28,-19,0,3,-29,-25,-41, +-47,-56,-47,-13,-34,-15,4,-32,-32,-43,-13,-9,8,-61,-89,-101,-57,-42,-63,-37,-30,-1,-25,-40,-66, +-67,-72,-55,-37,-20,7,10,16,-17,5,-27,-54,-55,-46,-5,-30,-18,30,-25,-7,-19,40,54,75,-35, +-91,-125,-73,-66,-95,-51,-8,43,7,-39,-94,-111,-114,-103,-57,-29,25,39,42,22,33,20,-25,-12,-10, +30,-23,-21,63,-7,-116,-128,-172,-166,-131,-160,-152,-88,-45,18,81,23,-52,-85,-101,-63,-3,23,39,57, +74,42,29,-24,-20,18,29,33,-1,-13,-40,-39,9,23,7,-87,90,56,63,-8,-53,78,119,58,3, +-63,-107,-9,62,94,-12,-81,-113,-94,-59,-23,18,6,-31,-23,-23,3,-34,-42,-23,9,19,-19,-89,-142, +-123,13,-196,-437,-191,-95,-211,-256,-307,-353,-51,62,-42,-97,-149,-144,-107,-44,8,15,4,-29,-20,-5,10, +-17,-24,-29,2,17,6,-26,-37,-30,27,35,-70,-82,179,235,80,-78,-210,-193,-141,-73,-79,-91,-84,-25, +10,31,-2,-34,-57,-68,-60,-51,-36,-37,-21,-6,1,4,-5,-13,-10,4,4,9,16,13,41,100,-57, +-150,-267,-249,-203,-142,-97,-64,-10,17,10,24,25,29,20,11,-4,-16,-43,-71,-66,-72,-62,-43,-27,1, +-5,-6,-2,7,13,21,-4,-10,3,-61,109,42,28,35,31,21,11,-12,11,14,13,-8,-28,-40,-35, +-34,-36,-35,-27,-18,-21,-25,-32,-42,-38,-28,0,25,41,50,53,48,58,57,66,52,-62,-63,-53,-42, +-28,-34,-42,-53,-54,-53,-46,-35,-22,-10,-18,-24,-28,-37,-47,-55,-52,-51,-52,-49,-44,-48,-38,-37,-31, +-24,-17,-13,-25,-40,-48,-53,-33,-66,-60,-63,-63,-62,-57,-53,-43,-35,-29,-23,-18,-12,-18,-22,-26,-29, +-28,-37,-32,-46,-55,-49,-54,-65,-68,-74,-73,-80,-82,-80,-77,-65,-66,-68,-64,-65,-58,-58,-55,-54,-54, +-55,-51,-49,-45,-42,-39,-35,-38,-39,-41,-44,-45,-48,-55,-41,-1,-63,-45,1,-3,-7,-11,-15,-18,-23, +-52,-71,-10,-46,-58,52,24,61,46,52,48,52,54,52,60,60,53,57,58,63,60,58,54,51,43, +57,21,-18,-77,42,-10,-76,-74,-75,-76,-79,-77,-64,-15,43,-67,-21,-35,64,61,65,60,67,70,65, +82,81,62,72,82,100,98,90,74,56,44,36,-47,21,35,28,21,27,31,28,-1,11,16,24,15, +0,32,44,9,40,66,68,63,78,87,75,118,120,86,100,104,136,127,114,87,60,49,8,-10,11, +36,44,24,16,3,7,-43,-39,-43,15,-16,0,42,21,11,59,91,98,93,108,115,93,143,137,83, +106,150,217,218,182,123,62,20,-27,-58,9,35,66,57,29,38,11,-35,-25,-17,22,-22,-9,75,39, +-91,5,-1,7,25,36,58,133,154,190,227,169,63,-43,-54,-16,77,119,168,147,79,81,39,-16,-20, +24,22,24,-1,-2,-22,-15,30,32,8,-63,140,132,91,9,-75,114,165,81,46,-29,-102,-27,52,138, +87,72,101,53,51,27,19,18,-15,0,-6,3,-32,-35,-15,11,14,-19,-95,-111,-79,94,-244,-405,-122, +41,80,95,82,15,175,205,104,115,99,93,75,54,22,28,44,30,26,28,18,-3,-15,-28,10,23, +7,-19,-26,-9,23,26,-68,-120,196,241,209,161,201,132,87,23,-15,-40,-35,26,63,75,82,78,71, +40,12,-19,-42,-18,0,5,9,11,-4,-9,-5,6,8,23,29,42,41,123,-103,-29,37,44,74,112, +135,132,142,154,165,144,125,116,62,25,5,-22,-33,-41,-57,-46,-57,-36,-18,6,-4,-3,1,14,18, +29,-4,-10,-17,-16,36,101,129,113,119,117,124,138,80,41,22,26,26,20,27,27,13,10,0,-21, +-17,-16,-21,-23,-24,-15,17,37,51,58,59,56,59,73,71,88,-18,-9,12,20,35,36,36,40,32, +33,30,21,12,4,-3,-11,-16,-17,-13,-20,-37,-42,-45,-41,-44,-39,-41,-18,-23,-5,-4,13,1,-14, +-31,-17,-79,-37,-29,-21,-12,-1,12,24,16,7,0,-6,-11,-16,-18,-20,-23,-25,-30,-26,-39,-23,-22, +-32,-34,-25,-26,-30,-45,-40,-47,-60,-54,-60,-54,-40,-28,-14,-17,-11,-8,-5,-3,3,0,-1,-2,-3, +-5,-7,-8,-10,-11,-12,-15,-14,-21,-43,-79,-14,-42,-85,-86,-85,-81,-84,-83,-83,-51,-21,-85,-54,-7, +-28,10,-47,-21,-23,-17,-28,-32,-36,-28,-26,-31,-26,-24,-20,-23,-25,-28,-31,-28,-47,10,50,92,1, +49,81,84,80,65,73,75,82,40,-13,92,55,61,-33,-14,-3,7,-19,-30,-43,-30,-30,-42,-30,-21, +-7,-12,-19,-31,-38,-48,-44,40,-10,14,18,22,-9,-13,-22,-17,-42,-43,-1,-23,5,32,-21,4,-31, +-19,7,24,-17,-38,-70,-31,-23,-44,-21,-13,14,-3,-15,-37,-44,-63,-35,-2,3,27,20,34,-13,12, +-41,-39,-66,-39,1,-21,-9,51,-9,13,-18,21,63,90,32,-5,-65,-28,-35,-71,-40,-1,52,41,10, +-35,-62,-94,-78,-24,-24,57,45,38,14,22,7,-56,-42,-41,9,-44,-25,68,-7,-53,-89,-157,-135,-105, +-127,-126,-92,-47,15,60,44,-26,-97,-111,-86,-55,-3,20,81,108,32,14,-38,-26,31,9,7,-7,-6, +-17,0,29,38,11,-47,148,49,-6,-49,-95,75,134,85,25,-62,-137,-44,36,104,19,-39,-64,-56,-45, +14,42,23,-14,-18,-27,-7,-34,-30,-14,1,1,-40,-102,-138,-76,59,-265,-411,-109,0,-123,-136,-190,-257, +-102,-10,-24,-96,-144,-132,-114,-62,-11,4,-9,-3,8,2,11,-15,-20,-31,4,15,3,-21,-23,3,16, +7,-39,-158,211,221,74,-32,-127,-128,-101,-69,-46,-54,-59,-10,23,34,15,-11,-25,-45,-50,-35,-12,-17, +-2,3,4,7,-8,-11,-6,2,1,10,36,27,43,127,-22,-66,-155,-139,-130,-86,-63,-46,5,38,45, +55,49,47,29,11,-12,-27,-54,-72,-55,-68,-63,-34,-21,-5,-8,-14,-6,-4,11,27,-5,-8,4,-37, +120,59,17,28,24,21,19,15,28,26,23,9,-3,-17,-16,-22,-37,-35,-28,-11,-14,-19,-19,-32,-29, +-14,13,36,36,42,40,34,43,47,61,56,-16,-32,-34,-23,-23,-26,-33,-40,-37,-31,-20,-19,-16,-11, +-22,-30,-39,-40,-50,-45,-35,-42,-47,-44,-36,-41,-26,-25,-5,1,18,25,17,9,7,-7,-28,-64,-64, +-66,-67,-66,-65,-65,-59,-55,-51,-44,-37,-27,-31,-33,-37,-39,-40,-47,-27,-46,-46,-41,-40,-50,-56,-58, +-54,-69,-75,-71,-71,-59,-60,-67,-39,-63,-55,-56,-55,-56,-57,-58,-55,-51,-48,-45,-44,-40,-43,-44,-45, +-47,-48,-56,-36,-13,12,-42,-12,16,14,10,4,5,3,-2,-19,-47,2,-16,-55,32,-20,45,29,33, +32,29,29,29,35,37,33,35,36,39,39,38,35,31,25,40,-22,-47,-50,-2,-43,-56,-59,-62,-60, +-70,-69,-57,-48,-2,-46,-53,-55,33,45,43,45,34,31,31,45,46,35,42,52,66,71,65,52,32, +26,10,-53,7,11,13,3,1,7,-6,-31,-19,-6,2,-8,-19,6,17,-30,17,57,48,56,36,30, +29,60,69,53,61,65,84,90,82,62,33,30,-11,-30,-2,25,25,5,-1,-17,-8,-62,-49,-62,0, +-31,-19,22,-8,-29,33,81,78,92,55,40,33,66,69,43,53,89,140,163,139,93,31,9,-37,-57, +20,44,63,53,28,25,-4,-47,-53,-40,6,-40,-30,68,8,-127,-28,-12,-12,1,-11,-12,23,92,159, +197,202,115,-14,-44,-29,54,75,115,92,44,54,4,-39,-36,34,4,-2,-9,-6,-6,12,38,19,-18, +-97,128,100,72,-28,-112,44,98,59,37,-39,-129,-68,7,102,77,52,50,7,26,29,21,23,-16,7, +-7,-8,-29,-22,-10,4,-5,-41,-114,-115,-60,109,-311,-378,-69,57,-11,7,-15,-72,54,123,116,70,27, +17,8,7,3,15,45,27,14,21,-3,-16,-19,-29,8,17,3,-16,-17,10,-11,-5,-45,-192,200,177, +92,21,40,-11,-19,3,-38,-67,-79,-23,19,37,46,44,53,23,10,-14,-34,-7,12,8,5,7,-4, +-12,-4,2,5,31,44,48,47,149,-106,-68,-31,-33,-11,4,25,47,65,86,83,82,71,64,37,12, +-4,-37,-47,-55,-75,-55,-59,-29,-13,-4,-10,-10,-16,-5,2,15,-17,-23,-31,-55,14,38,58,54,76, +93,112,125,92,64,50,43,31,12,11,7,-1,2,0,-13,-16,-19,-36,-29,-19,-4,25,39,47,44, +37,33,35,39,40,42,-14,3,25,19,22,16,13,17,14,17,20,14,9,4,-5,-14,-22,-23,-17, +-29,-47,-44,-44,-37,-39,-32,-31,-4,-10,18,19,40,26,10,-8,0,-79,-47,-42,-39,-32,-24,-17,-13, +-14,-17,-18,-19,-20,-21,-22,-23,-23,-26,-27,-27,-47,-31,-38,-41,-47,-42,-39,-46,-59,-50,-49,-61,-55, +-61,-61,-45,-50,-19,-24,-21,-20,-20,-19,-17,-16,-15,-14,-13,-13,-13,-14,-16,-17,-18,-21,-17,-43,-62, +-70,-39,-64,-74,-77,-76,-71,-76,-76,-75,-64,-40,-72,-68,-19,7,48,-9,9,10,15,12,10,4,10, +11,7,10,12,15,14,12,10,6,4,-9,47,60,40,43,61,34,39,38,27,35,38,47,54,32, +44,63,53,11,12,29,37,34,30,13,23,19,8,14,21,34,37,35,25,13,-5,2,37,16,42, +34,34,16,9,8,11,-12,-19,15,-1,16,48,10,31,5,9,41,52,52,47,10,37,39,23,35, +41,62,59,53,35,13,-13,-4,22,23,40,33,39,-3,7,-35,-26,-63,-36,7,-13,0,57,14,24, +11,29,79,104,109,102,41,61,46,13,24,58,107,128,114,76,27,-27,-32,-3,0,70,54,38,11, +10,-11,-66,-65,-62,-9,-55,-25,64,7,-10,-17,-65,-41,-39,-41,-40,-27,18,69,91,111,38,-85,-90, +-79,-59,4,34,92,94,20,-4,-48,-32,39,-4,-12,-14,-5,4,40,51,49,12,-15,176,58,-31,-63, +-123,58,127,93,50,-45,-146,-74,5,99,73,49,39,18,5,50,49,35,5,1,-17,-16,-30,-18,-9, +-1,-12,-57,-116,-121,-30,105,-314,-354,-53,73,32,56,10,-77,-67,-6,64,-9,-49,-43,-55,-41,-23,-1, +0,29,35,14,6,-12,-15,-29,5,11,2,-13,-10,22,-10,-20,2,-214,207,153,78,59,74,17,-5, +-24,-2,-12,-25,12,41,43,47,40,37,9,-15,-11,1,5,18,13,6,5,-7,-9,-3,0,1,23, +50,45,61,150,-20,19,19,22,5,26,33,33,59,88,111,105,88,76,44,13,-16,-36,-54,-57,-47, +-55,-57,-24,-12,-8,-9,-16,-12,-9,8,29,-3,-6,-10,-16,75,63,28,37,44,55,67,87,70,52, +43,41,40,27,22,10,-15,-15,-17,-12,-15,-18,-13,-19,-15,1,25,40,31,33,27,23,28,37,47, +54,31,17,15,19,12,10,7,8,11,18,25,12,0,-9,-18,-26,-36,-31,-36,-27,-21,-31,-39,-33, +-27,-28,-14,-3,20,28,45,57,52,48,46,36,-36,-44,-47,-45,-44,-41,-40,-41,-43,-47,-47,-45,-39, +-32,-34,-35,-37,-39,-42,-44,-27,-37,-31,-32,-28,-31,-35,-33,-32,-43,-50,-49,-48,-44,-43,-46,-15,-40, +-36,-36,-37,-37,-38,-38,-37,-35,-34,-33,-33,-32,-34,-35,-36,-37,-37,-45,-17,-6,-13,-19,-3,-12,-12, +-13,-16,-13,-12,-14,-5,-18,-20,-7,-36,-4,-38,0,-1,-1,4,-7,-10,-11,-6,-4,-4,-2,-2,0, +1,1,0,-5,-6,-4,-37,-29,21,-31,-31,8,4,0,-1,-10,-9,0,-37,-35,19,-33,-24,-12,11, +10,21,-6,-16,-19,-10,-7,-9,-4,4,12,21,17,8,-9,-10,-25,-18,-6,-6,4,-2,-22,-19,-35, +-45,-46,-35,-16,-28,-23,-5,-16,-40,-15,22,20,42,-8,-30,-36,-18,-5,0,4,9,15,28,24,12, +-12,-16,-31,-30,-7,14,8,1,-22,-23,-32,-61,-62,-66,-14,-36,-27,13,-26,-38,-2,46,55,92,15, +-23,-39,-26,-19,-16,-14,13,43,76,64,34,-15,-27,-47,-31,17,51,51,40,17,5,-19,-53,-76,-64, +-12,-57,-44,50,-21,-102,-60,-47,-50,-56,-81,-99,-106,-11,70,103,158,98,-29,-59,-65,-21,-6,13,15, +15,3,-32,-60,-45,40,-9,-20,-17,-12,7,44,49,24,-21,-83,115,42,18,-65,-130,-18,39,45,30, +-46,-146,-96,-29,53,54,22,-19,-36,-11,30,31,28,-9,9,-11,-21,-26,-12,-7,1,-19,-64,-131,-124, +-38,96,-333,-334,-59,25,-81,-86,-136,-189,-115,-8,95,-14,-83,-92,-87,-60,-25,-5,20,8,2,5,-19, +-29,-22,-28,3,8,1,-11,-11,15,-39,-32,-2,-230,180,85,-22,-93,-102,-134,-111,-31,-48,-69,-88,-49, +-13,2,7,4,15,-8,-8,-12,-12,4,20,12,2,-1,-5,-10,-1,0,4,36,50,43,69,157,-67, +-78,-100,-108,-106,-101,-80,-45,-14,16,12,27,24,18,15,1,-17,-44,-57,-67,-77,-64,-55,-23,-10,-13, +-14,-16,-26,-18,-8,6,-17,-23,-33,-74,18,-18,-27,-12,17,48,71,78,82,77,73,56,36,11,0, +-10,-18,-13,-10,-10,-19,-25,-39,-30,-14,4,26,34,31,24,16,10,13,10,15,2,5,16,29,18, +10,-3,-8,-9,-6,-2,6,1,-2,-5,-13,-21,-29,-31,-30,-38,-45,-40,-40,-30,-27,-20,-12,8,14, +36,42,58,46,35,26,21,-50,-50,-50,-53,-50,-49,-49,-54,-49,-45,-40,-34,-29,-25,-26,-26,-26,-28, +-27,-32,-44,-41,-50,-47,-54,-58,-53,-58,-60,-55,-49,-51,-48,-49,-52,-45,-56,-35,-36,-37,-39,-41,-42, +-43,-39,-36,-34,-32,-30,-28,-29,-30,-31,-33,-34,-32,-54,-56,-35,-56,-60,-35,-37,-37,-34,-38,-38,-37, +-52,-51,-33,-55,-40,39,47,37,35,40,41,44,44,40,43,43,42,43,43,45,46,46,44,39,33, +33,45,26,-28,52,29,-31,-27,-28,-30,-28,-26,-16,25,49,-22,25,8,48,40,53,58,69,70,57, +62,59,53,53,59,68,80,81,73,55,37,37,4,31,47,34,28,25,21,22,14,6,2,16,11, +10,37,33,29,36,44,65,73,93,98,70,84,84,82,81,84,95,109,107,93,59,37,16,20,27, +36,34,27,-2,-8,-24,-28,-55,-43,2,-12,0,39,22,14,38,46,83,107,142,150,107,113,103,89, +81,107,144,192,191,161,95,40,8,3,28,61,58,39,8,-2,-28,-60,-82,-75,-25,-58,-27,46,14, +0,41,45,52,19,34,32,27,78,121,127,174,105,-53,-58,-61,-39,12,43,60,34,1,-27,-55,-38, +43,-10,-22,-18,-6,21,72,70,52,8,-3,157,62,-19,-61,-131,15,83,77,65,-20,-136,-98,-30,69, +111,122,119,74,55,72,43,38,16,21,-3,-24,-24,-8,-5,3,-19,-69,-132,-106,3,127,-322,-281,-40, +85,155,178,133,45,-22,21,154,86,47,36,5,-17,-31,-5,14,38,39,18,-7,-17,-15,-24,4,7, +1,-6,-5,21,-37,-37,23,-230,168,58,68,112,220,128,72,16,18,3,-8,15,39,36,64,79,87, +55,25,9,5,21,32,20,7,-1,-5,-6,0,0,5,40,51,53,83,158,-40,55,132,118,88,90, +91,86,89,111,137,123,104,86,49,12,-17,-42,-49,-42,-49,-43,-46,-16,-4,-7,-10,-15,-17,-11,3, +19,-2,-8,-31,-15,2,34,25,33,58,87,112,144,107,83,73,76,77,61,53,38,10,9,-4,-17, +-21,-20,-17,-10,-3,13,31,36,24,23,17,14,15,24,26,35,59,59,64,61,52,48,47,54,53, +57,57,35,14,-5,-12,-19,-26,-21,-18,-13,-18,-25,-30,-21,-17,-10,-2,21,35,48,57,72,68,65, +60,61,-47,-22,-25,-20,-15,-10,-8,-8,-16,-24,-28,-30,-29,-27,-27,-27,-29,-30,-35,-33,-33,-27,-22, +-29,-28,-25,-23,-19,-23,-21,-22,-24,-23,-29,-26,-21,-8,-12,-14,-12,-14,-14,-14,-11,-13,-13,-15,-15, +-17,-19,-20,-20,-21,-21,-22,-24,-13,-21,-51,-10,-20,-55,-53,-51,-48,-45,-42,-40,-14,-2,-50,-20,-16, +-25,-17,-33,-17,-19,-12,-24,-28,-32,-29,-27,-24,-23,-23,-22,-20,-20,-21,-26,-23,-35,-16,15,73,-23, +11,59,58,54,48,47,48,52,5,-32,69,16,26,-34,-13,-7,10,-17,-30,-40,-37,-34,-30,-28,-22, +-19,-8,-9,-15,-26,-31,-36,27,-6,-3,7,6,-26,-27,-38,-32,-50,-47,-22,-31,-11,1,-28,-17,-25, +-8,7,35,-13,-39,-63,-55,-43,-24,-22,-18,-19,-5,-5,-14,-32,-44,-31,-9,0,8,3,10,-34,-19, +-51,-47,-69,-55,-23,-28,-20,15,-21,-20,-23,8,41,92,26,-18,-60,-62,-58,-35,-40,-21,-6,31,31, +13,-23,-41,-36,7,13,53,38,26,-2,-15,-32,-56,-91,-85,-34,-66,-44,25,-32,-24,-47,-47,-50,-87, +-102,-125,-162,-76,-6,15,92,58,-60,-80,-98,-104,-76,-74,-43,-6,-45,-56,-71,-45,43,-15,-27,-19,-12, +21,75,66,44,-2,-24,104,-7,-45,-88,-128,-54,9,47,38,-35,-141,-109,-54,11,43,23,-35,-32,-18, +44,43,31,7,11,-12,-31,-23,-5,-4,2,-25,-81,-143,-125,-8,77,-299,-262,-67,-7,-50,-81,-159,-225, +-224,-112,71,-59,-132,-145,-136,-100,-51,-22,-14,-11,-2,-10,-26,-35,-24,-22,0,3,0,-6,-7,8,-49, +-43,24,-224,139,5,-64,-95,-107,-125,-105,-52,-34,-42,-55,-43,-19,-15,-7,-5,-1,-16,-14,-4,15,16, +26,15,0,-9,-6,-6,3,1,5,35,41,32,89,146,-11,-37,-88,-101,-128,-126,-112,-83,-47,-13,-5, +14,14,7,10,-3,-27,-43,-58,-66,-63,-61,-44,-15,-5,-14,-13,-19,-22,-19,-8,3,-7,-13,-25,-60, +24,-44,-79,-51,-22,13,34,38,69,81,87,68,49,24,11,-5,-22,-21,-21,-15,-24,-28,-30,-22,-6, +12,22,25,11,8,2,-4,1,-5,3,-16,38,36,36,29,14,1,-5,-10,-5,-3,5,-4,-9,-14, +-21,-27,-35,-35,-38,-37,-31,-30,-32,-21,-11,-4,10,21,39,48,58,65,61,59,60,47,-15,-39,-43, +-48,-49,-52,-58,-66,-60,-55,-49,-41,-33,-26,-27,-28,-29,-30,-30,-37,-33,-44,-49,-44,-48,-59,-55,-54, +-46,-47,-41,-32,-33,-28,-32,-35,-39,-40,-38,-42,-44,-47,-48,-51,-47,-45,-44,-42,-40,-37,-39,-39,-40, +-41,-41,-43,-44,-31,-2,-51,-34,-1,0,0,-1,0,1,2,-22,-40,3,-23,-50,42,14,52,38,43, +43,46,46,43,44,45,47,46,46,46,49,49,48,43,36,47,12,-18,-56,26,-16,-60,-60,-61,-58, +-63,-62,-54,-18,28,-53,-22,-34,48,44,49,56,63,63,54,58,58,61,57,62,66,83,85,78,59, +48,39,-25,26,26,21,11,9,12,10,-6,0,3,0,5,-6,7,28,4,39,56,60,72,83,84, +67,71,75,92,81,83,81,107,108,97,62,52,14,1,16,18,22,7,-13,-25,-21,-44,-51,-53,-15, +-18,-7,9,11,-13,38,48,65,96,115,115,90,87,90,109,87,104,124,183,189,168,103,68,25,3, +44,40,52,35,-1,-15,-40,-48,-92,-82,-42,-56,-32,18,3,-6,60,109,94,30,50,42,19,77,118, +122,187,135,-22,-38,-56,-36,-7,14,-10,-40,-28,-53,-60,-41,42,-12,-23,-14,-5,33,90,82,51,5, +-1,101,42,-4,-59,-124,-46,15,47,66,3,-114,-114,-66,20,108,139,126,82,73,73,32,32,18,31, +6,-29,-19,-1,-2,5,-25,-77,-146,-98,21,113,-278,-201,-55,44,175,169,120,44,-33,15,182,119,74, +41,12,-18,-40,-14,15,16,17,7,-25,-27,-20,-17,2,3,-1,-2,-5,3,-50,-39,10,-208,108,-20, +37,89,208,137,84,25,8,-10,-15,-8,13,12,51,78,90,67,47,20,7,27,37,21,4,-8,-5, +-3,4,2,9,43,34,41,92,139,-50,37,125,100,68,55,58,61,60,78,98,90,80,64,37,6, +-18,-42,-43,-38,-56,-36,-32,-8,2,-7,-10,-13,-18,-11,-5,2,-3,-10,-40,-29,-54,-20,-10,1,41, +81,111,139,114,101,97,96,90,70,60,45,22,17,-1,-24,-28,-25,-26,-7,5,19,28,24,14,11, +7,4,3,6,1,0,63,76,87,77,70,62,61,67,63,61,56,35,15,-5,-9,-14,-19,-16,-7, +-10,-23,-23,-24,-10,-6,9,11,39,41,56,56,70,66,64,56,64,-44,-7,-7,-4,2,7,8,7, +-1,-8,-11,-16,-17,-21,-20,-20,-20,-22,-26,-23,-39,-24,-25,-33,-37,-32,-24,-22,-27,-14,-8,-10,-9, +-17,-16,-4,-15,4,-3,-1,-2,-3,-2,0,-2,-4,-6,-8,-10,-12,-12,-13,-13,-13,-14,-11,-23,-41, +-67,-18,-42,-74,-70,-66,-59,-59,-55,-50,-29,-5,-57,-36,-9,-16,20,-29,-10,-11,-3,-10,-14,-20,-18, +-17,-13,-13,-13,-13,-11,-11,-12,-16,-14,-30,20,47,67,9,43,57,60,58,49,55,57,58,39,0, +65,50,51,-19,-12,1,18,7,-3,-21,-20,-19,-10,-14,-11,-9,3,6,1,-7,-17,-14,49,7,15, +17,17,-12,-15,-17,-8,-29,-35,-16,-16,5,12,-14,17,-8,-10,17,41,24,6,-34,-31,-25,3,-2, +2,-2,13,14,5,-11,-30,-11,16,13,9,7,19,-34,-13,-54,-35,-67,-40,-26,-13,-5,17,-1,3, +-16,-11,39,90,74,46,-19,-27,-25,7,-8,4,13,55,64,51,20,-11,-2,37,16,45,30,17,-21, +-29,-41,-55,-95,-93,-56,-64,-35,0,-24,59,12,10,4,-63,-56,-71,-116,-66,-26,-19,56,35,-74,-85, +-110,-147,-105,-105,-68,-27,-73,-69,-66,-36,41,-13,-21,-10,-3,38,99,84,67,26,43,88,-26,-80,-89, +-115,-66,-3,52,55,-7,-115,-112,-72,-11,52,62,18,23,15,64,48,31,23,16,-7,-32,-20,0,-2, +0,-29,-86,-144,-112,26,65,-229,-175,-78,-15,70,26,-53,-126,-212,-138,68,-27,-82,-110,-111,-95,-64,-33, +-36,-22,-1,-17,-25,-34,-22,-15,1,2,-1,0,-4,-7,-38,-37,14,-186,83,-30,-17,5,17,7,-5, +-36,-4,-7,-8,-17,-6,-11,10,21,18,9,4,11,33,27,32,18,1,-12,-7,-1,4,2,7,27, +21,18,89,108,27,29,3,-12,-63,-66,-65,-56,-28,0,26,35,34,26,18,0,-28,-36,-49,-53,-42, +-44,-26,-6,0,-9,-10,-15,-11,-12,-4,1,5,0,-14,-24,7,-44,-82,-53,-29,1,18,31,62,80, +90,81,70,50,37,18,-8,-16,-25,-24,-29,-29,-16,-7,3,18,17,14,-3,-2,-3,-7,-4,-7,-3, +-18,67,56,47,46,34,26,22,19,20,18,19,4,-8,-19,-23,-27,-33,-29,-33,-25,-13,-18,-23,-9, +4,14,28,34,56,53,62,63,65,71,77,66,7,-13,-18,-21,-24,-28,-35,-42,-42,-41,-39,-36,-32, +-27,-27,-28,-30,-32,-34,-39,-25,-38,-36,-34,-35,-43,-41,-35,-25,-28,-23,-12,-13,-7,-9,-14,-11,-28, +-26,-29,-32,-34,-35,-37,-36,-36,-37,-36,-37,-36,-37,-37,-37,-38,-37,-41,-24,-8,4,-29,-8,5,8, +8,7,12,14,15,5,-15,12,5,-42,18,-19,30,18,20,23,20,18,15,16,18,24,21,20,19, +24,24,23,19,15,25,-21,-36,-29,-11,-36,-37,-39,-41,-38,-46,-45,-41,-37,-8,-29,-40,-40,17,23, +23,34,28,23,14,17,21,34,27,30,30,48,50,44,30,27,14,-24,10,-2,4,-5,-16,-8,-15, +-30,-20,-13,-22,-12,-18,-19,3,-19,19,38,34,53,39,28,13,12,21,56,41,42,32,61,63,55, +29,27,-1,-15,0,-3,3,-8,-32,-34,-30,-60,-52,-57,-36,-22,-14,-15,-8,-34,14,27,37,78,61, +38,14,9,26,74,45,52,57,113,124,109,64,53,22,9,42,20,35,25,-17,-27,-44,-42,-92,-84, +-61,-53,-36,-13,-20,3,48,110,80,0,12,-3,-38,18,54,61,136,112,-8,-39,-69,-68,-58,-51,-85, +-93,-63,-76,-58,-36,37,-10,-15,-5,2,43,96,86,53,13,8,38,0,-11,-64,-108,-98,-47,21,56, +17,-89,-119,-91,-27,68,102,75,56,60,62,26,23,15,29,6,-30,-16,1,-1,1,-30,-79,-145,-94, +29,71,-202,-132,-84,-20,120,72,18,-27,-96,-41,134,81,31,-24,-33,-47,-52,-27,-4,-22,-14,-12,-37, +-37,-23,-10,3,2,-2,2,-5,-19,-39,-28,-25,-162,41,-40,16,32,79,69,47,12,-12,-33,-31,-36, +-19,-15,21,45,54,46,44,23,14,28,35,18,0,-11,-5,0,4,2,9,31,10,16,75,85,-31, +-1,38,14,-18,-40,-36,-19,-10,8,22,28,30,26,16,-1,-19,-36,-38,-41,-55,-32,-16,-2,4,-6, +-10,-10,-11,-8,-8,-13,-4,-9,-29,-38,-70,-72,-58,-43,-5,32,57,74,86,96,104,97,82,59,47, +31,15,6,-9,-28,-33,-29,-29,-6,9,20,17,8,1,-2,-2,-5,-7,-13,-21,-36,50,63,72,62, +58,49,48,51,44,38,32,17,5,-10,-11,-15,-18,-17,-9,-16,-25,-21,-20,-3,5,24,26,47,45, +54,47,53,51,50,46,51,-19,5,5,4,6,5,2,-1,-5,-7,-9,-12,-14,-19,-18,-19,-18,-20, +-22,-23,-40,-28,-33,-35,-42,-40,-32,-31,-32,-17,-5,-4,-1,-6,-6,5,-24,2,-5,-5,-7,-8,-8, +-8,-9,-11,-13,-15,-16,-18,-17,-18,-18,-18,-19,-14,-35,-48,-50,-33,-50,-54,-52,-48,-42,-43,-40,-35, +-33,-17,-35,-36,-19,11,41,4,12,14,18,19,17,9,11,11,17,14,14,13,17,17,15,12,10, +2,39,42,15,34,41,10,15,14,8,15,18,18,40,31,16,45,34,16,8,22,34,42,38,17, +18,18,30,21,22,23,38,42,37,31,17,22,35,21,27,22,19,3,4,8,8,-1,-10,-8,2, +11,14,9,34,23,11,36,51,68,64,19,20,22,54,40,42,38,57,59,48,30,11,15,27,20, +8,12,17,-29,-14,-43,-36,-56,-32,-31,-3,6,11,17,11,8,-7,40,80,116,109,42,36,39,78, +49,52,61,111,127,114,81,43,37,46,27,28,25,13,-34,-33,-43,-51,-87,-87,-74,-53,-23,-23,-12, +102,82,97,82,-4,21,15,-18,-6,1,-3,58,46,-51,-67,-96,-139,-96,-90,-71,-57,-80,-73,-51,-22, +34,-7,-8,3,11,51,103,94,80,48,83,59,-20,-73,-73,-98,-71,-14,47,69,26,-79,-109,-85,-22, +61,106,95,90,66,77,42,27,29,22,0,-30,-15,2,-3,-3,-31,-78,-132,-87,50,56,-154,-95,-88, +-12,197,148,90,31,-121,-101,84,56,26,-29,-43,-57,-62,-36,-37,-24,-1,-16,-24,-29,-18,-6,5,1, +-1,4,0,-21,-15,-19,-28,-137,22,-9,72,122,155,156,114,14,22,12,20,2,8,1,35,54,51, +48,35,29,37,34,36,20,2,-11,-5,1,1,-1,6,16,1,5,60,45,32,74,103,88,31,16, +4,-4,5,24,59,56,54,49,27,4,-21,-27,-33,-33,-25,-21,-8,2,5,-3,-7,-8,-2,-3,-1, +-3,8,7,-2,12,-31,-38,-50,-35,-18,3,19,43,59,74,86,89,86,72,61,41,11,-4,-21,-31, +-33,-26,-7,6,12,20,12,4,-9,-5,-3,-4,-5,-7,-11,-17,73,62,54,57,52,52,53,56,51, +44,39,19,1,-17,-19,-21,-25,-18,-17,-8,-2,-9,-14,0,14,30,37,45,59,50,51,48,53,62, +68,64,15,21,16,15,12,9,4,1,-7,-14,-18,-22,-24,-25,-25,-26,-27,-29,-33,-34,-23,-26,-19, +-21,-20,-20,-18,-10,-4,-2,2,9,10,11,14,13,10,-4,-6,-7,-9,-10,-10,-11,-14,-16,-19,-21, +-24,-27,-26,-26,-26,-26,-25,-28,-9,-4,-16,-7,0,-17,-13,-10,-10,-4,-2,2,12,9,-4,12,-23, +-11,-27,-6,-6,-7,-2,-9,-12,-17,-16,-13,-5,-9,-9,-11,-7,-6,-7,-10,-9,-10,-28,-17,24,-29, +-21,13,11,8,6,3,4,2,-22,-29,19,-18,-11,-17,-5,-4,10,-4,-14,-27,-25,-19,0,-9,-8, +-10,6,9,4,-3,-2,-12,3,-4,-15,-5,-10,-32,-22,-29,-37,-32,-28,-36,-23,-17,-27,-21,-22,-2, +6,8,31,3,-17,-42,-44,-32,14,-4,-2,-15,10,13,5,-7,-9,-12,-14,-8,-15,-12,-11,-47,-33, +-44,-67,-55,-50,-51,-19,-13,-22,-19,-36,-13,-4,13,60,25,-13,-53,-58,-35,30,-3,-7,-10,37,52, +43,23,23,16,23,27,7,13,9,-35,-32,-40,-41,-81,-77,-76,-48,-33,-38,-39,38,38,81,49,-30, +-32,-52,-87,-52,-28,-18,54,60,-5,-50,-90,-119,-114,-119,-129,-108,-92,-89,-48,-21,28,-3,-3,7,12, +49,88,84,62,32,36,-4,-40,-37,-70,-90,-120,-75,13,49,27,-65,-114,-104,-57,17,49,20,32,40, +50,27,16,13,18,0,-28,-12,2,-4,-4,-30,-72,-125,-85,34,25,-127,-75,-106,-64,72,-10,-67,-90, +-166,-115,53,23,-21,-93,-84,-76,-60,-40,-31,-51,-35,-28,-39,-39,-21,-3,5,1,0,5,2,-29,-13, +-11,-64,-117,-14,3,21,-9,-55,3,20,9,-18,-40,-33,-48,-36,-29,-6,6,9,18,30,25,27,28, +31,14,-1,-10,-3,1,1,-2,5,12,-7,-10,32,6,13,-15,-38,-50,-86,-110,-114,-94,-73,-53,-41, +-22,-10,-4,0,-5,-16,-25,-31,-41,-40,-24,-1,3,5,-5,-6,-4,-1,-2,-5,-16,-3,-3,-1,-21, +-52,-92,-88,-73,-52,-29,-13,-5,42,72,92,81,65,44,31,14,-1,-14,-23,-29,-34,-29,-23,-4,9, +15,4,-5,-10,-10,-9,-13,-13,-26,-33,-55,32,34,33,30,28,24,25,25,20,12,9,0,-6,-15, +-16,-19,-21,-20,-18,-21,-20,-15,-14,1,15,34,38,44,46,43,35,30,31,35,36,33,19,17,15, +9,4,-2,-8,-14,-15,-14,-14,-15,-17,-20,-20,-20,-20,-22,-22,-27,-32,-30,-34,-29,-34,-36,-30,-28, +-22,-12,0,6,8,9,9,13,-21,-7,-11,-14,-16,-17,-19,-21,-21,-23,-25,-26,-26,-27,-26,-27,-26, +-27,-26,-24,-38,-36,-17,-37,-35,-15,-14,-11,-9,-9,-8,-4,-18,-20,1,-17,-32,30,31,34,27,31, +32,37,37,30,31,32,38,34,33,32,36,36,35,32,27,31,29,9,-36,33,10,-38,-34,-35,-37, +-33,-31,-32,11,36,-34,9,-5,38,25,34,40,58,57,39,41,43,58,45,44,44,61,66,62,54, +44,42,3,24,23,15,9,5,13,18,4,13,8,-9,10,5,1,21,24,42,33,45,52,83,87, +50,50,51,89,65,65,59,84,87,77,57,45,28,17,15,3,7,3,-28,-22,-29,-51,-43,-33,-40, +-1,7,-5,18,-3,25,6,33,61,117,119,67,63,75,124,81,74,83,139,160,148,115,84,61,35, +34,7,16,7,-39,-29,-38,-42,-71,-69,-81,-38,-16,-40,-9,98,123,160,136,51,71,67,55,43,32, +24,74,72,3,-36,-72,-102,-78,-67,-75,-91,-77,-75,-29,-6,23,1,4,13,19,53,87,90,80,57, +86,17,-9,-41,-54,-83,-83,-34,35,71,52,-41,-106,-100,-35,52,116,136,123,98,73,27,18,25,23, +4,-24,-9,0,-7,-6,-27,-62,-109,-60,56,42,-99,-33,-88,-8,253,198,162,125,-39,-54,87,124,116, +35,14,-21,-52,-36,-26,-25,-8,-14,-27,-25,-14,1,5,1,2,5,7,-25,3,-2,-76,-97,-32,51, +125,153,177,206,175,73,34,6,18,-2,5,5,41,62,66,70,60,42,32,36,37,17,2,-7,-2, +0,-1,-4,2,6,-8,-7,4,-32,23,75,137,129,80,54,30,15,12,22,54,49,50,51,26,6, +-8,-18,-18,-16,-15,0,9,9,8,0,-4,-1,2,2,1,-9,2,7,10,36,-67,-38,-19,-20,-11, +1,17,46,53,64,74,84,86,76,66,48,21,3,-16,-34,-33,-23,-6,11,15,16,4,-5,-8,-6, +-3,-5,-8,-11,-23,-25,50,46,43,46,49,56,63,71,63,56,48,28,10,-10,-10,-12,-14,-8,-3, +0,-2,-4,-5,9,20,40,39,47,48,40,31,26,31,38,38,42,17,43,40,40,38,36,33,33, +21,11,3,-6,-12,-20,-19,-19,-20,-22,-25,-23,-25,-14,-7,-10,-9,-1,3,9,10,19,24,26,28, +23,29,35,13,16,10,10,10,10,9,10,5,2,-3,-6,-10,-14,-13,-13,-13,-12,-12,-12,-6,-14, +-39,2,-9,-39,-36,-32,-29,-25,-23,-18,3,18,-22,1,-6,-23,-8,-27,-16,-18,-12,-18,-22,-29,-27, +-25,-16,-21,-21,-22,-19,-19,-19,-21,-19,-28,-8,16,54,-18,11,43,44,42,34,39,41,35,10,-21, +49,18,23,-27,-20,-14,0,-10,-20,-39,-38,-32,-11,-23,-25,-26,-13,-9,-11,-13,-15,-16,31,-6,-9, +-4,-5,-29,-21,-23,-25,-26,-29,-33,-19,-5,-17,-27,-4,-7,-14,-1,18,1,-18,-56,-57,-49,1,-20, +-19,-28,-9,-6,-12,-17,-24,-7,1,-5,-13,-17,-7,-49,-25,-50,-64,-52,-36,-56,-9,-4,-15,-13,-22, +-24,-26,2,45,30,-4,-63,-69,-49,20,-21,-34,-35,5,25,21,17,11,22,37,12,2,-6,-7,-45, +-29,-29,-37,-61,-62,-80,-39,-24,-52,-43,85,53,68,45,-23,-39,-60,-80,-79,-74,-70,-7,20,5,-52, +-98,-150,-143,-151,-130,-96,-101,-86,-27,0,18,4,6,14,18,47,71,77,75,58,72,-19,-56,-63,-72, +-76,-114,-70,23,48,38,-36,-101,-108,-67,-16,18,9,37,34,44,27,11,14,9,-6,-23,-6,-1,-7, +-6,-23,-57,-95,-66,40,-5,-72,-22,-98,-60,86,-3,-58,-74,-182,-156,-12,2,-21,-101,-93,-80,-59,-46, +-50,-56,-34,-31,-33,-30,-13,4,4,1,4,3,12,-23,10,3,-87,-82,-51,84,44,-13,-109,-12,34, +38,4,-23,-17,-39,-33,-24,-14,-12,-11,7,22,30,40,30,29,10,-1,-6,-1,-1,-2,-5,1,-3, +-10,-26,-30,-76,62,10,-38,-36,-78,-99,-120,-116,-93,-73,-54,-34,-19,-8,-3,-2,-8,-12,-21,-29,-14, +-7,12,9,6,-2,-1,2,5,3,1,-11,-2,7,30,25,-27,-72,-77,-69,-71,-66,-58,-50,7,44, +64,59,51,38,26,8,-13,-27,-32,-28,-32,-25,-10,2,9,8,-5,-11,-14,-12,-11,-16,-17,-29,-34, +-53,18,6,-4,0,-1,5,10,11,9,5,6,-1,-6,-13,-15,-17,-20,-18,-22,-20,-8,-5,-4,8, +23,39,43,37,43,29,24,11,16,22,28,18,48,29,25,18,9,1,-7,-13,-14,-15,-15,-17,-18, +-20,-20,-20,-21,-23,-22,-28,-20,-24,-22,-14,-13,-16,-13,-9,1,3,11,20,20,25,25,22,-6,-11, +-11,-14,-15,-17,-19,-23,-23,-24,-26,-27,-27,-28,-28,-28,-28,-28,-27,-28,-24,-12,8,-23,-7,15,17, +17,16,18,19,21,5,-9,25,8,-31,26,2,38,23,27,26,30,30,25,25,27,35,29,28,27, +32,32,31,29,24,34,0,-23,-47,7,-24,-51,-50,-51,-51,-51,-49,-52,-20,15,-47,-25,-34,31,23, +25,30,42,41,28,29,34,54,36,34,35,52,57,55,46,42,35,-19,13,6,0,-7,-6,5,7, +-13,8,9,-18,5,-6,-17,12,-1,37,36,35,39,60,60,34,32,37,82,51,50,44,69,74,68, +50,46,22,-2,0,-5,-7,-16,-32,-31,-24,-69,-35,-37,-51,-5,2,-21,4,-25,21,11,16,37,77, +74,37,33,55,118,62,46,54,108,131,126,101,86,59,19,31,-10,0,-3,-37,-21,-25,-27,-49,-46, +-75,-26,-15,-51,-19,69,119,169,143,75,65,52,58,40,28,22,72,90,60,-7,-54,-73,-77,-68,-90, +-113,-73,-74,-7,7,12,7,8,13,18,42,59,74,71,59,67,-25,-8,-14,-46,-73,-103,-64,19,58, +59,-9,-98,-113,-56,17,80,113,105,92,53,11,6,14,17,1,-17,-3,-4,-7,-7,-17,-43,-81,-41, +47,17,-60,17,-72,-9,214,156,131,118,-21,-44,54,132,136,44,23,-13,-42,-36,-19,-28,-17,-13,-29, +-21,-8,5,3,2,4,2,13,-15,12,9,-102,-68,-67,117,104,74,60,121,140,115,34,-10,-7,-22, +-14,-4,20,36,48,60,62,45,28,34,32,10,0,-3,-2,-2,-2,-4,-1,-2,-8,-18,-63,-104,30, +46,93,91,60,28,-3,-16,-21,-13,7,10,17,27,15,7,4,-8,-6,-4,-7,15,21,13,9,0, +1,3,3,4,2,-9,-5,6,26,55,-78,-44,-9,-21,-19,-16,-1,22,36,47,56,65,65,57,48, +33,12,-2,-15,-30,-30,-20,-9,9,12,7,-4,-11,-8,-7,-6,-11,-14,-21,-35,-40,13,14,15,16, +21,33,43,55,49,46,41,28,16,2,0,-3,-4,-3,2,-3,-6,-1,3,14,23,43,36,41,33, +27,13,6,9,10,7,12,21,47,47,46,43,42,40,40,30,21,14,5,-3,-13,-11,-11,-11,-13, +-14,-13,-23,-6,-1,-1,-1,9,14,17,15,27,34,33,34,28,32,41,5,21,15,16,16,16,15, +16,12,9,5,2,-1,-5,-4,-4,-4,-3,-4,0,-11,-24,-41,-1,-18,-38,-37,-34,-29,-29,-27,-23, +-8,12,-23,-10,2,-12,18,-19,-8,-8,-4,-5,-8,-16,-15,-13,-4,-10,-9,-10,-8,-8,-8,-10,-9, +-19,17,34,40,6,29,33,36,35,25,36,38,31,31,5,37,38,34,-11,-14,-4,5,10,3,-18, +-18,-15,6,-11,-14,-13,-3,3,4,4,-3,2,37,2,7,1,2,-12,-8,-4,-6,-6,-13,-21,-5, +7,-3,-13,16,7,-11,9,19,28,18,-27,-28,-24,24,-4,-3,-5,8,12,8,3,-10,8,15,1, +-4,-15,-5,-40,-18,-44,-57,-43,-22,-53,0,6,-7,1,-5,-12,-28,2,31,60,46,-21,-31,-15,49, +-3,-24,-16,20,46,49,46,27,37,39,4,-2,-18,-17,-41,-20,-15,-25,-38,-42,-71,-27,-13,-55,-33, +113,87,89,79,29,-4,-24,-21,-51,-66,-70,-16,23,35,-31,-82,-139,-132,-135,-101,-77,-90,-70,-1,16, +9,9,7,13,15,36,46,64,80,77,96,-18,-43,-66,-65,-67,-97,-56,33,48,47,-4,-86,-108,-67, +-26,18,42,64,46,41,20,5,15,4,-8,-14,-2,-5,-6,-8,-11,-35,-64,-43,43,-14,-32,34,-62, +-20,143,80,39,22,-125,-140,-37,32,40,-38,-50,-56,-50,-44,-50,-38,-16,-21,-21,-17,-3,6,2,2, +5,2,13,-7,18,10,-87,-55,-69,145,59,2,-77,10,69,94,42,7,1,-19,-18,-12,-7,-6,-2, +17,28,38,45,33,26,5,-1,-3,-2,-3,-3,-5,-1,-8,-7,-29,-93,-139,98,61,27,33,-6,-26, +-63,-81,-70,-54,-28,-17,-6,9,7,7,3,1,-6,-6,13,15,24,14,6,1,2,4,5,4,5, +-4,-1,15,53,82,-18,-33,-35,-39,-55,-64,-59,-46,-3,22,34,40,41,37,28,11,-14,-27,-31,-26, +-27,-18,2,8,7,1,-9,-11,-12,-9,-9,-15,-17,-25,-30,-38,8,-12,-25,-17,-16,-1,8,15,16, +18,21,14,7,0,-5,-7,-11,-9,-15,-12,4,5,7,14,27,38,39,28,35,18,14,-1,5,12, +18,7,53,39,35,30,23,17,11,8,3,-2,-6,-10,-12,-15,-14,-15,-16,-17,-17,-21,-8,-9,-1, +5,10,13,12,18,26,23,24,31,30,33,35,31,13,-2,0,-2,-2,-4,-5,-7,-9,-10,-12,-13, +-15,-17,-17,-16,-16,-16,-15,-18,-4,8,12,1,16,21,22,22,20,23,24,24,21,10,25,24,-15, +6,-21,17,7,8,8,8,7,2,3,4,14,7,7,6,9,10,11,8,6,13,-22,-30,-17,-19, +-34,-24,-26,-28,-28,-29,-29,-33,-30,-13,-21,-32,-33,6,8,5,10,13,9,-3,-3,4,27,8,4, +6,18,23,25,18,19,10,-17,-2,-10,-13,-18,-20,-10,-12,-29,-7,-3,-27,-7,-13,-28,-8,-18,18, +21,15,22,24,15,-7,-11,-4,47,13,12,7,27,32,32,20,20,6,-15,-14,-10,-23,-29,-36,-34, +-27,-73,-31,-35,-55,-9,-4,-29,-12,-37,3,3,-1,19,32,18,-15,-24,2,75,14,-11,-5,37,62, +69,56,55,39,9,15,-17,-19,-14,-30,-12,-11,-11,-27,-26,-59,-17,-15,-55,-33,49,89,135,116,75, +25,-2,14,-1,-10,-11,49,89,101,14,-43,-66,-92,-91,-103,-110,-71,-65,11,16,5,8,5,9,10, +27,30,53,61,60,51,-49,-17,-6,-46,-62,-115,-85,12,39,56,20,-82,-117,-76,-26,23,55,60,58, +26,-1,-4,6,5,-5,-9,-2,-4,-4,-6,-7,-21,-53,-29,30,-11,-24,58,-40,-8,127,78,54,56, +-49,-66,-4,89,102,20,-3,-25,-33,-35,-18,-28,-20,-12,-26,-13,-1,5,1,2,3,2,8,-1,11, +10,-93,-44,-80,143,31,-49,-107,-29,49,133,40,-9,-29,-37,-32,-18,-13,-6,11,29,46,42,29,30, +22,2,-3,-1,-2,-2,-2,-3,-1,-4,-5,-26,-119,-153,67,33,21,17,3,-26,-59,-68,-67,-56,-45, +-33,-19,0,5,9,13,4,5,6,7,24,28,15,7,1,3,4,4,3,4,-5,-7,9,44,79, +-57,-44,-14,-27,-34,-38,-27,-15,14,29,36,38,35,28,20,8,-6,-15,-18,-23,-25,-16,-9,4,6, +-1,-9,-11,-7,-7,-8,-15,-19,-29,-40,-48,-19,-19,-18,-18,-14,-1,10,20,21,24,27,24,21,15, +11,7,4,1,2,-9,-7,3,10,16,23,36,29,28,19,14,1,-8,-7,-8,-11,-12,29,40,40, +37,34,32,30,29,24,20,15,10,4,-4,-3,-2,-2,-3,-2,-4,-15,1,2,8,7,17,20,20, +18,26,32,31,31,28,29,36,-2,17,13,13,14,13,12,11,10,8,6,5,3,1,2,2,2, +2,1,6,-13,-20,-19,-4,-15,-13,-14,-12,-10,-11,-11,-9,-9,3,-4,-8,4,12,31,10,12,14, +14,19,18,11,11,12,20,14,14,14,15,16,16,14,12,8,29,25,-2,24,22,-5,-1,-2,-7, +2,4,-2,26,27,-2,27,16,19,7,16,19,37,36,17,15,17,37,16,11,14,23,30,33,31, +22,25,19,12,19,4,2,5,7,13,5,14,8,-8,11,11,4,8,25,30,13,29,28,61,62, +22,18,17,61,28,27,29,40,44,46,34,21,22,17,4,6,-13,-11,-24,-19,-28,-49,-28,-16,-42, +6,13,-4,13,2,11,-9,11,23,88,96,37,24,37,92,33,7,18,52,81,92,80,55,50,28, +4,-6,-23,-19,-29,-8,-7,-12,-17,-22,-51,-15,-3,-49,-17,110,118,133,134,100,53,31,55,10,-17, +-29,22,65,86,13,-42,-86,-92,-88,-65,-66,-65,-45,20,22,3,8,3,9,6,22,23,46,71,81, +97,-15,-9,-37,-43,-53,-79,-46,39,50,62,38,-62,-101,-61,-17,38,87,90,63,34,6,-1,15,1, +-7,-5,-2,-3,-3,-5,-7,-12,-38,-22,38,-8,3,86,-8,32,193,174,153,136,-23,-72,-23,91,126, +62,19,-15,-29,-32,-28,-7,6,-2,-11,-4,2,3,1,2,3,2,5,3,14,9,-67,-29,-70,146, +42,5,-23,27,90,148,85,43,11,2,-2,0,4,11,22,38,43,47,42,35,20,1,-2,-2,-2, +-2,-2,-3,-1,-5,-3,-25,-132,-163,120,114,104,98,73,53,10,-23,-29,-18,9,8,15,32,23,20, +17,14,15,23,34,38,31,16,7,2,3,4,4,2,3,1,-1,21,61,133,-23,5,16,2,-16, +-30,-25,-7,10,17,18,29,36,36,31,18,-4,-13,-18,-20,-20,-9,10,12,7,-3,-8,-9,-8,-5, +-5,-10,-14,-17,-24,-19,-1,-16,-23,-16,-13,5,17,28,32,39,45,38,30,23,17,12,7,7,4, +2,12,14,17,20,26,32,28,22,23,11,5,-5,-1,3,4,-1,41,45,43,43,39,39,38,39, +31,23,16,9,5,0,1,1,0,0,-1,-2,2,11,22,24,31,41,39,43,43,41,39,39,38, +36,40,39,28,19,19,20,21,20,20,20,17,15,13,12,10,7,7,7,7,8,8,7,17,18, +1,25,26,8,8,9,8,10,11,11,25,28,9,26,14,-15,-20,-12,-10,-12,-10,-12,-15,-20,-20, +-18,-8,-15,-15,-15,-14,-13,-11,-14,-12,-15,-21,-8,27,-27,-14,19,17,16,12,14,14,8,-11,-24, +21,-8,-3,-18,-12,-12,-7,-10,-16,-29,-31,-25,-1,-20,-24,-23,-17,-12,-6,-9,-7,-13,6,-11,-13, +-17,-18,-23,-21,-24,-31,-17,-15,-28,-13,-8,-22,-22,-15,0,-2,0,7,-1,-16,-40,-47,-40,11,-21, +-21,-25,-14,-10,-3,-9,-11,-7,-12,-16,-8,-33,-29,-32,-27,-30,-55,-27,-24,-48,-7,-3,-22,-16,-27, +-13,-13,-12,5,8,-10,-49,-64,-41,30,-25,-55,-55,-31,-5,15,15,16,17,10,-3,-13,-31,-20,-20, +-5,-3,-4,-9,-13,-38,-11,-11,-50,-39,55,58,88,85,67,-13,-50,-30,-48,-54,-54,9,68,113,27, +-35,-72,-105,-113,-100,-84,-67,-44,21,19,1,6,1,5,2,12,12,31,52,61,53,-44,-22,-20,-51, +-56,-116,-93,8,20,45,44,-60,-111,-92,-59,-23,4,22,19,4,-5,-9,4,-5,-8,-3,-2,-2,-2, +-3,-5,-5,-26,-21,17,-29,19,88,-9,-6,47,25,3,6,-77,-94,-67,26,51,0,-32,-44,-29,-35, +-24,-19,-10,-7,-15,-4,3,2,1,2,1,2,3,2,10,5,-58,-18,-73,101,-64,-148,-222,-153,-41, +118,56,13,-39,-41,-44,-35,-43,-40,-23,-1,22,37,36,27,10,-3,-3,-1,-2,-2,-1,-2,-1,-3, +-2,-30,-140,-163,125,54,-25,-39,-42,-61,-90,-102,-96,-83,-75,-58,-41,-16,0,12,16,15,15,17,28, +34,30,15,5,1,3,3,3,2,3,1,-3,18,61,111,-15,-29,-22,-28,-40,-50,-45,-46,-6,11, +14,11,5,0,-6,-14,-23,-25,-21,-15,-15,-9,0,3,2,-5,-8,-8,-6,-5,-5,-13,-16,-26,-32, +-40,-30,-39,-42,-40,-39,-27,-18,-13,-5,3,15,20,24,28,21,15,10,5,-1,-9,1,10,17,18, +23,25,23,14,13,5,-1,-12,-12,-14,-14,-23,42,26,26,22,18,16,14,13,14,13,12,11,10, +8,7,8,8,7,10,6,5,10,12,20,23,28,27,25,27,25,27,28,27,29,28,26,5,8, +10,9,9,8,7,6,6,6,7,7,7,7,8,7,7,7,7,8,1,5,20,4,9,28,25, +25,23,23,22,21,9,4,26,12,6,17,15,24,16,19,17,24,24,18,18,18,26,20,19,20, +21,21,23,20,17,21,13,-4,-32,14,-6,-33,-33,-32,-33,-29,-29,-32,0,21,-33,-4,-14,26,14, +17,15,36,38,24,22,24,43,23,18,20,26,33,40,35,29,26,-8,8,13,-5,-9,5,3,6, +-5,14,13,-8,10,2,-5,11,12,33,24,29,22,57,61,34,28,27,67,34,33,33,43,47,56, +41,33,18,4,-2,6,-19,-23,-15,-25,-18,-40,-18,-17,-34,1,8,-13,7,-7,18,3,3,2,69, +84,46,31,45,97,41,13,19,45,74,97,81,62,42,9,4,-10,-25,-17,-13,-2,-3,-2,-5,-7, +-29,-6,-1,-42,-14,73,108,146,151,132,67,39,72,30,4,-5,42,90,119,47,-9,-37,-60,-55,-50, +-67,-42,-24,28,18,0,5,1,3,2,7,8,24,48,62,69,-22,12,-13,-41,-61,-95,-74,7,20, +47,54,-56,-110,-82,-31,30,88,79,55,13,-11,-8,9,-4,-6,-2,-1,-1,-2,-1,-3,-2,-16,-10, +20,-8,29,105,18,40,159,183,181,165,37,-28,-36,96,151,115,51,0,-22,-28,-9,12,16,10,-6, +3,3,1,1,1,1,1,2,1,7,2,-46,-8,-74,60,-31,-48,-32,-22,41,139,90,50,-14,-13, +-22,-21,-15,1,21,36,42,42,31,27,8,-3,-3,-1,-1,-1,-1,-1,-1,-1,-2,-24,-138,-151,124, +125,108,81,78,58,24,-10,-27,-23,-4,-6,2,22,18,18,19,16,24,37,43,48,30,14,4,1, +2,2,2,1,1,2,-1,23,53,145,-33,10,30,14,2,-10,-5,7,7,3,-4,5,10,11,11, +6,-6,-10,-14,-19,-14,-5,8,9,3,-4,-5,-5,-4,-2,-2,-7,-12,-14,-21,-13,-19,-27,-26,-22, +-19,-4,6,16,22,32,40,39,36,34,27,21,16,14,12,6,10,15,20,19,20,19,14,11,9, +2,-4,-10,-11,-13,-16,-18,21,29,31,33,33,36,39,43,37,30,24,18,14,9,10,11,11,11, +10,12,11,23,30,31,37,48,46,45,41,40,36,33,32,27,30,30,24,23,23,25,27,27,27, +29,27,26,25,24,22,20,21,20,20,20,20,21,22,15,-2,29,20,2,1,2,2,3,3,3, +16,26,1,15,27,-22,-6,-24,-16,-17,-15,-16,-19,-25,-25,-24,-15,-21,-21,-21,-21,-21,-18,-20,-18, +-26,-7,11,38,-17,5,32,30,30,26,30,31,24,9,-16,32,14,17,-21,-18,-16,-12,-10,-15,-29, +-34,-30,-10,-26,-32,-32,-32,-26,-16,-16,-17,-18,18,-12,-6,-16,-15,-16,-23,-25,-23,-16,-16,-21,-11, +-2,-12,-21,-1,-3,-11,-1,0,4,-8,-37,-46,-44,-2,-27,-28,-30,-30,-26,-12,-17,-23,-10,-4,-13, +-3,-35,-26,-22,-21,-28,-33,-20,-14,-34,-3,-1,-14,-12,-12,-16,-19,-12,-4,18,9,-36,-57,-44,12, +-31,-62,-68,-62,-36,-2,3,-2,5,11,-15,-7,-34,-18,-8,-1,2,3,-2,-4,-19,-7,-6,-40,-33, +69,51,71,83,78,-9,-49,-28,-59,-71,-72,-18,47,108,40,-19,-70,-101,-112,-79,-56,-53,-19,23,15, +0,3,-1,0,1,4,3,14,38,54,59,-30,-14,-24,-45,-48,-101,-86,4,4,32,57,-42,-102,-99, +-70,-35,-6,12,1,-9,-10,-11,4,-9,-6,-1,-1,0,0,-1,-2,-1,-7,-12,7,-32,48,107,33, +17,29,48,31,17,-62,-97,-105,-6,41,30,-20,-39,-22,-27,-21,-2,5,0,-5,3,3,1,1,0, +0,0,1,0,5,1,-34,3,-71,11,-111,-156,-211,-181,-82,82,79,54,-25,-25,-39,-39,-50,-45,-32, +-11,9,29,35,18,-1,-5,-2,-1,-1,-1,0,-1,-1,-1,-1,-27,-129,-136,163,104,-9,-43,-42,-54, +-77,-94,-92,-78,-65,-51,-34,-9,6,17,19,23,25,28,43,37,24,10,2,2,2,1,1,1,1, +2,1,24,60,136,6,-4,-12,-16,-32,-47,-49,-55,-22,-10,-10,-12,-15,-18,-18,-22,-28,-29,-23,-14, +-12,-5,6,2,-1,-5,-4,-2,-2,-1,-2,-6,-11,-18,-20,-22,-35,-48,-52,-48,-47,-37,-31,-29,-18, +-5,9,17,25,33,25,18,12,7,-1,-5,7,12,16,13,15,11,11,0,5,-5,-6,-16,-18,-20, +-19,-30,32,7,7,6,3,2,1,1,4,6,6,7,8,11,10,11,11,11,13,10,17,15,19, +27,32,33,29,27,29,21,18,20,17,20,19,11,11,2,6,5,6,6,5,4,5,6,8,9, +10,11,11,11,11,10,10,9,13,22,35,13,25,43,40,39,35,36,34,31,20,8,34,22,9, +11,-7,22,11,13,10,15,15,12,10,11,18,12,12,12,12,13,16,13,10,17,-10,-25,-34,-7, +-28,-36,-39,-38,-36,-36,-37,-39,-22,2,-36,-26,-29,17,13,10,6,21,23,15,11,13,30,15,9, +8,10,15,26,20,20,12,-24,-1,0,-16,-20,-2,-10,-11,-19,2,7,-12,2,-8,-16,4,-5,26, +25,22,14,38,38,25,13,12,46,21,19,15,18,22,39,24,24,3,-12,-12,1,-28,-32,-10,-26, +-13,-29,-10,-16,-24,-4,-1,-20,-3,-16,16,11,-2,-9,38,50,32,9,21,66,26,-3,-10,-1,24, +60,48,42,20,-9,-2,-13,-25,-12,-2,0,2,7,0,2,-11,-2,-2,-32,-16,43,81,136,146,141, +62,27,59,27,9,4,48,102,145,82,26,1,-42,-44,-51,-68,-27,-7,24,9,-1,2,-1,-2,-1, +2,1,8,26,40,40,-25,29,22,-20,-46,-97,-90,-9,7,45,76,-32,-96,-91,-42,11,58,48,34, +-8,-21,-11,3,-7,-4,0,-1,0,1,0,-1,0,-5,-1,5,-7,60,122,47,37,72,132,143,128, +59,-2,-49,73,134,132,62,11,-7,-15,7,21,17,13,-3,5,1,1,0,0,0,0,0,0,3, +2,-31,11,-69,-56,-107,-107,-99,-106,-40,93,90,65,-23,-18,-33,-33,-30,-13,7,21,31,32,20,15, +-3,-4,-1,0,-1,0,0,0,0,0,0,-18,-112,-106,131,118,57,10,24,9,-6,-22,-40,-37,-27, +-24,-11,11,16,20,26,26,36,44,43,45,23,8,0,1,1,1,0,0,0,1,-1,23,44,132, +-25,8,26,15,9,0,2,3,4,-1,-7,-5,-7,-11,-9,-8,-9,-8,-7,-13,-9,1,5,4,1, +-3,-2,-2,1,1,1,-1,-6,-8,-15,-8,-37,-35,-28,-28,-23,-14,-7,0,7,17,26,32,37,41, +35,28,22,18,18,8,6,12,17,13,9,7,2,1,-3,-6,-12,-17,-21,-27,-35,-34,1,9,12, +15,18,22,27,31,31,29,26,24,21,19,19,20,21,22,22,23,14,27,30,31,33,41,39,34, +28,28,26,21,20,14,15,16,13,23,22,25,26,27,28,29,28,29,29,29,30,29,29,29,29, +29,28,31,20,10,-1,24,11,2,1,1,2,0,-1,-1,6,18,-2,3,33,-12,11,-15,-8,-8, +-8,-5,-6,-12,-13,-12,-7,-10,-10,-11,-12,-12,-9,-11,-10,-18,10,20,21,0,15,19,18,18,16, +22,22,18,19,2,17,23,22,-7,-10,-6,-8,5,4,-8,-14,-14,0,-11,-17,-20,-25,-20,-7,-6, +-10,-8,17,-6,6,-11,-10,-2,-17,-16,-9,-5,-7,-8,-2,3,-2,-9,13,8,-5,9,2,24,21, +-4,-16,-19,9,-5,-7,-11,-20,-18,2,-5,-13,-6,3,-8,4,-29,-22,-10,-17,-20,-15,-11,-6,-18, +0,2,-6,-2,4,-5,-15,-7,-12,38,47,10,-15,-13,20,-4,-32,-46,-57,-34,10,13,1,2,6, +-18,-4,-28,-10,-1,2,7,4,3,0,-4,-4,-1,-27,-19,77,54,77,100,104,23,-11,12,-26,-43, +-43,-5,57,116,72,19,-40,-70,-80,-48,-34,-31,3,17,8,0,0,-3,-1,-1,1,1,3,22,38, +57,-3,9,-23,-35,-47,-87,-79,-6,0,35,76,-16,-82,-93,-63,-20,18,26,5,-12,-10,-7,3,-7, +-3,-1,0,1,1,0,0,0,-3,-4,6,-17,77,113,46,23,24,96,102,71,0,-60,-106,-5,61, +86,22,-13,-13,-17,-12,17,21,8,3,3,2,0,0,-1,0,0,0,0,2,4,-20,16,-71,-117, +-130,-110,-127,-136,-80,35,93,88,-6,-10,-36,-42,-45,-34,-24,-8,2,20,27,9,-6,-3,-1,0,0, +0,0,0,0,-1,1,-14,-93,-85,162,135,29,-20,-15,-19,-28,-45,-54,-50,-36,-31,-19,4,10,17, +20,29,35,42,54,39,17,5,-1,1,0,0,-1,-1,-1,1,-1,23,48,126,17,22,12,11,-3, +-19,-26,-32,-21,-19,-22,-21,-23,-26,-22,-21,-23,-21,-16,-8,-4,4,13,4,-1,-2,0,2,1,3, +1,1,-3,-3,-5,3,-29,-40,-41,-36,-34,-26,-23,-22,-12,-3,8,16,23,31,25,19,13,11,6, +7,15,14,14,9,8,1,1,-7,-2,-9,-9,-16,-19,-22,-23,-29,14,-2,-1,1,2,4,6,9, +12,13,14,15,16,20,19,19,19,20,20,18,26,24,29,32,37,36,31,29,28,20,14,15,12, +13,12,3,22,8,13,13,14,15,15,15,16,17,19,20,21,22,22,22,22,21,21,19,29,35, +35,29,38,41,39,38,35,35,34,31,29,20,28,29,23,-8,-23,1,-4,-4,-6,-4,-5,-7,-8, +-8,-3,-6,-6,-7,-8,-8,-4,-6,-7,-4,-25,-27,-9,-25,-31,-12,-18,-18,-15,-17,-17,-19,-26,-19, +-14,-27,-23,-5,-2,-6,-10,-3,-3,-7,-13,-11,2,-5,-11,-17,-21,-18,-5,-7,-3,-12,-20,-13,-12, +-24,-26,-12,-25,-29,-28,-14,-6,-15,-10,-15,-22,-12,-16,7,10,6,-2,9,5,0,-16,-16,9,-1, +-4,-14,-22,-20,2,-6,-3,-16,-22,-20,-5,-34,-31,-7,-20,-10,-14,-5,-10,-14,-7,-8,-22,-16,-21, +0,4,-12,-23,3,8,3,-23,-17,15,1,-27,-51,-67,-48,-1,1,6,-8,-17,-11,-11,-21,-4,3, +3,5,4,2,3,0,0,-4,-23,-21,21,35,88,104,114,33,-4,20,-2,-8,-1,37,95,148,104, +50,9,-44,-55,-57,-56,-17,5,14,3,-1,-1,-2,-2,-1,-1,0,0,9,19,18,-24,21,22,-17, +-37,-95,-100,-32,-11,34,82,-11,-81,-102,-67,-26,7,10,5,-23,-18,-8,-1,-6,-2,0,1,1,1, +1,0,1,-3,1,0,-9,77,114,62,23,-17,64,81,58,38,-16,-89,5,68,103,44,5,-2,-8, +9,18,10,8,0,4,0,0,0,-1,-1,0,-1,0,-1,8,-25,18,-78,-171,-140,-124,-147,-158,-106, +15,77,77,-19,-23,-49,-51,-54,-41,-25,-10,4,12,9,2,-9,-1,-1,0,0,1,1,1,1,1, +0,-5,-73,-58,124,98,-4,-61,-41,-50,-48,-46,-60,-60,-58,-46,-30,-8,5,15,24,29,38,42,41, +33,14,3,-1,0,-1,-1,-1,-1,-2,0,-3,17,36,95,-4,10,17,15,10,0,-7,-20,-14,-14, +-17,-21,-28,-36,-33,-27,-19,-14,-7,-6,-1,6,5,2,0,0,1,2,2,3,4,3,0,-1,-6, +-2,-42,-38,-30,-31,-27,-24,-21,-20,-14,-6,2,13,24,34,29,23,18,15,15,7,4,8,10,5, +2,-2,-4,-5,-6,-8,-13,-17,-23,-31,-37,-38,-6,-10,-5,-2,1,5,9,13,18,22,24,25,26, +27,26,27,28,28,29,28,20,27,25,26,25,25,22,16,12,10,9,6,5,3,0,-1,7,15, +16,18,19,20,21,22,23,24,26,28,30,31,31,31,30,30,29,31,18,14,18,19,13,21,19, +19,18,16,14,12,7,10,12,5,30,0,14,2,3,4,1,8,8,5,2,2,5,3,3,2, +0,0,3,2,0,-2,11,7,-11,7,4,-10,-12,-11,-9,-6,-6,-7,9,11,-13,9,4,9,2, +4,-2,18,22,14,7,5,11,8,2,-5,-12,-9,6,6,3,3,-1,-2,9,-11,-12,4,-13,-12, +-5,2,3,0,2,0,-1,2,14,18,9,18,3,40,46,32,15,8,20,19,17,8,-6,-6,16, +9,3,-4,-1,-7,4,-25,-21,-2,-14,-9,-5,-5,-3,-5,-1,0,-7,2,6,9,-1,-2,-22,45, +69,53,24,17,27,27,4,-21,-44,-27,21,23,12,0,-6,-14,-5,-17,-1,2,3,4,2,2,1, +0,-1,0,-17,-8,59,60,96,121,136,71,42,64,19,-1,-1,22,74,121,101,56,0,-33,-41,-26, +-27,-10,13,8,2,-1,-1,-2,-1,-1,-1,0,-1,7,20,37,7,34,13,-1,-25,-63,-70,-22,-5, +34,79,-1,-65,-89,-57,-7,39,38,17,-10,-9,-3,0,-5,-1,0,1,1,1,1,0,1,-1,-2, +5,2,91,125,74,39,27,139,171,133,79,-3,-88,9,84,136,73,24,1,-3,4,29,24,9,4, +1,1,0,0,-1,-1,0,-1,0,-2,7,-16,19,-71,-208,-111,-40,-39,-65,-56,-7,94,112,23,8, +-28,-37,-36,-22,-12,-1,-1,8,10,-1,-7,0,0,0,0,1,1,1,0,1,-1,0,-50,-36,124, +134,55,1,7,8,11,3,-19,-24,-11,-9,1,17,17,19,25,32,41,48,51,33,9,0,-1,0, +-1,-1,-1,-1,-2,0,-5,12,34,93,18,42,40,39,28,13,1,-5,-16,-22,-26,-22,-22,-26,-19, +-13,-12,-8,-6,-4,3,10,13,4,0,1,2,2,2,3,3,4,2,7,6,20,-22,-25,-23,-20, +-17,-11,-7,-5,1,7,12,18,24,30,26,21,17,17,17,18,16,12,9,4,0,-5,-5,-7,-5, +-8,-9,-12,-16,-20,-23,-24,-7,-10,-6,0,4,9,14,20,21,22,23,23,24,27,26,27,27,27, +25,27,29,30,32,29,30,29,24,21,18,12,7,5,3,2,2,-4,25,15,18,20,22,23,25, +26,26,27,28,30,31,31,31,31,30,30,30,28,36,35,25,36,36,27,26,26,24,24,23,20, +26,26,15,24,34,-23,-22,-19,-16,-17,-19,-18,-19,-21,-23,-23,-21,-20,-20,-22,-25,-25,-21,-22,-20, +-24,-24,-13,15,-30,-18,13,7,6,8,7,8,6,-13,-27,10,-12,-5,-21,-14,-17,-21,-18,-20,-21, +-30,-30,-24,-22,-26,-36,-46,-45,-30,-27,-23,-28,-6,-20,-14,-24,-25,-17,-33,-35,-25,-19,-15,-13,-15, +-14,-19,-21,-13,-5,-2,-2,-11,-7,-13,-16,-36,-39,-28,-19,-20,-35,-52,-53,-29,-29,-27,-28,-21,-21, +-7,-32,-22,-3,-8,-4,-3,0,-2,-3,-5,-10,-16,-17,-14,-10,-3,-13,-28,-13,-10,-11,-44,-48,-35, +-20,-40,-78,-112,-101,-51,-34,-24,-28,-16,-18,-7,-13,3,2,3,3,1,1,1,1,1,-3,-15,-19, +26,15,52,74,99,22,-15,-5,-27,-31,-20,6,62,122,108,64,3,-46,-65,-55,-35,-11,10,4,1, +-2,-1,-2,-1,-1,0,0,0,2,9,14,-5,19,19,-4,-21,-78,-91,-38,-17,26,73,5,-61,-103, +-87,-57,-32,-15,-15,-25,-8,-3,-2,-3,0,1,1,1,0,0,0,1,0,-1,2,-3,94,110,57, +-3,-87,18,49,22,29,-25,-113,-51,10,72,35,11,5,1,4,11,4,1,2,1,0,0,-1,-1, +-1,0,-1,1,-3,7,-13,16,-80,-253,-153,-109,-156,-160,-135,-60,59,89,10,-15,-52,-54,-64,-57,-48, +-34,-21,-7,0,-8,-6,1,0,1,0,1,0,1,0,1,0,2,-31,-23,93,61,-51,-101,-90,-87, +-70,-55,-65,-69,-69,-54,-36,-17,-1,13,25,33,38,37,36,21,5,0,0,-1,-1,-1,-1,-1,-2, +-1,-3,4,30,48,26,17,10,16,7,-5,-20,-39,-32,-27,-26,-31,-39,-47,-40,-32,-23,-16,-7,2, +7,9,6,1,1,2,2,2,2,3,3,3,4,4,5,6,-36,-36,-32,-33,-31,-30,-29,-32,-26, +-22,-15,-4,9,21,18,14,11,10,9,8,7,6,4,-1,-3,-5,-4,-5,-4,-5,-7,-10,-17,-24, +-28,-32,-9,-25,-20,-17,-14,-12,-9,-5,2,9,15,19,23,28,26,27,27,27,28,26,26,21,17, +19,16,10,5,1,-1,-6,-8,-8,-10,-8,-11,-17,5,2,6,6,7,8,9,9,12,14,16,19, +21,24,23,23,23,22,22,21,18,22,37,14,20,37,36,34,32,30,28,25,12,3,26,11,20, +5,2,13,7,8,4,11,12,12,8,7,7,9,9,6,4,3,7,6,4,7,-2,-15,-34,-1, +-16,-29,-34,-33,-29,-28,-28,-27,-11,5,-35,-14,-18,14,9,8,-2,16,22,23,13,10,10,15,11, +1,-8,-7,6,7,7,3,-21,-4,3,-15,-18,1,-14,-13,-6,2,5,3,0,-8,-7,3,4,21, +20,21,1,35,44,47,26,17,14,28,26,12,-5,-7,14,9,10,-10,-13,-11,-2,-21,-17,1,-8, +0,-2,-1,-3,1,-3,-5,-11,0,-1,16,12,0,-28,28,56,67,34,20,13,35,20,-15,-46,-38, +6,13,12,-9,-19,-11,-7,-6,4,1,3,1,1,1,1,0,1,0,-10,-4,32,50,91,114,139, +87,64,81,46,31,35,44,83,120,124,89,37,-4,-14,-21,-28,3,11,1,0,-1,-1,-1,0,0, +0,0,0,0,6,17,11,42,31,14,-12,-50,-65,-34,-4,38,80,17,-43,-80,-57,-14,30,29,19, +-9,-7,0,-3,-1,0,1,1,0,0,0,0,0,0,-1,1,12,87,111,71,30,4,125,173,136, +119,38,-65,12,84,150,108,61,21,15,21,28,13,6,1,1,0,0,0,0,0,0,-1,1,-3, +5,-10,14,-82,-258,-85,3,11,-23,-48,-53,66,103,43,11,-29,-34,-34,-21,-10,-4,-5,-5,-9,-7, +-3,1,0,1,1,1,0,1,0,1,0,3,-16,-11,51,75,40,-5,-2,1,14,19,-8,-21,-15, +-12,-2,10,12,17,29,35,44,48,38,22,2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,18,41, +11,46,52,50,41,29,15,8,-15,-25,-30,-25,-25,-30,-20,-11,-5,1,4,4,10,13,8,2,1, +2,2,2,2,2,2,3,2,8,10,23,-21,-17,-11,-12,-8,-5,-2,0,2,4,4,8,12,16, +15,13,12,13,16,17,9,5,2,-2,-5,-5,-6,-4,-4,-4,-6,-6,-12,-17,-24,-21,-25,-17,-11, +-4,2,7,13,20,21,23,24,24,25,27,26,27,27,27,26,29,24,26,25,19,17,15,11,7, +2,0,-3,-6,-7,-10,-10,-11,15,15,16,18,20,22,24,26,26,26,27,28,29,30,30,30,29, +29,29,29,28,22,11,28,20,10,9,9,8,7,6,5,11,17,0,8,33,-23,-8,-25,-17,-18, +-20,-18,-18,-18,-22,-23,-23,-20,-20,-22,-26,-26,-23,-23,-21,-28,-10,3,20,-17,0,18,13,12,15, +16,17,17,2,-17,17,6,11,-21,-17,-17,-22,-16,-15,-14,-25,-28,-29,-20,-23,-35,-47,-47,-35,-29, +-26,-27,4,-16,-8,-19,-19,-13,-26,-25,-13,-12,-12,-4,-12,-9,-9,-18,-1,-8,-10,-4,-17,-4,-5, +-1,-24,-32,-38,-14,-14,-30,-52,-56,-36,-31,-31,-27,-13,-16,-6,-22,-10,2,-1,2,2,2,1,2, +-2,-8,-8,-11,-3,-13,-11,-14,-33,-9,4,13,-24,-41,-52,-15,-26,-68,-111,-108,-65,-41,-33,-32,-13, +-19,-3,-4,5,0,1,0,-1,0,0,-1,1,0,-9,-12,32,10,25,50,87,32,4,6,-16,-20, +-10,-1,42,92,107,77,6,-33,-54,-39,-15,-3,9,-1,-1,-1,0,0,0,0,0,0,0,0,3, +13,11,15,16,15,3,-45,-64,-37,-13,26,67,27,-27,-78,-80,-60,-37,-15,-14,-13,3,0,-2,-1, +1,0,0,0,0,0,0,0,1,-1,2,3,87,103,62,-1,-83,20,58,27,36,-18,-108,-70,-13, +61,50,35,20,15,7,11,4,-2,3,-1,0,0,0,0,0,0,0,0,-2,3,-5,11,-78,-256, +-112,-47,-92,-96,-106,-101,34,84,42,-1,-43,-48,-59,-56,-51,-40,-34,-19,-6,-10,0,0,0,0,0, +0,0,0,0,0,1,1,-5,-6,43,22,-46,-76,-82,-70,-51,-37,-48,-57,-55,-43,-29,-16,-3,10, +23,33,36,36,33,13,0,-1,0,-1,-1,-1,0,0,0,-1,0,-6,18,14,43,36,20,27,13, +-1,-20,-36,-36,-33,-33,-34,-38,-44,-34,-27,-20,-12,-3,9,13,12,7,1,2,2,1,1,0,1, +1,2,3,4,11,15,-21,-25,-26,-26,-25,-24,-23,-27,-22,-21,-17,-11,-4,3,3,2,2,3,1, +6,6,1,-1,-5,-5,-4,-2,-2,0,0,-1,-3,-8,-13,-16,-19,-11,-26,-22,-19,-16,-15,-13,-10, +-4,2,7,12,16,22,21,21,21,22,22,22,27,16,13,12,9,1,-3,-5,-7,-11,-15,-14,-16, +-13,-15,-22,7,-4,1,0,1,2,3,3,5,7,9,11,13,16,15,15,15,15,15,13,19,26, +37,14,24,36,35,32,30,28,27,24,15,4,24,15,12,-2,-15,6,0,1,-3,1,3,5,0, +-1,-3,1,1,-1,-4,-4,-2,-2,-3,1,-18,-27,-29,-14,-27,-26,-32,-31,-27,-28,-27,-25,-23,-10, +-30,-27,-27,2,4,-1,-10,1,6,13,3,-1,-6,6,4,-8,-17,-19,-9,-6,-2,-8,-27,-10,-7, +-19,-22,-6,-16,-15,-8,-3,1,1,-6,-14,-14,-5,-10,7,15,10,-7,13,19,36,11,3,-10,16, +16,-2,-18,-22,-6,-6,0,-19,-21,-15,-8,-15,-8,2,0,4,1,1,-1,2,-3,-7,-14,-8,-12, +3,11,-7,-34,-3,19,50,14,-4,-22,19,13,-28,-63,-64,-30,-14,-3,-21,-25,-9,-6,1,4,0, +0,-1,-1,0,0,0,1,2,-6,-7,9,27,63,79,118,74,50,54,41,38,45,48,76,108,127, +102,53,9,-7,-24,-24,8,4,0,-2,0,0,0,0,0,0,0,-1,0,0,4,7,35,46,32, +8,-37,-58,-43,-10,28,60,25,-23,-69,-64,-39,-6,2,8,-7,-1,1,-3,1,0,0,0,0,0, +0,0,0,0,1,-2,12,77,97,54,3,-51,55,107,84,99,37,-63,-22,33,100,94,68,31,25, +25,18,1,2,1,0,-1,0,0,0,0,0,0,0,-1,2,-5,8,-80,-248,-78,-3,-7,-24,-56, +-84,22,70,52,5,-37,-40,-45,-37,-28,-22,-20,-20,-18,-8,0,0,0,0,0,0,0,0,0,0, +1,1,-1,1,-12,-11,-6,-28,-34,-26,-8,6,-14,-29,-31,-26,-14,-6,1,10,25,29,36,37,24, +11,-2,-1,-1,-1,0,0,0,0,0,-1,0,-5,7,0,16,37,43,41,34,24,10,1,-18,-25, +-29,-26,-28,-33,-21,-12,-5,2,8,11,14,12,3,2,2,1,1,0,0,0,0,1,3,3,9, +18,-20,-14,-7,-11,-8,-7,-6,-6,-5,-5,-7,-4,-2,1,2,2,3,5,8,8,-1,-3,-4,-5, +-5,-2,-1,0,0,1,0,-1,-6,-11,-19,-17,-28,-20,-14,-9,-4,0,4,8,11,14,17,18,19, +21,21,22,23,23,24,26,18,18,13,8,4,1,-2,-4,-7,-8,-9,-13,-14,-16,-17,-16,1,8, +8,9,10,12,13,15,15,16,17,18,19,20,20,20,20,20,20,21,15,9,7,12,6,4,3, +2,1,0,-1,-2,-2,4,-4,-4,20,-12,4,-13,-8,-8,-10,-6,-6,-4,-9,-10,-14,-8,-8,-11, +-13,-14,-13,-12,-11,-16,1,6,2,-3,4,3,-1,-1,3,4,6,7,6,-2,1,8,7,-8,-8, +-6,-13,-3,1,6,-6,-12,-19,-6,-7,-19,-29,-31,-24,-17,-15,-14,1,-8,-1,-14,-14,-5,-13,-10, +-3,-2,-3,4,-6,-6,-2,-8,6,-1,-1,5,-10,11,16,26,1,-9,-27,3,5,-11,-30,-35,-24, +-18,-17,-18,-6,-10,-5,-10,-1,2,1,2,1,1,0,1,0,-4,-5,-4,2,-5,-4,-4,-27,6, +28,47,9,-16,-44,3,1,-37,-75,-79,-52,-28,-23,-23,-12,-13,-1,1,2,-1,0,-1,0,0,0, +-1,0,2,-4,-6,32,24,27,50,91,56,36,32,17,12,14,13,38,71,104,88,25,-3,-23,-15, +-3,3,3,-2,0,0,0,0,0,0,0,0,0,0,0,10,21,20,15,26,15,-18,-35,-29,-6, +21,47,29,-10,-58,-70,-56,-28,-9,-6,-1,7,0,-2,1,0,0,0,0,0,0,0,0,0,0, +-1,3,69,85,50,3,-48,41,84,60,62,8,-73,-51,-3,65,73,62,33,27,14,12,3,-1,2, +-1,0,0,0,0,0,0,0,0,-1,1,-3,5,-72,-214,-62,12,2,-10,-46,-94,16,72,76,23, +-21,-30,-40,-38,-37,-31,-32,-24,-13,-7,2,0,1,0,0,0,0,0,0,0,0,0,1,1,-12, +-18,-4,-10,-30,-19,-7,-2,-15,-27,-24,-19,-9,-3,3,11,22,30,32,33,26,7,-3,-1,-1,0, +0,0,0,0,0,0,1,-4,4,-5,39,48,35,36,23,10,-7,-14,-27,-30,-32,-29,-27,-29,-17, +-10,-8,-1,6,14,16,12,4,1,1,1,0,0,0,0,0,-1,2,0,9,20,-8,-11,-12,-12, +-11,-9,-9,-10,-9,-9,-10,-10,-9,-8,-7,-6,-5,-2,-2,5,3,-2,-3,-5,-3,-1,0,0,1, +1,1,2,-2,-4,-6,-8,-14,-18,-16,-12,-9,-8,-6,-3,0,3,5,8,10,14,14,15,16,17, +17,18,22,13,10,6,3,-2,-4,-5,-6,-9,-12,-13,-14,-13,-14,-17,8,-2,0,1,1,2,3, +4,4,5,6,7,8,10,10,10,10,10,11,9,18,22,22,13,19,19,18,16,14,13,12,11, +11,5,10,11,9,-13,-20,-8,-9,-9,-12,-10,-10,-6,-11,-12,-15,-10,-10,-12,-14,-15,-14,-13,-12, +-11,-21,-21,-8,-20,-21,-9,-14,-15,-11,-11,-10,-7,-19,-18,-10,-20,-16,-12,-6,-9,-16,-13,-10,-1, +-12,-16,-23,-9,-9,-20,-28,-31,-27,-21,-15,-19,-17,-12,-13,-19,-17,-8,-12,-11,-6,-5,-3,0,-8, +-14,-14,-12,-13,-7,3,-1,-12,-7,-6,16,-10,-17,-35,-5,-3,-19,-33,-38,-30,-23,-16,-24,-19,-14, +-8,-5,1,3,2,4,2,2,0,1,0,-4,-10,-10,-12,-10,4,-9,-27,-21,-8,26,-10,-31,-55, +-7,-6,-43,-76,-83,-64,-41,-23,-29,-19,-7,-1,3,0,-1,-1,-2,-1,-1,0,-1,0,2,0,-6, +5,6,19,32,75,41,20,11,17,21,24,22,42,70,100,88,44,7,-12,-24,-11,6,0,-1,0, +1,0,1,1,0,0,0,0,-1,0,1,6,15,33,31,20,-23,-45,-41,-11,18,40,28,-6,-54, +-71,-67,-47,-29,-12,-7,3,0,-1,1,0,0,0,0,0,0,0,0,0,1,-1,3,54,73,40, +-11,-79,-8,36,29,59,24,-54,-47,-13,45,69,67,41,32,22,6,-6,1,1,-1,0,0,0,0, +0,0,0,0,-1,1,-3,1,-64,-189,-73,-25,-31,-35,-60,-89,-13,38,58,10,-27,-35,-44,-44,-41, +-34,-29,-27,-19,-3,1,0,0,0,0,0,0,0,0,0,0,0,1,4,-39,-71,-33,-29,-44,-38, +-26,-16,-26,-39,-43,-36,-24,-18,-5,6,20,25,28,27,15,3,-2,0,0,0,0,0,1,0,1, +0,1,-3,3,-15,27,28,23,23,16,9,-4,-13,-22,-24,-26,-26,-29,-32,-21,-13,-6,2,10,16, +16,10,1,2,0,0,0,-1,-1,-1,-1,-1,1,0,5,12,-14,-10,-7,-11,-11,-12,-12,-13,-13, +-14,-16,-14,-12,-11,-9,-7,-5,-4,-3,-2,-6,-6,-4,-4,-1,1,1,2,2,3,2,3,0,-4, +-8,-9,-19,-19,-15,-13,-10,-9,-8,-6,-2,2,5,8,9,12,12,13,15,16,17,18,14,9,3, +0,-3,-5,-6,-7,-8,-9,-10,-12,-14,-15,-18,-17,-6,-3,-2,-2,-1,-1,0,0,1,2,3,4, +5,7,7,7,8,8,8,9,4,4,10,1,0,6,4,2,1,0,-1,-1,-6,-6,1,-6,4, +-3,3,-2,-1,0,-3,1,2,5,0,-1,-5,0,0,-2,-4,-4,-4,-3,-3,-3,1,-4,-16,1, +-5,-13,-16,-15,-11,-10,-9,-6,-2,2,-16,-3,-5,1,0,0,-6,3,9,16,4,-1,-11,3,3, +-6,-12,-15,-13,-7,-6,-4,-9,-3,-2,-11,-10,0,-3,-2,1,1,1,5,-2,-7,-3,-2,4,2, +5,8,-5,14,21,37,14,4,-19,10,13,2,-11,-16,-13,-7,-5,-10,-6,-7,-4,-1,1,1,1, +1,0,0,-1,-1,1,-1,-5,-2,-1,-2,2,-1,-21,6,29,56,21,-4,-35,11,16,-13,-39,-47, +-37,-19,-12,-16,-12,-5,1,1,0,-1,-1,0,0,0,0,0,0,1,0,-3,17,25,25,40,80, +60,47,37,38,36,29,20,29,48,86,82,40,20,5,-1,0,4,-1,0,0,0,0,0,0,0, +0,0,0,0,-1,3,15,19,23,35,26,1,-17,-25,-1,19,34,33,7,-32,-51,-46,-20,-9,-2, +3,4,-1,0,1,0,0,0,0,0,0,0,0,0,0,1,-2,43,66,38,5,-25,41,83,75, +76,32,-35,-26,8,60,84,78,46,36,22,13,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,-1,-2,-53,-150,-38,25,55,36,-7,-68,-8,41,77,31,-5,-20,-25,-24,-24,-20,-23,-23,-15,-1, +1,0,0,0,0,0,0,0,0,0,0,0,0,6,-44,-53,28,40,18,22,25,20,5,-9,-6, +-9,-3,-2,2,8,17,23,27,30,18,2,-2,0,0,0,0,0,0,0,0,0,0,0,0,-8, +27,41,35,30,22,14,3,3,-16,-23,-27,-22,-19,-17,-5,1,2,9,13,16,16,9,1,1,0, +0,0,0,-1,-1,-1,-1,0,0,0,16,-2,1,1,0,0,0,1,1,0,-2,-5,-8,-10,-13, +-11,-9,-7,-5,-3,1,-3,-5,-3,-2,0,1,1,1,1,1,2,2,2,0,-1,0,-16,-11,-9, +-6,-3,-1,0,3,3,3,4,4,5,6,7,8,9,10,11,14,14,8,5,0,-2,-2,-2,-3, +-4,-4,-5,-7,-9,-11,-12,-11,3,0,0,1,2,3,3,4,4,4,4,4,4,5,5,5,6, +6,7,6,10,9,4,8,7,0,-1,-2,-3,-3,-4,-5,0,2,-5,1,6,-16,-14,-16,-12,-13, +-14,-14,-14,-11,-15,-16,-19,-14,-14,-16,-17,-18,-18,-16,-15,-17,-14,-8,4,-15,-10,1,-2,-2,1, +1,2,5,-8,-15,4,-7,-3,-18,-11,-13,-16,-16,-15,-6,-17,-21,-29,-15,-14,-22,-28,-31,-31,-25, +-20,-20,-4,-10,-12,-12,-8,-4,-5,-5,-3,-3,-3,0,-5,-9,-10,-12,-8,-15,-7,-7,-13,-13,-13, +6,-17,-23,-42,-14,-11,-22,-31,-37,-36,-27,-22,-19,-10,-9,-2,2,2,2,2,2,1,1,1,1, +2,1,-3,-8,-7,-18,-6,-10,-21,-23,-13,14,-18,-38,-63,-19,-13,-41,-64,-74,-70,-47,-31,-25,-10, +-3,2,0,-1,-1,-1,-1,-1,0,0,0,-1,0,2,-3,7,0,-5,6,45,23,8,-11,7,14, +8,3,13,37,69,67,32,10,-9,-13,1,2,0,0,1,0,0,0,0,0,0,0,0,0,-1, +1,7,5,19,29,27,-4,-22,-27,-8,10,25,31,10,-31,-59,-68,-59,-39,-22,-6,3,-2,0,0, +0,0,0,0,0,0,0,0,0,0,2,-3,32,49,26,-13,-72,-33,-1,4,27,9,-43,-55,-37, +9,45,58,45,35,19,2,-3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,-40,-119, +-58,-28,-17,-23,-43,-69,-28,15,59,21,-9,-25,-34,-38,-41,-35,-30,-25,-11,1,0,0,0,0,0, +0,0,0,0,0,0,0,-1,8,-39,-81,-18,1,-17,-15,-14,-15,-22,-32,-34,-32,-23,-20,-7,4, +13,19,20,21,11,-1,-1,0,0,0,0,0,0,0,0,0,1,-1,2,-7,30,22,8,6,0, +-5,-14,-18,-20,-20,-21,-22,-23,-22,-13,-7,-3,4,10,17,15,6,0,1,-1,0,-1,-1,-1,-1, +-1,-1,-1,-1,0,6,-4,-3,-4,-5,-8,-9,-10,-13,-13,-16,-17,-17,-16,-15,-14,-12,-10,-9,-10, +-8,-7,-5,-2,0,1,1,1,1,2,2,2,2,2,1,1,-1,-9,-14,-13,-12,-12,-12,-12,-12, +-9,-6,-3,-1,1,2,3,4,5,6,8,8,9,1,-3,-3,-3,-4,-4,-4,-4,-5,-5,-6,-7, +-9,-12,-13,-6,-8,-7,-7,-7,-7,-7,-7,-6,-6,-5,-4,-4,-2,-2,-2,-2,-1,-1,-1,0,3, +10,-4,0,5,3,2,1,0,0,-1,-5,-8,3,-3,-5,-1,-5,1,0,0,-2,1,2,5,1, +0,-4,0,1,0,-1,-2,-3,-1,-2,1,-5,-11,-20,-4,-12,-17,-18,-17,-14,-14,-13,-11,-10,-3, +-19,-12,-13,0,1,0,-4,1,5,13,4,-1,-9,2,4,-3,-6,-9,-10,-6,-4,-3,-13,-2,-5, +-6,-3,2,1,2,2,2,2,4,-1,-6,-6,-1,-4,-3,5,4,-3,7,11,30,10,3,-16,6, +9,1,-4,-8,-10,-6,-2,-7,-6,-4,-1,2,1,0,0,0,0,0,0,-1,1,1,-2,-3,-5, +-6,3,-2,-14,-2,15,42,14,-6,-31,4,12,-8,-21,-30,-33,-20,-10,-11,-9,0,0,0,-1,0, +0,0,0,0,0,0,0,0,1,0,4,17,17,24,55,44,34,19,37,40,29,20,21,32,63, +66,46,30,19,5,0,2,-1,1,0,0,0,0,0,0,0,0,0,0,-1,0,4,16,23,32, +25,6,-10,-23,-4,11,21,29,14,-17,-38,-42,-27,-19,-8,-1,-1,0,0,0,0,0,0,0,0, +0,0,0,0,-1,1,-2,19,41,22,-1,-24,10,44,53,60,35,-11,-18,0,35,64,68,46,35, +24,10,-1,1,-1,0,0,0,0,0,0,0,0,0,0,0,1,-5,-26,-90,-32,6,54,31,-1, +-41,-25,9,57,29,5,-14,-16,-17,-19,-16,-16,-19,-10,2,0,0,0,0,0,0,0,0,0,0, +-1,1,-3,9,-41,-64,34,54,38,35,30,20,5,-7,-7,-13,-8,-7,-2,3,10,14,18,22,9, +-2,0,0,0,0,0,0,0,0,0,0,0,1,-2,4,16,24,19,11,8,5,1,4,-8,-14, +-17,-15,-12,-10,-1,4,7,12,13,15,12,4,0,0,0,0,0,0,0,0,0,0,-1,0,-2, +4,1,7,8,6,5,3,3,3,0,-3,-7,-9,-11,-13,-11,-10,-8,-7,-5,-4,-7,-4,-1,1, +0,0,0,0,0,0,0,1,1,2,0,3,-14,-7,-6,-5,-3,-2,-1,1,0,0,1,0,0, +-1,1,1,3,4,4,7,4,2,-1,-2,-2,0,0,0,0,0,0,-1,-3,-6,-8,-7,-3,-1, +-2,-1,0,0,0,1,0,0,0,0,0,-1,0,0,1,1,1,2,1,-1,-5,0,-4,-8,-9, +-9,-10,-10,-10,-10,-7,-3,-10,-7,1,-10,-4,-12,-8,-8,-9,-9,-9,-6,-9,-10,-13,-10,-9,-10, +-11,-11,-12,-11,-10,-12,-4,1,2,-7,-2,1,0,0,2,2,3,5,-1,-7,3,0,1,-11,-8, +-7,-9,-9,-7,-2,-10,-14,-20,-10,-9,-14,-17,-20,-22,-17,-14,-11,1,-6,-6,-3,-2,-1,-1,-1, +-1,-1,-1,-1,-1,-3,-5,-7,-2,-12,-6,-3,-6,-5,-6,7,-9,-15,-29,-11,-7,-13,-17,-21,-25, +-18,-15,-10,-2,-3,2,1,1,0,1,1,0,0,0,0,1,1,1,-3,-2,-14,-6,-4,-9,-9, +-2,16,-9,-26,-46,-15,-8,-24,-36,-45,-49,-34,-24,-15,-2,-1,0,-1,0,0,0,0,0,0,0, +0,0,-1,0,0,7,4,-10,-1,26,16,7,-12,11,16,5,-2,1,16,42,47,27,16,3,2, +5,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,3,4,9,24,25,10,-3,-15,-4, +6,14,27,16,-14,-39,-52,-48,-33,-22,-5,1,-1,1,0,0,0,0,0,0,0,0,0,0,-1, +2,-3,11,28,14,-7,-40,-24,-3,9,18,8,-22,-40,-32,-1,30,46,40,31,16,3,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,-4,-13,-64,-36,-15,18,2,-18,-39,-28,1,48,28, +9,-11,-18,-23,-27,-23,-20,-18,-4,1,0,0,0,0,0,0,0,0,0,0,0,1,-2,6,-20, +-56,16,36,23,19,12,2,-7,-16,-15,-19,-15,-13,-5,1,5,12,13,16,6,-2,1,0,0,0, +0,0,0,0,0,0,0,1,-1,3,20,17,1,-4,-7,-11,-15,-14,-14,-13,-14,-14,-13,-10,-3, +1,2,6,9,14,10,1,0,0,0,0,0,0,0,0,0,0,0,0,-1,-2,4,6,3,3, +0,-2,-4,-6,-8,-10,-13,-13,-13,-14,-13,-11,-10,-9,-10,-8,-6,-3,1,1,0,0,0,0,0, +1,1,1,1,1,2,3,-5,-8,-8,-9,-9,-9,-10,-10,-9,-7,-6,-6,-5,-4,-3,-3,-2,-1, +0,1,3,-3,-3,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-3,-5,-7,-4,-7,-6,-6,-6,-7,-7, +-7,-7,-7,-7,-7,-6,-6,-6,-5,-5,-5,-4,-5,-1,2,4,-4,-1,0,0,-1,-1,-2,-2,-2, +-3,-6,-1,-2,-6,-4,-8,-2,-3,-3,-3,-3,-3,0,-3,-4,-6,-3,-3,-4,-4,-4,-5,-4,-4, +-2,-8,-10,-12,-7,-10,-8,-9,-8,-7,-7,-7,-5,-8,-6,-11,-11,-10,-5,-2,-3,-5,-4,-3,3, +-3,-6,-11,-3,-2,-6,-7,-9,-11,-9,-6,-5,-8,-3,-4,0,1,2,1,2,2,2,1,2,1, +-1,-4,-3,-6,-7,1,-1,-2,-3,-2,12,-1,-5,-16,-4,-1,-5,-6,-9,-13,-9,-5,-6,-4,0, +1,1,0,0,0,0,0,0,0,-1,0,1,1,-1,-3,-10,0,-4,-7,-9,-2,17,-2,-14,-28, +-6,0,-11,-17,-24,-31,-22,-12,-9,-3,1,-1,0,0,0,0,0,0,0,0,0,0,0,-1,1, +0,3,2,5,26,20,14,-1,22,27,16,10,8,16,35,40,36,25,16,5,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,-2,9,16,22,21,8,-3,-16,-5,4,11,21,13,-9, +-27,-36,-33,-26,-15,-7,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,9, +-6,-27,-18,2,18,29,21,-4,-19,-14,8,32,42,36,27,19,5,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,-2,-2,-47,-29,-13,29,11,-7,-22,-28,-9,32,23,12,-7,-10,-13,-15, +-13,-11,-12,-3,1,-1,0,0,0,0,0,0,0,0,0,0,1,-2,3,-12,-45,26,41,36,29, +22,12,1,-9,-11,-15,-12,-11,-5,0,4,7,10,13,2,-2,1,0,0,0,0,0,0,0,0, +0,0,1,-2,4,8,8,0,-6,-6,-7,-8,-5,-7,-8,-9,-9,-8,-6,-1,3,6,9,10,12, +6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,3,8,8,7,5,2,1,-1,-4, +-6,-9,-9,-10,-10,-9,-8,-7,-7,-6,-6,-6,-1,1,0,0,0,0,0,0,0,0,0,0,1, +1,1,-8,-5,-5,-5,-5,-5,-4,-4,-4,-3,-3,-3,-4,-5,-4,-3,-2,-2,-1,0,-2,-2,-2, +0,1,1,1,1,1,1,1,1,1,-1,-3,-3,-6,-3,-3,-3,-3,-3,-3,-3,-3,-4,-4,-4, +-4,-4,-4,-4,-3,-3,-3,-2,-4,-5,-6,-5,-6,-6,-6,-6,-6,-6,-7,-7,-7,-5,-8,-8,-4, +-4,-1,-5,-3,-3,-3,-3,-3,-1,-3,-4,-6,-4,-3,-4,-4,-4,-5,-4,-4,-4,0,0,-4,-1, +0,-1,-1,-1,-1,-1,0,0,0,-2,-3,0,-1,-4,-3,-3,-3,-2,-1,2,-3,-5,-9,-4,-3, +-5,-6,-8,-10,-8,-6,-4,0,-2,0,0,0,1,1,0,0,0,0,0,0,0,-1,-2,0,-7, +-3,-1,-1,0,1,8,-1,-5,-13,-4,-2,-4,-5,-7,-11,-8,-6,-3,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,1,-8,-4,-1,-2,-1,4,14,-1,-11,-22,-7,-2,-8,-12,-17, +-24,-17,-12,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,6,-3,1,14, +12,9,-5,13,16,6,0,-1,5,20,26,22,18,11,9,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,-1,6,6,16,17,12,5,-8,-2,2,8,18,14,-2,-18,-27,-26,-20,-14, +-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,6,-3,-14,-11,1,15, +16,10,-5,-18,-15,1,19,29,27,21,13,5,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,-1,3,-28,-19,-4,30,15,0,-15,-19,-5,27,23,16,-1,-5,-8,-11,-10,-9,-8,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,-20,30,42,39,32,25,14,5,-3,-3, +-9,-8,-7,-3,-1,1,5,7,10,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +5,9,-3,-7,-9,-10,-11,-7,-7,-7,-7,-6,-5,-2,1,4,5,7,7,9,3,-1,0,0,0, +0,0,0,0,0,0,0,0,0,1,-2,4,9,6,7,4,3,1,-1,-3,-5,-7,-7,-8,-9, +-8,-7,-6,-6,-5,-5,-2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,-3,-3,-4, +-4,-5,-4,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,-3,-2,-1,-2,0,0,0,1,1,1, +1,1,1,1,0,0,-1,-1,-3,-3,-3,-3,-3,-4,-4,-4,-4,-4,-5,-5,-5,-5,-5,-5,-4, +-4,-4,-4,-2,-2,-3,-2,-1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-4,-3,-5,-4,-5,-4,-3,-3, +-3,-4,-4,-3,-4,-4,-5,-4,-4,-4,-4,-4,-5,-4,-4,-3,-5,-5,-4,-2,-2,-1,-1,-1,-1, +-1,-1,0,-2,-2,-4,-5,-5,-5,-3,-3,-3,-5,-4,-2,-5,-6,-8,-5,-4,-5,-6,-7,-8,-7, +-5,-4,-3,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,-1,-7,-2,-3,-1,-4,-5, +1,-5,-7,-11,-6,-4,-6,-5,-7,-9,-7,-5,-4,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,-8,-2,-2,-1,-6,-6,2,-7,-12,-18,-9,-5,-9,-10,-14,-19,-15,-10,-5,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,-1,-4,-3,5,4,1,-9,7,11, +4,1,0,5,12,17,18,13,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,-1,3,7,10,12,7,2,-7,-3,1,5,12,9,-2,-13,-20,-22,-19,-13,-6,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,4,2,-5,-17,-19,-12,1,7,6,-2,-14,-15, +-5,8,17,18,14,10,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,-15, +-17,-11,9,1,-5,-9,-16,-9,13,14,11,0,-4,-7,-9,-8,-6,-5,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,-1,2,-12,14,22,23,18,13,7,1,-5,-8,-10,-9,-8,-4,-2, +0,3,4,5,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,-6,-9,-10, +-10,-9,-7,-5,-4,-3,-4,-4,-2,0,2,3,5,5,6,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,-1,1,6,5,4,3,1,0,-2,-4,-5,-6,-6,-6,-5,-5,-4,-4,-4,-4, +-4,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,-3,-3,-4,-4,-4,-4,-5, +-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,0,0,1,0,1,0,0,0,0,0,1,0, +1,0,0,-4,-3,-3,-3,-3,-3,-3,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-4,-4, +-3,-1,-2,-1,-1,-1,-1,-1,-1,-1,-2,-1,-3,-4,-4,-1,-1,-1,-1,-1,-1,-1,-1,0,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-3,1,0,0,0,0,0,0,0,0,0,1, +-3,-2,-2,-1,-1,-1,-1,0,0,1,-1,-1,-2,-1,-1,-1,-1,-2,-2,-2,-2,-1,-1,1,1, +0,0,0,0,0,0,0,0,0,0,0,1,1,1,-2,0,0,0,0,0,3,0,-1,-3,-1, +-1,-1,0,-1,-2,-2,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +-2,-1,0,0,0,1,4,0,-3,-6,-2,-1,-1,-1,-3,-6,-5,-3,-1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,2,0,0,4,4,4,-1,6,7,3,1,0,2,5, +8,10,8,7,4,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,2,4,5, +6,6,3,-3,-1,0,2,6,5,1,-4,-7,-8,-7,-5,-2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,1,-1,-3,-4,0,6,6,5,1,-5,-5,0,5,9,9,7, +5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-5,-6,-1,12,7,2, +-2,-7,-4,7,9,8,2,0,-1,-2,-2,-2,-1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,13,17,18,15,12,9,4,1,-1,-3,-3,-3,-2,-1,0,1,2,2,-1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,-2,-4,-5,-5,-4,-2,-2,-2, +-2,-1,-1,0,1,2,2,3,3,3,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,4,3,3,3,2,1,0,-1,-1,-2,-2,-2,-3,-2,-2,-2,-2,-1,-2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,-1,-1,-1,-1,-1,-1,-2,-2,-2,-2, +-2,-2,-2,-2,-2,-2,-2,-1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-2,-2,-2,1,0,0,0, +0,0,0,0,0,0,1,-2,-1,-2, }; -const UWord32 defaultHRIR_rom_AlphaR32_fx[470 * 86] /*Q30*/= { -0x100cb860,0x0eef8620,0x13822fa0,0x03bfbf7c,0xfc41efd4,0xf5ba68d0,0x0822d810,0xfd7a6134,0xf5eecc80,0xf57c62e0,0xf5e038f0,0xf7b60930,0xf5f98590,0xf5a102c0,0xf5fd0030,0xfd6bb708,0x060f7ee0,0xf515aa30,0xfd1b6c7c,0x030560c0,0x11b23540,0x0de148b0,0x0edb67d0,0x0f0d2c70,0x0f1faf20, -0x0f42a240,0x0f674600,0x0f89e680,0x0fd14ea0,0x1029fb20,0x1095f420,0x10f36760,0x117ff400,0x113b8180,0x10e3f6e0,0x0ffe4180,0x101a20a0,0x12abb7e0,0x10c05ec0,0xfa5f0c98,0x0c7b5470,0x03e36f60,0x046c52a0,0x07fa7bf8,0x06b65ea0,0x0aa712f0,0x07cc00b8,0x03c8cd8c,0x07173000,0x07dd44e8, -0x06f32888,0x03515f80,0x058072f8,0x05db9da8,0x0744ab60,0xfc64e6dc,0x0d4f09e0,0x0f91bbc0,0x0f43d870,0x1065b780,0x10745600,0x10ecc420,0x1147ca40,0x118bce20,0x1239ed60,0x13545de0,0x14bf5420,0x16135d00,0x175ca760,0x172f3020,0x16143f40,0x138ab280,0x12bc2cc0,0x15e153c0,0x0f8672c0, -0x0406bf50,0x07372178,0x015ae244,0x03013768,0x029bfe5c,0x0297aac0,0xfffff5aa,0x04fe9b30,0xfe9d21e2,0x064e0070,0xffb701df,0x03cc936c,0x002edd24,0x035baf34,0x0348d624,0x03386884,0x02267b18,0x08c95170,0x0f5e3a00,0x0e580210,0x10d1b000,0x10e66d20,0x11d12ae0,0x129c5ac0,0x134a7a00, -0x14c361a0,0x16d906c0,0x190dfdc0,0x1b96f4e0,0x1e025d20,0x1d738180,0x1b4dd0e0,0x169c8de0,0x149f13a0,0x18339d60,0x0c289760,0x016a4864,0x06b972e8,0x038b4df0,0x02414a6c,0x02ecae14,0x01d1fa66,0x01b42fde,0x00b9df54,0x02475880,0x00349299,0x004cf80d,0x016e8520,0x00e923bd,0x0222c4b4, -0xfeeba6d8,0x032eafa0,0xffafbf59,0x06dab0c0,0x0d7c1560,0x0dc92ea0,0x108a2b40,0x10925780,0x11cf9800,0x12f17da0,0x13878e40,0x15905040,0x18f53ec0,0x1cfaa5a0,0x215aa000,0x25b1c000,0x2557bb00,0x21979f80,0x1a4c0d20,0x15f54b40,0x20ddd680,0x1235f080,0x04157ad0,0x05243418,0x018b6fae, -0x00528d44,0x030e6d14,0x01345fc2,0x0169e4f8,0x01221076,0x014141ee,0x0139247a,0x008b429c,0xffc34559,0x00821995,0x01e852e8,0x009f567d,0x03b489d4,0x00dc183e,0x079b8ae8,0x10026ec0,0x0fdb7fe0,0x1555d240,0x17615800,0x19d7b5c0,0x1aacf460,0x1f009d20,0x219d3a00,0x21ef5500,0x27681f80, -0x28f2a3c0,0x2842ad80,0x26ad78c0,0x23c60200,0x208e9300,0x1d491ac0,0x219ce480,0x0ce29300,0xffa3c463,0x06bf73c0,0x07461b70,0x03872f84,0x04fbce70,0x016f4d64,0x01be7814,0xffefa4ba,0x00f8d616,0x00d8c047,0x00b2c54c,0x019f86d8,0x02019bb4,0x02698e4c,0x00ac99d6,0x03976b30,0xffd9c58d, -0x089983a0,0x12301380,0x12c1f6c0,0x1944c980,0x1a65a240,0x1ccb4600,0x1e9c5e40,0x1d707580,0x1d9bcc40,0x1ef59560,0x22f2aa00,0x25f06040,0x27fde280,0x29f699c0,0x28b00700,0x25ee9b00,0x1f211ea0,0x312f7080,0x116472c0,0xfa052d08,0x0746d8d0,0xfd0082b0,0x0573d5b8,0xfd9b0110,0x0280756c, -0x0046a662,0x02a77de8,0x0134cb3c,0x00b6c917,0x0159fb3a,0x016cec7e,0x01c75094,0x04154b30,0x0118b56e,0x04cc63b0,0x020a2dec,0x081a9f20,0x13ab0400,0x12f10580,0x19352080,0x1f1f7140,0x25f70840,0x2c211440,0x2db7ff80,0x2c27e7c0,0x276e4040,0x2212b840,0x23918ec0,0x29e64f80,0x2f92c600, -0x344dbd80,0x3d7b1740,0x32a068c0,0x3c884740,0x195ef380,0xffb120d3,0x0eab7430,0xff48d1ac,0x0763faf0,0x02a69c24,0x01ff8eea,0x0024bc2b,0x02144ecc,0x02884268,0x01b2d2c8,0x00ef8c56,0x0027440c,0x022baf54,0x017ab64a,0x01b11da6,0x05df3a60,0xfe3ec348,0x0986f0c0,0x122bec00,0x11d75e40, -0x16e21420,0x1aba6b60,0x1eff1380,0x22423fc0,0x25a6d0c0,0x278a6480,0x28438c40,0x294edf40,0x290a8a40,0x27fdf4c0,0x2b9bbf80,0x2e4fdf40,0x362476c0,0x34657140,0x323f0d80,0x215d4900,0x01116bce,0x05c94340,0x08426a20,0x00c0b3a9,0x05d8fc60,0x05978ad0,0x00951bf8,0x01ead7b8,0x000d6ebb, -0x0199b11c,0x02476098,0x01da8a34,0x01cb9da2,0x010933c0,0x036a6b60,0x044b1618,0xfe0c03dc,0x0afb1230,0x1171a560,0x0ee13d40,0x10fc6c20,0x13855b60,0x186de040,0x1e4caf40,0x2204c380,0x252fe7c0,0x27ca9040,0x23561000,0x2185c300,0x23b98540,0x232a5d00,0x25a36640,0x2cae7540,0x2cac9c80, -0x2038fb80,0x17cc4640,0xfec268bc,0x04adce28,0x00fb6152,0x00790ccf,0x03c7bbfc,0x01dd34f4,0x03c2ebd8,0x02c2d274,0x053124e8,0x00bb9000,0x0137e73a,0x0241b77c,0x03813464,0x03a4fd08,0x057c61a0,0x04da6fd0,0x01ed417a,0x099a4e40,0x118b1900,0x1006ada0,0x11e92c80,0x146bfa40,0x168ac9a0, -0x172cb560,0x1742fa60,0x161e7900,0x1503b460,0x16257920,0x18ebf3e0,0x1ba7bce0,0x1b4dad80,0x1afa73c0,0x1b581180,0x1b2597a0,0x16a8c480,0x0db35050,0x04e42ee8,0x0a54f250,0x03a67ed4,0x04a48630,0x02f7f66c,0x02912a78,0xfef205fe,0x04ad1280,0xfd2632ec,0x07034270,0xfea676d8,0x03396750, -0xfef72e02,0x02e683e4,0x013098d4,0x031f78c0,0x013ae848,0x099ea160,0x0f9b0700,0x0be130f0,0x0d326140,0x0dca9c10,0x0f421ac0,0x100d0c80,0x13574160,0x1618a7e0,0x18bf93a0,0x1953a5e0,0x197d3d00,0x19e86a80,0x192efa40,0x180ce760,0x17bdb080,0x1447c640,0x117b2b20,0x10401660,0xf89a8588, -0x0af9d110,0x0289699c,0x039df114,0x0842a7c0,0x071446f0,0x0c1c8a10,0x09299200,0x04114050,0x08181400,0x09d57090,0x08a85100,0x04220e58,0x06b75e18,0x07568458,0x07f88248,0xfbcb2458,0x0c63dac0,0x0d6ee890,0x0ca43680,0x0d3b0060,0x0ce5d2a0,0x0d03eca0,0x0cbfcc20,0x0ec40d10,0x0ff74a60, -0x11591880,0x126a44e0,0x13aad180,0x14f2dd80,0x13f92e20,0x12fcbfe0,0x128f8fe0,0x11316e80,0x107ab7c0,0x1535bf80,0x0353130c,0xfb8a31b8,0xf4c7b280,0x08abcc90,0xfc34c2c0,0xf44d47f0,0xf382d1c0,0xf3b7b830,0xf60c46c0,0xf3d74cb0,0xf3259030,0xf3a89220,0xfc1005fc,0x061a86c8,0xf2e478f0, -0xfb93f3a8,0x0254a814,0x13ecf4a0,0x0f7c8a00,0x1037f1e0,0x10333620,0x102eb340,0x1039f8c0,0x0ffdba10,0x107f8180,0x10d66b80,0x11337d20,0x11bc39a0,0x122f8360,0x12ec6b20,0x1267ef20,0x122c99c0,0x11dbeda0,0x11b7c760,0x13698220,0x1dd3cc20,0x1c2dfa40,0x1ae77fa0,0x20c65600,0x1f9ab920, -0x17273cc0,0x1eb4ab40,0x1e4f3b80,0x17ffa820,0x17bf2cc0,0x172e4b60,0x1632c1c0,0x16192120,0x161a36c0,0x158a8500,0x1d86c1e0,0x1e0595e0,0x153ec320,0x1daa8f00,0x1ecbbe60,0x196539a0,0x1a1dc9a0,0x1abe38e0,0x1b0f2ea0,0x1b60d260,0x1bb75280,0x1c1039c0,0x1c94d880,0x1d031820,0x1d6c2240, -0x1ddb76a0,0x1e58a4e0,0x1f317b20,0x1edc9880,0x1e91a0c0,0x1de2e640,0x1d183060,0x2069ee40,0x2183b680,0x20470d00,0x1d2f7e60,0x1c79b020,0x1aa2b860,0x19dd1580,0x185a08a0,0x176e5be0,0x189e55e0,0x18c71140,0x18b08100,0x1721e0c0,0x17923dc0,0x16af4be0,0x175f8dc0,0x199efda0,0x18750960, -0x1963b880,0x1afecac0,0x19edb300,0x1bc935e0,0x1ca99060,0x1d9086c0,0x1e8845c0,0x1faee820,0x21211ec0,0x22754100,0x23a16800,0x24cb9c80,0x26755300,0x28e26200,0x28d1bc40,0x27eb5a80,0x257477c0,0x2381cec0,0x2193fe80,0x21a94280,0x20977fc0,0x1bcb2f00,0x17a91ac0,0x1560d1c0,0x13805260, -0x1221b5a0,0x105e28a0,0x0edb7530,0x0f6c61f0,0x0efbd140,0x0d9678a0,0x0f5be180,0x0ec6cc70,0x1068ca20,0x1263f460,0x124a3aa0,0x1598ae80,0x168bd320,0x173fb920,0x1a648c80,0x1ca45260,0x1e606660,0x205d4d00,0x22668680,0x2528b580,0x27530b00,0x29b62780,0x2c184780,0x2f686600,0x33a45540, -0x33027940,0x3177c0c0,0x2c284000,0x279a5080,0x238f8e00,0x2391fd80,0x1dc18520,0x17251e60,0x1211bf20,0x0f640aa0,0x0c891720,0x08c2cfc0,0x067ee620,0x04dfd9d0,0x047d8c58,0x02e8c0d8,0x03369f98,0x03c132d0,0x04683e18,0x06ebdc78,0x07287bf8,0x0a287eb0,0x0cc35d20,0x106d43c0,0x12f580e0, -0x16595740,0x19d7b120,0x1c44f6e0,0x1f20e6a0,0x221e9200,0x261e6840,0x2a108140,0x2d3d6fc0,0x30c41540,0x36b23580,0x3ede9780,0x3f7c1ec0,0x3c94d9c0,0x336e9e80,0x2bae3180,0x2c0b5fc0,0x2804e200,0x297a14c0,0x1d951480,0x15fa6ea0,0x122d0d00,0x0f3135e0,0x0b79a5b0,0x0923e5c0,0x06c49a48, -0x06ae3638,0x04ca8fb8,0x042bf648,0x03b5c278,0x061a9d18,0x0869f230,0x09f594c0,0x0db90720,0x12662ae0,0x178b7d00,0x1f6d2c80,0x2685fd00,0x2cd66140,0x307e4ec0,0x351ffcc0,0x3b2a29c0,0x3c9296c0,0x3f59fc00,0x4138af80,0x4beb6580,0x4df90100,0x4a7c3a80,0x46471480,0x42f2e300,0x4153f980, -0x3868fec0,0x3bd0b100,0x3257f840,0x2d0934c0,0x23b90980,0x1f349600,0x1663e5c0,0x11016920,0x0c6b6de0,0x091ca660,0x069fec88,0x066425d0,0x05f45ef8,0x05ad80c8,0x06ff13c8,0x0829bb30,0x0a89aba0,0x0f7072d0,0x135b72c0,0x170bb800,0x1c3d4000,0x218fe100,0x26079d40,0x2b1bc000,0x317aa140, -0x394ddc00,0x42054200,0x49ad1f80,0x4f1d3600,0x50999900,0x575beb80,0x5928fe00,0x54b44f00,0x51cc7100,0x4e249b80,0x4bcc6a80,0x4640aa00,0x3b77f2c0,0x409c7d00,0x34698c40,0x254b6040,0x227c29c0,0x1b686d20,0x11ee0f20,0x0e25c790,0x09825860,0x0ac10a60,0x0c33eb80,0x083d9a80,0x08bd75c0, -0x0a7191b0,0x0bb30b40,0x102b5ca0,0x13170ea0,0x144267c0,0x18bae260,0x1a627ee0,0x1c845a20,0x22df9780,0x293cd4c0,0x2a8e2c80,0x2e68b5c0,0x342c2800,0x3cfcb180,0x4775e280,0x523a0100,0x54757a00,0x501c1d80,0x496fb900,0x41991a00,0x3d990f40,0x359ab540,0x3d741940,0x26d03780,0x3a5b6000, -0x3aa4df00,0x24741f80,0x1cbce5a0,0x17e76440,0x112aaba0,0x0dc14260,0x0a6839f0,0x0c3726b0,0x14f8be80,0x0b7b1a30,0x0824c820,0x0ac86fe0,0x0ea5ece0,0x0fe9fdd0,0x1506b720,0x18d5a880,0x19ff5b80,0x1bec5180,0x1b358640,0x1f1a3720,0x23d8e400,0x2ce68dc0,0x3310a600,0x374f7140,0x3da69240, -0x4205e980,0x44965f80,0x4c707580,0x50572d80,0x52b72780,0x44a81980,0x38b34bc0,0x289d47c0,0x30bc8440,0x30512780,0x33f76c80,0x38ddb700,0x2935f780,0x1f9d21c0,0x19425300,0x1615b060,0x16187d60,0x10863840,0x1004b620,0x0e884c00,0x0c684390,0x0c84def0,0x0e174fe0,0x11055760,0x12a45880, -0x16e94720,0x195c8840,0x1c1a4060,0x24e6a600,0x2520d780,0x26328240,0x22dfb900,0x271b35c0,0x2b8cf440,0x32d10b40,0x3799adc0,0x3d60d6c0,0x42f62500,0x4876ff00,0x4b828f80,0x4f0bb300,0x49efa100,0x45f22300,0x3c1fb200,0x3d3acd40,0x376633c0,0x352cf7c0,0x342f6c40,0x2adb37c0,0x1fe58ce0, -0x1dc22160,0x1937cf00,0x14b38e40,0x13ba7820,0x123d1080,0x14929b80,0x0df475c0,0x0e01e5d0,0x0fefabe0,0x137af260,0x185aea00,0x1dbad400,0x1f2bfe40,0x217d0fc0,0x27279580,0x2a147300,0x29994080,0x255c4240,0x27244b00,0x2a903340,0x30378680,0x36c0ccc0,0x3e164c00,0x451ea900,0x4844f800, -0x49480980,0x483db500,0x47f3e380,0x45b89580,0x3f022a80,0x3e0022c0,0x36ecb640,0x3450b580,0x2c4d4f80,0x28fbf580,0x221d4fc0,0x1e19b480,0x1a491540,0x15b429c0,0x146700a0,0x171223c0,0x14a5afc0,0x1aa66de0,0x12ab7f40,0x18bcca40,0x14b41b20,0x1ad13200,0x1c1883c0,0x1f18c160,0x21d7c540, -0x265e4bc0,0x28e15280,0x296f2ac0,0x2b573880,0x2dea01c0,0x2fab3740,0x30f84580,0x345067c0,0x36cec940,0x3966e780,0x3bf0d840,0x3e9bd180,0x4158bc00,0x3fe45d40,0x3ecf9ac0,0x3d4074c0,0x3a4e8d00,0x30da9a00,0x32b34b40,0x22d6a640,0x2d025440,0x279d5980,0x25eb6880,0x27811780,0x24be5340, -0x278b0840,0x28811680,0x2581b600,0x286d5300,0x265983c0,0x26405280,0x22fe8800,0x250d8a40,0x27916f00,0x2598b740,0x1d822140,0x2c0b0b80,0x2b6fe3c0,0x2ce812c0,0x2dbb8040,0x2ee23940,0x3055fa00,0x31bb32c0,0x32f749c0,0x34001b80,0x34fb9900,0x35a58500,0x361c98c0,0x37361080,0x35824080, -0x3468c700,0x334562c0,0x3276ab40,0x2d8c0e40,0x2f78a300,0x2ea5f100,0x28b75a00,0x189d10a0,0x2ff17b40,0x28a52cc0,0x1a1b9600,0x19b8b260,0x1937a8a0,0x197eaa40,0x184dcae0,0x1884b000,0x18228de0,0x28249e40,0x2deda880,0x15fd64e0,0x27e76580,0x2ccb94c0,0x2d6f7e80,0x2b902080,0x2cdd1d40, -0x2d090240,0x2d5e8380,0x2d7f3f40,0x2db005c0,0x2df29400,0x2e446100,0x2e990380,0x2f0bf080,0x2f71e900,0x300a6ec0,0x2f8d9440,0x2f4dfd00,0x2ed14a00,0x2ed65600,0x32be6300,0xfcd665cc,0xfd1df144,0xf95c1e48,0x0258aca0,0x0abee510,0x19fba220,0xfe2a5e3c,0x09545430,0x17513e40,0x17c6dc80, -0x17adf860,0x17215880,0x18926920,0x190d8120,0x1951bd60,0x09a59ac0,0x005aecd3,0x1b695740,0x0ad23dd0,0x03ceb504,0xfb0eb860,0xfe3319d4,0xfce90cc4,0xfc9dfee8,0xfc9594f0,0xfc9d4294,0xfcd00224,0xfccf10e0,0xfca9cdb8,0xfc748aa8,0xfbd2b650,0xfb309f38,0xf9e43530,0xfaab1460,0xfafa31a0, -0xfbbe6658,0xfbaa0d00,0xfb0422c8,0xfaef0038,0x105a6a40,0xfe3b09be,0x055f1e00,0x061d6288,0x01e92340,0x0325690c,0xfeba9a6c,0xfff8462e,0x0403cd68,0x00c35ef2,0x017ea98e,0x01bde54a,0x071e32b0,0x056e3cf0,0x0355490c,0x049139c8,0x0f61a590,0xfeb5e188,0xfe764242,0xfd820e6c,0xfc4e30f0, -0xfc295798,0xfc3bc144,0xfceb9e9c,0xfd31c9a4,0xfcdf5870,0xfc0a1af0,0xfa281180,0xf7cabe30,0xf3fbd8f0,0xf513d670,0xf60dd4a0,0xf8a98fd8,0xf9898f28,0xfa72f270,0xfe892356,0x03fd40c0,0x01c5b480,0x0744a8e8,0x06a56a18,0x064326b8,0x047d39b0,0x06963620,0x032d57f8,0x08b77e90,0x02a6543c, -0x093dcd80,0x0461bb28,0x08c6e070,0x0622a8f8,0x06ac4000,0x08b57ce0,0x082b9d60,0x041e0668,0xff64398e,0xfe702ac8,0xfb9b23e8,0xfb7078e8,0xfbbb3540,0xfd315e34,0xfdb44e2c,0xfd92dd70,0xfc0a0684,0xf8ce9cd0,0xf3789eb0,0xeba31440,0xeeb13480,0xf0a49e20,0xf701bd20,0xf9b58f50,0xfba51180, -0x03d67684,0x097f51d0,0x0350eec8,0x04f1da60,0x06a5e148,0x0560bb48,0x0488b220,0x0315f4fc,0x037b0e4c,0x033c1724,0x04b7d5d0,0x045d25c0,0x04286748,0x0567dc30,0x0598d108,0x0999fe90,0x07f01b00,0x0ac83a50,0x06e59fd8,0x024889a0,0x002197e7,0xfc9e078c,0xfc90d808,0xfd24cfb8,0xffdc5839, -0x01c37a1c,0x00f5f519,0xfef2af36,0xf962f0b0,0xef930da0,0xe12623a0,0xe3f56da0,0xe83cc860,0xf3472fa0,0xf9e47110,0xed59b560,0xf4650540,0xfde93cc0,0x0421b4c8,0x05e1fad0,0x057bd570,0x019db0a2,0x035b286c,0x01f59e14,0x025e7a24,0x03bb7fcc,0x0497fa68,0x05795e10,0x05b520f8,0x05d79b80, -0x060a4c98,0x08c46d10,0x0981d140,0x0cab0010,0x06820ca8,0xfd409c58,0xfac96338,0xf2fc4880,0xf1d76150,0xf11498d0,0xf24e3dc0,0xf1b512c0,0xf2d44620,0xf90c33c8,0xe57227c0,0xe19e8a20,0xe35db580,0xe778c460,0xe9181800,0xe8ff5e60,0xed62cd80,0xd7e8fa00,0xfc31a240,0x0df118f0,0x087e27f0, -0x05573318,0x0a033590,0x07ecc6e8,0x0b67c010,0x07eb66a0,0x07a0ff40,0x07e57208,0x0421c658,0x02e75dd4,0x01fb10e8,0x02f05ee4,0x04573df0,0x07729a30,0x077c1660,0x0dc115c0,0x060c9f50,0xfce5c674,0xf9aa6480,0xed88a520,0xe7f84280,0xe0dfb900,0xdb843d80,0xddcb7100,0xe0f14e40,0xe6d0e460, -0xdf58be40,0xdd8abdc0,0xde0d5300,0xe3032f80,0xe32ff780,0xdd6b4480,0xd8a836c0,0xd97649c0,0xea678a80,0x0b09dd70,0x04798930,0x0aa40550,0x03198d48,0x0daa5790,0x0812c880,0x0905f570,0x07575c88,0x0e848490,0x0b850410,0x0b09b250,0x09bd72b0,0x07c04fa0,0x04cd0108,0x0b49fc50,0x08dba730, -0x08d673b0,0x0573feb0,0xfa288aa0,0xf487d980,0xe8543580,0xe3741120,0xdc307840,0xd4bc2400,0xcf297ac0,0xce689440,0xd3ddb100,0xe3e2af80,0xee535540,0xefb18b80,0xfc028438,0xfa6a6038,0xf4c2dce0,0xe56a4080,0xf6ff78a0,0xf1955310,0xff9b1681,0x02ecc10c,0x0e783b30,0x05a5abb8,0x0a5c2250, -0x09020470,0x099d63b0,0x0a5a7f30,0x13af3ba0,0x085d2cf0,0x062a82b0,0x0a49c950,0x087a54f0,0x0c286090,0x0ca83f90,0x08938320,0x0eacd410,0x037276c0,0xfc22b9c8,0xf9717f70,0xf1da3c00,0xe8283460,0xe09c72e0,0xdd241200,0xd911e200,0xdb119900,0xe20f5ca0,0xe4947560,0xeb41ea40,0xeec1a1a0, -0x01420964,0x10ea1100,0x24a1c0c0,0x033c3a90,0xf8e49ad8,0xef9cc820,0x002d3cea,0x03a2aa24,0x05c5a3c8,0x0b98bac0,0x0798ec70,0x04a93970,0x0c79ad30,0x0ba77200,0x12c67bc0,0x0c123a00,0x0aa3c180,0x0c5d95c0,0x0cb4d9d0,0x0fce7030,0x0c928d00,0x0eba1090,0x16605360,0x033d950c,0xfa27f298, -0xfa36e2f8,0xf9eb0668,0xf65bb4a0,0xf00686c0,0xe71c5180,0xe3742640,0xe0858b00,0xe039d720,0xe642b340,0xef4f19a0,0xf30e53a0,0x0223b048,0x04893838,0x0525a6a8,0xfb6d4258,0xf7f45590,0xfaa9c5f0,0x0db9f030,0x0980aa80,0x0fa1c230,0x0cf1bc00,0x09cdb2b0,0x0b0fafa0,0x0c4fb500,0x0eef2460, -0x09104df0,0x10d98540,0x0ef9b5d0,0x0d9758a0,0x0bd47f80,0x0b598610,0x0944bc70,0x0c26bb50,0x119338c0,0x04a96f88,0xfb96dfe8,0xfe8e04fe,0xfd5a0a00,0xfae78328,0xf731da80,0xf3c39ab0,0xf011e100,0xee954e80,0xf022e860,0xf0e22d30,0xf315f630,0xf820b860,0xff22bed3,0x0267ec30,0x0571c768, -0xfe940b9c,0xff011616,0x0655f908,0x1414dca0,0x0c184a50,0x146b8c20,0x1182b160,0x129870c0,0x11494b40,0x15cc9400,0x0c6bcd30,0x159f4980,0x07457648,0x166c2ac0,0x0d078d70,0x1647b560,0x0ee18e00,0x117e23c0,0x0f472390,0x11b26740,0x06be07e8,0x002a0170,0x06b2a618,0x065bad50,0x04504fa8, -0x01b57186,0x0062bd58,0xfcf5f964,0xfa5c25f8,0xf7361960,0xf7830de0,0xf80a1b10,0xf86cceb0,0xfb1cae50,0xff18dcb5,0x04186be0,0x04725608,0x0264c2d4,0x01185226,0x29c1a8c0,0x073c1618,0x13ffc1c0,0x12ae65e0,0x09607c00,0x0a8a8240,0x020b4bbc,0x04ce1188,0x0c7fa220,0x04e7fbc0,0x041fa190, -0x049eb910,0x0f10bb20,0x0c5cab70,0x0a8c3ab0,0x0d076500,0x24a11300,0x05dfe250,0x071ff650,0x08c57d90,0x097e5fb0,0x0aceb360,0x0ba8ad20,0x0cc27df0,0x09d2d970,0x08147db0,0x063bd720,0x05352688,0x03e235ac,0x025af5cc,0x02cc1428,0x029e88f0,0x0212dccc,0x02a59e48,0xffcafd8f,0xf7a56020, -0x0ee92430,0x1db7d040,0x3417b980,0x0441cda0,0x1a236000,0x302dc1c0,0x31877e40,0x313b4e40,0x2e59d500,0x3194dec0,0x3241ba40,0x31ad1b80,0x19a20580,0x07bb9b08,0x365545c0,0x1c267d60,0x0f7beb60,0xf92a0d60,0x0107b034,0xffc8e291,0x0054dae1,0x00f0b698,0x018f101a,0x02c27fe4,0x01dfa878, -0x01641dce,0x00d5641b,0xffd96918,0xfeffe944,0xfe014f10,0xfe06e97c,0xfdf0ff54,0xfdedb7f4,0xfdbe1e74,0xfc0f84e0,0x07530ba8,0x075749c8,0x0a4ee000,0x02f9cffc,0xfdd3b280,0xf7f98e20,0x0512ae80,0xfe95c76a,0xf902e148,0xf8bb9118,0xf907bfb8,0xfa16e968,0xf9460080,0xf9141400,0xf8fdb0c8, -0xfebeb31e,0x03d9c11c,0xf866cdb8,0xfe5d0462,0x022c6d74,0x088cece0,0x06c0b700,0x071e13a8,0x06dfe6f0,0x06912a20,0x063f89c8,0x0600e178,0x0585a358,0x055ef868,0x055a4560,0x05b51528,0x063ff6e0,0x07242c20,0x075e70e0,0x0771cc80,0x0704a5f0,0x07c0e170,0x0a311770,0x09f14620,0xfc1d5140, -0x08106aa0,0x02aefd74,0x0262a9cc,0x0473a3a0,0x042cd4b0,0x066fe650,0x0588af68,0x03e15d70,0x0561d728,0x056009e0,0x048f8970,0x02bf0bfc,0x038c1780,0x04226ce8,0x0476e4c8,0xff31d225,0x07f13c30,0x08b81740,0x08882b80,0x082a4db0,0x0794b810,0x06e0e558,0x062e8860,0x04b7cec8,0x041a1780, -0x041eb118,0x04994060,0x059dea88,0x07853640,0x084bbdd0,0x092f1170,0x08977510,0x09c399d0,0x0f147850,0x0ca89270,0x07703bb0,0x084656a0,0x03301204,0x037a8d5c,0x02ed608c,0x04127288,0x0252dec0,0x050348c0,0x03356228,0x06600b70,0x02ffd51c,0x03d2501c,0x03140e6c,0x045e08f0,0x0387d60c, -0x03e5267c,0x04357ed0,0x071f19b8,0x097d9a70,0x08aa9cd0,0x07b71500,0x063a7c78,0x044a2880,0x02c2cfe8,0x0019d259,0xfefba848,0xff19f818,0xfff2351b,0x037347ec,0x086c6e00,0x09dc7940,0x0ad28e20,0x091f38f0,0x0bf8f5f0,0x11606e20,0x0b4f1f40,0x076d92d8,0x0befda90,0x070b9670,0x0405cd08, -0x03f59d34,0x04bf94d8,0x04830da8,0x04823990,0x0615ba90,0x04451ae8,0x0483d1c8,0x043a8468,0x0528ace0,0x050693f8,0x04383078,0x05a446e0,0x0644f470,0x0933a7f0,0x0b7bdb80,0x0b99a530,0x0ac48a90,0x095d37c0,0x07a123c0,0x05af3958,0x01482984,0xff9529ec,0xfeb29c9a,0xfef03c74,0x01a759e4, -0x06feb850,0x08a02740,0x0aa3d1c0,0x0a54d0d0,0x0dc61af0,0x2d6e5d80,0x266a5e80,0x13064740,0x10d251c0,0x0cfbdb00,0x0c305c30,0x0da48bf0,0x07df03e8,0x05bcd050,0x04600238,0x045724d0,0x04c9b1f0,0x040d7d30,0x02eb6178,0x031ea968,0x03e9b550,0x054e6738,0x0415e778,0x01bafe38,0x035f2cd0, -0x0478fd58,0x00a20534,0xfce7254c,0xf5d03fa0,0xee93b880,0xe81d9880,0xe6dd5820,0xe4c7a160,0xe0d7ca00,0xf0b39120,0xfeaef848,0x10e8b800,0x17f101c0,0x1daf9b60,0x1f251b00,0x215076c0,0x3ed73940,0x15c5f3e0,0xffb0a028,0x08f043f0,0x0a1d98d0,0x066fcce0,0x071af7f8,0x057f2e08,0x07199d08, -0x06625390,0x0751bde0,0x0498f178,0x03e45998,0x02d4edc8,0x04fb9c20,0x04bfce30,0x01f12800,0x01ff4ce0,0x00542045,0x07b8d400,0x0b756f60,0x0b7561e0,0x0f3bef90,0x0f01c6a0,0x0d3dd6d0,0x07efe248,0xfd6ff4c8,0xf61296a0,0xf1253920,0xf70718a0,0xfe52a9e4,0x10128a40,0x1019a900,0x1b614960, -0x2d165680,0x37a13880,0x3914fc80,0x25664880,0x06b2bd08,0x0eba00b0,0x0266b27c,0x096c3d70,0x01f1c658,0x05d91950,0x0598b808,0x069f0ec0,0x0abe80e0,0x065e53f0,0x04c79fe8,0x0215f7b0,0x03da1cd8,0x05c317b0,0x0283f104,0x0910d160,0x098f4e80,0x0e534a60,0x1813c040,0x18a00020,0x1b298260, -0x1bbf26e0,0x1b627ce0,0x1a1d0180,0x184f78a0,0x135dc020,0x09e0aa90,0x05744dd8,0x099b4850,0x1584ea60,0x0ffd2480,0x0df8b370,0x0ec57320,0x25397200,0x0c044630,0x1dd27a20,0x13de9960,0x0f2345c0,0x0727de28,0x0b2cd9e0,0x0849c090,0x0a106110,0x07b5e1d8,0x085bcc20,0x09f37330,0x05eca9d8, -0x05d31af0,0x05a5fcd8,0x05a8c2d8,0x05350258,0x04ec8890,0x075824d8,0x054faf60,0x0e9e9770,0x1813bf40,0x1791ef40,0x18a5a060,0x165791c0,0x178ddfc0,0x192c0260,0x18f92160,0x14fe9ec0,0x0cf6dc40,0x05e606a8,0xff219783,0xfcc57bdc,0xfabc7238,0xf706a970,0xea251100,0xfec11bbe,0xf6c79110, -0x0ac21c90,0x0d337f20,0x0c82d410,0x0a805240,0x09fa4c80,0x072961d0,0x03405bd8,0x04132100,0x042cf3b0,0x04b9a7f0,0x07368c18,0x06ad36e0,0x02daf554,0x01228dbc,0x00511e74,0x017a4f3a,0xffcd06a2,0xfbf5fe48,0x024921a4,0x0b16e260,0x102d7d00,0x1a1e1640,0x194247a0,0x19d60020,0x18310460, -0x16078e00,0x1127a100,0x0a03c370,0xfdab8968,0xf34944b0,0xedfec200,0xe8b77c60,0xea6c6660,0xeccf22e0,0xf17d14d0,0xf31c0a00,0xf9b22768,0xfb5eefe0,0xfcc8f070,0xfebc3bb0,0xfe2a33ce,0x00653c01,0x048ab838,0x0161e3d0,0x0026101f,0xff73612e,0x03c57eb0,0x0536c5e8,0x03dc1d50,0x02eb05e0, -0x00004933,0xfc8197c8,0xfd680580,0xfab273a0,0xfcb0ef1c,0x0330e8bc,0x07237b00,0x12670e00,0x152e9280,0x15f90e20,0x1310aae0,0x10459200,0x0af71db0,0x03f5432c,0xff01e08d,0xf97f7570,0xf0de1e10,0xec321ce0,0xeb4233a0,0xeaea33a0,0xeef6c5c0,0xf071b7d0,0xf2730100,0xf5dd7d70,0xf938a3d8, -0xfdad3084,0xffacbebf,0x00009dec,0x01c2bd28,0x00fecb1b,0x0128d202,0xffde1763,0xff8e84af,0x0045dde8,0xff7deb36,0xff9d1f04,0xff0be026,0xfe26dbce,0xfe53ed66,0xfc6779b4,0xff9e24e1,0x04383748,0x04ad69e0,0x06b07758,0x0879dd90,0x0ba469f0,0x0f104c90,0x0ce0bd40,0x0b7b4490,0x0aa2b510, -0x048f9cb8,0xfec5c874,0xf8df2d70,0xf4c01ac0,0xef989400,0xe9e5ada0,0xed8440e0,0xf0dcfa00,0xefce3680,0xf31bc8f0,0xf292bc20,0xf38b7ab0,0xf3e5cf90,0xf568c9b0,0xf6853420,0xf747d470,0xf69f2e00,0xf6dae290,0xf7641b70,0xf89ec0c8,0xf8a793b8,0xf8b8a288,0xf7fabee0,0xf76e6890,0xf7d50c50, -0xf801e5d8,0xf5117cb0,0xf46b1830,0xf35e6a20,0xf2b98cb0,0xf19b5930,0xf0104be0,0xef01d620,0xee5cfda0,0xedb2ece0,0xed31a3e0,0xecac6420,0xeca1d9c0,0xec4726e0,0xed833ea0,0xeefa5840,0xeff241e0,0xf0550510,0xf25959e0,0xf25d8d80,0xef980440,0xef7b9220,0xf3fe92d0,0xf11f5a60,0xf072bb50, -0xf3606ff0,0xf3517540,0xf3aa0be0,0xf4230380,0xf410fda0,0xf3f78320,0xf4511910,0xf1336340,0xf235a600,0xf55dafa0,0xf110de90,0xf1bde840,0xf4643720,0xf40f8ca0,0xf3946520,0xf343c240,0xf303e5a0,0xf2e88730,0xf2927d90,0xf2619e70,0xf21be450,0xf1c70660,0xf1c53b10,0xf1a72780,0xf15ad4d0, -0xf1b59f30,0xf1ccceb0,0xf22daf80,0xf2012cf0,0xf1981f00,0x082a6c50,0x07ce9dc0,0x06427e40,0x097e9d00,0x0b10c480,0x0af76bf0,0x08500e20,0x09b0b5a0,0x0a285f50,0x0a1ed260,0x09f5c280,0x09b6f050,0x09bb88f0,0x09a50fe0,0x0952b660,0x096775c0,0x085e60f0,0x097a8520,0x098c3250,0x08c3bde0, -0x0695b8f0,0x07567710,0x07833e98,0x07eaf800,0x08208e00,0x08488bf0,0x0852de70,0x085521a0,0x08325920,0x07fdd828,0x07d1cf30,0x07764fd0,0x06e494f0,0x068c70c8,0x06ce9cc8,0x07d885a0,0x0793dff8,0x07b6a3c0,0x08118af0,0x0e4b50c0,0x08323910,0x0a69cf80,0x091af0c0,0x07da7878,0x07878a88, -0x06a781b8,0x0765a4f8,0x08907ba0,0x07fdebb0,0x07bd0b88,0x077a7318,0x080e7f00,0x0811e740,0x0852b340,0x0813ac20,0x098d4530,0x07275d70,0x072c3b40,0x07f317d0,0x08e3bcb0,0x09888830,0x09e2e980,0x09cb0530,0x09ecf670,0x09c7dac0,0x092ebe30,0x08eee640,0x0819b690,0x0714fbc8,0x0592a0d0, -0x058efae8,0x07c99e38,0x07c580e8,0x04f85588,0x07472d98,0x0c23d910,0x0a488f00,0x0bff7a00,0x0904f5d0,0x07e40798,0x06aae760,0x06697940,0x05cb9658,0x0801e160,0x06bb06e0,0x06fc2be8,0x05eb9150,0x06d91178,0x06f5bea8,0x07ae8f30,0x073c44c0,0x083dd3c0,0x06a95368,0x06d1f328,0x08ae13d0, -0x0a8d0270,0x0bda0810,0x0c781320,0x0c060240,0x0b9e84a0,0x0a87fa20,0x096322d0,0x09aebd50,0x08271550,0x05e3e7d8,0x0287ab00,0x037c6b30,0x07a37d08,0x069abbe8,0x0055cd9c,0x07a7f0a0,0x0c014130,0x05efb960,0x095ed680,0x07f7f1c0,0x057cf7d8,0x03f21a44,0x02e4e2f8,0x033af0fc,0x057fc2f8, -0x04ef77b8,0x04ff80f8,0x0423c1a8,0x05434b48,0x05f27cf0,0x05c1bb60,0x06cdbbd8,0x077a7338,0x05109160,0x0573c070,0x074459d0,0x0982c2a0,0x0b238f70,0x0b850410,0x0a3af6b0,0x09bcdc20,0x08eab6b0,0x0802fc10,0x08b488e0,0x088e9df0,0x077f6fd0,0x02b3e3ac,0x027805dc,0x05559c90,0x03a9fc78, -0xf2b0fca0,0x06159d18,0x18eee840,0x11284760,0x112efce0,0x0de1ff80,0x09069dd0,0x0af7b2f0,0x08845a40,0x06bcc3e8,0x06e35680,0x058d21e8,0x04d12840,0x02e2c8f0,0x05462b88,0x064041f8,0x06346a98,0x0743cc48,0x089991a0,0x0a1c3cb0,0x0cd8af00,0x10edb1c0,0x17871d60,0x1ab35a40,0x1cdc28e0, -0x1c55a080,0x18490740,0x1526e4c0,0x12871440,0x0ff9cf90,0x02c2f564,0xf1193e80,0xe8644040,0xe98e9a40,0xf35354c0,0xfbe07158,0xd255bfc0,0x03254cfc,0x1b386fa0,0x0957de90,0x06252d68,0x08aafbc0,0x05614d60,0x05833990,0x05af4e80,0x0687b138,0x06b5e260,0x06a255b8,0x06d75530,0x054bca00, -0x05a401e8,0x0661a888,0x08c6a5c0,0x09e18bd0,0x0b51cad0,0x0a1e0b80,0x0863ce70,0x0a75e080,0x0e1dd000,0x106fc2e0,0x136b79a0,0x16cc5ae0,0x19628160,0x19ea0f80,0x184fd080,0x11c1cca0,0x083784b0,0xf7185f10,0xeaea95a0,0xdce260c0,0xcaf583c0,0xd581eb80,0xb2518680,0xe46f9020,0x0d4a29b0, -0xfa6521f0,0x0e4d2500,0x019e700c,0x0cbae9b0,0x056b7860,0x074a9060,0x06810d90,0x0a9efcc0,0x040b9068,0x01e3ef24,0x02ede8cc,0x06631818,0x081488b0,0x09e7f940,0x0a883180,0x0ddc0f50,0x0b3a6010,0x07470588,0x09903a20,0x0985af00,0x0984d580,0x08cdc500,0x07a29a58,0x033a3cfc,0xffa0177b, -0xfe786c88,0xf46ef390,0xe7544780,0xd55bc680,0xd042c7c0,0xcf2eb580,0xc6d130c0,0xc0a2d680,0xc99e4940,0xcc348ec0,0xec1b0fc0,0xed8cb3c0,0x0211bce4,0xfba3e600,0x025adc94,0x0014b942,0x05b5cd20,0x036af350,0xfffbaaaf,0x06bfaaa0,0x094b4210,0x055ee420,0x0701d308,0x06a2cb58,0x06a341b0, -0x062e73d8,0x0b62dac0,0x0b16dc70,0x0816aab0,0x08e60440,0x05db5ff0,0x07517c58,0x0214e3ac,0xf8db0180,0xefe77e80,0xe9c7a700,0xe86495c0,0xe52d0f60,0xe2797a40,0xde3fbf00,0xd7b3a680,0xd5c40000,0xd8c0a440,0xd368d080,0xe193a720,0xdd4972c0,0xe6c3dce0,0xee43c5c0,0xf1bd60d0,0xf9c6b760, -0xfb5545f8,0xff6f91ad,0x0264d360,0x02ee0a0c,0x00b28eed,0x043bc528,0x04cc6768,0x03c6f20c,0x04fc54b0,0x054d87e0,0x07731130,0x07055c50,0x083bbe30,0x099131f0,0x0b58b2e0,0x09ff02d0,0x01bd6660,0xfc3f6b8c,0xf760f490,0xf6237260,0xf1e7c480,0xf148f4b0,0xf2b4d170,0xfaf49c88,0xfddc3138, -0xfaacb608,0xf31636c0,0xea3a14c0,0xe2d19e40,0xe1107900,0xefefbb60,0xef204ba0,0xf5dd6260,0xf9f77190,0xfd69ffd0,0xffa69143,0x004852e6,0x01ec6344,0x019f7704,0x017c35a4,0x0223acc8,0x013eb7f6,0x01a9a862,0x01ffbc62,0x0143bdd8,0x01a325f2,0x04a21c98,0x032afe40,0x04e92e28,0x074eefb0, -0x05218260,0x03b4fb0c,0xfe57e3d2,0xfcd6d618,0xfcaf2758,0xfef0bca4,0xfe40ed6a,0x002efa6f,0x029c2ba4,0x00e1a2a8,0xfee11ff6,0xffa411d0,0xfaaba880,0xf4a63c60,0xef158b80,0xee8e0d40,0xf87c4138,0xf7589d80,0xf50a9170,0xf64e55e0,0xf5791960,0xf8ae6b48,0xfb127368,0xfd93f5ec,0xfdb6c71c, -0xfef9bfa2,0xff318542,0x00188236,0xffbd7477,0x000c6d4f,0x0043894a,0xff83f73e,0xfe7ce338,0xfe2d7f2c,0x004bda8c,0xfabe7500,0xf59aafe0,0xf5185450,0xf324ce60,0xf2a9cda0,0xf0dfcca0,0xef258460,0xeedf1920,0xee6b0480,0xee1b91a0,0xf07b3da0,0xf28dba50,0xf4459500,0xf58fcd60,0xf701ed40, -0xf74aa910,0xf76b41d0,0xfea599f4,0xff6252aa,0xf6c7a370,0xfff9915b,0xfdaf5000,0xfe35106e,0x0030bba5,0x00a499b5,0x01cf8acc,0x00c418c4,0xff92c5aa,0x002fa1e1,0x003d3486,0xfff86e9a,0xfd5fe020,0xfcb3b2a0,0xfd331790,0xfc1c8648,0xf85e7cb0,0xfb62c3d8,0xfbbe5240,0xfb76afa0,0xfad41f18, -0xfb081c38,0xfb8a6e48,0xfbc58bf8,0xfc00d73c,0xfc720d8c,0xfcbeaa7c,0xfccfedd0,0xfcb6f0e0,0xfcd227e8,0xfcf8cb7c,0xfd07f700,0xfd7f5868,0xfded854c,0xffe5e689,0x02192150,0xfbad82f0,0xf8b60350,0xf3607080,0xff232d51,0xfaa7f200,0xf610fd20,0xf5b26c70,0xf5fcec40,0xf64999d0,0xf6056840, -0xf5c08410,0xf5db18a0,0xfa8074d0,0xfde76d90,0xf44ab2a0,0xf91d2500,0xfaf48640,0xff504c20,0xfe1f79c6,0xfdf19fd4,0xfdd6c5dc,0xfd4c93c8,0xfca1cef8,0xfbf7b928,0xfc988c68,0xfd0c8294,0xfd88f520,0xfdf2eac8,0xfe715e68,0xfeec17b6,0xff3d8504,0xff920d30,0xffd67ecc,0x0018ae56,0x00eeb69e, -0x022c2c2c,0xff987855,0xfeea84d2,0x02846dd8,0x04940318,0x07a68040,0x024db458,0x0529cf68,0x06e573e8,0x07164258,0x072f6aa0,0x075008f0,0x07aaec10,0x07c16450,0x079f5218,0x05537af0,0x037f0804,0x083010d0,0x05a0e168,0x0459f178,0x016b01bc,0x02224a74,0x01fcf8de,0x0234ea24,0x025c8b68, -0x02960af8,0x02d23c00,0x03270790,0x03885310,0x040621c0,0x03e21410,0x0378df78,0x02da9054,0x01d2f704,0x00c946ad,0xff58a570,0xff43aea6,0xfb810b48,0xfc7542ac,0x03a69b58,0x00217325,0x02c02dfc,0x02908c2c,0x0233ae34,0x032449dc,0x02c9d4d8,0x0376e3a0,0x04a5f460,0x03fa88c4,0x03cdbf8c, -0x039cc36c,0x049327c0,0x040c00e8,0x04441778,0x04333e80,0x06406a68,0x02b1c5a8,0x023b749c,0x02759e44,0x02fc3a04,0x032fd148,0x03958d5c,0x0431e768,0x04d4ae20,0x05c404c8,0x07354438,0x07c5fc20,0x0742d370,0x054c4650,0x02ed15ac,0xfff92254,0xfc6b2d24,0xfbab3280,0xf47876b0,0xf7af8480, -0xfbf95ee0,0xfcf5dd54,0x00d5942f,0x01673eca,0x02133c10,0x02e1c2a4,0x03fe833c,0x03cc304c,0x0605a768,0x04502488,0x05a36f60,0x03c4f5b4,0x04cfc398,0x044638e8,0x04ebf720,0x059daa38,0x0502bc10,0x03eaba0c,0x0284bc40,0x02c165d0,0x03d87ba8,0x04a71900,0x06163410,0x081148b0,0x09fcd670, -0x0ca2dd00,0x0ecaac80,0x0e3fb9a0,0x0b867f20,0x0710de28,0x0274e918,0xfc3dbda8,0xf5468450,0xf4ad6220,0xf203dea0,0xf50fec10,0xfa6fc260,0xfccba410,0xfe63692a,0xffb6806c,0x00171a35,0x01ec08aa,0x027d4ad0,0x03770344,0x05068840,0x052a9e78,0x04f75c18,0x03e0c8e8,0x047fcc10,0x049676f8, -0x06a1b2b0,0x056fbcd8,0x0545beb8,0x04ca6800,0x036ceaa8,0x0372f9e8,0x05217f28,0x05a890a8,0x0737bf38,0x09a23830,0x0be409c0,0x0ec8d3b0,0x12f4e7e0,0x151d6300,0x12edaee0,0x0c9671f0,0x059feff8,0xfcc86f4c,0xf2f215d0,0xf23fbeb0,0xe2b6d2e0,0xe18dd620,0xe68d5a00,0xf2d9bd70,0xf766aba0, -0xfb664a50,0xfd420250,0x001fb02d,0x014f462e,0x035689e8,0x04b927f0,0x05860dd0,0x05b2b070,0x0440d2d8,0x05819318,0x05d142c8,0x0700feb0,0x08137300,0x08e2c7a0,0x066a4de0,0x0282e454,0x02fb483c,0x040eede8,0x06f8cff0,0x0bda5b30,0x1269c840,0x18803fe0,0x1b77f900,0x1c814600,0x0c4922e0, -0x051ec758,0xff02bee1,0xf93fa6a8,0xef6e7840,0xe173f4c0,0xdd922500,0xfa0a4638,0xe19b5900,0xdef26000,0xf01bf7b0,0xf5037820,0xfaf4ad78,0xff83afdc,0x02bb385c,0x0399687c,0x04f9f998,0x06ed7a40,0x05593580,0x04bb37f0,0x0343abc4,0x04e9b950,0x05644b78,0x05a33028,0x069cc5a8,0x0797d278, -0x06384818,0x076d5458,0x08ad79b0,0x080f1d10,0x081871b0,0x06757420,0x04304648,0x00784ef3,0xfb71f0f8,0xf7370da0,0xedb7fe00,0xe74b1260,0xe23cff00,0xf303db70,0xfd5069ac,0x079b5a10,0xfb556b38,0x2a2f61c0,0xf699b1f0,0xdc896e40,0xf4ec3c00,0xebb05e00,0xf941e140,0xf80f0d40,0x000b589c, -0xffe9302a,0x02173298,0x062d9148,0x057ac5f0,0x0589fa10,0x05714450,0x0603a200,0x057a0578,0x0702aa10,0x05114768,0x059285f0,0x059f9ee0,0x03e4174c,0x02237d4c,0xff75f208,0xf8bead30,0xf5454f30,0xf4851e20,0xf35e33d0,0xf0a51520,0xeca1f440,0xe7f9c120,0xe5ee2640,0xec3f0ca0,0xf8c96cd8, -0x06c55dc0,0x21063000,0x2112f5c0,0x28fbf240,0x1c3478e0,0xfa739830,0x065446e8,0xf74287d0,0x0228ffb4,0xff251577,0x00f1f6b0,0x0335aa9c,0x0556e110,0x019796f0,0x06b65388,0x05870110,0x02784ebc,0x02420430,0x03226614,0x03a4e228,0x02a347c0,0x0532db40,0x00838bcc,0xfc8dd820,0xfde7ce1c, -0xffa47737,0xfe5e9c64,0xff15f3d7,0x00a4c7db,0x05911ae8,0x064b5d70,0x01f67928,0x053e1738,0x07262bb8,0x0b2784e0,0x0c81d1a0,0x0a585920,0x08d13420,0x1655b3c0,0x15bcd1a0,0x18da63c0,0x07ac1370,0x07992458,0x07671c88,0x006417d8,0x0321f080,0x05204388,0x00518cb0,0x013af0aa,0x029b8774, -0x03a4acdc,0x03cf946c,0x03dda670,0x04a42010,0x043f6b00,0x00f69125,0x0308a9d0,0x0747a640,0x0147786a,0xfbcd54f8,0xfb466bb8,0xfa033d30,0x013b9862,0x07148328,0x0bba3470,0x103a9a20,0x122e01a0,0x11951a40,0x08e88fc0,0x03f887d8,0x04fc6078,0x0546c558,0x0920b900,0x0d8d7c80,0x10614ec0, -0x0e032ab0,0x0eb6b8d0,0xff9d103e,0x011e2196,0xfeab09c8,0x00a65107,0x0295e41c,0x004e706b,0x02775f3c,0x028d0f88,0x02dc5f1c,0x00ea5fe4,0x0166e6b6,0x038fa8c4,0x023facec,0x02913068,0x029b1e00,0x02cc9464,0x0194cef6,0xfef3546a,0xfeaef96c,0xfcfb369c,0xfaacddb0,0xfba83158,0xfd141360, -0xffedbeab,0x0193cfd4,0x0115782a,0xff9fdcff,0xfff50658,0x00885928,0xfeb927a4,0x004ee6b6,0x0439d018,0x0b33efa0,0x0b7f15e0,0x090a15a0,0x0668ae98,0x052c1c20,0x07c523f0,0x05e96420,0x044f53e0,0x0276b7c8,0x016c7888,0x00d852e7,0x02801b70,0x01495d26,0x03fb1bbc,0x00841e3f,0x0276e540, -0xff26a3a2,0x00391234,0xff691ea4,0xfe2b953e,0xfaf19ae0,0xffd9ab31,0x03c32914,0x0131bdd0,0x01a07636,0x00d826cd,0x00844047,0xff6d9fd3,0x01c2caaa,0x03d47284,0x05bf3050,0x05464cf8,0x053630c0,0x059aee18,0x071f39b0,0x07f2f538,0x09b10ba0,0x088d3330,0x08db9a20,0x095d7ff0,0x02f4f100, -0x067955d0,0x04f21b50,0x055eb3e0,0x065fa420,0x062b7fd0,0x06e2efc0,0x0733b460,0x06347b18,0x073afe90,0x071cdb50,0x0774f9a8,0x056fa900,0x0682f010,0x05f15c90,0x05d85c60,0xffd450fa,0x08ea3f00,0x088acc70,0x07a4c7a8,0x07a66408,0x06db56a8,0x065d5f08,0x05952e48,0x07419c10,0x07d75590, -0x089907e0,0x094de250,0x0a1ffd10,0x0a9c1d60,0x0a263e20,0x09ca0750,0x098c57b0,0x092cc1b0,0x083bc870,0x091a57b0,0x08884ca0,0x06a151f8,0x029e58f8,0x08aa8f70,0x061691e0,0x02de0714,0x02ba8360,0x027111e8,0x029bc5b8,0x02176560,0x01f42c6a,0x01e7fb5a,0x05d27798,0x082bafe0,0x00011d18, -0x0559d6f8,0x0758a9b0,0x0ac56200,0x08efdc60,0x099f95f0,0x099733c0,0x09d3e590,0x0a22a180,0x0a3d9880,0x0a0bb940,0x09dd1340,0x09b9a140,0x09a78990,0x097feb20,0x097f00b0,0x09333ce0,0x0900d220,0x08b74d40,0x08bb0ca0,0x09974cc0,0xfd6edc24,0xff261701,0xff4bfeb6,0xfe586784,0xfe3e7f68, -0xffc0db99,0xfe134e6a,0xfe6abfb2,0x00edba74,0x00fecc72,0x01283752,0x0116930c,0x01487860,0x013b713c,0x01239a3c,0xfeaf83c0,0xfda96aa8,0x015f9948,0xfeab7f72,0xfdfa472c,0xfd6b0974,0xfde05734,0xfd9130b8,0xfd4a1218,0xfd36f34c,0xfd0076b0,0xfcb12db0,0xfc5acd0c,0xfbd92b70,0xfb31fed8, -0xfad4a4a8,0xfae7cb18,0xfb3448f8,0xfc9d98d4,0xfdc4924c,0xff648bb7,0xff5ea5da,0x02f9123c,0x0094b7d5,0xfc5d0e70,0xff7f2789,0xfe2d4474,0xfef1e04e,0xfefcd998,0xffd122a6,0xffacf7f0,0xffbbbba1,0xfff01241,0xff802a1d,0xff7b9635,0xff0b2e1f,0xff921785,0xff06527e,0xfeca851c,0xfece3af0, -0x006e7a21,0xfde0ecf8,0xfdc10030,0xfd5e2ed0,0xfc83c900,0xfc661434,0xfbe7df20,0xfb2754e0,0xfaa94c68,0xf94c2310,0xf7288c80,0xf51ce890,0xf4ecfe20,0xf69a96e0,0xfa4bb7b8,0xfdf79618,0x0239ec40,0x029bb674,0x0a5ba5e0,0x03501244,0x005444d1,0x02522c78,0xff79489c,0xffea5878,0x008619aa, -0x02ba9e8c,0x02d329c0,0x0264ba28,0x02b6fd54,0x0191f77e,0x02204ca0,0x0008531d,0x00d0a3cb,0xffd89b50,0xff4df479,0xffae8200,0x0018ec46,0xff0d725c,0xfdc0e248,0xfd678024,0xfb816c98,0xfb35b700,0xfa415228,0xf86bca70,0xf76dad40,0xf4647ac0,0xf0ebd1c0,0xedd74cc0,0xed716fe0,0xf073ad70, -0xf7c82e20,0xff285b12,0x07eb6408,0x08a03c30,0x120d5600,0x05e78ab8,0x01c007b8,0x054b4a20,0x02888fc0,0xffd4974a,0x011b05a2,0x04479330,0x04142590,0x045ae4e0,0x04cb45d8,0x04c0ec78,0x03dab954,0x0209f5d0,0x02bb1494,0x01c421ee,0x03c6b71c,0x01f3838c,0x039fc7b0,0x00ab2af9,0xfdb09e40, -0xfd72e558,0xfb1fa030,0xfb195560,0xf9d1cf90,0xf87d0760,0xf8143578,0xf4b283d0,0xee342d40,0xe5f6f5e0,0xe32149a0,0xe7cb6ec0,0xf36313c0,0xfefd4f5a,0x0d5b8d80,0x0ebd1350,0x17da0940,0x0f844bc0,0x038d05d4,0x00d558a4,0x04114458,0x05f6efe0,0x07b99118,0x04c6d088,0x04a4c7b8,0x04138dc8, -0x039abeb0,0x04043b70,0x041feff8,0x03934d1c,0x02daee5c,0x0146bf6a,0x01eac1ee,0xfe7e3b3c,0xff87bd3c,0xfeb06052,0xfcfa6908,0xfc3a9fe8,0xf65a38c0,0xf4c67cc0,0xf11a9aa0,0xed21a600,0xe5396360,0xe0396c60,0xdb002380,0xe4b01260,0xee221580,0xf676cf50,0x00f57b31,0x0abef1d0,0x17652900, -0x16f75a60,0x07122cd0,0x0c6554b0,0x05f7c248,0xffc6182d,0x002a901c,0xfcef40a0,0xfd20a20c,0xfd4ffd78,0x000d2e3b,0x023db64c,0x04e04da8,0x0523c7f8,0x050dde68,0x0358f090,0x03deed04,0x03233fd8,0x039cfffc,0x0134b738,0x029c6090,0xfc32bf7c,0xf74f1e00,0xf6adba10,0xf259a8a0,0xecdf1580, -0xe6b1d740,0xe0c6c2e0,0xe0cd9a60,0xe1849340,0xdf3ec640,0xefc9d540,0xfb9c34c8,0x07eea290,0xfa9ed9a8,0xf6376bd0,0xf70c9780,0x026414f4,0xd862f7c0,0x05004fe8,0x15fb78a0,0x050983e0,0x0c39e3d0,0x0578ce60,0x064b4d48,0x0152d7aa,0x04c2d6d8,0x03b996e0,0x01a8ae54,0x065fd570,0x06647880, -0x019bdf7e,0x02af7be0,0xfee3fdf8,0xfe513348,0xfa254188,0xfa795900,0xf7d4c450,0xf4711e80,0xf857a990,0xfbd56ea0,0xffbd61eb,0x01b7e94e,0x018b5400,0x0740c7c0,0x0cce3120,0x10966f00,0x19f57500,0x1f695280,0x1f282840,0x0a5db3c0,0xf6776190,0xd4314940,0xd9d145c0,0xd9ed70c0,0xe7dafac0, -0x049df670,0xf71688b0,0x040447e8,0xfdb990f4,0x01457b64,0xffef09f7,0x04c5f838,0x04e74e28,0x0290f364,0x04beec10,0x038a36a8,0xfe2a3a6a,0xfd7df7c0,0xfd133020,0xfafa3d28,0xfb11b118,0xfb669e80,0xf962d1a8,0xff016506,0x026cd3cc,0x04333de0,0x0987a5a0,0x0f7eaf00,0x14f8df60,0x18f6bfc0, -0x1e99e120,0x25b68c00,0x1fb03220,0x18bcb8a0,0x10fef600,0x04403c40,0xfde6e9c0,0xf577f000,0xedf9cbe0,0xf94523c0,0xf5310d40,0x00f14bcd,0xfe9f934a,0xfd8bd628,0x030d920c,0x026a2ea8,0x029e84b4,0x05b70170,0x05b33648,0x05a13608,0x04933200,0x0418a770,0x02fe1e60,0x00ac5277,0xfeb77faa, -0xfe656cfe,0xfb7ca960,0xf8d8eda0,0xf807b138,0xfc459848,0x01bea8f2,0x0c67df90,0x0f0f9760,0x11792440,0x11c15180,0x12b5b3a0,0x1186ee40,0x0fa12ae0,0x1142fb20,0x0e461b70,0x06c2b008,0x00179d4b,0xfab59120,0xf5e330a0,0xfbbd06d8,0xfb93ba28,0xfa2e3e30,0x07143d20,0x05373788,0x06d3e630, -0x05cd1720,0x02c7c6a4,0x026da954,0x0126ad2e,0x0225cf00,0x03d163d0,0x04ef9d70,0x05220d08,0x04700a20,0x05f51f80,0x055df488,0x02ee5614,0x02677bf8,0x0152df78,0x02dee348,0x04139218,0x05f60080,0x0af99a10,0x0a901e90,0x09fc34b0,0x07e0aef8,0x05fe7da8,0x05502268,0x050b0398,0x02935eec, -0x0026f551,0x0056fb25,0xfff98b60,0xfef76c22,0xfacccf80,0xfd697108,0xfdf8b678,0x00660ddf,0x01f6dee6,0xff1de770,0x00ff1553,0x012423de,0x02868d18,0x02bdd630,0x044bf4e0,0x02bc5d24,0x0478a3b8,0x02ff57f0,0x06401c40,0x061d6d48,0x0865cb50,0x09b72180,0x0bed6890,0x0ce50820,0x0d6eaf10, -0x0e0074d0,0x0cbf8650,0x0cbb2d00,0x0b745860,0x0b6c06d0,0x0bb54db0,0x0c91ff90,0x09ced080,0x072ca6d0,0x04972e18,0x0429ae08,0x03cfb808,0x033b9848,0x017c71a6,0x0075a2f9,0xff71b80e,0xff842bd8,0xff8a92ee,0xff508c7d,0x080ed780,0x01d2d9ba,0x04557498,0x03ace3e0,0x01b28640,0x01e99fc2, -0x0075e41d,0x0142dd56,0x02ae48c0,0x01bcdc2c,0x01842704,0x01ca458e,0x04439820,0x046f4870,0x04f8ff48,0x05838930,0x0a955920,0x06111190,0x0545b570,0x05f7ebd8,0x06140c00,0x062023c0,0x059d81b8,0x0568c230,0x03b0aea4,0x02d968c0,0x01cabdcc,0x00f34e02,0xffdb0969,0xfef494ae,0xff51d791, -0xff837f19,0xff6f112e,0xffa396c5,0x00c54e91,0xff0a09c5,0x02f09218,0x059dba88,0x09705510,0x0152974c,0x056bb858,0x09051f80,0x0969d450,0x0972ab90,0x090c6ef0,0x099937a0,0x09dd5480,0x09acf910,0x06401a30,0x035ba600,0x0b441780,0x07c55f30,0x05f25e70,0x014b0d78,0x02810f0c,0x0227a130, -0x01ff69b4,0x01f9ea84,0x020b84e4,0x024983b8,0x02039a08,0x01c2d734,0x017e2f66,0x0115e828,0x00c76c1c,0x004b5a26,0x00648c3c,0x005fdb2f,0x007023ff,0x005cd3e0,0x00e60a72,0xfe4e9a20,0xfefb6374,0xfe40c112,0xfff7dda8,0x0048a7c3,0xff757bcc,0xff86797c,0xffa13495,0xff092ab8,0xff1d909b, -0xff028673,0xfec8c210,0xfed71d2e,0xfebb0eb4,0xfe7b6f2c,0xff153362,0xfef543ae,0xfe1838ac,0xfeb04844,0xfe971ba6,0xfdea1fa8,0xfdf50478,0xfde969e4,0xfdf8aca4,0xfdea66b8,0xfde9df44,0xfe0f152a,0xfdf51248,0xfdf67fa8,0xfdfbfe74,0xfe0d7564,0xfe0780c2,0xfde6eb80,0xfd9f94b0,0xfdb884d4, -0xfe51899e,0xfe88b746,0xfecaa7e8,0xffe4b50c,0x04921368,0x00f42e09,0x01f6510c,0x010087cc,0x007116cb,0xffd738bc,0xffdf0302,0x00286b55,0x00167f6e,0x001fe87f,0xffce7eba,0xff7797b2,0xff2a5fe8,0xfec11e32,0xfe84b336,0xfe205a50,0xfe089f96,0xfd3cecc4,0xfcf809f0,0xfd0c4240,0xfd490ff8, -0xfd5f10c0,0xfd8f72e8,0xfdcd69fc,0xfd551de4,0xfd302880,0xfd4465ec,0xfd6f367c,0xfd2ef890,0xfcf2070c,0xfbba1618,0xfc0f3b58,0xfdcfa444,0xfe9f8a54,0xfcbffe98,0x00b45e2d,0x05401840,0x02f97070,0x04bb4098,0x02cc02c0,0x0229c404,0x0106eb82,0x01cbac7e,0x016a4c8a,0x01850c64,0x011ff262, -0x0114ef54,0x00245fda,0xffd4a708,0xff0def2e,0xfdf3e770,0xfdc9dadc,0xfd3737a8,0xfbfa08a0,0xfb63dc98,0xfb59d3c0,0xfbba89a8,0xfb465eb8,0xfae67298,0xfb0d37d0,0xf9b46e60,0xf96e7ac8,0xf99b4310,0xfaa013d8,0xfbb37c38,0xfc128d00,0xf9a708d8,0xf96a4660,0xfc827e48,0xfd6ac760,0xfa82fb68, -0x03b241b4,0x0aa52130,0x05ce8328,0x0766ea98,0x071b1408,0x04fcbcd8,0x03261728,0x031b0724,0x031a344c,0x03bcc3f4,0x03e523b8,0x02be6c58,0x00a70e33,0x0119cf96,0xffd56225,0xfedc707a,0xfdc49ed0,0xfd57a870,0xfafea490,0xfaa63bd0,0xfb2052d0,0xfbb7a970,0xfb95e4d8,0xfbb33920,0xfb82a9f0, -0xf8cbdd38,0xf78505a0,0xf7a3bb80,0xf900d678,0xfa2342e0,0xfaea15a8,0xf681d070,0xf83ad428,0xfd0b3660,0xfe7c9d2a,0xe09bfc40,0xeb7f1fe0,0xfbbd6f70,0xfb124328,0xfb96dc28,0xfce45e7c,0xfc8aada8,0x0147f368,0x0327d500,0x039874fc,0x03a1df88,0x03bbc1ec,0x039fc33c,0x02c7de2c,0x018e2bba, -0xfffa426f,0xff9025f3,0xfd3eb1b8,0xfbcc34a0,0xf8702668,0xf68936d0,0xf54c7100,0xf3b946a0,0xf2a13d40,0xefa602e0,0xeb0269c0,0xed04d600,0xef4282a0,0xf4db31f0,0xf981c710,0xfbe265a0,0x00b2a090,0xf70db3f0,0xedeacae0,0xe24f8240,0xe420cc60,0xe399fe20,0xeab8aee0,0xf72e5470,0xfa67c160, -0xfbb2d3f0,0xffefb1a7,0x00bf8c81,0x00182b13,0x0094a01d,0x022a3488,0x02c01f7c,0x0508f0a0,0x04d4fcf8,0x0251b54c,0x014c9428,0xff8ae838,0xfce4a69c,0xfb4944e0,0xf7faba60,0xfa8a0bf0,0xfc04fbc8,0xfd310fbc,0x02dbfc1c,0x0a6b5070,0x1302d1c0,0x1b0dd160,0x1f430ce0,0x237ba040,0x2b25d700, -0x1e517220,0x13bea6c0,0x07c108a0,0x05161e68,0x01d3e038,0xfba41c80,0xeb3fd2c0,0x13809d80,0xe94c3dc0,0xe2fbb600,0xf3675330,0xf3893ae0,0xf98fe8b0,0xfc01cb84,0xfe3ff918,0x031bf324,0x0441f588,0xff49c040,0x0467dc38,0x0281c0bc,0xfc578818,0xfbd658e0,0xfaed1020,0xf78af620,0xfb2fff38, -0xfa10e248,0x0055abfe,0x0a2c58e0,0x0da680a0,0x17013240,0x209eb580,0x26612b80,0x27a6ad40,0x25471600,0x21a91f80,0x1eb933e0,0x15fcb3e0,0x0eb7a210,0x067e2a90,0x0e366e00,0x15b34520,0x2c1ef240,0x1bbbc540,0x1f9ece80,0x09227080,0xf32084a0,0x0239c1c4,0xfb1adab0,0xffca0b8c,0xff65d783, -0x0015872a,0x014ea88e,0x0202997c,0xfd466e58,0x037287e0,0x04ae7ef0,0x0205a7b0,0x02a149d4,0x00b52ff4,0x0068d41c,0x00acd2f3,0xfdc1d770,0x04f28ec8,0x078556c8,0x0760f268,0x0a3bcfb0,0x07a1e588,0x06fe41d0,0x07e630c0,0x03aeae40,0xfe154862,0xf6d0be40,0xf8578fe8,0xf7f2cb40,0xf70e02c0, -0xfdbe9cb0,0x042ec660,0x13b68940,0x115ec320,0x057ac3d8,0x058995e0,0xfe3c1218,0xfde0bf68,0x002b5207,0xfee7f2b4,0x0028d78d,0xff32d35a,0x01d8c1cc,0x030d35bc,0x02b38230,0x0242dd58,0x01832096,0x0133eba0,0x0161f578,0x023e12dc,0x0443cea0,0x040bd130,0x01e03772,0x06eb1650,0x063b1128, -0x03ee744c,0x00c9687b,0xfcaa1400,0xf800c298,0xf311a230,0xeed66f40,0xec786fc0,0xea08e4c0,0xe9a21020,0xec0ea4c0,0xf0c30590,0xf8963ff0,0x002a007e,0x0bf1cb10,0x0680de98,0x026d6d9c,0x03efd91c,0xfd0d9014,0xfe75208a,0xfe50e0c4,0xfd6afa08,0xff26387b,0x00905249,0x0270306c,0x02abe25c, -0x01c6a528,0x0370f134,0x03683ff0,0x0194e0fa,0x01383730,0x0106e3e4,0x00bbf158,0x02306cf0,0x04370ce8,0x01693ed6,0xfed80602,0xfe094caa,0xfa02bba8,0xf7e725d0,0xf64be8f0,0xf4b9ae40,0xf5528a50,0xf5679780,0xf5ab1c30,0xf80f9708,0xfae96348,0xfc96cf74,0xfd3e5a88,0xfd8acd40,0x0050bfe2, -0x00c5ca76,0xfe4a87c0,0xfe59d65c,0xfea0cc16,0x00be3c85,0x00efe1b0,0x00d9bb47,0x0054532f,0x002f7598,0x00121725,0x00a22e76,0x00daf77d,0xffddc9bc,0x00ccb196,0xff119828,0x012fc2e0,0xff10cb8e,0xfedd0ab6,0xfe5c8554,0x0014508c,0xfb2d9810,0xf8e3a470,0xfb1b3178,0xfb7f87b0,0xfae832f8, -0xf9a4c218,0xf85a3bb8,0xf933efa8,0xf9f2f9a8,0xfaa81f60,0xfa3d0158,0xf9896480,0xf8c6af30,0xfa164810,0xfb04e868,0xfb22e8b8,0xfc46d3a0,0xfe1c24b0,0xfdf27b80,0xfc932c64,0xfcf3eff8,0xfcc37f50,0xfd6e5558,0xfdde0038,0xfdf19a84,0xfe74555e,0xfe73ab4e,0xff104d1f,0xff02fa25,0xff843ac8, -0xff9b48c6,0xffece96e,0xfee92738,0xfefa3000,0xff11d282,0x0172a792,0xfcd18368,0xfd25592c,0xfcdc6060,0xfc66b358,0xfc8d0db0,0xfd01dda8,0xfd51f070,0xfd6a3ff0,0xfd5c4074,0xfd88f444,0xfda02ba8,0xfdf127a0,0xfe0a79a6,0xfde793d4,0xfdbdc7bc,0xfdeea788,0xfe017308,0xfd8b9848,0xfdd19780, -0xfe1b747c,0xfe332dbc,0xff3444c6,0xfdd55d00,0xfdf19bb0,0xfed1beee,0xfeed5618,0xff10b7c9,0xff2d8cf4,0xff7b4c47,0xff98b569,0xffee9c02,0xfe9a06b2,0xfdd3433c,0x00a34c9a,0xfe201394,0xfd352f3c,0xfc1185f8,0xfcea72b0,0xfc9b83a4,0xfcb2349c,0xfc8fc174,0xfc4b89b8,0xfc06fcb0,0xfc2d575c, -0xfc58c488,0xfc79125c,0xfcb01fa0,0xfce168c0,0xfd2a4bb4,0xfd4f4804,0xfd789df0,0xfd8e6ba8,0xfd8e7290,0xfd2e9818,0x00173afb,0xfea17b30,0xff45199b,0xfcd17898,0xfc9fd660,0xfd59a27c,0xfe21f872,0xfd3f60f0,0xfce12440,0xfd093aac,0xfd2a800c,0xfd60ecc8,0xfd3ec324,0xfd22fc50,0xfd3bd4e8, -0xfd411d9c,0xfe6552ac,0xfcb98a30,0xfd2bf0a8,0xfdfe4cf0,0x01326062,0x004c2f61,0x009d8d94,0x00e35dac,0x010db188,0x0135eaf8,0x016189cc,0x0155f446,0x0153a9f4,0x013082ec,0x01170f78,0x00e29a40,0x00d85056,0x002839e9,0xff7dc7c8,0xfe20c506,0xfe9b834c,0xfb5a09b0,0xfb460298,0xfb25e9e8, -0xfdca3be4,0xfda36e78,0xfdc2e8e4,0xfeb00a1a,0xff1ef882,0x008c0701,0x00316fb3,0xff26bb2e,0xffd0b924,0xfffb9c1b,0xfffa6fdf,0xfec51548,0xfeed57f8,0xfec6d6a4,0xff3cfac7,0xfcde2a48,0x00d3ca8a,0x017348c2,0x01834aec,0x025b4674,0x02ab53c4,0x03024010,0x03316c48,0x02e23ec0,0x027d1680, -0x01e51306,0x01eec5dc,0x01a0a290,0x012b2b72,0xff7d1e07,0xfd5b0d6c,0xf9a53050,0xfa59e408,0xf7e4fb00,0xf7a02ff0,0xf8883810,0xfa7e8068,0xfc8ff4ac,0xfdd30504,0xfe55855a,0xfeb8d9d0,0x001d6836,0x013ae896,0xffb5e62e,0x00f8381a,0x00349e45,0x0115010e,0xfedf1dae,0xfef414fe,0xff7d644e, -0xff22c703,0xfe4a208a,0x00fcfe24,0x029faf34,0x02c94508,0x049f0ff8,0x058fbb28,0x06977ce0,0x07740998,0x07388ea0,0x06fc8a20,0x05c93a78,0x057792f8,0x048c2658,0x046d0a98,0x00d1ec9f,0xfd10fc94,0xf4e241e0,0xf6be5250,0xf2089dd0,0xf1a54550,0xf427f080,0xf9e2f0c8,0xfb57b678,0xfd37da3c, -0xfe802a58,0x00a3176c,0x03287078,0x037365c8,0x02ca9390,0x03380614,0x02484154,0x01beb060,0x0039b9ed,0xffddaa87,0xfe3ea466,0xff9d1b62,0xfd917520,0x01fb81fe,0x04777240,0x0454ec38,0x0692d168,0x076c3de0,0x08582500,0x0886cf10,0x06f63300,0x050a6358,0x029cc3e4,0x03b55700,0x04368f90, -0x035ef544,0xfdf7cfac,0xf5db46a0,0xe9674c60,0xecb4aec0,0x0d8637f0,0xffd7f395,0xf2fe9eb0,0xf930d770,0xf996eb68,0xfb5d43c0,0xfdb57dcc,0xfc05f81c,0xfeef4ea8,0x01836b5a,0x023a2a70,0x03be5148,0x04117938,0x02f103c4,0x01de4032,0x013a58e0,0xff970d76,0x00a5e885,0xfda4ecb0,0x00b3c12a, -0x05b67058,0x06cff9a0,0x0cbbd470,0x0fede920,0x153fcc20,0x1c35b500,0x1f7c1d00,0x219ff200,0x21813c40,0x1b1e8b00,0x1635d540,0x10cd4a80,0x15855720,0x1785e940,0x16f60f40,0x0c8107e0,0x225de380,0x0a055bb0,0xfa218220,0xff066c25,0x008438f5,0xfe51eba8,0x00129347,0x007c34d8,0x014f0080, -0x01c17e22,0x027cb4d8,0x0410aba8,0x03957000,0x02244808,0x025b04b8,0x014d4a50,0x0035df24,0x00c22fd3,0x011db92e,0x05ef33d0,0x08f619b0,0x0a47c150,0x0c2b5800,0x11ce95a0,0x15c09d20,0x191c7860,0x16ec82c0,0x11bc1e60,0x06e91288,0x04a34448,0x01db2dcc,0x0287b2dc,0x07b573e0,0x0b0c9fe0, -0x1445a7c0,0x1c624ea0,0xff597d54,0x18cbdc40,0x135f6760,0x0b02fad0,0x0615e5f8,0x04e56450,0x00c63704,0x001677bd,0x031852e0,0x03b6c12c,0xfeb1be66,0x0321964c,0x01edc49c,0xff2a6e6e,0x00309278,0x0192f4e6,0x02e2ebd4,0x032c6f58,0x05737750,0x02de79f4,0xfbac0790,0xf9e247b0,0xf371e190, -0xec932c00,0xe752a040,0xe5ab65e0,0xe073ef60,0xdfb96fc0,0xe0bc73a0,0xe7626820,0xec5f3720,0xf57f7300,0xeffa3c00,0xec1d7e40,0xe5829600,0xf25fbc10,0xeb84d5c0,0xfea5d0e2,0x0d5a9620,0x0122d080,0x036151dc,0x01e5e486,0x02c1d01c,0x02aeff24,0x0345f3fc,0x032df940,0xff3471d9,0x02ab9ca0, -0x0289a7e4,0x02667894,0x0194c528,0x014cfc8e,0x029f9c70,0xff602bde,0x0297599c,0xfc0063ec,0xf2f5d530,0xf0f105a0,0xed4512a0,0xeb25b500,0xe784fbe0,0xe4ae2500,0xe4f9f440,0xe788a320,0xeb2ce0c0,0xedd5fcc0,0xf1a75430,0xf6a2f4f0,0xf59255c0,0xf4a1d020,0xebeb3680,0xf2f2a070,0xf707e150, -0xf7709b40,0xfdcc52a0,0xff2793c2,0xffadf459,0x00a84448,0x00af57e1,0x01b3e1ce,0x018b01ee,0x019ddcb6,0x00e68793,0x00904fb2,0xff7fc61e,0xff48e892,0xff64f695,0xff929e9e,0xfd91e4f0,0xff4a2050,0x0368f550,0xfb2675a8,0xf71097c0,0xf537afc0,0xf11eb8f0,0xf0b2db60,0xf0b55500,0xf3671ea0, -0xf599bf00,0xf981f1c8,0xffef3b07,0x018cf5ee,0x019d387c,0x00dd987e,0xffa99599,0xfd364210,0xf5306180,0xf7023150,0xfbf42f40,0xfafe6298,0x00215c91,0xfed33830,0xfee4c82e,0xffe9671a,0x000fcd3b,0x0117f078,0x011d762e,0x00e7987b,0x00026d6c,0xff87b94f,0xff51e4ba,0xff358b42,0xfd67e3dc, -0xfbec6890,0xfb9fa738,0xfa081258,0xf9184990,0xf8a26520,0xf8711e28,0xf8c9a008,0xfaa0f9a0,0xfd798774,0xfead2450,0xff65758f,0xff69c94a,0xffef8478,0x00c6be27,0x00633e2d,0xfeaddd64,0xfc1bf694,0xfc4f0fe8,0xfdc0d804,0xfe339f64,0xfce6f5e0,0xff6d232d,0x00a61dbe,0x0039ab3a,0xff1c5db2, -0xff672c28,0xfff7d4eb,0x009bcbb8,0x00f3ed93,0x0119d31a,0x00dba48e,0x01903a54,0xfff81b1b,0xff02f4a0,0xfe0fa606,0xfd097b1c,0xfc713e68,0xfb76bd38,0xfafc1b18,0xf9f71548,0xfabbbc48,0xfc400f48,0xfc6304ec,0xfd080884,0xfd2ef06c,0xfdf1f5f0,0xfee7d85e,0xfe16eb84,0xfda766e0,0xfd3ae2bc, -0xfdab6b64,0xfe7dce48,0xffa5888c,0xfef8917a,0xfe612308,0xfe92e2a4,0xff46d9db,0xfe5893e0,0xfe47118c,0xff2be6c6,0xff5d5c6a,0xff6de84f,0xff29c003,0xff1a21fe,0xff1b93ed,0xfee60818,0xfe70091c,0xfe5780ec,0xfe099b2c,0xfe1a95ae,0xfe0adb32,0xfdb17938,0xfd699174,0xfd0cef08,0xfceb3e54, -0xfc2f0534,0xfc0c2dec,0xfc44fce8,0xfc503b28,0xfc986288,0xfce55578,0xfd015800,0xfd2a4b98,0xfd75e460,0xfdd016b8,0xfe04f62e,0xfe58a53c,0xfe85787e,0xfee52fb2,0xfeea348c,0xff1f126a,0xfedf94e2,0xfeaa0eae,0xfe7ef548,0xfe4f314e,0xfdd392dc,0xfdb65b58,0xfd85d7b8,0xfe4494d0,0xfe1fcf04, -0xfde54d00,0xfdd793c8,0xfdf21e7c,0xfddc73f8,0xfdf2ca20,0xfdeb4fcc,0xfde2df60,0xfd690538,0xfda57aa8,0xfd3c4288,0xfd19f428,0xfd4921d8,0xfdd46674,0xfde49b4c,0xfe142812,0xfe2f5504,0xfe48b7e2,0xfe6e6f26,0xfe90962e,0xfeab3e70,0xfec155ca,0xfede57da,0xfee67c04,0xfee8bbac,0xfeea8f22, -0xfeb9b13e,0xfe944182,0xfe88ed7a,0xfe7e3dd8,0xfe14e0ce,0x06d29ca0,0x06d18cf0,0x07777258,0x05fc70c0,0x03ffc754,0x006f0a36,0x06733858,0x0468a508,0x0189894e,0x01c2883c,0x01ccbdf4,0x018bc330,0x016eb172,0x01639656,0x017625dc,0x049ec238,0x05ff82e0,0x00f60f3c,0x04902168,0x05c36d70, -0x05cde2f8,0x05c86b50,0x05f0bd58,0x05c4ca70,0x05f679e0,0x060648e0,0x05f4ff60,0x061f3ea8,0x0643a110,0x068298d8,0x06eda110,0x0768a980,0x084d6ad0,0x07ff4320,0x08008fb0,0x081185e0,0x07984620,0x09c86080,0x08d0bbe0,0x00e0b4b6,0x056db2f0,0x03e3d234,0x043d7f00,0x04ffd708,0x045fcfd0, -0x05bd8628,0x05d30b40,0x04c24e58,0x057a1ea0,0x052a12d8,0x057e2900,0x03e76a94,0x0404bf48,0x05135a28,0x049b6cb0,0x03ffc7c0,0x053cc928,0x04ece060,0x051db2f0,0x04936bb8,0x04f27710,0x04f3cb50,0x04e6a5a0,0x058b9b38,0x0686c200,0x07cef638,0x0933d270,0x0a91f180,0x0c6c19c0,0x0be767f0, -0x0be70c40,0x0c42dbc0,0x0b200740,0x0e691b90,0x097b80a0,0x043426e0,0x04e85188,0x01ef1550,0x021dc8b0,0x0269566c,0x02364430,0x03606460,0x03e66f74,0x024605a0,0x03730ba8,0x027a87cc,0x0403e6a0,0x0211cb5c,0x0240a014,0x02ea0c90,0x02da4d0c,0x046e9a10,0x039a5ab0,0x03cd9744,0x04731588, -0x038599c8,0x04c30ff0,0x05383488,0x057efdb8,0x06d298c8,0x081b62c0,0x0a6c0870,0x0ca9a4b0,0x0e9b2aa0,0x11b44320,0x1092ac80,0x110e06e0,0x12464f40,0x0fa7ba20,0x144deb00,0x0aa6ffd0,0x02c315c0,0x03422b1c,0x0293fde4,0x010c54b2,0x019771fa,0x00b50185,0x02e51fa0,0x0350467c,0x01d8be64, -0x023c02e0,0x01fdb3d8,0x0233a3f4,0x0081bc9a,0x0016c4ce,0x0192e1d0,0x01941416,0x0341bc5c,0x017b83ec,0x00912c19,0x00f0a775,0xff6c7a91,0x00ef4247,0x017f0702,0x0213bcd0,0x04d61080,0x08d28110,0x0e3570b0,0x11deeca0,0x14c49de0,0x18e86480,0x177dc6c0,0x176ffce0,0x19ff2460,0x15db32e0, -0x0feba480,0x1331d500,0x11d35800,0x0ae41c40,0x08e51b40,0x0607ade8,0x056555b0,0x0485cdc8,0x02c32660,0x01ac9950,0x01522352,0x02ca74f8,0x0311845c,0x02e60698,0x02085fe8,0x017cab06,0x0226ba94,0x022d77e0,0x05087a00,0x0578c2c0,0x045fc1b8,0x07376240,0x087c0230,0x0a08f4e0,0x0bc5ad30, -0x0e10b7c0,0x0f179b20,0x0dd2def0,0x08383e00,0x094875f0,0x08e54290,0x069e1958,0x089e14c0,0x0a789fa0,0x0eeb6c90,0x12b0d840,0xe5552980,0x00da7725,0x0c48bf60,0x054df428,0x056261b0,0x046cc830,0x02d1c780,0x02073a34,0x02755e98,0x0294b624,0x025ce71c,0x0395391c,0x03053fe0,0x02a90328, -0x01dc34ec,0x020c1dec,0x04353388,0x04580000,0x0560ae50,0xfe3dc270,0xf6da7c20,0xf280aa40,0xebb021c0,0xe792d240,0xe3784220,0xe137f8a0,0xe0c07f60,0xe4b2ebe0,0xed333980,0xf36d4b70,0xfb34bf58,0xfeb2cc98,0xf9ff5af0,0xf328c000,0xe64686e0,0xe53980a0,0xf4d37ef0,0xef5ffac0,0xfac451f8, -0xfda71cb8,0x021e7534,0x0134a816,0x040a2b40,0x0177d096,0x04df33f0,0x04f82828,0xff8d8806,0x04471f50,0x0426e7b0,0x03a021d0,0x02ef181c,0x017db936,0x022b4de4,0xfed68c36,0xfc11fe3c,0xf9050250,0xf729e170,0xf62a98e0,0xf4e193c0,0xf5cae6c0,0xf84ef5c8,0xfd0a6068,0x012c4d98,0x02de66a0, -0x040c1dc0,0xff480549,0xfc8d595c,0xf5f0cf90,0xfc12cc44,0x03a0caac,0x0e265ee0,0x00f387f0,0x075a9160,0xfc064a98,0xf590bba0,0xfebd91ec,0xff7b242b,0x0036b5ff,0x01096616,0x0142fdd8,0x0237f8c0,0x01e99c82,0xff2b472d,0x00dac14c,0x006517ed,0xffe26a37,0xfdc8e084,0xfc69dcd0,0xfa67e1f8, -0xfc202aa0,0xfa226d70,0xfaab94d0,0xfdb3e3d8,0xfe652fd2,0xffa01332,0x01bd21a8,0x03a0b468,0x03bea414,0x0770cbe8,0x09053140,0x09c513e0,0x06ed8650,0x040bc680,0xff0a31e0,0x030c2ffc,0x054e7f00,0x115abca0,0x056e4788,0x075767a8,0x02643fec,0xfebbc652,0xfef1e720,0x00a438a5,0xffc154ab, -0x01544e68,0x03101a0c,0x0297966c,0x0182786e,0xff9c1b93,0xff46070b,0xffa65e24,0x011ef914,0xffe4fece,0xfe3d301c,0xfd3f1f18,0xfb56ef10,0xf819d340,0xfbbe1d90,0xfe1477a2,0xfe3f0e0e,0x0157d16a,0x02dace08,0x04404670,0x04423e28,0x056a9660,0x0320b95c,0xfe09f806,0xfd820590,0xfd6ddf94, -0xfd3b60b8,0xfd96bc4c,0xffe296e3,0x07e6d058,0x07e04728,0x04fc5530,0x031e0298,0xfd8eed18,0xfe1f195c,0xfe9d8708,0xfe8e0aca,0xffc0f2f4,0x00927a3f,0x00722033,0x0071dbf7,0x00c1923f,0x012b1326,0x00a2e358,0x00053a4a,0xffb4ff54,0x002a85cb,0x011bff18,0xffaadd28,0xfde3daf4,0xffbb321f, -0x0053e3d7,0xfebb24f6,0xfd7753e4,0xfc9e7178,0xfd41e3b0,0xffa1d9e1,0xffd22f11,0xff792927,0xfe3f72fe,0xfcfbf198,0xfdd81774,0x00e90bd7,0x00353206,0xff9ed35f,0x009fb574,0x03e539d8,0x014305b4,0x0051e1e1,0x002443d9,0x0140118a,0x00aa0279,0x00cb41e4,0x00961d49,0x00b7f54c,0x0011a1ac, -0x00386721,0xff318b74,0x007c21e3,0xffeed951,0x016a23d0,0xfff30c55,0x0074f683,0x000a9ae5,0xffcedfe9,0xfeeaad98,0xfffd13bd,0xff58b81f,0xfd4c6f1c,0xfc012474,0xfcc6f258,0xfcf72394,0xfcb73eec,0xfd290498,0xfda8a6e4,0xfe60aeca,0xfede33fe,0xff125784,0xff0bc251,0x00461953,0x015e79ea, -0x01c2c310,0x01174c0c,0xfe6a26f2,0xfe90e83a,0xfd8b5224,0xfe3c6b5c,0xfe2a909c,0xfe8f2df6,0xff035ce0,0xff41245a,0xff769c91,0xff76b896,0xff15d6f2,0xff934fbb,0xff69bbc7,0xff5e14e5,0xfecb6aa2,0xff2b07de,0xfecb70b6,0xfe7a3fea,0xfce3bf74,0xff3a43eb,0xff168a69,0xfef556a6,0xfeca39de, -0xfe24e7c6,0xfda91f18,0xfd492f84,0xfdaa7510,0xfdd9a720,0xfdf1723c,0xfde3b91c,0xfde14144,0xfdb798e4,0xfdc78b1c,0xfdabe3b8,0xfdfdbcd0,0xfe1fbff2,0xfee38680,0xff232d20,0xff24ea13,0xff105ca4,0xfed6992a,0xff59d0e1,0xff1cb746,0xfed9bf2e,0xfeae4cd4,0xfe9045aa,0xfe9ce742,0xfe440fc8, -0xfe288576,0xfe193128,0xfeff9294,0xff4cf284,0xfdd933e8,0xff014ed6,0xff523d2d,0x000da8a7,0xff5aee7c,0xff46260b,0xff21d6be,0xff0e135a,0xff00ca06,0xfed3475c,0xfeb8baba,0xfe92b79c,0xfe7d179a,0xfe76676c,0xfe796634,0xfe7e7c7e,0xfe9f901c,0xfebb14f0,0xfec15b80,0xfedfcf10,0xff0133fc, -0xfdd67c1c,0xfefe94b2,0xfd70b9e0,0x01aa6024,0x042539b0,0x079acf28,0xff9166ad,0x03258d64,0x06ae8428,0x0723d660,0x07119d18,0x06719720,0x070f1678,0x073f34c8,0x07608118,0x0305338c,0xffc5cf84,0x078b92c8,0x03125574,0x00aaf2d5,0xfcac3a40,0xfdeb696c,0xfd7ae22c,0xfd4eed9c,0xfd2855f8, -0xfd115b04,0xfd116390,0xfd0655a4,0xfd02016c,0xfd0cfb28,0xfcd43ddc,0xfcc20378,0xfcb1e65c,0xfce7de6c,0xfd6624f0,0xfec10404,0xfe7e312e,0xff6322c7,0xffc1e4be,0x077d02e8,0x005d98b3,0x023d530c,0x022cf850,0x008dcbe3,0x0028e4f2,0xff3804ab,0xffdf515f,0x00d81ee1,0xfffabeec,0xfffa40d6, -0x0053a5f6,0x0151d5bc,0x007ac049,0xffc24ee0,0xffafe7b5,0x0323eaec,0xfd326f18,0xfd569a2c,0xfd3a3e18,0xfcba65c4,0xfc78e6b4,0xfc5d2fa0,0xfc8fe5d8,0xfc8ccbac,0xfc56a9d0,0xfc18a170,0xfb21c6b0,0xfac202f0,0xfae50d98,0xfb2802e0,0xfc587428,0xff7bd37a,0xff342461,0xff75fd08,0x029cdb20, -0x05dd6068,0x03708238,0x043abe28,0x0307ad04,0x023d1d10,0x00812b27,0x02889b00,0x0124cba4,0x01f7ef6e,0x005f1d31,0x027fc390,0x01677898,0x01a24224,0x0034cd5c,0xffc2c313,0x0021ecf4,0xff7ae51d,0xfd229af8,0xfc447294,0xfbb2e9a0,0xfa5f8428,0xf9621470,0xf8be6c08,0xf8822658,0xf812d780, -0xf7ee4ca0,0xf7b091e0,0xf66d5070,0xf63f2c20,0xf6eeabc0,0xf82860a8,0xfa6974e8,0x00b50d37,0xffe28a2d,0xfdbb6670,0x04eb1318,0x08913890,0x04110cf8,0x03bdba94,0x04756010,0x029cca24,0xfffe7e54,0x01c9050e,0x024c4774,0x0097e978,0x0222c5c4,0x019ab4d4,0x014a2278,0xffde439d,0xfedf4042, -0x002eeb70,0xff095f50,0xff8ea9ee,0xfcffa388,0xfd075330,0xfce65d4c,0xfb5a3b90,0xfa65c990,0xf9d088b0,0xfa2781a0,0xfa1c2870,0xf9063900,0xf71d0310,0xf3c892e0,0xf30dad10,0xf3a91220,0xf535f040,0xf95f7768,0x01aad706,0x007d9a6c,0xf14f8440,0xf62f71c0,0x0172810c,0x043bf6d8,0x010cb690, -0x00da6be1,0xff44cc00,0x00bf270c,0x025ab680,0x02e7acac,0x0219fa24,0x01dbc904,0x01a59db2,0x02cceaac,0x00cd828a,0xff7c4804,0xfff84f12,0xfe815caa,0xfe3ed4a8,0xfa4d6300,0xf4fec900,0xf146b8f0,0xebd911a0,0xea153100,0xe738cce0,0xe3947900,0xe35fc840,0xe6a0a2e0,0xef3a0ae0,0xf200b960, -0xf5360cc0,0xfa36d6a0,0xfb336710,0xfa07b590,0xf75c5040,0xf15c8d30,0x06f004f0,0xf8051590,0xf4e8f450,0xfb77c490,0xfbe266e0,0xff9b263f,0x020aee30,0x04aae6d8,0x047e5450,0x04571130,0x0246e3d8,0x0343ec00,0x023bf130,0x01a60118,0xff971b26,0xfe86e73a,0xfd58c890,0xfbcf0f60,0xfa5692c8, -0xf99085f0,0xf93d7258,0xf9af8030,0xfc11fe0c,0xf77ab430,0xf7ac1800,0xfa947890,0x016406e6,0x04bc2570,0x05560d50,0x08f28260,0x07d061e0,0x030dac04,0x0a221a80,0x0d94a250,0x1225b5a0,0x0bca2a90,0x087d3ba0,0x06b9ebc8,0xfd938c54,0xff103b9b,0xfd7d93d0,0xfe9554e8,0xfeb8d15a,0x001c8ab1, -0x0163b2be,0x028d9848,0xfff3f8b2,0x02d86bcc,0x03323804,0x03bdf3b0,0x00ae2063,0xff312666,0xfe38f51c,0xfebbf0b6,0xfe13d232,0xff7c4ab2,0x0205cfc0,0x025b0148,0x05c6b088,0x06df0860,0x079898d8,0x059d5510,0x074c2fb8,0x073094e8,0x043514f8,0x055614e8,0x03c32998,0x0157d19c,0x082824e0, -0x05974280,0xfbca5590,0x020d3d60,0xf894b5b0,0x03d41a38,0x05df51e0,0x01f61500,0x00ebe8af,0x00b0751c,0x0193aea2,0x039d9808,0x02266b6c,0x01217232,0xff2ce38f,0x00a0ef9b,0x01662764,0x02331690,0x0173a652,0x008ddd95,0x00a3f470,0x0024a165,0xfe44a88a,0x00227b53,0x0110abce,0x00ca0076, -0x01369746,0xffc2fab8,0xff1f42e0,0xff5f5ee6,0xfc38a77c,0xf9b7c2b8,0xf7fb5ac0,0xf7603570,0xfa2d81a0,0xfd9b33e4,0x01b216dc,0x01769dd6,0xf8838d80,0xf933aa80,0xf94df388,0xfecfddc0,0x01b83c8c,0x028eef54,0x00c677e8,0x01cecd7a,0x010550c4,0x0067a7b8,0x00960ddc,0x00856ebe,0xff2bc519, -0x00f22e1c,0x01ae0972,0x01e58fbe,0x01591efe,0x00efbbc7,0x00e97db9,0x020b0500,0x01b67134,0x034eb17c,0x023dfc20,0x00fbc7ab,0xfeeee3f8,0xfcd02100,0xfc0024c4,0xfbd42368,0xf9d82478,0xfb803e00,0x00a32cd5,0xfee3a404,0xfee75470,0xffae8b90,0x04408a80,0x04f31198,0x01f85296,0xfb450d60, -0xfdc6ee68,0xfcde94a8,0x00d22048,0x0046d8fa,0x0073bdd8,0x018b3b22,0x019424be,0x01440472,0x015a4122,0x01289a8e,0x013236be,0x00753068,0x0063fc92,0x00f67c41,0x0118935a,0x0168b518,0x011cfb2e,0x02156194,0x02997ff8,0x02353a80,0x030c4b6c,0x02f3dbf4,0x012e721a,0xfde6bab4,0xfb6dbe58, -0xf92451f8,0xfa055b20,0xfa928708,0xfb55b708,0xfc8c1e24,0xfd976fcc,0xfdb98d9c,0x0135f7ee,0x037007e4,0x042da440,0x00c056fb,0x017f8b08,0x02c1ffc4,0x027d8364,0x01308a9c,0x00cd3c9c,0x0113f7a4,0x01257802,0x017e391a,0x014f4740,0x01bf2e1c,0x017d0ad4,0x021c5494,0x01eae214,0x01d73b98, -0x01f20a80,0x01aa456e,0x01514106,0x01dded50,0x021d1a60,0x02f23a0c,0x02d226a4,0x026b9020,0x02983994,0x0193f28e,0x00ade6b9,0xff87287a,0xff93ca22,0xff0b2746,0xfe3c74be,0xfe693a10,0xfe4a482a,0xfde4f51c,0xfe873c94,0xff3aa566,0x00854190,0x0124c00a,0x01a19f44,0x020d4a10,0xfff2a4b6, -0x0206e2f0,0x014c7108,0x015a3538,0x01c0d930,0x019fd6f0,0x01da1fe2,0x0194e0de,0x01158d56,0x0108cf36,0x00de0a52,0x00988c6c,0x0080957a,0x00c14f53,0x0125142e,0x01529cb8,0x00a588a7,0x01a4ad02,0x011e7ef2,0x00c3d285,0x0056ed16,0x000da8cd,0xffdf347f,0xff8f54e0,0xff6d5f24,0xff4cd91a, -0xff3fa359,0xff2a5f0f,0xff338e69,0xff3ed7b4,0xffdc0a58,0x004f7d9c,0x00abb41c,0x011ea9e2,0x01446fa6,0x01fbada4,0x00382a0a,0xff873e73,0xfe93483c,0x01034fa0,0xffea3466,0xfefe03f6,0xfedb65d0,0xfedafd64,0xfef5878a,0xfee0175e,0xfed88a7e,0xfed32aac,0xffa0738d,0x0071ea9c,0xfec77626, -0xff85199e,0x0015c89a,0x010ed45a,0x00b1c133,0x00a6ad2c,0x0084931c,0x0064de35,0x003a1b37,0x000c3df5,0x003d7402,0x0062692f,0x0083447a,0x009122ad,0x0098b8c3,0x008773ed,0x00b46996,0x00d80e5d,0x01035e7a,0x012edc5e,0x01465054,0xfcf33244,0xfc9377e8,0xfcaaec0c,0xfbe03ec0,0xfbee8418, -0xfc8a2d9c,0xfc6c1684,0xfc38e4d4,0xfc30d000,0xfc42cdb8,0xfc5048e0,0xfc7e8c7c,0xfc7eb600,0xfc85648c,0xfca3d66c,0xfc50fe18,0xfcd262e8,0xfc3e9f40,0xfbef3450,0xfc4e38d0,0xfdcf603c,0xfd56d338,0xfd639870,0xfd943098,0xfd69ed20,0xfd63b1fc,0xfd5f5d8c,0xfd776568,0xfd82a74c,0xfd77f108, -0xfd92fe0c,0xfd727080,0xfcf41d50,0xfd10634c,0xfcd78fd4,0xfc4282d0,0xfc65c47c,0xf956ad38,0xf9b48b68,0xfc0b4984,0xfc06240c,0xfc1e3b60,0xfc446d48,0xfcdc9ac4,0xfd52d960,0xfe161c24,0xfe0edb02,0xfdba8464,0xfdfa57b4,0xfe2ac6d8,0xfe401838,0xfdc6f634,0xfd9fdf7c,0xfd09f104,0xfd1900cc, -0xfc0c6ba8,0xfd7d87b8,0xfd760a78,0xfd584054,0xfddaa878,0xfd6ed09c,0xfd3dbdd0,0xfcf1408c,0xfcecff34,0xfcf0b3b0,0xfcd473c0,0xfd635b34,0xfd2401d0,0xfba3bca0,0xfc13920c,0xfb5c1030,0xf9546958,0xf91bf4d0,0xf7cd5ad0,0xf9389200,0xfae19cd8,0xfaf46e30,0xfc310bb4,0xfd584b38,0xfe016736, -0xfe435714,0xfefbb8c6,0xffd71b56,0xff1a6aa4,0xffd4c4ca,0xffa0ec7e,0x00542589,0xff5a5231,0xfee4201e,0xfdf997d0,0xfd5b6bf4,0xfcb67edc,0xfddfce68,0xfdd48974,0xfdae5dd8,0xfecdd300,0xfdf56c1c,0xfdb0e55c,0xfd6bae38,0xfd917408,0xfdb01a58,0xfd90fbdc,0xfe5874da,0xfdd70cec,0xfa711968, -0xfb73dfc8,0xfa57f830,0xf6d95c70,0xf78afa30,0xf0baa2c0,0xf2fd5b40,0xf77c03d0,0xf9c4b400,0xf9997aa0,0xfbe8f5f8,0xfcfff248,0xfe876fba,0x010f6578,0x01f5c2ac,0x011e9f2e,0x0196d954,0x01692f12,0x016a1a28,0x0019c947,0xff4347da,0xfdd4e070,0xfd96b728,0xfcceea68,0xfddda6ac,0xfdeb37e4, -0xfdef1648,0xff869caf,0xfe5c1362,0xfd61e55c,0xfbfe8bd8,0xfb5fe0c8,0xfb8632b0,0xfbc1d248,0xfe213b58,0xfd1d0f00,0xf7ad7260,0xf8bc4a88,0xf68b2e20,0xefffcfe0,0xefe492e0,0x14b80220,0x0b750b10,0xff818ba5,0x00143df7,0x01e6c04a,0x020c887c,0x033f7998,0x01cb7a26,0x009498a0,0x00dcbe1e, -0x0217a2e0,0x011fe88c,0x00f3430c,0x02436d08,0x003fe782,0xff81990c,0xfe5a70a4,0xfd665db8,0xfb689720,0xfbd18ae0,0xff198389,0xfecce29a,0xff3f884a,0xfe97c504,0xfeeb057e,0xfec7ec24,0xff0ac020,0xfd2201ec,0xf9c6a060,0xf9c45900,0xfb6c9e98,0xfcc95450,0x01acadec,0x05f57c18,0x07bf40c0, -0x10ff9080,0x04ffc258,0x0a1e2d60,0x058f4478,0x03b16f9c,0x040e0440,0x0127f8d2,0x0174649c,0x015114b8,0x03c1c818,0x03bd0cb4,0x0186a902,0x01c1b1fa,0x01accce4,0x033abe18,0x008d1a48,0xff155ed7,0xfd338e04,0xfc5cafb0,0xfb6ac798,0xfddcb0d0,0x00a6d073,0x02375804,0x04d089f8,0x06c9bd10, -0x0743a878,0x0654af20,0x043d1f00,0x03369394,0x037c5af8,0xfbb27e30,0xfc042750,0x02816e5c,0xffdd3cc2,0xff6fd89b,0xff6a41d2,0x007024bd,0xfebedab6,0x01988398,0x0495ced8,0x04368120,0x03725d08,0x02910c00,0x01b28792,0x03c54f38,0x025d5ae4,0x024501fc,0x000f974c,0x00195072,0x00996c44, -0x04838a40,0x00c2996f,0x00adc3b6,0x00fe88f0,0x01cf6008,0x0263f10c,0x0200e170,0x031a37d0,0x01fed76e,0xfe3788c0,0xfee9c1f4,0xff2d83eb,0x003864be,0xfd64f17c,0xfc15b878,0xfd8ae4a4,0xf9ce93f0,0xfb9517b0,0xffffb2b7,0xfd0c8c30,0xfd35c860,0xfd4a6f3c,0xfecac3a4,0x07c3cb68,0x01abea86, -0xff04eff4,0x013ebf5e,0x00d176bf,0x010fa0f2,0x0134e128,0x0348c454,0x00fa6b55,0x003ac44b,0xff9a8140,0xffff4251,0x00e3bab2,0x05022670,0x027cb730,0x02304224,0x03c71cbc,0x027c2d80,0x0203c9c8,0x01c35fce,0x008681d0,0xff954eb7,0xffa4b6a3,0x000c3f3a,0xffb838ea,0xff40a187,0xfd54809c, -0xfdb7c780,0x01479a00,0x0238603c,0x044f7b60,0x07db87f0,0x0555fed0,0x03cb7de8,0x01e1eff4,0x04f3ad30,0x01490d5e,0x03528814,0x0040e970,0xfff25ef5,0x011e136c,0x00fa4a13,0x019b707a,0x01aed0fe,0x0111df52,0x01513d32,0x01822ec0,0x02b878e8,0x02a89654,0x025aab3c,0x018b9a3e,0x017f5a72, -0x01c6bb30,0x015b9a3e,0x0222b4a0,0x021839f4,0x0217af00,0x022675e0,0x0164a3ba,0x0025e3a4,0xfee7c8f4,0xfcbcc760,0xfe110204,0xfccf6718,0xf9d542a8,0xfafd6d50,0xfd6c9084,0x01b0f410,0x017e066a,0x008985f4,0xfd3229d4,0xfe4f2364,0xfdaa5eac,0xfe05f8d4,0xfd793c2c,0xff6dd6a6,0x005c6ee1, -0x0161eee2,0x01d4f798,0x00ec61cb,0x0179b27c,0x019941f4,0x0181f656,0x00c79396,0x00bc2473,0x00de7bbe,0x019c6bc2,0x01e773a2,0x01fdc072,0x01d0d628,0x01c0767c,0x00d9edfd,0xffe42af9,0x005b29ae,0x01e8f01e,0x02d15604,0x02f23da4,0x00d6e83f,0xff21bef1,0xfd99bd9c,0xfcc7f664,0xfe89f2b0, -0x0046af81,0x0236a458,0x0074782a,0xff332641,0xfef6a1f6,0xfdbf5f48,0xff025ba4,0xfdda5470,0xfef4eafe,0xff05a633,0xff1e5859,0xff2c8cc1,0xff7a8725,0xffd1c914,0x00c001f6,0x011efc86,0x02510a34,0x01aa1d00,0x01565ce2,0x012c259a,0x00a3b025,0x0079d7e2,0x005e0bc3,0x00aca118,0x0182c996, -0x00f74ecf,0x010ce69a,0x01afb1fa,0x01c9634a,0x00cb0b05,0x003ba5ad,0x0005ff71,0x00acec11,0x018506e4,0x02460ddc,0x01fe6096,0x01c9bbaa,0x01f2a1fa,0x0160a4a4,0x00ef3392,0x0072bbaa,0xffc5e122,0x01b1a8f4,0x01b997a6,0x0345b188,0x01c861f4,0x0277e450,0x0256c900,0x020e0040,0x0218cb24, -0x01e15e5a,0x0213ed38,0x023c521c,0x026640bc,0x0290a44c,0x02cd52ec,0x02858d9c,0x0279febc,0x024079ac,0x01e20cfa,0x01e7f76a,0x01af0f1e,0x01d79db6,0x01ffdf80,0x023d91fc,0x02a0bfd8,0x02ebce88,0x0308a98c,0x02e97c7c,0x02b8af3c,0x02b248f0,0x02bfc9d8,0x02cb1384,0x02bae7c4,0x028765b0, -0x025a1ab4,0x02202460,0x01faa3dc,0x0149af3e,0x00d5b63c,0x0232da2c,0x02ab71c0,0x02b360a8,0x01c22a66,0x026cd074,0x028fc2a0,0x029458f4,0x02807734,0x02591178,0x0255b1c8,0x02419f20,0x02426560,0x02a96c34,0x0237e140,0x0223e494,0x02752610,0x021b8d50,0x0164e21a,0x01a8ac14,0x01c5fae6, -0x01df4ed6,0x01fc112c,0x021bc200,0x02556bf8,0x023078f8,0x021671b4,0x01ec6542,0x01cae6e2,0x01aa9c48,0x01956b8e,0x017dc48a,0x016b1aa4,0x0159bcc6,0x0149eabc,0x0133b226,0x004ec375,0xffe8128c,0x00d3bb5a,0xff97935e,0xfea060aa,0xfd16bacc,0x00498a54,0xff0f6fff,0xfdfe6748,0xfe1abc86, -0xfe3a45ba,0xfe3fcc58,0xfe12f320,0xfe0d30a8,0xfe30ca96,0xff87e31d,0x0044f8fd,0xfda3083c,0xff3e5303,0xffdc15b3,0x00c6a0cc,0x0053fc10,0x007b867d,0x00a1cf9e,0x007f4dbb,0x00624b42,0x001e8921,0x002593e5,0x001be09a,0x002bd66c,0xfffe0e13,0xfff1796c,0xffd72df5,0x0004dd89,0x0008779b, -0xfffe3777,0x000b0209,0x01292670,0x00fd7d7b,0xfbfdba40,0xff79f90a,0xfee91a78,0xff745524,0xfff1d3d3,0xffd65c2a,0x0082334e,0x00810032,0x006e0da2,0x00806e9e,0x008682d0,0x00f0de00,0x001830c2,0x00257e53,0x000af807,0xffe295b0,0xfeb2ee3a,0x00c26a78,0x007ec816,0x0084412b,0x00e02108, -0x006c2e30,0x000a5dcf,0xff6e0049,0xff752580,0xff94083b,0x001ed87a,0xffd1d581,0xffc35a34,0xff93716b,0x0037ab8d,0x00af4def,0x012e648a,0x0157f840,0x01dc012c,0x00cf3a40,0xfe21f99e,0xffbd1c42,0xfe601c00,0xfeb6c10e,0xff76e8f9,0xffd837b5,0x005efb0e,0x00d66dd1,0x00a26125,0x00d09de6, -0x0075aca3,0x020ec024,0x00bb6903,0x00a4e207,0x0066d76b,0xffd5af1e,0xffd28822,0x00d68151,0x00f5d63b,0x01222868,0x020c1408,0x0188362c,0x0112daca,0xfff19de7,0x0038d41d,0x0028582a,0x00675d44,0xff376a0d,0xfea7dec4,0xfdeb1ccc,0xfebb7e00,0xff0d0fb7,0x0088cf62,0x00bced81,0x075133d8, -0x02887c28,0xfcccb774,0xfe36899c,0xff570033,0xfe7992c8,0xff7d0ece,0xff55c824,0x00be68ad,0x01c8b2cc,0x017e6288,0x013c290c,0x0175bd26,0x02a48c0c,0x00d58762,0x009f7a3b,0xff498044,0xff73fc94,0xfe80a3f8,0x00819bea,0x00c5f5c2,0x0081870b,0x01dc7a50,0x009b9884,0xffaa76fd,0xfe24d260, -0xfe776456,0xfee82c8a,0x0041f656,0xff154ba2,0xfee56496,0xfe57e686,0x005c2a03,0x01f0542a,0x0571c9f0,0x062bf890,0xff07a5ca,0x0838e8a0,0x0e89bbe0,0x0a07dd40,0x05f274e8,0x0391b018,0x0323e07c,0x04b4a0a0,0x036b5804,0x02105f30,0x01decaf8,0x00e9239c,0x00a3ea89,0x01e4679e,0x010675c8, -0x0101e8be,0xff87d176,0x00e72a1d,0x008ffc01,0x01b69058,0x0365e634,0x049b6710,0x07e564d0,0x077d1108,0x08afffb0,0x0ac35eb0,0x0aed97e0,0x0a57db10,0x08fdf2b0,0x02fbdd48,0xfd376550,0xf76f19b0,0xf4a76610,0xf44e3da0,0xf5f0d990,0xfce1fa3c,0xff611845,0x00d887c6,0x04855de0,0x037651e0, -0x04bb6738,0x057bb308,0x03ef5970,0x02d1b62c,0x030aa450,0x0311be50,0x00ddaf17,0x01e7f8f6,0x02338a64,0x0363933c,0x018e2352,0x01a28fd6,0x01bc3930,0x02b88660,0x025803b4,0x017b0ffc,0x0123a00c,0xfe443f6a,0xf9ed6ba8,0xfb81edb8,0xfb895a78,0xf8f2ba68,0xf994ec08,0xf97a3b28,0xfa89edc8, -0xffd265f2,0x03908530,0x0643ee00,0x0898eff0,0x082998f0,0xff29857a,0x026998f4,0xfe9026ca,0x017fef0c,0x02b4a6ac,0x02068648,0x03690f0c,0x00ab6891,0x02e3ff8c,0x0647f020,0x02fcc418,0x01b58c16,0x00905d6d,0xfec95810,0x0000a840,0x06c241e8,0x01dc52e2,0x00d51990,0x014e3568,0x0097c43d, -0x00821919,0xffe14e8b,0xfdc2a840,0xfd56f054,0xfcdff894,0xfa24f038,0xf87839c0,0xf72ae920,0xfa499450,0xfcc3b1b8,0xfeff893a,0x02901a78,0x04b2a118,0x0815be60,0x04767210,0x01adfa9e,0xff03f1f2,0xff9c9a68,0xfcbc79e0,0x003d51b7,0x032bd37c,0x0084f873,0x0191ba82,0x0131a7a6,0x01dba0ae, -0x037b5764,0x00efa7c5,0x000e7663,0x01eb4492,0x00ffa7eb,0x019d3710,0x049cd480,0x01ac816e,0x01046012,0x0018f6ff,0x00b6cb57,0x01c24728,0x007f46c8,0xff8dd9c2,0xffde63b6,0xfffc2c32,0x00ddc578,0x00e6cc8d,0xff6d7a7b,0xff438c87,0xfcc9ae80,0xf81e1fe0,0xfa211568,0xfadd2560,0xfac0dc48, -0xfbb49620,0xfbeaa358,0xf87ecd48,0xfdfcca50,0x003aae08,0xfeba76e2,0x011cbde0,0x018c3cac,0x00c2fb52,0x014c782c,0x00cc71e3,0x0173206e,0x013f44b0,0x0124de60,0x0177c3d0,0x00d1fd78,0x00b70330,0x00e3cb43,0x00f02688,0x0155df80,0x00e9f8cd,0x010095d8,0x00f14668,0xffb1755b,0xff1faacf, -0xfe9d80a8,0xff097b42,0x00973125,0x00f19528,0x01a9ac46,0xfe5ce006,0xfd089f00,0xfcd8aa50,0xfd92c63c,0xfdcf015c,0xfcfd002c,0xfe43c6dc,0xfdf36c94,0xfa9d9d78,0xffdaebff,0xfe5a996e,0x012a6bc6,0x01d1e686,0x02421d20,0x02174810,0x01ea1ce4,0x01bf1058,0x024ffbac,0x024116e8,0x02068628, -0x011339fe,0x01da306e,0x01c3c87e,0x0182881e,0x00f2c6a8,0x007e0ed4,0x0028f7ad,0x00498ea6,0x00016ec2,0xffd09f15,0xff240241,0xff227011,0xff8bb7cd,0x018556f6,0x01dee962,0x022fcd2c,0x0193da8a,0x020b1e5c,0x03170338,0x02112c54,0x00743f3a,0xfdd1db60,0xfe756950,0xfe2d98f4,0xfd114c8c, -0xfccdc984,0x00360a23,0xff88cc3e,0xff45dcb5,0xffde8d7c,0x000a30c1,0x002a4606,0x004c1e6e,0x003b6bf0,0x006135c7,0x007db166,0x00c520b3,0x00ce0fe2,0x0175fa3c,0x01adffe4,0x01cb9c2c,0x01c36624,0x01e6a8a8,0x011e77c0,0x0082306b,0xffc3f3ae,0xfff8cc6d,0x0050b20b,0x00454f74,0x00d33b01, -0x0161a84c,0x020924f0,0x018ef9ca,0x00eae84a,0x005749a8,0xffe03dde,0xffa5cc04,0xff354790,0xfffa5341,0x0057c58a,0x00ff7224,0x00aa53ea,0x00343790,0x0073995d,0x00645bfe,0x00febb29,0x00f5b957,0x0142fd3c,0x019fee84,0x01b848d0,0x01c97c12,0x01799c28,0x01808790,0x01479c1e,0x01399152, -0x012bafb4,0x0157fdd6,0x00e5eec1,0x00c3aab2,0x009c2069,0x01353566,0xff71ba92,0xff705b54,0xff6bfb15,0xff749dfd,0xff6400fb,0xff4294af,0xff429fbd,0xff1fb8d2,0xff219b5e,0xff09c785,0xfee39c48,0xfec2acc8,0xfe9c0d0e,0xfee12992,0xff1eacb7,0xff64b648,0xffa39688,0x003411db,0x006ca627, -0xffadc060,0xff9d28b6,0x00216ae3,0xfff65dd0,0xffd4f214,0x0032519c,0x003fcd16,0x006dc942,0x008a3c53,0x00b29749,0x00d40101,0x00e71756,0xffe8e333,0xffce94a9,0x00e9294c,0xfff1b471,0xffdb6841,0xffd4e33f,0x0003ab68,0xffe74679,0xffdeaf47,0xffd833d7,0xffd695ff,0xffceb29e,0xffbe5462, -0xffb1a3af,0xffb12073,0xffb6428d,0xffbafa4f,0xffb048b8,0xffd719a8,0xffecf700,0x0005a812,0x00231d1b,0x004ab2ba,0xfffb0ac7,0xffbcd954,0xff31ac12,0x001d1707,0x00a86751,0x010628aa,0x002db278,0x00a4d95f,0x00afd0de,0x00aa3368,0x00aff871,0x00b0cd3a,0x00b38a7a,0x00c1f341,0x00f743d9, -0x009d4a27,0x004f552a,0x00c0e0f7,0x008b85cb,0x005dd015,0xffdcf332,0x00125fe1,0x0001be0d,0xffee6e95,0xffe68a6a,0xffdc6cf9,0xffbc4f29,0xffdc72b3,0xfff0489b,0x00087db2,0x0024bc72,0x00293f9b,0x0003b35e,0x001e7526,0x0012be45,0xffd8717c,0xffc12a79,0xfe087b08,0xfed0e682,0x020340d8, -0x005af705,0x011214b2,0x00abb3ca,0x0098fa52,0x008bc3cf,0x0045d17a,0x002fab9c,0x0065251a,0x005f7467,0x008f0a69,0x00ee740d,0x00ce5aba,0x00a30683,0x005ee45c,0x007ab331,0x00f0d106,0x001b5ca1,0x00258b05,0x002fcee5,0xfff6c551,0xffdf7a59,0xffc070c0,0xff8f214e,0x0000035b,0x00310629, -0x002c12a0,0x004a6fbe,0x00324d0c,0xffb4eb4e,0xffad3787,0xfefc22ae,0xfe07fdbe,0xfde887b4,0xfbe65678,0xfdac773c,0x00cb6ee9,0x0052ff0b,0x01ce137e,0x014c2cd8,0x0119d2e0,0x00f74f5b,0x00bcb0bc,0x0092753d,0x00c070e1,0x00b2ec4c,0x012c4036,0x01c629dc,0x01758562,0x010585ee,0x006a9721, -0x00d58d07,0x01196080,0x006de96f,0x00519a20,0x00484b5f,0xffa62118,0xff6be945,0xff16ed72,0xfe58ca0c,0xff055dcb,0xff8df703,0xfff6c9af,0x00d79e9a,0x010badb0,0xffd653d9,0x004aca39,0xff7ac2c7,0xfd34eab0,0xfd20ca18,0xf4d58f50,0xfbf74190,0x02b1e818,0x01bd6644,0x0242a300,0x0282e43c, -0x01c98e58,0x01071394,0x00d55990,0x00db5a7e,0x007b09da,0x00e7d9b2,0x018d37e8,0x02de3508,0x017a6056,0x010bf5c6,0x00f824f9,0x010d1368,0x016c7778,0x00ce89ca,0x0073b0cf,0x00db6844,0x000b215f,0xffb09eb2,0xff2d96a5,0xfe544c6c,0xffefe377,0x00bbed4a,0x00a13ac7,0x01519664,0x0060166b, -0xfe230028,0xfe4f26c2,0xfbe38a40,0xf6b09800,0xf66c22a0,0xfb836360,0xfb5d25f8,0xfb06e450,0xfd98d314,0xff6ee461,0xff925e22,0xff02dae8,0x000e03b1,0x029d8d84,0x033a419c,0x02d0b484,0x0133a3e2,0x00d713fa,0x02368cb4,0x015cd40e,0x0130b0cc,0x0083757b,0x017f91ac,0x02387b88,0x02dff77c, -0x00421274,0xfe87cfaa,0xfc731b28,0xfc42335c,0xfbaead10,0xfa6a4388,0xfb47d8c8,0xfc4b7cc0,0xfe0955d2,0x0062671b,0x0369191c,0x08fcfce0,0x04d585f0,0x043c8198,0x068c6240,0xfe7ddc7e,0x06ea3730,0x0153bb12,0x00e32d56,0x027f82e8,0x00b8552b,0x02f34424,0x0395a3ec,0x02dc5f44,0x02f48bdc, -0x03080594,0x00c92f09,0x015bf730,0x01ba16a0,0x0361f914,0x018d5d3a,0x0184e52e,0x015b1eb8,0x01bdd86e,0x01caec92,0x00d7c6f8,0xff93d281,0xff9c1f5f,0x006388c5,0xfd205c14,0xfb444040,0xfadfb610,0xfa03f108,0xfa58fa10,0xfb21b698,0xfe664354,0x00a6f529,0x03f7cbfc,0x04be00d0,0x04ac6dd8, -0x05195ba0,0x06c37e98,0x02e48f48,0xff1d9423,0xfdf48528,0xfe57538c,0xfe011806,0xfe8ae804,0xffe75543,0x04dfdf70,0x017a100c,0x0040ded6,0x0018be8e,0xff6c79aa,0x00ff26d3,0x0600ee98,0x01cae02c,0x00b7bb45,0x00770735,0xff53be32,0xfeddf228,0xfe794d4c,0xff1fe711,0xfe0e2aea,0xfc9691a0, -0xff000608,0x01589378,0x03c2dc58,0x04f33298,0x04db6980,0x02f148cc,0x01d33e2a,0xff9a235f,0xfd340478,0xf9778378,0xf87e8e78,0xf8692490,0xfe87e2fe,0x016afaf4,0x000d4fca,0xfe859e4a,0x002156ca,0xffd6711b,0x008e3cb7,0x00a93850,0x0238b5ac,0x00a3777a,0x00adc6e5,0x022f81e4,0x004fe193, -0x01203b82,0x03c1bb30,0x01144d28,0x0078160c,0x0030b79a,0x00857f79,0x00551a60,0x018354e6,0x04463e98,0x047216f0,0x02e4f67c,0x04c9d790,0x05cd3e90,0x06614040,0x051790a8,0x035ecf44,0x016f2e44,0xfd57d870,0xfb38bf28,0xfc3e69e4,0xfb0159c0,0xfc0e6cd4,0xff598f81,0xff9bda52,0xff88c7cb, -0x00509aef,0x000402dd,0x003a1b26,0x00bd3595,0x0068a169,0x00d6bbe5,0x017c1bbc,0x00de6808,0x00771ac1,0x00341cd6,0x00e82e4e,0x0149edda,0x012b8e9e,0x0116c744,0x00e402a7,0x00e9b8eb,0x00537deb,0xff939609,0x00b45c72,0x012f08ac,0x0217aae4,0x0282caf8,0x01f24f00,0x011e2e42,0xffd56365, -0x003039c4,0x004d1aff,0x008e098b,0x018779c8,0x01b5c0f8,0x0130655a,0xfd3b6c18,0xfbc34210,0xfc61eb84,0xfe9c6dae,0x00a19cb7,0x013da79a,0x00a33c39,0x007b5f05,0x0140df2e,0x009f3a11,0x00af5c3a,0x00d3f7f3,0x01187226,0x01383f62,0x00d7de09,0x00d3a915,0x00c2ffea,0x00cf5d6f,0x01236742, -0x01341762,0x00feda01,0x00a43bd7,0x00b00d14,0x01b69088,0x017d8738,0x00d013a2,0x000c48e6,0xff63b00a,0xfee5c298,0xfedb816c,0x006b62ac,0x00b9b967,0xfff6a27b,0xfe7b583a,0xfe708cfc,0x002318cd,0x00e9e5a2,0x00b00fa2,0xfe23890e,0xffc49c63,0xfe9894aa,0xfe8c4afe,0xff802c34,0x0023d41e, -0x00e1cec7,0x00c5da8b,0x00f38ec2,0x00edde80,0x00d3e15c,0x00a605df,0x00994d18,0x00c17d8d,0x010ecb98,0x01244440,0x01036dfa,0x00b533fa,0x00632d38,0x0013154b,0xff9bdff1,0xff15e4c5,0xfece335e,0xfeb0f208,0xfeba0762,0xff8050ff,0xfff77922,0x0034143a,0xff5f90a4,0xfeb59a2a,0xfe4b5ffa, -0xff910b4a,0x0089e5a1,0x013270ba,0x0033bd15,0xffacfbe5,0xff1143ec,0xfeea8dfe,0x01508a36,0x016dd982,0x01a0a6a0,0x013366fc,0x01630cbc,0x0134a748,0x00eed2c8,0x014733d0,0x00db3c0e,0x0127cb5e,0x013ace52,0x01280e20,0x01103d58,0x012e8bb2,0x00c74174,0x00a52d35,0x009a9373,0x007c7fc8, -0xffae2e26,0x00a5eada,0x00bcdc16,0x009a92a0,0x006805ea,0x0043a8bc,0x00339d3b,0x00580d63,0x008b4193,0x00d94fbc,0x00e22ca0,0x00e2cd24,0x00bc82af,0x00f028c1,0x00f19f8e,0x0106894e,0x011ae0f2,0x01454c38,0x01763dd6,0x01765e0a,0x01bbb11a,0x019b400e,0x00f83d72,0x0198833a,0x01786efc, -0x01418cca,0x0151877a,0x01335a6e,0x011136d4,0x010aa9d4,0x00f30623,0x00d9b65a,0x016c945e,0x01ad62f8,0x0055850b,0x0117fef2,0x01460644,0x0175ddae,0x01348b36,0x01329ecc,0x012f2980,0x011b60d8,0x00fa7617,0x00c13a7c,0x00e987b1,0x01035450,0x012c9644,0x014870be,0x016d67fc,0x01869590, -0x01863cfa,0x01891ef0,0x01831b7a,0x0179af1c,0x021697f0,0xff7b3eef,0xff53a13e,0xff6ae8a5,0xff34a785,0xff482726,0xffb6bdfc,0xff922829,0xffc07be4,0x00182655,0xfffd4d9e,0xfff25168,0xffeeff07,0x0005007b,0x001673d3,0x0026e639,0xffead32d,0xffc94cd7,0xffe2aa44,0xffba9803,0xff9af067, -0xff798f52,0xff909185,0xff85e9a0,0xff708a9a,0xff72b030,0xff6bf42b,0xff755d25,0xff5817cc,0xff4cb82f,0xff33d80c,0xff405020,0xff43c008,0xff500b29,0xff38161a,0xff301f45,0xff3da16c,0xff47b4df,0xff41e2a7,0xfe518e0e,0xfdaa5d2c,0xfea38086,0xfefdde18,0xff82bcaa,0xffc6a057,0x001c911d, -0xffe8a835,0xfff37563,0x00048d3d,0x000bb3d0,0x002571be,0x003b411c,0x005cefd9,0x002fb59a,0xff9c2307,0xffab3ed8,0xffbe2a3f,0xff785e37,0xffb6c3e4,0xffba1594,0xff7c9e69,0xffa4bc2c,0xffaecf9b,0xffc3bb9d,0xff74ad89,0xff295f5c,0xfed86832,0xfef5866e,0xfefb9318,0xff3941e9,0xff3248b0, -0xff99d055,0xffbab33a,0xff8e1210,0xfe57025e,0xfcf87ff4,0xfbe2e748,0xfd254950,0xfe4271fa,0xff668728,0x003adda9,0x00a8651a,0x00813e7b,0x008acdc7,0x008aab97,0x00bd4d23,0x00fcabc2,0x00e5297e,0x01340630,0x00dfe856,0xffa29340,0xffe8509a,0xffa36353,0xff7331f7,0xffb97357,0xff748a0e, -0xff0617fc,0xfeef68ce,0xfecdf4a0,0xfeed6470,0xfe357b48,0xfdbcff54,0xfd3fc7a4,0xfd394a0c,0xfd84a230,0xfe292704,0xfdea1e08,0xfe389bbe,0xfdc8f2dc,0xfda48464,0xfe45327a,0xf90eaa00,0xf737d730,0xfab2c2b0,0xfcc7ea88,0xfe66a9da,0xffd9761d,0x009a9df9,0x00fa9432,0x014e8fb6,0x01058b3e, -0x010a7c6a,0x01946996,0x022f2944,0x01e36916,0x0119999e,0xff98b9f6,0xffe209e6,0xfff5b36d,0xff65261e,0x0008ced6,0x003bbbdd,0xff5ea665,0xff7beec9,0xff68bb16,0xffc6b1fa,0xfebe581a,0xfdcea190,0xfcd09e44,0xfd2b9c08,0xfd850dcc,0xfee0d020,0xff3ef1b2,0x00f50dbc,0x0023ba06,0xfe59f122, -0x06750840,0x02a9a61c,0xfec62f2a,0xfce1e614,0xfdce5bd8,0xfe1d2400,0xffca5885,0x00ad6570,0x00be5cc4,0x0111b35e,0x01921f46,0x015a99ca,0x017d308a,0x022d7254,0x00ffba73,0x00b8aa0a,0x00c5e73e,0xffbc8279,0xffdbaa44,0xff8afe24,0xfde9623c,0xfd205920,0xfa9a78e8,0xfce3fa20,0xfc626c6c, -0xf98b19a8,0xf7966240,0xf59bb9a0,0xf4280470,0xf57b02e0,0xf6d04a20,0xf8425bf8,0xf42973c0,0xf4dcf3a0,0xf83598c0,0x01191bb0,0x0a120770,0x0845a7c0,0x06f88540,0x05bd1448,0x061b6b40,0x03274da8,0x0276da54,0x02c46a8c,0x01f1defe,0x0209e478,0x011be80c,0x0097adb8,0x01044138,0x02972674, -0x00f8c014,0x007701e1,0xff726fbd,0xfefa1e60,0xff5aab65,0xff3a729a,0xfebe8e16,0x008bbdbd,0x020d3478,0x0373987c,0x03c47740,0x03c91174,0x03efea1c,0x0417b7a0,0x03d8fb7c,0x00aec7ab,0xfdef8084,0xfe992082,0xf9a9d790,0xfc6b5724,0x04ce38e8,0x07bc9358,0x02c8095c,0x0254c7e8,0x02d8e7b8, -0x0157a49e,0x0085005c,0x02584ad0,0x0250ecdc,0x04b8c0a8,0x01731cd2,0x00385d5c,0x00b3c60f,0x003f19e0,0x01970668,0x043cc028,0x018108b0,0x00d14916,0x012ce880,0x0101afec,0x0079129a,0xffbe04cf,0xffdb5372,0xff1ab0df,0xfe40692a,0xff81b5f9,0xff2d36f3,0xfd2c9240,0xfc03ae2c,0xfbc65268, -0xfcbaac30,0x0061ca10,0x021d0e74,0x043ce220,0x0191caec,0x024dc50c,0x02d7a044,0x035e6d04,0x0108152e,0x009442c4,0x01e83518,0x014c1cc6,0x013c598c,0x01f3ec4a,0x018d42fa,0x021d8878,0x00fc77b8,0x00815fbb,0x0165ca80,0xffc3ba31,0x0073816a,0x02d2059c,0x0258cc70,0x02ae931c,0x024250e8, -0x01921c36,0x01f0ba2c,0x01666262,0x00cc37eb,0x00d3dc41,0x0067ecf9,0xffaa002c,0xff0551ba,0xfee3062c,0x0058888d,0x017cacea,0x01facef0,0x027989dc,0x01dc0a9a,0x017f9710,0xff13b3b0,0xffcc52a2,0x0323029c,0x0283b824,0xfffcb40f,0x009ad312,0x003774d8,0x0059beef,0x007644bd,0x00e20b3e, -0x0145adb8,0x01e0182a,0x013b2468,0x00d177f4,0x0083a6c6,0x012900e2,0x018ba0f4,0x0158d7e8,0x011aa36c,0x00cbf4d4,0xfff7999a,0x0056f194,0x011177d2,0x000d48e0,0x009a7948,0x009fa0c0,0xfe16fe88,0xff337d35,0xff800ecd,0xfef4158e,0xffa7b1ca,0x008d8d00,0x016df02c,0x00702b16,0x00010fea, -0x008dc795,0xffd392a2,0x003893ab,0x0255ab08,0xffc4be39,0x0174aa2a,0x0074a64a,0x0162e476,0x0187d69c,0x011afa14,0x00e8cd0b,0x00a03671,0x01342e20,0x00344480,0x00389976,0x00b7ffe2,0x009ce480,0x00762078,0x009b90df,0x010af032,0x00f7253c,0x0085ebe2,0x0074a480,0x00b743ba,0x005dd856, -0x006ae348,0x006f0968,0xfff6525d,0xff0e1743,0xff98200c,0x015ac5a8,0x010f13aa,0x0099877a,0xffc35e19,0x0038ebb6,0x006af47b,0x010b2aa6,0xfe8ef0dc,0xfe1e0762,0xff248479,0x01014382,0x00df793c,0x01a42f0a,0x00fd7ee9,0x018266fe,0x01e09fc0,0x02071ae4,0x0229ea64,0x02449320,0x01d2842a, -0x01355630,0x00acce9d,0x0068a819,0x00d42dc4,0x009c1d37,0x008657d9,0x002da9ad,0x002f7ed9,0x002953c7,0xffd8ff72,0x00396ed2,0x003ed253,0xffe90e3a,0xffd30625,0xff77a1b2,0xff34df9d,0xfef96d4a,0xff8a8a5f,0x005a71d8,0x01002292,0x00d7d0e8,0x00891bfa,0x00b954fc,0xffff0ff0,0xff722ab8, -0xfe87c4a0,0xff85be52,0xffa3b0a0,0xff249a2c,0xff7937e8,0xff214a57,0xff169090,0xff0c8395,0xfed5f57c,0xfebfa710,0xfede9d3e,0xff143077,0xff6b16d5,0xff675e29,0xff7a2efd,0xff9a6b22,0xfffb5822,0x000e3e6b,0x00046f3c,0x003b775c,0x00e59304,0x00476b28,0x001fcc80,0x0027c512,0x00213f40, -0x00128dab,0xfff5a1f7,0xffa96451,0xffde9ef4,0xffe3f319,0x00183ef5,0x007668f0,0x00f3b6f8,0x015ea802,0x011fce60,0x00f11164,0x00acdc99,0x00372a27,0x0052850d,0x0005286b,0x004798dc,0x00710b6a,0x0127a57e,0xfff0006a,0x004d9f97,0x00da984a,0x00fb8345,0x010bf128,0x011c411a,0x013ea57a, -0x015b5438,0x0171e90a,0x00944b7a,0x0037f9c9,0x018cf758,0x00ba512a,0x007689a7,0x002ad140,0x0052d0fb,0x004e623e,0x004e36cd,0x0054a612,0x006a290e,0x00810e6b,0x00a1d326,0x00bf9878,0x00d3732d,0x00dee57d,0x00db7291,0x00f674f2,0x00c0023a,0x00a0e1e9,0x0089d409,0x0067e262,0x00837c66, -0xff2ffbf8,0xff51c2c9,0xff7ce599,0xff96116a,0xff814419,0xff82dbf4,0xff9edd27,0xff9ec0f6,0xffc1fac5,0xffb390bc,0xffbad488,0xffc0af05,0xffc414f0,0xffc5aaea,0xffbeb8cf,0xffae0c00,0xff9b34a3,0xffaa6a30,0xff8ad008,0xff7488a4,0xff5d7df9,0xff52c783,0xff4f0ffa,0xff580a76,0xff4096f2, -0xff386d8b,0xff43470a,0xff2eb78d,0xff18bd2b,0xfed89712,0xff11c420,0xfef9965a,0xfe7aebf4,0xfebdba7c,0xfedcf31a,0xff045750,0xff3f9920,0xffefabb4,0x005c1c76,0xff7555a9,0xffd99ad5,0x003a9d52,0x0053f181,0x003a9108,0x0016eeae,0xffb8a82a,0xffa40771,0xffee85b9,0xffd7d9ab,0xffea1684, -0xffdb9194,0x001c7e98,0xffff4e43,0xffb12f51,0xff800231,0xff7ee816,0xff9047ea,0xff591792,0xff3f49db,0xff42612e,0xfef4d280,0xfed1aab0,0xfeda80f6,0xfe7ad9b2,0xfe535c7c,0xfdd3ac7c,0xfe7b213c,0xfe19390a,0xfca12adc,0xfd03e590,0xfd56b714,0xfe569122,0xff6d9e58,0x014eeb7c,0x0142e99c, -0x005efc75,0x0094fc3f,0x009d1004,0x008dfbee,0x00ba4ef3,0x00d83be7,0x0058702d,0x00316dd2,0x00bcc044,0x0082fd04,0x00bbee80,0x0076bf2a,0x00ec1c6e,0x00c79352,0x004e99e2,0xffdb31cd,0xffa6be78,0x00010f87,0xff9765ee,0xff91d0cc,0xffe3a797,0xff52872a,0xff2a9897,0xff7cdf87,0xfeff6668, -0xfead9424,0xfd594330,0xfea5aa6e,0xfdb2b69c,0xfa851be8,0xfbb70488,0xfc4b1b9c,0xff2d7644,0x009b61be,0x054f34c0,0x04873420,0x023eec20,0x020c304c,0x03227728,0x01f8eee6,0x024f9d44,0x01b00d1a,0x00c146c1,0x00cffc65,0x0163c768,0x01209e20,0x0182ce88,0x01d22388,0x01dac088,0x0193b336, -0x00284011,0xfff0ef66,0xff9819dd,0x004462c8,0xffc7f139,0xff651c4b,0xffe843fb,0xfedba6d4,0xfe880696,0xfefd9b52,0xfdd159a0,0xfd584a10,0xfbf97388,0xfdcd68bc,0xfbe90e08,0xf6ac1420,0xf7b94670,0xf94d9440,0xfeea3aae,0x0397e7c0,0xfaf3b490,0xff113ee1,0x017dd5f4,0x00b9d30e,0x00135154, -0x0029e798,0x002e2ab1,0x00a60100,0x0261f9ac,0x02575710,0x0110066e,0x01b8f3f0,0x01dc7a86,0x0192a61a,0x0150a7ee,0x0139fc44,0x0057edf2,0xffc3edfd,0xff0bcee0,0xff77fc28,0x0174bebe,0x01e26808,0x01f42092,0x014803be,0x00c6bf67,0x015f2196,0xfffae5d0,0xff7414db,0xfdd948bc,0xfeca95e0, -0xfe5be35e,0xfeb2a766,0xfea39fa4,0xfccb3ddc,0xfc3bf59c,0xfb0c8268,0x018c1cfe,0x044670e0,0x06435bf8,0x053f0da8,0x0420bed0,0x0299e89c,0x01daba0e,0x041cf9e8,0x0192a1ce,0x00f59abb,0x004133a8,0x00a51948,0x014497e0,0x019acbd6,0x00ec89f1,0x00707231,0xff23d719,0xfebb8162,0xfe1a701e, -0xfdb6a43c,0xfeeb6be8,0xfed68806,0xfd3fe6fc,0xfe4e6f8e,0xfe46d0e6,0xfd245e30,0xfb502030,0xf96e8f58,0xf78a3200,0xfb359e60,0xfbbf3840,0xfa41fc08,0xf9e6bce0,0xfeb30592,0x07efc1c8,0x037b0f04,0xfdbdae84,0xfd36fa0c,0xfd52f3dc,0xfdb179d8,0xff9180f2,0x02497b70,0x03d702f0,0x041ccb30, -0x01021a3a,0xffbda20c,0x0105c8b6,0x001d23c8,0x00fc0661,0x01af8f66,0x0260368c,0x01eebc50,0xff8d6e78,0x00326645,0x00246240,0xff388f2f,0xfc99ac28,0xfbc87648,0xfbb40220,0xf937d9e0,0xf866b930,0xf9948940,0xfb0ead70,0xfda897dc,0xfffd1a8c,0x0314b798,0x0591a9f0,0x056749b8,0x04cf4ad8, -0x016a69d0,0x021e9128,0xff80de1f,0xfff85afb,0x00155994,0xff95cdbf,0x00965388,0x014152de,0x013078f2,0x00ccf5fd,0x00baba92,0x01341fe0,0x0114f156,0x019a0f80,0x00fd5551,0x012c3366,0x0116ea34,0x01a35b2e,0x01ed6696,0x002c779b,0xffc675ae,0xffa06c51,0xff1262f9,0xfeaec338,0xff2e8e44, -0x001e08e6,0x0146e2dc,0x025644f8,0x04118240,0x05261c00,0x07425128,0x093c4d00,0x08b0f160,0x06317068,0x03141fd4,0x00fff811,0xff6cb3f7,0xfea621ba,0xff08b152,0x005fc876,0x006de18c,0x00759f0f,0x002870fd,0x005c5478,0x00ee4c0f,0x018230e6,0x01fc7968,0x0123b86c,0x00887bf4,0x00ad13ad, -0x009b863b,0x00b653a7,0x0121e208,0x004471ec,0xffcf267c,0xff916f26,0xff1afe32,0xff0841e1,0xfea877d4,0xff9518d2,0xfff3ec27,0x00f1864c,0x019c6502,0x02737754,0x0437ff80,0x04d0f860,0x0423d4b8,0x02a44dec,0x01885352,0x00bb4601,0x0115cdc4,0xfe5fce06,0xfdb10590,0xfeae521a,0x0004b1fa, -0xfef2165a,0xffab6002,0x001450cf,0x000e6769,0xffd80b8f,0x0028c1fb,0x002dd496,0x0059cd2b,0x00583133,0x006f51a3,0x00922296,0x00c58b1b,0x011c1f98,0x01d7add8,0x00d8b33c,0x0061fa85,0x00914857,0x0089c773,0x0029cc51,0xffb771da,0x003bd2fe,0x00e4da41,0x019c82fe,0x02c08104,0x02f5f2c8, -0x01c36b8c,0x014c6470,0x017c2ac4,0x02091a74,0x037e18fc,0x0336e4b4,0x01ccc264,0x005f486a,0xffd2230c,0xffe861e8,0xff34a703,0x0092344a,0x00ebbea6,0x014b425a,0x00ca1a3a,0x00c3ad50,0x00e78674,0x00d63af3,0x01115f4e,0x00fdcde1,0x011c31dc,0x00dd7d49,0x00f469ae,0x001b2a8f,0xffeba296, -0x002ed9b0,0x00be3bf2,0x0101ea3e,0x0121d0c2,0x0138cefe,0x01b8edf2,0x0170d786,0x00bc2ba5,0x000d68b1,0x001be10a,0x005fbfd9,0x00ca81d3,0x00c82504,0x00a27325,0x006f4249,0x00955d7c,0x00f8aa05,0x0195c770,0x016c1072,0x0106efd8,0x00633eaf,0x00a9b25a,0x00a618b4,0x00569870,0xffd7a97c, -0xfff2d883,0xffc20665,0xff863f00,0xff79d2ec,0xff4ee3c9,0xff98cd03,0xffd5bd11,0xffdf1361,0x00449364,0x00961b67,0x00c23e91,0x0063d0b9,0x007373a9,0x00642802,0x0050412b,0xff979110,0x00c07283,0x00d3d5d6,0x00ddf282,0x0101c07e,0x011275de,0x00fe0326,0x00e99572,0x014f3eac,0x01c03f68, -0x0228e058,0x02567c78,0x024f6940,0x02498fa0,0x01cf01a0,0x0193dd44,0x01423be4,0x010234c4,0x00da395a,0x00d31e95,0x00c55f7f,0x009fb857,0x0029765b,0x00dbf6d9,0x00a190a8,0x002a1f30,0x002c1072,0x0026c886,0x0032e076,0x001f3fb6,0x0015bb6a,0x002b5820,0x00d0f238,0x0118f00e,0x00234614, -0x00d302be,0x011149d0,0x01648878,0x01395f3e,0x014a804c,0x0149f1b2,0x0143f56c,0x014c324a,0x01494ae6,0x01489610,0x012fc014,0x0118cb7e,0x01158418,0x0120453c,0x0139b460,0x01268772,0x01162e50,0x0108dfd2,0x00ede693,0x01139e8a,0xff151dc5,0xff03b183,0xfedbcd7c,0xfeedb0ca,0xff30cd18, -0xff8c0876,0xff2de64e,0xff4dc4e2,0xff766c07,0xff4f1c28,0xff4ad8dd,0xff5d8683,0xff5ed786,0xff5b586b,0xff557cdc,0xff449d68,0xff4125ab,0xff5b10c5,0xff294999,0xff20f35e,0xff481659,0xff3e85cf,0xff3c35a4,0xff31d7ea,0xff3736df,0xff355944,0xff401f0d,0xff147b03,0xff0af783,0xff09014f, -0xff299189,0xff1708af,0xfea7142c,0xfeea0740,0xfee04ec4,0xfeaafa2c,0xfee31350,0xfe6f2f82,0xfe8d12ae,0xffd5111d,0xff551a25,0xffe64c68,0xffb68469,0xffc15712,0xffe1572a,0xff7c7efe,0xff64a034,0xff78c89f,0xffa20461,0xffc59163,0xffaa1285,0xffd351f4,0xffb7666b,0xff88ac78,0xff6a8a2b, -0xff4c3a58,0xff64124c,0xff3fdabc,0xff25d043,0xff0fcec8,0xff1f89c7,0xff290c3c,0xff4e42f0,0xfef72a62,0xfedaa9d8,0xfeca5fc6,0xff0cfdce,0xfed89db6,0xfde852f4,0xfe9f9a32,0xfe833aae,0xfdea1490,0xfe453998,0xfd8123a8,0xfe2c1c26,0xff79c506,0xff41c984,0x00b30578,0x007e3550,0x0054df88, -0x00756806,0xffe67f62,0xffe1be28,0x00317c58,0x00619a00,0x0084643a,0x003052eb,0x00680bb9,0x004fa050,0xfff5dc39,0xffb7a56d,0xff90b087,0xffd0243f,0xffa756e8,0xff9f4cda,0xff501c03,0xff83b815,0xff60412c,0xff6b89e4,0xfea20bd0,0xfe6d4e38,0xfe71b6fc,0xfef3a832,0xfeaae9a2,0xfcf0df3c, -0xfe28f380,0xfdbe8a84,0xfc188edc,0xfd757cbc,0xfb981840,0xfe3418cc,0x015310ea,0x014413ba,0x0228e550,0x024ebefc,0x01f8c20c,0x01a35d22,0x00a6dd6b,0x006f82ad,0x00e90b87,0x01257134,0x01a775f0,0x01cb224a,0x01b2354e,0x0146a136,0x00c07981,0x0064b0e2,0x001bcef5,0x00901a58,0xffe357ba, -0xff781495,0xfeff2d88,0xff4e0f84,0xff83a7fa,0xff95eb42,0xfed1c9f4,0xfe45b38e,0xfe273f36,0xfebb6d26,0xfe31a558,0xfc4932a4,0xfe668c94,0xfd8df5b4,0xfa96ed80,0xfbc47348,0xfa2f47c8,0xfb766bc0,0xf9392578,0xfa966dc0,0xfe0d0386,0xff6627c2,0xff6283eb,0xfe8db5a0,0x0126b9ee,0x023a00c8, -0x01387512,0x01f2af64,0x01cea5d4,0x008465b5,0x0154a9a6,0x01887f6a,0x008df93a,0x0068a553,0x007fa8cb,0x011c8146,0x00acfc1d,0x01179e06,0x023ecaf8,0x01233054,0x003e00d3,0x002d1a52,0x005ffff9,0x0066cc5b,0x0051ac1f,0xff775be2,0xfe6cfda8,0xfb713630,0xfb9d87f0,0xfc193284,0xfe992848, -0xfc2058b4,0x03cf0c04,0x042ce2f0,0x02ba4578,0x02c86cb8,0x01795d3a,0x010424f4,0x015a35f0,0x03432248,0x016683a2,0x00b3207c,0x004fd662,0x000c2bad,0x00d05285,0x01c17996,0x020bd8b4,0x01cbbd04,0x006d2d3a,0x005cb39b,0xff701ab2,0xff571fe9,0xff90d292,0xfe176304,0xfc1cb818,0xfc2458fc, -0xfcc9ba18,0xfef965ca,0xff19077a,0x00b346e6,0x024b3650,0x00fde81d,0xfd8c2a70,0xf7157470,0xfab890e0,0xfa687058,0xfb2ebdf8,0xff7c2f9f,0x0134e12a,0x00d4a3bd,0xff01acf9,0xffc73bcb,0xfffb5bdb,0x034e6998,0x02f7a0ec,0x025d065c,0x00617d15,0xff145c99,0x000585a9,0xffc56989,0x003ad0bd, -0xfeb73e64,0x01e4dd06,0x021a4220,0xfeb419b8,0xfe9ba072,0xfdfd01bc,0xfdf29ab4,0xfda837f8,0xfe51829a,0xff5e33de,0xffb04339,0xffa2a5a5,0x000db9bf,0x00ccc532,0x018e269c,0x0223bb90,0x02bb5ef0,0x02f65a30,0x03902b18,0x0605ab30,0x083c3330,0x0b723100,0x03e03dd0,0x0011c14b,0x00d2590c, -0x015f1a6c,0x013b5730,0x0033fb97,0x008efcc2,0x00860915,0x00a6a96c,0x02245964,0x022ccf3c,0x019ee034,0x012e75f6,0x0166c7d6,0xfff13c87,0x01df6550,0x019d31d8,0xfeefc0f6,0xff4009d4,0xfeb6be98,0xff42f57e,0xffa6a250,0xff9615eb,0xff5e192f,0xfea20610,0xff5c3090,0x0191176e,0x0273a2d4, -0x02ea7ba0,0x028a35fc,0x05876b20,0x0588e070,0x037e7d34,0x00727535,0xff8614cc,0x026942cc,0x000f84b5,0x02155324,0x0081a314,0x0027f8cd,0x00741c98,0x01012e56,0x01eabcc4,0x01ee1caa,0x010cddca,0x00be9f02,0x0062d19a,0x00a16727,0x0017d369,0x000e26d8,0x0097d8a3,0x00444aae,0x004810a4, -0x0081abe8,0x0075262c,0xffd68557,0xffce3f96,0xfef54166,0xff3abd61,0x011904b4,0x016b69ca,0x01a6330a,0x02ab0f2c,0x01090528,0x00ec4c18,0x003a9a62,0x02217d98,0x02499504,0x017ed9a8,0x005bb04b,0x00133b1a,0x01d55c88,0x0253ba3c,0x01b8713c,0x0192a970,0x00c2e59b,0x00ae634d,0xfff20876, -0x000f5ac7,0x00328f5c,0x00545f3d,0x006aa8be,0x00479837,0xffd0b0cb,0x00a84b92,0x010dbe7c,0x00f4ad8b,0x00666e27,0x00412e7f,0x002019ea,0x0026a736,0x004b593a,0x0040bc2e,0x00514546,0xfff45094,0xff0ba311,0xff864e62,0xff96a601,0xff7b99d6,0xff4f2dea,0xff3b7d00,0xff3241c6,0xfff5bb9b, -0xffc5b52b,0xfeddba9a,0xfe37fe0a,0xfe7f573e,0x004795a6,0x00d53121,0xffedf96d,0x0030618d,0x0007b61a,0x008b77ed,0x00be87bc,0x009c5cdb,0x00807593,0x005acf4d,0x00b9cad6,0x00fd44b9,0x0193a470,0x00e63cfc,0x00d4cbbb,0x00522de4,0x009074c5,0x0082d6f0,0x00a8e427,0x00dba760,0x01352ab4, -0x00e89d21,0x0066a88f,0x00ba9f0b,0x00c27aa5,0x00251e23,0xff446771,0xfe5cd634,0xff4e2783,0x0016a475,0x00db57f6,0x000cb67d,0xff5c752d,0xfea04fca,0xff1e929a,0xff5ac6a6,0xff97d2a6,0xff8f294a,0xffbe600f,0xffb04f92,0x003c8b6d,0xffc0b335,0xffd15be7,0x001290d0,0x00322ca3,0xfff9057c, -0x0027eea7,0xffee678c,0x0022023a,0xfffc6a11,0x0004d5f6,0x001a19e3,0x00bbba40,0x00d8a82c,0x00e0d213,0x010b7364,0x01f5b472,0x016288d0,0x01834c50,0x019c9fa8,0x01b15e38,0x01e12e74,0x0248a1c4,0x0293f5f8,0x01f3be32,0x01342062,0x00a82b2f,0x002aefb1,0xffe2e2e7,0xff6d62f9,0xff88cf56, -0xff88dc35,0xff9ab7b2,0xffba5524,0xff2ac4c4,0xff0d5fac,0xffcca361,0x004e054c,0x0113a1de,0xffa3203a,0x00584f76,0x00d83ee6,0x00d65cbb,0x00f1d1db,0x00f4a7d4,0x011f11be,0x01403b2e,0x014eed26,0x00552cca,0xff9d56f7,0x0185cd9c,0x00a04af9,0x00247b54,0xff41ad36,0xff7e13c7,0xff7e6e50, -0xff86f620,0xff907ab5,0xff83581d,0xff97f50d,0xff679561,0xff5ea5b5,0xff469431,0xff3b2d49,0xff22f52a,0xfefdc19a,0xff128e77,0xff19b5f4,0xff1f09b9,0xff1e5572,0xfea7d26e,0x0015c19c,0xffd547f2,0xfff627bb,0xff7675a6,0xff44ced5,0xff2348e4,0xffe99928,0xff9ca538,0xff466957,0xff28dceb, -0xff285cfe,0xff32de30,0xff3dbc38,0xff3c78ec,0xff2d0e18,0xffa7857b,0x00030d9e,0xff1945eb,0xff8fb312,0xffc924c3,0x001f6e20,0x0021fada,0x00261f5f,0xfffc835e,0x001b7616,0x0024f014,0x003c0726,0x0018d8fb,0x0017cae8,0x0043dae1,0x000e5185,0xffff0df1,0x000d5abc,0xfff9d849,0xfff9aaa7, -0xffe8fbb8,0xffed2b9f,0x0006049a,0xffa9f7ba,0xfe7704e8,0xff4b3aec,0xffb7ee5d,0xffc1ed39,0x00060989,0x002a78cf,0x0026a33c,0x000ce26f,0xffe47b39,0x003cad08,0x005200ca,0x0026cb5c,0x003749c5,0x003e9120,0x0023f6f2,0xfff7e2c8,0xffa2863a,0x0012725c,0x00681449,0x00734d38,0x00046d38, -0x004b5a35,0x004daa0d,0x0072a8c2,0x00104a19,0x001396e3,0x009aee23,0x00290839,0x00172d92,0x004abb26,0xffeb5e7b,0xffdfde26,0xffcb7777,0x0002380a,0xfe762468,0xfde87364,0xfd558a00,0xfe0e5104,0xff5d4647,0xff9f7002,0x0005b852,0x0066f2ef,0xffe9d4cf,0x0009a55c,0x00001f11,0x009170e9, -0x00888833,0x00156c18,0x0087af88,0x00960009,0x0031f5e4,0xfff23654,0xfff9ffec,0xffe31a1a,0x008227c4,0x0077dcce,0xff6f9bfb,0x000def5b,0x0018f7d3,0x007ed479,0xffc40a28,0xffd41b77,0x00bc4def,0xffa8c873,0xff4f2d10,0x0018532d,0xff797212,0xffc5e439,0xfec864cc,0xfea49f0c,0xff0bbb6f, -0xfd2e3b40,0xfb463988,0xfcd62eac,0xff1fb502,0xff9fab9a,0x006a286e,0x00eb11b7,0x007dd2a0,0x0096494f,0x00c12e47,0x0144ecaa,0x01c03fa0,0x0130a76a,0x01b299d8,0x014e80fe,0x00ac4809,0x00712bdd,0x009c9084,0x00457e22,0x011dd830,0x0130ba0a,0xff7bd786,0x00562fe9,0x005bc975,0x009387a3, -0xff7eb7a2,0xff7ec1f2,0x0116497e,0xffc3d212,0xffc338a5,0x010b86dc,0xffcdad98,0xff8632e8,0xfe7477ae,0xfe6e8444,0xfdfbd2b8,0xfe37b462,0xfbbf8048,0xfbcb2710,0xfd604e64,0xfee89208,0xffa9de22,0xff3cad8c,0x00678bf6,0x0142a89a,0x006f0427,0x01a57c7e,0x01643f2e,0xfff3403a,0x00ee27f4, -0x00c46ae6,0xffc620b7,0xff9f192d,0xffc03f7f,0xff07fc54,0xfdfeff10,0xfe1601bc,0xfdc6640c,0xfdac0a38,0xfd6d0c88,0xfd7e8994,0xfdae26bc,0xfeb4bc78,0x005393bf,0xfedbfcfe,0xfe2cc216,0xfcd09660,0xfed2f2d2,0xffe14c7c,0x007cf9a2,0xfdc8def8,0xffd613f3,0x02ba6ce4,0x0400d288,0x024bc94c, -0x0012ab83,0x005b6073,0x00f5e3bd,0x024260e8,0x00a67a7a,0xffddd392,0x0061854a,0xffa502c2,0x00af6cbb,0x01e4bd8e,0x01d30d02,0x01a5d480,0x00e5ffc7,0x00b497cd,0x0022f7f4,0x00791b57,0xffc0d16e,0xffcb9850,0x0132c952,0x00740d23,0xffbd4304,0xffcc6665,0xff62a65f,0xfea8f976,0xfd4d82b4, -0xfed54bba,0xfea85144,0xfb263b08,0xfd6ee700,0xfdbd13dc,0xfcb45870,0xfea02ba2,0x044d22a0,0x01430390,0xfefacf9c,0x000c2fe8,0x02843e74,0x047f5a28,0x037f684c,0x007bb668,0x0041d12a,0xff69c2d3,0x00049f07,0xfffd58e7,0x003e84ca,0xfdea1218,0x01ed8f3e,0x0268cf6c,0xff03087c,0xff9e351e, -0xfefcb52a,0xfee68afc,0xff6c24cb,0xffce7c6c,0x000e00cf,0xfffbda25,0xffbc7bc0,0xffa13b6a,0xfd29f768,0xfc92a7b0,0xfd7651dc,0xfe1d0458,0xfeced82c,0xfeada5bc,0x039d0a30,0x070f8f10,0x083020e0,0x06c08868,0x013722e4,0x00b95d3e,0xfffe3878,0x002759cd,0xfffa6950,0x0111e954,0x017e41ca, -0x00e6e4aa,0x02385620,0x01d1a7bc,0x00d76f4c,0x00dd2298,0x013a2a22,0x003ab9f9,0x0227946c,0x02157864,0x0055efaa,0x00552372,0xffacaf7b,0xff2b11c4,0xfde19098,0xfd27c908,0xfce5b320,0xfb9b68a8,0xfb13d108,0xfb272648,0xfc92619c,0xfe82fcf2,0xff8e3ea9,0x01eb28a2,0x02bb5dfc,0x00cfea53, -0x00558f1e,0xfecbdc5a,0xfdc0502c,0xffca9105,0xfffb47ca,0x0089c8b7,0x01243542,0x0139fd70,0x00beba41,0x01624cd4,0x0125a00c,0x0027187b,0x004ed084,0x0017db91,0xfff203b6,0xffce5244,0x00051460,0x00b16c8a,0x00e717dd,0x00e111de,0x00a7ebe1,0x00f324a0,0x008a61ef,0x006cc819,0x005d22fd, -0x00819020,0x00e44283,0x00db7855,0x011d9600,0x00f01b76,0x00f5b730,0x009f19c9,0xffddd4ab,0x0070418a,0xff8956aa,0xfd0269a8,0x0061fae5,0x01efa504,0x022396d0,0x00912860,0x01a089ee,0x00dfcf2b,0x008c73b1,0x001d1dfd,0x006382cd,0x00b61f31,0x010b6788,0x01045816,0x00ef2b92,0x00cb96db, -0x00c4dc80,0x0063b52c,0x0054389e,0x000f3458,0x005c3d60,0x0061156c,0xffff89e6,0xffadedb8,0xffc84bca,0xffdb2cda,0xffcc3367,0xff667ceb,0xfec691c2,0xfee23e48,0xfeea5308,0xff838280,0xff3ee970,0xff6772d3,0xffd133df,0xff324432,0xfed1c8f0,0xfdda0e40,0xff6f3468,0x001fd37a,0x00b46d1f, -0x01bd3ce2,0x0109c130,0x014556d6,0x011a50d8,0x00f02ac1,0x00d527cb,0x00b42ff0,0x0080039d,0x005fbc90,0x0066f12b,0x00660126,0x006fda0f,0x006471d0,0x005db932,0x005df510,0x0052b896,0x004fedfd,0x0065df0f,0xffe07ae5,0xff8e97c1,0xfecb421a,0xff1afee6,0xff8edbc7,0xffe7475b,0xfff29a66, -0xfff0e75f,0xfff5a34e,0xffd710e9,0xffbb2ef2,0xffae1d61,0xff2b5f20,0xfed447c2,0xfe4b7880,0xff307f5e,0xfff89cec,0x00b83712,0x00e613ba,0x00018ab5,0x00558331,0xffe0829e,0x00769036,0x0067d060,0x007834c0,0x0098bb31,0x00c96094,0x00798bb2,0x00424567,0xfffae9fa,0xffcdf601,0xffb2d2f4, -0xff71f93e,0xff7fc719,0xff89ede2,0xffbf7e01,0xfff98ef4,0x002d62f7,0x0024d951,0x001ca8fe,0xfff5249a,0xffe2f778,0xffb3d346,0xff94d887,0xff76d59b,0xff5e65a8,0xff3d9b05,0xff1e33c0,0xff0049c8,0xfee89d78,0xfeb01822,0xfefcd498,0xff24a0d9,0xff7089ed,0xffa64e5a,0xff949f98,0xffcb5c98, -0xff35cd56,0xfef53262,0xfec7e4ea,0xff7d1a84,0xff198263,0xff18d44e,0xfefc3934,0xfeeb5db4,0xfed97fd6,0xfebdcaa4,0xfea0235e,0xfe79d556,0xfec20c58,0xff2fb11a,0xfeb65716,0xfed07f92,0xff097250,0xffa9f371,0xff962c5e,0xff8c662b,0xff87f84c,0xff8ee8fc,0xff942fcf,0xff97830d,0xff7f5511, -0xff6c9f3a,0xff5b9ede,0xff4e25f7,0xff4402f0,0xff2f8b3e,0xff50a557,0xff636dc3,0xff71cadd,0xff8ca596,0xff534921,0xfff9536a,0x0030cfc1,0x000a007c,0x001bc274,0x0018220e,0x003b77c2,0x000ad03f,0x003e8b2e,0x007083d5,0x0058fbdb,0x00555a5b,0x00472ca9,0x00628eae,0x0065fe24,0x004b8ef6, -0x00563133,0x003aca2a,0x006a2c61,0x0047b984,0x001c5efa,0xffc584ff,0xffe9c969,0xffe74078,0xffddbf60,0xffe6addb,0xffe89bca,0xffdd25e6,0xfff846f2,0xfff6c91b,0x00076fba,0xffcd89c7,0xffcb3ab8,0xfff61361,0xfff62ccd,0x000ea134,0x002cd0b4,0x00424c75,0x009ffdeb,0x0078240a,0xffcf3e17, -0xffe0d7b7,0x0026b279,0x002a440e,0x0032ac7c,0x006cee1d,0x001e272e,0x00162371,0x002865bf,0x003ddb3e,0x003fc827,0x0012ee53,0x0071efcb,0x00733fec,0x0061df98,0x001c550c,0x002d8abd,0xffab487b,0xffd2de69,0xffd1ed10,0xffa34fc2,0xffb3f959,0xffb74e0c,0xffa94b2a,0x000d99ba,0x002868fa, -0x003c433e,0xff6d59ba,0xff457677,0xffc21cd0,0xffb4a6d5,0xffea0b64,0x00341ca7,0x00992edb,0x01dfab4c,0x00c75d82,0xff9c45c1,0xffa7f3d0,0xffe22066,0xffd32599,0x001a8079,0x00d84605,0x003d7e43,0x001773c3,0x003866cf,0x00528ea4,0x00906be8,0xffefb51b,0x00b03f7a,0x00b5e671,0x00a29882, -0x0008bc79,0xffcda1ce,0xff44afea,0xff87c9de,0xff96d225,0xff70a0d9,0xff9c7200,0xffc146db,0xffbb7a17,0x00541e14,0x002d762f,0x007b2b04,0xff148c54,0xfefcac54,0x004e3e3c,0x002670b6,0x00b95b22,0x01518e7e,0x01ce8ee2,0x03a8cd74,0x02930ab4,0x00634084,0x0011f870,0x00efc447,0x002fc225, -0x00a4bcf1,0x0185a978,0x00783a29,0x006a69d7,0x0096a02e,0x013eaab4,0x0158570e,0x002fa2a7,0x014055f4,0x01547894,0x00be712d,0x001e734d,0xffda92f0,0xfeee69f2,0xff6f85ba,0xff8dc9b9,0xff240450,0xff6c1002,0xff6ec6fe,0xffa3b742,0x00a82372,0x01000de2,0x01702fe6,0xfe9555c2,0xfe5889d6, -0x0042c606,0xffdcb5f6,0x003992bd,0x01c2e698,0x031ea1b0,0xfbe4e4e8,0xfdbc1cbc,0xff3baf86,0xff31a7bd,0xfef8a0dc,0xffc3302d,0xffb98093,0xffbbd6c6,0x00d79298,0x015c1526,0x00866dc7,0x013e41a2,0x012a9360,0x00b105b2,0x00c887da,0x0035f8b8,0xff88d9b8,0xfee1e182,0xfe6ab5da,0xfe38cd9c, -0xfeff2c62,0xfef7c9ac,0xfe783cea,0xff3f9b8f,0xfff3ae32,0x007e40fa,0xff8fd1a8,0xfe86e4b4,0xfddfc490,0xfd3248fc,0xfd2bbecc,0xfc7f1538,0x0048e2aa,0x0156733c,0xfec41792,0xfd2c3fd8,0xfd3d2898,0xffb86dff,0xffa86472,0xff762cdf,0xfe80f62c,0x00371368,0x01429a3a,0x022a45a8,0x00d6e4ec, -0xffbe4923,0x0041f9f0,0x001d2c31,0x00c2c33a,0x00b78320,0x01458464,0x011c79cc,0x0039155a,0xffe85ffd,0xffd8e327,0x0014ca04,0xffb19602,0xfffde8e9,0x00acd821,0xfdecef9c,0xfd081490,0xfddeff94,0xfdeb231c,0xfe0161a2,0xfe786f42,0xf9fa0678,0xf9b4dfb0,0xfafb7f18,0xfbcbe048,0xfb0b5b40, -0xf9a0e038,0xfc20e380,0x059b6728,0x04db8620,0x02d7a4b4,0x033b8b70,0x03fa9db0,0x04940b30,0x02ec54e4,0xff46f31c,0x00665280,0x00272808,0x007f3275,0x0046e339,0x008b8e46,0xfefe815c,0x0201cd84,0x0274efe0,0x0067a97f,0xfffc3929,0xff462b23,0xff45584c,0xfee2a776,0xfee8dc96,0xff8dec88, -0xff486e99,0xff349d12,0xff254ea5,0xfebee038,0xfe64dc0a,0xfdf2d438,0xfd8cd338,0xfd714444,0xfbc0b9c0,0x02532324,0x052d4500,0x0436eec8,0x05bbf920,0x0056bd27,0x00473543,0x00cc5466,0x00a926c2,0x006219af,0x01446388,0x01db1c34,0x0199ebd2,0x01c996ee,0x0115a102,0xfffd0741,0x00fa2ec7, -0x0112e572,0xff81b92d,0x016ab976,0x01a50c7c,0x006796d5,0x007cd17f,0xffbd822a,0xfeea4890,0xfe24a0a2,0xfdb8541c,0xfd62847c,0xfc8f0d2c,0xfbb372f8,0xfad337d0,0xfac97ba0,0xfc78d6c0,0xffcc5709,0x0160dfd4,0x0240d9d4,0x00bf5074,0x03adda74,0x03cd6598,0x0232d3e0,0x0111d8a2,0x0163bf4c, -0x0151275c,0x00a3ff70,0x00d500fc,0x0144bdbe,0x01861f2e,0x0134668e,0x0079d2cd,0x0071ac57,0x007a9ec6,0x000be5dd,0x003accdf,0x0098bb86,0x01129022,0x0193e362,0x0174b706,0x00a829b4,0x00ed000f,0x010306a4,0x01470a90,0x0171e608,0x011ec6c0,0x00d57538,0x005fc142,0x013fe48e,0x0246ce00, -0x03cbb078,0x044d4788,0x04ba5a40,0x01bbf13e,0x00099c7d,0xfe2fd7b0,0x0036d7d3,0x0147598c,0x01dfd662,0x01a9aa14,0x00e048e3,0x0078481f,0x008fce97,0x00cc8791,0x00b5d63f,0x011d4778,0x0161e846,0x017aacb4,0x015f544e,0x011e33c6,0x011aaf38,0x00da9175,0x00bc79ee,0x00d6db10,0x00da3a26, -0x00aae299,0x0035cccd,0xffee2942,0xff8d8265,0xff9f3501,0xff8dbc27,0xffb646a2,0x006febad,0xff4428c7,0xfe89d8ce,0xfe2d961c,0xff46259f,0x00294e94,0x01166862,0x008adee0,0x0080b01d,0x00081bb8,0x0131b2e6,0x01a804a6,0x01d33728,0x017b0408,0x011405de,0x013962c4,0x00f3b2a0,0x00a43b6f, -0x006b0655,0x007aa632,0x006fb98f,0x006e7dd2,0x0060f892,0x00a9f990,0x008f3c80,0x00f5b3af,0x00b26a69,0x00f2e5ff,0x00c4b670,0x00f0f261,0x00ebd220,0x00e1f12a,0x0076acff,0x011d7ad2,0x014686d6,0x00a8ded3,0x006d621c,0x0103721a,0x01b9b2d2,0x024459d8,0x022295d8,0x01ebb61c,0x01c7f482, -0x016063fc,0x011932ce,0x00df0490,0x00b9efaf,0x00a0a45d,0x00ab6647,0x00d92a21,0xffe86a81,0x000369ca,0x004527bd,0x004a2697,0x0062d5f0,0x00578a18,0x007c3bce,0x00972f87,0x00b380b8,0x00a87e0d,0x007938f0,0x009eb540,0x009fe54e,0x009b3a23,0x006bcddf,0x007f8a15,0x0089a740,0x007aa897, -0x003a898f,0x00898ee9,0x006a1342,0x008b4157,0x008ca37e,0x007c09b2,0x00486556,0x0037f580,0x00023def,0xffee0e15,0xffdcd513,0xffe2dede,0xffe86516,0xffe7b90f,0xfff12bc9,0xfff8854c,0xfff7ef3a,0xfff8afff,0x004c7b2b,0x0040600c,0x004bea9d,0x003e1e8d,0xfff93a56,0x0071671b,0x004c5f11, -0xfff063df,0xffe3e037,0xffdad0a0,0xffe2d8b2,0xffc8b578,0xffbadcf5,0xffb21927,0x004e291d,0x007def6e,0xffc08a62,0x004bee74,0x0078fca6,0x007afc7d,0x00656f1c,0x0067b5f3,0x0063b581,0x0060d06d,0x006715bd,0x006cf331,0x006d53e4,0x0069f86d,0x0060abb6,0x00536fde,0x0045056e,0x0037592f, -0x003df0d3,0x0041beda,0x0044afec,0x004853d0,0x0078d06b,0xffbaf390,0xffb68437,0xffbb917b,0xffba8864,0xffc3e0d0,0xffd96e41,0xffb05235,0xffc5b23b,0xfffc8f24,0xffd91b47,0xffd22424,0xffd2e9a9,0xffdda87a,0xffdfce2f,0xffd49a6b,0xffd3202e,0xffd6afe4,0xfffd4b82,0xffd04693,0xffc7b53c, -0xffd9ec0b,0xffc00221,0xffc0611c,0xffd1e0da,0xffb4cbec,0xffae68ce,0xffa37076,0xffca3e46,0xffcf4391,0xffbe7154,0xff9b3e6b,0xff8aa1a8,0xff7e38ba,0xffa905eb,0xffb1f50c,0xffb6ad8d,0xffa73331,0xff6a989b,0xff8b9c5e,0xfff9464e,0xff8be6f2,0xffa2c34d,0xffb969d7,0xffe2f7bc,0x003049f7, -0xffe2cbe6,0xffcdbea7,0xffd1c800,0xffe1c3c2,0xffebd6fe,0xffe4781a,0x000dca91,0x001ffce4,0x0025a1b4,0x0008cc7f,0xffbb3da4,0xffccc284,0xffa45575,0xff8d3ccf,0xffd7ad35,0xff942ef6,0xff966b7d,0xff86e36f,0xffee064a,0xffe5763b,0xff95750a,0xff3943ae,0xff1eeb19,0xff319c23,0xffbc8176, -0xfff0458d,0xffeac6f5,0xff995bcb,0xff13316a,0xffd71ac2,0x0035c42d,0xffc15e97,0xffd8b8fb,0xffd8372d,0x000a5d3c,0x00bb9594,0x0005ab76,0xffef613f,0x0001b7c5,0x0019fd42,0x00415486,0x00375ba5,0x005bd4b9,0x007a8fa9,0x00b06706,0x004e1212,0xffd2436c,0xffd68cc5,0xffbad1c0,0xff9639ff, -0x001c7b06,0xff7ab6fd,0xff701fa1,0xff35d477,0x0016e58a,0x00266f6b,0xff939d0d,0xfecba852,0xfe683800,0xfe6cf258,0xff580ccb,0xff85ae1d,0xffc59980,0xff56e323,0xfe66cc36,0xff8980a8,0x0062ce99,0xffaa421b,0xffe3e74f,0x00483f0f,0x0089d9bd,0x01723878,0x005f3133,0x0041ce2a,0x0068312f, -0x0109afee,0x00e0b5c8,0x0021df26,0x00b874d3,0x011ef078,0x00ec3692,0x00491e54,0xff5d0d36,0xffa14af6,0xff6be12b,0xff07c9ce,0x0028f52d,0xff724464,0xff7d5641,0xff4399d7,0x008a32a8,0x00996ce4,0xff69a0ee,0xfe4428a4,0xfdbf0014,0xfe135c56,0xffac3b2b,0x0084a048,0x00fea9bf,0xffd4bbcb, -0xfc538b80,0xfc9237a8,0xfd920358,0xfea02650,0xfed3d880,0xfec7933c,0xfeed6914,0xffa1da3c,0x000f6b42,0x00fb0978,0x00ba54df,0x00f151a0,0x01311be2,0x018baba4,0x00e16538,0x007ec80c,0x00745e3c,0x00289416,0xffa55411,0xff6ed3a8,0x00652ab1,0x008b9470,0x0101a5e6,0xff33fd27,0xff0e927e, -0xffdbafbd,0x002165d3,0xff4ef0ba,0xfeff6b8c,0xfdfd3864,0xfe2346a0,0xfedde07a,0xfef8d9c8,0xfd873298,0xfa683d50,0xfc0ae754,0xfb57f7d8,0xfe7afc42,0xfee740c4,0xfed701c6,0xfeb69a46,0x00bcc58c,0x013bd760,0x0035ab32,0x006877f3,0xffee1841,0x003dbcc0,0x000c6515,0x001fe422,0xffa9b1c4, -0x014050da,0x0177b296,0x0081185c,0xffd281d7,0xff69b237,0xff823dbe,0xff5b525c,0xfedce180,0xfe3b7f1c,0xfee46f72,0xfec72844,0xfde73128,0xfdea32bc,0xfe5acffe,0xffdf0b1d,0xfd4271e4,0xfd43ad14,0xff6157b3,0xffc8e68c,0xff8354d8,0xfdcb20e4,0xfb8a1610,0x06350a18,0x04f4f1b0,0x041990c8, -0x0449bd68,0x04aab5e8,0x0389e95c,0x0249bef0,0xffaae0aa,0x00e97102,0x00794922,0x003ba18b,0x0047c506,0x00a87c55,0xffeeb681,0x01aed27a,0x01d53050,0x00a30cba,0xffc8b6c2,0xff2f4dba,0xff6046fb,0xff19cc6b,0xff030f91,0xfee13c36,0xfd6f48f4,0xfd2a939c,0xfe07ad4c,0xfe9ae456,0xfef5d29e, -0x0040a1dd,0xfd651c94,0xfd443e88,0xfd56bf30,0x00d1ee82,0x03011660,0x0307c7a4,0x05ce3e98,0xff61afef,0xff68bd0d,0xffb99b00,0x0015ec84,0x0098fd86,0x01760dae,0x0213ee88,0x02018978,0x0144c488,0x008bcbfe,0x003b03a5,0x009f7fc9,0x0058c6b2,0xff3cf9f1,0x00550889,0x008310ff,0x0053cea8, -0x00008708,0xff75945d,0xfee21fd6,0xfe6d0aac,0xfdba31ac,0xfd0178cc,0xfc6150f0,0xfc73b92c,0xfcea1478,0xfd144208,0xfdd44e2c,0x001c51b5,0xff9ea1d0,0x012f7a26,0x02077b94,0x051a0710,0x051f5af8,0x01a6d5ae,0x00ab1f8b,0x0051d3f1,0x00afb23c,0x00fcf137,0x0127ee82,0x016d43b0,0x0182145a, -0x01330434,0x00ac8ac7,0x00acb024,0x00ee778e,0x00ed378b,0x00da8a18,0x00faa85c,0x00ec0779,0x01e4e448,0x01c89854,0x00f107e0,0x005bb9cb,0x0073c38e,0x00bbbbc5,0x00b2d375,0x00db4f1d,0x01120810,0x0169496c,0x014edcf8,0x00f8bd89,0x01b80646,0x025e9154,0x03d189ac,0x01d1c0a6,0x00ecf475, -0x006d11dc,0x00468c6e,0x007f8ed5,0x00ce0748,0x003c0a91,0x001002f1,0x00597999,0x0075fce8,0x0073ea65,0x00962409,0x01058c92,0x0153f690,0x0128ba2e,0x01bb918e,0x018ec448,0x00e50087,0x012cb9b6,0x012b5180,0x00e30dde,0x007d1b67,0x0065f359,0x00eb9bbd,0x00ae2683,0x00634642,0x00a2aea8, -0x00fb3c54,0x00f5ce33,0x00c314c8,0xff3e805a,0xff44f7d5,0xfff58e0f,0x0075a798,0x004f0fca,0x001a1dcf,0xfe58cea2,0xfe55698a,0x00344560,0x003850b0,0x00d0f777,0x01cdfd3e,0x006ac216,0x00bd73a0,0x00beec49,0x00d110a0,0x0089a154,0x003d7215,0x00585527,0x00660a28,0x00837253,0x0091ca45, -0x00b6c13b,0x00f25c3d,0x00f6c210,0x00f22451,0x01112382,0x0119269c,0x0116f802,0x00ee7e80,0x0130dcc4,0x01966e24,0x01b23df8,0x019f709e,0x01b96982,0x01fcf2d0,0x01ca707e,0x017b902e,0x010c328c,0x0088b7a2,0xfff5adf4,0xff5c3018,0xffbc5ef7,0xffdcfa1b,0xffd012bc,0x00320520,0x008ab70d, -0x00ebfb1f,0x00e493cb,0x005fc9a1,0x0078e56a,0x0028eafb,0x00b347d3,0x00bb7ff9,0x00f631a4,0x013f772e,0x015dc496,0x016ca89c,0x014a9c4c,0x013636b6,0x0131b92c,0x01306ce0,0x0124c5d6,0x00e94453,0x00a68fe0,0x00835940,0x004330f4,0x00223880,0xff71950c,0xff47c5fb,0xff250c01,0xfee6bbc4, -0xfedac704,0xfed8f48e,0xfed9913a,0xff00394c,0xff36ffef,0xff5af06d,0xff7a94fa,0xff926bc5,0xffa9ad5a,0xffd80460,0xffef2ded,0x000379b8,0x00287c76,0x00836e1e,0x00a859d6,0x006654e4,0x006012f8,0x005119b0,0x00a997c3,0x008c46cf,0x00751403,0x006c3f71,0x0078d320,0x007e8236,0x0082358e, -0x008413a7,0x008fcb26,0x0092f18c,0x008a79eb,0x0073e027,0x00589311,0x004e53d7,0x003b3c57,0x00485edb,0x003d40d7,0x003ad556,0x002ab202,0x00164155,0xfffb9a73,0x0011326f,0x001cabfc,0x002eb916,0x003359ce,0x0040ba65,0x00521e03,0x00558a15,0x006122e3,0x0071b805,0x007c8db5,0x00a9b095, -0xfffa9b26,0xffd1571b,0xffcbacf7,0xffcbd8c2,0xffc795f2,0xffaf7753,0xfff0b95a,0xffea8fcf,0xffef48ce,0xffd0cddf,0xffc95317,0xffc8f338,0xffcbfd9b,0xffd05e8b,0xffdcf1d2,0xfffd6853,0x00107b23,0xffea7b0f,0x0003fbff,0x000ed35b,0x00279928,0x0003f399,0xffffb6d6,0x00086fde,0xfff3a3ea, -0xfff0a635,0xfffa7be2,0xfff68133,0xfff22b0b,0xfff7421f,0xffda0860,0xffe39fe9,0x0018e8cc,0x000ed615,0x000ed792,0x0012e4ab,0xffe3cc5b,0xff896745,0xff56185e,0xff4d34f7,0xff64cd05,0xff7c1b0f,0xffd13e50,0x000d2f0c,0x003db240,0x001163a5,0xfffc28d4,0xfff298b7,0xfffdf596,0x000e414f, -0x0044cca3,0x002d52e2,0x0043d8a7,0x005d5412,0x00591385,0x00268ef1,0x00633fb4,0x0034c936,0x001f544e,0x003f55fb,0xfff7208e,0xffe5b577,0xfff1785e,0xffd5acef,0xffbfa488,0xffb874fe,0xff56457c,0xff64d1b3,0xfffd2deb,0xfff6555b,0xfff31cbf,0xfff662a2,0xffad7970,0xfebaaf4c,0xfeaf80d4, -0xfed62dc4,0xff05bb67,0xff2997da,0xffbacfca,0x002524c6,0x00a6e0a1,0x00218ae7,0xfff99ed6,0x0001343c,0x00117874,0x003e6136,0x00c674a3,0x0075a3a5,0x009954a3,0x00d67e48,0x00c39a7c,0x008f7aa5,0x009d7be2,0x005292f0,0x001fb7a1,0x003e3940,0xffc41591,0xffa5ca69,0xffb9a8f9,0xffa0775d, -0xff6c8567,0xff87e0d6,0xff009735,0xff58239f,0x00a6cd49,0x007299c0,0x00484cf4,0x00051aaf,0xff09e812,0xfe6d9c0a,0xfdc085dc,0xfd30a85c,0xfd639560,0xfe3d6e30,0xff6b077b,0x003ab04a,0x011620cc,0x004f77b9,0x004616e5,0x003d4fd8,0x00cfb18a,0x00c09ef8,0x00cb9883,0x00b1c822,0x00f6a3e9, -0x013fc5f2,0x010111ea,0x00d055fa,0x01319c62,0x00d82909,0x007bebaf,0x00b7e344,0xffe42475,0xffa5696f,0xffa35c50,0xff27142e,0xfef7663a,0xfee61d0c,0xfdebbe68,0xfe45dd2e,0x006df829,0x004f8ad8,0x0008f073,0xff8160a4,0xfe873bcc,0xfdd8a728,0xfe9c97f6,0xff8f6f9d,0xffc2aae1,0xff2c0dc1, -0xfec7b450,0xff2addb8,0x00536951,0xfff64a8a,0x005b5ab6,0x006c98b4,0x00a2c5b9,0x010bd77c,0x01a6c8e0,0x00d5d245,0x00c9cab3,0x01481750,0x00e446d8,0x004ad580,0xffaaf3d2,0xffb3608b,0xffa9e5ac,0x00046d67,0xfeb11bfc,0xfe3877d8,0xfe09586e,0xfe7a2bf0,0xfeb58274,0xfd599a58,0xff433eb5, -0xffe4245a,0xffc0cb04,0xff4d4d67,0xfeea3850,0xfe57a2d4,0xfdd6512c,0xfcf727ac,0xfd261074,0xfcd8f494,0xfddfb3b0,0xff7481c5,0x010bcee0,0x013c8b38,0xff53b4c7,0xffb246ec,0xff864e94,0x003bce82,0xffc32257,0xffcc6c7c,0xffa66b94,0x0181105e,0x01b9495c,0x00da17dc,0x00729946,0x000d47e3, -0xffe5410e,0xffd17284,0xffa0fbfd,0xffbfb072,0xfff2359d,0x004a10fd,0xff897f8f,0x0074169c,0xff6cba14,0xfda5e2e8,0xfc456a00,0xfd277e58,0x00ab7a6f,0x00ee1b2f,0x00e5745e,0xfe9c1f1e,0xfd68d744,0x055a1d08,0x07520628,0x0554ccb8,0x04c70718,0x04867760,0x02ad22a4,0x015c14f2,0xffb46676, -0x008f3d34,0x00252400,0xffedaf76,0x001a74a0,0x002bd968,0xffc8152c,0x0071634b,0x00c7dedd,0x01767a4c,0x000de57a,0xff71e3b2,0xff532cf0,0x000ff883,0xffbf3a01,0xfe97c76c,0xfddb6534,0xfdeeace0,0xfdeb29b4,0xffbc2d74,0xffb40606,0xff4195a1,0xfc801bfc,0xfbdedba0,0xfec7687c,0xfbf47510, -0xfcc36828,0x010befe0,0x03509ea4,0xff6bffea,0xfff55687,0xfff5f0bb,0x00f7a351,0x01612d76,0x021cda18,0x02284e5c,0x01e9ac74,0x00a4d2cd,0x001755d2,0x00861660,0x002f55c8,0x001aa7eb,0x007ed162,0x0096ecd7,0x00a32b03,0x018583c4,0x005a1625,0xff9064b6,0xff6988d8,0xfede2b9e,0xfe32013e, -0xfe29e66c,0xfe80a00e,0xfec0182c,0xfe2501ce,0xfe5a4b1c,0xfd4a0ee0,0xfd40c98c,0xfbfc9f60,0xfde75bec,0x02ab69b8,0x046fe2f0,0x0515cb08,0x039a01cc,0x00e4dc42,0x00c522d2,0x011b8fe4,0x01230a68,0x0165663c,0x0160cf50,0x01376056,0x00f04027,0x00b624b3,0x00cb1ca1,0x01262776,0x01ea6c36, -0x012af07c,0x00fc8a18,0x00b491bc,0x018e12f0,0x018885e0,0x00fd0d3e,0x00a6e3fe,0x006bd377,0x0090c6a0,0x004e6b95,0x004efa01,0x003cd75a,0xffa53ec4,0xff7e29dd,0xffeceac3,0x00f10ef7,0x01b54924,0x028cbf7c,0x0134b7d6,0x00f3030c,0x0213bd84,0x009389c8,0x00151c28,0xff0db34f,0xfff9d605, -0xffbfebb4,0xff9c1af2,0x000a7c96,0x00738f09,0x010eda56,0x015a1712,0x0177c24a,0x0122066a,0x014d6296,0x01420b52,0x012dc302,0x00f05002,0x00c4df2f,0x005173e2,0x005c2e2a,0x00c0670e,0x0159257e,0x01486c68,0x013b75cc,0x01016710,0x00e805a7,0x00e6b7b0,0x00f01322,0x02393a14,0x02d6809c, -0x02a74ff8,0x020b8620,0x00e6fe88,0xffa17c93,0xff18904d,0xff3df0aa,0x005aa2d6,0x00dbf744,0x00bd08fc,0xffd622e7,0xffeb523b,0x0070e0f7,0xfff124c8,0x00372a60,0x0057f9e2,0x006c1075,0x006cd379,0x008e847a,0x00a5f529,0x009a149e,0x00817bd6,0x007d8e40,0x00c1ab6f,0x0125d3cc,0x019918ea, -0x01298d5c,0x00ae51bc,0x00224997,0x00763a87,0x00d28789,0x00fadcf1,0x00edbedc,0x00fd4ec3,0x00d63e0d,0x00b2f81e,0x0096dfa6,0x00a9e40b,0x0035450e,0xfffd5c03,0xffc1dbf2,0x004d76e7,0x00a49c88,0x00deebbe,0x00ccf0f0,0x00f557f3,0x01464930,0x00dea970,0x012909d6,0x015606fa,0x012bd726, -0x014b2b28,0x014e5f96,0x01672618,0x0166857a,0x01845a5a,0x015c2308,0x0156141a,0x0147989e,0x012cdfc2,0x01023146,0x00f44687,0x00bb0768,0x00a7f5b3,0x0079515a,0x005279a1,0xffde15e6,0xffee80dc,0xfff17f19,0xffe403da,0xffeac4c0,0xffe43041,0xffdb857c,0xffd51f33,0xfffe963d,0x00206994, -0x00271be7,0x003baea0,0x004de0af,0x0078763d,0x00a43184,0x00beb2a1,0x00dbffb6,0x00f48c15,0x00eb2a89,0x0104a5fe,0x00eff4e4,0x00ebbe8c,0x00d03f47,0x00f25334,0x00e7eb87,0x00eea96d,0x00ecf975,0x00eb3672,0x00e59928,0x00e48b01,0x00e38da9,0x00e0ca2f,0x00cce6f4,0x00c45e96,0x0097abda, -0x0093ca3f,0x0089f3d4,0x008b401a,0x008a1e8d,0x008d546f,0x008c6af3,0x00901f95,0x009322f3,0x008b6a49,0x009db870,0x00aa67c0,0x00bdac0e,0x00c03f8a,0x00c0c06a,0x00b98009,0x00bfa51f,0x00c7aed6,0x00ceae39,0x00e2c579,0x00dfdd4d,0x000f9d7a,0xffd5e9ed,0xfffed2f7,0xfff76b2e,0xfff3257d, -0xffdda8b1,0x0015749a,0x001d1827,0x002215d2,0x000c8a1f,0x00051ac8,0xfffa9c4a,0x00017d89,0x000adcff,0x00289d82,0x002a226b,0x002fc70b,0x0027dc78,0x0032fe20,0x0033512f,0x002886f2,0x001d3792,0x001932d7,0x00206457,0x00189b4f,0x00111446,0x00041c62,0xfffde8db,0xfff9f9df,0x0013984b, -0xffe2ea82,0xffe7078e,0x00227ed5,0x00053215,0xfff530c2,0xffd3bf63,0xffd33ed9,0xff74bbf3,0xffc60b72,0xff73cbb1,0xffbfe479,0xff9eeae2,0x00178900,0x0045f6d0,0x005a2a53,0x002d240d,0x000db571,0xffffa68f,0x00013917,0x001b14f2,0x0070543d,0x005b517c,0x006aebff,0x007c8add,0x00828e8e, -0x0085b8f0,0x006dfe60,0x0043079a,0x00336a34,0x002c3432,0x0014c6a5,0x0000c182,0xffe658f0,0xffe8ced5,0xffeed453,0x003d5c95,0xffc44502,0xffe46dba,0x00869e1c,0x005fc773,0x00404e47,0xffc89075,0xff831acd,0xfef93a20,0xff9ff462,0xff4fc175,0xff9f1926,0xff3f70c3,0x0011baeb,0x0068ff73, -0x00afc2eb,0x004aebbb,0x00057b1e,0xfff0a3ae,0xffed94b7,0x003b16df,0x00e15562,0x00acee65,0x00c2d2c8,0x00d82267,0x00e5ada0,0x00df930f,0x009ec627,0x00539894,0x003bd094,0x00517b79,0x003f7e4e,0x002178cc,0xfffc1291,0xffb83a49,0xff938f67,0x004a2abd,0xff348ec9,0xff670cd5,0x008ba8f4, -0xfff14b3d,0xffa7b24e,0xfedc0530,0xfebd155e,0xfeb6714a,0xff854d42,0xfee1228a,0xff13b6d9,0xfee087d2,0x0007f189,0x00b0f6e5,0x01379762,0x005fdbc5,0x002a7f7a,0x0010dec8,0x008b9f57,0x00b78fba,0x014a20d8,0x00f2356e,0x01198094,0x015bfcc8,0x0160ab36,0x01829c30,0x00f55e17,0x00953177, -0x0088ca77,0x004ef176,0x00249a05,0xfffd67d4,0xfffc70c5,0xffb16225,0xffc7e03d,0x00df4549,0xff264617,0xff8e9ef7,0x01831df2,0x00f560e0,0x0081ae67,0xff5c091e,0xfe720224,0xfdb38ab8,0xfea2e25c,0x00ec9c41,0x00f48282,0xff63c587,0xff7776f9,0xff9ed441,0x004e02c2,0x003d40e9,0x0064903f, -0x0045edbf,0x0049690d,0x00b5b7f6,0x017e9544,0x00a51803,0x008cef29,0x010b8b0e,0x007a895d,0x00019663,0xffa6c8e8,0xff0f163d,0xfede31e8,0xfec87a3e,0x001621ec,0x0011951a,0xfe6a4168,0xfe17cc48,0xfdd10f08,0xfd73d6b4,0x003c5d5f,0x00d0a6ed,0xffc82d6b,0xff0fafe3,0xfe4ab15e,0xfcf32800, -0xfd10b718,0xfd316774,0xfce8beac,0xfd11d940,0xfdeb2f7c,0x0038929a,0x00ed5c2b,0x00f5b248,0xff5a4492,0x0002f1bf,0xffdc2f49,0x003700b3,0x000f73a4,0xfff17283,0x0023e4fb,0x016f6562,0x01723166,0x00f02d3c,0x00ad32fd,0x008692e4,0x002b31cf,0x003ba93b,0x0061d2a8,0x007fe4da,0xffc0067d, -0xfff59a7e,0x001f1eea,0x0020829c,0xff1d47b9,0xfbff7d18,0xfd33cd80,0xfde20958,0x00ef9636,0x00696ec7,0xfffda0da,0xfef76f7e,0xfe9de382,0x033ff824,0x04f563a0,0x05d56af0,0x04c79ca8,0x0510fa60,0x01c4f13a,0x00a686d0,0xffcb4f5f,0x00155c8c,0xffe54809,0xfffd07c8,0x0010019c,0xffae6841, -0xffe82080,0xff4ab9a0,0xffe1495f,0x028aaa64,0x00b6a227,0xffee393f,0xff85cdce,0xffc2822d,0xff57ecfc,0xff0f3195,0xff6d44fd,0xff402774,0xfdc101b0,0xfed45f44,0xfe10c096,0xfbad3718,0xfb7803e8,0xfbb560c0,0xff7e4197,0xfaf12968,0xfb2fc4b8,0xfdbc06c8,0x00d85113,0x01e6a23e,0x01468f50, -0x00d918af,0x016b86e8,0x02302264,0x02514e94,0x021d94e0,0x016dd53c,0x0010838a,0xffbddf98,0x002f2100,0x001fda59,0x002e9d84,0x00d2b657,0x0066c5be,0x00a2b814,0x0236e230,0x003df894,0xffbcbc74,0xff8bdc27,0xfedd5b74,0xfec661d6,0xff177f96,0xfec0dcee,0xff160131,0xff11d7f6,0x002667d6, -0xff395621,0xfd0b405c,0xfb97ed88,0xfc76f1dc,0x0229e260,0x027d3a48,0x03ee82cc,0x050730f8,0x03038a80,0x011e801e,0x017e3976,0x013cdbd0,0x0149c9c8,0x017921f0,0x011c048c,0x00ea23c9,0x00f28769,0x015334b6,0x018641e2,0x01d751fe,0x0119b9c6,0x00d8fd98,0x00b4d8a6,0x00fc373b,0x00fae60f, -0x0103882e,0x008824e6,0x006a131c,0xffd2ecaa,0xff4be81b,0xfef4b5e2,0xfe8d7ee6,0xfdd5fc14,0xfe0b2a4a,0xfe90eae4,0xffab0779,0x004bc5ca,0x0094c804,0x01fa52b2,0x02ce2c80,0x045656f0,0x02498820,0x00cc08ec,0xffdda5ab,0x00a2b59f,0xff735352,0xffcce129,0xfff4a4f4,0x0076e8a6,0x011d54f8, -0x0147ac16,0x0159ad10,0x013be8d2,0x00d2b8b7,0x00ba2cd8,0x01358552,0x00b2c159,0x007bf57f,0x008cee5c,0x00fc59fd,0x013877f0,0x00f6a443,0x011c77ec,0x010644f8,0x00db4cea,0x00d3574f,0x0129fbfc,0x01da9a44,0x02fd353c,0x035ed8c8,0x035c9dec,0x028cf1ac,0x018fa52c,0x001f4bb9,0x00e2a3ca, -0x00f4f61d,0x009190da,0x00e76418,0x00caa3ca,0xffe4c786,0xff90e175,0x00ba603e,0x008f44ec,0x00908e1d,0x00aa8ae9,0x00ab3fc2,0x00b5c518,0x00c9b90c,0x00f9f6c9,0x00d5353d,0x00b35fe1,0x00843552,0x00bfb9b7,0x01179cf4,0x0146a796,0x00cb69e6,0x003bb996,0xffcf3af9,0xffe45825,0x002dfbeb, -0xffc84ef0,0xffb7c074,0xfffead2b,0x00079134,0xffd3e5fb,0xffa8551b,0xffa59f34,0xffe44d74,0x0052d341,0x00aa5a11,0x00e7f3c0,0x0119b1e6,0x0150f4d2,0x01115198,0x00d18773,0x00c6c6dc,0x00c0c33a,0x00e2e8e6,0x00f95f71,0x01215058,0x00f9e460,0x010aa230,0x01064d1e,0x00ed1347,0x00ef5cc9, -0x00d76030,0x00ed196c,0x00ebc108,0x00e69a6d,0x00cf35ea,0x00d20816,0x00bfa5ce,0x00c74cd2,0x00b96943,0x00939447,0x007699ad,0x0060e7de,0x00737d14,0x00793ceb,0x008c2b50,0x009f84ae,0x00b804b3,0x00bbb472,0x00b33621,0x009c914a,0x0098ebcc,0x00896c49,0x00860c43,0x0095c55c,0x00a3c5b2, -0x00c23452,0x00ce41c1,0x00d5005f,0x00c29c34,0x00c4f5e8,0x00ce1a2a,0x00ce6229,0x00e11856,0x00a82b75,0x00b2bb1a,0x00cdc34c,0x00d38b9f,0x00cd6415,0x00ccdd1c,0x00c949ec,0x00c6b114,0x00c602b8,0x00b27658,0x00a67fe4,0x00a82e5f,0x009d001b,0x0091d38a,0x0099f045,0x009e5154,0x009bb1a6, -0x009a5a85,0x009ca53b,0x009dcc2e,0x00a52f98,0x00a6b1cb,0x00aa1d01,0x00a892d5,0x00ae889d,0x00aece5d,0x00a4f73e,0x00ab98c9,0x00acfa55,0x00b1e0ba,0x00baeaac,0x00be6a6d,0xfffadfa4,0xffd34110,0x000b5021,0xfff23453,0xfff8541e,0xffeb99a0,0x00014fb9,0x000ff53e,0x00289323,0x00166d8c, -0x000aa7ed,0xfffacd83,0x000103c4,0x000b624b,0x002a9bdd,0x001a3045,0x001ac07c,0x002cd4fc,0x00241375,0x001c4d5f,0x0010b5d6,0x0002b8cb,0xfffbaaec,0xfffdb741,0xfffe0dbe,0xfff58d6e,0xffdc57b9,0xffdf99e5,0xffe5b8c5,0xfffd2813,0xfff59a72,0xfffba380,0x001d0ea5,0xfff51507,0xffe85227, -0xffef8646,0xffccad78,0xff7d108e,0x000020b2,0xffc800e0,0xffc18c93,0xff962a2e,0x001740b4,0x003d0718,0x004b9caf,0x001ff65f,0x0001d70f,0xffe77c96,0xffe7c55c,0x0003a759,0x00492cba,0x004f5de3,0x00600a13,0x005f3d50,0x00701158,0x0067672a,0x00387227,0x00083e6b,0xfff205c9,0xfff21b6f, -0xfff97bbe,0xffec3cdb,0xffb8b814,0xffca81d5,0xffd1c7f1,0xffeb143f,0xffd133d9,0xffed88d1,0x003b36d5,0xfff21e25,0xffd509d4,0xffe6232d,0xff7271ba,0xfefb5cd2,0x002a8b71,0xffe6d961,0xfffff9ac,0xff786c3e,0x002a9912,0x006cd8a8,0x0096036a,0x004ba531,0x000725af,0xffd47118,0xffd56bf5, -0x00156a37,0x009ce618,0x00a8e0ee,0x00ba17d1,0x00bc1586,0x00d829ce,0x00bc15fe,0x0082a567,0x0028c867,0xfffc5ee9,0x00188574,0x001442bf,0xfff462d3,0xff71c52c,0xff76a152,0xff9036c5,0x000ea89a,0xffe944db,0x001d14a9,0x00ac4c23,0xffcda5a1,0xff8e43ee,0xffd2e065,0xfed48e6e,0xfe42f7ac, -0x001d4777,0xffb9f5ef,0xff7ef7f2,0xff1593b7,0x008f92ed,0x00e23e12,0x01142a64,0x007ed062,0x001ae5ec,0xfff69ecf,0x004c427d,0x008eecfc,0x014d0568,0x00ee32ae,0x012924c4,0x01508174,0x017512ac,0x01298d64,0x00cbb48b,0x004af5fb,0x000289cd,0x00177b9f,0x0013f319,0xffe11a10,0xff66e992, -0xff97cc24,0xffd304d0,0xffff9a6e,0xff7467b0,0xfffe71fd,0x00f39027,0xfff95bad,0xffa82f66,0x003ad719,0xfe72f48e,0xfdc1683c,0xfcf71bc0,0x00b2e03d,0x012a4fbe,0xff2e3350,0xff7b8eec,0xffa6c30d,0x00303a42,0xffa7d291,0x00041b6a,0x006ea0d4,0x0004418d,0x005e52f0,0x014ddac2,0x00b8da4a, -0x008d3f73,0x00a8313e,0x004fa0f6,0x000b0ff1,0x001fd39b,0x001f7641,0xffd560c6,0xff817d7d,0x008e3940,0x009cad46,0xffc3fc93,0xfe4a5c32,0xfe35c246,0xff44f246,0x01d841da,0x018ed66e,0xfeb2699a,0xfe997fd8,0xfd95da30,0xfc19e9d8,0xfd164b5c,0xff2f556f,0xfd064f64,0xfd1ae318,0xfe14d98a, -0x003b813c,0x006aa97e,0x0063a1de,0xff938d78,0x00136eca,0x000b0ac7,0x00251e6f,0x001e53d8,0x0004f49b,0x00556c48,0x00ae0c4c,0x00da89d6,0x017ceede,0x00cd2e60,0x0087d5f3,0xffd803d3,0xffd1dc13,0xffeaaf1d,0xffe3e2bf,0xff2715b2,0xfec13a0c,0xff162766,0xfe02f0be,0xfd9779b4,0xfd1f30ac, -0xfe310aea,0xffc3748b,0x017152c0,0x00302497,0x0081f3bf,0x021e9524,0x00f7f832,0xff0943aa,0x019f8284,0x044442f8,0x03c83668,0x035517c4,0x008ba2cc,0xffd63540,0xffe289ad,0xfff55b5c,0xfffac10f,0x0032977d,0x004554f5,0xffb2a7d8,0x00687315,0xff5e19ee,0xffe84670,0x0299ec54,0x00e11561, -0x00177151,0xffd9a58b,0xff8feef5,0xff619c12,0xff8f3e99,0x0003846d,0x0035fc41,0xffa09472,0xfeb9ae76,0xfe25c1d2,0xfd478b00,0xfe3c6fa0,0xfdc00b58,0xfd30a04c,0xfb0c0288,0xf994fe58,0xf81136c0,0xfbcb7888,0x050c3a50,0x02d6371c,0x020dc16c,0x0212c460,0x02ece350,0x024a37b4,0x01d07838, -0x01395668,0x0027e204,0xfff4b180,0xfffdc5db,0x00102927,0x00055480,0x008ce624,0x000f9348,0x00330597,0x01a16256,0xffa1ad93,0xff18e685,0xff2545a4,0xfeebb080,0xff1068ab,0xff2f0ce2,0xfeeb54e4,0xff1e9b81,0xffd9047f,0x00bba0c5,0x0067463b,0xfdcce578,0xfd87e6d8,0xfd6ea86c,0xff620e01, -0x0117fefc,0x035b8f9c,0x0533d860,0x05c63bd8,0x0083c486,0x00a8f7ec,0x00f68ac0,0x01080782,0x0168de8c,0x011e07e0,0x013851ee,0x01a6a26c,0x0184e512,0x017e1d22,0x015b5f9e,0x014d0442,0x010eccf8,0x0070215c,0x0091ed4c,0x00b961c6,0x012b4800,0x007adda6,0xfff0a25e,0xff72f810,0xff0ae444, -0xfe8ca104,0xfe1a38a0,0xfeb9ddf0,0xfeffcad6,0xff1c10c7,0xfe606038,0xfe55df40,0xfe82b53e,0x019b33c6,0x0394d730,0x04e15bc8,0x039cdb44,0x01ef83b0,0x004eecd5,0x0072bd66,0x009ef491,0x00abbabf,0x00b72d2b,0x01084148,0x0162587a,0x014535c4,0x0116a30c,0x00c9d560,0x007e1cda,0x0069f8a8, -0x0089db42,0x009f8547,0x00a7b565,0x01091eee,0x0137b706,0x010b7cf6,0x009f40d3,0x00c1d11c,0x00d332f2,0x00f8bc27,0x014a5f54,0x01bf05ea,0x0240f77c,0x0244429c,0x02370c40,0x028f2650,0x01fefdc4,0x022ecfc0,0x027b2934,0x0233ec38,0x01e2def0,0x01b0f20e,0x009cddf6,0x009842bf,0x00dd687d, -0x008adc44,0xfffede1b,0x0019efe6,0x0068783a,0x007b6c01,0x008a5079,0x009aadce,0x00c036fa,0x00e9e3b3,0x00e705a4,0x00e51779,0x00dcfbee,0x00bd354b,0x00be1954,0x00982027,0x007e5adc,0x007069a6,0x00745836,0x000e9b75,0xff99bb62,0xff69c80c,0xff7d0ed8,0xff42784f,0xff3074d6,0xff45465d, -0xff62d46b,0xff7ad4f3,0xffb580ff,0xffdf52a1,0x001b4a1f,0x00501197,0x0076516e,0x00805e4a,0x006948f4,0x002dd66d,0xffe621eb,0xffe97910,0x00dbc5eb,0x00e0eaf5,0x00da9acd,0x00c5076b,0x00c7b1b7,0x00b1c49f,0x00a0b39e,0x0097f9a1,0x00a0084e,0x00b04187,0x00c2b618,0x00cc380a,0x00d4e74e, -0x00e755c9,0x00d45508,0x00bb4977,0x00b35617,0x009f1bc0,0x0089d613,0x00814359,0x0095974f,0x00a648cb,0x00b2cb40,0x00bd6553,0x00c11d98,0x00bd639f,0x00c50cd9,0x00c494ef,0x00ba15da,0x009c3ad4,0x0084803e,0x007bc56c,0x00918bbc,0x00af8e33,0x00c29542,0x00df6d8c,0x00de7bb5,0x00ed203d, -0x00ccb4c9,0x00bd701f,0x00a158b6,0x00cbf459,0x00b25f0c,0x009bb31b,0x00a55a2f,0x00a5f270,0x00a71288,0x00ad9e0c,0x00b0f179,0x00b71cd0,0x00b941c2,0x00c86235,0x008f5775,0x00a4203c,0x00b176bb,0x00bdcd7d,0x00b74ac0,0x00b626bf,0x00b5bc22,0x00b21794,0x00b271d1,0x00b61dfa,0x00ae9ee8, -0x00ab2e9d,0x00ae954d,0x00ba5140,0x00c6016b,0x00c933ea,0x00cc38e8,0x00cde1da,0x00d409ed,0x00d33913,0x011be6ba,0xfffb5a71,0xffe061d8,0x00070c2e,0x000108ca,0xfffe5378,0xffe7884a,0x0015b016,0x0015676b,0x0015eed4,0x000b09da,0x00010aee,0xfff04dc8,0xfff53b92,0xfffc1490,0x0010ada3, -0x0017cceb,0x001e1c0f,0x001e5c03,0x00207cce,0x001be791,0x0012b042,0x0000e27b,0xfff6c5ae,0xffee9d89,0xffefe2e3,0xffec1156,0xffe124ae,0xffe67082,0xffeb7eaf,0xfff44619,0xfff6f531,0xfff81166,0x0003fbf3,0xffda5e4c,0xffd34226,0xfff56d23,0xffd8801f,0xffb143dc,0xffec524b,0xffd81b12, -0xffd17465,0xffa4f544,0x0026dfcc,0x004d0b48,0x003e6c85,0x0023ff71,0x000644dd,0xffebea5c,0xffe8fb2f,0xfffe2613,0x002be61e,0x00405a61,0x005905c9,0x0061dd0a,0x0066f86f,0x0057e729,0x0040da02,0x0006038a,0xffeb2a65,0xffe423d4,0xffed5bcf,0xffe253ec,0xffb96c26,0xffbabc0b,0xffc40432, -0xffd2b4ed,0xfff3f5ca,0xfff75405,0xfffa05cf,0xffa18bfa,0xff8d8570,0xffe58c35,0xffacec93,0xff43b0a0,0xfff08792,0xffac3e33,0xffc5411d,0xff92b555,0x004e7bf7,0x008c9c33,0x007c52d0,0x005008c3,0x0002777c,0xffd2457d,0xffcdd944,0xfffc1980,0x006e25e8,0x009ac2ff,0x00b447ba,0x00c3656e, -0x00cc4a83,0x00b5a732,0x0097eb69,0x001283b7,0xffd8c29d,0xffbfebe2,0xffaeabfa,0xff938852,0xff3f9146,0xff68aeff,0xff8f838a,0xffabdba5,0xffe3d77e,0xffdb6862,0xffe26717,0xff13713d,0xfed553f4,0xffb13786,0xff2b78a5,0xff273cbd,0xff72d079,0xfed13622,0xfe97f25a,0xfe86c5d6,0x0054f621, -0x00ca233c,0x00ddf4c6,0x00860b3e,0x001f6518,0xffeddb16,0x002456d3,0x00734683,0x0121ca22,0x00c925dd,0x010c80c2,0x0178a8cc,0x0184e126,0x013b167c,0x00f8440b,0x00059852,0xffaabbf8,0xffb1e238,0xffb04b18,0xff8a3ae2,0xfee6575c,0xff2362c9,0xff57c187,0xff425f43,0xffb38dc2,0xffbfd7fc, -0xffb46be1,0xfebfbfb4,0xfe92eba6,0xffa63e34,0xff0cee46,0xfe2e5e20,0xfd103a74,0x00d0ed9d,0x01c111b0,0xffa05b61,0xffd07746,0x00087a25,0x00ce7581,0xff7c521c,0xff72d72d,0x0065b1b0,0xffe8906d,0x0035bb1e,0x00ffa1c4,0x01081c20,0x00f5622f,0x00a42121,0x00935672,0x00a624f4,0x00c3cff9, -0x00942b68,0x003d9f63,0xffea8a92,0xff5e1205,0xfec0a494,0xfe26c3f0,0xfe47dcea,0xff1213a5,0xffae7e74,0x018c1870,0x01581f32,0xfef85420,0xfea22770,0xfda1b84c,0xfca0c014,0xfdb804fc,0xffb56749,0xfdc04bfc,0xfde05540,0xfe9b073c,0x00eb060a,0xffc81155,0xff4b81cb,0xff60c863,0xff8a2b79, -0xffa46fc8,0xffd672df,0xfff60470,0xfff27a37,0x00192034,0xffff3bf2,0x006640e5,0x01c383e0,0x00ca71a1,0x00322881,0xffb28614,0xffcfabf3,0xffdb6340,0x001a5fda,0x00714083,0x00351f51,0xff814568,0xfe32c932,0xfdff1a58,0xfe92f870,0xffcf457e,0xff918bc7,0xfe676738,0xfeb47ece,0xffc18934, -0x0114c74a,0x00a3e953,0xfafb6090,0xfe1da35c,0x01ed7930,0x01bf0800,0x012a3ae6,0xffba8a95,0xffba091b,0x0035d9a1,0x0018971b,0x000c9eee,0x000f62e8,0x0049ec6b,0xffc2a601,0x0051d257,0xff8d7323,0x000b706e,0x01e06036,0x00f89e24,0x00922cb5,0x004f50dd,0x007f9057,0x006971ca,0x00285637, -0x0066e38b,0x007b6e0f,0x01110692,0xfee4180a,0xfe077e66,0xfd80fae4,0xff9f26bb,0xffdd6733,0xfddfb758,0xfdab2ab4,0xfb493fb8,0xf8637f00,0xf9ce3ca8,0x07305ce0,0x0469f040,0x032a6c8c,0x02d4ce0c,0x0332f518,0x024fc5d8,0x019641a0,0x010b4f24,0x0085d9c3,0x004bb905,0xffff69ab,0xffe91bf5, -0xffe271af,0x00b1e3e1,0x004c7f9a,0x00529669,0x01361226,0x000ca64e,0xff77c0c2,0xff421696,0xff23ba9a,0xff2ab3c9,0xff2b4f00,0xfff2100e,0xfffa3316,0x005c0bc7,0xfe8b9992,0xfe0b40d0,0xfdc79780,0xfefd7e72,0xfee56724,0xfd3ee9a8,0xffb79ba9,0x0221ba20,0x047cca28,0x072cfd80,0xffe2c016, -0x003d305c,0x009139e1,0x00c8aab7,0x016e03fc,0x01263822,0x01646ac4,0x01f593fa,0x018a9c0a,0x014e9766,0x010bd9de,0x017d34a0,0x01296ca8,0x0033ec83,0x0050386c,0x00935915,0x013ee014,0x00993020,0x001b6770,0xffce2f75,0xffe29ade,0xff8ebf48,0xfec21c96,0xff06603d,0xfe4caa98,0xfde2cb44, -0xfc998cb4,0xfd0b47ec,0xfe746820,0x00aa64c1,0x02b56e84,0x03df8f88,0x044dbad0,0x03778578,0x01e175d2,0x00691702,0x01a89660,0x0186cbd4,0x01a0cc38,0x01b5b7e6,0x019747a0,0x012dfaf8,0x00d62391,0x00b38edb,0x004876e1,0x00239bc7,0xfff7f7da,0x0084be4b,0x00ee076c,0x0133c634,0x01229076, -0x00d6432d,0x00b55116,0x00a1b64b,0x00d046d3,0x00ef19f9,0x01053920,0x010fd88a,0x01038514,0x010eeb24,0x012d35c6,0x01213214,0x01aa0bd6,0x02589e6c,0x03337744,0x02e3e7c0,0x02608bbc,0x020d6488,0x00d77f67,0x00496b3d,0x008f337d,0x015be54e,0xffe55c72,0x00007980,0x004915f0,0x00a63404, -0x00f0703c,0x00f9603d,0x0110de5c,0x01228c76,0x011b4064,0x010a562e,0x00f7edd0,0x00b2b339,0x007fd06c,0x00493800,0x00864462,0x00d297bd,0x011f5416,0x00f35b67,0x0095669c,0x00b40a3f,0x00b78bdf,0x00849e11,0x0073d247,0x006120ee,0x005920f1,0x003692c1,0x00463c48,0x003d9dd4,0x005362c9, -0x00479230,0x004cc0e0,0x00522f54,0x003a5e00,0x0015e6c7,0xffc33db6,0xffbdbb96,0x00e9912a,0x00d9ed7e,0x00cdc410,0x00b418d2,0x00ad850c,0x00a2e706,0x0098019c,0x0083da78,0x00886c94,0x008376b5,0x0094ec0b,0x009825f7,0x00a79be2,0x00af2359,0x00a30001,0x008789ff,0x0070e9e8,0x006d06e0, -0x006aa841,0x008347c7,0x0087cf03,0x00894d62,0x008ed959,0x00940e29,0x009aba71,0x00a84b53,0x00b903b4,0x00c9757a,0x00d06299,0x00dd4e9c,0x00e6e4c8,0x00f0f029,0x00e9adad,0x00ed55c6,0x00f792d4,0x00fab3c1,0x00d202c8,0x00ceaaa9,0x00f40aa3,0x00f90070,0x00f5acaf,0x00df8234,0x00f0ec7d, -0x00ee1b3d,0x00f4f347,0x00faa636,0x00fa1bf8,0x00ffc6e3,0x01019620,0x01070ff4,0x00eb5921,0x00d9c059,0x00e7521d,0x00e0b667,0x00d52bff,0x00be3c11,0x00ba9211,0x00bc9e9c,0x00bbb35c,0x00ba5c0c,0x00b8df04,0x00b3bed2,0x00b74fd6,0x00bcec70,0x00c68e55,0x00d0478c,0x00da02e9,0x00e89469, -0x00e2cc33,0x00ddf4a6,0x00d86241,0x00d2a9f8,0x010246ae,0xfff36866,0xffd11a98,0xffef99bb,0xfff0f838,0xfff46e96,0xffe59e5f,0x000c6ecb,0x000f13cb,0x000a3d71,0x000477c8,0xfff9edde,0xffe8ec8e,0xffed1da0,0xfff1a84c,0x000121b7,0x000b02c9,0x00112bc8,0x001bb51f,0x000b502e,0x0002c92c, -0xfffda698,0xfff45ec4,0xffebe5b8,0xffe5c8cf,0xffebd351,0xffecec85,0xffe45222,0xfff4792b,0xfff8fb8d,0xfff24403,0xfff79611,0xfff3e359,0xffeb2961,0xffe35962,0xffdd36f4,0xffe04285,0xffccd081,0xffad3d52,0xffecc008,0xffe591e7,0x000124cf,0xffc4636f,0x003ecc6d,0x00580b72,0x00331df1, -0x0023e70d,0x000234e7,0xffdc73ba,0xffd94cf6,0xffee954b,0x0013d43c,0x003a5f6b,0x00524a94,0x0051e5aa,0x00454eb3,0x003f4afc,0x001fb610,0xfff70df7,0xffe41ed9,0xffd446e5,0xffd9f012,0xffd716aa,0xffbe111f,0xffe3fa6e,0xffe57b72,0xffc7f3ff,0xffd816ff,0xffd99d62,0xffc9e115,0xffbff75f, -0xffbfd60d,0xffcfbbe2,0xffa16749,0xff4e6e1a,0xfffd800b,0xffe3935d,0x000e472f,0xffa33ef4,0x00822e10,0x00ac2588,0x006c28de,0x0061dc6a,0x000f86f0,0xffbde003,0xffb34ba2,0xffe175c6,0x004c508c,0x009e6abb,0x00be130a,0x00af3d58,0x009bb43d,0x0080bff7,0x0059d051,0xfff0c2cf,0xffcf608f, -0xffab85ef,0xffc030a6,0xffbe3445,0xff9bf3ea,0xffe52f0a,0x00065270,0xffc7faee,0xfff75cfd,0xffefec81,0xff9d8fa2,0xff9c4fcd,0xff819855,0xff6e6ad9,0xff1ff86c,0xffb15bbe,0x0089cf24,0x001b5f5f,0x000664db,0xff52d385,0x00b3dc36,0x0107bb28,0x00edf9ef,0x009b87db,0x001ba88c,0xffdae6c4, -0xfff13b80,0x0056157f,0x0102b93c,0x00e57f4b,0x010de472,0x014fc6c6,0x014721d2,0x0118b16a,0x00c7db59,0x0017e268,0xffd5ef08,0xff9cbaac,0xffa2c7c9,0xffa53faa,0xff5dbe55,0xffbc2bfb,0xffb37889,0xff381d1f,0xff8ebed0,0xffa32216,0xff63e0f8,0xff7d105b,0xffa5707e,0xffa07d74,0xff31b520, -0xfd663c78,0xfd89e3cc,0xffeb07f0,0x00f92fc1,0xfff7ca5d,0x006bb13e,0x008caa02,0x00c15bc3,0xffb71143,0xff78e367,0x000a069e,0xffd40008,0x0024704c,0x00b52f8e,0x01384e02,0x0147e5c2,0x00af0787,0x00c7650e,0x00c9ef9e,0x004f17e0,0xffbd0df4,0xffa00d4c,0xffc927fc,0xff687c43,0xff024466, -0xfe67bdd6,0xffb25b0a,0x0032d4db,0x00b41b5d,0x00f1a303,0x00611be0,0xff932b20,0xfe35d0f4,0xfd67b798,0xfd3fdd1c,0xfd2c223c,0x00448cd5,0xfde27b58,0xfe40c5c8,0xff303c85,0x00fe8330,0xffad85e3,0xfed1cb46,0xfed08300,0xff573520,0xff8ab6da,0xff925781,0x00037d03,0xfff116f6,0xfff31306, -0xffbf181e,0x00259534,0x01936736,0x00bfc955,0x005c97b2,0x0044db83,0x006f4bfd,0x0065ebc7,0x00666ef6,0x00d2ff23,0x002b9fd7,0xfe6fce22,0xfe66aad0,0xfe84d46a,0xfea798d0,0x0041f8ef,0x007d2ea3,0xff2b6915,0xffcbb7d8,0x00105b3e,0x008d6343,0x00ca33e7,0xf963ac48,0xfbc47348,0xfed99af2, -0xff7825a4,0xff379a2a,0xff0d2222,0xff8c56a7,0x003e7bbe,0x001c5d0d,0x0006e88b,0xffbe57e2,0xfff16bc4,0xff9bde0f,0xfffc4b1d,0xffade468,0x00080745,0x0138a570,0x0103066e,0x00eaf7f4,0x004a2061,0x005e8612,0x006409f0,0x001d1bc3,0x006cc741,0x00312ab1,0xffde5dca,0xff3d92b6,0xfef08c50, -0xfe7dd174,0xff75d43f,0xffd82bdb,0xfea4084a,0xfe768314,0xfcbeb358,0xfb4efb90,0xf91e3fc0,0x0695dac0,0x0614f440,0x04ce21c0,0x04285530,0x038a969c,0x02b19e44,0x01a043f2,0x009e91a6,0x009f03e6,0x00591666,0x00003818,0x000258d1,0x00036fd9,0x00716df0,0x00524bcf,0x0073654b,0x00f23a97, -0x00bf6593,0x005d06a7,0xffb4fcab,0x001503bf,0x0028e0e5,0xffe4fef1,0x00d154e7,0x0036816b,0xff0b1628,0xfce1c6ec,0xfc8bf0f8,0xfd9dd614,0xff820bfe,0xffa23703,0xfd9c121c,0xfd4fadb8,0xfed37756,0x029a4348,0x05259768,0x007f9a24,0x008dfda6,0x00c05eee,0x011bc87e,0x019e459e,0x01486d68, -0x0154304c,0x0185a198,0x01560f14,0x011be3e6,0x00d2b604,0x0120d71c,0x00dbb00f,0x004f4681,0x002ae85f,0x004d5b94,0x0108b534,0x0079fb99,0x003cfbb2,0xffd5d746,0xff97cee4,0xff6169bc,0xfef73544,0xfe0fafd0,0xfd42e524,0xfd028f2c,0xfc20b6e0,0xfca3488c,0xfe79865a,0xff538e8f,0x00f3abb1, -0x02b1c734,0x03e63be4,0x03fa1a94,0x0365cd60,0x017b8f84,0x01374894,0x0150e12c,0x019d4ed2,0x01918458,0x015f8fe4,0x00fe3648,0x00c5b04d,0x00d34c1a,0x0068f433,0x00470009,0x003cba16,0x0053d503,0x00aaf252,0x00d2eaef,0x00fa3ad2,0x00e5a883,0x00ed2a31,0x007c353e,0x0084a3d2,0x004b06df, -0xfffda754,0xffbd4b5a,0xff69099e,0x0020272e,0x008717e5,0x0055010c,0x01a933d2,0x025f5284,0x02b3a808,0x02f5b200,0x02bab544,0x01d07690,0x00fc604b,0x008ef71b,0x006bcf66,0x00ed1ee9,0x007c0da0,0x009cd92e,0x00a5c5f8,0x00e845a7,0x0131007a,0x0132b70e,0x01342d00,0x013b4630,0x0128ee0c, -0x011c2102,0x00eb6b5b,0x00eb9629,0x00abe74a,0x00965cab,0x00b06099,0x00f388fd,0x0131199c,0x01279e70,0x01161dc4,0x00fa6203,0x012f3fd8,0x016f5cca,0x018c4a9a,0x014c85a6,0x011857c4,0x00d7cab4,0x00e2ec83,0x00e61563,0x0109d686,0x009b7188,0x00427e31,0x000439e3,0x002cac86,0x0038dca4, -0x001d9f97,0x004809ee,0x00a2c9ac,0x00955968,0x00af6db7,0x008ba460,0x008bbce1,0x00878e38,0x00792d3f,0x0075ac11,0x005fde6e,0x006423cd,0x005e3651,0x006365b1,0x006b55b9,0x006e593b,0x007d2e0c,0x00869fe1,0x0078a7b0,0x008c1805,0x008bb387,0x00e09fa2,0x00c11d62,0x008ba1b6,0x007ddb5f, -0x0062bba3,0x00566521,0x0047c6be,0x00673b88,0x007c0e57,0x009aec7a,0x00b2300b,0x00d20d92,0x00d9aaa8,0x00c608bf,0x00b73278,0x00b68d0c,0x00aed53a,0x0070f66a,0x006359f5,0x008e5293,0x00a11265,0x00cac7b3,0x0080903b,0x00a4f6bd,0x00cd96ed,0x00cc872b,0x00c80405,0x00c7ca86,0x00bfe441, -0x00bcb852,0x00b83dff,0x0096bad4,0x008c451d,0x00c5c4ee,0x00b2d4ec,0x00a8f85b,0x00c15f7c,0x00a63bbd,0x009ea043,0x008c1f97,0x00825276,0x007627c3,0x006010eb,0x006acb52,0x006d4e13,0x006c16d7,0x007453f9,0x007a2684,0x0088d5a0,0x0084ac0c,0x00829d49,0x007ceb15,0x00757dd5,0x00806a41, -0x0010d6cd,0x0002f4a7,0x001abb7e,0x0004d9e1,0xfffe3041,0xffdede1f,0x001e638a,0x001a20fc,0x000250af,0x000467b3,0xfff9f88b,0xffe46a19,0xffe5b95e,0xffe96b4d,0xfff6d775,0x0015a029,0x002624d5,0x000f1900,0x000df26c,0x000b1174,0x000cca69,0x000c3aa6,0x0008d013,0x0000a7e2,0x00086693, -0x0009f792,0x00009173,0x001aedb1,0x001e43ff,0x0012e13f,0x00065e61,0x00006001,0x000686f5,0xfffc5fc3,0xfffa8d72,0x0002fd9c,0x0000b594,0xfffc43c9,0x0037a0d8,0x00150cf1,0x002e61ff,0xffe288ee,0x005105ee,0x0066ba3a,0x0037405c,0x0042b2f8,0x00209a27,0xffe18423,0xffe69368,0xfff9940e, -0x0015a98e,0x00506a8d,0x0068f101,0x0059153f,0x003f8fbd,0x00247bb9,0x000ab0cd,0x0002adc4,0xfff79098,0xffe1835e,0xfff3e5ee,0xffff48df,0xffebcb40,0x00372a4f,0x0037d1e8,0x000fed07,0xffef47bd,0xffde571d,0xfff800c3,0xffdff29d,0xffe527c1,0x0002272b,0xffe4c19b,0xffebca1e,0x0036ac79, -0x0033045f,0x003ef2c7,0xffa6a26a,0x00932af8,0x00b1fb30,0x0056a35f,0x00747639,0x002fc7a6,0xffae267f,0xffb59749,0xffd939c0,0x00247cf8,0x00ae5a8f,0x00cec4fe,0x00a16eec,0x006d7058,0x004f3304,0x0019ebec,0xfffee860,0xfff0367a,0xffc2988c,0xfff0792b,0xfffbdc46,0xffc9c3d8,0x006dbbc8, -0x0078d5df,0x002a8f4b,0xffdaf26b,0xffa80264,0xffda43c3,0xff9b348f,0xff9b1f7e,0x0007cf64,0xffe1d0fc,0x000c2251,0x00cc02b6,0x00f59971,0x00b04c3a,0xffa71180,0x00f674ad,0x0135983a,0x00e51ad5,0x00d3c318,0x00342e06,0xffb6b01e,0xffbbc1fc,0x002b02d6,0x00c29c9c,0x01262b5a,0x014f6928, -0x0112ed08,0x00f1a0e4,0x00b73bbe,0x003ecfcb,0xfff9dd76,0xffd8543b,0xff84abc6,0xffcaca41,0xffe904ed,0xffb7cc7c,0x00aed430,0x009cdb33,0x0009c967,0xffa1f7dd,0xff6a8ee9,0xffc58472,0xff8d7784,0xffaa217f,0x00658a71,0x0002e51b,0xfe61171c,0xfdb02aa4,0xfe530a2c,0xff7051f2,0x0013445f, -0x00af9711,0x00a4b9bf,0x00236a9a,0xff914da3,0xff64d8e6,0xffd71272,0xffb716a6,0x00109372,0x0093f109,0x0136c1ee,0x0141acc2,0x007293aa,0x00ac24f0,0x0085be1c,0x0046b06b,0x000329ed,0xffe52a5a,0x000e592c,0x003e468b,0x00280c5d,0xffc3a252,0x005a26e9,0x00d81e67,0x017f8262,0x0064ea05, -0xffb34e38,0xffa2e454,0xfeb0e928,0xfe7741fc,0xfeb039f4,0xfe5a53b6,0x002f86ca,0xff441d86,0xff449afe,0xffb2d866,0xfff65928,0xff941664,0xff4b5e0b,0xff30d29c,0xff6f8a15,0xff908a20,0xff7d0356,0x001c6b34,0x001afed4,0x000525d9,0xffc00823,0x000fcaac,0x013bfdda,0x00e20f06,0x00c05093, -0x0051aa3c,0x0009224f,0xffd056cd,0xff7411e6,0xff27526e,0xfec05a0c,0xfe75aec4,0xfeadd294,0xff0bbea2,0x008258ba,0x006f969a,0x007acbe5,0xffb9976a,0x003f36a5,0x0038066d,0x001f4935,0xffe7aa49,0xfa14a660,0xfb43b158,0xfd3c17c4,0xfe58eb10,0xfec1f18c,0xff0eb923,0xff6d7610,0xffdde77b, -0xffedfa9b,0x001126d0,0xffc7ef4a,0xffdaf305,0xffaa3b6f,0xffd9ab42,0xffd448d1,0xffc2aba5,0x003219d4,0x009a95dc,0x00ada861,0x001c5d7f,0xffd6c238,0xffcbc3c9,0xfff2e6f9,0x000a8343,0xff6b75a4,0xfe71b2ea,0xfe464208,0xfead6844,0xfff10629,0xffaa3b4e,0xff52fdbf,0xfe880e28,0xfe1c81e4, -0xfdee0d74,0xfe1db3a2,0xfabda7c0,0x043ba398,0x05bc36a8,0x059e4b78,0x04895a48,0x03b96260,0x028eab84,0x017c77a2,0x004cb88b,0x00772b70,0x002ff497,0xffe83e28,0x002096be,0x00169e36,0xfff570af,0x000b3903,0x00498b2a,0x0077388d,0x00e2f5e1,0x00d888ca,0xffe04353,0x007624df,0x0068629f, -0xfff81e86,0xff829cad,0xfeeecfd6,0xfe45944a,0xfdf3853c,0xfe12bc4c,0xfecb5a68,0xfe9b9fe8,0xfe7d0e74,0xfe98b8d8,0xfc2cd32c,0xfcbefbc8,0x00ba8132,0x0223db48,0x02b5d494,0x01bb7114,0x016ac858,0x019a69c4,0x01b0fbba,0x0176c678,0x01617d86,0x0158cc8a,0x0139d8c2,0x01005e2e,0x00a259b4, -0x009ebfc9,0x00890546,0x00b003f3,0x001f900a,0x00042881,0x006d2d84,0x00493f65,0x002407a2,0xff296a56,0xfe75464a,0xfe5fa2da,0xfea109f6,0xfe56d85e,0xfe3ea192,0xfd80af58,0xfdeb8e28,0xfd9c4040,0xfcd98804,0xfd9058cc,0xfeae9cec,0x007c471e,0x02617b54,0x03c9eea4,0x04b878d8,0x0388623c, -0x00b74327,0x0105c994,0x013b9cca,0x0138128c,0x00f4efa6,0x00dafb85,0x00be0c37,0x00ae8df0,0x00b975e1,0x00b6d5cf,0x00b45ed9,0x006d070f,0x00698fc3,0x00936444,0x00f0e435,0x0121c790,0x0136da0c,0x0097d025,0x0038ed60,0xffe80a68,0xff94a718,0xff457206,0xfef33de6,0xff3b6a76,0xff76394a, -0xffe1f35c,0x00d62cf4,0x0190cc60,0x020c67bc,0x02b52fa0,0x02c8f694,0x024d6370,0x01a4c4ea,0x00fc010a,0x009786ae,0x00878ba0,0x00f89315,0x012a7122,0x0117e6e6,0x01302fa4,0x0153acf6,0x0141b3fe,0x012d261a,0x011ff336,0x01245e02,0x012a7664,0x012fa1f6,0x013683e2,0x010cb46c,0x00fa2712, -0x00eebd34,0x00f5c1d3,0x00fe740f,0x00fe3c28,0x00f8bdfd,0x00f4b35d,0x0125c28a,0x014d8a58,0x01661bb2,0x017ea6d2,0x018c1e1c,0x019a4666,0x01982366,0x018bcc38,0x018667ee,0x01035c06,0x00a04312,0x005a2e2c,0x00802d0d,0x0097b38f,0x0084dc9f,0x00c3f887,0x005d443a,0x004e711d,0x005f1b94, -0x005248ad,0x00533fed,0x00503ed3,0x004bfacc,0x004ae25e,0x004e263f,0x005db407,0x005f3c77,0x006d9ac7,0x007ce848,0x008c5aa8,0x00af2893,0x00e53ca5,0x00febe8a,0x0123a2a4,0x01232d8c,0x01a0b598,0x017c11c0,0x014e594c,0x01312708,0x0109c4b4,0x00ebfc14,0x00cc0df5,0x00ce5662,0x00cc7816, -0x00d71a08,0x00d99751,0x00dbc309,0x00c0ab51,0x00a563ff,0x008a63ae,0x007bae33,0x006dfd95,0x004e8c33,0x0041f29f,0x00547889,0x005c2caa,0x006ffd1f,0x00503604,0x0061eef2,0x00766c1e,0x0076b29e,0x0072ee17,0x00737742,0x006f7736,0x006cde3e,0x00674e51,0x007bf0a3,0x00864156,0x008c0cc3, -0x00a779e0,0x00b503d5,0x00d8c522,0x00b42e57,0x00ad4eaf,0x009e4ca4,0x0092ff70,0x0085fe55,0x00742de7,0x0072e711,0x006a7a01,0x005d1519,0x00582a18,0x00548e47,0x00579a6b,0x005b0b1c,0x005cc0e7,0x005b7497,0x0053de30,0x004a779a,0x002ea606,0x0029ff36,0x002b7907,0x002b6249,0x00231526, -0xfffca8f5,0x0038d99b,0x003521d8,0x00196345,0x00235264,0x001974b8,0xfffe6a56,0x000264c3,0x0005ab35,0x000a3c46,0x002e7f16,0x00404582,0x002c054c,0x002b98c5,0x0027674d,0x002188a3,0x00250749,0x00227064,0x001687ef,0x001f1f04,0x0024ac4c,0x0022a699,0x003eb3c7,0x003db002,0x00234d4c, -0x0014d75f,0x000f1719,0x00241443,0x0011cd9e,0x00138bd0,0x00267ffb,0x0026db68,0x003385da,0x003f786f,0x0052c214,0x00468fd8,0xffefbd40,0x00527943,0x006ba773,0x003f6b2a,0x005a4b6f,0x00409ea6,0xfff991c5,0x00039d8e,0x000f072a,0x001a867f,0x0060f34c,0x00782193,0x0071380a,0x004a109e, -0x00231c47,0x000b1903,0x001390a2,0x000e96f3,0xfffbdd6b,0x0011f2bc,0x0021607d,0x00175245,0x00679faa,0x00606916,0x001c4a3e,0x00024ddb,0x0002bf59,0x00516867,0x0031f924,0x0036c275,0x004b58d3,0x00352e70,0x001ebfcb,0x0011b051,0x004548cb,0x003a240e,0xffa3cbf1,0x00979455,0x00ab7795, -0x003fd3f5,0x00826c8d,0x0048faa8,0xffaf6035,0xffd11a6f,0xffe6f79c,0x00013fa4,0x00a4265a,0x00cdbcbc,0x00bee087,0x006f8798,0x003f57fe,0xfffd332a,0x000a275a,0xfff709be,0xffc202b0,0xffe65760,0x0005dc18,0xffe78e48,0x00a622c4,0x009ecac6,0xfff1640c,0xffb1acf3,0xff856819,0x0018ea33, -0xffd7b4c6,0xffdd8018,0x00185171,0x00274cd6,0x000d8439,0x00324cfd,0x00b51ab9,0x00543a1e,0xff3dbe75,0x00adf887,0x011d149c,0x00a711ae,0x00f31642,0x0058764b,0xff964334,0xffaa0a64,0x000d85d6,0x006bf05b,0x012c58ee,0x015cbb66,0x0105a54c,0x00b21099,0x003e0f48,0xffca1ed0,0xffcb820e, -0xffc0c756,0xff8b13db,0xffd97809,0xfffaa440,0xffae5c1c,0x00e779c4,0x00b99189,0xffaff898,0xff8bcfb5,0xffb1c1e7,0x00b602d7,0x0096911e,0x00967ed0,0x008f36ad,0x0039000f,0xffa19fd9,0xfe20a444,0xfd920380,0xfecb0ef8,0x0097b387,0x00a93bb6,0x007fe805,0x00058ee6,0xff7e0419,0xff4b4a3d, -0xffbd6561,0xffbacb7d,0x000ece2c,0x00765513,0x01090b0c,0x0127ed36,0x00b6b26b,0x00bd9d21,0x00a27955,0x00d6bc34,0x005c8ec9,0xfff5474a,0xffc04ff0,0xff710745,0xff76e00f,0xfff4d6da,0x007633a6,0x00f0e387,0x01bd19da,0xffa85c22,0xfe659cdc,0xfe6aac5a,0xfda8efbc,0xfdde2350,0xfec37d32, -0xffbf4e31,0xff092e1c,0x000bccde,0x009f20bf,0x00392bff,0xff33a82a,0xfee6a1c8,0xff0c9791,0xffa1e02e,0xff7cf014,0xff8c2627,0xff7852ae,0x001a20df,0x002c35ec,0xfff184e3,0xffd19da2,0xfff38bb8,0x00763ea1,0x00bacae1,0x00a8b768,0x001743f2,0xffa8d4d1,0xff5b7e36,0xff24b105,0xff332e0e, -0xff248d0d,0xff46a006,0xfef6de76,0xff35187d,0x0061eb8f,0x004768b1,0x00b02d83,0x00ca6113,0x013e511e,0x00ffea96,0x002fc227,0xfedd222a,0xfd3a0610,0xfb6168a8,0xfc55eb9c,0xfd8f1698,0xfe9e7976,0xff5732f7,0xffc780c4,0xffa92631,0xffebdabf,0x00308c6b,0xffe4097a,0x000ae777,0xfff6ad8c, -0xffe6559f,0x0012907d,0xffb96398,0xff676943,0x0083f08e,0x00c58462,0x000c4d5b,0xffabb4da,0xff563a71,0xff3cd94b,0xfecd8b42,0xfe7163a6,0xfe4d517a,0xfe90502e,0xff266c66,0x00364f82,0xff3cce0a,0xfe60d874,0xfdbd1590,0xfdf6fc3c,0xfee917d0,0xff95a202,0xfe9ace88,0x018559be,0x03509bd8, -0x04d042b0,0x03ff2634,0x03547448,0x01dde2e8,0x00f3feaf,0x001bef03,0x004e6850,0x000c210b,0xffdb20e9,0x000fa277,0xfffcd669,0xffbfb10c,0xffe6afc7,0xfffe5404,0xffb3d999,0x00cda13c,0x00e22662,0xff9c4e8d,0xffef1dbe,0xffc9e0b3,0xffbd19f5,0xff2788c7,0xfedf7276,0xfe486778,0xfefb11f8, -0xfeecf454,0xfe606c9c,0xfe0b28aa,0xfe488b54,0xfebbf220,0xfd68e400,0xfcdc31b8,0xfd8125e4,0xff748f36,0x046e8188,0x032ee0a0,0x02711028,0x022a63e4,0x01cef720,0x01b2f33e,0x0190c1bc,0x016c7998,0x01365a50,0x00d65558,0x004cdb57,0x0034a6ce,0x00534382,0x00ddbf9f,0x004e42dd,0x0023c2b9, -0x000f4370,0x001b66c1,0xffc4d49f,0xfee36450,0xfe851dde,0xfe1cdd94,0xfdf5eb60,0xfe6539d4,0xfe978224,0xfe01200e,0xff448d4e,0xff298944,0xfd922f20,0xfd88a3e8,0xfd7c9614,0xfdf0f9a8,0x00a36cfd,0x02e4a8d0,0x046ffe48,0x04aa49c0,0x00fbb5ac,0x00fd5a6b,0x00fcd5c7,0x00fc5569,0x00c1ae57, -0x00d18fec,0x00dc7572,0x00cb9038,0x010fb17c,0x011d7ed8,0x00f14250,0x00d2ed24,0x00ab3813,0x00a0969c,0x00c2f557,0x00e24398,0x00db4ceb,0x00b419c6,0x0050babf,0xffd24382,0xff9f0dae,0xff7f61df,0xff6c0eaf,0xfe8dfa4a,0xfe59f5fa,0xfeddae76,0xff6b2aaf,0x000001ab,0x0098850a,0x019f54c8, -0x025b14b0,0x02b4fc40,0x02b04a1c,0x02288644,0x01755790,0x01277eca,0x011ffa04,0x0133adfa,0x0131e57a,0x013a19ba,0x0153e910,0x0123dc14,0x00ee21b4,0x00bd4de5,0x00de6a4d,0x00e63ca1,0x011d841a,0x01011bd2,0x010dfdb4,0x00e9464d,0x00fa3a9b,0x00e90790,0x00edec06,0x00fad5c5,0x010b2652, -0x014e2214,0x01628f60,0x015d9af6,0x017fc324,0x01bdab32,0x01f9928e,0x02279c5c,0x021f83b8,0x0220c1c0,0x021f193c,0x01b19134,0x015b5824,0x012c84a8,0x0103069a,0x00f77fef,0x00e09d9f,0x0110f986,0x0084319f,0x008780a5,0x005c637d,0x007c0d76,0x0069edd3,0x0067590a,0x0079a1b8,0x007133c4, -0x008ad897,0x008ad1e5,0x0096cde0,0x009e7e0c,0x00b261df,0x00c5d45d,0x00f09b46,0x0115f882,0x01414ab6,0x0169a800,0x019b79ea,0x01921248,0x0177157c,0x017254e8,0x01536bd6,0x01454b02,0x012bd58c,0x01176d40,0x00fcf110,0x00e1bfd9,0x00cffe3c,0x00c197b0,0x00b4b1d8,0x009283eb,0x0092763d, -0x0089c0a3,0x00825889,0x007ea6d7,0x006e1628,0x0073c255,0x004cf505,0x00416df5,0x00350eda,0x00604f7a,0x004c04e9,0x003ef886,0x00410b81,0x0048baaf,0x004c2ce3,0x0055937b,0x0058c9a4,0x00597058,0x00721762,0x00828b75,0x0086e8a9,0x008f4b8c,0x009e3cba,0x00a12788,0x00a4032c,0x00a7d3f7, -0x00ae5ecf,0x00ae5537,0x00b0e6e4,0x00b7eae2,0x00a72094,0x0098c1ca,0x0087626b,0x007ac7c4,0x006f14e1,0x0063c0d4,0x006cabc5,0x0071210e,0x0075caa3,0x0073b1f5,0x006a7205,0x002cf820,0x002137b1,0x0011cad6,0x00288d4d,0x002b97d5,0x000fa052,0x0037464c,0x003a8dae,0x002ae2e9,0x00388455, -0x00315ada,0x0019fd19,0x001e72eb,0x00201d51,0x001e68b5,0x00327b99,0x003c9095,0x004b95a8,0x00392962,0x002ee515,0x00233f4a,0x0025150a,0x00230a1d,0x001bf5b5,0x0020ef51,0x0026fe4f,0x00321d1a,0x0039ae2b,0x002fdace,0x0003b806,0x000d77e8,0x0010e4ee,0x0029d424,0x00209652,0x00272ae8, -0x00357308,0x00268f49,0x002f871a,0x001e7535,0x005bfcd2,0x004bd4cb,0xfffae7d1,0x004c605e,0x005ca372,0x0038e21c,0x005355dc,0x00429662,0x000c6b39,0x000ac3fc,0x000fb4da,0x00196dd2,0x0052de35,0x006a393e,0x007f6d27,0x0053b7b1,0x0030a0c1,0x00194452,0x001c88e6,0x00139296,0x0007f211, -0x000a063f,0x00201b5c,0x0045f26e,0x00601d7e,0x004106c6,0xffda713b,0xffe9ae8f,0xfffbacad,0x004dc9bd,0x0031488f,0x003aa127,0x004df97c,0x00390b0d,0x000acad9,0xffd571a1,0x00277196,0x00388721,0xff9c8651,0x008aeff8,0x00970482,0x002a5a7e,0x0075cdc0,0x0051e21f,0xffceb33d,0xffe2bcd2, -0xffeabb41,0xfffed75d,0x0079c166,0x00b34a27,0x00dcb202,0x00839569,0x00420319,0x0007baf2,0x001701b8,0x0001bf27,0xffdf8c1f,0xffebf19d,0x0016b2ad,0x0056617c,0x0089cec7,0x004e81e3,0xff6a0732,0xff91375b,0xff9cc1fe,0x003b86d3,0x0018844c,0x003f73ad,0x005cc9ce,0x001ffd2c,0x0054201a, -0x00346510,0x00e70ebb,0x00aa88eb,0xff548d5a,0x007d8e9d,0x00fc8806,0x008ace24,0x00ec58a0,0x006f8048,0xff9535b2,0xffa4360a,0xfff8cde4,0x0040ffa4,0x00fe86ba,0x0129e59a,0x011e7568,0x00b1d67e,0x003d86fc,0xffe42ef9,0xffed8bfb,0xffd35026,0xffa9fd52,0xffbdd3d3,0x0004d88b,0x00737bd1, -0x00b90c75,0x003a5a25,0xff0d5ee3,0xff5afe7c,0xffb90e5e,0x00c1fbad,0x007aa5de,0x00aace5f,0x00871360,0x00517c7b,0xff9f4320,0xfeb88a3e,0xfd42e3ec,0xfe610c70,0x013770a6,0x00badccf,0x006b6a6f,0x0012183d,0xff8e91ed,0xff59b440,0xffa31ab9,0xffdba5e1,0x002382ba,0x004090cc,0x00ba7918, -0x01035af0,0x0146acc8,0x00d47ef6,0x00a6e639,0x00c9406d,0x0053cacf,0x0012b66e,0xffe76f57,0xff3c477f,0xff560b9a,0x003673a0,0x007b6137,0x007728b7,0x00bd6000,0xfea6938e,0xfdeca1e0,0xfed2998e,0xfe708fea,0xfeba02d4,0xff4d982d,0x0001cf54,0xff191bbe,0xffb1bff3,0x00d4e097,0x0054c9f5, -0xfea0bd2e,0xfe4d842a,0xfe7a0d98,0xff465ea0,0xff6fd54e,0xffa40dfe,0xff82806d,0x0003662d,0x000a6ac6,0xffd3fdce,0xffdca4cc,0xffd52e30,0xffcd2ebc,0x00908992,0x00af6350,0x00128753,0xffbbcf6b,0xff676fdd,0xff33a207,0xff8931ec,0xff71775b,0xff15dd2b,0xffc6313a,0x0028a461,0x00c69f81, -0x0053093f,0x0022aab3,0xfff095c1,0x00876114,0x0073c684,0xffe83d69,0xff3317af,0x006c279e,0xfd76a044,0xfcf11d50,0xfdb9e79c,0xfe5f555e,0xff707fe2,0x001397fd,0xffce4468,0xffe0f809,0x0022be29,0xffecc5f6,0x00120fa5,0x00186ac3,0xfffabaff,0x0055fded,0xffe40c07,0xff30c386,0x009b4e11, -0x00c9d5e9,0xffcfcfc9,0xff95006b,0xff2d557b,0xfed856ca,0xfea1780c,0xfeb1b616,0xfec2a706,0xff6af8f9,0xff28bb36,0xfe713c7e,0xfe725b6a,0xfe3ab004,0xfd9184f0,0xfe5d67e6,0xff42a4c5,0xffbe6b86,0x00f2a458,0xfe5611ac,0x00c8d4f7,0x03258340,0x02f5326c,0x026d9d9c,0x0104607c,0x003a1b46, -0xffcbcd7c,0x0018ee92,0xffe7d9fc,0xffc1382e,0xffe8b839,0xffdc7831,0xff8a00b0,0xffb35669,0xffc38b79,0xff6c2fbf,0x00c0e045,0x00c7c324,0xffad247f,0xff80fa2d,0xff3b7d0c,0xff88500e,0xff40ce07,0xff062591,0xfe65bb8a,0xfee9a440,0xff1c9b64,0xff0fc347,0xff3a7d37,0xff08ca07,0xfdd00518, -0xfecbb19c,0xfdf4b820,0xfb5a32b8,0xfceb2e78,0x04c5e1c0,0x0460d5f8,0x03558b7c,0x02b86700,0x022330f4,0x020de890,0x01e3c4d8,0x017ba648,0x01121c32,0x00a135bd,0x000bd5d0,0xfffff951,0x003ac82f,0x00bba986,0x006a9405,0x00385f4a,0xffc4ca7e,0xffcf1cd1,0xff8ca534,0xff24654d,0xff16ff0b, -0xfeaaa200,0xfe7dbd36,0xfe8b2cca,0xfef1a1cc,0xffa7c4b1,0xffea9268,0xffb88256,0xff259917,0xfe36a668,0xfd74b024,0xfc9909c4,0xfeabb504,0x00e11e3a,0x02b40560,0x04433210,0x01ca6738,0x0146dfce,0x012b82d8,0x0137d9d6,0x00ff7054,0x010f6ed6,0x0124e28a,0x01235e66,0x0140e292,0x013b5560, -0x01193fa8,0x01167394,0x00da4a34,0x006b917d,0x00493696,0x0049e652,0x005f714d,0x00879cf7,0x00483bb5,0xffc42777,0xff896778,0xff512bf6,0xff369932,0xfe7fb61c,0xfe1a5232,0xfdc8fba0,0xfda46998,0xfe07590c,0xff06a588,0x002ea905,0x0198043c,0x02d59654,0x03b1c7c4,0x03b3d97c,0x0305da08, -0x02544c74,0x016e999e,0x014ba5f6,0x012f39ca,0x0129bdaa,0x01307008,0x00fbfb3a,0x00bb22d6,0x00810a84,0x008dca24,0x0096cf72,0x00af686b,0x00a5aa89,0x00bac124,0x00a8d24a,0x00d3014e,0x00d13cbf,0x00dd4848,0x01016226,0x0144afc2,0x016afbd8,0x015d7d46,0x015cde04,0x015cd8cc,0x01895fd4, -0x01c0008e,0x01ee2e12,0x0230443c,0x026afc20,0x029a5558,0x024ec5a0,0x020fe388,0x01f72486,0x01a57384,0x017e6f70,0x0160d5c8,0x016dcc08,0x00db7ce8,0x00d7f26c,0x009f5363,0x00d0d5ce,0x00b9d087,0x00b2036d,0x00ce79f7,0x00cc1815,0x00e8be2e,0x00dcfea5,0x00dfb1a3,0x00e17b9a,0x00e95a1d, -0x00ed10ff,0x00eba611,0x00e2f400,0x00fa6e43,0x00fd9539,0x011109c0,0x00c143eb,0x00cb86bd,0x00ee995a,0x00fbaf32,0x01121034,0x0118886a,0x012262f4,0x01087b6c,0x00f609e2,0x00f52f56,0x01010474,0x011494bc,0x0122fa80,0x011d41a8,0x0110fd8e,0x00fe70d4,0x00e88118,0x00e7df3a,0x00ec5309, -0x00b4d951,0x009601ac,0x0063ab00,0x00ce7739,0x009d8e6a,0x006c5b53,0x006bad08,0x0071bcca,0x00753045,0x007a3695,0x007b575b,0x007bd358,0x00a68981,0x00c7f39d,0x0089b54d,0x009ffef9,0x00b28601,0x00c14388,0x00dd2a43,0x00e5279e,0x00f479cb,0x00ff32e5,0x010de4be,0x0123f00a,0x011bd096, -0x0117e5a8,0x010e0c84,0x0106e33a,0x00fc8917,0x00f5029c,0x00f20193,0x00f14f68,0x00f13b27,0x00efc71b,0x0107494c,0x002721c1,0x001b63bf,0x000271c5,0x001a3cd6,0x00216618,0x0012d71e,0x002ff127,0x0032bd0e,0x00251da1,0x00322fd2,0x002f1b98,0x0022f9ea,0x001f07d0,0x001e6f4d,0x001e914b, -0x002c1b36,0x0034f5f6,0x004dfe2e,0x003b3c08,0x0033b307,0x00292da0,0x002729a0,0x0024331c,0x001f8b8f,0x001d0cb7,0x00214c29,0x003b7dba,0x00296963,0x001cd2a1,0xfff442aa,0x000a39f2,0x001138cd,0x00232f3b,0x0022ff62,0x00286bba,0x0032cda2,0x0023ad44,0x000d62d5,0xfff8455e,0x0043f5a3, -0x00437c47,0x001643fb,0x0040f42c,0x0045fb69,0x002df973,0x0045df34,0x003d9ca6,0x001e9c4d,0x000c0f91,0x000d0148,0x001d73c1,0x0043964d,0x005bff51,0x00845156,0x006125a5,0x0046087d,0x0033ddf2,0x0030dc56,0x0023649f,0x00195e35,0x000c6d3d,0x002034d4,0x00656f75,0x002f87ec,0xfffbc982, -0xffa49307,0xffd2b27d,0xfffa5504,0x003cf12f,0x003e766a,0x0043265f,0x004824ea,0x00214d9e,0x0004144d,0xffbc1c62,0x000aa7f7,0x001bc96e,0xffca0163,0x00755dda,0x0075c225,0x00190805,0x005e14c4,0x004fa86e,0x00015c78,0xfff26509,0xffea9182,0x000e00bb,0x005aaa95,0x009f4dcc,0x00e7783f, -0x009fe432,0x006309b0,0x0033ea42,0x003f7574,0x002305e6,0x000e363e,0xfffd33ca,0x001ef654,0x00a9e277,0x00492370,0xfffcaf74,0xff2e297c,0xff88b8db,0xffbc4ef5,0x002a8322,0x00488883,0x00551320,0x008384b9,0x0034949d,0xffffedac,0xfff37f22,0x00f00d18,0x00c32e6d,0xffb99847,0x0070a95b, -0x00cdc82e,0x0065febd,0x00cf8e6f,0x007be5a9,0xffb1745c,0xff9b974a,0xffe1c61f,0x003e70d5,0x00d7fd2f,0x0108bbcc,0x013876d8,0x00c576d3,0x00727c78,0x002ed47e,0x003f241c,0x00147e43,0xffed5893,0xffd89c5f,0x00287420,0x010de300,0x00530990,0xff79ff97,0xfe7f3332,0xff2b05cf,0xffd5d319, -0x0098681f,0x00a3d906,0x00bcb867,0x00ba3111,0x005961cd,0xffbd7b97,0xff345b53,0xfd244048,0xfdfc230c,0x01557f4c,0x00b16bfd,0x0057e03f,0x000b5ac5,0xffa6f97f,0xff767c2d,0xff947276,0xfff82108,0x002ffe4e,0x0010090b,0x00749a51,0x00d8e9ef,0x018587aa,0x00ceb233,0x0083bdb8,0x0062fbcc, -0x00615118,0x005f50d1,0x0035def6,0xfff5d950,0x000793de,0x0078df59,0x00a5e4d7,0x00c36bf3,0x00eadb7a,0xfe3b756a,0xfdb97894,0xff2f71e8,0xff1a68e6,0xff5f64b8,0xff774b6f,0xfffc8d59,0xffb82778,0xffca8994,0x00f8ddd8,0x008843e7,0xfea156b2,0xfe72e1b8,0xfeab5b1a,0xff25dcb0,0xff61eb03, -0xffae505f,0xff984811,0xffe94423,0x00021903,0xffed4fc5,0x00000d19,0xffd561b9,0xff8c9592,0x00814555,0x00b5e75a,0x003200b4,0xfffa3a49,0xffa05bfb,0xff7d66ad,0xff7be6fa,0xff81ab6d,0xff47656f,0x001d8b8c,0xffffc835,0xff9daee4,0x00038a5b,0xffdf278c,0xff1a900d,0x0005bf4b,0xffc14ba9, -0xfe83c4e0,0xff4f8a2d,0x012766a6,0xff8ce102,0xfe6bb6e0,0xfe833ce8,0xfed7678e,0xff7a8596,0x000722ad,0xffc766a0,0xffb8aa71,0xffffbebb,0x0009fca1,0xfffc06f3,0x00026657,0x0003a2bf,0x0059821e,0xffe9563c,0xff54d1aa,0x006c211e,0x0077005a,0xffb15de2,0xff897786,0xff38392b,0xff1aa376, -0xfefa8346,0xff0a7380,0xff016e08,0xffc2cef6,0xff9c6473,0xfe8d65a4,0xfe77f46a,0xfe712b10,0xfdff7b54,0xff5b36ab,0x00148594,0x0077d397,0x017b8364,0xfb0c6500,0xfe89ff78,0x00e427e9,0x014025a0,0x01269714,0xfffdebdb,0xff7457a0,0xff3920c4,0xffbcf119,0xffab52d5,0xff906959,0xffda9e23, -0xffeb8220,0xff812de1,0xff9cc2c2,0xffa36107,0xff8940af,0x006a6c16,0x007d1310,0x0018ded6,0xffa4b4ea,0xff4ca627,0xff6fab61,0xff70781a,0xff758d9c,0xff4192fa,0xff69c314,0xff70fce3,0xff74f425,0xff71462d,0xff255f72,0xfe26662a,0xff1402f1,0xfe09cc02,0xfb5d0488,0xfa96e450,0x0473c9c0, -0x0517d358,0x041a9a70,0x03608144,0x0299eee0,0x02ac29bc,0x0266cc50,0x01937044,0x01033abe,0x008cbf97,0x00209ed2,0x0001e95e,0x001b9845,0x005b93ab,0x004396d3,0x0015a107,0xffa326ac,0xffb2d328,0xff8c5cd8,0xff702fea,0xff70b957,0xff6cb759,0xff91219a,0xff6ae533,0xffbe2a02,0x0045333e, -0xff76b010,0xfef9ad6a,0xff18fe87,0xfea0f90c,0xfe05c166,0xfcfcfe7c,0xfd45ec94,0xfecc9ad0,0x0168b9fc,0x032f900c,0x02382af8,0x01aa44e8,0x018c53aa,0x01961e7e,0x01586786,0x016f9e3e,0x0166d2f8,0x01295380,0x01476854,0x014494f0,0x0142cee2,0x01287436,0x00d1ed44,0x0036183f,0xffee0610, -0xffe7a234,0x001a425c,0x006a831a,0x0051a62c,0xffda1513,0xff6d0a8a,0xff00fd6a,0xfeaf9e12,0xfe84071c,0xfe26b292,0xfda3d5bc,0xfd21897c,0xfd45a918,0xfe24b960,0xfedd5942,0x0032cd55,0x01dc7c6e,0x034803b8,0x03c5f1dc,0x0377bf6c,0x02c31c74,0x02070224,0x01b6fb5c,0x0169a22c,0x013ef9dc, -0x010aa248,0x00e6a3a1,0x00b807fe,0x008f145a,0x0089dfbf,0x00970ba5,0x008cc2a0,0x00a6834f,0x00a8a816,0x00cc07dd,0x00ccdeca,0x00c9e978,0x00bca628,0x00b3a28d,0x00e48c93,0x00b1866d,0x00924acb,0x00a4db75,0x008e003f,0x00cc55aa,0x0101c97a,0x013c1cea,0x01c9563a,0x023aafa4,0x029d13b4, -0x02b650ac,0x02cf4088,0x02ef791c,0x0282429c,0x02505404,0x02444f74,0x022863e4,0x016b5f6e,0x015cfcb0,0x00f58f2d,0x014bdaf8,0x0126d756,0x012cae5e,0x0144f202,0x013de0ea,0x014ab662,0x01352700,0x01222216,0x01214e3c,0x0113362c,0x010353fe,0x00e97072,0x00da8247,0x00d9bf44,0x00c55096, -0x00a9a6c3,0x008ddc58,0x00bb71fd,0x00e794f8,0x010f4c9e,0x01388b98,0x015f3ce6,0x01838eaa,0x017f190e,0x01806bc0,0x018e3a2e,0x01a5bb00,0x01c06c08,0x01ecea08,0x01da0f5e,0x01c47044,0x01a22f0c,0x017d299a,0x0164bc82,0x016c30b4,0x01337160,0x01165420,0x00e48f69,0x0148538c,0x011a4456, -0x00e8a337,0x00e3313f,0x00e518c8,0x00e8eec7,0x00e53d89,0x00e70946,0x00e9060f,0x010913fe,0x011eab60,0x00dc1b9c,0x00fa0524,0x010520f6,0x0118da3c,0x0130530c,0x013d0b1e,0x014f4606,0x015c5d1c,0x0169b1e6,0x017d975c,0x017db898,0x018322a0,0x0184ecec,0x0187d812,0x01877912,0x018ad2d0, -0x017c65cc,0x0176da40,0x0172ad12,0x0170cf54,0x01809924,0x002872e8,0x001733bf,0x0007c5f6,0x00160567,0x001c6f60,0x00186553,0x00294484,0x0024fa43,0x001b514a,0x0024c6e3,0x00251600,0x0024b98b,0x00188f45,0x001732e1,0x0018d27f,0x0024d039,0x002fbf68,0x004302a5,0x00386bee,0x00371a66, -0x00331a27,0x002f14f2,0x002c1de4,0x0027f40e,0x00224623,0x0024dd85,0x003e7438,0x00218a9f,0x00164060,0x00059690,0x0011c4a8,0x0019ae21,0x0026a10e,0x002f0d80,0x002d5c84,0x001ee279,0x001d32c3,0xfff83db8,0xffeba1a1,0x001f0251,0x00330666,0x0027aee8,0x002b669d,0x002bfea5,0x0027dead, -0x003a0479,0x0039b605,0x00304cca,0x00159578,0x0012c27b,0x001f3954,0x003d5a70,0x0054a524,0x00790b74,0x0068d562,0x005501bb,0x0049ce18,0x0049ec99,0x003b310e,0x0030ab04,0x001edda6,0x0021c487,0x005661b3,0x00043e5a,0xffdcecea,0xffc4f0a2,0xffd6ed83,0xfff7643d,0x001fefba,0x003d3bd7, -0x003848dd,0x000dd7d6,0x00032518,0xffc875e9,0xff815895,0xfff08b4a,0x001647d4,0x0009b15b,0x0050110c,0x004271c6,0x0015098d,0x00425ce2,0x0049e5c1,0x002be5ef,0x000d53b2,0xfff6b49c,0x0014c13c,0x004e2da8,0x008d4dd1,0x00d7b84a,0x00b23d32,0x008a775f,0x005d9b3f,0x006841b1,0x004bc248, -0x00377800,0x0015a7fe,0x00224c3a,0x009c47eb,0x0001e161,0xffc4d6dd,0xff743041,0xffaa7816,0xffe290b6,0x0027f150,0x007a7d50,0x0062176c,0x00061510,0xfff83ce4,0xff62c42a,0xff4063c2,0x003c7ec1,0x00662f3b,0xffede5c9,0x003f1f76,0x007cfc9b,0x00382f7c,0x009f8361,0x0077827c,0xffe08946, -0xffa9cefe,0xffdae4a9,0x003750b1,0x00b83ef0,0x00f6aadf,0x013e3df0,0x00d4454b,0x009b9d31,0x006de3ed,0x008774e2,0x0057c4ea,0x00352e9a,0x00058f53,0x00214718,0x00b33d23,0xffc27228,0xff0ef0c8,0xfec8d6a8,0xff30ec2f,0xffc7783d,0x002762d1,0x008cb5eb,0x0069ef12,0xffe2fbb7,0xffc0a3f4, -0xffe0a716,0xffba1de3,0xfdc3530c,0xfe3261ec,0x01199d32,0x00ae8e7e,0x006d3999,0x00066424,0xffd7fc8b,0xffafa304,0xff9d0ba5,0x000f588b,0x00289a39,0xfff70236,0x005a4e54,0x00bdb7bd,0x01625c40,0x00e4a8d6,0x0097956c,0x004a53c7,0x0084c706,0x00799dcf,0x0050d1b7,0x003c3963,0x003d3b8a, -0x008a40ed,0x0096c9a4,0x00dddc9b,0x0196f68e,0xff031ddc,0xfe8f2408,0xffcb42db,0x0042bfc6,0x007689f0,0x00078a8b,0xfff6eb76,0xfffd7db8,0x001a2795,0x00f8e898,0x009d6c44,0xff1bd4ad,0xfecbda4e,0xfefbac08,0xff7a8d5e,0xff80817c,0xffb74a3f,0xffbb1c34,0xffe6d8ee,0x0013ba93,0x0021732a, -0x00371236,0xfffd1ff7,0xffab95ed,0x00549f63,0x007f1805,0x00690743,0x003c0e72,0xffe2d37c,0xffc0681c,0xff8ea310,0xffb7142b,0xfffb0353,0xff9cd89a,0xff50f593,0xff143eec,0xfeff9cf0,0xff1b1bfb,0xfed1302c,0xff74eaf3,0xff2f376a,0xfe06bb84,0xff65b5b2,0x0112cbc8,0x0064d36d,0xff36dcea, -0xfef3112e,0xff15c6ec,0xff5f5185,0xffcbf7fc,0xff70161a,0xff99857a,0xfff5c8a1,0x001a91bc,0xfffa564d,0xfff7de04,0x00106ff2,0x00317951,0xffe48239,0xffa0b454,0x00436a97,0x0041631d,0xfff6ad09,0xffac97db,0xff740a52,0xffb849ce,0xff72da52,0xff7a6bd2,0xffc1dfad,0xff9a040d,0xff96be34, -0xff464dfc,0xfebd2830,0xfeadeaae,0xfedd7ccc,0x00095e9a,0x008e4afa,0x00c02fe6,0x012bcf6c,0xf9af27b8,0xfcb4805c,0xfea6dc38,0xff581a83,0xffafb85c,0xfef7337a,0xfed9b1cc,0xfece0776,0xff64b731,0xff7ed4bf,0xff8d74ab,0xffef3b27,0x000b187f,0xffc49066,0xffc70356,0xffb5ae19,0xffa530e8, -0xfff035f4,0x001f08ec,0x008f1a33,0x000821be,0xffb41791,0xff9fdac6,0xff7f01e7,0xffab5b7c,0xffff787c,0xffc47197,0xff924a63,0xff91af6a,0xff2a111c,0xff1182c7,0xff60cbc5,0xfea8dd74,0xfdb80570,0xfcd7c99c,0xfa0eded8,0x03881a38,0x04904d30,0x0459edf8,0x03baf8c0,0x02eb720c,0x0330dfb0, -0x02afd2d0,0x016d9192,0x00f1282f,0x00794b4e,0x00562219,0x0008ab8f,0xffeea1ff,0xfff696a6,0x000d7df5,0x00014d81,0xffa255b6,0x0021a521,0x00044089,0xffccf85a,0xff9f158c,0xffa8432a,0xffdaec2d,0xfff7689c,0xffbed666,0xff28694c,0xfeb5260a,0xfe8fcfbc,0xfec1a846,0xfec37f22,0xfe8abeba, -0xfe31d59a,0xfcefa9ac,0xfd7f3794,0xffcf96d5,0x01d9573a,0x024b0ba0,0x01f0dff8,0x01e567b8,0x01d41c04,0x018d9b58,0x01971928,0x017edb90,0x013cccc8,0x01618f5a,0x015cd404,0x015c1428,0x0123279c,0x00d22302,0x00708d69,0x000cff75,0xfff70d74,0xfffd45f8,0x002be942,0x00248a78,0xffc26638, -0xff4c571f,0xfef250a8,0xfe9878b0,0xfe6765ca,0xfe2d7bcc,0xfe4c5518,0xfdf5d3cc,0xfdde1bb8,0xfe2173c6,0xfe1e4ddc,0xfe979a20,0xff9d8791,0x018d2152,0x029abb94,0x02abd4d0,0x02827348,0x027d8ff0,0x020cc7a0,0x01b97712,0x018a3588,0x013f56f8,0x011edf4c,0x0103bd68,0x00d7ffe2,0x00c3e755, -0x00c92ab6,0x00aaaba9,0x00d1046f,0x00d38738,0x010356da,0x00e6078c,0x00ce1063,0x00acd253,0x00649828,0x0045dd50,0xffed3d5f,0xffe0d641,0xffef1e54,0xffe987cf,0x003a070e,0x0072e6b7,0x00a94f7f,0x00f865d1,0x01479ad2,0x018e49f8,0x022c36bc,0x02d2fdac,0x035f2f44,0x03250920,0x030c4070, -0x0330d0d4,0x02d06854,0x0202c184,0x020a8084,0x01a45bbc,0x01df293a,0x01b25224,0x01b11e7a,0x01afbe92,0x01a04c70,0x019ef894,0x01881952,0x016bcd72,0x01613cbe,0x01454a30,0x012545b8,0x010a9e46,0x01026d12,0x00fe3ed3,0x00f11e3e,0x00d0fa5b,0x00d98c72,0x010347a8,0x011db340,0x013477f6, -0x014be14e,0x0167c7da,0x01861110,0x01a03478,0x01b52a1e,0x01bdeae4,0x01d28e9e,0x01d69d6e,0x020086b8,0x0200e470,0x0208ea4c,0x02050740,0x01fb91b8,0x01c129a2,0x01d3fb20,0x01a3827e,0x01898c5e,0x01608fac,0x01a1fb12,0x017c5ecc,0x015744ca,0x014d2fb6,0x0146ba7c,0x01449c7c,0x0139956a, -0x0135d03c,0x0132efec,0x014eb054,0x015bafe4,0x0122129c,0x013badb8,0x0143d6ee,0x01544e50,0x015f39d0,0x016c51c8,0x017d9836,0x01891226,0x01930842,0x019d1116,0x01a1c896,0x01ac316e,0x01bb3d0e,0x01c22836,0x01c9b7a2,0x01ce0b78,0x01c6f5e4,0x01c2b0ee,0x01be216a,0x01c4e260,0x01c561b6, -0x002feaeb,0x00175277,0x001367c4,0x001f57f3,0x00276778,0x002b865e,0x002eac08,0x0024ec9d,0x0021990d,0x00254fa3,0x002883b4,0x0032711c,0x00225044,0x0020060e,0x001e5b0c,0x002ac0aa,0x00343080,0x0040acbf,0x004032d8,0x0040d6ed,0x003c3d2b,0x00396e00,0x003686bd,0x00325fc8,0x002c59f2, -0x002b5ac7,0x003c017e,0x001bc6d5,0x00115596,0x000ca6f1,0x00165a6b,0x001eb982,0x0025fc63,0x0033186f,0x0032c675,0x001ebb5c,0x001cc715,0x00089069,0x00085d69,0x00180213,0x00389052,0x004ebcba,0x002992c9,0x00204800,0x002fc2e4,0x00353cd5,0x003b1163,0x004b231e,0x0027969c,0x001f5be3, -0x002145b7,0x003ccabc,0x00537dfb,0x007082df,0x0072f9c7,0x0068d5db,0x005a2685,0x005a1482,0x004bb7e1,0x003eddc6,0x002c4bf0,0x0023af5c,0x0046a3e6,0xffebfd01,0xffd1557b,0xffdced16,0xffed7d71,0x000a9d1d,0x001a22b2,0x0040efde,0x003d55f0,0x00041186,0x000b4573,0xffb911b2,0xff9ddd15, -0xffe5767e,0x0032470e,0x005ec3a3,0x00394eb7,0x0021854a,0x002a3ff7,0x002fc842,0x00489285,0x0061fb07,0x002bf05d,0x000a9cdc,0x0017929c,0x004c1880,0x008189c1,0x00c2b6fd,0x00c15976,0x00ad8f31,0x007b425a,0x0080c53c,0x00666d76,0x004b22b7,0x00294ff9,0x002323b4,0x0077184b,0xffbc2363, -0xff8806b2,0xff814675,0xffb40b7c,0xffefbd0e,0x000bc67a,0x0064f03f,0x0060e31b,0xffcdf226,0xffc1bb12,0xffa168be,0xff90480b,0xfff3f5fa,0x00527785,0x005d4453,0x0010a862,0x002f8698,0x00309aab,0x007157cd,0x006b843e,0x00234b2e,0xffd1b052,0xffe6057f,0x00234e2d,0x00914dd5,0x00d7040b, -0x012c1c8a,0x00ecb455,0x00c96cea,0x0097a67d,0x00aa91cd,0x007b09be,0x004d6cd0,0x0018d467,0x0010e2f2,0x006e45b7,0xff574d10,0xfedf1f4e,0xff0b5998,0xff6c6855,0xfff03e42,0xfff2d667,0x006915e3,0x00591c73,0xff746ed4,0xff8ccf7d,0xff935d68,0xff895f91,0xfe867584,0xfed098f6,0x00e725f8, -0x00d76c04,0x00b219fc,0x002576e5,0x00087230,0xffe7e992,0xffc1f831,0x00264ad9,0x002752fd,0xfff3a709,0x005b00d1,0x00b49fbf,0x012f0002,0x01123e78,0x00e74c4d,0x00818c07,0x007ff265,0x005a8a4d,0x0039832a,0x0015f49c,0x00216044,0x009a881e,0x00051ce6,0x002543ff,0x01186b54,0xff279709, -0xfefdcd8a,0x00189a28,0x00b25e88,0x00d6d83c,0x002d531e,0x00107b2b,0x0095a4d3,0x00ca142e,0x006cfd17,0x002cc09a,0xff4a9e51,0xfeff323a,0xff1c9cdb,0xff8abe91,0xffa2452d,0xffd47492,0xffdcedea,0xffe2565c,0x0009412a,0x002a7be4,0x00538264,0x0023155a,0xfff20209,0x0034cd0b,0x00537f89, -0x00a5dd79,0x005e0a45,0x000a8684,0xffc81412,0xffbdedf7,0xffc968b5,0xffe72bb1,0xff52a20b,0xff2bcc8a,0xff9a6ca6,0xff48eda0,0xff394a22,0xff66036b,0xfea158b6,0xfe3cc004,0xfe19bd12,0xffa74706,0x00af7ad0,0x00d4f02f,0x00012c5f,0xff7ed9e7,0xfed19de6,0xff58deb9,0xffa48214,0xff4518a0, -0xff8669bd,0xffe3793b,0x00100d58,0x000619f6,0x0012bfe2,0x0025c319,0x002557b7,0x000b6383,0xfffd4a5d,0x0047c33d,0x004ba916,0x008e5c00,0x000f4011,0xffe95547,0x003338f8,0xfffe7e1a,0xfffd1f26,0x001313ef,0xffdc416e,0xff9c6cfd,0xff5b7aa0,0xfef86d48,0xff12aa82,0xffdc4ab8,0x00aaa362, -0x00fb8c70,0x00ccf632,0x007a8eda,0xfb5ba410,0xfbd32110,0xfd0eb42c,0xfde90340,0xfe73c456,0xfe88d044,0xfed18952,0xfeebb048,0xff4d2d7e,0xff82aaba,0xffc0995e,0xfffe1a64,0x00109d99,0xfff2b696,0xfffc2864,0xffde06d7,0xffb86ca2,0xffbc07fc,0xfffce9f4,0x00c31f8b,0x00322f03,0xffe6bf53, -0xff98d1d1,0xff99cde1,0xffa61ed7,0xffa4ecb0,0xffb56868,0xffc81ae3,0x00005879,0xff78e306,0xff27a4e6,0xff888678,0xfe7cd5a4,0xfe1a0748,0xfe2ad6ee,0xfc237e4c,0x01a0b37e,0x02e66004,0x03b0b970,0x03690860,0x02db16c8,0x030e3cb0,0x02513644,0x00e9af1a,0x00a7f157,0x00485b42,0x005365c2, -0x00081887,0xffe27e58,0xffc5d743,0x0006dbcd,0x001315b4,0xffc6561c,0x00516371,0x0049fa48,0x0041e511,0xffeeaf60,0xffbf19b2,0xffe5ab2a,0xffbf84e2,0xff38d930,0xfeb43894,0xff096856,0xff03755d,0xfeb144a2,0xfec59afa,0xfebffdaa,0xfec4c9b4,0xfdb3c164,0xfd5a665c,0xfdecea38,0x00110765, -0x02737d74,0x0258dfa4,0x024704c4,0x0211cf74,0x01bc0de8,0x01887cee,0x018aa288,0x01b31fc2,0x019a62dc,0x01745c0e,0x0154d0e6,0x0114646a,0x00e97cb5,0x00e012c6,0x00744dbb,0x00350064,0xffe61759,0xffd35865,0xffb03514,0xff76407b,0xff180125,0xfee480b8,0xfebf828c,0xfe7035c6,0xfe7f053e, -0xfefd1a4e,0xfeb78034,0xfe90d68a,0xfe569294,0xfe138aa6,0xfde3ad64,0xfdf68820,0xff722ee4,0x00d3bf44,0x01c57072,0x02379f3c,0x026d9a50,0x022358e0,0x01f95bf6,0x01d86b42,0x01a5ac2e,0x018edc0c,0x0179027c,0x014e588c,0x012134c4,0x01130e96,0x00e42131,0x00ea14b9,0x00e080c5,0x00e04320, -0x00cc25e0,0x00ad89b9,0x00950a0c,0x00562202,0x00134fb5,0xffde8fc7,0xffdabbd7,0xffcb87fc,0xffc1ece4,0xffdb0168,0xffdae79a,0xffd61ee6,0xffda6a27,0xffef3bcf,0xfff47b94,0x00f07f85,0x01f109dc,0x02daa954,0x02eac71c,0x02f016d4,0x032b7888,0x02b9995c,0x0212fe28,0x02288270,0x021c1268, -0x020b0f48,0x01f807fc,0x01ea6360,0x01de325c,0x01ce110a,0x01c80174,0x01b3f604,0x019f8b72,0x018d4992,0x01735138,0x0155ed42,0x01416ea2,0x012b6180,0x011d08e2,0x010f3f12,0x01096d72,0x00e8eeec,0x010492c2,0x011d3b90,0x012fe730,0x0144e28e,0x015df75a,0x01770da8,0x01979940,0x01b404c8, -0x01bb2016,0x01c3c186,0x01ac8c3a,0x01bc9f74,0x01c0225c,0x01d93c86,0x01e97e4c,0x01ff460a,0x01cace88,0x01d46c1a,0x01ce7488,0x01c6ddb8,0x01b7bce8,0x01bc9f30,0x01b07d0c,0x019a8122,0x01920a0a,0x018a0caa,0x018545e6,0x017d26e2,0x01787b36,0x017590f8,0x017bdf16,0x017717f2,0x01679d42, -0x01670a2e,0x0162de0e,0x014c82be,0x015dd7aa,0x0168d030,0x017627de,0x01801b76,0x01899f6e,0x019390d0,0x019883ec,0x01a0df1a,0x01b05a3a,0x01b38978,0x01bd3830,0x01c03542,0x01c30d60,0x01c23556,0x01bf535c,0x01c6707a,0x01d909ea,0x003d1d72,0x0025eb15,0x001db9f0,0x002a4f46,0x003325a9, -0x004556a1,0x0039edd5,0x002cf652,0x002d6a39,0x00293c2f,0x002de37f,0x00415f28,0x002d09d6,0x00288f9f,0x002365c7,0x0033a146,0x003df8c4,0x0040b052,0x0049100a,0x004c7f9c,0x004a07ab,0x004596ea,0x004211b8,0x003d7a05,0x003a2657,0x00369e6d,0x003ebdf5,0x001ee999,0x0015ad39,0x00114072, -0x00272abf,0x00320bc9,0x0034b88a,0x0041ea30,0x00419c70,0x002dd4e5,0x002d4582,0x0021a429,0x00157fec,0x0026b558,0x004db0cd,0x008b54c2,0x00356c26,0x00222361,0x00430ecb,0x003a552c,0x00439f91,0x00683347,0x00397963,0x002d343c,0x0028bf32,0x0040f1c7,0x0056de65,0x006e4ddf,0x007f3a42, -0x00788ecf,0x0069ffd5,0x0068f6e1,0x005c5fcd,0x004d329a,0x0043a01f,0x0035f790,0x0042a09d,0xffe5dab8,0xffcc25a2,0xffd29f7a,0x0007bb77,0x002c0fee,0x002b7034,0x004f4fa1,0x0046fc31,0x000fa95b,0x0022f291,0xffede428,0xffd06080,0x00099576,0x004fcb63,0x00d52341,0x0038db11,0x001c15ee, -0x00549c38,0x002f3d3c,0x004ad6c7,0x00990223,0x0042892b,0x00194614,0x002122bb,0x004d8220,0x007f22b8,0x00b34e22,0x00cde151,0x00c51636,0x00985d46,0x0092c3e0,0x00774c6f,0x005c7a7e,0x004957d0,0x003670f6,0x0060bb32,0xffa1766f,0xff6ec349,0xff68d1b0,0xffe4115e,0x00340c25,0x002861d0, -0x007a62c5,0x006f9967,0xfffac22f,0x0003772a,0x00132ea3,0xfffedab6,0x0045c5a9,0x00969455,0x012c3a5c,0x00250e5f,0xffff1302,0x00491838,0x0053eba1,0x006b4610,0x00782491,0xfffb75f1,0xffec3c5e,0x0020f38b,0x007985c2,0x00c3c483,0x011353aa,0x010c9ee6,0x00fa95ff,0x00c452e1,0x00d10504, -0x00a1e7fc,0x0073a9e6,0x00547b73,0x003caaf7,0x00630f82,0xff346806,0xfeca1f74,0xfee7b3ca,0xffb6c645,0x003f19b1,0x0008b12e,0x006dff02,0x0053a923,0xff941c00,0xfff09018,0xff8e6362,0xff366821,0xfee15598,0xff2a9397,0x0067d943,0x00c48de2,0x00dbd63b,0x00741c22,0x002d370c,0xfffafa66, -0xffd7f270,0x0032c782,0x00352fd6,0x0004036b,0x0062a39a,0x00ad9ae2,0x010561fe,0x013e0a96,0x0129e9de,0x008b70f3,0x00838f7d,0x005b8078,0x002e518e,0x000e713e,0x001d38f5,0x006a5bda,0xfff2f4e1,0xffed1a9d,0x0039fa48,0xff554559,0xff83cfe2,0x00b63486,0x00d89d83,0x00f9fb91,0x009f5a88, -0x00406ae1,0x00ffe2a1,0x01f4fc66,0x0032e984,0xffb943bb,0xff88f636,0xff506729,0xff4bbb3a,0xff73bc8c,0xffacf5cf,0xffe5b635,0xffedea8e,0xffd363ee,0xfff2f647,0x001fd4f1,0x0059425e,0x003c128a,0x002fffca,0x002b627d,0x00441450,0x00c50039,0x00772e24,0x00445381,0x001ef9bf,0xffd8c16f, -0xffb43bff,0xff91de3a,0xff6980f3,0xff84b966,0xffee9ea0,0xffd99d11,0xffad7732,0xffef584b,0xfe0e3f4e,0xfda147fc,0xfe76d0ee,0xffa667c4,0xffebc534,0x009a5f12,0x009db368,0x000a0f05,0xfec39128,0xff68717c,0xffb47487,0xff574745,0xff7fd7c5,0xffcaa223,0x000910ac,0x00063cfa,0x0024213f, -0x00268a54,0x002f3c3b,0x0038d328,0x0046f6a3,0x003fa552,0x0053c86b,0x011c5526,0x006e80fb,0x004270c7,0x0066fa88,0x0072efb1,0x005377e2,0xffd88e59,0xffcc7f91,0xff9ac53a,0xff8f3b36,0xff89f3d3,0xffbb7a6d,0x005858c7,0x0121ff2e,0x011ba0d6,0x004de1f6,0xffec7bcd,0xfe308426,0xfc67452c, -0xfc7b37f0,0xfd34576c,0xfdd29978,0xfea709ea,0xff313ec9,0xff345d30,0xff642991,0xff9a2918,0xffef79bf,0xffffa790,0x001085f3,0x00052831,0x00153ccc,0xfff4ae88,0xffde69db,0xffbefc34,0xfff2542d,0x00d8e3d6,0x005f9b82,0x001ddaef,0xffbbb29e,0xff89366a,0xff38c4ed,0xff1dc8ed,0xff56d041, -0xff95d7c7,0xfff42eea,0xffe192b4,0xff75cdf5,0xff04dde5,0xfeb0106a,0xfe8fcea2,0xfe5f688e,0xfec782aa,0xfee7c2d4,0x008b2cc8,0x0214afbc,0x02486544,0x02297340,0x02269378,0x015bdc26,0x0038597a,0x00359d86,0x00041ce5,0x001d6901,0x001000ff,0xfff874a9,0xffc0675f,0x0019f7c4,0x00315ec7, -0x00116065,0x00131d5e,0x001c9b5c,0x0079ccb5,0x00040728,0xffb37cae,0xffa32b21,0xff4479a5,0xff2d7126,0xff89a6b0,0xff8af3ca,0xff6749da,0xff4db5d8,0xff03c9da,0xfef429c4,0xff007367,0xfed977e2,0xfe1a84f4,0xfd16befc,0xfe13b2e4,0x02b1e99c,0x02ed286c,0x02d32814,0x028b9a14,0x0239f084, -0x01b8d1ce,0x01c09ad2,0x023134d4,0x01cee2c2,0x0183e706,0x013a4ec2,0x0103657a,0x00f90a3d,0x01127334,0x00a861c4,0x003e3fb9,0xffbf1d3e,0xff958507,0xff60e6d3,0xff6ad11d,0xff2325c4,0xff094efe,0xff381ca6,0xfee4dc30,0xfefb0316,0xff23c458,0xfef05930,0xfed6c03c,0xfe88840c,0xfe4513c4, -0xfde86fcc,0xfd8f0ee4,0xfdf84bc8,0xff2aa02b,0x0107a53a,0x01f7e2ee,0x01edb9e8,0x01ea5d22,0x01df9fe6,0x01d12df8,0x01b791da,0x01bf8e24,0x01b9f50e,0x01aa946c,0x0173a632,0x0157036c,0x01225d02,0x00f5f9aa,0x00c5b828,0x008d6517,0x008a64c9,0x00779670,0x0066f43c,0x005894a3,0x00386126, -0x00238cd2,0xfffc46b9,0xffca336e,0xff999bb8,0xff74141e,0xff48a351,0xff194e9a,0xff159257,0xff0d6eb0,0xfef1c768,0xffcb813e,0x0094e736,0x0156202e,0x01be8cfc,0x01fe1168,0x024cbb4c,0x0204a324,0x01c7cd4e,0x01e091de,0x020c7fb0,0x01e1abb4,0x01eac8a6,0x01de8e7e,0x01d48476,0x01d2be2a, -0x01bc6848,0x01a89baa,0x019a34f2,0x01810278,0x016c6c9e,0x01522e2e,0x0138021e,0x010161f6,0x00e31df6,0x00bd0ac8,0x00c55763,0x00523634,0x006cfbd5,0x0095b9e2,0x00b473ce,0x00d1ff29,0x00ebb0d3,0x01012b9c,0x0115203c,0x0133556a,0x0147a534,0x0152286e,0x01484792,0x01507f1c,0x0156d984, -0x016f5152,0x018a9e80,0x01b1d868,0x01a89698,0x01ab6656,0x01bd6f12,0x01c2d820,0x01c50ff2,0x01b50d84,0x01b99b78,0x01b5c7f4,0x01adc368,0x01a50382,0x019c1c72,0x0195ff1a,0x01905bb4,0x018b9c38,0x01778e72,0x0165de9c,0x0174d948,0x0157acaa,0x0147fcae,0x01137458,0x0130faaa,0x0131a01a, -0x0137d134,0x013e4b20,0x0146f646,0x01515c18,0x015e4198,0x01690ab2,0x017739d2,0x017d45dc,0x018a4ea0,0x0195cbae,0x019a8b6e,0x019ca6c8,0x019b8434,0x019fbc1a,0x01dcba7e,0x0049442f,0x0034f9d6,0x0030ae06,0x0034fcf8,0x003e595c,0x00604c72,0x004204de,0x0035c337,0x003e582f,0x003421bd, -0x0038b7f6,0x0050ba62,0x0039e76f,0x0033ec3b,0x002e6644,0x003c5aab,0x0045238d,0x0046af57,0x00506b1c,0x0054daeb,0x0056e877,0x004fa299,0x004b80ad,0x00470ee3,0x0045eb1b,0x00406886,0x003baa37,0x00260e29,0x001f783d,0x001ba504,0x0038c2b2,0x00430f23,0x003a8033,0x004f5a75,0x004e5a9e, -0x00376e13,0x003ae766,0x00337179,0x0029eb08,0x00345a28,0x006222bc,0x00b52fc0,0x0041ea03,0x0029c969,0x00567b2d,0x0041fa68,0x004c31b1,0x00797b3e,0x00461fdc,0x0039a99e,0x003428ff,0x00497e0f,0x005c3b31,0x006bd598,0x00863870,0x00825038,0x0077d853,0x0071bef4,0x00657f69,0x005867bf, -0x0055e6ba,0x003ef7e7,0x0026ba17,0xffe401d5,0xffd4ba53,0xffdc1f24,0x0028139f,0x00480e04,0x002831f8,0x0058d2b4,0x004e7663,0x0019aad3,0x002d3245,0x00113db7,0xffe70e8d,0x001f3b27,0x0062355e,0x011ba0a4,0x003e5f49,0x001f73e3,0x0077ae94,0x0038ae53,0x004d6cb8,0x00b61dc2,0x004d95db, -0x00256228,0x002d7487,0x00530919,0x007ddbf6,0x00a0cded,0x00cf2486,0x00cfde2e,0x00ad6dce,0x0098fb61,0x007c31c6,0x00665d7b,0x005d4deb,0x00391b52,0x0019ecdc,0xff96025f,0xff70d87b,0xff6dc7d8,0x001771eb,0x0060beb9,0x001057a9,0x008e3881,0x007cb4f1,0x000e124a,0x0025e6b4,0x0022a208, -0xfffb0360,0x004ebd61,0x00b53eca,0x01a0d948,0x003b943b,0xffe601ba,0x006ef705,0x0046e77c,0x006d8856,0x00c2a6cd,0x001bd4b4,0xffee4db6,0x00331d53,0x0079e24c,0x00c07d79,0x00fc8c93,0x011a763a,0x011528e8,0x00dda274,0x00d341ac,0x00a7b6fb,0x008c4142,0x007944ca,0x003452b6,0xffe33715, -0xff09382f,0xfec5b4c4,0xfeea67f0,0x00026d3a,0x0063fdd4,0xffd7cb19,0x00693bd3,0x0047659c,0xffadba93,0xfffe5a45,0xfff16e36,0xff7d336e,0xff18f424,0xff451855,0xffd09f6c,0x0092abd4,0x00efe553,0x00be5891,0x004bc024,0xffffcd74,0xffdd5fc9,0x00370994,0x0046903d,0x0020100c,0x007501a3, -0x00acb4bd,0x00e287ad,0x01552e2a,0x013e6b9e,0x00a18ea7,0x00a722b8,0x0065c0c4,0x00247c83,0x0018a026,0x0028edb9,0x004872c9,0x003dd411,0x002b2764,0xffcf05ae,0xffb8ad9b,0x00123059,0x010e6cd6,0x00f6eefe,0x012437fc,0x0147de8a,0x008c01bc,0x00a6d03d,0x028b956c,0x003c69e2,0xff894c1c, -0xffce379e,0xffb86218,0xffa11367,0xff916133,0xffd78581,0xfffc50dc,0xfff0ab9b,0xffd5c55c,0xfff27eba,0x002c37df,0x0059a5b2,0x004e560f,0x005b9415,0x00228fab,0x00315110,0x00b178c7,0x006800d7,0x00433ea4,0x002ba68b,0xffb94eb9,0xff96f8a1,0xffb25fba,0xffac7658,0xffece242,0x00489272, -0x00418dea,0x00007854,0x002bf2ad,0xfe0d64d4,0xfda33fc8,0xfee72ce4,0xff530d46,0xff9ff2d7,0xffef1a50,0x0058cc62,0x0003d232,0xfecd892c,0xff2f9560,0xff8a830c,0xff7d6e70,0xff84715a,0xffba1047,0x00061154,0xffffac55,0x0025673e,0x00227f03,0x00304f92,0x005715a9,0x008a483f,0x0032bcf4, -0x005b1aa1,0x0158ca1c,0x009fb5c1,0x005bf537,0x004e87ed,0x0003e625,0xfff4e9e3,0x0026c0a8,0xff86c898,0xff534198,0xff8e6a36,0xffda1fae,0x002da03e,0x006578e7,0x0133c5f6,0x01001d44,0xfff2131e,0xffe18032,0xfffc504a,0xfe37e42a,0xfcdeb57c,0xfd254258,0xfdc62560,0xfed67716,0xff7f42f1, -0xff76d1e9,0xff899521,0xffc0389b,0xfffe91bb,0xfffc4fff,0x0009d11d,0x0022a7a0,0x0021d642,0xfffacc78,0xfffad440,0xffd64bca,0x0011f5ee,0x00ce0d8b,0x006b614c,0x002dd9a5,0xffc7f644,0xff6ec4c7,0xff2a2a90,0xff84d985,0xff62829d,0xff9099b8,0xfff3dd6e,0xfff7161b,0xffa58cd7,0xfed4195c, -0xfecc9a94,0xfeb72778,0xfe90d4e8,0x000b7819,0xfc75e768,0xfe098dba,0x0017ca15,0x00d4d369,0x011782a6,0x00d8cb40,0x00340e15,0xff9b1661,0xffbeaff3,0xffbdff50,0xfff67262,0x002962fb,0x001abe62,0xffd69357,0x001550de,0x003465c8,0x005ad0c1,0xffea06cd,0xffe0691a,0x00594bec,0x000eb637, -0xffdd562e,0xff7da4eb,0xff758cb0,0xff8c4b42,0xffb22848,0xff46f55b,0xff4f3329,0xffc4ad1a,0xff792aea,0xff70d297,0xff69a905,0xff8a79c0,0xfed7d19c,0xfd5e6194,0xfca016a0,0x028931fc,0x03232910,0x0331e268,0x02de709c,0x02a6dc20,0x0216c248,0x01fab310,0x024778d8,0x01f09e5e,0x01989532, -0x01173050,0x00f0779c,0x00e3a2ef,0x00dbf35d,0x009179ef,0x00270428,0xffb7fbeb,0xff888ad6,0xff787480,0xffb67cbc,0xff71e89c,0xff5a24d8,0xff7ac10e,0xff5a7982,0xff6307a5,0xff638235,0xff6604b0,0xff413cc6,0xfed1d60a,0xfeb621a2,0xfe542858,0xfdcd0418,0xfda50238,0xfe4bbfea,0xfff2f4c2, -0x0165d986,0x016f14cc,0x01b9d308,0x01baac04,0x01c823b2,0x01c5d7f2,0x01d14df8,0x01d5d204,0x01d6e59a,0x01a3f732,0x017cd576,0x0156c29e,0x01104876,0x00cae4c7,0x008460a5,0x0074ae2f,0x0066fb16,0x00521d0f,0x003e09a0,0x00228902,0xffd9a3e3,0xff932cee,0xff68e97f,0xff2e63fe,0xff01b6a6, -0xfed8cf32,0xfeabcf40,0xfe9e4dea,0xfe882798,0xfe626398,0xfed5d994,0xff349bbc,0xff90febb,0x004928fb,0x00d85b3c,0x014dd7c6,0x014f9d98,0x0162efb4,0x0174513c,0x01bc7fcc,0x018660a8,0x01a1d1cc,0x01a6d0d8,0x019d3f04,0x01a4d28c,0x01781596,0x015c6e88,0x014a2504,0x0123ee2c,0x0109bf32, -0x00eec7a8,0x00d594f8,0x009b8036,0x006be894,0x003d2e37,0x003e7133,0xffe7e58f,0xffff5d48,0x00102d54,0x001da2d7,0x002e25f1,0x0039c46d,0x0041e4a1,0x0063ed38,0x008d43ba,0x00b4373e,0x00d0f62a,0x00ea170d,0x00fe5912,0x010548dc,0x010f3b7e,0x012bb400,0x014d2596,0x014a40e0,0x014306a0, -0x0181ae9c,0x019d9fa8,0x01c1d310,0x017399c4,0x019db96e,0x01c14784,0x01b6992c,0x01addf0e,0x01a12b5c,0x019c39da,0x019660bc,0x018e6992,0x01514b5c,0x0124baca,0x0168d68c,0x01329c6a,0x010ed866,0x00cf4530,0x00e32ec9,0x00df1192,0x00e0e5d1,0x00e095f5,0x00e24147,0x00e05925,0x00f45ab7, -0x01018200,0x01105fbc,0x011adaea,0x0128509e,0x013af564,0x013ca942,0x01405158,0x013ecdde,0x0141e01c,0x017af086,0x0055ee35,0x00439be6,0x00477540,0x00491146,0x004ff00f,0x0072ed2e,0x004e4a96,0x0044561b,0x004ebace,0x0042cf82,0x00464cac,0x005c3f81,0x0047bb88,0x0041e9c6,0x003d7356, -0x0049cd89,0x004fa67e,0x004ef055,0x005bbc90,0x0061013c,0x00641b9c,0x005aec03,0x00565f47,0x0051b07a,0x00506f54,0x00489f2b,0x003819d3,0x002f59c1,0x002c3cab,0x002815ea,0x00499c44,0x0052da83,0x00425a7c,0x0059d1ed,0x00595d49,0x0043760d,0x00482ea8,0x004822dc,0x00589760,0x0055458a, -0x007f22e3,0x00cb838b,0x005230f2,0x0036e6b9,0x00644b11,0x004dd1cc,0x00585a97,0x00801cf6,0x005504ad,0x0049c701,0x00433e19,0x0053d5a4,0x00618ce7,0x006ced7a,0x008ca242,0x008d91e0,0x008c1ee6,0x007b2859,0x006e1115,0x0061b2c0,0x005d9ab7,0x003eb916,0x000b212b,0xffe96716,0xffe73d13, -0xffed0b66,0x00479a0f,0x0063cb24,0x002f70e0,0x00679903,0x005b756a,0x0028a412,0x0039a8fc,0x002affec,0x0025b1f9,0x0042ade8,0x007fd46e,0x0133972e,0x004c4e4b,0x002b36a2,0x00862402,0x0045499e,0x00517a5f,0x00b5970a,0x0054b3e9,0x00355c1c,0x00399281,0x005b3d95,0x007b5296,0x008afe51, -0x00cb291f,0x00d57794,0x00c2fa3d,0x00a26d71,0x008350cd,0x006abd7b,0x00611ae0,0x002c2275,0xffd2e5d3,0xff91c1a4,0xff862b6d,0xff8e2473,0x0045ffe1,0x00820d6c,0x000f307d,0x0090068c,0x008780d6,0x002081cc,0x003bd633,0x00483301,0x005336a0,0x007b9852,0x00ec77b2,0x01d7cf14,0x00506824, -0xffe74e64,0x00896647,0x0048f717,0x006cb86f,0x00e8ee32,0x0033bb39,0xfff91c78,0x0042f72c,0x00818e9c,0x00b5e0ac,0x00de07f3,0x011de7b2,0x011f8bf0,0x00f66171,0x00d28f2c,0x00a89494,0x008eb82b,0x00725629,0x0007f98a,0xff619584,0xfeead4b8,0xfee88198,0xff168490,0x0040faa3,0x008f8152, -0xffd98c43,0x0082162e,0x0050fd20,0xffb9b3d6,0xffff2c1c,0x001d28b9,0xffd8a6b2,0xff427f37,0xff39f221,0xff7f21c3,0x00818f6c,0x010b88bc,0x00edcb46,0x00687237,0x000461af,0xffde81ac,0x0036f1d0,0x005327fe,0x003a70f7,0x00925f32,0x00b7609d,0x00ce5b4f,0x013c970c,0x0134ce80,0x00ea8b25, -0x00a7d5dc,0x004e7fb9,0x001a4980,0x00123246,0x0025430b,0x003c8822,0x005b2692,0x0051fc39,0xffd20a7f,0x00472567,0x007c2342,0x00b913d1,0x00b9ec22,0x01279a8e,0x01f9b518,0x00d1ee0f,0x0048fbe9,0x02a96f0c,0x00387448,0xff7326f2,0xfff83b77,0xffd804b6,0xffd50f41,0xffc35fa3,0x000fb137, -0x002f33f8,0x00034dca,0xffe71012,0xfffe0cc4,0x0041ddda,0x005224aa,0x005e9dfd,0x00792f3e,0x00360e82,0x003196b2,0x0092b44b,0x00475db3,0x00208620,0xffe58300,0xffbe6425,0xffb78e26,0xffec551a,0x0016e30f,0x00602697,0x009f84a0,0x0058f6ee,0x0051067b,0x00ba03e8,0xfeb667dc,0xfe1ace1a, -0xfefeafb6,0xff0da2fd,0xffbb356c,0xffaf3f28,0xffde9195,0xffc6d053,0xfef2369e,0xff043b20,0xff426f19,0xffa74183,0xff921c9f,0xffb00340,0xfffbf282,0x0008f9d0,0x003155d6,0x001cb0e6,0x003975ac,0x006e4d48,0x00989800,0x0026a346,0x005eeb20,0x013816a6,0x009ace04,0x0064b8a6,0x001c09fb, -0xffff326e,0xfffdb503,0x002fa753,0xffa658d8,0xff9482a3,0xffff89ed,0x001d89a0,0x0058b350,0x00754639,0x00f1a6c7,0x00e92af1,0x000a25aa,0x00082e3d,0x00a00f0a,0xfffa3957,0xfded7770,0xfd9e6884,0xfe1fc502,0xff035961,0xffaa1289,0xffbf055c,0xffb785bf,0xfff45ffe,0x00112111,0xfff755d2, -0x00011e8b,0x0043bc7d,0x00357b7b,0x0016cfbd,0x0016ec11,0x001c583e,0x0040d518,0x0078acd8,0x004a0c7e,0x002be81f,0xffd6124a,0xffef44e2,0xffd0d734,0xffca4746,0xff654abe,0xff76f896,0xffd88d36,0xffa86f6d,0xff87e3fc,0xff20fe51,0xfec2977e,0xfea2104e,0xfef497d8,0x0026482d,0xfb997888, -0xfc49c2c4,0xfe62ebec,0xff895f64,0x0017519f,0xffaef1b0,0xff480a98,0xff467216,0xff63050c,0xff80337b,0xffdcfb54,0x003aa8c9,0x00394dad,0xfffbd9cc,0x000cd1e9,0x00267fd4,0x0070abfe,0xfff1a50a,0xffe272d8,0x005ac699,0x005fec73,0x0038d7b0,0xffa832a7,0xff92421e,0xff7cf769,0xff7e671c, -0xff4e18c7,0xff7d8cce,0xffba2c02,0xffc3660e,0xffc859ce,0xffab6b51,0xff9de170,0xff19b7e2,0xfe2f5086,0xfc73f7b0,0x017943d4,0x0279bc34,0x02dcaad0,0x028c697c,0x028626f8,0x02185ba0,0x01e85578,0x0215794c,0x01df8990,0x019513b2,0x00fef3b3,0x00d7b314,0x00b029eb,0x0082dc14,0x00716935, -0x002eb581,0xfff00558,0xffb7d3d9,0xffb7905f,0xffd7d9f9,0xffa4cd9d,0xff96d76d,0xff8ab947,0xffb177d9,0xffaafaa3,0xffb5bce7,0xffb26aab,0xff852aa7,0xff1416c8,0xff1c6ff5,0xfec99fba,0xfe2d55a6,0xfdef331c,0xfe097efc,0xfec0e010,0x003dd914,0x011774d0,0x019dc56e,0x01b1a942,0x01d73c52, -0x01fda620,0x01e7cab2,0x01dbdc7e,0x01cb26b8,0x01a09ba4,0x016f2bf6,0x015a928e,0x011d50a4,0x00f5f183,0x00c1121f,0x009379cc,0x006e89db,0x00443aac,0x0003ebbf,0xffb95a17,0xff52028f,0xff12f135,0xfeea0b5c,0xfeb0539a,0xfe9ca7a8,0xfe89bae6,0xfe7552ca,0xfe4ca000,0xfe27823a,0xfdfb8c54, -0xfe2a97e8,0xfe4d144a,0xfe68831c,0xff33a4a5,0xffeba883,0x007f7aa5,0x00d48a02,0x00e2476b,0x00f819b0,0x0156d96e,0x01122f7e,0x01383542,0x014af87a,0x0140a08a,0x0151b282,0x0112826a,0x00f3863d,0x00d9541e,0x00a323fc,0x007b071f,0x005821c6,0x0058516a,0x003ecf85,0x0019bbde,0x0008c678, -0x001b92cb,0x00010db7,0x0001dd03,0xfff3b851,0xffe83c3c,0xffdd30db,0xffce0284,0xffbd0aac,0xffe411f6,0x000a2db7,0x002b4f82,0x00475ff0,0x0064ce56,0x007497b3,0x0083e626,0x0088cd2f,0x00a4a441,0x00c1202d,0x00a62e3d,0x009b320d,0x00edb66d,0x011bda7e,0x0165395c,0x00da0d67,0x01220490, -0x0171b5c8,0x0160aff4,0x0154b5aa,0x01439c2c,0x013db926,0x0135a9a8,0x0126dd3e,0x00d4fad0,0x0099cc16,0x01129e1e,0x00c8eeb6,0x009d3e24,0x006244e0,0x0062ee1c,0x005a437e,0x00546c2b,0x004b8d07,0x004515e8,0x0036b8e4,0x0048ad53,0x00524509,0x005f02e5,0x0067bcf0,0x0071a58e,0x007f9db1, -0x008764ee,0x009129e8,0x0095cf7e,0x009ca67c,0x00a5098b,0x005c1f0d,0x004fa320,0x005213da,0x00555133,0x005a1fba,0x0079500e,0x005175a2,0x004b5d13,0x00566b1e,0x004cdf7b,0x004e9604,0x005e9991,0x0050873e,0x004c40b9,0x0048394e,0x004ec3bd,0x0052e03d,0x0053818b,0x005fa010,0x00653dd9, -0x006b5e67,0x00607e68,0x005b76b1,0x0056406b,0x00544540,0x004b454b,0x0036ea11,0x0035325c,0x0034d822,0x00329e29,0x004ff466,0x00583e11,0x0049b10a,0x005dd6d9,0x005e775f,0x004c5025,0x0052a614,0x005ac960,0x006f472b,0x0078737d,0x0092b3db,0x00cc6482,0x00590105,0x003c4542,0x0063a01a, -0x005742de,0x006391d2,0x007a7ad0,0x006170ef,0x0056d6d8,0x004b22ab,0x0056071c,0x005f065a,0x006aa249,0x008b9d29,0x0093e7f6,0x009d9a46,0x0083b515,0x00748a21,0x006592b3,0x005f4691,0x003fc136,0x0003a400,0xfff3b85c,0xfff6cc9b,0xfffbc45f,0x0050ceb8,0x0067e61f,0x0035a255,0x00677f8b, -0x005e2b5e,0x003233eb,0x00479937,0x0058736c,0x0056e675,0x00772fa7,0x00989c26,0x012a743a,0x004f8f55,0x00310c7d,0x00828578,0x0051b977,0x005ae323,0x009f66b3,0x005e0413,0x0046ed78,0x003d6b63,0x005a8ef4,0x0071556a,0x007755b1,0x00bf5911,0x00d0eb82,0x00d7cdb1,0x00a90b6f,0x008865c7, -0x006aa578,0x0060414b,0x0023b5a2,0xffbb981f,0xff9f097d,0xffa2102c,0xffba175f,0x004b43f8,0x007ea164,0x0023efe7,0x00852419,0x008ee3c7,0x003695d4,0x00612fda,0x008991b1,0x00ad2e1e,0x00dc8c3b,0x013979ac,0x01ebe988,0x00631c0b,0xffe682b0,0x008717a6,0x00511842,0x0072c13f,0x00f14f2c, -0x0048996c,0x000d99c6,0x004801aa,0x00835d02,0x009ee09f,0x00b4e3a3,0x0114cff4,0x01271702,0x0126a80e,0x00e67d58,0x00b5a466,0x008d1cb0,0x006d8ce9,0x00027f38,0xff46174f,0xfefc46de,0xff1f71e3,0xff554a0a,0x004a5847,0x008328ce,0xffeaf76c,0x007cb554,0x004b8f9a,0xffc437e0,0x0022a2e1, -0x0026f1ad,0xffe38147,0xff50d464,0xff16f581,0xff4089ac,0x00756cb0,0x0121eb5a,0x01168698,0x008e865b,0x000e03e4,0xffd53fa5,0x0031182b,0x00573cbf,0x0049cf65,0x00aa01dd,0x00bf0fe7,0x00c566fb,0x00f8e97f,0x01010ac6,0x00feba9a,0x00717105,0x002e2fff,0x0028424f,0x000ee6c0,0x00126ab9, -0x00135a85,0x008032a1,0x006d80a1,0xff7e528e,0x00857a41,0x00b79121,0x0054c83e,0x00959723,0x01461426,0x027dfd8c,0x0120238e,0x000b32ca,0x02564e68,0x005fc5f5,0xff9fd4ea,0x00399488,0xffad24b8,0xffac95dc,0xffd7e791,0x002168ba,0x004eb559,0x002afc8b,0xffff1f06,0x000d4465,0x004935a7, -0x00442143,0x006a738f,0x008cd217,0x0069965f,0x0060a6e1,0x008f04fd,0x005843a2,0x003b83a8,0xfff66aff,0xfff3d3fc,0x00086a80,0x00493b0b,0x0051af48,0x0096aff0,0x00dd6334,0x00557260,0x00653a4f,0x00f72b96,0xff4a0179,0xfe99eae2,0xfedf60e8,0xfef4816a,0xff9590b3,0xffb470c9,0xffbab225, -0xffad54aa,0xff3a0096,0xff1e13aa,0xff2ea365,0xffcd1df2,0xffa2cb38,0xffb1c400,0xfff26de1,0x001cf05a,0x004475c7,0x0016b47c,0x0045bf89,0x0080076d,0x0081a4b7,0x002df560,0x0060c092,0x00d8ba13,0x009d98b7,0x008f5574,0x003d0c37,0x00411d39,0x0023d4f8,0x0017af02,0xff9a932d,0xff93b78e, -0x003cf6e4,0x0044a415,0x007bb4d0,0x00b71b30,0x0095718c,0x008fe54e,0x0002f04a,0xffda9008,0x007c10b1,0x0068813b,0xfef83b9a,0xfe5f0c7c,0xfeab0778,0xff3394d9,0xffc2c6a9,0x00114b3d,0xffe4b1b9,0x0021d15e,0x002efdd0,0xfffd7272,0x00074794,0x004fa6b5,0x004c2f7b,0x004b5136,0x005091c0, -0x006f4038,0x006678de,0x00488d5a,0x006bddfc,0x0068a31a,0x002c5a37,0x004b7c32,0x003fb656,0x001e14c4,0xff9078f1,0xff94e079,0x000a7fbc,0xff9143e7,0xff6caac7,0xff57f6d1,0xfeffc8c8,0xff0af9d1,0xff7da19a,0x000cef1a,0xfc8aee30,0xfbfa05a8,0xfd7c9908,0xfeacce44,0xff59bbe7,0xfedce984, -0xfeaf630e,0xff2a7f4f,0xff2dd4c7,0xff545e11,0xffbc2c87,0x002e6672,0x0047ba8a,0x0025ffb5,0x0019dca6,0x0021fcc5,0x0062c53e,0x0011258a,0x0014ac31,0x0069954e,0x0077b7ee,0x0047cf71,0xffdbdb8b,0xffb67889,0xff95678a,0xff947321,0xffcedfee,0xffe2aa1f,0xff8dfece,0xffe35150,0xffd70aec, -0xff8e7a28,0xff316f87,0xfeda9ffc,0xfe842e5e,0xfd52b848,0xffdf70ad,0x01015336,0x01bb5aae,0x01972610,0x01b728ae,0x019880b8,0x0183171c,0x01b497a4,0x01806a94,0x014c0b66,0x00db3f88,0x00b7a86c,0x007edc76,0x00576f72,0x006befc3,0x00538016,0x003e6650,0xfff8bc7b,0xffdf76f4,0xffdf7b5f, -0xffda89a3,0xffdb7ac7,0xffcb9c13,0xffccc0f9,0xffb1dc52,0xffa6bf6a,0xff940f9c,0xff72ff67,0xff2ef879,0xff687738,0xff4f276a,0xfef42b42,0xfea2582a,0xfe5dea2a,0xfe51d372,0xff115c53,0x00bd0cb1,0x016728e8,0x0195c606,0x01be4616,0x020c3730,0x01dee010,0x01bce3e8,0x019be674,0x017932aa, -0x014a20a8,0x0136d246,0x011036a0,0x0106e1fe,0x00e14691,0x00a179ec,0x00605ee9,0x0021d601,0xffdbe201,0xff80f03b,0xff408c4e,0xff107b76,0xfed5711c,0xfe9fb996,0xfe8e431c,0xfe7fc1c2,0xfe6edfb2,0xfe52704a,0xfe39f714,0xfe1dc8ba,0xfe0f49c6,0xfdf9ea98,0xfdd9988c,0xfe8a1124,0xff320492, -0xffbd2775,0x00562101,0x00555a85,0x00716e9f,0x00d3b8a4,0x008dea3b,0x00b5be4e,0x00c4282d,0x00bf7151,0x00dadf2b,0x00a05549,0x008afe9e,0x0072ab15,0x0041fee0,0x001c7741,0xfffcf21c,0x000bfc42,0x000e4a6f,0x0000a4ae,0x0004e4e0,0x00218a89,0x0012e607,0xfff90b97,0xffde3ad5,0xffc2436a, -0xffa3bfaa,0xff80b1fe,0xff590b1a,0xff729230,0xff863155,0xff9b4f99,0xffaf6fc0,0xffcabe8c,0xffd33924,0xfff141bf,0xfffe4cc7,0x00190f4d,0x00334002,0x00126545,0x000c59be,0x00484f06,0x006fa945,0x00b40d34,0x0038d72b,0x00750830,0x00c41942,0x00b3b381,0x00a6c8a1,0x0096e75e,0x00902aec, -0x00863629,0x00754d95,0x003f2111,0x0012b0ca,0x007634d6,0x003b81fe,0x001e41d9,0xfff2cc56,0xffe9c00b,0xffdd1ba3,0xffd0cd03,0xffc2ef1f,0xffb813bb,0xffa53d8b,0xffb47fd7,0xffbad9b2,0xffc20f3b,0xffc70925,0xffcb7c15,0xffd0c8a5,0xffdec301,0xffed1783,0xfffa0251,0x0004dc89,0xffe94def, -0x00594536,0x0053ec1d,0x00504b1c,0x0057b99f,0x005cf742,0x0077cd65,0x004c841a,0x004cd005,0x0058fe04,0x00557f39,0x00564fe0,0x005e63d8,0x00585d75,0x00556027,0x004f4076,0x004e9843,0x004fd430,0x00585c4d,0x005f7e1f,0x006272f1,0x0066e42a,0x005d518f,0x0057f26c,0x0052d7a5,0x0050bf6e, -0x00484d9a,0x0035d5c5,0x0035f784,0x00365ae8,0x00344bbe,0x004aff8b,0x00517c4f,0x00479538,0x0055e9a1,0x00586799,0x004f35bd,0x0055347e,0x00612818,0x0067bb99,0x00863559,0x008da588,0x00b64ed5,0x00551081,0x003b0bc2,0x0058c0b6,0x005af496,0x006a2862,0x0070e252,0x00689e07,0x005cf049, -0x0049d76b,0x00517ca3,0x00579f84,0x006958a3,0x0082685a,0x00950149,0x009e7ee9,0x0080622d,0x007058d3,0x005f2607,0x00577ad0,0x003bec96,0x00066aa5,0xfffcef93,0xffffa5f2,0x000179da,0x0048b815,0x005d3b33,0x003cbda9,0x005d880c,0x005836ab,0x0041ffe9,0x0051b3f6,0x00723e11,0x006530f7, -0x008c713d,0x009076f4,0x00fc83e6,0x0044e3c2,0x002ea3d4,0x007120ea,0x005fa711,0x00697637,0x0088eb07,0x0067d804,0x0057046a,0x0036fc17,0x0051acfc,0x0061ed27,0x0073325d,0x00abb23c,0x00c3e78c,0x00dd19c1,0x009faf12,0x008259da,0x00624ffd,0x00588199,0x001eddf9,0xffbff974,0xffb47610, -0xffbc032f,0xffc7ea7f,0x0037b58c,0x0063574c,0x002929ce,0x00645d70,0x0078bb9f,0x0058faf0,0x007d429e,0x009182f5,0x00aa13d0,0x00f4c2c6,0x0138a0f4,0x01acdde2,0x0060d8e3,0xffe3a9c1,0x006e2ffc,0x005a129e,0x0081caf1,0x00e68514,0x005a6cdd,0x0021d623,0x003f63bd,0x007cac34,0x0088773f, -0x009dbb47,0x00fc814e,0x0128db2a,0x01486088,0x00e57065,0x00ac68b6,0x007b180b,0x005a16bc,0xfffc006d,0xff50aa84,0xff1d1b9e,0xff41afbe,0xff6708d7,0x0034c768,0x00675f87,0x000f8f56,0x006605a9,0x003dbd28,0x000611e7,0x00467153,0x0076d1a3,0xffff8ed1,0xff7baaea,0xff13c81a,0xfefe478a, -0x004bffc3,0x011270f2,0x013262e8,0x00bcb97c,0x00253ec2,0xffcc9a7b,0x0028d852,0x0052f273,0x0055005f,0x00b46571,0x00b72085,0x00b42be5,0x00aaf207,0x00b3339a,0x00c58aa2,0x00432af9,0x002f9d5c,0x0045c299,0x001d483c,0x00215fdf,0x0021846e,0x00e5b2d4,0x00c21351,0xff58386f,0x006559cf, -0x0086fc0d,0x000ead2c,0x004f16cd,0x01206946,0x02989a70,0x015e4b24,0xff6f3b4d,0x0156daf2,0x00972092,0x0016d77f,0x00727c55,0xffc325f7,0xff9393d8,0xffc712aa,0x001b7239,0x0053e53f,0x004f28cb,0x001ad818,0x001cd8cd,0x00493f08,0x003bbf45,0x0071364e,0x009d9718,0x0097e0ac,0x0097dcc2, -0x00874198,0x00744472,0x0061e808,0x000a648d,0x00200637,0x002bf246,0x00438b1d,0x007d4b05,0x00996fe8,0x00609c69,0x0051eb9a,0x006292fe,0x00a9fcca,0xffa21a62,0xfef95db4,0xfeb51612,0xfebff7ae,0xff834b56,0xffc53914,0xffc7a1d4,0xffb126fb,0xff892c22,0xff4fb1a8,0xff452019,0x00022bf8, -0xffbc3839,0xffbf694b,0xfff8b79c,0x00282686,0x00486b17,0x001890ab,0x00469886,0x0085463f,0x00699cd1,0x003651af,0x0052b86c,0x00787ba2,0x00af0ed6,0x00ba2d6e,0x004fe18d,0x005a8889,0x002f7a26,0x0008f193,0xffbe0ec6,0xffbf3328,0x004511e1,0x007dc899,0x00bf534e,0x00f3e0a1,0x0074af48, -0x00476bd6,0xffd57075,0xffba43a7,0x002b9360,0xffe2e241,0xff8793f6,0xff20a2a0,0xff2c42db,0xff52b58a,0xffbd6210,0x00567416,0x000cbea6,0x003d4a1b,0x004265b4,0x000f28e3,0x00157a88,0x00510b3b,0x005cf2eb,0x00759f98,0x00807b84,0x009d268d,0x008a5f18,0x004ee154,0x008e7a89,0x00912aef, -0x005982c7,0x00831315,0x007ede6e,0x0028a349,0x000555b6,0xfffd662b,0xfffa11ff,0xff85d8e5,0xff54d3cb,0xff33ff07,0xff750c14,0xffb45413,0xffc8af51,0x0025dd3a,0xfe1e5558,0xfd141f54,0xfd81eb40,0xfe44767e,0xfee0de86,0xfe839b84,0xfe8b3036,0xff2951e5,0xff1fe027,0xff477a9b,0xff9e1596, -0x000a4b5e,0x003c891e,0x00452406,0x0031904a,0x00318c41,0x00613186,0x00385c7c,0x00428d00,0x005df893,0x007b7926,0x006334c4,0x002925e1,0xfff0d4f8,0xffcc7108,0xffa96e42,0xffed152b,0xfff3780f,0xff96bdc7,0x00180aa7,0xffe367d0,0xff33378c,0xfed673cc,0xfe9eb9f2,0xfe7e05da,0xfe5f39f2, -0xfe9ff364,0xff858357,0x00578b44,0x007d35f8,0x00add5e8,0x00f1c9e8,0x01023d08,0x011b8f16,0x00e3df16,0x00c4c160,0x00916d31,0x009b077f,0x00771b9e,0x0068200e,0x006c3dae,0x0061c0a6,0x00670abc,0x001055c3,0xffea110a,0xfff0ce8e,0x001592e6,0x00218ace,0x0020cda2,0xffd09e15,0xffaed9bd, -0xff828648,0xff8bd1b3,0xff7860b4,0xff451451,0xff7c2e59,0xffb12e31,0xfff659cf,0xff7ddd2b,0xff0b7b5f,0xfea8fcbc,0xfe78239a,0x0033af2d,0x00da1788,0x0128f250,0x0148bbb4,0x01aa71f4,0x0187416c,0x01644e24,0x0151b8e2,0x01420f78,0x01243dc0,0x011e3c42,0x00f42151,0x00ebe7c3,0x00c19f1a, -0x008b3129,0x004749e6,0x000fe58e,0xffe26d0f,0xffa4c1d1,0xff923033,0xff609a14,0xff1a4dba,0xfee41220,0xfecbeff2,0xfeb7e61a,0xfe9b02f8,0xfea0dd74,0xfea0fe26,0xfea54550,0xfe6c94f6,0xfe23063e,0xfdd08fd0,0xfe3b77fe,0xfeacfe72,0xff0ea725,0xffbd892b,0xfff07688,0x000fa8a1,0x005bd4cc, -0x00265b2b,0x0047dc73,0x004d0ed2,0x005270e9,0x006c0805,0x0047504c,0x003bc56b,0x002f73b4,0x0010f68e,0xfffc8ab3,0xffeb07ef,0xfff49fc7,0xfff401ad,0xffea5c6b,0xffe8e41c,0x00015c76,0xffd13b59,0xffb19d17,0xff9e2276,0xff82e67b,0xff65a88e,0xff43ed0c,0xff1dcef9,0xff25effe,0xff27dce7, -0xff31ad8a,0xff3d7214,0xff5a8643,0xff61ec45,0xff8e8aee,0xffa4ed80,0xffbba93c,0xffd4a307,0xffb4df35,0xffb5f9e5,0xffd4ddcb,0xfff060d2,0x001b3c3e,0xffd22768,0xfff738c9,0x0029723a,0x001ec16b,0x00172333,0x000cb008,0x000a624c,0x0003b841,0xfffa4f7d,0xffdac514,0xffbaa549,0xfffa5829, -0xffced457,0xffba805e,0xff92155e,0xff8ea4ca,0xff81b042,0xff75ee8a,0xff697b99,0xff5fb183,0xff50254e,0xff5bb712,0xff608af7,0xff63cae0,0xff6777f5,0xff6872d9,0xff68d91d,0xff7718bc,0xff866603,0xff991683,0xffa5243c,0xff7b49d6,0x0053a8ca,0x00533339,0x004bbf9c,0x0052f37c,0x00565153, -0x0069cd97,0x004701d9,0x0048dfac,0x0051a0ef,0x0054fb8b,0x005627b9,0x0057ae0a,0x00575e08,0x0054bc97,0x004b665e,0x0049389c,0x004a2830,0x0056a42b,0x00594d4a,0x005acb77,0x005c4a2e,0x00564c4b,0x0051a593,0x004cb806,0x004c2f3f,0x0045884f,0x0037778a,0x0036f120,0x0036b44c,0x00336ba3, -0x004478a0,0x00499ccb,0x00440963,0x004eccb6,0x0051a441,0x004c0846,0x00538d3e,0x006267b7,0x005c9116,0x007bdf3e,0x007a5aa6,0x009292d9,0x004b38dc,0x00385a5e,0x004955a6,0x005a4d19,0x006bad3c,0x006725f5,0x006cc97d,0x005f878b,0x0043c5cf,0x00491136,0x004e6a2a,0x006977a5,0x00754fcb, -0x008ad26d,0x008d40df,0x00737e10,0x0065b11c,0x005311da,0x004fe402,0x003ca827,0x0014c18f,0x000d3f09,0x000d3918,0x000c0ce3,0x0041032f,0x00500023,0x003e796a,0x00520736,0x00501d07,0x00469b50,0x00587791,0x007b52f2,0x005e8351,0x0080bed1,0x00771ca3,0x00c293c1,0x003ad4c4,0x002c5ce3, -0x005637d3,0x0067226c,0x0074c0c4,0x0076c956,0x00727aaa,0x00631f60,0x002bf197,0x004577b6,0x00516c89,0x0077ec91,0x00946824,0x00ae61a7,0x00c627d4,0x008c5459,0x0076aea5,0x0052ea63,0x0053168d,0x002504f7,0xffda75d6,0xffd5dae1,0xffdd486d,0xffdd33ed,0x002c2dfd,0x004cbe7b,0x002c374e, -0x0059b098,0x006b7118,0x005c24e8,0x00897287,0x0089b06c,0x0083086a,0x00d1020d,0x01058ce0,0x014d9ab8,0x0054c5c2,0xffec2072,0x004dcbae,0x006107fd,0x0090ccc8,0x00ceddc1,0x006c2043,0x0033e79a,0x0029a533,0x006dd89d,0x007517a3,0x009d4a5b,0x00df3a1f,0x01170664,0x0135118e,0x00ccd0f3, -0x0094e7bf,0x0056f638,0x00465567,0x0003559b,0xff7cdabe,0xff5a3555,0xff766729,0xff94f1d2,0x0030b788,0x004cdb48,0x0021802b,0x005079c1,0x00348482,0x001ffa45,0x0060c98b,0x00c52b81,0x00455541,0xffc8fb7f,0xff4256b5,0xfee7ca12,0x001a9ec1,0x00dd1af1,0x0126aae8,0x00eb639e,0x004c5c40, -0xffcd8291,0x001ed4ca,0x004956b3,0x0067f3c3,0x00b79fa9,0x00a81abc,0x009955d8,0x00749408,0x00737b38,0x0072879e,0x002bfbf7,0x003c3bad,0x005b4968,0x00418fc9,0x004c2496,0x004c0f31,0x01380cc8,0x010c720c,0xff8964a1,0x00240018,0x00384108,0x002f1457,0x005722dc,0x01058de8,0x025df890, -0x01675a74,0xff046938,0x00005f65,0x00cf0907,0x00b04cba,0x005c5cca,0x0014b384,0xffc4c29b,0xffae8f09,0x001212f9,0x0057e2bc,0x006ec4ad,0x00311118,0x002456c4,0x004cb972,0x00446a08,0x007daa89,0x00a103cb,0x00a26983,0x00a35dd7,0x006b0e15,0x009166d6,0x0083533b,0x0014d494,0x001abeec, -0x00232332,0x003c298c,0x00ac495c,0x00a268ae,0xffd32a79,0x004b3187,0x00388658,0xffb613e7,0xff8a88ab,0xff293f02,0xfec2bbf2,0xfed50b0e,0xff99a4c4,0xffc49730,0xffcd28af,0xffbe34fd,0xffe82e81,0xff836e36,0xff503bbf,0x00238a83,0xffdd7258,0xffd21b3b,0x000693a9,0x00281b74,0x003e1774, -0x00233bef,0x003cf579,0x00796e59,0x004b85d3,0x002c383a,0x00380d9a,0x0042831a,0x00b6e067,0x00c3660c,0x004c5eb4,0x007af656,0x0050241a,0xffee0f2d,0x00014ca4,0x0029faa3,0x0051cf7c,0x00bf0c92,0x01038f24,0x0103a394,0x00785357,0x001e4c43,0xffbdc326,0xffb133e2,0x000d69b7,0xff81c8c1, -0xffd09ab1,0xffbb97f4,0xff874b0d,0xff7f19d4,0xffbe58f2,0x00648a3c,0x001d468f,0x0043eceb,0x0046dffe,0x001afa12,0x001f492f,0x00547c99,0x0060a8fe,0x00866dbe,0x00903d99,0x00a1b9f5,0x009a20de,0x00568fe8,0x008ac768,0x00980b7e,0x007b3a4b,0x009440d8,0x007dd8a7,0xfffefa00,0x0031e4c7, -0x0010313b,0xff926b5e,0xff6579c7,0xff4fcc08,0xff2be812,0xffe264cd,0x00311747,0xfffc2e9c,0x003e6dd5,0xff40196e,0xfe91d176,0xfe1fc384,0xfe462d52,0xfe955aa8,0xfe9468fa,0xfec5964e,0xff364d4e,0xff3628f1,0xff55c2b3,0xff8bd8b5,0xffe01778,0x001f5be4,0x0056c0ab,0x003f5d76,0x0042ef0e, -0x0066472d,0x00572c92,0x005f0473,0x003e933a,0x00820f0c,0x008525da,0x004c5b68,0x00028dad,0xffe6bcac,0xffe8bfa4,0xffea967c,0xffef066f,0xffd640a7,0x003a5d4d,0xfff6f105,0xff1b2537,0xfed5c680,0xfeb883be,0xfeb2c040,0xff21251f,0xfe1df144,0xfe8882e8,0xff249501,0xff8a6f4d,0xffe2277f, -0x006ce77c,0x00876bae,0x0061629d,0x003fb515,0x003879a0,0x0038ee2e,0x00834736,0x00887669,0x007a8e87,0x005fb379,0x00501325,0x00594d43,0x000cc9ad,0xfff491a0,0x000abfcb,0x004c8417,0x0059dd55,0x004aacb5,0x00044a7f,0xffdbb252,0xffa92552,0xffa0cf11,0xff8bf7a7,0xff7a499a,0xff4ce5b2, -0xffa17c0f,0x00703bf4,0x0022241a,0xffbad945,0xff26ea22,0xfe72378c,0xffab6ca4,0x001fbe8d,0x007f70b3,0x009c5aee,0x00f9fce2,0x00eb3fa4,0x00dbff0a,0x00e5b8b8,0x00f3b252,0x00ec1c5d,0x01037fcc,0x00c58d2b,0x00b6f9d5,0x00871849,0x0068ae33,0x0037af89,0x0017dd69,0xfffdd72d,0xffe044b4, -0xffd44c58,0xffa2ea00,0xff6b2637,0xff3d5b8c,0xff226238,0xff0b160a,0xfee97198,0xfefc0e4c,0xff02fda2,0xff18673b,0xfee7ed0a,0xfea1467a,0xfe4ec55e,0xfe68a5ee,0xfe983d2c,0xfec3e5b0,0xff4e466c,0xffc20ff2,0xffe433a2,0x0014ecad,0xfff5c37c,0x001091d0,0x0012f622,0x001ddaf0,0x002f8aba, -0x001a72ab,0x00103f5a,0x000d759d,0xfffb2a54,0xfff3bf85,0xffebee62,0xffe3a450,0xffd12480,0xffbc2619,0xffa9c4cd,0xffaba9c3,0xff6cf0c0,0xff5485dc,0xff462d32,0xff30acde,0xff17ec19,0xfefda210,0xfedf29ae,0xfee71752,0xfee8ef76,0xfeed10d2,0xfef6c248,0xff106ec6,0xff1c090a,0xff531153, -0xff74a253,0xff8e2199,0xffa8216f,0xff868496,0xff8eb8ed,0xff9aff3c,0xffac936e,0xffc12020,0xffa289d3,0xffb6f091,0xffd13e7e,0xffc9b81c,0xffc6d92b,0xffbea220,0xffc0793b,0xffbc878b,0xffb9e87b,0xffa11346,0xff8a9466,0xffa9d6f8,0xff8a29f0,0xff7a0218,0xff5cacd4,0xff5b54ab,0xff4e7e4b, -0xff443a19,0xff3a5f7c,0xff322280,0xff24ef5d,0xff2d454c,0xff312392,0xff354ec0,0xff394afa,0xff3b0831,0xff3a5dc4,0xff473784,0xff5511cd,0xff68be0f,0xff7625b6,0xff47f9a2,0x004d84fd,0x004f0fee,0x004598d7,0x00498ee2,0x004b0d0f,0x005840a1,0x004058ab,0x004277f5,0x00467cae,0x004f31c9, -0x005175ad,0x004f6461,0x00530f2f,0x0050a35f,0x0043ffea,0x0041d9dd,0x0042d16d,0x0051f296,0x004f7c5c,0x004f7b91,0x004e7be5,0x004cb4b9,0x0049b4b9,0x00460870,0x00476c7c,0x00437d84,0x003a8162,0x00395a1c,0x0038f32c,0x0038d3e4,0x003f2359,0x00424812,0x00414635,0x0047cd3d,0x0049c8ca, -0x0043b02b,0x004e94e0,0x005bb4d7,0x0052eec9,0x006d3119,0x0065e647,0x006f1db6,0x003fbc40,0x00337964,0x00380736,0x00546806,0x0066beb1,0x005d4ed1,0x006f3626,0x00612ffb,0x003ca50e,0x00400871,0x0044e7b4,0x006619e0,0x0066437b,0x00781a61,0x00703ceb,0x00602340,0x0057668a,0x00498279, -0x004ea185,0x0044b93d,0x0028e7ec,0x0023b6e3,0x0022e4c5,0x002985ec,0x004078bc,0x0044e804,0x003e8849,0x00446a4c,0x0043b9d0,0x0039d59e,0x00531404,0x007cf377,0x0051676f,0x00693629,0x005b029a,0x00893bc5,0x00315ce0,0x0029b11e,0x003b6db9,0x00637933,0x0076b560,0x006704ec,0x007e8de9, -0x006f82bf,0x0022e571,0x003aed9e,0x00432f93,0x00799ee2,0x007b6b50,0x008f0ed0,0x0095a96a,0x006dffd5,0x00644924,0x00459b82,0x005271c9,0x0035dbb5,0x0004bf28,0x0003c200,0x00087ed5,0x00159c56,0x002b553b,0x003cdb76,0x00348b0a,0x004b61b8,0x0057df46,0x0041ff39,0x00813f16,0x007d7ad5, -0x006b8a5e,0x00afdc6a,0x00d27036,0x00f13544,0x003f8ae1,0xfff3af6a,0x0029e02e,0x005c5e04,0x0093cb46,0x00b18a62,0x00806f2e,0x00463c38,0x000caa75,0x00594f38,0x0061177a,0x009dacb6,0x00bd970e,0x00ed8d93,0x00effe7d,0x009e0a4b,0x00756f55,0x003d58f9,0x004a7909,0x002b3d54,0xffc80117, -0xffb959be,0xffcde44f,0x00047b6b,0x004a5387,0x003d588c,0x002c0991,0x002dd8e5,0x001d1e7f,0x0000eb9c,0x005c3ab8,0x00ea87da,0x005f692b,0xffdefe08,0xff58d0ba,0xff09a162,0xfffd2db7,0x00a075e8,0x00fb961e,0x0111bb16,0x007e7025,0xffd89190,0x00121708,0x003d6ccc,0x00844e1b,0x00b398ae, -0x009985a8,0x0085c159,0x00521955,0x00414400,0x002da8f2,0x00246f3b,0x004e6347,0x0072cfad,0x00624ab9,0x006084c7,0x0057e06c,0x01300e9c,0x00fc3fff,0xffa4b9fc,0xffcf6bde,0xffef4ba3,0x0064a103,0x007744d7,0x00f029bf,0x01f4fd90,0x015a562c,0xff0628d1,0xfee97c3a,0x0108e1a2,0x01400b1a, -0x001bd8f4,0x004a732e,0x0004f7bc,0xffa70831,0x000989cb,0x00572e55,0x008fcc77,0x003f16cb,0x0025301e,0x004f5615,0x005ae844,0x00965384,0x00937911,0x0090374a,0x008c0ea2,0x004980ec,0x009dbdd1,0x008bbe9b,0x001527d6,0x00216ddd,0x0042bcf6,0x00768135,0x009af6f5,0x0079a651,0xffa90ac9, -0x006f2f09,0x001db5d2,0xfead728a,0xff31d9e9,0xff3a127d,0xfeeea9aa,0xff1a2d2e,0xffa6168c,0xffbb5388,0xffc3709b,0xffcde7fb,0x0039f725,0xffdd41f6,0xff7fc97e,0x00345bf7,0xfffeb7d9,0xffe31252,0x00139eda,0x00228bf9,0x003725f2,0x0033609d,0x002a3037,0x0059bde6,0x00267cec,0x00115bb2, -0x001f1132,0x0021487c,0x009aa372,0x00a5435b,0x003ec965,0x00620d2e,0x00333aec,0xffed7e65,0x0020c2d8,0x0060383a,0x004f6109,0x00be1216,0x00fc0a35,0x00ec5c8e,0x006be67b,0x00053421,0xfff7a8af,0xffbc0c17,0x00082fe7,0xff9ce3e1,0x0005332b,0x001de360,0xffc00fa8,0xffbd7bc5,0xffd52a1f, -0x004318c9,0x0015a491,0x0036b391,0x003edefe,0x00194e91,0x0020d6c9,0x004c4a1a,0x005c19a7,0x0086b1d7,0x007d24a7,0x00837f13,0x00891967,0x004ac949,0x007191b4,0x0084b5b7,0x007d93ab,0x006a9472,0x00551f2b,0x001d1ba4,0x002e8e6b,0xffe7a9b4,0xff4689bc,0xff5f2eb7,0xff65a43b,0xff68f5bd, -0x001bc008,0x006330d4,0x0044e24b,0x00325daf,0xffb57210,0xff76c2a0,0xfec00ddc,0xfe74ab5e,0xfe65f8ec,0xfebfd11c,0xff08706b,0xff4733bc,0xff5e0ee4,0xff7423e7,0xff8bcfaa,0xffc197a6,0x0002dfb9,0x0060ab06,0x003fa079,0x0044c955,0x00573911,0x0064475f,0x0065dba2,0x001f0e63,0x006ca8f5, -0x00826dac,0x00623cf5,0x0042df4f,0x00261381,0x0015cd6e,0x00168017,0xfffef92c,0xffcd78a1,0xfffd9a19,0xffdbff1f,0xff5c3c19,0xff1aeca6,0xff094028,0xff1ecc63,0xff889305,0xfe27332c,0xfe297350,0xfe6df61e,0xfeeabcb0,0xff6f8d60,0x0001b58b,0x0014086d,0xffc4e8a1,0xffbe609f,0xffce7de7, -0xfff2a586,0x005c1d31,0x007ce1b2,0x006d87d8,0x00474776,0x00352549,0x0034e3b0,0x00177af4,0x00172c06,0x00268206,0x00702b1a,0x00768dad,0x00458729,0x002d7e75,0xfffebfd1,0xffe22da1,0xffbb0e36,0xffa55be5,0xffb98287,0xff5ce019,0xff7b73f5,0x000873a9,0x00394a85,0x0004d1d9,0xff59271e, -0xfea3ac9e,0xff5a1ced,0xff8c02db,0xffe0fab1,0xfffd20e0,0x00460060,0x0044ce21,0x004b5bd2,0x00667f4f,0x00912322,0x009f8df4,0x00cfd777,0x008d03b1,0x0080aadf,0x0059a776,0x0047c48a,0x00264b1b,0x00114c5a,0xfffdbd8c,0xffecab51,0xffd454a7,0xffb85854,0xffa421a7,0xff94d6aa,0xff7d413e, -0xff64c833,0xff46571d,0xff513b07,0xff52c084,0xff608a1d,0xff509be2,0xff3b2697,0xff1177a5,0xfef4ed50,0xfeec4006,0xfeef047a,0xff30354f,0xffab9558,0xffcaee5f,0xfff1e66f,0xffe3001e,0xfffc3ea7,0x000333ff,0x000fc672,0x001d59f5,0x000ba57f,0xfffd8ef0,0xfffb834c,0xffee8967,0xffeb183d, -0xffe5cc21,0xffd05ccc,0xffb901ef,0xff9e2681,0xff867387,0xff6c99c3,0xff511dab,0xff3efc60,0xff295c69,0xff140ad6,0xfefbe06e,0xfee806ea,0xfecdddc2,0xfedde58e,0xfee4caca,0xfee6fc28,0xfeee4c5e,0xfef8ad78,0xff04423f,0xff33d8c9,0xff59eb93,0xff75d2f1,0xff9092df,0xff705cfd,0xff7a592f, -0xff7f4759,0xff8b33cd,0xff96a169,0xff8ade2a,0xff974b89,0xffa8373a,0xffa120fd,0xffa000b9,0xff97ea79,0xff99e531,0xff95c29c,0xff94ec5b,0xff813c9b,0xff75cc9c,0xff7af34b,0xff6a09db,0xff6026e9,0xff5991ca,0xff50e9b9,0xff46d5f4,0xff3db429,0xff357576,0xff2d5c54,0xff20d1ef,0xff25e6f6, -0xff28123b,0xff2cfc2a,0xff305bf0,0xff33697f,0xff30f688,0xff3d299d,0xff4782f7,0xff567312,0xff627e1b,0xff32d52a,0x0045ca55,0x00483597,0x003bbf10,0x0041962d,0x00436bdf,0x004b1f45,0x003a1dbe,0x003eb5f0,0x004021a8,0x004b2b04,0x004ea15a,0x004b221a,0x0052b84d,0x0050a698,0x0040d80e, -0x003e9be2,0x003cfea2,0x004f5b97,0x004896d2,0x0045c08b,0x003ea35c,0x0040fae7,0x003fbb44,0x003f5033,0x00416a73,0x00404bd7,0x003beaed,0x003a297c,0x0039af56,0x003d605b,0x00396546,0x003a5a16,0x003d2893,0x003eb574,0x003f17cb,0x0038efd9,0x004662ec,0x004aa924,0x003ecce0,0x005baf5c, -0x004ed15a,0x0053286a,0x00379432,0x002fb685,0x002bfdac,0x004b5216,0x005d5397,0x0055bcdd,0x00703b95,0x00626183,0x00385eba,0x0039ef85,0x003d87d8,0x0060fed8,0x0057ccb5,0x0064c470,0x00505f78,0x004862f7,0x00465d69,0x0044136d,0x004bc873,0x004887cd,0x00387e3e,0x0035616e,0x00357c01, -0x0045ae54,0x004085d0,0x003b80f6,0x003d668c,0x00359e17,0x00337c69,0x00287a33,0x0045068e,0x00736112,0x0040f636,0x004f1a17,0x003d77a8,0x00573a44,0x0025efaf,0x0026ae44,0x002bfb50,0x005ac61f,0x00711608,0x005e0270,0x0089a90d,0x007e2547,0x00223a42,0x0035f386,0x0039c0aa,0x0078d13d, -0x0064467a,0x006cea43,0x005ddff6,0x004884d2,0x004b0780,0x0040abe9,0x00517540,0x00475654,0x002cfadd,0x002c38a3,0x002b6e0e,0x004a8765,0x002b31e9,0x002f0a3c,0x003cda6b,0x0038eb21,0x0039b2a9,0x0022101c,0x006d779b,0x0053ea3b,0x0044555a,0x007c08f1,0x0093b00c,0x00a0bc07,0x002ce3b5, -0xfffbf1e9,0x000c9c3b,0x004e8ef3,0x0088553e,0x00917b34,0x00947080,0x005ada55,0xfff64f08,0x0044385d,0x0053780c,0x00a2f897,0x009ae7e7,0x00b533d8,0x0092f560,0x005be5d3,0x004ce773,0x003ae7b9,0x0053de57,0x004cbe04,0x000dca80,0x000d9107,0x001f45d4,0x006f3540,0x006075db,0x00341cc7, -0x00371659,0x000d342c,0xfff9ccb6,0xffdae1f7,0x003f9f92,0x0104e002,0x006519f5,0xffcab55c,0xff439fb5,0xff14d5a6,0xffdfe7fa,0x006c6b67,0x00c1b751,0x01239f80,0x00aeb0ca,0xfff25769,0x0006892c,0x0032e0f4,0x00a1f985,0x00a5d835,0x0086cd6c,0x00785fb7,0x00356043,0x001b8906,0x00098e99, -0x002adb22,0x005a37c9,0x00798931,0x0065f40c,0x0064f619,0x006cb460,0x00ee188f,0x00988900,0xff8331b8,0xff87b739,0xffc1d44e,0x0087f29a,0x0086c257,0x00d0de95,0x018015dc,0x0140c8bc,0xff0b1dc1,0xfe3cbda2,0x0134dc4a,0x01a913cc,0x0000e5d1,0x006c2095,0x002ada3c,0xffb280bb,0x000a9a6b, -0x00557f60,0x00a6ddd1,0x00507241,0x002e5c9f,0x004fe3ef,0x00731d41,0x00ae9a94,0x007b684a,0x00787f3b,0x00715f67,0x003df335,0x009c6f24,0x008dcb7b,0x003763db,0x0050705e,0x006b3983,0x00910463,0x00821b54,0x0054d1b5,0xffa0ba39,0x009ede81,0x0029150e,0xfe531efa,0xff17afd7,0xff5b2495, -0xff30cd5e,0xff49ad6b,0xffcddf21,0xff9a63c2,0xff9dbe81,0xffb5e9c3,0x004709f4,0x0033ff48,0xffe4c743,0x0045b186,0x001f71c0,0xfff812a0,0x002050ef,0x001f0379,0x0036e3d8,0x003b6230,0x001783f6,0x00318049,0xfff9f73e,0xffefd7ac,0x00039dc0,0xfffe6811,0x005baa4c,0x006bdafa,0x0031607e, -0x002846fc,0xfffd3e9e,0xfff7edc5,0x00379ff3,0x00792ff0,0x0045d819,0x00b2e0b8,0x00d6aede,0x00c446c4,0x005053eb,0x00021c66,0x005bf08f,0xfffc7e30,0x001844ae,0x0009bb01,0x003df40e,0x0055f745,0xffeca4ef,0xfff05ff1,0xffe57a5d,0x00073fe6,0x0002a708,0x001e2cbf,0x0032bea6,0x00145a7b, -0x001e3728,0x003c070b,0x005466bd,0x0079864b,0x0052b403,0x00543970,0x005e8357,0x0036e251,0x00539d85,0x00633b8c,0x0060d317,0x004d4806,0x003ff801,0x002f72c3,0x002c28dd,0xffd19ac1,0xff151df5,0xff63739e,0xff7549e8,0xffa2f31a,0x001c3371,0x00658b94,0x008f856f,0x0025f53f,0xffd25099, -0xffa549a8,0xff157d72,0xfea0cd9a,0xfe4fa9fc,0xfed12796,0xff24624d,0xff595a41,0xff89d3bf,0xff9cf16f,0xffa1d1bd,0xffb54ef6,0xfff0e011,0x005d21bb,0x0039889f,0x003bbdf2,0x0031d1e7,0x00622915,0x0061cf94,0x001caea8,0x004d2a3f,0x006d7f2c,0x008daf3f,0x0077434e,0x00506387,0x001a0201, -0x001d36e3,0xffef8fb2,0xff9fcabc,0xffb1a4cf,0xffb6ad4c,0xffaeeda2,0xff70b57d,0xff5c0f48,0xff8a1f28,0xffc64d37,0xfe79f360,0xfe463110,0xfe4d816a,0xfebd6d40,0xff53c01a,0xffade3e3,0xffb39648,0xff6ab090,0xff6cc790,0xff89841c,0xffc5402e,0x001e730a,0x0048be2b,0x00552925,0x002e4d48, -0x00232733,0x00203d43,0x00302f1d,0x003b94a2,0x0039dae9,0x006d6744,0x006c5bbb,0x004865d7,0x003344ef,0x000df5de,0xfff595d9,0xffcd57fe,0xffc54851,0xffe52640,0xffab2ceb,0xff77ff5a,0xff4d2047,0xffbaaa4c,0xffc3776b,0xff51fe56,0xfeda05c4,0xff233ace,0xff23ea3d,0xff6c8bf6,0xff7ff302, -0xffb49508,0xffc1447a,0xffda06fc,0xfffbdaaf,0x0036235e,0x00533de6,0x008d678e,0x005bb333,0x00570ac2,0x004469f5,0x002db4e6,0x0012c3a2,0xfff95dc5,0xffe58626,0xffd57e7e,0xffbf21f7,0xffd14df9,0xffe33796,0xfff9481a,0xffe30bcb,0xffc94624,0xffaba978,0xffaadcf4,0xffa23a2e,0xff9d3038, -0xffa79262,0xffc1342c,0xffc8cac0,0xff8bd799,0xff515216,0xff2dab3a,0xff2c2e11,0xff9ce55c,0xffb77c30,0xffdafed5,0xffd9295d,0xfff24302,0xfffb3f4c,0x00074bbf,0x0017a591,0x0005d586,0xfff97a59,0xfff64ead,0xfff09228,0xfff07b80,0xffeed654,0xffd4a587,0xffc4108d,0xffb1990c,0xffa0cabe, -0xff7bc02a,0xff845b7b,0xff72e4aa,0xff581b3f,0xff44e9b1,0xff2e1e16,0xff203884,0xff0da0ff,0xff176495,0xff18f59e,0xff144587,0xff0fb467,0xff01e65d,0xfeffb1ea,0xff20580f,0xff47fbde,0xff6487ae,0xff815896,0xff75e24a,0xff7fba07,0xff79443f,0xff7ddc34,0xff7f3d09,0xff89e635,0xff8b068d, -0xff93c5b4,0xff8e4d56,0xff8d6f5d,0xff85f95a,0xff858805,0xff7fbbf4,0xff7d928b,0xff7c38a7,0xff80f089,0xff65f8da,0xff69e230,0xff6a96fc,0xff7913af,0xff6b4962,0xff65fb44,0xff5e9fb7,0xff5a1cb5,0xff543580,0xff4b4c0c,0xff4ade51,0xff497d4c,0xff4ae42c,0xff4b3804,0xff4d2c6f,0xff465536, -0xff538e78,0xff5a0040,0xff635bf7,0xff6bb0f9,0xff4accb6,0x003c1ec0,0x003d2408,0x00321995,0x0037d39e,0x003903ac,0x003decd6,0x0033ac0b,0x0038391f,0x0038623a,0x0042899c,0x0046b56c,0x0043f95f,0x004e218b,0x004c5657,0x003b38a6,0x00388308,0x0034c085,0x0047aec0,0x003dca0b,0x003a5644, -0x0031a90b,0x003513d1,0x0035718d,0x00387b25,0x0039e5b5,0x003a2108,0x003876f3,0x00352bff,0x00346156,0x003b11e9,0x003288e5,0x003251ac,0x00371793,0x0033abb1,0x0032618a,0x002bcc1e,0x003a2eee,0x0037c2b9,0x00284775,0x003e4a2a,0x0037cd4e,0x003f002e,0x00322b79,0x002df019,0x00260c90, -0x00423151,0x00518cff,0x004d623a,0x006c28ab,0x006058d7,0x0035ddec,0x00346489,0x0035e947,0x0055c65c,0x00489857,0x004d3cc1,0x003620a9,0x003331ab,0x00358f0d,0x003dfac3,0x00437a87,0x004296fa,0x003acde7,0x003553fb,0x00376a82,0x004ff727,0x003c2f55,0x003378c3,0x0039325d,0x0024cca1, -0x001f33e8,0x00143c93,0x0033b38b,0x005c05d6,0x00300e04,0x0035ec34,0x00276ac8,0x0037a8f9,0x00228936,0x0029a37e,0x0027dcf7,0x00522871,0x00699667,0x0059cbec,0x00906dac,0x0087a54a,0x0029b94f,0x0034b956,0x0032881b,0x006d6e8c,0x004f148b,0x004c12d1,0x0032e655,0x002b45a1,0x0034e2ab, -0x0041212d,0x004d968b,0x004dd196,0x003fb93a,0x00376f1c,0x00319ec4,0x00637de3,0x002c03ab,0x0029572a,0x0040ecce,0x0022b8b0,0x00194448,0xfffe6ec6,0x004b1df8,0x002809ce,0x0014717e,0x0035ba69,0x00560227,0x006d9469,0x0027a4f0,0x000c872a,0x0001e53a,0x00437aea,0x0075f867,0x007138b7, -0x00a3246b,0x006e5508,0xfff1e3cb,0x00350ccc,0x004eac2b,0x00aa4f07,0x007ac050,0x0075e6de,0x00405321,0x0021e309,0x00274815,0x003bb5d9,0x00517e69,0x004e96e6,0x0028de74,0x0026e1ae,0x00405d7b,0x00a9fc65,0x00672b0a,0x00329b59,0x003c38c3,0xffe848d5,0xffcb6d89,0xffafc34d,0x0018c7fd, -0x01032d20,0x00891ff4,0xffdd2e85,0xff49e057,0xff064aa1,0xffce2685,0x004befbb,0x0081a449,0x0121c896,0x00d668e7,0x00198939,0x00020721,0x002d7e70,0x00b63fa3,0x008f86f1,0x006d72b2,0x00676e3a,0x0023a4e8,0x000964ed,0x00093f05,0x0040b9e5,0x0061816d,0x007cdda6,0x006c8772,0x007dee9a, -0x00af00e9,0x00a85d46,0x0028d236,0xff5ab349,0xff658fdb,0xffbb438d,0x009b9d31,0x00aad325,0x00d2495b,0x011c20de,0x0103c276,0xff2cb92c,0xfddf4a60,0x011c2130,0x01c312c4,0xfff3c631,0x0084b8e8,0x004765a0,0xffdb9227,0x000fc5c4,0x004c939d,0x00aecfd1,0x0067af05,0x00438206,0x005187a4, -0x0086c2b1,0x00b753f4,0x005bf21f,0x0060565f,0x0060bf4e,0x0043f3be,0x008bd902,0x008aead5,0x006cd712,0x006b890d,0x0078fb9e,0x0089ad8e,0x00742e55,0x005042f6,0xffbd930e,0x00c0d627,0x0054c9a4,0xfec208ca,0xff3c1a9c,0xff702e08,0xff770959,0xff8e81e6,0x001cce2d,0xff763838,0xff72f7f3, -0xff8e5ec0,0x00246acc,0x005a917c,0x002c17bd,0x00399e72,0x0035f2b1,0x0014f577,0x002a3cd1,0x00209065,0x00378e6e,0x004085c2,0x0009dcea,0x000700e1,0xffd07619,0xffd6b06e,0xffec8899,0xffe3bb81,0x0022ebc7,0x0039fac1,0x00377cbe,0xfffcb32e,0xffd61282,0xffd3d89a,0x00420777,0x00918ad9, -0x00466a91,0x00c58fa2,0x00be3ecd,0x007e0aea,0x003c2ab9,0x001b0d4c,0x00ab3bd0,0x00541c3d,0x003b7f76,0x00725b2b,0x0075c5d9,0x006c7e8b,0x0004a4f5,0x000b72e1,0xffee1720,0xffd8442f,0xfff3f6a1,0x000b0bcb,0x002670e7,0x00165896,0x001e4566,0x002def35,0x004a87c3,0x00641499,0x002d6cc7, -0x002d771d,0x00337c62,0x002cf037,0x00486637,0x005566cf,0x006151df,0x003dfdd7,0x0024799f,0x0026923f,0x00147a72,0xffb9fdb2,0xff13ead3,0xff7dc2f1,0xff96d9fe,0xffc45b7e,0x000d53a8,0x0059921d,0x00ae7269,0x0036c80f,0xffcaefc4,0xff7dedd2,0xff2ff811,0xfec3513a,0xfe45691c,0xfebba07c, -0xff15a648,0xff61b3e3,0xffa7654f,0xffc22a1d,0xffc305df,0xffba0b15,0xffe97ff1,0x00464940,0x002fabb8,0x002f5bdd,0x000c0bf6,0x00490b07,0x0050c9e7,0x00274839,0x0022c1d4,0x003c428d,0x00847236,0x006666f3,0x0048843e,0x000ece52,0xfff25efb,0xffd2ae12,0xffaaa25b,0xff878cc2,0xff97dd40, -0xffea8763,0xffb09577,0xff9bfa35,0xffb81fbc,0xffe0229a,0xfedfde7a,0xfea51906,0xfe8f8466,0xfee58186,0xff7777d3,0xff8814f8,0xff7989a1,0xff411292,0xff43aa40,0xff61645c,0xffa136eb,0xffd65f0c,0x0005170a,0x003d3713,0x001d203b,0x001fcac1,0x001cdbfc,0x00471bc8,0x0050c7d9,0x00482cee, -0x00580875,0x00598ea1,0x006982ea,0x0039367d,0x00210b71,0xfff5d1c7,0xffda3feb,0xffccec68,0xffccfd0d,0xffca42a6,0xff7d3c54,0xfef67aba,0xff1c1db9,0xff3db8eb,0xff4492a9,0xff0adc4a,0xfeeece7e,0xfecb9b98,0xff0a59f9,0xff1837eb,0xff3ede14,0xff5fabec,0xff8de0bf,0xffbb0134,0xfff47a26, -0x0016bc43,0x004e988e,0x00392339,0x004051dc,0x0043f423,0x00234b7c,0x000b75fb,0xffed1bab,0xffe262d4,0xffd52299,0xffd91ce0,0x000bf35d,0x002bc01b,0x00584945,0x003a3c80,0x00206b3f,0x00038d38,0xfff812c9,0xffe9673a,0xffd69828,0xffe613cc,0x0006d7f3,0x00249381,0xffe0d110,0xff8d905c, -0xff4b76f5,0xff19ec60,0xff93d14e,0xffa3bb01,0xffc525ef,0xffcca021,0xffe3e227,0xffeac94e,0xfff454cf,0x00069884,0xfffb9a4b,0xfff78c15,0xfff7b70d,0xfffdc02d,0x0004feda,0x000d2de7,0xfff11291,0xffe49e94,0xffdb26ef,0xffce3424,0xffaad406,0xffb65bac,0xffa7d75a,0xff9437cd,0xff88ac02, -0xff7afc27,0xff74e3f2,0xff6d8ed0,0xff6ba7d3,0xff64a9ac,0xff59c8f6,0xff4b53d9,0xff31ce91,0xff22941c,0xff3136ff,0xff505bbd,0xff66e249,0xff7fb3b1,0xff98f7dc,0xff9f5608,0xff915d19,0xff8e04b3,0xff839f7b,0xffa4fc98,0xff9b53a0,0xff97f30e,0xff978b77,0xff98d17b,0xff9508f1,0xff940bbe, -0xff8ec00e,0xff8d9850,0xff9e7ff1,0xffaea04d,0xff7966bf,0xff8d8850,0xff964588,0xffaa6fd3,0xffa09ac7,0xffa00e26,0xff9c0654,0xff9c5863,0xff9ab36f,0xff9812a6,0xff92b2c8,0xff8ead37,0xff8c4119,0xff89cd3e,0xff8960b8,0xff812bd1,0xff8b8bd1,0xff8d6336,0xff90dc6d,0xff939101,0xff93ff31, -0x00310c06,0x00308341,0x002b8874,0x002e5c50,0x002f1422,0x0034280d,0x002ce442,0x0031aaaf,0x0031999c,0x0039f59b,0x003e0fa9,0x003cac5d,0x0047558d,0x0045dc0e,0x0036189e,0x00312e18,0x002a57be,0x003c7c18,0x00318a20,0x002ef5c9,0x0027d503,0x002aa826,0x002ba153,0x002ffc10,0x002fa070, -0x002f2238,0x002c93ec,0x0028a16e,0x0028d388,0x00359646,0x0029de3e,0x00289dc0,0x002d0441,0x0026dcd0,0x0024b861,0x001df43d,0x002c3554,0x00294c8d,0x001f4666,0x0026dadd,0x0028a1a0,0x0031f684,0x002f4511,0x002cbe9d,0x00231ce3,0x003a2482,0x00465ae0,0x004538c9,0x00643c99,0x005b953c, -0x003515bc,0x002f6ef5,0x002cd7e7,0x00420118,0x00384205,0x00387287,0x0025e3e9,0x00261e92,0x0029c8d2,0x00352879,0x003544f0,0x002fd533,0x00276b58,0x001d9fec,0x00258b7c,0x004f28fb,0x003364c0,0x002ad605,0x002f646e,0x00138c87,0x000b6c18,0x00028bb2,0x00236133,0x004718c1,0x002ef593, -0x0029b2b2,0x0020b77a,0x0029314c,0x00281b37,0x0032f168,0x002a6954,0x004e1125,0x00653bba,0x0059d37f,0x0094494f,0x008bdd64,0x00370ced,0x003611b4,0x002a553d,0x0050c437,0x003b236b,0x00347730,0x001e0ea3,0x001d81af,0x0028becc,0x003dd9c0,0x003ff06f,0x003d5763,0x002b9d70,0x001aa6d2, -0x0019556c,0x006b30f5,0x002765a0,0x0021782f,0x00369f55,0x00085f20,0xfffbbfaa,0xffdd354f,0x0029e08e,0x001a62c1,0x0008f5cd,0x000af59b,0x00310404,0x00507bbc,0x002a5264,0x001e1312,0x0006b81c,0x00403e14,0x0064f6b5,0x005a8457,0x00ac8af9,0x007ed56f,0x000134d3,0x0030544a,0x004aea50, -0x009c55bb,0x005ac610,0x004123e8,0x000f1c2b,0x00059940,0x00154044,0x00365601,0x003d19c0,0x00260cdc,0x0001ce8d,0xfff65f90,0x0026ba92,0x00bd1a10,0x005d97e2,0x002fe2e2,0x00344f08,0xffc497ac,0xffa0e63a,0xff8ec499,0x0000fa3c,0x00c4dab3,0x00a997ac,0x001e9767,0xff8edc22,0xff17faf4, -0xffd926a2,0x00425e6d,0x00504ae9,0x01113762,0x00f49c5f,0x004b18f6,0x0008a7f8,0x002cac48,0x00ba84cf,0x0075ae7e,0x0052974f,0x00535361,0x0022665e,0x00152682,0x0025288f,0x005a3ceb,0x006b59ba,0x00826ccf,0x007e6744,0x00a0da5e,0x00faf373,0x005ac280,0xffc4aa98,0xff50e53a,0xff6446b4, -0xffcb41c5,0x0089cb4b,0x00d03c23,0x00e06ae7,0x00cc1490,0x00a5e778,0xff8c8577,0xfddb38b0,0x009b081c,0x01647fa2,0xffef4470,0x0081b86d,0x005ed3d4,0x00190ecd,0x00143590,0x0035813a,0x00abbc18,0x007dec34,0x005bdab7,0x005162cb,0x0090febb,0x00ae6056,0x0042d02a,0x00474cc4,0x004d01da, -0x0043537e,0x0068bbe6,0x0075143e,0x008ab1e8,0x00841572,0x008a5d1e,0x008845ff,0x0060b78b,0x0042acc2,0xffefe60b,0x00cde922,0x0074d398,0xff379e7f,0xff6b4f48,0xff812485,0xff99c2a1,0xfff119a2,0x006540c8,0xff8109af,0xff7e63bc,0xff9c6048,0x001a0dd4,0x0077314a,0x00535e3f,0x001a9011, -0x003ccab0,0x002b04cb,0x002f2bf1,0x0024282a,0x00384142,0x004b71a3,0x0004be63,0xffe35b6b,0xffbfd51b,0xffcc5a1d,0xffdb918b,0xffd21fb6,0xfff889fa,0x001c374a,0x005ab4d2,0xffdde2c4,0xffb70bee,0xffdadb90,0x003c7433,0x0087d2a4,0x005b543d,0x00b92433,0x008cd273,0x001fa72e,0x0017f4b8, -0x0028a33e,0x00bbc0aa,0x00976bee,0x0061bb9d,0x009be173,0x008734f1,0x005d27d6,0xfff60952,0x0006f515,0xffed4425,0xffc9cba7,0xfff847d5,0x0009aa80,0x001cc8dd,0x001f1936,0x0025046e,0x00250d74,0x003a4ff8,0x00478da5,0x0019421d,0x0010bf34,0x0019017e,0x00327ac9,0x004bd37a,0x004fe924, -0x00622413,0x001b329d,0xfffe0719,0x0017e5fd,0xffefaf3c,0xffb1d962,0xff56e853,0xffb02783,0xffcd22a3,0xfff1a6b0,0x0023dcbb,0x004f806f,0x00829a59,0x0056bdb5,0xffa15cef,0xff68cc1d,0xff2b1516,0xfed3b4b8,0xfe57f30a,0xfea15bb6,0xfef95958,0xff5befb2,0xffad98a4,0xffd6b3b6,0xffde1952, -0xffcb6e88,0xffe80f23,0x00203942,0x0020786b,0x0025ad32,0x00016d8e,0x00255a9a,0x002d019b,0x002384b2,0xfffdf5f7,0x000da02a,0x0053ff7d,0x004f59bd,0x003bd260,0xfffcb187,0xffdf57ba,0xffc395ad,0xffb90547,0xff621c84,0xff682761,0xffe9a99c,0xffd4cfe7,0xffd1cfcd,0xffdf14e0,0xffca9189, -0xff2c8f35,0xff063101,0xfef24354,0xff2f01d1,0xffa4f619,0xff7e115f,0xff58e264,0xff2de398,0xff32f969,0xff4b633a,0xff7d33cb,0xff942e54,0xffc80ac1,0x001f97ae,0x00142a7a,0x00238bbb,0x00205605,0x004b63bc,0x0052b06e,0x004de453,0x003cf26c,0x004345c4,0x00737e39,0x003bfbc1,0x0023d175, -0xfff16061,0xffe246e5,0xffc7fde0,0xffa9fd7d,0xffa45b87,0xff6b76a0,0xff12d1e9,0xfecfdcbe,0xfeda34e0,0xff2545fb,0xff27f29a,0xfed84058,0xfea72888,0xfecee67a,0xfedd7f9e,0xfef76bcc,0xff296c98,0xff69dee8,0xffa2d4a1,0xffd10586,0xffecc859,0x001cd8fe,0x001b6646,0x0032cfba,0x0041996a, -0x0021a7b7,0x000d45bb,0xfff466d5,0xfffd5baf,0x000025b4,0x001cde9e,0x0048e714,0x00603b9a,0x008870bc,0x0069e888,0x005353eb,0x003925e8,0x00247e6d,0x000f915f,0xfff2370a,0xfffbe059,0x0009591e,0x001eb731,0xffe03cdf,0xff9276d6,0xff4452ee,0xff067b79,0xff900c3a,0xff921824,0xffac6cfa, -0xffbdf1d4,0xffd07636,0xffd89e63,0xffdf797c,0xffefb37f,0xffedb044,0xfff17621,0xfff8a5bf,0x00056631,0x0011f6be,0x002436f5,0x000ab43e,0xfffe71f0,0xfff5447f,0xffe75bc9,0xffc64dfc,0xffca1cca,0xffc524fd,0xffbe0b3e,0xffbb60ae,0xffb9d466,0xffbd31d2,0xffc25767,0xffb8e037,0xffae7b68, -0xffa291b3,0xff924534,0xff7b4a64,0xff69a4aa,0xff66e387,0xff738786,0xff7dbbee,0xff89a8fa,0xffc2cf47,0xffc32f12,0xffb99cb0,0xffb3cd05,0xffa7d681,0xffcb20c0,0xffc161e3,0xffba1742,0xffbf625f,0xffc4a97f,0xffc58291,0xffc7d97a,0xffc60bbc,0xffc8ac04,0xffd5ed39,0xffe3de35,0xffb246bd, -0xffc55af5,0xffcd5902,0xffdca1dd,0xffd90dd4,0xffdb14b2,0xffdab27d,0xffdd7942,0xffde1004,0xffdfa8bb,0xffd8d905,0xffd4a1b4,0xffd0ce0e,0xffcd13f0,0xffcad6a6,0xffc4bcf1,0xffc8deb0,0xffc6fe14,0xffc55942,0xffc2cf5d,0xffe17050,0x0025069d,0x00240951,0x0026edf7,0x00285545,0x0028b046, -0x002c1d8d,0x0026537d,0x002c13ba,0x002c0fa4,0x00332b77,0x0036b7f5,0x003631dc,0x004067a0,0x003f47f7,0x00324b62,0x002a3249,0x00200fa1,0x002f0494,0x00272763,0x0025de67,0x001eaa76,0x00219ca6,0x002226ef,0x0025a54d,0x00225deb,0x001f7e98,0x0018fca7,0x0016bbb0,0x00190660,0x002bfc5f, -0x001fb05e,0x001ea5b7,0x0022b12b,0x001a8445,0x0017b340,0x0011e847,0x001dfd15,0x001b5aee,0x001fd118,0x001d7a5b,0x00218cb8,0x0029b9ce,0x002fa4af,0x002cd7e3,0x0020d0f3,0x00333638,0x003dcd51,0x003fa96a,0x005bf035,0x0055a50f,0x00361431,0x0029c956,0x0021408c,0x00293538,0x0027e35d, -0x002a46d5,0x001cad6f,0x0020c410,0x0023d82b,0x002ac28b,0x0020d3e9,0x00124fea,0x000353a0,0xfffa1350,0x000a1bfa,0x004418be,0x00281bfd,0x0022e3b2,0x0024458c,0x00043b24,0xfff901c8,0xfff4ef75,0x00119aa9,0x0036bbe1,0x00403478,0x002e7e83,0x0025db52,0x002312fb,0x002e9232,0x003d1d2b, -0x002ef2e7,0x004eb792,0x00638f4c,0x005e80f8,0x00964a57,0x008e49a3,0x0046b159,0x00360806,0x001ee1ca,0x002ae86f,0x002a577f,0x00292b62,0x00187c9d,0x001d683b,0x0025dba8,0x003631d1,0x0027392c,0x0017033a,0xfff505a0,0xffe53bf2,0xffefce8e,0x005ef318,0x001f344b,0x001db08f,0x002dc69e, -0xfff556e2,0xffe3dc14,0xffd113bc,0x000e5193,0x00165851,0x0019b410,0xfffe0209,0x00225bfd,0x00402e10,0x0038803b,0x0031bce1,0x00132cce,0x00445602,0x005ca558,0x005685dd,0x00b6101f,0x0090d4a0,0x001e4ce1,0x00333efb,0x0040f9ed,0x007154bc,0x003b4ce0,0x0022a643,0xffff9018,0x0009272a, -0x0019cb47,0x0031eda8,0x0017c953,0xffdf37a4,0xffad7937,0xffa2069d,0xffef737c,0x00acb5b5,0x004b3eb1,0x003119b8,0x002c14de,0xffaaa3a4,0xff7d88bb,0xff89085b,0xfff05dec,0x007a907c,0x00bafa82,0x006d3f8e,0xffeec7d8,0xff3fe682,0xffdbcc77,0x00383820,0x003dadb0,0x00f163b7,0x010046b2, -0x0081835a,0x0018ddb2,0x002c03a3,0x00ae7cf5,0x005c5daf,0x003f65db,0x00491772,0x0035d764,0x003908a1,0x0047737d,0x006993af,0x007095f9,0x0084f091,0x008a9e94,0x00b397ee,0x011e5f68,0x0012167f,0xff74c7ea,0xff4e6b8a,0xff80e5a4,0xfff1f177,0x0060dc2b,0x00f6d625,0x00f87377,0x0082badb, -0x004e576b,0xffe7eba2,0xfe1d3e54,0xffc9c19d,0x00a02cd7,0x002b6faf,0x006d9841,0x0060fc01,0x00532f9e,0x001f099d,0x0025e805,0x00a1c13d,0x00946b63,0x0075e033,0x004dc6f9,0x008db5f4,0x00973efa,0x0035fecf,0x002f9031,0x0031e59a,0x003dea58,0x0049262f,0x00645ab6,0x00a728ca,0x00a49f01, -0x009b8953,0x008dee69,0x00453723,0x002d41fe,0x00254e3a,0x00bed787,0x007336a7,0xff7b8372,0xffa1a26a,0xffa50daf,0xffa4d31a,0x004681e5,0x009bceaa,0xffce2971,0xffca353d,0xffe009b1,0x002e58c8,0x0089aa94,0x006b72b7,0x00060681,0x003856f8,0x0034af0a,0x003075fe,0x00272ff3,0x00383db7, -0x0056726f,0x00072dd8,0xffd0f259,0xffcbfb74,0xffd07cac,0xffd15d30,0xffceca27,0xffdcf1a0,0x0003c720,0x005ecd16,0xffd0d551,0xffbe6468,0x00004aea,0x003f05a8,0x006fc7ea,0x00752fd7,0x00695878,0x0021d3b3,0xffcb2fca,0xffd88efd,0x00199494,0x00ad058c,0x00b9a7b5,0x006fa230,0x008cc4aa, -0x00649690,0x002e37fb,0xffd29bde,0xffec2f4b,0xffdd6f60,0xffc7fb14,0x000a96ef,0x00182cc1,0x00185c64,0x002f113e,0x0032b28a,0x002191db,0x002573d1,0x00282083,0x00108997,0xfffb509e,0x000adb76,0x0037d629,0x004eed3b,0x004d0d4f,0x00563f44,0x000ca499,0xffed2f60,0xffee8ca6,0xffd0785e, -0xffb4e060,0xffb104cf,0xffe01a2b,0x000749d8,0x004aa710,0x0064ee51,0x00668e9c,0x00679db1,0x006ca21d,0xff89b497,0xff7bc0b1,0xff258740,0xfee0d60e,0xfe9e7eda,0xfea8bec2,0xfef0499c,0xff535463,0xffa41314,0xffd96185,0xffe97a02,0xffddd301,0xffe738eb,0xfff4897a,0x000e5744,0x001c2699, -0x00045f8b,0x000ca279,0x00102bc3,0x002054cb,0xfff77118,0xfffe3856,0x0026ff4e,0x0037ab4a,0x00310fef,0x00031371,0xffea46ca,0xffbe071d,0xffb88fc2,0xff542705,0xff4a9132,0xffb920ca,0xffdbca31,0xfffccfe9,0x00113b7d,0xffbbfdb9,0xff5360be,0xff449a6f,0xff401976,0xff65ae1d,0xffae9d84, -0xff68b74a,0xff38289c,0xff232fe3,0xff2eca16,0xff42dcd5,0xff644043,0xff667ec1,0xff987847,0xfff72a88,0x000f0902,0x0028a961,0x0025ccf6,0x0041baa3,0x00467092,0x0045835c,0x00244393,0x0025b5e3,0x0047e1e3,0x003a0734,0x001ef067,0xffeedba8,0xffdeb02c,0xffc8ae3d,0xffb444d1,0xff919bad, -0xff6a031c,0xff44251c,0xfefb03b6,0xfee59ada,0xff06bbfd,0xff339d6f,0xfef00ad6,0xfecb2c06,0xfeda5562,0xfeeb6644,0xfefc2f6c,0xff2fbfdd,0xff715a33,0xffa8fb5b,0xffc30200,0xffca8886,0xffeb93a2,0xfff4e27b,0x001ea2ac,0x0030ab4c,0x001ce30d,0x0010ae86,0x00090d01,0x001b54c4,0x002c1a0f, -0x0047b77f,0x00599ee7,0x00656f13,0x0077b7ae,0x0068af66,0x006032c7,0x005a3c5b,0x003bc0d5,0x0018f123,0xffed2941,0xffe501a0,0xffdab66b,0xffd76b83,0xffa3b076,0xff6cf98b,0xff2dd32e,0xff08f73a,0xff848dc2,0xff7aee66,0xff94688b,0xffa59e06,0xffb6a8c3,0xffc1a019,0xffc5a140,0xffd414c8, -0xffd5cf25,0xffdf12ab,0xffebc9e7,0xfff72395,0x0002fd8e,0x001901d7,0x000b43f0,0x000601a0,0xfffe3fea,0xfff4970c,0xffda8b41,0xffe917c2,0xffec21b4,0xffeb09f0,0xffed400c,0xfff33b05,0xfffa350e,0x00046dac,0xfff4302c,0xffea1fbe,0xffdf2e06,0xffd0cce9,0xffbe3f5a,0xffae5b2a,0xff9ed6c5, -0xff98740b,0xff93f6e4,0xff8d75e9,0xffd7b270,0xffcfd996,0xffd6c2c4,0xffd506d2,0xffd26a7f,0xffe0462e,0xffe0fdcc,0xffe1ee90,0xffea4185,0xfff1ec49,0xfff542f2,0xfffaecb5,0xfffc30d8,0x000083f3,0xfffe5b2c,0x00037582,0xffeae065,0xfff55600,0xfff8d483,0x00034268,0x00017dfb,0x0004af8b, -0x000658f8,0x0008412d,0x00088a1c,0x000b8f4f,0x0004d641,0x000009d4,0xfffaad64,0xfff5487b,0xfff10b82,0xffec0d8a,0xffea77a8,0xffe6114a,0xffe0dace,0xffdb99c1,0x0007bf1d,0x0018107c,0x001846bb,0x00227ae5,0x00214628,0x00208f7e,0x0021add5,0x001df00d,0x0022c9ce,0x00226794,0x002960b2, -0x002c496f,0x002c7f05,0x0035a0a3,0x0034b8b5,0x002b4842,0x001eab66,0x001375d1,0x001d950e,0x001a3126,0x001aaa0f,0x0015927b,0x0019269e,0x0018e45d,0x001a4afa,0x0012ea2b,0x000d2fce,0x0003218f,0x00036f6b,0x0007b30d,0x001ded1d,0x00128c41,0x00125fcc,0x0016ef19,0x000d4cfa,0x000a13a5, -0x0005681f,0x00107ca8,0x0010c67b,0x0022002e,0x001726cf,0x001d5146,0x002252d3,0x003053f1,0x002c68df,0x001b399b,0x002c6079,0x003665b9,0x0039bef5,0x0051ccbe,0x004d051e,0x00358808,0x0020487d,0x00122790,0x000e8f51,0x00171d3b,0x001dc4fd,0x0015d8f0,0x001f0345,0x001f6f53,0x001e429e, -0x00075d7f,0xfff0ac32,0xffdd9591,0xffd9aaac,0xfff04768,0x00306abc,0x00183bf2,0x00158fb3,0x00152849,0xfff4a8f9,0xffe920dd,0xffe85541,0x0002552b,0x002bfb97,0x0056652e,0x003ba4f2,0x0031261c,0x0022ac47,0x0036b5e9,0x0045cd77,0x002dddbc,0x005001c4,0x0062156e,0x006277f6,0x0093ed32, -0x008bdfe7,0x0052af1b,0x00300ce7,0x000f3616,0x0004b7f5,0x001ab947,0x00223c88,0x00185f07,0x00263abb,0x002837fe,0x002c126e,0x000572a6,0xffe4d233,0xffb615b5,0xffaf73fa,0xffc6e41e,0x004226d9,0x000bb5d7,0x000e7386,0x001f3ce7,0xffe08fa6,0xffcebf88,0xffc69646,0xfffa1ae1,0x001751da, -0x0037f0e5,0xffff29d3,0x00216799,0x003c706b,0x0056ff78,0x004cd97a,0x001da32e,0x004d0cea,0x005e5473,0x00622f5d,0x00c21eca,0x00a53c04,0x00403f3b,0x0037bf60,0x002f4dda,0x00366f0b,0x001f97bd,0x00170993,0x0004306a,0x001e8e75,0x0026fc7d,0x0028a243,0xffe287f0,0xff8d3de4,0xff56d352, -0xff5a95bb,0xffc20413,0x0087a937,0x002efbd9,0x00209bba,0x00180b9c,0xff94f7cb,0xff671db9,0xff896dc6,0xffe22606,0x004ef653,0x00dc6b38,0x00c3ed74,0x004d0454,0xff6e2dd3,0xffc6892e,0x001e77a2,0x003e0a66,0x00c7425b,0x00f85179,0x00b843c6,0x002dcc33,0x002864cd,0x00986714,0x0045c159, -0x0037a04f,0x0050bfb6,0x00548794,0x005f1253,0x00605652,0x006a6881,0x006db01c,0x00863302,0x00935514,0x00b6db6a,0x010c53c4,0xffc91bfb,0xff2b2c8d,0xff2afe2a,0xff91edc0,0x000b890d,0x00262ee2,0x00fbf634,0x00fc224b,0x00427070,0x0014719f,0x001984a1,0xfe6b85c6,0xfee2bd62,0xffbc8516, -0x0096869e,0x00642039,0x0055869d,0x007a3e44,0x002faf64,0x00273385,0x009427cb,0x00a9ea01,0x008dc7af,0x0046f2ee,0x007a4d77,0x00739222,0x002e9298,0x001ca76f,0x001b53aa,0x0039639c,0x0030ea0c,0x00561160,0x00affc0c,0x00b1379e,0x009a6fe9,0x0073cf0d,0x002b9b9c,0x002886de,0x005e44bc, -0x008d75f3,0x004b16a6,0xffa5a53b,0xffd5ec64,0xffd9cdd7,0xffaf83bc,0x007842f2,0x00e11af1,0x0049672f,0x0041a961,0x0041c3b8,0x004cc1b7,0x0087e715,0x006a46f6,0xfff95b30,0x0032bc40,0x003c4c61,0x002d2e6c,0x0029ca76,0x0037d9c3,0x005ba78b,0x000e1f34,0xffd09016,0xffe64bc4,0xffdd297c, -0xffd15745,0xffd890dd,0xffcccdc4,0xffecf098,0x00461cf5,0xffe87a67,0xffe79d78,0x0007cedf,0x003b8e36,0x0045eed4,0x006e0fd6,0xfff6099a,0xffa86418,0xffa239b3,0xffa18390,0x000b9421,0x00a15dee,0x00d4c4f9,0x0056b051,0x00564462,0x002285e2,0xfff2386f,0xffb6c102,0xffd6f6d3,0xffcff8cf, -0xffc72593,0x001a88ab,0x002b7628,0x001c0d0f,0x00423bba,0x003e3095,0x001a8092,0x000e71e7,0x000c074f,0x000f5a8e,0xfff20421,0x000359f9,0x003d5e3c,0x0058d754,0x0059df64,0x005974d4,0x00145625,0xfff105e2,0xffd24599,0xffbc7e20,0xffbcb720,0x001089c9,0x0003951d,0x003fc136,0x00c1a580, -0x00aa89d1,0x008c6803,0x0067ac3e,0x0065ed26,0xff9cdc4b,0xff9687ec,0xff32640c,0xfefe510e,0xfefb1a9a,0xfed2e5e8,0xff04f9b5,0xff5524c0,0xff98d28f,0xffd0a9ed,0xffe32ed0,0xffe41993,0xffe3ea5e,0xffd08e00,0x0001193d,0x0011dcfb,0x000322f0,0x00014814,0x0004dad1,0x001cd4b8,0xfff5c0d2, -0xfff2fab6,0x0003eb55,0x0019584a,0x001fe138,0x000dcb10,0xffed369f,0xffc55608,0xffbe1731,0xff6337a4,0xff481c52,0xff6fa9de,0xffc3f972,0x00073bd7,0x002b6507,0xffcf3484,0xff6f46bc,0xff6be1f5,0xff6cbd7d,0xff75685a,0xff854706,0xff3e2754,0xff1539ea,0xff167273,0xff2c619a,0xff43c433, -0xff5cd97f,0xff541e64,0xff7b23b6,0xffcd2020,0x00065cb4,0x0028c9c9,0x002a573a,0x00391007,0x003ad258,0x00370463,0x0015264d,0x000e4d19,0x00139bd3,0x00309409,0x002166b9,0xfffc661b,0xffdcf932,0xffc85d88,0xffb8b04a,0xffadd583,0xff9a9e58,0xff6d0257,0xff525feb,0xff2ddad5,0xff1285e1, -0xff4a971c,0xff231eda,0xff11dda0,0xff166457,0xff2ad5e8,0xff3a96a4,0xff60c21e,0xff8fffac,0xffb97148,0xffb8adfb,0xffa66dc5,0xffb0c36f,0xffc405dc,0xfffbf20b,0x000f87e9,0x001287d5,0x00165a13,0x0028eef2,0x002fe7b9,0x003ab707,0x00443de0,0x004304fa,0x00465cf7,0x00446138,0x004a32cf, -0x005453cc,0x006a7cff,0x003d6ef9,0x000e8119,0xffd7a3b6,0xffbbadaa,0xff9fa6da,0xff8ae715,0xff6bd931,0xff512880,0xff2ceed2,0xff25d0fe,0xff706a83,0xff5af4ef,0xff73e63f,0xff7e675d,0xff8f4539,0xff9b620d,0xff9ece61,0xffae1913,0xffb216c4,0xffc1c324,0xffd151db,0xffd9a7db,0xffe2cc92, -0xfff6e7be,0xfffb54b6,0x00030d9e,0x00053a36,0x00088c78,0x000249f7,0x0021923c,0x0025bf3b,0x002594c8,0x00289b09,0x002ec2b6,0x00312e72,0x0038a4e3,0x002377cf,0x00196d4b,0x000e50d1,0x00013c3f,0xfff12bbc,0xffe15d41,0xffc6bc5d,0xffafffbc,0xff9d418e,0xff860178,0xffd16ed7,0xffc30252, -0xffd44eb6,0xffd7d83e,0xffe0c5c6,0xffd8af39,0xffe286c3,0xffee7c7b,0xfff6df00,0xfffe11f4,0x000242e3,0x0008e289,0x000b8f5c,0x000f2afd,0x0004897c,0x0004abbb,0x000565ac,0x0009726b,0x000b2a0a,0x0013fb43,0x0011234b,0x001464fa,0x00163740,0x0016c4c0,0x00171ac5,0x001a7c64,0x001331e7, -0x000cbe9c,0x000552cd,0xfffe04cc,0xfff76cbe,0xfff21d62,0xffec8a2f,0xffe67d5c,0xffdf05ba,0xffd7f85c,0x00030b2a,0x000ad135,0x000ce7fd,0x001cceb5,0x0019cd76,0x00191561,0x0018b5fa,0x0014ab05,0x0019a894,0x0017b011,0x00203414,0x0022c201,0x0022bf00,0x002ac818,0x0029ca64,0x0023b0da, -0x001296eb,0x0006e753,0x000dd064,0x000dc860,0x000ed50e,0x000ba883,0x00107272,0x000f2f05,0x000decaf,0x0002b27b,0xfffada0f,0xffef58cf,0xfff2d35d,0xfff8705e,0x000dcba1,0x0004adba,0x00058215,0x000c1237,0xffffb1cd,0xfffc505d,0xfffa328c,0x00039684,0x0007b660,0x0025048c,0x00167be9, -0x001986a5,0x001a1772,0x002eadd1,0x0029aec4,0x0011ab4a,0x00255109,0x002f1e13,0x0032d548,0x0045b260,0x0041abb7,0x0031f989,0x0014a7ff,0x00028bbb,0xfff83850,0x00061b58,0x0012b76d,0x000f22ac,0x001c3bd8,0x0019ae58,0x000f5709,0xffed9a40,0xffd2b854,0xffbfe01c,0xffc46592,0xffddea83, -0x00174153,0x0005b18a,0x0004d859,0x00086e47,0xffe4a329,0xffda97b7,0xffdfdae1,0xfff55872,0x00222bd5,0x006d56bd,0x004b1b45,0x003cb097,0x00237a1c,0x003eb7af,0x004b159c,0x00250e73,0x005095bb,0x005fea2a,0x0062274d,0x008acf86,0x00830316,0x0055ce11,0x002573ca,0xfffde8e5,0xffe6b025, -0x00090028,0x0018f89d,0x00189595,0x002ebd71,0x002a3dcb,0x001c7ab2,0xffe0b156,0xffb3f781,0xff837692,0xff8c5fe0,0xfface932,0x001be7ff,0xfff5c905,0xfffb4dc5,0x0016d347,0xffca95b1,0xffbb40da,0xffc17063,0xffe970f4,0x0017b67c,0x006247ae,0x0016acf0,0x002a4936,0x0039bd2f,0x0074043a, -0x0064c711,0x00225f39,0x005544ce,0x0063370d,0x006f53d5,0x00cdec6e,0x00b6c833,0x005bf184,0x00386820,0x0017ae06,0xfffd5cf7,0x0003a90f,0x0010d81e,0x000dd0da,0x0035f96d,0x00332ee0,0x00156f14,0xffab14bf,0xff495299,0xff1ce6ee,0xff395be5,0xffaad6b9,0x00523723,0x000e0a93,0x00061b2e, -0x000de062,0xff819bf9,0xff5ac79c,0xff93b278,0xffd67f93,0x003804cd,0x00f5e9e3,0x01160f52,0x00a341cc,0xffadcebf,0xffaf927a,0xfff9d991,0x003f793b,0x00999af2,0x00e46bbb,0x00eff7f5,0x0040f78c,0x001fa12f,0x00806fa6,0x00336640,0x0036f0ea,0x005f27f1,0x006dd16d,0x00784971,0x00668efd, -0x005e8296,0x0064f47c,0x007eac7f,0x0091c870,0x00a2b6ce,0x00bd0246,0xff88dad0,0xfef87d5a,0xfef9e318,0xff986ef4,0x0017dbd5,0xffea9d35,0x00df5d1a,0x00db7071,0xfffda1e3,0xfff1f306,0x001ccf9a,0xfeb6d2e6,0xfe1ef342,0xfef74622,0x00fbbd82,0x0072ac79,0x0050e542,0x0083587c,0x003c6953, -0x002cae85,0x00818c28,0x00b522c1,0x009b946d,0x003d8e5a,0x005cf3ca,0x004b9729,0x002894c6,0x0012c49b,0x00119ac6,0x00346e5f,0x00198867,0x004118a3,0x00a1e41c,0x00adb61c,0x008add51,0x004a0b07,0x0018d95b,0x0029c649,0x008a1b6b,0x0041fbb3,0xfff683f0,0xff8a17c8,0xfffac5a9,0x00186bd1, -0xffcfc22e,0x00827526,0x012029bc,0x00dd58be,0x00c99b92,0x00ab84c2,0x0072acfc,0x00852614,0x00667df7,0xfff8f130,0x00363ad8,0x00459ed9,0x0027388a,0x002bb659,0x00374218,0x005abc74,0x00165d95,0xffda08ef,0xfffd2fce,0xffeb9899,0xffdc94d3,0xffe4ad6f,0xffcaeb4a,0xffe3cc66,0x0029993a, -0xfff48572,0x0006c3e7,0x00225ed2,0x00395d93,0x00219532,0x00616833,0xffa0ca93,0xff5f7f7b,0xff9f31e4,0xffa54b8b,0x001e31f8,0x009c9573,0x00e8f9f8,0x002afd82,0x00006872,0xffd9ec5d,0xffc2cd9f,0xffae678c,0xffd9e5af,0xffd437a4,0xffcf76b9,0x00205614,0x003799fb,0x0024452f,0x004e6686, -0x0040585c,0x000b9348,0xfffcac38,0xfffa5c06,0x000ee947,0xfff32fb5,0x00051c98,0x00418943,0x005bc45c,0x0060aad6,0x0058a77c,0x00229a89,0x000303b5,0xffcfc2ec,0xffa5879b,0xffc005ba,0x005f9fc4,0x00166880,0x0066c7bb,0x011be128,0x00e52188,0x00b2d282,0x0064df9d,0x00561fb6,0xffbff1a1, -0xffaa91a5,0xff5908c1,0xff30cc45,0xff42a755,0xff12a1bc,0xff35b13c,0xff6a96d5,0xff992079,0xffc6521c,0xffd068aa,0xffd9bf8a,0xffda10d1,0xffba80a5,0xfffbd0b5,0x000aad35,0xffffea84,0xffff3210,0x0002eb69,0x001489e1,0xfff8826c,0xffeed152,0xffefbf98,0x0000952d,0x000ab4e7,0x001198cf, -0xfff8ceb2,0xffe2bc64,0xffd1e074,0xff82fa5c,0xff5638b3,0xff329f20,0xffa4c8ea,0xfff86c8c,0x0020978d,0xffe9bdf7,0xff8cf9aa,0xff8e8173,0xff8c4fbb,0xff7752ce,0xff4ce37d,0xff1a674d,0xfefd9368,0xff02519f,0xff24332a,0xff446b3c,0xff5ca470,0xff560def,0xff7195b1,0xffab9cda,0xfff35038, -0x001d5d8e,0x003158f0,0x003063fd,0x002e66cd,0x00291123,0x000d2319,0x0002ca2a,0xfff8134e,0x001b3452,0x002105de,0x00145799,0xffea22d8,0xffd05be2,0xffb8dc8c,0xffc8a6bf,0xffcb1c7a,0xffa1548e,0xff96ddee,0xff7674a4,0xff5ddd33,0xff766710,0xff59030c,0xff518c1c,0xff523d59,0xff68dcbb, -0xff79d059,0xff8cde7e,0xffa1bf7c,0xffb89246,0xffa40fce,0xff80aee5,0xff76ca7c,0xff8f9ce8,0xffcb2fc7,0xffdca9aa,0xfffed4b5,0x00162f5f,0x00441b56,0x003b5945,0x00386f3d,0x00353526,0x002a9636,0x0025d93d,0x00191933,0x002af6c8,0x003bcb85,0x005a47cb,0x002651de,0xfff91eff,0xffc73a0a, -0xffa55bf0,0xff81e86e,0xff67806b,0xff5be033,0xff562de5,0xff4a02f9,0xff507d03,0xff683522,0xff4c603f,0xff569479,0xff5ebb9f,0xff697639,0xff72fb55,0xff76973d,0xff84bc12,0xff8de59f,0xffa3a8db,0xffb62b1e,0xffbdb44c,0xffc658ab,0xffd6a79a,0xffe95029,0xfff8086d,0x00067e6f,0x0015e26c, -0x0029425b,0x0042d531,0x0042e842,0x0043f1d7,0x0044f4bc,0x0046a173,0x00431a73,0x00461a37,0x0031170d,0x00271799,0x001c16df,0x0011273a,0x0005d00e,0xfff867c2,0xffda65b3,0xffbbca94,0xffa06b48,0xff82b803,0xffc523a1,0xffb7153e,0xffc446aa,0xffc8618a,0xffd2a49b,0xffc89a63,0xffd1e4f5, -0xffdf8f70,0xffe7486e,0xffed0ca9,0xfff18f8e,0xfff840f3,0xfffbee97,0xffff0184,0xfff6b37c,0xfff6b80f,0x0004a02f,0x0005d0fd,0x00085cd2,0x000d88db,0x000b2be7,0x000c657c,0x000d23b7,0x000cd300,0x000d2a9a,0x000f7943,0x00090601,0x0002d95c,0xfffbdc68,0xfff4e93c,0xffee080c,0xffe9f5da, -0xffe1fe03,0xffdbdd41,0xffd4a489,0xffcce7a6,0xfff15de1,0xffff1ed6,0x00025b39,0x0015249d,0x0011b2fa,0x0010c3d0,0x000db100,0x000b5f0c,0x001090e3,0x000b6b01,0x001676e4,0x0018e140,0x00179716,0x001e7b10,0x001d211d,0x0019aef1,0x0006a3e8,0xfffbfb15,0xffffee46,0x000212a6,0x0003bdd2, -0x000285d1,0x00080ce7,0x0005f8b0,0x0001a1ba,0xfff4fe4d,0xffeca02a,0xffe1df58,0xffe88432,0xffee5df4,0xffff3f24,0xfff94086,0xfffabb3b,0x000347c6,0xfff3e8fc,0xfff07356,0xfff112f2,0xfff82b59,0xfffcf1a3,0x0022a93c,0x00177f6b,0x0013afc2,0x000d81c4,0x00295e1e,0x002579bf,0x0006a8de, -0x001ed0c0,0x0027f35c,0x002aef99,0x00381b2e,0x00342a95,0x002c0a7a,0x0007c09b,0xfff3ae33,0xffe8f7b5,0xfff604ab,0x00069fa4,0x0008274f,0x0017bb36,0x0012b796,0xfffebe2b,0xffd9881d,0xffbffd75,0xffb11c26,0xffbfa922,0xffd8e58f,0x0002aae0,0xfff7ad43,0xfff74158,0x0000cf09,0xffd83d79, -0xffce76cd,0xffd8c9b0,0xffe91d20,0x0013ac33,0x0075c34b,0x0052dec8,0x003e1556,0x001b5ca6,0x003f80da,0x004ad797,0x00187fa6,0x004fffab,0x005d5966,0x005bcf83,0x007a9a69,0x00726755,0x0050f493,0x00162d18,0xffec8a43,0xffd588e2,0xfff5f8dd,0x000c115b,0x0016cae8,0x0032b799,0x0028f189, -0x00078daa,0xffc425d8,0xff948889,0xff6bce41,0xff868d0c,0xffa981d1,0xfffb3760,0xffe7ad33,0xffec7d04,0x0013beca,0xffba112f,0xffab1b73,0xffbff1c6,0xffdaa11c,0x000b2562,0x00750ff4,0x002fa05b,0x002cc8d5,0x002b817d,0x00856142,0x0076b4fc,0x00250d14,0x005bfd6c,0x0066f597,0x0075a875, -0x00d38af0,0x00bf9c47,0x006c8c91,0x00312211,0xfffca82b,0xffd2f166,0xffe64a27,0x000558f7,0x001365f3,0x0045f2c2,0x0038fa25,0xfff8a954,0xff829d40,0xff28cb87,0xff0fdab7,0xff478ac8,0xffb3d6f4,0x00284ff4,0xfff7b7ed,0xfff140c3,0x0010f938,0xff77f022,0xff562738,0xff9db001,0xffccbb7c, -0x002f3c4d,0x00f72c3c,0x014a27ce,0x00e6a8f5,0xffe75e62,0xff979f27,0xffcb185e,0x00360fbd,0x0069f990,0x00c648d6,0x0120bc18,0x004e228a,0x00121667,0x0066d79d,0x0024d25a,0x00377ec1,0x0064eef0,0x007954ec,0x00802a76,0x006140c5,0x0057a8e8,0x005debf8,0x006b5d4e,0x0086b47c,0x007f4b25, -0x00557c7d,0xff6218f8,0xfee8f7c0,0xfedbb050,0xffa407d0,0x001b5505,0xffb6fc8a,0x00b1fa07,0x00a522f1,0xffac31a3,0xffd86541,0xffe84a5c,0xfef53986,0xfdb898a4,0xfe811a1c,0x012c522e,0x008c44e2,0x0057a9c0,0x006ff8c3,0x0040b00e,0x0032d9c3,0x00698fe5,0x00b34914,0x00a0a025,0x00389329, -0x0043a4fd,0x002d0120,0x0026ff8e,0x00137e46,0x001236a2,0x002a5de4,0x0006cb37,0x002db7ab,0x00862080,0x0099ac73,0x0073daa2,0x003749dc,0x000c79e6,0x002cc912,0x00ab3a67,0xfff1865b,0xff9c3b61,0xff6fb032,0x0018d691,0x004b91b3,0x0007768e,0x0061d62e,0x013b5cf4,0x0155b0ec,0x013e48a8, -0x0102ee42,0x0090f189,0x007e4430,0x006af4e6,0x0011c4a8,0x0043e653,0x004c9d22,0x0023447f,0x002a951f,0x0032a627,0x00540319,0x001e80c2,0xffe845de,0x000adce7,0xfff771e5,0xffe91089,0xffe4d944,0xffcec13d,0xffdf94a5,0xfffc204f,0x00071dc4,0x0032dfbe,0x00523ffd,0x0038cf74,0x00051d69, -0x0042f951,0xff6fea41,0xff455673,0xff9d6cd4,0xffe7c8e1,0x005d98b9,0x00a5a7c8,0x00f1f6a4,0xfff9b221,0xffad79c6,0xff91bb6c,0xffa35b4f,0xffc0a41d,0xffed042d,0xffe18dbb,0xffe2dfc6,0x001c96e6,0x00362b88,0x00299c9a,0x004c3dbf,0x00379fb0,0xfffc1e31,0xfff2a187,0xffef0859,0x0002a521, -0xfff6d23d,0x000a331d,0x0038afad,0x00453aef,0x00505b32,0x004cacca,0x003651c9,0x00193661,0xffd44bc5,0xffab609c,0xffdba247,0x008b9b51,0x0041b375,0x0093052a,0x0132fdd2,0x010af7f8,0x00ce8d83,0x00636cd2,0x0042d185,0xffdd40c2,0xffca7790,0xff889921,0xff679dea,0xff67c6dd,0xff559ba7, -0xff73cb93,0xff902a02,0xffa6a478,0xffc244ed,0xffbce87f,0xffc57330,0xffc9a4fe,0xffb37019,0xfff4a457,0x00036920,0x0004bdc0,0x0001ba9f,0x00040f4c,0x00104aab,0x000ae373,0x00001ce8,0xfff29f3d,0x00004cab,0x0007601d,0x0018fe71,0x0010a1aa,0xffff5091,0xffe08233,0xffacb18b,0xff7bbea1, -0xff2ae5c2,0xff9a44fd,0xffe7191d,0x00050bd0,0xffefb60e,0xffb0a6c3,0xffaa78f8,0xffa81f10,0xff829099,0xff26963c,0xff069083,0xfef0188e,0xfef423dc,0xff1d4b2f,0xff423313,0xff5b5a2d,0xff5f8906,0xff74017c,0xff944d6f,0xffd896af,0x00076a4a,0x0035f2a0,0x00270870,0x0021f855,0x001d709d, -0x0009baf0,0xfffd66e7,0xffe9a726,0x0003304f,0x0015695e,0x0026a8d1,0x00012ae7,0xffe5d284,0xffcb80b7,0xffd1f48c,0xffe064ff,0xffe1a8cd,0xffd0fa5e,0xffb8bd26,0xffbb8bc9,0xffae49a7,0xff8df05f,0xff8aef76,0xff82a5cc,0xff968635,0xffa5f4da,0xffa42e27,0xff9f3adf,0xff9fa44b,0xff862cb3, -0xff62cb38,0xff4ec9f5,0xff6498b9,0xff946633,0xff9eef2f,0xffde7ffc,0x0007fd04,0x0049f0b6,0x003baaad,0x00355933,0x00316967,0x0021c5b9,0x0018a03d,0x000a3a82,0x00154981,0x001bebc5,0x002af739,0x0004b085,0xffe8fec1,0xffcd0206,0xffa95c1f,0xff80d53f,0xff5f9228,0xff6458ff,0xff6f53e1, -0xff752204,0xff7ef3d8,0xff7998ef,0xff613396,0xff523b38,0xff5e24f2,0xff5c50a1,0xff61a912,0xff661ad6,0xff6d1377,0xff7d65d6,0xff928789,0xffa5436b,0xffad71b2,0xffb712d6,0xffc27294,0xffd7dfee,0xffe34760,0xfff5e990,0x00072598,0x00288abc,0x002c5d83,0x00284f13,0x0029c1c7,0x0027dc5a, -0x00267c71,0x0021c562,0x00211c33,0x0013fccb,0x000c9212,0x0005ad5f,0x0001118d,0xffffa5fa,0xfff8d601,0xffe17a2b,0xffc467b3,0xffaa1297,0xff909c6d,0xffc17050,0xffb93638,0xffbde1de,0xffbf1197,0xffc30277,0xffc23713,0xffc5ee88,0xffcc3fab,0xffd28e74,0xffd759b8,0xffdc4c16,0xffe28398, -0xffe70f75,0xffeb2484,0xffe79d58,0xffe74359,0xfff95e30,0xfff8872b,0xfffb1325,0xfff9aea2,0xfff9dcdc,0xfff8b498,0xfff84891,0xfff7180f,0xfff68594,0xfff6cbc7,0xfff34664,0xffefc352,0xffeb8879,0xffe7365a,0xffe256bc,0xffe19916,0xffd8fa1a,0xffd45f53,0xffcf4381,0xffc8bb81,0xffe265b3, -0xfff53ccd,0xfff8bfe7,0x000b9df3,0x0007a0f1,0x000668ea,0x00005b20,0x00017c0f,0x000636b9,0xfffec275,0x000c294b,0x000e68da,0x000bdf57,0x0010d6af,0x000f1c96,0x000e6f54,0xfffa5abb,0xfff196d5,0xfff455ed,0xfff66e88,0xfff8bf02,0xfffa7f39,0xffffa0b4,0xfffcf224,0xfff5837c,0xffea53ab, -0xffe31fe4,0xffdaae86,0xffe3d38e,0xffe9107a,0xfff42606,0xfff052e7,0xfff1ace5,0xfffb223c,0xffe9e56b,0xffe6b5d8,0xffea4a7c,0xffeedc46,0xfff24fb2,0x00188e51,0x0011f412,0x000981ce,0xfffb5e72,0x002068a9,0x001f9dd5,0xfffc1172,0x00184b10,0x00203869,0x0022566c,0x002880b5,0x00247a59, -0x0024c119,0xfffa4aac,0xffe64483,0xffde993b,0xffe8428c,0xfff99575,0xffffdda9,0x000fd11a,0x0008405f,0xffec4fa2,0xffcb80fc,0xffb7da23,0xffaf492c,0xffc81b70,0xffdf41fd,0xfff6c7df,0xffeecf7d,0xffecf7fa,0xfffa5ede,0xffcf19d6,0xffc605db,0xffd4c1ea,0xffdf55a2,0x0003f95b,0x00684b52, -0x004c06c9,0x003558ff,0x00090964,0x00390767,0x0044ff45,0x000a7874,0x004d5aa2,0x0059d9ef,0x005186bb,0x0063ba85,0x005a3d8d,0x00490f52,0x0003b8df,0xffdc5a8d,0xffcdc2ad,0xffe4ca6c,0xfffdb074,0x00111b96,0x002e8d50,0x001fb434,0xffedc059,0xffb08651,0xff87a2ba,0xff6c1bcc,0xff97c123, -0xffb8c8eb,0xffea4b50,0xffe0d528,0xffe0a3e4,0x000d375e,0xffac4c81,0xff9ec13c,0xffc2cb54,0xffcf0a30,0xfff8b853,0x0064e4d7,0x003016d7,0x001fe60a,0x000f973a,0x008c8e94,0x0084eac0,0x00255ea7,0x00615e8d,0x00697adf,0x00757975,0x00ce1ddc,0x00bcba72,0x00730964,0x0021bcea,0xffe23d98, -0xffbaefb8,0xffcd63a1,0xfff437ea,0x00113100,0x0045fd21,0x002ebdf2,0xffd30cfd,0xff68fb31,0xff25b826,0xff233df5,0xff78b8bc,0xffd9d5f5,0x0017e23c,0xffeed9e5,0xffe417cf,0x0011303b,0xff75232e,0xff5ade1f,0xffabd251,0xffc659c5,0x00297650,0x00f02825,0x016087ec,0x0110f61c,0x000fcc62, -0xff783582,0xff927889,0x001ec5c3,0x003d7725,0x00a270e9,0x013a764a,0x00537d42,0x0004501c,0x004ae68c,0x0019b2c3,0x003530bd,0x005aad9e,0x0072ba6d,0x0078ce1d,0x005b9242,0x0053d4f5,0x0055635a,0x00525cb9,0x0075bdf2,0x0058e1ba,0xfff9247e,0xff4a7c56,0xfeef55aa,0xfee2967c,0xffb41543, -0x00149705,0xff8f8d80,0x0072fea4,0x005aa2dc,0xff5f489f,0xffbb01da,0xff908e4e,0xff05c1fc,0xfda72c8c,0xfe581480,0x0113a00c,0x00a4a017,0x006ba811,0x00588995,0x003e4202,0x00380da6,0x0051435e,0x00a9596c,0x00a18074,0x003ceb4c,0x0033c7bb,0x001b45b8,0x002be717,0x001ffdee,0x001a7b9e, -0x001b463f,0xfff88002,0x0017cc2f,0x0056ca81,0x007d79b0,0x00611656,0x00278a91,0x00066f49,0x002efef5,0x00bad294,0xffba305d,0xff6c3f44,0xff8111c6,0x002cd040,0x0068d6d6,0x00450386,0x002c3046,0x0143bed2,0x0199b69e,0x0189d08c,0x01382a28,0x0092b976,0x0064ecc2,0x0068d3ab,0x00406b66, -0x005568d1,0x004ff298,0x00227fe9,0x00253367,0x00294985,0x0048221b,0x0026ae24,0xfff9acdd,0x000de155,0xfffb1cd4,0xffe72a92,0xffd8d00e,0xffd4757c,0xffe083cb,0xffe3beba,0x002fdb02,0x00658213,0x0072c567,0x0046af73,0xfffe2dc9,0x000505be,0xff5c79df,0xff45e0ed,0xff771464,0x0049d9ff, -0x00b9fde9,0x009b2112,0x00f00011,0xffc263d6,0xff78629f,0xff541422,0xff89bb3c,0xffdae130,0xfff93677,0xffe940b9,0xfff63086,0x00100050,0x0026f7ba,0x0025ebce,0x003a2d4d,0x00245b13,0xfff1d134,0xffeb8471,0xffe34771,0xffedc2f7,0xfff903a3,0x000bf6c6,0x00272e0d,0x00274a0b,0x0039e645, -0x0042dd73,0x0047b96b,0x002b22e6,0xffe163fc,0xffd3055e,0x000dabd7,0x0091a423,0x0083cf6e,0x00c3e827,0x0102bf36,0x00fee73e,0x00c15184,0x005c3746,0x001d6283,0xfff0d02d,0x00080eab,0xffc0ce87,0xffa27b11,0xff973ab6,0xff964a5f,0xffb068cc,0xffbb1d7c,0xffbe74a5,0xffca7b28,0xffb5e4a6, -0xffb3dd65,0xffb977dd,0xffb9008f,0xffe52445,0xfff7a9bd,0x0011158b,0x00036627,0x0003a230,0x000edd3c,0x001ee58d,0x001aa393,0x00070ee7,0x000a1763,0x000cdb28,0x001cc07f,0x001a6fb2,0x00067444,0xffdb7281,0xffcf2e50,0xffb31f13,0xff64d40e,0xffad37a8,0xffda37ad,0xfff68051,0xffe46ba4, -0xffcdc502,0xffb7c301,0xffab936f,0xff807f65,0xff125031,0xfef679f0,0xfee8ff96,0xfef5b326,0xff1dccf7,0xff4187e3,0xff5b7bd0,0xff6bd037,0xff7c13b1,0xff88ff11,0xffc00132,0xffed8841,0x002b5277,0x0021b01c,0x0020e8b5,0x0019aae7,0x000fced5,0x0001174c,0xffeb1740,0xfff76c32,0x0007b5f2, -0x00316347,0x0018476d,0x0001ea26,0xffeb9cae,0xffdc390b,0xffe639b9,0x0008b68e,0xfff7b4c7,0xffe99d6c,0xfff559c0,0xffdca716,0xffbac0da,0xffbd493f,0xffae838d,0xffb9bb14,0xffc623e5,0xffb0c8bd,0xff95bb32,0xff7f3635,0xff6a7246,0xff51263e,0xff3c1d5f,0xff4bc946,0xff67b8c7,0xff6d48d3, -0xffba06b3,0xfff0aa37,0x0039f04c,0x002d4023,0x002b6c2e,0x002b9015,0x001ad1cc,0x00120424,0x0005e378,0x0003bbfe,0xfffdbffb,0xfffb9620,0xffe8c15d,0xffded66b,0xffd716b1,0xffb8aaf9,0xff963be0,0xff76e4af,0xff827d6b,0xff93b86c,0xff9f2a73,0xffa9f2ff,0xff99e76f,0xff8c9dc6,0xff6ee54d, -0xff79e3e9,0xff6dd44d,0xff704535,0xff75e453,0xff74523e,0xff8799c4,0xff957871,0xffa3613e,0xffaab4f2,0xffb32f9d,0xffb81a67,0xffc7e2ca,0xffcb78c6,0xffd86e8b,0xffe50185,0x00044c1a,0xfffb84ca,0xfff8996e,0xfffa97ac,0xfff9595c,0xfff946c7,0xfff82ddf,0xfff77f45,0xfff25413,0xffed1159, -0xffe8fb8a,0xffe80f82,0xffea908f,0xffe5f881,0xffda5748,0xffc6cb85,0xffb60c96,0xffa76019,0xffbfaab1,0xffbd89e2,0xffbe5162,0xffbecdde,0xffbfe74b,0xffc0a717,0xffc1fe83,0xffc2da05,0xffc6122e,0xffc987fb,0xffcdfcd0,0xffd21c08,0xffd64688,0xffdac586,0xffd7420a,0xffd47999,0xffea5d13, -0xffe5b46b,0xffe602cc,0xffe020c8,0xffe2d1bb,0xffe15a92,0xffe10cc1,0xffe0289b,0xffdf8291,0xffdfbd27,0xffdcdf47,0xffdaa59e,0xffd7ed0d,0xffd4ecf2,0xffd1afd5,0xffd206c6,0xffcc69da,0xffca760b,0xffc858ab,0xffc4a9e0,0xffcc8cd6,0xffee4606,0xfff11c28,0x00022d1a,0xffff9b35,0xfffe92df, -0xfff5134b,0xfff9ea18,0xfffe6b8b,0xfff54600,0x00044bf0,0x00067f53,0x0003708f,0x000545eb,0x00034919,0x00060a54,0xfff1fed9,0xffea6f84,0xffecb272,0xffeea834,0xfff117ae,0xfff477a0,0xfff7e219,0xfff4d12d,0xffec046e,0xffe341a5,0xffde34d3,0xffd8c642,0xffe3d6a3,0xffe8238f,0xffed776f, -0xffeac832,0xffebc929,0xfff56b66,0xffe3fe06,0xffe0f9b6,0xffe61b64,0xffe86e9f,0xffe98cc4,0x000cb1c8,0x000a4c1f,0xfffec691,0xffe922a8,0x00163701,0x001966a9,0xfff512c0,0x00136851,0x0019f07b,0x001c7be2,0x00193b4c,0x00150a2f,0x001ef030,0xffeff17b,0xffdd26a1,0xffd83b67,0xffdf603a, -0xffefcafc,0xfff91a6d,0x0004e17c,0xfffb4e47,0xffdd616f,0xffc34538,0xffb73c16,0xffb58235,0xffd7af89,0xffebf6e6,0xfff1e1b3,0xffe9dae0,0xffe5645b,0xfff45843,0xffcb306d,0xffc37054,0xffd33a56,0xffd8afbe,0xfff31744,0x00522b4d,0x003fac9d,0x002b6af1,0xfff34c7f,0x002f754a,0x003baa6c, -0xfffe0046,0x0049dc13,0x0055f347,0x004932d7,0x00499723,0x003ec6a3,0x00439819,0xfff3ceb6,0xffd1055e,0xffcaab99,0xffd9a8ab,0xfff29d7b,0x000af9f2,0x00214594,0x000e462e,0xffd76de7,0xffa44cac,0xff87f306,0xff7b6a4c,0xffb604cd,0xffd36483,0xffe6e6d2,0xffdfbcc5,0xffda550e,0x0007e70c, -0xffa9ef7f,0xff9cdef6,0xffc6e322,0xffc53e56,0xffe3caaf,0x004d35da,0x0025fde1,0x000acb5c,0xffe951fc,0x008637e3,0x008cba8a,0x0024a02d,0x0067bb14,0x006e13e0,0x0072408f,0x00bb63af,0x00ac7916,0x0073e531,0x000e5c4a,0xffcd9c27,0xffb2c499,0xffc0039c,0xffe55b39,0x000d1a55,0x003611ea, -0x00160cd5,0xffb2ca1f,0xff5b66a9,0xff3394fe,0xff45aa64,0xffb8c585,0x000db2ed,0x0017e678,0xffec99dc,0xffd9426e,0x000901b3,0xff7d81b9,0xff6bb5b8,0xffb85cc8,0xffbe6029,0x001c269f,0x00d9332b,0x01672930,0x012dc072,0x0035c6a7,0xff60a305,0xff5b99d4,0xfffbe1d8,0x0018c28f,0x007e9b99, -0x0133be8a,0x0051ff60,0xfffc277b,0x00302eae,0x00144996,0x0032875f,0x00448b75,0x005f4825,0x0069f40b,0x00598d21,0x004b273c,0x004711b6,0x003ae3b7,0x00600f9a,0x0034159e,0xffb5cfff,0xff4182d5,0xff0110d2,0xff01f33c,0xffcbc6b8,0x001982c5,0xff8fe3d6,0x003f4517,0x0013890c,0xff2d712d, -0xff9d62b1,0xff47e09a,0xfef28bec,0xfdc38b48,0xfe57970a,0x00b790a1,0x00b361cb,0x008bc004,0x0054a2e5,0x00387be1,0x003608ec,0x003c17e4,0x00984827,0x009bd137,0x004726e2,0x002b64d2,0x00119cb5,0x003101dd,0x002f72f9,0x00228263,0x000b2d5a,0xfff37fb9,0x000966c8,0x002b6fee,0x00629d99, -0x004f51d0,0x001ac2dd,0xfffc7442,0x002a63e1,0x00c25245,0xffa0ef2e,0xff5c24ed,0xff9d0d66,0x0029916d,0x00720621,0x0085dee1,0x00039e14,0x0135ea00,0x01a6de5a,0x01a81aac,0x0148859a,0x0078222a,0x00341b94,0x00543757,0x00718158,0x00665b97,0x0053a25f,0x0020c492,0x001e1e79,0x001e6867, -0x0035c58a,0x002e71b8,0x000d6578,0x000ae51b,0xfff8118f,0xffde4744,0xffd3370c,0xffe117fb,0xffe7e315,0xffe27a29,0x004a78f4,0x00803ec8,0x0089ac08,0x005f7612,0x00073487,0xffbf0ab3,0xff694150,0xff6a539e,0xff5fca03,0x00b4b203,0x010553b0,0x005fc978,0x00d43dde,0xff90c783,0xff5e86fb, -0xff2b3957,0xff72c333,0xfff05ff6,0xfff9dbbb,0xffea2e83,0xffffeecb,0xfffd95fa,0x000f9fc0,0x00190adc,0x001cc2ce,0x000a0063,0xffeca7ea,0xffe399d5,0xffd5fc48,0xffda7fff,0xfff9c0c4,0x000c155c,0x00125a40,0x0010142e,0x0029a87f,0x003a3e9d,0x0049c017,0x003124c7,0x0006e819,0x0001f890, -0x003e177c,0x0090c60e,0x00bb09cc,0x00dcc5b3,0x00a1efad,0x00b8cc6b,0x008a4398,0x004c6171,0xfff1f564,0x000f8927,0x004bed9f,0x0002e338,0xffe6f562,0xffde42ec,0xffd93663,0xffe79310,0xffe3a26d,0xffd9dae1,0xffdb3e51,0xffc26206,0xffae7f92,0xffb0868d,0xffc3c256,0xffd54fe2,0xffec3f4f, -0x00192958,0x0002dd1d,0x00028ae2,0x000cf0b0,0x0027ed0a,0x002b8f90,0x001a71d7,0x0014734a,0x00112c2c,0x0013647e,0x00167a9c,0x00024302,0xffcf28fe,0xffdf72c7,0xffe4625a,0xffc8b4a3,0xffd7692e,0xffdb751e,0xfff5011a,0xffe99d48,0xffd9ee7b,0xffbaff4f,0xff9797ea,0xff680950,0xff07381a, -0xfeebc1f0,0xfeebbfbe,0xff098d38,0xff27d11f,0xff46893d,0xff601554,0xff7a1dd6,0xff88a71c,0xff8b9103,0xffb0de47,0xffd5cb37,0x000fd3af,0x001f5508,0x0028e741,0x001c4a70,0x00190c7a,0x000b99f0,0xfffcac97,0xfff60872,0x00026db7,0x0033cbbb,0x00232910,0x00140d32,0x0002d878,0xffeeeeab, -0xffecd92b,0x000c3ca8,0x0007bb21,0x00029787,0xffff49cf,0xfff1696e,0xffdbeece,0xffdfcb60,0xffd0718b,0xffd2656a,0xffdb6b6e,0xffb802fb,0xff8dc5b3,0xff654002,0xff57481a,0xff4a0cbc,0xff375a2c,0xff45144d,0xff51b19c,0xff58b672,0xffa158b9,0xffdcc79a,0x00204702,0x0017d8f3,0x001a3beb, -0x00215057,0x00148a3f,0x000c9ee2,0x0004073f,0xfffc18b1,0xffefe8fa,0xffe4d7b7,0xffdf9aec,0xffe06cde,0xffe26fb5,0xffce093c,0xffba2ea1,0xffa4eb8e,0xffb1f20a,0xffc16429,0xffccd288,0xffd1e9d5,0xffb22ec5,0xffae2429,0xff96dcc4,0xff9b138b,0xff8e2fb4,0xff8f7572,0xff97959a,0xff93ad02, -0xffa41590,0xffa9b0c0,0xffb090cc,0xffb52d7e,0xffb99c28,0xffb8585b,0xffbfc245,0xffbd590b,0xffc324a0,0xffcbd5f7,0xffdf6e5e,0xffdc192c,0xffdc26c3,0xffdf1179,0xffe04848,0xffe2263c,0xffe4dacd,0xffe62684,0xffe350f1,0xffdd91c1,0xffd98aa0,0xffd82126,0xffd7d535,0xffd1d621,0xffcdf6b7, -0xffc3c07c,0xffbc5db5,0xffb70d23,0xffbcdbd7,0xffbd6340,0xffbcfed4,0xffbddda8,0xffbecda5,0xffbe5f40,0xffbe8a2d,0xffbcf830,0xffbc852c,0xffbdcaea,0xffc0777c,0xffc1631b,0xffc3bccf,0xffc6a724,0xffc4bf3a,0xffc33e8b,0xffd44eb8,0xffd0359b,0xffd007d5,0xffcd0e8c,0xffcf5e52,0xffceefd1, -0xffcf475f,0xffcf5eb5,0xffcf708b,0xffd100b4,0xffcd2cdd,0xffcb00a4,0xffc85af7,0xffc56c89,0xffc2ff11,0xffc276ee,0xffc0be89,0xffc0c642,0xffc07df7,0xffbf4803,0xffb657d6,0xffeb87af,0xffed442d,0xfffb3969,0xfffa78f8,0xfff8eeb9,0xffeb2df3,0xfff585d1,0xfff8a0b0,0xffee44ec,0xfffd6b9a, -0xffffbe7d,0xfffd8b10,0xfffadd36,0xfff8cdd7,0xffff8b2d,0xffece72d,0xffe71005,0xffe6695c,0xffe9ac60,0xffecd354,0xfff23c0f,0xfff29f43,0xffef9ac4,0xffe7ae62,0xffe0c6e4,0xffde0962,0xffdba0a5,0xffe83171,0xffebac3c,0xffec0af0,0xffe9c450,0xffea322a,0xfff2ef26,0xffe2c3ba,0xffdfbe2d, -0xffe49dc1,0xffe61a74,0xffe53339,0x00012c00,0x0003435c,0xfff7c22e,0xffdaae94,0x000c79ff,0x00142ee2,0xfff3ee73,0x001177b6,0x00166397,0x001a664b,0x000d0064,0x000889c3,0x001b4286,0xffe9a8ac,0xffd88792,0xffd41a61,0xffdb74ad,0xffe94346,0xfff66d33,0xfffaa462,0xffefd79a,0xffd6399e, -0xffc0ecd3,0xffbc39a0,0xffc12afd,0xffeafd54,0xfffc7655,0xfff3602e,0xffe9d198,0xffe1fcbb,0xfff01b1a,0xffcc4b24,0xffc68a20,0xffd3e4ff,0xffd71b41,0xffe7a449,0x003761c8,0x0033ea60,0x00236440,0xffddcafd,0x00238c6e,0x0030453d,0xfff7ba98,0x0045ddb3,0x0052bd6c,0x0045cc19,0x0032c727, -0x002535c8,0x00419081,0xffe8a39c,0xffcb745d,0xffc80305,0xffd42b3e,0xffeb7853,0x00071c05,0x0010221d,0xfffad49f,0xffcbc4df,0xffa03a6d,0xff91eb0e,0xff930e27,0xffd9a832,0xfff3f42e,0xffecd631,0xffe53ca1,0xffda94e8,0x0002b4d4,0xffaef357,0xffa27ffc,0xffc78887,0xffc1e1d2,0xffd6d6fa, -0x002ead52,0x001cada3,0xfff74a6f,0xffc0da1b,0x00727c10,0x008dc605,0x00281cc9,0x006ffaa0,0x0075f521,0x00713b9b,0x009ecca7,0x0091b1c3,0x00735299,0xfffb50e6,0xffc03683,0xffb260e7,0xffbdbe69,0xffde35f5,0x000de4ea,0x001f2c5a,0xfff91584,0xffa1790f,0xff590316,0xff4aee92,0xff6ddf02, -0xfffa62b6,0x00443dc5,0x001fcdf2,0xfff13460,0xffd21928,0xfffa096f,0xff8a6609,0xff830ef8,0xffbdf77f,0xffbca387,0x000e7ace,0x00b0562a,0x015a3b56,0x013b0960,0x005744e7,0xff5c4d8c,0xff339812,0xffd1bded,0xffff0a95,0x005ef504,0x010e2f3e,0x004e3561,0xfffc8303,0x0016f62a,0x0014c02b, -0x0032f63c,0x002ac0ec,0x0046d2bd,0x0055648c,0x0053c81b,0x003b15f2,0x0035547f,0x002b7791,0x004cbc7d,0x001897af,0xff92141d,0xff42f76a,0xff179de3,0xff3038e6,0xffe6aa5b,0x00260792,0xffb741af,0x00188499,0xffd715ee,0xff2112c2,0xff8ccadc,0xff24f9a1,0xfee2b402,0xfdf2ec60,0xfe6490fa, -0x0032cb8f,0x00b65a77,0x00b2f309,0x00618720,0x002e3349,0x00287b61,0x0028f936,0x007f3003,0x008c9c6e,0x0050ea69,0x0027f732,0x000c6319,0x0030358d,0x0036b949,0x002376b6,0x0003182a,0xfff8720e,0x00028227,0x0008d28d,0x003eb885,0x003547a4,0x001abc49,0xfff897a2,0x002a1397,0x00c3739e, -0xff97efe4,0xff58ceb3,0xffc01a40,0x001c1e25,0x0073c9af,0x00cbed7b,0xfff1b454,0x010ad24e,0x0195b4ac,0x01921ff4,0x01328c48,0x0050210d,0xfff1fc60,0x002922f9,0x0090f2a2,0x0073369e,0x0057cd87,0x001a4b30,0x0016d4a8,0x0013a837,0x00208749,0x0035093c,0x0020624e,0x000743c9,0xfff4bf11, -0xffdb64db,0xffd999e4,0xffea9b10,0xffebd72b,0xffe63a92,0x005535e0,0x008af476,0x009dc38a,0x00758ea2,0x00146b96,0xff94dad0,0xff944a3f,0xffb568da,0xff910a53,0x00eb4e05,0x01002e9e,0x0006c260,0x008dcbe6,0xff716816,0xff4c688d,0xff2247ad,0xff69fd80,0xfff7a2a8,0xfffbaa07,0xfff16663, -0x0003bbc0,0xffef7ac0,0xfffa74f5,0x00091418,0xfffdf0a9,0xffeff134,0xffec31da,0xffda2243,0xffc84cd0,0xffcbcf05,0xfff4f31a,0x0003a8a0,0xfff58c67,0xffface2e,0x0018617c,0x002a4708,0x00405ca4,0x002fe0d9,0x002f208e,0x002e93ce,0x0067476e,0x0091bdff,0x00dd45a8,0x00d7c079,0x003c4fea, -0x00595824,0x00455528,0x002fe1e4,0xffd1dc74,0x00466a77,0x007c439a,0x003a0a04,0x00213d63,0x001dc790,0x00126732,0x0011bb08,0x0005239d,0xfff10b38,0xffecf4e5,0xffddf77d,0xffb6a982,0xffb00aa3,0xffc9e0ca,0xffcc8976,0xffe6daeb,0x00164e75,0x0003dca3,0x00056fee,0x000c74b2,0x002ab076, -0x00327afe,0x00288017,0x001c0097,0x00106c78,0x00072725,0x0009ac93,0xfff39895,0xffc78b47,0xffece79b,0x000f9d8a,0x0035bcba,0x00159cc7,0xfffc6e4b,0x000ff03a,0x00191d52,0xffcdbe0b,0xffb3bea2,0xff7e3e2b,0xff4ad623,0xff00a03e,0xfeea3478,0xfef7b792,0xff27eaa1,0xff3921f4,0xff50b89b, -0xff696964,0xff88b43d,0xff991ce4,0xff99c50d,0xffa9f3e2,0xffc1903e,0xffeec90e,0x001b6cc4,0x002f8ab3,0x00206009,0x001f6feb,0x00173f5f,0x0014cccd,0xfffab70f,0x0005886d,0x002bb37e,0x0027972f,0x002256e2,0x000f658e,0x0001d34e,0xfff68f83,0x00057bca,0x00069441,0x0002bea3,0xffec7508, -0xffe8203b,0xfff5e475,0xfff75dd3,0xffe40fc6,0xffdb9202,0xffdb8ca0,0xffb60b14,0xff87976e,0xff588339,0xff50765e,0xff4d4ca1,0xff3cd60b,0xff4c848f,0xff504edf,0xff5cc082,0xff98758c,0xffd06723,0x0004fc99,0x0005d1e0,0x000da6a8,0x0020b3c5,0x001a3dac,0x0012f47d,0x000f5430,0x0005be87, -0xfff75eb1,0xffe68f4a,0xffea29f4,0xfff08487,0xfff77c17,0xffec87b7,0xffe4b435,0xffd91fc6,0xffe43390,0xffee9bb0,0xfff8517d,0xfff4b9d6,0xffc05fb4,0xffbf7553,0xffb00839,0xffb4f692,0xffac115d,0xffad7439,0xffb7bec6,0xffb78659,0xffc1e309,0xffc289a0,0xffc3ca3d,0xffc5c930,0xffc62556, -0xffc09630,0xffc16ea4,0xffbcfaff,0xffc08f3f,0xffc87af7,0xffd01459,0xffd86adb,0xffd826af,0xffdaf13b,0xffdc78bf,0xffde9482,0xffe2d371,0xffe5b257,0xffe298d7,0xffdc14c2,0xffd824f0,0xffd5694e,0xffd28daa,0xffcc72c1,0xffcac20f,0xffc570f3,0xffc27285,0xffc12e3f,0xffc375d1,0xffc59bd4, -0xffc01c2a,0xffbe91dc,0xffbbca15,0xffc3132f,0xffbece17,0xffba46d0,0xffb77429,0xffb6896c,0xffb7326f,0xffb556a2,0xffb5b322,0xffb6294a,0xffbb05a9,0xffbfe16d,0xffc19f4e,0xffc43ce5,0xffc70a7f,0xffcba179,0xffcb9057,0xffcc016e,0xffcc820d,0xffcd08b9,0xffcd3e27,0xffcf0741,0xffcb9741, -0xffca0fe8,0xffc7b3b3,0xffc56741,0xffc3c2b9,0xffc2b76d,0xffc31423,0xffc3d74a,0xffc42789,0xffc45020,0xffb46a41,0xffeba319,0xffec4f21,0xfff70a63,0xfff7c1bb,0xfff63e7b,0xffe603dc,0xfff39818,0xfff53a10,0xffec50f9,0xfff9db5c,0xfffc581c,0xfffc2dc3,0xfff4bb5d,0xfff2afe9,0xfffcbab3, -0xffeb1348,0xffe6573a,0xffe34b4e,0xffe78932,0xffeae405,0xfff1d695,0xffefa00d,0xffecbfd9,0xffe66ee9,0xffe107c3,0xffe047c5,0xffe07174,0xffee1272,0xfff12585,0xffee704e,0xffeb99a0,0xffeaee63,0xfff12392,0xffe421d1,0xffe18800,0xffe61ec4,0xffe6b078,0xffe44296,0xfff817e1,0xfffdef51, -0xfff4ea2d,0xffd3c722,0x00053db2,0x00102993,0xfff8269a,0x001107df,0x0014a92c,0x001bad45,0x00050c93,0x00002946,0x00185d54,0xffe75b17,0xffd7a624,0xffd0f6d5,0xffdaacf8,0xffe6c18c,0xfff53b41,0xfff1d852,0xffe661cf,0xffd30a83,0xffc19a27,0xffc34ad8,0xffce3058,0xfffcbc58,0x000bc2c9, -0xfff95694,0xffec34f3,0xffe0b3e6,0xffeb0625,0xffcfcc73,0xffcd1e7d,0xffd8eb1f,0xffd95e0c,0xffe3ee8a,0x001dfb68,0x00292669,0x001effe3,0xffd0ac1f,0x0018afab,0x00253f21,0xfff9cece,0x00422a9f,0x00503252,0x0048b621,0x0022fb47,0x00123c9d,0x00409836,0xffe2bd54,0xffcad7e5,0xffc4561d, -0xffd1b552,0xffe71c22,0x00033079,0xfffe0a2e,0xffe86be9,0xffc4aa3f,0xffa049b2,0xff9ec4f4,0xffa9db25,0xfffa37f5,0x001272d2,0xfffa0fff,0xffeead90,0xffdcd17d,0xfff7b06d,0xffb69788,0xffacaa04,0xffcd177e,0xffc54d42,0xffd51350,0x000f5750,0x0013b9de,0xffed2fe1,0xffa69977,0x005a68ab, -0x0088fedf,0x0030dc99,0x007803c0,0x00805e25,0x0076bd7c,0x0080dd3b,0x00749fac,0x00725f27,0xffec71be,0xffb9ece0,0xffb30f34,0xffc1532b,0xffdf411c,0x000f3a02,0x0004da86,0xffdb35ab,0xff95d3c5,0xff5c6ae5,0xff63d7ae,0xff931499,0x00322d9e,0x0071305c,0x002d5993,0xfff838a2,0xffcbf724, -0xffe28fe8,0xff9639c6,0xff9d23dd,0xffca043a,0xffc39394,0x00007cd8,0x0080a001,0x01374f96,0x01343d30,0x00723e1f,0xff68ff9a,0xff2064b3,0xffab40dc,0xfff0c55d,0x0045b1ba,0x00d24c9f,0x004cec46,0x00058717,0xfffd975b,0x00197ccd,0x00363474,0x001248ec,0x002cd7df,0x003a1087,0x0041714b, -0x0023972e,0x00227175,0x00221e77,0x00375f3a,0x00012214,0xff867a86,0xff44f404,0xff2ea70d,0xff7260b8,0x0002ff70,0x00322e88,0xffefb252,0xfffe2ed3,0xffa8bf9a,0xff2bbc5e,0xff886540,0xff1fa8d6,0xfeef3588,0xfe29ce80,0xfe7610dc,0xffa7afc0,0x00af8695,0x00dc2013,0x0077acc1,0x0021f8b9, -0x0011cceb,0x001431a4,0x0061caf0,0x007907b7,0x00588356,0x0029c0a7,0x000bf13c,0x002abcb0,0x00322ef8,0x001e0384,0x00056f1f,0xfffe0d77,0xfffacc74,0xffea082e,0x0013d70a,0x0015d51a,0x00116ae2,0xffff1694,0x002e8364,0x00adec1f,0xff9b4899,0xff69aa06,0xfff42520,0x00143779,0x0077d1b8, -0x01156784,0xffeee963,0x00cdca14,0x0187db54,0x01564cae,0x00f90211,0x0021eb03,0xffaec7a7,0xfff22118,0x0094dc4f,0x00785454,0x005a363d,0x0011e2db,0x000e8161,0x00084be1,0x000ef208,0x003898cf,0x002ef056,0x00037196,0xfff5089f,0xffe1434f,0xffe4e3fc,0xffea50c7,0xffeb8402,0xfff3a2b7, -0x005a8ae5,0x008c0752,0x009b63b0,0x007a7180,0x001f0a4b,0xff8ea649,0xffc69f83,0x00040aa8,0xfff58bc6,0x00c33d7e,0x0090057d,0xffa1115d,0x00261ded,0xff6455ea,0xff3b5721,0xff332f79,0xff7754ea,0xfff298aa,0x00039a2d,0x0001ff51,0x000a28fc,0xffed6efc,0xffed5e49,0xfffbc2fe,0xffe5f2ed, -0xffdc1fef,0xffedcc8f,0xffcfcf99,0xffbccda2,0xffc30e4a,0xffe921cd,0xfff05850,0xffd84d3e,0xffe84f00,0x0004827a,0x0019d1bd,0x002d8794,0x00287812,0x004ace71,0x005e2acb,0x00899bc3,0x008a34f3,0x00ea08a2,0x00c07a2a,0xfffd5d38,0x000507a8,0x00047b77,0x000c1970,0xffbedde9,0x008712d4, -0x00991552,0x0060dd2e,0x00463184,0x003ea968,0x003484e6,0x0028262d,0x00189e4c,0x00015945,0xfffc974e,0xfffcc3ca,0xffc97190,0xffb7fa6e,0xffc9b68c,0xffc9e675,0xffe47ef5,0x0008503e,0x00061917,0x000c6654,0x000d7a20,0x002bc602,0x00324191,0x00297873,0x001c5e15,0x000d31e3,0xfffcb2ca, -0xfff0431e,0xffdcae38,0xffc870a8,0x0000e026,0x003aa6f0,0x0090503e,0x0055c1ce,0x0035c173,0x004dffe6,0x0065f3cc,0xffae0293,0xffa039ab,0xff64cd27,0xff35a540,0xff043da3,0xfef6f40e,0xff0db54a,0xff48732a,0xff4e590c,0xff5f83d4,0xff78633a,0xff95cf41,0xffa8beb2,0xffab8e74,0xffa6ed4b, -0xffb2d273,0xffd43f7e,0x0011f0ed,0x002cf231,0x0023ae92,0x00245fc9,0x00220a3b,0x00289e7c,0x00059b66,0x000a42c1,0x0020bf35,0x002c2d0c,0x0032bb56,0x0022d4b7,0x00155c09,0x00030016,0x0003f263,0xfffc457b,0xfff319db,0xffd23c42,0xffc90f76,0x0003b7b3,0x000313cc,0xffea5bfb,0xffd5bdaa, -0xffc7d0db,0xffa967a6,0xff8091d9,0xff5621c2,0xff540986,0xff57c38f,0xff4a8f6c,0xff5ebc53,0xff5f7d66,0xff73745f,0xff9c0ed4,0xffc8bb93,0xffe92a85,0xfff83ae1,0x000a7e47,0x002beb17,0x002881ab,0x002282dd,0x0022ce34,0x0017e7eb,0x000af675,0xfff94410,0x00006c32,0x000798f3,0x00112167, -0x000cdf1d,0x000cd17e,0x000975c2,0x000c7c30,0x000dce17,0x001217da,0x00099cac,0xffce1571,0xffcedb6b,0xffc12c2d,0xffc98497,0xffc3a405,0xffc43e40,0xffccb104,0xffcf1d87,0xffd3a10d,0xffd2c70a,0xffd10090,0xffd21727,0xffd06636,0xffc96295,0xffc77b76,0xffc4e7c1,0xffc97f51,0xffd221fb, -0xffd24592,0xffe17175,0xffdf0781,0xffe0f364,0xffe133ec,0xffe2ef8a,0xffe68d0c,0xffe95bf2,0xffe62c58,0xffdff05e,0xffdb968f,0xffd7c1e7,0xffd34b6d,0xffcd9842,0xffcdbab6,0xffccc103,0xffcc434a,0xffcd02e9,0xffd69fca,0xffdadb06,0xffcf4131,0xffca4e6d,0xffc282cb,0xffd183e6,0xffc873bc, -0xffc18674,0xffbe7758,0xffbc5f87,0xffbbec79,0xffb8727e,0xffb7aa5c,0xffb664e8,0xffc18e5d,0xffcbc13e,0xffc09fa7,0xffc9305c,0xffceee90,0xffd9829d,0xffd78260,0xffd8206a,0xffd85a64,0xffd8a5bd,0xffd88abc,0xffd9bd65,0xffd7306d,0xffd64a04,0xffd4997d,0xffd31ce2,0xffd20e50,0xffd08aed, -0xffd2647d,0xffd39f3a,0xffd4bbf6,0xffd61caa,0xffc91940,0xffed7a9e,0xffed7e7a,0xfff52431,0xfff7bba3,0xfff6e179,0xffe67031,0xfff495e0,0xfff539c6,0xffef1213,0xfff99c66,0xfffc29ba,0xfffea224,0xfff32d17,0xfff10934,0xfffcc24e,0xffeca8cd,0xffe83582,0xffe30206,0xffe82c15,0xffeb36d3, -0xfff20b4d,0xffee8f8b,0xffebd164,0xffe6b206,0xffe2fc31,0xffe3bbe1,0xffe5dacf,0xfff38d09,0xfff68fef,0xfff2d828,0xffef2e0e,0xffed4d65,0xffefb783,0xffe6e668,0xffe504c0,0xffe97233,0xffe95092,0xffe6dfb7,0xfff4511f,0xfffc6062,0xfff606af,0xffd62a8e,0x0001eb60,0x000e0d31,0xffff9497, -0x0010ea2c,0x00140a6a,0x001f9a75,0x000188f1,0xfffbffc1,0x0015aaa7,0xffe88277,0xffd9ba1a,0xffcf380b,0xffdb1336,0xffe64601,0xfff36220,0xffeaa254,0xffdf896d,0xffd16bf5,0xffc4a920,0xffcb7baf,0xffdb3c0b,0x0009b5d4,0x00168e95,0x0001820f,0xfff0cbc9,0xffe2078b,0xffe588c5,0xffd4461c, -0xffd4e0fc,0xffe02a02,0xffde7f55,0xffe5d8aa,0x000c84a7,0x00214b9f,0x001e219c,0xffcfdd8b,0x001362c8,0x001de03d,0x00021ee0,0x003ea332,0x004cc98f,0x00513bf2,0x0019e4f7,0x000716b4,0x003effa9,0xffe1c186,0xffcdd124,0xffbff5db,0xffcf5886,0xffe2f19f,0xfffd8fc8,0xffeda3fa,0xffd986bd, -0xffbea968,0xffa3acde,0xffac605a,0xffbe396a,0x00124d1e,0x0028e738,0x0009a548,0xfffaac06,0xffe21547,0xffe94007,0xffbebd37,0xffb80910,0xffd6736a,0xffcd50a1,0xffdc24cf,0xfffe3577,0x00113253,0xffee0a00,0xff9f587a,0x00451d7d,0x007f8e5e,0x003c3d49,0x007d04b7,0x008ad18f,0x0083049d, -0x0066d2df,0x005ad813,0x007104dd,0xffe2d6a9,0xffb937de,0xffb36b0c,0xffc4e04c,0xffe0d583,0x0009579d,0xffe927c4,0xffbfbde6,0xff8bc13e,0xff652ab9,0xff7d8e11,0xffb66067,0x005a04e1,0x008cff4c,0x003d021c,0x0001f7a4,0xffca75c3,0xffc78472,0xff9f7f72,0xffb4b3eb,0xffd9a3c7,0xffcf1802, -0xfff2fbae,0x00503cc4,0x01049f42,0x011ecc5e,0x008a36f6,0xff854ffc,0xff242aa6,0xff925089,0xffea572c,0x00330101,0x008d2469,0x00507d7e,0x00160a3b,0xffe70b4a,0x00206e0c,0x0039279e,0xfffd199c,0x00135532,0x001b4100,0x002757a7,0x000e5588,0x0013c2b0,0x001b161f,0x001f8cf1,0xffebb352, -0xff89083b,0xff455b35,0xff437e2e,0xffbcccae,0x001f454e,0x00404c1d,0x002940ac,0xffee4aa1,0xff8a245b,0xff447d8b,0xff8dbc63,0xff306844,0xff1debb0,0xfe6e6e04,0xfe92ab9e,0xff319165,0x00960fa9,0x00f93e54,0x009317e4,0x001c1cd1,0xfffafea7,0xfffc8de4,0x00438b7b,0x0064bbe3,0x005bb7b8, -0x002f2046,0x000f9a7c,0x0024fbb2,0x0023ec2a,0x0012fa23,0x0008cfb2,0xfffe605f,0xfff53994,0xffdbce69,0xfff3bb96,0xfffb5be3,0x00014429,0x000a02e6,0x00315e31,0x00845b70,0xffa05a7c,0xff80d78f,0x002df193,0x00195edd,0x00855c7e,0x01546314,0xfff604c5,0x008fa574,0x01826120,0x010131fa, -0x00a0fabb,0xfff74be6,0xff7eda4f,0xffc1dfde,0x007c065e,0x007355ee,0x005a3cea,0x000b3314,0x0004d899,0xfffc8917,0x0004e0b5,0x0037082a,0x00378595,0x0001f96e,0xfffc25f2,0xffefe5b8,0xfff37e6b,0xffe7f8c9,0xffecad8a,0x000913df,0x00583591,0x007efcca,0x00866582,0x006e56a5,0x00237f7e, -0xffa6b1af,0xffec0abf,0x003fd76a,0x0082592f,0x005b0222,0xffda8887,0xff3d00ab,0xffbf0aca,0xff654a7b,0xff336a05,0xff5610c3,0xff973883,0xffed0a26,0x000eec8e,0x00152274,0x000f0428,0xfff53dcc,0xffe81be3,0xfff338eb,0xffd7e8c0,0xffd11ef4,0xffed7e67,0xffc85a75,0xffb6e7ab,0xffbf9e41, -0xffd99344,0xffda404f,0xffc4fbfd,0xffd8f69e,0xffef843f,0x00082c65,0x0013c7fd,0x00225607,0x0060b661,0x008a36ec,0x00a61e40,0x0085b370,0x00dd488d,0x009de619,0xfff4f823,0xffcdac1b,0xffd3adef,0xffecf8d4,0xffb5b4d8,0x00be497c,0x00a65a2d,0x0076f8fa,0x00570e93,0x004e2e2d,0x00400a15, -0x002c6750,0x001c1054,0x0009e778,0x00082fe6,0x0015b824,0xffe38b3e,0xffc8b617,0xffc7c17d,0xffc9e600,0xffe060ed,0xfff4d74f,0x00053091,0x0011ca22,0x000fe29e,0x0028d4b8,0x002c50c9,0x0022393e,0x0019165c,0x0009b898,0xffee936e,0xffd6eb4c,0xffd1f6b9,0xffd934af,0x00239a41,0x0065984c, -0x00c1e9a1,0x0086c582,0x0074bfa8,0x009c5613,0x00b4c411,0xff911c3a,0xff91bc13,0xff4f0000,0xff278379,0xff0ed3d1,0xff132264,0xff321f0b,0xff69c274,0xff671d73,0xff731949,0xff8bad0e,0xffa1276b,0xffb3e0a7,0xffb9372e,0xffa8c1a3,0xffad82f2,0xffc219dc,0x00023329,0x00211c9b,0x00270c28, -0x00294289,0x002a96d6,0x0032ba5e,0x00173c3c,0x00134592,0x001e536f,0x003253fe,0x003da98b,0x0035e527,0x00278c9c,0x00130742,0x00092860,0xfff698ea,0xffe31d99,0xffbbcc92,0xffa94689,0x00044b0b,0x00016fe3,0xffe64870,0xffca9fad,0xffb05059,0xff99a3fe,0xff785454,0xff56a7ba,0xff5ad588, -0xff642637,0xff5c7e02,0xff76f3e6,0xff7a86ab,0xff960847,0xffa90962,0xffc5b9a9,0xffd2e3b2,0xffee9ee1,0x000c791c,0x0034db76,0x00303638,0x002dcaa7,0x002f905b,0x00264ec6,0x001e3bf1,0x00120afb,0x0018aed1,0x001ee5bb,0x00299521,0x0027c45f,0x002a2bbf,0x0029efeb,0x002312b2,0x001b7f3e, -0x0018c247,0x000f2a97,0xffdb7177,0xffddfb1c,0xffd1b9d6,0xffd8a91d,0xffd479c0,0xffd33982,0xffd7e17a,0xffd9350c,0xffdb0a7a,0xffdab7f7,0xffd7eee7,0xffd9c375,0xffd781d5,0xffd1c9de,0xffd00d50,0xffd1cf30,0xffd77eef,0xffe011c1,0xffdd1b7c,0xffef075f,0xffeb4418,0xffebc405,0xffeaaab6, -0xffeb50ca,0xffeccbd7,0xffedde33,0xffeb01a4,0xffe54d0e,0xffdfa249,0xffdab36c,0xffd59c3b,0xffd1233f,0xffd39327,0xffd65411,0xffd7c894,0xffd96465,0xffed97dc,0xfff2f391,0xffe61d71,0xffdfb53f,0xffd565c5,0xffe496fb,0xffda2f96,0xffd1a991,0xffcfcfeb,0xffcdc19f,0xffcd7c34,0xffc9c9b5, -0xffc906c1,0xffc78406,0xffd57a2d,0xffe06ae7,0xffd0e654,0xffdbef60,0xffe21965,0xffedd81e,0xffeacc2c,0xffeb139f,0xffead1f4,0xffeab091,0xffea48f0,0xffeaca5b,0xffe898b6,0xffe7d2fd,0xffe6dd60,0xffe617e2,0xffe528b4,0xffe2c014,0xffe59b38,0xffe732f9,0xffe92ed0,0xffebc394,0xffe633cf, -0xfff0afca,0xfff070b3,0xfff5ced0,0xfff89d44,0xfff7dfdc,0xffe90cb8,0xfff7491e,0xfff65f08,0xfff271c9,0xfff96eee,0xfffc1239,0x00016492,0xfff32cb9,0xfff0ce0a,0xfffc7ea9,0xffef1705,0xffeb6778,0xffe2c4d0,0xffe8eb1e,0xffec20c1,0xfff337b5,0xffef2158,0xffecbd31,0xffe8a544,0xffe6ab29, -0xffe8847b,0xffec7cc2,0xfff87868,0xfffb69d8,0xfff7f369,0xfff3f4a5,0xfff10141,0xffef53c4,0xffea64f6,0xffe92c5e,0xffed2f68,0xffed537e,0xffed9c1b,0xfff5fa06,0xfffdad27,0xfffb154f,0xffdec1c8,0x000226e9,0x000e01ed,0x00075747,0x0011057b,0x0013ab0e,0x0022f644,0x00011a4d,0xfffb3e5a, -0x00123530,0xffec0037,0xffddfec6,0xffcdfd26,0xffdb0d97,0xffe42a1c,0xfff05288,0xffe52a26,0xffdb8dd4,0xffd1e7ef,0xffca5897,0xffd54bd1,0xffe9eb7e,0x0012aada,0x001caa6a,0x0008ed85,0xfff71d52,0xffe65f21,0xffe1f50f,0xffd8d854,0xffdc30e3,0xffe77a8d,0xffe66b53,0xffecc42b,0x00038ab9, -0x001b60cf,0x001e2a3a,0xffd70423,0x00137210,0x001ad164,0x000c1193,0x003a1eb8,0x00479376,0x005a11f9,0x0016be83,0x0002cc5f,0x003a938e,0xffe525ec,0xffd3e6b5,0xffba3eac,0xffcbba2c,0xffdcfca3,0xfff5ea5a,0xffe0353a,0xffcf28f0,0xffbc84c9,0xffaba3b2,0xffbc068b,0xffd5aac4,0x002172c2, -0x00356633,0x00162c2b,0x0007180e,0xffe9b10c,0xffdc8b1a,0xffc4cc76,0xffc10d9f,0xffde3037,0xffd8aeb0,0xffedf45a,0xfffe277e,0x00178bb8,0xfff85c71,0xffa7910d,0x0036666a,0x00757519,0x0047c902,0x007f35bd,0x00940ebb,0x00923c5e,0x0052eba7,0x0046f1bc,0x006def88,0xffe0654a,0xffbdc307, -0xffb03d84,0xffc3cead,0xffdb43f4,0xfff9b290,0xffcd9d3f,0xffa8e950,0xff867564,0xff730827,0xff99dff3,0xffe025df,0x0073a283,0x0095a37b,0x00463085,0x000c87af,0xffcf6a36,0xffb2d73d,0xffa5feeb,0xffc603d6,0xffe8a8d5,0xffe12351,0xffe558e3,0x001ce4f0,0x00c28f22,0x00f712cb,0x00990be3, -0xffa8909d,0xff39dcb5,0xff88481a,0xffe4eaaa,0x0024251b,0x004e76ba,0x0059826e,0x002c89e3,0xffd7813d,0x00266718,0x00392235,0xffef62a7,0xfffe30b3,0x0000188b,0x00104c64,0x00041a16,0x000ff60d,0x0019fa2c,0x00110594,0xffded145,0xff8ba31a,0xff458b9b,0xff58dd30,0x000478b0,0x003aa5dc, -0x004d62b7,0x005253aa,0xffde1a4c,0xff71f27f,0xff5e0f6e,0xff95804b,0xff4def6a,0xff64705e,0xfebe7858,0xfebc81fa,0xfef01e94,0x0068e259,0x00f7963a,0x00a948fc,0x001f4ac2,0xffebda34,0xffe3ef90,0x0025b81a,0x004f1f89,0x0057b5be,0x0033a4de,0x00132c64,0x0020a3c4,0x000f23de,0x00008366, -0xffffded2,0xfff4ee5e,0xffedacc8,0xffd93117,0xffd98d5d,0xffe46b1d,0xfff26c23,0x0021860a,0x003f63fe,0x0055c7a1,0xffa24dae,0xff92eed8,0x00565c48,0x002c2832,0x009ef7ff,0x017d5630,0x00038451,0x005af498,0x018099e4,0x00a38fee,0x003efe1d,0xffdb95a0,0xff6fcdc5,0xffa88f3e,0x004d7901, -0x0061d5b1,0x005597d3,0x0007ccaf,0xfffb52bb,0xfff1cc22,0x00016f8d,0x002f2e53,0x00397369,0x00060541,0x0008b53e,0x00031dcc,0x0005fea3,0xffecc1f3,0xfff3e2b0,0x0020c3b4,0x004ef7b9,0x006aec25,0x006f553d,0x0059083b,0x0022aa20,0xffd49e01,0x00002da9,0x0065188c,0x0111a510,0xffe7610e, -0xff27920f,0xfee4d3b0,0xff6d2b85,0xff6be746,0xff32e5fe,0xff828cd6,0xffc0c4ff,0xffec2aa9,0x00163853,0x0020aaed,0x000e0e86,0xffff0589,0xffe674bd,0xffedf23e,0xffd30e13,0xffcf76ff,0xffebe97a,0xffc74235,0xffb84e9c,0xffbee02b,0xffca9ad3,0xffc73ac5,0xffbc0239,0xffc93c89,0xffd7ef28, -0xfff0b569,0xfffbfe84,0x00245a50,0x006f4b8b,0x00a4f9f3,0x00b78eaa,0x008d0f77,0x00be60cd,0x0076d1b0,0x00130104,0xffbe6628,0xffc1b90d,0xffd4f234,0xffb1cda3,0x00d92d29,0x00937c72,0x0079c545,0x005958ef,0x00568580,0x0042b1f8,0x002a5bbb,0x00157ded,0x000b35cb,0x000eae6e,0x0024f746, -0x0000eb0f,0xffe036f7,0xffc782ed,0xffc9a0f0,0xffd880a6,0xffe2ff33,0xffffe49b,0x0011dfdd,0x0013d12a,0x0023697c,0x002615e8,0x00201908,0x00151186,0x00021481,0xffde2dbc,0xffd0712a,0xffde23d7,0xfffb592c,0x00474f4e,0x0080b72a,0x00c9b02f,0x00a23dd8,0x00a5057a,0x00d5255c,0x00eaf92a, -0xff897d1b,0xff8c89d3,0xff464d41,0xff24cb11,0xff21520d,0xff3cf76a,0xff6401a1,0xff8ced81,0xff85f7b5,0xff8bff51,0xffa11c52,0xffaabf17,0xffba2f12,0xffc01f70,0xffb1a74a,0xffb1c5de,0xffb59d03,0xffee8aed,0x0010327e,0x0026c54c,0x002a91b6,0x002f7c8d,0x0035a81b,0x0027e5af,0x0020a49f, -0x002220b9,0x00351774,0x003cfd98,0x003e36f6,0x003027a6,0x001e8403,0x0010150e,0xfff895a1,0xffdeb45a,0xffb3dbe6,0xff9f0957,0xfffb6f38,0xfff75908,0xffdad059,0xffbd651c,0xff996c28,0xff897540,0xff6fefae,0xff57e816,0xff6232aa,0xff70fd8b,0xff70a701,0xff8f1fa1,0xff9812ef,0xffb6a43c, -0xffb949cb,0xffc70c15,0xffc75342,0xffe8186f,0x0009f0eb,0x002e068d,0x002a105d,0x002da787,0x00318e5b,0x002e9d05,0x002cc4eb,0x002860bf,0x002b874d,0x002f4eb6,0x0037b626,0x0036c818,0x0038433b,0x0036bf50,0x0026c6b3,0x00188a53,0x00103efc,0x0007e126,0xffe6ee1c,0xffea8529,0xffe007a8, -0xffe2c814,0xffdfbd8e,0xffdd55d3,0xffde0339,0xffdc53aa,0xffde4b10,0xffdf5268,0xffdcfa35,0xffdfd7c4,0xffdded64,0xffdaf83d,0xffdb74c2,0xffe222b0,0xffe86018,0xfff06896,0xffee3e00,0x0001c8f5,0xfffdb178,0xfffc2328,0xfff9dc29,0xfff83817,0xfff7199f,0xfff66d5c,0xfff2a12f,0xffecc87b, -0xffe59aec,0xffdf5333,0xffd9f52e,0xffd7455d,0xffdc25fc,0xffe15ecf,0xffe3c491,0xffe4ed2f,0xfffdb4e9,0x0002f677,0xfff9217a,0xfff38df6,0xffeab21b,0xfff2e3ae,0xffeab6ec,0xffe2ddfa,0xffe2a4a6,0xffe1466d,0xffe1e95b,0xffdf391d,0xffdf461b,0xffde9d71,0xffeadfc3,0xfff2e5bf,0xffe7197b, -0xfff0b9c3,0xfff52b56,0xfffe9d5d,0xfffacea2,0xfffa91ca,0xfff9bab8,0xfff9495a,0xfff890dd,0xfff83df0,0xfff64597,0xfff58304,0xfff51e3c,0xfff4e304,0xfff3e3bc,0xfff07802,0xfff362e9,0xfff4f216,0xfff77d2b,0xfffafa36,0xfffa9062,0xfff3a171,0xfff3a7d9,0xfff71597,0xfff9c82b,0xfff9a5af, -0xffee2c19,0xfffa0ca7,0xfff880b7,0xfff6ebd2,0xfffa6b8c,0xfffd2077,0x00045d47,0xfff599f4,0xfff30b19,0xfffce7d6,0xfff27a8b,0xffef17f1,0xffe404ca,0xffea7d3b,0xffed3365,0xfff3aacd,0xffefac16,0xffedc96b,0xffeafc41,0xffea6a59,0xffed1f9c,0xfff31488,0xfffbf3aa,0xfffe91f1,0xfffb9e0f, -0xfff8149a,0xfff46747,0xffef8f6f,0xffece353,0xffec1de5,0xfff02c3d,0xfff110fd,0xfff5faf2,0xfffa7821,0x00023b9d,0x0002081f,0xffeaea9a,0x0004dfa5,0x000efa2b,0x000e4419,0x00104d47,0x0011e14d,0x00232f77,0x0001a38c,0xfffc34d6,0x000d3b41,0xfff16122,0xffe4176b,0xffcd46e1,0xffda9cda, -0xffe188db,0xffeb6944,0xffdfdf85,0xffd89771,0xffd39559,0xffd0d419,0xffdf0b4a,0xfff8ac21,0x001812ce,0x001e6801,0x000c942e,0xfffc6f48,0xffeb571f,0xffe0732f,0xffdb1c39,0xffe068d0,0xffeda2e7,0xffeef2f7,0xfff660fe,0x00004cb7,0x00176a33,0x001e3db0,0xffe41815,0x0016f041,0x001a8379, -0x00164a8e,0x0033f62f,0x003ef3eb,0x005dad13,0x00167266,0x0003cee9,0x0031cf46,0xffec8c5a,0xffdd2f99,0xffb4fe3e,0xffc8a9f9,0xffd64dfb,0xffebfae2,0xffd3b6e2,0xffc71475,0xffbdd1da,0xffb58e86,0xffcbc412,0xffef94bb,0x00299032,0x003907ae,0x001b7604,0x0010fe92,0xfff17346,0xffd4ccc4, -0xffc68925,0xffc4bac6,0xffe45e7a,0xffe4e0bc,0x00062673,0x0009cdab,0x00252791,0x000a354c,0xffbe3260,0x003089e7,0x006dfde1,0x00548d2c,0x007f8980,0x0099dc95,0x009f22a3,0x00457a45,0x0038faed,0x0066af52,0xffe5b550,0xffc7943a,0xffa859e2,0xffbdb6fd,0xffcef5b0,0xffe323d5,0xffb20671, -0xff95d27d,0xff86977d,0xff8373cc,0xffb69f8b,0x000e85dd,0x0082c7ee,0x008efe1e,0x0043ad0e,0x00142d14,0xffd8d4e4,0xffa85f6e,0xffa70de3,0xffcdffdb,0xfff78880,0xfff853c5,0xffd211fa,0xffe8cbb8,0x00735b11,0x00b9fde2,0x009c83bf,0xffccd812,0xff5a00a4,0xff869905,0xffdae5cf,0x0015aacf, -0x001f9fed,0x00661328,0x0045f2f4,0xffd01fcb,0x00288fb6,0x00351864,0xffede56e,0xfff0e7d1,0xffee7b5b,0x0000e0d3,0x00047c38,0x00154a1b,0x001a1d4f,0x000be9b3,0xffdaa335,0xff891882,0xff4aa8e2,0xff72c380,0x0040227b,0x004e7319,0x0052f16b,0x0065a4c9,0xffcdd1e4,0xff5efea6,0xff64dfaf, -0xff959659,0xff74b7e5,0xffaeeacb,0xff16653e,0xfef0ab86,0xfedf9d36,0x0034fc07,0x00d7ac81,0x00add09d,0x0027975b,0xffe69325,0xffcd30bb,0x00096076,0x0038d829,0x004e0374,0x00347d20,0x00146ec1,0x001dd5dd,0xfff737ce,0xffe76b56,0xffea6dfb,0xffe4a7cc,0xffe24129,0xffd4e7fa,0xffc36c09, -0xffd1a681,0xffe02f80,0x0045f270,0x005b3598,0x002aa1f0,0xffa7002b,0xffa75cc7,0x006f98ce,0x0049120a,0x00bac741,0x0187b208,0x00164af4,0x00179abb,0x01665c8a,0x004d5da8,0xffe44edd,0xffd667b8,0xff7d3d0b,0xffa6df41,0x00164e2d,0x00439d66,0x0048a6c2,0x00094deb,0xfff36c86,0xffe959c2, -0x00021dc2,0x00235e78,0x003460ea,0x000c8383,0x0013aca4,0x0013cd94,0x00181312,0xfff7f267,0x0001253b,0x0035c90d,0x0049b765,0x005bd98b,0x0057d334,0x003b08e7,0x001b9cea,0x0009f88c,0x0010e1e4,0x0073e139,0x0160397a,0xff87db1c,0xfea71ea8,0xfeb1c308,0xff2ec7d4,0xff7fd951,0xff416599, -0xffab223b,0xffe7e127,0xfff7626c,0x0015309f,0x001edabd,0x000ae652,0x00057aba,0xffe4a55e,0xffe8c26b,0xffd5ac04,0xffd62b4a,0xffe9e172,0xffcc4363,0xffbf480f,0xffbf29f7,0xffbd97c5,0xffb823d2,0xffb8dd78,0xffb9e290,0xffc19d29,0xffd7c2d0,0xffe9d142,0x00281147,0x0075afad,0x00ace83a, -0x00bbe84a,0x009d9afe,0x009b4ad6,0x0052a002,0x0037bf09,0xffd377cd,0xffd0cbb9,0xffc967b0,0xffbbd418,0x00c58754,0x005a326c,0x0063c048,0x004c650a,0x0051bdeb,0x00475d4e,0x002e1abc,0x0010176b,0x000a5ba1,0x0011c469,0x002b3e9d,0x001b49fe,0xfff8a6b9,0xffc9b90a,0xffc8bed3,0xffcdd401, -0xffd3d2a4,0xfff81ef9,0x000faac3,0x00197ca4,0x001f3904,0x0021c4e8,0x0021f694,0x0014cbe8,0xfffd24a2,0xffd9f91c,0xffdd0468,0xfff88e50,0x0029a96d,0x0061bbdd,0x008c73f4,0x00bdaee9,0x00ad237e,0x00becb76,0x00e41987,0x00f260c8,0xff9cc153,0xff8ed3cd,0xff58c912,0xff3df86d,0xff40cce9, -0xff6fd8b1,0xff9a9e67,0xffb1ceec,0xffabc08a,0xffaaf4d7,0xffb80f43,0xffb29bd4,0xffbc5b20,0xffc17335,0xffbebecf,0xffbba6de,0xffaf2372,0xffd9fc7e,0xfffb181f,0x001c5c32,0x00240cca,0x002dcd33,0x00309fcf,0x002e71cc,0x002aa37d,0x0024491e,0x002fca0f,0x003280f1,0x003c0ac4,0x002fb8da, -0x00243fda,0x0016ffbc,0x00019a93,0xffe9fb71,0xffc493e0,0xffb403cf,0xffedb8fa,0xffea3ad7,0xffcb8177,0xffada377,0xff83eb32,0xff7b29d8,0xff6aa1dc,0xff5c5bd2,0xff6bda77,0xff7ec28d,0xff86652a,0xffa30f11,0xffaf8cff,0xffc9f6b6,0xffc606be,0xffca8063,0xffc6cc81,0xffe573cb,0x0002e64c, -0x001d4255,0x001da0fd,0x002730c4,0x002ed786,0x00316b45,0x0033c11a,0x00350aee,0x0035cb57,0x0037f73b,0x003d569e,0x0039b5e8,0x0036ae71,0x0030170d,0x001adb7a,0x0009276e,0xfffde804,0xfff7a054,0xfff05ef7,0xfff366d3,0xffebbaaf,0xffe9bc12,0xffe7a22f,0xffe4b5b0,0xffe146e9,0xffdc70e8, -0xffdece62,0xffe12a03,0xffe0716f,0xffe32581,0xffe237b1,0xffe24683,0xffe71e55,0xfff15c89,0xfff834e1,0x00000657,0x00029249,0x0013e4f3,0x000fa582,0x000c4b51,0x00092c87,0x00058134,0x0002875b,0x00007ebe,0xfffb7e05,0xfff5793a,0xffee550f,0xffe82711,0xffe3e191,0xffe34980,0xffe9290d, -0xffeed0b9,0xfff0d75a,0xfff05512,0x00016f27,0x00050192,0x00005243,0xfffd1352,0xfff893d6,0xfff5fc0f,0xfff21052,0xffed5e75,0xffeedfa7,0xffee693d,0xffefe8e0,0xffef317d,0xfff07bd2,0xfff0dc80,0xfff7add1,0xfffb4209,0xfff8fb15,0xfffe225e,0x00001192,0x000583af,0x0001bd25,0x0000fbd1, -0xffff99ba,0xfffeeafa,0xfffdeb41,0xfffce396,0xfffb8e8a,0xfffb1848,0xfffb0760,0xfffb3c0b,0xfffa5640,0xfff6d935,0xfff879bd,0xfff92da7,0xfffb403a,0xfffea0e3,0xfffe9b09,0xfff71dc4,0xfff7c680,0xfff94108,0xfffc5501,0xfffc9873,0xfff4119b,0xfffd6aad,0xfffb6812,0xfffb8c75,0xfffb596d, -0xfffdbe62,0x0005867b,0xfff8777e,0xfff5f2f9,0xfffcb999,0xfff6d8dc,0xfff43d1a,0xffe5ed69,0xffed7fcd,0xffef9c54,0xfff49355,0xfff10b1e,0xffefd4d5,0xffee3c41,0xffef0b73,0xfff2804d,0xfffa6b8a,0xffff74f7,0x00017161,0xfffeb35b,0xfffc5c43,0xfff843a2,0xfff1203f,0xffef52d2,0xffeee380, -0xfff35e3f,0xfff56b04,0x0000c219,0x0000c4a2,0x0008afb0,0x0009cd9b,0xfff8c5e0,0x00087626,0x001023ca,0x0014c5f8,0x000eec68,0x000f31f8,0x0020280e,0x00033103,0xfffed0bb,0x00085db5,0xfff82043,0xffebd39f,0xffcf79db,0xffdbd318,0xffdfbb57,0xffe74cd0,0xffdc9408,0xffd813e9,0xffd7414c, -0xffd977ba,0xffea5d5d,0x00086531,0x001cc64d,0x001ee91f,0x000e2504,0x00019431,0xfff1317b,0xffe1b95b,0xffdd09cd,0xffe3cd08,0xfff43f39,0xfff9a482,0x000283a0,0xffffcd61,0x00177f81,0x001fe9e6,0xfff54cb0,0x001b5dfe,0x001a5051,0x00205929,0x002b8e3e,0x0032799c,0x0058bc8b,0x0017105f, -0x00082cd9,0x0026e008,0xfff6522a,0xffe97c16,0xffb4ce24,0xffc944b8,0xffd1cf85,0xffe22848,0xffcaf4a4,0xffc33041,0xffc1e879,0xffc28798,0xffdd4676,0x000c00a6,0x002f4e3d,0x003948fc,0x001c6e47,0x00199b29,0xfff9c00f,0xffd1e1d7,0xffc671f3,0xffc65354,0xffe9896d,0xfff22114,0x00235853, -0x001818ad,0x00360a7a,0x00200e97,0xffdcada8,0x003030fe,0x0066b611,0x0062eb0c,0x007dce5f,0x009a09aa,0x00a5f44d,0x003d9ce3,0x0030648e,0x005bab39,0xfff0ae4b,0xffd58362,0xffa0d8aa,0xffb76b9d,0xffc1e288,0xffcc0ccd,0xff9c5854,0xff8a7ffc,0xff8bd70f,0xff9886fd,0xffd6f15a,0x0040a29c, -0x008e3ad7,0x00832231,0x003b6ca4,0x001ad299,0xffe51784,0xffa727a7,0xffa7d3a3,0xffd2d911,0x0006b40d,0x00148a08,0xffbc520e,0xffbdce6f,0x00287a56,0x00779c55,0x0096156f,0xfff0db88,0xff7efc9f,0xff87e31d,0xffcb3c36,0x0005c6b2,0x000223ff,0x007391f1,0x005eab5f,0xffcec1c0,0x00270bd1, -0x002f30c7,0xfff9d495,0xffeee09b,0xffe8df3c,0xfffadffe,0x000d746c,0x001f3888,0x0019fbe1,0x000bfbbf,0xffd9fdea,0xff80737d,0xff54dc64,0xff920002,0x006f1af7,0x0057f420,0x0051bb70,0x0067bba4,0xffbc1dfe,0xff5097b7,0xff5c8920,0xff8f3a6e,0xffac86d8,0xfff04ca5,0xff6af8ab,0xff23b81e, -0xfee2a64e,0x000036cc,0x00a79f48,0x009f5a81,0x00345ebc,0xffec5cff,0xffbb2e76,0xffef560b,0x002371aa,0x00426147,0x0031b0f9,0x001405c3,0x001a7d30,0xffe33664,0xffd0ea5d,0xffd272d4,0xffd78c41,0xffdb9d14,0xffd58e57,0xffb9d615,0xffca6321,0xffd854aa,0x006aa882,0x00742f86,0x000a0f77, -0xffb087e2,0xffbb70a8,0x0075c7cc,0x006cd2a2,0x00d572b4,0x0171a800,0x003225ff,0xffafd8af,0x0103819a,0xffffe813,0xffa32f3b,0xffe08630,0xff9d8d3c,0xffb59a18,0xffe1315d,0x001de4b9,0x0033db27,0x000fd2b1,0xffeec78d,0xffe3da12,0x00036e95,0x00161fbd,0x002a350b,0x0011f52d,0x00195de9, -0x001e48b7,0x00240420,0x00077fb3,0x0014e825,0x00487745,0x004def5c,0x00545ddd,0x0040a1bb,0x001ef4e2,0x0016cec1,0x00391f13,0x002dd587,0x007b4f59,0x015d87a4,0xff3d2b55,0xfe5eb47c,0xfeb7a6b8,0xfefa9ae8,0xffaece71,0xff6e45e8,0xffce8df8,0x0004540b,0x000ec452,0x0011b50b,0x00161362, -0x000807ba,0x0008d2ff,0xffe38365,0xffe3667a,0xffde0ac1,0xffe2aa0b,0xffe7fbce,0xffd5f564,0xffc957af,0xffbf268a,0xffb45799,0xffae711f,0xffb8f27e,0xffb03272,0xffb3bcf5,0xffc68216,0xffe2a302,0x002af1a2,0x00751734,0x00a8096e,0x00b68c24,0x00aeb458,0x007fcab6,0x0037fd77,0x004b0e2f, -0xfffaa53b,0xfffaa27a,0xffdee1e9,0xffdf440c,0x00863285,0x001112b2,0x0037b6e4,0x00330f3e,0x0041c231,0x004b2462,0x00365568,0x0011f434,0x000db194,0x00159b4f,0x002b1d95,0x002c7c49,0x000b6890,0xffcf5501,0xffc7dbd6,0xffc2b757,0xffc6c9b3,0xffee935b,0x000c1bb8,0x001de92e,0x001c98bf, -0x001f8748,0x00248c97,0x001735b9,0x0001493f,0xffe92a71,0xfff7f6db,0x001ce2e9,0x005c6fe1,0x007a140a,0x0099f42e,0x00b7262c,0x00b1897f,0x00beed97,0x00c9ece4,0x00c459fd,0xffc5d1ce,0xff9d4b4b,0xff7fadd8,0xff70f0b6,0xff70aa71,0xffa6e6d5,0xffcf525d,0xffd7ef13,0xffd4d42e,0xffcd9f79, -0xffd003da,0xffbb4ab8,0xffbd9038,0xffc10991,0xffc9b289,0xffc59ae9,0xffb1bc91,0xffc85a93,0xffe4001d,0x00091ffe,0x0017a6a9,0x00266eee,0x0027cc9b,0x002d732f,0x002d95ca,0x0023c6ce,0x0025701a,0x0024bc6f,0x0033ed82,0x002c7103,0x002791f7,0x001dcb07,0x000fa2cd,0x00029d62,0xffeeeca6, -0xffe1dccc,0xffdc5760,0xffda56c5,0xffbb7dd7,0xff9c728c,0xff70b55a,0xff7057c7,0xff6a1d79,0xff6581ce,0xff78488d,0xff8cd030,0xff9b6e53,0xffb1ab9f,0xffbdb9b2,0xffcf64a6,0xffccc228,0xffce7207,0xffcd88a3,0xffe62c2f,0xfffc50b0,0x000bbf6e,0x00114750,0x001fde86,0x002bf368,0x002e59f7, -0x0030f0f9,0x003479a4,0x0035d799,0x0038a50a,0x003d0ccd,0x00354968,0x002d2d20,0x002124a2,0x000a3768,0xfff61b5b,0xffe75020,0xffe26347,0xfff8b52f,0xfff9a724,0xfff3e7a6,0xffee4e8f,0xffec6d19,0xffe8626d,0xffe0bd83,0xffd910e5,0xffdb1fef,0xffde3ad7,0xffdf3d42,0xffe11677,0xffe1c55b, -0xffe42390,0xffed73f5,0xfff8cb6f,0x00007034,0x0007fa0c,0x00105b0e,0x001b5188,0x0017dad0,0x001438bf,0x0011a1f4,0x000e638e,0x000bf8bd,0x0009bbbd,0x000567e4,0x000052d0,0xfffb1145,0xfff64132,0xfff3dcff,0xfff51e8f,0xfff97cc6,0xfffdfc18,0xfffedd99,0xfffc38f1,0xfffb4771,0xfffc64e0, -0xfffc0b32,0xfffaa224,0xfff99ebc,0xffef6012,0xffeead06,0xffecbf4c,0xffefcd24,0xfff02d6f,0xfff22013,0xfff35dc4,0xfff5a4f8,0xfff6a2f6,0xfff8b9ec,0xfff91947,0xffff846a,0x0000a2c0,0x00010ca5,0x0002b4ac,0x00001939,0xffff1ae9,0xfffd8984,0xfffcdc41,0xfffbe2fe,0xfffaddf4,0xfffa3c8e, -0xfffa2cca,0xfffa52d8,0xfffb22f2,0xfffac7a6,0xfff87481,0xfff7d1ed,0xfff6d75f,0xfff74971,0xfff94c2e,0xfff6e0e9,0xfffaabe3,0xfffbfb46,0xfffbeb0e,0xfffeb1fd,0xffff1b07,0xfff9b0ab,0xffffdd24,0xfffd3f22,0xffff48cf,0xfffb88ae,0xfffd40e6,0x000469a3,0xfffad997,0xfff8ca18,0xfffc33b5, -0xfffad71d,0xfff97e01,0xffe8f68b,0xfff0ca6b,0xfff22e33,0xfff5f5ba,0xfff3202a,0xfff29b17,0xfff1a1dc,0xfff42aa0,0xfff84bb6,0x0001f5d3,0x0002d36d,0x0003e570,0x0000f82b,0x0000588f,0xfffc1cf4,0xfff38aee,0xfff1aeca,0xfff19559,0xfff70726,0xfff9cdb6,0x000be39a,0x000728a8,0x000e6ded, -0x00100a51,0x0004867b,0x000ac354,0x000fed8c,0x0019171a,0x000c400f,0x000b1a36,0x00193630,0x000481db,0x00020555,0x00043bd7,0xffff3cb9,0xfff454ac,0xffd4d280,0xffdec578,0xffdf014b,0xffe47efc,0xffdbb882,0xffd9b166,0xffdb7399,0xffe39a0d,0xfff6e42a,0x001857b3,0x0020ee52,0x001e9be9, -0x000dbad6,0x0005df7c,0xfff71237,0xffe4fa18,0xffdf1a97,0xffe6e8df,0xfffbfa4e,0x0004c112,0x000d7aeb,0x00004bc5,0x00186302,0x0021006c,0x00058056,0x001d0135,0x0017563e,0x0026796c,0x001fa97a,0x00227bf6,0x0049be30,0x0016fcb7,0x000dcc92,0x001c47ba,0x0000f421,0xfff7bda1,0xffbb7946, -0xffcdd1df,0xffcffbd0,0xffd9fcc9,0xffc72a97,0xffc3db04,0xffc68634,0xffd1db1d,0xfff02bfc,0x0028bb48,0x00330da5,0x003700f4,0x001a1453,0x00207bf9,0x0001e1c4,0xffd29939,0xffc6a297,0xffc85824,0xfff0d573,0xfffe74ab,0x003f363a,0x0024ce66,0x00428c14,0x003248c0,0xfff9d4f0,0x002f5786, -0x005c1247,0x006ede5a,0x007850af,0x0092ee64,0x00a33b31,0x00393b5b,0x002c7406,0x004fb920,0xffffac29,0xffe6cb85,0xff9f3554,0xffb4d793,0xffb7e883,0xffb85f7e,0xff8f9ad1,0xff86ec2a,0xff91e217,0xffb0ddc9,0xfffa4339,0x00725fac,0x0095ed0d,0x00757aa2,0x002f3104,0x001f4e46,0xfff16bf1, -0xffac1439,0xffaa7193,0xffd7343d,0x00198a00,0x0031096b,0xffa44568,0xffa0a0c1,0xfff03af4,0x00408ae7,0x008646d4,0x001020bd,0xffa3b906,0xff88a71e,0xffb7627e,0xfff4e5a0,0xfff30d5f,0x007efabe,0x00726813,0xffcff14b,0x0022cd22,0x0028eede,0x000e651c,0xfff749ab,0xffeda46c,0xfffc16ab, -0x001bd309,0x002bd6e3,0x001ee961,0x000cb125,0xffd603d5,0xff7793b3,0xff5df687,0xffaecd4a,0x0090b180,0x005e38b8,0x00513069,0x00637d72,0xffaf7844,0xff4b7f47,0xff5118ab,0xff819581,0xfff41b04,0x00233201,0xffaa0a38,0xff491808,0xfef06136,0xffcaf894,0x006e5a16,0x0086d971,0x0044a629, -0xfffcabd1,0xffb15ca2,0xffd969f9,0x001000a0,0x0037b0a8,0x002af194,0x00106018,0x001319a0,0xffd7f5e9,0xffc5233c,0xffbef1f2,0xffd1fc11,0xffda5b37,0xffd8c72f,0xffb538e4,0xffcad131,0xffe34703,0x008bac88,0x0086675f,0xfff52d57,0xffb906c4,0xffcc41ac,0x006dbd1e,0x008ff059,0x00e65d48, -0x0140c850,0x005625fd,0xff410b24,0x0065d8d0,0xffc74d54,0xff8e6597,0xffe65c9a,0xffc4345f,0xffcc5f98,0xffb7c2a9,0xfff85c87,0x001b3e99,0x0017af9d,0xffee6657,0xffe1c704,0x000239b6,0x0007deba,0x001cd98c,0x00159eab,0x0019804c,0x0020fecc,0x00238079,0x0017a82c,0x002ac7cb,0x0053d35c, -0x0052e318,0x004d0888,0x0029286a,0x000c9781,0x001b3306,0x0057a669,0x005c9da2,0x00800b18,0x00f33456,0xff07ed1d,0xfe56f41a,0xfee1e88a,0xfed48986,0xffee7958,0xffb59819,0xfff22ae0,0x0019f102,0x002b8e4c,0x00118af0,0x000c8f36,0x0005bf52,0x00091624,0xffe46968,0xffdf64d7,0xffe881b2, -0xfff05779,0xffe7858f,0xffe279cf,0xffd46a3b,0xffbea808,0xffafeeab,0xffabb521,0xffb994a7,0xffacae76,0xffaf9293,0xffbf6e13,0xffe4d155,0x002b6240,0x0072c38e,0x0099e506,0x00a5a5ea,0x00ab1efe,0x00615386,0x0023990c,0x004a8505,0x002095f4,0x0026fcbf,0x000c6839,0x000dbbda,0x002ae2c2, -0xffcda92f,0x0006973c,0x0016cb7f,0x002d3eb9,0x0048479f,0x003cff3c,0x0018e3e3,0x001709bb,0x001cda41,0x00275eed,0x00336b17,0x0016a3af,0xffda48e1,0xffc812ca,0xffb99366,0xffbd91f2,0xffe22209,0x00038d5c,0x001b966a,0x0019961c,0x001ddf30,0x001fce62,0x001b3945,0x000ea7bf,0x0000c9df, -0x001d7de8,0x0047ac6e,0x00870b49,0x0090837b,0x00a74342,0x00b4c485,0x00af7ab4,0x00a67272,0x008826df,0x006a1b67,0xfffc20b2,0xffc0187f,0xffae20a4,0xffae1173,0xffb1ba51,0xffe10c46,0x00013a14,0xfffdf495,0xfffcbe7d,0xfff01fc6,0xffe7fe5d,0xffc7e4d2,0xffc14165,0xffc15f3a,0xffce83dc, -0xffcb7a72,0xffbb3dde,0xffbcf298,0xffd05a6c,0xfff2f352,0x00095a80,0x001c41d0,0x001d1c38,0x00299439,0x002afde8,0x002091d5,0x0018c147,0x0014c824,0x0025827f,0x0024c258,0x002557b1,0x00215a61,0x001e1c39,0x00224800,0x00268d66,0x001aca35,0xffcaa0ea,0xffc6e825,0xffac9d7e,0xff8ef609, -0xff64e721,0xff6ad47f,0xff6dc108,0xff711802,0xff8472d8,0xff9827a2,0xffaadfcc,0xffbade42,0xffc50667,0xffcf6121,0xffd01731,0xffd1cfe3,0xffd43271,0xffe588e4,0xfff4ef30,0xfffa34cf,0x00045373,0x0016f306,0x00279b60,0x00260f86,0x0025f112,0x00296ae9,0x002b84ed,0x002efb72,0x00323d64, -0x002ace9c,0x0021ffde,0x001537a1,0xffffa5dc,0xffea4452,0xffd8bf01,0xffd079bf,0xfffd64ea,0xfffb765f,0xfff73ffa,0xffeeb4bc,0xffec81b1,0xffe753d1,0xffdc85ad,0xffd2474a,0xffd42952,0xffd78f16,0xffd99e8b,0xffdaed68,0xffdd0bf2,0xffe0aca2,0xffec7834,0xfff75734,0xffff6631,0x0006a2ea, -0x001266e4,0x00177b02,0x00168a72,0x001466ae,0x0014087b,0x00137a35,0x00142e03,0x00139dfd,0x001098f4,0x000cc663,0x00094cbf,0x00053f40,0x00033ae4,0x0004790e,0x00058839,0x0007f9d1,0x0007a2ef,0x0003b52d,0xffefe5fd,0xffeead7b,0xfff0b7f4,0xfff02fe9,0xfff11d73,0xffe35985,0xffe41179, -0xffe38b4c,0xffe7a876,0xffe8aac7,0xffead78b,0xffed5274,0xfff02220,0xfff16f7a,0xfff1201e,0xfff068b8,0xfffb6027,0xfffa589d,0xfffaaf8c,0xfffaaa63,0xfff98121,0xfff8b0f2,0xfff76331,0xfff72db9,0xfff69150,0xfff66621,0xfff5e5be,0xfff5fd94,0xfff641f4,0xfff77a91,0xfff7d9f8,0xfff72a5e, -0xfff44851,0xfff1616e,0xffef8e67,0xffef669c,0xffea3ef0,0xfffd0dce,0xffff161d,0xfffd5fe4,0x0000a55a,0x0001c2b8,0xffffa19e,0x00010f98,0xfffea965,0x0002c00e,0xfffc388b,0xfffd3133,0x00029aed,0xfffdea21,0xfffcc35e,0xfffd2bca,0xffff2100,0xfffe3bcb,0xffee8f6e,0xfff4dcc4,0xfff4d121, -0xfff68ba0,0xfff4d873,0xfff4e225,0xfff42754,0xfff878da,0xfffd1aec,0x0008060f,0x0004ca0f,0x0004cdd5,0x000162ad,0x0002b5de,0xfffeb768,0xfff58c11,0xfff37905,0xfff3bb9a,0xfffa1f95,0xfffd21fa,0x00147464,0x000b98ff,0x001351c1,0x00134ec6,0x000d1a5a,0x000b4a26,0x000dc4f4,0x001a302e, -0x0007da79,0x0005372a,0x000f117d,0x0004c5c3,0x0004ea26,0x000141bf,0x00066b2f,0xfffcec2a,0xffdcc6fd,0xffe28b56,0xffe00807,0xffe2422b,0xffdbad25,0xffdbe93c,0xffdf4baf,0xffedbbd9,0x0002a62b,0x0025aa6c,0x00227e43,0x001bc0b5,0x000a312e,0x0007f3af,0xfffbb7b0,0xffe8b4c0,0xffe22a42, -0xffea6779,0x0002fdad,0x000dd2aa,0x00150886,0x0000edeb,0x0018212d,0x00201ec7,0x00139819,0x001b44c7,0x001152fa,0x00269cc4,0x0010d919,0x000feb12,0x00325a9d,0x0014c7fa,0x0013b8e0,0x00137482,0x000c2c47,0x00068a0a,0xffc81a31,0xffd50aa2,0xffd093b6,0xffd4b34b,0xffc64f47,0xffc76ad8, -0xffcb6ab8,0xffe1976d,0x0002090b,0x00416d14,0x0032fa03,0x0030fd95,0x0013bc5f,0x00233799,0x0008518d,0xffd5891b,0xffc9e5a5,0xffcd3416,0xfff9e215,0x0008de29,0x00547ee4,0x002e77d1,0x00490380,0x003d5e41,0x0013e4f2,0x002c2429,0x004e12f7,0x007417de,0x006dcaef,0x0083edb6,0x009309cf, -0x0036b762,0x002d1a3e,0x0044b772,0x0011c202,0xfffafdf1,0xffa6015e,0xffb63e38,0xffb1aa27,0xffa9c573,0xff88c657,0xff8812c3,0xff995a14,0xffcb5fb3,0x001d3bb8,0x009c29f5,0x0095772b,0x00637222,0x001d2ba9,0x001fdecb,0xfffc2d6e,0xffb4738e,0xffb43bd7,0xffdfefae,0x002ca379,0x0049757f, -0xff8c50bb,0xff8f674a,0xffc908df,0x00165cc2,0x00716ec3,0x00272d6a,0xffc4e259,0xff88357e,0xffa51b1a,0xffe71d63,0xffef9b8d,0x0084c05a,0x007ca4fe,0xffd4353f,0x001bc016,0x002179b0,0x0025c1ee,0x00089de8,0xfffc4827,0x00054584,0x0030aaf9,0x003c74f3,0x0027eb0d,0x0009a2a0,0xffcbf673, -0xff738101,0xff6907ba,0xffc92220,0x00a6800e,0x0062a3df,0x0050a381,0x00613e15,0xffa6d8be,0xff4d3a61,0xff4c46c5,0xff718ae3,0x003abc79,0x00494db0,0xffda8f08,0xff65eb33,0xff011c90,0xff98993b,0x002fde46,0x0069311c,0x0051eda6,0x00107f96,0xffb00157,0xffc7d718,0xfffdcecc,0x002e124a, -0x00207cb8,0x0008dce1,0x00075563,0xffd5c064,0xffc5e25e,0xffb3f7c7,0xffd1d645,0xffd8ac02,0xffd495c3,0xffb4c887,0xffd2250f,0xfffae788,0x00a4458d,0x008f9729,0xffe92c9c,0xffbed187,0xffdc116f,0x0064fa26,0x00ac9dc7,0x00e7ed68,0x00f85856,0x00726fe4,0xfee1e588,0xffaf3a22,0xffa9f390, -0xffa1476e,0xffe61ecf,0xffec2924,0xffe55f29,0xff9e1a5f,0xffda35df,0x0004eedc,0x001c4320,0xfff3e25e,0xffe43c4f,0xfffca913,0xfff9badb,0x000f0343,0x00188c19,0x0014c59a,0x001a885c,0x001493ce,0x0021b1ce,0x003b8aa6,0x0055104e,0x00528403,0x00413c99,0x0013da29,0xfffea121,0x001d4d3a, -0x005a970e,0x00946a90,0x0086135d,0x00490d74,0xfefb9a06,0xfe91768e,0xff146f0d,0xfec6ebc2,0x0035e479,0x000d2cfa,0x0018b41f,0x002c3eb3,0x004770ac,0x0012012b,0x000337de,0x00062e49,0x00070334,0xffe7eebb,0xffde0738,0xfff12ec4,0xfffa9475,0xffe98484,0xffef16fa,0xffde75ec,0xffbe8a79, -0xffaee7d9,0xffadcb58,0xffb81ba4,0xffad48f6,0xffb1444f,0xffbd5b03,0xffeb586f,0x002af486,0x0071d40e,0x008a1351,0x009007a7,0x0090ff45,0x0035bc5e,0x0009e960,0x0036fbb9,0x0035688c,0x004078df,0x0036c3db,0x003c2154,0xffca9c1c,0xff95bdd8,0xffdca0ef,0xffffb094,0x001b6f74,0x003e9935, -0x003db5f8,0x00208401,0x0022808c,0x0025734b,0x0022760e,0x0031870a,0x001ae999,0xffea1156,0xffca27d0,0xffb3d0bb,0xffb8641f,0xffd32274,0xfff4fa86,0x000f58a8,0x0012b1af,0x001b64d1,0x0018f922,0x00212da3,0x001f1db5,0x001cd58e,0x00441ee1,0x006d7456,0x00a5d779,0x009f7faf,0x00ab0505, -0x00a831c5,0x00a98b23,0x0084771d,0x002f1720,0x00007fb0,0x00350a8f,0xfff48c79,0xffe1f57a,0xffeab133,0xfff8690a,0x001ae4f1,0x002f6a8f,0x00218a6a,0x0020b0de,0x000f675b,0xfffe10b4,0xffd81d3a,0xffc7e263,0xffc17f4c,0xffce03ec,0xffcd9790,0xffc6b8c4,0xffb9349d,0xffc44516,0xffdf9af7, -0xfffb10a4,0x0010203b,0x0011b884,0x0023ed5d,0x0025c348,0x0018f58b,0x000b77c0,0x00046547,0x00117706,0x0016d777,0x001ddb4b,0x0022fe6f,0x002abf00,0x003f7a6d,0x005a0b7c,0x005164f4,0xffbd2c9a,0xffb3de1b,0xffa16621,0xff88d06a,0xff6488e6,0xff6cd7b4,0xff76135a,0xff7dfe7e,0xff8f525a, -0xffa0453f,0xffb390c2,0xffbeb63e,0xffc84501,0xffcd4c15,0xffd136a7,0xffd18798,0xffd43ece,0xffdf376a,0xffe994cd,0xffe74b7f,0xfff50db6,0x000a6656,0x001e9170,0x0019b437,0x0017025e,0x0019bfe3,0x001b62c4,0x001e1afd,0x001f498e,0x001b5efc,0x00149cff,0x000b863c,0xfffc6e6f,0xffea431a, -0xffd9a34d,0xffc8013d,0xfffc5aa0,0xfff6e51a,0xfff4b356,0xffe9238f,0xffe69e57,0xffe0cfff,0xffd3fadb,0xffc872f2,0xffca54eb,0xffce60a2,0xffd1b4f4,0xffd2a500,0xffd59a4e,0xffda1bf2,0xffe6684c,0xffefedfa,0xfff80580,0xfffecc24,0x000be7dc,0x000bbb6c,0x000de936,0x000e30bc,0x00109f5b, -0x00133df9,0x0017a91b,0x001a0438,0x00185852,0x00164bbe,0x00149c45,0x0011875e,0x000fb30c,0x000fd046,0x000ba4b4,0x000a30e0,0x00083b21,0x0003f39f,0xffe2f310,0xffdfb3c6,0xffe31c73,0xffe32e7e,0xffe50f2d,0xffd61956,0xffd785c8,0xffd7ba73,0xffdca32b,0xffde0329,0xffe031f9,0xffe38678, -0xffe6a110,0xffe826e0,0xffe6c00a,0xffe5c54d,0xfff2a505,0xfff0879a,0xfff12140,0xfff01a12,0xfff09fa7,0xfff052e9,0xffefb439,0xfff06344,0xfff0756d,0xfff16e01,0xfff0d819,0xfff0f616,0xfff14886,0xfff28b56,0xfff37744,0xfff4b4b5,0xffefeabe,0xffeb695c,0xffe714e8,0xffe45e5e,0xffdd3c08, -0xfffef3e1,0x0001a16b,0xfffe54de,0x0001dd49,0x00034478,0x00038d27,0x0001815a,0xfffedb18,0x00040190,0xfffb507b,0xfffb902b,0xfffe92cc,0xffff2fe6,0xffff4376,0xfffd7804,0x000260cb,0x00024ae3,0xfff3b204,0xfff838a1,0xfff7259e,0xfff7601f,0xfff69f3a,0xfff730c9,0xfff6b5a4,0xfffc90c1, -0x00017b09,0x000d00eb,0x000631be,0x00053cd8,0x0001231f,0x0004a3e5,0x00011f4d,0xfff75abd,0xfff5bfa4,0xfff65af3,0xfffd1eb2,0x000019eb,0x001a5fa4,0x000d9561,0x00153c5c,0x00141b37,0x0012f8de,0x00096149,0x00099e8f,0x0018de61,0x000259a7,0xfffe10ae,0x0002ff02,0x000403e9,0x0007374b, -0xffffba07,0x000c7c80,0x000494bf,0xffe69077,0xffe68863,0xffe0cf34,0xffe0ec6d,0xffdcb4ea,0xffdf64ae,0xffe4894b,0xfff89f87,0x000e3737,0x003096be,0x0022a9c9,0x0017db5b,0x000578ea,0x0009aa34,0x00006d9d,0xffec3f86,0xffe754ee,0xffefd236,0x00098897,0x00153e3e,0x001a5833,0x00005818, -0x00163441,0x001d68eb,0x001f970d,0x00167918,0x00088867,0x00228e99,0x000023a5,0xfffc2607,0x00157353,0x0010545d,0x00183761,0x000d1289,0x00164adb,0x0013d9fe,0xffd93d7a,0xffdd433f,0xffd2957a,0xffd277ab,0xffc84eae,0xffcd8102,0xffd26df8,0xfff24ebc,0x001334d8,0x0054ef12,0x003106c7, -0x002a85de,0x000ce2c9,0x00253af3,0x000f9d8a,0xffd8de71,0xffd23013,0xffd710eb,0x000312bd,0x00123a57,0x0061e215,0x0031265b,0x00495abd,0x00420417,0x002a2a57,0x00254aa7,0x003c9e9c,0x0070f7fe,0x005e3873,0x006d8fd2,0x00743da2,0x00345d19,0x00314d73,0x003b58d9,0x002414f1,0x001013f8, -0xffb52bbe,0xffbad119,0xffacd4a6,0xff9eec11,0xff86948d,0xff8e64a5,0xffa62fd3,0xffe9a43d,0x00403983,0x00bc9c1c,0x008f8656,0x00503629,0x000a20ce,0x0020b1d8,0x00078cf0,0xffbc7cd9,0xffc54faf,0xffef872d,0x003d3742,0x005c5f4a,0xff7b54ca,0xff88f87d,0xffabc75f,0xfff384c4,0x005e6331, -0x00353fa8,0xffdff15d,0xff889589,0xff9a12b3,0xffdf7f12,0xfff42a86,0x0082a347,0x007aeeee,0xffdc9525,0x0011f1a1,0x001885c9,0x003b1c89,0x00208191,0x00146ad0,0x001ceb7d,0x004dfe77,0x004eef78,0x002faad3,0x0000d5d1,0xffbb9904,0xff705133,0xff7862ec,0xffe650d0,0x00b77a9f,0x006716a3, -0x0050818b,0x0063e052,0xffa61eab,0xff572df1,0xff5265ea,0xff683cca,0x00716375,0x00634ad2,0x0008f0c1,0xff8568fd,0xff0de37b,0xff6e888f,0xfff5743f,0x00484716,0x0055df2a,0x001eb477,0xffb47faa,0xffba27d1,0xffeca84d,0x00255cad,0x0013c140,0xfffefd29,0xfff989d6,0xffdb6bca,0xffd07aa2, -0xffb38cb2,0xffd6dc16,0xffd83957,0xffd1eafb,0xffbb0361,0xffe0e130,0x00204d05,0x00afe9ca,0x00886d01,0xffdba7e9,0xffc21d7d,0xffeae102,0x005c0cae,0x00c20493,0x00dfc1ac,0x00a4cf5f,0x007cd802,0xfe98f8ea,0xfef314d0,0xff982021,0xffc55f82,0xffdbeb40,0x00135c8f,0xffff7a5a,0xff92b0e7, -0xffc6e14f,0xfff39f28,0x001bc113,0xfffe2dc4,0xffeafc91,0xfff3bf28,0xffeebc70,0x0004b3b8,0x001bc4bc,0x000e189f,0x000d3a8f,0xfffee0cc,0x0025634f,0x0042fd16,0x004cf995,0x004b54f3,0x0032d083,0x0004ebb5,0xfff6627d,0x001bcfa8,0x0048edbb,0x00ccb874,0x0098fbd0,0xffb0da87,0xff0f3964, -0xfee50976,0xff40266b,0xfecffeb8,0x0083d535,0x006fa3c8,0x00458809,0x003d23c6,0x005974cc,0x0011865a,0xfffc7c82,0x0009e54d,0x0005c07f,0xffee6eda,0xffdecf9b,0xfff5f029,0xffff7f12,0xffedf768,0xfff8e23f,0xffe59d4f,0xffbff353,0xffafae48,0xffb0a595,0xffb58240,0xffb11be2,0xffb73b99, -0xffc18a95,0xfff8e985,0x002ed94a,0x007055a7,0x00795e8b,0x00769365,0x006a4af8,0x000534d8,0xffea599c,0x0015e331,0x0036260b,0x004714f4,0x0050cf8c,0x00688c1e,0xff7cc2a1,0xff6efa1a,0xffbae054,0xffef987b,0x0010fc2d,0x0031b98c,0x0037cd97,0x0027a35b,0x002b5020,0x002bc2d4,0x001d3ac7, -0x0028ab6d,0x0018e8a5,0xfffb11df,0xffcd803f,0xffb17906,0xffb5a861,0xffc41b05,0xffe2367d,0xfffb4987,0x0007fe64,0x0016e704,0x00149f96,0x00240355,0x002d305e,0x003f8814,0x00630020,0x00865118,0x00b89f3c,0x00a606d1,0x00a806bc,0x0096b84b,0x00a0f67e,0x0066704f,0xffe504e9,0xffa8bfb9, -0x0066f86b,0x002b1512,0x00192645,0x00230d27,0x003449f9,0x004b394d,0x00542e8d,0x00406fdd,0x003efb8c,0x002a5970,0x0011ffa9,0xffea42b9,0xffd0e87b,0xffc10050,0xffcacf53,0xffcd9ee9,0xffd06a5a,0xffbc5741,0xffc0fbd4,0xffd2259b,0xffef43d4,0x0004d255,0x0009567a,0x001ba8ff,0x001caed5, -0x000be5f5,0xfffed466,0xfff8f6c0,0x00014b14,0x000b4533,0x0017e61b,0x0024e257,0x00346c87,0x0054088d,0x007e4f3d,0x007c703f,0xffb86f35,0xffa88574,0xff9c5fb9,0xff8a220e,0xff6d0742,0xff7697d2,0xff8433e1,0xff8ed323,0xff9b7c89,0xffa86f49,0xffb87198,0xffbf61d2,0xffc73dde,0xffc6eaf5, -0xffcd5efd,0xffcb8e0f,0xffccd4ae,0xffd3c48b,0xffdac654,0xffd65f93,0xffe68af2,0xfffbc294,0x00112def,0x000b6084,0x0008db65,0x000c0350,0x000b599f,0x000b1f85,0x00093fe9,0x0009d482,0x0006de96,0x0004c0f2,0xfffeb3dc,0xfff2f8e7,0xffe5bce7,0xffc99dee,0xfff5e137,0xffecfab4,0xffeb8ccf, -0xffdead0d,0xffdb641f,0xffd541fd,0xffc7bfe4,0xffbc177e,0xffbe9a5f,0xffc36fea,0xffc80e10,0xffc91a60,0xffccc124,0xffd20685,0xffdd4fc7,0xffe522e1,0xffece1fc,0xfff316b5,0xffff7e6c,0xfffc1366,0x00008027,0x00030bec,0x0007bab9,0x000d4643,0x001466dd,0x0019cf69,0x0019bc26,0x001a58b2, -0x001ac722,0x0019442b,0x0017e6c8,0x0016d1e2,0x000cb5ed,0x00065106,0x00025f3d,0xfffdf7bb,0xffd7b43a,0xffd306e2,0xffd6d2da,0xffd6beb7,0xffd8578b,0xffcad376,0xffcbd353,0xffcb759a,0xffd0ecb4,0xffd2871a,0xffd4c04a,0xffd89963,0xffdbdf30,0xffddb252,0xffdc5827,0xffdbe76f,0xffe7ffb6, -0xffe5ddaa,0xffe6f6c8,0xffe581a2,0xffe7980e,0xffe828a3,0xffe87a35,0xffe9ff84,0xffeadab3,0xffecca55,0xffec3442,0xffec3c04,0xffec86e3,0xffed8ecd,0xffeec2e8,0xfff1be6a,0xffebcb8e,0xffe67062,0xffe00b0a,0xffdb0fec,0xffd303f1,0x00013727,0x00042d3d,0xffffcdf6,0x0002355f,0x0003904e, -0x00063d88,0x0001700f,0xfffde9c0,0x0003f6a7,0xfff96791,0xfff8e77b,0xfff9a839,0xffff1222,0x000085a4,0xfffd81df,0x0004617b,0x00058bc6,0xfff88203,0xfffad10b,0xfff92560,0xfff92c7b,0xfff9133f,0xfffa2eed,0xfffa2260,0x00010d1c,0x0006052d,0x00116b5d,0x00083865,0x0006745a,0x00015731, -0x00072da2,0x00042c54,0xfff9649e,0xfff90d0d,0xfffa09e8,0x000102c7,0x00034c21,0x001e1ed5,0x000e2a72,0x0013d120,0x0012eccb,0x001772e8,0x0005b21a,0x0003e1bf,0x001605dd,0xfffbe727,0xfff62ea0,0xfff7075c,0x00027cd4,0x0008cbc7,0xffff758d,0x0010f29b,0x000b3116,0xfff1e0d2,0xffeb0c9a, -0xffe17519,0xffe0def1,0xffdf6f11,0xffe4a502,0xffebf614,0x000434b4,0x0019a779,0x00394dea,0x00238bcb,0x0015a6b7,0x0001e495,0x000caa9e,0x00061023,0xffefb8d8,0xffeecc6e,0xfff7a5ec,0x00113034,0x001b5a4f,0x001d85d2,0xffff05ea,0x00117b6f,0x0018a603,0x00298ea9,0x000ed31b,0xfffd716a, -0x001bfd72,0xffee6911,0xffe8690c,0xfff74f5a,0x000a1d6a,0x001a2aab,0x00089110,0x001e1215,0x001e7978,0xffedbc58,0xffe61adf,0xffd5e4f8,0xffd2556e,0xffcd71f3,0xffd5f02c,0xffdc42f6,0x0003a475,0x00239894,0x00628db8,0x00306e9b,0x0027016c,0x00076c2c,0x00290588,0x00184677,0xffdbf845, -0xffde8d66,0xffe5257e,0x000e836d,0x0019e6e9,0x0066fefe,0x002dd35b,0x00419df8,0x004003fe,0x003cdc74,0x0019e7d4,0x0026f73b,0x006520f0,0x00488353,0x00508582,0x004af76d,0x00315bbd,0x003718f4,0x003385f9,0x00339a52,0x00242fd3,0xffcd739c,0xffc32fe5,0xffa8e12c,0xff964b5d,0xff896d6c, -0xff9a2148,0xffb86048,0x000a2653,0x0061bbb4,0x00d1d82e,0x00891258,0x0041a27c,0xfffafe76,0x002473b2,0x001437dd,0xffc3c62e,0xffdb7d1b,0x00052c27,0x004ec465,0x0068ced0,0xff70dba9,0xff8bb29f,0xff965b08,0xffd562e3,0x004cc0b0,0x0039c65c,0xfff3ae68,0xff8eb05d,0xff9a5c6f,0xffdf4e53, -0xfffadbb1,0x007753ae,0x006dcaad,0xffe9c274,0x0006ca76,0x000e44ad,0x004a1746,0x00391c10,0x00340cdc,0x00442357,0x006e50c9,0x005f1200,0x003542c4,0xfff230c1,0xffa61a9a,0xff6e36f7,0xff89344d,0x0003fe9d,0x00c35795,0x006c9d55,0x004fd87e,0x00638a69,0xffad1ff8,0xff69110f,0xff6094c3, -0xff65babb,0x0090dee8,0x00728658,0x00362026,0xffad0923,0xff1befb9,0xff529a6e,0xffc84a21,0x0028d195,0x004ed8f3,0x00234a12,0xffbebb44,0xffb2f897,0xffdeefc4,0x001e3ffd,0x00061c79,0xfff48068,0xffec2b26,0xffe758a7,0xffe21bab,0xffbcffbd,0xffdf96eb,0xffda1775,0xffd4a346,0xffc44aa2, -0xfff42a81,0x0050db44,0x00adad04,0x007025c1,0xffc60907,0xffc2a9f3,0xfffac2b0,0x00592795,0x00d232b7,0x00d2e84f,0x0057ab04,0x00734db1,0xfe71ae5c,0xfe490eba,0xff82d1f0,0xffe47480,0xffc5946c,0x003362b1,0x00180c0d,0xff942049,0xffbe5615,0xffe7f0e0,0x00178093,0x000a25d3,0xfff3841c, -0xffe97783,0xffe7c8e9,0xfffeaf2b,0x001ec7c4,0x00095d23,0x00009073,0xffee518b,0x0023e955,0x003fb022,0x003f6a05,0x003ef30d,0x0022058e,0xfff7f047,0xffef1223,0x00168fe8,0x002ed810,0x00f59962,0x00a8ad5e,0xff3f525c,0xff2828e5,0xff29139e,0xff5f2ced,0xfeeccda4,0x00c7e79e,0x00d0ce67, -0x007b44a3,0x0050f8e8,0x005ccd8b,0x001205c5,0xfffb9a41,0x000e56e3,0x0006e0a6,0xfff7af39,0xffe22c04,0xfff6f0d6,0xffffd3e7,0xfff53f40,0xffff736d,0xffeaea14,0xffc4fc56,0xffb31b20,0xffb31bb2,0xffb44118,0xffb78291,0xffc0e4b3,0xffcd601f,0x00076f72,0x0033f978,0x006e2817,0x0068f501, -0x005a532d,0x003ad46f,0xffddb680,0xffd2e6ea,0xfff9ddc3,0x0027d174,0x003a82f8,0x0055c5c7,0x0084d5ff,0xff4aa4d6,0xff5e4023,0xffa3b17c,0xffe4bfc7,0x000bb26e,0x00229050,0x002b878b,0x002c5486,0x002ef24d,0x002d2653,0x00181920,0x001bc013,0x0011ff64,0x0007d487,0xffd0c7e2,0xffb1f364, -0xffb25bf2,0xffb7add4,0xffcf5921,0xffe3d14a,0xfff9490d,0x000df5bf,0x00101e97,0x00262991,0x003ad93a,0x005d1deb,0x00760f99,0x0091b93f,0x00b92128,0x00a64dfc,0x00a17316,0x0083689d,0x008bc622,0x00474b57,0xffb90afa,0xff6f17d8,0x008780fb,0x00558448,0x004b13df,0x0051b5cc,0x005c7cbb, -0x006a3299,0x0069e22d,0x0056a32e,0x0054854f,0x003fcc2b,0x002450cd,0xfffd06e3,0xffdc3c57,0xffc21d1d,0xffc7b4e3,0xffccf727,0xffd6cd3c,0xffc48d5f,0xffc52f74,0xffcc25dd,0xffe7d383,0xfffb23e6,0x00020cc5,0x0010b217,0x000fd80e,0xfffd91c2,0xfff446f1,0xfff32386,0xfff96915,0x0007a8c0, -0x0017f422,0x00283828,0x003caaa6,0x005f1702,0x008f0510,0x0093ffac,0xffbb53a2,0xffa6bc47,0xff9e8b85,0xff915dfe,0xff7ab90e,0xff86a141,0xff97adef,0xffa4916b,0xffaaf3da,0xffb31b5d,0xffbce6d7,0xffbfb187,0xffc31080,0xffbdaf76,0xffc56f68,0xffc2f5cc,0xffc30924,0xffc81794,0xffcd8fcf, -0xffcbdcfd,0xffdc0c16,0xffee381c,0x0002247f,0xfffd3b5b,0xfffc82b8,0x0000bcc3,0xfffd1c71,0xfff97f12,0xfff4a8f7,0xfff8ff24,0xfffa88d9,0xffffd840,0x00021627,0xfffdbcdf,0xfff4e8bc,0xffd1ac4a,0xffea6544,0xffdf3320,0xffde2250,0xffd1ab6b,0xffcd9496,0xffc74779,0xffba3e01,0xffaf5dff, -0xffb2a325,0xffb817c2,0xffbd7cad,0xffbf3eb9,0xffc3a7ca,0xffc93342,0xffd2b2f4,0xffd8f2b6,0xffdfff3f,0xffe5b78e,0xfff05ffb,0xffebce7b,0xfff13621,0xfff57617,0xfffb643e,0x00033c0a,0x000bf6b2,0x0013d5fb,0x001500d9,0x0017d809,0x0019cab8,0x0019bc09,0x001890a1,0x00168f83,0x0007a393, -0xfffcb679,0xfff6d46d,0xfff248db,0xffcf0626,0xffc97b43,0xffcceb68,0xffcc6780,0xffcd6918,0xffc28d05,0xffc2905c,0xffc0fc29,0xffc6b335,0xffc86e4a,0xffcaca04,0xffcead32,0xffd1fdef,0xffd43233,0xffd3472d,0xffd39d94,0xffdd9b1b,0xffdbcc7e,0xffdd4d5d,0xffdc0c2e,0xffdf687d,0xffe0f693, -0xffe2489b,0xffe455bd,0xffe5c890,0xffe8681d,0xffe7b748,0xffe7901e,0xffe7b224,0xffe83559,0xffe94378,0xffed0bba,0xffe6e856,0xffe19e82,0xffda30b9,0xffd3d110,0xffcc9836,0x00043daf,0x0006f6a4,0x0001b7c4,0x00037022,0x0004fc5d,0x000a134e,0x000248cc,0xfffe5b28,0x000501af,0xfff8e8fd, -0xfff7c3cb,0xfff6d301,0xfffff706,0x0002a91d,0xffff15f3,0x00074bdc,0x00094391,0xfffedff5,0xfffed509,0xfffc86b0,0xfffbd39e,0xfffc8d30,0xfffe33bc,0xfffedb0b,0x00064242,0x000b028b,0x00154a2d,0x000b5fd9,0x00091c19,0x0002ce68,0x000acb21,0x00082a64,0xfffc24a9,0xfffd64a6,0xfffec77b, -0x000615d4,0x0006ea85,0x001ff9ed,0x000e620b,0x00115bba,0x00108e81,0x001ca729,0x0002562e,0xfffe40af,0x0012f43e,0xfff53624,0xffee97b3,0xffee358b,0x0000e5fe,0x0009c5f6,0x00009ce5,0x0014bc4d,0x00118a6e,0xfffee536,0xfff1135f,0xffe46d3f,0xffe31e23,0xffe45f35,0xffec38bb,0xfff618a8, -0x00109ec9,0x0024ccdf,0x003f2190,0x00259d60,0x0015f457,0x0000aeb3,0x0011ba1d,0x000d6b6e,0xfff48704,0xfff85add,0x000161db,0x001a5e09,0x002068ad,0x001e8716,0xfffe13be,0x000afd22,0x00125ca7,0x0032e940,0x00062475,0xfff24486,0x0014dc8f,0xffdd51f8,0xffd5b375,0xffdd67d4,0x0001f993, -0x00193b7d,0x00054e81,0x0023a6e0,0x00267858,0x0003beaa,0xfff008ba,0xffdb5d97,0xffd4a777,0xffd5b575,0xffe13828,0xffea08e5,0x0016006b,0x003396ba,0x006a02e6,0x0032cfbc,0x00282d8e,0x0005bde6,0x002ff370,0x0022a300,0xffe053ad,0xffed2f9f,0xfff58fdf,0x001cb9b4,0x00208963,0x006550d4, -0x00285540,0x00331610,0x00378e5c,0x004eeff8,0x000bc10c,0x000e35b2,0x0052b072,0x002c0edb,0x002dbf71,0x001d9ced,0x002c4cef,0x003b3cdb,0x002cc2b6,0x003ec092,0x0036319a,0xffee4c2c,0xffcfce95,0xffa83d84,0xff923a1a,0xff92d5a9,0xffac4aa3,0xffd1754f,0x002cf835,0x0080e513,0x00da8d4b, -0x008396de,0x00394207,0xfff25f07,0x002c94a7,0x00242579,0xffce9232,0xfff55ca4,0x001e0e71,0x0062ab3f,0x00706290,0xff6ae397,0xff93fee1,0xff880e4e,0xffbd07cd,0x0039c7fb,0x0036d402,0x0001e7a5,0xff9efd56,0xffa63c46,0xffe52e12,0xffffc245,0x0063260c,0x00584602,0xfffbb7ca,0xfffbc06b, -0x00026800,0x004f34d0,0x004d2ea0,0x0056c222,0x00707ee5,0x00893ab7,0x006ad7af,0x0038fcd5,0xffe05d86,0xff90b275,0xff7062e5,0xff9d88c9,0x00223594,0x00cd5755,0x0076521b,0x004f98ef,0x005a0cbf,0xffb5da47,0xff7e393d,0xff770aab,0xff68e514,0x0096503c,0x007da336,0x00659b91,0xffe001b8, -0xff3011a9,0xff44c24f,0xffa7ad05,0x000e5795,0x00407049,0x002011df,0xffcc00eb,0xffb312e9,0xffd58631,0x0017d3f2,0xfff9351a,0xffec609b,0xffe1fad3,0xfff6d54e,0xfff77b58,0xffd01f20,0xffe9870e,0xffdd2306,0xffdc6b6b,0xffd1e845,0x000ac48a,0x00803fc0,0x009d257b,0x0049986b,0xffa84348, -0xffc0c0c1,0x000c156c,0x005edf92,0x00e15975,0x00c5ce90,0x0014170a,0x00560dc9,0xfe7ebe06,0xfdcc069c,0xff585441,0xffe62801,0xffaa816c,0x0044e911,0x002a9169,0xffa47fd8,0xffbe77c5,0xffe0c84d,0x0012dfca,0x0014c403,0xfffbff77,0xffe00495,0xffe3fb8b,0xfffb03a2,0x0020735e,0x0008bfa3, -0xfffb3331,0xffea13da,0x001fa1a1,0x00361293,0x0031c9c8,0x002e7596,0x000e685b,0xffeb619a,0xffe64117,0x000f2316,0x0017e5d0,0x010312aa,0x00a58559,0xfef9b726,0xff3b052f,0xff57f858,0xff7b2cad,0xff272852,0x00f3ad87,0x0125aee4,0x00b69547,0x006adf59,0x005299fe,0x00153c76,0x0001e398, -0x00111665,0x0008c725,0x00013275,0xffe8126d,0xfff51c68,0xfffda537,0xfffe6eef,0x0003b8e4,0xfff08d6f,0xffcf7353,0xffbb239b,0xffb76e9d,0xffb74f9f,0xffc09f07,0xffcda17f,0xffdfa4ee,0x00137bd1,0x0039eb87,0x006ac68d,0x005c0a44,0x003e950b,0x0003227d,0xffc32a53,0xffc8f65c,0xffea0452, -0x00114ffd,0x001e744a,0x0047411a,0x0086a4ad,0xff37acdd,0xff62700a,0xff97d5d6,0xffdda06f,0x0007cb4f,0x001254d7,0x001ba621,0x002da9f0,0x002d30f6,0x0028d050,0x0012c1b2,0x000e98c0,0x00091777,0x000d9f41,0xffd409f1,0xffb57804,0xffae10cc,0xffaf54e6,0xffbf67cd,0xffccacde,0xffe81b7f, -0x0001c140,0x000b36fb,0x0026b390,0x0043df7a,0x006e4809,0x007e1f88,0x0093ac4b,0x00aed2b7,0x009fefa6,0x0092a8ed,0x006c3f3b,0x00699477,0x0025539b,0xffa617ee,0xff564981,0x0093c2bd,0x007065cd,0x006de36a,0x006fc535,0x00722034,0x00771c71,0x006ff035,0x0060e768,0x005f6814,0x004ea443, -0x003425fc,0x000ff2fc,0xffea70ae,0xffc79863,0xffc75314,0xffcd41dc,0xffdb2b09,0xffcfa1e3,0xffce90c0,0xffced36e,0xffe4f94d,0xfff2de36,0xfffa2df2,0x00067738,0x000422e0,0xfff38ad8,0xffef0150,0xfff2b8e3,0xfff997e2,0x000a357b,0x001e5418,0x00314daa,0x0045475d,0x00629c0c,0x008dd3d9, -0x0096ce8b,0xffc1d030,0xffab7f27,0xffa69685,0xff9df506,0xff8d1efb,0xff9c2922,0xffb0420e,0xffbf72a3,0xffbec37a,0xffc15ac3,0xffc34496,0xffc28c25,0xffbfdae3,0xffb7ed56,0xffbe9392,0xffbc9176,0xffbb63bb,0xffc0194b,0xffc59d40,0xffc7e2e8,0xffd5bc53,0xffe3c8d7,0xfff3cf48,0xfff1a032, -0xfff354ef,0xfff8c332,0xfff4008e,0xffef1405,0xffe92be3,0xffee8229,0xfff251cf,0xfffc60bf,0x00032fc8,0x000497b3,0xffff84c1,0xffdac95e,0xffdb1a3c,0xffcf49ed,0xffcf296a,0xffc3ee21,0xffbf6d03,0xffb92e3e,0xffad3b0d,0xffa3e21d,0xffa80b93,0xffae7aae,0xffb4782f,0xffb7da87,0xffbd1323, -0xffc2a20e,0xffc98ef8,0xffce5f98,0xffd43045,0xffd91441,0xffe1508b,0xffdce3d1,0xffe2642a,0xffe783f7,0xffedc192,0xfff654fd,0xffff3f25,0x000841df,0x00095baf,0x000cb44c,0x000f024c,0x001014b9,0x000f6089,0x000d2a9e,0xfffc2107,0xffee51c9,0xffe6c43e,0xffe229d2,0xffc90f75,0xffc31f36, -0xffc63be0,0xffc5814a,0xffc5f477,0xffbe1381,0xffbd6ded,0xffba9401,0xffc04b4b,0xffc204af,0xffc47ace,0xffc7e787,0xffcb1f79,0xffcdbfaa,0xffcdb453,0xffce4b5a,0xffd55872,0xffd422b7,0xffd58442,0xffd4557e,0xffd87a2c,0xffdabe17,0xffdcda05,0xffdf3874,0xffe10b69,0xffe41287,0xffe3406c, -0xffe2f950,0xffe2cb6d,0xffe28784,0xffe2dc03,0xffe63afb,0xffe0b30e,0xffdc4b9d,0xffd5304d,0xffce8159,0xffca19e9,0x0007a2de,0x0009f5bf,0x00043307,0x0004d545,0x00063618,0x000dcbe4,0x0003a00c,0xffff4ef8,0x00062af9,0xfff8a8ee,0xfff6fdd2,0xfff58264,0x0000a1d7,0x00043bdc,0x0000ce09, -0x0009cd7a,0x000c89fb,0x00051878,0x0002a334,0x00002822,0xffff3e54,0x00009e42,0x0002d481,0x00048ed1,0x000bb37e,0x000fec60,0x00183395,0x000efca8,0x000c9eb2,0x0005aafa,0x000ed2b9,0x000c604b,0xffff80fc,0x00022d69,0x0003ea3b,0x000b700a,0x000ad0db,0x0020c650,0x000e7fea,0x000d4a97, -0x000d6eae,0x00217789,0xffff60c8,0xfff96049,0x001003de,0xffeef696,0xffe7cb09,0xffe8a9fa,0xfffeb2ac,0x000985ca,0x00025064,0x001764ca,0x0016d784,0x000b451a,0xfff792a6,0xffe8a839,0xffe7be5f,0xffeb542c,0xfff5ae16,0x00029ae3,0x001cf578,0x002e7ca2,0x004133cc,0x00273467,0x001730bb, -0x00021b4f,0x00175b50,0x0014f54d,0xfffaadff,0x00026365,0x000b2794,0x0022fdd4,0x002452ba,0x001fe3c4,0xfffde547,0x0003711c,0x000aeb29,0x003a815a,0xfffdd70f,0xffe8ba14,0x000ec91f,0xffce0918,0xffc5280b,0xffca25be,0xfff80bf0,0x00147ae3,0x0002bb5d,0x00263a14,0x002af37c,0x00172bfd, -0xfff9012a,0xffe146bc,0xffd9969b,0xffe02f25,0xffee7691,0xfffbbe3d,0x00280744,0x0041bf93,0x006aed9d,0x00363598,0x002c0d2e,0x0009aff0,0x00377e5d,0x002c0c3f,0xffe6d2c0,0xfffbc376,0x0005c3bc,0x002ac51b,0x00277e11,0x0060bc07,0x0022cdcf,0x002092e6,0x002a1452,0x005e5ddf,0xfffc5b2d, -0xfff47a90,0x003d1ce4,0x000b7eb7,0x0007b0e5,0xfff2655e,0x00237412,0x003aaec3,0x002782f1,0x00457055,0x0044c6c1,0x0011c638,0xffdde884,0xffab6b71,0xff959360,0xffa2c2f9,0xffc44372,0xfff261c3,0x004f9fbb,0x009a1047,0x00d59458,0x007a7eea,0x0032b061,0xfff1e85d,0x003531d6,0x00331465, -0xffde37ee,0x000f0d43,0x0034bb3c,0x00746c2a,0x00745846,0xff6c55ed,0xff9e35b0,0xff7ecf49,0xffab0d9d,0x0026aa52,0x00323dc0,0x000f2772,0xffb90594,0xffba97e4,0xffee6b80,0x0001e43b,0x0048ae56,0x003ec894,0x000f7431,0xfff02ad4,0xfff3b49c,0x00489526,0x0059a596,0x0073b1f2,0x00920e36, -0x0097c7fc,0x006e1e1f,0x0035fd60,0xffce1c11,0xff835b50,0xff7d061e,0xffc10fe0,0x004a3947,0x00d675d8,0x008517df,0x0050b7dd,0x00459730,0xffbc340f,0xff9362de,0xff9386f3,0xff73a8bf,0x00855d69,0x00870d0a,0x00924968,0x0016a3d3,0xff4bc8d7,0xff3f8746,0xff8dc954,0xfff7bd6c,0x002e2c35, -0x001883fe,0xffd8e814,0xffba223f,0xffd01ef0,0x000f8214,0xffeec42e,0xffe99484,0xffddd6df,0x0006d023,0x000d21a1,0xffead05b,0xfff2c024,0xffe16b84,0xffe9dcf1,0xffe4a8d9,0x002303ed,0x00a3ff8c,0x007f05ac,0x0018afed,0xff84f984,0xffbd0616,0x001b82e2,0x0068e0da,0x00e9dab4,0x00b4baeb, -0xffd5f5df,0x002b7cdd,0xfebe2c86,0xfd9071f4,0xff1289f1,0xffbaa281,0xff9959e2,0x004381a3,0x00315e7a,0xffc2f301,0xffc4d7b0,0xffdd99f6,0x000e867e,0x001be1de,0x00036ca6,0xffd97dfc,0xffe2bf46,0xfff7b1b5,0x001e891c,0x000c4c5d,0xfffec72d,0xfff1f986,0x001cc349,0x002aaa6d,0x002362a4, -0x001a2ef2,0xfff9c440,0xffe1e424,0xffde82fc,0x0009bf4a,0x00132e81,0x00edcca0,0x0088d20d,0xfeeddc84,0xff4ae315,0xff78f366,0xff985a7e,0xff7e654f,0x00fe1296,0x015f38c4,0x00ef8e09,0x00892307,0x00449bbe,0x001c8022,0x000f511f,0x0012d839,0x00094414,0x0007b211,0xffef0c60,0xfff26ec6, -0xfffaa5fb,0x0006ce99,0x00066825,0xfff76029,0xffde53d0,0xffc819de,0xffbf27ee,0xffbf3d4e,0xffcc0baa,0xffdc58a6,0xfff5402f,0x001daa3d,0x003f69ba,0x006297f6,0x004e9cfc,0x0022fc21,0xffcfee93,0xffb18f96,0xffc3ddb1,0xffdeefa2,0xfff90f92,0xfffe95e3,0x002b32dc,0x00728a45,0xff427624, -0xff747bce,0xff93f1a1,0xffd77506,0x0001cb8b,0x00022eec,0x000b15f0,0x002bea9f,0x0026793b,0x001e89c9,0x000b3105,0x0002e67a,0x000072e4,0x000ca820,0xffd81afe,0xffbbfc7b,0xffaa0ee9,0xffaa7b71,0xffb2f946,0xffb9ab0e,0xffd70c1a,0xfff3bacd,0x000541a1,0x0022daf1,0x00456341,0x00764957, -0x007e9f4c,0x008fa509,0x00a0e2d0,0x00955ff6,0x007e907c,0x00524abb,0x00464170,0x0009d27d,0xffa29e38,0xff5c335e,0x008e1b82,0x007c12cd,0x007d0029,0x0079bd28,0x0077194d,0x0074f86c,0x00690a8a,0x005dc69c,0x005eaa6e,0x0054e5e5,0x003f03ce,0x0021d127,0xfffb00a3,0xffd1f0c5,0xffcab38e, -0xffcee99c,0xffddac9a,0xffda7974,0xffda0c48,0xffd81ca5,0xffe6435c,0xffedae7e,0xfff296f4,0xffffd56c,0xfffd9d96,0xffef960d,0xfff2e93d,0xfffb46e7,0x00040b2e,0x0013a5a6,0x002ba904,0x0042d0fc,0x0051982b,0x0063f224,0x00806f30,0x0089a676,0xffccdb7e,0xffb7022d,0xffb4ebe4,0xffb295e3, -0xffa78882,0xffb8547e,0xffcdee7d,0xffde508e,0xffd67451,0xffd3756a,0xffcc802b,0xffc965d2,0xffc0fa71,0xffb906df,0xffbc85c6,0xffba61e5,0xffb71ed9,0xffbc48ed,0xffc240ee,0xffc7aa4c,0xffd20593,0xffdbe95e,0xffe6d307,0xffe9606b,0xffeeefd2,0xfff6e604,0xfff31fb1,0xffef1206,0xffeabd6d, -0xffed3e9c,0xffef7cb0,0xfff99afb,0x0000d3c2,0x000587c4,0x0003f785,0xffe43f6d,0xffca38c5,0xffbf60a4,0xffbf30c0,0xffb71ca3,0xffb2257e,0xffaca083,0xffa2d704,0xff9b50b7,0xffa10134,0xffa87cf2,0xffaf00af,0xffb4b2aa,0xffbaa000,0xffc037ed,0xffc44ba1,0xffc82e14,0xffcc817e,0xffd0651b, -0xffd565dc,0xffd2d29d,0xffd780b7,0xffdc477d,0xffe1b3db,0xffe917b2,0xfff039f1,0xfff86a20,0xfff7ff46,0xfffa3c0a,0xfffbc8ca,0xfffd8b39,0xfffdce3a,0xfffc10e3,0xffec488e,0xffddde73,0xffd50dac,0xffd01213,0xffc60d26,0xffc076ef,0xffc29884,0xffc16bae,0xffc13314,0xffbd5dde,0xffbbf8a1, -0xffb7ba55,0xffbd334f,0xffbeea0b,0xffc18e52,0xffc43dec,0xffc74e5e,0xffca6494,0xffcb40c7,0xffcc14aa,0xffcf381f,0xffcef08e,0xffd0246e,0xffcf783f,0xffd37fae,0xffd61c0c,0xffd89935,0xffdafc1c,0xffdcf2af,0xffdffc93,0xffdf286c,0xffdecb8e,0xffde2bef,0xffdd16f6,0xffdc5643,0xffde64fe, -0xffd9e7d1,0xffd6d3ca,0xffd14168,0xffcb67bb,0xffcad5ec,0x000a6f89,0x000c81ba,0x00068562,0x0005eb66,0x00071d98,0x00114f74,0x0004a1af,0x00007820,0x0007bc7e,0xfff927eb,0xfff70d0d,0xfff60284,0x00015d3b,0x00057ae0,0x0002d8dc,0x000b88f9,0x000e89b4,0x000ac0d2,0x0005bdec,0x00032be6, -0x00024585,0x00042ea3,0x0006e07c,0x000a0be2,0x001030c9,0x0013b6ac,0x0019d4d2,0x0011d71b,0x000f8a9f,0x0008997d,0x0011b447,0x000f614d,0x0002a5ca,0x00064785,0x000851d0,0x000fe0ac,0x000e1979,0x0020a707,0x000e7621,0x00094cd8,0x000a40f1,0x00249dc1,0xfffd0269,0xfff563b5,0x000d0782, -0xffe9972a,0xffe23e84,0xffe5ce6b,0xfffb930d,0x0007bdab,0x000398b7,0x0018c6d6,0x001a8da0,0x0014ceb2,0xfffd8864,0xffede7e9,0xffed3bb1,0xfff29095,0xffff1281,0x000f6a46,0x00273680,0x00352ef4,0x003fcde7,0x0026df74,0x001767ec,0x00045c08,0x001b0971,0x001a2ee6,0x0000ccb3,0x000af11c, -0x00132a5e,0x00295371,0x00269e58,0x00216d8c,0xfffe8c94,0xfffc97c5,0x00037788,0x003e672a,0xfff6b4f2,0xffe1c105,0x0009fc53,0xffc20b59,0xffb8132e,0xffbe4bfb,0xffed5473,0x000c85c2,0x0000064c,0x0025f22e,0x002bc6e9,0x0024ecaf,0xffffdc17,0xffe731e7,0xffdfb556,0xffea22da,0xfffae205, -0x000ea8bf,0x0036e310,0x004befc9,0x0067076f,0x003825bf,0x002ee711,0x000fac8e,0x003b0edc,0x0030a28d,0xffee2687,0x00081d6e,0x0013924e,0x0035ff67,0x002d562f,0x005a2ba3,0x001dcb68,0x000e9c62,0x001aeb0a,0x00674e7a,0xffed16ac,0xffdc35ee,0x0026e49c,0xffeb4188,0xffe2beb7,0xffce6281, -0x001673c1,0x0034610c,0x002424aa,0x00482b7d,0x004eb720,0x0030a2e0,0xffeb4e56,0xffb33039,0xff9f4da7,0xffb55c2a,0xffde416e,0x0017000b,0x006d26fd,0x00a9c596,0x00c59dda,0x006b504e,0x002944b1,0xfff57d67,0x00391a6b,0x003bfa2d,0xfff0114f,0x00254c3e,0x004694ef,0x00806ce8,0x007442dd, -0xff75e1bc,0xffa8aed4,0xff7b0d64,0xff9f354c,0x00137b8f,0x002f4cfc,0x001e2768,0xffd9d5b4,0xffd1ee9a,0xfff65096,0xffff9c32,0x002b1fb6,0x00258d20,0x0020d5a5,0xffe34aa5,0xffe1ae49,0x00372f00,0x005b4ec6,0x00828a9d,0x00a0c196,0x0094bc79,0x0063af13,0x0027442d,0xffbdd9b9,0xff827fbd, -0xff92faf4,0xfff899f2,0x007f3b4d,0x00d9ddf0,0x0090ede2,0x004bc523,0x00241850,0xffbb7dfc,0xffa31e35,0xffadbb64,0xff84f2f9,0x00643b15,0x00895186,0x00bab2db,0x004c7577,0xff6e61ed,0xff3f84cb,0xff77875f,0xffe26000,0x0019aaa3,0x000f1cc9,0xffe36d85,0xffc62d9a,0xffce9e70,0x0004a885, -0xffe87616,0xffed03a5,0xffe05956,0x001513cb,0x001febe3,0x0006ce04,0xfff93313,0xffe6e4f7,0xfffade93,0xfffa4cf3,0x0039675e,0x00b28119,0x00599017,0xffe750bd,0xff60eac0,0xffba0a12,0x00281d47,0x00710904,0x00e27507,0x009a9923,0xff9ef6bb,0xfffd22c2,0xff15a465,0xfd87da54,0xfebb66fc, -0xff6b14a6,0xff9bb43c,0x002ef1e1,0x002793a4,0xffe622e5,0xffd01096,0xffde46bb,0x000a4bda,0x001da72f,0x00084f5a,0xffd5500d,0xffe34537,0xfff3ba10,0x00184909,0x0011c3bf,0x0008a6ab,0x0001e4b0,0x001c84fa,0x001f36f7,0x0013f44a,0x0003d5f9,0xffe43654,0xffd719b3,0xffd46c80,0x00045d13, -0x0022e292,0x00ba73ad,0x00547381,0xff0c5afe,0xff657781,0xff9880b7,0xffae8176,0xffddc105,0x00e4570d,0x016c48e0,0x011c415a,0x00a84f96,0x003c7581,0x00283b55,0x00230160,0x001588d1,0x0007a042,0x000899a3,0xfff4c664,0xfff00fd9,0xfff88f55,0x000c3d61,0x0007dd90,0xffff0cdc,0xfff002b8, -0xffd8c16f,0xffca18d8,0xffcb1d49,0xffd85381,0xffead193,0x000b013e,0x0023ce5d,0x00403871,0x005455de,0x003f180f,0x000b09f1,0xffb21589,0xffa974a7,0xffc16370,0xffd78318,0xffe31022,0xffe42086,0x000ca986,0x005267f1,0xff62e49d,0xff8c9c41,0xff95d2b4,0xffd0d89c,0xfff92d87,0xfff4c6db, -0xfffcb406,0x0027dd12,0x001c5fbc,0x000fe79c,0x0000906c,0xfff95413,0xfff92958,0x00066860,0xffdd7d5a,0xffc49b8b,0xffa71043,0xffa7b740,0xffaa098e,0xffacbd3a,0xffc68724,0xffe432f2,0xffff49bd,0x001c4783,0x00417f34,0x0073e648,0x00794613,0x0087d6ff,0x008facd5,0x0087df91,0x006951a4, -0x0038668a,0x0027ab48,0xfff7c31c,0xffaa2ee6,0xff77e490,0x0078c0c3,0x007719d0,0x007a6be1,0x0071f53f,0x006d6d67,0x0066eda5,0x0058d455,0x00508f9f,0x00536b8b,0x005191d6,0x00433d6f,0x00302252,0x000bbb0e,0xffdfd187,0xffd152b3,0xffd17956,0xffdda4ce,0xffe22ab8,0xffe3fd85,0xffe3413e, -0xffe968d6,0xffeb5776,0xffec7189,0xfffcc96c,0xfffd2af6,0xfff31388,0xffff9c9f,0x000b8d3c,0x00165df6,0x00250f51,0x003fd320,0x0059f150,0x005f8593,0x0063ede8,0x006f01d1,0x00729050,0xffddfefc,0xffca809a,0xffcaed37,0xffcff827,0xffcb59de,0xffdbeb51,0xfff127cf,0x00015544,0xfff2e371, -0xffeaa119,0xffdacee1,0xffd4cd8e,0xffc6e5eb,0xffbe85f0,0xffbf1cf5,0xffbc58a9,0xffb70858,0xffbc7f39,0xffc2600a,0xffc9566e,0xffd009db,0xffd649c3,0xffdc13b4,0xffe3dea2,0xffedc305,0xfff92967,0xfff77e7a,0xfff5faf4,0xfff53c76,0xfff28197,0xfff08bd1,0xfff6d2e3,0xfffc1331,0x0002457f, -0x00044566,0xffef486f,0xffbc4ebc,0xffb3ddf6,0xffb1e717,0xffaea88b,0xffa8f073,0xffa4e549,0xff9dede4,0xff98272b,0xff9f3240,0xffa6f081,0xffadb5c4,0xffb5321b,0xffbb7827,0xffc0cc37,0xffc2e776,0xffc618e4,0xffc9080b,0xffcc05f2,0xffce84dd,0xffcd61e9,0xffd0f339,0xffd4d5a8,0xffd8f04c, -0xffde70ca,0xffe2e505,0xffe91d29,0xffe671c8,0xffe68014,0xffe670dd,0xffe8113d,0xffe939dc,0xffe80a77,0xffdc4f0a,0xffcf8f89,0xffc6558f,0xffc0c0e3,0xffc62b88,0xffc1c92d,0xffc24957,0xffc0c8f1,0xffc00e25,0xffc05cfe,0xffbe8ff9,0xffb96f7b,0xffbe41ae,0xffbfdeeb,0xffc28b1a,0xffc46b1d, -0xffc73a7d,0xffca84b5,0xffcb692e,0xffcc31c5,0xffccabcb,0xffccc822,0xffcd97bd,0xffcd40cc,0xffd0f293,0xffd3ac90,0xffd64bb6,0xffd875dc,0xffda699d,0xffdd4da7,0xffdc4ec4,0xffdbbbc9,0xffda87b1,0xffd8bd78,0xffd6d4b5,0xffd706db,0xffd3c840,0xffd21958,0xffcecec9,0xffcab7a6,0xffcd4438, -0x000cfd57,0x000edef6,0x0008ce1e,0x0007cf18,0x0008aec2,0x0013fe59,0x00061389,0x000265bc,0x000982dc,0xfffa78d0,0xfff809e2,0xfff7eee3,0x00022cc6,0x00065edf,0x0004b5cd,0x000d2744,0x001039f5,0x000f093f,0x0008e418,0x00066c90,0x0004e4d4,0x00075deb,0x000a82c3,0x000f4abe,0x00141c43, -0x0016db9e,0x001aca32,0x00142980,0x00120c50,0x000be9c6,0x0013afac,0x00117e8f,0x0006083f,0x000a2e83,0x000c78f5,0x0013f060,0x0011125e,0x00202984,0x000eb10d,0x00073869,0x00085df5,0x0025dc5e,0xfffbb409,0xfff2d3dd,0x000a26fa,0xffe5ca0a,0xffdeedaf,0xffe60253,0xfff8affe,0x000557d4, -0x000466f5,0x001950d5,0x001d133a,0x001b935e,0x0003ad40,0xfff49014,0xfff339d1,0xfff9b521,0x0008185f,0x001bdc66,0x00301b99,0x003a4454,0x003ce86d,0x0026241d,0x0017a86c,0x0008203e,0x001cefbc,0x001d23ab,0x00071036,0x0012a375,0x001a6ae5,0x002e730a,0x00282d60,0x00231205,0xfffff63e, -0xfff934a6,0xfffe4d9c,0x003e37b4,0xfff17965,0xffdda981,0x000605a4,0xffb9d116,0xffaec7fb,0xffba2dd3,0xffe324a1,0x0002d683,0xfffc3991,0x002388e6,0x0029f901,0x002c6fde,0x0005c6d8,0xffee1a4d,0xffe5e64f,0xfff2d744,0x0005ee30,0x00215d10,0x004370e9,0x005382af,0x0060e1d2,0x00399f5d, -0x003116e7,0x001805c6,0x003a9685,0x0030a652,0xfff74ad0,0x001379ac,0x00207b73,0x003fc6e6,0x00328f1c,0x00525fca,0x0018a355,0x0000b6b1,0x000d7fab,0x00688b4d,0xffdf9210,0xffc740ff,0x00121768,0xffcd9eb6,0xffc1f7fa,0xffb57db9,0x0006670a,0x00293451,0x00214b9e,0x004712e0,0x0053a782, -0x00476007,0xfff97e21,0xffc10f31,0xffad99b1,0xffc9118f,0xfff8bd02,0x003c3dbb,0x0086b7b7,0x00b3eab2,0x00b1fd0c,0x005cbea3,0x002142f2,0xfffe4833,0x003894ac,0x003eacbd,0x000341af,0x003924a8,0x00567218,0x00890047,0x00724e1e,0xff8a3f01,0xffb662ff,0xff815db0,0xff9cbba5,0x000341b0, -0x002e9cbc,0x002eb291,0xffff6485,0xffe87035,0xfff922a2,0xfff8b4d9,0x000dad3a,0x000fab59,0x002e57f6,0xffd66106,0xffcde713,0x001de127,0x004eac3d,0x007e4e99,0x009b4a76,0x007f60b7,0x004c13e8,0x000e0624,0xffb113d4,0xff8a7548,0xffa6be31,0x0036375a,0x00b533a2,0x00d4353f,0x0095cafa, -0x00407182,0xfffbf873,0xffb85101,0xffaf7ad1,0xffc0c2b9,0xff9d4f5a,0x003cfd04,0x007eccf5,0x00d6f989,0x0079270c,0xff94d9b1,0xff4329a0,0xff644219,0xffcbec9c,0x0004476d,0x000652ee,0xffeb97c3,0xffd41ff4,0xffd00686,0xfff8ed37,0xffe7465c,0xfff5d624,0xffe88d34,0x0020fca4,0x002de574, -0x001fb475,0xfffe6207,0xffef0a78,0x000d9d7c,0x001467a0,0x004e4697,0x00a9cd65,0x00313904,0xffba9dbb,0xff4178ea,0xffb8bee8,0x0032ff38,0x00740758,0x00c8d111,0x0074e6c0,0xff70ba0e,0xffd44d1d,0xff69e424,0xfda40578,0xfe67337a,0xff139d28,0xffb4deed,0x000e19db,0x000e397c,0x0005014d, -0xffddd163,0xffe2f955,0x00067079,0x001a8c9a,0x0009c84b,0xffd2ff52,0xffe480ba,0xffee7fe3,0x000df6fa,0x00163406,0x00149dc4,0x00144bf2,0x001da1cf,0x0013f928,0x0002d461,0xffec2c3f,0xffcfa331,0xffccddbf,0xffcb2b93,0x00043f5d,0x004499db,0x007b858f,0x0012774a,0xff33c0e4,0xff92fea4, -0xffc6570c,0xffc188ce,0x002ac58c,0x00acb8a7,0x0147d044,0x01355e48,0x00c70065,0x00400e54,0x0036930d,0x003863de,0x001b961f,0x00046c3e,0x0005486e,0xfff85b9e,0xffef162e,0xfff7b3eb,0x000d2618,0x00086397,0x0007109a,0x0002ada6,0xffeb419d,0xffd84192,0xffd9ef69,0xffe514e9,0xfff9138d, -0x001fa65e,0x0027e639,0x003d42a1,0x0043d6e2,0x00300ddd,0xfff8f7a3,0xffa6c9b4,0xffaddf21,0xffc891e4,0xffd8fa5c,0xffd1717f,0xffd2ad62,0x000088ab,0x002f8845,0xff92f500,0xffa97811,0xff9c4f29,0xffc9ba15,0xffee4008,0xffec4cab,0xfff3679c,0x00236566,0x00112404,0xffffb20d,0xfff4400e, -0xfff1d35b,0xfff38dc4,0xfffdce23,0xffe3e1d9,0xffcdfc24,0xffa627e6,0xffa6a873,0xffa47878,0xffa65134,0xffb8f89b,0xffd5574d,0xfff83222,0x0015938b,0x003bba14,0x0067e4b7,0x00703d52,0x007f8afd,0x0080cf97,0x0079b629,0x005511e9,0x002526e8,0x0010ec0a,0xffeefb18,0xffbb9305,0xffa06a86, -0x0057429e,0x0061e82c,0x00694058,0x005e540c,0x00594d6a,0x00505c46,0x0042ba09,0x003d8db8,0x00415eae,0x0046d916,0x0040c58a,0x0038c224,0x0019f5b8,0xffeef9d1,0xffda0a17,0xffd4d233,0xffdb9cc9,0xffe5298a,0xffe96643,0xffebb4d1,0xffec8ecb,0xffebaa1d,0xffe98b76,0xfffd9573,0x0002fbc6, -0xffffd771,0x0013ff64,0x00210c52,0x002c59ac,0x003c0ee0,0x005823cd,0x0072f68b,0x006b89ab,0x0061f7e0,0x005e252e,0x005603c8,0xfff612f0,0xffe5ddd0,0xffe77ce6,0xfff2c06a,0xfff461eb,0x0003cf15,0x001720f1,0x0026df09,0x0012dbb2,0x0005e359,0xffeede5a,0xffe4b722,0xffd0d425,0xffc6863a, -0xffc50517,0xffc1ca92,0xffbab7c4,0xffc01da6,0xffc55ee7,0xffcc87e8,0xffd019cb,0xffd375f4,0xffd4f471,0xffe0ad36,0xffed777d,0xfffb3047,0xfffcde4c,0x00000aad,0x0004941a,0xfffd6a5f,0xfff74654,0xfff8f8fd,0xfffaf981,0x0000d3c7,0x0005c113,0xfffe39a6,0xffb56c19,0xffb0ad5b,0xffac44d5, -0xffae3d5f,0xffa7b1e1,0xffa5707d,0xffa14d8f,0xff9cb080,0xffa3eaa7,0xffaa85d5,0xffb07bf5,0xffb860d6,0xffbe1e77,0xffc22e82,0xffc37975,0xffc5ef9f,0xffc7a700,0xffc9d4f4,0xffcaf80e,0xffca0677,0xffccec5e,0xffd03837,0xffd363f6,0xffd746ab,0xffd985db,0xffddcbd2,0xffd8e68c,0xffd620eb, -0xffd40b35,0xffd4c76d,0xffd67a13,0xffd5a35c,0xffcfa1ce,0xffc69fa9,0xffbe4ac1,0xffb879fb,0xffc889e7,0xffc5de81,0xffc525c6,0xffc3b15a,0xffc2c0b3,0xffc6163a,0xffc4a3c0,0xffbf6871,0xffc2d8db,0xffc40b08,0xffc648b8,0xffc7240b,0xffc96a90,0xffcc5533,0xffccc9dc,0xffccfcda,0xffcd17e1, -0xffcce972,0xffcd07c6,0xffcc2e61,0xffcfafbb,0xffd24c81,0xffd4de12,0xffd6c08b,0xffd8a190,0xffdb6996,0xffda0fea,0xffd94ad2,0xffd79431,0xffd559b0,0xffd287ce,0xffd0d8ae,0xffceed5a,0xffce6ce5,0xffcd8e9e,0xffcbb6f8,0xffceb877,0x000f016b,0x0010bd38,0x000b06ea,0x0009b990,0x000a06e7, -0x00153023,0x00074d69,0x0003fce9,0x000a8a17,0xfffbbe77,0xfff92fe5,0xfffa7af9,0x0002a186,0x00068778,0x0005ae15,0x000de13c,0x001114d6,0x001189f8,0x000b4184,0x00091a1d,0x0006f005,0x0009de59,0x000d63b7,0x0013a314,0x00172b8e,0x001912bc,0x001a8be9,0x001591b1,0x0013cf17,0x000f3feb, -0x0014a09b,0x00129582,0x00092d78,0x000d8fc8,0x00101304,0x00178b04,0x00137380,0x001f5258,0x000f2910,0x000651a6,0x00077b99,0x0023fa27,0xffface24,0xfff13599,0x00068205,0xffe326c3,0xffdd4909,0xffe8105d,0xfff5ff70,0x00025da6,0x0003df47,0x0018c12a,0x001e39ab,0x001f2997,0x0009c3d0, -0xfffbb8d2,0xfff91be6,0x0000726d,0x001012ed,0x0026b26d,0x00375b7c,0x003db7ca,0x003853df,0x00253c99,0x00184172,0x000d6b15,0x001d4376,0x001de218,0x000ca43a,0x00192cc0,0x0020d8d0,0x0032dab7,0x0028de29,0x0024c185,0x000260be,0xfff90594,0xfffbd91e,0x003966fa,0xffedfc70,0xffdbbd98, -0x000128d5,0xffb43cec,0xffa8b21d,0xffbc05c3,0xffda2cda,0xfff885dc,0xfff696ad,0x001f6459,0x00264248,0x002d9666,0x000b00ad,0xfff52138,0xffeb2c4e,0xfffa107a,0x000ee7e9,0x00318e01,0x004d1e82,0x0057fc58,0x0057205c,0x003a28e9,0x00327810,0x00220b6d,0x00369930,0x002cf6f9,0x0000d2db, -0x001d82fa,0x002c1ff7,0x00494564,0x0036e4d8,0x004a215d,0x0014ba46,0xfff790bc,0x0002c9c7,0x0060dfda,0xffd44dd7,0xffb62669,0xfffe96b4,0xffb303e4,0xffa5be3a,0xffa9345e,0xfff431b7,0x0019c19c,0x001cd6a8,0x00426974,0x0053d704,0x0054d06b,0x0009089e,0xffd453d9,0xffbf9a48,0xffddb2ea, -0x0011d272,0x005e4fbe,0x009b86ea,0x00b8e35f,0x009bdaf1,0x005243ca,0x001e63af,0x000d1d81,0x00353868,0x003c073d,0x0014ed61,0x0049c29c,0x0064d838,0x0090d730,0x006ed2cf,0xffab4394,0xffc80f87,0xff932f55,0xffa5b5d7,0xfff9602e,0x003147f7,0x004057e5,0x0026b3a4,0xfffc9344,0xfff71435, -0xffef4f3c,0xfff48e72,0xfffefcd9,0x00381a62,0xffcb31fa,0xffba9b03,0xffffe8ad,0x0032c944,0x0064d7b4,0x007eac29,0x00598222,0x002afc49,0xffeea79b,0xffa63a2d,0xff9470b2,0xffb21078,0x00668df7,0x00d9c7a0,0x00c0c2bc,0x009082b2,0x0031be28,0xffd57ed0,0xffb67094,0xffba40c4,0xffcc4973, -0xffbcb45c,0x001864a0,0x0069f688,0x00e11365,0x00954238,0xffbaa448,0xff4825b6,0xff53112d,0xffb4cd0e,0xfff238f3,0x00016401,0xfff13c7a,0xffe1835b,0xffd35ca1,0xffeca937,0xffea8156,0x0001e121,0xfff42fec,0x002a4da4,0x00370555,0x00348f53,0x00055b48,0xfffad856,0x00202d66,0x00341df6, -0x00627b6b,0x008f75dd,0x000835fc,0xff943fc8,0xff2d0b2c,0xffbb82d7,0x003b85e7,0x006e8edf,0x00a086df,0x00454a62,0xff4e7c5a,0xffb52958,0xffa08fb8,0xfdd518a0,0xfe2b149a,0xfece3ba8,0xffe05ad9,0xffec5c89,0xffed3569,0x00190434,0xffea1a8b,0xffe9b022,0x0003ea0a,0x001427d8,0x0008506f, -0xffd37e7d,0xffe4f824,0xffe7e107,0x0000abfb,0x00169674,0x001d9a1b,0x002191a8,0x001c4c5b,0x0007fa1b,0xffee9702,0xffd4332b,0xffbda660,0xffc50eff,0xffc5c9b0,0x000b75a6,0x0071e0da,0x003cc13f,0xffcce5c6,0xff5794fa,0xffc03bc8,0xfff8de4f,0xffe034ad,0x0053398c,0x00661bc0,0x00f8f92f, -0x0134c0fe,0x00df1358,0x0051a5bb,0x0041fa1f,0x0047ed12,0x00264f14,0x000289da,0x0001480b,0xfffb06b6,0xffeff784,0xfff7d79e,0x00090b6f,0x00080627,0x000ec404,0x0013df64,0xfffdbf87,0xffe8e385,0xffe90a6a,0xfff1bf96,0x0006d9e2,0x0030cb39,0x002c57c1,0x00382d3e,0x003310a4,0x0022f101, -0xffed531d,0xffa75cc8,0xffbb63de,0xffd6a27e,0xffe0e800,0xffc5eb44,0xffcc8a6a,0x000e8a67,0x0010ff64,0xffc79d38,0xffc86611,0xffa71bcd,0xffc35cad,0xffe1aa0f,0xffe8bcbf,0xfff0484e,0x001e2494,0x000735f3,0xfff22f2e,0xffe8c80f,0xffec51fd,0xffefe8a1,0xfff5d420,0xffeac500,0xffd73b24, -0xffa8d70f,0xffa77bd6,0xffa1fe9d,0xffa5f2f4,0xffb0c92c,0xffc93e06,0xffef54f9,0x000fefe4,0x0035ef0e,0x00592451,0x00667a3e,0x007761dc,0x00767c14,0x006b4283,0x004270c4,0x001a1abd,0x00031326,0xffeb8af9,0xffce7edf,0xffca0185,0x002e2afa,0x0040f8eb,0x004cbf8f,0x00444ac0,0x0040f2ac, -0x00375f2d,0x002c332c,0x0028f5d2,0x002d4148,0x0037c4c1,0x0038a55f,0x003af521,0x0023e089,0xfffd7d83,0xffe41f0a,0xffd974b1,0xffd91d77,0xffe3cb67,0xffe96009,0xffef3a39,0xffef1489,0xffeee6f0,0xffeb2f04,0x00028c65,0x000e40b3,0x001423a6,0x002dbc32,0x003aca68,0x0045b3ef,0x0054f354, -0x006fe10d,0x00890e61,0x0075e12a,0x005f6ef3,0x004b59e7,0x0035a7c9,0x00147b6d,0x0007593d,0x0007c01e,0x0015d7a3,0x001bb316,0x002935be,0x0039066a,0x0047ee39,0x003114c7,0x00218c44,0x00073795,0xfff87d1d,0xffdee093,0xffd21db8,0xffce1a3b,0xffca267c,0xffc0c619,0xffc6002f,0xffca589d, -0xffd0e65c,0xffd2486d,0xffd3571c,0xffd201a2,0xffdf640e,0xffecaafe,0xfffa3c5f,0x000107d1,0x000aa68b,0x0015e75c,0x000d03f5,0x0004a559,0x0002fc4e,0x0002161d,0x00073159,0x000f28cc,0x0013b7d6,0xffb6cf7d,0xffb62449,0xffafba26,0xffb6e251,0xffafef98,0xffaf6b13,0xffadf992,0xffaa2ae4, -0xffafa584,0xffb348cb,0xffb6b63b,0xffbd3836,0xffc1229c,0xffc296b4,0xffc40b24,0xffc63808,0xffc730e4,0xffc8f24a,0xffc8d3a6,0xffc8bac6,0xffcb8c61,0xffce98d2,0xffd157e6,0xffd3f1ed,0xffd4f21a,0xffd7b813,0xffd1522d,0xffcbe454,0xffc80c03,0xffc770ff,0xffc93e1b,0xffc88f0b,0xffc86e48, -0xffc41107,0xffbdc58c,0xffb854fb,0xffcc408d,0xffcb85ca,0xffc94b53,0xffc7d478,0xffc6fee7,0xffcca2e6,0xffcb8fb9,0xffc710ea,0xffc85b0b,0xffc8bbe6,0xffc9fb4e,0xffc9840f,0xffcadb17,0xffcca0a4,0xffccc2ad,0xffccc4d0,0xffcd4330,0xffccc257,0xffcca50f,0xffcc1da1,0xffcf026d,0xffd13f54, -0xffd3829a,0xffd51964,0xffd6c6fc,0xffd95a77,0xffd7b591,0xffd6ed20,0xffd502eb,0xffd2e0cd,0xffcfce33,0xffccea03,0xffcc2abc,0xffcc72d5,0xffcd8461,0xffcddcdc,0xffce5634,0x000f8393,0x00115e74,0x000c38d4,0x000b22a6,0x000b30b5,0x0015615c,0x0007b721,0x00052e2b,0x000ae2f7,0xfffd4cf5, -0xfffacc34,0xfffd67a3,0x000340e5,0x0006b019,0x00065161,0x000ddc85,0x00109f89,0x0012f8a3,0x000ccdab,0x000aad87,0x00078fe3,0x000aec63,0x000e9744,0x0015d351,0x00184f3e,0x001967bd,0x00186032,0x001550a5,0x001400b6,0x00114f7e,0x0013ac2a,0x0011c04b,0x000abadb,0x000f65b6,0x00121cd6, -0x00197a23,0x0014515f,0x001d4260,0x000f3159,0x0006d445,0x000691c2,0x001e60c7,0xfffa26f3,0xfff03cc9,0x00011709,0xffe13ada,0xffdcc9b5,0xffea67bf,0xfff36600,0xfffeb426,0x00015a09,0x00170bea,0x001dc009,0x001f2660,0x000eb725,0x0002f778,0xfffe3a95,0x00060490,0x0015e507,0x002de94f, -0x003b3b1a,0x003e118c,0x00316563,0x00235769,0x00184e73,0x00126c4b,0x001b3f54,0x001bb5e1,0x000fd102,0x001d657a,0x002547b0,0x00350f76,0x0027bd02,0x00252396,0x00061fa7,0xfffbad98,0xfffbacf5,0x002fecb1,0xffecad18,0xffdc1400,0xfff97b22,0xffb14833,0xffa528cd,0xffc00266,0xffd234b4, -0xffeefe75,0xffeeaaf2,0x001a72f5,0x00211b2a,0x0028a897,0x000ec643,0xfffb663e,0xffef83e5,0xffff317a,0x0014c85d,0x003c4339,0x0051d127,0x0057d0e5,0x00496412,0x0038d98a,0x00323257,0x002acbfa,0x002e7a73,0x0024ead8,0x00076ab3,0x0024f410,0x0034e05e,0x004fe69e,0x0038edd5,0x003f6b5f, -0x00128d14,0xfff38993,0xfffa598c,0x004f5dca,0xffcc6571,0xffa9e0e4,0xffeaa56b,0xff9c4d80,0xff8ec42f,0xffa7ca53,0xffe1b694,0x00074684,0x0014be77,0x003b23fa,0x004fa68b,0x00580f36,0x0017a46a,0xffeaf064,0xffd4b65c,0xfff273fe,0x00275e1f,0x007869f9,0x00a81aa6,0x00b64e30,0x0082b9f5, -0x004abc02,0x001fc3d7,0x001e4f7b,0x002e863b,0x0033cdbe,0x002119fd,0x00556ce4,0x006fb03a,0x00954ae0,0x0067fccb,0xffd73d24,0xffdd7d1d,0xffb2735a,0xffbc993b,0xfff743f1,0x00380a47,0x00529527,0x004cd756,0x000e4939,0xfff2c877,0xffe6dc74,0xffe2f3a9,0xfff3ca29,0x003e6947,0xffc358a8, -0xffaa9063,0xffe0afce,0x000c3eea,0x0039cac2,0x004be34b,0x00276a0c,0x00035e4c,0xffcb0b02,0xff9b193b,0xff9be8cb,0xffb5ca25,0x00816135,0x00e489bf,0x00a0e109,0x007f6450,0x001f8aaf,0xffb4dc35,0xffb6ffe3,0xffc4a1d2,0xffd1fe7e,0xffe192c5,0xfff8ed85,0x004ea09d,0x00d8b54e,0x00a0ae54, -0xffdd6202,0xff4ce31c,0xff41e4d8,0xff9fd318,0xffe6589b,0x0001a96f,0xfff5875b,0xffed5dec,0xffd7c699,0xffe0bd8a,0xfff09961,0x000e88ad,0x00018c75,0x00300d46,0x003c5acb,0x00461c88,0x00103dc1,0x000b2713,0x003225cb,0x0054b80e,0x007159e3,0x00685487,0xffe1abec,0xff772a07,0xff275915, -0xffc524c3,0x0042a3c1,0x00634db3,0x00701578,0x00112665,0xff3d9168,0xffa02544,0xffb3b9f1,0xfe152976,0xfe12f4ec,0xfea91f44,0x000a4e4a,0xffd194b2,0xffce6fed,0x001e1306,0xfff24ec4,0xfff0e8bd,0x0001cb38,0x000cd4f2,0x000560d8,0xffd6f5bd,0xffe4116a,0xffe04ee1,0xfff25765,0x00114a4d, -0x001f6b15,0x00222d2d,0x0014a706,0xfffab739,0xffd8dd5d,0xffbe64a9,0xffaf65c5,0xffbdb060,0xffc4c0ac,0x0015c0e8,0x009c533a,0x0000b213,0xff8b315c,0xff71e01a,0xffdb7fb1,0x0022237d,0x0011175a,0x00535d3d,0x00276dea,0x00925dde,0x01189bba,0x00ea13ae,0x006be073,0x004691cf,0x004d0e16, -0x00333dad,0x0003e1ca,0xffffafdc,0xfffe4818,0xfff2f299,0xfff80eed,0x00014349,0x00070830,0x00154ca4,0x0021b3a7,0x000e789c,0xfffa54c0,0xfff6cb59,0xfffed347,0x0013e805,0x003d3892,0x0031fb64,0x00317aec,0x0020aefd,0x0016ed55,0xffe7d93a,0xffb425f1,0xffcc7f09,0xffe4ae5c,0xffe7e2c1, -0xffcab409,0xffd9f2fa,0x002de3c0,0x0001e2a9,0xfff75e79,0xffe6a9e8,0xffb751d3,0xffbfcca3,0xffd6aad2,0xffe95c97,0xfff269fe,0x00175ee2,0xffff659a,0xffea330c,0xffe161a7,0xffe8a31b,0xffee3006,0xfff104fd,0xfff1b4da,0xffe015d9,0xffb0a19c,0xffaab98b,0xffa2e99f,0xffa959d0,0xffae1e68, -0xffc1d6b6,0xffe6fe36,0x000aa110,0x002fd1e1,0x004ce0f4,0x005e0344,0x006e30ec,0x006c3677,0x005b1039,0x003111d3,0x00110be4,0xfff95902,0xffe846c9,0xffdb9b50,0xffed82aa,0x00028d75,0x0019fa77,0x0029e36b,0x0027ec31,0x00293204,0x0020c8cf,0x00190a70,0x0016888d,0x001b599c,0x002745a2, -0x002bcc4d,0x0037295d,0x0028b558,0x0009e7c2,0xffeecd9d,0xffdfd3aa,0xffd7e96d,0xffdfe10b,0xffe533aa,0xffeda07e,0xfff09388,0xfff45e73,0xfff0dbac,0x000c0577,0x001ddc0c,0x002b0198,0x00486d88,0x00566ecb,0x00620ea8,0x006d0cee,0x0082043b,0x0094f7c9,0x007b9102,0x005b6acc,0x00359351, -0x00139ea1,0x00346483,0x002a31c0,0x00285c5a,0x0034eb2d,0x003c5a6b,0x00467ff9,0x005155dd,0x005db4eb,0x0047bef0,0x0038784a,0x001fc60d,0x000d3d33,0xfff081d8,0xffe22465,0xffdabfee,0xffd4f1cf,0xffc83fdc,0xffcd486e,0xffd0c327,0xffd5abcc,0xffd58898,0xffd514ec,0xffd27940,0xffdf6e51, -0xffeb6886,0xfff72f57,0x00040582,0x0013cb2f,0x0025ac29,0x001d9b18,0x0015b082,0x001275b8,0x00101fed,0x00150e52,0x002074b6,0x002d6422,0xffbf974f,0xffc20329,0xffbb2bb8,0xffc63f0a,0xffc0024f,0xffc0ba66,0xffc19150,0xffbefc8b,0xffc0a57d,0xffbfcba8,0xffbf519b,0xffc29ad0,0xffc37f50, -0xffc158ee,0xffc3c9c3,0xffc696df,0xffc7ee4d,0xffc9e139,0xffc8a6ce,0xffcab2ff,0xffcdb27a,0xffd08d5c,0xffd304b3,0xffd49dab,0xffd51c5a,0xffd6a58e,0xffd01dd3,0xffc974aa,0xffc509c8,0xffc37a31,0xffc555a1,0xffc53c95,0xffc958b2,0xffc8f094,0xffc4ec61,0xffbffff8,0xffd24a6b,0xffd32b1d, -0xffcf3858,0xffcd7ef1,0xffcc53ed,0xffd45535,0xffd32767,0xffcfb10c,0xffce75c5,0xffcdc368,0xffcd810b,0xffcb99fb,0xffcb93f2,0xffcb6235,0xffcc368f,0xffccec7e,0xffccc072,0xffccea8d,0xffcd6229,0xffce6a89,0xffd02698,0xffd1d6c7,0xffd39500,0xffd4cc68,0xffd617db,0xffd8300d,0xffd6ba49, -0xffd63daf,0xffd4a003,0xffd3497e,0xffd0d4ab,0xffcde864,0xffcde07c,0xffce7679,0xffd08a17,0xffd28242,0xffced8c0,0x000ef02d,0x0010fcc0,0x000cae3a,0x000c1b92,0x000bd632,0x00138b17,0x0007e14f,0x0005ee81,0x000981ab,0xfffe381a,0xfffbc7f9,0xfffede46,0x0002f4bd,0x0005fb10,0x00059031, -0x000d1729,0x000f6967,0x00124f2d,0x000d49dd,0x000b65a1,0x00078931,0x000b1106,0x000eae5c,0x00163325,0x001801e8,0x001876db,0x0015667b,0x00141dbd,0x00133ec9,0x00127ccc,0x001187b9,0x000fa9c6,0x000ae1a7,0x00103022,0x00130a5d,0x0019e78b,0x0013ef40,0x0019b864,0x000e8f12,0x0007b50e, -0x000578f7,0x00159adb,0xfff9d7d2,0xfff03027,0xfff9f5cf,0xffe07383,0xffddd82a,0xffec1bc2,0xfff1b7ff,0xfffb281d,0xfffd330b,0x00146c68,0x001be304,0x001c4652,0x00121c82,0x00092285,0x00031e7b,0x000b0303,0x001a32d8,0x0031a37b,0x003c4da3,0x003c4158,0x002a3336,0x00212aea,0x001839bc, -0x00172b3d,0x0017d925,0x00179b02,0x00105996,0x001fc5e9,0x00280ed9,0x0034dc23,0x0024d62b,0x002385e2,0x000a6b86,0x00000519,0xfffd2c10,0x0022bcf3,0xffede98a,0xffdee71a,0xffeec4d8,0xffb182bc,0xffa43bb8,0xffc27fa9,0xffcbdbe0,0xffe76aa3,0xffe5386b,0x00156d04,0x001b370b,0x001f5cd4, -0x0010c197,0x00008e7d,0xfff40532,0x000397a2,0x0018b835,0x00417c9c,0x00526ba7,0x005497b3,0x003c2d5a,0x00370656,0x00314d04,0x00325db3,0x00244831,0x001aa15b,0x000a5a5e,0x002adb90,0x003b6fce,0x0052ab4f,0x00382548,0x0030d0b3,0x000f7357,0xfff22c51,0xfff362a4,0x00359202,0xffc8f7e1, -0xffa3b0bc,0xffd58967,0xff8a12a3,0xff7e0400,0xffac3513,0xffd16f58,0xfff42aa8,0x0007dc32,0x0032e0e7,0x0048478c,0x0051ae24,0x00235b87,0x00018e44,0xffeba033,0x0007a9df,0x0039da93,0x008978a3,0x00ad6725,0x00aed332,0x006c7cff,0x004635a2,0x00247bdb,0x00304757,0x00268793,0x002832d0, -0x002594e5,0x005c3cf5,0x0076c430,0x009423a9,0x005d0089,0x000b2d91,0xfff90ab9,0xffdc8828,0xffdf6577,0xfffd329f,0x00429998,0x0064e185,0x006de9e6,0x001e7acd,0xfff14e7b,0xffe43bfe,0xffdaa3d9,0xffed3d17,0x0040ea97,0xffc02bb2,0xffa0b55b,0xffc39035,0xffe3436c,0x0005e7fd,0x000d31cf, -0xfff21b40,0xffd9d7f2,0xffa54ea9,0xff8fe301,0xffa0b1b2,0xffb79c80,0x008aa9f6,0x00da4efc,0x007af6e3,0x00656579,0x000d2a60,0xffa12c3b,0xffc03162,0xffd3c046,0xffd51720,0x000988a8,0xffdead5e,0x00300d04,0x00be08d0,0x009c1b8b,0xfffcb937,0xff52895e,0xff3119e7,0xff8f3a5d,0xffdf2527, -0x0003d85f,0xfff95871,0xfff6d53e,0xffdce052,0xffd7455e,0xfff71c50,0x001972e4,0x000e8a93,0x00318820,0x003e55e8,0x0054a47e,0x001fd18b,0x001ff991,0x00436dbf,0x0071323c,0x00771120,0x003a1b40,0xffbdbe62,0xff62d292,0xff315ec5,0xffd7da76,0x004ba659,0x0056d921,0x003d48e8,0xffdd4462, -0xff3c5a67,0xff9426a5,0xffb07e1e,0xfe67055c,0xfe27c79a,0xfea9182a,0x001fce5b,0xffc35097,0xffbaf4c9,0x0014c198,0xfff650c0,0xfff75d8c,0x00009711,0x0006fbf1,0x000281b1,0xffdd303e,0xffe1b77f,0xffd871b0,0xffe535aa,0x00072053,0x0018c402,0x001503e6,0x0007104f,0xffed0e79,0xffc53490, -0xffae3cd9,0xffa76c12,0xffb94e82,0xffcd0e3b,0x00233cd3,0x00b6d1f8,0xffcd10db,0xff56127f,0xff7e26ce,0xffedeaaf,0x0046a245,0x004cbfd8,0x003a47ff,0xfffe6b76,0x002d6620,0x00e75e5f,0x00e4fbe0,0x00833d35,0x004176cf,0x0044ab9e,0x003b87ee,0x0007eb3a,0x000088de,0x00027996,0xfff71f0f, -0xfff7c7dc,0xfff8adfe,0x00055c11,0x0019ef12,0x002b7f26,0x001be5f3,0x000a92d5,0x00040786,0x000dd187,0x00212b0b,0x004564ee,0x0038d67b,0x002accab,0x000dcd92,0x000a7fe3,0xffe52440,0xffc8bdab,0xffdbfa94,0xffefdec3,0xffeaccbc,0xffe52c9a,0xffff1519,0x00540a6d,0x0005af98,0x001eb5a3, -0x00026e5d,0xffcba660,0xffc0ebf8,0xffd0db07,0xffed2aec,0xfff76197,0x000de25e,0xfffa581d,0xffe87761,0xffe04a58,0xffe76529,0xffee6b23,0xfff01f43,0xfff880b8,0xffe91449,0xffbdf505,0xffb12963,0xffa6f219,0xffaedcd8,0xffb06f42,0xffbf9f0c,0xffe00e58,0x000607f4,0x002a656c,0x00432507, -0x0056669f,0x00635785,0x005f35b7,0x0048d2f7,0x00209001,0x00051266,0xffefe5ce,0xffe3534b,0xffe25779,0x00098d09,0xffd9b23c,0xfff20cda,0x0005fc46,0x000d0917,0x001418b5,0x000ea355,0x000aca93,0x0008abc4,0x000d8e61,0x00177370,0x001c6898,0x002de7f3,0x002854bc,0x0013c24c,0xfff97749, -0xffe7d0b6,0xffd9079b,0xffdb4829,0xffdebd02,0xffe7b1b1,0xfff06bd3,0xfffa7937,0xfff9c69e,0x0018faea,0x002f5ff6,0x003fb122,0x005f98ed,0x006f1d04,0x007b7df3,0x007fc20c,0x008a46d3,0x009217b7,0x0077296a,0x0052726b,0x001f3970,0xfff32f83,0x004fdd5f,0x00489662,0x0045060e,0x004d056c, -0x0053fd72,0x0059c9bc,0x005ee961,0x006734f5,0x0054ef27,0x00485847,0x00347c5f,0x0020d6ae,0x00040a92,0xfff5a5bc,0xffe9f57c,0xffe124ac,0xffd0809e,0xffd53814,0xffd7bfaa,0xffda9616,0xffd95e75,0xffd7b4dd,0xffd494e2,0xffdfd3f3,0xffe9e0ad,0xfff36950,0x00057299,0x00195380,0x002fd9ef, -0x002ad44a,0x00261d6a,0x0023cbe8,0x0021a115,0x0026bdf3,0x003500cb,0x0045c3e3,0xffce0d3b,0xffd1c3a5,0xffcaf0a3,0xffd7e27e,0xffd306fa,0xffd44dda,0xffd6628a,0xffd567c2,0xffd22983,0xffccff38,0xffc85897,0xffc7c60e,0xffc579a7,0xffbfec74,0xffc38e8a,0xffc77da7,0xffc9ff9a,0xffcc57de, -0xffcaefc7,0xffce9e61,0xffd1ca31,0xffd4c378,0xffd7291f,0xffd84c70,0xffd8cedd,0xffd9747c,0xffd4266b,0xffce1d52,0xffca97e0,0xffc90a0b,0xffcb2fe2,0xffcc591d,0xffd25d35,0xffd48d9d,0xffd2810c,0xffce0bd0,0xffdb0271,0xffdd072d,0xffd7e525,0xffd5ebd5,0xffd4023b,0xffdd95fe,0xffdc26a7, -0xffd9ee5c,0xffd66562,0xffd4759a,0xffd287ff,0xffcf3c32,0xffcd967f,0xffcb0f1a,0xffcded96,0xffcf8aa6,0xffcde978,0xffcf84a5,0xffd0ce91,0xffd2cacb,0xffd3861c,0xffd4a6c0,0xffd5d46c,0xffd6a64f,0xffd78583,0xffd8fd75,0xffd84960,0xffd86900,0xffd791b2,0xffd7825b,0xffd65688,0xffd478b9, -0xffd4a8fe,0xffd52be5,0xffd75d08,0xffda32bb,0xffd1da93,0x000d8e33,0x000fc000,0x000cac05,0x000beda0,0x000b3462,0x000fd1e3,0x0007734d,0x00059e70,0x00063397,0xfffe0c06,0xfffb9f7d,0xfffe3de1,0x00016e82,0x00043304,0x00035f6d,0x000b0f2a,0x000d2a4f,0x000fbc34,0x000c31d8,0x000ad429, -0x00075d5d,0x000a97b9,0x000df66e,0x001515f7,0x00169a6d,0x00169fb2,0x001228c0,0x00124b54,0x0011d3b1,0x001307dc,0x000ebf3d,0x000cdce5,0x0009ca80,0x001019ce,0x001304d0,0x0019039a,0x0012867b,0x00151b11,0x000d2a01,0x00076601,0x0003c1d9,0x000ab471,0xfff98e0b,0xfff0af3a,0xfff19555, -0xffe11b69,0xffe07a04,0xffec5a52,0xfff11d6f,0xfff83f3a,0xfff7f089,0x0010be0b,0x00188c93,0x00173a79,0x001387d8,0x000d4bf5,0x0007c78d,0x000f6e25,0x001d15f6,0x00322f5f,0x003b0d0c,0x0038dc36,0x00238fe2,0x001eb723,0x0017f791,0x001bbcef,0x0013e582,0x0012526c,0x000e377e,0x002058a2, -0x00292ed6,0x00326ca2,0x00207a46,0x002066d7,0x000ea598,0x0003c565,0xffff0aed,0x001386af,0xfff0d6cc,0xffe35a61,0xffe1d4a9,0xffb458b9,0xffa5876c,0xffc16692,0xffc73ebe,0xffe1bf9a,0xffdb61b6,0x001025b9,0x00148662,0x0013ad1b,0x00109e47,0x00041be5,0xfff9367f,0x0007b319,0x001b133c, -0x0041a369,0x004fcc7c,0x004f3d7b,0x00312eb4,0x00347bf7,0x002fbb98,0x00390e0e,0x0019c24e,0x001007de,0x00099f11,0x002edcd1,0x003f9184,0x00516460,0x00349ed6,0x002079e9,0x000b524f,0xfff0874e,0xffecdebb,0x0016d109,0xffc9c1ef,0xffa399db,0xffbf3566,0xff7e27bd,0xff74c0c6,0xffb22811, -0xffc558d2,0xffe34039,0xfff6e61c,0x002a4d6e,0x003e69a0,0x0043be42,0x002b6219,0x00155671,0x00029e38,0x001c1272,0x0048a281,0x00913426,0x00ac65ed,0x00a40a91,0x005b0d4b,0x00430342,0x002abfa7,0x004275ab,0x001f09e9,0x001acb58,0x0021cf0d,0x005de37c,0x0079da85,0x008ca6be,0x004e6d57, -0x00401e67,0x0019e51c,0x000ac9f8,0x0007927b,0x000ab2dc,0x004ee9a7,0x00755a07,0x00872dfb,0x002e84fe,0xfff60c5c,0xffe93de0,0xffdbfbe4,0xffebace7,0x003fb557,0xffc28539,0xff9e84a2,0xffaa93ec,0xffbdcb7b,0xffd1e67d,0xffcf029e,0xffc0acce,0xffb28749,0xff81b6fc,0xff85eb57,0xffa3ac58, -0xffbb0a22,0x0085f8e3,0x00c0558b,0x00539a79,0x0046451c,0xfffdc945,0xff9e1e87,0xffcff026,0xffe4eeb9,0xffd94af1,0x00306a16,0xffcaae5e,0x0011734c,0x00954daa,0x0089d3eb,0x0017ae45,0xff5b1874,0xff274458,0xff851446,0xffd958e2,0x00042769,0xfffc9a47,0xfffd65e2,0xffe15b45,0xffd248b5, -0xfffd10a8,0x00207d60,0x0018b336,0x002ec798,0x003d4e10,0x005f4ebd,0x0032561e,0x003736c0,0x0052daca,0x0085d473,0x0073620a,0x000d6e91,0xff9e5acf,0xff56b774,0xff49299e,0xfff19591,0x00542fea,0x0048c97e,0x000c92e6,0xffafa32b,0xff4740cf,0xff8fcf48,0xffa131ec,0xfec2be18,0xfe64c3e6, -0xfec8396a,0x0018be86,0xffc32130,0xffb8b6a2,0x00012608,0xfff7d315,0xfffcfda6,0xfffec314,0x0003cefd,0x0001ca4c,0xffe4f708,0xffdf6281,0xffd18626,0xffdad117,0xfffa7107,0x000b3fa8,0xfffeab0c,0xfff64fee,0xffe0278f,0xffb5cdf0,0xffa4efac,0xffa5dc29,0xffb83f56,0xffdefc6e,0x00324d35, -0x00b9bbc7,0xffa5ae2f,0xff38ba8d,0xff921ba7,0x00017531,0x00640f36,0x0085b835,0x001711f7,0xfff58228,0xffe4d556,0x00a68eaf,0x00c89652,0x008b29c9,0x00320652,0x002fc6bd,0x0039d2a6,0x000beac4,0x00022269,0x0005da06,0xfffbc977,0xfff726f7,0xfff1c83e,0x0003a50f,0x001c49b9,0x0030f8ef, -0x00255e7d,0x00185b72,0x0010c527,0x001d8a95,0x002d2958,0x0047a8b4,0x003e3295,0x0025b292,0xfffdefe3,0xffff1245,0xffe36ef8,0xffddc262,0xffe6c33c,0xfff7d1d1,0xffedee4f,0x000f8a34,0x00337bbc,0x00728021,0x001b35a4,0x00392720,0x0018bd3b,0xffe25f1b,0xffc8db5f,0xffd32759,0xfff35751, -0xfffd8fcb,0x0002bc2b,0xfff79d17,0xffebcb20,0xffe5da94,0xffe8e349,0xffef9c48,0xfff227a1,0xfffebff6,0xfff21abf,0xffcf7952,0xffbb4c25,0xffae4016,0xffb59240,0xffb71a53,0xffc2ca62,0xffdc816e,0x00032aaa,0x0025b7e7,0x003ac479,0x004c67d5,0x00545d2a,0x004f0178,0x00326fe7,0x000d89a9, -0xfff501f3,0xffe37a50,0xffdb72de,0xffe523e6,0x001c56e5,0xffb86035,0xffcd7020,0xffe4baab,0xfff4c236,0x00019eee,0x0000434a,0x00006c6c,0xffff88fc,0x0003d40e,0x00099051,0x000ce092,0x00206c93,0x00235acf,0x001aacae,0x0002d981,0xfff04d54,0xffdc38f4,0xffd73cb1,0xffd798b8,0xffdf8e71, -0xffedc6f1,0xfffe21f7,0x0003affd,0x00256260,0x003e9a61,0x004fc391,0x00701e3a,0x008067f3,0x008c317d,0x00886e26,0x0085f144,0x007f7389,0x00646e02,0x003fd257,0x0008b811,0xffd6d7b8,0x00605189,0x005c5684,0x00583760,0x005a7d70,0x005fc19a,0x0061b325,0x00618b3e,0x00654e6f,0x0058b24d, -0x0050f1f3,0x0043d52d,0x0031f327,0x00174a52,0x000a0de7,0xfff974c9,0xffed0b84,0xffd89b56,0xffdd2ac2,0xffdeb59e,0xffe02573,0xffde4f18,0xffdb4bc0,0xffd7ac30,0xffe06fe3,0xffe83811,0xffeef2a3,0x00042a47,0x0019baf6,0x00323fd1,0x00321a37,0x0032c48f,0x0033ed75,0x00329bbc,0x003760f6, -0x0046205f,0x0056235f,0xffe221c6,0xffe5ed60,0xffdd3eac,0xffe9dd2e,0xffe55024,0xffe61cb8,0xffe8044e,0xffe7b720,0xffe0be53,0xffd850c5,0xffd05474,0xffccbd67,0xffc862b5,0xffc0dbff,0xffc4e6c9,0xffc99478,0xffccb547,0xffcef4e9,0xffcdcd3c,0xffd156ea,0xffd4a2bc,0xffd7fedb,0xffda9837, -0xffdbb01b,0xffdc7ccc,0xffdcabfa,0xffd9eca8,0xffd63271,0xffd4e55f,0xffd46389,0xffd72793,0xffda29f9,0xffe08ecb,0xffe493af,0xffe4aa3c,0xffe18aab,0xffe4ba04,0xffe803ab,0xffe1c906,0xffdfb795,0xffdd6deb,0xffe6b4ed,0xffe4e0c6,0xffe3d916,0xffdebd2f,0xffdbe18a,0xffd8cc07,0xffd4879b, -0xffd17f14,0xffcd36a3,0xffd1dea4,0xffd3bd87,0xffd16f1a,0xffd3a312,0xffd534d6,0xffd6fe42,0xffd72e3a,0xffd7bf3d,0xffd8655b,0xffd8dd2b,0xffd9665c,0xffda31ed,0xffdaa369,0xffdb8f90,0xffdbca16,0xffdd2db6,0xffdd9f0b,0xffdd62c0,0xffddb8eb,0xffde2bb3,0xffe01495,0xffe32eed,0xffd564e4, -0x000b7464,0x000dd239,0x000bec1b,0x000b1cc4,0x000a519f,0x000bf56c,0x0006b7d8,0x0005310d,0x00027ead,0xfffdfde9,0xfffb8b86,0xfffc9ddb,0xffffeefe,0x0002a082,0x000130a5,0x0008d956,0x000a6931,0x000ce99c,0x000ab226,0x0009b090,0x0006be45,0x00099037,0x000c86d8,0x0012c52b,0x00145c45, -0x00141e98,0x000eb1b9,0x000ff74b,0x000fcefd,0x0012a879,0x000b9d40,0x0009ab1b,0x0007869d,0x000f11e4,0x001204d1,0x0016f178,0x0010499f,0x00100774,0x000b5610,0x00068341,0x000133d6,0xffffd4e6,0xfff9933f,0xfff1a642,0xffe93c3d,0xffe33976,0xffe47965,0xffebb00c,0xfff1b727,0xfff64ebf, -0xfff27a7a,0x000c4cbb,0x00141007,0x00116ff6,0x00131942,0x001021f7,0x000bd2b9,0x0012c928,0x001e92c5,0x003017fe,0x0038051d,0x003435b6,0x001d024f,0x001b7597,0x0016f382,0x001f0ece,0x000fda2c,0x000ca5e7,0x0009da4d,0x001f17cf,0x002882a1,0x002e1c40,0x001b4dd9,0x001c4ece,0x0012c4f8, -0x00065e78,0x00005d89,0x0004d73a,0xfff4d005,0xffe8a451,0xffd41316,0xffb949a4,0xffa8bc17,0xffbc4718,0xffc44e9b,0xffde02e2,0xffd27843,0x000aa9f5,0x000d1569,0x0007f2d6,0x000ea3b0,0x0006768e,0xfffed636,0x000b19ee,0x001c30c0,0x003dd8e3,0x004b5812,0x0048dc34,0x00279536,0x0030a319, -0x002d0177,0x003d8b67,0x00107188,0x0006c666,0x00057195,0x00307f4d,0x0040fff0,0x004c8d6f,0x002f5e9f,0x00109a71,0x0007db60,0xffee78c9,0xffe65265,0xfff7187d,0xffcddd16,0xffa90b2c,0xffa8ee9b,0xff7a92ca,0xff74296b,0xffb70227,0xffbee3f8,0xffd67a4b,0xffe3eaea,0x00212dd8,0x0032220a, -0x0031b597,0x002f7c84,0x0024ec4a,0x00178aef,0x002da4c2,0x00539462,0x0090d959,0x00a71158,0x00971208,0x004b4dcc,0x003dda27,0x002f9ebd,0x0051f1fc,0x00192c0c,0x000de019,0x00176a8c,0x005ab034,0x0078a7fe,0x007fe831,0x003e6a92,0x006deb03,0x003b87bc,0x0036615c,0x002e134a,0x001daedf, -0x005b11b3,0x008147a3,0x009486f1,0x003dbcb0,0x0000bd9f,0xfff46292,0xffe53892,0xffef1b86,0x003aca3b,0xffcb1a14,0xffa489ef,0xff973f84,0xff9f46ce,0xffa516c6,0xff9b8a3b,0xff978c3c,0xff903a1f,0xff641400,0xff7e6b36,0xffa6135a,0xffc2bc35,0x00763cdc,0x009b197c,0x002d72e7,0x002623a3, -0xfff278e3,0xffa99af5,0xffe2720a,0xfff5eabd,0xffe0f915,0x0051e511,0xffbd21fa,0xfff61fa3,0x0065a830,0x006e12b8,0x002da830,0xff67d4e7,0xff29776c,0xff838140,0xffd49c93,0x00010d6b,0xfffe0217,0x0000d1a2,0xffe4f876,0xffd1563d,0x0000e663,0x0023437f,0x001eccb5,0x002915b4,0x003a3999, -0x00647258,0x00452ef5,0x004eaaca,0x005fd565,0x008d87ca,0x0064ddef,0xffe8f38d,0xff86a133,0xff52d4ed,0xff682c1f,0x000bda3d,0x00585e2d,0x0039881f,0xffe22e3e,0xff8c3286,0xff58b267,0xff91016f,0xff8a81f6,0xff1b4fd3,0xfeb9c880,0xfefbb84a,0xfff8abbd,0xffcf4329,0xffc7f31c,0xffeb12c5, -0xfff97085,0x00016b9c,0xfffd92b7,0x000303bf,0x00037b42,0xffedeadb,0xffdecdde,0xffcd118b,0xffd43f1e,0xffedf50f,0xfffa9e8d,0xffe5af46,0xffe563b8,0xffd497e7,0xffaaa059,0xffa1c49c,0xffa8d8a8,0xffb749b1,0xfff680da,0x0040816c,0x00a668d1,0xff89b9ab,0xff348560,0xffb90fe7,0x00168a45, -0x00760a9d,0x00b3d02b,0xfff19ba6,0x0010ceae,0xffcc5b4d,0x005e2bcf,0x0090fac4,0x007c49d8,0x001cbb18,0x00159473,0x002eaf6d,0x000d14f4,0x000224bc,0x00061e03,0xffffdfcd,0xfff6e945,0xffee9551,0x00021a0d,0x001c762f,0x00332b8c,0x002b17f5,0x00233bb1,0x001c69ca,0x002b47bf,0x0035d765, -0x00441d94,0x003f5286,0x0021d82b,0xfff2dff6,0xfff60c5e,0xffe19e4c,0xffec53b4,0xffeaf54b,0xfffcdf21,0xfff820d0,0x003eddf7,0x0066d089,0x008105db,0x003f2a09,0x0044dcb0,0x00270695,0xfff963f7,0xffd7ee09,0xffdeb841,0xfffa5ab3,0x0001c6a8,0xfff88ecd,0xfff78ca5,0xfff24552,0xffefeaf5, -0xffed3456,0xfff1a8a0,0xfff5a9e1,0x0003838a,0xfffa97d2,0xffe2b911,0xffc8eddc,0xffb90487,0xffbd070e,0xffc0f8a9,0xffca4d30,0xffdd0c54,0x0000c25a,0x001fb88d,0x0032c750,0x003df118,0x003fbbb2,0x0039f973,0x001856e1,0xfff7a909,0xffe201e5,0xffd3eeeb,0xffd26f82,0xffe63cfc,0x0026af20, -0xffa40d77,0xffb10948,0xffca0e36,0xffe00d35,0xfff15361,0xfff4f805,0xfff93e61,0xfff9eae5,0xfffd33a2,0xfffe71d0,0xffff4f50,0x00112be9,0x001ad1af,0x001dbcd2,0x000a633a,0xfff89b4a,0xffe14073,0xffd50565,0xffd1a61d,0xffd7e2a2,0xffe8b994,0xfffd78ee,0x000af3c4,0x002d1202,0x00479369, -0x0059405d,0x00787516,0x0088606f,0x0091a692,0x008553a7,0x007545e5,0x005f2aa9,0x00443841,0x0023598b,0xfff147c9,0xffc1fe19,0x00606ab3,0x00606d49,0x005de380,0x005adc42,0x005e4d14,0x005d4945,0x0058c9cb,0x00587911,0x005351c2,0x0051d120,0x004d539e,0x003e881e,0x00282f1d,0x001cf319, -0x000733ef,0xfff7284a,0xffdff1d8,0xffe498bd,0xffe5abed,0xffe62842,0xffe3c83d,0xffdf993a,0xffdb352b,0xffe16e89,0xffe713e6,0xffeaf3a5,0x00013347,0x001680c7,0x002f06aa,0x00341228,0x003aa38c,0x004070c5,0x003f13c4,0x0041e2e3,0x004d73b5,0x0059119b,0xfffa9688,0xfffe6c77,0xfff34de7, -0xfffd1908,0xfff7c671,0xfff71467,0xfff8278e,0xfff6e3f6,0xffee839a,0xffe3b76a,0xffd9a9fa,0xffd41e93,0xffceaf1f,0xffc6c4ac,0xffc9ef8a,0xffce68f9,0xffd0c28a,0xffd1d7f3,0xffd013ee,0xffd24af3,0xffd5958f,0xffd922ce,0xffdbeae8,0xffdcfa62,0xffddeaf0,0xffddc2ed,0xffde8a03,0xffde283b, -0xffdfcb64,0xffe10fdf,0xffe4c00e,0xffe9f6b1,0xfff045f4,0xfff618b2,0xfff8ec09,0xfff89da0,0xffeda3b1,0xfff23fe1,0xffeb9424,0xffe9c68b,0xffe74223,0xffef166d,0xffece088,0xffebf945,0xffe6150a,0xffe2f363,0xffdf66b9,0xffdaef38,0xffd72673,0xffd2220f,0xffd77adf,0xffd8a759,0xffd61c84, -0xffd7fe30,0xffd901b2,0xffd9d2ba,0xffd9b635,0xffd9b52c,0xffd9db87,0xffd9fd0c,0xffda44f2,0xffda5670,0xffdc135e,0xffddcf98,0xffdf2d2e,0xffe1ef48,0xffe3f586,0xffe55b3d,0xffe62570,0xffe6d510,0xffe87d06,0xffeb85cd,0xffd7f2e0,0x0009e2b2,0x000c42c1,0x000bb84b,0x000a2800,0x0008ee91, -0x00078d54,0x00067d48,0x00048ea5,0xfffde4f3,0xfffd062c,0xfffa8c8f,0xfff973c3,0xfffd8b36,0x00003d43,0xfffe393c,0x000660be,0x0007f629,0x00094cf8,0x0008c576,0x000885c8,0x0006d583,0x00090784,0x000b9e05,0x0010c457,0x00129415,0x00123446,0x000c3bf8,0x000e575d,0x000e6b96,0x0012a494, -0x000972d5,0x00076861,0x0005a3a9,0x000e48d1,0x001126e9,0x0014b6a9,0x000e63ca,0x000bf2bb,0x000a6606,0x00048dd2,0xfffec55f,0xfff6dfa0,0xfffa0ca8,0xfff37994,0xffe2d005,0xffe79bec,0xffea4fdb,0xffeb0b4f,0xfff42818,0xfff65671,0xffee69eb,0x00075b78,0x000ec9c3,0x000c4f79,0x001178af, -0x00110fb5,0x000fc374,0x0015f68d,0x001fea30,0x002d731f,0x0034bd8a,0x002fab8a,0x0017b3a4,0x0018521a,0x00161fbc,0x00225f8c,0x000d55c6,0x000890f9,0x00061128,0x001dd7c0,0x0027598b,0x002913c1,0x0016b272,0x00189068,0x0016f095,0x00079e5f,0x0000f331,0xfff88fa6,0xfff949af,0xffee33b0, -0xffc71072,0xffbedce4,0xffad6f07,0xffb3b5a6,0xffc38470,0xffdb4f04,0xffcb75db,0x0004a84c,0x000540e1,0xfffe4622,0x000b34f4,0x00078e4e,0x0004dc0b,0x000ef74b,0x001db626,0x003934e1,0x00470639,0x00435568,0x00209c2d,0x002cefbb,0x002aa43d,0x0041c12f,0x000a6f44,0x0000ecd3,0x000178ba, -0x00316723,0x0040de17,0x00457636,0x0029eea4,0x0003d30f,0x000597f6,0xffebb6ef,0xffe053ec,0xffdaf12d,0xffd40139,0xffb2432a,0xff95eda9,0xff80ed05,0xff7d2715,0xffbad068,0xffbf4e8b,0xffd04233,0xffd27162,0x001681d2,0x00236f78,0x001eaac1,0x002f79f7,0x002e7b2a,0x002942ac,0x003c888c, -0x005c1cd4,0x008c3257,0x009f8c1f,0x00897767,0x003d0507,0x00363ae4,0x0032fd80,0x005ff332,0x00170085,0x0004b721,0x000d3a9e,0x005663df,0x00749b0e,0x006fcf50,0x002f5883,0x0091778c,0x005ad852,0x00597fb8,0x004d9e54,0x0032200e,0x0065495e,0x0086ae4b,0x0093458a,0x004900be,0x000d83be, -0x00029c31,0xfff2a37f,0xfff60831,0x003248ef,0xffd9f36b,0xffb22ef4,0xff8a7593,0xff89c1f8,0xff83b439,0xff78a276,0xff7a7275,0xff765901,0xff5168e7,0xff7c1695,0xffac32f4,0xffd53f26,0x00640903,0x0073ace2,0x000d3b12,0x000a0e87,0xffeca024,0xffc0fbcf,0xfff4c139,0x00066cf5,0xffefcfa0, -0x006ca65c,0xffb88357,0xffe1fe2f,0x00369245,0x004f052f,0x003c8297,0xff7a16c2,0xff39285d,0xff8acce7,0xffd29e85,0xfffc777e,0xfffc21ca,0x0002c7e9,0xffe963b2,0xffd392be,0x00024cdd,0x0021d08c,0x002077dc,0x0021ec01,0x0034d777,0x006379de,0x0056492d,0x0063755e,0x006909c8,0x00876779, -0x004d496a,0xffce40be,0xff75c074,0xff55cdef,0xff8aef99,0x0024b66c,0x005a96b9,0x002e0d0f,0xffc4970d,0xff7616de,0xff6c9b52,0xff97462b,0xff7653ff,0xff69f9c2,0xff108c9f,0xff333596,0xffc8d829,0xffe29609,0xffe24085,0xffdafe57,0xfffe3e44,0x00051c99,0xfffe74d1,0x00018b73,0x0007007c, -0xfff6e852,0xffe14d83,0xffcc88d4,0xffd0a298,0xffe469f8,0xffeb2796,0xffd0f26a,0xffd7c3e5,0xffcbdd77,0xffa69c25,0xffa63140,0xffb1f288,0xffbbbc00,0x00150109,0x00504a5d,0x008606c8,0xff78495f,0xff40c075,0xffe67f72,0x002c2b11,0x00810b0a,0x00d7ab71,0xffd4910f,0x0041b063,0xffe6d98a, -0x0017ebec,0x0043dbd7,0x0055d051,0x0005f906,0xffff3080,0x001da8a5,0x000ae4e4,0xffff2a77,0x00029e13,0x0001fe25,0xfff8837c,0xffeefa9a,0x00015247,0x001ac03b,0x003357c3,0x002e834d,0x002b2893,0x00271cae,0x00369d08,0x003b44ac,0x003cea47,0x003af888,0x001e83aa,0xffeeb486,0xffeff0db, -0xffe0141d,0xfff5eba3,0xffeba197,0x0003675f,0x00104c51,0x006c516d,0x008d4a97,0x0079ee1a,0x006214f1,0x0047f6ea,0x002f0884,0x000f4512,0xffee16a7,0xfff2aef9,0x00008ec5,0x00029947,0xfff198a4,0xfff9a5bc,0xfffa3f50,0xfffaceee,0xfff445d2,0xfff4a75e,0xfff9588d,0x0006cbf4,0x000222f3, -0xfff58f00,0xffd970e3,0xffc70f4e,0xffc6b95d,0xffcd251b,0xffd4c858,0xffe28975,0xffffe274,0x0019604c,0x002b8cec,0x002e16fb,0x00298b46,0x0022134e,0xfffdff4a,0xffe1f3a6,0xffcf4a6d,0xffc5954b,0xffce04c1,0xffeac50c,0x002f7746,0xffa07335,0xffa1d732,0xffb885bc,0xffd04f96,0xffe33d7a, -0xffebd19a,0xfff3f8ab,0xfff639ae,0xfff92761,0xfff6edeb,0xfff604e4,0x00030eba,0x00109565,0x001c4f24,0x000fb095,0x0000107f,0xffe7b91d,0xffd55644,0xffce3fe2,0xffd2eb78,0xffe3c1e4,0xfffa079b,0x000dff8a,0x002fe261,0x004a87df,0x005c7bd2,0x0078a3c1,0x00868f43,0x008c194c,0x00782de4, -0x005cb75d,0x003908cc,0x001e64ca,0x0002d753,0xffdbb358,0xffb7ca15,0x0050c848,0x005460df,0x0054eb80,0x004ef367,0x00511b83,0x004e2204,0x0046a424,0x0042b7eb,0x0045a222,0x004adc8a,0x004f03c9,0x00448b4c,0x003446e5,0x002c5259,0x00123262,0xffff7db8,0xffe7644e,0xffeb955c,0xffec35cb, -0xffeb73e5,0xffe8eeb3,0xffe41b7a,0xffdefece,0xffe33dd3,0xffe760ae,0xffe96393,0xffff72b0,0x0013a787,0x002b4d83,0x003359ac,0x003daa22,0x00468a1c,0x0043d48c,0x004321f8,0x004827f0,0x004dc05d,0x0013bf44,0x0017f059,0x000b696d,0x0011639b,0x000b3794,0x0008cdb3,0x000992e6,0x00071b6d, -0xfffef059,0xfff28de8,0xffe744b9,0xffe09aea,0xffda630f,0xffd2dde7,0xffd3c124,0xffd7346c,0xffd7d0c4,0xffd6cee6,0xffd2e809,0xffd41015,0xffd72799,0xffda8207,0xffdd5353,0xffde43b1,0xffdf230e,0xffde8d4e,0xffe2f112,0xffe5e501,0xffea651d,0xffedc803,0xfff2c95d,0xfffa46a5,0x000031d4, -0x00077042,0x000cea7b,0x001007f8,0xfff5c382,0xfffb43b6,0xfff4a937,0xfff30542,0xffefe524,0xfff75810,0xfff43668,0xfff209c1,0xffebf3a9,0xffe8fc5f,0xffe57eec,0xffe1511d,0xffdd5187,0xffd85641,0xffde16b1,0xffdec1c8,0xffda0d21,0xffdc075e,0xffdc8946,0xffdcd7c9,0xffdc6108,0xffdbf7b9, -0xffdbb746,0xffdb90da,0xffdbb0ec,0xffdb22b1,0xffde10ff,0xffe083c5,0xffe2e03f,0xffe6b891,0xffe9f430,0xffecab0f,0xffee0638,0xffef2888,0xfff0afb8,0xfff36111,0xffdb5109,0x0007f904,0x000a5aa5,0x000acc8b,0x0008b384,0x00077eea,0x00048f5c,0x0005db0b,0x0003e360,0xfffa3f9d,0xfffcc361, -0xfffa5c83,0xfff6d3bb,0xfffc26c7,0xfffed3c1,0xfffc4cf8,0x0003f101,0x00054048,0x0006fa44,0x0006ea79,0x000708ce,0x00067674,0x00082712,0x000a5b45,0x000e8705,0x0010605f,0x000fe4db,0x0009ca72,0x000c4b78,0x000c8c08,0x00120fe7,0x00072aa8,0x00050496,0x0003596d,0x000cc090,0x000f7b39, -0x00119a15,0x000c1145,0x00081897,0x000903c7,0x00025d29,0xfffbf3af,0xfff088db,0xfffad86e,0xfff59f6d,0xffdebe7d,0xffecbe80,0xfff03e11,0xffea73c3,0xfff6e96b,0xfff72203,0xffebc3b6,0x00020ae5,0x0008c7be,0x00080af1,0x000e9018,0x0010c5f1,0x00125a20,0x0017b8c6,0x001fff3a,0x0029efaa, -0x00301392,0x0029e9b9,0x001255f5,0x0013a8bd,0x0013c06c,0x00245391,0x000aa8bf,0x000491dc,0x000224fe,0x001b5f63,0x0024799a,0x00228c9b,0x0011e16c,0x0014b981,0x001961eb,0x0007327b,0x0000571a,0xffef9b46,0xfffd50d2,0xfff31fd9,0xffbbbe19,0xffc4e212,0xffb3cef2,0xffaa2f6b,0xffc4c4c1, -0xffd9d4b6,0xffc69d64,0xfffde2c2,0xfffcf3b0,0xfff7cc1f,0x00069f8d,0x00076259,0x000a4141,0x0011d940,0x001e9264,0x00342d97,0x004189d9,0x003cf689,0x001a6f92,0x00276e1a,0x00266e0f,0x00442429,0x000529b7,0xfffbdcad,0xfffced40,0x002fb887,0x003dd45b,0x003b96e9,0x0024118c,0xfffa36cc, -0x0003586e,0xffe8078d,0xffda9e93,0xffc52037,0xffdafe92,0xffbdcbae,0xff8a1540,0xff8fd554,0xff8e43b3,0xffc0a082,0xffc65cb3,0xffd0e80f,0xffc60b55,0x000a1c0b,0x0012967f,0x000d5353,0x002b25e4,0x0031dabf,0x0036d5dc,0x0046d9d7,0x0060d7fc,0x00844d9b,0x009417cc,0x0078cfa1,0x002dea88, -0x002959d6,0x00317e48,0x0069ca43,0x001494a7,0xfffc30e8,0x00036114,0x004fc694,0x006c22bc,0x005bc137,0x00212463,0x00a7c7cd,0x0073e5e4,0x0071b2ac,0x00640c33,0x00455c54,0x006ccde8,0x00835d74,0x0084b745,0x004d0ae9,0x00180105,0x000eec55,0x00005f55,0xfffe5b40,0x002727d6,0xffed3b55, -0xffc6c931,0xff84c506,0xff7ded9b,0xff6fbb07,0xff65edc5,0xff68189f,0xff654dc2,0xff4a850a,0xff7ef4fa,0xffb755e3,0xfff39a0e,0x005490cd,0x004f28cc,0xfff33cf3,0xfff2d149,0xffe97240,0xffdb485d,0x00009a01,0x0012839c,0x00050b08,0x007fb61e,0xffb9332b,0xffd5c0b5,0x000d576e,0x002fde67, -0x0044126c,0xff914d75,0xff536293,0xff9960a8,0xffd57066,0xfff8521c,0xfff80980,0x0001c8e0,0xfff021ba,0xffd89f56,0x0000e664,0x001cc2ab,0x001e63c6,0x0019b2a7,0x002d269a,0x005ccf69,0x00613744,0x0070a372,0x006bc840,0x0074931b,0x002f3d8d,0xffbaa88f,0xff67ae9c,0xff5bcf60,0xffaec788, -0x00394045,0x0059f29b,0x0026f003,0xffb19ff7,0xff693a44,0xff7de895,0xff9e6936,0xff6d8404,0xffab9cb9,0xff5840bc,0xff62349e,0xff997e20,0xfff56d1e,0xfffcbb99,0xffd68932,0x00076b3c,0x00075e71,0x0001bcef,0x0000ac70,0x0008257b,0xffff94e4,0xffe6a257,0xffd023ae,0xffcfead2,0xffdee54b, -0xffe04aed,0xffc4637b,0xffcddca6,0xffc55fb8,0xffa8c999,0xffaeab84,0xffbdda0f,0xffc51fd3,0x00350fa1,0x005d52cf,0x005bf768,0xff6dc712,0xff523c19,0x000ae62e,0x003b6998,0x0084ec1a,0x00ece9ba,0xffc67336,0x006b6134,0x0028cdde,0xffdbf5b6,0xffea519d,0x0019c6b1,0xfff1d06a,0xfff30519, -0x000c33f8,0x00059ede,0xfffaf982,0xffff549d,0x000118ae,0xfffb6c51,0xfff25857,0x0000dd03,0x00172330,0x00325e0b,0x003072ac,0x003110a6,0x00305b4f,0x003d7b09,0x003b915a,0x0031d491,0x002ef601,0x0017f269,0xffedd59c,0xffe97983,0xffdc8305,0xfff95d46,0xffea7669,0x000d2d41,0x00355179, -0x008d1bc5,0x00965c51,0x0050ae2a,0x006a7c08,0x004363b8,0x00319196,0x00258e4a,0x000b5d2a,0x000b7f44,0x0005b1c5,0x00000be1,0xffeedb54,0xfffd8450,0x0000c632,0x00026423,0xfffbfc3d,0xfff90ced,0xfffc74d6,0x0008e6f6,0x00093eac,0x000704e1,0xffebcb52,0xffd83826,0xffd30ab4,0xffd9dc69, -0xffe0a80e,0xffec5461,0x0000640c,0x00126402,0x00222caa,0x001cae4a,0x0012bf2c,0x0007c1a3,0xffe4266d,0xffcc24d2,0xffbbfddd,0xffb92cc2,0xffcf5e4b,0xfff2ad0a,0x00367966,0xffa9e57f,0xff9feea0,0xffb15cdd,0xffc5d5fc,0xffd846ea,0xffe49241,0xffef5ed6,0xfff24d05,0xfff63c28,0xfff326fd, -0xfff14611,0xfff83cb8,0x0005f2ee,0x0016dc0f,0x001263c8,0x0005d487,0xffee3d8b,0xffd81175,0xffce30b3,0xffd171ff,0xffdf714a,0xfff3f35d,0x000b0046,0x002d0a7e,0x00476946,0x0058fdb3,0x006f9ca1,0x0079a605,0x007ae34b,0x00632d46,0x0040bfa4,0x0013b899,0xfff92c72,0xffe2ba01,0xffca1723, -0xffb649fd,0x0034d2ab,0x003b6fb6,0x00403cdc,0x003a2ead,0x003c6c04,0x00389b65,0x00303215,0x0029f34b,0x0033d9cf,0x003e3a69,0x00494bf1,0x0043bffe,0x003aff7d,0x00375b3a,0x001af2da,0x00072e4f,0xfff0d8e2,0xfff2fd13,0xfff2255e,0xffee80ff,0xffecc676,0xffe8b616,0xffe3994e,0xffe6a889, -0xffe9e407,0xffeb702a,0x000012b3,0x00128782,0x002830b4,0x002fd54d,0x003a433b,0x004332b5,0x003e1fd8,0x003922a0,0x0035e6ba,0x00362f4b,0x0027d2c7,0x002c4ff2,0x0021ef33,0x0022f5b7,0x001d4b43,0x0019c765,0x001a73e0,0x0017e3fc,0x00104576,0x0003e972,0xfff8c336,0xfff169fe,0xffea7ef0, -0xffe3c8eb,0xffe1bb7a,0xffe3627e,0xffe1838b,0xffddfed8,0xffd7cd46,0xffd77d55,0xffda5fe3,0xffdd1924,0xffdfd12d,0xffe097f8,0xffe154c2,0xffe05480,0xffe772fd,0xffeccdcc,0xfff36657,0xfff8ad3c,0xffff0c1d,0x0008410a,0x000d7dca,0x001558f3,0x001c7659,0x00229287,0xfffc6165,0x0001b010, -0xfffc4ee4,0xfffb65fa,0xfff873b8,0xfffea945,0xfffb5454,0xfff8737c,0xfff2bf2a,0xfff008bf,0xffecbfae,0xffe94397,0xffe58f03,0xffe12b8d,0xffe64804,0xffe63563,0xffdf3350,0xffe10707,0xffe0c6ca,0xffe0aaa8,0xffe00650,0xffdf6a2c,0xffdef00a,0xffdea297,0xffdeb981,0xffddce54,0xffe1850e, -0xffe468dd,0xffe75fbb,0xffebc64b,0xffef92d7,0xfff30792,0xfff4cebe,0xfff6692c,0xfff7fa48,0xfffa0d9c,0xffe03ffd,0x00066722,0x0008c3ae,0x000a041e,0x00075649,0x0006024e,0x00020282,0x000571ab,0x00032837,0xfff6fc16,0xfffc5446,0xfffa0f5d,0xfff4580c,0xfffac556,0xfffd64d0,0xfffa8f12, -0x00017b12,0x0002e314,0x00050397,0x000528ef,0x0005ada6,0x00062f23,0x00076174,0x00094f79,0x000ce548,0x000e6810,0x000dd165,0x00080747,0x000a549e,0x000aac54,0x00118211,0x000555a2,0x00032529,0x00018fcd,0x000b5b7f,0x000defaf,0x000ea6a6,0x000a245b,0x0005403c,0x00081364,0xfffffc7c, -0xfff9dfba,0xffed1d55,0xfffbe82a,0xfff85fe9,0xffddbfb4,0xfff279c0,0xfff64911,0xffeac751,0xfff9e73b,0xfff86f87,0xffeb61bd,0xfffd149f,0x00029ea3,0x000540c9,0x000b1d6b,0x000f44f9,0x0013df2a,0x00185949,0x001f5895,0x0026ca24,0x002ad372,0x00239ec0,0x000d8043,0x000dfb30,0x00103906, -0x002565ff,0x00084e2b,0x00016ce3,0xffff7434,0x00192701,0x002161da,0x001c0df5,0x000dd060,0x0011ef31,0x001af348,0x00060669,0xffff4bd1,0xffea3a2d,0x0000f96e,0xfff73971,0xffb39555,0xffcb0e80,0xffbb6d08,0xffa206dc,0xffc7a05f,0xffd9251c,0xffc4df99,0xfff6337f,0xfff4e1b2,0xfff54bdf, -0x000197e6,0x00065876,0x000eb09d,0x0013a41b,0x001f1592,0x0030a74b,0x003bc6eb,0x00366bb0,0x0015943c,0x0020987d,0x00208ccb,0x00456798,0x0000e5e0,0xfff83abf,0xfff9ddb4,0x002d969a,0x003a4965,0x00318faa,0x001f378f,0xfff47c9a,0x00020150,0xffe4fed5,0xffd68f05,0xffb6e80e,0xffe20aa5, -0xffca7585,0xff88513e,0xffa51e21,0xffa57d43,0xffcab88e,0xffd2a94f,0xffd74078,0xffc13ddf,0xfffcbd06,0x0000b8f4,0xffffb2f8,0x0023616a,0x002ffd98,0x003fe192,0x004c501f,0x00625802,0x007c1a27,0x0085f601,0x0065b8d3,0x001e13c9,0x0017cba0,0x002b0215,0x006fb2c9,0x0011cc7c,0xfff5319b, -0xfffd008c,0x004a4a1d,0x0062b5b9,0x0046dd79,0x0014eb42,0x00b44246,0x00861696,0x007e66a9,0x0070f627,0x00566971,0x00709612,0x00787046,0x006be941,0x0047be7c,0x001c0bdd,0x0014ecbf,0x0009c4c7,0x000647c1,0x001b0952,0x00017876,0xffdfdd08,0xff86ae13,0xff7c3c51,0xff68fe58,0xff60fa29, -0xff5f5a9c,0xff5d175a,0xff4f5d93,0xff88a7b8,0xffca0a8f,0x001c5f11,0x004e098d,0x0034441c,0xffe0fc81,0xffe39a0f,0xffea165e,0xfff562bb,0x00063cb6,0x001b62bc,0x00225f3e,0x008f1a02,0xffbebdd4,0xffd16840,0xffed8e02,0x0014ae5e,0x0044f3eb,0xffa94d66,0xff7390f2,0xffaca2de,0xffdea396, -0xfff61598,0xfff5367c,0xfffdc181,0xfff772be,0xffdfd85a,0xfffda023,0x0015b731,0x0019c360,0x0010b405,0x0022f01f,0x00520baf,0x0064e73a,0x0075ca44,0x006a30d1,0x005ad36f,0x00102ac9,0xfface34b,0xff5e9cdd,0xff66ef44,0xffd31b1e,0x00482d92,0x0056661a,0x0025c978,0xffa7c358,0xff652d47, -0xff8cea9d,0xffa5d694,0xff7bedcf,0xffe8114c,0xff8d914c,0xff874cfa,0xff794038,0x000495c1,0x000f30d0,0xffdeea0e,0x00117566,0x000532c9,0x00059494,0x0000eb62,0x0006826f,0x00060eb9,0xffee40e4,0xffd826b1,0xffd20c93,0xffdecff9,0xffdce27d,0xffc237a9,0xffc9ee01,0xffc2b0eb,0xffb0f984, -0xffba3dfa,0xffcd6bc1,0xffd791bd,0x005654ed,0x0068bdf4,0x002fefac,0xff6a0afc,0xff67bf3f,0x002c4705,0x004bc333,0x008ab556,0x00f89f18,0xffce0956,0x007febaa,0x007f0925,0xffaff59e,0xff92c50e,0xffd00c5d,0xffe3fec0,0xfff17253,0xfffe591a,0x0000a548,0xfff905c3,0xfffd100f,0xfffe4fdb, -0xfffdaff9,0xfff6f206,0xffffffce,0x0011c40c,0x002fc53a,0x0031b976,0x003500b2,0x003809b7,0x0040c886,0x00387f89,0x002625e4,0x001f3f10,0x000f6818,0xfff012e3,0xffe5a994,0xffdb0cef,0xfff977ba,0xffee0d76,0x001e0135,0x0065a0de,0x0098d26b,0x007d8e06,0x0012e2de,0x00544bf0,0x00404044, -0x003735a3,0x003f2e4a,0x00308432,0x0025e781,0x0009f8ce,0xfffcd320,0xfff0b1c9,0x0001b324,0x0004e560,0x00062728,0x000284d1,0xfffe44e5,0xfffec7d5,0x000a6b6d,0x000f7bd4,0x00165df3,0xffff4532,0xffeba3d7,0xffe2f632,0xffe8118b,0xffeddb33,0xfff8fe4f,0x0003edd8,0x000e3022,0x00197334, -0x000d2bd0,0xffffb5df,0xfff1da94,0xffcfd1a6,0xffba8dde,0xffade363,0xffb4ae95,0xffda0704,0x00012ebb,0x003eb996,0xffbe850a,0xffabad1b,0xffb2f095,0xffc040f9,0xffd0f8b2,0xffde9d4c,0xffeaecd9,0xffee16e8,0xfff42791,0xfff1f0a6,0xffefe833,0xfff16c4c,0xfffc83f6,0x000e91c4,0x0011d326, -0x00093ab4,0xfff45eaa,0xffdc7aac,0xffd0e313,0xffd352ae,0xffdd020c,0xffed5b65,0x000457ac,0x002657b4,0x0040200b,0x00505025,0x0060b3ba,0x0065995a,0x00618030,0x004b4a0a,0x0027c3cf,0xfff686f7,0xffdcc5fb,0xffcac5c1,0xffc14fd5,0xffbe5860,0x00141741,0x001c6338,0x00255ad3,0x00223825, -0x002557e2,0x00220e65,0x001a7637,0x00135ee9,0x0021efc5,0x002f9161,0x003ec005,0x003dd00a,0x003c4d81,0x003d589d,0x00219840,0x000e7d85,0xfffbb564,0xfffab97d,0xfff7296e,0xffeff98a,0xfff0ae98,0xffee943e,0xffeabc37,0xffeda514,0xfff0ec8a,0xfff3697c,0x00056c12,0x00157fad,0x0027fb95, -0x002c85ea,0x0033ccf6,0x003a5571,0x0031b2b6,0x0027c3fa,0x001bc301,0x001897aa,0x00354c05,0x00398f64,0x003194c5,0x002f12a7,0x002a57bb,0x00268a57,0x00278412,0x002603e8,0x001f7757,0x0014cf30,0x000b0a4d,0x0004518a,0xfffd69d3,0xfff803bb,0xfff26502,0xfff1dd62,0xffed8211,0xffe78f34, -0xffde8f22,0xffddbd4a,0xffe079e0,0xffe24098,0xffe4bd6f,0xffe54efa,0xffe5d9a1,0xffe4978f,0xffed52bf,0xfff40952,0xfffbeb2c,0x0002ae2e,0x000a4518,0x00146f09,0x00189cb3,0x00202af2,0x002774d1,0x002f499c,0x0002ad26,0x00073b1f,0x0002c5b0,0x00023c01,0xffff599d,0x00054629,0x00016a9a, -0xfffdeeb1,0xfff93bcc,0xfff6f36c,0xfff42865,0xfff185e9,0xffee7cd4,0xffeb496e,0xffefd789,0xffefbfc6,0xffe549ea,0xffe7a356,0xffe71a8f,0xffe7856d,0xffe69691,0xffe607e1,0xffe57e69,0xffe52a1d,0xffe54c10,0xffe435d5,0xffe84545,0xffeb4d89,0xffee6b2c,0xfff2d271,0xfff693f5,0xfffa44ba, -0xfffc1b5e,0xfffdf87c,0xffffa042,0x0000da96,0xffe88223,0x0003b50e,0x00062f56,0x0007c390,0x0005447e,0x00046bc0,0x0000c7b1,0x0003ee37,0x00023760,0xfff573b1,0xfffcc24c,0xfffab281,0xfff34e7b,0xfffa67ca,0xfffcefff,0xfffa534f,0xfffef006,0xffffc2e4,0x000463cc,0x00035ecf,0x0003a6a4, -0x0004508c,0x000568a9,0x000714f1,0x000a7984,0x000b37fd,0x000a8713,0x00058127,0x000711c5,0x00076711,0x000f7eab,0x0002584f,0x00002909,0xfffebfbf,0x0008a5b6,0x000b21ed,0x000aa1e8,0x000737c3,0x0001d465,0x0006171f,0xfffe154f,0xfff771eb,0xffeb94f9,0xfffc80ef,0xfffa62dd,0xffde316a, -0xfff6a5b2,0xfffa4247,0xffeab5aa,0xfffb1100,0xfff84b79,0xffebbb8e,0xfff82434,0xfffc6c4c,0x0003152f,0x0006b793,0x000cddd5,0x00128f34,0x00166476,0x001c7575,0x00227e8a,0x00236114,0x001b3829,0x00079aa4,0x000639f3,0x000a4bcc,0x0023b769,0x00042891,0xfffceed4,0xfffbe5a9,0x001556cf, -0x001c6fdb,0x001440b4,0x0008dcbe,0x000e3570,0x001a4e83,0x00040094,0xfffd5559,0xffe78343,0x00034864,0xfff9d9df,0xffafe2e9,0xffd1af9f,0xffc3dde5,0xff9e1559,0xffcaac12,0xffd94062,0xffc708d2,0xffed9c78,0xffec51c6,0xfff5ccba,0xfffc3bcd,0x00042078,0x001041cf,0x0012daf5,0x001db7fa, -0x002d0f2b,0x0033d979,0x002dbb36,0x001036f5,0x001778f3,0x0017bd2d,0x00433e79,0xfffae19e,0xfff3156d,0xfff5c700,0x0028f67f,0x00349f5c,0x0026bba3,0x0019c980,0xffefe962,0x00005db0,0xffe358aa,0xffd3b056,0xffaf69a8,0xffe86ae3,0xffd71fc2,0xff9190bc,0xffbce000,0xffbef45c,0xffd9ca29, -0xffe2af4f,0xffe0bf92,0xffc48c4b,0xfff0a3fc,0xffef7e35,0xfff65923,0x0018f149,0x0029ca3a,0x00425ecd,0x004ba7c6,0x005f4106,0x007260e2,0x00734c77,0x004e7a15,0x000be730,0x0001ed41,0x001ec4f2,0x006ec38d,0x000b920a,0xffec818c,0xfff7056b,0x00437266,0x0056aa77,0x0030d304,0x0008f84c, -0x00b607b0,0x008e572f,0x007fe75a,0x0073b494,0x0063c91b,0x006f7c80,0x006730f9,0x004cd64c,0x003b457c,0x0018958b,0x0013fc16,0x000ae7d4,0x000bf7d1,0x000fc7f4,0x0011da87,0xfffa0c68,0xff905630,0xff826fbf,0xff6d2160,0xff65eb03,0xff5e0051,0xff5bfbf4,0xff5d1ba5,0xff9704ee,0xffe1be51, -0x0048550c,0x005166b3,0x00243751,0xffd2c168,0xffd7bb3f,0xffe893ea,0x0006a704,0x0001cddf,0x001dad4d,0x004294f9,0x00995f97,0xffc46395,0xffd3ac52,0xffd9224e,0xfffe3986,0x003f2141,0xffbeba28,0xff951cc0,0xffc42a12,0xffec10ef,0xfff41675,0xfff6c206,0xfff9de0a,0xfffbbe66,0xffe936e8, -0xfff94323,0x000d90ad,0x0014a20d,0x0006f6e7,0x0016e5c2,0x0042742b,0x005eecf6,0x0070f18a,0x0061fe43,0x003c9971,0xfff09ffe,0xff9e4442,0xff56c6ef,0xff73afa4,0xfff4a4d0,0x004d1439,0x004af5ed,0x0022ae9e,0xff9d4652,0xff618907,0xff958cea,0xffaa0c57,0xff97ec95,0x0021bf13,0xffb9da35, -0xffa425ec,0xff71d673,0x000d0428,0x00168b18,0xfff0864e,0x00134cf4,0x0002c46d,0x0006e33a,0x0002ad11,0x0003d8a7,0x0008879c,0xfff73aef,0xffe2b11c,0xffd7b68b,0xffe3c561,0xffe16bd8,0xffc92d50,0xffca782a,0xffc1e22d,0xffb9dfed,0xffc389e1,0xffdbd523,0xffefd048,0x007026a9,0x006bd16d, -0x0003c0ed,0xff6b00c8,0xff7f00d2,0x00485788,0x005b04d7,0x008e8dff,0x00ef3c0d,0xffdeac84,0x006c2f10,0x00c3449d,0xff96d8ae,0xff47de63,0xff872160,0xffdae632,0xfff4c932,0xfff77e5a,0xfffe28b2,0xfff968ea,0xfffc8bb1,0xfffc7306,0xfffd9361,0xfffb15f6,0xfffe7cea,0x000adcab,0x002a5061, -0x00317796,0x00375807,0x003c98a2,0x003ee2dd,0x00310020,0x0018902d,0x000b84dc,0x0000ea7c,0xffeded50,0xffdfcdf1,0xffd7f886,0xfff21e3d,0xfff4b67f,0x0030c5e4,0x0095061e,0x008611a0,0x0041d878,0xffc8d356,0x001dcd01,0x003ba5db,0x00410424,0x005d9de0,0x005a3d44,0x003d6aa0,0x000e1d5c, -0xfffa1ae2,0xfff5cbbc,0x0004d281,0x0005c343,0x00068fd8,0x000584c3,0x0002ca33,0x0000c6b5,0x000ad5fd,0x00142518,0x00223c5f,0x00129045,0x0000f68a,0xfff4d976,0xfff5f1eb,0xfff9f3d9,0x00044b7c,0x00080628,0x000ad6a8,0x001030cd,0xfffc7064,0xffec7c73,0xffde3cb2,0xffbef100,0xffab9f8f, -0xffa3b4d0,0xffb535c3,0xffe67398,0x000d48fe,0x003f86c0,0xffd48e34,0xffbd2ca9,0xffbb7b28,0xffbf0735,0xffccd148,0xffda26c5,0xffe70413,0xffea996e,0xfff330e4,0xfff2e956,0xfff0826c,0xffeeff01,0xfff5bb4c,0x00051517,0x000e6d78,0x000a7536,0xfff980f1,0xffe19fb6,0xffd5a436,0xffd6f3f1, -0xffdb96d7,0xffe6cf01,0xfffaa2eb,0x001acfa1,0x0032b090,0x0040c7dc,0x004b9a54,0x004c6c36,0x0044579c,0x003393cc,0x0013e0f8,0xffe2fdef,0xffcb0794,0xffbc55b4,0xffbfb63c,0xffca4c70,0xfff3bdc7,0xfffce373,0x0009cf35,0x000afdef,0x00104f40,0x000e0e60,0x000889a5,0x000201f5,0x001300af, -0x0020f876,0x00320fce,0x003351da,0x00387f42,0x003ccf23,0x0025c097,0x001443c7,0x00065836,0x00021b12,0xfffba0c6,0xfff0e57a,0xfff48ded,0xfff55d2b,0xfff3d866,0xfff77675,0xfffb8f43,0xffffdd7c,0x000dd469,0x001a46b1,0x00281011,0x002795b5,0x00294ff9,0x002baf2d,0x001f8562,0x001154a3, -0xfffdd50b,0xfff9bd51,0x003acd54,0x003e5e28,0x003a7da5,0x00343d1a,0x00310d56,0x002d61de,0x002e2c1f,0x002dfac1,0x0028eb32,0x002175d2,0x001af265,0x0015a98e,0x000fd714,0x000c47d7,0x0003a3c0,0x0000f20e,0xfffa8988,0xfff2b293,0xffe82a10,0xffe64545,0xffe8d9da,0xffe9960a,0xffeb98af, -0xffebf65f,0xffec42ae,0xffeb00d5,0xfff41e1d,0xfffb4194,0x00039260,0x000b4968,0x0013ad4f,0x001dc131,0x00208cb9,0x0026ede4,0x002d065d,0x00351a55,0x000805a5,0x000b0cf0,0x000841c4,0x00087350,0x000648fc,0x000a4db5,0x0006ef8d,0x0003cfae,0x0000b1f9,0xffff0c11,0xfffcc549,0xfffb5c59, -0xfff9525d,0xfff7cf92,0xfffae25b,0xfffa5c19,0xffeeb67c,0xfff0efd6,0xffefde3a,0xfff03f1c,0xffef5440,0xffeef139,0xffee7fc1,0xffee3918,0xffee670b,0xffed4633,0xfff14195,0xfff41f17,0xfff6f572,0xfffad097,0xfffdff49,0x00017df9,0x00030bae,0x0004e76e,0x00069c4c,0x0006e611,0xfff27758, -0x0004840b,0x000701d4,0x0009a6b9,0x0004311d,0x0001ea7e,0xfffd4428,0x00041290,0x00009a2e,0xfff2870b,0xfffaa4c5,0xfff8e2e2,0xfff147d2,0xfff7d461,0xfff9f7b6,0xfff83692,0xfffbd30a,0xfffe1c4f,0x00015066,0x0000fa45,0x00025b15,0x0005d359,0x00062e69,0x0007e1cf,0x000b6150,0x000b096b, -0x000a49d5,0x00066334,0x0007157b,0x00077761,0x00109eca,0x000312ac,0x00011377,0x00002306,0x0009b907,0x000c0c96,0x000a55dd,0x00080f7f,0x00035d8e,0x0007f6dd,0xfffb5f43,0xfff88f1e,0xffec7c3c,0xfffdbee4,0xfffdbcf0,0xffe1871f,0xfffc1752,0xfffead01,0xffeb28f0,0xfffbfa12,0xfff8e620, -0xffeefe81,0xfff493bd,0xfff82dc5,0x0003052a,0x0003f1eb,0x0008e742,0x001240f6,0x0016485d,0x001b9736,0x00214611,0x001e3810,0x00158238,0x0005831c,0x000282f9,0x00084bae,0x0024ef1b,0x000496b7,0xfffdd01a,0xfffe7a7d,0x0016dc64,0x001c69e4,0x00115048,0x0008e045,0x00105a8c,0x001c20a5, -0x0003303c,0xfffcfe96,0xffe716d1,0x00053827,0xfffc0032,0xffb2c860,0xffd84ebc,0xffcdd14a,0xffa0e259,0xffd02142,0xffd94ced,0xffcdbdca,0xffe529e1,0xffe4dbf2,0xfff935d5,0xfff83856,0x0001dd8a,0x0010de20,0x0013b5fc,0x001e12b0,0x002d2ae8,0x002dd020,0x00274c25,0x000f063d,0x0012c555, -0x00136fe5,0x0043f9f8,0xfffafb05,0xfff51639,0xfffa53cc,0x002b04ce,0x00354aef,0x0022946a,0x001a6e53,0xfff3e501,0x0001d1ec,0xffe41238,0xffd49f91,0xffaf991e,0xffee5991,0xffe355d1,0xffa42bc2,0xffd3da28,0xffd7a8b6,0xffea84cb,0xfff0d0f4,0xffebfa6f,0xffce5a6a,0xffe807e4,0xffe17b21, -0xfff09df4,0x000e2b01,0x0020a66b,0x003f7d09,0x0048b10a,0x005ae9e2,0x006a815b,0x005fdb47,0x0037f875,0xfffdf503,0xfff1d3cd,0x0016ba1d,0x006e60c3,0x000b7be9,0xffed3f63,0xfffd4497,0x00466666,0x0052c46d,0x002343a5,0x00052c21,0x00b9084d,0x0091a9ec,0x007ad557,0x00714084,0x006a6852, -0x00681398,0x00527768,0x002edc96,0x002b487e,0x000e4b23,0x000f9523,0x000768df,0x000ceb52,0x000786de,0x001be761,0x0010d067,0xffa2135d,0xff8f3d88,0xff795069,0xff73ea10,0xff6732a9,0xff65e940,0xff77ccc7,0xffaff707,0x0003409e,0x00783766,0x00633e5d,0x0025a04a,0xffd0d1a0,0xffd954c8, -0xfff05f99,0x0019b5b2,0x0002ad4a,0x002624b3,0x0069cbf3,0x00a77d30,0xffd3ac7f,0xffde14b6,0xffce0bde,0xffef42ea,0x00350c5d,0xffd16dd8,0xffb46b77,0xffdeb149,0xfff4b36d,0xfff5eb7f,0xfff9cd54,0xfff9a156,0xfffd663c,0xfff2c3d0,0xfff5d77d,0x00056fd8,0x001039e8,0xfffe4fec,0x00097da2, -0x0030b05f,0x00555845,0x0068ddfe,0x005ba0f5,0x0026a8d0,0xffdcc57b,0xff97c32d,0xff594e35,0xff8a43f8,0x001c33de,0x00533cb6,0x00435652,0x002648d7,0xff9c778d,0xff69030b,0xffa527b6,0xffb53394,0xffcad629,0x0057c7cf,0xffdfa993,0xffbe7617,0xff807709,0x000e8828,0x0014bc61,0x000046b1, -0x000bdd5b,0x0002a815,0x0005376a,0x00033ee8,0x00022a92,0x00071f57,0xffff0931,0xffef18ef,0xffe00e84,0xffee17e0,0xffec856d,0xffd9b8c5,0xffd4c5ab,0xffc89edb,0xffc9f1f1,0xffd317f9,0xfff3d85c,0x001a0024,0x008d6ec6,0x007240a5,0xffe5da17,0xff7ca61f,0xffa32a24,0x0068611e,0x00758694, -0x009f3d85,0x00e4f2f6,0x0001a167,0x00456cb5,0x00df2b2f,0xff8dcb9c,0xff19c50f,0xff4cc603,0xffd77964,0xfff8b1f8,0xfff7543e,0xfffe49cc,0xfffaca3e,0xfffcbb4d,0xfffc34a9,0xfffd4bb5,0xfffd16b3,0xfffcfff1,0x0003e95b,0x00217187,0x0030fcbf,0x0037177f,0x004055b7,0x003dbaf6,0x002b6e4a, -0x00110189,0xfffe8293,0xfff6d7a4,0xffefcca8,0xffe2cb41,0xffdfde34,0xfff125af,0x000d432b,0x00504670,0x00c11b9e,0x00663218,0xfffda27d,0xff8ec329,0xffe3c384,0x0045ccc2,0x005d9439,0x0081cc6e,0x0087117d,0x0050aca8,0x00137c78,0xfffa882f,0xfffb882e,0x000631f0,0x0004a30e,0x00060fb5, -0x000613cb,0x0004c496,0x000204c5,0x000a8879,0x00166f10,0x002a210f,0x0025701c,0x00157b78,0x000a3e7a,0x0007fe97,0x0008a62a,0x00118e47,0x00117ab2,0x000fbb70,0x00113054,0xfff707b4,0xffe6049d,0xffd995f4,0xffbc1bee,0xffa956c9,0xffa6c54a,0xffc26a7e,0xfffa75a2,0x001fe5a9,0x0043ab66, -0xffeff9b9,0xffd76098,0xffc80706,0xffc4536f,0xffcc6f77,0xffd85a2f,0xffe66f6c,0xffea891b,0xfff4f55a,0xfff55c5b,0xfff2e04e,0xffefa82e,0xfff31861,0xfffdacfc,0x000a4a9f,0x000ac052,0xffffb141,0xffe84a5c,0xffdbefb3,0xffddb79e,0xffdfe9e4,0xffe5cb57,0xfff50b20,0x0011dc19,0x00267c54, -0x0031f6f7,0x0037faa5,0x0036704b,0x002d403d,0x0023fc0d,0x000c027e,0xffdff87e,0xffcb1f29,0xffbf42d0,0xffcc0c4a,0xffde81e2,0xffdf9d41,0xffe5db9b,0xfff35b0f,0xfffa0b5d,0x00007614,0xffff9680,0xfffbd73a,0xfff71aa4,0x00075123,0x00152548,0x002436d4,0x0027de79,0x002ef3b5,0x0035d5ee, -0x0025c23d,0x0018af95,0x000f8d05,0x0009319e,0x000025f7,0xfff52545,0xfffd196a,0xffffec68,0x000182c9,0x0006b2f4,0x000cae9d,0x00139156,0x001d4ad5,0x0025b16c,0x002e5a6b,0x0027c71b,0x00229774,0x001f88e8,0x001185de,0x0000fff7,0xffe94a6a,0xffe51cf8,0x003c672e,0x003ed63b,0x0039f94c, -0x00356c54,0x0032114e,0x002f1665,0x003125e6,0x0031a75d,0x003002ee,0x002bb2f6,0x0027fa68,0x00262cfe,0x00230c31,0x0021857c,0x001538af,0x0010f989,0x0009a4be,0x0000db2a,0xfff291d5,0xfff44bc8,0xfff6e1df,0xfff685db,0xfff806b0,0xfff81e12,0xfff81a46,0xfff6fa46,0xffffab34,0x00068d6a, -0x000eaa97,0x0016b60d,0x001f6096,0x00284eab,0x00294491,0x002d6bef,0x00314493,0x0037ecad,0x0010c9e7,0x00130d82,0x000e30c5,0x000ce00b,0x000961b7,0x0010cd05,0x000aff3b,0x0005fafd,0x00048171,0x0003be75,0x0002ad08,0x0001f3ab,0x0000c6d2,0x000136b3,0x000541fc,0x000745a5,0xfff66ca9, -0xfffaf8a4,0xfffb7b8b,0xffffce60,0xfffde6b8,0xfffdfa01,0xfffdbaee,0xfffd90d3,0xfffdd002,0xfffcc048,0x00004cba,0x0002b7a0,0x0004eddf,0x0007e47a,0x000a35a6,0x000d52c2,0x000e4177,0x000fd01e,0x0011563b,0x0010beb1,0x0002c9e6,0x00036563,0x0006342e,0x0007cdf1,0x00061658,0x00051855, -0x000113b0,0x0004ec34,0x00040f7d,0xfff7d39d,0xffffd18e,0xfffe72df,0xfff7450a,0xfffd06a5,0xfffe309d,0xfffd76cb,0xfffe0174,0xfffe4f30,0x00057d78,0x0003cc90,0x0003fc0b,0x0003c426,0x00051b9a,0x00068ffd,0x000a3970,0x0008a95c,0x0007e283,0x00053154,0x00054262,0x0005b115,0x000f5453, -0x0001d9c8,0x00000eb4,0xffff9e96,0x0008b040,0x000aeab7,0x0008666b,0x0007075b,0x0002ebfa,0x00080f7f,0xffffe709,0xfff9be59,0xfff0acb0,0x0000a6e3,0x0000a95e,0xffe62058,0xffff3139,0x00012099,0xffebce37,0xfff9a8c6,0xfff7e34c,0xfff37e34,0xfff2d9e4,0xfff5f4ba,0x000501b1,0x00023efb, -0x0009a10d,0x000f1e8a,0x0012cbe1,0x0017b146,0x001d1667,0x0015e17e,0x000cf99a,0x00014cb5,0xfffe0694,0x0005361b,0x0022d6ea,0x0002b8f0,0xfffc7d6a,0xfffede66,0x0015b17e,0x0019dace,0x000ccbf9,0x00074e5c,0x000f98c4,0x001bffca,0x0005e5a0,0xfffe2f56,0xffea15f0,0x00076ddf,0xfffeed63, -0xffbd0838,0xffe0d256,0xffd7d6d7,0xffb0292d,0xffd79dde,0xffdb1f05,0xffd7e711,0xffdfdb48,0xffdeb6c1,0xfffe849f,0xfff6d72e,0x0001c009,0x000e872f,0x0010bb86,0x001b37d7,0x002a4839,0x0023e8e1,0x001d3a1f,0x000b38fb,0x000d3f5a,0x000e4126,0x00401753,0xfff910b3,0xfff4cca0,0xfffccac3, -0x0029c5cd,0x00330a3d,0x001d79c1,0x0019cbe8,0xfff58ddd,0x00040f64,0xffea7a14,0xffd821ed,0xffb6632d,0xfff50f5c,0xffee46e3,0xffbbda91,0xffe65cfe,0xffecef84,0xfff4ae7e,0xfff7e6c2,0xfff65c3e,0xffdbc80e,0xffe42074,0xffd8581e,0xffefd2ec,0x00046720,0x0018a624,0x00368582,0x003f4bf8, -0x0050b07c,0x005db33a,0x00464ff2,0x001cd776,0xffeecd94,0xffe5428c,0x000fc4f7,0x00678f64,0x00086678,0xffec33ad,0x00019f20,0x0045a634,0x004ba715,0x00155755,0x00016226,0x00b2847e,0x008b6745,0x007599c1,0x006c21bc,0x0069eeda,0x005bebd3,0x003ac693,0x00197146,0x00199527,0x00052bb8, -0x000abbbf,0x0003105f,0x000aa808,0x0002862f,0x001f17d6,0x0020315b,0xffbb65b5,0xff9fcc19,0xff8ba1dc,0xff862cab,0xff746ede,0xff75e854,0xff95a688,0xffcc067e,0x00243c84,0x009d7010,0x00704e4e,0x002583a6,0xffcfe4d2,0xffd9d9dd,0xfff352dc,0x00218fce,0xfffe6a6b,0x0029f255,0x008939b5, -0x00b082e6,0xffdef2a3,0xffeec923,0xffd25807,0xffe8e69a,0x00286c34,0xffe12a3d,0xffd0ef02,0xfff40dd7,0xfff7819e,0xfffab985,0xfffc0672,0xfffc0b2e,0xfffd402a,0xfffa247a,0xfff4a8ae,0xfffde008,0x000e5abf,0xfff8660b,0xffff274d,0x001d99a8,0x0044d2bf,0x005aac13,0x00503d1d,0x001346e1, -0xffcc5e87,0xff8f743a,0xff609035,0xffa488f5,0x00403832,0x005369c6,0x003635aa,0x00216382,0xff965a12,0xff6c9167,0xffae262e,0xffbd3ded,0xfff5297f,0x00845509,0x000dfe0e,0xffdbe86f,0xffa229cf,0x000a22eb,0x00110a56,0x00044eef,0x0005140d,0x0002d0c9,0x0002bce9,0x0002c954,0x0001accd, -0x0004304a,0x0003fd8f,0xfffa84fe,0xffebbd22,0xfffb7471,0xfffd5ad6,0xffeef9e9,0xffde726f,0xffcf2fe4,0xffd631b4,0xffdb6a17,0x0003c5e7,0x003e7cf5,0x0098534f,0x00697c28,0xffc97a6d,0xff943282,0xffc924e6,0x007d5467,0x00860535,0x00a28e24,0x00be58e6,0x0017641a,0xfff33bd0,0x00bc40af, -0xff968e89,0xff0c3423,0xff323138,0xffd6a491,0xfffbc91d,0xfffa7245,0xfffe2b13,0xfffcd57e,0xfffd8e77,0xfffcfb2f,0xfffd728b,0xfffdaaad,0xfffbfccd,0xfffeb75a,0x0017986b,0x002ef9c0,0x0038f11e,0x0040b86b,0x0036acbb,0x00225552,0x0006c24b,0xfff00e2b,0xffe6e29b,0xffe76962,0xffde24e7, -0xffe27298,0xffea3fdf,0x00288d49,0x006b3f2f,0x00cff061,0x002f3129,0xffadf0ec,0xff56ed8c,0xff9a814b,0x0045b0ac,0x007d383b,0x00ae7882,0x00b1d03e,0x005be4f6,0x001bec18,0xfffcf3ea,0x0001369a,0x0004a55b,0x0003044d,0x00049e70,0x00052d53,0x00049cf5,0x00028032,0x0009845d,0x0017926d, -0x002ec224,0x0037258e,0x002cc284,0x001fe2e5,0x00182b65,0x00158d1e,0x001a1fe4,0x00181e57,0x001270d5,0x000ee0b8,0xffefcc70,0xffde04a4,0xffd35dc7,0xffbacc61,0xffaa4143,0xffad2175,0xffcf6398,0x00051772,0x0023605e,0x003747b6,0x0001f93e,0xffeeb866,0xffdd8dab,0xffd2a99e,0xffd4f46a, -0xffdeaf52,0xffea07f8,0xffee6855,0xfff8ba9e,0xfff8eb47,0xfff6457c,0xfff33d9e,0xfff43632,0xfffa0b26,0x00072c34,0x000bd05e,0x00077efd,0xfff2174f,0xffe6e016,0xffe6780f,0xffe51658,0xffe6ffc5,0xffef8ddc,0x00061e23,0x001548f4,0x001d89f6,0x00214207,0x0020d1d8,0x001abc4b,0x0018dff6, -0x0008f6f5,0xffe3c2d7,0xffd4aece,0xffcbaeb3,0xffdc2f16,0xfff0af0b,0xffd436ec,0xffd8fc28,0xffe759eb,0xffeed365,0xfff6adab,0xfff6a604,0xfff5a2d4,0xfff33a21,0x0001c587,0x000c4a70,0x001a000a,0x001c38ff,0x00253a6b,0x002c1a10,0x0025556f,0x001da0dc,0x001a2fb2,0x00125b75,0x00092c96, -0xfffcbaaa,0x000611ce,0x000ba3b9,0x000fb653,0x0016ecdd,0x001eb5fe,0x0027ed27,0x002bddbd,0x002eb436,0x0030fa92,0x0024f119,0x0019c955,0x00119a9a,0x00045c71,0xfff4a905,0xffdd0e25,0xffd9f67c,0x0036f795,0x00389a88,0x003a4df5,0x00334e5e,0x00330044,0x00307f8c,0x00322b9a,0x00334975, -0x0033fd09,0x0033dc78,0x0034a79f,0x00350a7f,0x00345a3b,0x00355056,0x002845e9,0x00224267,0x001ad322,0x0011b6f8,0x0004960a,0x0005b433,0x0007da35,0x00072f4f,0x00080cb9,0x00081a05,0x0007cb2d,0x00073c0b,0x000d848f,0x0012e3a4,0x0019660c,0x002051ce,0x0027a318,0x002dc82f,0x002d0d99, -0x002eae07,0x002fe320,0x00348ce7,0x0018fecb,0x0018d8b4,0x00189e63,0x00182393,0x00144786,0x001a080e,0x00165bb7,0x0011304f,0x00115137,0x001150ee,0x00109dff,0x00113028,0x0010fcd8,0x0012cda4,0x00164b4a,0x0017ae9e,0x000800e2,0x000d528e,0x000d7cc1,0x000f321d,0x000ddb03,0x000e3fcd, -0x000e4783,0x000e5093,0x000ea4ad,0x000defbb,0x001077c5,0x001206bc,0x00132d38,0x0014c76f,0x0015e6c6,0x00181e93,0x00187faa,0x00199fdb,0x001acf0b,0x00199a18,0x00137e6c,0xfffcd09d,0x000052b7,0x0001c683,0xffffafc0,0xffff66cc,0xfffe9442,0xfffe3fea,0xfffef859,0xfff6e7a8,0xfffe3f1b, -0xfffda9f9,0xfff8104e,0xfffc0654,0xfffc4ae3,0xfffd27c6,0xfff82055,0xfff77504,0x0003f97c,0xfffe841c,0xfffdc7ec,0xfffd596f,0xffff1b58,0x00003161,0x0003d92c,0x0000f406,0x00002644,0xfffeb3aa,0xfffe6c4e,0xfffee02b,0x00083523,0xfffb5627,0xfff9bb04,0xfff9c267,0x0002263f,0x00043dea, -0x00010b54,0x0000c9f0,0xfffd4320,0x0001df8f,0xfffc1ae6,0xfff5a327,0xffee3adf,0xfffd063f,0xfffd4a56,0xffe68ea1,0xfffc573d,0xfffc0265,0xffe6d24b,0xfff063a7,0xfff064bb,0xfff394a8,0xffeca394,0xffef43a8,0x00016d5b,0xfffc1719,0x0003cac3,0x0005f4d9,0x000a46e3,0x000ddb9a,0x0012af94, -0x000708c1,0xfffe3d89,0xfff758dc,0xfff51005,0xfffd1a64,0x00191ba9,0xfffa7fbd,0xfff4d1ab,0xfff87484,0x000d19c2,0x000ff21a,0x000199ee,0xffff8dc4,0x000a177e,0x00159238,0x00011137,0xfff92df9,0xffe808a6,0x0003d4b1,0xfffd12b4,0xffc79560,0xffe55484,0xffe02e20,0xffc1004d,0xffdbf1ee, -0xffdb5231,0xffe02f9e,0xffd98976,0xffd712ce,0xffffc61d,0xfff2caf6,0xfffc9f44,0x0005c8c4,0x00093745,0x00120f02,0x0020c05b,0x0012437a,0x000b9b66,0x0000d60c,0x0002bcbf,0x00041cdd,0x00328b69,0xfff04e99,0xffed086c,0xfff7428e,0x001f89dd,0x0027a805,0x00109afc,0x001262c6,0xfff3a667, -0x0000722e,0xffeb4a65,0xffd923a2,0xffbdf31a,0xfff7ea55,0xfff51413,0xffd369e8,0xfff4e541,0xfff8f2c2,0xfffd9e2d,0xfffd9729,0xfffc4b3a,0xffeb438a,0xffe472f1,0xffd403db,0xfff0bd21,0xfffb56dc,0x000e1168,0x00270ffc,0x0030a2f6,0x003f7b7b,0x00494e2d,0x0023a8b9,0xfffa1360,0xffdb6be5, -0xffd89b23,0x00058e0a,0x00553496,0xfffd80be,0xffe3e086,0xfffc6610,0x0038d196,0x0038fb3f,0xffff868b,0xfff77390,0x00a30946,0x0076a1e9,0x00638964,0x005d05e4,0x005b0754,0x0046ebcf,0x0022e011,0x000b35a0,0x000a5441,0x00023ab1,0x0004d82f,0x00008fbf,0x00070b78,0x0000137a,0x001b3c63, -0x00258724,0xffd55fd7,0xffb13281,0xff9a9c4a,0xff94b272,0xff7f0f5c,0xff82294b,0xffab8261,0xffe23225,0x003a8b39,0x00aaac9b,0x006c2257,0x0018952b,0xffc8a6f8,0xffce3d8e,0xffe782b2,0x0018d172,0xfff0cbd9,0x0022ddfc,0x0094c321,0x00ab6df6,0xffe0de18,0xfff7a357,0xffd1d5d7,0xffe20f8e, -0x001596cb,0xffec3077,0xffe8d0c3,0xfffcb7cc,0xfffb5cb7,0xfffdf2d6,0xfffdfb41,0xfffe4eb6,0xfffdc80a,0xfffd6e6e,0xfff5f3c0,0xfff78368,0x0009e66b,0xfff1bff4,0xfff1b224,0x000625d5,0x002d5f1c,0x0043e2c7,0x003be1b2,0xfffb2d42,0xffb3f83c,0xff777369,0xff5a5a5d,0xffad0b50,0x004c42a7, -0x003c6230,0x00143d89,0x0006aaa5,0xff810229,0xff6314b2,0xffa7d952,0xffb84b0a,0x0014656b,0x0094ff19,0x002c368f,0xfff24366,0xffbc357b,0x0003b90d,0x000af860,0x0001c8e0,0x000284c4,0x00017b02,0x00015669,0x00019691,0x0001492c,0x00023d5f,0x000460d4,0x00022838,0xfff3cf1b,0x0004860c, -0x0008950e,0xffff91ce,0xffe620fd,0xffd1d638,0xffd9eedb,0xffdc83f9,0x000c62c5,0x005a329f,0x008d3c09,0x00490b79,0xff9e5ecf,0xff9c09e0,0xffe02483,0x007b8005,0x008c844d,0x009dc538,0x008e699f,0x001fd601,0xffa1f1d5,0x005ada43,0xff931d9f,0xff1b7f11,0xff30fad5,0xffd6c22e,0xfffd3ab4, -0xfffd922f,0xfffe708b,0xfffe5ef9,0xfffe74fe,0xfffe0313,0xfffe1da6,0xfffeb2f2,0xfffb5a5b,0xfffae413,0x00092018,0x002512cd,0x00327116,0x003793fd,0x00294ff6,0x00137e63,0xfff75c2b,0xffdc654a,0xffce0af6,0xffd14327,0xffcc57ff,0xffd963b8,0xffd9c578,0x003ae5c6,0x007410ed,0x00b18ce1, -0xffeabc29,0xff690350,0xff3c749a,0xff626af8,0x003f9b4a,0x00967e1c,0x00c83376,0x00c77450,0x005769af,0x00209641,0xfffef2d1,0x0002e205,0x0002f680,0x0001e936,0x0002f3fb,0x000375f6,0x0003bfb4,0x0001ce6b,0x0005e5db,0x00140d73,0x002a36fd,0x003f1407,0x003a6b05,0x002b849d,0x00202c5f, -0x0019780c,0x001a6130,0x001683f1,0x000da497,0x000389e4,0xffe101fd,0xffcd955f,0xffc334a9,0xffad5171,0xff9fbd5f,0xffa8a6e1,0xffce3015,0xfffc0005,0x0016a7fa,0x00199874,0x0006a5e8,0xfff9e661,0xffe5d653,0xffdbf4c6,0xffdb96e7,0xffe34cda,0xffece6af,0xfff31e34,0xfffbcf3a,0xfffc6093, -0xfff9d817,0xfff8897f,0xfff74dcf,0xfff8c284,0x0002e210,0x00080f44,0x00087caf,0xfff66172,0xffeb2407,0xffe6e29e,0xffe2f213,0xffe20a47,0xffe5e7c3,0xfff496bd,0xfffc5aa2,0xfffeaded,0x0000c360,0x00006d73,0xfffc0f46,0xffff67ca,0xfff74e9d,0xffdb8c74,0xffd53700,0xffd10d31,0xffe41260, -0xfff6f949,0xffc68286,0xffc85e73,0xffd7bc42,0xffde622a,0xffe7bcc9,0xffe9abf5,0xffec3a52,0xffed870b,0xfffa7b4e,0x0001063c,0x000d7b76,0x000c7e0c,0x0017c73c,0x001bea60,0x001df7b5,0x001a4b8b,0x001be705,0x00132c22,0x000a4b53,0xfffdb451,0x00072c15,0x000e3159,0x0013a7ef,0x001be459, -0x0024bed6,0x002f1b31,0x002c5c69,0x0028f1f3,0x00246868,0x0014474e,0x0004b8d1,0xfff85ba8,0xffee5f0d,0xffe20e83,0xffcebeeb,0xffcbf03a,0x00224eb6,0x0021eaab,0x002e1fed,0x00237676,0x0027dd50,0x0026f384,0x0027e003,0x002a5338,0x002b889d,0x002ea282,0x0033b092,0x003521bd,0x00375e5a, -0x003a7f61,0x00307250,0x002928cf,0x00216083,0x0019f07f,0x00119bc5,0x000e0875,0x0010069c,0x000ef361,0x000f2740,0x000ed31d,0x000dd01d,0x000d9d6b,0x001066fc,0x00137a7f,0x00177cfb,0x001c3321,0x002102fd,0x00235c49,0x002157e3,0x00207039,0x001f5b8e,0x0021a597,0x00163901,0x00135f8e, -0x00170ca9,0x00191d27,0x001ad3a7,0x00170be0,0x0017d074,0x00183c15,0x0019d91e,0x001a95aa,0x001a414b,0x001c169a,0x001c9cfd,0x001f4beb,0x001c461c,0x001b68da,0x00167461,0x00160a01,0x0014a320,0x00146c1a,0x001440a8,0x00148a36,0x0014d3ce,0x00150b64,0x00157b82,0x0015372f,0x001661eb, -0x0016cb7e,0x0016a27f,0x0016a75a,0x001674bc,0x0017722b,0x00175dfc,0x0017f4ed,0x0018a225,0x0016f897,0x00183664,0xfffb7c00,0xffffa403,0x000186e5,0xfffe1d71,0xfffc479b,0xfff92b8a,0xfffd0763,0xfffc8b61,0xfff41e39,0xfffa2b96,0xfffa3b41,0xfff63d57,0xfff7b15d,0xfff72fc3,0xfff9c3b7, -0xfff505fe,0xfff5c022,0xfffeb853,0xfffb4a67,0xfffb7f12,0xfffbb5d6,0xfffd536a,0xfffe663d,0x0001fbae,0xfffdc7d5,0xfffd0ebd,0xfffcffa6,0xfffcdc85,0xfffd63d8,0x0005803e,0xfffa427c,0xfff93ce6,0xfffa6972,0x0001b7ba,0x00038689,0xffff742e,0x00003b88,0xfffe7b67,0x00027f36,0xfff9e0f4, -0xfff6ffb7,0xffef0865,0xfffb4cb8,0xfffc9031,0xffeacb60,0xfffcc781,0xfff9e21e,0xffe5e9d1,0xffea596a,0xffeb4008,0xfff69b3f,0xffe883a3,0xffeb514d,0x0000feea,0xfff902be,0xfffe3e9d,0x0000e29f,0x0005b1df,0x00083822,0x000c6ff7,0xfffc7c42,0xfff45ead,0xfff2eb07,0xfff325cf,0xfffbd72d, -0x00139873,0xfff8ed54,0xfff5267c,0xfffbbe49,0x000d7059,0x000ed967,0xfffeb655,0xffffb337,0x000c61ac,0x00159c03,0x0001cc3f,0xfff8f6e2,0xffe8ab07,0x000117d3,0xfffc9ed5,0xffd65f7e,0xffead62b,0xffe9c897,0xffd2ef7a,0xffe1a035,0xffdce94e,0xffe9c68d,0xffd6964f,0xffd2f5d7,0x0000cd41, -0xffefd7c8,0xfff8eb60,0xfffe6d08,0x0004a3c0,0x000bf861,0x001ab753,0x0003eee4,0xfffe0b36,0xfffc1d99,0xffffeaef,0x0001d19e,0x0027e642,0xffef89a9,0xffefe578,0x00000bf8,0x0021f68f,0x00283dd2,0x000daa9c,0x0013cd4d,0xfff9f613,0x0002e467,0xfff064f7,0xffdf1edf,0xffca7548,0xfffad5b9, -0xfffa2b0d,0xffe88001,0xfffeb261,0xfffee4be,0x000755e2,0x00034b91,0xffff0ede,0xfff8722a,0xffe957c8,0xffd517f7,0xfff201e3,0xfff3a949,0x000379cf,0x00170a4a,0x0022dc7e,0x002f4720,0x00364ab7,0x00022ddd,0xffdad9b0,0xffcf266a,0xffd6b059,0x0003d678,0x00431528,0xfff9bd2b,0xffe8b2ee, -0x0009ca38,0x003c02b2,0x0035d30b,0xfff75769,0xfff8629e,0x00a1bb76,0x006c7615,0x005c3129,0x00501d99,0x0049dd34,0x00321d3a,0x00117b67,0x0002f580,0x0004813a,0xffffa84e,0xffff10d5,0xfffe25f5,0x0003ba19,0xffff86ec,0x0012a8bf,0x002331b5,0xffeda81c,0xffc42bb4,0xffa8ae74,0xffa43b84, -0xff8fedaf,0xff971192,0xffca6893,0x0005303c,0x005ad75b,0x00b92e7d,0x006eb50f,0x0015c12b,0xffcdc983,0xffd56228,0xffefb509,0x0023b564,0xfffb21a4,0x00311b3d,0x00ac8058,0x00b3cb97,0xfffe0ab4,0x000e1fde,0xffdb7733,0xffe60e75,0x000b2032,0xfff65e05,0xfff70d64,0xfffef7de,0xfffdd981, -0xffffbd9d,0x00008880,0x00001db6,0xfffecc53,0xfffec7ae,0xfff8ede8,0xfff4af01,0x00066767,0xfff06fc0,0xffe8bc8c,0xfff6039e,0x001ebe48,0x003686c5,0x00339814,0xfff5e24e,0xffb086c1,0xff756417,0xff6c083d,0xffc8fbb8,0x006453f3,0x003ae479,0x000ac86a,0xfffffd2d,0xff81f36e,0xff7139b0, -0xffbb35e3,0xffd238df,0x00405f29,0x00af078f,0x0050effa,0x000a4817,0xffd10a6b,0x0002de9c,0x00065840,0x00000ae3,0x00015cf6,0x00002a9d,0xffffe44b,0x00004f5f,0x0000c002,0x00012119,0x00039a03,0x000601a2,0xfffb0a0f,0x000bcb32,0x001444b9,0x001151fc,0xfff57f94,0xffe0fb92,0xffeb6ccd, -0xffef5973,0x0027891f,0x008529c6,0x008f60d5,0x003ac2f2,0xff90a52f,0xffb9e8b9,0x00084b89,0x0081bc12,0x009ae550,0x009d0d8f,0x005d8308,0x002f032b,0xff635de7,0xffe3b3d7,0xff9c9471,0xff4afb2f,0xff4bb413,0xffddb2ef,0xffffd723,0xfffeafd9,0xffff32a5,0xffffc627,0xffffc857,0xffff62ee, -0xfffebe51,0xffff3829,0xfffd35a6,0xfff9d29c,0xfffd4e4d,0x0019d4c0,0x002a5c86,0x002eccfd,0x00204ec8,0x000c6b20,0xfff342f5,0xffdac319,0xffc9d088,0xffcdaa87,0xffcf5aaa,0xffe623b1,0xffe18db8,0x005f6ecf,0x0085071a,0x00875482,0xffb29eaf,0xff3c623b,0xff300aab,0xff4a84ae,0x00374726, -0x00b215ee,0x00e039aa,0x00ceb5df,0x004f4313,0x0023e63c,0xffffdbd1,0x00028298,0x0000a8ed,0x00004602,0x00009e8d,0x00015ca0,0x00022feb,0x0001b23f,0x0001c7a9,0x000dcc72,0x00228b3b,0x00400bf1,0x00420f60,0x00381c4d,0x002e7a6c,0x0025589b,0x0022c8da,0x001d9132,0x001470ee,0x0008cb0c, -0xffe56905,0xffd174b0,0xffc7772b,0xffb31450,0xffa74a87,0xffb4d6a1,0xffd15308,0xffef5e8b,0x0002a4a9,0xfffa7012,0x0010045a,0x0009c0da,0xfff2ff2d,0xffeba3d0,0xffe6736a,0xffecf8f9,0xfff3c0af,0xfffa8ae3,0x000016c2,0xffffddad,0xfffed5b0,0xfffd1ad7,0xfffbafb5,0xfffa444d,0x00004ffa, -0x0005c934,0x000a7dbf,0xfffcaf8b,0xfff05a25,0xffec59f2,0xffe97089,0xffe6099f,0xffe6e9e7,0xffedd9ef,0xffef8c18,0xffedf87e,0xfff25d46,0xfff4578d,0xfff1acac,0xfff76b99,0xfff3c4a0,0xffdebdb1,0xffdf87d8,0xffe0264f,0xfff207d6,0x00040763,0xffc54c71,0xffc29c48,0xffcd687f,0xffd2a4b0, -0xffd99cb9,0xffde095e,0xffe376e5,0xffe7e4cf,0xfff234e7,0xfff820ae,0x00016ff4,0x0000ce90,0x00090a7e,0x000cd832,0x0012a3e9,0x0014029f,0x00195666,0x0013003f,0x000ba6ce,0x0004314d,0x000e37f9,0x001408a2,0x001a0eca,0x002397a6,0x002dd001,0x0038c3aa,0x0030c2b5,0x00284c53,0x001ed0a0, -0x000d44de,0xfffc3f16,0xffee0754,0xffe6b4ea,0xffdcc647,0xffccf048,0xffc97e78,0x00101286,0x000ddc7b,0x00183149,0x0014b240,0x0019f08a,0x001a8e4b,0x001ce311,0x00200425,0x00230f27,0x002774a0,0x002d8ca9,0x003173c4,0x0035ea8e,0x003ac323,0x00331ba2,0x002d39c1,0x002719d1,0x0020e0fc, -0x0017b764,0x00186e69,0x0019a224,0x00185245,0x0017e238,0x00171865,0x001567c6,0x0015a353,0x00158b05,0x0016bdc9,0x00187edd,0x001aa02b,0x001c81fc,0x001b743b,0x0017dfa7,0x0014b702,0x0011daad,0x00117fb4,0x0016d369,0x0013c5ed,0x0015a4a0,0x0015ecbb,0x0015daae,0x001773ee,0x0016cc32, -0x00160541,0x00186f02,0x0019f220,0x001a8bfd,0x001c897b,0x001d6ad5,0x002054d9,0x001ec37c,0x00202b5b,0x00184f8a,0x001ab4c2,0x001b7cc4,0x001e3c56,0x001d4970,0x001dd64d,0x001e37ea,0x001e7855,0x001ed504,0x001eb5fd,0x001eabe3,0x001e0cd3,0x001ccd5d,0x001bb367,0x001aa141,0x001aaf3c, -0x001a34d3,0x001a2ece,0x001a1dd4,0x00182de3,0x00212fc8,0xfff87e23,0xfffd4f78,0xfffe449f,0xfffc2da0,0xfffb2c5e,0xfff961e2,0xfffa1c09,0xfffb2cee,0xfff65e5a,0xfffb20a4,0xfffb5dc9,0xfff8573a,0xfff7d38f,0xfff70fc2,0xfffb6cf9,0xfff33025,0xfff311e8,0xfffec64b,0xfff9bf9e,0xfff92f4c, -0xfff7d83b,0xfffa1e5a,0xfffae82e,0xfffe2cab,0xfff8fe8a,0xfff895cf,0xfffa1a6b,0xfffab60d,0xfffb4da3,0x00012808,0xfff81ab6,0xfff77601,0xfff95671,0xffff3632,0x00009cad,0xfffbf175,0xfffda7cc,0xfffce75e,0x00001024,0xfffb3104,0xfff5e0fa,0xffefe6ba,0xfff9837f,0xfffb14a3,0xffefdf39, -0xfffb594c,0xfff705c5,0xffe6ba72,0xffe429f2,0xffe5a44b,0xfff88e88,0xffe67499,0xffe895a2,0xffff9e4c,0xfff5d39c,0xfffb0215,0xfffa25c4,0xffff6463,0x00008bdd,0x00037364,0xfff0105a,0xffe96df0,0xffee0491,0xfff27c65,0xfffb7e55,0x000c20ea,0xfff6d5a5,0xfff48672,0xfffcbf6b,0x000a3b29, -0x0009eb1e,0xfff8f6ec,0xfffcfdab,0x000a495c,0x001252ef,0x00012def,0xfff74217,0xffeb1c03,0xfffe5eb3,0xfffc3618,0xffe4ce26,0xfff1441e,0xfff1ed3b,0xffe3e50e,0xffe7a98d,0xffe1215e,0xfff20ec2,0xffd6faea,0xffd1d19c,0x00012061,0xffedb8d9,0xfff4e207,0xfff5f564,0xfffe2eba,0x0003996e, -0x00111d8f,0xfff39243,0xffefea1d,0xfff8916e,0x00010882,0x0003b0fd,0x001bf086,0xfff072c8,0xfff2b3ad,0x0005f709,0x001f403b,0x002304ff,0x0006a654,0x00113e61,0xfffac809,0x00030aed,0xfff4aa49,0xffe3bb7a,0xffd701ed,0xfffc6a37,0xfffd0572,0xfff8e002,0x00028234,0x00036a78,0x0007571b, -0x00086667,0x0002ab3f,0x000042d6,0xfff28e19,0xffda59ce,0xfff400a8,0xffee304b,0xfff9712d,0x0005f3f1,0x00134140,0x001bd191,0x001de945,0xffdd982e,0xffbb9671,0xffc5ed37,0xffdc2e84,0x00072399,0x002e6370,0xfff7a201,0xffeea34a,0x0013904b,0x0037574a,0x002aa46e,0xffeadb85,0xfff545ae, -0x008cca10,0x00549e72,0x0050780c,0x003e9b0a,0x0033f23d,0x001e9e5e,0x0004e410,0x0000fd3a,0x0000b562,0xfffe108d,0xfffd77f8,0xfffc7ec0,0xffffe7de,0xffff5f44,0x0009260c,0x001b1f5b,0x0000fc84,0xffd82f38,0xffb8435c,0xffb2df96,0xffa078fe,0xffac7a72,0xffe87e5f,0x002c34df,0x007ed8ae, -0x00c7e35b,0x007845ac,0x001eb42c,0xffe2b541,0xffe1eb04,0xfff60d34,0x0025b48d,0xfffe18c1,0x00330e65,0x00ae5bfc,0x00a94df2,0xfffda028,0x0019dd6d,0xffeb2431,0xffee1784,0x00052648,0xfffd9558,0xfffadbbb,0x00005695,0xffff7fe9,0x0000f826,0x00015297,0x00015d77,0x00005663,0xffffa110, -0xfffba556,0xfff5f13e,0x0002ffe6,0xfff43efe,0xffe82581,0xffeadb06,0x0011d012,0x00286af4,0x00260add,0xffebbe95,0xffa807a7,0xff715deb,0xff7fbf9f,0xffe48b06,0x00770e98,0x00389b72,0xfffe6e6f,0xffeaa9b2,0xff7a6a9d,0xff737565,0xffb97956,0xffd41d91,0x00480c6f,0x00ac2f59,0x006d8744, -0x0015c53b,0xffdd30cf,0x0006f64a,0x0002d0c2,0xffff978f,0x00003670,0xffff4d0c,0xffff3cd4,0xffff5a7a,0xffffcd10,0x00007d89,0x0001d247,0x0005b4c4,0x00011a39,0x000e4f87,0x001aa8bf,0x001be3e6,0xfffdb81a,0xffea65cb,0xfff2b516,0xfffb9e80,0x00385b55,0x009a7c0a,0x007b19fa,0x001a489d, -0xff7cf998,0xffcddd74,0x002587e8,0x0078ab17,0x009e172c,0x008f4b54,0x00227d99,0x00248633,0xff3a43be,0xff510d4b,0xff9564dc,0xff8131fb,0xff75ff3c,0xffeb81f8,0x00015e40,0xffff5057,0x0000a040,0x0000aa17,0x0000a97d,0x00008037,0xffffdc9e,0xffffde28,0xfffe8ba4,0xfffc3610,0xfff66c70, -0x000c607f,0x001fa75b,0x001fc0d7,0x000ef64d,0xfffe4b57,0xffe717e9,0xffd1ac95,0xffbd80bc,0xffbf3441,0xffc44be9,0xffe64b7e,0xffe7922b,0x0075cf12,0x00835c9e,0x004270a4,0xff8867f5,0xff3195da,0xff4107d7,0xff522726,0x00289095,0x00b48188,0x00dad685,0x00b7f0d6,0x00401ab3,0x0020c50c, -0xfffd1b80,0x0000e1b6,0xfffe9b9f,0xfffebb60,0xffff0c28,0xffff7c7d,0x0000168e,0x00011ec4,0xffff5c8a,0x0007d1b5,0x0019e960,0x003c8705,0x0048a670,0x00403b7b,0x0036c656,0x002ac122,0x0021ec8f,0x00190e41,0x000e7b80,0x00025a35,0xffe00697,0xffcc1209,0xffc2c7c6,0xffb4eea0,0xffb126bb, -0xffc47c3a,0xffd6409d,0xffe19a26,0xffed2935,0xffdb85c0,0x00192634,0x00161318,0xffffe191,0xfffc0fbf,0xfff33606,0xfff930b1,0xfffc552c,0x0001719e,0x00036f1b,0x00037bfd,0x0001da2f,0x00017e30,0xffff9eb2,0xfffdf330,0xffff9402,0x0004eeff,0x000d6c64,0x0005029d,0xfff9d19f,0xfff38f90, -0xffeec390,0xffe892b9,0xffe3c6ac,0xffe24edd,0xffdde9bb,0xffd98ba8,0xffe07714,0xffe589f1,0xffe60382,0xffec5c64,0xffecbcf7,0xffe28a5c,0xffebebb0,0xfff3039a,0x0004da58,0x00135b47,0xffcb5d9a,0xffc55dec,0xffcb306f,0xffce0a04,0xffd2a1ce,0xffd82a9d,0xffdfea0e,0xffe69fd7,0xffef489b, -0xfff35ac1,0xfffa4741,0xfff8d6fc,0xffff87e4,0x0001a8e3,0x00099c28,0x000d50fd,0x0014e7ee,0x00122699,0x000e8a9e,0x000a8033,0x0010bf37,0x0014c462,0x00191647,0x0021c9da,0x002ab55c,0x00338b32,0x0027eaec,0x001bf327,0x000f3586,0x0000e901,0xfff3240a,0xffe7140c,0xffe3d657,0xffde013f, -0xffd3bdb1,0xffced060,0x0001cd64,0xfffd8a47,0x000831ca,0x0007e6f6,0x000e6b8a,0x00106ed7,0x00124fa1,0x00159f99,0x00181bf8,0x001d5301,0x00246faa,0x0028e04c,0x002e8478,0x00348c12,0x0031941e,0x002e2040,0x002ad47b,0x0026ecb6,0x0020780c,0x0021cf21,0x0022bf86,0x002221de,0x0021a658, -0x002133e7,0x001fc375,0x0020f7ce,0x001e6d6b,0x001e20b2,0x001dcf08,0x001d6549,0x001c29a0,0x0018586a,0x0012d570,0x000d5ae4,0x0008d60c,0x0005c28a,0x0018cb5c,0x0014fbdc,0x0017b8dc,0x00180935,0x0017eeb4,0x0019c5dd,0x001a34b7,0x001ad604,0x001e137c,0x00200c85,0x0020f88e,0x00234ad0, -0x00246eb6,0x0026e486,0x0024841a,0x0025bcaa,0x00202e16,0x002280cc,0x0023c04f,0x00262ec0,0x0025bb85,0x00266b48,0x00270c4f,0x002774a5,0x0027d85c,0x00281c34,0x0026fb23,0x00258776,0x00238653,0x002190c6,0x001fe872,0x001f4059,0x001e48ce,0x001d9225,0x001c8987,0x001a6df4,0x0029db38, -0xfff50969,0xfffa51bf,0xfffae80f,0xfff90efc,0xfff7f997,0xfff69b33,0xfff6a934,0xfff843d2,0xfff63b26,0xfff93325,0xfff941fc,0xfff79af2,0xfff505e0,0xfff4268f,0xfffa45b6,0xfff0486c,0xffeff553,0xfffc0163,0xfff69b75,0xfff5e11f,0xfff3e787,0xfff68af6,0xfff70820,0xfff97f4e,0xfff3c2e2, -0xfff3af21,0xfff68f5b,0xfff83d09,0xfff8ddef,0xfffbc193,0xfff59199,0xfff58cdc,0xfff88be8,0xfffcab36,0xfffd62e3,0xfff7affc,0xfffa84f1,0xfffa9ef9,0xfffca547,0xfff8a498,0xfff3f97c,0xffef0444,0xfff5b4cb,0xfff820a9,0xfff3c32f,0xfff97f4a,0xfff4b31d,0xffe6d900,0xffde8c23,0xffe07c3e, -0xfff7f45c,0xffe3dce6,0xffe5d434,0xfffd1332,0xfff22a3b,0xfff666bb,0xfff393cd,0xfff94d5f,0xfff8d402,0xfff94d77,0xffe3d459,0xffdefcd9,0xffe8ea6a,0xfff226b7,0xfffae72a,0x0002b899,0xfff45120,0xfff42345,0xfffeafa2,0x00076421,0x00053217,0xfff2ba1e,0xfff9c80b,0x0008618e,0x000deec3, -0xfffe8c28,0xfff48516,0xffeb61f8,0xfff9eb30,0xfffaf761,0xfff25764,0xfff739f5,0xfff8fe6b,0xfff2d06e,0xfff14dd5,0xffe77c43,0xfff8f214,0xffda268e,0xffd2d762,0xfffef8ae,0xffeb5452,0xfff004c3,0xffed9d1b,0xfff81a84,0xfffad419,0x0004e26b,0xffe2dc00,0xffe1b81c,0xfff3fb75,0x00028605, -0x0005ea84,0x000d1aad,0xfff11b51,0xfff64a58,0x000e6c9b,0x001dff30,0x001e3997,0xfffdfdfc,0x000de4e4,0xfffcb01f,0x000183dd,0xfff57637,0xffe81ca7,0xffe15078,0xfffcbc1f,0xffff2a0d,0x000050cd,0x0002ba2a,0x00029324,0x0004c108,0x0006ebe6,0x0004d329,0x00038a2f,0xfffc307e,0xffe37cd0, -0xfff549c3,0xffea82f3,0xfff06191,0xfff6a731,0x00056a14,0x0008dfd2,0x00031c46,0xffbae8b7,0xffa02660,0xffbf2861,0xffe533c9,0x000b6e4d,0x0016160c,0xfff51e36,0xfff60471,0x001fcfd7,0x003336ca,0x001fb456,0xffde447d,0xfff2e729,0x007e6237,0x004125ce,0x003ee931,0x002b00e5,0x001e8ee9, -0x000d712c,0xffff1b82,0x00007e58,0xfffeda88,0xfffedbf3,0xfffdb87a,0xfffcfe27,0xfffe27ff,0xfffeafd0,0x0002ecb6,0x000f8a47,0x000d9e57,0xffe8ca3e,0xffc63d72,0xffbde84e,0xffae7325,0xffbe30b5,0xfffdf6b0,0x004b06cd,0x00964587,0x00c5094d,0x0076d235,0x002209ca,0xfff3c922,0xffec4f63, -0xffff1d98,0x0030c520,0x0010c4f3,0x00423ef3,0x00b25d97,0x009e44b1,0x001510ad,0x0022d12e,0xfff27196,0xfff72716,0x0003ec93,0xfffe75ee,0xfffd64f1,0x00017371,0xffffeeb4,0x00010392,0x00011a60,0x000181ca,0x0000f7bd,0x000086d5,0xfffea760,0xfff83af5,0xffff7fe7,0xfff8dbf6,0xffeb9c0e, -0xffe5b88b,0x000a3a68,0x001ce7da,0x0017f124,0xffdfc00f,0xff9e632a,0xff6f2816,0xff924b87,0xfff779ba,0x0077d7a9,0x0030b1b4,0xfff201c9,0xffd833d2,0xff7f9213,0xff88dfae,0xffd361d1,0xffeff2f1,0x0067c1b9,0x00b2725e,0x007e53dd,0x001bca39,0xffe1a417,0x000c4135,0xfffe4779,0x00003414, -0xffff30e1,0xffff7125,0xffff1266,0xffff1fac,0xffff6101,0xffffadc9,0x0000e46c,0x00035f73,0x000332ef,0x000bdfe0,0x0019944c,0x0020a9bf,0x00063b23,0xfff6f70f,0xfffd41b7,0x000e696b,0x004aec39,0x00a49603,0x0061ebb7,0xfffa72ca,0xff704ddb,0xffe3bbb8,0x00467d06,0x007cb290,0x00ab8279, -0x008a0988,0xfffb4118,0x002ba5f7,0xff3be161,0xfee4fa22,0xff92a440,0xffb83557,0xffa55150,0xfffc076e,0xffff94c2,0x000157a3,0x00009498,0x000137c0,0x0000def7,0x0001006c,0x0000883a,0x00005d69,0xffff82d3,0xffff572e,0xfff48b8e,0xffff8997,0x00103a97,0x000de53e,0xfffd6bef,0xfff11794, -0xffdd4af9,0xffcb04e0,0xffb7f47c,0xffbbd525,0xffc4712f,0xfff2ea4f,0x00015ef7,0x008e2681,0x007f78f0,0x0000016d,0xff7a7c30,0xff488958,0xff602ac9,0xff7acb84,0x001a6077,0x00ad0db6,0x00c41f5d,0x0093b2ac,0x0034a9d5,0x0016d9aa,0xfff9e730,0x0000463d,0xfffd2569,0xfffe6d06,0xfffe2175, -0xfffea907,0xfffec19d,0x000021c8,0xfffeee7e,0x0001cd5a,0x000fe862,0x0031e22a,0x004670d5,0x00421992,0x003a0e0f,0x002e6608,0x00242a2e,0x0018d888,0x000ea697,0x00034b7c,0xffe5e765,0xffd1d40b,0xffc68f49,0xffba331f,0xffbc6a6f,0xffd4b2d0,0xffd903b0,0xffd48469,0xffd93d21,0xffc75117, -0x00252c5e,0x00264773,0x000f6b75,0x000b3e5b,0xffffb2aa,0x000403ce,0x0002070e,0x00050785,0x0004c3c7,0x00046fa9,0x00035ad5,0x00035ece,0x0002254d,0x000115a6,0xffffc104,0x00043024,0x000da8d6,0x000b3d25,0x0001e4c6,0xfff934b3,0xfff40253,0xffec2789,0xffe571c8,0xffde8d6d,0xffd601f0, -0xffce6447,0xffd78ce7,0xffdd7147,0xffde1137,0xffe2f783,0xffe508f8,0xffe3d757,0xfff43537,0x0003c4da,0x0017a201,0x0024ddac,0xffd4f451,0xffcdf869,0xffd04842,0xffd24564,0xffd47fef,0xffda1e6b,0xffe314f1,0xffea9916,0xfff06f66,0xfff3b375,0xfff7ec18,0xfff61da5,0xfff9a580,0xfffaafd1, -0x000171d9,0x00061128,0x000e1222,0x000f1d88,0x000f4054,0x001156ab,0x001555ae,0x0016ef51,0x00198075,0x0020a231,0x002823a1,0x002ee575,0x0021b6d8,0x001478ee,0x0006f618,0xfffbf01f,0xfff1a874,0xffe7af1e,0xffe6910b,0xffe27564,0xffdb702a,0xffd680e0,0xfff5052c,0xffeebc85,0xfff96e99, -0xfff9edd1,0x00014500,0x0003f2da,0x0004bd2f,0x0007d49a,0x0009e3a8,0x000f256b,0x0015d0cb,0x001afde7,0x00215ef8,0x0027d710,0x0029a693,0x0029ac02,0x0029aeed,0x002931fc,0x0026376c,0x00281e41,0x00288d5e,0x0028a1ef,0x00286dd2,0x00283abd,0x0026eb50,0x0028abe7,0x002446c8,0x00228f29, -0x002062bf,0x001da2b1,0x0019c382,0x00141043,0x000d23eb,0x00066519,0x0000ee75,0xfffb80b4,0x0017cfda,0x001340cb,0x00182229,0x00190762,0x001a0e99,0x00196c0b,0x001b9f1a,0x001e0428,0x0021b6fa,0x0023fc16,0x00257a1d,0x0027ac32,0x0028ff54,0x002af681,0x0027c29a,0x0028159b,0x0026b2a3, -0x0027a7bf,0x0028baf1,0x0029df4b,0x002a0378,0x002ad1a2,0x002b925a,0x002c318d,0x002cc197,0x002d7fb1,0x002b4c09,0x002913d1,0x00266cf4,0x0023e0ef,0x0021c523,0x00206e9a,0x001f1155,0x001daaeb,0x001bbf2a,0x001984ef,0x002d508f,0xfff2296e,0xfff89ff4,0xfff8b116,0xfff64f94,0xfff4e733, -0xfff3ab38,0xfff38a96,0xfff53aa3,0xfff66d17,0xfff76239,0xfff6f3e7,0xfff5e60a,0xfff2053c,0xfff1abb4,0xfff8df8b,0xffeddfc7,0xffed48bf,0xfff8807b,0xfff3145d,0xfff2686a,0xfff0b1db,0xfff37435,0xfff3a90c,0xfff5016f,0xffef6036,0xffef9f39,0xfff36791,0xfff623e3,0xfff68b0c,0xfff5db3b, -0xfff2d8ee,0xfff38d76,0xfff7d3ee,0xfffa331f,0xfffa9c77,0xfff4ec70,0xfff8be00,0xfffae03f,0xfffb105e,0xfff67bf2,0xfff2daf9,0xffef350a,0xfff3036b,0xfff60b56,0xfff82994,0xfff8af24,0xfff41cce,0xffea301a,0xffdcdd8d,0xffdd3353,0xfff62f39,0xffe25905,0xffe4b317,0xfffa5fe8,0xffef40a9, -0xfff1e79c,0xffedca36,0xfff3d1e0,0xfff19aae,0xffef0c1b,0xffd9b173,0xffd6f4c3,0xffe4a4bf,0xfff233f1,0xfff9a26b,0xfff73cc7,0xfff01edd,0xfff2332a,0xffff9e38,0x000374c4,0x00009b68,0xffef5f83,0xfff92f37,0x000b1c3c,0x000c32e7,0xfffe2f56,0xfff4ea88,0xffed9495,0xfff6eada,0xfffac454, -0xfffc8a97,0xfffbfb2d,0xfffe1bcf,0xfffb2cf3,0xfffa2ce4,0xfff18c5a,0xfffdaa64,0xffe0b876,0xffd675da,0xfffbca49,0xffe999ae,0xffeb7ca7,0xffe5ec19,0xfff27ff4,0xfff25ed1,0xfff7737f,0xffd4b031,0xffd618e6,0xffeed327,0x0002d819,0x0005388c,0xfff91868,0xffedcf2b,0xfff63e05,0x00146b47, -0x0019f3a1,0x00193309,0xfffa5a96,0x000ef011,0x0003a2dc,0x00036cde,0xfff84e14,0xffedc31f,0xffeafc85,0xfffd80d8,0x0000ec3e,0x00011ae1,0x0001341e,0x00019c81,0x000255df,0x000499d5,0x00044f23,0x00033344,0x0003de13,0xffee9475,0xfff5f1e6,0xffe9117c,0xffe995c7,0xffe8e537,0xfff8465b, -0xfff5db1c,0xffe6601a,0xff9d46e7,0xff8b3a8c,0xffb9c1e6,0xffed402f,0x000ae90f,0xfff64ffa,0xffeb25d3,0xfff6bed6,0x002729df,0x002a2ab2,0x00140e56,0xffd9483a,0xfff6aae0,0x0071c30d,0x0038645b,0x00374d5b,0x001ec3ad,0x00108ff4,0x00041cc5,0xffff09d2,0xffff9598,0xffff53c1,0xffff2830, -0xfffec4fb,0xfffd9e97,0xfffe50c6,0xfffdafec,0x0000d490,0x0006542d,0x0011303f,0xfff5593c,0xffd212d5,0xffc60b2a,0xffbc76ac,0xffd0fc59,0x001187de,0x00679db8,0x00a6cb40,0x00b5fa58,0x006a3840,0x001d8039,0xfffe1905,0xfff539f4,0x00066f5f,0x0036a119,0x00208006,0x004ffa7e,0x00b65d3b, -0x0094fb9c,0x001ffa38,0x002df328,0x00056388,0x0003a0e4,0x0003fb32,0xfffdf985,0xffff8cf7,0x000103d2,0x000026e3,0x0000b597,0x0000ba40,0x00013213,0x000115da,0x0000e394,0xffffe2ae,0xfffbc390,0xfffd0add,0xfffd53ba,0xfff338a5,0xffe61b5d,0x0003a58a,0x000f1e86,0x0004828a,0xffce8da4, -0xff938f10,0xff715fd5,0xffa7b49d,0x00091f2b,0x00726d56,0x002e8ec7,0xfff04360,0xffceeec5,0xff890ec2,0xff9a7557,0xffe1429a,0x00029b5a,0x005fe00f,0x00ace793,0x008d73fc,0x0019d2a4,0xffec96ea,0x000aa20d,0xfffc177f,0x0000cf6e,0xfffedeab,0xffffaf19,0xffff3047,0xffff417b,0xffff297f, -0xffff7891,0xffffed49,0x00018ca5,0x00038237,0x00067e0d,0x0012d55a,0x001e8bc8,0x000c618a,0x0004c499,0x000b6ae4,0x002952bc,0x0061359c,0x00a5d2b6,0x004a27c2,0xffe36c44,0xff73207e,0xfffea6d0,0x0065d800,0x007cb1f8,0x00aca633,0x00758109,0xffc9822d,0x0016dccb,0xff3f3479,0xfe8da046, -0xff8b74cb,0xffdb47f6,0xffd3b05f,0x0003d0f6,0xfffef4a1,0x0002197c,0x0000619f,0x00013dc0,0x0000c1ad,0x000113b4,0x0000c68f,0x0000e733,0xffffa3f8,0x0001469c,0xfff78c35,0xfff5a6e5,0xffffab63,0xfffba014,0xffee5414,0xffe6264d,0xffd56246,0xffc6f7d4,0xffb71255,0xffbe07c6,0xffc4d2d1, -0xfffd996a,0x0021f8fe,0x00972a00,0x006b3110,0xffbc2709,0xff750e35,0xff6a0c41,0xff84fff3,0xffa25d92,0x0000d8f1,0x007de2b1,0x008bde1e,0x005f0455,0x0026905a,0x00071d40,0xfffa3cd3,0xffff757c,0xfffd693f,0xfffe781c,0xfffe3429,0xfffe6581,0xfffe6783,0xfffef638,0xffff456b,0xfffed8ce, -0x00073ac5,0x002561b7,0x003d19e4,0x00405bf5,0x003c74a0,0x0032a75d,0x002877d8,0x0017fb50,0x000b80de,0xffff1e9a,0xffe630fb,0xffd19436,0xffc4b91f,0xffbd6d15,0xffc77eea,0xffe26e4e,0xffd82c32,0xffc47694,0xffc05402,0xffb52a43,0x002b3f2e,0x002ecc4e,0x001ba9bc,0x001547e2,0x0009f37b, -0x000a683d,0x00044cf6,0x00053b6c,0x0003faad,0x0003f758,0x0003365c,0x0003a6ad,0x0002eada,0x0002d4da,0x0000f28f,0x00031a6b,0x000c2822,0x000fef8a,0x000a1033,0x0001c196,0xfffafdd1,0xfff1e670,0xffe9b76e,0xffdfaae8,0xffd41d44,0xffc81496,0xffd19ff2,0xffd70c34,0xffd6faa2,0xffda414d, -0xffdd16ac,0xffe56da6,0xfff8d6bb,0x000db247,0x00209707,0x002e85fb,0xffdbc1f9,0xffd5cdf4,0xffd670f6,0xffd7de67,0xffd8664b,0xffdf453d,0xffe936ba,0xfff15c9d,0xfff59cf6,0xfff7a688,0xfff922df,0xfff777ea,0xfff8d3dc,0xfff7f3f1,0xfffbe3e7,0x00003ed8,0x0007b071,0x000b4223,0x000fa1ea, -0x0014c3cb,0x001419df,0x00141fb5,0x00140369,0x00189c12,0x001d7132,0x00216fe6,0x00149367,0x0007d89c,0xfffb6f43,0xfff4bcd9,0xffeeb11a,0xffe75583,0xffe7869a,0xffe4914e,0xffdf8e41,0xffdb6872,0xffe9f7b6,0xffe23a06,0xffec3074,0xffed012b,0xfff462af,0xfff73414,0xfff6fa5b,0xfff99d1e, -0xfffb08a6,0x00000731,0x00066c97,0x000b226b,0x0011575c,0x0017d3ab,0x001dee35,0x00205eb2,0x0023081c,0x0025a4a1,0x00286896,0x0028ac11,0x0028810f,0x002922c2,0x0028ff1c,0x002917a8,0x002812fb,0x002a0805,0x0023fe01,0x0020f9d4,0x001d3c9b,0x00187f57,0x00129033,0x000bc7b7,0x000484ad, -0xfffda992,0xfff85007,0xfff1b641,0x0012457a,0x000daa41,0x00137271,0x00152aec,0x001849a9,0x00138da9,0x0017c057,0x001c3246,0x0020047e,0x0022586e,0x002413ae,0x00265da5,0x00280e73,0x00299d00,0x0024d2d3,0x002372d4,0x0028f0b8,0x0026f50b,0x00270c35,0x00262ef0,0x0027278a,0x0027a84a, -0x002851d6,0x0028d73d,0x002940be,0x002a23ac,0x00275c4e,0x0024c7a1,0x0021e469,0x001f33cf,0x001d073d,0x001b4d37,0x0019ea85,0x00182dd7,0x0015cfe1,0x0013b5ac,0x00290b07,0xfff0d247,0xfff73ff1,0xfff680a3,0xfff519b2,0xfff3c351,0xfff25512,0xfff24c3d,0xfff40dda,0xfff70b93,0xfff5fdd6, -0xfff50548,0xfff471f4,0xffef418a,0xffef662d,0xfff771be,0xffedffca,0xffed47cf,0xfff5b898,0xfff17bc4,0xfff1091c,0xffef27d9,0xfff1b9fb,0xfff1ba3e,0xfff1efcd,0xffed2887,0xffedcb56,0xfff2190c,0xfff5bdce,0xfff5ff78,0xfff22425,0xfff2653d,0xfff3bcf6,0xfff90fba,0xfff8f3b3,0xfff892f1, -0xfff29cd6,0xfff72858,0xfff95996,0xfff89bb3,0xfff66adf,0xfff259e2,0xfff0c392,0xfff14d67,0xfff4e609,0xfffcea2f,0xfff9a959,0xfff6079b,0xffef0de3,0xffe0be37,0xffdf6cbc,0xfff4cd26,0xffe1c0e8,0xffe4cc63,0xfff8a5dd,0xffee5a00,0xffef2f57,0xffea7a73,0xfff004f4,0xffec6aad,0xffe736ee, -0xffd46875,0xffd417f9,0xffe3ed2d,0xfff485e8,0xfffa677e,0xffef55a9,0xfff02370,0xfff46ec6,0x0003bafe,0x00011c94,0xfffc5f23,0xffebb4a5,0xfff73fe1,0x0007db64,0x00071521,0xfffd9822,0xfff4c8bf,0xffeffb7c,0xfff59c3e,0xfffc1b3d,0x0001f121,0xfffe7c21,0x0000cb8e,0x00007b5f,0x0001f393, -0xfff9f0ef,0x0001f3a0,0xffeb2376,0xffde0bf6,0xfff888c9,0xffe990fb,0xffe90284,0xffe14e8b,0xffee9f11,0xffebf685,0xffec2f9a,0xffcd083f,0xffd145a8,0xffedbd01,0x0005b555,0x00075b4d,0xffeb1fc2,0xfff0dfa8,0xfffc14a1,0x001e5fb6,0x00169c6a,0x00121e6f,0xfff3136e,0x000a8ee5,0x00015f15, -0x000050e4,0xfff9b957,0xfff15228,0xfff275e7,0xffffb45a,0x00016212,0xffffa36a,0x00006ca8,0x00004ec7,0xffffaf76,0x0000c12d,0x000272e0,0x0000c548,0x000735fa,0xfff941d9,0xfff79022,0xffe986cf,0xffe4eeae,0xffdf284a,0xffee2f51,0xffe5fd30,0xffce3592,0xff8c1e24,0xff842e83,0xffbc253d, -0xfff7c0ce,0x000bb11a,0xffddda70,0xffea1050,0x00007ffd,0x0034b39d,0x00231ceb,0x000714ea,0xffd0f9a8,0xfff406d9,0x0053e5d6,0x0027bf54,0x002a4f32,0x001383f2,0x00060f21,0x00000617,0xffff99cb,0xffffd745,0xffffe6ba,0xffffbdc7,0x000024a6,0xffff43d2,0xffff522f,0xfffe617f,0xffff0d1a, -0x00007762,0x000ec2e4,0xffffbc27,0xffdd8ac7,0xffce426f,0xffcb537a,0xffe3e132,0x0022af06,0x007dbd29,0x00af4eb5,0x00a250cb,0x0060309d,0x0021fe60,0x00135b7b,0x0008159b,0x0013d92b,0x003b701d,0x002c9bb4,0x0053e931,0x00a63f6b,0x0076cefe,0x0025a58d,0x002997a3,0x000c3316,0x000adb38, -0x00015a40,0xfffe864d,0x0000c528,0x00004345,0x00001be2,0x00003548,0x00000ffd,0x00005cd3,0x00009542,0x0000a6d4,0x000113b9,0xfffe63fb,0xfffb8818,0x00008888,0xfffb142c,0xffecedb1,0x0001e90c,0x0004e55b,0xfff5331f,0xffc4edf5,0xff97417e,0xff87e8cc,0xffcb4b60,0x00220bac,0x006f838d, -0x002fdce4,0xfff1fd78,0xffc76c4b,0xff9b11bb,0xffb4f272,0xfff9415a,0x00157b95,0x0063dc54,0x009f0da5,0x008285d5,0x0012c99d,0xfff3ae65,0x000658bc,0xfffcc4c3,0x0000bca0,0xffff3e83,0xfffff2d8,0xffffb82e,0xffffb251,0xffff7fa7,0xffff6d06,0xffff8423,0x00004dac,0x0002d75d,0x00027a8e, -0x000b15c0,0x001c29d4,0x00164b78,0x001721db,0x001f0695,0x00476831,0x007436b0,0x009a58a3,0x00314541,0xffd16fe9,0xff7def13,0x000f3ff0,0x0070f317,0x006f1408,0x00a11f9a,0x006138ae,0xffba5479,0x00136096,0xff66a0bf,0xfe7b0946,0xff8514c7,0xfff1f178,0xfff1b955,0x00031fdc,0x00005592, -0x000115a0,0x00006fa6,0x00008ffe,0x00005643,0x00008dea,0x0000a55e,0x0000da3c,0x0000571a,0x00013017,0xfffcf2b2,0xfff21cdf,0xfff2f681,0xffed3f9c,0xffe20100,0xffdcde87,0xffcf6ea7,0xffc2fb4e,0xffb68d3c,0xffc07dc8,0xffc52567,0x0002b7cc,0x003a6b69,0x0088279f,0x0046feda,0xff89af00, -0xff82fc6a,0xff9a206b,0xffb557b7,0xffd50c43,0xfff02032,0x00417489,0x0047c90d,0x002dd9c5,0x00189eb7,0xfff9e871,0xfffe7d87,0xfffe78b6,0xfffea330,0xffff1b23,0xffff36bc,0xffff008a,0xfffec2ee,0xfffe834c,0xffff4682,0xfffde3c8,0x000125d2,0x001a63c8,0x00342041,0x003df2db,0x003b8343, -0x0032e0ef,0x00271c4a,0x0012d92f,0x00044b46,0xfff792d4,0xffe408d6,0xffd02619,0xffc36308,0xffbf548a,0xffcf8e23,0xffebf5ec,0xffdb1fed,0xffc173de,0xffb75310,0xffb768e1,0x0033a7c3,0x003960f7,0x002451d1,0x0019ab9d,0x000f8ed7,0x00096e86,0x0003d35a,0x00039bb4,0x0002af96,0x0001e21b, -0x00017805,0x00021786,0x000289f3,0x00032319,0x00021f87,0x0002a6ff,0x0009ac53,0x00128690,0x0011583a,0x0009fd52,0x000114aa,0xfff675e0,0xffeb6aaf,0xffe1379a,0xffd4a441,0xffc567cf,0xffcebb9f,0xffd2bae0,0xffd11ce6,0xffd49c46,0xffd91e4e,0xffe8913b,0xfffb93a2,0x00141520,0x0027b6fd, -0x00372dca,0xffe441cd,0xffdf72f0,0xffdec59e,0xffe0ba09,0xffdfb9a9,0xffe8006c,0xfff0a8e7,0xfff8b487,0xfffa90ec,0xfffce2db,0xfffd6773,0xfffc0626,0xfffa40ff,0xfff8ecfb,0xfff82860,0xfffa7310,0xffffa33b,0x00032ac2,0x000930dd,0x000ff8b0,0x000c779c,0x000b828d,0x0009cf56,0x000b663b, -0x000d1fcc,0x000ddeae,0x0004de46,0xfffbd72f,0xfff3a3b5,0xfff0a90a,0xffee0a54,0xffe9118e,0xffea98e8,0xffe8ae94,0xffe559fb,0xffe234f8,0xffe5e59a,0xffddf5e1,0xffe2ed67,0xffe608e4,0xffeb67ff,0xffedb41e,0xffedbd6d,0xffefe68f,0xfff1ff6b,0xfff64bc1,0xfffaed21,0xffff51ae,0x0004827d, -0x0009fd11,0x0011ab8e,0x001617d4,0x001a940a,0x001f5f19,0x00252b38,0x00264744,0x002541cd,0x00256e04,0x0024e1cc,0x0024a19b,0x0023aaaf,0x0024f9b7,0x001f1451,0x001ba34e,0x00179428,0x00123622,0x000c05a6,0x0005a5f0,0xfffede72,0xfff8c612,0xfff44ac7,0xffeda2cd,0x000beaf6,0x00086ff2, -0x000d5a4d,0x000e93a7,0x00118b3c,0x000cfbaf,0x0010c994,0x00148d3e,0x0017c6ce,0x0019e3af,0x001c0159,0x001e2ca5,0x002044d8,0x0021d67a,0x001ddc0f,0x001c22d7,0x0023aa17,0x0021124e,0x0020ebf9,0x001fcdf9,0x0020ae5c,0x0020eb53,0x00214d2a,0x00219502,0x0021b19b,0x00224f7d,0x001f84f8, -0x001d00db,0x001a4f4e,0x0017ffb3,0x00161f48,0x00147fd8,0x00133610,0x001168f3,0x000ef03a,0x000d2813,0x002106e6,0xfff08f82,0xfff68ac4,0xfff56764,0xfff3916a,0xfff2243b,0xfff1298d,0xfff17456,0xfff2d3ac,0xfff7d314,0xfff51566,0xfff3ee59,0xfff39497,0xffedb577,0xffedc83c,0xfff5e373, -0xffee7213,0xffee1c6a,0xfff3a384,0xfff0334a,0xfff031e8,0xffef5c5c,0xfff1426a,0xfff114ea,0xfff02ea0,0xffecd96b,0xffedcb51,0xfff203ef,0xfff60671,0xfff5f404,0xffef827f,0xfff26d68,0xfff44908,0xfffa7917,0xfff84745,0xfff75dbf,0xfff1b420,0xfff67946,0xfff8990b,0xfff61dff,0xfff40e67, -0xfff20f0c,0xfff1ad9d,0xfff037d0,0xfff4eb36,0x0000d073,0xfffb6da6,0xfff83a62,0xfff3ef09,0xffe77d56,0xffe51dc3,0xfff4b569,0xffe32209,0xffe5cf5c,0xfff7363d,0xffef3849,0xffedf07e,0xffe9aa94,0xffee3a91,0xffe96a8b,0xffe20fb3,0xffd3c40c,0xffd59bb7,0xffe55aa4,0xfff6ff3d,0xfffaaac3, -0xffe8a930,0xffefd0e8,0xfff5e422,0x0006a756,0xffff1c5c,0xfff9591a,0xffea6f51,0xfff64572,0x00063084,0x0000d6ea,0xfffabc1d,0xfff47a8d,0xfff106c5,0xfff57bb2,0xfffd860b,0x0002a27b,0xffff9842,0x0001f82c,0x000239b8,0x0004b94c,0x00013f3f,0x00039702,0xfff648aa,0xffe84c58,0xfff65d6b, -0xffeb6772,0xffe92e0f,0xffe0d182,0xffed6dfb,0xffe89467,0xffe40a2f,0xffcc4d78,0xffd2e433,0xffeefa38,0x00083897,0x0007dc97,0xffdf9164,0xfff2879b,0xffff295b,0x00246261,0x00123468,0x000c148d,0xffef9984,0x000747d4,0x00016fc2,0xfffa6321,0xfff6ea34,0xfff3b16e,0xfff7368f,0x00022a7c, -0x00015e47,0xffff451a,0xffffebf5,0xffff98ea,0xffff2db3,0xfffeeb01,0xffffdc39,0xffff05c9,0x00061c63,0x00009090,0xfffa2cd8,0xffecbd6c,0xffe427d4,0xffdb785a,0xffe83c82,0xffdaa5b8,0xffbc79cf,0xff885eda,0xff89c74a,0xffc31e33,0x00008d05,0x0009b59e,0xffc94f37,0xffe6f9c8,0x00051507, -0x003ba44a,0x001b5a56,0xfffc9a2a,0xffcece9c,0xfff33174,0x00421126,0x0021cf94,0x001fad20,0x000bfef9,0x0000d8bd,0x00009877,0xfffef076,0x00003fe9,0x00000f6e,0x00001ca1,0x000069be,0x00003915,0x000051ce,0xffff98ad,0xfffe439c,0xfffe9cba,0x0007ec41,0x00069dd3,0xffe925d7,0xffd911d0, -0xffdd59f9,0xfff8acf2,0x0032c7b4,0x008be37a,0x00afc9e1,0x008e8db7,0x00577f9f,0x00286491,0x0023c900,0x0019bbeb,0x001f2568,0x003770a5,0x0035df83,0x005934c1,0x009c797b,0x006126f1,0x002f27a0,0x00288d06,0x00120ddc,0x000bb0a4,0xfffe79bc,0x0000539e,0x00003a97,0x00003693,0xffffda98, -0x00000341,0xffffd0dc,0xffffebc5,0xffffecc5,0x00004ae0,0x0000df98,0x0000a582,0xfffbd7ab,0x0001758d,0x00036c21,0xfff62459,0xffff3f81,0xfff8ca28,0xffe2f924,0xffb714a8,0xff9783d7,0xff99f689,0xffe1d17e,0x0028cfc3,0x00571418,0x00261b19,0xfff13bc9,0xffc6ab86,0xffaf8582,0xffcd8ccb, -0x000e6e33,0x002909a9,0x005231f5,0x0091cf08,0x0077d43a,0x000d21f7,0xfff9b3e5,0x0002c419,0xfffe254c,0x00006f0f,0xffffbcb0,0x00001bf7,0xfffffee6,0x0000002a,0xfffff55d,0xffff9dbb,0xffff9136,0xffff1297,0x0002b482,0xffffe8cb,0x0004ca9a,0x001672f0,0x0019c8ad,0x00224f22,0x002a3d91, -0x0056d4db,0x00732b91,0x0078014d,0x000f24a5,0xffbe24fc,0xff89ea61,0x001621cc,0x006dd63c,0x005ed077,0x00857aa5,0x003f46cb,0xffa47ec8,0x00018408,0xff82e781,0xfe91d2b4,0xff8a801c,0xfffd7b08,0xffff06b2,0x0001185b,0x0000d992,0x0000455e,0x0000215a,0x00000161,0x00001011,0x00001941, -0x00003cd5,0x000073ca,0x0000c731,0x000053cb,0x0001619c,0xfff31b5b,0xffea60fd,0xffdff9f3,0xffd6c0c8,0xffd395c8,0xffc834a4,0xffbf92b5,0xffb7ed16,0xffc405c1,0xffcaf675,0x000b5361,0x005454bf,0x007070b6,0x0022c5e2,0xff753b3d,0xff9bec61,0xffc63c54,0xffd86604,0xfff295bf,0xffe67321, -0xfff896e1,0x0005799f,0x0007ddcf,0x000a9ae8,0xfff8f3c7,0x00005cb6,0xfffe826e,0x00002a21,0xffffc82f,0xfffff20d,0xffffaad8,0xffff97bb,0xffff01ba,0xfffed3c2,0xfffed662,0xfffd4a65,0x000fe472,0x00291f12,0x003593d0,0x00344754,0x002de74b,0x002371d6,0x000ee9ae,0x00004e42,0xfff4442b, -0xffe7a47f,0xffd5e186,0xffcb7060,0xffcb2115,0xffde2b16,0xfff60829,0xffe3b851,0xffc9b74f,0xffb9c087,0xffc8c2d2,0x0035167a,0x003b9f38,0x002a737c,0x001b3428,0x000ffa47,0x0004a548,0x000384de,0x000107df,0x00005298,0xffffefc3,0x00002a9e,0x00008af0,0x0000d64b,0x0001c940,0x0002cfe1, -0x00025649,0x0005f467,0x0012613c,0x0014ef77,0x0010b0f7,0x000714d0,0xfffc3711,0xfff0e018,0xffe8e751,0xffdcfdd1,0xffcbea2f,0xffd2756c,0xffd45bad,0xffd1ca86,0xffd4f24a,0xffd9e845,0xffed2f8a,0xfffd0871,0x00159c22,0x002724cc,0x00373ccd,0xffec0f90,0xffe8b603,0xffe73f5c,0xffe95d71, -0xffe95613,0xfff13d0b,0xfff826cc,0xffff744d,0x0000478b,0x000170bb,0x00009b0d,0xffffb406,0xfffeab07,0xfffd15fe,0xfff8c584,0xfff84e33,0xfffb7ad6,0xfffd75b5,0x0002b0bb,0x000a5d05,0x0005a07b,0x0003df4c,0x00010e74,0x00003ab2,0xffffa9d8,0xfffe4e41,0xfff9960c,0xfff48254,0xfff08e97, -0xfff08785,0xfff092d6,0xffedd546,0xffef81a6,0xffee1037,0xffec00e5,0xffe9d7c7,0xffe6bd56,0xffdfa55f,0xffe1848c,0xffe51a33,0xffe7fea6,0xffe9c693,0xffea21df,0xffec0246,0xffee45a6,0xfff1961f,0xfff50d70,0xfff84f5b,0xfffb7da8,0xffff6ae6,0x000714d7,0x000cc836,0x0012309d,0x00187036, -0x0020894c,0x002275cc,0x002085aa,0x0020221d,0x001f307e,0x001e5d3e,0x001d2280,0x001d4b7f,0x00182a9a,0x0014cd8c,0x0010f407,0x000bd54f,0x00063ccb,0x0000e9ea,0xfffb642c,0xfff6a680,0xfff33b68,0xffed6226,0x0005af2d,0x00033aa7,0x0006d7ae,0x0007cf37,0x000ac916,0x000629b2,0x00095df8, -0x000c417c,0x000eb81f,0x001092ab,0x00129c42,0x0014aadd,0x00170b6f,0x0018adf0,0x00159672,0x0013bb9e,0x001c64a5,0x00198321,0x001928f1,0x0018028d,0x00188b40,0x00187c38,0x00187b91,0x00187dc8,0x0018582d,0x00189fe4,0x00162db5,0x0013f9a9,0x0011b865,0x000fe89f,0x000e6dbc,0x000d0cb6, -0x000bee90,0x000a441f,0x00080a99,0x0006a71f,0x0016e87a,0xfff1c594,0xfff743aa,0xfff586b4,0xfff4bd7c,0xfff344b9,0xfff20e2a,0xfff3303a,0xfff41119,0xfff9e037,0xfff5fc7b,0xfff4699f,0xfff3d040,0xffed853e,0xffed92fe,0xfff4dfa8,0xfff07b02,0xfff12451,0xfff3a962,0xfff19832,0xfff1e9e7, -0xfff0cc46,0xfff215a9,0xfff1b02a,0xffefdd14,0xffee3737,0xffef52db,0xfff2f584,0xfff6cce7,0xfff66b19,0xffee9bac,0xfff367a0,0xfff5adbe,0xfffc5f52,0xfff8a6c8,0xfff788ad,0xfff2f102,0xfff74ac6,0xfff9ca29,0xfff627ef,0xfff4d5a8,0xfff3d6a6,0xfff40ac2,0xfff0a1fd,0xfff67f0c,0x0003bc9f, -0xfffd7d3f,0xfffbd066,0xfff9f557,0xfff1c22f,0xffeec315,0xfff7a743,0xffe7c6c0,0xffe7c595,0xfff68546,0xfff1fcfa,0xffefbe77,0xffeafd9a,0xffeda580,0xffe82df6,0xffdf7877,0xffd6ba11,0xffda29aa,0xffe7fe15,0xfff8c183,0xfffa66fd,0xffe4f4b6,0xfff08517,0xfff7db0e,0x000946ce,0xfffe867a, -0xfff8c944,0xffed51b7,0xfff7fe84,0x00063982,0xfffd7bd4,0xfffb5941,0xfff68062,0xfff3adbf,0xfff99c8d,0x00002a15,0x00016ce1,0xffffd784,0x0001a3b8,0x0001c02c,0x0004a570,0x00029051,0x00037a96,0xffff9a2d,0xfff4bba2,0xfff5f97c,0xffeeb47e,0xffec6d0e,0xffe3490b,0xffece83e,0xffe6a820, -0xffde2220,0xffcfb4a1,0xffd77c2c,0xffefa4ab,0x00073108,0x0004bf87,0xffd79ca6,0xfff37832,0x00010d54,0x00275217,0x000e25f3,0x00082321,0xfff233ee,0x0006dc30,0x0003ea16,0xfff8b5bf,0xfff87cef,0xfff6ed3f,0xfffd6bbb,0x0002fdd9,0x000030a1,0xffff4caf,0xfffff471,0xffff7cd5,0xfffefdb7, -0xfffe431b,0xffff2797,0xfffe79c8,0x00018e89,0x0003b392,0xfffdea81,0xfff1b332,0xffe72aa5,0xffdb6041,0xffe35ead,0xffd22d08,0xffb0d0fe,0xff8ecea6,0xff978200,0xffcb066c,0x000422c7,0x00044d39,0xffbca154,0xffe54d91,0x0007e9f8,0x003ede27,0x0015f2c6,0xfff8dfb8,0xffd831aa,0xfff8c45f, -0x0029cce4,0x001bf570,0x001967b9,0x00078450,0x000019ad,0xffff2159,0xffff870e,0x00006daf,0x00000928,0x00003ee5,0x00008918,0x0000b7f7,0x00007b36,0x00008864,0xffff3b95,0xfffe138b,0x00024b35,0x0008728e,0xfff489f9,0xffe4e859,0xffed29e3,0x0008b5d6,0x00394cc6,0x0087c28b,0x009ca5a1, -0x006d87cb,0x0041d168,0x0021c03b,0x002478bb,0x0021d653,0x0022d777,0x002a54b1,0x00333ec6,0x005063f6,0x00835ddd,0x00449291,0x0026247f,0x001e33e7,0x001444dd,0x00068f81,0xfffd932c,0x00015392,0xffffe2a5,0x00000c07,0xffffcd5d,0xffffea27,0xffffab96,0xffffae9c,0xffffb60e,0xffffe47d, -0x000047f1,0x0001615b,0xfffd5043,0x00006e28,0x0006e49a,0xfffb61bf,0xfff74e6c,0xffe89816,0xffcf68b8,0xffa90445,0xff993c65,0xffacc1ce,0xfff2adf0,0x002a6ee3,0x00415e3d,0x001e5d6c,0xfff3f200,0xffcb5716,0xffc485aa,0xffe24136,0x00193909,0x002ba10c,0x0043dadc,0x0076c011,0x005c6cb4, -0x0004b30f,0xfffb7959,0x00018db0,0xfffef183,0x000081e6,0xfffff48d,0x000034e1,0x0000311b,0x00003248,0x00002c8c,0xffffeaf4,0xffffe870,0xfffeefb8,0x00016874,0xffffb6e8,0xfffe7b05,0x001032bc,0x001d8076,0x002d4cf7,0x00394331,0x0066ac5e,0x0073ae48,0x005ce78c,0xffff5d38,0xffc082c7, -0xffa7b4d9,0x0020d871,0x0066edda,0x00507aa3,0x0068cf85,0x002629fe,0xffab0214,0xfffdd07a,0xffa15b9e,0xfece4dcc,0xff9632bd,0x0004c142,0x0000f7d8,0x00008caa,0x00005939,0xffffc507,0xffffd5ab,0xffffc3d0,0xffffc2ba,0xffffc93c,0xfffff909,0xfffffbf7,0x0000ad9e,0xfffff256,0x00026614, -0xfff8aa57,0xffe5ffc3,0xffd9f1ca,0xffd5370c,0xffd33a33,0xffca7b71,0xffc68870,0xffc42320,0xffd0ee8a,0xffdd9b01,0x001a34ca,0x0067263f,0x0053d11f,0x000318a7,0xff7a3d75,0xffba41e7,0xffec5d6a,0xfffbddd7,0x0000a2de,0xffee3124,0xffbeb98d,0xffd5c812,0xfff30863,0x00032812,0xfffbab5c, -0x0000fcf1,0xffffc640,0x0000a631,0x00004d4f,0x000081ea,0x0000472c,0x00000abb,0xffffd6b3,0xffff17e2,0xffff8433,0xfffc3f92,0x0007b9c2,0x001e95d3,0x002eac73,0x002dfa1e,0x002931ff,0x002086d2,0x000decd7,0xffffd42f,0xfff2eff3,0xffeb0b7f,0xffdae926,0xffd2f631,0xffd3a16d,0xffe756d3, -0xfffb0036,0xffefd5ba,0xffde8ac5,0xffd27d5d,0xffec7f60,0x00314e75,0x003a2dca,0x002bf7dd,0x00198866,0x000ad433,0x0000abda,0x0001a31b,0xfffe8e0d,0xffff6820,0xfffeeb89,0xffff1703,0xffff56df,0xffffecfc,0x00005d1e,0x00016e2c,0x000243db,0x00031f13,0x00112f13,0x0017e987,0x0016e644, -0x000d8022,0x00033e4e,0xfff7511a,0xfff0d4d1,0xffe5cc87,0xffd466ba,0xffd77f10,0xffd76051,0xffd4672c,0xffd7de29,0xffddbf53,0xfff25e9c,0xfffd66bf,0x0012e0b2,0x00215450,0x003034b4,0xfff43d75,0xfff2576a,0xffefb8d8,0xfff2c29a,0xfff455c3,0xfff9c30a,0xfffed398,0x0003f3d7,0x00022960, -0x00030046,0x00024429,0x0001ebc2,0x00007e1a,0xffffeccc,0xfffd0ce1,0xfff97dbc,0xfffa207f,0xfff9d09a,0xfffd34aa,0x00039acf,0xfffe4781,0xfffc7d49,0xfff9484d,0xfff701a4,0xfff4c61f,0xfff1ea39,0xfff15c27,0xffeffab5,0xffefb528,0xfff1a352,0xfff32dd5,0xfff21466,0xfff3e16b,0xfff314a1, -0xfff219a5,0xfff1b68b,0xffea6848,0xffe4f165,0xffe41fbc,0xffe782e0,0xffe80f9e,0xffea07a6,0xffeb454b,0xffede76a,0xfff0ab4b,0xfff38555,0xfff5936b,0xfff7c612,0xfff90d5a,0xfffab99c,0xffff59ce,0x00047d29,0x000a66b6,0x0010ef70,0x001a9be1,0x001c628b,0x0019cbd2,0x0018db45,0x00177654, -0x00160897,0x00149670,0x0013b0df,0x000fd829,0x000cfefc,0x0009def7,0x0005a63d,0x00014a0b,0xfffd48c5,0xfff95148,0xfff61223,0xfff3b643,0xffef4437,0x00002ee1,0xfffed043,0x00013c15,0x0001dab6,0x00044b03,0x00001067,0x000203e1,0x00034cb1,0x0004da32,0x00060d49,0x0007d416,0x0009a770, -0x000c374f,0x000e2fbf,0x000cffdb,0x000ba3d3,0x00141e58,0x00115e1c,0x0010cde7,0x000f5364,0x000f92e9,0x000f2dde,0x000ed2f2,0x000e8f41,0x000e23c9,0x000dfc13,0x000c1f38,0x000a6a84,0x0008c0db,0x000788ef,0x00068eea,0x0005a05c,0x0004d4af,0x00038e76,0x0001e6fd,0x0000ed54,0x000c8222, -0xfff20b27,0xfff6ade3,0xfff47e81,0xfff48aae,0xfff3c457,0xfff3a574,0xfff3b096,0xfff4bb15,0xfffbf090,0xfff75bb8,0xfff5b657,0xfff569f6,0xffefdef7,0xffeef2b2,0xfff44a99,0xfff14e8d,0xfff26c52,0xfff44f0b,0xfff2a800,0xfff2c4d0,0xfff1dc01,0xfff24fe1,0xfff1b8a2,0xffef7478,0xffef5a36, -0xfff077d3,0xfff32a4a,0xfff66301,0xfff5bc5e,0xffedc3a2,0xfff33f06,0xfff58bb1,0xfffc0850,0xfff77c1c,0xfff65c69,0xfff31b89,0xfff6aece,0xfff86fbb,0xfff41ffc,0xfff59ad5,0xfff50239,0xfff50bb6,0xfff23df9,0xfff8e89d,0x00035667,0xfffe92fe,0xfffd9ed6,0xfffcfb64,0xfff80929,0xfff6e652, -0xfffb4bbc,0xffef1785,0xffec3aba,0xfff4cf57,0xfff4b31f,0xfff1ebff,0xffeca018,0xffed3df9,0xffe7894f,0xffdef75e,0xffdb9113,0xffdfdc60,0xffea7989,0xfff8b46e,0xfff86eb8,0xffe28f87,0xffef872d,0xfff6ea47,0x00076c1a,0xfffb5ade,0xfff621ad,0xffee4382,0xfff6e876,0x0001d241,0xfff7a348, -0xfffa8a96,0xfff76b70,0xfff76eda,0xfffdd331,0x00015447,0x00001663,0x00000fc1,0x00014088,0x00017adb,0x000361b5,0x0002bf48,0x0002be81,0x000300d3,0xfffe51a6,0xfff88a68,0xfff29122,0xfff07b8a,0xffe75c49,0xffecf132,0xffe5da6a,0xffdbbb26,0xffd643f4,0xffde2beb,0xffefee69,0x00034e30, -0xfffec921,0xffd2e115,0xfff15dae,0xfffe14a4,0x002244df,0x00060990,0x0000f0c6,0xfff2087b,0x00020132,0xffff2f3c,0xfff2e061,0xfff8b21e,0xfffa0a8c,0x0000ff37,0x0001cbdc,0xffff9ca2,0xffffe342,0xfffff4a4,0xffff8464,0xffff44de,0xfffea5f6,0xfffec283,0xfffeca10,0xffff2844,0x0001e1d9, -0x0001092e,0xfff7b4a6,0xffec594f,0xffdeb97a,0xffe1304e,0xffce2836,0xffae9c53,0xff9e8b99,0xffab96da,0xffd415b2,0x00039544,0xfffc2730,0xffb5a23b,0xffe0500a,0x0002d0d7,0x0036560a,0x000b14fb,0xfff19cda,0xffdcf17c,0xfff70ea4,0x0014917d,0x0012b373,0x001115a0,0x0002de2f,0xffff4854, -0xffff9014,0xffffec99,0x00002a09,0x000006d1,0x00003e51,0x00006259,0x0000a116,0x000092bc,0x0000a6fd,0x00002488,0xffff52c7,0xffff7510,0x00063717,0xfffd38d8,0xffefb64e,0xfffb3e97,0x00142dce,0x0039a4a9,0x00774ac3,0x007ef6be,0x004ac361,0x0028855a,0x001676d2,0x002051c3,0x00265a52, -0x00237fd5,0x001933c1,0x002bf19f,0x00435071,0x00671cf0,0x00290692,0x002570d3,0x0014d2c2,0x000fc225,0xfffecb1f,0x00008cf6,0x0000543d,0xffffeed3,0xfffff187,0xffffe13a,0xffffdd1f,0xffffbe96,0xffffb150,0xffffa71e,0xffffc1f3,0xffffc84c,0x0000cef1,0xffff760d,0xfffe519c,0x0005661c, -0xfffd57c0,0xfff09578,0xffddb54a,0xffc6162f,0xffa86a2a,0xffa8119f,0xffc86b1a,0x00086d7e,0x00307808,0x0031e96e,0x00191980,0xfff77cd3,0xffd340ca,0xffda907f,0xfff79edb,0x00271b68,0x00325490,0x00353956,0x00605912,0x004245e4,0xfffbf37c,0xfffeb433,0x0000904f,0xffffb566,0x00004ab2, -0x00001b6f,0x0000327b,0x000035c7,0x0000394b,0x00003d83,0x00001f3e,0x00001ec1,0xffff6d79,0x00003ff7,0x0000ee52,0xfffd0124,0x000ca347,0x00207049,0x0034aacf,0x00440b25,0x006a5ca0,0x00686630,0x003e3c75,0xffefcb05,0xffc35ca9,0xffc0d145,0x00235e95,0x00571d76,0x0041c3f9,0x0047824b, -0x000b04c1,0xffb064a3,0xfff940a6,0xffb0f4a1,0xff19e1fd,0xffaf641f,0x000b14e6,0x00004851,0xffffe030,0x00000f05,0xffffa066,0xffffb6be,0xffffaf7a,0xffffb356,0xffffb734,0xffffc941,0xffffc9c0,0x00003389,0xffffedef,0x0001a181,0xfffe4adc,0xffe9196e,0xffda0dc6,0xffd7bcc3,0xffd52dde, -0xffcda6b6,0xffcdb7af,0xffcebd10,0xffd9c02e,0xffedb2a0,0x0021be97,0x006650ba,0x00307ede,0xffe7c56f,0xff8ffbd8,0xffd25f12,0x0002d2ba,0x00127a1a,0xfffb78ff,0xfffd1bc2,0xff9b288e,0xffbf7438,0xffef8cac,0x000297d6,0xfffe84ab,0x0000ca4f,0x000062b1,0x0000c510,0x00008ac8,0x000097c4, -0x000080b4,0x00004dd0,0x00006c1a,0xffff79e0,0x00004d8d,0xfffce18b,0x0001cad3,0x0017d08d,0x002808da,0x0025f2b5,0x00217ecd,0x0018e7df,0x00094f80,0xfffc6612,0xffef29ee,0xffea4656,0xffddc139,0xffdc97e0,0xffdd075f,0xffefef63,0x00010f20,0x0000d60e,0xfffa32f2,0xfff31a35,0x0010b325, -0x0024f288,0x0030ee56,0x002a1c04,0x001404e0,0x00026e22,0xffffce84,0xffffc63e,0xfffe5323,0xfffeba1f,0xfffeb085,0xfffec9d6,0xffff0058,0xffff3962,0xffff8d14,0xffffef69,0x0001fc2a,0x00005143,0x000d4201,0x0017ad9a,0x0018fcf9,0x00110c59,0x0008cce2,0xfffe05d2,0xfff8f445,0xffeeef61, -0xffde28c5,0xffddf4fa,0xffdc9ad8,0xffda33a0,0xffde3631,0xffe3c60e,0xfff54833,0xfffaecb5,0x000b686d,0x0015d970,0x002062dc,0xfffc6f4d,0xfffc5627,0xfff7e0ae,0xfffbc235,0xfffd1b2e,0xffff15fd,0x0002ace6,0x0003b803,0x000315b8,0x00030b32,0x0002e084,0x00026cc5,0x0001b624,0x00016be7, -0x00004d73,0xfffd074b,0xfffab9c3,0xfff823ee,0xfff895bb,0xfffcb194,0xfff84362,0xfff720fa,0xfff49711,0xfff1a656,0xffeecc0d,0xffeb8de5,0xffed3dbb,0xffedc9a3,0xffef15a7,0xfff27c94,0xfff533ab,0xfff6153e,0xfff7ca9d,0xfff7a5e5,0xfff80b86,0xfff9cde0,0xffeedee5,0xffeb762c,0xffe96bfe, -0xffec282f,0xffebffed,0xffee7894,0xfff10786,0xfff3f2a6,0xfff6eba8,0xfff72302,0xfff81c48,0xfff912d3,0xfffa3dac,0xfffacd17,0xfffbccdb,0xfffe6e74,0x00036588,0x00095086,0x0013137a,0x0013fb44,0x00113510,0x000feba3,0x000e58c5,0x000cb0e3,0x000b3ef6,0x0009c6fd,0x0007534a,0x00055e49, -0x00033b7b,0x00004546,0xfffd43d0,0xfffa8fe2,0xfff82821,0xfff659d4,0xfff4b108,0xfff1da81,0xfffc4997,0xfffbb816,0xfffcbb7a,0xfffcf9bd,0xfffe5a35,0xfffb43d8,0xfffbbabb,0xfffbb5fe,0xfffc58d4,0xfffde552,0xffff74a5,0x0000e455,0x0002893e,0x0004290d,0x0004a888,0x00045935,0x000b8b32, -0x00091e83,0x00086fd5,0x000711ae,0x0007210d,0x00068b4e,0x0005fac8,0x00058df7,0x0004fce2,0x0004839d,0x00036469,0x00024e46,0x000154a4,0x0000ab66,0x000033c1,0xffffc2d4,0xffff436a,0xfffe6f90,0xfffd7b2e,0xfffcd758,0x0003b778,0xfff4008e,0xfff76cb3,0xfff56be7,0xfff548f5,0xfff48bf1, -0xfff44eef,0xfff514ef,0xfff56718,0xfffc32ce,0xfff7f1f3,0xfff6611a,0xfff63400,0xfff1cfc8,0xfff0bc87,0xfff4122f,0xfff215f7,0xfff3f0ac,0xfff42f8e,0xfff489b2,0xfff4c99c,0xfff4ac6a,0xfff4337c,0xfff3950e,0xfff1590e,0xfff25fc0,0xfff35fbc,0xfff503b2,0xfff770a5,0xfff6b12d,0xffefb33a, -0xfff4f10d,0xfff71127,0xfffce0c9,0xfff83cf9,0xfff733ef,0xfff513d2,0xfff79a5e,0xfff87ddf,0xfff40545,0xfff5aba4,0xfff6e240,0xfff58d31,0xfff53ad1,0xfffc0b42,0x0002c98d,0xffffa3f8,0xffffe8f0,0x00000742,0xfffe43f7,0xfffdc2f7,0xffff58eb,0xfff7e117,0xfff348ab,0xfff43682,0xfff78f9f, -0xfff4da5e,0xfff05a77,0xffef0196,0xffe9ab1f,0xffe26927,0xffe31fab,0xffe772e9,0xffee5c51,0xfff94adb,0xfff7f93a,0xffe4e31c,0xfff13d11,0xfff80f15,0x00068a31,0xfffb0ef3,0xfff6a54a,0xfff1a3a8,0xfff79624,0xffff197e,0xfff3eeb0,0xfff9677d,0xfff84242,0xfffc0f78,0x0001e153,0x0001c091, -0xffff8e28,0x00000b8d,0x0000632c,0x00002904,0x0000fdea,0x00010a20,0x0001282a,0x00029476,0x00032f81,0xfffdd30a,0xfff70189,0xfff59590,0xffedbb23,0xffef2db1,0xffe86066,0xffded77c,0xffe0759e,0xffe7a772,0xfff2788d,0x0000de22,0xfffb6f34,0xffd688ce,0xfff30073,0xfffdfbf7,0x001d69ab, -0x0002262f,0xfffe4442,0xfff52be3,0xffff47e8,0xfffcac56,0xffeee161,0xfff84305,0xfffe0704,0x000267f8,0xffff8f72,0xffff2f54,0x00000f19,0x0000007d,0xffffce99,0xffffd262,0xffff882d,0xffff7b8b,0xffff66a6,0xfffebefd,0xffff3046,0x0001a97c,0xfffd866f,0xfff2fb41,0xffe563e3,0xffe1ef67, -0xffcfa5e1,0xffb5b476,0xffb425e9,0xffc27c3f,0xffddfbf9,0x0001ba3f,0xfff70767,0xffbb392f,0xffe22d02,0x000137ed,0x002e0400,0x0006481a,0xfff1a41e,0xffe64470,0xfff7c76e,0x0009ad0a,0x000f9a95,0x000a23af,0x0000ee60,0xffff0cb2,0xffffccfb,0x00007bf1,0xfffff8ca,0x00000a71,0x000015de, -0x00001fb1,0x00003a2c,0x00004075,0x0000578a,0x00008ca3,0x00004890,0xfffeec60,0x00031e6d,0x0002347f,0xfffb9b89,0x0008b147,0x001eb58b,0x003a00c6,0x006437af,0x00628b16,0x0032442d,0x001867b1,0x00104f70,0x001bebfd,0x00292ab1,0x00234170,0x0009e721,0x0022ddd0,0x0034f483,0x004c8840, -0x001852c8,0x001d51b3,0x0010f462,0x0009c349,0xfffc1882,0x000239fc,0xffff149e,0x0000374f,0xffffbf57,0x00000a06,0xffffe59f,0xffffed4b,0xffffdf7f,0xffffd918,0xffffd5b3,0xffffac2e,0xfffffd2b,0x00005328,0xfffe6135,0x00023d84,0xfffc5716,0xffea6915,0xffd69bca,0xffc2052c,0xffaed80d, -0xffb8f9d5,0xffdd772a,0x00134b3a,0x002de597,0x00223ef2,0x0010121c,0xfff7ecef,0xffdc109d,0xffeacae4,0x0003d811,0x00279139,0x002d6419,0x00241d1c,0x00446ba6,0x0027462e,0xfff7ae90,0x000136b8,0xffffd1a3,0x00003a8e,0x00001d67,0x000016fb,0x0000158b,0x00001688,0x00001afd,0x000018ca, -0x000029e6,0x00001aad,0x00002fcf,0xffff3e67,0x00017cdc,0xfffdefe8,0x000a05f1,0x0020298c,0x0034f8d5,0x00450777,0x005fba6c,0x0053780b,0x00233586,0xffe5c76b,0xffca16ba,0xffd801f3,0x0020d322,0x0042ea67,0x00309cf5,0x0026886b,0xfff5e882,0xffbea574,0xfff7e568,0xffc1c8d5,0xff6285b3, -0xffccad9b,0x000fa031,0xfffc56d6,0x0000f819,0xffff5515,0xffffe855,0xffffc221,0xffffe0ca,0xffffd81a,0xffffe0f6,0xffffd9a3,0xffffde37,0xffffccc4,0x000017d4,0x00000fe1,0x00021a79,0xfff0219c,0xffdeaf9a,0xffde4595,0xffdaeaa0,0xffd4d480,0xffd8511e,0xffdbfa26,0xffe46dfa,0xffffc2dc, -0x0028609a,0x005b2a93,0x00144de9,0xffd977fc,0xffaecdfb,0xffe3fc26,0x000e4a01,0x00265ced,0xfff60756,0x00127838,0xff970912,0xffc1d4c4,0xfffc13c6,0x00009850,0x0000491b,0x00007fbf,0x00008bfd,0x000055a9,0x000051eb,0x00004097,0x00004388,0x0000314c,0x0000580b,0x00001562,0x00004796, -0xfffee490,0xfffdb19c,0x00107407,0x0020b919,0x001d1cb8,0x001902b3,0x0010f98d,0x0005c9e9,0xfffb1db3,0xffee39de,0xffeb6847,0xffe1ef3f,0xffe4f93d,0xffe5455f,0xfff6bf76,0x00077087,0x0010fe95,0x00147134,0x00157ec2,0x00304336,0x00162fa2,0x0025807e,0x002334bf,0x00098cc0,0xfffe2fde, -0xffff6827,0xfffeb67d,0xffff0831,0xffff3637,0xffff66ef,0xffff6e60,0xffff89d7,0xffff7de1,0xffff94c3,0xffff409e,0x000074c1,0xffffe768,0x0007638d,0x00147f33,0x0017a910,0x0011a1ac,0x000be2ba,0x00033cad,0xffff9c2c,0xfff74de2,0xffe92f22,0xffe67611,0xffe47fe9,0xffe2a304,0xffe67ea9, -0xffea9b1b,0xfff689c1,0xfff6919e,0x0000a386,0x00075fcc,0x000e41e9,0x0003aed8,0x00044efe,0xffff03a9,0x0001f144,0x00014823,0x0002612d,0x0002d236,0x000211ce,0x0001a654,0x000142a8,0x00012954,0x000106e2,0x0000f243,0x00011f0a,0x00011241,0x00009aa4,0xfffd9308,0xfff87d18,0xfff6016b, -0xfff77545,0xfff49ec3,0xfff3e0ef,0xfff22bfa,0xffef7c79,0xffece569,0xffea08b6,0xffec6fdc,0xffedb3d6,0xffef5bbe,0xfff39e7c,0xfff72c5d,0xfff9ec10,0xfffbf3b7,0xfffcc2b1,0xfffe6221,0x0001690f,0xfff2917a,0xfff1083c,0xffeee2cd,0xfff160b6,0xfff1c348,0xfff44fdd,0xfff85b81,0xfffad006, -0xfffd09f8,0xfffcbd6e,0xfffd2b1b,0xfffd4ab3,0xfffdcfa2,0xfffd6ec5,0xfffc621c,0xfffbc3db,0xfffdd4f5,0x000246d1,0x000a9a2d,0x000af73b,0x000865a3,0x00070828,0x00059064,0x0003e7cb,0x00029816,0x0001066e,0xffffefa7,0xffff02bd,0xfffde3ed,0xfffc28f5,0xfffa4b50,0xfff89009,0xfff74b76, -0xfff67cc1,0xfff55321,0xfff3df90,0xfffa0a27,0xfff9ee5b,0xfffa5227,0xfffa1e93,0xfffa816a,0xfff86748,0xfff7f18e,0xfff7a2b0,0xfff7dae4,0xfff8e8cc,0xfff9f35f,0xfffae8bf,0xfffbefb0,0xfffd30c3,0xfffe23ab,0xfffe9d40,0x0004698a,0x0002ba38,0x0002060f,0x0000a6a7,0x0000904e,0xfffff2d8, -0xffff5136,0xfffedde0,0xfffe4c3c,0xfffda830,0xfffd237e,0xfffc8d3c,0xfffc21da,0xfffbe449,0xfffbd829,0xfffbd6c6,0xfffb9b8b,0xfffb30fc,0xfffad544,0xfffa76bd,0xfffd78a2,0xfff623b2,0xfff89fd4,0xfff6c2ce,0xfff70cee,0xfff70cb2,0xfff61e51,0xfff6f971,0xfff81be3,0xfffde627,0xfffa8c14, -0xfff96df7,0xfff96d24,0xfff6a1db,0xfff5c1ce,0xfff76c74,0xfff5f6f6,0xfff63a86,0xfff5213e,0xfff7c8b2,0xfff79790,0xfff7267b,0xfff664be,0xfff5bcd7,0xfff3ce57,0xfff55cdc,0xfff6237d,0xfff6e594,0xfff87254,0xfff7bb3f,0xfff26e04,0xfff698e0,0xfff85465,0xfffd10ec,0xfff917ed,0xfff865be, -0xfff78821,0xfff8e8d7,0xfff99bf7,0xfff56605,0xfff7936e,0xfff8a9e9,0xfff87aac,0xfffb565b,0xffff72e4,0x00013f96,0x00003c26,0x0000796c,0x00009eb1,0x00005143,0x0000201e,0x0000f4d6,0xfffe5456,0xfffbe7a1,0xfff7c7ac,0xfff9b5d3,0xfff8d1e1,0xfff443fa,0xfff19032,0xffed11d0,0xffe78918, -0xffea8f73,0xffee4679,0xfff20c57,0xfff96c3c,0xfff7b241,0xffe937c9,0xfff2ebb0,0xfff87f85,0x00043fd2,0xfffaf93b,0xfff80304,0xfff6161b,0xfff95a16,0xfffdf611,0xfff34df9,0xfff9ebce,0xfffc3483,0x00009b13,0x000192ab,0x0000812e,0xffff8c87,0x00000ae5,0x00000f82,0x00000eb9,0x00005399, -0x000045e7,0x00001227,0x0000af6d,0x0001d8e2,0x000178dd,0xfffd24ff,0xfffa5946,0xfff41019,0xfff20e0c,0xffec52d9,0xffe432b1,0xffe9d75a,0xffef95ec,0xfff4a95f,0xfffdcdc8,0xfff86f98,0xffdd7375,0xfff3a906,0xfffc2cb3,0x0015586a,0xfffed1b0,0xfffcfafa,0xfffa0280,0xfffe6ad4,0xfffcef82, -0xffef4bc4,0xfffb2e17,0x0000b61f,0x00004a00,0xffff339d,0xffffd1ec,0x000029d8,0x000002e4,0xfffff089,0xfffff781,0xffffd235,0xffffd6ee,0xffffe8bb,0xffffbeaa,0xffff11fd,0xffffd525,0x0000998d,0xfff9f0ee,0xffed0f40,0xffe52071,0xffd5981f,0xffc24c0e,0xffc9aa90,0xffd6da56,0xffe6dafa, -0xfffe68c6,0xfff36f12,0xffc6d53f,0xffe45bcc,0xfffd508c,0x0021ad7e,0x000266c1,0xfff493be,0xfff2494b,0xfffb4764,0xfffef9b8,0x000a2ea7,0x00063f35,0xfffe61ef,0x000042d6,0x00003b68,0x000032a1,0xffffe289,0x00000740,0x00000410,0x00000aa9,0x00001462,0x00001853,0x00000ad0,0x000029bc, -0x00006ea3,0x000006a6,0xffffc295,0x00040f77,0x000521c6,0x00107b41,0x00222151,0x00343e63,0x004b6c22,0x004415a1,0x001db9ad,0x000b3f6e,0x0009fa00,0x001588ce,0x00262e20,0x001e5600,0xfffca96b,0x0016e590,0x00233338,0x00309616,0x0008b571,0x0015cc95,0x000ce3e6,0x00025db0,0xfffd4a75, -0x0001d73a,0xfffee7a0,0x00005b1d,0xffffd061,0x0000147d,0xffffeef6,0xfffffce3,0xfffff0af,0xfffff4de,0xfffff313,0xfffff3e8,0xffffa85d,0x000070fe,0xffff2b0c,0xffffed59,0xfff921a5,0xffe653c7,0xffd47226,0xffc44132,0xffbabfe2,0xffca163b,0xffec2fd8,0x0016ab41,0x0027103b,0x0015e21d, -0x0009ad76,0xfff9a278,0xffe566d4,0xfff92de5,0x000d7f11,0x00250fba,0x0026bdc2,0x0015a6e5,0x002bc257,0x00106ebe,0xfff9cfa3,0x00020b16,0xffff8ce0,0x000042fc,0xfffff60a,0x00000c30,0x00000812,0x00000a3a,0x00000d13,0x0000079e,0x000010f8,0xfffffe04,0x00004f11,0xffff9ba3,0x000084ab, -0x0000158b,0x00081fa1,0x001d189c,0x002f5321,0x003e5122,0x004bfd89,0x003a9b06,0x000e2352,0xffe1fd24,0xffd3e012,0xffea7884,0x001bd645,0x002f39a1,0x00211811,0x000cffaf,0xffe8dfb9,0xffcdc26a,0xfff74551,0xffcdbda4,0xff9b9d93,0xffed1157,0x000acb51,0xfffba17d,0x00017aef,0xffff3621, -0x000038ec,0xffffd045,0xfffffc4e,0xffffe6ef,0xfffff2df,0xffffec0f,0xfffffb11,0xffffda88,0x00000be5,0xffff78c2,0x00025ca1,0xfff8adb5,0xffe669d0,0xffe6cdbe,0xffe30eef,0xffdeb0d4,0xffe35e1e,0xffe898d2,0xffef56ff,0x000dd676,0x002909c0,0x00451422,0xfffeb948,0xffd4ce4d,0xffcb161f, -0xffef5e53,0x0010e385,0x002d7e83,0xfff00c48,0x00235881,0xffab3c85,0xffda12cb,0x0005fe2c,0xfffe5781,0x00016c98,0xffffab68,0x0000665e,0x000000b8,0x0000341d,0x00001c5b,0x000023ef,0x00001b8e,0x00001544,0x000029e0,0x00000d71,0x0000b35c,0xfffc6325,0x000954c1,0x001915d3,0x00143101, -0x00107672,0x0008e096,0x0001cb6f,0xfff9cec8,0xffeeea0f,0xffec9cc1,0xffe6956c,0xffed23a0,0xffede431,0xfffd75cd,0x000da6da,0x001db373,0x002757a1,0x002ef72d,0x004005ca,0x00071843,0x00181197,0x0018b834,0xffff3676,0xfffe5638,0xffffdbde,0xffff4d7e,0xffffe0b7,0xffffa9bc,0xffffbf4d, -0xffffb40e,0xffffc062,0xffffc95a,0xffffcfe6,0xffffc74d,0xffff9e32,0xffff97a6,0x0001f88c,0x000e87b7,0x00141c93,0x00100ccc,0x000ceba2,0x00066354,0x00037789,0xfffcb895,0xfff23ca3,0xffee78a6,0xffecd65c,0xffebf00a,0xffee6c2e,0xffefdbd3,0xfff4bfca,0xfff19926,0xfff65b15,0xfffa5ee9, -0xfffdd587,0x0008f948,0x000a371d,0x00048035,0x0003eee0,0x00018080,0x0001c098,0x0000ef46,0x00007a6f,0x0000803e,0x0000854e,0x00008ad6,0x0000783c,0x00006322,0x00005337,0x0000804f,0x0000e017,0x0001057b,0xfffbc1a5,0xfff6a765,0xfff5b392,0xfff45766,0xfff3b4c4,0xfff2c17e,0xfff0ac6a, -0xffeeaf82,0xffec6f01,0xffee4c8d,0xffef1ea9,0xfff00de1,0xfff471bd,0xfff853fc,0xfffc1301,0xfffedd06,0x0000d012,0x0003a4f7,0x00073cc1,0xfff59eeb,0xfff589d5,0xfff384e0,0xfff771a3,0xfff86990,0xfffae8b8,0xfffe8cec,0xffff796e,0xffffa41d,0xffffa4cd,0xffffab3a,0xffffa9e7,0xffffb431, -0xffffaff7,0xffff0711,0xfffd839a,0xfffc167c,0xfffd5dde,0x000313a9,0x0002d6eb,0x0000deff,0xffff8c14,0xfffe54a3,0xfffcd9ad,0xfffbc33a,0xfffa67f3,0xfffa50c9,0xfffa3b01,0xfff9da70,0xfff909d4,0xfff7f766,0xfff6e6c4,0xfff68db2,0xfff6805d,0xfff5e1c0,0xfff58af1,0xfff94279,0xfff99493, -0xfff937c4,0xfff8750b,0xfff819d2,0xfff7cd42,0xfff7790d,0xfff77cdf,0xfff7b636,0xfff84085,0xfff8b84f,0xfff93fe0,0xfff9bf4f,0xfffa6d22,0xfffad46a,0xfffadbd9,0xfffe764c,0xfffe0802,0xfffd43fd,0xfffc2cf7,0xfffbf43c,0xfffb6b46,0xfffad609,0xfffa6e1d,0xfff9ef00,0xfff94189,0xfff92fa7, -0xfff8fde5,0xfff90213,0xfff91045,0xfff94f2e,0xfff99260,0xfff99a46,0xfff98813,0xfff99e9f,0xfff986c7,0xfff9a306,0xfff8ab82,0xfffa43eb,0xfff8dce1,0xfff93f4f,0xfff8ea38,0xfff75389,0xfff9708a,0xfffa906f,0xfffe1de7,0xfffc4fbd,0xfffbc14a,0xfffbd62f,0xfffaa375,0xfffa3e83,0xfffad430, -0xfff9a7e3,0xfff97577,0xfff618aa,0xfff9bece,0xfffa3c6d,0xfff9d68d,0xfff90311,0xfff87e81,0xfff71402,0xfff88e53,0xfff91103,0xfff94367,0xfffa112b,0xfff9886f,0xfff6312b,0xfff8f531,0xfffa27c0,0xfffd7145,0xfffa9671,0xfffa3081,0xfffa1069,0xfffa9889,0xfffaa633,0xfff7b898,0xfff91aee, -0xfffae03a,0xfffcb748,0xffffd76f,0x0000fcb4,0x00012f26,0x0000e8dd,0x000143b4,0x00014831,0x00016e03,0x00015a76,0x0001b883,0x00014fb6,0x00005822,0xfffcd6d1,0xfffc3b88,0xfffb2aec,0xfff84634,0xfff549d4,0xfff20cb6,0xffee7e8d,0xfff1ed24,0xfff497aa,0xfff62bbc,0xfffa554a,0xfff8d1c3, -0xffef9c2a,0xfff5f8db,0xfff9d48c,0x0001ebdd,0xfffb907f,0xfff9cea2,0xfff98f77,0xfffacbc6,0xfffd0fcf,0xfff495bc,0xfffb3c48,0xffffcb7b,0x0001ab81,0x0000791c,0xffffe2df,0xffff9f75,0xffffb6df,0xffffa760,0xffff8a5a,0xffff966a,0xffff900f,0xffff8cc7,0xffffad1a,0x00008336,0x00014479, -0x00007db2,0xfffdb88b,0xfff92aa8,0xfff6210b,0xfff1f34e,0xffec1378,0xfff2695b,0xfff64b4b,0xfff7ab98,0xfffc57ae,0xfff82b98,0xffe7c86e,0xfff6506b,0xfffc05b6,0x000d1ede,0xfffd6290,0xfffcd4f6,0xfffd15f4,0xfffd9ee3,0xfffbad14,0xfff12b56,0xfffea85e,0x00010d75,0xffff628a,0xffffb7cc, -0x000002e2,0x00002b62,0x00002075,0x000025b8,0x00002fa1,0x00002d10,0x00002f04,0x000034c3,0x00000f61,0xffffd547,0xffff4d3b,0x0000c9a8,0xfffe2c50,0xfff4ad02,0xffeb6fd8,0xffe06c9c,0xffd4257b,0xffde4428,0xffe8444d,0xffef9ab4,0xfffc65f9,0xfff3cc51,0xffd7d918,0xffeaa8ac,0xfffb9fdd, -0x00149534,0xffff7dab,0xfff76dc0,0xfff9485b,0xfffbe8ba,0xfffc43a6,0x00054e3d,0x000163a2,0xffffe6b4,0xfffff8b0,0x0000335f,0xfffff339,0xfffff222,0xffffed90,0xffffeea6,0xffffe96e,0xffffeaa7,0xffffe8e2,0xffffe8e2,0xfffff83c,0x000017b3,0x000049a7,0xffffb036,0x000149b4,0x0009db32, -0x00125c39,0x001e8176,0x00291379,0x003088c8,0x0027a2f6,0x000eb1f5,0x00031f4f,0x00051723,0x000e2658,0x001defb4,0x00175960,0xfff85de9,0x000edf65,0x001602ac,0x001ba425,0x0001c2e1,0x000f5e00,0x000a3056,0xfffdd2d3,0x00008931,0xfffff2be,0xffffcff4,0x0000133c,0x00000000,0x00000e42, -0x0000082e,0x00000ceb,0x00000b87,0x00000cf2,0x00000ae4,0x00000777,0xffffe6f9,0xffffe993,0x00002444,0xffffb908,0xfff700c1,0xffe81e7e,0xffdb0c86,0xffd13a63,0xffcee966,0xffdd9512,0xfff75ea2,0x00145485,0x001d1922,0x000d3b31,0x0004761d,0xfffaad24,0xffee21ca,0x000164a8,0x000fb2fa, -0x001ce76d,0x001beda8,0x000b1253,0x00166b6c,0x00027c44,0xfffde75c,0x0000e7c1,0xffffc571,0x00001763,0xfffff13d,0xfffffa17,0xfffff79d,0xfffff658,0xfffff855,0xfffff3e3,0xfffffdff,0xffffef04,0x000027c9,0xffffe7cd,0x0000014c,0x000048e7,0x0006d1e1,0x0017429d,0x0024531f,0x002f434d, -0x00338871,0x0023933c,0x00031b15,0xffe6a9bf,0xffe13ff9,0xfff7b1f3,0x001414ad,0x001d2abc,0x0014064e,0xfffd2e07,0xffe6189c,0xffdeec5e,0xfff8c350,0xffdcd51d,0xffc71d5f,0x0000fe9e,0x0002691d,0xfffe8fa9,0x00009821,0xffffb789,0x00002a52,0xfffffc0a,0x00001114,0x00000897,0x00000cdd, -0x00000901,0x00000e42,0xfffff902,0x000014b2,0xffff7e54,0x00013e25,0xfffe4074,0xfff0828f,0xfff030c5,0xffed4240,0xffeac326,0xffeeb65a,0xfff41834,0xfff9f7c4,0x00148c66,0x00235e68,0x002c8ea4,0xfff56ac0,0xffdc2b54,0xffe394ae,0xfff90df7,0x00100e61,0x0028ae3f,0xfff1214a,0x0027c95d, -0xffceafd3,0xfff60771,0x0004255f,0xfffe8479,0x0000c418,0xffffb387,0x00000d16,0xffffdf50,0xfffff2de,0xffffe909,0xffffeb71,0xfffff203,0xffffe18a,0x000014db,0xffffcc68,0x0000dac6,0xfffe3923,0x0001ed38,0x0011693f,0x000c40e5,0x0009b667,0x00035f5b,0xffff2c86,0xfff9c72b,0xfff1bde3, -0xfff066a0,0xffed592a,0xfff40a8d,0xfff5d72d,0x0002d492,0x0011bf1e,0x00214e27,0x002bc913,0x00362600,0x003beaca,0xfffca6a9,0x000cbab1,0x000a0efc,0xfffcb9da,0x00006b69,0xffff6fb6,0x0000275e,0x00002295,0x00002858,0x00002709,0x00002e5c,0x0000257c,0x00002d1c,0x00001977,0x00003126, -0xffff9b05,0x0000174a,0xffff0cf2,0x0006d5de,0x000f6c25,0x000c3d30,0x000b98a4,0x000732f1,0x0004d023,0xffffe076,0xfff92017,0xfff5c073,0xfff48a2e,0xfff410f2,0xfff4e333,0xfff46aba,0xfff509a2,0xfff08f9d,0xfff17de9,0xfff37495,0xfff4e06f,0x000a3a37,0x000c6b43,0x0005ae6d,0x0000ee95, -0x00015b8d,0x00006469,0xffffcfa7,0xffff8d45,0xffffadab,0xffff9a9b,0xffff946c,0xffff9b7f,0xffffa784,0xffff9863,0xffffc441,0x00002551,0x00011211,0x00003f6f,0xfff9ddce,0xfff72d7c,0xfff6f76e,0xfff657d5,0xfff5e23b,0xfff46d92,0xfff31022,0xfff1790a,0xfff283c2,0xfff2d14d,0xfff31f29, -0xfff6dacc,0xfffa501c,0xfffdf33b,0x0000cebf,0x00033f46,0x000625b1,0x000980af,0xfff8fa89,0xfff929b9,0xfff8c73f,0xfffcf1ec,0xfffd4662,0xffffb650,0x00013dc9,0x00018a17,0x000125e7,0x0001454d,0x00012dd6,0x000139d8,0x00012168,0x0001480b,0x00013034,0x0000048b,0xfffe3e24,0xfffbe756, -0xfffda646,0xfffdf896,0xfffcb41e,0xfffbb04d,0xfffaea4c,0xfff9e225,0xfff9312e,0xfff84c64,0xfff8c6ce,0xfff92f1e,0xfff9427f,0xfff90e63,0xfff88ac8,0xfff7fde5,0xfff8140e,0xfff8503e,0xfff80e4b,0xfff83aa2,0xfffa48ca,0xfffaccaa,0xfff9aaae,0xfff8c982,0xfff83198,0xfff9b306,0xfff9ede3, -0xfffa4ce4,0xfffa555e,0xfffa885f,0xfffaa646,0xfffacd34,0xfffae962,0xfffb27a8,0xfffae34a,0xfffa653b,0xfffaa5f5,0xfffb637a,0xfffb7ea0,0xfffab0a0,0xfffa5fa2,0xfffa1302,0xfff9a652,0xfff96095,0xfff90a9a,0xfff8828e,0xfff8aa8d,0xfff8b353,0xfff8efb3,0xfff92147,0xfff97c79,0xfff9d90b, -0xfff9fb6a,0xfffa13c6,0xfffa58cf,0xfffa62dd,0xfff8da69,0xfffaed30,0xfffbc1e6,0xfffb1fb3,0xfffb27bc,0xfffac5e1,0xfffa5122,0xffff0b48,0xffff0237,0x0000030f,0xffff7628,0xffff532d,0xffff55d1,0xffff0772,0xfffee24f,0xffff1117,0xfffef33f,0xffff4ead,0xfff9b21b,0xfffbaa76,0xfffc2503, -0xfffbeabe,0xfffb3c62,0xfffaec90,0xfffa1b7b,0xfffb1534,0xfffb55b8,0xfffb496c,0xfffb8a01,0xfffb3905,0xfff99cda,0xfffafe3b,0xfffba3c8,0xfffd74dc,0xfffbe400,0xfffbc828,0xfffc1cb1,0xfffc1ca6,0xfffc36c7,0xfffa0c7d,0xfffac03e,0x0000087c,0x0000f668,0x00010447,0x000011cc,0x00000f35, -0x0000059c,0x00002dd4,0x00002b55,0x000056db,0x0000592b,0x000074bb,0xfffffb9e,0x00010e37,0x0000d357,0x00008f8d,0xfffd2cbe,0xfffb37da,0xfff8f9ea,0xfff6fe56,0xfff53d28,0xfff7abe6,0xfff92720,0xfff99189,0xfffb38ba,0xfffa38bb,0xfff5bf84,0xfff8e3ca,0xfffb0978,0xffff87ea,0xfffc41a6, -0xfffba30b,0xfffc7cd0,0xfffc5a9c,0xfffd9fa9,0xfff6a1d4,0x00001bff,0x00011b98,0xffff5d40,0xffff9b2c,0xffffd867,0xfffffa05,0xfffff9a3,0xfffff0cb,0xfffff37f,0xffffe8a9,0xffffdbf3,0xffffda1e,0xffffdf49,0xffff979f,0xffff9b1c,0x00005b3b,0x0000c3f7,0xfffc3b7c,0xfff9ba3b,0xfff7425b, -0xfff3e2b1,0xfff86ec4,0xfffa74bd,0xfffa3806,0xfffb9ee3,0xfff91547,0xfff18b3e,0xfff8ad1d,0xfffbbd43,0x00050626,0xfffca3a1,0xfffd0c36,0xffff2dc8,0xfffd9b33,0xfffcbd20,0xfff5a568,0x0001f632,0xffff1212,0x00003461,0x00002aac,0x000018c2,0x000004a3,0x000004f2,0x000006bf,0x00000834, -0x00000b45,0x000010a7,0x00001155,0x0000170e,0x00003376,0x0000097b,0xffffc648,0x000062c8,0xfffa83f2,0xfff2979b,0xffec5066,0xffe6247a,0xffedfced,0xfff3eb7c,0xfff64130,0xfffaf4b1,0xfff5c4a1,0xffe85c19,0xfff16575,0xfffacad5,0x0008a613,0xfffddc77,0xfffaeea7,0xfffec6a9,0xfffdf9f3, -0xfffc1200,0x00026312,0x00006b24,0xffff878c,0x00003c0d,0xffffd521,0xfffffafd,0xfffff9ee,0xfffffe0e,0xfffffbda,0xfffffbb9,0xfffff9b2,0xfffff85d,0xfffff669,0xfffff53e,0xffffe28d,0x00000fae,0xfffff1db,0xffff6c87,0x00085dc7,0x000e2102,0x0014cec6,0x001a5bb5,0x001913a5,0x0012094a, -0x0005dd65,0xffff65d5,0x00019b14,0x00071a5d,0x00114a6f,0x000c641f,0xfff660a6,0x0005d1dc,0x000920f9,0x000a186e,0xfffe5318,0x00097091,0x0006106f,0xfffdd5f9,0x00009ec4,0xffffbfc1,0x000020ef,0x0000007a,0x0000050d,0x00000211,0x000002c8,0x0000036a,0x00000332,0x0000063c,0x0000020d, -0x00000e11,0xffffffc7,0x00001742,0xffffc5a8,0x0000e658,0xfff876a4,0xffee2c06,0xffe6fe8e,0xffe21241,0xffe427e4,0xffeee305,0xfffe8044,0x000f2071,0x0012b559,0x00077708,0x00018e7f,0xfffc737c,0xfff62524,0x0004c4c8,0x000d0b01,0x001237ca,0x00104b9e,0x00044038,0x00075386,0xffffe194, -0xffffb700,0x00003750,0xffffe1a0,0x00000349,0xfffff7cd,0xfffffe56,0xfffffb92,0xfffffd42,0xfffffb8b,0xfffffcd1,0xfffff92f,0xffffff70,0xffffe928,0x000026d0,0xffffb575,0x00000e48,0x00049f4d,0x000e893f,0x00161f21,0x001c1513,0x001a829d,0x000f0554,0xfffc4df9,0xffecfe4d,0xffec92f0, -0xfffdaada,0x000a763a,0x000d786e,0x00094f67,0xfff717e2,0xffeb4fb9,0xffed8539,0xfffb2260,0xffe9c21c,0xffe8da59,0x00047f7d,0xfffebae3,0x00007d84,0xffffda61,0x00001d9b,0xfffffd61,0x00000b47,0x000003d6,0x00000697,0x0000053b,0x000006a0,0x00000658,0x00000641,0x00001062,0xffffed52, -0x000015c7,0x0000519a,0xfff9905c,0xfff78929,0xfff5de0f,0xfff50ad7,0xfff71f9e,0xfffb81ac,0x0000b7c7,0x00123a18,0x00179c53,0x00156571,0xfff51bca,0xffe97846,0xfff3c47c,0xfffdf897,0x000a5931,0x001818bf,0xfff580e8,0x001cd86b,0xfff28fcf,0x000161d2,0xffff9e06,0x00003a4a,0xffffcc65, -0x00000353,0xffffe86f,0xfffff6d2,0xfffff1e5,0xfffff65e,0xfffff441,0xfffff4c9,0xfffff2f2,0xfffff639,0xffffe5d6,0x00000c27,0x00001099,0xfffed9e1,0x0008b2eb,0x0005bb26,0x000415f3,0xfffff834,0xfffdbbab,0xfffabce5,0xfff6253d,0xfff52e87,0xfff43f80,0xfff9134d,0xfffbde09,0x00050579, -0x000fee62,0x001a4e2b,0x0021cc23,0x0029ae4d,0x0028a507,0xfff877cf,0x00042e68,0x0000ebd3,0xfffeb3b8,0x00008fc9,0xfffff8a0,0x000031a8,0x0000148e,0x000021d3,0x00001673,0x00001784,0x00001657,0x000018f4,0x00001872,0x0000191e,0x0000233e,0x000019ef,0xffff7742,0x000058f0,0x000907c6, -0x0007743c,0x000787df,0x0005714b,0x0003c815,0x0000f939,0xfffda0d3,0xfffb6415,0xfffaa2a5,0xfffa5218,0xfff9e22c,0xfff836bb,0xfff66fd0,0xfff297d0,0xfff1d659,0xfff2b50d,0xfff372f9,0x0007d607,0x000aa02b,0x0001dafc,0xffffc242,0xffffe05e,0xffff8fc5,0xffffdd92,0xffffb777,0xffffc105, -0xffffc874,0xffffce9d,0xffffcd7f,0xffffc8b9,0xffffc9b2,0xffffcc8b,0xffffbce2,0xffff8347,0x00010be7,0xffff46a1,0xfffa4191,0xfffac35a,0xfffa3dfc,0xfffa1ebf,0xfff93bc5,0xfff87afc,0xfff78f54,0xfff7db2a,0xfff7c32d,0xfff7a94d,0xfff9efdb,0xfffc2dd7,0xfffe9585,0x0000f86d,0x00031eed, -0x00054ef8,0x0007c8f5,0xfffbbf0e,0xfffc71a0,0xfffd78a8,0x000098f7,0x0000a210,0x0000dc4a,0x00004cc7,0x0000b506,0x0000a158,0x0000a165,0x00009913,0x000095bb,0x00008525,0x00009a97,0x0000422f,0x0000da0b,0x0000e85f,0xffffd87c,0xfffc2e3f,0xfffba90c,0xfffbbaab,0xfffafa5b,0xfffabc10, -0xfffa3a20,0xfff9f49f,0xfff9925c,0xfffa0cad,0xfffa71d1,0xfffa9327,0xfffa9374,0xfffa58c4,0xfffa0f9b,0xfffa5b77,0xfffab59a,0xfffabc29,0xfffb2e20,0xfffc1571,0xfffc5520,0xfffb1cf6,0xfffafd3f,0xfffaaa50,0xffff17b6,0xfffea06c,0xfffea710,0xfffe981e,0xfffea2d0,0xfffea49e,0xfffeae03, -0xfffeae36,0xfffec4cc,0xfffeb41b,0xfffef4ad,0xfffaca16,0xfffae113,0xfffb0add,0xfffb66b8,0xfffae87f,0xfffad55b,0xfffaa0c3,0xfffa801b,0xfffa59f4,0xfffa1303,0xfffa3bc9,0xfffa55c3,0xfffa9427,0xfffac26b,0xfffb0ab0,0xfffb4da0,0xfffb796e,0xfffb9e05,0xfffbe0e3,0xfffbfc25,0xfffa31ca, -0xffff238a,0xffff3919,0xffff5c4c,0xfffea133,0xfffe7433,0xfffe3a59,0x0000200a,0xffffff55,0x000070c8,0x000073dd,0x00007393,0x00007734,0x00007edb,0x00008914,0x00008f7d,0x0000036e,0x00002243,0xfffe246e,0xfffeab28,0xffff00de,0xffff8399,0xffff2d99,0xffff2a85,0xffff02ea,0xffff3948, -0xffff43d1,0xffff37b0,0xffff3bf5,0xffff2c49,0xfffee85a,0xffff2a00,0xffff4ab8,0xffffa5a9,0xffff5213,0xffff498d,0xffff5990,0xffff57a2,0xffff68e4,0xfffed18d,0xfffe9832,0x00007af9,0x00008ca2,0x000022d0,0xfffffdcc,0x000006c8,0xfffff145,0xfffff7dd,0xfffff841,0xfffff00e,0xffffe28a, -0xfffff07e,0x0000119b,0x00002a01,0x00007b92,0x00007953,0xfffef62c,0xffff4a3d,0xfffece85,0xfffe68a2,0xfffe29d0,0xfffeb827,0xfffeff6c,0xfffef832,0xffff2b47,0xfffef302,0xfffe334f,0xfffec708,0xffff3064,0x0000076b,0xffff59d3,0xffff33dd,0xffff6681,0xffff509f,0xffffa258,0xfffe16f3, -0x00006458,0xffffdadc,0xfffff59a,0x000003d7,0x00000fc9,0x0000051c,0x000006e4,0x00000651,0x00000388,0x00000778,0x00000d8d,0x00000ce0,0x00000ba9,0x0000096e,0xffffdcb2,0x000004bd,0xfffff829,0xffff8af3,0xffff1a1b,0xfffea0bd,0xfffe0bfc,0xffff1863,0xffff7304,0xffff27c6,0xffff3927, -0xfffeb7b1,0xfffd8e16,0xfffedce9,0xffff731d,0x00012d14,0xffff6c80,0xffff76a6,0xfffffbd2,0xffff8881,0xffff4c7a,0xfffe1de5,0x00006c72,0xfffff446,0x00002e91,0xfffff77d,0xfffffc03,0xfffffbf5,0xfffffdc1,0xfffffcf7,0xfffffdd1,0xfffffcc0,0xfffffa55,0xfffffc2e,0xfffff627,0x00000d8c, -0x0000087a,0x00002ab5,0xffffe7ee,0xffff3a7c,0xfffd9d11,0xfffc4e17,0xfffb7e1f,0xfffd5c22,0xfffe926f,0xfffe97e7,0xffff0d81,0xfffdfa9c,0xfffbc89a,0xfffd6527,0xffff25e2,0x0001aead,0xffff6518,0xfffed424,0xffffd3ec,0xffff8c60,0xffffb820,0x00003d85,0xffffd5c3,0x00004905,0xffffd12a, -0x000008f6,0xfffffe72,0x00000425,0x00000041,0x0000021c,0x000000d4,0x0000025c,0x0000015d,0x000004b3,0xffffff27,0x000004e0,0xffffddc7,0x0000463e,0xffff6595,0x00020307,0x000486db,0x00056f0a,0x0006b168,0x0004f2b2,0x000327ba,0x0001298e,0x000030e6,0x000100ef,0x0002454c,0x000490ac, -0x00038ea7,0xfffea6b1,0x00021279,0x00026706,0x0001fb2e,0xffffca28,0x000298e1,0x00015062,0xffff44d8,0x00006f7b,0xffffd8df,0x000014ad,0xfffff5b7,0x00000236,0xfffffd4c,0xffffffb4,0xfffffe9e,0xffffff31,0xfffffe0f,0xffffff3a,0xfffffc51,0x000005ee,0x0000003c,0xfffffd39,0x00006506, -0xfffe2992,0xfffc04a1,0xfffaa78e,0xfffa2194,0xfffadfa6,0xfffd343b,0x000034a0,0x000379bc,0x0003f08f,0x00016085,0x0000297c,0xffff3721,0xfffdeda0,0x0001bd4e,0x00037797,0x000407ce,0x0003653d,0x00007b6c,0x000057cf,0xfffffd3e,0xffffefc6,0x000002ca,0xfffffc3f,0x00000285,0x00000187, -0x0000016f,0x00000148,0x00000104,0x00000163,0x0000010c,0x00000239,0x0000006b,0x000000c4,0xfffff523,0x00001566,0xffffb8ed,0x00010f30,0x00037ac5,0x0004b703,0x0005dd3a,0x000531f6,0x0002d4c5,0xffff4040,0xfffc5290,0xfffc9e07,0x000098de,0x0002da08,0x0003658e,0x0002afdc,0xfffe10ee, -0xfffba552,0xfffcec0f,0xffff0f34,0xfffb6950,0xfffd0ccc,0x0000f7ca,0xffffb8a6,0x00003095,0xfffff3bd,0x000002f9,0xfffffa9f,0xfffffe79,0xfffffd7e,0xfffffe2d,0xfffffe54,0xfffffd31,0xffffff23,0xfffffa8f,0x00000769,0xfffffc02,0x00000f56,0x00001573,0xffff27a7,0xfffeb980,0xfffe6b80, -0xfffe88f7,0xfffeccbd,0xffffe238,0x00014b7f,0x000510e1,0x00058a8d,0x0003bc3c,0xfffd09fb,0xfffb2c04,0xfffe7b91,0x0000a761,0x00034baa,0x00061e35,0xfffe3567,0x00079f0b,0x00001d2e,0x00000361,0xffffff41,0xffffe52f,0x00000135,0x000003ed,0x00000695,0x000004b1,0x0000049a,0x00000333, -0x0000046d,0x000002d7,0x000006f7,0xffffff15,0x00000af0,0xffffd60b,0x00003bb7,0xffff83c8,0x000143e8,0x00011b24,0x0000808d,0xffffd87a,0xffff44b3,0xfffeb991,0xfffde484,0xfffdbfd5,0xfffdb8fc,0xfffed8c3,0xffffeba9,0x00024480,0x00052783,0x00076199,0x0008fd77,0x000ae546,0x0009bae4, -0xfffe10f0,0x00000da6,0xffff8cc0,0x00008372,0xffffe41e,0x00000f8a,0xffffece9,0xfffff757,0xfffff368,0xfffff79a,0xfffff83d,0xfffff86e,0xfffff67a,0xfffff8f8,0xfffff26a,0x000008b2,0x00000554,0x00004669,0xffff586c,0x0001ac2c,0x0001d89f,0x0001d5e9,0x0001903b,0x00012098,0x00008bab, -0xffffe5af,0xffff6e0a,0xffff3816,0xffff08b5,0xfffed17f,0xfffe6570,0xfffe0f16,0xfffcfc01,0xfffc8244,0xfffc9572,0xfffc9a7e,0x000230ef,0x0002c7e2,0xffff455d,0x00002727,0xffffe068,0x000016b1,0x0000146f,0x00001d24,0x000019cd,0x00001578,0x00001009,0x0000130f,0x00001375,0x0000152c, -0x00001024,0x000005d5,0xffffcf81,0xffffd8dc,0x00006d91,0xfffeebf3,0xffff1486,0xfffee787,0xfffee436,0xfffeb140,0xfffe8c5b,0xfffe57da,0xfffe60e2,0xfffe5600,0xfffe4b3d,0xfffedc36,0xffff686e,0x00000222,0x00008e3d,0x00011558,0x00019bd4,0x00021cee,0xffff2a89,0xffffa813,0xffff92dd, -0x00007578,0x00007765,0xfffffc44,0xffffd5cc,0xffffcd35,0xffffbade,0xffffc4b0,0xffffc40c,0xffffc856,0xffffc30c,0xffffd145,0xffffd8bf,0xfffffcfd,0x000065d4,0x0000bdb4,0xffff0100,0xfffe79be,0xfffec46c,0xfffe8ff8,0xfffe90a5,0xfffe79fd,0xfffe72ff,0xfffe6588,0xfffe96c7,0xfffec1c1, -0xfffeda4a,0xfffeea0d,0xfffeeb27,0xfffeeb7d,0xfffefb02,0xffff0ca9,0xffff0919,0xffff2b05,0xffff43fe,0xffff4afb,0xfffed1ec,0xfffed1af,0xfffe92a1,0x000084ec,0x000056b8,0x000093e9,0x0000991b,0x00009728,0x0000986b,0x000097a4,0x00009b07,0x00009b74,0x00004c8e,0x0000895e,0xfffe615a, -0xfffe87fe,0xfffe5cdc,0xffff0514,0xfffec90e,0xfffeca1c,0xfffec288,0xfffebd15,0xfffeb802,0xfffea922,0xfffeb9a9,0xfffec560,0xfffeda7f,0xfffeeb5e,0xffff01ba,0xffff18b4,0xffff1e73,0xffff275b,0xffff3500,0xffff3e52,0xfffec5f4, +const Word16 defaultHRIR_rom_AlphaR48_fx[470 * 128] = { +2196,2055,2634,445,-369,-977,986,-254,-1006,-1055,-992,-750,-965,-1016,-964,-253,725,-1060,-270,350,2396,1908,2023,2056,2065, +2085,2102,2123,2160,2205,2258,2307,2385,2350,2307,2200,2195,2575,2233,-523,1684,585,688,1092,956,1429,995,518,902,1045, +933,514,811,791,1014,-314,1774,2130,2067,2234,2242,2311,2356,2403,2493,2631,2806,2983,3172,3150,3010,2706,2561,2977,2095, +591,1011,269,461,408,379,57,691,-152,817,30,502,72,464,473,472,305,1196,2087,1942,2289,2301,2431,2525,2634, +2820,3088,3368,3714,4075,3996,3727,3150,2814,3273,1673,270,926,506,332,410,295,237,110,289,53,30,188,121,277, +-122,439,-16,923,1804,1830,2217,2240,2414,2554,2662,2934,3355,3849,4446,5093,5049,4574,3661,3005,4523,2532,658,805,355, +157,446,191,212,162,194,176,76,-24,79,263,93,504,121,1067,2259,2282,3041,3278,3612,3777,4275,4593,4615,5428, +5629,5481,5301,4970,4669,4123,4933,2098,225,1075,1033,517,716,231,258,-1,142,124,108,221,270,345,121,552,96, +1255,2535,2606,3478,3691,4092,4415,4374,4434,4550,5110,5456,5611,5761,5605,5431,4662,6428,2877,-190,1267,-29,914,-148,388, +80,386,202,110,206,225,288,576,255,727,377,1175,2633,2590,3447,4129,4967,5733,6061,6050,5669,5084,5152,5737,6137, +6505,7335,6358,7085,3390,494,2002,163,1000,442,289,76,327,438,259,155,40,337,270,292,845,-90,1371,2446,2406, +3060,3621,4193,4593,5062,5305,5370,5575,5591,5533,5619,5677,6238,6170,6175,4135,451,944,1127,247,878,783,163,302,65, +247,345,290,318,233,570,692,-88,1583,2478,2142,2383,2699,3323,4093,4559,4990,5375,4956,4762,5020,4817,4977,5609,5591, +4324,3122,217,850,365,231,603,356,556,433,764,151,197,347,527,546,803,797,410,1493,2581,2336,2535,2814,3105, +3254,3371,3359,3332,3492,3793,4050,3975,3870,3815,3729,3278,2082,789,1472,576,708,506,406,-34,723,-282,1030,-35,552, +1,543,343,608,339,1497,2328,1834,2043,2136,2343,2452,2860,3192,3520,3612,3661,3739,3626,3457,3405,2945,2576,2360,-709, +1681,540,701,1255,1110,1758,1302,665,1150,1399,1254,697,1077,1100,1228,-365,1879,2080,1958,2050,2011,2040,2021,2269,2419, +2586,2712,2857,3013,2885,2757,2704,2515,2417,3051,508,-406,-1144,1203,-333,-1235,-1327,-1280,-964,-1242,-1330,-1260,-349,861,-1379, +-387,388,2889,2284,2379,2383,2380,2385,2356,2418,2461,2508,2575,2633,2723,2660,2630,2593,2571,2815,6056,5670,6409,4305,2553, +-6,4941,2694,221,98,90,314,-38,-97,-104,2582,4458,-348,2500,3937,5899,5252,5524,5587,5635,5692,5752,5828,5925,6034, +6167,6294,6500,6409,6311,6055,6010,6795,6679,2118,5399,3677,3518,4187,3749,4449,4129,3327,4000,3909,3781,2911,3380,3792,3853, +1791,5311,5528,5717,6007,6116,6292,6469,6653,6917,7255,7667,8116,8652,8603,8298,7516,7192,7527,6418,4204,4260,2660,2731,2461, +2371,1665,2451,1314,2753,1256,2307,1498,2300,2479,2418,2635,3940,5206,5396,6086,6285,6640,6983,7369,7866,8518,9218,10102,11085, +10891,10313,8773,7972,8153,5939,3334,3680,2522,1969,1805,1185,979,619,885,277,371,623,584,1079,456,1563,1195,2920,4413, +4879,5763,6013,6516,7002,7471,8256,9239,10429,11970,13783,13760,12721,10242,8640,10866,7777,5264,4026,2500,1913,2199,1420,1220,911, +889,677,487,289,677,1177,1089,2020,1994,3764,6147,6877,8578,9341,10247,10965,11941,12701,12875,15261,15879,15492,14726,13825,12989, +11479,12890,7589,4448,4855,4615,2914,2598,1437,1195,628,774,750,704,1033,1223,1509,1692,2582,2209,4431,6809,7450,9309,10221, +11509,12755,13213,13726,14062,15608,16431,16482,16544,15982,15284,13511,15947,10153,4128,5118,2821,3799,1215,1850,947,1533,1345,880,1036, +1236,1453,2415,2042,2884,2897,4187,6671,7279,9216,10541,12305,14146,15368,16079,16123,15117,14898,15532,15738,16330,17419,16360,15681,11159, +6110,6544,2652,3878,2162,1767,1016,1548,2421,1433,962,1073,1846,1785,2393,3600,2251,4620,6231,6638,8150,9892,11414,12532,13866, +14642,14945,15869,16092,16060,15199,14373,14009,15025,14462,12023,6278,5416,4868,2675,3273,3318,1682,1910,1311,1472,1610,1668,1935,1922, +2833,3207,2269,5798,7046,6750,6834,7809,9266,11210,12447,13644,14655,14203,14009,14732,13950,14057,14442,14747,11660,10048,5019,5196,3254, +3036,3216,2371,2608,2218,2972,1392,1534,1931,2546,3103,4012,3947,3621,5690,7497,7206,7178,7901,8689,9397,10082,10570,10997,11501, +12095,12436,12251,11959,11328,11351,9661,7761,5302,6023,4029,3798,3054,2551,1675,3092,1400,3966,1377,2997,1666,3110,2894,3582,3536, +5606,6991,6324,6744,7155,7643,7954,8952,9759,10562,10896,11160,11484,11153,10776,10464,9560,8060,8128,1693,6503,4302,4296,5472,4933, +6253,5885,4522,5704,5767,5532,4204,4875,5350,5161,1815,6669,6688,6708,6873,6915,7062,7135,7675,8025,8409,8692,8995,9369,9011, +8727,8533,8210,7595,8724,5423,3085,-327,6654,3264,-164,-375,-412,56,-518,-626,-572,3189,5949,-987,3018,5042,8265,7199,7489, +7489,7514,7528,7489,7620,7721,7828,7985,8120,8331,8184,8117,8006,7990,8715,3420,3260,2349,5566,6579,6420,4521,6148,6442,6469, +6321,5903,6149,6206,6071,6029,4729,6205,6140,5359,2357,3053,3001,3025,3077,3128,3189,3270,3313,3341,3344,3359,3382,3383,3379, +3388,3231,3499,3917,7140,3745,4909,4553,3824,3745,2942,3528,4203,3664,3322,3527,4002,3810,4091,3767,5627,3290,2829,3162,3143, +3296,3428,3638,3891,4052,4113,4092,4134,4233,4278,4265,4209,3988,3303,4212,5541,4226,4398,3778,3471,3124,3208,2208,3300,2060, +2865,2507,3006,2822,3209,3291,3985,3222,2401,3048,3066,3378,3669,4044,4505,4747,4887,4941,4989,5063,5130,5154,4997,4516,3439, +5176,5562,3471,3028,2792,2136,1512,1063,906,635,674,705,659,896,1213,1812,1777,2772,2433,1939,2440,2613,3050,3470,4038, +4807,5286,5433,5422,5550,5818,6071,6117,5732,5102,2954,4312,6762,4803,3927,3361,2339,2025,1530,1167,1187,893,902,930,1277, +1535,2076,2449,3780,3678,3713,4935,5157,5658,6265,7346,7149,7441,8064,8353,8249,7624,7070,6734,6692,5699,4269,7054,8673,5916, +4907,4021,2788,2526,1732,1485,1335,1121,1040,1133,1330,1781,3011,3384,4744,4311,3771,4376,4008,4770,5589,6748,8395,9566,10068, +10439,10326,9215,8726,8018,7218,6511,3125,7932,10073,5773,6775,4264,4020,2555,2025,1903,2612,1856,1861,2121,2205,2598,3754,3408, +4480,3955,2571,3522,3415,2852,2532,2628,3721,5648,8269,9855,9374,7545,6388,5344,2992,4302,684,6766,9878,4884,5660,3597,3124, +2524,2186,2330,4231,2186,1583,2329,2709,3181,4080,4116,5401,3999,2577,3192,3184,3972,4283,4557,5122,5833,6637,8066,9097,9710, +7892,6351,3956,3846,3416,5138,9770,6690,4900,4789,3574,3521,3402,3124,3381,2513,2402,2846,3392,3901,4250,4715,6231,5547,4445, +4847,3924,4265,4255,4540,4883,5483,6204,7957,9178,9815,9749,8963,6662,6376,6294,6873,9911,7509,6220,5781,4483,3915,3640,3610, +3491,3128,2987,3162,3587,4456,5170,5595,6560,6151,5351,5525,4424,4377,4598,5388,6347,7684,9136,9646,9718,9606,9965,9778,8734, +8273,7409,8174,8313,6789,6599,5635,5169,4324,4686,4122,4931,4281,4441,4597,4759,5078,5603,5829,6661,6029,5482,6262,6411,6692, +6695,6747,6887,6963,7035,7494,8023,8529,8523,8690,8728,8536,7051,7460,8889,7228,7733,7261,6626,6314,5888,6501,6871,6610,6008, +6146,6498,6463,6770,6445,7356,6785,6633,7062,7184,7493,7792,8123,8015,8007,7969,7944,7848,7853,7659,7543,7357,7381,6432,5916, +8727,9170,7939,7901,8914,8101,8176,8048,7706,7877,8015,7859,8817,7956,7763,8926,8487,5715,6214,6312,6373,6462,6508,6622,6580, +6585,6585,6567,6557,6549,6514,6490,6431,6443,6887,-1424,-1304,-2178,-256,1830,5438,-1205,1464,4816,4931,4923,4784,5121,5215,5276, +1543,-708,5737,1807,58,-1773,-1056,-1354,-1402,-1415,-1418,-1398,-1403,-1447,-1506,-1648,-1781,-2033,-1881,-1802,-1591,-1644,-1831,-1962,3105, +-1111,555,751,-228,109,-896,-682,243,-530,-321,-249,973,596,45,312,2812,-1069,-1074,-1304,-1531,-1563,-1565,-1482,-1435,-1540, +-1770,-2210,-2707,-3428,-3224,-2978,-2306,-2181,-2131,-1247,209,-236,1092,901,869,538,1047,256,1411,28,1568,436,1419,775,891, +1257,1094,151,-889,-1085,-1663,-1712,-1704,-1543,-1469,-1605,-2014,-2740,-3816,-5265,-4714,-4221,-2725,-2286,-2064,-179,1359,71,566,945, +729,739,434,548,434,834,696,645,857,824,1650,1199,1757,763,-311,-799,-1510,-1505,-1463,-1104,-769,-1051,-1657,-2952,-4905, +-7580,-7084,-6097,-3591,-2352,-4775,-3083,-861,355,967,919,38,447,221,306,589,728,898,964,955,919,1395,1399,1962,660, +-1173,-1619,-3179,-3602,-3866,-3634,-4101,-4099,-3078,-6777,-7640,-7513,-6556,-5934,-5438,-4657,-8151,-934,2560,1182,447,1452,1110,1880,1266, +1270,1290,650,448,232,353,587,1157,1109,2372,614,-1398,-2072,-4504,-5487,-6748,-7690,-7043,-6477,-5685,-7212,-7861,-8188,-7632,-7468, +-7854,-7950,-10166,-4028,3028,708,2443,427,2661,1273,1550,1136,2439,1925,1836,1613,1262,583,1947,1309,1405,500,-2203,-3157,-5579, +-6907,-8659,-10432,-11305,-11026,-9404,-6029,-4501,-5080,-3933,-5095,-7465,-8765,-7200,-4554,470,-470,2813,439,1717,1394,1680,1692,3306,1338, +1016,1699,1330,2024,2048,1108,2637,75,-1733,-2241,-3921,-5796,-7414,-8365,-9277,-9094,-8003,-7528,-6215,-5330,-2981,-824,1463,-4284,-5188, +-5870,-226,175,280,1967,990,388,2123,1887,3228,1981,1717,2020,2133,2732,2069,2384,4040,-67,-1911,-1817,-2033,-2891,-4343,-6253, +-7212,-7891,-7945,-6289,-4501,-4049,-1596,-1669,-2500,-4292,-3406,-2787,2648,1440,2805,2270,1505,1845,1912,2452,1339,2871,2488,2215,1840, +1686,1207,1871,2971,451,-1444,-948,-1340,-2052,-2836,-3384,-3868,-3824,-3293,-3203,-3078,-2490,-1312,-856,-520,-1894,-1158,523,3093,1405, +3191,2696,3057,2827,3844,1950,3855,929,4068,2163,4018,2549,3115,2631,3061,821,-551,741,671,279,-247,-532,-1385,-2072,-2836, +-2779,-2645,-2550,-2061,-1326,-416,-176,-324,-612,7799,813,3395,3164,1218,1504,-248,228,1844,246,99,235,2378,1856,1385,1915, +6670,571,864,1142,1260,1504,1663,1889,1231,842,411,140,-201,-569,-430,-407,-474,-324,-739,-2373,2124,5279,9992,8,4607, +9242,9537,9516,8945,9632,9787,9679,4522,739,10518,5047,2326,-2004,-462,-724,-618,-515,-412,-189,-378,-483,-601,-808,-987,-1215, +-1176,-1176,-1151,-1183,-1556,1100,1026,1885,-649,-1992,-2473,107,-1638,-2448,-2514,-2421,-2017,-2267,-2286,-2199,-1570,-139,-2261,-1623,-592, +1638,1048,1117,1049,1001,963,961,887,880,899,933,971,990,1068,1052,909,1106,1426,1260,-2318,900,-461,-308,307,216, +854,490,-73,435,597,352,-30,182,158,493,-1117,1258,1584,1376,1287,1150,1069,1052,832,767,837,916,945,848,1028, +1069,835,1136,2447,1657,-247,424,-438,30,-4,125,-217,683,-11,1091,193,529,212,572,345,570,267,1182,1925,1409, +1211,910,711,725,371,388,503,540,667,592,1048,1001,707,1456,3159,1294,-51,1309,603,392,582,591,660,638,1074, +697,781,850,953,998,740,1205,864,1802,2496,2188,1903,1529,1381,1475,927,767,928,974,691,20,431,545,629,1664, +6000,3607,-372,931,440,499,1160,550,385,423,523,820,784,603,568,753,915,1072,400,604,437,-838,-1730,-2524,-3381, +-4347,-3666,-3418,-3253,-3145,-1459,1452,2697,3047,2211,2967,5343,300,-2600,252,779,726,1184,1085,1213,1005,1299,617,397,288, +646,622,-14,90,-408,839,1624,1166,1129,214,-988,-2598,-4620,-5626,-5390,-5141,-3793,-441,1099,2756,3935,3419,9543,668,-3898, +552,-2359,206,-531,824,798,1097,1900,1411,1251,683,602,672,70,1167,472,1632,3657,2570,2260,2923,3202,3136,1922,-25, +-2624,-2793,-293,3649,6506,7855,10593,8735,11447,4060,-1897,2587,-201,1737,1150,1552,1051,1454,2025,949,758,956,774,844,627, +966,-193,1563,3585,3000,3044,1794,1639,2047,1952,1843,1576,592,57,-315,3636,6487,9967,8477,5197,3622,-1548,436,1575,784, +1115,410,591,834,1390,1411,1279,846,392,330,185,198,-754,-235,807,990,2895,2810,2989,2533,2421,1727,791,-1777,-2843, +-2840,-1413,234,3122,2823,-161,-23,-3097,-1586,-833,-979,-96,431,642,643,206,1218,1327,1059,748,106,-606,-569,-1021,-1348, +-407,272,2263,2843,2725,1651,375,-1382,-3001,-3524,-3411,-3276,-3059,-2503,-1431,-1379,-2036,-2305,-1156,-395,309,580,569,904,658, +508,229,-21,540,-31,369,-166,-413,-493,-940,-531,208,271,532,479,752,1110,943,926,879,34,-849,-1704,-1961,-2307, +-2471,-2371,-2194,-2614,-1206,-2284,-1871,-1742,-1692,-1507,-1570,-1717,-1635,-1723,-1323,-1454,-1059,-1200,-1347,-963,-164,-1796,-1728,-1860,-1849, +-1995,-2210,-2402,-2456,-2550,-2584,-2569,-2467,-2477,-2351,-2288,-2242,-2296,-2194,-2386,-2698,-2414,-278,-2794,-2529,-839,-844,-823,-730,-735, +-809,-734,-2479,-2595,-114,-2370,-2464,-2058,-1880,-2004,-2017,-2000,-1940,-1909,-1950,-1996,-2055,-2090,-2138,-2176,-2203,-2231,-2226,-2284,-2504, +1652,1707,1635,2459,2231,660,2236,2077,992,970,942,802,826,793,649,2036,2127,528,1969,2130,1346,1473,1522,1519,1490, +1447,1398,1334,1300,1277,1345,1451,1655,1643,1686,1716,1754,2166,2419,2084,2135,2027,1692,1640,1590,1569,1790,1941,1850,1600, +1619,1463,1465,1777,1465,1627,1709,1506,1734,1699,1689,1582,1444,1253,1163,1112,1191,1424,1979,1999,2207,2286,2389,2609,2859, +3354,2751,2119,1642,1440,1552,1377,1172,1563,1247,1193,1079,1236,1261,1266,1176,1705,1514,1359,1743,1666,1597,1286,932,524, +216,143,390,1182,2460,2401,2742,2633,2819,2539,2979,3198,2783,2093,1371,1009,1013,844,869,951,770,810,607,866,831, +947,896,1597,1410,1329,1795,1831,1838,1534,1000,310,39,-296,-170,777,2674,2688,3172,3056,3146,6908,8095,7190,4917,4126, +3696,3289,2275,1677,1178,1048,865,685,500,671,771,1129,683,909,1124,1452,1767,1645,663,-445,-1356,-2334,-3156,-4348,-191, +1861,3944,4304,5407,6561,6869,10452,6066,3844,3067,2805,1897,1386,1021,1259,1265,1246,1041,1032,792,1114,1142,1158,1081,1270, +2058,2160,2699,3755,4561,5161,5217,4175,3206,1929,3182,3933,5604,3943,4858,7319,10458,5586,8421,5691,3562,3377,2648,1689,1313, +1297,1266,1928,883,499,289,929,1471,1230,2082,2988,3200,4052,5264,6149,5875,5611,5437,5719,5761,5222,3700,2468,1994,-1440, +-2603,-4302,2259,-5584,3960,6379,1862,2464,1828,1591,1669,1563,1362,1410,1227,1375,1182,1372,1231,1426,1804,2417,3393,4140,4582, +4824,5351,5756,5771,5535,4506,2775,1607,82,-612,-4122,-7249,-12856,-6422,-6227,278,4939,3056,1690,2259,1218,928,1052,856,522, +1175,1134,499,452,325,850,424,330,1686,3172,4406,5211,4951,4827,4714,4234,3503,2285,1249,-499,-1880,-4511,-5441,-7050,-5609, +-2965,-1083,1680,882,756,774,582,1273,256,-90,41,395,699,549,574,462,303,419,185,950,1681,2212,3399,3743,4087, +4238,4432,4413,3918,2982,1460,-785,-2254,-3072,-4185,-3043,-2240,-1424,-1249,-1064,-467,-181,-109,95,124,219,272,239,13,254, +24,255,224,349,438,590,900,1078,1301,1831,2386,2967,2581,2280,2142,1308,567,-250,-1069,-2070,-3452,-2599,-1775,-1592,-1970, +-1184,-1194,-1260,-874,-738,-509,-450,-418,-206,-302,-165,-549,-728,-649,-1001,-1559,-1195,-1476,-1584,-1783,-1918,-2114,-2209,-2322,-2397, +-2475,-2601,-2679,-2743,-2536,-2207,-1983,-1801,-1407,-1257,-1356,-1702,-2741,-878,-1320,-2295,-2318,-2267,-2286,-2284,-2250,-2245,-1165,-776,-2501, +-1366,-1072,-1136,-1295,-1326,-1400,-1488,-1580,-1706,-1702,-1720,-1745,-1704,-1675,-1697,-1575,-1519,-1427,-1413,-1283,583,573,280,360,1042, +2286,144,749,1883,1897,1899,1942,1954,1948,1963,737,222,2102,827,340,446,573,545,620,645,662,649,643,597,535, +463,371,230,209,283,545,460,450,214,1950,493,998,934,612,670,424,398,628,469,618,527,860,848,597,771, +1214,380,588,565,750,846,903,836,849,751,538,356,100,-188,-397,-319,304,258,-137,134,1017,915,1509,1044,909, +706,720,688,929,769,942,603,835,775,898,848,763,541,645,770,1061,1230,1301,1098,1001,678,314,156,-318,-877, +-1367,-1030,147,-103,-1002,171,1179,283,1112,996,685,634,410,480,916,873,799,713,842,939,838,1075,939,488,554, +600,934,1207,1233,877,782,422,-29,-326,-685,-1193,-1949,-1757,-555,-786,-3298,-228,2983,2188,2552,2018,1111,1577,1230,981, +1106,896,785,426,821,965,823,1046,1001,1215,1723,2160,3181,3439,3687,3546,2547,1878,1452,308,-2421,-5925,-6888,-6131,-3651, +-2088,-9142,157,4454,1145,434,1051,645,814,860,1015,1071,1051,1081,789,787,881,1194,1424,1648,1230,799,895,1234,1395, +1742,2178,2889,2966,2410,965,-1151,-4725,-7073,-9326,-11656,-8880,-18093,-5379,3251,-1156,2890,67,2400,768,1208,999,1734,631,279, +430,989,1106,1580,1537,2028,1335,-68,69,-279,-634,-1176,-1931,-2631,-2871,-2409,-3163,-5462,-9267,-11186,-12758,-16301,-16421,-15980,-12370, +-3521,-4463,519,-1457,310,-213,961,460,-154,1011,1517,737,991,960,828,521,1701,1187,302,268,-758,-860,-2282,-4483,-6318, +-7555,-7844,-8340,-8451,-8704,-10416,-10859,-10949,-13054,-9141,-10172,-6123,-4286,-3677,-1482,-1328,-744,218,326,55,597,687,492,732,857, +1112,992,1335,747,812,482,-1055,-2376,-3612,-4184,-5376,-5613,-5071,-2842,-1944,-2667,-3935,-6083,-8361,-9019,-4963,-5460,-2216,-1692,-621, +-290,-272,119,40,137,173,163,162,193,-39,-168,160,75,542,716,179,-112,-1191,-1835,-2092,-1735,-1778,-1161,-474,-752, +-1247,-1166,-2037,-3226,-4366,-4928,-2257,-2249,-2664,-2648,-2505,-1825,-1146,-630,-443,-411,-237,-346,95,-137,174,-154,-261,-418,-156, +-1338,-2378,-2399,-2734,-2926,-3345,-3743,-4081,-4431,-4749,-4277,-3844,-3466,-3197,-2854,-2625,-2504,-1043,-1091,-1309,-574,-724,-586,-547,-393, +-417,-726,-760,-910,-805,-873,-938,-1041,-1144,-1091,-1097,-1271,-1070,-1151,-1246,-1202,-1100,-1032,-1146,-1157,-1223,-1307,-1433,-1519,-1434, +-1403,-1323,-1246,-776,-570,-1733,-1705,-1362,-1325,-1419,-1098,-1109,-1011,-949,-906,-932,-891,-1464,-1429,-1050,-1557,-1692,-930,-1015,-1098, +-1102,-1196,-1311,-1405,-1324,-1261,-1191,-1157,-1105,-1080,-1005,-941,-867,-831,-799,1979,1482,1694,1449,785,-107,1812,995,-112,-146, +-145,-19,-138,-150,-181,964,1787,-243,925,1608,1940,1734,1848,1908,1968,2042,2128,2193,2275,2372,2380,2292,2116,1909,1734, +1493,1545,1040,1378,537,1440,1253,1085,1382,1247,1575,1640,1474,1739,1636,1533,1228,1322,1607,1584,756,1895,1847,1987,2177, +2267,2408,2603,2739,2974,3301,3564,3475,2968,2428,1810,1145,1125,62,425,363,591,825,906,863,770,704,1061,1127,1475, +1003,1208,1010,1272,1347,1417,1375,1573,1871,1988,2477,2745,3157,3692,4006,4570,5049,5283,4764,3549,2527,1366,223,172,-547, +-151,-45,81,550,712,574,266,402,492,1020,819,938,808,946,1129,1107,1335,1058,1363,1764,2004,2562,2712,3135,3724, +4098,4752,5873,6926,6716,5204,3647,1820,-181,-443,-5483,-4437,-2329,-936,-709,-481,-262,545,602,833,974,1051,1026,687,1058, +1284,1337,1932,2053,2165,2066,2379,3537,4995,6396,7317,8830,9583,10091,6707,4075,1283,-1182,-3551,-6023,-5472,-8343,-6012,-3409,-1815, +-1070,126,515,787,818,959,1245,1034,952,770,984,1129,1270,1605,1444,1717,2385,2730,3254,3260,3176,3191,2680,2374,2810, +548,-965,-3066,-827,-1604,-4665,-8026,2245,-8015,-8715,-3747,-4164,-1868,-1059,260,268,693,1390,881,767,928,1106,1322,1301,1383, +1175,1582,2346,1733,1520,1754,2260,2993,1698,-309,-2508,-5154,-5705,-4775,351,4914,11904,5497,14107,597,-7479,-75,-2766,69,-404, +-199,317,641,-181,1206,1223,666,785,818,874,994,643,1048,1083,1106,1569,1446,1275,1129,1033,988,1044,1343,1477,1128, +4473,6804,12113,10719,9493,5277,-3705,-1581,23,-1579,-79,807,-149,246,196,629,745,849,951,883,674,1179,1197,1599,1147, +246,-787,-66,708,1655,2479,3085,3350,2016,1888,2688,3578,4804,7628,7285,4422,3646,-3194,-1106,-1382,-792,163,-279,648,617, +716,136,232,587,380,569,1128,645,415,444,457,-31,-860,-412,-146,145,-299,-1009,-1485,-1266,-301,975,1324,1786,3097, +3061,2137,616,104,1203,164,233,-96,25,-477,255,-421,651,-501,2,-652,-542,-1014,-1118,-1345,-914,-694,-1368,-1580,-1883, +-2195,-2622,-1724,-924,-232,156,453,813,1451,2013,2696,1962,2239,2378,-1470,1287,294,475,1270,1152,1748,1636,944,1506,1604, +1484,530,675,860,696,-1284,1007,1010,889,897,825,854,731,1287,1588,1957,2286,2641,2931,2722,2481,2402,2257,2079,2747, +1208,-173,-2107,1874,-102,-1859,-2016,-2087,-1914,-2212,-2355,-2333,-203,1414,-2635,-534,634,2382,1821,1951,1946,1950,1959,1913,2020, +2091,2170,2258,2339,2507,2401,2370,2282,2303,2531,-915,-1120,-1729,491,1841,3007,-158,1725,2975,3073,3071,2840,3128,3161,3074, +1779,218,3268,1888,754,-1343,-742,-898,-895,-898,-901,-915,-884,-864,-832,-875,-897,-880,-972,-1069,-1193,-1264,-1749,-1619,1702, +-740,442,411,-115,272,-280,49,746,157,49,155,744,430,397,188,2023,-648,-948,-883,-964,-970,-1005,-1014,-952,-907, +-840,-939,-972,-934,-1066,-1221,-1478,-1636,-2660,-1960,-269,-520,282,167,347,666,1095,400,1360,112,1167,279,929,426,576, +680,848,-3,-1023,-819,-1033,-983,-972,-919,-672,-517,-429,-800,-1021,-965,-1247,-1695,-2365,-2436,-2689,-1873,-316,-217,-317,-306, +-218,536,528,754,642,919,752,420,579,390,1253,458,1124,290,-831,-808,-916,-846,-843,-734,-413,-178,-162,-615,-984, +-987,-1311,-1751,-2366,-2303,-2623,-3011,-3000,-1701,-666,177,303,202,331,552,726,816,869,779,813,631,1101,599,1151,216, +-980,-701,-1536,-1930,-1874,-866,-933,-1095,-1660,-2165,-1336,-190,232,-279,-1663,-3239,5900,-1914,-4573,-2112,-1524,-1107,-456,159,427, +793,1101,881,807,475,788,821,1012,838,1580,518,-265,-14,-728,-554,-893,-1501,-2078,-3102,-4669,-4568,-4450,-3447,-1630,1388, +6388,6269,8996,5048,-557,770,-825,341,-627,64,102,233,788,1009,1067,832,977,606,1139,353,978,427,-827,-226,-583, +-2654,-4052,-4747,-3728,-2518,-1556,-923,-1355,-903,-2735,-2901,-2196,4141,-1560,7698,5904,1809,514,758,316,581,931,1204,840,1138, +770,290,120,338,481,151,1438,-371,-1497,-851,-541,-273,549,1544,3116,3519,2472,2804,2631,3416,-165,-3735,-9813,-3486,-2774, +3163,7195,4327,2520,2066,1304,1200,702,478,810,744,681,573,668,537,-92,-109,1166,-615,-1480,-409,350,1899,2927,3403, +4134,4056,3194,1909,350,-412,-1855,-2066,-3533,-1914,137,1579,3887,2088,1482,1487,935,703,272,286,373,346,440,715,647, +733,353,760,592,0,-209,-177,3,14,306,920,1804,2330,2378,2066,1112,-799,-813,-258,189,787,660,1537,1857,1423, +1885,1290,1011,553,940,673,1145,801,854,1041,690,1004,1296,1111,625,1451,2161,2132,2359,2520,2762,2927,2742,2572,2477, +1962,1674,1411,1175,808,449,856,761,943,2591,1079,1656,1527,1090,1142,771,1123,1556,1350,1086,1366,1559,1661,1434,1354, +1427,1935,1720,1634,1599,1460,1290,1191,1131,1022,895,781,657,514,580,738,780,873,766,377,2160,2840,2764,1570,2668, +2826,2931,2891,2692,2845,2954,2881,2725,1883,2527,2827,2334,1163,1200,1280,1264,1315,1377,1434,1280,1159,1042,943,835,686, +724,711,713,713,848,-457,-190,190,-1525,-1930,-1093,-1173,-1778,-1074,-1095,-1029,-814,-921,-932,-847,-1704,-1326,-784,-1700,-1488, +-116,-361,-382,-424,-443,-485,-551,-624,-726,-859,-947,-956,-945,-640,-418,-115,-125,563,-216,-2185,-419,-1189,-874,-601,-466, +-234,-493,-804,-615,-419,-628,-637,-605,-849,-539,-1083,-462,-168,-399,-464,-489,-555,-723,-841,-1154,-1610,-2041,-2134,-1954,-1199, +-536,259,290,1976,157,-1182,-285,-889,-559,-402,49,-83,326,-192,294,-82,-201,-343,-316,-461,-368,-667,-310,40,-326, +-540,-647,-805,-1213,-1448,-2071,-2787,-3434,-3644,-3296,-1813,-445,1234,1257,3415,223,-1024,316,-57,-403,25,706,701,694,974, +818,660,481,490,412,375,480,140,167,205,-108,-406,-425,-613,-916,-1070,-1910,-3234,-4882,-5516,-4997,-2750,-733,1956,2112, +5036,2265,-864,-615,21,368,911,480,564,557,561,685,708,515,429,243,67,-186,-579,-336,-145,-798,-1625,-1957,-2592, +-3530,-4875,-5644,-6342,-5606,-4687,-4109,-1613,699,3758,3950,598,1983,583,-365,-268,-855,-612,-570,-51,266,803,827,788,538, +599,430,283,26,-111,-827,-1082,-1440,-2117,-3596,-4973,-6239,-6116,-6084,-6756,-4069,-2427,-979,-3260,-4070,-3737,-876,-11223,114,4143, +592,2100,723,1086,122,769,629,217,1064,1101,236,402,-277,-480,-1131,-1350,-1804,-2666,-2533,-2071,-1149,-700,-973,-67,860, +1545,4140,5590,5735,1731,-3163,-11396,-11212,-10650,-8279,-429,-2617,478,-926,143,-193,763,718,240,703,552,-544,-606,-724,-1241, +-1300,-1458,-1707,-531,-158,-266,311,747,932,1349,2245,3666,2667,1920,984,-704,-843,-1363,-5524,-1877,-5261,-3451,-2182,-1823,-347, +-173,-146,642,856,846,692,619,390,-48,-356,-460,-903,-1659,-2079,-1399,-855,954,1060,1333,1441,1206,1147,1677,2575,2523, +1172,403,-1012,-2350,-1847,-1690,-2995,-381,-94,598,504,164,100,90,341,643,796,791,672,856,507,-58,-173,-305,-4, +458,762,1626,1321,1005,498,-16,-124,-109,-398,-623,-73,-166,-489,-1285,-1483,-572,-480,-616,-990,-752,-445,54,303,469, +307,356,335,978,889,1385,1551,1862,2014,1930,2146,1950,1773,1526,1358,1298,1327,755,202,-371,-274,-231,-179,-437,-498, +-379,-497,-425,-674,761,-52,178,154,-154,-126,-301,-406,-337,-488,-338,-420,135,265,317,672,1602,793,759,852,905, +912,834,789,463,312,109,-42,-228,-377,-313,-341,-417,-469,-142,-367,-670,-269,1225,-788,-273,939,996,1043,1113,1156, +1172,1189,-164,-461,1631,219,8,4,138,56,31,23,37,85,67,47,29,-39,-94,-177,-192,-208,-193,-222,-206, +609,915,913,1353,724,-968,1332,704,-576,-593,-623,-744,-760,-799,-917,612,1068,-1101,473,930,416,422,467,436,443, +443,470,434,408,372,401,431,451,531,663,892,984,1574,1855,765,1281,1018,780,855,623,765,941,882,970,717, +692,367,322,643,340,105,472,196,349,243,259,248,300,228,194,135,154,200,363,520,903,1485,1746,2490,2356, +2251,1852,1309,1004,846,722,706,576,740,613,444,401,346,296,73,52,375,41,-186,9,-107,-105,-173,-121,-363, +-530,-650,-476,-217,34,405,1109,2383,2720,3148,3288,3057,2186,1991,1511,1130,618,606,598,688,649,566,111,336,124, +254,-102,361,-325,-635,-241,-436,-475,-543,-469,-771,-904,-1022,-1016,-897,-323,249,1661,3544,3839,-1576,533,2487,963,759, +738,730,1092,1092,906,675,672,638,583,376,66,225,-420,-20,-437,-950,-729,-1227,-818,-1299,-2437,-2627,-2740,-2480,-313, +994,2478,969,-101,-1069,-66,-7421,-1800,1290,171,318,550,206,-143,53,390,607,946,954,581,459,254,187,-305,-580, +-891,-1367,-1122,-652,-143,404,1042,1449,2661,4853,5116,5660,5866,3768,1087,-3587,-6493,-290,-6607,-4285,-2259,-1259,-726,56,45, +874,904,44,956,691,-366,-368,-693,-1416,-1141,-1462,-527,1717,2646,4539,7263,9157,10312,9962,8902,7585,5406,5036,4337,6228, +8123,11428,5044,11297,-305,-5407,-281,-1193,-11,-228,-217,232,417,-274,702,787,176,200,-124,-350,95,-1011,784,2495,2814, +3974,4565,5602,6935,6550,6592,7082,6332,4955,2729,4849,6710,11947,9862,6651,4332,-817,-829,228,-347,337,531,815,942,737, +641,565,553,252,91,605,312,-786,1332,2288,2320,2858,2642,2404,1879,1929,1545,460,-127,-32,383,1334,2924,6496,6202, +2722,2894,-852,136,31,-162,100,171,549,589,661,910,952,602,853,1068,1246,996,973,1150,929,956,908,1078,1002, +390,-278,-1049,-1457,-1389,-633,572,860,903,1124,1992,262,-92,341,738,486,469,262,286,171,297,300,304,319,253, +649,522,555,729,1369,545,-136,93,-178,-243,-430,-533,-224,53,280,333,274,131,342,556,518,299,431,555,-567, +43,-55,-32,235,206,403,572,563,736,735,735,541,332,651,431,630,-17,-90,11,-36,30,92,110,159,207, +315,405,504,577,495,397,427,453,360,505,730,327,-577,813,319,-433,-467,-504,-533,-559,-587,-583,491,791,-342, +344,548,94,238,180,174,142,98,52,114,158,190,240,306,414,417,439,416,427,527,-1565,-1615,-2151,-975,317, +1947,-1443,17,1476,1561,1549,1444,1611,1621,1611,-55,-1241,1712,-4,-984,-1709,-1414,-1531,-1482,-1505,-1508,-1499,-1491,-1474,-1448, +-1467,-1501,-1528,-1717,-1818,-1849,-1875,-2472,-2289,1580,-1213,-130,-243,-760,-603,-991,-925,-579,-925,-845,-832,-397,-603,-971,-944, +119,-1649,-1624,-1691,-1576,-1568,-1530,-1524,-1580,-1599,-1570,-1597,-1735,-1876,-2439,-2673,-2670,-2646,-4069,-2440,-246,-835,451,12,-9, +-198,233,-137,135,-437,204,-357,-144,-559,-598,-653,-934,-1373,-1801,-1819,-1709,-1808,-1879,-1912,-2037,-2019,-1953,-1925,-1872,-1826, +-3007,-3690,-3993,-3918,-5545,-2248,634,-281,337,635,336,453,457,525,449,699,357,55,3,-275,-379,-699,-841,-1296,-1616, +-1774,-1514,-1488,-1465,-1662,-2119,-2359,-2427,-2259,-2167,-2278,-4223,-4944,-5224,-4831,-7561,-6124,-3202,-2192,-1604,-1105,-1349,-531,34,338, +555,585,597,439,198,-99,-216,-612,-1115,-1975,-2234,-2409,-2569,-3443,-3851,-3680,-3231,-2730,-1765,-1753,-1671,-961,-2188,-3720,-6191, +-7342,1010,-3389,-3394,-1634,-1506,-604,-81,130,148,392,364,763,706,224,65,-273,-835,-985,-1269,-699,-461,-231,727,2887, +5031,6813,7553,7492,7222,3728,563,-2312,-1464,432,4014,2426,6949,1739,-2447,-544,-1437,-607,-879,-471,261,484,-229,556,216, +-690,-767,-808,-879,-312,3,635,887,1442,2149,1647,978,98,-92,356,1340,982,-1040,-3154,-3927,-3686,-556,3299,-3464,4734, +3681,1182,391,154,232,404,421,454,-320,529,743,555,610,416,652,163,872,618,-839,-1056,-1289,-2342,-3143,-3673,-4279, +-5735,-8259,-7198,-6303,-4482,-6159,-7601,-10438,-6466,-7169,-2138,3166,1563,556,854,145,-371,158,176,292,189,-9,-116,237,604, +633,710,1577,593,-578,-780,-2048,-2834,-3964,-5057,-6059,-6514,-6766,-6352,-6107,-5438,-4868,-4410,-5097,-5805,-2541,-1452,1675,226,162, +-24,-95,319,201,227,-112,215,172,-34,-366,-558,-848,-114,475,-587,-1379,-1574,-2547,-3227,-3491,-3246,-2179,-1201,-588,-191, +-563,-1974,-2082,-1997,-1630,-1923,-1088,-178,-147,-270,334,137,134,-80,231,40,462,-237,209,-308,-44,-518,-470,-803,-846, +-1599,-1626,-998,-577,-555,-627,-754,-1003,-1225,-1364,-1685,-1877,-2046,-1999,-2092,-2283,-1516,-1085,-1146,533,-784,-369,-293,-668,-567, +-841,-834,-377,-724,-713,-571,-177,-342,-695,-570,255,-793,-670,-829,-930,-936,-880,-779,-892,-1005,-1130,-1259,-1366,-1495,-1411, +-1270,-1192,-1107,-1177,-1446,-611,200,1299,-1039,95,1153,1264,1327,1254,1471,1578,1630,134,-905,1494,131,-687,-1395,-1145,-1180, +-1145,-1146,-1176,-1195,-1265,-1299,-1336,-1357,-1392,-1463,-1381,-1344,-1283,-1286,-1465,901,578,1206,-752,-1826,-2474,44,-1469,-2439,-2482, +-2444,-2220,-2435,-2471,-2409,-1462,-98,-2607,-1551,-518,1412,823,991,1033,1069,1099,1138,1106,1096,1057,1045,1011,985,957,866, +591,711,335,118,-2523,189,-735,-638,17,-45,655,431,-229,302,358,243,-387,-179,-111,119,-1647,1003,1287,1270,1482, +1552,1641,1685,1571,1440,1289,1312,1306,1208,1142,782,-14,121,182,-711,-1823,-918,-1112,-561,-464,-302,-312,414,-387,620, +-260,384,-434,-75,-72,-100,-437,689,1658,1498,1982,2143,2372,2552,2392,2302,2022,1992,1852,1770,1594,1021,-599,-319,-433, +-2267,-3032,-1107,-986,-608,-229,83,622,598,682,514,459,458,140,213,-461,254,-630,906,2109,2070,2607,2750,3007,3136, +2693,2108,1567,1823,2116,1984,1690,204,-2408,-2007,4994,1130,-2569,-1223,-1568,-1284,-458,-796,-244,270,368,696,749,468,349, +372,-137,460,-472,672,1985,1690,3031,4067,5125,5822,6646,7289,7639,5840,4362,2535,3894,4697,5225,3889,6098,2008,-1147,-67, +442,-217,118,80,250,255,478,714,605,429,513,328,-18,213,-184,1406,2909,3139,3796,4077,4373,4752,4322,3318,1244, +1187,800,699,1922,2020,2587,4466,-2587,3815,3280,1726,793,763,48,57,554,739,-219,575,395,-112,102,468,413,642, +790,493,-552,-1330,-2315,-2638,-2882,-2932,-4082,-4787,-5443,-3719,-1734,1383,1074,-443,-3394,-3925,-2480,-3329,412,-181,106,266,459, +427,524,490,-255,466,445,289,250,121,233,-224,-232,-855,-1717,-2121,-2843,-3303,-4252,-5196,-5227,-4564,-3310,-2876,-1978,-1317, +340,2083,3013,683,2347,-1833,-4128,-1859,-899,-764,-214,147,48,345,118,117,-52,-104,-210,-223,-553,-33,133,-957,-1509, +-2339,-2973,-3108,-2805,-1705,-1409,-239,2092,2370,2652,2521,2995,2538,1495,1496,435,-926,-1871,-868,-770,-386,-75,-23,315,263, +186,-55,-74,-82,-370,-748,-802,-1377,-1665,-1453,-968,-819,-253,407,546,433,-97,-433,-550,-434,-224,298,348,598,782, +124,607,159,-378,-262,-658,-280,-68,219,-66,180,-119,111,-386,-391,-640,-650,-978,-944,-1181,-710,-377,-667,-668,-785, +-719,-621,-553,-443,-401,-105,117,460,359,351,654,445,100,0,-1282,14,-480,-475,-123,-221,76,-182,-589,-379,-234, +-395,-658,-621,-478,-425,-1032,-592,-589,-540,-454,-393,-369,-390,-230,-87,53,223,404,620,560,479,335,172,180,416, +-875,-1566,-1878,-379,-1390,-1862,-1944,-1919,-1778,-1910,-1979,-1953,-1527,-633,-1896,-1563,-911,102,-63,-18,-14,-3,27,42,149, +230,316,373,412,487,375,320,282,262,198,817,800,648,1438,1500,630,1266,1501,930,1000,1001,808,902,883,818, +1531,1285,711,1534,1425,498,717,726,718,771,805,820,854,870,883,938,987,1110,983,942,873,887,933,1074,780, +676,881,830,767,750,816,978,1085,985,822,984,797,733,1036,753,1285,768,499,651,538,604,600,637,765,932, +1066,1280,1428,1671,1426,1314,1143,1161,1542,1077,850,715,473,425,476,426,769,525,689,347,608,638,525,386,599, +524,1085,719,310,711,590,933,1110,1308,1594,1769,1951,2238,2339,2657,2175,2112,1833,1902,1909,1175,365,261,205,-53, +38,23,446,577,185,411,323,226,22,-122,379,70,843,369,-244,20,-210,52,116,272,774,1462,2065,2651,2796, +3190,2632,2296,1982,2017,3579,4039,3132,1808,1757,1364,1209,670,439,343,257,518,578,592,383,188,433,156,1014,1109, +1105,2404,3037,3807,4750,6171,6232,5749,4175,4630,4777,4667,4783,5013,5548,5266,-2706,1966,3062,1284,1155,739,313,152,280, +373,397,631,587,469,406,452,1052,964,1762,318,-1550,-1930,-3251,-3072,-3525,-3854,-4508,-4203,-3410,-1793,380,2672,1418,-381, +-3315,-3276,-2104,-2090,1200,634,1355,753,1027,365,932,813,-105,669,575,473,525,371,802,60,18,-854,-1574,-1480,-2560, +-3281,-3522,-2576,-2714,-2728,-2560,-3731,-3770,-4120,-3292,-806,2047,659,4011,461,-1786,-298,87,201,174,119,397,437,-35,247, +101,186,-292,-348,-454,-378,-283,-945,-1337,-1316,-1067,-302,523,1378,2080,3120,4509,3832,2835,1407,1554,1116,2411,3228,1793, +2540,1666,461,748,308,557,1040,784,363,93,-35,-55,185,-45,-378,-626,-975,-959,-792,-319,80,515,1067,1388,1392, +2529,2310,813,499,149,-50,-843,-434,895,1747,1181,1733,416,123,96,15,42,210,49,38,39,110,31,-56,-115, +81,437,-88,-599,-179,-456,-634,-378,201,677,1024,815,485,255,-328,-518,-390,-295,-190,-143,1024,-116,-17,613,519, +567,421,263,176,258,65,282,18,-44,54,-199,-156,-199,-213,-144,-232,-404,-519,-772,-542,-384,-191,-180,-107,10, +74,215,260,399,506,397,254,-123,55,345,-74,243,178,105,190,19,205,349,304,147,230,44,-39,-97,-386, +-542,-450,-442,-389,-364,-376,-417,-425,-360,-298,-258,-235,-277,-316,-322,-298,-209,-119,-119,-216,719,895,263,567,869, +489,472,416,260,273,255,183,801,540,5,666,508,-98,-60,-58,-56,-52,-37,-33,-76,-125,-166,-193,-192,-190, +-156,-142,-157,-130,-60,407,442,477,-38,80,900,-62,31,700,753,766,815,800,824,921,58,-79,977,103,-74, +306,314,269,238,230,210,163,194,222,290,335,412,553,514,528,637,459,825,474,376,290,206,356,326,268, +343,241,67,141,273,253,279,264,84,246,334,-12,174,32,-15,10,1,-75,19,151,387,509,676,938,822, +888,1260,898,1091,761,337,387,258,173,209,129,347,495,40,355,253,369,97,60,104,140,-4,-177,-4,-199, +-418,-436,-518,-700,-522,-311,183,441,819,1429,1168,1243,1961,1158,1858,1196,749,525,523,393,386,236,479,520,344, +410,306,431,61,-12,58,176,1,-372,-344,-616,-856,-690,-657,-773,-389,142,1036,1300,1741,2419,1922,2131,3437,2382, +-736,71,1262,964,745,411,163,487,355,204,236,396,422,383,231,154,132,232,183,-157,-559,-943,-1398,-2270,-2799, +-3067,-2892,-2779,-2822,-2724,-2642,-2610,-2172,-2033,-1659,-1271,-3452,-1792,-159,-95,-97,276,441,552,561,540,359,570,420,345, +92,27,18,72,-252,-1188,-1900,-2826,-3532,-4496,-4921,-5053,-4375,-3593,-2213,-2257,-2517,-3965,-3919,-3294,-2361,-2712,278,-1178,-1963, +-847,-419,-239,154,-8,535,701,-81,693,722,621,285,-69,-128,-409,-1008,-1149,-1359,-1599,-1103,-970,-648,-601,909,1963, +2841,2791,1344,-1342,-1250,-1669,-1318,-721,-5296,58,950,123,295,-121,275,437,426,263,-182,57,91,-74,-302,-630,-989, +-777,-1021,-714,-162,-66,-119,-408,-738,-1534,-1220,-2045,-3750,-3815,-3471,-2764,-3271,-3685,-4143,-5942,-3906,-3022,121,256,-218,211, +-7,-162,67,28,-235,-182,-70,103,69,-35,-153,-463,-958,-608,-709,-822,-554,-796,-1013,-1435,-2288,-2954,-3345,-2982,-2764, +-2627,-2185,-2186,-2132,-3014,-1196,-1717,85,-415,-201,-211,-62,115,19,49,75,168,69,2,-125,-217,-385,-24,96,-39, +152,-196,-1023,-2115,-2462,-1991,-1228,-536,-352,-218,-191,-203,-453,-697,-588,-833,-62,81,-448,-315,-200,-134,-16,8,-56, +12,-264,69,180,374,228,256,250,94,-309,-14,41,-263,-241,-189,-252,-492,-626,-799,-902,-944,-1041,-1137,-957,-818, +-711,-470,-724,-848,-353,-567,-607,-449,-510,-455,-457,-602,-641,-651,-588,-619,-422,-244,-477,-244,-253,106,97,-58,-159, +-353,-465,-535,-574,-637,-735,-865,-949,-1072,-979,-937,-873,-848,-608,-609,-995,-721,308,-1021,-726,73,87,117,215,192, +217,262,-727,-926,249,-570,-726,-280,-440,-472,-506,-529,-562,-614,-658,-697,-721,-741,-771,-832,-775,-738,-684,-671,-735, +461,660,575,1210,963,216,1046,935,393,436,408,260,315,327,295,913,974,185,842,993,261,355,360,317,309, +305,335,301,290,277,251,246,236,349,473,693,697,1066,1173,882,866,789,719,674,487,530,739,787,782,619, +705,549,460,633,474,516,441,338,456,337,320,321,429,368,292,213,86,117,226,498,755,1170,1190,1553,1555, +1470,1200,850,791,619,330,603,415,618,427,553,597,499,392,269,360,423,160,137,143,-44,-133,-177,-58,-270, +-338,-481,-660,-611,-429,255,808,1738,1673,1791,1743,1375,998,778,888,563,-71,340,424,121,314,327,221,33,-105, +147,-6,202,28,290,545,255,105,91,411,232,-155,-652,-1084,-841,-397,660,1479,2442,2174,-669,57,1536,1541,373, +246,171,304,533,632,370,367,326,549,225,30,175,-11,146,-237,-1376,-1995,-2744,-2075,-2296,-3345,-3309,-2586,-791,-525, +-333,-73,172,93,-160,-740,1398,-980,-1523,-436,-99,309,516,887,813,774,472,613,428,333,59,-67,-169,-441,-722, +-484,-152,191,712,-420,-547,61,1229,1793,1744,3070,3446,3045,4630,4394,3285,2195,883,1051,-222,-88,-462,-178,-171,150, +331,523,44,529,590,704,251,110,-163,-69,-150,116,799,856,1571,2407,3019,3002,2902,2127,559,727,1510,3062,5521, +5348,3053,1350,3021,-332,-477,473,-212,360,276,658,367,203,-128,192,290,420,356,197,156,191,-451,139,713,780, +1034,972,987,1217,732,759,1359,1220,1534,1198,3906,5466,6178,4474,4043,2118,-1243,-149,154,-31,220,388,197,264,-56, +241,372,442,225,76,72,563,259,896,907,417,53,-57,277,996,901,1771,3551,2736,2653,2639,3991,4480,4770,3716, +1548,1012,-702,135,-40,294,388,231,419,312,353,152,176,269,379,523,616,397,258,498,890,1010,1061,998,695, +106,-372,-885,-1105,-862,-312,362,1132,1740,2101,1602,1038,868,817,734,279,410,335,475,231,441,253,551,231,340, +290,316,151,402,610,884,780,552,410,185,20,-149,176,385,472,628,628,591,725,904,1246,1070,905,1073,-644, +739,314,290,681,567,855,826,540,728,665,575,289,288,629,500,-1,385,189,227,180,171,149,52,136,186, +296,411,585,762,816,830,845,877,831,1153,487,-229,-1397,910,-74,-1165,-1247,-1265,-1225,-1316,-1357,-1378,-109,658,-1316, +-214,366,667,552,560,524,498,474,440,555,643,722,785,833,901,873,876,868,902,977,-1615,-1487,-1963,-949,129, +1597,-1438,-125,1213,1309,1320,1242,1410,1443,1471,-142,-1241,1572,-98,-987,-1713,-1399,-1526,-1501,-1540,-1546,-1552,-1521,-1520,-1529, +-1568,-1628,-1740,-1801,-1812,-1730,-1705,-2322,-2066,1066,-1299,-490,-505,-940,-780,-1097,-1050,-697,-1016,-903,-838,-414,-610,-949,-933, +180,-1565,-1567,-1652,-1646,-1754,-1806,-1843,-1778,-1773,-1868,-1983,-2231,-2566,-2754,-2775,-2608,-2541,-2909,-1697,-216,-784,13,-175,-184, +-384,-13,-297,-69,-535,122,-299,-56,-469,-541,-627,-745,-1133,-1623,-1631,-1682,-1892,-1986,-2077,-1954,-1972,-2111,-2275,-2644,-3294, +-3556,-3555,-3211,-2869,-4853,-1965,186,-636,-527,-198,-298,-211,105,269,-10,345,172,97,-113,-368,-254,-647,-454,-1027,-1573, +-1708,-1707,-1994,-2287,-2580,-2462,-2394,-2708,-3034,-3960,-5206,-5685,-5573,-5190,-4702,-617,-1075,-1223,-490,260,413,163,14,125,251, +381,172,130,421,-37,-336,-360,-909,-1076,-1722,-1610,-1545,-2069,-2825,-2958,-2468,-2707,-2967,-3091,-2248,-1114,460,726,867,486, +19,1033,951,-129,-196,-526,-361,17,311,640,665,226,333,278,390,-144,-452,-733,-1086,-928,-1242,-1729,-1445,-1001,-500, +-227,-156,-57,89,150,-604,-537,578,69,266,1308,563,186,26,828,533,514,202,146,305,237,259,-46,106,168, +629,-38,-258,-97,-24,135,133,423,498,-151,-771,-1328,-1502,-2048,-1993,-1495,-2322,-2922,-4015,-4530,-3915,-3435,-535,-237,1486, +395,-172,299,-102,103,412,166,68,-131,-52,131,763,333,364,749,367,473,196,-513,-855,-842,-773,-520,53,-673, +-703,-98,-337,-173,752,-943,-2797,-5562,-2179,-3841,-45,2107,705,384,538,343,175,217,46,69,393,431,365,283,256, +329,78,550,410,391,760,490,19,-624,-1674,-1219,-1615,-2782,-2547,-2349,-1692,-2279,-2537,-3493,-3749,-1712,-970,613,-42,271, +299,223,136,52,133,104,-15,-41,61,147,246,274,478,599,329,-168,-187,-166,-372,-517,-1027,-894,-818,-601,-546, +-643,-951,-695,-678,-931,-1086,-923,-559,55,-327,32,-94,-60,-97,287,137,592,148,375,115,197,37,97,117,323, +-29,-82,249,367,199,77,27,-178,-381,-570,-657,-606,-603,-641,-671,-766,-654,15,61,1368,226,677,615,257,354, +11,107,354,127,107,179,299,269,78,57,409,84,196,148,157,222,277,340,221,147,59,-26,-191,-351,-292, +-212,-141,-34,-135,-351,453,1039,1431,124,934,1450,1491,1466,1343,1430,1433,1407,890,229,1286,831,318,-159,-17,-16, +14,29,36,71,-7,-70,-140,-211,-255,-331,-269,-248,-226,-218,-225,392,124,645,-897,-1777,-2338,-247,-1476,-2263,-2323, +-2304,-2104,-2286,-2298,-2235,-1428,-300,-2399,-1561,-711,824,337,454,495,463,447,421,430,449,465,523,542,504,573,499, +250,232,-124,-316,-2298,-219,-954,-837,-263,-265,264,117,-380,24,80,5,-460,-310,-339,-195,-1620,430,563,513,710, +659,635,516,467,482,588,823,939,761,989,780,101,-88,-273,-766,-1601,-999,-1262,-779,-551,-281,-405,229,-401,425, +-320,318,-286,-27,-237,-346,-633,184,786,608,1016,862,806,667,647,734,925,1257,1440,1050,1422,986,-272,-513,-623, +-2212,-2652,-1274,-1360,-994,-567,-170,283,398,448,229,309,473,164,174,-524,-90,-809,152,824,755,1328,1204,1141,811, +571,615,1121,1983,2410,1816,2251,1454,-505,-1055,5616,3322,384,254,127,40,581,488,88,42,323,209,190,291,108, +186,-280,115,-634,33,1135,680,1209,1014,961,525,966,779,74,-869,-1435,-2333,-1140,-125,603,3517,932,1563,1131,1029, +1406,584,487,227,642,596,256,283,292,664,288,101,-341,-202,-865,187,1629,1571,1955,2017,1923,1430,867,416,474, +-1289,-1710,-1499,-1524,-1033,-757,249,131,1033,259,654,404,477,279,874,487,480,54,-48,80,912,248,360,237,514, +444,416,320,-214,-563,2,481,711,845,917,1389,1501,2178,3600,2482,1195,331,-468,-819,-563,592,600,212,356,373, +756,210,22,27,55,189,828,424,238,333,279,105,295,546,554,421,255,-348,-1442,-1384,-1724,-2156,-1546,-737,265, +361,1065,1692,-163,1232,-801,-1639,-441,-155,-74,80,95,1,284,322,403,359,314,220,296,305,328,126,84,-112, +-461,-433,-540,-515,-411,-874,-1133,-963,-542,110,863,1361,1072,261,642,-149,-783,-1059,-221,-140,127,338,200,406,384, +356,262,259,218,273,149,5,11,33,-163,76,175,346,433,441,388,153,42,-174,363,827,1387,550,38,66, +-472,423,-151,-652,-280,-474,-312,-173,-33,-95,181,43,349,109,309,83,186,124,99,-31,214,420,298,337,212, +163,97,313,564,807,761,633,671,544,430,395,241,224,114,-295,171,-56,15,201,146,368,258,63,286,406, +386,303,376,378,424,170,452,413,430,464,466,476,451,498,497,530,570,679,749,668,567,443,301,274,324, +-250,-519,-320,-92,-493,-491,-508,-490,-375,-458,-473,-423,-394,-6,-347,-329,-38,433,336,363,358,374,394,414,422, +432,437,452,442,459,395,365,349,321,270,-130,-62,-197,749,957,374,528,929,714,772,774,590,688,682,629, +1023,585,525,985,722,-324,-112,-129,-115,-123,-133,-156,-166,-188,-201,-254,-275,-291,-248,-191,-86,-56,315,373,256, +-17,306,343,164,173,53,250,576,329,201,391,372,264,382,120,706,40,-244,-123,-172,-240,-309,-338,-344,-348, +-316,-432,-431,-353,-181,46,364,478,696,504,368,388,175,107,195,156,425,91,567,-23,402,403,471,248,250, +152,457,155,-336,-78,-67,-60,-108,-174,-189,-286,-401,-750,-904,-923,-646,-271,503,693,2090,1152,-42,-180,68,-138, +-60,-213,45,296,79,199,211,288,67,-78,94,-287,145,0,-446,-273,-296,-517,-690,-727,-692,-720,-765,-1174,-1129, +-830,-109,674,1905,2193,-1109,1913,4062,2588,1641,1109,829,1025,731,447,314,140,90,415,203,89,104,-43,480,381, +-60,678,1199,1898,2389,2806,2426,2149,1936,1050,-54,-1261,-2095,-2261,-1983,-669,-484,168,1120,631,899,1152,689,546,496, +544,172,348,407,532,230,298,569,627,1030,420,-343,-655,-1785,-1272,-1084,-1164,-774,-587,-439,1098,2334,3439,3797,2953, +-49,363,-395,94,1108,563,902,179,679,1132,569,257,119,-234,-35,1187,354,116,407,29,193,-50,-361,-38,-183, +-896,-1474,-1813,-1569,-1455,-1438,-1150,-615,627,866,1366,1330,858,2234,499,28,70,217,279,272,545,154,21,385,208, +295,863,353,328,137,255,595,119,-341,-235,-18,369,789,1208,1155,1090,975,1335,1062,34,721,839,608,2561,1622, +1785,1164,621,509,415,332,576,457,257,327,159,144,211,192,208,91,237,428,177,216,240,180,718,942,1234, +954,973,932,640,369,-118,124,405,362,1516,404,1455,827,850,661,559,375,504,390,320,124,341,328,270,223, +308,396,266,80,169,-220,-195,78,792,1009,998,572,349,468,81,-328,-999,-540,-285,-317,58,-21,42,452,385, +443,356,258,163,269,137,415,126,362,297,395,317,368,298,418,55,-115,65,-56,64,172,364,376,357,320, +191,129,-45,165,277,392,295,189,375,415,337,498,489,515,533,470,531,693,554,425,476,498,303,349,156, +439,-240,-254,-193,-175,-134,-141,-137,-199,-232,-258,-278,-296,-315,-234,-144,-34,89,123,122,579,647,226,536,675, +402,422,448,368,468,513,490,691,457,449,618,455,-143,18,-13,-12,-17,-13,-2,-13,-16,-17,-15,-9,-15, +31,54,64,105,168,-287,-364,-291,-869,-748,92,-770,-776,-195,-183,-144,-7,-70,-53,59,-770,-778,87,-747,-829, +-115,-212,-228,-214,-242,-262,-325,-282,-270,-235,-258,-277,-326,-365,-404,-432,-426,-673,-523,-121,-289,-292,-267,-259,-283, +-251,-447,-546,-473,-279,-291,-251,-222,-489,-264,-421,-334,-128,-267,-200,-282,-340,-484,-362,-295,-239,-335,-508,-744,-932, +-1043,-995,-934,-1127,-530,-225,-186,62,-88,-96,-116,-180,24,-282,30,-84,123,-102,-104,-140,-146,-373,-181,61,-109, +-77,-240,-346,-676,-414,-304,-183,-267,-488,-887,-1204,-1431,-1395,-1267,-2111,-201,765,380,556,382,309,175,136,143,217, +204,255,604,236,256,-46,201,-217,-10,114,-159,-24,-227,-434,-913,-467,-158,8,-347,-1138,-2081,-2682,-2990,-2762,-2336, +-2259,-1933,-1208,-345,-34,-88,-285,61,510,519,445,172,101,272,157,176,-203,243,-111,55,549,209,191,-921,-1076, +-479,-125,127,312,347,657,1636,720,251,265,-1717,479,-178,-176,109,-316,322,571,456,490,473,50,262,321,581, +228,200,73,230,23,-278,-513,-1032,-1156,-1509,-1892,-2548,-2735,-2700,-2391,-1231,-771,-426,-289,87,442,480,-402,-820,-607, +-446,-216,-365,46,845,259,85,8,-163,107,1079,232,-30,-167,-195,-426,-366,-465,-866,-1085,-1311,-1261,-1040,-461,123, +455,775,151,-1557,-2974,-3627,-3696,-1478,-2599,-226,15,-448,96,-164,127,341,72,49,344,66,214,602,45,-97,-147, +-90,-132,30,327,194,-101,129,209,87,-290,-946,-1958,-2663,-2811,-1895,-2972,-3719,-4927,-3707,-3128,-2031,43,-44,-187,11, +-39,-60,-7,-23,-40,56,103,75,115,145,192,-155,-338,-234,-223,-24,266,0,-422,-1014,-1244,-1697,-2241,-1656,-1497, +-1449,-2287,-2825,-3491,-3045,-1194,-978,152,-254,86,-57,35,112,183,250,146,140,119,158,53,-107,-224,-78,43,85, +56,-106,-392,-669,-880,-930,-356,117,396,38,-257,-404,-115,-293,-1051,-1133,-544,-557,-578,-493,-261,-229,-109,-84,-49, +-33,-108,30,142,142,184,156,141,-43,-311,-407,-287,-266,-143,13,127,184,-258,-717,-1095,-915,-682,-530,-570,-571, +-548,-525,-87,-150,279,36,70,106,-7,96,-51,-120,-168,-237,-160,-215,-193,-162,-308,-173,-237,-71,25,-83,-115, +-174,-198,-147,-138,-61,-86,-147,-296,-384,-349,-312,-267,-218,-64,-56,-376,-241,334,-392,-259,270,281,273,305,281, +254,261,-336,-369,193,-333,-385,61,-27,-38,-38,-52,-79,-127,-144,-171,-175,-188,-175,-193,-152,-130,-104,-103,-27, +654,536,556,675,277,-708,889,430,-494,-549,-576,-617,-642,-646,-666,424,884,-815,335,773,621,561,612,580,590, +590,604,598,617,623,701,743,755,845,837,701,655,349,362,-106,541,395,289,511,480,578,667,591,709,597, +672,401,405,590,487,107,723,628,757,687,741,762,804,790,787,784,987,1174,1232,1463,1300,752,580,53,-179, +20,98,140,295,310,391,269,285,361,427,320,563,455,485,261,398,562,518,601,650,546,585,567,621,539, +635,736,1188,1575,1605,2141,1940,752,450,-1052,-1391,-644,-57,-92,226,202,176,218,210,100,108,315,457,333,238, +216,264,443,465,644,998,801,898,973,1103,1053,994,1007,1798,2453,2640,3358,2690,288,-485,2222,1051,-491,-490,-391, +-293,-42,23,293,464,466,258,223,436,309,315,316,444,713,1016,79,-454,-1007,-167,-359,-1608,-1417,-1252,-895,-522, +-47,532,318,692,1470,1678,2077,796,641,967,966,756,678,507,529,548,239,195,255,599,351,352,275,312,203, +640,1109,1582,2155,1394,1100,1375,1126,1005,904,407,281,562,799,929,1332,1987,1677,960,-306,-86,-495,-3,-54,857, +277,85,59,3,261,949,399,379,306,157,167,31,227,57,-61,1177,2098,2653,2610,2106,1335,1099,1324,2605,2486, +2142,1699,1050,1949,-29,-22,707,-74,467,212,532,184,165,363,47,170,660,370,264,211,265,163,509,1267,1503, +1241,1429,1334,1094,1234,1178,1124,718,513,367,1224,2663,5078,2907,3189,1397,-824,-56,265,30,237,447,203,223,141, +266,333,316,247,189,135,335,166,383,408,319,159,240,465,791,863,1307,2222,2037,2112,2112,2018,2025,2629,2766, +1391,963,-304,296,186,221,232,187,257,214,215,180,183,155,342,429,391,169,104,301,505,494,470,433,453, +595,549,240,-320,-223,208,1084,713,648,644,985,439,264,219,491,380,400,387,415,237,276,155,281,142,270, +119,118,11,70,71,191,104,-60,-132,-76,-57,-91,143,445,739,962,995,1089,788,600,395,335,503,528,-193, +299,141,90,231,205,347,442,389,544,497,550,370,346,501,392,55,382,272,323,286,268,254,218,322,375, +454,556,724,927,857,800,722,650,587,644,606,243,-425,701,253,-345,-351,-371,-373,-410,-421,-435,342,716,-472, +280,582,541,472,487,472,462,449,418,505,578,648,712,751,822,749,719,682,657,751,-875,-758,-1026,-433,292, +1286,-724,204,1205,1243,1244,1180,1301,1328,1347,248,-598,1411,293,-405,-1030,-756,-854,-864,-861,-866,-868,-884,-905,-932, +-977,-1006,-1005,-1084,-1059,-897,-879,-783,-983,309,-830,-270,-126,-424,-269,-589,-563,-269,-522,-436,-383,-23,-159,-434,-430, +484,-911,-887,-941,-1030,-1021,-1027,-1012,-1027,-1091,-1205,-1343,-1449,-1377,-1535,-1333,-881,-829,-894,-932,-711,-670,-168,-137,3, +-18,127,-123,90,-266,226,-133,188,-95,-231,-221,-238,-640,-974,-978,-1175,-1170,-1201,-1229,-1298,-1470,-1664,-1958,-2124,-1970, +-2357,-2063,-1260,-1092,-705,-1071,-1229,-1120,-540,-330,-94,53,75,180,63,214,198,273,220,-6,-71,-284,-28,-608,-981, +-1083,-1411,-1436,-1540,-1506,-1546,-1705,-2090,-2573,-2873,-2518,-2827,-2015,-760,-715,-1104,-572,-33,-485,-63,-65,-46,122,137,150, +245,181,202,374,96,-49,79,-431,-224,-682,-1140,-817,-1248,-928,-814,-724,-1544,-2197,-2696,-2355,-2184,-1995,-3115,-3107,-2509, +-1259,1369,1240,986,608,561,368,311,446,263,304,146,82,160,369,36,-68,-140,-271,188,-525,-1549,-1398,-1589,-905, +-606,-423,-32,304,412,102,-187,213,-1080,-956,277,904,-170,10,1078,413,388,391,503,750,213,-46,90,-20,211, +710,149,-111,185,-53,-146,-319,-282,-180,-493,-988,-1716,-2518,-2726,-2532,-2027,-1476,-1726,-2322,-2906,-2073,-1362,1,-464,499, +397,-159,322,125,193,232,134,64,232,-85,48,458,350,481,387,220,504,81,-541,-692,-720,-816,-647,-159,-101, +114,320,483,184,-90,-1479,-2372,-2949,-1011,-2332,-245,1281,353,143,350,266,298,275,38,39,136,209,162,176,125, +-45,-107,242,-117,48,275,-249,-48,-221,-734,-529,-536,-1003,-1086,-1357,-1504,-2041,-1997,-1674,-2083,-544,-136,942,382,384, +184,21,220,-120,-77,-16,51,-2,25,62,76,18,131,220,121,-259,-352,-464,-646,-527,-201,-153,-82,35,-164, +-531,-1056,-1167,-1114,-991,-432,-479,-29,174,70,399,336,356,294,404,120,243,-99,265,54,161,-21,47,-7,-36, +-214,-272,-154,-149,-189,-225,-214,-289,-327,-373,-519,-582,-646,-684,-731,-878,-600,-403,-467,499,-330,-52,-63,-326,-285, +-477,-423,-165,-383,-401,-347,-87,-104,-252,-180,337,-190,-118,-137,-129,-115,-122,-138,-217,-298,-371,-408,-463,-527,-491, +-443,-399,-384,-329,-515,19,496,1054,-264,410,980,1043,1069,1022,1140,1194,1204,413,-192,1166,451,-9,-412,-265,-288, +-269,-260,-240,-201,-240,-262,-290,-327,-360,-405,-383,-381,-374,-382,-375,470,333,736,-289,-988,-1419,120,-793,-1346,-1406, +-1395,-1258,-1386,-1391,-1359,-792,19,-1456,-875,-263,745,427,509,517,496,487,487,476,471,449,496,498,441,467,431, +327,383,414,477,-1169,280,-214,-164,185,82,348,223,-91,197,231,140,-102,10,-24,83,-920,506,644,610,695, +654,635,592,510,495,480,621,560,291,318,286,173,308,454,357,-422,-84,-318,-104,-6,115,-138,221,-113,439, +-67,254,1,229,41,4,-229,337,854,701,902,742,714,729,643,644,535,771,688,232,350,193,-8,140,860, +306,-510,48,175,106,311,264,231,210,400,181,331,478,442,499,-149,252,-279,377,989,905,1224,1070,1041,984, +714,666,659,1040,692,-265,-260,-265,-166,297,1423,447,-362,-231,-495,-425,-47,120,299,308,187,309,344,265,219, +297,-26,250,-292,111,1053,608,543,103,-177,-310,-80,20,-131,-30,150,610,454,103,-81,371,887,1358,1463,1260, +1181,515,389,624,307,212,98,120,211,388,235,134,-237,-287,-784,-270,670,779,1151,1147,864,126,-495,-1014,-1329, +-880,-1058,-1354,-1661,-425,1678,882,-264,-471,-670,-419,-165,437,581,805,229,80,211,103,282,461,406,408,-97,323, +192,168,-184,-696,-631,-512,-210,97,178,447,748,1773,2732,3044,2602,1558,1185,189,-177,-540,-204,135,155,336,261, +255,182,112,219,112,160,275,321,339,197,104,-162,26,278,359,453,460,264,-35,299,606,707,493,385,560, +645,913,1169,58,775,-453,-1113,-360,-178,-119,111,243,85,164,91,168,201,234,71,-3,-41,-96,-270,-200,-60, +-181,-115,-50,141,454,568,491,548,372,461,932,857,744,751,526,162,-364,-601,-231,-239,-62,83,69,155,161, +268,141,186,323,209,44,8,-50,-67,-166,295,475,517,535,528,442,372,380,356,750,986,1313,779,508,468, +143,626,422,43,155,-49,99,140,282,70,220,-117,225,-122,-8,-58,119,106,120,13,344,474,211,159,104, +119,121,160,181,170,288,389,628,546,477,392,420,245,103,-676,14,-295,-301,-138,-195,7,-17,-234,0,125, +66,-122,-47,24,73,-338,182,124,113,123,92,53,-9,179,360,544,688,803,910,762,644,509,353,369,486, +-192,-583,-714,27,-528,-753,-791,-809,-718,-833,-883,-855,-497,41,-773,-482,-84,535,385,409,393,389,397,379,429, +443,459,484,516,588,522,491,468,434,467,-359,-243,-534,509,923,771,233,844,913,928,912,760,875,874,807, +861,316,811,856,484,-575,-327,-378,-385,-388,-388,-360,-387,-404,-458,-403,-414,-503,-397,-331,-253,-255,-130,-79,814, +-48,434,376,126,165,-136,14,360,116,30,120,292,162,228,-4,731,-232,-499,-429,-525,-551,-559,-475,-549,-586, +-700,-539,-505,-666,-424,-333,-163,-46,171,103,546,325,491,352,321,282,330,-51,483,-94,383,81,427,207,181, +116,356,-50,-639,-460,-566,-555,-571,-411,-567,-639,-894,-568,-609,-1092,-529,-266,272,408,854,693,836,530,679,514, +426,291,61,97,65,177,215,156,219,62,271,-182,296,-52,-705,-587,-775,-874,-866,-562,-783,-941,-1281,-747,-636, +-1165,-396,-89,562,1136,-1736,32,890,387,379,374,146,95,448,477,203,300,307,287,279,197,255,-148,274,143, +-493,-68,-63,508,507,278,-230,-410,-622,-508,-816,-1261,-989,-1063,-870,-1119,-54,232,830,730,547,507,307,749,269, +171,46,93,212,212,165,133,67,-3,185,-144,-342,-320,-1034,-848,-593,-69,-113,-263,-599,-271,-183,-575,-111,239, +989,558,222,53,-288,-286,-55,392,648,615,143,-139,124,-43,73,112,446,369,39,-165,-8,-311,-778,-512,-503, +-953,-1201,-990,-707,-388,-169,-250,-114,378,875,755,1146,413,929,537,180,375,199,218,60,102,274,290,342,230, +245,142,311,356,-97,-107,83,-173,-344,-159,-9,296,705,1372,1564,1961,2462,2601,2007,737,552,444,890,1003,985, +1215,845,395,383,426,430,488,322,92,192,80,81,198,62,-10,-65,-15,95,-91,-14,119,316,551,785,1283, +1277,1321,1232,978,701,368,-116,-109,395,999,159,680,445,374,201,188,52,93,41,27,-42,154,228,294,149, +199,287,246,108,98,-59,-7,168,547,657,452,250,135,113,323,207,-251,-375,-288,-38,95,-108,112,502,337, +419,328,243,183,294,225,440,173,166,46,126,148,219,288,468,352,94,91,-89,-53,-33,30,165,288,404, +347,312,255,249,169,31,57,122,177,388,53,202,137,63,33,23,136,328,295,250,374,390,321,318,195, +285,184,205,259,281,332,352,370,333,288,266,224,193,159,129,145,144,184,71,-13,582,745,445,462,716, +515,545,556,488,563,602,598,789,513,533,767,586,41,124,125,131,127,125,135,116,103,83,80,73,63, +75,74,68,63,68,-371,-391,-289,-941,-912,-179,-805,-889,-396,-425,-406,-268,-326,-318,-255,-902,-824,-194,-894,-913, +-183,-303,-308,-300,-303,-310,-328,-345,-353,-342,-351,-382,-465,-492,-523,-539,-465,-547,-565,-477,-403,-444,-398,-345,-320, +-321,-489,-623,-498,-338,-439,-358,-329,-557,-386,-639,-412,-236,-375,-319,-329,-330,-370,-394,-413,-429,-488,-636,-849,-914, +-945,-915,-779,-729,-522,-538,-445,-135,-154,-165,-125,-281,-68,-337,28,-149,-139,-236,-179,-230,-304,-580,-298,-49,-210, +-185,-201,-239,-382,-429,-489,-460,-538,-742,-1070,-1306,-1469,-1502,-1065,-1162,-335,113,99,335,313,321,305,130,58,245, +227,288,400,313,297,-68,110,-343,-69,43,-297,-234,-224,-261,-476,-491,-532,-541,-826,-1323,-1804,-2070,-2239,-2165,-1632, +-1569,-1745,-2131,-1458,-594,-306,-274,-377,132,323,201,322,298,20,153,232,-88,24,-376,-225,426,391,728,-120,-231, +306,360,303,115,-43,-207,-696,-870,-833,-409,-1196,997,850,75,210,-63,-65,180,511,218,76,21,-4,121,308, +337,239,-121,-103,-376,-465,-494,-984,-1247,-1206,-1163,-1053,-972,-516,24,-247,-985,-2232,-1955,-1987,-1424,-341,-424,-161,-102, +14,-24,550,451,351,15,-158,-16,-40,45,-235,221,235,-385,-292,-596,-446,-368,-458,-314,-427,-573,-700,-407,-41, +265,662,418,-469,-543,-189,497,-163,-1420,-98,265,-72,62,-60,77,61,342,345,225,162,217,-78,260,202,-232, +-187,-411,-227,-177,-350,-414,-677,-630,-319,-338,-441,-762,-188,-22,211,-1048,-1762,-2015,-1933,-1473,-1235,-212,-152,-68,230, +229,-17,-7,-7,20,-22,-25,26,7,32,107,-70,-269,-182,-322,-262,122,9,-155,-293,-618,-831,-1314,-715,-604, +-579,-1030,-1279,-1232,-1356,-319,-488,37,-160,-161,-165,-51,-7,6,20,-29,69,126,130,-18,-143,-230,-101,40,-31, +-19,-123,-388,-513,-593,-616,-427,-206,-6,54,-88,-366,-447,-490,-341,-365,-220,-202,-404,-265,-161,-131,-74,-64,12, +95,109,93,109,15,62,45,65,47,-42,-5,56,93,170,41,-112,-282,-262,-288,-294,-457,-549,-651,-561,-502, +-416,-385,-260,-353,15,-204,-208,-123,-147,-170,-170,-293,-321,-367,-287,-329,-146,-46,-127,38,234,215,290,261,289, +308,379,447,317,179,46,-83,-207,-359,-327,-331,-316,-308,-336,-365,-490,-305,334,-524,-310,175,172,196,248,255, +268,299,-367,-519,358,-261,-378,-218,-215,-210,-198,-186,-190,-170,-232,-262,-297,-327,-357,-411,-384,-375,-360,-365,-462, +463,344,414,491,150,-735,673,270,-529,-574,-592,-636,-643,-659,-717,265,663,-821,192,565,472,415,467,433,452, +460,494,455,459,483,497,508,495,559,539,411,416,306,381,-217,332,273,178,352,322,403,473,414,532,429, +442,252,272,461,322,-34,583,505,616,542,600,609,669,560,568,683,744,803,764,922,859,496,464,-125,-87, +-30,-1,85,157,180,238,120,120,234,296,213,270,276,343,230,241,379,444,554,630,491,594,598,762,542, +599,759,796,885,879,1257,1166,207,116,-478,-615,-519,-177,1,171,187,161,116,122,123,176,336,249,337,275, +257,207,347,469,655,879,651,828,923,1053,751,705,1013,1222,1436,1459,1973,1709,203,-173,844,482,-566,-626,-451, +-183,29,-109,121,318,132,335,293,41,259,273,134,223,447,546,54,-52,-120,69,-199,-700,-303,63,574,330, +368,285,508,581,721,595,120,835,1235,844,545,305,231,434,178,75,104,-40,130,370,425,449,334,275,35, +414,751,876,1120,938,804,883,611,443,251,538,326,-481,375,419,-192,-45,1065,273,-373,-110,290,766,619,271, +113,-94,10,15,59,-343,422,559,-134,10,33,-27,-35,103,309,752,1081,1391,853,481,339,374,1043,2159,3257, +3784,3896,2084,1611,101,-129,292,-94,316,242,204,415,366,234,201,239,83,422,387,61,89,-39,34,102,146, +98,-67,-137,-115,333,713,878,1220,1339,837,1474,1942,2822,2033,2244,1158,-150,221,282,258,287,204,158,138,106, +26,40,183,140,128,125,305,214,203,84,52,205,356,580,881,797,922,1199,1258,1244,983,1733,2090,2346,2181, +1111,872,-72,192,67,193,228,184,245,179,130,122,155,90,158,210,209,14,-45,27,220,210,89,283,359, +466,209,-35,-238,-166,9,258,304,438,744,929,553,489,429,494,327,301,212,195,133,181,196,182,55,78, +61,99,101,104,210,80,17,96,131,55,-63,-184,15,214,387,334,246,166,327,464,584,532,267,354,-290, +234,114,127,289,270,336,336,260,313,258,230,151,107,269,201,139,122,43,64,39,27,46,30,41,27, +63,108,196,247,256,245,258,266,156,256,155,-118,-612,291,-50,-473,-512,-529,-552,-584,-607,-640,-59,209,-564, +-86,112,88,83,77,65,65,56,46,72,98,116,140,157,193,184,185,178,193,141,-563,-467,-659,-370,133, +904,-555,75,804,825,832,808,889,904,909,104,-464,997,154,-342,-689,-495,-569,-593,-571,-565,-561,-570,-577,-560, +-631,-657,-629,-677,-629,-488,-510,-342,-560,163,-581,-170,-88,-298,-186,-403,-422,-252,-386,-305,-322,-33,-104,-274,-297, +342,-657,-596,-650,-767,-729,-727,-701,-713,-722,-695,-869,-908,-775,-943,-849,-477,-410,-326,-610,-596,-512,-113,-156,-65, +-19,3,-143,-34,-200,108,-235,60,-97,-92,-188,-180,-524,-717,-717,-978,-850,-837,-810,-847,-902,-823,-1160,-1309,-1040, +-1376,-1053,-299,-333,320,-277,-787,-749,-202,-213,-21,168,23,67,59,246,224,65,184,62,79,-173,20,-473,-698, +-804,-1251,-1139,-1188,-1101,-1140,-1133,-1015,-1546,-1584,-1081,-1622,-1295,-104,142,-1852,-867,-338,-501,-183,6,-72,-103,68,152, +37,217,179,10,87,-34,-109,-441,-349,-782,-1108,-784,-859,-669,-455,-179,-704,-856,-888,-1116,-1449,-1959,-1386,-1048,-936, +-1493,-432,-143,75,-95,-493,-92,116,378,66,-91,30,-59,113,222,159,93,22,9,223,-182,-929,-994,-1044,-1057, +-996,-701,-460,-494,-784,-828,-717,-990,-951,-993,-892,-424,631,386,186,212,591,737,578,-88,-11,-122,4,-38,7, +-327,264,263,-89,-204,-345,-416,-326,-157,-262,-795,-1300,-1657,-1909,-1756,-1346,-1402,-1909,-2788,-1996,-1258,-945,363,-792,348, +234,-107,112,69,238,114,339,262,75,114,186,-8,306,337,17,0,45,-313,-881,-1103,-1146,-1329,-1317,-1136,-1101, +-773,-402,68,74,-470,-1142,-2000,-2947,-1517,-1801,-410,891,344,119,327,186,-37,37,-85,-75,-74,-17,81,185,179, +72,51,107,-22,73,183,119,40,-31,-265,-170,-316,-735,-751,-1133,-1869,-1580,-1373,-1351,-1521,-471,-265,462,41,181, +129,128,184,61,68,74,39,-7,-36,-7,-3,-99,-29,2,-16,-332,-463,-478,-576,-607,-525,-414,-186,103,-154, +-484,-1161,-682,-526,-523,-289,-284,-51,109,-63,107,45,34,-29,91,-5,101,-29,144,76,102,34,78,-57,-179, +-370,-323,-226,-199,-89,25,158,-11,-172,-293,-443,-507,-655,-533,-446,-366,-248,-261,-204,431,-74,113,104,-51,24, +-157,-182,-99,-246,-265,-266,-140,-125,-221,-141,81,-55,16,-27,-25,-53,-100,-112,-196,-270,-374,-475,-593,-720,-623, +-541,-445,-358,-299,-373,-166,116,443,-281,77,433,453,457,425,465,474,455,12,-279,425,43,-193,-258,-225,-238, +-228,-223,-209,-190,-249,-295,-336,-378,-413,-482,-424,-400,-376,-353,-372,500,426,669,-8,-569,-1012,265,-424,-935,-992, +-992,-913,-996,-1003,-1006,-428,210,-1051,-489,-5,648,434,507,507,510,510,495,516,522,549,527,537,565,557,526, +431,486,463,553,-664,350,-27,-54,220,175,361,291,39,284,279,191,18,119,165,196,-583,457,582,585,631, +640,637,584,646,678,731,618,584,614,596,526,310,417,641,502,-89,43,-148,-60,-17,171,-75,159,-90,338, +-30,148,16,225,159,67,-106,204,685,620,745,732,760,708,822,834,967,806,846,1026,950,763,262,483,682, +656,95,249,253,106,181,289,152,95,209,201,294,154,317,434,55,266,-155,166,767,790,972,1019,1019,907, +1056,1144,1351,930,839,1003,838,475,-67,279,440,-167,-585,-322,-467,-262,-75,-72,146,258,106,246,233,88,153, +147,-124,96,-317,-17,735,344,309,71,94,240,488,507,480,382,534,581,1204,1343,780,387,30,348,32,82, +-20,65,267,379,180,-27,60,33,141,179,326,296,32,-24,-354,119,656,740,1256,443,3,-221,-455,-478,-240, +-1033,-1154,-1047,-829,-902,-1153,-554,941,851,277,511,542,819,446,-89,88,92,110,104,146,-165,369,536,9,165, +-33,94,76,-170,50,459,891,1127,1127,941,568,751,1103,1060,2132,2332,1934,1228,346,-270,15,211,-2,302,362, +335,318,183,-17,189,199,-84,267,265,107,145,-233,-90,146,125,87,-114,-465,-964,-937,-733,-338,-83,277,478, +1465,1937,2076,821,1311,157,-758,-117,131,112,157,56,9,150,20,75,133,206,264,249,159,220,56,320,292, +98,150,2,241,595,853,983,1247,717,601,635,1163,1310,1307,1186,586,88,-354,8,-42,137,289,248,327,266, +296,171,166,197,203,120,16,-88,-132,-135,129,243,346,130,-55,-182,34,163,247,283,518,869,884,861,833, +617,561,358,37,136,-67,21,35,99,-34,149,-43,260,24,179,79,189,139,156,22,349,481,246,212,280, +392,448,490,507,528,525,502,547,465,433,454,415,157,132,-373,135,-48,-39,135,120,270,227,27,191,233, +177,29,88,178,182,-110,223,143,176,181,157,121,98,130,181,239,308,383,455,406,347,283,211,258,340, +-58,-355,-564,125,-299,-581,-626,-648,-592,-687,-731,-732,-301,109,-659,-298,18,342,244,262,249,248,252,244,278, +296,311,324,333,362,329,318,306,297,337,-319,-226,-484,314,735,801,53,645,877,888,874,751,862,866,812, +672,160,862,692,316,-507,-292,-343,-344,-355,-357,-352,-329,-331,-354,-384,-393,-393,-330,-286,-222,-256,-242,-249,708, +-189,199,183,-12,93,-163,-64,199,1,-49,14,206,123,165,0,626,-286,-457,-418,-468,-493,-485,-446,-357,-354, +-412,-494,-497,-448,-275,-145,-27,-104,-215,-109,330,68,224,112,132,196,208,-92,260,-167,252,-29,284,120,177, +100,223,-183,-608,-498,-556,-596,-592,-534,-396,-410,-550,-763,-816,-740,-352,-73,208,49,-167,23,398,20,93,95, +81,233,7,35,-37,186,124,-121,65,31,293,-153,148,-301,-774,-696,-775,-833,-782,-615,-341,-326,-557,-856,-875, +-696,-72,439,820,503,-1298,-431,299,140,133,94,-70,-4,94,219,118,158,183,279,163,-14,106,-245,95,-160, +-709,-380,-465,-162,-146,-278,-515,-825,-881,-1044,-1003,-852,-645,-838,-1443,-1056,-1348,-431,44,-169,-279,156,183,162,96, +0,38,23,63,-61,134,182,146,20,234,-11,-431,-419,-832,-649,-472,-173,-68,6,126,-489,-495,51,214,72, +-464,-943,1199,813,874,741,959,667,522,-78,150,30,56,15,77,-43,342,313,199,-126,-85,-211,-433,-165,-136, +-595,-924,-925,-1067,-1071,-798,-1396,-1461,-1357,-242,490,492,1271,312,223,42,7,113,202,314,294,241,125,37,136, +98,-128,96,184,52,6,154,-209,-570,-650,-789,-828,-686,-378,-322,20,760,718,727,196,722,623,40,477,33, +742,895,447,406,422,287,208,229,132,125,103,147,193,332,298,101,95,334,143,167,277,178,327,376,368, +593,745,937,398,56,-363,-307,-118,122,153,-36,377,489,327,289,289,219,258,248,205,78,193,184,159,114, +150,226,161,25,105,-17,-48,21,-202,-186,-80,-24,-50,-22,-320,-455,-495,-320,-105,150,73,-21,185,428,241, +275,218,173,128,216,141,329,130,235,161,232,193,222,275,433,288,128,217,218,239,221,193,145,87,19, +-13,-43,-119,-30,13,33,85,-27,41,304,75,235,241,201,234,177,217,350,263,207,259,282,180,144,36, +207,-160,-167,-159,-201,-187,-185,-175,-226,-253,-267,-267,-268,-279,-231,-175,-126,-56,-11,-58,314,483,392,241,485, +461,480,494,442,505,532,527,520,246,476,463,262,-128,-39,-62,-60,-73,-88,-95,-93,-89,-90,-98,-100,-103, +-78,-64,-51,-36,-3,-50,-88,78,-576,-729,-369,-433,-681,-463,-503,-493,-378,-443,-436,-384,-681,-458,-335,-673,-560, +120,-39,-26,-5,-27,-33,-53,-29,-25,-26,-59,-79,-82,-110,-118,-103,-103,-123,-180,-579,-210,-403,-312,-178,-143, +-83,-216,-388,-254,-152,-218,-230,-159,-272,-135,-530,-99,29,-74,38,-21,-24,-73,-27,-50,-106,-189,-232,-207,-268, +-285,-220,-234,-180,-171,-439,-307,-309,-217,-154,-3,-202,-2,-283,66,-159,-11,-183,-59,-20,-89,-363,-103,144,-17, +138,2,-16,-157,-12,-14,-64,-193,-309,-286,-506,-579,-344,-365,-204,-267,-457,-346,-217,-92,58,252,94,42,149, +181,154,144,146,269,4,147,-356,-29,188,-86,225,53,-4,-200,-54,-56,-224,-450,-615,-519,-820,-872,-460,-450, +-561,-940,-1025,-599,-438,-425,-292,-120,-74,80,109,144,201,231,106,124,29,130,-337,-315,413,302,552,-228,-195, +255,330,261,73,-53,-155,-260,-319,-482,-778,-746,-278,-293,-659,-406,-344,26,214,-73,16,-59,32,-20,-21,-54, +244,243,-24,-94,-304,-258,-206,-437,-367,-257,-343,-737,-658,-568,-307,-652,-645,-464,-587,-557,-465,-584,812,921,619, +751,646,520,247,-80,114,87,6,49,109,-10,175,223,29,-34,-306,-147,44,-193,-344,-579,-571,-484,-106,113, +378,-10,-284,-697,-788,-698,-483,312,-955,-285,-28,-23,141,240,367,344,180,62,38,56,21,-111,27,8,47, +-31,-294,-231,-205,-419,-512,-672,-726,-771,-848,-958,-896,-959,-515,228,305,104,-719,-975,-778,-759,-245,0,57,125, +117,-13,-11,126,166,156,156,91,294,293,195,-16,-187,36,41,30,151,67,-78,-277,-232,-218,-113,-197,-245, +-154,-407,-547,-666,-848,-266,-452,-178,-179,-43,46,194,127,266,266,192,174,165,95,11,-42,36,81,138,125, +201,174,65,-195,-196,-83,52,91,73,-243,-248,114,83,72,77,-211,48,-76,-211,-162,-195,-126,-55,5,-10, +63,-2,141,123,204,152,142,68,76,18,147,280,252,325,277,234,174,-2,-180,-344,-232,-170,-146,-111,-50, +49,19,38,9,-23,96,35,97,144,168,177,92,-8,10,59,6,-26,2,-66,-10,-126,-35,-38,-98,-124, +-151,-163,-166,-106,-50,-42,-50,-73,-83,-44,-40,-33,-28,61,107,-212,-237,18,-135,-215,-37,-50,-41,8,-22, +-33,-12,-256,-163,-29,-259,-201,99,47,54,55,51,46,31,31,25,34,30,33,26,27,34,49,53,71, +264,204,166,506,384,-245,527,425,-48,-74,-95,-169,-146,-154,-195,437,555,-247,407,556,239,236,258,257,244, +245,267,259,258,260,267,292,330,365,355,292,255,122,211,117,198,222,199,268,275,255,335,374,368,278, +363,250,256,430,310,234,426,279,359,356,314,299,331,294,291,306,296,355,455,578,552,352,272,-82,20, +198,110,40,124,175,254,182,58,232,100,185,298,279,303,319,337,443,403,283,347,364,286,275,384,321, +310,328,353,539,763,1022,907,345,146,-309,-233,-187,-226,-190,12,74,164,52,62,0,115,143,105,135,174, +350,228,383,450,385,531,562,440,432,510,360,318,329,358,594,965,1390,1201,276,-34,182,354,439,284,-32, +-121,-43,143,49,116,83,126,194,319,201,180,322,272,382,344,45,-32,-110,-89,-280,-572,-326,-186,-285,122, +387,554,480,377,191,219,-671,-376,-142,-115,186,329,236,-85,-34,-49,59,-31,-19,-56,294,379,290,170,85, +223,426,579,666,558,540,410,422,133,-242,-440,-170,618,870,814,5,-373,1156,1374,907,781,811,491,289,-3, +144,41,11,36,41,-29,152,235,340,100,139,35,11,44,-83,9,235,434,630,423,118,-443,-201,1012,834, +1002,1655,1200,876,48,-65,320,210,463,386,364,125,24,117,62,36,131,145,165,334,126,24,0,0,11, +27,183,208,2,171,71,146,-124,179,805,1768,2333,2575,1583,1547,1070,220,354,388,261,215,246,229,272,397, +235,201,178,287,275,170,232,253,234,141,113,75,59,188,518,739,994,1380,915,887,1162,1150,1188,1030,1335, +450,433,34,272,277,363,325,250,286,252,223,195,174,94,133,249,385,271,190,168,238,302,356,728,864, +785,572,228,-123,-135,28,421,428,447,361,434,294,192,293,308,246,223,200,202,161,143,163,183,202,296, +219,158,67,167,323,341,244,241,167,144,116,123,146,218,270,386,434,491,465,484,513,408,368,435,118, +336,312,308,366,372,389,438,439,459,386,400,293,229,276,158,27,-1,-49,-20,-20,-16,-19,-31,15,59, +111,182,268,367,369,370,371,377,313,353,436,317,-67,472,337,38,28,16,-15,-18,-22,-39,355,431,-77, +278,341,174,192,192,184,184,181,169,212,243,273,293,309,337,323,323,317,330,337,-403,-367,-445,-415,-90, +553,-503,-124,462,470,477,491,522,540,588,-103,-453,661,-50,-369,-416,-344,-397,-392,-400,-407,-416,-421,-430,-420, +-479,-490,-444,-486,-467,-391,-413,-399,-529,-19,-447,-283,-136,-234,-165,-299,-364,-294,-379,-283,-241,-87,-110,-236,-177, +183,-400,-385,-471,-491,-523,-530,-533,-525,-536,-514,-662,-693,-569,-681,-621,-414,-456,-469,-501,-461,-374,-225,-125,-42, +-9,-31,-106,-125,-189,-10,-35,0,-70,-4,-27,-79,-239,-428,-495,-556,-578,-610,-654,-677,-747,-670,-996,-1064,-794, +-1050,-888,-410,-536,-344,-463,-538,-539,-362,-156,35,201,28,15,8,131,88,172,90,80,169,82,142,-122,-419, +-596,-750,-828,-872,-840,-854,-848,-731,-1254,-1365,-958,-1289,-1008,-250,-400,-1191,-728,-122,-58,-65,-102,-155,11,-1,12, +33,42,118,250,69,26,137,-108,-201,-474,-630,-430,-344,-287,-251,-376,-611,-763,-1063,-626,-598,-804,-939,-1020,-1096, +-1205,-662,-740,-843,-628,-292,41,140,-143,-54,-87,15,-22,-35,-29,187,163,40,48,147,-197,-593,-749,-955,-773, +-495,-328,-39,-156,-724,-745,-774,-245,-436,-439,-455,-526,499,906,1135,892,913,333,144,-88,-9,-52,-40,-30,-67, +-49,-147,-116,331,-59,-254,-306,-133,-153,-331,-674,-1065,-1543,-1285,-1207,-1254,-1425,-1787,-1720,-2724,-2511,-1670,-190,-713,198, +138,29,364,266,335,214,14,-42,36,-11,10,113,51,94,305,-1,-21,-168,-529,-712,-706,-756,-601,-451,-440, +-663,-884,-1139,-987,14,-594,-923,-1408,-1001,-1360,-391,538,234,158,207,123,53,159,159,277,150,113,73,181,183, +143,-10,19,-135,-157,-113,-212,-406,-549,-712,-509,-490,-694,-469,-480,-405,-1004,-1275,-1418,-1347,-659,-465,147,-16,186, +146,158,175,76,88,159,90,39,21,58,99,86,195,217,174,-12,-67,-5,154,242,253,179,94,-37,-25, +-211,-568,-301,-333,-584,-568,-185,-137,-68,-92,42,32,73,84,131,53,71,47,232,223,170,15,-57,-51,-22, +-140,-142,-36,-11,-38,-62,-43,-135,-189,-246,-246,-205,-198,-200,-206,-170,-148,-22,-16,426,69,171,187,68,96, +-9,-28,26,-70,-77,-81,1,27,-81,-40,67,-23,55,27,47,57,70,87,36,-19,-85,-150,-228,-293,-239, +-182,-131,-90,-61,-107,-22,180,537,-136,128,472,494,504,504,534,548,556,92,-133,496,98,-81,-72,-49,-56, +-48,-42,-37,-24,-52,-71,-89,-111,-132,-179,-144,-132,-115,-100,-122,433,311,527,161,-266,-788,361,-153,-661,-707, +-717,-688,-747,-750,-735,-162,319,-797,-202,188,550,391,447,456,454,449,433,433,438,465,457,467,497,476,433, +323,352,237,442,-439,318,1,41,257,207,337,304,128,280,261,291,93,167,260,281,-265,512,518,542,588, +585,566,511,509,521,590,572,626,707,694,572,262,241,181,365,43,146,-144,62,103,189,30,123,-28,200, +-9,296,108,263,224,252,191,397,632,602,737,721,710,638,599,622,793,762,854,956,831,541,-38,66,26, +283,-19,143,-65,129,196,224,121,43,59,63,164,304,247,344,208,418,199,428,739,795,965,965,930,806, +738,765,993,925,1106,1331,1188,690,-167,-213,452,42,95,180,-271,-183,-28,49,38,93,67,58,126,236,135, +177,164,301,44,250,555,226,194,313,316,77,184,261,405,870,965,710,639,482,130,186,-17,-268,-343,-155, +280,214,189,-83,54,26,55,35,10,83,301,313,229,138,-85,160,616,749,1079,621,351,131,-142,-306,-633, +-279,-43,315,249,163,66,133,484,754,748,724,698,254,30,3,27,33,35,65,-22,26,-96,82,462,297, +141,137,140,-83,-34,444,821,822,994,735,60,221,546,1387,777,514,457,182,1052,167,174,436,381,506,385, +283,21,-36,17,46,43,139,72,85,398,59,-183,-23,178,288,386,274,185,7,284,146,-416,-597,-395,629, +1255,1996,2706,1612,1402,488,-344,99,260,118,165,226,225,334,318,226,178,141,150,154,219,157,-7,56,-83, +-263,-250,-317,-151,115,224,363,609,942,1269,1745,1601,1321,1113,1219,414,215,-267,72,117,225,285,207,204,168, +255,144,128,165,250,254,178,148,141,119,319,482,616,755,767,766,620,449,171,353,558,850,651,602,528, +354,400,242,105,204,67,118,132,203,99,168,46,208,109,203,81,67,-12,-13,-22,40,93,34,30,-4, +-20,-34,96,241,373,475,514,588,496,421,381,341,305,307,-97,246,130,118,216,192,277,293,193,300,304, +291,178,191,266,218,19,182,133,154,163,167,177,162,221,262,320,355,412,486,453,429,387,346,319,381, +170,-56,-290,263,-37,-283,-303,-321,-299,-351,-376,-378,-21,253,-354,-40,170,318,270,281,271,271,270,266,291, +308,325,353,373,402,373,362,354,348,381,-328,-283,-457,83,486,716,-108,412,745,763,751,664,747,759,760, +437,-22,798,476,122,-451,-286,-341,-347,-347,-352,-358,-359,-358,-353,-363,-358,-335,-341,-323,-257,-318,-358,-331,481, +-269,16,106,-57,9,-189,-149,30,-138,-129,-31,128,66,50,-12,547,-268,-395,-399,-461,-457,-462,-457,-441,-438, +-443,-476,-457,-387,-381,-316,-166,-304,-497,-243,74,-40,34,70,114,92,153,-91,94,-221,129,17,224,84,119, +140,245,-89,-485,-450,-550,-538,-561,-578,-586,-588,-566,-632,-590,-458,-447,-307,-57,-377,-613,-170,48,-200,-188,70, +106,156,31,3,-86,55,50,128,83,45,310,87,357,-51,-530,-546,-734,-737,-751,-698,-644,-619,-681,-830,-706, +-470,-360,-92,266,-257,-1091,-636,447,359,74,62,-44,58,-53,-5,64,-17,43,250,124,20,153,-138,117,-92, +-652,-445,-575,-103,-110,-362,-807,-931,-784,-332,-405,-892,-934,-1100,-1266,-1001,-581,-754,-458,-402,-79,61,23,-78,-12, +-2,14,11,-2,16,38,82,277,158,314,-60,-425,-418,-724,-607,-461,-142,-203,-301,-518,-363,-24,471,233,259, +434,8,-197,235,900,666,689,77,27,-35,-11,-47,19,7,-88,64,-108,-82,493,36,-9,-163,-311,-132,-133, +-372,-639,-886,-1147,-1183,-1119,-1152,-1421,-1579,-1862,-1869,-1925,-792,724,650,381,272,533,328,279,164,15,-9,9,-1, +-5,96,-4,52,267,-98,-2,-188,-482,-494,-513,-474,-306,-10,162,166,-163,-224,-368,-351,-312,-180,-100,667,-526, +254,763,354,307,295,240,308,323,218,233,202,166,69,99,124,163,59,122,-158,-205,-193,-361,-200,-195,-256, +-385,-414,-478,-1,232,255,-33,-283,-559,-444,-159,130,444,296,372,273,152,143,27,23,21,91,86,149,180, +185,130,172,149,192,93,113,209,260,289,362,236,268,364,253,48,-272,-332,-254,-164,-109,-227,-52,188,95, +212,166,172,154,230,140,249,66,193,87,125,63,101,29,12,-173,-257,-207,-226,-198,-183,-153,-148,-146,-130, +-149,-144,-186,-147,-164,-210,-169,47,77,398,78,205,184,78,92,16,54,184,97,69,118,184,127,71,39, +201,-20,33,43,48,67,74,82,32,-15,-64,-115,-167,-216,-166,-104,-47,21,15,-29,221,398,463,119,365, +479,509,521,486,544,571,573,378,128,507,354,167,-60,-3,-19,-13,-18,-20,-11,-32,-44,-54,-60,-63,-80, +-52,-41,-28,-20,18,142,87,295,-302,-566,-510,-127,-486,-531,-561,-558,-478,-545,-538,-486,-496,-176,-483,-500,-288, +289,131,154,157,158,151,126,131,137,156,150,146,161,101,81,86,91,82,116,-542,13,-266,-147,17,-21, +89,-18,-209,-73,-7,-33,-104,-28,-78,37,-398,133,216,148,202,208,202,134,141,145,169,169,145,139,-25, +-82,-24,-21,59,102,-289,-120,-253,-63,-10,32,-96,53,-219,86,-146,82,-66,67,61,58,-113,115,321,188, +270,246,220,54,101,130,227,219,166,198,-194,-302,-58,-122,28,-42,-383,-228,-261,44,160,185,132,27,70, +38,110,286,189,298,121,361,-15,205,360,180,345,336,285,52,112,175,243,201,92,61,-524,-674,-232,-263, +101,-672,-354,6,-308,-218,-80,45,-122,-88,82,-3,51,155,134,174,27,172,-147,31,585,378,438,86,48, +82,71,224,340,700,657,156,156,-36,-303,-213,333,-252,-604,-322,93,-57,-27,-84,-34,-44,-6,4,-5,67, +75,105,222,96,-143,-125,69,-8,206,94,-55,-258,-513,-494,-256,-160,-256,-525,-619,-371,155,204,-727,-150,371, +451,220,2,-111,11,-10,33,29,81,-16,72,-114,11,282,199,-28,69,222,15,16,226,390,472,203,90, +-29,500,503,-100,-391,-965,-1549,-1147,900,511,445,419,511,391,294,215,73,33,-22,-11,-17,90,29,7,203, +-28,-286,-140,-14,-39,-20,-56,-124,-79,-307,-448,-724,-601,-538,-339,35,479,822,895,-90,-413,-374,-53,121,86, +187,269,179,232,163,255,201,27,54,100,235,68,-169,-66,-70,-198,-245,-202,-293,-386,-613,-614,-504,82,518, +834,761,501,224,-82,273,19,-32,95,121,110,147,84,75,56,60,95,153,216,197,100,39,61,139,158, +286,335,332,221,179,205,275,437,622,565,534,640,374,218,210,189,68,-34,-149,-10,-27,37,91,149,97, +163,58,147,39,55,47,117,130,71,-97,46,157,35,38,33,50,37,43,17,13,54,91,133,85,46, +3,-27,177,134,-38,127,28,31,78,54,113,68,-18,45,99,65,17,49,48,95,-33,163,163,162,174, +168,167,169,212,245,257,261,257,263,249,231,215,190,203,245,-14,-127,-68,48,-120,-119,-130,-131,-91,-128, +-144,-131,-146,32,-132,-136,-3,249,189,202,201,203,207,204,206,207,217,227,237,247,233,226,223,214,260, +50,28,-48,403,470,129,334,461,258,258,239,149,195,193,163,466,369,148,458,420,-24,46,38,27,29, +31,40,42,46,42,60,68,68,76,71,62,35,-36,83,342,99,192,221,190,180,105,172,258,184,125, +206,216,199,305,196,368,166,18,72,31,38,26,26,19,30,34,95,141,150,208,189,119,62,-147,67, +261,148,104,196,219,174,203,6,163,-55,130,144,278,243,244,265,387,228,-23,38,-19,-18,-23,23,22, +58,26,157,229,181,301,212,12,-25,-181,43,80,-86,-165,124,144,123,69,23,-74,2,66,135,123,132, +371,234,422,257,-32,74,8,18,12,-10,-16,-11,-71,189,369,372,619,499,62,-24,-370,-134,620,582,116, +124,114,226,-32,-69,53,-15,34,183,229,193,203,138,396,352,-95,-135,-307,-168,-323,-555,-405,-252,-101,167, +167,-86,-199,-349,-478,-264,-274,-407,-45,-59,321,35,-178,-130,-100,-58,-40,-7,-6,-14,-24,84,398,181,144, +106,151,304,316,368,289,117,-129,-217,-241,135,225,100,317,378,251,136,-866,-417,188,113,137,-84,6,72, +54,3,-1,30,-53,37,-21,53,366,207,297,126,17,125,64,138,186,370,-3,-237,-457,-257,-31,143,355, +40,-431,-796,1764,949,641,637,568,457,270,162,108,64,23,-2,-9,147,82,107,235,77,74,-70,-93,0, +4,272,272,229,-85,-113,6,287,244,-368,301,875,1566,1949,671,661,351,296,382,283,283,401,338,246,213, +257,199,65,61,97,201,170,193,54,42,9,-162,-137,-218,-154,-337,-157,296,424,728,933,1224,1208,953,791, +483,596,451,470,385,303,176,172,68,29,-18,95,172,201,215,216,230,148,126,133,110,123,123,277,352, +301,398,426,457,460,424,369,150,111,206,436,48,122,271,284,335,300,274,254,259,206,245,131,115,67, +123,172,242,249,291,234,155,178,148,124,98,64,117,172,242,214,185,167,160,138,65,71,204,226,199, +159,199,177,163,154,139,184,249,237,205,242,227,165,175,108,148,63,38,47,40,46,52,57,66,79, +108,144,192,233,218,221,227,235,158,136,364,383,199,323,381,254,263,262,228,249,256,245,405,328,226, +379,326,98,131,125,119,114,108,98,115,128,138,152,164,188,179,175,166,164,188,-229,-216,-196,-400,-270, +192,-391,-272,101,105,109,145,140,153,199,-270,-387,265,-241,-384,-197,-203,-233,-235,-232,-234,-249,-235,-234,-238, +-252,-264,-269,-294,-285,-227,-247,-216,-292,-151,-242,-261,-117,-136,-138,-168,-255,-296,-304,-217,-223,-112,-97,-212,-141, +-55,-268,-224,-308,-313,-312,-306,-328,-288,-295,-331,-365,-404,-419,-495,-445,-259,-298,-262,-225,-311,-204,-185,-34,9, +-33,-40,-40,-196,-129,-112,-75,-27,-23,-9,-45,-147,-173,-239,-334,-381,-370,-379,-454,-373,-367,-420,-488,-566,-593, +-723,-612,-254,-387,-132,-93,-191,-165,-195,40,151,171,102,8,1,6,41,182,127,148,136,155,37,-62,-240, +-443,-522,-530,-529,-588,-466,-468,-582,-705,-827,-867,-1043,-769,-150,-303,-810,-844,-391,-65,-63,15,20,68,-87,-126, +-2,-43,13,100,169,179,47,16,-89,-248,-236,-145,-3,-192,-218,-217,-102,-87,-90,-103,-296,-542,-810,-940,-875, +-907,100,-465,-589,-324,-32,-158,-219,-222,-124,-101,-86,-3,-19,-12,-80,-45,165,79,41,-110,-265,-431,-543,-304, +-291,-513,-396,-332,-308,-107,-149,-414,-445,-343,-5,40,-1287,-829,-169,-50,-150,-182,-114,8,-15,-10,-62,-28,-79, +-7,-104,-67,147,85,-31,-86,39,18,-52,-204,-446,-669,-738,-638,-510,-318,-521,-1257,-1471,-1727,-1844,-1560,488,1010, +818,589,613,384,263,77,94,55,-18,-18,-9,44,25,40,108,85,11,-109,-141,-239,-318,-204,-270,-387,-837, +-941,-781,-439,-413,-659,-1234,-1325,-1025,-134,-962,-502,141,108,170,181,190,179,168,133,88,168,126,15,12,41, +171,-7,-76,-134,-132,-140,-216,-418,-661,-883,-1073,-1071,-927,-638,-391,-181,-167,-230,-320,-753,-148,-132,262,135,172, +75,74,98,22,18,23,29,82,115,120,73,57,51,96,59,-55,-157,-244,-211,-159,-168,121,342,500,489, +335,-9,-56,-143,-215,-167,-69,-32,-58,-12,93,109,140,153,164,156,111,122,116,83,107,134,174,140,69, +46,133,191,245,199,166,122,62,-11,-54,-156,-214,-272,-217,-191,-175,-128,-5,-37,169,16,29,45,-4,-1, +-44,-81,-91,-118,-84,-100,-36,4,-61,19,63,137,156,95,89,67,58,55,56,49,31,6,-28,-79,-67, +-61,-43,-34,-36,-55,-104,-8,279,-136,-20,223,229,236,256,256,260,269,-57,-128,267,-12,-72,65,35,29, +22,17,11,1,-13,-27,-40,-49,-56,-71,-57,-53,-48,-51,-53,312,241,348,270,1,-491,380,74,-369,-388, +-401,-421,-447,-454,-465,60,354,-502,19,269,348,274,312,309,316,318,313,326,331,329,340,345,345,349,328, +260,276,225,384,-113,310,115,141,261,190,277,280,176,251,209,235,137,184,273,227,-90,365,337,380,387, +399,396,372,403,411,408,434,451,448,463,398,230,241,202,315,215,226,-12,177,187,150,116,103,21,87, +0,170,173,269,210,199,196,286,388,409,450,478,489,467,529,558,552,606,631,604,619,464,160,213,191, +361,272,303,23,241,243,161,152,42,-30,-51,70,178,236,296,227,295,203,309,456,538,600,640,651,581, +654,648,628,729,767,744,747,494,68,116,259,-3,-39,95,-37,98,167,92,-33,-62,-10,-25,32,110,240, +280,126,291,230,308,407,217,201,193,138,-22,279,450,639,581,595,700,535,425,295,177,200,-23,9,91, +268,36,-112,-157,-82,-50,-70,23,17,21,17,98,314,180,51,207,468,568,723,471,194,-105,-164,-119,118, +207,243,38,250,239,106,187,-944,-691,-481,-255,-240,-147,-89,35,25,34,-25,2,-43,-17,-1,57,125,241, +284,188,113,55,100,450,644,656,621,498,376,462,757,1044,1077,827,608,-692,1459,1025,935,904,614,545,293, +107,104,47,0,39,28,42,54,90,164,204,113,51,328,433,400,389,188,-102,-209,-183,-9,63,83,24, +208,750,1848,1492,1421,645,-49,243,347,229,247,288,234,237,162,162,130,130,32,21,124,141,83,10,-146, +-223,-163,-250,-195,-105,-77,-16,173,196,491,979,1420,1639,1738,1520,540,477,114,290,184,207,187,158,165,136, +139,86,111,136,211,247,276,101,38,-20,30,47,10,166,222,231,375,417,391,552,696,839,599,481,439, +440,361,316,257,321,264,269,245,252,197,233,187,249,135,169,142,194,196,219,239,288,323,312,302,293, +285,271,346,415,485,439,376,358,351,348,309,316,206,206,-60,152,94,77,140,129,179,211,166,235,232, +236,179,195,272,246,135,290,216,204,188,160,140,109,157,198,260,315,385,439,386,338,299,260,204,224, +197,59,-173,252,86,-127,-143,-161,-164,-195,-214,-228,107,272,-182,116,248,271,231,231,211,202,192,171,198, +212,221,239,252,286,263,255,242,232,243,-287,-234,-365,-88,227,556,-212,174,521,547,542,495,545,555,564, +185,-158,625,214,-77,-372,-256,-301,-312,-309,-307,-307,-287,-287,-304,-324,-334,-327,-333,-313,-243,-269,-247,-296,331, +-214,-48,50,-76,-60,-168,-176,-99,-207,-171,-135,47,15,-53,-90,301,-314,-350,-377,-430,-418,-405,-395,-332,-337, +-389,-438,-456,-410,-411,-343,-183,-246,-273,-234,-14,-74,-29,74,99,3,105,-45,-42,-203,14,-94,138,54,57, +8,35,-201,-430,-429,-550,-519,-509,-509,-371,-381,-500,-609,-666,-588,-590,-459,-144,-231,-237,-76,140,-55,-135,97, +161,127,115,29,-96,-42,-16,54,143,120,201,14,140,-193,-512,-568,-771,-720,-689,-656,-424,-448,-645,-787,-809, +-648,-563,-322,91,-84,-872,-649,-280,-132,146,187,78,-3,-96,-134,-43,-69,-8,101,188,145,75,-58,77,-107, +-503,-349,-353,-181,-179,-185,-276,-282,-222,-520,-765,-883,-1032,-987,-770,-711,-298,-268,-121,-135,-224,-159,-153,-114,-114, +-93,-102,12,18,-27,-107,-67,142,134,250,-55,-419,-528,-822,-653,-515,-319,-233,-185,3,-28,27,42,53,19, +-2,-221,-978,-889,-431,-327,-145,-168,-67,-67,-32,-14,-46,-49,-69,-30,-35,-121,-17,-21,28,-127,-215,-117,-130, +-458,-845,-1124,-1179,-967,-483,-720,-1074,-1436,-1504,-1285,-1035,-944,163,925,957,650,650,327,204,-3,57,19,-21,4, +1,-37,-28,23,4,99,220,-96,-208,-296,-397,-471,-445,-394,-378,-349,-275,-364,-435,-500,-1303,-1586,-1333,-465,-270, +204,679,377,285,310,246,210,224,116,71,56,59,113,22,-2,21,-14,36,-264,-339,-290,-307,-293,-364,-646, +-529,-642,-999,-862,-803,-723,-446,-162,15,-92,-219,9,395,206,205,136,83,99,86,107,86,72,47,70,117, +158,164,122,43,-5,-177,-286,-340,-373,-341,-224,-67,100,258,327,224,-78,-63,-133,-193,-168,-39,101,199,142, +255,205,186,145,216,166,250,150,230,156,185,140,163,149,161,73,58,138,169,210,232,264,201,138,83, +-44,-117,-195,-142,-113,-113,-35,-57,-60,237,-21,64,69,-9,3,-54,-46,33,-29,-24,8,111,138,101,145, +289,224,245,207,183,165,148,138,87,41,-4,-48,-103,-179,-160,-140,-114,-85,-89,-135,11,176,363,-66,157, +351,372,384,373,411,430,433,181,-15,429,215,68,-15,1,-11,-10,-16,-23,-25,-51,-72,-97,-119,-135,-161, +-133,-123,-113,-111,-132,258,210,366,-52,-346,-523,104,-267,-498,-513,-516,-477,-532,-532,-513,-284,56,-515,-308,-63, +349,225,259,256,263,265,254,274,275,265,257,253,270,243,229,204,230,242,278,-340,203,-83,-16,137,66, +207,144,-45,81,98,67,4,72,74,105,-326,215,293,278,310,327,337,304,355,350,319,307,299,336,268, +226,169,197,263,201,-36,61,-154,70,84,46,12,117,-142,106,-102,58,22,158,126,70,-57,111,363,301, +348,369,388,306,439,444,372,334,295,390,238,159,108,172,239,143,35,135,-108,137,225,131,201,70,-15, +-61,41,137,252,339,105,227,-85,84,369,328,436,491,504,361,561,537,419,392,365,490,266,131,58,74, +500,-235,-672,-335,-48,9,76,-14,-90,-113,-38,-33,23,61,172,248,92,256,13,200,542,319,353,78,89, +208,440,604,769,417,238,278,129,118,187,331,159,192,58,79,-53,-175,-126,-56,-68,-70,-83,24,34,21, +25,35,60,117,-30,43,209,147,315,170,32,-104,-215,-161,117,92,102,1,94,86,3,-97,-435,-768,-729, +-409,-317,-96,-76,-47,-12,61,-8,35,19,-12,9,-1,-137,164,132,98,126,-78,-65,81,224,291,405,464, +497,474,457,352,338,345,346,-140,409,483,795,740,543,366,184,52,61,11,-30,20,5,-43,-3,-10,-42, +169,50,-27,204,201,222,62,-74,-280,-183,-232,-384,-437,-316,-8,-73,-2,266,153,1187,451,5,251,267,219, +248,231,163,168,49,50,66,153,52,24,38,31,-137,-142,-219,-356,-327,-280,-213,-257,-32,-32,-248,-219,-164, +48,530,899,1205,1165,367,168,-65,83,29,98,170,130,221,222,209,151,133,128,151,149,135,97,56,-41, +29,49,32,-146,-206,-127,-18,78,148,368,596,856,781,632,467,340,359,259,124,206,146,155,131,130,98, +165,125,216,136,167,141,165,144,155,121,276,360,294,322,351,393,412,437,460,478,440,395,396,332,312, +300,302,166,152,-117,129,26,27,110,89,165,145,67,138,173,158,130,184,252,293,201,346,299,299,281, +264,244,222,245,259,276,289,307,313,289,253,217,181,174,219,-5,-152,-229,84,-125,-233,-250,-253,-226,-257, +-273,-271,-110,93,-212,-83,73,243,201,215,215,216,220,220,221,219,216,217,217,223,211,208,205,198,199, +-68,-53,-186,254,439,353,144,401,413,436,423,340,394,393,365,405,190,394,413,259,-168,-63,-83,-93,-89, +-82,-67,-59,-65,-97,-91,-88,-73,-63,-52,-33,-58,-71,-54,442,18,141,174,89,88,13,64,147,53,20, +70,169,141,189,82,354,-43,-125,-91,-139,-134,-125,-88,-58,-68,-135,-123,-95,-27,11,32,37,-1,-134,-88, +220,107,59,171,173,70,186,16,90,-106,92,-1,215,167,192,144,214,0,-188,-129,-212,-193,-161,-75,-24, +-54,-227,-193,-169,-68,33,76,38,-1,-115,2,287,91,-119,106,156,75,129,65,-130,-63,-19,-8,150,138, +276,52,196,-50,-246,-165,-290,-264,-222,-124,-22,-86,-316,-225,-95,118,293,334,152,91,-360,-145,-88,-54,323, +229,111,48,-62,-107,-59,-38,12,78,161,155,240,81,283,223,-246,-225,-369,-254,-260,-188,-209,-234,-138,-463, +-605,-463,-517,-446,-307,-144,-482,-136,299,91,-195,-237,-261,-94,-102,-64,-89,4,15,-49,-56,-29,54,126,238, +48,-146,-127,-281,-169,-132,-73,-9,41,119,56,139,262,386,323,81,-220,-37,-556,-511,-436,-199,-103,52,-39, +-3,12,-17,-1,-2,-10,65,-40,-81,74,217,-36,-211,-150,-219,-362,-450,-452,-433,-462,-446,-632,-705,-613,-401, +-129,2,141,25,354,672,571,493,212,69,-28,29,-7,-22,-8,-20,-54,-38,-4,-82,123,245,-78,-186,-196, +-167,-166,-158,-223,-66,1,8,20,-48,-401,-252,-385,-700,-189,867,989,862,564,417,401,329,289,251,118,39, +3,42,148,76,43,-45,13,65,-162,-193,-235,-326,-241,-168,-87,53,61,-86,-308,-455,-612,-139,302,556,869, +234,339,384,312,260,234,180,201,191,192,144,177,138,82,78,114,135,132,46,-37,-132,-165,-155,-254,-292, +-297,-318,-278,-142,42,212,285,412,436,356,339,136,213,331,268,323,247,182,111,163,115,212,100,179,118, +177,148,179,210,305,256,176,216,206,250,288,329,353,389,419,339,278,235,206,188,151,185,104,130,224, +112,171,154,127,136,116,144,224,181,160,196,232,196,209,183,299,110,115,141,135,150,148,150,104,69, +52,51,57,54,65,79,91,106,84,58,218,284,210,182,280,251,263,270,242,277,290,283,310,194,283, +295,206,21,79,74,85,89,95,110,100,95,84,75,66,57,67,72,75,78,86,-10,-15,42,-271,-314, +-89,-196,-285,-146,-142,-137,-93,-122,-115,-85,-293,-216,-33,-277,-261,47,-10,-12,-13,-12,-11,-9,-7,-14,-41, +-40,-41,-25,-47,-41,-12,-18,16,-65,-212,-37,-176,-87,-38,-65,-4,-76,-184,-138,-83,-113,-74,-35,-86,-37, +-183,-71,6,-55,-39,-42,-19,3,9,-24,-100,-104,-112,-65,-133,-114,-28,-42,26,-89,-213,-98,-185,-6,11, +-41,-29,57,-160,-1,-112,-51,-52,28,70,-4,-144,-87,29,-60,-62,-66,-44,-32,-8,-59,-205,-212,-233,-122, +-253,-191,5,-69,108,-23,-7,55,-132,35,160,106,171,77,-22,-55,-7,76,164,213,111,131,-99,-77,5, +-141,-141,-140,-83,-5,3,-107,-304,-327,-331,-173,-387,-266,23,-46,-66,-432,-848,-512,120,38,16,-34,-97,-125, +-68,-19,28,10,82,162,181,121,-85,-57,123,103,198,-70,-27,200,242,230,203,-223,-390,-298,-378,-321,-190, +-100,85,-51,-69,-34,-340,-357,-257,-154,-100,-69,-83,-3,-2,-16,-18,-59,-133,62,42,-70,-120,-291,-310,-216, +-198,-287,-95,-29,61,0,-123,-286,-242,-215,-145,-115,76,-343,-473,-323,-314,-99,-29,-42,-50,20,-14,8,17, +0,35,-34,-192,75,-5,-94,-1,-150,-200,-271,-300,-356,-170,-149,-269,-160,-296,-741,-701,-597,-482,20,-804,-63, +392,375,338,96,-3,-66,-5,-29,-66,-29,-28,-107,-74,-81,-124,105,39,-55,-89,-210,-168,-249,-285,-366,-358, +-366,-393,-360,-374,-453,-522,-827,-1466,-1202,333,383,418,385,302,320,317,202,117,76,-29,-10,28,86,56,24, +-41,-102,-212,-175,-148,-209,-189,-256,-237,-175,-244,-353,-468,-510,-634,-823,-664,-378,-14,181,208,8,96,101,101, +121,187,170,207,209,211,180,134,48,4,-29,-24,52,53,-32,-70,-146,-202,-351,-438,-518,-528,-411,-182,-13, +215,433,642,639,505,308,264,184,64,92,82,80,64,52,41,82,39,105,91,108,113,121,111,115,105, +159,210,197,216,238,273,299,335,350,360,325,303,300,241,218,226,225,137,107,61,133,77,89,119,112, +141,95,45,61,91,66,63,90,80,123,87,133,162,172,192,208,221,236,230,225,219,215,210,204,201, +185,164,135,161,177,-8,-44,58,30,-40,18,12,19,49,35,32,43,-60,14,48,-47,1,178,166,178, +190,200,212,227,216,209,201,193,184,173,169,167,169,166,180,179,146,129,303,219,-132,321,243,-34,-31, +-40,-85,-81,-90,-116,235,323,-119,224,315,162,162,178,174,174,180,202,187,178,151,177,188,200,213,208, +174,172,122,196,149,218,177,159,185,154,181,223,218,207,154,189,154,170,279,198,119,239,188,233,223, +215,221,269,223,195,150,210,260,304,344,312,198,186,101,111,225,175,57,168,156,91,140,85,112,41, +52,97,156,212,244,212,232,200,209,248,256,251,277,397,304,261,132,250,327,386,490,416,214,210,52, +115,317,256,10,136,154,57,138,89,-75,-78,-8,34,164,201,269,176,180,170,238,331,346,338,385,535, +370,224,82,306,493,610,721,580,207,197,226,167,-211,-177,273,166,112,51,-32,-66,-66,3,39,25,103, +171,311,223,247,280,227,144,17,50,36,22,118,186,281,-129,-119,267,269,277,183,296,-104,46,379,219, +-93,-189,-215,-131,-98,-38,-62,-13,7,-11,27,22,-1,118,142,143,224,284,349,215,121,31,109,66,-6, +98,123,24,272,190,-208,-70,299,-10,-276,-273,-180,-74,35,-16,-24,8,19,10,10,5,91,31,-67,136, +218,47,-68,-104,-112,19,180,290,392,256,-71,-97,102,403,760,852,821,522,-408,-214,168,292,195,49,-84, +-114,-36,-54,-62,-12,-6,-62,-44,-32,-42,100,127,58,46,75,123,150,123,33,114,150,173,158,98,-140, +418,491,257,-208,1496,1295,722,650,524,491,437,328,218,133,60,18,31,87,57,23,-58,13,15,-21,-58, +-80,-59,-42,91,306,206,185,312,130,48,-56,120,440,893,1271,625,543,289,372,280,317,279,230,248,234, +223,216,162,53,18,39,89,96,53,-33,-69,-95,-127,-94,-145,-246,-377,-425,-352,-189,120,546,717,808,778, +693,443,387,368,332,262,225,172,134,119,122,133,131,115,147,148,156,150,163,238,204,144,146,105,148, +183,221,365,497,612,649,664,697,601,554,518,488,318,327,141,275,249,238,278,271,295,311,309,324,293, +295,243,206,245,183,142,98,101,150,175,206,232,251,261,275,311,356,413,484,453,427,391,357,312,321, +354,282,62,380,295,109,101,95,80,77,74,65,302,352,65,272,311,222,250,259,267,275,283,294,308, +323,333,345,353,372,351,344,335,332,349,-194,-165,-240,-196,-1,344,-243,-30,273,294,298,304,315,321,339, +-24,-217,407,15,-167,-211,-166,-197,-201,-206,-205,-187,-203,-211,-230,-230,-230,-222,-224,-210,-165,-185,-182,-280,98, +-172,-86,-37,-109,-87,-131,-156,-124,-189,-148,-142,-27,-31,-78,-67,131,-210,-198,-248,-270,-284,-273,-223,-266,-300, +-347,-353,-346,-307,-310,-266,-155,-197,-202,-283,-157,-130,-50,-3,2,-52,14,-4,-41,-95,-33,-84,7,0,73, +28,-17,-129,-220,-268,-331,-357,-345,-252,-327,-381,-487,-490,-489,-424,-410,-320,-103,-189,-214,-250,-18,-50,-80,-3, +75,47,103,72,-35,-52,-47,22,94,108,189,59,59,-101,-245,-365,-481,-517,-478,-319,-437,-569,-700,-699,-634, +-525,-493,-328,-21,-130,-468,-356,-560,-424,220,112,19,-27,-62,-93,-78,-7,18,-7,44,88,216,21,-5,-157, +-244,-118,-93,-78,-54,57,-36,-69,-51,-558,-741,-632,-577,-484,-406,-413,-104,-143,17,-16,-329,-290,-210,-122,-108, +-69,-63,-22,3,0,-18,-71,-125,42,136,-47,-273,-430,-605,-464,-311,-188,-98,-127,-231,-232,-236,-304,-242,-271, +-362,-200,88,-31,-125,-184,-139,-117,-30,-99,-83,-23,2,-27,-23,3,16,-79,-109,-36,-67,-150,-155,-154,-148, +-395,-596,-711,-685,-569,-470,-604,-844,-1176,-1041,-857,-686,-46,-1501,-472,-115,-100,41,-188,-186,-218,-98,-83,-90,-31, +-7,-76,-74,-78,-102,-25,40,20,-190,-330,-369,-377,-295,-179,-238,-282,-291,-318,-359,-405,-837,-1294,-1804,-1750,-132, +502,885,610,430,520,435,212,145,43,16,-15,-18,-11,9,-5,-79,-64,-66,-141,-122,-69,-56,-74,-156,-331, +-484,-592,-664,-610,-712,-923,-1191,-1082,-658,-369,97,93,375,246,254,223,209,175,185,199,203,176,112,32,-42, +-65,-55,33,41,-21,-174,-296,-373,-442,-494,-497,-538,-479,-319,-334,-311,-287,114,279,260,197,254,229,197,139, +150,124,118,87,110,97,96,94,146,151,150,116,103,49,27,-72,-81,-37,-27,32,74,121,141,150,159, +203,279,323,302,294,329,301,221,211,329,227,234,247,204,204,168,134,141,96,89,69,103,109,57,83, +129,92,159,164,185,205,228,258,242,226,198,179,143,127,149,169,183,190,180,173,151,232,389,117,212, +355,359,366,371,380,389,397,174,78,367,176,97,132,148,152,169,177,185,198,183,177,174,166,160,143, +153,155,160,167,160,255,200,295,107,-123,-394,218,-69,-348,-359,-360,-339,-382,-389,-391,-78,186,-398,-89,121, +317,234,264,264,261,262,274,252,247,244,257,266,276,281,265,207,228,192,250,-194,223,67,39,139,106, +201,197,112,171,147,139,56,105,174,176,-131,291,314,323,344,335,330,344,281,261,271,294,322,335,351, +304,162,193,162,120,42,115,9,72,55,59,31,110,41,131,-23,97,43,158,183,172,119,224,390,367, +416,395,398,442,324,296,297,357,416,449,486,378,101,156,66,10,34,171,48,72,96,40,120,87,16, +-58,3,69,157,238,194,236,80,226,455,459,550,525,527,546,353,246,282,387,490,507,525,345,-37,16, +467,163,-362,-273,105,84,111,21,-1,-20,-51,29,37,-11,70,171,230,289,131,202,483,333,311,178,167, +205,323,451,656,279,286,552,627,605,410,400,216,205,215,180,-9,-146,-136,-65,-59,-30,-28,-10,20,48, +94,61,-15,61,-7,158,341,334,481,292,192,123,-65,-123,-68,-94,-94,-168,-60,-108,-320,10,253,146,-163, +-161,-211,-95,-57,-93,-60,13,30,24,19,21,42,44,-42,128,110,133,96,-25,56,217,428,611,581,480, +263,271,458,724,933,903,803,382,-687,-663,-345,-124,-150,-156,-191,-176,-104,-84,-63,6,18,-12,-5,-32,-28, +11,-32,162,214,218,230,178,140,109,81,51,46,-59,-39,167,285,386,547,-392,1182,872,468,594,522,525, +455,247,146,110,81,25,-3,-4,10,7,-37,84,10,64,-4,-60,10,29,23,-2,-6,30,135,120,148, +240,79,138,481,840,659,487,204,322,232,280,294,244,290,268,268,207,168,122,61,39,27,10,4,-65, +-52,-54,-102,-126,-156,-116,-177,-240,-290,-271,-129,194,439,612,649,625,597,449,329,347,231,230,208,194,133, +170,105,188,122,187,141,150,114,73,32,47,70,32,23,61,90,107,184,265,335,501,647,793,737,714, +735,635,448,457,188,397,310,301,354,331,376,364,296,339,322,290,218,217,258,234,122,213,202,228,239, +249,263,273,330,376,415,457,491,554,531,516,492,467,414,453,339,206,40,387,210,43,22,8,13,-19, +-36,-42,181,332,-31,163,279,341,325,341,348,355,362,363,382,399,421,436,451,471,451,442,432,433,443, +-147,-130,-247,60,285,422,-40,232,404,423,423,390,421,422,411,246,4,453,278,89,-210,-120,-148,-154,-159, +-159,-141,-163,-172,-181,-176,-172,-170,-151,-140,-123,-144,-160,-186,304,-91,94,71,-39,4,-83,-50,64,-47,-55, +-27,76,53,62,25,321,-106,-155,-160,-201,-216,-223,-181,-238,-255,-257,-251,-229,-212,-157,-127,-104,-128,-237,-223, +27,5,124,54,38,17,79,-6,118,-76,63,-34,107,63,123,124,177,-10,-184,-167,-245,-267,-269,-170,-300, +-342,-377,-353,-317,-300,-170,-109,-114,-162,-238,-174,42,-13,39,-9,4,18,47,63,-15,-27,-41,-22,59,66, +247,77,221,9,-187,-198,-335,-378,-382,-254,-429,-506,-515,-457,-347,-325,-124,-35,-87,-111,-504,-163,-83,-120,257, +214,118,31,4,-25,-46,15,16,2,61,81,220,84,217,35,-271,-188,-266,-126,-117,-55,-283,-334,-198,-541, +-595,-411,-271,-213,-280,-293,-145,-8,96,-10,-195,-187,-178,-85,-77,-36,-31,-26,2,6,14,-11,-3,34,153, +80,-152,-205,-403,-296,-196,-63,-102,-127,-110,-171,-147,-37,-196,-283,-323,-144,71,118,74,-90,-145,-126,-36,-135, +-84,-41,2,-17,-6,21,23,-32,21,-12,45,23,-134,-52,-26,-231,-388,-449,-536,-541,-457,-633,-721,-611,-451, +-293,-242,-33,-970,-664,-483,-411,-245,-293,-219,-210,-127,-86,-41,-10,5,-13,-15,-19,-61,-75,67,95,-133,-205, +-287,-242,-172,-97,-73,-37,34,-52,-161,-263,-571,-770,-904,-918,-108,511,931,663,508,569,404,155,139,25,54, +-8,-30,-45,3,12,-59,41,116,-1,-46,-28,-45,-51,-172,-316,-264,-286,-398,-400,-448,-541,-750,-803,-738,-320, +243,371,558,404,364,284,240,290,240,223,190,175,139,132,57,28,-20,-19,-58,-86,-228,-296,-319,-360,-334, +-240,-292,-309,-321,-397,-509,-653,-346,-70,115,245,278,313,382,304,331,287,266,214,226,171,194,119,181,139, +154,107,109,64,47,-68,-120,-84,-94,-69,-70,-65,-89,-95,-109,32,194,326,364,377,414,362,288,311,494, +307,363,353,289,291,242,240,289,227,196,195,227,193,151,136,228,96,140,153,164,183,202,226,215,208, +189,175,137,123,144,184,219,258,222,198,333,437,498,265,408,482,491,491,472,494,505,502,379,228,472, +361,245,115,158,157,170,176,181,191,184,184,186,180,180,171,187,192,195,204,210,133,97,193,-122,-271, +-242,-18,-235,-280,-293,-285,-226,-276,-278,-261,-237,-49,-244,-230,-103,210,127,140,140,137,134,134,114,109,111, +121,126,131,125,119,97,110,117,98,-269,89,-21,-50,19,15,87,48,-27,20,36,1,-32,16,10,74, +-168,130,191,156,175,168,164,163,101,80,89,111,123,121,104,85,44,73,103,37,-131,9,26,-12,-25, +27,-41,84,1,113,-61,29,-35,63,93,97,9,109,260,190,212,192,179,173,57,28,49,103,137,145, +101,77,12,22,132,26,-82,91,151,10,27,59,87,76,104,-11,2,63,109,190,124,225,42,147,312, +213,252,229,220,211,13,-59,-8,70,116,79,-4,-42,-114,-53,183,-170,-461,-292,-4,60,119,35,13,-8, +-28,38,38,-17,54,141,147,253,70,53,322,237,304,113,134,257,233,277,371,144,132,276,293,310,239, +173,397,361,-72,-45,-88,-154,-114,-91,-48,-20,-10,-22,-3,42,85,45,-16,20,-43,112,170,76,134,70, +13,-89,-157,-143,-15,-45,-115,-150,-441,-486,-303,2,33,131,24,-2,-269,-93,-87,-118,-91,-14,10,19,35, +30,19,45,-7,71,3,184,175,52,99,193,253,197,259,234,156,219,251,247,308,248,115,5,-478,-732, +-613,-434,-364,-223,-149,-134,-107,-72,-25,3,13,-6,14,-25,-36,-31,-86,152,154,92,41,-13,-90,-176,-160, +-156,-142,-173,-191,-49,-197,-211,-186,-400,14,52,186,364,368,373,275,54,21,23,19,13,-8,-48,11,25, +10,15,-62,88,22,-66,-22,-123,-173,-152,-123,-152,-196,-169,-148,-85,-181,-327,-401,-223,504,390,290,318,268, +227,288,339,315,270,246,178,171,189,113,29,-60,-79,-91,-108,-105,-115,-106,-201,-201,-151,-175,-173,-216,-250, +-271,-244,-131,57,306,379,440,348,239,276,215,245,251,259,191,218,128,185,110,116,86,90,60,37,-35, +20,62,-3,-15,-36,-57,-88,-89,-95,-113,64,228,392,425,448,507,430,351,354,253,350,291,289,320,305, +328,293,224,246,252,212,171,169,166,172,103,145,152,173,194,208,223,235,272,308,327,336,326,334,329, +332,334,340,336,366,221,147,157,259,147,122,106,98,115,86,73,75,93,199,78,86,164,276,261,271, +275,281,289,295,304,311,324,330,340,348,344,342,340,340,375,47,34,-34,242,306,168,194,283,201,202, +199,168,180,172,145,290,217,151,299,264,6,53,48,43,43,42,51,29,22,16,39,49,48,72,72, +46,42,10,47,254,102,235,138,83,116,64,119,213,133,88,115,136,129,192,147,264,119,59,91,62, +58,41,52,-11,-22,-16,41,81,79,146,133,49,59,-44,-10,187,148,259,107,79,109,110,41,213,22, +93,55,146,142,171,205,276,167,67,106,75,71,58,108,-31,-64,-81,44,127,99,255,221,35,62,-50, +27,195,162,263,61,-13,41,35,71,61,0,-18,-5,73,104,243,169,287,179,115,178,128,114,86,115, +-96,-166,-157,65,208,161,371,302,-13,67,-115,21,95,21,119,190,186,129,55,10,-24,35,38,24,85, +111,209,225,344,208,21,-7,-146,-36,-46,-85,-150,-160,-124,-187,-78,219,238,241,147,94,-11,361,194,2, +-9,-53,-112,-85,-53,-8,-11,-33,-9,10,54,59,96,46,107,184,114,171,137,34,-9,10,-23,-12,19, +29,40,141,-156,-258,-211,-90,-10,91,144,-1,-163,-107,-18,-97,-72,-47,8,-1,20,23,51,54,107,51, +147,239,19,51,61,62,56,37,-52,-138,-157,-188,-61,256,490,502,314,88,10,-474,-568,-469,-373,-209,-121, +-125,-96,-61,3,2,12,22,24,15,5,-37,61,157,53,57,-3,-26,-75,-47,9,84,191,179,70,-171, +2,80,105,227,-62,239,427,403,377,347,190,39,55,1,33,19,5,-26,25,41,21,34,103,102,2, +-32,-86,-92,-49,77,58,69,136,-3,-23,-18,53,-33,-272,-120,529,680,625,559,482,377,328,408,319,260, +185,175,169,178,119,68,-4,-56,-111,-87,-152,-156,-107,-105,-79,-77,-126,-187,-280,-312,-364,-415,-414,-212,147, +388,288,349,419,379,377,362,343,319,299,247,256,161,148,86,100,81,83,88,117,51,-37,-52,-107,-134, +-167,-198,-182,-164,-162,-40,63,163,253,311,351,324,295,327,394,315,364,348,326,334,298,311,344,307,271, +274,257,187,170,104,146,-12,1,36,53,77,93,106,112,130,154,175,192,216,218,235,257,291,271,256, +403,436,358,373,431,383,383,376,347,359,359,348,400,325,323,362,306,134,180,174,176,178,182,186,202, +214,225,233,244,259,262,263,261,264,310,-46,-43,-34,-186,-136,130,-166,-146,43,38,47,95,71,72,90, +-139,-168,131,-112,-160,-14,-31,-45,-47,-49,-55,-61,-73,-77,-79,-68,-66,-71,-68,-63,-50,-52,-30,-104,-76, +-51,-7,-48,-69,-32,-43,-76,-70,-95,-62,-87,-37,-20,-70,-5,6,-55,-17,-68,-72,-74,-84,-102,-140,-153, +-156,-125,-122,-145,-143,-127,-79,-75,-34,-118,-154,-52,110,-29,-39,25,-26,35,31,28,-31,-29,-23,7,41, +60,9,2,4,-64,-91,-104,-130,-170,-237,-264,-268,-195,-181,-226,-209,-164,-71,-89,16,-88,-82,29,235,-4, +-26,85,52,70,153,27,-17,46,71,118,119,165,101,56,23,-103,-149,-167,-208,-260,-375,-414,-398,-289,-280, +-372,-364,-281,-113,-93,-160,-299,-380,-258,-79,52,119,92,29,-18,-27,32,44,9,60,100,112,173,88,-47, +16,22,67,0,34,129,72,24,-89,-149,-168,-104,-116,-50,55,-98,185,384,-125,-169,-129,-101,-67,-84,-30, +-13,-14,-28,-13,32,46,18,3,0,6,43,-74,-193,-265,-247,-205,-162,-121,-56,18,-12,-96,-100,-533,-574, +-212,-138,-128,-55,51,18,-228,-149,-106,-102,-99,-49,-4,-8,21,22,10,29,55,-9,-43,161,114,46,33, +-114,-220,-265,-348,-304,-164,-106,-197,-440,-400,-421,-530,-209,-309,-340,-554,-539,-382,-230,-90,-100,-84,-44,-11,-10, +2,6,8,-26,-32,-47,-30,110,12,-95,-184,-263,-290,-200,-261,-257,-214,-196,-235,-311,-604,-791,-967,-501,-1116, +-661,-42,75,121,109,11,-113,-82,-71,-35,17,10,-46,5,29,60,-60,-100,7,-13,-38,-94,-133,-174,-241, +-335,-374,-373,-344,-361,-413,-485,-650,-899,-1091,270,341,501,403,404,297,310,364,313,263,186,148,138,137,77, +-14,-101,-100,-89,-43,-106,-153,-146,-218,-223,-210,-177,-149,-171,-211,-329,-517,-492,-389,-128,87,189,229,193,215, +232,253,274,286,254,240,192,172,128,82,67,54,35,9,-46,-84,-95,-122,-142,-173,-199,-229,-272,-326,-387, +-323,-258,-202,-64,40,140,146,189,186,294,226,234,250,233,238,204,160,131,100,101,70,74,59,2,8, +12,-9,25,22,32,40,47,56,73,92,100,99,88,72,89,102,129,155,175,173,140,183,339,130,178, +305,299,298,306,299,297,300,112,75,270,107,75,127,126,125,128,129,131,131,134,135,139,139,143,144, +152,157,160,163,197,210,170,207,223,101,-143,263,118,-106,-122,-124,-121,-144,-154,-172,116,252,-188,109,235, +229,196,213,211,212,208,200,190,188,186,216,227,218,239,228,177,192,167,243,29,232,227,115,144,155, +174,204,213,208,165,169,115,137,203,196,62,274,248,275,276,276,252,217,180,179,194,272,306,273,325, +284,153,183,139,165,169,193,246,104,74,141,81,90,182,118,59,109,105,160,158,207,231,261,300,309, +328,328,297,247,174,167,183,348,421,338,456,374,124,182,113,148,162,248,349,95,1,84,55,79,144, +20,6,49,109,164,181,243,228,275,362,410,462,454,383,258,128,107,159,433,529,402,540,379,5,90, +323,181,-2,-42,-71,101,208,177,82,22,-16,45,60,40,106,149,168,307,293,296,344,202,109,89,82, +46,152,205,184,273,393,569,536,550,569,414,96,554,170,3,100,29,-18,-39,9,32,2,-18,1,46, +87,103,124,50,16,182,263,318,395,227,122,83,40,68,126,130,135,182,-96,-208,-147,-98,28,2,-21, +-36,-193,-149,-98,-50,-60,-41,11,17,40,24,56,110,127,89,155,310,158,93,66,182,331,482,381,277, +192,262,478,751,937,867,609,217,434,-71,-410,-373,-351,-133,-55,-41,-51,-17,14,5,8,56,49,25,38, +29,43,138,173,211,178,175,108,69,49,79,143,113,91,3,268,451,671,587,-133,-273,-262,14,117,18, +-59,-70,-63,-39,8,52,44,7,18,35,84,32,16,121,82,30,-49,-34,22,122,92,168,325,249,279, +344,447,386,199,-34,545,664,494,523,467,411,371,391,358,293,190,164,149,121,106,65,22,-48,-60,-37, +-31,-2,11,64,67,61,37,-43,-180,-150,-133,-91,-197,-160,27,302,307,359,362,394,368,362,346,340,292, +268,250,213,148,125,93,89,63,42,24,-21,-79,-123,-178,-198,-215,-236,-218,-197,-188,-121,-85,-40,70,176, +251,276,251,273,202,258,263,263,287,291,274,271,245,236,200,183,141,102,109,59,26,9,-11,0,-3, +-4,-8,-18,27,72,122,167,221,270,259,247,248,254,222,225,290,253,151,301,267,185,168,154,136,124, +112,97,225,251,90,201,224,144,149,146,141,137,134,124,149,166,183,199,214,240,232,232,228,229,252, +-116,-96,-164,-47,132,382,-113,85,313,318,322,327,337,338,341,97,-88,378,128,-25,-141,-92,-119,-125,-127, +-133,-143,-146,-148,-154,-138,-136,-148,-132,-121,-100,-112,-98,-139,200,-62,94,34,-58,-2,-76,-71,8,-71,-56, +-55,32,17,-17,6,220,-90,-114,-143,-171,-177,-196,-222,-233,-234,-241,-195,-186,-219,-180,-153,-100,-112,-119,-130, +-10,7,202,23,6,50,43,10,100,-27,45,-28,55,22,46,86,110,9,-126,-151,-215,-225,-263,-312,-336, +-347,-360,-274,-256,-325,-234,-164,-80,-99,-64,-41,66,81,285,21,-40,90,33,65,147,47,-19,23,56,60, +143,123,205,60,-123,-191,-297,-327,-396,-472,-511,-497,-496,-355,-325,-430,-287,-198,-82,-69,-359,-199,-138,-160,-57, +106,160,152,64,-12,-29,26,48,43,94,90,125,102,172,48,-190,-152,-172,-101,-78,-44,-124,-199,-347,-265, +-289,-347,-298,-170,67,-157,-88,322,-32,-168,-98,-77,-54,-43,6,30,3,-16,-3,33,15,24,56,31,88, +30,-177,-250,-426,-316,-216,-82,10,72,84,-12,-11,111,-278,-384,-194,-237,-122,-100,7,-43,-140,-182,-135,-67, +-82,-70,-16,-8,23,14,27,34,91,-38,3,103,6,37,-32,-206,-372,-457,-566,-503,-268,-324,-441,-588,-578, +-501,-540,-190,-192,59,-285,-433,-279,-205,-64,-50,-47,1,13,-16,-6,37,23,15,1,7,73,25,-94,-159, +-240,-199,-165,-112,-212,-203,-115,-157,-203,-321,-646,-849,-958,-452,-1278,-859,-172,-121,-55,-95,-170,-159,-123,-128,-48, +24,32,-9,3,19,58,-38,-8,4,36,45,-76,-103,-174,-253,-282,-291,-364,-307,-341,-455,-557,-656,-794,-1084, +-52,215,527,375,415,318,275,324,271,237,139,123,86,55,48,10,-26,-38,-41,-19,-106,-153,-174,-165,-171, +-156,-147,-140,-157,-177,-307,-559,-539,-525,-450,-210,45,196,258,255,343,309,302,275,278,220,230,158,188,129, +110,58,34,-23,-83,-195,-245,-245,-274,-280,-290,-296,-362,-424,-484,-491,-484,-497,-337,-201,-90,3,46,60,289, +105,172,191,141,164,88,62,76,3,-23,-42,6,-3,-59,-46,36,-27,-6,-30,-42,-54,-69,-80,-81,-81, +-88,-96,-108,-133,-100,-77,-37,0,-8,-34,69,187,362,17,179,356,354,352,339,351,355,349,127,-15,324, +128,20,-38,-28,-40,-42,-50,-56,-64,-66,-69,-70,-74,-76,-83,-63,-50,-39,-30,-41,214,178,268,58,-116, +-232,139,-84,-238,-257,-255,-218,-258,-264,-261,-90,110,-273,-94,63,276,199,218,216,216,209,192,190,192,194, +217,224,216,224,214,176,196,201,243,-130,214,122,40,101,101,163,154,93,143,132,106,42,77,102,147, +-83,252,267,258,273,272,251,197,182,184,196,259,276,238,253,220,134,171,218,199,67,140,163,52,30, +105,29,106,80,149,13,89,28,105,94,142,111,230,333,291,317,311,270,172,153,162,203,313,354,294, +315,268,116,177,238,211,122,272,351,88,7,100,76,84,187,44,28,81,118,166,92,249,142,280,399, +361,418,405,332,159,95,116,185,364,393,278,296,176,-29,66,383,80,-212,-198,-200,31,201,186,100,19, +-24,41,66,43,116,160,124,248,139,228,359,230,266,132,131,142,317,363,230,419,478,424,434,524,692, +455,192,516,66,-21,111,-33,-33,-20,35,60,35,4,13,66,80,103,98,76,-4,132,245,234,310,215, +149,99,50,94,188,112,103,144,-111,-219,-182,-106,-20,-22,-100,-52,-173,-138,-155,-23,-57,-35,-1,37,60, +19,51,121,75,83,82,208,219,131,94,241,357,420,375,329,325,409,545,640,613,529,369,98,275,41, +-188,-226,-241,-97,-27,34,-11,25,32,7,10,59,63,51,69,101,23,80,210,234,220,211,156,70,-26, +-38,15,-68,-51,53,134,267,476,291,-215,-648,-654,-277,-117,-226,-228,-135,-155,-92,-39,43,57,34,20,25, +83,28,-28,114,112,41,3,-32,-23,29,80,114,108,168,194,224,195,140,111,-126,143,226,169,244,246, +264,281,295,285,242,175,132,100,73,91,69,53,-8,-16,-26,34,66,58,55,27,14,-2,-39,-114,-46, +6,74,-26,-100,-124,-31,240,290,252,320,321,312,291,286,230,232,181,212,153,160,96,73,18,-24,-101, +-83,-82,-157,-193,-210,-219,-236,-229,-223,-222,-210,-218,-221,-127,-25,66,148,116,131,38,133,108,117,158,167, +163,144,82,89,72,38,9,22,43,44,-11,58,18,6,-12,-36,-61,-93,-50,-16,20,51,90,119,123, +113,112,109,85,104,48,-15,-45,82,1,-32,-54,-69,-69,-95,-112,-124,-38,49,-106,-39,31,76,48,46, +34,26,19,4,23,33,45,56,64,79,76,81,85,89,76,-37,-24,-108,148,290,332,63,245,321,328, +325,296,322,319,303,252,93,315,272,159,-82,-22,-41,-46,-48,-53,-60,-62,-63,-68,-51,-46,-55,-35,-27, +-24,-32,-36,-24,321,42,193,113,25,67,2,43,129,57,36,50,104,81,101,80,294,31,-34,-28,-63, +-70,-92,-118,-124,-120,-122,-70,-49,-71,-17,-7,-10,-16,-52,-17,175,114,244,79,59,87,110,33,156,0, +108,20,117,74,90,138,212,118,-46,-29,-85,-89,-128,-161,-181,-182,-190,-104,-66,-117,-6,31,15,23,-31, +72,244,197,301,64,-37,67,36,77,125,57,4,11,63,46,154,126,281,178,-14,-6,-98,-124,-193,-272, +-311,-287,-282,-119,-55,-118,59,64,2,35,-200,-14,75,-69,-74,123,200,214,120,18,-35,23,50,64,124, +102,147,79,215,159,-158,-127,-188,-89,-95,-136,-90,-146,-368,-170,-133,-190,-117,29,274,66,-256,213,153,-18, +43,-52,-91,-35,10,53,41,7,14,32,16,59,122,97,163,92,-37,-20,-158,-102,-46,51,98,119,75, +28,74,211,-5,-143,-214,-260,-104,-50,10,-63,-51,-135,-104,-14,-49,-61,-12,13,37,12,52,68,101,7, +87,70,9,91,11,-77,-184,-230,-339,-338,-171,-221,-207,-99,-128,-84,-132,-77,-4,55,-84,-215,-154,-144,-53, +29,-4,34,44,2,8,55,54,80,76,81,143,32,-8,-3,-58,1,33,35,0,21,84,-6,-82,-229, +-228,-236,-253,-27,-532,-479,-219,-208,-138,-201,-237,-133,-120,-131,-53,10,40,40,29,29,49,33,105,49,60, +69,-9,-17,-48,-79,-26,-22,-108,-61,-112,-255,-310,-337,-397,-417,-257,27,268,205,234,229,191,233,170,148, +90,105,70,54,64,70,75,21,-21,-14,-47,-56,-55,-71,-80,-101,-112,-135,-166,-137,-159,-228,-283,-324,-354, +-293,-13,164,287,267,367,316,282,245,258,198,233,147,189,134,115,50,24,-11,-31,-110,-186,-201,-243,-253, +-267,-278,-291,-299,-305,-351,-398,-459,-355,-261,-193,-61,-26,3,178,24,98,99,65,92,33,38,75,17,-15, +-13,22,5,-17,-29,55,-54,-63,-77,-98,-114,-136,-160,-172,-183,-186,-185,-173,-176,-141,-115,-85,-52,-80,-103, +40,131,180,-4,125,201,202,199,175,192,196,185,111,-14,174,98,7,-126,-104,-119,-125,-135,-143,-152,-148, +-146,-147,-148,-150,-154,-137,-123,-110,-99,-129,83,75,131,-94,-163,-59,-45,-152,-113,-120,-114,-73,-100,-99,-86, +-154,-63,-74,-143,-88,136,81,83,81,80,73,57,58,60,61,71,73,69,67,67,66,77,104,73,-110, +78,18,-20,8,15,63,36,-24,19,37,-3,-15,9,-9,51,-63,96,123,84,89,86,73,31,28,27, +27,61,63,41,29,27,41,58,143,77,-36,33,80,-6,-12,43,7,89,10,106,2,22,-20,26,41, +64,21,117,163,99,94,84,46,-42,-32,-25,-9,39,48,24,-11,10,55,78,180,98,47,171,249,45, +-9,80,78,93,181,67,34,66,91,115,54,184,108,205,209,100,91,70,17,-114,-131,-104,-71,14,3, +-48,-107,-110,-16,21,207,-72,-282,-265,-257,-21,149,181,124,25,-35,27,56,49,111,128,84,110,1,42, +133,115,217,89,109,165,331,312,37,171,148,21,48,195,478,263,32,186,1,13,55,-46,-54,-46,22, +54,61,27,22,62,51,73,70,95,49,55,96,25,-8,17,20,-5,56,80,36,50,17,-26,-187,-263, +-231,-186,-92,-51,-73,-39,-100,-107,-150,8,-47,-30,-2,33,53,20,34,89,32,36,-12,55,191,140,73, +107,89,35,41,79,152,254,255,118,-40,-117,-180,-105,-76,-90,-83,-115,-128,-106,-40,72,15,45,40,14, +17,47,61,68,80,112,42,56,137,109,77,75,54,-33,-59,-94,-157,-213,-206,-121,-164,-163,-197,-151,-377, +-614,-567,-378,-257,-298,-257,-167,-182,-127,-86,-3,34,43,33,34,76,24,-26,46,89,61,49,-25,-67,-115, +-95,-108,-176,-36,-67,-191,-297,-357,-349,-389,-293,-252,-121,-51,3,82,138,134,119,105,94,96,83,78,68, +43,40,-6,-10,-2,55,60,51,-44,-80,-111,-82,-67,-79,-59,-6,88,18,-82,-183,-299,32,90,81,135, +184,187,180,191,169,182,146,165,128,117,70,39,-5,-36,-103,-67,-58,-124,-147,-168,-180,-205,-204,-216,-220, +-256,-305,-357,-307,-244,-177,-73,-21,-12,-21,11,-7,3,29,38,36,9,-36,-32,-25,-51,-57,-38,-47,-26, +-57,-23,-43,-61,-76,-98,-121,-145,-130,-123,-118,-115,-102,-104,-72,-60,-51,-43,-50,-32,-126,-146,-78,-99,-137, +-90,-102,-106,-95,-110,-118,-117,-165,-120,-114,-165,-130,-46,-70,-74,-82,-88,-93,-103,-98,-97,-95,-93,-93,-95, +-88,-79,-65,-58,-87,105,97,69,230,225,68,200,214,101,104,100,71,83,77,53,213,210,44,215,233, +86,102,104,100,101,98,92,90,89,85,103,109,105,121,120,98,105,93,140,204,155,201,126,104,114, +112,158,187,172,131,132,119,114,177,144,185,177,122,147,127,125,107,85,74,77,81,130,153,144,184, +168,105,121,90,124,227,166,198,95,78,98,124,83,155,80,116,68,113,110,129,158,222,208,137,165, +144,150,121,90,69,75,73,154,201,172,261,236,110,160,70,144,252,237,252,88,-11,42,57,98,114, +66,36,13,76,76,148,156,259,264,192,233,204,197,147,61,14,28,50,210,272,245,358,271,63,125, +189,197,158,-14,-137,62,179,223,173,64,-31,23,50,80,135,118,134,107,178,188,65,50,-7,34,24, +-33,149,140,-80,59,132,210,229,318,489,345,-259,22,268,180,125,51,-41,-48,12,66,76,32,26,46, +51,105,153,125,142,125,178,243,195,138,104,113,159,135,-19,81,104,50,75,-15,-197,-196,-27,-10,-16, +-56,11,-77,-92,33,-10,-32,9,29,42,24,57,97,82,55,117,88,98,136,55,140,167,154,146,117, +79,135,283,496,477,417,306,75,216,-51,-12,-14,-75,-68,-43,70,22,46,55,22,23,69,73,108,117, +118,144,74,116,175,169,206,183,82,149,149,84,43,9,-82,250,420,479,397,217,9,-237,-231,-190,-209, +-191,-100,-101,-96,-56,-15,26,71,49,49,66,91,133,76,99,101,53,32,51,114,135,169,203,208,168, +47,74,91,76,206,-218,-105,-89,-5,26,121,108,84,51,41,33,95,99,86,76,83,99,26,-8,2, +49,78,79,72,55,15,-17,-70,-118,-136,-49,145,58,0,-79,-166,-33,64,169,171,227,203,178,173,186, +166,206,134,132,94,81,47,32,24,36,9,-57,-89,-134,-150,-168,-189,-154,-121,-82,-107,-157,-210,-202,-177, +-166,-74,-14,21,34,13,48,41,48,62,45,59,79,63,42,50,35,2,3,-39,-26,-112,-139,-138,-153, +-167,-183,-205,-200,-196,-183,-163,-127,-99,-70,-50,-36,-19,-59,-60,26,34,-43,23,43,-6,-10,-15,-35,-28, +-30,-39,41,10,-48,13,-7,-116,-101,-112,-120,-127,-134,-143,-131,-123,-117,-110,-106,-98,-94,-86,-75,-66,-95, +-54,-35,-56,-106,-26,193,-127,-47,129,139,143,159,162,165,172,-43,-120,203,-19,-97,-50,-42,-58,-61,-62, +-66,-75,-74,-74,-76,-75,-76,-78,-79,-70,-47,-48,-19,-83,54,-41,-5,-15,-50,-32,-31,-43,-46,-47,-27, +-59,-12,-13,-40,-9,76,-53,-45,-83,-98,-98,-102,-121,-118,-121,-127,-119,-126,-133,-143,-119,-51,-49,9,-56, +-46,-27,58,-14,-14,1,29,56,15,42,40,-30,-5,-14,31,29,19,9,-48,-87,-132,-132,-156,-199,-185, +-184,-188,-189,-200,-207,-220,-155,-25,-20,45,-14,35,70,144,10,-22,41,61,95,135,88,34,15,49,46, +78,101,126,91,-33,-132,-218,-223,-246,-304,-291,-270,-255,-243,-278,-292,-321,-237,-31,-9,-49,-114,-156,-196,-187, +-17,89,154,159,58,-33,9,39,75,109,87,67,2,-23,-80,-124,-43,33,17,35,75,167,95,-192,-181, +-229,-257,-218,-89,173,31,-167,-200,46,109,-55,-3,-17,-68,2,49,84,38,21,50,36,62,60,84,98, +-7,-45,-126,-279,-183,-97,-20,73,71,-81,12,-53,-257,-260,-259,-210,-202,-120,-82,-31,-26,17,-56,-118,18, +-22,-29,2,15,31,29,16,38,11,-26,-52,-36,87,100,20,-59,-195,-331,-295,-187,-84,-25,-114,-337,-489, +-525,-489,-217,-260,-98,-20,-48,-52,-91,-40,43,12,39,37,10,18,40,50,74,65,76,80,26,4,-39, +-71,-81,-71,-87,-92,-146,-254,-242,-242,-239,-359,-465,-633,-397,-528,-368,-226,-310,-309,-239,-193,-161,-141,-126,-101, +-47,0,48,36,41,58,29,23,-23,55,81,45,-7,-72,-150,-176,-221,-307,-212,-262,-429,-550,-596,-593,-551, +-484,-456,-238,-212,-99,-17,12,-28,-38,-24,-2,61,76,68,35,9,3,-2,5,26,47,22,-16,-74,-110, +-125,-123,-97,-44,-128,-146,-125,-71,-117,-242,-386,-165,-108,-56,-38,42,43,55,74,106,111,132,92,98,61, +50,17,2,-22,-56,-78,-87,-100,-104,-120,-136,-155,-177,-209,-227,-260,-286,-334,-325,-309,-282,-214,-100,-88,21, +-50,-28,-15,-25,-14,-38,-63,-65,-88,-80,-89,-77,-79,-123,-111,-103,-124,-118,-142,-156,-173,-188,-203,-204,-211, +-227,-240,-254,-273,-225,-191,-162,-136,-142,-139,-165,-116,6,-169,-115,-7,-8,-4,0,5,6,12,-140,-184,-13, +-145,-182,-142,-151,-159,-163,-168,-173,-180,-185,-191,-193,-197,-201,-213,-197,-186,-171,-160,-197,186,164,204,152,25, +-163,191,48,-132,-135,-135,-136,-147,-153,-169,41,176,-182,34,150,205,169,186,185,187,186,180,178,179,181, +188,193,195,199,192,158,178,173,217,-6,187,118,72,116,97,158,179,139,188,157,130,72,90,152,141, +4,219,211,227,233,240,232,209,200,201,216,237,246,243,247,220,139,176,201,186,139,133,95,63,54, +72,79,113,93,149,84,79,55,96,121,123,131,192,244,251,268,283,268,232,222,229,258,283,312,311, +324,271,120,203,170,166,156,209,176,72,12,21,70,103,115,83,65,16,77,101,111,168,152,232,294, +315,348,370,353,264,234,242,308,376,380,368,352,241,24,125,446,223,23,-77,-179,-14,119,172,201,110, +-17,17,45,97,127,125,100,123,71,126,243,201,209,151,136,107,319,330,156,201,282,441,418,451,544, +473,-85,-136,267,309,97,96,29,-50,15,67,108,48,30,62,93,141,124,105,60,102,283,320,345,259, +203,167,119,83,-23,145,87,-214,-51,-35,-154,-87,5,-12,-72,-40,34,11,-60,53,18,-4,25,36,47, +39,37,86,27,56,74,85,156,127,78,227,323,372,421,401,262,379,546,700,656,537,480,128,266,-45, +19,90,-39,7,-13,50,17,34,44,24,27,59,74,99,98,103,76,77,179,239,264,238,190,115,134, +84,-35,-13,12,68,398,600,739,438,426,106,-294,-250,-252,-208,-146,-93,-88,-59,-57,-34,6,79,48,49, +62,99,80,69,95,86,95,90,114,166,190,201,220,210,224,236,256,268,308,377,-124,-190,-339,-178,-114, +3,17,-50,-40,-34,-4,61,89,81,62,57,61,29,28,25,116,153,127,136,105,81,37,-9,-35,-64, +4,181,185,151,43,-71,-29,-41,-12,24,29,37,37,62,75,102,126,104,65,62,40,33,13,9,6, +19,13,-13,-24,-41,-58,-81,-44,-13,20,36,36,34,-16,-43,-62,-48,-3,22,-74,18,9,8,47,51, +62,62,41,59,53,48,0,-19,-6,-39,-106,-85,-119,-125,-140,-156,-169,-189,-161,-140,-119,-96,-68,-35,-22, +-10,-7,-2,-33,-14,-33,-90,-192,2,-72,-163,-174,-181,-188,-198,-209,-214,-81,-13,-219,-102,-50,-51,-64,-67, +-76,-80,-86,-96,-83,-75,-66,-56,-49,-39,-41,-39,-35,-30,-55,-85,-60,-135,12,157,301,-56,121,271,289, +292,274,301,303,291,128,-31,318,148,20,-127,-73,-92,-94,-93,-94,-94,-95,-96,-97,-103,-104,-104,-100,-91, +-71,-75,-70,-109,210,-53,49,39,-29,-10,-44,-24,27,-5,-6,-23,38,19,21,4,197,-79,-104,-112,-131, +-129,-131,-131,-129,-129,-125,-137,-143,-139,-135,-112,-64,-65,-56,-82,39,-5,75,16,19,7,71,38,70,22, +102,-22,50,5,60,44,77,-19,-136,-125,-169,-159,-166,-163,-162,-168,-166,-202,-210,-203,-179,-130,-50,-32,-64, +-42,85,37,83,6,-23,2,36,84,81,104,45,-30,21,8,124,50,152,21,-144,-163,-242,-234,-237,-242, +-226,-212,-184,-216,-248,-238,-215,-147,-42,-6,-125,-39,7,-111,-107,8,60,123,188,106,-13,-3,27,111,106, +62,80,-36,27,-59,-204,-102,-103,-33,-29,-23,-22,-128,-340,-354,-346,-236,-207,-131,26,-17,-301,-399,182,236, +-69,46,10,-59,-3,49,105,50,27,40,48,87,71,72,124,2,-59,-88,-248,-146,-58,43,82,54,-102, +51,-18,-291,-192,-150,-148,-183,-81,-98,-26,-50,75,24,-10,36,14,-19,14,6,25,36,9,1,0,-57, +-25,-60,-27,41,-11,-145,-291,-359,-344,-258,-186,-174,-247,-337,-425,-415,-295,-125,-178,22,47,10,-3,-46,-29, +-14,-5,18,32,6,15,33,44,77,39,32,92,8,-59,-79,-106,-97,-67,-27,-30,-83,-194,-138,-156,-210, +-276,-346,-439,-266,-391,-134,9,-205,-294,-183,-147,-124,-73,-87,-72,-60,-18,53,35,37,20,46,86,-23,23, +76,72,61,2,-88,-99,-152,-254,-233,-257,-329,-405,-428,-424,-366,-410,-364,-198,-205,-85,-57,-73,-106,-123,-96, +-61,11,35,44,13,7,5,31,35,42,26,-4,-32,-50,-69,-78,-100,-86,-33,-98,-193,-335,-220,-193,-260, +-316,-244,-195,-98,-116,-39,-45,-27,-15,49,44,109,36,74,37,38,3,-3,-22,-26,-86,-94,-55,-36,-48, +-66,-82,-107,-136,-159,-171,-158,-168,-188,-219,-238,-223,-119,-100,54,-61,-6,3,-25,-7,-47,-55,-24,-59,-62, +-55,-40,-56,-95,-100,-67,-116,-108,-132,-145,-158,-166,-174,-189,-205,-228,-247,-277,-300,-264,-223,-187,-152,-155,-166, +-107,-32,48,-131,-33,55,60,64,54,69,74,75,-43,-131,45,-54,-124,-157,-152,-160,-162,-165,-170,-173,-182, +-189,-194,-200,-204,-219,-200,-191,-181,-173,-200,140,124,185,-5,-130,-181,58,-100,-185,-188,-183,-159,-178,-180,-183, +-106,35,-183,-110,-6,177,124,138,141,143,142,136,135,136,143,139,139,144,136,129,111,131,137,133,-136, +107,9,1,58,35,109,99,32,104,101,54,7,32,55,74,-98,126,156,149,172,178,179,162,158,157, +176,167,159,159,128,110,77,113,183,122,-6,36,-1,8,13,30,24,103,23,156,52,50,-5,42,75, +53,10,84,181,161,196,205,203,166,168,170,216,186,185,202,139,106,54,124,152,77,1,99,92,35, +21,12,65,88,107,104,83,17,59,97,81,133,34,104,195,169,231,252,253,189,185,199,284,248,197, +195,67,7,-43,44,422,115,-151,-187,-229,-77,54,94,194,138,10,7,37,111,99,101,60,79,-41,16, +230,204,275,164,174,218,315,275,128,134,186,317,298,320,381,354,7,-269,170,319,32,92,59,-32,18, +58,120,68,42,68,110,139,60,71,11,57,212,194,242,197,162,113,68,46,-23,159,60,-281,-168,-115, +-101,-41,27,-71,-130,-64,-4,62,0,49,33,20,31,33,47,44,8,36,-40,8,-17,21,124,74,71, +135,192,229,326,361,245,387,436,388,310,221,275,94,120,30,55,99,-11,28,-3,-3,-1,13,27,19, +23,35,59,68,43,55,0,50,142,158,178,135,89,45,26,-51,-193,-125,-74,62,162,272,397,146,150, +-113,-323,-270,-310,-240,-157,-109,-83,-37,-49,-42,-9,56,35,35,27,60,11,48,55,46,115,79,70,55, +46,28,14,21,54,140,101,80,133,125,-121,-251,-371,-240,-147,-93,-67,-122,-100,-84,-33,-6,28,56,33, +24,18,37,55,44,107,124,122,84,56,28,12,5,3,8,-1,-4,23,21,-19,-106,-94,-162,-178,-133, +-140,-104,-73,-31,-16,34,39,66,28,51,13,12,-19,-29,-58,-14,47,41,70,49,33,10,17,17,15, +39,68,99,38,-19,-54,-92,-34,-26,-113,-7,-33,-27,13,17,34,21,-19,12,24,15,-29,-25,-14,-17, +-98,-21,-46,-60,-69,-84,-91,-102,-82,-70,-64,-62,-68,-65,-60,-49,-45,-41,-30,-6,-103,-168,-206,-57,-151, +-197,-207,-210,-203,-221,-232,-233,-159,-61,-235,-166,-94,-5,-32,-29,-34,-34,-35,-40,-38,-37,-35,-31,-28,-28, +-27,-28,-27,-26,-30,-6,2,-60,139,221,188,83,199,206,219,218,186,215,213,188,203,102,195,207,141, +-53,-5,-12,-11,-10,-9,-6,-10,-11,-8,-13,-12,-10,-5,-3,-7,-4,-19,-11,210,21,107,87,40,47, +22,60,114,92,68,61,83,64,102,58,189,10,-28,-7,-15,-14,-19,-15,-21,-16,2,-9,-7,0,9, +8,-6,7,-18,-2,124,57,91,58,59,42,98,50,116,58,138,30,90,51,90,76,122,32,-55,-12, +-20,-10,-8,7,-12,-19,8,-23,-15,-3,30,25,-21,27,-66,-3,105,55,72,35,2,-9,29,71,43, +110,69,-32,21,22,152,48,135,24,-69,-12,-25,-14,-23,-21,-32,-13,52,23,17,31,55,33,-48,22, +23,142,151,-22,-101,17,62,89,197,153,27,-1,26,132,97,55,87,0,82,50,-63,-21,-72,9,15, +21,-54,-161,-269,-245,-157,39,69,83,92,88,-268,-415,245,305,-9,101,42,-11,6,47,114,71,50,43, +79,119,80,65,113,60,45,88,38,40,61,107,99,67,-49,121,84,-114,-38,-30,-79,-89,36,-91,-60, +-87,54,64,61,32,43,11,28,16,30,43,12,-12,-13,-40,23,-28,-57,16,19,-71,-129,-130,-84,-43, +-73,-36,-36,12,27,53,155,88,75,121,104,65,12,0,-18,-41,-11,4,27,15,20,32,46,71,30, +16,73,25,-4,21,28,21,20,48,50,14,-61,4,-9,-79,26,83,127,117,-17,36,19,-143,-261,-188, +-150,-89,-29,-35,-24,-46,-17,43,31,31,-6,52,108,25,4,37,65,71,61,33,16,7,-5,-80,-83, +-34,-38,-30,-39,29,-190,-148,-128,-115,-30,-50,-98,-123,-140,-120,-88,-43,-14,30,14,32,37,61,52,49, +23,22,49,37,32,0,-29,-58,-76,-78,-141,-256,-258,-218,-170,-158,-232,-218,-123,-144,-100,-92,-66,-48,6, +4,72,18,56,43,35,9,0,0,20,-11,-11,29,52,34,15,-1,-10,-14,-23,-20,-7,5,-33,-89, +-147,-177,-86,-70,17,-45,5,5,-11,7,-17,-3,33,18,12,33,28,2,-9,-35,-15,-74,-77,-83,-90, +-93,-93,-93,-110,-124,-136,-148,-163,-174,-165,-141,-121,-97,-81,-94,-10,28,4,-24,32,31,38,41,26,40, +42,39,47,-8,18,28,-15,-91,-77,-80,-82,-81,-82,-82,-87,-89,-92,-95,-97,-103,-94,-92,-90,-88,-82, +16,18,46,-106,-125,-9,-77,-115,-46,-43,-36,-10,-17,-15,-11,-116,-89,4,-111,-104,37,13,13,16,15, +14,9,8,9,19,7,4,7,-5,-5,2,12,27,-17,-99,-13,-50,-31,-13,-22,14,-7,-44,1,19, +-24,-25,-16,-35,-6,-60,-18,16,-8,8,9,9,-1,-4,-1,25,-3,-19,-19,-60,-58,-27,-6,65,4, +-86,-41,-31,-17,-4,-1,6,70,-2,108,49,14,-20,-11,18,-5,-52,-27,17,-12,5,2,-1,-31,-28, +-28,32,-33,-55,-37,-119,-106,-47,-8,57,-26,-86,-8,33,7,22,14,52,68,82,119,86,17,34,60, +66,64,-21,-24,-6,-58,-35,-33,-43,-76,-67,-30,74,-30,-95,-96,-245,-226,-102,-39,140,10,-145,-170,-203, +-68,21,33,171,155,49,5,30,116,69,55,30,12,-69,-54,70,91,173,111,147,250,139,32,-71,-84, +-61,-2,50,81,109,67,21,-366,2,195,-50,60,68,13,15,31,114,85,60,61,98,104,10,36,16, +9,34,-15,-5,26,52,44,34,26,-12,123,33,-212,-213,-178,-74,-2,45,-104,-108,-56,-9,77,34,12, +32,32,29,25,39,51,-9,-26,-69,-47,-84,-56,30,20,67,-38,-89,-95,-10,78,82,168,73,-159,-221, +-220,-94,22,-65,76,72,45,-12,-4,-11,-35,-6,7,14,19,24,16,34,34,3,7,-22,26,52,19, +23,-43,-63,-41,-92,-152,-230,-163,-123,-31,-146,-191,-207,-177,-277,-290,-239,-257,-324,-265,-190,-135,-83,-38,-38, +-38,-18,13,17,22,5,2,-30,3,-5,-1,59,34,-4,-88,-121,-161,-199,-209,-204,-128,-194,-223,-201,-265, +-196,-272,-243,-201,-104,-126,-122,-154,-139,-120,-79,-76,-41,20,7,3,-7,37,57,56,51,44,68,0,-25, +-54,-47,-36,-29,-40,-91,-177,-199,-204,-173,-202,-198,-255,-271,-242,-227,-180,-125,-75,-53,-17,-10,22,23,43, +12,3,-21,-22,-46,-4,56,62,101,78,65,46,18,-15,-51,-47,-34,-18,-56,-105,-143,-187,-86,-94,-87, +-53,-63,-50,-38,-31,-24,-39,-58,-41,-19,-19,-34,-25,-38,-24,-67,-18,-16,-29,-30,-34,-32,-29,-31,-36, +-49,-68,-95,-119,-117,-110,-103,-98,-47,-38,-119,-134,-83,-95,-125,-91,-90,-85,-71,-78,-81,-74,-121,-82,-88, +-123,-96,-5,-23,-19,-18,-16,-15,-14,-22,-28,-32,-37,-40,-49,-45,-46,-45,-47,-28,97,84,85,164,123, +-34,163,131,7,10,9,-9,1,-4,-26,128,159,-42,117,160,83,86,95,98,98,97,96,92,93,104, +101,103,106,106,100,76,89,71,117,72,104,107,87,94,80,97,127,137,156,126,115,81,75,122,92, +65,115,94,123,129,126,114,105,94,104,145,138,144,147,143,119,59,88,79,115,137,99,70,73,76, +65,89,79,115,120,126,83,81,72,78,81,105,93,98,133,158,158,151,141,115,121,192,173,191,199, +198,148,22,91,31,78,83,87,74,62,35,4,43,65,44,113,97,8,42,57,114,65,73,63,97, +169,215,212,177,139,108,148,274,255,265,263,225,125,-48,49,213,256,186,46,-114,3,67,64,182,181, +77,16,32,127,77,57,73,70,100,138,155,125,87,108,121,151,32,-44,-50,6,132,294,358,333,223, +205,-65,-298,115,213,74,112,70,50,20,34,113,94,75,52,107,130,74,51,51,91,155,229,311,242, +191,158,82,51,29,169,138,-31,43,30,-54,48,131,-24,-53,-48,38,96,84,17,50,36,38,31,41, +56,17,-9,-17,-3,35,14,-13,20,78,53,107,204,245,234,152,174,232,338,401,417,463,238,271,119, +92,78,-21,15,-15,-30,6,13,22,32,33,34,39,48,31,14,32,55,98,142,168,126,90,73,71, +60,48,81,98,107,326,451,558,402,265,107,-126,-156,-214,-213,-167,-85,-36,-7,2,-19,-11,13,19,25, +4,42,61,57,10,9,42,68,96,120,121,123,168,55,63,182,254,296,307,298,-10,-12,-124,-61,-26, +-58,-106,-129,-127,-118,-98,-86,-50,10,24,51,57,59,51,44,39,64,102,110,98,58,30,-19,-73,-76, +-68,-29,-122,-127,-77,-37,-149,-175,-142,-137,-139,-110,-76,-43,-24,-19,18,9,29,42,27,19,12,32,62, +80,79,86,91,78,68,57,62,69,67,76,73,82,32,-17,-79,-115,-46,-42,-70,-30,-15,-16,-5,5, +10,31,46,59,57,79,51,32,43,12,-14,-27,-39,-31,-31,-26,-21,-17,-21,-22,-17,-13,-7,2,-15, +-20,-27,-31,3,-1,41,18,-72,52,31,-40,-36,-35,-43,-39,-40,-43,58,74,-54,40,54,6,13,14, +14,15,15,15,18,20,21,23,24,29,23,19,13,9,40,-81,-64,-88,-79,10,178,-107,-6,141,151, +156,161,175,178,178,-3,-102,192,7,-77,-94,-70,-84,-83,-87,-90,-95,-95,-93,-81,-93,-97,-95,-103,-98, +-78,-80,-69,-107,48,-78,-28,-4,-39,-35,-48,-53,-35,-37,-20,-42,-8,-24,-57,-42,58,-102,-91,-110,-115, +-126,-135,-142,-142,-130,-96,-126,-137,-136,-165,-151,-92,-88,-50,-57,-44,-43,-1,0,15,-1,32,42,31,57, +81,5,11,-29,-16,-17,-23,-70,-110,-121,-137,-156,-171,-194,-192,-186,-117,-182,-200,-187,-238,-203,-99,-91,-48, +-58,-56,-46,12,14,26,17,42,57,62,130,92,22,19,13,51,-2,3,-74,-140,-174,-209,-244,-285,-299, +-282,-219,-104,-209,-245,-246,-342,-291,-107,-73,-136,-6,21,-37,-113,-32,10,24,140,158,95,16,24,108,48, +21,33,-15,3,-39,-86,-28,10,39,78,174,-84,-230,-278,-262,-233,-232,-91,-61,-106,-152,-40,-374,-166,-3, +-21,35,52,59,18,17,101,102,81,46,72,66,5,14,40,-9,-93,-120,-143,-64,-11,27,18,15,10, +71,12,-124,-146,-134,-69,23,71,-41,3,4,40,83,65,-10,26,29,25,17,30,58,-6,-59,-43,-70, +-87,-88,-69,-24,31,-157,-263,-289,-258,-180,-72,-135,-294,-486,-521,-429,-269,-3,-143,77,46,-26,-34,-49,-34, +-50,6,19,12,29,33,11,8,9,-9,-26,2,14,-26,-69,-88,-132,-126,-95,-127,-145,-129,-102,-80,-42, +-226,-361,-485,-274,-459,-248,-88,-200,-244,-227,-188,-140,-77,-48,-31,-29,-24,-28,1,13,-4,-22,-14,-20,-28, +-7,3,6,-33,-121,-156,-216,-273,-303,-332,-324,-345,-338,-333,-412,-247,-228,-89,-127,-65,-134,-163,-163,-158,-138, +-117,-118,-89,-25,-7,4,-3,33,41,48,-6,-35,-27,-46,-64,-87,-85,-68,-42,-85,-159,-279,-275,-287,-285, +-251,-239,-240,-225,-222,-185,-154,-105,-71,-47,-54,-34,-33,19,20,16,2,5,9,9,6,17,37,53,49, +48,52,3,-51,-107,-133,-146,-163,-176,-197,-222,-230,-131,-145,-43,-99,-74,-59,-78,-65,-78,-81,-63,-73,-60, +-47,-28,-22,-49,-34,-20,-16,3,-6,-4,1,5,15,-9,-28,-52,-77,-110,-144,-145,-143,-138,-137,-75,-89, +-82,-37,55,-94,-37,47,58,68,74,85,91,98,-22,-66,77,-18,-54,-28,-29,-28,-25,-24,-24,-20,-32, +-42,-51,-61,-69,-82,-76,-77,-77,-80,-54,126,107,163,73,-41,-174,117,-14,-149,-152,-151,-143,-153,-156,-164, +-22,93,-190,-37,64,150,114,129,131,127,124,115,115,118,135,131,133,138,130,121,96,114,109,153,-84, +113,43,42,87,59,111,116,80,132,117,96,32,38,60,68,-68,130,146,157,169,156,140,120,113,128, +177,170,172,170,145,116,64,98,135,165,71,82,20,52,59,54,53,95,72,154,86,96,31,44,27, +44,35,91,176,177,208,186,164,119,110,130,227,207,221,232,178,122,26,89,108,115,14,80,64,81, +67,23,63,68,74,125,122,59,57,68,30,64,2,71,189,213,269,230,172,106,92,158,309,277,275, +263,148,44,-59,28,295,252,127,57,-128,-54,34,50,141,175,126,37,32,101,52,59,59,117,72,132, +258,202,225,176,193,241,97,34,60,148,262,308,424,400,237,211,111,-189,-152,1,164,93,71,88,39, +33,103,116,98,56,105,103,47,28,-14,77,172,223,367,292,216,129,39,32,94,142,95,-43,24,25, +-45,128,192,76,16,43,34,100,68,5,41,50,37,40,46,63,17,-4,-15,17,2,26,31,12,81, +127,227,308,360,325,258,224,264,352,371,392,436,255,240,52,23,32,-56,3,-23,-23,23,31,21,51, +46,25,20,14,26,11,-14,65,152,184,206,145,90,28,19,17,65,51,111,255,384,475,560,349,267, +26,-252,-185,-162,-210,-163,-99,-68,-13,-9,-9,-12,-23,5,15,12,21,-3,57,17,-9,20,36,72,111, +102,98,139,63,67,149,243,301,345,278,36,-22,-161,-88,-98,-120,-136,-147,-120,-111,-93,-106,-77,-23,20, +44,48,42,43,33,50,71,80,108,95,64,34,0,-40,-26,14,81,26,-13,-37,-12,-68,-114,-142,-108, +-131,-97,-68,-34,-53,-50,-59,-21,-14,17,8,23,29,39,46,84,94,76,70,71,78,90,83,74,57, +54,39,37,-1,-27,-58,-75,-51,-64,-151,-55,-71,-67,-37,-32,-8,6,-6,23,29,38,14,20,45,37, +-10,47,32,38,40,43,44,45,47,55,64,71,79,88,59,31,6,-22,21,25,-1,-56,-125,28,-40, +-106,-107,-107,-102,-110,-114,-115,-16,53,-110,-16,39,65,54,59,58,59,59,59,62,63,64,65,65,70, +58,51,42,35,68,-83,-65,-112,29,140,214,-28,114,206,219,220,202,227,228,219,115,-16,216,121,27, +-116,-68,-83,-84,-91,-96,-100,-99,-96,-84,-92,-93,-91,-94,-90,-77,-81,-81,-77,156,-50,35,49,-6,-4, +-36,-17,35,7,4,5,30,1,-13,-22,134,-75,-89,-89,-109,-132,-150,-154,-151,-134,-98,-115,-116,-112,-122, +-113,-80,-79,-78,-17,65,20,51,44,53,18,73,36,86,41,114,30,52,-12,-17,5,44,-32,-105,-91, +-123,-160,-187,-200,-200,-184,-121,-158,-157,-144,-159,-139,-89,-80,-83,0,34,-9,27,60,47,16,41,60,55, +138,107,35,20,-16,31,-31,52,-40,-117,-107,-169,-239,-304,-307,-286,-210,-109,-166,-166,-159,-193,-173,-83,-52, +-181,108,240,124,-22,-17,1,43,110,152,145,34,18,95,37,16,67,19,103,40,-107,-55,-72,16,33, +56,-219,-354,-365,-278,-205,-218,-39,-26,-147,-163,-103,-309,-275,-161,106,59,40,84,30,24,87,116,99,32, +47,40,28,10,56,16,-89,-63,-73,-14,12,30,24,30,55,25,-8,-53,-11,-5,-48,41,151,98,138, +88,95,81,79,-12,32,34,22,18,28,59,11,-49,3,-48,-32,-57,-109,-40,2,-131,-205,-229,-229,-215, +-107,-274,-377,-364,-359,-232,-102,80,-73,37,-2,-62,-46,-52,-40,-49,16,33,22,45,40,8,-6,0,2, +-26,33,24,-22,-34,-54,-74,-68,-62,-80,-59,47,11,35,69,-33,-132,-253,-96,-263,-70,22,-115,-133,-152, +-145,-109,-59,-49,-30,-29,-28,-47,-4,7,-10,-9,32,-10,-27,-7,-25,-6,-17,-46,-72,-102,-138,-199,-246, +-300,-242,-188,-184,-205,-181,-109,-1,-70,-76,-138,-181,-166,-162,-138,-127,-120,-103,-58,-15,16,25,37,29,32, +-26,-52,-57,-28,-23,-33,-59,-68,-67,-77,-121,-230,-214,-219,-227,-177,-194,-159,-112,-124,-81,-78,-60,-51,-41, +-84,-62,-82,-9,-17,12,11,44,39,51,13,-15,5,-2,12,22,46,-4,-48,-94,-129,-156,-184,-181,-184, +-197,-182,-137,-152,-43,-126,-84,-76,-102,-85,-103,-86,-44,-64,-64,-43,-9,-8,-19,-12,43,12,27,25,25, +30,30,36,5,-15,-36,-55,-76,-99,-109,-117,-122,-129,-82,-107,-32,27,78,-58,26,87,99,107,103,121, +130,132,53,-21,122,60,5,-42,-29,-32,-29,-30,-30,-26,-37,-44,-53,-63,-71,-80,-78,-79,-82,-85,-63, +60,52,114,-50,-133,-135,-4,-112,-146,-147,-143,-119,-134,-134,-128,-121,-32,-147,-128,-60,95,57,65,65,57, +50,39,43,48,64,58,58,64,49,43,37,50,62,77,-133,45,-31,-8,32,2,55,40,-6,44,51, +27,-22,-18,-34,2,-112,48,87,72,78,56,40,20,25,41,78,67,62,63,19,6,6,28,97,122, +-8,27,-20,21,32,16,21,84,25,130,49,66,-18,-12,-33,-13,-39,29,121,91,97,53,21,-31,-14, +12,93,69,67,92,-6,-27,-19,12,97,97,-35,36,36,81,82,32,72,70,97,139,133,87,50,39, +-42,24,-44,29,136,98,104,31,-31,-80,-53,24,140,87,63,68,-98,-136,-74,-28,188,158,81,63,-93, +-97,-21,32,88,146,173,50,22,74,27,51,51,106,29,53,181,157,224,162,173,200,46,-25,-29,81, +153,79,234,229,79,74,138,-154,-400,-212,195,79,66,86,48,32,84,124,107,50,71,50,12,10,-33, +32,72,74,185,175,128,43,-2,19,119,45,-31,-130,-44,-5,-18,118,211,181,131,143,55,92,53,0, +37,57,27,37,43,61,13,-11,-15,5,-42,-3,30,-3,44,70,132,168,197,175,188,95,65,60,46, +90,152,174,40,-42,-55,-35,-60,-9,-20,-18,24,39,24,55,44,3,-2,-12,8,2,-32,53,115,114, +116,64,25,-35,-80,-71,28,-25,57,261,208,187,157,60,17,-126,-239,-173,-138,-170,-129,-100,-85,-36,-41, +-26,-26,-49,-5,5,9,-4,-44,21,10,-16,1,-3,5,15,2,-12,-22,-46,-64,-74,-10,35,81,15, +-26,-95,-152,-129,-169,-180,-171,-178,-137,-116,-93,-110,-90,-57,-9,11,26,23,32,25,37,37,25,30,30, +28,6,-4,-21,-1,27,47,32,-5,-31,-53,-52,-94,-144,-102,-114,-90,-76,-53,-86,-89,-126,-71,-61,-33, +-17,14,40,31,9,42,61,38,33,42,53,68,40,13,-16,-31,-52,-63,-75,-76,-74,-78,-80,-104,-173, +-98,-125,-117,-92,-90,-63,-59,-76,-51,-35,-36,-38,-15,6,27,4,71,62,62,62,60,56,54,55,58, +58,56,54,50,26,-3,-30,-59,-13,-7,-76,-116,-115,-48,-105,-115,-116,-114,-101,-109,-111,-107,-87,-24,-93, +-71,-21,50,32,36,35,35,36,36,34,32,30,28,25,25,15,10,4,-3,22,-8,-5,-26,114,151, +82,76,139,105,116,114,90,109,106,92,134,77,70,129,104,-33,-1,-4,-8,-16,-20,-25,-21,-18,-9, +-10,-8,-3,-6,-8,-13,-11,-21,29,137,28,73,76,49,34,25,55,94,76,56,67,49,24,39,19, +101,19,0,16,-7,-32,-52,-57,-50,-31,-3,-4,3,12,4,-5,-19,-10,-22,80,142,83,67,75,78, +35,91,54,110,63,113,65,61,12,-3,24,76,39,8,31,1,-40,-71,-81,-74,-53,-6,-6,10,32, +17,-4,-37,-13,-42,90,106,52,41,102,75,16,52,67,59,139,124,56,28,-18,2,-28,59,27,23, +63,9,-69,-133,-138,-112,-43,28,23,45,71,34,-10,-50,-12,-22,227,356,230,29,-33,-19,51,78,137, +193,51,10,76,31,33,87,79,152,116,16,23,-25,52,38,-24,-195,-277,-270,-119,-8,-25,142,121,-71, +-29,-114,-193,-313,-229,219,109,52,76,40,36,69,118,107,30,40,35,51,20,47,50,7,75,122,119, +88,63,30,43,108,-8,-40,-39,97,114,6,49,219,237,235,164,122,84,89,15,51,46,24,26,30, +55,28,-15,28,-3,27,-7,-74,-28,-16,-10,20,54,18,-40,-9,-177,-167,4,96,191,224,201,64,-32, +-59,-57,-36,-12,-23,-23,19,35,32,51,37,3,-7,-1,10,-7,41,39,27,58,58,60,46,5,-4, +44,177,122,156,197,265,264,213,181,87,99,21,-53,-71,-87,-82,-57,-37,-37,-34,-39,-36,-46,-5,4, +-2,16,53,20,6,8,-15,12,31,66,69,70,67,-4,-41,-97,13,85,89,117,-34,14,5,-34,-107, +-136,-176,-168,-153,-130,-120,-105,-93,-73,-24,18,55,36,20,17,-9,-13,-21,20,39,48,11,-27,-59,-54, +-44,-39,-62,-65,-48,-29,-91,-66,-31,-38,-19,-33,-45,-56,-63,-103,-93,-110,-61,-65,-13,8,60,54,72, +44,6,12,-6,3,7,19,0,-8,-17,-41,-71,-97,-94,-88,-95,-83,-89,-98,-79,-106,-85,-86,-95,-86, +-86,-58,-22,-28,-33,-15,4,-4,10,5,52,10,7,13,11,12,10,10,-5,-14,-18,-17,-12,-11,-27, +-43,-58,-70,-47,-62,9,30,0,-3,33,20,28,31,23,36,41,40,63,25,47,67,41,-30,-15,-18, +-19,-20,-21,-21,-21,-22,-25,-27,-30,-28,-33,-36,-40,-44,-27,-44,-35,-11,-106,-94,19,-99,-94,-15,-6, +-2,15,12,14,24,-100,-113,18,-97,-113,-26,-33,-39,-43,-52,-58,-66,-59,-55,-46,-52,-54,-48,-64,-64, +-48,-47,-30,-40,-55,-43,-65,-24,-23,-44,-20,-36,-52,-36,-19,-32,-45,-54,-90,-58,-52,-58,-25,-51,-65, +-89,-100,-109,-91,-76,-60,-74,-84,-77,-121,-116,-67,-64,-6,27,-38,-20,-32,4,17,-16,18,56,10,66, +36,24,-35,-57,-64,-53,-65,-40,-6,-42,-77,-124,-154,-185,-148,-126,-85,-111,-126,-94,-192,-174,-73,-79,7, +30,-39,-19,-3,72,83,31,68,69,93,144,126,84,23,-16,-68,-36,-48,-29,-1,-65,-135,-213,-259,-264, +-197,-125,-74,-137,-170,-144,-295,-265,-82,-77,-22,62,110,103,-26,-110,-80,9,40,108,204,53,5,50,11, +31,44,56,20,-12,18,41,91,85,81,62,-90,-173,-209,-95,-67,-207,-37,-29,-157,-118,-4,-186,-485,-319, +151,80,66,59,42,32,58,116,106,42,33,6,-1,8,-2,-13,-62,-88,-64,3,13,-14,-18,18,115, +-58,-133,-148,-67,-13,28,36,190,242,239,206,85,71,56,25,45,53,20,24,29,51,14,-20,-10,-23, +-67,-55,-20,-26,-18,-22,-31,-54,-71,-77,-8,-129,-221,-316,-256,-173,-129,79,-164,-99,-115,-95,-33,-19,-17, +-13,12,30,22,41,28,-15,-18,-28,-21,-13,-16,19,12,-12,-20,-31,-42,-79,-114,-89,0,-18,40,143, +-13,-136,-272,-210,-252,-172,-100,-115,-116,-106,-78,-77,-70,-50,-63,-52,-47,-58,-18,-6,9,-20,-40,-13,9, +6,-2,-14,-37,-68,-83,-117,-177,-154,-185,-263,-252,-237,-213,-260,-110,-145,-87,-129,-183,-205,-197,-191,-158,-130, +-107,-107,-96,-81,-46,-25,7,13,22,21,8,-16,-38,-51,-45,-17,-20,-11,-2,-17,-31,-57,-43,-61,-64, +-100,-74,-83,-117,-97,-82,-84,-88,-91,-108,-119,-148,-118,-98,-91,-45,-11,33,18,-4,5,14,6,7,7, +6,7,-25,-54,-80,-107,-131,-155,-141,-125,-106,-98,-94,-113,-115,-111,-127,-118,-116,-117,-103,-106,-107,-101,-85, +-88,-69,-51,-52,-23,-6,15,20,15,14,12,9,10,4,-2,-13,-23,-35,-52,-57,-70,-80,-92,-59,-58, +-104,-98,-36,-98,-97,-50,-47,-42,-30,-30,-26,-19,-87,-83,-10,-69,-65,-14,-22,-21,-21,-21,-21,-21,-27, +-32,-37,-42,-47,-52,-54,-55,-55,-58,-50,64,53,79,101,43,-96,109,54,-64,-58,-59,-70,-69,-74,-82, +43,94,-114,31,87,68,63,70,65,59,55,51,56,59,66,68,71,78,69,63,47,56,46,109,15, +79,46,56,75,42,74,93,91,102,80,88,28,19,45,34,-9,87,87,100,84,65,51,44,59,75, +91,95,102,111,91,69,31,47,52,142,123,94,29,67,70,32,74,75,87,88,72,82,26,13,-3, +16,46,77,118,126,106,72,47,33,56,79,111,125,140,168,120,75,9,37,24,124,85,71,26,118, +99,22,68,74,72,129,129,78,29,-9,-34,-15,12,67,148,173,141,81,38,27,73,130,170,177,190, +221,137,57,-29,7,162,269,318,239,25,-85,-66,29,42,110,213,59,3,48,23,48,72,114,124,139, +161,121,86,105,71,-28,-86,-112,-89,75,177,136,259,214,5,84,-87,-122,-324,-237,224,141,84,62,44, +44,52,110,109,44,45,37,57,36,19,54,92,155,242,210,146,74,22,42,144,-20,-56,-32,116,147, +66,42,249,305,268,209,96,65,76,63,69,58,28,30,29,45,38,19,23,26,30,15,-6,-7,-5, +130,238,293,265,169,83,4,82,234,448,493,393,260,115,-87,-117,-52,-20,17,-10,4,10,22,27,37, +21,-3,-7,-12,-1,9,18,39,74,124,150,157,119,48,57,105,185,183,221,236,401,464,493,290,296, +171,-46,-26,-28,-46,-31,-15,-23,-16,-34,-46,-45,-36,-17,-5,18,25,29,41,39,26,18,29,61,119, +133,144,155,121,122,117,202,244,267,276,75,50,-64,-56,-149,-155,-169,-162,-136,-119,-104,-89,-77,-73,-35, +2,49,30,25,13,28,39,32,57,69,94,65,26,-17,-14,27,123,80,71,82,75,8,3,-4,3, +-7,-27,-57,-78,-97,-111,-121,-113,-109,-100,-51,-7,41,39,52,60,40,28,12,8,2,-3,8,27,44, +36,17,5,0,5,2,3,-30,-31,-105,-59,-73,-77,-61,-64,-43,-26,-19,-5,-7,-2,-10,-17,7,-3, +1,-7,-21,-12,-13,-11,-11,-14,-9,-5,5,17,36,50,36,18,2,-11,-10,-8,8,-19,-91,18,-13, +-74,-76,-77,-80,-81,-81,-83,4,27,-67,7,27,-7,-2,-2,-4,-4,-5,-6,-1,2,4,7,8,16, +7,5,1,-2,2,-100,-83,-104,-62,23,139,-97,4,113,129,132,128,139,141,146,0,-95,144,8,-68, +-111,-83,-98,-104,-111,-114,-117,-109,-107,-104,-110,-111,-106,-117,-114,-91,-98,-91,-99,64,-80,-44,-3,-35,-46, +-54,-53,-28,-54,-44,-36,-28,-51,-78,-70,42,-101,-96,-114,-143,-163,-169,-165,-138,-125,-126,-140,-148,-137,-165, +-152,-96,-106,-88,-34,0,-20,-16,12,24,-24,42,35,34,8,40,10,-17,-64,-59,-53,-32,-58,-95,-114, +-172,-210,-228,-229,-184,-167,-165,-186,-202,-171,-231,-202,-91,-116,-83,-14,-1,-44,-36,68,82,24,62,70,73, +129,106,68,-5,-60,-53,-75,-17,-49,-97,-143,-252,-317,-342,-307,-215,-155,-163,-218,-243,-207,-289,-237,-67,-87, +-168,47,215,182,52,-101,-124,-13,9,75,202,50,-7,31,8,16,38,15,51,-5,-95,-51,-53,8,-14, +-84,-217,-294,-319,-205,-186,-312,-172,-178,-294,-226,-180,-242,-427,-325,67,96,83,51,32,30,36,100,101,42, +11,-10,15,23,42,-28,-122,-138,-181,-79,-41,-29,-14,22,106,-102,-150,-91,-30,23,82,-33,171,258,300, +221,89,27,54,67,61,49,16,11,14,34,23,-13,1,-38,-58,-75,-65,-34,-44,-63,-110,-154,-194,-213, +-182,-273,-355,-459,-256,-165,-226,41,-235,-108,-145,-129,-6,-29,-21,-11,-6,9,14,14,3,-20,-28,-35,-39, +-20,14,-8,-61,-74,-82,-63,-55,-49,-61,-22,36,70,80,7,-115,-244,-378,-265,-283,-55,75,-16,-39,-24, +-22,-35,-31,-41,-51,-62,-59,-48,-32,-16,10,-17,-4,-24,8,28,5,-4,-35,-80,-90,-124,-199,-168,-182, +-246,-274,-286,-283,-293,-137,-123,-32,-115,-161,-198,-201,-173,-160,-134,-117,-96,-89,-86,-65,-45,-9,16,24,22, +-9,-40,-55,-71,-62,-24,-25,-14,1,-30,-75,-134,-104,-98,-99,-103,-85,-60,-53,-64,-33,-61,-85,-115,-111, +-130,-134,-139,-109,-117,-62,-31,18,7,5,-11,-23,-14,-14,-18,-26,-32,-55,-75,-91,-118,-133,-156,-133,-116, +-101,-89,-88,-93,-31,-92,-84,-79,-94,-93,-97,-98,-81,-94,-89,-89,-63,-62,-77,-60,-17,-39,-25,-29,-28, +-27,-25,-21,-34,-49,-66,-80,-97,-118,-111,-108,-103,-97,-86,-94,-78,-36,33,-95,-41,21,25,30,32,41, +47,52,-40,-89,52,-29,-67,-70,-64,-67,-65,-65,-65,-62,-71,-77,-83,-90,-96,-104,-98,-95,-93,-92,-101, +70,57,111,11,-82,-174,50,-61,-159,-156,-154,-145,-161,-164,-159,-73,24,-186,-84,-2,99,65,75,70,66, +63,59,67,70,74,74,76,83,69,62,50,60,60,98,-98,61,-22,6,52,15,70,68,33,59,52, +55,-16,-14,-4,9,-101,76,95,91,85,72,67,62,85,97,99,98,95,103,70,51,27,43,72,122, +40,52,-32,30,38,8,39,79,40,83,17,72,-25,-15,-25,-16,-19,55,132,111,100,71,58,42,86, +107,121,125,126,155,76,38,8,24,54,93,15,35,-19,96,107,30,83,81,86,110,113,92,17,-10, +-63,-10,-45,56,156,134,116,70,55,50,129,179,180,163,145,168,50,-5,-34,-16,204,191,201,195,18, +-129,-122,-18,8,76,193,58,1,19,16,51,33,98,52,95,192,145,156,122,85,-3,-7,-9,17,155, +218,146,208,154,-3,72,-49,-125,-350,-250,107,137,122,66,40,35,35,93,100,60,45,27,39,41,-7, +26,96,115,190,175,123,49,-4,28,155,-34,-85,-52,41,99,126,32,218,292,251,213,44,13,33,98, +78,66,24,26,23,28,38,38,2,22,-10,9,42,6,9,163,274,325,316,226,84,107,181,200,445, +433,242,188,29,-125,-151,-70,-12,18,-5,14,-4,2,11,10,-2,-9,-16,-32,-22,10,-14,18,74,111, +139,138,100,59,56,90,118,159,183,156,261,314,367,152,253,114,-80,-10,10,-12,4,4,-19,-4,-24, +-45,-49,-31,-31,-14,25,13,-13,34,46,30,39,29,43,71,82,81,78,95,130,183,190,183,216,202, +65,-7,-142,-123,-190,-186,-166,-147,-121,-108,-89,-77,-64,-64,-45,-28,6,20,35,19,50,61,59,47,50, +75,66,49,18,24,57,141,117,101,82,63,49,19,-24,-7,-31,-47,-79,-102,-125,-113,-142,-106,-129,-106, +-73,-24,8,9,8,47,55,33,27,19,10,-3,14,31,47,50,45,45,40,43,47,37,-12,-14,-108, +-33,-65,-65,-36,-42,-16,-15,-35,-13,-10,-18,-37,-36,-16,-15,-44,-5,-18,-12,-11,-11,-9,-10,1,9, +18,27,38,48,38,23,10,-2,-3,9,-35,-82,-131,-12,-75,-128,-136,-139,-134,-145,-150,-150,-77,-16,-133, +-71,-24,7,-2,1,0,0,1,0,3,6,8,10,12,18,11,9,7,5,-2,-74,-62,-98,29,107, +125,-17,87,129,145,145,127,140,139,139,83,-11,127,86,22,-97,-62,-73,-79,-83,-84,-82,-74,-73,-76, +-78,-78,-73,-79,-77,-66,-72,-78,-63,121,-45,0,30,-3,-11,-26,-9,34,-10,-17,9,4,-21,-23,-37, +84,-57,-78,-79,-107,-122,-125,-113,-83,-71,-83,-90,-94,-83,-92,-87,-64,-72,-91,-22,66,22,3,32,39, +-7,67,35,72,-9,44,29,10,-38,-35,-25,19,-20,-84,-80,-128,-155,-161,-141,-96,-82,-103,-110,-117,-95, +-115,-108,-66,-81,-103,-9,53,-25,-54,67,83,22,65,78,61,100,82,59,-20,-71,-30,-71,16,-16,-83, +-91,-178,-227,-233,-186,-85,-38,-85,-115,-127,-98,-113,-92,-43,-54,-146,90,305,251,106,-79,-140,-36,-4,55, +167,48,-5,14,16,21,32,10,86,49,-84,-57,-98,-15,-52,-156,-245,-291,-271,-156,-116,-166,-105,-148,-253, +-179,-253,-239,-314,-279,-19,117,118,67,22,20,20,76,88,47,12,-3,38,36,59,-5,-72,-57,-108,-45, +-22,7,4,35,108,-92,-117,-9,36,89,148,-44,149,258,283,190,66,-30,27,96,78,51,13,6,4, +16,37,12,15,-26,-16,-43,-71,-30,-40,-22,-36,-45,-92,-149,-199,-223,-218,-221,3,35,-117,38,-152,-108, +-137,-117,1,-17,-13,-6,-15,-9,4,-10,-18,-14,-32,-37,-40,-20,26,-26,-66,-48,-45,-13,-3,28,39, +85,117,173,138,-46,-47,-87,-137,-99,-42,119,164,66,41,42,23,11,7,-16,-15,-50,-55,-37,-36,-17, +4,2,37,-6,16,39,16,16,0,-20,-23,-42,-79,-63,-48,-39,-65,-80,-87,-49,-96,-53,-24,-100,-140, +-171,-179,-135,-140,-123,-111,-79,-70,-70,-65,-47,-17,20,28,23,-5,-19,-18,-29,-17,6,4,2,-3,-23, +-58,-98,-87,-75,-81,-62,-51,-17,7,-23,-4,-40,-74,-114,-103,-121,-111,-130,-103,-109,-62,-36,2,5,25, +10,-14,-1,-5,-9,-20,-29,-34,-34,-33,-47,-53,-67,-52,-44,-41,-36,-62,-58,0,-60,-38,-39,-52,-46, +-58,-52,-27,-45,-51,-47,-32,-43,-52,-51,-12,-48,-40,-39,-39,-35,-32,-27,-41,-55,-66,-74,-82,-93,-88, +-82,-75,-67,-66,-76,-24,14,30,-43,9,33,36,37,30,39,44,43,9,-42,43,12,-28,-73,-61,-64, +-62,-62,-63,-60,-65,-68,-72,-76,-79,-83,-78,-75,-73,-71,-84,11,7,49,-76,-125,-106,-45,-112,-117,-112, +-108,-89,-107,-108,-92,-121,-66,-108,-124,-85,40,10,12,9,5,4,1,11,14,14,11,10,14,0,-3, +1,5,13,12,-112,-3,-75,-33,2,-21,22,5,-25,-14,-5,-2,-49,-47,-65,-35,-106,2,24,3,-1, +-11,-8,-6,26,35,23,11,-1,3,-30,-33,-18,-13,27,37,-35,-3,-69,-6,5,-14,15,65,12,47, +-17,42,-55,-49,-55,-50,-67,-4,44,6,-7,-34,-36,-43,18,36,28,14,-6,15,-65,-70,-27,-32,26, +15,-42,-20,-65,54,98,40,90,87,96,87,83,92,-6,-29,-77,-26,-66,10,49,-13,-43,-80,-72,-54, +58,102,66,13,-35,-25,-130,-120,-44,-49,82,55,102,148,36,-132,-159,-67,-15,44,140,53,6,-7,13, +43,-2,42,-11,15,87,75,121,80,50,-7,-32,-38,-1,84,96,17,23,-29,-97,-44,-57,-157,-365,-274, +-63,109,154,80,26,11,15,67,81,66,36,9,12,30,-12,-6,21,-10,1,29,26,0,-16,22,127, +-60,-112,-48,-39,40,186,9,138,258,206,172,1,-52,-23,99,77,66,13,14,10,11,33,36,-13,-3, +-48,-18,29,-4,8,96,145,155,151,101,-3,63,89,7,114,60,-96,15,-124,-149,-148,-88,-15,7,5, +13,-11,-12,-5,-16,-23,-15,-32,-51,-44,-11,-39,-23,15,21,37,34,21,34,33,50,37,104,96,26, +-18,-31,-24,-100,61,15,-32,8,20,13,19,6,-16,-3,-9,-35,-47,-39,-38,-20,11,-4,-32,9,35, +28,36,14,-2,-23,-35,-54,-74,-11,34,102,41,6,38,20,-46,-105,-163,-172,-200,-198,-162,-128,-113,-102, +-80,-71,-57,-54,-58,-58,-40,5,33,25,43,42,43,3,0,16,32,48,43,38,33,47,45,27,-9, +-37,27,0,-53,-47,-69,-77,-98,-117,-130,-111,-141,-99,-117,-92,-74,-38,-23,-15,-20,27,48,31,37,28, +20,7,10,10,12,13,16,18,17,18,28,16,-26,-31,-80,-32,-58,-54,-35,-38,-23,-33,-56,-43,-36, +-49,-58,-48,-42,-25,-52,-1,-6,-7,-6,-7,-6,-5,1,2,2,-1,-6,-11,-12,-17,-22,-27,-15,-2, +-68,-97,-90,-51,-95,-100,-106,-107,-99,-110,-113,-112,-106,-58,-101,-96,-61,3,-11,-8,-8,-8,-7,-7,-9, +-10,-10,-11,-11,-12,-13,-13,-12,-12,-20,1,-1,-13,83,91,3,63,86,33,42,41,25,27,23,21, +80,61,-3,74,74,-12,2,1,-3,-6,-5,-2,6,8,4,5,6,8,6,3,-2,-2,-15,21,75, +22,25,42,39,28,29,50,79,46,27,55,20,4,20,5,42,23,-2,8,-8,-18,-17,-5,24,34, +22,18,15,21,21,15,-3,-3,-27,33,98,62,5,42,46,18,72,51,91,14,34,58,16,-8,-18, +-3,37,32,-1,8,-12,-28,-24,-3,43,58,35,38,36,42,40,19,-14,-10,-50,25,72,15,-51,65, +86,31,77,90,70,71,65,66,-18,-53,-27,-41,20,32,4,18,-18,-46,-37,1,99,132,79,67,54, +60,71,51,-14,-10,-4,133,291,257,117,-63,-134,-56,-6,43,110,53,10,-6,26,38,19,28,78,85, +16,9,-32,9,-35,-134,-172,-171,-84,10,66,88,58,-21,-108,-44,-204,-160,-218,-223,-88,124,159,94,18, +4,3,51,72,57,30,18,48,35,36,29,27,59,50,43,31,34,22,42,98,-56,-62,65,85,142, +215,-14,122,270,204,122,19,-76,-18,94,85,58,10,5,-1,5,45,41,18,5,25,6,-37,-15,-4, +73,122,149,120,40,-75,-40,58,185,255,189,40,29,-19,-119,-111,-67,-8,13,9,9,-9,-15,-3,-23, +-29,-7,-33,-39,-33,-19,3,-31,-21,20,42,62,65,96,135,168,163,221,170,6,94,149,199,109,263, +232,134,91,75,60,39,35,23,10,20,-23,-40,-31,-33,-18,-5,19,49,24,31,37,22,29,36,49, +43,50,70,86,130,202,197,199,213,261,-30,-2,-75,-102,-136,-140,-139,-99,-106,-99,-87,-63,-50,-49,-55, +-42,-20,14,24,22,20,29,39,38,43,49,50,38,14,9,6,23,-4,-7,-21,-13,6,19,28,-2, +-16,-41,-73,-104,-98,-104,-95,-99,-89,-78,-55,-35,-17,3,37,50,28,30,24,18,11,2,16,33,52, +52,52,51,45,39,29,25,-19,-12,-16,-23,-13,-18,-18,-14,-17,-7,6,2,-8,-5,-7,-19,-10,-19, +-9,-26,-31,-26,-27,-24,-22,-21,-26,-30,-30,-27,-22,-17,-19,-18,-17,-15,-12,-14,24,26,-20,16,23, +-9,-9,-11,-20,-18,-18,-22,25,15,-16,24,16,-28,-20,-21,-22,-22,-23,-22,-21,-19,-19,-18,-17,-16, +-15,-14,-14,-13,-17,-58,-50,-47,-92,-63,30,-95,-69,9,17,21,34,24,25,42,-72,-102,35,-69,-98, +-50,-53,-61,-64,-67,-67,-66,-56,-54,-56,-62,-65,-65,-73,-71,-55,-58,-49,-72,-31,-59,-75,-33,-32,-36, +-29,-41,-38,-59,-47,-37,-47,-57,-90,-64,-36,-71,-64,-88,-97,-105,-97,-85,-51,-44,-62,-81,-98,-98,-117, +-105,-60,-68,-43,-46,-48,-29,-59,-15,-4,-19,18,42,23,3,-16,16,-48,-64,-70,-64,-68,-53,-70,-101, +-126,-146,-138,-129,-64,-51,-74,-100,-131,-129,-173,-150,-59,-81,-31,-46,-40,-51,-82,23,78,47,85,93,99, +67,53,78,-26,-54,-68,-52,-49,-37,-86,-152,-203,-228,-205,-157,-35,-1,-59,-129,-187,-195,-240,-176,-40,-64, +-91,-45,78,135,82,-90,-159,-89,-24,23,78,53,18,-25,17,31,-20,-19,-33,-43,-56,-25,13,5,-20, +-56,-130,-145,-75,-41,-58,-111,-150,-199,-198,-164,-114,-165,-315,-272,-198,70,166,100,17,-12,-9,38,61,61, +25,-4,1,11,3,-26,-68,-113,-162,-106,-67,-41,-6,26,69,-85,-116,-1,-52,33,235,-15,60,238,149, +91,-21,-96,-59,67,67,58,3,-3,-7,2,27,25,-12,-20,-48,-36,-20,-18,5,1,-24,-55,-67,-79, +-103,-66,-73,-117,-239,-326,-374,-139,-227,-148,-113,-83,-14,-2,15,6,-7,-17,-13,-32,-34,-19,-44,-58,-55, +-38,-43,-54,-60,-76,-72,-69,-42,21,38,46,14,72,31,-55,-221,-293,-338,-265,-88,-18,72,35,30,31, +20,0,-7,-4,7,-17,-35,-45,-40,-25,-13,-16,-16,-12,16,24,18,0,-34,-93,-119,-136,-158,-77,-42, +-9,-86,-112,-82,-89,-150,-155,-132,-179,-174,-172,-139,-102,-103,-93,-74,-66,-55,-49,-65,-70,-65,-10,18,30, +22,9,8,-26,-33,-23,2,31,51,31,-8,-64,-53,-69,-104,-128,-25,-28,-58,-74,-84,-93,-107,-124,-117, +-107,-117,-90,-84,-65,-58,-45,-41,-26,-17,10,19,21,30,25,21,15,4,-10,-18,-25,-23,-27,-25,-27, +-21,-25,-42,-46,-24,-38,-43,-39,-43,-42,-44,-54,-61,-63,-57,-65,-56,-45,-53,-32,-30,-6,-1,-7,-7, +-8,-8,-6,-12,-20,-32,-45,-61,-77,-69,-63,-57,-53,-28,-24,-58,-49,-1,-62,-56,-18,-17,-16,-10,-13, +-12,-9,-64,-65,-6,-54,-58,-15,-22,-22,-21,-21,-21,-20,-27,-30,-34,-37,-40,-48,-42,-39,-36,-33,-38, +56,45,68,60,0,-115,77,12,-85,-84,-84,-83,-98,-102,-99,4,62,-128,-8,49,65,48,55,53,52, +54,56,63,66,64,64,64,64,62,57,44,50,43,77,-24,60,11,23,53,40,63,72,71,62,45, +62,8,4,16,16,-42,66,56,62,61,58,63,73,97,104,95,91,85,82,79,67,35,45,42,71, +66,65,-13,33,35,29,51,63,80,43,10,68,-3,0,-24,-8,6,48,65,63,67,59,70,83,127, +143,129,133,125,115,105,72,19,35,28,52,49,38,-40,55,87,47,89,101,96,51,53,78,-11,-26, +-47,-17,-15,43,65,68,77,70,93,124,208,227,185,172,144,123,116,85,1,16,116,105,171,193,97, +-56,-118,-70,-11,32,54,63,32,-25,31,51,-2,36,26,70,108,80,72,47,6,-65,-70,-31,105,161, +205,243,147,54,7,51,-92,-58,-166,-179,-135,91,171,117,25,-9,-16,26,55,62,47,31,40,18,-8, +31,81,106,142,89,55,31,34,48,73,-34,-38,86,87,157,259,26,89,276,100,39,-27,-90,-54,58, +71,62,10,3,-5,2,39,55,12,32,36,40,14,5,38,136,219,263,254,184,69,120,258,466,293, +139,54,-15,36,-133,-78,-15,-15,34,26,17,3,-16,-9,-26,-30,-7,-31,-41,-31,-23,-37,-30,15,53, +84,88,96,121,166,182,154,182,140,88,155,240,327,168,389,202,43,68,75,47,34,29,15,23,34, +6,-17,-30,-33,-24,-15,17,25,40,38,27,30,29,41,57,59,86,139,169,220,303,313,329,369,393, +10,-6,-142,-127,-146,-114,-90,-68,-69,-70,-57,-51,-39,-37,-42,-37,-31,-6,13,22,45,66,75,79,75, +71,74,60,37,42,64,117,74,51,24,11,41,25,1,-13,-55,-64,-86,-101,-103,-89,-91,-66,-72,-45, +-47,-32,-33,-7,23,58,53,47,44,41,40,35,54,74,95,104,106,112,90,75,61,50,11,17,-44, +0,-11,-17,-3,-6,5,12,5,17,12,11,-4,-4,15,9,-11,9,-4,0,-1,-2,-3,-6,0,3, +9,16,26,39,35,31,25,20,29,37,31,-2,-65,37,-3,-60,-63,-67,-69,-75,-78,-82,0,36,-70, +0,27,22,19,20,18,18,17,16,20,23,26,30,32,36,33,32,31,33,35,-79,-67,-97,-35,38, +114,-65,21,104,113,115,114,114,115,123,20,-62,116,23,-40,-95,-73,-85,-87,-89,-87,-82,-75,-74,-77, +-82,-86,-89,-90,-86,-70,-77,-72,-88,66,-60,-29,-3,-27,-17,-40,-38,-2,-48,-44,-28,-17,-36,-64,-58, +38,-86,-101,-112,-126,-130,-121,-100,-74,-68,-85,-101,-115,-120,-121,-105,-64,-75,-77,-69,-2,-11,-19,5,10, +-2,37,25,59,-20,7,10,-13,-47,-63,-53,-32,-58,-124,-132,-160,-169,-155,-124,-78,-70,-99,-118,-146,-162, +-163,-137,-60,-79,-61,-47,14,-34,-65,18,65,51,78,98,98,52,33,60,-32,-64,-52,-70,-20,-57,-155, +-187,-237,-248,-215,-141,-45,-30,-93,-144,-189,-213,-195,-125,-21,-40,-182,-70,100,137,125,-32,-127,-86,-27,12, +28,61,38,-30,24,22,-15,-46,-12,-38,-120,-72,-73,-42,-71,-120,-210,-215,-101,-96,-110,-118,-194,-251,-226, +-196,-164,-122,-198,-221,-231,31,143,112,19,-21,-32,11,41,49,20,-3,11,-6,10,-33,-103,-122,-187,-147, +-99,-48,34,53,18,-90,-91,61,11,88,256,-20,8,231,87,1,-17,-98,-59,21,48,45,1,-14,-19, +0,22,19,6,-15,-10,-21,-51,-18,10,-41,-92,-130,-159,-159,-124,-143,-134,-41,-336,-448,-422,-198,-206,-128, +-65,-50,-5,-4,16,-2,-1,-19,-16,-33,-32,-19,-43,-49,-53,-55,-34,-62,-103,-117,-115,-95,-37,41,75, +87,68,82,21,-51,-209,-279,-346,-226,-71,16,148,63,49,53,27,2,7,-1,22,7,-14,-42,-39,-33, +-33,-16,16,-8,6,24,11,2,-33,-90,-100,-98,-98,-46,-29,-27,-65,-64,-49,-32,-157,-124,-76,-139,-125, +-113,-92,-66,-78,-73,-63,-58,-53,-48,-56,-59,-65,-23,-1,24,3,-8,-8,-17,-19,-18,-3,13,36,13, +-29,-101,-93,-100,-122,-126,-59,-39,-39,-72,-78,-91,-102,-118,-97,-96,-82,-78,-51,-43,-38,-42,-40,-22,0, +-1,-9,9,17,19,19,21,7,-5,-13,-25,-28,-39,-40,-46,-49,-46,-41,-39,21,-36,-20,-19,-38,-38, +-50,-50,-37,-50,-51,-49,-29,-24,-34,-23,5,-6,3,-3,-5,-7,-8,-7,-20,-33,-49,-63,-78,-92,-81, +-69,-59,-50,-32,-37,-18,16,59,-40,4,47,52,54,53,60,65,66,6,-35,65,11,-21,-30,-26,-29, +-28,-29,-30,-29,-35,-39,-42,-46,-50,-58,-51,-48,-44,-40,-43,51,41,79,-12,-83,-135,23,-66,-125,-128, +-126,-109,-132,-134,-125,-73,3,-148,-85,-23,72,41,48,48,48,49,52,57,59,59,58,56,53,49,44, +38,45,52,62,-89,46,-22,-7,32,22,50,42,22,28,24,26,-18,-15,-27,-7,-98,40,47,41,49, +50,60,73,90,92,84,76,65,55,43,37,27,38,62,55,2,32,-32,13,15,23,21,57,49,49, +-12,48,-27,-12,-47,-34,-46,14,53,36,49,46,61,75,110,122,112,111,92,71,41,22,13,28,74, +46,11,33,-29,40,81,64,94,106,119,42,43,80,-4,-11,-74,-20,-61,5,36,13,38,44,81,125, +189,191,154,129,86,46,9,7,2,17,106,6,12,86,73,-46,-100,-81,-26,14,15,74,55,-35,27, +47,-14,20,-32,15,115,96,121,61,28,-21,-20,34,183,189,195,206,85,3,-2,29,-1,8,-142,-154, +-166,32,143,116,34,-14,-36,2,35,56,48,25,19,-8,-49,-7,48,47,86,39,20,-8,51,64,38, +-34,-40,67,56,135,262,50,13,233,12,-33,-43,-76,-64,6,39,51,11,-3,-11,3,22,47,4,34, +18,42,45,20,62,127,188,208,203,173,130,161,258,427,84,-98,-97,-107,-7,-129,-53,10,-6,28,24, +16,8,-17,-17,-24,-23,-13,-28,-41,-38,-36,-70,-36,4,17,41,42,68,97,130,133,109,95,64,110, +88,128,165,58,252,48,-34,24,47,35,31,12,0,20,31,27,3,-32,-36,-35,-26,-2,-10,35,33, +19,35,21,16,12,21,49,103,138,176,233,232,245,281,269,3,-58,-157,-134,-139,-89,-47,-43,-36,-41, +-31,-46,-39,-36,-34,-39,-50,-31,-5,14,45,64,66,63,58,50,56,53,50,54,74,114,86,61,30, +5,29,1,-49,-52,-100,-96,-103,-104,-105,-78,-87,-46,-59,-30,-42,-32,-40,-19,-8,32,47,41,47,47, +50,49,59,69,78,83,83,84,60,44,36,25,14,14,-52,2,-21,-23,-9,-17,-1,-2,-21,-4,0, +-5,-16,-3,13,18,-8,34,23,22,20,16,14,10,17,22,26,28,34,42,40,36,30,21,28,40, +-3,-40,-70,7,-43,-78,-81,-83,-77,-86,-89,-89,-40,9,-77,-34,3,38,26,28,26,26,26,24,26, +28,31,34,36,37,33,32,31,32,34,-40,-34,-65,40,93,86,10,78,98,102,102,92,95,93,92, +78,15,78,74,33,-64,-40,-46,-48,-47,-44,-37,-34,-34,-37,-38,-40,-46,-43,-41,-35,-38,-37,-32,101, +-11,25,30,8,19,-10,4,46,3,-7,10,16,-3,-15,-24,56,-41,-67,-61,-71,-71,-61,-36,-22,-20, +-32,-40,-48,-56,-47,-39,-26,-28,-47,-29,56,31,20,32,30,25,50,21,84,-10,28,21,19,-10,-43, +-27,4,-27,-91,-79,-92,-90,-72,-27,-9,-5,-32,-31,-49,-77,-57,-51,-29,-28,-31,1,74,18,-24,33, +61,60,75,101,97,41,27,48,-18,-47,-44,-66,-7,-45,-125,-115,-134,-128,-88,-4,47,38,-19,-32,-55, +-93,-48,-13,7,13,-141,-38,104,120,134,14,-81,-74,-33,4,1,75,61,-29,28,23,6,-29,20,8, +-65,-37,-75,-36,-72,-149,-202,-173,-24,-35,-30,5,-101,-173,-170,-131,-137,-41,-68,-145,-197,2,104,105,31, +-14,-48,-13,23,38,24,9,27,-18,-4,-29,-64,-44,-77,-84,-60,-25,81,83,-6,-66,-45,104,102,163, +244,11,-60,171,20,-66,-2,-68,-39,-22,21,29,9,-16,-23,1,17,21,23,8,35,16,-36,3,31, +4,-18,-40,-78,-85,-42,-77,-29,161,-184,-310,-245,-184,-67,-84,-25,-6,15,4,10,-1,4,-20,-18,-24, +-21,-15,-30,-33,-43,-57,-31,-54,-89,-83,-75,-42,18,80,123,142,147,115,50,10,-29,-36,-73,-23,60, +60,124,64,57,67,41,17,21,12,32,27,6,-32,-37,-40,-44,-9,38,15,11,25,16,16,1,-16, +-5,20,60,64,77,81,88,104,97,118,-65,-48,-33,-69,-70,-45,-35,-24,-36,-39,-42,-47,-47,-45,-39, +-36,-47,-33,-22,6,-3,2,5,19,24,18,15,9,19,8,-8,-39,-46,-43,-45,-36,-53,-31,-20,-58, +-73,-83,-91,-102,-79,-79,-52,-61,-35,-35,-28,-34,-28,-11,16,3,-11,11,16,19,20,24,22,24,27, +17,9,-4,-14,-26,-40,-38,-17,-13,28,-20,-1,-5,-24,-26,-36,-27,-8,-19,-25,-16,0,-1,-2,-3, +28,1,3,2,0,-1,-2,-2,-13,-22,-30,-36,-39,-40,-34,-26,-21,-16,-20,-29,19,45,46,-5,33, +43,49,50,45,54,58,58,44,5,59,46,16,-26,-18,-21,-21,-22,-23,-23,-25,-25,-26,-27,-28,-31, +-29,-28,-27,-25,-28,0,0,21,-67,-90,-50,-45,-84,-62,-66,-63,-43,-59,-59,-48,-87,-58,-59,-92,-75, +14,-6,-5,-6,-5,-3,2,4,5,5,2,-2,-7,-12,-12,-5,-2,17,-1,-69,-1,-40,-24,-5,-3, +5,-10,-23,-23,-14,-21,-30,-31,-66,-39,-83,-27,-15,-30,-23,-19,-4,14,24,23,11,1,-14,-28,-43, +-36,-9,-3,29,-2,-40,-5,-31,-2,-2,13,0,32,22,27,-15,14,-31,-25,-64,-55,-75,-40,-22,-45, +-40,-37,-18,7,27,32,18,12,-17,-45,-81,-72,-16,-11,69,14,-6,15,-18,24,67,77,88,101,123, +40,33,66,-1,-11,-85,-43,-81,-54,-60,-99,-88,-72,-23,48,89,74,31,-1,-51,-98,-140,-94,3,13, +-23,-99,-86,6,65,-19,-79,-89,-49,-7,-6,83,73,-37,20,31,-8,-8,-57,-38,39,50,81,34,5, +-36,-52,-2,137,97,68,48,-70,-129,-106,-80,39,22,-118,-146,-197,-34,91,95,44,-8,-50,-20,15,44, +34,9,-1,-29,-59,-53,-32,-55,-50,-61,-43,-40,72,78,1,-49,-53,40,38,111,227,60,-109,99,-42, +-69,-34,-49,-51,-42,-1,27,14,-10,-18,3,3,22,0,15,-6,17,39,29,63,64,60,31,22,42, +86,100,108,142,-234,-374,-277,-218,-69,-80,-26,9,19,11,12,7,7,-18,-23,-18,-13,-20,-24,-38,-49, +-52,-77,-48,-43,-57,-47,-35,10,56,73,72,64,23,-8,57,-44,-68,-102,-90,-24,-106,-48,-9,15,32, +32,4,-1,14,20,33,13,-31,-39,-46,-39,-27,-27,14,19,16,27,10,-10,-37,-26,-7,24,58,77, +90,62,49,50,8,-28,-97,-106,-100,-92,-53,-13,-16,-9,-16,-15,-42,-43,-41,-35,-44,-60,-49,-26,-2, +19,28,25,17,13,8,13,23,45,42,40,32,36,26,14,-12,-23,-41,-86,-94,-128,-116,-111,-103,-97, +-72,-75,-44,-47,-32,-38,-33,-37,-27,-28,-7,16,20,36,34,36,37,34,29,25,20,16,10,-5,-18, +-23,-30,-3,-8,-29,-12,-28,-28,-27,-36,-28,-35,-48,-40,-32,-36,-32,-15,-10,5,-3,30,28,24,23, +21,20,18,20,20,17,11,6,3,5,5,4,-1,-5,1,-41,-54,-33,-40,-61,-51,-51,-50,-41,-45, +-45,-42,-58,-35,-34,-48,-30,15,4,5,5,5,4,4,3,1,1,2,1,-1,-2,-4,-5,-5,-7, +22,19,12,72,64,-14,66,62,11,7,6,-1,-2,-5,-11,61,64,-30,50,62,10,14,17,16,19, +22,30,29,29,27,29,28,22,24,22,17,21,25,44,54,45,47,38,39,45,31,44,63,46,32, +39,29,20,18,7,10,20,0,14,13,20,31,55,55,54,45,46,42,31,37,35,24,33,18,30, +75,59,34,42,34,43,39,22,74,19,30,34,29,21,-23,-7,10,7,-13,4,10,23,44,89,82, +84,64,82,73,38,51,35,11,32,42,55,93,65,15,45,60,72,76,96,97,35,30,45,6,-11, +-47,-45,-22,-25,-44,-15,4,31,79,159,162,133,88,104,93,46,74,71,34,63,-33,-4,57,78,103, +34,-41,-69,-46,-6,-9,88,80,-27,27,29,27,12,31,47,50,46,3,6,-40,-123,-123,-55,112,90, +108,157,27,-52,-76,-38,-24,45,8,-89,-150,-31,60,86,49,5,-52,-30,7,33,29,19,29,-22,-29, +-24,7,45,60,6,1,13,113,100,-7,-34,-6,106,161,203,200,67,-135,41,-40,-79,-7,-29,-19,-51, +-7,13,19,-9,-20,1,8,23,28,29,55,42,12,35,57,84,105,102,79,68,79,89,149,279,11, +-97,-27,-153,88,-20,8,35,37,20,7,5,7,-18,-19,-12,-7,-11,-13,-19,-35,-49,-41,-40,-42,-18, +-1,32,72,110,145,160,170,112,68,74,151,209,235,171,159,56,22,34,46,59,49,32,31,29,34, +37,18,-17,-34,-47,-46,-9,27,31,21,23,20,31,41,61,92,133,196,174,191,210,239,242,206,204, +56,29,-23,-12,-19,12,19,15,10,-2,-13,-31,-37,-40,-28,-23,-27,-40,-36,-16,3,26,31,56,61, +50,34,14,8,15,32,60,43,53,68,73,-27,-24,-25,-50,-81,-81,-84,-85,-71,-64,-42,-44,-35,-31, +-27,-26,-22,-8,13,8,3,18,23,22,21,23,34,49,62,61,54,48,30,13,-7,-14,10,13,0, +-4,1,-7,-14,-20,-19,-9,1,1,-3,4,8,6,19,11,23,8,4,7,7,9,11,10,9,8, +11,14,22,31,27,27,24,20,-3,-7,25,21,-16,13,14,-14,-11,-12,-16,-13,-11,-13,29,24,-5, +30,28,-7,-2,-3,-4,-4,-5,-5,-3,0,2,4,6,10,5,2,-1,-2,-4,-48,-39,-49,-62,-24, +60,-69,-33,41,39,41,51,49,50,56,-31,-68,56,-32,-67,-54,-49,-55,-56,-53,-51,-44,-45,-45,-48, +-49,-53,-60,-63,-60,-44,-46,-23,-53,11,-35,-25,-16,-26,-12,-33,-43,-34,-46,-34,-40,-18,-26,-67,-53, +-19,-77,-75,-87,-87,-78,-62,-37,-37,-42,-57,-64,-77,-90,-100,-84,-36,-36,-19,-49,-32,-17,-4,-1,-5, +8,-3,1,12,-3,2,-9,-9,-21,-57,-52,-63,-72,-96,-107,-115,-104,-82,-40,-43,-45,-68,-70,-99,-131, +-149,-123,-34,-39,36,-9,13,6,-2,14,47,79,72,86,102,40,26,45,5,-14,-69,-64,-67,-94,-147, +-175,-185,-156,-99,-4,3,-27,-80,-100,-138,-184,-196,-125,16,20,-165,-146,-87,-17,72,19,-52,-89,-67,-23, +-12,86,81,-32,14,14,15,-21,-31,-47,-37,-4,2,-13,-47,-89,-125,-80,49,-13,-53,-75,-185,-228,-200, +-182,36,18,-71,-133,-205,-86,28,67,52,7,-55,-38,-3,30,14,-8,-12,-35,-38,-76,-94,-118,-155,-135, +-84,-35,99,90,-25,-64,-52,40,63,109,163,62,-212,-70,-54,-59,-19,-17,-24,-70,-30,1,16,-12,-21, +-3,-10,-2,7,-5,-14,-14,10,32,48,-2,-60,-122,-137,-89,-1,25,-41,-167,-413,-467,-347,-273,-70,3, +10,9,48,-1,-1,-1,3,-17,-25,-13,-5,-20,-17,-29,-54,-63,-61,-59,-89,-110,-113,-82,-27,37,44, +43,42,-15,-45,-16,-121,-179,-241,-138,-228,-165,-11,-13,1,35,35,8,14,15,14,29,15,-20,-39,-53, +-50,-44,-24,-10,3,16,12,10,-11,-45,-28,-16,-5,12,11,-16,-47,-85,-144,-189,-31,-69,-17,-35,-13, +2,21,15,14,5,-4,-31,-43,-46,-41,-46,-54,-52,-41,-19,-13,-12,-15,-16,-16,-21,-21,-9,18,12, +-7,-50,-23,-7,7,-4,-73,-75,-89,-107,-120,-113,-102,-95,-80,-69,-58,-49,-36,-37,-33,-36,-34,-31,-32, +-38,-23,-4,15,12,10,13,1,-11,-23,-33,-37,-48,-49,-57,-61,-69,-22,-29,3,-29,-28,-28,-44,-51, +-55,-59,-57,-62,-56,-55,-36,-25,-30,-15,3,5,14,10,12,13,16,19,13,7,-2,-12,-24,-36,-33, +-29,-26,-25,-40,-44,-52,-35,12,-66,-46,-7,-2,1,6,10,14,18,-39,-56,21,-29,-41,-23,-24,-25, +-24,-24,-24,-22,-27,-30,-32,-34,-36,-40,-39,-41,-42,-43,-50,55,47,66,40,-13,-92,60,-4,-75,-84, +-84,-80,-88,-90,-93,-5,52,-110,-19,30,60,43,51,51,56,59,66,62,61,60,64,63,57,56,52, +45,52,65,77,-23,64,30,18,40,42,45,45,35,48,41,36,18,19,14,13,-55,41,40,49,58, +71,84,104,94,88,80,86,82,69,65,59,46,63,67,57,43,51,23,29,18,38,9,16,30,38, +16,32,18,31,-15,-8,-16,12,38,44,62,83,105,143,120,118,105,130,122,86,78,57,33,59,104, +75,66,76,37,40,52,77,71,81,87,33,37,47,30,23,-53,-27,-55,-25,5,24,67,113,168,237, +205,163,125,153,141,89,85,72,48,84,34,-17,-35,11,56,30,-18,-74,-61,-15,-8,91,86,-25,18, +29,40,47,20,54,139,112,91,38,-11,-73,-36,56,215,177,185,220,77,7,-20,2,101,102,25,-62, +-129,-73,11,59,61,22,-49,-43,-8,30,27,16,10,-21,-47,-29,44,65,104,45,35,40,121,96,-6, +-18,8,77,160,184,131,104,-203,-123,-76,-49,-27,9,-5,-66,-30,0,22,2,-11,-5,-5,19,21,32, +34,33,53,55,68,124,162,164,160,159,142,235,262,204,75,9,48,-143,172,52,38,59,54,27,3, +13,7,-13,-21,-4,1,-9,-1,-15,-34,-44,-58,-37,-8,15,35,64,85,109,124,125,117,48,34,86, +190,263,324,223,115,-23,-86,-8,23,35,42,35,31,38,27,34,21,-2,-32,-50,-44,-25,-12,22,20, +17,23,35,56,93,127,165,226,203,217,238,268,242,172,137,129,66,-20,20,20,49,60,42,46,29, +14,-14,-27,-37,-27,-23,-21,-43,-40,-31,7,36,41,61,62,48,33,15,4,21,56,115,103,116,140, +134,-9,-32,-52,-58,-95,-86,-81,-72,-71,-55,-49,-34,-42,-33,-33,-29,-30,-21,-13,-3,9,15,25,20, +19,19,32,46,57,64,63,66,50,36,21,-1,18,14,-36,-4,-16,-23,-19,-29,-18,-12,-17,-6,-5, +-3,-8,-4,13,10,0,10,4,9,12,15,19,20,27,34,42,49,59,70,58,49,40,31,2,4, +-3,-30,-72,-1,-33,-74,-73,-74,-74,-76,-77,-78,-21,9,-65,-17,8,7,6,7,6,7,7,8,11, +14,17,21,25,31,23,18,12,8,5,-53,-42,-73,-8,52,106,-35,35,98,96,95,90,101,102,100, +41,-24,102,40,-12,-74,-52,-60,-60,-57,-53,-44,-49,-51,-55,-53,-56,-64,-63,-59,-45,-49,-31,-51,79, +-29,13,8,-19,1,-37,-36,-11,-29,-23,-23,11,-3,-30,-37,35,-73,-85,-84,-88,-75,-61,-34,-43,-51, +-66,-65,-72,-84,-82,-67,-28,-29,-37,-51,12,1,32,11,1,13,1,-22,12,-19,25,-10,24,3,-29, +-29,-25,-62,-111,-102,-114,-92,-70,-17,-44,-51,-79,-67,-84,-122,-112,-89,-24,-28,16,-3,52,20,23,13, +28,71,52,65,62,36,28,28,18,-4,-38,-66,-42,-97,-164,-159,-169,-125,-67,31,0,-43,-100,-89,-103, +-151,-118,-60,38,46,-213,-119,-40,-7,80,50,-21,-81,-71,-26,-8,82,77,-20,8,3,44,-2,27,3, +-36,-12,-47,-45,-90,-138,-163,-107,18,-45,-72,-66,-177,-216,-206,-195,26,29,9,-92,-186,-114,-26,38,53, +19,-51,-50,-18,18,-1,-15,-11,-25,-8,-64,-91,-98,-144,-123,-67,13,118,88,-43,-63,-28,61,121,133, +89,58,-268,-230,-58,-32,-17,17,9,-77,-43,-17,15,-4,-17,-12,-16,-11,21,-10,-4,-28,-12,32,31, +-21,-87,-142,-163,-120,-51,26,-54,-267,-343,-334,-258,-245,29,102,59,26,65,-2,-8,0,1,-11,-22,-9, +-2,-13,-8,-18,-48,-63,-40,-61,-98,-105,-108,-60,-10,52,55,54,48,-17,-44,-53,-82,-116,-153,-35,-242, +-128,16,-1,8,38,35,23,33,22,15,20,12,-3,-34,-53,-56,-50,-14,-25,-9,15,4,17,13,9, +25,38,51,40,29,-13,-18,-63,-167,-201,18,13,67,40,58,58,53,46,38,27,7,-14,-34,-47,-43, +-40,-36,-44,-44,-31,-32,-29,-27,-16,-14,-23,-29,-25,-8,-11,-26,-62,-34,-3,32,42,-86,-78,-65,-89, +-90,-89,-79,-76,-59,-61,-41,-53,-32,-43,-32,-40,-36,-33,-26,-47,-45,-20,-5,-7,-9,-5,-16,-26,-36, +-42,-45,-51,-44,-47,-53,-67,-30,-36,15,-39,-26,-29,-52,-57,-66,-63,-46,-58,-57,-50,-29,-27,-33,-26, +5,-20,-9,-9,-5,0,5,11,3,-3,-10,-18,-27,-36,-39,-38,-34,-30,-54,-65,-36,-7,25,-57,-18, +14,21,24,24,33,38,41,-6,-44,42,0,-28,-47,-39,-41,-39,-38,-38,-35,-39,-41,-44,-46,-47,-49, +-49,-51,-53,-56,-64,39,34,60,-19,-69,-85,7,-60,-88,-99,-98,-87,-93,-92,-91,-58,0,-97,-68,-27, +51,29,35,36,41,43,49,44,43,41,45,43,37,33,32,31,37,59,49,-63,37,-1,-11,12,17, +22,9,-16,12,19,5,-1,4,-13,-6,-84,11,24,24,37,54,69,86,71,61,49,57,51,35,26, +26,34,47,67,34,-10,17,9,3,-8,19,-25,-3,-21,31,2,15,3,22,-14,-20,-49,-15,24,19, +35,61,82,113,82,78,64,87,75,36,18,12,28,43,117,52,21,53,44,20,33,71,55,56,60, +32,42,45,42,41,-47,-23,-83,-54,-16,-17,24,81,141,202,152,104,66,92,74,17,-1,12,53,77, +2,-67,-121,-54,25,20,-9,-78,-68,-20,-3,82,75,-17,4,18,44,58,13,48,149,120,116,30,-19, +-47,-2,93,223,166,146,150,18,-31,-39,-38,163,108,21,-50,-138,-113,-30,29,56,25,-42,-50,-21,26, +13,-1,-17,-16,-42,-40,22,11,39,10,24,60,110,71,-27,-26,2,44,127,133,60,98,-256,-287,-100, +-15,-53,37,9,-70,-44,-11,17,11,-4,-14,-17,8,14,18,-5,1,60,53,58,93,106,92,100,120, +110,267,232,-22,-47,-68,-44,-161,167,130,78,65,58,21,1,16,7,-5,-20,-4,1,-7,2,-16,-37, +-44,-68,-43,-12,-3,11,38,56,80,71,55,26,-36,-29,40,82,115,160,129,-55,-126,-134,-39,1,11, +26,28,24,34,16,21,14,6,-31,-52,-47,-47,-52,-10,4,6,19,28,46,77,95,116,150,146,151, +150,153,105,23,-44,126,56,7,38,43,63,75,57,64,48,33,0,-20,-38,-33,-33,-28,-42,-37,-35, +1,20,25,29,25,11,7,6,7,23,50,91,97,111,135,124,-15,-50,-80,-75,-103,-88,-74,-60,-65, +-49,-55,-34,-48,-42,-43,-39,-44,-40,-44,-26,-3,-1,14,9,9,10,13,14,13,22,25,34,29,24, +20,-9,0,-10,-54,-21,-41,-44,-40,-51,-38,-38,-50,-37,-30,-32,-35,-26,-14,-7,-23,1,-1,2,7, +11,16,19,28,36,42,46,49,52,38,26,17,8,-14,-10,-44,-70,-81,-37,-73,-92,-91,-91,-85,-89, +-90,-89,-64,-28,-77,-57,-29,1,-4,-1,-1,0,2,3,4,5,7,9,11,16,9,4,-2,-7,-11, +-14,-9,-34,46,78,63,24,65,69,64,62,49,64,64,56,72,36,54,67,42,-35,-17,-18,-19,-14, +-10,-1,-8,-10,-15,-9,-11,-19,-15,-13,-9,-10,1,-2,83,9,47,25,5,23,-12,-5,17,11,10, +12,33,23,18,-5,38,-26,-41,-28,-28,-11,1,23,6,-3,-17,-5,-5,-20,-9,-2,10,12,-9,-12, +48,29,56,20,6,22,-1,-31,5,-12,36,5,45,33,7,-1,6,-26,-59,-37,-39,-9,12,61,19, +11,-17,14,9,-36,-6,-2,11,15,32,25,73,44,52,15,11,55,30,37,20,30,36,22,35,21, +-3,-45,-30,-73,-105,-67,-55,4,59,132,73,23,-30,16,21,-33,25,49,66,79,-151,-55,-10,-3,68, +57,4,-63,-60,-18,-1,70,63,-4,2,0,62,40,82,84,46,35,-26,-45,-102,-145,-131,-50,75,23, +12,44,-67,-111,-126,-125,41,65,90,-26,-141,-118,-57,15,44,23,-39,-53,-27,13,-7,-12,-8,-7,9, +-31,-31,-20,-36,-45,-5,83,119,64,-58,-47,11,86,179,160,27,52,-264,-351,-86,-19,-37,42,34,-65, +-42,-23,13,9,-7,-20,-15,-5,31,3,15,-15,-6,32,25,11,-20,-45,-61,-40,-26,107,57,-172,-126, +-99,-75,-154,167,189,115,63,61,10,-3,7,5,-2,-16,-7,-1,-2,1,-8,-33,-51,-32,-52,-64,-48, +-39,8,41,82,82,74,49,-3,-15,-31,30,49,71,126,-114,-52,-6,3,20,30,27,37,42,29,18, +12,8,10,-29,-50,-57,-47,-15,-29,-16,8,3,29,50,83,98,117,142,115,104,73,89,51,-50,-81, +91,96,105,93,93,91,74,67,58,47,25,6,-19,-41,-39,-30,-18,-31,-37,-35,-29,-19,-12,7,9, +-3,-12,-18,-18,-9,-2,2,13,42,82,101,-59,-57,-38,-57,-61,-59,-50,-47,-39,-46,-30,-47,-36,-48, +-38,-43,-39,-35,-21,-36,-40,-22,-14,-15,-15,-11,-13,-14,-15,-13,-13,-10,-4,-4,-12,-33,-26,-30,-5, +-40,-29,-35,-52,-56,-61,-51,-33,-39,-41,-32,-22,-26,-23,-27,-4,-32,-27,-22,-18,-11,-4,2,-2,-3, +-3,-3,-3,-3,-13,-20,-21,-21,-44,-54,-15,1,-6,-31,-7,-8,-2,-1,-4,3,8,8,8,-18,11, +9,-9,-46,-35,-35,-34,-32,-32,-29,-30,-30,-30,-31,-31,-28,-31,-33,-38,-42,-46,-5,-1,6,-54,-59, +-7,-43,-60,-26,-35,-34,-24,-23,-20,-16,-54,-42,-11,-58,-57,0,-9,-9,-8,-3,-1,5,-1,-2,-6, +-2,-5,-13,-15,-13,-3,-3,21,-8,-39,-7,-14,-24,-20,-7,-20,-36,-50,-28,-11,-24,-9,-6,-31,-27, +-56,-38,-23,-28,-18,0,15,29,14,2,-13,-5,-11,-29,-35,-25,8,10,27,-14,-41,-16,12,-16,-27, +1,-45,-31,-52,3,-1,-7,2,11,-8,-27,-58,-48,-30,-37,-30,-3,16,43,13,6,-15,6,-10,-53, +-63,-46,13,8,83,11,-9,17,48,-4,4,54,26,22,18,30,40,35,44,43,-19,-28,-84,-88,-77, +-85,-61,0,57,109,57,10,-35,-10,-29,-87,-87,-41,62,61,-99,-112,-149,-87,15,19,-5,-68,-60,-19, +0,60,54,-2,-9,-2,42,49,31,50,95,78,72,-13,-61,-59,-28,58,155,86,38,11,-89,-113,-99, +-119,137,85,36,-27,-149,-137,-63,3,40,18,-32,-50,-30,17,-7,-19,-35,-7,-14,-41,-29,-63,-66,-55, +-5,76,88,32,-65,-47,-4,37,109,93,-1,52,-254,-401,-133,-19,-72,46,22,-57,-46,-21,11,16,0, +-23,-24,-7,11,0,-28,-25,34,35,34,20,-14,-48,-44,0,20,185,90,-265,-233,-211,-174,-157,116,202, +128,71,50,12,4,12,6,3,-16,-9,-3,-2,1,-14,-35,-45,-62,-50,-40,-46,-36,-11,15,48,26, +-4,-56,-88,-72,-25,-67,-93,-86,-11,-225,-178,-108,-46,-12,-4,9,20,18,21,5,6,3,6,-30,-50, +-54,-65,-70,-47,-21,-5,8,18,28,41,44,48,50,61,49,17,-11,-66,-139,-212,75,35,53,53,61, +64,69,59,63,55,41,13,-12,-36,-40,-42,-35,-35,-29,-29,-14,-11,-10,-14,-19,-27,-22,-7,9,17, +25,26,49,62,80,75,-40,-65,-84,-81,-92,-75,-57,-42,-47,-40,-50,-38,-47,-49,-48,-48,-52,-52,-58, +-47,-26,-21,-7,-8,-6,-3,-11,-22,-33,-31,-28,-20,-13,-10,-7,-31,-33,-45,-48,-47,-58,-59,-64,-72, +-66,-68,-73,-67,-58,-59,-54,-44,-44,-31,-34,-19,-13,-13,-9,-4,1,7,9,12,11,9,3,-3,-13, +-23,-28,-32,-40,-41,-69,-73,-49,-68,-78,-64,-62,-60,-53,-54,-52,-48,-71,-59,-43,-64,-55,-23,-26,-24, +-22,-20,-19,-17,-19,-20,-21,-23,-23,-23,-26,-29,-33,-37,-39,34,31,28,58,41,-20,58,39,-8,-18, +-20,-28,-19,-19,-26,45,63,-30,36,53,25,26,31,33,38,41,47,40,39,34,42,42,33,37,36, +33,35,43,50,28,42,53,22,22,34,14,18,22,37,34,34,36,35,43,20,-3,23,17,35,43, +61,71,83,64,54,42,61,63,46,58,56,48,54,37,31,46,38,57,16,-1,24,-19,-34,-15,3, +26,18,43,48,32,15,10,6,13,34,49,81,98,128,87,81,59,99,100,53,80,69,48,57,70, +51,56,54,74,9,-5,38,7,6,-14,21,41,24,50,50,22,-15,-39,-45,-21,26,70,135,182,216, +146,96,55,119,130,73,122,116,88,99,-50,-10,-34,-25,35,43,20,-39,-41,-7,2,50,43,13,-7, +-4,58,76,105,138,141,97,38,-27,-83,-102,-40,64,171,131,119,141,40,0,-23,-38,76,107,138,38, +-95,-115,-75,-3,32,19,-25,-46,-31,10,-7,-6,-9,10,13,5,32,46,72,39,59,133,94,22,-77, +-32,40,95,200,158,-27,36,-200,-404,-157,-50,-64,47,39,-37,-35,-22,11,21,4,-25,-14,2,29,21, +26,10,21,32,27,52,61,67,63,70,45,194,170,-32,52,73,70,-40,246,240,165,105,46,27,12, +15,7,5,-10,-7,-2,9,8,0,-15,-32,-35,-36,-16,14,38,68,82,95,90,67,15,-9,1,10, +109,162,230,210,14,-13,-66,-12,17,9,13,40,35,27,15,5,2,13,-24,-44,-56,-45,-33,-33,-22, +-6,6,33,70,127,140,163,194,168,158,144,163,134,64,32,140,132,90,102,90,92,77,69,68,59, +42,26,0,-28,-31,-23,-10,-20,-25,-29,-13,1,8,28,29,16,11,3,-5,12,43,89,83,96,119, +132,-18,-32,-26,-29,-43,-34,-24,-16,-22,-26,-27,-34,-41,-46,-43,-43,-44,-37,-25,-22,-23,-18,-15,-13, +-10,-5,2,10,17,23,24,33,32,32,25,3,-23,-27,-45,-40,-41,-48,-51,-56,-51,-40,-32,-26,-26, +-20,-23,-26,-16,-23,-22,-31,-33,-26,-23,-17,-12,-8,-6,-2,4,11,19,27,12,0,-9,-14,-26,-30, +-12,-21,-55,-15,-23,-53,-50,-51,-53,-51,-50,-50,-9,-4,-44,-11,-6,-28,-22,-21,-20,-18,-17,-15,-13, +-11,-10,-9,-8,-3,-8,-11,-16,-20,-19,-35,-27,-43,-38,0,73,-50,-12,52,45,45,46,56,61,62, +-3,-39,74,-2,-38,-45,-35,-39,-38,-34,-32,-27,-32,-34,-39,-34,-37,-46,-45,-41,-26,-31,-13,-43,21, +-33,2,-16,-34,-13,-47,-56,-47,-41,-25,-29,3,0,-19,-29,1,-62,-57,-57,-51,-35,-24,-13,-27,-38, +-54,-44,-48,-65,-61,-46,-6,-13,-12,-45,-32,-25,32,-18,-30,-5,-47,-55,-54,-27,5,-17,16,11,8, +-18,-37,-58,-71,-67,-66,-40,-25,-1,-30,-37,-63,-42,-57,-101,-89,-61,8,-9,37,-13,-8,-6,56,-21, +-24,31,-9,-13,-25,21,33,22,41,39,22,-31,-59,-97,-117,-109,-94,-39,7,43,-8,-51,-95,-66,-73, +-125,-91,-34,74,55,-179,-115,-115,-80,20,30,8,-40,-40,-13,-1,33,29,17,-19,-24,35,38,68,68, +34,25,-4,-62,-101,-84,-52,23,81,18,-45,-88,-153,-159,-133,-163,59,63,85,16,-134,-142,-90,-18,20, +9,-23,-42,-34,4,-22,-25,-33,6,23,-21,-61,-93,-114,-81,-12,93,62,-9,-108,-63,3,58,119,79, +-54,-6,-193,-435,-191,-78,-68,34,27,-29,-38,-26,6,16,2,-28,-24,-18,13,-6,-19,-26,2,16,8, +-44,-107,-144,-149,-97,-43,62,-51,-352,-307,-256,-211,-95,77,242,177,88,43,12,16,9,4,5,-10,-12, +-6,3,1,-7,-22,-38,-39,-48,-61,-67,-57,-34,-2,31,11,-25,-84,-91,-79,-73,-141,-192,-211,-76,-268, +-148,-48,-35,-14,-7,-3,18,16,6,-3,-6,-6,2,-26,-43,-62,-69,-64,-70,-43,-16,-4,11,20,29, +25,24,10,17,-10,-64,-97,-142,-204,-248,30,37,94,67,74,62,55,52,51,51,40,26,0,-28,-39, +-41,-34,-25,-22,-19,-26,-35,-36,-34,-35,-40,-28,-8,13,14,11,-12,11,21,31,35,-54,-60,-57,-59, +-52,-42,-24,-14,-17,-24,-31,-38,-38,-47,-44,-50,-52,-51,-51,-54,-47,-37,-28,-24,-18,-10,-22,-35,-46, +-53,-54,-53,-42,-34,-28,-42,-60,-68,-35,-65,-63,-64,-77,-80,-82,-80,-72,-74,-68,-65,-54,-48,-56,-46, +-33,-38,-28,-29,-26,-22,-18,-12,-18,-23,-29,-35,-43,-53,-57,-62,-63,-63,-58,-64,-64,-47,-11,-72,-52, +-23,-18,-15,-11,-7,-3,1,-45,-63,-1,-41,-55,-48,-45,-44,-41,-39,-38,-35,-39,-42,-45,-49,-51,-55, +-54,-54,-55,-58,-58,52,46,62,24,-21,-68,42,-15,-64,-77,-79,-76,-75,-74,-76,-10,42,-77,-18,21, +57,43,51,54,58,60,63,58,57,53,60,60,52,54,52,48,52,61,62,-35,44,33,1,15,24, +17,11,-1,27,31,27,21,29,35,21,-47,35,44,57,74,90,98,100,82,72,62,80,82,65,70, +67,60,65,65,43,9,21,40,-1,-16,15,-44,-39,-43,7,3,16,24,42,36,12,-11,10,49,60, +87,114,127,136,104,100,86,120,118,75,87,78,63,68,95,51,12,38,79,-6,-23,22,-16,-25,-36, +10,37,30,56,69,35,6,-55,-34,24,60,123,182,218,217,150,106,83,137,143,93,116,108,94,95, +9,-14,-90,-64,-3,25,29,-14,-23,-2,0,24,22,25,-20,-16,33,84,90,134,173,116,78,-16,-54, +-42,63,169,227,190,154,133,58,35,28,2,96,123,147,80,-63,-117,-90,-22,15,11,-15,-34,-32,4, +-7,-1,-13,20,12,26,53,52,102,72,87,137,52,-27,-102,-29,46,81,165,114,-74,7,-121,-406,-247, +-119,-70,28,21,-6,-26,-18,7,23,10,-28,-16,2,15,29,22,26,45,27,22,54,75,93,99,115, +104,205,175,15,82,95,81,40,213,235,197,135,38,42,32,21,7,6,-6,-9,-4,12,9,3,0, +-14,-40,-23,14,40,72,78,82,75,63,26,-35,-40,-15,23,87,132,202,159,39,-33,-116,-38,-2,-13, +-3,31,17,14,2,-3,-3,6,-20,-36,-56,-51,-61,-42,-32,-23,5,24,62,115,125,144,165,154,142, +132,135,112,74,43,127,106,53,74,63,68,62,53,60,58,51,38,16,-14,-23,-24,-16,-18,-15,-19, +0,11,12,27,27,20,26,26,22,41,80,138,124,117,118,113,13,-13,-24,-11,-26,-12,1,14,-4, +-5,-23,-18,-40,-39,-44,-41,-47,-42,-38,-20,-13,-17,-16,-11,-3,4,12,21,30,33,32,40,36,36, +35,20,-30,-34,-76,-43,-57,-61,-54,-60,-47,-40,-45,-30,-26,-24,-34,-32,-21,-23,-38,-25,-30,-25,-23, +-20,-18,-16,-11,-6,0,7,16,24,12,-1,-12,-21,-17,-15,-29,-53,-83,-20,-50,-83,-83,-84,-81,-85, +-86,-85,-42,-14,-79,-43,-21,-14,-15,-12,-11,-10,-8,-7,-5,-3,-2,-1,0,3,-3,-5,-8,-11,-7, +-28,-21,-48,10,55,92,-13,40,82,75,73,65,80,84,81,49,1,92,50,10,-47,-28,-31,-28,-25, +-23,-20,-24,-26,-31,-26,-28,-36,-32,-28,-17,-23,-14,-31,62,-22,32,4,-23,0,-43,-42,-18,-22,-13, +-9,22,18,13,-9,41,-43,-48,-38,-31,-19,-12,-7,-21,-30,-42,-30,-30,-43,-30,-19,7,-3,-18,-35, +3,-9,52,-8,-21,0,-39,-65,-39,-40,11,-13,33,22,27,2,-2,-37,-63,-44,-37,-15,-3,14,-13, +-21,-44,-23,-31,-70,-38,-17,24,7,15,-7,11,-5,64,-27,-44,9,-39,-43,-56,5,23,14,40,41, +56,-20,-26,-74,-96,-61,-36,11,41,52,-1,-40,-71,-35,-28,-65,-6,32,89,66,-167,-70,-55,-52,21, +43,30,0,-17,-7,-6,7,9,32,-28,-41,22,32,96,93,15,0,-56,-86,-111,-97,-26,45,60,15, +-47,-92,-126,-126,-107,-130,-10,55,146,71,-88,-131,-109,-36,0,2,-15,-30,-33,-9,-25,-14,-16,21,48, +13,-46,-56,-65,-39,19,104,36,-44,-137,-62,25,85,134,76,-97,-47,-110,-409,-259,-159,-40,6,14,1, +-24,-22,4,15,3,-31,-19,-20,13,2,12,-1,-10,4,-11,-62,-114,-132,-144,-96,-24,-10,-102,-256,-190, +-136,-124,1,71,225,208,121,46,27,34,13,1,3,-5,-13,-7,7,3,5,-2,-21,-15,-33,-52,-44, +-26,-11,15,33,23,-10,-59,-54,-47,-68,-102,-128,-128,-31,-157,-61,-10,-23,-10,-5,-7,22,16,-5,-9, +-12,-10,-3,-19,-34,-64,-63,-49,-70,-55,-26,-12,11,29,47,49,55,45,38,5,-46,-63,-86,-131,-138, +19,55,103,71,72,56,39,40,37,42,36,36,14,-15,-30,-32,-27,-17,-17,-13,-27,-35,-37,-22,-16, +-17,-3,9,23,26,28,15,19,21,24,28,-34,-29,-10,-13,0,5,17,23,18,1,-5,-25,-26,-41, +-36,-43,-45,-42,-34,-44,-51,-40,-39,-30,-22,-11,-16,-19,-20,-31,-37,-40,-33,-26,-23,-23,-64,-66,-31, +-64,-55,-57,-70,-71,-75,-69,-53,-58,-56,-50,-40,-41,-47,-46,-27,-47,-40,-39,-37,-33,-31,-27,-37,-44, +-51,-55,-59,-65,-65,-66,-67,-66,-55,-62,-38,-17,0,-48,-19,-2,3,5,4,10,14,16,-12,-42,12, +-13,-35,-56,-48,-47,-45,-44,-43,-40,-44,-45,-48,-51,-55,-58,-57,-56,-55,-56,-55,32,29,46,-20,-53, +-46,-2,-48,-57,-70,-70,-60,-62,-59,-56,-43,-2,-50,-47,-21,40,25,31,35,38,39,39,36,35,33, +37,35,29,29,29,32,33,45,31,-56,17,6,-18,-8,2,-6,-19,-31,-6,6,1,3,13,10,6, +-53,10,26,32,52,65,71,66,52,42,35,46,45,31,31,34,44,43,56,20,-30,-8,23,-20,-31, +0,-62,-49,-61,-7,-16,-1,6,24,26,0,-30,-10,30,33,62,82,90,84,65,61,53,69,60,29, +30,36,56,48,86,25,-27,6,67,-27,-41,7,-40,-53,-48,-4,24,29,51,68,42,14,-55,-40,10, +31,93,138,163,140,88,53,43,69,66,33,40,54,93,75,-3,-45,-125,-88,-24,17,36,13,-8,-5, +-9,-1,4,33,-34,-37,1,52,52,86,117,74,55,-30,-44,-14,115,202,196,159,92,23,-11,-12,3, +-16,75,96,130,94,-50,-124,-107,-44,-3,2,-10,-22,-30,-6,-9,1,-16,26,18,30,26,7,50,52, +77,102,8,-68,-129,-39,37,59,98,44,-111,-30,-69,-380,-313,-188,-43,-4,-11,14,-18,-14,3,17,8, +-29,-19,-10,-3,21,9,26,46,15,3,7,8,17,27,70,116,123,54,-72,-15,7,-11,56,93,178, +204,149,46,47,48,27,3,2,-4,-10,-5,7,7,6,10,-1,-33,-15,11,22,53,43,46,37,19, +-23,-79,-67,-38,3,-19,-11,40,20,-29,-73,-116,-57,-26,-26,-13,18,-1,-5,-15,-11,-9,-5,-16,-29, +-55,-61,-81,-57,-47,-37,-4,11,38,63,71,82,83,86,65,47,26,3,-11,-34,57,41,25,35,33, +34,36,30,39,44,46,40,24,-3,-19,-28,-28,-21,-13,-11,0,2,-1,7,11,13,31,43,50,64, +92,125,112,93,76,54,25,1,-18,2,-4,12,26,41,19,18,-10,-4,-31,-32,-39,-38,-47,-44,-48, +-29,-17,-23,-22,-14,-5,4,9,14,20,17,14,17,13,16,22,19,-42,-46,-77,-46,-63,-63,-56,-61, +-49,-50,-59,-46,-39,-42,-47,-41,-36,-31,-47,-26,-27,-26,-23,-23,-22,-21,-20,-19,-18,-17,-14,-13,-17, +-24,-32,-39,-24,-20,-50,-68,-71,-39,-64,-75,-76,-76,-71,-76,-77,-75,-64,-39,-71,-62,-43,-17,-21,-18, +-17,-16,-14,-13,-13,-13,-14,-15,-16,-17,-19,-20,-20,-21,-19,7,9,-9,47,63,44,32,54,46,38, +35,27,38,39,34,61,43,40,59,47,-9,4,6,10,12,14,15,12,10,7,11,10,4,10,12, +15,11,12,12,53,10,48,16,-1,15,-18,-12,10,8,9,17,34,33,43,18,37,2,-5,13,25, +35,37,34,21,14,8,19,23,13,30,34,37,28,10,3,31,14,56,0,-13,6,-37,-63,-25,-35, +7,-4,38,34,39,20,21,-3,-13,13,35,53,59,62,41,35,24,39,37,10,47,52,52,41,26, +17,23,9,66,-26,-54,-9,-61,-66,-66,-13,12,11,41,49,71,5,-2,-33,-28,27,76,114,128,107, +58,24,13,46,61,41,102,110,103,81,-70,-8,-12,-26,13,48,53,40,5,-5,-13,-12,-4,42,-35, +-52,1,25,85,95,32,4,-60,-79,-90,-85,38,111,90,69,18,-27,-40,-40,-40,-39,-32,58,180,113, +-31,-115,-122,-54,-13,1,-9,-18,-29,-18,-15,6,5,32,51,47,6,18,39,48,73,98,6,-74,-146, +-45,50,93,127,59,-124,-62,-54,-353,-312,-218,-1,-20,-13,20,-11,-14,2,11,4,-30,-15,-18,6,15, +38,28,1,-1,-22,-42,-55,-43,-49,-9,64,-6,-67,-77,10,56,32,72,78,152,206,154,62,45,49, +27,1,0,-2,-10,-6,6,6,15,20,2,2,-12,-15,9,38,40,47,43,41,12,-25,-12,-2,-24, +-5,17,74,59,17,23,-16,-23,-11,-5,-6,25,12,-10,-14,-14,-11,-6,-12,-24,-59,-53,-43,-56,-55, +-36,-16,13,44,75,88,105,111,88,59,33,33,27,4,23,28,62,69,59,53,43,26,27,25,32, +31,40,26,1,-16,-20,-19,-16,-17,-12,-17,-15,-16,10,22,27,40,41,43,52,70,87,67,55,44, +37,14,17,33,34,42,45,52,57,46,28,20,-3,-14,-28,-27,-32,-37,-31,-20,-26,-36,-31,-36,-26, +-18,-9,0,12,25,18,11,8,7,10,12,19,-47,-44,-37,-45,-41,-43,-48,-49,-50,-43,-32,-33,-35, +-31,-28,-33,-32,-37,-27,-44,-42,-39,-37,-35,-34,-32,-39,-45,-47,-47,-43,-41,-40,-41,-44,-45,-36,-40, +-15,-7,-20,-18,-5,-14,-12,-12,-16,-13,-12,-12,-3,-18,-13,-6,-17,-45,-37,-37,-36,-35,-34,-32,-33, +-33,-34,-35,-37,-38,-38,-37,-37,-36,-36,-4,-1,1,-38,-33,20,-35,-37,0,-9,-10,-1,0,4,8, +-31,-31,21,-29,-37,-4,-6,-5,0,1,1,0,-2,-2,-4,-4,-6,-11,-10,-7,4,-1,11,-13,-24, +-16,-6,-23,-28,-16,-35,-46,-44,-35,-19,-22,-2,4,-7,-8,-19,-24,-10,-9,9,17,21,12,4,-4, +-9,-7,-10,-19,-16,-6,21,10,21,-14,-40,-26,15,-27,-36,-14,-66,-62,-61,-32,-23,-22,1,8,15, +-5,-30,-32,-16,-12,12,24,28,15,9,4,0,-5,-18,-36,-30,-8,42,20,47,-4,-38,-21,45,-43, +-58,-12,-65,-76,-53,-19,4,17,38,53,48,13,-32,-45,-28,-14,34,64,76,43,12,-14,-16,-19,-27, +-39,-23,15,92,55,-46,-62,-100,-73,-17,27,47,45,6,-12,-18,-20,-8,39,-44,-59,-29,-1,13,21, +10,-5,-21,-64,-59,-29,99,158,103,70,-11,-106,-99,-81,-56,-50,17,45,111,91,-40,-129,-126,-66,-17, +0,-7,-12,-27,-20,-12,4,-10,28,33,33,-12,-36,-19,22,54,53,-29,-96,-146,-46,30,45,40,-18, +-130,-65,-60,-334,-332,-225,1,-32,-39,17,-11,-10,1,8,3,-27,-23,-25,-17,4,0,10,19,-4,-25, +-60,-87,-92,-83,-14,95,-8,-115,-189,-136,-86,-81,25,-25,91,182,148,71,42,51,33,2,0,-1,-9, +-6,-2,2,10,17,7,-13,-10,-8,-8,15,4,7,1,-13,-49,-88,-69,-48,-32,-111,-133,-102,-91,-99, +-80,-66,-58,-40,-23,-13,7,-8,-18,-25,-17,-13,-13,-11,-22,-53,-65,-79,-67,-57,-44,-17,1,15,18, +24,27,12,16,-14,-45,-80,-101,-106,-109,-26,-20,15,8,16,10,12,10,16,25,30,35,25,5,-14, +-28,-36,-25,-17,-10,-10,-13,-18,-10,0,11,36,56,73,77,82,78,71,48,18,-13,28,17,6,19, +26,36,47,58,42,36,14,8,-12,-21,-27,-31,-41,-40,-45,-38,-30,-31,-29,-21,-13,-5,-2,1,6, +-2,-6,-9,-8,-3,10,18,-50,-51,-50,-43,-52,-49,-48,-51,-49,-55,-60,-58,-53,-58,-53,-46,-50,-41, +-44,-32,-27,-28,-26,-26,-26,-24,-29,-34,-40,-45,-49,-54,-49,-49,-50,-53,-36,-34,-56,-55,-33,-51,-52, +-37,-38,-38,-34,-37,-37,-35,-60,-56,-35,-56,-54,-32,-34,-33,-31,-30,-29,-28,-30,-32,-34,-36,-39,-43, +-42,-41,-39,-37,-40,39,35,37,47,25,-23,49,25,-17,-26,-28,-30,-28,-27,-31,29,52,-28,25,45, +34,33,39,44,46,46,45,43,43,42,43,43,40,44,44,41,40,40,47,8,33,38,11,11,16, +2,6,14,21,21,25,28,34,47,32,4,36,37,55,73,81,80,68,59,53,53,59,62,57,70, +69,58,53,44,36,30,22,37,0,-13,2,-44,-55,-28,-23,-8,-2,26,35,36,26,19,18,37,59, +93,107,109,95,85,81,82,84,84,70,98,93,73,65,48,36,14,15,51,-27,-58,-25,-74,-82,-59, +-29,-2,9,40,56,62,30,6,4,42,94,162,191,192,144,107,81,89,103,113,107,151,142,107,82, +49,33,-1,-10,-1,47,71,72,21,-6,-18,-22,-10,45,-39,-57,-28,6,34,55,45,11,-38,-62,-58, +-53,105,174,127,121,78,27,32,34,20,51,-16,57,163,125,13,-106,-132,-70,-19,3,-5,-8,-24,-25, +-3,23,17,37,41,69,56,73,119,122,111,68,-30,-98,-135,-20,65,77,84,15,-130,-62,-39,-282,-324, +-234,20,-36,-39,20,-5,-6,1,7,3,-24,-16,-17,-9,19,38,35,15,-6,-31,-17,5,36,47,86, +154,21,-22,45,133,177,155,84,70,54,170,167,83,54,50,41,5,0,0,-6,-5,0,7,20,33, +21,7,6,26,54,87,78,64,36,39,15,-8,4,18,17,72,128,220,111,131,55,-46,-34,-20,-10, +-3,20,2,-11,-17,-14,-10,-7,-5,-16,-46,-45,-50,-43,-48,-42,-17,12,49,86,104,123,137,111,89, +86,91,90,88,118,24,38,11,28,23,23,16,13,17,22,25,36,31,14,-2,-10,-17,-20,-20,-17, +-5,9,10,38,53,61,77,76,73,83,107,144,112,87,58,34,65,57,56,63,62,65,67,73,57, +48,35,21,-2,-10,-17,-20,-31,-25,-18,-13,-17,-21,-26,-19,-12,-5,14,35,57,57,53,54,47,48, +52,61,-25,-21,-45,-22,-27,-29,-23,-24,-22,-21,-23,-19,-23,-24,-28,-29,-21,-27,-33,-32,-35,-30,-29, +-27,-27,-27,-29,-30,-28,-24,-16,-8,-8,-10,-15,-20,-14,-12,-8,-20,-49,-2,-14,-39,-42,-45,-48,-51, +-53,-55,-20,-10,-51,-21,-13,-24,-22,-21,-21,-20,-20,-19,-17,-15,-15,-13,-13,-11,-14,-14,-14,-12,-16, +-25,-17,-33,-17,16,69,-32,5,52,48,46,48,54,58,59,11,-23,73,15,-16,-35,-23,-26,-21,-20, +-20,-22,-23,-23,-24,-27,-29,-32,-28,-24,-12,-19,-13,-33,27,-28,0,-11,-31,-21,-47,-50,-32,-38,-27, +-25,6,7,-3,-6,27,-35,-31,-26,-15,-9,-8,-19,-22,-28,-30,-34,-37,-40,-30,-17,10,-7,-7,-27, +-17,-21,17,-19,-28,-23,-55,-69,-47,-51,-19,-34,9,4,9,0,-8,-33,-43,-32,-14,-5,-5,-19,-18, +-22,-24,-44,-55,-63,-39,-13,35,7,5,-17,-21,-30,21,-45,-66,-33,-84,-91,-55,-32,-15,-2,26,36, +51,13,6,-31,-43,-22,12,31,31,-6,-21,-40,-35,-58,-62,-60,-18,26,92,43,-53,-36,-24,-21,7, +49,65,76,21,-12,-19,-27,-14,43,-44,-71,-49,-47,-16,-32,-79,-74,-105,-98,-80,-60,58,93,15,-6, +-76,-162,-125,-101,-88,-47,-48,0,99,84,-18,-123,-144,-80,-25,2,-4,-5,-23,-31,-11,10,5,29,49, +45,-20,-31,-36,23,43,11,-54,-109,-141,-35,38,47,9,-53,-129,-86,-68,-262,-297,-222,25,-44,-49,7, +-8,-6,0,3,0,-22,-24,-36,-23,-11,0,-8,-16,-22,-51,-100,-136,-144,-132,-59,70,-112,-224,-225,-159, +-81,-50,-6,-67,12,139,135,92,32,39,36,5,1,3,-6,-7,-9,0,15,25,15,13,-2,-15,-16, +-1,-5,-7,-15,-19,-43,-55,-42,-34,-52,-105,-125,-107,-94,-89,-35,-2,-41,-38,-11,-6,1,-6,-20,-23, +-18,-13,-13,-5,-14,-43,-58,-61,-65,-59,-42,-27,-3,10,7,14,14,-5,-13,-47,-83,-112,-125,-129,-100, +-77,-48,10,-3,11,1,-2,0,0,8,11,25,22,12,-7,-20,-33,-27,-25,-16,-20,-21,-22,-5,11, +24,49,68,87,81,69,38,34,13,-22,-52,35,39,42,42,56,57,61,65,58,48,39,21,10,-4, +-11,-21,-31,-30,-30,-37,-39,-35,-34,-27,-21,-14,-9,-4,5,-3,-5,-10,-5,1,14,29,-43,-42,-17, +-32,-29,-27,-33,-32,-41,-47,-46,-54,-55,-59,-48,-44,-50,-44,-33,-38,-30,-30,-29,-28,-27,-26,-33,-41, +-49,-55,-60,-66,-58,-52,-49,-48,-38,-40,-38,-23,2,-41,-22,2,1,1,-1,0,0,-1,-34,-51,-2, +-31,-44,-42,-41,-41,-39,-39,-39,-37,-40,-42,-44,-45,-47,-51,-48,-47,-44,-42,-50,42,38,53,15,-22, +-53,28,-18,-54,-62,-63,-58,-61,-60,-60,-16,26,-56,-18,12,47,36,43,48,49,49,46,46,46,47, +45,44,43,46,46,43,43,44,47,-34,29,8,-5,5,0,3,0,-6,10,12,9,11,21,26,26, +-25,38,48,59,78,85,83,66,62,57,61,58,58,54,63,63,56,49,55,42,5,11,8,-8,-18, +-15,-53,-51,-44,-21,-25,-13,7,22,18,16,1,15,52,62,97,108,107,81,83,81,92,75,71,67, +84,83,71,61,52,30,-12,2,21,-30,-57,-42,-83,-91,-48,-40,-16,0,34,53,41,42,5,20,71, +102,168,189,183,124,104,86,109,90,87,90,115,114,97,63,117,42,-5,1,-6,45,81,91,32,-5, +-15,-23,-12,42,-40,-58,-57,-26,-34,-17,18,-9,-35,-56,-38,-22,136,187,121,118,77,19,42,49,31, +90,-1,37,105,103,33,-104,-140,-81,-24,4,-2,-1,-20,-28,5,29,19,33,29,73,74,82,126,139, +108,20,-66,-114,-113,3,66,47,15,-46,-123,-60,-53,-204,-283,-207,10,-38,-49,3,-5,-1,-1,3,2, +-17,-21,-23,-26,8,14,14,16,-14,-40,-19,12,41,74,119,181,15,-33,44,120,169,175,44,39,-22, +110,145,91,42,35,43,9,2,4,-2,-5,-8,5,20,36,31,9,18,48,66,91,78,51,12,13, +-8,-15,-10,8,25,84,137,208,89,126,33,-61,-44,-29,-13,-1,4,-7,-10,-17,-14,-10,-7,0,-9, +-29,-41,-60,-39,-42,-42,-18,6,37,64,80,90,98,78,60,61,58,55,68,100,-11,-17,-41,-10,-6, +1,6,1,9,11,14,24,27,21,6,-7,-20,-27,-25,-23,-1,17,22,45,60,70,90,96,97,101, +114,139,111,81,41,2,88,73,59,67,61,66,65,70,56,56,42,39,12,9,-6,-11,-27,-22,-23, +-11,-7,-16,-19,-14,-9,-5,15,35,56,61,63,68,61,62,70,77,-7,-5,-42,-6,-18,-19,-9,-11, +-9,-14,-27,-22,-24,-31,-37,-32,-24,-24,-39,-23,-26,-22,-20,-20,-20,-21,-17,-15,-11,-8,-1,7,8, +7,2,-4,-3,3,-16,-35,-56,-4,-29,-50,-55,-59,-59,-66,-70,-74,-42,-18,-67,-41,-23,-11,-14,-13, +-13,-13,-12,-12,-10,-8,-6,-4,-2,0,-2,-3,-2,-1,-9,-16,-10,-29,19,50,65,0,39,58,57, +55,49,58,60,57,43,9,67,47,20,-30,-14,-16,-12,-11,-11,-13,-13,-13,-13,-17,-18,-20,-14,-10, +-3,-11,-12,-17,52,-14,12,4,-16,-15,-35,-29,-8,-17,-15,-12,17,16,15,8,49,-13,-17,-7,1, +6,3,-9,-11,-14,-10,-19,-20,-21,-3,7,18,1,-10,-10,16,-1,17,-5,-13,-27,-40,-67,-35,-54, +-13,-34,18,9,9,12,16,-12,-30,-11,5,14,13,-2,2,-2,3,-25,-31,-34,6,24,41,17,-15, +-8,2,-22,-1,-37,-64,-55,-93,-95,-55,-42,-28,-21,19,26,45,20,36,1,-13,21,50,64,55,14, +4,-8,7,-25,-27,-18,46,75,89,41,3,25,57,38,31,69,84,98,38,-3,-10,-21,-13,42,-37, +-68,-63,-71,-38,-59,-109,-103,-148,-109,-85,-74,36,56,-20,-26,-66,-115,-71,-55,-65,7,-83,-21,87,76, +17,-106,-148,-84,-30,1,-2,0,-19,-34,-6,19,22,29,53,63,14,24,18,62,51,-11,-72,-112,-115, +-7,55,51,-3,-65,-116,-87,-79,-175,-227,-187,12,-38,-38,-10,-5,0,-1,2,1,-15,-22,-39,-24,-17, +3,-20,-36,-33,-64,-94,-112,-110,-82,-27,68,-138,-212,-126,-53,26,69,-15,-18,-27,81,104,90,18,18, +31,8,1,4,-1,-7,-12,0,20,32,23,32,12,3,10,18,21,10,-11,-6,-17,-8,-7,-4,-36, +-5,8,17,6,1,33,35,-18,-21,2,2,-2,-2,-12,-12,-15,-11,-8,1,-6,-27,-41,-38,-52,-49, +-36,-28,0,18,26,34,35,26,0,-28,-56,-65,-66,-63,-11,-81,-47,-4,-7,5,-1,-6,-3,-5,-2, +-3,14,18,17,3,-7,-21,-27,-31,-25,-24,-16,-8,18,37,50,70,81,90,80,61,31,18,1,-29, +-54,47,58,71,62,73,68,65,62,62,53,56,34,28,14,5,-9,-21,-18,-13,-24,-33,-29,-33,-27, +-23,-19,-8,4,19,18,20,19,22,26,34,46,-18,-14,5,-12,-6,-6,-13,-11,-23,-28,-25,-35,-41, +-43,-35,-35,-37,-38,-25,-39,-34,-32,-30,-28,-27,-27,-32,-36,-39,-41,-42,-41,-35,-28,-24,-21,-26,-27, +-10,4,10,-16,5,15,13,12,7,8,8,5,-8,-29,4,-8,-24,-41,-37,-38,-37,-37,-37,-36,-37, +-36,-37,-36,-36,-37,-35,-34,-32,-29,-42,18,18,31,-19,-40,-29,-9,-37,-41,-45,-46,-38,-41,-39,-37, +-36,-11,-29,-35,-20,25,15,19,23,24,24,19,20,21,24,18,16,15,18,20,23,20,23,16,-40, +3,-20,-18,-12,-22,-13,-19,-30,-15,-8,-16,-5,5,-2,9,-24,14,27,30,44,50,48,30,30,27, +34,21,17,14,23,28,33,23,37,21,-19,-8,-14,-15,-22,-36,-57,-53,-60,-30,-34,-32,-8,2,-3, +2,-15,-1,27,29,55,63,61,32,42,41,56,21,12,13,28,39,53,34,31,8,-33,-21,-14,-34, +-54,-60,-85,-91,-42,-44,-28,-17,23,37,19,38,10,21,54,64,109,124,113,57,52,45,74,26,9, +14,38,60,79,35,116,36,4,16,9,51,84,96,42,3,-5,-15,-9,36,-34,-55,-79,-65,-88,-87, +-50,-59,-68,-69,-39,-8,112,136,61,54,18,-38,-3,11,1,77,-9,-1,38,62,34,-100,-138,-82,-28, +0,-1,1,-17,-28,4,24,15,25,26,64,60,56,75,102,68,-27,-92,-119,-89,17,56,20,-47,-98, +-107,-64,-83,-135,-206,-158,-23,-28,-37,-19,-4,2,-2,1,3,-10,-24,-32,-36,-12,-17,-22,-4,-27,-52, +-47,-33,-24,31,81,134,-41,-96,-27,19,72,120,-20,16,-39,43,82,74,16,10,30,9,2,4,1, +-6,-12,1,16,33,32,15,23,44,46,54,45,21,-15,-19,-36,-31,-33,-12,12,48,69,79,32,39, +-4,-37,-37,-26,-11,-1,-11,-10,-7,-10,-11,-9,-7,3,-2,-13,-36,-60,-42,-37,-36,-19,-2,16,25, +30,28,21,8,-10,-19,-36,-40,-18,13,-58,-72,-64,-39,-25,-17,-5,-7,-1,-2,1,8,16,21,9, +-6,-23,-31,-30,-28,-10,6,15,31,47,59,82,97,104,96,86,74,57,32,-5,-43,72,63,47,52, +49,52,51,53,47,54,45,47,26,24,5,-4,-23,-20,-26,-16,-9,-17,-18,-15,-11,-10,5,17,32, +38,44,51,48,49,58,62,5,6,-18,5,-8,-7,-2,-4,-5,-17,-32,-31,-32,-40,-42,-34,-32,-27, +-39,-23,-22,-20,-18,-19,-18,-19,-14,-12,-9,-7,-5,-1,2,5,6,4,-5,2,-25,-36,-34,-16,-33, +-35,-40,-43,-42,-48,-52,-55,-50,-33,-50,-48,-35,-14,-19,-18,-18,-18,-17,-18,-16,-15,-13,-11,-9,-8, +-8,-8,-7,-5,-19,11,11,4,41,45,15,31,40,18,18,15,8,14,15,10,41,34,15,42,39, +2,10,12,15,17,17,13,14,14,17,11,11,9,17,19,18,14,8,16,34,9,14,11,2,-8, +-10,-1,8,8,4,3,19,21,28,22,35,21,17,31,37,42,38,23,22,21,30,18,18,17,38, +42,34,22,11,22,34,16,9,6,-3,-31,-32,-56,-36,-43,-14,-30,17,13,8,18,26,15,11,30, +48,59,57,38,42,40,54,22,20,19,64,68,51,36,-9,11,10,-11,-20,-24,-52,-73,-87,-87,-51, +-44,-32,-34,15,21,30,31,47,36,44,81,114,127,111,61,52,49,78,39,36,42,109,117,80,40, +95,86,101,75,45,77,95,102,51,11,3,-8,-7,35,-23,-52,-72,-76,-62,-70,-90,-96,-139,-96,-67, +-51,46,58,-3,1,-6,-17,15,21,-4,83,-73,-20,62,63,50,-83,-134,-77,-31,-3,-3,2,-15,-31, +1,26,30,25,43,75,66,90,95,106,61,-22,-85,-109,-79,26,69,47,-14,-71,-98,-72,-87,-96,-155, +-139,-30,-19,-15,-23,0,4,-1,1,5,-6,-18,-33,-25,-15,1,-25,-36,-36,-62,-57,-43,-29,26,56, +84,-101,-121,30,91,148,197,-12,73,-11,20,49,58,6,-1,19,7,-1,1,1,-5,-10,2,21,37, +32,38,28,36,48,51,54,35,1,8,2,20,12,22,14,114,156,156,122,101,77,33,1,1,8, +5,-4,0,-3,-2,-7,-7,-3,6,2,-8,-20,-23,-33,-33,-27,-21,4,27,49,54,56,59,24,5, +-4,4,16,31,89,-51,-37,-32,-17,-9,-4,-6,-3,-4,-5,-8,3,12,19,12,5,-10,-26,-34,-31, +-21,-4,11,41,61,72,86,89,86,74,59,43,19,3,-18,-35,54,62,73,64,66,61,53,47,51, +50,59,45,37,30,14,1,-13,-9,-2,-8,-17,-18,-25,-21,-19,-17,1,19,39,44,51,56,53,52, +52,56,16,21,15,13,15,11,10,9,2,-2,-4,-10,-18,-20,-20,-22,-20,-26,-23,-34,-33,-29,-27, +-26,-25,-25,-24,-22,-18,-14,-7,1,4,9,12,15,-6,-4,10,11,-4,8,12,2,-2,-4,-9,-10, +-13,-17,0,-7,-16,-4,-9,-28,-25,-26,-26,-26,-26,-27,-24,-21,-19,-16,-14,-11,-10,-10,-9,-7,-23, +-11,-6,-6,-27,-18,20,-29,-22,2,4,3,6,8,11,13,-21,-29,24,-17,-28,-10,-9,-10,-7,-6, +-7,-11,-9,-9,-5,-13,-16,-17,-12,-9,-2,-7,-5,-17,-11,-22,-28,-17,-23,-36,-29,-32,-37,-29,-22, +-32,-10,-5,-16,-5,3,-11,-2,-3,4,9,6,-10,-8,-9,0,-19,-25,-27,-14,-4,10,-4,6,-2, +-22,-18,-20,-13,-18,-51,-50,-55,-67,-44,-33,-47,-11,-12,-14,-6,-14,-13,-8,-7,5,13,10,-15,-2, +-4,14,-32,-44,-42,-17,3,31,8,-4,-13,-36,-39,-42,-33,-48,-75,-78,-80,-41,-39,-33,-35,8,14, +6,26,22,19,21,24,43,53,37,-10,-7,-3,30,-35,-58,-53,-13,25,60,13,80,39,39,43,36, +65,83,88,48,12,7,-3,-3,27,-19,-46,-87,-95,-110,-124,-121,-113,-119,-89,-50,-5,60,54,-18,-28, +-52,-87,-52,-32,-31,49,-38,-36,-8,25,29,-87,-122,-73,-29,-4,-4,2,-12,-27,-1,15,12,16,29, +52,39,33,20,49,17,-57,-105,-114,-65,27,48,13,-75,-120,-90,-70,-105,-77,-127,-112,-61,-12,-11,-29, +2,4,0,0,5,-2,-20,-37,-38,-29,-35,-49,-32,-39,-60,-76,-84,-92,-21,23,53,-115,-166,-91,-67, +-10,72,-64,19,7,-15,-2,32,-10,-7,11,5,-2,1,1,-4,-11,-1,13,29,29,26,26,29,18, +9,6,-6,-29,-36,-48,-32,-40,-18,9,20,3,-55,-8,-37,-16,15,-9,-7,-2,-2,-16,-5,-2,-1, +-5,-6,-5,4,4,1,-25,-42,-41,-31,-25,-16,-5,0,-4,-10,-22,-41,-53,-73,-94,-114,-110,-86,-50, +-87,-94,-56,-49,-31,-25,-14,-12,-9,-10,-10,-5,4,15,9,-3,-21,-30,-33,-29,-23,-14,-1,14,31, +44,65,81,92,72,41,-5,-13,-29,-52,-73,33,36,33,31,35,35,32,30,35,43,46,44,38,34, +15,1,-15,-15,-20,-21,-18,-20,-21,-19,-16,-15,-6,0,9,12,20,25,25,24,28,30,15,16,19, +15,9,9,8,6,0,-12,-22,-28,-30,-36,-34,-29,-33,-29,-32,-27,-22,-22,-20,-20,-20,-20,-17,-15, +-14,-14,-15,-14,-8,-2,4,9,-11,-7,-21,-18,0,-20,-18,-4,-8,-9,-9,-11,-14,-15,-35,-37,-17, +-36,-38,-24,-26,-27,-26,-27,-26,-27,-26,-26,-25,-23,-21,-21,-19,-17,-16,-14,-32,30,27,34,31,9, +-34,36,11,-32,-31,-33,-37,-35,-34,-38,10,33,-36,9,29,31,27,32,35,36,36,32,33,34,38, +32,31,30,37,37,32,31,25,37,-6,21,2,6,10,-9,8,13,4,18,13,5,9,15,24,25, +3,42,44,54,62,66,61,44,44,44,58,43,41,39,58,58,40,34,33,43,24,17,-6,7,-1, +-40,-33,-44,-52,-29,-22,-28,3,8,2,14,17,29,45,57,77,87,84,59,65,65,89,51,50,50, +87,83,52,45,8,22,-3,-9,-36,-16,-38,-80,-69,-70,-41,-37,-29,-39,7,15,8,36,37,57,86, +114,148,160,139,83,74,81,124,75,63,67,120,117,62,32,164,115,97,82,49,75,91,87,53,19, +12,4,1,24,-6,-28,-78,-74,-88,-81,-64,-79,-102,-73,-36,3,72,74,24,32,43,55,67,71,52, +134,-38,-13,20,39,63,-61,-107,-64,-27,-6,-7,0,-9,-24,3,24,26,18,25,71,99,122,136,116, +52,-35,-100,-106,-41,52,71,35,-34,-84,-83,-55,-86,-35,-102,-98,-78,-1,4,-25,7,5,2,1,5, +2,-14,-25,-28,-13,-9,-27,-25,-36,-52,-21,14,35,116,125,87,-55,-39,124,162,198,253,-8,128,46, +-33,-25,1,-6,-8,6,2,-4,-1,0,-2,-7,2,17,38,37,34,40,61,69,66,62,41,6,5, +-2,18,6,34,73,175,206,178,152,137,74,17,19,20,6,1,-8,0,2,3,-1,-3,0,7,8, +10,-3,-17,-17,-17,-18,-8,6,26,51,50,49,54,22,12,15,30,54,81,129,-20,-35,-58,-33,-27, +-14,-7,-7,-3,-6,-8,-5,4,16,16,10,-4,-24,-32,-32,-17,3,20,48,66,76,86,84,74,64, +53,46,17,1,-11,-20,44,44,47,45,41,38,31,26,31,40,48,48,39,40,20,9,-6,-3,-2, +-1,-3,-8,-14,-12,-10,-10,10,28,48,56,63,71,63,56,49,46,40,44,19,33,27,23,28,26, +24,19,10,9,3,-1,-9,-10,-6,-14,-25,-23,-25,-22,-20,-19,-19,-20,-12,-6,3,11,21,33,33, +36,38,40,10,15,13,2,-22,18,3,-18,-22,-25,-29,-32,-36,-39,-9,2,-39,-14,-6,-12,-12,-12, +-13,-13,-13,-14,-10,-6,-3,2,5,10,9,10,10,11,-6,-23,-16,-27,-8,19,49,-21,10,35,41, +39,34,42,44,43,11,-18,54,16,-8,-29,-19,-21,-19,-19,-19,-22,-21,-21,-16,-25,-27,-29,-22,-18, +-12,-18,-20,-27,24,-27,-18,-5,-19,-33,-29,-26,-25,-23,-21,-29,-5,-5,-9,-6,31,-15,-15,-13,-11, +-9,-13,-26,-25,-23,-11,-32,-38,-39,-20,-10,0,-14,-13,-9,-5,-13,-14,-3,-9,-57,-35,-53,-64,-50, +-25,-49,-7,-16,-13,-6,1,-9,-24,-17,-12,-6,-9,-28,-19,-20,1,-49,-57,-56,-18,1,18,-1,-29, +-18,-22,-42,-54,-26,-39,-80,-63,-61,-36,-29,-29,-45,-6,-8,1,13,35,26,9,18,21,25,5,-35, +-35,-21,20,-49,-70,-63,-4,31,44,3,62,64,84,73,65,78,77,70,47,18,14,6,4,18,0, +-27,-82,-103,-103,-123,-154,-141,-151,-97,-52,5,20,-7,-70,-74,-79,-80,-60,-39,-24,48,-65,-51,-22,3, +31,-63,-96,-56,-23,-6,-7,-1,-6,-23,-5,9,13,9,31,45,33,37,9,18,-16,-66,-108,-102,-36, +38,48,23,-70,-114,-77,-71,-97,-23,-70,-80,-86,1,11,-23,12,3,4,0,5,4,-12,-32,-31,-32, +-32,-54,-51,-46,-59,-80,-93,-101,-21,2,-12,-157,-182,-74,-58,-3,85,-60,42,86,-54,-82,-31,-25,-11, +-3,1,-5,-2,-1,-2,-7,-2,11,28,28,39,32,21,7,-11,-12,-14,-24,-33,-39,-17,-23,4,38, +34,-12,-109,-13,-39,13,69,35,22,8,-3,-12,2,3,5,2,-1,-2,6,10,13,-5,-13,-28,-21, +-11,-9,-2,-3,-8,-19,-34,-54,-73,-93,-115,-121,-99,-78,-35,-76,-75,-37,-44,-28,-25,-19,-14,-12,-12, +-14,-11,-5,7,8,2,-12,-24,-32,-29,-31,-27,-13,8,26,38,51,59,64,44,7,-50,-58,-66,-71, +-70,-5,8,21,15,24,20,16,10,24,29,43,37,43,39,23,8,-3,-5,-8,-20,-22,-18,-20,-17, +-15,-13,-6,-1,6,5,9,11,10,5,-1,0,25,28,46,24,27,26,20,20,11,3,1,-9,-13, +-16,-13,-14,-22,-24,-20,-28,-22,-23,-21,-20,-20,-20,-18,-17,-15,-15,-14,-13,-7,1,9,18,-11,-10, +-5,8,24,-9,5,20,19,18,16,17,17,15,-7,-23,9,-12,-24,-28,-27,-28,-28,-28,-28,-28,-27, +-27,-26,-24,-23,-23,-19,-17,-15,-14,-31,26,23,38,2,-25,-47,14,-20,-52,-49,-51,-51,-51,-50,-51, +-23,7,-47,-23,0,34,24,29,31,32,31,27,28,29,35,27,25,25,30,30,26,26,24,30,-35, +12,-17,-6,4,-18,8,8,-13,8,5,-6,-7,0,6,13,-19,34,42,46,55,57,52,36,34,36, +54,34,29,28,41,42,30,25,35,39,0,4,-22,1,-5,-50,-37,-36,-69,-24,-31,-32,-16,-7,-5, +0,-2,23,46,50,68,74,69,44,50,51,82,37,32,34,60,60,39,35,14,15,-24,-20,-49,-14, +-27,-75,-47,-48,-27,-25,-21,-37,-4,1,-9,29,20,56,88,100,126,131,108,54,46,62,118,55,33, +37,74,76,38,15,175,107,69,70,53,68,74,58,42,18,13,8,7,12,8,-5,-78,-73,-106,-97, +-65,-78,-73,-54,-7,60,90,73,22,27,41,58,52,64,77,140,-11,-12,-23,9,54,-45,-76,-45,-16, +-8,-6,-3,-4,-16,0,15,15,8,8,53,92,105,114,80,17,-56,-114,-98,-9,59,58,19,-64,-104, +-73,-47,-70,14,-64,-66,-101,9,12,-14,13,2,4,2,3,6,-9,-17,-30,-13,-20,-30,-19,-36,-42, +-13,23,44,136,132,54,-44,-21,118,131,156,214,-10,106,114,-67,-100,-67,-18,-7,-3,-1,-4,-2,-2, +-2,-4,0,9,32,37,30,44,63,59,48,36,20,-4,-14,-22,-7,-10,34,115,140,121,61,73,94, +44,22,43,35,4,-4,-8,1,4,3,3,1,0,8,13,23,10,-11,-5,-5,-8,4,7,15,27, +17,10,7,-13,-21,-16,-3,28,60,90,-10,-42,-67,-48,-41,-26,-12,-13,-5,-7,-8,-11,-4,7,13, +8,-4,-22,-28,-29,-16,-2,12,33,48,57,65,65,56,47,36,22,-1,-16,-19,-20,15,12,9,15, +11,12,8,6,13,27,33,41,36,42,23,14,1,0,-7,-4,3,-3,-4,-3,0,2,16,28,41, +46,49,55,43,33,21,16,47,49,23,40,30,27,34,32,34,27,15,17,14,9,-1,-1,0,-5, +-23,-13,-14,-13,-11,-11,-11,-13,-3,5,14,21,30,40,40,42,43,45,15,21,4,-9,-22,12,-8, +-23,-27,-29,-29,-34,-37,-38,-18,-1,-41,-24,-12,0,-4,-3,-4,-4,-4,-5,-1,2,5,9,12,16, +15,16,16,16,2,-12,-8,-19,18,38,37,5,31,31,38,36,25,35,36,32,29,6,40,34,17, +-19,-9,-10,-8,-8,-8,-10,-9,-10,-4,-13,-15,-16,-8,-5,-4,-8,-14,-10,34,-13,-3,6,-5,-21, +-13,-6,-6,-4,-8,-12,2,0,7,3,37,2,-3,4,4,3,-3,-13,-14,-11,6,-15,-18,-18,3, +10,5,-4,-10,5,16,1,-7,7,0,-52,-22,-43,-57,-44,-18,-39,-5,-14,-4,0,15,7,-10,3, +8,12,8,-5,-3,-4,23,-25,-28,-27,18,28,19,9,-31,-7,-6,-32,-55,-15,-27,-72,-42,-38,-25, +-15,-19,-42,-15,-21,-1,7,39,39,26,46,49,46,20,-16,-24,-3,49,-15,-31,-21,46,61,30,4, +84,97,112,91,81,81,65,45,37,15,14,7,9,10,16,-2,-68,-89,-83,-97,-137,-132,-140,-82,-31, +35,23,-16,-70,-66,-51,-21,-24,-3,28,82,-68,-41,-18,-5,37,-39,-66,-34,-11,-8,-6,-5,-2,-14, +-8,6,15,3,22,40,46,64,42,18,-26,-67,-109,-86,-4,47,48,33,-56,-97,-68,-64,-62,33,-31, +-57,-87,9,18,-6,12,2,5,2,2,6,-3,-20,-21,-21,-14,-37,-50,-44,-50,-56,-50,-38,40,32, +-37,-140,-125,22,39,80,143,-20,59,145,-71,-139,-94,-29,-7,-7,-1,-5,-3,-3,-2,-3,-2,7,26, +30,45,39,27,18,-2,-6,-7,-12,-18,-19,1,7,42,93,69,11,-77,2,26,64,102,80,50,16, +-3,-4,5,4,5,4,2,1,7,14,23,17,16,-6,-6,1,2,7,7,9,-6,-17,-28,-54,-70, +-81,-63,-26,-6,33,-34,-34,-24,-34,-25,-21,-19,-14,-10,-9,-12,-11,-8,0,8,8,-2,-18,-28,-26, +-31,-27,-14,11,28,37,41,40,34,22,-3,-46,-59,-64,-55,-39,-25,-11,10,5,15,10,6,-1,14, +18,35,28,39,39,27,14,8,5,4,-12,-15,-9,-11,-7,-5,0,7,14,21,18,16,15,8,-1, +-16,-17,35,38,53,32,37,34,30,31,24,23,26,18,12,13,10,5,-2,-10,-8,-21,-17,-17,-16, +-15,-14,-15,-12,-10,-6,-2,3,8,11,17,23,30,0,-1,14,24,24,9,21,24,24,23,20,22, +22,21,16,1,13,8,-4,-18,-15,-16,-16,-16,-17,-17,-15,-13,-12,-10,-9,-7,-5,-4,-2,-2,-15, +6,7,17,-21,-32,-21,-13,-30,-33,-29,-29,-29,-28,-26,-24,-34,-20,-17,-30,-22,13,6,8,11,10, +9,6,7,7,14,4,3,2,7,8,8,8,8,5,-33,-8,-28,-13,-7,-27,-3,-7,-29,-11,-10, +-20,-18,-13,-10,-3,-18,10,20,18,25,23,18,6,4,8,27,4,-3,-3,9,13,10,6,20,19, +-18,-11,-28,-4,-9,-55,-35,-31,-73,-27,-33,-35,-28,-24,-10,-12,-15,6,20,20,32,32,27,7,12, +13,47,-4,-11,-7,15,24,22,16,5,0,-36,-34,-56,-14,-18,-60,-27,-27,-11,-10,-13,-30,-15,-17, +-18,12,9,39,55,56,69,62,37,-5,-11,14,75,2,-24,-15,18,32,20,-2,138,83,50,58,60, +62,52,29,28,9,9,5,9,4,17,12,-67,-74,-106,-105,-90,-92,-65,-43,14,100,89,49,-11,-10, +-1,14,-2,24,76,114,-5,-18,-50,-17,32,-33,-49,-22,-7,-7,-4,-4,-2,-8,-6,3,6,-3,-2, +28,57,60,55,23,-26,-76,-117,-82,20,56,39,12,-85,-116,-62,-46,-39,56,-26,-42,-90,10,12,0, +7,2,3,2,1,5,-2,-10,-26,-12,-23,-28,-19,-35,-33,-25,-3,20,102,89,-4,-66,-49,55,54, +78,127,-8,31,143,-79,-155,-120,-27,-5,-5,-1,-3,-2,-2,-2,-2,-2,1,21,33,29,43,46,29, +11,-6,-13,-18,-32,-37,-29,-9,40,132,50,-29,-107,-49,22,31,62,79,47,8,-5,-5,4,3,4, +4,3,1,7,15,29,22,3,5,6,4,13,9,5,0,-19,-33,-45,-56,-67,-68,-59,-26,3,17, +-14,-43,-53,-51,-43,-33,-18,-16,-7,-7,-7,-11,-9,-1,7,4,-4,-18,-23,-22,-18,-15,-6,8,20, +28,35,38,36,30,14,-15,-27,-38,-33,-27,-18,-20,-20,-11,-9,-7,-7,-8,1,14,19,28,29,36, +23,16,8,3,-8,-9,2,1,4,7,11,15,21,24,27,24,21,20,10,-1,-14,-18,40,40,30, +36,28,27,31,31,32,26,18,20,20,17,7,8,3,1,-14,-3,-2,-3,-2,-2,-3,-4,4,10, +15,20,24,29,30,32,34,37,13,16,-2,-8,-4,3,-9,-9,-11,-11,-10,-12,-14,-13,-15,-4,-19, +-20,-13,6,1,2,2,2,2,1,3,5,6,8,10,11,12,13,14,13,4,12,12,10,31,27, +-3,27,26,-2,4,2,-7,-2,-1,-5,22,24,-2,25,29,8,12,14,16,16,15,14,14,14,20, +12,11,11,18,19,14,14,7,19,16,8,5,11,11,-8,8,14,5,13,6,5,2,3,19,12, +19,25,22,31,33,30,23,14,11,16,37,17,15,17,36,37,19,16,13,29,25,12,-5,13,6, +-42,-16,-29,-49,-28,-19,-24,-11,-12,5,3,17,23,21,34,46,44,40,29,27,28,61,17,18,22, +62,61,29,29,-10,12,2,-17,-46,-4,-14,-52,-22,-17,-12,-7,-8,-29,-18,-25,-5,6,29,48,56, +80,93,81,52,18,7,33,92,37,24,38,96,89,23,12,132,119,109,91,79,70,48,23,22,5, +9,3,8,4,22,19,-47,-63,-67,-67,-87,-92,-86,-42,13,86,65,22,-30,-17,10,55,31,52,100, +134,-36,-11,-12,-4,39,-20,-38,-12,-7,-5,-3,-3,-2,-6,-7,3,16,-1,6,32,64,90,88,38, +-17,-61,-101,-62,38,62,50,39,-46,-79,-53,-44,-7,85,0,-32,-67,9,13,3,5,2,2,2,1, +3,3,-5,-12,-2,7,-9,-27,-33,-29,-15,20,62,126,91,-23,-72,-23,135,153,173,193,32,44,143, +-70,-156,-133,-25,-3,-5,-1,-3,-2,-2,-2,-2,-2,2,21,34,43,46,43,38,22,11,4,0,-2, +2,11,43,86,148,90,27,-23,5,103,115,118,119,67,20,-1,1,3,2,4,4,3,2,7,16, +30,38,35,22,15,14,17,20,23,32,15,8,9,-18,-29,-23,10,53,73,98,15,7,-20,-23,-24, +-17,-14,-11,-5,-5,-8,-9,-7,-3,7,12,9,-9,-20,-19,-18,-13,-4,18,31,36,36,29,18,17, +10,-7,-25,-30,-16,2,-23,-17,-2,1,5,2,-1,-5,5,11,23,22,28,32,26,20,17,14,12, +2,4,7,7,12,17,23,30,38,45,39,32,28,17,6,-13,-16,43,46,41,38,39,36,38,39, +39,41,43,43,39,41,31,24,21,11,2,-2,-1,0,0,1,1,0,5,9,16,23,31,39,38, +39,39,43,19,19,28,26,10,28,25,11,11,10,8,9,8,8,26,25,1,18,17,7,8,8, +7,7,7,7,10,12,13,15,17,20,20,20,21,20,14,-15,-10,-12,-20,-8,22,-23,-11,8,14, +14,12,16,17,19,-14,-27,27,-8,-21,-15,-12,-14,-11,-13,-14,-15,-15,-15,-8,-18,-20,-20,-15,-12, +-10,-12,-12,-17,-3,-22,-23,-9,-13,-28,-15,-17,-31,-24,-21,-24,-18,-17,-13,-12,5,-12,-7,-9,-6, +-12,-17,-23,-24,-20,-1,-25,-30,-29,-16,-10,-7,-12,-2,0,-15,-16,-21,-3,-7,-48,-24,-27,-55,-30, +-27,-31,-29,-33,-8,-15,-12,-8,-11,-9,-3,-10,-14,-25,-21,-21,11,-40,-47,-40,-16,-1,7,0,-14, +-12,-28,-39,-52,-11,-11,-39,-13,-9,-4,-3,-5,-20,-20,-31,-14,-4,8,20,15,15,15,-5,-31,-55, +-56,-25,30,-41,-64,-49,-10,9,5,-11,85,63,55,57,66,55,31,12,13,2,5,1,7,0,20, +21,-43,-70,-85,-96,-115,-104,-72,-35,27,113,68,9,-54,-54,-48,-30,-50,-13,67,86,-22,-20,-47,-28, +12,-21,-25,-5,-5,-3,-2,-2,-2,-3,-8,-6,4,-9,-3,6,18,22,3,-23,-59,-91,-111,-60,44, +45,20,7,-94,-117,-57,-51,-9,88,19,-17,-56,5,10,2,3,2,1,2,1,2,3,-3,-14,-7, +-10,-17,-25,-34,-30,-44,-32,0,52,26,-67,-94,-77,5,3,25,47,-6,-66,106,-72,-168,-139,-31,-2, +-3,-1,-2,-1,-2,-2,-1,-3,-3,10,27,35,38,22,-1,-24,-40,-43,-35,-44,-41,-39,13,56,117, +-41,-153,-223,-147,-25,54,127,120,56,18,-2,1,3,2,3,3,3,1,5,15,30,34,27,17,15, +15,16,12,0,-16,-41,-59,-75,-83,-96,-102,-90,-61,-42,-38,-21,-31,-19,-35,-30,-26,-16,-12,-5,-4, +-6,-7,-8,-5,2,4,0,-9,-15,-15,-21,-25,-23,-14,-6,0,5,11,14,11,-6,-45,-45,-50,-40, +-29,-42,-38,-29,-24,-15,-14,-12,-12,-2,5,13,14,23,26,23,18,17,10,1,-9,-1,5,10,15, +21,28,24,20,15,3,-5,-13,-18,-26,-39,-39,26,26,41,27,29,29,27,28,27,25,27,25,27, +27,23,21,12,10,5,6,10,7,8,8,7,8,10,11,12,13,14,13,14,16,18,22,10,8, +5,11,26,4,9,21,22,23,23,25,25,28,9,4,19,5,1,8,7,7,7,7,8,7,7, +7,7,6,6,6,7,8,9,9,6,17,16,24,15,-4,-33,20,0,-32,-29,-29,-33,-32,-33,-33, +-6,13,-32,-4,13,21,17,20,23,21,21,20,19,20,26,18,18,18,23,24,17,19,15,25,-14, +11,-5,2,10,-8,13,14,-5,6,3,5,-9,-5,13,8,-8,26,29,35,40,33,26,20,18,23, +43,24,22,24,38,36,15,17,23,34,12,7,-14,7,2,-33,-17,-18,-40,-18,-25,-15,-23,-20,5, +-2,4,19,33,41,56,47,43,33,33,34,67,27,28,34,61,57,22,29,4,15,-6,-14,-40,-1, +-6,-30,-7,-5,-2,-3,-2,-13,-17,-25,-10,4,10,39,63,80,97,74,45,19,13,41,97,45,31, +46,84,69,2,3,149,101,73,67,58,47,25,8,7,1,3,1,5,0,18,28,-27,-41,-62,-56, +-52,-61,-37,-9,47,119,90,42,-5,4,30,72,39,66,133,150,-11,8,-19,-10,24,-11,-15,-2,-3, +-1,-1,-1,-2,-2,-6,-3,10,-8,-14,12,56,79,89,30,-31,-82,-110,-56,54,47,20,7,-74,-95, +-60,-42,18,104,26,-10,-47,3,7,1,2,1,1,1,1,2,2,3,-7,10,14,10,-9,-28,-22, +0,51,115,151,97,-35,-29,37,165,181,183,159,40,-30,58,-72,-145,-139,-24,-2,-1,-1,-1,-1,-1, +-1,-1,-3,-3,8,28,32,41,43,36,22,1,-15,-21,-22,-13,-14,50,90,139,41,-22,-31,-48,109, +124,117,133,61,21,-1,2,1,1,2,2,2,1,4,13,29,46,41,36,25,16,19,18,18,22, +2,-6,-3,-23,-27,-10,24,58,78,81,29,13,-25,-21,-25,-16,-10,-8,-2,-2,-4,-5,-5,-4,4, +8,10,-6,-14,-18,-14,-10,-6,6,11,11,10,5,-4,3,7,7,-5,-10,2,14,-26,-29,-22,-15, +-14,-12,-11,-10,-4,2,9,11,14,19,20,19,19,15,10,6,12,14,16,21,27,34,36,39,40, +32,22,16,6,-4,-19,-22,30,31,23,29,29,27,32,33,36,40,41,45,46,48,37,31,30,23, +11,12,10,11,11,11,10,9,14,18,24,30,37,43,39,36,33,33,23,23,23,16,2,27,16, +3,3,3,2,2,1,2,20,29,-2,15,22,21,20,20,20,20,21,20,22,24,25,26,27,29, +27,27,27,25,27,-22,-16,-24,-6,14,32,-16,9,25,31,30,26,30,30,32,5,-17,38,11,-7, +-26,-18,-20,-18,-21,-21,-21,-21,-21,-15,-24,-25,-25,-19,-16,-15,-17,-18,-20,17,-22,-13,-3,-11,-21, +-16,-16,-23,-25,-23,-16,-15,-16,-6,-12,18,-17,-17,-16,-16,-26,-32,-32,-32,-26,-10,-30,-34,-29,-15, +-10,-12,-16,-11,-4,-2,-12,-14,0,-3,-34,-14,-20,-33,-28,-21,-22,-26,-34,-3,-14,-3,-11,-23,-17, +-12,-26,-30,-30,-28,-27,-2,-44,-46,-37,-8,4,0,-1,-22,-12,-12,-32,-41,-7,-6,-20,-4,-2,3, +2,-1,-9,-18,-34,-8,-14,9,8,-4,3,-2,-35,-62,-68,-62,-31,12,-44,-57,-36,9,18,-5,-11, +66,60,68,58,59,40,14,3,4,0,0,-1,3,0,15,22,-17,-54,-60,-74,-114,-100,-71,-19,40, +107,47,-18,-72,-71,-59,-28,-49,-9,77,85,-26,-11,-32,-26,2,-10,-8,-1,-2,-1,0,0,-1,-1, +-5,-9,4,-12,-8,-9,0,12,-6,-35,-70,-98,-102,-42,57,32,4,4,-87,-101,-48,-44,33,107,49, +2,-33,1,6,0,1,0,0,0,1,1,4,2,-4,0,7,-1,-22,-27,-22,-38,-20,30,41,-6, +-105,-97,-62,16,31,48,28,17,-112,14,-69,-138,-127,-28,0,-1,-1,-1,0,-1,-1,-1,-2,-4,-1, +17,34,30,8,-11,-32,-45,-50,-39,-39,-25,-25,54,79,81,-82,-181,-211,-155,-10,105,168,141,55,25, +1,2,1,1,1,1,2,2,2,11,23,40,45,29,25,23,19,17,6,-9,-34,-51,-64,-78,-92, +-94,-77,-54,-42,-43,-12,-6,0,-17,-17,-16,-12,-6,-2,-1,-2,-2,-4,-5,-1,3,4,-4,-13,-14, +-23,-29,-28,-22,-18,-18,-15,-12,-10,-10,-22,-55,-49,-47,-32,-17,-53,-47,-32,-32,-21,-21,-18,-16,-6, +-5,5,0,11,11,15,13,17,12,7,-5,-1,7,12,18,25,33,25,17,9,-5,-18,-29,-31,-37, +-47,-48,7,6,31,12,20,21,17,20,18,21,29,27,29,33,32,27,19,15,17,9,13,11,11, +11,10,11,8,7,6,6,4,1,1,2,3,6,6,2,11,22,33,8,20,31,34,36,35,39, +40,43,25,13,35,22,13,9,10,10,11,11,11,11,10,9,8,6,5,4,5,6,6,5,9, +11,11,22,-7,-26,-36,2,-22,-39,-37,-36,-36,-38,-39,-36,-28,-7,-34,-25,-9,17,10,13,16,13, +12,12,12,12,18,11,10,12,15,15,10,13,13,17,-30,4,-16,-8,2,-12,7,2,-19,-11,-10, +-2,-20,-15,0,-2,-24,12,20,20,26,15,10,8,9,15,30,13,11,15,23,21,6,10,25,27, +-4,-3,-20,-1,-4,-24,-16,-10,-29,-13,-26,-10,-32,-29,1,-12,-12,3,23,24,39,22,18,15,19, +21,46,12,13,25,38,38,14,22,13,11,-16,-16,-32,-2,-2,-11,2,0,7,2,0,-2,-12,-23, +-13,-3,-8,18,43,48,60,24,-1,-10,-3,26,66,21,9,31,50,38,-9,-3,140,73,44,43,37, +26,9,1,2,-1,-2,-1,2,-1,9,24,-9,-28,-62,-56,-42,-43,1,26,82,144,103,48,4,9, +27,59,27,61,142,144,24,26,-24,-13,10,-4,-4,0,-1,0,1,0,-1,0,-4,-7,3,-10,-23, +-7,34,48,59,11,-42,-91,-97,-32,76,45,7,-9,-90,-97,-46,-21,48,121,58,12,-31,3,3,0, +0,0,0,0,0,1,1,6,-4,14,15,20,8,-15,-7,11,62,132,135,73,-49,-2,59,128,143, +132,72,37,-107,-54,-65,-105,-112,-18,0,0,0,0,0,0,-1,0,-1,-4,-3,17,21,31,31,21, +7,-13,-30,-33,-33,-18,-24,65,90,92,-40,-106,-99,-107,58,115,127,129,48,22,-1,1,0,0,0, +1,1,1,0,8,23,43,40,43,36,26,26,20,16,11,-11,-24,-27,-37,-39,-22,-6,9,24,10, +26,10,-19,-14,-19,-11,-5,-2,2,1,1,-2,-2,-3,1,4,8,-1,-7,-11,-8,-8,-9,-8,-9, +-11,-7,-5,-7,-1,4,3,2,0,9,15,-27,-37,-39,-32,-33,-26,-22,-16,-12,-6,-3,1,2,7, +9,13,16,12,6,8,18,18,22,28,35,41,37,32,26,17,7,0,-7,-14,-23,-28,12,10,2, +15,13,14,20,21,26,28,28,34,39,41,33,31,30,27,14,24,22,22,21,20,19,19,21,24, +26,29,31,31,27,22,18,15,22,23,13,4,-2,18,6,-1,-1,0,2,1,1,2,11,24,-1, +10,19,31,28,29,29,29,29,29,30,29,29,29,28,29,28,27,26,25,33,-12,-8,-15,11,23, +17,2,19,18,22,22,16,18,18,19,15,0,21,20,10,-18,-10,-11,-9,-12,-12,-11,-10,-10,-7, +-12,-13,-12,-6,-5,-8,-8,-11,-6,22,-9,-1,3,-2,-8,-7,-5,-9,-16,-17,-2,-10,-11,6,-5, +17,-8,-10,-6,-6,-20,-25,-20,-17,-11,0,-14,-14,-8,4,5,-7,-6,-5,6,13,-2,-6,3,0, +-17,-6,-11,-15,-20,-17,-10,-22,-29,4,-9,3,-7,-13,-5,2,-18,-20,-11,-7,-5,9,-19,-16,-4, +21,24,2,9,-17,-1,4,-19,-27,-2,-3,-5,0,3,4,7,2,-1,-10,-28,-4,-16,5,3,0, +13,10,-34,-57,-46,-32,-4,20,-13,-15,10,47,38,-12,-6,73,61,76,52,42,23,3,1,1,-1, +-1,-3,0,0,7,17,3,-30,-37,-46,-81,-70,-40,19,73,116,57,-5,-43,-43,-26,12,-12,23,104, +102,-24,10,-3,-11,3,-2,-4,0,-1,1,1,1,0,-1,-3,-7,3,-7,-9,-13,5,26,18,-20, +-63,-93,-82,-16,76,35,0,-6,-79,-87,-48,-35,46,114,78,13,-20,4,2,0,0,0,0,-1,0, +0,2,2,4,7,23,17,-12,-17,-13,-13,22,86,61,-5,-106,-60,0,71,102,96,23,23,-131,-115, +-70,-86,-91,-15,1,-1,0,0,0,0,0,0,-1,-2,-6,7,27,20,2,-7,-24,-34,-45,-42,-36, +-10,-6,88,93,35,-80,-136,-128,-109,28,136,166,129,46,23,-2,1,-1,-1,-1,0,0,1,0,5, +16,42,57,42,35,29,20,17,10,4,-19,-31,-36,-50,-54,-45,-28,-18,-15,-20,12,21,13,5,-3, +-2,-3,1,2,3,1,2,0,-2,-1,4,11,4,-5,-9,-16,-21,-23,-21,-22,-26,-23,-21,-22,-19, +-21,-32,-26,-19,-3,11,-42,-40,-28,-30,-24,-23,-19,-16,-9,-9,-2,-6,1,1,7,9,15,14,15, +7,6,11,13,19,25,31,23,16,8,-3,-12,-22,-23,-26,-34,-36,-1,-3,14,4,13,14,12,15, +14,20,28,29,31,36,37,32,29,24,26,18,20,20,19,19,19,20,16,15,14,13,12,9,6, +4,2,1,13,8,22,29,28,20,29,31,34,35,35,38,39,41,38,29,35,35,29,19,21,21, +22,22,22,22,21,20,19,17,16,15,15,15,14,13,23,-8,-4,1,-23,-27,-14,-19,-26,-19,-17, +-17,-15,-18,-18,-12,-31,-26,-9,-26,-25,-4,-7,-6,-4,-8,-8,-7,-6,-6,-3,-8,-8,-7,-5,-4, +-6,-4,-2,-5,-23,-12,-22,-15,-10,-15,-6,-14,-28,-29,-25,-12,-26,-23,-12,-14,-20,-12,-3,-7,-5, +-18,-21,-17,-11,-5,2,-11,-13,-7,-3,-3,-10,-6,10,8,-16,-16,-21,-8,-6,-13,-10,-5,-14,-10, +-20,-7,-31,-34,-5,-19,-22,-16,-3,-6,2,-20,-22,-14,-4,-1,9,-16,-16,0,5,9,-2,6,5, +-2,-21,-21,-24,-3,0,0,3,2,4,5,3,3,-4,-20,-11,-13,-18,-7,6,1,-1,-48,-67,-51, +-27,1,15,-17,-23,3,8,3,-22,-13,89,33,22,22,19,10,0,0,-1,-1,-2,-2,-1,-1,2, +13,4,-19,-53,-57,-55,-44,9,50,104,148,95,37,-1,-8,-2,20,-4,32,115,103,22,21,-26,-12, +1,-1,-2,1,0,1,1,1,1,0,-1,-6,-1,-7,-19,-21,4,10,7,-26,-67,-102,-81,-12,82, +34,-11,-32,-100,-95,-36,-17,63,113,76,19,-24,8,-1,0,-1,0,-1,-1,0,0,0,4,0,8, +9,18,9,-7,-2,5,44,103,68,5,-89,-16,38,58,81,64,-17,23,-142,-168,-76,-60,-72,-6,0, +1,1,1,1,1,0,0,-1,-1,-9,3,9,13,4,-10,-25,-41,-54,-51,-49,-23,-19,77,77,15, +-107,-158,-147,-124,-3,96,124,101,35,17,-3,0,-2,-1,-1,-1,-1,0,-1,2,13,33,40,42,38, +29,24,15,5,-8,-30,-46,-58,-60,-60,-46,-48,-50,-41,-61,18,10,-3,-4,-8,-2,1,3,4,3, +2,2,1,0,0,2,7,5,0,-5,-8,-14,-19,-27,-33,-36,-28,-21,-17,-14,-14,-20,-7,0,10, +15,-30,-38,-42,-37,-36,-30,-23,-17,-13,-8,-6,-5,-4,-2,2,5,9,8,4,7,15,15,18,23, +29,34,24,13,2,-6,-14,-20,-21,-24,-27,-31,-5,-10,-6,-2,0,2,5,6,9,10,12,16,22, +25,25,26,25,27,20,28,29,28,28,27,26,27,26,25,24,22,18,13,9,5,1,-2,16,15, +7,5,12,10,7,12,14,16,18,19,19,21,13,19,18,14,18,31,29,30,30,31,31,31,30, +28,26,24,23,22,21,20,19,18,30,0,3,2,14,9,-13,11,9,-7,-6,-6,-9,-11,-12,-10, +4,7,-12,7,11,-2,0,2,3,0,0,2,3,3,5,2,2,5,8,8,1,4,2,9,4, +2,-1,0,2,0,3,2,-5,-12,-13,4,-12,-11,9,-2,-1,2,3,6,6,-9,-12,-5,2,8, +11,5,7,14,22,18,-2,4,9,18,14,2,-7,0,-1,-5,-3,-5,-5,-9,-14,-2,-21,-25,3, +-8,-1,-4,3,9,16,-6,-6,8,17,19,20,8,15,32,46,40,3,18,-2,10,6,-8,-16,-1, +-1,0,1,2,2,4,3,2,-1,-17,-5,-13,-6,-1,13,23,21,-27,-44,-22,4,27,27,16,24, +53,69,45,-22,-2,96,60,58,34,19,7,-1,0,-1,-1,-1,-2,-1,-1,2,8,12,-9,-26,-28, +-40,-34,0,56,101,120,74,22,-1,-1,19,64,42,71,136,121,14,32,9,2,6,-2,-1,1,0, +1,1,1,1,0,-1,-4,1,-2,-10,-11,18,38,40,-7,-57,-89,-66,-1,79,34,-5,-22,-70,-63, +-24,-2,74,125,91,18,-17,8,-2,0,-1,0,-1,-1,0,0,1,1,3,9,25,28,5,-3,1, +24,73,136,84,8,-87,-3,79,133,171,139,27,39,-111,-208,-70,-35,-49,0,-1,1,0,1,1,1, +0,0,0,0,-6,-2,10,7,0,-1,-11,-22,-36,-37,-27,8,23,112,94,-7,-56,-65,-39,-40,55, +133,126,93,34,12,-5,0,-2,-1,-1,-1,-1,0,-1,0,8,33,52,48,41,32,25,19,17,17, +1,-9,-10,-24,-19,2,11,8,6,2,39,44,18,17,6,7,2,4,3,3,2,2,2,1,0, +4,12,10,3,-4,-6,-8,-12,-13,-19,-26,-22,-22,-26,-22,-16,-5,1,13,28,39,-23,-26,-22,-22, +-23,-21,-16,-12,-9,-8,-5,-7,-5,-5,0,4,10,12,16,18,17,17,17,21,26,30,24,18,12, +7,1,-5,-7,-11,-17,-20,-6,-10,-7,-4,2,2,3,5,7,12,18,21,24,29,30,29,32,30, +29,27,25,27,27,27,26,27,24,23,23,22,21,20,14,9,4,0,18,15,25,24,15,26,26, +20,23,24,24,26,26,27,36,36,25,35,36,28,30,30,30,31,31,31,31,30,28,27,26,26, +25,23,22,20,34,-23,-16,-19,-22,-12,10,-27,-13,6,8,7,8,6,7,13,-18,-30,15,-13,-24, +-24,-20,-22,-21,-25,-25,-22,-20,-20,-21,-23,-23,-21,-19,-18,-19,-17,-14,-20,-4,-22,-19,-14,-15,-13, +-15,-19,-25,-35,-33,-17,-25,-24,-14,-20,-6,-28,-23,-28,-30,-45,-46,-36,-26,-22,-24,-30,-30,-21,-20, +-18,-21,-17,-2,-6,-13,-17,-16,-10,-5,-3,-2,0,-3,-4,-8,-3,-22,-32,-7,-21,-21,-29,-26,-29, +-29,-53,-52,-35,-20,-19,-28,-39,-36,-15,-13,-7,-11,-2,-4,-9,-14,-19,-16,-3,1,1,1,1,1, +3,3,2,3,-12,-7,-19,-17,-25,-25,-34,-51,-101,-112,-78,-40,-19,-35,-48,-44,-11,-10,-13,-28,-13, +50,19,27,16,11,3,-1,0,0,-1,-1,-2,-1,-2,1,4,11,-13,-36,-52,-67,-45,3,64,108, +121,62,6,-20,-31,-27,-5,-15,22,98,75,18,21,-7,-3,0,-1,0,1,0,0,0,1,1,1, +0,-3,-3,-3,-7,-24,-15,-15,-33,-57,-87,-103,-61,5,73,26,-17,-38,-91,-78,-21,-3,57,111,96, +18,-13,7,-3,1,-1,0,-1,-1,-1,0,0,1,2,1,5,12,4,1,5,11,35,72,10,-52, +-113,-25,29,22,49,18,-88,-3,-156,-249,-79,-29,-29,2,0,1,0,1,0,1,0,1,0,1,-6, +-8,-1,-6,-22,-34,-48,-57,-64,-54,-52,-15,10,89,59,-60,-135,-160,-156,-108,-51,60,98,60,25,5, +-4,0,-2,-1,-1,-1,-1,-1,0,0,5,22,37,37,38,33,25,13,-1,-17,-36,-54,-69,-69,-65, +-55,-70,-87,-90,-100,11,15,20,10,6,5,3,4,3,3,2,2,2,2,0,1,6,9,6,2, +-6,-16,-23,-32,-40,-47,-39,-31,-26,-27,-32,-39,-20,-5,7,15,-33,-35,-34,-33,-29,-24,-16,-10,-7, +-5,-4,-5,-4,-5,-3,-1,4,6,7,8,9,10,11,14,18,21,9,-4,-15,-22,-26,-32,-29,-30, +-31,-33,-20,-26,-9,-17,-11,-8,-10,-8,-8,-6,-1,1,5,10,16,19,17,21,26,26,28,27,27, +27,26,28,23,19,15,9,2,-5,-9,-12,-14,-17,6,3,5,11,25,3,12,25,28,30,32,34, +36,37,20,14,37,22,18,21,22,22,23,23,23,24,21,19,16,14,12,9,9,8,7,6,20, +5,7,13,2,-14,-35,5,-11,-27,-28,-28,-29,-33,-34,-29,-16,-1,-34,-15,-2,7,4,6,7,3, +4,6,9,9,7,7,8,12,12,11,4,8,9,14,-18,4,-7,-8,0,3,5,2,-6,-13,-14, +1,-18,-15,3,-4,-21,2,7,7,6,-7,-8,1,11,15,10,10,13,23,22,16,-2,8,20,21, +5,0,-11,-5,-2,0,-3,-1,-2,0,-8,1,-17,-21,-2,-11,-13,-9,10,9,14,-7,-5,12,26, +28,14,17,26,47,44,35,1,21,13,13,-1,-4,-9,0,0,0,1,1,1,1,3,1,4,-6, +-7,-11,-19,-11,13,13,7,-38,-46,-15,20,35,13,20,34,67,56,28,-27,-1,94,45,32,17,4, +0,0,0,0,0,0,-1,-1,-1,-1,2,10,4,-25,-25,-12,-5,37,89,124,120,83,44,35,31, +47,81,64,87,140,113,33,40,12,10,3,-1,0,0,0,0,0,0,1,1,0,-1,-3,1,-9, +-9,20,28,31,-14,-57,-80,-43,17,80,38,-4,-34,-65,-50,-12,14,72,111,86,14,-11,5,-3,1, +-1,0,0,0,0,0,0,1,1,6,13,27,21,15,21,61,108,149,84,11,-64,38,119,136,173, +126,4,30,-85,-260,-82,-9,-16,3,0,1,0,1,0,1,1,1,0,1,-3,-7,-8,-6,-5,-4, +-10,-21,-34,-34,-29,11,43,103,66,-53,-48,-23,11,2,41,74,50,42,19,-2,-2,-1,-1,-1,-1, +-1,-1,-1,0,-2,2,22,37,47,44,34,29,17,12,10,-2,-12,-15,-21,-8,19,14,1,-2,-5, +51,48,15,17,9,8,3,3,2,2,2,2,2,2,1,2,9,13,11,4,4,1,-6,-11,-20, +-30,-25,-25,-30,-25,-15,8,15,29,41,50,-10,-18,-22,-19,-24,-17,-12,-6,-6,-4,-4,-4,-6,-6, +-5,-2,1,5,9,17,16,13,12,13,15,16,12,8,4,4,2,0,-2,-5,-8,-12,-11,-16,-25, +-12,-11,-10,-7,-6,-3,0,2,7,11,15,17,19,25,26,24,29,26,27,27,27,26,27,25,24, +24,23,21,20,13,7,2,-4,16,15,15,9,0,17,11,5,6,7,8,9,9,10,20,28,11, +22,28,29,29,29,29,30,30,30,29,28,27,26,26,26,24,22,20,18,33,-23,-17,-25,-8,6, +17,-17,2,17,17,16,15,12,13,18,0,-17,20,3,-10,-28,-21,-23,-23,-26,-26,-22,-20,-20,-23, +-23,-22,-18,-18,-18,-20,-18,-17,-20,11,-19,-9,-9,-12,-4,-12,-12,-13,-25,-26,-13,-19,-19,-8,-16, +4,-27,-26,-29,-35,-47,-47,-35,-23,-20,-29,-28,-25,-14,-15,-16,-22,-17,-10,-9,-2,-11,-8,-7,-2, +2,1,2,2,2,-1,2,-10,-22,-6,-16,-13,-28,-31,-31,-36,-56,-52,-30,-14,-14,-38,-32,-24,-1, +-5,-4,-17,-4,-13,-10,-2,-13,-8,0,1,-1,0,0,-1,0,1,0,5,-4,-3,-18,-14,-30,-34, +-41,-65,-108,-111,-68,-26,-15,-52,-41,-24,13,4,-8,-34,-13,22,16,33,12,5,0,0,0,0,0, +0,0,0,-1,0,-1,10,-4,-17,-36,-56,-32,5,77,107,92,42,-1,-10,-20,-16,6,4,32,86, +51,14,17,10,5,0,-1,0,0,0,0,0,0,0,0,1,-1,-2,0,3,-13,-14,-15,-37,-60, +-80,-78,-27,27,67,26,-13,-37,-64,-45,3,16,62,103,89,11,-5,3,-2,0,0,0,0,0,0, +0,0,-1,3,-2,6,12,7,16,20,35,50,61,-13,-70,-108,-18,36,27,58,20,-83,0,-113,-254, +-79,-10,-4,1,1,0,0,0,0,0,0,0,0,0,0,-11,-8,-18,-34,-40,-51,-56,-59,-47,-44, +-1,42,84,34,-100,-106,-96,-92,-47,-47,24,50,22,14,-5,0,-1,0,0,0,-1,-1,-1,-1,-1, +-1,14,36,36,35,33,23,10,-3,-16,-29,-43,-55,-57,-48,-37,-51,-70,-82,-76,21,34,36,19,12, +5,2,2,1,1,0,1,1,2,2,2,5,12,12,8,-3,-12,-20,-27,-34,-44,-38,-34,-33,-33, +-36,-36,-20,-1,14,27,-26,-23,-19,-20,-17,-13,-8,-3,-1,0,0,-2,-2,-4,-5,-5,-1,1,6, +6,1,3,2,2,3,3,-4,-11,-17,-21,-22,-27,-23,-24,-25,-26,-22,-27,-12,-21,-15,-13,-16,-14, +-14,-11,-7,-5,-3,1,9,12,13,16,26,21,22,22,21,21,21,22,16,12,7,2,-4,-10,-13, +-15,-16,-19,1,-3,7,15,24,3,15,24,27,28,30,32,35,36,24,14,37,26,19,13,15,15, +15,15,15,16,13,11,9,7,5,3,3,2,1,0,12,-2,0,6,-15,-27,-30,-10,-23,-25,-27, +-28,-27,-31,-32,-26,-27,-14,-29,-27,-18,1,-3,-2,-2,-4,-4,-1,1,1,-3,-1,0,5,3,1, +-3,1,4,2,-27,-5,-14,-14,-6,1,1,-3,-8,-15,-16,-6,-22,-19,-7,-10,-28,-9,-2,-6,-9, +-19,-17,-8,4,6,-6,-1,3,13,6,1,-10,-1,15,8,-10,-8,-14,-8,-3,2,-1,1,1,4, +0,2,-8,-15,-8,-14,-21,-18,0,-6,-6,-22,-18,-2,16,16,-9,3,11,36,19,13,-7,10,12, +1,-13,-7,-6,2,1,0,0,0,-1,-1,0,0,4,1,-6,-10,-24,-22,-2,-15,-30,-64,-63,-28, +13,19,-22,-4,14,50,20,-3,-33,-8,65,23,8,6,-2,1,-1,0,0,0,0,0,0,0,-2, +0,4,8,-21,-27,-6,8,53,102,127,107,76,48,45,38,41,54,50,73,118,78,47,34,7,9, +-1,1,0,0,0,0,0,0,0,0,0,1,-3,2,-2,-6,8,2,-6,-39,-64,-68,-23,25,60, +28,-10,-43,-58,-37,8,31,55,97,77,9,-5,2,-1,0,0,0,0,0,0,0,-1,0,1,2, +0,17,25,25,31,68,94,100,33,-22,-62,37,99,84,107,55,-51,3,-78,-248,-80,0,-1,1,0, +0,0,0,0,0,0,0,0,0,0,-7,-18,-20,-20,-22,-28,-37,-45,-40,-37,4,52,70,22,-83, +-56,-24,-7,-3,-5,-12,-12,4,6,-5,0,-1,0,0,0,0,0,-1,-1,-1,-2,11,23,37,36, +29,25,10,1,-6,-14,-26,-31,-29,-14,5,-8,-26,-33,-28,42,38,18,15,9,4,2,1,0,0, +0,0,1,1,2,2,4,12,14,11,8,2,-5,-12,-21,-33,-28,-26,-29,-25,-18,1,10,24,34, +41,-7,-14,-21,-16,-19,-11,-6,-1,0,1,0,0,-1,-2,-5,-5,-4,-3,-1,8,8,5,3,2, +2,1,-2,-4,-7,-5,-5,-6,-6,-7,-8,-11,-14,-20,-27,-16,-17,-16,-14,-13,-9,-8,-7,-4,-2, +1,4,8,13,18,19,26,24,23,23,22,21,21,19,18,17,14,11,8,4,0,-4,-9,8,8, +1,-4,-3,4,-2,-2,-1,0,1,2,3,4,6,12,7,9,14,21,20,20,20,20,20,20,19, +18,17,16,15,15,13,12,10,9,20,-12,-8,-13,4,8,1,-3,6,7,6,4,3,-1,-1,3, +4,-3,2,5,1,-16,-11,-12,-13,-14,-13,-11,-8,-8,-14,-10,-9,-4,-6,-7,-10,-8,-8,-7,7, +-8,-2,-6,-6,4,-3,-2,-3,-10,-13,-5,-14,-14,-1,-8,1,-14,-15,-17,-24,-31,-29,-19,-7,-6, +-19,-12,-6,6,1,-3,-13,-6,-1,-2,6,-3,-5,-4,0,1,0,1,1,2,1,2,-1,-10,-5, +-10,-6,-18,-17,-18,-24,-35,-30,-11,5,3,-27,-9,1,26,16,11,-10,5,-5,-4,2,-7,-3,1, +0,-1,0,0,0,-1,0,-1,2,1,-1,-12,-12,-23,-23,-28,-52,-79,-75,-37,1,3,-44,-16,9, +46,28,6,-27,-4,25,27,32,8,1,-1,0,0,0,0,0,0,0,0,0,-2,4,4,-4,-15, +-23,-3,24,88,104,71,38,13,14,12,17,32,36,56,91,51,15,21,21,5,-2,1,0,0,0, +0,0,0,0,0,0,1,-2,0,8,-2,-5,-9,-28,-56,-70,-58,-10,29,47,21,-6,-29,-35,-18, +15,26,50,85,70,4,-3,1,-1,0,0,0,0,0,0,0,0,-1,2,-2,5,13,14,27,33, +62,73,65,-3,-51,-73,8,62,60,84,42,-48,3,-61,-216,-74,1,1,0,0,0,0,0,0,0, +0,0,1,0,2,-7,-14,-24,-32,-31,-37,-38,-40,-30,-21,23,76,72,16,-94,-46,-10,2,12,-5, +-17,-9,-4,3,-4,1,0,0,0,0,0,0,0,-1,0,-3,7,27,33,32,30,22,11,3,-3, +-9,-19,-24,-27,-15,-2,-8,-19,-30,-10,35,47,36,21,10,0,1,-1,0,0,0,0,0,1,1, +1,3,13,15,14,6,-1,-8,-10,-17,-29,-27,-29,-32,-30,-27,-14,-7,10,23,36,-12,-10,-7,-8, +-7,-5,-2,2,1,1,1,0,0,-1,-3,-5,-3,-2,3,5,-2,-2,-5,-6,-7,-8,-9,-10,-10, +-9,-9,-10,-9,-9,-11,-12,-16,-19,-15,-17,-14,-13,-14,-13,-12,-9,-6,-5,-4,-2,3,6,10,12, +22,18,17,17,16,15,14,14,10,8,5,3,0,-3,-6,-8,-9,-12,0,-2,8,11,10,5,11, +11,12,13,14,16,18,19,19,13,22,22,18,9,11,10,10,10,10,10,8,7,6,5,4,4, +3,2,1,1,9,-13,-9,-8,-20,-20,-10,-18,-19,-7,-10,-11,-11,-15,-14,-9,-21,-20,-8,-20,-21, +-11,-12,-13,-14,-15,-14,-12,-10,-10,-15,-12,-11,-6,-10,-10,-12,-9,-6,-12,-16,-12,-14,-14,-8,0, +-3,-5,-6,-11,-12,-8,-17,-19,-13,-12,-17,-19,-15,-21,-27,-31,-28,-20,-9,-9,-24,-16,-12,-1,-10, +-13,-16,-9,3,-7,-13,-10,-10,-4,0,1,0,2,2,4,2,3,1,-5,-8,-13,-19,-24,-16,-23, +-30,-38,-33,-19,-3,-5,-35,-17,-10,16,-6,-7,-12,-1,4,-10,-12,-6,-1,2,0,-1,0,-1,-1, +-2,-1,-1,0,3,-1,-8,-20,-28,-23,-41,-65,-83,-76,-43,-6,-7,-55,-31,-10,26,-8,-21,-27,-9, +19,5,5,3,0,-1,0,0,0,0,1,1,0,1,0,-1,0,6,-11,-24,-12,8,44,88,100, +70,42,22,24,21,17,11,20,41,75,32,32,16,6,3,-1,1,0,0,0,0,0,0,0,0, +0,1,-1,0,3,-6,-12,-29,-47,-67,-71,-54,-6,28,40,18,-11,-40,-45,-23,20,31,40,73,55, +2,-3,1,-1,0,0,0,0,0,0,0,0,-1,0,1,-6,7,22,32,41,67,69,45,-13,-47, +-54,24,59,29,36,-8,-79,-10,-74,-189,-65,4,1,0,0,0,0,0,0,0,0,0,0,0,1, +-3,-19,-27,-30,-34,-41,-44,-44,-35,-27,10,58,38,-14,-89,-60,-34,-31,-25,-33,-71,-39,-12,2,-2, +1,0,1,0,1,0,0,0,0,0,-2,3,15,27,28,25,20,6,-5,-18,-24,-36,-43,-39,-26, +-16,-26,-38,-44,-29,24,27,26,13,5,1,1,-1,-1,-1,-1,-1,0,0,0,2,1,10,16,16, +10,2,-6,-13,-21,-32,-29,-26,-26,-24,-22,-13,-4,9,16,23,-7,-9,-14,-10,-8,-4,0,3,2, +3,2,2,1,1,-1,-4,-4,-6,-6,-2,-3,-4,-5,-7,-9,-11,-12,-14,-16,-14,-13,-13,-12,-12, +-11,-11,-15,-19,-19,-16,-17,-15,-14,-12,-10,-9,-8,-7,-6,-5,-3,0,3,9,14,18,17,16,15, +13,12,12,9,8,5,2,-2,-6,-8,-9,-10,-13,-2,-2,-6,-6,1,-6,-6,-1,-1,0,1,2, +4,6,0,1,10,4,4,9,8,8,8,7,7,7,5,4,3,2,1,0,0,-1,-1,-2,4, +-3,-1,-2,3,-3,-16,2,-2,-6,-9,-10,-11,-15,-16,-13,-5,1,-16,-4,1,-3,-3,-3,-4,-4, +-4,-2,0,0,-5,-1,0,5,2,1,-3,0,0,1,-5,-2,-3,-7,-2,5,1,1,1,-2,-3, +0,-10,-11,-2,-3,-9,-5,-6,-7,-13,-15,-13,-6,3,3,-11,-1,4,16,9,3,-6,0,5,2, +4,-2,-5,-1,1,-1,-1,0,0,1,1,1,2,-1,-4,-7,-6,-10,-5,-7,-13,-16,-10,2,13, +10,-19,4,14,37,21,14,-5,8,2,-3,-1,-3,0,1,0,0,0,0,0,0,-1,-1,0,1, +1,-5,-11,-17,-11,-19,-37,-47,-39,-13,16,11,-35,-4,22,56,29,6,-21,-1,25,24,16,3,-1, +0,0,0,0,0,0,0,0,0,0,0,-1,5,1,-3,6,19,40,82,86,48,29,20,29,36, +38,37,47,60,80,40,23,18,15,-1,0,0,0,0,0,0,0,0,0,0,0,1,0,-1,3, +2,-1,-9,-20,-46,-51,-32,7,33,34,19,-1,-25,-17,1,26,35,38,66,44,-3,-1,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,13,23,36,46,78,84,60,8,-26,-35,32,76,75,84, +41,-25,5,-37,-153,-55,9,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,-15,-24,-22,-21, +-24,-24,-25,-20,-5,31,77,41,-8,-68,-7,36,55,24,27,-52,-45,-10,1,-1,0,0,0,0,0, +0,0,0,0,0,-2,2,18,30,27,23,17,8,2,-2,-3,-9,-6,-9,5,20,25,22,18,40, +34,42,28,15,1,0,0,-1,-1,-1,-1,0,0,0,0,1,0,9,16,16,13,9,2,1,-5, +-17,-19,-22,-27,-23,-16,3,3,14,22,30,1,1,-2,0,-1,0,2,2,2,1,1,1,1,1, +0,-2,-3,-5,-3,1,-3,-5,-7,-9,-11,-13,-10,-8,-5,-2,0,1,1,1,0,0,-9,-10,-16, +-11,-12,-11,-9,-7,-5,-4,-4,-3,-2,-2,-2,0,5,8,13,14,11,10,9,8,7,6,5,4, +4,3,3,3,0,-1,-3,-6,0,0,3,1,-5,2,0,-5,-4,-3,-3,-2,-1,0,7,8,4, +9,10,6,7,6,6,5,5,5,4,4,4,4,4,4,3,3,2,1,6,-16,-12,-16,-14,-7, +4,-15,-8,5,2,1,1,-2,-2,1,-10,-15,4,-8,-14,-17,-15,-16,-18,-18,-17,-16,-14,-14,-19, +-16,-15,-11,-14,-14,-14,-13,-11,-17,-3,-12,-10,-9,-5,0,-3,-3,-3,-5,-5,-4,-8,-12,-12,-10, +-4,-20,-20,-25,-31,-31,-28,-22,-14,-15,-29,-21,-17,-7,-15,-16,-16,-13,-6,-15,-8,-8,-3,1,2, +1,1,1,1,2,2,2,2,2,-2,-9,-10,-20,-22,-27,-36,-37,-31,-22,-11,-14,-41,-23,-17,6, +-13,-13,-13,-7,-7,-17,-7,-3,2,0,-1,0,0,0,-1,-1,-1,-1,-1,0,2,-4,-10,-25,-32, +-47,-70,-74,-64,-41,-13,-19,-63,-38,-18,14,-13,-23,-21,-10,-6,1,8,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,2,1,-12,-9,10,32,68,69,37,13,3,8,14,7,-11,8,23,45, +6,18,7,6,-3,1,0,0,0,0,0,0,0,0,0,0,0,0,-2,4,-5,-23,-39,-59,-68, +-59,-31,10,31,25,10,-8,-27,-22,-4,27,29,26,50,33,-5,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,-3,3,19,35,45,58,45,9,-37,-56,-43,9,27,5,-1,-33,-72,-13,-58,-119, +-41,9,-1,0,0,0,0,0,0,0,0,0,0,0,0,1,-12,-25,-30,-35,-41,-38,-34,-25,-9, +21,59,15,-28,-68,-43,-23,-17,-28,-19,-80,-38,-7,2,-1,1,0,0,0,0,0,0,0,0,0, +-1,-1,12,21,20,19,13,4,-7,-20,-23,-32,-34,-32,-22,-15,-14,-16,-17,1,9,21,28,8,0, +-1,-1,-1,-1,-1,-1,-1,-1,0,-1,1,0,6,15,17,10,4,-3,-7,-13,-22,-23,-22,-21,-20, +-20,-18,-14,-5,0,6,-4,-2,-4,-1,1,1,2,2,2,2,2,1,1,1,1,0,-2,-6,-7, +-8,-10,-9,-10,-12,-14,-15,-16,-17,-17,-16,-13,-13,-10,-9,-8,-5,-13,-14,-10,-13,-12,-10,-7,-6, +-5,-5,-4,-4,-4,-4,-3,-3,-3,1,9,8,8,6,5,4,3,2,1,-1,-3,-6,-9,-12,-12, +-12,-12,-12,-7,-8,-6,-3,3,-8,-5,-1,0,0,1,2,3,5,0,-4,10,3,0,-1,-1,-1, +-2,-2,-2,-2,-4,-4,-5,-6,-6,-7,-7,-7,-7,-7,-5,-1,0,2,-5,-12,-19,-3,-10,-11,-13, +-14,-14,-17,-18,-17,-12,-4,-20,-11,-5,1,-2,-1,-3,-2,-1,0,1,0,-4,0,1,5,2,1, +-2,0,1,0,-13,-1,-6,-6,-1,4,2,2,2,2,1,2,-3,-6,-5,-2,-13,-3,-4,-6,-10, +-9,-6,-3,4,2,-9,-1,4,13,5,1,-4,0,5,-2,-4,-3,-2,1,1,-1,0,0,0,0, +0,0,1,2,-1,-4,-6,-7,-2,-6,-10,-8,-4,1,9,6,-16,3,10,30,11,7,-3,4,3, +-7,-6,0,1,0,0,0,0,0,0,0,0,0,-1,0,0,0,-9,-12,-9,-20,-32,-30,-21,-8, +12,4,-31,-6,14,42,15,-2,-14,-2,18,15,3,1,-1,0,0,0,0,0,0,0,0,0,0, +1,-1,2,1,3,19,30,46,66,63,32,21,20,29,40,37,19,34,44,55,23,24,15,4,-2, +1,-1,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-8,-19,-27,-42,-38,-17,14,29,21, +11,-4,-23,-10,6,25,32,22,41,19,-5,1,0,0,0,0,0,0,0,0,0,0,0,-1,1, +-1,9,25,35,46,68,64,35,-1,-18,-11,35,60,53,44,10,-24,-1,-31,-92,-27,11,-3,1,-1, +0,0,0,0,0,0,0,0,0,0,2,-10,-20,-15,-16,-18,-17,-16,-14,5,29,57,9,-25,-41, +-1,31,55,5,34,-64,-43,2,-1,1,0,0,0,0,0,0,0,0,0,0,0,-2,9,22,18, +14,10,3,-2,-7,-8,-13,-7,-7,5,20,30,35,38,53,18,25,18,4,-2,0,-1,0,0,0, +0,0,0,0,0,0,0,4,12,15,13,12,7,4,-1,-10,-12,-15,-17,-14,-8,4,1,5,8, +11,8,7,1,3,0,2,1,1,0,0,0,0,0,0,0,1,-1,-4,-7,-4,-5,-7,-8,-10, +-11,-13,-11,-9,-7,-3,0,3,3,3,5,6,-6,-7,-14,-7,-8,-6,-3,-1,0,0,0,0,0, +0,-2,-2,-1,2,4,7,4,4,3,1,1,-1,0,0,1,0,0,1,-1,-2,-3,-5,-2,-1, +-3,-7,-10,-3,-7,-10,-10,-10,-10,-9,-9,-8,-4,0,-5,-1,1,2,1,1,1,0,0,-1,0, +0,0,0,0,1,0,0,0,-1,1,-10,-8,-12,-4,0,3,-7,-1,5,3,2,2,0,0,1, +-2,-7,2,1,-4,-12,-10,-11,-12,-11,-11,-10,-9,-10,-13,-10,-9,-6,-9,-9,-9,-8,-8,-11,2, +-7,-5,-3,-1,-1,-1,-1,-1,-1,-1,-1,-2,-3,-6,-6,2,-11,-14,-17,-22,-20,-17,-14,-9,-10, +-20,-14,-10,-2,-7,-9,-9,-7,-6,-12,-3,-3,1,1,1,0,0,0,0,1,1,0,1,1,2, +-3,-2,-10,-15,-18,-25,-21,-17,-13,-7,-11,-29,-15,-9,8,-6,-5,-6,-3,-6,-13,-1,0,1,-1, +0,0,0,0,0,0,0,0,0,-1,0,-1,-2,-14,-25,-34,-50,-45,-36,-24,-8,-15,-46,-26,-9, +16,-2,-9,-9,-4,-10,5,8,-2,1,0,0,0,0,0,0,0,0,0,0,0,1,-1,5,2, +3,17,27,47,42,16,1,-2,5,16,10,-12,7,16,26,-1,8,5,3,-3,2,-1,0,0,0, +0,0,0,0,0,0,0,1,-1,1,-5,-22,-33,-48,-52,-39,-14,16,27,14,6,-4,-15,-3,10, +25,24,14,28,12,-4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,16,31,40, +46,30,-1,-32,-40,-22,8,18,9,-3,-24,-40,-7,-36,-66,-13,7,-3,1,0,0,0,0,0,0, +0,0,0,0,0,1,-4,-18,-20,-23,-27,-23,-18,-11,9,28,48,1,-28,-39,-18,2,18,-15,16, +-54,-21,3,-1,1,0,0,0,0,0,0,0,0,0,0,1,-2,7,16,13,12,5,1,-5,-13, +-15,-19,-15,-16,-7,2,12,19,23,36,1,16,19,-1,-1,0,0,0,0,0,0,0,0,0,0, +0,0,1,10,14,9,6,2,1,-3,-10,-13,-14,-14,-13,-14,-14,-15,-11,-7,-4,3,6,4,3, +2,1,1,1,1,1,0,0,0,0,0,1,1,-3,-5,-8,-10,-9,-10,-11,-13,-14,-13,-13,-13, +-10,-8,-6,-4,-2,0,3,-8,-8,-6,-7,-5,-3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-3,-3, +3,1,0,-1,-2,-3,-3,-4,-5,-6,-6,-7,-9,-10,-10,-9,-9,-9,-6,-7,-4,-2,-1,-6,-3, +-2,-2,-2,-1,-1,0,0,-1,-4,4,2,-1,-5,-4,-5,-5,-5,-6,-6,-6,-7,-7,-7,-7,-7, +-7,-7,-6,-6,-6,-4,-3,-2,-8,-11,-11,-6,-8,-5,-7,-7,-7,-8,-9,-8,-10,-7,-12,-10,-8, +-2,-4,-4,-5,-4,-4,-4,-3,-3,-6,-4,-3,0,-3,-3,-3,-3,-2,-5,-10,-3,-4,-1,1,2, +1,2,2,2,1,2,1,0,-4,-3,-8,-5,-6,-9,-11,-9,-7,-6,-2,-3,-11,-6,-3,3,-3, +-4,-5,-3,1,-7,-6,-1,1,1,0,-1,0,0,0,0,0,0,0,1,1,0,-4,-6,-5,-9, +-13,-9,-6,-5,-1,-4,-16,-5,-1,12,-2,-3,-2,-1,0,-10,-3,2,-1,0,0,0,0,0,0, +0,0,0,0,0,-1,1,-3,-9,-12,-22,-31,-24,-17,-11,0,-6,-28,-14,-2,17,-2,-9,-7,-4, +2,3,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,16,25,36,40,35, +16,8,10,16,27,22,-1,14,20,26,4,16,9,-2,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,-1,-6,-15,-26,-33,-36,-27,-9,13,21,11,4,-5,-16,-3,8,21,22,9,19,3, +-2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,5,19,27,36,42,32,8,-14,-19, +-4,21,29,18,2,-18,-27,-6,-28,-48,-2,3,-2,1,0,0,0,0,0,0,0,0,0,0,-1, +1,-3,-13,-11,-13,-15,-13,-10,-7,12,23,32,-9,-28,-22,-7,11,29,-13,26,-46,-14,5,-2,1, +0,0,0,0,0,0,0,0,0,0,1,-2,2,13,10,7,4,0,-5,-11,-12,-15,-11,-9,1, +12,22,29,37,41,0,9,8,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,11, +10,9,6,3,-1,-6,-8,-9,-9,-8,-7,-5,-8,-7,-6,-6,8,8,2,1,1,1,0,0,0, +0,0,0,0,0,0,0,1,-1,-6,-6,-6,-7,-7,-8,-9,-10,-10,-9,-9,-6,-4,-1,1,2, +5,7,-5,-5,-8,-3,-3,-1,1,1,1,1,1,1,1,1,1,0,-2,-2,-2,0,-1,-2,-2, +-3,-4,-5,-4,-3,-3,-3,-4,-4,-4,-5,-5,-5,-3,-3,-6,-8,-8,-5,-7,-7,-7,-6,-6,-6, +-6,-6,-6,-5,-6,-5,-4,-2,-3,-3,-3,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-4, +-4,-3,-5,-1,0,-3,-2,0,0,0,-1,-1,-1,-1,-1,0,-1,-4,0,0,-4,-4,-4,-5,-4, +-4,-4,-3,-4,-6,-4,-3,-1,-3,-3,-3,-3,-4,-4,-1,-2,0,0,0,0,0,0,0,0,1, +1,0,0,0,-2,0,-4,-6,-8,-10,-8,-6,-5,-3,-4,-9,-5,-3,2,-1,-2,-3,-3,-3,-7, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-3,-6,-8,-11,-7,-5,-4,-2, +-4,-13,-5,-1,8,1,0,-1,-1,-4,-8,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,-5,-12,-17,-24,-17,-12,-8,-2,-7,-22,-11,-1,14,4,-1,-2,-1,-3,6,1,-1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,9,11,18,22,26,20,5,-1,0,6,16, +13,-5,9,13,14,1,6,6,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-5,-14,-20,-26,-27,-18,-2,14,18,8,2,-2,-8,5,12,17,16,6,12,1,-1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,5,13,21,27,29,19,1,-15,-18,-5,10,16,15,1, +-11,-14,-3,-18,-29,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,-9,-10, +-11,-8,-5,-1,16,24,27,-5,-19,-15,0,15,30,-4,30,-20,-3,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,-1,1,10,7,5,1,-1,-3,-7,-8,-9,-3,-3,5,14,25,32,39,42, +-3,9,4,-2,1,0,0,0,0,0,0,0,0,0,0,0,0,-1,3,9,7,7,5,4,1, +-2,-5,-6,-7,-7,-7,-7,-11,-10,-9,-7,6,9,4,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,-2,-5,-5,-6,-6,-7,-8,-9,-8,-7,-7,-5,-3,-1,1,3,4,7,-4,-3,-3, +-1,-1,0,0,1,1,1,1,1,1,1,0,0,0,-2,-1,-2,-3,-4,-4,-5,-5,-5,-5,-5, +-5,-5,-5,-5,-5,-4,-5,-4,-3,-3,-2,-3,-4,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-2,-3, +-2,-2,-4,-4,-4,-4,-5,-5,-5,-5,-5,-5,-4,-4,-4,-4,-4,-3,-3,-5,-4,-3,-4,-5,-5, +-4,-2,-2,0,-1,-1,-1,-1,-1,-1,-2,-2,-4,-5,-5,-3,-4,-4,-5,-4,-4,-4,-4,-4,-5, +-4,-4,-3,-4,-4,-3,-3,-3,-5,-5,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0, +-3,-4,-5,-7,-8,-7,-6,-5,-4,-5,-8,-6,-5,-2,-4,-5,-3,-3,-2,-7,-1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,-4,-5,-7,-9,-7,-5,-6,-4,-6,-11,-7,-5,1, +-5,-4,-1,-3,-2,-8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,-10, +-15,-19,-14,-10,-9,-5,-9,-18,-12,-7,2,-6,-6,-1,-2,-4,-1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,4,8,13,18,17,12,5,0,1,4,11,7,-9,1,4,5, +-3,7,3,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-6,-13,-19,-22,-20, +-13,-2,9,12,5,1,-3,-7,1,7,12,10,2,4,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,10,14,18,17,8,-5,-15,-14,-2,6,7,1,-12,-19,-17,-5,-17,-16, +3,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,-6,-8,-9,-7,-4,0,11, +14,13,-9,-16,-9,-5,1,9,-11,14,-12,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,-1,5,4,3,0,-2,-4,-8,-9,-10,-8,-5,1,7,13,18,23,22,-6,1,1,-1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,5,5,3,2,0,-2,-4,-4,-3,-4, +-5,-7,-9,-10,-10,-9,5,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1, +-4,-4,-4,-4,-4,-5,-5,-6,-6,-6,-5,-4,-2,0,1,3,4,-3,-3,-2,0,0,1,0,1, +0,0,0,0,0,1,0,1,0,0,-3,-3,-3,-3,-3,-4,-4,-4,-4,-4,-4,-4,-4,-5,-4, +-4,-4,-4,-3,-3,-4,-4,-3,-1,-2,-1,-1,-1,-1,-1,-1,-1,-2,-1,-3,-4,-4,-3,-3,-4, +-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-4,-1,-1,-1,-1,-2,-3,1,0,0,0, +0,0,0,0,0,0,1,-3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1, +-1,-1,-1,-1,-2,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,-1,-1,-2,-2,-2, +-2,-1,-1,-1,-1,-2,-1,-1,1,0,0,-1,-1,0,-2,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,-1,-2,-2,-1,0,-1,-1,-1,-3,-1,0,3,0,0,0,0,-1, +-3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-3,-5,-6,-3,-1,-1, +-1,-2,-6,-3,0,4,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,-1,4,7,8,10,8,5,2,0,1,3,7,6,-1,4,4,4,0,3,2,-1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,-5,-7,-8,-7,-4,1,5,6,2, +0,-1,-3,3,6,6,5,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,5,7,9,9,5,0,-5,-5,1,5,6,6,0,-4,-3,-1,-6,-5,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,-1,-2,-2,-2,-1,0,2,8,9,7,-4,-7,-2, +2,7,12,-1,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,2,2, +1,0,-1,-2,-3,-3,-3,-1,1,4,9,12,15,18,17,-2,1,-1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,-1,3,3,3,2,2,1,0,-1,-1,-2,-2,-2,-2,-4,-5,-5, +-4,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,-1,-2,-2,-2, +-2,-3,-2,-2,-2,-1,-1,0,1,2,3,3,-1,0,-1,1,1,0,0,0,0,0,0,0,0, +0,0,0,1,1,-1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-2,1,0,0,0,0,0,0,0,0,0,1,-2,-2,-2,-1,-2,-2,-2,-2,-2,-2,-2, +-2,-2,-1,-1,-1,-1,-1,-1,-1,-2, }; -const UWord32 defaultHRIR_rom_AlphaL16_fx[470 * 43] /*Q30*/= { -0x20bc6cc0,0x187d2c60,0x20d0fb40,0x1e5b58c0,0x1ff07300,0x208f6ec0,0x21e21e40,0x227fff40,0x231b98c0,0x22400500,0x21bce580,0x2129dc80,0x2085a440,0x1feba500,0x1f50d8e0,0x1ee88420,0x1e7a2340,0x1e1bc600,0x1dad7840,0x1c7fbbe0,0x1ee2e620,0x1708c780,0x121adb20,0x0748b300,0x18c877a0, -0x1233e240,0x080e9a60,0x081de920,0x086274f0,0x09c7ed60,0x08fd8b60,0x08f8e8d0,0x096fa820,0x12b862c0,0x1aa86160,0x091d3490,0x12a28f40,0x116ccd00,0x22d41740,0x23937f00,0x25cc5200,0x2848be40,0x2c640fc0,0x2e780f40,0x2f0c1840,0x2cc1b4c0,0x2aad3400,0x28b2fcc0,0x26c3ec40,0x25066fc0, -0x23681900,0x222a5040,0x20f05480,0x20256780,0x1e7ab1e0,0x1d7eaac0,0x1c6be460,0x0eca8780,0x167cc5c0,0x15e0e960,0x13f86880,0x11fb2fc0,0x1541d600,0x157fc3a0,0x15c64020,0x134c6ba0,0x16410020,0x18031d00,0x15a6af40,0x176efbc0,0x15265380,0x15a5b600,0x1c7263a0,0x169b7620,0x1ff14a80, -0x25dabf40,0x292fa5c0,0x2ed910c0,0x36f18f00,0x3a9f3280,0x3c3e56c0,0x3892bf00,0x3524b300,0x31e3c180,0x2e31de80,0x2ae9c8c0,0x279ce280,0x25185340,0x2267c040,0x20b43c00,0x1cd710e0,0x1b8cf160,0x15a0f460,0x10254740,0x0e6fc190,0x0ede2990,0x0db54500,0x09a818c0,0x0d0f8bc0,0x08b2a3a0, -0x0e964ae0,0x08f9eb90,0x0db122d0,0x0a7486d0,0x0d6e18a0,0x0ea7e4a0,0x102619e0,0x105e5e60,0x16aca080,0x12097c20,0x20464e00,0x27efeb80,0x2d074ac0,0x368da080,0x44470080,0x4accae00,0x4bb9a080,0x43df3700,0x3cde7780,0x36e59a00,0x310a0940,0x2bc16b40,0x2722b200,0x23806a80,0x200cfc80, -0x1dda8dc0,0x19355760,0x1649dc20,0x1067cda0,0x076cf1b8,0x0a3f8210,0x03fc73d0,0x04fc8aa0,0x03adfc0c,0x031c4670,0x02027f4c,0x0137cb58,0x03e81e38,0x02b242b0,0x05555b80,0x0712f6f0,0x096f41a0,0x0acb4830,0x0bc5e6c0,0x123bf500,0x18935d20,0x22de8900,0x2e5ec2c0,0x36eb7e00,0x40290780, -0x450f0b00,0x4b25e200,0x50cb2d00,0x5869bb80,0x597b2980,0x52c7ce00,0x50e8f600,0x4c3fb200,0x46d4b100,0x3fa9bc40,0x385446c0,0x321df9c0,0x289664c0,0x2223e300,0x18500300,0x0c1bf740,0x0ce4eae0,0x0832ec20,0x06305d00,0x03b979a4,0x02d3a318,0x02d7cd00,0x03992738,0x05627e48,0x0493eaa0, -0x066adf30,0x06dac0b8,0x0a3efc00,0x0acbfa10,0x0ed49c00,0x1456d860,0x19be3300,0x2742ccc0,0x37d51640,0x3e98c740,0x49ccf380,0x50505700,0x54e5dd80,0x535b2980,0x57d99000,0x552f7e80,0x4e10f500,0x4ba6d900,0x4716cd80,0x41970b80,0x3a020340,0x3364eb40,0x2edb73c0,0x278c0000,0x23f86340, -0x19aca2c0,0x12280f20,0x0f796fd0,0x0bc539f0,0x0a0b7ae0,0x07576aa0,0x04d85f28,0x0452b550,0x0402d470,0x038b3480,0x04cf0840,0x05342e88,0x0a650cc0,0x0b3264d0,0x12f36ba0,0x145eebe0,0x1be1cbe0,0x1c9d4180,0x3338e6c0,0x4842fd00,0x4e962f80,0x556c4180,0x51ce2c00,0x4ea0a400,0x4d0d7280, -0x4dc0e080,0x50477100,0x52921d80,0x4dd0ed00,0x471b9f00,0x3f2fdd00,0x35caf080,0x2df25400,0x2970e5c0,0x213a6dc0,0x1e1017a0,0x15ce39a0,0x121fcfe0,0x10955de0,0x0e4ca390,0x0b6785a0,0x09bb4820,0x07e76600,0x059af930,0x05f7f318,0x0869d250,0x05c6acc8,0x0627d4f0,0x07cb2c88,0x082b2ae0, -0x13ba3280,0x11c3bea0,0x1d0a9080,0x222d8980,0x3c051a80,0x4b233300,0x4eca8880,0x4c8ca780,0x4f67f280,0x54ce6900,0x5b1f5680,0x59ace100,0x55f53680,0x4e6be800,0x4aad5b80,0x44edc400,0x3cbd3b00,0x375b9580,0x2fa50c80,0x259d70c0,0x1e8e22c0,0x1b6ff960,0x17a89b40,0x0e407580,0x114bdc80, -0x0f70ec10,0x0bbc7480,0x09d80200,0x068e4580,0x074c1c48,0x05b00168,0x0f2e2770,0x0948bb60,0x06cfffe0,0x0bc0cde0,0x098ec8c0,0x1478a2e0,0x10c41880,0x1ce15920,0x26938ec0,0x3e96d0c0,0x4ec67a80,0x53070f80,0x5267aa00,0x537d1900,0x54677700,0x57ee1000,0x530ba900,0x5158b700,0x4ff61700, -0x489c6b80,0x40c88580,0x3935bd40,0x2e25acc0,0x260737c0,0x1fca51a0,0x21f4a5c0,0x23fc2b40,0x218a3580,0x1376bb60,0x1795d9a0,0x0e682640,0x0d9b1ca0,0x0f01d980,0x0b90fc70,0x0755e200,0x09e2c9c0,0x067d1ba8,0x0afdb940,0x0c62bea0,0x110a3040,0x1138db80,0x10e99360,0x14276200,0x26947100, -0x1e4ee7a0,0x390471c0,0x45025c80,0x44b6cf80,0x46826300,0x49e3f980,0x4b27bd00,0x4a978100,0x47843580,0x4391f980,0x3fcfe1c0,0x3ae49380,0x35ec8f40,0x30a6f300,0x2b31ebc0,0x26e42ac0,0x242d0d80,0x27446380,0x2b0dd540,0x20aabd40,0x167f8a80,0x1bcea1a0,0x148a24a0,0x1315f320,0x0eb93920, -0x0a9c8270,0x09bb41d0,0x08093b70,0x135a74e0,0x0dbd7e40,0x0e09a290,0x10fe4ec0,0x12265a40,0x18ac2b60,0x19f5e4a0,0x260b2f80,0x2527c080,0x329a3240,0x3bbe59c0,0x3cd53680,0x429dbb80,0x429a6280,0x4338b080,0x43dd1d80,0x406d1f00,0x3d4b9700,0x39e39480,0x35913e80,0x3121a4c0,0x2b7bc440, -0x2aa91d80,0x28c16bc0,0x26decfc0,0x24e62a80,0x28349f80,0x22c037c0,0x17c48d40,0x16a35120,0x156d21e0,0x14d40380,0x0cac1660,0x13e33440,0x0adbd830,0x181a5900,0x0aa1d740,0x13697a20,0x0c72eee0,0x0f9a8390,0x142410e0,0x168bc860,0x181ad440,0x23d19840,0x12b3e5c0,0x3315a940,0x33682680, -0x34301980,0x36016780,0x37561b40,0x39361640,0x3b72f7c0,0x3982b5c0,0x38108740,0x368c6f80,0x348b0580,0x329cd940,0x2fbcf940,0x2ef56700,0x2db8be00,0x2d27f6c0,0x2c0164c0,0x2ba645c0,0x2a78a0c0,0x109b6980,0x21dbeec0,0x21c57e80,0x1fef2040,0x1c435600,0x22818640,0x23bdd480,0x23f1d900, -0x1e98e3e0,0x24f14240,0x26f46940,0x21020f80,0x2408bf80,0x1ff37620,0x20d276c0,0x2baa6a80,0x25a719c0,0x35b918c0,0x2ff30f80,0x31f98800,0x32131740,0x32c213c0,0x332a8940,0x3407ea00,0x32f62b00,0x324f95c0,0x3191d140,0x30fdcf40,0x30779940,0x2fd9ddc0,0x2fdae300,0x2fab8b00,0x2f66e1c0, -0x2f3967c0,0x2d99f200,0x3324cf80,0x230398c0,0x19cc1620,0x053193c0,0x2723b640,0x1a631ac0,0x07996920,0x07772748,0x07ddb900,0x0aa846e0,0x08913300,0x08c03510,0x09accd10,0x1ae4f760,0x2a611580,0x084a2ad0,0x1a436740,0x3642d600,0x138d7900,0x17e88860,0x10f2b1a0,0x135d2d00,0x12b9ea80, -0x12c19d00,0x1262e6a0,0x1203d4a0,0x111b2d00,0x11449380,0x11326aa0,0x114d3a60,0x11600b60,0x116c1c00,0x117d0b20,0x113eb080,0x113fff60,0x1155d820,0x1196db00,0x1232e4e0,0x100f5220,0x17129640,0x1a8769c0,0x215926c0,0x148685c0,0x199e13e0,0x1ff76a20,0x201a5180,0x1fca4d60,0x1f0d0d60, -0x1f8197e0,0x1fcd99a0,0x1fbca1c0,0x19cda440,0x13e04760,0x21217dc0,0x1ba944c0,0x21510f00,0x1695e4a0,0x165dda00,0x166b9cc0,0x15b050a0,0x14484620,0x12b78c40,0x10c43fa0,0x11a6bc00,0x1250ff60,0x1342d520,0x13b105c0,0x13d25160,0x13cc7c60,0x12ea0e20,0x12bb33e0,0x12c177c0,0x139d8280, -0x139665a0,0x13d899c0,0x1cac0380,0x156b9a00,0x14b6bec0,0x1532a7a0,0x15cc33e0,0x12718880,0x127f1260,0x12acbbe0,0x14d070c0,0x120f3fc0,0x10d01820,0x14362f60,0x145b9ce0,0x17a12c80,0x18551ec0,0x15bd7740,0x1e4ba7e0,0x1d8c2ea0,0x1a8dddc0,0x1b9480a0,0x19842f80,0x161c9620,0x1370c300, -0x0f162640,0x107e8760,0x10f30da0,0x11f5ac00,0x12775e20,0x128dc7c0,0x129a1000,0x112fea40,0x11352cc0,0x119102e0,0x138b6220,0x13257200,0x159752a0,0x16ad92a0,0x153c5320,0x131bab60,0x12235b60,0x12ddf4e0,0x0f84db00,0x12685ca0,0x0f635650,0x132187c0,0x0efbfcc0,0x117daf40,0x11e2eee0, -0x140a3780,0x161d93c0,0x18269400,0x18fc0960,0x229b5800,0x225a0a00,0x1ee02500,0x1f632940,0x1b37fe80,0x13f7d060,0x0e774630,0x091881f0,0x0e239990,0x12089320,0x157d21e0,0x17241780,0x177cf520,0x16de6bc0,0x140967e0,0x13114340,0x12d56bc0,0x14893160,0x14a5e220,0x15627fe0,0x150f3920, -0x1003fd80,0x0f047e90,0x0c3e2cc0,0x0a86d330,0x087c0880,0x08815790,0x086caa00,0x095c8120,0x08df3020,0x09bab0e0,0x0ccade50,0x101fd4a0,0x137a58e0,0x15b52900,0x1ab497a0,0x27d9a980,0x28ecdac0,0x29b84f00,0x29f6a640,0x28dc3400,0x27d52b00,0x23daf800,0x1dc1eb40,0x10cac600,0x08b9c530, -0x07bc2d00,0x0248a200,0x0105c63e,0x026c2f6c,0x0374820c,0x072828c0,0x0b58ca30,0x11920000,0x12d7bc20,0x14435a80,0x1746c560,0x12608d00,0x10940920,0x0cbf8910,0x0ac02bc0,0x09231db0,0x09cd19d0,0x09cc4440,0x0a1cab50,0x090b35d0,0x0b470eb0,0x0f7f2410,0x13d8b0a0,0x1907a1c0,0x1c467060, -0x22a83040,0x2f8cc2c0,0x2d766480,0x267bc240,0x292a4240,0x2a9d6100,0x287aa4c0,0x2574e0c0,0x25b9ff80,0x1cf8a000,0x195febc0,0x190fd3e0,0x1430ea80,0x1129a7c0,0x0f9bc930,0x116841c0,0x12f9bee0,0x1368a400,0x185e7940,0x18b3ed20,0x1b01c3e0,0x18a82300,0x1357ed60,0x10053d40,0x0c5989f0, -0x09fdf750,0x07f22230,0x083c9e40,0x0a2ca2a0,0x0f88d940,0x0ef41970,0x11ade340,0x158d0100,0x18572aa0,0x1b3a57a0,0x229ba780,0x26e00100,0x31fb7880,0x2b1c6a00,0x1f966460,0x217c1140,0x1fed9080,0x2cd1a480,0x34a04600,0x328b5ac0,0x2ef02780,0x24815900,0x15f18d00,0x0f68e270,0x0cd3ca80, -0x0e5eceb0,0x12d3c740,0x168067a0,0x17acd640,0x1c878ce0,0x1d1219c0,0x1ee38b60,0x1c9b4020,0x19ce9aa0,0x16abc000,0x11ebbcc0,0x0fa84920,0x1051b520,0x12a42ec0,0x1399f600,0x1b88bfe0,0x12448da0,0x1292b660,0x15399d00,0x1ba8cc60,0x1ba29c60,0x2501f380,0x250c2540,0x31146f00,0x221273c0, -0x16792ae0,0x1fb9ebe0,0x32797d00,0x2ef2a1c0,0x284240c0,0x1f6827a0,0x1c796e20,0x17c3f400,0x14ec3260,0x11188180,0x0f957090,0x116aee20,0x11529bc0,0x14697a00,0x1a011920,0x1db288c0,0x1ed55ae0,0x1f5ac100,0x21ce70c0,0x1e3c3a00,0x1c272ec0,0x18ea9aa0,0x159eb7a0,0x144a3000,0x0de72ef0, -0x131315e0,0x269cddc0,0x16456220,0x147ae2a0,0x165eddc0,0x1b611240,0x1b3f6240,0x254db440,0x2806c940,0x27b52f40,0x13cb0dc0,0x0f778c70,0x1737d060,0x1eb10f00,0x22788b40,0x21873000,0x1828b080,0x14df4c20,0x0f316860,0x0bfecb00,0x0d2c8130,0x1002ae00,0x1342b8c0,0x19f65940,0x1ec7f7e0, -0x221de240,0x1e72dc40,0x1b0b0d00,0x1c727dc0,0x23402580,0x1cec5180,0x1e467b00,0x1adc8dc0,0x1680d3e0,0x1608c5c0,0x16d8bf40,0x17859620,0x1f84ad00,0x188d4540,0x181393a0,0x1528cac0,0x1b0c5b00,0x20552940,0x2468b8c0,0x1c7566a0,0x301a94c0,0x178aa5c0,0x100ec180,0x19649160,0x1e5015a0, -0x20e7b440,0x20556180,0x1cd44100,0x1d5c6da0,0x1da9d840,0x1d9abc20,0x1bbfe9e0,0x1c04d400,0x1dd0b860,0x2089e100,0x2212fcc0,0x21afaa40,0x1e76eda0,0x18170ee0,0x1d475fa0,0x25451180,0x1b8b85e0,0x1db4a5c0,0x1a87b2e0,0x1a072480,0x1a23f8a0,0x1af0a460,0x1c6f56a0,0x14fefac0,0x1abac480, -0x1ae5fca0,0x1906e100,0x1af4dce0,0x1a03ad20,0x1fa555a0,0x1c91afe0,0x26c766c0,0x1c8482a0,0x16abd440,0x1bd11740,0x1addcbc0,0x1ad4b1a0,0x1af82a60,0x1c12b1a0,0x1dd8d300,0x1f698580,0x215e2500,0x23a1c080,0x25c0cb80,0x28b12740,0x26eaef80,0x267fb600,0x25ce7740,0x23942480,0x1bd2c720, -0x1dc9c840,0x25789180,0x22b0fb40,0x208116c0,0x1e99aee0,0x234ba300,0x1b740620,0x22515f00,0x172e6600,0x2286dcc0,0x1b2c8100,0x22e86800,0x2024cec0,0x22951840,0x2513d840,0x297b4ac0,0x228743c0,0x3732c5c0,0x15fa15a0,0x16215340,0x1723a8e0,0x16d90160,0x177583e0,0x1767e640,0x173b6240, -0x18539140,0x1973f600,0x1a774e80,0x1c182a20,0x1db49f80,0x208bce40,0x1f095c00,0x1e0a5640,0x1c7fa920,0x1ba096c0,0x19920dc0,0x196ac280,0x329ac5c0,0x1e86a9a0,0x1dcb8fa0,0x1de803a0,0x1faae060,0x17042780,0x1690cf40,0x17a98740,0x1d250e80,0x173edc80,0x1451afa0,0x1a66db40,0x1a3c1480, -0x20dc49c0,0x2263e540,0x18c5b860,0x1ff01d00,0x0b41eb80,0x12829e40,0x1105b240,0x1149c960,0x11559fe0,0x117acf00,0x118034e0,0x1240b420,0x12ddb1e0,0x13859da0,0x1407fc80,0x146a2600,0x152f5640,0x141bd3a0,0x138e10c0,0x12f03600,0x127b5140,0x134e8520,0x0c50b380,0x20f91780,0x2a70b980, -0x3cf65240,0x1a226500,0x2823f340,0x38ba3e80,0x3943a5c0,0x3888e580,0x35ffc4c0,0x384f6640,0x38aafe40,0x37961680,0x2876a000,0x17c51ce0,0x3bbaa3c0,0x2bb1ae80,0x1152fa20,0x0941a1a0,0x07567740,0x07c41320,0x077eecd8,0x074dc770,0x072015d0,0x0732c630,0x077e7370,0x08442300,0x08ac1880, -0x08fb2a80,0x0917bbd0,0x090baf10,0x091c6180,0x09445db0,0x09589530,0x094f90e0,0x09372750,0x08f11d30,0x08c16b60,0x08b8a140,0x07e56b90,0x0752c578,0x06ab0950,0x0804cb10,0x0724abf0,0x06687de8,0x06b393f8,0x06d51be8,0x07117dc8,0x06661270,0x062fbf78,0x06385620,0x06ef1858,0x07b84ee0, -0x06c339c0,0x070e9ee0,0x0753c650,0x066ada10,0x063a38f0,0x05ae7930,0x0555fae0,0x057114a0,0x069e5d20,0x08fc7bb0,0x0a29ded0,0x0ace54d0,0x0a9757d0,0x0a5d7ec0,0x0a6fe9c0,0x0aeeee70,0x0b5be3d0,0x0b6d5e60,0x0b240fc0,0x0a75ecd0,0x0a00af50,0x0990b3e0,0x093126c0,0x09a542b0,0x097f0930, -0x09050b70,0x08e42720,0x08b0e460,0x098bd9b0,0x0997e540,0x09a4eb80,0x08cdecd0,0x086bb530,0x07e45a28,0x0775a7b0,0x077e6698,0x08919090,0x080ec1f0,0x07863960,0x04553db8,0x029b9c0c,0x016cbba2,0x009fafd5,0x01439742,0x0326065c,0x081ff820,0x0a62a9f0,0x0c0f5240,0x0c1ef750,0x0c07cbf0, -0x0c64a540,0x0d665c10,0x0dfffa00,0x0dfaae70,0x0d26bde0,0x0bff1470,0x0b065d60,0x0a619aa0,0x0b101660,0x0a943b50,0x0a358580,0x099d4e60,0x09475d00,0x080ed9b0,0x09e36d10,0x0a919ce0,0x0ad0baf0,0x0876fd10,0x0748ee68,0x079b1c70,0x0720cdb0,0x07897c58,0x092a4600,0x08242be0,0x05f51d60, -0x01382292,0xfeed4044,0xfdaf13f0,0xfd189a98,0xff3b38f1,0x038f9abc,0x0b35bce0,0x0ddadc80,0x0ebb5cd0,0x0d63ffc0,0x0c4a8d10,0x0c73a3a0,0x0e22d400,0x0f98ccc0,0x0fd475c0,0x0eedc860,0x0d5f40d0,0x0c365dc0,0x0bca1090,0x0d8218f0,0x0c753dd0,0x0bc530e0,0x0acd2a40,0x0a411600,0x089c3540, -0x09ee07f0,0x09b9ee40,0x0af2af10,0x06fc8dd8,0x05933ff0,0x05e2a028,0x04ebc908,0x06750760,0x0902f9f0,0x06303db0,0x0f5695c0,0x0640ac20,0xfb12e248,0xf592b1e0,0xeddb4e80,0xe87bfea0,0xe77d8c20,0xecb7f620,0xf73226f0,0x00fe45d1,0x06bff068,0x0cf1e4a0,0x10832220,0x1222fec0,0x12af0ee0, -0x123ed060,0x1200d4c0,0x0e210fe0,0x0d1450c0,0x0e0a94f0,0x0d7f2fb0,0x0d29e940,0x0c69c210,0x0b0187b0,0x09825390,0x0660eb90,0x09b4cd30,0x0a8feca0,0x0aa09f20,0x09b96c50,0x0ac3d030,0x0dced7b0,0x0db0c720,0x0f687f40,0x0fd011a0,0x0fa6d4b0,0x0051fab4,0xf644c100,0xed286140,0xe87035c0, -0xdabdf980,0xda939bc0,0xda82d7c0,0xdb299080,0xe0ffc940,0xe7533060,0xedb0d200,0xf60631d0,0xfeb6d3d6,0x0764fa10,0x0c4f7430,0x0f684ef0,0x10c28dc0,0x0e3b72b0,0x0d14d6d0,0x0e4d6630,0x0e82c880,0x0d22c220,0x0bcbd370,0x0b0ce140,0x0a024ef0,0x076f39f8,0x0a6d7bb0,0x0b112570,0x0e45c1a0, -0x0b9312d0,0x0b2ed130,0x0764e220,0x08069540,0x03c3ed10,0x02aba1c0,0xfd507b6c,0xf4ae1fb0,0xeb096180,0xdfe6b540,0xda3f5880,0xd1a8dcc0,0xcaca8c80,0xc45159c0,0xc4504cc0,0xc91c4680,0xd32bf200,0xe1e08040,0xed217b60,0xf6ad3250,0xfda53a4c,0x0117535e,0x05f319a8,0x0be48a40,0x0f3f6cf0, -0x0fcac9a0,0x115f62c0,0x1257cf20,0x104ba760,0x0df436e0,0x0d888830,0x0b96a350,0x06bba518,0x06bba0e0,0x093ee400,0x12835860,0x0a70cf60,0x08369500,0x07f40748,0x06a063e8,0xff49f83d,0xfec6d688,0xf73a6ef0,0xeb3f0580,0xe2121d20,0xdc2b7500,0xd28aca00,0xc4e6ff00,0xc98c1c40,0xcdd97900, -0xd2efc080,0xd711c780,0xde038280,0xe608c460,0xeea094c0,0xf68d9af0,0xfc839ad8,0x04cb6568,0x09c429a0,0x0ba7a5c0,0x0e7897c0,0x0de74820,0x0d078760,0x0caa7ec0,0x076bc230,0x069bcc68,0x07a594b8,0x08016c90,0x07933ee8,0x0d53cfc0,0x0ccd5500,0x03011f80,0x092bbcc0,0x09be8e00,0x03362744, -0x05052320,0xff06ace0,0xfc7f9bf0,0xf32c4ef0,0xe9a41140,0xe825b300,0xde274400,0xd4c10c80,0xd0d3b940,0xd378bfc0,0xd956f480,0xe4a51d20,0xeca3a6e0,0xf4a3cdc0,0xfaa21670,0xff1bfc88,0x027579b4,0x05625680,0x0535d800,0x05e14618,0x07344b48,0x08500c80,0x067d5fc0,0x0240b6b4,0x0348cbfc, -0x01946d84,0x03b3cfd4,0x03e503a8,0x044eb978,0x04bd8910,0x08e23850,0x07577f90,0x028e3fe4,0x029609c0,0x0197a68e,0x00c9e75c,0xfd12fe88,0xfb25ae68,0xf751c1c0,0xf2a90640,0xe7c00480,0xe8b4a760,0xe5664d60,0xde96a240,0xdbbd4c80,0xdc581f40,0xe013c8e0,0xe6e9b620,0xecb39e80,0xf2b1c410, -0xf8d70798,0xfd4f49a4,0x00672fce,0x03093788,0x0129316c,0x00484d93,0xff95e007,0xfdf980a8,0xfdeff350,0xfc539da8,0xfa98d7d0,0xfcd84938,0xfd30675c,0xfdf95020,0x005e2387,0x035fcfac,0x022f99cc,0x011f1a36,0xfeaa2bfe,0xff12c10f,0xffc755c4,0x005cde2e,0xfd3e23ec,0xf9b11660,0xf55cc840, -0xf135bae0,0xe9b398a0,0xe8db3040,0xe96fcbc0,0xe5fa79a0,0xe3e39000,0xe5bd70a0,0xe6d85840,0xe707f100,0xe9346720,0xeb29ec20,0xed40f740,0xed947de0,0xee56cce0,0xef72f540,0xefba37c0,0xefc3cf20,0xefd1a360,0xf0d569a0,0xf3674090,0xf364dd20,0xf3bb7c50,0xf5d8ebb0,0xf7c67d30,0xf9fb8068, -0xfb0979e8,0xfc8858d0,0xfc560e1c,0xfcd18a0c,0xfb8fa080,0xfc658770,0xfac0ed18,0xfb6aee48,0xf75cac10,0xf4f9dcf0,0xf0d40a80,0xee571740,0xe9cc0560,0xf0b08d80,0xf0c4c760,0xef89c440,0xeee03820,0xedb0fdc0,0xeca51420,0xeb939ce0,0xeba9b540,0xeb770b80,0xeb78ace0,0xeb466ba0,0xeb12e060, -0xea74dd80,0xebc38300,0xed0023a0,0xee5eb7c0,0xef890060,0xf14f0950,0xf19107e0,0xecacfe20,0xf2ef0d30,0xf3547c20,0xf423c490,0xf4f0ac60,0xf8237c80,0xf8235108,0xf72073d0,0xf61b6f10,0xf7501340,0xf8b93f58,0xf75038f0,0xf5c1f970,0xf2aafc20,0xf16cf810,0xf2dcf670,0xed921840,0xf5c701f0, -0xf36a5510,0xf369a820,0xf33ea430,0xf2d226f0,0xf2843b30,0xf20ee070,0xf1f44f20,0xf1beeef0,0xf183c400,0xf16a4950,0xf15bb900,0xf1101dd0,0xf1e59d00,0xf26e2010,0xf30910e0,0xf36f3190,0xf3b70450,0xf6190e40,0xedf21940,0xeb4cc820,0xe8fb8900,0xf1569980,0xece4d740,0xeac3c600,0xea7f30c0, -0xeafeca20,0xeb75cea0,0xeadb6c40,0xea7997a0,0xeaedb3c0,0xecd32840,0xf1bbe190,0xe899d080,0xea878520,0xf3d83ab0,0xfdf221e0,0x0147bf16,0xfcc29c70,0xfe40a5d2,0xfdd2d0c8,0xfddf0968,0xfcd46fd4,0xfc575568,0xfbc2c608,0xfc44607c,0xfca26bf4,0xfd210164,0xfd7bc310,0xfdb26550,0xfdc2fec8, -0xfdb8c600,0xfdb4b510,0xfdaf9d40,0xfda197b0,0xfe1524ac,0xfcd2b77c,0x01365b12,0x0391f868,0x0866c9a0,0x0027ebe4,0x0385a240,0x07e7e1e0,0x0846c130,0x084aa990,0x07ad41b8,0x080a6360,0x080587f0,0x07cc82f0,0x03a32384,0xffe95df3,0x07acc740,0x03d77efc,0x05075ee0,0xfdb6797c,0xfe79d984, -0xfe3b37ca,0xfe011912,0xfb4198e8,0xf98b3910,0xf8189680,0xf8806c28,0xf97f4b58,0xfb378338,0xfc90f140,0xfd5e6040,0xfd775b8c,0xfd6ad254,0xfd4f0a70,0xfd28ea60,0xfd284734,0xfd2b7824,0xfdee6738,0x04a8dc08,0x00a50d4b,0x0124caca,0x01afdd0c,0x02c6c194,0x0150177a,0x0203de4c,0x0271d778, -0x03b1513c,0x024bffc8,0x015070aa,0x025b7bac,0x014dee90,0x027033e4,0x028f053c,0x0055dee1,0x01d93fd2,0xfd7e4764,0xfe6a4b1c,0xfe2336d4,0xfda7aa78,0xf7f01ce0,0xf52f3a80,0xf2471c90,0xf37752a0,0xf5b9a100,0xf8ba1880,0xfb121b28,0xfc6b42ec,0xfc7a6a80,0xfc75aebc,0xfc3af5b8,0xfc30ff54, -0xfc4e84a4,0xfc203dc8,0xff3c700c,0x01a95bdc,0x027f0598,0x01b5672c,0x0204abe8,0x044b1478,0x029a0688,0x06a6b068,0x04a667e0,0x07e437f0,0x0578cd58,0x0703c210,0x05c27178,0x03fc72d4,0x035e3000,0x03ed2034,0x02433024,0x05587bc0,0xffc435b6,0x01be84e6,0x01f10740,0x00b5e36a,0xf71c07b0, -0xf0c55e10,0xec1b9fe0,0xecb413a0,0xf0c80970,0xf6d06d10,0xfb3165e0,0xfd9d60a0,0xfdbac4e8,0xfd1fc4bc,0xfcd5eaec,0xfca0517c,0xfc25a57c,0xfc271b88,0xff9747d9,0x046ed2b8,0x028208fc,0x066516e0,0x04e5f2b0,0x05226300,0x042a82d8,0x07bdbca0,0x09cb2580,0x0969adb0,0x07caf4a0,0x06e14430, -0x070f3af0,0x045e81c0,0x046e6670,0x05f7fd30,0x05ab75b8,0xee5f1060,0xe9903c80,0xecb67880,0xed3f6260,0xef9ae8c0,0xf4968ef0,0xf85e66e8,0xf92bc878,0xf56b5a20,0xf18b7920,0xf17bdcf0,0xf0fdcc10,0xf2044570,0xf4a02940,0xf5c35df0,0xf67b2c20,0xf59e6410,0xfa15ffa0,0xfad5be60,0xfd407a54, -0x03c50dd4,0x01859a06,0x048621e8,0x052f8b10,0x074ffee8,0x071543b0,0x092f2d60,0x0908baa0,0x085d2c20,0x08099060,0x06967c48,0x04c5c538,0x01d95ff4,0xff06c608,0xf9789098,0xf3594ee0,0xeea2fd60,0xee083620,0xf0e16d80,0xf42b9b40,0xfddb033c,0xfb5a9698,0xfc6f02d8,0x0090989e,0x033d0d4c, -0x0515ebd8,0x055c1438,0x05fe6d88,0x04b09ab0,0x01949e44,0x01837fc8,0x0103da46,0xffa09c11,0xff4d22bd,0xfd0c5cfc,0xfe2ec21c,0x01d5103e,0x038262d8,0x04fa0ba0,0x053803a0,0x06ce46e0,0x073d18e0,0x0a2d6a50,0x0ae88dc0,0x09f30e00,0x059015e0,0x022fbee8,0xfee1b63e,0xfd6a3520,0xfa56c758, -0xf77ba340,0xf3985300,0xf39de9e0,0xf40daf10,0xfc8de894,0xffec2719,0x05f8b218,0x0c8bec60,0x14671380,0x1d647aa0,0x1fe87c20,0x20a55880,0x1dfc5100,0x1b6b39c0,0x18207ba0,0x146d7ee0,0x1438c280,0x10e2c100,0x0b708270,0x03837970,0xfded6b7c,0xfd48bef8,0xfbcef7a8,0xfb221ed8,0xfe88f8d4, -0x00c52903,0x03953898,0x032d8a4c,0x0ae71e20,0x0b6ffeb0,0x044addc0,0x072b33b8,0x05d50f58,0x00aeeb88,0xffbc622f,0xfe3a55b2,0xfa8bb8a0,0xf87f15f0,0xfd7b1068,0x01cfa670,0x097b7ac0,0x0d09b550,0x0ddc68d0,0x0f79e950,0x1445e0c0,0x1dfd6d00,0x21d2f980,0x2530ff00,0x2501e5c0,0x22d254c0, -0x1f0e19e0,0x1ac274c0,0x138ae9e0,0x0d7af4d0,0x098eac00,0x048db608,0x00361e93,0xfe04e984,0x00614248,0x000fb4a7,0x0038e058,0x00e8bfee,0x02068a40,0x012cc936,0x09842b60,0x0b226030,0x022c987c,0x08e52d90,0x06c1fe80,0x003e8f09,0x0019d39d,0xff942d57,0xfd58c788,0xfd373c64,0x08403ff0, -0x0bfce350,0x111cc580,0x12ba7e20,0x0f4addf0,0x0d49f3a0,0x0caf6240,0x0db47710,0x0f825e80,0x116eec00,0x1276bb00,0x1387b3c0,0x1304a320,0x10ff6680,0x0fc478a0,0x0c8491c0,0x079ac908,0x02bb1510,0x00255f33,0x01c71968,0x0401dad0,0x0374cb48,0x04d05aa0,0x0526fb98,0x0604e788,0x071ec218, -0x07e93038,0x08bdb910,0x09ae3c40,0x09210150,0x07e71520,0x06c52048,0x059c8f58,0x039259e4,0x031f7f7c,0x04ffd658,0x0be47060,0x0c6d3730,0x0daa6390,0x0e999410,0x0d735ef0,0x0c1c4770,0x0a8b12d0,0x08cc24c0,0x07892aa8,0x068184a8,0x054d8150,0x03effffc,0x032644ac,0x02ab8d20,0x038a0e90, -0x04132118,0x05307208,0x06687968,0x066dd660,0x08513450,0x0a9f5610,0x09763bc0,0x09d60f50,0x0a836f50,0x0a099140,0x08c73600,0x089c7300,0x082fcbb0,0x093d7150,0x0762a180,0x06007048,0x0467cda8,0x06ac4838,0x0881fc50,0x092c10d0,0x0ab1b0a0,0x0b27a470,0x0bcb0cf0,0x0bb6f270,0x0cbba9d0, -0x0dac15d0,0x0caa8990,0x0bee5f40,0x0b7c0ef0,0x0ac94ca0,0x0a442520,0x09f0bf00,0x0a6d3eb0,0x0aaa6540,0x0a88c6b0,0x0bb222f0,0x0cf964c0,0x0e458640,0x0ef94b60,0x0edf3a70,0x0f6e88c0,0x0f1fa0a0,0x0eaf8ab0,0x0e08edc0,0x0c3ed770,0x0aece5a0,0x09abac90,0x0927cc60,0x089c93f0,0x0875ea60, -0x072b1d40,0x06f8a578,0x0595a088,0x07024ae0,0x078c9008,0x092b8ea0,0x0a02fdd0,0x0ed5bfa0,0x0d528b00,0x0cfa6be0,0x0d9a3310,0x0dd6aec0,0x0e646a30,0x0ef992f0,0x0f7f8c60,0x0fcd4280,0x10145d40,0x10318c40,0x106f3880,0x10ba7fc0,0x111dd6a0,0x112e78e0,0x111c1360,0x10ef6a40,0x10cdd880, -0x106ed740,0x1134b660,0x110849a0,0x0ef770a0,0x0ed65ab0,0x0e1fc3e0,0x0d81e630,0x0c6f9100,0x0bdbdf20,0x0c3897b0,0x0c5b3aa0,0x0b7f9890,0x0a47cc10,0x0ac6b490,0x0b3d0750,0x0c7db640,0x0cdbad00,0x0c423750,0x0feb8200,0x0bcb80a0,0x0ca66210,0x0ccc2230,0x0cdd1470,0x0d134770,0x0d330de0, -0x0d5f2db0,0x0d8e1ee0,0x0dc99550,0x0e0fd730,0x0e3e2aa0,0x0e6644e0,0x0ea136b0,0x0e54c300,0x0e2adf00,0x0e0178d0,0x0e0229b0,0x0dd53970,0x0d3b4d60,0x10f73dc0,0x11b99000,0x10ad4ba0,0x0f52b380,0x10d35480,0x104934a0,0x10609140,0x101128a0,0x0fb8b530,0x100052c0,0x10285920,0x0fc96520, -0x0fe689b0,0x0e0c7db0,0x100734a0,0x10c8f960,0x0e1b7380,0x023ef3d8,0xfefecf38,0x02e1741c,0x01e17154,0x0227852c,0x01bc7b28,0x024f0c34,0x02a32b5c,0x03794e7c,0x02be6d68,0x02851fa0,0x024f2420,0x025cba6c,0x0265caa4,0x029197dc,0x02753640,0x025ceff8,0x0226fb30,0x021a7f8c,0x01b5a400, -0x02d37f78,0xfecd57e4,0xfccd7fe0,0xf91e1130,0xffe0927e,0xfd3b99a0,0xfa4c9fc8,0xfa425570,0xfa7ea7d0,0xfacd68e8,0xfacb0268,0xfaada4a0,0xfa64ff38,0xfd6f4ee4,0x00a75cc4,0xfa38e7a8,0xfcfa6230,0xfc51daf8,0x015a4420,0x019a712c,0x01220a70,0x003e67fe,0x018cfb2a,0x02ad83b4,0x0509f030, -0x03ab27bc,0x031a7784,0x0265d9c0,0x026a3e04,0x029aa264,0x0323f900,0x0312a790,0x02cd38c4,0x02419874,0x01f851aa,0x01e32a80,0x01602760,0xfc14b9c4,0xffa8feea,0xff8f6cb7,0xff2f7209,0xff165250,0x01b8a146,0x01c8ef86,0x01ea8786,0x0087a0a3,0x029d9148,0x03001c70,0x007cc6c3,0x010c77e0, -0xffbd3a9a,0xfff35bf1,0x016da906,0xfed4182a,0xff97ba09,0x019dad82,0x010dfac4,0xffcac6ef,0x036e8038,0x05724ee0,0x0a7250a0,0x06696b68,0x048a6bb0,0x02f73ba4,0x02f6fedc,0x03517414,0x046b5388,0x04077198,0x038ffe6c,0x0257122c,0x01b7eb0a,0x01841c46,0xff8bb07e,0xfe1eb88c,0xfe0b457c, -0xfe921662,0xfe96cbac,0xfeaaa2a4,0x026b07e0,0x00e84020,0x02b16894,0x0066c599,0x0366f89c,0x0207a02c,0xffdc8c7c,0x0042d21e,0x004c9dea,0x00574299,0x000a0e80,0xfe47b962,0xfda13b74,0xfee12b3c,0xfcb78438,0xfa350c80,0xff2a304e,0x03ea8978,0x0be1c810,0x06f9fd30,0x0361bb24,0x005b31b5, -0x0058fd4b,0x01833058,0x03fa0104,0x04454170,0x037d57c8,0x01d552c0,0x01800f4a,0x0114da0e,0xff56b00d,0xfd8bdd08,0xff0e3865,0xfdb418b8,0xff1f7f67,0x00be943d,0x02ea91b4,0x0467c1b8,0x062732d8,0x05764988,0x06b2ef80,0x064a1d00,0x02c14854,0x02f2f624,0x0284d8fc,0x02937424,0x011e7ac8, -0xff2e981b,0x04ea8690,0x068878c0,0x0a3a5420,0x120a07c0,0x141cc560,0x147f6940,0x13cc5280,0x13d7bba0,0x14a6e500,0x12f9e080,0x12ce5a40,0x107fa9e0,0x0cae4e20,0x09d7f3d0,0x078dd680,0x0569a190,0x0145523e,0xfffab1a9,0xfe7e280a,0xfbcdcf48,0xff041ba0,0xffb393b2,0x00f20419,0x02de7ef4, -0x056c4c80,0x071b67f0,0x06d01928,0x041e5480,0x044ea938,0x02774b20,0xff5d9923,0xff42593d,0xfe337c82,0xfe730928,0xfec91d02,0xfe701bb8,0x005b92b8,0x02ef243c,0x01020aa8,0xff3f52a5,0x02b653b4,0x068ae188,0x088919f0,0x0af82080,0x0d696fa0,0x0ff31020,0x10581fc0,0x1034ea40,0x1088ca80, -0x09eedc50,0x03e3e88c,0xfd72cec8,0xfc65b9cc,0xfddba7f4,0xffbaf93a,0xfe4d4adc,0xfebaa876,0xfff6f32d,0x0168eab0,0x03b0cc00,0x0400b1d0,0x0779bf90,0x084286c0,0x048eef90,0x0383a7d0,0x0202d7f4,0x01369d80,0x01523678,0x01c1ed78,0x00719959,0x00d0ca6f,0x0144ca42,0x0162fede,0xfec55220, -0xfdb20820,0x010a6f78,0xf78839b0,0xf47e7ae0,0xf3a3d5a0,0xf491d4c0,0xf57fdda0,0xf6902d50,0xf844ccd0,0xfad93838,0xff069ac7,0xfd61750c,0xfccc2600,0xfb6a4098,0xfbc02f08,0xfbcd61a0,0xfcba6388,0xfcf29a90,0xfd837ab4,0xfc5b8ef4,0xfd1efecc,0xfdc96880,0xfd036308,0x04fb0728,0x0779ad80, -0xfccd9670,0x08efbbc0,0x07944868,0xfef99b76,0x00c5c2e2,0x0173ee66,0x00c599a4,0x0191cea0,0xfded734c,0xfae188f8,0xf8cb4f98,0xf7e77830,0xfb7b76f0,0xf1f958f0,0xec2bd420,0xe5a65000,0xe60bb2c0,0xe62862c0,0xe6d5ee60,0xe8a204a0,0xe9e25c20,0xeb1ae740,0xedbe9460,0xf0f16020,0xf4098ad0, -0xf5ecce40,0xf80d4d98,0xfb25aaf8,0xfb033368,0xfb604ee8,0xfce6ecc0,0xfdf19a78,0x007f949c,0x0298a10c,0x0426cda0,0x046c9610,0xfc83045c,0x04588118,0x0502a8b0,0x030fe9e4,0x02d6fa84,0x00bd066d,0x004b182a,0xffb5d216,0xf80761c0,0xf43d5920,0xf5ae4670,0xf6e37470,0xf8c20598,0xf39e5800, -0xf00d2240,0xec72ef20,0xec6eb560,0xeba63b80,0xea876c40,0xe949ea60,0xe9661760,0xeae2b240,0xeccd29a0,0xf02fb3b0,0xf3fe9f50,0xf66f60d0,0xf8f37ad0,0xf9f29a90,0xfb6a80f0,0xfc21b114,0xfd0b56e0,0xfd9c7318,0xfdcca980,0xfeb2111e,0xff4b81d4,0xffbc8aa7,0x018f93ee,0x0378cb60,0x03022b44, -0x00aee006,0xffce892c,0xfef4109e,0xfde6b324,0xf9b3a718,0xf9701ea0,0xf8a24518,0xf900a528,0xf7caa9a0,0xf5b1cf10,0xf4227b90,0xf3559250,0xf35b8c20,0xf3b08600,0xf4385a70,0xf54fcfa0,0xf5fc06b0,0xf6457390,0xf654f460,0xf5dbe410,0xf5d042a0,0xf51f2840,0xf52620d0,0xf59eda40,0xf6b09ff0, -0xf6fd9df0,0xf7a6d580,0xf9a2ae68,0xfa3c50a0,0xfc405be4,0xfee3a58e,0x00e0e1c6,0x01e2c40c,0xff02f815,0x01112d0a,0x01439fd2,0x0090e71c,0xfd10dbdc,0xfa882cf8,0xfa8e61c8,0xf8d8c7f8,0xfa5674c8,0xf9975ee8,0xf7c6b3d0,0xf5a61600,0xf3afe1e0,0xf3f1e590,0xf3d42500,0xf3843610,0xf3cc7dd0, -0xf3fec460,0xf41b3220,0xf478de00,0xf519b130,0xf6460fb0,0xf5bb1670,0xf5363200,0xf47a1e70,0xf45daf20,0xf3a62520,0xf4670e60,0xf7257ab0,0xf7b871d0,0xf89b0268,0xfa10af00,0xfc725900,0xfbf05500,0xfe005ad0,0xfd1ef43c,0xff8ed5e6,0xff26af35,0xff97df5d,0x000ba6d2,0xff070dc5,0xfe5c3b0c, -0xfd1ffeb8,0xfb9b6410,0xf6a9ceb0,0xf4a96590,0xf5004ca0,0xf4beb210,0xf491f650,0xf42b6a90,0xf3c06840,0xf3576520,0xf334efb0,0xf314ede0,0xf304d810,0xf2f56d20,0xf2c49f60,0xf2ac1ff0,0xf29c20d0,0xf2c067b0,0xf2e97ad0,0xf33af670,0xf3889e70,0xf337a8d0,0xf7f27af0,0xf64c3db0,0xf65a1400, -0xf6f6f770,0xf81c3f50,0xf7ec7ef0,0xf80b61b0,0xf787c340,0xf7fc0760,0xf78a1d80,0xf8361500,0xf8471b90,0xf7aaa320,0xf73fa290,0xf6adfb50,0xf6109350,0xf5066540,0xf5925f60,0xf5adef10,0xf56f4440,0xf566f250,0xf539d870,0xf51c4970,0xf4f64ca0,0xf4d3af60,0xf4aa8830,0xf47fe860,0xf457b040, -0xf43a1330,0xf40e8d10,0xf4574ab0,0xf4845770,0xf4ad0c70,0xf4ab0f60,0xf50a21f0,0xf473dbe0,0xf4923b50,0xf56a1ff0,0xf9418d18,0xf51a5ce0,0xf5e35e10,0xf8fa3be8,0xf8cafdf0,0xf8d21110,0xf891af08,0xf88cc860,0xf84d8eb0,0xf85820f8,0xf62d1980,0xf587c370,0xf86c6570,0xf5b269c0,0xf46e2b50, -0x0194d990,0x04587ec8,0x00f786bf,0x02160cc4,0x0202aac4,0x0295a630,0x01c41d32,0x018a06d6,0x018556b2,0x016e526a,0x015888fc,0x01409bc6,0x0112b008,0x00eca288,0x00b5408d,0x00b56644,0x00b5dbef,0x00cbd56c,0x00e0f584,0x012d9ba8,0x00187913,0x03d67a18,0x058bf7c8,0x08526620,0x031aeea8, -0x05986af0,0x08812950,0x0845a0f0,0x080f3d10,0x0772c600,0x082c4730,0x0834c950,0x078c2d28,0x0570a7f0,0x02b07560,0x07ee4fa0,0x05e90d38,0x0647d750,0x0218b80c,0x024a6c40,0x03022c84,0x046f9fd8,0x02dcfe14,0x026ff520,0x0233d57c,0x0220009c,0x01d03c8e,0x0167ce16,0x00d10ac3,0x0037d71a, -0xff97579e,0xff77070b,0xff9577e3,0xffd3b8d4,0x002e6157,0x002b351d,0x005e346a,0x0520ba58,0x022a640c,0x02970904,0x02e7ebe0,0x03b2c120,0x03b75c48,0x0315ea20,0x0339d310,0x03abdfb0,0x0353c594,0x027bbb3c,0x024d11b4,0x02a1eed4,0x037dc5f0,0x030b76cc,0x01d2b666,0x04d2ec00,0x04c53388, -0x0459a580,0x05752358,0x07fca8a8,0x03c59c2c,0x027b67d0,0x015c7d02,0x01c4c370,0x01c88898,0x014d261c,0x002d8d65,0xff0bcbd1,0xfdda3da0,0xfd8c0298,0xfd8f6d88,0xfe0736f8,0xfec31cd2,0xfec3fbcc,0xffd115f1,0x01b57152,0x01dbeaaa,0x01d445fc,0x01ce9988,0x035398b4,0x04a857a0,0x046c8a58, -0x02cdb520,0x038ffb44,0x03dc62d0,0x0496a9e0,0x0157ad44,0x02d2a508,0x02d2222c,0x02be4214,0x033efdfc,0x02fe513c,0x039612e8,0x03ea6f44,0x0664a5d8,0x0abfbcb0,0x059fa2d8,0x03c7d79c,0x022ae594,0x0380ebb8,0x03757254,0x02b2e40c,0x00b4201a,0xfe829194,0xfc3ac3a4,0xfba73738,0xfc027744, -0xfca0f68c,0xfd5e4cec,0xfd807150,0xfde3de60,0x0078a3e2,0xfef929a6,0x0098c538,0xff0364e9,0x00188143,0x034c8464,0x0355bd28,0x04272888,0x0210e088,0x05427f88,0x03c13bbc,0xff113b46,0x00e13a06,0x01275df6,0xfffa6c8e,0x00dcc1ed,0x0c668b20,0x0a42a360,0x0b002720,0x09d92a20,0x0737c2b8, -0x05fd4b30,0x034e063c,0xfc960988,0xfc371b6c,0xfaf4e860,0xfb2ee840,0xf9927710,0xf8883390,0xf7cae6b0,0xf7520220,0xf6ec7120,0xf727e2b0,0xf9e3bbb8,0xfb09e610,0xfd24a9c4,0x012fe518,0xff8cb48e,0x00d9d145,0x00d742a7,0x0289f49c,0x0584af50,0x03f660c0,0x03f8bc28,0x039c1658,0x03aaff00, -0x03b2f0a4,0x048770c8,0x05292d98,0x06407868,0x08406770,0x0bbe3d30,0x00871d1d,0x009e88d2,0xfb60d600,0xfd15e73c,0x03a47f90,0x052e4a88,0x04f47c98,0x008f9f52,0xff2464a8,0xfa887a00,0xf6f63740,0xf2843280,0xee2ebe00,0xe92f7c40,0xe992adc0,0xecadd760,0xf2fd8710,0xf4e52b40,0xf6438ee0, -0xf914a190,0xfcfb5b00,0xfe8ec74a,0xff7bee6a,0xff9f878d,0x0108f60a,0x04d312e8,0x0484ba80,0x05e3d268,0x048bcdc0,0x07e11508,0x083ac4f0,0x06ff0f80,0x04436b60,0x02bb9048,0x027ebd24,0x012c65b0,0x012aa16c,0x00e31120,0xff4cd3e6,0x004fad24,0x00c32158,0x05e15498,0x03e4a62c,0xfa81aa90, -0xfcb518f0,0xfd6e888c,0xffa079e9,0xff03ecd9,0xfd50a290,0xf9e0ac80,0xf86ee978,0xf7cc9790,0xf92746b0,0xfab84a98,0xfc464aa0,0xfd6032c4,0xffc0d015,0x010341aa,0x033c8f88,0x02b48514,0x048213a8,0x0996e250,0x06330370,0x056b9218,0x009a048f,0x06629428,0x052f7318,0x033b6940,0x03452cb4, -0x026df248,0x02e27a98,0x029e3ab8,0x0212ae54,0x0483d478,0x0101c28c,0x0158a50c,0x056a07e0,0x0bdf5e10,0x0db30f10,0x0a141320,0x07400888,0x03e501a0,0x042ae1e0,0x00d6a525,0xffea0349,0xffffc2e1,0xffcafb7e,0xff15766d,0xfe24ac08,0xfcc1923c,0xfcb40c78,0xfcd9b6b0,0xfd6017ec,0xffaf3396, -0x008c94ec,0x0033d95f,0x017bf726,0x04a8ad58,0x01d8c0c4,0x012428a6,0xfefaa546,0x02c4b740,0x04029880,0x064570e0,0x02f95668,0x021a4378,0x021d9338,0x024eb94c,0x03ee9d18,0x05aa9c90,0x0333a948,0x03d18ec8,0x08f6df90,0x0b6af560,0x0b17a790,0x078763e0,0x04356ea8,0x03048bec,0x04a4ec90, -0x0385fb54,0x02deaac0,0x01925c88,0x00b588c3,0xff6c54e8,0xff45f18a,0x0027dd22,0x01457b90,0x020ed174,0x002a6dd2,0x00e27064,0xffa5bb66,0x0178553c,0x034bfdbc,0x04ca6ba0,0x02d802e4,0x02763fa0,0xffa92c04,0x022f3518,0x030f28ec,0x04d22878,0x03a435b8,0x030210ac,0x029da6dc,0x04dc3238, -0x0077b061,0x00f3f7ac,0x03b5aacc,0x06cb2a28,0x09d90d70,0x081a2fb0,0x06be1ac0,0x04e92ab0,0x01e96a58,0xff4c5f52,0xfd557fc8,0xfd1340f8,0xfd23e4f8,0xfcfa8078,0xfe2d50a0,0xff72e7e9,0x022429e4,0x03ca8074,0x04e78bd8,0x0372f47c,0x0325f438,0x04ea8108,0x03f8828c,0x039d1fa8,0x0267f140, -0x01d563ca,0x012ac648,0x012ffd6e,0x0396a7cc,0x02b13604,0x02ccfa58,0x02ba7f90,0x03bed380,0x03de6998,0x01b6f1c0,0x01988b64,0x05aa11f8,0x06464bc0,0x06d85260,0x078a8c60,0x08778db0,0x06bb5dd0,0x05629598,0x04124918,0x03b22100,0x034c2088,0x029e0fd4,0x02352af8,0x0180fc86,0x00372c34, -0x01b6d664,0x02d5fd38,0x04211758,0x04e3ec50,0x06fe6c90,0x06f600d0,0x03ed80b0,0x03d064e0,0x03665710,0x03bfb160,0x02becb78,0x04e788e8,0x032a1344,0x05243728,0x033cbc30,0x03b4ccfc,0x02aa35e8,0x02ad6f04,0x02764384,0x026ab188,0x025ca190,0x042fe330,0x03774014,0x06c966f0,0x06218cd8, -0x05d5eb18,0x0596e630,0x056c7168,0x055d3f88,0x05184080,0x051a7e90,0x04f30838,0x04de5468,0x04b05948,0x04a33a60,0x044ff340,0x04d622a8,0x051b6be8,0x057f5c50,0x05a9cfa8,0x05deb1a8,0x06628600,0x01591284,0x0499ac88,0x04da1670,0x04d3a2a8,0x03ec5d44,0x04f6b390,0x05222858,0x058623d8, -0x04dd69a0,0x05e13998,0x05f355c8,0x05833028,0x05cd4168,0x05564440,0x0558a458,0x062608b8,0x055fa820,0x065d4110,0x05a07708,0x05ae4960,0x05792c48,0x056e8038,0x055b37f8,0x05490310,0x05660928,0x057d0870,0x05948a38,0x05a51f08,0x05b3fd28,0x05b6f078,0x05bab0f8,0x05b97288,0x05bbe9a0, -0x05e05cc0,0x05aa8260,0x06bf1b50,0x05407a80,0x041ade98,0x0055aece,0x059df6c8,0x0442b1f8,0x0109054a,0x01277fb6,0x014b0ee0,0x01c71dfe,0x01b854b8,0x01eb4dfc,0x0236b85c,0x04a2ec80,0x060d05c0,0x01a83ee4,0x0460fae0,0x061904c8,0xfc4ffc48,0xfaf139a8,0xfc60a490,0xfbc356c8,0xfba0f1e0, -0xfb691c58,0xfbdba5e0,0xfbf34b50,0xfb9665b8,0xfc1ce858,0xfc469894,0xfc73b3ac,0xfc5f139c,0xfc642204,0xfc569840,0xfcb27ae4,0xfce4414c,0xfd30bbc4,0xfcfdd1d8,0xfcdecfb4,0xfd975d00,0xfb792838,0xfab96ad8,0xf9dbc330,0xfc54c8a4,0xfb617820,0xfaccdb20,0xfa799da8,0xfa768f90,0xfaa7b490, -0xfa6ecda8,0xfa43da60,0xfa2b5d00,0xfaf57fc8,0xfc116e40,0xf9ed4aa8,0xfa763718,0xf9b68b60,0xfa1268d0,0xf9746268,0xf9193bc8,0xf8daa398,0xfa124360,0xfa45ebd8,0xf95bc670,0xfab82a68,0xfb2f7550,0xfb8e2f50,0xfb49c0c0,0xfb5853e8,0xfb5e2260,0xfc594f44,0xfcf7d910,0xfdc51e44,0xfd3e6480, -0xfd57dc18,0xfd688944,0xfabe6e60,0xfca02ca8,0xfc7c8854,0xfd50bdd0,0xfd847418,0xfe9f65ec,0xfe0a82fa,0xfdb4cd6c,0xfd78f6e0,0xfda452f0,0xfdceb7d4,0xfce1a234,0xfcace240,0xfbe8a3e8,0xfba958a0,0xfbb253c8,0xfa720f00,0xf8f55d38,0xf6df6e40,0xf608bb80,0xf4c69dc0,0xf70d1fc0,0xf7a8e480, -0xf5f00d60,0xf8fcd040,0xf994fd48,0xfa731818,0xfa3d84e8,0xfa6a9c00,0xfa6abec0,0xfc7db7a8,0xfdaae624,0xff1c1c28,0xfe0ac7ee,0xfe456f58,0xfdf65e40,0xfc93d90c,0xfd0500b0,0xfdcb0db8,0xff74e0a5,0x000b73e9,0x0201d330,0xffdc4453,0x0015a24c,0xff6a0f17,0xfff9d5ac,0xff074c46,0xfe555a3e, -0xfdf44c08,0xfd08dbd8,0xfc70ba1c,0xfb8dc798,0xf8a02508,0xf4e0be70,0xf18ed3d0,0xf0a74d80,0xefb7cb20,0xf3ffa6b0,0xf4cb6e10,0xf21adae0,0xf6971430,0xf7f19c30,0xf88d26d0,0xf8087340,0xf83d37b8,0xf89300c0,0xfc086468,0xfe3c7e6a,0x008a7c8a,0xff094c61,0xfee71a64,0xfe96d896,0xfc33e1c8, -0xfe0d6318,0xfda5ffe4,0x0010510d,0x01974f4c,0x04884018,0x02e5f35c,0x026754b8,0x021e4fbc,0x02fa87ec,0x0169a828,0xfed74634,0xfe590c58,0xfd6e0e9c,0xfc471c6c,0xfab74de0,0x07d38ed8,0x0912fb00,0x066cdd50,0x02f5d0b8,0xfb755de0,0xf7f6ee70,0xf5c3be40,0xf8840dd8,0xf7d711f0,0xf939fea0, -0xfc2c011c,0xfc948990,0xfd5bf1bc,0xfcb686ac,0xfda4a2cc,0xfdffc664,0xff9986ac,0xfe69749c,0xff60acf4,0xfe71fa82,0xfc10ed94,0xfee07d20,0xfdfef610,0x00548a16,0x0114bc24,0x03e7aec0,0x00ed2673,0x01b530b8,0x04994398,0x041dfe60,0x04af3d88,0x0502d710,0x03514f9c,0x032a6aec,0x0483a038, -0x06305820,0x05590480,0x06e5ebf8,0x0a6ebeb0,0x0a4e7970,0x041fbba0,0x0cc40cc0,0x0d8834e0,0x0c9a2f00,0x047fd490,0x01463aba,0x0129a652,0x004ab33d,0x010f4428,0x01cb3114,0x03deb8cc,0x0331d7a0,0x0151a382,0x0103ae76,0x01e58686,0x002f2f10,0xfe9cd90e,0xff160ed9,0xff53a665,0x01596788, -0x026e5020,0x06baf0c8,0x03d95930,0x032d576c,0x01cfc930,0x068d81d0,0x066cf0d0,0x042d8800,0x06188118,0x06f85628,0x05b05a68,0x05b6d208,0x03e52638,0x03eec030,0x0288f88c,0xfeedca6e,0xf794a150,0xfb56c780,0xff47dd1c,0x084970c0,0x02a44210,0x010cb2f4,0x00e70646,0x00768934,0x00891b7b, -0x004e51fe,0x00d14bff,0x007bf95d,0xff532ddd,0x01ad0ff2,0x02b0897c,0x01333c98,0x00c05a61,0x008bcc68,0x000343ca,0xffa878d1,0x019682ee,0x0b05c560,0xffdec05e,0xfdac89c0,0x002ed524,0x02b4d184,0x04859568,0x0a5520b0,0x022d7f34,0x00628a4e,0x0346dfb8,0x0332711c,0x020f962c,0x00c75271, -0x0142f6f6,0xfeb1495a,0xf5298330,0xf81f6eb0,0xf7813db0,0xf8cd8da0,0xf4d81d90,0xf39d59a0,0xf34bc5e0,0xf88c1220,0xfd702b74,0x01615042,0x033c9c08,0x03ace72c,0x02b1b300,0x03d949fc,0x047d6728,0x04498ec0,0x03796020,0x02f37a20,0x03272a74,0x03098764,0x043d11f8,0x0a110720,0x02c1531c, -0x00cf5862,0x02729f6c,0xfffc4727,0x015ecbfa,0x066fff28,0x02c3ede4,0x01a4864a,0x0177448a,0x015d15ac,0xffcc051c,0xfe709dfa,0xfc782130,0xf98f25e8,0xf32d6b90,0xf8adb110,0xf9fc78a8,0xf9d99470,0xf85f58f0,0xf645c610,0xf3c3e1a0,0xf54652d0,0xf792d860,0xfb231f78,0xfe182510,0x007c3d5f, -0x01ac9fe2,0x02038348,0x02082390,0x0243ba3c,0x0289a9dc,0x02b3f89c,0x03541624,0x029f5594,0x01e6ecd8,0x02236354,0x032a3308,0x02e3e854,0x0285f6d4,0x01e65d12,0x018adbf2,0x01894450,0x015c3514,0x01a5fe50,0x01317066,0x00125017,0xff385b03,0xfdc8c600,0xf9b63628,0xf77be1d0,0xf79893c0, -0xfabf6bd8,0xfbea84d8,0xfb7ebb10,0xfc78feac,0xfd2b8da4,0xfe060608,0xfe3d9cd2,0xfeed60d6,0x00056983,0x01eafcec,0x024c7ed4,0x004369db,0xfefd5b7a,0xfea633ac,0x00ae43df,0x0142a3c2,0x00799e92,0x0111807a,0x01acf55a,0x02315060,0x01f4f464,0x0256289c,0x02aa62e0,0x01b2c1dc,0x0352156c, -0x036e63b0,0x02e941a8,0x02914d90,0x0207a240,0x0240fc58,0x00f87d02,0xfbeac630,0xfa736cf8,0xfb6389a0,0xfc1c9d70,0xfc689210,0xfca68be0,0xfd220cd8,0xfd99b564,0xfe2337f0,0xfe714ce8,0xfed690dc,0xff6cf161,0x002cdc0a,0x01168b48,0x005e623d,0xfffa7765,0xffb874bd,0xff34d349,0xfd7f89c4, -0xfd7b3884,0x0046f878,0x006994e4,0x01089864,0x014ba134,0x026b4ee4,0x01e13142,0x02929c00,0x00fc9bf5,0x020ff5c4,0x00a6b014,0x00a02f82,0xffc9a9f1,0xff76428f,0xfee9c4c6,0xfe967026,0xfd23be94,0x01f7388c,0xffb05c10,0xff6c91da,0xfedf72a2,0xfe8093d8,0xfe2e2264,0xfdd01828,0xfd70d050, -0xfd91c1ec,0xfdd0e8f4,0xfe10404a,0xfe5ccda4,0xfe8d0b9e,0xfefd6e28,0xfebf88c2,0xfea73d7c,0xfe796dca,0xfe7ec43c,0xfe8ba932,0xfe60a066,0x01fea094,0x006aaea0,0x00c6c3ca,0x00fa74b2,0x01d79740,0x01a041ce,0x017d9950,0x016047d8,0x01e1a262,0x016def0a,0x018d0eba,0x0215d41c,0x0196598a, -0x01a14064,0x01765e5c,0x00a37550,0xff481295,0xff028ecb,0xff345ce2,0xff0b3ca1,0xfefde7d6,0xfee28a5c,0xfecc7f4a,0xfea2936a,0xfeb51084,0xfeaebd18,0xfea9516c,0xfea52d04,0xfea5d1a4,0xfeaf7804,0xfeb980a2,0xfec83184,0xfecef5ee,0xfec5848c,0xfef2f8da,0xfe50d266,0xff223bfe,0xffc9733b, -0x01c06b76,0xff60b2d0,0x0013e26d,0x01c0e430,0x01b43b2e,0x01a839f4,0x0158a3f0,0x016ff560,0x014db438,0x012488f4,0xffcd5376,0xff259674,0x011ddd54,0xffc9ebb9,0xff33b7bd,0x00d0849b,0x012c21b2,0x0051cb26,0x00878f49,0x009311d7,0x00972684,0x00892cf3,0x0086d7c7,0x00730154,0x00aa917a, -0x00a3da7d,0x00537787,0x0081d397,0x008482cd,0x0083c04e,0x008a971c,0x0095c05c,0x009c1cf3,0x00b859cc,0x00cf1db6,0x0073ea16,0x01a6552e,0x020f9ef0,0x023b83f8,0x01a615e6,0x023a3000,0x028e7f28,0x0263a464,0x02468238,0x0228dbc4,0x023f7148,0x024588a8,0x0265c290,0x0202ebb0,0x01614d40, -0x01ec032c,0x018a133c,0x005862f6,0x0047cb09,0x008aedcf,0x00ba20cf,0x0099c3e5,0x003d3a9a,0x0015243b,0xfff153e4,0x0097a51f,0x00ad6d60,0xffeab4e1,0x007a23bf,0x008e9a4f,0x0081d78c,0x00740b15,0x007ea6ae,0x00813c14,0x00e2bc9b,0x00d87cd9,0x00dac28b,0x021e4300,0x01525eb2,0x01626dc6, -0x0206758c,0x0256addc,0x021bc1e8,0x01be4b98,0x01946820,0x01bb8482,0x0144b12c,0x013f9ce0,0x01f9800c,0x01dbffac,0x01d6c08c,0x0177d290,0x0082bfac,0xfe7e94c2,0xfee177d0,0xfff9feba,0xfff4a646,0xfff169fa,0xff6b31bb,0xff535b2d,0xfeb78852,0x0055a9c3,0x0068aebd,0xfed046f6,0xffc6f204, -0xffc83340,0xffb5848d,0xffb729b4,0xffe1b93f,0x0038ee46,0x00d5e548,0x00f37262,0x0133769c,0x01e52938,0x01e149a6,0x01695fdc,0x02cf829c,0x035c6ee8,0x02f6f498,0x02c63e00,0x0207fb94,0x023e685c,0x01a74e82,0x0208d604,0x0299771c,0x023c5948,0x017ce7f6,0x00f013c2,0xff8e3b52,0xfcb5d9a8, -0xfd81923c,0xffccd412,0x008341bf,0x00590f3d,0xffddc1c1,0xfeb1a9c2,0xfd88b440,0x000f6140,0x01315a06,0xfef7fa7c,0x009cc56d,0x00978d97,0x0012a0bd,0xff78bec7,0xffa57461,0x0029c891,0x0111b4e0,0x00e8e069,0x01179f70,0x01ca59bc,0x01526f3a,0x013c163c,0x02e3ab48,0x03c97b94,0x04e97380, -0x031f7158,0x01f52776,0x01f7607c,0x0229f8a4,0x01e83b5a,0x0290286c,0x02e6a468,0x021651d4,0x0178e58a,0xfee5defa,0xfe96ae20,0xfe4e7976,0xfea63c68,0xfc3b9b70,0xfa65de38,0xf6230010,0xf8060ff0,0xffc6799f,0xfbea02e0,0xfa0a1c48,0xf7b43410,0xf98ba7b8,0xfb23eed8,0xfd2ab8b4,0xff133778, -0xff696511,0xfd405648,0x0072c9b6,0x017f1cee,0x03941e14,0x0378c14c,0x01f004fc,0x024e30e8,0x02b80d90,0x02ed5670,0x04712d50,0x03218108,0x02fc2de4,0x03acb308,0x044c8978,0x03c32450,0x014c70f0,0xff260b4f,0xfe2469b2,0xfe2c8336,0xfd968d24,0x0ade6680,0x09aa4c30,0x0c2dec40,0x0bf3e2e0, -0x0b96d0e0,0xfe0a8352,0xf8ac3170,0xfccedca0,0xfb2cfa88,0xfb1d02f0,0xf7d6e260,0xf7cc9190,0xf7f237a0,0xf91d0048,0xfaa647b8,0xfc6ea284,0xfd659be4,0xfe691c4c,0xfd88d8e4,0xff3cf812,0x0181dbd2,0x018d16d4,0x011954f4,0x021cecf0,0x02715314,0x0519b9b0,0x02891654,0x01df4fc2,0x01aad646, -0x040970f8,0x046f15c0,0x06c4fdf8,0x061295f8,0x06b59518,0x0912f090,0x09dd2c80,0xffb0af5f,0xfee3933a,0x01d0705a,0x01390eea,0xff15cb4d,0xfe0e0faa,0xffbc4b59,0x04159bb8,0x05178cf0,0x03c56a90,0xfe6de920,0xfcdded04,0xfa7b5730,0xf8334a78,0xf7557130,0xf6de5850,0xf6d21400,0xf8c9ad40, -0xfaf36160,0xfd927a00,0xffb9646a,0x00d9706a,0x02871ecc,0x03362bc8,0x049e34f0,0x09d35520,0x036969a4,0x0051662e,0x01aae9a4,0x00509628,0x02dd63e4,0x0a09c820,0x0463d738,0x02282724,0xfec1f758,0xfea21d18,0x00c7d1c7,0x0083f293,0x0104e954,0x0230c5f0,0x044502c8,0xfef2344e,0xfe5141c0, -0x01ceedb2,0x047404a8,0x086b6a40,0x0b5e34b0,0x0abd3440,0x08eb42a0,0x06942610,0x050bd520,0x03d7a088,0x01ea0184,0x02aadc88,0x01c974e8,0x00879b67,0x018e85f6,0x0136b59a,0x014dea60,0x030f8fc8,0x02ef69e0,0x04760ed8,0x01766b58,0x00935043,0x03fd1c94,0x019fdea2,0x01dc7d4c,0x0365a818, -0x023f1f78,0x02f12f54,0x01e5040a,0x017fc044,0x0133939c,0x01e70e1a,0x022a85e4,0x01c2ef0e,0x01b516fc,0xfde5da34,0xff1a33af,0x04f8da80,0x0520e640,0x066df8c8,0x081b5430,0x072ce4b0,0x06068ed8,0x0448f680,0x03614a70,0x021d26e0,0xffbb9cff,0x0116241c,0x004a5d38,0xfee7bc7e,0xff8085f0, -0xff2d519d,0xffb35c6a,0x011be468,0x01f9ffd2,0x02b0c260,0x02624868,0x01aaab22,0x00bc45ef,0x01592d88,0x02aba290,0x04a53d60,0x02c085b4,0x01a0a294,0x01660dce,0x015725a2,0x033b7f98,0x032e06dc,0x03cf2b58,0x030d5398,0x0072d2e3,0x00bd553a,0x016a11f6,0x0445ebd8,0x03092a88,0x033bbc14, -0x0360600c,0x040ecd50,0x03a94114,0x0285c140,0x008365b9,0xffec8f6c,0x00f3e4f4,0x02078090,0x02677568,0x01b6e488,0x0135287c,0x01a333c4,0x01c7f90a,0x01f7688c,0x0228e30c,0x02572138,0x019ad9c4,0x0181ae18,0x01a9df7c,0x012d08a2,0x0113f8c2,0x01dcfc96,0x013ed8a4,0x01a72a48,0x02210b88, -0x02cad1a0,0x02e67378,0x03373304,0x02624278,0x016a64fc,0x009d1b5a,0x021895e4,0x030966e4,0x044f3b48,0x02fbaa60,0x020a75c4,0x00d5788a,0x009e05fd,0x00608fe5,0x004c7a91,0x00314584,0xffdd7221,0xff6e664b,0x002bbaea,0x01c2dfb8,0x0208cf74,0x00a5b017,0x0180ffce,0x01b0ae4c,0x01ac871a, -0x0163dea0,0x01c76f42,0x01821798,0x01daa6c8,0x01608d74,0x02855844,0x031fead8,0x03f6daf8,0x03e84a30,0x03db7ab8,0x03dafbdc,0x0372f088,0x00c01a50,0x019470a8,0x022adc10,0x02f83c24,0x0382fb28,0x03f8ca44,0x04516de8,0x04ef5c88,0x044eaa98,0x03e1982c,0x0351f39c,0x02b8f10c,0x020ba3dc, -0x013edc58,0x018b026a,0x01d2be3e,0x020a8d7c,0x021eda10,0x0223dbf0,0x02441ef0,0x0043fd25,0x01666ad4,0x0158f038,0x017b6704,0x0149967e,0x019c1270,0x014fc57c,0x01394fa8,0x00e43bd8,0x00a7932b,0x001387c7,0xffdcac84,0xfff20980,0x003bde32,0x00825cf5,0x00e1fb07,0x03432d70,0x030ff7a8, -0x033a51c8,0x036d2f70,0x03a35a94,0x03cdab60,0x03f823d8,0x04445948,0x03fd677c,0x03da5aa0,0x03b85ebc,0x038cb3bc,0x0369acb0,0x032618d8,0x03407a90,0x033be2f0,0x03487e6c,0x0351d238,0x033d95a8,0x03a141cc,0x03512040,0x03068754,0x02112388,0x0356b984,0x031392b4,0x0291a1bc,0x027fb31c, -0x02722cd0,0x02737200,0x0264c050,0x026f26e4,0x0248f8e4,0x02c980d8,0x02fea834,0x0256e6d4,0x02fd7340,0x04446bf0,0xfd923950,0xfd2664fc,0xfdb387a4,0xfd89be4c,0xfd587b28,0xfcda4310,0xfcfd15a0,0xfcf10218,0xfc903c40,0xfd5075b0,0xfd81a4f8,0xfd66123c,0xfd7d64e4,0xfda089c4,0xfe0546b0, -0xfddecbac,0xfde2c928,0xfddde618,0xfdf5d0bc,0xfdf57b88,0xfe23ca54,0xfd61c080,0xfd3e2af8,0xfd50b6f4,0xfddd163c,0xfd8e555c,0xfd6f8be8,0xfd88f80c,0xfd8fdc8c,0xfd89cc2c,0xfd61116c,0xfd611e94,0xfda0eb38,0xfd8d9a68,0xfdc69f28,0xfd817e48,0xfd25c154,0xfd4c0f28,0xfd7f7b0c,0xfd63bb5c, -0xfcb88268,0xfb50d238,0xfb441180,0xfb1100f8,0xfa536e88,0xfc292988,0xfcb896f8,0xfc647b3c,0xfc7d02c0,0xfcd788a8,0xfdf27260,0xfdb34588,0xfdc5e114,0xfdc2960c,0xfe0e6cf6,0xfe3bf332,0xfe3e4498,0xfd6f4318,0xfe079406,0xfe53a208,0xfee032de,0xff0bb4f7,0xfeb28a8e,0xff05b182,0xfec70d7c, -0xfe729ffc,0xfe5c2d2c,0xfe9138c0,0xff0dac45,0xfeec4f58,0xfec021b8,0xfeca41ec,0xfddf3388,0xfd11c71c,0xfce225f0,0xfc7d2034,0xfb99cff0,0xf8e48e58,0xf92e36b0,0xf8e48888,0xf75da230,0xfaa4f868,0xfbbd51e8,0xfb489f30,0xfbaaebc8,0xfc60c7fc,0xfe88053c,0xfdfc7294,0xfe4c4e98,0xfe269504, -0xfebe4d0c,0xfee397b8,0xfed88d98,0xfe218bf8,0xfe8751b8,0xff54cbcf,0x006889f3,0x008f0834,0xffc81fdf,0x00a9444e,0x008895f9,0x000ca69e,0xff8669fa,0xff74cdc2,0x007d8438,0x001f06c4,0xffdf12da,0xffbe4537,0xfd8cb930,0xfe7afb92,0xfe42297c,0xfdddfa18,0xfbb846e8,0xf6e85ff0,0xf6857c50, -0xf6208510,0xf439c7d0,0xf8b9a0b0,0xfa583310,0xf99f8a10,0xf9b957c0,0xfb34e808,0xfe8f8502,0xfe22a2b8,0xfe476b22,0xfe304228,0xff50ae61,0xfff046a5,0x00309ded,0xff57953b,0xffe60043,0x00698f9e,0x028c2b2c,0x038df434,0x03299324,0x03515e24,0x026946dc,0x02311b2c,0x013470ba,0x0133315e, -0x02b87140,0x03020834,0x027a79e0,0x0299666c,0xffab2aa7,0xf8313148,0xfb61d3b8,0xf82a2420,0xf8ba22f0,0xfb71adb8,0xf8ffc3f8,0xf850cb58,0xf5d44f80,0xf9b58c38,0xfb4927d0,0xfbdacf48,0xfc1cd624,0xfc0aa734,0xfd03fd74,0xfd7a1e34,0xff3220d9,0x00a03a56,0xff92f990,0xfee6813c,0xfe1d9746, -0xfdcae7f0,0xfee729b0,0xffe7d8e7,0x022341a0,0x0217c270,0x00d1d189,0x036ca96c,0x03ae6c1c,0x019824b0,0x03c7ffe0,0x02628b10,0xfe7a228c,0xffbc121f,0xfee6b79e,0xfc59dc10,0xf884b180,0x08ee92b0,0x09331f30,0x05c1b4d8,0x017f5020,0xfea65114,0xf7f9c250,0xf4ea4e80,0xf0cdc6b0,0xfac879a0, -0xff00f84f,0xfea94bee,0x00202cac,0x00a8f6fc,0x01e2dd30,0xffbd9f18,0xfe7e6c96,0xfd1a3d4c,0xfe398572,0xff229247,0xfd88aad4,0xfcb8b1f8,0xfe48078e,0xff3a3623,0x024ffc60,0x035053f0,0x03884588,0x01c19ae2,0xfffbb0f1,0x0091a1f4,0x00bffe9c,0x026bb354,0x0673e7d0,0x025dff60,0x01f3d5ac, -0x0481ebe0,0x06f55ab8,0xfcf11aec,0x00389788,0x01c07178,0x0759df18,0x128b3da0,0x0e0bc5f0,0x0c701990,0x08759e90,0x0664c830,0x0370a114,0x004ed3b2,0xfdea62b4,0xfc77ed80,0xfd3e05a4,0xfd43e638,0xfe4e1512,0xff253950,0xfd882e54,0xfcd54900,0xfdad441c,0xfdd99f74,0xfeac2a82,0xfcf30144, -0x03b4d010,0x0354c610,0xfd31bec0,0x0072fdd6,0xff990066,0x0078c916,0xfe8ac7ce,0x00bd3595,0x04b7bad0,0x070867c8,0x07608088,0x011bc28c,0xfe85b9bc,0x017a3914,0x01836dfa,0x00e740a4,0xfefce002,0xff1d6add,0xfd8d2958,0x0091f77c,0x06163a38,0x0a618750,0x0b033a10,0x062368c8,0x04e14d90, -0x022c9020,0x00210167,0xfd190be8,0xfc7c0e98,0xfdf88c78,0xfd51bee8,0xfdac8670,0xfed15766,0xfe871a2c,0xff95ffb8,0xfff18939,0x04797c98,0x0468c400,0x00c6b0d5,0x02ba9920,0x022ceca8,0x027e5cc0,0x03839048,0x03d4b270,0x0120603a,0x01a51a20,0x01b18612,0x0112c2d0,0x01cd8a62,0x009a5a49, -0x007cce1f,0x01214568,0x014828d2,0x01484896,0xff50dfb5,0xfedc5d66,0xfebb162e,0xfffc76a9,0x006c7501,0xfe79043c,0x014263a6,0x026a2b48,0x0403cd90,0x024fec38,0x01ca47d4,0x01cbbb02,0xff5e5690,0xfefceb68,0xff61f6fd,0x00047f09,0x00ca328c,0x009c7eb3,0x004b90ab,0x007c0308,0x0152f702, -0x00831636,0x00480875,0x013c7bca,0x00b54f74,0x0151cc30,0x01b7a282,0x03318bec,0x0315a10c,0x012795ea,0x00b85621,0x000b03a2,0x00340cf7,0x001cc8da,0xff88e064,0xff295f78,0xfce2691c,0xfcc7a0c0,0xfd9e1090,0x00d5cc8d,0x0143a012,0xfef4be86,0xfe8bf0a8,0xfedbf412,0x00538ff1,0x018e58e2, -0x015cf57e,0xff6ccb79,0xffa96893,0xff68e16c,0xff5fd28a,0x003021da,0xffd8b277,0x00281907,0x00758d18,0x00eeacc4,0x01deadfc,0x019b624a,0x01278292,0x004ec5a9,0x009b2532,0x00ba1e5e,0x00ceede8,0x0088bb92,0x002b77f6,0xff82b8d3,0x00045651,0x00a35e0d,0x008ff58b,0xffdeffd2,0xff52c881, -0xfee1fa46,0xfeb6e988,0xfe64171c,0xfd83ac34,0xfe73bb74,0xff82519c,0x010f2de0,0x003dde5e,0xff571d2b,0xfe3f0df2,0xfed02296,0xffa89109,0x007fa99a,0x009b93fc,0x0001d758,0x007e203d,0x0175500e,0x00f9b0ab,0x00da2e3f,0x008137a9,0x007de642,0xffde6479,0x00db7ef2,0x013dd0ce,0x02403738, -0x0194edf0,0x0144c77e,0x00c7ed67,0x00bacd9a,0x00ed9d5e,0x00f4759a,0x00b2fbbc,0xff86bf0d,0xfef59586,0xff185fe1,0xff23635c,0xff194263,0xff143df2,0xff203cd6,0xff253ad0,0xffd7acf3,0x003407d5,0x00b59533,0x012770ce,0x01e5267a,0x02828a8c,0x02559038,0x01fb037e,0x01bf7c7c,0x01888ffa, -0x01749006,0x0140f228,0x01f8e8aa,0x00ba72a6,0x006feed1,0x0045ae13,0x001ebd83,0xff748119,0xff6719d7,0xff2255cf,0xff2fc6b0,0xff02cc6b,0xff3f0f88,0xff116986,0xff5347eb,0xff3bf758,0xff16db7a,0xff057120,0xfea63da6,0xfe2660fc,0xfe470218,0xfe3a014e,0xfe3e8a4c,0xfe363722,0xfe2fa72c, -0xfe0fdbda,0xfe3e6628,0xfe62df70,0xfe811964,0xfec27590,0xfeedbeda,0xff3b195c,0xff11b2fc,0xff0dbd34,0xfefd2e36,0xfef326b4,0xfef4e7c4,0xfea830ce,0xff349230,0xff9f507c,0x00b0ef41,0xfea938ac,0xff32d6af,0x0019a029,0x000c282e,0xffff9222,0xffe41b69,0xffe39818,0xffcdeebc,0xffdbd048, -0xff37acb6,0xfe9bccbe,0x000bb455,0xff1d4173,0xfd6f2580,0x00ae441d,0x006db2e0,0x007b1936,0x00a9eb50,0x00d31f6f,0x00e31051,0x00cf9f3a,0x00b80003,0x00bb276f,0x007453de,0x00807826,0x00ee2107,0x00bb5fd8,0x00af8401,0x00856feb,0x008c409a,0x00833fab,0x006c6a17,0x008ec372,0x008f460a, -0x0061b39b,0x00b762df,0x00ca6338,0x00a41243,0x00e7b870,0x00da2dab,0x00732e49,0x009b7ff0,0x0095d8b1,0x006c11c3,0x007b75de,0x0084907a,0x00bd5a02,0x00b46349,0x0090c72c,0x006b95a0,0x005ff546,0xffb314ba,0x00a5afe7,0x01102490,0x01544148,0x014a3b74,0x01336950,0x010b150a,0x01259cbe, -0x0035e28d,0x005a1aae,0x01a3a3b6,0x014b5ada,0x0113fef8,0x007d30cf,0x00792d0b,0x0065c304,0x00327cb2,0x0089ed0e,0x0083c2c9,0x00350972,0x00a54bb7,0x00cc66fb,0x013be328,0x01391970,0x0120ebe0,0x00a924cf,0x00f27996,0x00e94820,0x00914ff3,0x0098884e,0x00b13b8c,0x0129de8e,0x00ac285d, -0x006639f9,0x00694e9a,0xffcb9287,0xfe92c920,0xffa42394,0x00dd23c9,0x017fb73c,0x01f47c50,0x0258f0cc,0x01a809c4,0x01ec7362,0xff8e86c5,0xffe7a71d,0x025d6830,0x018649fa,0x0150dcac,0x00402828,0x00377829,0xfff58dca,0xff8b666e,0x0042b538,0x003fac0b,0xff9cb408,0x00681e74,0x00bc2765, -0x0187db46,0x0189a2ce,0x01690bce,0x005c8542,0x0140da78,0x00ef1499,0x006d59a5,0x00525cca,0x00784696,0x01acf704,0x005ac0b0,0xffd1f92f,0xffe01a01,0xfebc2ed8,0xfdf7ee0c,0x005b3966,0x01c4b2b2,0x02742f88,0x02f218e4,0x02fcf6a4,0x02db7638,0x0361b200,0xff97c9f5,0xffd0169c,0x0413c868, -0x0306f960,0x022d4070,0x003cbe9d,0x0012c040,0xffd82053,0xff1b4728,0x0022f071,0x0020dd82,0xff2f07fb,0x006476ab,0x00e656f3,0x020cdc68,0x02a31fe0,0x02677d28,0x00c9b1fb,0x02b648a8,0x027b4a20,0x010955de,0x00d6c405,0x00e55c29,0x02b35404,0x010d4e48,0x001c73be,0x0067d6a0,0xfdf1a624, -0xfa977238,0xfa2fcab0,0xf892aec0,0xfa5b07a0,0xfdcb6a00,0x01415cc0,0x00474ac8,0xfb9fa1b8,0xfccfd5e0,0xfd4f76d4,0x003f93cc,0xff93e57a,0x001017b4,0x00334a9b,0xfe95e038,0xfdd3f368,0xfe3cf532,0xfebd4cc0,0xfeae440c,0xfeb41a26,0xff7f5d00,0xff6c287a,0xffd2c045,0x011ca3e4,0x01f2f2f4, -0x0153d7d2,0x0277cc30,0x02a0b648,0x01337090,0x0288e7f8,0x00d6b2c7,0xfeee0006,0xfeb59580,0xfe54f688,0xfce4cac4,0xfba08b50,0x00dc1b2e,0xff6d91f7,0xfa14ad70,0xf7e06880,0xf494fd40,0xf98d2398,0xfb360548,0xf81f15d0,0xf7fdcd30,0xf7f6f6c0,0xfca8c4a8,0xfadd8e40,0xfa387d40,0xfa2fdbe8, -0xfa0122d8,0xfc18371c,0xffb9cf91,0xfec923ce,0xff120fb8,0x00edc147,0x00e8062b,0x0177e770,0x01f7311c,0x030cd8c0,0x02efd394,0x01ab5c86,0x01196af8,0xffe8ce3b,0x00a78f20,0xff8ed5ba,0x01636374,0x034ebbf4,0x0283aa84,0x007bd4e6,0xfd0f00d4,0xff619c31,0x04308730,0x07f55248,0x0bb7c490, -0x0d087030,0x0a12e460,0x0b058a60,0x03f546dc,0xf6e4acd0,0xfa423388,0xfae2bda8,0xfcdb34a8,0xfc30a90c,0xfce47030,0xfe946b16,0xfd945640,0xfd925bf0,0xfe79d43e,0xfdfed258,0xfdbd6e14,0xfdedd434,0xfdff4478,0xff75473b,0x00665927,0x0542a670,0x04812788,0xfe1921f2,0x0142c61a,0x00893ade, -0x008946e9,0x002da7d0,0x0114b71a,0xff16e160,0x05e08300,0x08b01dd0,0x077c2708,0x0576fb90,0x00674132,0x0039c2dc,0x00c31a86,0x01a45b86,0x01fdb0a2,0x05fe5a18,0x06841650,0x0110d742,0x044938c0,0x01f48922,0xff271393,0xf9f6f7d0,0xf6c93170,0xf5fc76c0,0xf6ba82c0,0xf7db2110,0xf99031d8, -0xfae329d0,0xfc2026ec,0xfd8a6ccc,0xff199058,0x00701d05,0x000f788b,0x028ec988,0x0265d950,0xfee37250,0x01c80ea4,0x01cb4fc6,0x009ac869,0x029e1820,0x03d11ec8,0x033c936c,0x0392e4cc,0x02678fc8,0x002b4f8c,0x0071ca25,0x01f155dc,0x020d5388,0x01f77fd8,0x02d53044,0x048cb9f0,0x03867714, -0x01331714,0xfcb0b950,0x014d9f08,0x04328e18,0x07fd3f68,0x068bae30,0x059a13b0,0x03d5f854,0x03456b28,0x0240a944,0x021d335c,0x0210a198,0x02218504,0x021c1ef0,0x0173e27c,0x01b79670,0x016fad3c,0x031f0164,0x035795a4,0x01e92d84,0x00d9a280,0x0066ff8f,0x0003431b,0x00c8e117,0x00e1aaad, -0x00e9c78f,0x026b3a6c,0x030f3bb8,0x0278e704,0x0270c7d0,0x01d5be02,0x02601974,0x037afea4,0x0439f688,0x04291d78,0x02fd4c04,0x0184d3c8,0xfefbd558,0xfe4ff738,0xfeaa5220,0x01898276,0x00354e5b,0xfee9dfb2,0xfd0b8114,0xfc029bcc,0xfcc88e4c,0xff7950d4,0xffd1bfb9,0x005ede89,0x00204af4, -0xff6c8036,0x001f7205,0x007b8886,0x0104d888,0x0128a608,0x011bd3f2,0x01843eea,0x0198338e,0x01f0504e,0x0273bb74,0x02e2c3f0,0x02c3fe0c,0x02bb23c8,0x02423558,0x019fe614,0x018c552e,0x023d1e24,0x02b1b104,0x027b22ec,0x024b5580,0x022f4020,0x0145e798,0x00801345,0xffc6bc9b,0x005e6381, -0x00ab6e04,0x00f86721,0x0191a94c,0x02571a88,0x02f8a150,0x02c5ccb4,0x022de23c,0x017e260c,0x014be4f2,0x01c1bbe4,0x0167045c,0x00e38850,0x0186371a,0x01f58cb0,0x01eee2be,0x019be6fe,0x01e85886,0x0160c19c,0x01b1c3aa,0x012bda6c,0x0132d9b2,0x00d7ddf4,0x00e4a57e,0x0112624c,0x013698dc, -0x0141aaa4,0x01cbdfd2,0x00759595,0x00f11e47,0x0079a180,0x001a9f24,0xffcf34a1,0xff7f74f9,0xff49d9f4,0xfedd8280,0xfeea0abe,0xfee40814,0xfede8d5c,0xfefaa00c,0xfefe37d0,0xff27e6bc,0xff476b7b,0xff9a01ef,0xffe5284b,0x00252d4f,0x0036b0d7,0x0079e375,0x004b0c80,0x00b5cb65,0x00b85a5b, -0x00a45b6f,0x00b3b62b,0x0107cb30,0x014831ea,0x0173c712,0x0179e038,0x01f346ca,0x02407f60,0x025b0278,0x02040cd8,0x01976c8a,0x016f26d6,0x01675a9a,0x00696165,0x00f43309,0x00b5b8b7,0x00aa777b,0x0089cc5b,0x0074a79c,0x005af1fc,0x003c49fc,0x004a175f,0x0052ae11,0x006142c6,0x005d5794, -0x005e18b7,0x005ab913,0x006bb6f6,0x007265b9,0x007b8c42,0x00854f3e,0x008e1690,0x00c1a608,0x004fe83b,0xffeddd6d,0xff21f554,0x009d561a,0x00115830,0xff1bc0da,0xff3fbd13,0xff5f47a5,0xff8d01be,0xff906ac5,0xff9f64ce,0xffc6541f,0x005b8ce4,0x00edc4ac,0xff6ccaa3,0x0016550d,0x00f38c33, -0xff5788c9,0xff3a8242,0xff4184cb,0xff26c891,0xff1e92ef,0xff42b15d,0xff4d718a,0xff4c3008,0xff36c89a,0xfeff9b76,0xff0265a2,0xff488d31,0xff53c252,0xff5d16dc,0xff4b3de9,0xff50ce5b,0xff5ffad2,0xff98c22a,0xff72329c,0xff7710e1,0xffbcfec9,0xff87c7e3,0xff88b771,0xffafadcd,0xff9878aa, -0xff887d85,0xff8a3a30,0xff74fc79,0xff6b5f7f,0xff618fb2,0xff62f567,0xff720f42,0xffaf76c4,0xff67b14f,0xff56707b,0xff3a2493,0xff3c58c3,0xfed192ca,0xfe986e5a,0xfe6d5ac8,0xfe9be932,0xff179bbd,0xff4bc312,0xff24431d,0xfeb149a0,0xfdec7750,0xfdeea780,0xfec03390,0xff011537,0xff2d38ae, -0xff0af96d,0xff1cf78a,0xff3d47b9,0xffdda0b3,0xff6ffc0c,0xffa3dfc1,0x0013842e,0xffc774c5,0x00367be1,0x00410d61,0x0026ad24,0x0004dd0d,0x000ad4dd,0xffad3424,0xff89b57d,0xff843310,0xff8806ff,0xffb84faa,0x002d477a,0xffc61bcc,0xff65201a,0xfec2c2c6,0xfec0ec18,0xfee7e834,0xfea597a0, -0xfda75864,0xfdbca090,0xfea067a6,0xfec44fae,0xfee83334,0xfe6fdcc8,0xfd03eb14,0xfce0d190,0xfe603760,0xfea38a9e,0xff107f6a,0xfecd8550,0xfef676fe,0xff3a09cb,0x0064e1a2,0xff88160e,0xffe03ba6,0x00755a0c,0x006308cc,0x00f8b13c,0x016003bc,0x01094cc0,0x00c9a5c6,0x012a367e,0x004954a6, -0xffdb41ac,0xffdbf66f,0xffc850a3,0x0021fd3d,0x0144b12e,0x00334afd,0xff877eb3,0xfe8e2888,0xfed3f9aa,0xfdc1dd60,0xfddd55bc,0xfd1b2b14,0xfdb8abdc,0xff3ba50d,0xff49bed7,0xfed9ff5c,0xfdacc2d4,0xfb07cf30,0xfb075e68,0xfd8a64a4,0xfe4df950,0xfeb58794,0xfec688d8,0xfee2f3b4,0xff4616a6, -0x00feab9e,0xffb31060,0x00509a81,0x012612ce,0x00925590,0x01901a4a,0x020f8cb0,0x01fad41c,0x016b8940,0x014cd70a,0x01713b9e,0x01a2f5c6,0x008ce8ef,0x007afa1d,0x00a7703f,0x0287ee0c,0x00e37dea,0xffa9c0be,0xfddea2d4,0xfd6fd468,0xff617a78,0xfcb4fef0,0xfac27080,0xf9e5c198,0xf83aa2c0, -0xfbe0c350,0xfdc2e9e0,0xfea59a3e,0xfe3b045c,0xfd026e28,0xf9ebfca8,0xfc4c6620,0xfd3e10c8,0xfd1b7d54,0xfdeb2b2c,0xfe8ac51e,0x002ecd69,0xff6b81bc,0xff557520,0xfe6aa2e4,0xff071a34,0x00e8520e,0x020f3f84,0x011cd160,0x01836428,0x03760ea4,0x020bd690,0x012f5c0a,0x00de577f,0x011d5040, -0x0036423d,0x00582938,0xfe701daa,0xfdfc0fbc,0xfea0a812,0xfffc6e51,0xfa7112a0,0xfabffae0,0xf8d1ec58,0xfa5fda98,0xfe1b02ac,0x00fa2093,0x01192020,0x01aeeac8,0xfa42eab0,0xf93c4960,0xfc7bc38c,0xff5a3228,0x00ddc073,0xffd1042b,0x00d64f53,0xffe0884e,0xff0ed130,0xff721d0a,0xffb30097, -0xff2434ec,0xff3d7b0f,0xffa7ecd5,0x00e35c36,0x02f3466c,0x02b3dcc8,0xff2e082d,0xffcb7bd8,0xffe67a81,0x006f1db9,0xff701dee,0xfffc6b4d,0xfee2953a,0x02836ea0,0x0239f3c4,0xfef79816,0xfc0f0a7c,0x0b478270,0x0d6fe620,0x0ab9a5f0,0x06ff5400,0x01dcd17a,0xfbaadaa0,0xfa197c98,0xfec0bbb0, -0xf898ad28,0xf8e33dd0,0xfdf089d8,0xfe9edc60,0xfe71fac2,0xfaef6968,0xfba60af0,0xfc137818,0xfdb92eb4,0xfef4fb88,0xff9bfaf8,0xff113015,0xff239b43,0x00657c0f,0x030478d0,0x015407c0,0x00c6aafa,0xffb86cf1,0x0052ad44,0x00320df0,0x0020426a,0x007fec2c,0x011c2810,0xff7f303b,0x02f8ca20, -0x05747720,0x0a0571b0,0x0a255080,0x003883b1,0x000c4a4a,0xff00822c,0x01fcadda,0x07338900,0x0a585d60,0x09186060,0x06404018,0xfca55180,0xf95fd4f8,0xfc577b70,0xfc098fd0,0xfd5323e8,0xfc731e98,0xfcc14c7c,0xfc3a1890,0xfc880cd4,0xfca16b94,0xfdb1dcc8,0xfee0c7c4,0xff60a2d9,0x008ebdcc, -0x032b0d10,0x0150d7a0,0x00ea70f3,0x007de1e7,0x00535e08,0x00973e6e,0x008d9fcc,0xfff1bb8d,0x00f26177,0x03ad7080,0x046c94c8,0x0423faf0,0x02ea271c,0x01afdb98,0x02380c74,0x02432c40,0x01745a8c,0x000fe919,0xfea69878,0xffd372b0,0x012fefe6,0x04cb4120,0x02276ca0,0x027d533c,0x04bce590, -0x033752d8,0x01da4448,0xff796d84,0xfef0f560,0xff10f2d5,0x001953f2,0x002f8bfa,0x004a8c71,0x00d4a704,0x00f24aa8,0x01025ad4,0x0201db58,0x02e7ff40,0x02f74550,0x01a8f61c,0x0214e730,0x02630998,0x03a76d14,0x028bb308,0x01e05726,0x01683506,0x01fbe3d0,0x028e30f0,0x02d623c0,0x028c5838, -0xffb9b293,0xfec9a4c0,0xfe1ae5a4,0xfea7d448,0x004e5051,0x0137793c,0x013a5de8,0x00ef7ad1,0xfefac3c6,0xfea60574,0xff3d6e54,0x01bb5772,0x03cdd734,0x04d6b858,0x04fdfe40,0x041d05a8,0x02d0d63c,0x02214a60,0x01ae2cf6,0x01a72490,0x022102f8,0x026add0c,0x027c423c,0x01a41f54,0x012abc64, -0x0133ff32,0x01a9f634,0x020b37f4,0x02692d58,0x0292636c,0x02bae1d4,0x0248fd94,0x02d20c14,0x026dd674,0x01b23252,0x008eecd7,0x00cdc65e,0x006e6c27,0x01094512,0x0199564c,0x01f78418,0x019eceac,0x0195f5c6,0x01b8ec4a,0x0153905c,0x00d0fd8c,0xffed4871,0x005544ba,0x00968fe8,0x01296ac2, -0x014f5e6c,0x01bfbe30,0x023a648c,0x02441be8,0x01ea1a2a,0x022229ac,0x02259e6c,0x011b310e,0x0061a89d,0x01508338,0x02363a00,0x02de49a0,0x02552618,0x01bd4556,0x015d4496,0x0145cc8e,0x0152201e,0x015f21bc,0x0100b3e0,0x00bfa675,0x00939aea,0x00b68f77,0x01bedb68,0x01c9f688,0x019c8d02, -0x01597948,0x013c833e,0x0128d672,0x00fe1a7d,0x00ca8306,0x00854430,0x00623d4a,0x003ca0c5,0x0012b41d,0xffd6ffcf,0xff9771b3,0xff9ab68e,0xff8d3fb6,0xff7e9627,0xff8c68cb,0xffa7371c,0xffb1fbcf,0x004557e2,0x00c8db5e,0x013843d4,0x018dfc8c,0x01c4709a,0x02248acc,0x0224bacc,0x024b1d70, -0x025be644,0x0262d6f0,0x0260c670,0x02757c68,0x025187d4,0x023d34f4,0x02065b84,0x01e68d3e,0x017d4afe,0x01911d80,0x017477e6,0x016482ee,0x014c9b7e,0x013a4fe6,0x012eef4a,0x01299d5e,0x012989c6,0x0121d91c,0x011a1f7e,0x0101c54e,0x00ed57d9,0x00cab1dd,0x00dc50b3,0x00e5cbdf,0x00ecd9b9, -0x00ef0ae6,0x00f41c4b,0x00da8c7e,0x0109d6ba,0x0138047c,0x017b81e0,0x01636ea0,0x019b56fc,0x01d9707e,0x01c93908,0x01c43730,0x01bdc5de,0x01bac8b4,0x01b40fec,0x01b24794,0x0191d556,0x01837e84,0x01a2d8ae,0x0190ccf8,0x016f521e,0x00564820,0x002e5448,0x004baf73,0xffed5dc0,0xffedcb57, -0x00298263,0x00282b3b,0x0046b690,0x00abfe92,0x004b12f5,0x003acbee,0x005d2d35,0x0021a648,0x001a0717,0x0022fb54,0x0046e447,0x005310fd,0x004a9a54,0x00538c35,0x00630a17,0x0075aeb2,0x009d0c4c,0x00a114fc,0x00822b96,0x0090b48d,0x008673fa,0x0082bf08,0x0042e367,0x002e601b,0x00213c17, -0x0041a90f,0x0055eb77,0x0076f1ca,0x00733bf5,0x00676d78,0xfffaff60,0x002e3d81,0xff6d5d3a,0x000f6fb1,0xff544329,0xff5abe36,0x001fd1bb,0x003acd6b,0x0091eff4,0x015f2f8c,0x00803542,0x0038ab39,0x00849248,0x0002834b,0xffe6647a,0xffea6208,0x003c03a3,0x005a8c13,0x004035b2,0x006945e6, -0x008ea3c8,0x00e8344a,0x013eab60,0x01362eaa,0x011a45b6,0x00ffa1ae,0x00d90819,0x00e68893,0x00511293,0x001ccc13,0x00153963,0x004927f2,0x0085a02b,0x00cd4431,0x00c18145,0x00696db6,0xff5fcdd7,0xffafad60,0xff06a8b1,0xffb40aa5,0xfe113ec8,0xfdcd8c5c,0xff4dc509,0xff755643,0x00165b8e, -0x0232605c,0x008724bb,0x000d6717,0x00aeb720,0xff4de624,0xff25c944,0xff6fecfd,0x00243a8a,0x005cfaf2,0x0035f03d,0x00662d26,0x00b90a03,0x0174fa42,0x0200be08,0x02033ee4,0x01b37176,0x019695a0,0x016e0fae,0x017e76ac,0x00508c00,0xffcc71cb,0xffc5d989,0x001f575d,0x00b2e943,0x013ccf28, -0x01029e66,0x006c08f2,0xfedb0d40,0xff8e284c,0xfdac5470,0xff2f2621,0xfd001c44,0xfcd82948,0xffaf928b,0x00041938,0x01240c42,0x03abe1f0,0x00f4cffd,0xffd4c37e,0x011933e0,0xffab66bb,0xff1d324c,0xff352174,0xfff83abe,0x00501361,0x001edabb,0x00a81648,0x010d65c4,0x02314718,0x03394398, -0x034ac2b4,0x0303692c,0x023c7d1c,0x01da8e82,0x02cc65ac,0x013b9b7a,0x00a92120,0xffe459a6,0x0042362f,0x00eb2de6,0x0209062c,0x019039bc,0x00907291,0xfd607a9c,0xfdbe9eac,0x01c0bfb4,0xfaeb7878,0xfbd4cb20,0xfad7bd50,0xfa0ef438,0xfc1a2170,0xfdb86190,0xfe60be6c,0x039e0cec,0x03a50d64, -0xfe0be22e,0xfc98a630,0xfc15d8a8,0xfda79820,0xffe314dc,0x001923e1,0xfe3a14a0,0xff05f29f,0xffb63ac2,0x00de141e,0x00f670d8,0x010a7b38,0x01a7a86a,0x015a8568,0x018de466,0x025f57c8,0x00c5f178,0x001bad1b,0x00bebdf4,0xffe5f589,0xff82deba,0x00cb8ab4,0xff76ea4f,0xff1dba4c,0xfea4d102, -0x02b1ffd8,0xfa5aacd0,0xf9e59f08,0xfdca4aec,0x00dc43cc,0x0186fdd6,0x00332884,0xffc3c047,0x00f8479b,0xfe8c0b00,0xfc84a624,0xf8f60320,0xfb79c058,0xfca76158,0xfe75b372,0xfe52d4e6,0xfefe0682,0x00821806,0x0014550b,0xffd9c089,0x00224bee,0x0184b4b8,0x022a7804,0x034c9098,0x01e394e8, -0x0192b53e,0x00c625f0,0xffea029f,0x0012fab5,0x0040600b,0xffbed756,0xffd760a3,0xfedee174,0x00973ae5,0x008e2ff6,0x00cc4fb8,0xfc2bf148,0x08560270,0x0321774c,0xfe6c988e,0xf8df4120,0xf1f4cac0,0xf38cf6f0,0xf604d3d0,0xfb2b6780,0xfac215e0,0xfb193340,0xf85b30f0,0xfbca3098,0xfdbace28, -0xff7ae3b3,0x00982822,0x0030bc10,0xfef09f62,0xff3520d0,0xffb0adae,0xff8878e3,0x005412b9,0x01c12942,0x054ab768,0xffd0cde9,0xfe8dd2ea,0x00798133,0xff5a8d51,0x007b0c84,0x00238979,0xffcf35b0,0xffe8b0f6,0xffdfde00,0xfff8c55f,0x012bbe76,0x06ba0f18,0x07369f28,0x03d09e60,0x059fe328, -0x0a28f4a0,0x0b9b27f0,0x0a54bdf0,0x067581e0,0x01e4bb76,0xfe475052,0xfa381f60,0xfa113938,0xfa4121a0,0xff2115e3,0x006a3d5b,0xffae6a82,0xfed8f5b4,0xfe66c464,0xfe4a8c08,0xfddd1da4,0xfdb203e8,0xfe65a72a,0xfe808b7e,0xffa8ac74,0x036f3fc4,0x0099d999,0x007a2cec,0x0193d1f6,0x00039942, -0xfffede26,0x002fab91,0xfff36aab,0x0073565b,0x026beb94,0x03a283f8,0x049cb708,0x0585b030,0x03e45d64,0x01de5b3a,0x01907624,0x00f56ecd,0x00e988f6,0x00de79a4,0x0436e6a0,0x07579828,0x09616150,0x0729f278,0x03a08a78,0xfdf79bfc,0xfce518fc,0xfc4b7e0c,0xfd482360,0xfcd076e8,0xfcb4b358, -0xfc57e074,0xfd96b054,0xfe8a2f06,0xff25c691,0x000c9a7e,0x010f824a,0x02599604,0x0170186a,0x0112dc7a,0x00c4c4f8,0x01f55244,0x027c42c4,0x02cf026c,0x02e3fea0,0x030350b4,0x0316e26c,0x024450bc,0x0217c924,0x02ce032c,0x021b3f5c,0x0182cc7a,0x0198fb80,0x01cb3742,0x0186415a,0x0103f826, -0x014d2524,0x019b858c,0x02c70c90,0x03948f88,0x04257cb8,0x041b86e0,0x042b8130,0x042e4ca0,0x051588d8,0x04c17da0,0x04924958,0x03c4da9c,0x02efe44c,0x02581384,0x0200c35c,0x01bfeeb4,0x01845b76,0x014a4dde,0x0218fee8,0x02539e94,0x01c287f0,0x0146e51a,0x0119eae8,0x0110172a,0x00a921b6, -0x00df1052,0x01db6b4a,0x0236b3e4,0x0295baf8,0x02f4a4b0,0x025a6fc0,0x00bee585,0x004d7beb,0x003d45ef,0x001188d1,0x0021588e,0x0095200a,0x01099e82,0x015c7d36,0x012f2cf0,0x00e22223,0x008ddda3,0xffefb394,0xff6e0ecc,0xfef12d3a,0xfee1997a,0xfed0bfee,0xfed22670,0xfeee4cea,0xff2b4929, -0xff170949,0xff788402,0x0026912c,0x00b37ad9,0x00c1f7de,0x00fd1d72,0x014d66b2,0x016a812e,0x01425732,0x015e1d84,0x01a0a852,0x01d1883e,0x01fa4728,0x01baf738,0x018334d8,0x016fefd4,0x011d9c40,0x01fd26c0,0x01f9f864,0x01e534de,0x01e030bc,0x01b51ebc,0x0185dd7a,0x0148c92a,0x012124d2, -0x011d7044,0x013991de,0x0166288a,0x0181a744,0x01988d3c,0x019b82a8,0x0191e756,0x017bfc52,0x0163cdb4,0x013ba28e,0x011a5348,0x00ecac37,0x00dc1c2d,0x010570fe,0x01288fcc,0x013d86d2,0x015d37c4,0x017db074,0x016ea4d2,0x0176ce68,0x017a7636,0x01670dc0,0x014fda78,0x01657f1c,0x0172a71c, -0x01a142a0,0x01cd32a4,0x01cbe7f4,0x01bc10d6,0x01d1908a,0x01bbf208,0x01ab5bee,0x01a602b4,0x01a0d768,0x01a03c74,0x01987e10,0x019a3754,0x018b6caa,0x0176d076,0x016f0878,0x016de1a0,0x017811a4,0x016af772,0x01642410,0x0160e984,0x0160842c,0x015fda96,0x016904dc,0x014d7966,0x0140e1c0, -0x0124932c,0x0179c6d4,0x0167a528,0x01767330,0x017664c2,0x0177a6ce,0x017360fe,0x01766086,0x017a822e,0x016a5b70,0x0179dada,0x0194b8d6,0x0177938e,0x019db6f8,0x02137df4,0xffbdaf1a,0xffc8b58b,0xffd8c739,0xff961a99,0xff841f4c,0xffa4c1a4,0xff8009d5,0xff87dad0,0xff9e337a,0xffb6dcfb, -0xffc23ced,0xffb95581,0xffc927a4,0xffbe99ff,0xff977739,0xffabe254,0xffad5b19,0xffa8f0e2,0xffb2cc54,0xffc2f52b,0xffdda841,0xffdc6394,0xffed5693,0x0012826d,0xfffde681,0xffefc0dd,0xffdfe972,0xffc1e2c7,0xffb85d48,0xffb2b959,0xffd4fde9,0xffea77ea,0xfff654ba,0xfff6182b,0xfff228f8, -0xffae2602,0xffca97ac,0xffd9f005,0xffdd2456,0xff51f9fb,0xff2b7d37,0xff7cdb67,0xff046265,0xfefbd750,0xff1f292d,0xff64a551,0xff7de160,0xff5402a2,0xff9b2a4f,0xff98590e,0xff437ebf,0xff853cbd,0xff894cb5,0xff80f001,0xff8aa4fa,0xffb72c9f,0x000f24b2,0x003ee358,0x0064cbdb,0x007a2660, -0x0089ddbe,0x005a2f63,0xfffd15a9,0xffbcde09,0xff955d3f,0xff9cea19,0xffea9419,0x002c554b,0x00485255,0x008c501d,0x0058de15,0xff670f1f,0xffdf55e6,0x00049bb1,0x00353ba5,0xfedf1544,0xfe98738e,0xff2f6340,0xfe176760,0xfe4c3792,0xfe94e3f6,0xff555fb8,0xffa1cf0d,0xff490b8a,0xffe0021e, -0xff9aceda,0xfebd0eb0,0xff37ed63,0xff49c85f,0xff4dca53,0xff6c7ff1,0xffbb52db,0x008e3e8a,0x00c13d10,0x01101b80,0x0145e520,0x016a4d50,0x012ca6e4,0x0071bdde,0xffb1eb3a,0xff59ece9,0xff713883,0x00124915,0x00b03473,0x00ca4bcc,0x013cd42a,0x00ea0127,0xff4eab4e,0x0019e929,0x0043aa34, -0x00dc7459,0xff477f52,0xfedd68ce,0xff989ef9,0xfdd0f0e4,0xfd6bc764,0xfd866b88,0xfe7d8fc6,0xfec88616,0xfe149804,0xff582b15,0xff59a54d,0xfe303820,0xff147d0d,0xff20a84f,0xff246a9f,0xff266f97,0xffc6d1fd,0x013aaafa,0x01bfb88c,0x025573c4,0x0277dba4,0x02327a0c,0x01d18346,0x01d478ae, -0x0093ffbc,0xffe1f1fc,0xffbb76ae,0x003fa31c,0x014534e4,0x01d276c6,0x020a6780,0x01788fc6,0xfe7aec72,0xffca5942,0xffb66527,0xfa7e6f40,0xfb8b1660,0xfad7d948,0xf9f15780,0xfaf8ba38,0xfcb623d4,0xfe9a8f26,0x00bc5478,0x01dea268,0x0183710e,0x005d3a22,0xff30e0f7,0xfd764e28,0xfe73cc70, -0xff5a340a,0x005557e1,0x00223bcf,0x0065672a,0x00a81937,0x01106906,0x01456f32,0x01116380,0x025abde0,0x02685cd8,0x018a61dc,0x003b5bc2,0xff996a57,0x003227e2,0xfecdbc98,0xff28083e,0x0146ec54,0x00f4d347,0x00be1ed8,0xffc1ac04,0x01d2f4ce,0xfcc937f8,0xfc9e3254,0x007b26bb,0x0142fdfe, -0x01ce1082,0x0002583c,0xfed29cfc,0xfdb8e724,0x008f43b2,0x00a9b344,0xff0b0e54,0xfd09cc04,0xfcbe8100,0xfda6ac68,0x0006b5fc,0x00e638fc,0x0001d9a5,0x0030b19c,0x005132cf,0xfff7e324,0x006791a0,0x013d578e,0x030e45cc,0x002b3b6c,0xff57bee0,0xffe5b129,0xfff80174,0x0011fcb4,0xff2d11f8, -0xff121e09,0xfece38fa,0xfe1967de,0xfe0962a2,0xff54fc8b,0x01c949a0,0xfe6bee0c,0xfe03a3b0,0xf76a6cb0,0xf2324400,0xf1da6fe0,0xf5edfac0,0xf9b64a90,0xfd6b9cc0,0xfd1898d4,0x0090307a,0x001cb49f,0xfe3c43a2,0xfd608df4,0xfd9aa15c,0xffecf26f,0x0010ef03,0x00b37abf,0x0082e8f2,0x00b59fa3, -0x00a91a7e,0x00c02b6d,0x01ac626c,0x01c00d78,0x02412adc,0x000a7eba,0xff6742d0,0x0033ff8b,0xff56741c,0x00048e7d,0xffb6367e,0x003703ef,0x0036e3b2,0x0068fd98,0xff084aa3,0xfe384eca,0xfee83570,0xff6a66d6,0x099b3fc0,0x0bf92ee0,0x0d25d7c0,0x0aa2d450,0x05c9ef48,0xfe4b369c,0xfb1ea1a0, -0xfb6b2dd8,0xff252025,0xff240a8e,0xfc7514d4,0xfa542358,0xfabd4248,0xfeb77950,0xffc8de90,0x00afe2b9,0xff73a3b9,0x00164a8c,0xffffbd61,0xff531952,0x00767c27,0x0133323a,0x01befe52,0x00bc8f08,0x008147bf,0x00aa5adb,0xfff5e4dc,0x001235cb,0xffdca34b,0x00a51fd7,0x0126fd44,0x013ce05c, -0x032eb3ac,0x05327380,0x072ae8b8,0x07d7e288,0x0187a3ce,0x010c31bc,0x0143535e,0x0320f150,0x07152b60,0x080001b0,0x07af2cc0,0x0561dac0,0x01abe7f6,0xfe17d4aa,0xfbc2e5f0,0xf94a52b8,0xf8bc9ee0,0xfa6a3700,0xfbb965e0,0xfd385198,0xfdf37820,0xfe9e29a4,0xfeeeb6fe,0xff67a886,0x00771597, -0x00f6d99b,0x020dd260,0x00955786,0x0047c395,0x00b1a67d,0x01ebdf4e,0x0260d860,0x01b49d9a,0x02529228,0x02c18a88,0x03639450,0x02d777c8,0x02a151b0,0x031ebe98,0x024baa60,0x033f0b9c,0x02adb674,0x0259a04c,0x01b81bfe,0x00ea706f,0x00c5d1d6,0x01ec216a,0x0433de60,0x058007d0,0x063220d8, -0x06183c70,0x04c9f7a0,0x03201204,0x00b47c19,0x00af73eb,0x0014ff9a,0xff532bdb,0xfff7f138,0x0057232b,0x00c71474,0x011a94f4,0x0116f8da,0x01f77348,0x01da3ee8,0x0212fdec,0x01ee65e6,0x016bfcd0,0x00cee87f,0x005a2d46,0x00a2ffda,0x00d7e517,0x014f6472,0x01779450,0x01fbc3aa,0x029cd064, -0x03263cb4,0x01574f32,0x012360e0,0x00cbd73a,0x006ab82d,0x00217db0,0x007acc0e,0x006c615d,0x00299227,0x00888e8c,0x010d8bcc,0x01c50ad6,0x01b7b84a,0x01e57892,0x01e9b324,0x024197c8,0x027907b0,0x02ba4794,0x029bcec0,0x026d536c,0x021a5460,0x0217b484,0x026ea068,0x029391bc,0x020cfd3c, -0x0174e9fa,0x0123494c,0x016f4b58,0x0202cca8,0x0239f6cc,0x02632c84,0x0267fd70,0x0271c0d0,0x025d7128,0x025158d8,0x024e5f10,0x01d111f2,0x012f56e8,0x011a2ed2,0x01481830,0x016f684c,0x01821ae0,0x018e73bc,0x01b48650,0x01e69704,0x01e61616,0x01bae3b6,0x018e31b0,0x0158a5ce,0x0126991c, -0x00e9f4d6,0x0102e6e2,0x011e1266,0x014f3410,0x01739512,0x01cc1818,0x02062ce0,0x0153bb08,0x01549594,0x012feb62,0x01472238,0x0135975c,0x011cd224,0x01098312,0x00e72674,0x00cf948e,0x00c6ec56,0x00bf7870,0x00c50a81,0x00dcc49b,0x00ee94d4,0x00f0f872,0x00f600e4,0x0145d04e,0x00ea28e1, -0x01041010,0x010da170,0x01209ab8,0x012bc7ae,0x013182ca,0x013c1ef2,0x011ab930,0x010d3c12,0x0100d664,0x01001002,0x00fd8025,0x00ecef9a,0x011816e4,0x01315f0c,0x0146b6b8,0x0163c0a6,0x016df37e,0x01a1961a,0x0194692c,0x01a73286,0x01b7a1cc,0x015892c2,0x0176bcbc,0x01a657b8,0x01a50fea, -0x01a5e466,0x01ab425e,0x01a9ca46,0x01aa073e,0x01a77786,0x01725c9a,0x012c044a,0x01a9e0ec,0x016c525e,0x012c9918,0x0070aca0,0x00587ea3,0x005caba4,0x0058ba7e,0x005cb31a,0x00631ae7,0x004c6e28,0x0048c458,0x006926c8,0x003743bc,0x003d14a7,0x0055676b,0x00894ef9,0x008dd937,0x005e2793, -0x0061226a,0x00565ae1,0x004179c7,0x00584dc7,0x005c6c0a,0x00516150,0x005e2c02,0x006557d7,0x0060b1bf,0x008f709d,0x006aed79,0x001fbbfb,0x0013fc3e,0x000d6041,0x00054e11,0x0039d7f2,0x004d322b,0x0039f6b9,0x00788c6b,0x00815df4,0xfffa56eb,0x004a5926,0x0092a66e,0x008f0a73,0x00730eb6, -0x006ea5a0,0x009f4a94,0x008d5f47,0x00860434,0x00cfc18b,0x00218ae4,0x001b731c,0x00590d14,0x00daf8f5,0x00ed50de,0x005a73e9,0x0058c499,0x003451b2,0x000854df,0x003c0d3f,0x00445493,0x002ea73e,0x0063dfc4,0x00a5ab8f,0x00f4a46a,0x00fb210d,0x00cb6287,0x004b5d0f,0x0029e591,0x00122af2, -0xfffe2640,0x008be964,0x00c1e048,0x008afc13,0x00e9b6ca,0x00bc025d,0xfff489f0,0x00a2e8c7,0x006d0639,0x001a19f2,0x003783f4,0x004701b7,0x006605a0,0x0030e8b6,0x000d66ed,0x00a1e93d,0xff4faf5f,0xff852457,0x0010c87c,0x01411bec,0x016559f6,0x002f5f43,0x0044bc54,0x00012456,0xff9852f4, -0x00145757,0x002d9a85,0x000e2151,0x00999bda,0x00ef497d,0x0182c4c0,0x01a31626,0x014d67e4,0x001e4a4c,0xffd176d2,0xffa01eac,0xff65ed2b,0x0098c0ca,0x010975b2,0x00899fae,0x016442b2,0x0139a5c4,0xff3d7060,0x00843884,0x01ccb6e2,0x00eeeae1,0x006ed7b0,0x00724698,0x012a5f70,0x015e2954, -0x014e5390,0x01e2fb34,0xff9c2ade,0xff502f8d,0xffde3a06,0x019946aa,0x0205e7b4,0x00114bf0,0x00257fc1,0xffc179ff,0xff18d246,0xffd439d7,0xffe64d03,0xffcf5cf2,0x00e0847c,0x0180bf68,0x021bbbd8,0x02a6da48,0x025a3b84,0x00f9e34a,0x0021c361,0xff54d868,0xff2b1ceb,0x00ab99e3,0x01e21444, -0x0162ef36,0x02515cc4,0x01771b36,0xfed502fe,0x013d169e,0xfb130e48,0xfc5e56a4,0xfea41f20,0xff226072,0xfe83969e,0xfcb51b34,0xfc3218fc,0xfde351f8,0xfd2dde78,0xff23cf96,0x02dcf284,0x01994924,0x00ed9dfa,0xfff3261e,0xff51915f,0xff24cc9c,0xff5c88d4,0xff8da1a3,0x002e258e,0x0168b982, -0x01663476,0x01917c8c,0x0192d438,0x0267d47c,0x0214f714,0x00c798a2,0x0025b510,0xff7a07d0,0xff620e32,0xfeb0d456,0xff19b1e8,0x0006e8ac,0x0119e7e4,0x01846342,0x013a03f0,0xfd58cb64,0x00b46ae7,0xffba0b01,0xfea26d56,0xfe4cab80,0xffe37724,0x01756ae2,0x02209110,0x013c54c8,0x014d4dfe, -0x00d26782,0x01068838,0xfefd2f3a,0xfe44c22a,0xfda80094,0xfdcb7b68,0xfe3bff7e,0xfe828b58,0xfeff5ec4,0xff96bc72,0x008f161e,0x01b4813c,0x01bad626,0x00fb5472,0xffed669e,0xffb1d53f,0xffefa0aa,0x003f1509,0x00318ba7,0xfef247d6,0xff226fa2,0xfeece20a,0xfec0680a,0xfe1141ea,0xfdb7b9ec, -0xfe57334a,0x004ba9f7,0xf8e2f8c8,0xf776d6e0,0xfaad5cf0,0xfcd24f24,0xff608e9f,0xfd760534,0xfb8f6088,0xfbc4da80,0xfc952b64,0xfddfcf0c,0xff387df2,0xfe10e56e,0xfd6b0514,0xfc58f9e8,0xfd867144,0xfe395e4e,0xfe7f2f06,0xfeb44362,0xff49eb86,0xffe00cd1,0x017f5696,0x0110ffc6,0xfef7bfd8, -0xff916a0e,0x001c4e2e,0xffab8505,0xffce22db,0xffedbb7a,0xff9d54fb,0x0041a99f,0xffc38200,0xff7a5aa7,0xff7ec57d,0xfea33d76,0xfd0281a0,0xfb1abd58,0x09af0390,0x06d3e1b0,0x030aea34,0xfeb10fcc,0xfb0f7698,0xf96c3160,0xfa46c068,0xfcfe0d7c,0xfc787924,0xfc684dcc,0xfd0950cc,0xfd882b44, -0xfd5d28c0,0xfbeac238,0xfd8efb28,0xfe684e06,0xffa59358,0xffc7cdf0,0x0016794d,0xff6b0fac,0x01f169a2,0x01e6269a,0xff95fdec,0x000027a2,0xffc42f12,0xff73f2c6,0xfff84aec,0x0025457b,0xffc3f323,0x0018ade9,0x00966ece,0x0023a115,0x02214748,0x03e78b68,0x06b01928,0x084d04a0,0x04ea6190, -0x06680dc0,0x08b239c0,0x0937f8a0,0x089b3bd0,0x059746d0,0x01299f12,0xfbde1228,0xfafa6490,0xfb0f8408,0xfb5c5560,0xfe30a30e,0xfeaab11c,0xfc8aad78,0xfce1a688,0xfc468998,0xfc37dd5c,0xfc32cf88,0xfcef8d8c,0xfddf5440,0xff882715,0x00016884,0x001e8e74,0x003932ff,0x009a51ab,0x01b9b274, -0x009857e9,0x0043d6e1,0x009c2553,0x019ec586,0x024e7350,0x02981540,0x02f479b8,0x0357994c,0x0390027c,0x0485b8e0,0x01df68ca,0x01f0afdc,0x0209dcbc,0x0266b7b8,0x03212a7c,0x0499c000,0x0588b618,0x055d82b8,0x04d4a2a0,0x032d6818,0x00dd0e84,0xffb97b12,0xfea37230,0xfdb4c058,0xfd174bd4, -0xfd550768,0xfe529f5c,0xfe8a9bc0,0xfef550c6,0xff7ed8a8,0x00770351,0x013da328,0x01dafd08,0x01c2a8b0,0x016a1274,0x00fc046d,0x0123b1be,0x01848190,0x01fc8314,0x0220f57c,0x02119788,0x01d93c54,0x01c05ad8,0x01b90564,0x019b9bcc,0x01ff8b12,0x026d2a48,0x028a8dcc,0x025fdb64,0x02262958, -0x01b9ea8a,0x01e00e02,0x01ebc968,0x022203bc,0x02995d8c,0x036545b4,0x045f8b18,0x04477e08,0x0423f3b8,0x040af098,0x03b8acd4,0x035cca6c,0x02fe138c,0x02c7b978,0x02a7bb48,0x027562cc,0x0222f76c,0x01de4d50,0x01a1df9a,0x01af166e,0x01dfe488,0x01d1c1a6,0x0208e720,0x01f2286e,0x0201ad20, -0x01bfb81c,0x01b5053e,0x018bd95e,0x01ea4ec0,0x024f6a50,0x02ac9cc8,0x02787a08,0x00ba8627,0x00e4ff16,0x00e508e4,0x00e9dc16,0x00fc2aba,0x01116358,0x012ccab2,0x013a34fa,0x0170976a,0x01787368,0x018bb8d4,0x01a11b6c,0x01d8dd9c,0x02112b64,0x023acd18,0x02670874,0x0284bee4,0x02ace770, -0x02b908cc,0x02ea01bc,0x02dd3200,0x02989e34,0x02573528,0x0200a98c,0x01b23e8c,0x016a9adc,0x014a1106,0x012bd648,0x011d603c,0x010f9c6e,0x0107b478,0x00e56b0d,0x00e5bd5d,0x00caddda,0x00d64bbd,0x00e808bf,0x00949064,0x00d65702,0x00d515a0,0x00e015b4,0x00e59b97,0x00df4f29,0x00d76c5a, -0x00c85691,0x00dd53ce,0x00f56dd2,0x010c6d46,0x01315960,0x014a3bf6,0x0163a34a,0x0157f5d8,0x01541cc0,0x01545b9a,0x0150f88e,0x014fc4f0,0x01539d3c,0x01270b5a,0x00fe9618,0x00d654a0,0x00f8d66b,0x00c64a8f,0x0082aaf5,0x008990fc,0x00896c07,0x0080f5c5,0x007c5da0,0x0075be0c,0x007338f0, -0x0088b0ad,0x00b1cd8f,0x005cbc5d,0x0077f095,0x00d866e9,0x00434c60,0x00346f4d,0x0002e78b,0x002e90b6,0x003a2560,0x005557b5,0x00437f7c,0x00398841,0x0037c36f,0x001783b1,0x000ae9e9,0xffe21e2c,0x0032d8b1,0x004b7801,0x0067c056,0x0037fee4,0x002ef3a2,0x0034ca82,0x003d3cc1,0x0042f590, -0x00496b58,0x005cac73,0x006d794e,0x009a92fe,0x005f4ea3,0x004f8c69,0x0039970c,0x003bf2c8,0x003cac71,0x004349e0,0x005d2a6d,0x006410fa,0x00495e46,0x005ba93d,0x0055a8d6,0x0026c63b,0x0041cca4,0x008b05ea,0xffe9aba3,0x00166dee,0x00392916,0x007168ad,0x0063ddeb,0x0057cf0b,0x004f8fb2, -0xffdbb791,0xff9ae9b9,0xff48774b,0xfff583e0,0x0052d9a7,0x00a83039,0x002f58bc,0x000d7d3b,0x002a47ee,0x0033ef23,0x0050765c,0x0059434b,0x0078f9af,0x00b67f7a,0x00fc74f3,0x00b124d1,0x0080e89c,0x002bf0f1,0x00137acf,0x00127e22,0x0034a434,0x0072d58d,0x00812b86,0x0053839e,0x007faf69, -0x006f5303,0x0014a5aa,0x00797556,0x0020359f,0xff646984,0xffebe8e2,0x0043f603,0x00c28313,0x00862c57,0x006efda4,0x0021bc63,0xff5e269f,0xff0decd8,0xfe5666b6,0xfff72419,0x00852346,0x01135300,0x002091b1,0xffdfa927,0x00132f85,0x003021ed,0x006c7934,0x0059a1e0,0x00b40a7c,0x0133fdd4, -0x01ca6d2a,0x0134d894,0x00b12a2d,0x000a10cf,0xffd63507,0xffe7445a,0xfff9a7cb,0x009b8eea,0x00b85bbc,0x002f48e2,0x00dd1b99,0x00e2b29f,0xff8bfb32,0x003a1558,0x0175ae7a,0xff788b94,0xffdbfda8,0x007733dc,0x0101a632,0x0120caee,0x00e9958c,0x00b7bcef,0xff697051,0xfe437df4,0xfcf2ba04, -0xfef454f4,0x00779c57,0x018adbfc,0x001c659a,0xff99ffc0,0xffd993e6,0xfff5735c,0x004e27c6,0x00420a67,0x00a6b41e,0x017ca4e4,0x026b23a8,0x0219e558,0x01a5f136,0x006701b9,0xffbeaf81,0xff3c15e0,0xff5f5cfe,0x00f535b5,0x019d6e7c,0x00b4f712,0x0190e8fc,0x00b5c822,0xff1f183c,0x01370832, -0xfa9dd398,0xfe9733b8,0xffb6475a,0x001a9955,0xfebd67ce,0xfeb6a24e,0xfe42a4b4,0xfe214d32,0xfba01a98,0xfcd6b8fc,0x02160204,0x018254ae,0x014d4d96,0x00f4379a,0xffa379e8,0xff901be9,0x0087bb83,0x00e8e19c,0x0112a784,0x0103f6ca,0x0104d560,0x01a692b2,0x030069c4,0x01b44e46,0x00f0ab3f, -0x00293695,0x00590945,0xffefdb4c,0xff375575,0xfee74406,0xff48356d,0x0022431f,0x00a695a3,0x015bd032,0x02bd67dc,0xfc3b13d0,0x021ed9a8,0xff8aa2d6,0xfeec3b6e,0xfe876608,0xfdbd6f98,0xffc32dfa,0xfff7cab4,0xfe20c142,0xff4d2939,0xff92c521,0xff9dd3b2,0xffc94830,0xffe23c55,0xff031eaf, -0xff55dfb2,0xff292dc3,0xfec7ec4e,0xff19714f,0xffd18d57,0x002fb953,0x011ff2ec,0x00ca69fb,0xff0805c8,0xffa5dee3,0xfff7cbe7,0xffd3aab2,0x001215c5,0xffd9757b,0xff314848,0xff5efd28,0xfed9f1d6,0xfe91487c,0xfd306010,0xfccdf4d4,0xfd57856c,0x013afc0e,0xfc8341d0,0xfeba6e3a,0x0299fe10, -0x033eb814,0x00678fd4,0x00118791,0xfec1dd4c,0xfbd4d1f0,0xfcf82c70,0xfd0df69c,0xfd415ce0,0xfefe73aa,0xff56505a,0xfe7f22c2,0xfdca6668,0xfd89ab6c,0xfe214e1a,0xfe63c7bc,0xff14865f,0xff8521f5,0x01011e16,0x00eb7243,0xfe948dee,0xffd9eb5c,0x00babb11,0x0023627a,0x001b564a,0x0013b18b, -0x0021a724,0x001f2d3d,0xff7f91f5,0xff8feda1,0x001245d9,0xfef55e5a,0xfd8f4498,0xfca371a0,0x0196795e,0xfca6c2cc,0xf6470f70,0xf54a16c0,0xf6c9af80,0xfc60c428,0xfe838184,0xfc87a030,0xfe9c3196,0xff01c68d,0xfeed5996,0xfede95b8,0xfede2aa4,0xfed5ad3c,0xfef9c892,0xfed397e6,0xfed4ad94, -0xfe6f3f12,0xff187a62,0x00116bd4,0x00d765fe,0x00b57399,0xfee2a1a0,0xff40e572,0xff43ad32,0xff1a584f,0xffc8ae79,0xffbc16ab,0xff19eae4,0xff6557f7,0xff647406,0xfe619ba4,0xfef09f08,0xffc462cd,0x025cd8e0,0x0297a960,0x083a5090,0x0a0a6990,0x08f7f010,0x066ac4d8,0x02b25d2c,0xfdaa03dc, -0xfa999f18,0xfa072f08,0xfc1ad7e0,0xfd612684,0xfe853418,0xfe3bcf20,0xfeccd2a2,0x00062fcb,0xff62aa86,0xff00d3b2,0xfecf9486,0xfecf81d4,0xff007150,0xfedf96e0,0xff44ac3f,0xff9487a0,0xff4df3de,0x003e6a7f,0x0081b600,0x00a6bdbd,0x00464e7a,0x000f9173,0x0040c1f1,0x011a40cc,0x0214af44, -0x03438518,0x04d97c48,0x05672d38,0x05093bf8,0x06d398f8,0x0309e264,0x034a1eb0,0x04739090,0x0588f2b8,0x06d2bd90,0x07961d48,0x068f0d98,0x03900e68,0x0046d1a1,0xfdc82a74,0xfc8a1528,0xfac192a0,0xfa72dd58,0xfb4da9a0,0xfc12cad4,0xfce6bf6c,0xfdb5045c,0xfe503dac,0xff02f7ab,0xffba8b28, -0x00ac1321,0x00d07384,0x003672d4,0xffd1d646,0xffee965c,0x00ab6327,0x01c4a298,0x02673e4c,0x0271ca78,0x02991bd0,0x02979de0,0x024b1d00,0x02b711b4,0x02f27bf8,0x02bb6484,0x033d89b0,0x02cf198c,0x035154bc,0x03fac724,0x0452c998,0x04a1bd60,0x04b6c740,0x0517ba60,0x05ea1678,0x059299c0, -0x0545c700,0x05023e38,0x045bcaf0,0x039f1164,0x02be731c,0x024636b0,0x01c7adc6,0x013d7bf6,0x015b3810,0x014c845a,0x0186f0d4,0x01ce1932,0x018713c2,0x01a0304e,0x01adabbe,0x01aac6c6,0x018c12f0,0x0159c630,0x014a944a,0x01289b6a,0x012b1140,0x010f94fe,0x010c32c2,0x017188f2,0x01c434da, -0x0216d930,0x0278666c,0x020b7624,0x02e2786c,0x02f707b8,0x03105b78,0x034df618,0x03815390,0x039c6b00,0x03b2d000,0x035aa8b4,0x0329b1dc,0x02f80ab4,0x02e32a58,0x02d9eaf8,0x02d841d0,0x0296deb8,0x02594970,0x020f3978,0x01d2baae,0x017f3964,0x012e259c,0x017b710e,0x01a3965a,0x01c64432, -0x01c233dc,0x01e57878,0x0218cfac,0x0236d238,0x024da750,0x0253765c,0x0271b460,0x02a1a040,0x027dc32c,0x0292eae4,0x026ad90c,0x026800cc,0x02b57a48,0x0278c9dc,0x02ee2d50,0x02d76350,0x02ebcf88,0x02eb6a8c,0x02f3494c,0x02fd66dc,0x0315f3bc,0x0312439c,0x03139ac8,0x030f47f0,0x03075d78, -0x02fcbd38,0x02fe4a98,0x02d70458,0x02ba32c4,0x029f8934,0x0276b8b4,0x025b2f5c,0x0228d660,0x020b708c,0x01f4e50e,0x01be57bc,0x024403a4,0x02194c38,0x01d68150,0x01d27ee2,0x01d0111a,0x01d3f9a6,0x01ce303e,0x01c85a70,0x01d3c0ea,0x023da518,0x029c28bc,0x01cac84e,0x02386cf4,0x030a3694, -0x0064faa7,0x0039f7bf,0x0024b126,0x0034a594,0x0041fd1c,0x004177af,0x006e340d,0x0071c96b,0x005a4c4c,0x0047496b,0x003512c3,0x0020b48d,0x0027f908,0x003cc054,0x00824348,0x005d1ff8,0x005e960f,0x0069465a,0x00725c5b,0x0078431d,0x007da091,0x008440c8,0x00800160,0x007c163c,0x006b7dce, -0x0055591c,0x0038b054,0x003a19d5,0x003f5878,0x00619143,0x004beb14,0x0045338f,0x003e623a,0x004b7b99,0x00608f69,0x0053b28a,0x004911a0,0x00296a39,0x0000823b,0x000b5aa5,0x00140029,0x0007b538,0x00853af7,0x00939ba1,0x004b7bbe,0x001d9fec,0xffdbdb02,0xffba3eb6,0xffa25638,0xffdeb68e, -0x00a20b51,0x005684c0,0x0064edff,0x0085430e,0x00a51563,0x00c05789,0x00bc8748,0x00d89029,0x00ebb36e,0x00e639ba,0x00ab091a,0x007c66a9,0x00499dbd,0x0040092c,0x004ef686,0x009735e2,0x0078c95b,0x006eb4f9,0x0061e515,0x0043c9ff,0x0055d4b8,0x00a93f8d,0x00764ac5,0xffce36e6,0xff2e9c06, -0xff8277a1,0xffaf7ef2,0xffb447fd,0x00da1549,0x00f9f41d,0x005225c0,0x0001f650,0xff79a202,0xff1476c1,0xff1b4a28,0xff8952a4,0x011870fc,0x005ee5f4,0x00691644,0x00a038e1,0x00db74d9,0x010f0dcc,0x00ff15a4,0x0163616a,0x0185677c,0x0186dcf2,0x01062fb2,0x009a4a9b,0x00392abb,0x0013a8b2, -0x00577767,0x00c9143d,0x009451dd,0x0062e43f,0x00588264,0x0048b8c2,0x00798994,0x00cd05bf,0x00563626,0x001f9d2f,0xff131b97,0xff276be1,0xff3bf676,0xff0bd074,0x00c25ba5,0x0107ea22,0x002de09b,0xfff79447,0xfed789f0,0xfe14d64c,0xfdbe8380,0xfed0a68a,0x0130874e,0x00573a93,0x00595e1c, -0x00b0119c,0x0124a76a,0x017d7e08,0x014cfa58,0x01b3d1b4,0x01e9555c,0x02596b58,0x01ba63b2,0x012918f8,0x00596d53,0xffc83789,0xff9a04b2,0x0046ffa8,0x00d68a7a,0x00e4223b,0x00626461,0x00661360,0x003a086f,0x00f275c3,0x00d853dd,0xfcc079e0,0xff1bdf08,0xff2a33c6,0x0010179b,0x00b04a18, -0x01e154cc,0x01865cce,0x009389d7,0xfe1d0e3c,0xfe60f906,0x023106b0,0x00936527,0x003f56e9,0x011450ae,0x0085da65,0x0070769d,0x0068b00d,0x00ab47d0,0x00d55c68,0x00c60fd0,0x01b4c01a,0x022290fc,0x02571758,0x0167255e,0x00ae0e42,0xffe1c67d,0x0051de1d,0x00498120,0xff79b398,0xffc9d793, -0x0019b83f,0x0047f8b3,0x0168b8c6,0x0197cc3c,0x019b536e,0xfd554ae8,0x0100be38,0x01c6bf4c,0x0156c070,0xff4d9260,0xfbd8ff60,0xfc7e2978,0xfd60fda8,0xfebab12e,0xfe7efdd8,0xfe7caffa,0xfebbf6ee,0xfe6ab1c0,0xfecc2e22,0xffbe7071,0xff7430c1,0xff6a8df2,0xffee42ec,0x004c1ee5,0x00df91c0, -0x0170cec2,0x00d33540,0x00866b87,0xfff0d6a8,0x0051dbb8,0x00b3fc7d,0x005b4602,0x001242cf,0xffbc972c,0xffb64dd3,0xffa49a83,0xff2b2225,0xff002c57,0xfe3e1acc,0xfe245366,0xfeba4802,0x006b97c1,0x00316dcd,0x01c86148,0x010368f4,0x00cda419,0x01bc684a,0x01e81fc0,0x0144cb58,0xffc433ee, -0xfe245e62,0xfe03588c,0xfee2a63a,0xff3e89c3,0xff8a15b7,0xffd1f8e4,0x0028ce3f,0x004ecc86,0x0081eab5,0xffd61d9d,0x0017a40e,0x010ec24e,0x0079f43a,0x007fde78,0xfff6f051,0xfffaec27,0x003f0ec4,0x002f9ae6,0x000aa57b,0xfffac9fc,0x001ffd5c,0xffb520d6,0xfefe7fec,0xfe9535e0,0xff56cbfe, -0xfecd120c,0xfdcde7d8,0xff01be6d,0xfa31af10,0xf79e0420,0xf6966900,0xf807a880,0xfc34765c,0xfbdfa9e0,0xfcc37c60,0xff1dc772,0xfe23390a,0xfebb092e,0xffbc12ab,0xff689f6c,0xff5d6499,0xff34d83f,0xff1617ce,0xff1efc43,0xff647d29,0x000a9c1a,0x00a04f7c,0x01b37e00,0xfffcab22,0xff81d535, -0xff9b5f81,0xffc75618,0xfff34471,0xffe5e66e,0x00343e2d,0xfffabd7c,0xff7b7c0c,0xfefd7034,0xfe9187ae,0xfdb72440,0xfdb11a48,0xfd236bf4,0xfcfb1e94,0xfc247cc4,0x073289d0,0x05ed0548,0x0342b768,0x001f1d75,0xfc114e00,0xfab5ea50,0xfb601450,0xfd9b4480,0xfd7b0040,0xfd828684,0xfd523938, -0xfdbe6fe0,0xfdfd6444,0xfdc47524,0xfea306a6,0xff63dbe0,0xffcfd39a,0xff615e17,0xffa1c5e3,0x007ea0d3,0x00839949,0x008a57bc,0xff87d41f,0x0018f979,0x0012c6e3,0xff85650d,0xffbdf14f,0x00086679,0x00a6fdcd,0x009a2d83,0x013a0af8,0x01e066f6,0x04adb468,0x06035b78,0x05daed08,0x0673bf38, -0x04a753f8,0x04ba2ae0,0x04de7708,0x0468f9a8,0x039cfbb8,0x0196c434,0xfedf523e,0xfbff5ce8,0xfbc33f58,0xfc0d3fbc,0xfc883dc8,0xfcfe1218,0xfd4fb1bc,0xfddbc51c,0xfd16a718,0xfd020da4,0xfd7579a4,0xfdb06ac0,0xfe2501fa,0xfefb7d00,0xff61e7f0,0xff9f6aed,0xffdaea1c,0x005a8933,0x00dd46d8, -0x0196c0a0,0x01c1b7c2,0x0219f308,0x02b9cb5c,0x02dc5f6c,0x0321d00c,0x0369c780,0x031af908,0x0320cd80,0x0390de08,0x044c6d50,0x03dc701c,0x044ade28,0x04e482f8,0x05728290,0x064e37e8,0x05d3baf8,0x05c4b168,0x05a0c1e0,0x03f14960,0x02126a5c,0x00357fef,0x001163c4,0xffcd5d37,0xff9b87f6, -0xff9c9fb2,0xff9a2ca4,0xff679ccf,0xff861b44,0xff9c383a,0xffa94f6d,0x0026fbec,0x009617f2,0x01052738,0x014a3d70,0x018d17ae,0x01c98db6,0x01ba9a42,0x01d944fe,0x01c252a0,0x022ad2d4,0x02456acc,0x029f6978,0x02e8b25c,0x030b0b84,0x032366fc,0x03905924,0x042478a0,0x044d3470,0x0420ef08, -0x03fc2ef8,0x03d38a4c,0x03b4f3dc,0x0385b654,0x037deab0,0x03591a98,0x037e04c4,0x036ca5b8,0x035adc4c,0x03279200,0x02f0289c,0x02bc3128,0x02855f80,0x02587e2c,0x02282490,0x01ef8cd6,0x01b1c9b8,0x01f30fa2,0x0209d250,0x02308c30,0x024a46a0,0x02753a98,0x02a2646c,0x02e17da0,0x03179914, -0x03386538,0x03664e68,0x038a4f04,0x039fa858,0x03b7c6a0,0x03d148f0,0x03ee35f4,0x0419ff00,0x0395acc8,0x03b45c64,0x039dbf98,0x03956dac,0x038766b8,0x038d4190,0x038f78a0,0x038c3204,0x03828618,0x036d32e0,0x036303fc,0x03442a30,0x03309f08,0x0322b8f4,0x030f505c,0x02fd346c,0x02e9a380, -0x02d21520,0x02c01540,0x029f1e04,0x02be5a4c,0x02c0c16c,0x02b84b0c,0x02eab258,0x02ec30e0,0x02d6fc38,0x02dedbe4,0x02e9aec0,0x02fea804,0x03092258,0x031c2f70,0x032deb08,0x035af1bc,0x037d2a60,0x035b4ab0,0x037f8af8,0x03c08e9c,0x00929b9e,0x0070fb55,0x006308c3,0x006974d6,0x00758432, -0x00725976,0x009b5267,0x009b7216,0x0073612d,0x00852cc9,0x007038c1,0x00329be3,0x003dab9d,0x004ae1ca,0x00742998,0x007f362f,0x008acd7b,0x008dc834,0x0096c139,0x009ef449,0x00ad35f3,0x00aca0d6,0x00a4e262,0x00913d87,0x008c77c0,0x007c89e2,0x005fefba,0x006cafc4,0x0078a11a,0x00a51591, -0x00760c70,0x006c69e7,0x00804534,0x006f71ba,0x00882606,0x00c31468,0x00833d56,0x00780e7f,0x00676b79,0x006fdf08,0x00637f31,0x003a09eb,0x009bd971,0x00aea8cf,0x004fc4fe,0x00930a7a,0x005265aa,0xffb164ba,0xffaaad0c,0xffc7f1ce,0x0048face,0x00787d7f,0x00a637ea,0x00ae28d4,0x00c63ea2, -0x00df34bb,0x00eed6e9,0x01044e66,0x010d563e,0x00d89ff5,0x00b8e6b6,0x00935554,0x00667de2,0x00749e1e,0x008e0add,0x00f41f0a,0x00983a03,0x00849358,0x00af2832,0x005526a5,0x0085833b,0x0169f192,0x00cab391,0x00486412,0xffeaec2c,0x00240d26,0x00480d22,0x00231c44,0x00f1d2d2,0x0108420e, -0x001c5735,0x00bf55a5,0x002ee445,0xfecbb62c,0xfedd3a3a,0xff233be3,0x002590f9,0x00668a8c,0x00af1a87,0x00c7ab59,0x00f3de4c,0x012f7c32,0x01577d1a,0x019e62c8,0x019f4d34,0x0142c33c,0x00f97fd8,0x00a5f847,0x0056641c,0x004d2fb0,0x009ebc5a,0x016cb3c0,0x009b7458,0x006f2bf9,0x00ec324e, -0x0041b747,0x0082387d,0x0238dcf8,0x00d03418,0x00ab4f1a,0x00481823,0x0076cded,0x00126b49,0xff577bcf,0x00928cfc,0x00c9909c,0xffb0da8d,0x00d61870,0x000bee6d,0xfdc775ac,0xfd950378,0xfe09cbbe,0xffb42625,0x005262a8,0x00dbaf8f,0x010affbc,0x013d8944,0x01956b68,0x01b08156,0x021831c0, -0x023704dc,0x01f4ce3a,0x017e6a5c,0x00ec617f,0x0058ec66,0xffde804f,0x0037dc6d,0x01801432,0x00d498ca,0x008f855e,0x00e451e4,0xffcbc887,0x006e8d66,0x0339c16c,0x017508e2,0xfe519c52,0xfedfd746,0xffb1bb55,0x01155dd4,0x025de3f0,0x0217017c,0x01bc6a6a,0x01dc868c,0x000f86ea,0xff758e15, -0xffa64387,0x001b4caa,0x00451b78,0x00a147bf,0x00284cc5,0x000695d8,0x004e0a9e,0x00ce479b,0x015b95de,0x017c0656,0x028b67b0,0x02ab055c,0x01c8c6f8,0x015a2ce8,0x00ec6aaf,0x004bb258,0x008dacb2,0x007062a1,0xffc78319,0xfffe95d3,0x009767e9,0x01780124,0x01ebaa9a,0x01346774,0xffc3189c, -0xfeb31cca,0x005f4cc8,0x05206070,0x01605c56,0xfebcb172,0xfdf009e8,0xfb47c610,0xfc19ba20,0x008bffdf,0x0012259f,0x008f8430,0x00cfd3d0,0xffe54029,0xff5386d5,0xff4c0746,0xff46b791,0xff8934d7,0x001a1467,0x006630b4,0x00b7d5c3,0x014fae34,0x004e3bdc,0x003b4ee2,0x00b6632f,0x009dcbb6, -0x00ae6658,0x004bb89c,0xffe0fd0a,0xffaaf74d,0xffe55517,0x000d51c4,0xffb0f57b,0xff2e0c3b,0xff28f69f,0xff527fdd,0xff802b67,0xfef24af2,0x00a501d1,0xfff70942,0xff6da7e8,0xffd8750e,0xffd6fd78,0x0218c614,0x02715918,0x00c0f6bf,0x005e2579,0xffc801e1,0xff4160eb,0xfeeb6092,0xff51e441, -0x003a1721,0x001a066c,0x002d78ce,0x0086298d,0x00b85024,0x013ac620,0x02c06de0,0x00c39152,0x006b9d60,0x010708be,0x00b1522b,0x006f3eea,0x0052eb3a,0x005c558e,0x000e4446,0x000aefd2,0xff727727,0xff12b234,0xfef10dfa,0xff13205e,0xfe69a6fc,0xfd822ae4,0xfffe56e7,0xf9ea3e60,0xfc733b10, -0x003a5d8e,0x0055261c,0xfd15b044,0xfd93c6d4,0xfdb9e6f0,0xfd9cae1c,0xff5f8018,0x00034a1b,0xffe59bb9,0xff084831,0xfe97fafe,0xfec7f920,0xfe867d26,0xff15e179,0xff77240e,0x003466d8,0x00a4fc2a,0x0169c7e8,0x002110ef,0xfface23a,0xffe0ebf4,0xfffa4b4c,0x00447c89,0x0045f6af,0x00098cfa, -0xfff2fa8e,0x000914ff,0xff8751b3,0xff264bfe,0xfef4b4e8,0xff01dfe0,0xfda52714,0xfb7f5088,0xfa690bc0,0xfffa256f,0xfbfc8ec0,0xf8ed1ff0,0xf94a3ef8,0xfab2f538,0xfdb9ab80,0xff27ad80,0xfeb700aa,0xfed3107a,0xfeeb66d0,0xff989373,0xfef6e460,0xfedf6cfc,0xff7026fa,0xfece023e,0xfebe2e9a, -0xfefacdee,0xffd40220,0x0058d368,0x00cf2896,0xffc3626e,0xffda9abd,0x00aa9f09,0x006f3df3,0x0030a163,0xffb35d00,0x0036fb3f,0x0055eccc,0xffe67393,0xff810d14,0xff667df0,0xff618ffd,0x0089e315,0x01a067bc,0x02954ab4,0x01143712,0x068af6d0,0x064b4758,0x050d1ed8,0x02c76080,0xffd71363, -0xfc8f30f8,0xfb373b18,0xfb7ece40,0xfc9b5224,0xfd671210,0xfdb64f5c,0xfe7981e8,0xfeb87050,0xfed38abc,0xfec1e3be,0xfeb1d08e,0xfefa0726,0xfeb6ca96,0xfed90896,0xff4ece2e,0xfee7e766,0xff18a4f3,0xff67c57e,0x005a2657,0x012cf188,0x01d031ee,0x01d380c6,0x01eaa146,0x02271cd4,0x0337cc58, -0x03f021b0,0x048a3308,0x03eb78b0,0x04045bd0,0x0533fab8,0x05aeba68,0x036a14c8,0x03673f1c,0x02d9d0cc,0x02a006f0,0x02a0be3c,0x01b9c556,0x00a36f41,0xff3f2a89,0xfe662ec6,0xfd895d3c,0xfc8462e0,0xfce3299c,0xfd23795c,0xfd577134,0xfdb5c7e4,0xfe0aa3ac,0xfe664336,0xfedf0a10,0xff43a4aa, -0xffcb316a,0x0042083e,0x008859af,0x00b67167,0x00d5dca1,0x00f0ba89,0x01010038,0x0198589e,0x02153880,0x02aae070,0x02efcd3c,0x0341d558,0x03abf044,0x03b26de8,0x03b9e7e0,0x03abd690,0x039ddb88,0x03907894,0x02edf2ec,0x02c0cb04,0x028fe6d8,0x0246f48c,0x020b8714,0x01f346a2,0x01e2f978, -0x01c37684,0x019f2562,0x016be2b8,0x0124f0d8,0x00d2d689,0x00918098,0x00831102,0x006e6a01,0x004d1dee,0x00319bf9,0x000ba5b6,0xffe2329b,0x00a0c51f,0x008d9c2a,0x00e08537,0x013c8d22,0x01b15680,0x01dd1e32,0x02148498,0x0249e13c,0x029af2b4,0x02be41bc,0x02f69754,0x034c2dd4,0x033df754, -0x034c5aa8,0x03440cd8,0x030fefa8,0x02f280ac,0x0276429c,0x02870a78,0x0275309c,0x026e01a0,0x026ef978,0x02659a30,0x025e3c74,0x023bc6f4,0x02214730,0x020f2ef4,0x01f1d0de,0x01d9e6f4,0x01b50660,0x01b69cb4,0x01b24300,0x01b34752,0x01b03ebc,0x01b8fe7a,0x018e45cc,0x0214f4bc,0x025d0134, -0x02d37184,0x023df8ec,0x0297b548,0x0315508c,0x0325bbc8,0x03319eb8,0x033990e4,0x0353c5a0,0x036562c0,0x037c6dc0,0x0332ce30,0x02dd40a0,0x037fe900,0x032fbe30,0x02e4d0a4,0x00b763f7,0x00a7b9d9,0x00a2e293,0x009e2a66,0x00a41bb8,0x0096516c,0x00bb6b87,0x00bae02a,0x0091c37e,0x00afb871, -0x009fadad,0x0065bbd8,0x00696fe2,0x006a5336,0x006e66ed,0x0096e0a1,0x00a88e15,0x00ac7d1d,0x00b679ae,0x00c08c40,0x00d5c5f0,0x00ca3ea8,0x00bfc88a,0x00a7392b,0x00a4f265,0x009d4323,0x0090c31a,0x00985115,0x00a11b96,0x00bd73ae,0x009d4094,0x009998e1,0x00acbf68,0x009651e9,0x00a100eb, -0x00f24f77,0x00b2693c,0x00e6b5a5,0x00d6de3a,0x00ae28c6,0x00890066,0x0065de2a,0x00bd5456,0x00d1bd28,0x006d0018,0x00cff6cd,0x00a07b74,0xfff8b0de,0xffebbe86,0xffe54689,0x00056adc,0x007e31c8,0x00be95c9,0x00cbc485,0x00e99d51,0x0107b2c6,0x013b08cc,0x01293df2,0x01154d02,0x00d5c25f, -0x00bfe58e,0x00ad1cff,0x00979c4c,0x00ac2a36,0x00c0ab5a,0x00f53890,0x00c68fd1,0x00aea236,0x00c78af2,0x00785c20,0x00b243d1,0x0199129a,0x011fac14,0x00e014a9,0x009c89bd,0x00a778bd,0x00bdd58a,0x006f851e,0x0117c0ca,0x010c441a,0x0042c5f0,0x00fdc8a0,0x009788bd,0xff725991,0xff4486b8, -0xff3f025a,0xff785051,0x004a9e29,0x00c4232c,0x00d85e81,0x0111c6a0,0x0151497c,0x01b08fe6,0x01a433ca,0x0180868e,0x00f18b7c,0x00e1ea37,0x00b5ec57,0x007d1d49,0x008cd51b,0x00ba7451,0x014021ba,0x00b6c39a,0x00a4c4a4,0x010580d6,0x00610877,0x009b308f,0x024b6d78,0x012700e6,0x019a96bc, -0x012e4164,0x00e09b6c,0x0033192d,0xffa044af,0x009697a4,0x01033524,0xffdc9e07,0x01085390,0x008e9502,0xfe9e90a8,0xfe300fc2,0xfdf26978,0xfe80d8e4,0xfffef6aa,0x00dcd5ce,0x011f3e94,0x016c8fa0,0x01cc8f16,0x0251dd00,0x0256123c,0x022329c4,0x016df3c6,0x01492fb4,0x010a56c0,0x009893e9, -0x0018988a,0x008c2831,0x01e5220c,0x00e5fa33,0x00a2d2d8,0x010eea80,0xffccd9b1,0x00c77e88,0x03d38b14,0x0257946c,0xfe9be646,0xfff88aca,0x007b1a4e,0x0240f458,0x050ee0d8,0x02870bd0,0x011ff49c,0x00b46893,0x0169c84a,0x010e3fa4,0xff1f20fd,0x010af920,0x012bec5c,0x003a90f9,0x0048d0e6, -0x0036a898,0x004e4008,0x00600b1c,0x00e59738,0x01dafc0c,0x0203aa14,0x01e71f50,0x01834484,0x0178d1ae,0x014ee404,0x00955387,0x00aee800,0x00612029,0xffa4d3a0,0x001a6156,0x01229e26,0x022a34b4,0x023fa708,0x00d4f720,0xfe599ca4,0xfe1abdd0,0x00c4f7b3,0x048d2288,0xffdbdd07,0xfdbac248, -0xfda244dc,0xfd3d98bc,0xfeb1ed82,0x01f09678,0x00ced94c,0x009ef2c7,0x0165395c,0x012a95d2,0x00b52e1c,0x007651e5,0xfff48aff,0xffd7228b,0xfff1ab74,0x007919a8,0x00b3adbc,0x0122dbe2,0x00ca7a5f,0x00d67382,0x012137de,0x00d66cea,0x008e7bf7,0x0097824c,0x00203c4f,0x0001a18b,0x004f21a4, -0x009f31fa,0x003f17c5,0xffb2b04c,0xff6eefb1,0xff8f281a,0x007e0055,0xff5fe124,0xff691149,0xff5cc313,0xff2dbaeb,0xffc6a12e,0x001cc3a7,0x012997ec,0x012fc834,0x01730f42,0x00f93d6c,0x008b6751,0x0072996a,0xff2b8684,0xff31a095,0x0036278a,0x0029dd7b,0x005e1b93,0x006e1652,0x01167d06, -0x013aa97c,0x01a640a6,0x00bb3501,0x00577176,0x010cb44a,0x00f2f8d0,0x007f5c7c,0x0023ccb5,0x0078e07b,0x003221cc,0xffe7dc11,0xff589c0b,0xff46f3f8,0xff942550,0xfe5df598,0xfe28a512,0xfe74717a,0xff4fec83,0xfdee3b20,0x00ed85d4,0x00c8d3b1,0xfff509f7,0xfef52898,0xfdee6ff8,0xfde132e0, -0xfeb1d8ba,0xfebfbb0e,0xfeff80d4,0xfff5e70d,0xff49eb63,0xff4e2d50,0x0043ccc8,0x00875d8e,0x00939edf,0x004999bc,0x00d3342c,0x00e38bc1,0x00a7045e,0x00d3e537,0x00cfe9bc,0x00abb3a6,0x0097571f,0x0098c7cf,0x00a23d8c,0x0017a0d4,0xfffb0a7b,0x005a1815,0x003c679f,0xffd59209,0x001d44a1, -0xff7a053d,0xfe5c6e5e,0xfd4f7e34,0xfcc3f18c,0xfaf7a9d0,0xf80aa220,0xf9093888,0xfa99f0a0,0xfd191d00,0xfdb45494,0xfe5f486a,0xff2a4b03,0xffc4af77,0xffd939f9,0xff11dc23,0xff74db10,0xff3ab4d5,0xfef72522,0xff4184ff,0xff872a35,0xffd0853d,0x009e307e,0x00e05eec,0x00c27582,0x002d4d92, -0x002ef510,0x00c8dbb1,0x0040a47b,0x00311025,0x004c1693,0x008b8bfd,0x00596d4c,0xff83dc9d,0xfead4efc,0xfe4c1b96,0xfe5658dc,0xfd63f45c,0xfdaf90dc,0xfeee8aea,0xfd17cca0,0x03af8ff0,0x021c57c4,0xffc3a7c7,0xfe2b192a,0xfca4ecf4,0xfcbbabf0,0xfd4d5594,0xfdfb1d3c,0xfea981da,0xfed5ef00, -0xfe561bd4,0xff05b648,0xff50a151,0xff55a6ee,0xff6d6c02,0xff998cf5,0xff8ed340,0xffaede83,0xffb652b1,0xffcc8a6a,0xffc034a9,0xfff11185,0x006ca646,0x009fb08a,0x00cb6615,0x00a51f0f,0x00f823a0,0x016c7b80,0x01b5cc22,0x02957868,0x031181d8,0x034191ac,0x032aed70,0x030d0140,0x03411950, -0x02f62f34,0x031744b4,0x02c1f074,0x01798e30,0x00a86438,0xff75a466,0xfe5b41ca,0xfd06a214,0xfba54d00,0xfbf5e848,0xfc32aa84,0xfc5dea58,0xfc8aeffc,0xfcb2bf54,0xfce1b5dc,0xfcfe6bc0,0xfd162e80,0xfd314c44,0xfd9ca42c,0xfe06089c,0xfe6b6e72,0xff0152bf,0xffaf891c,0x0047fc5e,0x00c1d660, -0x0142212c,0x01ca8bb6,0x02105568,0x022b22bc,0x0278267c,0x02999f44,0x02f60544,0x03424f8c,0x0372efa4,0x03c941b8,0x04287820,0x0390477c,0x01a7f4e6,0x00ed753d,0x00b09d91,0x006f0118,0x003e5d6e,0x000c1e0c,0xfff68159,0xffbbc348,0xffa7da73,0xff6b3d9f,0xff423153,0xff16a978,0xfeefe85e, -0xfebc5114,0xff065ae0,0xff495a5e,0xff84f61d,0xffbbbf40,0xfff3216e,0x00202c70,0x00345a90,0xffff19a2,0xfff74f43,0x0018b96d,0x00157041,0xfff85f4e,0x0036fd67,0x0081ec22,0x00e1729c,0x011508ee,0x013df0aa,0x01b2e984,0x017e788e,0x017de206,0x01547b12,0x010cad4c,0x00977a11,0x0019f0c9, -0x00299a16,0x001024bc,0xfffaeeea,0xffe205ee,0xffc62fd1,0xffaca479,0xffa09807,0xff978b7b,0xff8c04ed,0xff7d818b,0xff703219,0xff519e75,0xff77fdf9,0xff8da08f,0xffa86773,0xffbf86b0,0xffd7b8a5,0xffea6ad0,0x0042c845,0x00823579,0x00fa5a31,0x002bd114,0x0089bcaf,0x00fc88b6,0x011cfade, -0x012fc6d2,0x013d270c,0x015bbfe4,0x0175c0ae,0x01964870,0x00f72501,0x007e928c,0x017ef146,0x00f0cc8e,0xffd695d0,0x00a7de4c,0x00a75b4a,0x0097b5db,0x00a71c3e,0x00a7a255,0x00999cff,0x00a36f1f,0x009d1471,0x008919b8,0x0093077e,0x0088d8c5,0x00689206,0x006de948,0x006df392,0x006e7f86, -0x008ac9ce,0x00981ed8,0x00992edb,0x00a35e42,0x00acbdd2,0x00b914cd,0x00b5b827,0x00b341de,0x00ae5707,0x0093d1e1,0x00928f87,0x009813e7,0x00ab2478,0x00b02036,0x00b0122c,0x00ad42b0,0x00ab4eff,0x00a4877a,0x00923cb6,0x008d6d89,0x00d4d6e1,0x00ae6c13,0x01011632,0x00bd9e28,0x00c7f53a, -0x00b303ac,0x008cb700,0x009efda3,0x00a200c4,0x007e5917,0x00a07f0d,0x00837146,0x001b8904,0x001c48fe,0x001bdb1f,0x002a351c,0x007b028f,0x00a128c0,0x00a665ec,0x00cb74fa,0x00e764a8,0x011ab88a,0x0114d746,0x00e93abe,0x00d16fe1,0x009cf59e,0x00915a4c,0x0086405b,0x00bf90ec,0x00da4747, -0x00ce3a07,0x00d785c2,0x00b3fa89,0x0090b3d1,0x006f78fe,0x009754bf,0x0126f896,0x00f7a032,0x010acb98,0x00c6893c,0x00fd6e3d,0x011374f6,0x00ba234b,0x00d47f52,0x00a9aec5,0x005cf2ee,0x00973b29,0x005643a6,0xffc08a77,0xffbb26a7,0xffaba971,0xffb4f35e,0x00485e8c,0x00a410e7,0x00a3af93, -0x00ecb293,0x0117d620,0x018c86ca,0x015b6ec0,0x012b67b8,0x00ed1665,0x009fe680,0x008aeae5,0x00560954,0x00c7e2b1,0x00e77bd8,0x00eacdf6,0x00e9790b,0x00cd2497,0x00adf68a,0x00583b6a,0x00749b57,0x0184b848,0x00f807c8,0x01c28640,0x0121335a,0x012fbc06,0x00c8b595,0x0035d103,0x006518d6, -0x00968268,0x00473d36,0x009b974d,0x0065f283,0xff36563f,0xfef72140,0xfebbcab6,0xff00ba0b,0x000ff53b,0x00905862,0x00ae3e59,0x01292c52,0x019c5a4c,0x02683ff8,0x022a3258,0x01b76760,0x0133109e,0x00e95ccf,0x00d5c93b,0x004e67ee,0x00679d73,0x00d94301,0x019da408,0x011f8ae2,0x00c1b493, -0x0092f7bc,0xffd617e0,0x00a4a582,0x02a83714,0x0210f4d8,0xff833c12,0x006175ac,0x016b2550,0x02d6ede0,0x04afd4a8,0x02066f0c,0x00a541a4,0x0044b1dc,0x006ed904,0x003c5a35,0xfef3e91c,0x01f64bfe,0x024f4fb4,0x008093a4,0x007a33ac,0x00717af0,0x00bdd8b3,0x00776cd9,0x0059826f,0x00ea18ed, -0x00f91d18,0x00e6ac02,0x01315e5e,0x01543ae4,0x0170db46,0x00d4287f,0x009243b8,0x003cf327,0xff9d1ecb,0x00985a25,0x01d7b388,0x02534cf0,0x01bac900,0x003ed1a1,0xfde704ac,0xfe8e5d68,0x018f8d6a,0x000f0852,0xfe369fe8,0xfdb860a8,0xfd8a7f1c,0xfe4911be,0xfeff50bc,0xff67e366,0x00781ab0, -0x00aca29b,0xffde4dd5,0x012e6d5c,0x01399a4c,0x009599e3,0x0068b6cc,0x004acc1e,0x0022a241,0x00ffaa6d,0x011f8258,0x00d2b3f1,0x013d986a,0x0146e362,0x0140a6f6,0x00fe2a5f,0x00849fbc,0x00913035,0x00446806,0x005ee44b,0x00e3f2c9,0x00b260bd,0x001a4dae,0xff63299a,0xff678e3a,0x00137611, -0x009c0631,0x016a87a6,0xffb2cbaa,0xff90ea68,0xff235fc7,0xff50a290,0xff7127b8,0x002ff7ae,0x00e55e58,0x0203a670,0x01f3e2de,0x01678f3e,0x009a9c77,0x00384b44,0xfff9f34f,0xffeb6ca8,0x009a1f38,0x00f5e20c,0x00a223e3,0x018ed740,0x01708bea,0x008452c9,0x007824aa,0x005e3b5e,0x00921c91, -0x00f78b58,0x007eee91,0x004e0e8f,0x008681ea,0x005542b6,0x000a3dfa,0xff9ecc9e,0xffbd8acf,0x0040b8f2,0xfea48aea,0xff1a3321,0xffd00dd5,0xff92c1c7,0xff982e69,0xfef2b06c,0x002bccb0,0x0099e9ed,0xfff78d2a,0x007f3523,0xffdb55b7,0xfe5191ca,0xfeb29eb4,0xfeec93ce,0xff47500b,0x001a6698, -0x00573cd1,0x00109f93,0x00f1478e,0x0119c9ea,0x00f3f89e,0x012cf098,0x0112bf28,0x00a277e8,0x012db548,0x0145f744,0x011d585a,0x011047ca,0x00c2518f,0x00a21cb8,0x0039e236,0x0033b624,0x0094da22,0x008a4e39,0x0042b8da,0x00d6bffc,0xff7fdc32,0xff0192d1,0xff0797e8,0xff65e21c,0xfc4d6790, -0xfd14f000,0xfe8630fc,0xfe46e334,0xfd51a578,0xfd713f14,0xfdae1ba4,0xfe27fee8,0xffd1da51,0x0056dc17,0xff98d611,0x000f5fe7,0x001d0a49,0xffe120c8,0xffdb0c8b,0x001453e9,0x00904098,0x00fbde3b,0x010539ee,0x00829c5d,0x00beba90,0x00ae39c8,0x00c79b5c,0x00880c38,0x0085bd6b,0x00af8930, -0x00474fc3,0xffba4cab,0xff153fbf,0xfea27f7c,0xfe67e4a2,0xfe6d5954,0xfd81cdc8,0xfd2dad24,0xfd33ea74,0xfc93d164,0xfe46cd26,0xfd0ac458,0xfc2d1028,0xfcdc5db0,0xfe4a2572,0xff7647e0,0x004138b5,0x00d173bb,0xff48be58,0xfea96420,0xfef89038,0xff072f16,0xff286886,0xff3f7d19,0xffa13887, -0xfff9c774,0x0097233a,0x00b8edc5,0x009bca87,0x000ab577,0xffe6a9b5,0x00203a89,0x00b885db,0x00a8213c,0x00c5d8d9,0x00f701aa,0x01121d1c,0x01062976,0x0071526d,0x00769bf4,0x0098b742,0x00b1940e,0x01197194,0x00a81fb5,0xff989599,0xfed4823c,0x0106ef4a,0x0046b6ac,0xff603274,0xfea1b128, -0xfd8d2504,0xfd34462c,0xfcd57dc8,0xfc9e1ac8,0xfd3ed7c8,0xfdc47754,0xfe218a10,0xfdfcce74,0xfdf0f444,0xfdcde448,0xfe16047e,0xfe4951b4,0xfe842b6a,0xfede5564,0xff55364d,0xffb9f402,0xffc200b6,0xfffbff14,0x00276523,0x00695040,0x00cfa594,0x0108906a,0x016ac88e,0x01842246,0x02004764, -0x01d03160,0x01df5236,0x01ccd57e,0x01b74a46,0x01e89f5e,0x0213cbf0,0x01574e14,0x0028f805,0xffc33c35,0xff7c579b,0xff490295,0xff14153b,0xfee0e23e,0xfe9d9200,0xfe31a076,0xfe1b0b52,0xfdea66e0,0xfdd798f4,0xfdcf3484,0xfdcc9940,0xfdbd7de0,0xfdfd1f50,0xfe3231aa,0xfe6370d2,0xfe90594a, -0xfeacbed6,0xfedfcf68,0xff609451,0xff5c6502,0xff7f91f5,0xffa63775,0xffc8b1b6,0xffd752f7,0xffe7fe17,0xfff655da,0x001bf801,0x002349a7,0x0036d1ed,0x005db311,0x003a8c7e,0x001d5c84,0x0011dd0f,0xffdc0f17,0xff309b91,0xff17073f,0xff081b17,0xfee738f6,0xfecc8c06,0xfea553f0,0xfe894ce6, -0xfe6e914c,0xfe7103ac,0xfe6dfe16,0xfe66c70e,0xfe5eec04,0xfe573e56,0xfe464bf6,0xfe600e36,0xfe70e410,0xfe8567ce,0xfe9a2106,0xfeb3c4f6,0xfeb65294,0xfef12538,0xff0ecfd9,0xff4daf9e,0xff108929,0xff3c0ff9,0xff6b53e0,0xff7086be,0xff78d0c8,0xff748637,0xff840ade,0xff8a5ad4,0xff9999d7, -0xff662e07,0xff40edd3,0xff8141c8,0xff56f8ab,0xfe8a9a12,0x008b36c3,0x00814da9,0x00785cc8,0x008f8349,0x008be8fc,0x007043b6,0x007e3e97,0x007df4e0,0x007a0f7c,0x00751f29,0x0072eb1e,0x007929e7,0x0072c687,0x0074225c,0x00783bae,0x0080c645,0x00830fe2,0x007ef97d,0x007f89c4,0x0081f769, -0x007df329,0x008a37a7,0x008f0b54,0x009c5886,0x0078a8a1,0x007ae383,0x007ecb5a,0x009dedd6,0x00a258eb,0x0093a088,0x009a3e96,0x0093a196,0x007dd446,0x007b33f2,0x00736ce2,0x009340ec,0x0083b4af,0x00adc524,0x007ad4dd,0x00944865,0x0088dcac,0x004eb1ec,0x0066f5c0,0x006b9eff,0x00792765, -0x00767f94,0x007ff5d0,0x0087d13e,0x0069bd4f,0x006a3fcb,0x007112ce,0x0090a44d,0x0096fb2c,0x0087747a,0x008c51bc,0x0090974e,0x009fa666,0x00c6fc79,0x00ae2070,0x00c1d146,0x007b543c,0x0072defb,0x0070b721,0x00c36ee4,0x00de7571,0x00aafa0b,0x00ba4a52,0x0095eb4f,0x0056f479,0x005fe72c, -0x006fcebf,0x00a5f157,0x009ad2f8,0x00988f35,0x007e5a2e,0x00e0c7cf,0x00d6da90,0x003f3261,0x0075b7ca,0x007736ed,0x0077c547,0x00617cfe,0x00592129,0x00912bdf,0x0055f7e4,0x00584b48,0x005ab9a4,0x008fe4e1,0x00a4a001,0x00831890,0x00971915,0x00920bb3,0x00bdc9c9,0x00d902de,0x00cadaa7, -0x00f25e38,0x0072b9d3,0x006c9480,0x0044e392,0x00fa1c0d,0x01123a6a,0x00bbacba,0x00e22a3c,0x00b7199b,0x00594af2,0x004e900a,0x004cb922,0x00adbec8,0x007a316b,0x00e9e1fe,0x00708700,0x009ef09b,0x007766b9,0xffb31360,0xfff34b99,0x001befb2,0x0067dd9b,0x00676471,0x00bfe4c4,0x00d7549d, -0x0039e768,0x00187b37,0x00176389,0x0095cbc4,0x00a4f6cd,0x0073fb50,0x0097d0cd,0x00baea96,0x011f9a14,0x016e37ee,0x01302390,0x014d6f78,0x00aca94c,0x0086e281,0xfff14df7,0x00b35990,0x01256f08,0x0123d33e,0x011218ee,0x009df760,0x00156ac8,0xffff6e6a,0x006087e5,0x01489a9a,0x011b51d0, -0xffaa0071,0x00eed2be,0x021ac6a4,0x0278f144,0x03094578,0x01b01b96,0x011fbb92,0x01266684,0xff86e682,0xff156d24,0xff1f54da,0x0148f888,0x01f1c7f6,0x00eab923,0x00e1d3c9,0x00ddd10c,0x00f4b2b2,0x00b3dc30,0x005ba900,0x0005d3dc,0x003b5e8e,0x006b4a1c,0x00ea6cfd,0x010f71c0,0x014d915a, -0x0144f666,0x0067f39e,0x000adbe8,0xffe58db3,0x015d2322,0x024766c0,0x01826b6c,0x00d194d4,0xffb586fb,0xfe19e5c6,0xfe8d6476,0x025ebe68,0xfc5cd650,0xfe0f0344,0xfe955fc0,0xfe63a492,0xfeb12030,0xfe35bda8,0xfcad7840,0x0051ca90,0x012fa6c8,0xff310e9f,0x00b9873e,0x0112473e,0x01175744, -0x00bd0692,0x008456ad,0x006fba5f,0x011eb24c,0x013b8f7a,0x007d37d0,0x00dfc73f,0x00f400f5,0x00f082e3,0x015b1a40,0x00e432f7,0x00a2fa77,0x005f0cd0,0x00a32d43,0x0149f214,0x00b050a6,0x00138dde,0xff69d7ef,0x0063754a,0x00f8883f,0xfffb629f,0x03623414,0xff2d6705,0xff28d224,0xffab178a, -0xfffd962a,0x00bdb9fb,0x00101766,0x00add410,0x0187fff2,0x01be6c5e,0x0178ca78,0x00923997,0x0105fbc0,0x006ec77d,0xffd10f7a,0xfffe5c2a,0x00543d0e,0x005e4108,0x00d58d08,0x00bbd3f7,0x00003943,0x00008e60,0xffdce6c8,0xfff5937e,0x0067dad5,0x002bd1fb,0x0074a3a5,0x006718f2,0x003bd47f, -0x00411a87,0xfff0aae0,0x003f253d,0x008721a5,0xffa6023f,0x004cde49,0x008d5488,0xff63f680,0x0083413d,0x003046ce,0x001c609c,0x0039eeb4,0x011f1214,0x00b755b3,0x0027430c,0xff4bb161,0xfee5930a,0xfeb4665e,0xfe1add70,0xff958c89,0x005408a8,0x0060361a,0x007dbb56,0x00a05c97,0x00d23a53, -0x00d08578,0x00ae1257,0x00737c3e,0x00bfec22,0x00b2230d,0x00a66269,0x00ec02b2,0x00a97d21,0x00791131,0x003c6548,0x002a7279,0x0061cbcb,0x003c8ed1,0xfffdf5e6,0x00057449,0xffc7844f,0xffdf41e4,0xffdc9323,0x009f5313,0xfe3ba8b0,0xff4ce192,0xffa085b8,0xff8a5be6,0xff153c6c,0xfeb73dba, -0xfede5586,0xff6dcbb1,0xff7e2a1e,0xff7455c9,0xff5a7caf,0xffc81dd8,0x000d76ca,0x002cacec,0x00956732,0x00dcb863,0x010e7cf0,0x00d960ca,0x0093f13f,0x0032b17a,0x00c36c71,0x00ba86fd,0x006ad364,0x00761dd3,0x006cad45,0x00b51916,0xffe2f28f,0xff69aa3c,0xff46e8b1,0xff371275,0xff181692, -0xfeae4230,0xfe5028f6,0xfda52bb8,0xfc98a820,0xfd591f8c,0xfc974260,0xfc94a6c0,0xfcff2a50,0xfdbb5414,0xfeac4ca8,0xff868098,0xff794453,0xfeabbb50,0xfeea6e58,0xff43f590,0xffb8ed3b,0xff8c9a50,0xffab1339,0xfffd7eeb,0x00303278,0x0076cc98,0x00944437,0x00dbaac9,0x00df1a45,0x0079962a, -0x007af270,0x00622cc6,0x00401469,0x00430ea4,0x00586dc3,0x00a93723,0x009162d7,0x0042eb41,0xff87c923,0xff168630,0xfee082ca,0xfec0e14c,0xff784e58,0xff5ca7bc,0xfead5e22,0xfd7eaf88,0xfecf86ee,0xfe3ab6e0,0xfe3f1404,0xfe567734,0xfe5eb38e,0xfea5e3cc,0xff17a253,0xff8eb8ec,0xff82e1a2, -0xff55887e,0xff4356e4,0xff48ed71,0xff5806a9,0xff5aefa5,0xff910e69,0xffc0df13,0xffebfe6b,0xffbfa274,0xff99887d,0xff7749da,0xffab9ee0,0xffcd4727,0xfff95f3e,0x002bf8ba,0x005f2d4a,0x008f097e,0x00b10386,0x00baa7b8,0x011df496,0x00a64980,0x006bebca,0xfffbd6ff,0xffaf0100,0xff7f0e70, -0xff606273,0xfef58bb2,0xffb43c89,0xff703e9d,0xff3e1f75,0xff07ad1d,0xfed00566,0xfe97eaaa,0xfe4abc20,0xfe0a4870,0xfe0c6422,0xfe23ed72,0xfe2adbe8,0xfe334872,0xfe2dee4c,0xfe170d3e,0xfe3bb13c,0xfe57a9c4,0xfe84edca,0xfeaac4b6,0xfee04318,0xff00b244,0xfeee9946,0xff3adc8c,0xff5ecca0, -0xff85ac62,0xffa87c8d,0xffdea02b,0xffe158b8,0xffe1abb6,0xffebc015,0xfff324ef,0x000ab079,0x002cbf29,0x000d8ebf,0xfff47894,0xffe29ea9,0xffb2946f,0xfef82f82,0xff031a07,0xfeef7edc,0xfedba61a,0xfecb41f8,0xfeb93c1a,0xfead032a,0xfe94159a,0xfea03792,0xfe9be84c,0xfe9a6c2a,0xfe96a3b8, -0xfe9915fc,0xfe99e2e2,0xfeac35e8,0xfeb7b344,0xfec0660c,0xfecedf0c,0xfed98400,0xfef54e48,0xfed8a702,0xfed85a3a,0xfed08d90,0xff060849,0xfefe0dee,0xff024883,0xff0628a8,0xff116f7b,0xff12756c,0xff210c0f,0xff231061,0xff2e4498,0xff1cb6af,0xff197fc9,0xff05719d,0xff01c704,0xfe9ac48a, -0x006294b7,0x005ef469,0x0056c8c9,0x0061a05f,0x0058e18c,0x003da079,0x0049faef,0x004e297f,0x005b7d62,0x0051f417,0x00544ae5,0x006bcb20,0x00523221,0x0051ae2c,0x00593285,0x005e85a4,0x005f720d,0x00600468,0x00576277,0x00559a1c,0x004f7356,0x005fae3e,0x00658223,0x007a89e8,0x00560fd7, -0x006440a6,0x006dbb32,0x008dc058,0x0090dbbc,0x007aeea3,0x007dfc91,0x0075d9cd,0x00650ae1,0x0064f219,0x005a86b5,0x006956e5,0x0060a6ca,0x0052eb4d,0x003da072,0x0051c5e9,0x0046a6da,0x0006956b,0x0016a3a5,0x0027d77e,0x0061e60a,0x0057b889,0x00686196,0x009f5ff7,0x004cde68,0x003cbc63, -0x004f2ba8,0x006026d5,0x006b1511,0x006b13e3,0x00547a0e,0x004c8817,0x004bdf72,0x0072aca9,0x00704932,0x0084347c,0x005a3f2a,0x005f25b3,0x006b3136,0x00b8c818,0x00c9be19,0x008b71cf,0x008d6b40,0x0074674b,0x0046a3a2,0x0059e953,0x005f6706,0x0064608f,0x0052a348,0x005761a3,0x00616ee4, -0x008f7a60,0x00548b08,0xffc2b71b,0xfff6a545,0x00112f00,0x00738ada,0x0045ff36,0x004f9af8,0x00d70c7a,0x00331bb6,0x0036603b,0x00575f38,0x007b1f74,0x007fbea7,0x007b54c8,0x0050ffff,0x003a507b,0x003c5939,0x00696c0e,0x007894f7,0x00a33156,0x00536f88,0x006d0a1e,0x006cd8ff,0x01190c28, -0x012ac8d6,0x00b44ee8,0x00caa3ed,0x009c83cd,0x00562c61,0x00649995,0x004cd7c0,0x005139ca,0x00415c08,0x001aabac,0x00138cea,0x00367830,0x0003857a,0xff2293e5,0xff40b5d1,0xff8a6b45,0x0072ca63,0x00661a01,0x00be438d,0x017c7354,0x00514cb6,0xfff0faf6,0x0007194a,0x00500265,0x007cda26, -0x007021a9,0x002bc13a,0x000c86e4,0x001bef51,0x00855a70,0x00b083e9,0x01336256,0x0096fb3f,0x005bbbc2,0x00043d36,0x0100420c,0x01587ec6,0x00b5a6a8,0x00c93634,0x007f5dce,0x000c89ae,0x0038d138,0x0053c859,0x009cd209,0x0065473c,0x002faeab,0x0141da32,0x0185ae04,0x0154e848,0x01910184, -0x01bfe500,0x019cdb72,0x010cfa00,0xff9a0084,0xfecb09bc,0xfe92dfe6,0xff7e1aa3,0x00ad8701,0x01ecb338,0x01316d44,0x00ef1aa0,0x01014a1a,0x00d4f53c,0x00b195d3,0x004ff7ac,0x002a3c37,0x0046ab92,0x00a2c680,0x00ab58f4,0x00eebbe8,0x016fbb24,0x005969a8,0x000f66d7,0x009b6633,0x01e7a612, -0x021ee2bc,0x00a6cebc,0x0085a997,0xffafe275,0xfe344e40,0xff139047,0x01391ef0,0xfbc3c1a8,0xff16a892,0xffdc10d1,0xff36bc7c,0xff06cf1d,0xfedc1b5c,0xfe761e8e,0x00efe4da,0x01a3728e,0xffe75fba,0x007f3185,0x00bafa2f,0x0118ddfc,0x0120d008,0x011b1996,0x012049c2,0x00f026c8,0x00d4423a, -0x0089b1ec,0x009856e9,0x0092dbea,0x00864ad3,0x015a157e,0x011e968a,0x00a32269,0x00b82267,0x00fd14ce,0x0156840c,0x006cb1f2,0x0027f3fe,0x002ee31c,0x00ad6268,0x00f4d0cf,0xfff26f01,0x02af3490,0xfefe06ce,0xff095678,0x00be55b6,0x0129d9c2,0x01791440,0x004898b8,0x0025e306,0x003f7693, -0x010bfda2,0x016549b4,0x00b3db76,0x010c8092,0x007fc2d7,0xffc0bb81,0xff76e53f,0xffbce8ed,0x00ab9c16,0x0037737d,0xffef9102,0xffa1296a,0xffb5a665,0xff9a33f2,0xff7e5168,0xffcfa227,0x000d21d0,0x0094f90c,0x00728169,0x004b1687,0x005f849e,0x0053162f,0x007a488e,0x003e1ed4,0x00b5f415, -0x00f68996,0x002e08c4,0xff401012,0x010d8026,0x012f0aac,0x00c9c6ad,0x00ba3c3b,0x0114fc6c,0x00b09f4e,0x0050f2f4,0xffdf6ba7,0xff9be2d1,0xff6a3cfe,0xfeadc304,0xff6cb845,0xffe61e73,0x00217d88,0x00037b07,0x003f5f3c,0x00ba146b,0x009958b9,0x009126cb,0x005dfc6c,0x00300196,0x002492af, -0x002cbb8f,0x008cb7d6,0x00769b50,0x00489e57,0x004cfdce,0x003af948,0x003b5f92,0x0014574e,0xfff36b7c,0xff946691,0xffda7918,0x000cd383,0xffeef89d,0x00b58121,0xfe4faf0c,0xfed0edc8,0xff4f6667,0xff9e7217,0xffbc5fe0,0xffa598e5,0xffabd6d7,0xffce318d,0xfece82be,0xfec17388,0xff633267, -0xff8f223b,0xffd5edbc,0x00059d37,0x007a0f99,0x00a19b2c,0x00b1dc51,0x0020ede3,0x0005981d,0x005133a8,0x0058cdd8,0x00478e4f,0x000319e7,0x004bd8dc,0x003d5cef,0x003b6a30,0xffd1603d,0xff97434a,0xffb8c8dc,0xffac66e5,0xff5a2146,0xfebb9424,0xfdf2afe8,0xfd40c080,0xfcb1542c,0xfda94380, -0xfdd985d0,0xfe0063c2,0xfe522412,0xfe48ac00,0xfe475e2e,0xfdbd909c,0xfda36100,0xfe145cb8,0xfedee1c2,0xff5d5ff5,0xff6711a4,0xff910459,0xffb816c6,0xffd4c888,0x003d77f4,0x007022f4,0x00e08439,0x0082203a,0x00764cde,0x0095e5f9,0x00a2ff25,0x0098367a,0x0042c731,0x0049cd18,0x002d0349, -0x0044fa2b,0xff8b0b41,0xff2af887,0xfef9ce54,0xfe98d6c4,0xfe689760,0xfe6108b2,0xfeaa2b10,0xfeef1248,0xff4b2864,0xfe6de786,0xfdabef5c,0xfd5c0720,0xfdb533f4,0xfe0e604a,0xfe839fd6,0xff1e8357,0xffbd3a4b,0x003cafe5,0x0011501d,0xfff3a191,0xffe284b4,0x002006d9,0x004bda84,0x0072aa19, -0x00a75a2f,0x00d5bbef,0x0114a378,0x00c43c9e,0x00956a92,0x003a5d4a,0xfffc4b20,0xfff5655a,0xffe1f25e,0x001518c3,0x003e4265,0x007dc1c6,0x0063699a,0x0032bcba,0x00375dbd,0xffd7e2f0,0xffa171b0,0xff4619da,0xfed87a5e,0xfe5b55d6,0xfdf5b88c,0xfdbd3dfc,0xff5bd0aa,0xff22a5b5,0xff1d80d7, -0xff0ff8bb,0xfef6b12c,0xfee13092,0xfec518ca,0xfec8c350,0xfeeea500,0xff200579,0xff42332b,0xff5b07d9,0xff71aa3d,0xff87eedb,0xff7eee27,0xff787da3,0xff7b6593,0xff8126bf,0xff903328,0xff9c706a,0xff942c6e,0xffd4b9c9,0xffee8f4f,0xfffe764e,0x001593bd,0x004747d8,0x0022cba2,0x000a0ecc, -0xfff0dff0,0xffe2f94c,0xffdba601,0xffe01136,0xffbefa40,0xffb1650a,0xffa520e4,0xff80310c,0xff71979f,0xff84eff0,0xff83ae0a,0xff82e507,0xff8781a6,0xff8a2e5e,0xff8d9c3b,0xff8410e6,0xff91ac0b,0xff969ef1,0xff9efb67,0xffa7c9ce,0xffb0d736,0xffbecec2,0xffbafbb9,0xffb9f461,0xffb4b746, -0xffb5aa10,0xffb143af,0xffb8423c,0xff993e13,0xff87fdd2,0xff605f96,0xffc577f9,0xffa7f083,0xff8af4dd,0xff869254,0xff8abf10,0xff866293,0xff84f246,0xff7ab436,0xff7043c6,0xff7f7248,0xff938b6c,0xff4b6e79,0xff640b41,0xffbff440,0x002fe1e3,0x00422fdd,0x00452a0b,0x00302ca9,0x0020ae0f, -0x000a66e6,0x0014088b,0x001a861c,0x002d9bbd,0x0024c487,0x00253160,0x003bc2f5,0x000f185d,0x000683da,0x0006055e,0x001a1286,0x00259008,0x00347efc,0x0031943e,0x00322306,0x002af87d,0x00353b98,0x0034dfea,0x003bd2f7,0x0026baff,0x003d8789,0x0056a83e,0x00694a1b,0x006b932f,0x0059c5d3, -0x00591ed7,0x005311f7,0x0044dfcc,0x0045fdc4,0x003c2ca5,0x0044b369,0x00414e64,0x002e2134,0x0046ee20,0x00220934,0x0004a882,0xffd12198,0xffd22e0d,0xffe9081a,0x0029c07d,0x002a5d2d,0x002f6cbe,0x005ed71b,0xffdee78a,0xffb1b684,0xffb9f587,0xffe0b7b7,0x000e74df,0x003c1f39,0x003e65b1, -0x003d73c0,0x002bf2eb,0x003bcd37,0x002d0580,0x001c3a88,0x00255db1,0x0041123d,0x006b7b81,0x009a36cc,0x00a28882,0x0072e2d1,0x006c7594,0x0058ec6e,0x00368256,0x0058e912,0x00601ee9,0x00444826,0x003aacf1,0x007719a0,0x00acbc7a,0x00578b17,0xfff325a1,0xff8bdfdb,0xff9e5ed9,0xffc1f316, -0x003df582,0x001e09db,0x00184b21,0x00838980,0xff8cb15e,0xff5d7036,0xff6b343c,0xffc87950,0x000a28c8,0x00582f58,0x005049a0,0x004c5303,0x00314bb2,0x00438a0b,0x0036432e,0x000ad0ef,0x001d0d04,0x00615ae1,0x00a3ff68,0x0115e31c,0x012818b8,0x00c6438d,0x00c4de19,0x00a011fc,0x005a57f2, -0x008bef80,0x006ff76e,0x004904b4,0x0062eaa2,0xffff90d2,0x0079a111,0x002c56fa,0xffc5bf28,0xff13309b,0xfecf43f8,0xff296888,0x002f1595,0x003f68c6,0x005c1185,0x01093a84,0xff7e96c4,0xfeb14afe,0xfea88e54,0xff17ae48,0xffc3b8f9,0x004ef2f4,0x004dd118,0x003c4506,0x00086239,0x002f30a2, -0x003c8618,0x00688bc3,0x00661e97,0x006ce73d,0x0084f975,0x014ac7f0,0x0180f8d6,0x00c26cce,0x00bb7435,0x009b39ba,0x003bfec3,0x009a5eb2,0x00ad57f7,0x00738ff4,0x004670d7,0x0191d65a,0x01c59fe2,0x0097159e,0x0023e9d2,0x008939e6,0x01f7971a,0x01fc04e0,0x00549b95,0x001941d9,0xff25e91a, -0xfe6235bc,0xfe61da08,0xff97e400,0x021c4c20,0x017394b6,0x012d8e58,0x010da58c,0x00ddaa74,0x00d35978,0x00c2303c,0x00b7928c,0x00ac7543,0x009e7de7,0x0072147b,0x008d1bf9,0x012cbc86,0x0050dc83,0x005ae229,0x0174dd90,0x01f3d50e,0x018cc3f4,0x007c07db,0x00398d6d,0xff94bfc6,0xfef00c86, -0x00a18c57,0xfdc71994,0xfcccd8fc,0x003e9f81,0x00f96637,0xff5d7f7f,0xffb30345,0xffa469e8,0xff2b5ec1,0x008d8981,0x01168da8,0x00b6631b,0x0050a601,0x005a03b9,0x00e5fe9d,0x012f6850,0x015c9f08,0x015a1f24,0x00a77367,0x005e5b59,0x006fef37,0x0036c678,0x0038617f,0x005cdae0,0x00de8374, -0x00f31a96,0x00920254,0x011977c6,0x01543010,0x0125023a,0x004b2d2b,0x005e5701,0x00f81979,0x00b68c42,0x00d483bc,0x0126771a,0xff57de80,0x0083fe14,0x009e7492,0x01c12a3a,0x01abca64,0x013a3cde,0x001ef7f3,0xff50cfb2,0xff45ce7c,0xff6091c5,0xfffa4514,0x00e9321b,0x00925dce,0x0077e3e4, -0x001a8ca8,0xffbfcbb3,0xffc22636,0x0094ff98,0xffde3729,0xff9d21f7,0xffb49ec8,0xffa30c64,0xffb7e8f9,0xffcd95b6,0xffa2d9ff,0x001c4b01,0x00b640ee,0x006e3c5b,0x00537e7a,0x005aa25a,0x0078cf2b,0x00663b78,0xffebc2cb,0x00cf8ce9,0x010cd40a,0x009c1a14,0x008f6263,0x00452b44,0x00a8c689, -0x00ac8778,0x00c7bc52,0x00bf67cd,0x010ecd6a,0x0150b404,0x0182bf60,0x0078b994,0xfffc1970,0x0022be80,0xff6ec62a,0xff6d2d96,0xffaea8af,0xffdeb2b9,0x0021247c,0x00b18c1f,0x00b520dc,0x00b4b60d,0x007fd998,0x000b975c,0xffe55864,0x002004a1,0x0015ef2e,0x001c830f,0x00331802,0x007dcf30, -0x00827d59,0x0037319d,0x005676de,0x0035152b,0xff91a142,0xff9fe58b,0xffb14973,0xff6a3c39,0xffe46620,0xfe6a0dca,0xff2df33e,0xff2eaf20,0xff95cce1,0x0058665b,0x000ef678,0xff8747a0,0xfee05350,0xfe8c0d6c,0xfec51a38,0xff85eb7c,0xff8a073d,0xffd3b538,0x001412c6,0x003d59b7,0x0032e6b8, -0x000205bb,0xffe51669,0xffe79fd5,0x0031af99,0x00051522,0xffff7897,0x000aff50,0x0024c4b6,0xfffee43b,0xff9c5976,0xffc92242,0xffc8086d,0xffc768a2,0xffa222a4,0xff305f49,0xfea82da4,0xfe0895fe,0xfdaa4df0,0xfde50b7c,0xfe103c28,0xfed8a2dc,0xfede549e,0xfee3bea4,0xfe9981a0,0xfe2a5654, -0xfe550ec8,0xfea0ee74,0xfee55974,0xff282e6e,0xff47f50d,0xff69bace,0xff90b706,0xffc0b4a6,0xffffbc19,0x004653a9,0x0063af41,0x002b21ad,0x001f4e17,0x002a9d8e,0x007369a2,0x00774e47,0x006e66fe,0x0051b948,0x004f82a7,0x000a58fc,0xff9fd251,0xfef56556,0xfeab3e6c,0xfeb5fe82,0xfe875772, -0xfe58151a,0xfe26ba66,0xfe332168,0xfe85dd2c,0xff0d7307,0xfef483b2,0xfe23d130,0xfe1b76e2,0xfe41faaa,0xfe4aace4,0xfe5dc14e,0xfea691a0,0xfedb07f4,0xff1a2744,0xff435bfd,0xff7b7433,0xffaf09a7,0x001af714,0x0077cab5,0x00d336ca,0x00a8b63a,0x00944ce6,0x0086214d,0x008ace2d,0x0085810c, -0x0089f547,0x007908aa,0x0064c3a4,0x0056c2ba,0x00301603,0x00271371,0x001eb3af,0xfff9eb8e,0xff88e53d,0xff635638,0xff4cf503,0xff709c77,0xff71475b,0xff1a2b0e,0xfeba18ea,0xfe6b9f2a,0xfe4a74ee,0xfee52248,0xfeb668d4,0xfee363f8,0xff0eb0c2,0xff3daaf4,0xff6420bf,0xff92eeeb,0xffc87b43, -0xffe59da9,0x000375e7,0x001c7072,0x003200ba,0x0044ce07,0x006d5f21,0x005d1518,0x0057c474,0x004bf2bc,0x0045cbb5,0x00452a8c,0x003bebb3,0xffffb807,0x000c7633,0x000740a4,0x0004de2f,0xfff84602,0xfff0da24,0xffc71c26,0xffb4c5ea,0xffa45201,0xff841ce6,0xff647b5b,0xff5c2582,0xff3e0553, -0xff36caac,0xff1e17d3,0xfefe6a98,0xffab56d7,0xff895bd1,0xffa57c54,0xffb2f90a,0xffc15886,0xffd06d1c,0xffdcabc0,0xffe8d1bc,0xfff232ad,0xfffeb2a8,0x000c70ae,0x001a15f4,0x00262708,0x00340a09,0x002e09aa,0x002d9799,0x002c7146,0x0028c7b5,0x0022cc33,0x00285a39,0x00177bde,0x001529ed, -0x000e0b1c,0x000be936,0x000c373a,0x00231356,0x001ba593,0x0015e3ad,0x0007f867,0xffff9f17,0xfff0f0e3,0xffdfd3ac,0xffc84c34,0xffb4cff0,0xffc34b9a,0xffb1d8df,0x000a0dab,0xfffe1084,0x0022e45e,0x0029b69e,0x0004c25b,0xfff078ab,0xffe25416,0xffe07660,0xffe71e9f,0x0005e7e5,0xfff4d9f1, -0xfff2126a,0xfffe86a0,0xffdc8a82,0xffd0dabe,0xffc3a3f2,0xffd91753,0xffe9c56c,0x0002e344,0x000bc368,0x000ff3a8,0x0004a9b9,0x0006ff92,0x0004277b,0x00002624,0xfff722f9,0x000c86af,0x00336ad7,0x003a59df,0x003d27ec,0x002f45c2,0x0031bf5c,0x002d067d,0x0016fb5e,0x00203b08,0x00161103, -0x001b4975,0x002151ba,0x002e29ab,0x0043cc9e,0xfff9fdce,0xffd29a7d,0xffb239a9,0xff9ce9bb,0xffb019ec,0x00012b3b,0xffee1bb9,0xffef2ac5,0x0005e7d1,0xffb2932e,0xff7ff25d,0xff6258a4,0xff7fbfd1,0xffb2928e,0xfffca5cc,0x00252e1c,0x002f6f31,0x000faddf,0x000d4b9a,0xffeafa28,0xffd0d886, -0xffe79dbd,0x000f1f70,0x0058110f,0x0068c446,0x00703a2c,0x005576f8,0x004f848a,0x003cf614,0x000d473a,0x004b3c36,0x0052fe3e,0x001a6caa,0x0026a068,0x00a4d5b8,0x00e8e073,0x0029a40f,0xffb685f7,0xff81bffc,0xff5490ad,0xff70b48f,0x002506ed,0xffd6d78f,0xffcddd34,0xfff82762,0xff52f557, -0xff0d52e9,0xfed7e040,0xff28ea6b,0xff87ae26,0x000e2ac5,0x00514085,0x00653f1f,0x002c63cc,0x0017c64b,0xffedbd1a,0xffac4f25,0xffd671d9,0x002bc9f0,0x00a14617,0x00e49cdc,0x00f5b6fe,0x00b7e90b,0x00ba94ee,0x00a000cd,0x003170a0,0x009419c8,0x007dc1cc,0x00373f59,0x007c30d8,0x005ad4fe, -0x00e764d7,0x00177fc0,0xff9b76ec,0xff3d8e4c,0xfead0850,0xfeeeb638,0x002113d7,0xffe201ed,0xffeff0bd,0x0055092a,0xff6b5abe,0xfe91d6de,0xfe2037aa,0xfe51d7de,0xff049a93,0xffef76f8,0x00714771,0x008bcd2b,0x00257ff8,0x000c3be3,0xffc95eca,0xffa087c5,0xfffe4727,0x005ef702,0x00db2864, -0x0181494e,0x01a81bc2,0x00eb9b6e,0x00cdd0fe,0x00b7082a,0x0049016d,0x00f0f148,0x010dc10e,0x00570445,0x0058ff3a,0x028b0c40,0x01f4c8f6,0x005e074d,0xffb33be0,0xff5863e8,0x0144a83e,0x015aae0e,0xff6488af,0x0031ec04,0xff4412c7,0xfdb11858,0xfdca40bc,0xfebda1b0,0x00ab9854,0x00fb168f, -0x0109e90e,0x00d600ab,0x00b9c38f,0x00ad7eb8,0x00c330e5,0x00ffd182,0x00f1bdf8,0x00c9dbb3,0x007164c6,0x004959f1,0x00c6b7fa,0x0022ddf4,0x009c85a0,0x0241a848,0x018e9ad6,0x00cfcde5,0x00706a53,0xff8cbd53,0xff2904f3,0xffd09186,0x01c5cb90,0xfb799ab0,0xfde6c3f8,0xffcbb71f,0x00bfbb36, -0x000ceaff,0x0097c8d9,0x0037135c,0xfef55aca,0xff437dc2,0xffe7caf4,0x01568e84,0x005b6cb4,0x0019ba95,0x00666ef9,0x00ec082c,0x0136eb88,0x0109b4c8,0x005a7e61,0x000e0128,0x0057087a,0x00267c8c,0x00282c62,0x0050885b,0x00563520,0x00886500,0x00747a49,0x01427938,0x0168e724,0x00d304c5, -0x00661a93,0x00822c14,0x00dfd404,0x00ab2c87,0x011766bc,0x0259d42c,0xfcfb090c,0x0282b99c,0x02b16b1c,0x02791068,0x01e71426,0x014fcebe,0x00b6f29e,0xffc24c02,0xff31d863,0xfe7e5816,0xfed807fc,0x007c4d69,0x0009b519,0x00730926,0x00959384,0x006df316,0x001bd83e,0xfffbafe0,0xffbd8c84, -0xff9a2490,0xffc670af,0xffd06dad,0xffee176a,0x001554d8,0xffd326bf,0x003cb7b4,0x00a8a55b,0x006798fd,0x0053c854,0x00470e75,0x009947d9,0x00885429,0x001f1971,0x00d85feb,0x00faa3e5,0x011c130a,0x02084fd8,0xff1be0a0,0xff57c8d4,0xfff1ee61,0x008201e9,0x00cda2ed,0x019d9e8c,0x02147ab0, -0x026a754c,0x012a0924,0x0089c782,0x0113658e,0xffbdb786,0xff5f46b7,0xffa235bc,0x00349ef3,0x007122c2,0x009d1e08,0x00a384b8,0x008cc372,0x006ff24f,0x00111399,0xffeda45e,0x000307da,0xffdce67e,0xffe4c830,0xfff74038,0x006bc342,0x009ba3f7,0x005522b5,0x0069fe89,0x003bf44a,0xffcda62e, -0xffbaa6ea,0xffdc1dd5,0xff7ce5ab,0xff42550a,0xff1449c1,0xff96ded6,0xffbf9570,0xffe24590,0x000c82c5,0xffc9a454,0xff329332,0xfe540c22,0xfefb10e4,0xff595fbc,0xffb99334,0xfffd1978,0x00200e3a,0x00357635,0x000dc8b7,0xfffd2b65,0xffe92bb2,0xfffef2b5,0x0015f08e,0x002445c3,0x000a6a07, -0x000473a3,0x0007fd6a,0x00048d0d,0xffe5d862,0xff675150,0xff962a92,0xff87fc87,0xff7ad60d,0xff849db2,0xff4fb318,0xff187956,0xfeddd588,0xfeafb616,0xfec5a67a,0xfee2797a,0xff42d35d,0xff4d96d4,0xff5d0f8f,0xff5893eb,0xff7268f4,0xff719026,0xff9eb898,0xffb71f64,0xffca19fb,0xffb1e7b8, -0xff9a27b5,0xffcc1bbe,0xfffef490,0x004ab7c2,0x00287832,0x0005bffe,0xffd34201,0xfffa36ba,0x0013d40b,0x0039dd84,0x004548c5,0x004f3b72,0x006db266,0x00139f56,0xffb12ef9,0xff2c233a,0xfee380d0,0xfebf5e8a,0xfeb8bfd2,0xfe85cdda,0xfe3b9564,0xfdee1dc0,0xfddbed30,0xfe068080,0xfe48d91e, -0xff02f90a,0xff1050ec,0xff1c3d06,0xff1cc39e,0xfefdd250,0xfee6650a,0xfedca8c2,0xfec92b28,0xfec0e2d2,0xfefff066,0xff4e5dbb,0xff95d703,0xffd09faf,0x000a1d07,0x00581af2,0x0036f611,0x00287023,0x001307e0,0x002fd7fd,0x00412ed6,0x005e1462,0x0065c609,0x0073b19f,0x009005ef,0x000ca906, -0xffbb32d3,0xff3d3c01,0xff28e11a,0xfec927d0,0xfe9c2f7c,0xfec5637a,0xff0d2621,0xff407f86,0xff420646,0xff4db5ed,0xff5316fb,0xff3232b6,0xfea6556c,0xfec1d128,0xfef23786,0xff1f685e,0xff5156bf,0xff84cfd5,0xffbd335f,0xffeb59e1,0xfffc4250,0x00027386,0x000dc989,0x001d11a3,0x002d2ffb, -0x00493418,0x004ad4e6,0x00548a60,0x0056b46a,0x0059b2de,0x0056f1df,0x005f5c1b,0x00555420,0x00111746,0xffedd0d3,0xffc7c6a9,0xffaec0a6,0xff82c054,0xff6c08b9,0xff58dc5d,0xff48d444,0xff2422fc,0xfefa233c,0xfeda96c2,0xfecc7036,0xfec3d506,0xfeb9b0de,0xfebc83b2,0xff798394,0xff6f8849, -0xff7fd9cb,0xff8deff5,0xff9ac402,0xffa49a34,0xffad862b,0xffbd7969,0xffc0789b,0xffcaff5d,0xffd4b0b9,0xffde5c2a,0xffe68705,0xffeed939,0xffed59ae,0xffedf54d,0xfff002cd,0xfff0b90f,0xfff278a8,0xfff1d47c,0xfff469ae,0xffef3613,0xfff11a3a,0xffcb0b55,0xffcbe215,0xffd2d791,0xffcb563f, -0xffc2c29f,0xffb6d3a0,0xffad0f23,0xffa3b590,0xff97495f,0xff891868,0xff80d9ab,0xff85a410,0xff7c4291,0xffbfb5a6,0xffdcdc90,0xffff317a,0x0004e4f0,0xffe2830f,0xffd1063c,0xffcbf226,0xffc21a32,0xffc83f3b,0xffeb4295,0xffd823c9,0xffd61e08,0xffdb1858,0xffd09c7e,0xffc80e84,0xffb1fdee, -0xffbcd140,0xffc6f48d,0xffd8a155,0xffe9f5f5,0xfff004c1,0xffe996e7,0xffe22483,0xffdce3f0,0xffd88960,0xffd4ad29,0xffe38173,0x000b4ebc,0x0005770a,0x00096132,0x00060cce,0x000c326d,0x0007cf3d,0xffe9a3f8,0xfffc69b0,0xfff3bcab,0xffe949d8,0xfffc90f2,0x00148573,0x001967d5,0xffd36a14, -0xffb18ea8,0xffa5ad23,0xff86f01f,0xff96e49c,0xffe9ce28,0xffcb98a6,0xffd4415b,0xffe3598a,0xffd7cef1,0xffaf47c3,0xff6b43cb,0xff6eecd1,0xff872602,0xffbba484,0xfff74e92,0x000a55ea,0xfff2ccf2,0xffdecce1,0xffbe306e,0xffb0733d,0xffbb1416,0xffe00b23,0x003dbdc2,0x002a6bf2,0x00330cdd, -0x003916b7,0x0034371e,0x00270355,0xffea238d,0x003337e4,0x002c9090,0xffd23903,0xfffdd600,0x007f9d29,0x00a4ac60,0xffe5da30,0xff8ac5a3,0xff8b008d,0xff394800,0xff5404bd,0x00107c88,0xffb67ac1,0xffc0efae,0xffcc8071,0xffa6ebd4,0xff6c1a3f,0xfef7f69e,0xff10bbb4,0xff49be00,0xffb09eed, -0x001d3e54,0x0042eafb,0x0017528c,0xffe4b11e,0xffb394a2,0xff9526c5,0xffa09a07,0xffe7c9bf,0x008742bb,0x007cf79c,0x00923ae1,0x00923e88,0x00abcdeb,0x00944035,0xfffbfbad,0x0076d9dc,0x005e22c8,0xffe51911,0x0056ba41,0x004f57b3,0x009667b4,0xffc8c841,0xff7d3b51,0xff6d1af5,0xfed6a8c0, -0xfefb6dac,0x0014c54c,0xffb3eb28,0xffda1ec5,0x002ca747,0x0018f282,0xff70101e,0xfe8b381c,0xfe67f50a,0xfeb7bf52,0xff673d68,0x002dbfc1,0x006dec36,0x001a8230,0xffca2b51,0xff7e1d9d,0xff64f8e9,0xff9fa954,0x001baae2,0x00e8d8e4,0x0157a26c,0x0179ccd0,0x00e35145,0x00de089d,0x00cea83e, -0x004984d8,0x011b063c,0x010ab3d0,0xffd2f149,0x0012edcd,0x02cc38e0,0x01afa126,0x0039841f,0xff39f299,0xfe5e08bc,0x00263024,0x007fa0f2,0xff22494d,0x0034b4b3,0xff992243,0xfe06edc8,0xfe0790d0,0xfe87e94e,0xff6d4eed,0x006c3c1e,0x00c48592,0x007795c6,0x009053dd,0x0099b7d4,0x00b07ed7, -0x00d8aecf,0x00bcec45,0x008500eb,0x00658202,0x0027e768,0x005d3a05,0xfff6d4e9,0x00a4f74a,0x0265ad44,0x01004884,0x002eebba,0xfff8a1ba,0xfeb1d4e8,0xfec3bb2e,0x006e003c,0x025e7934,0xfb89f0e8,0xfde73b30,0xfe935116,0x000854a6,0x010d1a74,0x00e31c16,0x00516fdb,0xff2f3625,0xfeaf36a6, -0xff3d4ac0,0x0185c4b4,0x00586d74,0xfffcd28e,0x003e6f2c,0x009ab747,0x00bfc1df,0x00565507,0x0011c458,0xffe6c4d2,0x0014546b,0x004226ec,0x005dc0d6,0x00620478,0x0020c8ab,0x00576b86,0x008e8e20,0x0135e9cc,0x012e9272,0x00790beb,0x00657f4f,0x0071cc04,0x00a7283a,0x011d535c,0x015eaaf4, -0x01728f7c,0xfcb2c3e0,0x035093b0,0x034cb8d0,0x026be538,0x01a71952,0x00c02f84,0x020c1b54,0x016f1e54,0xfec7e24e,0xfeded18a,0xfed8f1ac,0xff84e171,0x000ea4ef,0x00be803d,0x011fa1da,0x00ffbd80,0x008fbbd2,0xffc038f0,0xffcf3954,0xffc3811f,0xffa7d43d,0xffbde674,0xfff0b3af,0x001702d5, -0x001b477c,0x005bf58c,0x006ca9ac,0x003ecede,0x003a6f8d,0x004022e6,0x00ab9943,0x00ce8c5b,0x00d957b6,0x00ab2af5,0x00697ce1,0x00fa9c4c,0x02920b88,0xfe535faa,0xfeba2c5a,0xff223d65,0xffe526bd,0x0091b091,0x01167120,0x0175288e,0x0140f512,0x01b7e8e8,0x0174718c,0x012342ce,0x007b16ee, -0x00007019,0x000d2a74,0x0062c7a0,0x0092aa90,0x006f6cda,0x004eac7d,0x001c9727,0x0022414b,0x00187a29,0xfff49b3d,0xffb34da1,0xffab72f3,0xffc64c8b,0xffda866e,0x000eb716,0x003dc951,0x00310885,0x001ccd44,0xfffb9c69,0x00058aa1,0xffd31d6e,0xfff90c25,0xffdca5b1,0xfee11a48,0x0008b18a, -0x00943faa,0x001a9fce,0xffd06a46,0xffe7ed3a,0xffbaa538,0xffb151ed,0xff90188b,0xffc7b35d,0xffc12bb3,0xffa3c644,0x0004c67c,0x002fbf1d,0x0027a72f,0x0022bbc7,0x002bd9d4,0x0035c317,0x005a31eb,0x0052081d,0x001832af,0x00049750,0x00044f75,0x0035f48f,0xffd8c8e9,0xffa8e2a2,0xff87ecb3, -0xff60ae3e,0xff5d79c1,0xff84af10,0xffb3cad2,0xffb84b82,0xffbf0644,0xffcbe597,0xffb609a5,0xffa4bd13,0xffe42462,0xff307b7b,0xff78ce7f,0xffb69553,0xffe58355,0x000189d5,0x0004f245,0x00120b51,0x00222f77,0xffd15217,0xffd192a6,0x000268df,0x002882b0,0x00488941,0x00680299,0x00061c17, -0xffec4254,0xfff96448,0x00173966,0x003190e5,0x0038def9,0x0051071d,0x003ba1f4,0x002608da,0xffab6a28,0xff60d0dc,0xff174e3b,0xff12fa2f,0xfef35f2a,0xfebe7d80,0xfe8c0e22,0xfe4bec24,0xfe17f252,0xfdd86498,0xfde10b10,0xfe168778,0xfeced846,0xff9df151,0xffbe6e53,0xffb83f8e,0xffa3bac6, -0xff9b28b7,0xff82d2f0,0xff6188ee,0xff4677d8,0xff7474f1,0xff9f1d7d,0xffc7d8d8,0xffc166ac,0xffbdf6c9,0xffc63d82,0xffe01a86,0xfffa34b8,0x000aa36b,0x001b79f6,0x002bb7f9,0x00467889,0x00386dd4,0x00329113,0x003f52b2,0xffb92b26,0xff43123b,0xfeaf1554,0xfea27ce4,0xfe8a3058,0xfe6fbd50, -0xfe9512fc,0xfeae7ca2,0xfec74f32,0xff189194,0xff696125,0xffaeae2b,0xffa24a88,0xff27ef07,0xff5c2fc4,0xff65add6,0xff6fe167,0xff7b577e,0xff8b033b,0xffa0d92a,0xffa8d94a,0xffb21fcd,0xffafbc09,0xffb0fa1a,0xffb77f26,0xffc1e04a,0xffc619ee,0xffc3229f,0xffbd63d4,0xffba182f,0xffb87776, -0xffb2c992,0xffb2f616,0xffbbc86b,0xff95c1f1,0xff86cacf,0xff7b0f8c,0xff80771a,0xff72a214,0xff74d3ee,0xff6b926e,0xff6284d2,0xff53d271,0xff48f9a8,0xff284ab9,0xff2fc521,0xff1ffdf6,0xff1c8977,0xff35538c,0xff7cdfa0,0xff7e55fe,0xff7c7938,0xff81c28d,0xff845917,0xff851c5a,0xff853a12, -0xff89b10d,0xff899ee1,0xff8de65a,0xff92dd2a,0xff9744c6,0xff9aa2c3,0xffa110fd,0xff9ed59e,0xff9f3814,0xff9f4dc1,0xff9ebdfc,0xff9ff85d,0xff9b59a7,0xffa1d4e8,0xffa1fc37,0xffa9939f,0xff88dc1e,0xff8c3083,0xff9049fc,0xff8a038a,0xff84f5a9,0xff829adb,0xff7d32eb,0xff7a339b,0xff7ab8a3, -0xff7f08fe,0xff7f5bd8,0xff7d0eee,0xff7d7285,0xff7115a1,0xffd75504,0xfff03103,0xffee25b6,0xffd8c04d,0xffcd9361,0xffcc7d2f,0xffc32a29,0xffc8544c,0xffe253ba,0xffd5f5df,0xffd74259,0xffdd0a29,0xffe25e96,0xffdc363e,0xffc0de69,0xffc09207,0xffc20c75,0xffccbc0c,0xffd97ea7,0xffdf4912, -0xffe398d2,0xffd64504,0xffcfabd7,0xffc6bf31,0xffcce651,0xffd69790,0xfff9d2f4,0xffe5a5ce,0xffe98f0a,0xfff8703b,0xfff8e800,0xfff40314,0xffd90f28,0xffeaeb34,0xffe794e3,0xffcc75bd,0xffed25f9,0xfffbb131,0xfff006bf,0xffc8b700,0xffb2d474,0xffb20bf8,0xff9a97f8,0xff9fd7fe,0xffd5da46, -0xffc16363,0xffd8944a,0xfff34cef,0x0017a90d,0xfff97068,0xff9c4938,0xff86b049,0xff834920,0xffa5ea1b,0xffccd558,0xffe3c3ed,0xffea477d,0xffcdd804,0xffb586df,0xffa26b03,0xffafa4c3,0xffcece7a,0x0030c6e9,0x0000a98d,0x000b1ee4,0x00381a23,0x0029976d,0x0021f5e1,0xfff0ac01,0x0020531e, -0x000a8bb3,0xffa84def,0xffe9adec,0x00538e95,0x003d9ef9,0xffc7a1b9,0xff8ab16a,0xff9b2cf6,0xff599d1f,0xff6d5e20,0xffef3bdf,0xffb9f231,0xffdd77b9,0xfff51d84,0x002578cf,0xfff4dc85,0xff536e30,0xff3d6185,0xff406188,0xff888c7e,0xffd0ad9c,0xfffbeadc,0x00063fc2,0xffceb797,0xffa41976, -0xff88fb6f,0xff94fb8c,0xffc53eb9,0x008222b7,0x0024a4a7,0x00446796,0x0091ce50,0x009f9df7,0x00846295,0xfff38b68,0x004a79fb,0x00321da2,0xffa25bc8,0x003ef031,0x002691dd,0x001ef334,0xffaa6c19,0xff84d276,0xff94b49a,0xff3b10cd,0xff2d3b8c,0xffc402c0,0xff97dde8,0xfff13403,0x005db68b, -0x00e3a34d,0x0064e814,0xff25bd5e,0xfec8393a,0xfeb8ee44,0xff2b696d,0xffb62b2f,0x000a11d8,0x001d5a05,0xffbe90a2,0xff82ed32,0xff66ff95,0xff74c445,0xffd83b95,0x00e4252e,0x00e94506,0x0105f884,0x00edb8f7,0x01027714,0x00eeb061,0x00627d3a,0x0111911e,0x00b48f5d,0xff4f17e1,0xffda2022, -0x026ecdd8,0x00feb9c7,0x0003384e,0xff111d23,0xfe5957ba,0xff526588,0xfffcf643,0xffdf7681,0x00667c43,0x00052686,0xfee18b46,0xfe5a59b6,0xfe886c66,0xff0ba156,0xffffeee6,0x006ba9b2,0x0043427a,0x0042bfd0,0x0047ee45,0x00805f9f,0x0079f777,0x005679b7,0x00212ac3,0x006c2981,0x00324105, -0xfff97e55,0x0009324a,0x009b1f5e,0x019eb6cc,0x008becda,0xffe14a24,0xff57c101,0xfe3fb762,0xfed35e2a,0x00e70a62,0x02677388,0xfc555aa0,0xfddf9e94,0xfe3ed0f4,0xffdd7472,0x0229d114,0x00f08858,0x002953b7,0xffed44c6,0xfed53156,0xff38ac18,0x015b252c,0x00589e52,0xfffa50a3,0x0020f0bd, -0x00300643,0x002e86e2,0xffd9645c,0xfff893df,0xfffd9a41,0x000cc9e4,0x003a75c3,0x0067fa6d,0x0056486c,0x0018f78a,0x00548047,0x00b21331,0x00f3881d,0x00c38127,0x002ade8a,0x001e3880,0x004858e7,0x00ef09f9,0x01bc9e92,0x014f22fe,0xff57b80a,0xfcedc5a0,0x02aa9c8c,0x0306ab7c,0x019aee56, -0x004c9ed2,0xff4476b1,0x011b992e,0x01840bd2,0xffebcb3c,0x0004da68,0xff8aece8,0xff19748a,0x003e8790,0x00f56f19,0x01325298,0x0116c6fa,0x00b72625,0xffeab647,0xffd80245,0xffd4d58b,0xffca633d,0xffc25398,0xffe96c23,0x0005970c,0x005f8e12,0x007157a0,0x001e6fab,0x0012c2e7,0x001b5e59, -0x00242442,0x00b8fe38,0x00f0ca24,0x0126ae2a,0xffeae949,0xff5f2339,0x00464ecc,0x01efcdca,0xfe644cbe,0xfe7d2070,0xfec944e8,0xff7dfb4f,0x00212055,0x0007579d,0x00068286,0xfffbde38,0x0182191a,0x01d3addc,0x011618c8,0x0114bf5a,0x00bec27a,0x00996d12,0x005183ed,0x005b88bc,0x0036f5c7, -0x000c8a20,0xffd464b2,0xffb0fc1a,0xffe04940,0xffd44f83,0xff858d0f,0xff78fe73,0xff9e7f20,0xffdb06f2,0xffb610c2,0xffcd6aba,0xfff65632,0xffd95df8,0xffdad078,0x00161e6d,0xffffe58a,0x0008687f,0xffe583de,0xfee54d42,0x00c4c504,0x01354170,0x010f8a48,0x00cce62c,0x009d4012,0x00692cdc, -0x00aa4d3a,0x01236190,0x0079068c,0x0003e226,0xff8ebeeb,0xffbb309a,0xffdf0d73,0xfff7e579,0x001b9bd5,0x0038583b,0x0052b9b6,0x00627a06,0x00561aed,0x001bc6a1,0x001ab965,0x00098e19,0x00120063,0xffc824fc,0xff92ae7e,0xff958297,0xff6dc152,0xff957f53,0xfff80861,0xfff8f29a,0x000797c4, -0x002c4749,0x004d81f1,0x0068dbe3,0x007c49d5,0x00984596,0xfec461c8,0xff40f219,0xff5ab9c2,0xff8fe02a,0xffa15359,0xffe5e9e2,0xfff72020,0x000120c8,0x000c18e0,0x003300f4,0x0045af7b,0x00647d29,0x00577b26,0x00435a3b,0x00150d6e,0x000c2c3d,0x0051337a,0x00444a98,0x0049a7c2,0x00479aaf, -0x005a60f1,0x0022b3a9,0xffaed1c7,0xff66093d,0xff4eb956,0xff556b27,0xff518c0a,0xff2a0058,0xfef35de6,0xfebe6234,0xfe985d4a,0xfe97d6a8,0xfe16f980,0xfdf096cc,0xfe08e786,0xfe613ee4,0xffd84a5e,0x0005e7bc,0x0006d705,0x00136111,0x0023f3f0,0x001c0e6d,0x001a5500,0x0013d1ab,0x0019456e, -0x0017e183,0x0020b919,0x000ec701,0x0000f53a,0xfff39a3f,0x001495fd,0x002d6d26,0x00429a02,0x004270ee,0x004e3135,0x00547cbc,0x0012f8e2,0xffef2151,0xffcf9789,0xff90fc82,0xff388aa1,0xfee92c02,0xfebfb628,0xfebde738,0xfe938f66,0xfeaf5d28,0xfea87b44,0xfeab5dce,0xff033528,0xff53e540, -0xff933818,0xffb0c93e,0xff83ce60,0xff9c04eb,0xff9a2d50,0xff97e018,0xff963612,0xff96d606,0xff986ddf,0xff98a8bb,0xffa55072,0xffafdfbc,0xffb8948c,0xffc22317,0xffcf5591,0xffd67703,0xffd130fa,0xffca2e63,0xffc6924f,0xffc59213,0xffc1adaa,0xffc65903,0xffa556d2,0xffa53f0c,0xff94720a, -0xff8a3f84,0xff8dc85f,0xff9153eb,0xff9f9538,0xffa35139,0xffa12b7a,0xffa4dd68,0xffa6d359,0xff9e9636,0xff995e39,0xff89375b,0xff87f30e,0xff9106f9,0xff9caeac,0xffb2a49c,0xffaacd2d,0xffa9a0a9,0xffa6e23b,0xffa4bbd9,0xffa24312,0xff9e1507,0xffa1c9df,0xffa440d6,0xffa7a6b5,0xffab8c52, -0xffaded06,0xffb3c5e4,0xffb0d9c1,0xffb0c0dd,0xffaffff3,0xffaf80f4,0xffae0782,0xffb23bc1,0xff9cc2e4,0xff90e1e1,0xff7eddb9,0xff957239,0xff811a63,0xff69ef80,0xff6cc54d,0xff6e8ea5,0xff75e7c6,0xff76fbbc,0xff7b3972,0xff816df7,0xff8ee152,0xffa03d62,0xff840491,0xff935fcf,0xff8f0ba1, -0xffe0f69e,0xfff0fd2b,0xffeb395f,0xffe07ae6,0xffda39b5,0xffda0d2c,0xffd1e1d5,0xffd45928,0xffde60ab,0xffe1a1c1,0xffe783be,0xffef7509,0xfff6801e,0xfff0a2ed,0xffd89432,0xffd09b80,0xffcceb29,0xffd0fd5c,0xffd907c1,0xffdddd30,0xffe6032a,0xffd826ae,0xffd21669,0xffc632bf,0xffd691d2, -0xffde6726,0xfff9a8ea,0xffe24281,0xffe6e2f2,0x00033bf0,0xfff8bf59,0xfff35079,0xffe52cad,0xffece4bb,0xffee685e,0xffd2abb7,0xffefde81,0xfffbc387,0xffeb98d4,0xffdaa3d3,0xffcc1881,0xffce92a4,0xffb7b8c4,0xffb120a8,0xffc3d830,0xffcc4a1b,0xffeda6c1,0x0011258e,0x00389ae6,0x002495d1, -0xffd31c86,0xffa9fbb3,0xff942b86,0xffa38558,0xffb69f7a,0xffc9d076,0xffe0163c,0xffc8617e,0xffb56a98,0xff9b797d,0xffbc0835,0xffd813df,0x0023dafc,0xfff63a4d,0x00022d9d,0x0045d0b1,0x0027208b,0x0022284c,0x000ef73a,0x001bdc65,0x0003eee0,0xffbd0fcf,0xfff60abc,0x003639e1,0x0006c80a, -0xffd90303,0xffb16468,0xffbc5fe2,0xff814237,0xff88fcfe,0xffb94fa2,0xffd321e2,0x000dd707,0x002b42fd,0x006a77be,0x0042b04c,0xffaac582,0xff77662b,0xff56c005,0xff78f312,0xff9dca6a,0xffbf6443,0xffec3e20,0xffb9bb64,0xff97c9e1,0xff741133,0xffa7eda6,0xffcaa98c,0x00751ff5,0x0005e34f, -0x002ce4cc,0x00b3d611,0x008eee83,0x00742235,0x001768cf,0x0035f84b,0x00273204,0xffae8775,0x003b8c35,0x002ef786,0xfffc1ca2,0xffdbf871,0xffc24d66,0xffd19966,0xff8ae643,0xff4b2f51,0xff6643b0,0xff9ee4ea,0x00184486,0x008a91c2,0x0129057e,0x00e56ec7,0xffbeca3c,0xff32da1c,0xfee530f4, -0xff0d402a,0xff50acb0,0xff9b1106,0xfff271ce,0xffb67dbd,0xff84e346,0xff602aa8,0xff7b7874,0xffc19e5f,0x00da9412,0x008d484e,0x00a7775d,0x0123964c,0x01294c92,0x00fe7974,0x0092672b,0x00ea3279,0x006c33db,0xff4e2771,0xfff1ebc7,0x01831b26,0x003126ea,0xffcc20ea,0xff287bda,0xfeb9cce0, -0xfee3d4c2,0xffbd2eaa,0x00a5f15d,0x009963b3,0x0075a6f6,0x0009e909,0xfeb4724c,0xfe8e1ed6,0xff17c33f,0xffbf1874,0x0022ae19,0x0033cc6f,0x00202a5f,0x0009e179,0x001bb1e3,0x0005cc44,0xfffafba9,0xffdbb1df,0x0072258a,0x004bfab6,0xffaff789,0x00580e59,0x00b4538a,0x009abfd3,0x0047b22e, -0xffc9aeeb,0xff0e0c6e,0xfe75ff8c,0xff54983d,0x01327ce4,0x01ec9b44,0xfd7c9a90,0xfed0e0e4,0xfe967ac6,0x0005ce93,0x02fade1c,0x013cfa0c,0x005805a3,0x00aef73c,0xff26bfb0,0xff456b2d,0x00aaa0a7,0x00828cd2,0x00462380,0xffe263f0,0xffc678b9,0xffaef40d,0xffad1f66,0xffd870f1,0xffe8c3fe, -0xffff9768,0xfffbce12,0x00206fc0,0x0040fecb,0x00266caa,0x0067497c,0x00af55ab,0x009d82e1,0x004a374e,0xffc87ebd,0xffd237a5,0x00413310,0x014d4728,0x01f5025a,0x00cdb1e1,0xfde314d8,0xfd7e19f8,0x01474482,0x03062160,0x00b4118c,0xfeda762e,0xfdc8a660,0xfe539ed4,0xffd143b0,0x02203988, -0x00ca6322,0x0002e0c4,0xffaae2e0,0x00438aeb,0x00af0942,0x00e0eff6,0x00d748f7,0x009df2d9,0x003ff534,0xffe6e3ee,0xffd7e62b,0x000c2e63,0x0006fd23,0x000fc5cb,0x000ba82a,0x0072a18a,0x005e202c,0x00030b42,0xffe49764,0xfff58f57,0x000ffc4e,0x00ae460d,0x00c0d629,0x00a00ccf,0xff518f23, -0xfedf8b84,0xffbd9994,0x007b75fd,0xff04a81e,0xfe641e06,0xfed9d72a,0xff65e96b,0xffa35f34,0xff84b449,0xff7fe627,0x00236bc5,0x00ec7aae,0x017c1ed8,0x0118ddca,0x016e7b22,0x01494506,0x00dcd4cd,0x004725cc,0xfff6f135,0xffdfcae8,0xffad8b01,0xff90c6b3,0xff75ef1d,0xff8e02bd,0xff9629e4, -0xff7cf0d3,0xff707b56,0xff8f0ea4,0xffd7b102,0xffa04113,0xffa57f11,0xffda1639,0xffcd3cc5,0xfffba136,0x001df804,0x0041aaaf,0x002c44b9,0xffd8ac03,0xff7e9e27,0x00f06035,0x0121d63c,0x01af78c0,0x01d5464a,0x01a8a9ee,0x014e4490,0x0146a3c4,0x01930f00,0x00fee752,0x008ccf75,0xfff88c72, -0xffba04dd,0xffa157d7,0xffbeae8a,0x00044df0,0x002b1709,0x003f3188,0x004d7f8a,0x004850e5,0x00270611,0x0023b20e,0xfffcbc0f,0xffc9b5a3,0xffb1b33f,0xff927670,0xff90f32a,0xffbc4b61,0x00053559,0x00486af8,0x001d09f1,0x00190b06,0x002a514b,0x00542b30,0x00856d67,0x00a4ab2b,0x00b18761, -0xfe915152,0xff18822f,0xff12d5d7,0xff3ee67e,0xff693faa,0xffbc9061,0xfff1442d,0x002506ac,0x00396f1f,0x005b871b,0x007d79e9,0x007b116a,0x006ab81e,0x0042dfb5,0x0040cbbb,0x004ef4eb,0x006a91d8,0x005f0451,0x0053e6b3,0x004de85a,0x0020178d,0xffd96b60,0xff6f46e9,0xff61069e,0xff63f533, -0xff7f4296,0xff755e2a,0xff53ef5d,0xff41c717,0xff1649b7,0xff068a90,0xff1e268d,0xfec39056,0xfe85bf52,0xfe48dadc,0xfe4f2ea2,0xffb2f737,0xffee08bf,0xfff6ada0,0x000ef02d,0x001fe4f7,0x002fcc79,0x004b5e4e,0x006ae943,0x006f5f3a,0x006e0b84,0x0070d8cd,0x005f0882,0x0057076e,0x004fc8dd, -0x005a29af,0x005ea5b6,0x006578e4,0x005d7327,0x0056edfb,0x005e92e7,0x001586d9,0xffd1df72,0xff8d068a,0xff8dcd7d,0xff721c3e,0xff6b99c7,0xff2f802d,0xff1dfd92,0xfee20d74,0xfee32646,0xfec56cc8,0xfeae60dc,0xfedf28e6,0xff0cf7eb,0xff2cea4a,0xff7790af,0xffbf0539,0xffd5a959,0xffce774a, -0xffca8e01,0xffc8499b,0xffc3a658,0xffb9811d,0xffaf8bb3,0xffb4204a,0xffbd8930,0xffc914a3,0xffd6c629,0xffe1f96e,0xffe91578,0xffea8039,0xffecbe16,0xfff0211c,0xfff51743,0xfff839e0,0x00011227,0xffdbf4d4,0xffdfdcd9,0xffd0f2a8,0xffc4376e,0xffb753c1,0xffb67e34,0xffbc07a7,0xffbfb274, -0xffba086c,0xffbdb3cd,0xffbbd792,0xffb8490d,0xffbbdfae,0xffbc7ef1,0xffc103fb,0xffc64560,0xfff31200,0x0006fd94,0xfffc4a4d,0xfff6f3bd,0xfff0018f,0xffeaed78,0xffe7d1d9,0xffe247e9,0xffe89c5e,0xffea6cec,0xffeaaee6,0xffeb2df6,0xffec5394,0xffefbe31,0xfff0b72f,0xfff25b7b,0xfff3631a, -0xfff524dc,0xfff5c60a,0xfffd0c7b,0xffeae5bf,0xffe24879,0xffcf7b6e,0xffe67b5a,0xffd6f168,0xffbf3758,0xffc05aca,0xffbff8ba,0xffc51153,0xffc3e1e3,0xffc651a6,0xffc67977,0xffd5f5ee,0xffe5dad0,0xffd4f93f,0xffe78bd8,0xfff68b3d,0xffee5f93,0xfff85395,0xfff2ae06,0xffef97a3,0xffeaf724, -0xffe6f36f,0xffdddc03,0xffdebe9f,0xffe25fd8,0xfff0b39a,0xfff8de51,0xfffd9208,0x000314bb,0xffff1e4d,0xfff508e3,0xffe52c39,0xffde3ecb,0xffdc8005,0xffdfcd54,0xffe242b6,0xffe95f1f,0xffdf07b3,0xffdab8b3,0xffcbceb6,0xffe877bf,0xffed714f,0xfff958b8,0xffebc11a,0xfff0b088,0x000abba3, -0xfffb1cce,0xfff65a8a,0xfff6c448,0xfff66ef3,0xfffac7ea,0xffe80ce1,0xfff8ceec,0x00113460,0x0001dcc7,0x0001db48,0xfff35c3b,0xffe8e587,0xffc7be42,0xffba0cca,0xffc33d84,0xffe27c8e,0x00037f0b,0x001cbd70,0x003e2916,0x0039dd55,0x001142df,0xffd5080d,0xffb30e4c,0xffae6790,0xffb04350, -0xffb948c2,0xffce5cc1,0xffbf237b,0xffb79891,0xff9eb12c,0xffd72510,0xffeff17e,0x001099d3,0xfffd73b7,0x00065961,0x00408843,0x001e836c,0x001de287,0x0029b647,0x0020174c,0x00108c78,0xfff107d9,0x0013994a,0x002e7a67,0xffff8a99,0x0004902b,0xffe41a47,0xffd3a275,0xff8c8dcd,0xff8ca9c1, -0xffa3c7cf,0xfff3a9cd,0x00338284,0x00393ee5,0x00730647,0x005f192b,0x001856c3,0xffbad91f,0xff8542bb,0xff835bf1,0xff86858f,0xff963e05,0xffc44803,0xffa37ce8,0xff92c95c,0xff6a0826,0xffd3be12,0xffec674e,0x004e6fcc,0x001099f7,0x002e5b17,0x00b0ffd0,0x0064962a,0x0056b4d9,0x003f8043, -0x0034afd1,0x0036a567,0xffea8bdc,0x003f5de6,0x006ac89f,0x00322999,0x00464002,0x002859e0,0x000e7ed1,0xffa5ab6d,0xff4f5b99,0xff4cf0de,0xffca1ded,0x0035f458,0x007876df,0x0107335a,0x011d08d2,0x00828c19,0xffae6ead,0xff30c4e2,0xff1732ed,0xff14a6d9,0xff3964b5,0xff96027e,0xff842cec, -0xff6e43c1,0xff42536b,0xffa81776,0xffe1cf86,0x00b64dd5,0x00608091,0x007b3fa6,0x014c785e,0x0135364a,0x00fb43db,0x00c7853c,0x00cb4d8f,0x006048e3,0xffb60398,0x0040fb0e,0x00536014,0xff76c8ba,0xff7b2014,0xff1d84ab,0xfeba186e,0xfea2594c,0xff794a5d,0x00cfb9e7,0x00a50860,0x00b1403c, -0x00dbe2d5,0xff21de5b,0xfea7d698,0xfeff067c,0xffb32ac5,0x0017bd23,0x003503da,0x003db7de,0x001af5a9,0xfff60155,0xffd28548,0xffdde20f,0xfff433d3,0x005f608d,0x004ee0e0,0xff9e6f28,0x00bdacfc,0x00e813bd,0x00024bf8,0x000aba84,0xff94a5a7,0xff0ee6ca,0xff006590,0xffe20af3,0x012ac6ae, -0x00f069ac,0xfed21290,0xffe40f88,0xff576870,0x0065a039,0x02e4b32c,0x01acc1d6,0x00d9b77c,0x00eb6c21,0xff755234,0xff606300,0x00145b40,0x00e72d10,0x00d48b7f,0xffb2b1ca,0xff9528fa,0xff73adcc,0xffadf874,0xffb891c6,0xffaff0cd,0xffa3ccd6,0xffa098d2,0xffc897bb,0x0034848b,0x0026f7d1, -0x00630ba8,0x00863a4c,0x0046b464,0xffdef020,0xff77312e,0xffd8b1fb,0x006ec106,0x013ca27e,0x0155f816,0xfffe01b3,0xfdc49e10,0xfe4adbc4,0xfffcf2ea,0x0201c410,0xff64e05a,0xfdf58544,0xfd6c0088,0xfcbd2644,0xfe77050a,0x02b8cf54,0x00f38534,0x005b536b,0x0071da4e,0x003060fb,0x003ffcb5, -0x007f6dc3,0x00a6a9a1,0x009a7e8f,0x00913de7,0x0029e7b4,0x000f913e,0x0048e6cc,0x003cd462,0x00325e99,0x0024823a,0x00555343,0x002b0b8f,0x0006954b,0xffc7bab0,0xffdc5dab,0x00209aba,0x0069cdb1,0x00371d26,0xffcaf901,0xff694389,0xff3a25ab,0xffbd0092,0xff481bdf,0xffa0c109,0xfedeca5e, -0xff5b2fbc,0xffbafad5,0xffc11b59,0xfff467fa,0xfff3e47f,0x009a6fcf,0x00715487,0x00ff3263,0x015bbb4e,0x016b80cc,0x014f04a8,0x00ec89e9,0x00567d80,0xffc59226,0xff8e7af4,0xff689427,0xff611254,0xff729995,0xff5dd5ec,0xff6a807f,0xff7d84f2,0xff92d96f,0xffaddc7f,0xffcf5580,0xffc795a4, -0xffbb4304,0xffc5c342,0xffc87f1a,0x000dc266,0x000e604e,0x002d9f8e,0x0023a744,0x001c26f4,0x000af5dd,0x006c7f89,0x002447b4,0x010da646,0x01888a36,0x0193b972,0x017a4c10,0x01600c94,0x016f2684,0x01346ad8,0x00f4fc46,0x00b679f1,0x003c491f,0xfff0dfa8,0xffce1c84,0x00034499,0x002e51f2, -0x0047d3d2,0x003e46f0,0x00384cdf,0x003b8288,0x0016869d,0xffda39a9,0xff8f7489,0xff85162a,0xff8e5b9d,0xffa1c489,0x00143ccc,0x005b774d,0x00554dee,0x002bbf0d,0x0020683f,0x002104c7,0x006a174b,0x00965d7c,0x00854e2b,0x0060f270,0xfefadee8,0xff3ab4ef,0xff8b25d1,0xffc24f58,0xffdc132a, -0x0005e14d,0x001eee21,0x003805e6,0x0050cd3b,0x005bb854,0x0067049d,0x00483d25,0x004a9018,0x0048c200,0x005bd535,0x005bd530,0x004f9ad6,0x004dd167,0x002f61df,0x0014a504,0xffca6d48,0xff8f4a8b,0xff6374a1,0xff8a0eec,0xff93e35a,0xff815a18,0xff7b0038,0xff767d90,0xffa0959d,0xff9a17d7, -0xffa26828,0xffb75e3c,0xff987c26,0xff581eeb,0xfee94f88,0xfee8e94a,0xff77121c,0xffb45557,0xffb7f011,0xffc4ec0f,0xffceb54d,0xffec8509,0x00158e35,0x00440682,0x005aee8c,0x00697bb2,0x0077e7f6,0x00703d47,0x006b4472,0x0069b376,0x00618ce6,0x005c00e2,0x00566982,0x003e0db4,0x0020b7be, -0x00144111,0xfff6b7af,0xffcc5889,0xff9b6d16,0xff9db517,0xff99dc2a,0xffa04cd7,0xff7be4ec,0xff63595e,0xff35d7cd,0xff19d886,0xfef11766,0xfec9638a,0xfed4f030,0xfedd2870,0xfedd535a,0xff3585d9,0xffe885e7,0xfff1cf16,0xfff01765,0xfff6bee9,0xfffbee25,0xfffa052d,0xfff0a863,0xffe7d1e3, -0xffe61fa3,0xffec4593,0xfff6dcc9,0x00023c83,0x000d0eed,0x00166a7d,0x001ac2b8,0x001f7824,0x0025f54f,0x002ad272,0x00321a8a,0x003924a3,0x0020b74e,0x000fc6aa,0x00007117,0xfff13423,0xffda03ff,0xffc7753d,0xffc2ddd8,0xffc1dbaf,0xffbdefe2,0xffbbd197,0xffb61040,0xffb26f71,0xffc1beaf, -0xffd2cc60,0xffdc1e06,0xffde6718,0xfff68bca,0xfff7632d,0xfff53da9,0xfff12f12,0xffed1bb0,0xffec26ea,0xffee14a5,0xffef150c,0xfff435cb,0xfff514b1,0xfff3b1db,0xfff39ab1,0xfff403a4,0xfff5bbe3,0xfff78d5c,0xfff96cd9,0xfffaae87,0xfffdd25b,0xffffa51e,0x00051100,0x0001202d,0x00005e38, -0xfffde10e,0xfff12e46,0xfff03a6d,0xffebc19b,0xffe9e55f,0xffe56c46,0xffe347cc,0xffdf8a0b,0xffdeb412,0xffd8b519,0xffdc1111,0xffdc807b,0xfff13f92,0xfff3266d,0xffec03a4,0xfffa13b3,0x000130a2,0xfffabb91,0xfffe2cfc,0xfffa4579,0xfff41d1f,0xffe763c6,0xffe6e7d1,0xffeb1c76,0xfffd70c9, -0x000566f0,0x0002ca92,0x0009a165,0x00098c95,0x000ff2e8,0xfffa26e9,0xfff0eccc,0xffe85747,0xffe9bcc4,0xffe9a96a,0xffed2999,0xffe97371,0xffe940d3,0xffdc97c4,0xfffcb0cb,0xfffe2465,0xfff9db22,0xfff92080,0xfffb5797,0x00047a79,0xfff9d024,0xfff811b7,0x00051a7c,0xfffd323a,0x00023270, -0xfffec775,0x00033c65,0x0026840a,0x0016ff7a,0x00291130,0x001bc82e,0x0005abd9,0xffd4c26b,0xffc43df2,0xffd15199,0xfff771f1,0x000ff8c7,0x001476c4,0x003749ab,0x0044cfc6,0x004b59ca,0x000555d8,0xffdb8c4d,0xffbee880,0xffb7e3c0,0xffb74525,0xffc48cc1,0xffbfbadf,0xffc54888,0xffb9381c, -0xfff8ebf2,0x000c8a75,0x00025d5f,0x00099325,0x00096479,0x001e896d,0x000ab234,0x000f7f04,0x0034799c,0x001b6f8a,0x001644af,0x001a059e,0x0026c05c,0x003054c5,0x0001927c,0x002a8323,0x00122c49,0xfff2f8fa,0xff9a1c99,0xff938cde,0xffab4034,0x0010c892,0x00468f78,0x0027c132,0x006241f0, -0x0065ff14,0x00826202,0x000405c0,0xffc348f4,0xff9713af,0xff8ed423,0xff8ca3b9,0xffa99179,0xffa0bb39,0xffa90914,0xff8fd744,0x000e8a75,0x00183c61,0x00271c1b,0x00279871,0x0029d212,0x006377e9,0x001f3c5c,0x002265f4,0x004d9a0c,0x00230af9,0x0036d721,0x00277768,0x00402f23,0x0093242b, -0x005bfea3,0x00a9fd03,0x0093a78d,0x0057f215,0xffbfc86d,0xff6840af,0xff685d2b,0xfff8a329,0x003fbb6a,0x003aae04,0x00c645b3,0x012a1f64,0x013900f0,0x003a5f1e,0xff971bf0,0xff33f514,0xff104cdb,0xff115ce4,0xff53a1c5,0xff6360c7,0xff6cb4bc,0xff4c0fe3,0xfff15ded,0x0024d3f3,0x0088094e, -0x0059f2b3,0x006ca3b3,0x0126b2ea,0x0109add6,0x00dafe85,0x00e8d13c,0x009bcc58,0x00584971,0x00278291,0x007bd579,0xff9097ce,0xff1bf197,0xff1a929c,0xfee43a42,0xfe978b60,0xfe9abc14,0xff4e17fd,0x00c3f8da,0x00a07585,0x00c56db2,0x014e08f4,0xff95c81d,0xfed55012,0xfee5d5d2,0xff98e525, -0x00136bf4,0x004e1949,0x0079ab77,0x0061525d,0x000c0fab,0xfff40c40,0x0014305f,0x004ec66f,0x004394be,0x0038c91a,0xffa8cb6a,0x00fa305c,0x010a67b0,0xffdf6398,0xffce55f8,0xff48a4ad,0xff0e5d29,0xff8d05dc,0x004e7ce6,0x00e2095c,0x002c1cf4,0xffb7f662,0x00951a50,0x00741612,0x00e3a27b, -0x01f03266,0x01d03fa2,0x01591b8c,0x00c92c22,0xffb78783,0xff7e5003,0xffd20a10,0x011d58f0,0x014784ea,0xfff5958f,0xffa5058f,0xff6ab2d4,0xffa99064,0xffb19237,0xffa3f54f,0xff67fe3a,0xff8d8fd1,0xffa9912c,0x000e7b1b,0x000fa64a,0x004073ab,0x005d0607,0xfff9b71a,0xff8ee61b,0xff5f751d, -0x0021220f,0x00a6740b,0x00cd0d1b,0x00671938,0xff311ffa,0xfdfd44d4,0xfecf0ae0,0xff4fed56,0xff559dcc,0xfdc253ac,0xfd8bcbfc,0xfe2bff44,0xfd219788,0xfdf7f070,0x009d52fa,0x010ff5d0,0x0129f81c,0x00b7119c,0x003ab381,0xfffdf716,0x00294909,0x00841a35,0x00a5c91d,0x00a99cc0,0x0076fd06, -0x00438ee9,0x0027dfdc,0x0032e31e,0x002990c2,0x0031b3d1,0x001f97f7,0xfff2921f,0xfff9d3a1,0xffc90f3a,0xffe7902f,0x003871b9,0x000a14cf,0xffb10796,0xff41effc,0xffc7fd61,0xffd92aa2,0xffcd01e7,0xff43186e,0x0032c9c5,0x001ebb2a,0x006e562d,0x007d333e,0x006ca3d4,0x0084936c,0x006c36f1, -0x006a9c4f,0x00115e50,0x006c4760,0x01244032,0x01201a8c,0x0113ab40,0x00e20801,0x0056b189,0xffd84759,0xff7b2698,0xff61e5ff,0xff5a5c51,0xff6fe1b1,0xff5c02f8,0xff5e8f90,0xff7beeb7,0xffbc8d17,0xffdfc5f0,0xffd25e1a,0xfff665f5,0xffe1e92d,0xffbbfd2d,0xffd0d1c6,0x000c54a9,0x000e4a0d, -0x0006c715,0x002380b9,0x008ec85e,0x005894ee,0xffb584c8,0xff2aafe6,0xff964412,0x00038fdf,0x0061040e,0x010c62b0,0x0155bc06,0x01524688,0x0156e2d4,0x013f07a2,0x014dfe96,0x00d9a208,0x008835c1,0x003dfadc,0x003d6041,0x00410759,0x0032e584,0x00375984,0x00267ba0,0x001e0e2c,0xffe7170a, -0xffa4d1ba,0xff71b8ef,0xff681359,0xff944d45,0xffd689a1,0x00347b8b,0x00636b6f,0x0043e4bd,0x004a8e38,0x0049283a,0x003faa88,0x007bf6b2,0x007de74b,0x0033280f,0xfffafcd6,0xffc27736,0xffe6386d,0x006b47d7,0x00a34bcb,0x00b598f0,0x007f3b0f,0x00565221,0x0048f093,0x003bbae7,0x002d793b, -0x002526e4,0x000ad313,0x001797fd,0x0030c012,0x004af2c4,0x00479948,0x00242b6c,0x0020e452,0xfff546f4,0xffc08584,0xff8a0025,0xff71bf75,0xff8c9a6d,0xff9b5dd9,0xff9b8f48,0xff825f38,0xff8f64ae,0xffaf9be1,0xfffbb5a1,0x001dcb51,0x003b6ebe,0x004901d1,0x0058e7fd,0x0040749f,0xfffac78b, -0xffe408e5,0xff42a434,0xff6935b5,0xff7a4978,0xff8fb43f,0xffb282ee,0xffd3fab7,0xfff86766,0x0016d17b,0x0029a7dd,0x003812a4,0x0040c959,0x003d9862,0x0037f7e2,0x00342efe,0x002ef1f4,0x00343df1,0x003e80c6,0x00162311,0xffec0498,0xffcfb351,0xffd30854,0xffbeed55,0xffa89834,0xffa25b7b, -0xffa1cb41,0xff995e48,0xff900abe,0xff7d3c17,0xff673b4d,0xff418633,0xff1f9b90,0xfefab69c,0xfeec644c,0xfed4b32a,0xfec1307a,0xff0b3d56,0xffe84e97,0xffed90bf,0xfff96f01,0x0008d5cd,0x0011891e,0x0015aa3a,0x0018ab9b,0x00210079,0x00204c8d,0x00233e5a,0x0028d1f1,0x002bb3a0,0x002f4afd, -0x003218fc,0x002d91e3,0x0024e1d4,0x001f9a85,0x001aeaae,0x001a6b31,0x0016cf1f,0x00182573,0xfffd668c,0xffefccf0,0xffdfc79c,0xffccfb4e,0xffb4572d,0xffab2182,0xffa5107a,0xffa31ea4,0xff9bbb02,0xff93f768,0xff907115,0xffa78540,0xffc35cdf,0xffd0f5b3,0xffd55fa1,0xffc68a57,0xffc09a27, -0xffc6a387,0xffc988ad,0xffcf0acf,0xffd7b0a5,0xffe0bc1b,0xffea797a,0xffe7b53e,0xffe5bda9,0xffe30f95,0xffe24b0f,0xffe1ebf7,0xffe2d46d,0xffe1041d,0xffe0ead6,0xffdfa410,0xffe0ec77,0xffe184a6,0xffe03755,0xffe24a60,0xffe11bb7,0xffe53ddb,0xffcbfa73,0xffcda761,0xffd05251,0xffcd327e, -0xffc6d9f5,0xffc01ab2,0xffbbd1bc,0xffb8cff5,0xffaecdce,0xffaec3de,0xffabb74e,0xffc79897,0xffc50bf5,0xffbb8918,0x00027a78,0x0004cf53,0xffff93ac,0x00084a6d,0x00068866,0x00022a1b,0xfff41c4b,0xfff22979,0xfff2ec38,0x000864cd,0x000e5629,0x0002a9da,0x000cf729,0x00107afb,0x0022d5fc, -0x000c1a6a,0x00022f15,0xfff4416f,0xfff46ddb,0xfff23c14,0xfff24045,0xfff29bd3,0xfff5de53,0xfff16449,0x000bad43,0x0009723a,0xfffb7677,0x00019af3,0xfffe914b,0xfff364a2,0xfff22a8f,0xfff39629,0x000886d5,0xfffc6381,0x00033512,0x000ce493,0x00079eb4,0x00281534,0x001c4872,0x003c287f, -0x0036be03,0x0022a60d,0xffef8e00,0xffddcf2d,0xffdf7c68,0x000c615e,0x0019a5a0,0x00040243,0x002b85da,0x0047648f,0x0072f76f,0x003393e3,0x0008929f,0xffd7ee41,0xffc957be,0xffbec9fe,0xffc1c5a1,0xffc38a46,0xffd73c99,0xffe45b93,0x0015d9c1,0x0021e79c,0xffff0560,0x00119809,0x00054b32, -0xffef4a9a,0xffece969,0xfff6f6a2,0x002b80b2,0x0007cdf4,0x000b8527,0x002f1b63,0x0025f3af,0x0022dae5,0xfffeca82,0x003a1495,0x003362fb,0x001dc9ba,0xffca5e33,0xffbd433f,0xffb89ac4,0x0030abda,0x00521b06,0x000eb302,0x004e345f,0x006125c5,0x00c51baf,0x0047900d,0x0007a35f,0xffb86680, -0xffac0693,0xff9b2e01,0xffa468bc,0xffac2693,0xffcb1e71,0xffdb18db,0x003ed647,0x003c5cd3,0x001175c9,0x0034a79b,0x00142892,0xffed9e2c,0xffcfbd8d,0xffde3c77,0x0038476f,0xfffb0c29,0x001e2076,0x00530350,0x003139a2,0x00838148,0x005ad7ef,0x00ce6590,0x00d164ec,0x009e73f2,0x000b1dc8, -0xffb7d747,0xff8736fd,0x0029431b,0x00493764,0xfff63cbc,0x008433cf,0x0112dbc0,0x01a59220,0x00c40f9f,0x0014db15,0xff70b588,0xff3467fa,0xff12761e,0xff2c78d3,0xff524a12,0xff89b7dd,0xff9d947f,0x00438cfd,0x006852f8,0x0065c29c,0x006e699b,0x0062c785,0x00984485,0x00a3b556,0x008e67d3, -0x00c7cb30,0x004e805f,0x00326d49,0x007ac11b,0x007f3a2c,0xff2e932b,0xff1760a3,0xfee0f7d4,0xfeca7898,0xfec0f1fc,0xfed26ac4,0xff5a6b44,0x00c81118,0x009fa4a5,0x00d9d980,0x01853fa2,0x0005d379,0xff1093d6,0xfeda8f9a,0xff4b9800,0xffe49c67,0x006b1e44,0x00bfb3a7,0x00da7854,0x008da374, -0x00612f26,0x0073f242,0x00963361,0x001da687,0x00102e99,0xffd38370,0x00dd1f91,0x00eef683,0xfff46cfd,0xffbe624c,0xff3445b4,0xff1dd653,0xffe81de2,0x00719b6e,0x00964286,0xffacb588,0x006b652f,0x00e5f35c,0x01219dbe,0x00e66516,0x00afddf0,0x01a562ca,0x01a44b40,0x00b3256b,0xfff5b7f0, -0xff84e0e7,0xff8d1f8e,0x00dfeec5,0x015a859c,0x00a15753,0xffe894e2,0xff891419,0xffa87c7b,0xffb44df0,0xffbeb5a0,0xff7974d5,0xffc90a98,0xffcc0163,0xffd835e5,0xffe60a91,0x000ba4ea,0x003dcdbc,0xffbc7525,0xff65eb0f,0xff7e68be,0x0047953a,0x009f7ea1,0x0050ae0b,0xff942702,0xfea6188c, -0xfe369b04,0xff5eb727,0xff0471bc,0xfc8c0a28,0xfceb3624,0xfdda4e90,0xfebe4666,0xfe569c7e,0xfe533954,0xfe74b9ae,0x014feda8,0x01ea1e7a,0x005bff2c,0x002d5dc5,0xffde412b,0xffeed917,0x0042c9de,0x007d53bc,0x007f5724,0x007f62df,0x00483458,0xffdc174d,0xffffe971,0x001340d7,0x003e99cf, -0xfffe2add,0xffce3d8e,0xffd3345e,0xffe76ff9,0x001482f5,0x002ec7f7,0xffcff968,0xff7c1224,0xff2a63ee,0x002dd1f7,0x006743b0,0xff88f77d,0xffccf578,0x00f97b64,0x01a8538a,0x018b05e0,0x0107962a,0x00aca8d1,0x0072daf1,0x004f22a8,0xfff6eb98,0xffa828c5,0xffbb3e30,0x0072cef3,0x00b539f5, -0x00d31193,0x00de53b9,0x00681dc7,0x000decd1,0xff9b3605,0xff81de04,0xff6f5624,0xff68e29b,0xff682228,0xff667485,0xff89ba04,0xffd5f1c4,0xfffff015,0xffeab470,0xffff435d,0xffed8cb0,0xffc5561c,0xffef6047,0x000d6917,0x001c2852,0xfff61ba0,0x0023361d,0x00bb3253,0x009f0ee7,0xff496fe2, -0xfebe09b2,0xfe952b78,0xfedd8718,0xff710e7d,0x008c0227,0x0115408e,0x01057a1a,0x0140b6fe,0x014c04c0,0x01727782,0x012499ee,0x00ec376e,0x00b74690,0x0075adc3,0x004cf711,0x002032fc,0x001b8e89,0xfff27b41,0xffc61b3d,0xff9bb364,0xff6e96c9,0xff64d21c,0xff642a40,0xffa1d510,0x00109259, -0x0024d864,0x00375b4f,0x00303633,0x005b1070,0x005f3e28,0x0058041f,0x0058785b,0x0044b033,0x0017c81a,0xffcb0fee,0x0090f17e,0x00aa75bd,0x0110326c,0x012763d8,0x011d98b2,0x00bdf436,0x0078d5af,0x004f5eb2,0x002fa537,0x000eba7f,0xfff0dfbb,0xffe4e0a5,0xffe88515,0xfffc74a3,0x00209cb1, -0x0021fd8d,0x000387bd,0xfff5fb70,0xffcf6107,0xff996f16,0xff8bf8b5,0xff8a0aa4,0xffac526d,0xff9a30ed,0xff8ef268,0xff84236d,0xffb8124c,0xfff9c6f1,0x00490f65,0x007ebd92,0x00a5e58a,0x00b06907,0x00d0dc6e,0x00d84c9f,0x00bd616d,0x00aaf1c2,0xff3dc033,0xff4d8a9f,0xff756b56,0xffa35360, -0xffea3922,0xfffc0792,0x0004ec0b,0x000095c1,0xfff56b30,0xfff1e028,0xffe8a009,0xfff2ab68,0xfff9bf75,0x00012eef,0xfff8b2d9,0xfffa4da1,0x0003b80b,0xffdbdc3c,0xffb725dc,0xff964bcf,0xff9a38c6,0xff8fc566,0xff86b15d,0xff8662d1,0xff8b6b26,0xff7c4ced,0xff8676f1,0xff7f7087,0xff794759, -0xff665b7d,0xff5627e5,0xff487872,0xff2fb5e3,0xff0bf7ee,0xfef2ee9a,0xff1f1519,0xffbcabc7,0xffbd7207,0xffd4a0e8,0xffe41203,0xffecef7b,0xfff8ae43,0x000e76da,0x002c54a5,0x00308c7c,0x00333143,0x00339163,0x002ff579,0x002aa6cb,0x0028a587,0x0018b7cb,0x00071a4e,0xfff77b43,0xffeb5b3d, -0xffe2bdd1,0xffd7cf7a,0xffe0ca2a,0xffcb3c7c,0xffbf85fc,0xffb1a75f,0xffa5259d,0xff9243bd,0xff873591,0xff7e8d48,0xff7b063d,0xff6fef3b,0xff6511e4,0xff5eda38,0xff7475ad,0xff8f623f,0xff9d30ef,0xffa51c1d,0xff999af8,0xff9280cc,0xff9d6e89,0xffa6f5c0,0xffb3c421,0xffc297f4,0xffcd26c1, -0xffd95b02,0xffd1f609,0xffcff514,0xffcf0d24,0xffcedb01,0xffcf37b3,0xffd0c2e7,0xffcb6609,0xffc86dc4,0xffc4340d,0xffc18bc6,0xffbe6c61,0xffb79d7c,0xffba4ba9,0xffb79a01,0xffbb69ed,0xffa70fca,0xffa6a911,0xffa87972,0xffa41a32,0xff9d7e58,0xff95d473,0xff9144c5,0xff8dcecd,0xff8264f9, -0xff852f8a,0xff8468f6,0xff9a6f16,0xff98264e,0xff985cd4,0x000f0f12,0x000970e5,0x000853c9,0x0013c6b9,0x00156553,0x00169b9a,0x0007916e,0x00041f5f,0xfffecf4c,0x00187b42,0x001d506b,0x000afc99,0x00190233,0x001dc035,0x003031d8,0x001f91c8,0x001721a3,0x0008e54c,0x00056e30,0x00010793, -0xfffe4993,0xffffefa6,0x0004bd9b,0x0009f95e,0x0018ec4b,0x00139194,0x0001ba9b,0x00087626,0x0001113f,0xffeaa443,0xffeddcdc,0xfff1b1d3,0x000ca5d5,0xfffe8f61,0x000710b7,0x001b9bba,0x000c34ef,0x001a99d7,0x001ca4c5,0x004182b6,0x00488faf,0x0045902c,0x0015fdb1,0x00046055,0xfff4d71c, -0x0029a0c7,0x002e85b3,0x0003f516,0x002e1927,0x004e2c56,0x008255e7,0x005c8cfd,0x003970ab,0x00050b4a,0xffeb12a0,0xffd65d54,0xffcf545e,0xffd13940,0xffefae00,0x0016b2ea,0x002d14d7,0x002e7656,0x0004524d,0x0012e1c6,0xfffd8e55,0xffd1d729,0xffcfde03,0xffdcdc48,0x001f5cfa,0xfff27a98, -0xfffe66e9,0x0042c980,0x001ae305,0x0006afba,0xfffc5549,0x003f83e9,0x004e84c7,0x0054eb98,0x000af61c,0xfff713ea,0xffcd62c6,0x00577050,0x006e5cf9,0x0012745c,0x0057bfb6,0x006c08c3,0x00d5518a,0x0082e0c2,0x004f6370,0xfff71124,0xffdc7c4f,0xffc02d4e,0xffb2c3ae,0xffc25290,0xfff015b4, -0x002d0851,0x0056bbaf,0x004c6da9,0x0005c90c,0x0028d7fe,0xffef67b4,0xff92b66e,0xff894e21,0xff9de68d,0x001e85b4,0xffd17df1,0xfffc3f99,0x0074747c,0x0015ac97,0x00429e41,0x004354d9,0x00c27652,0x00e81eb7,0x00e80a13,0x0068e6de,0x001d9ae4,0xffbaf372,0x0065d5d9,0x0069a824,0xffe31493, -0x0064c9fe,0x00f3fc18,0x01ab5d8a,0x0132c95c,0x009e4c0f,0xffe498f1,0xff88513e,0xff447acb,0xff2bc60e,0xff560d3e,0xffbe0dc0,0x0025700d,0x00860efd,0x008ba036,0x004de1d1,0x0075658d,0x00481fd1,0xffe677bd,0x00127b9c,0x0014792a,0x0077a678,0xffe9e884,0xfff67dfe,0x00bd9762,0x0053d0eb, -0xfefdce2a,0xff3bcaac,0xfed847d2,0xfee724e6,0xff256952,0xff267e59,0xff77f666,0x008aca78,0x009f9baa,0x01092a28,0x01abf2b6,0x00963a2d,0xff8418d3,0xfefa086c,0xff074749,0xff9bfe51,0x006a0e84,0x00dc4669,0x012e06d8,0x01276cee,0x00e24e61,0x00b440a8,0x00901415,0xffe899ea,0xffe212e1, -0x001daa1d,0x007ece2f,0x009171d8,0x0002b4af,0xffdc4536,0xff75e709,0xff71a3e8,0x001f02ec,0x00648a11,0x004a94ec,0xff55e198,0x01232b78,0x0110ad0c,0x01096126,0x00573ee9,0xffadc2b5,0x0168b62c,0x01d29c0e,0x00d220e3,0x00373544,0xff7ae867,0xff0a3521,0x0031b8c8,0x00fdf855,0x01493a88, -0x00452dba,0xffc8b533,0xffd4025c,0xffc35613,0xffe4d1dd,0xffd621bd,0x001e111e,0x000b48f9,0xffbcb4cd,0xffd16ac4,0xffdd2fac,0x001f1bc8,0xff9f2d83,0xff747de4,0xffb1ee82,0x0030d3af,0x005bd30d,0xffee5b13,0xff1ce1ee,0xfe81c318,0xfe935430,0x003555e4,0xfe1fc1ee,0xfb1ac838,0xfd7ac3bc, -0xfefabdec,0xff309ada,0xfeeda6f2,0xfe946614,0xfddcddb4,0x01129dbc,0x01d931a8,0x0026f9f0,0x0011fc0c,0xffbbfc5d,0xffc2dc97,0xfff3c3a2,0x00350c6c,0x004653e9,0x005509d8,0x0039479e,0xffe368da,0xfffe42ae,0x0017f0c3,0x003d8a6f,0xffef5701,0xffc57272,0xffb3654c,0x00075c93,0x0037db95, -0x001c8bcc,0xffbad58a,0xff8ae267,0xff82c005,0x006445f6,0x0086efd5,0xff32bdb6,0xff723a76,0x01e1b412,0x02c21144,0x01fb8d02,0x00e83f31,0x005486ab,0xffff7469,0xfff3e3ea,0xffbc391b,0xff871dde,0xff642947,0xffa40b35,0x004639f0,0x009c5b8d,0x00c464b9,0x007df937,0x003b4335,0xffea9bc9, -0xffb842a9,0xff97b1d0,0xff7e5687,0xff7ee669,0xff8e62ef,0xffbd0d86,0xffeef978,0x000cd88c,0x000da597,0xfff4b3c7,0xffe4fe16,0xffde5e65,0x000e919d,0x001437e5,0x0025f72f,0x001cef5a,0x0038b7d9,0x008c7fae,0x010c7bae,0xff285a0c,0xfee83eca,0xfe83d652,0xfeb8c7f0,0xff46bc2b,0x0014499b, -0x008cdca0,0x00a53777,0x00fe9be8,0x012ae1b0,0x014034a4,0x011eb154,0x00fd1ec8,0x00ee423a,0x008aec70,0x004586f4,0x000b0fc8,0xffe70c98,0xffae51bc,0xff72e187,0xff64bd43,0xff55c819,0xff52f909,0xff789587,0xffb17721,0x0017e48c,0x00021a19,0x00044a36,0x001721c9,0x003e050e,0x004a3746, -0x005a1ecd,0x0017e379,0x00037ae0,0x00052ba6,0xffaeb0b3,0x00fabcfc,0x00f6e6f8,0x011cd8c4,0x0113a496,0x0101affc,0x00c7f5ec,0x00a3696b,0x00861788,0x0057fdd4,0x00289ac0,0x0009a2af,0xfff77cd5,0xffe5d191,0xffde694c,0xfffab5a9,0xffff3c2a,0xffe55408,0xffdb6115,0xffcc8f1a,0xffafbc72, -0xffb431a0,0xffb5e6fc,0xffba9cc0,0xff9d6863,0xff952afe,0xffa321de,0xfff643a3,0x004262e3,0x007e6197,0x00a8bbdc,0x00be4f38,0x00ba43f6,0x00d25f3d,0x00e7dea6,0x00ec7307,0x00f5c269,0xff6aa310,0xff6f3972,0xff9a233e,0xffc8d579,0x0007ef30,0x000ae67a,0x00013314,0xfff26d5f,0xffde9e5a, -0xffda5a45,0xffd5c069,0xffde4d7f,0xffe692c8,0xffee28ae,0xffde2620,0xffd2f8b0,0xffce349a,0xffb856be,0xffa4b22a,0xff9037c4,0xff84b8c4,0xff786cc8,0xff6e9d75,0xff74b1bd,0xff78ac8c,0xff714188,0xff816e2f,0xff92ccf5,0xff9904d0,0xffa72473,0xffacc24e,0xffbcca4a,0xff9be8ca,0xff7172b5, -0xff4f9168,0xff64e6ed,0xff7e13cc,0xff7ee272,0xff94ec2c,0xffa0bf56,0xffaadba6,0xffbc9a42,0xffd99858,0xfff94dff,0xfffcaaa7,0xfffc0676,0xfff866d6,0xfff51992,0xfff05c7c,0xfff0ee04,0xffe09eaa,0xffd25b04,0xffc365af,0xffb8af5b,0xffaf2763,0xffa5e719,0xffab9083,0xffa16832,0xff9939cd, -0xff905878,0xff88a5b7,0xff80479a,0xff752c49,0xff692cbb,0xff5dffea,0xff50f2d2,0xff422424,0xff36c367,0xff45b675,0xff58eda9,0xff64240a,0xff6ea1ac,0xff85a8d0,0xff81be12,0xff8cc7f4,0xff9781cc,0xffa33d47,0xffae6925,0xffb49650,0xffbda085,0xffb96ba7,0xffbadd69,0xffbcf447,0xffbe2f84, -0xffbeea40,0xffc08674,0xffba7a85,0xffb69521,0xffb1e0fd,0xffacde70,0xffa79ceb,0xff9f7999,0xffa0ab11,0xff9e1e21,0xff9ea41a,0xff98a026,0xff96c0c8,0xff94fb00,0xff8ed749,0xff88b656,0xff834522,0xff7df709,0xff7a8516,0xff6f8a33,0xff784e89,0xff7b7714,0xff827381,0xff831677,0xff96a1f7, -0x0019e2ad,0x000f5cfd,0x00119713,0x001d9b98,0x0022064d,0x0027e3dc,0x0018db1e,0x0014492c,0x000c04da,0x0022e800,0x0027424d,0x0017c805,0x0023f92c,0x00282687,0x00355850,0x002d9e77,0x00282a4c,0x001e8058,0x0014f91f,0x000ea6be,0x0009bebe,0x000c944a,0x00115416,0x001dc60c,0x00202d13, -0x001a16d5,0x000955be,0x000c821b,0x0003f185,0xffef7c8a,0xffefd06b,0xfff4fb62,0x001303c5,0x000493c5,0x000bff14,0x0027d27d,0x001106b1,0x000df6cd,0x001d2b07,0x00403429,0x005044f0,0x005cfd0e,0x0034c7a5,0x002523d2,0x000dd786,0x003a43bc,0x0039f12e,0x0010708c,0x002f40ee,0x004c3476, -0x0079aa47,0x00748fed,0x006043d3,0x0037ac15,0x0010150f,0xfff36d74,0xffe66dcd,0xffe8ee37,0x0007c15f,0x00379211,0x003a1bdd,0x00325bac,0x0008687f,0x000a9aca,0xfff1c542,0xffcc7ef2,0xffbde070,0xffcaa09f,0x0013a916,0xffe55693,0xfff703f0,0x004b985a,0x00108882,0xfff1d31f,0x0000115c, -0x0045f9e9,0x0064fd85,0x00801c00,0x0040dc42,0x0026c1b0,0xffeecf75,0x006134e7,0x00751d17,0x00303b7b,0x0061f7dc,0x0072d8f3,0x00c113cd,0x00a6f5cd,0x0086fdf5,0x0042aac0,0x000bf94a,0xffe5c0a0,0xffcb84df,0xffdc3c63,0x000aba31,0x0057e663,0x0053d0fb,0x0046fb86,0xfff8df48,0x0005594d, -0xffc4fcf4,0xff73b7e9,0xff5caf08,0xff74b1e0,0x000c80be,0xffbb3595,0xffe34213,0x007bedc8,0xfffc9253,0x0001aa61,0x003061f4,0x00a599db,0x00e4963f,0x0112ba36,0x00ace2b6,0x00723974,0x00058c43,0x007d82e2,0x007109be,0xfffd193b,0x0042fd31,0x00b9ae2a,0x01644c1c,0x0167f29a,0x010dd6d6, -0x00788978,0xfff17400,0xff9204a2,0xff5c4665,0xff80ff01,0xfff54980,0x009121a6,0x00a6f18f,0x008def5e,0x0041bfb0,0x00523280,0x000f5448,0xff6c7336,0xff85acb9,0xff985dbc,0x0022813f,0xff8ec71b,0xffbd297d,0x00d2d563,0x00197d25,0xff039ac1,0xff6e082a,0xff138a18,0xff3a4420,0xff81c857, -0xff5ee138,0xff70e58f,0xfff85355,0x0081f463,0x012bf378,0x01a79f2a,0x0167ffa4,0x006a07eb,0xff4bf586,0xff144212,0xff61c557,0x001c7470,0x0098815b,0x00fef4ae,0x0134ab3e,0x00fe7c81,0x009b2187,0x003662cf,0xff9de359,0xffae3148,0x005b1d1e,0x0020161d,0x001b08da,0xffef8dc1,0xfff2476d, -0xffd25db4,0xfffe771d,0x005e1ce5,0x005d29a1,0x0005a934,0xff39d23f,0x01a8ffec,0x00fff146,0x007961c4,0xffa8b0f9,0xfee09900,0x00e8953c,0x0190acec,0x00e83bb7,0x00651b75,0xff70bea3,0xfe8322ae,0xff7460a3,0x00613122,0x01553b52,0x009d000c,0x00298444,0x001aaf16,0xffdd8f80,0xfffc1da4, -0x00406270,0x005bb8ef,0x004203a4,0xffd24709,0xffeb22fd,0xffce6524,0xfff22eb4,0xff9f5ffb,0xffa81a8b,0xffd7e9a5,0x000bd0b8,0x0008a3d0,0xff97c18c,0xfec884e2,0xfe88f932,0xff24ec10,0x00f74d37,0xfccb34cc,0xfb497920,0xfed6fbfa,0x00576957,0xff83216d,0xff8d61da,0xff25ecc2,0xfe6656e4, -0x0024e65f,0x00f66788,0x0089629e,0x0009422a,0xff971604,0xff9a3db2,0xff9eb71e,0xffd7bcc3,0x00051e1c,0x00283b21,0x003af7ae,0x00292352,0x002b7600,0x002b4bef,0x001bb370,0xffdc3d6c,0xffc8f1ae,0xffa6c3a1,0x0013fd38,0x00355605,0x000ccf77,0xffc5b615,0xffbd8323,0x00074c4a,0x00220867, -0x001b38fc,0xff6ae3b4,0xfe25471c,0x026a0234,0x028e3258,0x01584aee,0x005c108a,0x00012a2e,0xffa2cb87,0xffa11ab1,0xffb22d3e,0xff91786e,0xff5ab802,0xff4ac2e6,0xfff169ae,0x00602ee5,0x0088c6ef,0x007ad455,0x004fcbbd,0x003e8ce3,0xfff23412,0xffc9bbe8,0xffb46b60,0xffb12005,0xffd4bc3d, -0x000685b6,0x000ef621,0x00105897,0x0019e3e8,0xffee7a43,0xffdec51f,0xfff0d0f7,0x000976e1,0x000a737f,0x00371871,0x006d40f8,0x006d113f,0x007f9da2,0x018cb0ea,0xff39abac,0xff53f780,0xff25294f,0xff3f841d,0xff75d35c,0xffdd12d9,0x0021ac64,0x0049bd3a,0x00a8c5c3,0x00f2efd8,0x0102694a, -0x00ff23c3,0x00e0135c,0x00cf9607,0x00770b93,0x002b3d78,0xffefd887,0xffaaa1e9,0xff720894,0xff4c7c1b,0xff482f32,0xff4e69fe,0xff4a85dc,0xff9c44c4,0xffc98be1,0xfff9e13b,0xffe8e0e1,0xffe2152f,0xffea35d9,0x00008da2,0x001e7fc5,0x00491019,0xffe7653c,0xffd88558,0xffdfe51e,0xff9226d6, -0x00d310bc,0x00c4830e,0x00ae1d3b,0x00ab79db,0x00bb08fb,0x00c3d99e,0x00d72fc1,0x00e62bed,0x00afb2bc,0x0077208f,0x0057fe40,0x0041c73d,0x00283043,0xfffff566,0x00061edb,0xfffb2b6b,0xffd30fcb,0xffd701af,0xffd9147f,0xffd74361,0xffd27796,0xffca1b64,0xffb763ed,0xffa87fc3,0xffb44dac, -0xffdcb73f,0x0034ed4e,0x007089ac,0x0081e7df,0x008d5b7f,0x00856c3e,0x0077839a,0x0087f291,0x009bbba5,0x00aea1b7,0x00b7400c,0xffce323c,0xffcb1915,0xffec2a07,0xfffc7fb2,0x000be914,0x000201c6,0xfff64886,0xfff24023,0xffeec0a3,0xfffaf10c,0x0008f322,0xffffe8c2,0xfff96ea2,0xfff607cb, -0xffdab390,0xffc124d5,0xffa974f1,0xffa68d08,0xff9fc7c5,0xff98a778,0xff8a86a9,0xff7fe2d7,0xff752933,0xff83e62b,0xff8a4e51,0xff8e0a98,0xffa1b33f,0xffc9ebee,0xffddb814,0x000b7160,0x0025100c,0x004e3377,0x002dba29,0x000957aa,0xffeb1f39,0xffe73ae0,0xff587f53,0xff615cdd,0xff6a8193, -0xff70719d,0xff7be7cf,0xff8c6dc4,0xff9e5a39,0xffaa3da9,0xffabfe2d,0xffa8acf3,0xffa75629,0xffab9e42,0xffb152c3,0xffbb488e,0xffb2b332,0xffae3e35,0xffa69f0a,0xffa03152,0xff999b6d,0xff93a155,0xff952c83,0xff9344a9,0xff8ee0fe,0xff8b94de,0xff86a8da,0xff842ede,0xff7c2eb5,0xff708735, -0xff60a161,0xff54f980,0xff478d5d,0xff38b7a2,0xff421f02,0xff4980c1,0xff4d623f,0xff5b2552,0xff899e68,0xff8b0911,0xff906c5d,0xff96c093,0xff9a672f,0xff9c1ccb,0xff9d1310,0xffa0d87f,0xffa44723,0xffa9f35a,0xffae70e6,0xffb1e4c7,0xffb37321,0xffb63108,0xffb09e58,0xffacd65c,0xffa90731, -0xffa3eac8,0xff9ebc8a,0xff97db7b,0xff996976,0xff993b97,0xff99eeed,0xff9964e0,0xff9922b9,0xff988106,0xff928ec0,0xff8e043c,0xff8c50e6,0xff87b2a8,0xff8560d5,0xff7e8c99,0xff88cf17,0xff8be430,0xff860af8,0xff873ba4,0xff9c7dc6,0x001f5976,0x0016a1f4,0x0018b4db,0x00230967,0x0028eb46, -0x0033366e,0x00249075,0x001f2950,0x0015d1df,0x0023d3a0,0x0027aa1b,0x0022f04f,0x00285c15,0x002afdd9,0x00312c59,0x00332311,0x0030ec47,0x002bfcbc,0x001d8528,0x001619fa,0x000f6fdf,0x0015ba22,0x0019cae4,0x00258b99,0x00216a8e,0x001be970,0x000c9af9,0x000d2df6,0x000627d1,0xfffa809a, -0xfff58320,0xfffabc04,0x0015e225,0x000aac44,0x000fd66e,0x002a98e5,0x00169efc,0x000de6ee,0x001eb368,0x003aae4b,0x004fd4c0,0x006a5936,0x004af7b1,0x003b3803,0x001ff19f,0x0037d745,0x0036e626,0x002530a8,0x003120e9,0x004749fa,0x006378c5,0x007c8d78,0x0076c963,0x005c2250,0x002c0943, -0x000c69da,0xfffcb97f,0x0005c622,0x001d83e3,0x003ed41f,0x003c1c75,0x002e3525,0x00028e49,0xfffdb4fe,0xffe7909a,0xffd52bc3,0xffb9f17e,0xffc23e67,0x0002012f,0xffe09aad,0xfff466cc,0x003d08dc,0x000d51f1,0xfff7ad40,0x000c3d0c,0x004a8d37,0x0071fbd6,0x009ff71c,0x006a504e,0x004a92b3, -0x000f7937,0x004a3927,0x005d7f98,0x0055fa01,0x00651464,0x007266ee,0x0093cba3,0x00b020c3,0x00a3fdbc,0x0078ef14,0x002a1faa,0xfffe9057,0xffdf1da0,0xfff7563b,0x001dafd5,0x0050d1a8,0x0041881c,0x00351763,0xffddf5d9,0xffde07ae,0xffa39521,0xff7fc8f4,0xff4a3558,0xff63b17b,0xfff3d303, -0xffb87d87,0xffd9f239,0x005f97b7,0xfff81010,0xffe80b77,0x002456ac,0x007e8fea,0x00d06d3d,0x012a8bd4,0x00dfe8fd,0x00ab95b0,0x00424c24,0x00686d20,0x005d70b0,0x003cd58b,0x00403840,0x00968d6d,0x0106c9b4,0x016d3f28,0x01508fe6,0x00f11b57,0x004edf37,0xffe50e27,0xffaa5599,0xffd40282, -0x002f5c34,0x00b0cfd3,0x00a11a2d,0x0075d2fc,0x002899ed,0x000e35b7,0xffc614f8,0xff4f2fde,0xff1eaee6,0xff3724bd,0xffd3e892,0xff543da9,0xff97a73e,0x00a00042,0xfff387b8,0xff650644,0xffbf0e6a,0xffad65b4,0xffc420d7,0xffa37f84,0xff8a8eaf,0xff6f7ee0,0xff69445f,0x003f5e42,0x00ff0ef9, -0x0143a7da,0x01ca9f76,0x01047c66,0xff6bb9e5,0xff38dd66,0xff365551,0xff964001,0x0005fc3f,0x0051eee2,0x009276f4,0x007c6eaa,0x00159eae,0xffbb5d1b,0xff56cf88,0xff8719f5,0x007b18d3,0xffe70e9e,0xffc5948c,0xffccbb2e,0xffe53dda,0x001dc676,0x0097df3d,0x00a69af5,0x00710672,0xfff089c1, -0xff78d3ce,0x01af5d78,0x009c8174,0xfff170ce,0xff40ccc2,0xfe7bdfba,0x0021f44b,0x00dfe790,0x00c8c3ac,0x0086a26a,0xff8b0a6e,0xfe4eb5ba,0xfeef0b76,0xffc3762d,0x00d10e83,0x00e20d12,0x00a8f206,0x0064ffe7,0x0016426b,0x0020a66b,0x008d3200,0x007538e0,0x0061d934,0x00049a3f,0x001dcfe4, -0xffe0e316,0xffc1b5f3,0xffafc4c6,0xffdaf2c0,0xffeb5bac,0x000337d0,0xffcb81f9,0xff402cdc,0xfe826af6,0xfe9cd166,0xffb607e7,0x0144af3e,0xfc2655d8,0xfc2c5154,0xff68dbbb,0x00a734fb,0x00219756,0x0045e185,0xffb8d3b5,0xfedff87a,0xff164c0e,0x00026aa2,0x01398bbe,0x002c3485,0xff8aa596, -0xff7bb5a1,0xff5fad7a,0xff7d9b2d,0xffb21876,0xfff5bb07,0x002924d4,0x0044c1fb,0x00405f86,0x002206c3,0xffe3c3de,0xffc06747,0xffc87511,0xffae501e,0x000abf7a,0x0019735e,0x0003c5d8,0xffe154b0,0xffe5fda2,0x003afbc6,0xffa0cd3f,0xffa167f6,0x001410c0,0xfd5152f8,0x022dba64,0x011def40, -0x00510fb3,0x000330e2,0x005cd588,0xffb5ffec,0xff97bfea,0xffcfecb4,0xffca8db4,0xff99f91b,0xff6a36bf,0xffcfc7e7,0x002d849c,0x00416486,0x0062e055,0x00646894,0x007abd6c,0x00283e51,0xfffdb744,0xffee833f,0xfff3f3ca,0x001bcc0d,0x00451de5,0x002b77a3,0x000d62a7,0x0001c518,0xfff02a6a, -0xffe5a7bf,0xfffcb102,0xfffea26e,0x0008fa49,0x00663fef,0x0099f6c3,0x008e3f2f,0x00d500d8,0x01d86896,0xff6fd530,0xffcec685,0xfff04b12,0xffdcbbda,0xffb91ae7,0xffd1be5c,0xfff3935a,0x0022ed3d,0x0063e135,0x00b7494f,0x00d851dd,0x00dd038b,0x00bc6eec,0x009a4cfa,0x005ffd2a,0x001568dc, -0xffce193f,0xff83a34c,0xff5bf39f,0xff536790,0xff4683af,0xff57bafc,0xff5e49d8,0xffc034df,0xffe58e27,0xffe0fcfd,0xffdd55ee,0xffd07564,0xffc35652,0xffd49a70,0xfffcf5c0,0x00305107,0xffe46190,0xffd3fe90,0xffafa6a5,0xff7e2dec,0x00573fc4,0x0034ae9f,0x0004e65a,0x00286d94,0x006ca6d6, -0x00b7a78f,0x00f78e12,0x012ad5ec,0x0104ec58,0x00db282d,0x00c4c1e1,0x00ad2850,0x0090ec20,0x0055e47a,0x003be4a7,0x00183ec5,0xffe224ad,0xffe92fc7,0xffe16ed6,0xffdb4bb5,0xffca3f7e,0xffbf6fe9,0xffafe158,0xffbeb46f,0xffde29ad,0x00122f88,0x0052a1a6,0x006dc665,0x00580512,0x004ee54c, -0x00392435,0x002a63c6,0x00347c42,0x003d3e59,0x004ed816,0x004acc85,0x0050b945,0x00549051,0x0069e709,0x005b3850,0x00412ae1,0x002a55e2,0x00206f84,0x0024de75,0x002b8ce9,0x003b7a81,0x004bd225,0x00280e2b,0x00088feb,0xffeee4a8,0xffd7184b,0xffbf0136,0xffa510ce,0xffaa5fa1,0xffab6231, -0xffabab8c,0xffa1eef0,0xff9af4e6,0xff9110a9,0xffaa4ea9,0xffb5639f,0xffc454cc,0xffe06595,0x001a6b84,0x003f55c8,0x0070b4c6,0x008f7086,0x00bc7e7c,0x00a2ec82,0x008f0c0b,0x007b7fd1,0x006cd46a,0xff76c6ad,0xff84af49,0xff7f5773,0xff80890d,0xff8a9e52,0xff92c16e,0xff93b825,0xff8baf54, -0xff8bc99f,0xff87fe8b,0xff8b0b85,0xff93d700,0xffa117c3,0xffae1bd4,0xffab0a65,0xffaa05a6,0xffa6b314,0xffa1bbfb,0xff9bee94,0xff960451,0xff920768,0xff943fc0,0xff90363f,0xff8d5201,0xff87bf23,0xff82b749,0xff876189,0xff8595c6,0xff7f15fc,0xff805725,0xff81c8b0,0xff7e6b77,0xff838977, -0xff811da6,0xff7ef0a1,0xff8b8cac,0xff9f4aa8,0xffa6db9a,0xffa5622e,0xffa5d7f8,0xffa1e2a7,0xff9dc971,0xff9ca46e,0xff9cc1c3,0xffa29531,0xffa7813e,0xffaa2ba5,0xffad6396,0xffae5acf,0xffb141c1,0xffad0859,0xffaa6cf9,0xffa7ff33,0xffa47c57,0xffa10e6b,0xff9d7a0d,0xff9baf1a,0xff9aabc6, -0xff9a0687,0xff9ac072,0xff99378c,0xff971e37,0xff9788b5,0xff97a191,0xff9b7afe,0xff9bfc87,0xff9d8aeb,0xffa01266,0xffa73d1b,0xffa9e6e5,0xff99d2f7,0xff9c50ee,0xff9eb0dc,0x001aa2b7,0x00179be8,0x0018db8e,0x001f24d8,0x0024a931,0x0031a5b7,0x002597de,0x001fbacf,0x0013137e,0x00194338, -0x001d09ef,0x00258cc2,0x0023277b,0x002417ec,0x0023cdaf,0x002cd00e,0x002cc7b0,0x0029bffb,0x001b80c5,0x0014bbb8,0x000e382f,0x00157d4d,0x0018790c,0x001f959b,0x0019d04b,0x0015f834,0x0006fb2e,0x0008922b,0x0002ebaa,0xfffc9634,0xfff75fe6,0xfffc41f1,0x000ca321,0x000b32e6,0x000e88e1, -0x001fbf3b,0x00166497,0x000eaf8f,0x001a0375,0x0029b6d4,0x0040901a,0x00647d54,0x0051d1fd,0x00400ec0,0x001bb72b,0x00240ace,0x002726d0,0x0036b475,0x002f5c51,0x003ce1f1,0x00466837,0x00713d10,0x0075ad7e,0x0063d4ed,0x003996fc,0x001e741f,0x000f2e45,0x001a6a2b,0x00265d27,0x002e4e88, -0x00317227,0x00216560,0xffef3900,0xffefe23e,0xffe20821,0xffd878fa,0xffc07834,0xffc1a7d6,0xffe26380,0xffe0ead9,0xfff2e6a2,0x0015298c,0x0006ec30,0x000746ec,0x001d12a5,0x0040c0ed,0x0068ec24,0x00a28dbd,0x007e98cb,0x005d060f,0x001265e3,0x001f6a2c,0x0032e768,0x00714886,0x005e9cc1, -0x00681743,0x00616b68,0x009dfe65,0x009f3c3e,0x0082d414,0x0035db0f,0x000ead76,0xfff2070f,0x00085bf6,0x0021ca22,0x00272400,0x0027c737,0x00201899,0xffb71a32,0xffc3ca67,0xff8d9619,0xff82f2b3,0xff4afa3d,0xff68abcc,0xffc459f4,0xffc687d5,0xffe183ce,0x0026d04f,0xfffe364f,0xffe17994, -0x0016dfd7,0x00404470,0x009caef1,0x01191a16,0x00f30ed1,0x00baedb4,0x00423f39,0x0034e9eb,0x003d1e99,0x0083ee57,0x0054bdd4,0x00858f1c,0x00b4b595,0x0147b32c,0x01588eae,0x0121d37e,0x00906e3b,0x0037a951,0x0005e1ec,0x00299234,0x0055bbcf,0x0087862a,0x007f9373,0x005427ba,0xffed2f42, -0xffc4e2e3,0xff8c04b2,0xff640fa7,0xfee89ae0,0xfefc456e,0xff7be7a8,0xff4761ee,0xff92ceb0,0x002de535,0xffd82bb5,0x0015503d,0x00380d01,0x007df05d,0x00618bae,0xffb20681,0xffc8a656,0xff9eaead,0xff3a821f,0xfffb6798,0x008ba184,0x00a6a272,0x017d45cc,0x0108d5c8,0xff738aa6,0xff465ae0, -0xff0aaf1e,0xff0397cd,0xff63935d,0xff8319f2,0xff969a5a,0xffac27bb,0xff7870a7,0xff5066ae,0xff3d0fc8,0xff847fc5,0x007e4230,0xffd77703,0xffb7e09e,0xffd24b13,0xffebc84f,0x005eabbf,0x010cbf52,0x00ecab6b,0x009f9043,0x00198fbb,0x000e149c,0x0129b882,0x0020cd45,0xff952c94,0xff1f097c, -0xfe8dd902,0xff5e9d74,0x0017fa75,0x00914b82,0x00a665c1,0xffe139b7,0xfe90e8de,0xfead74c4,0xff3d188a,0x001adce0,0x00e63ed1,0x010b02ce,0x00a5d85b,0x006d956e,0x0064659f,0x00bf36cd,0x007666ad,0x005f7e32,0x0031eac5,0x00422f65,0xfffa027f,0xffa46b5a,0xffc2d32d,0xfffa1470,0xfff95175, -0x0008f97a,0xffb27fbb,0xff0ae188,0xfe4b6966,0xfeb708ae,0x002ce27f,0x0112ad0e,0xfccda5c4,0xfd890d78,0xff4048d6,0x002d2c00,0x010b6052,0x00c5d675,0x00009fff,0xff27697a,0xfe7155ee,0xff4acc45,0x0172d972,0x006390f5,0xffbd1502,0xff6ecb38,0xff4b136c,0xff490c7b,0xff6ae2b4,0xffc0465d, -0xffec5fc9,0xfffcba92,0x0016946e,0xfff4c40e,0xffb476ee,0xffa2ec34,0xffbed614,0xffca0ef1,0x0002d6f4,0x0008b025,0xfffd6f3a,0xfff8ae8d,0xffefbae5,0x00063207,0xff70b287,0xff8615bf,0x0032cd5c,0xfd8f76f4,0x01493524,0xffc5ec80,0xffedc341,0x00358b8e,0x00e56891,0x0064671b,0x001ce31b, -0xffdaacd4,0xffee5c9d,0xffcc03f7,0xffb952fe,0xffc696f8,0xfffe4512,0xfffb5595,0x004b3a7b,0x007c26d5,0x008e85e4,0x0059da9c,0x003a521b,0x0021996d,0x002fbc8e,0x0049bfeb,0x006335c6,0x003942c1,0x0006b563,0xffe38ba4,0xffee7f2f,0xfff6d432,0x000b739c,0x0005af27,0x0016c0c1,0x0070d97f, -0x0062f98c,0x00635fc1,0x0115287a,0x01950bc6,0xffc60340,0x0030e5ea,0x007163f0,0x0036ea65,0xffc88f14,0xffb5b7f1,0xffc6512e,0xffe929b5,0x001a0504,0x00641d0d,0x009dae59,0x00a7a5b6,0x0097d648,0x00754e9f,0x004a93ec,0x0005d1f2,0xffb8d9e0,0xff8599d5,0xff6db352,0xff6b3d83,0xff5d71f1, -0xff795413,0xff9b2f53,0xffe3c35c,0xffff16f8,0xffe43a99,0xffdf52fb,0xffd1fd12,0xffcb31ca,0xffd7277d,0xffefc45c,0x000650d0,0xfffb987c,0xffe6d9f2,0xffa63347,0xff92f226,0xffca7a81,0xff9bc929,0xff6fa22d,0xffad23bc,0x000ffd96,0x007ee54e,0x00c80287,0x00fe18f0,0x010ae474,0x010fd864, -0x0117dad8,0x01007a98,0x00e009eb,0x009f12e9,0x007cbf49,0x004a3c30,0x00070e1b,0xfffba230,0xffdaf630,0xffbef299,0xffae5445,0xffae0d5b,0xffb67db5,0xffdfc05b,0x0005d304,0x0033c274,0x0047a40f,0x00411a9e,0x0019b961,0x0013a4ee,0x0008bde2,0xfffd1a52,0x000231b5,0xfffe272e,0x00016fd7, -0xffe33c45,0x00af5a9c,0x00b71dd2,0x00bfed4b,0x00ab85cd,0x008bb1cb,0x006e5a70,0x0064fda0,0x0067d191,0x0065696b,0x0063f46b,0x0064189d,0x003300c8,0x0007e8b4,0xffdd7a38,0xffd02656,0xffc09fb3,0xffaf004e,0xffb63fd0,0xffbc1c3b,0xffbfd06a,0xffbd3cc0,0xffb9fe65,0xffb1739a,0xffda143b, -0xfff2e18c,0x0014d9f7,0x002e8eb7,0x0063b5f4,0x0087e8ec,0x00a15516,0x00b0ef32,0x00ca5f98,0x00c24eab,0x00c38270,0x00c046a0,0x00b66c3a,0xffba955b,0xffcc05cf,0xffc3d468,0xffc288d6,0xffc8a066,0xffc83ebe,0xffc00a07,0xffb31ac7,0xffad1360,0xffa79290,0xffa89920,0xffab3990,0xffb2a99a, -0xffb82831,0xffb7d720,0xffb657c1,0xffb454aa,0xffaf2ced,0xffa893e3,0xffa1eedb,0xff9ac730,0xff9d2ca3,0xff98709c,0xff929b34,0xff8971e6,0xff81344f,0xff907bc3,0xff993cea,0xffa05cb3,0xffb060fb,0xffc12283,0xffcecd71,0xffcfa0b2,0xffcb7bf0,0xffc95245,0xffd2588d,0xffc2d24c,0xffcf23af, -0xffc8b05b,0xffc59154,0xffbf4cda,0xffbb75a8,0xffba854d,0xffb9c523,0xffba4300,0xffb95dea,0xffb69623,0xffb61efe,0xffb44744,0xffb3607b,0xffb1d8cb,0xffb0cb95,0xffafde34,0xffae9d28,0xffad8bdb,0xffad4491,0xffa99b28,0xffa6a79f,0xffa29639,0xffa6c9bf,0xffa32896,0xff9a311b,0xffa29b9d, -0xffa894fa,0xffb10ad0,0xffb72bff,0xffbce234,0xffc720a4,0xffc9246d,0xffccd2df,0xffbad8ca,0xffbf3514,0xffa9c3e1,0x0013fbe8,0x0014aa6b,0x00177c46,0x0018c4c8,0x001cfc16,0x00299cd5,0x00228647,0x001ccf2b,0x000b8511,0x000f0ed8,0x00132a66,0x00259876,0x001d1331,0x001ce7db,0x0018bd03, -0x00249a00,0x00255363,0x0021ba38,0x00176dc5,0x00123d4b,0x000dc51f,0x00117bd7,0x0012463d,0x00135bfd,0x000fff42,0x000d2609,0xfffd3a6f,0x00014bb3,0xfffbf5bf,0xfff3c283,0xfff5da0d,0xfffac329,0xfffca8a1,0x0009a9ee,0x000d258b,0x000fdbb1,0x001271d4,0x0009c222,0x0014cf1b,0x0017f53c, -0x002da106,0x00525f33,0x004eeacb,0x003be164,0x000c5747,0x00115797,0x001ae4e3,0x004501b5,0x002caa70,0x00310d80,0x002fc9a4,0x005f864d,0x006998d5,0x005afcb5,0x003fe0ca,0x002c1303,0x001fb451,0x00227e9a,0x0022a794,0x0018cdb6,0x001e76e4,0x000f39c8,0xffdcde41,0xffecb2d4,0xffe82d90, -0xffd5ceb6,0xffd4b372,0xffcf8bcc,0xffc57abe,0xffe71fbd,0xfff498d5,0xffee1daf,0xfffda9f5,0x000f7167,0x002dbbaf,0x003186d7,0x0054286a,0x008b1282,0x00821e43,0x00633ba7,0x000360c1,0x00023d80,0x00155283,0x00843339,0x0055c75f,0x005a6046,0x00420525,0x0086d922,0x008e1796,0x00728a93, -0x003ba2f5,0x001df09c,0x0009d752,0x000f821f,0x00178696,0xfffcfdcd,0x0009807f,0x00095b07,0xff971966,0xffb7163a,0xff8798ec,0xff6863f5,0xff5b5878,0xff7d75ea,0xff8f4549,0xffdc84d1,0xfff287ea,0xfff16cf8,0x0002415a,0xffd7a6ae,0x000aa5b5,0x00077a91,0x005f0ea4,0x00dfdba3,0x00e96b70, -0x00ad11cb,0x001a84f0,0x0009df6b,0x002e64cc,0x00c079e0,0x0066a2dc,0x006d93ea,0x007ac668,0x01132c2e,0x013ee576,0x01182472,0x00b7dbe1,0x0078ee8c,0x0052f8d0,0x005c5c64,0x005d656c,0x003c3252,0x004a23c7,0x002d0340,0xffa4ca1a,0xffa01089,0xff7dd469,0xff743fc9,0xfef916cc,0xff02fcfa, -0xff29dc87,0xff650d7d,0xffa869eb,0xffb5e8a6,0xffc06eb3,0x00b3a3f9,0x00b8fa13,0x0121c76a,0x00da5220,0xffdf2b6f,0x000cf39f,0xffe9d2f0,0xff819b0b,0xffd9f51d,0x0014b18e,0x001c8f87,0x00e88d9c,0x00c9735a,0xffab9319,0xff5963f9,0xfef87f98,0xfea40348,0xfeecacaa,0xfef6dc02,0xfeee5554, -0xff0d1f2d,0xff12157a,0xff13d6b4,0xff626bd7,0xffb24ef4,0x006416d0,0xffeb83e3,0xffe594a2,0x000728b4,0x001a6de6,0x0092d4be,0x01269b26,0x010e608c,0x00ccbf23,0x00673e0e,0x0099de95,0x006e3e56,0xffc1ce4c,0xff7142ad,0xff2ecc77,0xfed9741e,0xfeec98c2,0xff89ad5d,0x005d3b16,0x00b68dd0, -0x004aa5f5,0xff16bdf5,0xfeac4624,0xfeec0104,0xff9c6e6d,0x009af6c9,0x010ed6c6,0x00d20b36,0x00c682f6,0x00acd35f,0x00c7286e,0x006708fc,0x0045c1cd,0x0040eb60,0x0044feff,0x00051106,0xffa71810,0xffd3ba22,0x0005a480,0xfff719d2,0xfff9d329,0xffa2406e,0xff180b50,0xfe6c08c4,0xfef57b1e, -0x0079fc0f,0x009c4dd4,0xfe250114,0xfed79900,0xfee9c2ce,0xffa95c08,0x01ae0430,0x01022664,0x0058142c,0xffcb13ea,0xfe81b644,0xfef2aeea,0x010c3ada,0x00a0258d,0x0029e047,0xff76e326,0xff63ddba,0xff4c4766,0xff4da281,0xff97c7ea,0xffaf95a7,0xffa1d8cc,0xffd65fcf,0xffc92144,0xffa0cfe4, -0xff98915a,0xffc253dc,0xffed4d4d,0x000c6b97,0x0003b26b,0xfffcc828,0x000b2036,0xfffc223b,0xffb84edf,0xffc046a8,0xffc624ac,0xff922505,0xfe629d5e,0x003287f5,0xffcc5759,0x0081b849,0x00c2f85f,0x00f15ca1,0x011b2016,0x00d9eb95,0x0020b15e,0x0007c4a8,0xffd801d2,0xffeccd94,0xffc04a67, -0xffdfc8bd,0xffdd0a55,0x003cdb92,0x0075a7e1,0x007971ab,0x0076664b,0x006cf2e8,0x004ee6a6,0x00558a90,0x005c3e63,0x00683a01,0x0035f7ea,0x00022f23,0xffdeb8d0,0xfff210b2,0x0003982c,0x000532a1,0xffff01fc,0x0013f8e0,0x00388b15,0x00019ea9,0x000a7dd0,0x00aeb06c,0x008c571f,0x00207414, -0x005d3528,0x0090dafe,0x005fb9b1,0xffd6795e,0xff9d0180,0xff8bf7f1,0xff9ed88c,0xffc4f77d,0xfffccfe4,0x004497ab,0x0053b036,0x005c929c,0x0057495d,0x0032feed,0x00000c43,0xffc575c8,0xffa9cf81,0xff99ecef,0xff8e7288,0xff90be6f,0xffb6b775,0xffe81fd9,0x000461a6,0x000eee10,0xfff2c3e7, -0xffe87fb7,0xffe93de4,0xfff521ce,0xfff39d78,0xfff40c05,0xffe3339f,0x00067226,0x00010dad,0xffe3bbb2,0xffe0cd72,0xff7272a7,0xff44beae,0xff40bbb7,0xff7029f2,0xffb8be4f,0x00064b34,0x003d69ca,0x0072e703,0x00ba60d8,0x00f12516,0x0118d2d4,0x010d055a,0x00f11d84,0x00b941cf,0x0095422e, -0x005fe86a,0x001c3b30,0xfff44813,0xffc81c0f,0xffa5c9d5,0xff9c04b8,0xffabde52,0xffcd0b3d,0x00008f50,0x001f8b43,0x003873b0,0x0021707d,0x0006a70c,0xffebf90d,0xffee95c7,0xfff37d5f,0xffeb8277,0xffe8f858,0xffd6fbcc,0xffc6102b,0xff9ea803,0x00aadb2c,0x00a97559,0x00a2b788,0x009c80e1, -0x00912b02,0x0086eed7,0x00881733,0x008d3f0b,0x007b8757,0x0066ea49,0x0056fb5d,0x0027b963,0xffff601b,0xffd338e3,0xffcf2ff0,0xffc6f250,0xffbe77a6,0xffc8c057,0xffd248f3,0xffd7afc6,0xffd94818,0xffd7b62a,0xffd08d04,0xffffae2a,0x0024ab6f,0x0058fce4,0x00689bf0,0x00893635,0x009e3d4b, -0x0095ffde,0x008bceba,0x0086ab82,0x008e3242,0x009d6c28,0x00a3e64f,0x009febee,0x001782f6,0x00307e41,0x0027e631,0x00209511,0x001a7e34,0x000fa463,0x000145fa,0xfff585ff,0xffe69e2e,0xffdca4f3,0xffd5d5e4,0xffcce63b,0xffc704e5,0xffbe4b9a,0xffbf6212,0xffbd8aff,0xffbb8ab7,0xffb5d38a, -0xffaf0773,0xffa89edc,0xffa696df,0xffae2cc7,0xffafbe55,0xffaec545,0xffa8179e,0xffa62b26,0xffb5603a,0xffc1e68e,0xffcf34df,0xffe5cd0c,0xfffe5530,0x000ea950,0x00138b38,0x0012139f,0x00168068,0x00229789,0xffea6542,0xfff72076,0xffec5055,0xffe791f1,0xffe22d06,0xffdf22b3,0xffdce306, -0xffda35ba,0xffd4c98a,0xffce5915,0xffc6b43e,0xffc1fd54,0xffbd1b1c,0xffb7479b,0xffb85211,0xffb808e5,0xffb84e7a,0xffb8c3d2,0xffb98f89,0xffba6b44,0xffba226e,0xffb940f4,0xffb566d5,0xffbe9683,0xffbd4d60,0xffb1c37a,0xffbbbab8,0xffc3b53f,0xffcc19a4,0xffd31fde,0xffd92a2a,0xffe55f7c, -0xffe99d06,0xffefad0a,0xffe13d60,0xffe77a73,0xffb794a7,0x000b96d1,0x000d7dc0,0x0012ef8a,0x0010735a,0x001321ce,0x001c1e61,0x001aa800,0x00157a35,0x0001d32c,0x00050576,0x00097117,0x0021d2d5,0x00141e49,0x001376f3,0x000eebf7,0x001a85a3,0x001bb377,0x0018b0b1,0x001188e1,0x000db3ff, -0x000b3a1c,0x000a4125,0x00098f2a,0x0009bdd7,0x00047ed5,0x0001f1cc,0xfff4b7ee,0xfffa67af,0xfff52e79,0xffe8617d,0xfff3ad46,0xfff800ae,0xffed73e9,0x0005588b,0x0009a744,0x00039c67,0x000b1166,0xffff2ab6,0x000eed6c,0x0009362d,0x001a36c2,0x0036adf8,0x0041171e,0x00308156,0xfffd18b9, -0x000113fc,0x000edd5b,0x004904de,0x001ef6fa,0x001a8bcb,0x001993a2,0x0045fc44,0x00547c78,0x004c60e6,0x003d8723,0x002f9adb,0x0026a33b,0x001dc9ed,0x0014eb96,0x000970b3,0x0004ead3,0xfff9968d,0xffd5d68b,0xffefc83a,0xfff2aa7b,0xffd443f4,0xffeb51d3,0xffe46f4d,0xffba9808,0xffefd700, -0xfff712db,0xffd94545,0xfff2b041,0x000b0fa1,0x0034f35d,0x0022a56e,0x003d073d,0x00618424,0x0072ba24,0x0059303e,0xfff170cf,0xffee579a,0xffffb629,0x0089085e,0x003f1a0b,0x003f6e3d,0x0029b664,0x006b956c,0x00765dae,0x00602f7f,0x003d24cd,0x00264931,0x001c5a72,0x000bd208,0x00033af2, -0xffea6581,0xffe82cde,0xffebbd2b,0xff891f93,0xffb24028,0xff8eb60b,0xff43de55,0xff76cf30,0xff94a437,0xff66c149,0xffed9254,0x0000e38a,0xffd40a53,0xfffd7ece,0xffc9434b,0x0003124f,0xffe750e8,0x0027f9e7,0x008c2be4,0x00c2ae9f,0x0091ac56,0xfff6db4a,0xffe7b909,0x00211b17,0x00dd10b7, -0x0053d7c5,0x002de70e,0x0039e49a,0x00ca46d2,0x010aeeda,0x00f708a7,0x00c3b462,0x0097c14f,0x007f14d4,0x005fd4ad,0x004523a5,0xfffe0afa,0x000430c3,0xfff947a8,0xff836e2b,0xffada8af,0xffa4f8fd,0xff95ec6d,0xff488889,0xff4c2f1c,0xff0ffe5e,0xff94eff7,0xffc46cc6,0xff6c8d86,0xfface003, -0x00fc6de0,0x010bbd1c,0x0166fea0,0x011d09de,0x0042d71a,0x00344adc,0x00095e3e,0xffe7d134,0xffd0f2d0,0xffc3d0c0,0xffbf2809,0x0064e28a,0x0098817f,0x003635be,0xff919a7b,0xff0f1ff8,0xfe9d8246,0xfeb8927a,0xfebd9cfc,0xfec0428e,0xfed21708,0xfef7ca92,0xff0e789b,0xffbcdbfa,0x000084ba, -0x003651b3,0x000cc157,0x00130d20,0x00299666,0x0038d261,0x008f50ce,0x00d839b9,0x00f01291,0x00e261e7,0x00ade580,0x00df72c3,0xffdb4e33,0xffa18e70,0xff7c94e3,0xff4a2049,0xff16a3a8,0xfec7cffc,0xff4cb037,0x0048f4cd,0x00a96d4e,0x008cc7b0,0xffa2ca27,0xfecbaafa,0xfebb6a90,0xff56b59b, -0x001e15cb,0x00b3b1f3,0x00d265f6,0x00ea3512,0x00c8f687,0x00a2bd0c,0x0043b4e7,0x0021d36d,0x00325ecf,0x002c9cbe,0xfffc1189,0xffbefab2,0xffef2160,0xfffb26b9,0xffead09c,0xffeba504,0xffbd2c9b,0xff5ab670,0xfee206b6,0xff525602,0x008b5463,0x0026822e,0xff1ddf1f,0xffd350ab,0xfef09c14, -0xff97a969,0x01ed58ca,0x0111d3f4,0x0093d853,0x0056f821,0xfeccaf82,0xfed1c05e,0x005d9e37,0x00ce5802,0x00a9b70f,0xffacc730,0xff993b94,0xff72f844,0xff608e47,0xff84770b,0xff930b3c,0xff838ebd,0xffba0199,0xffbd0225,0xffa3a872,0xffaf2dd8,0xffdc42e8,0x000bc04d,0x000c5db6,0x0002648d, -0x000ae665,0x000a9bc2,0x0022314f,0xffbd3563,0x001c3e51,0x000aec5c,0xfef0f4d6,0xff0aad39,0xff6366b8,0x00ff081b,0x00fb53a1,0x00a72850,0x0023baa3,0x00f6f61f,0x012c6b20,0x00c8b699,0x0037a90a,0xffd83963,0xffef364e,0xffb33e4c,0xffc8f1d3,0xffddcba0,0x001cd485,0x003cd93b,0x004ad880, -0x00701d66,0x0080755e,0x006f6853,0x006866f8,0x006150eb,0x005ff817,0x00235311,0xffff7c2c,0xffef1dee,0xfffb444b,0xfffce183,0xfffa1b20,0xfff1fd8a,0x00016a2f,0xfffcd615,0xffe33a12,0xffc57c8a,0xffa61b62,0xff253133,0x007f17d8,0x00696ff8,0x007d4634,0x0078fa26,0xfffda5a6,0xffb038ea, -0xff660c17,0xff585d65,0xff71e3c9,0xff9c8648,0xffe090ef,0xfffc2adc,0x001775a5,0x00311828,0x001a8514,0x000687b1,0xfff0de69,0xffdab301,0xffce99db,0xffc5859f,0xffd97696,0x0000fc43,0x0029a9a6,0x001e9599,0x0014e855,0xfffdbba4,0xfffc1840,0x00052724,0x000c180c,0x0009981a,0x0003c5ce, -0xffe0b724,0xfffa31fb,0x0012b855,0x0046b380,0x0068676c,0xff61eb3f,0xff550bac,0xff7ac250,0xff79f980,0xff7f84a2,0xff92d35e,0xffb71a24,0xffea2803,0x004d2fcc,0x009432f9,0x00c13fa1,0x00c9817c,0x00bfbbd5,0x009edc15,0x007e9d1a,0x004b442c,0x00078ea4,0xffd92608,0xffb8fb8f,0xffa45d61, -0xff9f47d8,0xffb939b9,0xffe4dc83,0x0012916d,0x0022b727,0x001d69ed,0xfff89257,0xffe391db,0xffdf85e1,0xffe42585,0xffe8d8bf,0xffdb6132,0xffd596b0,0xffbc6574,0xffa10f8e,0xff7eea6b,0x0049faaa,0x00369f80,0x00255d0d,0x002e9d6e,0x0034cb4b,0x004cf9f1,0x0060ed8a,0x00727765,0x00655797, -0x0056de2d,0x004def46,0x002908c6,0x00091ea1,0xffe53577,0xffe05a7d,0xffd9d1df,0xffd40987,0xffdbc9c9,0xffdfaead,0xffdf2ac1,0xffedb800,0xfff4189f,0xfff751ab,0x001c0589,0x0042b55b,0x007a1277,0x00787d4b,0x007aac09,0x007d4e78,0x005e4238,0x00431591,0x0025c871,0x0033c235,0x0042d5d0, -0x004962c4,0x0042cb22,0x0062044e,0x007137d1,0x0068fd61,0x005cc374,0x004cfb59,0x003e4fcb,0x002f11db,0x00268cc9,0x0012479d,0x00031f26,0xfff58d2c,0xffe5da4f,0xffd86d5e,0xffc70bad,0xffc99c20,0xffc8a1da,0xffc7969a,0xffc2bc8c,0xffbf4a71,0xffb98451,0xffbc217c,0xffcdbfe7,0xffd92f91, -0xffe25fad,0xffe3afb7,0xffee8672,0xfff94896,0x00071eec,0x0014cd4e,0x00281d51,0x003d813f,0x004ab164,0x004db316,0x004be737,0x00537d40,0x005c8bec,0x0003ecf9,0x000c7a12,0x000363ee,0xffffae57,0xfffd3ba6,0xfff9e06e,0xfff621dc,0xfff26bf3,0xffeb0c62,0xffe38925,0xffdac0a6,0xffd48278, -0xffce7036,0xffc64b25,0xffc88727,0xffc84d19,0xffc8ff12,0xffca14fe,0xffcb5188,0xffcd2b6b,0xffcc93ca,0xffcdfe61,0xffca4d2f,0xffdda7b4,0xffde3c4e,0xffd61272,0xffdc729e,0xffe27984,0xffe798e2,0xffed3c97,0xfff1c13c,0xfffb2318,0x00016610,0x0008912d,0xfffe1ddd,0x000329ad,0xffceb619, -0x000876e7,0x000a6331,0x0011ab93,0x000d791c,0x000f6d6b,0x0014165c,0x001771e8,0x0012c8ea,0xffff90b0,0x00018928,0x00059b9c,0x0020c5e3,0x000e66cf,0x000da49d,0x000c4401,0x00140df4,0x001586a8,0x00162e2e,0x000f2e23,0x000bee6c,0x000a5c19,0x0006c707,0x0005459a,0x0006fb05,0xfffd8a6b, -0xfffac4e0,0xfff47761,0xfff828cb,0xfff41e73,0xffe6c0a5,0xfff61e34,0xfff97982,0xffe93c94,0x00044e5e,0x000904c8,0xfffee23c,0x0007635a,0xfffab4de,0x000f3be5,0x00059efd,0x0010e655,0x0021e791,0x0037d3bb,0x002ca1f2,0xfffbe366,0xfffac012,0x00087694,0x00493892,0x00104a70,0x0004b1ad, -0x000a80e7,0x002a76c9,0x003be21a,0x0041d35a,0x00369cab,0x002bbde8,0x00243cd4,0x0014eeb2,0x0008725b,0x0007227f,0xfff17f01,0xffea812a,0xffded2a0,0xfff25d57,0xfff7ec82,0xffd6cd6b,0xfffdabb6,0xfff890b4,0xffc42adf,0xfffc41b1,0xfffd23b2,0xffdab25d,0xfff10348,0x00081897,0x00379372, -0x001f0796,0x003403c0,0x00443bde,0x00698bb5,0x0054e804,0xfff351e1,0xffe95b28,0xfff572b5,0x0087fcc7,0x00269251,0x00255fca,0x001ded61,0x004e4b8d,0x005b2f36,0x0059bd75,0x003bac9a,0x0026892f,0x002211e5,0x0005181d,0xfff1e442,0xfff3a135,0xffca12b3,0xffcb7d18,0xff9b7f7f,0xffb34203, -0xffa14b81,0xff44ab3e,0xff9bec54,0xffb0f915,0xff65cf85,0xfff8d6d1,0x000b1956,0xffcfe509,0xfffadf2f,0xffc9c175,0x000404b0,0xffe56103,0x0009183e,0x00458d1b,0x00a3ba1f,0x008adbee,0xfff882c4,0xffd95931,0x00167f2d,0x00dcb067,0x002dbd25,0xffe42c44,0xfffb6ae4,0x006f9b6c,0x00bf52d9, -0x00d3eb33,0x00b52cf3,0x00906de8,0x007ec146,0x00432561,0x001bea82,0xffe12603,0xffc43a25,0xffd03bb5,0xff9d4aea,0xffd958c0,0xffdf15d4,0xffd1fc26,0xffaeb401,0xffa89437,0xff4a53be,0xffc6de8a,0xffdede8f,0xff5f2d65,0xffa9cd91,0x00f7ece8,0x012124dc,0x016f1830,0x014db98c,0x00d17d3b, -0x004a9fb1,0x00035b6c,0x00315383,0xffdf6ea2,0xffb21825,0xffa292c4,0x004b7a28,0x00c669a4,0x00f2995b,0x00068930,0xff600a60,0xfeefda34,0xfecc7ea8,0xfecdb0a8,0xfeea8482,0xfef26146,0xff1fee56,0xff4869b6,0x00200e24,0x0036ce83,0x000f4e28,0x00194fec,0x000f5a1d,0x001f53cf,0x001e1feb, -0x0053e523,0x006092e4,0x00a29667,0x00d0a022,0x00d51d6b,0x00e3d9bf,0xffa054b7,0xffbd50bb,0xffa332bc,0xff6830d4,0xff46f2e2,0xfed04f04,0xff373314,0x004af80d,0x0086262d,0x00a6c961,0x0038766a,0xff1603f2,0xfeb3ae62,0xff2e2164,0xffb842ca,0x004bf96e,0x00b55966,0x00d1528d,0x00aa2660, -0x00613d8d,0x0014d722,0xfffdd05b,0x002083ca,0x000b6542,0xffec5234,0xffe526dd,0xfffb09b6,0xfff307b7,0xfff3051d,0xffec759f,0xffe7ed63,0xffbf4b83,0xff654744,0xffa3e8ee,0x006cb9b8,0xffdde6a2,0xffc83130,0x00b2d4bf,0xff8d66b0,0xfffe5047,0x01c2573c,0x0139b6e6,0x00e7394b,0x00cfe0ed, -0xff456a14,0xfef9d412,0xffc9d0f2,0x00e025d6,0x01152992,0x002e2a28,0xffe2b7d3,0xffa25b9b,0xff918d80,0xff8f833c,0xffa709b3,0xffb44540,0xffdbfc44,0xffdc9914,0xffc1d68b,0xffdd4bb8,0xfffe44bb,0x000e090e,0x00044bb4,0x00069f91,0x000aa8a5,0x0004e3a1,0x00196fec,0xfffc2b73,0x002a529a, -0x001e4eff,0xff00e9b4,0xff7f3de9,0xff1fa325,0x01be8cca,0x007f5707,0xffc1012c,0xff16a907,0xfff85957,0x00ca1388,0x018280a8,0x009ec42a,0x0018e241,0xffe05ce9,0xffbce583,0xffc24e49,0xffdcb7e3,0xffeafdcc,0xfffac785,0x001fcbba,0x00558df8,0x007950c1,0x00812a63,0x006f60ec,0x00618206, -0x00445d09,0x00081a28,0xfff98d1a,0xfffa742f,0xfffaa552,0xfff83b63,0xfff9ab25,0xfff5c187,0xfffc0044,0xffefcea9,0xfff17586,0xffafc750,0xfe9f8914,0xfe30cf4a,0x010c4b6a,0x00b80817,0x0087d64b,0x0085608d,0x003e16bc,0xfff5431e,0xff85a6a1,0xff4dcdce,0xff536232,0xff7811fb,0xffb0f774, -0xffca5552,0xffec13b0,0x00201848,0x001dba0d,0x0021b975,0x0021b621,0x0010f89c,0x000ebc61,0x001651fb,0x0030f9fa,0x004ee4cd,0x005496ae,0x002df503,0x00159f02,0x0004081a,0x00096124,0x000c5de9,0x000bcb34,0x000976d1,0x000bcb65,0xfff7503f,0xfff3c052,0x00293237,0x009bce01,0x011c3716, -0xff8fe44f,0xffae0465,0xffdf6c4a,0xffbd85d7,0xff9973dd,0xff801e1e,0xff9806ce,0xffc0ea27,0x00197641,0x00495956,0x005bd614,0x006cf738,0x006f40db,0x0063113d,0x004ba49b,0x002280bf,0xffe9826c,0xffcb9186,0xffc083f6,0xffbb4f9e,0xffb8d1d3,0xffd40bc5,0xfffe04bf,0x0017ca39,0x00149a78, -0xfffca0fe,0xffe5c664,0xffdfbef6,0xffe5b092,0xffeb0654,0xffe9e88a,0xffd64847,0xffcd6398,0xffb528f8,0xff9cce82,0xff8ea517,0xffebff20,0xffcf2af3,0xffc025ec,0xffcc325d,0xffd4149d,0x00033740,0x0023e13d,0x003fde74,0x00458bb8,0x004f86b1,0x005c68b7,0x004b6454,0x003ae8f0,0x0027ba54, -0x001a19ea,0x000e51d4,0x0003de3b,0x0000f7ef,0xfffa7903,0xffec85ef,0x0003bf9d,0x0014786c,0x00229460,0x00335f3c,0x004dc577,0x006d0e86,0x005fed0f,0x00509b8d,0x004a6227,0x002b8f02,0x0010fdd1,0xfff03d6c,0xfffa234b,0x00009c3e,0x0002d183,0xfff50d7e,0x0077ea12,0x007e9344,0x007a20a4, -0x00714fe3,0x0063e56b,0x005c60be,0x005410d0,0x00521cf7,0x00407326,0x002f5b38,0x001f5f6d,0x000f590f,0x0001b9af,0xfff0af55,0xfff2b3eb,0xfff29583,0xfff227ed,0xffef1ece,0xffef748f,0xffe9fc1d,0xffe8ccaf,0x0003da47,0x001543bd,0x00240bae,0x002cf2fc,0x0044f19b,0x0047c130,0x004e7b84, -0x0052ce01,0x00595385,0x006149b9,0x00654679,0x00643c25,0x00617038,0x0067f623,0x006d48bb,0x0020a548,0x0026e217,0x0022e436,0x0022ad75,0x0023df91,0x0020cdbf,0x001db2d1,0x001bd63d,0x0015b0da,0x00111cfa,0x000b4951,0x0006e84d,0x00021d50,0xfffb1b67,0xfffd1adf,0xfffc90cb,0xfffcd5b2, -0xfffd4215,0xfffd2abd,0x000056c6,0xfffb13b6,0xfffb06f3,0xfff25657,0x001203f2,0x000f84aa,0x0007cec0,0x00071992,0x0009549d,0x000a6ee9,0x000d097c,0x000eab94,0x00118820,0x001b04cc,0x002478a4,0x0017c0c3,0x001ec77d,0x0006e696,0xfffd060f,0x00028e89,0x00074488,0x0003fa8c,0x00053055, -0x0005bc2f,0x000c3e6b,0x0008128a,0xfff752e9,0xfff6f7fa,0xfffa094a,0x0013a0ff,0x0000e1b1,0xfffff3ae,0x00008a2c,0x00036f25,0x00050bb3,0x000add1c,0x00037635,0x000111da,0xfffde658,0xfffe312e,0xfffea250,0x00066f3f,0xfff2242d,0xfff2254d,0xfff8ebe2,0xfff74aa1,0xfff6d581,0xffef1db7, -0xfffa53e2,0xfffb6309,0xffecdb6f,0xffffd150,0xfffffe94,0xfffbf464,0x0000b215,0xfff97860,0x00082852,0xfffeca8b,0x0003d3d7,0x00082a54,0x00251da4,0x001f65a3,0xfff62ceb,0xffedff92,0xfff8cb7b,0x00358033,0xfffda0bc,0xffed73d9,0xfff2044d,0xffffddbd,0x00117762,0x0028ba19,0x001ee378, -0x00175dd5,0x000ecd44,0x000833aa,0xfffa28f9,0x0004eef4,0xffe0177e,0xffda89a9,0xffe96977,0xffe320be,0xffe368e2,0xffcfdc4e,0xfffaacb0,0xfffbcc70,0xffcfa453,0xfffd16f4,0xfffc1ed1,0xffdef666,0xffeec244,0x0005e740,0x002f79b2,0x0018ff9b,0x002a5195,0x00273eaa,0x00567f39,0x00465501, -0xfff5b130,0xffdf87c1,0xffe4a0e9,0x00688910,0x000b1f0f,0x00088987,0x0004fe65,0x001a989a,0x0027e769,0x00451d0c,0x0026f4af,0x0014e1a0,0x000d8467,0xfffa7063,0xffe650e7,0x0000c087,0xffaf6508,0xffb3b7a2,0xffc12a83,0xffb6c65c,0xffb8d03b,0xff81cc83,0xffc14f2f,0xffcac1d3,0xff8f9529, -0xfffb58fb,0x0008bb82,0xffd1b107,0xfff58fee,0xffd92150,0x00050390,0xffec29b4,0xfff4bb10,0x0006bdfd,0x007aa0bf,0x007aa438,0x0001e5c1,0xffcdbce6,0xfffef84c,0x00ad1023,0x000dbb11,0xffb3d68e,0xffb968a4,0xfff756f0,0x004a9c59,0x00959565,0x00817dda,0x006337cb,0x004e65c0,0x001d0c0a, -0xfff65544,0xffe0f32c,0xffa79fc8,0xffc9031b,0xffd70d47,0xfff8bc93,0xfffb77d9,0xfffde9ad,0xfff1a5b4,0xffea58ee,0xffa9b64b,0xffea3a57,0xfff204d7,0xff7e14c7,0xffb4b9e4,0x00ce04fa,0x00f3f7a4,0x0150b6d2,0x01615062,0x0134cb2e,0x00513b54,0xffec7fc8,0x003cdfbd,0xffd93786,0xffa4dd32, -0xff94ac62,0x00359e74,0x00dcaa11,0x015bbd8c,0x0079fd96,0xffc9be09,0xff5c8a08,0xff0842ac,0xff005f06,0xff2c6e05,0xff32b508,0xff6474e6,0xffadd69c,0x004bfe3f,0x00366830,0xfffffbae,0x000e5a4a,0x000046a9,0x000908af,0x0002f801,0x0016754e,0x00167323,0x0045a7a6,0x008cf0ea,0x00b5ef9b, -0x00bf4f20,0xffa847d3,0xfff82ff1,0xffcfdd75,0xff804b41,0xff5cbd0a,0xfed2b3a2,0xff0e7e67,0x001bd494,0x003627fa,0x0085e9a4,0x00a36a94,0xff65e803,0xfec0ed40,0xfefa70e0,0xff72c5e2,0xffff7147,0x007e59d0,0x008d1f01,0x005f3a26,0x000de419,0xffe40639,0xffe40a99,0x0013d581,0xffeea723, -0xffebe2fc,0xfffb12f1,0xfffb35ce,0xfffcfc96,0xfffc9c21,0xfffc06ae,0xfff5f112,0xfffa4316,0xffd094fe,0xffd9f813,0x002fed4e,0xffc53f4b,0x006263a4,0x01369846,0x00323e14,0x0047d271,0x0120ca16,0x01413b28,0x011f15a0,0x01011188,0xffcab6bd,0xff4567f4,0xff4bcfc3,0x00a0e15f,0x0127c212, -0x00c134a0,0x0023a883,0xffc2bb4e,0xffbcbbc2,0xffaa2939,0xffd0fd73,0x00026717,0x0013f9f9,0x000a3f8f,0xffe8cb9a,0x0004e3c0,0x00097190,0x00042b78,0x0002d14d,0x00030e2f,0x00022566,0x00036a89,0x0003d303,0x0004de08,0x00167626,0x0007b255,0xff797eec,0xffeb3ad2,0xff28bdbb,0x00ba7485, -0xff474b3f,0xfec67d8a,0xfe7567e4,0xfed219c4,0xffd8bfe9,0x016d76a2,0x00f06c6c,0x007f5e76,0xffbd0b95,0xffbdc30d,0xffa40497,0xffad6024,0xffa633be,0xffc1979f,0xfff587e6,0x002c78cd,0x00573f93,0x007268d7,0x006561f1,0x004c1a56,0x001269fb,0xfff506f3,0xfff7d34b,0xfffcfb98,0xfffc1a0b, -0xfffc50c9,0xfffd0b48,0xfffcc5ef,0xfffd2159,0xfffad2ce,0xfffb3c20,0xffae81c9,0xfe62bef8,0xfe38785a,0x01998134,0x0132d1f6,0x0080b88c,0x00355233,0x002e2a1d,0xfffa8bfa,0xffa0520a,0xff582324,0xff4727bf,0xff63f6e3,0xff9013e8,0xffa4a726,0xffcb05ee,0x0010478c,0x00226de2,0x00335568, -0x003aa7c5,0x0038b3a7,0x00456527,0x005ad58a,0x00764629,0x007e7feb,0x005669aa,0x002833dd,0x000acf56,0x00043dcc,0x00074724,0x0006d735,0x0005ac79,0x00038225,0x0005b7a5,0x0005ecba,0xfffe336c,0x0042de03,0x00ae64e6,0x01992f32,0xffcc28f1,0xfff78098,0x0011f402,0xfff20af4,0xffcae838, -0xffa66b6f,0xffafde86,0xffbdae27,0xfff72741,0x0007d29b,0x00016400,0x0009d4ae,0x0009a9dc,0x000481d7,0xfffeef96,0xffeea6d3,0xffd0f48b,0xffc87602,0xffcaf97c,0xffcfef8c,0xffd659eb,0xffeeeec9,0x001193c9,0x0011d5d1,0x00061419,0xfff21a8d,0xffeec2b1,0xfff0a7c2,0xfff4773a,0xfff8f601, -0xfff7ecf2,0xffe842c8,0xffd9ff7f,0xffc99fea,0xffb97815,0xffbd38c7,0xffb1325f,0xff93e7a5,0xff90458d,0xff9ad5da,0xffa083a1,0xffc868f1,0xffe1fbf3,0xfff6dd94,0x000faa9c,0x002f0664,0x004f7d28,0x00580b6a,0x005e88a4,0x0063769c,0x004e4d4d,0x003beaa2,0x002acf79,0x001f9720,0x0011fbb8, -0xfffe8b23,0x0015ceed,0x002705c5,0x00383d20,0x0034f7f1,0x003b1db0,0x00384729,0x002eb502,0x001a987c,0x001aad67,0x0002ccae,0xfff42f2f,0xffda6c15,0xffd86dfa,0xffd306bc,0xffce6c1d,0xffbd18fe,0x00591798,0x0046b908,0x00479d97,0x0046499e,0x0041af51,0x0043c5e4,0x00458091,0x004993a3, -0x0044af36,0x003ae533,0x003158b1,0x002912ab,0x0022ac57,0x001cc260,0x001d31e2,0x001f4a87,0x00200fae,0x001fcd3c,0x0022166a,0x001e2b3e,0x0020bbaa,0x0034fe17,0x0044689f,0x0053973a,0x0061bbdc,0x007756f7,0x0071063f,0x006c80a0,0x00689278,0x005f7f0a,0x0059e54e,0x00561cf4,0x00518861, -0x004e8811,0x0050e59d,0x0049d9af,0x002f548d,0x002aefa7,0x002f4b25,0x00311925,0x00346bf5,0x00330d78,0x0031daa0,0x0032005f,0x002fda3e,0x0030186b,0x002fe39d,0x00302015,0x002f37ad,0x002cbd6e,0x002d78b7,0x002cb6f9,0x002c60bd,0x002be05a,0x002b1eff,0x002ca502,0x002a591d,0x002b245d, -0x002754b0,0x0038cf78,0x0037ebc4,0x0039ac8d,0x00344950,0x0033548e,0x003011f5,0x003060cc,0x002ec2c7,0x002bc141,0x002eef2b,0x0030957e,0x003015b0,0x0030cbef,0x00340f6a,0xfff01fb9,0xfff70c79,0xfffc023e,0xfff9abc9,0xfffa6ee1,0xfff6eeb7,0x00008fb0,0xfffdd5f8,0xfff20747,0xffee1beb, -0xffef5549,0x00016d5e,0xfff5a3be,0xfff47296,0xfff345e5,0xfff04a65,0xfff12ac9,0xfffb8f6d,0xfff51782,0xfff389e7,0xffef2480,0xfff141d3,0xfff20ef5,0xfffbdc91,0xffe55ecd,0xffe523a2,0xfff51321,0xffec434d,0xffedeeb2,0xffef319a,0xfff4df8c,0xfff44115,0xffeac764,0xfff4e823,0xfff33a38, -0xfff08fa3,0xfff48387,0xfff396c7,0xffff1308,0xfff8d8fc,0xfff8f9ce,0xfff0ec37,0x001358a5,0x0014010b,0xfff8e8a5,0xffe81588,0xffec7c8b,0x001704ab,0xfff5b0c8,0xffe3acfc,0xffdadc25,0xffd1d9fd,0xffdf3f28,0x0006080c,0x0000859f,0xfffe49bb,0xfff3b18c,0xfff4e49e,0xffeaf93a,0xfffe8636, -0xffcfc7a7,0xffcba04b,0xfff02fac,0xffca8193,0xffc726d3,0xffcbafb5,0xffed1d50,0xfff60d37,0xffdebf84,0xfff5159d,0xfff1d932,0xffde8e19,0xffeaea3d,0x00009330,0x00238941,0x0014170c,0x002184e5,0x000be173,0x0046118a,0x003ed0b3,0x000b8bae,0xffe45d66,0xffdf6e4f,0x0036c2b7,0x0005cc30, -0x00007592,0xffef9454,0xffde86d9,0xffe60ee0,0x00216a5d,0x000699ed,0xfffc1b90,0xffebb7b9,0xffe91396,0xffdad76c,0x00016b97,0xffa3b39d,0xffad90c6,0xffe3a6e9,0xffc19950,0xffcfcc4a,0xffc83438,0xffe3cedb,0xffe1e92d,0xffc8f551,0xfff76777,0xfffaf93f,0xffd3d410,0xffed585c,0xffe73bae, -0x0004b70f,0xfff5d927,0xffe9c3a9,0xffd4b8e1,0x00550012,0x006ea6e8,0x0026d3aa,0xffdc2e92,0xffee4175,0x005bea06,0x000d1e23,0xffb71e70,0xff8a9c29,0xff765cb1,0xffbac20c,0x003b00fa,0x0037c91c,0x0026fa8b,0x000b7f02,0xfff399d0,0xffdc2075,0xffe829fc,0xffb33080,0xffe4df34,0x0000dfbe, -0x0004f47e,0x000eeb81,0x000f5fc1,0x0004d17d,0x0004af5f,0xfff2497a,0xfff99bc6,0xfff94023,0xffadce78,0xffc69f1a,0x009cf999,0x00a8d2df,0x011fbc06,0x0154d0e2,0x015fc7f0,0x006b9451,0x0000ea8a,0x004d69d1,0xffea435b,0xffbf44b2,0xffc00bfc,0x00389288,0x00eb346b,0x018b4278,0x00f7fcd1, -0x0053e257,0xffcd5db5,0xff56a1b0,0xff3eb4da,0xff66cc53,0xff6ccdc9,0xffb1a937,0x0003b58c,0x003685df,0x0013b0ab,0xfffe01b1,0x000063c3,0xfff9883b,0xfffa6f39,0xfffd9fd4,0x0000ef3a,0x00020445,0x000916ac,0x00390de9,0x0063c816,0x007cb8b2,0xffd0da58,0x003471ac,0x000735c1,0xffb37577, -0xff7d3efe,0xfeecfb9c,0xfef6f186,0xffd49636,0xfff7d8f0,0x006a644e,0x00e5272b,0xffc1c632,0xfef9b834,0xfedd6f5c,0xff4d14e9,0xffd5a4cc,0x004a9104,0x00505ae1,0x002345a0,0xffd47d0d,0xffd0d887,0xffe620d0,0x00054854,0xffeaacc6,0xfff76f3d,0xffff3d04,0x00008e9e,0x00025de1,0x0002b3a5, -0x00018be0,0xffff203c,0xffffc3aa,0xfff778e9,0xfffac615,0x000a8d96,0xffd9be0f,0x00da4722,0x0160409c,0x00a0b9bd,0x0054613b,0x004c3b48,0x0123b2aa,0x0140dfe8,0x00f6f35b,0x004b86fb,0xff9a5cbb,0xfef6f4b0,0x0032f5c7,0x00f464be,0x01344f8a,0x006f2fe8,0xfff64a15,0xffe57692,0xffd4a92d, -0xfffb9e7c,0x0037b62c,0x003351bc,0x001caaf1,0x0001514d,0x000b8064,0x0003cdbc,0x0000e45e,0xffffb38f,0xfffede4b,0xfffe9a34,0xfffe77ab,0x000125e5,0xfffee325,0x00046181,0x000dbd0a,0xffb69814,0x002fcc01,0xff28b5e6,0xfea65400,0xfe7da5ea,0xfea5ac04,0xfe801004,0xfe65549e,0xff14bd16, -0x0088e5f2,0x010a485a,0x00ef8b38,0xffd39081,0xffd19cb2,0xff8ccf83,0xff80f2a2,0xff7c0741,0xffa37892,0xffcec723,0xfffca1b2,0x001e21db,0x003e40ae,0x003de0b6,0x001944c7,0xffebb3be,0xfff7d4eb,0xfffd6ac5,0xffffb8c9,0xffff9911,0x0000d94d,0x000150fe,0x00017d3a,0x0000779c,0xffff87d0, -0x0000fcea,0xffd96ae4,0xfee6862e,0xff064ee0,0x01b88b22,0x0171602e,0x005296ff,0xffb8855b,0xffdb38a2,0xffc28485,0xffaa783b,0xff86c83a,0xff6099d1,0xff6a439a,0xff88bf3c,0xff9cf5fb,0xffc51ebf,0x00088bef,0x0020e691,0x0034c6ee,0x00452736,0x0054898d,0x006ba127,0x007eae5f,0x008f2f4e, -0x007561ca,0x0034b35e,0x000efe31,0xfffe24fd,0x00026ce1,0x00005078,0xffff2651,0xfffdcf1b,0xfffdeaed,0xfffcfe4a,0x00026983,0xfff97b01,0x0041e00f,0x0083fa2f,0x016beb52,0xfffff511,0x002c8a47,0x00321c7c,0x002645b5,0x00088d29,0xffe3fca4,0xffd4f8c6,0xffc1e3d5,0xffd7ba1c,0xffd77f23, -0xffcb64c8,0xffcb92eb,0xffc2532f,0xffb49cbd,0xffbdd164,0xffc654c4,0xffc8cda2,0xffd05427,0xffdc98d5,0xffe42934,0xfff150cf,0x0009c2b8,0x00193010,0x00098263,0xfffec97b,0xfffb7d19,0xffff3364,0x0002beeb,0x0003d6e3,0x00066d9e,0x00062c28,0x0002d78a,0xfff74721,0xfff34a29,0xffe75f6b, -0xfffb5410,0xff964d66,0xff8a805f,0xff95d648,0xff9c5c5c,0xffa5c9cc,0xffbadf63,0xffc74171,0xffce5d56,0xffe7462d,0x0003b211,0x002146ae,0x003adf52,0x0052ec4f,0x006a6361,0x00581da9,0x0045a84f,0x0033fe40,0x002af3e3,0x00230eac,0x00157487,0x001beedc,0x002369f6,0x002930f6,0x0019e203, -0x0012be44,0x0002fa30,0xfffe7fc8,0xfff1539e,0xfff4502a,0xffe6a2fa,0xffde4bbd,0xffcd9436,0xffc05cf8,0xffb041c4,0xffa51fc0,0xff9af667,0x000fab9b,0xfff8bc33,0x00018c96,0x000992da,0x000fb85a,0x0018b760,0x00237ffd,0x002e5c93,0x00361b5f,0x00389a88,0x00398526,0x003a4641,0x003b0753, -0x00403704,0x003e026f,0x00413017,0x004246d9,0x00433689,0x00448a61,0x00429e1b,0x0040354f,0x004d3f38,0x0054c063,0x005b6466,0x0061fd20,0x0067b8a8,0x005bc2ed,0x005062d7,0x00473030,0x003921bf,0x002ea678,0x0029a71e,0x0022d6c5,0x001f9a91,0x001beea1,0x000e9d1d,0x002e0c85,0x00280c54, -0x002fe968,0x00331860,0x00375c60,0x00396bba,0x003ae27c,0x003cd1db,0x003e469b,0x0041b406,0x0045b75a,0x0049dc64,0x004ce3d6,0x004f4a87,0x004eaddc,0x004dcb14,0x004ceb5e,0x004bada1,0x004a4f0c,0x004b3fcf,0x004687ba,0x0044274f,0x00404ffc,0x004a526a,0x0048386b,0x004d9cf3,0x00489d3e, -0x0046539c,0x0041ce8a,0x003fd8aa,0x003be7ab,0x00357096,0x00337490,0x0031e51a,0x002fabe5,0x002eda30,0x0051ded8,0xffe4d97f,0xffed6163,0xfff1314e,0xfff13f26,0xfff15e92,0xffe9bc19,0xfff58503,0xfff4f70d,0xfff07b5f,0xffe81c0f,0xffe6c73f,0xffecbdcd,0xffedfec8,0xffed14aa,0xffe78085, -0xffdfdafc,0xffdf53ee,0xffea9747,0xffe7c64d,0xffe7554a,0xffe1c88d,0xffe5b634,0xffe728ab,0xfff1f708,0xffdb76da,0xffdcb0e8,0xfff253d3,0xffe3cd5a,0xffe49605,0xffec7e49,0xffee7c87,0xffef6767,0xffed8070,0xffeb6ea6,0xffe7c622,0xffe88ed1,0xffeae964,0xffeea20c,0xfff59c83,0xfff4b618, -0xfff16229,0xffddd2f9,0x00013728,0x0007c314,0x0000f520,0xffe696c3,0xffe27aeb,0xfff06e61,0xfff4b39b,0xffe58ece,0xffca6880,0xffaee007,0xffb439e7,0xffdeecea,0xffe3d5f9,0xffe81709,0xffdc101a,0xffe4898e,0xffdf34ac,0xfff4f75a,0xffc98782,0xffc4f906,0xffecd347,0xffbb5be4,0xffba4ddc, -0xffd48db5,0xffe8d82c,0xfff1be0a,0xfff0a547,0xffec5ab1,0xffe65058,0xffdef7e0,0xffe60d86,0xfffc6f01,0x001721c0,0x0012e5da,0x001b10a5,0xfff1ef11,0x0031d173,0x0035252c,0x002b4e6c,0xfff02e63,0xffdf80f2,0xfff5956d,0x000d47a7,0x0007db12,0xffdf70f4,0xffad816d,0xffaa7756,0xfff01fb3, -0xffe5347e,0xffe55097,0xffcc6855,0xffd737c9,0xffd31d38,0xfff8295f,0xffadf7e7,0xffc1ce4f,0xfffc29e4,0xffe2623c,0xfff50817,0xfff73c2b,0xfffc2276,0xfff80685,0xfff94013,0xfff60428,0xffee2bd5,0xffdb8b7f,0xffe8cc8b,0xfff06209,0x0004ea12,0x000277d9,0xffe933c4,0xffaebe94,0x00271aed, -0x0055dc48,0x0052dbcd,0xfff312f1,0xffdbec8d,0xfff0aa53,0x00186fd3,0xffdc5dd6,0xff75b7e6,0xff1836bc,0xff3c1fbe,0xffce2afb,0xffecb590,0xfff16559,0xffd182e3,0xffd3565c,0xffd277af,0xffec83a8,0xffdb9241,0x0008514e,0x0005d4c2,0x0009160f,0x0008c675,0x0003880d,0x0003530a,0x00027e02, -0x0002622e,0x000178cc,0xfffb9051,0xffd62dba,0xffdb6611,0x006a5b47,0x00686323,0x00dc607f,0x0121a274,0x0165049c,0x009d40a1,0x00412232,0x006fecae,0x00109097,0xffeffac3,0x00047908,0x00421bad,0x00da1336,0x01703de4,0x014f7708,0x00d05c97,0x0023e280,0xffa1d22b,0xff784b8c,0xff8d936e, -0xffa21da4,0xffeca687,0x002343b3,0x000c8bd0,0x00012498,0xfffbb04d,0xfffc6a8c,0xfffb46cd,0xfffe0e35,0xfffe0645,0xfffeb2e7,0xffffc7fd,0xfffe1f34,0x00073053,0x001e092d,0x003c1073,0x00071d6c,0x0056c33f,0x003e72b9,0x0005f029,0xffc6ced5,0xff38687c,0xff13dce3,0xff9bbbaa,0xffe18406, -0x006132df,0x00ecce99,0x001a3866,0xff5807bf,0xfeea79c4,0xff2eb8cc,0xffa34ef6,0x000d1b90,0x0021dc71,0x0009e3c3,0xffcd977c,0xffe82d9f,0xfffa1ccc,0xfffa26ee,0xfff7533b,0x000018c6,0x0001d731,0x00020ccc,0x000276a6,0x0001523b,0x000170b3,0x000004da,0x00027b2b,0xfffe7dc3,0xfffc27c6, -0x00080152,0x00079650,0x0113797e,0x0158daa0,0x00cb42a5,0x0038506c,0xff9f7e55,0x00eee1b3,0x01595b38,0x00f5f72f,0x00c78142,0xfffa51dd,0xfee52e34,0xffc6b441,0x00944281,0x014d54c8,0x00c3012f,0x00539458,0x0018a5f6,0x000b501d,0x001b38a7,0x003f05a7,0x0024e5bc,0x000eb628,0x0006dd26, -0x00034aa2,0xfffff7fd,0xfffec859,0xfffe75e6,0xfffe84b0,0xfffe62e5,0xffff9567,0xfffd5a67,0x0001c38f,0xfff8c2b1,0x0015acb1,0xffd7c3a4,0x00313fb3,0xff143e64,0xfd1f3d64,0xfe8e4882,0xff4c5adb,0xff0f7472,0xfed8120e,0xfeed61ac,0xff783ab8,0x00d4da31,0x012a6f38,0x003ed4a2,0xfff7ab95, -0xff8723c5,0xff799b4c,0xff6c77c3,0xff8d0e93,0xffaaff2a,0xffcc07f0,0xffdd180d,0xfff7c312,0x0001888a,0xffed10a2,0xffef6d4b,0x00025c04,0xffffabea,0x000199e6,0x00019d4a,0x00021fa2,0x00017557,0x00024b98,0x00012e45,0x0003bb53,0xfffee606,0x00079fa7,0xffa1fe31,0xffbf8128,0x0110ee4e, -0x0102b5c2,0x0003dca2,0xff6d3ed3,0xff8481fa,0xff8c05bd,0xffb2486b,0xffc563a5,0xff8e148d,0xff79e25d,0xff891514,0xffa25b52,0xffcb2f34,0xfffcdd4a,0x0014eb04,0x002d9e97,0x004e72b8,0x00649f4a,0x00797150,0x008255bd,0x007bde57,0x00496c48,0x00106dc9,0xfffdc801,0xfffe801d,0xfffe0e08, -0xfffc9b22,0xfffcdd51,0xfffc97a0,0xfffce505,0xfffaacce,0xfffea5b7,0xfff513b7,0x000cce4f,0x0054c5ef,0x00af7595,0x003c4371,0x00610c90,0x0059c4fa,0x0060a4c4,0x0044c324,0x001db790,0xfff35ecd,0xffcc71b5,0xffbbed80,0xffb5a0ee,0xffae506e,0xffae2d62,0xffa2e7c3,0xff8f060f,0xffa677d4, -0xffbd58ac,0xffd163a8,0xffe2f200,0xfff5c19b,0x000344d8,0x00155f34,0x0020e934,0x001a0358,0x00068828,0x0002312a,0x0005fda1,0x0006155b,0x000719fb,0x00062399,0x0007c86b,0x000883b9,0x000ac990,0x00092eeb,0x0013791a,0x00142aa2,0x002c532b,0xffac571a,0xffad02f5,0xffb9fb5a,0xffb8ceaf, -0xffc1741a,0xffcb2760,0xffd0d43b,0xffd00794,0xffde866d,0xffea823e,0xfff7c279,0x000ff990,0x0028c3ef,0x0041beb3,0x003a0fbe,0x0030889c,0x002778f3,0x00275a1c,0x0027533d,0x00283efd,0x001daf5a,0x0014d726,0x000df731,0x00002e88,0xfff7433a,0xfff02310,0xfff15ec0,0xffefb5dd,0xfff31d8d, -0xffef9253,0xffead1cb,0xffe29c7c,0xffd288de,0xffbff84e,0xffb15a6a,0xffb0cdad,0xffd9bc2f,0xffc72bcb,0xffd6033e,0xffe5c53d,0xfff2ff1c,0xfffdbae7,0x000b8d31,0x001a3ee3,0x002786fe,0x003312b2,0x003c4f93,0x0043728c,0x0049372e,0x0054cbc6,0x0050e9a6,0x0052e411,0x0052c1d1,0x00531871, -0x00520067,0x00524af8,0x00506bc9,0x004c619c,0x00471ba9,0x00417eeb,0x003c8324,0x0030e6bf,0x00240783,0x00177cd7,0x000dbe25,0x000192b5,0xfff7dd66,0xfff4845b,0xffef5e40,0xffef1b40,0xffea0884,0xffdc1e95,0x00282c0a,0x001d1ef5,0x00263e3c,0x0029378b,0x002d6846,0x003237a0,0x0035b67c, -0x00388e0a,0x003be486,0x00402df9,0x00457685,0x004b30cf,0x00504f0d,0x0055ce5f,0x00541269,0x00533bef,0x00522951,0x0050cf90,0x004fae88,0x004e0cc2,0x004f023c,0x004e526a,0x0050fdfc,0x00487d76,0x004a7f26,0x0052daf0,0x004fba47,0x004c6ff9,0x0047fb58,0x0044576f,0x003fa420,0x00381f16, -0x00306e91,0x002918d9,0x00302dda,0x002b19c5,0x0053edd5,0xffe12821,0xffe7ecbf,0xffeb0514,0xffed6a80,0xffed4aa1,0xffe3d0fc,0xffeeef55,0xfff0a439,0xfff4f7ed,0xffe8823a,0xffe4b607,0xffdec73a,0xffebb555,0xffebdd47,0xffe3cf77,0xffdb639f,0xffd98920,0xffe0316b,0xffe20eba,0xffe274a5, -0xffde8625,0xffe0cca8,0xffe0abff,0xffe70a6a,0xffdcb895,0xffdd55e4,0xffebac96,0xffdb6ea9,0xffdaf52c,0xffe6dca4,0xffe7c231,0xffea3a35,0xffefac04,0xffe62e27,0xffe37882,0xffe23907,0xffe4dbf0,0xffe90721,0xffed42e5,0xfff22bba,0xffedb7be,0xffd6098b,0xfff3398d,0xfffe7981,0x000d9bbe, -0xffeba95e,0xffdf54e1,0xffd114ab,0xfff4c197,0xffed598c,0xffca225f,0xffaaaf8b,0xffa6ff27,0xffc38c06,0xffd28497,0xffdc21a8,0xffd32c06,0xffdc38d9,0xffdea54b,0xffef1218,0xffcb4868,0xffc61916,0xffe99651,0xffca99e8,0xffcfe45b,0xffe88b55,0xfff0e798,0xfff6e070,0x0001cf57,0xffe9df76, -0xffe0bad5,0xffe4294e,0xffe4ad55,0xfff73fd5,0x00038324,0x000dcc4d,0x00106a1a,0xffe1420e,0x0018fd8f,0x0024ba7b,0x0048c30a,0xfffdde36,0xffe41a78,0xffbd9cfe,0x000e559e,0x000f044e,0xffdc7102,0xffa47a76,0xff97876b,0xffc6fd47,0xffd068d4,0xffda2efa,0xffc1351d,0xffd27685,0xffd67c33, -0xffebeaef,0xffd0cf01,0xffecd0cc,0x0006f87b,0x00014fc7,0x0009a9a2,0x0003ffc2,0x0003ae86,0xfffef2ee,0x00054afc,0xfffb60d4,0xffeb8c2d,0xffe28839,0xffea313a,0xfff05850,0xfff774bc,0x00056cc0,0xffe9f268,0xffa185ab,0xfffb060e,0x00374c73,0x00788039,0x0009b3d2,0xffcd415f,0xff919e97, -0x0011d02a,0xffff0dc5,0xff84a81f,0xff11f72a,0xff0f380c,0xff771658,0xffb462f3,0xffcf5687,0xffb64f80,0xffc89bef,0xffda408c,0xfff48a29,0x0001a1ea,0x000b6b1c,0xfffe1798,0xffffe8c8,0xfffd7198,0xfffe51f8,0xfffeedf5,0xffffe3cd,0xfffde105,0x000269f5,0x00044b79,0xffeefe16,0xffe89bdf, -0x00415a51,0x00423271,0x0081204d,0x00bf261e,0x0134a948,0x00af3026,0x00695efd,0x006d7687,0x003b8ffa,0x002f7fc4,0x00417cf9,0x004a655d,0x00a8a314,0x01174274,0x015b2386,0x0114d89c,0x00632cba,0xffefe0c0,0xffb87842,0xffb32f7a,0xffcfc6e7,0x000ce8f6,0x000f867e,0xfffc7de8,0xfffd35f5, -0xffff11b6,0x00009263,0x0000943d,0x0000e074,0x00007cce,0x000051ec,0x00006623,0xfffec0f4,0xffffd38c,0x00022772,0x001896f1,0x0025aa20,0x004dcd32,0x00575d91,0x004c6207,0x00194802,0xff9a0a58,0xff5ee2a0,0xff8d2485,0xffe4113c,0x004e1cfb,0x00b099e5,0x005121fc,0xffc20a70,0xff3155e1, -0xff2c6131,0xff6b1036,0xffc2cf8c,0xffeed941,0xfffbd575,0xffeaf055,0x0007880f,0x000253d4,0xfff7afad,0x00013bc3,0x0001cc10,0x00006848,0x000007aa,0xffffb6a0,0xffff9cfa,0xffffe0d4,0xffffe504,0xffffb096,0x000148fa,0x000030fc,0xfffd7fbd,0x0017667d,0x00e85192,0x011e2984,0x00a7ab07, -0x0007ccff,0xff513026,0x008285ce,0x010e09e4,0x00bf93b5,0x00df7ee8,0x00310f29,0xff1a078a,0xff83e2cf,0x0025f244,0x00f7d050,0x00ed22c3,0x00b35dbc,0x0058b516,0x00468c85,0x003510ad,0x002c319f,0x0006ca33,0xffffb094,0x0004bb66,0xfffe5503,0xffff1735,0xffff5b8b,0xffffd4e1,0x00000c33, -0x00001c35,0x00001eba,0xffffcee1,0x0000e9fe,0xfffbe3ad,0x00057ea1,0xfff2a9c4,0x001808a3,0xff164f26,0xfd237fe4,0xff0943c0,0xffe5bed5,0xffb47740,0xff8d62e2,0xff381121,0xfee781b4,0x0045b88e,0x00e183f4,0x00aa5c14,0x0019cea0,0xff9a1122,0xff8bf1b1,0xff7383a3,0xff8241d4,0xff93b56c, -0xffa99b04,0xffb03348,0xffc0236a,0xffd4adce,0xffe6b024,0x00024747,0x0000c26a,0x0001743b,0x0000f844,0x000082a1,0x0000208c,0x000015ad,0x00000815,0x00003796,0x0000626f,0x0001c1bc,0x0001716a,0xfffe371c,0xfffcacfa,0x0005b223,0xfff2d93f,0xffced6c5,0xff93d891,0xff763cee,0xff93659c, -0xffc60527,0xffea08e6,0xffb8f1b2,0xff927842,0xff93d706,0xffa9cb19,0xffce4a5b,0xffe830ab,0x0001a50c,0x001f582f,0x0048d20b,0x005d8800,0x006a81f9,0x006c0eb8,0x004f9d4b,0x001ed057,0xfffaefb5,0xfffd4538,0xfffde614,0xfffde6aa,0xffff2772,0xffff6389,0x00000034,0xffff8ef5,0x00003e40, -0xfffd0742,0x000196e5,0xffef6f49,0x001b27b3,0x00025394,0x00575980,0x007875cf,0x00695c98,0x006dc9d3,0x004d0ac2,0x002a03ab,0xfff8e6de,0xffd964df,0xffb25af1,0xffa84700,0xffa1d0f3,0xffa74b7a,0xffa3b10f,0xff966a1b,0xffb8fdcf,0xffd12d09,0xffe1c5b9,0xfff90f96,0x000eb3ce,0x00226e95, -0x002a996a,0x0024d88d,0x000d1792,0x00044f51,0x000546c8,0x000395dc,0x00020cc7,0x0000ec4c,0x00001b8b,0xffffbf02,0x000103d7,0x00014b72,0x0006a313,0x00080ac7,0x001e7897,0x003661c0,0xffccb1d7,0xffd085b0,0xffd7b3ff,0xffd2b0e0,0xffd6ae1c,0xffdae531,0xffddb0f4,0xffda185d,0xffdff080, -0xffe00f87,0xffe03491,0xffe815e2,0xfff22591,0xfffb875c,0xfffe6447,0xffffad1e,0x00014cbb,0x00070d3e,0x000a779c,0x00144cfe,0x00059492,0xfffb1bcb,0xfff65957,0xfff0435f,0xfff213a9,0xfff96947,0xfffc51d9,0xffff7ff3,0x00013e5c,0x00027b85,0xffff9d1e,0xffff3494,0xfff056d9,0xffe2d028, -0xffd34396,0xffd20f26,0xffc2b18b,0xffbe9440,0xffcc6279,0xffd997b6,0xffe53978,0xffebeac1,0xfff55587,0x00004ef1,0x000b039c,0x00163e43,0x00209a0e,0x00285217,0x002f22be,0x00397763,0x00392a5c,0x003ba451,0x003d5a8b,0x003f5567,0x00402574,0x00441b6a,0x0040c6a3,0x00302533,0x002441b2, -0x00191ed2,0x000daecd,0xfffeb052,0xfff706bb,0xfff0bf6e,0xffea12dc,0xffe35049,0xffdc1244,0xffd77d24,0xffd35720,0xffd27a65,0xffce8d4a,0xffc961f8,0x000c7ed9,0x000557ea,0x000a58c0,0x000c40e4,0x000efc87,0x001362ae,0x0016a76c,0x0018cc4b,0x001b8d63,0x001e7d45,0x0022157e,0x00269d00, -0x002b07b3,0x002fef30,0x002f6e2b,0x002fc75d,0x002fcda9,0x002fd537,0x00300796,0x002ed6b9,0x00318634,0x00324dea,0x003856ef,0x00267bc1,0x002a81a3,0x0030bf5d,0x002d4dcf,0x00285e96,0x00243d85,0x00202cbe,0x001cbeb1,0x0017d24b,0x0011f7a0,0x000b762c,0x001530a9,0x000eb3a9,0x002ca384, -0xffe51aa7,0xffe9acdc,0xffea0a0f,0xffee21c0,0xffee3d91,0xffe71bf6,0xffedd396,0xfff02086,0xfff932b7,0xffec455d,0xffe7a858,0xffdca314,0xffec9637,0xffedde43,0xffe759b6,0xffe1f37d,0xffdfb6aa,0xffdfedb6,0xffe46894,0xffe58584,0xffe4b627,0xffe6298a,0xffe5b9d7,0xffe8b1ad,0xffe568b1, -0xffe2971b,0xffe85114,0xffdd7900,0xffdf0abd,0xffea51d4,0xffeb181d,0xffee7296,0xfff77a45,0xffe98ad2,0xffe820ce,0xffe73714,0xffe7c2d1,0xffeac334,0xffe90725,0xfff1ccaa,0xffeed44d,0xffdd9aa6,0xffedd111,0xfff879d2,0x00109d16,0xffef99e6,0xffe0bd51,0xffc6d0e3,0xfff20add,0xfff26979, -0xffd5f7f4,0xffc0c5ce,0xffb83986,0xffbf291c,0xffd03186,0xffdb7f2e,0xffda3cf8,0xffe4332c,0xffea0339,0xffe95ead,0xffd877c3,0xffde91af,0xfff708c8,0xffee9257,0xfff18521,0xfffad515,0xfffbf42e,0xfffd6c49,0x00075985,0xfff1e4b3,0xffe3f870,0xffe99d9a,0xffea9589,0xfff5125b,0xfff00513, -0x00049521,0x000518c1,0xffe53d0d,0x0003f480,0x000e72fc,0x00469f36,0xfffecff0,0xffe579f8,0xffa81730,0xffffe711,0x00089a2a,0xffe16f99,0xffbdcf3b,0xffadf9cf,0xffb8e920,0xffccdf56,0xffdadf1a,0xffcf7cbd,0xffe16b79,0xffe493d5,0xfff1e880,0xfffd0628,0x00064ee1,0x00054691,0x00050d62, -0x00062ba2,0x000287b8,0x00025b24,0x00003341,0x00002d05,0x0003159b,0xfffc7c90,0xffeecc83,0xffede8f6,0xffef8a60,0xffe643fa,0x00002894,0xffef98fa,0xffbb76d7,0xffe61340,0x00197027,0x00705cd2,0x00093430,0xffc4880b,0xff6e8794,0xfffa45af,0x00082337,0xffa95ece,0xff5839ae,0xff3e558c, -0xff5edc52,0xff9db8f4,0xffc32cda,0xffbe9f20,0xffd873c1,0xfff0dd5f,0x0001c32e,0x0003a6e0,0xfffe205c,0xfffd75c1,0xfffde227,0xfffd80f1,0xfffe82fb,0xffff429c,0xffffe180,0xffffcad9,0xfffef97a,0x00036686,0x0002066c,0xfff4bd64,0x0022aaab,0x0027a4c2,0x002d0b45,0x00556c11,0x00d05a19, -0x0087f797,0x0058fdcb,0x003381ff,0x00487015,0x004e5f0d,0x00432eb5,0x0031deff,0x0056c723,0x009a80d5,0x0101a0f2,0x00f15240,0x00755462,0x0029c98e,0xfff6bdc0,0xffe13ba0,0xfff9b02d,0x000c91be,0xfffe8417,0xfffec668,0x00001b3d,0x00016cd1,0x0000e8f7,0x000120b5,0x0000cd7d,0x00004fdd, -0x00000c8e,0x00009b55,0xffffd295,0xffff1ba5,0xfffe7943,0x0006f5c1,0x00209786,0x002a9215,0x004838c2,0x0060adc3,0x004a14ac,0xffec530a,0xffb373f1,0xffa5f82e,0xffedafe8,0x002fa4ba,0x00612711,0x005cdfcc,0x000ce7c4,0xff8de577,0xff4eeaae,0xff50981b,0xff8c31c8,0xffbc5879,0xffe1fe19, -0xfffbbf5d,0x000b7735,0xfffdc2d4,0xfffebc5d,0x0001bae6,0xffff8b6c,0xffff9400,0xffff5755,0xffff86b9,0xffff832e,0xffffc919,0xffffa4cf,0x00002381,0xffff92c9,0x0000cf32,0x000143b4,0xfffc59ab,0x0082e24a,0x00bd387b,0x00690052,0xfff30cdc,0xff6352c8,0x0016fcbd,0x008ea8d3,0x008266ce, -0x00ad09a7,0x00453fcd,0xff812896,0xff86aff4,0xffdf2fde,0x007b6409,0x00ce4405,0x00d1b800,0x00852ef6,0x0067515b,0x003f8a69,0x00188500,0xfffa215c,0x000177d4,0x00009099,0xfffed3b5,0x000050f9,0x0000388b,0x00007749,0x000061a1,0x00005873,0x00007881,0x00000767,0x0000af64,0xffffa3c0, -0x00013b48,0xfffd3f79,0xfff98d26,0xff5f199a,0xfe392572,0xff64d409,0xfffb74e3,0x0026957b,0x000683c2,0xffa5f912,0xff212e04,0xffd29ac7,0x0063e03e,0x00cea5bb,0x00449c1d,0xffdc171f,0xffb38e12,0xff9e1dd9,0xff9be5cb,0xff9b8600,0xffaa5779,0xffaf57a4,0xffb3d52c,0xffd28807,0xfffd36f4, -0x000323fb,0xfffff6a0,0x00006a44,0xffff8547,0xffffa00c,0xffff816e,0xffff6ead,0xffff6739,0xffff7de1,0xffff47de,0xffffdc94,0x00009682,0xffff0548,0x001490df,0xff7d5083,0xff35f42a,0xfffb8243,0x00227856,0xffe54a6e,0xfff39e7a,0x0000d0ce,0x0002298e,0xffe04483,0xffbac181,0xffb9d915, -0xffbd7201,0xffd6fdbd,0xffe01a95,0xfffa597c,0x00139f14,0x003220e2,0x0042b86a,0x004b8f7e,0x004f06e1,0x002e930a,0x0002ca42,0xfffa4c99,0x0000737c,0xffff2ae4,0x0000cd47,0x0000894a,0x0000ed97,0x00011f25,0x0000f581,0x000167d1,0x0000db99,0x000171cf,0xfffddf93,0x00034681,0xffe45d98, -0x00558c11,0x00637fbe,0x004ba2e5,0x00426483,0x002cbff0,0x0017cf04,0xfff6f71e,0xffec017e,0xffc89fea,0xffbd7dd8,0xffb56a11,0xffba5c13,0xffbd162d,0xffbd6ffa,0xffde7371,0xfff201c7,0xfffbbe4b,0x001138fc,0x0021c4ce,0x00320346,0x003018d8,0x0019fd31,0x000221f3,0x00037906,0x00001858, -0xffff22e1,0xfffe932e,0xfffe1a00,0xfffdbc67,0xfffd8c2d,0xfffda715,0xfffc913f,0xffffa423,0xffff4f41,0x0004edfb,0x00257444,0xffef9acd,0xfff7fad0,0xfff90e16,0xfff4048f,0xfff0e63c,0xfff042bf,0xfff0a5f8,0xffed42d2,0xffeb81a8,0xffe611a6,0xffdf41bf,0xffdc6f19,0xffdb189f,0xffd79488, -0xffddf88e,0xffe394c7,0xffe95501,0xffee83e3,0xfff10a86,0xfff99793,0xfff12739,0xfff004b1,0xfff5de81,0xfffa9dd4,0x0000a431,0x00031d48,0x0003580e,0x000497ca,0x00053130,0x0005d44a,0x0005d79d,0x0007fe79,0x00053eb7,0xffff0bce,0xfffa9c92,0xfff8f0b1,0xffd37870,0xffd7ddba,0xffde7598, -0xffe47aed,0xffea3f48,0xffed9bc7,0xfff15123,0xfff6434e,0xfffba164,0x00019c07,0x00078580,0x000bb933,0x000f9867,0x00146517,0x00175b22,0x001a44c5,0x001d9ba0,0x0020b2c6,0x00233936,0x0028df01,0x0026a694,0x00132c7f,0x0006c5b0,0xfffcfc58,0xfff7e253,0xfff5d59c,0xfff51ebd,0xfff36817, -0xfff17e21,0xffef7277,0xffee2a3f,0xffe842dc,0xffe27dc6,0xffdcf563,0xffd81cb2,0xffd83c67,0xfffa7d45,0xfff7ff5f,0xfff94749,0xfffa73ee,0xfffbbc4b,0xfffdb1f6,0xffff60cf,0x00006832,0x00014a32,0x00023d5e,0x00039188,0x00058f69,0x0007c621,0x000a0f25,0x000afb8a,0x000c14e4,0x000ce812, -0x000e0947,0x000f2b3f,0x000f1275,0x0011d309,0x0013413f,0x0017ed64,0x000994fa,0x0009ff82,0x0008f112,0x00058bd2,0x0001fa36,0xffff1b2c,0xfffc17b9,0xfff96afb,0xfff80b7e,0xfff81b84,0xfff75b55,0xfffdb974,0xfffb1fef,0x00085fe6,0xffebb4ce,0xffed8d05,0xffecf32a,0xfff0b6a8,0xfff148fb, -0xffee7f9a,0xfff04385,0xfff1aa51,0xfff9ae0f,0xfff03156,0xffecb5c3,0xffe448f6,0xffeef97b,0xfff06b82,0xffed4af2,0xffebcabc,0xffea3bb4,0xffe711e2,0xffeafb0d,0xffec4907,0xffede5fb,0xffee9978,0xffee79d1,0xffe93ba1,0xffebfb14,0xffeae0c2,0xffedf2ec,0xffeab35f,0xffec7a3c,0xfff1f536, -0xfff1ec4b,0xfff42787,0xfffaba6a,0xffef50c1,0xffed51b9,0xffeb36cb,0xffed1b9f,0xffee5598,0xffea23d3,0xfff24f02,0xfff1bdbc,0xffeb2ac3,0xffef2d31,0xfff53fae,0x00080634,0xfff062f5,0xffe52df8,0xffd1c80d,0xffeec3fe,0xfff2476e,0xffe38a2f,0xffdc07f7,0xffd48d14,0xffce6bf8,0xffd97e23, -0xffe294b6,0xffe82946,0xfff0bd9d,0xfff355cc,0xffef6ac6,0xfff6f7b6,0xfffcab89,0x00025897,0x0000d5d3,0x000103c1,0x0001b4ac,0x00016ae0,0x0000ab16,0x0002eb63,0xfffe978d,0xfff6534f,0xfff0fa7f,0xfff0eca2,0xfff35bb3,0xffe57cf1,0xfffacc34,0xfffbb1b2,0xfff2dd47,0xfff9104d,0xfffcd6c9, -0x002a3a71,0xfff7d789,0xffe6bb39,0xffb9c1ec,0xfff02f30,0xfffafaf6,0xffe8a3b9,0xffdea504,0xffd325bb,0xffc79c40,0xffd803d5,0xffe3be90,0xffe77a59,0xfff48fcf,0xfff9a6ba,0x000222eb,0x00046c3a,0x00013bf6,0x00000a86,0x000032cd,0x0000394e,0xffffa1ec,0xffffec55,0xffffdf5a,0xfffefe2b, -0x000143d6,0x0003837f,0x000092f1,0xfff86ea9,0xfff678cb,0xffdd05bb,0xfff7a396,0xfff43b8e,0xffe22648,0xffe76ad8,0x000366c0,0x0042ffc0,0xfff9a5ed,0xffc7ab22,0xff8c2de7,0xffe5d9b1,0xfffbec13,0xffcd1506,0xffad2716,0xff92a1a0,0xff839af3,0xffaa59cd,0xffc9599b,0xffda53d9,0xfff333c4, -0x0000ec06,0x00003815,0xfffdbe12,0xffff3222,0xffffdea9,0xffffb3ca,0xffffccad,0x00003d05,0xffffee88,0x00002655,0x00002cb5,0xffff6dab,0xfffe3e0d,0x00013b97,0x0000ed29,0x000ad6e3,0x0013ad26,0xffff2cd5,0x00123b62,0x0062c08f,0x0047e9f9,0x002f4088,0xfff97521,0x003d7084,0x004c39fa, -0x0029a4ec,0x00121267,0x0014987f,0x0039e501,0x00875998,0x0096b7a0,0x0068ff11,0x0044e3c5,0x00211ff8,0x000ac3ff,0x0006b41f,0x000004a7,0xffffce33,0x0000dbf1,0x0000abf0,0xfffff32e,0x00003393,0x00001ce8,0xfffffb5a,0x000017c3,0x00000eca,0xffffa6d5,0x00009f3b,0x00005edf,0xffffa69e, -0xfffeddbf,0x00048f97,0x001a08a1,0x002d6101,0x004de47a,0x004b3b03,0x001b0346,0xfff238d0,0xffc9ecbd,0xfff2e878,0x00139c07,0x002da82f,0x00502740,0x002f518b,0xffd9f9c5,0xff952c79,0xff75d087,0xff888e63,0xffa8250e,0xffcc0786,0xfff13b65,0xffff7b6e,0xfffe2bad,0x0000c1a6,0xffff48d8, -0xffffd59a,0xffffe1ce,0x0000006d,0xffffe77a,0x0000082a,0xffffdd14,0x000041e9,0xffff78f6,0x0000f23c,0xfffdeb1f,0x00039fec,0xfffa512e,0x00204317,0x005629a4,0x002c8514,0xffee89d9,0xff9b1687,0xffd065a5,0x0018fc8c,0x0042d205,0x005ee9d0,0x0037e890,0xffd51856,0xffa7f5ed,0xffc49b4f, -0x001dab01,0x00772456,0x009a1f44,0x007e6280,0x00604d9e,0x003b7619,0x0010cbcc,0xffffb81b,0x0001472f,0xfffed910,0x0000c11f,0xfffff5a9,0x000035f9,0xffffffae,0x00000f4b,0x000012d2,0xfffffb2f,0x00003ffc,0xffffc9b9,0x00009ac9,0xfffecb7c,0x000411a2,0xfff3f1dd,0xffdaed9d,0xff3b300d, -0xff98e003,0xffdff53a,0x005bb33c,0x00228368,0xffdefdf6,0xff95df0c,0xffa8ca50,0xfffcfb99,0x008ae47a,0x0053014f,0x001ca859,0xffdefe3a,0xffd15dcb,0xffc6b095,0xffbd624c,0xffc64885,0xffcd8f41,0xffcdd7bf,0xfff13bd6,0x000504c0,0xfffeb0e3,0x00002c9f,0xffff980f,0x0000042f,0xffffe144, -0xfffff12e,0xffffe2cd,0xfffffdfb,0xffffb0aa,0x00003d36,0xfffeb833,0x0001af92,0xfff99ec7,0x0011986f,0xffb99d94,0xff56354a,0x0048638b,0x0081ae97,0x005fa8b9,0x005010ae,0x003c55b6,0x001c333f,0xfffa8b99,0xffdaafb5,0xffd92805,0xffcbf109,0xffd81de1,0xffdc7080,0xfff3039d,0x000364d3, -0x00120712,0x00219d84,0x0029050c,0x0032d5f0,0x0010909c,0xfff9618b,0x0001399f,0x00000885,0x0000676e,0x00001c22,0x00003012,0x0000300f,0x0000200f,0x000052b9,0x000004d6,0x0000a5e8,0xffffca9b,0x00020f6b,0xfffd554a,0x000bbd16,0x002e5828,0x00302190,0x000d0b90,0xfffa3c4a,0xfff3776a, -0xffeb8c83,0xffe2413b,0xffe910c6,0xffdeed96,0xffdc07cc,0xffd6f36d,0xffd90c1e,0xffdc8482,0xffe40e9d,0xfff97fb5,0x00073832,0x000d264e,0x001a6957,0x001fe28b,0x0029a2fa,0x001d2fb3,0x0002fe1d,0xffff8fda,0xffff2864,0xffff64dd,0xffffac5a,0xffffafa4,0xffffae9d,0xffff9b63,0xffffa061, -0xffff61f4,0xffffadf6,0xfffe4665,0xffff3cff,0xfffcdd0f,0xfffdfffc,0x00093738,0x0014f60f,0x0011b8f9,0x000e8366,0x0006f501,0x00015d6a,0xfffd6f98,0xfff7e06e,0xfff048d6,0xffe86fee,0xffdf8b37,0xffddaf41,0xffdc06c7,0xffd85c27,0xffdce24a,0xffe0f14f,0xffe531e7,0xffe70fa1,0xffe850af, -0xffea916a,0xffecedb2,0xfff87546,0x0000f829,0x0001fea5,0x0000eb43,0x00006082,0x00006a58,0x00006ba8,0x00009222,0x000076e1,0x0000c0fd,0x00007502,0x00021638,0x0003600b,0x00037e97,0x000710aa,0xffe6fa79,0xffea6628,0xffeafade,0xffeab1f3,0xffeb6860,0xffecafce,0xffecc9cd,0xffed7e92, -0xffef9e3e,0xfff1c37f,0xfff36328,0xfff41eb7,0xfff44578,0xfff46c9b,0xfff71e92,0xfff9425f,0xfffc322b,0xfffe9a74,0x00013dc0,0x00057b69,0x000583b8,0xfffa22b2,0xfff88a25,0xfffac2ba,0xfffe1b06,0xffffcde7,0xfffffbaf,0xffffa191,0xffffbb01,0xffffa522,0x0000134b,0xffff2446,0xfffcd2e4, -0xfff5eb95,0xfff05a0d,0xffee715e,0xfff1f4e4,0xfff2d275,0xfff21dfe,0xfff2a444,0xfff2db08,0xfff2a684,0xfff2ca9f,0xfff2bb14,0xfff22fa3,0xfff1ad76,0xfff18db2,0xfff182d6,0xfff1e3df,0xfff20499,0xfff36036,0xfff45f3e,0xfff52e0a,0xfff65cf4,0xfff76626,0xfff7bfed,0xfffa2ed2,0xfffb56d4, -0xfffc3a02,0xfff5274e,0xfff51e5e,0xfff4601f,0xfff307aa,0xfff228e6,0xfff12335,0xfff02392,0xffeee967,0xffeea8ee,0xffee8eae,0xffef0d3a,0xffefdc17,0xfff083f5,0xfff2a8da,0xfff7593a,0xfff7819a,0xfff7a86b,0xfff8daf4,0xfff97a34,0xfff96103,0xfff8f18c,0xfff934ef,0xfffc2daa,0xfff8c3d9, -0xfff78a0d,0xfff4e310,0xfff7f6fb,0xfff88cb3,0xfff803a6,0xfff81413,0xfff796ff,0xfff5c56b,0xfff74ddc,0xfff7dbd1,0xfff91e2c,0xfff95850,0xfff859dd,0xfff3ddb9,0xfffce431,0xfffcd680,0xfffdc1bf,0xfffd674d,0xfffd95bd,0xfffe31f6,0xfffe2582,0xfffe6fb4,0xffff9212,0xfffd0021,0xfffc721c, -0xfff5381c,0xfff6ddb9,0xfff6f02c,0xfff5e9bd,0xfff99dbd,0xfff9e031,0xfff9d526,0xfff8af4a,0xfffa0e8e,0x00005acb,0xfff7e824,0xfff3dffa,0xffede428,0xfff65c72,0xfff82bd4,0xfff4e4d7,0xfff40b58,0xfff14394,0xffecc6d5,0xfff01ae3,0xfff3b65f,0xfff7d785,0xfffacc08,0xffff6ad2,0x0000dd68, -0x000265a5,0x00011c8f,0x00014e2c,0x00010390,0x00012c64,0x0000da0a,0x0000edeb,0x0000a503,0x0000b260,0x0000fc82,0x00022e51,0x00009f6e,0xfffe3560,0xfffe28b5,0xfff01c2f,0xfffc1c3a,0xfffc57a4,0xfffeae21,0xfffb8291,0xfffb14dc,0x000b0f0d,0xfff9a606,0xfff3e8bd,0xffe62874,0xfff4aaec, -0xfff950e6,0xfff64bfe,0xfff69299,0xfff2b70a,0xffea459b,0xfff09b55,0xfff5241a,0xfff98f32,0x000049a8,0x00018b5d,0x0000197b,0xffff3418,0xffff9ee0,0xffff9991,0xffff9c4f,0xffffb3d2,0xffffc39d,0xffffcd49,0xffffdc49,0xffffcdd6,0xffffa466,0xffff585f,0x00006a1d,0x0001dc57,0x00029a68, -0xffee1fb9,0xfffa6eb1,0xfffc78bd,0xfffd37ac,0xfff72643,0xfffd5b28,0x001231eb,0xfff822f7,0xffe6b095,0xffd55139,0xffeed28a,0xfff85006,0xffeee1f7,0xffea35ef,0xffdf221a,0xffd0db00,0xffdc6957,0xffe81195,0xfff62169,0x0000598c,0x00002106,0xffff58ac,0x000088f8,0x000025b2,0x00003040, -0x00004078,0x00003781,0x0000202a,0x00004429,0x00002b9a,0x00003619,0x00004615,0x00005bed,0xffff7c02,0xffff84ca,0x0000423f,0x00046f89,0xfff9784d,0xfffdd73f,0x0015882d,0x00131967,0x000d103a,0xfff0db3e,0x00193f21,0x0021e100,0x000ed9f7,0x0004defa,0x0000ce98,0x000c5d43,0x00236804, -0x003000a2,0x003155e2,0x0026e129,0x001a939a,0x000f7733,0xffff48b2,0x000004ec,0x00003d22,0xffffee06,0xffffcd50,0xffffeda3,0xffffdf97,0xffffefdf,0xfffff88e,0xffffe635,0xffffe27f,0xfffffaaf,0xffffad2d,0xfffff179,0x00005447,0xffffb845,0xfffb59e6,0x000b26f8,0x00118fdb,0x001e2795, -0x0021a04c,0x00175bdb,0x000806d6,0xffed48aa,0xfff96ff4,0x0002c3ae,0x000d1840,0x00211a4f,0x0019ff6b,0xfffb56a0,0xffdeb697,0xffcb9c33,0xffc93734,0xffd25e7b,0xffe012ad,0xfff27b0e,0x00014206,0x0000268f,0xffffe623,0x000015d2,0x00001851,0x000018f3,0x00000f21,0x000011e5,0x00000930, -0x000010ff,0xfffffd11,0x00004da6,0xffffe063,0x0000a1bb,0xfffee540,0x00022526,0xfffe8802,0x000ea2ca,0x0008575b,0xfff72710,0xffde3fee,0xffdb8766,0xfff1fca4,0x0012e661,0x001b07e4,0x0014c189,0xfffbdbca,0xffdd6a3f,0xffdedd68,0xfffb1fc1,0x001dd959,0x00326855,0x0034043d,0x0028d72e, -0x001af707,0x000860ef,0x0000257b,0xffff8780,0x00006082,0xffffe0dd,0x00000142,0xfffff35a,0xfffff86c,0xfffff54c,0xfffff26b,0xffffff72,0xffffe3e6,0xfffffcc7,0x0000104f,0x00000f2d,0x0000162c,0x00006054,0x000b1ae7,0xffd322c4,0xffd7577e,0xffedc4f1,0x002f0f82,0x00146b92,0xfffcd7f0, -0xffe937c8,0xffd67003,0xffecdcdf,0x00299c3a,0x002bdf28,0x0020fef2,0x00006e3b,0xfff78a6a,0xffefb289,0xffeba938,0xffed4de5,0xfff055ff,0xfff35cf6,0x0000c97a,0x000048ba,0xffffc468,0x00001885,0x00001500,0x00000a83,0x00000fa0,0x00000fc6,0x00000bda,0x00000c7e,0x00001341,0x00000570, -0x00000e4b,0x00001448,0x00003812,0xfffcf226,0x00025eb9,0xffe1bb34,0x00369132,0x004c2e34,0x004cfba7,0x003e6a71,0x0030866f,0x001d1c4d,0x00094c5d,0xfff8a357,0xfff3fe14,0xffeb1e52,0xffed109c,0xffee9915,0xfff7062e,0xfffc7288,0x000089d6,0x0007f28a,0x000b2f6d,0x00105f64,0xfffdd22a, -0xffffff1d,0x00007abc,0xffffcd05,0xfffff2b2,0xffffe703,0xffffe9ed,0xffffeb23,0xfffff014,0xffffe708,0xffffe419,0xffffe788,0xffffb4f6,0x00007271,0xffff2170,0x00013ce2,0x00034572,0x0008ad2f,0xfff407a3,0xffea85c2,0xffe95d30,0xffe7b4ac,0xffe8e08b,0xffefba95,0xfff24560,0xfff4e4e7, -0xfff572a9,0xfff5fe57,0xfff75684,0xfffb717f,0x0001bf9e,0x00071011,0x000a1157,0x000e5211,0x000de0ec,0x00118452,0x00027526,0xfffe7d93,0x000077e3,0x0000066a,0x00006527,0x000026f6,0x00003145,0x00002312,0x000032b6,0x00002e6e,0x0000491b,0x000027f1,0x0000a757,0xffffa555,0x000179d9, -0xfffcf17e,0x00047e19,0x0013021d,0x000eb213,0x000e7890,0x000a26e3,0x0006219e,0x00024dd1,0xfffe10f9,0xfff98093,0xfff540ec,0xfff0e28e,0xfff0fcc9,0xfff11312,0xfff06873,0xfff221a3,0xfff389dc,0xfff5243b,0xfff5715b,0xfff68385,0xfff5830c,0xfffd0bfb,0x00023519,0x00003a26,0xffff7590, -0xffffa0cf,0xffff9d7a,0xffffa132,0xffff9a4c,0xffff86a6,0xffff9120,0xffff7eff,0xffff849d,0xffff6dfe,0xffff5cb0,0x00003bae,0xffff91ce,0xfffab350,0xfff9b7c8,0xfff88d02,0xfff78009,0xfff6cf86,0xfff6db6a,0xfff65039,0xfff5e15c,0xfff65868,0xfff6ba47,0xfff6ac9c,0xfff65c32,0xfff58d46, -0xfff49577,0xfff55fbe,0xfff5f1f2,0xfff6f660,0xfff77e51,0xfff8d54b,0xfff939a0,0xfff9b59e,0xfffe3f01,0x000109d7,0x0001d659,0x000168d1,0x00017a89,0x0001317c,0x000177bf,0x00015daa,0x00017845,0x000125b6,0x0001bf24,0x00017729,0x0001d55c,0x0000bc8c,0x0000bafd,0xfff791c0,0xfff9cb0f, -0xfff93aa6,0xfff92570,0xfff8f7a2,0xfff8848a,0xfff847dc,0xfff803e1,0xfff77ff2,0xfff6f7d2,0xfff6a07c,0xfff62c9c,0xfff5fd96,0xfff5ada6,0xfff63a65,0xfff685ba,0xfff6c4f9,0xfff72f17,0xfff756e1,0xfff8219c,0xfff7b122,0xfff7784f,0xfff68a1f,0xfffcae7b,0xfffcb53a,0xfffd35e7,0xfffd11bc, -0xfffd0522,0xfffcf930,0xfffcff01,0xfffcfd89,0xfffcff41,0xfffc9a53,0xfffceec8,0xfff60ae3,0xfff6eb5a,0xfff60a41, +const Word16 defaultHRIR_rom_E48_Q_fx = 28; +const Word32 defaultHRIR_rom_EL48_fx[HRTF_MODEL_N_SECTIONS * 470] = { +75424032,74531904,86612200,66107596,75444368,75727784,82244496,84548440,86432144,81644744,78654600,75132304,72713520,70622328,69310368,67758128,66404528,65047140,63993372,57231440,73522264,66414948,76822592,127171776,64817104, +73873304,114188832,116968976,114309384,99533048,114609576,118095880,113416904,75929376,71080128,123744688,88490240,108216048,103026360,99406752,113982960,121567712,145147152,156287776,157814048,141771504,126916336,111613680,100926560,93788352, +90145256,85658000,81464256,78167208,71771144,65427948,64309520,66181292,40021936,44732696,34530948,33813708,38895224,38562476,44852792,42714884,44328724,44021216,37415512,43703756,44796304,51879936,63726004,79100824,98505048, +148871632,159705120,183833440,234245328,259008368,269627520,234074976,203012800,171337520,146485232,127769984,116953464,103983080,92973936,85716296,67963720,64276720,39233372,36672092,26075804,24379304,20735684,19898804,17928572,18870112, +21044484,23990268,17020900,21224552,21338016,25477764,30193404,43366716,57023748,91722512,133646072,205794592,239306576,294192960,387730976,450490176,459574368,370752512,291993600,214652896,164227728,137433760,126617288,111184768,97328064, +89036920,68463760,54185088,32091356,23118216,15687906,12887863,8729430,7101252,6261466,6853817,7608754,8691827,6511330,6658606,8836663,13511358,25566096,30537112,49869524,209668960,337940192,443906624,466545344,495262720, +481467872,489418304,524847008,530943488,554122816,558894400,544865024,497801152,433887552,345133248,263490736,200545216,123496368,88223928,55816504,38373596,21390416,15083886,9904214,8186400,6804421,8640906,8916849,9173325,9321409, +12200822,19901988,29311332,45288548,61664532,118390080,211950656,260648128,691361536,735024448,725242496,604737408,608751552,630492096,592162624,574645568,574388608,564391296,541691968,503884864,389209664,292789248,235308688,146704464,112014448, +61059164,51831636,30422924,21220984,12752174,9770286,8032490,9453006,10947717,13576384,12619420,14283200,19747668,26282912,39149144,62333788,103109072,290779328,521571744,1078241024,1034127168,1310186752,837233024,715114496,659689600, +548610880,556907776,624036672,644475264,642998144,592013440,460868224,329849120,232485056,145865232,114721888,61804144,52640656,36698544,35777520,21235736,16203012,18657140,15161718,16737635,27557588,15156105,15142011,20744192,44974140, +49343412,129457744,99993464,327964704,683397120,1176980864,1052747840,1331785600,779853056,611930624,550641664,605276352,649373248,641033792,585743040,524077920,436253440,333468384,243011920,170636448,122449408,101354928,67784680,58921164,38776788, +34904800,24086396,18787040,16490707,13669495,16938356,43667848,19193076,16523645,21472156,25285376,40862836,59750228,99086064,271379744,444236384,739872576,654157824,648109760,505718176,464204384,459449056,427852832,442023936,509693248, +457745344,396424160,314269120,226664816,166402944,133290776,113346472,103902736,86816432,66629940,48962084,35720748,29233276,24562032,19062744,17491388,19163568,29593580,21461188,23274132,30028856,39221780,49085460,73847608,205127568, +254314416,238987888,301799360,277785408,286802176,297969600,302244480,302528768,288127360,281675328,265445600,232091344,205192560,186600720,170878640,143012064,113593536,100100440,107315664,75732144,76162480,57204012,54469112,37980280,26806928, +22260844,22272656,23937744,27159244,26509924,26622408,28229680,35367772,49204344,61695080,103900336,121836624,150744496,184140832,203732128,241799248,238494064,243529408,254406576,238071328,229021328,223715616,196645056,176162752,159002704, +142573648,126615712,113759296,102784304,104346592,88544576,78699928,64252684,56108540,47242052,46300468,38800868,41727152,38729736,45043312,33026112,42383008,36289152,49830928,62840180,86417056,98489248,175154480,148011104,140740992, +149134064,157170480,166445856,178327424,193492944,180518480,172019056,163781328,155136512,148126496,141112592,133503280,125272064,119077872,113600400,106619200,107246552,116209160,81543168,87060144,78315008,73011768,80010928,81078632,90033040, +81888096,89724920,86719264,75640904,85811864,89835984,98729832,112974520,134017744,149660336,121699712,131946000,132059824,136090496,138353120,143540832,137312976,133961288,130414200,127615872,125114080,122723568,121536504,120188880,118288392, +117488112,109849176,131830176,123267312,139041856,209242944,120840096,133313064,195531760,201218528,193271856,171945984,192158256,195252208,185356768,136327296,130708192,208138288,150904736,155491792,457273,581468,672841,314624,397486, +325463,501682,555154,541776,534143,509766,467249,455632,454101,472514,482933,485397,478153,474794,367943,662031,587663,709725,1569022,593989,668464,1356237,1384143,1362176,1129444, +1307708,1314683,1208362,646890,634213,1409685,804648,781185,640797,350550,362424,265397,745029,975938,906049,932714,849132,742854,678339,677333,747903,808799,834216,815759,712475, +614223,621386,635322,250878,355173,146929,132907,242847,250547,386293,351146,358032,288248,150882,189346,147806,329365,410334,415314,423081,449648,387439,210724,1213597,1836708, +1630295,1677493,1440459,1254278,1093602,1046466,1194394,1212244,1221458,1176314,883958,921552,411734,449705,344857,298076,193553,147608,123395,169157,259566,289813,166020,157031,105385, +95105,117016,402221,272083,452134,444074,319541,199409,163711,1625127,2904070,2566007,2642036,2340424,2125016,1877170,1900759,2151683,2330611,2368381,2173743,1534689,1158661,664065,582982, +540751,533599,305974,161929,123061,201557,302508,408482,278192,211560,106745,167690,152165,804935,511976,1883612,1268526,1814416,2035953,2828216,2678713,2698490,2929046,2387135,1868436, +1993263,1657611,1209427,623574,320599,317405,858750,717707,1164291,712205,652236,546213,505650,286511,203635,159117,73504,92147,380932,311623,412702,419875,530776,299554,693775, +1350988,2016922,2659034,896468,492285,1498331,1569492,1139029,755025,336907,339389,314231,219531,224988,254853,588645,1255639,2359261,1245588,766692,262255,172126,119631,146837,176778, +141864,86411,140317,169609,169364,55400,68931,242814,447007,442440,678607,1591980,769486,1046903,767022,1283064,5283437,7109361,7882903,6970852,3952947,2287401,1351171,2629292,3472469, +3190349,2077689,778527,131581,167846,309562,410891,190438,84792,102596,91382,43064,42910,36102,18098,14754,72589,124612,156585,217389,316960,461457,534984,1847588,2370173, +4977580,6899353,10881322,6914001,3613464,1041372,708254,712437,749959,574262,476245,294202,509748,743700,806840,658588,379981,198025,148224,106905,93689,89881,56948,40610,21736, +25825,42039,53642,76195,233837,188116,425821,881583,1383544,3817024,5852594,8898330,7139428,5688002,5014605,4450394,3011134,1877650,1501713,1910378,1174649,849479,692510,228194,104290, +87347,79673,88650,116235,91838,75499,67376,36416,36478,68031,36760,46732,77072,152855,300847,530407,1460157,2120205,2204150,2908754,2938950,2686862,2806730,2115109,2048390, +2117296,2100549,2289245,1004884,752320,726157,748073,734162,585963,640227,592124,443872,364657,210095,63260,74194,65390,103870,81696,121092,239308,341502,478933,608979,922984, +1220127,1446979,1357547,1392296,1660778,2105521,1374535,1464505,1506561,1613952,1998300,1878383,2062805,2547836,1908001,1535251,1335171,1017093,764424,602545,490830,409905,354686,257042,229580, +177737,137209,69108,98135,131226,212691,332249,423223,524148,715885,729030,830857,970042,1046455,1205084,1392134,1316620,1063725,940863,884877,893729,917520,985662,1066001,1205378, +978485,866429,761796,676832,605275,566730,471420,392802,321879,262820,206896,169966,199331,204224,279384,249346,331589,440782,491320,584509,617745,687960,742124,797398,802492, +798368,824091,865033,828424,802567,727647,765993,770186,804340,831237,894537,819384,773831,734621,683592,642072,604551,574490,544419,518187,490375,458539,448916,540488,628686, +928195,631115,715451,1072756,1080336,1040782,958925,1025583,1027310,1013241,839308,819317,1094094,883692,901546,19002,26862,30260,13541,17143,15496,19999,21698,21211,22432, +22339,22177,20786,20663,22556,23108,22792,21187,19459,14388,27512,26173,37729,70097,25666,36679,60513,63170,61758,51003,60917,61549,56396,33871,25134, +63523,43589,40537,27939,20268,23007,25974,35955,40262,34886,39520,38436,39765,32424,38074,53607,62781,60921,48661,33667,26239,24226,32084,7569,13491, +11301,11180,10088,11665,16495,18304,16887,14065,10801,7572,5939,16128,14813,17779,19371,28167,32052,43254,68251,82591,69084,75276,74139,83441,59982, +63500,96890,104149,98125,73568,40381,37213,16837,15333,7496,8713,19969,16508,18093,14089,27295,63102,57184,41210,28906,7531,3945,23242,8974,20525, +21103,53445,77740,138719,149161,162638,112967,115358,108419,148030,79895,137050,287984,360742,327266,230359,122634,87112,64379,40435,16730,30035,40294,26848,19044, +17078,18278,42021,89359,78903,68086,40130,14773,66682,23313,184369,163944,334823,317755,267605,151629,128157,185487,129025,188186,291928,255291,195714,275816,225204, +178103,206401,202451,255362,211505,160494,102968,78578,39303,16826,18126,17178,22834,2607,3495,35825,97790,85349,77511,53041,112093,205271,97328,107018,99521, +207969,280519,299408,84341,51440,56433,260865,185456,230433,225722,132754,144346,162464,110730,66787,55012,21612,11004,7448,6355,2830,9652,11540,14941,6332, +2452,15689,65519,255479,237798,125507,101883,1026146,1854573,419495,122575,497892,480738,543293,587618,427568,361388,252511,178783,248702,260613,174964,109183,56273,33962, +26629,21574,11382,6605,12984,11627,6964,8552,436,2535,935,3766,10885,19517,17434,18870,87216,453185,463609,967392,392838,306612,596657,434724,255262, +193097,96565,113790,76502,35896,51997,60858,62659,62299,62683,47532,42013,35343,33289,23941,17908,3761,354,1101,460,1030,1251,248,644,11300, +15818,22428,200378,397319,253038,248618,301842,274144,201348,182251,192472,164262,163791,176326,203428,152101,106767,80320,26958,8011,12370,27771,46622,64206,70473, +57449,45091,17929,5546,1099,1463,2763,3410,4810,4777,8515,2801,6772,36085,169257,93935,97710,121131,101887,97087,90500,102481,133438,89120,83346, +92716,84758,73671,52899,36023,19612,10477,10184,10939,17230,19273,14998,12724,11045,9801,9009,6703,11945,16711,23564,26909,26735,34730,45709,51031, +64545,55701,54292,50741,40091,32645,27558,29181,37466,31064,29283,27289,15526,10705,12441,11101,11313,13895,13152,16265,18145,20786,22283,25967,20327, +21291,29235,25854,25904,32356,31662,35402,43894,45605,55381,65914,54603,45881,38275,33739,31729,28368,27118,27435,32126,26080,22706,19894,17198,14816, +14254,14388,15638,17466,19700,22144,25448,25575,24995,28190,29142,34862,41120,38633,40485,42540,42977,45770,49173,44055,39053,38818,36051,25919,23283, +20112,20263,20196,20401,20861,22012,20275,19401,19058,18748,18977,18732,19812,20283,20908,21888,22243,25329,26653,32574,44017,28817,35656,51560,50819, +48333,42517,45261,43583,42144,31960,26373,40707,32340,28572, }; -const UWord32 defaultHRIR_rom_AlphaR16_fx[470 * 43]/*Q30*/ = { -0x20bc5600,0x1e5ed260,0x20e8da40,0x188db140,0x12958b20,0x0906c690,0x1a999ee0,0x12ba4920,0x097dce40,0x0906b8e0,0x08f8ab10,0x09bc0990,0x085c3450,0x081bb920,0x08157b10,0x123510e0,0x18bd42a0,0x07506690,0x1230f920,0x1711f640,0x1ee77fa0,0x1c814cc0,0x1dac1bc0,0x1e1c44c0,0x1e7a0b40, -0x1ee88080,0x1f50d220,0x1febad40,0x2085ba80,0x2129d500,0x21bca140,0x22401bc0,0x231c2200,0x227fd880,0x21e17340,0x2090c740,0x1fec8d80,0x239775c0,0x22918780,0x1148e780,0x1c908300,0x15dcf3e0,0x1546c9e0,0x176b49a0,0x15864820,0x17de99a0,0x1652d300,0x13666440,0x15d3e660,0x15857380, -0x1533c000,0x11ef5f40,0x141e81e0,0x15ce7080,0x163fb3a0,0x0ec15720,0x1c5a3ce0,0x1d7f55c0,0x1e7d0be0,0x2023db80,0x20f12d40,0x2229f440,0x236884c0,0x25063640,0x26c3e400,0x28b2f780,0x2aae0480,0x2cc17d40,0x2f0af400,0x2e77cec0,0x2c671ec0,0x284489c0,0x25d28c00,0x25b2b200,0x207c4f40, -0x16c150a0,0x168bb320,0x0ff50dc0,0x0ffde430,0x0ea60190,0x0da4afd0,0x0ab40c40,0x0d861f50,0x08d9e1c0,0x0e7afe50,0x08b0c1d0,0x0d191480,0x09d24050,0x0d610d70,0x0efb5c40,0x0ee63660,0x1017dea0,0x15d2ae80,0x1b7c1f80,0x1cdb25c0,0x20b38ec0,0x226761c0,0x2518ce00,0x279bf100,0x2aea6cc0, -0x2e31bc80,0x31e3d6c0,0x35237880,0x3892c880,0x3c40eb00,0x3a9ebd40,0x36ee5b80,0x2ed9eb80,0x29365440,0x28b68b40,0x1eba78e0,0x12220e40,0x12162c40,0x0d09d180,0x0ad1d260,0x09b99980,0x066fd2b0,0x04f7e9c0,0x032a5cdc,0x03fff268,0x0195cbea,0x01d69630,0x034b65e8,0x030ca4c8,0x05dd2d98, -0x03cb52ec,0x092141c0,0x07c3c848,0x0fcac260,0x169d8ac0,0x190c8660,0x1dee9d00,0x2003c240,0x23845fc0,0x27225180,0x2bc18a00,0x31088740,0x36e87a40,0x3cdcb080,0x43e41500,0x4babb200,0x4adb6400,0x44364980,0x36b67d00,0x2cad6280,0x2f7e8f80,0x20e47840,0x1902ea20,0x13c03580,0x0cd7b3b0, -0x09a8ae60,0x09e8db80,0x0703ba00,0x06189e30,0x04b77ea0,0x04e34a00,0x03aa9e24,0x02d68b60,0x01f5b88e,0x045d0ee0,0x070eff08,0x06dc95c8,0x0c901270,0x0df5f870,0x16ea2e40,0x22c46680,0x28507440,0x323e8e00,0x38456f80,0x3fb0dc00,0x46cff480,0x4c41e000,0x50e9d580,0x52c3cf80,0x597b0380, -0x586a6400,0x50c5e700,0x4b327980,0x44f16000,0x40681b00,0x36625a40,0x38766b40,0x25ef9300,0x1a956780,0x1a3c8580,0x17d3a240,0x0ff8e640,0x0e039d20,0x089276a0,0x06682370,0x03644abc,0x04283ab8,0x040c1a20,0x03d1728c,0x05abffa0,0x06966390,0x08c5d3f0,0x0b5c5540,0x10beec80,0x10a51ae0, -0x197a4560,0x24304e40,0x276c88c0,0x2eeaba00,0x335d8b40,0x3a05d200,0x41947700,0x47185900,0x4ba6fe80,0x4e10e380,0x55321400,0x57da3380,0x535a4900,0x54f15080,0x503e6f00,0x49f44c80,0x3e4abec0,0x4913d000,0x32358a00,0x19e25720,0x1b603120,0x124a02e0,0x14894380,0x08ce7910,0x0a5b96b0, -0x053e1c60,0x0812d490,0x078062b0,0x0522cc58,0x067c96b8,0x08908b70,0x0978cc30,0x0ded6e50,0x0e5a38d0,0x105c0fa0,0x10c50fc0,0x15a20420,0x1e2a3780,0x2130c780,0x29749ac0,0x2defba00,0x35cc6d80,0x3f2e4540,0x471c9a00,0x4dd07400,0x5293a800,0x50425400,0x4dc00400,0x4d0c5700,0x4eac8100, -0x51ac5500,0x55adbd80,0x4e198380,0x4cefa880,0x386c1300,0x22551100,0x21f0aac0,0x102923e0,0x13f66fe0,0x0bd31a20,0x08bddda0,0x05b44180,0x089ec630,0x0e38e4b0,0x084a3120,0x053caef8,0x06060118,0x0a3380e0,0x0aaf1b60,0x0e301750,0x13d4d0c0,0x0ed015e0,0x1715a160,0x1bcf4fa0,0x1e6259e0, -0x25ad2640,0x2f9e2f40,0x375e08c0,0x3cbecf40,0x44ee5280,0x4aae0980,0x4e6b1b00,0x55f64000,0x59afbf00,0x5b16a400,0x54dd4700,0x4f3cd280,0x4cea8500,0x4df9a100,0x4ec01b00,0x3ec9edc0,0x2483fb00,0x1e73cb40,0x1a751240,0x0f44f510,0x12715b40,0x13514640,0x0a7623f0,0x0b325a00,0x088d31e0, -0x082315f0,0x0904d9a0,0x0a864840,0x0ccf10c0,0x0d317c60,0x114cc940,0x14275200,0x11b7bce0,0x20a7b640,0x244e1e80,0x21dfe5c0,0x1fc17100,0x260bc980,0x2e2301c0,0x3935e180,0x40c79000,0x489d3380,0x4ff56b00,0x5158a600,0x530e4280,0x57e80800,0x54695a00,0x536ff480,0x52787d00,0x52f45300, -0x446dca00,0x3a190cc0,0x22467780,0x20f5c2c0,0x15f3a8c0,0x14681800,0x13f70240,0x0e3e9b70,0x0febdb20,0x0e512250,0x123d3c40,0x08d395a0,0x090354d0,0x0bca0b70,0x0f41f130,0x13333680,0x19132920,0x193633c0,0x185719a0,0x227b6b80,0x2a46b2c0,0x278d7780,0x240975c0,0x26f26980,0x2b2b8fc0, -0x30aaea40,0x35eb46c0,0x3ae54500,0x3fcfbdc0,0x43921480,0x47837800,0x4a97be00,0x4b258b80,0x49efad80,0x46684980,0x44f54300,0x3c088dc0,0x31c87480,0x23d27940,0x25ee06c0,0x1a77a1e0,0x182afe40,0x13ffe420,0x10299ba0,0x0c3a1eb0,0x1319fea0,0x0af23e90,0x1805ea40,0x0aee8fe0,0x13735da0, -0x0c7f25e0,0x145ae780,0x13cb80a0,0x17492bc0,0x17396480,0x21dd01c0,0x286cd000,0x24e0f280,0x26df7580,0x28c33a00,0x2aa7d200,0x2b7c1600,0x31212640,0x35917380,0x39e36080,0x3d4bc880,0x406ce300,0x43de1b00,0x43377500,0x4299a400,0x42a1ac00,0x3cc23480,0x334b1580,0x33a8abc0,0x1345d280, -0x2a8a4480,0x1f3a0900,0x1f0aad80,0x23e50b00,0x20d896c0,0x26f6f7c0,0x2518d9c0,0x1e7e4ec0,0x23e73580,0x23c85c00,0x22b82240,0x1c616dc0,0x2060cd40,0x22877d00,0x21bc8c40,0x10d6de40,0x2af9de80,0x2b9cda80,0x2bf7af40,0x2d2c09c0,0x2db65380,0x2ef662c0,0x2fbcd040,0x329d0b40,0x348af9c0, -0x368c7300,0x38107cc0,0x3982c2c0,0x3b725400,0x39375b80,0x375475c0,0x3604c540,0x342f08c0,0x2ff57880,0x3579e7c0,0x257cebc0,0x1ab2cf80,0x08fb9dc0,0x2ac59f00,0x1b0176e0,0x09b698f0,0x08c33910,0x0885da60,0x0aad1c40,0x07e6a3d8,0x076e0038,0x0786fb80,0x1a5186c0,0x26eb2340,0x04f05738, -0x19c4aec0,0x22ee4c00,0x32f55080,0x2d944000,0x2f408080,0x2f655740,0x2fac0b80,0x2fdaefc0,0x2fd9c880,0x3077a900,0x30fdd700,0x3191e580,0x324f9c40,0x32f64f00,0x34080580,0x332a5940,0x32c2ba80,0x32109200,0x31fef840,0x36429c00,0x138d94c0,0x135a5b40,0x10e20300,0x17dfc3a0,0x1bb0a4c0, -0x2126e240,0x13e05900,0x19cb2420,0x1fb90ac0,0x1fc95840,0x1f802500,0x1f0c6be0,0x1fc8a8e0,0x201b2040,0x1ff87f80,0x199cfde0,0x14860180,0x21548dc0,0x1a7f91e0,0x170edf60,0x100dd460,0x1232c5c0,0x11975240,0x1155af20,0x11400a80,0x113eb1e0,0x117d1320,0x116c0320,0x115fefa0,0x114d40a0, -0x1132a140,0x11447d00,0x111aa660,0x12038b40,0x12630320,0x12c0bd60,0x12bc9820,0x165c09a0,0x16c49d20,0x21645680,0x15a82280,0x184ada80,0x17a08f20,0x1461af60,0x143dbd60,0x10da3860,0x1211cac0,0x14d0dba0,0x12b219e0,0x127c8460,0x126d9a20,0x15d0e480,0x15320a40,0x14bfe720,0x15810d40, -0x1cb0ee40,0x13de1020,0x139515e0,0x139ceaa0,0x12c1c320,0x12baeba0,0x12ea2640,0x13cc2ae0,0x13d2a0c0,0x13b124e0,0x1342c700,0x125050e0,0x11a6edc0,0x10c54fc0,0x12b89d60,0x14470620,0x15b2f6a0,0x16673e40,0x1aa60e60,0x1d2e31c0,0x1e3397c0,0x19214380,0x18341ac0,0x161f0b00,0x140093e0, -0x11d70e60,0x116ec920,0x0ef897a0,0x1322db80,0x0f57cf10,0x126d6900,0x0f8db6b0,0x12d2b620,0x12263e20,0x13119840,0x1511f080,0x16aecec0,0x1587e2a0,0x132cf740,0x138936a0,0x11920320,0x113513a0,0x112fd320,0x129acca0,0x128d10e0,0x127742e0,0x11f5d580,0x10f429c0,0x107e6440,0x0f141d90, -0x136f7400,0x161daea0,0x19837e60,0x1b9144a0,0x1e6c26a0,0x234fa980,0x22ad61c0,0x1a76fdc0,0x1591b840,0x1381da20,0x10261fe0,0x0cf15090,0x09c319e0,0x08e99b90,0x09542d90,0x088b6930,0x0874efb0,0x0864b400,0x0aa42d90,0x0c391ff0,0x0f09b360,0x106c4920,0x14fb6400,0x1590f960,0x14878680, -0x1498c560,0x12cc78e0,0x13154ce0,0x1407cea0,0x16dd98a0,0x177dd820,0x1725bd40,0x1579fc60,0x120900e0,0x0e209310,0x0921e760,0x0e7202a0,0x1402ac00,0x1b210540,0x1f959900,0x293b9200,0x29a7ce80,0x27ba3700,0x22fecdc0,0x1cae3000,0x18e07e40,0x13de8fc0,0x0f7c9570,0x0b440630,0x0905a220, -0x0a1c1070,0x09d2a590,0x09c4cfd0,0x093437f0,0x0a963a90,0x0c901930,0x10ba3a80,0x12a04ea0,0x167d9c40,0x14f1cce0,0x12895a00,0x11b0eea0,0x0b4a4590,0x072fb460,0x037017fc,0x026fa398,0x0102d50c,0x0245e180,0x07c243e8,0x08b91dc0,0x10ce3b40,0x1dbc4660,0x23d99f00,0x27e34c80,0x28bf5e80, -0x2a339b00,0x2638bd80,0x2e1ec100,0x2f185300,0x272ee940,0x213390c0,0x1d0154a0,0x17445bc0,0x161831a0,0x117b7c80,0x0efe9760,0x0f60e430,0x0a1a46a0,0x085faed0,0x07b3ea60,0x0a4eaa60,0x0cb0d7c0,0x10730da0,0x12a3ef00,0x1956d960,0x1b12dca0,0x1897d7a0,0x186d09e0,0x135eabc0,0x12fed440, -0x11642620,0x0fa26360,0x11269e60,0x14305380,0x1910ad60,0x195b63c0,0x1cfab280,0x25b24940,0x25739b80,0x28810e40,0x2a8d5000,0x294a5a40,0x1f018200,0x2ba8d480,0x34506b80,0x269abcc0,0x245c1340,0x1b2743a0,0x1b08ab40,0x148b3160,0x12a87d60,0x12314520,0x1bc26960,0x13e054e0,0x1280eae0, -0x1002ab80,0x0fbddac0,0x11046800,0x166dcfe0,0x1a1de240,0x1d1cda80,0x1ee257a0,0x1d1790c0,0x1c84db20,0x17aa3160,0x168308c0,0x12d08980,0x0e6501d0,0x0ccf29a0,0x0f68da10,0x15ef3520,0x24881800,0x2ef3f140,0x3284d580,0x349dacc0,0x2cf17e00,0x1fb71c60,0x21dbb080,0x149e3940,0x25b36080, -0x31374600,0x230f7480,0x264602c0,0x1b9660a0,0x1a8c5da0,0x17ec9880,0x14681aa0,0x1666e0c0,0x269f5f80,0x125c9f20,0x0e6540a0,0x148384e0,0x156a7c00,0x194a41c0,0x1ce543e0,0x1cefa340,0x2174b500,0x1f67bec0,0x1eb8a700,0x1dc432e0,0x19f6dcc0,0x146ea840,0x114f1820,0x116dda80,0x0f9287c0, -0x11172f60,0x14edac60,0x17c223e0,0x1c7711a0,0x1f6ca480,0x2835ab80,0x2f1f31c0,0x32157980,0x2098a280,0x0f49da30,0x13fd4c40,0x2a897000,0x23e4ea80,0x1f19e1e0,0x21a0d2c0,0x198ff6c0,0x138a1a80,0x1972b1a0,0x18795aa0,0x1ec73860,0x182bb6c0,0x16561840,0x16768520,0x1771b000,0x1b4c83a0, -0x1c851940,0x1edcc860,0x24bef4c0,0x1d19f760,0x1ad23180,0x1e7e5e80,0x222728c0,0x1ec42ba0,0x19f73460,0x134638a0,0x10013200,0x0d2b1f70,0x0c000560,0x0f311b20,0x14e00c00,0x1827e440,0x218b96c0,0x228ce1c0,0x1e9682a0,0x175d3920,0x10c0ec40,0x161d7360,0x2b35ed40,0x22339cc0,0x2300ef00, -0x1e2edc80,0x197b1da0,0x1af823a0,0x1980e9a0,0x1a62a8e0,0x15711d60,0x1c2dd3a0,0x1b369a00,0x19a3f6e0,0x19cc17c0,0x1a6c7c60,0x197c7940,0x1e059ec0,0x23a98180,0x1bd725e0,0x18b2fb20,0x1e3cc8a0,0x21cbc080,0x2207c480,0x208e7880,0x1dcf2b60,0x1c042f00,0x1bbef2c0,0x1d9a7800,0x1da99e40, -0x1d5d91e0,0x1cd19700,0x205b74c0,0x20ddc400,0x1e6af4a0,0x191f1b00,0x1656db60,0x1d86b0c0,0x28727b00,0x2051e7c0,0x2753c400,0x2381f640,0x22ac4280,0x1fcd4540,0x230f2840,0x1b68d820,0x22640a00,0x1731f340,0x2246e4c0,0x1bab8220,0x234c9280,0x1f0a44a0,0x21ff0a00,0x221611c0,0x25e8be00, -0x1e855400,0x1ba47740,0x23997940,0x25cd8ec0,0x267e8300,0x26ebe780,0x28b07100,0x25c1a640,0x23a23bc0,0x215da900,0x1f69c040,0x1dd91c80,0x1c1273c0,0x1af7f4a0,0x1ad3d420,0x1adad3e0,0x1be49460,0x1641b080,0x1546eae0,0x3676c000,0x19e3f3e0,0x23e61140,0x21bae940,0x1a5f1380,0x1a7a5920, -0x1450b9e0,0x171e3660,0x1d2ed320,0x17b1d480,0x168d0060,0x16ea59a0,0x1fa85bc0,0x1d81a700,0x1d1a1a00,0x1ea52500,0x326e7380,0x18ff2b00,0x199a0840,0x1ba7fee0,0x1c7c6960,0x1e0c3a80,0x1f089d00,0x208c28c0,0x1db43560,0x1c17dc00,0x1a77a8c0,0x1973d8a0,0x18534b80,0x173bc880,0x17676340, -0x17783ea0,0x16d4a0a0,0x17263020,0x1280aa60,0x0b8eb6f0,0x20299ec0,0x2b47f900,0x3b0fff40,0x17656400,0x285cf540,0x37927600,0x38a97c00,0x38596940,0x35ff6740,0x38834840,0x3947c000,0x38c14d40,0x282a0300,0x1a540940,0x3d324400,0x2a767380,0x21084c00,0x0c7810b0,0x135351e0,0x12759560, -0x12f18440,0x138da620,0x141bc0c0,0x152f54a0,0x146a31c0,0x140810e0,0x13856ec0,0x12ddb3c0,0x1240b3c0,0x11802800,0x117aaa00,0x11549cc0,0x114cb880,0x10fefe60,0x11532fa0,0x09419a20,0x077f9350,0x07bec660,0x07510f60,0x0713cf90,0x06cfb308,0x07c29688,0x06f04d18,0x06366ed8,0x062efa70, -0x06673cc8,0x0712b990,0x06d51a28,0x06b30ff8,0x06672a40,0x0723e2e8,0x08052990,0x06a9b908,0x07506a38,0x07e47b48,0x08b812d0,0x08c114d0,0x08f145b0,0x093712b0,0x094f8d40,0x095897f0,0x09446240,0x091c8590,0x090bc520,0x09179bc0,0x08fb38b0,0x08ac4130,0x08444f30,0x077ebc28,0x07333d38, -0x071f95a0,0x074e6f80,0x063503a8,0x067960c8,0x076075f0,0x08040a70,0x0872ebf0,0x0765e910,0x07751360,0x07e830d0,0x086e5fe0,0x08ca8a00,0x09a25f20,0x09980830,0x098cf8d0,0x08b3b3f0,0x08e6e8f0,0x0902d3b0,0x098248d0,0x09ab9cf0,0x09320b40,0x0992be10,0x0a013020,0x0a757140,0x0b247930, -0x0b6d4520,0x0b5bf1d0,0x0aeee870,0x0a6f9f10,0x0a5d3380,0x0a97ca90,0x0ace2d10,0x0a299e60,0x08fc0a90,0x069dda20,0x056fed78,0x0556bbe8,0x05aee7f8,0x02ad9adc,0x0436c2d0,0x0776f7c0,0x082d9e30,0x09626ce0,0x07af63e8,0x071f5d00,0x07963f88,0x07425888,0x087e3610,0x0ad33210,0x0a9233e0, -0x09e0cf50,0x080bf170,0x094063b0,0x09a3cc10,0x0a2ff660,0x0a882df0,0x0b11cf10,0x0a5bf0d0,0x0b06fc10,0x0bff7e00,0x0d25fd90,0x0dfb04c0,0x0dffc440,0x0d666c70,0x0c650dd0,0x0c086ba0,0x0c1e2420,0x0c0f6af0,0x0a630850,0x08206250,0x03278218,0x0143e0cc,0x00a1dd9b,0x01656196,0xfeadd870, -0x018ac20e,0x05f27a88,0x064eaa48,0x085ea120,0x063b72f8,0x04e3d4a0,0x05f12f98,0x05a40a28,0x06ec1ed8,0x0af42f90,0x09b3c500,0x09f86000,0x089b2f20,0x0a57f930,0x0ab7c8d0,0x0bd10450,0x0c92c2d0,0x0d751620,0x0bdeb280,0x0c2e98a0,0x0d61a620,0x0eede1f0,0x0fd45220,0x0f98dcb0,0x0e233650, -0x0c723350,0x0c4a0700,0x0d640c80,0x0ebdf010,0x0dd95840,0x0b3719d0,0x0387f980,0xff43633d,0xfd05b49c,0xfdd3fb58,0xfa2372f0,0x081ff210,0x0f1a5250,0x0f83b4d0,0x1140e960,0x1032ade0,0x0ddf53e0,0x0dd0c6d0,0x0ad1dc60,0x09be59e0,0x0aa35700,0x0a9a95d0,0x09b054c0,0x06567838,0x096ec3b0, -0x0aeca1e0,0x0c71f670,0x0d30ea30,0x0d788e00,0x0e0300c0,0x0d170130,0x0e21c060,0x1203f1c0,0x123d0820,0x12b0e1c0,0x122027e0,0x10854c60,0x0cf40270,0x06bc0e50,0x01005642,0xf72b7880,0xecc57480,0xe76cc4e0,0xe88e4200,0xedad4fa0,0xf5fdfb60,0xec9ecf80,0xf72a3d70,0xffdd352d,0xff30091d, -0x005b5994,0x05813a50,0x06440b78,0x08614500,0x0a9985f0,0x0c192410,0x0e11beb0,0x0b05c1f0,0x0a73a1a0,0x07797078,0x0a367b70,0x0b1ca560,0x0bdd0fa0,0x0d37d340,0x0e6cc670,0x0e544cd0,0x0d146e40,0x0e3a4520,0x10c88c40,0x0f64b430,0x0c530a10,0x075ec5e0,0xfeb8b114,0xf605d130,0xedafdda0, -0xe756f020,0xe0fb3600,0xdb360100,0xda75d2c0,0xdaa66840,0xda9abbc0,0xe8b49680,0xdf7d1600,0xebbf6480,0xf5c7b9c0,0xf725c480,0xfeabc0c4,0xfef5f226,0x067f60f8,0x06a7a608,0x08a968f0,0x095cb8b0,0x12f0dae0,0x096e2560,0x0693d130,0x0698ca48,0x0b68f120,0x0d09a180,0x0e04d1c0,0x10097000, -0x13050100,0x116a08e0,0x0fb994f0,0x0f418ab0,0x0bead5a0,0x05f01b88,0x011a20a0,0xfda029d8,0xf6b03790,0xed210360,0xe1e1f2a0,0xd32a0440,0xc9174140,0xc45ced00,0xc445c640,0xcad3da80,0xd1922780,0xda7276c0,0xdc059680,0xe27057e0,0xeb0f85e0,0xf2e90930,0xfc397234,0xff2b15f4,0x03c52d90, -0x043ef070,0x0a7c6f40,0x096e5b50,0x039e3668,0x0bd293b0,0x0dea3530,0x07bda068,0x0826ba10,0x080832a0,0x06e56a98,0x06bdcd78,0x0c9a16f0,0x0d502100,0x0dc49520,0x0e811080,0x0baa1e10,0x09c226d0,0x04cd7b68,0xfc820a70,0xf68f45f0,0xeea140c0,0xe6074940,0xde050680,0xd7113300,0xd2f2e680, -0xcdd5f2c0,0xc9904480,0xc4e13400,0xd2975200,0xde5abb40,0xe7b0e6a0,0xe8e3f220,0xf3093020,0xf6992010,0xfb71da48,0xfd5af248,0x009edbe1,0x01ba435c,0x029627f8,0x01bc7926,0x07e436c0,0x0866ef00,0x04ee9500,0x04dd5538,0x03c2182c,0x03244ac0,0x02506738,0x035aae78,0x02538188,0x0670b210, -0x0853d3f0,0x073451a0,0x05e08050,0x0537fdd0,0x055c8620,0x027808bc,0xff1c3582,0xfaa1f290,0xf4a42670,0xeca21180,0xe4a67380,0xd9518000,0xd373b0c0,0xd0d9cdc0,0xd4b34680,0xe543c6a0,0xe91fbf20,0xe8e71000,0xf032e070,0xf5a6aba0,0xf9472ca0,0xfd22334c,0x00c4400e,0xff8d0076,0xfef2deca, -0xff0f0717,0x00cf0b19,0x025ca420,0x03137e8c,0x003a5f88,0xfe11c526,0xfde6f118,0xfc689e7c,0xfaac9c68,0xfc4ae938,0xfdf40e44,0xfdf86c90,0xff960aba,0x0047c76b,0x012a8c5e,0x0305061c,0x00691547,0xfd4fdd60,0xf8d63210,0xf2b24040,0xecb2e800,0xe6ec5e40,0xe0110000,0xdc579140,0xdbbb7800, -0xde9ff980,0xe97dcbe0,0xe89b5fa0,0xe94d25e0,0xee9e45c0,0xf0d9bb30,0xf51bc220,0xf766edd0,0xfb498dd8,0xfacb03e8,0xfc6df6c8,0xfb7331c0,0xfcde647c,0xfc574ba8,0xfc9fb0a0,0xfb227618,0xf9e14900,0xf7891f50,0xf5f1e0a0,0xf3c18450,0xf361b050,0xf368a7e0,0xf0d46b30,0xefd24320,0xefc39240, -0xefba2080,0xef747960,0xee563ac0,0xed9446c0,0xed409d80,0xeb29ef40,0xe9343fe0,0xe7073f20,0xe6d92600,0xe5be9640,0xe3e2df80,0xe5f8f9a0,0xf0c0a1a0,0xf0db1fc0,0xe9fc4be0,0xf2c55330,0xf15b7b00,0xf29b3da0,0xf5bcf120,0xf75ef510,0xf8b7fc00,0xf74da670,0xf6269e60,0xf71f42a0,0xf81d6850, -0xf8169788,0xf4e20e40,0xf43672a0,0xf3721c70,0xf2e8e9b0,0xeca588c0,0xf1937380,0xf14e6fc0,0xef895040,0xee5e8ca0,0xed003a80,0xebc36e40,0xea742d20,0xeb130440,0xeb46a680,0xeb78f4a0,0xeb771080,0xeba9e5c0,0xeb93e2e0,0xeca4b640,0xedb01680,0xeee16860,0xef883580,0xf3698e40,0xf5b512e0, -0xed814f00,0xea8c4100,0xe8a427e0,0xf1c207b0,0xecd47040,0xeae97500,0xea78a760,0xeadb9c40,0xeb72a980,0xeafdf720,0xea827b60,0xeac99a60,0xece9b880,0xf14eccf0,0xe8f0f500,0xeb4d01c0,0xedf59d20,0xf6188b10,0xf3b6dcb0,0xf36f3fb0,0xf3090790,0xf26e1ab0,0xf1e5ad20,0xf11051e0,0xf15bb6f0, -0xf16a25f0,0xf183a1c0,0xf1bee310,0xf1f43570,0xf20ec440,0xf2846960,0xf2d26c80,0xf33e1250,0xf36b3a60,0xf3d84850,0xfdf22ad8,0xfe402122,0xfcbf415c,0x01444d58,0x03d844b8,0x07b31a58,0xfff07f2b,0x03a4f5b4,0x07ca3358,0x08036690,0x080ca4a0,0x07b0ee00,0x084cbae0,0x08478180,0x07e35e80, -0x0385b6dc,0x00313174,0x0861c9d0,0x03814194,0x012f5d64,0xfcd0113c,0xfe142a38,0xfda23688,0xfdaf3ed8,0xfdb4c29c,0xfdb8ce60,0xfdc30a00,0xfdb239b0,0xfd7b8e94,0xfd20f808,0xfca26414,0xfc442650,0xfbc27e90,0xfc576308,0xfcd4a998,0xfdded2c4,0xfdd373f4,0xfe795c04,0xfdbff944,0x050df3f8, -0x005632d3,0x027e6818,0x025fc64c,0x0149de5c,0x02613070,0x015648b8,0x02458b90,0x03a926e4,0x026d71a0,0x0201ab40,0x01590f80,0x02cd7de8,0x019161a8,0x0130e76e,0x00d2f20d,0x04b0dbf8,0xfdf8b9c4,0xfd2b26bc,0xfd276edc,0xfd29ef10,0xfd4e9040,0xfd6b080c,0xfd76f440,0xfd5eedf8,0xfc915d74, -0xfb378708,0xf97f43b8,0xf880e568,0xf8194570,0xf98b2e90,0xfb40ae68,0xfe01f5b4,0xfe39f8ca,0xfe709cfe,0xfd68fa28,0x01d4f75c,0x023b579c,0x040e9f90,0x037591ac,0x04049850,0x05b7d1e0,0x06f95be0,0x05862278,0x07ee3728,0x04b01550,0x06a5ff60,0x0294ca1c,0x042ed138,0x024709c8,0x01a17282, -0x02275ff0,0x01af314a,0xff1ebc14,0xfc2a7668,0xfc4ad764,0xfc318118,0xfc3b0da8,0xfc75570c,0xfc7b6408,0xfc6a1760,0xfb117e78,0xf8ba3a00,0xf5b9cdd0,0xf376caf0,0xf245bb10,0xf52f7210,0xf7f19110,0xfda6e704,0xfe22b40a,0x019c94d4,0x0005c56c,0x0547da28,0x05d7fb10,0x05928788,0x044e8bd0, -0x043e3f70,0x073192f8,0x06f03800,0x07a79c38,0x09663940,0x09a37330,0x07db7c88,0x040a1070,0x059374e8,0x043544c8,0x068b0d18,0x035097b4,0x043d9350,0xfff4b225,0xfbf4abc8,0xfc411248,0xfc93ad8c,0xfcdbd750,0xfd1db0f8,0xfdb9c294,0xfd9f5b8c,0xfb336fa0,0xf6ce8970,0xf0c7be30,0xecb2fc60, -0xec210d60,0xf0c20f20,0xf71cbba0,0x00b09707,0x01ff4286,0xec9eaf60,0xe9bdef60,0xee4b2440,0xf35f46d0,0xfa202ed0,0xffa86ee8,0x02134718,0x04aadba0,0x06be47b0,0x07f36ef0,0x089444e0,0x08f8c480,0x09289640,0x07713588,0x06efdb28,0x04b333f8,0x057845d8,0x01c091fa,0x02742d7c,0xfe2db764, -0xfa6c11c0,0xfa42ce18,0xf5871f90,0xf684a670,0xf5c00860,0xf49f6a80,0xf20360c0,0xf0fc8de0,0xf17e89a0,0xf18ae860,0xf56c7eb0,0xf928f6b0,0xf85fc678,0xf49ad0a0,0xef959700,0xed4860c0,0xf0f86ec0,0xedd9ef00,0xeea52120,0xf3a896e0,0xf7680a00,0xfa06e3b0,0xfd2f21bc,0xff08687b,0x020dcb60, -0x05ed5698,0x09e0aec0,0x0adc8b70,0x0a725d70,0x06b1a448,0x074a83d8,0x05d966d0,0x0534eae0,0x02aca0fc,0x02f5df58,0xfe3b15d4,0xfcf0cdc0,0xff5f2dc0,0xff9860c2,0x0107dd62,0x0181cdb8,0x019580de,0x04b1be08,0x05ffe070,0x055b40b8,0x0515b760,0x033dd824,0x008ebd9e,0xfc6f30ac,0xfb568238, -0xfdde5bc0,0xf4267140,0xfcc42b44,0xf3c77dc0,0xf3058950,0xf8300628,0xfab756f8,0xfe6be88a,0xffbe4577,0x00960aa3,0x05cff348,0x06db5188,0x046ffa78,0x0b74bac0,0x0ab40760,0x02f67690,0x03d48cec,0xff926179,0xfe9fd53e,0xfb3b6508,0xfc2f8234,0xfd67d14c,0xfde0184c,0x038a691c,0x0b70f6a0, -0x10e26ca0,0x14394740,0x146db420,0x1820d8e0,0x1b6c4300,0x1dfb9740,0x20a4e180,0x1fe99e60,0x1d5dc2c0,0x146b4f80,0x0c8374b0,0x0608b970,0xffccdeca,0x09ce83b0,0x0118cfb2,0xfd5675a8,0xfdff15f8,0xfd4c7eb8,0xff77e7c8,0x00776b69,0x00111d1a,0x06d775e8,0x08d437b0,0x022dbffc,0x0b16cff0, -0x09b06530,0x0164452c,0x01bb0c34,0x012bf4c0,0x0061aa95,0xff754e66,0x005df8e2,0xfe2cc35c,0x001e7b0d,0x0499e260,0x098b3a80,0x0d7be070,0x138c56a0,0x1abc6600,0x1f113280,0x22d3be40,0x25011bc0,0x2531a480,0x21d43cc0,0x1df7bc80,0x144778c0,0x0f6e7d50,0x0def8de0,0x0ce29bd0,0x11041560, -0x0c3ba0e0,0x0877de00,0x04482b30,0x03b86efc,0x037e892c,0x056d9bb0,0x06bc6328,0x07a617c0,0x092c5610,0x09e355e0,0x08a86220,0x07d4d2d0,0x072d9e18,0x0642b7d8,0x05410980,0x049aabf8,0x03d3b6a8,0x044b8be0,0x01e48688,0x00188152,0x02c34350,0x0797f310,0x0c84c510,0x0fc5bf10,0x10fcae60, -0x13072e40,0x13892440,0x127642e0,0x116ef360,0x0f817d70,0x0db61db0,0x0caf71e0,0x0d47a720,0x0f4d95a0,0x12ba75e0,0x0da35e80,0x0c66e840,0x0bb5bb90,0x0a9883c0,0x08dd2a40,0x08953140,0x06c8c608,0x044302c8,0x062ec298,0x077712a0,0x09211e10,0x084bf080,0x08a124b0,0x08cfa900,0x09eb34a0, -0x0a704230,0x09046d80,0x09cae490,0x0a509ed0,0x0829d340,0x067e3b48,0x06622ae8,0x05332f58,0x04126e30,0x0389f11c,0x02aceb3c,0x0325903c,0x03f00344,0x054d0cd8,0x06820350,0x07892af0,0x08cbbd60,0x0a8ad2b0,0x0c1d9710,0x0d70c0b0,0x0e9e7f20,0x0bb9daf0,0x0bcdd510,0x0b39b800,0x0a1bfd20, -0x09488360,0x078729b8,0x06f9bd90,0x059d1898,0x06ef07b8,0x07226458,0x087c4ce0,0x08955140,0x092126d0,0x09ac8d50,0x0af31390,0x0c5c28b0,0x0e551ba0,0x0ea2b080,0x0f3479a0,0x0f869a70,0x0ed90c80,0x0efa6210,0x0e4553f0,0x0cf940b0,0x0bb240f0,0x0a884360,0x0aaa8860,0x0a6d66d0,0x09f0b260, -0x0a441770,0x0ac956a0,0x0b7c42e0,0x0bee4dc0,0x0caa6630,0x0dac8490,0x0cba56f0,0x0cf928c0,0x0d500170,0x0ecb5420,0x0c2fe570,0x0ccc4b10,0x0c7f1210,0x0b4116b0,0x0ac4f100,0x0a4b2ca0,0x0b841400,0x0c59ba70,0x0c3b9050,0x0be05eb0,0x0c6ed8c0,0x0d7ea070,0x0e078960,0x0eb0c020,0x0ef46290, -0x10ffd0c0,0x11261a20,0x107037e0,0x10ce84a0,0x10ef0360,0x111c4a40,0x112e6b40,0x111e10e0,0x10ba77a0,0x106f18e0,0x10319780,0x10145ec0,0x0fcd3390,0x0f7f6e90,0x0ef9a290,0x0e645890,0x0dd6bd00,0x0d9a7270,0x0ca6d8c0,0x0bccddb0,0x0ff01820,0x10d142a0,0x100d3da0,0x0e0ca020,0x0fe52df0, -0x0fc96550,0x102775a0,0x0ffed000,0x0fb8a670,0x10102d20,0x105ee560,0x10491a40,0x10d58420,0x0f5e1e50,0x10bb0260,0x11bde2c0,0x10fa5ba0,0x0d40cb30,0x0dd5cac0,0x0e0184a0,0x0e01b5a0,0x0e2adb00,0x0e54c3c0,0x0ea13020,0x0e664bb0,0x0e3e3f00,0x0e0fdbb0,0x0dc99c80,0x0d8e3010,0x0d5f3e30, -0x0d3313a0,0x0d135780,0x0cdd0a00,0x0ccc2ea0,0x0e1b51f0,0x023eecbc,0x01e12bca,0x02e5c210,0xff029458,0xfcf7fb2c,0xfa3286f8,0x00a1e012,0xfd6d41e4,0xfa623358,0xfaab2238,0xfacbdaa8,0xfacfee58,0xfa80d8d0,0xfa42e140,0xfa4ce0a0,0xfd3c2670,0xffdfea5d,0xf921d428,0xfcd53e24,0xfed195a4, -0x02d52084,0x01b5e1ea,0x021a35f4,0x022740d4,0x025cebf0,0x027541b4,0x0291c1a8,0x0265f578,0x025ccfb8,0x024f4a24,0x0284eebc,0x02be8bcc,0x0379ed38,0x02a39160,0x024ee04c,0x01bce9f0,0x0227295c,0x019e0050,0x014e8ae6,0xfc490374,0x01736bcc,0x00021265,0xffcb7c55,0x010e5db8,0x008485c5, -0x03061634,0x029ad828,0x00823e7a,0x01e516ce,0x01c7efac,0x01b8e4dc,0xff1384bd,0xff326d5d,0xff884325,0xff93cca2,0xfc0e2d18,0x015ac1ea,0x01e3e590,0x01f8a22c,0x0240e3a0,0x02cd72e4,0x03127928,0x0323b158,0x029a2440,0x026a3d60,0x02656384,0x031b1038,0x03aaf504,0x05085a68,0x02aca020, -0x018d7ac8,0x003dd310,0x012158e6,0x01915776,0xffae6826,0xfee0f7f8,0x000186f0,0x003fe1aa,0x0031fa73,0x004617b7,0xffcc8dfa,0x01fef22a,0x036c802c,0x006e55af,0x02bad768,0x00e98e70,0x026911d0,0xfeb1681a,0xfe910e56,0xfe988bd4,0xfe354d5c,0xfe20a280,0xff9a269a,0x017e4150,0x01b9eed6, -0x025725fc,0x038ffb44,0x04079600,0x046bc418,0x0352577c,0x02f6e2c4,0x02f7ca14,0x0489a078,0x06694d00,0x0a759d60,0x0572d5d8,0x036eeb8c,0xffc91c36,0x0113e096,0xff07a9b3,0xfd70aeac,0xfe339cd2,0x01266558,0x02cc86c4,0x02c43b90,0x02de4384,0x02ebd31c,0x065759b8,0x06a3ebd0,0x056a9250, -0x06116fc0,0x04667350,0x02f07d5c,0x00ae7aca,0xff2780d2,0xfdb8acfc,0xfea463c0,0xfd9ad474,0xff2a631b,0x012ed30e,0x017231f0,0x01daf66a,0x037a05a8,0x04472790,0x03f77ec0,0x0182efdc,0x0056d0cd,0x005ec1ae,0x035fa0b4,0x06fd0e80,0x0bd74c90,0x03ee4af8,0xff22eafc,0xfa422808,0xfc9e29a0, -0x071674d0,0x03d091ec,0xff5236e2,0xfef66d18,0xfd906578,0xfdc5ba0c,0xff2e3233,0xff54d055,0x027473ec,0x0440ee80,0x043e8bc0,0x06cb1458,0x0720a6d0,0x05678cb8,0x02fcd434,0x00ffb316,0xff858763,0xfed500fa,0xfc8af6f0,0xfdf57918,0x00377ec8,0x012d64b4,0x05750dd8,0x07891b50,0x09da56a0, -0x0cadd910,0x1081de80,0x12d002c0,0x12f5ffc0,0x14a6f2c0,0x13da0520,0x13c71560,0x1487ad60,0x1411c760,0x1222d800,0x0a021da0,0x031ddbfc,0x0016b9d6,0xfea574aa,0xffda5b73,0x0161fad4,0x0132095c,0x02081e10,0x00e341ea,0x022433c4,0x0385ea64,0x04783908,0x0846b400,0x076f0320,0x042b2280, -0x036990c4,0x0163b952,0xffbd08ca,0xff216a0a,0xfdad5070,0xffb5d7d6,0xfdeab294,0xfc600eec,0xfd6fb288,0x03e330dc,0x09f19a80,0x108068a0,0x1037a7a0,0x10585120,0x0ff3b600,0x0d68ebd0,0x0af800a0,0x0887e370,0x068e24a0,0x02af8fa0,0xff4e5cbf,0x00e4101a,0xfed3cc0a,0x013e9e9a,0x0113de10, -0x01ec813a,0x00c87a8a,0x0165324a,0x00ebb4f2,0xff173520,0x07be1d50,0x08a9cab0,0xfcfc7864,0x078f2ff0,0x04dc6d78,0xfd199a40,0xfdbb01f0,0xfd92c740,0xfc51fc60,0xfd8138c0,0xfccf03d0,0xfcb41ecc,0xfbcf7bb8,0xfbc35530,0xfb656398,0xfccddfd8,0xfd620d28,0xff026739,0xfada35c0,0xf84413b0, -0xf68f9570,0xf5824870,0xf49163b0,0xf3a78330,0xf47b60f0,0xf7855b90,0x010c0980,0xfdb029c4,0xf8b69630,0xfb16f270,0xfe10c016,0xff4d4b72,0x0050f047,0x00d283f4,0x02c0ba78,0x030b3c74,0x04dbcb98,0x04ae58b0,0xfc8a6c90,0x03e54978,0x04a2d2e0,0x025eabdc,0x009a06a0,0xfde65c08,0xfcff21c4, -0xfb7f16e8,0xfaeaa2a8,0xfb2e25a8,0xf809bde0,0xf5f07170,0xf4062ea0,0xf0f33930,0xedbca4c0,0xeb1e7780,0xe9e0e5e0,0xe8a20f80,0xe6d5ba00,0xe628aa60,0xe6086e40,0xe5aedc00,0xec27cd40,0xf1facf90,0xfb76dfc8,0xf7f24720,0xf5b340f0,0xf430a670,0xf7ea5370,0xfa3bdc30,0xfd7e9f7c,0xfef0dd98, -0xfff0128e,0x0098bf0c,0x036d59e0,0x035cbd70,0x010aed84,0x003aa920,0xfedffa62,0xfeea826e,0xfe04c460,0xfd98e0d0,0xfcb45eac,0xfc612258,0xfb686358,0xf9fdf748,0xf8f16870,0xf66d6090,0xf4010c70,0xf02fa400,0xeccbeb20,0xeae5bb60,0xe963f100,0xe9494a60,0xea87ba20,0xeba70720,0xec6d3860, -0xec76d5c0,0xf00b08d0,0xf39df4c0,0xf8c23da8,0xf6e2ba70,0xf90ac348,0xf891a2d8,0xf95c4260,0xf94e0138,0xfb024a10,0xfad00ab8,0xfce01408,0x00c0370b,0x01092c6a,0x00e8aca3,0xff52cae7,0x019a0d7a,0x010e1fe2,0xfe9976c0,0xfc452e44,0xfa3ac458,0xf97b5a60,0xf7dca130,0xf6f22190,0xf681d7c0, -0xf5b37980,0xf51e8d10,0xf5221700,0xf5cea7c0,0xf5dce410,0xf65366d0,0xf6462360,0xf5fc1cc0,0xf54fd630,0xf4383b90,0xf3b04120,0xf35c5470,0xf3552a50,0xf4211050,0xf5b48f70,0xf7c4be30,0xf7c298d0,0xf9a2d788,0xfa596e10,0xfb64b198,0xfce34ed0,0xfe3f85e8,0xff0fe518,0x000546d7,0xffa3d485, -0xff3322a4,0xff7b9510,0xfd2a9afc,0xfe0004aa,0xfc05bdc4,0xfc761998,0xfa126598,0xf8a990d0,0xf7a32fc0,0xf729ac90,0xf47a0980,0xf3a18790,0xf45de0a0,0xf47a8720,0xf535fc00,0xf5bb3a40,0xf6465e40,0xf519a5a0,0xf478b6f0,0xf41b3180,0xf3febe10,0xf3cc8ad0,0xf383d5f0,0xf3d47fc0,0xf3f21e40, -0xf3af7b40,0xf5a7a8a0,0xf5017e80,0xf4a23f20,0xf6ab2ce0,0xf6310170,0xf6d4b150,0xf750c580,0xf7a97c10,0xf8470068,0xf8317740,0xf78561f0,0xf80214e8,0xf7868d40,0xf80643f8,0xf7e2db40,0xf8186428,0xf6f44dd0,0xf654c370,0xf65592a0,0xf7f0f830,0xf32db3f0,0xf3891c00,0xf33bf0b0,0xf2e8e910, -0xf2c09b90,0xf29c01f0,0xf2abfc10,0xf2c49fa0,0xf2f58530,0xf304df80,0xf314f040,0xf334f850,0xf3579100,0xf3c032b0,0xf42b6f50,0xf491c280,0xf4bea710,0xf5ae0630,0xf59521d0,0xf504a9e0,0xf5a4f110,0xf85be5f8,0xf58010d0,0xf62c8100,0xf8590878,0xf84f0108,0xf88dff20,0xf89069a0,0xf8d19498, -0xf8ce0050,0xf8fdb7d8,0xf5e55770,0xf51c0ae0,0xf9429070,0xf5677750,0xf4929890,0xf4775b80,0xf50aaeb0,0xf4aa7340,0xf4ad37b0,0xf48450d0,0xf4574c40,0xf40e99c0,0xf43a1020,0xf457a3f0,0xf47fdff0,0xf4aa8430,0xf4d3a2f0,0xf4f63f90,0xf51c5380,0xf539d600,0xf5671730,0xf56efe00,0xf46e39a0, -0x0194e912,0x02155f14,0x00f3fe38,0x04552d28,0x05e7fbf8,0x07ee01a8,0x02afcab8,0x056f96b8,0x078ab640,0x08329770,0x082be960,0x07742938,0x0810aef0,0x08468230,0x08801560,0x05989ec0,0x031dcc58,0x084faa20,0x058446a8,0x03d24c1c,0x0016d989,0x012d5250,0x00e1522b,0x00cba39f,0x00b5df02, -0x00b5564c,0x00b51bc9,0x00ec85d0,0x0112ad54,0x01408d8e,0x0158a7bc,0x016e5600,0x01852d6a,0x018a1690,0x01c44bcc,0x02956ec8,0x0203127c,0x024a56bc,0x02225888,0x064ead00,0x01d55a96,0x030b8860,0x037f8e48,0x02a46c40,0x024fc180,0x028171f0,0x035395dc,0x03a8eed0,0x03366800,0x0313a980, -0x03b9b930,0x03b3ec80,0x02df12d8,0x029c602c,0x023f7b8c,0x05270e28,0x006396c0,0x002a9e69,0x002dd1d9,0xffd43d28,0xff954139,0xff77372f,0xff979760,0x00382391,0x00d0ee00,0x0167f610,0x01cfe0da,0x021ff104,0x02343c14,0x026fd608,0x02dc4d28,0x047048c0,0x03018fc4,0x045e5b70,0x04b19540, -0x04cb5d88,0x0338a9bc,0x02c06608,0x02cdf420,0x02cef42c,0x0154605e,0x048ca028,0x03dfc240,0x0392b8f4,0x02d481f4,0x046f2570,0x04a61738,0x034e5f64,0x01df7216,0x01cf46f2,0x01b26604,0x01b3cec8,0xffc2ae3c,0xfec97ce0,0xfec19ece,0xfe07665e,0xfd8f63b8,0xfd8be830,0xfdd9c614,0xff0b509c, -0x002dc58b,0x014d0c82,0x01c8fb80,0x01c4f00e,0x015ba516,0x027bc8d8,0x03c68c2c,0x07fc5830,0x0573e718,0x03d1a780,0x03cac07c,0x03010210,0x00f4aa8b,0xffec1c30,0x01385052,0x00e4016c,0xff1b12f1,0x03cfbb8c,0x052f3760,0x021598e4,0x0410adc8,0x03584110,0x03480ae4,0x002c3cf8,0xfedf737a, -0x009515de,0xff60973a,0x00692d39,0xfe1066b8,0xfd673224,0xfd6adfbc,0xfc9af97c,0xfc05dea4,0xfba53cf8,0xfc3d4c34,0xfe822b12,0x00b56963,0x02b00a48,0x0376faa8,0x037fa0a0,0x022de7bc,0x03c5136c,0x05a0b1e0,0x0abacf70,0x06713fe0,0x0aee7d70,0x0a5c4e20,0x0c5461a0,0x0bac3660,0x0827ccf0, -0x062b6e60,0x051330a0,0x04911ce0,0x03afcf6c,0x03b3af78,0x039a1fc8,0x03f3348c,0x03f94388,0x05b55730,0x026ef930,0x00ba3e3f,0x012d2728,0xffb8d1af,0x007ff5ab,0xfd9d1a74,0xfad32938,0xf9fbd2e0,0xf71a3370,0xf6f263d0,0xf74eced0,0xf7cc44a0,0xf886e758,0xf99212a8,0xfb3290f0,0xfaf46cb0, -0xfc359054,0xfc9b1af8,0x034d9efc,0x060162a0,0x07332d90,0x09dfe680,0xfb5f8800,0x00a5a75a,0x008bc970,0x01691a8c,0x0277d520,0x02d0b810,0x04416368,0x06fba168,0x082c7f00,0x07ce3980,0x04945010,0x05fd5318,0x047cf1d0,0x04bc3f48,0x011a5ad6,0xffbc654f,0xff9d9248,0xfe1a0c3e,0xfda75bc4, -0xf9235a98,0xf6320b50,0xf4eefff0,0xf2fa9310,0xecb1ac40,0xe98e5be0,0xe93806a0,0xee2c79a0,0xf2856660,0xf6f49530,0xfa897c88,0xff23fa1e,0x00906703,0x04f54040,0x05332d78,0x039e61cc,0xfd1f05a8,0xff4e533b,0x00ecf7ee,0x011e04ec,0x025ec3cc,0x02dd1d0c,0x0270d07c,0x0332fa20,0x03724a28, -0x05334af8,0x06853ba0,0x0070b2d5,0x0567e068,0x064c7a00,0x09ad9dc0,0x04a278c0,0x0283da68,0x03471cf8,0x0120463a,0xffa15072,0xfd613424,0xfc47122c,0xfab7fcb8,0xf925c380,0xf7cd87a0,0xf86d8010,0xf9e27eb0,0xfd506698,0xff05a488,0xff9ff111,0xfd6dc17c,0xfcb36cd8,0xfa873b70,0x03e74f04, -0x05e61a90,0x00c1160f,0x004fa959,0x012b682c,0x042fdc28,0x02066494,0x02d6deac,0x020c6b70,0x020f0364,0x031dabb8,0x0622a928,0x04199188,0x0288260c,0xff0c84a1,0x0152f920,0x01a99c92,0x048bbcb0,0x016cddc0,0x00326f54,0x00524854,0xffdccd6f,0xfd7eaa24,0xfccab6d8,0xfcbf8018,0xfcbc8278, -0xfe26ff00,0xff14e86f,0xffcaf4e3,0x00009f6a,0xffe8f7b5,0x00d58a3b,0x042bcb58,0x03e45c7c,0x07418bf8,0x0a1159b0,0x0db798e0,0x0be148b0,0x056ccda0,0x014c16f4,0x0333c1c0,0x05b57960,0x03d2f4b8,0x03fd1dd0,0x033ee5e4,0x02eb19d8,0x03a6cc1c,0x04d7e7a0,0x02f2a800,0x02396000,0xfff8264f, -0x0221e510,0x033569d8,0x04926c88,0x02f9ce5c,0x0161d8ca,0x00345a14,0x006313c0,0xffecd15b,0x01e83832,0x015216dc,0x00262e59,0xff42cb31,0xff6dd7b6,0x00b45c8b,0x0193bf7a,0x02de3894,0x03862604,0x04a52738,0x03039a20,0x04375cd0,0x0784c120,0x0b1afa40,0x0b6cfcf0,0x08f4c530,0x03d48dc0, -0x03ac1c48,0x00feaabd,0x00ad509d,0x01311966,0x012fd7a6,0x0361f1c0,0x03f8205c,0x028e50f8,0x02f0f56c,0x02c9d5c4,0x036381fc,0x0161d612,0x00fbdaaf,0x021e084c,0x02718138,0x03a32f44,0x04a84d08,0x04680c70,0x036c42d4,0x03ce3de4,0x04c04cd0,0x03d8757c,0x021e4a3c,0xff75edde,0xfe2b5516, -0xfcfd4cf0,0xfd23059c,0xfd131088,0xfd55fe0c,0xff4bf1bf,0x01e99eb0,0x04e87bf0,0x06be0620,0x081af210,0x09d6bc70,0x06d01d88,0x06dd4630,0x063b22b8,0x059a09e8,0x04607788,0x02a3c8a8,0x029df310,0x026be458,0x02b35a40,0x02a544a0,0x03ad1d44,0x0348e99c,0x051d22f8,0x032f994c,0x04cf1fd8, -0x02b9f8fc,0x03ade8f4,0x0327d8b8,0x03f6e7b0,0x03d8da10,0x06cb8f78,0x0708d5a8,0x04e33c90,0x0420ab90,0x02d64b24,0x01b6b9e4,0x003679bc,0x018114c4,0x02352aa8,0x029e8ad4,0x034c0078,0x03b20810,0x0412a730,0x056278c0,0x06bb5120,0x08780f90,0x0788e2d0,0x061f89f0,0x06d17f10,0x037cce10, -0x06096438,0x052ab558,0x05391000,0x05cd6b60,0x05839968,0x05f44640,0x05e3f538,0x04d9d048,0x0585ca20,0x0523f8d8,0x0501d6c8,0x03f0c6f0,0x04e45d68,0x04f5f158,0x048ddcc8,0x0161743c,0x067a2818,0x05dd1ea0,0x05a7db90,0x05806468,0x051b0138,0x04d65608,0x045040d8,0x04a34708,0x04b04a10, -0x04ddfe00,0x04f31a18,0x051a8d08,0x05180d70,0x055d55a0,0x056c5080,0x05970708,0x05d60e50,0x05a0b3a0,0x0659c408,0x055eb688,0x046d0368,0x01bbe372,0x06194670,0x04a49200,0x0235cbc8,0x01eb223e,0x01b7c5f2,0x01c7d3b2,0x014c02ca,0x01259e12,0x010567e0,0x043fd6a8,0x059598b0,0x004cdeec, -0x041c41b8,0x053da9a0,0x06b684a0,0x05a96368,0x05e1b058,0x05bb8bc0,0x05b980e8,0x05baa998,0x05b6d040,0x05b3f400,0x05a52be8,0x0594ad20,0x057d05d0,0x05660608,0x05491200,0x055b3758,0x056e8ee0,0x05790668,0x05ae9260,0x061900e0,0xfc4ff454,0xfbc2e1b0,0xfc5deeb0,0xfaef65d0,0xfa7700b0, -0xf9ef1578,0xfc131d80,0xfaf6a440,0xfa2c0ef8,0xfa43ff80,0xfa6ed4c0,0xfaa7e1e0,0xfa76d3b0,0xfa79ae90,0xface0bf8,0xfb615ed8,0xfc516eb4,0xf9ddc230,0xfac0e408,0xfb7d13f8,0xfd98b39c,0xfcdefeb0,0xfcfd6974,0xfd30b8b4,0xfce4326c,0xfcb27648,0xfc5676a0,0xfc642900,0xfc5f1f5c,0xfc7392a4, -0xfc46b32c,0xfc1cf308,0xfb960ea0,0xfbf2e680,0xfbdb7c40,0xfb68e360,0xfba16100,0xf973f900,0xfa1a3650,0xf9ba4970,0xfbb070d0,0xfba53198,0xfbe49560,0xfcaab004,0xfcdfaa28,0xfdcedc5c,0xfda3f60c,0xfd78cf80,0xfdb40538,0xfe0a68c0,0xfe9d8664,0xfd821ce0,0xfd5b5dd0,0xfc788ee8,0xfc8bac5c, -0xfab87a58,0xfd63fdb8,0xfd588c4c,0xfd3ef758,0xfdc536a4,0xfcf80de8,0xfc59374c,0xfb5ea020,0xfb583338,0xfb4995a0,0xfb8ea280,0xfb2f2a70,0xfab80ad8,0xf95c9fa0,0xfa46e6d0,0xfa128820,0xf8db2f00,0xf918a9f8,0xf6e44ab0,0xf8e4cb60,0xfa6e4e10,0xfb8ffdf8,0xfc77d0f8,0xfd0fcc10,0xfdf6c128, -0xfe599792,0xff05d750,0xfffb562d,0xff69e65b,0x00169e92,0xffddb39f,0x02016d4c,0x00151fe9,0xff5ee149,0xfdcf9c1c,0xfd2c6d9c,0xfc95faf8,0xfe029810,0xfe4050c8,0xfe0c30e0,0xff1acb6e,0xfdab0dcc,0xfc7ddc2c,0xfa69c258,0xfa6af2e8,0xfa3ddb00,0xfa724ba8,0xf9956a08,0xf8fd25d0,0xf5ee7590, -0xf7a79800,0xf70c3e10,0xf4c6d140,0xf6075e40,0xf176cf20,0xf50f6bd0,0xf89f3660,0xfab7bf58,0xfc345b38,0xfd5e4048,0xfe55e282,0xfecc3188,0x016f62be,0x02f4e618,0x021e9a40,0x02687b20,0x02db8008,0x0496a3c0,0x01724910,0x004741a5,0xfda280ec,0xfdb06e64,0xfc3d0d54,0xfe72a600,0xfefce100, -0xfefe16a6,0x00926100,0xfe3944a6,0xfc092ef4,0xf894f558,0xf83c2078,0xf8084b38,0xf88d6d00,0xf7f259c0,0xf6958850,0xf21f8f90,0xf4cbc730,0xf4054a00,0xefb100c0,0xf0b41280,0x06547b28,0x0945ef30,0x07dcd4f8,0x061f4c88,0x04d3b590,0x035080bc,0x037585c0,0x04ee8a58,0x04b9ba58,0x041dbe40, -0x04941e20,0x01b6884c,0x00f342fb,0x03cd72dc,0x01311218,0x007ff61e,0xfdb6ef34,0xfeb557c2,0xfcb7eec0,0xfdfde2a8,0xff961c9f,0xfe523806,0xffa5c268,0xfdfada2c,0xfda6108c,0xfcb7ea80,0xfd5bc0e4,0xfc953124,0xfc2a0eb8,0xf93a10e8,0xf7d7cef0,0xf883c7f0,0xf5c094b0,0xf7f5a510,0xfb7346b8, -0x02fdd514,0x0a862940,0x06acd2a8,0x055a6038,0x05689f20,0x05c899e0,0x06b61368,0x06380978,0x042a5120,0x06684a98,0x06a124e8,0x01cfbb50,0x033774ac,0x03c85828,0x06ea4118,0x024cdd40,0x012598d4,0xff288071,0xff95d7c0,0xfdf00210,0x001a4796,0x01f9bd18,0x00f871ad,0x0155fafc,0x032f27d4, -0x03e02064,0x01cacaa4,0x010f39f6,0x0049fb74,0x012b4d22,0x0143c6c4,0x04840b50,0x0c900de0,0x0d8fc380,0x0cc3e550,0x042539a0,0x0a4053f0,0x029033b0,0x03e0aefc,0x03d40938,0x036fa1d0,0x03555bb0,0x0067d959,0x02483f8c,0x0a5be400,0x0489a720,0x0292b93c,0x002aaa6f,0xfdbc82d8,0xffcfb975, -0x0b218f00,0x0173e284,0x00058680,0xfff8fce7,0x00728414,0x00b47005,0x012f5c1a,0x02b33c04,0x01a9501a,0xff53fb7a,0x007b3f0c,0x00d1f9c3,0x004e387c,0x0089a954,0x00765ec8,0x00e6cb26,0x010b57ce,0x02a9e8f4,0x083be470,0xff4c05cd,0xfb52e568,0xf7993110,0xfee68e10,0x01274c84,0x00fbe962, -0x02182c3c,0x01058b14,0x017270f8,0x01ac9e22,0x02a5c330,0x069358c8,0x01678120,0x000fec32,0x026f7668,0x00c04bb7,0x02df11f0,0x0a12b660,0x0441e400,0x02e984ec,0x033b5c7c,0x03066658,0x03720784,0x04317d28,0x0485a700,0x03d602e8,0x02b22b68,0x03abcdb8,0x033e2434,0x015e0b66,0xfd71af08, -0xf88b5de0,0xf34d23a0,0xf39ba060,0xf4daae00,0xf8c7f888,0xf7838e90,0xf81fef70,0xf527f6d0,0xfeb75120,0xfc78f758,0xfe6797f6,0xffdeeba8,0x009bc766,0x00dadafc,0x01bacf96,0x01574cfa,0x017f1d5c,0x01a7675a,0x01d96bea,0x026ca0d4,0x030e94fc,0x02f159dc,0x0251089c,0x01fe611e,0x02b40b5c, -0x0320015c,0x02d06260,0x02a3adcc,0x02532048,0x0205e91c,0x0201a21c,0x01b12e3c,0x007a2a8b,0xfe194d6a,0xfb22c100,0xf7921380,0xf5447390,0xf3c44450,0xf6451030,0xf8609120,0xf9d68dd8,0xf9ff07b0,0xf8b05160,0xf32c4d40,0xf98e6bb0,0xf9b8ffa0,0xfdcb830c,0xff2f51ea,0x00f9284c,0x026d2a98, -0x02441cfc,0x02787f38,0x02fb3c6c,0x035a7d18,0x03450558,0x01c81280,0x028fd374,0x0270cd90,0x01cd57c6,0x022de5e8,0x01ad1418,0x009d17a8,0x00d5782f,0x0120ae96,0x007edb3e,0xfeba9faa,0xfef6a54a,0x0046a266,0x024a969c,0x01ec1464,0x0004bba9,0xfeed7a9e,0xfe3d2658,0xfe06efc2,0xfd2b32d4, -0xfc794b58,0xfb7edd58,0xfbeb51e8,0xfac04678,0xf7981fb0,0xf77c3920,0xfb61b608,0xfa7400a0,0xfbee2a48,0xfd1fc944,0xfe80fe2c,0xfed0b74c,0xff7a28a9,0xffc89da9,0x00a2f717,0x00aa9cb0,0x020c40f8,0x0100c4be,0x028ee6e4,0x01ee739c,0x026c8288,0x0155c0de,0x0130888c,0x004e6bbe,0x004e5710, -0xfd91eb38,0xfd79d690,0xff350dbb,0xffb883e0,0xfffa7c85,0x005e61c2,0x01168e8c,0x002d0892,0xff6d068a,0xfed63d34,0xfe715950,0xfe2323d6,0xfd99a278,0xfd219a70,0xfca62888,0xfc68ada8,0xfc1c8e4c,0xff6d94a4,0xffafa9e9,0x01f57e38,0x00a6e5fd,0x0183eca4,0x01af0748,0x0196e4c6,0x0214a848, -0x018c6882,0x016c6f7c,0x01e20eb4,0x01600e0c,0x017d019e,0x019a5f0e,0x01d612f2,0x00f070ca,0x00b55679,0x0073bd6d,0x01fce0aa,0xfe54124c,0xfe8c8e16,0xfe7fe9c0,0xfe78f4f2,0xfea76026,0xfebf7a14,0xfefd708a,0xfe8cebe0,0xfe5cc8b8,0xfe106730,0xfdd0ee98,0xfd91c634,0xfd70e410,0xfdd05cd4, -0xfe2e603a,0xfe80812c,0xfedf9dee,0xff340605,0xff02ebfc,0xff48aa7d,0xffc80fd7,0x01181bf4,0xff2026c5,0xffcc4864,0x01254f96,0x014de4e0,0x01705b80,0x0158cd5a,0x01a7f39a,0x01b52324,0x01c2af8e,0x0015287b,0xff65beab,0x01c5d1ec,0xffc7dd05,0xff228e2c,0xfe554104,0xfef3987e,0xfec4c17c, -0xfecf236e,0xfec83128,0xfeb97f8a,0xfeaf7cc0,0xfea5dd60,0xfea52ed6,0xfea944e8,0xfeaeb822,0xfeb5106c,0xfea2895c,0xfecc62be,0xfee27284,0xfefdeeda,0xff0b1b02,0xff33b4d6,0x00d07f68,0x0088be63,0x0055afdf,0x012f5aa0,0x018b0666,0x01ed821a,0x01639dfc,0x02045618,0x02669e7c,0x02464718, -0x02401334,0x02292f54,0x02462d38,0x02636f3c,0x028ea2e8,0x023a1658,0x01a5fcec,0x0239e438,0x020c4830,0x01a45164,0x0073619a,0x00cf2f4b,0x00b8725c,0x009c0d2b,0x0095c171,0x008a96db,0x0083bff3,0x008472d8,0x0081cf9c,0x00539dd2,0x00a41f10,0x00aa9fb4,0x0072d1a5,0x0086b55e,0x00893b25, -0x009740fa,0x009270e2,0x00897319,0x003d4aca,0x00518b38,0x0080e939,0x0174f4e4,0x01d052d2,0x01d9cd3e,0x01f71c16,0x013e228c,0x014335e2,0x01ba93ca,0x01956ffe,0x01bed302,0x021b2dec,0x0257152c,0x0206bf78,0x016531fe,0x015b60ca,0x0221fbc4,0x00dc525b,0x00d7f384,0x00e2b5db,0x00815b83, -0x007ea327,0x007415d2,0x0081cf49,0x008ecb9a,0x007a3100,0xffea66de,0x00ace213,0x00977c5d,0xfff1eec6,0x001548eb,0x003d5e93,0x009921c5,0x00bbbc50,0xfff853c5,0xfef6d9e4,0xfe868c3a,0xff925117,0x00f23497,0x018a88be,0x023caf98,0x029f05a4,0x020a4358,0x01aa0f32,0x024026e8,0x0205e7b4, -0x02c5744c,0x02f80d50,0x035c1f38,0x02cde578,0x0167ce2c,0x01cfd026,0x01e1bc16,0x012f8ae2,0x00f5a803,0x00d513bf,0x003926dc,0xffe18d87,0xffb7288a,0xffb595fb,0xffc7dd81,0xffc6d32d,0xfed0be86,0x00693516,0x00560a07,0xfeb63a22,0xff536f91,0xff6abd31,0xfff26384,0xfff34825,0xffe24216, -0xfd41ebcc,0xfcb2c9e4,0xfed62f3a,0x017cabba,0x01eea1fc,0x02efc5e8,0x027f6358,0x01e704d6,0x0222d598,0x01f31af0,0x01fa8170,0x032073a0,0x04e79b58,0x03c73914,0x02ecc0ec,0x013710aa,0x017be698,0x01ce02ce,0x0121dc94,0x00e1523d,0x0115de0c,0x0027d2a9,0xffa6c1c6,0xff7832b9,0x0012c6c5, -0x009810dc,0x009d32ff,0xfef73ffe,0x01324e1a,0x000f1b1a,0xfd8b5374,0xfeb22f30,0xffdce2e0,0x005b751d,0x007c762d,0xfe834770,0xfea2e138,0xfe91442c,0xfd85478c,0xfe779b48,0xfe483fd8,0xff2f39e4,0x01483ff4,0x03d3d53c,0x045040b8,0x03b29b98,0x02fad094,0x031ef804,0x04872d38,0x02e93b68, -0x02b1cdc4,0x024d18f4,0x020d72d8,0x031ffd0c,0x03cac818,0x0165b8e0,0x007d9dd5,0xfd37fc70,0xff6bee67,0xff12b805,0xfd29d98c,0xfb242f78,0xf98afe30,0xf7b63a20,0xfa098c48,0xfbeb5680,0xffbf87de,0xf802e508,0xf61f3790,0xfa654ad0,0xfc43dfc0,0x0c2518c0,0x09a8ad00,0x0ad884c0,0x0a06b0b0, -0x08dfd320,0x06d6f7e8,0x05cc4cd8,0x06e9ca98,0x044ec1d8,0x041fe730,0x01aecc22,0x01d67f88,0x02a65634,0x04fd33d0,0x0270e400,0x022e69f0,0x0150ffdc,0x0131d70e,0x01f0c996,0xff4bcc13,0xfd7b626c,0xfe705940,0xfd634788,0xfc70863c,0xfaa4c070,0xf91f85f8,0xf7f062d0,0xf7cb5890,0xf7d712e0, -0xfb1ced28,0xfb2cee80,0xfccf62a0,0xf8a740e0,0xfe04dcf4,0x0b979580,0x0bf84510,0x01c2c236,0xff024863,0xffd3f4bb,0xfe8d8ef8,0xfeb3fcb0,0x0234f9bc,0x04771668,0x09e89fb0,0x02ec5a64,0x004ace26,0x019d1670,0x005bc0f5,0x0351aa50,0x09a569f0,0x04cb8518,0x02f7de98,0x0288a310,0x00e7ef13, -0xffe09991,0xfd97cdb0,0xfaedff40,0xf8cd2ff0,0xf6ce9610,0xf6dfd410,0xf7544f40,0xf83504e0,0xfa7aa938,0xfcdde1dc,0xfe6e74a6,0x03c61c38,0x05161620,0x041533a8,0xffb97bf2,0xfe0beaf8,0xff16fbfe,0x0139ce6c,0x01089c6c,0x00781063,0x00c283e0,0x01a2bf50,0x01ee2328,0x02ecadf4,0x023d5480, -0x03700a3c,0x01eb12bc,0x01950152,0x03f7d2a8,0x00a7a6aa,0x0170cf48,0x04b39e18,0x02eb11cc,0x032cfdfc,0x015041d6,0x01081988,0x0184f076,0x00a14291,0x01bd864e,0x02af4cfc,0x01e7582e,0x03d8dc34,0x050b92c0,0x06937550,0x08ec1dd0,0x0abeadd0,0x0b5cedf0,0x086bfbc0,0x0472ddd0,0x01d20b26, -0xfe4de632,0xfeeed642,0x0446c358,0x02306fdc,0x022c3d04,0x01e61d36,0x012cbee2,0x01201576,0x0183e714,0x01952420,0x02c4428c,0x04affad8,0x0297ed30,0x015ef09e,0x00c830f1,0x019d6860,0x026b5244,0x029e92d0,0x01fc2632,0x0110c6fa,0xffa7512f,0xff502820,0xff904dba,0xfeecb44e,0x0043fc72, -0x011979a0,0xffb650c8,0x021ebf94,0x0361005c,0x044891c8,0x060723e8,0x072da370,0x081b04a0,0x066e66a0,0x05215488,0x04f70478,0xff17a032,0xfde1e340,0x01b7c4ec,0x01c0bbf6,0x03cc10fc,0x03320e84,0x033f6cf8,0x02cb20b8,0x02290084,0x01a2e990,0x013c8664,0x01e40076,0x010fc50c,0x013141d0, -0x019df0bc,0x018ee0c2,0x018f58fc,0x026bd2dc,0x0227a8f8,0x01f544da,0x01f1abc6,0x0174dc04,0x0134f6ea,0x01c53baa,0x0260f39c,0x0209f370,0x00f20da8,0xffedc401,0x0082d547,0x02857564,0x03a9f178,0x040f7558,0x036006a8,0x033b4b44,0x0309be54,0x044397d0,0x016a5ff0,0x00bc6c52,0x0073a936, -0x030cc8d4,0x026393c8,0x0334d424,0x02e4cb04,0x0373102c,0x03d74004,0x03dd5c2c,0x03e8ac08,0x03f508d4,0x031f8678,0x02852c44,0x01633394,0x01d84d48,0x018371d6,0x01c0c3f0,0x0163b00e,0x01a9d908,0x01a3dcb2,0x019035b8,0x00a8b9c8,0x02022d00,0x01c4ab4c,0x002b9645,0xff6eb230,0xffdd3f97, -0x00315a58,0x004ca9b2,0x00603b23,0x009daac5,0x00d5cc9c,0x020a6490,0x02fb8818,0x04502628,0x03099378,0x0218e100,0x009ccb9d,0x016ac562,0x022a5140,0x0195ce8a,0x00c10859,0x00e24f6a,0x0084146c,0x003b3606,0xfff1c715,0xffdd857f,0x00143ba5,0x00a74163,0x00e36e26,0x0139a0b8,0x01504e16, -0x019f002a,0x014a3762,0x017e6a9e,0x015dd8f8,0x015fed8c,0x00413588,0x02477c24,0x0223a590,0x021e78d0,0x020a9374,0x01d2c18e,0x018afed8,0x013ec418,0x020bd6a4,0x02b92140,0x0351c85c,0x03e1a9cc,0x044eac20,0x04eee8c0,0x04513210,0x03f8af1c,0x03831f60,0x02f7e66c,0x033a6e34,0x030f76d4, -0x0342c7e4,0x02fd28b8,0x025661c8,0x02fec16c,0x02c99fe4,0x0248a7d4,0x026ecf18,0x0264e740,0x0273a990,0x02723a80,0x027f2a98,0x0290b76c,0x031308a8,0x0355282c,0x020fe628,0x0308756c,0x03526b84,0x03a03c48,0x033d589c,0x03521380,0x0348794c,0x033be0f0,0x03407db4,0x03261da4,0x03699890, -0x038ca2bc,0x03b869d8,0x03da5448,0x03fd6bcc,0x044481d0,0x03f844f4,0x03cdb124,0x03a35174,0x036d5af8,0x04446e50,0xfd923688,0xfd89bcf8,0xfdb2bae0,0xfd25feb8,0xfd26068c,0xfd81cce8,0xfdc6eee8,0xfd8d31cc,0xfd9fd428,0xfd605f80,0xfd61b58c,0xfd8a956c,0xfd8fccf4,0xfd88b15c,0xfd6fd540, -0xfd8eec3c,0xfddd4bb0,0xfd51b62c,0xfd401674,0xfd62c0f4,0xfe240350,0xfdf58c84,0xfdf5d9bc,0xfdddfb64,0xfde2cd40,0xfdded98c,0xfe0571b0,0xfda0be80,0xfd7d7928,0xfd660cd4,0xfd81d2d8,0xfd5086f4,0xfc8ff754,0xfcf0e0d0,0xfcfd1280,0xfcda3808,0xfd58da44,0xfd633694,0xfd820da0,0xfd4c8dd8, -0xfddeb9e0,0xfec98342,0xfebf5218,0xfeed4086,0xff1030a1,0xfe9346ce,0xfe5a3f5e,0xfe70ddf6,0xfec749a4,0xff0673ed,0xfeb1e84a,0xff0a10f0,0xfee0072c,0xfe51a96c,0xfe02806a,0xfd6d7df4,0xfe3da33a,0xfe3be950,0xfe0e5562,0xfdc25ef8,0xfdc5dff0,0xfdb32fc8,0xfdf20848,0xfcd71790,0xfc7cc7e0, -0xfc64a6c4,0xfcb83540,0xfc28ecac,0xfa543db0,0xfb1136c8,0xfb440c68,0xfb510ca8,0xfcb7b500,0xfc7fa7d8,0xfcdbfbb4,0xfd12a1e0,0xfd8c601c,0xffc0364e,0xffe00e07,0x001dc39e,0x00797140,0xff71142b,0xff8a5cee,0x000f138a,0x008842b5,0x00a7cbe6,0xffc92ce8,0x0091ffc9,0x00688edf,0xff572270, -0xfe90c324,0xfe2315ec,0xfeda2e6a,0xfee32994,0xfebeaf34,0xfe26d738,0xfe4c5d46,0xfdfc723c,0xfe88cf94,0xfc615d18,0xfbab66f8,0xfb483698,0xfbbdab70,0xfaa588c0,0xf75bf440,0xf8e48908,0xf92e1058,0xf8e46990,0xfb9a5c28,0xfdd291d4,0xfe55b336,0xfe7270bc,0xffb23589,0x028fb840,0x027c5654, -0x0301c6f4,0x02c318e8,0x013902e8,0x012b4980,0x022d7a94,0x02696348,0x03553718,0x03266d44,0x0387bb6c,0x028bd5d8,0x00662d7f,0xffd0cfa1,0xff567914,0x002bd978,0xfff28d8a,0xff4f0796,0xfe302902,0xfe46ecf8,0xfe232e6a,0xfe8d66e0,0xfb341bd0,0xf9b84398,0xf9a02f90,0xfa599968,0xf8b88908, -0xf43dcf70,0xf61f6410,0xf6872110,0xf6e6ac40,0xfbbadbf0,0xf81c22f8,0xfb7f3f18,0xf826a6f8,0xf888a290,0xfc629ef0,0xfef3e3e0,0xffac8a2a,0xfe7d9e18,0x026a4198,0x03c804e8,0x01a2380e,0x03a83fcc,0x03727610,0x00e8c768,0x0222eca0,0x0226d554,0xfff54086,0xfedda9b4,0xfde4a854,0xfe12b086, -0xfeec223a,0xff8f8b64,0x00a49c1f,0xff30d265,0xfd7a9490,0xfd049798,0xfc0a371c,0xfc1cf998,0xfbd8da08,0xfb4ad6c0,0xf9b1e318,0xf5dc1760,0xf84c9fd0,0xf9027210,0xfb6cdcf8,0xf8c456c8,0x05b8d328,0x09447ec0,0x08e969c0,0x072e6510,0x044aa990,0x0220d694,0x02489da0,0x06891cb0,0x025a0f5c, -0x00dc61ca,0x00872587,0x00011637,0x01c08562,0x0389f298,0x033bcf24,0x02383a64,0xff1b0b92,0xfe7e16c0,0xfc7da57c,0xfd7f5e90,0xff294bd7,0xfe35a812,0xfd19b0fc,0xfe7dad80,0xffbece0e,0x01df20d6,0x00a9b1a5,0x00206d15,0xfea8bea4,0xff039299,0xfac34858,0xf0dac4f0,0xf4e51350,0xf7fb0170, -0xfea44d26,0x01829fbc,0x01ca7bd0,0x00285593,0xfce3de74,0xfe759fac,0x012fc3d4,0x075b8648,0x070c8160,0x04834be0,0x00c535f7,0xfe6ded74,0x0080a0ab,0xffa9faab,0x005f1fc5,0xfd193544,0x0356f34c,0x03d88b90,0xfd000d7c,0xfe938762,0xfdd5c044,0xfdaa468c,0xfcd7fb00,0xfd87d0d8,0xff26b4a8, -0xfe4df1d2,0xfd43b618,0xfd3ee424,0xfc76d7e0,0xfde9ab14,0x004e79ca,0x03718f4c,0x06638358,0x08782210,0x0c6f0cf0,0x0e0bc250,0x128ac340,0x075a61e8,0x00ea3d86,0x017f6240,0x0177c212,0x01c94066,0x0105e872,0x01be6aca,0x01a0a940,0x01364664,0x03dd4be8,0x03946f80,0x02829a3c,0x021738b8, -0x02ce4f54,0x00cc635d,0x047408b8,0x04629470,0xfff24d22,0xffa2736d,0xfe90c012,0xfed04028,0xfdac7128,0xfd526278,0xfdf825d8,0xfc7c46f8,0xfd18c7ac,0x0020df29,0x022cd04c,0x04e1d290,0x06230178,0x0b046080,0x0a608c40,0x06155318,0x00903c0e,0xfd8ab8bc,0xff1f11ea,0xfefaafd8,0x011fbeb4, -0x00803c78,0x00989759,0x00c16b46,0x01217622,0x03138318,0x0328c874,0x019dc3ac,0x015a37ee,0x00ac33df,0x01241efa,0x006670ee,0x005d25fa,0x0171b56a,0x0073d918,0x00555acf,0x00abab64,0x00b48e3d,0xfff0a56e,0xff6121b4,0xff002921,0xff5d7f6a,0x01ce0fc2,0x01c96632,0x025120f0,0x04002010, -0x026ba7fc,0x0142aede,0xfe7819be,0x006d4bf6,0xfffafe32,0xfebe44a0,0xfeda6724,0xff4fac83,0x01493e5c,0x0147e1dc,0x001da247,0x00323c25,0x000e4910,0x00127d94,0xff8997cc,0x002c09e0,0x008c29b4,0x00d8a6ef,0x00bdae3a,0x00999d9e,0x005e3b69,0x01181ca4,0x01ab5a5e,0x01c924fc,0x00f280d8, -0x007818e4,0xfff4df0c,0x00043c60,0x002df4b8,0xff4f2dbb,0xff7019c9,0xffa623e5,0xff6db090,0x015bf11c,0x018f1c52,0x00535e32,0xfedb65ea,0xfe8b48dc,0xfef4afce,0x0144c748,0x00d4c138,0xfda004cc,0xfcc62dbc,0xfce1a830,0xff29cf25,0xff886258,0xffdec7d8,0x00911a9d,0x00a1376e,0x00ac6f64, -0x00f0c561,0x00ed1d5d,0x00b8e4c9,0x00c3e807,0x01430fee,0x0194046e,0x023c0a8c,0x01400b02,0x00d95d67,0xffe4b92d,0x007cdd8e,0x00842042,0x00eb1728,0x00ec5fec,0x01734ab8,0x0085d198,0xffffe9d0,0x009c0337,0x007fddf2,0xffa8b276,0xfecff6ce,0xfe3f1f96,0xff575f64,0x003e4094,0x010f053e, -0xff82a9c2,0xfe745ab2,0xfd82ce94,0xfe64ace8,0xfeb74da6,0xfee1e114,0xff52d95a,0xff185553,0xfef5047a,0xff8843b6,0xff094bb7,0xff194b3b,0xff3c7f65,0xff549210,0xff13b0d6,0xff40387f,0xff03e246,0xff316ab6,0xff226406,0xff66cadd,0xff71f81d,0x001ed5a4,0x00424c67,0x0068c8cf,0x00bf839e, -0x01fb07be,0x013cff56,0x0174bcfa,0x0188cb5c,0x01bf2baa,0x01fb03c2,0x02559d80,0x028283f0,0x01e4f7a0,0x01273df8,0x00b5a400,0x0033a984,0xffd75c28,0xff259783,0xff20006e,0xff13f9ed,0xff1943de,0xff237169,0xfe471662,0xfe26888c,0xfea587ee,0xff1bb0a5,0x000a9dff,0xfe9b74b6,0xff37167b, -0xffdaec61,0xffcd5890,0xffe30bb0,0xffe38f6d,0xffff4bca,0x000c9ef1,0x001a545b,0xff331730,0xfeab0382,0x00b30800,0xff9e0f24,0xff339774,0xfea96d6a,0xfef532fe,0xfef2f3f0,0xfefd4e9e,0xff0dc0d4,0xff11ac9a,0xff3b1d2a,0xfeedd380,0xfec2862e,0xfe811bda,0xfe630be4,0xfe3e824c,0xfe0fc4d2, -0xfe2fb626,0xfe3654c2,0xfe3e8d70,0xfe39f5a8,0xfd6f2698,0x00ae4442,0x00aa0e63,0x007c5cf9,0x006e2949,0x005fc2a8,0x006bdeb3,0x0090cbdd,0x00b46c3f,0x00bddbfe,0x0084b92e,0x007ba565,0x006cbc89,0x00967a6b,0x009b1bb6,0x0071bab4,0x00d91df8,0x00e7ee12,0x00a45760,0x00c9e354,0x00b6b6c9, -0x0061389c,0x008f4508,0x008eef98,0x006c7342,0x008345dc,0x008c36b1,0x00855a74,0x00af6c71,0x00bb56d8,0x00edfe88,0x008035a4,0x00743457,0x00bb5dd2,0x00b8241f,0x00cf9867,0x00e33298,0x00d2f692,0x0110a7a0,0x00a1f539,0xffb21fd1,0xffccba89,0x0067d544,0x0066ab97,0x00ac1fc2,0x012853e8, -0x00b13f6b,0x0098020d,0x008ff1b6,0x00e776c3,0x00f386ff,0x00ac7a2e,0x0123a2ac,0x0138544a,0x013b06ba,0x00cdf099,0x00a685ab,0x003674ff,0x00837b17,0x00899dc5,0x0032688b,0x0065b038,0x00794763,0x007d5d65,0x01143dae,0x014b65f2,0x01a3e248,0x005a9764,0x00363cbe,0x0124fe7a,0x010ac6d6, -0x01338aae,0x0149ed72,0x01545422,0x00da71ff,0xffab8c26,0xfe946144,0xfeb89966,0xffe48847,0xffcfd5e9,0x005b1a19,0x01affcaa,0x0077604f,0x0053b528,0x006ecfa4,0x00f302f2,0x013e7356,0x0057aa69,0x01641c0e,0x018b3edc,0x0189cdc4,0x00b8bc92,0x0067230c,0xff997d08,0x00410168,0x0042b597, -0xff8bbf2d,0xfff5907b,0x00375bc8,0x003fdd7f,0x015074be,0x01863b82,0x025d3760,0xffe74762,0xff8dd822,0x01edb93a,0x01a84eea,0x0258f244,0x01f47918,0x0180b436,0x01ce5f28,0x004ac51f,0xfdf1c008,0xfdffd940,0x00576acc,0x0026637e,0x0109be08,0x02ad171c,0x00e8f93e,0x00d2e92a,0x01088034, -0x026fe7e0,0x02be54d4,0x00d15c71,0x02737260,0x029fcf6c,0x02072940,0x00efc3fd,0x0064397a,0xff37f3be,0x001b8e6f,0x0024d5fd,0xff196646,0xffd8e8ab,0x00125c91,0x003de420,0x022d89d4,0x0307d6bc,0x04124228,0xffced384,0xff98722f,0x035eddbc,0x02db8fe8,0x02fb9774,0x02f46dec,0x026e9e68, -0xf89ac560,0xfa19a3d0,0xfa9fe818,0xfba0dc10,0xfcd1ecd8,0xfe62f590,0xfebf0dee,0xfef09fd4,0x00dc8b44,0x0281ce54,0x013c565c,0x02a0d6b4,0x02728018,0x014de63c,0x01dd5f62,0x0109962c,0xffdd214c,0xff6b07c9,0xff692473,0xfec62cb4,0xfea5691c,0xfec0d7a8,0xfe3ac538,0xfdd4bb2c,0xfe95e640, -0x003128cb,0x0010ed49,0xff93cce9,0x00418d71,0xfd4ef484,0xfcd0052c,0xfba219b0,0x004a6b70,0x01459772,0xfdc87af4,0xfa5cc7c0,0xf9fe7578,0xffa6c59e,0x00d19786,0xffa3417d,0xfcf31440,0x008ddd9e,0x02688e44,0x035b98dc,0x015c11d6,0xff9de684,0x00a5f0d2,0xffe46492,0x0129a256,0x019e28de, -0x0301e298,0x032b84cc,0x01f96622,0x015c7dea,0x010b1654,0x00edfec0,0xff10a48a,0xfeca8eca,0xffbc0e5a,0xfc181d38,0xfa00b028,0xfa313920,0xfa37dbf0,0xfadd0a48,0xfca86ad4,0xf7f66740,0xf7fd9cc0,0xf8208e70,0xfb3648f8,0xf9925540,0xf48f5d90,0xf7ea1290,0x0bc05210,0x07d974b0,0x0412f678, -0x0557ce40,0x0786cfc8,0x08b23e20,0x05cb0eb8,0xff05f32c,0x010ea178,0x00294172,0x0088f912,0x00874158,0x0142a9d2,0xfe17e042,0x0471ae30,0x05279148,0x006e631b,0xff7e8a87,0xfdf9983c,0xfded1ba0,0xfdbde514,0xfdff27e4,0xfe79beae,0xfd929078,0xfd93e7b8,0xfe93fe24,0xfce35044,0xfc2fbfe4, -0xfcdc7064,0xfae31598,0xfa3fb3b0,0xf6ee6b10,0x03f6c0c0,0x0b0abbd0,0x0a116d60,0x0d056e00,0x00c8507c,0x0033a856,0x006e5e6f,0x007c9c25,0x0034cbd6,0x025a3120,0x03acdb50,0x032d0ed0,0x03e05af0,0x02996a24,0x00a7ecee,0x01c3d732,0x01cd3632,0xfee63268,0x026fe680,0x0296c814,0x000c699d, -0x00778c25,0xff1938ec,0xfd8c6304,0xfc20c244,0xfae2cad0,0xf9904e30,0xf7dbc1e0,0xf6b925c0,0xf6003a10,0xf6c676b0,0xf9f5fd48,0xff267a67,0x01f5cc9e,0x0446ad60,0x0115ab18,0x06842098,0x06017fe0,0x01fd523e,0x01a19f7c,0x01f595d8,0x020ff9bc,0x01f256a6,0x02564c44,0x0293bedc,0x030a8d28, -0x026d6da4,0x00f0a0db,0x00d157a9,0x00cf57fb,0x000e552f,0x004bcb22,0x00fb4712,0x01d23dd8,0x0343a1b4,0x0312e6cc,0x018314f4,0x01aaeada,0x0171846c,0x0210ccd0,0x0224cd20,0x02101734,0x021c5ef4,0x02413fd0,0x03449218,0x03d78338,0x0599d860,0x068c9b20,0x07fdf380,0x04335960,0x014b528e, -0xfcb85cdc,0x0131cd50,0x03886d78,0x048aeb08,0x02d7c690,0x037b15b0,0x025e15cc,0x01d4507e,0x01804908,0x0182cf2a,0x022ac9b0,0x02c58760,0x02b59694,0x02f0fc34,0x0279abc0,0x01e73330,0x01a58e98,0x01798c00,0x0128d3a0,0x012d2746,0x0103c9d0,0x00b8a1aa,0xfff7c1d4,0xff7c3e5d,0x003444cc, -0x0056a986,0xffd4795a,0xff78ce5f,0xfcc953d4,0xfc01d3d4,0xfd0c9b7c,0xfee99f4c,0x00361cb6,0x01881792,0xfeaa6e04,0xfe4f4ff0,0xfefd7e4e,0x01845b5e,0x02fe2180,0x0428c530,0x0439a030,0x027b5158,0x02b20a6c,0x023e7734,0x01d2bb82,0x01500a46,0x01405cc8,0x011162ee,0x00e6fdff,0x00d588f5, -0x0130761e,0x012d61aa,0x01af1788,0x0162438a,0x01e3dab6,0x019b4f02,0x01e9d0a0,0x01e02d6e,0x0190d5c6,0x00e03575,0x015d3d54,0x01c40e2c,0x014bbcd0,0x017dc7bc,0x022de020,0x02c5ddf4,0x02f85f5c,0x0256e7f0,0x0191b45e,0x00f81ea9,0x00ab3a81,0x005e2422,0xffc63e63,0x008002cc,0x0145a94c, -0x022f5d28,0x024b6dfc,0x007980af,0x00f0fab0,0x0074822f,0x01629bc2,0x01666124,0x0191a1b8,0x02036f94,0x025aa3dc,0x02411cfc,0x01f46d98,0x0179d812,0x01745738,0x014872e6,0x0109c3aa,0x00b41db2,0x00a97efd,0x00c20a65,0x00b2e99e,0x004bd6fb,0x007f5516,0x00365b76,0x0024c3f4,0xffe58867, -0xff99f884,0xff476c7b,0xff2807f8,0xfefe59d4,0xfefa9a4c,0xfeded56a,0xfee43d50,0xfeea49d6,0xfeddc0f0,0xff49f812,0xff7f8dfc,0xffcf2bc5,0x001a8c53,0x00b5c5d8,0x00f4408f,0x0069f28b,0x00188ced,0xff706d28,0x00f0404e,0x005c2319,0xffc648e5,0xff9f4218,0xff9007ff,0xff8cd191,0xff5f3da5, -0xff3f59d5,0xff1b3136,0x0010ee66,0x009abc09,0xff1ecb9f,0xffee0a73,0x004fb9fa,0x00bfbc0e,0x008dcbd8,0x0085981a,0x007b68ba,0x00726219,0x006bb782,0x005aaa62,0x005e0c8f,0x005d53e8,0x006122b0,0x00528ecd,0x0049f88f,0x003c30f4,0x005ae10a,0x00749f4a,0x0089cde9,0x00aa8104,0x00f38ccb, -0xff5787cf,0xff266410,0xff401b6b,0xff393884,0xff3bc41f,0xff39c56f,0xff565e2e,0xff67a7dc,0xffaefbda,0xff71fb9e,0xff637804,0xff62101a,0xff6c22a2,0xff75d2e2,0xff8ab638,0xff881d05,0xff976b2c,0xffb09ce2,0xff8b2612,0xff892e1f,0xffbdacc7,0xff772e90,0xff71ecb1,0xff98b77f,0xff5ff2ca, -0xff50d3fb,0xff4b400f,0xff5d0e3a,0xff53b2cf,0xff487439,0xff022209,0xfeff718e,0xff36d425,0xff4c2924,0xff4d611b,0xff42a5e0,0xff1eb8f6,0xfe6dce98,0xfe9c1d9a,0xfed47fb2,0xfec1eb50,0xfec3e05a,0xff6531ba,0xffc5f961,0x002ea90e,0xffb88464,0xff86a723,0xff834e07,0xff87e58f,0xffab388a, -0x0009e31c,0x00054a4e,0x0029c117,0x003f2df8,0x002fc9d6,0xffc562b3,0x00114496,0xffa4113d,0xff70871f,0xffddaea9,0xff3d6699,0xff1cdfcf,0xff0afae0,0xff2d471d,0xff014113,0xfec05c7a,0xfdef370c,0xfdecdd98,0xfeb10f94,0xff246eec,0xff4bd4f1,0xff17c863,0xfe9b9956,0xfda7d49c,0xfe9eab24, -0xfee37ae0,0xfed30e5a,0xfe8bb816,0xff87b159,0x0033ca39,0x01421790,0x002197a0,0xffcac88a,0xffdcf682,0xffde38bd,0x004ca231,0x012b4a14,0x00c9b837,0x0103cf6a,0x0161a92e,0x01062984,0x00632f50,0x007b4bbf,0xffde2357,0xff881fac,0x00646956,0xff3a0357,0xfef69084,0xfecd86ba,0xff106b58, -0xfea34188,0xfe600100,0xfce0390c,0xfd034218,0xfe706d08,0xfee7bed2,0xfec4474e,0xfea0370a,0xfdbcb048,0xfd1578ec,0xfdef7390,0xfdc9edb0,0xfd6f907c,0xfde6a864,0xffa7d159,0x00e2996c,0x028da02c,0x00a8790a,0x00764d45,0x008b0eef,0x019d077e,0x016a37d0,0x014b620a,0x016a949a,0x0204b8b4, -0x02128f64,0x016ca152,0x009a7a70,0x0112b4fc,0x005b1f63,0xffaedfc3,0x0101fdc4,0xff44b818,0xfee38f0c,0xfec60268,0xfeb60b30,0xfe4e21e4,0xfd8b40a8,0xfb065800,0xfb087f08,0xfdabe854,0xfedab12a,0xff4a5d95,0xff3aaa9d,0xfdbb4008,0xfacbe6f0,0xfc9c6418,0xff66b38c,0xfffd5ac6,0xfe85c074, -0xfdf48614,0xfe7150ba,0x00578e75,0x003b20b9,0x011cd9ca,0x00e32ef8,0x012ec484,0x020d6adc,0x037c68e8,0x017b51f4,0x0120d59a,0x01f3815a,0x00daeb5a,0xff39893c,0xfe4b563c,0xff63cbb1,0xff64e096,0x0033dd1e,0xfe88dcde,0xfdec1048,0xfd1b01ac,0xfd3f18a4,0xfc4d3244,0xf9ea0748,0xfd021d10, -0xfe3b67e6,0xfea2ba92,0xfdc4f154,0xfbe1ed28,0xf83a4648,0xf9e3e440,0xf8cfcc40,0xfacc15b0,0xfa6ebb08,0xfc107cc0,0xff1823d2,0x022765c8,0x0289a6f4,0xfee7fc52,0xfff2a854,0xff752b98,0x006c4a25,0xffebe097,0xffc85b9d,0xff29fd72,0x02c5ecf0,0x02f535ac,0x00cdaca5,0xffd0385b,0xff0e00bd, -0xff283bf0,0xffb3d42c,0xff709e85,0xff0e91a1,0xffe0154a,0x00d6cfe6,0xffd08337,0x00df78f6,0xff5bb549,0xfc7c1e28,0xf93b12f8,0xfa465948,0x01a7d1ea,0x011c5a50,0x00fa33ca,0xfe1a8754,0xfa61b4a8,0x0abbac10,0x0d69bc70,0x0b428d30,0x0a14c000,0x0a0299d0,0x05797a20,0x02de4eb8,0xff6cda9f, -0x0126d818,0x00773b51,0x001d5b47,0x00375be2,0x0048cac1,0xffc4a513,0x00aea109,0x015a268a,0x03051b88,0x00555b0b,0xff2684e9,0xff108dba,0xff9b9bea,0xfef45232,0xfdba1698,0xfc137ed4,0xfba5a708,0xfaf12038,0xfe733e1c,0xfea0c888,0xfdef3984,0xf8e1a100,0xf89bff28,0xfeba4546,0xfa1979c0, -0xfba6e160,0x01deea9c,0x06fd4978,0xff0ae38f,0xfffc3d11,0x0036cca3,0x01c0a68e,0x02f28310,0x04214b80,0x0460e690,0x03c1e43c,0x010b2cae,0xffe39e25,0x0094b66a,0x0094dfca,0x005a3e44,0x007856de,0x00df4cee,0x0143d0fc,0x032d5c7c,0x009ad49f,0xff593509,0xfedd1ecc,0xfdb34360,0xfca10de0, -0xfc88363c,0xfc3a24a4,0xfcc0deec,0xfc742e6c,0xfd52ef40,0xfc097f2c,0xfc588c48,0xf95d9180,0xfca993c0,0x06381168,0x091ea4c0,0x0a59f480,0x073336c0,0x01fba522,0x01745a42,0x024542b8,0x02336868,0x02882580,0x02d4e8cc,0x02925c00,0x01f92e7c,0x016c59d6,0x01d60f0a,0x029380d8,0x03b29d50, -0x025f7ca4,0x020f89f4,0x01ab9fca,0x031778a0,0x02f71254,0x01f5d0aa,0x0100b2aa,0x00ffbc85,0x00df4597,0x0045e176,0x00311894,0x001a2672,0xff10ecf5,0xfef0c13e,0xff7a5f8c,0x01dacd28,0x0337ac14,0x04bd75d0,0x027bcd10,0x022a03a0,0x04c501e0,0x01313a08,0xffd215c4,0xfea737de,0x000ee131, -0xfe1ca966,0xfec6001a,0xffb6ccaf,0x009e8a78,0x01ad8bca,0x027477b8,0x02ccc354,0x024fb7a4,0x02b3c304,0x028df538,0x0268e554,0x02042b00,0x01b19b4e,0x012b2892,0x0121c2ea,0x019bdbe8,0x0277de84,0x026f2764,0x02191de0,0x01a1c4e2,0x01b00182,0x0221204c,0x02d0b9e8,0x041cbef0,0x04fe8a68, -0x04d52ba8,0x03cea080,0x01bb11ba,0xff3e09ee,0xfea554e4,0xfefb64e8,0x00ee91f8,0x013b4958,0x01379f1c,0x004e36fb,0xfea84982,0x0108845e,0x0070849b,0x00cdeb98,0x00b151f1,0x00938199,0x00be776c,0x010126d8,0x015e194c,0x01536940,0x01477d3e,0x015e9d12,0x01bf3514,0x02535cac,0x02e1504c, -0x023afb8c,0x01549e56,0x0063788b,0x011a26de,0x02288aac,0x0224bcac,0x01e9a77e,0x0243ed90,0x023a9094,0x01bfbbc0,0x014f59a4,0x0129d81c,0x0096862b,0x0054eb2d,0xffee058b,0x00d0ad83,0x01534bcc,0x01b94ffa,0x0195a1ba,0x019eb238,0x01f78d4e,0x01990f50,0x019ccb6c,0x01c8c944,0x01bf22ee, -0x01e90776,0x02072980,0x023d7584,0x0251b7e0,0x0275a794,0x026060d4,0x0261e348,0x025abcb4,0x024a60ec,0x022527d0,0x0222fe7c,0x01c15c9c,0x018b597e,0x013742b6,0x00c905f7,0x0043d52b,0xffb06d4e,0xffa74690,0xff8c97d2,0xff7e7b5f,0xff8d422d,0xff9aad52,0xff973bf5,0xffd70410,0x0012db8e, -0x003c2a01,0x00626dab,0x00856f6c,0x00ca56ef,0x00fe3b9b,0x0128ef84,0x013c7b92,0x0159bb8c,0x01747726,0x01918510,0x017d1b22,0x018fef70,0x01a2593a,0x01836dfc,0x0191b57a,0x01b245ec,0x01b42da2,0x01bb2d54,0x01be52f6,0x01c4719c,0x01c93982,0x01da0f26,0x019caa86,0x01649748,0x017bee48, -0x01381ab0,0x010a6858,0x00db2e47,0x00f42c77,0x00eef478,0x00ece1c5,0x00e5cdc4,0x00dc580d,0x00cac577,0x00ed554f,0x0101c0da,0x011a47de,0x0121cc9c,0x012977ec,0x0129a958,0x012ee792,0x013a45c4,0x014c9c08,0x016461e6,0x016f4f46,0x00564674,0xffed7410,0x004d2f11,0x002f83bd,0x002e5c33, -0xfffacff4,0x006746f5,0x007351d0,0x00770def,0x00562258,0x0041e840,0x00218a4a,0x002ef1fd,0x00431ae0,0x008277f6,0x00866727,0x009107ee,0x00822de0,0x00a0912e,0x009c8ef6,0x007575f9,0x0062fe1c,0x00538c91,0x004a99e2,0x005314f4,0x0046ddba,0x0022f1c2,0x001a127a,0x0021b645,0x005d1172, -0x003a8ee4,0x004b060e,0x00ac40f7,0x0046e661,0x0028399e,0x00299486,0xffed54ef,0xff54d0ec,0x000b2bc6,0xff6af25b,0xffaf6f48,0xff604ca9,0x0069d51a,0x00c13855,0x00cd0d6f,0x008534b7,0x00488706,0x0014bbf8,0x001b3f9e,0x0050a30a,0x00e744f1,0x00d92984,0x00fed3e3,0x011a197c,0x01379488, -0x013fb01e,0x00e8c3de,0x008ea9a0,0x00695162,0x0040329b,0x005a8648,0x003c0d91,0xffea83a8,0xffe646be,0x000258e1,0x0084cd5a,0x00392b72,0x00806512,0x015e78f8,0x0091868e,0x003acc84,0x001f7d8b,0xff5bbcb5,0xfe0e497a,0xffbceba2,0xff094ff2,0xff8f0d4c,0xfed9c322,0x006b879c,0x01030ddc, -0x013d454a,0x00b33e84,0x00208ccf,0xffc63272,0xffcf6e27,0x0050fccd,0x017d4842,0x016ddff0,0x0197c2d4,0x01b433b0,0x02007f64,0x01ff805a,0x0173d272,0x00b94f41,0x0065e49a,0x00361877,0x005ce915,0x002446e9,0xff6f99c6,0xff2607a0,0xff4e2c64,0x00ae675f,0x000cdeaf,0x0086ab48,0x0233cde4, -0x0016d4a5,0xff756381,0xff4e2015,0xfdcccde0,0xfd0d1a38,0xff1717db,0xfdaa8a98,0xfdba133c,0xfd6605ec,0x009033c2,0x01905328,0x0206be34,0x00ec3fc7,0x003fbaac,0xffe3c46c,0x00a21467,0x013b8bd2,0x02ce02e8,0x01dac540,0x023b2d30,0x02ffdcb0,0x0351a764,0x033ae984,0x023474dc,0x010bd710, -0x00a974f5,0x001dfb54,0x0050b76d,0xfff7a83b,0xff3630c9,0xff1c6d12,0xffab1de3,0x01193474,0xffd43fd5,0x00f611ea,0x03a81154,0x0124272c,0x0002beb0,0xffb0f6f0,0xfcd57b3c,0xfbda0940,0xfae21c30,0x01d69b0e,0x02b2026c,0xfe9bf1f4,0xff11dd79,0xff753184,0x00d2e8bb,0xff831510,0xffe2e9c8, -0x00c3fc6e,0x001b3b6d,0x00c75828,0x02709f24,0x0187fa1a,0x015866c8,0x01b3c5f2,0x0113c2f2,0x00e8fac5,0x00e273ff,0xffb4307b,0xff07b766,0xfe370c28,0x0019d16f,0xffe29e38,0xfda93cb4,0xfc140fc4,0xfc970fac,0xfe0d2f8e,0x03a4d000,0x039bcb50,0xfe641d40,0xfdb8586c,0xfc19ffb0,0xfa108c28, -0xfad3a4e8,0xfdc47d80,0xf9e89038,0xfa552ef0,0xfc1dc300,0x00d0e883,0x00a8fdac,0x006e7db6,0xfeebf692,0xffcf7540,0xffc9ab2b,0x003e99c7,0x000f51a1,0xfff0991e,0x00b6de65,0x0196556c,0x01fffd88,0x03450108,0x021ff7b0,0x01902712,0x0023d09d,0xffd8b8e7,0x0014e37e,0x0083ce3c,0xfefdd332, -0xfe531306,0xfe74790a,0xfca7ec08,0xfb798b10,0xf8f5bde8,0xfc85361c,0xfe8d1120,0x00f53980,0xffc31730,0x003251de,0x01864368,0x00df2ee8,0xfe563524,0x034f9b48,0x0881d180,0x072ca050,0x069b6e38,0x012ce83a,0xffe2a606,0xffe3ecf1,0xffe6a352,0xffca3046,0x0026d0b3,0x007b74dc,0xff5884c7, -0x0081a707,0xfe94579a,0xffc5ce26,0x053a7260,0x01d26084,0x0045f70f,0xff890105,0xffb07381,0xff34e853,0xfeefe952,0x00304530,0x00992376,0xff791727,0xfdbbc790,0xfbc9b9b0,0xf85bc408,0xfb185c98,0xfac1cea0,0xfb291f28,0xf603be70,0xf38c6370,0xf1f378b0,0xf8e56458,0x0a333490,0x05828ea8, -0x03b874c8,0x0408e9e8,0x058ee238,0x049355b0,0x039ee79c,0x026b6bbc,0x00660d7d,0x0003490d,0x002b11a7,0xfff8bfa0,0x0004276c,0x01976b50,0x0073a34a,0x00a1aa1d,0x036e7014,0xffa57303,0xfe7d1860,0xfe6a0660,0xfdb0b258,0xfddeb560,0xfe4a4884,0xfe66e6f4,0xfed970b6,0xffacbdd0,0x006cab61, -0xff226c75,0xfa408e80,0xfa1156e8,0xfa396588,0xfe473f5c,0x01e568f6,0x0673c2d8,0x0a577f50,0x0b952df0,0x00f958e5,0x018dba22,0x01e31bc0,0x02136c88,0x02d1d1e0,0x021bf020,0x024850e8,0x0325702c,0x03009ae4,0x02e370b4,0x02bda09c,0x02821904,0x01f87e68,0x00c4d75f,0x011f7c40,0x0173674c, -0x0252946c,0x011444c0,0x000be487,0xff24b0af,0xfe8a3024,0xfd96bb78,0xfc55eba0,0xfcb52e9c,0xfcd07234,0xfd47aa08,0xfc4a8fb8,0xfce3d090,0xfdf7c828,0x039fd940,0x072a6b78,0x095be0a0,0x07598958,0x0436a2b0,0x00df946d,0x00e760d8,0x01c5f90c,0x01a204d0,0x01953492,0x022d1650,0x02eb4f70, -0x028d7f10,0x02377f9c,0x01d61950,0x00dd371f,0x00a4cd5c,0x0113bcf8,0x0120cb32,0x013e3f36,0x01c9ee44,0x024bbe88,0x021a6254,0x014421e0,0x018957c4,0x01c07c18,0x02002998,0x02589c80,0x02f02680,0x03c4b034,0x04926570,0x04c19508,0x0514e888,0x042e7988,0x042b5058,0x041c1778,0x04258698, -0x039546bc,0x02c6e6a8,0x019b6b7e,0x014cc874,0x010379ba,0x01882162,0x003f82d9,0x0047a33a,0x00b9cdbc,0x012f402e,0x0177fdd6,0x0185cf6a,0x01bbb074,0x01fc2d1a,0x01d236e0,0x01a25ea8,0x015ca0aa,0x013fd402,0x016cc1b8,0x014c0804,0x00fee481,0x00c2dd8f,0x00b54a85,0x002504f1,0xff77cd6f, -0xff176bae,0xff2b0882,0xfeee2db6,0xfed23d80,0xfed0afa0,0xfee19b6c,0xfef169de,0xff6e0f6b,0xffefcb93,0x008d7e30,0x00e2468f,0x012efd12,0x015c8d3e,0x0109ab50,0x00955e69,0x00215ac7,0x00111486,0x01e46a6e,0x01fdb86c,0x01fea454,0x01c2eece,0x01c6f084,0x019fcb96,0x0171e2c2,0x01648e5c, -0x014f444c,0x016642ca,0x017b4ef4,0x0177f694,0x016dffa8,0x017dcaf8,0x015ca91c,0x013c89c4,0x0127d2ca,0x01061644,0x00dca4da,0x00ec8047,0x011a6c5a,0x013bb8be,0x0163c220,0x017c0418,0x0191e0f4,0x019b65f0,0x01987f8a,0x0181a606,0x016655a6,0x0139857e,0x011d7a0a,0x01212258,0x0148bc4a, -0x0185b1f4,0x01b53e5e,0x01e016a0,0x01bbfbb0,0x01d01660,0x01bbea2a,0x01a0fb30,0x017a81ca,0x01957fc8,0x017a34fa,0x016abb36,0x017ad1f2,0x01769e2a,0x01731112,0x0177439c,0x01767bd6,0x01769016,0x0167d1e2,0x017a3ff2,0x0124d386,0x0140ae36,0x014d4058,0x01690c5c,0x015fd7aa,0x01607b38, -0x0160ed08,0x016423a4,0x016afbd2,0x01781d12,0x016deb28,0x016f062a,0x0176c35e,0x018b6e98,0x019a3926,0x01987e08,0x01a0464e,0x01a0e70c,0x01a5f298,0x01ab898c,0x021379c8,0xffbdb01d,0xff96353d,0xffd8bf64,0xffc89b05,0xffca6746,0xffadb862,0xfff1cd7a,0xfff5e2e0,0xfff602cb,0xffea93dc, -0xffd54d1e,0xffb31054,0xffb8ccd9,0xffc1c65d,0xffdfbb97,0xffeff1ac,0xfffdb440,0x0011d706,0xffecfe55,0xffdc7dbf,0xffddc426,0xffc2d6ae,0xffb2c5f3,0xffa8f618,0xffad5f8d,0xffabdde6,0xff976410,0xffbe82fd,0xffc91c37,0xffb96315,0xffc2510e,0xffb6dfec,0xff9e289b,0xff87e177,0xff8022cc, -0xffa4bc0f,0xff83fbe1,0xff51a4b2,0xffdd13f2,0xffda7101,0xffdf6921,0xff6852eb,0x0059a009,0x008ca1dc,0x00494757,0x002bff0f,0xffe9d09e,0xff9c5814,0xff940973,0xffbd484b,0xfffdb7de,0x005959b2,0x008a733a,0x007bb4e4,0x0065b198,0x003e6e8d,0x000eed19,0xffb7886e,0xff8aa075,0xff80ea96, -0xff893eee,0xff854337,0xff43aec8,0xff9887e6,0xff9b4c37,0xff53de26,0xff7dbcfc,0xff649757,0xff1f50bc,0xfefbbdda,0xff042fd5,0xff7ccd86,0xff2bfacb,0xfedf713a,0x003615b8,0x0002c0bd,0x001af6d9,0xff4bb715,0x00e930d3,0x013c6010,0x00c8914d,0x00b0b654,0x0013a4a4,0xff71bc28,0xff5c97cb, -0xffb11294,0x00702be6,0x012ef054,0x0168ce7a,0x0143c5e8,0x010e2432,0x00c2acc2,0x008e4149,0xffbac68e,0xff6c94a3,0xff4dcdd4,0xff49deae,0xff37ed9a,0xfebcb480,0xff9a97d6,0xffdfb64b,0xff49517c,0xffa1dec3,0xff558ec2,0xfe947caa,0xfe4c8274,0xfe179928,0xff2fa7fc,0xfe978198,0xff49766e, -0x00d5cd62,0x004ced26,0xffc3221a,0xfe852106,0x01783d84,0x020ccc30,0x01d4f2da,0x0145aa56,0x003ca0c3,0xffba7829,0xffdbea60,0x009558a0,0x01d9bc2a,0x01c9900c,0x0237bad8,0x027a2830,0x025c51a4,0x01b93628,0x013d09a8,0xffc6bf00,0xff26d651,0xff24034d,0xff20b7a7,0xff1446da,0xfe311328, -0xff59e435,0xff58deba,0xfe144746,0xfec9112a,0xfe7d28de,0xfd8770f8,0xfd6b0a58,0xfdd09268,0xff984f62,0xfede59f8,0xfb84b038,0xfa9112a8,0xff9ea98d,0x01d5deac,0xffc0beee,0x00a96a60,0x00e991e5,0x014cc0c0,0xff247902,0xfecd793e,0x0038f91a,0xff97b936,0x003e8755,0x018d2e92,0x026cd558, -0x0268f4c0,0x01026ad2,0x01413a5a,0x0120b900,0x009f467a,0x006928dd,0x0020eb82,0x0056da2e,0xff5a28d6,0xfe72f4f8,0xfd790948,0xff3016ea,0x005e0e1c,0x0182b094,0x01df6c9e,0x00bb75b8,0xfe9bb74c,0xfcb4c678,0xfaf87c90,0xf9f191c8,0xfad88158,0x007d9cf9,0xfc8d4f68,0xfcd18c4c,0xfe6e2778, -0x01bce5a2,0xff6b50e6,0xfe08d230,0xfe1fff72,0xfecb3e70,0xff1df9f9,0xff2a1775,0x0011a9a6,0xfff9c06e,0xffe328c5,0xff555083,0x002658a1,0x03166a48,0x0144ad8e,0x005b30a7,0xfff7373f,0x005222d8,0x003038c8,0x00017cc7,0x00e6237f,0x00064c70,0xfda89008,0xfcbca4e8,0xfd08e664,0xff0b5b42, -0x00a9f952,0x008db684,0xfdbc5328,0xfed140d0,0x00027f8f,0x01cdbbe4,0x01425ca4,0xf227c720,0xf789a930,0xfe24fe8c,0xff5eaef2,0xfed214da,0xfe37cc44,0xff03052f,0x005c721a,0x0034d418,0x002d051e,0xffb991ca,0x000657f2,0xff529c5a,0x002ca0c9,0xff6fb2d3,0xffffdf2d,0x022f8864,0x01cb4a34, -0x01a1e06a,0x00c21f52,0x00a90dee,0x00b5bc88,0x0082d6bb,0x00b39cfe,0x0010e4ae,0xffecac7a,0xfd99a8e4,0xfd5f6f54,0xfe3ce118,0x001e15ad,0x008f30d6,0xfd1aa588,0xfd6b0b4c,0xf9b8a4c8,0xf5eacf40,0xf1e1b720,0x0d294870,0x0be8c130,0x09988a80,0x080792a0,0x072e9728,0x052ff680,0x032ba144, -0x014d96e0,0x0131bd0a,0x00a3a496,0xffde75fc,0x000e4c59,0xfffbf386,0x00b2f8ee,0x007e6607,0x00c7554a,0x01c5ad4c,0x012cc72a,0x007b80f5,0xff4a3c83,0x000281be,0x001550f7,0xff72667a,0x00affbad,0xffc8f788,0xfeb6dc06,0xfabb60d8,0xfa51bc60,0xfc762034,0xff240fc9,0xff230095,0xfb706fb8, -0xfb1abca0,0xfe486f30,0x05cc0d48,0x0a9f1dd0,0x014645fc,0x010d5bbe,0x0171169a,0x0219d5a0,0x032894dc,0x02a145d8,0x02d325ac,0x035829f8,0x02c3730c,0x024e0160,0x01b3c1ce,0x026a1038,0x01dd554a,0x00b0d2f4,0x00501b2c,0x009323e4,0x01fe73ac,0x00fae580,0x0079e4b1,0xff6bf98c,0xfeedaaae, -0xfe9e425c,0xfdf3db68,0xfd388ad0,0xfbb8aed0,0xfa6bfef0,0xf8ba8948,0xf948b7b0,0xfbc41770,0xfe178528,0x01ad1a16,0x055ecf40,0x07b1aca0,0x08011af0,0x0714e268,0x03214558,0x02583eac,0x02ae8958,0x03477df0,0x033a9108,0x02ad3f7c,0x020365c0,0x01765de8,0x01558a58,0x00db3e05,0x00a709a3, -0x005cd4f3,0x00c78059,0x01738866,0x01e9d862,0x0212fde8,0x01d9a97e,0x01ff93c2,0x011a7f42,0x01120f48,0x00c0c01d,0x00595e4b,0xfff6fb9f,0xff531ace,0x0014fa09,0x00af3192,0x00b5bca5,0x03202edc,0x04caeb28,0x061762a0,0x06324068,0x05802bb0,0x04332b40,0x01eba396,0x00c50e52,0x00ea616b, -0x01b86fa6,0x00cc70d8,0x0122c262,0x0152f27a,0x01c85a14,0x02455ce4,0x024ddcc4,0x025d44f4,0x026f3c84,0x0266f9a4,0x026173c4,0x0238c980,0x0204e908,0x016d8a78,0x01243fe8,0x01759900,0x020c8290,0x02908008,0x026ccb68,0x021bb5ac,0x021d262c,0x026cdb1c,0x029be7ec,0x02ba73d0,0x02790a4c, -0x02419ce8,0x01e93cec,0x01e52cac,0x01b7b0c8,0x01c48c5e,0x010def06,0x00888b7a,0x0029e823,0x006ca1fc,0x007b1adb,0x00218d16,0x006a9c2e,0x0147c9b0,0x011ab270,0x01322f96,0x00fb5d98,0x00f6a365,0x00f0e491,0x00dd40bb,0x00c64f52,0x00c02f73,0x00c7eeb6,0x00d02179,0x00e67263,0x0109f376, -0x011c972e,0x01350a6e,0x01479cea,0x0131afd2,0x015580d8,0x01518a28,0x02046ca4,0x01cc244a,0x0173a1e8,0x014f13ac,0x011e0cda,0x0102eed2,0x00ea3722,0x0126c9e4,0x0158b34e,0x018e8622,0x01bab3a8,0x01e5fe98,0x01e66d6c,0x01b456a2,0x018e4808,0x0182128e,0x016f6a1a,0x010428c2,0x00e9e049, -0x01448966,0x0169ff2a,0x01a77a10,0x012aea44,0x0172052c,0x01a70444,0x01a9a86c,0x01a961d4,0x01ab1088,0x01a60656,0x01a50658,0x01a6620c,0x0176f2ce,0x015854a8,0x01b6e7d6,0x01a6e740,0x019536d2,0x01a254e8,0x016e04d8,0x0163b38e,0x0146c20c,0x013162de,0x01180e3a,0x00ecd474,0x00fd6afd, -0x01000190,0x0100b73e,0x010d46ce,0x011ac9c2,0x013c2d98,0x01319780,0x012bd83e,0x01209cb2,0x010da63c,0x012c9e26,0x0070ade5,0x0058be38,0x005cdb23,0x0058a282,0x004a4a59,0xfffa58d2,0x0081871d,0x00788091,0x0039b858,0x004d0bf8,0x0039cbce,0x000553da,0x000d806a,0x0013d812,0x001f625d, -0x006ab102,0x008f66af,0x0060766d,0x0064e4f9,0x005dd077,0x00511d0b,0x005c5ec4,0x00586d1a,0x0041857d,0x00566034,0x00611de7,0x005e1594,0x008dae77,0x008936e1,0x0055859f,0x003d0b2a,0x00373b8a,0x00694463,0x0048cd87,0x004c6c76,0x006318de,0x005c9dc6,0x0073134d,0x008e893a,0x00924ea6, -0x00a325a2,0xfff47446,0x00bbb218,0x00e9a82d,0x008bbafb,0x00c221a0,0x008bf700,0xfffe3279,0x0011a69e,0x002a607b,0x004c13a6,0x00cbfcfb,0x00fb2fae,0x00f50412,0x00a6f4ce,0x006468ce,0x002f7dc5,0x00444c3f,0x003bc9c1,0x00083c56,0x003442e5,0x0058cfba,0x005a97f6,0x00edaef7,0x00db4890, -0x0058a73e,0x001b94e0,0x0021a0fe,0x00cf6789,0x0085fd99,0x008d631f,0x009f4478,0x006edd6d,0x00375243,0x001b1aca,0x006d907d,0x00839346,0xff3de99f,0x0139b320,0x0164fab0,0x0087de7c,0x01095344,0x0098c47c,0xff65a79e,0xffa17560,0xffd03edf,0x001d7e76,0x014c5362,0x01a2d6b4,0x0182beda, -0x00ec7210,0x0099a4cc,0x000c0644,0x002e3e05,0x001478d3,0xff989d24,0x0001277e,0x0044b696,0x002f22fe,0x0164d492,0x0140757a,0x00118801,0xff84f0a8,0xff4f8c4e,0x00a29a19,0x000d518f,0x0030e93a,0x00661700,0x0046abc2,0x00703c67,0x00eb9c12,0x01cc5bde,0x013f0e5a,0xfed269b2,0x01799a3a, -0x024cbeb4,0x0168eecc,0x01e13514,0x00ab7ac0,0xff2b52b9,0xff5104ce,0x00258fad,0x00fa1d80,0x025cab14,0x02a8db70,0x021971bc,0x01893e54,0x00ddac05,0xffd64dc7,0xffe2bf99,0xffd566d6,0xff17612b,0xffc1f7f2,0x002549ce,0x0011c7a0,0x02070e18,0x019a47e6,0xffddcb7b,0xff4f648b,0xff9c4f97, -0x01e1720a,0x014ecc8a,0x015e055c,0x012a606a,0x00728d5f,0xfea04b10,0xfc661d48,0xfb057000,0xfd5d4178,0x013b7ec8,0x017f717e,0x01221466,0x0003f93d,0xff19bd34,0xfeaf6d86,0xff638db9,0xff7c5806,0x002463a8,0x00d31b58,0x020d06b8,0x025b2704,0x0193a4c8,0x0191ee38,0x015a9e06,0x016e14b8, -0x002bf302,0xff8f8e9b,0xff5b2ad5,0xff258be0,0xff510bfa,0xfff3b136,0x00ed64dd,0x01995844,0x02ddc650,0xff239b58,0xfd2f720c,0xfde19744,0xfc31aba0,0xfcb367ac,0xfe84a34a,0xff21a64b,0xfeacba38,0xffa871c2,0x00bbfd14,0x00401dfa,0xfe487fc8,0xfdd37630,0xfdf9659c,0xfeca3d48,0xfeea5180, -0xff23b043,0xfef0db86,0x002e0315,0x004181c6,0xffeac80f,0xffb53107,0xfffbc278,0x010ab826,0x01b0511a,0x01bbed0c,0x008e37de,0xff967519,0xfeffff16,0xfe81b686,0xfe3c8918,0xfdcae778,0xfda8fd44,0xfe4408c8,0xfefd05d4,0x010688d6,0x00d227d2,0x014cffb8,0x013ccd6e,0x02216fe4,0x0175c2ac, -0xffe4466b,0xfe49ff64,0xfab05500,0xf76ce680,0xf8d39c70,0xfb2e3d18,0xfcfda09c,0xfe9ae724,0xff88c414,0xff703be4,0xffc680be,0x003dcacf,0xffa1418e,0xffee75fb,0xffcea501,0xffa9c82f,0x001d0e39,0xff76c377,0xfef22bf8,0x011a49b4,0x018119f4,0xffe1d20f,0xff496f8a,0xfeb4f71c,0xfe7e9dc0, -0xfe39af86,0xfd85cf20,0xfc5ac888,0xfd6a71c4,0xfe1177d4,0xff37f757,0xfddfe22c,0xfc94ed24,0xfbc5db80,0xfb8ecf50,0xfd759738,0xff60d68f,0xfcd152a4,0x02f89c08,0x06fb7138,0x09cf0250,0x083dbe20,0x06a97070,0x03f088a4,0x02042ec4,0x003010c8,0x00a003c3,0x001c8f05,0xffc4715f,0x001a174a, -0xffffc008,0xff7698bf,0xffc73cfa,0x000fa34d,0xff9eafc5,0x01d5f794,0x01f2df40,0xff6b9c49,0x001585d0,0xffc7aeb5,0xffa66e8e,0xfe6846d8,0xfd8e93b4,0xfbec4ae8,0xfd5d4338,0xfd895f58,0xfd08b354,0xfc68cd68,0xfc77caf8,0xfcfe44dc,0xfa43b640,0xf96b7ae8,0xfb0daa48,0xfeb7b934,0x08b0d140, -0x0661b2c0,0x04ce8d00,0x04573d18,0x03a75bb0,0x03513bb8,0x02ff78e8,0x029e2768,0x024cd240,0x019dc04c,0x0090cedc,0x004e1495,0x0093fb89,0x01b9c9f4,0x0098caba,0x003421f2,0x000e0ad6,0x0019034f,0xff912c9e,0xfde1195c,0xfcef3c70,0xfc33993c,0xfc375da8,0xfc46b068,0xfce18408,0xfc8b3934, -0xfeac2afa,0xfe32d3d2,0xfb5a7990,0xfb105d28,0xfaf9a630,0xfbe219f8,0x012a14e8,0x0598d518,0x089a3220,0x0938a210,0x02096c98,0x01f5e9f4,0x01f64cf8,0x01fc9256,0x019638e8,0x01a5da78,0x01c762c0,0x01cd3646,0x0217f470,0x02229cdc,0x01ff63a6,0x0184724a,0x01253332,0x00f932ef,0x016bd740, -0x01c31374,0x01bd24ec,0x01431496,0x006fbee9,0xff7c1cb5,0xfef66cb8,0xfe8a84a4,0xfe52436c,0xfd55600c,0xfd16e894,0xfdb56214,0xfea2e1d8,0xffb97080,0x00dcf7b5,0x032dc9e0,0x04d45f80,0x055c4ae8,0x0588ff30,0x049a57b0,0x0320cdfc,0x02670884,0x02601b3c,0x0286fe58,0x02646094,0x02788724, -0x02b0c5c8,0x02568c80,0x01e9c0d8,0x018efeaa,0x01b43fb0,0x01be14fa,0x0200b808,0x01f174d8,0x0208c44c,0x01d2dbec,0x01dea634,0x01b143e4,0x01ad8b28,0x01de7bca,0x0224c970,0x02775110,0x02a72d40,0x02c7bebc,0x02fe33e8,0x035cb9dc,0x03b8bac8,0x040ac5e8,0x04241500,0x044790f0,0x045f93b8, -0x036552fc,0x0299afc0,0x02226328,0x01ebb904,0x01dfc5a8,0x01ba0420,0x022616f0,0x00e50476,0x00e79b0f,0x00bf2315,0x00e89bba,0x00d333b8,0x00c739fa,0x00e4f935,0x00e4481c,0x0107a81a,0x0110b5e4,0x011e00ca,0x012c5d8a,0x0149feec,0x016a26a2,0x01b2eabe,0x01fe716e,0x025148b4,0x02973a70, -0x02dc80e4,0x02e8cc8c,0x02b9342c,0x02acf8a4,0x0284a9b8,0x02670b64,0x023aceb4,0x021139d4,0x01d8d2a6,0x01a10bdc,0x018bb340,0x01785c90,0x01705cb8,0x013a02dc,0x012cd2e0,0x011186d0,0x00fc2b64,0x00e9cf59,0x00d4fd0e,0x00d524dc,0x0092d077,0x007797bb,0x005e176e,0x00b33854,0x00894ab2, -0x00739021,0x0075d256,0x007bf309,0x0080a246,0x00893474,0x0089a1f4,0x0082bfec,0x00c62575,0x00f9fc63,0x00d87e3f,0x00ff8897,0x012751e2,0x01540e1c,0x014fcc4a,0x0150e9fa,0x01546490,0x01541e96,0x0157f35a,0x0163a08a,0x014a3f86,0x013160a2,0x010c718c,0x00f57bc5,0x00dd6edd,0x00c86a79, -0x00d76a6e,0x00df436d,0x00e596e2,0x00e026c8,0x00d86404,0x00434dcb,0x002e5e9c,0x0001f8cf,0x0033f5b8,0x00420394,0x00266785,0x005503db,0x005b6f4f,0x0048ff70,0x00637e24,0x005cd19c,0x0042fa7e,0x003c7817,0x003be44d,0x003993c6,0x004f9eab,0x005f83ae,0x009afc43,0x006dd935,0x005cf06e, -0x0049a4d9,0x004306a6,0x003d31c9,0x0034d15d,0x002eefa0,0x00380a69,0x0067dde5,0x004b7373,0x0032cfe7,0xffe258ec,0x000affe5,0x00178c7a,0x0037d1a5,0x003984d2,0x004376ca,0x00554e33,0x003a4a3b,0x00168151,0xffec2d6f,0x008c384d,0x00787a87,0x0015ad32,0x00710e63,0x007fc53f,0x00549226, -0x00826d7b,0x0073769a,0x00356644,0x0012e818,0x0013a21b,0x002be665,0x0080d737,0x00b09a1e,0x00fb9d4c,0x00b57ee5,0x00789301,0x0058905b,0x00506ba1,0x003409a1,0x002a2a4d,0x000d8f6a,0x002f4390,0x00a7dc50,0x0052e3ae,0xfff5b6b4,0xff47d6f1,0xff9ad1d6,0xffdba060,0x004f6309,0x0057e62f, -0x0063e247,0x00718b65,0x0038dfa4,0xffecaa4b,0xff5fb757,0x001e19b2,0x003c7859,0xff8a1000,0x00df5ad5,0x00de072c,0x002cd926,0x00b6d87a,0x009ac555,0xfff86963,0xffe6c812,0xffd5c218,0x000a7ae3,0x00b0d3af,0x013621ec,0x01cb3456,0x01362d80,0x00b3f87b,0x005b5c7f,0x006c17b9,0x003022ce, -0x0013587f,0xffdf8ef1,0x00209af0,0x0113fc48,0x008505f7,0xfff6b98a,0xfe575786,0xff0df1bd,0xff5e4db7,0x00221633,0x006ebfb0,0x008631d4,0x00c25b71,0x004413f1,0xffd7a3d3,0xff83e86f,0x017b0bde,0x0130061e,0xff23c1e2,0x00be83ec,0x018b6fe4,0x00bd83f3,0x019d1bf8,0x00f69e82,0xff613a4f, -0xff3cb74b,0xffc07ea3,0x0064728a,0x01a8b5c6,0x0215304c,0x026c4928,0x0175c85a,0x00a95f57,0x003c3557,0x0050cb0b,0xfff45b8b,0xffd9dc7d,0xff99b25f,0x001d04ef,0x0188a85c,0x0078cf8b,0xfef3f312,0xfcf3838c,0xfe42b9e0,0xff6981c2,0x00b6ca98,0x00ea342d,0x0120f2dc,0x01013274,0x0078a996, -0xffb845e8,0xfe8e0e84,0xfa9524b8,0xfc43001c,0x02b62384,0x0154c4f8,0x00a6aad3,0x001f3592,0xff470234,0xfee923c8,0xff34b857,0xffef2eb7,0x005a31a6,0x002e8848,0x00f103df,0x01b01358,0x02fa8c30,0x01a067ca,0x010d0636,0x01008dc6,0x011418a0,0x00e7b0c5,0x0088a06f,0xff8fea78,0xffa3b033, -0x00f35b9c,0x014d9cf4,0x01824030,0x021698e0,0xfcd65440,0xfba28248,0xfe1e8eee,0xfe43bcd0,0xfeb66a46,0xfebde7ea,0x0019205c,0xfef0c0a0,0xff88f28c,0x0223639c,0x0126adb6,0xfd5e9184,0xfcc9304c,0xfd3c6e34,0xfe944bf6,0xfed99d62,0xff5beef6,0xff31117e,0xffdc004b,0x000ebbc5,0xffd3ef3e, -0xfff641b7,0xffa23442,0xff08c6f4,0x00ced1ca,0x011faa7c,0x002eda71,0xffd2641b,0xff1963f7,0xfec74864,0xff2944cd,0xff55ccd4,0xff03c8e9,0xffe28f9b,0xffc9cbc3,0xff9d42a2,0xff92aaa6,0xff4c2454,0xfe22d71c,0xfff8fd6f,0xffc3f606,0xfdbeae94,0xfe843cc8,0x029fb5b0,0xfea34680,0xfc726724, -0xfcc86228,0xfd98bb6c,0xfee8c400,0x0010daa3,0xff78e8d2,0xff84193a,0x001beb76,0x0021724b,0x00135c85,0x001d9422,0x00226b02,0x00bc55c2,0xffdb6c11,0xfe9c4ecc,0x00e37d92,0x010a21c4,0xff81fe4a,0xff15ebbe,0xfe6353b0,0xfe217c06,0xfd899d38,0xfdca8d88,0xfe7e558c,0xff571c16,0xfeff40ec, -0xfd411e34,0xfd0ee61c,0xfcf7c78c,0xfbd6ff78,0xfec181de,0x0012ad07,0x00674a52,0x033c6db8,0xf6306e00,0xfcdea9e0,0x01b384bc,0x0262041c,0x02458438,0xffcffb34,0xfecc9b60,0xfe7c3096,0xff7a358a,0xff5a5377,0xff2260b7,0xffb8e723,0xffcbddb9,0xff130c33,0xff42847b,0xff40ce78,0xfee3963e, -0x00b4893e,0x00dd6ff5,0x000da107,0xff1b1143,0xfe6e98cc,0xfed5779e,0xfed33a82,0xfefa1626,0xfed5a448,0xfede675e,0xfedec012,0xfeecd280,0xff02162b,0xfe9b05d0,0xfc8998dc,0xfe84710a,0xfc666910,0xf6c2f8d0,0xf5572800,0x08f3b9f0,0x0a075f50,0x0835ec90,0x06b661b0,0x052c3168,0x0563cb70, -0x04df43f0,0x0341c05c,0x021450f8,0x011ae5dc,0x0043c37d,0x000eab11,0x003ecb56,0x00b68359,0x008ae627,0x003f2103,0xff4944b5,0xff983fae,0xff3448dc,0xfedc3ea6,0xff027919,0xfececb02,0xfecf21f8,0xff00e484,0xff62be24,0x00053a7e,0xfecc4800,0xfe3aff72,0xfe85cf24,0xfd61721c,0xfc19e1d8, -0xfa0b43b8,0xfa9657c0,0xfda946c0,0x02b170c4,0x066c8150,0x0473e348,0x034d5540,0x03190e1c,0x0326b6b0,0x02a496b4,0x02d80fb4,0x02c203ec,0x02423a14,0x029c1d7c,0x02993b00,0x02709768,0x02666244,0x01c9cca8,0x00a043af,0xffeeb872,0xffcf6219,0x002c38cd,0x00d5688b,0x00b17e5d,0xffbccee6, -0xff021f7d,0xfe5068f2,0xfdb5a6b0,0xfce6b410,0xfc12957c,0xfb4ea438,0xfa720020,0xfac0a3c8,0xfc8a8a88,0xfdc7ad58,0x00470d59,0x038eea94,0x0690ad78,0x079758a0,0x06d2a540,0x05889f28,0x03fad970,0x034eb804,0x02ca4670,0x02818db8,0x0223b9d4,0x01cefbf2,0x016f6364,0x010e215a,0x010f36f2, -0x012a2dbe,0x0129abce,0x014a370e,0x0158d664,0x018fc2b6,0x01ab7ef8,0x01af2ace,0x01a458fe,0x01856462,0x01cb6ede,0x0185e8be,0x014cbafa,0x015b3776,0x013d2fa0,0x01c7b446,0x02463a04,0x02be1c8c,0x039f780c,0x045c1de0,0x050264f8,0x05459098,0x05929380,0x05ea6658,0x05171fa8,0x04b62900, -0x04a1c200,0x0452e518,0x02f70a3c,0x02e473a4,0x020d5e50,0x02b082e0,0x025f65a8,0x0264e29c,0x0292e4b0,0x027d5ca0,0x02a178b4,0x02723b30,0x0252ed60,0x024df39c,0x0236eac0,0x02171a34,0x01e4b032,0x01c10c0c,0x01c42c8e,0x01a44122,0x017d20fe,0x012ecfbc,0x017f2a52,0x01d2b756,0x020f6200, -0x025948b0,0x0296e66c,0x02d8627c,0x02d9b944,0x02e2f1ec,0x02f7ec04,0x0329dc74,0x035aa9b0,0x03b2b3c0,0x039cbca4,0x0381b244,0x034dfe9c,0x03104118,0x02d74db4,0x02ed4b4c,0x02784a98,0x023a7048,0x01ce8240,0x029e9cf4,0x023e09c0,0x01d3c726,0x01c870cc,0x01ce0fee,0x01d418d4,0x01cffa6c, -0x01d294a0,0x01d713c4,0x0219be88,0x0244992c,0x01bf1238,0x01f4b982,0x020abf44,0x02288604,0x025b3134,0x0276bb0c,0x029f7cf0,0x02ba316c,0x02d70000,0x02fe4438,0x02fccf28,0x030778e4,0x030f551c,0x03138ba8,0x031243ac,0x0315f9f4,0x02fd4930,0x02f32434,0x02eb628c,0x02ebe390,0x030a3190, -0x0064fa64,0x0034a041,0x0024f01c,0x003aa0e9,0x0049daf8,0x0053a5bf,0x005fe71d,0x004b3e23,0x003e67c2,0x0045057e,0x004b79b7,0x00610767,0x003ee71e,0x0039d880,0x00389133,0x005579ff,0x006bd51f,0x007c6078,0x00803705,0x00846e9b,0x007dc002,0x00784d7e,0x00725be8,0x006949db,0x005e9174, -0x005d2abd,0x0082646a,0x003cdeb8,0x00280ac3,0x0020ce37,0x003520e5,0x00475386,0x005a4c8a,0x0071b051,0x006e1a65,0x00417cde,0x0041f8b2,0x000b883e,0xffffdbf2,0x00281dac,0x007427c2,0x00a9773e,0x005793ff,0x0044271b,0x0061de0e,0x006f053c,0x0079d9e2,0x009863bf,0x005000d8,0x004095a7, -0x0049dd59,0x007c3e54,0x00aa0c6d,0x00e5bd6a,0x00eb1d11,0x00d83edd,0x00bc2d6a,0x00c04e4b,0x00a514e4,0x0085369d,0x0064fe1b,0x005670b7,0x00a1b864,0xffde72d6,0xffa23460,0xffba0402,0xffdbc1a0,0x001d89de,0x004b7496,0x0093d84d,0x00857e17,0x0007a0a3,0x0013ff3d,0xff81d124,0xff2ffb32, -0xffcfa809,0x005a5034,0x00cc66d8,0x00766fd1,0x00488441,0x00585af2,0x0062be2b,0x009276d6,0x00c766f1,0x0055c2d8,0x0012c8f0,0x0038fe61,0x009a0b8e,0x010865e2,0x01870678,0x0186cb94,0x01638284,0x00ffee69,0x010ee1e2,0x00db9195,0x00a04280,0x006901b0,0x005ef208,0x01190bda,0xff89aba9, -0xff1b8663,0xff14b9e5,0xff79c7ba,0x00020e3a,0x0052439f,0x00f987f4,0x00d9ab9a,0xffb46128,0xffafb253,0xff29874c,0xff0fbab7,0x001e3b85,0x00ce44be,0x00f48b52,0x00407f22,0x00660be7,0x00636397,0x00e30e8c,0x00daa9d0,0x0049bdf2,0xff9d96f1,0xffca4a2e,0x0058c071,0x012b8e96,0x01b3971a, -0x025b17bc,0x01e4d91a,0x01b4b628,0x014a46f6,0x017eb40c,0x0123d924,0x00b0639e,0x0059325f,0x00579760,0x012ec7a4,0xfed08e8e,0xfdbd6784,0xfe156da2,0xfed6f59e,0xfff7c0af,0x002d5096,0x0108fd58,0x00c2fa85,0xff0be3df,0xff3af921,0xff3091e5,0xff0e9a2e,0xfccda29c,0xfd5a7558,0x01a06e5c, -0x019bd4d0,0x015c6eaa,0x004aceee,0x0015c7dd,0xffcc6a09,0xff743dfb,0x004981f8,0x0050ac7d,0xffdf2eba,0x00af32d9,0x01662194,0x02614788,0x021f5d38,0x01bfd870,0x00c0bd8e,0x00d7a54d,0x00aa3a46,0x0068d66d,0x007053d9,0x00860bb8,0x0113fe9c,0x003ed30b,0x00921729,0x0232d120,0xfe5fe608, -0xfe1f17a8,0x00916446,0x01885e6a,0x01e160b0,0x00b11cce,0x000dcd73,0x015bca02,0x01c07c3a,0x00f47abf,0x00683cce,0xfeb1d802,0xfe2027e8,0xfe4fce8c,0xfefa34d4,0xff2fa058,0xff9c7fe0,0xffb896c7,0xffbd4e40,0x00112fff,0x005dc2a0,0x00b0cc23,0x004d535f,0xffeb65a5,0x00864aee,0x00d228d5, -0x016d749a,0x00e1bde1,0x004b05b6,0xffeebbf0,0xff6a5cef,0xff744ff7,0xffbdd756,0xfecc1ea8,0xfe6a279e,0xfebc2394,0xfe7c4f2a,0xfe7f8f06,0xfeb90b68,0xfd617378,0xfc7d05bc,0xfbdb45a8,0xff492771,0x0106ad34,0x01bea166,0x003724bb,0xff1fc301,0xfdd85ed4,0xfec385dc,0xff5ad9c9,0xfe8e779c, -0xff00c060,0xffb8fa72,0x001eb7ad,0xfff846f4,0x000d5358,0x0031eee0,0x003e6765,0x00075b6f,0xfffae52f,0x007d25bf,0x007bc00a,0x0108d966,0x001b0d42,0xffd53a15,0x0082bd26,0x004e89be,0x0028ed26,0xffd213b5,0xff8a1d47,0xff3e4784,0xfee3238a,0xfe029882,0xfe2484f0,0xffc48ba7,0x01452120, -0x01e889f0,0x01bbeaba,0x00cdc250,0xf6893930,0xf7bd78b0,0xfa28f900,0xfbe0d498,0xfcf29d1c,0xfd289270,0xfdb12758,0xfdbfee94,0xfe93e130,0xfefa4ed0,0xff7bc2e0,0xfffe0d44,0x00315ca1,0xffe14ad2,0xfff409b4,0xffc059fd,0xff984f07,0xff82fa2e,0xfffb7abe,0x01b0318e,0x00a25ef4,0x0009f8e7, -0xff642be6,0xff1f0759,0xff15ecab,0xff350f33,0xff5d0342,0xff686b53,0xffbc5093,0xfebac7be,0xfe243328,0xff1b0113,0xfcc366ec,0xfbe03928,0xfc3163ec,0xf80f7e88,0x03405f0c,0x05ecb478,0x075cf2f8,0x06cf5ee0,0x05afe568,0x0614d960,0x04988bc8,0x01c4dd20,0x014b9690,0x0093042d,0x00a7799a, -0x000a1fb1,0xffbd34c2,0xff883689,0x000a3b21,0x001bc3ca,0xff8f7b09,0x0088cf8d,0x00861fc5,0x007b8e4c,0xffa3ef95,0xff60dbbd,0xffd0d5c0,0xff639c29,0xfea2f75a,0xfdc559a4,0xfdfd7b88,0xfdbecb84,0xfd51c434,0xfd82b0a4,0xfd7aa7cc,0xfd9ba554,0xfb5dd580,0xfab48b38,0xfc11bf80,0x001f2a4d, -0x04dffb98,0x04b83d58,0x049357e0,0x0432f9b0,0x038d9844,0x03230908,0x0323bfcc,0x0367f120,0x03271cf8,0x02dcee4c,0x02b9771c,0x021b8e18,0x01ba9222,0x01a29be8,0x00d80939,0x006404b0,0xffcd0135,0xffabb204,0xff6048d5,0xfef678e6,0xfe2787ce,0xfdafb0a0,0xfd753558,0xfd020c4c,0xfd16c680, -0xfddac844,0xfd4fce50,0xfcfdcf78,0xfc88bc7c,0xfc0d27a0,0xfbc2cc30,0xfc016eb8,0xfedf730c,0x0196f852,0x039d7494,0x0467eb18,0x04e3d378,0x044c9220,0x03e5ca40,0x039a1350,0x03275104,0x0308aa4c,0x02e5e9c8,0x029f3c70,0x02443bb4,0x022a9ecc,0x01c20324,0x01d99ac2,0x01bc1638,0x01c63dbe, -0x018cea4e,0x0148a552,0x01088072,0x0092bd8f,0x00268e1d,0xffabc75e,0xff9b6600,0xff862e0c,0xff67d878,0xff9a1eae,0xff9cacf3,0xff9bdc07,0xffcd797b,0x00114f50,0x0035a534,0x02123cf0,0x03f14658,0x059ff8f0,0x05c48188,0x05d3a948,0x064e12c8,0x0572de98,0x04214860,0x044bb430,0x041ee6c8, -0x04143220,0x03eb8498,0x03d2acfc,0x03b95214,0x03a01450,0x038ab620,0x03668020,0x03389cf0,0x031726ac,0x02e129a4,0x02a3b55c,0x02761c3c,0x024a6444,0x022f8fd8,0x020b1388,0x01f38672,0x01b08a94,0x01efb866,0x02283f14,0x025852c8,0x028565fc,0x02bc23c8,0x02effb18,0x03277d50,0x035ae504, -0x036c8d68,0x037e1ac4,0x03593a44,0x037e4d84,0x0385e2e0,0x03b50160,0x03d390a0,0x03fc13b8,0x039da948,0x03b52a68,0x0397f9b4,0x03820220,0x035c77e4,0x037cb1b0,0x035a4b60,0x032da988,0x031c14b8,0x030906d4,0x02fe9878,0x02e9e27c,0x02dee39c,0x02d68e48,0x02ebb66c,0x02eac7fc,0x02b87950, -0x02c06864,0x02be2ae4,0x029f8110,0x02c022ac,0x02d202f0,0x02e9b318,0x02fd3678,0x030f5704,0x0322cb68,0x0330a888,0x03442a70,0x03630c70,0x036d2cd8,0x03827108,0x038c0f08,0x038f624c,0x038d3aa0,0x03876ab4,0x03956c18,0x03c08c00,0x00929a73,0x0069936f,0x0063765c,0x00717316,0x0083a5e9, -0x00c33598,0x0087e649,0x006f7769,0x0080b143,0x006ca8bc,0x0075d82c,0x00a4d097,0x00785be1,0x006c8fd5,0x005ffbd3,0x007caedd,0x008c9b99,0x009147a1,0x00a4e0fe,0x00acb0f5,0x00ad4d76,0x009ef8ab,0x0096ba1f,0x008dca3d,0x008acc7a,0x007f365d,0x00743410,0x004af5aa,0x003dbc94,0x0032b65e, -0x00705b15,0x00853fcd,0x00734d51,0x009b555b,0x009b41de,0x00725eae,0x00757753,0x006fcc99,0x00662e36,0x00773b96,0x00c9a0d9,0x0169a5d0,0x00862b0a,0x00553268,0x00ae092e,0x0083fa4e,0x0098e2f2,0x00f49b79,0x008ec767,0x0074d766,0x00666493,0x00930c3f,0x00b87a21,0x00d8a835,0x010d462e, -0x01043e02,0x00ee8b04,0x00df3b35,0x00c64d11,0x00ae2257,0x00a63cc2,0x00787dbf,0x0048e6e5,0xffc7bfea,0xffaa8a96,0xffb1316c,0x005225fd,0x0092d7b9,0x00500145,0x00aee067,0x009c0d06,0x0039f04d,0x006398b1,0x00238116,0xffedb3b7,0x0048e0d5,0x00d2717b,0x02391600,0x00814fd4,0x004145a9, -0x00ee5de0,0x0070180b,0x009a0f9f,0x016c35e0,0x009d4b5e,0x004d007a,0x0056871b,0x00a63f14,0x00fa874f,0x0142499a,0x019fc288,0x019e2944,0x0158433e,0x012f363c,0x00f3e41b,0x00c7aa21,0x00af178f,0x006686fa,0x0025abe6,0xff238f36,0xfedd72ac,0xfecbe766,0x002f1d28,0x00bfad65,0x001be13f, -0x0107fd42,0x00f17507,0x00233d6c,0x00482817,0x007a6d92,0x003f8466,0x00ad7340,0x016e505e,0x033aa314,0x006ebcbd,0xffcede92,0x00dde50b,0x008eca77,0x00d7b7b8,0x018123a4,0x003b280a,0xffde9ab8,0x0058b0f0,0x00ec9cfb,0x017aca6c,0x01f7870a,0x023484d4,0x0219dff0,0x01ade30e,0x0196daa4, -0x013cea06,0x010b5f4c,0x00db79ea,0x005295e6,0xffb3d3ad,0xfe095c5e,0xfd9416d4,0xfdc83ea4,0x000c3542,0x00d5fa0d,0xffb183fe,0x00ca4877,0x0092fb6b,0xff57e44a,0x0010c349,0xffb4d065,0xfedb7030,0xfe5058a4,0xfeb4724a,0xffce5977,0x01392572,0x01e61070,0x017b64cc,0x0092b9f7,0x00001a4e, -0xffc69010,0x00701c46,0x008c8d5b,0x004502e4,0x00ef517e,0x015d7c36,0x01c71e78,0x02ad0080,0x029034a8,0x017755b0,0x015d8af2,0x00cd70b7,0x004dfc9c,0x0006938a,0x00286b94,0x00a08744,0x004570b0,0x001b5373,0xffa619db,0xff7557e2,0x0010560a,0x01daee24,0x01bd10fa,0x0216219c,0x025f1130, -0x01137bb2,0x01635c5c,0x051d7b50,0x005734a5,0xfef536ac,0xff791e4e,0xff4f234f,0xff32abb9,0xff287404,0xffb69edf,0x0006b3be,0xffe591a7,0xffab846a,0xffdff70e,0x004ee3ba,0x00abb132,0x00998f2d,0x00b3cdcc,0x003b3821,0x004ce382,0x0150e9c6,0x00b7bf06,0x00662d96,0x001a3a03,0xff8951b8, -0xff467110,0xff4ce2be,0xff52f426,0xffe4cdae,0x00d0475d,0x008f060d,0x0012d955,0x008944e5,0xfc185a60,0xfb450fa8,0xfdf14e38,0xfebbf974,0xff6fda8c,0xfff53ab6,0x00b374bf,0x000ade65,0xfd861810,0xfe6725dc,0xff0f934a,0xfefa1b58,0xff101157,0xff78450e,0x000ac093,0x000e0762,0x005d6e48, -0x00525763,0x006f5bc3,0x00ba29d4,0x01089824,0x006b2fbe,0x00c2d2cd,0x02bf1718,0x013b380c,0x00b8c8ea,0x0085b358,0x002dc8c6,0x0019c82a,0x0039f22a,0xff51802a,0xfeeae232,0xff41e346,0xffc7f445,0x005e68a1,0x00c0fc3d,0x027299a4,0x02193f98,0xffd7a783,0xffd7084d,0x003f0c29,0xfc65afbc, -0xf9c1bfd0,0xfa464358,0xfb84b110,0xfdab09b0,0xff0008a7,0xfefebc2e,0xff1a259c,0xff89a4b0,0x0006b94a,0xfff3f61d,0x00084d4b,0x0043efd7,0x0045617f,0xfff5c1b2,0xffddd447,0xffb13880,0x001cfc17,0x016c6628,0x00a41418,0x0034d74d,0xff7672a0,0xff164489,0xfe862c36,0xfec8875a,0xfe9789b0, -0xff07f594,0xffe5ad53,0x00034292,0xff5f3351,0xfd9d4aac,0xfdba12ac,0xfd9358e4,0xfd177798,0x0050797d,0xf8ee21c8,0xfc011c50,0x002d6054,0x01a87df2,0x02359134,0x01bc02a8,0x007381a6,0xff42cc25,0xff7fdae8,0xff78e724,0xffe5f0f0,0x00542bff,0x003b5b8c,0xffaf1bc2,0x003180ee,0x00717b9d, -0x00afdf78,0xffd7fa64,0xffc67c5a,0x00ce83ba,0x0058697a,0xffd40223,0xfefa3ea8,0xfebe657e,0xfece0020,0xff6f7701,0xfedf3de0,0xfef68426,0xff98fa67,0xfeeb6b74,0xfed32bc0,0xfeb6e01c,0xff289621,0xfdbaf0f4,0xfab236e8,0xf94b8b08,0x050f3630,0x06444e10,0x065d5e08,0x05af7640,0x05441598, -0x04199d50,0x03e781d4,0x049a0bc8,0x03e90cb8,0x0338138c,0x0228ed1c,0x01e95a2e,0x01d6efb2,0x01ca8504,0x0130e6d4,0x005496cf,0xff703661,0xff1302c3,0xfeea3b7a,0xff5128cd,0xfed84aac,0xfeb7410e,0xfefa6e72,0xfeb1bf2a,0xfec1fd4c,0xfed35d74,0xfeb8c932,0xfe799c60,0xfdb65408,0xfd672e50, -0xfc9acb70,0xfb8096e8,0xfb3597f8,0xfc8de314,0xffd7fee6,0x02c5ba90,0x02d8a100,0x036d0524,0x037c4cc0,0x039d540c,0x03a47d2c,0x03b0a33c,0x03b198ec,0x03a7a998,0x03425f7c,0x02f08b18,0x02a9f518,0x02154720,0x01979fb8,0x01027790,0x00f0607d,0x00d6b34c,0x00b414d5,0x0089a83e,0x00419105, -0xffc9ef54,0xff43dde8,0xfedee4c0,0xfe661012,0xfe0aa2ba,0xfdb5c598,0xfd577cb0,0xfd235bc8,0xfce30db0,0xfc8488d4,0xfd896b2c,0xfe664256,0xff3e910a,0x00a40fca,0x01ba5292,0x02a09368,0x02a08d08,0x02c15008,0x02e95428,0x0387013c,0x030f4a64,0x0348fb68,0x03517768,0x033fab94,0x034de034, -0x02f6eca0,0x02bdc1f8,0x029b5a9c,0x024a1a64,0x0214a028,0x01dc9f68,0x01b117f0,0x013c9a56,0x00e15e3e,0x008d4e0d,0x00a0e47d,0xffe2e8e5,0x000ba510,0x0031a517,0x004d3eea,0x006e6e64,0x00830f50,0x00917d29,0x00d2e73b,0x0124ffac,0x016bcac2,0x019f1010,0x01c380f0,0x01e335e4,0x01f2f7e8, -0x020b3968,0x0246e5d0,0x028fd248,0x02870728,0x02787b44,0x02f5fe1c,0x03304bd4,0x037dce7c,0x02db28ac,0x0331c7f8,0x037bdecc,0x036525b4,0x0353ebb8,0x03397770,0x0331780c,0x0325bee8,0x03157624,0x0297dfc0,0x023dda50,0x02d33754,0x025d050c,0x0214e9ac,0x018e05c4,0x01b8eff8,0x01b03e52, -0x01b33a4e,0x01b23f26,0x01b69e58,0x01b5068a,0x01d9e044,0x01f1cbd2,0x020f38d8,0x02215230,0x023bbd40,0x025e2da8,0x0265b480,0x026f1844,0x026e1624,0x02751a2c,0x02e4d0c8,0x00b76383,0x009e3486,0x00a35c2b,0x00a7e723,0x00b25055,0x00f2ad57,0x00a154e3,0x00963edb,0x00acbf96,0x0099b951, -0x009d5352,0x00bd85bb,0x00a0ff26,0x00983bee,0x0090c30b,0x009d6be8,0x00a543c4,0x00a70e83,0x00bf2f85,0x00c9fd65,0x00d5cbd4,0x00c09182,0x00b67501,0x00ac7ce1,0x00a891f5,0x0096da08,0x006e5f30,0x006a5d65,0x00697d7f,0x0065c284,0x009fbf81,0x00afc484,0x0091ae6b,0x00bac740,0x00bb5a93, -0x009656be,0x00a40c89,0x00ae5966,0x00d58518,0x00e641fc,0x01204866,0x0197e2c2,0x00b19190,0x0078a1b7,0x00c789bc,0x00ae43ad,0x00c68bdc,0x00f4ee9b,0x00c1118f,0x00ac4c6f,0x00979613,0x00ace7ba,0x00bef0de,0x00d62593,0x0116de62,0x0129b4c6,0x013af76c,0x0107a5c8,0x00e9ad54,0x00cbc2d4, -0x00be8cb9,0x007e3d89,0x00058779,0xffe5271d,0xffeb9e09,0xfff8ab0f,0x00a05ebe,0x00cfd0eb,0x006d4064,0x00d1e90e,0x00bd87f8,0x0065cbf8,0x00890c57,0x00a699a1,0x009f1626,0x00e100b6,0x01252e7a,0x024e2be8,0x009bf360,0x00609b57,0x01056e30,0x00a587e7,0x00b67196,0x0140cdf0,0x00b98a3d, -0x008cbc22,0x007d3ea0,0x00b5e2eb,0x00e3e290,0x00f0e14a,0x017dc478,0x01a3a94c,0x01b0ac00,0x015164ce,0x01119fec,0x00d86c56,0x00c42884,0x004a9ca7,0xff780711,0xff3f4ac1,0xff44b710,0xff725472,0x00978a80,0x00fe14cc,0x00424521,0x010c1812,0x01175f76,0x006f96ad,0x00be0bfb,0x00e39e26, -0x0128a4b0,0x0197c128,0x025d9d54,0x03cb45d4,0x00c724f1,0xffcd846b,0x010ef6a0,0x00a1a3d3,0x00e6e91a,0x01e49584,0x008e0ab7,0x0018dc98,0x0097df82,0x010b96c2,0x0143defc,0x016fa886,0x0228adf0,0x025779c0,0x02513858,0x01cc835c,0x016cdd60,0x011f0dd0,0x00dcedaf,0xfffebcef,0xfe81bcd2, -0xfdf196f8,0xfe2fa144,0xfe9f0788,0x008f6a9c,0x010819fa,0xffdd6d67,0x010398a0,0x00974dea,0xffa078c2,0x0031cac5,0x007e68af,0xfff26b21,0xfe9ce522,0xfe19b5ba,0xfe60e4c8,0x00da9fd9,0x023de2ec,0x022d2170,0x011ebfec,0x001c0a49,0xffa501b1,0x00615ece,0x00ae8b48,0x00912dbe,0x0150b64c, -0x017a5fd2,0x01875100,0x01ef4602,0x01f49c4a,0x01e10bfe,0x00e3a24b,0x00615d29,0x004d84d4,0x0036fcca,0x0048ad2d,0x003abd37,0x012ce4aa,0x010c3406,0xff1da254,0x010ea81a,0x01685b92,0x00b6bc69,0x011eb36c,0x0285e4f8,0x050f7ec0,0x02405628,0xffdaa64b,0x04933260,0x00c6f83a,0xff50fbcc, -0x008ab410,0xff852567,0xff6fa789,0xffaca5a8,0x00444d78,0x0097058e,0x004f2db6,0x0000b807,0x001f8ba5,0x00998366,0x008c796f,0x00d52591,0x011da5e4,0x00d6d877,0x00cbf9fe,0x01238c94,0x00b29384,0x0079b23d,0xfff0e3a6,0xffd7790f,0xfff476f4,0x0075f056,0x00b5235e,0x012a8aaa,0x0165b178, -0x009ed564,0x00cfec30,0x01edb49a,0xfeb161b4,0xfd3cb8c0,0xfda1e810,0xfdbc8a1c,0xff2d7417,0xff5da466,0xff6749cd,0xff4e541d,0xfe75ae52,0xfe2b7fb8,0xfe5d6d2c,0xffa1f435,0xff42f328,0xff61fbbd,0xffe81d3e,0x002fe68b,0x007b0e85,0x00245632,0x00807480,0x00f81fc8,0x010e15dc,0x00561e83, -0x00b7288f,0x01aa0414,0x0138efa6,0x01173112,0x006d892d,0x005e5cea,0x0029c01f,0x00363a5f,0xff313485,0xff2abf32,0x0072ee35,0x008aadda,0x00f9b506,0x0171d326,0x0130e65e,0x0129e488,0x001cc1ad,0xffc68033,0x00cd4e12,0x00e3f323,0xfde7d48c,0xfcc05eb0,0xfd5ab4e4,0xfe5e97a8,0xff79eecc, -0x0017ae43,0xffc6b763,0x003e70ac,0x0054e7a2,0xffff36f2,0x0013b0cd,0x00a22b02,0x0097e70e,0x0093b81e,0x00a896cd,0x00d8906d,0x00d64bef,0x00a8b79e,0x00e24068,0x00d37899,0x0048ffe9,0x0093cd2f,0x00875cba,0x00436698,0xff4dc58d,0xff497532,0xfff680c5,0xfeff6a28,0xfec006b6,0xfeb1f71c, -0xfde07114,0xfded1730,0xfef6872e,0xfff2acb3,0xf90b8ed8,0xf809af10,0xfafbbff0,0xfd578b5c,0xfeb17704,0xfdb75310,0xfd5eea3c,0xfe4ddd14,0xfe5a9194,0xfead0156,0xff81636e,0x005d0ff2,0x008aa183,0x0048c97a,0x002d84b5,0x003f181c,0x00cc6e0f,0x0023f220,0x0024b373,0x00c278c6,0x00e01eff, -0x009e1119,0xffd0396a,0xff875a7b,0xff41595e,0xfef7b304,0xff3ad50a,0xff7522ca,0xff115de6,0xffd92993,0xffc475ca,0xff297cc6,0xfe5feef0,0xfdb43000,0xfd199274,0xfa992cf0,0xffc97442,0x02107d78,0x03854fd0,0x034012ec,0x0378c31c,0x0342a160,0x0311ca58,0x035d7488,0x02fb5838,0x02933924, -0x01b6d286,0x016af612,0x00f77f86,0x00a6cb2c,0x00cc9718,0x009f27e6,0x007d163f,0xffeb5946,0xffc3f646,0xffcf34ed,0xffb522cc,0xffaf6b09,0xff8e3a5a,0xff99bb5d,0xff6d5c0b,0xff5583af,0xff50c022,0xff05de14,0xfe562c8e,0xfed63982,0xfea996b0,0xfdfb4754,0xfd4d0fa8,0xfcbb1dd8,0xfca5c51c, -0xfe290888,0x0176a49e,0x02cacf5c,0x03248c48,0x037217e8,0x0407c770,0x03b4a3ac,0x03765ef0,0x033d3e00,0x02f8e578,0x029c8418,0x0277955c,0x022bb770,0x0210ae44,0x01c9af0c,0x014213fa,0x00c089f7,0x0041fc1c,0xffb077a1,0xff009ef0,0xfe69e074,0xfe0672c4,0xfd9c902c,0xfd317420,0xfd162c94, -0xfcfe6cd0,0xfce1c348,0xfcb2b218,0xfc8ad5e0,0xfc5dfe14,0xfc32a8a4,0xfbf5eeb0,0xfba533c0,0xfd06cff4,0xfe5b5f12,0xff758947,0x00a8f9a3,0x00b1c135,0x00e73725,0x01a2eaa4,0x011d028e,0x016a65de,0x01898d5a,0x017f2372,0x01b3ec28,0x013daf44,0x01132fc2,0x00e17df4,0x0081b8a2,0x0036ccf2, -0xfff8d178,0x001575a2,0x001a0f6a,0xfffa3aaf,0xffff4ac1,0x00348927,0x00211183,0xfff30f0e,0xffbbafe0,0xff84ed44,0xff495524,0xff065c64,0xfebc4b4a,0xfeeff214,0xff16b7cc,0xff4225cd,0xff6b356b,0xffa7d8d0,0xffbbcecc,0xfff665b2,0x000c1dda,0x003e3941,0x006f2256,0x00298692,0x001c98c6, -0x0098a4a8,0x00ea5e8f,0x017570b6,0x00797f95,0x00f6310f,0x01963142,0x0175b0d0,0x015c5ec0,0x013d4c3c,0x012fcb92,0x011d0508,0x00fc672e,0x0089a629,0x002b1fbe,0x00f94f29,0x0081e840,0x0042b50f,0xffea1830,0xffd7a9ea,0xffbf91a7,0xffa86652,0xff8da018,0xff77fb3c,0xff519ca0,0xff702b12, -0xff7d79a2,0xff8c0643,0xff978e66,0xffa094b5,0xffaca02c,0xffc63493,0xffe2046b,0xfffb0659,0x000fe139,0xffd6a249,0x00a7df18,0x00a70925,0x0097902f,0x00a6fad7,0x00ae1113,0x00d51fb7,0x008df1ab,0x00923326,0x00a43606,0x00ab184f,0x00ad48a9,0x00b02a3b,0x00b004c1,0x00ab026c,0x0097f3eb, -0x009290b4,0x00941f9e,0x00ae5012,0x00b2ce50,0x00b57919,0x00b903be,0x00acbd11,0x00a36369,0x00993073,0x00982381,0x008ac4de,0x006e7b6c,0x006dfb4e,0x006df0c5,0x006893ab,0x0088e0e3,0x00931048,0x00891223,0x009d0d3d,0x00a36838,0x00999bad,0x00a7b37c,0x00c81fcb,0x00be0912,0x0101b5d4, -0x00f8d9bb,0x01260044,0x00962906,0x006f8a38,0x00918ee3,0x00b4626b,0x00d78280,0x00cdec64,0x00da9d10,0x00bfdaf1,0x008675ff,0x00918b7e,0x009c0b4e,0x00d171c8,0x00ea8254,0x01153602,0x011af56a,0x00e7545e,0x00cb708b,0x00a6608e,0x00a11b6e,0x007b0db7,0x002a4396,0x001bc320,0x001c3682, -0x001b8a82,0x00836424,0x00a064d6,0x007e7105,0x00a20f08,0x009f0815,0x008cc857,0x00b2c934,0x00fd7131,0x00c552cf,0x010ab96c,0x00f4e36d,0x01874f1e,0x0075f215,0x00588dc2,0x00ac1bba,0x00ccdc93,0x00e94c6d,0x00eb6bae,0x00e6d0a0,0x00c76721,0x0055ee6d,0x008a2a4d,0x00a1be0f,0x00ed3710, -0x0128de9e,0x015b5280,0x018bd79c,0x011831ba,0x00ec8fce,0x00a3cf61,0x00a41a8c,0x004857f3,0xffb4cb29,0xffabdf7e,0xffbb4317,0xffc07dcd,0x005644dd,0x00976c0e,0x005cc22b,0x00a99d52,0x00d470c5,0x00b9ffab,0x0113cafe,0x012dce9e,0x01269596,0x01bee3cc,0x021b9314,0x029edeb4,0x00a4b39a, -0xffd2eeb1,0x0098e1db,0x00c0e4cd,0x012045e6,0x019cf378,0x00da6c55,0x00690203,0x004ddb54,0x00d88e3e,0x00e4c17b,0x013254dc,0x01bd9b8a,0x022988c8,0x026a48e8,0x019aebe4,0x012a0412,0x00ad90ff,0x0090903c,0x000fc249,0xff014b86,0xfebb2446,0xfef6d910,0xff36b977,0x00664fdf,0x009b5ef4, -0x0047957e,0x009693fe,0x0065745b,0x0035abb4,0x00c8efee,0x016cbf24,0x005c10b6,0xff84f10d,0xfe88edf2,0xfdea4464,0x0043fa97,0x01c0f078,0x0250c8a4,0x01d61b80,0x0098bb5a,0xff9d1674,0x003d50d0,0x0091d587,0x00d06fa6,0x017076c0,0x0152b830,0x0136b8ce,0x00e972e4,0x00ec4d70,0x00f3bd15, -0x00559ac8,0x007962d3,0x00bd7b18,0x0071c3bf,0x007a1321,0x0080dd35,0x0250e224,0x01f8518a,0xfef1e19a,0x003d587c,0x006def3f,0x00462e52,0x00a3e313,0x02058aa4,0x04b00500,0x02d71374,0xfe310cd4,0x001a3758,0x01993886,0x015294ea,0x00ac342a,0x00021d49,0xff727320,0xff5d8816,0x001f6968, -0x00ad9b10,0x00e3423f,0x005f2e30,0x00446df2,0x009323f7,0x008638c5,0x00fc9302,0x01411114,0x01444612,0x01438110,0x00d2f51e,0x011e297c,0x00ffedf3,0x0021c1d3,0x004b0ac0,0x0068bb6c,0x00954250,0x013a03e0,0x012f0d50,0xffde2034,0x00ad0db6,0x00779c09,0xff689999,0xfeff1354,0xfe49e6d8, -0xfd892e3c,0xfdbb19f4,0xff21115f,0xff960be0,0xffac30c0,0xff8e3955,0xffd3005f,0xff1f04b8,0xfeac54f8,0x0044c882,0xffbabfa5,0xffa340a7,0x000abd7b,0x0055d90a,0x0085e62d,0x004cd8a9,0x007eaa74,0x00f5d6b0,0x009360d9,0x005da7a2,0x0078de3b,0x0085a05d,0x016fbece,0x018e6fea,0x00a1dfdd, -0x00f5ebaf,0x009a0c17,0xffebe09d,0xfff9d3df,0x00385e0a,0x009a4060,0x0167aa28,0x01f43ad2,0x02021ce4,0x00e59cf5,0x00306082,0xff704c53,0xff524c78,0x002eca85,0xfeea734c,0xffa06a94,0xff73921d,0xff0a279c,0xff036a26,0xff85ae76,0x00d4c33f,0x003dc55b,0x008aca6f,0x00924e5e,0x0032b38a, -0x003bc3cf,0x00a3687b,0x00c1fdad,0x011027a4,0x011c8422,0x014557fa,0x012f3f6a,0x00a1e018,0x0112b29a,0x012ca552,0x00f42fd3,0x0119affa,0x00f141ea,0x00111e3c,0x00575cb5,0x001ad0f4,0xff473715,0xfeecbb18,0xfeb23e5a,0xfe532ae2,0xffdb9c23,0x007f748f,0xfff84d84,0x0097c371,0xfe87282c, -0xfd13e79c,0xfc39050c,0xfc88d280,0xfd2bdcc8,0xfd259e34,0xfd851bd0,0xfe6e7220,0xfe6ac15c,0xfea7bef6,0xff10bbeb,0xffc00372,0x0041f90c,0x00b09d99,0x0082fdc6,0x00889bec,0x00c909a6,0x00acf8d1,0x00bda27d,0x00838df5,0x01047b74,0x00fb960b,0x009071f9,0x00144971,0xffdaf5ce,0xffe148ac, -0x001d1a57,0x000f958c,0xff987f0d,0x0057108f,0xffd14936,0xfe28ad2e,0xfdade2f8,0xfd70db3c,0xfd52818c,0xfe4536cc,0xfc2f60c0,0xfd06e968,0xfe3f6bb8,0xff08c658,0xffb7f216,0x00c8a0ce,0x01047d44,0x00cce1bd,0x008204fc,0x0072c981,0x00718d49,0x0106bb38,0x0110ce8a,0x00f8e6c0,0x00c6e8fe, -0x00a5eeb1,0x00b29bfd,0x001f23b0,0xffe809c2,0x000d1a61,0x009a8765,0x00b8f91e,0x0097c929,0xfff9a830,0xffa12d0a,0xff3fd827,0xff284f75,0xff0722c8,0xfef8bd54,0xfea916d8,0xff4964de,0x00cfa7e7,0x0041eae5,0xff766984,0xfe4a0f44,0xfcdc64d0,0xff5edaf1,0x0049debb,0x01070ca0,0x014214a0, -0x01ffce0a,0x01dd899a,0x01ba31e4,0x01c72cd0,0x01e2d7ec,0x01d3c092,0x0200240c,0x0183de92,0x016b472c,0x0107ca60,0x00cf223f,0x006a949a,0x0029fccc,0xfffcd5e2,0xffc1340b,0xffb8fc50,0xff5595be,0xfede6aa4,0xfe83dc88,0xfe4958e8,0xfe160752,0xfdcdbe60,0xfdf0fcc4,0xfdfcca2c,0xfe218d6c, -0xfdc44690,0xfd3ea668,0xfc9ec3d4,0xfcd55598,0xfd342510,0xfd8d2d50,0xfea1b04a,0xff7cdf32,0xffc138b4,0x002a480c,0xffe80add,0x001f56a8,0x00237545,0x003ad268,0x005f460f,0x00362745,0x0020fbba,0x001bd1a0,0xfff684ae,0xffe7cbb7,0xffd7ba4b,0xffc8fb85,0xffa56072,0xff7e1244,0xff5bca7b, -0xff611344,0xfee056b0,0xfeaca010,0xfe9046b0,0xfe639ad2,0xfe3234b6,0xfdfd1fd0,0xfdbd9090,0xfdcc9a24,0xfdcf351c,0xfdd798f4,0xfdea9438,0xfe1b19f0,0xfe31552e,0xfe9d94c2,0xfee10154,0xff1403bb,0xff493163,0xff080d8b,0xff17c353,0xff2fa133,0xff5211c1,0xff7b69bd,0xff3e3bf9,0xff659b80, -0xff994751,0xff8a6ebd,0xff84e2be,0xff74baef,0xff78b894,0xff708e5e,0xff6b2ca3,0xff3bf5a3,0xff10e4f3,0xff4e497c,0xff0f13de,0xfef0f2b4,0xfeb61b76,0xfeb3c718,0xfe9a2724,0xfe855838,0xfe70ddba,0xfe600b68,0xfe4643ee,0xfe573a14,0xfe5eeb3a,0xfe66c254,0xfe6de81e,0xfe70ff34,0xfe6ea758, -0xfe894e4c,0xfea54636,0xfecc9144,0xfee7117e,0xfe8aa238,0x008b381d,0x008f76e1,0x0078110e,0x0080fd10,0x00838cc3,0x00937615,0x0073d311,0x007b2546,0x007d5c28,0x00933615,0x009a3cca,0x0093bb06,0x00a23bc6,0x009ddefa,0x007ec14d,0x007ad1f6,0x0078c9b4,0x009c3be6,0x008ea81d,0x0089f4bb, -0x007dbc9f,0x0081e3a2,0x007f97c8,0x007ef7b3,0x00831249,0x0080c35c,0x0078377b,0x0074284c,0x0072ca00,0x00791e65,0x0072e6e7,0x00751f74,0x007a0d6f,0x007df1c2,0x007e3aba,0x00703f5c,0x008c035d,0x00943fa0,0x007bb8a1,0x00ae4a95,0x009b5e62,0x00a55f3e,0x006ed0ba,0x006003cc,0x00581f96, -0x0096ddad,0x00ba403a,0x00aaa64c,0x00ded59d,0x00c38bf2,0x0070af52,0x00733c6a,0x007adb5b,0x00c1ffa6,0x00af43c6,0x00c74b9a,0x00a05999,0x0090a40f,0x008c3213,0x00877fac,0x0096edbc,0x0090acef,0x00711e06,0x006a3008,0x0069ae2f,0x0087f1ec,0x007ff648,0x00768169,0x0079279b,0x006bac5b, -0x0066f2ed,0x004eca4f,0x00889bbe,0x00e15caa,0x007c3b65,0x0098729e,0x0078ad02,0x00af18b2,0x004e272e,0x004ea17d,0x00571bd4,0x00b5d377,0x00e23e57,0x00bc5280,0x01117758,0x00f9e6c1,0x0045395a,0x006b945c,0x0073ba86,0x00f25ccc,0x00c85fff,0x00d956c9,0x00bbfbe6,0x009275d8,0x00971525, -0x00831853,0x00a4b1e9,0x008fda74,0x005aa103,0x0058686e,0x00561931,0x0090f222,0x0059332c,0x006170dc,0x0077ce0a,0x0077157a,0x0075c73c,0x003f0ba7,0x00d714df,0x009b83e9,0x00779868,0x00e759f4,0x0120fbd6,0x0143af2c,0x005f12b5,0xfffd98d7,0x001ba3d5,0x009edcfe,0x0111fc98,0x0122b5c4, -0x0126fab8,0x00b421b1,0xffefca21,0x0089eea2,0x00aa646f,0x014c3592,0x01374362,0x016b10e6,0x01259726,0x00b82de2,0x00990182,0x007352e5,0x00a53251,0x00959d36,0x0017d234,0x00180212,0x0039cc25,0x00d763da,0x00bfbaec,0x006761e1,0x0067ef23,0x001c18eb,0xfff36dbe,0xffb2d1c9,0x00782cf8, -0x0219d2fc,0x00efd62c,0xffa6b315,0xfe8c65f6,0xfe1cbaf8,0xffb8fb54,0x00d43a74,0x017ea130,0x024813bc,0x015d06a2,0xffe2df8e,0x000cbabd,0x006640d1,0x014418a8,0x014b14f0,0x010c6430,0x00ee5b2b,0x006cb62a,0x00339665,0x000af2f3,0x00593524,0x00b4f6f8,0x00f48d88,0x00ddf03b,0x00e1d263, -0x00ead351,0x01f2da64,0x014a3582,0xff1e43ac,0xff15fe72,0xff8748dd,0x0125106a,0x011f5086,0x01afa7fc,0x03093258,0x027982ec,0xfe0b52b8,0xfc603ce8,0x02685940,0x035ab614,0xfffe1fed,0x00f146ef,0x0068ea13,0xff67a85f,0x0017058a,0x00ac7cfe,0x014a9100,0x00a2e933,0x005f19b3,0x00a3d35d, -0x00e78409,0x015afa5a,0x00f4d787,0x00ef8208,0x00e4fe2f,0x007ceb40,0x013b0474,0x011e5930,0x006f5909,0x00846543,0x00bd2ab7,0x01169ff2,0x0112b0b2,0x00ba08ef,0xff308bc0,0x0130a1bc,0x005008e4,0xfcb1b008,0xfe353274,0xfeb2389e,0xfe62dcd6,0xfe967b62,0xffaa0b8a,0xff2ca057,0xff2e7755, -0xff60f624,0x008befb7,0x00506758,0xffb13699,0x0083d103,0x003e4596,0xfff338ff,0x004166d7,0x003af12e,0x00676113,0x0074a8b8,0x002b61bc,0x005fa1ab,0xfff500c1,0xffdcf987,0x0004575b,0x0000f267,0x00bb05ab,0x00d54828,0x005e48c9,0x0054379e,0xfffe5837,0xffd16eab,0x006efac0,0x01066a82, -0x0091ad90,0x01793396,0x01bde3ec,0x018813c6,0x00ace0d7,0x000fba94,0x00bda5a2,0xfffe2dcb,0x002194c7,0x0024d882,0x00807467,0x00ae4442,0xffdba46b,0xffe0c179,0xffc97561,0x0007bf3c,0x00014aaa,0x003a3912,0x0061e9f5,0x002aaa3b,0x003d6296,0x007b37c3,0x00a798c3,0x00f108fa,0x00a9a2d2, -0x00aa2546,0x00c104d5,0x0074dde6,0x00ad62bc,0x00d08dd9,0x00d2814e,0x00a03b1d,0x007dd14e,0x005ff3c1,0x00545c33,0xff95c9e0,0xfe1ac06c,0xfeb476b6,0xfee58ba4,0xff4bed75,0x0027d2d8,0x00b742ed,0x011fb790,0x00381eaf,0xff9f7ca1,0xff50d58a,0xfe34077a,0xfd48f9a0,0xfc9b0a54,0xfda2dda4, -0xfe4c5ab4,0xfeb14490,0xff1426c8,0xff3bbb16,0xff47bc09,0xff6ab551,0xffe01592,0x00b822b0,0x00706706,0x0074f969,0x006441a7,0x00c1d316,0x00c37d43,0x0032f069,0x0093a44d,0x00d9753e,0x010ec8ce,0x00dca125,0x00956de6,0x002cdbcc,0x000d86d5,0xffc8339a,0xff5a5ea3,0xff7479d2,0xff7e2ded, -0xff6db8f8,0xfeddcd24,0xfeb6c0ac,0xff15848b,0xff8a30a7,0xfcfe0c78,0xfc959f94,0xfc9e39b0,0xfd7ec530,0xfeb0b402,0xff6b38d0,0xff708b14,0xfecbea84,0xfed82b1c,0xff132dab,0xff8a18fd,0x003df958,0x00932180,0x00a701a7,0x005791e3,0x0042d1a3,0x003e4b6e,0x005f1134,0x007a6e80,0x007b5717, -0x00de354e,0x00dbc431,0x00940a18,0x0076dbc3,0x003021fb,0xfffd8f6c,0xffaadd71,0xff8c76de,0xffb90899,0xff43d617,0xfeea67fe,0xfeabf60c,0xff79e2af,0xff874d7c,0xfeaba988,0xfdbc3e7c,0xfe3f8c66,0xfe39e1ca,0xfecca7a4,0xfef5a164,0xff5da2f2,0xff7a087b,0xffafe744,0xfff95525,0x006d7cae, -0x00a80d2b,0x011dbebc,0x00bc1d93,0x00b106bc,0x008f9f6f,0x005fc091,0x002c21d0,0xfffa7a3e,0xffce9799,0xffabdeb4,0xff76a1b4,0xff99c054,0xffbfba04,0xffec06c5,0xffc0e42e,0xff910e15,0xff5aef00,0xff581a70,0xff490683,0xff432f4d,0xff55964d,0xff82e01b,0xff8e9ea3,0xff174a0d,0xfea59e2c, -0xfe5ed088,0xfe5637e6,0xff3de86b,0xff70ed54,0xffb5adea,0xffb2da1b,0xffe48344,0xfff6fa0f,0x000df302,0x002d7e5e,0x000a4571,0xfff21deb,0xffeb8435,0xffe113bd,0xffe115b8,0xffde5b0a,0xffa821ce,0xff857ab4,0xff5e1a86,0xff3a1386,0xfeee736e,0xff00ffdb,0xfee0389a,0xfeaaabce,0xfe84eb48, -0xfe57a58c,0xfe3bb1fc,0xfe170cba,0xfe2de112,0xfe333d76,0xfe2af152,0xfe23eb68,0xfe0c6346,0xfe0a5c6e,0xfe4af356,0xfe980dbc,0xfed007ea,0xff07ba87,0xfeef8a26,0xff02c519,0xfef7af98,0xff017f25,0xff04a0e0,0xff188eb9,0xff1c50b4,0xff2e1bcd,0xff23282e,0xff216d4b,0xff12ac0c,0xff119e3d, -0xff06520e,0xff02654a,0xfefe308e,0xff0628bb,0xfed0d8f6,0xfed8ac80,0xfed8b870,0xfef5357c,0xfed981c8,0xfeceea6a,0xfec067f8,0xfeb7b440,0xfeac359a,0xfe99e352,0xfe991b92,0xfe96a658,0xfe9a64e0,0xfe9be6ca,0xfea037f8,0xfe940b20,0xfeacec7e,0xfeb92dca,0xfecb3b2a,0xfedba996,0xfe9ac57e, -0x0062952c,0x0061a21a,0x0056a256,0x005ed4dd,0x0060a5eb,0x0069517d,0x005a8aa2,0x0064fa75,0x0065025e,0x0075cfc5,0x007df9a2,0x007ad4fe,0x0090bf35,0x008dec53,0x006de4cf,0x006444f6,0x005621f9,0x007a5c71,0x00653819,0x005f9fd6,0x004f6950,0x00558a73,0x005763cf,0x00600048,0x005f71ca, -0x005e816e,0x00592aa5,0x0051b573,0x00523816,0x006bb2b8,0x0054401a,0x0051f4ca,0x005b84d7,0x004e3348,0x0049fdee,0x003da213,0x0058f10d,0x0051b5cb,0x003e0496,0x00533d90,0x005289d5,0x006488ca,0x005f4bfa,0x0059da3e,0x0046b726,0x00747f27,0x008d6fc9,0x008b9e5b,0x00ca2068,0x00b851b4, -0x006ab388,0x005f592b,0x0059dc33,0x0084aa71,0x00711619,0x00729ada,0x004c1125,0x004ca599,0x00546fa5,0x006b25fe,0x006b0ecb,0x00603098,0x004f41c4,0x003cad26,0x004cc152,0x009fa4c2,0x00686863,0x0057be4b,0x0061cfd8,0x0027c416,0x00169790,0x00069af6,0x00467e95,0x008fa825,0x0060be73, -0x0056c387,0x0041c680,0x0050ab42,0x004d3ead,0x0064933a,0x005618da,0x009c5d77,0x00ca9787,0x00b428dd,0x0129fa9a,0x0119cd04,0x006dfbe0,0x006c212b,0x00548c1b,0x00a258af,0x007705b7,0x006a021c,0x003bb2e8,0x003a4ce1,0x005109bc,0x007b30dd,0x007fd194,0x007b0fbd,0x005735d8,0x003673f0, -0x0033605c,0x00d69790,0x004fb7bf,0x0045e169,0x0073be63,0x00113eb2,0xfff6c9e3,0xffc29911,0x0054d2fb,0x0035be71,0x00155d13,0x001c0faa,0x0063de26,0x009eeb58,0x005228ea,0x00395dec,0x000c801b,0x007f94e0,0x00c974ac,0x00b5a8ad,0x015a5a10,0x00ff16fb,0x00008e47,0x005f63b3,0x00938921, -0x01352a7a,0x00b49ccd,0x0082967b,0x001e9cdf,0x000babfa,0x002c1ad2,0x00703aa3,0x007ccf13,0x004ff499,0x0007b870,0xfff08e1c,0x00511cf7,0x017c655a,0x00bdee48,0x00663af5,0x00726ca9,0xff8a5bbc,0xff404772,0xff22f5ac,0x0002fe54,0x0188054a,0x013cadfc,0x002e491c,0xff157951,0xfe2ff04e, -0xffb08b85,0x00858a31,0x00a4f44a,0x0220c360,0x01e7ae62,0x00970089,0x00113528,0x00587278,0x0173fe16,0x00eb7bb4,0x00a64483,0x00a88a2e,0x0044835e,0x002c9149,0x004e1c34,0x00b23689,0x00d4a850,0x010194ba,0x00eeee44,0x0131d444,0x01eb0e0e,0x00adc4f1,0xff7db18f,0xfe92ff5a,0xfecb11a0, -0xff9aaebc,0x010b8fba,0x019d9706,0x01c007dc,0x01912ea6,0x015453a4,0xff13fda7,0xfbc76ad0,0x0139aade,0x02c51d10,0xffead708,0x00f56b1c,0x00ae7beb,0x002e6ade,0x00285aa7,0x006d10d2,0x0158b494,0x00fbd539,0x00b7db48,0x00a0ef2d,0x0121bdb6,0x015eb894,0x00874555,0x00904cca,0x00995a92, -0x00891da0,0x00d49c9c,0x00efb6bb,0x0120b54a,0x011ad6f4,0x0121068c,0x0118beb6,0x00bb2e34,0x007f4ea7,0xffe71a14,0x01a3f82c,0x00eeae43,0xfe7898c0,0xfedb7dc4,0xff06b852,0xff372bea,0xffdb6533,0x00bf01fc,0xff05ba18,0xff010978,0xff38b6c7,0x002f4998,0x00f6f113,0x00b7af16,0x003de516, -0x0079d26e,0x00538dd7,0x005e9e90,0x0049e9c4,0x0073a467,0x0097138a,0x000b1a9d,0xffc8c5c2,0xff7e895d,0xff9ae45d,0xffb891e1,0xffa1c6c0,0xffef367a,0x003741ee,0x00ac9a39,0xffbcb4b4,0xff76d4fc,0xffc0f214,0x007fe075,0x010cffec,0x00b352cb,0x0165f666,0x010b7728,0x00406029,0x00250ce3, -0x0047f1b9,0x0179ba02,0x01290168,0x00cadd01,0x012ecbca,0x010a7796,0x00b93e0a,0xffece232,0x000c7cd3,0xffd7e1d1,0xff94cf66,0xfff28442,0x001408e9,0x003b7d53,0x003d95cc,0x004a448b,0x0049ad0f,0x0076059a,0x00903639,0x002e57a1,0x001fe453,0x002e618d,0x005dfb40,0x0091345d,0x00992291, -0x00ba692e,0x003f3b61,0x00038b30,0x0021558f,0xffe64902,0xff6cc7db,0xfeadb000,0xff6a31ce,0xff9bbe7f,0xffdf38ea,0x0051424a,0x00b097b0,0x01151bb4,0x00b9ef0a,0xff4f2e00,0xfecfefb0,0xfe5115be,0xfda37738,0xfcb5df3c,0xfd438e00,0xfdf10ce4,0xfeb9699a,0xff5b6a84,0xffacca36,0xffba2311, -0xff965295,0xffd06ea0,0x004108d0,0x00418951,0x004ba004,0xffffffe7,0x004e0843,0x005dfc84,0x0050d9a3,0x0005f862,0x0020ffbe,0x00b28668,0x00a14fbb,0x007a3558,0x0005989f,0xffd5f1ab,0xff8f2488,0xff634126,0xfec17e4a,0xfecf0e26,0xffcd928f,0xffabcc03,0xffa55047,0xffbc8832,0xff9e53c7, -0xfe50b748,0xfe039cd2,0xfde0fbd0,0xfe5bd54a,0xff45166e,0xfef024f6,0xfea9ae86,0xfe632f86,0xfe674b3e,0xfe968c7c,0xfefc0290,0xff271107,0xff8d6787,0x0040af72,0x002babf9,0x004a258f,0x0043384d,0x0097b22b,0x00a19b97,0x00953a29,0x0076bbb4,0x0081f397,0x00e13104,0x006fefec,0x003d7f4f, -0xffd4f9e9,0xffb813d2,0xff910a4f,0xff670e0d,0xff5d6268,0xfede9cee,0xfe14dca8,0xfda30b8c,0xfdbd5e70,0xfe475390,0xfe491bc2,0xfdb5d0b4,0xfd59ef2c,0xfda9dd30,0xfdc48960,0xfdf976b0,0xfe5af20c,0xfed86906,0xff45771f,0xffa1cd18,0xffd89714,0x00374217,0x0033b746,0x0063359b,0x007f23e6, -0x003f31eb,0x0014e28b,0xffe1d5b8,0xfff58bee,0xfffcdecb,0x003ab0a8,0x00954a68,0x00c43551,0x01146690,0x00d5c2ba,0x00a75bcb,0x00729381,0x004bd7ee,0x00200780,0xffe28215,0xfff3c5bf,0x00116e65,0x003c8244,0xffbd5635,0xff1ea7cc,0xfe839522,0xfe0e49e8,0xff1d4bd5,0xff240abf,0xff5c63bd, -0xff7c6447,0xffa283e3,0xffb16faf,0xffbf2e0b,0xffe050f3,0xffdb8031,0xffe2a411,0xfff0aef4,0x0009b4cf,0x0022a1a2,0x004697e8,0x0014f6c8,0xfffe8842,0xffeea3f8,0xffd49e60,0xff93d970,0xff9c3c8e,0xff903cce,0xff813674,0xff7b8199,0xff788056,0xff7eec79,0xff87fadd,0xff71ad41,0xff5b07d2, -0xff42322f,0xff1fe99b,0xfeee955c,0xfec8d608,0xfec50d3c,0xfee11774,0xfef6be56,0xff0fec92,0xff83abc6,0xff845ef7,0xff719098,0xff657147,0xff4c9a92,0xff93a4af,0xff7f4ebd,0xff7032ce,0xff7abfad,0xff85129b,0xff8684f6,0xff8ada8b,0xff86b550,0xff8b3963,0xffa83124,0xffc579c2,0xff6055bb, -0xff880b95,0xff995f39,0xffb858f1,0xffb1432f,0xffb5a118,0xffb4ae00,0xffb9f216,0xffbafc50,0xffbecb2f,0xffb0d5c7,0xffa7c9d8,0xff9efe01,0xff96ab66,0xff91b277,0xff840c59,0xff8da0c3,0xff8a3815,0xff877cb2,0xff82f454,0xffbff24a,0x002fe20b,0x00303d0c,0x004567f6,0x00425b7e,0x00413bd4, -0x00446b09,0x003c0764,0x00461f41,0x0045037a,0x00531e3c,0x00590612,0x0059803c,0x006b6b58,0x00697fe8,0x0056dd15,0x003dafbd,0x0026daa3,0x003b8192,0x00347c1e,0x003541c2,0x002b0f03,0x00321f95,0x003190f1,0x003478a8,0x00258dcd,0x001a0c7a,0x0005f771,0x000689c3,0x000f2018,0x003ba2d2, -0x00252377,0x0024c5e4,0x002da70c,0x001a971e,0x0014103d,0x000a6f5c,0x0020a5f5,0x00220772,0x00463427,0x002dddd5,0x003ab36e,0x00451a02,0x00606b1d,0x00588c00,0x00363934,0x0058ca88,0x006cb138,0x00737c13,0x00a3016b,0x0099a05e,0x006af182,0x0040f14e,0x0024c1d9,0x001d29b2,0x002dfa4b, -0x003b987d,0x002bc6e3,0x003d8463,0x003e6212,0x003c3784,0x000e7461,0xffe0c1d1,0xffba1ddb,0xffb1aa8f,0xffdec1d5,0x005f313a,0x002f7975,0x002a6255,0x0029a47e,0xffe8dcc1,0xffd221ff,0xffd10c88,0x0004b21c,0x00571624,0x00ae6aa8,0x007708ce,0x00635baf,0x00473645,0x006fb51b,0x008c8caf, -0x005abcb7,0x00a057eb,0x00c46840,0x00c57070,0x012726d6,0x0116e536,0x00a52cae,0x0060df37,0x001ed952,0x0008c36c,0x0034cb11,0x00441361,0x003180b8,0x004c2a1d,0x00506800,0x0057f0fb,0x000a37c5,0xffc86dda,0xff6ae645,0xff5d8063,0xff8d0724,0x0082f4a5,0x00185ca1,0x001dea52,0x003e2fc8, -0xffc23177,0xff9e7d7b,0xff8be229,0xfff35735,0x002ee0f0,0x0074aa2a,0x00013a8d,0x00440994,0x00791c62,0x00acf319,0x009932e6,0x003b4cd7,0x009a837e,0x00bce07d,0x00c38d3b,0x01833b40,0x014900d8,0x00810661,0x00705067,0x005feb80,0x006e9018,0x003f0acf,0x002d9e16,0x000846f6,0x003c9ceb, -0x004d6550,0x004fa1cd,0xffc389cb,0xff179782,0xfea9918a,0xfeb0cf0e,0xff7e6e7f,0x01091826,0x005c04ee,0x003fa989,0x002e8216,0xff291a76,0xfece955a,0xff13ef7d,0xffc42b0f,0x009aa1e6,0x01bfcc80,0x0191cfc4,0x00a252e4,0xfee44cac,0xff9341bf,0x003e6a06,0x0079a9f6,0x018ff11c,0x01f29998, -0x0170ecc4,0x005b95c2,0x00515237,0x0131e482,0x008bc92a,0x006e9153,0x009fc503,0x00a8fe0c,0x00be0335,0x00be1ca0,0x00d4ff7e,0x00dcf51c,0x010dfe9c,0x012d4066,0x017420d8,0x021a0f1c,0xff977948,0xfe608496,0xfe62d7ea,0xff2588c2,0x0019282e,0x0054d36c,0x01fd2306,0x01f8ab3a,0x0088df7c, -0x0023c6db,0x003bd00b,0xfcd1e0e4,0xfdbf71a8,0xff7795eb,0x012541d2,0x00d09d6f,0x00b573cd,0x00f76c64,0x005ec5bd,0x004ac541,0x0127462e,0x0152a434,0x011a2020,0x008e2f46,0x00f3f2c9,0x00e51ac5,0x005be1bb,0x0037f691,0x00365c5b,0x00705704,0x005ead30,0x00a76ee0,0x015abb3e,0x015c50c4, -0x012f9f46,0x00e61f56,0x0059ff7d,0x0050688a,0x00b68129,0x0116e696,0x008d18fc,0xff2cb0f9,0xffa411ee,0xffb2d496,0xff5e4faa,0x00f7cf88,0x01c49124,0x00950631,0x00823540,0x0084ff98,0x009efb29,0x010eb8de,0x00cdf722,0xffed8257,0x0065b532,0x007a06c4,0x005a0209,0x0052db3b,0x006e7c49, -0x00b7b32c,0x001b77bd,0xff9f95f5,0xffccb07a,0xffb8e4c2,0xffa30272,0xffb44923,0xff9d7906,0xffde323b,0x0095f32f,0xffc1f265,0xffbfadc7,0x001ac93e,0x0077a012,0x00926434,0x00e9145b,0xfffa1ca5,0xff605d8b,0xff467555,0xff509261,0x001e408c,0x013b5aa2,0x01a9d352,0x00ab891d,0x00accdf2, -0x0046cc25,0xffe53d75,0xff69a543,0xffae4060,0xffa19fcb,0xff8dfb78,0x0033e1e1,0x00566c37,0x00368d8a,0x008424cf,0x007c0e7a,0x0034a2aa,0x001c6d0b,0x0017fb89,0x00215fe6,0xffe4b79d,0x000ad4f9,0x007fe518,0x00b4a2c5,0x00b4ccca,0x00b21996,0x0020fe2e,0xffdeb20d,0xffaed2d9,0xff6d14bd, -0xff6eb03e,0x0022edd5,0xfffbf547,0x00792299,0x018194f6,0x0150f53e,0x010eb76c,0x00bf6de7,0x00c7d297,0xff2e5ed4,0xff2d2bcd,0xfe6ad6fc,0xfe011716,0xfdf36ea0,0xfda79ef4,0xfe0cbdfe,0xfea9dad2,0xff31c249,0xffa14109,0xffc71a35,0xffc898dc,0xffc76937,0xffa013b8,0x00028c21,0x00249541, -0x0008aacb,0x0000901c,0x0005bdfa,0x0032377e,0xffe79abc,0xffe5453d,0x0001fb78,0x0032d5f2,0x003d73c4,0x0013e2e0,0xffd3b516,0xff89f307,0xff85e6a1,0xfec4f342,0xfe8c3a8e,0xfee097a4,0xff878d5c,0x000f3d90,0x0057fef9,0xff967ea1,0xfee35572,0xfedfb11e,0xfede0ed6,0xfeedaf20,0xff0fc3a5, -0xfe874d88,0xfe318a40,0xfe270694,0xfe570480,0xfe86e466,0xfeb73ac4,0xfea92118,0xfef90e2e,0xff99c304,0x000a3cd4,0x004ebefb,0x0053202b,0x006f7bce,0x007639dd,0x0071e8a1,0x002b4b4d,0x001f34d6,0x002b0849,0x0063aa97,0x00466463,0xffffa0ef,0xffc0b8ad,0xff90a2e2,0xff69d885,0xff47fa69, -0xff280e6c,0xfee5893e,0xfea0a078,0xfe550212,0xfe2a5bd6,0xfe997594,0xfe423a90,0xfe1a6f32,0xfe220d6c,0xfe4ceea6,0xfe6aea44,0xfeb95a90,0xff1aafab,0xff715ef7,0xff70ddac,0xff4cf616,0xff634f17,0xff891dd1,0xfff9374e,0x0020a69f,0x0027c5e0,0x00301ee4,0x0056456e,0x0064312c,0x00798f94, -0x008a9502,0x00855472,0x008ac35a,0x0086360a,0x00944b6e,0x00a8b2c8,0x00d33edf,0x0077cfc4,0x001af6e7,0xffaf0dd9,0xff7b71a9,0xff4366c2,0xff1a1878,0xfedb2466,0xfea69bbc,0xfe5dc080,0xfe4ab05a,0xfee34958,0xfeb729c4,0xfee5d1a0,0xfefd64ce,0xff1e3eb4,0xff374440,0xff3dce79,0xff5c001c, -0xff6465c5,0xff841fbf,0xffa43cb2,0xffb4d5ff,0xffc73415,0xffeff42d,0xfff7aaa9,0x0004e490,0x00078c7d,0x000cc47a,0xffff6edb,0x003b910a,0x004535b5,0x0045d821,0x004be6a9,0x0057c424,0x005d16af,0x006d5ad6,0x0044ca79,0x003200d0,0x001c6c87,0x000374d7,0xffe59b01,0xffc87ea8,0xff92e24a, -0xff641795,0xff3dad74,0xff0ea6c7,0xffa57c1e,0xff89093b,0xffab282f,0xffb21ff0,0xffc34e69,0xffb4a1c0,0xffc857bf,0xffdfea3a,0xfff0f58a,0xffffa05a,0x000801f7,0x0015d635,0x001bafc4,0x00236402,0x000c7fde,0x000be924,0x000de888,0x00150f46,0x0017960e,0x00287e15,0x0022cd36,0x0028c1b1, -0x002c751f,0x002d98b3,0x002e0929,0x00340bba,0x00262894,0x001a1654,0x000c7273,0xfffeb3e1,0xfff232eb,0xffe8d1e4,0xffdcb01a,0xffd07159,0xffc1573e,0xffb301da,0x000a0d63,0xfffe1089,0x0004bfad,0x0029ca98,0x0022ee41,0x00213733,0x001b2800,0x00162209,0x0020696a,0x00170599,0x002cf14b, -0x0031ae8f,0x002f2e08,0x003d2479,0x003a82fa,0x0033808d,0x000cae6b,0xfff75fac,0xfffff456,0x0003c621,0x0006f3a4,0x0004b675,0x000ff9d6,0x000bc915,0x0002dd27,0xffe9c29c,0xffd9138e,0xffc39836,0xffd0d94c,0xffdc8bc1,0xfffe6fd4,0xfff202cd,0xfff4d9b1,0x0005fa7f,0xffe73877,0xffe083af, -0xffe25997,0xfff071c2,0xfffa1370,0x0043911d,0x002e1342,0x0026d94c,0x001acc19,0x0052d2e8,0x004abf3c,0x000d397f,0x003d2dd2,0x004f9ff6,0x0055b17c,0x00704e02,0x006855cf,0x0057d89d,0x000ef3e3,0xffe6ca2d,0xffd16dcb,0xffebf540,0x000d3ed6,0x000f9e8c,0x002f60a9,0x00251991,0xfffcbd97, -0xffb29455,0xff7fc4fb,0xff6279c6,0xff7ff5ef,0xffb28560,0x0006233c,0xffef441b,0xffee237e,0x0000fc5e,0xffafdce5,0xff9ccd48,0xffb22eb3,0xffd2a45d,0x002956e9,0x00e9614c,0x00a4eeb5,0x007be8a0,0x00368075,0x007e0dcc,0x00950634,0x00316c06,0x009fa409,0x00ba7bf3,0x00b780c0,0x00f5937a, -0x00e54694,0x00a1dff6,0x002b811f,0xffd86eb9,0xffab0242,0xffec1633,0x00181f71,0x002c58a7,0x00655e89,0x00516bd6,0x000df33a,0xff87b4c1,0xff28e83f,0xfed79fc2,0xff0d4ef1,0xff531760,0xfff7cab7,0xffcdcc74,0xffd6b85c,0x00256058,0xff710e6f,0xff54c64f,0xff81bf40,0xffb69307,0x00189a84, -0x00e62452,0x005a947f,0x00596dad,0x005902c3,0x010d2a4a,0x00ee6274,0x004997f4,0x00b78737,0x00cdf5ad,0x00ec993c,0x01a820e0,0x01808418,0x00d88290,0x00618baa,0xfff8334e,0xffa46e1b,0xffcc9652,0x000b0a6c,0x0025ecf1,0x008b6f60,0x0070e046,0xfff0077d,0xff0484d8,0xfe51b5ee,0xfe210254, -0xfe919ce0,0xff6b6fbf,0x0054f422,0xfff009a7,0xffe2525f,0x002034d9,0xfeee2582,0xfeac5560,0xff3df33b,0xff9ae023,0x00608ab6,0x01f05528,0x028ea0a8,0x01c5ac52,0xffc9288d,0xff298f53,0xff9482ec,0x006d7a4e,0x00d3bb09,0x018bc63c,0x024051a4,0x009c7d14,0x0023fd92,0x00cc37ec,0x00494485, -0x006f2cba,0x00cb00b4,0x00f1f327,0x00ffb8ee,0x00c3bab2,0x00ad4acd,0x00b9d46b,0x00d61489,0x0109b9e4,0x00fb618b,0x00aa731b,0xfebd363e,0xfdc96ce0,0xfdb12e8c,0xff43dea4,0x00312ab6,0xff65cd75,0x015bb35c,0x014642e8,0xff57ad38,0xffb3667d,0xffca3501,0xfde9a894,0xfb731160,0xfd030d94, -0x025cbbdc,0x0114f1f2,0x00aa8741,0x00df1744,0x0081f82e,0x006856b0,0x00d406f9,0x01682790,0x01431b2e,0x0071a198,0x00879013,0x005b1cf7,0x004efb5e,0x0028a7a8,0x0025ee30,0x005735ca,0x000e2572,0x005ae3fd,0x0109f550,0x0136ccb6,0x00ec1a06,0x0066c9a2,0x00196c13,0x005b1578,0x0156eb4a, -0xffe7deec,0xff439511,0xfef62c06,0x00372c99,0x00982701,0x000d214e,0x00bed3e7,0x027b17a0,0x02ac2db8,0x027cacb4,0x0203feb4,0x011bb040,0x00fc1637,0x00d7df7a,0x002606ff,0x00870c31,0x00982516,0x00470068,0x00552f61,0x0065f308,0x00a81c94,0x003dc95d,0xffd18bf2,0x00146081,0xffeeba44, -0xffcfc106,0xffc6a27a,0xff9a2c44,0xffbdac6c,0xfffbc8f3,0x001bd067,0x006de295,0x0095914a,0x0072cf6e,0x00097595,0x007c87ee,0xfed75e1e,0xfe7e7ad4,0xff31f6c8,0xffc298e2,0x00b6d0d0,0x0150436a,0x01e60a62,0xfff092ee,0xff5b27f9,0xff220521,0xff4480fc,0xff804f3b,0xffd7c7dd,0xffc14e04, -0xffc53122,0x003996f7,0x006c82c3,0x00541ff0,0x0098d9c0,0x006f5cbe,0xfff8227f,0xffe4fed9,0xffddccb4,0x00040c0b,0xffed4025,0x00111736,0x007034d6,0x008c8f30,0x00a37070,0x009d7b5e,0x00711176,0x0034893b,0xffa2c2ec,0xff5ec4d0,0xffbd50da,0x0113c898,0x00899178,0x012abfaa,0x0268eac4, -0x0214e7ec,0x019db6b0,0x00cd78e0,0x0082589b,0xffbf20f7,0xff96cc8d,0xff0e965b,0xfecd0bb2,0xfed569c4,0xfea911ba,0xfee46e2e,0xff1f99f0,0xff4d4f49,0xff85040a,0xff7922bb,0xff8a59da,0xff937085,0xff67b989,0xffe8364f,0x000529ed,0x0007651b,0x0004573b,0x000aac9c,0x002473b7,0x0015e1f6, -0xfffef6af,0xffe8f305,0xfffd3353,0x000dd704,0x003522c2,0x00203a54,0xfffd2185,0xffb97fa2,0xff593c91,0xfefab37a,0xfe552ff8,0xff32aa25,0xffca17f6,0x000c1600,0xffe2da08,0xff5ca91e,0xff4ed1b2,0xff4a1447,0xfeffc464,0xfe48c1c2,0xfe043e16,0xfddb656c,0xfdeb6e70,0xfe3b8350,0xfe856284, -0xfeb967ec,0xfebed78a,0xfee5c4ec,0xff28b004,0xffb265a5,0x00109309,0x006c4fbe,0x00506c10,0x0044ea2b,0x00392a35,0x0014208d,0xfffa279d,0xffd32692,0x0005bd4c,0x002897fb,0x004a5d2a,0xffff06e8,0xffcc07f6,0xff9a33c9,0xffb211ba,0xffca0525,0xffb73b3b,0xff9e7085,0xff718f81,0xff725cda, -0xff58a875,0xff1d0be7,0xff1b2e21,0xff0d9ec7,0xff334eee,0xff536e8a,0xff4e923f,0xff42961d,0xff4162c9,0xff0d5c7d,0xfec550b6,0xfe9c336a,0xfec8e7c0,0xff28780c,0xff3e3855,0xffbb38e0,0x000dc850,0x0090ce11,0x00733923,0x0065e3db,0x005e6321,0x00411aca,0x002fd5e8,0x00131a4f,0x00286c62, -0x0036f11d,0x00583b44,0x000a20a3,0xffd09b75,0xff95eaf9,0xff4e4496,0xfefff5cc,0xfec0d8bc,0xfec9464c,0xfedcad86,0xfee66a08,0xfefdc64e,0xfef21636,0xfec2a22c,0xfea7a1fa,0xfebc2c02,0xfeb9459c,0xfec36658,0xfecbf9e2,0xfeda21f0,0xfef9f784,0xff24321f,0xff48ce90,0xff5916fb,0xff6c1d35, -0xff825af8,0xffae855b,0xffc72d62,0xffed5909,0x00114722,0x00554d45,0x005f2f78,0x0056f635,0x0059b649,0x0056a9e4,0x00548c50,0x004ad4c3,0x004923e0,0x002d2b9a,0x001d12d0,0x000dbe85,0x00027dc5,0xfffc44d1,0xffeb5aeb,0xffbd27bf,0xff84c88c,0xff515876,0xff1f657a,0xff7fdce2,0xff6f28e2, -0xff79103f,0xff7c4e50,0xff85dc9a,0xff81083a,0xff894f65,0xff97785e,0xffa3c8ed,0xffad0c60,0xffb6d135,0xffc2aad2,0xffcb555c,0xffd2f6fd,0xffcc0977,0xffcb488f,0xfff148ed,0xffef2d3d,0xfff46922,0xfff1e507,0xfff27a30,0xfff0b773,0xfff00664,0xffedf540,0xffed5abe,0xffeedf07,0xffe68986, -0xffde5cd2,0xffd4b435,0xffcafcfd,0xffc0763b,0xffbd7a31,0xffad8a45,0xffa49e0b,0xff9ac226,0xff8df6e0,0xffbfb527,0xffdcdc36,0xffe2773d,0x0004c2da,0xffff08b1,0xfffc7e98,0xffe95faa,0xfff3ee15,0xfffc86b5,0xffe99c83,0x0007bb4e,0x000c386b,0x0006304a,0x00099d6d,0x00059a04,0x000b3f00, -0xffe39878,0xffd4ee05,0xffd8902a,0xffdcbe6e,0xffe21771,0xffe9920d,0xfff00cbf,0xffea0243,0xffd8a074,0xffc6f38a,0xffbccf75,0xffb1f4d4,0xffc80455,0xffd0962b,0xffdb0fb6,0xffd61285,0xffd8222f,0xffeb556d,0xffc857cf,0xffc22834,0xffcbf28f,0xffd105cd,0xffd3778b,0x0019c62f,0x0014d2bd, -0xfffe1221,0xffd1fb6b,0x002c2265,0x0032ee94,0xffea36be,0x00274107,0x0034152f,0x0038dc6c,0x00326d4e,0x002a1f73,0x003dea54,0xffdfea36,0xffba58b6,0xffb072aa,0xffbe9784,0xffded563,0xfff2e7ee,0x000a3bac,0xfff73075,0xffbbac28,0xff8726ff,0xff6eee3d,0xff6b5bb3,0xffaf5e51,0xffd7dd3d, -0xffe36ac1,0xffd459a7,0xffcba155,0xffe99d94,0xff96ae72,0xff86cda7,0xffa5b008,0xffb19242,0xffe5f4b4,0x00a3db4b,0x007f67bc,0x00561844,0xffe5adb7,0x005eb02f,0x00776b5b,0xfffbd8ba,0x0093b7f6,0x00ac436d,0x0092526d,0x00937f74,0x007d4362,0x00871aa3,0xffe7b7b1,0xffa21d87,0xff94feaf, -0xffb2dde8,0xffe4cb97,0x00170317,0x00432c3b,0x001d6994,0xffb08e3f,0xff49bbf9,0xff10c13c,0xfef7c87e,0xff6bfc40,0xffa6d1b2,0xffcc6d90,0xffc0d295,0xffb66328,0x0010d577,0xff545473,0xff398208,0xff8afd79,0xff8aabb1,0xffc7daf5,0x0098fe30,0x004e85a5,0x001556a5,0xffd0d5a8,0x010a667a, -0x01190d4c,0x004a1f78,0x00cff7d3,0x00dc50f1,0x00e40dd0,0x01762eea,0x0157f6c2,0x00e82e7d,0x001cefc8,0xff9b7aa9,0xff65d32c,0xff7f71a8,0xffc9d3b1,0x001b6239,0x006d3186,0x002d7ea4,0xff675cdd,0xfeb7d10a,0xfe67ca5a,0xfe8bb844,0xff702ad1,0x00194db2,0x002c8fc1,0xffda2b11,0xffb42129, -0x0013fba5,0xfefad1d0,0xfed6310e,0xff6d034e,0xff7dcf53,0x00392227,0x01b0b5de,0x02cf7e30,0x025e80c4,0x006c4c55,0xfec47e0a,0xfeb854c2,0xfff64640,0x0031a09b,0x00fdbb26,0x0268a420,0x00a43c47,0xfff8874c,0x006110ec,0x00288012,0x0064dc3d,0x0088ac3f,0x00bf75b8,0x00d455e3,0x00b2a229, -0x0098cf1f,0x0090b1a7,0x007758b5,0x00c486c3,0x006c32b3,0xff6d78c7,0xfe8780f8,0xfe074bf4,0xfe06b022,0xff99344a,0x0034001f,0xff237bf9,0x00804f90,0x0027b4d3,0xfe5d14e8,0xff3acfaf,0xfe9290d8,0xfde7f838,0xfb877528,0xfcaf6440,0x016d4340,0x01682d74,0x01192c22,0x00a85406,0x00703f21, -0x006aad84,0x0077c254,0x012f06e2,0x0135bf0e,0x008d8cf6,0x00568dd3,0x0022688d,0x0060dc1c,0x005d4393,0x00434a07,0x00149ab8,0xffe6a4ab,0x00123b90,0x00562322,0x00bfcd1f,0x009ab763,0x003ea55d,0xfffc5948,0x00580553,0x018621ea,0xff3d08f9,0xfeaf8154,0xff2f784c,0x0051839d,0x00e3b6d3, -0x010c78a6,0x0008f891,0x026acfa4,0x034f6558,0x034e7c34,0x029260e8,0x00f5b8e1,0x0068bbe2,0x00a71cb6,0x00e181ed,0x00cd0aeb,0x00a78f3f,0x0040e068,0x003c6101,0x003c9bd7,0x006ba901,0x005c942a,0x001a5066,0x00173915,0xfff098e7,0xffbe5582,0xffa801d0,0xffc3448c,0xffcf59e4,0xffbfaca2, -0x008fcca0,0x00ffe461,0x011f0422,0x00bec650,0x000e81b5,0xff852be7,0xfed8c326,0xfede9034,0xfec9280e,0x016fd7cc,0x020da440,0x00bf3fda,0x01a7d916,0xff2256c2,0xfeb969e4,0xfe572ebe,0xfee67006,0xffdf5d71,0xfff51ae8,0xffd5eb38,0x00006974,0xfffb1203,0x001f6e23,0x0031cad9,0x00396033, -0x0014206e,0xffd9e481,0xffc7a59f,0xffabf617,0xffb4a24c,0xfff309c8,0x001904ea,0x00233b20,0x001c2ca6,0x004ef8cc,0x006f74a4,0x0092aa63,0x0062bd77,0x000d7bd3,0x000007b4,0x007acc74,0x0123518a,0x0174972a,0x01b7c4f2,0x0141489e,0x01753958,0x0116f2f4,0x00914613,0xffe57fcb,0x001b3cd5, -0x0093bdf4,0x000370fd,0xffcbe5d3,0xffb6475c,0xffb2471f,0xffd02511,0xffc79458,0xffb296ec,0xffb54978,0xff84da23,0xff5d1109,0xff60a15b,0xff866e95,0xffab559e,0xffda0658,0x003453af,0x00057eb8,0x0003920a,0x00187259,0x0051bb35,0x005a23a4,0x0035aa25,0x002be52d,0x0022b60e,0x0027a100, -0x002ff21e,0x0004f203,0xffa3b60f,0xffc12d84,0xffc78866,0xff905a1b,0xffb12b8a,0xffba9eb3,0xffe7e145,0xffd08212,0xffb655ef,0xff79211d,0xff34cf55,0xfed4f116,0xfe10b298,0xfddca6f4,0xfdda22e8,0xfe1139a6,0xfe4f6608,0xfe8c30e4,0xfebdf044,0xfef43df4,0xff130911,0xff1728ca,0xff60df05, -0xffa9e9a3,0x001f0c4f,0x003ce9a4,0x0050f8da,0x00394da4,0x00316176,0x0017541b,0xfff93168,0xffec52e9,0x00062859,0x0067a632,0x00489e10,0x00287e87,0x00026287,0xffd18a05,0xffd16a99,0x0021ec5b,0x001224d8,0x0004f3c8,0x00019317,0xffe56a4a,0xffb86228,0xffbe3028,0xff9b9dc1,0xffa05927, -0xffb0b43e,0xff6b73b4,0xff18a55a,0xfec9365a,0xfeae138c,0xfe94ab0e,0xfe6feef6,0xfe89de14,0xfea268d6,0xfeaf35e2,0xff42eea4,0xffba52a3,0x004224b1,0x00328e76,0x00382929,0x00466908,0x002bb70d,0x001b7da1,0x000ab277,0xfffa305e,0xffe01a0a,0xffc6610a,0xffbdf5d0,0xffc16078,0xffc7e59d, -0xff9f0414,0xff74665d,0xff4692cf,0xff618374,0xff82cdb4,0xff9b27cf,0xffa3c4f7,0xff6593cb,0xff5c7575,0xff295cd2,0xff36486c,0xff1b82ad,0xff1ec57c,0xff2f5a5b,0xff2782a3,0xff48ea6e,0xff541ae7,0xff627a30,0xff6bb688,0xff74e2fd,0xff729587,0xff80814b,0xff7a34d9,0xff854abf,0xff9583ec, -0xffbc0360,0xffb2fcd3,0xffb2cc5b,0xffb872e5,0xffba10e3,0xffbd6580,0xffc31ff4,0xffc60824,0xffc1de13,0xffb78227,0xffb0f4c5,0xffafce15,0xffb228e3,0xffa8cc83,0xffa0d929,0xff8b07c1,0xff7b5717,0xff6fdb54,0xff7c847d,0xff7e2a4b,0xff7c4a77,0xff7d1bf2,0xff7d6bac,0xff7fddca,0xff7f5159, -0xff7af7c7,0xff7a48d3,0xff7d1988,0xff82956c,0xff84ebe0,0xff89fd52,0xff904a0b,0xff8c36e7,0xff8940be,0xffaa2586,0xffa22849,0xffa1bd3f,0xff9b538d,0xff9ff88c,0xff9ec000,0xff9f509b,0xff9f3802,0xff9ed7e1,0xffa1175c,0xff9aa4ab,0xff97447f,0xff92ddd6,0xff8ddf48,0xff899b2d,0xff89b538, -0xff853b27,0xff851ab6,0xff84590c,0xff81c698,0xff7114ce,0xffd754e2,0xffd8bbbd,0xffee0019,0xfff00ac0,0xffed22fb,0xffcc7903,0xffe78a60,0xffeaea74,0xffd91f16,0xfff410ae,0xfff8f4da,0xfff897f3,0xffe9cff4,0xffe5bae5,0xfff9ba59,0xffd69c9f,0xffcd0758,0xffc6cc65,0xffcf9f3f,0xffd637ec, -0xffe390db,0xffdf4fa9,0xffd9863c,0xffccbcfb,0xffc20d50,0xffc090ca,0xffc0d4c6,0xffdc23ad,0xffe25162,0xffdd089a,0xffd73b95,0xffd5f12f,0xffe25d55,0xffc861c9,0xffc333df,0xffcc7b62,0xffcd9308,0xffc8ad4a,0xfff06b68,0xfffc0788,0xffe9b24e,0xffa83d30,0x000aafc3,0x002055c5,0xfff07ca8, -0x0021e424,0x00296dff,0x0037d60b,0x000a6c37,0x000083dc,0x00310c42,0xffcec020,0xffaf50fd,0xffa24ba5,0xffb5ab6c,0xffcdf065,0xffea61bd,0xffe3ac8a,0xffccc72b,0xffa5e7ba,0xff834870,0xff86b081,0xff9c5fab,0xfff99a8a,0x0017cbe4,0xfff34936,0xffd8a486,0xffc1705f,0xffd5c06c,0xff9fbb94, -0xff9a7f3d,0xffb21042,0xffb2de50,0xffc7e363,0x003cd839,0x00531c1b,0x003edd0c,0xffa290b5,0x0031c8af,0x004a72d0,0xfff3f61c,0x00844e5c,0x00a0179f,0x0091f398,0x0045d16f,0x0024b552,0x0081b37f,0xffc551de,0xff958ef6,0xff89305b,0xffa3d3f7,0xffce9ad4,0x000605b5,0xfffc23ab,0xffd0b76a, -0xff8897a0,0xff405ac8,0xff3d6a73,0xff5345ab,0xfff49fc9,0x00253688,0xfff53039,0xffdd6011,0xffb9dd46,0xffef68dc,0xff6d894a,0xff59c307,0xff9b30e7,0xff8a831d,0xffa96425,0x0020e49e,0x00270a75,0xffda961d,0xff4e4d94,0x00b5b29f,0x01119286,0x006147fe,0x00ef838f,0x01009d04,0x00ee3c4d, -0x0102277e,0x00e9cbc9,0x00e4b82a,0xffd84248,0xff7362ee,0xff66906d,0xff8359c9,0xffbf041e,0x001dbe57,0x000989a6,0xffb63238,0xff2b3979,0xfeb918c4,0xfec80966,0xff261edf,0x006551da,0x00e43e50,0x005d8bb8,0xfff130d5,0xff97f1ba,0xffc3b4d4,0xff2cd466,0xff3ad907,0xff947a0f,0xff8591ed, -0x000162a4,0x01031b5c,0x02700010,0x0268bd60,0x00e51458,0xfed124f8,0xfe4079ec,0xff57b184,0xffe1ce9e,0x008b647a,0x01a3762c,0x0099b3bf,0x000b073f,0xfffafcf0,0x0033313a,0x006c8ab4,0x0024b573,0x00593339,0x00741398,0x0083f910,0x0046832c,0x00436b28,0x00430ade,0x006bc67d,0xffffb74b, -0xff0c4e3a,0xfe87d29e,0xfe5a19e2,0xfee16246,0x00053dc6,0x00662bd0,0xffdfbb83,0xfffd3e78,0xff532ef2,0xfe58b356,0xff120541,0xfe40152a,0xfddc9520,0xfc54d72c,0xfcecc1e8,0xff4d9b3e,0x015d6734,0x01b8adfa,0x00f14659,0x00456f0e,0x0024f21c,0x0028fbc4,0x00c4844c,0x00f34b07,0x00b1cd6a, -0x0053e295,0x0018c0c3,0x00565d86,0x0065935a,0x003d31e7,0x000c2363,0xfffda711,0xfff8be1a,0xffd90245,0x002ea2be,0x002ffd29,0x00210337,0xfff9efcc,0x005847ff,0x015b766e,0xff38283f,0xfed5a9aa,0xffecf3b4,0x00292365,0x00f050e5,0x02297808,0xffde1eba,0x019a2b5a,0x030a20d0,0x02ac5908, -0x01f090ec,0x0040ec24,0xff5d4db7,0xffe4b250,0x012a54b4,0x00f0a135,0x00b47ba8,0x00245723,0x001ce922,0x0010be91,0x001dd0aa,0x00716d6d,0x005e8b93,0x00065c01,0xffe9fb9e,0xffc1d925,0xffc9c002,0xffd5208f,0xffd80943,0xffea364c,0x00b7337b,0x011700c0,0x013196f2,0x00f6055c,0x003e98de, -0xff19afb3,0xff8b185f,0x0004b277,0xffec42a7,0x0184afa6,0x011ce4a4,0xff43b34f,0x004d3b86,0xfec98606,0xfe7b625c,0xfe65d1d6,0xfeecd67e,0xffe65ad8,0x00067bf7,0x00032a6f,0x0012d8ac,0xffdad639,0xffdaccf2,0xfff7bf45,0xffcc0a67,0xffb82f07,0xffdaf660,0xff9f945d,0xff79c8e8,0xff86a347, -0xffd287f6,0xffe0b628,0xffb2433a,0xffd3ca78,0x000ccf02,0x0036d8a9,0x005b8b32,0x00518f4b,0x00994f29,0x00beaf5d,0x0114b190,0x0115e89c,0x01d3ed78,0x0181894a,0xfffd357a,0x00063b7d,0x0007826b,0x0020f5b5,0xff7e2177,0x010fe212,0x01355bfa,0x00c1a61e,0x008cb0c2,0x0082d868,0x006828d3, -0x004eba35,0x0030b018,0x000324f1,0xfff9aba2,0xfff99cc9,0xff92ce1d,0xff7032c0,0xff94216a,0xff935d8e,0xffc7f3be,0x000f19c2,0x000c1a1f,0x0019b196,0x001c182c,0x0055d903,0x006267d6,0x0052e677,0x00384b98,0x001b95ed,0xfff80a8e,0xffdf0d83,0xffbb3bb6,0xff8ec0ed,0x0003f666,0x00793dd3, -0x01226c9c,0x00aa228d,0x0068ba7c,0x009d95b4,0x00cc872c,0xff5ac181,0xff40a5dd,0xfec53678,0xfe66bd2a,0xfe057bac,0xfdea500c,0xfe1a0a4e,0xfe921eb0,0xfe9c7e7c,0xfebf712a,0xfef20a56,0xff2bade3,0xff50511d,0xff56ed63,0xff4e5130,0xff66c1fe,0xffa89adb,0x0024eab9,0x005a80d8,0x00479748, -0x0049b715,0x00443e75,0x00516379,0x000c2252,0x00151500,0x00433367,0x005793a9,0x00648f61,0x0045a07d,0x0032eb5e,0x000c2d71,0x00010b51,0xfff76bdb,0xffe5fcc6,0xffa15653,0xff8fd1d9,0x0006d849,0x00061350,0xffd78efe,0xffaed384,0xff94a361,0xff565fbe,0xff02f723,0xfeacb4e8,0xfea7d110, -0xfeaeb742,0xfe93cbb8,0xfebd9ae2,0xfebfccaa,0xfee8e1bc,0xff3845d3,0xff9157dc,0xffd1da31,0xffeeb59e,0x00129929,0x00549646,0x004e24bf,0x00427493,0x00428786,0x002d6c0c,0x0014984d,0xfff3a713,0x0000ec82,0x000ebed6,0x0020bb24,0x0017e67f,0x00193e06,0x0013d91c,0x001a36fb,0x001c01b7, -0x0023f3c5,0x00136566,0xff9a263d,0xff9bf16c,0xff8461f2,0xff91f5e7,0xff872dab,0xff87e37a,0xff991577,0xff9e26af,0xffa6f096,0xffa5416e,0xffa12928,0xffa35fe4,0xff9fa2cf,0xff9170dc,0xff8e03a6,0xff89d0c0,0xff9358a8,0xffa5411a,0xffa5a2c6,0xffc64de1,0xffc1aff8,0xffc59457,0xffc69a37, -0xffca319c,0xffd12d6b,0xffd67181,0xffcf5947,0xffc22841,0xffb8940a,0xffafdec3,0xffa55260,0xff98a810,0xff987c9f,0xff96dfec,0xff963577,0xff97df95,0xffaad38a,0xffb2a637,0xff9c689f,0xff9312d2,0xff844d0e,0xffa0c0c4,0xff8f1d68,0xff8189a0,0xff7b391c,0xff76d7b3,0xff75dde2,0xff6e8e60, -0xff6cbc8b,0xff69e152,0xff8105af,0xff95ab5d,0xff7f414b,0xff90f185,0xff9ca3d8,0xffb23acf,0xffae098f,0xffaf7ead,0xffaffd69,0xffb0bf4c,0xffb0db93,0xffb3c7cf,0xffadebec,0xffab8a62,0xffa7a6a3,0xffa440f7,0xffa1c9cb,0xff9e1436,0xffa23dde,0xffa4b77d,0xffa6e24b,0xffa9a077,0xff8f0b2b, -0xffe0f6db,0xffe08255,0xffeb3ac5,0xfff102da,0xffefde7a,0xffd28fef,0xffee4079,0xffece0a3,0xffe54f2b,0xfff36e2c,0xfff8ca62,0x000351ec,0xffe6fb7d,0xffe23e6f,0xfff99102,0xffde5dc5,0xffd69329,0xffc61f54,0xffd1f6be,0xffd810f0,0xffe5f3f5,0xffdddb1d,0xffd90d1d,0xffd0ff31,0xffccecd5, -0xffd09b33,0xffd88c66,0xfff08fb5,0xfff671b4,0xffef75d6,0xffe783dd,0xffe19bbb,0xffde5e36,0xffd45c3d,0xffd1e8b1,0xffda0b1d,0xffda34eb,0xffda87a0,0xffeb9a26,0xfffbb868,0xfff5fe49,0xffbd57f5,0x00044adb,0x001befa5,0x000e967a,0x0021ec15,0x00270625,0x0045a570,0x0001e917,0xfff647c4, -0x002419ca,0xffd82332,0xffbc0399,0xff9b9e7d,0xffb5c097,0xffc8845c,0xffe0455c,0xffc9cb14,0xffb696d0,0xffa37f5f,0xff9428d9,0xffa9fb49,0xffd32bbe,0x0024c39f,0x0038bfa9,0x00111d7e,0xffeda64c,0xffcc580f,0xffc3de58,0xffb11981,0xffb7a7e6,0xffce93cd,0xffcc2e18,0xffd93f20,0x0006c8d4, -0x00363acf,0x003bc5ae,0xffadf292,0x0026b533,0x0035b189,0x0018357f,0x00745c5b,0x008f34a4,0x00b3f999,0x002d7205,0x0005c153,0x0074ad60,0xffcaa5c3,0xffa7e625,0xff73f85a,0xff971824,0xffb9af4d,0xffebcc5d,0xffbf8f38,0xff9dc297,0xff790aa7,0xff56ba9e,0xff776cca,0xffaaaec7,0x004267f1, -0x006a3404,0x002b5c54,0x000dd5ad,0xffd31197,0xffb93f28,0xff890d57,0xff81589a,0xffbc69bd,0xffb12d2b,0xffdbab4f,0xfffb9a97,0x002f6f82,0xfff0cda3,0xff4ffa4b,0x006cc825,0x00eb6e31,0x00900dd6,0x00fea152,0x01280914,0x0123eab8,0x00a5e072,0x008dbe57,0x00dba680,0xffc15198,0xff7be1e5, -0xff5fc8a0,0xff86c1b4,0xffb63c43,0xfff3b760,0xff9a524c,0xff510fae,0xff0ccfaf,0xfee56a22,0xff32b0fc,0xffbefbb4,0x00e5fc7c,0x0129ab0e,0x008a448a,0x001843a2,0xff9ed920,0xff669322,0xff4af0a4,0xff8accd6,0xffd17145,0xffc2c99c,0xffc9393e,0x00384360,0x01834b98,0x01ecac9c,0x013175f0, -0xff516f08,0xfe73e4f6,0xff0f7d20,0xffc9e7a4,0x0048a726,0x009dd11a,0x00b306c2,0x0058f51e,0xffaf547a,0x004c6ddb,0x0071c2a4,0xffde966f,0xfffc85fc,0x00004d36,0x001f47a9,0x0008588d,0x0020d689,0x0033bd7a,0x0022d16a,0xffbecfaf,0xff187f0b,0xfe8d26ba,0xfeb3d45a,0x000a46b1,0x00758bc3, -0x00997c40,0x00a544b5,0xffbd2486,0xfee3ec78,0xfeb97df0,0xff29507a,0xfe9a1d34,0xfec99250,0xfd7dd450,0xfd79d994,0xfde12438,0x00d45da2,0x01ef17d6,0x0150b858,0x003d1479,0xffd69e47,0xffc79cd3,0x004b0459,0x009d97cb,0x00af0a16,0x00671fbc,0x00260483,0x00411eab,0x001d224f,0xffffe325, -0xffff52c0,0xffe89414,0xffd885c5,0xffaceb08,0xffaf0d6b,0xffc6607f,0xffe296b2,0x004642fc,0x0082a330,0x00aaba1b,0xff44e2ee,0xff277391,0x00ae1531,0x0057f0a8,0x013c00b4,0x02fb1438,0x0005edc2,0x00b553c3,0x0307119c,0x0148e590,0x007db495,0xffba5db5,0xfedf5bd6,0xff507c0e,0x009b48f6, -0x00c39e86,0x00aaed8a,0x000f4f71,0xfff6c460,0xffe3a929,0x000313dc,0x005e520c,0x00725521,0x000c113b,0x0010e2fd,0x000625f9,0x000b631d,0xffd87155,0xffe7016c,0x003fbe54,0x009df5bd,0x00d77394,0x00e06a41,0x00af5ea5,0x00438730,0xffab20c9,0x0002aa6d,0x00cb0b5c,0x021dda4c,0xffd15c83, -0xfe52dd90,0xfdc92f38,0xfed9e630,0xfed9a31c,0xfe632630,0xff047cc4,0xff831c31,0xffd8d310,0x002c726e,0x00416031,0x001e4bfc,0xfffe1701,0xffccbfdf,0xffdbc4b0,0xffa60597,0xff9ef6d0,0xffd839ea,0xff8e8032,0xff70951d,0xff7db549,0xff94a1e8,0xff8deef8,0xff769543,0xff907e31,0xffadae5c, -0xffdfc3fa,0xfff6f053,0x00473ad1,0x00dc89dd,0x01499d6e,0x016eb73a,0x0118a8ea,0x017c31e6,0x00ec7868,0x0023a642,0xff7fd823,0xff844d42,0xffa3a14a,0xff65d7a8,0x01af2ef4,0x01226bec,0x00f1ba05,0x00b0747b,0x00a6a0d2,0x00853a28,0x00556baa,0x002b12a7,0x0015d768,0x001cc92e,0x0049bd47, -0x0001cafb,0xffc04a52,0xff8e8ccc,0xff93acfc,0xffb1ab0a,0xffc6ae0a,0xfffff8f7,0x0023c003,0x00273354,0x0048377c,0x004d5f31,0x003f4f1a,0x002b0fe0,0x00043bed,0xffbefd73,0xffa11856,0xffb9e92b,0xfff89f6c,0x008ccd51,0x00fefe59,0x01924eb6,0x014695ea,0x014dd9b6,0x01a909fc,0x01d4cef2, -0xff130a43,0xff17f552,0xfe90b678,0xfe4decb2,0xfe445f28,0xfe7bf62e,0xfec82d58,0xff189363,0xff0bc93d,0xff177f5f,0xff411c2f,0xff54ef1d,0xff74a849,0xff802971,0xff630c7d,0xff62fe85,0xff6b3766,0xffdc4c59,0x001f8cf3,0x004ce94d,0x005460e3,0x005ed070,0x006abbc3,0x004eebe1,0x0040c75d, -0x0042eb5a,0x006ac660,0x007b2c43,0x007d6803,0x005b7f35,0x00398ba0,0x0024f19c,0xfff16853,0xffbc9187,0xff693ff8,0xff3ef152,0xfff6a89a,0xffee39c9,0xffb350d1,0xff782778,0xff2fb0d8,0xff1094c3,0xfede9fdc,0xfeaf6162,0xfec482da,0xfee25520,0xfee21ad6,0xff1de11e,0xff2f6efe,0xff6b9152, -0xff720c58,0xff8d8825,0xff8e44de,0xffd110ef,0x00157b37,0x005f154a,0x0056c8a9,0x005d79f0,0x00656fd7,0x005ea452,0x005a2d8b,0x004fc282,0x0056fdec,0x005f0464,0x0070cbf3,0x006e136f,0x006f53ec,0x006af1b1,0x004b5173,0x002fc9d8,0x001fe694,0x000ee3a2,0xffce7706,0xffd58a7b,0xffbed231, -0xffc5ca7d,0xffbf2d92,0xffba97f9,0xffbba64d,0xffb81b3b,0xffbc133c,0xffbe3782,0xffba1869,0xffbfb395,0xffbc1ee9,0xffb677f9,0xffb77614,0xffc42c52,0xffd0764a,0xffe020b8,0xffdc0f65,0x0000ccca,0xfff83fa0,0xfff51ca1,0xfff0225f,0xffecc049,0xffea7df4,0xffe91975,0xffe1feb8,0xffd6c98e, -0xffc91d21,0xffbd874a,0xffb4235e,0xffaf89c4,0xffb98652,0xffc3a8b5,0xffc84967,0xffca95a3,0xfffc4bd6,0x00070b4f,0xfff325da,0xffe7d25e,0xffd5c244,0xffe69a08,0xffd63126,0xffc67a03,0xffc642e6,0xffc3b10a,0xffc50181,0xffbffa27,0xffc0529e,0xffbf3700,0xffd6e338,0xffe68aaf,0xffcf9df4, -0xffe23b29,0xffead973,0xfffd22d1,0xfff5ca86,0xfff52098,0xfff36326,0xfff25b1c,0xfff0b7de,0xffefbcfb,0xffec51bc,0xffeb2c36,0xffeaabeb,0xffea6cdc,0xffe89c6c,0xffe24810,0xffe7d093,0xffeaecac,0xfff00156,0xfff6f10e,0xfff68a0f,0xffee5fc8,0xffefa34d,0xfff2bf2f,0xfff86cea,0xfff8d580, -0xffe7f703,0xfffaa9b9,0xfff66ec8,0xfff6e3c5,0xfff66f17,0xfffb2cdc,0x000ad74c,0xfff0adb3,0xffeba89a,0xfff9463b,0xffed59dc,0xffe84f6c,0xffcbad70,0xffdaaf51,0xffdefeb5,0xffe95154,0xffe23b1f,0xffdfcf45,0xffdc8204,0xffde3f75,0xffe52f30,0xfff50a18,0xffff13c1,0x00030ac0,0xfffd958e, -0xfff8e430,0xfff0aee4,0xffe25794,0xffdec01e,0xffdde380,0xffe6f1ce,0xffeaf343,0x0001bba5,0x0001b70a,0x0010fae0,0x00137f7a,0xfff146f6,0x0010c9de,0x00202803,0x002958ed,0x001dbc49,0x001e60e6,0x0040415b,0x00066638,0xfffdab44,0x0010c946,0xfff01596,0xffd791f2,0xff9ef545,0xffb7aee7, -0xffbf312d,0xffce845c,0xffb954cf,0xffb04070,0xffae60bc,0xffb30e64,0xffd50260,0x00113a61,0x0039f96e,0x003e42ab,0x001cb16c,0x0003727a,0xffe285ef,0xffc35582,0xffba0696,0xffc7aba8,0xffe8e809,0xfff36c12,0x0004bfa4,0xffffd61e,0x002ebd09,0x003fb3a6,0xffe9f4fc,0x003670c9,0x00345c16, -0x00404be6,0x0056d577,0x0064dbc4,0x00b16a25,0x002e3d27,0x00104e9c,0x004e06a3,0xffec6603,0xffd2da01,0xff69c53c,0xff928c06,0xffa385fa,0xffc3eb41,0xff964239,0xff867bdf,0xff837199,0xff853c83,0xffbadfdc,0x00186f3a,0x005ee4e1,0x0072d86e,0x00395aad,0x00338dc5,0xfff3a33b,0xffa393c5, -0xff8cbc9a,0xff8ca950,0xffd3a1c9,0xffe3f91a,0x00464eae,0x0030d5ec,0x006afb40,0x003f6741,0xffb815dc,0x005ff0cc,0x00ccd439,0x00c54234,0x00fb43f2,0x01340c04,0x014c5482,0x007b5329,0x0060fa56,0x00b7a3c0,0xffe102df,0xffaac2f2,0xff4224f6,0xff6f5209,0xff83973f,0xff973863,0xff38f634, -0xff1504b5,0xff16d137,0xff30edf6,0xffae647c,0x00823a96,0x011d8c0a,0x0107a08e,0x00782696,0x00360ed2,0xffca0872,0xff4d8a1f,0xff4f1c3c,0xffa5781f,0x000e8e63,0x0028771a,0xff7899c7,0xff7cca73,0x00530439,0x00f0b7f2,0x012b89c0,0xffe0a856,0xfefd7198,0xff108054,0xff965066,0x000b5175, -0x00039646,0x00e71fe9,0x00bd751e,0xff9d424d,0x004e5a28,0x005e90af,0xfff35dcf,0xffdd17b6,0xffd179f1,0xfff6cb59,0x001a676c,0x003dce83,0x00352771,0x0017ca6b,0xffb2e3ea,0xfefffb82,0xfea6c1aa,0xff21277e,0x00dc9f58,0x00b0ec40,0x00a535a4,0x00ced659,0xff7908f5,0xfea21830,0xfeba0f16, -0xff1df56a,0xff5a229b,0xffdead4c,0xfed2d2b4,0xfe4609d4,0xfdc7b180,0xfffedaca,0x014f1e34,0x0140d2b0,0x006a1276,0xffd9cefe,0xff771a5b,0xffdf5acf,0x0047889f,0x00853942,0x00635b1b,0x0027f862,0x0034cf4c,0xffc73aed,0xffa29198,0xffa46aed,0xffaf969b,0xffb893d3,0xffae12c9,0xff73b742, -0xff9501d7,0xffb31569,0x00d52727,0x00e7d413,0x001417d6,0xff601ec1,0xff7608e0,0x00ea685c,0x00da00f0,0x01ac2582,0x02e4a750,0x00662e40,0xff645929,0x0205c570,0xffff8772,0xff48427e,0xffbd2d00,0xff3abb5d,0xff6bbd6c,0xffc29005,0x003be92e,0x0067caed,0x001fca1c,0xffdd4a4e,0xffc77d7d, -0x0006b7aa,0x002bfeca,0x00548800,0x0023fb6d,0x00331c62,0x003cc8a1,0x0048651a,0x000fedde,0x002a1481,0x00914d00,0x009a7a29,0x00a6b5e1,0x007f5c48,0x003fe08b,0x003030bb,0x00721b8d,0x005ad18c,0x00f466a7,0x02b59508,0xfe767580,0xfcbb6bdc,0xfd6cb0ac,0xfdf59cc4,0xff5acb95,0xfede3590, -0xff9f57b0,0x0009b800,0x001d533e,0x002444d4,0x002c7991,0x000e5f2b,0x0011949b,0xffc73bfc,0xffc6ec30,0xffbc1108,0xffc54e5b,0xffcfeda8,0xffac0a3c,0xff92da2a,0xff7e6ea2,0xff693883,0xff5d78f6,0xff7292ca,0xff611dc2,0xff68b119,0xff8e4e7b,0xffc59f97,0x00568bca,0x00ec3018,0x014f5d92, -0x016bb07c,0x015bb32c,0x00ff0ec8,0x0071ce31,0x0099c464,0xfff42008,0xfff3fcb5,0xffc15da7,0xffbaf660,0x010d4b74,0x00249942,0x00709407,0x0066a956,0x00866f27,0x009558f8,0x006ba021,0x0023565b,0x001b9e89,0x002b99dc,0x005641ad,0x00592b66,0x001710aa,0xff9f150f,0xff8f57fc,0xff84ea2e, -0xff8d49aa,0xffdcb7cb,0x0017a73a,0x003bb41c,0x0038523b,0x003e3188,0x0047fe55,0x002e4ad2,0x00032edd,0xffce821b,0xfff0a4ad,0x003c377e,0x00b685a7,0x00f4e62d,0x01346a82,0x016ecab2,0x016033b6,0x017a2ed8,0x0193eb16,0x01883394,0xff8add84,0xff3ad194,0xfefb5146,0xfeddd86a,0xfee08aa0, -0xff4c45ea,0xff9e1a9e,0xffaffb48,0xffa91a81,0xff9b0e42,0xffa06fa7,0xff76cab6,0xff7ad60e,0xff81ffae,0xff9352b7,0xff8b3a8f,0xff632029,0xff91520f,0xffc8fd92,0x0012df26,0x00302672,0x004d6c30,0x004fd308,0x005bbfc9,0x005bd4b1,0x0048d4d2,0x004a7f90,0x00483c9c,0x0066ff29,0x005bc06d, -0x0050dec8,0x0038125d,0x001ee9f3,0x0005d67e,0xffdc1470,0xffc26532,0xffb82878,0xffb3ff55,0xff77953b,0xff3a10e3,0xfee2daf8,0xfee17ed0,0xfed459bc,0xfecac37e,0xfeeffcd8,0xff18e7ba,0xff35dc90,0xff63594b,0xff7bc432,0xffa03673,0xff99e08b,0xff9d65ff,0xff9b4dde,0xffcb9e2f,0xfff74081, -0x00150dae,0x002087fc,0x003e1b44,0x00566324,0x005c00b0,0x006190d1,0x0069a9c4,0x006b4a0e,0x0070447d,0x0077d9dc,0x0069822d,0x005ae71a,0x00440218,0x00158fbd,0xffec8a71,0xffceb4bb,0xffc4dfd0,0xffefffd7,0xfff204df,0xffe7f544,0xffdbbae3,0xffd869e8,0xffd06a7c,0xffc175eb,0xffb2220e, -0xffb65103,0xffbc7087,0xffbdfeaf,0xffc1d416,0xffc2f7c5,0xffc77b64,0xffda0fc6,0xfff1536f,0x0000a017,0x00101a68,0x0020722a,0x0038b1c2,0x00321fa1,0x002ad751,0x0025f349,0x001f79cb,0x001ac0c5,0x00166efe,0x000d0bc2,0x000238d4,0xfff6e4d5,0xffec42c6,0xffe62214,0xffe7d4b7,0xfff0a763, -0xfffa00f2,0xfffbf16c,0xfff6bdb0,0xfff54114,0xfff75359,0xfff6dbfe,0xfff44bd5,0xfff2da36,0xffdd80f5,0xffdc56c5,0xffd8bec6,0xffdea6c6,0xffdf4f0c,0xffe337fd,0xffe57107,0xffe9dc27,0xffebbea0,0xfff0346b,0xfff12376,0xfffdc732,0x00004498,0x000139d6,0x00053d5c,0xffffabcf,0xfffdce15, -0xfffab044,0xfff96d2f,0xfff78dfe,0xfff5bb57,0xfff40557,0xfff39c36,0xfff3afde,0xfff51590,0xfff435fa,0xffef145c,0xffee15c9,0xffec2906,0xffed1a6a,0xfff1338d,0xffec0132,0xfffa13bd,0xfffe35ab,0xfffac032,0x00013d8f,0x0003449e,0xfffebfec,0x000222b1,0xfffd293d,0x00050e2e,0xfff7f740, -0xfff9ed08,0x0004b6d9,0xfffb564b,0xfff906ee,0xfff9d3e9,0xfffe02ae,0xfffc6c52,0xffdc87d9,0xffe967e4,0xffe9808e,0xffed2545,0xffe9a2a6,0xffe9bc64,0xffe85b3d,0xfff0ecc9,0xfffa2cda,0x000ffe15,0x00098cb2,0x00099d9f,0x0002d360,0x000572f9,0xfffd6fec,0xffeb1291,0xffe6ea4b,0xffe76bb8, -0xfff41bc7,0xfffa489e,0x0028f766,0x0016fc89,0x00266217,0x0026aadf,0x001a1a25,0x0016662f,0x001b8b15,0x00348426,0x000fd023,0x000a64ce,0x001defcf,0x00097b98,0x0009cb42,0x00027122,0x000cbb8d,0xfff9afb2,0xffb9510e,0xffc4de06,0xffbfa992,0xffc4931e,0xffb7579b,0xffb7e487,0xffbedbe3, -0xffdb8f35,0x00054b79,0x004b3821,0x0044d473,0x00375568,0x0014606d,0x000fe0a5,0xfff7712b,0xffd1707b,0xffc43475,0xffd4ac91,0x0005b3f3,0x001bc1f3,0x002ab5c3,0x00018ca2,0x00308e3a,0x00405a91,0x00274b3e,0x0036b0a9,0x0022c844,0x004dac5f,0x0021c909,0x001fd827,0x00646fe9,0x002987e9, -0x00275a1f,0x0026d499,0x0018448d,0x000cf145,0xff8fde11,0xffa9b89d,0xffa0cb5b,0xffa98a49,0xff8c8309,0xff8ed228,0xff972d05,0xffc3423a,0x00040bae,0x0082aaa2,0x0065ea00,0x00622d1d,0x0027e739,0x0046a632,0x0010d2aa,0xffaafdbf,0xff93a54a,0xff9a4228,0xfff2e5c2,0x0012333a,0x00a99ee8, -0x005bed97,0x0092cf9d,0x007b491f,0x0027fa75,0x00587135,0x009c7f49,0x00e8a364,0x00dbec26,0x0107c366,0x01257e02,0x006d4bbe,0x005a22d8,0x00894c0b,0x002398aa,0xfff5ec3d,0xff4b3ed5,0xff6bbe45,0xff62ecc1,0xff53ef61,0xff117cc6,0xff106b56,0xff33ace2,0xff97283f,0x003a7d0d,0x013826ce, -0x012a85ea,0x00c66204,0x003a7507,0x003fdf28,0xfff88509,0xff69084c,0xff67fd71,0xffbf7c65,0x0058263c,0x00939604,0xff19a19e,0xff1e5548,0xff90a6dd,0x002bcc51,0x00e3e6bc,0x004f4d78,0xff8a0f22,0xff0fb16b,0xff4a41d3,0xffce75b1,0xffe02081,0x0109a2ea,0x00f928eb,0xffa88e46,0x00371356, -0x0042a3a4,0x004b9872,0x0011bb3b,0xfff86714,0x0009cffb,0x00620348,0x007915b5,0x004e7df3,0x00135bdd,0xff98ae40,0xfee6e252,0xfed463de,0xff95237b,0x014ef8ce,0x00c50b95,0x00a0bea3,0x00c2ff0d,0xff4dbee6,0xfe9a36b0,0xfe97cace,0xfee42418,0x0074e6b2,0x0092dfbc,0xffb73b2c,0xfeccd392, -0xfdffb974,0xff31c1af,0x005fcb45,0x00d0c5aa,0x00a31c24,0x00203bda,0xff5f27bf,0xff8f30db,0xfffb2b72,0x005ba280,0x004114aa,0x001203e4,0x000edae8,0xffab163a,0xff8b5031,0xff689937,0xffa3d32a,0xffb16197,0xffa9d14c,0xff6aaa97,0xffa4e81b,0xfff5d246,0x01485042,0x011e40bc,0xffd17bea, -0xff7e37f0,0xffb7e3ea,0x00c88a30,0x0159b1b0,0x01d081fc,0x01efc8ee,0x00e44f54,0xfdbf831c,0xff5d0e5a,0xff519892,0xff3fe7c2,0xffce828f,0xffd924aa,0xffcafaf4,0xff3c1bb6,0xffb46803,0x0009be54,0x00387d1d,0xffe7e81d,0xffc8c293,0xfff99c68,0xfff3d510,0x001e0916,0x0030cff1,0x00293e78, -0x0034952e,0x002874ae,0x00433070,0x0077233e,0x00a9bf3b,0x00a5c145,0x0084199f,0x002980c9,0xfffda93e,0x003a9254,0x00b718fe,0x012a27a4,0x01101322,0x009c87e7,0xfdf7028c,0xfd209318,0xfe2bf2ec,0xfd8d15d8,0x006fad54,0x001add1a,0x0030f3c0,0x005841e5,0x008f935d,0x0023f2ce,0x0006a2f9, -0x000db2dc,0x000e71e9,0xffcfcc99,0xffbbccd2,0xffe27a24,0xfff545b2,0xffd2c457,0xffdde5a9,0xffbca124,0xff7ce424,0xff5d6673,0xff5af590,0xff6fcf6a,0xff5a59b9,0xff621f0f,0xff7ac876,0xffd86643,0x0056b0e0,0x00e1ba41,0x0113d0a4,0x01202494,0x01244da4,0x006c0de0,0x0011a35b,0x006a2dee, -0x006c706c,0x00847a7c,0x006cd574,0x007cba06,0xff966d8a,0xff2aa385,0xffb741e7,0xfffe4fcf,0x0034cfb1,0x007d9ece,0x007c0e39,0x0041cfd4,0x0044dcb7,0x004ab092,0x0044acce,0x0062a7b4,0x00357b97,0xffd3ebab,0xff949339,0xff67eb9f,0xff70dfed,0xffa67c99,0xffea1731,0x001ec163,0x00262f8f, -0x003765c7,0x0032e2b3,0x00410fba,0x003d500f,0x003e4144,0x00881a07,0x00d99be4,0x014e04cc,0x013ef59e,0x0156fe1a,0x01520320,0x0156314e,0x010cada2,0x0060f2aa,0x00036f56,0x006a4900,0xffe7aac4,0xffc5a404,0xffd775a7,0xfff02c2d,0x0035c40d,0x005e424f,0x004264da,0x004130b2,0x001e6d45, -0xfffb8364,0xffafc4f9,0xff8fa8b5,0xff82c9a2,0xff9be10b,0xff9b2167,0xff8de03e,0xff721f29,0xff880f22,0xffbed849,0xfff5ee33,0x00208c1c,0x002447aa,0x00478b83,0x004af07d,0x0030d05f,0x00177f9a,0x000ac496,0x00252f51,0x002d7746,0x003bc461,0x0048e93b,0x00563bfa,0x007f25be,0x00b586dc, -0x00a39762,0xff7abf4b,0xff682d8b,0xff420571,0xff107672,0xfec77d62,0xfed8b690,0xfeebb7ac,0xfefbf23c,0xff1eb205,0xff40be49,0xff6759b5,0xff7d2db5,0xff8fdf46,0xff9931a7,0xffa1ad3e,0xffa25bb9,0xffa81009,0xffbebf58,0xffd3e79e,0xffd0720d,0xffebe036,0x00162f4d,0x003e83f3,0x00343d40, -0x002ef53a,0x00342744,0x00380292,0x003da140,0x0040c0c7,0x003819ba,0x0029a79c,0x0016d4b5,0xfff87085,0xffd4075f,0xffb28360,0xff8fa195,0xfff9427c,0xffee398d,0xffe85412,0xffd25c86,0xffccd147,0xffc115c0,0xffa75afd,0xff902c4a,0xff942833,0xff9c3eae,0xffa31d12,0xffa51239,0xffab3f4e, -0xffb472d7,0xffcd09b5,0xffdfd54a,0xfff017ef,0xfffd7b91,0x0017a4dd,0x00165eff,0x001a6d8c,0x001aed24,0x001f94ac,0x0024e275,0x002d90bf,0x00321bd3,0x002f451c,0x002bae94,0x0028d5a7,0x00233a80,0x00204aaf,0x0020fe65,0x0018a60b,0x0015a0ce,0x00118ee6,0x0008ce66,0xffc6a88f,0xffc058ce, -0xffc6a5b4,0xffc64d84,0xffc95f8a,0xffacb437,0xffaef99f,0xffaed551,0xffb8c797,0xffbba22a,0xffc011a5,0xffc6dc1f,0xffcd2621,0xffd046d8,0xffcda280,0xffcbf079,0xffe5219b,0xffe11769,0xffe27d09,0xffe06631,0xffe18ae2,0xffe0ea01,0xffdfa71b,0xffe0ebc7,0xffe10489,0xffe2d49b,0xffe1eeb4, -0xffe24d7a,0xffe30f63,0xffe5bf6e,0xffe7b72c,0xffea7aeb,0xffe0bf7a,0xffd7b49f,0xffcf085e,0xffc992d9,0xffbb8695,0x00027a5b,0x00084e93,0xffff858a,0x0004cd11,0x0007aa44,0x000ce172,0x0003253b,0xfffc4f96,0x00084dd1,0xfff34afd,0xfff25014,0xfff3beae,0xfffea48a,0x00018b0b,0xfffb7017, -0x00094b10,0x000b6d08,0xfff17ba5,0xfff63222,0xfff2b71a,0xfff23f34,0xfff23613,0xfff46d56,0xfff44755,0x00022f02,0x000c219a,0x0022e6a6,0x0010827f,0x000cf841,0x0002b744,0x000e6786,0x0008676f,0xfff2df1c,0xfff227c9,0xfff42189,0x00022847,0x000691af,0x003c133b,0x001c79bb,0x00281232, -0x0025d9c8,0x002f1bbd,0x000bb497,0x0007efc2,0x002bf813,0xfff7c5a8,0xffec7402,0xffee7014,0x000532f6,0x0011bb89,0xffff17ef,0x0022234e,0x00169e82,0xffe41694,0xffd660bc,0xffc36800,0xffc1bd48,0xffbedf8f,0xffc9577b,0xffd7dceb,0x0008962a,0x003387d0,0x0072c8cd,0x004757d7,0x002b8717, -0x0003e2fa,0x00198399,0x000c5705,0xffdfa4c1,0xffddcf12,0xffef7d2b,0x0022b220,0x0036a7b2,0x003a58eb,0xfffe5028,0x0022ff74,0x00314e83,0x00532226,0x001db2a9,0xfffaf61a,0x003792db,0xffdcce9c,0xffd0bb41,0xffeef5c0,0x00142c2b,0x0034865d,0x00112e7a,0x003c59a7,0x003d298f,0xffdbb766, -0xffcc98f2,0xffac2f84,0xffa48f55,0xff9af729,0xffac0fe5,0xffb882b6,0x00079e9b,0x00479447,0x00c57bc4,0x00612aec,0x004e319c,0x000ee165,0x00523b8a,0x0030c6d8,0xffb84614,0xffbd4e80,0xffca7b4f,0x001db0fe,0x00337c8e,0x00cd6198,0x005c56ab,0x0082c453,0x007f7b19,0x0079daf2,0x0033f979, -0x004dee00,0x00c9dcb6,0x00908af2,0x00a0e802,0x009623be,0x0062e561,0x006e5cbf,0x00670d34,0x00671f34,0x00486e9c,0xff9b867f,0xff86f854,0xff522030,0xff2c3d6f,0xff12efd3,0xff344ddd,0xff707f36,0x0014cf6c,0x00c44757,0x01a474bc,0x01131f28,0x00841157,0xfff62453,0x00495d34,0x0029146d, -0xff880301,0xffb7a87f,0x000af40c,0x009e919c,0x00d17140,0xfee0df42,0xff18154b,0xff2e37e9,0xffac14ee,0x0098e38b,0x007286cb,0xffe6caac,0xff1dfcb8,0xff34a77a,0xffbe88d7,0xfff56ec7,0x00ee7e7c,0x00db966a,0xffd3b340,0x000dd00d,0x001c9473,0x0093e437,0x0071aece,0x00685360,0x0088c670, -0x00dc5367,0x00be99dc,0x006bc0ed,0xffe47756,0xff4b7385,0xfedb865c,0xff0ff3f9,0x00055467,0x018629d2,0x00d9888e,0x00a00d3f,0x00c6fd89,0xff5a04c1,0xfed1bf58,0xfec1411c,0xfeca56b0,0x0121b60c,0x00e47de3,0x006ba299,0xff5a264d,0xfe396758,0xfea50fae,0xff9062e3,0x0052b09d,0x009e4219, -0x004704d1,0xff7de0b5,0xff6612ea,0xffbe1ab6,0x003ce89f,0x000c37c4,0xffe8d008,0xffd81280,0xffcedbe0,0xffc4524d,0xff79ab9e,0xffbef99a,0xffb3e8ad,0xffa8b329,0xff88fd46,0xffe8a130,0x00a0ed3c,0x015b4312,0x00e09ea5,0xff8c9146,0xff84c4fe,0xfff5bdb0,0x00b2e43b,0x01a502f0,0x01a64192, -0x00af5826,0x00e6b7d9,0xfce7e27c,0xfc92fecc,0xff06a690,0xffcaf244,0xff8a3aa0,0x0066991a,0x00302fad,0xff28a190,0xff7ce578,0xffd005eb,0x002f566b,0x00145046,0xffe6dac3,0xffd2b0e8,0xffcf2923,0xfffd199b,0x003dbf8b,0x0012c8cd,0x00015241,0xffdce73d,0x004797aa,0x007f6861,0x007f79ee, -0x007d4596,0x0042d7cf,0xffef035d,0xffde15df,0x002d61b5,0x005bcce6,0x01eb297c,0x014f3d5e,0xfe769768,0xfe528418,0xfe56cc32,0xfebdbad0,0xfddbb5c4,0x018dcb36,0x01a2134e,0x00f6d899,0x00a2be18,0x00b90211,0x00240e83,0xfff6e9c1,0x001baec2,0x000d5ccc,0xffef5a35,0xffc47e32,0xffedb86b, -0xffff9c78,0xffeaa06e,0xffff024b,0xffd5f9ae,0xff8a34b9,0xff667146,0xff66b94f,0xff68fa05,0xff6f3f54,0xff8217c5,0xff9acb4f,0x000e06b9,0x0068257b,0x00ddf5bc,0x00d3288d,0x00b53a06,0x0072c607,0xffbb052b,0xffa8024b,0xfff709a5,0x004ef9fd,0x0072cf0d,0x00acf4d3,0x010696f2,0xfe95b078, -0xfebdff08,0xff492e34,0xffcaa4e5,0x0018f01d,0x00455779,0x00573350,0x00585ac6,0x005e3342,0x005aa23e,0x00308358,0x0037d880,0x00243355,0x000fc066,0xffa15ec0,0xff63bcbc,0xff64af23,0xff6f2568,0xff9e62e3,0xffc72793,0xfff1e9ca,0x001bb659,0x002010a9,0x004d056e,0x0075b1bc,0x00b73878, -0x00ec3ec6,0x01248ea6,0x0172916e,0x014c0a82,0x0140db26,0x0105710e,0x0115d110,0x008c83bb,0xff70d877,0xfedd8c9a,0x010f2496,0x00ac02c0,0x009471a3,0x00a18608,0x00b93e4d,0x00d3f83c,0x00d3a59c,0x00ad2e20,0x00a8c927,0x007f88f9,0x0048b1e9,0xfffa1259,0xffb85eba,0xff843c15,0xff8f6ba9, -0xff99f0e0,0xffad6261,0xff893fe8,0xff8aa5cc,0xff98af82,0xffcf9c5d,0xfff5d46e,0x0003a076,0x0021f0cf,0x00209d58,0xfffc86f4,0xffe8769f,0xffe4d22c,0xfff0e64a,0x000eaae4,0x002fa1f4,0x004f43a4,0x0078ba56,0x00bde468,0x011d79d4,0x0127be14,0xff75e187,0xff4c79e0,0xff3ce0af,0xff22d0e0, -0xfef5cc7e,0xff0d6131,0xff2f531e,0xff490ebf,0xff55ac6c,0xff65ca82,0xff79643c,0xff7f51d1,0xff865623,0xff7c33b3,0xff8b49e0,0xff865b98,0xff865547,0xff901166,0xff9adac7,0xff96a146,0xffb71d61,0xffdbe11e,0x0003b52b,0xfffa4f14,0xfff8b395,0x00012714,0xfff9c66c,0xfff2afe4,0xffe8a5de, -0xfff1e81a,0xfff572b6,0x0000a075,0x0004f769,0xfffc11f9,0xffea3dbe,0xffa33cda,0xffd4759e,0xffbe2061,0xffbce38b,0xffa31b74,0xff9b2f11,0xff8e9d98,0xff747143,0xff5eb8bf,0xff65337f,0xff704525,0xff7b066a,0xff7e9881,0xff874ba1,0xff92566d,0xffa533f8,0xffb1b9c4,0xffbfae3e,0xffcb13cd, -0xffe067da,0xffd799c3,0xffe2bbb2,0xffeb5c1b,0xfff77ae8,0x000719ff,0x0018b7eb,0x0028a8ba,0x002aa3ab,0x002ff21a,0x00338c64,0x00332bb3,0x003086a3,0x002c4def,0x000e7048,0xfff8a58f,0xffecf3f0,0xffe40bf9,0xff9d7271,0xff923c95,0xff999bb4,0xff98ed3b,0xff9b5256,0xff84c262,0xff853e6c, -0xff826918,0xff8dc5ac,0xff912640,0xff95ccfc,0xff9d7c0b,0xffa410aa,0xffa8712b,0xffa6a3c8,0xffa704db,0xffbb5de8,0xffb7aac7,0xffba73dc,0xffb7b5ec,0xffbe6fd5,0xffc18af0,0xffc434af,0xffc86e32,0xffcb65f3,0xffd0c264,0xffcf38df,0xffcedcf9,0xffcf0fcd,0xffcff7f1,0xffd1f924,0xffd95e0b, -0xffcd2a46,0xffc29b7f,0xffb3c19f,0xffa6ff43,0xff985baa,0x000f0ecb,0x0013c72f,0x0008427c,0x00096e3f,0x000c4685,0x001b9ceb,0x0006fea5,0xfffe7740,0x000c5ea6,0xfff155ce,0xffedf9d2,0xffeb00a6,0x00013fd7,0x00087783,0x0001acee,0x001371cd,0x0018ce68,0x000a2cd1,0x0005147a,0x0000098e, -0xfffe4c0a,0x000105fa,0x00056cb5,0x0008ea20,0x001721ef,0x001f97bc,0x00304098,0x001dc8eb,0x00190572,0x000b0b93,0x001d6428,0x00188028,0xfffec07a,0x000419fd,0x00079425,0x001699a5,0x00156f03,0x004175c1,0x001cdf75,0x001a9612,0x001abe04,0x0042b9eb,0xfffea328,0xfff29f2f,0x001ff5ad, -0xffddd7b9,0xffcf72b2,0xffd102e8,0xfffd286f,0x0012e180,0x00047942,0x002ea8ae,0x002d815a,0x00162d71,0xffeeceea,0xffd11d0d,0xffcf412a,0xffd668bb,0xffeb1603,0x0004fc57,0x0039731a,0x005c82f5,0x00822e09,0x004e1afd,0x002e15d4,0x0003d337,0x002e5f9c,0x0029900a,0xfff5047b,0x00046857, -0x0015f35a,0x00459c19,0x004877d2,0x003fc229,0xfffbc00c,0x0006e20c,0x0015c449,0x0074c05e,0xfffba913,0xffd17335,0x001d9c6a,0xff9c23c8,0xff8a5364,0xff93edfd,0xfff00912,0x0028db1f,0x00056b04,0x004c607a,0x0055b3d2,0x002e04f8,0xfff198ad,0xffc24485,0xffb30772,0xffc00173,0xffdc809c, -0xfff728e4,0x004f6087,0x0082e48c,0x00d5a157,0x006c1a4d,0x0057c2dd,0x0012a4ed,0x006e7fe6,0x005797c1,0xffcd03bf,0xfff714cb,0x000b05c9,0x0054d6eb,0x004e9d6e,0x00c1498d,0x00455315,0x0041800c,0x0054507e,0x00bc0dd2,0xfff89c19,0xffe910ad,0x007a254c,0x00176184,0x000f87ad,0xffe46d24, -0x0046c41a,0x00754ee0,0x004f18ac,0x008add81,0x00894e27,0x0022c546,0xffbb01b0,0xff566a69,0xff2b0316,0xff450d89,0xff88288e,0xffe478e5,0x009e3770,0x0132fc6a,0x01aa6e46,0x00f419b1,0x00649768,0xffe30ccd,0x0069d67d,0x00659342,0xffbbd2a1,0x001d78c2,0x0068e73b,0x00e8084f,0x00e84c67, -0xfed89130,0xff3be217,0xfefd3162,0xff55a1a2,0x004d9196,0x00650034,0x001e6aa2,0xff715731,0xff74ddbe,0xffdcc036,0x0004178e,0x009186ab,0x007d750a,0x001e94ab,0xffdff7ec,0xffe73214,0x00913a8d,0x00b38c08,0x00e73940,0x0123e51c,0x012f712c,0x00db5d50,0x006aacb3,0xff9bdf81,0xff072a19, -0xfefadb8a,0xff83d5ba,0x00960055,0x01ac9b84,0x01090464,0x009ff47b,0x008a2025,0xff778c29,0xff25eea2,0xff259849,0xfee725cc,0x010a4044,0x010e180e,0x012593c2,0x002dd237,0xfe96eb18,0xfe7f6612,0xff1bcae2,0xffef2cef,0x005bfd35,0x0030c04b,0xffb169a8,0xff746733,0xffa05dfc,0x001eadbf, -0xffdd792c,0xffd3219b,0xffbbbf5f,0x000d6fbb,0x001a33da,0xffd5990f,0xffe5697a,0xffc2fe8d,0xffd42058,0xffc89b96,0x00456832,0x01480834,0x00fe86c6,0x0031e8d0,0xff09eaba,0xff7abe5c,0x00371ef5,0x00d1da24,0x01d37b2e,0x0169be5e,0xffad6a65,0x00570129,0xfd787864,0xfb1dcf08,0xfe248448, -0xff742f90,0xff32804d,0x0086de6d,0x0062bb9e,0xff851bc5,0xff89bdfe,0xffbb3a06,0x001cdf6d,0x00377f18,0x0006dddd,0xffb2ede8,0xffc5b928,0xffef86b9,0x003cfc93,0x00187333,0xfffd4fcf,0xffe3938d,0x00392477,0x0054e06d,0x00467e59,0x0034f1b9,0xfff3e33a,0xffc2ed3d,0xffbbefd5,0x00120bc0, -0x0026acef,0x01da66e4,0x0111d0c0,0xfddf5a0c,0xfe93e4fe,0xfeedf71c,0xff3077c1,0xfefaf9be,0x01fdbb98,0x02bdd8ac,0x01dea63e,0x01115436,0x0089a636,0x0039379b,0x001f258c,0x00263053,0x0012dea7,0x000f254c,0xffdde1f8,0xffe4d93c,0xfff56e7f,0x000d8431,0x000c9e4f,0xffee7c0b,0xffbc761a, -0xff8fff1d,0xff7dcaab,0xff7e1c4a,0xff97d296,0xffb84c59,0xffea7e47,0x003b3e5d,0x007e133a,0x00c3fb2a,0x009c9342,0x004657f0,0xffa3e038,0xff640bfe,0xff86bbdd,0xffbc906b,0xfff3839f,0xffff57cc,0x0054d85c,0x00e7666b,0xfe84702e,0xfee8214a,0xff2792e3,0xffaec741,0x00035019,0x0004b5f1, -0x00164201,0x00581357,0x004cf314,0x003d1d3b,0x00164f18,0x00059e1d,0x0000a84f,0x001901cd,0xffb04062,0xff77fd81,0xff53f33f,0xff54f9b1,0xff6629b1,0xff738436,0xffadf04f,0xffe72df9,0x000af3f5,0x00458a10,0x008b0771,0x00eded98,0x00fd358e,0x011e9666,0x01406738,0x012af678,0x00febaba, -0x00a5455c,0x008d2ba5,0x00149a98,0xff4687dd,0xfeb8f088,0x011c53c4,0x00f7a49d,0x00fb94f2,0x00f4c801,0x00edc85a,0x00e9e216,0x00d1e837,0x00bbaea6,0x00bd5228,0x00a99101,0x007dd884,0x00435dd0,0xfff5d3c7,0xffa3b584,0xff95488d,0xff9dbc25,0xffbb671e,0xffb4e8da,0xffb3f9c8,0xffafedc1, -0xffcc68eb,0xffdb6d68,0xffe54db4,0xffff3be2,0xfffab219,0xffde82d7,0xffe5ce53,0xfff778bf,0x0009998a,0x00288432,0x0057f812,0x0085f01f,0x00a360db,0x00c7f3a2,0x01019e5e,0x0113ccbc,0xff9a4eaf,0xff6edb74,0xff6a5580,0xff653a8c,0xff4ef519,0xff709798,0xff9bdb14,0xffbc7159,0xfface131, -0xffa6fac7,0xff990d86,0xff928072,0xff817f05,0xff710e94,0xff78963a,0xff747f90,0xff6e50db,0xff78cec8,0xff84db65,0xff90220f,0xffa4bf1f,0xffb8559e,0xffce3503,0xffd2fae9,0xffde24d5,0xffee2019,0xffe6928f,0xffde4f0c,0xffd5cb0e,0xffda6062,0xffdea434,0xfff27d59,0x00013787,0x000ae8d0, -0x0007f156,0xffc8d08b,0xff94de15,0xff7f189d,0xff7e3826,0xff6e8667,0xff647d67,0xff5969b3,0xff45dac5,0xff36e1d8,0xff4229f3,0xff50fba5,0xff5e0ccd,0xff694b5d,0xff75320b,0xff805dca,0xff88b8df,0xff907c61,0xff995bc7,0xffa13a6e,0xffab766f,0xffa5f0d3,0xffaf2367,0xffb8adce,0xffc36628, -0xffd25971,0xffe0a03d,0xfff0f22c,0xfff05da5,0xfff517ce,0xfff86008,0xfffc02d7,0xfffca607,0xfff9455d,0xffd994e2,0xffbc984d,0xffaadcf7,0xffa0baeb,0xff8cc911,0xff81a962,0xff859ca6,0xff83187c,0xff825064,0xff7b4529,0xff783780,0xff6f8128,0xff7a7e99,0xff7df4d0,0xff833cc1,0xff88ac39, -0xff8ed103,0xff94f361,0xff96b6c4,0xff988f7e,0xff9e99eb,0xff9e2ca7,0xffa0b6f7,0xff9f777e,0xffa79cfd,0xffacdf87,0xffb1e0c4,0xffb6957d,0xffba79b1,0xffc084d3,0xffbee96d,0xffbe3078,0xffbcf6ea,0xffbadf0d,0xffb96dd4,0xffbda3ac,0xffb4981e,0xffae69b2,0xffa33c75,0xff978587,0xff96a268, -0x0019e264,0x001d9b13,0x0011909c,0x000f586b,0x00110c1f,0x0027d5bf,0x000bf147,0x00047d65,0x0012cc10,0xfff4b593,0xffefdec8,0xffefc0d3,0x00042ee5,0x000c91d3,0x00093e39,0x001a0684,0x00203c0a,0x001dfb5a,0x00118250,0x000c9bbf,0x0009bfc8,0x000eaa38,0x0014f4ce,0x001e7fc5,0x00282a77, -0x002da21e,0x00356248,0x00282f55,0x0023fdf8,0x0017d20f,0x00275030,0x0022ec3f,0x000bf945,0x00144413,0x0018dbfd,0x0027e2f1,0x00220c3f,0x00403292,0x001d4200,0x000df974,0x00108740,0x004b7d64,0xfff7361f,0xffe57c6c,0x00141f0b,0xffcb60a8,0xffbd9de4,0xffcbee26,0xfff12c12,0x000a7c00, -0x0008a8a3,0x00327a3b,0x003a06de,0x00370e16,0x00074d78,0xffe8f22b,0xffe6620e,0xfff3661e,0x00102385,0x0037a992,0x00604540,0x0074898b,0x00799114,0x004c207d,0x002f38a2,0x00105abb,0x0039d744,0x003a348e,0x000dfbb6,0x00252b42,0x0034c3a1,0x005d0490,0x0050339c,0x00461026,0xffffcb7e, -0xfff1f47a,0xfffc6683,0x007c5515,0xffe2bdf9,0xffbb1b70,0x000bd4e0,0xff734ec7,0xff5d6889,0xff7471f1,0xffc615c1,0x00057698,0xfff86d33,0x0046dc3d,0x0053d49c,0x0058c964,0x000b89b0,0xffdc042f,0xffcbb85d,0xffe5bee9,0x000be1ba,0x0042b26c,0x0086faf6,0x00a6fa77,0x00c1426d,0x0072f653, -0x0062028a,0x00305a4e,0x00753143,0x00615990,0xffee8292,0x0026c22b,0x0040e0ea,0x00800d53,0x006515d3,0x00a4f8d2,0x00318d35,0x0000c6f9,0x001a8cc5,0x00d11cac,0xffbeff13,0xff8e5feb,0x00242b86,0xff9ae31a,0xff838b96,0xff6b46d4,0x000cb7ab,0x00523cdc,0x0042a879,0x008e0635,0x00a74c26, -0x008f0ff3,0xfff35342,0xff821eb1,0xff5b4d7b,0xff925f6e,0xfff17ed4,0x00788af7,0x010dc886,0x01680c3c,0x0163c29e,0x00b99102,0x0042c9ac,0xfffd1c0d,0x00713cfd,0x007d3f55,0x00063d7d,0x00721e2c,0x00acf16a,0x0112bca2,0x00e49ea2,0xff144f16,0xff6ce5f5,0xff02b50a,0xff39dbbb,0x00070016, -0x005d1441,0x005d37ed,0xfffee5b9,0xffd0e588,0xfff27318,0xfff16208,0x001b7aa4,0x001f8357,0x005cb7bc,0xffacd279,0xff9bcb33,0x003b6590,0x009cda7a,0x00fc4fb7,0x0136104c,0x00fe6532,0x00986e06,0x001c9707,0xff61d0ce,0xff141bd4,0xff4cbb11,0x006a4b85,0x01685dd2,0x01a7b10e,0x012c05a0, -0x00820076,0xfff88264,0xff707d24,0xff5e8c1a,0xff81dc5b,0xff3a3f21,0x007a5242,0x00fe4827,0x01ac5d16,0x00f09441,0xff29b1ab,0xfe85df2c,0xfec8aa94,0xff9802da,0x00090b66,0x000caf4f,0xffd71de5,0xffa7f7ed,0xff9ff91c,0xfff1dffe,0xffce7585,0xffeb7f59,0xffd0d3e1,0x0041ff9c,0x005bb978, -0x003f6f66,0xfffc98ee,0xffdda373,0x001aa0c7,0x00298048,0x009d4026,0x0153d85e,0x00617a95,0xff74306f,0xfe832a0e,0xff70ac93,0x00651f45,0x00e794c5,0x01919978,0x00e97da0,0xfee06832,0xffa850f8,0xfed51420,0xfb499ed0,0xfccf6fa8,0xfe27eea4,0xff6ab76a,0x001c7855,0x001c98a6,0x000ab7f9, -0xffbb98c3,0xffc5af44,0x000d1914,0x00354be1,0x00138094,0xffa62728,0xffc8cfad,0xffdcdece,0x001beca9,0x002c6ade,0x00294a7d,0x0028c132,0x003b5042,0x0027f15a,0x0005446f,0xffd7a12a,0xff9ecef3,0xff9a6104,0xff96f7cc,0x0009410e,0x008911fa,0x00f6f664,0x00247e79,0xfe67ee16,0xff25bee0, -0xff8d88c8,0xff835fef,0x0056c029,0x0157c596,0x02902fe4,0x026a6bb4,0x018d9244,0x007fd526,0x006c855f,0x00701bc8,0x0036e238,0x0008c082,0x000ab4b1,0xfff0dc7c,0xffde11c2,0xffef4004,0x001a42f3,0x0010b830,0x000e1aad,0x00053f51,0xffd686c8,0xffb0cacb,0xffb3dac4,0xffca0ba3,0xfff21bc9, -0x003ecdc1,0x004faf6f,0x007af183,0x00886eba,0x006071e7,0xfff195e7,0xff4aa011,0xff5ac49a,0xff912076,0xffb27ef0,0xffa0a1ef,0xffa2ba7e,0x00011445,0x005c7f5c,0xff2582c5,0xff535840,0xff391f21,0xff940dde,0xffdcece0,0xffd89c1c,0xffe70a8d,0x00469769,0x00227f74,0xffff8c59,0xffe88eeb, -0xffe3d256,0xffe74343,0xfffb97bf,0xffc7a435,0xff9be7d0,0xff4c629e,0xff4d2970,0xff488f3d,0xff4c822e,0xff720ed0,0xffaaafa3,0xffefcc05,0x002b33d7,0x007730bb,0x00cf32f4,0x00e03924,0x00ff1875,0x010289a4,0x00f302f9,0x00a8d2d4,0x0049d701,0x0021b609,0xffdd3a43,0xff75a386,0xff3fb4d9, -0x00ae5a57,0x00c44a15,0x00d16076,0x00bba53a,0x00b2d6c4,0x00a0c78c,0x00859b91,0x007aecf0,0x0082a34e,0x008db5f8,0x0081a180,0x00718f4a,0x0033e615,0xffddf1f7,0xffb404b5,0xffa9834c,0xffb6f930,0xffca1f1f,0xffd2a2d3,0xffd77690,0xffd8f616,0xffd71365,0xffd2f24b,0xfffb3288,0x00061986, -0x0000114d,0x002832f5,0x0041ce20,0x0057ecb0,0x007711d0,0x00afb5c1,0x00e5f025,0x00d73f31,0x00c3d7c3,0x00bb13ef,0x00ab5ed1,0xffebffb4,0xffcb67e4,0xffcea10c,0xffe5693c,0xffe8a42e,0x000771c0,0x002df5ad,0x004d7e63,0x00257b63,0x000ba5a4,0xffdda48f,0xffc9a373,0xffa1f067,0xff8daee4, -0xff8a3acf,0xff83996f,0xff752fac,0xff7ff7f0,0xff8a686d,0xff989521,0xff9fcdd3,0xffa68bf7,0xffa97d56,0xffc12672,0xffdab14a,0xfff5ff24,0xfff969cd,0xffffe7ac,0x0008fb43,0xfffaf1ef,0xffeec178,0xfff256fa,0xfff646c9,0x0001fe41,0x000be727,0xfffc8b5a,0xff6a952f,0xff61227b,0xff58629a, -0xff5c2ff2,0xff4f061b,0xff4a8e3c,0xff42437e,0xff38e8b5,0xff477e5a,0xff54ca6f,0xff60b5cd,0xff70a340,0xff7c227b,0xff845195,0xff86c7d3,0xff8bb715,0xff8ee654,0xff9337b6,0xff953d04,0xff93acf3,0xff999a04,0xffa02ff9,0xffa69b6b,0xffae3c4b,0xffb2b590,0xffbb4d25,0xffb15698,0xffab9e3c, -0xffa751fa,0xffa8ad56,0xffabfc06,0xffaa32b0,0xff9e58bc,0xff8c71c7,0xff7be612,0xff7070da,0xff906890,0xff8b2185,0xff899e51,0xff86cbb8,0xff8556bc,0xff8b7211,0xff88ae2d,0xff7e823d,0xff856062,0xff87c3da,0xff8c4a44,0xff8dfa6f,0xff928db1,0xff987653,0xff9911d2,0xff9957f4,0xff99eb4f, -0xff993f04,0xff9963e6,0xff97d5e5,0xff9ebc34,0xffa3eb90,0xffa90839,0xffacd6f2,0xffb09d06,0xffb62edb,0xffb37126,0xffb1e4b3,0xffae7201,0xffa9f2fe,0xffa4483a,0xffa0dc13,0xff9d13e3,0xff9c1ae2,0xff9a6830,0xff96bdef,0xff9c7eec,0x001f5983,0x00230536,0x0018b9a8,0x00169e0b,0x0016948d, -0x002a97e6,0x000fcfc1,0x000a9756,0x0015b3a5,0xfffa8ac6,0xfff5803e,0xfffaa171,0x0006586f,0x000d363c,0x000c7896,0x001be7f4,0x0021989f,0x0025b142,0x0019c5aa,0x0015aaf4,0x000f6e2a,0x001620c8,0x001d7dba,0x002bf6c2,0x0030ec3e,0x00332435,0x0031306d,0x002b04d7,0x0028607f,0x0022f1bb, -0x0027ad62,0x0023d47c,0x0015cb45,0x001f260b,0x00248fd7,0x003336e1,0x0028ec16,0x003ac023,0x001ea49a,0x000de9c5,0x000d79d2,0x003cf827,0xfff4835e,0xffe0bf22,0x00026b64,0xffc2bd55,0xffb9e45e,0xffd4f219,0xffe70a63,0xfffda846,0x0002e7fc,0x002e3bdf,0x003ba983,0x003e7890,0x001d9507, -0x0005f0d9,0xfffcb8a2,0x000c53c4,0x002c22d3,0x005c2c27,0x0076c9d4,0x007c8aef,0x00637041,0x00473831,0x00311727,0x00252e81,0x0036e10c,0x0037d0e5,0x00200660,0x003b3c61,0x004af870,0x006a5be1,0x004fcba7,0x004a6894,0x000c4e4e,0xfff7c38a,0xfff7a1c7,0x005fe878,0xffd9997d,0xffb86366, -0xfff32827,0xff62d199,0xff4a78eb,0xff7ff3c8,0xffa4a35f,0xffddfda4,0xffdd685c,0x0034fcfa,0x00425221,0x0051644b,0x001d9aff,0xfff6f3a1,0xffdf3619,0xfffeb51c,0x0029eb55,0x0078e76b,0x00a3fa43,0x00b02635,0x0093d6aa,0x0072876c,0x006521ef,0x0055fd6f,0x005d7e19,0x004a4d82,0x000f4c98, -0x004a9300,0x006a4fb3,0x009febc0,0x007215e5,0x007eb05d,0x00249657,0xffe76498,0xfff50675,0x009eaf07,0xff98fc8a,0xff53fe53,0xffd57dc7,0xff38bb89,0xff1de7e9,0xff4f265c,0xffc35e47,0x000ebbca,0x002971d4,0x00765810,0x009f4122,0x00afb63b,0x002f075b,0xffd5b432,0xffa95e40,0xffe5231b, -0x004f2b56,0x00f135ff,0x01508d9a,0x016d3bfe,0x0106ac6e,0x00964465,0x00401742,0x003cd870,0x005d9a43,0x00683715,0x0042b5cd,0x00ab850a,0x00dff1ac,0x012aa1ea,0x00d0402d,0xffaf02fd,0xffbb4852,0xff64fc6d,0xff794991,0xffee9781,0x0070453f,0x00a5276d,0x00993d2d,0x001c2de6,0xffe542b5, -0xffce0ae4,0xffc5e169,0xffe742ea,0x007c7dd2,0xff86ace1,0xff553b41,0xffc196ed,0x0018e45c,0x0073dc02,0x009883a7,0x004f75e4,0x0006bee3,0xff95ca72,0xff369310,0xff389fd7,0xff6c9a5a,0x01051ab4,0x01cb8aaa,0x014324cc,0x00ff4df2,0x003f1fc6,0xff6a227d,0xff6f3c9a,0xff8a7215,0xffa3b58d, -0xffc38bb7,0xfff1b2bb,0x009d3b60,0x01b1b4a0,0x0141bc56,0xffbaaa6d,0xfe9a3478,0xfe836886,0xff3fbb88,0xffcc2134,0x00032a05,0xffeabca2,0xffdaeaee,0xffafbfb5,0xffc182f3,0xffe0fac2,0x001d15e7,0x00034d94,0x006024a0,0x0078a6c5,0x008c255a,0x0020cf87,0x0016c23e,0x0064b860,0x00a90c38, -0x00e22b8c,0x00d02a09,0xffc36f12,0xfeeeba2c,0xfe4ef2c0,0xff8b2432,0x0086b6f7,0x00c7e84f,0x00e0998b,0x00228528,0xfe7bccea,0xff409408,0xff678cc0,0xfc2af704,0xfc2653ac,0xfd523214,0x0013da85,0xffa2f12d,0xff9c8f60,0x003bc7be,0xffe49dc8,0xffe21d20,0x0003e1e5,0x00195bc5,0x000aa8e1, -0xffadce00,0xffc83402,0xffc0c416,0xffe4c949,0x0022bf1e,0x003eec7f,0x00448b90,0x00297cfc,0xfff575e7,0xffb2221b,0xff7d933d,0xff5fa5e3,0xff7c0b51,0xff8a5858,0x002c25f3,0x01393484,0x00023c20,0xff165466,0xfee07de6,0xffb909c6,0x00461326,0x0021b869,0x00a69e35,0x004e96e6,0x0123f2c6, -0x023205f4,0x01d50bd6,0x00d7e091,0x008d8dba,0x009a707e,0x00669951,0x0007d5d1,0xffff0a1c,0xfffc7000,0xffe5bf9c,0xfff03e29,0x000283c1,0x000ded75,0x002a88a1,0x00438f76,0x001cfbba,0xfff47852,0xffede30d,0xfffe0126,0x00282a49,0x007b1d89,0x00644d39,0x0062ec07,0x00414248,0x002dabfc, -0xffcfe53e,0xff6a3f43,0xff9a25ed,0xffca5b6a,0xffd01c8e,0xff974ab3,0xffb5ecd5,0x005c6978,0x000496e5,0xfff04a5b,0xffcdebeb,0xff6eb817,0xff7fb055,0xffadb25a,0xffd330ec,0xffe4cab0,0x002ee702,0xfffede1b,0xffd464cd,0xffc2c4d9,0xffd160c2,0xffdc6319,0xffe1fcf9,0xffe37a88,0xffc03fcc, -0xff6149ba,0xff55aad9,0xff461117,0xff52fd57,0xff5c4b2e,0xff83a061,0xffce10ef,0x00155b64,0x00601d9f,0x009a06aa,0x00bc9374,0x00dd0bc9,0x00d84b29,0x00b748b1,0x0063e5e8,0x0022f661,0xfff38298,0xffd1d1fb,0xffb8f8df,0xffdcd96b,0x00059a36,0x0033e859,0x0054c7e5,0x0050ded8,0x00521ce8, -0x0041967c,0x00323895,0x002d6971,0x0036edf6,0x004eb20c,0x0057c506,0x006e5052,0x005171ab,0x0013cd86,0xffddbb0a,0xffbfcaba,0xffb00941,0xffbfe799,0xffca8aa4,0xffdb318a,0xffe172e5,0xffe9332e,0xffe1f96d,0x00184b65,0x003bde12,0x0055f913,0x0090f16d,0x00ad3736,0x00c4b3e4,0x00db297a, -0x0104f856,0x012a9426,0x00f7aaf7,0x00b7a238,0x006cbee8,0x0028373c,0x00698ef0,0x00552dcf,0x005164ae,0x006a6e1a,0x00794e99,0x008d8912,0x00a32c76,0x00bbdb78,0x008fbde4,0x00710f56,0x003f580a,0x001a5902,0xffe0b11c,0xffc3d81f,0xffb559af,0xffa9f690,0xff90cd07,0xff9ad268,0xffa1c81a, -0xffabb593,0xffab6078,0xffaa60e8,0xffa520fa,0xffbf00c1,0xffd71694,0xffeedeff,0x00088940,0x00280b35,0x004bd18b,0x003b7813,0x002b8a68,0x0024f634,0x00206a4f,0x002a5082,0x00412840,0x005b46b7,0xff7f7cbd,0xff844664,0xff76941b,0xff8cd6f5,0xff8077de,0xff81ed75,0xff83a25c,0xff7e9b11, -0xff81bfeb,0xff80198f,0xff7f1474,0xff8593bb,0xff874d52,0xff82e88e,0xff87dc36,0xff8d7dd5,0xff90679c,0xff945672,0xff921bdd,0xff9602cf,0xff9bede4,0xffa1ba81,0xffa6aafc,0xffaa043c,0xffab0c7f,0xffae1f07,0xffa11c3a,0xff93d8c1,0xff8b0cfc,0xff88012a,0xff8bc8cb,0xff8ba4af,0xff93b7f5, -0xff92c7a1,0xff8a9aa8,0xff808d46,0xffa55b5c,0xffa70569,0xff9f4fa6,0xff9bcf07,0xff992674,0xffa98dba,0xffa7246c,0xffa006ca,0xff9d8a48,0xff9c1273,0xff9b7f75,0xff97a3d9,0xff978acf,0xff970f61,0xff992603,0xff9aae2b,0xff99f108,0xff9a9fd4,0xff9ba7ad,0xff9d78cd,0xffa10eee,0xffa47d19, -0xffa801c2,0xffaa6dc4,0xffad0719,0xffb14009,0xffae58bc,0xffad6278,0xffaa2a7c,0xffa77fc3,0xffa295df,0xff9cc515,0xff9ca4ae,0xff9dc6c9,0xffa1e492,0xffa5d149,0xff9eb1f3,0x001aa326,0x001f1acf,0x0018dd85,0x001796b2,0x00165431,0x001fbc51,0x000e8d42,0x000b1ce3,0x000c755a,0xfffc2be0, -0xfff75a07,0xfffc91bf,0x0002f566,0x00088460,0x0006d9e7,0x0016075c,0x001a065f,0x001f9e68,0x00184e93,0x001566f2,0x000e395c,0x0014c164,0x001b7873,0x0029b8b4,0x002cc77c,0x002ccf2b,0x0023ccc9,0x00241c21,0x00232a54,0x002585ed,0x001d03e3,0x00193fce,0x00130f09,0x001fb6fd,0x0025958d, -0x0031a661,0x0024a65c,0x0029d7e4,0x0019f8d6,0x000eb691,0x00071d8e,0x00152809,0xfff2df20,0xffe11069,0xffe2e038,0xffc1ce6b,0xffc083d9,0xffd89214,0xffe1dd81,0xfff00729,0xffef8cdb,0x0021492a,0x0030df9a,0x002e3c0e,0x0026ccf6,0x001a982c,0x000f29cc,0x001e6070,0x0039b174,0x0063e2cb, -0x0075ad3e,0x00713de1,0x00466caa,0x003cd616,0x002f5366,0x0036c543,0x002732b4,0x00240fb1,0x001bc2f7,0x00401618,0x0051d6f8,0x00647d6c,0x00408f33,0x00407d70,0x001d25b3,0x00074ccc,0xfffdc836,0x0026ee4d,0xffe176d1,0xffc673a5,0xffc3664d,0xff688b76,0xff4ae1ac,0xff82ac70,0xff8e073f, -0xffc37671,0xffb69d42,0x002028f4,0x0028dfb9,0x002733e5,0x00210f82,0x00080ebd,0xfff21915,0x000ed357,0x0035a440,0x0082c55e,0x009f3a04,0x009e01e1,0x00615d7a,0x0068307a,0x005eab28,0x0071315d,0x0032d760,0x001f69ce,0x00124e85,0x005cfd3a,0x007e9250,0x00a287cc,0x0068fb80,0x0040ba6a, -0x0017027b,0xffe11d8a,0xffd970e3,0x002d5fab,0xff93507e,0xff471f85,0xff7e3f8e,0xfefc4088,0xfee92946,0xff64d368,0xff8aa932,0xffc5f093,0xffedce73,0x0054835f,0x007cbc72,0x0087b15a,0x0056cf19,0x002adb1d,0x00051dd1,0x0037a5ea,0x0090ca48,0x0121f7e0,0x0158920a,0x0147a156,0x00b4e411, -0x00853b46,0x0054b522,0x0083e592,0x003d375f,0x0034c4a5,0x0042832a,0x00baee64,0x00f32205,0x011924c4,0x009c8ee5,0x007fad4a,0x0033145a,0x001562ef,0x000f1357,0x0015bbb4,0x009de207,0x00ea9a4b,0x010e3708,0x005d1214,0xffec2cb6,0xffd1cad0,0xffb80027,0xffd7c342,0x007f6a7b,0xff850558, -0xff3d0ed2,0xff54e980,0xff7b2a1b,0xffa35d77,0xff9d14c4,0xff80687d,0xff647476,0xff02d963,0xff0afe5e,0xff4617d4,0xff74532a,0x01097d74,0x017e4faa,0x00a5e9ee,0x008be445,0xfffb0bb5,0xff3b8816,0xff9ea3dc,0xffc8b8a0,0xffb25e21,0x006080e1,0xff94e94d,0x0023242c,0x012a9b74,0x01133e4a, -0x002f2387,0xfeb577c2,0xfe4eaea8,0xff09ec39,0xffb38ea5,0x000826a0,0xfff96424,0xfffa1932,0xffc25e00,0xffa4564c,0xfffa0471,0x004105c8,0x003142b8,0x005d5fd5,0x007a8aaf,0x00be6f7f,0x00644edd,0x006e29fa,0x00a57f3d,0x010b269a,0x00e636d8,0x001ab802,0xff3cc00f,0xfead19c2,0xfe913686, -0xffe1798f,0x00a67882,0x00908a6f,0x00183caf,0xff5eaf38,0xfe8df2f4,0xff1ee871,0xff4149b2,0xfd8503f8,0xfcc9380c,0xfd90cc50,0x0031fda3,0xff8646f6,0xff717e4e,0x0002b1c4,0xffef9f5f,0xfff9502e,0xfffd92c4,0x00081968,0x00035c82,0xffca1dfb,0xffbeac97,0xffa30699,0xffb5aed4,0xfff4b929, -0x00167e26,0xfffd0af6,0xffec61b6,0xffc01c93,0xff6acc0a,0xff491b1c,0xff4aef7d,0xff6f3e1a,0xffbcc90b,0x00639bdb,0x017284a0,0xff4a2b1a,0xfe718d1e,0xff2756c4,0x0000fd4c,0x00c5ffcd,0x010b596a,0x002ccaf6,0xffebe6f4,0xffca824e,0x014c58e6,0x01903cc6,0x011621ec,0x006417b8,0x005f9c02, -0x0073cf97,0x0017c532,0x00048b60,0x000bb6a8,0xfff79784,0xffedf1d3,0xffe3b684,0x00073423,0x003884e1,0x0061bf91,0x004a7b93,0x0030af7a,0x00211103,0x003a7fa7,0x0059cef0,0x008ecaef,0x007c1853,0x004b2f90,0xfffb8547,0xfffe37d7,0xffc6981e,0xffb97aa3,0xffcc4212,0xffee4723,0xffdaf4c4, -0x001cbacf,0x00647bc8,0x00e508ec,0x00368df7,0x0070e0e8,0x0030e1bc,0xffc4c83a,0xff91dc79,0xffa6369a,0xffe69286,0xfffb3bec,0x000597ee,0xffef7f99,0xffd7a75d,0xffcbc728,0xffd1b73c,0xffdf6bbc,0xffe46529,0xfffd42e1,0xffe4087e,0xff9ec776,0xff7658a0,0xff5c4323,0xff6ab302,0xff6e1c71, -0xff858c87,0xffb8c44a,0x0005cb9d,0x004aa8b8,0x00751c91,0x0097f2e3,0x00a7baac,0x009d8a6b,0x00640c3c,0x0019f03c,0xffe95029,0xffc62cb4,0xffb5c0ce,0xffc88414,0x0036eea4,0xff706a1c,0xff9aba53,0xffc8a52f,0xffe8a153,0x00035bcc,0x0000a669,0x00010212,0xffff018d,0x000796df,0x00131c5d, -0x0019a277,0x0040fce7,0x0046ae64,0x00354444,0x000589c7,0xffe05b99,0xffb814a7,0xffae21db,0xffaed704,0xffbed9d2,0xffdaf897,0xfffba3ab,0x0006e949,0x004a4609,0x007cbd6c,0x009f1f36,0x00e011ef,0x010090e4,0x0117ccc6,0x010fed78,0x010aeda8,0x00fdf457,0x00c81bb0,0x007ee90e,0x00100917, -0xffad025d,0x00bf986b,0x00b7c377,0x00afd5bc,0x00b44edb,0x00becfde,0x00c2b461,0x00c25be3,0x00c9f631,0x00b10f81,0x00a1a9c2,0x0087f599,0x0063dfaa,0x002ed195,0x00145940,0xfff2e175,0xffd9c842,0xffb0aff4,0xffb9e3ac,0xffbd14ea,0xffbfcf79,0xffbc1eff,0xffb6402c,0xffaf0f19,0xffc09f05, -0xffd023b9,0xffdd77ce,0x0007dfcf,0x0032fde0,0x00640c71,0x0063f28f,0x006566f2,0x0067dd79,0x0064f757,0x006e535e,0x008bb338,0x00ab87df,0xffc3f5fa,0xffcb9fba,0xffba7543,0xffd37777,0xffca60bc,0xffcbeb63,0xffcfbab3,0xffcef20a,0xffc12129,0xffb03071,0xffa04d29,0xff991d4c,0xff9065fa, -0xff816b5d,0xff898304,0xff92cf8d,0xff98dd7e,0xff9d4dc6,0xff9ad6f3,0xffa1f45e,0xffa89179,0xffaf2b75,0xffb44d65,0xffb656cc,0xffb7d929,0xffb82a38,0xffb2ae86,0xffab3c60,0xffa8a1db,0xffa79469,0xffad12e1,0xffb3162e,0xffc00bf5,0xffc8449c,0xffc89c2d,0xffc2933f,0xffc8aad6,0xffcf4aa4, -0xffc2d2a3,0xffbec71e,0xffba5f25,0xffcca04c,0xffc912ee,0xffc7153e,0xffbce11c,0xffb73c98,0xffb115b0,0xffa8a271,0xffa29fac,0xff9a209b,0xffa31bc0,0xffa6b07d,0xffa26c75,0xffa693bb,0xffa995af,0xffad4171,0xffad8c48,0xffae9e47,0xffafe06c,0xffb0cc2f,0xffb1d7bc,0xffb35f1b,0xffb4454f, -0xffb61cf0,0xffb6925d,0xffb95c83,0xffba4380,0xffb9c64f,0xffba845e,0xffbb7370,0xffbf4e5d,0xffc588fd,0xffa9c4c4,0x0013fc4e,0x0018b938,0x00177986,0x0014ab14,0x00126c8e,0x000fdc11,0x000d32b7,0x00099d97,0xfffc8c88,0xfffacffd,0xfff5d960,0xfff3a03f,0xfffbdf5f,0x0001399d,0xfffd2ded, -0x000d43ba,0x001032c7,0x00135605,0x00121356,0x00116a1d,0x000dc92e,0x00123f7a,0x0017678a,0x0021b563,0x00255346,0x002497b1,0x0018b929,0x001ceaad,0x001d1565,0x00258c27,0x00131fdb,0x000f08cf,0x000b7f7f,0x001cc80a,0x002281e7,0x00299cd1,0x001cf7be,0x00181558,0x0014d2f0,0x0009be65, -0xfffdb7b2,0xffee2203,0xfff4759f,0xffe72f36,0xffc5dbd3,0xffcf51c5,0xffd4c161,0xffd6256d,0xffe856c5,0xffecde18,0xffdcfc62,0x000f0082,0x001de507,0x0018e3a2,0x00232c35,0x00229b6e,0x001faae0,0x002c0b14,0x003ff28f,0x005b06b7,0x00699810,0x005f8a02,0x002fd57a,0x0031059a,0x002ca040, -0x00452092,0x001af74d,0x0011642a,0x000c6331,0x003bf1e2,0x004ef4f0,0x00525e17,0x002da758,0x00314b94,0x002db6ab,0x000f7bf7,0x000225b1,0xfff161a2,0xfff2b9a2,0xffdc93bc,0xff8e63a1,0xff7e0da5,0xff5b10ed,0xff67db75,0xff87667c,0xffb6c6ec,0xff96f7bd,0x00098f3e,0x000aa739,0xfffcbe25, -0x0016a7e6,0x000f603d,0x0009e88d,0x001e00ff,0x003b801b,0x00727dea,0x008e17b0,0x0086d857,0x0041eaa0,0x005a71be,0x0055dbb2,0x00840613,0x00154184,0x00022da4,0x00034d6b,0x0063223e,0x00820d8f,0x008b1545,0x00542445,0x0007e5f4,0x000ada2d,0xffd779c6,0xffc0bcce,0xffb618ed,0xffa825c7, -0xff649fbf,0xff2c19c9,0xff019a4b,0xfefa8586,0xff751b42,0xff7e2f15,0xffa0d526,0xffa4baa3,0x002d2aff,0x0046f38c,0x003d3a2b,0x005edcbf,0x005cf2ca,0x00528320,0x0078f5d4,0x00b8171a,0x011843e8,0x013ee880,0x01131900,0x007b1e38,0x006d4328,0x0066a25f,0x00c067d6,0x002e6cfc,0x0009c9eb, -0x001ac9c4,0x00ad2d2d,0x00e99dab,0x00dfc3f0,0x005f221e,0x0122ab26,0x00b599c7,0x00b33133,0x009b6472,0x006444c0,0x00cae20b,0x010d2a9a,0x0126df6c,0x0091da66,0x001ac414,0x00058184,0xffe59610,0xffebbfe0,0x006483f6,0xffb3eaab,0xff647510,0xff152c6b,0xff13a95c,0xff07dbc0,0xfef1e870, -0xfef556e2,0xfeed2b30,0xfea34a4c,0xfef8bd3a,0xff593c7b,0xffabe8e4,0x00c9fad6,0x00e95211,0x001bf9c7,0x0014d794,0xffd9ad4c,0xff824430,0xffe9e2b0,0x000d0c23,0xffdf8592,0x00d95269,0xff70ce24,0xffc420ff,0x006deba7,0x009e5c61,0x0079047c,0xfef4a348,0xfe71e9e0,0xff1625af,0xffa414a1, -0xfff9239d,0xfff7c155,0x00058c72,0xffd3005c,0xffa764fa,0x00047fdf,0x004388e6,0x0041239d,0x004403f8,0x006a0377,0x00c707d9,0x00ac8d5d,0x00c6d88c,0x00d1e4ca,0x010eeac4,0x009addc8,0xff9cc040,0xfeeb738a,0xfeabdeca,0xff17043d,0x004aef85,0x00b69970,0x005cbe97,0xff898e49,0xfeec4c42, -0xfed9a81e,0xff2ebce4,0xfeec5796,0xfed2e00a,0xfe210f9e,0xfe65cadc,0xff91b335,0xffc4ba86,0xffc43704,0xffb54097,0xfffc6007,0x000af54c,0xfffce577,0x0003241a,0x000d97cd,0xffedc87e,0xffc28537,0xff98fecb,0xffa18c6c,0xffc8ed7e,0xffd675dd,0xffa23327,0xffaf713d,0xff97b1ff,0xff4d7c50, -0xff4c5c2d,0xff63b38f,0xff775881,0x0029d8c2,0x00a067ba,0x010bfcc6,0xfef1f25a,0xfe81f6c4,0xffcaaf1d,0x00585984,0x01022232,0x01ade608,0xffa956de,0x0081baa5,0xffccca71,0x0030ac8a,0x00881e3a,0x00ab9bdc,0x000c2385,0xfffe5785,0x003b70da,0x001570c4,0xfffe09c5,0x0005b241,0x0003c7a7, -0xfff14747,0xffdde666,0x0002a99c,0x0035988e,0x0066eec3,0x005d3646,0x0056977e,0x004e7bc5,0x006d13cd,0x00764b38,0x00799398,0x0075a11d,0x003ccc66,0xffdd5552,0xffdfa36e,0xffc03c34,0xffecf30d,0xffd82ee3,0x0007d93f,0x0020d99f,0x00da403b,0x011b6b04,0x00f14e80,0x00c2c94a,0x00900bfa, -0x005e48d4,0x001f6634,0xffdc7fff,0xffe5b964,0x0001bd71,0x0005177f,0xffe3382b,0xfff35189,0xfff448ab,0xfff57b5e,0xffe8914b,0xffe94239,0xfff2b415,0x000dc394,0x00048781,0xffeb634b,0xffb335c3,0xff8ea78c,0xff8dd32f,0xff9a4ca2,0xffa9bab1,0xffc5631e,0x0000095b,0x00330c6b,0x00571d26, -0x005ca03f,0x0053b877,0x00447da1,0xfffcb849,0xffc4d526,0xff9f196d,0xff8bc2b6,0xff9cea07,0xffd690cf,0x005fab13,0xff411e86,0xff43fa50,0xff7259c8,0xffa1c5aa,0xffc70329,0xffd845f5,0xffe87260,0xffecc5d9,0xfff291b3,0xffee30d7,0xffec3f06,0x00062800,0x00213848,0x0038e21b,0x001fab70, -0x000076e9,0xffcfc561,0xffab1ca7,0xff9d0aac,0xffa640b6,0xffc7e805,0xfff46358,0x001c1f72,0x005fef06,0x009545c7,0x00b93f76,0x00f12bcd,0x010d20e4,0x0118bd72,0x00f145f9,0x00ba5a1b,0x0072f88b,0x003d66a9,0x000651b9,0xffb8ba6d,0xff702ce8,0x00a29607,0x00a9d02e,0x00aac29d,0x009eaba3, -0x00a3161b,0x009d08bf,0x008e2688,0x008664a2,0x008bf743,0x00963179,0x009e2e28,0x00896bdd,0x0068b4cc,0x0058c7cd,0x0024b18f,0xffff7acd,0xffcf7ea8,0xffd7cdb9,0xffd8fef6,0xffd7678d,0xffd25b0b,0xffc8bb6b,0xffbe7f5c,0xffc6f2b7,0xffcf2c4e,0xffd33c0b,0xffff5463,0x0027b718,0x0056e90e, -0x0066ec4e,0x007b87a2,0x008d37f9,0x0088177d,0x0086ecf6,0x00912d95,0x009c7880,0x0027eff1,0x00304ebd,0x0017a075,0x00234a0b,0x00171679,0x00124afe,0x0013a391,0x000ec2c9,0xfffe49fb,0xffe5b2c4,0xffcf3356,0xffc1caa9,0xffb55386,0xffa64550,0xffa814c6,0xffaefbe6,0xffb04442,0xffae40f6, -0xffa6b525,0xffa8cbbd,0xffaf03b2,0xffb5d1c6,0xffbb886d,0xffbd8a11,0xffbf63a6,0xffbe4b74,0xffc70a58,0xffcce987,0xffd5e295,0xffdca397,0xffe69da6,0xfff589f1,0x00014699,0x000fa515,0x001a7c5c,0x00209ecc,0xffec503b,0xfff73005,0xffea541f,0xffe73338,0xffe0f9a8,0xffef92a2,0xffe98fde, -0xffe557a1,0xffd92c8f,0xffd328a2,0xffcc1e22,0xffc3bf33,0xffbbbe71,0xffb1bc2a,0xffbd4afd,0xffbe79f7,0xffb536dd,0xffb92e4c,0xffba173a,0xffba5a0c,0xffb98d82,0xffb8c5de,0xffb84ed3,0xffb8091f,0xffb8518e,0xffb746db,0xffbd1951,0xffc1faaf,0xffc6af32,0xffce58dc,0xffd4c9c0,0xffda3426, -0xffdce232,0xffdf22a4,0xffe22d2a,0xffe78ca1,0xffb79563,0x000b96f8,0x00106b06,0x0012e9f3,0x000d805d,0x000b1304,0x00039d38,0x0009b63c,0x0005617c,0xffed8104,0xfff82c27,0xfff3ab9b,0xffe82e80,0xfff50e94,0xfffa620c,0xfff4c2e6,0x0002134e,0x0004a5e9,0x0009b1f8,0x00096547,0x000a395b, -0x000b3fcd,0x000db2be,0x00118562,0x0018ae13,0x001bb329,0x001a8258,0x000ee6a2,0x00137a30,0x00142121,0x0021c2da,0x000964be,0x0004feb3,0x0001cc5c,0x00156ff1,0x001aa1ac,0x001c1d7b,0x00131dfa,0x00094982,0x000efaf8,0xffff253b,0xfff2a6a7,0xffd94fec,0xfff6e837,0xffefbe17,0xffba9227, -0xffe3f090,0xffeb6810,0xffd4bb54,0xfff2f0c4,0xffefd504,0xffd5b8bb,0xfff95877,0x000476c6,0x00099744,0x001559dc,0x001dccd3,0x0026985d,0x002f9e49,0x003d8e63,0x004c684a,0x00547b81,0x0046027c,0x0019a349,0x001a840c,0x001ee8a4,0x00492e9d,0x000ef0d3,0x000123e0,0xfffd2607,0x00309a48, -0x0041265c,0x0036ac90,0x001a4064,0x00228677,0x0034dee5,0x000b1187,0xfffd9e4c,0xffd3ddc6,0x000134d1,0xffedc756,0xff6699e2,0xff959da6,0xff766f30,0xff4338b5,0xff8e408c,0xffb229f4,0xff89637b,0xffebf23a,0xffe92570,0xffea0554,0x00027e57,0x000be568,0x001c643f,0x00264539,0x003d19d9, -0x00602153,0x00766121,0x006b8f31,0x0029962f,0x003f7ca2,0x003f39ee,0x0088c777,0xffffaaec,0xffee3e88,0xfff15e74,0x005907e9,0x00729eec,0x00618de1,0x003cf4c1,0xffe78dcc,0x00033890,0xffc9617d,0xffac6895,0xff6d4b4a,0xffc39296,0xff948af0,0xff1070e0,0xff4a506f,0xff4a4526,0xff96820a, -0xffa63d3a,0xffadc323,0xff82a19e,0xfff96f1a,0x0001584d,0xffff65e7,0x00468603,0x005f9a26,0x007f069f,0x0097ca3f,0x00c3c6ab,0x00f72c87,0x010aeb36,0x00ca39f3,0x003a5402,0x002d974f,0x0053cbf7,0x00dd0227,0x00211067,0xffe7b261,0xfff72220,0x0091e3e5,0x00c2ffbf,0x008bf8bd,0x0028329c, -0x0166e946,0x010ae3ec,0x00fb7f15,0x00e098cd,0x00aca287,0x00e113de,0x00f0febb,0x00d6f83e,0x008fdbf3,0x00387b5e,0x00291581,0x0012ce8a,0x000d160d,0x0035f8ba,0x0002a7b2,0xffbfb73f,0xff0ceb6c,0xfef7e0e8,0xfed1195a,0xfec0b5cc,0xfebd645a,0xfeb8b012,0xfe9cfb6a,0xff0f3b46,0xff91a74b, -0x0035c5e0,0x0098ee3f,0x00653af6,0xffbecd0c,0xffc3d51a,0xffd0d64f,0xffe7f0f4,0x00095984,0x00342ca8,0x00432b77,0x011c6278,0xff7c6c32,0xffa28579,0xffdad704,0x0028abdb,0x0088f2ea,0xff51cc78,0xfee74f76,0xff589148,0xffbeed75,0xffeafef6,0xffeb31a4,0xfffb49a8,0xffee4a13,0xffbf9b69, -0xfffb1867,0x002b443a,0x00332e47,0x0020c56c,0x00454247,0x00a32fa6,0x00c89bf2,0x00ea34cc,0x00d29a02,0x00b3a9ce,0x001e00e9,0xff572a50,0xfebac84e,0xfecb2f7c,0xffa30e83,0x008cfab5,0x00a97c6d,0x00489d6e,0xff4c69e2,0xfec752c6,0xff16f0c2,0xff49f624,0xfef3c4b6,0xffcf0ffe,0xff1af7ef, -0xff0db39a,0xfef24a94,0x0008fe2d,0x001e6393,0xffbedb5a,0x00222585,0x000a71da,0x000b0261,0x0002245f,0x000d2d0b,0x000c1727,0xffdc8bae,0xffaff81f,0xffa3d0a2,0xffbd0aa9,0xffb94842,0xff8390c3,0xff930211,0xff846bc1,0xff606fed,0xff7303b2,0xff991f2e,0xffad1afc,0x00aa0b18,0x00cecdc0, -0x005d78b8,0xfed11d40,0xfeccf5f8,0x0056662e,0x0093fb58,0x0111897e,0x01ed571a,0xff97b096,0x00fd12b1,0x00fc5ddc,0xff5f2630,0xff24353c,0xffa049a7,0xffc6c8bd,0xffe2b523,0xfffcc4bd,0x00018481,0xfff1ffda,0xfffa1581,0xfffcedd6,0xfffae0ae,0xffee1c7a,0x00000181,0x002343da,0x005f14ca, -0x0062975f,0x00698179,0x006f19b7,0x00809a1b,0x006fee98,0x004ae63c,0x003cd444,0x001cd391,0xffdde644,0xffc8da4c,0xffb32b18,0xffef4cc8,0xffd83d53,0x0038006b,0x00c82af6,0x012d1216,0x00f741eb,0x0023eea2,0x00a633c5,0x007c6291,0x006b2497,0x007c8475,0x005fc0b6,0x004ad695,0x00132115, -0xfff967ac,0xffe1426c,0x00039316,0x0009c0c1,0x000c2a77,0x0004bd8d,0xfffcc549,0xfffdb801,0x001462f6,0x001e9b6b,0x002bff14,0xfffdb0ae,0xffd69c50,0xffc4b51d,0xffcf01ea,0xffda9982,0xfff0e68d,0x00067ff5,0x001a92b8,0x0030eb55,0x00177f71,0xfffc2156,0xffe094a1,0xff9c69e2,0xff71ccd0, -0xff589c82,0xff65e375,0xffb00ce2,0xfffdcbd9,0x0078efb7,0xff7a9433,0xff550958,0xff6491fc,0xff7f19f0,0xffa14cf6,0xffbcb75a,0xffd55b8a,0xffdbfa2c,0xffe82c6d,0xffe40375,0xffdfd3f6,0xffe31d93,0xfff8f84f,0x001cbc57,0x002345b9,0x0011dcde,0xffe7b37c,0xffb7fb6b,0xffa0c785,0xffa56d97, -0xffb89023,0xffd95b77,0x00076bdc,0x004b4a1d,0x007ea4a7,0x009ecb67,0x00bfcd05,0x00c99aa2,0x00c12411,0x0094570d,0x004d17bf,0xffea6463,0xffb6f65a,0xff92d7ab,0xff7f77d1,0xff7a1957,0x0025807a,0x00366d73,0x0048f177,0x0042a375,0x00492cc1,0x0042c0d5,0x0033c245,0x0025a77f,0x00433d3e, -0x005e5017,0x007d3e4c,0x007ac6fc,0x00787250,0x007a340d,0x0042b51f,0x001bf875,0xfff65ad6,0xfff45032,0xffed42ca,0xffde9d98,0xffdfcce4,0xffdbc1e2,0xffd40f80,0xffd9d3fe,0xffe055d7,0xffe53de1,0x000912e3,0x00290775,0x004ddfda,0x0056e2d6,0x00655bfe,0x00726220,0x0060f71e,0x004cfeaa, -0x0034cca4,0x002e8fed,0x0068e934,0x00716952,0x00628c46,0x005cbb25,0x00539b4d,0x004bf4d1,0x004db91c,0x004abb57,0x003d7359,0x00281559,0x0014d080,0x000716e8,0xfff94543,0xffee7c9a,0xffe3a10d,0xffe287a7,0xffd99ea8,0xffcdc754,0xffbc58bf,0xffb9d6fa,0xffbf46f3,0xffc2b912,0xffc7966a, -0xffc8a00d,0xffc99d80,0xffc70929,0xffd8722d,0xffe5dd09,0xfff59825,0x00031af2,0x00124687,0x00269667,0x002f0f46,0x003e4aac,0x004cfd3b,0x005cc74d,0x00036960,0x000c609d,0x0003bad7,0x00030e30,0xfffe1198,0x00088abf,0x000161fd,0xfffb212d,0xfff1c484,0xffed3fb2,0xffe79907,0xffe27b4f, -0xffdc7523,0xffd61654,0xffde424a,0xffdd90cb,0xffca27ce,0xffcdefd3,0xffcc7e50,0xffcd0bfa,0xffcb4ce8,0xffca186a,0xffc8feb6,0xffc84d71,0xffc88717,0xffc64b2c,0xffce6eea,0xffd4801b,0xffdabc72,0xffe38a4d,0xffeb0c73,0xfff268c5,0xfff62212,0xfff9e2aa,0xfffd3a10,0xffffaef3,0xffceb6a9, -0x000876c6,0x000d761e,0x0011aba8,0x000a63c9,0x00075f66,0xfffee370,0x0009138b,0x0004689d,0xffe97031,0xfff9b2bd,0xfff619ba,0xffe6991e,0xfff41297,0xfff8387d,0xfff490ce,0xfffad7a5,0xfffd9231,0x0006ef2b,0x00053645,0x0006c895,0x000a5ea8,0x000beb48,0x000f2c65,0x00162b7b,0x00158583, -0x00140aab,0x000c3f16,0x000da926,0x000e6a6f,0x0020b3e9,0x00058eb9,0x00018330,0xffff8a70,0x0012bd48,0x00176a05,0x0014153a,0x000f69f1,0x0005a662,0x000f39d5,0xfffab494,0xfff109ec,0xffdab80a,0xfffcf83e,0xfffc102e,0xffc3b6cc,0xfff7fea3,0xfffdc9e3,0xffd7265e,0xfff8076e,0xfff23950, -0xffde9240,0xffea5fa0,0xfff16274,0x000744cc,0x00089b54,0x0014e168,0x00243a78,0x002bc6a4,0x00369d2f,0x0041dd61,0x003be21e,0x002a7dac,0x000a8f7e,0x0004a800,0x001038a2,0x004968b2,0x00088992,0xfffacf56,0xfffbee74,0x002cbec1,0x0037e78c,0x0021e539,0x0010f12e,0x001ef852,0x00379fb5, -0x00080f0f,0xfffae392,0xffcfc1c6,0x000b7bba,0xfff9099c,0xff6689db,0xffb1f129,0xff9b89f3,0xff443b7e,0xffa113ed,0xffb37dec,0xff9bf3b0,0xffcb988c,0xffca5d6a,0xfff356e1,0xfff19b0a,0x00054209,0x002209d6,0x00267c33,0x003bb1f1,0x0059a554,0x005b351d,0x004e4188,0x001dd094,0x00256e37, -0x0026bba5,0x0087af39,0xfff56d12,0xffe93fc3,0xfff345e4,0x0054b7ed,0x006967ea,0x0044497b,0x0033edb4,0xffe59d5e,0x0003b86b,0xffca0bf3,0xffa981a4,0xff5fd7c9,0xffdd9984,0xffc6ef84,0xff4884a4,0xffa6f7a8,0xffb03922,0xffd208c2,0xffdffc04,0xffd8ade4,0xff9c4bf2,0xffd0499b,0xffc33a0e, -0xffe213ac,0x001c9269,0x004283e1,0x007f10d9,0x00906c47,0x00b52067,0x00d42959,0x00bf43ba,0x006f9931,0xfffbd702,0xffe3ddb7,0x002da11e,0x00dcaa63,0x0016622e,0xffd95b1c,0xfff8b8d5,0x008b28e8,0x00a41da7,0x004553ef,0x00094bfb,0x016e6f92,0x01220576,0x00f756aa,0x00e3347f,0x00d5c2d7, -0x00d13655,0x00a47f11,0x005f224e,0x00557550,0x001cfa4c,0x001fd56d,0x000f097b,0x0019bfa5,0x000f0b42,0x003814b2,0x00218f6a,0xff4514b6,0xff1eeb7b,0xfef47862,0xfee8d348,0xfece65c4,0xfecc66ca,0xfeef8f0a,0xff60056a,0x0006c698,0x00f17747,0x00c6de98,0x004b961d,0xffa24d04,0xffb21878, -0xffdf6df9,0x00312c17,0x00032566,0x004a32fe,0x00d1d5d4,0x014d62ba,0xffa38577,0xffbce5bb,0xffa038fe,0xffe0102e,0x006b1d5a,0xffa2fa42,0xff688444,0xffbd9f73,0xffe85dd6,0xffec85d3,0xfff2fa35,0xfff31bc7,0xfffab1dc,0xffe5a509,0xffeba54a,0x000af240,0x00216953,0xfffd8e2f,0x00152072, -0x00620a08,0x00a9ce11,0x00d118f4,0x00b5d7d1,0x004bdba7,0xffb8350e,0xff2ea885,0xfeb30e8a,0xff1583a9,0x0038bb2e,0x00a6d19d,0x008644f4,0x004a9589,0xff36e825,0xfecfb8f8,0xff4754e7,0xff67e18a,0xff90189e,0x00af92d2,0xffc3ea1e,0xff7e5f0b,0xff03b2bb,0x001d547b,0x002a7287,0xfffebacb, -0x001906fc,0x0004e076,0x000aa2a2,0x0006adc0,0x000439fb,0x000e3487,0xfffe2efb,0xffde15c9,0xffc16536,0xffdcded2,0xffda8cfd,0xffb3da39,0xffa73290,0xff8f8086,0xff917ac0,0xffa25d4b,0xffe2b20b,0x002e27ab,0x0115b998,0x00e09e78,0xffc9d106,0xfef953d2,0xff45c9b4,0x00cf08ea,0x00e777de, -0x01395e58,0x01c26b98,0xfffe42c9,0x0080e6b3,0x01bcdfc0,0xff1fcfca,0xfe3392f0,0xfe9ba75e,0xffafacf4,0xfff17df5,0xffeead6a,0xfffbf541,0xfff5e5e1,0xfff9a4bc,0xfff83b23,0xfffab92a,0xfffa1e0e,0xfff9f425,0x00085bcf,0x004431b2,0x0062c901,0x007090a7,0x0080def6,0x00798924,0x00555789, -0x001fce2d,0xfffac42e,0xffeb0cf3,0xffdc97fd,0xffc25c2d,0xffbcda0c,0xffe05cce,0x0018c91f,0x009f52be,0x018107ee,0x00ca978c,0xfff85583,0xff16d76a,0xffc06d9a,0x00874d2e,0x00b901c8,0x0107a1b6,0x010f9336,0x00a211d0,0x002870c3,0xfff4a87b,0xfff7d8f2,0x000bc876,0x00094ddb,0x000be3f9, -0x000c499f,0x000980a6,0x0004192c,0x0015a6f6,0x002dd4e3,0x0055905c,0x004c403c,0x002de8d7,0x00155c5f,0x000f29d2,0x0010e3e6,0x0021ccfc,0x0021af32,0x001dc667,0x001ff1a0,0xffec1277,0xffca3647,0xffb121ef,0xff77eea4,0xff535e9e,0xff4e0c99,0xff859dc1,0xfff529a2,0x003e2277,0x00857af1, -0xffdee535,0xffaedc7d,0xff94e8a1,0xff8ba862,0xff9bb422,0xffb35c71,0xffcdf565,0xffd5816e,0xffea3245,0xffeb06d0,0xffe5c107,0xffdf960c,0xffe6449d,0xfffbc905,0x00153556,0x0016ce39,0x0000f458,0xffd26a3d,0xffba886e,0xffbcdd0d,0xffbfe73e,0xffcbd945,0xffe950a2,0x00228abb,0x004baaeb, -0x0062fd53,0x006f51e7,0x006d09c3,0x005bb7de,0x00497b23,0x00195594,0xffc12d18,0xff97d021,0xff801e0a,0xff996626,0xffbdad54,0xffc072b6,0xffce67ab,0xffea34c3,0xfff626ad,0x00039d85,0x0001442d,0xfffa1cf6,0xfff06bf2,0x0010f7bd,0x002b7a99,0x004a6b9a,0x005095a6,0x005fd98c,0x006d3d13, -0x004dc851,0x00336826,0x0021a948,0x0014cc9d,0x0003351e,0xffebc4b6,0xfffaa162,0x0000f057,0x0003e611,0x000e54c3,0x001a1518,0x0027c3d5,0x003adedb,0x004b6398,0x005c62c7,0x004f8b05,0x004593c2,0x003fc778,0x0023f1be,0x00033f49,0xffd4151b,0xffcc2535,0x0079fdd1,0x007f2604,0x0078c215, -0x006cd430,0x006757ad,0x00611929,0x0064299a,0x00653731,0x006147ab,0x0059608e,0x0052c91e,0x004e81f3,0x0047c479,0x0044e19a,0x002cdf53,0x0024291b,0x0015a5ec,0x0003d504,0xffe910cd,0xffea69f5,0xffef7112,0xffef181d,0xfff227b4,0xfff292c2,0xfff2b567,0xfff0ac0f,0x0001bdab,0x000f5aa2, -0x001f6483,0x002f55f3,0x004070ee,0x0052264e,0x00540b0f,0x005c58aa,0x0063e981,0x00714d5e,0x0022e9b5,0x0026a03f,0x00205c58,0x001ee8e1,0x0018094b,0x00249db9,0x001b10f8,0x00118cd9,0x000eac6d,0x000d056a,0x000a6f1f,0x00095279,0x000718fc,0x0007d4b6,0x000f8da0,0x0011f140,0xfff237a7, -0xfffafc9a,0xfffaf8d7,0x00002d84,0xfffd2456,0xfffd4760,0xfffcd589,0xfffc9180,0xfffd1afe,0xfffb1bcc,0x00021c66,0x0006e6e0,0x000b4778,0x00111f1e,0x0015b13e,0x001bd38b,0x001db45d,0x0020d131,0x0023dd14,0x0022b331,0x0006e6ca,0xfffd05d6,0x0003fa38,0x00074311,0x000287cf,0x0000aef1, -0xfffc024c,0x000012f8,0xffffef9e,0xffed1254,0xfffb928b,0xfffa5964,0xffef16ee,0xfff6d9bf,0xfff75c58,0xfff90039,0xfff22612,0xfff21496,0x00066286,0xfffea1f6,0xfffe32bc,0xfffde315,0x00010ec0,0x000375cf,0x000ad8e0,0x00050989,0x00036cc4,0x0000863d,0xfffff6cf,0x0000e3e7,0x001390bf, -0xfff9fdf3,0xfff6f3b8,0xfff74eef,0x000807c4,0x000c361a,0x0005bad4,0x00052e9d,0xfffeca6c,0x000829fe,0xfff98821,0xffeecdb3,0xffded475,0xfffbe9f2,0xfffce2e6,0xffcf194b,0xfffb61cd,0xfffaac47,0xffcfe76b,0xffe362cd,0xffe2f7f2,0xffe9362a,0xffda8a2e,0xffe03de7,0x00050cb3,0xfffa2ae5, -0x00082a47,0x000eda2a,0x00176463,0x001ee05b,0x0028c91e,0x00117907,0xffffe330,0xfff20f88,0xffed6e2b,0xfffd9311,0x0035ab8c,0xfff8dbab,0xffee0b8a,0xfff631e7,0x001f812c,0x00253289,0x0008289f,0x0003db59,0x00190127,0x002f7bae,0x0005ccc9,0xfff57ac5,0xffd1e388,0x00092938,0xfffb7bfb, -0xff909aae,0xffcb51f2,0xffc13df6,0xff81ca58,0xffb8ce0f,0xffb70a50,0xffc18166,0xffb3b457,0xffaf2261,0x0000947f,0xffe642fc,0xfffa93b8,0x000d5e19,0x0014dd93,0x0026ffb9,0x0044faa1,0x0027ecf8,0x001a8e99,0x0004e9cb,0x00088f78,0x000b417d,0x006842de,0xffe49f12,0xffdf6fcb,0xfff5b0fd, -0x0046255b,0x00565983,0x00274c23,0x002a3df2,0xffec3502,0x0004dc40,0xffd963e2,0xffb4e077,0xff7dbe1c,0xfff0a85b,0xffeaa36b,0xffa6e700,0xffe9f7a6,0xfff1e24b,0xfffda3b9,0xfffbb217,0xfff81aee,0xffd65d8e,0xffc905ec,0xffa84068,0xffe13dd5,0xfff6bf80,0x001c5427,0x004f15ff,0x00630954, -0x00816e4e,0x0095e8f2,0x004a8927,0xfff75b62,0xffb9bc55,0xffb3a318,0x000da5d7,0x00ad0af1,0xfffecff7,0xffcdc186,0x0001fbc7,0x007af674,0x007b097b,0x00068088,0xfff4f3ce,0x014f9b9c,0x00f5deeb,0x00ce006f,0x00bd9e78,0x00b8d0fb,0x008f8fba,0x00476778,0x0015c608,0x00171964,0x0002ac1d, -0x00091a7d,0x00004d65,0x000e5584,0x000068bb,0x00364481,0x004b9736,0xffaadf1b,0xff629042,0xff354f0f,0xff2a9fe4,0xff0129a6,0xff083fe3,0xff5c5ba5,0xffc9ac7f,0x007a4b26,0x015a5d9e,0x00dd118e,0x00359c92,0xff947061,0xffa4eb4a,0xffd943d6,0x003caf96,0xffec2888,0x0050a6b4,0x01351c38, -0x01613f3c,0xffd0609b,0xfff76139,0xffa7fc43,0xffc7ad88,0x002e33e2,0xffd94c04,0xffd109fd,0xfffa00ba,0xfff5f95e,0xfffbfc2c,0xfffca6c6,0xfffcefcd,0xfffb3c30,0xfffb00f7,0xffebea8e,0xffef39f6,0x00149656,0xffe479f3,0xffe3c870,0x000ebc55,0x005ee69f,0x008cddf6,0x007eeaed,0xffff501d, -0xff72b5e3,0xfefb201c,0xfec06200,0xff657e9b,0x00a3a59c,0x0085ca1d,0x00364f33,0x001b73e5,0xff0e2be1,0xfed21a0e,0xff5d1c28,0xff7ffa21,0x003366f9,0x01354e5e,0x005e4ad2,0xffe79f81,0xff7b52b4,0x0007d796,0x00169f80,0x0004d247,0x0003c969,0x00037600,0x00021dca,0x000318b3,0x0002cafb, -0x00044c22,0x00094ba1,0x0004c179,0xffe8316c,0x000a48c1,0x001353ef,0x0001e724,0xffd13088,0xffaa36d2,0xffbca5f6,0xffc2bcd9,0x0023b864,0x00c0b563,0x012857e4,0x00a129c3,0xff4bfc4e,0xff451259,0xffcb1732,0x01002100,0x011f8144,0x01413320,0x0120ab60,0x00480ca8,0xff4638f8,0x00bdaaf8, -0xff2ed8bc,0xfe3aa864,0xfe63eb74,0xffad8db1,0xfffb79cb,0xfffac17e,0xfffd21b8,0xfffcc549,0xfffd09e7,0xfffc4f7c,0xfffc0f6e,0xfffd0985,0xfff78785,0xfff5b174,0x00131ab1,0x004bc6bf,0x006640d0,0x00726cb6,0x005750af,0x002c6061,0xfff57ceb,0xffc19979,0xffa646d4,0xffad3bce,0xffa428da, -0xffbdc1a4,0xffbcef93,0x007f5534,0x00f0db32,0x016be77a,0xffd8bcc1,0xfed1cfca,0xfe753f4a,0xfec7297c,0x0080e913,0x0132589a,0x01961a04,0x0192d9cc,0x00b16d58,0x0041b344,0xfffee735,0x0005e67d,0x0005d272,0x0003716d,0x0005b541,0x0006c718,0x00075d76,0x000413f7,0x000bc4f3,0x00281408, -0x005531c8,0x007e9cb0,0x0074a4f1,0x005a4b5f,0x00459d34,0x0038b25d,0x003ab3f7,0x0033505a,0x002271d9,0x00102ee8,0xffcaf3cd,0xffa47ff0,0xff9052c1,0xff63d8b9,0xff472df3,0xff5860ca,0xffa05864,0xfffa9ed0,0x002dfe93,0x0035ac07,0x0011aaac,0xfff846b4,0xffcf48e4,0xffba8029,0xffb85acf, -0xffc7e0dd,0xffdadaa4,0xffe7339b,0xfff877da,0xfff8de9f,0xfff47d3f,0xfff0aee5,0xffeeef32,0xfff1aae1,0x000641b1,0x00112109,0x00127751,0xffee06ae,0xffd718a8,0xffd0e61a,0xffca9af4,0xffc8a1ab,0xffd0d0f9,0xffeeae4b,0xfffef386,0x000479ba,0x0009b70a,0x0009df99,0x0001489b,0x0007ea45, -0xfff70b57,0xffbddd77,0xffafb235,0xffa66884,0xffcae81f,0xfff2084b,0xff906bcb,0xff9353b0,0xffb025db,0xffbe20b1,0xffcf449b,0xffd3a076,0xffd852de,0xffdaacb0,0xfff41dd6,0x0002bea6,0x001ab6aa,0x001a8a73,0x002eb031,0x0038659a,0x003b272a,0x0035205d,0x00380f4c,0x00273e48,0x001590cc, -0xfffe1bff,0x0012109a,0x001f93e4,0x002ad5db,0x003bec83,0x004e49be,0x00637ae4,0x005e8134,0x00580b6c,0x004f7f07,0x002f08f0,0x000fb267,0xfff6cd33,0xffe20a43,0xffc86e13,0xffa082f5,0xff9ad84e,0x00478ed2,0x0047224e,0x00598ff3,0x00495c9a,0x0050455f,0x004e385f,0x00517f6a,0x00560819, -0x0059e447,0x005f8a56,0x00688e54,0x006c888a,0x0071064a,0x007749c7,0x0061acff,0x00538c14,0x004470e4,0x0034edbb,0x0020dc5c,0x001e67f2,0x0022166e,0x001fc88b,0x00200e82,0x001f48ad,0x001d3340,0x001cc135,0x0022afa2,0x002912e5,0x003158c6,0x003ae106,0x0044ace9,0x004999d5,0x00457b31, -0x0043c0db,0x0041b126,0x00464305,0x002f4b64,0x002ac1f7,0x002f2e0a,0x0030f752,0x00305d86,0x0030b7ba,0x002ef85d,0x002bc6df,0x002ec4ac,0x00305d04,0x003011f3,0x00335261,0x00344976,0x0039b1a1,0x0037f344,0x0038d200,0x002755ad,0x002b269c,0x002a4bde,0x002c8e94,0x002b1ac8,0x002be3a1, -0x002c6134,0x002cb78e,0x002d78a7,0x002cbd61,0x002f36d8,0x00301fb5,0x002fe3b5,0x00301a78,0x002fdac1,0x0031fede,0x0031dc2c,0x00330fb9,0x00346b38,0x00311e41,0x00340f3f,0xfff01fbe,0xfff9aceb,0xfffc032f,0xfff70a3a,0xfff4874f,0xfff0a251,0xfff34d0f,0xfff4f70f,0xffeadb3e,0xfff44e2b, -0xfff4de18,0xffef3074,0xffededbe,0xffec42f0,0xfff516f4,0xffe51882,0xffe54168,0xfffbcf92,0xfff21b19,0xfff14678,0xffef2070,0xfff38816,0xfff517d2,0xfffb8a3f,0xfff1279d,0xfff04990,0xfff34353,0xfff47129,0xfff5a25d,0x000163fe,0xffef4d72,0xffee197f,0xfff20711,0xfffdcde3,0x000087dd, -0xfff6ed9f,0xfffa6e69,0xfff8d5c1,0xffff0fb7,0xfff39bc6,0xffeae6cb,0xffde5e23,0xfff1ab16,0xfff4fd8a,0xffde88ff,0xfff5f3b7,0xffed249f,0xffcbafc4,0xffc72962,0xffca8428,0xfff02543,0xffcbb1e2,0xffd0180e,0xfffea0b5,0xffead97a,0xfff4d879,0xfff3bf97,0xfffe4ce7,0x0000808d,0x00061956, -0xffdf4355,0xffd1dc03,0xffdae248,0xffe3b1d9,0xfff5af85,0x00171c1b,0xffec8899,0xffe81d3a,0xfff8e403,0x001416c9,0x00136c29,0xfff0ea8f,0xfff8fda1,0x00141d92,0x0023901b,0x00008db8,0xffed53c4,0xffd4289c,0xfffb4e11,0xfff77215,0xffc9677c,0xffe1fc56,0xffe3c20e,0xffc83781,0xffcfc5ea, -0xffc196af,0xffe3b1e7,0xffad8ce1,0xffa31236,0x00015476,0xffdb00f9,0xffe935f0,0xffeb90e7,0xfffc1cb3,0x0006a8f6,0x00214378,0xffe610ba,0xffde80df,0xffef8b74,0x00006a17,0x0005d563,0x00369df0,0xffdf6be4,0xffe44c0b,0x000b9c8d,0x003ea87a,0x0045ef42,0x000becdb,0x00217873,0xfff5d79a, -0x0004949f,0xffe73e72,0xffc6c385,0xffacff4a,0xfff8558c,0xfff9eaf9,0xfff0ea85,0x00050571,0x0004d5cf,0x000f5939,0x000f00d9,0x0004e8f8,0x0000eeb3,0xffe490a6,0xffb4f8ff,0xffe7f932,0xffdc3778,0xfff2da62,0x000c3540,0x0026bf7b,0x0037af1f,0x003b61bc,0xffbab03b,0xff766544,0xff8ac29f, -0xffb724cf,0x000d23f1,0x005be442,0xffee14f1,0xffdc396d,0x0026b6ca,0x006ef6d2,0x005558cd,0xffd487a8,0xffe9ea26,0x011e91c8,0x00aad011,0x009d4ff6,0x007b7f67,0x0066fab7,0x003bd173,0x0009bcd5,0x0001da84,0x00010188,0xfffd8884,0xfffa768c,0xfff99f9a,0x00001ba8,0xfffea74c,0x001299fe, -0x00355536,0x000213ff,0xffaf9dc0,0xff6fd3c4,0xff650e55,0xff3f8532,0xff56aa76,0xffcd3e3e,0x0053c8e0,0x00f845ee,0x018a0ed0,0x00eb7065,0x00387a97,0xffbfe5b0,0xffbf5ba0,0xffea5a10,0x004d3aed,0x000097be,0x006affa7,0x0160119a,0x0154d892,0x0007c240,0x00339e4d,0xffd03ad9,0xffda886b, -0x0009f488,0xfff9c55e,0xfff70e7a,0xffffed28,0xffff1dfc,0x00019701,0x0002abc6,0x00026474,0x00008baa,0xffff2470,0xfff7b345,0xffeb4273,0x00058ac8,0xffe778de,0xffcf3fe2,0xffd4ff4a,0x00232524,0x00501600,0x004b1601,0xffd58844,0xff4cff75,0xfede3f0e,0xfef94f78,0xffc18626,0x00e5484e, -0x006a36b2,0xfff7f39d,0xffd46ae7,0xfef692e6,0xfeec6cfa,0xff7d9899,0xffb31cee,0x00a1115f,0x015fb030,0x00d81a39,0x002d34f8,0xffb757e2,0x000e9288,0x00047892,0xfffedf82,0x00012acc,0xfffe6d91,0xfffe9dd7,0xfffedbea,0xffffb12b,0x0000e773,0x0003ca32,0x000b1ca5,0x00013b71,0x001bf29d, -0x0034360c,0x00376211,0xfffbb169,0xffd4c8dd,0xffe54d39,0xfff65090,0x006f5036,0x0133697a,0x00f4db16,0x0032f944,0xfef74c4a,0xff9a336b,0x004bb6b7,0x00f6530f,0x01415adc,0x01240c06,0x004bfcde,0x0054a409,0xfe7a9b4c,0xfeac3724,0xff2f0e38,0xff048b82,0xfeeaed3e,0xffd82699,0x00017941, -0xffff6091,0x00008912,0x00017b99,0x000154ac,0x0000d9cf,0xffff96eb,0xffffcd87,0xfffd1c1f,0xfff84a83,0xffec3be7,0x00184f47,0x003dfcea,0x003ec365,0x001df66e,0xfffcae28,0xffceb231,0xffa37f46,0xff7c13b1,0xff80f561,0xff8ce845,0xffd19cc3,0xffd35ce6,0x00efad5b,0x010a4b50,0x008852c7, -0xff145067,0xfe64fce2,0xfe7fd628,0xfea6b0ce,0x0053a54d,0x016f442a,0x01ba8688,0x0172a58c,0x0081bab0,0x00423a5c,0xfff99444,0x00023fb7,0xfffd0fd2,0xfffdd36a,0xfffddd2e,0xffff1b64,0x000068de,0x00022d37,0xfffebfa6,0x000ef2d7,0x0032d81c,0x00776028,0x008efdd0,0x007e754a,0x006ba2f6, -0x005495a3,0x0045257e,0x0034ca93,0x0020ddab,0x000885a9,0xffc4ffaf,0xff9cd8a4,0xff88f5d0,0xff6a3ac4,0xff60a4a3,0xff86e04a,0xffaa7252,0xffc2a1ec,0xffdafcef,0xffb8ea3c,0x003203a5,0x002d4e06,0xffffd652,0xfff7d8aa,0xffe61be2,0xfff1c686,0xfff7d8b5,0x00023b43,0x00067afe,0x00065c8e, -0x0003de17,0x0002b996,0xffff2c4d,0xfffb89dc,0xfffebe7e,0x000945c9,0x001967a6,0x0008a5bc,0xfff19d50,0xffe4e73a,0xffdc4f32,0xffd072be,0xffc8b94b,0xffc65b27,0xffbdd176,0xffb4a47f,0xffc25eab,0xffcb9a6f,0xffcb517f,0xffd784e7,0xffd7ab44,0xffc1ff76,0xffd4e9c6,0xffe3fcac,0x000895ac, -0x0026227e,0xff95d175,0xff8a3050,0xff968388,0xff9c4fe0,0xffa61ebb,0xffb0c0f7,0xffc055e6,0xffcdb06c,0xffde4c14,0xffe69de0,0xfff45256,0xfff15460,0xfffe82ed,0x0002f4bb,0x0012c726,0x0019ef0c,0x00293f13,0x0023c9ef,0x001bd8e6,0x00152373,0x00231e2f,0x002af2a7,0x0034005a,0x0045a966, -0x00581b5b,0x006a6106,0x0052e5fd,0x003addb2,0x00214de1,0x0003b306,0xffe74926,0xffce53ff,0xffc74528,0xffbadfc6,0xffa5c764,0xff9c6f2a,0x000195e1,0xfff8e5d0,0x000f7b82,0x000ddb80,0x001b3ba9,0x001f5203,0x0022cc2a,0x00299eda,0x002ea008,0x00392566,0x00472f44,0x00506196,0x005bc224, -0x0067ba69,0x0061f7c9,0x005b5f31,0x0054ac00,0x004d112d,0x00403eb5,0x0042c8f1,0x00448a81,0x00433299,0x00424737,0x00412eec,0x003e03ce,0x004038b9,0x003b0b00,0x003a46be,0x00398194,0x00389885,0x00361b2c,0x002e606b,0x00237f16,0x0018b72f,0x000fb82a,0x000987c1,0x002fe354,0x0027febc, -0x002e2541,0x002f28b0,0x002ffb83,0x0032066a,0x00337c10,0x0035733e,0x003beae6,0x003fd7f8,0x0041ce96,0x00465489,0x00489d55,0x004d9d0a,0x00483a41,0x004a54f8,0x00405b82,0x0044373f,0x004684dd,0x004b308c,0x004a4c06,0x004bb032,0x004ceb74,0x004dcb76,0x004ead9a,0x004f49b4,0x004ce292, -0x0049dc5f,0x0045b8cc,0x0041b545,0x003e4677,0x003cd0dc,0x003ae29d,0x00396bce,0x00375d73,0x00331c87,0x0051de4e,0xffe4d98a,0xfff14118,0xfff12f2f,0xffed6418,0xffeaf36e,0xffe898a4,0xffe7cd5c,0xffeb6fb4,0xffed7d10,0xffef65ca,0xffee7c7f,0xffec7ea2,0xffe49660,0xffe3ce0b,0xfff2569c, -0xffdca6a3,0xffdb5eeb,0xfff1f19c,0xffe738e5,0xffe5bb98,0xffe1c568,0xffe755c4,0xffe7c818,0xffea934c,0xffdf50c3,0xffdfdba4,0xffe77f4c,0xffed0d86,0xffedf96d,0xffecbef2,0xffe6c3e1,0xffe81b3c,0xfff07fd6,0xfff4f357,0xfff57edf,0xffe9bb56,0xfff16093,0xfff4ae65,0xfff5a424,0xffee9cb0, -0xffe5f3bc,0xffdee39b,0xffe63d37,0xffec59ad,0xfff0ae09,0xfff1c0bb,0xffe8d801,0xffd48d60,0xffba4c11,0xffbb5bff,0xffeccbb3,0xffc509d4,0xffc9c9af,0xfff50106,0xffdf09d4,0xffe47e62,0xffdc1af3,0xffe814a7,0xffe3ceab,0xffdef9f3,0xffb43f91,0xffaede9d,0xffca69b4,0xffe5a04a,0xfff4c1f9, -0xfff067d5,0xffe282e4,0xffe69a84,0x0000e502,0x0007cf4e,0x00014638,0xffddd20d,0xfff16008,0x0012f815,0x001711e1,0xfffc7529,0xffe8fb59,0xffdba646,0xffee511e,0xfff6012a,0xfff931cf,0xfff803e9,0xfffc2318,0xfff73c33,0xfff50b58,0xffe26275,0xfffc3142,0xffc1c779,0xffad73c5,0xfff82803, -0xffd36036,0xffd74f94,0xffcc4bf6,0xffe55903,0xffe5457d,0xfff00278,0xffaa73d2,0xffad812d,0xffdf7298,0x0007bcdb,0x000d2ef8,0xfff5a2c0,0xffdf79af,0xfff0242d,0x002b72d7,0x00350a3f,0x0031b83c,0xfff1f658,0x001b0dd3,0x000253c3,0x0004febe,0xfff06043,0xffdaf890,0xffd5f9a8,0xfffb2c3b, -0x00019034,0x00027c87,0x00027c60,0x00035208,0x0003853d,0x0008c6ed,0x000905fb,0x0005e809,0x00081664,0xffdcfbcc,0xffec3c9c,0xffd2303b,0xffd2d7ea,0xffd20363,0xfff12d53,0xffec9241,0xffce7823,0xff3c1815,0xff183efc,0xff75aec5,0xffdca659,0x0018965b,0xfff0a7d9,0xffdbc20d,0xfff32967, -0x005282e1,0x00562108,0x002753d1,0xffaea144,0xffe944b0,0x00db707a,0x0069fc44,0x006af8eb,0x003bea00,0x001fcad9,0x00083d93,0xfffdbf53,0xfffff3b2,0xfffe9e6a,0xfffe1391,0xfffdfff0,0xfffb5329,0xfffc55a4,0xfffbe81e,0x0000a89a,0x000c9f3a,0x0022d51b,0xffeb6e66,0xffa4a859,0xff8c3799, -0xff78fdf6,0xffa1e6a6,0x0023bc78,0x00d043fb,0x014fad1e,0x016f7f70,0x00da1857,0x0041f333,0x00047528,0xfff00ed2,0x0010adc9,0x006fbc4c,0x0040e94a,0x009cccf4,0x016535bc,0x0121c224,0x003eae79,0x00565b5f,0x00062a06,0x0006ac8d,0x00080b12,0xfffc4c30,0xfffe4e49,0x000292a9,0xfffff41c, -0x0001768a,0x00015090,0x000276ec,0x00020f17,0x0001cea5,0x00003a0c,0xfff755c6,0xfffa1e78,0xfffb40dd,0xffe63582,0xffcd98fb,0x0009f72c,0x00219a67,0x000d7f33,0xffa33f27,0xff2e9da9,0xfeeb3c78,0xff57cc9e,0x001a2aa9,0x00eccafb,0x00611017,0xffe1817c,0xff9be91e,0xff1379d0,0xff37fc80, -0xffc710a5,0x0005ac7b,0x00cb4d29,0x0158b462,0x01146e4a,0x0032765a,0xffd79de4,0x0015dab9,0xfff8c010,0x0001c56d,0xfffd51e5,0xffff9d3d,0xfffe5fb7,0xfffe8509,0xfffe7aba,0xfffec3be,0xfffffd92,0x00031709,0x000727e1,0x000ddca3,0x0026baeb,0x003f07d7,0x001b1eed,0x000b7ac3,0x001865eb, -0x00539e5b,0x00c325b7,0x014c665a,0x00948544,0xffc67fd5,0xfee59f2c,0xfffa5409,0x00c774da,0x00f5bf86,0x0159bc1c,0x00ef7412,0xff9f3a71,0x00387c5d,0xfe8b0524,0xfd241c28,0xff15728c,0xffb922cf,0xffa5f695,0x00075710,0xfffe95e8,0x0003dd42,0x00012352,0x00024d95,0x00017364,0x00021fdc, -0x000199b1,0x00019f2d,0xffffa2f1,0x00028d2c,0xffef8f47,0xffec3102,0x0000bd48,0xfff8aba1,0xffdcb38c,0xffcc3631,0xffaae2a0,0xff8d1c51,0xff6c774e,0xff79bd7b,0xff871324,0xfff79b88,0x003ea1b9,0x012aa794,0x00d477e0,0xff78f65a,0xfeece988,0xfed7f1e8,0xff0f5896,0xff4ce99c,0x0004f76a, -0x0100b948,0x0118e7a8,0x00c024b3,0x004dd1f0,0x000da8a7,0xfff54649,0xfffe94a8,0xfffab342,0xfffce787,0xfffc95d0,0xfffcdc38,0xfffc9dd2,0xfffe05d5,0xfffe9230,0xfffdaa1b,0x000f0522,0x004bc160,0x007d0804,0x00827e2f,0x00793e72,0x0064b06d,0x004e74a8,0x002da5d1,0x0014d92b,0xfffce993, -0xffcb127d,0xffa252ce,0xff892f6e,0xff79f0eb,0xff8e2648,0xffc5307a,0xffb23703,0xff8c0f15,0xff8463ec,0xff6d7558,0x005a0078,0x0060fd8d,0x0037f6e1,0x002a88ca,0x0013bf46,0x0014901b,0x0008ae2b,0x000afff1,0x00086b2e,0x0007d14c,0x00061f0a,0x00071eab,0x00061222,0x00060b5b,0x00021135, -0x0006c6c1,0x00191ebd,0x0020713d,0x00152bdd,0x00038125,0xfff5aca0,0xffe2fb22,0xffd15e35,0xffbd5b61,0xffa675a3,0xff8f1b11,0xffa2ef0a,0xffae31f3,0xffae48c5,0xffb5937e,0xffbbefcb,0xffcc7bdf,0xfff36e67,0x001db2cf,0x0044d7fe,0x0060641e,0xffb9c787,0xffad5e7c,0xffae0a9e,0xffb196ee, -0xffb1a3bf,0xffbf8c4a,0xffd2a274,0xffe29a7a,0xffeacf96,0xffef948c,0xfff31bfa,0xffefb6b3,0xfff15bfb,0xfff02451,0xfff7442c,0x00002850,0x000e597d,0x00151712,0x001db9d6,0x00282da0,0x0027549a,0x00275ad3,0x0027789d,0x0030894b,0x003a0e99,0x0041b670,0x0028bfdc,0x000ff5cf,0xfff7cd32, -0xffea81ff,0xffde82d8,0xffd00491,0xffd0cd94,0xffcb25ef,0xffc16fd2,0xffb8eb7a,0xffd61f01,0xffc6d839,0xffd8d10c,0xffdb907d,0xffe9e283,0xffef4941,0xffef5fcb,0xfff47dd6,0xfff7e139,0x00019107,0x000dbed2,0x00177ca4,0x0024091c,0x0030e4f1,0x003c865b,0x004178ba,0x0046e5ba,0x004c36d6, -0x0050668f,0x005252ac,0x005201d1,0x00531726,0x0052c230,0x0052e375,0x0050eafd,0x0054cffe,0x00493aa3,0x004373b8,0x003c4955,0x003312f9,0x002789be,0x001a40ed,0x000b9051,0xfffdbe25,0xfff2fc81,0xffe5bbe1,0x00263779,0x001d4933,0x0028875a,0x002b5ba9,0x00303d8a,0x00290b4c,0x003069ed, -0x00382295,0x003fa337,0x004457a6,0x0047fb9a,0x004c6fd6,0x004fba22,0x0052db7a,0x004a7d95,0x00488319,0x00511336,0x004e6521,0x004f0550,0x004e0a24,0x004fada5,0x0050d030,0x00522976,0x00533c32,0x005411de,0x0055ccdb,0x00504d7a,0x004b30e0,0x004578dd,0x00402e29,0x003be358,0x00388d3e, -0x0035b551,0x00323614,0x002d6b0b,0x0029379f,0x0053ed48,0xffe127fd,0xffed6e3b,0xffeaffe0,0xffe7ede7,0xffe4e59e,0xffe23897,0xffe37419,0xffe62f76,0xffefad8f,0xffea3af7,0xffe7c249,0xffe6dc70,0xffdaf4dd,0xffdb6e2b,0xffebacd1,0xffdd5578,0xffdcb7dd,0xffe7173e,0xffe0c2a2,0xffe0d5a5, -0xffde8648,0xffe2770f,0xffe21192,0xffe030eb,0xffd98743,0xffdb64e6,0xffe3cf44,0xffebd338,0xffebae71,0xffded14a,0xffe4b5e1,0xffe8827f,0xfff500a3,0xfff0a5de,0xffeeec12,0xffe3d0aa,0xffed4e81,0xfff21e18,0xffed52de,0xffe90811,0xffe48e1a,0xffe430db,0xffe0c496,0xffe9daf2,0x0001ccbb, -0xfff6de79,0xfff0e7db,0xffe88bba,0xffcfe521,0xffca9b1e,0xffe99652,0xffc61874,0xffcb4cd1,0xffeef83b,0xffde6897,0xffdc2a6f,0xffd32bee,0xffdc1c6b,0xffd27ca0,0xffc38e62,0xffa70402,0xffaaac95,0xffca2090,0xffed70b5,0xfff4d8f0,0xffd0f543,0xffdf5b09,0xffebaa2e,0x000d81fe,0xfffe7970, -0xfff341a2,0xffd6092a,0xffedb15a,0x000dea0f,0x000366a9,0xfff73377,0xffea7781,0xffe26b59,0xffeb82da,0xfffb6772,0x00054f06,0xfffef5eb,0x0003ad68,0x0003ff8a,0x0009a827,0x00014e22,0x0006f7a0,0xffecd3a3,0xffd0c6d6,0xffec0960,0xffd6ef86,0xffd27eed,0xffc138f4,0xffda33d6,0xffd07a80, -0xffc6f565,0xff9780c5,0xffa47e13,0xffdc77c4,0x000edfc0,0x000e26e7,0xffbdd332,0xffe40bd6,0xfffdda0d,0x0048f6b0,0x0024b279,0x0018f126,0xffe14521,0x00106eee,0x00052e6d,0xfff79af8,0xfff09c1a,0xffe7d188,0xffef6a86,0x00044176,0x000269ac,0xfffdd0f4,0xffffe4a0,0xfffeefad,0xfffe5292, -0xfffd74a4,0xffffebc8,0xfffe1a3a,0x000b6452,0x0001ad79,0xfff4672c,0xffd92fc4,0xffc89d67,0xffb647a1,0xffcf5284,0xffb42eb5,0xff773874,0xff0f38e7,0xff11fe9c,0xff848174,0xffff7816,0x001203d8,0xff91a5e6,0xffcd209e,0x0009d571,0x0077f660,0x00377866,0xfffb171a,0xffa17f60,0xffe9eca0, -0x00808956,0x00437cbc,0x0041a4d7,0x0018e1cf,0x0002a0c6,0xffff9e53,0xfffecb22,0x00006410,0x000052bb,0x00007ad1,0x0000e45a,0x0000938f,0x00009106,0xffff117a,0xfffd3a33,0xfffc9694,0x00100bce,0x000c834c,0xffd1e5b6,0xffb1b478,0xffb93ba3,0xffefdb0f,0x0063102c,0x0114c17a,0x015b4402, -0x0117052a,0x00a882b5,0x004a3a52,0x00419309,0x002f8be1,0x003b9b16,0x006d6ef2,0x00693a8a,0x00aef447,0x0134ad56,0x00bf7085,0x0056f61a,0x004e2541,0x0024cd85,0x0017977e,0xfffcbbed,0x00008515,0x00013213,0xffffb6d6,0xffffe621,0xffffe1d7,0xffff9b77,0xffffb7f8,0x00000621,0x000067eb, -0x0001cc8b,0x00012c41,0xfff78931,0x0002a459,0x00061f70,0xffeab49d,0xfffc001f,0xffeea4e2,0xffc30575,0xff6b0e75,0xff2c476a,0xff31d4dc,0xffc1ff03,0x00513ea4,0x00b0788a,0x004e1288,0xffe3f235,0xff8d9158,0xff5e865c,0xff99d57c,0x00195799,0x004c677c,0x00a7722c,0x011f1948,0x00eabb74, -0x00196fbb,0xfff26c27,0x00055b2b,0xfffbe668,0x0000f0e3,0xffffce4d,0x00001d5b,0x00001c9b,0x00000c18,0xffffd323,0xffff5c18,0xffff162b,0xfffe6114,0x0004be94,0xffff948e,0x0007e5b9,0x002c6bdf,0x0034e461,0x0046adf8,0x00587b51,0x00b36384,0x00ed3da8,0x00f73cfc,0x0025fd5a,0xff839978, -0xff1a6ef7,0x00313095,0x00df56c9,0x00bf9c9e,0x010e3ca4,0x0083058f,0xff51006a,0x0007e43a,0xff082d26,0xfd236dac,0xff1308f5,0xfff96338,0xfffeba3e,0x0001fe02,0x000195d1,0x000076b2,0x00002cb1,0x00000eb8,0x00001319,0x00002258,0x0000835a,0x0000f817,0x00017208,0x0000ba25,0x00025e20, -0xffe68072,0xffd3c398,0xffc0ce0d,0xffafe1e3,0xffa9c3f9,0xff939dda,0xff825157,0xff73769f,0xff8c2227,0xff99da61,0x0019b032,0x00aa427a,0x00e1a590,0x00454497,0xfee8d1ce,0xff37d2cb,0xff8d6ea3,0xffb498d2,0xffe56ff5,0xffcf14f8,0xfff2be4e,0x000c24c1,0x000e2e15,0x0015e5a3,0xfff04864, -0x00011a1d,0xfffd417c,0x000020e7,0xffff9a7f,0xfffffad4,0xffff67a3,0xffff2457,0xfffdea32,0xfffde24d,0xfffd5a57,0xfffa9856,0x001fef17,0x0050f02a,0x006c62d7,0x006a4558,0x005d90cd,0x0048e01d,0x001f5dd6,0x000191b4,0xffe84ad4,0xffce3935,0xffa9d419,0xff93d3b7,0xff929149,0xffb90133, -0xffe9b2d5,0xffc5f9d0,0xff935359,0xff7659ba,0xff93b234,0x0069a88f,0x0077b558,0x00536538,0x00360ac3,0x001fc27f,0x000945dd,0x00062a80,0x00017955,0x0000f171,0xffffc835,0x000016b9,0x0000ef21,0x00020649,0x0003a0ae,0x00052b35,0x00049f13,0x000bea19,0x0025004e,0x002a4f53,0x00224830, -0x000ec559,0xfff90a80,0xffe1c272,0xffd12d47,0xffb8fabe,0xff96844c,0xffa3b101,0xffa74bd9,0xffa1d3b6,0xffa83242,0xffb26771,0xffd961b1,0xfff8feb4,0x0029f878,0x004d1dcc,0x006d9d8f,0xffd78f4f,0xffd1177c,0xffce4353,0xffd23019,0xffd2b333,0xffe24181,0xfff074cc,0xffff3182,0xffff9c13, -0x00027cca,0x00013d44,0xffff81b4,0xfffc506e,0xfff96ce9,0xfff20eca,0xfff03f33,0xfff6c658,0xfffb2708,0x0005a1fb,0x001464d7,0x000a70d0,0x00070e98,0x00014e2f,0xffffade9,0xfffe63b9,0xfffb7ca3,0xfff2252a,0xffe811b3,0xffe04051,0xffe00e01,0xffdfea19,0xffda1a23,0xffdda8b9,0xffdae56f, -0xffd6abef,0xffd2be10,0xffcc70c4,0xffbe26f9,0xffc1dbf8,0xffc93e05,0xffcee819,0xffd2ca3a,0xffd35422,0xffd7778f,0xffdc1540,0xffe34ef1,0xffea135b,0xfff0beb0,0xfff7073d,0xfffeada3,0x000db56e,0x00191531,0x00240cb0,0x003012eb,0x0040c191,0x00440dfb,0x004026d1,0x003f55e0,0x003d5950, -0x003ba390,0x00392bc7,0x00397c6f,0x002f24bb,0x00285331,0x002092c1,0x00163fec,0x000b077c,0x00004ee9,0xfff558e1,0xffebecd2,0xffe53715,0xffd99698,0x000a5834,0x00058b14,0x000ccf6a,0x000ec7d2,0x00150bbb,0x000b55bd,0x0011f459,0x0017d5f0,0x001cbdc6,0x00202cf2,0x00243dba,0x00285ea1, -0x002d4e2e,0x0030bfd5,0x002a7f18,0x002682cb,0x003869d1,0x00325876,0x003188d0,0x002edb4c,0x00300849,0x002fd4b4,0x002fce49,0x002fc7c7,0x002f6d60,0x002fed7e,0x002b0669,0x00269d3f,0x00221825,0x001e7ccd,0x001b8bd2,0x0018cc03,0x0016a65d,0x001361a3,0x000efe61,0x000c3e99,0x002ca33e, -0xffe51a8b,0xffee26e2,0xffea0486,0xffe9a447,0xffe7c38c,0xffe738ef,0xffe81fe3,0xffe98a7d,0xfff779a2,0xffee721b,0xffeb1827,0xffea51f4,0xffdf0b06,0xffdd7939,0xffe8515d,0xffe296e0,0xffe5670e,0xffe8b947,0xffe5c790,0xffe62ff0,0xffe4b896,0xffe58802,0xffe46b03,0xffdff03b,0xffdfb684, -0xffe1f455,0xffe759be,0xffedd55b,0xffec909e,0xffdcaf39,0xffe7a8eb,0xffec45b8,0xfff93c40,0xfff0257d,0xffedd317,0xffe71bf0,0xffee411e,0xfff1bcc0,0xffe91469,0xffeadbfb,0xffea8e54,0xffe99b5b,0xffe3fac4,0xfff1e4e9,0x00075b80,0xfffd6d38,0xfffbf413,0xfffad4e2,0xfff184a3,0xffee918d, -0xfff708f6,0xffde90bc,0xffd87d49,0xffe950b9,0xffe9dbc1,0xffe42bd4,0xffda344d,0xffdb7b5c,0xffd02be9,0xffbf2229,0xffb83ba2,0xffc0c3ca,0xffd5f5f0,0xfff27d35,0xfff22041,0xffc6ac31,0xffe0c363,0xffef99de,0x001082ab,0xfff8711e,0xffedd299,0xffdd9a65,0xffeece54,0x0004b3f2,0xffeff2a5, -0xfff4df33,0xffee018c,0xffeec8e3,0xfffc7b47,0x000314f8,0x00002982,0x0000323b,0x00025b60,0x0002880c,0x00062c2c,0x00050f14,0x000545b0,0x000650a2,0xfffcffbf,0xfff1f0f5,0xffe4e907,0xffe161d2,0xffcf9759,0xffdadcab,0xffcceba2,0xffb8f484,0xffadf434,0xffbdd2ab,0xffe1755d,0x00087ce9, -0xffffb996,0xffa855b1,0xffe5678e,0xfffecea0,0x0046d1a0,0x000e7a5f,0x0003f316,0xffe53dbf,0x00051eb6,0xffffea75,0xffe64e7b,0xfff01759,0xfff46895,0x0002259a,0x00035ce1,0xfffeff8d,0xffffd110,0xffffe231,0xffff4124,0xfffe8341,0xfffd7e97,0xfffde116,0xfffd7266,0xfffe281b,0x00039b45, -0x0001ea0e,0xffefe29b,0xffd8c977,0xffbe3ea8,0xffc351a6,0xff9d8be6,0xff5ecfeb,0xff3e5b31,0xff583fc4,0xffa93817,0x000880d4,0xfffa703d,0xff6e93e9,0xffc4760d,0x00095662,0x006fd221,0x00197e0f,0xffe6084d,0xffbb7d8e,0xffef8b09,0x002cbabe,0x0028ba44,0x00228de0,0x00067c2d,0xfffea8e3, -0xffff168e,0xffffd44f,0x00009b75,0x00000c56,0x00005101,0x0000cb07,0x000120a9,0x0000eb2e,0x00016a3a,0x00001f12,0xfffea705,0xfffe9936,0x000ce3cd,0xfffabdbc,0xffe00acc,0xfff75704,0x0029b7f3,0x007546e3,0x00f1439d,0x0101aeec,0x009a8d3e,0x00569f5a,0x0031bde4,0x00434af4,0x004e663f, -0x0048575c,0x0033c220,0x0058e54a,0x0087f563,0x00d037bd,0x0055cdd8,0x004790a3,0x002b1652,0x00207031,0xfffe40ce,0x0000b923,0x0000fceb,0xffff7f5f,0x00002c88,0xffff9e7d,0xffffcb1c,0xffff831f,0xffff862c,0xffff5881,0xffff9311,0xffff8dfe,0x0001be2d,0xfffec736,0xfffd5fcc,0x000b58ae, -0xfffbc0c1,0xffe202e5,0xffbc48d0,0xff8c3943,0xff50a1c3,0xff4ed791,0xff8e17df,0x000cfd32,0x005d0f11,0x0060fd12,0x002fad99,0xffed89f9,0xffa66670,0xffb32e24,0xffec4930,0x004a009a,0x0060e5c9,0x00689e3e,0x00bede93,0x0084c026,0xfff86082,0xfffd1939,0x00017a09,0xffff8367,0x0000bc33, -0xfffffebe,0x00007da6,0x00005600,0x000062bc,0x000077f1,0x000038da,0x00004ed3,0xfffed667,0x00007c03,0x0001dfa6,0xfffa270f,0x0018befe,0x003f6b97,0x00676029,0x0085192b,0x00d1b64b,0x00ce4ea8,0x007b3d81,0xffdf134e,0xff867030,0xff816ed7,0x004562fe,0x00acf1dc,0x00826279,0x008ebfb0, -0x00173751,0xff6349d8,0xfff3061f,0xff66325d,0xfe34cc6c,0xff5c8951,0x0017f370,0xfffe0c8a,0x0000d9a3,0xffffb071,0xffff5bf8,0xffff75ea,0xffff6a57,0xffff6cdd,0xffff81ec,0xffff9f13,0xffff8459,0x00007165,0xffffe9ca,0x00033d6c,0xfffcfb1e,0xffd211c6,0xffb3d409,0xffaf5048,0xffaa5ffb, -0xff9b75d4,0xff9bf133,0xff9e0ad4,0xffb3c77d,0xffdbe236,0x004489c4,0x00cea26c,0x0063db98,0xffd25f39,0xff22199b,0xffa5f211,0x00068675,0x0026db78,0xfffab29a,0xfffaddea,0xff376b61,0xff7cfa52,0xffe2b1f0,0x00036664,0xfffe0d8e,0x00016faa,0x0000dda3,0x0001675e,0x0000f780,0x00011d5b, -0x0000ef2d,0x00008591,0x0000d590,0xffff181f,0x00009223,0xfffa298f,0x00035201,0x002f9fed,0x004f469a,0x004b6f30,0x0042b5de,0x00322eeb,0x0013a310,0xfffa4a69,0xffe035c8,0xffd6f41c,0xffbd7ef8,0xffb9c98c,0xffbad575,0xffe04932,0x0001f9c6,0x0000d3dc,0xfff382e1,0xffe58a50,0x002212bc, -0x004bb0e1,0x0062f120,0x0054d7fb,0x00276d14,0x00058ee2,0xfffefc5b,0xffffb3f8,0xfffc8ee1,0xfffda696,0xfffd8c5b,0xfffdbba6,0xfffe1c69,0xfffe8f99,0xffff2cb5,0x000001ef,0x0003b181,0x00017467,0x001a9aaf,0x002fab4b,0x0031a052,0x0021edad,0x00112947,0xfffbbe17,0xfff1ffd3,0xffde7138, -0xffbd8552,0xffbd0fe8,0xffba572f,0xffb57273,0xffbd6e08,0xffc8ab70,0xffebf495,0xfff703ab,0x0017c6b2,0x002cbf48,0x00427478,0xfff912e3,0xfff83e6b,0xffefcadd,0xfff830fa,0xfffa3401,0xffff2e3b,0x00053d98,0x0007fce5,0x0005d861,0x0005d423,0x000530f4,0x00049810,0x000356b1,0x00031eef, -0x0000a1fd,0xfffa9b27,0xfff610c4,0xffefd8cf,0xfff145ba,0xfff9c8c0,0xfff0fee8,0xffee861d,0xffe95751,0xffe39569,0xffddf86d,0xffd78b9e,0xffdb1b84,0xffdc6d4b,0xffdf4a48,0xffe60fc8,0xffeb7d84,0xffed4824,0xfff0a231,0xfff04531,0xfff0e718,0xfff3fa7d,0xffde6eeb,0xffd7b341,0xffd36bc4, -0xffd8a019,0xffd862f2,0xffdce8c6,0xffe27956,0xffe84553,0xffee298c,0xffef72a5,0xfff17e32,0xfff36812,0xfff51f7f,0xfff5d42e,0xfff7e620,0xfffcf63e,0x0006b374,0x00133a5c,0x002699b3,0x0028c2fd,0x00233af0,0x0020b3fa,0x001d9982,0x001a4434,0x00175c38,0x0014690c,0x000f9846,0x000bb929, -0x00077fe1,0x00019db7,0xfffba397,0xfff6410f,0xfff15240,0xffed9ad2,0xffea3f38,0xffe480fe,0xfff94be6,0xfff81096,0xfffa7d83,0xfffafb04,0xfffd9b0b,0xfff75c62,0xfff81f1c,0xfff80a61,0xfff96b0a,0xfffc17bf,0xffff1b21,0x0001fa15,0x00058bc8,0x0008f12d,0x0009fe2a,0x000998e1,0x0017f1f3, -0x00133efd,0x0011d782,0x000f1ccf,0x000f2c9e,0x000e0824,0x000ce8f0,0x000c153c,0x000afac9,0x000a0de2,0x0007c5a9,0x00058ff5,0x00039390,0x00023cd1,0x00014958,0x000068bc,0xffff60ba,0xfffdb23a,0xfffbbbfd,0xfffa718a,0x00085ff4,0xffebb4be,0xfff0ba6c,0xffecf77d,0xffed8c96,0xffed17a7, -0xffeb353d,0xffed5260,0xffef5113,0xfffabad5,0xfff427ec,0xfff1ec4d,0xfff1f51f,0xffec7a16,0xffeab32e,0xffedf2f4,0xffeae0da,0xffebfb30,0xffe93bbb,0xffee76a0,0xffee988a,0xffedea68,0xffec4aca,0xffeafbc3,0xffe7151b,0xffea3c96,0xffebcae5,0xffed4acf,0xfff06647,0xffeef679,0xffe4510c, -0xffecb580,0xfff03141,0xfff9b50e,0xfff1af59,0xfff04463,0xffee8008,0xfff14a44,0xfff246e6,0xffea186d,0xffee56a2,0xfff0f77f,0xfff0fd08,0xfff6518e,0xfffe974d,0x0002ea33,0x0000aa4c,0x00016b00,0x0001b4d6,0x0001042b,0x0000d642,0x000258b7,0xfffcaaf3,0xfff6f82e,0xffef6990,0xfff35cc0, -0xfff0c3ae,0xffe819c5,0xffe293fa,0xffd97cec,0xffce6291,0xffd48cb8,0xffdc0795,0xffe3896a,0xfff252b1,0xffeed0a2,0xffd1af90,0xffe533bc,0xfff06375,0x0007f37f,0xfff5356e,0xffef2b8c,0xffeb29fb,0xfff1baf4,0xfffad745,0xffe59214,0xfff35a50,0xfff85a16,0x00009192,0x00038612,0x000143a8, -0xffff0092,0xffffe03f,0xffffebfd,0xffffa1cb,0x00003885,0x00003241,0x00000a0e,0x00013d42,0x00046b5a,0x00022415,0xfff9a08e,0xfff47a83,0xffe7a0cf,0xffe3b606,0xffd807c2,0xffc7ad8d,0xffd32368,0xffdea646,0xffe8a5fa,0xfffaeb20,0xfff01328,0xffb9ebbd,0xffe6abcf,0xfff7d64f,0x002a5d37, -0xfffce340,0xfff91420,0xfff2dcd7,0xfffbb728,0xfff794b0,0xffdccf0b,0xfff67957,0x000120c1,0x00013507,0xfffe3c0e,0xffff6e26,0x00002681,0x0000268b,0xffffef3d,0x00003d5a,0xffffce0e,0xffffb57a,0xffffde69,0xffff3230,0xfffdb95e,0x00004244,0x0000decd,0xfff38934,0xffd9db07,0xffc98c5f, -0xffaa430e,0xff837a39,0xff92a668,0xffad2b91,0xffccff52,0xfffc2275,0xffe5f0ef,0xff8c3804,0xffc7a3f8,0xfff9be3f,0x00429f22,0x000361ed,0xffe755cd,0xffe23365,0xfff426d4,0xffff22c2,0x00142d74,0x000b1117,0xfffe6873,0xffffc2a5,0x00005161,0x0000a4c1,0xffffa3ba,0x00001071,0x00001658, -0xfffffcfd,0x00001c85,0x000032dc,0xfffff326,0x0000ac95,0x0000ea85,0xffffc379,0x000009cc,0x00069fd8,0x000a4f1b,0x00215fb0,0x0044d8da,0x0069073b,0x0096b153,0x00875beb,0x0039ffec,0x001478cd,0x0011fc67,0x0029b841,0x004c4082,0x003d429d,0xfff9dcdc,0x002f3267,0x00480681,0x00629a41, -0x00127e8d,0x002cd539,0x001a8149,0x00046bf9,0xfffabf88,0x0003a258,0xfffdde15,0x0000f9d4,0xffff75c8,0x0000445d,0xffffdc9a,0x000007ca,0xffffe833,0xffffff20,0xffffe368,0xffffd216,0xffff49a9,0x0000bc7a,0xfffe2df1,0xffffaa27,0xfff160d9,0xffcbf3e3,0xffa82e4f,0xff887760,0xff75dc2d, -0xff9522c2,0xffda005b,0x002f7173,0x005052b6,0x002d8802,0x0013aa1d,0xfff2cc50,0xffca3a2c,0xfff21097,0x001b107c,0x004b1c32,0x004e2362,0x002c066d,0x0057cf5a,0x00210411,0xfff351e4,0x0003ff94,0xfffee60e,0x0000880f,0xffffd57b,0x00003c08,0xfffffc6b,0x00001255,0x00000f58,0xffffff5f, -0x00003574,0xfffff78f,0x0000c118,0xfffed827,0x000156e5,0xffff73b3,0x0010ddef,0x003b77b7,0x0060472f,0x007e7370,0x009a183a,0x00772453,0x001dba69,0xffc47137,0xffa7ca16,0xffd53a0e,0x0037fe95,0x005ee7e3,0x0042b7c5,0x001902ad,0xffd06a31,0xff9b1e95,0xffee85a9,0xff9ad7fc,0xff36c280, -0xffd95045,0x0014aaae,0xfff886fe,0x00021b76,0xfffe9aa4,0x00004806,0xffffabaa,0x00000078,0xffffe1e5,0xfffff1be,0xffffe1d4,0x000002ea,0xffff9921,0x000024c3,0xfffec76a,0x0004d1fa,0xfff120ef,0xffcd5030,0xffcdc081,0xffc63939,0xffbd598a,0xffc6b569,0xffd14efb,0xffdf2e70,0x001c976b, -0x005309f8,0x008ae621,0xfffce60c,0xffa8c474,0xff962c4a,0xffdf026c,0x002268ed,0x005bee01,0xffdf6088,0x0047d512,0xff574673,0xffb5d5e8,0x00094ade,0xfffe1ce9,0x0001bcb2,0xffffd99f,0x0000a1bc,0x0000051a,0x000051fd,0x00002076,0x00003074,0x00002f58,0x00001da6,0x000064d7,0x000012e8, -0x00011e5a,0xfff96a15,0x0011bed8,0x00332620,0x0028ec35,0x00219aa5,0x00120ace,0x00036844,0xfff2fa69,0xffdc8409,0xffd81380,0xffcbf68a,0xffd91b66,0xffdab963,0xfffa8bfa,0x001c2c4e,0x003c62a9,0x004ffb15,0x005fe33e,0x00814668,0x000cf04b,0x003021a9,0x002f3da3,0xffff9d6e,0xfffc7a32, -0xffff5936,0xfffe49df,0xffffa8d1,0xffff6562,0xffff9f61,0xffff9b82,0xffffaefa,0xffffad1e,0xffffb140,0xffff5903,0xffff43a4,0xffff556a,0x0003c6ae,0x001c85e8,0x0028eb29,0x00202bf8,0x001a4c09,0x000d3085,0x00073330,0xfff97f8f,0xffe41a6b,0xffdc7e37,0xffd905b9,0xffd6fcaf,0xffdc0013, -0xffdef23e,0xffe9054f,0xffe24090,0xffeb884c,0xfff36c41,0xfffa66bb,0x0011cb13,0x0014e53b,0x0008ca37,0x00067245,0x000381d5,0x000368f3,0x00020c08,0x000079c6,0x0000bf21,0x00007785,0x000091c7,0x00006c3f,0x000069dd,0x000061b8,0x0000e9bf,0x0001ff7d,0x0000fae0,0xfff83313,0xffed2b50, -0xffeae50e,0xffe83ef7,0xffe711d0,0xffe53331,0xffe0f109,0xffdce2d5,0xffd856c0,0xffdc0a23,0xffddafc3,0xffdf8de8,0xffe86ffc,0xfff048b6,0xfff7e4ee,0xfffd7058,0x000160e2,0x0006f640,0x000e736f,0xffeaf21d,0xffea7471,0xffe740eb,0xffeec661,0xfff066da,0xfff5e281,0xfffcd856,0xffff22ef, -0x00001358,0xffffa54f,0xffffbaea,0xffffa171,0xfffffbd0,0xffffcd29,0xfffe1cb6,0xfffabf25,0xfff891a5,0xfffa3e56,0x0005646c,0x00054c05,0x00013f92,0xfffe9d80,0xfffc3001,0xfff942a9,0xfff71ee3,0xfff46ee7,0xfff4445a,0xfff41df8,0xfff360f2,0xfff1c3a0,0xffef9de8,0xffed7c45,0xffecc8eb, -0xffecad41,0xffeb69cf,0xffeab7f2,0xfff22098,0xfff2ca7d,0xfff1d674,0xfff062ee,0xffefd2a8,0xffef10b3,0xffee8d8f,0xffeea8a0,0xffeee9b4,0xfff0235f,0xfff1233f,0xfff228dc,0xfff307bb,0xfff4601a,0xfff51e0e,0xfff528b6,0xfffc34af,0xfffb4f23,0xfffa3a48,0xfff7d21b,0xfff7688d,0xfff65ac1, -0xfff52ed5,0xfff45f53,0xfff35fc1,0xfff203f4,0xfff1e3fe,0xfff18359,0xfff18e93,0xfff1ad7a,0xfff22fd9,0xfff2bbd5,0xfff2cb3f,0xfff2a776,0xfff2d9e5,0xfff2a2fe,0xfff2a8fc,0xfff75925,0xfff8dc97,0xfff7b0c7,0xfff789ed,0xfff6df6e,0xfff53789,0xfffc7232,0xfffcfff7,0xffff91d1,0xfffe6f88, -0xfffe2588,0xfffe320a,0xfffd95d7,0xfffd6773,0xfffdc1d4,0xfffcd65a,0xfffce454,0xfff3ddac,0xfff859bf,0xfff95b14,0xfff921fd,0xfff7dc70,0xfff74dcc,0xfff5c6e0,0xfff7979d,0xfff81405,0xfff8039b,0xfff88b52,0xfff7f647,0xfff4e575,0xfff789a8,0xfff8c3af,0xfffc301e,0xfff93710,0xfff8f22b, -0xfff9617c,0xfff979bb,0xfff99cbe,0xfff5d4d0,0xfff6dbf9,0xfffe33bc,0x0000a067,0x00022e0b,0x0000fd05,0x0000b2f9,0x0000a577,0x0000edd2,0x0000d9f7,0x00012c2b,0x00010350,0x00014df3,0x00011cff,0x00026597,0x0000dce0,0xffff6c3f,0xfffac5d8,0xfff7cd22,0xfff3b680,0xfff01b63,0xffecc284, -0xfff142d2,0xfff40b93,0xfff4e4a5,0xfff82ec7,0xfff65fcf,0xffeddcd9,0xfff3e281,0xfff7e897,0x0000547b,0xfffa09e1,0xfff8ae35,0xfff9d428,0xfff9e099,0xfffc17c7,0xfff0411a,0xfffe4a59,0x0001da99,0x00006a47,0xffff5831,0xffffa3e1,0xffffccac,0xffffdbb4,0xffffcd8b,0xffffc3a5,0xffffb432, -0xffff9cb2,0xffff99de,0xffff9e6f,0xffff3349,0x00001be8,0x0001874b,0x000052a2,0xfff9a355,0xfff5207d,0xfff09a8e,0xffea4e1c,0xfff2b6dd,0xfff69280,0xfff64c88,0xfff94ce6,0xfff4a322,0xffe6350f,0xfff3e2e8,0xfff9a548,0x000b1a8b,0xfffb1b32,0xfffb84ef,0xfffeae0a,0xfffc5a2b,0xfffa8833, -0xffedcab5,0x00025287,0xffff93ba,0xffff74ce,0x00006056,0x00004464,0x00003a8d,0x00002ae8,0x000043f7,0x00001fda,0x00003712,0x00003f2f,0x00003088,0x000024de,0x00008e0e,0xffff4f69,0x00002c60,0x00004bf6,0xfff5ec3c,0xffe82431,0xffdc67f7,0xffd0c787,0xffdf2461,0xffea3787,0xffeedc13, -0xfff85ebc,0xffeed838,0xffd55443,0xffe6aeff,0xfff82b36,0x00121192,0xfffd5602,0xfff71a03,0xfffd41d6,0xfffc6657,0xfff9840d,0x00047e23,0x00007bd0,0xffffbefe,0x000051f5,0xfffff568,0xffffac1c,0xfffffb0a,0xffffe274,0xffffe6ad,0xfffff7a3,0xfffff009,0xffffdff4,0xffffed90,0xffffccad, -0xffffe5c3,0x0000419c,0x0000020b,0xffff46ff,0x000fa7d1,0x001a84f8,0x0026e6ac,0x0031604f,0x002fffce,0x00236721,0x000c6647,0x0000c3dd,0x0004d756,0x000ee0d9,0x0021e488,0x00192666,0xfff11204,0x000d0c77,0x00132c28,0x0015785a,0xfffdea32,0x00114cae,0x000b845b,0xfffb4790,0x0001ef21, -0xffff0023,0x000095a4,0xffffe55f,0x00004b98,0xfffffcfb,0x000010ba,0x000009a0,0x0000117f,0x00000fbf,0x00001870,0x000019d4,0x000015ce,0xffffe8eb,0x00002563,0x00013245,0xfff2649a,0xffe014ff,0xffd262bc,0xffc927d6,0xffcba083,0xffdeb49c,0xfffb53c2,0x001a0ef7,0x00212c4c,0x000d0c34, -0x0002ca61,0xfff9659d,0xffed66d9,0x0007fc36,0x00176925,0x00218e0c,0x001e48d3,0x00081b43,0x000f3f53,0xfffef095,0x0000460f,0x000020fe,0x000010bf,0x00000fe3,0xfffffc74,0xffffe34f,0x00000015,0xfffff210,0xfffff585,0xfffff87f,0xfffff3d4,0xffffff9a,0xffffe30c,0x00005bc2,0xffff8936, -0x00003b7b,0x00086bae,0x001afe24,0x0028ce0f,0x00341561,0x003263e6,0x001dd7de,0xfffb2ca3,0xffdec853,0xffdd5993,0xfffbe414,0x0014c776,0x001b0b01,0x0012d53c,0xfff1f97f,0xffdb7ec6,0xffde4459,0xfff72adf,0xffd82ce9,0xffd18b95,0x00098cfb,0xfffd70dd,0xfffffe37,0x000024af,0x000000fd, -0x00000b3a,0x000010e0,0x00000d5a,0x00000b64,0x00000fd7,0x00000f5d,0x00000a5e,0x000016a6,0x000017dd,0xffffc162,0x00005d37,0x0000a16d,0xfff30fe8,0xfff06c2e,0xffed49be,0xffeba4ed,0xffefb444,0xfff785ba,0x00007cd8,0x0021048e,0x002beb82,0x00299bc4,0xffecd1fc,0xffd6772f,0xffe93b46, -0xfffcddd6,0x00145bf8,0x002f25c1,0xffed9126,0x0036b0af,0xffe152ec,0x0002c390,0x000197db,0xffff02ba,0x000091db,0xffffae96,0xffffeb4a,0xffffe29c,0xffffe82f,0xffffef71,0xffffeb55,0xffffe99a,0xffffe7b1,0xfffff106,0xffffcb94,0x000089d1,0xffffd0ad,0xfffe4208,0x0010c8f2,0x000b0d52, -0x0007f9c2,0x0000859b,0xfffc754e,0xfff702fa,0xffee9f6d,0xffed0b4e,0xffeb1eaf,0xfff3f8fb,0xfff8a58a,0x00094d5c,0x001d1b87,0x00308f52,0x003e5e5a,0x004d191c,0x004bf21c,0xfff40c3e,0x0008b483,0x000317c6,0xfffcc23b,0x000189bf,0xffff95dd,0x0000a766,0x00002938,0x000047f1,0x00002f05, -0x00003256,0x000023a4,0x0000310a,0x00002837,0x00006246,0x00000eae,0x00005b9b,0xfffeb562,0x0001f165,0x0010f66a,0x000e1661,0x000e3da0,0x000a1a2f,0x00070cd0,0x0001bfea,0xfffb7500,0xfff7542b,0xfff5fb9f,0xfff57722,0xfff4e299,0xfff2466b,0xffefb673,0xffe8df3f,0xffe7b0db,0xffe95d40, -0xffea8d38,0x000eaf12,0x001300fe,0x00049276,0xffffa528,0x00003982,0xffff6031,0xffff6fe2,0xffff8388,0xffff7f71,0xffff90f4,0xffff86a4,0xffff9a4e,0xffffa0c7,0xffff9e01,0xffff9fae,0xffff770f,0x00003db0,0x000228b1,0xfffd45a8,0xfff5c07d,0xfff67840,0xfff571ca,0xfff524e8,0xfff38927, -0xfff22246,0xfff0669a,0xfff1146f,0xfff0fd73,0xfff0e1ea,0xfff5419a,0xfff98133,0xfffe1253,0x00024edd,0x00062379,0x000a2633,0x000e7617,0xfff88f38,0xfff9b71c,0xfffaa77b,0x0000aff4,0x0000bbbc,0x0001d447,0x000175b1,0x0001bf9e,0x000125a3,0x00017846,0x00015db0,0x000177c7,0x000131a3, -0x00017a50,0x0001699c,0x0001d457,0x00010ae8,0xfffe4043,0xfff99463,0xfff916b4,0xfff8d5d0,0xfff780fd,0xfff6f516,0xfff5f272,0xfff55f9e,0xfff49635,0xfff58cae,0xfff65bc9,0xfff6acb2,0xfff6b9f0,0xfff657c6,0xfff5e0a6,0xfff64f60,0xfff6da68,0xfff6cff7,0xfff78167,0xfff939b0,0xfff9cbe2, -0xfff79681,0xfff6efd6,0xfff60bef,0xfffcef12,0xfffc9aee,0xfffcff38,0xfffcfd81,0xfffcff0e,0xfffcf933,0xfffd051f,0xfffd11c2,0xfffd35df,0xfffcb524,0xfffcaf46,0xfff68911,0xfff779ec,0xfff7be7c,0xfff82f76,0xfff758ca,0xfff72d7a,0xfff6c569,0xfff685bc,0xfff63a4c,0xfff5ad85,0xfff5fdc3, -0xfff62cd1,0xfff6a08b,0xfff6f7fb,0xfff78045,0xfff80434,0xfff8484b,0xfff884ee,0xfff8f780,0xfff924db,0xfff60a28, +const Word32 defaultHRIR_rom_ER48_fx[HRTF_MODEL_N_SECTIONS * 470] = { +75421488,66224256,87588992,74644368,88538160,124750960,70779776,76065512,113076712,117758280,114685712,99697720,114338256,116987096,114060192,73846616,64704504,127022976,76461672,66327712,73764184,57289788,63951156,65053180,66401008, +67760256,69310184,70635240,72716416,75132880,78649848,81648760,86437904,84547160,82224888,75758448,75321056,99439824,100628176,109349728,64449932,52442920,44442504,43599928,37176108,43589180,44530888,42711168,44908180,38576748, +38818536,33849976,34737664,44881992,40015848,66432004,63649028,65431972,71844664,78121816,81498144,85632224,90158168,93784688,100936704,111611168,126930160,141742384,157781824,156277248,145277472,121399448,114268456,146810800,102723760, +79499552,56695640,42793024,31050612,25412212,21555576,20997880,16785472,24165976,20912708,18893980,17966132,19741752,20424100,24245388,25700356,36420868,40275208,63732708,68074304,85668272,92954112,103996912,116945160,127798752, +146493824,171331216,202969216,234090512,269755840,259001488,234068368,183959568,159857936,219898048,121298512,90777008,48707120,32353624,22456932,13937132,8583998,6517476,6497729,8690544,7540200,6852066,6282912,7065386,9215860, +13204213,15051976,23088572,29238060,56821432,67053460,89874848,96933928,111367568,126521144,137433968,164166416,214706352,291976320,371027520,458661312,451654336,386386592,296342656,234387936,488448576,291939136,216155104,99611456,61464408, +42137428,30411988,19383888,12379842,9256454,9155787,8925679,8599322,7081502,7766493,9997374,14396740,22068792,36275832,49600996,93609600,121256600,202054144,262723376,345578368,433428224,498107616,545006016,558819840,554094208, +531073696,523858272,491105120,477940448,503061440,449774848,730037440,231282608,212724160,91087816,70088120,39238828,23877348,20035256,13905924,12727064,13401412,10900714,9522040,8159514,9502980,12235388,22497496,30592580,51941232, +58847448,114612384,145025056,236586928,292168160,389649984,503192704,541963008,564510592,574496896,574738880,592281728,629555264,610192704,601520960,734607936,714238016,1145496320,460382784,330173376,106661248,120622088,51234424,41394772,20607976, +15223756,15654359,27794480,16936096,14981095,18505708,15808716,22440440,34557552,36453820,53240116,59648832,117133464,144459312,233429056,329205280,461450528,591073984,643574848,644486656,623997888,556742976,548754048,658636672,716869440, +832329024,1324736128,1002425856,1313010176,558723200,335545600,117782664,66583688,42042256,24070128,20525192,16556179,18798380,42853292,16726026,13615365,17043464,19207244,24016144,35717112,40501300,59243928,62697224,105314416,120222288, +171948224,242253296,333960352,435754560,524381152,585821568,640940160,649596416,605304384,550474112,613610496,773724096,1350735744,1004565760,743259136,471401536,326453056,138675744,81379080,52298476,33441632,31354236,23880972,21675504,28750284, +19053176,17541292,18797248,23132472,29873624,35500988,44805260,74579464,83362272,106309360,112618616,133579280,166289216,226784000,314013440,396606944,457914880,509649376,442082304,427902400,459266688,464458048,504540160,651223552,650342400, +291511840,248574640,186206976,101069672,65631792,54126704,35604880,28052852,26639612,26588708,25835716,23928220,22236928,22636340,27086708,37212216,51523300,56322976,72167920,80651536,102824552,101602792,112910008,143314672,170770880, +186631904,205188784,232145264,265411040,281733120,288057344,302465696,302180160,298404608,285489216,281145760,186144896,149568000,125116280,102707168,83975880,61488484,49495912,36197156,42609100,32920328,44870348,38559452,41624904,38328040, +46192276,47745708,58240672,64057852,79117584,86216800,105209520,102730304,113737520,126649872,142559504,159006528,176140528,196628320,223729120,229020480,238049584,254429392,243498016,238453840,241963760,203207328,140183312,150186560,166778128, +110090840,100592840,90964896,85920656,75354504,86722328,90087344,81684152,89918920,81199400,80749520,73333392,78137552,87154752,81248392,115037056,108379344,106548632,113522464,119119200,125257520,133496288,141097360,148123696,155140368, +163783216,172022384,180513456,193475872,178366544,166416560,157244752,149119520,121750544,147847872,134874288,149567488,201409728,131483584,135821616,185080768,195063952,192439024,171952576,193081376,201267056,195741600,133270368,120770272,211747536, +139399968,123320016,130850608,109763872,117603472,118287960,120197808,121540424,122726288,125115024,127616312,130416888,133960824,137312752,143546784,138353888,136107232,131999184,132069216,155484208,457273,314253,683386,581187,803765, +1421306,628618,647317,1204118,1313007,1308723,1129859,1361243,1384322,1354386,668456,593758,1572319,697816,584758,669173,369500,473550,478497,484861,483038,473061,454101,455632,467410, +510084,534143,541913,555154,500607,325936,396621,351944,616509,795897,418871,341006,147823,189171,151274,288069,357304,348267,384827,250363,244886,133427,144102,361950,261766, +642108,601045,615719,714357,814900,835658,808138,747364,677190,677512,743930,849290,931779,906158,976519,748328,264807,363298,430994,464097,419438,265309,390177,115806,94701, +105639,154204,164421,292305,258739,168097,123398,142887,196401,291486,324267,443254,441738,905488,885768,1175234,1220563,1212571,1193889,1046466,1093593,1253726,1439391,1678334,1630454, +1834686,1212165,210407,390184,394926,339317,442718,508775,814585,153209,166316,106459,210788,277966,408274,303357,199631,123690,161554,312804,546620,524392,583833,574010,1249096, +1482726,2206001,2353242,2338538,2147563,1902226,1875918,2125725,2339997,2645669,2557584,2915642,1622324,162949,187794,2188223,958985,1833393,1186453,702185,294446,531704,415967,414394,309992, +381102,91564,72911,163137,198629,285487,500394,577204,581726,540562,1331008,663538,883629,311319,322429,620774,1212754,1660632,1998339,1865438,2389470,2915959,2715693,2643784,2891293, +1893127,959537,2538637,2115069,1516506,780840,430963,437548,240456,68595,53196,170307,168852,140014,88661,135332,174710,154792,115236,202823,235356,806187,1210223,2391229,1243730, +592033,254169,225679,218992,315008,339743,337178,748998,1145655,1570532,1498396,473253,781838,1038301,795880,529072,445521,322701,208367,157291,125962,71446,14757,18025,36313, +42852,42951,96611,95338,91964,192459,373732,320005,166548,132426,773843,2081530,3182594,3477588,2629625,1352419,2286076,3953474,6952370,7904998,7103491,5304091,1266694,5148313,2291327, +1889974,1532206,870632,422318,195813,211700,74650,54491,40090,24969,21041,42481,58117,92666,95941,109676,145494,182475,403576,640643,817831,740245,511403,293254,476599, +574740,749269,713602,707687,1040836,3620042,6894042,10950455,6782719,8917193,5885569,4130911,2766075,2162604,2151464,1424257,520865,302189,153875,76239,45360,36539,69486,35551,36008, +70657,59410,122068,106432,90987,79724,87662,104259,228289,689802,849842,1174731,1913469,1499283,1879913,3005181,4459405,5009937,5702046,7119094,2749564,2748692,2590934,2040421,1723148, +1439468,1352443,1468709,1209730,921485,608395,477633,340349,242219,123139,75130,88934,66516,73558,61515,204024,366606,444512,592326,640227,585633,735997,748552,726077,752201, +1006267,2281345,2103228,2121678,2041208,2133655,1519549,1441779,1382329,1328585,1340032,1173910,1045071,962337,834592,731890,713881,524073,423702,332214,213330,131625,100547,68969,140290, +172598,231512,257042,354545,409905,490249,602545,764424,1017392,1336220,1535200,1907676,2547717,2062728,1877947,1997967,1611507,882005,955399,1021380,844496,827918,809408,804593,797183, +741289,687385,618432,583715,489646,440989,331198,247314,280899,204552,198334,172043,206425,262702,321828,392976,471420,566183,604783,676975,761687,866429,978485,1204426,1066373, +984349,919749,893187,727647,791990,828017,880275,1059017,822546,836569,1009491,1025918,1025960,958025,1038821,1081995,1074472,717983,632366,937701,631438,540473,447730,458078,490941, +518187,544419,574490,604551,642007,683729,734621,773831,819433,894175,831760,804340,769968,766380,901546,19002,13515,30858,26625,43626,63837,24954,33871,56400,61723, +60824,51060,61846,63170,60335,36632,25812,70011,37175,25963,27636,14388,19396,21187,22792,23045,22556,20663,20786,22177,22339,22432,21211,21651,20012, +15496,17111,20413,26393,41313,15151,16713,5966,7563,10726,14146,16857,18149,16366,11639,10196,11180,11023,13770,8082,32630,23366,26278,33904,48665, +60921,62806,53678,38074,32335,39812,38362,39459,34899,40377,35955,25803,22961,27186,21181,17708,8737,22652,4019,7504,28722,41517,57346,62852,27157, +13966,17946,16042,19989,8651,6591,15065,17965,36817,40418,73568,98125,104128,97011,63669,59982,83339,74275,75276,69066,82591,68251,43168,32258,57745, +15879,20022,22988,66521,14800,40396,68167,79168,88687,41643,18341,17021,19434,26400,40789,29803,16187,40199,61848,90489,120594,231109,326881,360742,287356, +137028,79683,148030,108386,115650,112849,163459,149593,138921,77059,348813,154935,180845,102772,54095,76544,85288,97444,35727,3388,2631,22690,16992,18628,16707, +39415,77633,103737,157004,204237,262814,199384,208094,177566,225349,273953,196458,255809,291358,187958,129178,184915,128595,150104,270732,312545,110583,90845,211396,98649, +123900,241238,251174,66369,15609,2393,6422,14865,11453,9781,2469,5952,7758,10460,24058,53638,68015,109795,164208,144249,132651,223856,232013,185725,260635, +56433,51422,84101,300011,282178,208417,98408,420494,1851769,1027142,449763,85713,18905,17047,19197,11060,3715,902,2482,425,8599,7130,11583,12471,6924, +11777,20078,27102,33808,56340,109076,175226,259840,249075,179399,251592,362236,427387,584978,543929,480370,498061,121816,401282,963117,463386,397726,200405,22573,15961, +11250,602,262,1283,982,470,1219,376,3853,17707,23935,33545,35171,42853,46717,63163,61978,62659,60704,52050,36067,76484,114043,96856,191516, +255872,434039,599269,301851,302404,249742,266692,161229,36615,6950,2305,8062,5198,4769,3446,2659,1501,1056,5694,18059,44080,58201,72723,63696,46616, +27588,12382,7942,27033,79760,106767,152121,203228,176326,163712,164015,193104,182141,202238,273251,118481,100918,81429,62231,52482,45795,34890,26498,26953,23585, +16407,12208,6524,9000,10023,10752,11243,15616,18671,16749,10728,10205,10453,19612,36023,52869,73671,84758,92716,83405,88914,133347,102481,90500,96606, +102612,51225,54022,55881,53909,63740,54179,45450,43776,35496,31785,32381,26061,25796,29318,21285,20483,26448,22044,20707,17852,16413,13152,13826,11313, +11101,12446,10705,15526,27289,29283,31064,37601,29181,27517,32645,39836,33737,39200,44725,35194,38548,39226,43925,49207,45758,42977,42288,40485,38572, +40904,34575,28945,28100,24786,25343,25408,22144,19700,17466,15638,14388,14205,14816,17167,19894,22706,26080,32043,27435,27118,28368,31638,20112,22949, +26060,32123,39073,26449,31859,42024,43634,45237,42498,48147,50819,51995,35656,28780,44093,32574,26537,25241,22243,21888,20829,20283,19812,18732,18977, +18748,19058,19401,20275,22012,20878,20401,20196,20284,28572, }; - -const UWord32 defaultHRIR_rom_EL48_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { -0x047ee788,0x04713840,0x0529a410,0x03f0b798,0x047f3c18,0x04837bb8,0x04e6ef58,0x050a0848,0x0526d1d8,0x04dde4d0,0x04b03170,0x047a5f98,0x04557be8,0x0435aef8,0x04219f28,0x0409e930,0x03f53628,0x03e081f4,0x03d08964,0x0369480c,0x0461f8f8,0x03f57950,0x04942f18,0x079476f0,0x03dd0b88, -0x04674460,0x06ce48b8,0x06f8dec8,0x06d02058,0x05eebea0,0x06d4bdf8,0x070a0ab0,0x06c2bbc8,0x04869fb8,0x043c8778,0x07602090,0x05466bc8,0x06734928,0x0623ed08,0x05ecd400,0x06cb3718,0x073ef9f8,0x08a6b430,0x0950db10,0x0967f000,0x08730820,0x0790aa90,0x06a725e0,0x06043808,0x05971410, -0x055f9e40,0x051af2d8,0x04db0270,0x04a8cbc0,0x04471a50,0x03e65d80,0x03d55ac8,0x03f1c30c,0x0262b518,0x02aa95ac,0x020ed324,0x020401a0,0x02518068,0x024c6378,0x02ac6c04,0x028bd768,0x02a47034,0x029fb52c,0x023afb38,0x029aee10,0x02ab931c,0x03179200,0x03cc4100,0x04b6e170,0x05df2bb0, -0x08df63b0,0x09850580,0x0af4f390,0x0df633e0,0x0f701810,0x101271e0,0x0df3a680,0x0c19c660,0x0a3635f0,0x08bb2910,0x079d8690,0x06f88bf8,0x06329f50,0x058aaa60,0x051baa78,0x040cf888,0x03d4db3c,0x0256c2bc,0x022f9468,0x018def10,0x017408d8,0x013c617a,0x012fb63e,0x011198c4,0x011fe900, -0x01411f90,0x016e0bda,0x0103c6d2,0x0143d1f6,0x01458bb8,0x0184cb5e,0x01ccadcc,0x0295b4e8,0x03662edc,0x05779610,0x07f710d8,0x0c445550,0x0e438ad0,0x1188e8e0,0x171c20e0,0x1ada0d40,0x1b6493c0,0x16192cc0,0x11677b40,0x0ccb4360,0x09ca18e0,0x0830e800,0x078c3a60,0x06a08cf8,0x05cd1118, -0x054eadf8,0x0414b7c8,0x033acf98,0x01e9b21a,0x0160ca16,0x00ef6077,0x00c4b0ec,0x0085342e,0x006c60d4,0x005f88cd,0x0068975f,0x00741f56,0x00849cbf,0x006357bd,0x00659d8b,0x0086da74,0x00ce2e2c,0x01862670,0x01d2066c,0x02f90050,0x0c7f6490,0x14248b40,0x1a759580,0x1bcefec0,0x1d850a60, -0x1cb27bc0,0x1d2c0a00,0x1f48b040,0x1fa5a680,0x2106e2c0,0x215071c0,0x207a2f40,0x1dac2c80,0x19dcbbe0,0x149253a0,0x0fb48130,0x0bf3f700,0x075c72e8,0x05423308,0x0353ba94,0x02498c04,0x01465f62,0x00e61c88,0x0097185e,0x007ce61d,0x0067d1ee,0x0083dfbc,0x00880ea1,0x008bfb8e,0x008e3e9b, -0x00ba2b8b,0x012fa7a4,0x01bf3ebe,0x02b2ff8c,0x03acf244,0x070e78e0,0x0ca20140,0x0f890ed0,0x29354340,0x2bcf8040,0x2b3a3e80,0x240b8800,0x24489e80,0x25947fc0,0x234bc5c0,0x22403600,0x223ca000,0x21a3e3c0,0x2049b680,0x1e08af60,0x1732d8c0,0x1173c560,0x0e068b50,0x08be8a00,0x06ad6568, -0x03a3bb24,0x0316dae8,0x01d0338a,0x0143dbea,0x00c288a4,0x00951188,0x007a93fd,0x00904a92,0x00a6fca8,0x00cf20b7,0x00c09322,0x00d9f3cc,0x012d57e0,0x01910c14,0x02554ed8,0x03b701b8,0x06253a60,0x11551d60,0x1f1676e0,0x4044b000,0x3da3bc80,0x4e17c500,0x31e73a00,0x2a9f9500,0x2751f000, -0x20b2e400,0x21318200,0x2531f5c0,0x2669ca80,0x26535c00,0x23492840,0x1b788160,0x13a8fa20,0x0ddb62b0,0x08b1d4b0,0x06d676a0,0x03af2978,0x032347a4,0x022ffd94,0x0221dcf0,0x01441378,0x00f73fcb,0x011cb7be,0x00e759bc,0x00ff6a8d,0x01a48b34,0x00e7597f,0x00e70b0f,0x013c8d22,0x02ae4ec8, -0x02f0e6f0,0x07b76160,0x05f5cdc0,0x138c50e0,0x28bbd780,0x46277d00,0x3ebff580,0x4f610000,0x2e7bb300,0x2478e300,0x20d23a40,0x2413ebc0,0x26b52200,0x26356b00,0x22e968c0,0x1f3c8440,0x1a00eda0,0x13e04ce0,0x0e7bd920,0x0a2bc440,0x074c8bb8,0x060a9228,0x040a6380,0x03830810,0x024fb50c, -0x02148b64,0x016f7ce2,0x011eb7e8,0x00fb9b42,0x00d09e3a,0x01027b8c,0x029a5434,0x0124cdc6,0x00fc2af0,0x0147ac78,0x0181d576,0x026f93b4,0x038fccec,0x05e7e960,0x102cf660,0x1a7a7ae0,0x2c199640,0x26fd9d40,0x26a159c0,0x1e245ea0,0x1bab0780,0x1b6280a0,0x1980e7a0,0x1a58bfe0,0x1e617140, -0x1b48a2c0,0x17a105c0,0x12bb4020,0x0d828c30,0x09eb26d0,0x07f1e260,0x06c16588,0x06317170,0x052caff8,0x03f8c410,0x02eafcf0,0x0220fdec,0x01be0c20,0x0176ca92,0x0122d932,0x010ae908,0x01246a7c,0x01c39e6e,0x01477936,0x0163129e,0x01ca2e50,0x02567c68,0x02ece5d4,0x0466ca00,0x0c3a2e90, -0x0f289960,0x0e3e8c90,0x11fd0680,0x108e66e0,0x11180280,0x11c29d00,0x1203bb60,0x12083580,0x112c6cc0,0x10ca35e0,0x0fd258b0,0x0dd57410,0x0c3b1710,0x0b1f8960,0x0a2f7110,0x08866af0,0x06c55750,0x05f76da8,0x06658848,0x0483a1b0,0x048a3498,0x0368db0c,0x033f1f24,0x02437f8c,0x0198f898, -0x0153a220,0x0153ddba,0x016d4c8e,0x019e5a42,0x01948648,0x019641f0,0x01aed59a,0x021b9ec4,0x02eee54c,0x03ad5210,0x06315d90,0x074324c0,0x08fc5a60,0x0af9c4f0,0x0c24b8a0,0x0e698b40,0x0e373a80,0x0e840c30,0x0f2a08d0,0x0e309060,0x0da68af0,0x0d5591c0,0x0bb87800,0x0a7ffaf0,0x097a4700, -0x087f8630,0x078c1ff8,0x06c7dbd0,0x062077e0,0x06381f98,0x054738b8,0x04b0cd00,0x03d48254,0x03581e28,0x02d0cf74,0x02c26abc,0x025017a8,0x027cc68c,0x024ef0d8,0x02af6178,0x01f80434,0x0286c61c,0x0229ac74,0x02f85a2c,0x03becc18,0x0526b818,0x05def660,0x0a70a8c0,0x08d26d40,0x086397f0, -0x08e37d90,0x095e3750,0x09ebe390,0x0aa105e0,0x0b888390,0x0ac28de0,0x0a40c2e0,0x09c30e80,0x093f64f0,0x08d419a0,0x08691270,0x07f4f188,0x077796b0,0x07190288,0x06c584a0,0x065ad0b0,0x066464b8,0x06ed5930,0x04dc37f0,0x05305e80,0x04ab0e98,0x045a38a8,0x04c4df58,0x04d51490,0x055db0b8, -0x04e1a428,0x0558f988,0x052b1f90,0x04822f78,0x051d4b90,0x055af080,0x05e288b0,0x06bbc6d0,0x07fcd0b0,0x08eb71f0,0x0740fbe8,0x07dd5a50,0x07def188,0x081c9770,0x083f32b0,0x088e4a80,0x082f0f50,0x07fc2d08,0x07c5ceb8,0x079b4468,0x07753950,0x07509840,0x073e8a48,0x0729f358,0x070d07e8, -0x0700c520,0x068c57b8,0x07dba610,0x0758e450,0x0849b810,0x0c78aed0,0x0733fac8,0x07f231b0,0x0ba7d680,0x0bfe2840,0x0b8520c0,0x0a3fc6b0,0x0b73f8c0,0x0ba35810,0x0b0c2ac0,0x08203210,0x07ca9cd0,0x0c67e180,0x08feb900,0x09449080,0x0006fc56,0x0008df1f,0x000a4278,0x0004cb61,0x00061183, -0x0004f88b,0x0007a721,0x000879d6,0x00084462,0x000826b9,0x0007c6d3,0x00072255,0x0006f4d1,0x0006ed76,0x0007381e,0x00075eb1,0x000768e3,0x00074e2f,0x00073e30,0x00059e09,0x000a1ac9,0x0008f8df,0x000ad6e6,0x0017f2f1,0x00090cf8,0x000a344b,0x0014b1c1,0x001521ca,0x0014c9e9,0x00113cfb, -0x0013f39e,0x001410ea,0x00126b03,0x0009dca1,0x0009aee8,0x00158650,0x000c47be,0x000bed8b,0x0009c642,0x000556fe,0x00058723,0x00040d7e,0x000b6255,0x000ee551,0x000dd548,0x000e3bb6,0x000cf42d,0x000b55d5,0x000a5727,0x000a575b,0x000b67ed,0x000c5989,0x000cbd8a,0x000c707c,0x000ade5e, -0x000960e6,0x00097a54,0x0009b236,0x0003d625,0x00056afe,0x00023d58,0x0002070b,0x0003b591,0x0003d353,0x0005e78d,0x00055cfd,0x0005763a,0x000465a7,0x00024e7c,0x0002e3e8,0x000240c8,0x000506d1,0x00064371,0x000658be,0x00067677,0x0006db36,0x0005e7ba,0x0003375f,0x001284b7,0x001c04d4, -0x0018daac,0x00199664,0x0015f9ac,0x001320c6,0x0010aef4,0x000ff7f6,0x001235ac,0x00127fd2,0x00129e0e,0x0011f4a8,0x000d78dd,0x000e1153,0x0006469c,0x0006dd11,0x00054163,0x00048ce1,0x0002f3cf,0x00024184,0x0001e218,0x00029502,0x0003f2be,0x00046c67,0x000286aa,0x000265cc,0x00019c56, -0x00017394,0x0001c8e8,0x00062252,0x00042855,0x0006e44a,0x0006c633,0x0004def7,0x00030808,0x00027ebd,0x0018c968,0x002c4ba5,0x00272969,0x00285429,0x0023b60d,0x00206cae,0x001ca112,0x001cfd55,0x0020d9f8,0x002392f0,0x00242754,0x00213255,0x00176a01,0x0011b0af,0x000a216b,0x0008e65a, -0x00084098,0x00082551,0x0004ab60,0x000279dd,0x0001dfb0,0x00031336,0x00049d21,0x00063cad,0x00043ebb,0x00033a7b,0x0001a04f,0x00028e3a,0x000252b5,0x000c4521,0x0007d02b,0x001cbe59,0x00135b3a,0x001baf78,0x001f10c6,0x002b22db,0x0028dc28,0x0029273b,0x002cb33a,0x00246c03,0x001c83be, -0x001e7015,0x00194ded,0x00127479,0x0009830f,0x0004e356,0x0004d96a,0x000d1b41,0x000af2ba,0x0011c250,0x000add73,0x0009f44d,0x00085465,0x0007bb19,0x000460a4,0x00031d10,0x00026d79,0x00012060,0x000167fb,0x0005cc43,0x0004c3ff,0x00064d09,0x00066521,0x000817a5,0x000491c2,0x000a96a6, -0x00149d7a,0x001ec756,0x0028954a,0x000da90c,0x000782d1,0x0016dfe9,0x0017f089,0x00116698,0x000b844b,0x00052588,0x00052c29,0x0004cb1a,0x000357c2,0x00036ee5,0x0003e3b7,0x0008fd64,0x00132650,0x0023ff0b,0x0012ff5b,0x000bb185,0x0004030a,0x0002a2ae,0x0001d271,0x00023d54,0x0002b35a, -0x00022ae8,0x000151fd,0x00022318,0x000295c0,0x00029690,0x0000d85c,0x00010d2f,0x0003b1e3,0x0006d54b,0x0006bec0,0x000a5c57,0x001849e4,0x000bbe10,0x000ffb4b,0x000bb429,0x00139559,0x005099df,0x006c795e,0x007850d1,0x006a5e77,0x003c4f07,0x0022e8a7,0x00149e82,0x0028203d,0x0034fc62, -0x0030afcc,0x001faf17,0x000bdef1,0x0002031b,0x00029047,0x0004ba1a,0x000645db,0x0002e7f6,0x00014b1a,0x00018ff6,0x00016526,0x0000a80a,0x0000a76c,0x00008d43,0x0000465a,0x000039b0,0x00011bc8,0x0001e771,0x000262de,0x00035066,0x0004d778,0x00070aa2,0x00082857,0x001c3030,0x002426f0, -0x004be8d2,0x00694b32,0x00a60355,0x006981bd,0x00371fca,0x000fe69d,0x000acd4a,0x000adc17,0x000b7434,0x0008c298,0x000744a1,0x00047daf,0x0007c815,0x000b5a6a,0x000c4fd5,0x000a0c31,0x0005cbc3,0x000307af,0x00024155,0x0001a290,0x00016e7e,0x00015fc4,0x0000df0f,0x00009e3c,0x00005504, -0x000064bd,0x0000a43a,0x0000d0ef,0x000128de,0x00039257,0x0002dfe6,0x00067fc4,0x000d759a,0x00151f3d,0x003a4127,0x00594d27,0x0087c3ae,0x006cf9a4,0x0056d150,0x004c821e,0x0043e91d,0x002df039,0x001ca79f,0x0016e6cf,0x001d26dd,0x0011ef5c,0x000cf26f,0x000a9060,0x00037a21,0x0001981c, -0x0001550e,0x00013719,0x00015ae4,0x0001c5bb,0x00016554,0x000126d1,0x000106ea,0x00008dc2,0x00008f4f,0x00010a6e,0x00008f9e,0x0000b6fd,0x00012d9a,0x000254e5,0x0004978e,0x000818bb,0x001646d6,0x00205ae1,0x0021a0f8,0x002c5e35,0x002cdc81,0x0028fd8f,0x002acf86,0x002048fb,0x001f410b, -0x00204cd3,0x00200b31,0x0022ed83,0x000f57b8,0x000b795d,0x000b1258,0x000b69a5,0x000b3791,0x0008f18c,0x0009c4d7,0x000908d3,0x0006ca3a,0x00058f80,0x00033382,0x0000f6c2,0x0001222f,0x0000fedc,0x0001952b,0x00013f6c,0x0001d9a5,0x0003a591,0x00053755,0x0007506b,0x00094ce0,0x000e18fd, -0x00129fd0,0x001616a4,0x0014b3e4,0x0015421e,0x001956c8,0x00202045,0x0014f449,0x00165b48,0x001700fd,0x0018a196,0x001e7fc1,0x001ca7bb,0x001f7ecb,0x0026df2e,0x001d1dc8,0x0017703c,0x00146295,0x000f82bf,0x000ba7e9,0x0009349a,0x0007797a,0x000641ea,0x0005692a,0x0003eba0,0x00038139, -0x0002b4ae,0x0002186f,0x00010ee9,0x00017ed2,0x000200f2,0x00033fa3,0x000512e1,0x0006756e,0x0007fdcc,0x000aece7,0x000b1d30,0x000ca9e0,0x000ecd85,0x000ff899,0x00126206,0x00154015,0x001416c6,0x00103a48,0x000e58f6,0x000d81b6,0x000da472,0x000e04ee,0x000f0768,0x0010461f,0x00126206, -0x000eef73,0x000d38d1,0x000b9f56,0x000a5783,0x00093893,0x0008a6f5,0x000733b8,0x0005fe70,0x0004e9c9,0x000401b6,0x00032654,0x0002981e,0x00030aa0,0x00031cd4,0x000445fe,0x0003cc43,0x00050f3a,0x0006b73d,0x00077c74,0x0008ea2f,0x00096b66,0x000a7f99,0x000b544c,0x000c26da,0x000c3ea5, -0x000c3298,0x000c943d,0x000d35e9,0x000ca0cf,0x000c3e08,0x000b1bd3,0x000bada6,0x000bbfd9,0x000c494a,0x000cae12,0x000da71d,0x000c80aa,0x000bd2e0,0x000b3531,0x000a703e,0x0009cf42,0x00093aed,0x0008c20e,0x000851fd,0x0007e706,0x00077c55,0x0006fe57,0x0006d85a,0x000840bc,0x0009999e, -0x000e2ae4,0x0009a19f,0x000aecd2,0x00105d40,0x001080eb,0x000fdecc,0x000e9ba7,0x000fa508,0x000fad99,0x000f71ab,0x000cce05,0x000c80ef,0x0010afd9,0x000d7bec,0x000dc1fa,0x000049bb,0x0000688b,0x000075e8,0x00003436,0x0000428f,0x00003cbd,0x00004e34,0x00005480,0x00005257,0x00005779, -0x000057a6,0x00005611,0x0000502f,0x0000508d,0x00005879,0x00005aaa,0x0000592f,0x000052d6,0x00004c08,0x00003834,0x00006bb1,0x000065f6,0x0000937c,0x00011159,0x0000646e,0x00008f87,0x0000ec07,0x0000f6a1,0x0000f226,0x0000c792,0x0000ed9f,0x0000f089,0x0000dc9f,0x000084d5,0x00006213, -0x0000f7b6,0x0000aae2,0x00009e0c,0x00006c3c,0x00004f0c,0x0000593f,0x0000655e,0x00008be0,0x00009d49,0x00008862,0x00009a09,0x0000965b,0x00009b7e,0x00007e2d,0x00009496,0x0000d1c1,0x0000f584,0x0000ed58,0x0000bde2,0x00008410,0x000066c1,0x00005e9d,0x00007dd2,0x00001db2,0x000034c5, -0x00002bbe,0x00002b7c,0x0000276d,0x00002da0,0x00004019,0x000047b4,0x0000424e,0x000036f4,0x000029b0,0x00001d9e,0x0000174d,0x00003f27,0x000039d1,0x00004502,0x00004b97,0x00006e68,0x00007d61,0x0000a8e6,0x00010b52,0x000141a2,0x00010daf,0x000126eb,0x00012314,0x000146ad,0x0000e989, -0x0000f81a,0x000179e0,0x00019659,0x00017e2f,0x00011f1e,0x00009e5f,0x00009241,0x00004186,0x00003bfd,0x00001d34,0x00002209,0x00004e0c,0x00003ff8,0x00004664,0x0000372a,0x00006b3a,0x0000f5d2,0x0000dffa,0x0000a14f,0x000070b4,0x00001d34,0x00000f8a,0x00005aea,0x00002328,0x00005012, -0x00005266,0x0000d0fe,0x00012fe0,0x00021cfe,0x0002473d,0x00027c31,0x0001b982,0x0001c2dd,0x0001a771,0x00024410,0x000137e3,0x0002178f,0x000465b8,0x00057f01,0x0004ff75,0x000381a9,0x0001df48,0x00015497,0x0000fc04,0x00009e15,0x0000411e,0x00007468,0x00009cb2,0x000068a4,0x00004a47, -0x00004359,0x00004797,0x0000a43d,0x00015d58,0x00013470,0x00010a68,0x00009d59,0x000039e8,0x00010363,0x00005a7d,0x0002cf3f,0x00027ef5,0x00051abf,0x0004d9cb,0x00041632,0x00024f93,0x0001f3a5,0x0002d64d,0x0001f670,0x0002dd6f,0x000473b6,0x0003e4d9,0x0002fce2,0x00043405,0x00036e99, -0x0002b706,0x000326cb,0x0003165d,0x0003e40b,0x00033a6a,0x00027390,0x000191b3,0x0001320e,0x000099ae,0x000041e5,0x000046f3,0x00004334,0x000058d5,0x00000a55,0x00000d8d,0x00008b97,0x00017d89,0x00014e47,0x00012df3,0x0000cef3,0x0001b725,0x000323b1,0x00017cab,0x0001a1ae,0x00018344, -0x00032e2b,0x00044853,0x0004907e,0x00014a76,0x0000c8bc,0x0000dbdd,0x0003fca9,0x0002d402,0x000385b0,0x000370ae,0x00020571,0x0002328a,0x00027b9d,0x0001b213,0x00010514,0x0000d70a,0x0000548a,0x00002b15,0x00001d11,0x000018bb,0x00000b03,0x000025a8,0x00002cfd,0x00003a48,0x00001896, -0x000009a6,0x00003d7b,0x0001011b,0x0003e50f,0x0003a268,0x0001ea90,0x00018df5,0x000fa801,0x001c4aae,0x0006653a,0x0001df45,0x000795ce,0x0007573b,0x0008494e,0x0008f639,0x0006873e,0x0005854c,0x0003d929,0x0002bc39,0x0003ca3f,0x0003fa66,0x0002aa1a,0x0001abbd,0x0000dc1f,0x000084d0, -0x00006801,0x00005472,0x00002c52,0x000019d8,0x000032c1,0x00002d84,0x00001b7d,0x0000216a,0x0000019e,0x000009c3,0x0000038f,0x00000e9f,0x00002a8d,0x00004ce3,0x000043ca,0x00004a2a,0x00015497,0x0006eb03,0x0007120e,0x000ec3ea,0x0005fe24,0x0004aecb,0x00091d43,0x0006a344,0x0003e514, -0x0002f1d5,0x000179d9,0x0001bb00,0x00012b16,0x00008c97,0x0000cb80,0x0000ed7f,0x0000f48c,0x0000f309,0x0000f4f6,0x0000b9b2,0x0000a3b2,0x00008a1b,0x000081fe,0x00005d5a,0x0000461e,0x00000ed4,0x00000161,0x0000046c,0x000001c5,0x000003f7,0x000004c7,0x000000f4,0x0000027a,0x00002c25, -0x00003db2,0x00005801,0x00030fcf,0x00061174,0x0003dd0d,0x0003c9d2,0x00049b6e,0x00042f73,0x00031339,0x0002c6e4,0x0002f154,0x0002818a,0x00027fe7,0x0002b020,0x00031ab7,0x0002516f,0x0001a0bd,0x0001394a,0x000069cd,0x00001ee4,0x000030c1,0x00006bcf,0x0000b64e,0x0000fa9d,0x000112a6, -0x0000e076,0x0000b015,0x0000461e,0x000015b0,0x00000452,0x000005b4,0x00000ac9,0x00000d59,0x000012ce,0x000012c2,0x0000215d,0x00000ada,0x00001a5e,0x00008d94,0x00029562,0x00016edf,0x00017edf,0x0001d8f9,0x00018ec7,0x00017a2f,0x0001609a,0x000190cc,0x0002099e,0x00015c2c,0x000145d8, -0x00016ad8,0x00014afd,0x0001201b,0x0000ced3,0x00008cc0,0x00004ce5,0x0000290f,0x000027b5,0x00002a72,0x00004318,0x00004b34,0x00003b28,0x0000319b,0x00002b2c,0x000026b7,0x00002328,0x00001a0c,0x00002e7c,0x000040f0,0x00005b89,0x000068d2,0x00006821,0x00008796,0x0000b224,0x0000c716, -0x0000fd24,0x0000d8bd,0x0000d4f8,0x0000c604,0x00009cb2,0x0000807f,0x00006bda,0x0000724e,0x00009275,0x0000795a,0x0000726c,0x00006aaf,0x00003c92,0x000029e5,0x0000307d,0x00002b1f,0x00002cb3,0x00003636,0x000033d6,0x00003fe6,0x000046b5,0x000050ec,0x00005651,0x000065d7,0x00004f88, -0x000053b6,0x000071de,0x00006458,0x00006597,0x00007ec3,0x00007bc8,0x00008ab1,0x0000aba8,0x0000b132,0x0000d8ad,0x000102bc,0x0000d521,0x0000b373,0x0000959d,0x0000847a,0x00007b99,0x00006ea7,0x000069cd,0x00006b47,0x00007d6a,0x000065b4,0x00005828,0x00004dd3,0x0000432b,0x000039c8, -0x00003794,0x000038b9,0x00003d6e,0x0000442f,0x00004cb0,0x000056be,0x00006333,0x000063ac,0x00006094,0x00006dcf,0x000071ea,0x000086f7,0x0000a035,0x0000975b,0x00009e9a,0x0000a5e0,0x0000a79e,0x0000b23a,0x0000bfbc,0x0000abfe,0x0000991b,0x000097d5,0x00008cac,0x00006560,0x00005b16, -0x00004eb9,0x00004ef0,0x00004f16,0x00004fb6,0x0000510d,0x00005600,0x00004f04,0x00004bf4,0x00004a5b,0x0000497c,0x00004a37,0x000049e2,0x00004d5b,0x00004f63,0x00005179,0x00005522,0x00005687,0x00006262,0x00006816,0x00007ec4,0x0000abd6,0x0000706a,0x00008b60,0x0000ca1f,0x0000c5e3, -0x0000bba0,0x0000a655,0x0000b00c,0x0000aaff,0x0000a4e6,0x00007d8e,0x00006765,0x00009e3e,0x00007e4b,0x00007037 +const Word16 defaultHRIR_rom_Alpha32_Q_fx = 14; +const Word16 defaultHRIR_rom_AlphaL32_fx[470 * 86] = { +4109,942,4964,3820,4127,4092,4325,4412,4480,4339,4246,4138,4049,3978,3943,3907,3872,3853,3804,3552,4527,763,-763,-2805,1557, +-663,-2568,-2653,-2561,-2111,-2588,-2706,-2591,-644,2103,-2609,-946,-1406,4377,4770,4790,5008,5649,5936,5981,5652,5311,4948,4666,4492, +4424,4333,4212,4199,3906,3985,3419,-910,1922,1523,1386,863,1789,2007,1805,943,1981,2765,1748,2041,1081,950,3167,1006,3784, +5667,5262,5791,6992,7539,7682,7063,6415,5849,5315,4937,4765,4561,4327,4307,3668,3948,2214,552,708,807,914,7,966,-67, +1632,-320,1316,-67,619,667,855,425,1877,283,3635,5905,5766,6663,8631,9541,9662,8533,7421,6386,5523,5000,4851,4556,4250, +4217,3563,3387,1868,-133,1086,-215,398,371,329,98,-8,544,77,533,594,709,439,661,1779,1013,5647,7887,7739,8227, +9206,9877,10322,10477,10091,8690,8604,7936,6827,6611,5997,5437,4113,3975,2221,-130,1084,326,308,-45,109,131,295,442,242, +485,226,1001,343,1085,1117,-242,3452,8503,8035,9672,10436,10728,10246,9707,8947,7924,7582,7536,7840,7368,6764,6457,4821,4630, +2185,219,634,358,942,717,226,320,200,146,232,170,794,418,1765,1067,2155,-599,4608,12408,13079,15673,13425,12165,10730, +9105,8729,10091,11305,11699,11304,9716,7970,6453,4853,5024,2086,921,1278,183,493,462,226,190,314,449,377,206,167,-859, +1320,-1072,2215,-31,7830,14803,13730,13720,11918,11142,10240,10505,10574,10308,10122,9636,8773,7931,6849,5845,4597,4602,2480,-490,933, +735,598,516,217,594,38,774,522,247,1235,227,2035,115,2199,1376,8665,12754,11513,11393,9662,8997,9148,8580,9046,10187, +9519,8707,7759,6253,4999,4343,3838,4376,3020,23,1656,347,361,714,625,335,659,-249,487,482,879,912,699,485,3752, +-1876,5715,8438,6874,7029,6895,6993,7079,6381,5670,5379,5663,5955,5933,5773,5221,4604,4056,4626,2136,17,1825,307,896,807, +469,390,100,1472,632,605,1043,614,1239,1142,2579,1801,3789,5706,5215,6074,6157,6448,6632,6526,6484,6334,5657,4952,4108, +3907,3529,3379,3046,3952,2638,449,673,696,862,-250,873,-355,1804,-777,1252,-235,545,767,763,370,2116,-2146,3959,4513, +4403,4747,4863,5112,5363,5035,4714,4442,4087,3780,3264,3331,3304,3384,3243,3448,3068,-1132,2053,1694,1611,1049,2194,2513,2079, +1057,2317,3104,1844,2162,1163,1044,3068,933,5518,4215,4529,4575,4652,4712,4844,4656,4540,4403,4310,4223,4094,4154,4142,4149, +4147,3969,5140,616,-1119,-3292,1615,-1000,-3153,-3286,-3118,-2550,-3136,-3201,-3003,-1003,2118,-3045,-1234,4970,7636,8384,6887,7214,7448, +7651,7826,7901,7985,7769,7644,7532,7427,7317,7184,7095,7009,6927,6847,6684,6498,7882,7589,5440,7695,7560,5510,5659,5660,5688, +5938,6076,6137,7754,7865,5945,8099,8283,8577,8302,9088,9588,10219,10449,10468,9845,9419,9121,8821,8481,8111,7816,7568,7339,7111, +6638,6924,6498,6278,6559,5955,5810,6044,5921,6312,6335,6290,6009,6251,6628,6819,7238,7455,8306,8629,8582,10147,11301,12666,13060, +13217,12137,11289,10678,10068,9512,8807,8285,7777,7333,6755,5961,5736,5546,4645,4706,4260,3764,3925,3474,3856,3954,3830,4173,4607, +4998,5444,6167,7132,7674,9106,9133,11156,13182,15500,16251,16101,14001,12486,11578,10769,9758,8734,7967,7242,6604,5745,4803,4313,3201, +2701,1831,1618,1212,935,865,676,1163,1183,1690,2355,3129,4091,4303,5937,10460,10006,11382,14401,16737,17136,17995,19064,19964,19432, +16704,16218,15507,15151,13595,12424,11456,9908,7946,6249,4411,3482,2860,2027,1510,1080,1078,1217,1769,1735,2332,2972,3747,4925,5754, +8130,11316,13433,15078,18086,19359,20025,20935,21682,22827,22362,20633,20252,18860,16902,14667,12673,11024,9766,8527,7346,6209,4773,3914,2820, +2165,1683,1494,1531,1534,1951,2175,3419,4192,5945,7327,9528,13409,16940,15037,15820,13684,15786,16788,18802,20507,21621,21053,18294,15615, +13352,11880,10899,10545,8951,7247,6854,6473,5199,4991,3756,3074,2607,2092,2244,3269,2271,2603,3226,4617,6785,9024,9647,14890,14613, +10138,12386,10434,14501,17581,21185,20566,19568,17558,16901,15783,14157,13071,11502,9160,8011,6846,7399,6437,6007,5508,4256,3663,2770,2399, +2510,5572,3352,2865,3702,4108,6057,7229,9433,13803,13004,12551,15587,15432,17889,18935,20238,19330,18551,17143,15713,14237,13006,11153,10006, +8939,9785,9473,9564,7306,7185,5376,4803,4877,3775,2919,3470,3338,4026,4509,5502,6033,6435,7828,10653,13949,13721,14150,15879,16131, +17845,18420,18493,18761,18499,17696,15893,14019,12338,10902,10008,9593,10593,10917,9696,8405,8257,7229,6273,4873,3815,3735,3420,5465,4572, +4817,5602,6217,7739,8479,11122,11103,13326,14075,14926,15679,16081,16357,16729,16027,15344,14697,14030,13393,12537,12204,11753,11095,10610,10431, +9961,8727,7872,7329,6888,5349,6429,4764,6837,5237,5947,5257,5490,6778,7667,8594,10369,9049,13031,12500,12917,13127,13416,13698,14134, +13853,13734,13563,13312,13047,12731,12373,12004,11705,11503,11124,11201,7522,9653,10071,9454,8928,9744,9810,10356,9617,10350,10117,9427,10101, +9730,10221,11620,11891,12128,11661,11992,11985,12110,12174,12298,12146,12044,11929,11844,11763,11696,11647,11614,11530,11481,11156,11658,11480,10212, +5647,11776,10291,6196,6283,6216,6524,6461,6584,6680,10406,12263,6268,10376,12991,-810,624,-1670,-735,-1114,-1088,-1286,-1365,-1563,-1231, +-1070,-908,-854,-817,-816,-867,-875,-866,-792,-459,-1260,982,2787,7024,86,2472,6485,6412,6289,5915,6058,6099,5984,2392,-490, +6613,2729,4130,-1377,-1270,-1648,-1883,-2543,-2797,-3078,-2101,-1494,-1014,-800,-719,-788,-965,-982,-947,-636,-393,-348,3930,1123,838, +1409,1809,441,388,197,1041,8,-356,772,481,1608,1472,-402,1095,-213,-1468,-1601,-2302,-3933,-4430,-5209,-3208,-1844,-1015,-622, +-586,-720,-1092,-1168,-1127,-395,-172,1102,2081,2321,1728,1526,2284,1119,2361,674,2217,777,1738,1209,1606,1655,1677,391,2403, +520,-885,-1671,-3206,-6107,-7164,-7915,-4199,-1698,-257,241,451,-37,-727,-889,-845,-5,661,1622,2829,1807,2438,1550,1263,1112, +1102,1234,839,977,728,973,1461,1683,1804,844,-360,-3734,-4343,-4974,-5788,-5913,-6259,-7339,-7775,-6796,-1798,-3369,-3659,-3504,-3813, +-3642,-3293,-1409,-537,1300,3688,2346,2015,1718,1644,1327,1411,1191,864,633,433,878,423,926,725,586,3983,-1953,-9786,-10321, +-8728,-7439,-7400,-8697,-8818,-8357,-6443,-7952,-8753,-9352,-7959,-6165,-4701,-1668,-703,1435,3052,2334,1717,832,531,709,618,1073,2130, +1717,2301,2426,2871,1508,2928,1189,1781,-6428,-9328,-7090,-2734,-1504,-1005,-4178,-4524,-7207,-11297,-12695,-12495,-11086,-9158,-7321,-6037,-2972, +-1422,1259,1796,2188,2914,1936,1934,2615,2974,2816,3610,2177,2188,2546,3779,1097,2815,858,-66,-4557,-1884,620,9476,4285,334, +-4422,-5308,-7017,-7666,-9452,-9960,-8932,-8025,-6123,-3583,-1762,-821,590,4058,2958,2891,2804,2281,2493,1269,2501,4918,2576,2253,1820, +3071,1541,3450,2018,-26,-3935,-1947,-1123,1309,1153,530,-3307,-4275,-6587,-8138,-8057,-7307,-6376,-4089,-2468,-1556,-1517,-1373,502,5042, +2697,4089,3906,2709,3012,2971,2830,5106,3054,2696,1743,1970,2632,3021,-1021,4310,-1112,-2207,-299,1364,630,-230,-2008,-3310,-3868, +-4061,-4457,-4078,-3129,-2261,-1286,-724,-262,-1417,1866,5193,2177,3918,2864,3197,3682,3716,4411,2158,3927,3629,2149,3060,2201,3018, +804,4907,1424,-180,1117,1054,-232,-1250,-1940,-2037,-2173,-2250,-1444,-779,100,435,1107,1627,1706,123,1397,4321,4143,3939,3672, +5676,3242,5761,1857,5583,3105,5530,4553,4698,4887,5842,3778,10768,415,584,677,534,668,717,603,994,1333,1596,2069,2515, +3266,2986,2763,2437,2232,1811,1691,9470,3290,2946,3302,3872,1230,1059,1243,3186,1271,522,2667,2378,4561,4694,1484,3804,-2194, +-51,-573,-533,-526,-505,-511,-256,-38,213,356,480,706,399,241,82,-45,255,-1819,3930,7198,13828,1911,6550,12703,12860, +12701,11867,12591,12683,12340,6714,1185,13524,7752,-1009,1875,745,2618,1879,1988,1795,1907,1886,1828,1600,1461,1370,1375,1413,1537, +1599,1681,1760,1822,1728,2187,554,-423,-1948,985,-324,-1796,-1771,-1721,-1507,-1780,-1870,-1801,-358,1329,-2020,-541,-959,2604,2597, +2498,2203,2349,2125,1925,1438,1176,1055,1050,1209,1583,1761,1940,2090,2184,2233,2039,-203,1153,1064,909,710,1170,1373,1376, +981,1402,1674,1097,1133,539,605,2030,1869,3114,3916,3045,2340,2770,2524,2156,884,-13,-230,-260,24,707,1098,1595,1975, +2218,2432,1809,1078,978,895,1118,775,976,772,1636,835,1317,549,995,759,1002,964,2152,1850,3255,4223,3651,2582,2754, +2192,1800,419,-267,-340,-103,329,1457,1952,2399,2751,2979,2923,2398,1590,1489,1098,1282,1356,1079,1153,1080,1541,1070,1222, +1352,947,859,1369,3124,4865,11079,10990,8821,7840,7660,6093,4357,-348,-3913,-7972,-6968,-6433,-6123,-4460,-2604,-803,175,1129,888, +448,1065,1325,974,722,774,1033,1201,1190,1076,1595,1928,3664,3647,4319,4275,-331,6297,15669,14493,11409,7082,4094,4137,-441, +-2292,-3808,-2537,-656,2038,3385,3848,3888,2950,2906,2015,177,388,612,1347,1373,639,1078,1178,1872,1722,1643,1707,1107,2388, +1362,3266,2632,10549,14082,9793,3654,3640,4073,5519,2455,1403,2526,4958,6217,6692,7003,7114,6933,6338,6101,3776,2718,2308,613, +1234,975,539,1202,1600,2679,1742,1415,1427,273,2338,512,3585,5160,8142,2822,-189,-5657,-2270,-1354,-830,-221,1509,3321,5372, +6387,6453,6022,5732,6285,6080,6083,3896,1280,1693,1336,1409,1441,1523,1468,1642,2547,1995,2135,2570,2019,2625,2043,3431,3109, +2482,-2237,-3768,-4896,-5525,-5947,-4622,-3252,-600,2566,4390,5635,6200,6607,6477,6664,4165,2788,680,-797,13,310,105,191,647, +1798,1721,1393,1051,1038,736,2041,2636,2384,3617,-1124,-1557,-3300,-4371,-5390,-5314,-5063,-3883,-1660,-255,1014,2807,4163,4884,5623, +5424,4711,1809,867,-967,-1573,-453,-1231,33,727,1114,1274,1049,-244,110,381,1193,8,-409,-314,-539,-2641,-3482,-3990,-4725, +-5662,-4199,-2882,-1822,-315,1168,2722,2940,3297,3855,2981,2169,1715,1201,1063,-30,-856,-470,-365,-218,-115,-163,69,-123,-12, +281,240,447,25,-93,-622,-1863,-3264,-4139,-3870,-4014,-4109,-4357,-4733,-5050,-4958,-4947,-4814,-4685,-4515,-4350,-4080,-3684,-3401,-3232, +-2961,-2840,-2076,-2088,-2242,-2080,-1850,-1865,-1882,-2205,-2348,-2396,-2223,-2428,-2721,-3098,-3161,-3367,-4217,-3494,-3496,-3582,-3538,-3636,-3658, +-3749,-3673,-3643,-3641,-3556,-3486,-3438,-3352,-3324,-3259,-3181,-3055,-2956,-3639,-3819,-2706,-3518,-3793,-2998,-3084,-3054,-3035,-3160,-3250,-3231, +-3978,-3808,-3088,-4256,-3688,2091,2440,1620,1998,1937,2010,1741,1676,1764,1910,2002,2046,2098,2133,2131,2121,2081,2027,1923,1879, +1687,2243,2441,2427,2146,2409,2387,2470,2492,2483,2548,2601,2611,2473,2097,2778,2815,3640,2012,1991,1988,1991,1426,1426,1813, +2074,2287,2350,2504,2541,2507,2531,2441,2275,2036,1834,1828,2446,2076,2129,2057,2061,1914,1980,2044,2201,1901,1677,1902,2023, +2411,2730,2139,3118,1982,1208,1718,1948,893,646,1508,2087,2479,2404,2696,2975,3078,3192,3033,2702,2220,1748,1713,2109,1837, +1971,1798,1753,1518,1788,1727,2040,1463,1688,1745,2009,2170,2968,2581,3154,1646,318,801,1436,599,714,1909,2197,2225,2049, +2282,2493,2619,2948,2853,2433,1861,1399,1269,1929,1770,1462,1484,1359,1045,1287,1253,1422,881,664,910,1444,2317,2688,1511, +6281,20,-2628,-1399,-3096,-5808,-5998,-3851,722,4081,4757,5412,6218,7257,7385,6840,6014,4350,3243,2708,2007,1917,1702,1553,1357, +794,1232,1425,1732,1766,2074,2924,2008,3134,3311,4731,7199,270,-11330,-11103,-13455,-9057,-5363,-2302,2116,4540,6224,6631,6498,5838, +4970,4209,3612,2678,2146,2574,3010,2452,2213,1617,1413,1351,1726,1710,1749,1546,1659,1024,2264,1246,2825,1556,1956,-8167,-19228, +-16558,-14475,-12577,-12190,-10930,-6312,-2968,-387,-97,827,1956,2254,2434,2444,2429,1903,2819,3385,2781,2546,2107,1659,765,491,1019, +2677,1823,1802,1704,3485,553,3900,-1554,-5289,-14616,-13247,-11723,-9908,-10876,-10297,-8642,-7558,-6867,-6046,-5685,-4116,-1832,534,1872,1504, +2264,2106,2766,2881,1604,1678,1698,1754,1358,2285,1889,-165,927,1179,-368,1130,-1015,226,-3320,-6429,-8484,-7934,-7886,-7472,-5579, +-3307,-1355,-549,-1289,-3404,-3764,-3604,-2529,-2203,-965,453,2556,2911,2455,2170,1947,1817,1368,1393,983,1264,1033,266,765,531, +68,-1304,-1882,-2507,-6176,-2445,-4374,-4147,-4434,-4349,-2896,-1371,-84,-291,226,667,47,-446,-271,-847,-812,-417,943,1328,1834, +1244,819,1132,453,287,491,428,347,511,349,477,284,272,-350,-1033,-1884,-2843,-2225,-1896,-2211,-2224,-2303,-2672,-3005,-3442, +-3973,-4579,-4502,-4385,-4315,-3872,-3414,-3293,-2792,-2664,-1331,82,-468,-368,-131,77,26,-71,15,-186,-261,-584,-570,-1304,-1770, +-2513,-2297,-2356,-145,-361,-526,-641,-761,-775,-813,-841,-816,-834,-910,-1023,-1082,-1142,-1272,-1323,-1160,-1090,-1189,-1957,-997,-725, +-844,-676,-16,64,51,-119,196,455,149,55,-515,-712,-115,-1102,531,-22,25,-42,-109,-195,-276,-399,-525,-631,-755, +-872,-1032,-862,-691,-553,-527,-480,-173,-1290,-1761,-2995,-536,-1406,-2594,-2624,-2555,-2483,-2562,-2633,-2540,-1366,-197,-3179,-1822,238, +556,661,-267,-101,-190,-167,202,467,731,889,994,1030,904,807,722,662,605,565,509,546,363,1117,1450,2099,892, +1364,1953,1985,1962,1872,1837,1810,1764,1326,589,1952,1178,897,-933,-1155,-1105,-918,-7,749,1357,1859,1991,1845,1477,1237, +1074,917,816,764,629,572,690,1597,1051,1085,1046,1166,921,975,1020,1190,893,725,810,554,654,727,15,-979,-2079, +-2953,-2904,-2742,-963,630,1807,2951,3646,3786,3234,2557,2065,1558,1191,984,708,641,1005,1281,1482,1270,1070,1247,966,1444, +1100,1543,964,1005,731,542,380,152,-735,-1485,-2951,-3534,-3531,-3340,-824,1437,3227,4844,5403,4860,3784,3046,2465,1849,1446, +1318,874,888,1218,1359,1296,1675,1243,1094,1012,1257,1340,1281,898,667,499,24,-172,-208,-955,-6288,-7598,-7591,-8789,-7824, +-4245,-1733,-245,1309,3149,7285,7031,6267,4718,3035,1780,1051,740,694,1513,2468,1959,1723,1568,1464,1050,1469,1421,1186,837, +327,-39,-532,-1388,-2154,-3609,-8441,-7927,-1491,-1190,1937,-682,-3330,-7629,-6325,-4682,-2244,-1167,117,1077,1651,2073,2063,2219,1904, +1615,1834,1817,1387,1317,1188,860,1183,1362,1775,1247,971,681,-125,-1095,-2739,-4547,-7962,-1727,10336,8722,8326,1798,-1862,-5063, +-6670,-6144,-4963,-3930,-3234,-2938,-2748,-1854,-146,556,987,1461,1295,1266,1811,1571,1602,1405,1451,1424,1598,526,-33,-46,-2127, +-1828,-5430,-2256,-1050,8997,9614,6111,2083,2727,3179,2861,1827,1341,505,1609,1421,165,-234,-419,-90,-548,-864,109,1391,909, +825,686,559,532,1440,1591,485,1378,888,576,-601,572,-1817,-422,2361,6034,5651,4195,3452,2352,1349,1275,1016,2280,4501, +4651,4150,3008,1811,313,-1521,-1227,-1032,241,1573,469,517,1094,1065,990,966,995,556,299,240,1063,734,397,362,4416, +-826,3641,3707,2877,2899,1069,88,-335,140,-12,-95,276,402,-17,-749,-1111,-1367,-758,-378,-164,567,666,800,559,658, +885,373,206,786,658,509,350,379,805,271,1093,1570,1770,2249,2213,2475,2035,1823,1437,1334,1350,1470,981,451,-147, +132,217,415,305,975,-90,-1354,-466,-192,76,-234,628,136,1024,305,655,224,312,675,852,1166,1633,653,2302,2296, +2346,2443,2508,2598,2716,2592,2382,2201,2007,1857,1429,1630,1755,1960,1955,2185,2313,-11,1505,1537,1665,1395,1914,1817,1852, +1600,1835,1769,1590,1638,1512,1506,1844,2214,2372,2103,2232,2233,2304,2355,2431,2432,2471,2489,2525,2572,2621,2594,2516,2454, +2465,2287,2745,1868,1363,-4,2090,1489,486,502,534,665,627,695,733,1548,2160,564,1627,2456,-657,-450,-207,-221,-158, +-157,-571,-866,-1227,-1304,-1323,-1230,-1063,-933,-847,-768,-713,-694,-623,-543,-659,-512,-329,355,-604,-336,295,315,327,277, +297,255,235,-406,-481,-50,-451,-874,221,756,662,574,-522,-1459,-2407,-2836,-2788,-2263,-1717,-1367,-1240,-1048,-922,-893,-673, +-574,-551,101,-337,-316,-231,-116,-251,-131,-124,-11,-71,-84,-40,-255,-297,-500,-125,14,701,2694,2199,2028,-215,-2105, +-3978,-4750,-4648,-3861,-2970,-2193,-1941,-1470,-1226,-1151,-663,-582,-223,28,-21,-169,-80,230,12,545,394,687,617,724,687, +124,19,-69,575,497,1909,4423,3867,3376,-238,-3236,-6198,-7392,-6663,-4556,-2895,-2031,-1922,-1582,-1258,-1240,-670,-558,112,942, +357,956,556,622,544,966,1246,1233,1112,1039,1126,293,-96,436,1468,787,4507,5820,6029,5915,2787,229,-2440,-4576,-6990, +-9475,-8132,-6855,-4826,-3812,-2879,-2456,-993,-704,-488,135,-394,280,426,818,821,1063,1022,913,1043,1239,1231,1924,1823,1367, +180,1443,3613,1587,719,-2342,-2477,-1384,2052,-1130,-4147,-8387,-7802,-7984,-8002,-6474,-4901,-3488,-2405,-2188,-1014,431,457,867,674, +866,990,1248,1341,1271,508,-45,-635,-938,-681,-453,849,4950,1006,-9893,-9923,-11138,-2479,2661,7990,8038,6645,4246,3277,1858, +391,443,-72,-1057,-1985,-2912,-2173,-1589,-1465,-471,35,604,448,1664,1603,343,1081,1225,455,1637,1452,3279,653,804,-7732, +-8989,-4945,-2553,-599,1109,4351,6334,8111,9656,7833,6391,5371,3967,2436,1086,601,-202,-1811,-1145,-1111,-1273,-845,-551,-469,839, +1370,580,1245,1151,-314,596,-650,685,-501,-216,-2525,-1760,-1103,-2571,-1367,30,1727,3658,4419,4002,4486,4787,4549,4471,3858, +3170,443,-958,-2031,-1771,-1252,-463,-323,70,784,1057,1137,1520,1433,1440,857,766,556,572,-2447,2503,-1382,-1235,-605,-1358, +-254,-12,91,37,659,1292,1360,1535,2017,2555,2705,2809,1520,1058,698,274,750,593,1428,1543,1142,1310,1243,960,534, +372,410,914,932,1341,754,262,-10,-463,-144,-137,117,380,827,976,1066,1176,1836,2511,3218,2998,2924,2933,3261,3258, +3607,3452,3266,3101,2480,2134,1565,1602,776,1160,692,1099,745,622,508,499,19,2171,-92,-143,-89,-143,-126,-173,-268, +-37,243,458,730,945,1385,1437,1568,1555,1528,1351,1539,2706,1422,1255,1134,1103,459,387,439,677,329,111,479,422, +825,935,345,718,-283,202,95,110,97,100,75,200,278,382,451,516,586,524,506,512,551,642,336,1523,1988, +2889,861,1596,2476,2526,2460,2319,2417,2413,2311,1400,386,2494,1482,230,-433,13,-422,-259,-379,-429,-584,-609,-537,-504, +-498,-516,-521,-523,-497,-534,-534,-519,-535,-522,-532,-360,-334,-488,-272,-237,-388,-325,-297,-313,-255,-222,-240,-100,-143, +-155,71,1125,-97,-300,-349,-564,-1006,-1094,-781,-721,-657,-700,-720,-682,-562,-624,-673,-696,-755,-777,-714,-501,-485,-381, +-304,-210,-139,-49,33,26,46,-44,-59,123,312,538,249,1397,322,-884,-647,-896,-1688,-1625,-1006,-1100,-1376,-1636,-1681, +-1612,-1267,-1306,-1210,-1093,-1190,-1184,-1011,-724,-554,-518,-272,-45,38,278,286,386,349,479,293,545,618,1154,761,2701, +582,-1195,-492,-708,-2009,-2417,-1309,-1498,-1791,-2145,-2170,-1843,-1148,-1099,-1133,-1091,-1260,-1344,-1343,-636,-609,-310,34,269,172, +693,1009,954,829,764,733,1296,2025,2060,1424,-1102,-6063,-7612,-7338,-7505,-4674,-2271,182,-1054,-1666,-2842,-4287,-4853,-5385,-4181, +-3427,-3135,-2754,-2392,-1996,-1036,-690,-162,-14,364,718,917,975,897,957,713,401,-1016,-1199,-1727,-981,-2192,-5892,-7014,-5454, +-1046,434,1314,1972,5060,7761,11044,9082,8003,6931,4866,2666,736,-722,-1021,-1401,-2127,-1171,-738,-123,405,599,1233,1280,714, +530,233,-74,494,-171,-514,-2332,-7030,-5816,4889,7177,11252,5578,3634,1656,3769,5626,7869,8616,9538,10159,9819,8357,5881,3516, +2557,147,-1213,-1311,-2181,-1434,-1142,-903,661,1112,-183,1125,750,-472,-1004,-1685,-3285,-2664,-2922,3616,7488,4707,4935,1121,-592, +-2292,-2060,-1960,-2353,-490,939,2031,1785,1962,2602,1920,1856,1416,-679,-57,146,320,702,553,1149,915,-697,467,351,188, +-327,34,-1020,-819,-132,1211,1424,1684,3038,56,-1902,-3903,-5107,-5726,-5622,-4998,-4391,-3314,-2048,-850,194,1025,1558,1831,685, +1280,1007,531,436,207,487,506,740,828,383,-213,-53,-159,-674,876,-1167,965,689,157,100,-638,-703,-874,-1301,-2032, +-2647,-2712,-2733,-2888,-2483,-2073,-1533,-502,-292,349,1059,343,540,315,257,485,819,948,400,715,606,218,-299,-428,-321, +-162,-204,-365,-475,-938,-1249,-1274,-1513,-1850,-1655,-1475,-1368,-1549,-1740,-1957,-1627,-1304,-1152,-1255,-1818,-1237,51,-361,-418,-284, +323,-259,209,-46,227,161,15,33,93,129,167,92,-946,-570,-466,-513,-530,-577,-537,-501,-527,-608,-631,-676,-662, +-686,-766,-883,-921,-803,-731,-813,346,-256,-201,-244,-26,-95,-120,-251,-241,-398,-391,-524,-540,-613,-770,-737,-462,-538, +-632,-627,-624,-648,-689,-726,-799,-848,-903,-935,-979,-1017,-948,-880,-846,-869,-790,-1006,-704,-477,142,-573,-358,-18,-106, +-133,-210,-239,-276,-303,-532,-572,-231,-474,-721,23,-817,-190,-347,-357,-480,-129,40,216,226,279,304,340,342,353, +310,270,227,158,75,302,-521,-735,-843,-407,-702,-709,-733,-707,-672,-726,-758,-798,-696,-461,-668,-861,-1235,-1202,-1203, +-1441,-1627,-678,-131,300,417,495,486,637,738,818,771,683,604,386,371,225,-791,-164,-303,-287,-314,-5,-4,-44, +-215,52,139,-226,-352,-622,-621,-577,-1929,-2154,-2047,-2386,-2840,-752,211,1131,1164,1400,1480,1789,1848,1907,1687,1424,1183, +711,682,220,-441,-282,-142,-244,-296,279,52,243,-78,312,30,-321,-417,-457,-871,-1383,-2980,-3702,-3621,-4898,-5808,-2586, +-529,873,1075,950,668,1291,1781,2186,2133,1906,1671,1132,1094,605,-651,54,-444,-88,85,433,591,832,728,883,816, +131,-360,-980,-1181,-1629,-3252,821,3035,3386,5795,6058,5488,4305,5683,6944,8576,8608,8056,7228,5434,4087,3241,1783,1373,366, +-865,213,-21,291,454,788,1041,960,545,387,-232,-1062,-426,-921,-1077,-2164,-1555,3033,8504,7438,5104,2870,1959,651,474, +1188,1770,4538,5861,6440,5563,4563,3110,2650,2257,1569,602,3,118,377,631,465,937,1031,648,440,246,271,-396,-32, +-540,664,5033,6674,-256,-3469,-6787,-5087,-4102,-2681,-5028,-6302,-8005,-8259,-8073,-6743,-6315,-4976,-3210,-1573,-1094,729,1200,872,770, +312,180,-258,522,804,-354,966,823,-26,75,1260,1505,2326,3114,-1187,-4859,-3496,-5077,-2937,-2660,-2398,-3673,-4649,-5332,-6262, +-6913,-7003,-6261,-5347,-4777,-3887,-3281,-1131,785,16,566,262,315,614,574,711,-174,782,888,653,769,390,743,1285,-807, +-2070,-2298,-2323,-2751,-725,-83,221,414,397,-19,-1661,-2660,-3228,-3912,-3922,-3799,-2780,-2230,-1360,523,-499,-349,-102,-282,-168, +-101,120,239,404,426,379,215,121,394,-1274,357,-1232,-1093,-762,-475,-569,-946,-997,-338,98,201,-17,-151,-153,-341, +-643,-1384,-1823,-2003,-1721,-1599,-1590,-1135,-1108,-610,-194,-182,-106,-3,235,316,246,88,-216,-376,-526,-56,114,-117,-196, +-362,-415,-264,-90,-387,-597,-709,-601,-489,-280,-527,-720,-761,-925,-944,-1421,-1615,-1262,-1147,-891,-773,-505,-251,-12,402, +216,278,244,145,64,-87,-137,-160,-402,-437,-340,-287,-226,-277,-283,-378,-423,-507,-560,-650,-726,-766,-795,-870,-947, +-957,-970,-938,-796,-768,-671,-585,-495,-486,-501,-424,-398,-282,-224,-232,-251,-198,-204,-574,-450,-383,-385,-376,-363,-326, +-277,-279,-282,-290,-319,-341,-368,-402,-439,-465,-490,-541,-572,-710,-741,-701,-600,-665,-544,-533,-525,-548,-526,-553,-541, +-477,-429,-610,-572,-491,1747,1516,1889,1740,1948,2065,2049,2047,2125,1897,1774,1667,1603,1567,1525,1542,1526,1477,1520,1480, +1487,1479,1173,248,1536,1183,374,355,366,396,461,449,390,1124,1653,118,1026,257,2320,2509,2839,3143,3045,3048,3181, +2706,2356,1999,1671,1420,1254,1268,1267,1172,1310,1261,1338,1016,1168,1295,1027,997,1407,1324,1405,1219,1489,1475,1128,1289, +1085,974,1387,1048,2293,3712,4010,4674,4369,4241,4531,3739,3242,2668,2075,1747,1408,1337,1219,901,1139,972,928,1146,751, +751,579,534,1027,631,879,580,1003,857,551,609,529,548,1245,674,3126,5036,5658,6629,6012,6008,6384,5314,4574,3640, +2259,1239,529,383,239,-145,238,152,365,814,361,396,15,120,571,513,583,474,845,743,233,392,347,479,920, +4452,4788,4120,4774,3823,2680,2208,1689,2280,2378,2100,3537,3859,3607,3013,2568,2175,1841,1128,1396,1339,523,582,402,556, +691,790,708,346,413,731,1154,1317,1636,2317,3061,3066,-40,-6656,-6957,-6535,-3312,-1529,-330,-1229,-3220,-4813,-6985,-7993,-7890, +-7299,-6258,-5190,-3470,-2311,-504,1248,1202,988,469,451,734,756,926,601,702,641,524,800,920,1509,1027,-1575,-4650,-2703, +180,3650,917,-999,-2588,-877,-182,1035,733,300,-758,-1966,-2618,-2837,-2531,-2238,-1831,-1022,-299,564,497,688,918,1045,1100, +-115,1253,1206,345,1158,309,679,-285,-2530,-552,1677,1461,4416,1369,778,-251,1037,1771,2504,2307,1904,957,928,446,-98, +-403,-600,-1357,-1544,-1020,-1381,-954,-517,-14,124,233,-219,507,559,368,218,125,-84,-973,-74,555,1876,2033,2012,-22, +-619,-707,-658,-638,-499,798,1384,1093,1087,732,341,-441,-522,-1016,-1804,-1067,-872,-417,41,297,-103,-198,-79,392,623, +824,292,-7,-251,614,-938,736,1326,975,169,-100,55,233,-552,-771,-450,-135,-46,-93,-701,-870,-638,-348,146,-215, +-690,118,81,65,-98,-28,187,279,197,117,98,184,-133,-175,-239,-258,147,137,298,287,449,350,70,-245,-237, +-289,-416,-599,-727,-841,-776,-826,-1023,-690,-184,68,-230,-108,74,130,-11,378,-24,130,-207,57,17,180,161,128, +94,232,-681,-407,-395,-481,-515,-595,-569,-584,-543,-541,-526,-551,-598,-694,-599,-474,-311,-264,-231,-238,-818,-370,-333, +-229,-310,-169,-149,-111,-235,-137,-136,-193,-250,-330,-412,-411,-202,-204,-286,-290,-318,-325,-352,-386,-390,-393,-387,-365, +-327,-301,-255,-242,-222,-188,-163,29,-166,-258,-544,-171,-255,-485,-471,-444,-354,-368,-338,-293,-230,-182,-324,-253,-255, +-554,441,-634,-254,-389,-318,-666,-792,-846,-830,-812,-755,-766,-762,-751,-751,-728,-689,-646,-532,-850,175,793,1933,-64, +772,1890,1855,1806,1648,1809,1833,1717,806,-120,1937,1058,1888,-121,-154,-199,-136,-933,-1240,-1307,-1343,-1246,-999,-938,-883, +-880,-931,-903,-838,-709,-680,-725,800,-100,-64,139,338,80,-5,-4,220,-30,-212,27,140,581,596,102,1530,792, +-172,-23,182,-1433,-2007,-2320,-2496,-2451,-2127,-2065,-2029,-1918,-1858,-1694,-1441,-1099,-963,-714,-137,75,-59,22,424,363,640, +92,501,285,668,152,578,737,1041,875,2201,927,-417,50,461,-1710,-2751,-3168,-3311,-3127,-2275,-1787,-1508,-1497,-1581,-1439, +-1181,-810,-727,-826,-85,-352,57,-219,-62,335,401,563,147,616,433,-62,669,1208,1083,1006,426,-2830,-3588,-3836,-2171, +-1546,-1221,-1480,-2763,-3585,-4295,-6493,-7321,-7286,-6337,-5619,-5140,-3802,-2740,-1637,-220,-423,-164,-96,214,693,420,482,538,754, +559,217,-185,46,4,1057,-2718,-2024,1749,3034,4641,3475,2591,775,2004,2290,1369,1208,355,-1391,-2129,-2183,-1007,-1622,-1724, +-1638,-1654,-927,-666,-409,-98,437,579,817,585,1102,1196,1122,661,-147,-837,-1297,-448,1995,2053,574,-1096,1435,2083,342, +962,1362,1079,1838,1867,1438,1943,1763,1472,616,491,-92,-362,-389,-493,-215,130,964,810,718,2,668,345,64,-377, +-346,-725,-359,1476,790,-1824,-1767,-1906,368,434,-614,-1490,-2206,-2053,-1607,-968,-158,-226,-59,305,210,258,63,-465,-62, +218,196,379,599,363,173,-250,309,514,884,444,146,216,796,275,-281,-1715,-1223,512,1263,1091,-87,-280,-285,161, +-1149,-1572,-1070,-1023,-816,-272,255,562,873,471,625,169,240,376,521,367,288,-226,129,151,114,286,417,442,168, +428,-749,-601,206,1065,881,309,-583,-616,-884,-1194,-1390,-1530,-1759,-1169,-538,302,754,791,541,640,520,257,358,272, +230,113,117,309,288,356,291,432,331,65,-93,560,665,400,288,134,-197,-377,-538,-438,-407,-452,-245,-108,-120, +174,404,665,619,720,765,553,484,351,430,503,477,489,537,382,448,335,390,290,298,243,366,23,554,411, +287,173,79,-36,-194,-204,-213,-192,-179,-147,-113,-33,14,86,197,287,415,158,333,286,190,126,150,223,267, +277,405,473,413,447,335,303,492,44,495,325,304,259,216,181,136,153,145,131,98,62,12,58,101,133, +166,178,273,25,-120,-310,116,-94,-300,-296,-289,-266,-293,-292,-257,-20,264,-351,-112,326,-781,-1051,-849,-874,-923, +-957,-808,-751,-780,-654,-621,-648,-637,-649,-673,-668,-662,-620,-668,-681,-561,-948,-1044,-962,-812,-944,-861,-891,-898,-897, +-943,-958,-977,-963,-908,-881,-1038,-1022,-1623,-1712,-1760,-1709,-1188,-1005,-1117,-732,-668,-812,-783,-787,-783,-706,-657,-550,-680, +-651,-640,-1007,-734,-758,-612,-566,-447,-469,-516,-582,-498,-489,-680,-811,-980,-999,-1029,-1304,-1709,-2092,-2172,-2338,-1449,-1163, +-1422,-553,-424,-622,-592,-623,-660,-591,-523,-305,-595,-552,-549,-847,-693,-517,-276,-173,85,-95,-46,-227,-41,-260,-452, +-505,-628,-980,-1265,-2156,-3439,-3889,-4123,-4100,-2419,-1863,-2131,-739,-480,-1088,-1146,-1184,-1026,-671,-418,-126,-525,-541,-538,-804, +-585,-559,-209,49,353,365,411,284,501,270,-367,-758,-1192,-1594,-1677,-81,3349,5107,4445,1943,1540,419,-823,-1172,-1595, +-1588,-736,-247,-312,-279,-357,-200,-292,-261,-1001,-1276,-625,-379,-159,38,592,232,297,522,223,173,432,886,639,741, +-125,1314,2754,1191,155,-173,-130,-38,649,-1024,-1100,888,824,1085,1623,1858,1740,1229,573,154,-538,-1038,-1052,-663,-175, +166,785,452,431,391,939,919,429,127,542,694,1273,1211,314,-289,-316,-694,-713,-759,7,-1134,-1582,-629,-1000,-667, +58,-211,-278,-455,513,794,513,625,487,268,81,228,1134,155,21,34,584,627,888,404,639,850,1098,-257,587, +1920,1297,471,976,1360,2020,1099,570,324,-582,-682,-191,-72,12,-92,-104,124,479,505,628,955,580,620,1290,219, +-22,-92,51,276,896,252,274,259,141,169,836,326,-428,-720,137,374,443,-663,-1280,-1577,-818,-496,-838,-280,39, +354,552,540,523,519,358,447,372,419,577,703,701,351,343,279,410,397,299,89,272,-795,-533,-579,-586,-262, +-205,117,569,70,-374,-826,-613,-222,215,754,722,487,94,-38,242,478,428,568,491,407,231,181,190,402,408, +361,277,435,417,177,5,-217,-525,-264,-55,114,239,353,498,458,511,582,389,172,6,60,203,458,432,272, +235,378,181,74,116,167,297,345,430,586,289,193,-56,-128,-235,-276,-311,816,423,438,506,544,603,647,699, +715,703,691,697,746,777,748,673,574,511,471,438,492,480,586,639,644,718,655,613,576,531,482,540,526, +612,667,487,569,222,329,329,346,363,382,405,427,459,492,534,560,597,540,508,479,454,424,354,538,629, +545,565,681,578,578,598,600,640,660,655,620,444,676,673,308,79,-117,196,-29,14,-2,8,5,-41,-15, +-2,44,28,38,31,98,127,162,124,84,197,-39,-200,-607,73,-119,-464,-499,-493,-448,-454,-486,-515,-245,73, +-743,-353,-1002,299,302,337,306,174,56,-109,-61,-46,31,-108,-139,-146,10,108,224,132,127,199,-329,-12,16, +26,24,243,135,129,110,128,132,-38,-5,-135,-290,-129,-497,109,489,193,132,-240,-326,-531,-345,-201,103,40, +57,-14,275,392,525,289,250,202,-44,-77,96,187,183,525,115,209,162,217,91,-45,-149,-346,-384,-89,-858, +951,1757,1622,1379,501,90,-425,-282,-235,68,-280,-392,-477,-87,159,470,141,175,171,-405,-54,-175,104,236,669, +386,312,383,453,198,-154,-125,-317,-286,-359,3616,1881,-154,-833,-2563,-2996,-2898,-2199,-711,764,2298,2648,2796,2760,2222, +1921,2010,1197,826,535,5,253,-48,232,261,493,166,222,507,507,881,1229,731,921,1444,2757,1196,104,-89,583, +-196,2077,2199,1608,912,-45,-1396,-1670,-1642,-1809,-1142,-1150,-1553,-438,284,383,714,625,429,435,395,854,567,491,212, +803,795,691,1109,1254,1340,746,580,398,-361,-110,-245,427,1142,2076,1200,655,-257,-829,-1461,-2265,-1926,-1500,-800,-686, +-564,-42,56,186,350,224,505,1708,2,-312,151,430,754,1612,780,173,953,491,807,-107,-756,-547,-1908,-1052,-1098, +-1343,-1314,-1503,-2016,-823,-190,-147,231,221,-1,-38,-105,110,471,226,4,237,431,1167,423,244,498,33,216,836, +530,303,355,285,226,-311,65,-41,-1374,-528,-443,-774,-560,-622,-809,-757,-419,430,241,151,-246,-358,-217,-94,200, +199,287,336,201,209,212,184,385,297,311,388,222,291,328,227,526,296,-428,-816,-752,-466,-395,-560,117,529, +792,523,404,561,478,390,-117,-219,-229,-26,19,59,54,120,259,388,449,482,271,519,583,576,468,437,488, +532,-206,-124,59,169,256,88,-6,-202,-90,-32,88,235,399,521,354,211,69,81,-5,-69,124,291,483,451, +454,429,374,204,199,125,98,62,73,64,36,-13,109,120,50,-92,-155,-225,-287,-356,-317,-284,-246,-222,-224, +-189,-189,-156,-139,-149,-144,-137,313,155,197,231,346,301,314,328,384,378,457,440,415,311,228,244,-85,106, +53,35,6,-19,-41,-80,-69,-74,-79,-78,-66,-49,-41,-40,-33,-24,3,-45,-38,-14,233,-50,-24,231,212, +178,138,110,64,50,-42,-5,41,-95,75,-5,40,-190,-64,-66,-39,19,31,4,41,37,9,-16,-35,-68, +-36,-25,-18,2,18,-35,96,142,194,79,157,247,194,179,176,175,170,177,164,38,254,166,493,-350,-503, +-531,-507,-259,-84,-75,50,75,44,49,0,-113,-64,-33,-9,48,38,26,237,115,92,163,206,238,143,95, +103,50,69,138,152,191,293,96,223,-496,-1075,-731,-714,-134,77,-42,268,215,-9,-114,-250,-423,-233,-148,-90, +73,80,112,286,227,111,261,374,455,301,179,190,142,192,246,290,298,428,82,705,-1310,-2726,-2512,-2356,-1066, +-429,-481,97,336,162,187,-16,-429,-210,-80,12,218,119,203,355,242,240,269,377,734,396,232,126,233,200, +277,429,717,672,414,-1174,-1360,-1058,-435,1699,1077,1242,2307,872,99,-502,-949,-1207,-1433,-1104,-959,-905,-380,73,719, +616,359,136,312,352,564,217,310,707,846,629,24,-253,-238,-361,-676,252,378,1757,1736,1305,1196,1213,1018,166, +-410,-1247,-1446,-1531,-1313,-1211,-736,97,-101,-106,216,396,501,327,372,402,873,428,347,209,758,786,691,987,760, +325,552,-451,-249,738,-364,-1951,-1916,-1672,-716,-101,468,753,1243,1266,965,344,-256,-872,-497,-224,-393,-271,-186,108, +192,439,1544,270,-155,19,85,370,1287,-51,-371,-572,-393,-365,120,315,-80,-176,-1004,-1279,-962,-1224,-680,367,862, +1302,1636,1484,1226,741,1142,1090,395,83,109,60,138,288,948,271,92,562,162,159,571,163,156,-10,-65,23, +75,-124,-349,-931,-1081,-708,306,438,391,143,77,48,-43,286,499,640,538,296,196,-63,104,212,232,298,313, +315,239,63,116,219,377,203,111,138,125,137,319,165,-61,-476,175,233,35,-400,-388,-10,185,107,-293,-282, +-157,14,205,392,413,150,184,244,307,283,213,193,215,208,319,294,202,175,178,338,146,-119,-370,-362,-277, +-239,-83,52,306,138,-111,-437,-330,-160,52,-8,-128,-326,-335,-309,-223,-90,13,102,184,262,291,271,193,155, +164,210,240,244,189,217,26,413,364,338,325,283,262,241,240,188,226,226,217,139,88,52,68,104,155, +189,159,-87,127,154,163,198,303,273,296,314,297,220,326,239,314,362,312,445,375,374,378,387,393,390, +391,366,329,301,259,234,193,250,283,303,306,309,376,328,280,86,430,365,218,243,267,273,307,337,322, +376,406,245,409,535,-133,-209,-158,-173,-183,-195,-208,-200,-176,-188,-192,-204,-179,-168,-139,-148,-141,-143,-122,-111, +-134,-100,-68,-29,-55,-21,39,23,5,-17,-14,-3,23,-62,-106,-71,-183,-585,-405,-193,-115,-68,-103,-205,-199, +-260,-267,-295,-215,-139,-60,-81,-91,-132,-70,-73,-138,-67,-88,-100,49,93,59,37,11,4,-12,-23,30,-59, +-136,-261,-354,-1071,-826,-408,-608,-566,-456,-534,-471,-635,-711,-705,-579,-459,-275,-306,-272,-250,-139,-73,-135,-94,-15, +-95,222,308,229,254,190,140,139,129,168,56,-129,-447,-718,-2217,-1660,-508,-390,20,253,-196,-286,-635,-723,-815, +-561,-322,-57,-151,-133,-159,55,19,-173,0,-57,-91,281,485,559,403,264,263,332,259,144,-13,-483,-806,-1391, +-370,885,1552,338,-2022,-2836,-3034,-1977,-2354,-2693,-3034,-2660,-2154,-1653,-925,-798,-1373,-746,-509,-174,33,-79,164,191,253, +548,381,349,393,267,206,165,-45,-445,-441,-836,1753,2186,2539,2006,1214,-905,-1622,-357,-529,176,984,1048,1009,968, +965,883,526,135,-317,-198,-216,-224,-146,114,258,673,250,159,280,496,490,733,562,906,1382,1673,708,625,707, +866,725,592,401,1089,540,97,-837,-1081,-1020,-724,-211,-126,-447,-227,-41,-60,141,228,309,212,357,1112,413,58, +190,71,367,1197,554,578,150,281,474,86,293,633,807,-52,-234,384,476,634,507,380,88,-286,-250,-86,103, +210,208,355,502,416,570,677,592,695,115,-65,354,123,252,541,387,485,299,410,53,162,-3,-63,600,56, +-44,143,0,112,366,142,-88,-269,-127,-206,-485,158,162,-1,228,62,23,207,277,344,406,294,130,211,324, +470,330,237,150,33,370,112,373,259,-221,-481,-369,270,106,57,-60,153,270,348,-104,-242,-11,114,98,115, +213,96,158,247,270,150,120,156,186,55,47,316,164,208,251,385,248,421,224,-123,-376,-142,-1,184,137, +216,256,91,-117,-263,-203,-136,-45,-23,65,47,-50,47,40,43,135,157,212,105,172,310,468,578,552,531, +495,391,-132,-219,-93,56,173,241,288,351,244,118,24,-28,-33,-86,-10,18,33,39,31,78,235,59,8, +17,-5,-102,-134,-152,-149,-236,-290,-319,-298,-251,-242,-226,71,5,83,104,138,161,192,246,219,223,211,192, +162,129,106,85,78,79,83,40,116,186,396,55,148,370,347,319,284,268,252,218,78,-13,299,114,131, +-208,-109,-135,-176,-192,-252,-291,-322,-389,-263,-238,-295,-231,-209,-189,-200,-191,-168,-177,-173,-163,-140,-118,-86,-100, +-82,-66,-58,-60,-63,-69,-77,-63,-99,-97,-123,-127,-133,104,-13,-149,-424,-681,-764,-864,-486,-388,-557,-429,-389, +-293,-302,-267,-190,-193,-167,-110,-128,-125,-78,-3,30,-36,-22,-41,-17,-92,-70,25,62,86,51,-35,96,295, +335,158,-212,-948,-1098,-1401,-590,-347,-678,-338,-257,-131,-213,-174,-28,-110,-103,-2,-90,-43,78,204,233,118,188, +132,188,49,87,212,185,131,180,133,530,1264,1325,932,-282,-1713,-2118,-2392,-1046,-564,-1032,-680,-559,-257,-377,-291, +-26,-152,-62,78,-105,0,41,392,485,465,387,286,356,212,193,452,575,557,717,595,395,-380,-1231,-1294,-953, +-826,-345,-335,-418,-310,-547,-140,-4,352,198,329,496,488,364,-114,-279,-43,117,296,325,395,474,441,285,590, +601,174,35,65,-13,265,1614,1017,444,863,2045,-336,-1555,-1475,-1087,-1228,-2166,-1682,-1200,-730,-442,-433,-703,-297,-274, +-595,-467,-345,-231,135,244,411,322,162,62,249,422,1024,537,556,1174,1176,-722,-762,-559,-138,547,360,1234,1382, +1427,788,-3,-599,-1264,-1645,-1944,-1737,-1100,-1082,-867,-199,-13,83,-124,506,607,454,270,18,269,-72,251,1081,1009, +600,-91,-529,-92,46,-16,-244,-347,-146,257,787,1586,2224,2364,1858,1319,1042,599,326,32,-213,-330,-255,-97,-19, +40,479,416,250,305,242,413,286,299,167,232,308,314,102,111,107,93,8,-340,-589,-415,279,187,392,677, +1059,1231,1082,627,412,242,-14,-104,-348,-243,-251,-110,-54,56,280,198,150,169,137,291,514,383,234,88,70, +26,-76,-273,-203,-24,-45,96,460,823,894,521,381,333,451,758,705,413,229,59,-71,40,149,143,105,217, +469,285,193,152,108,99,66,57,33,-52,-18,330,231,147,170,99,263,364,406,248,149,111,162,200,203, +96,28,13,188,369,441,312,286,257,188,46,-19,27,246,220,284,253,280,213,233,205,215,-41,89,166, +258,322,404,463,585,592,599,553,448,335,233,254,274,258,222,212,192,-104,82,101,117,100,194,150,68, +-32,-41,-104,-180,-134,-122,-68,-20,198,210,218,238,265,278,294,314,288,277,281,304,329,329,332,324,330, +331,313,357,273,210,35,280,209,44,22,31,51,38,45,43,162,220,44,162,276,-235,-269,-285,-251,-286, +-341,-288,-278,-345,-233,-215,-247,-245,-236,-192,-203,-201,-206,-196,-193,-184,-223,-215,-165,-191,-188,-171,-165,-161,-163, +-182,-176,-135,-178,-214,-119,-208,-52,-393,-401,-440,-535,-380,-353,-536,-295,-243,-310,-293,-265,-178,-215,-224,-240,-218, +-192,-156,-180,-148,-119,-72,-44,-85,-58,-94,-134,-153,-135,-36,-64,-65,-17,-170,-130,-419,-651,-650,-999,-578,-470, +-783,-341,-269,-398,-403,-350,-149,-160,-124,-176,-97,-88,-49,-111,-76,-9,78,103,47,132,98,47,-35,-20,125, +88,113,161,-186,370,-606,-1060,-1113,-1372,-633,-408,-954,-461,-326,-472,-442,-302,-106,-125,-178,-257,-135,-31,148,24, +112,185,333,432,466,422,292,237,121,158,400,503,608,613,286,-1711,-1228,-1451,-1014,-349,-1003,-1118,-1172,-400,-137, +81,102,95,46,62,292,572,282,165,301,110,101,143,396,340,114,460,505,297,579,280,-372,-148,-216,-577, +-1417,718,1101,958,-123,-1236,-1433,-1350,-2291,-625,253,588,180,-230,-261,-822,-988,-994,-486,-114,-163,-116,69,119,469, +529,455,204,7,92,158,374,814,378,257,425,696,-229,248,290,999,2927,2110,1542,910,759,698,548,398,205, +13,-93,-80,-162,-432,-597,-533,-513,-343,-338,526,479,-320,72,-66,-5,-217,97,638,743,841,-37,-63,344,209, +16,16,617,-120,115,895,1418,1415,651,746,627,402,-164,-350,-162,-105,-91,-184,-331,-214,-267,435,482,-8,341, +316,417,549,545,156,124,136,76,321,57,126,538,595,469,20,93,382,586,545,59,237,265,685,421,364, +279,-197,-271,-44,-22,144,110,69,77,136,31,11,174,101,192,287,506,495,236,138,172,392,445,212,72, +-384,-456,-291,-58,-11,-206,-196,-177,-132,-106,-122,-244,-12,84,60,65,29,40,65,97,263,257,179,-58,75, +98,87,37,32,0,198,16,54,-20,-113,-104,-165,-226,-352,-164,12,220,23,-178,-419,-187,37,194,186,102, +235,314,223,166,131,145,77,215,229,406,254,188,92,132,151,181,130,56,-84,-65,-70,-101,-119,-119,-147, +-29,43,168,308,500,660,585,481,433,413,387,353,498,266,226,217,188,28,5,-4,33,-19,39,-8,49, +21,-40,-59,-50,-241,-213,-226,-225,-230,-237,-258,-221,-197,-185,-161,-152,-104,-125,-112,-121,-130,-130,-190,38,161, +390,-99,85,334,320,287,245,242,215,217,89,-94,273,76,-344,22,-140,-14,-43,-18,-23,-6,-6,13,-1, +14,68,24,25,60,37,27,-4,38,34,32,-54,-112,-231,3,-88,-210,-195,-194,-205,-216,-216,-186,-99,-21, +-220,-187,-389,-75,5,2,-52,-32,-20,75,23,41,155,20,17,115,78,75,5,116,105,18,-95,-10,37, +64,54,38,81,61,-27,13,40,45,5,-67,-72,-183,-688,-558,-386,-350,-311,-58,-135,24,-177,-87,188,-44, +-60,127,25,14,-145,120,128,-28,-4,-10,47,148,137,23,138,144,0,9,-23,99,6,-85,-167,-492,-1200, +-671,-273,-386,-403,-118,-51,270,-61,-59,279,-129,-129,148,92,85,-130,303,290,67,154,102,182,335,431,303, +443,329,194,151,128,240,112,-133,-205,-827,-1094,-371,-559,-550,118,-28,-303,-818,-467,-292,81,-330,-593,-643,-658, +-597,-567,-496,-498,-284,-20,-113,-91,211,247,-19,357,421,104,322,109,-203,-74,-273,-624,-1104,1007,664,-28,-356, +-842,-581,-656,-1245,-342,-300,-689,-343,-158,-51,-67,116,306,-53,-65,128,18,198,238,402,469,490,172,-86,100, +-52,171,576,239,76,20,588,-254,319,1105,1725,2098,1805,925,-342,-304,-483,-651,-876,-725,-94,-68,-4,13,-48, +-152,-276,-237,-113,-257,615,491,-529,58,-3,2,-134,58,147,903,1153,647,20,3,195,306,-50,-577,-308,87, +206,700,490,-113,-381,-877,-1243,-1259,-1125,-794,-729,-542,-215,-87,73,87,534,542,61,312,235,206,457,559,235, +371,277,-18,33,284,136,-6,145,548,495,99,-771,-116,112,-34,159,245,240,285,220,228,130,91,112,147, +256,158,231,252,184,-3,-50,-4,28,75,47,289,356,196,310,154,232,414,447,180,32,-144,-552,-302,-206, +-47,-152,-193,-124,-278,-286,-313,-152,-53,-33,-56,-91,4,85,91,11,87,103,191,201,234,266,262,195,111, +16,277,321,266,230,184,-7,-208,-436,-300,-213,-82,-69,-41,-11,-15,-13,-25,-113,-229,-310,-113,-29,102,84, +84,95,93,99,114,104,104,94,129,175,209,244,-29,88,1,-90,-143,-219,-259,-336,-279,-256,-226,-194,-162, +-137,-107,-76,-29,-11,29,38,45,-8,-65,-120,-130,-142,-77,-50,-6,65,121,202,153,123,106,117,-203,-54, +-107,-115,-142,-157,-175,-208,-188,-178,-164,-147,-129,-105,-108,-113,-120,-116,-106,-86,-246,-303,-329,-208,-317,-390,-352, +-322,-294,-276,-260,-231,-231,-132,-313,-267,-173,-7,26,7,48,67,45,15,-10,-10,-53,-50,8,-9,-8,-35, +-23,-25,-34,-25,-22,-58,29,72,106,59,87,77,102,98,71,86,89,112,62,12,61,24,-45,128,161, +152,53,-22,-75,-62,-187,-147,60,40,13,-87,-73,-76,-93,-46,-45,-86,45,28,98,116,112,17,63,63, +41,22,30,110,52,41,35,-31,-102,181,483,463,337,186,38,78,-259,-235,124,46,84,-68,-63,-100,-143, +-105,-121,-183,-51,10,162,181,179,-13,146,81,56,24,62,215,25,-44,-21,-91,87,717,913,809,447,59, +-36,69,-424,-362,368,255,168,-93,-145,-149,-219,-116,-139,-287,-30,24,195,342,315,41,339,325,149,106,119, +395,166,53,211,36,-218,-594,-1046,-728,-313,339,71,-899,-724,-718,-542,-377,-112,128,-13,-193,-390,-265,-253,-460, +-401,-272,-129,62,210,185,302,316,138,351,213,-65,-83,-48,-238,-172,-66,-104,-693,-998,-1628,-1271,-1076,-1284,-1611, +-1541,-392,-511,-533,-545,-760,-531,170,-2,-79,21,-53,-18,61,275,314,186,187,32,63,-59,210,555,334,45, +-379,-193,751,1275,1423,1473,1078,1323,594,-1092,-654,-628,-525,-411,-321,-219,-203,-183,-114,-279,-286,-185,-189,-1,100, +640,533,-255,143,70,129,31,111,-190,758,1174,1008,852,199,71,85,275,563,972,941,189,578,352,-52,-902, +-1333,-1327,-1100,-881,-670,-583,-477,-276,-71,132,101,417,352,-140,273,252,-7,278,457,420,469,325,100,172,160, +339,356,424,481,326,55,-467,10,444,1210,1100,971,582,320,95,214,288,368,334,255,234,166,375,408,285, +139,70,7,116,131,105,309,394,311,211,139,117,225,379,468,423,306,7,129,139,279,41,-185,-468,-374, +-188,112,-75,-113,-102,-118,-5,33,174,220,201,199,206,290,284,342,388,352,286,186,224,245,315,276,217, +171,161,186,223,281,352,456,492,547,581,442,259,110,169,326,288,119,222,243,241,196,247,177,248,142, +171,98,109,111,123,104,156,69,2,-24,-7,-8,-8,-15,-24,-24,-29,-35,-18,2,56,72,124,140,139, +106,136,59,124,135,127,108,154,160,158,122,168,179,152,125,87,101,78,76,65,77,72,69,66,62, +55,69,83,97,106,109,109,103,97,100,104,102,124,121,76,-63,126,78,-77,-69,-55,-29,-37,-28,-16, +76,113,-8,61,121,-69,-66,-64,-72,-89,-73,-78,-87,-130,-117,-101,-66,-49,-54,-93,-82,-75,-46,-63,-64, +-39,-57,-49,-3,-41,-45,-43,-32,-35,-46,-46,-39,-3,-58,-81,-40,-60,-13,-128,-150,-101,-22,-15,-68,-206, +-225,-199,-106,-27,-18,-121,-106,-108,-40,-115,-92,-50,-67,13,38,31,14,-28,-20,-29,-45,-49,-30,47,-29, +-67,-90,-116,59,-16,-242,-169,-58,-123,-168,-403,-407,-308,-109,39,23,-202,-144,-133,29,-106,-67,-45,-47,70, +177,124,92,56,65,24,1,-19,8,190,11,-44,-46,-60,105,-191,-378,-57,260,130,-83,-494,-577,-444,-149, +153,137,-189,-131,-141,39,-245,-155,-85,-164,95,230,286,185,32,226,269,105,71,91,365,138,79,-7,-101, +-606,-887,-931,-1020,-1427,-636,-264,-289,-477,-514,-258,-178,32,-35,-242,-203,254,145,89,-115,-137,56,151,119,226, +400,304,245,180,255,7,-93,-282,-332,-320,-362,-287,-399,-1190,-1145,-563,-126,-56,-158,-701,-701,-33,-420,-533,-538, +-313,-283,-452,-291,-164,-132,-127,-66,132,380,316,-84,29,7,65,-31,116,41,327,192,-317,-306,1048,1262,1594, +1485,777,767,209,-683,-700,-667,64,-266,-357,-505,-725,-657,-287,-254,-229,-160,-216,-45,159,472,439,-22,174,71, +63,125,236,-74,602,901,1197,1103,-78,-157,-155,168,425,1308,1304,520,303,-97,28,-555,-747,-791,-908,-927,-766, +-582,-403,-288,-130,-5,87,129,88,-183,82,156,53,152,310,510,525,385,142,20,259,170,84,59,207,128, +71,109,237,466,977,606,440,248,335,361,275,218,181,184,107,95,235,457,478,234,246,232,222,237,172, +180,307,384,363,313,124,96,14,107,462,209,56,53,-427,-423,26,79,117,-10,-187,-194,195,245,255,156, +95,196,205,115,119,239,292,301,234,397,447,287,343,264,157,93,208,188,190,229,236,139,50,-48,-35, +-67,-164,-10,137,268,379,458,509,442,414,438,406,299,248,277,280,270,244,247,241,183,146,134,102,86, +61,146,41,123,96,40,4,-17,-40,-86,-110,-134,-165,-201,-256,-294,-295,-293,-282,-219,-184,-144,35,69,128, +166,235,294,304,306,311,331,364,348,319,248,187,175,102,168,131,125,114,97,85,82,65,51,47,29, +17,-4,22,43,59,61,72,60,78,88,117,139,146,143,132,130,126,121,108,118,140,169,81,97,170, +-5,-52,-53,-47,-28,19,15,15,25,-28,-38,-9,-14,-9,-6,-15,-12,8,0,4,39,15,3,-22,17, +-2,-35,-48,-52,-55,-55,-47,-17,-21,-15,-80,-56,-179,-168,-119,-82,-9,-13,-10,-3,-155,-170,-72,-64,-42, +-15,-26,-9,63,31,53,101,39,91,95,66,45,70,16,-1,-13,-3,18,62,13,-49,-133,-157,-296,-340, +-323,-247,5,72,115,166,-168,-255,-120,-147,-96,-70,-90,-60,62,32,83,153,146,190,213,156,118,197,60, +16,1,-7,33,167,37,-66,-213,-248,-724,-567,-409,-373,-128,10,79,111,-443,-531,-283,-264,-217,-92,-91,-27, +183,126,210,320,197,273,321,241,177,206,197,210,63,71,81,279,59,-158,-453,-672,-116,-320,-568,-548,-426, +-277,-180,-62,-28,-189,-678,-331,-390,-503,-456,-334,2,-85,-79,-82,71,223,333,205,222,415,267,163,104,91, +-8,81,-207,-304,-180,-71,-803,-740,-775,-662,-356,229,236,175,-730,-954,-602,-148,115,-119,74,-14,-64,-95,-46, +-28,25,106,226,435,373,-84,-50,-62,62,-129,-73,-172,307,282,-163,-548,1379,1894,1361,853,265,-825,-1035,-309, +-1059,-896,-189,-77,-69,-533,-529,-549,-361,-64,16,-174,-135,16,374,198,120,-59,47,23,-19,50,131,-60,356, +683,1155,1233,-5,8,-160,233,921,1301,1132,687,-538,-1026,-704,-694,-422,-476,-320,-383,-470,-461,-292,-146,-111,73, +389,176,162,128,24,54,128,30,149,477,558,539,354,232,292,285,197,-5,-243,22,147,535,242,309,653, +437,241,-19,-130,-91,60,79,78,144,115,178,257,386,383,186,252,301,487,289,211,181,244,310,349,358, +11,-100,-64,-21,-42,189,219,91,-194,-231,-95,231,523,680,726,569,240,230,233,255,314,326,345,191,99, +83,194,246,300,326,334,294,373,349,282,121,55,-15,113,223,326,245,205,223,165,78,-62,-2,53,170, +151,179,214,253,237,252,211,119,35,175,295,408,295,192,125,129,154,164,144,107,103,85,300,342,297, +245,220,191,164,121,78,60,39,32,-1,-43,-36,-28,-21,-28,-14,-18,-34,82,121,168,188,245,258,302, +328,342,348,389,358,360,337,333,240,261,235,227,207,200,192,185,193,192,190,170,158,139,147,144,140, +141,138,139,138,148,152,196,204,225,228,228,229,235,237,238,232,242,207,235,224,16,-10,-3,-42,-44, +-44,-11,5,34,-25,-29,20,-6,-2,4,17,25,32,25,29,41,52,51,40,48,42,41,11,1,-6, +5,12,34,29,22,-34,-13,-138,-53,-139,-126,-55,64,96,135,-28,-60,61,-17,-23,-26,1,21,44,51, +67,109,133,130,124,107,91,112,28,2,0,14,45,90,71,23,-98,-64,-178,-107,-260,-323,-292,-88,-15, +139,-153,-203,75,-109,-72,-4,33,64,81,60,83,160,224,231,216,196,174,226,58,-20,-16,5,75,176, +104,18,-190,-98,-292,-91,-345,-393,-166,130,244,390,-114,-217,223,-56,-78,-4,-2,36,79,136,151,242,387, +349,349,279,240,330,185,144,17,43,96,311,177,11,-299,-227,221,-340,-595,-748,-782,-437,-241,-56,209,61, +-652,-559,-488,-407,18,22,-310,-291,-239,-93,7,120,258,148,174,374,183,71,70,100,60,77,-97,-129,-147, +254,-749,-796,-714,-357,-264,-3,105,243,-543,-716,-1024,-228,31,33,-11,-64,127,98,59,45,138,173,250,352, +357,40,-15,17,55,-28,5,-169,256,230,43,-524,1476,1247,843,213,-580,-1230,-1294,-126,-1100,-1158,-1107,-496,-301, +-575,-192,-146,-241,-167,-62,-122,-18,180,656,-25,-169,-32,-79,15,-4,-30,18,-49,185,451,1308,1233,225,341, +481,773,1286,1008,635,559,-908,-1127,-756,-200,37,-238,-234,-319,-233,-314,-290,-117,-63,68,564,161,101,206,47, +36,48,-69,15,360,547,597,554,347,319,382,285,164,-35,205,585,1114,717,507,149,76,-85,-367,-501,-554, +-371,-268,-178,-51,90,124,270,244,241,181,218,276,479,387,345,234,231,283,375,338,-18,-53,-139,-112,-27, +202,231,145,245,226,31,400,652,862,863,765,475,299,208,228,272,273,267,309,262,135,128,179,307,189, +213,316,349,327,284,123,147,145,186,193,199,210,274,337,282,232,170,83,-28,-91,-88,-44,7,-1,-71, +-60,43,-25,-55,58,201,328,279,192,133,178,212,250,201,182,171,169,288,248,227,213,206,194,164,150, +134,137,153,156,179,188,184,160,140,121,115,99,120,147,188,201,192,210,207,231,236,238,216,240,238, +262,267,250,207,197,195,187,178,173,172,165,175,174,168,170,167,165,158,157,154,156,158,153,145,157, +167,166,178,198,199,201,205,205,211,206,179,168,225,206,190,-5,-14,12,-44,-51,-16,-24,-11,29,-4, +-10,-3,-26,-32,-36,-10,-2,-2,-4,3,17,28,36,45,27,26,43,11,1,-5,10,23,41,16,1, +-21,-8,-56,-2,-131,-142,-26,-43,-14,59,-19,-47,-21,-46,-54,-71,-20,-7,-14,-14,8,57,104,113,96, +96,80,73,4,-24,-24,2,32,75,61,24,-106,-62,-27,47,-261,-299,-45,-114,-51,172,29,-23,15,-112, +-137,-142,-12,20,25,-4,41,130,188,214,187,186,168,158,22,-44,-43,6,76,151,109,40,-135,-1,-62, +16,-440,-401,61,-88,-6,245,-2,-140,0,-45,-104,-154,-31,20,23,3,74,204,298,377,338,297,240,331, +142,80,-10,29,125,274,226,150,-235,-129,168,-786,-568,-747,-997,-619,-358,-336,400,472,-188,-457,-437,-60,157, +142,-126,-42,29,39,5,81,168,137,184,327,93,6,108,8,-92,47,-92,-132,-216,297,-734,-760,-208,247, +543,131,49,372,-61,-463,-737,-616,-509,-233,-319,-217,-29,-21,-45,-43,138,201,387,210,175,92,2,31,37, +1,25,-115,123,91,68,-491,1073,397,-238,-1079,-2030,-1643,-1268,-719,-576,-451,-697,-474,-326,-95,54,4,-112,-159, +-112,-39,26,222,673,-20,-166,98,-76,70,51,-4,-6,-39,-34,140,867,970,536,735,1290,1480,1331,860,280, +-158,-658,-632,-563,102,186,-38,-226,-277,-209,-241,-275,-223,-229,-91,418,46,21,144,6,14,2,-20,50,320, +468,590,744,521,240,170,130,116,78,496,924,1252,917,412,-381,-426,-415,-228,-256,-327,-484,-372,-244,-142,-12, +123,302,185,137,109,268,333,353,383,390,410,310,283,363,257,176,168,161,138,222,153,157,433,482,564, +635,559,511,656,567,580,577,447,330,248,208,195,155,271,314,263,172,154,138,107,129,202,280,328,359, +293,106,29,-2,-22,-26,46,105,128,118,80,28,-33,-75,-133,-157,-187,-208,-189,-131,-150,-101,15,118,111, +126,152,189,191,221,228,230,233,191,154,134,112,219,223,220,223,195,176,146,124,132,156,186,197,197, +189,193,189,179,166,150,129,137,159,179,188,213,231,213,203,195,177,160,152,161,178,203,203,204,238, +222,211,212,206,204,201,198,186,175,171,175,182,178,178,182,182,183,190,178,164,143,200,185,183,177, +174,167,166,165,156,178,204,160,187,284,-5,1,7,-32,-39,-11,-45,-38,4,-8,-9,-12,-20,-26,-31, +-20,-16,-17,-9,1,19,28,33,30,30,24,17,-4,-11,-16,1,11,22,22,22,-24,-1,-41,-19,-79, +-83,-26,-114,-94,-6,-9,-12,-45,-60,-69,-71,-30,-19,-28,-21,6,65,88,103,98,89,65,44,-2,-22, +-20,7,36,63,77,37,-92,-47,-82,-17,-188,-212,-79,-299,-237,-30,-37,-28,-84,-112,-151,-192,-108,-81,-64, +-39,19,151,182,205,196,180,154,111,-4,-51,-46,2,80,123,141,82,-109,-58,-309,-138,-219,-242,-90,-364, +-320,-75,-64,-77,-190,-168,-221,-282,-118,-80,-78,-85,4,249,315,388,376,269,204,288,115,38,-17,33,133, +225,202,77,-379,-361,212,-744,-470,-581,-865,-606,-350,-265,345,396,-81,-238,-439,-474,-319,-162,-22,63,145,205, +157,148,173,237,261,251,51,-21,96,-141,-127,200,12,-32,-82,447,-550,-570,-75,164,277,-62,-330,-410,-110, +-49,-366,-512,-460,-127,53,113,26,-37,-48,-79,52,203,450,101,3,30,-16,-10,-39,-103,-115,-165,-167,-63, +223,-341,465,-508,-1273,-1591,-1946,-1208,-596,-545,-34,-98,-639,-504,-284,275,123,103,41,106,127,80,160,237,490, +12,-125,86,-59,72,13,20,27,56,-63,-71,316,450,819,1142,1838,1840,1148,546,-72,-709,-281,-259,-569,-500, +-372,93,-6,-14,-212,-213,-222,-187,-137,9,311,80,80,175,-34,-19,-1,72,136,261,404,597,816,701,151, +62,-31,105,481,887,1100,994,693,171,-396,-756,-869,-542,-435,-250,-317,-113,-30,-47,29,155,320,147,78,50, +302,378,272,337,392,507,359,292,361,219,410,387,427,347,143,74,216,526,608,740,820,600,426,289,301, +271,259,272,263,236,207,163,178,217,289,310,237,132,-10,37,71,180,213,302,405,444,76,3,-28,-66, +-61,22,58,82,77,71,84,62,70,55,89,97,116,133,183,181,150,243,288,210,134,73,128,179,249, +266,284,291,273,250,241,164,204,217,234,251,248,237,234,241,231,221,208,201,185,168,155,148,143,137, +136,131,106,109,113,136,163,175,168,152,149,131,136,132,152,162,174,181,244,207,210,211,216,222,227, +233,218,208,199,189,183,180,185,186,188,189,187,190,213,225,231,218,235,263,258,256,250,251,245,238, +241,224,246,249,258,-13,-16,-17,-47,-51,-32,-35,-29,-21,-12,-8,-14,-7,-12,-28,-19,-20,-26,-20,-12, +-2,3,12,28,17,11,1,-14,-19,-23,-6,4,10,15,13,-26,-12,-25,-16,-82,-95,-48,-64,-64,-54, +-38,-40,-56,-27,-28,-66,-41,-38,-44,-28,-9,32,63,68,81,82,59,19,-17,-38,-35,3,36,51,88, +62,-61,2,-28,-9,-177,-224,-146,-126,-100,-98,-16,-9,-56,6,-27,-100,-66,-64,-85,-49,-15,90,128,158, +177,191,158,77,-30,-78,-66,15,97,109,172,130,-90,12,19,160,-88,-204,-97,-90,-131,-156,-93,-113,-200, +-77,-68,-162,-91,-93,-99,-43,25,198,284,320,334,267,232,256,86,-11,-37,29,156,237,262,182,-184,17, +-7,-642,-663,-724,-704,-664,-457,-109,97,241,180,50,-77,-410,-253,-152,-55,-97,-65,74,204,197,178,325,313, +179,36,-44,8,-136,-71,190,148,118,-9,249,-450,-541,72,201,142,16,-52,-214,126,66,-344,-379,-409,-401, +44,211,103,102,110,72,96,192,400,36,-66,-12,-15,4,-108,-119,-167,-308,-306,-97,268,-222,-307,-1097,-1689, +-1765,-1200,-834,-393,-348,-40,-139,-387,-271,-194,-34,49,109,29,100,94,73,240,253,321,14,-83,0,-98,-16, +-68,11,27,74,-111,-242,-190,-123,1235,1573,1680,1321,664,-299,-687,-615,-93,-126,-610,-883,-797,-245,54,209,-26, +41,19,-69,89,194,238,111,81,106,1,7,-2,91,150,146,417,691,904,1032,203,140,126,379,870,1017, +997,691,243,-172,-391,-860,-990,-766,-701,-496,-266,-158,-104,-45,61,119,276,78,38,81,227,283,213,286,340, +398,342,328,408,311,410,337,312,237,108,143,253,465,699,758,692,607,425,84,135,32,-151,-66,-5,81, +139,118,235,227,252,213,166,91,58,69,103,208,197,253,345,391,168,157,124,72,30,57,45,4,66, +155,266,230,227,216,280,332,396,367,304,248,276,298,306,245,176,150,173,234,236,285,297,317,309,307, +309,237,174,149,163,175,183,183,198,218,210,178,155,124,103,72,86,99,126,140,193,226,141,139,120, +134,126,111,107,100,94,100,96,117,121,135,137,137,143,99,113,117,125,131,133,137,122,116,108,109, +107,96,118,130,140,159,166,193,169,179,198,140,151,184,189,192,200,200,205,206,165,129,204,162,128, +17,5,27,3,1,3,-5,-4,7,0,6,19,30,27,1,10,8,1,9,12,13,11,14,15,38, +22,-9,-22,-26,-28,-6,4,3,26,30,-33,-2,21,55,-4,-27,2,-27,-32,-8,-34,-17,16,56,55, +-20,-1,-12,-30,-8,3,10,36,62,88,105,80,21,-7,-25,-30,33,67,54,103,82,-29,46,50,56, +-21,-30,8,-101,-101,-38,-88,-37,42,121,110,-54,-4,-16,-61,-16,-1,27,79,112,162,208,174,37,-38, +-76,-82,47,116,88,178,146,-90,64,251,199,15,1,102,-86,-114,-58,-149,-94,10,156,174,-73,-23,-54, +-123,-41,-4,58,187,234,277,331,296,192,41,-65,-73,53,212,225,309,249,-87,173,-421,-603,-410,-423,-336, +-392,-335,-93,-77,101,384,216,90,-61,40,62,15,-28,4,68,138,172,112,323,314,145,17,-74,-43,-153, +-112,36,167,178,12,-147,-190,-170,40,-22,31,56,63,-71,123,112,130,-244,-338,-395,-319,-217,-140,-48,9, +82,191,229,309,12,-67,7,26,31,-131,-114,-144,-208,-179,-120,1,-71,-710,-1216,-1515,-1348,-482,-530,-483,-377, +-173,-86,-15,-338,-441,-399,-148,10,-13,-53,-41,27,173,150,56,-46,-45,-38,-86,-36,-58,20,-19,-30,-151, +-239,-314,-428,1428,1460,1088,546,186,-831,-977,-359,-387,-356,-309,-493,-524,-443,-273,-125,-8,105,118,-30,216,238, +114,64,12,-13,21,35,-23,46,114,73,390,651,955,1156,378,445,693,904,1209,969,609,124,-338,-624,-806, +-612,-533,-640,-449,-425,-351,-417,-393,-219,28,64,119,7,29,179,140,154,166,257,318,342,352,378,426,435, +308,260,184,135,152,252,421,590,713,693,525,400,214,-30,-138,-197,-268,-186,-109,-20,63,152,314,288,242, +146,105,111,179,180,183,175,191,218,236,302,283,299,248,196,133,152,128,90,160,259,391,396,408,410, +396,383,358,334,294,243,246,254,253,246,239,251,269,310,304,300,293,288,301,322,344,309,93,78,93, +110,124,138,165,193,220,218,215,204,206,204,236,266,305,334,380,418,293,292,255,229,175,140,125,110, +95,93,78,75,76,80,81,79,85,66,79,84,91,93,91,88,85,88,93,106,115,116,134,147,158, +173,180,216,180,167,140,134,124,103,109,111,116,115,119,118,98,81,113,93,74,47,44,44,42,39, +39,20,18,36,15,21,35,62,63,35,37,31,23,34,37,34,39,44,44,64,47,10,6,2,-2, +26,35,25,53,57,-3,35,82,63,52,53,75,55,50,82,3,2,28,96,103,23,33,18,-4,15, +19,11,35,74,113,120,97,26,15,4,-6,65,90,63,108,82,-16,70,71,19,30,39,24,-35,-40, +25,-123,-78,-15,159,166,-24,6,-26,-62,-9,10,-2,63,112,191,206,164,2,-24,-47,-81,73,131,64, +171,152,-93,59,179,47,15,56,143,150,150,183,-78,-116,-80,185,231,-82,-5,-39,-117,-63,-52,-57,64, +177,262,349,300,108,12,-85,-106,89,243,164,288,170,-191,82,-614,-480,-93,-64,-317,-545,-599,-405,-411,-87, +445,241,118,-11,-137,-143,-64,-10,91,219,160,192,188,300,267,113,15,-70,-67,-181,-128,6,122,174,155, +-311,153,20,-252,-290,47,256,318,202,176,72,98,-202,-265,-185,-219,-205,-219,-165,-87,23,168,190,110,-17, +-46,-12,43,27,-135,-118,-130,-100,-223,-296,-202,66,-935,-1183,-709,-358,-106,-279,-521,-580,-415,-195,55,-218,-367, +-435,-398,-307,-195,-170,-84,12,199,127,-149,-60,16,-24,-9,11,-30,49,-20,-84,-62,-165,-347,-635,1216,826, +400,-144,-638,-804,-662,-324,-439,-501,-415,-276,-261,-440,-288,-217,-67,-54,-16,-101,225,212,-80,-9,-26,-65,-7, +20,-36,11,76,23,258,475,854,1032,638,818,1135,1194,1136,740,163,-529,-643,-632,-621,-216,-188,-512,-360,-411, +-521,-484,-379,-284,-62,18,21,38,82,220,86,48,81,216,310,363,396,437,452,579,242,251,252,295,373, +552,688,694,603,415,153,0,-149,-291,-422,-370,-148,-129,-97,-46,83,178,236,227,193,161,171,210,241,285, +268,211,216,218,197,253,310,309,288,273,225,248,259,300,347,434,543,545,543,552,506,446,384,350,355, +334,267,251,231,232,251,233,270,258,286,231,223,187,239,289,338,314,90,134,132,127,130,138,146,147, +181,194,208,226,253,279,300,325,339,370,375,402,411,362,325,279,240,198,178,158,151,138,139,114,122, +105,107,124,78,116,110,116,118,113,109,100,111,123,135,153,167,184,177,174,174,168,164,161,158,143, +134,130,114,89,89,86,76,73,65,63,76,96,52,66,106,45,40,18,33,39,53,39,33,42,17, +13,4,48,58,50,39,33,28,35,37,35,47,57,75,60,51,30,32,30,26,49,57,43,59,56, +16,44,92,31,48,57,78,59,49,78,-4,-22,-37,65,96,70,32,10,8,20,29,25,49,84,128, +106,83,25,16,11,12,66,83,57,93,76,-6,76,40,-44,11,32,93,63,25,59,-99,-111,-151,79, +138,86,23,-20,-33,2,23,7,66,131,220,179,122,-1,-21,-29,-49,82,118,43,150,140,-98,56,228, +57,82,82,135,171,122,195,-71,-165,-243,58,184,116,5,-66,-86,-44,-19,-26,60,180,286,300,252,66, +-8,-91,-107,111,237,137,256,122,-175,174,-694,-329,-96,2,-179,-326,-400,-300,-532,-345,189,119,123,55,-170, +-196,-25,19,84,200,168,214,331,265,188,59,35,-37,-93,-166,-114,20,103,192,316,-417,210,-79,-232,-204, +-24,116,135,-16,35,83,199,40,-58,-235,-142,-119,-204,-153,-68,19,175,145,-55,-47,-35,-43,11,3,-125, +-92,-141,-192,-384,-443,-347,88,-767,-633,103,245,-66,-189,-418,-623,-453,-398,-399,-216,-149,-317,-334,-351,-295,-211, +-107,-48,199,155,-209,-22,86,-3,25,16,-20,37,-33,-40,18,-137,-418,-596,789,177,-416,-793,-1188,-525,-308, +-562,-246,-198,-240,-228,-278,-411,-250,-191,-120,-196,-128,-82,199,196,-150,-64,-79,-118,-40,-17,-66,-22,17,-64, +75,255,630,774,863,1123,1224,1090,693,224,-340,-874,-651,-458,-218,-72,-22,-88,-270,-373,-386,-341,-234,-218,-115, +-60,-52,57,103,182,62,-2,15,161,273,379,477,529,529,719,287,324,459,596,774,947,945,726,408,47, +-249,-504,-603,-568,-486,-384,-202,-175,-119,-60,72,132,109,77,71,116,214,279,280,316,318,298,287,288,267, +324,308,334,366,366,353,383,422,503,528,591,666,619,560,494,448,393,349,349,350,363,325,258,216,207, +211,166,187,166,175,151,142,127,188,245,297,293,157,214,220,233,254,273,285,291,277,257,245,246,265, +290,281,274,252,239,204,193,273,254,253,228,236,238,233,225,224,221,233,205,207,182,191,211,181,237, +232,240,241,241,242,245,252,263,270,280,284,292,270,255,245,229,221,193,179,160,137,199,166,123,123, +122,117,114,108,108,157,205,98,149,263,39,26,3,28,36,51,40,35,35,17,10,-12,29,41,59, +33,29,32,36,39,41,52,59,78,53,44,31,30,31,35,47,51,37,51,48,19,33,67,-9,13, +33,72,67,62,61,-6,-45,-91,-4,48,102,32,12,25,35,49,52,70,97,133,92,67,29,13,12, +30,61,69,45,70,65,22,68,11,-65,3,53,132,85,73,42,-68,-119,-210,-3,73,169,31,-3,14, +35,63,51,99,160,231,159,91,14,-21,-14,2,80,95,27,117,118,-53,26,239,-21,3,88,187,189, +163,153,-42,-213,-385,-134,82,271,40,-39,-19,21,63,49,113,198,313,266,214,64,-31,-100,-80,123,208, +97,208,111,-73,199,-728,-200,-67,-3,-137,-160,-230,-207,-584,-452,235,195,166,121,7,-10,54,95,98,96, +133,208,389,221,118,13,48,-8,-107,-138,-89,14,88,178,341,-521,247,-49,-76,-174,-381,-63,5,-230,-32, +3,-98,-1,29,-185,-126,-132,-130,-96,-6,51,180,128,-116,-42,-1,-19,4,-24,-104,-80,-159,-217,-353,-390, +-355,149,-396,-104,292,381,120,20,-165,-513,-399,-393,-370,-100,-62,-254,-246,-261,-229,-199,-119,-77,113,113,-176, +-21,89,3,1,-4,10,2,-75,-43,7,-128,-305,-400,213,-402,-1256,-1392,-1184,-505,-236,-474,-218,-143,-139,-143, +-150,-191,-139,-143,-145,-179,-93,27,122,108,-120,-93,-98,-123,-21,-35,-117,-80,-80,-214,-119,-10,308,347,1054, +1306,1142,815,361,-307,-696,-773,-506,-351,-231,-262,-137,70,-66,-149,-111,-147,-144,-143,-107,-79,-90,21,62,84, +31,2,32,140,261,403,611,687,647,880,388,424,568,707,888,965,839,477,51,-290,-476,-698,-734,-605,-473, +-380,-337,-255,-147,-39,79,105,31,-23,-17,60,207,297,323,324,326,301,354,382,356,418,364,440,519,552, +580,593,643,751,719,694,669,571,457,316,258,204,142,165,146,178,230,180,187,201,204,202,169,167,140, +152,138,143,185,225,260,314,244,348,363,381,418,452,474,493,448,422,398,385,383,387,351,313,271,232, +187,142,169,197,219,219,234,260,275,289,290,309,331,318,325,304,299,334,308,365,357,369,371,375,380, +395,391,392,389,387,382,382,362,348,335,317,304,281,261,250,220,286,265,233,231,229,233,229,227,233, +282,327,227,277,385,40,22,8,23,29,31,45,47,39,26,18,6,22,34,62,37,34,40,44,47, +51,55,56,67,48,37,25,23,25,37,37,37,28,37,42,24,28,31,-21,-8,3,14,56,61,32, +-9,-41,-59,-35,4,87,34,31,49,59,74,74,85,105,121,85,61,31,18,21,48,57,57,39,44, +42,40,52,-15,-124,-56,-8,6,98,123,40,-29,-86,-140,-59,2,156,34,22,55,76,104,93,138,177, +215,140,78,21,-9,14,45,75,67,22,67,82,10,21,60,-198,-155,-64,-29,106,140,40,-57,-207,-311, +-241,-62,180,33,6,53,88,134,112,155,215,318,250,183,56,-38,-88,-33,118,160,53,126,58,-17,105, +-575,-61,-35,-8,7,119,66,-52,-370,-252,406,222,151,138,61,60,81,122,131,78,146,231,351,190,90, +-9,41,15,-96,-82,-38,6,115,176,282,-467,250,28,-5,-152,-506,-209,-140,-303,-229,-256,-236,-175,-99,-4, +-73,-113,-64,-29,59,106,126,84,-83,1,56,32,21,-26,-70,-68,-130,-132,-268,-306,-230,167,-202,106,274, +299,193,142,10,-291,-338,-323,-186,-105,-102,-62,-134,-141,-72,-139,-85,-7,64,71,-98,-33,49,15,-10,-4, +27,-12,-104,-135,-51,-155,-238,-288,-352,-869,-1607,-1528,-805,-586,-343,-158,-239,-214,-110,-110,-60,0,-85,-129,-96, +-75,7,146,28,-17,-90,-72,-56,-55,12,-19,-117,-124,-163,-314,-284,-269,-71,-135,1105,1169,906,473,-49,-640, +-782,-463,-373,-316,-319,-368,-330,-216,-65,-9,-37,-88,-98,-50,12,38,-96,1,13,-15,-15,9,84,123,238, +372,692,814,746,945,487,497,586,643,684,666,396,-99,-360,-482,-479,-546,-522,-436,-466,-409,-359,-270,-180,-61, +35,38,0,-13,16,110,212,291,349,348,350,320,378,411,402,477,440,525,638,720,817,781,805,863,723, +556,398,328,248,169,115,58,-23,-17,-31,-19,71,102,173,207,230,260,211,209,170,202,196,215,261,286, +317,391,421,523,515,508,517,521,513,512,471,466,446,437,416,390,360,332,309,286,259,218,208,240,254, +258,267,293,325,353,364,392,415,416,431,434,436,481,419,468,449,453,446,451,455,462,458,450,443,428, +418,413,403,393,382,364,351,340,324,316,290,348,335,307,310,313,325,327,333,343,380,418,352,393,453, +48,31,19,23,29,31,51,51,38,31,22,13,17,28,60,43,44,50,55,57,60,65,64,64,52, +43,30,32,35,51,41,37,34,37,47,44,39,25,9,9,11,4,61,65,26,11,-18,-35,-47,-20, +71,36,44,63,76,90,90,105,116,113,84,61,33,31,39,75,59,53,48,32,40,78,58,-28,-100, +-70,-62,-50,97,101,12,-16,-76,-127,-120,-68,119,35,41,75,102,129,123,173,192,195,128,76,24,11, +45,99,73,48,42,34,59,96,48,-12,-105,-98,-114,-140,89,105,-13,-16,-147,-245,-288,-169,111,17,25, +77,124,170,153,201,241,298,219,144,36,-27,-48,34,105,114,49,48,12,90,88,-384,-114,-111,17,45, +215,177,25,-259,-216,279,38,5,155,33,22,57,91,126,134,223,276,300,181,90,-11,40,39,-59,-25, +10,36,183,215,232,-305,116,203,148,-87,-487,-451,-351,-153,-199,-183,-102,-212,-173,-24,-55,-66,-56,11,93, +167,86,52,-11,38,86,41,9,-30,-36,-39,-95,-116,-233,-258,-175,41,1,220,173,123,205,251,170,-36, +-237,-263,-165,-99,-36,19,-3,-1,51,-22,14,145,75,73,-4,5,37,38,18,7,17,-31,-122,-185,-95, +-162,-307,-143,-749,-1084,-1182,-992,-468,-486,-387,-118,-217,-135,0,-56,-74,-91,-90,-102,-103,-25,49,196,-2,-69, +-70,-30,-5,-12,18,-3,-63,-124,-179,-279,-306,-377,-393,-502,922,742,418,17,-531,-677,-587,-315,-320,-315,-334, +-253,-247,-332,-199,-64,-27,-65,-19,68,71,80,-61,18,12,-60,-29,7,83,76,158,248,604,774,753,826, +594,602,627,568,453,212,-142,-523,-540,-492,-426,-367,-329,-258,-385,-400,-320,-283,-233,-135,-78,-51,-18,48,119, +218,237,275,341,372,408,437,390,390,446,542,500,546,622,697,812,752,747,731,497,241,-12,-17,-38,-42, +-37,-37,-62,-53,-37,-35,19,88,147,174,204,226,224,234,228,275,290,334,379,401,420,468,543,553,531, +511,489,473,448,444,428,452,443,436,408,375,350,325,304,285,260,234,265,271,286,299,321,341,371,397, +415,436,456,462,477,489,505,526,461,468,459,454,447,450,451,448,445,436,432,417,408,404,394,384,374, +361,350,332,355,359,359,375,380,374,376,381,389,394,402,411,433,445,439,454,473,61,42,30,38,45, +46,66,66,53,50,39,17,22,31,63,55,58,61,66,70,74,76,73,65,62,52,35,41,45,66, +46,41,45,45,58,69,51,39,22,34,35,16,71,79,43,44,8,-45,-52,-26,67,54,68,77,92, +105,106,121,127,110,87,65,41,45,57,104,67,59,68,34,53,139,79,9,-48,-18,3,-5,112,123, +40,52,-28,-151,-145,-95,96,54,73,92,119,147,152,197,205,179,126,78,33,25,67,154,76,47,84, +28,58,214,78,69,2,18,-15,-108,83,110,9,63,-73,-281,-309,-203,100,60,85,115,162,208,198,250, +271,274,198,121,33,-20,-6,119,105,84,76,-2,37,298,157,-291,-197,-116,66,159,250,216,183,-125,-170, +57,-18,-13,107,29,15,46,92,131,142,293,319,260,173,98,7,54,51,-39,-6,47,115,224,192,97, +-214,57,505,253,-88,-394,-605,-497,-15,-83,-38,-18,-123,-150,-111,-76,-39,31,69,119,198,70,43,50,62, +91,31,-13,-45,-19,-24,-85,-137,-189,-171,-115,-71,151,157,-22,-19,78,283,290,88,-69,-118,-113,-101,-51, +-40,84,115,103,67,109,287,83,64,69,52,48,39,36,6,10,-55,-128,-169,-77,-149,-322,-1,-886,-924, +-461,-313,-417,-368,-336,-251,-138,-30,-12,-106,-169,-227,-199,-119,-68,30,95,217,-11,-66,-31,-8,20,6,17, +-1,-16,-103,-153,-210,-208,-348,-557,-688,506,138,-280,-493,-745,-486,-294,-256,-268,-252,-178,-153,-117,-118,-211,-187, +-93,-76,4,123,24,18,13,48,29,-63,-9,16,30,9,41,74,361,537,594,513,739,750,689,504,263, +-213,-519,-626,-535,-443,-376,-297,-272,-220,-261,-283,-200,-247,-221,-148,-159,-108,-60,62,168,273,250,259,314,388, +463,558,446,438,570,666,472,489,494,516,589,510,446,343,149,-52,-270,-243,-234,-231,-183,-140,-102,-54,-4, +35,57,89,101,119,139,142,197,246,291,343,372,428,443,449,438,460,529,482,456,434,395,367,343,336, +328,338,328,307,277,257,236,210,180,150,109,82,197,189,228,258,312,338,364,385,410,425,444,466,468, +478,492,485,444,427,425,416,411,413,411,406,394,381,375,361,350,337,327,318,312,306,305,275,328,344, +373,358,376,396,400,406,412,421,430,438,442,437,453,449,477,73,53,49,53,59,55,78,79,59,67, +57,28,31,38,60,64,70,71,76,80,87,85,80,71,69,60,46,52,58,81,57,52,62,54,66, +96,62,53,42,51,45,26,78,89,40,72,40,-36,-43,-28,39,63,86,88,101,114,120,130,134,108, +92,74,52,58,70,121,76,66,87,42,66,182,99,31,-25,17,38,14,125,142,17,97,23,-146,-143, +-106,26,57,93,102,124,153,173,208,207,161,126,83,45,38,78,182,78,56,119,32,63,283,97,78, +-4,34,-1,-82,71,105,-41,100,2,-278,-314,-247,-29,52,121,140,168,211,222,277,283,252,193,122,51, +-18,26,194,108,71,114,-28,59,419,183,-230,-127,-17,141,327,293,247,271,18,-71,-49,43,62,73,41, +25,37,102,167,163,317,340,226,171,116,36,71,55,-34,-1,78,189,244,144,-55,-189,64,653,165,-173, +-281,-603,-498,45,0,66,72,-19,-83,-78,-105,-71,43,67,104,177,49,35,93,80,90,42,-13,-42,-16, +0,-44,-107,-103,-69,-46,-118,80,-18,-96,-30,-14,256,307,102,45,-38,-114,-172,-121,39,-11,4,79,92, +159,346,92,51,138,83,49,34,36,0,6,-73,-122,-136,-115,-207,-308,-3,-781,-449,-6,14,-368,-329,-308, +-300,-90,-9,-12,-111,-157,-123,-214,-145,-56,46,108,205,20,-44,-4,-3,34,36,11,-4,0,-65,-112,-143, +-125,-301,-572,-713,-2,-505,-907,-865,-673,-297,-118,-150,-143,-135,-60,-176,-185,-78,-116,-139,-130,-35,15,89,-33, +-19,88,51,20,-39,24,43,-10,-62,-77,-86,62,203,327,139,840,807,648,359,-14,-436,-602,-564,-428,-330, +-302,-191,-154,-156,-157,-165,-133,-166,-142,-75,-137,-117,-77,42,144,223,226,241,279,408,500,575,509,525,671, +734,434,439,368,335,334,216,73,-111,-203,-298,-414,-376,-354,-340,-295,-254,-209,-151,-109,-38,35,61,84,103, +117,132,203,272,343,381,420,473,470,469,458,456,449,375,355,333,300,271,261,254,234,209,180,141,100, +66,58,46,30,16,-1,-24,62,61,107,155,214,239,266,292,330,349,376,420,412,421,415,391,384,322, +330,322,319,320,317,315,296,283,272,258,244,224,226,225,225,223,227,207,271,307,361,293,337,398,406, +412,417,430,439,450,414,373,451,413,379,86,73,71,68,72,67,89,90,66,83,74,40,44,47,56, +73,80,82,86,91,100,97,92,79,80,74,61,66,72,92,70,67,79,68,78,115,80,86,90,72, +58,41,91,103,47,100,72,-19,-25,-23,11,63,94,98,110,123,140,141,140,109,98,84,67,74,85, +128,88,78,101,55,82,204,127,66,35,44,60,32,136,144,15,130,70,-114,-122,-110,-45,44,97,107, +131,162,195,214,204,139,122,91,58,53,85,181,82,69,134,43,77,307,128,124,90,69,0,-71,81, +130,-39,144,65,-234,-279,-277,-159,8,114,143,169,210,247,287,285,220,184,129,67,-7,50,233,108,73, +139,-26,80,473,237,-188,-37,28,211,505,296,186,185,124,71,-46,82,91,61,37,18,27,78,167,235, +312,313,206,181,145,61,84,55,-34,4,107,236,270,129,-132,-198,58,681,72,-243,-257,-484,-329,187,81, +89,159,96,23,-20,-72,-66,-26,32,72,146,49,54,122,96,84,64,-1,-25,3,52,13,-58,-43,-39, +-9,-140,-36,-80,-70,9,10,233,241,117,89,30,-1,-107,-89,48,-2,-1,29,100,156,311,97,39,152, +107,57,29,48,10,-4,-85,-108,-95,-187,-252,-270,-59,-516,4,156,41,-269,-349,-317,-223,-120,-88,-40,-137, +-155,-54,-47,-17,-41,43,75,118,65,25,24,25,54,68,3,-10,19,-12,-66,-66,-85,-255,-485,-603,-429, +-952,-1127,-908,-464,-231,-99,-84,-56,-61,-70,-130,-178,-130,-131,-110,-87,57,96,91,-26,-10,111,39,12,-2, +56,59,-35,-126,-167,-177,-176,-90,66,-175,759,640,375,63,-320,-502,-528,-467,-310,-228,-236,-123,-78,-74,-85, +-79,-117,-106,-91,-42,-74,-68,-26,48,112,133,174,217,254,405,487,522,497,514,626,629,424,409,281,212, +128,-20,-205,-407,-435,-469,-517,-472,-435,-395,-374,-355,-336,-278,-237,-173,-70,3,72,111,147,193,246,285,347, +366,416,461,475,497,521,481,347,251,226,193,165,137,132,117,101,71,43,10,-28,-67,-50,-35,-24,-12, +2,1,28,9,24,62,89,88,123,163,217,244,274,337,320,326,304,269,236,154,166,157,150,145,135, +128,114,104,95,82,73,55,69,76,84,90,99,98,157,201,275,154,213,295,310,318,324,341,353,370, +291,220,361,286,165,92,85,82,80,83,76,94,94,74,88,80,51,53,53,55,75,84,86,91,96, +107,101,96,84,83,79,72,76,81,95,79,77,86,75,81,121,90,121,112,91,72,50,94,103,54, +104,81,-4,-9,-12,4,64,95,102,117,132,158,148,139,106,96,86,75,87,97,123,100,87,100,60, +89,205,146,119,86,89,97,55,143,133,36,126,75,-70,-94,-97,-68,36,96,107,136,169,216,209,193, +120,112,91,61,71,95,159,91,81,130,49,79,297,153,222,177,136,35,-60,75,125,-21,131,74,-171, +-224,-259,-186,3,110,141,182,230,295,294,274,180,162,131,73,14,72,242,114,82,135,-26,99,495,311, +-176,-27,38,288,638,327,150,84,184,133,-129,109,128,19,18,15,41,46,114,252,264,245,196,190,169, +76,87,49,-43,13,144,277,290,114,-195,-232,95,596,12,-268,-289,-358,-182,249,101,86,221,151,82,73, +8,-12,-9,59,89,143,97,105,143,107,70,72,13,-1,43,82,31,-38,-82,-78,51,-89,-68,-75,-107, +-37,3,144,149,184,123,69,61,-108,-101,24,36,65,61,143,158,215,99,47,129,125,69,23,68,30, +-14,-82,-91,-58,-210,-227,-199,-82,-261,108,122,14,-131,-244,-256,-168,-147,-111,10,-107,-111,30,64,75,45, +105,108,72,102,107,82,77,76,79,9,-4,50,33,-20,20,-62,-205,-347,-414,-646,-1029,-886,-685,-380,-293, +-207,-113,-41,-29,-114,-30,-49,-108,-107,-74,-36,72,120,106,25,22,97,35,28,40,72,45,-66,-171,-218, +-208,-333,-295,-135,-372,464,263,-36,-238,-431,-418,-350,-268,-177,-152,-209,-141,-108,-89,-78,-51,-52,-37,-37,-34, +-34,-4,55,84,107,87,127,185,219,333,395,423,400,381,411,371,399,355,191,86,-67,-206,-374,-550,-518, +-497,-482,-454,-430,-401,-384,-370,-352,-299,-240,-191,-127,-37,37,97,162,226,263,272,311,329,376,414,443,490, +541,461,214,117,85,51,25,-2,-15,-45,-53,-81,-101,-122,-141,-167,-127,-92,-62,-34,-7,18,33,5,-1, +14,12,-3,29,66,115,140,160,218,191,190,171,134,72,11,18,5,-6,-19,-33,-47,-53,-57,-62,-69, +-75,-91,-72,-61,-47,-35,-22,-13,30,60,119,19,63,117,134,144,151,166,180,196,118,59,185,115,-23, +89,88,80,84,85,79,88,86,72,81,75,52,54,54,54,72,81,83,88,93,103,99,96,88,80, +79,79,85,88,94,86,86,89,77,76,120,93,134,104,97,82,66,88,93,61,93,73,1,0,-3, +6,60,88,95,112,128,158,149,130,105,88,81,74,93,104,113,106,91,89,59,86,183,141,140,102, +114,125,89,121,100,41,99,56,-56,-68,-76,-64,31,88,98,130,160,221,196,173,115,97,82,55,87, +104,137,106,95,114,47,68,251,146,247,168,146,70,6,61,102,15,104,52,-153,-190,-227,-176,-4,90, +123,172,230,328,296,250,158,139,124,64,33,90,231,129,91,109,-28,97,435,307,-134,4,117,350,664, +289,80,13,136,101,-167,193,229,33,33,29,70,47,69,192,187,168,177,184,180,87,83,41,-52,37, +190,306,273,72,-262,-235,148,337,-143,-321,-330,-263,-94,171,98,82,96,153,125,68,44,32,11,98,117, +135,150,152,159,113,60,72,29,27,79,87,25,-54,-113,-52,106,35,-53,-61,-124,-70,-42,71,116,245, +191,126,69,-65,-66,9,48,90,80,186,176,119,84,55,105,132,70,25,72,40,-7,-68,-66,-3,-189, +-179,-120,-77,-124,-27,43,39,-56,-75,-139,-205,-171,-122,-6,-3,5,41,127,131,90,145,143,79,137,155, +130,119,93,81,22,14,69,60,19,89,-68,-174,-215,-226,-630,-746,-483,-416,-386,-353,-298,-205,-28,24,-105, +-13,-19,-87,-52,-15,41,99,124,94,69,60,95,50,52,69,63,7,-96,-186,-229,-213,-375,-379,-272,-453, +99,-119,-354,-391,-343,-244,-130,-9,-79,-132,-187,-136,-116,-126,-81,-47,33,33,22,-16,-23,17,101,98,108, +102,121,154,145,199,241,268,271,220,150,90,294,215,53,-67,-241,-339,-453,-560,-477,-403,-347,-351,-351,-357, +-328,-308,-284,-230,-160,-109,-91,-30,16,71,139,194,235,244,286,290,320,341,354,399,441,343,92,18,-16, +-43,-68,-91,-113,-158,-165,-195,-206,-216,-218,-226,-188,-154,-125,-98,-78,-47,1,-23,-22,-12,-12,-21,-3,17, +48,61,72,107,82,73,62,30,-43,-75,-75,-91,-103,-122,-137,-151,-152,-153,-156,-159,-164,-176,-160,-151,-138, +-126,-113,-110,-69,-49,-6,-69,-37,-6,4,10,13,23,31,42,-8,-44,31,-12,-133,84,83,76,83,84, +76,82,79,68,74,68,51,55,55,55,70,76,77,82,86,92,91,90,87,74,73,75,85,87,88, +86,85,82,73,71,106,87,124,92,98,89,71,80,82,62,80,65,12,13,13,21,61,80,83,102, +116,141,139,117,105,79,73,68,95,109,103,108,90,73,56,76,147,122,129,95,123,137,92,107,90, +44,77,44,-35,-35,-42,-37,37,83,83,119,140,199,174,150,120,81,70,44,99,115,118,117,103,87, +44,58,193,121,211,129,138,97,32,52,80,33,77,49,-107,-137,-165,-131,3,70,87,148,206,308,280, +220,158,119,109,42,51,108,207,144,98,75,-18,84,338,256,-56,73,196,360,606,262,88,46,57,35, +-118,267,311,76,76,65,92,59,46,110,122,115,150,169,184,106,74,31,-50,76,236,296,218,25,-281, +-187,202,-5,-249,-300,-317,-215,-117,-74,57,75,-45,162,172,60,35,27,21,131,146,107,160,164,161,127, +67,76,36,49,111,91,15,-79,-65,28,84,188,-48,-62,-101,-80,-66,30,120,260,259,191,82,42,1, +-18,80,123,77,196,183,66,56,44,75,122,61,36,62,40,6,-48,-33,34,-178,-127,-25,-63,-51,-121, +11,64,-4,49,-30,-213,-176,-155,-110,16,50,-1,126,148,123,152,139,87,153,162,144,134,97,84,30, +27,72,68,31,102,-69,-130,-122,-76,-470,-366,-192,-222,-334,-327,-298,-229,-9,58,-42,-17,-21,-23,-25,3, +76,133,130,62,96,88,102,67,64,86,34,-35,-114,-173,-203,-203,-316,-359,-359,-435,-216,-373,-483,-398,-217, +-69,34,113,-95,-179,-134,-116,-95,-87,-36,4,74,90,77,10,-12,14,92,81,95,122,137,131,57,58, +75,83,146,93,-45,-145,127,30,-84,-178,-316,-360,-407,-434,-351,-280,-232,-253,-260,-278,-245,-222,-194,-149,-93, +-43,-31,-3,23,55,105,135,183,198,260,234,242,233,219,241,260,167,20,-27,-62,-88,-114,-139,-173,-228, +-240,-265,-275,-279,-281,-289,-258,-232,-207,-186,-171,-147,-85,-86,-67,-47,-28,-20,-12,-5,14,17,27,47,30, +16,10,-16,-100,-114,-121,-138,-151,-171,-185,-198,-197,-199,-203,-207,-211,-219,-206,-198,-188,-178,-165,-163,-134,-118, +-86,-118,-95,-70,-67,-63,-65,-58,-54,-47,-73,-92,-60,-81,-184,78,74,70,79,79,68,74,72,65,66, +63,57,57,57,59,67,71,70,74,77,79,80,80,82,67,66,68,81,83,79,81,79,71,67,64, +88,75,109,83,92,83,58,68,68,63,69,64,41,35,36,41,69,79,74,87,96,112,120,102,102, +69,64,61,97,111,93,103,84,55,51,64,111,101,105,82,125,129,66,88,75,53,61,43,22,8, +4,5,54,82,70,100,110,150,143,125,122,66,59,35,112,127,103,119,100,61,42,49,136,92,178, +105,127,92,1,29,46,44,61,74,4,-50,-70,-56,43,74,62,117,159,238,239,186,158,99,88,13, +70,128,178,148,92,38,-11,63,244,206,-33,95,235,346,501,240,120,101,-17,-49,-90,251,303,88,97, +98,115,78,38,42,70,81,132,154,180,134,62,18,-39,126,274,254,158,-4,-246,-165,260,-282,-247,-231, +-273,-199,-206,-340,30,111,-87,121,155,119,67,33,21,140,158,73,137,146,146,151,90,78,37,63,144, +90,7,-87,1,81,22,328,-59,-71,-89,-69,-8,5,108,237,252,190,80,96,33,-19,51,98,63,165, +155,33,30,18,38,92,42,52,55,35,19,-30,0,53,-135,-37,58,-48,4,-93,6,52,68,99,27, +-152,-154,-161,-185,-25,46,29,85,107,125,133,114,74,136,134,124,133,93,75,32,26,63,55,21,67, +-46,-68,-64,22,-313,-138,-74,-119,-225,-247,-229,-164,-36,-2,-50,-1,22,22,38,67,98,130,109,30,102, +98,89,69,63,96,5,-64,-115,-143,-161,-187,-247,-317,-410,-386,-403,-470,-473,-349,-167,4,57,9,-133,-163, +-71,-91,-69,-30,-1,45,70,118,113,37,23,25,56,54,71,110,124,93,-14,-48,-58,-69,27,-11,-152, +-290,-30,-116,-166,-208,-273,-276,-267,-239,-197,-175,-159,-173,-175,-186,-155,-131,-107,-92,-72,-43,-19,-3,16,38, +72,90,129,141,208,158,144,105,74,73,75,2,-15,-53,-84,-111,-138,-166,-204,-252,-263,-274,-281,-283,-290, +-306,-280,-260,-236,-215,-193,-175,-147,-121,-97,-71,-48,-26,-21,-17,-4,-2,12,29,16,1,-7,-32,-128,-134, +-144,-157,-170,-184,-195,-207,-205,-208,-211,-216,-218,-223,-211,-203,-194,-185,-175,-166,-160,-150,-133,-138,-127,-107,-106, +-102,-104,-96,-95,-88,-104,-116,-104,-116,-205,70,66,60,72,70,57,63,63,61,58,57,61,58,58,60, +64,65,63,64,65,63,70,73,79,61,63,65,81,83,75,79,75,64,63,58,75,67,91,62,75, +69,40,51,54,61,59,65,70,54,53,56,73,76,68,70,72,80,101,87,97,62,58,56,98,112, +86,93,75,43,48,56,84,79,79,66,115,109,34,58,57,61,47,43,75,43,44,45,71,81,65, +75,72,95,109,101,121,57,54,34,126,138,94,113,91,45,39,37,86,62,125,64,86,63,-37,-6, +13,55,52,97,111,31,14,14,77,84,59,76,93,144,183,151,164,85,67,-9,90,148,146,136,78, +10,-3,46,164,145,-52,100,262,320,384,209,135,137,-62,-121,-124,152,238,109,101,102,122,90,44,7, +32,53,118,136,167,162,52,6,-12,175,291,196,107,-35,-238,-188,304,-453,-243,-183,-207,-165,-232,-431,42, +158,-95,85,130,145,107,80,56,142,157,62,111,123,121,174,114,80,46,81,167,87,9,-77,41,113, +0,429,-99,-103,-50,-4,92,2,81,196,215,179,70,121,56,-8,-3,40,49,108,92,-2,2,-16,-6, +54,24,60,55,31,32,-9,32,71,-33,50,72,-73,63,15,22,39,143,102,28,-93,-139,-157,-235,-47, +44,48,64,77,97,99,84,54,94,88,81,119,85,59,30,20,51,31,1,6,-27,-16,-19,79,-231, +-92,-45,-58,-118,-164,-143,-81,-73,-78,-96,-17,29,26,80,119,141,109,77,29,98,94,53,60,56,92, +-14,-75,-95,-101,-116,-168,-218,-302,-434,-343,-438,-442,-390,-294,-174,-61,-70,-179,-136,-85,-27,-59,-51,-10,14, +51,73,108,110,57,60,50,33,35,47,86,72,33,-60,-117,-143,-155,-73,-89,-174,-322,-146,-220,-221,-212, +-210,-175,-116,-55,-63,-88,-99,-94,-85,-84,-55,-29,-7,-29,-47,-65,-43,-27,-7,19,45,68,87,91,142, +82,53,-3,-38,-60,-74,-128,-38,-73,-99,-127,-155,-184,-224,-256,-254,-240,-236,-231,-233,-242,-224,-210,-187,-168, +-141,-124,-132,-95,-78,-60,-43,-17,-15,-15,-10,-6,6,23,7,-6,-15,-39,-134,-128,-138,-148,-157,-166,-172, +-186,-179,-181,-181,-183,-181,-181,-172,-166,-161,-154,-149,-135,-149,-150,-154,-127,-132,-130,-128,-123,-122,-115,-114,-108, +-117,-118,-128,-130,-181,60,56,50,61,58,44,50,52,55,50,51,59,52,53,56,58,58,56,53,53, +50,58,62,72,53,57,59,76,78,68,71,67,57,56,52,62,57,62,40,56,52,20,31,37,57, +51,60,80,55,53,59,67,67,62,54,51,54,77,72,86,54,52,54,96,108,77,82,66,38,46, +50,63,56,54,49,92,75,-1,25,35,65,41,44,100,50,55,64,78,78,65,53,43,52,76,80, +110,50,53,41,135,145,90,106,83,40,42,34,55,40,54,17,41,25,-80,-52,-24,60,51,103,170, +64,39,41,79,81,60,39,35,62,119,120,171,80,51,-13,110,162,114,118,67,0,13,41,110,85, +-33,139,258,260,284,210,171,156,-69,-155,-165,41,168,175,126,109,125,97,65,8,11,36,101,112,145, +181,46,1,27,214,289,131,76,-51,-250,-183,281,-546,-210,-114,-137,-144,-196,-320,86,192,-66,80,116,138, +121,108,109,139,140,68,96,98,90,182,133,82,68,104,174,77,15,-36,70,133,-10,448,-142,-138,29, +84,171,27,61,126,191,197,71,145,66,-44,-42,-3,55,58,35,-29,-21,-42,-47,11,10,64,55,33, +42,20,54,59,41,90,37,-111,120,118,58,55,174,90,13,-60,-105,-130,-236,-70,20,39,36,62,97, +85,73,45,52,49,44,98,75,45,31,21,38,12,-13,-40,-18,11,5,103,-206,-131,-53,-32,-72,-100, +-79,-21,-104,-121,-85,-45,-14,15,72,103,132,60,35,40,79,69,15,48,46,68,-22,-70,-62,-63,-88, +-158,-233,-325,-444,-311,-373,-348,-287,-246,-187,-194,-228,-266,-131,-54,-51,-51,-38,-10,33,57,105,90,88,72, +81,72,29,32,30,63,4,-39,-96,-157,-187,-194,-133,-122,-134,-275,-244,-307,-274,-230,-181,-114,-31,37,7, +-26,-41,-23,-8,4,32,58,88,44,12,-39,-43,-30,-19,12,35,68,64,56,79,22,-12,-68,-114,-159, +-194,-235,-59,-93,-108,-128,-153,-176,-207,-222,-206,-181,-166,-155,-148,-146,-139,-133,-119,-108,-88,-74,-85,-50,-37, +-27,-15,13,5,-2,-8,-8,-4,6,-12,-22,-27,-50,-111,-96,-103,-108,-111,-115,-116,-127,-119,-118,-116,-113, +-109,-104,-101,-100,-100,-96,-95,-86,-106,-115,-135,-81,-98,-114,-113,-108,-107,-103,-104,-104,-101,-91,-125,-115,-108, +49,46,44,48,44,30,37,39,45,41,42,54,41,41,45,47,48,48,44,43,40,47,50,61,42, +49,54,70,71,61,62,58,50,50,45,52,47,39,31,41,35,3,11,20,47,43,51,79,38,30, +39,48,53,53,42,38,38,56,56,66,45,47,53,92,100,69,70,58,35,45,47,50,41,42,47, +71,42,-35,-4,8,55,34,39,107,25,27,44,61,64,62,41,30,30,52,60,81,42,55,55,139, +149,90,101,78,42,51,40,42,33,10,9,26,1,-113,-95,-59,52,48,94,189,39,-9,1,38,61, +54,21,6,14,67,89,155,77,47,3,127,172,91,101,64,7,30,43,79,50,31,172,196,166,204, +224,208,139,-53,-156,-175,-59,91,252,161,126,130,108,90,38,20,35,80,85,119,184,45,8,77,245, +272,81,67,-38,-228,-114,155,-550,-114,-15,-102,-127,-148,-202,117,206,-16,67,97,136,138,132,138,117,105, +67,76,73,66,172,143,82,92,127,171,53,20,26,94,129,-13,345,-131,-125,101,152,187,41,24,31, +141,185,92,136,60,-37,-73,-34,90,28,-7,-46,-38,-52,-64,-25,6,74,56,37,48,43,61,27,82, +119,25,-96,137,156,97,87,131,80,36,-14,-51,-80,-169,-78,-16,24,-2,27,98,80,76,51,26,19, +25,70,59,37,38,30,29,10,-7,-54,-18,7,-9,91,-214,-151,-95,-53,-33,-46,-43,-22,-152,-158,-71, +-60,-33,-3,60,79,84,14,-2,35,42,34,3,38,30,29,-23,-52,-35,-41,-83,-163,-262,-352,-426,-298, +-273,-251,-211,-216,-219,-294,-304,-237,-148,-92,-86,-56,-30,-15,36,60,115,67,61,78,83,76,32,35,21, +34,-57,-106,-132,-180,-204,-211,-167,-131,-88,-200,-304,-344,-296,-249,-188,-110,-32,31,9,-4,-14,16,37,57, +83,106,137,96,73,29,0,-3,-11,13,33,65,51,27,29,-20,-47,-93,-150,-214,-266,-294,-84,-111,-112, +-118,-130,-140,-153,-150,-133,-110,-93,-82,-71,-62,-67,-70,-69,-66,-59,-54,-58,-25,-11,-2,11,37,18,6, +-7,-14,-18,-16,-33,-39,-46,-64,-70,-61,-61,-61,-59,-57,-55,-59,-53,-51,-47,-43,-39,-32,-34,-35,-37, +-37,-39,-35,-51,-59,-78,-28,-42,-55,-58,-56,-59,-59,-65,-70,-63,-53,-89,-77,-31,37,40,39,36,30, +18,24,26,35,31,32,44,25,23,25,32,34,38,34,34,31,38,39,47,32,42,50,63,64,54, +55,51,44,44,38,44,41,29,32,27,18,-11,-7,4,36,35,40,68,10,-6,3,18,33,43,36, +33,29,42,39,41,34,42,54,86,92,63,62,51,33,45,48,41,34,47,64,55,14,-47,-28,-11, +46,30,31,95,-16,-27,-11,23,39,54,38,29,25,41,43,44,30,54,70,142,151,95,100,79,47, +61,47,36,38,-3,27,22,-15,-119,-130,-85,44,49,75,173,-16,-94,-83,-33,24,50,26,9,-1,36, +58,111,68,49,32,146,181,86,92,69,20,50,57,62,36,109,189,121,78,131,248,246,97,-14,-127, +-178,-139,18,287,179,139,133,113,105,73,54,56,71,66,94,172,44,24,132,257,240,63,55,-36,-188, +-18,-52,-485,-23,71,-92,-91,-94,-133,116,191,37,45,69,142,155,165,167,100,73,62,50,48,54,148, +141,79,118,149,161,38,31,83,98,110,46,144,-55,-46,155,186,173,26,-39,-53,34,105,117,112,63, +0,-66,-47,94,4,-35,-49,-48,-48,-52,-45,8,85,56,40,49,52,57,6,108,137,45,-27,101,139, +112,109,104,103,101,75,7,-32,-79,-75,-48,-17,-19,13,86,77,79,56,11,-3,16,39,38,33,52, +46,24,24,11,-56,-33,-19,-45,46,-220,-131,-118,-68,17,-3,-36,-71,-182,-172,-71,-66,-22,3,49,56, +39,-2,-9,32,15,11,6,28,12,-14,-24,-34,-23,-38,-93,-172,-272,-344,-359,-283,-194,-189,-172,-204,-249, +-282,-261,-188,-150,-110,-76,-55,-33,-17,31,58,72,38,36,70,71,65,37,41,16,-6,-105,-152,-157,-189, +-209,-221,-199,-152,-80,-148,-293,-308,-272,-247,-210,-147,-92,-41,-37,-27,-19,25,60,90,96,105,120,101,90, +71,44,28,9,17,28,48,31,-11,-20,-54,-61,-87,-143,-208,-261,-279,-108,-134,-123,-115,-108,-104,-97,-82, +-66,-47,-33,-22,-12,4,-6,-13,-19,-21,-20,-23,-37,-11,-2,6,12,25,3,-9,-20,-33,-42,-44,-58, +-63,-73,-89,-41,-48,-40,-36,-31,-26,-22,-20,-15,-11,-5,0,5,12,9,8,6,5,1,3,-7,-11, +-21,3,-2,0,-4,-5,-11,-14,-22,-30,-31,-32,-46,-43,8,24,33,34,24,16,5,10,13,23,18, +19,30,8,3,3,13,19,26,25,25,22,27,26,30,19,31,43,53,54,45,44,41,34,35,30, +34,33,23,34,17,2,-24,-23,-11,21,22,24,48,-16,-38,-34,-15,7,30,31,31,22,30,23,14, +18,32,54,77,82,57,54,44,27,45,48,34,29,60,86,44,-6,-57,-49,-32,31,15,12,66,-57, +-81,-74,-27,5,44,40,38,24,34,27,6,14,48,82,139,148,99,98,80,46,69,55,36,49,-2, +58,22,-29,-119,-153,-107,24,32,47,136,-62,-165,-170,-115,-29,40,39,30,4,24,30,52,50,54,66, +166,193,98,94,77,30,77,87,58,35,196,224,77,21,67,252,251,38,12,-110,-213,-212,-55,269,183, +147,134,110,106,98,92,86,80,57,70,150,40,45,186,249,198,63,28,-57,-141,76,-282,-407,27,121, +-81,-38,-42,-91,75,141,94,41,44,116,154,177,176,86,49,57,28,29,47,112,122,73,141,171,147, +39,48,122,86,102,151,-83,67,78,223,214,161,12,-94,-94,-88,-10,110,70,60,8,-24,-23,70,-19, +-51,-39,-47,-35,-25,-46,15,91,56,42,46,60,51,-7,107,135,75,71,34,84,87,102,104,140,170, +194,64,4,16,-67,-67,-46,-15,20,89,90,89,61,4,-14,15,11,14,26,63,65,28,44,27,-55, +-49,-39,-73,-14,-206,-105,-99,-49,44,7,-60,-144,-184,-157,-66,-59,-19,14,32,25,4,-13,-10,29,4, +1,4,18,-1,-49,-27,-28,-29,-47,-104,-172,-253,-300,-268,-250,-150,-149,-144,-181,-237,-210,-173,-147,-101,-82, +-71,-56,-35,-4,33,49,20,14,21,56,59,57,42,41,6,-48,-135,-171,-164,-188,-211,-234,-234,-194,-124, +-135,-233,-238,-221,-218,-211,-175,-148,-117,-96,-68,-40,15,61,106,84,74,68,70,67,68,58,48,41,22, +18,15,-4,-60,-79,-90,-71,-71,-112,-159,-197,-214,-141,-165,-144,-122,-99,-80,-57,-31,-15,1,14,25,35, +57,49,47,41,38,38,34,2,8,5,3,-4,-9,-29,-38,-47,-62,-78,-82,-97,-101,-113,-129,-44,-61, +-47,-40,-33,-26,-19,-14,-9,-2,5,13,19,26,23,23,22,20,17,20,11,9,5,5,4,15,12, +9,2,-2,-9,-18,-30,-39,-31,-40,3,11,26,29,13,4,-6,-4,0,12,6,5,14,-8,-13,-17, +-5,3,14,15,16,12,15,14,14,7,19,36,42,43,35,35,32,24,26,21,25,25,23,37,8, +-11,-32,-37,-27,9,5,6,23,-34,-60,-64,-45,-18,15,26,28,15,19,6,-8,3,21,50,66,70, +51,47,37,18,42,47,26,25,75,108,34,-23,-63,-69,-54,23,-5,-10,28,-83,-116,-124,-76,-31,29, +42,47,25,25,10,-24,-3,38,85,131,139,99,96,81,37,75,63,36,61,22,101,22,-41,-109,-165, +-126,14,6,14,82,-85,-198,-228,-183,-85,21,51,54,14,18,2,-5,27,55,94,183,205,111,99,85, +34,102,116,55,43,277,249,54,-14,-2,219,223,-22,24,-103,-262,-263,-119,190,162,146,127,101,94,103, +118,111,95,56,52,126,31,65,241,230,152,65,-10,-80,-76,163,-477,-332,30,131,-49,24,-5,-118,-9, +66,138,42,25,74,139,174,162,65,25,52,18,19,41,72,93,63,155,182,129,44,60,132,81,117, +250,-276,204,226,286,234,156,31,-91,-97,-161,-95,97,34,58,34,7,-11,41,-28,-53,-27,-35,-21,-2, +-37,22,91,56,44,39,69,55,-9,103,132,114,176,-41,-2,44,86,101,179,229,285,102,23,95,-64, +-90,-48,3,35,88,97,92,66,5,-13,14,-6,-3,11,64,79,37,55,33,-45,-47,-36,-82,-62,-165, +-86,-64,-23,33,-8,-91,-206,-170,-125,-46,-29,-7,18,11,1,-16,-17,-7,20,3,-1,1,11,-5,-71, +-37,-39,-47,-57,-103,-152,-206,-234,-197,-197,-119,-114,-115,-138,-162,-138,-105,-95,-53,-55,-71,-48,-22,20,33, +27,-8,3,13,42,47,48,49,30,-13,-82,-144,-169,-164,-187,-219,-253,-258,-229,-181,-134,-173,-174,-167,-175, +-182,-170,-164,-152,-126,-91,-57,-7,38,90,60,43,25,38,43,53,56,60,68,22,-1,-36,-53,-112,-137, +-127,-92,-72,-95,-115,-134,-152,-170,-180,-152,-125,-96,-68,-38,-8,6,17,28,39,49,70,67,71,69,68, +67,67,41,22,6,-8,-22,-41,-58,-66,-74,-92,-114,-123,-137,-141,-151,-161,-60,-73,-59,-51,-43,-36,-30, +-22,-18,-11,-4,3,9,15,13,13,13,12,11,13,8,6,5,-9,-9,-1,-4,-8,-14,-19,-25,-33, +-46,-55,-45,-56,-15,-1,18,21,2,-8,-15,-16,-12,3,-5,-7,-1,-18,-23,-30,-19,-11,2,6,8, +2,4,2,0,-4,7,26,29,30,24,25,23,11,16,11,14,17,24,35,-3,-23,-39,-49,-40,1, +-9,-8,3,-39,-64,-79,-64,-38,-1,19,24,8,7,-10,-23,-12,8,44,52,56,43,40,31,7,38, +41,13,20,83,118,20,-37,-64,-85,-70,20,-19,-24,-5,-87,-121,-148,-107,-60,8,41,51,23,12,-9, +-42,-20,22,81,114,123,92,93,80,24,74,63,28,62,48,118,11,-51,-98,-170,-136,17,-15,-8,40, +-76,-184,-241,-215,-125,-8,57,70,19,6,-27,-47,0,48,110,192,212,117,103,92,37,120,134,43,45, +328,249,46,-40,-83,164,177,-74,28,-92,-292,-279,-158,86,127,135,107,94,88,97,128,121,100,57,37, +100,18,78,289,200,104,55,-57,-105,-21,231,-580,-268,-23,98,7,75,25,-145,-100,-15,171,45,13,55, +116,154,134,46,7,42,18,19,40,43,68,58,160,180,105,50,65,112,88,141,299,-387,321,344,314, +242,165,94,-24,-99,-187,-144,67,5,57,82,51,7,-4,-32,-49,-27,-23,-9,11,-23,30,84,51,42, +35,77,69,14,107,126,145,261,-113,-84,-6,67,100,206,267,308,147,66,139,-36,-84,-44,25,54,76, +80,69,56,10,-9,2,-17,-13,-4,54,78,42,53,30,-25,-34,-17,-65,-93,-117,-53,-35,-17,5,-25, +-102,-214,-132,-83,-31,-1,17,25,7,0,-13,0,11,16,4,2,5,3,-13,-77,-53,-60,-66,-62,-88, +-115,-143,-167,-160,-143,-91,-86,-79,-82,-68,-71,-47,-30,-32,-46,-53,-26,1,39,21,3,-22,-3,10,30, +34,38,55,9,-40,-106,-141,-160,-165,-190,-227,-267,-272,-249,-218,-123,-124,-117,-114,-129,-139,-145,-156,-160,-127, +-87,-51,-23,5,43,28,21,10,25,34,49,53,60,74,7,-34,-98,-107,-155,-177,-157,-122,-97,-97,-92, +-90,-106,-174,-159,-134,-111,-86,-60,-30,-7,0,1,6,13,20,33,34,38,40,42,40,44,41,7,-10, +-28,-40,-61,-73,-83,-91,-110,-131,-147,-154,-158,-164,-162,-66,-71,-63,-55,-49,-44,-39,-30,-30,-25,-20,-16, +-13,-9,-9,-9,-8,-7,-6,-6,-5,-7,-7,-25,-24,-21,-25,-29,-36,-41,-45,-52,-58,-62,-61,-65,-30, +-11,8,12,-7,-17,-22,-25,-22,-5,-14,-16,-12,-23,-28,-37,-29,-22,-10,-3,0,-6,-7,-9,-12,-15, +-6,14,15,17,12,14,12,-1,6,1,0,6,18,24,-14,-33,-43,-58,-49,-6,-19,-17,-9,-33,-56, +-81,-72,-52,-20,8,16,0,-6,-24,-34,-25,-6,37,37,41,34,32,24,-4,32,33,-5,9,76,105, +4,-49,-61,-97,-84,13,-31,-31,-22,-71,-104,-148,-120,-79,-18,32,46,17,-2,-27,-50,-37,4,73,90, +99,82,90,78,11,69,57,9,54,48,100,-7,-58,-84,-165,-139,18,-28,-17,24,-38,-135,-221,-218,-151, +-45,47,70,17,-11,-52,-70,-27,33,116,189,207,117,106,97,37,134,141,16,31,351,241,41,-69,-160, +90,115,-113,21,-76,-285,-272,-181,-7,89,118,82,85,84,91,122,114,89,54,26,72,4,84,314,164, +60,32,-113,-137,17,273,-599,-251,-111,44,69,105,45,-127,-148,-70,187,47,7,39,97,125,87,24,-7, +27,26,32,45,26,52,62,162,169,81,54,63,88,109,163,276,-423,396,410,324,240,155,186,74,-137, +-186,-163,5,-2,71,115,101,48,-28,-32,-43,-39,-25,-5,14,-6,38,73,42,36,34,81,86,60,106, +101,148,313,-175,-136,-61,29,92,193,255,259,196,132,146,14,-45,-31,43,72,67,58,39,39,12,-6, +-19,-29,-21,-14,34,60,38,38,17,-6,-25,-5,-39,-120,-60,8,-15,-28,-9,-38,-83,-156,-77,-49,-37, +6,26,29,13,10,7,27,31,15,4,3,18,-9,-28,-70,-70,-77,-74,-54,-63,-73,-82,-103,-114,-81, +-88,-73,-50,-35,-11,-22,-8,9,-26,-36,-20,2,24,50,8,-9,-21,1,16,26,33,33,46,-17,-64, +-118,-133,-148,-165,-190,-227,-264,-279,-264,-235,-129,-80,-66,-69,-86,-97,-108,-126,-137,-106,-71,-41,-33,-23,-4, +-2,4,6,18,27,44,43,45,57,-16,-70,-147,-152,-180,-196,-175,-149,-130,-106,-80,-59,-70,-146,-116,-102, +-89,-74,-57,-38,-26,-21,-24,-23,-19,-14,-8,-8,-7,-7,-5,-7,-4,4,-27,-39,-52,-56,-72,-77,-85, +-93,-107,-120,-139,-138,-143,-146,-134,-65,-66,-64,-59,-56,-54,-52,-46,-46,-43,-40,-37,-35,-32,-32,-32,-31, +-31,-29,-32,-26,-26,-22,-44,-41,-37,-42,-46,-50,-54,-58,-61,-62,-64,-64,-65,-51,-18,0,2,-15,-24, +-26,-31,-28,-11,-20,-21,-19,-24,-28,-39,-34,-29,-20,-11,-8,-12,-15,-17,-19,-22,-14,6,3,5,3, +6,4,-11,-2,-6,-11,-1,10,13,-22,-39,-45,-60,-53,-12,-27,-22,-14,-20,-40,-75,-73,-61,-35,-5, +5,-7,-16,-33,-40,-34,-16,31,21,26,29,26,19,-11,26,22,-23,-1,64,83,-13,-59,-57,-99,-86, +8,-38,-32,-25,-45,-74,-132,-120,-92,-41,14,33,11,-13,-38,-53,-48,-12,68,63,73,73,86,74,-2, +59,47,-13,44,38,76,-28,-66,-72,-148,-130,9,-39,-19,24,14,-71,-187,-204,-165,-77,22,54,13,-26, +-65,-78,-48,14,116,172,189,114,111,103,36,142,134,-22,10,357,217,28,-99,-210,19,63,-113,26,-52, +-254,-255,-190,-74,52,96,59,71,76,88,108,94,67,51,20,46,-5,82,306,128,23,-3,-168,-160,55, +302,-571,-270,-184,3,134,114,42,-99,-164,-95,194,43,-3,27,79,99,44,9,-12,11,34,48,50,17, +44,72,156,152,61,51,57,84,142,175,186,-423,425,421,310,212,96,261,180,-161,-150,-151,-65,7,95, +138,128,74,-29,-24,-31,-45,-34,-8,11,14,46,54,32,29,32,86,103,109,86,52,123,328,-215,-161, +-111,-14,77,138,185,162,221,187,145,62,2,7,49,74,58,42,16,18,12,-5,-38,-42,-29,-19,7, +31,25,14,-2,2,-23,-4,-17,-144,6,76,15,-22,-11,-37,-41,-55,-28,-33,-49,2,22,19,17,20, +26,44,40,13,3,2,26,-20,-44,-59,-79,-81,-62,-38,-35,-33,-27,-37,-43,-12,-107,-69,-38,-15,-1, +3,8,12,-19,-17,3,20,35,52,2,-10,-3,12,25,28,41,31,19,-42,-79,-116,-119,-134,-160,-186, +-218,-243,-277,-274,-246,-155,-46,-32,-36,-46,-51,-63,-78,-91,-70,-50,-30,-32,-32,-27,-16,-4,4,13,21, +33,26,24,31,-36,-95,-167,-174,-187,-201,-182,-169,-156,-114,-73,-38,-45,-106,-82,-78,-73,-68,-60,-50,-46, +-40,-40,-38,-34,-29,-26,-27,-30,-32,-33,-36,-36,-33,-52,-60,-66,-64,-72,-70,-75,-79,-86,-92,-108,-104, +-112,-113,-101,-67,-67,-67,-65,-64,-63,-63,-62,-61,-59,-56,-53,-51,-47,-49,-49,-49,-49,-49,-51,-48,-48, +-44,-61,-59,-57,-60,-63,-64,-66,-68,-67,-66,-66,-65,-66,-74,-20,-5,-5,-19,-26,-27,-32,-29,-13,-22, +-22,-20,-20,-24,-36,-34,-31,-24,-16,-13,-14,-19,-22,-26,-25,-19,0,-7,-5,-3,0,-3,-18,-7,-11, +-21,-7,3,1,-27,-41,-44,-57,-52,-16,-30,-22,-13,-4,-21,-63,-68,-63,-42,-16,-5,-10,-23,-37,-44, +-39,-22,27,9,13,27,22,17,-12,20,13,-37,-8,52,56,-24,-62,-56,-94,-81,3,-37,-27,-19,-12, +-38,-109,-110,-96,-52,-5,16,7,-21,-44,-56,-53,-23,66,37,50,70,82,70,-8,48,35,-35,36,29, +45,-41,-68,-66,-125,-117,-6,-46,-15,32,68,-6,-146,-181,-167,-95,-7,31,14,-34,-67,-78,-62,-5,115, +145,161,113,119,111,40,142,114,-62,-10,345,175,15,-116,-222,-42,24,-73,38,-25,-208,-232,-189,-110,25, +77,44,53,60,82,88,69,41,51,20,22,-4,79,268,96,-2,-46,-206,-163,88,315,-524,-285,-219,-15, +204,116,28,-64,-167,-104,195,42,-7,27,53,63,9,2,-8,3,35,55,48,12,40,81,141,127,42, +37,47,97,181,176,55,-411,402,404,268,141,7,255,235,-112,-74,-108,-107,20,117,158,139,85,-25,-20, +-21,-38,-37,-11,7,33,53,33,21,22,26,90,116,142,44,-13,83,306,-223,-179,-143,-46,48,69,89, +60,216,221,146,103,47,47,48,64,42,24,-5,-11,3,-10,-53,-56,-39,-20,-18,0,8,-7,-16,6, +-16,-3,-9,-153,60,124,70,25,16,-3,22,54,16,-19,-56,-12,10,7,16,28,40,51,43,12,6, +3,23,-25,-52,-53,-81,-72,-35,-20,-12,2,16,19,23,43,-131,-76,-50,-24,-20,3,6,6,-9,2, +15,34,40,44,6,-5,21,23,31,32,47,27,-14,-62,-86,-103,-102,-120,-150,-176,-201,-213,-266,-275,-253, +-184,-27,-9,-10,-11,-8,-17,-28,-39,-27,-19,-9,-15,-22,-25,-9,6,15,19,26,33,14,6,4,-48, +-103,-163,-176,-179,-195,-178,-175,-168,-120,-75,-37,-35,-80,-65,-64,-63,-62,-59,-53,-52,-45,-43,-40,-36,-29, +-26,-29,-33,-36,-37,-40,-40,-48,-55,-63,-67,-63,-63,-58,-58,-60,-62,-62,-72,-72,-82,-84,-76,-64,-58, +-61,-60,-60,-60,-61,-61,-60,-59,-56,-54,-52,-49,-51,-51,-51,-52,-52,-52,-57,-60,-63,-64,-69,-74,-74, +-75,-73,-73,-73,-70,-65,-61,-68,-65,-76,-20,-8,-9,-20,-25,-26,-30,-28,-15,-21,-20,-18,-15,-18,-32, +-32,-31,-26,-19,-16,-14,-21,-24,-29,-26,-21,-3,-13,-11,-4,-4,-6,-20,-11,-12,-26,-10,-2,-8,-28, +-39,-39,-51,-48,-21,-31,-20,-7,12,-3,-50,-61,-62,-45,-26,-14,-11,-25,-37,-47,-40,-25,24,0,5, +28,21,17,-8,16,5,-44,-11,41,30,-28,-59,-51,-83,-73,-8,-35,-17,-6,19,-6,-86,-97,-96,-59, +-24,-2,3,-25,-46,-60,-53,-29,65,18,34,73,80,66,-6,37,25,-47,31,19,14,-42,-61,-54,-99, +-106,-29,-52,-8,45,113,50,-109,-156,-164,-106,-37,5,15,-33,-63,-77,-69,-20,114,116,131,118,129,120, +49,137,90,-89,-19,311,126,1,-120,-212,-88,-2,-16,50,3,-142,-209,-187,-122,1,55,34,34,36,64, +61,44,17,54,25,-3,5,78,208,70,-16,-85,-224,-150,115,308,-470,-271,-225,-17,278,120,20,-12,-151, +-100,174,47,-1,17,22,20,-22,-5,-2,6,29,51,43,12,42,89,121,97,21,14,35,119,222,168, +-83,-393,341,390,206,38,-95,143,195,-11,4,-57,-113,31,122,156,140,91,-12,-21,-22,-27,-31,-11,3, +47,57,15,9,14,18,93,120,147,-11,-80,37,248,-206,-196,-156,-65,12,4,5,-3,193,234,138,138, +94,75,40,46,26,4,-23,-40,-16,-22,-61,-68,-49,-18,-37,-25,-5,-19,-18,12,0,5,-14,-140,98, +153,135,102,78,54,86,145,59,1,-56,-35,-16,-3,13,28,41,50,44,13,13,5,10,-27,-55,-54, +-73,-53,-4,-4,4,22,40,53,60,75,-156,-96,-82,-55,-46,-13,-4,4,3,21,35,51,44,33,10, +6,41,34,36,36,45,17,-41,-77,-89,-85,-87,-107,-135,-161,-180,-181,-244,-262,-250,-205,-21,3,4,10, +18,14,13,9,13,13,17,8,0,-7,11,24,35,35,41,44,11,-8,-24,-55,-100,-140,-161,-161,-182, +-168,-172,-171,-127,-88,-57,-41,-63,-49,-50,-51,-52,-51,-50,-50,-45,-40,-36,-32,-26,-23,-25,-29,-31,-31, +-33,-31,-46,-46,-54,-59,-57,-55,-48,-46,-47,-45,-44,-49,-51,-59,-60,-55,-49,-37,-41,-42,-43,-44,-46, +-47,-46,-45,-43,-42,-41,-38,-39,-39,-40,-40,-40,-38,-49,-55,-64,-52,-62,-74,-72,-72,-68,-68,-66,-63, +-56,-47,-62,-54,-55,-19,-8,-11,-19,-23,-23,-27,-25,-16,-19,-17,-13,-9,-12,-26,-28,-29,-25,-20,-17, +-14,-21,-24,-29,-24,-19,-3,-15,-13,-1,-4,-6,-17,-11,-11,-26,-9,-4,-12,-25,-34,-32,-43,-44,-26, +-30,-15,2,22,10,-37,-53,-59,-47,-32,-21,-13,-26,-37,-49,-38,-23,22,-4,2,32,20,17,0,14, +2,-42,-10,33,13,-26,-51,-42,-72,-65,-23,-30,-5,10,41,18,-66,-84,-92,-65,-38,-18,-2,-29,-48, +-64,-50,-30,63,7,25,81,77,63,2,30,20,-48,30,17,-2,-35,-49,-38,-75,-96,-56,-54,2,61, +141,90,-74,-130,-155,-116,-64,-23,9,-31,-60,-76,-71,-29,113,91,104,131,140,125,61,127,69,-97,-18, +260,77,-12,-115,-187,-118,-18,41,64,31,-67,-188,-186,-119,-20,31,27,19,15,37,30,18,-5,57,32, +-25,21,81,139,51,-22,-110,-219,-121,139,286,-402,-223,-209,-10,340,134,25,46,-127,-95,132,49,10,1, +-5,-12,-36,-11,-2,9,17,37,37,16,47,92,101,67,-3,-8,30,146,252,144,-203,-364,256,385,143, +-65,-195,-38,91,131,64,-20,-89,35,110,135,127,88,9,-19,-24,-12,-16,-4,2,56,55,5,-3,4, +11,92,115,124,-60,-129,-6,160,-170,-204,-155,-74,-19,-44,-50,-11,158,221,134,166,138,97,34,20,8, +-17,-39,-60,-38,-38,-65,-73,-56,-19,-47,-40,-14,-24,-11,16,20,15,-19,-108,120,166,190,181,156,117, +135,194,101,36,-39,-46,-41,-18,10,25,34,44,41,16,18,4,-10,-32,-55,-55,-57,-27,21,8,12, +27,44,64,77,90,-177,-110,-111,-87,-68,-29,-10,9,19,40,54,62,50,30,19,23,51,43,41,39, +33,1,-59,-83,-87,-71,-76,-96,-116,-142,-155,-148,-208,-233,-239,-218,-26,1,4,15,25,28,35,42,42, +40,42,31,25,18,30,38,48,46,48,53,13,-17,-46,-58,-87,-106,-133,-137,-164,-155,-165,-170,-135,-104, +-81,-53,-46,-34,-37,-39,-40,-42,-44,-47,-42,-37,-32,-27,-21,-18,-19,-21,-21,-20,-21,-17,-35,-32,-40, +-46,-48,-46,-41,-38,-40,-38,-37,-39,-40,-44,-43,-40,-26,-13,-18,-20,-23,-25,-26,-29,-27,-26,-25,-24, +-23,-21,-22,-21,-21,-21,-21,-18,-30,-36,-47,-32,-42,-56,-55,-54,-50,-50,-48,-46,-38,-28,-43,-32,-26, +-15,-7,-10,-16,-19,-19,-23,-22,-17,-15,-12,-8,-5,-7,-19,-23,-25,-23,-19,-17,-13,-20,-23,-29,-21, +-17,-3,-15,-13,1,-4,-7,-14,-10,-9,-23,-8,-2,-10,-18,-26,-25,-36,-39,-30,-26,-9,9,29,19, +-22,-43,-54,-46,-36,-27,-16,-28,-37,-50,-34,-20,18,-5,1,35,20,17,8,14,2,-33,-5,27,4, +-19,-39,-34,-63,-59,-35,-22,7,22,54,34,-42,-68,-84,-68,-49,-32,-10,-35,-52,-70,-44,-27,59,3, +22,90,71,58,12,27,20,-41,30,23,-2,-18,-31,-23,-58,-90,-77,-49,13,70,149,115,-32,-102,-141, +-121,-87,-50,-7,-37,-61,-80,-66,-31,109,71,84,146,149,127,73,117,54,-89,-7,194,25,-25,-107,-162, +-142,-34,83,77,59,4,-167,-186,-117,-33,17,26,16,5,15,3,-3,-18,57,38,-40,44,90,77,36, +-27,-120,-197,-86,154,247,-322,-152,-180,3,381,159,44,87,-109,-93,86,63,33,-14,-28,-38,-39,-18,-11, +0,-1,17,33,19,52,88,79,37,-28,-22,33,168,251,102,-271,-321,163,384,90,-147,-283,-216,-25,275, +101,0,-44,35,89,112,107,79,33,-12,-20,6,4,8,6,58,47,1,-14,-5,8,87,96,80,-87, +-144,-35,62,-125,-205,-148,-78,-43,-62,-66,19,119,190,141,183,165,111,36,-4,-15,-40,-55,-68,-57,-53, +-66,-72,-56,-20,-48,-45,-19,-25,-2,14,33,22,-20,-66,121,147,217,235,213,165,162,202,129,71,-5, +-34,-47,-34,2,21,32,38,35,20,18,-2,-28,-39,-55,-55,-34,3,36,15,13,21,42,67,85,90, +-186,-115,-119,-97,-76,-33,-7,16,30,48,62,61,53,34,33,40,54,48,42,39,16,-19,-72,-79,-78, +-64,-69,-86,-95,-117,-125,-112,-158,-190,-220,-219,-37,-9,-5,8,16,25,39,55,56,55,56,47,44,40, +45,47,50,46,42,46,10,-24,-57,-57,-71,-73,-104,-113,-143,-143,-157,-169,-144,-120,-104,-67,-32,-21,-25, +-27,-28,-31,-36,-41,-38,-33,-26,-19,-13,-10,-9,-8,-6,-4,-2,2,-18,-16,-23,-30,-37,-37,-34,-32, +-35,-33,-34,-36,-34,-34,-31,-29,-7,3,-2,-5,-9,-11,-13,-16,-12,-11,-11,-10,-10,-8,-7,-7,-6, +-5,-5,-1,-11,-15,-25,-13,-21,-33,-33,-33,-30,-31,-29,-29,-21,-14,-22,-13,-5,-12,-6,-9,-12,-15, +-16,-20,-19,-16,-12,-8,-4,-1,-4,-13,-19,-22,-21,-18,-16,-12,-19,-21,-28,-17,-13,-3,-13,-10,4, +-3,-6,-9,-7,-6,-18,-6,2,-5,-10,-17,-18,-32,-37,-32,-21,-4,13,30,24,-7,-33,-47,-44,-39, +-32,-21,-31,-38,-51,-28,-15,13,-4,2,35,18,16,14,15,5,-21,2,23,0,-10,-27,-28,-59,-57, +-43,-15,17,27,57,42,-16,-52,-74,-66,-57,-44,-20,-42,-55,-75,-35,-19,50,4,22,94,63,52,22, +27,23,-28,30,37,10,6,-8,-8,-50,-89,-88,-39,20,68,143,131,15,-73,-125,-121,-106,-78,-30,-49, +-67,-88,-57,-26,102,57,70,159,154,128,86,109,49,-67,11,116,-27,-44,-107,-155,-161,-50,102,83,79, +64,-141,-181,-119,-37,12,26,21,5,0,-16,-15,-19,53,41,-47,70,103,31,21,-38,-122,-165,-50,156, +186,-234,-78,-141,22,392,187,73,112,-89,-89,43,91,70,-32,-46,-61,-43,-30,-27,-22,-26,-7,30,20, +52,78,57,9,-51,-27,42,172,219,52,-289,-268,76,358,23,-209,-335,-344,-120,354,115,17,10,28,59, +88,92,74,54,1,-8,24,20,19,13,53,35,2,-22,-13,10,74,66,26,-90,-131,-41,-29,-84,-191, +-128,-68,-55,-47,-45,56,82,155,158,188,173,118,40,-22,-40,-62,-70,-71,-72,-66,-65,-65,-51,-22,-41, +-43,-24,-27,4,11,32,21,-9,-25,98,90,198,243,228,191,173,190,140,98,42,-7,-35,-38,-3,21, +34,34,31,25,15,-9,-43,-50,-56,-53,-9,29,43,18,12,15,45,72,81,75,-167,-113,-99,-76,-59, +-22,2,23,36,48,60,50,48,36,43,46,49,46,36,29,-4,-39,-80,-69,-65,-63,-67,-78,-72,-86, +-87,-75,-104,-139,-188,-190,-53,-22,-18,-8,-2,9,27,48,55,58,61,56,54,53,52,49,47,39,30, +29,3,-26,-57,-53,-58,-54,-80,-93,-122,-129,-148,-164,-149,-135,-126,-84,-20,-13,-16,-16,-15,-17,-23,-29, +-28,-24,-18,-11,-5,0,3,6,9,12,16,20,3,0,-8,-15,-25,-30,-30,-29,-32,-31,-33,-35,-31, +-26,-23,-21,0,5,1,-1,-5,-7,-8,-9,-6,-5,-5,-5,-4,-3,-2,-1,0,1,2,5,0,-2, +-7,-5,-8,-15,-16,-17,-16,-17,-17,-19,-14,-10,-8,-3,-1,-9,-4,-7,-8,-11,-13,-17,-17,-15,-8, +-4,-1,1,-1,-6,-14,-17,-18,-16,-15,-11,-16,-18,-26,-12,-9,-3,-10,-8,5,-2,-5,-5,-5,-3, +-12,-3,9,1,1,-6,-12,-28,-35,-30,-15,2,14,31,29,8,-22,-39,-41,-40,-35,-25,-32,-36,-49, +-20,-8,8,-1,3,32,15,15,21,16,8,-7,10,23,0,2,-14,-22,-58,-58,-46,-6,26,28,57, +47,12,-35,-61,-62,-61,-53,-30,-46,-55,-75,-22,-10,39,8,23,89,50,43,32,26,27,-10,32,54, +25,35,20,7,-45,-88,-89,-27,27,60,131,142,65,-41,-104,-116,-118,-99,-53,-62,-73,-95,-44,-15,91, +48,62,166,155,126,100,102,48,-36,33,41,-69,-66,-113,-163,-175,-68,104,82,88,111,-110,-171,-128,-38, +12,26,31,14,-6,-23,-17,-6,48,39,-49,95,116,1,5,-54,-121,-128,-14,150,119,-149,-13,-85,50, +370,214,109,118,-69,-79,10,116,106,-40,-54,-70,-42,-36,-40,-46,-48,-28,26,20,50,67,35,-17,-69, +-20,55,157,171,0,-287,-218,-2,257,-80,-261,-329,-416,-195,351,123,46,57,23,31,65,84,78,72,21, +7,36,30,25,18,43,22,3,-28,-18,16,53,27,-27,-76,-99,-32,-93,-49,-145,-81,-33,-33,-5,-5, +75,56,128,175,182,168,117,43,-29,-57,-76,-80,-71,-81,-75,-65,-55,-41,-24,-28,-34,-29,-28,7,8, +23,17,14,5,54,17,134,197,202,191,177,183,154,122,92,29,-8,-23,1,23,36,32,29,30,12, +-19,-56,-61,-57,-47,10,46,43,22,16,17,54,76,65,48,-128,-99,-58,-30,-17,3,16,30,40,44, +52,37,37,36,46,45,40,39,23,10,-27,-57,-78,-59,-54,-63,-66,-69,-48,-51,-47,-36,-51,-83,-139, +-138,-69,-37,-36,-30,-25,-10,10,33,45,53,61,57,54,52,49,46,44,32,17,11,-4,-25,-50,-49, +-51,-49,-66,-78,-101,-115,-135,-155,-150,-146,-146,-102,-12,-6,-7,-4,-1,-2,-7,-11,-12,-10,-5,0,5, +10,12,14,18,20,24,28,16,8,0,-7,-19,-28,-30,-31,-33,-34,-37,-39,-31,-22,-18,-16,-4,-4, +-5,-7,-9,-9,-8,-8,-5,-5,-6,-6,-6,-5,-4,-3,-2,-1,0,3,1,1,0,-7,-7,-9,-10, +-13,-14,-16,-16,-19,-17,-17,-7,-6,-9,-5,-1,-4,-4,-6,-9,-14,-14,-12,-4,0,1,4,3,2, +-8,-12,-14,-13,-13,-10,-14,-15,-23,-6,-5,-4,-7,-5,4,-3,-4,-1,-3,0,-6,-1,15,7,12, +5,-4,-25,-33,-27,-9,6,14,31,33,24,-9,-28,-37,-38,-36,-28,-33,-33,-43,-12,-1,4,2,4, +25,11,12,25,16,11,4,16,24,0,13,-2,-15,-56,-57,-45,2,32,26,55,51,41,-16,-46,-58, +-60,-57,-38,-48,-50,-68,-8,1,28,14,23,73,34,32,38,23,29,6,33,67,37,63,49,25,-41, +-85,-84,-15,31,47,117,150,115,-6,-79,-110,-121,-112,-72,-72,-75,-97,-27,0,79,44,57,164,148,120, +112,91,47,-7,51,-16,-97,-91,-126,-175,-180,-80,100,81,94,144,-81,-162,-137,-42,13,31,44,28,-3, +-19,-8,16,41,35,-48,115,127,-13,-11,-74,-120,-91,16,134,64,-86,37,-13,86,321,230,144,110,-52, +-71,-11,134,139,-29,-53,-75,-39,-38,-46,-65,-59,-40,19,16,43,56,15,-39,-79,-3,71,133,114,-53, +-273,-181,-58,99,-190,-300,-286,-424,-248,244,128,93,88,27,13,41,77,83,84,43,24,36,33,25,22, +29,7,2,-30,-18,24,28,-10,-68,-53,-60,-26,-113,-13,-73,-18,14,12,39,32,75,35,97,171,166, +154,115,43,-27,-64,-81,-83,-70,-84,-79,-66,-44,-28,-25,-15,-24,-33,-27,7,6,13,17,43,27,5, +-50,43,106,136,166,175,181,167,145,135,72,30,1,15,27,32,30,26,27,2,-31,-66,-70,-56,-36, +22,52,39,29,26,24,61,73,45,20,-83,-64,-4,27,39,34,30,33,37,37,38,21,25,33,43, +42,29,28,9,-12,-47,-68,-69,-53,-49,-63,-63,-56,-24,-16,-7,2,-2,-25,-73,-76,-83,-57,-54,-47, +-39,-22,0,21,34,43,50,47,44,41,38,38,40,23,4,-6,-11,-26,-44,-46,-48,-49,-59,-69,-85, +-103,-123,-144,-146,-151,-158,-116,-9,-5,-3,4,8,8,6,4,3,5,9,13,17,20,20,19,20,20, +23,24,19,7,-1,-9,-20,-31,-35,-37,-38,-41,-44,-46,-35,-23,-17,-16,-15,-17,-16,-17,-16,-15,-12, +-9,-8,-9,-10,-10,-10,-10,-9,-9,-9,-7,-7,-5,-5,-6,-5,-16,-15,-15,-16,-19,-21,-23,-24,-28, +-28,-29,-16,-16,-22,-3,1,-3,-1,-3,-6,-12,-13,-10,-1,3,1,5,5,8,-3,-8,-12,-11,-11, +-9,-11,-11,-17,-2,-1,-3,-3,-2,2,-3,-4,3,-1,1,0,2,19,12,21,14,3,-22,-30,-23, +-4,8,10,28,34,38,3,-18,-33,-36,-36,-30,-32,-29,-35,-3,6,1,5,5,15,5,8,26,14, +11,13,19,24,1,21,9,-6,-51,-54,-42,8,35,20,49,51,65,2,-30,-53,-57,-58,-43,-47,-43, +-56,7,12,20,20,21,50,16,17,39,17,27,20,32,73,47,85,73,45,-32,-76,-76,-4,32,29, +99,149,157,29,-53,-103,-120,-119,-86,-78,-73,-90,-7,18,68,45,54,148,133,109,116,78,44,20,62, +-55,-114,-115,-142,-180,-179,-89,98,80,99,166,-55,-151,-141,-52,10,40,61,48,6,-6,10,39,34,29, +-44,125,133,-17,-25,-92,-120,-58,39,112,23,-37,74,58,114,249,232,172,101,-36,-65,-23,143,164,-5, +-46,-75,-44,-39,-46,-76,-57,-43,7,8,32,47,-3,-56,-80,17,84,103,52,-104,-256,-153,-87,-84,-285, +-314,-236,-366,-260,73,134,148,91,29,-1,20,65,83,85,59,34,20,26,21,25,16,-7,-3,-28,-12, +28,5,-39,-95,-28,-20,-27,-93,26,15,53,60,55,65,53,55,10,54,145,144,138,114,43,-21,-66, +-79,-83,-72,-82,-81,-66,-34,-16,-23,-5,-15,-34,-24,6,6,3,18,71,44,-36,-106,-53,1,47,132, +169,168,171,160,166,109,68,29,31,33,25,27,19,15,-13,-46,-71,-76,-54,-21,26,50,34,37,37, +31,62,63,27,-2,-32,-12,54,81,90,64,43,35,30,23,17,4,12,25,38,36,18,16,-5,-32, +-59,-71,-58,-50,-50,-63,-56,-40,-2,15,30,37,45,32,-2,-15,-94,-76,-67,-56,-38,-22,-4,12,21, +27,31,30,27,26,23,26,31,10,-11,-25,-23,-33,-43,-46,-47,-51,-56,-65,-76,-95,-112,-131,-138,-149, +-159,-122,-11,-9,-4,4,8,10,12,16,16,18,21,22,24,26,24,19,17,14,14,12,12,-1,-8, +-16,-26,-38,-42,-45,-46,-50,-54,-55,-44,-30,-23,-21,-29,-32,-29,-28,-25,-21,-16,-11,-13,-13,-15,-15, +-15,-15,-16,-16,-16,-16,-15,-16,-15,-15,-13,-26,-25,-24,-25,-28,-32,-34,-35,-40,-41,-42,-28,-29,-35, +-1,2,-2,2,0,-3,-10,-10,-9,1,5,1,5,6,13,1,-3,-9,-9,-9,-9,-9,-8,-12,2, +2,-3,-1,-1,-2,-5,-5,4,-1,2,4,3,21,14,26,21,10,-16,-25,-20,0,10,6,24,35, +49,14,-7,-27,-33,-35,-31,-31,-25,-25,4,12,0,7,4,3,-2,2,25,10,9,19,20,22,0, +26,18,3,-41,-46,-39,16,37,13,43,49,85,19,-14,-46,-51,-56,-46,-45,-35,-39,21,22,13,24, +16,21,-4,1,35,9,23,32,29,74,49,98,92,61,-16,-59,-68,8,33,10,80,143,189,64,-22, +-90,-114,-122,-97,-83,-68,-74,14,37,59,49,52,117,111,93,112,61,37,42,66,-84,-120,-132,-152,-174, +-169,-90,100,80,103,183,-25,-135,-144,-68,1,47,79,77,31,17,34,61,25,19,-35,124,131,-12,-33, +-102,-120,-31,53,93,-12,9,100,113,125,165,223,194,92,-21,-62,-36,136,176,32,-31,-69,-46,-40,-41, +-77,-46,-38,-7,-2,19,38,-20,-70,-75,31,87,71,-8,-146,-243,-121,-105,-273,-357,-305,-192,-283,-240,-80, +153,204,73,28,-9,5,51,75,77,67,38,-2,12,14,28,5,-18,-12,-21,-2,28,-12,-58,-107,-2, +20,-37,-57,71,114,131,105,81,71,54,22,-22,5,106,119,121,112,47,-7,-62,-73,-79,-75,-79,-80, +-64,-26,-6,-18,0,-10,-33,-17,5,10,-4,17,90,60,-69,-145,-131,-87,-27,102,161,151,168,166,185, +134,99,63,45,36,21,23,8,-5,-31,-61,-74,-78,-50,-4,25,41,29,44,45,39,56,50,16,-17, +23,42,104,124,126,84,52,37,24,11,1,-7,-1,12,29,28,9,5,-17,-45,-62,-68,-48,-50,-53, +-63,-47,-22,18,42,61,67,82,79,56,41,-99,-87,-72,-54,-26,-13,-1,5,7,10,9,11,11,12, +9,11,17,-4,-25,-42,-38,-44,-51,-52,-51,-57,-57,-65,-72,-87,-100,-114,-124,-139,-149,-120,-21,-19,-10, +-2,2,6,13,23,24,25,27,26,26,26,20,13,8,3,1,-4,0,-13,-19,-27,-35,-46,-51,-55, +-56,-61,-65,-68,-56,-42,-35,-32,-41,-45,-40,-37,-32,-26,-20,-14,-17,-18,-19,-20,-20,-19,-21,-22,-24, +-24,-24,-27,-25,-26,-24,-36,-36,-34,-36,-39,-43,-45,-47,-53,-52,-54,-40,-42,-45,1,2,0,4,3, +1,-6,-7,-7,4,7,1,6,8,17,6,1,-6,-6,-7,-7,-7,-5,-8,6,4,-2,1,-1,-7, +-7,-6,4,-2,1,6,4,20,14,30,27,17,-8,-17,-16,6,13,2,22,36,57,26,4,-20,-27, +-33,-31,-30,-21,-14,11,17,-1,9,3,-9,-10,-5,22,4,6,23,19,17,-1,29,26,15,-27,-33, +-36,24,41,7,39,48,98,36,4,-36,-42,-50,-46,-42,-27,-19,31,30,9,26,10,-9,-24,-17,28, +-3,15,41,25,66,45,103,105,79,5,-36,-61,20,36,-5,66,137,210,98,10,-72,-102,-119,-106,-87, +-59,-50,34,52,51,55,49,76,82,71,100,39,25,61,64,-106,-117,-143,-154,-160,-151,-83,100,80,109, +195,4,-118,-146,-90,-14,53,96,109,71,48,58,75,15,8,-22,111,120,-6,-33,-102,-113,-12,57,75, +-42,54,115,145,115,88,210,210,89,-5,-61,-58,112,173,81,-12,-60,-43,-38,-33,-67,-28,-26,-20,-13, +6,31,-34,-77,-65,36,79,40,-54,-173,-229,-81,-126,-442,-397,-276,-161,-215,-215,-194,169,245,47,23,-17, +-8,34,63,63,64,36,-18,0,10,31,-1,-25,-22,-12,10,23,-24,-66,-107,23,52,-59,-27,125,212, +199,133,86,59,40,-6,-45,-34,59,90,105,110,52,7,-50,-63,-72,-76,-76,-77,-59,-21,0,-11,0, +-9,-29,-8,7,15,-5,18,94,79,-92,-162,-182,-145,-71,71,139,131,161,166,185,146,118,93,59,38, +16,14,-6,-29,-50,-73,-78,-78,-47,8,18,27,24,45,47,44,44,34,11,-27,73,85,136,148,143, +95,61,40,24,8,-7,-13,-12,-2,16,17,2,-5,-24,-51,-58,-59,-42,-51,-57,-62,-36,-3,36,63, +83,88,105,108,95,86,-97,-89,-69,-46,-11,-2,2,0,-5,-7,-11,-7,-3,1,-3,-3,2,-18,-36, +-52,-51,-56,-61,-61,-59,-66,-61,-64,-67,-77,-85,-92,-104,-122,-135,-112,-34,-33,-22,-14,-9,-3,8,23, +25,26,26,24,21,20,12,3,-5,-11,-15,-20,-15,-26,-32,-39,-45,-55,-60,-65,-67,-72,-77,-81,-70, +-56,-49,-45,-51,-54,-49,-44,-38,-30,-25,-19,-23,-24,-24,-24,-24,-24,-26,-28,-30,-31,-33,-36,-35,-36, +-34,-44,-45,-44,-46,-49,-53,-56,-57,-63,-61,-62,-51,-52,-51,4,3,2,7,7,6,-1,-3,-4,8, +11,3,9,11,21,11,6,-1,-2,-3,-4,-4,-1,-1,9,7,-1,3,0,-9,-8,-7,5,-2,2, +10,5,17,14,32,32,26,1,-8,-12,13,18,1,22,38,63,37,17,-10,-20,-28,-29,-28,-14,-1, +17,21,1,10,1,-17,-17,-11,19,-2,2,29,17,11,-2,30,32,29,-10,-19,-31,35,48,6,40, +51,106,52,22,-22,-31,-42,-43,-37,-17,3,39,36,5,25,2,-35,-43,-34,21,-14,6,51,18,52, +39,102,112,99,30,-11,-50,36,45,-14,57,131,219,129,45,-46,-84,-109,-110,-88,-47,-16,52,63,44, +59,45,31,47,43,81,15,11,80,55,-120,-108,-149,-151,-137,-129,-74,91,79,118,205,34,-98,-144,-111, +-32,57,107,136,115,83,78,80,3,-3,-4,89,99,-1,-27,-90,-97,2,54,56,-67,101,127,150,86, +20,197,225,95,12,-63,-88,73,157,129,11,-46,-36,-35,-23,-48,-6,-11,-30,-21,-7,24,-43,-77,-52, +32,65,14,-87,-186,-209,-29,-169,-567,-384,-217,-133,-168,-197,-264,166,258,24,15,-26,-21,14,46,50,54, +32,-22,-5,9,33,-5,-28,-32,-4,21,19,-31,-65,-92,42,69,-86,-26,184,297,242,135,71,30,17, +-22,-55,-61,3,63,92,107,58,19,-32,-50,-63,-73,-72,-69,-49,-15,4,-1,-3,-11,-24,1,9,17, +1,21,84,104,-104,-158,-201,-170,-90,37,105,108,147,160,175,148,126,110,68,39,11,2,-24,-52,-66, +-81,-82,-74,-44,13,10,14,19,41,45,46,29,18,8,-34,109,112,148,151,142,99,69,49,30,10, +-6,-13,-17,-12,4,6,-6,-13,-27,-49,-49,-48,-37,-51,-57,-57,-22,16,52,78,95,97,111,119,115, +114,-89,-84,-62,-37,0,5,3,-4,-14,-18,-23,-17,-12,-7,-13,-14,-12,-28,-42,-56,-59,-64,-68,-67, +-65,-72,-64,-61,-61,-62,-65,-65,-80,-100,-115,-99,-49,-49,-37,-30,-25,-18,-4,13,15,16,15,13,9, +8,-1,-10,-18,-24,-30,-35,-31,-39,-44,-50,-54,-61,-67,-72,-76,-82,-88,-92,-83,-71,-64,-60,-58,-61, +-55,-50,-43,-36,-31,-26,-29,-29,-29,-29,-29,-28,-31,-33,-35,-37,-40,-44,-43,-44,-43,-50,-50,-50,-53, +-56,-60,-62,-64,-69,-67,-66,-58,-59,-54,8,5,4,10,11,11,4,2,0,12,15,6,13,15,24, +16,12,5,3,1,-1,0,2,5,13,10,1,4,1,-11,-9,-7,6,-1,4,14,6,13,14,33, +36,35,11,2,-5,21,23,2,23,39,65,47,29,3,-10,-21,-24,-23,-8,12,23,23,2,10,-1, +-23,-24,-18,16,-7,-1,33,14,3,-2,32,39,43,6,-4,-25,44,55,10,44,54,107,66,40,-4, +-18,-32,-39,-31,-8,23,43,38,3,20,-8,-54,-59,-49,15,-23,-2,58,11,33,34,97,116,116,53, +15,-34,51,53,-14,51,122,214,154,80,-14,-60,-94,-106,-85,-33,19,67,70,39,59,36,-13,9,10, +60,-11,-5,95,42,-129,-98,-148,-140,-109,-108,-68,70,81,133,214,74,-63,-131,-125,-50,54,111,151,148, +113,90,72,-12,-15,15,63,73,1,-18,-69,-71,15,50,37,-85,145,136,133,44,-42,180,233,105,28, +-67,-123,25,127,165,35,-27,-22,-30,-14,-21,15,6,-34,-23,-17,16,-48,-70,-39,25,46,-9,-114,-191, +-182,26,-240,-625,-321,-130,-104,-135,-181,-275,137,237,19,10,-33,-30,-6,26,35,43,29,-14,-1,12,31, +-8,-29,-38,4,28,14,-35,-59,-62,50,68,-103,-70,241,353,253,115,43,-1,-7,-33,-60,-78,-48,35, +79,99,63,30,-11,-36,-52,-65,-64,-57,-33,-8,7,7,-6,-13,-17,7,10,19,14,28,70,135,-108, +-139,-190,-164,-93,10,70,82,127,149,161,144,127,118,69,35,5,-12,-41,-71,-78,-85,-86,-68,-39,12, +1,2,12,31,37,45,12,2,3,-40,125,124,142,138,128,100,82,67,44,20,4,-5,-13,-16,-2, +0,-13,-18,-26,-40,-38,-37,-35,-49,-53,-46,-5,33,63,84,95,93,105,116,118,122,-75,-73,-51,-28, +4,6,1,-6,-17,-19,-21,-17,-13,-9,-17,-23,-25,-36,-46,-56,-62,-68,-73,-70,-67,-71,-63,-54,-52, +-44,-42,-34,-50,-71,-88,-78,-65,-65,-54,-48,-43,-34,-20,-4,-2,-2,-4,-6,-8,-8,-16,-23,-30,-36, +-40,-45,-43,-48,-52,-56,-60,-64,-69,-75,-81,-88,-95,-101,-93,-84,-78,-73,-61,-63,-58,-53,-47,-41,-38, +-34,-36,-35,-34,-33,-33,-32,-35,-37,-39,-42,-45,-49,-48,-49,-49,-52,-53,-54,-57,-60,-62,-65,-67,-72, +-68,-67,-63,-63,-53,10,6,7,13,14,16,8,6,3,15,18,9,16,18,26,20,16,10,7,4, +2,3,6,11,15,12,3,5,1,-10,-9,-7,8,1,5,17,7,9,14,33,39,41,19,11,1, +26,27,4,23,39,64,53,39,15,-1,-13,-19,-18,-2,21,26,25,3,8,-4,-26,-30,-23,13,-11, +-3,37,10,-3,-1,33,45,54,20,8,-18,49,59,16,47,56,103,76,55,15,-5,-22,-32,-25,-1, +36,44,38,0,12,-19,-66,-72,-61,10,-30,-9,62,3,15,29,91,116,128,71,37,-16,60,57,-11, +41,107,198,170,109,23,-34,-75,-96,-77,-19,50,78,72,36,52,23,-49,-28,-22,38,-35,-20,104,27, +-133,-87,-138,-123,-82,-93,-68,36,76,145,218,127,-7,-109,-125,-66,39,100,148,161,130,91,54,-29,-28, +32,38,43,-1,-10,-45,-38,31,47,18,-97,185,139,100,-3,-97,154,226,113,40,-70,-159,-25,89,179, +57,-6,-5,-25,-7,7,33,20,-31,-19,-24,5,-50,-58,-28,15,25,-30,-136,-191,-148,80,-327,-633,-233, +-34,-82,-104,-154,-245,85,186,35,4,-44,-41,-28,4,20,31,28,2,10,17,24,-13,-29,-42,9,30, +10,-34,-47,-28,42,47,-100,-150,285,365,228,83,13,-28,-29,-41,-62,-87,-78,11,63,85,64,36,11, +-21,-40,-53,-54,-40,-15,-1,8,12,-8,-16,-11,8,8,21,34,40,61,167,-106,-115,-157,-136,-86,-8, +40,56,105,136,144,136,121,116,65,28,-1,-28,-57,-83,-86,-88,-90,-59,-34,6,-6,-7,1,16,26, +41,-3,-12,-5,-48,123,119,121,115,111,100,96,90,64,37,22,12,0,-13,-3,-3,-20,-21,-23,-29, +-28,-30,-34,-47,-47,-33,12,48,67,81,85,79,90,101,108,113,-53,-53,-34,-17,4,2,-4,-9,-15, +-14,-11,-10,-9,-7,-18,-28,-36,-42,-48,-55,-62,-68,-73,-68,-65,-65,-57,-43,-37,-21,-13,2,-15,-35, +-52,-48,-78,-76,-68,-63,-58,-48,-36,-24,-23,-24,-26,-25,-26,-23,-29,-34,-39,-43,-47,-51,-49,-52,-55, +-58,-61,-63,-69,-75,-82,-89,-97,-104,-98,-92,-88,-82,-62,-62,-58,-53,-49,-46,-44,-41,-41,-39,-37,-36, +-36,-35,-38,-40,-42,-44,-47,-51,-50,-51,-51,-52,-53,-53,-57,-60,-61,-64,-66,-71,-65,-63,-64,-63,-51, +13,8,9,15,17,20,12,10,6,17,20,12,18,20,27,23,20,15,11,7,5,6,9,15,16, +13,5,6,2,-8,-8,-5,10,2,6,20,9,7,15,32,40,46,26,19,7,29,29,8,24,38, +61,58,48,28,8,-6,-13,-11,4,28,29,25,4,5,-7,-26,-33,-27,10,-13,-4,38,8,-7,0, +35,51,64,32,19,-9,49,59,24,49,58,97,84,67,33,6,-13,-26,-18,5,44,42,36,-4,3, +-29,-70,-82,-69,6,-34,-14,62,-2,1,24,83,114,137,86,57,3,63,56,-2,33,93,178,180,135, +60,-7,-55,-82,-64,-6,72,83,71,33,41,8,-74,-61,-52,17,-57,-33,105,13,-126,-73,-118,-99,-63, +-80,-71,-4,64,150,212,181,54,-90,-117,-79,14,76,128,155,127,78,27,-49,-41,46,16,13,-8,-7, +-23,-1,47,47,3,-99,213,128,61,-44,-143,116,200,116,51,-71,-191,-69,49,170,78,20,14,-17,-2, +32,46,33,-23,-10,-25,-7,-48,-44,-20,6,4,-52,-156,-187,-109,124,-411,-604,-149,43,-63,-58,-109,-205, +19,123,69,4,-53,-51,-48,-20,3,20,29,20,22,22,14,-18,-27,-45,10,27,6,-29,-33,3,17, +13,-75,-238,309,327,173,47,1,-45,-46,-39,-55,-82,-89,-7,48,68,61,40,32,-7,-27,-38,-40,-22, +3,7,8,13,-9,-17,-8,5,5,28,55,55,64,198,-99,-86,-109,-96,-68,-17,17,37,85,122,129, +128,112,104,60,22,-8,-43,-71,-90,-92,-89,-91,-50,-27,-3,-12,-15,-11,0,15,37,-12,-20,-16,-55, +106,98,87,86,94,98,108,115,88,60,44,33,20,0,3,-2,-22,-20,-19,-20,-23,-27,-36,-44,-38, +-18,26,56,65,71,67,60,68,78,87,92,-25,-26,-10,-2,6,1,-5,-7,-9,-3,5,0,-3,-5, +-19,-31,-43,-45,-48,-51,-59,-64,-69,-62,-59,-57,-47,-27,-17,6,19,39,23,5,-10,-12,-84,-79,-75, +-72,-66,-57,-48,-42,-42,-43,-44,-42,-39,-34,-38,-41,-45,-48,-51,-54,-53,-54,-56,-58,-61,-62,-66,-72, +-80,-85,-92,-99,-95,-91,-89,-82,-59,-58,-55,-52,-50,-50,-49,-47,-45,-43,-40,-39,-38,-37,-39,-41,-43, +-46,-48,-52,-51,-51,-51,-51,-51,-52,-55,-57,-58,-60,-61,-65,-59,-58,-61,-60,-49,15,10,11,17,19, +24,16,14,9,19,21,15,20,22,27,25,23,20,13,10,7,9,11,17,17,14,6,6,3,-6, +-7,-4,11,4,7,21,10,6,15,31,41,51,33,25,13,30,29,13,24,37,56,62,55,39,16, +0,-7,-4,10,31,30,25,4,2,-10,-24,-35,-29,6,-15,-5,36,7,-7,2,37,55,73,44,30, +1,45,55,34,50,58,87,88,77,50,15,-6,-21,-11,11,45,38,31,-9,-8,-38,-68,-88,-75,1, +-36,-18,57,-4,-8,20,74,111,145,101,74,21,60,53,13,30,82,156,185,156,94,18,-34,-64,-44, +10,86,84,66,28,26,-10,-86,-90,-78,-2,-74,-45,98,2,-109,-55,-85,-67,-52,-70,-73,-43,50,144, +193,217,102,-78,-107,-90,-17,43,90,125,104,49,-3,-68,-52,55,-1,-12,-18,-9,-3,38,65,49,-6, +-90,224,106,24,-75,-177,69,160,111,59,-68,-211,-108,8,144,98,52,32,-5,5,53,54,43,-11,2, +-22,-19,-45,-30,-14,1,-14,-75,-173,-182,-72,152,-470,-555,-95,84,-32,-7,-64,-169,-51,61,114,11,-58, +-59,-66,-44,-17,8,28,34,31,22,0,-24,-27,-44,8,20,4,-22,-21,24,-16,-20,-32,-307,307,247, +103,16,15,-51,-58,-31,-41,-69,-89,-19,35,51,56,44,49,7,-14,-23,-23,-3,21,15,8,9,-8, +-16,-5,1,3,38,71,66,81,224,-88,-55,-56,-54,-49,-21,3,26,66,107,118,119,102,89,54,16, +-17,-55,-79,-90,-94,-88,-88,-41,-20,-11,-15,-20,-23,-13,6,31,-16,-23,-29,-62,78,65,46,54,75, +95,118,137,112,85,70,59,46,20,14,3,-21,-17,-17,-17,-23,-28,-39,-39,-28,-3,36,59,57,56, +47,39,45,53,63,65,7,7,21,20,15,7,2,3,5,13,22,11,1,-6,-19,-33,-46,-45,-46, +-47,-54,-58,-63,-54,-50,-46,-33,-7,7,33,49,72,57,42,29,23,-80,-74,-73,-72,-66,-60,-56,-55, +-55,-57,-56,-52,-47,-40,-43,-44,-47,-49,-52,-55,-55,-55,-57,-58,-60,-61,-63,-67,-73,-77,-80,-86,-82, +-81,-81,-74,-55,-53,-52,-50,-50,-52,-52,-51,-48,-45,-43,-41,-40,-39,-41,-43,-44,-47,-49,-52,-51,-51, +-51,-51,-51,-51,-53,-54,-54,-55,-56,-57,-52,-51,-57,-56,-50,16,11,12,17,20,25,18,15,11,18, +20,17,20,21,24,25,24,22,15,11,8,11,13,19,17,14,6,7,3,-3,-5,-3,11,5,8, +21,11,7,15,29,40,53,37,29,16,28,27,18,24,35,49,62,59,46,22,6,-2,3,15,31, +30,23,1,-1,-12,-21,-35,-31,1,-16,-6,30,6,-4,6,37,57,80,53,37,8,37,46,43,50, +57,73,88,82,60,21,-1,-17,-4,15,40,33,27,-17,-17,-46,-64,-91,-78,-6,-36,-19,48,-4,-12, +18,63,104,149,112,85,33,52,46,30,32,75,131,182,168,120,39,-14,-43,-22,24,89,81,59,20, +7,-29,-88,-113,-100,-22,-86,-52,80,-6,-78,-33,-42,-30,-46,-59,-73,-76,32,127,161,228,129,-75,-100, +-101,-53,3,41,73,62,11,-34,-85,-60,62,-12,-29,-26,-13,15,76,83,56,-8,-68,216,78,-7,-96, +-194,17,112,100,67,-59,-217,-137,-30,105,113,85,50,11,16,71,59,49,2,15,-15,-31,-40,-19,-10, +2,-26,-96,-191,-178,-37,162,-493,-490,-76,84,17,34,-37,-142,-117,1,156,22,-59,-66,-81,-66,-39,-5, +20,34,32,17,-14,-32,-28,-41,5,13,2,-15,-13,30,-47,-47,10,-343,278,143,41,1,46,-38,-53, +-24,-27,-52,-76,-24,23,33,49,50,61,20,-1,-9,-6,14,34,22,7,1,-8,-13,-2,-1,4,51, +77,71,106,236,-72,-25,-9,-19,-36,-24,-7,17,49,91,108,110,94,77,48,11,-25,-62,-82,-86,-93, +-84,-81,-32,-13,-15,-17,-24,-30,-22,-2,24,-14,-22,-40,-65,43,26,2,20,54,91,124,149,130,109, +98,86,72,43,30,12,-15,-12,-15,-18,-27,-32,-40,-33,-17,9,41,55,44,39,28,21,26,31,40, +37,40,42,53,45,32,21,16,18,22,30,38,20,4,-9,-21,-33,-46,-43,-42,-42,-47,-51,-56,-43, +-37,-30,-16,13,32,56,72,94,81,71,61,54,-69,-62,-64,-64,-59,-55,-55,-59,-59,-61,-59,-55,-48, +-41,-43,-43,-45,-47,-50,-53,-55,-54,-56,-57,-60,-63,-60,-61,-65,-64,-63,-65,-62,-64,-65,-58,-49,-45, +-46,-45,-47,-50,-50,-50,-47,-45,-43,-42,-41,-40,-42,-43,-44,-46,-48,-50,-51,-51,-51,-51,-52,-53,-52, +-52,-51,-50,-50,-48,-45,-43,-51,-50,-49,15,12,13,17,20,26,19,16,11,16,18,18,19,20,21, +24,24,22,15,11,8,11,13,18,15,13,6,6,3,-1,-4,-2,10,6,8,20,12,8,15,26, +37,53,40,32,16,24,24,23,24,33,42,60,60,50,26,11,3,9,18,28,28,20,-3,-5,-14, +-20,-34,-32,-6,-16,-6,22,5,0,10,36,56,83,59,43,10,27,36,50,49,55,60,85,82,66, +25,4,-12,1,17,31,27,21,-27,-24,-53,-61,-92,-78,-17,-33,-18,35,-3,-14,15,49,93,148,119, +92,37,40,38,48,37,70,108,175,173,137,58,8,-20,1,35,82,74,51,7,-12,-45,-84,-130,-118, +-43,-92,-55,54,-13,-36,-5,10,10,-43,-44,-64,-95,13,101,123,218,138,-73,-95,-112,-90,-39,-12,10, +11,-30,-63,-95,-64,64,-19,-37,-28,-15,31,109,102,67,-1,-33,189,47,-33,-108,-196,-35,61,87,76, +-40,-207,-157,-66,58,119,113,68,32,32,85,60,51,15,26,-9,-41,-35,-9,-7,4,-33,-112,-208,-172, +-5,157,-471,-408,-79,59,77,71,-18,-130,-170,-51,183,35,-51,-71,-89,-82,-59,-19,7,21,25,7,-27, +-40,-30,-35,2,7,1,-9,-9,22,-68,-61,32,-343,229,42,0,5,84,-1,-27,-21,-16,-36,-55,-27, +10,14,43,57,69,33,14,4,10,27,44,26,5,-8,-8,-9,3,1,8,59,69,66,130,231,-52, +3,31,10,-30,-29,-16,5,33,73,95,99,86,67,42,6,-32,-64,-80,-81,-89,-78,-68,-23,-6,-16, +-17,-25,-32,-24,-6,14,-9,-18,-47,-63,7,-13,-39,-13,31,82,119,146,138,128,124,111,96,64,47, +25,-6,-6,-16,-24,-33,-37,-39,-25,-6,19,41,46,29,24,14,7,12,13,19,10,69,72,80,70, +53,39,34,36,38,43,48,25,5,-13,-22,-32,-43,-40,-39,-37,-40,-43,-47,-31,-22,-10,4,33,52, +72,85,103,95,90,85,78,-53,-46,-50,-50,-45,-43,-46,-52,-53,-55,-53,-50,-44,-39,-39,-40,-41,-43, +-46,-49,-53,-52,-54,-57,-60,-64,-58,-56,-56,-51,-46,-43,-42,-44,-46,-41,-40,-35,-37,-38,-41,-43,-43, +-44,-42,-40,-40,-40,-40,-39,-40,-41,-42,-43,-44,-45,-47,-48,-50,-48,-50,-53,-50,-49,-45,-44,-42,-38, +-36,-34,-44,-42,-46,14,12,13,16,19,25,19,16,10,13,15,19,18,18,18,23,23,21,14,11, +7,11,12,16,13,11,3,4,1,-2,-4,-2,6,6,7,16,11,7,13,21,32,50,41,32,14, +18,20,28,24,31,36,57,59,50,29,15,8,13,19,23,25,17,-8,-8,-15,-20,-32,-31,-15,-15, +-6,11,4,4,15,33,53,81,64,47,10,16,26,57,48,52,49,79,80,66,27,8,-7,4,17, +20,20,16,-36,-30,-57,-62,-90,-76,-30,-29,-15,19,-1,-15,11,32,78,141,122,94,34,27,31,66, +43,67,91,164,172,145,72,28,3,21,43,68,64,42,-9,-29,-58,-78,-140,-130,-66,-92,-55,23,-20, +11,28,63,49,-39,-27,-48,-98,-2,70,84,192,134,-69,-92,-122,-126,-78,-62,-52,-42,-68,-88,-97,-62, +63,-20,-36,-22,-10,47,134,118,80,13,7,149,16,-53,-112,-185,-80,12,73,84,-15,-183,-169,-97,14, +115,134,83,55,50,96,59,48,25,33,-3,-46,-30,-3,-3,5,-39,-122,-218,-164,23,138,-409,-315,-95, +23,134,100,1,-110,-199,-90,186,50,-33,-72,-90,-91,-74,-32,-10,-1,11,-6,-38,-47,-33,-27,2,4, +-1,-3,-8,3,-72,-61,25,-312,165,-29,-10,27,115,51,16,-18,-8,-25,-34,-29,-1,-2,38,62,72, +45,29,17,24,37,50,29,3,-14,-9,-5,6,3,11,56,49,50,139,203,-29,25,57,28,-27,-37, +-28,-11,14,50,79,84,76,59,38,3,-35,-61,-73,-74,-81,-67,-50,-14,0,-14,-16,-23,-26,-20,-8, +3,-2,-13,-45,-55,-26,-50,-72,-41,9,64,100,128,134,136,140,128,112,80,63,37,4,-2,-18,-32, +-41,-41,-37,-16,3,26,36,32,13,10,4,-1,1,-1,1,-14,88,92,96,86,70,55,51,52,51, +50,50,26,4,-17,-24,-32,-40,-37,-34,-32,-33,-35,-39,-19,-7,10,23,50,68,81,89,102,98,98, +96,92,-35,-26,-30,-30,-27,-27,-31,-38,-41,-44,-43,-42,-38,-35,-36,-36,-37,-40,-43,-47,-50,-49,-52, +-55,-59,-63,-56,-51,-48,-40,-31,-24,-24,-26,-27,-23,-30,-24,-27,-29,-32,-34,-34,-35,-34,-35,-36,-36, +-37,-38,-39,-39,-40,-40,-41,-41,-43,-44,-46,-44,-46,-51,-47,-43,-39,-36,-33,-28,-27,-25,-34,-32,-43, +11,11,12,14,16,23,18,15,8,10,12,19,16,16,15,20,20,19,13,10,7,10,11,13,10, +9,1,3,0,-3,-4,-2,3,5,7,12,10,7,11,16,27,46,40,31,10,13,16,31,23,27, +29,52,56,48,31,19,12,16,19,17,20,12,-14,-10,-14,-20,-28,-29,-23,-14,-6,0,1,6,19, +28,47,77,65,49,5,7,16,62,45,49,40,73,75,62,28,11,-1,7,15,8,13,11,-45,-34, +-60,-68,-87,-71,-43,-23,-11,5,1,-17,8,16,62,128,121,91,23,14,25,82,48,62,75,151,167, +145,83,46,24,36,47,49,52,33,-28,-42,-65,-73,-140,-133,-88,-87,-50,-9,-26,54,62,109,82,-31, +-10,-30,-87,-13,38,46,155,118,-62,-90,-130,-156,-112,-103,-103,-87,-98,-106,-92,-53,58,-17,-27,-11,0, +62,148,130,92,31,45,102,-11,-67,-111,-167,-116,-30,58,88,12,-152,-173,-121,-23,101,141,96,78,69, +101,56,42,31,36,1,-47,-27,1,-2,1,-44,-124,-217,-152,45,109,-324,-226,-118,-14,180,118,22,-71, +-204,-118,167,64,-9,-73,-87,-94,-85,-43,-27,-27,-5,-18,-44,-51,-33,-18,3,3,-2,1,-7,-19,-58, +-48,-7,-261,94,-53,17,63,129,103,63,-8,-3,-21,-20,-30,-10,-13,34,63,68,54,43,29,35,43, +52,29,2,-17,-9,0,6,3,12,45,24,28,125,147,-6,39,69,39,-26,-46,-44,-30,-8,24,58, +64,62,51,32,1,-35,-54,-63,-67,-70,-53,-31,-6,4,-10,-15,-18,-16,-14,-8,-7,2,-6,-34,-39, +-53,-78,-92,-62,-15,35,68,95,117,133,146,136,120,89,72,45,11,-3,-23,-40,-47,-43,-32,-8,10, +29,27,17,-1,-1,-2,-7,-6,-12,-15,-34,94,96,97,89,77,66,63,64,59,52,47,23,1,-21, +-25,-31,-37,-32,-28,-26,-26,-27,-32,-9,7,29,40,62,77,82,83,89,89,94,95,92,-13,-1,-5, +-7,-7,-10,-16,-22,-27,-31,-32,-34,-33,-34,-34,-35,-36,-39,-42,-46,-48,-46,-47,-50,-54,-57,-49,-44, +-38,-28,-17,-9,-8,-9,-9,-3,-20,-14,-18,-20,-24,-25,-26,-27,-28,-30,-33,-34,-36,-38,-38,-38,-38, +-38,-38,-38,-39,-40,-42,-39,-41,-46,-41,-37,-33,-29,-26,-20,-19,-17,-25,-22,-40,10,10,12,12,14, +21,17,14,6,7,9,19,14,14,12,18,19,17,12,9,7,9,9,9,8,6,-2,0,-2,-6, +-5,-3,-2,5,6,8,9,5,10,12,23,41,39,30,6,9,13,34,22,24,24,48,53,45,32, +22,16,17,17,12,15,7,-18,-10,-12,-21,-22,-24,-29,-13,-6,-9,-1,8,23,25,42,69,65,49, +2,1,10,66,43,45,33,67,71,57,30,15,5,8,12,-2,5,5,-52,-37,-60,-76,-82,-65,-56, +-18,-7,-7,1,-20,6,4,47,112,117,86,13,5,23,96,51,54,61,138,160,140,92,61,41,46, +47,30,37,22,-46,-48,-65,-70,-132,-126,-107,-78,-44,-37,-32,90,93,145,109,-16,6,-11,-63,-19,10, +14,115,100,-43,-84,-132,-174,-138,-133,-137,-122,-119,-118,-79,-39,50,-10,-13,3,13,73,147,135,102,52, +77,55,-31,-71,-105,-148,-138,-59,46,91,37,-117,-170,-138,-50,77,135,105,99,86,100,51,35,32,35, +3,-45,-22,3,-4,-3,-46,-116,-202,-133,61,78,-237,-148,-139,-43,216,129,44,-25,-191,-135,134,80,21, +-68,-78,-90,-89,-52,-40,-47,-21,-27,-48,-52,-31,-9,6,2,-2,5,-2,-36,-32,-29,-55,-206,25,-25, +66,98,122,141,108,16,3,-20,-10,-32,-16,-17,31,59,61,59,55,39,43,46,52,27,1,-17,-7, +2,2,0,10,28,1,5,87,70,16,46,72,47,-21,-50,-58,-49,-30,-2,34,42,46,44,25,0, +-29,-43,-51,-57,-56,-37,-12,2,7,-7,-12,-11,-5,-6,-6,-14,3,0,-14,-16,-72,-94,-96,-72,-36, +3,30,57,93,120,140,135,121,92,75,48,14,-6,-28,-45,-50,-42,-26,0,16,28,17,3,-10,-9, +-6,-10,-12,-21,-29,-49,85,84,81,78,72,67,68,71,62,51,43,20,-1,-23,-25,-29,-33,-28,-23, +-20,-20,-20,-24,0,18,44,52,68,79,75,70,67,71,78,81,80,11,24,20,16,13,7,0,-6, +-13,-18,-22,-26,-29,-33,-33,-34,-35,-37,-41,-44,-45,-41,-40,-41,-44,-45,-38,-31,-25,-13,-1,7,10, +9,11,17,-11,-5,-10,-13,-15,-17,-18,-19,-22,-25,-29,-31,-34,-37,-36,-36,-36,-36,-36,-35,-35,-36, +-38,-33,-34,-40,-35,-31,-27,-23,-20,-14,-12,-9,-16,-13,-37,8,9,11,10,12,18,15,13,3,5, +7,18,13,12,10,16,16,15,10,8,6,7,7,7,5,4,-4,-1,-4,-9,-6,-3,-6,4,6, +5,7,2,9,8,18,35,36,27,2,5,11,36,20,20,18,42,48,42,32,24,18,17,14,8, +9,2,-20,-9,-9,-22,-16,-19,-33,-10,-5,-15,-4,7,25,21,36,60,62,48,-3,-4,5,68,38, +39,26,61,66,52,31,18,10,7,7,-8,-4,-2,-57,-38,-59,-86,-76,-60,-68,-13,-3,-16,0,-24, +3,-6,33,92,108,80,3,-4,21,106,50,42,46,121,148,132,97,71,55,50,42,13,20,10,-58, +-47,-58,-64,-115,-111,-119,-66,-37,-59,-37,114,117,168,128,5,19,1,-37,-22,-13,-13,79,84,-12,-73, +-129,-181,-155,-151,-155,-143,-130,-123,-59,-20,39,-2,0,16,24,77,133,131,110,70,99,14,-43,-71,-98, +-130,-151,-78,39,90,57,-81,-164,-152,-70,47,117,108,113,97,93,44,26,30,30,1,-40,-15,2,-8, +-7,-44,-102,-176,-110,69,47,-166,-82,-148,-58,237,133,59,11,-174,-146,92,93,53,-59,-66,-81,-87,-59, +-50,-60,-32,-33,-48,-48,-26,-1,8,1,2,7,7,-41,-5,-10,-103,-160,-34,41,107,107,81,150,141, +53,13,-22,-7,-35,-22,-18,24,47,50,60,61,49,49,48,51,23,1,-13,-4,1,-1,-5,5,11, +-12,-15,28,-20,38,49,68,55,-13,-49,-71,-68,-52,-28,8,19,29,34,18,0,-20,-31,-38,-45,-39, +-18,6,9,9,-4,-7,-4,2,1,-2,-17,1,5,10,14,-79,-96,-86,-74,-54,-29,-7,20,65,99, +123,122,112,89,71,45,11,-12,-32,-47,-50,-39,-19,6,18,23,6,-8,-15,-13,-9,-14,-16,-28,-40, +-59,64,59,53,54,54,57,62,67,58,48,40,19,0,-21,-22,-25,-28,-23,-19,-17,-14,-13,-15,7, +27,55,59,68,73,62,52,42,48,57,61,59,34,44,40,35,28,21,13,8,-1,-7,-13,-19,-25, +-32,-31,-31,-32,-35,-38,-41,-40,-34,-31,-29,-30,-28,-21,-15,-7,4,16,24,26,26,29,35,-4,2, +-4,-6,-8,-10,-11,-13,-16,-20,-25,-28,-30,-34,-33,-33,-33,-33,-32,-31,-31,-31,-33,-26,-26,-31,-26, +-23,-19,-16,-13,-8,-5,-1,-7,-5,-32,6,7,10,9,10,15,14,11,2,3,5,18,11,10,8, +14,14,13,9,7,6,6,5,5,3,1,-5,-3,-5,-12,-6,-4,-9,3,5,2,6,0,8,5, +14,28,33,25,-1,1,8,37,16,14,13,36,43,39,31,24,20,15,11,5,3,-3,-21,-8,-6, +-21,-10,-13,-34,-8,-4,-19,-6,6,27,18,31,50,58,46,-6,-8,1,70,32,33,22,54,60,49, +31,20,15,6,2,-11,-12,-10,-59,-39,-56,-94,-68,-53,-76,-9,1,-22,-1,-27,2,-12,21,71,99, +74,-3,-11,18,112,43,24,30,102,134,124,98,76,64,48,35,-1,2,-3,-62,-41,-46,-54,-91,-90, +-120,-53,-30,-74,-41,127,135,180,143,34,27,6,-11,-22,-28,-31,52,78,29,-54,-119,-176,-163,-161,-159, +-151,-132,-121,-34,0,27,6,10,21,28,71,109,120,113,87,112,-18,-47,-65,-90,-115,-155,-88,38,86, +72,-45,-153,-161,-83,16,91,106,118,101,82,34,17,25,22,-2,-32,-8,-2,-11,-10,-34,-82,-143,-86, +70,20,-113,-22,-134,-50,249,139,76,45,-152,-150,48,105,86,-41,-51,-70,-79,-61,-54,-62,-35,-33,-46, +-40,-18,6,6,1,6,5,17,-34,14,6,-135,-122,-78,129,127,85,19,125,152,102,30,-18,-7,-37, +-26,-16,15,31,38,57,65,56,52,49,48,18,0,-9,-2,-2,-3,-7,1,-2,-14,-29,-45,-109,65, +54,65,63,1,-38,-75,-82,-69,-48,-14,0,13,26,14,4,-7,-18,-24,-29,-19,1,21,15,11,-1, +-2,3,6,5,2,-16,-3,10,36,53,-78,-84,-65,-66,-63,-53,-35,-10,40,75,98,102,97,80,64, +38,4,-19,-35,-45,-48,-35,-13,10,18,15,-4,-14,-16,-14,-11,-18,-21,-33,-47,-64,38,29,20,25, +28,40,50,58,52,45,40,22,5,-13,-15,-18,-21,-17,-15,-16,-9,-5,-4,15,34,61,60,62,63, +48,34,19,26,34,37,34,49,57,53,47,39,32,25,20,10,3,-4,-12,-19,-27,-26,-27,-27,-30, +-32,-34,-34,-24,-19,-14,-14,-8,-3,4,11,21,31,38,40,39,42,47,3,7,3,1,0,-2,-4, +-6,-9,-13,-18,-21,-24,-28,-27,-27,-27,-26,-25,-24,-25,-24,-27,-16,-16,-21,-18,-14,-12,-9,-7,-2, +1,5,-1,2,-23,4,5,8,6,7,11,11,9,-1,0,2,16,7,7,6,11,11,10,7,5, +4,4,3,4,0,-1,-6,-3,-6,-13,-5,-3,-11,2,4,1,4,-2,6,2,9,20,28,21,-4, +-3,4,36,10,6,8,27,35,34,28,22,19,13,7,3,-3,-8,-20,-8,-5,-22,-6,-9,-34,-6, +-3,-20,-9,4,26,14,26,39,53,41,-10,-13,-5,67,24,23,16,46,52,45,30,19,16,4,-3, +-10,-20,-18,-57,-39,-53,-98,-60,-47,-80,-6,3,-24,-3,-29,0,-16,9,49,86,67,-9,-19,12,111, +31,2,12,78,115,114,95,76,66,42,24,-10,-15,-15,-59,-31,-30,-38,-66,-66,-110,-41,-23,-81,-44, +128,142,182,154,66,30,2,7,-23,-40,-45,36,81,73,-30,-105,-163,-164,-162,-154,-147,-125,-110,-7,17, +16,12,11,20,25,59,78,102,112,100,115,-39,-44,-60,-86,-107,-158,-99,35,75,77,-11,-140,-169,-98, +-15,61,98,113,95,66,22,7,20,14,-6,-23,-4,-6,-9,-12,-21,-59,-109,-65,64,-3,-69,36,-106, +-33,239,143,91,73,-129,-149,4,108,112,-16,-36,-60,-70,-62,-54,-55,-30,-28,-40,-30,-9,8,4,3, +7,3,19,-17,22,14,-143,-93,-104,196,107,30,-55,66,134,150,49,-11,-14,-40,-32,-18,1,12,25, +49,63,61,55,49,43,11,-2,-5,-2,-4,-3,-7,-2,-8,-11,-37,-118,-184,95,64,60,64,13,-25, +-75,-92,-84,-65,-34,-19,-4,16,11,8,4,-6,-10,-11,2,20,34,20,11,1,3,6,7,6,5, +-11,-6,14,59,95,-70,-67,-43,-54,-64,-68,-53,-29,20,52,68,76,76,65,51,27,-5,-25,-36,-42, +-43,-30,-8,11,14,6,-11,-17,-16,-13,-13,-21,-25,-38,-51,-65,10,-3,-12,-6,-2,17,31,44,41, +40,40,26,14,0,-4,-9,-12,-11,-12,-15,-4,2,7,20,38,61,57,51,50,33,19,2,9,14, +16,11,58,62,59,53,45,39,33,30,20,11,4,-5,-12,-21,-20,-20,-20,-22,-23,-26,-24,-13,-6, +1,4,12,16,22,27,33,41,46,46,45,49,52,8,11,8,7,7,5,3,1,-2,-5,-9,-12, +-15,-19,-18,-18,-18,-17,-17,-16,-16,-15,-17,-6,-5,-8,-7,-5,-3,-1,1,4,7,10,6,8,-14, +5,4,10,7,8,10,12,10,0,1,3,17,7,7,6,10,11,11,8,6,6,2,1,1,-2, +-4,-8,-6,-8,-15,-7,-5,-14,1,4,-3,2,-5,8,3,9,17,28,23,-2,-2,5,37,8,3, +5,21,30,33,28,22,18,9,4,3,-8,-11,-17,-7,-4,-21,-1,-4,-30,-2,-2,-20,-7,3,28, +16,26,35,53,43,-6,-11,-5,68,19,19,15,39,46,45,30,20,17,2,-8,-7,-27,-27,-50,-39, +-48,-95,-50,-40,-78,-4,5,-25,-3,-28,2,-12,5,35,83,70,-3,-19,12,110,23,-14,-2,56,96, +106,91,73,63,33,14,-16,-30,-24,-49,-20,-16,-22,-41,-43,-91,-29,-17,-81,-43,123,146,185,168,106, +38,3,26,-16,-39,-47,38,99,121,3,-80,-136,-154,-153,-139,-136,-112,-92,16,27,8,13,8,15,15, +42,48,82,104,106,113,-50,-34,-45,-75,-91,-151,-99,38,67,83,28,-117,-166,-105,-35,39,91,105,86, +48,9,-2,16,6,-10,-14,-2,-6,-6,-10,-12,-32,-77,-46,54,-18,-30,89,-55,2,229,159,117,105, +-93,-131,-26,114,141,26,-12,-45,-54,-55,-43,-38,-19,-18,-32,-17,-1,7,2,3,5,3,12,-1,21, +15,-129,-65,-114,225,68,-28,-113,-2,102,194,80,13,-15,-32,-29,-16,-9,-1,17,44,62,64,54,48, +34,4,-3,-3,-3,-4,-3,-5,-2,-8,-7,-40,-177,-232,133,93,70,68,32,-5,-62,-89,-87,-68,-38, +-26,-9,17,16,18,18,9,8,11,23,39,42,23,11,2,5,6,6,5,6,-5,-6,20,77,142, +-59,-41,-16,-34,-52,-65,-53,-32,12,36,45,54,56,50,38,18,-11,-26,-32,-35,-37,-23,-2,11,10, +-2,-13,-16,-13,-11,-11,-21,-26,-38,-51,-58,-12,-26,-33,-27,-23,1,17,32,35,40,46,38,29,20, +13,7,1,0,-3,-10,0,9,16,25,38,54,47,40,36,21,7,-9,-4,-1,0,-7,57,62,60, +56,49,45,41,40,31,23,15,7,0,-9,-8,-8,-8,-9,-9,-12,-14,1,9,17,21,34,35,38, +40,44,48,50,49,47,51,54,14,19,17,17,17,16,14,13,10,8,5,3,0,-3,-2,-2,-2, +-2,-2,0,-4,-5,-9,7,5,1,1,2,3,4,5,6,11,17,9,13,3,3,6,8,6,7, +8,11,9,0,0,2,15,6,5,5,8,9,10,7,5,4,4,4,6,-2,-2,-3,-2,-3,-9, +-2,0,-8,4,5,1,5,0,8,3,7,13,26,22,-1,-4,3,35,5,-2,1,13,22,29,24, +19,15,10,2,5,-10,-13,-12,-8,-6,-20,1,-1,-26,1,1,-15,-6,6,28,16,26,29,51,42, +-3,-11,-7,64,14,13,11,29,36,42,27,17,15,2,-9,-1,-33,-32,-40,-37,-40,-80,-40,-32,-67, +-1,7,-22,-2,-22,4,-10,1,21,75,69,2,-20,8,104,16,-27,-17,29,70,94,81,63,54,25, +4,-16,-40,-28,-36,-9,-8,-11,-20,-25,-67,-18,-10,-74,-40,118,138,179,177,137,42,-1,34,-13,-38, +-48,37,112,158,36,-52,-106,-138,-140,-121,-118,-96,-67,32,31,2,11,3,11,5,25,26,58,91,105, +109,-46,-17,-33,-67,-82,-147,-105,34,54,83,64,-91,-159,-113,-52,19,80,91,69,29,-1,-8,14,-2, +-11,-6,-3,-4,-4,-5,-8,-12,-48,-31,41,-24,16,134,-12,23,190,163,134,126,-55,-108,-55,105,152, +63,4,-37,-42,-49,-34,-17,-2,-5,-20,-6,4,4,2,3,3,3,5,4,17,10,-95,-35,-107,187, +-13,-102,-169,-82,47,209,107,41,-22,-30,-34,-25,-25,-16,7,34,55,65,56,47,23,-1,-4,-2,-3, +-3,-2,-3,-2,-5,-4,-41,-205,-245,176,125,70,55,35,5,-49,-83,-86,-69,-45,-34,-16,15,18,24, +26,22,24,32,46,56,47,24,9,2,5,5,5,3,5,1,-3,28,89,183,-36,-18,2,-15,-36, +-52,-43,-28,9,25,27,33,33,30,21,6,-16,-25,-27,-26,-26,-13,6,12,7,-6,-12,-13,-10,-7, +-7,-17,-22,-32,-42,-44,-24,-39,-44,-38,-35,-11,4,18,26,37,49,47,44,40,31,23,16,12,6, +-3,9,18,26,30,37,44,37,28,26,12,2,-13,-10,-10,-10,-18,58,56,55,53,48,47,45,46, +40,32,25,19,14,7,8,8,8,7,8,6,4,18,27,34,40,53,52,53,53,52,52,51,50, +49,51,52,25,25,25,26,27,26,24,24,22,21,19,18,16,14,15,14,14,14,14,15,14,13, +8,24,22,19,17,17,17,17,17,17,22,26,20,24,19,-3,0,2,0,1,1,4,2,-6,-6, +-5,8,-1,-2,-1,0,1,4,0,-1,-3,-2,-1,4,-9,-8,-3,-4,-4,-8,-2,-2,-9,-1,-2, +-1,-1,-4,2,-3,0,2,16,13,-8,-11,-6,25,-3,-11,-9,-2,7,19,14,10,6,4,-4,1, +-17,-19,-12,-16,-16,-25,-4,-3,-25,-3,-3,-18,-10,1,22,10,18,17,40,32,-9,-19,-16,51,4, +3,1,12,18,33,18,9,6,-3,-13,0,-41,-38,-32,-37,-36,-63,-32,-27,-57,-3,4,-24,-7,-21, +0,-12,-9,0,57,57,-4,-28,-2,85,6,-39,-37,-6,36,73,63,49,39,14,-5,-15,-44,-28,-20, +-3,-3,-2,-7,-11,-43,-11,-7,-66,-39,100,117,164,171,149,35,-15,25,-25,-50,-55,25,108,171,58, +-30,-84,-126,-129,-107,-102,-78,-41,38,27,0,7,1,5,2,10,11,34,69,89,94,-46,-8,-31,-72, +-88,-157,-127,7,20,60,76,-83,-165,-137,-76,-5,60,68,46,6,-14,-14,9,-9,-10,-3,-2,-2,-2, +-2,-5,-3,-23,-20,23,-32,46,149,20,32,143,158,140,124,-32,-100,-98,73,141,90,12,-35,-38,-46, +-26,0,9,4,-12,2,4,2,1,2,1,1,3,2,11,4,-69,-12,-112,89,-94,-158,-195,-151,-21, +178,116,59,-38,-39,-52,-47,-50,-36,-9,20,41,55,50,37,9,-6,-4,-1,-2,-2,-2,-2,-2,-2, +-3,-41,-208,-230,202,151,63,25,23,-4,-50,-87,-96,-83,-61,-50,-31,4,14,23,26,25,32,44,59, +63,43,20,5,2,4,3,3,2,3,3,-2,33,86,202,-28,-6,7,-9,-28,-47,-43,-37,-9,-1, +-4,0,1,-1,-4,-11,-26,-30,-29,-25,-21,-9,9,8,3,-7,-9,-7,-6,-4,-4,-12,-19,-28,-36, +-35,-40,-55,-58,-52,-49,-30,-18,-8,5,20,36,41,44,47,37,28,20,14,7,-2,10,19,28,26, +30,28,24,13,13,1,-5,-19,-20,-23,-25,-34,46,34,34,34,31,32,33,35,33,28,23,19,16, +14,14,15,15,15,16,14,18,26,33,41,48,59,55,53,52,47,44,42,40,39,40,36,23,19, +22,23,25,24,23,23,22,23,23,23,22,21,21,21,21,21,20,20,21,22,22,27,28,31,29, +28,26,27,26,24,24,23,27,25,24,-5,-2,2,0,0,-1,4,2,-6,-7,-6,6,-3,-3,-3, +-3,-2,2,-2,-3,-4,-5,-5,-1,-10,-11,-6,-9,-8,-10,-6,-6,-12,-4,-3,-7,-4,-6,3,-2, +0,-1,15,13,-4,-11,-7,20,-4,-13,-13,-12,-4,12,8,6,1,-2,-7,1,-21,-24,-9,-21,-22, +-26,-6,-3,-21,-3,-5,-17,-9,2,22,12,20,14,40,34,0,-16,-16,40,2,0,-4,-2,4,27, +12,5,-2,-7,-16,1,-45,-41,-22,-35,-30,-45,-22,-21,-42,-3,1,-23,-7,-16,3,-6,-8,-9,54, +60,10,-23,-6,67,4,-41,-49,-37,2,54,47,35,23,4,-12,-14,-44,-23,-7,-1,3,7,-1,-1, +-22,-6,-5,-53,-33,92,108,162,180,172,49,-5,36,-16,-43,-50,22,111,186,91,5,-54,-105,-112,-91, +-89,-59,-17,36,19,-1,4,-2,-1,0,4,3,17,49,73,81,-37,15,-3,-45,-69,-142,-126,0,11, +59,100,-55,-148,-139,-79,-10,51,55,31,-10,-23,-16,6,-12,-7,-1,-1,0,1,0,-2,-1,-9,-9, +11,-26,83,176,64,47,94,157,155,130,8,-70,-111,59,143,134,39,-17,-21,-31,-11,18,20,12,-5, +6,4,1,1,0,0,0,1,0,6,2,-48,12,-103,-31,-156,-182,-208,-195,-77,136,133,95,-30,-26, +-49,-50,-54,-37,-13,12,32,47,42,26,-3,-6,-3,-1,-1,-1,0,0,-1,-1,-1,-34,-182,-182,225, +179,55,-6,3,-17,-47,-75,-89,-77,-57,-46,-27,9,20,30,35,37,46,56,67,64,35,14,1,2, +2,1,1,0,1,3,0,36,79,207,-14,9,16,4,-14,-32,-32,-33,-12,-9,-14,-12,-14,-18,-16, +-18,-25,-26,-22,-20,-16,-3,10,6,0,-6,-4,-3,-1,0,0,-5,-13,-18,-25,-18,-50,-61,-59,-55, +-51,-35,-25,-18,-4,13,31,40,49,57,46,36,26,20,14,4,12,19,25,20,19,13,9,1,1, +-8,-14,-24,-28,-34,-39,-46,24,14,16,18,18,21,24,27,29,27,24,23,22,22,21,23,24,24, +26,24,24,33,39,45,51,59,54,49,46,39,35,32,29,27,26,21,22,20,23,24,26,26,26, +27,27,28,29,30,31,31,31,30,30,30,29,30,28,27,24,32,31,32,29,29,27,26,24,22, +23,23,22,22,33,-8,-4,-2,-3,-2,-4,1,-1,-7,-9,-8,1,-5,-5,-6,-7,-7,-2,-5,-6, +-8,-7,-6,-1,-13,-13,-5,-9,-8,-8,-5,-5,-10,-5,-6,-7,-5,-5,0,-3,-3,-7,10,10,-3, +-11,-9,12,-5,-14,-18,-23,-16,3,1,-1,-6,-5,-10,0,-24,-26,-7,-26,-28,-25,-9,-5,-16,-5, +-6,-16,-10,1,18,10,17,7,35,31,6,-13,-16,28,4,1,-7,-16,-12,17,4,-2,-10,-11,-18, +1,-46,-41,-14,-31,-24,-28,-14,-15,-27,-4,-2,-21,-9,-11,3,-5,-11,-21,42,55,20,-17,-8,46, +7,-36,-58,-68,-34,30,28,19,6,-6,-18,-12,-39,-13,0,3,8,7,3,2,-6,-3,-3,-40,-28, +80,83,142,169,174,51,-2,38,-10,-30,-29,31,120,200,127,44,-23,-84,-96,-76,-73,-39,2,28,10, +-1,0,-4,-3,-2,1,1,5,29,50,63,-20,26,-2,-44,-71,-140,-133,-21,-2,57,119,-27,-128,-143, +-88,-20,38,41,18,-21,-23,-12,3,-10,-4,0,0,1,1,1,0,0,-5,-2,6,-19,110,172,72, +36,35,143,158,121,37,-50,-131,26,123,155,56,-4,-13,-22,-2,28,26,15,1,6,2,0,0,-1, +-1,-1,0,0,3,7,-35,23,-110,-178,-196,-174,-191,-206,-119,67,131,118,-24,-26,-60,-65,-67,-46,-25, +-2,15,31,32,13,-10,-4,-1,0,0,1,1,1,1,-1,1,-20,-140,-125,218,182,40,-37,-19,-30, +-42,-60,-79,-75,-61,-52,-32,2,15,25,34,43,55,64,73,60,27,8,-1,1,0,0,-1,-1,-1, +1,-3,33,66,180,0,22,25,19,5,-13,-20,-30,-19,-20,-26,-26,-32,-38,-34,-30,-28,-23,-17,-13, +-6,6,13,5,0,-2,0,1,2,4,3,2,-4,-6,-12,-2,-53,-58,-53,-49,-44,-34,-28,-25,-13, +1,15,28,40,52,43,34,25,21,17,11,15,18,21,13,10,2,0,-7,-6,-13,-17,-25,-32,-40, +-46,-51,8,-3,2,6,9,13,19,24,28,29,30,30,30,33,32,33,34,34,35,34,32,39,43, +46,50,53,47,41,36,29,24,22,18,17,15,8,24,21,25,26,29,30,30,31,32,34,36,38, +39,40,40,39,39,38,38,38,36,34,32,38,37,39,36,35,33,32,30,27,26,26,24,24,42, +-11,-7,-5,-6,-5,-8,-3,-3,-7,-10,-10,-4,-7,-8,-9,-12,-12,-6,-9,-9,-12,-10,-9,-4,-16, +-16,-6,-12,-11,-8,-7,-7,-10,-8,-9,-9,-8,-7,-3,-5,-6,-13,5,7,-1,-12,-12,3,-5,-14, +-23,-33,-28,-7,-7,-7,-12,-10,-14,-3,-26,-28,-8,-32,-33,-25,-11,-7,-12,-8,-10,-17,-12,-1,14, +8,14,-2,30,30,14,-10,-15,13,6,3,-12,-30,-29,5,-5,-8,-18,-16,-21,-1,-45,-38,-7,-25, +-15,-13,-7,-9,-14,-5,-6,-21,-12,-11,2,-3,-13,-34,32,51,32,-10,-11,22,11,-27,-65,-96,-69, +3,9,6,-10,-15,-21,-11,-29,-4,4,5,7,5,3,3,0,-1,-3,-30,-24,63,65,127,158,178, +67,17,49,-1,-20,-12,34,119,198,150,75,-2,-66,-82,-65,-59,-22,14,16,3,-2,-2,-3,-2,-1, +-1,0,-1,12,29,43,-13,35,21,-16,-45,-119,-128,-40,-14,49,120,-8,-110,-145,-98,-32,24,29,10, +-26,-19,-8,-1,-8,-2,1,1,2,1,1,0,1,-3,-1,4,-9,127,179,103,44,-5,138,171,125, +70,-28,-144,-5,98,165,75,14,-3,-9,6,33,25,12,3,4,1,0,-1,-1,-1,-1,-1,0,-2, +12,-31,28,-111,-285,-195,-133,-160,-183,-133,0,128,142,1,-13,-60,-68,-72,-53,-35,-15,-2,14,16,0, +-12,-1,0,0,1,1,1,1,1,1,0,-3,-93,-70,193,174,26,-57,-39,-44,-39,-43,-68,-70,-58, +-46,-26,3,15,25,36,46,58,66,70,49,17,2,-1,0,-1,-1,-2,-2,-3,0,-6,22,55,142, +16,38,37,37,24,4,-12,-28,-27,-29,-34,-35,-40,-50,-42,-33,-27,-20,-12,-7,2,12,14,4,0, +1,2,3,3,4,5,5,2,4,0,13,-48,-50,-43,-42,-37,-30,-25,-24,-14,-4,7,20,34,47, +40,33,26,23,21,17,15,15,14,6,1,-5,-6,-10,-8,-12,-16,-21,-29,-38,-44,-46,-6,-17,-11, +-4,1,6,13,20,26,30,32,35,36,41,39,40,40,41,41,40,38,41,42,42,42,40,33,27, +22,15,10,8,5,4,2,-6,24,19,24,26,28,30,31,32,34,36,38,41,43,46,45,44,44, +43,42,42,41,40,39,40,40,43,41,40,37,36,34,30,28,25,26,25,45,-14,-10,-7,-7,-7, +-11,-5,-6,-8,-12,-13,-10,-9,-10,-13,-16,-17,-11,-12,-13,-15,-14,-13,-7,-19,-18,-7,-14,-14,-10, +-9,-9,-10,-11,-12,-12,-11,-9,-5,-5,-7,-17,1,3,0,-14,-16,-9,-6,-14,-27,-41,-38,-17,-14, +-12,-18,-14,-17,-6,-27,-30,-10,-35,-35,-22,-12,-7,-8,-10,-13,-17,-13,-2,12,11,15,-6,25,26, +20,-10,-18,-7,5,3,-17,-42,-43,-8,-14,-14,-26,-21,-23,-4,-41,-31,-2,-14,-6,-5,-2,-4,-3, +-5,-9,-18,-11,-8,4,4,-9,-39,20,42,39,-9,-21,-10,11,-19,-70,-117,-99,-26,-10,-8,-23,-22, +-23,-10,-18,4,3,4,5,2,2,1,1,1,-2,-21,-18,55,56,114,149,182,80,33,55,6,-11, +-2,30,106,182,167,104,18,-47,-68,-57,-47,-10,17,6,1,-2,-2,-2,-1,-1,-1,-1,-1,4,16, +31,6,46,32,3,-31,-101,-119,-49,-16,47,114,9,-88,-143,-108,-49,4,15,4,-26,-12,-3,-3,-4, +0,1,1,1,1,1,0,1,0,-2,4,4,141,173,96,23,-54,117,172,125,102,-1,-141,-28,74, +166,97,41,12,5,12,30,18,7,3,2,0,-1,-1,-1,-1,0,-1,1,-4,10,-19,25,-117,-374, +-191,-94,-123,-150,-139,-68,107,151,34,-2,-59,-66,-73,-57,-43,-26,-17,-5,0,-10,-8,1,0,1,1, +1,1,1,0,2,-1,4,-47,-33,136,127,0,-75,-64,-60,-40,-29,-57,-67,-59,-46,-26,-1,12,24, +40,51,61,64,61,36,8,-1,-1,-1,-2,-2,-2,-2,-3,0,-6,7,42,86,30,47,43,47,33, +14,-7,-27,-35,-38,-41,-41,-46,-56,-44,-32,-22,-14,-5,2,10,16,13,3,1,3,3,4,3,4, +4,5,5,10,10,22,-43,-42,-36,-37,-32,-27,-24,-25,-17,-11,-5,8,21,33,29,25,20,20,20, +21,16,11,8,0,-4,-8,-7,-9,-7,-8,-10,-15,-23,-32,-40,-40,-19,-30,-22,-14,-8,-2,5,12, +19,24,29,33,36,42,40,41,41,41,41,41,40,38,35,32,30,24,17,11,6,0,-5,-6,-9, +-9,-12,-19,19,14,18,20,22,24,26,27,29,31,34,37,39,42,41,41,40,40,39,38,39,39, +41,35,37,42,40,38,36,34,32,28,24,20,24,21,41,-15,-11,-9,-9,-9,-13,-7,-7,-7,-12, +-14,-14,-10,-10,-14,-18,-19,-14,-14,-14,-17,-15,-15,-10,-19,-18,-9,-17,-17,-12,-11,-10,-9,-12,-14, +-14,-12,-10,-7,-7,-9,-20,-4,1,4,-12,-16,-17,-6,-12,-28,-44,-44,-25,-20,-16,-22,-17,-18,-7, +-27,-30,-11,-33,-31,-17,-10,-6,-3,-11,-15,-15,-14,-2,7,8,11,-13,18,23,30,-4,-15,-21,7, +6,-18,-47,-51,-20,-20,-17,-31,-23,-23,-7,-34,-21,2,-6,2,0,1,-2,2,-4,-10,-16,-11,-6, +0,2,-12,-47,7,35,53,0,-22,-34,12,-8,-68,-124,-116,-50,-26,-18,-33,-27,-22,-8,-7,7,1, +2,1,0,0,0,0,1,0,-14,-14,42,39,84,119,166,84,45,60,20,8,19,34,96,163,175, +126,35,-28,-53,-49,-36,0,15,0,-1,-2,-1,-1,0,0,0,0,0,0,5,20,13,41,38,21, +-7,-75,-101,-57,-14,48,112,34,-53,-120,-105,-59,-11,5,2,-19,-4,0,-4,-2,1,1,1,0,0, +0,0,0,1,-2,2,11,130,159,100,19,-70,97,161,111,113,15,-130,-46,49,155,116,71,31,23, +22,28,10,3,3,0,0,-1,-1,0,0,0,-1,1,-3,7,-12,18,-122,-390,-152,-43,-75,-102,-125, +-119,71,136,58,3,-59,-64,-73,-61,-49,-35,-30,-19,-13,-14,-3,1,0,1,1,1,0,1,0,1, +0,3,-15,-12,68,66,-16,-73,-73,-63,-37,-20,-48,-65,-61,-48,-28,-8,4,19,39,51,60,62,52, +26,2,-2,-1,-1,-1,-1,-1,-1,-1,-2,-1,-6,28,38,39,58,52,55,40,20,-4,-23,-39,-43, +-47,-45,-49,-59,-43,-31,-21,-10,1,10,17,19,10,2,2,3,3,2,1,2,3,4,4,9,15, +26,-34,-33,-28,-30,-27,-23,-21,-23,-18,-15,-12,-4,5,14,13,11,10,12,12,16,9,3,-1,-6, +-8,-7,-6,-4,-3,-3,-5,-7,-15,-24,-32,-32,-29,-34,-26,-18,-12,-7,-1,6,12,18,24,28,31, +37,36,37,37,37,37,38,37,31,27,22,18,10,5,-1,-5,-10,-14,-16,-18,-18,-21,-26,13,8, +12,13,15,17,19,21,22,24,26,29,32,34,34,34,33,33,33,32,33,33,36,28,30,34,32, +30,28,26,24,21,17,13,18,14,33,-15,-12,-11,-9,-10,-14,-9,-8,-6,-12,-14,-17,-10,-10,-14, +-18,-19,-16,-15,-15,-17,-16,-16,-12,-18,-18,-10,-18,-18,-12,-12,-11,-8,-13,-15,-15,-14,-12,-10,-7, +-10,-22,-7,-1,7,-10,-16,-23,-5,-9,-27,-42,-44,-30,-23,-18,-22,-18,-17,-9,-26,-29,-11,-27,-25, +-12,-8,-5,1,-11,-16,-14,-14,-5,1,6,7,-16,12,18,36,-1,-13,-33,8,8,-17,-45,-52,-28, +-23,-19,-31,-23,-21,-10,-24,-10,4,1,5,2,2,0,3,-2,-10,-15,-12,-9,-6,2,-13,-49,-3, +27,60,5,-25,-55,10,0,-61,-118,-120,-68,-37,-24,-36,-28,-19,-6,1,6,-1,0,-1,-1,0,0, +-1,1,2,-9,-12,32,34,66,97,156,89,54,55,31,26,36,40,88,143,176,140,51,-7,-35,-38, +-24,7,8,-1,-2,0,0,0,0,0,0,0,-1,1,1,12,18,41,47,41,14,-50,-80,-58,-15, +38,87,41,-30,-102,-104,-73,-29,-7,-1,-10,4,1,-4,1,1,0,0,0,0,0,0,0,0,0, +-1,12,119,145,82,1,-91,63,133,95,110,22,-118,-66,15,120,115,87,42,34,26,22,4,0,3, +-1,0,0,0,0,0,0,0,0,-2,3,-6,12,-116,-367,-124,-13,-40,-58,-100,-139,35,112,84,11, +-53,-60,-72,-64,-56,-45,-41,-32,-21,-13,1,0,1,0,0,0,0,0,0,0,1,1,-1,-1,2, +-7,-26,-55,-70,-54,-28,-10,-34,-53,-53,-42,-24,-12,0,15,35,46,52,53,40,15,-3,-1,-1,-1, +0,0,0,0,0,-2,1,-8,14,2,45,60,53,55,39,22,-3,-19,-38,-43,-46,-44,-46,-52,-35, +-23,-15,-4,7,17,21,18,7,2,3,2,1,1,0,0,0,1,4,4,15,27,-26,-24,-20,-22, +-20,-18,-16,-18,-15,-15,-15,-11,-6,-2,0,0,1,4,6,10,3,-3,-5,-8,-7,-3,-1,0,1, +1,0,-1,-8,-14,-22,-23,-30,-32,-25,-19,-13,-9,-5,1,6,12,17,21,24,29,29,30,31,32, +33,35,33,24,18,13,7,-1,-5,-8,-11,-14,-18,-20,-22,-22,-24,-27,7,3,6,7,8,10,12, +13,14,16,18,20,22,25,24,24,24,24,25,24,25,25,28,20,22,25,23,21,19,17,15,12, +9,6,11,8,23,-14,-11,-10,-9,-9,-13,-8,-7,-4,-10,-13,-17,-10,-9,-13,-17,-18,-16,-14,-14, +-15,-14,-14,-12,-15,-16,-11,-18,-18,-12,-12,-10,-6,-12,-13,-14,-13,-11,-10,-6,-8,-19,-7,-1,9, +-8,-15,-27,-6,-7,-24,-38,-41,-33,-24,-18,-21,-16,-14,-9,-24,-24,-8,-17,-14,-6,-4,-3,4,-9, +-15,-12,-12,-5,-2,6,7,-14,8,14,39,1,-12,-41,5,7,-16,-41,-48,-34,-25,-19,-29,-20,-18, +-10,-11,0,3,3,5,2,2,0,1,0,-6,-12,-10,-8,-7,4,-7,-40,-7,22,63,8,-27,-67, +4,4,-53,-105,-113,-79,-46,-29,-37,-25,-14,-2,4,2,-2,-1,-2,-1,-1,0,-1,0,3,-3,-9, +25,27,42,68,131,80,51,42,35,34,36,34,66,110,157,136,57,9,-19,-26,-12,8,2,-2,-1, +1,0,1,1,0,0,0,-1,-1,0,8,20,30,39,44,25,-30,-59,-53,-12,30,65,42,-13,-83, +-103,-87,-49,-23,-9,-5,7,1,-3,1,0,0,0,0,0,0,0,0,0,1,-2,6,91,118,68, +-2,-85,38,105,80,103,33,-88,-63,-1,93,116,103,57,45,30,16,-2,0,1,-1,0,0,0,0, +0,0,0,0,-1,2,-4,5,-104,-304,-95,1,-4,-20,-70,-134,3,84,103,26,-34,-47,-60,-57,-53, +-45,-43,-38,-26,-7,2,0,1,0,0,0,0,0,0,0,0,0,1,4,-44,-66,-18,-19,-46,-33, +-16,-5,-25,-44,-45,-37,-21,-13,0,14,32,41,46,47,30,7,-4,-1,-1,0,0,0,1,0,1, +0,1,-5,4,-15,45,59,49,48,33,19,-3,-14,-34,-40,-44,-41,-40,-44,-26,-15,-9,3,13,23, +24,17,4,2,1,0,0,-1,-1,-1,-1,-1,2,1,10,25,-17,-14,-12,-14,-14,-13,-12,-14,-13, +-14,-16,-16,-15,-14,-11,-9,-7,-4,-2,4,-3,-6,-6,-7,-3,0,0,2,2,3,2,4,-1,-6, +-11,-13,-28,-27,-22,-17,-12,-10,-7,-3,1,6,10,13,16,20,21,22,23,25,26,28,27,17,10, +5,-1,-5,-7,-8,-10,-12,-15,-18,-21,-22,-24,-25,1,-1,0,1,2,4,5,6,7,8,9,10, +12,14,14,15,15,15,16,15,17,17,20,12,13,14,12,10,8,6,5,3,2,0,4,2,13, +-14,-11,-11,-9,-9,-13,-10,-9,-4,-10,-13,-18,-10,-10,-13,-16,-17,-17,-14,-14,-14,-13,-13,-12,-14, +-15,-12,-17,-16,-11,-10,-9,-4,-11,-12,-12,-12,-10,-12,-8,-9,-18,-10,-5,7,-9,-16,-29,-8,-7, +-22,-32,-36,-33,-24,-19,-19,-14,-11,-11,-20,-17,-5,-9,-8,-3,-2,-1,3,-7,-14,-11,-11,-5,-8, +2,2,-14,1,6,34,-2,-15,-45,-1,3,-16,-34,-42,-36,-26,-19,-25,-16,-14,-7,-2,3,3,3, +3,1,1,0,0,1,-2,-9,-9,-8,-13,-1,-9,-35,-14,11,55,3,-32,-74,-4,3,-44,-84,-97, +-81,-50,-31,-33,-20,-8,1,2,-1,-1,-1,-1,-1,0,0,0,0,2,1,-6,17,18,21,41,103, +67,44,25,36,38,32,23,41,75,127,119,58,20,-5,-16,-3,6,-1,-1,0,1,1,1,0,0, +0,0,0,0,-1,3,16,21,38,50,39,-8,-37,-45,-8,25,50,48,8,-56,-88,-88,-58,-34,-15, +-3,5,-1,-1,1,0,0,0,0,0,0,0,0,0,0,1,-2,65,96,53,-7,-80,11,71,66, +87,35,-63,-61,-16,62,104,106,68,53,32,13,-3,1,0,-1,0,0,0,0,0,0,0,0,0, +0,-1,-3,-79,-228,-80,-4,18,3,-46,-112,-24,49,102,34,-18,-38,-49,-50,-50,-43,-40,-38,-23,-2, +2,0,0,0,0,0,0,0,0,0,0,0,1,9,-65,-102,-3,17,-13,-6,1,1,-16,-35,-35, +-34,-22,-17,-4,9,25,34,38,40,23,2,-3,0,0,0,0,0,1,1,1,0,1,-2,3,-16, +43,49,37,32,22,11,-5,-11,-28,-34,-38,-35,-34,-34,-17,-7,-2,9,17,25,24,13,1,2,0, +0,-1,-1,-1,-1,-1,-2,0,0,2,19,-8,-4,-4,-6,-8,-8,-8,-10,-11,-14,-17,-18,-19,-20, +-17,-14,-11,-9,-8,-3,-7,-8,-5,-3,0,1,2,2,3,3,3,4,3,-1,-3,-4,-23,-20,-17, +-14,-11,-10,-8,-5,-3,0,3,5,7,10,11,13,14,16,17,20,19,9,3,-2,-4,-5,-6,-7, +-8,-9,-9,-12,-15,-18,-20,-20,-3,-4,-4,-3,-3,-2,-1,0,0,1,1,2,3,5,5,6,6, +7,7,7,8,9,12,4,5,4,3,1,-1,-2,-4,-4,-4,-5,-2,-3,4,-12,-11,-11,-9,-8, +-11,-9,-8,-3,-9,-11,-16,-9,-9,-11,-13,-14,-15,-12,-12,-11,-11,-11,-12,-12,-14,-12,-15,-14,-10, +-10,-8,-4,-11,-11,-12,-11,-10,-12,-7,-8,-14,-9,-5,7,-8,-15,-27,-8,-7,-18,-25,-29,-30,-22, +-17,-16,-11,-8,-12,-13,-8,-1,-2,-2,0,0,0,3,-4,-11,-10,-9,-7,-12,-1,-1,-11,-2,2, +29,-2,-13,-42,-4,1,-14,-24,-32,-33,-24,-17,-18,-10,-9,-2,3,3,1,1,1,0,0,0,0, +2,2,-4,-8,-8,-17,-3,-8,-26,-14,6,46,1,-30,-69,-9,2,-34,-62,-76,-74,-48,-30,-26,-13, +-2,2,-1,-1,-1,-1,0,0,0,0,0,-1,0,2,-2,10,15,10,24,77,53,35,10,35,41, +28,16,24,50,99,100,58,31,8,-4,2,3,-1,0,1,0,0,0,0,0,0,0,0,0,-1, +1,10,17,30,45,40,4,-21,-36,-8,16,34,46,19,-35,-71,-81,-62,-41,-22,-4,2,-2,0,0, +0,0,0,0,0,0,0,0,0,-1,2,-5,39,67,36,-8,-65,-10,39,49,67,33,-40,-54,-26, +35,83,96,69,53,32,10,-2,1,-1,0,0,0,0,0,0,0,0,0,0,0,1,-8,-50,-155, +-63,-10,38,14,-28,-81,-38,20,91,40,0,-28,-36,-40,-43,-37,-34,-33,-16,2,0,0,0,0,0, +0,0,0,0,0,-1,1,-3,13,-61,-106,19,48,21,20,17,7,-9,-27,-27,-30,-21,-18,-5,6, +17,25,29,33,16,-3,-1,0,0,0,0,0,0,0,0,1,0,0,0,-2,35,38,22,14,7, +1,-9,-9,-21,-25,-29,-27,-26,-23,-9,0,3,12,18,24,21,7,0,0,-1,0,-1,0,-1,-1, +-1,-1,-1,-1,-2,8,-1,4,4,1,-2,-3,-4,-6,-9,-12,-17,-18,-20,-22,-19,-17,-14,-12,-11, +-9,-10,-7,-2,1,1,1,1,1,1,1,2,2,3,2,1,2,-17,-15,-13,-12,-11,-10,-9,-7, +-6,-4,-2,-1,0,1,3,4,6,7,8,11,11,2,-2,-4,-4,-3,-2,-3,-3,-3,-3,-5,-8, +-12,-14,-15,-6,-6,-6,-6,-5,-5,-4,-4,-4,-4,-4,-3,-3,-2,-2,-1,-1,0,1,1,2,3, +4,-1,-2,-3,-4,-5,-6,-7,-8,-8,-8,-8,-5,-6,-3,-10,-9,-9,-7,-7,-8,-8,-7,-3,-8, +-9,-14,-8,-8,-9,-10,-11,-12,-10,-10,-9,-8,-8,-11,-10,-10,-9,-10,-9,-7,-7,-5,-2,-8,-9, +-10,-9,-8,-11,-6,-7,-10,-8,-5,4,-8,-13,-23,-8,-7,-14,-18,-21,-24,-19,-14,-12,-7,-6,-8, +-4,-2,1,0,0,1,0,0,1,-1,-5,-8,-7,-6,-13,-2,-2,-6,-3,-1,21,-4,-12,-35,-8, +-2,-11,-16,-22,-28,-20,-14,-12,-6,-3,1,2,1,0,0,0,0,0,0,0,1,2,1,-4,-5, +-17,-3,-5,-14,-11,2,34,-3,-28,-57,-13,-2,-25,-41,-54,-62,-42,-27,-19,-6,1,0,-1,0,0, +0,0,0,0,0,0,0,-1,0,1,6,10,-1,9,49,35,23,-4,30,38,21,10,11,30,68, +75,52,34,16,5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,3,13,22,39, +37,13,-7,-27,-6,10,22,39,23,-20,-54,-69,-60,-44,-26,-7,0,-1,0,0,0,0,0,0,0, +0,0,0,0,-1,2,-3,16,43,22,-9,-50,-23,13,33,47,28,-22,-44,-30,14,59,76,62,47, +29,8,0,1,0,0,0,0,0,0,0,0,0,0,0,-1,2,-6,-19,-98,-51,-16,45,17,-17, +-53,-43,-1,69,41,14,-17,-23,-29,-33,-29,-25,-25,-7,2,-1,0,0,0,0,0,0,0,0,0, +-1,1,-4,9,-36,-85,36,64,47,39,30,14,-3,-18,-19,-25,-19,-17,-6,2,9,16,20,25,9, +-4,1,0,0,0,0,0,0,0,0,0,0,2,-2,7,24,24,7,-2,-6,-10,-14,-11,-16,-18, +-20,-19,-18,-14,-3,3,6,13,16,20,15,2,0,0,0,0,0,0,0,0,0,0,-1,0,-2, +-2,5,10,9,7,4,1,-1,-4,-8,-12,-16,-17,-18,-20,-17,-15,-13,-12,-12,-10,-9,-4,1,1, +1,0,0,0,1,1,1,0,1,2,2,4,-13,-10,-10,-10,-10,-9,-9,-9,-8,-7,-6,-6,-6, +-6,-4,-3,-2,0,1,3,3,-3,-4,-2,-1,0,0,0,0,0,0,-1,-1,-5,-8,-9,-7,-6, +-7,-6,-6,-6,-6,-6,-7,-7,-7,-7,-7,-7,-6,-6,-5,-5,-4,-4,-3,-2,-2,-5,-5,-6,-6, +-7,-7,-8,-8,-9,-9,-8,-8,-7,-6,-7,-7,-7,-6,-5,-6,-6,-5,-3,-6,-7,-10,-6,-6,-7, +-7,-7,-9,-8,-7,-6,-6,-6,-10,-7,-6,-5,-6,-5,-4,-4,-4,-2,-5,-7,-9,-7,-7,-8,-5, +-5,-6,-6,-4,2,-6,-10,-16,-7,-6,-10,-11,-14,-17,-14,-11,-8,-5,-4,-3,0,1,2,1,1, +1,1,1,1,1,0,-3,-5,-5,-11,-3,-2,-3,-3,-3,13,-4,-10,-24,-8,-4,-8,-10,-14,-20, +-14,-10,-7,-2,1,1,1,0,0,0,0,0,0,0,0,0,0,2,0,-1,-15,-4,-4,-7,-9, +0,21,-4,-21,-40,-12,-4,-16,-24,-34,-44,-32,-21,-11,-2,1,-1,0,0,0,0,0,0,0,0, +0,0,0,-1,1,1,5,-4,2,28,22,15,-8,23,30,14,5,3,15,40,49,41,31,18,10, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,10,16,28,29,16,1,-18,-5, +4,13,29,20,-9,-34,-49,-47,-37,-24,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,2,22,11,-7,-33,-26,-3,20,29,20,-8,-31,-25,3,36,52,47,36,23,7,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,-2,2,-55,-36,-15,41,16,-7,-28,-36,-11,45,35, +21,-6,-12,-17,-21,-19,-16,-15,-2,1,-1,0,0,0,0,0,0,0,0,0,0,0,-1,2,-9, +-49,40,60,54,44,33,18,3,-10,-12,-19,-16,-14,-6,-1,3,10,12,17,1,-2,1,0,0,0, +0,0,0,0,0,0,0,1,-1,4,10,13,-3,-11,-13,-14,-15,-11,-12,-11,-12,-11,-10,-7,0, +5,7,12,12,16,7,-1,0,0,0,0,0,0,0,0,0,0,0,-1,1,-3,6,12,10,10, +6,3,1,-2,-6,-9,-13,-13,-13,-15,-13,-12,-10,-10,-9,-9,-6,0,1,0,0,0,0,0,0, +0,0,0,0,0,1,1,-7,-7,-7,-8,-8,-8,-8,-8,-7,-7,-7,-7,-7,-8,-7,-6,-5,-4, +-3,-2,-2,-4,-2,0,1,1,1,1,1,1,1,2,1,0,-3,-3,-6,-5,-6,-6,-6,-6,-6, +-6,-7,-7,-7,-7,-7,-7,-7,-7,-6,-6,-6,-5,-5,-5,-5,-6,-5,-5,-5,-5,-5,-5,-6,-6, +-6,-6,-8,-7,-7,-5,-5,-5,-4,-4,-4,-4,-4,-3,-4,-5,-6,-5,-4,-5,-5,-5,-6,-5,-5, +-4,-4,-4,-6,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-6,-5,-5,-6,-4,-4,-4,-4,-4,0, +-5,-7,-10,-6,-5,-6,-7,-8,-11,-9,-7,-5,-3,1,1,1,0,0,0,0,0,0,0,0,0, +1,1,0,0,-9,-2,-2,-1,-3,-3,5,-4,-7,-14,-7,-4,-6,-6,-8,-12,-9,-6,-4,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,-1,1,2,-10,-3,-2,-1,-5,-2,9,-5,-15,-24, +-10,-5,-10,-12,-18,-26,-20,-13,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1, +0,2,-4,-2,10,9,6,-10,12,17,7,2,-1,6,18,25,26,21,14,8,-1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,-1,-2,6,10,16,18,13,5,-10,-4,2,7,19,15,-1, +-17,-28,-30,-25,-18,-7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,7,4, +-5,-18,-21,-9,9,13,10,-2,-19,-19,-4,15,27,28,22,15,5,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,-22,-23,-10,24,10,-2,-12,-23,-11,21,24,18,1,-4,-9,-11, +-10,-9,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-2,1,-13,29,41,42,34, +26,16,5,-4,-7,-12,-11,-10,-5,-2,0,4,6,8,-1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,4,-8,-13,-13,-14,-13,-10,-8,-6,-6,-5,-5,-2,1,4,5,8,7,9, +1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,2,11,8,8,5,3,1,-1,-4, +-6,-8,-8,-8,-8,-8,-7,-6,-6,-5,-6,-1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,-2,-4,-4,-5,-5,-5,-6,-6,-6,-5,-5,-6,-6,-6,-6,-6,-5,-5,-4,-4,-4,0,1, +1,0,1,1,1,1,1,1,1,0,1,1,1,-5,-4,-4,-4,-4,-4,-5,-5,-5,-5,-5,-6, +-6,-6,-6,-5,-5,-5,-5,-5,-5,-5,-5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-5,-5,-6, +-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-2,0, +0,1,1,0,0,0,0,0,0,0,-2,-2,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-2,-1,-1, +-1,-1,-1,-2,-2,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,-2, +0,0,0,-1,-1,1,-1,-1,-2,-1,-1,-1,-1,-1,-2,-1,-1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,-2,-1,0,0,-1,-1,2,-1,-3,-4,-2,-1,-1,-1,-3, +-4,-4,-2,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +2,2,-1,4,5,2,1,0,1,3,5,7,5,5,2,-1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,-1,1,3,3,4,3,2,-2,-1,0,1,4,3,0,-3,-5,-6,-5,-4, +-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-3,-4,-2,3, +3,3,1,-3,-4,-1,3,5,6,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,-3,-5,-2,6,3,1,-2,-5,-3,4,6,5,1,0,-1,-1,-2,-1,-1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,10,11,9,7,5,2,0,-1, +-2,-2,-2,-1,-1,0,1,1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,-2,-3,-3,-3,-3,-2,-2,-1,-1,-1,-1,0,1,1,2,2,2,2,-1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,-1,3,2,2,2,1,1,0,-1,-1,-2,-2,-2,-2, +-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-2,-2,-1,-1,-1,-1,-1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-2,-1,-2,1,0,1,1,1,1,1,1,1,0,1,-1,-1,-1, }; -const UWord32 defaultHRIR_rom_ER48_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { -0x047ee4d8,0x03f280b8,0x05386b98,0x0472fda0,0x0546eb40,0x076f6d78,0x04382528,0x0488aa00,0x06bd5348,0x0704d428,0x06d60568,0x05f157b8,0x06d09290,0x06f92248,0x06cc8e98,0x0466c600,0x03db67c4,0x07924390,0x048ebf48,0x03f41dd8,0x04657680,0x036a1ca0,0x03cfde2c,0x03e0ba68,0x03f52760, -0x0409ea10,0x0421a660,0x0435ba10,0x04558680,0x047a5fa8,0x04b01dc0,0x04dde948,0x0526fc60,0x0509efe8,0x04e6aa20,0x04840c20,0x047d6488,0x05ed4498,0x05ff8e50,0x068475b0,0x03d7760c,0x03201db0,0x02a62e40,0x02995154,0x02374fd0,0x029927f8,0x02a77ff0,0x028bc644,0x02ad3d58,0x024cb2e0, -0x0250460c,0x02047db0,0x0211f2bc,0x02acc4b0,0x02629f04,0x03f5ad90,0x03cb3008,0x03e67e74,0x044851e0,0x04a7fb88,0x04db7d40,0x051ab720,0x055faf70,0x0596e218,0x06042ac8,0x06a71b70,0x0790f2e0,0x0872dea0,0x09677860,0x0950aa80,0x08a8a570,0x073c5fd0,0x06cf9508,0x08c03920,0x061f64b0, -0x04bd3218,0x03613b94,0x028ce510,0x01d9e6e6,0x0183adbe,0x0148dec2,0x01406468,0x010020e2,0x0170bc02,0x013f19d8,0x01204b92,0x01122334,0x012d3c76,0x0137b028,0x0171e928,0x0188302e,0x022b99d4,0x02668e14,0x03cc7b80,0x040ed358,0x051b4aa0,0x058a64c0,0x0632f030,0x06f854e8,0x079df708, -0x08bb3ec0,0x0a364c00,0x0c194380,0x0df3e010,0x10141dc0,0x0f6fd7b0,0x0df37fb0,0x0af6e3c0,0x09873b30,0x0d1b86e0,0x073af448,0x05695aa0,0x02e74d18,0x01edbf9e,0x0156b896,0x00d4a4b0,0x00830473,0x00636bf6,0x00633027,0x00849c4b,0x007311b6,0x00688dda,0x005fdbfe,0x006bd09e,0x008ca67b, -0x00c97bcf,0x00e5b1df,0x01604b48,0x01be29e6,0x036304e0,0x03ff2e30,0x055b8690,0x05c727e0,0x06a36298,0x078a9d48,0x08310840,0x09c91de0,0x0ccc12f0,0x11672460,0x161d6a00,0x1b56a000,0x1aeb9640,0x1707dc00,0x11aa67e0,0x0df87900,0x1d1d6220,0x11667ec0,0x0ce28710,0x05efc370,0x03a9df90, -0x028305f4,0x01cffa94,0x0127b864,0x00bce37f,0x008d3a24,0x008bafb0,0x00882a4d,0x008337ce,0x006c1535,0x00767a34,0x009889b4,0x00dbb356,0x0150c436,0x022975e8,0x02f4e404,0x05947408,0x073a4200,0x0c0ae070,0x0fa8f2b0,0x1498fc20,0x19d5b200,0x1db068c0,0x207bf300,0x214f34c0,0x2106d700, -0x1fa7a260,0x1f394220,0x1d45c780,0x1c7d0160,0x1dfc11c0,0x1acf0620,0x2b8322c0,0x0dc91d00,0x0cadfcb0,0x056dbb38,0x042d8138,0x0256d654,0x016c6290,0x0131be08,0x00d4401d,0x00c230d7,0x00cc882f,0x00a65086,0x00914869,0x007c7e15,0x0091032f,0x00babdd2,0x015746a4,0x01d2ebac,0x03187b6c, -0x0381e590,0x06d4d4a8,0x08a4d2e0,0x0e1a1c00,0x116a0bc0,0x1739b820,0x1dfddd20,0x204e1540,0x21a5c280,0x223e0a40,0x22421b00,0x234d4d00,0x25869840,0x245e9d80,0x23da8840,0x2bc98580,0x2a926240,0x4446f880,0x1b70e180,0x13adfa80,0x065b9490,0x07306290,0x030dc0a0,0x02778dcc,0x013a7c14, -0x00e854e6,0x00eedb3c,0x01a81d84,0x01025efc,0x00e48a50,0x011a56cc,0x00f12947,0x01568176,0x020f4458,0x022c4848,0x032c4480,0x038e37d8,0x06fb3930,0x089c5830,0x0de9cf30,0x139f2b60,0x1b816c80,0x233b5100,0x265bf400,0x266a0880,0x2531b700,0x212f1700,0x20b54b80,0x27421200,0x2abab980, -0x319c53c0,0x4ef60b80,0x3bc00480,0x4e432200,0x214d7480,0x13fffa40,0x07052408,0x03f7fd08,0x02818dac,0x016f39c2,0x01392b46,0x00fca113,0x011ed3b8,0x028e0018,0x00ff39be,0x00cfbdfb,0x01040e88,0x0125191a,0x016e8670,0x02210da4,0x0269f0f0,0x0387e120,0x03bca2c0,0x06471b60,0x072a9b40, -0x0a3ffc30,0x0e707f20,0x13e7a960,0x19f91d00,0x1f414c20,0x22eaf940,0x2633c280,0x26b80800,0x24144440,0x20cf85c0,0x24933140,0x2e1e2c00,0x50825600,0x3be07000,0x2c4d19c0,0x1c18b7e0,0x13752260,0x08441920,0x04d9b360,0x031df4e0,0x01fe4556,0x01de7284,0x016c698a,0x014ac6a0,0x01b6abd0, -0x0122aff0,0x010baf30,0x011ecc38,0x01610dba,0x01c7cfa0,0x021d9db8,0x02abaa48,0x0471d780,0x04f829e0,0x06561930,0x06b65288,0x07f63bc0,0x09e961a0,0x0d843360,0x12b78800,0x17a3ac20,0x1b4affe0,0x1e608c60,0x1a5954e0,0x19811f40,0x1b5fdbc0,0x1baf31c0,0x1e12e540,0x26d10140,0x26c37e00, -0x11603060,0x0ed10140,0x0b193f10,0x06065dc8,0x03e96e30,0x033a0a1c,0x021f5510,0x01ac12a8,0x019686cc,0x0195b22e,0x018a4270,0x016d147c,0x015363a4,0x015954e4,0x019d60e8,0x0237c7b4,0x0312491c,0x035b6e10,0x044d1e80,0x04ce8658,0x06211b90,0x060e5f48,0x06bad678,0x088afa40,0x0a2da5c0, -0x0b1fdda0,0x0c3aeb30,0x0dd64990,0x0fd1a650,0x10cb2040,0x112b9f80,0x12074500,0x1202e020,0x11c97500,0x11043b40,0x10c1fda0,0x0b1853d0,0x08ea3960,0x07751e50,0x061f3718,0x05015df8,0x03aa4c5c,0x02f34054,0x02283fa0,0x028a10d8,0x01f66c10,0x02acbb58,0x024c7950,0x027b1984,0x0248cc6c, -0x02c0e30c,0x02d8ab8c,0x037898ac,0x03d15a1c,0x04b73198,0x0523a8f8,0x06458040,0x061fb090,0x06c79fb8,0x078ca200,0x087f20a0,0x097a5df0,0x0a7fb090,0x0bb86eb0,0x0d55bb90,0x0da69170,0x0e3088f0,0x0f2a3ce0,0x0e83a4d0,0x0e36ae40,0x0e6bcdc0,0x0c1cc900,0x085afeb0,0x08f3c7c0,0x09f0b3f0, -0x068fbea0,0x05feee30,0x056c0e90,0x051f0618,0x047dda10,0x052b5098,0x055eb738,0x04de71c0,0x055c0698,0x04d6f468,0x04d04810,0x045f1958,0x04a83120,0x0531d350,0x04d79588,0x06db6b60,0x0675ab80,0x0659df58,0x06c40b60,0x07197510,0x07774418,0x07f51688,0x086925b0,0x08d41c20,0x093f5360, -0x09c31970,0x0a40c6a0,0x0ac29b30,0x0b881f30,0x0aa187c0,0x09eb4c70,0x095f4620,0x08e38b10,0x0741ae98,0x08d01300,0x0809d1a0,0x08ea2c20,0x0c014ed0,0x07d64368,0x08187ec0,0x0b0834f0,0x0ba07ea0,0x0b786320,0x0a3fb370,0x0b821d30,0x0bff4b40,0x0baaff20,0x07f17cd0,0x0732b9b0,0x0c9eee70, -0x084f1da0,0x07599348,0x07cc81b0,0x068af938,0x07028588,0x070cb410,0x072a1490,0x073e8f48,0x07509498,0x07754088,0x079b4ac0,0x07c5d9d0,0x07fc2df0,0x082f19f0,0x088e5aa0,0x083f2300,0x081cd6f0,0x07de1c78,0x07df0d58,0x094475d0,0x0006fc5c,0x0004cdf3,0x000a6bab,0x0008df72,0x000c4172, -0x0015ae88,0x000998e6,0x0009ded0,0x00126090,0x00140bf0,0x0013f6ff,0x00113dbf,0x0014c5c2,0x00151d77,0x0014a6b9,0x000a35c4,0x00090fb9,0x0017fca1,0x000aa8b6,0x0008eb5d,0x000a33d6,0x0005a2e9,0x00073986,0x00074f9a,0x0007686b,0x00075eba,0x00073852,0x0006edb2,0x0006f518,0x00072271, -0x0007c70b,0x000826f9,0x00084487,0x00087936,0x0007a5c6,0x0004fa24,0x00060d37,0x00056017,0x00096a5d,0x000c20b7,0x00066283,0x0005340c,0x0002435f,0x0002e37e,0x00024f8b,0x000466f9,0x00057626,0x000550a6,0x0005df22,0x0003d202,0x0003bbd1,0x00020a50,0x00023392,0x00058679,0x0003fe1c, -0x0009c836,0x00092b20,0x000963b3,0x000ae749,0x000c6ad7,0x000cc120,0x000c57d4,0x000b680a,0x000a567a,0x000a56df,0x000b55ba,0x000cf402,0x000e3aaa,0x000dd549,0x000ee6a0,0x000b67ec,0x00040a54,0x00058b3a,0x000692eb,0x00071509,0x0006654b,0x00040d30,0x0005f62c,0x0001c594,0x0001713a, -0x00019c26,0x000259f9,0x0002821e,0x00047590,0x0003f3c3,0x0002916c,0x0001e026,0x00022e9e,0x0002fef5,0x0004740f,0x0004f5a8,0x0006c200,0x0006be25,0x000dcf1d,0x000d878d,0x0011f120,0x00129bc9,0x00128251,0x001235e8,0x000ff9d5,0x0010ae81,0x001320d0,0x0015f944,0x001997eb,0x0018dc99, -0x001bfe71,0x00127db7,0x000335f4,0x0005f4fe,0x00060431,0x00052bf4,0x0006bf9c,0x0007c1af,0x000c6f08,0x00025537,0x000289ce,0x00019ee0,0x0003359e,0x00043e30,0x0006390a,0x0004a051,0x00030b77,0x0001e23f,0x000275a8,0x0004c5aa,0x00085975,0x000801dc,0x0008ea00,0x0008c2ab,0x00130ff5, -0x0016a43c,0x0021b090,0x0023ecdc,0x0023ae2b,0x0020c581,0x001d035d,0x001ca04e,0x00206c8e,0x0023b27f,0x002862dc,0x0027087b,0x002c7d54,0x0018c0fd,0x00027cfb,0x0002ddca,0x00215ec5,0x000ea3ca,0x001bf85d,0x0012191c,0x000ab848,0x00047b32,0x00081d49,0x00065b68,0x0006525b,0x0004bc73, -0x0005d0ee,0x000165e9,0x00011e15,0x00027c73,0x000306dd,0x0004599b,0x0007a262,0x0008cf16,0x0008e1ab,0x00083ed5,0x00144ef8,0x000a1f3d,0x000d7e1f,0x0004c07a,0x0004ecc1,0x00097a02,0x00128133,0x00195773,0x001e7c4a,0x001c7dab,0x00247694,0x002c7935,0x0029712f,0x00285903,0x002c1b44, -0x001ce160,0x000ea590,0x0026bb6d,0x00204264,0x001721cd,0x000bebc8,0x000694c1,0x0006ad53,0x0003ab34,0x00010c5c,0x0000cfca,0x00029adc,0x000293c3,0x000222f5,0x00015a98,0x0002103d,0x0002ab43,0x00025ae0,0x0001c131,0x00031800,0x000395df,0x000c4cb7,0x00127d37,0x002480f2,0x0012fed7, -0x0009096d,0x0003dfa7,0x000371c0,0x000359ad,0x0004cda1,0x00052e34,0x00052718,0x000b6cca,0x0011793c,0x0017f484,0x0016dd83,0x00073869,0x000bee64,0x000fd96c,0x000c252c,0x000813a2,0x0006cb0f,0x0004eb07,0x00032e93,0x0002669a,0x0001ecc0,0x0001171b,0x00003986,0x000045db,0x00008e63, -0x0000a7e1,0x0000a7ad,0x00017a5f,0x0001749c,0x000166b0,0x0002eeda,0x0005b49f,0x0004e290,0x00028908,0x0002061c,0x000bd1f6,0x001fc1bb,0x00308e00,0x00351377,0x002820b8,0x0014a68a,0x0022e43b,0x003c59c6,0x006a145a,0x007896f4,0x006c56b6,0x0050f000,0x0013535c,0x004e8c3b,0x0022f822, -0x001cd8d4,0x001760d6,0x000d49f2,0x0006708f,0x0002fcee,0x00033b30,0x0001227b,0x0000d57f,0x00009cda,0x000061fe,0x0000520c,0x0000a576,0x0000e2b6,0x0001696b,0x000176e2,0x0001ac52,0x000236fd,0x0002c8d3,0x0006274b,0x0009c753,0x000c7989,0x000b4a13,0x0007cdfe,0x00047c69,0x00074820, -0x0008c411,0x000b7205,0x000adfb5,0x000acc83,0x000fe2ab,0x00374325,0x0069300d,0x00a70f35,0x00678631,0x00880f67,0x0059cc5a,0x003f01d5,0x002a3422,0x0020ff73,0x0020d890,0x0015bfaf,0x0007f05c,0x00049d34,0x000257d3,0x0001295a,0x0000b08a,0x00008df0,0x00010f92,0x00008a33,0x00008cc4, -0x000113ed,0x0000e78d,0x0001dc8f,0x00019f95,0x00016341,0x000137fb,0x00015756,0x00019749,0x00037b6f,0x000a88e9,0x000cf2a6,0x0011ed30,0x001d2f37,0x0016e348,0x001cadbd,0x002ddab6,0x00440aee,0x004c7725,0x0057009e,0x006cac55,0x0029f7bc,0x0029f500,0x002782e0,0x001f243e,0x001a46fc, -0x0015f6e6,0x0014a832,0x00166e16,0x0012779f,0x000e1072,0x000948f0,0x00074bb7,0x00052f37,0x0003b139,0x0001e236,0x00012578,0x00015c61,0x00010365,0x00011ebf,0x0000f042,0x00031e19,0x00059954,0x0006c72c,0x00090a69,0x0009c4d9,0x0008f0de,0x000b39b6,0x000b6be5,0x000b1041,0x000b7958, -0x000f5cde,0x0022cc9f,0x00201562,0x00205d19,0x001f24d1,0x00208df1,0x00172f0f,0x00160126,0x0015158b,0x00144910,0x001475b5,0x0011e713,0x000ff453,0x000eb2b6,0x000cb9b4,0x000b2ab5,0x000ae53e,0x000800dc,0x00067629,0x00050f4d,0x0003415f,0x000202cd,0x0001899c,0x00010d2f,0x0002239d, -0x0002a1af,0x00038824,0x0003eb8e,0x000568f2,0x00064212,0x0007795d,0x00093468,0x000ba87c,0x000f832a,0x001464dd,0x00176eb1,0x001d1c8b,0x0026e19d,0x001f7c48,0x001ca7c7,0x001e800f,0x00189972,0x000d789b,0x000e93d7,0x000f9253,0x000ce4c0,0x000ca10d,0x000c571a,0x000c4a34,0x000c2903, -0x000b5191,0x000a7ef9,0x00096c8e,0x0008e892,0x00077ad9,0x0006bc00,0x00050da1,0x0003c686,0x00044bde,0x00032069,0x00030690,0x0002a0d8,0x0003260a,0x0004018b,0x0004e9af,0x0005fe64,0x000733af,0x0008a69c,0x00093842,0x000a5776,0x000b9df8,0x000d3972,0x000ef00d,0x001260a1,0x001046ba, -0x000f05d7,0x000e07fd,0x000da1ab,0x000b1b7a,0x000c1282,0x000ca182,0x000d7248,0x00102af5,0x000c882e,0x000cc057,0x000f6932,0x000fa807,0x000fa8d7,0x000e9a47,0x000fdb56,0x0010833a,0x001063ee,0x000af0e0,0x0009a5be,0x000e4c8b,0x0009a16c,0x0008404f,0x0006d177,0x0006fdad,0x00077d15, -0x0007e6ea,0x0008520e,0x0008c223,0x00093b1b,0x0009cf5e,0x000a7061,0x000b35c7,0x000bd2c2,0x000c8074,0x000da73a,0x000cae2b,0x000c49b8,0x000bbe59,0x000bb188,0x000dc1ce,0x000049ba,0x00003457,0x000077fe,0x00006851,0x0000aa97,0x0000f908,0x00006154,0x000084f8,0x0000dc1f,0x0000f060, -0x0000edba,0x0000c79c,0x0000f20f,0x0000f67a,0x0000eb79,0x00008fa3,0x000064b4,0x0001118f,0x0000910d,0x00006543,0x00006caf,0x00003863,0x00004bd7,0x000052e3,0x0000592b,0x00005aac,0x0000587f,0x00005095,0x00005035,0x0000560c,0x000057ac,0x0000577c,0x00005257,0x00005479,0x00004e27, -0x00003cd0,0x00004259,0x00004f7f,0x000067dc,0x0000a0e7,0x00003aff,0x00004112,0x0000173a,0x00001d90,0x000029ed,0x000036c6,0x0000425d,0x00004758,0x00003fde,0x00002d9c,0x000027ba,0x00002ba7,0x00002b14,0x000035b6,0x00001f6a,0x00007f24,0x00005b9b,0x000066e6,0x00008474,0x0000bdb6, -0x0000ed7b,0x0000f56e,0x0000d1a6,0x00009477,0x00007e1f,0x00009ba4,0x0000964d,0x000099fa,0x00008862,0x00009d5f,0x00008c1d,0x0000653c,0x0000596f,0x00006a92,0x0000531e,0x0000454c,0x0000221c,0x000058c2,0x00000fb7,0x00001d17,0x0000705d,0x0000a196,0x0000df70,0x0000f637,0x00006afc, -0x000036fe,0x0000463b,0x00003f21,0x00004e4a,0x0000219e,0x0000199f,0x00003afc,0x000045b8,0x00008f99,0x00009ee1,0x00011ed6,0x00017e1b,0x00019676,0x00017a31,0x0000f85a,0x0000e9a5,0x00014643,0x00012329,0x00012718,0x00010dec,0x0001413e,0x00010aec,0x0000a8cd,0x00007e00,0x0000e1a6, -0x00003de2,0x00004e14,0x00005999,0x00010426,0x000039b6,0x00009d90,0x00010b13,0x0001354f,0x00015b5f,0x0000a342,0x000047b1,0x000042a6,0x00004be5,0x00006713,0x00009f82,0x000074b1,0x00003f3e,0x00009c9a,0x0000f1ae,0x0001616b,0x0001d839,0x00038766,0x0004fce3,0x0005804d,0x000462e6, -0x00021776,0x00013774,0x00024411,0x0001a77c,0x0001c334,0x0001b7b5,0x00027e49,0x000247db,0x00021d47,0x00012d3e,0x000553e0,0x00025c7b,0x0002c392,0x000191f4,0x0000d352,0x00012be2,0x00014ded,0x00017dc9,0x00008c34,0x00000d45,0x00000a1d,0x000058b5,0x0000421c,0x000048a1,0x0000417d, -0x00009a31,0x00012f36,0x00019486,0x00026554,0x00031e02,0x0004034e,0x00030a6b,0x00032e45,0x0002b539,0x0003700d,0x00042dd3,0x0002ff41,0x0003e7b3,0x000474fc,0x0002dd1b,0x0001f7a9,0x0002d1c6,0x0001f6b8,0x00024aae,0x00042007,0x0004c2f4,0x0001b0b3,0x00016297,0x00033926,0x00018125, -0x0001e3b1,0x0003afc9,0x0003d5b5,0x000102ed,0x00003ccc,0x0000093f,0x000018d0,0x00003a41,0x00002c90,0x000025fb,0x000009d3,0x0000171e,0x00001ea4,0x000028af,0x00005e4a,0x0000d21d,0x00010a39,0x0001ad21,0x00028121,0x00023132,0x00020642,0x00036b22,0x00038916,0x0002d636,0x0003fc3c, -0x0000dbe7,0x0000c90e,0x00014868,0x00049544,0x00044c59,0x00032dc5,0x00018022,0x00066a0a,0x001c43eb,0x000fae6e,0x0006dee7,0x00014e8c,0x00004a2e,0x0000428b,0x00004b93,0x00002b59,0x00000e7d,0x0000039d,0x000009a2,0x000001ad,0x000021c6,0x00001b7a,0x00002d80,0x000030de,0x00001b35, -0x00002dbf,0x00004e8e,0x000069ce,0x00008471,0x0000dc63,0x0001ab1e,0x0002ab35,0x0003f667,0x0003ccc3,0x0002bd39,0x0003d78d,0x00058a0a,0x00068575,0x0008eb6a,0x00084e13,0x000755ae,0x000798e1,0x0001dc28,0x00061e0b,0x000eb071,0x00071351,0x000612bd,0x00030e07,0x0000584d,0x00003e4b, -0x00002be8,0x00000252,0x000000fd,0x0000050d,0x000003e7,0x000001ae,0x000004b6,0x00000180,0x00000f07,0x00004591,0x00005d1a,0x000082ad,0x00008843,0x0000a743,0x0000b6cc,0x0000f70c,0x0000f243,0x0000f4da,0x0000ecd6,0x0000cbd5,0x00008ca4,0x00012afd,0x0001bb6c,0x00017a65,0x0002ec63, -0x0003e853,0x0006a18d,0x000926ab,0x00049eac,0x00049cef,0x0003d1cb,0x0004115f,0x0002767e,0x00008e96,0x00001b24,0x00000922,0x00001fdf,0x000013e7,0x000012de,0x00000d38,0x00000a5b,0x000005e4,0x0000042e,0x00001695,0x00004697,0x0000ac28,0x0000e3e4,0x00011ac1,0x0000f99f,0x0000b642, -0x00006be6,0x000030e4,0x00001ede,0x000069fe,0x00013865,0x0001a10f,0x0002514f,0x00031b14,0x0002b02c,0x0002804e,0x000280af,0x0002f2b6,0x0002c686,0x00031543,0x00042ca9,0x0001cefb,0x00018b0c,0x00013f2b,0x0000f279,0x0000cc50,0x0000b3a3,0x0000893e,0x00006729,0x00006941,0x00005c03, -0x00004036,0x00002f0e,0x00001963,0x00002322,0x000026d9,0x000029c4,0x00002be6,0x00003cc1,0x000049a9,0x0000419f,0x00002a15,0x000027f3,0x000028f8,0x00004cfa,0x00008cc5,0x0000ceaf,0x00012043,0x00014b37,0x00016aa2,0x0001460a,0x00015c4c,0x00020839,0x00019119,0x000160be,0x0001794a, -0x0001919c,0x0000c759,0x0000d27d,0x0000da08,0x0000d2b1,0x0000f881,0x0000d42b,0x0000b165,0x0000aa8e,0x00008b49,0x00007c53,0x00007e89,0x000065e0,0x00006438,0x00007236,0x000053dd,0x00004ffe,0x00006738,0x00005623,0x000051a3,0x00004637,0x0000402d,0x000033d4,0x0000362a,0x00002cb4, -0x00002b1f,0x0000307f,0x000029dd,0x00003c8c,0x00006ab5,0x00007265,0x00007951,0x000092a7,0x0000724c,0x00006be1,0x0000808a,0x00009c50,0x000083eb,0x000098ab,0x0000aea8,0x000089af,0x00009709,0x000098f8,0x0000abe2,0x0000bf71,0x0000b21a,0x0000a7c7,0x0000a5db,0x00009e90,0x00009762, -0x0000a003,0x000086bc,0x00007153,0x00006d70,0x0000608f,0x0000634e,0x0000638a,0x000056ba,0x00004cad,0x00004436,0x00003d6e,0x000038b8,0x00003795,0x000039c6,0x0000432a,0x00004dc6,0x00005828,0x000065b6,0x00007d59,0x00006b47,0x000069b6,0x00006ec7,0x00007b81,0x00004eba,0x00005951, -0x0000654d,0x00007d87,0x00009920,0x000067b9,0x00007d2a,0x0000a4b4,0x0000aad5,0x0000b032,0x0000a656,0x0000bb83,0x0000c5fe,0x0000ca75,0x00008ba1,0x000070cc,0x0000ad9f,0x00007f4d,0x00006826,0x00006217,0x00005680,0x0000552a,0x00005176,0x00004f63,0x00004d5c,0x000049e2,0x00004a38, -0x0000497d,0x00004a60,0x00004bf4,0x00004f03,0x00005602,0x0000510f,0x00004fbb,0x00004f07,0x00004f16,0x00007035 +const Word16 defaultHRIR_rom_AlphaR32_fx[470 * 86] = { +4109,3824,4994,960,-958,-2630,2083,-646,-2577,-2692,-2592,-2122,-2566,-2655,-2563,-660,1551,-2794,-741,773,4530,3553,3803,3853,3872, +3907,3943,3978,4049,4138,4246,4339,4480,4412,4324,4094,4122,4780,4288,-1441,3195,995,1132,2042,1718,2727,1996,969,1815,2013, +1779,849,1408,1500,1861,-923,3407,3986,3908,4198,4212,4333,4424,4492,4666,4948,5311,5651,5981,5935,5652,5003,4796,5601,3974, +1031,1847,347,769,668,664,0,1279,-355,1614,-73,973,47,860,841,824,550,2249,3934,3672,4306,4326,4561,4764,4938, +5315,5849,6414,7063,7682,7540,6990,5789,5279,6196,3113,362,1721,907,577,749,466,436,186,583,53,77,367,233,547, +-276,815,-80,1755,3452,3529,4234,4242,4560,4849,5000,5520,6389,7419,8539,9650,9560,8600,6732,5621,8414,4662,1045,1316,395, +83,782,308,362,290,321,313,139,-61,130,488,159,949,220,1948,4098,4059,5462,5985,6616,6829,7937,8605,8687,10088, +10483,10307,9901,9158,8335,7497,8605,3299,-92,1727,1862,903,1276,367,446,-16,249,217,179,416,514,618,173,919,-38, +2202,4656,4802,6469,6758,7371,7836,7536,7580,7926,8947,9712,10238,10743,10416,9711,7969,12591,4452,-1531,1863,-767,1396,-613,640, +71,679,309,183,346,365,455,1045,281,1228,522,2075,5035,4849,6453,7967,9719,11297,11704,11304,10094,8723,9106,10726,12179, +13390,15739,12960,15496,6495,-79,3755,-183,1892,679,512,37,532,648,435,240,39,556,379,433,1503,-449,2439,4652,4567, +5858,6842,7935,8770,9639,10122,10308,10575,10507,10238,11164,11856,13860,13413,12863,8541,273,1481,2114,193,1497,1432,149,491,13, +410,583,475,460,265,874,1099,-500,2811,4466,3809,4348,4997,6254,7757,8709,9520,10187,9046,8582,9146,9002,9635,11438,11437, +8249,6092,-318,1198,251,121,968,477,963,707,1329,188,312,578,897,933,1404,1242,493,2458,4491,4103,4585,5228,5771, +5933,5955,5662,5380,5669,6380,7080,6990,6906,7000,6950,5801,3507,1252,2645,934,1189,760,657,-270,1197,-730,1795,-346,825, +-265,743,305,799,315,2463,3995,3041,3378,3531,3906,4109,4951,5657,6336,6484,6525,6632,6447,6157,6078,5192,4475,4160,-1893, +2810,649,926,2115,1812,3101,2346,1041,2072,2517,2216,1058,1719,1879,2041,-1077,3172,3439,3236,3387,3302,3332,3264,3780,4087, +4441,4714,5035,5363,5113,4861,4752,4401,4219,5430,851,-1142,-2872,2220,-971,-2995,-3197,-3144,-2548,-3113,-3290,-3159,-1008,1563,-3356, +-1132,597,5101,3965,4152,4147,4143,4154,4094,4224,4310,4403,4540,4656,4844,4712,4653,4572,4536,4970,7636,7214,6887,8390,8091, +5927,7861,7759,6144,6079,5934,5683,5657,5658,5515,7559,7686,5439,7595,7884,6501,6686,6846,6927,7009,7095,7184,7317,7427,7532, +7643,7769,7985,7901,7826,7651,7448,8298,8580,8263,7471,7290,6819,6621,6234,5998,6302,6343,6321,5922,6034,5807,5984,6559,6261, +6500,6911,6638,7113,7338,7569,7816,8111,8481,8821,9121,9420,9845,10466,10450,10219,9588,9090,8596,8617,8343,7115,6057,5473,4992, +4642,4190,3803,3948,3836,3478,3932,3783,4201,4708,4682,5529,5772,5952,6757,7332,7776,8285,8807,9513,10067,10678,11288,12136,13220, +13058,12664,11304,10138,9104,9106,7618,5925,4626,3940,3209,2243,1663,1248,1150,745,823,961,1128,1772,1832,2600,3267,4205,4854, +5721,6616,7237,7969,8735,9758,10769,11581,12484,14002,16095,16252,15509,13167,11182,11275,10245,10618,7573,5626,4653,3889,2938,2340,1733, +1710,1227,1068,950,1563,2154,2550,3513,4710,6027,8045,9862,11478,12414,13600,15146,15507,16218,16697,19435,19961,19068,17991,17139,16724, +14441,15313,12888,11529,9145,7989,5732,4353,3179,2333,1696,1636,1524,1454,1791,2090,2698,3952,4955,5900,7229,8592,9736,11036,12667, +14670,16901,18861,20253,20634,22364,22825,21684,20940,20005,19404,17985,15224,16540,13418,9547,8828,7016,4590,3622,2434,2753,3124,2110,2237, +2674,2995,4139,4887,5186,6331,6754,7300,8928,10557,10894,11881,13356,15613,18294,21050,21621,20508,18800,16793,15769,13723,15732,9936,14939, +15013,9332,7357,6119,4395,3521,2664,3127,5369,2939,2085,2760,3750,4074,5383,6358,6655,7148,6966,7962,9177,11495,13073,14159,15783, +16902,17558,19568,20567,21175,17576,14515,10397,12477,12369,13303,14558,10550,8093,6466,5654,5656,4230,4101,3720,3176,3205,3607,4357,4772, +5865,6493,7194,9447,9505,9779,8928,10011,11149,13009,14234,15713,17142,18551,19331,20236,18928,17906,15392,15675,14182,13613,13359,10971,8166, +7618,6456,5300,5050,4669,5267,3572,3586,4080,4987,6235,7611,7980,8573,10024,10772,10649,9564,10020,10896,12344,14017,15894,17695,18501, +18760,18494,18420,17849,16130,15872,14061,13393,11341,10492,8733,7706,6729,5556,5223,5906,5286,6822,4779,6333,5300,6865,7193,7961,8664, +9822,10465,10607,11095,11754,12203,12536,13392,14031,14695,15345,16028,16729,16356,16080,15680,14927,12507,12979,8919,11522,10141,9707,10113,9406, +10123,10369,9602,10349,9818,9792,8959,9486,10129,9625,7554,11275,11120,11496,11708,12002,12374,12731,13047,13312,13564,13734,13853,14134,13698, +13417,13125,12919,11660,12153,11942,10423,6301,12273,10405,6684,6585,6456,6527,6222,6277,6179,10277,11758,5629,10215,11468,11631,11152,11485, +11529,11615,11647,11696,11763,11844,11929,12044,12146,12298,12174,12110,11985,11990,12990,-810,-738,-1700,601,2751,6652,-470,2388,5969,6087, +6062,5921,6290,6414,6482,2470,91,7017,2770,975,-1265,-461,-791,-866,-874,-867,-816,-817,-854,-907,-1069,-1231,-1564,-1365,-1286, +-1090,-1110,-1276,-1297,4186,-453,1375,1565,489,805,-325,-8,1028,195,383,446,1822,1390,853,1169,3938,-330,-394,-638,-946, +-983,-964,-788,-718,-801,-1014,-1496,-2101,-3076,-2796,-2546,-1878,-1654,-1421,-375,1021,454,1861,1701,1603,1149,1686,813,2231,678, +2366,1122,2247,1571,1708,2229,2092,1054,-156,-400,-1125,-1168,-1093,-719,-588,-621,-1014,-1841,-3207,-5213,-4431,-3931,-2302,-1610,-1115, +982,2431,849,1266,1702,1377,1161,790,891,828,1208,1117,1064,1384,1433,2458,2032,2760,1766,585,34,-866,-879,-731,-36, +451,246,-269,-1693,-4205,-7898,-7179,-6083,-3257,-1564,-4774,-2971,-535,1058,1506,1404,414,859,502,606,955,1176,1401,1461,1496, +1546,2244,2434,3243,1666,-703,-1335,-3332,-3625,-3819,-3506,-3659,-3372,-1780,-6798,-7777,-7330,-6279,-5864,-5889,-4765,-10263,-974,3569,2174, +1367,2563,2029,2920,2027,1953,2021,1058,743,507,752,1111,1907,1916,3521,1549,-794,-1622,-4727,-6152,-7968,-9340,-8757,-7951,-6447, +-8359,-8821,-8691,-7421,-7376,-8853,-10072,-9866,-5528,2826,1146,2724,794,3498,2067,2310,1879,3717,2949,2826,2493,1984,1229,2890,2268, +2262,1396,-1495,-2936,-6060,-7308,-9168,-11076,-12503,-12695,-11298,-7197,-4525,-4174,-1021,-1430,-2877,-6806,-2305,-3691,-101,749,3704,1446,2652, +2306,2461,2650,5039,2141,1579,2634,2170,3112,3240,2196,3757,882,-989,-1679,-3622,-6104,-8036,-8924,-9966,-9454,-7665,-7020,-5310,-4414, +322,4330,9378,828,-1819,-4195,45,931,1478,2969,1945,1193,3194,2983,4806,3090,2724,3166,3253,4046,3219,3770,5728,830,-1496, +-1481,-1557,-2468,-4089,-6372,-7308,-8058,-8134,-6589,-4273,-3314,548,1161,1318,-1171,-2060,-1366,3514,2433,4002,3314,2510,2832,3152,3823, +2320,4314,3834,3479,3028,2906,2373,3111,4499,1193,-1129,-370,-678,-1304,-2254,-3132,-4078,-4459,-4061,-3870,-3306,-2015,-221,616,1394, +-364,-255,1622,5141,3096,5228,4483,4760,4425,5581,3180,5535,1861,5740,3336,5704,3810,4478,3911,4530,1726,42,1715,1628,1104, +437,99,-778,-1444,-2250,-2173,-2038,-1939,-1251,-231,1048,1138,613,280,10690,1852,5120,4782,2400,2699,523,1230,3200,1256,1056, +1183,3857,3165,2700,3335,9377,1504,1824,2245,2430,2767,2985,3266,2515,2068,1596,1333,994,603,716,671,531,678,-53,-2139, +3817,7608,13336,1090,6691,12334,12679,12603,11866,12693,12866,12717,6562,1980,13909,7206,3964,-1750,264,-55,85,241,399,706,480, +356,213,-39,-256,-511,-505,-527,-530,-578,-1008,1875,1879,2639,762,-556,-2054,1299,-362,-1789,-1860,-1784,-1513,-1722,-1772,-1794, +-321,986,-1945,-419,556,2189,1729,1822,1760,1681,1600,1537,1414,1375,1370,1461,1600,1828,1886,1906,1797,1985,2609,2545,-995, +2064,687,611,1140,1069,1648,1417,993,1378,1376,1168,703,908,1058,1143,-206,2033,2232,2184,2090,1941,1761,1583,1208,1050, +1055,1177,1438,1925,2124,2351,2199,2500,3860,3241,1904,2118,816,891,749,1042,595,1283,821,1632,768,978,788,1118,904, +997,1077,1823,2430,2219,1975,1594,1098,707,26,-260,-230,-14,883,2156,2524,2771,2335,3065,4448,2895,1902,3056,1804,1030, +1014,1216,1155,1154,1558,1093,1156,1083,1321,1287,1080,1444,1605,2356,2940,2970,2757,2397,1953,1455,328,-107,-333,-272,423, +1791,2208,2724,2645,3526,11630,9834,4870,4306,3324,3120,3493,2015,1469,1120,1111,1226,1037,747,799,1002,1358,1046,443,863, +1145,162,-793,-2608,-4460,-6114,-6435,-6968,-7976,-3916,-337,4329,6129,7600,7973,8528,16087,5574,-79,2288,2590,1648,1819,1407,1818, +1634,1874,1177,996,725,1276,1216,497,511,84,1977,2933,2933,3900,3842,3390,2032,-656,-2541,-3803,-2297,-429,4115,4122,7009, +11542,14241,14613,9574,1715,3770,615,2412,498,1497,1433,1695,2751,1630,1224,534,986,1475,644,2321,2447,3667,6164,6304,6954, +7103,7010,6685,6223,4958,2529,1396,2459,5509,4093,3577,3781,9529,3076,7634,5087,3875,1832,2861,2122,2576,1974,2140,2547,1517, +1491,1446,1449,1333,1261,1880,1360,3743,6164,6034,6310,5720,6030,6444,6393,5375,3319,1510,-222,-827,-1348,-2297,-5595,-319,-2360, +2754,3379,3203,2688,2554,1833,832,1043,1069,1210,1847,1709,731,291,81,378,-51,-1034,585,2839,4141,6686,6466,6614,6193, +5640,4392,2564,-596,-3255,-4609,-5961,-5524,-4913,-3715,-3300,-1614,-1185,-823,-324,-470,101,1163,354,38,-141,965,1335,988,747, +0,-894,-664,-1358,-847,817,1827,4711,5423,5625,4881,4166,2807,1013,-254,-1665,-3874,-5070,-5310,-5398,-4361,-3982,-3469,-2595,-1735, +-595,-83,1,451,255,297,-34,-113,70,-130,-99,-244,-473,-428,-921,-98,1080,1197,1712,2170,2980,3856,3297,2939,2723, +1168,-314,-1825,-2880,-4199,-5658,-4732,-3875,-4146,-3300,-3437,-3189,-3098,-2711,-2427,-2232,-2401,-2341,-2204,-1889,-1880,-1863,-2053,-2194,-2091, +-2046,-2799,-2965,-3234,-3398,-3685,-4080,-4350,-4515,-4685,-4814,-4948,-4958,-5049,-4733,-4358,-4110,-4011,-3495,-3490,-4200,-4228,-3073,-3809,-3981, +-3232,-3247,-3158,-3037,-3055,-3080,-2991,-3789,-3530,-2722,-3823,-3650,-2972,-3056,-3180,-3260,-3324,-3351,-3438,-3486,-3556,-3641,-3643,-3673,-3749, +-3658,-3635,-3538,-3583,-3688,2090,1999,1602,2431,2833,2807,2128,2481,2600,2591,2550,2487,2492,2469,2387,2407,2142,2427,2444,2244, +1686,1878,1923,2027,2081,2121,2131,2133,2098,2046,2002,1910,1765,1676,1743,2009,1940,1975,2066,3659,2098,2666,2331,2010,1928, +1704,1894,2192,2046,1981,1914,2062,2066,2131,2068,2445,1831,1836,2035,2276,2441,2531,2507,2541,2504,2351,2287,2074,1813,1427, +1423,1994,1990,1272,1863,3108,2633,3071,2309,2020,1707,1641,1484,2050,1723,1788,1516,1753,1782,1967,1852,2110,1705,1746,2222, +2701,3034,3192,3078,2975,2696,2403,2479,2087,1508,648,892,1955,1691,86,1960,3073,1520,2399,2040,1405,1010,741,827,1408, +1263,1280,1060,1347,1522,1474,1742,1914,1297,1396,1860,2435,2852,2949,2619,2493,2283,2051,2229,2191,1919,692,632,1366,938, +-3407,1558,6383,4392,4399,3554,2311,2808,2180,1725,1763,1421,1233,739,1350,1600,1588,1860,2202,2588,3289,4334,6023,6835,7388, +7254,6217,5415,4743,4090,707,-3815,-6044,-5745,-3245,-1056,-11690,805,6968,2392,1573,2219,1377,1411,1455,1672,1718,1698,1751,1356, +1444,1634,2247,2530,2898,2590,2148,2678,3614,4208,4971,5836,6499,6634,6224,4546,2104,-2280,-5397,-8990,-13578,-10878,-19886,-7056,3402, +-1435,3661,414,3259,1387,1867,1665,2719,1036,484,750,1635,2069,2536,2696,3548,2874,1863,2448,2438,2437,2254,1955,826,-96, +-392,-2961,-6316,-10916,-12221,-12497,-14639,-16221,-13922,-13259,-5093,-4723,530,-1116,603,21,1462,875,-4,1728,2379,1375,1794,1699,1699, +1582,2915,2839,2071,2278,1499,1873,533,-1829,-4121,-5688,-6043,-6867,-7559,-8640,-10316,-10812,-10047,-11415,-7788,-8887,-6460,-4540,-3651,-1593, +-1195,-144,613,750,179,1084,1228,967,1276,1358,1907,1797,2108,2449,2905,2559,445,-961,-2207,-2525,-3608,-3767,-3403,-1291,-548, +-1363,-3306,-5574,-7470,-7920,-4112,-4320,-2595,-1545,-662,-89,72,492,415,380,548,319,426,512,324,419,1186,811,1257,1871, +1314,949,-424,-809,-849,-271,-447,47,668,226,-287,-92,-1364,-2906,-4330,-4466,-1924,-2215,-2805,-2482,-2695,-1874,-1262,-620,-585, +-262,-206,25,-67,12,68,-124,-387,-467,76,-1346,-2661,-2792,-3291,-3414,-3872,-4314,-4385,-4501,-4580,-3973,-3442,-3002,-2672,-2302, +-2229,-2197,-346,-158,-2360,-6,-593,-459,49,165,464,196,-109,48,61,-8,-672,-844,-717,-995,-1954,-1181,-1090,-1161,-1324, +-1272,-1142,-1082,-1023,-910,-833,-816,-841,-814,-775,-760,-641,-530,-26,537,-1106,-1866,-3232,-221,-1368,-2543,-2638,-2563,-2486,-2555, +-2623,-2597,-1408,-537,-2997,-1763,-1291,-176,-481,-526,-553,-691,-862,-1032,-871,-755,-631,-525,-399,-276,-194,-110,-42,25,239, +556,-104,-277,644,1172,1959,590,1322,1765,1814,1839,1872,1963,1985,1951,1363,895,2096,1441,1114,363,546,509,565,605, +662,722,807,904,1030,994,889,731,467,201,-167,-188,-1151,-907,935,33,704,657,564,804,714,887,1190,1019,974, +925,1171,1036,1092,1075,1600,690,571,630,764,816,918,1074,1237,1476,1845,1990,1859,1356,749,-7,-917,-1109,-2952,-2128, +-1031,-778,214,359,531,738,1023,972,1542,1104,1443,965,1232,1094,1260,1438,1283,1003,645,705,984,1191,1558,2065,2557, +3235,3787,3648,2950,1809,629,-962,-2745,-2899,-3580,-2800,-1424,-820,-413,-73,23,492,637,887,1287,1323,1271,993,1152,1174, +1698,1392,1350,1226,877,883,1313,1449,1848,2466,3044,3785,4853,5405,4846,3222,1440,-824,-3342,-3520,-7497,-7794,-6515,-3366,-2201, +-1178,-702,32,335,855,1209,1414,1459,1089,1410,1489,1793,2067,2275,1642,643,763,1039,1785,3034,4714,6272,7032,7297,3145, +1311,-253,-1728,-4242,-7820,-8814,-1526,-7781,-8462,-4068,-2813,-1291,-124,699,921,1274,1773,1369,1211,836,1258,1380,1443,1693,1944, +1592,1901,2221,2063,2072,1653,1072,120,-1166,-2249,-4680,-6325,-7619,-3324,-688,1947,-1195,10799,-2406,-9079,-2836,-5200,-1726,-2033,11, +-23,535,1582,1403,1418,1393,1540,1402,1795,1297,1427,1440,996,547,-138,-1857,-2747,-2939,-3234,-3931,-4958,-6150,-6674,-5057,-1847, +1733,8454,8467,10492,7220,-1420,1620,-2237,553,-219,242,822,1367,408,1718,1415,632,578,802,933,675,1331,132,-882,-536, +-92,-417,-234,165,1425,1611,502,1342,1830,2856,3202,2648,2257,5718,5565,6362,1964,1945,1895,100,802,1312,82,315,668, +933,976,990,1188,1087,247,777,1864,327,-1075,-1210,-1533,316,1813,3002,4155,4654,4501,2281,1017,1276,1351,2337,3469,4193, +3587,3767,-99,286,-341,166,662,78,631,653,732,234,359,912,576,657,667,717,405,-269,-337,-773,-1363,-1112,-748, +-18,404,277,-96,-11,136,-327,79,1082,2868,2943,2314,1641,1324,1989,1513,1103,631,364,216,640,329,1019,132,631, +-217,57,-151,-468,-1294,-38,963,306,416,216,132,-146,451,980,1471,1350,1334,1435,1823,2035,2481,2189,2268,2397,757, +1657,1266,1375,1632,1579,1763,1844,1588,1851,1821,1909,1392,1667,1521,1496,-44,2282,2187,1957,1958,1755,1629,1429,1858,2007, +2201,2382,2592,2716,2598,2506,2444,2349,2108,2330,2184,1697,670,2219,1559,734,699,625,668,535,500,488,1490,2092,1, +1370,1881,2757,2288,2464,2455,2516,2595,2622,2572,2525,2490,2472,2432,2431,2355,2305,2231,2235,2455,-657,-218,-180,-424,-450, +-63,-493,-405,238,255,296,279,328,315,292,-336,-599,352,-341,-518,-661,-544,-623,-694,-713,-768,-847,-933,-1063,-1230, +-1323,-1304,-1228,-866,-571,-155,-161,761,149,-931,-129,-467,-270,-259,-47,-83,-68,-16,-128,-132,-245,-110,-250,-309,-306, +110,-543,-575,-674,-892,-922,-1048,-1241,-1367,-1716,-2263,-2787,-2835,-2405,-1460,-520,570,668,2652,848,84,594,-135,-22,134, +699,723,613,695,402,544,8,209,-39,-178,-81,25,-243,-575,-664,-1151,-1226,-1471,-1940,-2194,-2972,-3860,-4649,-4751,-3980, +-2104,-216,2027,2208,4621,1512,448,1355,649,-43,283,1096,1044,1115,1227,1217,987,522,699,452,967,500,928,171,-591, +-653,-1248,-1255,-1582,-1923,-2028,-2893,-4556,-6665,-7391,-6197,-3229,-259,3420,3773,6106,3972,909,213,1041,1527,1978,1223,1189,1044, +923,1028,1056,915,731,327,491,-386,-120,-336,-774,-965,-2470,-2874,-3813,-4830,-6855,-8135,-9472,-6992,-4574,-2441,245,2751,5989, +5879,1810,3173,1528,-58,43,-785,-735,-688,13,574,1248,1316,1294,857,991,803,925,309,668,-973,-2225,-2386,-3494,-4897, +-6478,-7993,-7986,-7803,-8385,-4150,-1124,2031,-1377,-2505,-2291,612,-10141,1280,5627,1290,3130,1401,1611,339,1219,954,425,1632,1636, +412,687,-284,-431,-1499,-1415,-2091,-2959,-1960,-1067,-67,440,395,1857,3278,4246,6645,8041,7976,2654,-2441,-11215,-9775,-9747,-6181, +1182,-2281,1028,-582,325,-17,1222,1255,657,1215,906,-470,-642,-749,-1286,-1262,-1177,-1693,-255,621,1075,2440,3967,5369,6391, +7834,9655,8112,6333,4351,1088,-537,-2696,-4614,-1723,-2767,241,-352,-628,782,618,671,1463,1459,1441,1171,1049,766,172,-329, +-411,-1155,-1831,-2040,-954,447,3176,3856,4473,4545,4790,4487,4001,4419,3654,1731,24,-1354,-2589,-1091,-1132,-1490,1812,1335,1748, +1485,712,622,295,550,977,1264,1314,1136,1525,1374,750,615,339,735,1044,1526,2810,2704,2556,2017,1534,1360,1291,659, +39,87,-6,-265,-1331,-663,-519,102,503,-226,255,292,647,702,1100,700,1145,767,1600,1565,2150,2487,3053,3301,3439, +3584,3264,3259,2932,2924,2997,3218,2511,1837,1175,1066,976,828,380,118,-142,-124,-117,-175,2063,467,1109,941,435,490, +118,323,686,445,388,458,1092,1135,1273,1412,2709,1553,1350,1528,1556,1568,1438,1385,945,729,459,243,-37,-267,-174, +-125,-145,-92,197,-246,753,1438,2416,339,1388,2309,2410,2419,2316,2457,2525,2477,1600,860,2884,1989,1522,331,641,552, +511,506,524,586,516,451,382,278,199,75,101,96,112,93,230,-433,-261,-447,-8,73,-139,-122,-95,-247,-226, +-253,-311,-297,-325,-389,-235,-267,-488,-336,-361,-534,-523,-535,-519,-534,-534,-497,-523,-522,-516,-499,-504,-537,-608,-583, +-430,-375,-309,-27,1170,244,502,257,113,-41,-33,40,22,32,-50,-136,-214,-319,-379,-480,-503,-707,-776,-756,-695, +-673,-625,-563,-683,-720,-700,-657,-721,-782,-1094,-1009,-560,-352,-832,180,1344,761,1211,716,554,263,460,362,389,288, +277,36,-43,-242,-524,-566,-713,-1030,-1180,-1190,-1093,-1210,-1306,-1267,-1612,-1682,-1637,-1376,-1101,-1005,-1625,-1686,-894,-661,-1405, +946,2725,1487,1895,1819,1277,806,795,794,957,997,702,167,282,-43,-292,-571,-680,-1281,-1370,-1248,-1096,-1130,-1101,-1149, +-1844,-2171,-2140,-1791,-1501,-1302,-2430,-1989,-757,-387,-8036,-5249,-1091,-1262,-1129,-796,-885,328,808,920,930,956,928,712,398, +-6,-112,-705,-1076,-1936,-2423,-2740,-3143,-3423,-4186,-5374,-4859,-4285,-2853,-1662,-1054,179,-2290,-4629,-7600,-7135,-7270,-5447,-2258,-1432, +-1101,-16,192,24,149,554,704,1289,1237,594,333,-117,-795,-1207,-2053,-1398,-1019,-719,732,2667,4867,6926,8003,9084,11046, +7761,5055,1985,1302,468,-1116,-5312,4993,-5812,-7428,-3225,-3191,-1648,-1022,-448,796,1090,-182,1128,642,-936,-1066,-1299,-2165,-1232, +-1519,86,2604,3495,5889,8351,9825,10151,9543,8617,7865,5629,3768,1662,3638,5555,11295,7100,8095,2338,-3295,570,-1253,-54,-154, +22,335,515,-698,883,1198,518,673,181,105,173,-574,1267,1925,1889,2620,1954,1790,2022,943,-491,-2351,-1960,-2061,-2290, +-577,1071,5047,4447,1403,1418,-452,-543,43,-280,41,-205,473,781,692,579,387,308,354,574,1092,1036,480,1771,1595, +1006,201,-854,-2047,-3310,-4394,-5000,-5623,-5726,-5105,-3901,-1898,42,3058,1665,621,1008,-754,-395,-431,-661,-218,144,624,684, +455,881,872,405,312,263,188,560,1079,361,-296,-503,-1533,-2073,-2484,-2886,-2733,-2712,-2645,-2032,-1303,-873,-706,-629,81, +198,-437,-422,-351,190,240,218,84,47,18,162,219,-34,205,-238,304,-239,-291,-419,20,-1234,-1820,-1253,-1152,-1304, +-1627,-1958,-1740,-1549,-1368,-1475,-1655,-1849,-1514,-1275,-1245,-953,-484,-526,-877,-780,-829,-658,-546,-526,-396,-396,-240,-253,-124, +-101,-19,-279,-262,-238,371,-814,-731,-804,-921,-883,-766,-686,-662,-676,-631,-608,-527,-502,-536,-578,-529,-511,-628,-558, +-485,-461,-204,-555,-526,-302,-275,-239,-210,-133,-103,-17,-358,-557,163,-480,-715,-1006,-790,-868,-846,-880,-948,-1017,-979, +-935,-903,-848,-799,-726,-689,-647,-626,-626,-721,23,-351,-187,-815,-864,-678,-478,-705,-799,-759,-725,-671,-705,-733,-708, +-703,-411,-838,-724,-514,306,76,158,227,270,310,354,342,340,305,279,227,216,40,-130,-479,-356,-1190,-1210,-1242, +-566,-605,-573,-336,-225,140,49,-217,-47,-4,-6,-315,-275,-313,-195,-802,212,371,387,603,683,770,817,738,637, +485,495,417,299,-131,-677,-1627,-1446,-2075,-2144,-1912,-1409,-880,-557,-426,-327,29,315,-74,248,53,277,-289,-268,-131, +-221,-438,253,672,713,1183,1424,1687,1908,1849,1789,1481,1400,1164,1133,210,-751,-2846,-2370,-3575,-3675,-3032,-1565,-1192,-712, +-384,163,808,883,715,824,584,447,58,-34,-449,-99,-623,508,1143,1109,1683,1900,2136,2183,1782,1290,669,949,1079, +863,-520,-2597,-5785,-4939,3462,-40,-3329,-1743,-1641,-1187,-587,-1018,-273,387,570,958,1041,753,478,314,-105,166,-603,180, +1462,1744,3260,4078,5440,7222,8060,8608,8577,6943,5686,4301,5509,6022,5878,3201,8798,2565,-1502,-250,132,-430,19,124,335, +449,637,1041,917,548,603,333,54,194,286,1519,2294,2632,3115,4559,5569,6428,5869,4540,1769,1187,475,648,1973,2829, +5190,7266,-167,6348,4959,2819,1558,1253,198,22,792,951,-334,802,494,-214,49,403,739,812,1395,734,-1108,-1566,-3214, +-4973,-6317,-6741,-8076,-8263,-8004,-6302,-5025,-2689,-4102,-5091,-6781,-3488,-5243,-346,3419,291,865,486,706,687,838,814,-204,684, +650,614,405,333,672,-160,663,-1024,-3338,-3855,-4795,-5338,-6267,-6994,-6918,-6263,-5331,-4650,-3673,-2397,-2670,-2910,-5141,-3341,-2296, +-2191,-564,-216,-82,168,175,436,395,414,231,144,-128,-183,-155,-109,-622,-182,873,-1242,-2287,-2760,-3809,-3917,-3915,-3225, +-2662,-1662,-17,397,413,222,-86,-714,-2768,-2302,-1036,-1282,33,-301,-283,-23,16,280,285,232,2,-120,-174,-202,-664, +-1044,-1120,-1528,-1768,-1886,-1935,-1846,-1375,-646,-339,-155,-150,-16,199,99,-338,-996,-945,-575,-460,-793,-147,166,58,-228, +-153,-8,156,244,282,220,400,-8,-253,-496,-759,-911,-1161,-1284,-1545,-1348,-960,-925,-760,-721,-526,-280,-489,-601,-709, +-597,-386,-90,-263,-415,-365,-185,-423,-441,-212,-163,-146,-214,-230,-228,-282,-400,-424,-502,-485,-501,-591,-662,-755,-789, +-977,-1012,-955,-944,-872,-795,-767,-726,-650,-560,-507,-423,-379,-283,-278,-225,-288,-342,-385,-433,-556,-586,-634,-443,-480, +-539,-552,-526,-548,-525,-533,-541,-663,-603,-708,-742,-695,-556,-539,-492,-465,-439,-402,-367,-341,-319,-290,-282,-279,-277, +-326,-364,-375,-386,-491,1747,1746,1911,1532,1024,111,1651,1129,394,451,461,396,367,356,374,1183,1536,246,1168,1475, +1486,1480,1521,1477,1526,1542,1525,1567,1604,1667,1774,1897,2125,2047,2049,2066,1944,2504,2257,225,1390,996,1085,1280,1120, +1470,1491,1218,1402,1322,1406,999,1029,1299,1179,1024,1341,1261,1310,1171,1266,1268,1255,1420,1671,1999,2356,2706,3180,3047, +3047,3139,2848,3689,2428,1076,1256,495,542,617,566,864,998,582,883,635,1028,530,577,746,730,1135,922,974,1139, +902,1219,1336,1407,1747,2075,2668,3242,3739,4532,4243,4366,4678,4008,5198,2727,707,834,660,268,407,181,741,848,473, +572,510,564,130,23,403,404,834,380,145,241,-148,239,383,532,1238,2259,3637,4575,5317,6376,6014,6000,6655,5595, +4076,4914,4563,2788,2277,1544,1381,1158,707,429,338,714,786,742,520,381,551,557,1288,1401,1120,1847,2172,2569,3014, +3601,3864,3539,2104,2376,2277,1694,2206,2681,3819,4785,-6827,218,3145,1358,1378,1133,722,519,629,661,605,917,773,681, +476,524,1077,1112,1377,-450,-2342,-3455,-5200,-6253,-7304,-7880,-8000,-6989,-4813,-3219,-1227,-333,-1537,-3287,-6585,-6854,-2861,-4256,-1340, +-601,542,309,1034,376,1247,1272,-114,1095,1063,928,751,382,555,-297,-1006,-1787,-2262,-2517,-2846,-2613,-1969,-758,300,734, +1036,-184,-883,-2575,-1005,929,3622,244,1883,-1018,-2671,-322,-133,55,265,323,568,490,-213,219,101,-30,-567,-918,-1432, +-992,-1502,-1364,-588,-411,-96,445,929,959,1905,2309,2501,1774,1036,-246,780,1358,4443,1390,1879,612,-324,-270,164,-63, +340,784,664,386,-100,-186,-90,287,-27,-451,-705,-1193,-2022,-1090,-492,-449,344,731,1088,1090,1387,801,-502,-638,-658, +-709,-617,-29,2023,2016,1276,798,-625,-481,-354,-370,-63,146,114,114,194,299,163,5,-75,43,284,-85,-540,-69, +84,-325,-649,-866,-702,-94,-46,-135,-449,-772,-552,233,53,-97,160,997,323,82,36,320,170,203,150,184,18, +56,-206,124,-17,362,-13,117,11,-49,-277,-3,-167,-692,-1023,-825,-777,-841,-727,-599,-415,-290,-238,-244,70,350, +451,279,-406,-367,-629,-452,-469,-369,-253,-191,-137,-137,-234,-109,-150,-162,-309,-213,-309,-390,-796,-198,-233,-267,-310, +-475,-599,-695,-598,-550,-527,-540,-543,-584,-568,-596,-514,-480,-284,-221,-219,-240,-297,-166,-227,-294,-338,-368,-355,-444, +-471,-487,-256,-179,-551,-255,-174,14,-165,-186,-222,-242,-255,-301,-327,-365,-387,-394,-391,-386,-352,-325,-319,-288,-255, +-554,-257,-655,426,1061,1947,-111,806,1711,1828,1810,1650,1807,1855,1889,773,-58,1932,786,171,-852,-533,-645,-689,-728, +-751,-751,-762,-766,-755,-812,-830,-846,-792,-666,-319,-386,-157,-62,1917,94,573,557,142,41,-200,-33,216,-5,-6, +84,338,123,-62,-80,804,-718,-681,-710,-838,-903,-931,-880,-883,-937,-999,-1246,-1342,-1307,-1240,-936,-132,-204,-138,669, +1501,881,1083,776,573,129,649,293,504,95,640,359,418,53,-61,34,-133,-733,-956,-1101,-1440,-1694,-1858,-1918,-2029, +-2066,-2127,-2451,-2497,-2321,-2008,-1431,181,-29,-581,1259,2193,1041,958,1141,669,-2,457,588,152,547,411,330,-34,-289, +47,-247,-113,-768,-761,-794,-1190,-1434,-1583,-1496,-1508,-1786,-2275,-3127,-3314,-3159,-2762,-1697,427,126,-3760,-2513,371,1084,269, +218,-187,191,603,744,538,476,422,717,206,-132,-8,-383,-449,-1459,-2817,-3769,-5159,-5611,-6343,-7276,-7328,-6495,-4294,-3583, +-2762,-1481,-1229,-1528,-2212,-3747,1776,-2043,-2839,-1160,-1054,-101,523,1195,1150,1111,583,836,572,422,-105,-377,-679,-1073,-1449, +-1647,-1731,-1616,-1006,-2181,-2132,-1388,356,1212,1366,2291,2000,782,2594,3477,4646,3018,2173,1722,-620,-240,-642,-363,-327,29, +356,654,-12,728,818,958,174,-207,-455,-324,-492,-132,518,603,1479,1759,1945,1437,1868,1841,1077,1366,963,344,2088, +1431,-1078,525,-1899,980,1503,502,236,176,404,926,550,289,-211,161,358,563,372,142,164,37,-443,34,273,202, +311,-61,-225,-161,-967,-1608,-2053,-2208,-1490,-613,434,375,-1916,-1740,-1714,-304,440,655,198,463,261,104,150,133,-212, +242,430,486,345,240,233,523,438,847,574,252,-273,-816,-1024,-1068,-1576,-1152,163,-284,-281,-81,1089,1267,504,-1211, +-569,-801,210,71,116,395,404,324,346,297,306,117,100,246,281,361,285,533,665,565,780,756,302,-537,-1170, +-1756,-1531,-1389,-1194,-884,-617,-582,310,880,1070,192,384,706,638,305,205,276,293,382,335,447,381,540,491,471, +498,426,337,478,541,754,722,620,664,404,174,-121,-108,-245,-452,-407,-438,-539,-377,-197,133,293,418,525,-13, +519,332,346,449,416,474,405,278,265,222,153,129,193,293,339,166,421,286,196,87,14,-33,-113,-147,-179, +-192,-214,-204,-193,-36,79,172,287,324,508,56,-121,-365,259,-22,-258,-293,-293,-266,-288,-295,-301,-96,114,-313, +-123,22,271,178,167,133,101,58,12,61,98,131,145,153,135,180,216,259,303,326,-781,-877,-853,-1056,-1041, +-886,-916,-967,-975,-957,-944,-897,-897,-891,-860,-943,-814,-961,-1041,-946,-561,-681,-668,-620,-662,-668,-673,-649,-637,-648, +-621,-654,-780,-752,-808,-957,-922,-1705,-1611,-1013,-1018,-994,-956,-803,-685,-490,-497,-581,-518,-469,-448,-569,-608,-758,-743, +-1012,-642,-650,-680,-549,-657,-706,-783,-787,-783,-812,-669,-732,-1116,-1004,-1188,-1708,-1764,-2099,-1735,-1310,-1292,-975,-680,-511, +-445,-260,-41,-230,-43,-95,84,-166,-284,-518,-677,-842,-544,-555,-594,-306,-523,-591,-660,-623,-592,-623,-424,-553,-1423, +-1164,-1448,-2343,-2165,-3909,-3331,-2180,-1595,-1639,-1047,-768,-377,271,502,287,407,361,362,26,-189,-555,-617,-817,-546,-533, +-529,-121,-420,-670,-1025,-1184,-1146,-1086,-479,-739,-2131,-1860,-2421,-4096,-4123,5304,2933,-126,20,487,525,831,459,149,221, +536,288,243,579,64,-126,-422,-666,-1175,-1070,-230,-307,-192,-360,-277,-312,-245,-734,-1593,-1596,-1171,-823,429,1525,1983, +4352,1280,2590,1423,945,1038,296,372,337,962,957,391,450,429,827,141,-235,-716,-931,-1173,-547,167,567,1233,1738, +1860,1621,1085,823,892,-1102,-1020,641,-35,-144,-150,112,-321,409,1174,1079,882,657,435,965,605,581,16,25,153, +1156,195,174,255,463,612,513,794,511,-456,-278,-210,56,-667,-1002,-629,-1585,-1131,0,-755,-714,-694,-309,1988,428, +-251,319,209,272,309,841,250,59,-101,-1,228,1282,637,560,967,636,516,451,135,-107,-91,12,-72,-191,-683, +-584,328,568,1103,2012,1366,971,482,1268,329,851,65,-14,286,250,411,431,274,337,386,696,681,603,396,383, +455,348,547,536,536,550,357,38,-280,-835,-495,-817,-1579,-1283,-659,433,382,138,-718,-433,-598,-506,-647,-146,92, +354,469,236,378,409,386,200,188,222,412,487,510,465,448,218,-28,91,489,721,754,215,-222,-614,-824,-374, +71,567,116,-205,-265,-577,-254,-550,-267,-250,-226,-211,-133,-46,192,287,593,426,342,300,164,122,94,173,387, +247,269,432,457,203,60,6,173,389,582,510,458,499,353,239,115,-58,434,442,838,456,632,599,526,537, +481,532,572,614,657,717,646,634,576,482,488,431,472,512,574,673,748,777,745,697,690,704,715,699,647, +602,544,507,330,214,563,683,691,450,621,656,660,640,601,598,578,578,681,568,548,629,540,357,425,454, +479,508,540,597,560,534,492,459,427,405,382,363,346,330,308,79,-24,212,-104,-352,-745,74,-241,-514,-485, +-454,-448,-493,-499,-463,-120,69,-605,-194,-36,199,84,124,162,127,98,31,38,28,44,-2,-15,-41,5,8, +-2,11,297,253,-1026,-134,-279,-140,-14,-42,130,129,110,128,135,241,24,37,11,-29,-333,194,127,132,224, +108,10,-146,-139,-108,31,-46,-61,-109,56,175,302,344,476,207,-478,-67,-416,-329,-137,-40,95,214,162,209, +118,527,187,165,103,-42,-45,215,246,290,524,392,275,-14,57,40,103,-201,-344,-533,-325,-243,137,189,1873, +648,-819,-457,-169,-390,-131,-170,190,457,382,316,374,677,214,159,-182,-140,-383,130,198,130,476,156,-86,-475, +-393,-280,66,-235,-283,-424,92,496,1394,1580,-248,2105,3722,2568,1522,914,804,1205,875,528,479,233,164,484,262, +258,-120,231,144,439,870,1179,2021,1917,2224,2755,2798,2648,2302,764,-713,-2193,-2905,-2994,-2575,-798,-159,217,1157,886, +1211,1404,1007,722,779,786,222,488,564,868,398,419,444,697,600,379,292,-444,-1555,-1150,-1143,-1805,-1643,-1670,-1398, +-46,913,1604,2201,2090,-214,618,-368,384,693,519,873,171,740,1608,765,438,144,-311,1,1730,476,213,334,152, +130,-31,-573,-681,-800,-1499,-1928,-2261,-1462,-828,-256,656,1203,2070,1142,430,-252,-99,-836,61,812,133,402,306,476, +891,240,14,491,256,413,1181,429,260,25,183,450,127,-114,-34,-4,222,231,-147,-188,-822,-2018,-1503,-1315,-1343, +-1099,-1045,-1921,-515,59,-326,285,396,195,332,204,371,319,293,376,210,183,228,240,342,234,257,241,-79,-224, +-354,-247,151,242,426,-419,-759,-807,-621,-561,-771,-444,-525,-1378,-37,-421,298,466,578,535,490,447,592,577,519, +275,474,452,387,243,126,41,74,1,-47,-220,-222,-116,389,479,560,404,523,791,529,116,-558,-395,-466,-751, +-818,54,-119,-186,-33,10,42,76,59,97,126,197,206,374,430,460,451,487,286,130,-60,-7,81,69,211, +354,521,399,235,87,-32,-90,-203,-6,88,255,170,52,116,100,255,246,323,416,440,457,378,385,328,314, +300,344,230,196,156,309,-142,-144,-148,-139,-156,-189,-189,-224,-222,-246,-284,-317,-356,-287,-225,-155,-92,52,109, +-82,-99,33,-10,-43,50,64,110,138,179,212,231,-23,-49,233,-14,-37,-43,4,-25,-33,-40,-41,-49,-66, +-78,-79,-74,-69,-80,-41,-19,6,35,75,-5,-67,-206,29,168,262,46,165,176,170,176,177,180,194,247, +157,79,193,140,94,-35,18,2,-18,-25,-36,-68,-36,-16,8,37,41,4,30,19,-40,-63,-504,-303,515, +91,274,172,153,140,70,48,101,95,143,238,206,163,95,123,241,27,38,48,-9,-33,-64,-113,0,49, +44,74,50,-75,-83,-260,-504,-535,-1050,-596,203,83,462,332,282,247,189,146,192,179,300,454,374,262,107, +214,281,110,82,72,-90,-148,-233,-423,-251,-114,-9,216,268,-42,75,-133,-715,-735,-2858,-1033,690,445,579,643, +458,263,213,219,123,232,397,734,378,268,248,269,364,207,116,219,11,-79,-210,-428,-16,188,161,338,96, +-477,-433,-1052,-2383,-2452,-1149,-1187,-1273,-615,-145,-110,-253,14,670,826,721,308,215,567,349,305,131,384,568,736, +66,-376,-909,-958,-1105,-1430,-1208,-949,-503,98,873,2301,1238,1085,1676,-386,1770,340,227,640,184,755,918,732,757, +776,201,348,442,866,397,389,347,446,459,216,-108,-100,100,-736,-1212,-1312,-1532,-1447,-1246,-410,167,1016,1214,1196, +1305,1731,741,-226,-523,-425,-511,-373,-25,1248,378,65,25,-148,255,1537,459,184,119,-172,-290,-391,-224,-498,-873, +-256,345,963,1267,1243,753,467,-102,-716,-1672,-1921,-1943,-376,363,13,-378,33,-42,142,169,569,163,174,560,80, +288,962,276,120,49,133,85,387,1094,1138,741,1226,1485,1633,1304,863,367,-680,-1223,-962,-1279,-1010,-166,-100,-119, +81,4,58,189,105,215,380,222,119,52,232,330,300,279,228,234,83,-108,180,303,536,643,498,286,-43, +48,77,142,391,438,304,-709,-1085,-926,-356,162,318,163,123,321,159,175,212,280,312,216,212,195,207,291, +308,255,164,176,439,382,208,12,-156,-282,-292,107,186,-9,-389,-399,35,234,176,-476,-59,-359,-372,-128,36, +226,198,244,238,212,166,153,193,271,292,259,181,99,19,-100,-234,-306,-335,-326,-128,-9,52,-160,-330,-437, +-111,138,306,52,-83,-239,-277,337,366,417,307,355,309,239,327,219,296,315,296,272,303,199,165,155,124, +-82,166,189,155,104,68,52,88,139,217,226,227,189,240,242,263,283,325,374,374,444,411,248,409,376, +322,338,307,273,267,243,218,365,429,86,280,326,374,309,307,303,283,250,193,234,259,301,328,365,391, +390,393,387,378,535,-133,-172,-149,-203,-184,-73,-110,-64,24,-3,-14,-17,5,22,39,-21,-55,-29,-69,-101, +-134,-111,-122,-143,-141,-148,-139,-168,-179,-204,-192,-188,-176,-200,-208,-194,-184,-190,-430,-598,-348,-258,-125,-57,29, +-23,-13,5,12,37,59,93,48,-100,-85,-66,-136,-73,-70,-131,-91,-81,-60,-139,-215,-296,-266,-260,-199,-206, +-102,-69,-114,-425,-776,-1053,-731,-446,-153,59,168,129,139,139,189,253,229,308,224,-93,-24,-93,-141,-71,-139, +-250,-273,-306,-275,-459,-579,-704,-711,-635,-471,-534,-455,-567,-603,-443,-1777,-2248,-1357,-824,-409,-39,155,251,335,262, +266,404,559,483,282,-103,-30,-10,-155,9,60,-161,-132,-151,-57,-322,-561,-815,-724,-635,-287,-193,245,36,-422, +1653,682,-314,-798,-562,-483,-54,173,190,274,402,347,381,557,256,185,198,-67,-36,-117,-535,-736,-1382,-796,-926, +-1653,-2154,-2660,-3032,-2693,-2352,-1982,-3031,-2851,-1994,281,2578,2118,1785,1469,1563,807,631,708,498,522,284,152,260,663, +249,119,-142,-262,-165,-198,-321,140,525,884,964,969,1008,1048,985,175,-528,-359,-1622,-917,1230,1981,712,597,729, +344,133,600,593,1209,371,56,180,63,407,1085,385,209,301,258,121,-66,-37,-229,-448,-126,-211,-723,-1020,-1082, +-837,98,541,1085,402,590,728,862,264,148,488,332,316,500,397,542,252,129,358,-60,116,722,601,687,578, +402,497,358,204,212,104,-86,-251,-285,89,381,507,634,476,384,-236,-52,803,644,-3,155,55,90,118,226, +326,480,315,209,132,297,396,345,283,204,-8,87,273,13,154,160,-489,-205,-128,-268,-88,142,366,112,1, +142,-44,57,598,-59,373,117,355,392,283,233,160,308,52,57,184,157,118,156,267,247,134,117,183,94, +107,111,-10,-242,-104,347,271,154,-61,57,107,267,-369,-482,-219,257,223,420,253,386,481,519,554,581,467, +309,173,105,212,156,134,46,47,41,-39,57,63,-23,-45,-136,-203,-263,-117,90,256,216,137,185,-1,-142, +-376,-122,-92,-219,-135,-223,-233,-243,-298,-320,-289,-236,-149,-153,-134,-102,-5,14,4,59,230,71,32,40,33, +19,-10,-87,-33,-28,24,118,244,351,288,241,173,55,83,5,72,113,296,-16,78,219,252,268,284,319, +347,370,148,56,397,186,119,43,83,78,78,85,106,129,162,192,211,223,219,246,192,161,138,104,131, +-208,-174,-131,-106,-127,-125,-97,-97,-62,-76,-69,-63,-60,-58,-65,-82,-101,-86,-117,-139,-163,-173,-177,-168,-191, +-200,-189,-209,-231,-295,-238,-262,-389,-322,-291,-252,-192,-16,92,-139,-38,59,84,59,23,-71,-92,-17,-40,-22, +-36,28,-1,-79,-128,-129,-112,-167,-193,-190,-267,-302,-293,-389,-429,-556,-389,-487,-863,-764,-681,-425,-146,335,323, +95,149,157,142,186,216,88,49,189,131,188,119,236,200,79,-37,-89,1,-105,-110,-28,-173,-213,-131,-257, +-338,-679,-346,-589,-1403,-1097,-949,-211,155,1359,1159,575,524,802,505,592,432,193,208,356,289,387,466,475,404, +40,-15,-104,68,-56,-155,-24,-292,-376,-258,-559,-680,-1031,-563,-1047,-2388,-2119,-1714,-278,920,-1292,-239,382,186,19, +42,46,166,610,599,272,441,476,403,337,314,88,-60,-244,-136,373,482,500,328,199,351,-5,-140,-551,-309, +-420,-333,-348,-821,-964,-1267,396,1094,1603,1343,1057,666,475,1053,403,246,65,165,325,411,237,112,-220,-324,-486, +-585,-277,-297,-704,-434,-441,-732,-1200,-1681,-2166,-1226,-1089,-1470,-1561,-333,2032,891,-578,-713,-685,-591,-110,585,983,1053, +258,-66,262,29,252,432,608,495,-115,50,36,-199,-870,-1080,-1100,-1736,-1945,-1643,-1265,-599,-3,789,1426,1383,1231, +362,543,-127,-8,21,-106,150,321,304,205,187,308,277,410,253,300,279,419,493,44,-58,-96,-238,-337,-209, +30,327,598,1042,1318,1858,2364,2225,1585,788,256,-147,-346,-247,96,110,118,40,92,238,386,508,292,136,173, +156,182,290,68,-49,-111,-229,-248,-344,-107,-12,242,412,627,1080,1233,1060,676,392,187,278,-416,-591,-338,5, +-270,-85,20,14,-40,41,46,90,88,111,146,198,284,472,217,98,145,138,42,-73,60,229,413,705,758, +451,332,380,521,894,823,461,95,-46,-24,-203,146,236,331,202,196,232,214,273,254,284,221,244,27,-20, +47,190,258,290,313,441,369,188,13,28,96,203,200,162,111,149,249,406,364,263,99,170,166,87,-40, +-13,-62,-122,-134,-177,-103,-42,-33,69,150,194,100,115,100,80,-104,192,212,222,258,274,254,234,335,448, +553,598,591,586,463,404,322,258,218,211,197,160,41,220,162,42,44,39,51,31,22,43,209,281,35, +211,273,357,313,331,330,324,332,329,329,304,281,278,288,314,295,278,265,238,276,-235,-252,-292,-274,-207, +-116,-210,-178,-138,-177,-181,-162,-161,-165,-171,-187,-191,-165,-215,-223,-184,-193,-196,-206,-201,-203,-192,-236,-245,-247, +-214,-233,-345,-278,-288,-341,-285,-401,-371,-43,-171,-26,-73,-63,-31,-132,-155,-135,-94,-58,-86,-45,-73,-119,-149, +-180,-156,-192,-218,-240,-224,-215,-178,-265,-293,-310,-243,-295,-536,-352,-381,-534,-443,-639,-468,-134,-190,179,126,85, +117,-26,-30,49,98,132,48,104,80,-10,-72,-111,-48,-89,-97,-176,-124,-160,-148,-350,-403,-398,-268,-341,-783, +-471,-577,-999,-651,-1128,-460,339,324,553,591,505,419,167,112,233,293,423,459,434,327,192,101,28,144,-29, +-136,-257,-178,-124,-106,-302,-442,-473,-325,-462,-951,-409,-626,-1385,-1084,-1489,-1162,-1735,-1386,-499,-154,-157,-370,295,570, +312,499,463,132,341,392,142,105,128,285,173,280,575,291,62,45,96,103,82,-137,-403,-1167,-1122,-999,-359, +-992,975,1069,698,712,377,260,346,835,359,179,80,12,208,449,524,460,109,93,-144,-169,-111,-489,-995,-988, +-822,-263,-231,179,587,254,-628,-2283,-1351,-1432,-1233,-132,309,213,-254,-57,-5,846,760,605,97,-236,6,-59,59, +-329,485,538,-332,-356,-515,-525,-600,-430,-162,-80,-93,14,205,398,548,699,758,912,1542,2108,2930,992,18,210, +351,315,52,143,134,167,548,557,415,302,359,-15,479,413,-272,-192,-329,-189,-89,-106,-162,-350,-164,401,628, +746,650,1415,1417,894,114,-122,617,16,533,130,40,116,257,491,494,269,191,99,161,24,14,152,68,72, +130,117,-41,-50,-267,-197,281,363,422,683,265,236,59,545,586,383,92,19,469,596,440,403,195,174,-14, +15,51,84,107,72,-47,168,270,245,102,65,32,39,75,65,81,-12,-244,-122,-105,-132,-177,-197,-206,-10, +-58,-290,-456,-385,72,213,-18,48,8,139,191,156,128,91,186,253,404,230,213,82,144,131,169,220,309, +233,103,187,194,37,-188,-419,-178,23,219,13,-164,-352,-225,-165,-104,-113,-66,-80,61,-63,-47,19,50,-7, +40,-18,34,-4,5,26,188,217,225,267,502,355,387,413,433,481,585,660,500,308,168,43,-29,-147,-119, +-119,-101,-70,-213,-243,-51,78,276,-93,88,216,214,242,245,287,320,335,85,-99,390,160,36,-190,-130,-130, +-121,-112,-125,-104,-152,-161,-185,-197,-221,-258,-237,-230,-225,-226,-344,22,-43,-10,-138,-187,-221,-22,-99,-186,-215, +-216,-205,-194,-196,-211,-88,3,-231,-112,-55,31,34,38,-3,27,37,60,25,24,68,14,-1,13,-6,-6, +-23,-19,6,-86,-393,-181,-72,-62,6,42,39,13,-28,61,82,39,55,63,36,-8,-93,18,104,115,4, +75,78,115,16,20,155,41,23,75,-21,-32,-53,2,-394,-536,-682,-498,-163,-97,6,103,-22,10,0,145, +137,21,136,150,50,-14,-6,-29,130,120,-144,14,25,127,-60,-44,188,-87,-177,24,-135,-58,-312,-347,-244, +-722,-1210,-810,-224,-96,106,235,126,150,193,325,448,305,435,335,172,113,157,69,286,305,-132,86,92,148, +-129,-129,278,-60,-61,268,-50,-122,-396,-401,-516,-456,-1088,-1077,-672,-279,-86,-195,104,323,111,421,356,-13,238, +196,-58,-97,-64,-248,-513,-490,-570,-596,-659,-641,-594,-331,84,-292,-467,-815,-301,-31,125,-567,-42,698,1025,588, +19,91,246,578,166,-34,98,-91,175,485,467,422,230,181,35,121,-63,-52,307,116,-67,-52,-157,-343,-690, +-299,-344,-1242,-657,-579,-844,-352,1101,323,-261,12,644,1151,895,124,66,-150,5,-3,63,-534,494,617,-253,-98, +-259,-281,-148,-50,14,-4,-68,-95,-726,-877,-650,-483,-305,-338,925,1808,2096,1729,311,185,-2,39,-6,274,382, +231,568,466,215,221,314,59,552,533,86,85,-83,-213,-542,-728,-794,-1125,-1260,-1241,-878,-381,-114,491,699,208, +86,-308,-576,-53,-5,138,292,314,191,354,294,39,79,24,-14,-50,5,177,231,225,168,243,138,109,93, +130,228,219,286,240,246,159,-34,112,-119,-766,98,496,548,145,417,224,140,29,100,182,267,260,239,204, +197,100,84,15,92,97,0,-82,-56,-37,-52,-154,-313,-286,-278,-124,-193,-153,-47,-206,-302,-550,-145,32,180, +445,266,325,282,240,213,180,128,96,103,102,112,100,94,94,83,80,102,-32,-113,-309,-229,-113,-25,-13, +-15,-10,-41,-69,-82,-213,-300,-437,-208,-7,184,230,2,86,-31,119,104,120,153,201,122,66,-5,-50,-77, +-142,-128,-118,-65,-6,45,37,29,-11,-29,-76,-107,-137,-162,-194,-226,-256,-279,-336,-259,-219,-143,-90,-107,-53, +-202,-267,-312,-131,-230,-231,-260,-277,-295,-322,-352,-390,-318,-208,-330,-304,-247,-86,-106,-116,-120,-113,-108,-104,-129, +-147,-164,-178,-188,-208,-175,-157,-142,-115,-173,-7,49,10,28,24,59,11,63,113,89,85,71,99,102,76, +86,59,106,72,28,-58,-22,-25,-34,-25,-23,-35,-8,-9,7,-50,-53,-10,-10,15,45,66,160,120,-49, +-31,39,42,51,109,30,22,40,62,64,19,114,115,98,28,46,-85,-45,-46,-93,-76,-73,-87,14,40, +60,-147,-187,-62,-75,-22,52,153,480,199,-100,-88,-30,-45,27,216,61,23,56,83,144,-16,176,182,163, +9,-50,-187,-120,-105,-143,-100,-63,-69,84,45,123,-235,-259,78,38,185,338,463,937,659,99,18,240,48, +165,390,120,106,151,319,344,48,320,340,190,30,-37,-274,-144,-114,-220,-148,-145,-92,168,256,368,-363,-423, +67,-35,58,451,799,-1051,-580,-196,-206,-263,-61,-70,-68,216,348,134,318,299,177,201,54,-119,-286,-405,-455, +-257,-264,-392,-192,-12,126,-112,-377,-544,-718,-724,-897,73,342,-316,-724,-707,-72,-88,-138,-383,55,323,554,215, +-66,66,29,195,184,326,284,57,-24,-39,21,-78,-2,173,-531,-760,-545,-533,-511,-392,-1542,-1611,-1285,-1076,-1269, +-1631,-991,1435,1244,728,828,1019,1172,748,-185,102,39,127,71,140,-257,514,629,104,-4,-186,-187,-285,-279,-114, +-184,-203,-219,-321,-411,-525,-627,-655,-1087,595,1325,1079,1468,87,71,204,169,98,324,475,410,458,278,-3,250, +275,-126,363,421,104,125,-66,-278,-475,-584,-669,-881,-1101,-1325,-1335,-903,-52,353,577,191,942,973,563,274,356, +337,164,213,325,390,308,122,114,123,12,59,153,275,404,373,168,237,259,327,370,287,213,96,320,583, +972,1101,1210,444,10,-464,55,327,480,426,224,120,144,205,182,285,354,379,351,286,283,219,188,215,218, +171,54,-18,-114,-97,-114,-74,112,-188,-374,-466,-186,41,278,139,129,8,306,424,467,379,276,313,244,164, +107,123,112,110,97,170,143,246,178,243,197,241,236,226,119,285,327,169,109,259,442,580,547,492,456, +352,281,223,186,161,171,217,-24,3,69,74,99,88,124,151,180,168,121,159,160,155,108,128,138,123, +59,138,106,139,141,124,72,56,2,-18,-35,-29,-24,-24,-15,-7,-8,-7,76,64,76,62,-7,113,76, +-16,-28,-37,-29,-55,-69,-78,78,126,-63,76,121,123,101,104,100,97,103,109,109,106,97,83,69,55, +62,66,69,72,121,-69,-73,-68,-69,-60,-39,-80,-58,-3,-39,-46,-45,-34,-32,-43,-45,-41,-3,-48,-56, +-38,-64,-64,-46,-75,-82,-93,-54,-49,-66,-101,-117,-130,-87,-78,-73,-89,-149,-116,-7,-116,-93,-71,-29,48, +-29,-50,-46,-30,-20,-28,14,32,38,9,-69,-51,-92,-115,-40,-108,-106,-121,-18,-27,-107,-199,-225,-206,-67, +-16,-21,-103,-237,-41,54,-63,-39,-40,10,188,6,-17,2,26,65,55,92,123,176,78,-46,-41,-69,-106, +28,-133,-144,-202,23,38,-108,-308,-408,-403,-168,-122,-58,-169,-409,-118,99,-86,-28,72,138,370,95,66,104, +266,225,34,184,287,236,73,-163,-95,-148,-248,41,-142,-131,-188,138,153,-150,-444,-577,-493,-84,133,255,-43, +-940,-878,-622,-352,-300,-312,-275,-94,15,251,186,241,305,396,225,127,116,41,-91,-145,101,140,258,-204,-241, +-36,33,-177,-257,-515,-477,-290,-263,-633,-1432,-1013,-1192,-389,-281,-297,-329,189,316,54,104,-18,62,12,32,-86, +320,376,129,-45,-150,-126,-165,-291,-453,-284,-313,-537,-534,-421,-33,-702,-700,-159,-55,-125,-565,-1142,1589,1269,1050, +1098,1195,906,586,-85,233,121,60,72,168,-17,431,469,163,-55,-209,-160,-230,-253,-287,-657,-725,-504,-357,-266, +65,-667,-700,-681,210,769,776,1486,-158,-151,-70,22,153,374,532,514,325,140,59,159,89,-195,85,131,84, +1,-138,-286,-403,-582,-767,-927,-908,-790,-748,-556,28,-97,303,519,1306,1311,423,171,82,176,253,296,365,386, +307,173,173,238,237,219,251,236,485,457,241,92,116,188,179,219,274,361,335,249,440,607,978,466,237, +109,71,128,206,60,16,89,118,116,150,262,340,297,444,399,229,301,299,227,125,102,236,174,99,163, +251,246,195,-193,-187,-10,118,79,26,-423,-427,52,56,209,462,107,189,191,209,138,61,88,102,131,146, +183,242,247,242,273,281,279,238,305,406,434,415,441,509,458,380,268,137,-10,-164,-68,-35,-48,50,139, +236,229,96,121,41,179,187,246,319,350,365,331,310,306,304,293,233,167,131,67,34,-142,-184,-219,-281, +-293,-295,-294,-256,-201,-165,-133,-110,-86,-40,-17,3,40,131,168,102,96,81,170,140,117,108,121,127,130, +132,144,147,138,116,89,78,59,72,61,59,43,22,-4,17,29,47,51,65,82,86,97,114,125,170, +-5,-47,-52,-52,-56,-81,-15,-21,-17,-47,-55,-55,-52,-48,-35,-3,16,-22,4,15,40,4,0,8,-12, +-15,-6,-9,-14,-9,-38,-28,25,15,15,19,-28,-119,-170,-179,-155,-132,-47,13,62,17,-4,-13,-2,14, +69,45,68,93,89,39,99,53,31,63,-9,-26,-15,-42,-64,-72,-170,-155,-3,-10,-13,-10,-83,-325,-336, +-298,-250,-214,-69,37,167,34,-6,1,17,62,198,118,153,214,196,143,157,83,32,62,-60,-90,-70,-96, +-147,-120,-255,-168,167,115,72,5,-246,-402,-575,-719,-668,-451,-149,59,278,79,70,61,208,193,204,178,247, +320,257,208,306,216,124,184,-28,-91,-93,-217,-265,-282,-532,-442,110,80,9,-127,-377,-551,-355,-113,-61,-212, +-312,-213,83,-10,91,109,163,268,423,214,202,328,228,75,-85,-77,-86,4,-335,-456,-503,-390,-330,-678,-189, +-28,-63,-179,-278,-424,-554,-777,-730,-807,-544,-139,268,317,-172,-78,-122,60,-61,-52,-90,385,441,218,115,13, +-27,-47,-95,-64,-14,74,-119,116,-147,-602,-955,-729,171,238,229,-356,-663,1370,1874,1365,1223,1158,685,348,-76, +143,37,-18,26,44,-56,113,200,374,14,-142,-173,16,-65,-360,-549,-529,-533,-68,-76,-190,-896,-1057,-313,-1036, +-829,268,849,-148,-11,-10,248,353,541,552,490,165,23,134,47,27,127,151,163,390,90,-112,-150,-290,-462, +-470,-383,-320,-475,-422,-694,-703,-1027,-537,683,1136,1302,922,229,197,284,291,357,353,311,240,182,203,294,490, +299,253,181,398,393,253,167,108,145,78,79,61,-91,-130,-19,241,437,653,309,243,532,148,21,-242,-6, +-64,-100,10,116,271,346,376,290,333,322,302,240,197,81,92,192,345,328,315,257,232,231,240,569,727, +679,524,231,-95,-231,-194,91,220,189,-42,-21,113,-15,55,88,108,109,143,166,154,129,126,194,294,409, +298,174,34,118,211,251,238,253,214,179,151,170,53,-3,-62,77,165,223,205,245,326,223,297,342,300, +331,334,359,359,388,348,342,328,301,258,244,187,168,121,82,-34,-17,-15,-28,-21,-28,-36,-43,-1,32, +39,60,78,120,164,191,220,245,235,261,240,236,208,242,232,239,237,235,230,229,228,225,205,196,152, +148,138,139,138,141,140,144,147,139,158,170,190,192,193,186,192,200,207,227,224,16,-42,-1,-9,-13, +-34,21,29,34,13,5,-5,1,11,41,42,48,40,51,51,41,29,25,32,25,17,4,-2,-6,20, +-29,-25,34,5,-11,-44,-45,-139,-58,-140,-64,-97,24,70,90,45,14,0,1,27,112,91,107,125,131, +134,110,67,51,44,21,1,-26,-23,-17,61,-60,-28,135,96,64,-55,-125,-263,-96,-176,-97,-193,18,105, +176,75,5,-15,-18,59,225,173,195,216,230,224,159,84,60,81,63,33,-4,-72,-108,74,-203,-153,140, +-15,-88,-292,-323,-330,-123,-287,-236,-287,8,177,312,96,42,17,140,184,330,242,282,348,353,387,245,149, +137,79,37,-3,-4,-79,-56,223,-218,-113,387,245,130,-164,-398,-588,-349,237,245,-156,-137,-97,78,61,101, +70,73,182,383,165,141,268,123,2,-89,-241,-290,-312,22,18,-406,-488,-559,-652,60,209,-56,-240,-437,-781, +-751,-719,-791,-750,-533,57,237,246,-166,3,-36,55,15,-15,36,367,370,240,173,135,43,60,98,128,-64, +-10,31,33,-227,-1025,-716,-542,240,105,-2,-265,-354,832,1269,1493,1224,1297,453,167,-53,21,-27,-3,16,-82, +-24,-181,-31,651,183,-18,-122,-61,-168,-241,-147,-192,-575,-300,-495,-1107,-1160,-1099,-130,-1295,-1232,-580,216,487,327, +217,364,560,593,542,366,17,-66,47,32,47,211,103,163,567,62,-67,-116,-291,-314,-233,-319,-234,-238,38, +-199,-757,-1128,-905,554,637,1007,1287,772,287,382,317,330,377,284,234,243,339,390,471,282,217,181,252,251, +260,136,106,-45,-180,-267,-371,-554,-501,-367,-85,76,149,506,718,1110,586,204,-34,163,-141,-51,-11,119,285, +328,346,316,211,186,310,179,124,141,252,312,247,284,262,219,211,298,475,765,863,861,653,400,31,227, +245,146,231,203,-27,-111,186,143,145,171,171,182,202,250,213,179,132,192,280,327,203,60,-49,-28,46, +-56,-72,-1,8,-44,-88,-90,-28,83,170,232,282,337,273,210,199,193,227,249,289,250,267,262,237,239, +215,237,236,231,207,210,192,199,185,148,119,97,115,121,140,160,184,188,179,157,153,137,134,150,164, +194,206,213,195,197,206,206,225,168,179,206,212,205,205,201,199,198,178,166,168,157,146,154,158,156, +154,157,158,165,167,170,169,175,175,165,172,173,178,187,190,-5,-45,11,-14,-8,-20,1,16,41,22, +11,-5,1,11,43,26,27,45,36,28,17,3,-4,-2,-2,-10,-36,-32,-26,-3,-10,-4,29,-11,-24, +-16,-51,-131,0,-56,-62,-106,23,61,76,32,2,-25,-24,4,73,79,96,95,112,103,56,8,-14,-14, +-7,-20,-71,-53,-46,-21,-47,-18,59,-14,-43,-26,-142,-261,43,-25,0,-136,43,109,150,76,7,-44,-43, +21,157,169,186,188,216,188,131,41,-4,25,20,-12,-142,-137,-112,15,-23,29,172,-50,-114,-45,-299,-445, +29,-70,-129,-234,144,226,276,127,27,-9,76,143,333,238,297,337,373,298,204,75,3,23,20,-31,-153, +-104,-45,0,-140,-2,244,-7,-88,59,-397,-575,-777,179,298,-210,-132,-89,48,-88,4,111,4,94,334,185, +141,168,80,11,32,31,-43,-127,142,157,-60,-438,-458,-187,472,399,-334,-359,-618,-998,-746,-209,-762,-741,-491, +60,107,100,-108,19,11,37,30,5,85,174,219,381,205,136,-40,-46,-21,-28,-217,-319,-234,-509,-617,-737, +-463,-61,369,48,130,543,248,-247,416,1092,968,853,140,-42,-29,-11,-5,51,69,-77,104,-162,-24,666,225, +23,-38,-112,-158,-113,4,54,-95,-326,-474,-696,-452,-576,-719,-1268,-1643,-2031,-1077,1292,726,526,531,749,586,464, +313,40,-11,-2,16,5,141,16,51,417,-94,-231,-219,-276,-240,-209,-277,-225,-39,188,103,-563,-632,-657,-158, +280,860,1332,1478,132,169,247,264,361,286,312,423,389,382,347,333,271,112,146,185,299,123,-15,-141,-245, +-371,-486,-326,-256,-228,-416,-426,-381,411,917,1249,925,496,79,115,159,172,183,264,354,325,279,202,126,106, +138,160,168,265,312,267,159,194,211,249,330,447,577,580,567,655,511,559,635,564,483,433,157,152,221, +139,-1,26,104,123,138,155,192,234,231,229,221,189,190,152,126,112,116,15,-102,-150,-131,-190,-208,-187, +-157,-133,-74,-33,27,80,118,128,105,46,-26,-23,220,225,219,197,200,178,161,152,160,176,195,204,213, +231,212,187,179,159,138,129,150,166,179,189,193,189,197,197,186,156,133,124,146,176,195,223,222,237, +205,189,161,204,178,156,165,166,167,174,177,183,185,200,143,164,177,190,183,182,182,178,178,182,175, +171,175,186,198,201,204,206,212,211,284,-5,-32,7,1,-2,-24,22,21,22,11,1,-16,-11,-4,17, +24,30,30,32,28,19,1,-9,-17,-16,-20,-31,-26,-21,-12,-9,-8,4,-38,-45,-11,-39,-79,-20,-40, +-47,-91,39,77,62,36,6,-20,-23,-2,44,64,89,98,103,88,65,6,-21,-28,-19,-30,-71,-69,-60, +-45,-12,-9,-6,-94,-114,-26,-83,-188,-15,-84,-59,-109,78,141,124,80,2,-46,-50,-4,110,155,180,195, +204,182,152,19,-39,-64,-81,-108,-192,-151,-112,-84,-28,-37,-30,-237,-299,-79,-213,-217,-141,-303,-360,-377,85, +202,222,134,31,-18,36,115,290,201,269,377,389,315,248,6,-85,-78,-80,-118,-282,-221,-168,-190,-76,-64, +-76,-320,-365,-90,-243,-466,-752,209,449,-96,-48,8,206,-132,-141,102,-23,54,256,264,245,164,147,166,196, +148,62,-21,-162,-319,-473,-440,-238,-82,396,344,-264,-350,-606,-863,-584,-75,-576,-544,-357,235,-56,-180,-159,-118, +-92,-42,-10,-14,25,-1,102,452,202,50,-77,-48,-37,26,113,53,-127,-461,-513,-365,-49,-110,-409,-332,-62, +277,164,-1285,-482,493,447,298,-69,-70,54,25,13,15,74,-61,82,-115,11,480,249,146,79,128,105,40, +103,123,273,-284,-505,-639,-97,-35,-544,-597,-1207,-1949,-1586,1840,1130,810,725,819,592,406,267,134,76,-1,-23, +-30,178,76,83,310,13,-136,-190,-220,-213,-213,-14,-6,92,-372,-501,-568,-259,-283,-705,-72,546,1149,1837,-29, +61,145,201,366,294,356,502,395,335,268,381,297,52,80,147,319,153,27,-50,-29,-113,-318,-250,-435,-541, +-870,-757,-396,170,693,992,1102,888,481,105,425,391,417,438,407,302,214,180,72,36,-8,133,238,308,291, +214,181,162,208,239,261,272,260,271,301,289,426,601,819,740,609,525,215,73,143,348,-27,0,73,166, +240,249,273,291,283,266,248,179,128,73,134,211,287,243,149,180,184,133,116,97,89,55,70,62,83, +72,77,82,58,22,-61,-66,234,218,206,180,174,163,152,132,136,131,149,152,168,175,163,136,113,109, +107,131,136,137,143,148,155,168,185,201,208,221,231,241,234,237,248,251,210,207,244,249,246,224,241, +238,245,251,250,256,258,263,235,218,231,225,213,190,187,189,188,186,185,180,183,189,199,208,218,233, +227,222,216,211,258,-13,-47,-16,-15,-12,-26,12,15,10,4,-6,-23,-19,-14,1,11,17,28,11,3, +-2,-12,-20,-26,-20,-19,-28,-12,-7,-14,-8,-12,-21,-29,-35,-32,-51,-83,-19,-26,1,-60,63,88,51, +36,2,-36,-39,-17,20,58,82,82,69,63,32,-9,-28,-44,-38,-41,-66,-28,-27,-56,-40,-38,-54,-64, +-64,-48,-95,-178,-2,-28,14,-93,130,172,108,98,16,-66,-77,-31,76,158,190,175,156,129,90,-15,-49, +-84,-64,-66,-100,-27,6,-56,-9,-16,-98,-100,-126,-146,-224,-79,138,27,6,-173,180,264,238,156,28,-37, +-15,86,259,229,270,336,327,281,200,24,-42,-99,-93,-91,-162,-68,-77,-200,-113,-93,-156,-131,-91,-96,-206, +-666,-630,-21,249,-8,108,141,193,-73,-135,10,-44,36,181,312,328,175,199,202,79,-67,-96,-55,-152,-254, +-408,-78,51,180,242,97,-109,-458,-664,-704,-724,69,-542,-447,-208,255,-82,-302,-303,-169,-117,-110,3,-15,-13, +-65,38,403,192,93,69,111,102,102,211,44,-400,-409,-379,-344,66,125,-213,-52,16,141,202,-1692,-1084,-294, +-136,-200,-243,-116,62,28,7,-66,-15,-100,-4,-82,8,313,259,235,74,95,100,29,109,49,-34,-194,-271, +-386,-138,-40,-348,-393,-833,-1201,-1762,1686,1557,1230,1064,907,690,416,159,159,89,0,2,3,113,82,115,242, +191,93,-75,21,41,-27,209,55,-245,-798,-884,-610,-126,-94,-612,-688,-301,666,1318,128,142,192,284,414,328, +340,390,342,284,211,289,220,79,43,77,265,122,61,-42,-104,-159,-265,-496,-701,-765,-991,-861,-390,-172,244, +690,998,1018,870,380,311,337,413,402,352,254,198,211,105,71,61,84,171,211,250,230,237,124,133,75, +-2,-67,-151,32,135,85,425,607,692,758,699,464,252,143,108,237,124,157,166,232,305,307,308,315,297, +284,235,236,172,150,176,244,305,296,278,250,303,367,396,333,280,216,227,230,266,155,66,4,45,57, +30,72,163,149,175,140,140,136,121,118,96,100,94,99,107,110,125,135,121,140,140,225,193,140,126, +99,86,72,103,124,155,178,210,218,198,183,183,175,113,99,142,161,203,129,165,206,205,200,200,192, +189,184,151,140,198,179,169,193,166,159,140,130,118,96,107,109,108,116,122,137,133,131,125,117,128, +17,3,27,5,-2,-33,30,26,2,4,-6,-28,-26,-23,-9,22,38,15,14,11,13,12,9,1,8, +10,1,27,30,19,6,0,7,-4,-5,3,1,-4,56,21,46,-29,81,103,55,67,33,-30,-25,-6, +22,80,105,89,64,36,11,3,-8,-30,-12,-1,-20,55,56,16,-17,-34,-8,-32,-27,2,-27,-20,55, +51,63,-89,147,178,87,116,48,-82,-74,-39,36,174,207,161,109,79,26,-1,-16,-61,-16,-4,-54,110, +121,43,-37,-88,-38,-101,-101,8,-30,12,204,246,176,-89,246,310,229,212,52,-73,-68,43,195,294,335, +275,242,183,63,-6,-40,-123,-53,-23,-72,175,157,10,-94,-149,-58,-115,-86,102,3,-415,-592,-429,-144,19, +176,165,35,-111,-155,-41,-73,17,148,311,322,115,172,134,71,3,-27,14,62,40,-60,90,216,384,101, +-77,-93,-335,-393,-336,-422,48,-188,-187,-77,-10,-108,-181,-207,-144,-111,-131,28,27,5,-64,16,316,226,192, +82,9,-48,-140,-217,-320,-394,-338,-244,130,112,123,-70,63,56,31,-24,-1515,-1212,-708,-423,-318,-241,-147,-34, +-18,17,-56,-37,-86,-38,-44,-61,50,155,174,28,-41,-52,-13,11,-149,-398,-442,-339,-15,-86,-173,-376,-483, +-530,-482,-1346,1084,1468,1438,1161,953,655,380,77,119,48,-24,33,23,-11,11,74,119,227,217,-32,118,104, +-8,-125,-273,-442,-524,-493,-309,-356,-387,-359,-979,-833,187,548,694,443,363,410,433,375,353,345,314,256,162, +159,137,176,32,4,109,73,36,-215,-395,-416,-351,-425,-449,-639,-532,-612,-806,-624,-337,124,609,970,1208,904, +183,262,316,312,245,219,190,175,185,183,180,109,106,147,241,290,311,152,57,-24,-107,-187,-269,-197,-138, +-30,214,401,524,693,713,589,421,252,152,136,249,298,280,304,340,322,301,288,292,298,304,311,269,250, +239,246,254,254,249,245,294,334,358,383,396,410,408,396,390,259,160,90,128,152,133,196,93,78,95, +82,83,80,76,75,78,94,95,110,125,140,175,229,255,292,291,417,380,334,305,266,236,204,206,204, +215,218,220,193,165,138,124,110,79,66,84,92,112,80,98,118,119,115,115,111,109,103,124,134,140, +167,181,217,180,173,158,147,134,116,115,106,93,88,85,88,91,93,91,84,74,47,42,43,43,35, +-3,57,53,25,35,25,-2,2,6,10,46,64,44,44,39,34,37,34,23,31,37,35,63,62,35, +21,15,36,18,20,38,39,52,63,83,71,-16,82,108,63,90,65,-6,4,15,27,97,120,113,74, +35,11,20,15,-4,18,33,23,104,96,28,2,3,81,50,55,75,53,31,18,69,58,-92,152,171, +64,130,73,-81,-47,-25,1,164,206,191,112,63,-3,10,-9,-62,-26,6,-24,166,159,-15,-78,-123,25, +-40,-34,24,39,14,50,181,84,-194,174,285,167,243,88,-106,-86,14,108,300,349,262,178,62,-54,-52, +-63,-117,-39,-5,-82,231,186,-80,-116,-78,182,151,150,143,57,-94,-479,-622,-309,152,169,128,6,-130,-181, +-67,-69,15,118,265,296,183,190,162,215,93,-11,-64,-143,-137,-11,118,241,445,-88,-410,-405,-599,-546,-317, +-65,-247,12,159,57,-204,-281,-243,-94,-131,-116,-136,26,44,-14,-46,-12,118,187,169,23,-87,-165,-219,-205, +-219,-185,-265,-203,98,71,176,202,318,256,48,-291,-710,-1183,-938,-625,-354,-169,-56,-87,-20,49,-28,11,-9, +-26,19,-71,-153,132,198,12,-84,-170,-195,-306,-399,-435,-368,-218,54,-195,-415,-579,-521,-279,-106,-357,389,849, +1232,1023,852,478,244,28,78,12,-37,16,-3,-64,-25,-2,-76,206,226,-100,-17,-54,-67,-216,-289,-440,-261, +-275,-416,-501,-439,-324,-663,-804,-639,-139,1135,815,625,554,463,435,401,364,310,214,77,53,83,222,78,36, +15,27,-59,-285,-379,-483,-522,-411,-360,-511,-187,-214,-622,-631,-643,-527,163,741,1136,1194,252,253,253,252,194, +210,220,204,272,285,241,211,171,161,195,226,219,180,81,-46,-97,-129,-148,-370,-422,-290,-149,0,153,415, +603,693,688,553,373,295,288,308,306,314,340,292,238,189,222,230,286,257,270,233,250,233,238,251,267, +334,355,350,384,446,506,552,544,545,543,434,347,301,259,247,225,273,132,136,92,124,106,103,122,113, +139,139,151,158,178,198,241,278,321,362,411,402,375,370,339,325,300,279,253,226,208,194,181,147,146, +138,130,127,110,116,77,65,53,96,76,63,65,73,76,86,89,89,114,131,135,143,158,161,164,168, +174,174,177,184,167,153,135,123,111,100,109,113,118,116,106,45,33,18,41,44,16,55,59,43,57, +49,26,30,32,30,50,61,76,57,47,35,37,35,28,33,39,50,58,48,4,13,17,42,33,39, +53,39,48,30,92,76,-5,76,93,57,83,67,12,11,16,25,83,106,127,84,49,25,29,20,8, +10,32,70,96,65,-38,-22,-4,78,49,59,78,57,11,-43,39,57,-99,139,151,42,118,82,-49,-29, +-21,-1,122,179,221,132,66,8,23,2,-32,-20,23,86,138,79,-150,-111,-99,60,25,63,93,32,84, +52,231,171,-171,126,253,139,236,112,-107,-92,-7,65,255,298,286,178,62,-28,-18,-45,-86,-66,5,115, +185,58,-243,-165,-71,194,123,171,135,81,-97,-327,-701,-415,311,187,107,18,-113,-166,-93,-36,36,65,186, +259,327,212,167,201,84,19,-25,-196,-170,54,123,119,189,-345,-531,-301,-399,-326,-178,2,-231,-78,213,85, +-351,-434,-390,-186,-144,-92,-125,3,10,-44,-35,-43,-51,145,175,19,-68,-153,-204,-119,-143,-234,-58,41,199, +83,35,-15,135,116,-24,-205,108,-649,-783,-582,-417,-144,20,-50,-31,35,-19,18,24,-5,86,-28,-207,155, +202,-48,-107,-211,-296,-351,-334,-317,-149,-215,-399,-398,-453,-622,-419,-189,-66,243,-426,201,806,757,622,260,58, +-52,25,-24,-63,-23,-36,-118,-77,-60,-148,193,200,-83,-127,-197,-120,-191,-250,-410,-278,-227,-240,-198,-247,-560, +-308,-523,-1190,-789,1222,1121,854,696,547,526,484,380,274,161,12,0,59,188,107,56,-59,-49,-115,-220,-233, +-341,-386,-373,-270,-88,-21,-71,-218,-457,-651,-871,-340,225,692,1091,458,327,300,312,255,271,293,291,321,315, +281,278,218,108,73,74,95,136,72,-60,-119,-175,-201,-384,-486,-567,-604,-505,-249,47,408,726,946,948,774, +596,367,332,303,298,304,252,187,129,142,151,175,166,187,169,211,209,221,257,325,363,349,349,349,393, +448,494,560,619,666,591,528,503,421,382,353,366,219,216,159,209,186,178,206,204,233,221,224,225,233, +237,236,227,250,254,273,193,204,239,252,274,281,290,264,246,245,257,277,291,285,273,254,233,232,236, +181,150,100,206,158,108,108,114,117,122,123,124,167,200,138,160,179,193,221,229,244,255,270,292,284, +280,270,263,253,245,242,241,241,240,263,39,27,2,26,33,19,48,51,37,50,47,35,31,30,31, +44,53,78,59,52,41,39,36,32,29,33,59,41,29,-12,10,17,35,35,40,51,36,13,-8,68, +67,22,65,70,46,70,62,31,12,13,29,68,92,132,97,70,52,49,35,25,12,32,101,48,-4, +-91,-45,-6,61,62,67,72,33,4,-68,11,28,-54,117,118,25,94,80,1,-14,-21,14,91,159,231, +160,99,52,63,35,14,-3,31,170,73,-3,-210,-119,-68,43,73,85,132,53,0,-13,240,195,-70,113, +206,102,208,124,-79,-100,-30,62,216,265,312,197,114,47,63,20,-19,-39,40,270,83,-134,-385,-213,-42, +152,164,189,186,89,-67,-204,-732,-516,341,177,88,11,-89,-138,-108,-8,48,16,117,217,390,207,132,99, +97,95,54,-10,8,121,166,195,235,-453,-583,-209,-230,-161,-137,-3,-72,-53,249,136,-351,-397,-341,-218,-158, +-82,-104,-23,2,-19,0,-43,-115,129,182,50,-6,-96,-131,-132,-126,-185,30,0,-98,4,-33,-229,6,-63, +-380,-176,295,-115,-404,-381,-297,-133,7,-57,-71,0,10,-4,2,4,90,-23,-171,108,119,-79,-119,-200,-229, +-261,-246,-255,-61,-100,-371,-392,-399,-513,-165,21,120,380,-1268,-374,228,320,295,-2,-140,-199,-67,-85,-112,-37, +-20,-127,-99,-93,-119,106,125,25,-91,-179,-144,-144,-138,-190,-150,-143,-139,-143,-219,-474,-236,-502,-1187,-1385,1140, +1304,1051,865,666,684,615,403,259,141,33,2,28,92,68,22,-93,-77,-116,-144,-143,-147,-111,-149,-66,69, +-137,-262,-231,-351,-506,-771,-698,-307,361,816,568,426,396,406,344,368,359,297,327,325,323,296,210,54,-18, +-24,26,107,82,-38,-147,-255,-336,-380,-473,-604,-734,-698,-475,-291,51,476,840,966,888,707,519,439,362,319, +267,231,184,143,138,151,141,167,169,204,205,202,189,180,229,178,146,165,142,204,258,316,457,571,669, +694,719,751,642,592,580,552,363,349,246,332,295,301,325,318,331,309,290,289,275,259,233,219,218,197, +170,142,187,232,271,313,351,388,383,384,398,422,448,493,474,452,418,381,357,364,307,278,229,328,282, +233,227,229,233,229,231,233,265,287,220,250,261,281,304,317,335,348,362,382,382,387,389,392,391,395, +380,375,371,369,385,40,23,8,22,28,24,41,37,27,37,37,37,25,23,25,37,48,67,56,55, +51,47,44,40,34,37,62,34,22,6,18,26,39,47,45,31,29,-8,-20,31,51,40,43,44,40, +58,58,48,22,19,31,61,85,121,105,85,74,74,59,49,31,34,86,4,-35,-59,-41,-9,32,61, +56,14,3,-56,-127,-15,22,10,80,66,21,66,74,44,13,-9,21,78,141,216,178,138,94,104,76, +55,22,34,156,2,-59,-140,-86,-29,40,122,98,6,-8,-157,-192,60,102,-18,63,125,56,160,120,-31, +-86,-37,55,184,247,318,212,156,110,135,88,53,6,33,179,-62,-241,-311,-207,-57,39,141,106,-29,-63, +-31,-70,-573,-462,282,175,109,6,-40,-80,-99,15,41,-9,90,190,354,229,152,74,133,122,81,60,61, +138,151,222,407,-253,-369,-53,67,119,8,-9,-3,26,249,157,-228,-308,-260,-133,-127,-73,-69,-25,20,33, +55,-3,-84,85,127,105,60,-29,-64,-113,-73,-5,-99,-175,-236,-256,-229,-303,-139,-209,-505,-154,275,101,-201, +-269,-234,-161,-52,-144,-102,-10,27,-6,-8,16,49,-27,-95,67,65,-9,-83,-140,-72,-141,-134,-62,-102,-105, +-186,-323,-338,-291,9,142,192,300,-1617,-843,-345,-168,-80,-265,-294,-306,-155,-129,-115,-17,11,-59,-57,-74,-91, +-16,31,143,8,-76,-96,-129,-85,-1,-60,-110,-110,-214,-238,-159,-343,-584,-808,-1521,904,1168,1114,955,747,817, +688,366,241,121,86,9,-17,-9,13,1,-94,34,4,-51,-97,-88,-37,-9,-65,-216,-331,-368,-318,-317,-373, +-462,-784,-641,-48,473,587,497,485,468,398,407,383,317,354,349,348,291,210,113,13,-9,-3,44,37,-62, +-180,-270,-360,-409,-467,-436,-522,-546,-479,-482,-360,-98,397,667,684,642,638,525,441,394,319,287,260,216,196, +201,171,209,212,259,230,206,173,101,70,-19,-31,-17,-22,58,115,169,248,328,398,556,723,863,805,780, +817,720,515,523,420,479,434,433,432,416,415,392,364,353,325,293,267,258,254,241,209,218,259,286,308, +332,360,390,416,437,446,467,471,513,513,521,517,508,449,468,420,394,353,418,380,343,333,327,325,314, +310,307,335,348,290,316,324,340,351,364,382,393,403,413,418,428,443,450,458,462,455,451,446,453,453, +48,23,19,31,39,44,47,37,34,37,41,50,34,32,30,43,52,65,64,65,60,57,55,50,44, +43,60,28,17,13,22,31,38,51,51,31,29,9,8,24,57,79,42,32,48,53,59,75,40,31, +33,61,83,113,115,105,90,90,76,63,44,36,71,-20,-47,-35,-19,11,26,65,61,4,11,-71,-98, +-27,50,95,57,34,42,48,73,98,44,11,24,76,130,195,193,174,123,129,102,75,41,35,119,-68, +-120,-127,-76,-16,12,101,97,-50,-62,-95,-112,-12,82,93,17,48,49,113,108,35,-46,-26,35,145,215, +300,237,201,152,171,123,77,25,17,110,-169,-289,-245,-148,-16,-13,105,89,-140,-115,-109,-119,-378,-303,231, +215,178,37,8,-24,-62,38,39,-12,91,181,303,274,231,130,128,91,58,22,33,155,5,37,280,-216, +-258,25,178,215,45,16,150,202,109,45,-181,-257,-227,-117,-94,-44,-35,-30,9,42,84,35,-14,53,83, +166,94,11,-56,-66,-55,-25,-173,-212,-102,-183,-199,-154,-351,-451,-486,-89,175,213,1,-129,-302,-167,-91,-187, +-122,-29,16,6,19,38,37,11,-3,72,76,142,15,-23,51,-2,-3,19,-36,-100,-165,-264,-237,-36,171, +252,205,123,-1188,-1069,-753,-535,-396,-375,-302,-276,-179,-125,-63,-2,17,-13,-4,-34,-72,-68,-3,195,50,-25, +-103,-102,-90,-91,-75,-56,0,-135,-216,-119,-387,-486,-469,-989,417,742,945,873,731,782,593,234,168,72,83, +8,-30,-58,7,19,-58,81,74,66,-17,-65,-26,-64,-199,-332,-247,-253,-335,-314,-320,-315,-588,-678,-531,17, +627,601,583,530,444,392,395,435,410,372,341,276,233,224,116,53,-26,-45,-80,-138,-232,-283,-320,-400,-385, +-259,-328,-367,-425,-492,-540,-521,-142,212,453,568,622,547,505,472,422,399,377,334,289,275,228,234,225,224, +204,174,149,86,19,-33,-37,-52,-62,-37,-37,-42,-38,-17,-12,240,497,731,747,752,811,698,531,553,540, +523,504,490,478,462,456,436,416,397,371,342,321,299,285,271,265,233,261,285,304,325,350,375,408,436, +443,452,429,445,448,473,489,511,459,468,462,455,440,445,432,411,402,394,389,381,376,374,380,375,360, +359,355,333,350,361,374,384,394,404,409,417,432,436,445,448,451,450,447,454,473,61,38,30,42,51, +69,58,45,45,41,46,65,45,41,35,52,62,65,73,76,74,70,66,61,58,55,63,31,22,17, +39,50,53,66,66,46,45,34,21,39,78,139,53,34,67,58,68,104,57,45,41,65,87,110,127, +121,106,105,92,77,68,54,67,-26,-52,-45,8,44,43,79,71,16,35,-18,-48,10,80,213,57,28, +85,47,75,153,67,25,33,78,127,179,206,197,152,147,119,92,73,54,97,-95,-145,-151,-28,52,40, +122,112,-5,3,19,-1,70,151,300,37,-1,73,84,107,120,-5,-20,33,122,196,275,269,251,196,209, +162,116,84,61,99,-204,-310,-280,-73,63,9,110,84,-108,-15,-114,-202,-287,-213,104,197,220,116,45,-5, +-40,51,53,4,99,174,261,318,298,139,132,92,46,14,29,106,-13,-19,58,-171,-124,182,217,250,159, +64,256,501,51,-71,-119,-176,-180,-140,-83,-26,-18,-45,-13,32,89,60,48,43,68,197,119,68,31,-39, +-76,-110,-150,-123,-17,-38,-83,-17,-498,-607,-393,-90,-20,154,158,10,-316,-152,-76,-169,-128,-53,9,6,36, +39,47,57,71,64,84,284,111,66,103,115,83,-39,-52,-101,-113,-118,-69,88,290,284,78,-20,-463,-921, +-901,-716,-557,-345,-207,-204,-156,-102,-17,0,17,5,21,-11,-34,-65,-14,217,96,30,-68,-119,-199,-226,-169, +-106,-12,-30,-138,-251,-336,-368,-417,-312,-280,139,533,584,553,551,348,56,54,4,29,16,-8,-64,26,49, +17,19,29,122,4,-77,-93,-188,-211,-118,-117,-153,-178,-252,-268,-256,-295,-485,-745,-492,690,749,723,652,570, +441,449,561,463,388,314,259,249,274,168,62,-65,-106,-159,-149,-221,-247,-200,-283,-261,-220,-272,-297,-375,-443, +-536,-625,-520,-213,264,504,494,490,480,465,440,448,442,427,372,343,290,246,198,141,138,120,103,89,56, +36,-4,-54,-102,-140,-183,-231,-234,-243,-270,-52,149,342,447,510,589,517,456,481,524,482,491,479,469,467, +444,425,410,385,364,338,312,257,227,189,197,82,109,150,180,210,236,257,277,307,328,338,328,336,343, +367,395,434,425,427,445,451,453,437,442,438,430,421,412,406,400,396,376,358,373,344,328,275,305,306, +312,318,327,337,350,361,375,381,394,406,411,413,412,416,477,73,53,49,53,62,96,66,54,62,52, +57,81,58,52,46,60,69,71,80,85,87,80,76,71,70,64,60,38,31,28,57,67,59,79,78, +55,59,51,42,52,98,181,66,42,86,66,76,121,70,58,52,73,92,108,134,130,120,114,101,88, +86,63,39,-28,-43,-36,40,72,40,89,78,26,45,17,-25,31,98,284,62,31,120,57,77,182,78, +37,45,83,126,161,207,208,173,153,124,102,93,57,26,-106,-143,-146,23,97,16,142,125,14,38,35, +-5,79,181,417,60,-26,111,71,110,195,28,-18,51,122,192,253,282,277,222,211,168,140,121,52,-29, +-247,-314,-278,2,100,-40,105,71,-82,-2,-15,-131,-231,-187,-47,147,240,190,76,0,-35,55,71,32,117, +173,227,341,318,162,167,102,36,25,41,72,62,43,-49,-71,18,270,247,292,328,140,167,652,60,-119, +-50,-72,-95,-111,-40,-4,-15,-42,-14,44,90,78,92,35,49,177,104,67,44,-71,-105,-78,-84,-19,73, +66,0,44,-499,-605,-281,-173,-96,-17,89,4,-306,-208,-117,-131,-124,-70,6,0,37,34,48,87,138,51, +91,345,160,92,79,4,-11,39,-121,-173,-114,-38,46,101,308,256,-14,-30,-4,-456,-801,-731,-570,-298,-129, +-137,-118,-64,-1,-4,10,35,34,-5,-5,-42,18,206,107,46,-56,-145,-214,-123,-157,-111,-12,-9,-90,-300, +-307,-329,-367,11,-906,-502,24,213,280,217,52,-101,-65,-66,-10,41,27,-41,21,52,91,-22,-32,89,15, +-35,-130,-138,-116,-78,-185,-177,-59,-135,-143,-150,-118,-296,-674,-864,649,803,818,734,679,535,507,583,497,409, +279,240,228,220,145,39,-72,-119,-136,-74,-142,-166,-133,-166,-157,-156,-154,-191,-302,-330,-428,-563,-603,-436,-13, +358,367,442,443,456,454,465,470,471,420,381,343,272,203,132,117,103,82,62,35,-38,-109,-151,-210,-254, +-295,-340,-354,-376,-414,-298,-203,-111,73,216,334,336,355,372,444,390,418,423,413,421,376,348,330,292,266, +239,214,156,108,61,62,-24,-1,16,30,46,58,66,100,141,180,209,234,254,261,271,300,333,330,323, +386,414,450,372,414,449,439,430,417,412,406,398,337,293,361,307,271,207,227,223,225,225,226,224,244, +258,272,283,296,315,317,320,319,322,379,86,68,71,73,80,115,78,68,79,67,70,92,72,66,61, +74,80,79,92,97,100,91,86,82,80,73,56,47,44,40,74,83,66,90,89,67,72,72,89,85, +127,204,82,55,100,78,88,128,85,74,67,84,98,109,141,142,140,123,110,98,94,63,11,-23,-25, +-19,72,100,47,104,91,41,58,43,38,67,128,308,76,43,134,69,81,182,85,53,58,91,123,139, +203,213,195,162,131,107,97,44,-45,-110,-122,-114,70,130,15,144,136,33,60,72,83,124,236,472,80, +-25,137,73,109,233,52,-7,67,130,182,222,286,288,246,211,169,143,114,8,-158,-277,-279,-233,65,144, +-38,130,81,-70,-1,29,-39,-190,-198,-129,130,268,238,104,4,-33,55,83,58,146,183,206,317,309,235, +168,78,26,18,37,61,91,82,-46,71,124,185,186,296,506,210,73,681,56,-141,-8,-40,-43,-61,16, +47,3,-25,-2,66,82,95,121,54,50,147,71,33,-26,-66,-72,-20,23,96,160,89,81,186,-330,-485, +-257,-242,-69,-81,-33,-57,-270,-252,-190,-89,-110,-80,-4,9,49,29,57,110,153,39,95,312,155,101,28, +-1,-2,48,-90,-107,0,30,89,117,242,233,10,8,160,-6,-531,-610,-480,-253,-86,-65,-72,-12,17,-9, +1,68,53,23,23,28,65,121,74,44,-42,-17,-47,-54,-155,-137,-39,-88,-120,-223,-317,-350,-267,38,-1127, +-950,-413,-119,23,-81,-184,-186,-157,-128,-35,59,57,-4,13,38,113,-14,-30,91,96,57,-88,-110,-131,-130, +-178,-130,-70,-61,-56,-85,-98,-230,-465,-908,377,634,733,652,646,536,488,533,480,405,255,216,176,131,113, +47,-16,-72,-72,-40,-91,-105,-117,-79,-85,-74,-78,-123,-236,-228,-310,-467,-529,-503,-319,62,279,414,434,471, +510,488,476,459,417,367,347,285,246,193,147,111,68,4,-71,-174,-237,-278,-336,-355,-374,-395,-435,-472,-516, +-469,-435,-407,-204,-20,127,213,226,248,343,274,312,331,321,338,275,244,217,163,123,88,88,63,26,9, +28,1,2,-12,-24,-35,-50,-67,-28,10,43,71,101,117,132,137,165,193,166,155,238,284,357,218,290, +370,353,341,324,318,310,295,213,154,275,201,157,98,99,90,84,76,69,55,73,82,95,104,114,128, +135,145,150,157,165,92,80,82,85,90,121,81,75,86,77,79,95,81,76,72,79,83,84,96,101, +107,96,91,86,84,75,55,53,53,51,80,88,74,94,94,76,83,91,111,120,147,204,89,60,100, +87,100,122,97,87,75,86,95,107,140,148,158,132,117,102,95,64,4,-12,-9,-4,81,104,54,103, +94,50,72,88,87,119,153,298,80,49,131,82,91,159,94,71,61,91,113,119,191,209,216,169,136, +107,96,36,-68,-97,-94,-70,75,127,36,133,143,55,97,138,173,221,313,492,99,-25,135,81,115,241, +73,14,72,131,159,181,277,295,295,230,182,141,110,2,-186,-260,-225,-171,74,131,-21,125,76,-60,35, +39,-28,-175,-233,-191,117,290,279,143,14,-43,49,87,74,170,191,197,249,257,255,113,46,40,15,18, +19,128,110,-130,133,184,85,150,326,638,288,11,598,96,-96,58,-83,-83,-40,33,79,43,-1,13,73, +68,106,141,106,97,143,88,60,-10,-12,8,73,82,151,221,85,101,247,-182,-358,-289,-267,-106,-76,-69, +-83,-198,-226,-209,-51,-93,-78,-14,29,68,23,70,128,130,46,97,217,158,143,61,65,36,24,-101,-108, +61,69,124,183,149,144,3,-37,124,105,-264,-417,-341,-204,-61,17,-27,34,47,-3,7,80,76,75,81, +111,102,73,108,105,44,75,64,30,-112,-107,10,-111,-147,-168,-256,-245,-130,13,-885,-1030,-643,-339,-166,-291, +-337,-214,-210,-172,-68,46,72,38,26,34,99,17,21,106,120,72,-36,-74,-107,-108,-49,-29,-114,-29,-41, +-114,-207,-293,-380,-685,-33,257,443,407,439,409,387,437,384,332,219,184,127,87,108,84,62,-7,-33,-33, +-37,-37,-52,-51,-78,-89,-108,-141,-209,-152,-177,-268,-350,-418,-430,-239,189,359,406,446,524,479,445,412,377, +330,311,272,263,225,161,96,34,-36,-127,-191,-240,-299,-352,-370,-384,-401,-430,-454,-482,-497,-518,-550,-374,-206, +-67,86,85,113,212,142,182,196,191,219,160,139,115,66,28,-3,12,14,1,5,34,19,-7,-34,-62, +-92,-127,-167,-141,-122,-101,-81,-53,-45,-15,-2,25,51,18,12,72,112,180,57,117,196,180,167,151,144, +134,117,63,19,118,60,30,-13,-22,-35,-47,-61,-72,-91,-76,-69,-62,-57,-53,-47,-33,-19,-6,5,-23, +89,84,80,88,93,120,77,77,89,85,86,94,88,85,79,79,80,88,95,98,103,93,88,83,81, +72,54,54,54,52,75,81,72,86,88,79,85,97,104,134,142,182,85,59,89,91,106,113,105,93, +74,81,88,105,130,149,158,128,112,95,87,60,6,-3,0,1,73,93,61,94,88,66,82,114,101, +140,144,253,69,47,113,96,105,137,104,87,55,82,98,115,172,196,221,160,130,98,89,31,-64,-76, +-68,-56,56,99,41,100,121,89,125,146,170,245,313,429,97,-28,110,90,130,231,90,34,63,125,136, +158,253,297,328,229,172,123,90,-4,-175,-227,-190,-153,53,103,16,102,62,6,70,119,0,-132,-236,-258, +76,274,306,189,37,-51,41,83,85,180,183,180,171,179,198,67,48,70,29,33,34,230,194,-168,101, +135,15,79,288,665,350,-145,343,151,23,114,-61,-108,-57,27,84,79,27,29,73,60,113,158,152,152, +135,116,98,10,32,44,68,125,153,97,82,99,170,-94,-263,-331,-320,-125,-59,-56,-79,-119,-176,-187,2, +-68,-65,-7,40,72,25,71,133,106,54,83,120,175,186,80,91,47,9,-66,-65,69,126,191,244,117, +71,-43,-70,44,-29,-120,-223,-212,-173,-67,86,13,61,66,15,21,81,93,118,128,157,138,79,142,145, +90,131,127,41,5,-3,-6,-122,-171,-204,-139,-76,-55,38,-482,-748,-638,-444,-287,-380,-373,-215,-224,-185,-98, +10,61,69,50,50,97,56,67,94,123,99,41,-15,-52,-87,-19,-13,-105,24,-29,-205,-298,-353,-386,-417, +-352,-122,88,125,174,242,258,284,228,197,145,155,119,104,108,98,103,16,-22,-15,22,34,33,-47,-81, +-125,-116,-136,-187,-132,-79,-10,-130,-245,-343,-392,52,218,297,329,426,391,356,338,322,292,286,244,236,194, +139,71,16,-30,-91,-110,-159,-230,-284,-308,-328,-357,-351,-351,-347,-403,-477,-559,-453,-339,-241,-66,-16,16,92, +38,72,77,82,108,71,60,47,17,-3,-21,-11,-12,-22,-23,1,-47,-78,-98,-125,-154,-188,-226,-218,-216, +-206,-195,-165,-158,-113,-91,-68,-43,-75,-74,-43,-16,27,-46,-9,41,31,23,13,10,4,-6,-37,-69,-6, +-49,-69,-110,-113,-126,-138,-151,-160,-176,-164,-159,-156,-153,-152,-151,-137,-122,-103,-91,-133,84,83,76,83,86, +106,71,73,82,85,86,88,87,85,75,73,74,87,89,91,92,86,82,77,76,70,55,55,55,51, +68,74,68,79,82,76,84,98,93,124,122,147,75,56,73,90,108,103,109,96,68,73,78,105,117, +139,141,115,102,83,80,61,21,13,13,12,65,80,62,82,80,71,88,123,95,129,119,195,59,44, +86,103,117,119,114,99,44,69,81,120,148,174,198,140,119,83,83,37,-38,-42,-35,-35,44,77,44, +90,107,92,137,138,131,209,262,334,85,-20,78,97,145,207,108,52,42,110,117,157,223,279,309,205, +149,87,70,3,-131,-166,-138,-107,49,77,34,80,53,32,97,197,69,-55,-190,-280,27,221,295,235,76, +-50,31,73,104,184,168,153,117,115,115,44,60,91,66,76,76,312,268,-119,36,56,47,87,262,606, +359,-252,0,207,176,92,21,-59,-81,18,88,111,49,36,77,68,126,161,162,163,107,145,131,21,27, +35,60,172,162,-45,75,57,-74,-117,-215,-317,-299,-102,-59,-51,-66,-24,-125,-176,36,-35,-46,7,40,62, +35,61,121,76,44,56,67,183,195,76,123,80,-18,1,42,82,191,260,260,120,30,-66,-79,13,-126, +-47,-68,-121,-129,-66,101,29,68,71,27,31,84,97,134,144,162,154,87,139,152,123,148,126,-1,50, +16,-110,-155,-176,-212,-30,49,-4,62,-192,-366,-480,-442,-363,-364,-314,-202,-202,-170,-116,-32,31,87,63,67, +102,87,95,63,130,133,76,3,-25,-23,-21,-17,-42,58,-9,-229,-298,-327,-333,-223,-482,-375,-219,-118,-30, +109,135,97,64,56,57,131,136,123,96,80,89,13,-11,11,77,90,75,4,-36,-87,-95,-116,-134,-179, +-95,112,34,-69,-217,-398,-85,32,127,156,250,235,220,230,244,236,259,198,183,135,105,56,24,-2,-32, +-44,-93,-149,-195,-222,-245,-279,-260,-253,-232,-280,-351,-433,-407,-360,-316,-178,-62,-28,21,-10,17,19,30,48, +26,16,13,-5,-12,-20,-28,-47,-68,-86,-84,-147,-171,-186,-207,-232,-258,-289,-281,-279,-275,-265,-240,-228,-173, +-139,-114,-88,-121,-113,-101,-83,-63,-93,-73,-47,-54,-57,-65,-64,-67,-70,-95,-117,-86,-118,-134,-163,-165,-178, +-188,-198,-206,-219,-211,-207,-203,-199,-197,-198,-185,-171,-151,-138,-184,78,79,70,74,75,88,64,66,70,79, +81,79,83,81,68,66,67,82,79,79,78,77,74,70,71,67,59,57,57,57,63,66,65,72,74, +68,79,92,83,109,102,111,64,51,56,84,103,93,111,97,61,64,69,102,102,120,112,96,87,74, +79,69,41,36,35,42,64,69,63,68,68,58,83,125,81,105,91,137,49,42,59,99,119,103,127, +112,35,59,67,122,123,143,150,110,100,70,82,54,5,4,8,22,43,61,53,75,88,66,129,125, +108,176,210,241,64,-12,42,92,148,178,128,70,13,89,97,158,190,238,240,158,117,61,74,43,-56, +-71,-50,4,74,61,44,46,29,1,92,235,95,-33,-167,-246,-3,160,252,274,126,-39,18,61,132,180, +154,134,82,65,46,36,78,115,98,97,88,304,252,-91,-49,-17,101,119,240,501,346,-250,-279,265,320, +28,74,5,-89,10,87,144,63,37,79,91,150,147,144,140,74,158,140,21,33,67,119,155,122,-87, +111,30,-339,-206,-198,-273,-230,-90,-69,-61,-50,58,-35,-128,52,-1,-29,20,35,55,51,42,90,38,17, +31,33,155,165,63,98,51,-19,33,96,79,190,252,236,108,5,-8,-68,8,-99,5,30,-64,-67,-43, +67,22,55,63,25,33,76,92,135,125,131,137,75,114,133,126,107,85,29,47,-24,-185,-161,-154,-151, +28,99,69,50,-75,-137,-320,-395,-410,-320,-248,-185,-162,-140,-116,-62,3,97,64,69,87,100,102,31,109, +130,98,67,38,22,23,-1,-51,-2,-36,-164,-229,-247,-225,-119,-473,-471,-402,-277,-144,2,20,-59,-66,-50, +-13,92,125,110,71,53,53,23,23,39,112,119,70,45,-1,-30,-69,-91,-70,-163,-133,8,57,5,-167, +-348,-166,-116,-31,-3,70,69,75,102,145,160,208,141,129,90,72,38,17,-2,-19,-44,-72,-92,-107,-131, +-155,-186,-175,-173,-159,-175,-197,-239,-267,-276,-273,-208,-84,-53,-14,-29,-4,3,16,29,12,-2,-4,-17,-21, +-26,-48,-71,-98,-122,-147,-175,-193,-215,-236,-260,-280,-306,-290,-283,-281,-274,-263,-252,-204,-166,-138,-111,-144,-134, +-129,-117,-105,-117,-105,-88,-95,-96,-104,-102,-106,-107,-127,-138,-133,-150,-160,-166,-175,-185,-194,-203,-211,-223,-218, +-216,-211,-208,-205,-207,-195,-184,-170,-158,-205,70,72,60,66,67,75,58,63,64,75,79,75,83,81,65, +63,61,79,73,70,63,65,64,63,65,64,60,58,58,61,57,58,61,63,63,57,70,75,63,92, +79,83,56,48,44,75,93,86,112,98,56,58,62,97,88,101,80,72,70,68,76,73,56,53,53, +70,65,60,61,54,51,40,69,115,65,79,61,87,38,39,44,91,113,94,138,126,34,54,58,121, +100,109,94,73,75,65,81,71,45,44,43,75,43,47,61,57,58,34,109,84,68,124,148,161,45, +-4,13,79,136,145,148,91,-10,68,83,163,155,181,147,92,77,59,84,77,14,14,31,111,96,52, +55,13,-6,-37,64,261,101,-53,-188,-235,-32,108,194,292,175,-14,7,51,162,166,135,120,53,28,10, +43,90,122,102,101,109,238,153,-125,-120,-62,136,135,209,384,321,-245,-451,309,425,1,108,43,-77,11, +85,167,80,46,80,115,175,123,120,113,62,156,142,55,80,107,145,130,85,-95,159,41,-429,-232,-165, +-207,-182,-50,-102,-98,-74,71,52,-27,70,31,-8,32,31,55,59,24,50,-6,-16,4,-2,92,108,49, +40,-3,-8,56,121,70,179,215,196,80,2,92,-4,24,10,62,86,-19,-16,-27,7,3,30,51,20, +30,60,84,122,83,84,95,55,84,99,97,77,64,47,44,-46,-235,-157,-139,-93,28,102,144,38,-46, +-91,-235,-351,-432,-303,-220,-167,-118,-99,-94,-75,-15,93,58,60,50,98,98,29,77,109,142,119,80,26, +29,-16,-96,-78,-73,-81,-143,-164,-118,-58,-390,-442,-434,-323,-172,-82,-76,-149,-147,-118,-59,30,73,85,46, +35,32,48,60,58,109,108,72,51,14,-10,-51,-59,-27,-85,-136,-179,-69,-61,-174,-294,-221,-220,-147,-128, +-75,-63,-38,-4,54,83,141,92,87,68,46,19,-7,-26,-43,-65,-47,-29,-7,-29,-55,-84,-85,-94,-99, +-88,-63,-55,-116,-175,-210,-212,-99,-73,-37,-39,-14,-5,7,24,6,-7,-10,-15,-16,-17,-43,-60,-78,-95, +-132,-124,-141,-168,-187,-210,-224,-242,-233,-231,-236,-240,-254,-256,-224,-184,-155,-127,-138,-128,-135,-130,-129,-118,-117, +-108,-114,-115,-122,-122,-128,-130,-132,-127,-154,-150,-149,-135,-149,-154,-161,-166,-172,-181,-181,-183,-181,-181,-179,-186, +-172,-166,-157,-148,-181,60,61,50,56,57,62,52,56,56,67,71,68,78,76,59,57,53,72,62,58, +50,53,53,56,58,58,56,53,52,59,51,50,55,52,50,44,58,56,40,62,56,63,50,46,38, +66,82,77,108,96,54,52,54,86,73,77,54,51,54,62,67,67,59,53,55,80,60,51,57,37, +31,20,52,92,48,54,39,56,35,42,40,82,106,90,144,136,42,53,51,109,79,76,51,43,53, +65,78,78,64,55,50,99,44,41,65,35,25,-2,75,40,20,54,86,110,40,13,2,67,118,113, +163,110,-14,53,79,170,123,118,64,34,39,60,81,79,41,39,64,170,103,51,60,-24,-53,-80,25, +259,137,-35,-182,-250,-50,76,130,290,214,26,2,45,182,144,109,103,36,9,9,65,98,125,109,126, +175,168,41,-165,-154,-69,156,171,210,284,260,-211,-545,284,451,-12,133,71,-36,16,77,175,104,68,82, +135,183,92,96,97,68,140,139,109,108,121,138,116,80,-66,193,85,-318,-196,-144,-137,-113,29,-138,-141, +-114,36,91,44,58,54,21,42,33,56,65,10,7,-48,-41,-19,-28,35,58,55,-3,-42,-44,66,146, +70,198,190,126,60,27,171,84,59,114,118,108,5,11,-18,-40,-12,11,38,22,30,46,75,100,45, +45,51,45,72,85,97,62,36,39,20,-70,-236,-130,-105,-60,13,90,174,55,-53,-130,-208,-317,-443,-324, +-234,-158,-89,-62,-61,-70,-23,70,48,47,12,73,81,39,35,60,132,102,73,15,-14,-45,-85,-120,-104, +-21,-79,-100,-72,-32,-288,-347,-368,-282,-137,-120,-134,-191,-188,-159,-95,-42,5,61,29,32,29,71,81,72, +88,90,106,57,33,-10,-38,-51,-51,-54,-131,-266,-228,-194,-187,-245,-273,-308,-246,-232,-193,-160,-114,-69,-12, +23,79,57,64,68,35,11,-19,-30,-43,-39,12,44,88,58,32,4,-8,-23,-41,-26,7,37,-31,-114, +-181,-230,-108,-92,-59,-51,-28,-21,-12,7,-4,-8,-8,-2,5,13,-15,-27,-37,-50,-85,-74,-88,-108,-119, +-133,-139,-146,-148,-155,-166,-181,-206,-221,-207,-176,-153,-128,-103,-97,-111,-114,-124,-91,-101,-104,-104,-103,-107,-108, +-113,-114,-98,-81,-135,-114,-106,-86,-95,-96,-100,-100,-101,-104,-109,-113,-116,-118,-119,-127,-116,-115,-111,-108,-108, +49,49,44,46,47,52,45,50,50,58,62,61,71,70,54,49,42,60,50,47,40,43,44,48,48, +47,45,41,41,54,42,41,45,39,37,30,44,41,31,39,41,50,47,45,35,58,70,69,100,92, +53,47,45,66,56,56,38,38,42,53,53,48,39,30,38,79,51,43,47,20,11,3,35,71,47, +42,33,41,40,51,42,78,101,90,148,140,55,54,42,81,59,52,30,30,41,62,64,61,44,27, +25,107,39,33,55,8,-4,-35,42,26,9,11,49,80,42,30,7,64,101,91,173,127,1,48,75, +156,91,65,15,6,21,54,61,38,2,-10,39,189,94,48,52,-59,-95,-113,1,197,170,31,-113,-232, +-39,66,80,273,245,75,9,45,187,118,83,83,34,21,37,90,107,130,126,161,251,91,-59,-175,-156, +-53,138,208,224,204,166,-115,-549,155,356,-17,130,95,25,20,54,172,126,92,81,145,174,67,71,77, +67,105,117,139,132,138,136,97,67,-16,206,117,-200,-149,-127,-102,-15,101,-127,-130,-100,26,119,83,27, +61,43,47,36,56,75,5,-29,-64,-52,-36,-46,-7,28,91,-34,-73,-37,60,136,91,185,141,32,24, +41,188,151,98,156,135,93,-10,7,-19,-54,-8,10,29,31,37,37,58,72,25,17,25,50,76,80, +98,27,-2,24,-16,-78,-169,-80,-51,-14,36,80,131,87,-95,-151,-213,-300,-424,-351,-263,-164,-82,-41,-34, +-53,-24,32,32,38,1,37,45,36,-2,14,84,79,60,-3,-33,-60,-71,-158,-152,-22,-43,-46,-33,-53, +-211,-250,-270,-209,-91,-130,-167,-210,-205,-181,-131,-108,-56,32,20,36,32,75,83,78,61,67,115,60,36, +-15,-30,-56,-86,-92,-149,-237,-304,-294,-219,-216,-296,-345,-305,-291,-265,-215,-150,-93,-47,-19,29,27,51,66, +34,13,-12,-3,0,29,73,96,136,106,83,57,36,16,-14,-4,9,31,-32,-110,-188,-250,-112,-110,-84, +-66,-48,-39,-33,-16,-18,-15,-7,5,18,36,11,-2,-11,-25,-58,-54,-59,-66,-69,-70,-67,-62,-71,-82, +-93,-110,-133,-150,-153,-140,-130,-118,-61,-61,-70,-76,-88,-53,-63,-70,-65,-59,-58,-56,-58,-55,-42,-28,-78, +-59,-51,-35,-39,-37,-37,-35,-34,-32,-39,-43,-47,-51,-53,-59,-55,-57,-59,-61,-31,37,36,39,40,41, +44,38,44,44,51,55,54,64,63,50,42,32,47,39,38,31,34,34,38,34,31,25,23,25,44, +32,31,35,27,24,18,30,27,32,29,34,42,48,45,33,51,62,64,92,86,54,42,33,41,40, +42,29,33,36,43,33,18,3,-6,10,68,40,35,36,4,-7,-11,18,55,64,46,38,35,47,61, +47,79,100,95,150,142,71,54,31,43,42,41,24,29,38,54,39,23,-11,-27,-16,95,31,30,46, +-11,-28,-47,14,22,26,-2,34,64,57,50,19,68,93,87,182,145,30,51,65,113,59,35,0,9, +26,50,24,-33,-83,-94,-17,173,75,49,44,-85,-130,-119,-16,123,187,109,-17,-192,-36,56,62,241,256, +130,25,44,174,92,63,73,54,57,71,106,113,133,139,180,286,18,-139,-178,-127,-14,97,247,248,131, +78,-24,-483,-54,160,43,110,97,83,31,38,162,148,118,78,142,151,54,48,50,62,73,100,167,165, +156,142,69,45,37,191,115,-132,-94,-91,-91,71,156,-50,-54,-32,46,138,107,6,56,53,48,39,56, +86,7,-47,-52,-48,-47,-49,-35,4,95,-47,-66,0,63,112,117,105,34,-53,-39,26,173,186,112,141, +101,46,-45,-20,-35,-56,11,24,24,47,51,34,37,40,17,-5,11,56,79,77,86,13,-19,-17,-48, +-75,-79,-32,7,75,101,103,104,109,-118,-132,-218,-287,-354,-343,-272,-173,-92,-39,-23,-34,-25,-11,14,28, +4,13,16,32,-9,-2,39,56,49,3,-22,-66,-71,-172,-181,-71,-36,-3,17,-68,-173,-187,-192,-154,-81, +-151,-200,-221,-209,-189,-156,-154,-104,-9,15,41,38,66,70,70,36,38,72,58,31,-17,-33,-55,-76,-110, +-150,-188,-261,-282,-249,-204,-272,-309,-294,-277,-260,-208,-143,-87,-61,-53,-20,-11,31,49,29,17,9,27,44, +72,90,101,120,105,96,90,60,25,-19,-27,-37,-41,-92,-147,-210,-247,-123,-133,-108,-90,-73,-62,-58,-44, +-42,-33,-20,-9,3,25,11,6,-2,-11,-37,-23,-20,-21,-19,-13,-6,4,-12,-22,-33,-47,-66,-82,-97, +-104,-108,-115,-40,-48,-41,-43,-46,-32,-31,-30,-22,-14,-11,-5,-4,1,-2,3,-21,-11,-7,3,1,5, +6,8,9,12,5,0,-5,-11,-15,-20,-22,-26,-31,-36,8,24,24,34,33,33,34,30,35,34,41, +44,44,54,53,43,31,19,30,26,27,22,25,25,26,19,13,3,3,8,30,19,18,23,13,10, +5,16,17,34,23,29,34,48,44,27,44,54,58,82,77,54,32,18,15,23,30,22,31,31,30, +7,-15,-34,-38,-16,48,24,22,21,-11,-23,-24,2,44,86,60,49,35,55,70,46,80,98,98,148, +140,83,48,15,5,27,34,24,38,40,44,5,-27,-74,-81,-57,66,12,14,31,-31,-49,-57,-6,23, +56,-1,33,60,87,77,30,77,94,98,194,165,64,56,47,54,32,23,4,31,39,41,-29,-115,-169, +-165,-62,136,47,33,24,-107,-153,-119,-30,79,220,196,77,-146,-57,30,62,199,248,184,46,40,152,70, +56,81,85,95,96,106,110,134,147,183,268,-55,-213,-213,-110,12,38,252,252,66,20,26,-404,-285,-67, +151,100,86,122,48,39,148,170,142,71,122,116,47,29,27,57,49,86,176,177,154,116,44,41,94, +141,75,-90,-42,-38,-80,120,225,73,66,66,77,136,106,-7,51,60,45,42,56,92,14,-47,-26,-35, +-47,-39,-51,-19,70,-24,-24,8,60,70,110,-10,-88,-94,-94,12,161,213,87,86,35,-14,-73,-41,-48, +-57,27,43,28,66,62,27,14,12,15,-14,3,61,89,90,89,20,-15,-46,-68,-67,17,4,64,194, +171,140,104,102,-99,-105,-206,-258,-261,-301,-251,-171,-103,-47,-29,-28,-28,-47,1,18,3,1,5,29,-10, +-13,4,25,32,14,-19,-59,-66,-157,-184,-144,-60,7,43,-49,-145,-148,-147,-139,-123,-194,-235,-234,-212,-188, +-163,-172,-133,-51,6,41,42,57,59,55,21,14,20,49,33,-4,-35,-56,-71,-82,-101,-147,-174,-210,-237, +-181,-221,-238,-234,-213,-197,-159,-112,-71,-71,-90,-79,-60,-4,16,19,22,41,48,59,68,67,70,68,74, +84,106,61,15,-40,-68,-96,-117,-148,-175,-211,-218,-144,-165,-140,-130,-113,-101,-97,-82,-78,-62,-47,-38,-29, +-9,-5,3,5,9,2,34,38,38,41,47,49,57,35,25,14,1,-15,-31,-57,-80,-99,-122,-47,-61, +-44,-40,-31,-39,-29,-18,-9,-2,2,9,12,15,5,5,5,9,11,20,17,20,22,23,23,26,19, +13,5,-2,-9,-14,-19,-26,-33,-40,3,11,13,29,26,25,25,21,26,24,32,35,35,43,42,36, +19,7,14,14,15,12,16,15,14,3,-5,-17,-13,-8,14,5,6,12,0,-4,-6,4,8,37,22, +26,26,47,42,18,37,47,51,70,66,50,21,3,-8,6,19,15,28,26,15,-18,-45,-64,-60,-34, +23,6,5,8,-27,-37,-32,-11,34,109,75,61,35,63,75,37,81,96,98,139,131,86,37,-2,-25, +9,25,25,47,42,28,-31,-76,-125,-116,-83,28,-10,-5,23,-53,-69,-63,-23,24,98,23,42,58,116, +101,34,85,99,111,206,183,92,56,24,-3,4,17,14,54,51,21,-85,-183,-227,-199,-85,82,14,6, +14,-126,-165,-108,-42,56,246,278,163,-82,-80,-6,63,154,228,240,65,32,128,51,55,95,110,120,103, +95,101,127,146,163,189,-119,-264,-262,-104,24,-21,223,219,-2,-14,29,-329,-481,-265,252,115,81,131,60, +45,130,181,156,62,93,76,41,19,18,52,26,65,162,174,139,74,25,42,138,66,-9,-118,-5,24, +-48,130,288,221,202,172,115,133,102,-7,54,70,39,44,55,91,22,-38,-3,-20,-35,-27,-53,-28,42, +-11,7,34,57,34,97,-95,-161,-97,-91,30,157,233,43,0,-38,-61,-82,-38,-44,-49,32,56,36,78, +64,12,-3,-6,15,-13,5,66,92,97,89,35,3,-48,-90,-64,96,22,103,284,229,179,101,86,-64, +-85,-167,-207,-189,-237,-202,-149,-103,-58,-48,-38,-38,-69,-4,11,0,-1,3,21,-7,-17,-16,1,11,18, +-7,-29,-46,-125,-170,-205,-91,-8,33,-22,-115,-113,-116,-137,-179,-230,-258,-254,-220,-188,-163,-170,-142,-84,-13, +29,49,48,46,41,13,3,-8,27,33,20,-22,-48,-71,-55,-53,-95,-105,-138,-162,-138,-167,-174,-174,-151, +-134,-115,-94,-71,-92,-127,-137,-112,-53,-35,-1,22,68,59,56,53,43,38,25,43,60,90,38,-7,-57, +-91,-126,-152,-164,-170,-182,-176,-152,-180,-169,-161,-151,-141,-137,-123,-114,-92,-74,-66,-58,-41,-23,-8,6,22, +41,67,67,68,69,71,67,70,49,39,28,17,6,-8,-38,-68,-96,-125,-59,-73,-60,-56,-45,-55,-46, +-32,-25,-19,-14,-8,-4,-1,-9,-9,5,6,8,14,11,12,13,13,13,15,9,3,-4,-11,-18,-22, +-30,-36,-43,-51,-15,-1,2,21,18,17,14,11,17,11,22,25,24,30,29,26,7,-4,0,2,4, +3,8,6,2,-11,-19,-30,-23,-18,-1,-7,-5,3,-12,-16,-15,-8,-3,35,23,20,14,41,37,7, +31,40,43,56,52,44,8,-12,-23,-10,7,8,24,19,-1,-38,-64,-79,-64,-39,3,-8,-9,1,-40, +-50,-39,-23,20,118,83,62,27,64,75,24,80,93,92,123,114,81,22,-19,-42,-10,12,23,51,41, +8,-60,-107,-148,-121,-86,-5,-24,-20,20,-70,-85,-64,-37,11,117,48,45,44,133,119,37,92,103,118, +212,192,109,49,-3,-45,-26,5,19,70,57,-7,-125,-215,-240,-184,-76,40,-8,-15,17,-136,-170,-98,-51, +47,247,330,231,-25,-104,-53,54,106,198,289,78,18,103,37,55,101,121,128,97,88,94,107,135,127, +85,-158,-279,-292,-92,27,-73,178,165,-84,-40,-24,-267,-583,-383,300,140,88,112,65,51,106,179,161,57, +68,45,39,19,18,42,7,46,134,154,116,55,12,45,171,-14,-100,-144,25,76,7,98,315,342,318, +259,145,126,107,18,68,77,35,43,51,84,31,-24,11,-9,-23,-27,-49,-32,-4,7,51,82,57,5, +67,-144,-187,-99,-24,94,166,242,-6,-83,-110,-93,-63,-19,-30,-29,29,54,42,76,56,-4,-13,-17,3, +-9,10,57,69,80,77,54,25,-44,-85,-36,140,66,147,307,267,207,99,67,-35,-54,-119,-152,-152,-170, +-140,-112,-89,-62,-67,-59,-54,-77,-11,3,5,2,4,16,11,0,-13,0,7,25,17,-1,-31,-83,-132, +-213,-102,-25,5,-16,-79,-86,-88,-125,-217,-249,-272,-268,-227,-190,-165,-160,-140,-108,-39,7,54,39,34,29, +10,-3,-22,3,21,39,1,-26,-52,-46,-32,-30,-47,-71,-68,-82,-114,-117,-125,-105,-90,-92,-97,-96,-122, +-157,-177,-155,-108,-97,-34,8,74,60,53,49,34,25,10,21,28,43,5,-23,-51,-87,-127,-160,-156,-145, +-139,-129,-134,-159,-174,-162,-164,-158,-154,-147,-131,-109,-91,-83,-73,-62,-40,-29,-10,7,41,44,40,42,40, +38,34,33,20,13,6,1,0,-7,-31,-60,-86,-111,-63,-71,-66,-65,-61,-62,-58,-52,-45,-41,-36,-29, +-25,-21,-24,-25,-7,-7,-5,-6,-6,-7,-8,-9,-9,-9,-13,-16,-20,-25,-30,-30,-39,-44,-49,-55,-30, +-11,-7,12,8,6,0,1,6,-1,12,14,12,17,15,14,-6,-14,-12,-10,-7,-6,0,-3,-10,-22, +-29,-37,-28,-23,-12,-16,-14,-5,-22,-25,-22,-17,-14,25,18,10,-5,32,32,-4,24,32,34,41,36, +37,-6,-26,-33,-24,-6,0,16,8,-20,-52,-72,-81,-56,-33,-9,-17,-19,-6,-49,-58,-43,-33,4,104, +76,53,9,57,69,10,77,90,82,100,90,73,4,-36,-50,-27,-2,17,47,32,-18,-79,-120,-148,-104, +-71,-22,-31,-31,13,-84,-97,-61,-49,-7,101,48,32,16,141,133,37,97,105,117,206,189,115,34,-30, +-69,-51,-12,17,70,47,-45,-151,-218,-221,-135,-38,24,-17,-28,17,-139,-165,-84,-58,41,240,353,273,16, +-136,-110,31,61,162,314,83,4,75,26,53,91,115,121,92,84,85,82,118,89,-7,-182,-273,-285,-76, +21,-112,115,91,-161,-69,-111,-250,-601,-424,276,165,108,89,62,56,81,169,162,61,52,27,44,32,26, +27,-7,24,87,125,97,40,6,47,187,-70,-148,-127,45,105,69,44,324,410,394,312,147,101,105,64, +85,80,34,37,41,72,39,-6,14,-5,-25,-39,-44,-31,-28,48,102,115,71,-2,5,-164,-186,-137,74, +186,155,240,-62,-136,-172,-118,-37,-7,-23,-10,16,39,38,58,36,-14,-20,-29,-18,-7,12,39,39,58, +67,72,43,-31,-45,14,146,132,196,259,255,193,92,29,-15,8,-63,-94,-105,-106,-80,-69,-66,-54,-74, +-76,-71,-71,-27,-8,17,3,4,15,31,27,7,10,13,29,26,6,-37,-49,-77,-155,-83,-38,-9,-28, +-50,-72,-84,-128,-238,-266,-279,-266,-226,-190,-165,-148,-132,-119,-64,-18,43,34,33,26,16,1,-21,-9,8, +49,24,2,-20,-36,-26,9,-8,-22,-11,-35,-69,-67,-81,-70,-58,-79,-106,-129,-150,-175,-196,-180,-152,-147, +-70,-15,58,45,43,44,27,18,6,4,-2,-4,-23,-33,-41,-71,-106,-137,-126,-108,-97,-86,-102,-115,-145, +-134,-146,-144,-138,-140,-120,-107,-93,-85,-77,-72,-56,-53,-40,-27,4,-4,-7,-5,-7,-7,-8,-9,-14,-19, +-23,-24,-21,-26,-38,-57,-74,-89,-64,-66,-66,-65,-64,-63,-62,-61,-58,-54,-50,-46,-42,-37,-41,-44,-22, +-26,-26,-32,-29,-31,-31,-32,-32,-32,-35,-37,-40,-43,-46,-46,-52,-54,-56,-59,-51,-18,-15,2,0,-1, +-11,-6,-2,-11,4,6,3,5,3,6,-14,-22,-19,-17,-15,-12,-8,-11,-20,-29,-34,-39,-28,-24,-19, +-21,-20,-11,-28,-31,-26,-24,-22,13,10,-1,-23,22,25,-11,19,26,28,25,21,31,-16,-35,-40,-33, +-16,-7,5,-5,-35,-61,-73,-74,-40,-20,-14,-22,-27,-12,-53,-61,-45,-39,-13,82,64,43,-13,47,60, +-2,74,86,73,74,63,68,-12,-47,-53,-38,-13,11,33,14,-41,-92,-120,-133,-74,-45,-25,-32,-38,8, +-86,-99,-57,-59,-28,77,38,11,-23,134,141,37,104,110,114,187,172,116,14,-50,-77,-64,-27,13,54, +22,-77,-165,-204,-186,-71,14,24,-19,-39,9,-130,-148,-72,-66,28,217,359,302,54,-159,-164,-4,25,127, +308,82,-4,48,20,51,69,95,106,90,75,71,59,96,52,-74,-190,-255,-254,-52,26,-112,63,20,-211, +-99,-184,-269,-572,-424,184,179,140,85,56,54,60,152,156,71,43,18,49,47,35,11,-13,9,43,99, +79,27,-4,42,194,-95,-164,-99,42,114,134,4,310,423,424,329,120,52,84,114,102,84,33,30,30, +54,46,13,11,-8,-34,-45,-31,-24,-30,74,128,138,95,7,-65,-151,-150,-160,181,261,96,212,-111,-161, +-213,-141,-16,-6,-22,0,-2,16,25,29,10,-19,-28,-42,-38,-6,12,18,16,42,58,74,49,7,2, +62,145,187,221,162,185,138,76,-14,16,76,3,-25,-34,-39,-24,-28,-38,-37,-62,-82,-79,-60,-43,-20, +25,3,3,13,40,44,26,20,17,19,22,2,-49,-33,-28,-55,-41,-37,-11,-22,-38,-69,-104,-152,-249, +-276,-276,-246,-216,-185,-160,-134,-119,-116,-79,-42,16,31,41,28,25,12,-3,-10,2,52,35,20,3,-17, +-19,12,8,3,-1,-15,-36,-32,-48,-46,-37,-72,-114,-155,-169,-182,-201,-187,-174,-167,-95,-35,32,24,26, +33,21,13,4,-4,-16,-27,-32,-32,-30,-50,-70,-91,-78,-63,-51,-46,-78,-82,-105,-101,-114,-113,-104,-108, +-92,-86,-79,-75,-70,-72,-64,-67,-61,-52,-33,-36,-36,-33,-32,-30,-27,-26,-29,-34,-38,-40,-40,-46,-50, +-60,-68,-73,-67,-67,-67,-66,-65,-66,-65,-67,-67,-66,-64,-63,-60,-57,-59,-61,-44,-48,-48,-51,-49,-49, +-49,-49,-49,-47,-51,-53,-56,-59,-61,-62,-63,-63,-64,-65,-74,-20,-19,-5,-6,-7,-21,-10,-7,-18,-3, +0,-2,-5,-7,0,-19,-25,-26,-22,-19,-14,-13,-16,-24,-31,-34,-36,-24,-20,-20,-22,-22,-13,-29,-32, +-27,-26,-27,1,3,-8,-37,12,20,-12,17,22,26,13,9,27,-22,-39,-44,-37,-23,-10,-5,-16,-42, +-63,-68,-63,-21,-4,-13,-22,-30,-16,-52,-57,-44,-41,-24,55,52,35,-34,36,48,-8,70,83,70,51, +37,66,-23,-53,-56,-44,-21,7,16,-5,-52,-96,-110,-109,-38,-12,-19,-27,-37,3,-81,-94,-56,-62,-41, +47,29,-9,-63,114,142,40,112,118,113,159,146,115,-5,-64,-78,-66,-34,14,31,-7,-95,-167,-181,-146, +-6,68,32,-15,-46,-6,-118,-125,-66,-67,14,176,346,315,87,-164,-204,-46,-1,95,270,78,-3,23,21, +51,43,71,85,84,59,53,43,77,25,-110,-189,-232,-208,-25,38,-73,25,-41,-223,-115,-219,-285,-525,-411, +51,182,179,98,46,40,41,127,141,81,40,12,48,55,35,3,-8,3,9,63,53,27,-7,42,195, +-104,-167,-64,28,116,204,-14,267,406,402,307,80,-14,41,145,115,88,26,23,20,33,53,32,7,-11, +-37,-38,-21,-20,-26,85,139,158,118,20,-107,-108,-75,-111,235,256,7,142,-143,-180,-222,-150,-8,-4,-15, +4,-17,-6,9,-2,-16,-20,-38,-56,-52,-11,4,-10,-5,24,42,64,48,47,47,103,146,221,216,60, +89,69,48,-46,70,124,58,33,30,18,18,5,-15,-19,-34,-73,-80,-54,-51,-25,22,4,5,12,43, +50,41,28,16,7,10,-12,-56,-19,16,54,22,-4,16,25,-50,-76,-130,-181,-255,-278,-264,-216,-199,-175, +-151,-119,-103,-102,-86,-62,-17,27,48,32,31,23,21,-5,6,44,40,34,15,2,-9,5,7,3,-20, +-24,-10,-9,-28,-36,-36,-74,-120,-167,-176,-179,-195,-179,-176,-163,-104,-48,5,6,14,33,26,19,15,6, +-9,-25,-22,-15,-9,-19,-27,-39,-28,-17,-8,-11,-64,-65,-80,-75,-84,-83,-72,-72,-62,-61,-60,-58,-58, +-63,-63,-67,-63,-56,-48,-40,-40,-37,-36,-33,-29,-26,-29,-36,-40,-43,-45,-52,-53,-59,-62,-63,-61,-58, +-64,-65,-68,-61,-65,-70,-73,-73,-73,-75,-74,-74,-69,-64,-62,-60,-57,-52,-52,-52,-51,-51,-51,-49,-52, +-54,-56,-59,-60,-61,-61,-60,-60,-60,-76,-20,-20,-9,-8,-10,-26,-12,-11,-20,-6,-4,-4,-11,-13,-3, +-21,-26,-29,-24,-21,-14,-16,-19,-26,-31,-32,-32,-18,-15,-18,-20,-21,-15,-28,-30,-26,-25,-28,-8,-2, +-11,-44,5,16,-8,17,21,28,5,0,24,-25,-40,-47,-37,-25,-11,-14,-26,-45,-62,-61,-50,-3,12, +-7,-20,-31,-21,-48,-51,-39,-39,-28,30,41,31,-47,25,37,-6,66,80,73,35,18,65,-29,-53,-60, +-46,-25,3,-2,-24,-59,-96,-97,-86,-6,18,-6,-17,-35,-8,-73,-83,-51,-59,-43,15,20,-19,-89,90, +137,49,120,128,119,129,117,114,-20,-70,-77,-63,-33,15,5,-37,-106,-164,-156,-109,50,113,45,-8,-52, +-29,-106,-99,-54,-60,0,129,311,308,114,-151,-224,-85,-15,70,210,77,6,-2,25,54,18,45,58,65, +36,34,34,55,1,-122,-187,-209,-142,3,50,-16,-2,-87,-212,-120,-224,-273,-470,-394,-88,176,220,120,34, +18,20,98,121,89,42,12,43,50,30,5,-2,-5,-22,20,22,17,-1,47,174,-101,-150,-12,20,120, +277,-17,206,392,342,249,34,-81,-14,149,120,90,18,15,8,15,57,47,3,-11,-31,-27,-22,-20,-12, +91,140,155,122,31,-113,-57,4,-10,195,144,-95,38,-156,-197,-205,-137,-13,4,2,10,-19,-19,-4,-26, +-36,-18,-48,-67,-61,-23,-16,-40,-24,5,26,46,40,75,94,138,138,234,192,-3,5,4,12,-65,135, +153,97,70,63,53,40,25,1,-3,-3,-55,-72,-54,-54,-28,8,6,12,13,44,50,41,28,13,-3, +-16,-35,-56,1,59,144,86,54,78,102,-82,-96,-155,-202,-252,-265,-242,-184,-178,-160,-136,-106,-87,-84,-89, +-77,-44,18,45,36,36,34,41,6,10,33,44,51,35,21,3,4,-4,-13,-46,-55,4,3,-22,-42, +-56,-87,-127,-170,-172,-168,-181,-161,-161,-141,-100,-55,-23,-8,10,44,41,35,35,24,11,-7,0,8,17, +13,13,9,12,14,18,10,-50,-49,-63,-54,-60,-60,-51,-49,-44,-45,-47,-46,-48,-55,-57,-59,-55,-46, +-46,-31,-33,-31,-31,-29,-25,-23,-26,-32,-36,-40,-45,-50,-50,-51,-52,-51,-41,-37,-49,-54,-61,-46,-56, +-62,-66,-68,-68,-72,-72,-74,-62,-52,-63,-55,-49,-38,-40,-40,-40,-39,-39,-38,-41,-42,-43,-45,-46,-47, +-46,-44,-43,-42,-55,-19,-19,-11,-8,-9,-26,-11,-11,-17,-6,-4,-1,-13,-15,-3,-19,-24,-29,-24,-21, +-14,-17,-20,-25,-29,-28,-26,-12,-9,-13,-17,-19,-16,-25,-27,-23,-23,-25,-12,-4,-10,-42,2,14,0, +17,20,32,2,-4,22,-23,-38,-49,-37,-26,-13,-21,-32,-47,-59,-53,-37,10,23,2,-15,-30,-26,-44, +-43,-32,-34,-26,13,33,30,-48,19,30,2,63,77,81,26,7,63,-30,-50,-64,-49,-29,-2,-18,-38, +-65,-92,-84,-66,18,41,10,-5,-30,-23,-65,-72,-42,-51,-36,-2,17,-18,-97,69,128,60,125,139,131, +103,91,113,-29,-71,-77,-59,-31,9,-23,-64,-116,-155,-130,-74,90,141,61,2,-54,-56,-97,-75,-38,-49, +-13,80,261,287,138,-123,-220,-110,-22,51,141,80,22,-25,32,57,-3,19,27,39,14,20,27,32,-20, +-119,-187,-189,-67,31,64,41,-18,-118,-188,-114,-208,-226,-402,-365,-206,150,249,147,28,-5,-3,68,101,92, +47,16,37,36,19,9,-2,-11,-36,-12,-5,1,10,49,132,-96,-127,46,25,133,340,-10,144,386,257, +161,-9,-129,-62,124,115,90,11,5,-3,5,55,56,2,-4,-16,-13,-24,-19,9,88,127,134,110,35, +-89,-20,64,130,91,-37,-195,-65,-155,-205,-170,-105,-19,15,21,15,-11,-24,-13,-40,-47,-19,-56,-73,-64, +-38,-38,-59,-39,-16,8,20,34,97,138,166,134,221,158,-11,-50,-44,-19,-74,190,166,119,87,78,64, +44,28,10,8,22,-28,-55,-56,-54,-32,-11,5,18,16,41,44,34,25,10,-17,-41,-46,-39,36,102, +194,135,117,156,181,-111,-110,-177,-216,-241,-237,-206,-150,-153,-141,-116,-95,-76,-71,-87,-82,-62,2,33,39, +41,43,51,23,19,30,50,62,54,40,19,9,-9,-29,-68,-87,4,1,-26,-53,-80,-102,-136,-169,-165, +-156,-164,-137,-133,-106,-87,-58,-45,-17,12,53,48,46,48,38,30,18,25,31,42,40,42,42,35,27, +25,15,-37,-34,-46,-39,-44,-45,-40,-39,-37,-37,-40,-38,-40,-46,-48,-46,-41,-32,-35,-17,-21,-20,-21, +-21,-19,-18,-21,-27,-32,-37,-42,-47,-44,-42,-40,-39,-18,-13,-26,-32,-43,-27,-38,-46,-48,-50,-51,-54, +-55,-56,-43,-32,-47,-36,-30,-18,-21,-21,-21,-21,-22,-21,-23,-24,-25,-26,-27,-29,-26,-25,-23,-20,-26, +-15,-16,-10,-7,-8,-23,-9,-10,-14,-7,-4,1,-13,-15,-4,-17,-21,-29,-23,-20,-13,-17,-19,-23,-25, +-23,-20,-8,-5,-8,-12,-15,-17,-22,-23,-19,-19,-18,-10,-2,-5,-33,2,14,7,17,20,35,1,-5, +18,-20,-34,-50,-37,-28,-16,-27,-36,-46,-54,-43,-22,19,29,9,-9,-26,-30,-39,-36,-25,-26,-19,4, +27,30,-41,19,27,12,58,72,90,23,3,59,-27,-44,-70,-52,-35,-10,-32,-49,-67,-84,-68,-42,33, +53,22,7,-22,-35,-59,-63,-34,-39,-18,-2,24,-8,-88,54,117,72,127,148,146,83,71,110,-32,-66, +-80,-60,-37,-6,-50,-87,-122,-141,-102,-32,116,150,70,13,-49,-77,-90,-58,-23,-31,-27,29,195,247,153, +-87,-198,-120,-27,36,78,90,45,-40,38,57,-17,-2,0,16,4,16,26,17,-33,-116,-186,-167,4,59, +77,82,-34,-142,-162,-106,-178,-156,-322,-323,-272,105,248,169,31,-20,-28,38,79,88,52,19,33,15,1, +0,-11,-18,-39,-38,-28,-14,34,63,86,-94,-109,86,44,159,381,4,91,385,164,63,-36,-144,-87,77, +98,86,8,-5,-14,1,47,57,6,9,3,6,-19,-12,33,79,107,111,89,35,-43,0,101,274,-25, +-216,-283,-147,-148,-205,-125,-63,-20,22,33,14,-1,-26,-18,-45,-49,-20,-57,-72,-65,-53,-57,-68,-55,-40, +-15,-4,36,111,165,184,141,190,119,19,-66,-62,-43,-78,217,147,122,89,87,67,42,21,11,15,37, +1,-32,-56,-54,-39,-29,0,18,20,35,38,32,21,2,-34,-48,-34,-5,71,129,202,162,165,213,235, +-119,-115,-186,-219,-223,-195,-156,-115,-122,-116,-95,-85,-70,-64,-78,-78,-74,-17,16,39,43,47,54,40,33, +34,53,61,62,48,31,16,-7,-33,-76,-97,-5,-9,-37,-67,-103,-119,-144,-168,-158,-143,-143,-113,-104,-73, +-71,-57,-57,-24,10,46,42,46,50,47,45,40,44,47,56,55,56,55,39,25,16,8,-25,-21,-32, +-29,-32,-35,-34,-36,-34,-33,-35,-32,-34,-37,-37,-30,-24,-16,-18,2,-2,-4,-6,-8,-9,-10,-13,-19, +-26,-33,-38,-41,-36,-31,-28,-27,-2,3,-7,-12,-21,-13,-21,-29,-29,-31,-30,-33,-33,-33,-21,-13,-25, +-15,-11,-1,-5,-5,-6,-7,-7,-8,-10,-10,-11,-11,-12,-16,-13,-11,-9,-5,-5,-12,-12,-9,-6,-6, +-18,-6,-7,-9,-6,-3,4,-10,-13,-3,-14,-17,-28,-22,-19,-12,-16,-18,-21,-22,-19,-13,-4,-1,-4, +-8,-12,-16,-19,-20,-16,-15,-10,-6,2,2,-21,5,15,14,16,18,35,2,-4,13,-15,-28,-51,-37, +-30,-21,-32,-39,-44,-47,-33,-7,24,30,13,-4,-21,-32,-37,-32,-18,-17,-10,0,23,30,-28,23,27, +22,52,63,94,22,4,50,-19,-35,-75,-55,-42,-20,-44,-57,-66,-74,-52,-16,42,57,27,17,-15,-43, +-57,-59,-28,-27,6,10,37,10,-66,49,110,85,128,154,159,69,57,103,-26,-56,-88,-66,-49,-29,-78, +-106,-121,-125,-73,15,131,143,68,20,-39,-88,-89,-50,-8,-8,-46,-23,115,186,157,-51,-166,-121,-37,22, +32,102,70,-48,41,53,-18,-15,-18,1,4,21,26,12,-37,-119,-181,-141,64,78,83,102,-50,-161,-155, +-106,-139,-81,-234,-271,-288,53,216,174,40,-25,-51,9,57,78,52,20,30,-9,-25,-22,-27,-30,-43,-61, +-46,-32,70,91,43,-89,-89,112,73,187,392,22,24,358,77,-28,-42,-131,-89,22,68,73,9,-13,-23, +2,35,52,13,20,20,24,-8,1,54,74,92,88,59,28,10,17,116,352,-120,-345,-334,-209,-128,-191, +-85,-24,-9,21,31,11,5,-27,-23,-42,-42,-22,-52,-65,-65,-66,-72,-71,-70,-62,-40,-22,40,118,173, +188,158,155,83,56,-45,-47,-55,-68,198,90,100,76,82,71,46,16,10,18,43,27,-7,-54,-55,-50, +-44,-8,16,25,31,34,34,21,-3,-38,-35,-7,42,98,140,190,173,191,228,242,-99,-113,-167,-194,-191, +-144,-101,-78,-84,-85,-72,-77,-68,-63,-65,-68,-81,-38,-5,28,36,46,49,46,43,36,48,51,60,48, +36,23,2,-22,-59,-76,-18,-22,-52,-82,-124,-133,-149,-164,-148,-129,-122,-93,-80,-54,-58,-53,-57,-27,3, +29,30,39,47,49,52,53,54,56,61,58,55,48,27,9,-2,-8,-16,-13,-20,-22,-24,-27,-31,-36, +-33,-31,-32,-29,-30,-30,-25,-15,-8,0,3,20,16,12,9,6,3,0,-5,-11,-18,-24,-28,-29,-23, +-17,-15,-16,1,5,0,-3,-7,-10,-14,-19,-17,-18,-16,-17,-16,-15,-8,-5,-7,-2,0,6,2,1, +0,-1,-2,-3,-4,-5,-5,-5,-6,-9,-8,-7,-5,-1,-1,-9,-8,-7,-4,-3,-12,-3,-5,-4,-5, +-2,6,-8,-10,-3,-9,-12,-26,-19,-16,-11,-15,-16,-18,-17,-13,-6,-1,1,-1,-4,-8,-15,-17,-17, +-13,-11,1,1,9,10,-7,8,16,21,15,15,32,3,-1,8,-8,-20,-49,-36,-32,-25,-35,-40,-41, +-39,-22,8,29,31,14,2,-15,-30,-35,-28,-12,-6,3,0,23,32,-11,27,26,32,44,50,89,23, +8,39,-10,-23,-75,-55,-46,-30,-53,-61,-62,-61,-35,12,47,57,28,26,-6,-46,-58,-58,-22,-14,35, +24,54,32,-35,48,103,99,126,154,166,62,48,92,-15,-42,-95,-73,-62,-52,-100,-118,-116,-103,-41,65, +142,131,59,27,-27,-89,-88,-45,7,21,-68,-66,40,120,150,-15,-129,-120,-53,6,2,116,95,-49,39, +47,-6,-17,-23,-5,13,31,26,12,-38,-128,-171,-110,111,88,82,104,-68,-175,-163,-113,-83,-16,-149,-220, +-285,0,168,159,52,-20,-69,-17,35,66,50,20,26,-29,-47,-46,-40,-36,-42,-70,-54,-40,107,116,10, +-79,-69,118,109,213,370,50,-80,260,0,-93,-31,-98,-74,-31,30,52,16,-17,-28,3,22,42,18,25, +30,36,7,21,72,78,84,65,31,23,57,46,123,350,-195,-417,-328,-261,-81,-146,-49,4,15,18,22, +8,9,-28,-29,-34,-29,-24,-42,-55,-65,-76,-82,-71,-80,-76,-57,-29,43,117,168,183,175,128,56,75, +-5,-5,-33,-33,134,17,56,51,66,75,54,18,14,22,43,44,11,-49,-56,-61,-57,-17,12,30,29, +32,37,23,1,-23,-8,29,92,122,154,183,178,191,202,196,-58,-99,-128,-143,-143,-89,-49,-40,-43,-50, +-48,-69,-66,-63,-54,-58,-78,-56,-28,9,24,38,40,45,46,36,37,37,52,44,40,30,16,3,-17, +-30,-36,-38,-69,-100,-143,-144,-150,-154,-136,-115,-101,-78,-66,-49,-51,-50,-50,-26,-4,12,17,32,44,46, +49,52,54,57,61,53,45,33,10,-10,-25,-30,-7,-6,-12,-18,-20,-24,-31,-39,-37,-34,-33,-31,-30, +-28,-19,-7,0,8,16,27,24,20,18,14,12,10,5,0,-5,-10,-12,-11,-7,-2,-1,-4,-5,-4, +-4,-5,-6,-17,-17,-19,-16,-16,-14,-13,-10,-9,-7,-7,0,1,1,3,0,-1,-2,-3,-4,-5,-6, +-6,-6,-5,-5,-8,-8,-9,-9,-7,-9,-5,-4,-4,-1,-1,-6,0,-3,-1,-4,-3,4,-5,-7,-4, +-5,-7,-23,-15,-14,-10,-13,-13,-14,-12,-8,2,3,4,1,0,-4,-12,-14,-14,-9,-6,12,7,14, +16,5,11,16,25,12,11,25,5,2,4,-1,-12,-43,-33,-33,-28,-36,-38,-37,-28,-9,24,33,31, +14,6,-9,-27,-33,-25,-4,5,13,0,24,33,6,29,23,38,32,34,74,23,14,28,1,-8,-69, +-50,-48,-38,-57,-60,-57,-46,-16,41,51,55,26,32,2,-45,-57,-56,-15,-2,63,37,67,50,-6,47, +92,111,120,147,163,57,44,80,0,-25,-97,-75,-72,-72,-112,-121,-110,-79,-6,114,150,117,47,31,-15, +-84,-86,-41,26,49,-92,-95,-16,65,134,16,-92,-119,-73,-11,-13,127,114,-48,35,41,14,-9,-18,-4, +28,44,31,13,-42,-136,-162,-81,145,94,81,99,-81,-181,-175,-126,-12,35,-86,-183,-272,-53,110,135,69, +-3,-79,-39,16,56,43,16,19,-40,-59,-65,-46,-38,-39,-75,-53,-29,140,134,-11,-71,-52,110,144,230, +321,86,-191,102,-57,-114,-26,-60,-52,-72,-8,27,24,-18,-30,2,8,29,22,26,33,36,24,43,84, +83,77,41,13,27,88,93,128,243,-248,-425,-286,-299,-18,-74,-14,26,44,18,13,6,9,-28,-33,-23, +-16,-24,-30,-44,-65,-80,-84,-70,-83,-80,-65,-27,43,115,154,166,171,97,36,75,33,39,12,14,43, +-50,7,23,45,72,61,25,23,29,39,51,23,-38,-56,-70,-66,-30,4,28,26,30,32,27,15,1, +29,72,135,145,167,181,175,166,136,106,-4,-64,-82,-82,-78,-31,1,-2,-3,-16,-24,-56,-63,-63,-49, +-53,-69,-67,-48,-13,9,28,29,42,43,33,25,21,38,37,37,33,30,34,39,27,-53,-57,-83,-113, +-155,-149,-146,-143,-124,-104,-85,-69,-59,-49,-48,-46,-44,-26,-11,-6,4,23,40,38,38,41,44,47,50, +43,34,21,0,-22,-39,-48,-3,-5,-9,-17,-19,-25,-35,-46,-44,-40,-38,-37,-35,-31,-20,-9,-1,7, +18,23,23,20,20,19,20,20,17,13,9,5,3,4,6,8,8,4,-16,-17,-15,-16,-15,-29,-28, +-28,-24,-23,-21,-19,-16,-15,-15,-16,-5,-6,-5,-5,-6,-7,-9,-9,-9,-10,-10,-10,-10,-9,-8,-9, +-12,-15,-16,-17,-22,-3,-1,-3,1,2,0,1,-1,3,-4,-3,3,-2,-3,-3,-1,-2,-17,-11,-11, +-9,-11,-11,-12,-8,-3,8,5,5,1,3,-1,-10,-13,-12,-6,-3,20,12,19,19,13,11,14,26, +8,5,15,5,5,1,6,-3,-35,-29,-32,-30,-36,-36,-33,-18,3,38,34,28,10,8,-4,-23,-30, +-22,3,14,21,1,24,32,20,27,17,39,17,16,50,21,20,19,12,7,-56,-43,-47,-43,-58,-57, +-53,-30,2,65,51,49,20,35,8,-42,-54,-51,-6,9,84,46,73,61,20,44,78,116,110,132,147, +55,45,69,18,-5,-90,-74,-78,-86,-119,-120,-103,-53,29,156,149,99,29,32,-4,-76,-76,-32,45,73, +-116,-113,-55,22,113,39,-59,-120,-91,-25,-16,133,125,-44,28,33,38,9,-4,5,49,60,40,10,-52, +-140,-151,-55,167,99,81,97,-89,-179,-180,-142,59,73,-37,-154,-255,-103,48,105,82,16,-80,-56,-2,46, +32,9,7,-42,-58,-76,-46,-39,-43,-75,-46,-5,164,144,-23,-65,-36,101,173,232,248,114,-286,-81,-86, +-95,-26,-20,-27,-98,-38,5,28,-12,-28,-3,-6,15,25,21,27,21,34,60,85,83,65,20,-1,29, +91,148,134,73,-260,-367,-236,-313,54,13,25,44,71,18,3,6,7,-24,-34,-15,-5,-22,-17,-34,-65, +-81,-82,-72,-83,-79,-67,-21,43,114,138,144,145,54,10,55,53,64,55,60,-53,-106,-35,0,27,63, +62,33,35,37,34,50,27,-22,-54,-76,-72,-45,-11,15,19,27,25,33,31,29,68,109,166,159,171, +168,170,132,47,0,53,-11,-30,-21,-8,27,47,34,33,15,-2,-40,-56,-63,-50,-50,-57,-71,-60,-32, +-5,16,18,36,38,25,11,4,17,23,30,35,43,63,90,81,-67,-76,-95,-119,-155,-147,-138,-130,-113, +-96,-76,-65,-56,-51,-47,-46,-44,-33,-22,-25,-11,10,31,26,23,26,27,30,31,27,21,12,-4,-22, +-38,-56,-4,-9,-11,-23,-25,-31,-44,-56,-54,-50,-46,-45,-42,-38,-26,-16,-8,-1,12,12,14,14,17, +19,24,26,24,22,21,18,16,16,12,10,8,4,-29,-32,-29,-29,-27,-42,-40,-40,-35,-34,-32,-28, +-25,-24,-25,-26,-13,-15,-15,-16,-15,-16,-16,-16,-16,-15,-15,-15,-15,-13,-13,-11,-16,-21,-25,-28,-35, +-1,2,-2,2,3,4,2,-1,4,-5,-4,-1,-1,-1,-3,2,2,-12,-8,-9,-9,-9,-9,-9,-3, +1,13,6,5,1,5,1,-9,-10,-10,-3,0,26,14,21,20,19,9,10,25,2,-2,3,4,7, +0,12,5,-25,-25,-31,-31,-35,-33,-27,-7,14,49,35,24,5,10,0,-20,-25,-16,10,21,26,0, +22,29,32,22,9,35,0,-4,21,16,24,13,22,20,-39,-35,-45,-46,-56,-50,-46,-14,19,85,49, +43,13,37,16,-39,-46,-41,3,18,98,49,73,66,42,37,61,113,94,110,116,52,49,59,36,16, +-75,-69,-83,-97,-121,-114,-90,-22,64,189,144,80,10,33,8,-68,-59,-16,61,92,-133,-119,-84,-12,94, +53,-32,-119,-102,-33,-12,131,123,-35,18,25,59,33,20,29,78,79,48,1,-68,-144,-136,-26,183,103, +81,100,-90,-169,-174,-152,113,99,9,-123,-242,-145,-11,72,86,31,-76,-70,-19,37,20,-1,-6,-37,-48, +-76,-41,-40,-46,-69,-31,32,176,136,-36,-62,-21,92,194,224,165,125,-359,-269,-104,-59,-36,19,-1,-109, +-57,-12,28,-2,-21,-12,-17,5,28,14,13,-1,37,67,77,75,51,5,-10,28,73,205,153,-79,-241, +-283,-192,-304,132,112,70,61,89,18,-4,10,6,-18,-33,-10,-1,-18,-7,-26,-64,-80,-79,-74,-79,-73, +-62,-7,47,112,121,119,106,5,-22,22,54,71,81,105,-131,-145,-69,-16,17,50,56,40,43,44,29, +41,25,-5,-50,-79,-74,-60,-30,-5,8,23,21,36,45,64,99,134,185,166,168,151,161,102,-27,-87, +103,43,25,35,52,75,84,64,63,42,18,-22,-47,-63,-53,-50,-48,-68,-63,-46,-17,5,9,28,29, +12,-1,-7,1,11,24,37,52,84,126,124,-72,-87,-100,-118,-147,-137,-124,-113,-101,-88,-72,-65,-57,-57, +-51,-52,-51,-44,-37,-42,-25,-4,17,11,9,12,11,11,9,10,7,5,-1,-13,-26,-54,-10,-19,-20, +-33,-37,-43,-56,-68,-65,-61,-56,-55,-51,-46,-35,-27,-19,-13,-1,-4,1,3,8,13,20,26,26,26, +27,25,24,23,13,6,2,-2,-40,-45,-41,-41,-40,-53,-52,-53,-47,-45,-43,-39,-36,-34,-36,-36,-24, +-26,-25,-26,-24,-24,-24,-22,-21,-19,-20,-20,-19,-18,-17,-14,-20,-26,-32,-37,-45,1,4,0,2,4, +6,1,-2,4,-7,-7,-6,-1,1,-2,4,6,-7,-5,-7,-7,-7,-6,-6,1,6,17,8,6,1, +7,4,-7,-7,-6,1,3,30,14,20,19,23,6,4,22,-4,-10,-9,2,9,-1,17,11,-14,-21, +-31,-31,-33,-27,-20,4,26,57,36,22,2,13,6,-16,-17,-8,17,27,30,-1,17,25,42,15,-3, +28,-18,-24,-9,10,26,9,30,30,-18,-26,-42,-46,-51,-42,-36,4,36,99,48,39,7,41,24,-36, +-33,-27,15,26,103,46,66,64,61,26,39,101,73,81,75,49,55,52,52,36,-51,-61,-87,-106,-119, +-102,-72,10,98,210,137,66,-5,36,20,-60,-37,5,79,105,-143,-116,-106,-43,77,58,-12,-113,-102,-33, +-5,119,110,-22,7,14,74,57,52,68,110,95,53,-14,-90,-146,-119,4,195,109,80,100,-83,-151,-159, +-154,145,115,54,-83,-228,-173,-56,41,79,35,-65,-77,-33,30,6,-11,-20,-25,-30,-67,-32,-38,-43,-60, +-12,81,174,112,-58,-61,-5,89,210,211,88,115,-398,-439,-125,-28,-58,51,24,-108,-66,-24,24,10,-12, +-23,-24,-1,31,9,1,-18,36,64,63,63,34,-8,-17,23,47,246,169,-193,-216,-215,-161,-275,200,209, +123,81,93,18,-4,14,7,-8,-30,-9,0,-11,-1,-21,-59,-77,-77,-76,-72,-63,-51,7,52,110,105, +90,59,-34,-45,-6,40,59,86,133,-181,-162,-92,-27,12,35,44,44,47,45,24,28,18,8,-47,-78, +-78,-72,-49,-28,-7,14,16,38,59,93,118,146,185,166,161,131,140,71,-71,-145,136,86,75,82,92, +106,106,87,85,64,36,-3,-36,-62,-56,-51,-41,-59,-59,-52,-24,-5,2,17,16,-2,-12,-13,-7,8, +24,40,61,95,143,148,-69,-89,-97,-111,-133,-121,-104,-91,-85,-77,-67,-64,-61,-66,-59,-61,-61,-56,-50, +-52,-36,-18,2,-3,-3,1,-3,-7,-11,-7,-5,0,2,-2,-11,-46,-22,-33,-34,-46,-50,-57,-70,-81, +-77,-72,-67,-65,-60,-55,-45,-39,-32,-26,-16,-20,-15,-11,-5,3,12,20,21,24,26,26,25,23,8, +-3,-9,-14,-49,-55,-51,-52,-51,-61,-61,-63,-57,-56,-53,-49,-46,-44,-45,-44,-34,-36,-35,-36,-33,-31, +-30,-28,-26,-24,-24,-24,-24,-24,-23,-19,-25,-30,-38,-44,-51,4,7,2,3,5,10,2,-2,5,-7, +-8,-9,0,3,-1,7,9,-1,-1,-3,-4,-3,-2,-1,6,11,21,11,9,3,11,8,-4,-3,-1, +6,7,32,14,17,17,29,2,-2,19,-11,-17,-18,1,10,1,21,18,-1,-15,-28,-29,-28,-20,-10, +17,37,63,38,22,1,18,13,-11,-8,1,26,32,31,-2,11,18,51,6,-14,21,-35,-42,-35,2, +25,5,36,38,4,-16,-37,-43,-42,-31,-22,22,52,106,51,40,6,48,35,-32,-19,-10,29,33,101, +40,51,56,79,12,14,83,44,46,30,44,59,45,63,54,-18,-48,-88,-110,-109,-84,-47,45,129,219, +132,57,-14,45,36,-49,-11,30,99,112,-149,-108,-120,-67,58,55,2,-97,-90,-27,0,99,88,-4,-4, +2,79,77,87,112,137,107,57,-32,-111,-144,-98,34,205,118,80,90,-74,-130,-137,-151,150,126,102,-32, +-208,-187,-88,14,64,32,-52,-77,-42,24,-7,-20,-30,-9,-9,-48,-22,-35,-36,-46,11,128,157,74,-88, +-63,12,95,225,198,20,86,-385,-564,-168,-26,-85,69,43,-92,-66,-31,19,21,-4,-32,-28,-5,32,9, +-5,-22,32,54,50,46,14,-21,-26,15,24,259,166,-262,-197,-168,-133,-217,244,294,183,107,83,21,2, +17,9,1,-24,-11,-2,-2,4,-15,-49,-69,-73,-73,-63,-50,-32,19,58,107,92,63,3,-61,-55,-22, +17,30,71,135,-200,-158,-104,-34,8,18,28,46,45,41,19,15,9,14,-44,-75,-82,-81,-65,-51,-24, +2,11,39,68,110,126,148,175,160,147,108,106,37,-90,-170,148,112,110,112,114,119,112,97,95,79, +52,16,-22,-56,-57,-51,-37,-48,-49,-49,-27,-13,-6,6,4,-12,-17,-13,-6,10,30,49,69,99,142, +151,-62,-85,-89,-98,-115,-100,-80,-65,-65,-63,-61,-61,-64,-72,-65,-67,-69,-64,-58,-56,-42,-28,-12,-14, +-13,-7,-12,-17,-23,-17,-14,-4,3,5,0,-37,-37,-49,-49,-60,-65,-71,-83,-92,-88,-82,-76,-72,-67, +-61,-54,-50,-44,-39,-31,-35,-30,-24,-18,-10,-1,8,9,13,15,16,15,13,-4,-18,-25,-30,-55,-61, +-58,-58,-58,-66,-67,-69,-64,-62,-60,-56,-53,-50,-50,-50,-43,-44,-42,-44,-40,-37,-35,-33,-31,-28,-29, +-29,-29,-29,-29,-26,-31,-36,-43,-49,-54,8,10,4,5,6,14,4,-1,6,-7,-9,-10,1,4,1, +10,13,5,3,0,-1,1,3,5,12,16,24,15,13,6,15,12,0,2,4,11,11,33,14,13, +13,33,-1,-7,16,-17,-24,-23,-1,10,2,23,23,11,-8,-23,-24,-21,-10,3,29,46,65,39,23, +2,23,21,-5,2,11,35,36,32,-2,3,11,59,-2,-23,15,-50,-59,-54,-8,20,3,38,43,23, +-7,-31,-38,-32,-18,-4,40,66,107,54,44,10,55,44,-25,-4,6,43,39,97,35,33,42,94,-4, +-12,61,11,8,-14,35,59,40,69,69,18,-34,-85,-106,-93,-60,-14,80,154,214,122,51,-14,53,51, +-34,15,53,116,116,-148,-98,-129,-85,39,50,15,-71,-69,-18,2,73,63,15,-16,-12,73,90,116,146, +152,110,54,-50,-125,-131,-63,74,214,133,81,70,-68,-109,-108,-140,133,135,146,23,-180,-192,-114,-8,46, +25,-39,-70,-48,16,-17,-22,-34,7,13,-21,-13,-31,-22,-27,35,164,127,25,-123,-67,28,105,234,181, +-42,43,-322,-624,-237,-69,-103,68,49,-61,-59,-34,15,28,3,-39,-29,-8,31,12,-1,-14,29,43,35, +26,-6,-30,-33,10,19,238,137,-274,-181,-135,-104,-130,254,351,240,137,69,29,15,19,9,8,-17,-14, +-5,7,6,-9,-34,-56,-65,-65,-52,-36,-11,30,63,99,79,35,-48,-78,-60,-33,-7,-1,43,115,-190, +-140,-108,-41,2,2,11,44,38,31,11,3,0,13,-40,-68,-86,-86,-77,-70,-41,-12,5,35,69,118, +127,144,161,149,127,82,70,10,-93,-164,142,124,125,122,119,117,105,94,95,85,63,34,-5,-46,-53, +-49,-34,-38,-38,-40,-26,-18,-13,0,-2,-16,-13,-5,4,20,44,67,82,100,128,138,-51,-73,-75,-77, +-88,-72,-50,-34,-42,-45,-51,-55,-63,-71,-67,-70,-73,-68,-62,-56,-46,-36,-25,-23,-17,-9,-13,-17,-21, +-19,-17,-6,1,6,4,-28,-54,-65,-65,-73,-78,-83,-93,-101,-95,-88,-81,-75,-69,-64,-60,-56,-51,-48, +-43,-45,-40,-36,-30,-23,-16,-8,-8,-6,-4,-2,-2,-4,-20,-34,-43,-48,-58,-64,-61,-63,-63,-67,-68, +-72,-67,-65,-62,-60,-57,-54,-53,-52,-49,-49,-48,-49,-45,-42,-39,-37,-35,-32,-33,-33,-34,-35,-36,-34, +-38,-41,-47,-53,-53,10,13,7,6,7,17,5,0,8,-7,-9,-10,1,5,3,12,15,11,6,3, +2,4,7,10,16,20,26,18,16,9,18,15,3,6,8,16,14,33,14,9,10,37,-3,-11,13, +-22,-30,-26,-4,8,4,25,27,21,-2,-18,-19,-13,-1,15,39,53,64,39,23,4,27,26,1,11, +19,41,39,33,-1,-3,3,62,-9,-30,10,-62,-72,-66,-19,13,0,38,44,37,0,-25,-32,-22,-5, +15,55,76,103,56,47,16,59,49,-18,8,20,54,45,90,30,15,27,103,-19,-36,39,-21,-29,-50, +22,52,36,72,79,49,-21,-77,-97,-75,-34,23,109,170,198,107,41,-11,57,60,-16,37,71,128,116, +-138,-87,-133,-97,19,47,30,-38,-46,-10,0,43,38,33,-29,-30,55,91,131,161,149,100,39,-66,-126, +-109,-7,127,218,145,76,36,-69,-93,-82,-123,100,137,187,76,-146,-192,-136,-30,26,15,-29,-58,-49,5, +-24,-19,-32,21,32,7,-7,-25,-5,-6,57,179,90,-25,-159,-70,40,113,226,155,-97,-3,-234,-632,-325, +-149,-100,47,40,-26,-48,-34,10,30,8,-43,-29,-12,24,18,9,2,29,31,20,4,-28,-41,-44,4, +35,186,84,-244,-155,-103,-81,-34,228,364,284,168,60,40,35,22,8,9,-11,-16,-7,12,8,-1,-16, +-39,-54,-53,-40,-21,11,36,64,84,63,11,-78,-87,-63,-40,-29,-28,13,82,-157,-115,-106,-47,-7,-11, +-3,40,28,16,1,-7,-7,6,-35,-59,-89,-88,-86,-83,-57,-28,-1,28,65,116,121,136,144,136,105, +56,40,-8,-86,-136,121,119,122,114,109,103,89,81,83,82,67,48,12,-32,-47,-47,-34,-30,-28,-29, +-23,-21,-20,-3,-3,-13,0,12,22,37,64,90,96,100,111,115,-34,-53,-53,-48,-53,-36,-15,1,-13, +-21,-37,-43,-57,-65,-65,-68,-73,-68,-62,-55,-48,-42,-36,-28,-18,-7,-9,-10,-11,-13,-15,-9,-4,2, +4,-17,-68,-76,-78,-81,-87,-91,-98,-104,-97,-89,-82,-75,-69,-63,-61,-58,-55,-52,-49,-51,-47,-43,-39, +-34,-29,-23,-26,-25,-26,-24,-23,-24,-36,-48,-58,-63,-58,-62,-62,-63,-64,-64,-65,-71,-66,-64,-61,-60, +-57,-53,-53,-52,-51,-51,-50,-51,-47,-44,-42,-40,-38,-35,-36,-36,-37,-39,-41,-41,-44,-46,-49,-53,-51, +13,15,9,8,9,20,6,2,10,-6,-8,-8,2,6,5,13,16,15,9,6,5,7,11,15,20, +23,27,20,18,12,20,17,6,10,12,20,17,32,15,7,8,38,-4,-13,10,-26,-33,-26,-7,5, +4,25,29,28,4,-11,-13,-6,8,28,48,58,61,38,24,8,29,29,7,19,26,46,40,35,0, +-7,-2,62,-15,-34,6,-70,-81,-70,-29,3,-4,36,42,44,6,-18,-26,-13,6,33,67,84,97,58, +49,24,59,49,-9,19,32,64,51,82,25,1,13,105,-32,-57,18,-50,-62,-75,6,41,33,71,84, +71,-7,-63,-82,-55,-7,60,135,180,178,93,33,-2,57,63,3,57,86,137,114,-118,-74,-127,-99,3, +47,47,-1,-24,-7,-7,14,16,46,-42,-50,30,79,126,155,127,76,14,-79,-118,-89,54,181,212,150, +64,-4,-72,-81,-63,-99,61,127,215,121,-107,-189,-156,-52,4,6,-20,-44,-48,-7,-25,-10,-23,33,46, +32,-2,-17,14,20,78,170,49,-69,-191,-71,51,116,201,117,-143,-44,-150,-604,-409,-236,-75,14,14,5, +-34,-29,6,27,10,-45,-27,-18,14,22,21,20,30,20,3,-20,-48,-51,-53,4,69,124,18,-204,-109, +-58,-62,43,173,328,309,199,64,55,56,28,4,5,-8,-17,-8,13,8,7,3,-21,-40,-38,-27,-7, +32,40,61,68,48,-7,-89,-82,-55,-39,-47,-45,1,48,-109,-87,-100,-54,-18,-20,-13,35,17,0,-12, +-14,-12,-2,-28,-50,-90,-89,-92,-90,-71,-43,-8,22,60,104,112,128,129,122,85,37,17,-17,-68,-96, +87,98,105,94,89,80,67,62,65,71,65,57,26,-17,-38,-43,-36,-27,-23,-20,-19,-20,-22,-2,3, +0,20,33,44,60,88,115,108,98,94,86,-10,-26,-25,-13,-12,4,23,39,19,6,-17,-27,-47,-57, +-59,-62,-69,-64,-59,-51,-48,-45,-43,-31,-19,-5,-3,0,5,-3,-9,-7,-5,1,6,-2,-75,-79,-84, +-82,-88,-91,-95,-99,-92,-85,-80,-72,-66,-62,-61,-58,-56,-54,-53,-54,-51,-48,-45,-41,-38,-34,-39,-42, +-44,-43,-42,-42,-48,-57,-66,-72,-55,-58,-59,-60,-61,-58,-59,-65,-61,-60,-58,-57,-55,-52,-51,-51,-51, +-51,-51,-52,-48,-46,-43,-41,-39,-37,-38,-39,-40,-43,-45,-47,-49,-50,-50,-52,-49,15,17,11,10,10, +21,7,4,11,-4,-7,-6,3,7,6,14,17,18,11,9,7,10,13,20,23,25,27,22,20,15, +21,19,9,14,16,24,19,31,15,6,7,36,-5,-15,7,-29,-35,-24,-10,2,4,25,30,31,10, +-4,-7,0,16,39,55,62,56,37,24,13,29,30,13,25,33,51,41,37,2,-7,-4,57,-18,-36, +1,-76,-87,-68,-38,-7,-9,31,38,46,11,-11,-21,-6,15,50,77,88,87,58,50,34,55,45,1, +30,44,73,55,74,21,-8,3,97,-44,-74,-1,-77,-90,-87,-12,26,29,66,84,85,9,-44,-64,-34, +18,94,156,185,156,82,30,13,53,60,21,74,101,145,111,-85,-56,-109,-90,-7,49,64,39,-3,-9, +-17,-11,-1,56,-53,-69,0,51,101,127,90,43,-17,-90,-108,-78,103,218,193,145,50,-43,-74,-70,-52, +-67,24,106,225,149,-69,-184,-173,-75,-14,1,-15,-30,-45,-19,-21,2,-12,42,55,53,5,-5,32,52, +98,143,8,-108,-211,-68,60,111,161,69,-178,-75,-95,-555,-469,-306,-32,-20,-19,25,-22,-22,4,20,8, +-45,-27,-24,1,23,30,34,28,8,-17,-44,-66,-59,-58,11,114,61,-51,-168,-64,-7,-32,83,102,249, +309,223,82,66,72,38,3,1,-5,-16,-8,9,8,15,20,-2,-23,-23,-14,7,49,44,56,51,35, +-19,-89,-69,-41,-31,-58,-51,15,17,-56,-56,-89,-61,-30,-23,-16,30,7,-14,-23,-20,-16,-10,-21,-41, +-87,-89,-94,-90,-79,-55,-17,16,54,89,102,119,118,107,66,26,3,-20,-50,-54,46,65,77,68,65, +55,44,41,45,56,57,59,36,-3,-28,-39,-39,-28,-23,-17,-17,-17,-21,3,14,20,46,59,70,85, +112,137,118,95,75,54,20,7,8,22,28,41,57,72,49,34,7,-8,-33,-46,-50,-54,-63,-58,-54, +-47,-46,-45,-46,-33,-19,-6,1,11,22,13,5,3,2,7,15,20,-73,-74,-80,-73,-80,-81,-82,-86, +-80,-77,-73,-67,-63,-61,-60,-58,-57,-55,-55,-55,-52,-49,-47,-44,-43,-40,-47,-52,-56,-57,-55,-55,-56, +-60,-66,-72,-52,-52,-55,-56,-57,-51,-52,-57,-56,-55,-54,-54,-53,-51,-51,-51,-51,-51,-51,-52,-49,-47, +-44,-43,-41,-39,-40,-41,-43,-45,-48,-51,-52,-52,-50,-50,-50,16,17,12,11,11,21,8,5,11,-3, +-5,-3,3,7,6,14,17,19,13,11,8,11,15,22,24,25,24,21,20,17,20,18,11,15,18, +25,20,29,15,7,7,30,-6,-16,1,-31,-35,-22,-13,-1,1,23,30,31,15,3,-2,6,22,46, +59,62,49,35,24,18,27,28,16,29,37,53,40,37,6,-4,-4,48,-19,-36,-7,-79,-91,-64,-46, +-17,-17,26,33,41,15,-5,-16,-1,21,60,82,88,73,57,50,43,46,37,7,37,53,80,57,63, +19,-12,-6,79,-52,-86,-21,-100,-113,-88,-30,7,21,59,80,88,24,-21,-43,-14,39,120,168,182,131, +75,32,30,47,52,33,85,112,149,104,-41,-35,-78,-67,-9,56,83,77,14,-13,-25,-29,-12,62,-61, +-85,-31,12,58,76,39,3,-53,-101,-100,-74,129,229,161,127,32,-75,-73,-59,-46,-30,-7,79,217,161, +-35,-179,-190,-96,-26,2,-10,-19,-40,-31,-15,15,2,48,60,70,16,11,50,85,113,104,-30,-137,-217, +-59,67,99,112,17,-194,-96,-76,-491,-493,-343,10,-46,-50,30,-14,-15,2,13,5,-41,-28,-32,-14,17, +31,34,21,-5,-39,-66,-81,-66,-59,22,156,1,-117,-142,-37,34,17,83,39,146,281,234,108,71,77, +51,4,0,-2,-13,-8,1,7,21,34,14,-6,-9,-1,20,61,50,49,33,23,-24,-76,-52,-27,-24, +-53,-38,46,2,-9,-25,-73,-64,-41,-23,-14,23,-1,-22,-31,-23,-18,-15,-14,-32,-79,-85,-93,-87,-82, +-62,-25,11,48,77,94,110,108,91,49,17,-7,-24,-36,-18,3,26,42,40,41,33,25,23,27,39, +44,55,41,10,-17,-32,-40,-32,-27,-18,-15,-12,-15,12,30,43,72,86,98,109,130,149,124,91,54, +20,52,42,40,53,60,70,81,94,72,56,32,13,-15,-30,-37,-43,-56,-51,-47,-42,-42,-43,-46,-33, +-21,-9,4,20,38,30,22,18,16,21,32,45,-64,-62,-69,-58,-64,-63,-62,-65,-63,-64,-65,-61,-61, +-63,-60,-57,-56,-54,-55,-53,-50,-47,-45,-43,-43,-41,-48,-55,-59,-61,-59,-59,-55,-55,-59,-64,-46,-45, +-49,-51,-52,-44,-45,-48,-50,-50,-50,-52,-52,-53,-52,-51,-51,-51,-51,-50,-48,-46,-44,-43,-42,-40,-41, +-42,-43,-45,-47,-50,-50,-50,-47,-45,-49,15,17,13,12,12,20,8,6,10,-2,-4,-1,3,6,6, +13,15,18,13,11,8,11,15,22,24,24,21,20,19,18,18,16,11,16,19,26,20,26,15,8, +5,22,-6,-16,-6,-32,-34,-20,-14,-5,-3,20,28,28,18,9,3,11,26,50,60,60,42,33,24, +23,24,24,16,32,40,53,37,36,10,0,-3,35,-18,-33,-17,-78,-92,-62,-52,-25,-27,21,27,31, +17,1,-12,4,25,65,82,85,60,55,49,50,36,27,10,43,59,83,56,49,15,-14,-13,54,-55, +-92,-42,-118,-130,-84,-47,-12,8,51,72,82,35,2,-20,8,58,137,173,175,108,70,36,48,39,40, +38,92,119,148,93,11,-7,-35,-33,-3,67,101,110,30,-15,-28,-37,-19,65,-64,-95,-60,-29,6,13, +-14,-38,-91,-112,-95,-72,139,218,123,101,13,-95,-64,-44,-43,10,-33,48,190,156,-3,-173,-207,-113,-33, +4,-7,-9,-35,-41,-9,25,15,50,62,85,32,32,67,113,119,58,-66,-157,-207,-40,76,87,61,-35, +-196,-108,-80,-409,-472,-343,32,-61,-69,21,-10,-9,1,7,3,-35,-30,-40,-27,7,25,21,7,-19,-59, +-82,-89,-71,-51,35,183,-51,-170,-130,-18,71,77,58,-2,45,231,229,131,65,69,60,8,1,2,-9, +-8,-7,5,26,43,28,11,4,14,33,69,57,43,14,10,-27,-55,-36,-16,-21,-27,-1,84,6,31, +2,-52,-63,-47,-19,-9,14,-6,-24,-32,-25,-18,-16,-7,-23,-66,-79,-89,-81,-80,-64,-32,6,42,67, +86,99,95,73,33,5,-16,-29,-30,10,-38,-14,6,13,20,15,11,9,14,23,28,46,40,20,-7, +-24,-39,-37,-33,-24,-16,-6,-6,25,47,64,96,111,123,128,138,146,119,82,31,-13,80,73,69,77, +84,90,95,103,85,72,52,33,4,-10,-22,-31,-47,-43,-40,-37,-39,-40,-43,-32,-22,-13,5,25,48, +43,38,36,34,39,53,70,-50,-46,-53,-40,-45,-44,-42,-43,-46,-51,-56,-56,-59,-64,-60,-57,-54,-52, +-53,-49,-46,-43,-41,-40,-39,-39,-44,-50,-53,-55,-53,-52,-46,-43,-45,-50,-37,-35,-40,-42,-44,-34,-36, +-38,-42,-44,-45,-49,-50,-53,-50,-48,-50,-48,-47,-45,-44,-43,-42,-41,-40,-39,-40,-40,-40,-40,-42,-44, +-43,-43,-41,-38,-46,14,16,13,12,11,16,7,6,6,-2,-4,-2,1,4,3,11,13,16,12,11, +7,11,14,21,23,23,18,18,18,19,15,13,10,16,19,25,19,21,13,7,4,11,-6,-15,-14, +-31,-32,-20,-15,-8,-8,17,25,23,20,13,8,15,29,50,59,57,36,31,24,28,20,18,14,32, +41,50,32,32,15,4,-1,20,-15,-29,-30,-76,-90,-63,-57,-30,-37,16,21,20,17,4,-7,8,27, +66,80,79,49,52,48,57,26,16,10,47,64,81,53,32,11,-15,-19,23,-54,-92,-65,-130,-139,-78, +-59,-29,-9,42,62,68,43,21,3,28,73,145,172,164,91,67,43,66,31,27,34,94,122,141,78, +64,26,11,8,11,79,117,135,47,-10,-23,-36,-20,64,-61,-97,-85,-66,-46,-49,-63,-77,-126,-122,-92, +-69,134,192,84,70,-2,-98,-48,-27,-39,48,-53,17,149,138,24,-165,-217,-123,-39,4,-3,-3,-31,-46, +-3,32,25,47,61,95,50,55,83,134,115,13,-98,-169,-183,-14,84,73,13,-80,-185,-112,-95,-317,-411, +-312,25,-61,-71,1,-8,-3,-1,4,2,-27,-33,-46,-37,-6,11,-1,-10,-32,-74,-91,-90,-72,-33,50, +186,-90,-199,-110,1,100,134,23,-10,-27,167,201,139,50,48,58,12,2,6,-4,-9,-14,4,28,49, +37,24,17,30,45,72,62,38,-2,-1,-29,-34,-25,-8,-18,16,51,115,27,57,25,-30,-55,-45,-13, +-2,3,-8,-20,-26,-23,-16,-14,-1,-14,-49,-69,-82,-74,-73,-61,-35,3,38,59,76,84,79,50,14, +-11,-29,-37,-27,28,-72,-51,-27,-11,2,0,0,0,4,10,13,32,35,27,3,-16,-36,-41,-40,-32, +-18,-2,4,37,63,80,112,128,140,136,134,127,100,64,9,-41,96,92,88,90,96,98,98,101,89, +81,68,50,23,10,-7,-19,-39,-35,-33,-32,-34,-37,-40,-32,-24,-17,4,26,50,50,51,52,51,55, +70,86,-30,-26,-35,-22,-27,-26,-24,-24,-31,-40,-48,-51,-56,-63,-59,-54,-51,-49,-50,-47,-43,-40,-37, +-36,-36,-35,-38,-42,-43,-44,-41,-38,-31,-27,-27,-30,-27,-24,-30,-32,-35,-25,-27,-28,-33,-36,-39,-43, +-47,-51,-46,-44,-47,-44,-43,-41,-41,-40,-40,-39,-39,-38,-37,-36,-36,-35,-34,-35,-34,-34,-32,-29,-43, +11,14,12,11,10,12,7,5,2,-2,-4,-3,0,3,1,9,10,13,11,10,7,10,13,19,20, +20,15,16,16,19,12,10,8,15,18,23,16,16,11,7,1,0,-6,-14,-23,-29,-28,-20,-14,-10, +-14,12,20,17,19,16,12,19,31,48,56,52,29,27,23,31,16,13,10,31,41,46,27,28,19, +6,0,5,-11,-23,-44,-71,-87,-68,-60,-34,-46,11,13,8,15,6,-1,11,28,62,75,73,40,49, +45,62,16,7,5,48,65,77,47,17,8,-18,-26,-9,-50,-87,-87,-133,-140,-73,-65,-42,-28,33,50, +50,47,37,24,46,84,145,167,151,75,62,48,82,25,14,23,91,121,128,62,110,60,54,46,30, +91,129,149,62,1,-12,-27,-17,59,-53,-91,-105,-97,-91,-100,-104,-112,-156,-130,-90,-61,118,155,45,38, +-14,-86,-30,-10,-31,82,-67,-10,102,110,46,-152,-215,-124,-43,1,-2,1,-27,-47,1,35,31,41,58, +100,69,79,96,142,101,-23,-121,-173,-152,12,88,58,-30,-116,-167,-111,-117,-229,-326,-260,-7,-49,-56,-21, +-7,1,-2,3,3,-18,-33,-51,-44,-18,-5,-26,-27,-43,-85,-94,-87,-73,-9,65,166,-118,-203,-71,23, +118,180,-14,17,-52,94,145,124,29,22,47,13,2,6,0,-9,-17,2,28,51,43,35,28,43,54, +68,63,34,-13,-10,-30,-20,-21,-3,-8,63,103,129,63,69,39,-7,-40,-33,-6,2,-7,-8,-14,-16, +-19,-14,-10,4,-5,-29,-55,-71,-67,-63,-54,-35,1,32,51,62,64,58,24,-8,-30,-44,-46,-26,39, +-92,-79,-54,-32,-15,-11,-7,-6,-3,-2,-1,17,27,30,10,-7,-31,-43,-46,-40,-23,-3,11,45,72, +89,120,136,146,133,117,95,68,35,-15,-62,96,96,94,91,94,93,89,88,83,82,77,63,40,29, +7,-9,-32,-27,-26,-26,-28,-32,-37,-31,-25,-21,1,23,47,52,59,64,63,66,77,89,-5,-2,-13, +-3,-8,-9,-8,-9,-17,-28,-38,-44,-49,-57,-54,-50,-47,-46,-48,-46,-42,-39,-36,-35,-34,-34,-33,-34, +-32,-31,-27,-22,-16,-10,-7,-7,-18,-14,-20,-22,-25,-17,-19,-20,-26,-29,-33,-37,-41,-46,-41,-39,-42, +-40,-39,-38,-38,-38,-38,-38,-38,-38,-36,-34,-33,-30,-28,-27,-26,-25,-24,-20,-40,10,12,12,10,9, +8,6,5,-2,-3,-5,-7,-2,0,-2,6,8,9,9,9,7,9,12,17,19,18,12,14,14,19, +9,7,6,14,17,21,14,12,10,5,-1,-9,-6,-13,-29,-24,-22,-21,-12,-10,-18,7,15,12,17, +17,16,22,32,45,53,48,24,24,22,34,13,9,6,30,39,41,23,25,23,8,1,-7,-7,-18, +-57,-65,-83,-76,-60,-37,-53,5,5,-2,11,8,5,15,30,57,71,67,33,45,43,66,10,1,1, +49,65,69,42,4,6,-20,-32,-37,-44,-78,-106,-127,-131,-69,-65,-48,-46,23,35,31,47,46,41,61, +92,140,160,137,61,54,51,96,23,5,13,86,117,112,47,145,91,89,78,50,101,135,147,73,14, +3,-13,-10,50,-38,-78,-118,-118,-124,-135,-134,-138,-175,-132,-84,-43,100,116,13,10,-19,-63,-11,6,-16, +109,-71,-30,55,79,61,-134,-199,-117,-45,-4,-4,3,-23,-44,2,34,32,34,53,99,86,99,105,135, +77,-50,-138,-170,-117,37,91,46,-59,-138,-147,-105,-138,-150,-239,-205,-55,-29,-30,-37,-2,5,-2,2,7, +-9,-31,-51,-47,-28,-21,-47,-40,-52,-89,-90,-78,-68,21,80,134,-136,-191,-26,44,129,216,-43,66,-25, +24,68,86,6,-1,30,11,-1,3,2,-7,-17,1,27,51,47,43,39,55,59,61,59,31,-17,-16, +-32,-10,-20,3,16,108,141,122,98,72,47,15,-18,-13,1,3,-14,-6,-6,-5,-12,-11,-7,7,2, +-10,-39,-57,-57,-51,-43,-29,0,25,44,46,42,34,-2,-30,-49,-58,-50,-21,47,-96,-94,-71,-48,-29, +-20,-12,-10,-7,-9,-10,3,17,28,16,0,-24,-43,-50,-45,-28,-6,14,48,75,92,121,135,140,120, +93,57,30,3,-36,-72,81,84,85,79,81,78,71,67,70,75,79,69,52,44,18,-1,-25,-20,-20, +-21,-23,-28,-33,-29,-25,-23,-1,20,43,51,62,71,68,67,72,78,20,24,11,17,11,9,10,7, +-1,-13,-25,-31,-38,-45,-44,-41,-40,-41,-45,-44,-41,-37,-35,-34,-33,-33,-29,-26,-22,-18,-13,-6,0, +7,13,16,-10,-5,-11,-13,-16,-9,-12,-14,-20,-23,-27,-31,-35,-40,-34,-33,-38,-36,-35,-35,-36,-36, +-36,-36,-36,-37,-34,-31,-29,-25,-22,-19,-18,-17,-15,-13,-37,8,10,11,9,7,5,6,4,-6,-3, +-6,-9,-4,-1,-4,4,5,7,7,7,6,8,10,15,16,16,10,12,13,18,7,5,3,13,15, +18,12,8,9,2,-4,-15,-5,-10,-33,-19,-16,-22,-9,-9,-20,2,9,8,15,17,18,24,32,42, +48,42,18,20,20,36,11,5,2,27,36,35,18,21,25,7,0,-16,-3,-13,-68,-59,-76,-86,-59, +-38,-57,-2,-3,-8,7,7,10,18,31,52,66,61,26,39,38,68,5,-4,-3,48,62,60,36,-6, +3,-24,-37,-59,-37,-66,-118,-112,-114,-63,-58,-47,-58,10,19,13,43,50,55,71,97,132,148,121,46, +41,49,106,21,-4,3,80,108,92,33,168,116,114,100,69,109,131,133,77,24,15,0,-2,39,-19, +-57,-123,-130,-144,-154,-152,-155,-181,-129,-73,-12,85,79,-13,-13,-23,-37,1,19,5,128,-71,-42,13,48, +68,-111,-173,-103,-43,-8,-8,2,-16,-39,1,29,30,26,45,93,97,113,108,117,47,-69,-152,-164,-81, +57,90,39,-78,-151,-130,-98,-146,-84,-168,-158,-103,-11,-3,-41,7,7,2,1,8,0,-25,-48,-48,-33, +-32,-60,-50,-59,-87,-81,-66,-59,53,93,92,-146,-174,11,59,133,237,-58,107,41,-36,-22,26,-14,-13, +12,6,-5,-1,1,-5,-14,1,23,50,48,49,48,61,60,50,47,24,-18,-23,-35,-7,-22,13,53, +141,150,81,106,67,50,38,11,11,6,0,-17,-2,1,2,-4,-7,-4,9,9,7,-20,-40,-45,-38, +-31,-20,0,18,34,29,19,8,-28,-52,-68,-71,-49,-13,54,-86,-96,-79,-58,-40,-27,-17,-14,-10,-13, +-15,-8,6,23,18,6,-18,-40,-50,-47,-33,-12,11,45,71,89,112,122,123,99,65,20,-7,-29,-54, +-74,53,59,64,58,60,57,48,42,52,62,73,68,59,55,27,7,-15,-13,-14,-17,-19,-23,-28,-25, +-22,-21,0,19,40,48,58,67,62,57,54,54,40,44,34,35,29,26,26,24,16,4,-7,-15,-22, +-28,-30,-29,-30,-34,-40,-41,-38,-35,-32,-31,-31,-32,-25,-19,-13,-7,-1,8,13,21,28,35,-4,2, +-4,-5,-8,-1,-5,-8,-13,-16,-19,-23,-26,-31,-26,-26,-33,-31,-31,-31,-32,-33,-33,-33,-33,-34,-30, +-28,-25,-20,-16,-13,-11,-10,-8,-6,-32,6,9,10,7,6,2,5,3,-9,-4,-6,-12,-5,-3,-5, +1,3,5,5,6,6,7,9,13,14,14,8,10,11,18,5,3,2,11,14,15,10,5,8,0, +-6,-19,-4,-8,-34,-14,-10,-21,-6,-8,-21,-3,3,5,11,15,20,24,31,39,43,36,14,14,16, +37,8,1,-1,25,33,28,14,18,27,6,-1,-22,1,-9,-76,-53,-69,-94,-56,-39,-59,-10,-11,-11, +2,6,15,20,31,49,60,54,22,33,33,69,1,-8,-6,46,58,50,31,-12,2,-27,-41,-73,-30, +-54,-120,-91,-91,-53,-45,-41,-63,-3,1,0,35,48,64,76,98,124,134,102,30,24,43,112,18,-11, +-3,74,99,71,21,180,134,126,113,86,113,120,108,72,28,21,10,6,27,1,-32,-121,-132,-151,-159, +-161,-163,-177,-119,-54,28,78,52,-31,-28,-22,-11,6,27,34,143,-65,-47,-18,21,69,-87,-140,-83,-33, +-10,-11,-2,-9,-32,-2,22,26,17,35,82,101,118,106,91,16,-83,-161,-153,-45,72,86,38,-88,-155, +-115,-90,-132,-24,-114,-121,-135,5,15,-33,17,5,6,1,7,6,-18,-40,-46,-33,-35,-62,-54,-61,-79, +-70,-51,-40,86,105,48,-150,-152,44,76,139,249,-50,128,127,-80,-109,-48,-28,-15,-2,1,-7,-3,-2, +-2,-9,0,18,48,50,53,56,65,56,38,31,15,-16,-26,-37,-7,-18,30,102,153,126,19,84,64, +55,63,49,38,10,-3,-15,2,5,6,3,-2,-1,10,15,22,-1,-20,-29,-24,-18,-7,4,14,25, +13,0,-14,-48,-69,-82,-75,-38,1,63,-65,-84,-77,-64,-47,-33,-21,-18,-12,-14,-16,-15,-3,15,18, +9,-12,-36,-47,-45,-35,-19,4,38,64,80,97,102,98,75,40,-9,-35,-53,-63,-66,20,28,37,34, +37,34,26,19,34,48,63,62,60,61,34,14,-4,-5,-9,-16,-15,-17,-21,-18,-15,-13,5,21,40, +45,52,58,50,40,28,25,53,58,50,47,42,39,40,38,31,21,11,4,-3,-8,-14,-14,-18,-24, +-33,-34,-32,-30,-27,-27,-26,-27,-19,-12,-4,3,10,20,25,32,39,47,3,7,3,2,-1,5,1, +-2,-7,-9,-12,-14,-18,-21,-16,-16,-27,-24,-25,-24,-25,-26,-27,-27,-27,-28,-24,-21,-18,-13,-9,-6, +-4,-2,0,1,-23,4,6,8,5,4,1,4,2,-11,-3,-5,-13,-6,-3,-6,-1,0,4,3,4, +4,5,7,10,11,11,6,7,7,15,2,0,-1,9,11,11,7,2,6,-2,-9,-20,-3,-6,-34, +-9,-6,-21,-5,-8,-20,-8,-4,3,7,13,19,22,28,34,35,27,8,6,10,36,4,-3,-4,21, +28,20,9,14,26,4,-3,-24,3,-6,-80,-46,-60,-98,-53,-39,-57,-18,-20,-10,-4,4,16,19,30, +45,52,46,16,23,24,67,-5,-13,-10,41,53,39,26,-16,0,-29,-44,-81,-24,-41,-110,-67,-65,-38, +-29,-31,-59,-15,-17,-10,25,42,66,76,95,114,115,78,12,2,31,111,12,-19,-9,67,87,49,9, +182,142,128,116,100,111,103,77,59,25,20,11,12,16,18,-6,-112,-126,-147,-154,-162,-164,-163,-105,-30, +72,81,36,-45,-40,-23,7,2,30,67,153,-60,-44,-39,-2,63,-65,-107,-60,-20,-12,-9,-6,-4,-23, +-7,14,21,7,23,66,95,113,98,61,-15,-98,-169,-140,-11,77,75,35,-99,-158,-106,-86,-104,34,-70, +-92,-142,13,23,-15,19,3,7,3,4,9,-9,-29,-40,-28,-31,-55,-54,-62,-70,-60,-36,-16,112,108, +4,-149,-129,72,91,143,239,-33,108,195,-105,-184,-121,-37,-11,-9,-2,-7,-3,-4,-2,-5,-2,11,42, +49,55,61,63,49,25,12,1,-18,-32,-40,-14,-11,49,149,134,66,-55,30,60,65,94,90,61,14, +-6,-10,5,6,7,6,3,1,11,20,34,19,1,-11,-10,-6,4,8,11,16,-4,-20,-34,-65,-84, +-92,-75,-26,13,64,-43,-67,-69,-65,-51,-38,-25,-21,-13,-13,-15,-17,-10,5,14,10,-6,-30,-42,-41, +-36,-25,-5,27,51,65,76,76,68,52,20,-29,-53,-68,-64,-54,-12,-3,10,11,16,14,9,2,19, +33,50,51,56,61,38,20,6,2,-4,-15,-11,-11,-12,-9,-4,0,14,26,40,40,41,44,32,17, +-2,-6,59,62,58,52,49,45,46,46,41,33,27,22,16,12,4,1,-5,-13,-24,-26,-23,-22,-20, +-20,-20,-21,-12,-5,4,11,20,30,33,39,45,53,8,11,8,8,6,10,7,4,1,-1,-3,-5, +-7,-8,-5,-6,-17,-15,-16,-16,-17,-17,-18,-18,-18,-19,-15,-12,-9,-5,-2,1,3,5,7,7,-14, +5,7,10,4,2,-3,4,1,-13,-5,-7,-15,-8,-6,-8,-4,-2,1,1,2,6,6,8,11,11, +10,6,7,7,17,3,1,0,10,12,10,8,3,8,-5,-7,-20,-2,-2,-30,-4,-1,-21,-4,-7, +-17,-11,-8,3,4,9,18,22,28,33,30,22,6,3,8,37,5,-2,-2,23,28,17,9,16,28, +3,-3,-25,5,-4,-77,-40,-50,-95,-48,-39,-50,-27,-27,-7,-8,2,17,20,30,45,46,39,15,19, +19,68,-5,-11,-6,43,53,35,26,-12,2,-28,-43,-80,-18,-29,-92,-44,-40,-21,-15,-20,-50,-24,-31, +-15,14,33,63,73,91,107,96,56,-2,-14,23,110,11,-19,-3,70,83,35,5,185,146,123,113,106, +104,82,47,43,14,16,7,13,8,28,17,-94,-113,-135,-140,-153,-154,-136,-80,3,120,99,38,-47,-39, +-16,26,3,38,106,167,-44,-34,-50,-17,53,-47,-76,-33,-11,-10,-6,-6,-3,-13,-10,5,16,-2,9, +49,85,105,92,39,-35,-104,-167,-118,28,83,67,38,-100,-151,-91,-75,-53,88,-32,-66,-128,15,21,0, +12,3,5,3,2,7,-1,-17,-32,-18,-19,-38,-43,-55,-54,-45,-12,26,141,114,-26,-131,-93,104,118, +159,229,2,69,223,-114,-230,-179,-41,-7,-9,-2,-5,-3,-4,-3,-3,-3,4,33,49,55,64,62,43, +17,-1,-9,-16,-29,-32,-15,13,80,193,102,-2,-113,-28,70,94,130,135,81,19,-5,-4,6,5,6, +6,5,2,11,22,42,37,21,10,8,9,18,17,16,17,-9,-26,-38,-68,-87,-89,-62,-6,32,68, +-16,-41,-56,-60,-52,-40,-26,-21,-11,-11,-13,-16,-13,-2,10,11,0,-24,-36,-34,-32,-26,-11,18,38, +50,56,54,45,36,12,-32,-53,-65,-52,-33,-32,-26,-13,-6,0,0,-4,-9,7,21,36,40,47,54, +38,25,16,9,0,-11,-3,0,2,7,13,20,29,38,46,40,35,32,18,1,-23,-27,60,63,58, +53,50,47,49,50,48,44,40,38,35,34,21,17,10,1,-13,-12,-9,-9,-8,-8,-8,-9,0,7, +15,23,31,40,41,45,49,56,17,19,14,13,9,17,11,6,5,4,3,2,1,1,5,7,-10, +-5,-5,0,-2,-2,-2,-2,-2,-3,0,3,5,8,10,13,14,16,17,17,3,3,6,8,6,5, +1,5,4,-8,0,-2,-9,-3,-2,-3,-2,-2,5,4,4,4,5,7,10,9,8,5,5,6,15, +2,0,0,9,11,8,7,3,8,0,-6,-15,1,1,-26,-1,1,-20,-6,-8,-13,-13,-10,5,2, +10,15,19,24,29,22,13,1,-2,5,35,3,-4,-1,22,26,13,7,16,28,6,-2,-22,7,-1, +-67,-31,-40,-80,-40,-37,-40,-32,-33,-1,-9,2,15,17,27,42,36,29,11,13,14,64,-7,-11,-3, +42,51,29,26,-10,4,-22,-40,-74,-11,-18,-68,-26,-19,-11,-8,-10,-36,-28,-40,-16,4,25,55,63, +81,94,70,29,-17,-27,16,104,8,-20,2,70,76,21,1,179,139,118,108,106,92,59,25,26,5, +11,3,11,3,31,32,-69,-96,-116,-122,-140,-138,-106,-52,36,157,112,38,-48,-38,-13,34,-2,42,137, +177,-33,-17,-46,-23,40,-31,-47,-12,-8,-5,-4,-4,-3,-6,-11,-2,14,-8,-1,30,69,91,80,19, +-52,-113,-159,-91,64,83,54,33,-106,-147,-82,-67,-11,132,14,-36,-94,10,17,4,5,3,3,3,2, +4,4,-5,-20,-5,-3,-17,-34,-49,-42,-37,4,62,152,105,-55,-108,-55,125,134,163,190,23,-13,188, +-105,-244,-206,-41,-4,-6,-2,-3,-2,-3,-3,-2,-4,-1,24,47,57,65,55,34,7,-16,-25,-25,-34, +-30,-22,41,107,208,47,-82,-169,-101,70,125,174,178,92,28,-3,1,5,3,5,5,5,3,10,24, +47,55,45,32,24,22,26,24,18,15,-16,-34,-45,-69,-86,-83,-49,5,35,55,2,-17,-34,-45,-43, +-33,-22,-18,-7,-7,-10,-13,-12,-6,7,12,7,-14,-25,-26,-27,-25,-16,6,21,30,33,33,27,25, +9,-28,-43,-52,-36,-15,-44,-39,-25,-17,-9,-9,-10,-13,2,12,26,28,37,44,37,30,26,18,9, +-3,6,12,16,23,31,40,44,47,49,37,26,18,4,-11,-35,-38,55,57,58,51,51,48,50,51, +52,52,53,53,52,53,40,34,27,18,5,6,8,7,8,8,8,7,14,19,25,32,40,46,45, +47,48,53,25,25,25,24,20,26,22,17,17,17,17,17,17,19,22,24,8,13,13,15,14,14, +14,14,15,14,16,18,19,21,22,24,24,26,27,26,19,-3,0,2,0,-1,-1,-2,-1,-9,-2, +-2,-8,-4,-4,-3,-8,-9,4,-1,-2,-3,-1,0,4,1,0,-1,-2,-1,8,-5,-6,-6,2,4, +1,1,-3,2,-4,-10,-18,-3,-3,-25,-4,-4,-25,-16,-16,-12,-19,-17,1,-4,4,6,10,14,19, +7,-2,-9,-11,-3,25,-6,-11,-8,13,16,2,0,10,22,1,-7,-24,4,-3,-56,-27,-32,-63,-36, +-37,-32,-38,-41,0,-13,-3,6,9,18,33,18,12,1,3,4,51,-16,-19,-9,32,40,17,18,-12, +0,-21,-39,-66,-8,-11,-45,-11,-7,-2,-2,-4,-21,-28,-44,-15,-5,14,39,49,63,73,36,-6,-37, +-39,6,85,-2,-28,-4,57,57,0,-9,163,119,100,93,91,71,35,11,10,2,5,1,7,0,27, +38,-43,-79,-101,-107,-129,-126,-84,-30,59,171,108,25,-55,-50,-24,25,-15,35,149,171,-31,-8,-46,-30, +22,-20,-23,-3,-5,-2,-2,-2,-2,-3,-10,-8,10,-14,-14,6,45,68,60,-5,-76,-137,-166,-83,76, +60,20,7,-127,-157,-88,-72,20,149,44,-14,-68,4,11,2,3,1,1,2,1,2,4,2,-12,5, +9,0,-26,-46,-38,-35,12,90,141,73,-98,-100,-32,124,141,158,142,32,-94,91,-109,-229,-207,-41,-3, +-2,-2,-2,-2,-2,-2,-1,-5,-5,9,37,50,56,41,19,-9,-36,-50,-47,-52,-39,-38,59,116,178, +-21,-151,-196,-158,64,150,200,199,87,33,-1,3,3,2,3,3,4,2,6,20,42,63,58,44,32, +25,26,23,14,4,-31,-50,-61,-83,-96,-87,-50,-4,23,26,7,-6,-26,-36,-36,-29,-19,-13,-4,-4, +-6,-7,-9,-7,3,8,8,-10,-21,-25,-29,-30,-26,-11,-4,-1,1,0,-4,-1,-9,-36,-43,-47,-28, +-9,-57,-56,-40,-34,-24,-22,-20,-18,-6,1,13,12,24,28,30,26,28,19,10,-2,7,14,20,28, +37,47,44,41,36,20,5,-8,-18,-30,-49,-52,34,34,46,35,40,39,40,42,44,47,52,53,55, +58,48,41,33,26,18,14,16,15,15,15,14,14,16,19,23,28,33,35,33,32,31,34,22,19, +23,25,27,23,24,24,26,27,26,28,29,31,28,27,22,22,21,20,20,21,21,21,21,21,22, +23,23,23,22,23,23,24,25,23,24,-5,0,2,-2,-4,-7,-3,-3,-12,-6,-6,-10,-8,-9,-6, +-11,-10,-1,-5,-5,-4,-3,-2,2,-2,-3,-3,-3,-3,6,-6,-7,-6,2,4,-1,0,-2,2,-6, +-9,-17,-5,-3,-21,-3,-6,-26,-22,-21,-9,-23,-21,1,-7,-2,1,6,8,12,-4,-12,-13,-13,-4, +20,-7,-11,-4,13,15,-1,0,12,22,2,-7,-23,1,-3,-42,-21,-22,-45,-30,-35,-22,-41,-45,1, +-16,-7,-2,5,12,27,4,-2,-4,0,2,40,-16,-16,0,34,40,14,20,-6,3,-16,-33,-54,-5, +-6,-23,-1,-1,7,3,-1,-8,-23,-43,-14,-12,3,23,35,47,54,2,-37,-49,-41,4,67,-6,-23, +10,60,54,-9,-8,162,108,92,80,74,50,17,3,5,0,-1,-2,4,0,19,35,-18,-60,-87,-92, +-112,-105,-54,5,91,185,111,22,-50,-43,-16,36,-5,49,173,180,-2,14,-37,-26,11,-10,-9,-1,-2, +0,1,0,-1,-1,-7,-11,6,-16,-23,-10,31,55,52,-10,-79,-139,-148,-55,100,59,11,0,-126,-143, +-69,-46,64,175,81,10,-47,3,6,0,1,0,0,0,1,1,4,6,-5,12,20,17,-11,-31,-21, +-17,40,133,143,59,-111,-70,8,130,155,157,94,47,-157,-28,-99,-181,-180,-34,0,-1,-1,0,0,-1, +-1,-1,-3,-6,-3,26,42,47,32,12,-13,-37,-54,-50,-49,-26,-30,95,133,135,-77,-196,-208,-181,55, +178,224,207,79,36,0,3,1,0,1,1,2,2,2,14,35,64,66,56,46,37,35,30,20,9, +-27,-47,-57,-77,-89,-75,-47,-17,3,-6,16,10,-13,-20,-26,-19,-12,-5,0,0,-1,-3,-4,-6,0, +6,10,-3,-16,-20,-23,-26,-25,-18,-16,-18,-14,-12,-14,-9,-12,-33,-32,-32,-14,4,-59,-61,-51,-45, +-38,-34,-29,-24,-14,-8,1,1,9,13,19,20,25,19,12,4,14,20,26,36,46,57,49,40,31, +13,-4,-18,-25,-35,-51,-55,16,14,24,21,26,27,29,32,35,39,46,49,54,59,51,45,39,33, +24,24,26,24,24,23,21,22,22,23,24,27,29,27,24,21,18,17,23,20,22,22,22,23,23, +22,24,26,27,29,29,32,31,32,24,27,27,30,29,30,30,30,31,31,31,30,29,28,27,27, +26,26,26,24,33,-8,-3,-2,-4,-5,-7,-6,-5,-10,-5,-5,-8,-8,-9,-5,-13,-13,-1,-6,-7, +-8,-6,-5,-2,-7,-7,-6,-5,-5,1,-8,-9,-7,-1,1,-4,-2,-3,0,-5,-10,-16,-6,-5,-16, +-5,-9,-25,-28,-26,-7,-26,-23,0,-10,-5,-6,-1,1,3,-16,-23,-18,-14,-5,12,-9,-11,-3,10, +10,-7,-3,10,18,1,-9,-21,-2,-4,-27,-15,-14,-28,-24,-31,-14,-41,-46,1,-18,-11,-10,-2,4, +17,-12,-16,-7,1,4,28,-16,-13,6,31,35,7,17,-5,3,-11,-28,-41,-4,-3,-7,3,3,7, +8,3,0,-13,-38,-12,-18,-7,6,19,28,30,-34,-68,-58,-36,7,46,-8,-17,20,55,43,-21,-11, +141,85,80,63,52,31,5,1,1,-2,-3,-4,0,-1,9,27,1,-40,-72,-77,-96,-84,-24,44,127, +200,120,31,-29,-30,-10,38,-2,51,174,169,-2,26,-21,-18,5,-2,-5,0,-1,1,1,1,0,0, +-4,-10,3,-12,-24,-21,18,40,38,-20,-88,-143,-128,-27,119,57,-2,-21,-134,-141,-71,-44,72,172,110, +22,-35,7,3,0,0,-1,-1,-1,0,0,2,6,1,14,27,28,-2,-22,-13,-4,56,154,123,26, +-131,-50,38,121,158,143,34,37,-198,-175,-107,-127,-138,-20,1,-1,1,1,1,1,0,0,-1,-4,-10, +12,32,32,15,-2,-25,-46,-66,-65,-60,-26,-24,118,131,66,-120,-206,-191,-174,41,181,219,184,64,33, +-3,1,-1,-1,-1,-1,0,1,-1,8,26,61,73,64,55,43,34,25,14,2,-32,-52,-61,-75,-79, +-60,-42,-30,-19,-36,25,22,0,-4,-13,-7,-4,1,3,3,2,1,0,-2,0,5,13,5,-6,-12, +-17,-23,-28,-30,-34,-38,-32,-26,-26,-20,-19,-29,-20,-13,5,19,-53,-59,-53,-50,-45,-40,-32,-25,-17, +-13,-6,-7,0,2,10,13,21,18,15,11,17,21,25,34,43,52,40,28,15,1,-13,-25,-28,-34, +-44,-49,2,-2,8,8,14,16,18,22,24,29,36,41,47,53,50,46,43,39,32,34,35,34,34, +33,32,33,30,30,30,29,28,24,19,13,9,6,25,21,24,24,24,26,26,27,30,32,33,35, +36,39,37,38,32,35,36,38,38,38,39,39,40,40,39,38,36,34,32,31,30,30,29,26,42, +-11,-6,-5,-7,-8,-9,-9,-8,-10,-7,-7,-8,-11,-12,-6,-16,-16,-4,-9,-10,-12,-9,-9,-7,-12, +-12,-9,-8,-7,-4,-10,-10,-7,-3,-3,-8,-5,-5,-3,-7,-12,-17,-10,-8,-12,-7,-11,-25,-33,-32, +-8,-28,-26,-3,-14,-10,-12,-7,-7,-7,-28,-33,-23,-14,-5,3,-12,-12,-1,7,5,-13,-6,8,14, +-1,-11,-21,-6,-5,-14,-9,-7,-13,-15,-25,-7,-38,-45,-1,-21,-16,-18,-8,-5,5,-29,-30,-12,3, +6,13,-15,-10,14,30,30,-2,14,-3,2,-11,-24,-31,-3,-1,0,3,3,5,7,5,4,-4,-29, +-11,-21,-16,-9,5,9,3,-69,-96,-65,-27,11,22,-11,-10,32,51,32,-34,-13,126,65,63,43,31, +13,-1,0,-1,-1,-2,-3,-2,-1,3,16,14,-23,-58,-66,-82,-66,-2,75,150,197,119,34,-12,-20, +-1,49,17,66,178,158,21,35,-14,-9,4,-2,-3,1,0,1,1,2,1,1,-1,-8,-1,-7,-20, +-26,10,29,24,-32,-98,-145,-110,-9,120,49,-14,-40,-128,-119,-45,-16,104,178,126,28,-30,12,-2,0, +-1,-1,-1,-1,-1,0,1,3,3,12,26,33,6,-9,-3,14,75,165,98,-6,-144,-28,70,125,172, +138,-5,44,-196,-283,-109,-72,-91,-4,0,1,1,1,1,1,1,0,0,-1,-11,0,16,14,-3,-15, +-35,-53,-72,-68,-60,-13,1,142,127,0,-134,-183,-160,-133,26,173,196,148,53,23,-6,0,-3,-2,-2, +-1,-1,0,-1,2,16,50,70,66,58,46,36,25,15,3,-26,-46,-57,-70,-68,-43,-39,-43,-39,-57, +37,38,15,11,0,4,2,5,5,4,3,3,2,1,0,4,14,11,2,-7,-12,-20,-27,-33,-42, +-50,-40,-35,-34,-29,-27,-28,-12,4,24,37,-43,-50,-48,-46,-44,-38,-29,-21,-16,-12,-8,-10,-6,-5, +1,6,14,15,15,17,21,23,26,33,40,47,34,20,7,-4,-14,-24,-25,-30,-37,-41,-11,-17,-7, +-6,1,4,5,8,10,15,22,27,33,40,42,42,42,41,38,40,41,41,40,40,39,41,36,35, +32,30,26,20,13,6,1,-4,24,19,24,25,26,25,28,30,34,36,37,40,41,43,40,40,39, +40,41,42,42,43,44,44,45,45,43,41,38,36,34,32,31,30,28,26,45,-14,-7,-7,-10,-11, +-12,-12,-11,-10,-9,-9,-10,-14,-14,-7,-18,-19,-7,-13,-14,-15,-13,-12,-11,-17,-16,-13,-10,-9,-10, +-13,-12,-8,-6,-5,-11,-7,-5,-5,-10,-13,-17,-13,-10,-8,-7,-12,-22,-35,-35,-10,-30,-27,-6,-17, +-14,-18,-12,-14,-17,-38,-41,-27,-14,-6,-9,-16,-14,0,3,1,-17,-7,11,12,-2,-11,-18,-9,-5, +-3,-4,-2,-5,-6,-14,-2,-31,-42,-4,-22,-21,-26,-14,-14,-9,-43,-42,-17,3,5,-7,-18,-10,20, +26,25,-6,15,4,3,-8,-18,-21,-2,1,1,1,2,2,5,4,3,4,-17,-10,-23,-22,-23,-8, +-10,-26,-99,-117,-70,-19,11,-10,-21,-9,39,42,20,-39,-9,114,56,55,31,17,4,-1,0,-1,-1, +-1,-2,-2,-2,1,6,17,-11,-46,-58,-68,-47,18,104,167,182,106,30,-2,-11,6,55,33,80,182, +149,32,46,5,4,4,-2,0,1,0,1,1,1,1,1,0,-4,-3,-3,-13,-26,4,15,5,-49, +-108,-143,-88,9,114,47,-16,-49,-119,-102,-31,3,96,173,141,26,-19,11,-4,1,-1,0,-1,-1,-1, +-1,0,2,4,6,19,31,12,5,11,41,97,166,74,-29,-141,-1,102,125,173,118,-54,23,-193,-370, +-117,-37,-44,4,-1,2,0,1,1,1,1,1,0,1,-8,-10,0,-4,-18,-26,-43,-57,-73,-66,-59, +-2,34,151,107,-68,-139,-150,-123,-94,1,126,140,95,39,7,-6,-1,-3,-2,-2,-2,-2,-1,-1,-1, +7,37,61,64,60,51,40,24,12,-1,-26,-46,-59,-67,-57,-30,-40,-60,-64,-75,43,47,28,21,10, +10,4,5,4,4,3,4,3,3,1,3,12,16,10,2,-5,-14,-22,-32,-44,-56,-46,-41,-41,-38, +-35,-27,-7,14,33,47,-36,-42,-42,-40,-40,-33,-23,-15,-10,-8,-7,-9,-7,-8,-4,0,8,11,16, +21,20,20,20,25,29,33,21,8,-5,-11,-17,-25,-24,-27,-32,-37,-22,-30,-20,-19,-12,-9,-9,-6, +-5,0,6,11,17,24,30,32,35,38,40,41,41,41,41,41,40,42,36,33,29,24,19,12,5, +-2,-8,-14,18,14,19,21,24,20,24,28,32,34,36,38,40,42,37,35,41,39,39,38,39,40, +40,41,41,42,39,37,34,31,29,27,26,24,22,20,41,-15,-9,-9,-11,-12,-14,-14,-12,-9,-10, +-11,-12,-17,-17,-9,-18,-19,-10,-15,-15,-17,-14,-14,-14,-19,-18,-14,-10,-10,-14,-14,-12,-7,-7,-7, +-13,-9,-7,-7,-10,-14,-15,-15,-11,-3,-6,-10,-17,-31,-33,-11,-30,-27,-7,-18,-17,-22,-16,-20,-25, +-44,-44,-28,-11,-6,-17,-16,-12,4,1,-4,-20,-9,8,7,-2,-11,-16,-10,-4,2,-2,1,0,2, +-6,2,-21,-34,-7,-22,-23,-31,-17,-20,-20,-51,-47,-18,6,7,-21,-15,-4,30,23,18,-13,11,1, +0,-6,-15,-14,0,1,0,0,0,0,1,2,1,7,-7,-8,-22,-27,-33,-18,-26,-50,-116,-124,-68, +-8,12,-34,-22,0,53,35,7,-47,-12,84,40,42,20,6,0,0,0,0,0,0,-1,-1,-2,-1, +0,15,0,-34,-50,-53,-28,35,126,175,162,96,34,19,8,20,59,45,84,166,119,38,42,12,11, +1,-1,1,0,0,0,0,0,1,1,1,-2,-4,1,-5,-19,2,5,-11,-59,-105,-120,-53,34,112, +48,-14,-57,-101,-75,-7,21,100,159,131,19,-12,6,-3,1,-1,0,0,0,-1,-1,0,0,3,2, +11,28,22,23,31,71,116,154,49,-47,-130,15,113,111,161,97,-70,19,-153,-389,-123,-14,-14,3,0, +1,0,1,0,1,1,1,0,1,-3,-14,-13,-19,-30,-35,-49,-61,-73,-64,-59,3,58,136,71,-118, +-125,-102,-75,-43,-16,65,72,46,25,-6,-2,-2,-1,-1,-1,-1,-1,-1,-1,-2,1,26,52,62,60, +51,39,19,4,-8,-28,-48,-61,-65,-48,-20,-37,-63,-73,-73,52,57,36,26,16,9,4,4,3,2, +1,2,3,3,2,3,10,19,17,10,1,-10,-21,-31,-43,-59,-49,-45,-47,-43,-39,-23,-4,20,40, +55,-28,-33,-33,-31,-32,-24,-15,-7,-5,-3,-3,-4,-6,-7,-8,-6,0,3,9,16,12,12,10,11, +13,14,5,-4,-12,-15,-18,-23,-21,-23,-27,-30,-26,-34,-29,-26,-21,-18,-18,-16,-14,-10,-5,-1,5, +10,18,22,27,31,37,38,37,37,37,37,36,37,31,28,24,18,12,6,-1,-7,-12,-18,12,8, +13,15,18,13,17,21,24,26,28,30,32,34,30,28,36,33,33,32,33,33,33,34,34,34,32, +29,26,24,22,20,19,17,15,13,33,-15,-9,-11,-12,-14,-15,-15,-13,-8,-11,-12,-12,-18,-18,-10, +-18,-18,-12,-16,-16,-17,-15,-15,-16,-19,-18,-14,-10,-10,-16,-14,-12,-6,-8,-9,-14,-10,-7,-10,-12, +-14,-14,-16,-11,1,-5,-8,-12,-25,-27,-11,-29,-26,-9,-17,-18,-22,-18,-23,-30,-44,-42,-27,-9,-5, +-23,-16,-10,7,-1,-7,-22,-10,6,1,-5,-12,-15,-11,-2,3,0,2,2,5,1,4,-10,-24,-10, +-21,-23,-31,-19,-23,-28,-52,-45,-17,8,8,-32,-13,-1,36,18,12,-16,7,1,-6,-9,-12,-9,2, +1,-1,0,0,-1,-1,0,-1,6,1,-6,-19,-28,-37,-24,-37,-68,-120,-118,-61,1,10,-55,-25,5, +60,27,-3,-49,-13,66,34,32,12,1,1,-1,0,0,0,0,0,0,0,-2,-1,8,7,-23,-39, +-35,-7,51,140,176,143,87,40,36,26,31,55,54,89,156,97,47,41,18,12,-2,0,0,0,0, +0,0,0,0,0,1,1,-4,1,3,-10,-1,-7,-29,-73,-104,-102,-30,41,87,38,-15,-57,-80,-50, +14,41,82,146,120,13,-6,3,-2,0,0,0,0,0,0,0,0,-1,3,0,5,22,26,34,42, +87,115,120,15,-66,-118,22,110,95,133,63,-92,2,-125,-366,-117,-3,-1,1,1,0,0,0,0,0, +0,0,1,0,1,-13,-22,-32,-41,-44,-56,-64,-72,-60,-53,11,84,112,35,-139,-100,-58,-40,-13,-26, +-7,5,8,11,-7,0,-1,0,0,0,0,0,-1,-1,-1,-3,16,41,54,52,46,35,15,0,-12, +-24,-42,-53,-53,-34,-10,-28,-54,-70,-55,53,60,42,27,16,5,4,1,0,0,0,1,1,2,3, +2,6,18,21,17,7,-4,-15,-23,-35,-52,-46,-44,-46,-43,-38,-19,-3,22,39,55,-20,-23,-25,-23, +-23,-15,-8,-1,0,1,1,0,-1,-3,-7,-8,-5,-3,3,10,6,4,1,0,0,-2,-6,-11,-15, +-15,-15,-18,-16,-18,-20,-22,-25,-32,-30,-27,-24,-22,-22,-20,-18,-14,-11,-8,-5,-1,7,13,18,24, +33,34,33,32,31,30,29,29,24,21,17,12,6,1,-5,-9,-13,-19,6,3,7,8,11,6,9, +12,15,17,19,21,23,25,22,20,28,26,25,24,25,24,24,24,24,25,22,20,18,16,14,13, +12,10,8,7,23,-14,-9,-10,-11,-13,-14,-13,-12,-6,-10,-12,-12,-18,-18,-11,-16,-15,-12,-14,-14, +-15,-14,-14,-16,-18,-17,-13,-9,-10,-17,-13,-10,-4,-7,-8,-13,-9,-6,-10,-11,-12,-12,-15,-10,4, +-3,-4,-6,-14,-17,-8,-24,-24,-9,-14,-16,-21,-18,-24,-33,-41,-38,-24,-7,-6,-27,-15,-8,9,-1, +-7,-19,-8,6,-3,-5,-9,-12,-6,0,1,0,2,2,5,3,3,0,-11,-10,-17,-20,-29,-19,-25, +-34,-48,-41,-16,7,5,-40,-13,1,39,14,8,-14,7,4,-7,-8,-9,-3,3,0,-1,0,-1,-1, +-2,-1,-2,2,4,-2,-14,-25,-37,-29,-46,-79,-113,-104,-53,4,4,-67,-27,8,63,22,-7,-40,-7, +42,28,25,8,0,-1,0,0,0,0,1,1,0,1,-1,-2,2,8,-11,-27,-19,9,57,136,157, +110,66,34,36,34,35,42,51,80,131,69,38,30,20,7,-2,1,0,0,0,0,0,0,0,0, +0,1,-3,0,7,-5,-9,-23,-49,-87,-103,-83,-13,42,65,30,-12,-53,-59,-30,25,44,68,119,92, +5,-5,2,-1,1,0,0,0,0,0,0,0,-1,1,0,-2,16,30,45,57,103,116,93,-1,-63, +-88,33,103,80,105,38,-85,-2,-95,-306,-106,5,1,1,0,0,0,0,0,0,0,0,1,0,2, +-7,-26,-38,-43,-45,-54,-57,-60,-47,-34,26,103,84,3,-134,-70,-20,-4,1,-18,-65,-42,-13,3,-4, +1,0,1,0,1,0,0,0,-1,0,-4,8,31,47,46,41,33,14,0,-13,-21,-37,-45,-44,-25, +-5,-16,-33,-46,-20,49,58,44,26,11,1,2,-1,-1,-1,-1,-1,0,0,1,2,3,17,24,23, +14,3,-9,-15,-26,-44,-41,-41,-44,-40,-34,-14,-3,19,33,48,-12,-14,-16,-13,-12,-6,-1,4,2, +3,2,2,0,0,-3,-7,-6,-6,-3,4,-2,-4,-7,-9,-11,-14,-15,-16,-16,-14,-13,-14,-12,-13, +-14,-14,-22,-27,-28,-24,-24,-22,-21,-18,-15,-12,-10,-8,-7,-5,-1,4,10,17,27,28,26,25,23, +22,21,20,16,13,10,6,1,-3,-7,-10,-12,-17,0,-1,1,2,4,0,2,3,5,6,8,10, +12,14,13,12,20,17,17,15,16,15,15,15,14,14,12,10,9,8,7,6,5,4,2,1,13, +-14,-9,-12,-11,-12,-12,-12,-11,-4,-9,-10,-11,-16,-17,-12,-15,-14,-12,-13,-13,-14,-14,-14,-17,-17, +-16,-13,-10,-10,-18,-13,-10,-4,-9,-10,-13,-9,-8,-12,-10,-11,-11,-14,-7,3,-1,-2,-3,-8,-9, +-5,-17,-20,-11,-11,-14,-19,-19,-24,-33,-36,-32,-22,-7,-8,-29,-16,-9,7,-5,-10,-18,-9,2,-8, +-5,-9,-9,-2,1,0,0,1,1,3,3,3,3,-2,-7,-13,-16,-25,-19,-26,-36,-42,-34,-16,3, +-1,-45,-15,-2,34,6,1,-14,2,-1,-13,-7,-6,1,2,0,0,0,0,-1,-1,-1,-1,-1,2, +1,-8,-20,-33,-31,-50,-81,-97,-84,-44,4,-4,-74,-32,3,54,11,-14,-35,-9,21,19,17,3,-1, +0,0,0,0,0,0,1,1,1,0,-1,-1,6,-3,-16,-5,20,58,119,127,75,41,22,32,38, +35,25,44,67,103,41,37,21,16,-1,1,0,0,0,0,0,0,0,0,0,0,1,-1,-2,5, +-3,-15,-34,-58,-88,-88,-56,8,48,50,25,-9,-45,-37,-8,39,50,53,96,66,-4,-1,1,0,0, +0,0,0,0,0,0,0,-1,0,1,-3,13,32,53,68,106,104,62,-16,-61,-63,35,87,66,72, +11,-80,-7,-79,-230,-81,11,0,0,0,0,0,0,0,0,0,0,0,0,2,-2,-23,-38,-40,-43, +-50,-50,-49,-38,-18,34,102,48,-24,-112,-46,3,18,-5,-3,-101,-65,-16,3,-1,1,0,1,1,1, +1,0,0,-1,0,-3,2,24,40,38,33,25,9,-4,-17,-22,-34,-35,-35,-16,1,1,-6,-13,17, +37,49,42,20,2,0,0,-2,-1,-1,-1,-1,-1,0,0,2,0,13,24,25,17,9,-2,-7,-17, +-34,-34,-35,-38,-34,-28,-11,-5,11,22,32,-4,-4,-8,-4,-3,-1,3,4,3,3,3,2,2,1, +0,-3,-5,-8,-7,-3,-8,-9,-11,-14,-17,-20,-19,-18,-17,-14,-11,-10,-8,-8,-8,-6,-17,-21,-23, +-20,-20,-18,-15,-12,-9,-9,-8,-7,-6,-5,-4,-2,3,9,19,20,17,16,14,13,11,10,7,5, +3,0,-3,-5,-8,-10,-11,-14,-4,-4,-3,-3,-2,-5,-4,-4,-4,-2,-1,1,3,4,5,4,12, +9,8,7,7,7,6,6,5,5,3,2,1,1,0,0,-1,-2,-3,-3,4,-12,-9,-11,-11,-11, +-12,-11,-11,-4,-8,-10,-10,-14,-15,-12,-14,-12,-12,-11,-11,-11,-12,-12,-15,-14,-13,-11,-9,-9,-16, +-11,-9,-3,-8,-9,-11,-8,-8,-12,-10,-9,-10,-11,-4,3,0,0,0,-2,-2,-1,-8,-13,-12,-8, +-11,-16,-17,-22,-30,-29,-25,-18,-7,-8,-27,-15,-8,7,-5,-9,-14,-8,-1,-12,-7,-8,-4,2,2, +0,0,0,0,1,1,1,3,3,-2,-9,-10,-18,-17,-24,-33,-32,-24,-14,1,-5,-41,-13,-2,29, +2,-2,-11,-1,-3,-17,-8,-2,2,0,-1,0,0,0,0,0,-1,-1,-1,-1,2,-2,-13,-27,-30, +-48,-74,-76,-62,-34,2,-9,-69,-30,1,46,6,-14,-26,-8,10,16,10,1,-1,0,0,0,0,0, +0,0,0,0,1,0,-1,3,2,-4,9,31,58,100,99,50,24,16,28,41,35,10,35,53,77, +24,29,17,10,-4,2,-1,0,0,0,0,0,0,0,0,0,0,0,-2,2,-4,-22,-41,-62,-81, +-71,-35,19,46,34,16,-8,-36,-21,4,40,45,36,68,39,-8,1,0,0,0,0,0,0,0,0, +0,0,0,-1,1,-2,10,32,53,69,96,83,35,-26,-54,-40,33,67,49,39,-10,-65,-8,-62,-157, +-51,16,-4,1,-1,0,0,0,0,0,0,0,0,0,0,2,-16,-33,-34,-37,-43,-40,-36,-28,0, +40,91,20,-39,-81,-28,14,38,-10,18,-105,-62,-4,1,0,0,1,0,0,0,0,0,0,0,0, +-1,-2,16,33,29,25,17,6,-5,-18,-21,-30,-27,-27,-9,7,17,20,21,48,22,38,35,10,-2, +-1,-1,-1,-1,-1,-1,0,-1,0,-1,0,0,7,20,24,18,12,3,0,-9,-23,-26,-28,-29,-26, +-21,-9,-9,1,7,14,4,4,-1,2,1,2,3,2,2,1,1,1,1,1,1,1,-2,-8,-10, +-9,-11,-12,-14,-17,-19,-22,-20,-18,-17,-12,-9,-6,-4,-3,-2,1,-13,-15,-17,-15,-14,-12,-8,-5, +-3,-3,-3,-3,-2,-3,-4,-4,-2,2,11,11,8,7,6,4,3,1,0,-1,-2,-4,-6,-7,-9, +-10,-11,-12,-6,-6,-6,-6,-5,-8,-8,-8,-8,-7,-6,-5,-4,-3,-2,-1,4,3,2,1,1,0, +-1,-1,-2,-2,-3,-3,-4,-4,-4,-4,-4,-5,-5,-6,-3,-10,-7,-9,-9,-9,-10,-9,-8,-2,-5, +-7,-7,-9,-10,-9,-10,-10,-11,-8,-8,-9,-10,-10,-12,-11,-10,-9,-8,-8,-14,-9,-8,-3,-7,-8, +-8,-7,-6,-11,-8,-7,-8,-5,-1,1,0,0,1,0,0,1,-2,-4,-8,-6,-7,-12,-14,-19,-24, +-21,-18,-14,-7,-8,-23,-13,-8,4,-5,-8,-10,-7,-2,-13,-6,-4,1,2,1,0,0,0,0,0, +0,0,1,2,1,-3,-6,-12,-14,-20,-28,-22,-16,-11,-2,-8,-35,-12,-4,21,-1,-3,-6,-2,-3, +-17,-5,1,0,-1,0,0,0,0,0,0,0,0,0,-1,0,1,-6,-19,-27,-42,-62,-54,-41,-25, +-2,-13,-57,-28,-3,34,2,-11,-14,-5,-1,10,6,-2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,5,16,34,52,75,68,30,11,10,22,38,30,-3,23,35,49,9,22,13,2,-3, +2,-1,0,0,0,0,0,0,0,0,0,0,0,-1,0,-7,-26,-44,-60,-69,-54,-20,23,39,22, +10,-6,-27,-7,13,37,39,22,44,16,-6,2,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,8,29,47,62,76,59,14,-30,-44,-22,28,47,33,13,-23,-50,-9,-50,-100,-19,11,-4,1,-1, +0,0,0,0,0,0,0,0,0,-1,2,-7,-26,-25,-29,-33,-29,-23,-17,14,41,69,-1,-43,-53, +-17,17,45,-16,35,-85,-38,6,-2,1,0,0,0,0,0,0,0,0,0,0,1,-4,9,25,20, +16,9,2,-6,-17,-19,-25,-19,-18,-3,14,30,39,47,64,7,24,25,-1,-2,0,-1,0,0,0, +0,0,0,0,0,0,0,2,15,20,16,13,6,3,-3,-14,-18,-19,-20,-18,-16,-11,-14,-10,-6, +-2,9,10,5,4,2,2,1,0,1,1,1,0,0,0,1,1,1,-4,-9,-10,-12,-12,-13,-15, +-17,-20,-18,-17,-16,-12,-8,-4,-1,1,4,7,-10,-10,-12,-9,-8,-5,-1,-1,0,0,0,0,0, +0,-1,-2,-4,-3,3,3,1,0,-2,-3,-4,-6,-6,-6,-6,-7,-8,-9,-9,-9,-10,-10,-7,-6, +-7,-8,-8,-8,-9,-9,-8,-8,-7,-7,-6,-6,-5,-5,-2,-2,-3,-4,-4,-5,-5,-6,-6,-7,-7, +-7,-7,-7,-7,-6,-6,-6,-6,-6,-6,-7,-6,-7,-7,-7,-9,-7,-5,-2,-4,-4,-4,-5,-6,-5, +-6,-7,-10,-6,-6,-6,-7,-8,-9,-7,-7,-7,-6,-6,-10,-7,-6,-3,-5,-6,-6,-5,-5,-8,-7, +-5,-3,0,1,1,1,1,1,1,1,2,1,0,-3,-4,-5,-8,-11,-14,-18,-14,-11,-10,-6,-7, +-16,-10,-6,2,-4,-6,-6,-5,-3,-11,-5,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,-2,-7,-10,-14,-20,-14,-10,-8,-4,-8,-24,-10,-4,13,-3,-3,-3,-2,-4,-15,-1,1,-1,0, +0,0,0,0,0,0,0,0,0,0,-1,1,-2,-11,-21,-32,-44,-34,-24,-16,-4,-12,-40,-21,-4, +21,-1,-9,-7,-4,-4,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,10, +18,31,41,49,40,15,3,5,14,30,23,-8,15,22,28,2,15,10,-2,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,-9,-24,-37,-47,-49,-34,-9,20,29,13,4,-5,-18,1,16, +29,28,11,22,2,-2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,23,36,47, +52,36,3,-25,-31,-8,20,29,20,-3,-26,-33,-7,-35,-57,1,2,-1,1,0,0,0,0,0,0, +0,0,0,0,-1,1,-2,-15,-16,-19,-21,-17,-12,-6,21,35,45,-11,-36,-28,-7,16,41,-15,40, +-49,-10,4,-1,1,0,0,0,0,0,0,0,0,0,0,1,-2,2,17,12,10,3,-1,-6,-14, +-16,-19,-12,-10,3,18,33,44,54,60,-3,13,10,-3,0,-1,0,0,0,0,0,0,0,0,0, +0,0,-1,7,15,12,12,7,5,0,-7,-10,-11,-12,-11,-12,-11,-15,-15,-13,-11,10,12,6,1, +1,0,0,0,0,0,0,0,0,0,0,0,1,0,-6,-9,-9,-10,-10,-12,-13,-15,-13,-13,-13, +-9,-6,-2,1,3,6,10,-7,-7,-7,-3,-3,0,1,2,1,1,1,1,1,1,1,0,-2,-4, +-2,-2,-3,-4,-5,-6,-7,-8,-7,-7,-7,-7,-7,-8,-8,-8,-8,-8,-6,-5,-6,-7,-8,-6,-6, +-6,-6,-5,-5,-5,-5,-5,-5,-6,-5,-5,-5,-5,-6,-6,-6,-7,-7,-7,-7,-7,-7,-7,-7,-6, +-6,-6,-6,-6,-7,-5,-4,-5,-5,-5,-6,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-6,-4,-4, +-4,-5,-5,-6,-5,-5,-5,-4,-5,-6,-5,-4,-3,-4,-4,-4,-4,-4,-6,-5,0,1,1,0,0, +0,0,0,0,0,0,0,1,1,1,-3,-5,-7,-9,-11,-8,-7,-6,-5,-6,-10,-7,-5,0,-4, +-4,-4,-4,-2,-9,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-4,-6,-9, +-12,-8,-6,-6,-4,-7,-14,-7,-4,5,-3,-3,-1,-2,-3,-10,2,-1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,-5,-13,-20,-26,-18,-12,-10,-5,-10,-24,-15,-5,9,-2,-5,-1,-2, +-4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,8,14,21,26,25,18, +6,-1,2,7,17,12,-10,6,9,10,-2,9,6,-2,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,-8,-18,-25,-30,-28,-17,-1,15,19,7,2,-4,-10,5,13,18,16,4,7,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,15,22,28,27,15,-4,-19,-19, +-2,10,13,9,-9,-21,-18,-5,-22,-23,4,-1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,-6,-8,-10,-11,-9,-4,1,18,24,21,-11,-23,-12,-2,10,24,-10,29,-13,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,-1,9,6,4,0,-2,-5,-10,-11,-12,-7,-4,5, +16,26,34,42,41,-8,4,1,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,9, +7,8,5,4,1,-2,-5,-5,-6,-6,-8,-10,-13,-14,-13,-13,8,11,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,-1,-6,-5,-6,-6,-7,-8,-8,-8,-8,-8,-6,-4,-1,1,3, +5,8,-4,-4,-3,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,-4,-4,-4,-5,-5, +-6,-6,-6,-6,-6,-5,-5,-6,-6,-6,-5,-5,-5,-4,-4,-5,-5,-5,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-5,-5,-5,-5,-5,-5,-5,-5,-6,-6,-6,-6,-5,-5,-5,-5,-5,-4,-4,-4,-6, +-1,-1,-1,-1,-2,-2,0,0,0,0,0,0,0,1,1,0,0,-2,-1,-1,0,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,-1,-1,-1,-2,-2,-1,-1,-1,-1,-1,-2,-1,-1,0,-1,-1,-1,-1,0,-2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-2,-1,-1,-1,-1, +-1,-2,-1,-1,1,-1,-1,0,0,-1,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,-1,-2,-4,-5,-3,-1,-1,-1,-2,-4,-3,-1,2,-1,-1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,-1,2,5,5,7,5,3,1,0,1,2,5, +4,-1,2,2,2,0,3,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-2,-4,-5,-6,-5,-3,0,3,4,1,0,-1,-2,2,3,4,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,3,5,6,5,3,-1,-4,-3,1,3,3,3,-2, +-4,-3,-1,-5,-3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-2, +-1,-1,0,1,5,6,4,-3,-5,-2,1,3,6,-2,8,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,1,1,0,-1,-1,-2,-2,-2,-1,0,2,5,7,9,11,10, +-2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,2,2,2,2,1,1, +0,-1,-1,-1,-1,-2,-2,-3,-3,-3,-3,2,3,-1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,-1,-1,-1,-1,-1,-1,-2,-2,-2,-2,-1,-1,0,1,1,2,2,-1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,-2,-1,-1,-1,-2,-2,-2,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,0,1,1,1,1,1,1,1,0,1,-2, +-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, }; -const UWord32 defaultHRIR_rom_EL32_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { -0x054a4eb8,0x04f4f0d8,0x05569b70,0x04b47630,0x052be930,0x0558ee78,0x05a21340,0x05c92f10,0x06092e60,0x05a367d8,0x056ef578,0x053967f0,0x050b7040,0x04e48198,0x04c1a078,0x04ab4c58,0x04922828,0x04796a68,0x045da820,0x040c93f8,0x048b76b0,0x046b48d0,0x04a92308,0x0663b628,0x04465358, -0x047a43a0,0x05ccc530,0x05e3ce48,0x05bf4e28,0x05441fe8,0x05c979c8,0x05fd7718,0x05df75e0,0x04a4ec80,0x04991e50,0x06641720,0x053f2f28,0x06b72af0,0x06f11a08,0x06feb018,0x080029f0,0x08c5c000,0x09cc9040,0x0a736fb0,0x0afda5f0,0x09a82a90,0x08b57570,0x07cbf1f8,0x070ce3d8,0x0679eea8, -0x060e5dc0,0x05bead00,0x056ee598,0x052b2f60,0x04bdb2c8,0x04516048,0x04425da8,0x043a2360,0x0330b688,0x03505144,0x02d20d84,0x02b7914c,0x02dfe2c8,0x02dd17b4,0x03220308,0x030ea8d8,0x031f84e0,0x03222f38,0x02fbd6b4,0x03604ce0,0x0392cba8,0x0403a5d0,0x04a83a30,0x05dbb268,0x074d2070, -0x09ef55e0,0x0b304cf0,0x0d769b90,0x0fa6d700,0x1115f4e0,0x13195140,0x0ffed690,0x0dfc85f0,0x0c115100,0x0a44f510,0x08e9f1b0,0x07c84a88,0x06fae100,0x062e2ae8,0x058caea8,0x047822b8,0x03e0b118,0x02ef4bcc,0x02b94338,0x02213cb4,0x02008c0c,0x01ab7996,0x0189f69c,0x016a467c,0x017d55c4, -0x018e7b54,0x01bf16ee,0x016811a0,0x0197f27a,0x01bd7608,0x02109e40,0x027361c4,0x03563720,0x046994e8,0x06e2af70,0x09f91ae0,0x0e46bf60,0x112613a0,0x15bf40e0,0x191da600,0x1cc51e00,0x1ffa39e0,0x18c0e680,0x13a119c0,0x0ef0bdf0,0x0b6e8260,0x091c33a0,0x07afaaf0,0x06b23730,0x05bde110, -0x050d5350,0x03c7d644,0x03055340,0x023a8a48,0x01cd71ea,0x013afa2a,0x01152b74,0x00bbeaa6,0x009b0ff8,0x008732a8,0x009a9b9d,0x00ad4ff1,0x00b9e2bc,0x0092e9a6,0x0092b4e1,0x00c6d7ac,0x012c8e8e,0x0220a6c0,0x029d10f0,0x040824f0,0x0fd4c5e0,0x1a18a380,0x21a08b80,0x24b737c0,0x289f8040, -0x2536c000,0x23c6e780,0x24162940,0x26a450c0,0x2996a9c0,0x2a599400,0x2a0e8d00,0x270dc1c0,0x22e3ca00,0x1a8e5a40,0x1459c960,0x10659840,0x0a14ea00,0x068e2ed8,0x0404da60,0x02f2e68c,0x01c19c80,0x0140d402,0x00db46af,0x00b61b10,0x009b1c49,0x00c4ecec,0x00cb25c2,0x00d0f054,0x00ce4c6b, -0x010bff58,0x01ad7a9c,0x0275acf8,0x039b7d60,0x050817d0,0x08f5aed0,0x123e5820,0x16816b60,0x391bc280,0x3adbdb00,0x39ca2600,0x2c7c9c40,0x29813980,0x2d0e1700,0x2e633400,0x2fabe540,0x30fdaa80,0x3026d740,0x2dc7c100,0x29d6b300,0x1fe30f20,0x16ea9880,0x10577d80,0x0a349a10,0x07cd9b40, -0x04f91a30,0x04491018,0x02a26288,0x01c8f5ee,0x01138068,0x00d239db,0x00b551bc,0x00d746cb,0x00f960c6,0x0135781c,0x011ce15a,0x01440098,0x01b95968,0x0248fdf0,0x033f59b0,0x0568dc20,0x08dad320,0x161f8820,0x26bafb00,0x4d0b8200,0x41815100,0x3ffffdc0,0x296882c0,0x272dc080,0x2cf57c00, -0x2b7c9700,0x2ddaaf00,0x32f82340,0x31551f40,0x2d2f3400,0x26a4e800,0x1fd44da0,0x183ee280,0x120e7a20,0x0b270b00,0x08aa60e0,0x052ce5c0,0x046bc158,0x0333b514,0x0313a6ac,0x01d48d8c,0x016cbee4,0x01a99918,0x015a895e,0x017db486,0x0275cf20,0x015a3e64,0x015861dc,0x01d2375c,0x03bf599c, -0x043e1b38,0x0a16d280,0x0865daa0,0x129b9c40,0x2c1261c0,0x2e9bdd40,0x234a4680,0x24920480,0x1f485600,0x22154800,0x29973640,0x296fdf00,0x2a390680,0x280a7480,0x27478440,0x23fcd740,0x1d701360,0x17def060,0x11b2a2a0,0x0c4a2510,0x09220740,0x07a05150,0x059201c8,0x0488fc28,0x0348d540, -0x0303f158,0x021b7c34,0x01a45066,0x0172bab6,0x0136e6b6,0x017e17c2,0x03da8680,0x01b0e29a,0x01712fa0,0x01ce8212,0x0224f7c8,0x034d7774,0x04ab5268,0x07bd2328,0x0ef47080,0x172e2f60,0x1a6b1480,0x1d27c2c0,0x1da66640,0x1d4e0b60,0x1dae3400,0x210eb040,0x1f14eaa0,0x1fd37240,0x21479f40, -0x1e9ad9c0,0x1b00a200,0x163da740,0x1075a780,0x0c69a6a0,0x0a6cb490,0x08e14670,0x083b4b80,0x071c1cc8,0x05a25d00,0x043d7600,0x03201398,0x029320b0,0x02293090,0x01ad93b0,0x018ce9e0,0x01b25b2c,0x029aee74,0x01e34fc0,0x01fcd432,0x0258a95c,0x02fc4a88,0x03ae282c,0x0518b8a0,0x0c7cb500, -0x0e030c70,0x0fb63d50,0x135f66c0,0x14e14b00,0x16378140,0x18446e40,0x18f6dc80,0x18d10ea0,0x1891f8c0,0x17cba540,0x164a2f40,0x136dc340,0x10b6d4a0,0x0e46e2c0,0x0c6d5930,0x0a8364a0,0x09105b10,0x0863f280,0x090ae9c0,0x069b0aa0,0x0663cb20,0x04de3d78,0x046a3bf8,0x032d3694,0x025a98d4, -0x01fa103a,0x01f90f4c,0x02210ed4,0x025d1948,0x025856f8,0x0258822c,0x0267d390,0x030ad5dc,0x0426fdf0,0x052ced38,0x083c2650,0x0a16eba0,0x0cde3fe0,0x0f4c17c0,0x10fc3e00,0x13a40c60,0x136f0620,0x13d49300,0x14b984e0,0x1334a520,0x123c9200,0x11b89580,0x100080c0,0x0eaa8910,0x0d5b3ef0, -0x0c0979b0,0x0ac61c90,0x09cac170,0x08e31770,0x08f195d0,0x07a37180,0x06c171e8,0x05938aa0,0x04e3c798,0x04273280,0x04024618,0x0367d580,0x03918078,0x035b12b8,0x03b4e6c8,0x02e7b1c4,0x03a2d174,0x033120e4,0x044da268,0x05451568,0x0700ab78,0x084383b0,0x0d7de180,0x0c817c80,0x0bd8a6e0, -0x0c84be10,0x0d1b3bb0,0x0dcf7740,0x0ea830e0,0x0fc74e30,0x0f0aecf0,0x0ea4c6d0,0x0e257b90,0x0d944090,0x0d102240,0x0c8ad3e0,0x0bd782f0,0x0b18cb90,0x0a881dc0,0x0a08b2c0,0x096a0bb0,0x09654280,0x09e01450,0x071f0eb0,0x07653cf0,0x06c31eb0,0x06369d10,0x068f5608,0x06ad1908,0x07547df8, -0x06c62e38,0x0770c568,0x07463878,0x068b0598,0x0767fc28,0x07d435e8,0x0888bc40,0x09bb6ce0,0x0ae24550,0x0c08a4e0,0x0a3cf8b0,0x0af482b0,0x0af35480,0x0b3c5460,0x0b63d850,0x0bb7bc30,0x0b5a8ea0,0x0b26b690,0x0af03600,0x0ac425e0,0x0a9e1300,0x0a7fac20,0x0a5d20a0,0x0a3f6120,0x0a1349e0, -0x09fbc330,0x095cbbd0,0x0afa0fa0,0x0a240100,0x0ae20b60,0x0f8668a0,0x09cb3900,0x0a498340,0x0deafd10,0x0e538270,0x0dea74f0,0x0cab7750,0x0df939e0,0x0e4bad60,0x0db7d640,0x0a999280,0x0a8bd1b0,0x0f74df70,0x0bc07e00,0x0ce12080,0x000103b2,0x0000ceea,0x0000b005,0x0000ccbf,0x0000da29, -0x0000b8ab,0x00010a9b,0x000103d4,0x0000b6a3,0x0000c80f,0x0000a789,0x0000706e,0x00006c1e,0x00007d7c,0x0000c81e,0x0000d4a1,0x0000ec3f,0x0000f085,0x0000feff,0x00011421,0x00013354,0x000142ea,0x00013e85,0x00014647,0x0000e662,0x0000d117,0x0000be67,0x00010122,0x0001159b,0x00012dc5, -0x0000ff7c,0x0000ecfa,0x0000e07e,0x0000c4d1,0x0000cfc9,0x00017ae5,0x0000eb47,0x0001721e,0x0000f2b7,0x0000eb9b,0x0000cbe8,0x00009421,0x00014e77,0x00016a31,0x0000a535,0x0000f66e,0x0000b36d,0x0000aec6,0x00006957,0x00007a6f,0x00011e6c,0x00012124,0x00017217,0x00016712,0x0001a4f6, -0x0001ff0f,0x0002703f,0x0002c591,0x0002b65f,0x00029012,0x00017615,0x0001039f,0x0000d750,0x000179c9,0x0001db8b,0x0002159c,0x0001a184,0x000134a9,0x0000f797,0x0000ab6c,0x0000fe7e,0x00039aad,0x0001e57b,0x0001c37a,0x000210b4,0x0001828b,0x0001b58d,0x000130b2,0x00031945,0x0002e128, -0x000094fc,0x00014578,0x0000e8e7,0x0002f1b5,0x00021428,0x0001f792,0x000339ba,0x0001cc56,0x0002247a,0x0001da93,0x00027173,0x00035b1d,0x00047fb2,0x00056cd4,0x0005a65a,0x00055579,0x0002871b,0x00014a16,0x0001385a,0x0002b8bd,0x00038d27,0x00047963,0x0003163c,0x00022e8e,0x00018549, -0x00011b81,0x00014127,0x0007189f,0x00020b18,0x0004cc18,0x00030fdb,0x00023495,0x00015292,0x0002b7af,0x000457ff,0x0004845b,0x0001467d,0x000194a0,0x0002b106,0x000b43e5,0x000a73a1,0x00094b78,0x0008706a,0x00049620,0x00047987,0x0003855a,0x00046fdf,0x00068e89,0x0008ce35,0x000a73a4, -0x000a8f3c,0x000b6b9c,0x00065886,0x000366ef,0x00027867,0x0004725c,0x0006ea59,0x0008d831,0x000643ca,0x0004bbc8,0x000254a0,0x0003b4fd,0x0002c2d9,0x00125c37,0x0007e89f,0x001f7e71,0x0008e5c9,0x0005ad49,0x000d14f6,0x00265533,0x00118a22,0x00096de4,0x00059818,0x000a7c65,0x000844fc, -0x000e9464,0x000d2935,0x000bd27d,0x00080c62,0x000321e6,0x0002a332,0x0002a80a,0x000290a1,0x0003393c,0x0004ce4e,0x0008dba8,0x000a356f,0x000ae3e2,0x0006407f,0x000474b2,0x0003a0e4,0x00018ae9,0x0001f1fd,0x0008b889,0x00072730,0x00095de8,0x00092b86,0x000bc946,0x000552ef,0x000dc9ac, -0x00185e6e,0x00289661,0x003574dc,0x0009bc05,0x000915b7,0x00226389,0x001c6646,0x000ff074,0x000dae9d,0x0004fbd3,0x0005e40b,0x0006536e,0x0004632e,0x0003ee29,0x0002e29a,0x0003325a,0x0003c7d4,0x0002d50f,0x000257d2,0x0002c159,0x00037836,0x0002d8b3,0x00027ee2,0x0002ddfe,0x00036a5f, -0x0002abd6,0x0001eed1,0x000331e5,0x0003d861,0x0003e047,0x0001367a,0x00019459,0x00057c2c,0x000ab730,0x0009a019,0x000eba0f,0x001ff155,0x0011c84e,0x0017101c,0x000f0c6f,0x000e6149,0x000c46ad,0x0011c843,0x000ac3d7,0x001187da,0x000cc9b4,0x000a61d0,0x00058639,0x0002e0e4,0x000245f7, -0x000340c6,0x000387c4,0x000327cb,0x000255ee,0x0003831c,0x00036413,0x00063da7,0x000144d4,0x0000c315,0x00020b65,0x0001982e,0x0000d27f,0x0000f93c,0x0000c1ea,0x00004d51,0x00004bd5,0x0001a01e,0x0002d0b7,0x00036121,0x00049203,0x00074e0a,0x000a422a,0x000ccbdb,0x002a2744,0x0035aa19, -0x005b3d77,0x0052fd10,0x002adf5a,0x00169cd5,0x000f4d66,0x000e856b,0x0008fdf9,0x0007e635,0x00075437,0x00050b66,0x0004bd3a,0x00034057,0x0002e507,0x0002a972,0x0002a282,0x00030b2d,0x0002bb6a,0x0003b1da,0x00020e43,0x000229a9,0x00020682,0x00020754,0x00014aeb,0x0000f526,0x000078a9, -0x00008e4b,0x0000f9b0,0x00013809,0x0001b36c,0x00050223,0x0004504a,0x00090323,0x0014797d,0x00201108,0x004d9d85,0x006760d3,0x0057a229,0x00376de9,0x002339ad,0x001d538e,0x001f6a86,0x00173c01,0x000d8737,0x000965df,0x0006aa64,0x0005c465,0x00046371,0x0003755c,0x00027204,0x000231a8, -0x0001e04a,0x0001e70f,0x0001ce4c,0x00016dd6,0x0000f745,0x0000d6ff,0x00017f0a,0x0000c379,0x0000c51a,0x00016e64,0x0000c9b3,0x0000f4f6,0x00017c5a,0x0003311f,0x00068164,0x000b8b4b,0x00217280,0x00309bab,0x0031f110,0x003b54e4,0x00380101,0x0033c1b5,0x002f0d18,0x00254678,0x002317c6, -0x0025167f,0x002191de,0x001ac2c5,0x0011a1d7,0x0010506c,0x00105c7a,0x001199ec,0x00108d20,0x000b70ea,0x000af7e8,0x00096bfc,0x000750cb,0x0005c69c,0x0003aabf,0x00015ed6,0x0001ab3a,0x000159db,0x00013e5c,0x00014721,0x000298fb,0x000562cf,0x0007bff3,0x000b098b,0x000df4e3,0x001527f8, -0x001bdecc,0x0020e099,0x001f0924,0x001ee03d,0x00252bfd,0x002c190c,0x001bd8f0,0x001eeaf7,0x001e4a07,0x0020dba0,0x00285979,0x002431e7,0x00273ace,0x002f6c35,0x0022ae2b,0x001a6ad0,0x0018386c,0x0013ec16,0x001072d3,0x000dd64f,0x000b09ac,0x000927b2,0x0007b3cb,0x00054104,0x00035e43, -0x000250e8,0x0001b589,0x000144bc,0x00022f40,0x0002f908,0x0004d524,0x00079bac,0x000986f2,0x000bb705,0x000fbf7a,0x00108f1b,0x00129d3c,0x0015e903,0x00175e09,0x001a4f03,0x001d9424,0x001c5c21,0x00146b85,0x001401ba,0x00129469,0x00118e4c,0x0010fe0f,0x0010e92b,0x00111a77,0x00123b48, -0x00106995,0x001044fe,0x000f53ee,0x000e9602,0x000da3e4,0x000d4a72,0x000af99b,0x00091258,0x000754e6,0x0005ebe6,0x00049388,0x00036354,0x0003e9a1,0x0003e315,0x00047e4e,0x00050944,0x00063738,0x00076135,0x0008c171,0x000a3c16,0x000bd285,0x000d7a61,0x000f707a,0x001196ad,0x0011a846, -0x00120c8c,0x00123c45,0x0012b564,0x000ef66e,0x000eeae1,0x000e9e8a,0x000eab44,0x000e8a86,0x000ef87e,0x000f3974,0x000fabc1,0x000f0e9d,0x000e8ae3,0x000e396d,0x000d8e56,0x000d0e28,0x000cc499,0x000be288,0x000b37a2,0x000a9628,0x0009c861,0x00093cf2,0x00082e50,0x000929c9,0x0009b913, -0x000acd58,0x000a0aff,0x000abd01,0x000bd45d,0x000c3976,0x000c84b0,0x000cfc9f,0x000d84ca,0x000e1f60,0x000ee853,0x000e7920,0x000e5073,0x000fa30b,0x000f1902,0x001152cf,0x00000c78,0x000007f6,0x000008c8,0x00000b67,0x00000e56,0x00001874,0x00000dfa,0x00000a00,0x000003e5,0x00000c50, -0x00001016,0x00001571,0x00000f93,0x00001138,0x00001a3f,0x00001bf5,0x00001a87,0x0000144a,0x00000c10,0x0000093c,0x000008e1,0x000008f7,0x000009ba,0x00000c04,0x0000108a,0x00000e4b,0x00000470,0x0000097c,0x0000088d,0x000008dd,0x000005de,0x000003f1,0x00000721,0x000004c6,0x000006e6, -0x00001089,0x0000088f,0x000008c5,0x00000c96,0x00002305,0x00003871,0x0000651c,0x00003e4d,0x000025cd,0x0000074d,0x000018a4,0x00001f06,0x00003df9,0x00001c85,0x00003b49,0x000088ea,0x0000afe3,0x0000a5b2,0x00006a8a,0x00003435,0x00002113,0x00001ea9,0x00001756,0x00001146,0x000017a4, -0x00002e8a,0x00002a78,0x00000c21,0x00001a1d,0x00001b45,0x000029c3,0x000025fb,0x00001e29,0x0000257b,0x000009b5,0x000006b3,0x00002f3d,0x00000ad6,0x000003fb,0x00001bf4,0x000035ea,0x00007550,0x0000de1c,0x0000b025,0x00006f56,0x00002ac8,0x00003817,0x00005e48,0x0000d611,0x00006aed, -0x000088a8,0x00012fb0,0x0001401c,0x000122b9,0x0000ac56,0x00003c3b,0x0000290a,0x000037ab,0x00001f6d,0x000016ab,0x000026a4,0x00006434,0x000049ee,0x00005b66,0x0000463c,0x000087b4,0x00015920,0x00014ac7,0x0000e2a2,0x0000a189,0x000021a4,0x000009a4,0x00006de5,0x00000816,0x00003835, -0x00002175,0x0000e9c1,0x0001af74,0x00032b12,0x00023f44,0x00017358,0x00007fb3,0x00005dca,0x00006d70,0x0001dcd6,0x00007596,0x0001a8ea,0x0004cd7d,0x000607ab,0x00055202,0x000367f4,0x0001ae85,0x000150f8,0x00015091,0x0000c667,0x00005493,0x0000a54d,0x0000e371,0x0000981e,0x00006b80, -0x00006437,0x00006d54,0x0000f44f,0x000211b1,0x0001ce8e,0x00019515,0x0000e9fa,0x0000510b,0x000185ef,0x000062f2,0x00034ba9,0x00031166,0x000668bf,0x00063127,0x00054f83,0x0001fdb0,0x0000e1ef,0x000146a8,0x0000a781,0x0002700c,0x0004f81b,0x00048d86,0x0003c905,0x00060f36,0x0004fbad, -0x0003d652,0x0003b204,0x0003e467,0x0004af9d,0x0004653b,0x0003657e,0x00023f64,0x0001c763,0x0000e3bb,0x00006191,0x00006add,0x00006c4b,0x00008e09,0x00000f82,0x000014a1,0x0000d8e2,0x00024284,0x0001f3b4,0x0001ba35,0x000129b8,0x00021a89,0x00047ac6,0x0001da68,0x0001c2fe,0x00022b6a, -0x0004ce43,0x00064bee,0x00069df5,0x0001d57a,0x00011a56,0x0001423e,0x0005fbb6,0x0004489a,0x00055b3c,0x00050f0e,0x0002a8e8,0x0002609d,0x0001b459,0x00018a58,0x0000fc0f,0x000130f2,0x000071c0,0x00003f41,0x000024f3,0x00001fb4,0x00000aed,0x00003889,0x0000445c,0x00005bb8,0x0000285c, -0x00000e3a,0x00006015,0x000180eb,0x0005d9a7,0x000587fb,0x0002fb85,0x00023d17,0x001783ae,0x002af2bd,0x000a07bf,0x0002b87a,0x0007a3a5,0x0005d535,0x00061aa5,0x0007e199,0x00060a8a,0x00061108,0x0004924f,0x00018d24,0x00026f44,0x000311ce,0x0002142e,0x0001d552,0x000140c0,0x0000c281, -0x000067a2,0x00005ed4,0x00002514,0x00001b21,0x000046a3,0x0000403c,0x000028e9,0x00003275,0x00000275,0x00000e18,0x00000567,0x0000165a,0x000042e4,0x000079ce,0x000061df,0x00006ffa,0x0001f2ac,0x000a6407,0x000aa60e,0x00163c56,0x0007d402,0x000360c5,0x00047309,0x000417e6,0x0002f027, -0x0003f11a,0x0001f33b,0x00024518,0x00016127,0x00008525,0x0000f4ea,0x00013ef2,0x00010ee9,0x0000d3b8,0x0000cc25,0x0000a306,0x0000c535,0x0000cf27,0x0000b273,0x00008f1d,0x00006b5a,0x0000161f,0x0000018b,0x0000068c,0x00000271,0x000005cb,0x000007eb,0x00000186,0x00000351,0x00003e29, -0x00005c8b,0x00007db4,0x00049f9a,0x00091e34,0x00053a14,0x0004af76,0x00030e5e,0x00027a90,0x00010dec,0x0000978a,0x00013caf,0x00018872,0x0002614a,0x0002f0ea,0x000327ec,0x000299e4,0x0001d6a8,0x00015f24,0x00008224,0x00002aa4,0x00004660,0x0000a1cd,0x00010e94,0x00016ba0,0x00018aa7, -0x00014e9b,0x00010cc0,0x00006d86,0x00002249,0x0000059e,0x00000893,0x00000f89,0x000012ac,0x00001b22,0x00001b08,0x00002e51,0x00000ec9,0x0000241b,0x0000c728,0x00039ecb,0x0001aa82,0x0001e1b1,0x00021823,0x0001ecfd,0x0001b5c7,0x00018123,0x0001a505,0x0001fdbd,0x0001d045,0x0001dd04, -0x00021a14,0x0001e78e,0x000196f7,0x00010df8,0x0000a118,0x0000414d,0x00001abc,0x00001e58,0x00003554,0x00006519,0x000072fa,0x00005b02,0x00003e95,0x00003e2f,0x00003bf1,0x000037a4,0x000027f0,0x00004569,0x00005e51,0x000088cc,0x00009e1f,0x00009bfa,0x0000d006,0x00010734,0x0001286a, -0x00015790,0x000129af,0x00013428,0x00010914,0x0000cb4f,0x00008f29,0x000062d9,0x00005e7e,0x00006e22,0x00005d86,0x00005792,0x00006470,0x00003956,0x00003109,0x000044f2,0x00003bbe,0x00003e7e,0x00004b41,0x0000483e,0x00004fda,0x0000603b,0x00006beb,0x0000804d,0x00009adb,0x000079dd, -0x00007e1a,0x0000ae20,0x00009552,0x00009ad8,0x0000b8e5,0x0000bea5,0x0000cfb0,0x0001073e,0x00010cab,0x0001406e,0x00016dc6,0x00013892,0x0000dd24,0x0000d60c,0x0000b8a4,0x00009f61,0x00007f29,0x000065fb,0x000054a6,0x000058cb,0x00005610,0x0000589d,0x0000576f,0x000053c7,0x00004e8b, -0x000051a4,0x0000529c,0x0000596b,0x000062d4,0x00007005,0x00007e40,0x00008ee5,0x00008d95,0x00008b1e,0x0000963d,0x0000a6b4,0x0000bf0e,0x0000ddd5,0x0000d418,0x0000d984,0x0000e674,0x0000efb6,0x000105f8,0x00012025,0x00010145,0x0000e470,0x0000df68,0x0000cbf9,0x0000721e,0x00006cf9, -0x000066f1,0x00005f38,0x00005c09,0x00005867,0x0000562c,0x00005266,0x000052b2,0x000052f8,0x00005635,0x0000595b,0x00005e23,0x0000626c,0x000066b0,0x00006a2e,0x00006dcd,0x00007219,0x000076b9,0x00007e7c,0x00007e2c,0x000080b7,0x0000843c,0x00008350,0x000086c8,0x00009561,0x0000903a, -0x00008f5e,0x00008abf,0x00008b73,0x0000896d,0x00008d88,0x00007df7,0x00007884,0x00007bdd,0x00007824,0x00008e1d +const Word16 defaultHRIR_rom_E32_Q_fx = 28; +const Word32 defaultHRIR_rom_EL32_fx[HRTF_MODEL_N_SECTIONS * 470] = { +88764792,83154280,89567896,78948672,86760408,89708736,94515024,97075376,101266112,94597840,91159944,87645936,84628240,82086760,79794632,78333560,76692688,75071136,73237424,67923256,76252432,74141240,78189424,107201392,71719344, +75125664,97309600,98827520,96421120,88357552,97081648,100506672,98532008,77917688,77152960,107219416,88028904,112672368,116471080,117347168,134218624,147167536,164400240,175328784,184402144,162018096,146121104,130794472,118289160,108650152, +101614928,96374624,91158064,86723120,79535016,72438928,71453880,70922192,53523140,55598392,47315116,45579852,48230064,48041956,52556560,51296820,52400788,52576056,50065928,56636440,59949400,67339632,78139536,98278880,122492072, +166695632,187722080,225882864,262596160,286658464,320413216,268372288,234645712,202450896,172293616,149537360,130562320,117104992,103697328,93113392,74985008,65057608,49235208,45697600,35726192,33590212,28013160,25821112,23743668,24995424, +26120740,29301744,23596464,26735716,29194528,34642964,41113520,55981396,74031208,115518848,167319648,239492512,287700480,364861696,421377760,482670976,536503680,415292544,329341248,250674864,191794640,152853984,128947024,112346128,96323696, +84750696,63434088,50679144,37386564,30244732,20642136,18164864,12316379,10165017,8859902,10131905,11358807,12185564,9624144,9615497,13032031,19697580,35700268,43852372,67640272,265618624,437818400,564164416,615994944,681542016, +624339136,600226624,605442240,648308096,697725184,710520064,705592512,655239936,585358976,445528896,341431488,275092224,169147216,109975816,67430024,49470676,29468584,21026332,14370108,11937837,10162847,12906892,13315580,13696627,13521057, +17560812,28145764,41271088,60520188,84419384,150303488,306077216,377584960,958118272,987493312,969548480,746362176,696323584,755882432,778233408,799788672,821941440,807863104,768089728,701924608,534951584,384468704,274187296,171217648,130924112, +83441056,71891696,44193952,29951868,18054548,13779176,11880873,14107454,16340919,20281156,18668824,21230784,28922916,38335692,54489088,90764640,148556112,371143104,649774336,1292625792,1099006336,1073724416,694688128,657294016,754294336, +729570560,769303872,855147712,827664384,758055744,648321024,534000256,406781152,302948064,187090976,145380176,86831192,74169080,53718272,51629244,30705228,23902472,27891308,22709404,25020524,41272160,22688808,22566576,30551884,62864472, +71180168,169266880,140899696,312179456,739417920,781988224,592053120,613542400,524835712,571816064,697799296,695228096,708384448,671771200,658978880,603761600,493885504,400489728,296929152,206181536,153225600,127949296,93457864,76081256,55108576, +50589920,35352432,27543844,24296412,20374904,25036804,64653480,28373816,24195432,30310956,35979384,55412600,78343600,129836368,250915984,388895936,443216000,489134240,497446048,491656320,497940000,554608640,521468864,533976896,558329536, +513475584,453025216,373129280,276156576,208258128,174907120,148994384,138110848,119289632,94527392,71135584,52428660,43193828,36249968,28152148,26008996,28467696,43713416,31675828,33345056,39368076,50085964,61751020,85498000,209498928, +235085216,263595488,325042624,350326400,372715456,407119936,418842592,416347488,412221568,399199072,373971680,325970528,280420960,239514688,208481904,176379120,152066624,140767920,151715696,110822912,107211456,81673680,74075024,53288272,39497556, +33168844,33097392,35723392,39655904,39348792,39357044,40352192,51033444,69666112,86836688,138149872,169270320,215912432,256639280,284972704,329530784,326036192,332718048,347716800,322209504,305959584,297320032,268468000,246061872,224096352, +201940976,180767424,164286032,149114112,150046912,128149408,113335368,93559704,82042536,69680064,67254360,57141164,59867820,56300788,62190192,48743336,60995888,53560096,72187472,88418736,117483168,138640176,226355840,209805104,198744944, +210018080,219899712,231696304,245910496,264714896,252379328,245676960,237346128,227807696,219154272,210422976,198666672,186177552,176694560,168342224,157949408,157638512,165687248,119479952,124072000,113449960,104250000,110066016,112000880,122974624, +113647872,124833280,122037704,109781520,124260128,131341872,143169440,163291504,182605760,201898144,171770224,183803008,183722784,188505392,191095264,196578768,190499856,187087472,183503584,180612704,178140464,176137344,173869856,171916864,169038336, +167505024,157078480,184152704,170130176,182590336,260478160,164322656,172591632,233511808,240339856,233455696,212571856,234438176,239829680,230160944,177843984,176928784,259317808,197175280,216098544,66454,52974,45201,52436,55962, +47262,67950,66589,46833,51164,42948,28809,27699,32036,51181,54323,60265,61464,65271,70572,78735,82785,81554,83702,59320,53815,48467,65830,70913,77375, +65366,60700,57582,50489,53104,97129,60194,94904,62116,60374,52409,37994,85263,92576,42162,63020,45874,44759,27101,31330,73600,74479,94760,92132,107529, +130759,159688,181742,177775,167943,95601,66296,55033,96618,121949,136438,106931,78740,63575,44007,65116,236267,124338,115484,135486,98808,111953,78032,203032,188427, +38135,83330,59470,192630,136026,128787,211054,117492,139852,121468,159749,219748,295184,355130,370178,349468,165338,84444,80059,178036,232713,293670,202451,142990,99841, +72537,82254,465060,134017,314897,201001,144472,86624,178093,285233,296164,83322,103829,176616,737874,684338,608883,553716,300299,293433,230516,290653,429355,576616,685622, +692436,749041,415458,223031,161973,290869,453736,580284,410533,310441,152973,242645,180650,1203230,518314,2063561,583047,371822,857107,2511286,1149511,617894,366631,687026,541444, +954792,861925,775444,526969,205270,172786,174457,168018,211286,314474,580202,668530,713197,409603,292147,237663,101276,127488,570967,469537,613627,601192,772688,349135,902859, +1598387,2659894,3503168,638041,594998,2253532,1860719,1044623,896163,326663,385871,414596,287523,257353,188977,209290,247741,185785,153501,180842,227122,186795,163298,188091,223272, +175225,126502,209438,252226,254670,79264,103719,359804,702839,630992,964727,2092033,1164777,1510354,985643,942452,804719,1164627,706009,1148264,838472,681035,361884,188463,148900, +213189,231705,206585,152840,229760,221864,409448,83749,50089,134052,104480,53835,63976,49660,19844,19348,106397,184288,221416,299520,479143,672867,838588,2764388,3516394, +5979068,5439607,2811569,1481866,1002864,951638,589397,517885,480488,330547,310570,213213,189947,174103,172312,199294,179346,241816,134745,141947,132570,133018,84667,62770,30933, +36353,64134,80088,111688,328644,282774,591165,1341411,2102108,5088256,6774223,5743014,3634125,2306786,1922693,2057051,1522157,887107,616255,436700,377950,287491,226553,160504,143662, +122504,124496,118315,93749,63276,54768,98046,50030,50522,93755,51623,62787,97689,209201,426342,756690,2191371,3187060,3273195,3888363,3669394,3390897,3082552,2442266,2300435, +2430079,2199177,1753876,1155242,1069401,1073465,1154353,1085003,750405,718120,617612,479363,378868,240220,89789,109155,88720,81457,83375,170349,353176,507355,722771,915800,1386451, +1826830,2155540,2035140,2023378,2436629,2890536,1823415,2025958,1986094,2151146,2645193,2373959,2571321,3107175,2272467,1729851,1587775,1306493,1077963,906116,722697,599865,504486,344938,220942, +151988,112137,83044,143452,194452,316751,498807,623972,767680,1031986,1085393,1220395,1436120,1530913,1724272,1939136,1858412,1337871,1311818,1218715,1150221,1113470,1107520,1120961,1194145, +1074823,1066466,1004071,955600,893671,870033,719196,594753,480423,388843,299234,222460,256003,254800,294668,329832,408147,483236,572947,669785,774427,884155,1011827,1152265,1156468, +1183515,1194548,1225833,980419,978526,958209,961303,952923,981439,997783,1027201,986526,953939,931483,888459,855059,837095,779434,735477,693707,641139,605059,535130,600212,637533, +707865,658214,704060,775223,800163,819926,851152,886166,925970,977775,948583,938297,1025715,989567,1135611,3198,2027,2275,2924,3620,6263,3541,2555,1034,3127, +4225,5513,3998,4382,6713,7152,6796,5225,3090,2394,2270,2313,2447,3059,4312,3711,1164,2398,2146,2321,1506,1016,1876,1239,1771, +4253,2160,2203,3188,8952,14407,25799,15730,9628,1868,6333,7900,15828,7249,15180,34918,45105,42205,27296,13374,8477,7868,5952,4464,5963, +11831,10884,3090,6801,6964,10674,9829,7773,9591,2488,1714,12072,2762,1004,7128,13771,29994,57041,45002,28559,10833,14519,24108,54904,27276, +34981,77698,82182,74444,44183,15453,10541,14291,8150,5908,9843,25664,18865,23130,18016,34615,88405,84563,57901,41131,8578,2425,28011,2121,14449, +8517,59712,110105,207718,147745,94806,32765,23911,27994,121974,30231,108405,314472,395642,348618,222836,110187,86484,86226,50823,21695,42445,58343,38872,27525, +25549,27958,62487,135928,118038,103583,59976,20776,99839,25285,216499,201396,419679,405551,347637,130116,57909,83741,42921,159471,325610,298255,247963,397174,326795, +251387,242108,255418,306517,288198,222659,147261,116469,58396,24923,27253,27755,36427,3985,5280,55355,148000,127637,113052,76003,137523,293932,121464,115765,142665, +314801,412330,433141,120072,72254,82292,392356,280763,350680,331454,173956,155794,111830,101097,64509,78292,28993,16225,9461,8147,2817,14618,17402,23525,10334, +3687,24527,98371,383588,361832,194974,146877,1540808,2815206,657752,178451,501600,382458,399655,517014,395571,397478,299271,101702,159574,200991,136159,120152,81809,49705, +26469,24330,9560,6910,18044,16525,10507,12890,628,3637,1379,5688,17049,31325,25142,28696,127722,680312,696979,1457739,513336,221188,291670,267806,192548, +258036,127694,148795,90198,34103,62912,81705,69226,53972,52404,41801,50449,53103,45737,36651,27503,5658,403,1696,643,1506,2044,389,818,15861, +23653,32226,303009,597450,342691,307325,200409,162752,69201,38990,81027,99923,156117,192770,207006,170543,120379,89590,33333,11024,17888,41425,69142,93127,101326, +86058,68922,28117,8778,1407,2171,3916,4785,6895,6870,11834,3804,9216,51021,236948,109311,123471,137046,126597,112026,98466,108008,130409,118834,121986, +137879,124797,104392,69109,41258,16644,6835,7736,13640,25683,29392,23322,16036,15991,15452,14316,10205,17803,24048,34901,40517,39741,53216,67236,75907, +87733,76277,78684,68080,52131,36519,25235,24133,28209,24076,22514,25592,14744,12608,17789,15356,16170,19232,18574,20423,24473,27831,32923,39624,31386, +32320,44473,38130,39464,47257,48799,53447,67506,68935,81876,93475,80213,56659,54679,47212,40957,32438,25888,21784,22683,22229,22782,22321,21580,20127, +20870,21202,22898,25264,28517,32323,36568,36143,35537,38442,42749,48746,56750,54185,55595,59278,61491,66912,73783,65843,58663,57199,52452,29268,27792, +26395,24397,23574,22827,21880,21117,21100,21273,21969,22894,24045,25405,26290,27088,27988,29173,30494,32428,32392,32766,33866,33519,34684,38412,36958, +36665,35511,35696,35348,36231,32192,30868,31825,30821,36350, }; -const UWord32 defaultHRIR_rom_ER32_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { -0x054a4a90,0x04b59ef0,0x056004c0,0x04f624c8,0x05412248,0x06704ac8,0x0497dc00,0x04a6cb70,0x05db4030,0x05f962d0,0x05ca3a18,0x0545d3b0,0x05bf93a0,0x05e45250,0x05cc2d70,0x0479a490,0x0443aa10,0x06608268,0x04a79d68,0x046b7780,0x048cf9f0,0x040d0960,0x045d49a0,0x04798b10,0x049221d8, -0x04ab4a30,0x04c19e60,0x04e487e0,0x050b7560,0x05396118,0x056ed2e8,0x05a36f38,0x06096f58,0x05c92ae0,0x05a1f158,0x05593640,0x052acdc0,0x06fdff08,0x06daac48,0x06c51e00,0x04ae7998,0x04066aa0,0x038b0910,0x035dec1c,0x02f83044,0x031c4304,0x0322f880,0x03106168,0x0324368c,0x02dda158, -0x02dda124,0x02b7a97c,0x02d7a5cc,0x035008c8,0x032bd304,0x043cd348,0x043d7fa8,0x04516aa0,0x04be5bc8,0x052abe80,0x056f24d8,0x05be9088,0x060e7f78,0x0679cd48,0x070ce1f8,0x07cbfcf8,0x08b5d8f0,0x09a80d70,0x0afcb9c0,0x0a733f10,0x09cdcf00,0x08c3d910,0x0803aa60,0x09db3c80,0x07760478, -0x05e1ce48,0x046b80b0,0x035440e8,0x02848114,0x021041cc,0x01c0d4d0,0x0195dc28,0x0164366a,0x01c04be4,0x018b63a6,0x017e2740,0x016b522e,0x018902aa,0x01a4256a,0x02003fbc,0x0221170c,0x02b63784,0x02f7fdec,0x03dc75ec,0x047946e0,0x058c5418,0x062e1dc8,0x06fb03a0,0x07c7f340,0x08ea3c80, -0x0a4508d0,0x0c113cc0,0x0dfbffa0,0x0ffedc50,0x131c1040,0x1115e2c0,0x0fa4b750,0x0d793680,0x0b2fd610,0x0eee3250,0x096b6e80,0x06da2d70,0x03edbf04,0x02b0a2c4,0x01e530b4,0x01326718,0x00c10c60,0x009101d6,0x0093217b,0x00b9c9bb,0x00abc320,0x009b0c6e,0x0086a87e,0x009d1fa1,0x00bf43c2, -0x0118a506,0x013a6262,0x01ce35d0,0x02268018,0x03172f4c,0x03bd9858,0x05144470,0x05ba8408,0x06b3c460,0x07af5cc0,0x091c2190,0x0b6df6c0,0x0ef13d70,0x13a11880,0x18c43a80,0x1feb67a0,0x1cd0fb20,0x190fc060,0x15d75c40,0x10ed03a0,0x2446ac00,0x17330660,0x1075c760,0x08030e20,0x04fa9cf8, -0x0355c878,0x0289819c,0x01a2898a,0x010ea774,0x00cc95ee,0x00d09c62,0x00cb16e2,0x00c4135e,0x009f6925,0x00aecedb,0x00db63db,0x013642c8,0x01caf75c,0x02e380a8,0x03c7abf4,0x06cc73b0,0x09f30d10,0x107e40c0,0x144e0000,0x1a95e940,0x22d8fe80,0x27137180,0x2a10eb00,0x2a56ef40,0x2998bc00, -0x26a46880,0x24091340,0x23e44e00,0x24f7ee00,0x29293d00,0x23aaaf00,0x3c3d3080,0x141d6560,0x12462960,0x07e0b878,0x05cb5b58,0x03523810,0x02112644,0x01c65f1a,0x013bb178,0x011fc388,0x01314438,0x00f85e8f,0x00d86f0e,0x00b76712,0x00d08001,0x010bb452,0x01e08818,0x02a871d8,0x0433b9d8, -0x04df38a0,0x07ee9660,0x0a206120,0x106663a0,0x16e11280,0x1feb19e0,0x29c89a00,0x2dcd96c0,0x3029f480,0x30ff4580,0x2faee740,0x2e61a400,0x2d029d80,0x2997d640,0x2c371580,0x3a8afdc0,0x3934ee40,0x51beab00,0x22b27fc0,0x189b01e0,0x08e722e0,0x09757a10,0x0463a4d8,0x0376194c,0x01d1a076, -0x01595d0e,0x0161e1a4,0x027b0c4c,0x01829a10,0x0155b614,0x01a69aa6,0x01645464,0x01e87210,0x02fdb8c8,0x032c5380,0x047347d0,0x050ccff0,0x08cf9b60,0x0b11aaf0,0x121ddd20,0x18351740,0x1fdc3f00,0x269b8340,0x2d363240,0x31569300,0x32f64880,0x2dd85940,0x2b7f5580,0x2ce75c00,0x27435c00, -0x291fda40,0x40d7fd80,0x3f760080,0x33afd040,0x24de2b80,0x1311da00,0x09184de0,0x050a0d70,0x0362cc1c,0x02188584,0x01bfd860,0x0170481a,0x01a9b3ae,0x03c82244,0x017ab578,0x01362028,0x017b86a6,0x01ad6da4,0x021840c8,0x03103ebc,0x036cc880,0x048dc2d8,0x05422990,0x07dcd570,0x09008f70, -0x0c5dab10,0x11a77260,0x17e62da0,0x1d691740,0x240271c0,0x274a7b00,0x2808a2c0,0x2a3b24c0,0x2971f2c0,0x298d6fc0,0x22227b80,0x1f1ee280,0x24fbf1c0,0x21d02700,0x1a1d2100,0x188a00e0,0x102726a0,0x0904b590,0x05dd5798,0x03b86338,0x02baaeb8,0x0274dc24,0x02045ee4,0x01e69104,0x028b94a8, -0x01b0d906,0x018e404e,0x01a836fc,0x020b49ac,0x029f75c8,0x03218a14,0x03efc5fc,0x0624bf58,0x06e6f210,0x0860b230,0x08d4e990,0x0a7189c0,0x0c681670,0x10771ea0,0x16398040,0x1b030b00,0x1e9d4260,0x2145dac0,0x1fd46c60,0x1f151120,0x210afe00,0x1dadc9c0,0x1d4d4800,0x1dacba40,0x1d360700, -0x1318e680,0x0fead0b0,0x0c34b580,0x08021030,0x05401528,0x046084b8,0x0310220c,0x025ef774,0x025329b0,0x025b0b04,0x02415960,0x02212e70,0x01f8d684,0x020149e8,0x025e0634,0x0326f428,0x043c4348,0x04cbf450,0x06281e28,0x06fe26e0,0x08b5b150,0x088001a0,0x09043180,0x0a8879c0,0x0c6b0410, -0x0e481b60,0x10b66660,0x136ec480,0x16496c00,0x17cc9940,0x18911ba0,0x18d09300,0x18f6fec0,0x1848e600,0x162ca780,0x14fa44e0,0x0f5c9230,0x0cdd03e0,0x0a666620,0x0864de30,0x06e27798,0x052c0970,0x044a3a70,0x032d6e48,0x03a64014,0x02e582a8,0x03b36828,0x0357669c,0x038fda34,0x035cbfc0, -0x03ff8858,0x04300230,0x0500c0a8,0x0593a5f0,0x06c621e8,0x07764d58,0x09028c90,0x08e20130,0x09ca75c0,0x0ac6cf00,0x0c08ee70,0x0d5b64e0,0x0eaa2f50,0x100092a0,0x11b859a0,0x123cd7e0,0x1334d2c0,0x14b97dc0,0x13d44400,0x136e3c60,0x13a58ea0,0x10f85380,0x0bd50ab0,0x0c8b8310,0x0d2e1980, -0x0994a000,0x08a27180,0x07e28df8,0x07698140,0x0685afb0,0x074837d0,0x077817d8,0x06c18128,0x07525d90,0x06b02770,0x069e42b8,0x063dc828,0x06c28870,0x07685610,0x0719e7f0,0x09ca0390,0x097b3c10,0x0968da90,0x0a06c5d0,0x0a889ed0,0x0b1863b0,0x0bd7b3f0,0x0c8af5b0,0x0d1025a0,0x0d942080, -0x0e25c840,0x0ea4abc0,0x0f0ad480,0x0fc71530,0x0ea88f30,0x0dcf60b0,0x0d1b8bc0,0x0c84f7b0,0x0a3d3cf0,0x0bfc3ea0,0x0af0ec00,0x0bab4a30,0x0f1ee8e0,0x0a969370,0x0a944050,0x0db5c340,0x0e49c540,0x0dfdb340,0x0cabe090,0x0de78ff0,0x0e544d90,0x0ded9980,0x0a478140,0x09c793a0,0x0fadfa20, -0x0ae67ef0,0x0a255260,0x0ae8d0a0,0x095b3420,0x09fdc380,0x0a12f5a0,0x0a3f8930,0x0a5d2280,0x0a7fa0c0,0x0a9e19c0,0x0ac42c10,0x0af02990,0x0b26c200,0x0b5aa750,0x0bb7c950,0x0b63c760,0x0b3c6c40,0x0af2f840,0x0af545a0,0x0ce103a0,0x000103b3,0x0000ccb6,0x0000b051,0x0000ceed,0x0000eb5a, -0x00017b93,0x0000cff1,0x0000c4ac,0x0000e02b,0x0000ec84,0x0000ff2b,0x00012d5a,0x000114f7,0x0001010f,0x0000be74,0x0000d155,0x0000e715,0x00014642,0x00013d8f,0x00014298,0x00013363,0x00011421,0x0000fefc,0x0000f085,0x0000ec42,0x0000d49e,0x0000c83e,0x00007d9c,0x00006c33,0x00007061, -0x0000a7a8,0x0000c82d,0x0000b690,0x00010397,0x00010a68,0x0000b8ac,0x0000da42,0x0000ebce,0x0000f148,0x00017274,0x0001e568,0x0003976c,0x0000fe31,0x0000ab76,0x0000f7f3,0x000135a3,0x0001a2a0,0x00021654,0x0001ddb4,0x00017984,0x0000d70f,0x0001038f,0x0001736c,0x00028fbc,0x0002b952, -0x0002c62a,0x00027012,0x0001fefb,0x0001a501,0x00016716,0x00017208,0x00012129,0x00011dcc,0x00007a80,0x00006978,0x0000af8a,0x0000b344,0x0000f61a,0x0000a550,0x00016af2,0x00014f17,0x00009439,0x0000cb89,0x00018293,0x000212ac,0x0001c3b1,0x00020908,0x0007235e,0x00013f54,0x00011cc3, -0x00018522,0x00022d09,0x0003141b,0x000478fe,0x00038895,0x0002baae,0x00013977,0x0001486e,0x00028e61,0x00055583,0x0005a11f,0x00056c39,0x00047ff0,0x00035b48,0x0002716b,0x0001da72,0x0002249c,0x0001cc3d,0x00033c1b,0x0001f6c7,0x00021333,0x0002ef94,0x0000e901,0x0001461b,0x00009539, -0x0002df60,0x0003178e,0x0001307a,0x0001b689,0x00023566,0x00030973,0x0004c2b6,0x0007f934,0x001224e7,0x0002c635,0x0003accb,0x00025531,0x0004bbc3,0x00064633,0x0008d850,0x0006e941,0x00046f6b,0x000274e0,0x00037676,0x0006316e,0x000b7997,0x000a9bd9,0x000a766f,0x0008ce32,0x00068f89, -0x00046f0d,0x00038653,0x00047914,0x0004973e,0x00086473,0x000951b9,0x000a7bb9,0x000b3d51,0x0002b304,0x00019424,0x00014445,0x0004895c,0x00045c9d,0x0002b54f,0x00015467,0x0005b28c,0x0008e87a,0x001f840f,0x00183fe6,0x000dc59f,0x0005643c,0x000bb14b,0x0009249f,0x0009608e,0x00071c49, -0x0008c2f9,0x0001eeba,0x00018857,0x0003abce,0x00047291,0x0006344d,0x000b0f1f,0x000a40d4,0x0008d1e0,0x0004d761,0x00033b42,0x00029070,0x0002a84f,0x0002a2c2,0x000323b0,0x0007ff72,0x000bdf8d,0x000d360d,0x000e9ec4,0x000847eb,0x000a6d9e,0x000592a3,0x000973aa,0x00118837,0x00265f4b, -0x000d0fc1,0x0009cf7b,0x003553b0,0x0028ed3f,0x001fda23,0x000ec871,0x0009deda,0x000a4159,0x00059c69,0x000189bd,0x0001336e,0x0003e54a,0x0003d4bb,0x000332de,0x0001ecec,0x0002ada1,0x00037264,0x0002dd20,0x00027647,0x0002e850,0x00037578,0x0002c0b0,0x00025791,0x0002d69f,0x0003c707, -0x00033362,0x0002e004,0x0003f111,0x0004663f,0x000656e7,0x0005e838,0x0004f82f,0x000d8ff9,0x000ff825,0x001c7525,0x0022578a,0x000910d6,0x000f26fc,0x00170c9c,0x0011dd99,0x000c5b9f,0x000a04c5,0x000763f7,0x000481ed,0x000372d1,0x0002d21e,0x00018b58,0x00004b2f,0x00004d3b,0x0000c2b2, -0x0000fabc,0x0000d3a8,0x0001a03c,0x000206f4,0x0000bb54,0x0001485e,0x00063be4,0x00035f92,0x0003844a,0x000256a7,0x00032868,0x000387f8,0x00033eb6,0x00024728,0x0002e2d1,0x000584cc,0x000a63a9,0x000ccbcb,0x00116cec,0x000acce4,0x0011d888,0x000c45b9,0x000e56f5,0x005c762d,0x00343483, -0x002b5ce8,0x002190e0,0x001435fe,0x0008e008,0x00046f84,0x0004c092,0x0001afac,0x00014264,0x0000ef6c,0x00008cd8,0x0000793d,0x0000fcf7,0x00014a88,0x00020d7b,0x00020546,0x00022904,0x000216a6,0x0003b00a,0x0002b923,0x00030b70,0x0002a3e5,0x0002a932,0x0002e57e,0x00033d87,0x0004bfbf, -0x00050c97,0x000754ed,0x0007e69e,0x0008fe21,0x000e7c03,0x000f4ed6,0x00168e38,0x002b1280,0x00524435,0x00576805,0x006741d0,0x004f1231,0x003ddda1,0x0030ae44,0x003139cb,0x002113d8,0x000b6c21,0x00066d4d,0x00032714,0x0001844b,0x0000f310,0x0000c836,0x0001793e,0x0000c547,0x0000c43a, -0x00018341,0x0000d9f0,0x00010046,0x00016dc6,0x0001cae7,0x0001e766,0x0001e16e,0x00023153,0x0002724a,0x0003722b,0x00046503,0x0005c622,0x0006ab05,0x00096521,0x000d8a91,0x0017261d,0x001f8435,0x001d5be9,0x002337b4,0x003771f0,0x002f1d06,0x00337a26,0x0035d94f,0x002c52f1,0x00261c26, -0x001fece7,0x001ebe14,0x002195f6,0x001b8800,0x001528f6,0x000df3e7,0x000b0960,0x0007b63c,0x00056d1d,0x00029be5,0x000143a4,0x000140f3,0x00015c53,0x0001aa86,0x000160cc,0x0003a73d,0x0005c6f1,0x000751fe,0x00096be3,0x000af807,0x000b7029,0x00108f84,0x00119e31,0x001058e2,0x0010519f, -0x0011a551,0x001aad70,0x0021a343,0x0025243d,0x0023174e,0x00253c56,0x001e3c9a,0x001f2419,0x001c6bbb,0x001bec9c,0x001cd56b,0x0019c5dd,0x00176253,0x0015b750,0x0012afbb,0x0010a2be,0x000fba9f,0x000bbaff,0x00098977,0x000799c9,0x0004d64b,0x0002f78f,0x0002332e,0x000140e2,0x0001b3b4, -0x00025480,0x00035ce1,0x00054136,0x0007b3a8,0x000927be,0x000b09a7,0x000dd5c5,0x0010741b,0x0013ed9e,0x0018384f,0x001a69e1,0x0022ae24,0x002f6797,0x0027377b,0x00243060,0x002857fc,0x0020e07d,0x00129899,0x0013e86d,0x00142886,0x0012a52b,0x00125648,0x00122de0,0x0011b608,0x0011a171, -0x000f723d,0x000d77aa,0x000bd379,0x000a3b06,0x0008c090,0x0007619a,0x000637df,0x000509da,0x00047d49,0x0003e777,0x0003ec1f,0x000360fe,0x000493fa,0x0005ec55,0x00075468,0x00091267,0x000af986,0x000d4a01,0x000da34a,0x000e95bb,0x000f530d,0x00104560,0x00106a1a,0x00123d27,0x00111b29, -0x0010e99d,0x0010fe0f,0x00118d63,0x000e9df8,0x000ef263,0x000f0b06,0x000f2358,0x000f9891,0x000e4ccd,0x000e739c,0x000ee568,0x000e1e0e,0x000d8509,0x000cfc2c,0x000c84b2,0x000c3993,0x000bd418,0x000abc80,0x000a0abc,0x000acb91,0x0009b6d7,0x00092840,0x00082ecb,0x00093d05,0x0009c81e, -0x000a964b,0x000b37ae,0x000be29a,0x000cc4d6,0x000d0e64,0x000d8e8a,0x000e39cd,0x000e8ade,0x000f0e3b,0x000fab15,0x000f392e,0x000ef877,0x000e8abb,0x000eab42,0x001152af,0x00000c78,0x00000b62,0x000008c8,0x000007f5,0x0000088c,0x00001087,0x000006e5,0x000004c4,0x00000707,0x000003f9, -0x000005db,0x000008d7,0x00000892,0x0000097b,0x0000046a,0x00000e4b,0x0000109e,0x00000c0f,0x000009ad,0x000008ef,0x000008e2,0x0000093d,0x00000c0c,0x00001446,0x00001a87,0x00001bf5,0x00001a45,0x00001140,0x00000f98,0x00001567,0x0000101b,0x00000c51,0x000003e3,0x000009fb,0x00000df8, -0x00001874,0x00000e56,0x0000230e,0x00000ca0,0x000008c4,0x00000ad8,0x00002f36,0x000006b9,0x000009a9,0x000025c1,0x00001dd1,0x00002624,0x000029e7,0x00001b59,0x00001a1d,0x00000c2f,0x00002a85,0x00002e39,0x0000176f,0x000011ae,0x0000176e,0x00001eae,0x0000210d,0x00003449,0x00006aa1, -0x0000a5af,0x0000afdf,0x000088bb,0x00003b2c,0x00001c77,0x00003e3b,0x00001ef6,0x0000189b,0x00000749,0x000025e5,0x00003e5d,0x00006523,0x00003862,0x000035e2,0x00001bf4,0x00000400,0x00000815,0x00006e5d,0x000009be,0x000021b1,0x0000a10a,0x0000e3ba,0x00014a1f,0x00015945,0x00008739, -0x00004646,0x00005b45,0x000049d9,0x0000644c,0x0000274b,0x0000160c,0x00001f71,0x0000377a,0x00002926,0x00003c14,0x0000ac20,0x000122be,0x0001401f,0x0001303e,0x000088e0,0x00006b11,0x0000d55b,0x00005e6b,0x00003846,0x00002b18,0x00006f0c,0x0000afe0,0x0000de0b,0x00007568,0x0000e7f6, -0x000022b9,0x00003791,0x0000634f,0x000181a2,0x0000508a,0x0000ead0,0x00019658,0x0001d0c0,0x00020e23,0x0000f32d,0x00006d52,0x000063c0,0x00006d7d,0x000097c5,0x0000e249,0x0000a3cf,0x000057fe,0x0000c587,0x0001529d,0x00014fe7,0x0001af42,0x00036909,0x000551d9,0x000607da,0x0004ca0f, -0x0001a8ab,0x00007555,0x0001dca0,0x00006dcb,0x00005d68,0x00007eaa,0x0001740e,0x0002406c,0x00032b15,0x0001af82,0x00066420,0x0003138e,0x00034c23,0x00021a1e,0x00012da2,0x0001b945,0x0001f1da,0x000243a9,0x0000d921,0x0000144f,0x00000f28,0x00008db1,0x00006a90,0x00006cd9,0x000061d4, -0x0000e37f,0x0001c720,0x00023f3f,0x00036804,0x000462c4,0x0004b19d,0x0003e1c8,0x0003b584,0x0003d545,0x0004fd65,0x000605cf,0x0003cc6e,0x000491cd,0x0004f993,0x00027028,0x0000a7df,0x000143d5,0x0000e298,0x0001fe03,0x00055013,0x00062f76,0x0001c456,0x0001d4e7,0x00048845,0x000234dd, -0x0002eafa,0x000598c3,0x0005c38c,0x000185f0,0x00005e19,0x00000e2c,0x000028d6,0x00005bbf,0x000043a9,0x00003821,0x00000aec,0x00001e0a,0x000025bf,0x00003cbc,0x000077b7,0x0001300a,0x0000fb1b,0x00018aa0,0x0001b4c6,0x000260e5,0x0002a979,0x000506e3,0x00056068,0x00044c00,0x0005fb17, -0x0001425b,0x00011a9b,0x0001d290,0x0006a460,0x000652b0,0x0004cd05,0x00022cb0,0x000a106e,0x002ae407,0x0017857f,0x000a5172,0x0001ed3a,0x00006f66,0x00006179,0x00007a2d,0x000043cb,0x0000161c,0x00000588,0x00000df4,0x0000028b,0x00003307,0x000028c1,0x00003f78,0x000045bf,0x00001b52, -0x0000252d,0x00005e95,0x00006783,0x0000c289,0x0001410a,0x0001d530,0x000214b8,0x00030da7,0x000271ba,0x00018ea7,0x00048f5a,0x0006184e,0x0006074a,0x0007d42a,0x00061e8d,0x0005d51d,0x0007a41a,0x0002b590,0x0007e67a,0x001625a4,0x000aa822,0x0009129f,0x00049d9e,0x00007de0,0x00005d14, -0x0000404f,0x00000352,0x00000194,0x00000828,0x000005dc,0x00000271,0x000006c2,0x0000019a,0x000015aa,0x00006979,0x00008f9a,0x0000b5d7,0x0000cf04,0x0000c584,0x0000a29b,0x0000ccdf,0x0000d383,0x00010f07,0x00013ded,0x0000f54d,0x0000852f,0x00016129,0x00024581,0x0001f41b,0x0003e8ed, -0x0002f308,0x00041991,0x0004736a,0x00035c7a,0x00030b71,0x0004aaab,0x00053e33,0x00039934,0x0000cb45,0x00002420,0x00000e39,0x00002c95,0x00001c2d,0x00001ab7,0x000012ca,0x00000f61,0x000008b0,0x00000584,0x00002360,0x00006e1c,0x0001071d,0x000154d0,0x00018b02,0x00016c1e,0x00010de0, -0x0000a1e5,0x00004675,0x00002aa5,0x0000825c,0x00015e11,0x0001d72f,0x000299e2,0x00032801,0x0002f131,0x00026192,0x000187ec,0x00013d95,0x000097c1,0x00010e66,0x000279c5,0x00021680,0x0001e320,0x0001a462,0x0001573f,0x00012c41,0x00010bb5,0x0000cf4d,0x00009db1,0x00009ccd,0x000089ce, -0x00005da9,0x00004660,0x000026f1,0x000037b8,0x00003c05,0x00003d40,0x00003cd6,0x00005c63,0x00007166,0x000063ca,0x000035d8,0x00001e28,0x00001ad3,0x00004153,0x0000a11f,0x00010dd2,0x00019722,0x0001e7e9,0x000219bd,0x0001dd5e,0x0001d046,0x0001fcdb,0x0001a561,0x00018113,0x0001b5c8, -0x0001ed1c,0x00010858,0x000135ff,0x000129f0,0x000131e6,0x00016942,0x00013e3f,0x00010d1c,0x000105d6,0x0000d04d,0x0000bf6f,0x0000b8d2,0x00009b49,0x0000953e,0x0000ae9a,0x00007e41,0x00007a55,0x00009b94,0x00008028,0x00006bd7,0x0000604d,0x00004fd2,0x0000483f,0x00004b32,0x00003e7e, -0x00003bbd,0x000044f4,0x000030ff,0x00003954,0x0000645a,0x00005794,0x00005d8a,0x00006e17,0x00005e82,0x000062d4,0x00008f2d,0x0000cb44,0x0000b869,0x0000d6df,0x0000de51,0x0000caeb,0x0000dd14,0x0000e2d0,0x000100f8,0x00011fcc,0x000105ee,0x0000efe6,0x0000e662,0x0000d977,0x0000d42c, -0x0000dd6e,0x0000bed6,0x0000a64c,0x00009595,0x00008afc,0x00008d74,0x00008ebf,0x00007e46,0x00007006,0x000062db,0x0000596c,0x0000529a,0x000051a6,0x00004e87,0x000053c5,0x00005767,0x00005899,0x00005610,0x000058dc,0x000054a2,0x000065f0,0x00007f2f,0x00009f5e,0x000066f3,0x00006ce8, -0x0000722b,0x0000789e,0x00007c98,0x000078ef,0x00007e1f,0x00008d9b,0x00008974,0x00008b66,0x00008ac2,0x00008f60,0x0000903c,0x0000957b,0x000086e2,0x0000837c,0x00008482,0x000080cd,0x00007e2d,0x00007e7e,0x000076b8,0x00007218,0x00006dcc,0x00006a2d,0x000066b1,0x0000626d,0x00005e25, -0x0000595c,0x00005638,0x000052f9,0x000052b0,0x00005261,0x0000562b,0x00005869,0x00005c08,0x00005f3c,0x00008e1b +const Word32 defaultHRIR_rom_ER32_fx[HRTF_MODEL_N_SECTIONS * 470] = { +88760616,79018416,90166504,83236560,88159800,108024648,77068208,78038792,98254112,100230288,97137408,88461312,96433632,98852192,97276480,75082112,71550016,106986256,78099360,74156248,76344976,67961992,73216416,75071136,76690944, +78336760,79795336,82089656,84632528,87644704,91143080,94597776,101275232,97075600,94508208,89736288,86686056,117311776,114996008,113576624,78532160,67534416,59446544,56482944,49819276,52182616,52621296,51400732,52711936,48079572, +48075048,45582644,47691592,55576172,53204512,71099896,71140240,72448904,79583656,86694624,91176528,96374240,101619424,108647776,118282488,130797880,146140144,161999376,184326080,175325072,164472096,147046928,134462160,165361440,125170128, +98674000,74151504,55850892,42240028,34614856,29417084,26595552,23340964,29375460,25912520,25041416,23813124,25759040,27539632,33571624,35717832,45503096,49805496,64785272,75062272,93078176,103676048,117107440,130548320,149577296, +172297696,202450832,234622336,268349600,320584800,286647904,262461312,226039664,187681104,250489088,158039552,114963944,65907796,45136720,31795876,20084012,12654827,9501616,9641118,12179912,11257490,10161779,8827229,10296505,12535888, +18392484,20601924,30287552,36079084,51857232,62754384,85218328,96108616,112447424,128932256,152835296,191765648,250675680,329322944,415525952,535542016,483468544,420473664,366451584,283952032,608588096,389219456,276151904,134411136,83525544, +55955116,42569052,27432772,17738988,13409859,13668913,13309946,12848914,10447305,11459800,14376133,20331988,30079616,48462460,63412900,114058024,166920608,276709408,340651616,446025408,584658624,655611648,705746304,710336192,697861056, +648312832,604570560,602152064,620239744,690564352,598375680,1010646208,337472704,306583424,132161456,97220096,55720220,34675920,29772444,20689712,18859656,20003828,16276468,14182655,12021990,13666889,17546668,31488888,44591744,70501512, +81733888,133078544,169895984,275150688,383871328,535501664,700991616,768456448,808051008,822063040,799996608,778144960,755152704,697802304,741834176,982159808,959763648,1371421568,582091008,412819168,149369808,158694000,73629344,58067900,30516828, +22633720,23190980,41626956,25339464,22393744,27695812,23351728,32009424,50183724,53231756,74661904,84715552,147816976,185713312,303955488,406126048,534531232,647734208,758537472,827758720,854989376,769130112,729778368,753353536,658719296, +689954752,1087904256,1064682880,867167936,618503936,319939040,152573424,84540664,56803532,35164204,29349044,24133412,27896784,63446820,24820004,20324292,24871784,28144432,35140888,51398368,57463684,76397104,88220632,131920352,151028096, +207473104,296196704,400979200,493415456,604162368,659172992,671658304,708506688,695342400,697125888,572681856,522107008,620476992,567286336,438105088,411682400,271004064,151300992,98388896,62410412,45789872,41208024,33841976,31885344,42695936, +28366484,26102400,27804588,34291904,43999168,52529624,66049780,103064936,115805032,140562016,148172160,175213568,208137680,276240928,372869952,453212064,513631776,558223680,534010592,521493600,554389952,497946496,491599648,497854464,490101664, +320390720,267051040,204771024,134351504,88094608,73433712,51393940,39785272,39000272,39520284,37839368,35730848,33088420,33640416,39713228,52888068,71058840,80475072,103289056,117327136,146116240,142602832,151264592,176713248,208335456, +239621936,280394944,326010464,373923648,399279648,412166208,416335104,418849248,407443488,372017152,351944800,257733520,215815824,174477040,140826608,115503616,86781536,71969952,53304496,61231524,48593056,62089816,56050132,59752936,56412344, +67082092,70255920,83937568,93564344,113650248,125184864,151155072,149027664,164250064,180802784,201900176,224080832,246024896,268482720,297299360,305989952,322232160,347701952,332664896,326001248,329599648,284727136,198522400,210461072,221135744, +160725616,144860992,132276696,124353200,109418728,122174296,125313112,113349984,122832112,112214944,111025920,104724352,113419360,124270624,119143328,164230928,159072496,157873024,168215072,176731312,186146816,198693248,210425008,219156496,227801296, +237363296,245686608,252379568,264707424,245918416,231705824,219903344,210047552,171788192,201089152,183559792,195766992,253686384,177635024,177477712,230032128,239713264,234726480,212597200,233288704,240406992,233676048,172467696,164085536,263048240, +182861264,170227872,183018128,156971712,167628432,169009600,171948384,173868352,176141632,178147056,180612704,183508896,187093520,190499520,196578864,191095456,188512528,183686048,183842848,216066112,66454,52478,45196,52985,60021, +97129,53153,50389,57264,60383,65366,77065,70844,65830,48474,53842,59304,83710,81124,82429,78583,70572,65271,61464,60265,54233,51220,32051,27699,28809, +42948,51164,46833,66642,67950,47262,55962,60333,61966,94535,124480,235239,64953,43792,63419,78877,107304,136386,122238,96773,55033,66284,95139,167853,178428, +181964,159688,130528,107529,92132,94585,74479,73075,31330,27039,44842,45911,63139,42145,92970,85483,37994,52232,98697,135772,115488,133165,468268,81747,72983, +99613,142703,201930,293427,231904,178790,80580,84121,167325,349529,368250,355050,294736,219986,159749,121161,140029,117492,212175,128720,135709,192431,59470,83526,38187, +187767,203032,78100,111953,144784,199089,312592,522148,1189550,181739,241329,152867,310344,411563,579716,452748,290933,161002,226890,405855,751558,695691,686065,576943,429622, +290815,230933,293057,300415,549541,611093,686590,736727,176823,103687,82843,297371,285884,177413,86992,374054,583723,2066685,1589315,901935,353281,765961,599661,614773,465413, +573946,126739,100420,240168,291803,406917,724412,672415,577590,318051,211964,168130,174095,172951,205969,523728,777869,865710,958162,542766,684076,365231,619803,1148669,2515892, +855124,643134,3494509,2681784,2085448,968842,647105,672262,367330,100569,78852,255927,250759,210356,126405,175658,225716,187604,161074,190400,226511,180067,153553,186123,247741, +209601,188893,258107,287967,415218,386959,326139,888893,1047648,1865588,2249168,593188,992760,1511550,1170495,811210,656193,484328,294902,226509,184678,101491,19111,19886,49614, +64208,54187,106296,133088,48033,84258,408395,221702,230175,153193,206816,231646,212816,149179,189298,362054,681499,839328,1142820,707741,1169504,804112,939876,6060110,3421758, +2841908,2200771,1324187,581918,290715,311484,110422,82558,61472,35801,31030,64738,84532,134908,132343,141186,136720,241857,178536,199347,172860,174390,189670,212285,311339, +331137,480912,517840,588980,949871,1002710,1478128,2822351,5391308,5729717,6764645,5183223,4054833,3189906,3225696,2168591,749482,420969,206997,99269,62255,51332,96468,50535,50107, +99215,55531,65947,93898,117514,124548,123063,143555,160649,226379,288233,378211,436714,615699,887004,1517102,2065232,1923311,2308211,3633363,3086423,3373211,3527602,2903536,2497282, +2092813,2014602,2200209,1804860,1386897,914617,722377,505144,355574,170209,82672,81928,88967,109537,90524,239443,378789,479624,617943,719053,749363,1084323,1154454,1070666,1069982, +1156671,1748026,2205152,2434719,2299435,2440211,1982889,2040317,1863490,1829126,1890015,1689610,1532443,1423298,1225762,1089949,1030862,767976,625925,497740,317019,194588,144338,82417,111654, +152829,220623,344833,504976,599865,722697,906673,1077890,1306493,1586742,1729370,2272467,3104504,2570495,2371158,2643315,2155482,1218715,1305977,1320234,1221572,1202128,1191848,1160689,1155982, +1012180,882569,775136,669774,572840,483450,407511,330048,294287,255652,256620,221928,299755,388843,479806,594753,719196,870825,893671,954831,1004071,1067399,1075680,1195616,1121022, +1107520,1113470,1150221,958209,978591,985801,992879,1022510,937395,946857,976603,925835,886419,851136,820435,800163,775224,704154,658552,708095,637304,600212,535833,605046,641139, +693707,735477,779434,837095,856027,888459,931483,953939,986526,1027201,997783,981439,953746,961618,1135611,3198,2924,2298,2027,2160,4253,1771,1231,1844,1040, +1506,2300,2146,2411,1164,3711,4312,3068,2452,2306,2270,2394,3090,5238,6796,7152,6713,4382,3998,5449,4225,3127,1034,2555,3541, +6263,3620,8967,3183,2222,2748,12072,1714,2507,9575,7665,9829,10709,6984,6801,3122,10837,11879,5940,4561,6013,7868,8477,13374,27331, +42205,45055,34956,15157,7249,15828,7900,6333,1845,9628,15811,25799,14407,13826,7133,1004,2078,28250,2475,8578,41076,58399,84442,88653,34510, +18075,23399,18812,25620,10058,5648,8146,14181,10642,15453,44069,74444,82182,77895,34981,27350,54536,24133,14519,10878,28462,45002,57041,30059,59190, +8935,14366,25391,98871,20664,60148,104010,118965,134813,62307,27943,25575,28189,38778,58122,42115,22305,50766,86635,86286,110499,223142,348618,395158,314472, +108593,30059,121974,28254,23911,32511,95019,148154,207718,110105,419100,201646,216249,137823,77223,112996,127140,148496,55691,5279,3942,36177,27357,27803,25145, +57847,116571,147509,223238,287100,308165,254774,243038,251387,327613,394729,248676,299408,325535,159760,43032,83110,58339,130620,347579,404949,115410,120305,297287,144608, +191264,366259,378109,99692,24054,3629,10420,23525,17310,14362,2779,7647,9658,15646,30497,77731,64110,101234,111990,156077,173956,329997,352065,281162,392356, +82263,72390,119691,435032,414818,314648,142669,658800,2811296,1540892,676657,126419,28620,25014,31345,17431,5619,1455,3637,635,13202,10407,16227,17817,6988, +9612,24303,26626,49705,81786,120152,136238,199900,159574,101992,298938,399479,395033,513148,401787,382486,501141,177525,517773,1450625,698496,594854,302476,32224,23863, +16590,870,411,2103,1524,604,1711,407,5507,26939,36730,46555,53165,50531,41473,52612,53972,69093,81536,62957,34103,90198,148698,127641,256211, +193452,268448,292061,220226,199482,306203,343473,235865,51975,9332,3736,11349,7127,6922,4846,3991,2213,1438,9076,28209,67403,87335,101236,93102,69034, +41358,17953,10989,33304,89539,120379,170675,206891,192770,156117,99982,81574,38924,69300,162623,136974,123679,107462,88002,76649,68382,53184,40640,40074,35466, +23960,18012,10025,14262,15352,15740,15504,23691,28989,25578,13777,7736,6835,16644,41258,69109,104473,124852,137632,122037,118834,130003,108008,98495,112026, +126530,67561,79122,76156,78230,92263,81456,68992,66903,53458,49080,47154,39825,37986,44473,32320,31358,39796,32938,27613,24535,20400,18574,19235,16170, +15356,17789,12608,14701,25592,22452,24076,28209,24231,25235,36519,52048,47212,55071,56905,51777,56544,58169,65843,73783,66912,61491,59278,55595,54466, +56633,48746,42631,38146,35537,36089,36499,32323,28517,25264,22898,21202,20870,20127,21580,22321,22782,22229,22683,21784,25888,32438,40922,26395,27923, +29268,30849,32012,30959,32192,36231,35348,35696,35410,36665,36958,38412,34684,33519,33978,32886,32234,32428,30494,29173,27988,27088,26290,25314,24045, +22894,21969,21273,21100,21076,21880,22827,23574,24298,36350, }; -const UWord32 defaultHRIR_rom_EL16_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { -0x0624a2d8,0x0502a108,0x05b79728,0x056d4278,0x05b9bb98,0x05e5c5a0,0x06306120,0x0654ff78,0x067b1728,0x063a1c20,0x0613f848,0x05ee0980,0x05c33e88,0x059d3e18,0x057b0f90,0x05587a98,0x053bcb90,0x0523f068,0x050f7448,0x04db7478,0x0523f160,0x04961aa0,0x049bddb0,0x05a78478,0x046b85e0, -0x04637c28,0x05380080,0x054a5d90,0x05363028,0x050b2de0,0x05249788,0x0537d5d8,0x053265e8,0x047e3db8,0x04ac31f0,0x05954f50,0x04ef02d8,0x063a6220,0x071ba9b0,0x074d5100,0x07f8d530,0x08ad8a40,0x09c936d0,0x0a6c9e40,0x0abe03a0,0x09ec2c90,0x093fda60,0x089fee20,0x0805d110,0x078068a0, -0x07113e30,0x069a8fe0,0x063d24d0,0x05fd1120,0x05a84f60,0x0560f1b8,0x051edb20,0x04cd7c58,0x043a1788,0x04023720,0x03bcda18,0x039264e8,0x037f5924,0x03993a9c,0x03b1705c,0x03aa9534,0x03a49c58,0x03bc5730,0x03c748b4,0x0415fee8,0x044e85d8,0x0496d008,0x05614688,0x061778a8,0x07d401b8, -0x08e3d410,0x0a423230,0x0c1ae360,0x0e9a3640,0x10088aa0,0x113c9b80,0x0f1d94d0,0x0d7fb680,0x0c0d7f90,0x0a957c00,0x096bf460,0x08781eb0,0x07806ca0,0x06b5b0c8,0x062c1d90,0x0566aa80,0x04f7ca40,0x041c4a40,0x03a244f4,0x03260ad8,0x02cac318,0x027afedc,0x02483b1c,0x020f71a4,0x024ae7b4, -0x025bc7d4,0x02849c9c,0x021f34dc,0x0225460c,0x02617ba8,0x02bf0b30,0x03465ebc,0x03cfc0d8,0x04e170b0,0x06911b40,0x094cc250,0x0af33e50,0x0d161280,0x10885f20,0x152c92a0,0x18b0a460,0x1aca7ee0,0x15e14dc0,0x1212d800,0x0f1f4ef0,0x0c9ef5c0,0x0aa2a6b0,0x09304520,0x07b416f0,0x06971fe8, -0x05dd11d8,0x04efd298,0x0449c788,0x037203f4,0x02e2fe84,0x02260c0c,0x01c953ae,0x0160b458,0x012c78d0,0x0104b350,0x0131e1fc,0x0156c9bc,0x016813c8,0x011c214a,0x0109f02c,0x015718e0,0x01ae7b0c,0x02489ed0,0x0301f85c,0x048b4748,0x0be97980,0x0eb9f950,0x12431220,0x16053d40,0x1b3b95e0, -0x1e454380,0x204f6480,0x20e438c0,0x228e2180,0x22b17840,0x1e0fc940,0x1d0985c0,0x1a18efe0,0x167d71a0,0x12688ba0,0x0ed76a60,0x0c7a60b0,0x08bb6c10,0x06d53910,0x04d8fbe0,0x03ab79b8,0x02b2d390,0x0216eb08,0x01745d44,0x013c7076,0x012b97a0,0x017e3c6a,0x018e2c06,0x01801ec6,0x0160c0cc, -0x0186e664,0x022a2058,0x02de0148,0x041699d0,0x05990d40,0x08f10090,0x0dc85720,0x10e886c0,0x15d9d8a0,0x1a0cd3e0,0x2301d1c0,0x265aefc0,0x28f166c0,0x2820ff80,0x265bc100,0x22be5180,0x1d8e31a0,0x1ab6a1c0,0x17ba5a20,0x1574a7e0,0x119a8760,0x0e5695f0,0x0be73ad0,0x09c9ad30,0x0892ce60, -0x0674abb0,0x049e57e8,0x0330e1b8,0x024a83ec,0x01b620b0,0x01649f2a,0x01416fe0,0x0190bcc8,0x01dd9f6c,0x025dc42c,0x022350ac,0x02636e1c,0x0320d224,0x03895380,0x04eca110,0x073757a0,0x0a673ea0,0x0f044990,0x15234ce0,0x1e29dee0,0x24263140,0x2c386880,0x30414c00,0x344d9d40,0x343e5240, -0x3142a000,0x2b597d00,0x243a3940,0x1d5cca00,0x1765d500,0x1294d8a0,0x0ef6c040,0x0c33c290,0x0a986780,0x08e3fa20,0x08229e90,0x06ef0d10,0x05f32760,0x04ded370,0x03e51784,0x02c034c8,0x023a7d98,0x02caf794,0x026cc4e4,0x02d7a04c,0x04b41980,0x0292040c,0x02584f90,0x033182e4,0x03ecd26c, -0x05358700,0x0795b678,0x09fdeb80,0x1028b440,0x16ff2420,0x1eb27760,0x26345cc0,0x30ba6ac0,0x301470c0,0x3103b4c0,0x3373fdc0,0x31a9d680,0x2d540780,0x25c60900,0x2011c340,0x1a5b8be0,0x14c54780,0x1094fe40,0x0cf38b10,0x09e890f0,0x08b4e8e0,0x07e94ca0,0x06f462f0,0x0616a380,0x05164cb8, -0x04612cf0,0x0365ed34,0x02b00f80,0x029c1c54,0x022bd440,0x02ca387c,0x06f131c8,0x031a3b84,0x02aca900,0x030f4ddc,0x03ba2ce8,0x04e50658,0x0701cc30,0x0a8cf270,0x0e903b40,0x145b6920,0x1f5ae020,0x26581a00,0x2946ec40,0x2a025780,0x28c33380,0x26b16e40,0x212d2000,0x1ec910c0,0x1e241960, -0x19e84c00,0x15b26ea0,0x11a9d8a0,0x0db51b30,0x0b33bb50,0x09991cf0,0x08d9d610,0x0854d4d0,0x07cc3310,0x068f3da0,0x059da200,0x04ad4498,0x03d908a0,0x033f10d8,0x02e22714,0x02f268e0,0x0330596c,0x0492e2f0,0x03593910,0x0350b3e8,0x035af7f8,0x04642e08,0x058bf328,0x07489fd8,0x0a1d0120, -0x0fc0a7b0,0x11ed4d40,0x17a7af60,0x1b047380,0x1e002b20,0x20198840,0x1f8502c0,0x1cbd4640,0x19e66800,0x16fb8720,0x14667bc0,0x11530f20,0x0f1885f0,0x0d6fe510,0x0c2ae5d0,0x0b21a6b0,0x0a39a850,0x0a69bb60,0x0a43e190,0x0844c790,0x085c8a70,0x06c99650,0x05c98220,0x04df7be8,0x040db858, -0x038f4584,0x0398de18,0x03c5a980,0x03a4f86c,0x03e14bd4,0x03e4ce1c,0x03cd0f54,0x0489bb78,0x05bf05f0,0x079032c0,0x0a753ef0,0x0e139e20,0x10534980,0x130efaa0,0x157f4260,0x18ef2c80,0x184a9ac0,0x184e6200,0x18d4bee0,0x16e26de0,0x15483420,0x13cea400,0x127b2a00,0x112c45e0,0x0fcd8230, -0x0f15d430,0x0e82fa50,0x0df43f00,0x0cb8ad60,0x0bb2a1d0,0x0a897590,0x0996b110,0x0852ad80,0x07463cb8,0x06549c68,0x06351e88,0x0524dae0,0x0593e9f8,0x04e6ce08,0x059461d8,0x04bec1f8,0x05c83d98,0x0554fbf0,0x06df2d20,0x0830b9d0,0x0a60f2b0,0x0b88f820,0x107e2700,0x0e6c0420,0x0e794df0, -0x0f35fe20,0x100b60c0,0x10fe6dc0,0x1214e020,0x135bdd20,0x12af0860,0x12507320,0x11dcda00,0x116a4c00,0x111531a0,0x10d0ac60,0x0ff95670,0x0f1516a0,0x0e4fd8d0,0x0d855130,0x0cb04c10,0x0c64f800,0x0df96910,0x0a22e4c0,0x09e4eea0,0x09407da0,0x08940b40,0x07f95de8,0x082c6ab0,0x0894bb00, -0x085ba730,0x08ba72d0,0x08990780,0x08279020,0x09204a20,0x09f9e440,0x0aceb060,0x0baf9b20,0x0c802c40,0x0d630f70,0x0c2f06e0,0x0ccb6be0,0x0ce416a0,0x0d3fc000,0x0d7ce630,0x0dedbf90,0x0da32640,0x0d8706e0,0x0d679610,0x0d4cece0,0x0d3152d0,0x0d26f6f0,0x0cd4b0c0,0x0c958530,0x0c4ccae0, -0x0c2360d0,0x0b9495a0,0x0cab1b70,0x0c1ef330,0x0d196120,0x1203e700,0x0b1295f0,0x0c14e480,0x0fdd1380,0x10288c60,0x0fbbbb30,0x0ebcdd90,0x0fb5a5e0,0x0ffad130,0x0f7264e0,0x0c2a6500,0x0b6ec960,0x11a380c0,0x0d9bd9c0,0x0ed44760,0x000209d5,0x0001a183,0x0001605c,0x00019aba,0x0001b56c, -0x000175aa,0x00021465,0x000205b5,0x00016c8a,0x00018f90,0x00014eca,0x0000e4b2,0x0000da0e,0x0000ffb3,0x00019425,0x0001aaae,0x0001d8a9,0x0001e03f,0x0001fe04,0x000228b1,0x000267e4,0x0002896e,0x000284fb,0x0002a28a,0x0001d3b1,0x0001a78c,0x00018023,0x000206d0,0x00022fe3,0x00025fdc, -0x0002096b,0x0001e694,0x0001c827,0x00019141,0x0001a537,0x0002f840,0x0001dc20,0x000300fc,0x0001e10f,0x0001d3de,0x00019abe,0x00013150,0x00029617,0x0002c5e0,0x00013f9e,0x0001efa6,0x000172f4,0x000188a7,0x0000c66c,0x0000efaa,0x000235ea,0x000241bf,0x0002e030,0x0002c12d,0x00033b2e, -0x0003efd1,0x0004d763,0x000584e8,0x00057976,0x00054759,0x000309d3,0x000216c3,0x0001ae27,0x0002f388,0x0003b726,0x00042887,0x00034dd6,0x000277fe,0x0001eda1,0x000164f7,0x0002051d,0x0007334e,0x0003d303,0x0003857d,0x00042a09,0x0002fc3f,0x00036162,0x00026ede,0x00060e59,0x00058946, -0x00010c8a,0x0002bd6a,0x00020e00,0x0006d75c,0x00040721,0x0003e9d1,0x00064d17,0x0003969a,0x000444e8,0x000392f9,0x0004be50,0x00068ff6,0x0008e95f,0x000acc7e,0x000b7b82,0x000b51af,0x00056e6a,0x0002b543,0x00026b17,0x00056f50,0x000716ae,0x0008d2e7,0x00064000,0x000480c9,0x0002fabe, -0x00026c91,0x0002b2c7,0x000e4c49,0x00040fab,0x00098fa2,0x000586a7,0x0003d9d5,0x00027648,0x00055a22,0x0008af2e,0x0008a3e1,0x00021122,0x00035235,0x00062735,0x00193b7b,0x001454c2,0x00119271,0x000f9c28,0x00091724,0x0008e774,0x000692e3,0x0008522d,0x000c7c47,0x0011488f,0x0014a237, -0x00155315,0x0017c8c9,0x000de6fd,0x0007878f,0x0004b7b0,0x0008cf1d,0x000dd3d6,0x0010c8fd,0x000be76c,0x0009ac58,0x000433f6,0x0007d9b1,0x00057bec,0x002530f8,0x000fbdb7,0x0045bfbe,0x0011c48b,0x000ab541,0x001949a2,0x004c3d23,0x002303f3,0x001446f0,0x000c9c91,0x001a4ab5,0x00127f5a, -0x001bc61f,0x0019fe46,0x0016bbea,0x000f4b91,0x00065750,0x00058270,0x000549a9,0x0005345b,0x0006d170,0x000a1b67,0x0011ff44,0x00151bc3,0x0017f025,0x000d465a,0x00092f7e,0x0007301b,0x000265d5,0x000315e2,0x00118af8,0x000eb7e9,0x00129460,0x0011b11f,0x00177a41,0x000b0485,0x001d0e04, -0x0033275e,0x00523fe4,0x006a81f1,0x00144bf2,0x00124f97,0x0040e732,0x00364b59,0x001e6ee9,0x001ab2a9,0x0009900f,0x000b03c0,0x000bf0ec,0x0007a1f9,0x00067eb1,0x0005a208,0x00062182,0x00072f87,0x00063b06,0x0005130e,0x000586dd,0x0006c592,0x0005a60a,0x0004f5a0,0x00060cbb,0x0006e661, -0x00054f23,0x0003cc55,0x00066361,0x00078ebf,0x0007a8bc,0x0002864b,0x000321a9,0x000acb42,0x0017cf61,0x00164bd5,0x001c5fc2,0x003eefbd,0x00290bb7,0x002fe104,0x001cb293,0x001bc942,0x001621b6,0x001ce2ff,0x001315da,0x002929c8,0x001b21ff,0x00160e91,0x000d219f,0x000621ca,0x00049ffb, -0x00068e56,0x000927c7,0x000910cd,0x0005fdf6,0x0007ac61,0x0006e989,0x000c6dc7,0x000301c6,0x0001d6d6,0x0004d5c0,0x000329ec,0x0001dd24,0x0001f40a,0x00017aa1,0x000098f0,0x00008de7,0x0003460b,0x00059817,0x0006664f,0x00091278,0x000ebf87,0x00168438,0x001d6d45,0x00566f1d,0x006a1fe7, -0x00bcdda5,0x00b4dd2b,0x0071046d,0x002ead66,0x001eed76,0x0021a47d,0x0012476e,0x000fb8bb,0x000dca3c,0x00097055,0x0009065f,0x0005e6a3,0x0005f7ff,0x0005b48b,0x0005856d,0x000709c2,0x0005c475,0x0007364d,0x000406d0,0x000431fc,0x000469cb,0x00042623,0x0002b7ba,0x0002240e,0x0000fd46, -0x00011e73,0x000201ec,0x00026ca5,0x00035ca6,0x000a12b4,0x00085fc8,0x0011a58a,0x002bd6ed,0x0043da78,0x00a97d16,0x00e5b8ad,0x00c6361b,0x007d42b8,0x00491a4d,0x00385f6e,0x00419a76,0x003995a0,0x001e88ba,0x00136f50,0x000c7cb4,0x000a3d24,0x0007a005,0x0006982e,0x0004e5db,0x00047ecf, -0x0004bcd8,0x00045981,0x0003c1b4,0x00034d34,0x00022f89,0x00019e8e,0x0002d627,0x0001521b,0x000188c5,0x00031478,0x00019d98,0x0001cc2f,0x0002eb4b,0x0006a8ca,0x000e1cb9,0x0019e6d2,0x004757aa,0x006672eb,0x0068cb5f,0x00800c36,0x0071a550,0x0069afc1,0x0062c235,0x005252ef,0x0052b8cd, -0x005b6162,0x00526d28,0x003c97b6,0x00233d54,0x00204894,0x002279c0,0x0029e1b2,0x0029914f,0x001d86fe,0x001a4c34,0x001535b1,0x000ed734,0x000bc7c0,0x00077814,0x0002ae0d,0x00035020,0x0002b680,0x00025a14,0x00026cc3,0x00050664,0x000ab609,0x00105e6c,0x001794f2,0x001d185b,0x002c025f, -0x00396d11,0x0042f5a8,0x003f7e9d,0x003f53b4,0x004bbd49,0x005a5018,0x0038c8e3,0x003f55cd,0x003ec78c,0x00443afd,0x005360fc,0x004baeee,0x0052a62c,0x006502a0,0x004b796a,0x003b4da3,0x003742d5,0x002da89c,0x002593f1,0x001f0834,0x0018a76a,0x0014009b,0x001054dd,0x000b9310,0x0007d2d1, -0x000626d7,0x0004f301,0x000393ac,0x00053172,0x00069b4a,0x000a38c5,0x000f69cf,0x001351e5,0x00178e3b,0x001f98f4,0x0020f743,0x0024dcca,0x002b30cf,0x002e45e4,0x00344b15,0x003b0cbb,0x00394849,0x0029609d,0x00292e62,0x00266c2b,0x0024898e,0x0023aae1,0x0023bd28,0x00243ab9,0x00268608, -0x00228d82,0x00220160,0x001fe93b,0x001e66af,0x001c921d,0x001bfa9b,0x0017252c,0x00133555,0x000f7a11,0x000c86b3,0x000994a5,0x00071767,0x00087ba2,0x00088069,0x0009ce89,0x000ad099,0x000d5502,0x000fcc06,0x00129091,0x00157b24,0x0018a998,0x001bf36c,0x00200cfa,0x002406a2,0x002447b1, -0x0024dae8,0x00254f81,0x00267df4,0x001ed382,0x001f4ce3,0x001e9fb4,0x001ed132,0x001e9464,0x001f7664,0x00200213,0x0020fd35,0x001fce96,0x001edbf2,0x001e44dc,0x001cf62c,0x001bf4ac,0x001b7265,0x001966d1,0x0017e10a,0x00167b70,0x0014ac70,0x001379f0,0x00110fa3,0x00130646,0x00140a3d, -0x001611e3,0x001506a2,0x0016336b,0x00181acb,0x0018dd28,0x00196d8f,0x001a4eb6,0x001b569e,0x001c7c48,0x001e0988,0x001d99ed,0x001dbc49,0x001f7a05,0x001ecf2d,0x00246f91,0x0000188d,0x00000f92,0x00001132,0x0000168b,0x00001c6a,0x000030a3,0x00001bec,0x00001406,0x000007dc,0x00001853, -0x00001fe9,0x00002a54,0x00001ef0,0x00002254,0x0000350d,0x0000379c,0x000034ac,0x00002852,0x000017f7,0x00001269,0x000011c1,0x000011e7,0x00001346,0x000017b0,0x000020fe,0x00001c7b,0x000008c2,0x000012cf,0x000010f5,0x000011a9,0x00000bbc,0x000007dc,0x00000e30,0x0000096b,0x00000da8, -0x00002093,0x000010bd,0x000012df,0x0000196e,0x000048eb,0x000072e3,0x0000ca93,0x00007cdd,0x00004d10,0x00000fac,0x000030cf,0x00003dc1,0x00007a8e,0x00003a89,0x00007b0f,0x00011c80,0x00016090,0x00014a49,0x0000d5d0,0x00006aec,0x00004620,0x000040e5,0x00003234,0x00002485,0x00003094, -0x00005d21,0x000055b5,0x0000183f,0x00003473,0x00003695,0x0000537a,0x00004c10,0x00003c4e,0x00004cff,0x0000138c,0x00000d90,0x00006005,0x0000171c,0x0000096c,0x000036c0,0x00006e87,0x0000ec3f,0x0001bc4e,0x000164bf,0x0000e4b1,0x00005a38,0x00007101,0x0000c172,0x0001a99f,0x0000db87, -0x00011a4d,0x000280de,0x00028294,0x00024467,0x00015d65,0x00007fe8,0x00005cd2,0x00007788,0x00004668,0x000030e9,0x00004fff,0x0000cae3,0x00009677,0x0000b75d,0x00008f33,0x0001106a,0x0002b208,0x0002968d,0x0001c596,0x000146d5,0x0000433d,0x000014ad,0x0000e09f,0x000012ff,0x000083f5, -0x00004ac3,0x0001fbab,0x00038540,0x0006696d,0x00047e73,0x0002ef57,0x00010da1,0x0000bb23,0x0000dc68,0x0003b18d,0x0000fe34,0x00039f63,0x000a3bca,0x000c2705,0x000a9ed8,0x0006e144,0x0003862f,0x0002d91d,0x0002c963,0x0001a93d,0x0000b94e,0x00015956,0x0001c82b,0x000137bd,0x0000e2bf, -0x0000d333,0x0000e517,0x00020cca,0x000447f8,0x0003b811,0x0003572c,0x0001ddc9,0x0000a61b,0x000314d7,0x0000d6ac,0x0006b74f,0x00065928,0x000d1d56,0x000cc273,0x000b0e5f,0x0004604e,0x0001e157,0x0002b348,0x00016524,0x0005069d,0x000a79cf,0x00091aae,0x0007d437,0x000c7282,0x000a0b1c, -0x0007a3bc,0x0007645c,0x0007e0bf,0x00097cb2,0x0008d032,0x0006cd6e,0x0004862b,0x0003a13e,0x0001c8e4,0x0000c3c4,0x0000d8ba,0x00011051,0x00015b85,0x00001f49,0x00002de4,0x0001dd27,0x0004bb49,0x0003e910,0x000381a4,0x00026e74,0x00043468,0x0008f416,0x0003e1d6,0x0003c91f,0x00048f46, -0x0009cca6,0x000d4f50,0x000ddc9a,0x0003c966,0x00023431,0x000292ed,0x000bfc2e,0x0008cb8d,0x000b2e1a,0x000a256f,0x00054d4c,0x0004c51f,0x000364c3,0x00031244,0x0001f974,0x00027681,0x0000e866,0x00008274,0x00004a6a,0x00003f88,0x00001659,0x000075ae,0x00008ba5,0x0000cd66,0x00006453, -0x00002191,0x0000dd42,0x00030ced,0x000bb6c2,0x000b7943,0x0006cf4b,0x0004a1a5,0x002f363b,0x0057c488,0x00164c4f,0x0006c044,0x000fb618,0x000c7da2,0x000cf97f,0x00100fbf,0x000c72cd,0x000ce7f3,0x00092f08,0x000316c3,0x0004d8b7,0x000621b0,0x00042a2e,0x0003b28b,0x000289c7,0x00018fb0, -0x0000d19d,0x0000bd9c,0x00004a05,0x000036b1,0x000090af,0x0000806a,0x000053cf,0x0000660d,0x000005ec,0x00001c10,0x00000d70,0x00002dec,0x000095c1,0x00012324,0x0000c3e9,0x0000e4c0,0x0003ed8c,0x0014ccf5,0x00156948,0x002cd4cb,0x00100955,0x0006f8e5,0x0008fbd8,0x00083edd,0x0005e85b, -0x0007ddae,0x0003e29d,0x00048730,0x0002d29c,0x00012c85,0x0002174c,0x0002afcb,0x00022692,0x0001a595,0x0001a316,0x00015675,0x00019fa3,0x0001b3b8,0x00017bf5,0x0001369d,0x0000e62a,0x00002e5d,0x0000030b,0x00000de6,0x000004e7,0x00000bee,0x000013c3,0x000003a4,0x000006bb,0x00007ce2, -0x0000b953,0x0000fc70,0x0009623d,0x00124b04,0x000a8a8f,0x0009b998,0x000675ce,0x000516e0,0x00020fc5,0x00013b95,0x0002cabd,0x00035a51,0x00052bf8,0x00064f52,0x0006da90,0x00058321,0x0003dc22,0x0002d3ba,0x00010e47,0x00005a8c,0x00008dba,0x00014461,0x00021c2d,0x0002d69e,0x00031b8c, -0x0002af02,0x00022fc6,0x0000f393,0x00004df3,0x00000b1d,0x00001317,0x00002397,0x0000280f,0x00003eb5,0x00003f16,0x000063ad,0x000027c4,0x00004ec4,0x00018e64,0x00073d48,0x00035b09,0x0003d329,0x00046b9b,0x00042557,0x0003b48b,0x000320d2,0x00035481,0x0003ffe5,0x0003a1ec,0x0003b99d, -0x00043361,0x0003ceb5,0x00032d10,0x00021b24,0x000143e4,0x00008431,0x0000350d,0x00003bc4,0x00006bb3,0x0000d2d2,0x0000f4b6,0x0000c623,0x000084fc,0x00008686,0x00008407,0x00007f23,0x000056d8,0x00008b06,0x0000bf25,0x00011c63,0x000150e5,0x0001505b,0x0001c3ce,0x00023264,0x000267cf, -0x0002bcdc,0x000279ab,0x00028684,0x00022549,0x00019f84,0x00011ea5,0x0000c56b,0x0000bcd3,0x0000dc19,0x0000ba7f,0x0000ae17,0x0000c72c,0x00007118,0x000060a5,0x00008893,0x00007647,0x00007bfb,0x000095ef,0x00009053,0x0000a365,0x0000c9c9,0x0000dfad,0x00010a87,0x000141ca,0x00010016, -0x0001077f,0x00016ae1,0x0001383e,0x0001468f,0x00018592,0x0001989e,0x0001c1b4,0x00023857,0x00024c9d,0x0002c3f8,0x00032a18,0x0002a685,0x0001bc09,0x0001adb6,0x0001713b,0x00013df7,0x0000fd5a,0x0000cb0c,0x0000a8e9,0x0000b30a,0x0000ae0b,0x0000b38e,0x0000b172,0x0000a9e3,0x00009f03, -0x0000a511,0x0000a5cb,0x0000b279,0x0000c4f3,0x0000df4d,0x0000fbeb,0x00011d90,0x00011ab7,0x00011747,0x00012ea0,0x0001514c,0x00018421,0x0001c573,0x0001b43e,0x0001c0be,0x0001db2c,0x0001f041,0x00021f80,0x00025560,0x00021172,0x0001d199,0x0001c50a,0x00019d12,0x0000ec33,0x0000e38c, -0x0000d58b,0x0000c4a9,0x0000bc7f,0x0000b366,0x0000add0,0x0000a546,0x0000a65b,0x0000a711,0x0000adaa,0x0000b3f7,0x0000bd81,0x0000c5eb,0x0000ceec,0x0000d62a,0x0000ddd5,0x0000e69e,0x0000f020,0x0001004f,0x0000ff52,0x000104a7,0x00010b0c,0x00010ccd,0x000113aa,0x00013070,0x000126bc, -0x00012626,0x00011e5a,0x00012093,0x00011d2c,0x000127d3,0x0001087d,0x0000fe1f,0x0000ff1c,0x0000f85b,0x0001253d +const Word16 defaultHRIR_rom_Alpha16_Q_fx = 14; +const Word16 defaultHRIR_rom_AlphaL16_fx[470 * 43] = { +8380,6269,8401,7771,8176,8335,8674,8832,8988,8768,8637,8490,8326,8172,8017,7913,7802,7708,7597,7296,7907,5897,4635,1865,6344, +4660,2063,2078,2146,2504,2302,2297,2416,4792,6824,2333,4771,4461,8916,9107,9676,10313,11364,11896,12044,11458,10925,10419,9924,9478, +9064,8746,8432,8229,7803,7551,7276,3787,5757,5601,5112,4603,5442,5504,5574,4940,5697,6147,5543,5999,5414,5542,7282,5787,8177, +9691,10544,11993,14066,15007,15422,14483,13605,12772,11826,10986,10141,9496,8808,8372,7383,7053,5537,4133,3696,3806,3509,2472,3344,2227, +3734,2298,3505,2677,3438,3752,4134,4190,5805,4617,8262,10224,11527,13966,17479,19149,19386,17375,15582,14054,12554,11201,10019,9088,8205, +7643,6453,5706,4200,1901,2624,1020,1277,942,796,514,312,1000,690,1365,1811,2415,2763,3014,4668,6291,8927,11871,14059,16425, +17679,19238,20683,22634,22907,21192,20713,19520,18133,16298,14420,12830,10390,8740,6224,3100,3301,2099,1584,953,724,728,921,1378,1172, +1643,1755,2623,2764,3797,5207,6590,10051,14293,16025,18893,20560,21734,21339,22490,21807,19985,19367,18199,16791,14850,13157,11995,10124,9208, +6573,4648,3961,3013,2571,1879,1240,1107,1027,907,1231,1332,2661,2866,4851,5215,7138,7325,13113,18499,20118,21868,20942,20129,19725, +19905,20551,21138,19921,18204,16176,13771,11762,10609,8506,7696,5582,4640,4245,3661,2920,2491,2023,1435,1528,2154,1479,1576,1995,2091, +5050,4548,7435,8750,15365,19235,20171,19597,20328,21710,23327,22957,22005,20076,19117,17646,15549,14172,12197,9629,7822,7024,6057,3648,4428, +3953,3004,2520,1678,1868,1456,3886,2377,1744,3009,2447,5241,4292,7393,9876,16023,20166,21255,21096,21373,21607,22510,21260,20825,20470, +18588,16585,14646,11814,9735,8138,8693,9212,8586,4983,6038,3688,3483,3842,2961,1878,2531,1661,2814,3171,4362,4409,4330,5159,9876, +7759,14596,17666,17591,18050,18916,19240,19096,18308,17298,16336,15077,13805,12455,11058,9956,9261,10052,11022,8363,5760,7119,5258,4886,3769, +2717,2491,2057,4954,3517,3594,4350,4646,6316,6646,9739,9512,12954,15294,15573,17054,17050,17209,17373,16493,15692,14820,13713,12578,11132, +10921,10433,9951,9446,10293,8896,6085,5795,5485,5332,3244,5091,2780,6170,2722,4969,3187,3995,5156,5772,6171,9170,4788,13078,13160, +13360,13825,14166,14646,15219,14723,14353,13964,13451,12957,12221,12021,11705,11560,11265,11174,10873,4251,8668,8645,8175,7235,8834,9150,9202, +7833,9457,9972,8450,9225,8179,8402,11178,9639,13753,12275,12794,12819,12994,13099,13320,13046,12880,12690,12542,12408,12250,12251,12204,12135, +12089,11674,13093,8964,6604,1330,10020,6755,1945,1911,2014,2728,2193,2240,2477,6885,10849,2122,6723,13891,5005,6121,4339,4957,4794, +4802,4707,4612,4379,4421,4402,4429,4448,4460,4477,4415,4416,4438,4503,4659,4111,5907,6791,8537,5255,6558,8183,8218,8138,7949, +8066,8142,8125,6606,5088,8481,7081,8529,5782,5726,5740,5552,5192,4792,4292,4519,4689,4931,5041,5074,5068,4842,4795,4801,5022, +5014,5081,7340,5484,5303,5427,5580,4722,4735,4781,5328,4623,4304,5174,5212,6049,6229,5565,7756,7564,6798,7061,6532,5661,4977, +3862,4223,4339,4598,4727,4750,4762,4400,4405,4497,5003,4901,5527,5806,5436,4892,4643,4830,3973,4712,3939,4898,3836,4478,4579, +5130,5662,6183,6396,8859,8794,7904,8035,6968,5112,3703,2329,3620,4617,5501,5924,6013,5854,5129,4881,4821,5257,5286,5474,5391, +4100,3844,3134,2695,2172,2177,2157,2397,2271,2491,3275,4128,4986,5557,6837,10202,10477,10680,10743,10460,10197,9179,7618,4299,2234, +1980,585,262,620,885,1832,2905,4498,4824,5187,5959,4705,4244,3264,2752,2339,2509,2508,2589,2315,2887,3967,5081,6408,7238, +8872,12173,11638,9852,10538,10909,10363,9589,9658,7417,6496,6416,5169,4394,3996,4456,4858,4969,6238,6324,6914,6312,4952,4101,3162, +2558,2034,2109,2605,3977,3828,4526,5517,6231,6970,8860,9952,12795,11036,8086,8572,8174,11474,13472,12939,12016,9345,5618,3945,3284, +3679,4820,5760,6061,7304,7442,7908,7323,6607,5804,4588,4008,4178,4772,5018,7049,4677,4755,5434,7081,7075,9474,9484,12564,8722, +5753,8122,12921,12019,10306,8040,7289,6084,5356,4377,3989,4459,4435,5225,6657,7603,7893,8027,8654,7740,7207,6379,5535,5194,3559, +4883,9885,5701,5243,5727,7009,6975,9550,10247,10165,5067,3960,5944,7857,8825,8583,6185,5343,3889,3071,3373,4099,4931,6646,7880, +8734,7795,6923,7282,9024,7404,7750,6877,5761,5641,5849,6022,8069,6285,6164,5417,6924,8277,9321,7285,12315,6027,4111,6501,7760, +8424,8277,7380,7516,7594,7579,7104,7173,7633,8330,8723,8624,7799,6167,7495,9541,7052,7605,6792,6663,6692,6897,7279,5375,6843, +6886,6407,6901,6660,8101,7314,9927,7301,5804,7121,6878,6869,6904,7187,7641,8042,8542,9122,9665,10417,9963,9856,9678,9108,7123, +7626,9593,8881,8321,7834,9036,7028,8785,5934,8839,6957,8936,8229,8853,9492,10619,8839,14131,5626,5665,5924,5849,6006,5992,5947, +6228,6516,6775,7192,7605,8332,7945,7690,7296,7073,6546,6507,12955,7815,7628,7656,8107,5892,5777,6058,7461,5951,5202,6759,6716, +8412,8804,6342,8176,2882,4739,4358,4426,4438,4475,4480,4673,4830,4998,5128,5226,5423,5148,5006,4848,4731,4943,3153,8441,10865, +15606,6690,10276,14522,14660,14473,13824,14415,14507,14230,10359,6085,15291,11186,4435,2370,1878,1988,1919,1870,1824,1843,1918,2116,2220, +2299,2328,2316,2332,2372,2393,2384,2359,2289,2241,2233,2021,1875,1707,2053,1829,1640,1716,1749,1809,1638,1584,1592,1775,1976, +1731,1807,1876,1643,1594,1454,1366,1393,1694,2300,2602,2766,2711,2653,2672,2799,2908,2925,2852,2678,2561,2449,2353,2469,2431, +2309,2276,2225,2444,2456,2469,2254,2156,2020,1910,1918,2194,2063,1926,1109,668,365,160,324,806,2080,2659,3087,3103,3080, +3173,3430,3584,3579,3367,3071,2822,2658,2832,2708,2614,2461,2375,2063,2531,2706,2769,2167,1865,1947,1825,1929,2346,2084,1525, +312,-275,-593,-743,-197,912,2870,3547,3771,3428,3147,3188,3619,3993,4052,3822,3423,3126,3018,3458,3189,3013,2765,2625,2204, +2542,2490,2803,1789,1427,1507,1260,1653,2307,1584,3927,1601,-1261,-2669,-4645,-6020,-6274,-4936,-2254,254,1728,3314,4227,4643,4783, +4671,4609,3617,3348,3595,3455,3370,3178,2818,2434,1633,2485,2704,2721,2489,2756,3535,3505,3944,4048,4007,82,-2491,-4824,-6032, +-9538,-9580,-9597,-9430,-7936,-6317,-4687,-2554,-329,1893,3151,3944,4291,3643,3349,3661,3715,3363,3020,2829,2562,1903,2669,2833,3654, +2963,2863,1893,2055,964,684,-688,-2898,-5367,-8217,-9665,-11863,-13621,-15279,-15280,-14052,-11476,-7711,-4831,-2387,-603,279,1523,3045,3903, +4043,4447,4696,4172,3572,3465,2967,1724,1724,2367,4739,2673,2103,2036,1696,-182,-313,-2246,-5313,-7662,-9173,-11637,-15129,-13940,-12839, +-11536,-10478,-8700,-6647,-4447,-2418,-892,1227,2500,2984,3705,3559,3336,3242,1900,1692,1958,2049,1939,3412,3277,769,2348,2495,822, +1285,-249,-896,-3284,-5724,-6106,-8665,-11071,-12076,-11399,-9897,-7003,-4956,-2908,-1374,-228,629,1378,1334,1505,1844,2128,1661,577,841, +404,948,997,1103,1214,2274,1879,654,662,408,202,-749,-1242,-2222,-3415,-6208,-5963,-6810,-8553,-9283,-9128,-8172,-6422,-4940,-3406, +-1833,-689,103,777,297,72,-106,-518,-528,-940,-1383,-808,-720,-519,94,864,560,287,-342,-237,-57,93,-706,-1615,-2723, +-3786,-5708,-5925,-5776,-6662,-7196,-6723,-6440,-6392,-5836,-5334,-4799,-4716,-4521,-4237,-4166,-4156,-4142,-3883,-3225,-3227,-3141,-2599,-2106,-1540, +-1271,-888,-938,-814,-1136,-922,-1343,-1173,-2211,-2822,-3884,-4521,-5684,-3919,-3899,-4214,-4384,-4687,-4955,-5228,-5206,-5257,-5255,-5306,-5357, +-5515,-5180,-4864,-4513,-4215,-3761,-3695,-4947,-3345,-3244,-3036,-2831,-2013,-2013,-2272,-2533,-2224,-1863,-2224,-2622,-3413,-3731,-3363,-4718,-2617, +-3222,-3222,-3265,-3374,-3452,-3569,-3596,-3649,-3708,-3734,-3748,-3824,-3610,-3474,-3319,-3217,-3145,-2535,-4622,-5299,-5892,-3753,-4891,-5436,-5505, +-5377,-5258,-5413,-5510,-5394,-4909,-3652,-5990,-5496,-3112,-526,328,-829,-447,-557,-545,-812,-937,-1085,-956,-862,-735,-644,-590,-573, +-583,-587,-592,-606,-491,-813,310,914,2151,40,902,2024,2119,2123,1965,2058,2054,1997,931,-23,1965,983,1287,-586,-390, +-453,-511,-1214,-1653,-2023,-1920,-1665,-1224,-879,-674,-649,-661,-689,-727,-728,-725,-530,1193,165,293,432,711,336,516,626, +945,588,336,603,334,624,655,86,473,-642,-406,-477,-600,-2064,-2769,-3513,-3209,-2630,-1862,-1262,-917,-902,-906,-965,-975, +-945,-992,-196,425,639,437,517,1099,666,1703,1190,2020,1401,1796,1474,1020,862,1005,579,1368,-60,447,497,182,-2276, +-3899,-5092,-4940,-3896,-2352,-1231,-611,-581,-736,-810,-864,-986,-985,-105,1135,642,1637,1254,1314,1067,1982,2507,2410,1995,1761, +1807,1119,1134,1528,1451,-4513,-5744,-4938,-4801,-4197,-2921,-1954,-1748,-2709,-3701,-3716,-3842,-3580,-2912,-2621,-2437,-2658,-1514,-1322,-704, +965,390,1158,1328,1872,1813,2351,2313,2141,2058,1686,1222,473,-249,-1671,-3239,-4445,-4600,-3871,-3028,-549,-1189,-913,145,829, +1302,1372,1534,1201,405,387,260,-95,-179,-756,-465,469,898,1274,1336,1742,1853,2605,2793,2547,1424,560,-286,-662,-1449, +-2180,-3176,-3170,-3058,-882,-20,1529,3212,5223,7524,8168,8357,7676,7019,6176,5229,5177,4323,2929,899,-531,-695,-1073,-1246,-375, +197,917,814,2791,2928,1099,1835,1493,175,-68,-454,-1396,-1921,-645,464,2427,3338,3548,3962,5190,7677,8659,9521,9474,8914, +7950,6850,5003,3451,2447,1166,54,-507,97,16,57,233,519,301,2436,2850,557,2277,1730,63,26,-108,-679,-713,2112, +3069,4381,4794,3915,3402,3247,3508,3970,4463,4727,5000,4869,4351,4036,3205,1947,699,37,455,1026,885,1232,1319,1541,1823, +2025,2238,2478,2337,2023,1733,1437,914,799,1280,3044,3181,3498,3738,3443,3100,2699,2252,1929,1666,1358,1008,806,684,906, +1043,1328,1640,1646,2129,2719,2422,2518,2691,2570,2247,2204,2096,2365,1891,1536,1128,1708,2178,2348,2738,2856,3019,2999,3260, +3500,3243,3054,2940,2761,2628,2545,2669,2730,2697,2994,3321,3654,3833,3807,3951,3872,3760,3593,3135,2797,2476,2344,2205,2166, +1835,1785,1430,1794,1933,2348,2563,3798,3411,3322,3482,3543,3684,3834,3968,4045,4116,4146,4207,4282,4382,4398,4380,4335,4302, +4207,4405,4360,3831,3798,3616,3458,3184,3036,3129,3163,2944,2632,2759,2877,3198,3292,3138,4076,3020,3238,3276,3293,3347,3379, +3423,3470,3530,3600,3646,3686,3745,3669,3627,3585,3586,3541,3387,4343,4538,4269,3923,4307,4169,4193,4113,4025,4096,4136,4041, +4071,3596,4103,4297,3611,575,-257,737,481,552,444,591,675,889,702,645,591,605,614,658,629,605,551,538,438, +723,-307,-819,-1762,-31,-708,-1459,-1470,-1409,-1331,-1333,-1362,-1435,-657,167,-1479,-774,-942,346,410,290,62,397,686,1290, +939,794,614,618,667,804,787,717,578,504,483,352,-1003,-87,-113,-209,-234,441,457,491,136,670,768,125,268, +-67,-13,366,-300,-104,414,270,-53,879,1394,2674,1641,1162,759,759,849,1131,1031,912,599,440,388,-116,-481,-501, +-366,-361,-341,619,232,689,103,871,520,-35,67,77,87,10,-440,-607,-287,-840,-1483,-214,1003,3042,1786,866,91, +89,387,1018,1093,893,469,384,277,-169,-628,-242,-588,-225,191,747,1128,1575,1398,1715,1610,705,755,645,659,286, +-209,1259,1672,2618,4618,5149,5247,5068,5080,5287,4858,4814,4224,3246,2520,1934,1386,325,-5,-386,-1074,-252,-76,242,734, +1388,1819,1744,1054,1103,631,-162,-190,-461,-397,-311,-400,92,751,258,-193,694,1675,2185,2808,3433,4083,4184,4149,4233, +2543,996,-653,-922,-548,-69,-435,-325,-9,361,945,1025,1914,2115,1167,900,515,311,338,450,114,209,325,355,-315, +-590,266,-2168,-2946,-3164,-2926,-2688,-2416,-1979,-1319,-249,-671,-820,-1174,-1088,-1075,-838,-781,-637,-932,-737,-567,-765,1275,1914, +-818,2288,1940,-262,198,372,198,402,-531,-1310,-1845,-2073,-1157,-3591,-5076,-6746,-6644,-6616,-6442,-5982,-5662,-5349,-4673,-3855,-3062, +-2579,-2035,-1242,-1277,-1184,-793,-526,128,665,1063,1133,-893,1113,1283,784,727,189,75,-74,-2041,-3011,-2642,-2333,-1854,-3170, +-4083,-5005,-5009,-5210,-5497,-5814,-5786,-5405,-4915,-4048,-3073,-2449,-1805,-1549,-1173,-990,-757,-612,-563,-334,-180,-67,400,889,770, +175,-49,-268,-537,-1612,-1680,-1886,-1791,-2101,-2638,-3038,-3242,-3236,-3151,-3016,-2736,-2564,-2491,-2475,-2596,-2608,-2785,-2778,-2657,-2383, +-2306,-2137,-1629,-1476,-960,-284,225,483,-253,273,324,145,-751,-1400,-1394,-1831,-1450,-1641,-2105,-2650,-3152,-3086,-3116,-3196,-3124, +-3073,-3045,-2951,-2790,-2490,-2629,-2762,-2950,-2978,-3162,-2969,-2267,-2120,-1893,-1519,-910,-1040,-512,-737,-113,-217,-104,12,-249,-420, +-736,-1125,-2390,-2903,-2816,-2881,-2926,-3029,-3136,-3241,-3275,-3307,-3323,-3339,-3387,-3412,-3428,-3392,-3351,-3269,-3191,-3272,-2062,-2484,-2470, +-2313,-2020,-2068,-2037,-2168,-2052,-2166,-1994,-1977,-2133,-2240,-2386,-2543,-2810,-2670,-2642,-2705,-2713,-2758,-2788,-2826,-2860,-2901,-2944,-2984, +-3014,-3057,-2985,-2940,-2899,-2901,-2806,-2956,-2926,-2710,-1726,-2790,-2589,-1798,-1845,-1838,-1902,-1907,-1970,-1960,-2515,-2680,-1940,-2638,-2962, +405,1112,248,534,515,662,452,394,389,366,345,321,275,237,181,181,182,204,225,302,24,982,1420,2130,795, +1432,2177,2118,2063,1907,2092,2101,1932,1393,688,2030,1513,1608,537,586,770,1136,733,624,564,544,464,360,209,56, +-105,-137,-107,-44,46,43,94,1313,554,663,744,947,951,790,826,940,852,636,589,674,894,779,467,1235,1221, +1114,1397,2045,966,635,348,453,457,333,46,-244,-550,-628,-625,-505,-317,-316,-47,437,476,468,463,852,1192,1133, +718,912,988,1175,344,723,722,702,831,766,918,1002,1637,2752,1440,968,555,897,885,691,180,-381,-965,-1113,-1022, +-863,-674,-640,-540,121,-263,153,-253,25,845,854,1063,529,1346,961,-239,225,295,-6,221,3175,2627,2816,2521,1848, +1533,846,-874,-969,-1291,-1233,-1646,-1912,-2101,-2222,-2324,-2264,-1564,-1270,-731,304,-115,218,215,650,1413,1014,1017,924,939, +947,1159,1321,1600,2112,3006,135,159,-1183,-746,932,1326,1268,144,-220,-1400,-2314,-3452,-4561,-5841,-5741,-4946,-3330,-2843,-2492, +-1771,-773,-369,-132,-96,265,1235,1157,1508,1164,2017,2107,1791,1091,700,639,300,299,227,-179,80,195,1505,997,-1406, +-843,-657,-96,-252,-687,-1567,-1937,-2099,-1753,-1352,-954,-672,-63,259,829,693,1154,2455,1587,1388,154,1635,1327,827,837, +622,738,670,531,1156,258,345,1386,3039,3507,2580,1856,997,1067,215,-22,0,-53,-235,-475,-830,-844,-806,-672,-81, +141,52,380,1193,473,292,-261,709,1027,1605,761,538,542,591,1007,1451,820,978,2295,2923,2840,1927,1077,773,1189, +902,735,402,182,-148,-186,40,325,527,42,226,-90,376,844,1226,728,630,-87,559,783,1234,932,770,670,1244, +120,244,950,1739,2521,2074,1726,1257,489,-180,-683,-749,-732,-773,-467,-141,548,971,1256,883,806,1259,1017,925,616, +469,299,304,919,689,717,698,959,990,439,409,1450,1606,1752,1931,2168,1723,1379,1042,946,844,670,565,385,55, +439,726,1057,1252,1790,1782,1006,976,870,960,703,1256,810,1316,829,949,682,685,630,619,605,1072,887,1737,1570, +1494,1431,1388,1373,1304,1306,1267,1246,1200,1187,1104,1238,1307,1407,1450,1503,1635,345,1178,1242,1236,1004,1271,1314,1414, +1245,1505,1523,1411,1485,1366,1369,1574,1376,1629,1440,1454,1401,1391,1371,1353,1382,1405,1429,1445,1460,1463,1467,1465,1468, +1504,1451,1727,1344,1051,86,1438,1091,265,295,331,455,440,491,567,1187,1549,424,1121,1561,-944,-1295,-927,-1085,-1119, +-1175,-1060,-1037,-1130,-995,-953,-908,-929,-924,-937,-846,-796,-719,-770,-801,-617,-1159,-1351,-1572,-939,-1183,-1331,-1414,-1417,-1368, +-1425,-1468,-1493,-1291,-1007,-1555,-1418,-1609,-1518,-1676,-1767,-1829,-1518,-1466,-1700,-1352,-1233,-1138,-1206,-1192,-1186,-935,-776,-571,-706, +-680,-663,-1346,-864,-899,-687,-636,-353,-501,-587,-647,-604,-561,-798,-851,-1047,-1111,-1102,-1422,-1803,-2337,-2551,-2873,-2291,-2135, +-2576,-1795,-1643,-1421,-1474,-1429,-1429,-898,-597,-228,-501,-443,-522,-876,-763,-565,-139,11,514,-36,22,-150,-6,-249,-427, +-524,-759,-911,-1138,-1888,-2847,-3697,-3929,-4168,-3072,-2869,-3557,-2409,-2062,-1907,-2040,-1987,-1901,-1016,-452,138,-247,-281,-361,-972, +-499,-602,16,407,1160,742,615,542,763,362,-297,-423,-658,-953,-1353,2004,2323,1645,758,-1163,-2057,-2620,-1916,-2089,-1734, +-980,-875,-676,-841,-603,-512,-102,-407,-159,-398,-1007,-288,-513,85,277,1000,237,437,1177,1054,1199,1283,849,810,1156, +1584,1369,1766,2671,2638,1056,3268,3464,3226,1152,326,298,75,271,459,991,818,338,260,486,47,-355,-234,-172,345, +622,1723,985,813,464,1678,1645,1070,1561,1784,1456,1463,997,1007,649,-274,-2155,-1193,-184,2121,676,269,231,119,137, +78,209,124,-173,429,689,307,192,140,3,-88,407,2822,-33,-595,47,693,1158,2645,557,99,839,818,528,199, +323,-335,-2774,-2017,-2175,-1842,-2856,-3171,-3252,-1908,-656,353,829,941,690,985,1149,1098,889,755,807,778,1085,2577,705, +207,627,-4,351,1648,708,421,375,349,-52,-399,-904,-1649,-3283,-1874,-1540,-1574,-1953,-2490,-3132,-2746,-2157,-1245,-488,124, +429,516,520,580,650,692,852,671,487,547,810,740,646,486,395,393,348,422,305,18,-200,-567,-1610,-2180,-2151, +-1345,-1045,-1153,-903,-724,-506,-450,-275,5,491,588,67,-259,-346,174,323,122,274,429,561,501,598,682,435,850, +878,745,657,520,577,248,-1045,-1421,-1180,-995,-919,-857,-734,-614,-477,-399,-297,-147,45,279,94,-6,-72,-203,-640, +-645,71,106,265,332,619,481,659,253,528,167,160,-54,-138,-278,-362,-732,503,-80,-147,-289,-383,-466,-560,-655, +-622,-559,-496,-419,-371,-259,-320,-345,-391,-385,-372,-415,511,107,199,250,472,416,382,352,482,366,397,534,406, +417,374,163,-184,-253,-204,-245,-258,-285,-308,-349,-331,-337,-343,-347,-346,-337,-326,-312,-305,-314,-269,-431,-222,-55, +448,-159,20,449,436,424,345,368,334,293,-51,-218,286,-54,-204,209,300,82,136,147,151,137,135,115,171, +164,83,130,133,132,139,150,156,184,207,116,422,528,572,422,570,654,612,583,553,575,582,614,515,353, +492,394,88,72,139,186,154,61,21,-15,152,173,-21,122,143,130,116,127,129,227,216,219,542,338,354, +518,599,540,446,404,444,325,320,506,476,471,376,131,-385,-287,-6,-11,-15,-149,-173,-328,86,105,-304,-57, +-56,-74,-73,-30,57,214,243,307,485,481,361,720,860,759,710,520,574,423,521,665,572,381,240,-114,-842, +-638,-51,131,89,-34,-334,-631,15,305,-264,157,152,19,-135,-91,42,274,233,280,458,338,316,740,969,1257, +799,501,503,554,488,656,743,534,377,-282,-361,-434,-346,-964,-1434,-2525,-2042,-58,-1046,-1526,-2124,-1652,-1244,-725,-237, +-151,-704,115,383,916,889,496,590,696,749,1137,802,764,941,1101,963,332,-218,-476,-467,-617,2782,2474,3118,3060, +2967,-501,-1876,-817,-1235,-1251,-2089,-2099,-2062,-1763,-1370,-913,-666,-407,-631,-195,386,397,281,541,625,1306,649,479,427, +1033,1135,1733,1555,1718,2323,2525,-79,-284,464,313,-234,-498,-68,1046,1304,965,-402,-802,-1413,-1997,-2219,-2338,-2350,-1846, +-1293,-622,-71,217,647,822,1182,2515,873,81,427,81,733,2570,1124,552,-318,-350,200,132,261,561,1093,-270,-431, +463,1140,2155,2910,2749,2283,1684,1292,984,490,683,457,136,399,311,334,784,751,1142,374,147,1021,416,476,870, +575,753,485,384,308,487,555,451,437,-538,-230,1273,1313,1646,2075,1837,1543,1097,865,541,-68,278,74,-280,-127, +-211,-77,284,506,689,610,427,188,345,684,1189,705,417,358,343,827,814,975,781,115,189,362,1094,777,828, +864,1039,937,646,131,-19,244,520,615,439,309,419,456,503,553,599,411,386,426,301,276,477,319,423,545, +715,742,823,610,362,157,537,777,1103,764,522,213,158,97,76,49,-35,-146,44,451,521,166,385,433,429, +356,455,386,475,353,645,800,1015,1000,987,987,883,192,404,555,760,899,1017,1105,1263,1103,994,850,697,524, +319,395,467,523,543,548,580,68,358,345,379,330,412,336,313,228,168,20,-35,-14,60,130,226,835,784, +826,877,931,974,1016,1092,1021,986,952,909,874,806,832,828,840,850,830,929,849,775,529,855,788,658,640, +626,627,613,623,585,714,767,599,765,1092,-622,-730,-588,-630,-680,-806,-771,-783,-880,-688,-638,-666,-643,-607,-507, +-545,-541,-546,-522,-523,-476,-670,-706,-687,-547,-626,-656,-631,-624,-630,-671,-671,-607,-626,-569,-639,-730,-692,-641,-668, +-839,-1199,-1212,-1263,-1453,-983,-839,-924,-899,-808,-526,-589,-570,-573,-498,-452,-450,-657,-504,-428,-288,-244,-333,-250,-313, +-397,-420,-367,-242,-276,-320,-310,-545,-750,-798,-899,-1126,-1819,-1746,-1819,-2210,-1371,-1091,-1207,-1109,-927,-376,-516,-436,-473, +-322,-284,-295,-478,-377,-171,105,143,-56,169,137,13,-122,-139,126,31,-33,-66,-627,-389,-446,-546,-1096,-2328,-2427, +-2527,-3014,-1862,-1448,-1632,-1607,-1227,-368,-477,-441,-464,-175,-16,49,-168,-26,106,652,910,810,849,617,561,308,307, +696,770,634,665,-85,-1999,-1182,-2006,-1862,-1166,-1792,-1967,-2604,-1610,-1207,-1061,-995,-1013,-764,-646,-206,160,-109,-281,-482, +-565,-281,-24,547,536,210,877,942,408,968,611,-390,-68,-281,-934,-1915,2287,2355,1474,383,-346,-2054,-2838,-3890,-1336, +-255,-343,32,169,483,-66,-386,-742,-454,-221,-631,-839,-440,-198,592,848,904,450,-4,146,192,620,1652,606,500, +1154,1781,-783,57,448,1882,4747,3596,3184,2166,1637,881,79,-534,-904,-706,-700,-434,-219,-632,-811,-595,-550,-340,-781, +949,853,-718,115,-103,121,-373,189,1208,1800,1889,284,-378,378,387,231,-259,-227,-627,146,1558,2658,2819,1571,1249, +557,33,-743,-900,-519,-686,-595,-303,-377,-106,-14,1145,1129,199,699,557,638,900,981,288,421,434,275,462,154, +125,289,328,328,-175,-292,-325,-4,108,-391,322,618,1028,592,458,460,-162,-259,-158,4,202,156,76,124,339, +131,72,316,181,338,440,818,790,296,184,11,52,29,-119,-215,-798,-824,-610,214,324,-267,-372,-292,84,398, +349,-147,-87,-151,-160,48,-39,40,118,239,479,411,296,79,155,186,207,137,43,-125,4,163,144,-33,-173, +-286,-329,-412,-636,-396,-126,271,62,-169,-449,-304,-87,128,156,2,126,373,250,218,129,126,-34,219,318,576, +405,325,200,187,238,244,179,-121,-266,-232,-221,-231,-236,-224,-219,-40,52,182,295,485,643,598,507,447,393, +373,321,505,186,112,70,31,-139,-153,-222,-208,-253,-193,-239,-173,-196,-233,-251,-346,-474,-441,-454,-449,-458,-464, +-496,-450,-413,-383,-318,-274,-197,-238,-242,-259,-269,-267,-344,-203,-97,177,-343,-205,26,12,0,-28,-28,-50,-36, +-200,-356,12,-227,-657,174,110,123,170,211,227,208,184,187,116,128,238,187,176,133,140,131,108,143,143, +98,183,202,164,232,218,115,155,150,108,123,133,189,180,145,108,96,-77,166,272,340,330,307,267,294, +54,90,420,331,276,125,121,102,50,138,132,53,165,204,316,313,289,169,242,233,145,153,177,298,172, +102,105,-52,-365,-92,221,384,500,601,424,492,-113,-24,605,390,337,64,55,-10,-117,67,64,-99,104,188, +392,394,361,93,321,239,109,82,120,429,91,-46,-32,-324,-520,91,453,628,754,765,731,866,-104,-48,1044, +775,557,61,19,-40,-229,35,33,-209,100,230,525,675,615,202,694,635,265,215,229,691,269,28,104,-526, +-1385,-1488,-1901,-1445,-565,321,71,-1120,-816,-689,64,-108,16,51,-362,-556,-451,-323,-338,-332,-129,-148,-45,285,499, +340,632,673,307,649,215,-274,-330,-427,-795,-1119,220,-146,-1515,-2080,-2923,-1651,-1226,-2017,-2050,-2057,-855,-1314,-1480,-1488, +-1535,-1000,-70,-311,-238,238,232,376,503,781,752,427,281,-23,168,-113,355,847,644,124,-753,-158,1073,2037,3000, +3336,2579,2822,1013,-2331,-1470,-1309,-805,-975,-796,-364,-620,-622,-390,-513,-579,-530,-513,-139,102,1347,1153,-487,323,137, +137,46,277,-233,1505,2224,1916,1399,103,58,195,420,510,1534,1668,273,1097,501,-217,-1545,-2359,-2564,-2373,-2085,-1648, +-1309,-992,-630,-230,112,15,655,614,-285,456,459,155,670,977,829,915,616,43,114,497,525,503,725,1165,902, +307,-847,334,1075,2045,1676,1434,982,837,577,541,529,546,540,372,440,368,799,856,489,218,103,3,201,226, +234,619,783,633,625,470,608,891,1082,1065,765,389,-260,-432,-342,394,53,-278,-756,-1021,-823,-135,-46,95,32, +-147,31,124,261,297,284,388,408,496,628,739,708,699,578,416,396,573,690,635,587,559,326,128,-57,94, +171,248,402,599,761,710,558,382,332,450,359,228,390,502,495,412,488,353,434,300,307,216,229,274,311, +322,460,118,241,122,27,-49,-129,-182,-290,-278,-284,-289,-261,-258,-216,-185,-102,-27,37,55,122,75,182,184, +164,180,264,328,372,378,499,576,603,516,407,367,359,105,244,182,170,138,117,91,60,74,83,97,93, +94,91,108,114,124,133,142,194,80,-18,-222,157,17,-228,-192,-161,-115,-112,-97,-58,92,238,-147,22,244, +-168,-197,-190,-217,-225,-189,-179,-180,-201,-256,-254,-183,-172,-163,-181,-175,-160,-103,-142,-137,-67,-120,-119,-80,-104, +-120,-118,-139,-149,-158,-157,-142,-81,-152,-170,-198,-196,-302,-360,-403,-356,-232,-180,-220,-335,-532,-529,-320,-255,-211, +-245,-227,-195,-34,-144,-92,20,-57,54,65,39,5,11,-83,-118,-124,-120,-72,45,-58,-155,-317,-319,-280,-346, +-601,-579,-352,-316,-280,-400,-764,-799,-416,-348,-240,-306,-266,-198,101,-120,-32,117,99,249,352,265,202,298,73, +-37,-36,-56,34,325,51,-121,-370,-300,-574,-547,-741,-583,-196,-182,-294,-595,-1272,-1273,-630,-434,-330,-313,-285,-186, +255,-77,81,294,146,400,528,507,364,333,369,419,141,123,167,648,227,-86,-545,-656,-159,-843,-1342,-1562,-1989, +-1055,-573,-346,-453,-766,-1556,-948,-706,-741,-533,-373,47,-148,-171,-405,-249,232,527,285,387,886,524,303,222,285, +54,88,-400,-516,-351,-4,-1423,-1344,-1838,-1440,-485,250,281,431,-1469,-1732,-900,-166,222,-47,214,-31,-241,-142,-77, +-220,-195,-88,227,755,692,-210,-53,-26,111,-144,-4,-285,643,570,-264,-1009,2888,3440,2746,1791,477,-1109,-1511,-319, +-1895,-1821,-527,-353,-398,-1297,-1114,-1005,-583,-267,-100,-239,-220,101,772,340,199,-72,83,50,32,128,284,-129,761, +1396,2565,2597,57,12,-255,509,1844,2648,2328,1600,-859,-1696,-937,-1014,-685,-909,-831,-966,-888,-863,-590,-287,-159,143, +811,337,234,126,83,151,142,-14,242,941,1133,1060,746,432,568,579,372,16,-345,-45,304,1227,551,637,1213, +823,474,-135,-271,-239,25,48,75,213,242,258,514,744,759,425,533,611,935,652,480,360,508,654,726,652, +-70,-310,-485,-344,78,311,314,239,-261,-346,-195,443,974,1239,1278,1053,721,545,430,423,545,619,636,420,299, +308,426,523,617,658,699,585,722,622,434,143,206,110,265,409,504,415,406,441,340,209,-19,85,151,297, +335,448,570,580,490,546,550,283,98,337,566,734,597,445,349,326,338,351,257,192,148,183,447,458,413, +345,317,297,254,203,133,98,61,19,-41,-105,-101,-115,-129,-116,-89,-78,69,201,312,398,452,549,549,587, +604,611,609,629,594,573,518,487,381,401,372,357,333,314,303,298,298,290,282,258,237,203,220,230,237, +239,244,219,266,312,380,355,411,473,457,452,446,443,436,434,402,387,419,401,367,86,46,76,-19,-18, +42,40,71,172,75,59,93,34,26,35,71,83,75,84,99,118,157,161,130,145,134,131,67,46,33, +66,86,119,115,103,-5,46,-147,15,-172,-165,32,59,146,351,128,57,133,3,-26,-22,60,91,64,105, +143,232,319,310,282,256,217,231,81,29,21,73,134,205,194,105,-160,-80,-249,-76,-495,-562,-178,-139,22, +562,135,13,175,-178,-218,-144,36,93,54,102,185,373,513,515,435,407,366,382,81,-52,-58,31,179,317, +259,108,-293,-114,-596,-209,-768,-808,-80,4,292,940,245,-43,281,-85,-227,-203,-8,80,31,168,269,561,825, +843,771,572,475,716,316,169,-28,66,235,521,400,144,-672,-577,449,-1301,-1067,-1320,-1521,-998,-584,-415,926,933, +-500,-871,-1002,-600,-29,25,-454,-250,-74,222,246,266,424,347,398,607,198,28,191,-26,-125,204,-137,-226,-347, +690,-1445,-1562,-566,220,391,51,-60,248,-372,-891,-1802,-1158,-857,-394,-429,-258,130,20,-38,34,389,554,845,484, +403,198,-22,19,64,-65,-41,-289,151,142,204,-980,2134,801,-403,-1825,-3595,-3187,-2555,-1237,-1342,-1255,-1957,-1078,-581, +-133,152,49,-271,-203,-79,-120,84,449,1355,-47,-370,122,-165,123,36,-49,-23,-32,-7,300,1722,1847,977,1440, +2601,2971,2645,1654,485,-441,-1480,-1519,-1471,-223,106,-82,-295,-409,-437,-547,-590,-410,-383,-87,879,154,122,404,4, +-1,48,-13,115,620,931,1181,1414,996,478,400,245,234,222,1079,1880,2401,1834,929,-520,-795,-949,-696,-816,-843, +-936,-617,-374,-218,13,272,602,368,275,197,501,636,719,740,771,791,580,536,718,539,387,409,459,390,260, +333,412,711,917,1061,1052,1068,1070,1302,1217,1170,965,752,600,513,448,388,330,537,596,451,327,282,272,169, +223,475,567,662,757,602,191,77,61,18,33,149,266,348,303,226,142,-16,-146,-271,-286,-303,-302,-274,-213, +-233,-135,39,179,194,253,333,363,322,350,417,466,506,443,387,368,286,509,506,485,480,437,390,329,289, +285,314,358,386,409,412,402,380,356,316,282,237,220,261,297,318,349,382,367,375,378,359,336,357,371, +417,461,460,444,466,444,427,422,417,416,408,410,395,375,367,366,376,363,356,353,353,352,361,333,321, +293,378,360,374,374,376,371,374,379,362,378,405,376,414,531,-66,-55,-39,-106,-124,-91,-128,-120,-98,-73, +-62,-71,-55,-65,-105,-84,-83,-87,-77,-61,-34,-36,-19,19,-2,-16,-32,-62,-72,-77,-43,-22,-10,-10,-14, +-82,-53,-38,-35,-174,-213,-131,-252,-260,-225,-155,-130,-172,-101,-104,-189,-123,-119,-127,-117,-73,15,63,101,122, +138,90,-3,-67,-107,-99,-21,44,72,140,89,-153,-33,5,53,-289,-360,-209,-489,-436,-363,-171,-94,-183,-32, +-101,-323,-200,-182,-178,-148,-69,142,193,272,326,362,301,114,-78,-166,-143,18,176,202,317,234,-177,26,68, +220,-185,-291,-103,-559,-660,-634,-386,-311,-491,-168,-166,-464,-236,-223,-220,-218,-57,315,448,597,632,562,466,468, +148,-30,-69,64,325,466,522,377,-389,-54,-74,-1410,-1141,-1320,-1551,-1287,-842,-357,188,479,387,93,-207,-650,-396, +-166,85,34,101,168,272,325,273,603,616,394,59,-103,50,-306,-216,327,245,190,-62,467,-823,-866,123,323, +462,2,-301,-583,143,170,-245,-758,-833,-601,7,230,2,49,81,-8,104,317,782,43,-168,-26,-8,18,-211, +-238,-306,-487,-503,-171,457,-404,-508,-2198,-3534,-3622,-2578,-1610,-660,-743,144,29,-452,-671,-613,-19,17,179,131,182, +169,192,428,448,577,10,-153,52,-170,5,-74,55,55,105,-248,-456,-280,-150,2459,3065,3366,2723,1482,-437,-1249, +-1173,-219,-220,-907,-1452,-1347,-329,-55,176,-140,22,0,-173,118,307,447,189,129,170,-10,18,-35,165,295,317, +815,1330,1835,2008,392,268,323,801,1813,2048,1967,1378,428,-488,-1085,-1718,-1859,-1430,-1095,-712,-525,-354,-273,-152,119, +247,526,149,72,178,492,609,437,595,706,868,727,673,799,588,831,686,602,440,234,198,492,1076,1408,1586, +1560,1226,800,180,175,21,-173,-8,87,199,283,279,503,474,531,494,364,207,90,163,216,335,376,508,669, +806,343,291,204,107,33,123,108,42,137,270,453,440,485,490,578,633,698,668,621,538,536,623,660,525, +373,291,367,515,570,611,616,626,605,593,590,465,303,282,328,367,386,398,437,487,486,443,398,345,295, +234,259,286,335,372,460,518,340,341,304,327,310,285,266,231,208,199,191,197,221,239,241,246,326,234, +260,270,289,300,306,316,283,269,257,256,254,237,280,305,327,356,366,418,404,423,440,345,375,422,421, +422,427,426,426,423,370,300,426,364,301,113,88,93,89,93,99,76,73,105,55,61,85,137,142,94, +97,86,65,88,92,81,94,101,97,143,107,32,20,13,5,58,77,58,121,129,-6,74,147,143,115, +111,159,141,134,208,34,27,89,219,237,90,89,52,8,60,68,47,100,166,245,251,203,75,42,18, +-2,140,194,139,234,188,-11,163,109,26,56,71,102,49,13,162,-176,-123,17,321,357,47,69,1,-104, +20,46,14,154,239,387,419,333,30,-47,-96,-154,153,265,138,356,314,-195,132,461,239,111,114,298,350, +334,483,-100,-176,-34,409,518,17,37,-63,-231,-44,-26,-49,225,385,540,679,602,250,34,-171,-213,172,482, +355,593,375,-299,317,-1261,-930,-348,-222,-380,-843,-974,-541,-722,-220,733,409,238,-13,-174,-219,-163,-114,46,361, +358,401,403,616,533,200,38,-134,-158,-335,-230,7,282,388,314,-679,180,-70,-350,-435,-29,373,545,316,333, +210,263,-259,-443,-600,-565,-452,-381,-257,-105,143,437,443,251,-19,-78,-16,63,50,-270,-222,-275,-320,-495,-584, +-425,76,-1821,-2185,-1363,-814,-159,-650,-1137,-1083,-875,-544,-200,-495,-661,-935,-634,-455,-385,-332,-182,-32,383,273,-264, +-111,28,-84,-50,-18,-99,66,-60,-134,-129,-349,-765,-1253,2479,1748,779,-335,-1265,-1684,-1465,-770,-904,-920,-759,-632, +-675,-1045,-625,-408,-90,-56,22,-149,497,486,-106,0,-60,-140,-8,37,-60,25,150,36,545,1000,1712,2125,1258, +1640,2226,2360,2203,1431,298,-1058,-1286,-1264,-1188,-463,-341,-885,-798,-953,-968,-973,-784,-545,-120,1,31,57,154,442, +152,68,156,415,590,664,756,856,912,1158,479,497,522,615,801,1178,1417,1374,1237,813,221,-71,-349,-587,-745, +-683,-429,-373,-267,-129,119,318,475,451,362,252,292,389,509,545,530,473,448,441,412,512,621,651,608,550, +442,480,492,546,665,869,1120,1095,1060,1035,953,861,766,712,680,629,547,478,418,431,480,466,521,498,514, +448,437,396,490,591,685,632,187,229,229,234,252,273,301,314,369,376,396,417,473,529,571,615,645,685, +697,746,733,665,599,513,434,363,330,300,285,272,264,229,230,203,214,232,149,214,213,224,230,223,215, +200,221,245,268,305,330,356,344,340,340,337,336,340,295,255,214,249,198,131,138,137,129,124,118,115, +137,178,93,120,216,67,52,3,47,58,85,67,58,56,24,11,-30,51,75,104,56,47,53,61,67, +73,93,109,155,95,80,58,60,61,67,93,100,73,92,86,39,66,139,-22,22,57,113,100,88,80, +-36,-101,-184,-10,83,168,47,13,42,52,80,89,121,182,252,177,129,44,19,18,53,115,129,84,128, +111,21,121,32,-156,-20,68,195,134,111,34,-162,-242,-426,-9,133,275,33,-32,19,48,108,90,180,308, +458,309,177,10,-42,-25,-6,156,184,47,221,227,-116,58,374,-135,-36,119,258,289,234,184,-151,-445,-781, +-268,120,395,28,-102,-38,-11,78,66,167,381,619,538,422,103,-65,-196,-161,245,413,181,401,182,-225,311, +-1378,-361,-74,27,-323,-329,-445,-479,-1120,-809,534,386,333,244,-93,-112,136,233,275,260,261,423,768,436,241, +41,89,-16,-201,-281,-184,34,167,348,701,-965,543,-117,-276,-377,-579,-61,-8,-479,-179,-109,-98,-55,-30,-253, +-170,-215,-312,-231,-46,48,288,202,-248,-90,-8,-44,18,-39,-207,-161,-294,-367,-720,-818,-680,315,-893,-326,666, +831,104,18,-318,-1067,-776,-754,-703,-258,-170,-385,-566,-630,-479,-412,-235,-123,257,235,-363,-38,187,35,27,20, +34,31,-128,-112,18,-267,-625,-861,406,-857,-2489,-2742,-2358,-927,-380,-888,-356,-254,-275,-289,-290,-298,-262,-300,-299, +-401,-232,17,215,181,-285,-191,-188,-230,-55,-68,-230,-155,-156,-414,-271,-60,605,664,2106,2570,2296,1643,690,-598, +-1382,-1529,-997,-671,-379,-452,-307,6,-157,-255,-304,-304,-256,-288,-187,-107,-178,62,130,167,70,16,65,282,533, +836,1241,1383,1289,1748,778,842,1140,1417,1747,1942,1679,912,71,-568,-886,-1342,-1421,-1202,-1005,-793,-587,-432,-253,-69, +172,208,54,-46,-17,171,453,615,626,665,664,587,695,754,699,830,719,849,1019,1107,1186,1207,1304,1514,1427, +1350,1282,1116,927,702,582,456,317,347,333,391,462,391,416,430,427,396,346,331,297,299,272,268,370,452, +535,632,523,738,759,784,846,897,924,947,859,810,760,739,730,728,663,601,527,467,383,302,379,420,454, +450,485,537,567,590,595,626,674,638,659,619,616,693,633,750,727,748,747,755,765,790,786,788,783,775, +765,766,727,698,672,631,603,553,523,501,446,580,537,471,466,464,468,462,456,468,574,668,459,568,778, +101,58,37,53,66,65,110,114,90,71,53,33,40,61,130,93,95,105,114,120,126,132,128,124,107, +85,57,58,63,98,76,69,62,75,97,84,73,41,1,11,20,8,133,148,75,30,-36,-70,-94,-33, +162,87,101,133,165,192,189,217,236,230,171,124,74,64,79,151,121,111,98,68,86,169,118,-50,-209, +-126,-81,-76,218,250,82,2,-134,-236,-229,-119,280,95,105,160,219,271,255,355,389,391,262,154,57,20, +87,201,148,99,89,73,122,205,86,32,-237,-217,-196,-244,194,264,46,-8,-296,-491,-577,-303,305,87,89, +176,293,381,333,436,489,601,442,297,89,-56,-102,71,215,228,98,102,58,242,216,-832,-228,-214,16,176, +481,390,148,-483,-415,561,147,63,276,134,112,105,171,213,198,437,547,599,359,174,-30,82,74,-134,-54, +26,72,361,408,411,-683,257,455,343,-178,-1063,-898,-671,-325,-385,-387,-324,-405,-308,-66,-140,-149,-18,76,224, +369,211,134,-15,82,180,91,18,-67,-74,-91,-213,-256,-450,-476,-326,108,49,456,259,206,444,488,325,-60, +-476,-509,-285,-193,-118,-46,41,79,130,-42,24,271,122,128,-9,-5,63,48,11,-5,32,-75,-258,-363,-169, +-307,-562,-254,-1486,-2146,-2410,-2040,-972,-1056,-829,-226,-477,-325,-68,-151,-163,-203,-234,-225,-156,11,160,435,-3,-126, +-101,-57,-13,-26,52,-5,-133,-259,-366,-585,-591,-733,-773,-988,1843,1517,835,31,-1007,-1354,-1184,-613,-645,-637,-686, +-578,-515,-572,-349,-156,-48,-159,-94,127,132,138,-120,25,19,-123,-66,8,167,154,314,480,1198,1539,1499,1652, +1191,1210,1246,1129,925,407,-289,-1025,-1085,-1011,-888,-770,-688,-548,-745,-766,-651,-592,-475,-261,-158,-97,-37,91,221, +407,450,538,698,732,802,874,795,801,913,1100,988,1099,1253,1395,1614,1492,1477,1441,1009,530,53,17,-51,-100, +-99,-102,-152,-122,-100,-87,39,150,261,330,397,458,443,473,450,555,581,671,745,779,803,912,1060,1101,1057, +1020,980,949,902,894,857,894,877,859,808,752,700,645,600,552,496,434,499,522,561,586,629,674,737,792, +824,870,906,928,952,977,1006,1050,918,948,926,917,903,909,911,908,899,877,867,836,817,803,783,765,746, +722,704,671,702,705,696,747,748,727,735,746,767,777,796,814,859,893,859,896,961,147,113,99,105,118, +114,155,155,115,133,112,51,62,75,116,127,139,142,151,159,173,173,165,145,140,125,96,109,121,165, +118,108,128,111,136,195,131,120,103,112,99,58,156,175,80,147,82,-79,-85,-56,73,120,166,174,198, +223,239,260,269,217,185,147,102,117,142,244,152,133,175,85,134,362,203,72,-21,36,72,35,242,264, +28,191,47,-308,-291,-221,38,103,175,200,244,303,343,414,415,323,249,166,86,77,159,365,155,111,236, +66,130,569,208,171,72,119,18,-169,147,202,-79,214,12,-569,-619,-502,-76,82,220,267,318,405,433,536, +567,501,382,236,89,-33,56,384,213,144,228,-52,111,826,373,-430,-288,-78,277,606,535,444,477,16,-138, +-90,27,69,161,40,7,78,206,348,380,651,683,457,346,236,76,142,112,-56,-1,151,376,492,308,-61, +-333,95,1312,352,-323,-528,-1208,-998,140,18,144,208,-27,-172,-180,-185,-119,26,102,184,336,78,59,182,158, +174,76,-31,-85,-27,13,-79,-210,-215,-174,-128,-270,165,-9,-146,-40,-41,537,625,193,94,-56,-191,-277,-174, +58,26,45,134,184,315,704,196,108,263,177,111,83,92,14,11,-142,-237,-271,-237,-406,-638,-2,-1558,-909, +58,85,-746,-620,-582,-611,-160,3,-26,-248,-360,-312,-378,-234,-137,52,165,362,33,-83,-31,-6,68,70,10, +-13,9,-121,-218,-267,-254,-603,-1153,-1431,-6,-1027,-1811,-1718,-1357,-582,-216,-329,-301,-277,-103,-265,-289,-144,-306,-322, +-261,-44,89,207,-61,-37,171,111,49,-77,55,86,-26,-127,-154,-158,138,416,661,276,1675,1611,1293,711,-41, +-881,-1225,-1153,-869,-665,-586,-390,-328,-300,-318,-334,-262,-329,-295,-177,-280,-231,-152,90,301,464,468,491,551,824, +1008,1162,1003,1028,1332,1455,874,871,730,672,673,442,163,-193,-410,-631,-892,-797,-733,-681,-586,-501,-410,-289,-188, +-53,66,136,182,214,241,257,408,533,683,752,834,940,946,954,940,926,912,750,705,656,583,524,499,483, +451,415,364,293,211,146,131,110,77,50,12,-30,161,142,225,317,433,477,533,586,667,702,759,844,830, +844,836,784,755,630,647,629,622,623,614,606,572,545,527,498,474,437,439,434,435,432,441,398,533,605, +723,574,664,789,806,818,826,852,869,892,819,733,896,816,741,183,168,163,158,164,150,187,187,146,176, +160,102,105,106,110,151,169,172,182,193,214,202,192,167,165,157,145,152,161,189,157,154,173,150,161, +242,178,231,215,174,137,102,189,210,109,208,160,-7,-20,-27,5,126,191,204,234,264,315,297,277,214, +192,173,152,172,193,245,199,175,200,120,178,409,288,224,157,167,190,112,280,268,67,254,152,-142,-187, +-193,-136,75,196,216,274,337,433,420,385,242,226,182,125,141,186,320,183,165,262,97,155,587,295,411, +302,225,51,-96,151,259,-35,264,143,-353,-464,-526,-383,-1,221,287,365,461,594,598,547,366,329,266,153, +25,140,485,230,163,271,-51,199,980,600,-356,-7,123,577,1295,647,288,180,362,270,-225,267,300,59,73, +55,78,96,230,475,516,487,387,377,335,149,175,97,-91,26,291,554,576,213,-422,-485,197,1165,-36,-581, +-606,-706,-334,497,207,159,357,299,181,118,-11,-41,-14,121,180,291,202,214,289,214,142,152,32,2,79, +159,63,-77,-145,-113,126,-160,-151,-163,-210,-57,29,298,304,371,249,139,115,-212,-206,54,42,94,110,278, +315,422,187,87,269,243,127,36,121,50,-24,-167,-185,-108,-418,-471,-396,-176,-530,238,201,-11,-267,-530,-543, +-334,-320,-256,-10,-182,-178,68,135,148,74,211,228,167,212,208,172,151,153,162,24,-5,90,60,-42,29, +-134,-420,-689,-828,-1288,-2037,-1783,-1382,-743,-588,-417,-214,-59,-39,-238,-139,-197,-265,-190,-121,-47,158,224,194,45, +47,201,65,49,76,140,89,-124,-339,-436,-426,-668,-592,-273,-744,944,540,-60,-469,-859,-836,-691,-517,-342,-298, +-426,-250,-175,-170,-147,-102,-113,-81,-74,-51,-64,-15,109,160,203,165,248,364,438,661,786,834,811,781,833, +758,791,706,378,168,-138,-421,-761,-1115,-1034,-973,-930,-885,-845,-798,-770,-746,-719,-611,-506,-405,-255,-80,72,194, +322,459,528,555,632,666,758,834,883,969,1064,912,424,237,177,111,62,12,-9,-68,-88,-149,-190,-233,-272, +-324,-250,-183,-123,-68,-13,32,52,-1,-9,25,21,-8,55,130,225,277,318,435,382,382,340,269,151,26, +42,16,-5,-30,-58,-83,-95,-104,-116,-130,-144,-174,-136,-114,-88,-64,-40,-22,67,130,250,44,138,253,285, +304,317,348,374,406,247,127,383,241,-41,168,167,152,167,168,154,163,157,137,147,137,105,110,110,110, +139,152,153,163,173,185,182,179,174,148,147,152,171,176,176,173,171,165,146,141,213,174,257,190,200, +179,141,159,162,126,160,131,28,28,28,42,123,161,166,203,231,283,277,233,209,157,145,134,192,218, +206,216,180,145,111,151,295,248,267,199,253,275,186,212,170,93,151,86,-63,-69,-84,-75,72,164,164, +237,280,397,347,299,237,160,139,86,200,231,235,233,205,174,88,117,389,248,451,289,304,201,54,101, +151,71,156,102,-202,-265,-324,-255,16,144,174,297,412,616,554,439,307,233,214,78,104,217,414,288,194, +147,-42,165,680,529,-125,97,363,727,1200,518,165,69,111,60,-268,502,591,129,122,113,190,119,90,234, +249,231,305,340,369,212,146,61,-99,152,472,595,443,63,-537,-370,400,15,-457,-584,-630,-439,-257,-152,120, +173,-34,302,314,150,105,75,35,256,288,211,318,327,321,254,133,145,68,95,228,178,26,-157,-152,19, +156,363,-77,-111,-221,-175,-143,48,229,516,500,360,155,56,-6,-21,154,246,162,399,369,132,120,94,146, +248,127,78,135,85,10,-97,-66,65,-347,-230,-48,-109,-104,-269,44,154,-8,127,-37,-430,-333,-275,-185,26, +87,17,241,282,244,301,275,162,302,326,285,272,194,162,58,52,149,138,67,215,-128,-254,-248,-154,-947, +-747,-378,-441,-686,-655,-594,-472,-46,87,-103,15,29,-31,-37,20,144,252,261,131,191,174,200,136,134,176, +71,-70,-235,-350,-408,-403,-638,-722,-716,-876,-441,-757,-979,-804,-438,-138,65,209,-183,-343,-263,-249,-216,-193,-95, +-6,151,185,156,11,-25,32,185,168,198,247,274,262,113,119,153,178,281,168,-103,-299,263,71,-160,-350, +-627,-716,-811,-866,-705,-572,-478,-515,-527,-562,-490,-439,-380,-290,-171,-70,-62,-4,39,105,208,265,363,388,512, +464,479,461,439,489,532,343,41,-61,-132,-183,-236,-287,-354,-462,-485,-534,-552,-561,-563,-579,-515,-462,-413,-368, +-339,-288,-159,-164,-128,-90,-55,-41,-24,-10,28,35,55,94,59,29,18,-36,-207,-233,-248,-281,-307,-347,-375, +-401,-399,-402,-409,-417,-425,-442,-416,-399,-379,-358,-332,-330,-271,-241,-178,-239,-196,-149,-143,-135,-139,-124,-118,-102, +-154,-191,-127,-169,-373,139,129,120,144,140,112,126,126,122,117,115,121,115,116,120,129,131,127,128,130, +126,138,143,156,121,123,127,158,162,148,154,148,126,123,115,147,132,174,123,148,137,79,103,108,121, +118,128,136,106,106,113,145,151,135,140,145,160,199,174,194,123,115,113,195,222,171,186,150,87,96, +112,166,155,153,126,225,215,63,118,119,120,97,89,145,86,88,91,144,165,131,151,146,190,217,203, +242,115,109,69,250,274,188,226,183,89,79,77,174,122,234,113,159,119,-77,-13,28,104,103,192,215, +58,24,23,150,165,116,152,187,288,366,304,333,173,135,-15,179,293,292,274,158,21,-1,97,329,283, +-86,239,539,633,777,432,288,294,-121,-235,-225,329,498,235,226,222,245,180,92,6,59,107,234,271,334, +325,104,11,-26,349,583,386,210,-74,-486,-371,607,-931,-497,-363,-412,-335,-458,-851,82,304,-207,186,274,279, +189,132,112,287,316,125,224,244,241,347,228,163,95,163,330,176,20,-150,99,249,-5,866,-211,-215,-85, +-2,190,16,174,392,446,377,146,262,111,-47,-2,84,94,214,188,0,1,-35,-10,104,44,117,103,60, +65,-15,63,135,-90,77,141,-156,131,48,28,58,287,183,39,-180,-282,-332,-485,-106,84,96,126,160,210, +209,174,115,192,178,166,236,169,121,60,42,98,61,-2,5,-56,-33,-35,159,-452,-179,-95,-118,-235,-329, +-290,-146,-130,-140,-166,-56,13,45,149,221,270,217,148,51,195,187,107,118,109,181,-29,-150,-185,-201,-232, +-338,-432,-603,-871,-679,-873,-875,-769,-581,-340,-121,-135,-340,-278,-188,-71,-115,-85,-3,48,119,148,220,223,122, +123,98,64,67,88,169,145,67,-120,-233,-287,-319,-136,-163,-339,-641,-304,-453,-449,-426,-417,-346,-232,-113,-125, +-170,-189,-183,-168,-165,-111,-63,-20,-64,-102,-137,-84,-51,-7,44,95,143,177,187,286,166,108,-4,-81,-129, +-160,-266,-76,-144,-194,-248,-304,-360,-437,-502,-500,-476,-469,-461,-466,-489,-452,-424,-379,-341,-288,-255,-273,-197,-161, +-122,-88,-33,-31,-30,-20,-13,11,45,14,-12,-29,-77,-264,-253,-273,-292,-309,-327,-339,-364,-352,-356,-358,-361, +-359,-358,-340,-328,-320,-305,-294,-267,-295,-296,-303,-250,-258,-254,-250,-239,-238,-223,-221,-210,-227,-231,-251,-254,-357, +99,95,87,98,89,62,74,78,91,82,84,108,82,82,89,95,95,96,87,86,79,96,102,123,86, +100,110,142,145,123,126,118,101,101,91,105,97,83,62,82,71,7,23,40,98,88,104,159,77,61, +79,96,107,107,84,77,76,115,112,132,90,95,107,185,202,139,141,116,71,90,95,100,83,87,97, +143,85,-61,-9,17,116,70,80,215,51,54,87,123,128,123,81,58,60,105,121,163,83,109,109,281, +299,180,203,157,86,101,77,81,65,27,20,54,4,-221,-191,-118,115,102,190,380,81,-15,7,80,125, +112,44,13,28,133,177,307,151,92,4,256,344,182,201,127,13,57,84,157,101,48,322,390,341,401, +448,413,269,-102,-309,-365,-130,174,493,305,239,257,213,178,80,42,71,163,171,239,368,89,15,155,488, +543,167,134,-80,-460,-236,313,-1084,-233,-36,-201,-249,-292,-394,240,419,-25,127,187,281,289,283,288,240,212, +138,152,147,134,346,287,163,184,253,343,109,40,47,173,245,-14,687,-258,-247,190,298,377,73,38,63, +268,357,180,269,128,-63,-137,-67,172,55,-16,-95,-74,-102,-130,-48,13,149,115,75,96,83,122,62,182, +247,46,-192,270,303,202,186,277,177,81,-33,-100,-150,-338,-147,-26,33,3,63,186,153,145,94,48,37, +45,141,119,73,77,59,59,20,-13,-108,-38,13,-17,182,-432,-303,-177,-98,-68,-90,-84,-50,-305,-319,-157, +-113,-42,6,122,162,178,33,6,81,89,72,3,76,61,59,-47,-105,-71,-84,-166,-324,-525,-703,-847,-599, +-550,-512,-430,-439,-441,-578,-605,-492,-289,-163,-153,-111,-72,-43,61,112,225,130,118,150,163,152,67,74,45, +69,-117,-213,-262,-359,-407,-415,-342,-273,-181,-402,-596,-676,-587,-498,-380,-225,-67,61,17,-12,-29,32,76,115, +167,214,277,196,149,58,-4,-11,-30,21,62,126,99,51,55,-40,-95,-186,-296,-421,-522,-579,-164,-221,-226, +-240,-265,-287,-315,-311,-273,-224,-190,-165,-142,-120,-129,-136,-133,-127,-112,-100,-108,-43,-17,-2,22,71,35,10, +-15,-29,-36,-32,-65,-79,-91,-128,-142,-123,-124,-125,-120,-118,-114,-124,-110,-105,-97,-88,-79,-65,-69,-70,-75, +-74,-79,-72,-103,-120,-160,-59,-88,-117,-121,-117,-122,-123,-133,-144,-129,-108,-181,-156,-64,48,66,69,48,33, +10,20,27,46,37,37,60,15,7,6,26,38,52,50,50,43,53,53,60,39,62,87,105,108,90, +89,83,69,70,60,69,65,46,71,34,5,-47,-46,-23,42,42,47,95,-33,-78,-70,-31,14,60,62, +61,44,60,45,28,37,65,107,154,163,115,108,89,55,89,96,68,59,119,173,88,-13,-116,-98,-62, +62,30,24,132,-115,-163,-149,-56,10,88,80,76,49,68,54,11,29,97,164,278,296,198,197,160,90, +140,112,73,99,0,122,44,-58,-237,-305,-215,47,63,92,265,-129,-335,-343,-232,-60,79,78,60,8,47, +61,105,102,109,133,331,385,194,187,155,60,154,173,116,70,402,454,151,36,137,504,508,85,25,-218, +-414,-414,-104,540,372,302,270,222,211,194,184,172,158,114,141,301,81,91,373,500,397,124,58,-107,-272, +162,-569,-819,63,249,-163,-77,-92,-213,142,279,182,81,90,230,303,349,346,167,94,112,55,56,93,223, +243,146,281,340,293,75,94,248,183,213,294,-168,132,158,449,428,314,31,-175,-186,-159,-6,233,146,120, +27,-64,-62,149,-34,-99,-75,-93,-72,-50,-93,28,182,110,83,91,121,102,-20,208,269,156,143,69,169, +173,200,191,271,337,387,121,-4,35,-145,-147,-81,-33,33,178,181,181,128,12,-27,32,22,29,51,126, +130,55,86,53,-110,-96,-79,-150,-28,-406,-210,-209,-106,88,15,-121,-288,-372,-315,-122,-118,-44,20,61,51, +2,-27,-24,50,5,-1,11,37,-1,-100,-55,-56,-57,-94,-208,-344,-503,-598,-539,-496,-295,-290,-284,-358,-470, +-427,-351,-283,-216,-184,-150,-111,-63,0,70,100,43,31,43,115,119,110,82,80,10,-96,-267,-341,-330,-377, +-424,-473,-461,-378,-243,-267,-476,-485,-446,-437,-418,-345,-293,-230,-189,-133,-81,27,120,211,169,148,134,139,134, +138,121,101,87,48,39,31,-6,-119,-157,-179,-143,-143,-230,-326,-404,-438,-283,-330,-285,-241,-194,-156,-109,-56, +-26,3,28,50,69,109,93,88,76,70,69,60,0,12,7,5,-8,-15,-57,-75,-92,-124,-156,-164,-194, +-201,-226,-258,-85,-119,-91,-77,-63,-48,-35,-23,-14,-1,12,26,38,52,46,46,44,41,35,40,23,21, +14,12,12,35,28,22,8,0,-15,-32,-56,-75,-61,-78,10,-2,35,42,5,-16,-30,-32,-25,6,-11, +-14,-1,-35,-47,-60,-39,-22,3,12,16,5,7,4,0,-9,13,51,58,61,47,50,45,23,32,22, +27,33,46,68,-6,-45,-78,-99,-80,1,-18,-17,6,-77,-128,-158,-128,-77,-3,37,47,16,13,-21,-47, +-24,15,88,105,112,85,80,61,13,75,83,26,39,165,233,42,-73,-126,-171,-143,37,-41,-50,-8,-173, +-243,-296,-215,-120,14,81,101,44,24,-18,-84,-42,44,161,229,246,184,187,160,49,148,126,55,124,91, +231,23,-101,-194,-339,-273,33,-30,-16,85,-149,-366,-480,-430,-251,-17,113,140,37,12,-55,-95,-2,95,219, +385,424,236,206,183,73,241,270,87,89,651,501,94,-77,-168,325,347,-155,50,-188,-591,-566,-322,172,251, +266,214,186,173,195,256,242,202,113,73,199,35,157,578,399,208,112,-115,-215,-47,454,-1158,-537,-52,192, +13,152,55,-267,-189,-24,343,91,26,102,236,311,266,90,14,87,38,40,81,86,136,116,322,361,211, +102,130,224,171,279,602,-773,643,689,633,487,336,183,-62,-206,-386,-296,124,10,115,150,110,28,-4,-66, +-102,-58,-48,-18,21,-45,61,169,104,84,71,153,136,31,216,251,284,520,-228,-168,-14,130,206,414,532, +618,298,138,275,-66,-161,-94,53,113,157,164,141,112,17,-18,3,-35,-27,-9,108,156,85,106,60,-50, +-69,-36,-131,-190,-236,-105,-64,-30,13,-54,-205,-428,-261,-167,-70,-3,32,53,14,-3,-23,-1,22,36,10, +4,8,5,-26,-153,-106,-120,-133,-123,-176,-232,-290,-336,-314,-286,-189,-178,-163,-167,-142,-142,-97,-73,-54,-78, +-102,-52,-1,75,40,6,-45,-6,20,58,69,79,110,20,-79,-212,-284,-321,-327,-378,-452,-530,-548,-505,-439, +-253,-240,-228,-227,-258,-282,-291,-311,-319,-256,-178,-106,-47,10,88,55,40,19,48,65,94,102,116,144,13, +-69,-195,-215,-311,-356,-315,-243,-192,-190,-178,-173,-206,-346,-318,-270,-225,-175,-123,-67,-21,-4,2,14,29,45, +73,75,85,87,90,87,95,85,17,-18,-56,-81,-125,-148,-167,-183,-220,-262,-293,-308,-316,-326,-323,-134,-144, +-128,-114,-101,-91,-82,-67,-64,-53,-43,-34,-25,-17,-19,-18,-16,-15,-14,-14,-12,-17,-15,-53,-52,-45,-53, +-61,-73,-83,-92,-105,-119,-127,-122,-132,-64,-35,-1,5,-29,-47,-52,-62,-56,-21,-40,-42,-37,-47,-56,-78, +-67,-57,-39,-22,-16,-22,-30,-35,-39,-43,-28,11,5,9,6,12,8,-22,-4,-12,-23,-3,21,25,-45, +-78,-90,-121,-105,-22,-52,-44,-29,-40,-81,-149,-145,-121,-68,-9,10,-13,-33,-66,-80,-69,-32,62,42,51, +57,52,39,-22,51,45,-46,-2,128,165,-26,-117,-117,-199,-172,16,-74,-63,-51,-89,-148,-264,-239,-182,-79, +29,67,23,-27,-76,-107,-95,-24,135,125,146,146,172,148,-4,119,94,-27,87,79,150,-55,-131,-147,-297, +-261,21,-76,-38,45,25,-144,-373,-408,-328,-153,46,110,27,-54,-130,-155,-96,28,233,344,378,227,222,207, +74,283,267,-45,19,716,432,58,-198,-418,38,128,-222,53,-103,-505,-504,-376,-147,108,197,120,144,154,176, +217,189,133,102,40,93,-9,165,614,256,47,-7,-334,-316,110,606,-1142,-537,-365,8,269,227,81,-209,-337, +-195,390,88,-3,62,155,192,86,18,-25,20,66,94,98,33,87,143,310,303,121,101,114,167,285,351, +371,-845,849,845,620,423,192,524,367,-312,-289,-295,-123,15,191,288,256,144,-64,-49,-60,-88,-66,-15,23, +27,92,109,63,58,64,172,207,217,171,105,251,658,-429,-326,-222,-27,146,278,373,321,440,372,291,123, +0,13,99,147,111,79,29,34,24,-11,-77,-85,-58,-37,15,62,49,29,-4,6,-45,-7,-35,-287,9, +148,27,-48,-24,-69,-79,-112,-56,-63,-92,5,48,40,35,44,54,90,82,24,5,4,54,-39,-87,-120, +-159,-163,-123,-76,-72,-65,-52,-74,-91,-28,-208,-135,-73,-26,2,5,18,34,-47,-46,2,41,73,104,6, +-20,-7,23,50,57,81,60,38,-85,-159,-233,-237,-269,-322,-372,-436,-488,-552,-543,-489,-305,-98,-66,-72,-92, +-101,-125,-158,-186,-140,-97,-56,-63,-66,-58,-32,-6,11,27,44,70,56,51,63,-71,-189,-337,-350,-374,-400, +-363,-338,-313,-231,-151,-81,-94,-216,-164,-154,-144,-133,-117,-95,-87,-78,-80,-79,-73,-62,-58,-61,-67,-70,-72, +-77,-77,-68,-106,-121,-133,-128,-141,-139,-148,-157,-172,-183,-216,-208,-224,-227,-203,-131,-130,-132,-126,-124,-123,-123, +-118,-118,-114,-109,-105,-101,-95,-97,-97,-97,-97,-96,-101,-94,-94,-86,-119,-116,-112,-118,-123,-125,-131,-134,-133, +-129,-129,-131,-131,-143,-41,-16,-18,-39,-50,-52,-61,-56,-30,-42,-41,-35,-30,-36,-63,-63,-62,-51,-39,-33, +-28,-42,-48,-57,-51,-41,-6,-26,-22,-8,-7,-12,-39,-21,-24,-52,-19,-4,-16,-55,-77,-78,-101,-96,-42, +-63,-39,-13,24,-7,-100,-121,-125,-90,-51,-28,-22,-50,-74,-94,-80,-49,49,1,11,56,42,34,-15,32, +11,-88,-22,84,62,-56,-117,-101,-166,-147,-17,-70,-35,-11,37,-11,-173,-195,-192,-119,-47,-4,6,-49,-92, +-119,-107,-59,130,37,68,146,160,132,-12,74,50,-94,63,39,31,-86,-123,-107,-197,-211,-60,-104,-15,94, +228,101,-218,-312,-327,-213,-74,10,29,-65,-125,-153,-139,-40,228,233,262,238,258,239,98,274,181,-177,-38, +623,255,3,-239,-423,-174,-3,-33,102,5,-286,-422,-376,-244,0,108,67,67,72,128,122,86,33,108,50, +-7,9,155,415,140,-31,-168,-448,-301,231,615,-939,-544,-449,-35,554,241,41,-19,-299,-199,347,89,-6,33, +48,47,-39,-7,-2,13,58,104,86,25,85,178,244,196,43,30,72,239,445,335,-168,-786,683,775,411, +77,-188,284,388,-20,5,-117,-231,63,245,306,279,183,-21,-40,-43,-54,-62,-23,6,96,113,30,19,27, +36,185,241,295,-21,-161,70,496,-412,-387,-311,-130,33,7,7,-4,386,468,278,277,191,153,82,92,55, +13,-44,-79,-32,-44,-122,-135,-98,-37,-74,-51,-10,-39,-37,22,0,8,-26,-283,197,309,272,205,157,105, +170,291,121,4,-113,-69,-33,-8,28,56,83,98,86,28,27,10,18,-56,-109,-106,-146,-107,-8,-7,8, +44,78,105,124,152,-316,-191,-165,-112,-95,-26,-9,1,12,51,70,100,87,67,21,12,81,68,74,72, +90,35,-81,-154,-177,-171,-174,-214,-269,-322,-360,-360,-489,-527,-503,-415,-40,6,7,19,36,28,26,20,25, +24,33,15,1,-12,21,45,67,66,78,84,19,-17,-48,-111,-199,-279,-320,-322,-364,-337,-344,-341,-253,-172, +-109,-79,-124,-100,-102,-104,-106,-105,-104,-103,-91,-80,-71,-62,-49,-42,-47,-54,-57,-58,-62,-58,-91,-91,-108, +-118,-114,-111,-96,-93,-95,-91,-89,-97,-103,-119,-120,-111,-99,-77,-85,-86,-89,-91,-94,-98,-94,-92,-88,-84, +-82,-76,-79,-79,-80,-80,-82,-78,-99,-111,-129,-107,-127,-150,-147,-145,-138,-137,-133,-127,-113,-96,-124,-109,-113, +-31,-15,-21,-32,-38,-38,-46,-44,-34,-30,-24,-17,-9,-15,-39,-47,-51,-47,-39,-34,-26,-40,-46,-58,-41, +-34,-6,-30,-25,3,-7,-13,-27,-19,-18,-45,-16,-4,-20,-37,-52,-49,-72,-79,-60,-52,-18,17,57,37, +-45,-86,-108,-92,-73,-54,-32,-56,-75,-101,-68,-40,36,-10,2,70,39,34,15,28,4,-67,-10,54,7, +-39,-79,-68,-127,-119,-71,-45,14,43,106,67,-85,-137,-169,-135,-98,-65,-20,-70,-104,-140,-88,-53,117,6, +45,180,143,116,23,54,39,-81,60,47,-4,-36,-62,-46,-117,-181,-154,-97,24,139,297,229,-65,-205,-283, +-243,-175,-101,-14,-74,-123,-160,-133,-62,219,141,167,292,297,254,146,234,108,-178,-14,387,49,-52,-216,-326, +-284,-67,166,153,118,10,-332,-370,-232,-65,35,52,32,10,28,6,-5,-36,114,76,-80,88,180,155,72, +-54,-242,-394,-171,306,493,-643,-303,-362,6,763,317,88,175,-217,-187,171,131,70,-30,-58,-81,-83,-40,-23, +0,-4,32,65,38,103,175,158,74,-56,-46,65,333,501,206,-541,-642,327,774,180,-294,-567,-428,-47,544, +202,3,-85,68,175,225,215,158,64,-25,-40,12,7,16,12,115,94,3,-27,-10,16,174,193,160,-174, +-288,-66,123,-251,-412,-294,-154,-93,-123,-128,35,236,380,281,366,329,221,71,-9,-32,-82,-111,-138,-114,-106, +-131,-144,-113,-40,-96,-91,-38,-51,-4,30,66,44,-39,-129,240,290,431,469,425,334,327,403,255,141,-7, +-70,-95,-65,4,43,63,77,72,39,36,-3,-54,-78,-110,-111,-68,5,72,29,25,42,84,133,165,178, +-367,-231,-237,-193,-151,-67,-15,37,57,92,125,123,107,67,65,79,107,95,84,78,32,-39,-145,-159,-156, +-129,-139,-172,-190,-234,-249,-226,-316,-378,-439,-433,-77,-18,-9,15,32,48,75,107,111,110,113,95,87,80, +90,95,101,93,87,95,22,-46,-115,-114,-142,-148,-208,-226,-286,-285,-315,-338,-289,-243,-211,-136,-65,-42,-50, +-53,-56,-60,-70,-80,-76,-66,-55,-41,-30,-23,-21,-19,-16,-11,-8,1,-36,-32,-47,-60,-73,-74,-68,-64, +-70,-66,-68,-72,-68,-68,-63,-58,-13,7,-4,-9,-16,-21,-24,-30,-23,-22,-21,-21,-20,-16,-15,-14,-13, +-11,-10,-3,-21,-30,-49,-26,-41,-65,-64,-64,-59,-60,-58,-58,-42,-26,-43,-24,-9,-18,-8,-13,-16,-21, +-25,-34,-33,-30,-15,-7,-2,3,-1,-11,-27,-34,-35,-32,-30,-23,-33,-37,-52,-24,-19,-7,-20,-15,11, +-5,-10,-9,-10,-5,-24,-7,17,2,2,-13,-23,-56,-70,-61,-30,3,29,62,58,17,-43,-77,-82,-80, +-71,-50,-65,-72,-97,-41,-16,17,-3,6,65,31,30,42,32,17,-15,20,46,0,5,-28,-44,-115,-115, +-92,-12,52,57,115,95,24,-69,-123,-125,-121,-106,-60,-93,-109,-150,-44,-20,78,17,46,177,101,87,64, +53,55,-21,63,107,50,70,40,14,-90,-177,-179,-54,54,120,263,285,131,-82,-207,-233,-235,-199,-106,-124, +-146,-190,-88,-30,182,97,123,332,309,251,200,203,96,-74,65,83,-137,-133,-226,-326,-350,-135,208,165,177, +220,-222,-344,-257,-77,24,53,62,27,-10,-45,-34,-12,95,79,-98,190,232,2,11,-107,-241,-256,-30,299, +240,-302,-28,-169,102,741,429,218,235,-139,-160,20,231,213,-77,-107,-140,-82,-71,-80,-92,-95,-55,53,39, +99,134,71,-33,-137,-39,111,317,342,-2,-571,-437,-3,514,-155,-522,-660,-835,-393,697,244,91,114,48,64, +127,167,154,145,42,16,73,61,50,37,85,43,7,-56,-36,33,106,55,-53,-151,-198,-67,-184,-95,-289, +-165,-69,-63,-12,-12,154,113,255,348,364,335,237,86,-58,-114,-151,-159,-141,-162,-149,-130,-109,-82,-49,-56, +-69,-58,-56,14,14,46,36,28,11,108,36,270,393,404,378,352,367,308,245,182,60,-15,-50,3,46, +72,62,56,60,23,-38,-113,-123,-114,-94,20,91,85,44,32,33,106,150,133,97,-261,-197,-117,-62,-36, +6,31,56,81,92,103,72,75,73,92,92,80,78,47,21,-54,-113,-157,-118,-108,-127,-133,-138,-95,-102, +-94,-73,-104,-168,-279,-279,-137,-76,-72,-59,-49,-19,22,68,91,105,120,112,107,106,98,92,86,62,33, +20,-9,-52,-101,-98,-102,-96,-132,-157,-202,-230,-271,-311,-299,-291,-291,-202,-23,-14,-16,-9,-4,-6,-15,-24, +-26,-20,-9,2,13,22,27,31,38,43,50,57,33,16,0,-15,-38,-57,-61,-62,-66,-68,-74,-78,-62, +-45,-36,-34,-9,-9,-11,-15,-19,-20,-18,-17,-12,-11,-12,-12,-12,-10,-8,-7,-5,-2,0,5,1,0, +-2,-15,-16,-20,-22,-27,-29,-32,-33,-39,-36,-35,-15,-13,-20,-6,1,-5,-2,-6,-12,-25,-25,-21,-3, +5,3,10,10,16,-6,-15,-24,-22,-22,-19,-23,-23,-35,-3,-2,-6,-7,-5,4,-6,-8,5,-3,2, +-1,3,39,23,41,28,6,-43,-60,-47,-9,16,20,55,69,75,5,-36,-65,-72,-73,-59,-64,-59,-71, +-7,13,2,10,9,31,11,15,52,27,22,26,39,48,2,43,18,-13,-102,-108,-85,17,71,40,98, +102,130,4,-61,-105,-113,-115,-86,-95,-87,-112,15,24,39,40,42,99,31,34,78,35,55,39,64,147, +92,170,148,88,-64,-152,-152,-7,64,59,198,298,313,58,-105,-204,-240,-239,-172,-157,-147,-180,-15,37,136, +90,109,295,266,219,233,156,88,40,124,-111,-228,-229,-284,-360,-357,-178,196,160,197,334,-106,-299,-282,-103, +19,78,122,97,12,-12,20,79,68,57,-87,250,266,-33,-50,-183,-242,-115,78,226,44,-72,149,116,228, +496,464,345,201,-72,-130,-46,285,328,-10,-91,-149,-86,-78,-92,-152,-114,-86,14,16,64,93,-6,-113,-161, +33,166,205,103,-207,-515,-305,-176,-170,-574,-628,-468,-734,-520,157,272,298,183,59,-2,41,132,166,170,119, +68,40,51,42,50,32,-13,-6,-55,-24,56,10,-79,-190,-56,-39,-51,-189,51,31,110,125,109,133,108, +107,17,108,292,288,276,226,87,-40,-133,-158,-166,-144,-164,-161,-132,-67,-32,-46,-10,-30,-68,-47,12,14, +7,36,143,89,-74,-213,-106,4,97,268,342,338,343,319,334,218,136,62,61,65,51,55,38,30,-25, +-91,-142,-152,-108,-41,52,99,68,75,73,64,124,126,51,-5,-62,-26,107,163,182,127,86,73,60,45, +37,11,24,49,75,72,36,33,-11,-63,-118,-142,-115,-101,-100,-126,-113,-80,-4,30,59,73,89,64,-5, +-28,-189,-151,-134,-112,-77,-44,-8,23,42,56,65,62,56,52,47,52,63,22,-20,-48,-45,-65,-87,-94, +-94,-103,-112,-131,-153,-190,-224,-261,-276,-299,-319,-245,-24,-18,-7,9,18,22,25,33,32,35,41,44,47, +50,46,37,32,27,26,23,24,-3,-16,-32,-51,-76,-85,-91,-93,-100,-108,-112,-88,-61,-47,-43,-57,-63, +-57,-54,-49,-40,-31,-22,-24,-26,-29,-30,-30,-29,-31,-31,-32,-31,-30,-32,-30,-31,-27,-52,-50,-48,-51, +-57,-64,-68,-71,-81,-81,-84,-56,-59,-68,2,5,0,8,7,2,-12,-14,-13,8,14,3,13,16,35, +12,2,-12,-12,-14,-14,-13,-10,-15,12,9,-5,2,-1,-13,-14,-12,9,-4,3,13,8,40,28,60, +55,35,-16,-34,-33,12,26,4,44,71,115,52,9,-40,-55,-65,-62,-60,-41,-28,22,34,-1,18,5, +-17,-19,-9,44,8,12,47,38,35,-1,58,51,30,-54,-67,-71,49,82,15,78,97,197,72,8,-72, +-84,-101,-92,-84,-53,-37,63,60,17,53,20,-18,-48,-34,56,-5,30,83,49,132,91,206,209,158,11, +-72,-121,41,73,-10,132,275,422,196,21,-143,-204,-238,-212,-174,-118,-98,68,104,102,110,99,152,164,142, +200,79,50,123,127,-209,-233,-287,-310,-319,-302,-166,200,160,218,389,6,-239,-293,-180,-27,107,192,218,142, +97,116,150,30,16,-44,221,239,-12,-66,-204,-226,-24,114,150,-83,107,230,290,230,176,421,420,179,-10, +-123,-115,224,347,161,-23,-119,-88,-76,-65,-135,-55,-52,-40,-26,12,62,-68,-154,-130,72,159,81,-108,-346, +-457,-161,-252,-884,-789,-550,-322,-425,-429,-395,336,490,92,45,-34,-17,67,125,127,127,72,-36,0,19,63, +-2,-50,-45,-25,21,47,-48,-132,-214,46,103,-119,-51,249,424,395,264,173,115,79,-9,-88,-69,115,181, +211,222,104,14,-101,-126,-145,-151,-152,-154,-118,-42,0,-21,-1,-18,-59,-17,13,28,-10,35,187,159,-183, +-322,-363,-290,-143,140,277,261,321,332,370,293,236,183,118,77,32,28,-14,-58,-100,-145,-155,-156,-94,17, +37,55,48,91,95,88,88,69,24,-53,145,170,272,295,286,190,121,79,48,15,-15,-27,-23,-4,33, +34,4,-10,-49,-103,-116,-118,-84,-102,-113,-124,-72,-6,73,127,166,176,209,216,189,171,-194,-178,-139,-93, +-22,-4,5,1,-11,-14,-23,-13,-6,1,-7,-6,4,-36,-73,-106,-102,-112,-121,-122,-117,-132,-122,-129,-135, +-154,-170,-184,-208,-244,-269,-225,-67,-67,-43,-28,-19,-7,14,44,49,51,52,48,43,41,25,7,-9,-21, +-29,-40,-31,-53,-64,-78,-91,-110,-121,-129,-133,-144,-155,-161,-140,-113,-99,-91,-102,-109,-99,-89,-76,-61,-51, +-39,-46,-48,-49,-49,-49,-47,-53,-56,-60,-62,-66,-72,-70,-72,-69,-89,-89,-88,-92,-99,-106,-111,-114,-126, +-123,-124,-102,-104,-104,15,9,8,20,21,23,8,4,-1,24,29,11,25,30,48,32,23,9,5,1, +-2,0,5,10,25,20,2,8,1,-21,-18,-14,13,-1,7,28,12,27,29,66,73,70,22,4,-11, +42,47,4,46,78,130,93,57,5,-21,-42,-49,-47,-16,23,45,46,4,19,-2,-46,-48,-35,31,-14, +-2,67,27,7,-4,64,79,85,11,-9,-51,87,110,18,88,108,213,131,79,-9,-36,-64,-77,-62,-16, +45,87,76,6,41,-17,-109,-119,-98,31,-47,-4,116,22,67,67,194,232,232,105,30,-69,102,106,-29, +101,244,427,307,158,-27,-120,-188,-212,-170,-66,37,134,140,78,117,72,-26,18,20,120,-22,-10,190,84, +-258,-196,-296,-281,-219,-218,-136,139,160,265,428,150,-124,-262,-249,-100,106,220,302,295,226,180,144,-23,-30, +30,127,145,3,-36,-138,-142,31,101,75,-170,291,273,265,87,-82,361,467,210,55,-133,-246,50,254,329, +69,-55,-44,-61,-27,-42,30,11,-67,-47,-35,31,-97,-140,-78,49,92,-18,-227,-382,-365,53,-480,-1253,-645, +-261,-207,-274,-364,-547,275,473,39,18,-68,-61,-12,53,70,85,57,-29,-2,24,62,-17,-59,-77,7,56, +29,-69,-117,-125,100,135,-205,-142,482,706,508,232,85,-1,-12,-68,-121,-156,-92,70,156,196,126,59,-21, +-72,-104,-130,-129,-114,-67,-17,13,14,-11,-27,-34,15,20,38,29,57,140,268,-216,-280,-380,-327,-185,20, +141,165,255,299,320,287,253,238,139,70,11,-25,-82,-141,-155,-170,-173,-135,-79,24,2,4,23,62,74, +90,24,3,5,-81,251,247,285,276,258,200,163,134,88,41,10,-9,-26,-34,-5,-1,-27,-37,-51,-80, +-76,-74,-69,-99,-107,-93,-10,66,126,169,190,186,210,232,236,246,-149,-145,-102,-55,8,11,1,-14,-33, +-38,-42,-34,-25,-18,-34,-45,-50,-72,-91,-112,-123,-136,-145,-139,-135,-143,-127,-109,-103,-89,-83,-67,-100,-143, +-176,-155,-130,-129,-107,-95,-85,-67,-38,-7,-3,-4,-8,-11,-16,-15,-31,-46,-61,-71,-81,-90,-84,-95,-103, +-112,-119,-128,-139,-151,-162,-175,-190,-201,-186,-167,-156,-145,-122,-126,-115,-104,-93,-82,-75,-66,-71,-69,-67,-66, +-65,-63,-70,-73,-78,-83,-88,-97,-95,-98,-97,-103,-105,-107,-113,-119,-125,-130,-133,-144,-136,-133,-126,-125,-105, +26,15,18,30,34,40,25,20,12,35,39,24,36,40,53,46,40,31,21,15,10,13,17,30,32, +26,9,13,4,-17,-16,-11,19,5,12,40,17,14,29,64,80,93,53,37,14,58,58,16,47,76, +122,117,96,56,16,-13,-26,-23,8,56,58,50,8,11,-14,-52,-66,-53,20,-27,-9,76,17,-14,0, +70,101,128,65,39,-17,97,117,48,98,115,193,167,135,67,12,-26,-52,-36,11,88,84,71,-7,5, +-59,-140,-163,-139,13,-69,-29,124,-3,2,48,166,229,275,173,114,6,126,113,-3,67,186,356,360,270, +121,-15,-110,-164,-127,-11,145,167,142,66,82,15,-148,-122,-104,35,-113,-67,211,25,-252,-146,-236,-198,-126, +-161,-143,-8,130,300,424,360,106,-180,-236,-158,28,153,255,309,254,155,54,-98,-82,91,32,27,-16,-14, +-46,-2,94,93,6,-198,425,256,121,-87,-287,233,401,232,101,-143,-381,-140,97,341,157,42,27,-34,-4, +64,92,66,-46,-21,-50,-14,-97,-88,-40,12,9,-104,-311,-375,-219,247,-821,-1207,-297,87,-125,-115,-218,-410, +37,246,137,9,-105,-102,-97,-40,5,40,59,41,43,43,28,-36,-55,-89,20,53,13,-58,-66,7,34, +27,-149,-475,618,654,344,92,1,-93,-95,-78,-111,-165,-181,-15,96,137,123,80,63,-14,-54,-76,-79,-43, +7,15,16,26,-18,-33,-15,9,10,55,109,109,128,397,-198,-172,-219,-192,-138,-35,34,74,169,243,258, +255,224,208,119,43,-16,-85,-142,-180,-184,-178,-181,-100,-54,-6,-23,-30,-22,1,30,73,-25,-39,-32,-110, +211,197,174,171,187,196,215,230,176,119,88,66,40,0,6,-5,-45,-41,-39,-41,-46,-54,-73,-88,-76, +-35,53,113,130,141,133,120,136,156,175,183,-50,-53,-20,-4,12,2,-10,-14,-17,-5,9,0,-7,-10, +-37,-63,-87,-89,-96,-103,-117,-128,-139,-124,-118,-114,-94,-54,-34,11,37,78,46,9,-21,-25,-168,-159,-149, +-144,-132,-116,-98,-86,-84,-87,-89,-84,-79,-69,-77,-82,-89,-96,-102,-108,-107,-109,-113,-116,-121,-124,-132,-143, +-159,-171,-184,-199,-190,-182,-179,-165,-118,-117,-112,-105,-102,-100,-99,-95,-92,-86,-82,-78,-77,-74,-79,-83,-87, +-92,-97,-104,-103,-103,-102,-103,-103,-103,-109,-114,-116,-120,-123,-129,-119,-116,-122,-121,-100,31,23,25,35,41, +51,37,31,22,36,40,35,40,43,49,51,49,44,30,22,15,22,26,38,33,28,13,13,6,-5, +-10,-5,22,11,16,43,23,14,31,59,80,106,75,59,32,56,55,37,49,71,99,125,119,92,44, +12,-3,6,30,63,60,46,3,-2,-24,-43,-70,-62,2,-31,-12,61,13,-8,12,75,114,160,106,75, +15,74,93,86,101,114,148,176,164,121,42,-1,-33,-9,30,81,66,53,-34,-34,-92,-128,-182,-156,-12, +-72,-38,96,-8,-24,36,127,208,299,224,172,66,104,93,61,64,151,263,365,337,241,79,-27,-86,-44, +47,177,161,118,41,14,-58,-177,-225,-201,-44,-172,-104,160,-12,-155,-65,-83,-60,-93,-117,-145,-151,63,255, +324,459,260,-148,-199,-202,-106,6,82,146,124,22,-69,-169,-121,123,-25,-58,-51,-27,30,152,167,113,-15, +-135,431,157,-15,-191,-388,34,224,201,135,-117,-433,-273,-61,209,226,169,101,22,33,141,117,98,5,30, +-31,-62,-80,-37,-21,3,-52,-192,-382,-355,-74,325,-986,-980,-151,167,34,70,-71,-288,-234,2,314,44,-117, +-132,-160,-130,-78,-10,41,69,64,34,-28,-64,-56,-82,11,25,4,-31,-26,59,-95,-95,20,-687,558,286, +81,3,93,-74,-104,-48,-53,-102,-150,-48,46,65,99,100,123,40,-2,-17,-12,28,69,43,13,2,-16, +-26,-3,-1,9,102,154,142,213,472,-144,-49,-16,-35,-71,-46,-12,35,100,183,216,221,188,154,96,21, +-50,-124,-164,-173,-185,-168,-162,-64,-26,-31,-35,-48,-61,-43,-3,48,-28,-44,-80,-130,87,53,5,40,109, +184,248,299,261,219,197,173,145,86,60,24,-30,-23,-31,-37,-54,-65,-80,-65,-34,18,83,110,88,79, +57,42,52,61,79,75,81,85,106,91,65,42,32,37,44,59,76,40,9,-17,-41,-65,-91,-86,-85, +-84,-94,-101,-111,-86,-75,-60,-32,26,63,113,143,188,163,143,123,109,-137,-123,-129,-127,-117,-109,-108,-116, +-116,-120,-117,-108,-95,-82,-85,-86,-89,-94,-100,-106,-110,-108,-112,-115,-120,-125,-121,-122,-129,-128,-126,-130,-124, +-127,-129,-116,-97,-89,-91,-90,-94,-98,-99,-99,-93,-88,-86,-83,-82,-79,-83,-86,-88,-92,-95,-99,-100,-101, +-102,-101,-103,-105,-104,-104,-101,-100,-98,-96,-89,-86,-102,-100,-97,27,24,25,31,37,50,38,32,19,25, +29,38,35,36,36,45,45,42,28,21,14,21,24,32,26,22,7,9,3,-3,-9,-4,13,11,15, +32,22,15,26,42,65,100,82,64,28,36,39,55,47,61,70,113,118,100,58,30,15,26,38,46, +49,33,-17,-16,-30,-40,-64,-62,-30,-31,-13,21,7,7,29,65,105,163,127,93,18,31,51,113,95, +104,97,158,159,131,54,15,-14,8,34,39,40,32,-73,-60,-114,-125,-181,-151,-60,-57,-30,39,-2,-31, +23,64,157,281,243,187,66,53,61,132,85,134,181,328,345,290,144,56,6,42,86,136,128,84,-19, +-59,-116,-156,-279,-260,-132,-185,-109,46,-40,21,56,126,98,-78,-55,-97,-197,-5,140,167,381,265,-140,-186, +-245,-252,-156,-125,-105,-84,-136,-176,-195,-124,126,-41,-72,-46,-20,95,269,237,160,26,14,298,33,-107,-225, +-370,-161,24,145,166,-31,-367,-339,-195,27,230,267,166,110,100,191,118,95,50,66,-6,-92,-61,-6,-7, +9,-78,-245,-437,-329,45,275,-818,-631,-192,45,267,198,1,-217,-399,-181,371,100,-67,-145,-181,-183,-149,-64, +-20,-3,23,-11,-76,-93,-65,-54,3,9,-3,-7,-16,6,-143,-122,51,-625,329,-58,-18,54,229,100,29, +-37,-18,-52,-71,-57,-2,-5,75,124,143,90,58,34,48,74,99,57,7,-28,-18,-9,11,6,23,113, +99,99,277,405,-58,49,113,55,-55,-74,-58,-23,26,100,158,168,152,117,75,6,-71,-122,-146,-149,-163, +-135,-101,-28,-1,-28,-33,-46,-53,-41,-16,6,-4,-25,-90,-109,-54,-100,-144,-83,16,127,200,254,267,272, +280,256,224,159,125,74,7,-4,-37,-65,-82,-82,-74,-32,6,52,72,65,26,20,9,-3,2,-2,1, +-29,175,183,192,172,140,110,101,104,101,100,100,51,8,-35,-48,-63,-81,-74,-68,-64,-67,-70,-79,-38, +-13,21,47,100,136,161,177,202,194,196,192,182,-69,-52,-60,-61,-55,-56,-64,-77,-83,-88,-87,-85,-77, +-72,-72,-74,-76,-81,-87,-94,-101,-99,-104,-109,-119,-127,-112,-103,-96,-80,-63,-49,-48,-53,-55,-46,-61,-49, +-55,-58,-65,-69,-69,-70,-70,-71,-73,-74,-76,-77,-78,-79,-80,-81,-82,-83,-86,-89,-93,-89,-93,-102,-93, +-87,-79,-73,-67,-57,-55,-51,-69,-65,-86,20,21,23,25,29,42,35,29,12,15,19,38,29,29,25, +37,37,34,23,18,14,17,18,19,16,13,-3,1,-4,-12,-10,-5,-3,10,13,16,18,10,21,24, +46,82,79,60,12,17,27,69,45,49,48,96,106,91,64,44,32,34,35,25,30,15,-35,-19,-24, +-42,-43,-48,-59,-25,-11,-18,-2,15,46,50,84,139,130,99,3,2,21,132,86,90,66,135,142,115, +60,30,10,16,24,-3,10,9,-105,-73,-120,-152,-165,-131,-113,-35,-13,-15,2,-40,11,7,95,224,233, +173,27,10,46,192,103,110,123,275,319,280,184,121,83,92,93,60,74,45,-91,-96,-130,-140,-263,-253, +-214,-155,-88,-74,-64,180,185,290,218,-33,13,-22,-126,-38,21,29,233,201,-84,-167,-264,-348,-275,-265,-274, +-243,-238,-236,-158,-78,100,-20,-26,7,26,147,295,270,205,103,154,110,-62,-143,-209,-295,-275,-118,93,183, +75,-233,-340,-276,-100,155,271,210,199,173,199,103,70,65,69,5,-89,-44,6,-9,-6,-94,-232,-404,-267, +122,156,-475,-296,-278,-87,430,258,88,-53,-382,-269,268,160,42,-137,-156,-180,-178,-104,-80,-94,-42,-55,-95, +-103,-62,-19,12,4,-3,11,-4,-72,-64,-58,-110,-413,51,-52,130,195,241,283,218,33,8,-40,-19,-64, +-32,-35,61,118,121,118,109,79,86,92,104,54,2,-33,-14,4,5,-1,20,57,2,10,175,140,32, +93,145,96,-42,-99,-116,-97,-59,-3,69,84,93,87,51,0,-59,-86,-102,-114,-111,-73,-24,4,15,-13, +-24,-23,-11,-12,-12,-29,6,1,-28,-31,-142,-187,-191,-144,-71,6,61,115,186,241,281,269,241,185,149, +96,28,-12,-56,-90,-100,-84,-51,1,32,56,33,7,-20,-17,-13,-20,-23,-41,-58,-97,171,169,163,157, +145,135,136,141,124,103,87,40,-1,-45,-49,-57,-66,-55,-46,-40,-39,-40,-47,0,37,89,105,137,158, +150,140,135,142,157,164,160,24,48,40,33,26,16,1,-10,-25,-35,-42,-51,-57,-66,-65,-66,-68,-74, +-81,-87,-89,-82,-80,-81,-88,-90,-75,-62,-49,-26,-2,15,20,18,23,35,-22,-9,-20,-24,-30,-33,-35, +-38,-43,-50,-57,-62,-67,-73,-72,-72,-72,-71,-70,-70,-70,-71,-75,-65,-67,-78,-68,-60,-52,-45,-39,-27, +-22,-16,-31,-25,-72,12,13,19,16,19,28,27,21,2,5,9,34,20,19,15,27,28,25,18,14, +11,10,10,10,4,2,-11,-6,-11,-24,-12,-8,-19,5,10,4,11,-1,15,9,26,55,65,49,-3, +1,15,73,31,27,26,70,84,76,62,48,39,30,21,9,5,-6,-42,-16,-13,-44,-21,-28,-69,-16, +-9,-39,-13,11,53,35,61,98,115,89,-15,-18,0,137,63,63,42,108,118,96,61,38,28,12,3, +-22,-24,-20,-119,-78,-113,-188,-137,-107,-153,-18,1,-44,-3,-55,3,-25,40,140,195,146,-9,-24,33,221, +84,46,58,202,267,247,196,152,127,96,69,-2,4,-7,-125,-82,-91,-106,-183,-180,-240,-107,-60,-147,-83, +252,268,359,285,67,52,9,-24,-47,-60,-65,101,153,54,-110,-241,-354,-327,-322,-320,-302,-264,-242,-67,1, +54,13,19,42,57,143,216,240,226,174,223,-37,-94,-131,-182,-233,-312,-179,73,169,141,-93,-308,-325,-169, +30,180,210,234,201,163,68,34,50,45,-4,-65,-17,-5,-21,-20,-67,-165,-286,-174,139,39,-226,-45,-271, +-104,493,274,148,87,-307,-302,94,206,170,-83,-103,-141,-159,-124,-109,-124,-70,-67,-92,-81,-36,12,12,2, +11,11,34,-67,28,11,-271,-245,-157,255,251,167,36,247,300,201,56,-40,-17,-77,-55,-34,29,61,75, +112,128,111,104,97,96,35,-1,-17,-5,-3,-6,-14,1,-3,-29,-59,-90,-219,127,105,125,121,-2,-80, +-154,-168,-142,-99,-31,-4,23,49,27,7,-15,-37,-49,-58,-39,1,42,31,21,-2,-4,5,12,10,4, +-31,-6,19,71,104,-158,-171,-133,-134,-128,-109,-73,-22,77,148,193,202,192,159,127,75,8,-39,-71,-92, +-97,-71,-27,19,35,29,-7,-28,-32,-28,-23,-37,-42,-68,-95,-129,74,55,37,47,53,77,97,114,101, +87,78,41,9,-27,-32,-38,-44,-36,-32,-33,-18,-12,-9,28,67,122,120,123,125,94,67,38,52,67, +73,67,98,113,105,93,77,62,47,39,18,3,-10,-26,-40,-57,-54,-55,-56,-61,-65,-70,-68,-50,-39, +-30,-28,-17,-7,7,21,40,62,75,78,76,83,93,4,12,3,0,-3,-6,-10,-14,-21,-28,-37,-43, +-50,-58,-55,-56,-55,-54,-53,-51,-51,-50,-54,-34,-34,-42,-36,-30,-24,-19,-14,-5,1,9,-2,3,-49, +8,10,18,13,15,20,23,19,0,2,6,33,14,14,12,20,22,22,15,12,10,7,5,7,-2, +-5,-12,-8,-12,-25,-10,-7,-23,4,9,-1,7,-5,15,6,17,34,56,45,-4,-5,8,73,16,5, +11,42,60,66,55,44,36,21,8,7,-15,-21,-33,-14,-8,-41,-2,-7,-60,-4,-3,-37,-15,8,56, +31,52,68,106,85,-13,-23,-11,136,39,37,30,78,91,90,60,39,34,5,-14,-12,-54,-53,-101,-77, +-95,-187,-100,-79,-154,-7,11,-48,-5,-54,4,-27,9,70,164,139,-7,-39,22,221,46,-28,-5,112,191, +212,181,144,127,67,28,-31,-60,-48,-99,-39,-33,-46,-81,-87,-182,-57,-33,-161,-86,248,289,367,334,209, +75,3,49,-33,-78,-93,75,198,243,7,-160,-272,-308,-306,-277,-270,-224,-184,32,55,15,25,15,31,30, +84,97,163,209,213,228,-96,-67,-93,-152,-185,-304,-201,75,134,167,56,-234,-332,-210,-72,76,181,209,170, +97,21,-2,33,11,-20,-27,-5,-13,-13,-20,-24,-65,-155,-92,109,-34,-56,179,-115,-2,450,314,231,208, +-187,-262,-54,224,277,46,-29,-94,-110,-112,-89,-76,-36,-35,-62,-35,-2,14,4,7,11,5,25,-4,42, +30,-255,-129,-224,447,127,-63,-233,-8,202,387,159,25,-32,-67,-62,-35,-21,-5,32,86,121,129,111,98, +68,8,-6,-6,-5,-8,-6,-10,-4,-16,-15,-80,-352,-463,268,184,136,133,62,-11,-122,-178,-173,-136,-79, +-54,-20,32,30,34,34,17,15,22,49,79,85,46,22,4,9,12,12,9,12,-9,-12,41,156,284, +-112,-82,-33,-66,-103,-128,-104,-63,25,73,92,109,111,99,76,35,-22,-52,-63,-69,-71,-44,-2,24,21, +-3,-26,-32,-26,-21,-22,-42,-51,-75,-99,-113,-20,-49,-64,-52,-44,3,36,64,70,80,92,75,59,40, +26,14,4,1,-6,-19,4,20,35,51,78,109,96,81,74,44,17,-16,-6,1,3,-11,120,127,122, +113,100,92,84,82,64,47,31,15,2,-15,-13,-13,-14,-17,-17,-22,-23,4,21,36,45,69,72,78, +83,89,97,101,100,97,104,109,33,39,35,35,36,33,30,28,22,17,11,7,2,-5,-3,-3,-3, +-3,-3,0,-5,-5,-14,18,16,8,7,9,10,13,15,18,27,36,24,31,7,-3,3,7,4,5, +6,12,8,-9,-9,-6,20,1,0,1,3,5,11,3,1,-2,-2,-1,6,-14,-14,-7,-9,-9,-17, +-6,-5,-19,0,0,-4,1,-7,8,-1,4,8,37,31,-10,-18,-7,54,-2,-19,-14,0,17,41,31, +23,15,8,-6,5,-32,-37,-23,-29,-29,-48,-5,-4,-48,-3,-4,-33,-17,6,47,25,42,39,86,70, +-10,-32,-27,105,11,9,5,27,40,69,39,21,14,-6,-26,1,-81,-76,-63,-73,-71,-126,-63,-53,-112, +-5,9,-46,-10,-39,5,-20,-11,7,123,123,2,-50,-1,173,14,-76,-71,-9,75,150,129,99,78,29, +-10,-31,-88,-55,-41,-7,-5,-2,-14,-22,-86,-22,-14,-130,-75,206,244,337,353,309,81,-20,61,-39,-91, +-107,54,221,348,122,-54,-163,-248,-256,-212,-205,-156,-82,76,54,0,14,0,9,3,22,22,70,141,182, +191,-88,-8,-48,-128,-163,-301,-242,28,54,134,163,-154,-319,-262,-141,-1,126,141,95,14,-28,-28,20,-17, +-20,-5,-5,-3,-3,-4,-10,-6,-47,-38,48,-59,98,311,50,72,289,321,287,257,-53,-187,-180,161,296, +193,36,-61,-67,-86,-47,2,20,10,-23,5,9,4,3,3,2,3,4,5,22,8,-135,-21,-215,186, +-185,-314,-395,-302,-39,365,240,127,-67,-66,-92,-83,-90,-62,-10,44,87,114,101,76,18,-11,-8,-3,-4, +-4,-3,-3,-3,-5,-5,-81,-413,-456,410,307,129,53,46,-5,-96,-168,-185,-156,-112,-91,-53,16,34,51, +59,57,69,91,118,126,86,40,11,4,7,7,6,4,6,6,-2,67,174,409,-52,-8,18,-14,-53, +-90,-80,-66,-9,8,1,10,10,5,-1,-17,-47,-56,-53,-48,-42,-17,18,18,6,-14,-17,-15,-12,-7, +-8,-24,-38,-54,-71,-67,-79,-108,-112,-101,-95,-56,-30,-9,16,47,79,88,95,99,78,60,43,32,18, +-1,22,39,56,53,59,56,47,27,27,3,-12,-38,-40,-45,-50,-67,89,71,72,70,66,68,70,74, +69,59,49,41,35,29,29,31,32,32,34,30,33,53,68,84,98,119,113,109,105,95,90,86,82, +79,81,74,47,43,47,49,52,51,50,50,48,48,48,48,47,45,45,45,44,44,43,45,42,43, +39,57,56,58,52,51,48,48,47,44,47,49,48,49,52,-16,-9,-4,-6,-6,-9,1,-2,-14,-18, +-17,1,-10,-12,-13,-16,-15,-4,-11,-12,-17,-15,-14,-4,-27,-27,-11,-20,-18,-17,-11,-12,-21,-11,-13, +-15,-11,-12,-1,-7,-7,-15,19,20,-7,-24,-20,23,-10,-28,-37,-46,-33,6,1,-2,-12,-11,-21,-1, +-48,-52,-16,-53,-57,-52,-19,-10,-33,-11,-14,-33,-21,1,36,20,34,12,70,63,12,-28,-33,55,6, +0,-16,-33,-26,33,7,-4,-20,-23,-37,1,-92,-82,-28,-62,-48,-56,-28,-30,-55,-9,-5,-44,-19,-25, +5,-10,-22,-43,85,111,39,-36,-18,92,13,-73,-117,-138,-69,59,56,39,11,-12,-36,-24,-77,-27,1, +5,15,15,5,5,-14,-6,-7,-82,-57,157,169,288,341,352,108,1,77,-22,-65,-64,57,235,395,248, +84,-51,-169,-193,-153,-147,-78,4,55,20,-2,0,-6,-6,-2,1,2,9,57,100,125,-47,52,7,-77, +-131,-275,-265,-43,-8,106,229,-62,-262,-291,-179,-42,75,80,35,-44,-47,-26,5,-21,-9,-1,1,2,3, +2,-1,0,-9,-5,11,-38,218,352,161,84,76,292,321,247,76,-102,-265,51,244,308,111,-10,-27,-43, +-4,56,51,29,1,12,4,1,0,-1,-1,-2,1,-1,4,14,-73,48,-215,-346,-386,-346,-384,-411,-235, +137,266,240,-44,-46,-115,-127,-132,-93,-49,-3,30,62,62,25,-20,-8,-3,0,0,1,1,1,0,0, +1,-39,-281,-250,441,369,83,-71,-37,-61,-86,-121,-159,-150,-119,-99,-59,9,33,53,69,85,108,127,143, +117,53,15,-2,2,0,-1,-2,-2,-3,2,-7,66,132,364,0,45,50,38,9,-28,-43,-62,-40,-41, +-53,-52,-62,-75,-66,-58,-55,-48,-35,-28,-15,10,25,10,-1,-5,-1,3,4,6,6,3,-9,-13,-25, +-5,-106,-117,-106,-100,-90,-69,-57,-50,-25,4,33,59,83,106,88,70,52,43,35,21,28,35,41,26, +19,3,-2,-15,-12,-25,-34,-50,-64,-80,-91,-101,16,-7,2,10,16,25,35,46,54,57,58,58,59, +64,62,65,66,67,69,67,64,77,85,91,98,104,92,80,71,57,47,42,35,32,28,15,46,40, +48,51,55,57,59,61,62,66,70,74,77,79,79,78,77,76,74,75,71,68,64,74,72,78,73, +70,66,64,60,53,51,50,48,47,82,-27,-19,-15,-15,-15,-22,-10,-11,-16,-24,-25,-19,-18,-19,-24, +-32,-33,-21,-24,-25,-30,-26,-25,-14,-37,-35,-14,-28,-27,-20,-18,-17,-18,-21,-24,-23,-21,-17,-10,-11, +-15,-34,1,8,1,-25,-30,-16,-11,-26,-54,-81,-76,-33,-28,-24,-36,-27,-33,-11,-54,-59,-19,-69,-70, +-43,-23,-14,-15,-20,-26,-33,-26,-4,23,19,27,-14,50,53,43,-16,-32,-10,13,8,-33,-82,-86,-16, +-27,-27,-52,-41,-45,-8,-82,-62,-4,-30,-11,-9,-4,-8,-7,-10,-18,-36,-23,-16,5,2,-23,-81,39, +86,83,-13,-36,-15,24,-36,-138,-232,-196,-50,-19,-15,-46,-45,-46,-19,-36,8,6,9,9,4,3,2, +2,1,-4,-42,-37,106,104,220,290,357,157,65,112,17,-16,4,66,218,368,335,208,36,-94,-136,-114, +-94,-19,35,13,1,-4,-4,-5,-2,-2,-1,0,-2,7,30,60,7,87,62,6,-57,-200,-236,-100,-30, +97,237,26,-168,-278,-209,-93,13,34,10,-50,-24,-6,-6,-9,0,2,2,2,1,1,0,2,-2,-4, +8,8,275,345,203,56,-97,239,345,246,200,-6,-283,-57,148,333,195,84,25,11,27,63,37,15,7, +3,0,-1,-2,-1,-2,0,-3,2,-7,22,-40,49,-236,-737,-370,-180,-241,-296,-275,-136,213,298,63,-8, +-121,-134,-148,-115,-85,-52,-35,-8,2,-19,-17,2,0,2,2,2,1,2,1,4,-1,8,-94,-64,273, +259,4,-147,-123,-116,-78,-59,-114,-134,-119,-94,-53,-3,21,46,78,101,121,130,124,73,16,-2,-1,-2, +-3,-3,-3,-3,-5,-1,-11,13,85,175,60,97,90,97,69,30,-13,-52,-68,-74,-82,-82,-93,-113,-90, +-67,-47,-29,-10,3,21,33,26,7,2,6,6,7,6,8,9,11,9,19,20,44,-84,-83,-70,-71, +-63,-53,-47,-48,-33,-21,-8,16,41,66,58,49,39,39,39,40,30,21,14,0,-9,-16,-15,-16,-13, +-16,-21,-29,-45,-64,-79,-79,-38,-57,-42,-26,-13,-2,12,26,40,51,60,67,73,85,81,83,83,83, +82,82,80,76,71,65,61,49,36,23,14,2,-8,-11,-17,-17,-22,-36,40,29,38,41,45,50,54, +57,60,64,69,75,80,86,84,83,82,81,80,78,79,78,81,72,74,83,80,76,72,68,64,56, +48,41,48,43,84,-31,-24,-21,-19,-19,-28,-17,-15,-11,-23,-27,-33,-20,-20,-28,-37,-38,-32,-30,-30, +-33,-31,-31,-25,-35,-35,-20,-37,-37,-25,-24,-22,-16,-26,-29,-30,-27,-23,-19,-14,-18,-42,-13,-2,14, +-20,-33,-47,-11,-19,-54,-85,-89,-60,-45,-36,-45,-36,-33,-17,-53,-58,-22,-53,-48,-23,-15,-9,2,-22, +-31,-28,-27,-9,4,14,16,-31,25,37,73,-2,-28,-66,14,15,-36,-92,-104,-57,-48,-38,-63,-46,-42, +-20,-47,-19,7,1,10,4,4,-1,5,-5,-20,-29,-22,-16,-9,5,-22,-94,-5,55,121,10,-51,-110, +18,-1,-123,-238,-241,-137,-76,-49,-74,-55,-38,-11,2,11,-2,0,-3,-2,-1,0,-2,2,4,-17,-23, +65,66,129,191,309,175,105,109,60,47,65,74,169,279,347,277,99,-16,-72,-77,-48,13,16,-4,-3, +-1,1,1,1,0,0,0,-1,0,2,25,38,78,87,76,25,-102,-161,-115,-28,78,177,81,-62,-207, +-212,-149,-61,-17,-4,-21,8,2,-8,1,2,0,0,0,0,0,0,0,1,0,-3,23,232,286,168, +8,-175,131,270,192,223,49,-230,-124,38,248,237,179,89,71,53,44,7,0,5,-2,-1,-1,0,0, +0,0,0,1,-4,5,-13,24,-234,-733,-247,-26,-76,-115,-200,-280,70,226,170,26,-102,-116,-140,-126,-108, +-86,-80,-64,-43,-25,2,1,1,1,1,0,0,0,0,0,2,1,-2,-3,6,-13,-49,-108,-138,-109, +-58,-22,-71,-110,-108,-86,-50,-24,2,31,73,94,107,108,80,31,-5,-3,-2,-2,-1,-1,0,0,0, +-3,2,-17,27,2,87,120,105,110,77,42,-7,-39,-78,-88,-94,-89,-92,-106,-71,-47,-30,-7,15,34, +43,37,13,4,5,4,2,1,0,0,1,1,7,8,30,54,-51,-47,-40,-45,-41,-37,-34,-38,-32, +-32,-32,-24,-14,-4,-2,0,1,7,10,20,6,-5,-10,-16,-14,-7,-4,-1,1,2,0,-1,-16,-29, +-45,-46,-61,-65,-52,-38,-27,-20,-11,0,11,22,33,40,47,57,57,60,61,63,64,68,65,48,36, +25,14,-1,-9,-15,-22,-29,-36,-41,-45,-46,-49,-55,12,5,10,12,15,19,23,25,28,30,34,39, +43,48,47,48,48,48,48,47,50,50,56,38,43,49,45,40,36,32,29,24,18,11,21,15,45, +-27,-22,-22,-18,-18,-25,-18,-16,-7,-20,-24,-35,-19,-18,-25,-30,-32,-32,-28,-26,-27,-26,-26,-23,-27, +-29,-24,-35,-33,-22,-21,-18,-9,-22,-24,-25,-24,-21,-23,-14,-17,-34,-18,-8,17,-16,-31,-57,-14,-14, +-42,-63,-72,-65,-48,-37,-38,-28,-22,-23,-40,-33,-9,-17,-14,-5,-4,-3,7,-14,-28,-22,-21,-11,-16, +5,5,-27,4,14,71,-1,-27,-88,0,9,-31,-66,-82,-71,-51,-37,-49,-31,-27,-14,-3,6,5,5, +6,3,2,0,0,3,-4,-17,-18,-16,-26,0,-16,-69,-26,25,112,9,-59,-145,-6,8,-87,-168,-194, +-161,-98,-61,-65,-40,-15,2,4,-2,-3,-2,-2,-1,-1,0,0,-1,3,2,-11,35,40,45,85,208, +136,89,52,72,78,67,50,87,155,258,241,117,42,-9,-31,-6,13,-1,-1,0,1,1,1,1,0, +0,1,0,-1,-2,7,33,43,72,97,74,-20,-77,-90,-18,48,97,93,13,-114,-177,-175,-116,-68,-30, +-4,11,-2,-1,2,0,0,-1,0,0,0,0,0,0,1,1,-4,131,189,105,-13,-157,23,143,130, +173,69,-127,-121,-33,123,206,210,133,103,64,25,-6,1,1,-1,0,0,0,0,0,0,0,1,0, +1,-3,-6,-161,-455,-155,-5,39,7,-90,-223,-45,100,207,69,-36,-76,-98,-100,-100,-86,-81,-76,-45,-3, +3,0,0,0,0,0,-1,-1,-1,-1,0,1,-1,21,-131,-202,-4,34,-27,-12,1,2,-32,-69,-70, +-67,-41,-32,-6,20,50,67,76,79,47,3,-6,0,-1,1,1,1,1,1,1,1,1,-2,3,-28, +86,99,76,66,45,24,-9,-20,-55,-67,-75,-70,-67,-67,-34,-14,-4,17,34,50,48,26,2,3,0, +-1,-1,-2,-2,-2,-2,-3,0,-1,5,37,-16,-8,-7,-12,-15,-16,-15,-19,-20,-26,-33,-36,-37,-40, +-34,-28,-23,-17,-15,-6,-15,-16,-10,-5,1,3,3,5,5,6,6,8,5,-1,-5,-7,-45,-40,-34, +-28,-22,-18,-15,-10,-4,2,8,12,16,20,23,26,30,33,35,41,39,19,7,-3,-8,-10,-11,-13, +-15,-17,-18,-24,-30,-35,-40,-40,-6,-8,-7,-6,-4,-2,-1,0,1,2,4,6,8,10,11,12,13, +14,15,15,18,19,24,10,10,9,6,2,-1,-4,-7,-8,-8,-9,-2,-5,8,-20,-18,-19,-15,-15, +-18,-16,-14,-6,-16,-19,-28,-17,-16,-19,-20,-22,-25,-21,-20,-18,-17,-18,-23,-20,-21,-18,-21,-20,-14, +-14,-12,-5,-17,-19,-21,-19,-18,-22,-14,-14,-21,-17,-11,8,-16,-27,-46,-17,-14,-28,-36,-43,-50,-39, +-29,-24,-15,-13,-17,-9,-3,2,1,1,2,1,1,3,-1,-10,-15,-15,-13,-27,-5,-4,-13,-7,-3, +42,-8,-25,-70,-16,-5,-23,-33,-45,-56,-40,-28,-25,-11,-6,2,4,1,0,0,0,0,0,0,-1, +1,4,1,-8,-10,-35,-8,-12,-30,-25,3,67,-6,-56,-116,-26,-4,-51,-83,-109,-124,-86,-55,-38,-13, +1,0,-2,-1,0,0,0,0,0,0,0,-1,-2,1,1,11,20,-1,18,99,72,47,-7,61,76, +42,18,21,58,135,151,105,69,33,11,7,0,0,1,1,0,0,0,0,0,0,0,1,0,0, +-1,5,26,45,78,75,27,-14,-54,-13,20,46,80,47,-38,-107,-138,-119,-88,-52,-15,-1,-2,1,-1, +0,0,0,0,0,0,0,-1,1,-2,4,-6,32,86,45,-17,-101,-48,25,67,95,56,-43,-88,-59, +30,119,154,126,96,59,17,0,1,-1,1,0,0,0,0,0,0,0,0,1,-1,4,-12,-37,-197, +-103,-32,92,35,-33,-106,-87,-3,139,83,29,-33,-47,-57,-67,-58,-50,-50,-15,5,-1,0,0,0,0, +0,0,0,0,0,-1,2,-6,18,-70,-170,72,130,96,80,60,28,-5,-37,-39,-52,-40,-36,-13,3, +18,34,41,51,17,-7,1,0,0,0,0,0,0,0,0,1,0,2,-3,12,46,48,13,-6,-13, +-20,-30,-23,-33,-36,-41,-39,-35,-28,-7,7,13,26,32,42,29,3,0,-1,-1,0,0,0,0,0, +-1,0,-2,-1,-3,-2,9,21,18,15,7,1,-3,-8,-16,-24,-32,-34,-36,-40,-35,-31,-27,-25,-24, +-21,-19,-8,1,2,1,0,0,0,1,0,1,0,2,3,3,7,-25,-22,-21,-21,-21,-19,-19,-19, +-16,-14,-13,-12,-12,-12,-9,-7,-4,-1,1,5,6,-6,-7,-5,-2,0,0,0,0,0,0,-1,-3, +-10,-16,-18,-14,-13,-14,-13,-13,-13,-13,-13,-14,-14,-14,-14,-14,-14,-13,-12,-11,-10,-9,-8,-6,-5, +-4,-11,-11,-12,-13,-14,-15,-16,-17,-17,-17,-17,-16,-15,-13,-9,-8,-8,-7,-7,-7,-7,-7,-4,-7, +-8,-11,-8,-7,-8,-8,-8,-10,-9,-8,-7,-7,-8,-12,-3,-3,-2,-3,-2,-2,-2,-2,0,-3,-4, +-11,-9,-9,-10,-6,-6,-6,-7,-6,0,-8,-12,-18,-10,-8,-11,-12,-15,-19,-16,-12,-8,-5,-1,1, +2,1,1,1,1,1,1,1,1,1,2,1,-2,-2,-16,-4,-4,-1,-4,-5,11,-6,-12,-26,-11, +-7,-10,-9,-13,-22,-15,-11,-6,0,2,0,-1,0,0,0,0,0,0,0,0,0,-1,0,2,3, +-18,-6,-4,-3,-9,-3,18,-8,-25,-43,-17,-8,-17,-22,-33,-47,-36,-24,-10,0,0,-1,1,0,0, +0,0,0,0,0,0,0,0,-1,0,0,4,-7,-2,22,19,13,-15,25,34,15,5,1,12,35, +48,49,39,27,15,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,11,18,30, +34,23,8,-19,-7,3,13,33,26,-5,-33,-52,-55,-46,-32,-14,1,0,0,0,0,0,0,0,0, +0,0,0,0,1,-1,2,-1,15,8,-9,-34,-36,-14,19,27,21,-4,-35,-33,-5,30,50,52,41, +27,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,-45,-41,-18,47,20,-3, +-23,-42,-19,42,44,33,0,-8,-16,-20,-19,-16,-13,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,-3,2,-30,55,76,77,62,49,29,9,-7,-12,-21,-19,-17,-9,-4,1,8,11,16,-2, +0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,3,9,-12,-21,-23,-24,-23,-16,-14,-11, +-11,-10,-9,-5,2,7,10,14,14,18,2,-2,0,0,0,0,0,0,0,0,0,0,1,0,1, +-3,4,19,15,14,10,6,2,-2,-6,-11,-15,-15,-15,-16,-14,-12,-11,-11,-9,-10,-3,2,0,-1, +0,0,0,0,0,0,-1,0,-1,-1,0,0,-5,-6,-7,-8,-9,-9,-10,-10,-10,-9,-9,-10,-10, +-11,-11,-10,-9,-9,-7,-7,-6,-2,1,2,1,1,1,1,1,1,1,2,1,2,1,1,-8,-6, +-7,-7,-7,-7,-8,-8,-9,-9,-9,-10,-10,-10,-10,-9,-9,-9,-9,-8,-8,-9,-9,-3,-3,-3,-3, +-3,-3,-3,-3,-3,-3,-3,-10,-9,-10, }; -const UWord32 defaultHRIR_rom_ER16_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { -0x0624a0e0,0x056db600,0x05bb77a0,0x0503cb18,0x04ef0160,0x05965d08,0x04a9add8,0x047e1d30,0x05325de0,0x053790e8,0x052407d8,0x050a5ea0,0x05357c10,0x054a7a30,0x05383838,0x04636030,0x046979c8,0x05a5d650,0x049bd6d8,0x04969ab0,0x0524e510,0x04dbc5e8,0x050f3628,0x05240978,0x053bc720, -0x055879e8,0x057b1008,0x059d3f68,0x05c342b0,0x05ee07c0,0x0613ed00,0x063a23d0,0x067b3920,0x0654f4f0,0x06303e80,0x05e5f970,0x05b92728,0x074deba8,0x07120130,0x063be4a0,0x0563d9f8,0x049bfa40,0x04522128,0x04164b68,0x03c36a60,0x03b749dc,0x03a7aefc,0x03ae0df8,0x03b453fc,0x0399cf74, -0x037cd76c,0x03920410,0x03c1bb4c,0x04013088,0x0434eba8,0x04ceb318,0x051bd998,0x0560ef30,0x05a8bf70,0x05fcb978,0x063d5258,0x069a7b28,0x07114bf8,0x07805d60,0x0805cd20,0x089fed90,0x09400960,0x09ec13d0,0x0abd8370,0x0a6c94a0,0x09ca0b10,0x08aca8e0,0x07f9fac8,0x08dcef90,0x07e0f8c0, -0x06173070,0x04e32c30,0x03c9fb58,0x03444dd8,0x02bd62f0,0x0264df24,0x02271acc,0x021b8f18,0x02838a24,0x025805bc,0x024b5380,0x02111484,0x02481cb4,0x027470b8,0x02cbbda4,0x03279b68,0x03a0d4d8,0x04219ce8,0x04f50568,0x056768c0,0x062bfd38,0x06b59bb8,0x07808a10,0x0877f9d0,0x096c2130, -0x0a957870,0x0c0d8590,0x0d7f4e80,0x0f1da1c0,0x113e4f60,0x100844a0,0x0e990be0,0x0c1b0f30,0x0a43b1c0,0x0b17f6f0,0x092e4530,0x06993bb8,0x047cd3b0,0x030cd48c,0x0247959c,0x01b33e86,0x0155ca44,0x01099616,0x011a9efe,0x0167862e,0x01546580,0x013306d0,0x0103c2f2,0x01309726,0x016254c2, -0x01cb4764,0x02277268,0x02e14a60,0x0367b670,0x0454e5e0,0x04e97ae0,0x05e119a0,0x06951d08,0x07b51690,0x092fd090,0x0aa2c810,0x0c9ea280,0x0f200080,0x12125080,0x15e3d860,0x1ac029c0,0x18b8ed40,0x1524ace0,0x10956280,0x0d021a50,0x129721a0,0x0e7e8bc0,0x0bf03010,0x08e96060,0x05a524b0, -0x0410cb90,0x02de0774,0x022ad9ec,0x0186d1a6,0x016069dc,0x01801c34,0x018e49ee,0x017d38a4,0x012fe7aa,0x01376c26,0x0174b720,0x02139104,0x02b63f48,0x03a071ac,0x04b0f9a0,0x06fb64a8,0x08a69340,0x0c89e210,0x0ecfbc90,0x126cde60,0x167a5000,0x1a1aff00,0x1d0aaea0,0x1e0c6960,0x22b16900, -0x228fd140,0x20dc0fc0,0x205b9180,0x1e34a720,0x1b5cd020,0x15d07000,0x162175a0,0x10b1fa60,0x0dc795b0,0x0a212c90,0x076875e0,0x04f9d250,0x0384f918,0x03275cfc,0x025b21ec,0x022a24f0,0x0255fd8c,0x01dc0826,0x01944626,0x01410c94,0x01695c82,0x01af86b0,0x0253b9a0,0x0339ff30,0x0493c2e0, -0x066e15d0,0x089f63a0,0x09c1b350,0x0bec9890,0x0e534590,0x119d1dc0,0x1570e9c0,0x17bbae40,0x1ab6bd00,0x1d8ea300,0x22be5b80,0x265dfbc0,0x2817acc0,0x28fe33c0,0x264c2e00,0x231de940,0x19e34340,0x1e979540,0x14d12880,0x0f559b10,0x0a1ac540,0x07771dd8,0x053bd648,0x03d35cc8,0x032df24c, -0x025ba3a8,0x0291df58,0x04c1dce8,0x02dde778,0x026b54ac,0x02c9678c,0x0237cf2c,0x02cdfcec,0x03dc9798,0x04df1510,0x05f82680,0x06e82550,0x08283660,0x08e0fca0,0x0a9a3960,0x0c32e410,0x0ef73030,0x1294a620,0x1765cd20,0x1d5ce020,0x243a4a00,0x2b58b9c0,0x3145ee00,0x3431c040,0x345a4b00, -0x303343c0,0x2c5f8dc0,0x23e29b40,0x1f875e00,0x16412bc0,0x104792c0,0x0a600920,0x0739f1e0,0x04e24b00,0x03b2de04,0x032201a4,0x02ac6f94,0x0319de88,0x06d978f0,0x02b65e84,0x0237fac4,0x02a1e580,0x02b02904,0x03672c98,0x046a42b0,0x051d0e88,0x060dc4b0,0x06e2fb70,0x07f33a38,0x08afce00, -0x09eb5510,0x0cf180b0,0x10964a20,0x14c43ce0,0x1a5cb1c0,0x20129780,0x25c5a180,0x2d5487c0,0x31ac0140,0x336a42c0,0x310cd680,0x30073b00,0x30d0e800,0x25e23a40,0x1f403a20,0x1499fa60,0x0f048b30,0x09aa1a20,0x071f3530,0x05a8cc00,0x043dc730,0x036b581c,0x0366f34c,0x035a21f8,0x04822dc8, -0x0336385c,0x02eef408,0x02dec4b4,0x03330658,0x03e5ef70,0x049c7aa0,0x057eb748,0x06bd71b8,0x07b70498,0x085f93e0,0x08d7a460,0x099925c0,0x0b342910,0x0db4be80,0x11a93540,0x15b2cec0,0x19e94e20,0x1e23aac0,0x1ec8df80,0x212f5d80,0x26ab5bc0,0x28c7fb00,0x2a0108c0,0x294967c0,0x26579b00, -0x17740620,0x1215d8c0,0x0ec902f0,0x0a82dcd0,0x079eadb8,0x05e9c7f8,0x04862440,0x03db1c84,0x03d66d24,0x03e0901c,0x03893cf8,0x03c4c5e4,0x039bcc1c,0x038fd594,0x040f22a0,0x04dc6770,0x05a48d90,0x06cfb578,0x08385530,0x087037c0,0x0a1c7d80,0x0a734ea0,0x0a36c4f0,0x0b2304d0,0x0c29f310, -0x0d70e9e0,0x0f17daf0,0x115337c0,0x14664d80,0x16fb8a80,0x19e66b40,0x1cbbff20,0x1f85fa40,0x201e2fc0,0x1df808a0,0x1b171320,0x13212ec0,0x10463c20,0x0e490ba0,0x0b8cf510,0x0a2ebb50,0x08090ae0,0x06de55f8,0x05527190,0x05cc4238,0x04bea140,0x059379e8,0x04e24758,0x05923fa0,0x051d8e40, -0x06306f40,0x065fbf18,0x077024a0,0x084602e0,0x099f41a0,0x0a7770d0,0x0bba9c60,0x0cb8daf0,0x0df40620,0x0e833b90,0x0f15b430,0x0fcd1dc0,0x112c6ba0,0x127b7080,0x13ce78e0,0x15485800,0x16e26320,0x18d57a20,0x184d7e40,0x1849c5e0,0x18f0dea0,0x157a6ca0,0x0e736590,0x0e848c90,0x1039c960, -0x0b83eeb0,0x0ace52c0,0x09fa07a0,0x091e47c0,0x081fc1c0,0x089a4f80,0x08c0f6b0,0x0855fe90,0x0893b6c0,0x082fdd70,0x08053c30,0x089b4eb0,0x0941aae0,0x09ea0ee0,0x0a210580,0x0defd9c0,0x0c7b0be0,0x0caecbd0,0x0d836d70,0x0e50a250,0x0f14a580,0x0ff98b80,0x10d0dfa0,0x111526a0,0x116a2620, -0x11dcdf20,0x12506780,0x12aef660,0x135b8720,0x12156c00,0x10fe52c0,0x100be4c0,0x0f363e70,0x0c2fc730,0x0d5092d0,0x0c8545a0,0x0d90cb30,0x11605220,0x0b7f31a0,0x0c280b70,0x0f7230e0,0x0ffa4f20,0x0fb90290,0x0ebdb460,0x0fb9d900,0x1028e740,0x0fddf020,0x0c127d90,0x0b0d2e50,0x1221a0c0, -0x0d1aa970,0x0c1cdeb0,0x0c9bb800,0x0b933ee0,0x0c253960,0x0c4c6910,0x0c95a640,0x0cd4b080,0x0d26e570,0x0d315aa0,0x0d4cfa00,0x0d679dd0,0x0d870b70,0x0da339c0,0x0dedd180,0x0d7cca10,0x0d3fda70,0x0ce38800,0x0ccc8c40,0x0ed42f80,0x000209d6,0x00019aad,0x000160f5,0x0001a179,0x0001dc43, -0x0002f98d,0x0001a557,0x000190ed,0x0001c783,0x0001e591,0x000208b8,0x00025efb,0x00022e94,0x000206aa,0x0001803f,0x0001a80d,0x0001d521,0x0002a2b6,0x00028342,0x000288e3,0x0002680a,0x000228b1,0x0001fdfd,0x0001e040,0x0001d8af,0x0001aaa9,0x00019466,0x0000fff0,0x0000da37,0x0000e490, -0x00014f08,0x00018fca,0x00016c64,0x0002053c,0x00021401,0x000175ad,0x0001b59b,0x0001d44b,0x0001de8f,0x00030259,0x0003d2d7,0x00072cc4,0x0002053b,0x00016503,0x0001ee4c,0x00027a28,0x00035035,0x00042a1f,0x0003bb78,0x0002f2fd,0x0001ada2,0x00021690,0x00030456,0x0005460d,0x00057e79, -0x000585ed,0x0004d6fb,0x0003efb0,0x00033b42,0x0002c130,0x0002e013,0x000241ca,0x000234b3,0x0000efd2,0x0000c6ab,0x00018a84,0x000172ad,0x0001ef03,0x00013fda,0x0002c758,0x00029755,0x0001317f,0x000199fb,0x0002fc1e,0x00042d9c,0x00038547,0x00040bae,0x000e62e6,0x0002ac71,0x00026fbe, -0x0002fa5a,0x00047d54,0x00063b64,0x0008d1ab,0x00070db7,0x00057340,0x00026d5b,0x0002b1e5,0x00057e0c,0x000b52b8,0x000b7403,0x000acb5d,0x0008e9e3,0x00069031,0x0004be3f,0x000392c7,0x0004452d,0x00039669,0x000651b1,0x0003e82b,0x0004053b,0x0006d1d9,0x00020e29,0x0002be96,0x00010cd7, -0x000585e0,0x00060aff,0x00026e6c,0x0003635c,0x0003d991,0x00057ee8,0x000987a7,0x000fdbba,0x0024bce0,0x000588b3,0x0007c2a9,0x0004374a,0x0009aafe,0x000befb0,0x0010cac4,0x000dd0ae,0x0008c90f,0x0004aef9,0x0007a98e,0x000d9230,0x0017e791,0x001561e0,0x0014a7a1,0x00114a2c,0x000c7d9f, -0x00085155,0x00069436,0x0008e6c8,0x00091943,0x000f858a,0x00119ebf,0x0014649e,0x00192dde,0x00062bb5,0x00035137,0x00020d3f,0x0008ada3,0x0008b7db,0x00055635,0x0002792f,0x000abc7a,0x0011d5b1,0x0045f4fd,0x0032e7cc,0x001ce87c,0x000b1c1f,0x00174924,0x0011a4e6,0x00129c21,0x000ea0b5, -0x0011a09d,0x000310c0,0x0002628f,0x000746fb,0x00092d45,0x000d2b6f,0x001826b1,0x00152a6a,0x0011f522,0x000a287a,0x0006d707,0x00053330,0x00054a96,0x000581d1,0x00065a98,0x000f32d8,0x0016d4c6,0x001a1760,0x001bd925,0x0012861e,0x001a27e7,0x000c96b5,0x0014508d,0x0022fec7,0x004c515f, -0x00193efc,0x00146f0a,0x006a41af,0x0052f5e9,0x003eba03,0x001c7e37,0x0016b945,0x0016f564,0x000afbd2,0x00031351,0x0002800a,0x0007b38b,0x00078773,0x00066547,0x0003c90d,0x0005537a,0x0006f7a3,0x00060854,0x0004e896,0x0005be7a,0x0006bff6,0x00058576,0x00051245,0x00063f3f,0x00072de5, -0x00062360,0x00059d99,0x000682b4,0x0007a625,0x000bf717,0x000b0bf1,0x00098956,0x001a753b,0x001e7d1f,0x003668aa,0x0040d0a9,0x00124573,0x001ceb88,0x00300bfb,0x00297622,0x001c419f,0x00160760,0x000ef196,0x0008f281,0x000686b9,0x00059c5c,0x00031b78,0x00008cab,0x000098d6,0x00017cb9, -0x0001f692,0x0001e113,0x00033a5c,0x0004c751,0x0001c33a,0x00030e3f,0x000c6a5f,0x0006e0ad,0x0007ae79,0x0005ff9e,0x0009119c,0x0009282c,0x00068c48,0x0004a1e5,0x000624d8,0x000d1efe,0x0016101c,0x001b2674,0x0028ee8d,0x0013252c,0x001cfdca,0x00162013,0x001bb021,0x00bf9cfa,0x0067138b, -0x00591842,0x00467106,0x002b2a7d,0x0011602d,0x0008a8ca,0x00098489,0x000354d3,0x00028203,0x0001ea78,0x00011cd3,0x0000fcaa,0x000235e1,0x0002b576,0x0004316e,0x00046698,0x00043132,0x00041951,0x000733e7,0x0005bdf0,0x00070ae5,0x00058712,0x0005b441,0x0005f8b4,0x0005e2e1,0x00090ad4, -0x00097269,0x000dcc03,0x000fb98d,0x00124821,0x002187f9,0x001ef09c,0x002e8972,0x00718b0d,0x00b342fc,0x00c5aab5,0x00e567ea,0x00ac3551,0x00849afd,0x0066a279,0x0067a2c0,0x0046b530,0x0019a48d,0x000dfa0c,0x00069477,0x0002f97d,0x0001c8d5,0x000197f4,0x000333e9,0x00018e57,0x00015381, -0x0002e16e,0x0001a380,0x00024934,0x0003521f,0x0003b91a,0x00045b08,0x0004c0d1,0x00047dad,0x0004e66f,0x00069351,0x0007a185,0x000a3eee,0x000c7e79,0x00136d2f,0x001e9164,0x0039586f,0x0041d111,0x00386dcb,0x004913d0,0x007d51d2,0x0062e1a5,0x0069292b,0x006d7858,0x005a94e5,0x004d7797, -0x00414138,0x003ef807,0x00445367,0x0038c3cd,0x002c020e,0x001d1605,0x00179449,0x00105638,0x000ac144,0x00050a9d,0x00026935,0x00025e1f,0x0002be29,0x00034f74,0x0002b1a2,0x000770f8,0x000bc8a5,0x000ed774,0x001535ce,0x001a4d0c,0x001d8185,0x002999ad,0x0029ece1,0x00227225,0x00204b11, -0x002344ab,0x003c6851,0x005295a6,0x005b817a,0x0052b710,0x00523e9b,0x003eadc1,0x003fc1b0,0x0039e49d,0x00387cbb,0x0039ab71,0x00334af0,0x002e4be3,0x002ad0e1,0x0025004b,0x00211d56,0x001f9021,0x0017954e,0x001355dd,0x000f6927,0x000a3ac5,0x00069c66,0x00054042,0x00038aae,0x0004eb06, -0x00062a51,0x0007d0d5,0x000b936a,0x00105407,0x001400b8,0x0018a76a,0x001f0620,0x00259794,0x002dacc4,0x003742ce,0x003b4b7c,0x004b7995,0x0064fadc,0x00529ea0,0x004baae3,0x00535e20,0x00444491,0x0026745c,0x00290014,0x0028ddc1,0x00265582,0x00257722,0x002514ec,0x002462c9,0x00241ade, -0x00201045,0x001beecc,0x0018aad0,0x00157a24,0x00128f31,0x000fc9f5,0x000d556c,0x000acfcc,0x0009c924,0x000889a0,0x00088236,0x000712b0,0x0009958b,0x000c8799,0x000f795e,0x0013357c,0x00172507,0x001bf9f3,0x001c90aa,0x001e65cb,0x001fe75b,0x0022023e,0x00228e67,0x00268963,0x00243c69, -0x0023be7c,0x0023aaef,0x0024879c,0x001e9e72,0x001f59f7,0x001efb98,0x001ee6a6,0x001f6921,0x001db936,0x001d8f9f,0x001e03dc,0x001c79c3,0x001b56ff,0x001a4de1,0x00196d39,0x0018dd6b,0x00181aed,0x00163305,0x0015076d,0x00160fbf,0x001405f3,0x0013028e,0x0011105c,0x00137a13,0x0014abe6, -0x00167b8f,0x0017e117,0x001966f0,0x001b72cc,0x001bf542,0x001cf6c5,0x001e45ae,0x001edbde,0x001fcde6,0x0020fbf9,0x00200172,0x001f762f,0x001e94bf,0x001ed155,0x00246f44,0x0000188d,0x00001682,0x00001132,0x00000f91,0x000010b7,0x0000208f,0x00000da6,0x00000966,0x00000dfb,0x000007ee, -0x00000bb3,0x0000119d,0x000010fe,0x000012cf,0x000008b6,0x00001c7a,0x00002124,0x000017c6,0x00001329,0x000011d7,0x000011c2,0x0000126b,0x000017ef,0x0000284a,0x000034ad,0x0000379d,0x0000351b,0x00002264,0x00001ef9,0x00002a3f,0x00001ff2,0x00001855,0x000007d8,0x000013fd,0x00001be7, -0x000030a2,0x00001c6a,0x000048f9,0x00001984,0x000012d9,0x0000171e,0x00005ff8,0x00000d9d,0x00001376,0x00004d94,0x00003b9d,0x00004c65,0x000053c5,0x000036bc,0x00003475,0x00001859,0x000055d2,0x00005c87,0x0000302e,0x00002567,0x00003268,0x000040ee,0x00004611,0x00006b15,0x0000d5ff, -0x00014a42,0x00016088,0x00011c18,0x00007ad2,0x00003a6e,0x00007b10,0x00003da1,0x000030be,0x00000fa3,0x00004d40,0x00007cff,0x0000caa3,0x000072c3,0x00006e7f,0x000036c4,0x00000979,0x00001300,0x0000e190,0x000014d8,0x00004357,0x000145c4,0x0001c7cf,0x0002952f,0x0002b259,0x00010f73, -0x00008f43,0x0000b717,0x0000964d,0x0000cae6,0x0000513d,0x00002f82,0x0000466c,0x00007722,0x00005d14,0x00007f97,0x00015cf7,0x0002446f,0x0002829b,0x0002821d,0x00011abc,0x0000dbce,0x0001a837,0x0000c1ba,0x00007161,0x00005ae4,0x0000e41b,0x00016430,0x0001bc2c,0x0000ec71,0x0001f7b7, -0x00004d7c,0x00008287,0x0000d772,0x00030c26,0x0000a544,0x0001df63,0x00035a67,0x0003bd12,0x00043fd7,0x000209bf,0x0000e526,0x0000d246,0x0000e6ff,0x000136d2,0x0001c659,0x000156ca,0x0000c0b8,0x0001a798,0x0002cd84,0x0002d6cc,0x000387af,0x0006e37a,0x000a9e87,0x000c2775,0x000a340d, -0x00039f0f,0x0000fdab,0x0003b122,0x0000dd22,0x0000ba5d,0x00010b63,0x0002f0cb,0x000480c5,0x0006697d,0x00038560,0x000d1439,0x00065cfd,0x0006b866,0x000433af,0x0002770c,0x00037ff1,0x0003e579,0x0004bd5f,0x0001dd4e,0x00002d3f,0x00001e8f,0x00015a8b,0x00010c26,0x0000dcab,0x0000c42b, -0x0001c855,0x00039fef,0x0004856b,0x0006d357,0x0008ca81,0x0009814a,0x0007db28,0x00076b78,0x0007a1a3,0x000a0e98,0x000c5f21,0x0007db65,0x00092345,0x000a7d74,0x000506af,0x00016603,0x0002ad3d,0x0001e2cc,0x0004615e,0x000b0f4b,0x000cbf24,0x0003cbc9,0x0003d646,0x00090f00,0x000492c4, -0x0006abc6,0x000b9afc,0x000b8b60,0x00031780,0x0000d8ab,0x00002162,0x0000656d,0x0000cd64,0x00008a0e,0x000074b6,0x00001660,0x00003c1d,0x00004c01,0x00007d12,0x0000f501,0x00027497,0x0001f785,0x000312e5,0x0003658b,0x0004c5b6,0x00054e6d,0x000a1515,0x000b38f8,0x0008d2b9,0x000bfb0d, -0x0002932d,0x000234bc,0x0003c377,0x000de9fc,0x000d5d7e,0x0009c9e5,0x0004920c,0x0016627b,0x00579caf,0x002f3925,0x0014a817,0x0003e265,0x0000e380,0x0000c341,0x00012523,0x0000972a,0x00002d75,0x00000dc0,0x00001bc9,0x00000623,0x00006739,0x00005365,0x00007ee1,0x00008ecd,0x0000370c, -0x00004a3c,0x0000bd12,0x0000d143,0x00018fc6,0x00028a5c,0x0003b245,0x00042b43,0x00061963,0x0004dd9e,0x000319c5,0x00092915,0x000cf73f,0x000c6bf3,0x000ff427,0x000d01f9,0x000c7d64,0x000fb758,0x0006b8cc,0x0010300c,0x002ca34f,0x00156cc0,0x00123487,0x00095db9,0x0000fcd8,0x0000ba62, -0x00008126,0x000006be,0x000003c2,0x00001455,0x00000c0d,0x000004e8,0x00000e51,0x0000032b,0x00002d72,0x0000e239,0x000137bf,0x00018327,0x0001b364,0x0001a04c,0x0001558f,0x0001a4a2,0x0001a52c,0x000226cf,0x0002ad98,0x0002181a,0x00012c95,0x0002d29e,0x00048803,0x0003e45e,0x0007cd59, -0x0005ee15,0x00084233,0x0008fca5,0x0006efeb,0x00066fb0,0x0009afd1,0x000a929a,0x00073235,0x000196b4,0x00004ed7,0x00002674,0x0000605c,0x00004103,0x00003dd1,0x00002857,0x00002350,0x00001349,0x00000ae0,0x00005035,0x0000f4da,0x0002249a,0x0002bb2b,0x00031bc1,0x0002d77c,0x00021ac6, -0x00014495,0x00008de1,0x00005a91,0x00010eb8,0x0002d198,0x0003dd31,0x0005831a,0x0006dac7,0x00064fe1,0x00052c9f,0x0003593c,0x0002cce0,0x00013c36,0x000210b4,0x0005156e,0x000467ca,0x0003d67a,0x00034fa9,0x0002b952,0x00026d89,0x000238d9,0x0001c3d5,0x0001525a,0x00014f70,0x00011e8d, -0x0000bdce,0x00008cf1,0x000054ca,0x00007f43,0x00008411,0x000084b8,0x00008155,0x0000c909,0x0000f1f7,0x0000d07a,0x00006cb1,0x00003b65,0x0000353c,0x0000843b,0x000143f2,0x00021ad8,0x00032d67,0x0003cf6e,0x000432b4,0x0003ba51,0x0003a1f0,0x0003fe1d,0x00035532,0x000320aa,0x0003b47b, -0x000425cb,0x000223ac,0x00028a9e,0x00027a8a,0x00029722,0x00031ef5,0x0002be85,0x00024db6,0x00023533,0x0001c329,0x00019a67,0x00018565,0x00014777,0x00013820,0x00016bdb,0x000107d6,0x00010105,0x0001434d,0x00010a32,0x0000df63,0x0000c9d9,0x0000a357,0x00009054,0x000095d0,0x00007bfb, -0x00007646,0x00008898,0x00006092,0x00007113,0x0000c701,0x0000ae1b,0x0000ba85,0x0000dc04,0x0000bcda,0x0000c562,0x00011ead,0x00019f74,0x000170c7,0x0001af48,0x0001be60,0x00019b5a,0x0001c0db,0x0001ce98,0x000210dc,0x000254bd,0x00021f61,0x0001f086,0x0001db09,0x0001c0a2,0x0001b45f, -0x0001c49f,0x000183ad,0x0001507c,0x00012d4c,0x00011706,0x00011a78,0x00011d46,0x0000fbf8,0x0000df51,0x0000c500,0x0000b27c,0x0000a5c7,0x0000a514,0x00009efb,0x0000a9de,0x0000b162,0x0000b384,0x0000ae0a,0x0000b32a,0x0000a8e2,0x0000caf7,0x0000fd65,0x00013df2,0x0000d58e,0x0000e379, -0x0000ec4c,0x0000f920,0x0001005c,0x0000fed4,0x000108c7,0x000127f9,0x00011d3d,0x0001207f,0x00011e63,0x00012629,0x000126c2,0x000130a5,0x000113de,0x00010d27,0x00010b98,0x000104d0,0x0000ff4e,0x00010050,0x0000f01d,0x0000e69c,0x0000ddd1,0x0000d629,0x0000ceee,0x0000c5ee,0x0000bd83, -0x0000b3fa,0x0000adb0,0x0000a713,0x0000a657,0x0000a53c,0x0000adce,0x0000b36a,0x0000bc7f,0x0000c4b0,0x0001253a +const Word16 defaultHRIR_rom_AlphaR16_fx[470 * 43] = { +8380,7775,8425,6286,4758,2311,6810,4794,2430,2311,2297,2492,2140,2076,2069,4661,6333,1872,4657,5906,7911,7297,7596,7708,7802, +7913,8017,8172,8326,8490,8637,8768,8988,8832,8673,8337,8173,9111,8850,4425,7313,5597,5447,5995,5510,6111,5715,4966,5588,5509, +5428,4591,5151,5582,5696,3777,7258,7551,7805,8228,8433,8746,9065,9478,9924,10419,10926,11457,12043,11896,11367,10309,9683,9651,8316, +5825,5772,4085,4094,3750,3493,2740,3462,2266,3707,2225,3353,2514,3425,3835,3814,4120,5587,7036,7387,8372,8807,9497,10140,10986, +11826,12772,13603,14483,15425,15007,14062,11994,10550,10423,7866,4642,4630,3338,2770,2490,1648,1272,810,1024,406,471,843,781,1501, +971,2337,1988,4043,5790,6413,7663,8196,9092,10018,11202,12553,14056,15581,17380,19372,19163,17462,14006,11437,12159,8420,6403,5056,3288, +2473,2537,1796,1561,1207,1251,939,727,502,1117,1807,1757,3216,3574,5866,8900,10320,12863,14405,16305,18128,19522,20714,21188,22907, +22634,20678,19250,17649,16488,13922,14454,9712,6805,6717,6100,4089,3588,2194,1640,868,1064,1036,977,1452,1686,2246,2908,4287,4261, +6522,9264,10093,12011,13150,14854,16788,18200,19367,19985,21810,22490,21338,21745,20542,18932,15947,18708,12854,6626,7008,4682,5257,2254,2652, +1342,2067,1920,1315,1661,2193,2425,3565,3674,4188,4293,5538,7722,8497,10613,11760,13772,16174,18205,19920,21140,20546,19904,19724,20141, +20908,21934,19994,19696,14444,8789,8689,4137,5110,3027,2238,1460,2207,3641,2122,1341,1542,2612,2735,3632,5077,3792,5910,7119,7778, +9645,12190,14174,15551,17646,19118,20075,22006,22960,23319,21725,20285,19691,19962,20160,16074,9348,7796,6773,3909,4721,4945,2678,2866,2189, +2083,2309,2694,3279,3377,4429,5159,4536,8360,9294,8672,8129,9740,11811,14646,16584,18589,20469,20825,21262,22504,21609,21360,21112,21236, +17518,14873,8774,8438,5620,5224,5111,3647,4076,3665,4669,2260,2307,3018,3906,4915,6419,6454,6231,8827,10823,10125,9225,9970,11052, +12459,13803,15077,16336,17298,18307,19096,19238,18928,18024,17653,15369,12744,9170,9710,6776,6187,5120,4138,3130,4890,2802,6150,2799,4979, +3199,5211,5068,5961,5945,8669,10349,9441,9951,10435,10920,11132,12577,13713,14819,15692,16493,17374,17207,17050,17058,15554,13131,13225,4934, +10890,7994,7947,9189,8409,9975,9497,7806,9191,9160,8888,7265,8289,8839,8637,4311,11002,11165,11256,11564,11702,12022,12221,12957,13451, +13964,14352,14723,15218,14647,14164,13829,13359,12277,13690,9597,6835,2300,10950,6913,2487,2243,2182,2733,2023,1902,1927,6738,9963,1264, +6597,8942,13045,11668,12097,12133,12204,12251,12250,12408,12542,12690,12880,13046,13320,13098,12995,12817,12799,13891,5006,4954,4322,6112,7089, +8487,5088,6603,8121,8137,8064,7948,8137,8219,8184,6557,5254,8533,6784,5903,4110,4659,4503,4438,4416,4415,4477,4460,4448,4429, +4403,4420,4379,4612,4707,4801,4797,5724,5829,8548,5544,6219,6049,5218,5182,4314,4626,5329,4786,4733,4718,5585,5426,5312,5505, +7345,5086,5013,5021,4802,4795,4842,5068,5075,5041,4931,4688,4519,4293,4793,5191,5555,5735,6822,7470,7732,6433,6196,5663,5121, +4567,4463,3833,4899,3928,4717,3982,4819,4646,4882,5394,5807,5512,4909,5001,4498,4405,4400,4763,4749,4727,4598,4340,4222,3860, +4975,5662,6531,7057,7788,9040,8877,6775,5522,4994,4134,3313,2499,2282,2388,2187,2165,2149,2724,3129,3850,4204,5371,5521,5256, +5273,4812,4885,5128,5854,6014,5926,5498,4617,3617,2338,3698,5123,6945,8086,10556,10664,10170,8959,7342,6368,5087,3965,2884,2310, +2588,2515,2501,2356,2710,3216,4282,4768,5758,5362,4745,4529,2890,1840,880,624,259,582,1986,2233,4302,7612,9178,10211,10431, +10804,9785,11807,12056,10031,8500,7425,5956,5656,4475,3839,3937,2586,2144,1972,2639,3249,4211,4772,6487,6931,6296,6253,4959,4863, +4452,4002,4391,5168,6417,6491,7419,9650,9588,10369,10893,10570,7938,11177,13392,9883,9308,6951,6921,5259,4776,4657,7106,5088,4737, +4099,4030,4356,5742,6686,7453,7906,7448,7301,6058,5763,4817,3685,3279,3945,5615,9352,12020,12933,13470,11505,8119,8668,5278,9651, +12599,8975,9798,7062,6796,6125,5224,5735,9887,4701,3685,5252,5482,6474,7397,7408,8565,8040,7865,7620,6647,5231,4431,4462,3987, +4375,5358,6082,7287,8045,10294,12063,12821,8345,3914,5117,10889,9189,7962,8609,6544,5002,6515,6265,7879,6188,5718,5751,6002,6989, +7301,7901,9407,7450,6866,7806,8743,7876,6647,4934,4097,3371,3072,3889,5344,6184,8588,8845,7831,5981,4289,5661,11062,8756,8961, +7727,6523,6904,6529,6755,5489,7214,6967,6564,6604,6764,6524,7686,9130,7127,6323,7741,8652,8712,8334,7631,7172,7103,7578,7594, +7518,7378,8283,8414,7787,6431,5719,7559,10354,8274,10068,9090,8876,8141,8975,7017,8804,5938,8775,7084,9037,7946,8703,8726,9705, +7813,7076,9113,9678,9855,9964,10416,9666,9122,8542,8042,7641,7186,6904,6868,6875,7141,5698,5447,13943,6628,9190,8635,6751,6778, +5201,5918,7471,6066,5773,5866,8104,7554,7450,7845,12910,6399,6554,7080,7292,7692,7945,8332,7604,7192,6776,6516,6227,5948,5991, +6008,5845,5926,4737,2959,8234,11080,15120,5989,10333,14226,14505,14425,13823,14467,14664,14529,10282,6740,15666,10870,8456,3192,4947,4726, +4850,5006,5148,5423,5226,5128,4997,4830,4673,4480,4475,4437,4429,4351,4435,2370,1920,1983,1873,1812,1744,1987,1776,1590,1583, +1639,1811,1749,1715,1639,1828,2053,1706,1872,2020,2232,2241,2289,2359,2384,2393,2372,2333,2316,2328,2299,2220,2116,1919,1843, +1824,1870,1589,1657,1888,2052,2163,1894,1909,2024,2158,2251,2466,2456,2445,2228,2279,2307,2434,2476,2354,2451,2561,2677,2852, +2925,2908,2799,2672,2653,2712,2766,2602,2300,1694,1392,1367,1455,686,1079,1911,2094,2402,1967,1823,1942,1858,2174,2771,2706, +2529,2060,2368,2468,2608,2696,2834,2652,2823,3071,3366,3579,3584,3430,3173,3080,3102,3087,2659,2080,808,324,162,357,-338, +395,1522,1615,2143,1595,1252,1521,1444,1772,2804,2484,2552,2203,2648,2744,3025,3219,3445,3039,3119,3426,3822,4052,3993,3619, +3186,3146,3428,3774,3545,2871,904,-189,-762,-556,-1501,2080,3866,3972,4417,4147,3551,3537,2770,2494,2723,2715,2480,1622,2415, +2797,3186,3377,3449,3587,3351,3618,4612,4669,4785,4640,4229,3316,1724,256,-2261,-4923,-6291,-6002,-4691,-2562,-4961,-2262,-35,-208, +91,1409,1604,2145,2714,3097,3602,2822,2676,1913,2614,2845,3037,3384,3693,3668,3348,3642,4297,3941,3155,1887,-327,-2554,-4688, +-6313,-7941,-9418,-9610,-9562,-9573,-5963,-8323,-5185,-2616,-2266,-340,-266,1663,1704,2217,2397,4849,2414,1684,1689,2921,3338,3589,4105, +4869,4458,4026,3906,3051,1520,282,-608,-2384,-4831,-7710,-11478,-14057,-15267,-15290,-13612,-11886,-9614,-9210,-7568,-5360,-3351,-967,-213,965, +1087,2684,2414,926,3027,3562,1982,2087,2056,1765,1726,3226,3408,3525,3713,2986,2498,1229,-894,-2417,-4447,-6649,-8699,-10479,-11533, +-12842,-13936,-15135,-11625,-8613,-6223,-5916,-3319,-2407,-1166,-677,159,442,662,444,2020,2151,1263,1245,962,804,592,859,596,1649, +2132,1844,1505,1336,1373,632,-228,-1374,-2908,-4958,-7002,-9902,-11404,-12070,-11085,-6844,-5856,-5913,-4045,-2649,-1721,-734,196,-115,-269, +-241,207,605,787,58,-494,-537,-919,-1363,-949,-524,-520,-106,72,299,773,105,-688,-1834,-3406,-4941,-6420,-8175,-9128,-9285, +-8544,-5762,-5989,-5811,-4450,-3878,-2788,-2201,-1206,-1333,-914,-1165,-802,-937,-864,-1246,-1567,-2167,-2574,-3134,-3230,-3223,-3884,-4142,-4156, +-4166,-4236,-4522,-4716,-4799,-5334,-5836,-6393,-6439,-6721,-7197,-6663,-3903,-3877,-5636,-3387,-3749,-3429,-2627,-2209,-1864,-2226,-2521,-2273,-2019, +-2025,-2846,-3018,-3214,-3351,-4954,-3693,-3762,-4215,-4513,-4864,-5181,-5516,-5357,-5305,-5255,-5257,-5206,-5228,-4955,-4688,-4383,-4216,-3222,-2635, +-4735,-5492,-5980,-3646,-4908,-5399,-5511,-5412,-5261,-5378,-5502,-5430,-4886,-3761,-5903,-5299,-4618,-2535,-3145,-3217,-3319,-3474,-3610,-3824,-3748, +-3734,-3708,-3649,-3596,-3569,-3452,-3374,-3266,-3221,-3112,-526,-448,-833,324,984,1971,-16,933,1994,2051,2061,1969,2125,2120,2019, +902,49,2146,897,303,-816,-492,-606,-593,-587,-583,-573,-590,-644,-735,-862,-956,-1086,-937,-811,-545,-557,-391,-576,1294, +86,638,608,330,609,342,582,937,621,514,345,717,401,305,211,1201,-519,-725,-729,-726,-689,-661,-649,-673,-879, +-1224,-1665,-1919,-2023,-1653,-1215,-510,-454,-399,-663,469,571,1039,886,1029,1464,1785,1414,2030,1200,1702,661,1071,583,417, +551,431,-225,-982,-949,-974,-965,-907,-901,-918,-1263,-1862,-2630,-3209,-3514,-2769,-2062,-601,-477,413,6,1352,1496,1427,1103, +1086,1842,1776,1960,2406,2467,2011,1034,1427,1077,1675,849,1086,-11,-1035,-959,-876,-804,-738,-582,-609,-1229,-2353,-3896,-4941, +-5087,-3902,-2275,177,511,-4961,-5698,-4533,-3233,-1504,-88,531,1195,1726,2035,2196,2297,2345,1905,1776,1203,1400,449,628,-466, +-1428,-1469,-2681,-2427,-2624,-2913,-3581,-3843,-3713,-3701,-2708,-1751,-1952,-2917,-4202,-4792,-3848,-4646,-4443,-3159,-2200,-1529,-721,-248,526, +1517,2529,2781,2674,1714,1867,1497,1333,685,758,-453,-783,-161,-104,264,386,406,1202,1536,1371,1302,830,143,-913,-1193, +-546,-3034,-828,-3129,-3322,-2000,-1353,-404,-66,150,1488,1755,1136,2933,2740,758,981,-110,-352,-1221,-976,-664,-544,906,2929, +4322,5177,5230,6177,7020,7676,8357,8170,7518,5227,3203,1545,-51,2511,281,-682,-513,-692,-136,119,17,1751,2260,558,2839, +2480,356,443,300,98,-139,94,-467,30,1178,2443,3452,5004,6844,7953,8916,9473,9522,8660,7672,5191,3950,3568,3299,4356, +3132,2168,1096,952,895,1390,1724,1958,2348,2531,2216,2005,1838,1603,1345,1179,980,1100,485,25,707,1944,3205,4038,4349, +4871,5001,4726,4463,3969,3510,3247,3400,3918,4794,3491,3175,2998,2713,2269,2197,1737,1091,1583,1911,2337,2124,2209,2256,2539, +2672,2308,2507,2641,2090,1662,1634,1331,1042,906,685,806,1008,1357,1666,1929,2252,2699,3102,3441,3742,3002,3022,2874,2588, +2377,1927,1786,1437,1775,1826,2172,2197,2337,2477,2803,3164,3669,3747,3892,3975,3801,3834,3653,3321,2994,2696,2731,2669,2545, +2628,2761,2940,3054,3242,3501,3258,3321,3408,3787,3120,3276,3199,2881,2757,2635,2948,3162,3132,3040,3183,3455,3592,3761,3828, +4352,4390,4208,4303,4335,4380,4398,4382,4282,4207,4146,4116,4045,3967,3834,3684,3543,3482,3239,3021,4080,4305,4109,3597,4069, +4041,4135,4095,4025,4112,4191,4169,4310,3934,4283,4542,4346,3393,3542,3586,3586,3627,3669,3745,3686,3646,3600,3530,3470,3423, +3379,3347,3293,3276,3611,575,481,742,-253,-776,-1485,162,-659,-1438,-1365,-1332,-1328,-1407,-1469,-1459,-708,-32,-1758,-811,-302, +725,438,538,551,605,629,658,614,605,591,645,703,890,676,591,445,551,414,335,-951,371,2,-53,270,133, +774,667,130,485,456,441,-236,-206,-120,-108,-1010,347,484,505,577,717,786,804,666,618,613,795,939,1288,685, +397,62,289,401,-82,-287,2,64,50,70,-51,511,877,110,699,234,617,-335,-367,-359,-459,-479,-102,382,442, +599,912,1032,1132,850,759,760,1162,1641,2678,1395,879,-55,276,-248,-655,-460,294,717,708,734,748,1623,1700,1387, +1553,1126,752,174,-216,-583,-348,-613,-214,303,370,475,890,1095,1015,387,87,95,864,1789,3031,1006,-221,-1470,-866, +1814,977,-174,-266,-624,-570,-210,-171,628,1089,1087,1739,1825,1384,765,256,-122,-299,-885,-523,55,301,1397,1929,2522, +3246,4226,4816,4854,5287,5082,5063,5256,5138,4643,2562,798,23,-347,-38,354,306,520,227,548,902,1144,2119,1903,1067, +874,356,-67,-223,-595,-74,-533,-928,-656,995,2546,4224,4152,4184,4084,3433,2808,2184,1678,688,-178,228,-300,319,276, +493,200,357,236,-233,1982,2218,-772,1935,1244,-742,-581,-621,-942,-639,-817,-844,-1073,-1085,-1179,-818,-670,-254,-1318,-1980, +-2416,-2686,-2927,-3160,-2949,-2171,268,-592,-1865,-1257,-495,-179,81,211,705,779,1244,1198,-886,997,1187,607,154,-538,-769, +-1153,-1301,-1234,-2038,-2576,-3066,-3853,-4675,-5346,-5663,-5982,-6442,-6615,-6648,-6737,-5080,-3589,-1161,-2062,-2637,-3023,-2070,-1476,-641,-271, +-16,153,877,861,267,59,-288,-277,-507,-615,-844,-927,-1176,-1538,-1807,-2451,-3071,-4048,-4916,-5402,-5788,-5815,-5496,-5209,-5011, +-5001,-4085,-3170,-1854,-2333,-1781,-1902,-1700,-1714,-1278,-1328,-800,192,265,233,-173,410,270,-359,-955,-1477,-1669,-2083,-2318,-2430, +-2637,-2785,-2782,-2609,-2595,-2477,-2490,-2564,-2736,-3016,-3152,-3236,-3243,-3039,-2635,-2107,-2109,-1629,-1447,-1179,-797,-448,-240,5,-92, +-205,-132,-725,-512,-1018,-906,-1518,-1878,-2141,-2262,-2950,-3166,-2978,-2949,-2762,-2629,-2490,-2790,-2951,-3045,-3073,-3123,-3196,-3116,-3086, +-3153,-2648,-2815,-2910,-2389,-2511,-2347,-2223,-2135,-1977,-1999,-2171,-2046,-2169,-2042,-2077,-2024,-2316,-2475,-2474,-2063,-3282,-3191,-3268,-3351, +-3391,-3428,-3412,-3387,-3338,-3323,-3307,-3275,-3240,-3136,-3029,-2926,-2881,-2642,-2667,-2811,-2651,-1956,-2688,-2515,-1959,-1969,-1906,-1904,-1838, +-1842,-1794,-2587,-2788,-1725,-2713,-2925,-2953,-2805,-2902,-2899,-2940,-2985,-3057,-3014,-2984,-2944,-2901,-2860,-2826,-2788,-2758,-2713,-2705,-2962, +405,533,244,1109,1512,2030,688,1392,1931,2099,2092,1908,2065,2119,2176,1433,798,2128,1412,978,23,301,225,204,182, +181,181,237,275,321,345,366,389,394,452,661,515,586,546,1615,469,780,896,676,592,641,852,937,822,788, +954,948,735,668,575,1319,100,43,46,-44,-107,-137,-104,56,209,360,464,544,564,624,732,1136,770,1118,1202, +1227,825,704,718,719,340,1165,992,915,725,1135,1190,846,479,463,434,436,-61,-311,-318,-505,-625,-628,-550,-245, +46,333,457,453,348,636,967,2044,1396,978,971,769,245,-20,312,228,-229,976,1327,534,1041,856,840,44,-289, +149,-159,105,-496,-665,-661,-869,-1018,-1115,-963,-382,181,688,887,896,558,965,1441,2747,1649,2798,2652,3156,2988,2088, +1579,1299,1169,944,948,922,1011,1017,1461,623,186,301,-71,128,-611,-1325,-1540,-2278,-2318,-2225,-2100,-1913,-1646,-1229,-1292, +-970,-869,846,1537,1843,2528,-1184,166,140,361,632,721,1089,1788,2092,1998,1172,1533,1149,1212,282,-68,-98,-486,-601, +-1757,-2510,-2833,-3333,-4942,-5746,-5832,-4564,-3451,-2315,-1399,-220,144,1269,1331,926,-737,-178,237,286,607,733,625,819,882, +1331,1669,113,1384,1612,2478,1186,644,839,288,-95,-671,-953,-1352,-1754,-2098,-1938,-1566,-688,-250,-96,-658,-845,-1401,999, +1510,193,80,299,1072,518,727,524,527,798,1571,1050,648,-243,339,426,1164,365,50,82,-35,-641,-821,-832,-835, +-473,-235,-53,1,-23,214,1068,996,1858,2577,3512,3041,1389,332,820,1461,979,1021,831,747,935,1240,755,569,-8, +546,821,1170,762,354,52,99,-19,488,338,38,-189,-146,180,404,734,902,1189,772,1079,1925,2843,2925,2293,981, +940,255,173,305,304,866,1016,654,753,714,868,354,252,542,626,931,1192,1128,876,974,1216,984,542,-138,-469, +-771,-733,-749,-682,-180,490,1256,1726,2075,2519,1744,1757,1595,1434,1120,676,670,620,691,677,941,841,1309,816,1231, +698,942,808,1015,985,1740,1801,1251,1057,726,439,54,385,565,671,844,946,1043,1378,1723,2168,1929,1568,1745,893, +1545,1323,1337,1485,1412,1524,1508,1242,1414,1316,1282,1009,1252,1270,1166,353,1658,1501,1448,1408,1307,1238,1104,1187,1200, +1246,1267,1307,1304,1373,1388,1431,1494,1441,1626,1375,1133,444,1561,1189,566,491,440,456,332,294,261,1088,1430,77, +1052,1342,1719,1449,1506,1468,1466,1467,1463,1460,1445,1429,1405,1382,1353,1371,1391,1401,1455,1561,-944,-1085,-930,-1297,-1417, +-1553,-1005,-1289,-1492,-1468,-1425,-1368,-1417,-1414,-1330,-1183,-943,-1570,-1343,-1155,-615,-801,-771,-719,-796,-846,-938,-924,-929,-908, +-953,-995,-1130,-1037,-1061,-1175,-1119,-1676,-1510,-1606,-1104,-1115,-1051,-853,-800,-561,-604,-647,-588,-502,-354,-638,-677,-903,-884, +-1352,-668,-679,-705,-571,-776,-935,-1185,-1192,-1206,-1137,-1233,-1352,-1699,-1465,-1517,-1829,-1767,-2332,-1819,-1426,-1136,-904,-752,-521, +-422,-250,-5,-150,23,-34,513,21,-161,-560,-724,-874,-509,-448,-500,-229,-597,-898,-1430,-1429,-1474,-1422,-1643,-1795,-2578, +-2136,-2292,-2873,-2553,-3721,-2801,-1889,-1352,-972,-674,-426,-308,367,757,543,616,732,1175,370,71,-605,-592,-963,-397,-259, +-258,146,-455,-1015,-1899,-1988,-2040,-1907,-2062,-2410,-3552,-2868,-3067,-4175,-3916,1620,2374,2013,1567,1236,849,886,1263,1210,1054, +1172,439,243,973,305,128,-585,-331,-840,-514,-106,-430,-90,-517,-602,-840,-676,-875,-982,-1734,-2088,-1916,-2623,-2058,-1165, +766,2694,1709,1370,1385,1481,1718,1592,1066,1640,1697,464,823,968,1770,589,294,-215,-106,-528,26,506,248,342,815, +992,459,271,74,299,324,1156,3216,3472,3268,1061,2624,656,993,980,880,853,104,584,2652,1162,659,43,-579,-48, +2850,372,6,-7,115,180,303,691,425,-172,123,210,78,138,118,231,267,682,2108,-180,-1197,-2151,-281,295,252, +536,262,370,429,678,1683,360,16,623,192,735,2579,1090,746,827,774,882,1073,1158,982,690,940,830,350,-654, +-1909,-3251,-3172,-2853,-1848,-2172,-2016,-2776,-329,-903,-408,-33,156,219,443,343,383,423,473,621,783,753,593,510,692, +800,720,676,595,518,514,433,122,-487,-1245,-2158,-2748,-3132,-2491,-1951,-1577,-1537,-1872,-3284,-1650,-1607,-564,-209,249,621, +580,632,763,858,837,456,656,625,461,558,429,157,213,289,127,-325,-265,71,587,492,5,-275,-451,-505,-725, +-903,-1153,-1045,-1344,-2152,-2180,-1182,-1420,-1042,-736,-383,-303,-134,-55,163,171,524,257,655,494,621,342,305,78,78, +-622,-646,-203,-71,-6,94,279,45,-147,-298,-399,-477,-614,-734,-858,-919,-995,-146,-80,501,167,388,431,407,533, +396,364,482,352,381,410,470,240,181,116,509,-428,-371,-384,-391,-345,-321,-259,-371,-419,-496,-559,-622,-655,-560, +-466,-383,-288,-204,-253,-183,-56,280,-224,-52,293,334,368,345,424,437,451,21,-154,454,-56,-221,-427,-268,-315, +-305,-312,-327,-337,-346,-347,-343,-337,-331,-349,-308,-286,-258,-245,-204,208,137,86,303,395,494,356,516,615,582, +576,553,582,611,655,570,422,570,524,420,115,207,184,156,150,139,132,132,130,84,164,171,115,135,137, +151,146,137,61,82,129,373,464,474,503,318,323,443,405,447,539,599,519,357,347,546,220,216,227,129, +127,116,130,143,122,-22,173,151,-14,21,61,153,188,-8,-265,-377,-110,242,395,573,671,522,426,576,518, +709,760,860,718,360,464,482,304,246,213,57,-30,-73,-74,-56,-57,-303,105,86,-330,-173,-149,-14,-13,-30, +-702,-845,-298,381,495,752,639,487,547,499,507,800,1256,967,749,311,380,462,290,225,278,40,-89,-136,19, +152,157,-265,306,15,-629,-334,-35,91,124,-381,-349,-367,-635,-392,-440,-209,328,980,1104,947,763,799,1159,745, +690,589,525,800,971,358,126,-712,-148,-237,-726,-1244,-1653,-2122,-1526,-1045,-64,-2045,-2529,-1435,-956,3109,2473,2777,2567, +2272,1751,1484,1770,1103,1056,431,470,678,1277,625,558,337,306,497,-180,-645,-400,-669,-911,-1371,-1760,-2064,-2101,-2089, +-1251,-1235,-817,-1881,-507,2968,3064,451,-254,-44,-370,-332,565,1143,2537,748,75,413,92,850,2469,1228,760,649,232, +-31,-616,-1298,-1843,-2353,-2336,-2220,-1995,-1413,-802,-402,966,1302,1045,-71,-500,-233,314,265,120,195,419,494,749,573, +880,491,405,1016,168,369,1204,747,813,336,264,389,161,446,687,487,985,1292,1683,2284,2751,2909,2156,1139,466, +-434,-273,1095,560,556,486,301,288,388,405,708,1200,664,351,200,413,619,671,508,273,-89,-176,-112,-275,68, +281,-74,543,865,1097,1543,1838,2075,1646,1313,1271,-232,-542,440,449,972,818,831,715,553,419,317,484,272,305, +414,399,399,620,552,501,498,373,309,453,609,522,242,-18,131,645,938,1039,864,827,778,1092,362,188,116, +781,612,821,741,883,983,989,1001,1013,800,645,355,472,387,449,356,426,420,400,169,514,453,44,-145,-35, +49,77,96,158,214,522,764,1104,778,537,157,363,554,406,193,226,132,59,-14,-34,20,167,227,314,336, +415,330,382,350,352,65,583,548,542,523,467,395,319,524,697,850,994,1103,1263,1105,1017,899,760,826,783, +835,765,598,767,714,585,623,613,628,626,639,657,787,853,528,776,850,928,829,850,840,828,832,806,874, +909,952,986,1021,1093,1016,974,931,877,1092,-622,-630,-589,-730,-730,-638,-569,-627,-608,-672,-670,-629,-624,-631,-656, +-625,-547,-686,-704,-669,-476,-522,-522,-546,-541,-545,-507,-607,-643,-666,-638,-687,-880,-783,-771,-806,-679,-669,-638,-691, +-545,-310,-321,-275,-240,-365,-422,-399,-313,-250,-334,-246,-288,-430,-509,-659,-450,-452,-498,-574,-570,-589,-526,-809,-899, +-923,-840,-983,-1452,-1263,-1212,-1199,-840,-896,-804,-749,-628,-64,-32,30,121,-143,-118,15,136,168,-55,146,105,-169, +-367,-477,-294,-285,-321,-473,-436,-516,-375,-927,-1109,-1208,-1090,-1370,-2212,-1819,-1746,-1820,-1126,-557,-426,-398,-78,656,636, +770,707,313,299,557,617,853,806,904,652,102,-47,-170,44,-13,-177,-464,-441,-477,-371,-1228,-1608,-1632,-1446,-1863, +-3010,-2529,-2425,-2329,-1093,-2020,-1153,-2009,-1911,-925,-268,-83,-386,618,968,418,936,882,233,547,551,-11,-290,-539,-493, +-276,-112,165,-207,-645,-763,-1014,-995,-1063,-1205,-1614,-2596,-1971,-1790,-1171,-1852,1465,2372,2281,1838,1099,545,585,1673,602, +220,135,1,449,906,828,568,-229,-386,-898,-641,-215,-458,-742,-386,-65,479,170,32,-343,-252,-1341,-3877,-2843,-2053, +-348,387,458,40,-796,-394,304,1884,1805,1155,197,-402,129,-86,95,-743,855,985,-768,-364,-554,-598,-808,-632,-217, +-434,-700,-705,-905,-534,78,882,1636,2168,3183,3596,4747,1882,234,383,376,457,262,446,417,310,989,916,643,535, +718,204,1140,1123,-14,-94,-367,-304,-596,-686,-520,-900,-743,33,557,1250,1571,2820,2657,1557,144,-629,-225,-261,288, +128,153,193,289,788,809,414,346,172,292,102,93,370,116,85,172,181,-15,-159,-256,-163,462,457,593,1024, +620,323,-392,109,-5,-322,-294,-176,329,328,30,50,14,18,-118,44,140,217,190,154,94,280,427,457,243, +120,-11,4,46,-177,-144,-90,-146,348,399,83,-293,-373,-267,325,213,-608,-826,-798,-214,-120,-33,145,161,172, +241,237,185,196,323,404,572,320,217,-27,125,132,235,236,371,134,0,156,128,-87,-304,-449,-169,62,271, +-125,-396,-637,-411,-329,-286,-173,-232,-267,-120,-247,-231,-196,-171,-236,-192,-252,-207,-222,-153,-142,31,66,105,192, +507,317,373,393,447,507,598,643,485,295,182,52,-41,-218,-224,-236,-231,-221,-441,-473,-346,-228,11,-357,-201, +-37,-51,-29,-28,-1,13,26,-205,-341,179,-98,-204,-343,-267,-269,-259,-242,-238,-197,-274,-317,-383,-413,-449,-496, +-464,-458,-449,-454,-657,174,170,124,110,96,108,145,180,190,133,124,109,150,155,114,217,232,164,202,183, +97,143,143,108,131,140,133,175,187,238,128,116,187,184,208,227,211,273,162,-78,-51,104,103,172,296, +177,152,144,231,244,172,292,312,315,206,167,54,131,138,50,102,121,125,276,331,420,91,54,293,267, +308,330,340,218,-84,-364,-327,-27,-48,91,432,119,84,111,243,318,88,356,395,394,185,103,-103,65,67, +-116,-10,55,64,336,390,605,-25,-114,494,424,601,500,385,462,75,-526,-512,87,38,266,685,233,211,265, +624,702,209,627,672,519,240,100,-200,28,37,-231,-39,18,62,558,776,1042,-49,-104,863,732,764,756,623, +-1893,-1510,-1376,-1119,-814,-413,-321,-271,221,642,316,673,627,334,477,266,-35,-149,-151,-314,-347,-319,-453,-555,-362, +49,17,-108,66,-689,-816,-1118,74,326,-568,-1443,-1538,-89,210,-93,-781,142,617,860,348,-98,166,-28,298,414, +770,812,505,348,267,238,-239,-309,-68,-1000,-1535,-1487,-1480,-1315,-856,-2058,-2050,-2015,-1226,-1646,-2929,-2070,3008,2009,1043, +1368,1927,2226,1483,-250,271,41,137,135,323,-488,1138,1320,110,-129,-518,-531,-578,-513,-390,-621,-620,-364,-797,-976, +-804,-1309,-1472,-2322,1015,2827,2577,3333,200,52,110,125,53,602,941,813,992,665,168,452,461,-282,624,663,12, +120,-231,-628,-991,-1309,-1648,-2084,-2375,-2560,-2362,-1546,-218,502,1095,278,1668,1537,509,418,502,528,498,598,660,779, +621,241,209,207,14,76,251,466,836,787,387,427,370,529,549,528,540,577,837,984,1434,1677,2046,1075,331, +-840,306,904,1163,728,891,606,468,384,387,555,710,694,753,634,487,422,378,297,301,260,185,-8,-132,52, +87,-44,-135,-823,-1022,-755,-278,54,392,-342,-433,-259,388,766,1065,1082,635,690,574,467,336,320,273,231,214, +304,301,431,354,484,411,490,480,401,224,349,452,332,382,558,710,760,599,402,248,171,94,-58,128,326, +559,587,122,241,117,355,358,402,515,603,577,500,378,372,328,266,180,169,194,179,76,127,54,37,-26, +-102,-185,-216,-258,-261,-289,-284,-278,-290,-182,-128,-49,27,182,244,106,25,-144,240,92,-58,-97,-112,-115,-161, +-193,-229,17,155,-225,-18,80,192,142,134,123,114,108,91,94,93,97,83,74,60,91,117,138,171,244, +-168,-218,-192,-199,-196,-198,-170,-152,-81,-142,-157,-158,-148,-138,-117,-120,-105,-79,-117,-119,-66,-137,-142,-103,-160, +-175,-181,-163,-172,-184,-254,-257,-201,-180,-179,-189,-225,-402,-356,-300,-318,-316,-155,-58,47,-71,-121,-125,-120,-85, +10,5,42,63,48,-59,17,-92,-143,-34,-195,-227,-245,-211,-255,-320,-529,-531,-335,-220,-180,-232,-356,-600,-353, +-285,-301,-372,-120,52,322,34,-53,-35,-34,77,299,202,260,354,262,99,123,-34,-120,100,-198,-265,-306,-240, +-349,-416,-800,-765,-400,-280,-316,-352,-579,-747,-529,-566,-656,-537,-88,227,654,168,118,139,413,362,331,363,517, +531,365,154,275,91,-81,258,-187,-284,-314,-330,-434,-629,-1274,-1272,-596,-293,-182,-197,-581,-1332,-868,-153,-3,-378, +-523,-399,88,59,285,227,303,525,892,379,289,500,219,-198,-437,-156,-155,52,-375,-532,-741,-705,-947,-1558,-766, +-453,-349,-571,-1054,-1990,-1564,-1840,-1332,-1425,-1008,-232,551,650,-280,-13,-139,108,-20,-56,-214,710,757,206,-48,-242, +-216,-76,-143,-241,-32,215,-47,223,-164,-900,-1733,-1466,424,284,250,-485,-1438,2748,3434,2883,2581,2563,1401,734,-147, +295,119,29,55,73,-59,175,346,773,85,-217,-239,-100,-268,-582,-1005,-1114,-1295,-397,-351,-529,-1822,-1892,-326,-1511, +-1113,479,1789,-245,-4,55,449,755,1057,1121,962,267,-28,149,149,90,120,223,324,813,155,-167,-291,-589,-863, +-888,-966,-831,-908,-685,-1015,-935,-1698,-854,1592,2335,2650,1843,508,372,581,563,648,725,658,505,364,470,660,947, +607,528,428,791,759,502,257,256,223,70,49,26,-239,-271,-134,475,824,1213,636,554,1221,305,-46,-345,15, +-483,-314,-73,159,430,628,717,592,692,654,617,516,434,299,290,412,632,623,537,418,432,545,721,1053,1279, +1237,975,443,-194,-347,-261,239,315,312,78,-344,265,113,206,177,148,190,257,350,339,327,351,447,595,737, +571,341,99,282,553,549,490,580,571,448,335,298,151,85,-18,209,339,441,406,415,504,409,413,457,447, +489,519,573,594,630,608,610,603,586,549,547,449,395,311,201,68,-80,-89,-115,-130,-115,-101,-105,-41,19, +60,98,133,202,254,297,316,346,372,402,381,400,418,387,402,434,436,443,446,452,457,474,413,357,380, +312,266,219,244,239,237,230,220,203,237,258,282,290,297,298,303,314,333,356,367,86,-19,77,48,46, +-5,103,115,119,86,66,34,47,67,130,134,145,130,161,157,117,99,84,75,83,71,35,26,34,93, +59,75,172,71,40,42,-19,-171,11,-149,-81,-160,106,193,205,133,73,21,27,81,231,217,255,282,312, +320,233,143,105,64,91,60,-21,-26,2,133,57,128,350,146,59,31,-164,-498,-67,-247,-113,-294,108,259, +317,179,33,-58,-49,81,381,366,408,436,512,512,372,185,102,54,93,36,-144,-218,-178,174,13,135,564, +23,-139,-178,-563,-755,-233,-597,-582,-666,144,400,519,236,64,-28,162,316,718,475,571,768,850,827,564,268, +169,30,81,-8,-202,-228,-85,281,-44,246,936,292,3,-79,-811,-1062,-1310,471,690,-356,-238,-139,211,-125,-29, +196,27,199,625,392,344,436,276,233,226,-76,-248,-457,26,-29,-599,-1004,-873,-499,933,924,-412,-584,-998,-1519, +-1324,-572,-1559,-1451,-994,209,169,110,-276,-49,-54,63,15,-15,183,406,512,837,544,400,36,-39,21,132,-258, +-429,-396,-856,-1158,-1802,-891,-371,245,-61,50,390,223,-426,848,2178,1837,1691,301,-29,-28,-25,-54,39,123,-167, +130,-364,-58,1338,466,70,-119,-80,-203,-272,48,153,-135,-580,-1078,-1956,-1256,-1342,-1239,-2556,-3188,-3597,-1819,2611,1411, +952,1033,1423,1171,927,619,102,3,43,-7,4,407,116,162,878,-91,-387,-406,-591,-545,-438,-409,-295,-83,109, +-222,-1471,-1519,-1479,-441,485,1652,2647,2965,249,398,483,531,722,540,584,805,769,739,702,642,504,197,287,371, +595,276,12,-219,-374,-617,-938,-843,-816,-696,-949,-796,-520,928,1834,2396,1882,1079,224,231,454,418,405,557,747, +653,567,470,221,165,276,289,318,458,588,538,324,393,448,512,601,752,965,1170,1218,1301,1070,1067,1052,1062, +917,711,411,333,259,392,64,72,186,303,376,390,444,508,466,418,349,320,365,332,255,195,181,37,-136, +-233,-213,-274,-302,-303,-286,-271,-146,-16,141,226,303,349,266,149,33,17,484,510,511,451,455,416,370,357, +335,358,379,376,366,382,349,317,296,262,221,237,282,316,356,380,402,411,408,386,358,314,285,289,329, +390,437,480,444,464,444,417,379,405,378,363,379,375,371,375,374,375,360,378,293,321,333,361,352,352, +353,356,363,376,366,367,375,395,410,408,416,417,422,428,531,-66,-106,-39,-55,-54,-82,-14,-10,-10,-21, +-43,-77,-71,-62,-32,-16,-2,18,-19,-36,-34,-61,-77,-87,-83,-84,-105,-65,-55,-71,-62,-73,-98,-120,-128, +-91,-124,-174,-35,-38,-33,-152,90,141,73,44,-22,-100,-108,-67,-2,89,138,124,102,62,15,-72,-117,-127, +-119,-123,-188,-103,-101,-172,-130,-155,-225,-260,-252,-131,-212,-289,54,3,27,-180,233,316,201,177,20,-142,-163, +-79,112,303,361,324,270,195,142,-69,-147,-178,-182,-200,-323,-101,-32,-183,-94,-170,-364,-435,-488,-208,-360,-183, +214,77,-61,-379,376,525,469,326,61,-70,-36,149,474,458,568,634,604,441,317,-57,-217,-220,-223,-236,-463, +-166,-167,-492,-311,-387,-633,-661,-559,-104,-290,-1147,-1391,-97,470,-63,169,234,333,-220,-307,57,-104,63,397,621, +617,258,321,289,159,105,33,87,-166,-397,-647,-208,94,387,479,187,-356,-843,-1288,-1550,-1319,126,-883,-814,-402, +445,-149,-503,-480,-309,-226,-214,18,-6,-29,-171,38,790,325,91,-9,82,48,1,230,6,-599,-835,-759,-245, +170,142,-580,-303,2,462,322,-3544,-2166,-475,-161,-302,-456,-253,92,53,45,-70,6,-173,45,-144,0,560,459, +418,194,169,182,131,180,17,-19,-614,-673,-451,30,143,-741,-661,-1607,-2581,-3614,3369,3049,2457,2056,1839,1328,812, +334,306,164,-34,14,-4,179,126,199,454,301,124,-182,3,21,-142,176,-55,-329,-1349,-1454,-906,-220,-221,-1168, +-1253,-440,1484,2719,326,269,369,538,809,673,723,856,707,590,436,618,477,177,80,147,510,251,122,-148,-274, +-354,-524,-711,-1095,-1428,-1861,-1719,-1084,-488,429,1375,1970,2049,1813,801,600,687,839,827,685,515,374,342,219,167, +93,200,372,490,531,474,512,282,274,193,89,-9,-173,21,175,182,800,1227,1559,1586,1408,1075,492,197,234, +440,204,291,339,456,581,590,605,623,615,609,569,517,366,292,374,525,657,621,540,541,621,668,698,633, +578,489,485,440,453,270,137,42,109,123,34,107,328,283,306,251,247,241,221,198,192,200,208,230,266, +285,309,328,306,342,338,516,460,372,335,286,259,234,295,345,399,443,486,486,436,398,386,367,260,234, +325,362,423,299,370,423,426,425,427,422,421,422,375,344,439,423,405,418,366,356,327,305,280,237,253, +256,257,269,283,316,306,300,289,270,301,113,89,93,89,74,-6,130,121,58,77,58,5,14,20,31, +107,143,96,101,94,81,92,88,66,86,97,94,142,137,86,61,55,105,73,76,99,93,115,143,146, +163,-12,188,234,140,194,140,-2,18,42,76,204,251,245,167,100,47,68,60,8,52,89,91,238,219, +89,28,34,207,134,141,159,111,55,27,110,132,-194,314,357,136,265,153,-154,-95,-48,29,332,419,387, +236,154,12,46,20,-103,1,69,47,357,320,18,-123,-176,163,13,49,102,71,112,236,460,319,-302,378, +589,361,481,171,-213,-175,38,250,605,681,537,393,222,-42,-29,-43,-233,-62,37,18,519,410,-34,-177,-100, +481,335,350,298,115,-352,-922,-1275,-675,315,383,290,4,-230,-337,-156,-132,36,211,525,603,404,402,347,366, +44,-112,-165,-218,-175,-12,237,409,734,-220,-721,-542,-974,-845,-379,-222,-339,-88,188,64,-440,-557,-519,-310,-278, +-220,-271,46,66,-21,-75,-4,267,432,444,142,-106,-256,-382,-451,-565,-599,-444,-259,263,210,333,317,545,374, +-28,-438,-1360,-2195,-1836,-1234,-770,-357,-119,-144,-57,62,-95,-18,-49,-86,29,-137,-270,282,385,-30,-183,-331,-385, +-454,-634,-933,-662,-495,-200,-544,-875,-1082,-1137,-650,-159,-815,761,1787,2511,2110,1705,1009,516,48,160,29,-60,26, +0,-137,-57,16,-97,470,499,-148,22,-56,-90,-408,-625,-1044,-675,-631,-759,-919,-904,-770,-1468,-1685,-1266,-328,2225, +1634,1231,1111,935,849,767,670,589,414,145,78,148,442,153,52,14,25,-111,-543,-785,-972,-969,-953,-798,-885, +-340,-461,-1190,-1264,-1286,-1054,298,1433,2202,2361,521,502,502,509,406,422,455,461,536,547,511,388,293,249,364, +451,445,323,112,-132,-266,-373,-430,-683,-745,-587,-349,-71,221,814,1236,1372,1417,1178,801,615,608,647,612,633, +689,599,490,399,436,446,513,497,521,467,479,433,430,478,549,631,679,712,766,861,953,1035,1060,1096,1120, +869,666,546,492,480,442,550,229,232,191,233,211,199,229,228,264,273,286,300,330,362,435,510,593,663, +733,745,697,685,645,615,571,529,473,417,396,376,368,314,301,274,252,234,213,213,147,120,94,179,137, +116,118,124,129,137,138,131,198,250,216,256,295,340,336,337,340,340,344,356,330,305,268,245,221,200, +215,223,230,224,216,67,46,2,52,66,38,85,91,73,99,93,67,60,60,58,80,96,155,110,93, +74,67,61,53,47,56,104,75,51,-30,11,24,56,58,67,85,58,23,-20,140,120,22,113,128,85, +130,115,53,19,20,44,129,177,252,181,121,89,80,52,42,14,47,168,83,-10,-184,-101,-36,79,88, +100,114,57,-19,-160,30,60,-118,223,222,45,183,155,-8,-25,-42,10,177,310,459,310,180,91,108,48, +19,-32,33,276,133,-9,-425,-242,-162,34,111,134,194,68,-40,-124,379,304,-220,191,395,190,413,247,-159, +-195,-64,100,425,533,620,374,169,60,81,-12,-38,-102,29,393,121,-268,-780,-445,-150,183,234,289,257,121, +-72,-370,-1387,-957,694,341,167,31,-185,-279,-203,-17,90,47,241,432,763,416,269,257,276,232,137,-112,-92, +243,334,386,535,-810,-1117,-481,-444,-330,-322,25,-271,-119,547,295,-673,-823,-708,-364,-294,-164,-207,-36,15,-44, +-10,-94,-247,207,288,47,-46,-231,-313,-215,-170,-252,-29,-54,-99,-109,-180,-477,-7,-60,-577,-380,672,-349,-910, +-824,-615,-279,17,-135,-124,28,33,19,30,34,188,-37,-356,227,266,-126,-234,-413,-479,-630,-565,-386,-169,-257, +-703,-753,-776,-1065,-318,19,103,828,-2512,-801,436,610,582,-48,-307,-388,-134,-166,-222,-71,-52,-237,-189,-191,-284, +181,221,14,-229,-401,-299,-301,-262,-298,-290,-289,-275,-254,-357,-886,-380,-922,-2365,-2729,2292,2567,2102,1718,1324,1380, +1247,834,532,283,68,15,63,183,139,63,-183,-104,-204,-292,-254,-305,-305,-255,-157,5,-308,-453,-378,-671,-998, +-1525,-1386,-599,689,1645,1140,845,793,807,677,728,706,578,668,665,625,614,458,160,-17,-49,44,213,177,-67, +-254,-432,-586,-793,-1005,-1201,-1422,-1343,-885,-568,71,911,1681,1943,1747,1417,1019,847,714,642,548,463,367,270,271, +298,298,330,345,400,427,431,420,389,459,390,333,347,317,456,582,702,927,1116,1282,1350,1427,1514,1303,1206, +1186,1107,759,740,525,689,607,613,659,637,673,626,595,590,567,535,485,449,452,420,381,303,383,467,527, +601,663,728,730,739,760,810,859,947,925,898,846,784,727,749,632,570,463,671,574,468,456,462,468,464, +467,471,538,581,447,501,523,553,603,631,671,698,727,766,765,775,783,788,786,790,765,755,747,748,778, +101,53,37,59,74,84,96,75,62,69,75,97,63,58,57,85,108,124,128,132,126,120,114,105,95, +93,130,61,40,33,53,71,90,114,110,65,66,12,0,40,116,169,88,68,98,111,122,152,80,65, +74,124,170,230,235,216,188,192,165,133,101,86,162,-34,-94,-70,-36,30,75,148,133,8,20,-126,-208, +-48,90,204,118,73,88,99,146,199,86,19,57,154,264,391,391,356,256,271,220,160,105,95,281,-118, +-228,-235,-134,2,82,250,218,-76,-80,-214,-240,30,206,245,64,102,99,227,219,74,-98,-54,89,300,436, +603,485,437,330,383,292,176,89,88,303,-303,-579,-491,-297,-8,45,265,195,-244,-197,-207,-241,-818,-678,416, +412,348,75,22,-52,-140,74,81,-33,175,358,609,543,448,193,216,170,105,112,134,276,63,146,563,-416, +-481,145,392,481,177,14,348,448,244,104,-334,-480,-432,-262,-208,-100,-71,-67,17,94,177,77,-21,134,210, +365,226,75,-17,-150,-140,-66,-308,-406,-324,-388,-384,-327,-671,-899,-1061,-183,263,447,55,-224,-552,-316,-165,-370, +-255,-71,31,-8,13,50,62,7,-5,125,124,265,27,-43,131,79,41,-46,-118,-194,-285,-509,-475,-59,325, +489,444,206,-2423,-2115,-1495,-1055,-781,-727,-591,-576,-364,-262,-132,-2,49,-31,-12,-64,-104,-125,-5,432,162,10, +-156,-225,-234,-203,-163,-152,-68,-325,-476,-229,-829,-1056,-975,-2033,832,1517,1885,1743,1456,1557,1177,453,332,147,167, +10,-67,-120,10,28,-113,137,134,124,-92,-159,-47,-156,-349,-571,-515,-577,-686,-637,-645,-612,-1186,-1355,-1006,31, +1248,1208,1171,1075,910,803,804,872,807,733,697,540,443,419,216,100,-51,-84,-160,-266,-472,-592,-651,-766,-745, +-549,-688,-770,-887,-1011,-1085,-1023,-289,407,925,1128,1252,1101,998,922,807,777,742,671,580,555,450,474,444,454, +397,329,265,147,39,-84,-101,-122,-152,-102,-99,-100,-51,17,54,530,1009,1440,1477,1492,1614,1395,1057,1100,1055, +1044,1004,979,953,928,907,871,825,791,737,676,630,586,560,523,500,433,496,552,600,645,700,752,807,859, +877,894,857,894,902,949,980,1020,926,949,920,898,860,893,858,814,796,777,767,746,735,727,748,747,696, +704,702,672,704,722,746,765,783,803,817,836,867,877,898,908,911,909,903,917,961,147,106,99,113,132, +195,136,111,129,109,118,165,120,109,96,125,141,145,165,173,173,159,151,142,139,127,116,75,62,51, +112,133,115,155,155,114,117,112,102,119,202,362,134,85,174,132,153,245,143,117,102,147,184,217,269, +260,239,223,198,174,166,120,73,-56,-85,-79,82,147,80,175,156,58,100,36,-18,73,210,569,129,65, +238,112,154,364,157,77,87,166,251,322,416,414,344,303,244,200,175,103,38,-220,-291,-308,47,192,28, +264,241,35,72,122,64,173,366,827,111,-49,222,143,216,385,59,-33,89,237,379,504,565,538,430,407, +317,267,219,83,-76,-503,-620,-568,12,214,-78,202,147,-168,17,-75,-293,-432,-332,-50,313,486,379,147,0, +-57,112,141,69,239,349,455,685,656,375,350,205,78,7,40,161,69,27,-90,-139,16,475,445,534,607, +275,355,1309,87,-267,-135,-177,-205,-216,-73,7,-26,-84,-32,79,172,154,180,59,77,337,184,102,26,-119, +-186,-179,-173,-27,208,143,19,137,-1000,-1211,-527,-324,-144,-11,179,11,-634,-409,-240,-262,-240,-136,11,14,93, +82,111,186,265,107,195,703,315,185,134,46,26,58,-174,-277,-190,-56,94,193,627,537,-40,-41,63,-922, +-1598,-1466,-1147,-597,-256,-257,-230,-118,7,-12,8,68,69,-10,-34,-79,29,364,164,53,-138,-234,-378,-311,-360, +-248,-26,3,-161,-611,-582,-621,-745,80,-1810,-1023,45,424,566,444,116,-189,-128,-135,-26,84,59,-81,50,113, +176,-40,-58,207,88,-44,-262,-322,-306,-145,-289,-265,-103,-277,-301,-329,-215,-581,-1358,-1716,1295,1604,1629,1455,1348, +1050,1000,1178,1001,824,553,489,471,459,305,85,-144,-237,-278,-175,-296,-329,-262,-334,-318,-301,-327,-390,-586,-665, +-869,-1151,-1226,-882,-40,710,729,877,892,925,932,945,946,936,834,753,682,533,408,258,240,215,180,138,66, +-54,-188,-289,-410,-501,-586,-681,-733,-797,-891,-631,-410,-193,164,442,673,673,705,745,903,783,841,849,832,846, +759,702,667,586,533,477,433,317,225,141,161,-29,12,50,77,110,131,145,211,293,364,415,452,483,499, +523,583,656,647,632,758,816,894,731,818,892,869,852,825,817,806,789,664,574,723,605,533,398,441,432, +435,434,439,437,474,498,527,545,572,606,614,623,622,629,741,183,158,163,168,178,243,161,150,173,154, +157,190,161,152,145,157,165,167,191,202,214,193,182,172,169,151,110,106,105,102,160,176,146,187,187, +150,164,174,214,230,288,408,178,121,200,174,199,245,193,172,152,173,191,214,279,298,315,264,234,204, +191,126,6,-27,-20,-7,160,208,109,210,190,102,137,167,159,225,293,590,156,97,261,166,182,321,186, +141,125,182,228,241,382,420,433,337,274,216,196,75,-136,-193,-187,-142,152,254,66,268,279,112,190,228, +297,408,606,971,199,-50,271,162,231,485,142,25,152,268,324,368,553,599,593,461,365,287,221,-1,-382, +-526,-464,-353,143,264,-35,260,151,-96,50,126,-14,-355,-486,-415,219,574,557,287,28,-91,97,175,145,337, +378,391,495,501,481,228,97,78,55,73,59,301,268,-226,271,360,183,287,646,1295,576,-37,1171,199,-175, +139,-123,-144,-83,68,151,79,1,32,154,140,213,286,215,204,292,179,122,-15,-41,-12,118,181,299,358, +159,208,494,-335,-707,-606,-579,-211,-162,-153,-178,-394,-469,-419,-94,-189,-158,-24,48,123,36,128,248,270,86, +183,426,313,279,110,94,42,54,-207,-213,115,139,250,370,305,298,29,-57,205,228,-536,-832,-677,-417,-134, +24,-57,62,85,-1,20,162,152,148,169,217,214,169,226,211,73,148,135,67,-178,-183,-9,-257,-320,-334, +-544,-531,-265,-13,-1780,-2038,-1284,-680,-335,-585,-673,-434,-421,-339,-127,93,139,73,46,63,204,36,37,194,224, +158,-48,-121,-191,-264,-197,-139,-239,-39,-60,-215,-416,-588,-742,-1383,-55,528,901,832,889,835,786,861,763,659, +439,363,247,167,205,159,125,-21,-60,-49,-75,-81,-114,-102,-147,-170,-175,-250,-426,-298,-342,-517,-691,-837,-858, +-471,375,715,805,882,1032,949,886,829,761,669,632,556,529,458,322,193,66,-80,-255,-406,-506,-611,-719,-746, +-770,-798,-845,-885,-930,-973,-1034,-1115,-761,-421,-138,169,178,231,419,285,362,394,383,436,318,275,225,130,55, +-7,21,26,-6,-1,53,33,-13,-68,-123,-183,-250,-324,-272,-233,-190,-149,-88,-68,-10,12,62,111,42,29, +153,234,373,121,246,406,374,348,317,304,285,252,138,43,249,130,67,-22,-40,-64,-88,-114,-136,-174,-144, +-131,-116,-104,-95,-83,-58,-30,-5,16,-41,168,167,152,167,174,213,142,146,164,171,173,176,176,171,152, +147,148,174,179,181,185,173,163,153,152,139,110,110,110,105,137,147,137,157,163,154,168,200,190,258, +249,294,150,112,146,180,216,206,219,192,134,146,156,209,235,277,283,231,203,166,161,123,42,28,28, +28,131,160,126,162,159,141,179,253,197,267,245,391,118,89,172,205,233,235,231,199,86,138,162,237, +297,347,396,280,237,164,164,72,-75,-84,-69,-64,86,151,93,170,212,186,276,302,295,447,540,671,165, +-45,153,193,288,413,218,105,78,217,229,306,446,554,618,411,298,174,145,16,-255,-325,-265,-201,102,155, +72,151,101,54,201,365,92,-123,-375,-534,68,449,593,470,153,-99,61,146,208,368,339,311,233,236,244, +86,121,189,114,122,129,593,504,-270,61,110,70,164,518,1200,727,-463,26,409,339,172,2,-142,-162,31, +174,227,95,68,147,134,253,321,324,324,211,286,256,34,75,105,149,314,303,-34,173,120,-151,-257,-438, +-631,-581,-223,-106,-84,-114,-45,-225,-340,69,-69,-93,11,86,134,77,127,246,147,94,121,134,368,398,162, +246,154,-20,-6,56,154,360,500,514,230,48,-144,-174,47,-278,-96,-140,-246,-253,-122,213,62,139,146,51, +60,163,194,272,285,325,303,162,275,301,244,282,241,17,87,27,-185,-275,-334,-429,-36,127,-8,152,-377, +-748,-967,-887,-724,-730,-635,-402,-405,-344,-239,-64,66,177,131,137,201,173,190,132,260,252,144,20,-37,-31, +29,16,-104,87,-47,-471,-594,-655,-685,-443,-977,-761,-449,-247,-72,201,260,205,130,115,114,263,273,249,199, +166,179,31,-24,13,155,185,152,-6,-95,-192,-216,-249,-263,-343,-183,208,66,-138,-438,-804,-161,74,263,322, +512,478,442,455,483,468,512,388,363,264,207,107,42,-3,-63,-71,-170,-290,-380,-439,-490,-562,-527,-515,-478, +-572,-705,-865,-811,-716,-627,-350,-131,-63,42,-24,31,35,59,95,54,33,28,-9,-24,-40,-55,-91,-130,-164, +-159,-288,-339,-368,-412,-462,-515,-578,-563,-561,-552,-533,-485,-463,-354,-287,-236,-183,-248,-232,-208,-174,-133,-194,-154, +-103,-118,-123,-139,-135,-143,-149,-196,-239,-178,-241,-271,-330,-332,-358,-379,-399,-416,-442,-425,-417,-409,-402,-399,-401, +-375,-347,-307,-281,-373,139,143,120,129,132,147,116,123,125,147,154,148,162,158,127,123,121,156,143,138, +126,130,128,127,131,129,120,116,115,121,115,117,122,126,126,112,140,148,124,174,155,165,111,96,88, +151,186,171,223,196,113,115,123,194,175,199,160,145,140,135,151,145,113,106,106,136,128,119,121,108, +103,79,137,225,124,152,121,175,78,79,87,182,226,188,273,250,69,108,116,242,200,217,188,146,151, +131,165,144,91,88,86,145,89,97,120,119,118,63,215,156,120,231,289,324,95,-2,28,159,274,291, +295,180,-16,138,170,332,311,363,294,184,153,115,165,150,24,24,58,215,192,103,104,28,-13,-77,120, +538,240,-89,-372,-483,-71,212,383,584,349,-29,13,102,324,331,268,238,109,52,11,89,181,245,222,226, +235,499,330,-226,-234,-121,293,287,432,777,634,-501,-928,616,859,-2,241,105,-152,23,172,331,163,95,164, +232,347,245,240,229,125,315,286,111,132,189,279,275,186,-207,305,80,-846,-459,-334,-413,-362,-86,-211,-210, +-159,140,80,-79,132,62,-13,65,59,103,117,43,96,-11,-35,4,1,187,213,94,84,-2,-47,111,262, +146,377,446,392,173,16,190,-2,34,37,128,174,-36,-31,-55,8,1,58,98,43,61,123,168,241,170, +170,193,117,173,209,211,160,126,96,84,-106,-485,-332,-282,-180,40,183,288,56,-97,-175,-460,-695,-869,-605, +-436,-335,-236,-196,-184,-149,-32,184,112,117,100,194,195,51,148,217,271,221,149,45,14,-56,-166,-140,-130, +-146,-290,-329,-234,-118,-770,-874,-866,-641,-335,-149,-143,-308,-296,-237,-118,62,147,167,88,67,62,95,122,123, +222,220,148,119,48,-2,-85,-116,-71,-188,-278,-340,-134,-121,-340,-580,-448,-454,-307,-266,-162,-134,-80,-7,109, +168,286,188,177,144,96,44,-6,-49,-84,-137,-102,-64,-20,-63,-111,-165,-168,-183,-189,-170,-125,-113,-233,-346, +-417,-426,-194,-143,-74,-77,-27,-9,14,45,10,-14,-20,-31,-31,-34,-88,-123,-162,-198,-274,-255,-288,-341,-379, +-424,-452,-489,-466,-461,-469,-476,-500,-502,-437,-360,-304,-248,-272,-253,-264,-255,-251,-231,-228,-210,-221,-223,-237,-238, +-250,-254,-258,-250,-303,-295,-295,-267,-294,-305,-320,-328,-340,-358,-359,-361,-358,-356,-352,-364,-339,-327,-309,-292,-357, +99,98,87,95,97,105,91,101,101,118,126,123,145,142,110,100,86,122,101,96,79,86,87,96,95, +95,89,82,82,108,84,82,92,78,74,62,89,82,62,83,83,101,95,90,71,116,141,140,202,184, +107,95,90,133,113,115,76,77,84,107,107,96,79,61,77,160,104,88,98,40,23,7,70,144,97, +87,66,81,77,101,86,156,203,180,298,282,110,108,85,162,119,106,60,58,81,123,128,123,87,54, +51,215,80,70,116,17,-9,-61,85,54,21,28,100,159,82,57,13,128,201,182,346,255,1,95,148, +309,181,131,31,12,44,112,125,80,8,-15,81,380,190,102,114,-118,-192,-221,3,392,317,46,-235,-464, +-79,134,165,545,488,151,17,88,372,235,166,169,69,45,78,178,213,258,239,306,491,174,-130,-365,-309, +-101,268,414,448,401,340,-236,-1081,314,709,-21,245,174,46,40,109,345,252,184,161,290,351,135,144,153, +137,213,240,289,283,289,281,187,127,-25,420,239,-391,-293,-249,-201,-37,191,-250,-255,-199,47,247,184,62, +122,84,95,74,116,151,11,-55,-129,-101,-71,-94,-17,55,173,-67,-137,-63,128,269,179,358,267,64,37, +72,378,297,203,303,266,185,-19,12,-40,-107,-13,20,59,62,74,74,118,144,46,32,46,94,145,153, +186,63,4,33,-26,-147,-338,-150,-100,-33,81,177,277,186,-177,-304,-431,-605,-842,-700,-527,-327,-165,-83,-70, +-106,-48,65,66,76,0,78,94,81,6,33,179,161,122,6,-42,-113,-157,-319,-305,-50,-84,-91,-67,-98, +-431,-508,-543,-420,-187,-272,-342,-413,-409,-361,-260,-217,-115,65,44,74,67,152,162,149,119,130,225,112,61, +-43,-72,-111,-153,-163,-289,-491,-605,-579,-441,-439,-586,-678,-598,-571,-519,-421,-296,-187,-94,-39,55,52,99,127, +63,21,-30,-10,-3,59,149,196,276,214,167,115,76,32,-29,-12,17,61,-67,-225,-380,-498,-227,-220,-164, +-132,-93,-79,-65,-32,-36,-29,-15,10,35,71,21,-1,-17,-43,-108,-100,-112,-127,-132,-135,-129,-120,-142,-165, +-190,-224,-273,-311,-315,-287,-265,-240,-124,-124,-142,-155,-179,-108,-129,-144,-133,-123,-121,-117,-121,-117,-88,-59,-160, +-120,-103,-72,-79,-74,-75,-70,-69,-65,-79,-88,-97,-105,-110,-124,-114,-118,-121,-125,-64,48,48,69,66,65, +68,60,70,69,83,89,90,107,105,87,62,39,60,52,53,43,50,50,52,38,26,6,7,15,60, +37,37,46,27,20,10,33,34,70,46,59,69,96,89,54,89,109,115,163,154,107,65,37,29,46, +60,44,62,62,60,14,-31,-70,-78,-33,95,47,42,42,-23,-46,-47,5,87,174,119,99,71,112,141, +91,160,196,197,295,279,165,97,31,9,53,68,50,76,80,88,10,-56,-149,-162,-115,131,24,30,62, +-62,-98,-116,-13,47,117,1,68,121,173,153,59,155,189,196,387,329,129,112,96,111,63,46,8,61, +77,80,-60,-232,-342,-335,-130,265,92,64,47,-215,-305,-236,-60,155,448,402,162,-284,-109,62,122,400,499, +369,92,81,306,140,111,160,169,190,190,213,221,270,301,372,538,-105,-415,-413,-218,25,85,509,505,137, +36,60,-814,-577,-136,293,209,181,247,95,75,295,339,282,142,244,229,92,56,54,112,95,167,347,348, +304,230,90,80,183,279,141,-211,-92,-77,-162,248,453,149,130,133,159,271,206,-18,102,122,90,83,110, +184,27,-96,-51,-71,-93,-76,-99,-34,150,-62,-64,27,120,146,233,-6,-160,-186,-175,30,315,426,172,173, +71,-27,-150,-82,-94,-114,52,86,55,132,124,53,28,24,33,-27,11,128,181,181,178,33,-33,-81,-147, +-145,35,-4,121,386,337,271,191,200,-210,-211,-405,-511,-525,-600,-499,-342,-206,-95,-57,-55,-57,-96,3,37, +9,1,6,50,-24,-27,2,51,61,20,-44,-118,-122,-315,-372,-287,-120,15,88,-106,-285,-288,-290,-274,-240, +-377,-462,-473,-425,-377,-329,-343,-263,-102,10,79,83,111,118,114,43,31,43,100,70,0,-63,-111,-150,-184, +-216,-282,-351,-427,-470,-359,-446,-486,-478,-435,-405,-327,-229,-143,-143,-179,-157,-119,-7,33,40,48,86,100,122, +139,133,139,134,148,169,211,120,27,-81,-133,-189,-230,-293,-345,-418,-437,-285,-329,-282,-259,-226,-201,-194,-164, +-156,-124,-92,-75,-57,-16,-8,5,8,13,-1,60,69,70,76,88,93,109,69,50,28,3,-26,-56,-109, +-156,-194,-241,-91,-119,-85,-78,-61,-75,-56,-32,-15,0,8,22,28,35,12,12,14,21,24,40,35,41, +44,46,46,52,38,26,12,-1,-14,-23,-35,-48,-63,-77,10,-2,5,42,35,33,27,22,32,23,45, +50,47,61,59,52,13,-9,0,4,7,5,16,12,3,-22,-39,-60,-47,-35,-2,-14,-11,6,-25,-31, +-30,-16,-6,68,46,39,27,83,75,13,61,80,86,112,104,88,15,-25,-47,-20,13,16,47,37,-3, +-77,-128,-158,-128,-77,6,-17,-18,1,-80,-99,-78,-45,41,233,165,124,55,126,149,49,160,186,184,246, +229,162,44,-40,-85,-20,24,44,101,81,14,-120,-215,-296,-243,-173,-8,-50,-41,37,-143,-171,-126,-73,25, +230,91,89,89,269,238,74,184,206,237,424,385,217,98,-8,-92,-51,11,38,139,113,-16,-251,-430,-479, +-366,-149,85,-16,-30,32,-274,-340,-194,-101,97,496,655,454,-55,-214,-107,109,212,396,576,156,36,204,73, +111,203,242,256,196,173,186,214,266,251,170,-323,-567,-591,-188,49,-154,348,326,-168,-77,-54,-534,-1165,-765, +605,277,171,223,130,104,212,360,323,114,136,91,79,41,38,87,14,91,266,311,236,103,25,91,343, +-24,-188,-266,55,152,13,191,635,684,637,516,284,252,216,38,135,152,71,85,102,168,62,-46,20,-17, +-48,-57,-102,-66,-4,28,110,150,115,9,125,-297,-386,-206,-61,183,336,486,-15,-165,-222,-187,-128,-40,-63, +-59,58,109,84,153,111,-8,-27,-34,4,-19,17,112,141,163,157,113,53,-93,-161,-67,276,138,299,617, +533,414,205,130,-65,-105,-241,-307,-299,-343,-284,-224,-179,-123,-135,-118,-109,-152,-24,5,7,4,11,36,22, +-1,-23,-3,14,53,32,-3,-71,-167,-261,-427,-205,-54,12,-29,-163,-177,-182,-256,-439,-508,-549,-533,-452,-379, +-327,-321,-282,-215,-78,17,108,80,69,57,20,-6,-45,6,41,74,-1,-52,-102,-78,-54,-73,-98,-142,-142, +-167,-227,-229,-242,-205,-173,-177,-189,-191,-243,-315,-356,-311,-216,-194,-69,14,145,115,102,94,65,48,19,40, +55,88,10,-47,-106,-178,-256,-319,-311,-291,-282,-258,-270,-317,-344,-324,-327,-317,-308,-294,-262,-220,-183,-167,-148, +-126,-81,-57,-19,17,85,95,87,90,87,85,75,73,45,29,14,2,-4,-21,-67,-123,-175,-225,-128,-145, +-135,-132,-122,-127,-119,-105,-92,-83,-73,-61,-53,-45,-52,-53,-15,-17,-12,-14,-14,-15,-16,-18,-19,-17,-25, +-34,-43,-53,-64,-67,-82,-91,-101,-114,-64,-35,-30,5,-1,-4,-23,-12,-3,-22,8,12,6,10,6,11, +-28,-43,-39,-35,-30,-22,-16,-22,-39,-57,-67,-78,-56,-47,-37,-42,-40,-21,-56,-62,-52,-47,-45,26,21, +-2,-46,44,51,-22,39,52,57,50,42,62,-32,-70,-80,-65,-33,-13,10,-9,-68,-121,-145,-149,-81,-40, +-29,-44,-52,-22,-105,-121,-90,-78,-26,164,127,86,-26,95,119,-4,148,172,146,147,125,135,-24,-94,-107, +-77,-27,23,67,29,-79,-182,-239,-264,-148,-89,-52,-63,-74,17,-172,-198,-117,-117,-56,153,79,21,-47,266, +281,74,208,220,228,374,344,232,29,-101,-154,-129,-54,27,109,45,-153,-328,-408,-372,-144,25,45,-38,-76, +20,-261,-298,-147,-130,57,433,719,607,108,-316,-328,-10,50,254,617,164,-7,97,41,101,137,191,212,179, +153,145,119,197,108,-147,-376,-505,-505,-103,52,-221,128,40,-419,-197,-365,-536,-1145,-849,365,360,281,168,112, +107,120,303,310,142,87,34,97,93,67,21,-25,18,86,192,155,63,-4,88,390,-195,-336,-209,82,228, +268,9,619,847,846,658,246,105,167,226,205,168,65,60,61,108,93,26,23,-15,-66,-88,-61,-49,-64, +144,256,287,191,15,-123,-295,-289,-311,368,526,191,424,-222,-327,-425,-282,-33,-11,-42,0,-5,31,50,57, +20,-38,-56,-84,-75,-13,25,35,28,79,111,147,99,13,0,123,291,373,440,321,373,279,145,-27,27, +148,3,-52,-74,-78,-48,-56,-77,-75,-123,-163,-159,-122,-85,-38,52,5,4,24,82,90,54,44,35,40, +48,5,-92,-63,-56,-112,-79,-69,-24,-47,-74,-135,-203,-299,-495,-547,-550,-495,-433,-372,-322,-268,-237,-233,-159, +-86,31,61,81,57,49,23,-7,-20,6,104,73,40,2,-46,-47,34,18,5,2,-27,-72,-66,-100,-96, +-79,-149,-231,-311,-338,-363,-400,-374,-350,-337,-189,-70,66,51,56,70,44,27,11,-6,-32,-58,-66,-63,-56, +-97,-140,-185,-158,-125,-101,-92,-154,-164,-215,-202,-228,-225,-209,-216,-183,-172,-158,-148,-139,-141,-127,-134,-123,-106, +-68,-77,-77,-72,-70,-67,-61,-58,-62,-72,-79,-80,-78,-87,-95,-117,-133,-144,-131,-130,-132,-131,-131,-128,-129, +-133,-134,-131,-125,-123,-118,-112,-116,-119,-86,-94,-94,-101,-96,-97,-97,-97,-97,-95,-101,-105,-109,-114,-118,-118, +-123,-123,-124,-126,-143,-41,-39,-18,-16,-19,-52,-24,-21,-39,-12,-7,-7,-22,-26,-6,-41,-51,-57,-48,-42, +-28,-33,-38,-51,-62,-63,-63,-36,-30,-35,-41,-42,-30,-56,-61,-52,-50,-55,-16,-4,-22,-88,11,32,-16, +34,41,56,10,1,49,-49,-81,-94,-74,-50,-22,-28,-51,-90,-125,-121,-100,-6,24,-13,-39,-63,-42,-96, +-102,-78,-77,-56,61,83,63,-93,50,74,-12,132,160,146,70,37,130,-59,-106,-119,-92,-49,6,-4,-47, +-119,-192,-195,-173,-11,37,-11,-35,-70,-17,-146,-166,-101,-117,-87,33,39,-37,-178,182,274,97,240,257,238, +258,234,229,-40,-141,-153,-125,-65,30,10,-74,-213,-327,-312,-218,101,228,94,-15,-104,-60,-211,-197,-108,-122, +1,259,624,617,229,-303,-448,-168,-30,139,419,154,11,-5,51,109,37,89,116,132,71,67,67,108,0, +-244,-376,-422,-287,5,102,-32,-3,-173,-423,-238,-448,-547,-939,-787,-178,349,441,241,69,37,41,197,243,178, +84,25,86,102,61,12,-2,-7,-39,47,48,33,-6,88,347,-200,-298,-19,41,240,553,-34,410,778,684, +497,65,-163,-27,298,241,180,36,29,17,30,113,95,6,-22,-62,-54,-43,-40,-22,183,279,306,246,63, +-230,-117,5,-20,389,285,-188,77,-310,-389,-410,-275,-26,6,3,19,-37,-37,-8,-52,-72,-37,-96,-134,-121, +-45,-31,-78,-44,13,55,92,82,153,191,277,278,468,386,-3,6,8,33,-130,272,309,194,141,131,104, +79,49,3,-6,-6,-109,-144,-108,-109,-56,15,12,26,28,86,98,83,56,28,-8,-33,-69,-113,4,121, +290,170,105,158,205,-165,-191,-315,-409,-507,-534,-486,-366,-356,-321,-270,-212,-176,-169,-178,-153,-87,37,91,72, +74,68,81,12,21,67,88,101,70,51,12,1,-9,-26,-95,-112,7,6,-40,-81,-107,-170,-253,-339,-344, +-337,-364,-322,-320,-279,-200,-111,-46,-17,19,85,78,66,67,45,21,-12,1,15,33,24,25,20,26,28, +36,19,-102,-100,-124,-110,-121,-120,-103,-98,-89,-91,-95,-93,-96,-111,-114,-118,-109,-91,-90,-58,-62,-58,-57, +-54,-47,-42,-49,-62,-71,-80,-91,-103,-104,-105,-106,-104,-85,-77,-100,-109,-124,-95,-113,-126,-133,-137,-138,-145, +-147,-150,-127,-106,-129,-111,-99,-78,-82,-81,-80,-79,-79,-76,-82,-84,-88,-92,-94,-98,-94,-91,-89,-86,-113, +-31,-31,-21,-15,-16,-45,-18,-19,-27,-13,-7,3,-25,-30,-6,-34,-41,-58,-46,-40,-26,-34,-39,-47,-51, +-47,-39,-15,-10,-17,-24,-30,-34,-44,-46,-38,-38,-37,-20,-4,-10,-67,4,28,15,34,39,70,2,-10, +36,-40,-68,-100,-74,-55,-32,-54,-73,-93,-108,-86,-45,37,57,17,-18,-52,-60,-79,-72,-49,-52,-39,7, +54,60,-82,39,54,24,116,143,180,45,6,117,-53,-88,-140,-105,-70,-20,-64,-98,-135,-169,-137,-85,66, +106,43,14,-45,-71,-119,-127,-68,-79,-36,-4,47,-15,-176,109,235,144,255,296,292,166,142,220,-63,-132, +-160,-121,-74,-12,-102,-175,-243,-283,-205,-65,230,298,138,24,-97,-153,-181,-117,-47,-61,-55,56,387,493,305, +-175,-396,-241,-54,73,158,179,89,-81,76,114,-33,-3,0,31,8,33,52,35,-65,-232,-371,-332,10,118, +153,165,-67,-284,-327,-215,-358,-310,-642,-646,-543,212,495,337,61,-41,-56,75,158,175,103,38,65,29,0, +-1,-23,-39,-83,-81,-58,-29,70,131,171,-187,-217,174,88,316,763,6,181,775,329,126,-70,-289,-176,155, +196,171,15,-9,-28,3,94,114,12,17,6,11,-40,-25,64,158,215,224,175,68,-85,3,203,542,-47, +-429,-567,-294,-294,-413,-252,-125,-39,44,65,30,-2,-51,-36,-90,-97,-40,-113,-143,-130,-107,-114,-137,-112,-82, +-32,-9,71,221,330,367,281,380,236,36,-128,-124,-92,-154,431,290,242,176,167,133,85,43,22,29,74, +2,-64,-113,-108,-78,-57,0,36,39,72,77,63,43,4,-65,-95,-70,-7,141,255,402,327,334,425,469, +-237,-232,-367,-434,-444,-388,-312,-231,-244,-233,-191,-171,-139,-128,-157,-157,-149,-36,32,77,84,95,107,79,65, +67,107,123,125,91,58,37,-15,-67,-151,-193,-9,-18,-77,-136,-208,-239,-289,-337,-315,-286,-286,-226,-209,-148, +-142,-114,-114,-47,21,95,87,93,101,95,90,80,87,95,113,110,111,107,75,48,32,15,-50,-42,-65, +-58,-65,-69,-68,-72,-68,-66,-70,-64,-68,-74,-73,-60,-48,-32,-36,1,-8,-11,-16,-19,-22,-23,-30,-41, +-55,-66,-76,-80,-70,-60,-56,-53,-4,7,-13,-24,-42,-25,-42,-58,-58,-60,-59,-64,-64,-65,-41,-25,-48, +-30,-21,-3,-10,-11,-13,-14,-15,-16,-20,-21,-21,-22,-23,-30,-24,-21,-16,-9,-9,-18,-16,-13,-8,-7, +-24,-5,-10,-9,-10,-5,11,-15,-20,-7,-19,-24,-52,-37,-33,-23,-30,-32,-35,-34,-27,-11,-1,3,-2, +-7,-15,-30,-33,-34,-25,-21,2,2,17,19,-15,17,32,41,30,30,64,6,-2,17,-16,-40,-97,-72, +-65,-49,-71,-80,-82,-77,-43,17,58,62,29,3,-29,-61,-70,-56,-23,-13,5,0,47,64,-22,54,52, +64,87,101,177,46,16,78,-20,-45,-150,-109,-92,-60,-106,-122,-125,-123,-69,24,95,115,57,52,-12,-92, +-115,-115,-44,-28,70,49,107,63,-72,96,205,197,251,308,332,123,97,184,-31,-85,-190,-145,-124,-105,-199, +-235,-233,-207,-82,130,286,264,120,54,-54,-178,-177,-91,15,40,-135,-131,83,241,300,-31,-259,-239,-106,11, +4,231,189,-99,78,95,-13,-35,-47,-9,26,62,53,24,-77,-256,-345,-223,221,177,165,207,-135,-350,-326, +-226,-166,-33,-301,-442,-568,-1,335,321,106,-38,-137,-33,72,133,99,40,53,-57,-93,-92,-80,-71,-82,-140, +-107,-77,213,232,20,-160,-138,234,218,428,741,102,-156,518,0,-184,-67,-197,-148,-61,60,104,32,-35,-57, +7,44,85,36,51,61,72,16,42,145,154,167,127,64,48,114,91,244,694,-394,-837,-659,-522,-165,-290, +-97,10,29,36,44,14,18,-57,-57,-68,-59,-48,-84,-109,-130,-151,-163,-141,-159,-151,-114,-58,87,236,335, +364,348,255,114,154,-12,-12,-63,-69,269,37,113,103,134,149,108,35,28,44,86,89,23,-97,-113,-123, +-115,-35,24,60,56,62,72,46,3,-49,-15,60,183,245,308,367,352,378,404,392,-117,-197,-261,-290,-287, +-180,-98,-80,-87,-101,-96,-137,-133,-126,-109,-117,-157,-111,-55,19,48,77,80,92,92,73,74,72,103,92, +81,56,31,6,-36,-62,-72,-76,-136,-198,-285,-287,-300,-309,-272,-231,-202,-157,-132,-96,-102,-99,-101,-52,-9, +21,33,62,86,92,98,106,107,112,120,106,91,68,22,-19,-49,-59,-16,-14,-24,-36,-40,-48,-63,-78, +-74,-68,-66,-62,-61,-57,-38,-15,1,16,32,57,50,43,38,31,27,22,13,2,-9,-20,-26,-24,-15, +-6,-4,-9,-11,-9,-9,-12,-13,-34,-36,-39,-33,-33,-29,-27,-22,-20,-16,-15,-2,0,1,5,0,-2, +-5,-7,-8,-10,-12,-12,-12,-11,-12,-17,-18,-20,-19,-15,-20,-6,-2,-5,1,3,-1,2,-3,5,-8, +-6,5,-5,-7,-6,-2,-4,-35,-23,-22,-19,-22,-22,-24,-15,-6,16,10,10,3,5,-3,-21,-25,-25, +-12,-6,41,23,38,39,26,22,28,53,16,10,30,9,10,2,13,-6,-71,-59,-64,-59,-73,-72,-65, +-36,5,75,69,55,20,16,-9,-47,-60,-43,6,28,43,2,49,64,39,55,35,78,34,32,100,42, +39,39,24,13,-112,-86,-95,-86,-115,-113,-105,-61,4,131,102,98,40,71,17,-85,-108,-102,-13,18,170, +92,147,123,40,88,156,233,220,264,293,109,90,137,36,-10,-181,-148,-157,-172,-239,-240,-204,-105,58,312, +299,198,58,64,-7,-151,-152,-65,88,148,-230,-226,-111,44,228,79,-118,-240,-182,-50,-32,266,249,-87,55, +67,76,18,-8,10,98,121,78,19,-103,-281,-300,-107,335,197,161,195,-178,-358,-360,-284,117,147,-73,-307, +-512,-206,96,209,163,32,-161,-113,-5,92,65,18,15,-85,-117,-151,-92,-79,-86,-149,-91,-10,328,286,-47, +-130,-72,201,346,465,496,228,-576,-163,-174,-192,-49,-39,-53,-196,-76,10,56,-24,-55,-6,-12,30,49,41, +53,40,67,119,170,166,132,42,-2,59,183,298,272,157,-521,-735,-468,-627,112,27,49,88,144,36,7, +14,14,-48,-68,-30,-11,-45,-34,-67,-131,-163,-165,-144,-166,-158,-133,-40,87,226,276,288,292,108,18,106, +108,132,109,125,-106,-213,-73,-2,53,126,124,66,69,75,69,99,53,-44,-107,-152,-143,-90,-22,31,38, +55,51,65,61,62,136,218,334,319,343,338,342,269,97,3,106,-24,-58,-41,-16,54,94,66,65,30, +-4,-80,-112,-125,-100,-101,-114,-142,-120,-65,-10,33,36,72,75,49,23,11,37,45,60,73,86,127,182, +164,-133,-152,-190,-240,-313,-295,-276,-260,-225,-191,-153,-131,-112,-103,-94,-94,-88,-65,-44,-48,-20,22,63,52, +47,52,56,62,65,56,42,23,-8,-44,-77,-112,-7,-18,-24,-46,-51,-63,-89,-112,-108,-100,-93,-91,-85, +-76,-51,-32,-16,-3,24,22,26,27,32,37,46,50,47,44,41,35,32,33,25,22,18,9,-57,-64, +-57,-58,-55,-83,-81,-81,-71,-68,-64,-57,-51,-48,-50,-52,-27,-31,-30,-32,-30,-31,-32,-31,-31,-29,-30, +-30,-29,-26,-24,-22,-31,-40,-49,-54,-68,2,8,0,5,8,13,3,-4,8,-13,-14,-12,-1,2,-5, +9,11,-15,-10,-13,-14,-14,-12,-12,2,12,35,17,13,3,14,8,-13,-14,-12,2,7,60,28,40, +38,47,12,8,44,-8,-20,-18,5,18,-1,34,23,-28,-42,-61,-62,-65,-55,-40,9,52,115,71,44, +4,26,12,-32,-34,-17,35,55,58,-2,35,49,83,30,-5,56,-35,-47,-17,20,53,17,60,61,-36, +-51,-84,-91,-101,-84,-71,8,72,197,97,78,15,82,49,-72,-67,-54,30,51,205,92,131,127,122,52, +78,202,145,161,150,99,110,103,103,72,-100,-121,-174,-212,-237,-204,-144,21,196,420,275,132,-10,73,41, +-120,-72,11,159,209,-287,-232,-210,-84,153,115,-25,-226,-203,-65,-11,238,220,-44,14,29,148,114,104,137, +220,191,108,-28,-181,-292,-240,5,390,218,160,199,-166,-302,-319,-310,290,228,108,-166,-455,-347,-112,83,158, +71,-130,-154,-66,61,12,-23,-40,-49,-60,-134,-65,-76,-87,-119,-23,161,347,225,-115,-123,-10,179,421,422, +175,231,-792,-877,-249,-53,-118,103,48,-215,-131,-48,47,20,-25,-45,-49,-3,62,19,1,-35,72,127,127, +125,67,-17,-34,45,92,491,335,-393,-429,-425,-322,-548,398,418,247,163,185,36,-9,28,13,-17,-60,-18, +0,-21,-1,-42,-118,-154,-153,-151,-145,-126,-101,14,104,222,211,181,115,-69,-88,-9,79,115,173,263,-362, +-322,-183,-53,25,69,87,88,94,91,49,56,36,16,-95,-156,-155,-145,-98,-57,-14,28,32,77,118,183, +236,293,371,332,321,261,278,141,-143,-290,271,172,148,162,185,212,212,173,169,128,73,-6,-72,-124,-113, +-102,-83,-119,-117,-103,-48,-10,4,34,33,-3,-24,-27,-15,15,48,79,121,190,285,296,-138,-180,-195,-221, +-266,-243,-209,-183,-170,-154,-135,-129,-122,-132,-117,-122,-122,-112,-101,-105,-73,-36,4,-6,-7,1,-6,-13,-23, +-14,-11,1,5,-4,-22,-93,-44,-66,-67,-93,-101,-113,-140,-161,-155,-144,-133,-129,-121,-110,-91,-78,-64,-53, +-32,-40,-29,-21,-9,7,25,41,43,48,52,51,49,44,14,-7,-19,-28,-99,-110,-102,-103,-101,-123,-123, +-126,-114,-111,-106,-99,-92,-88,-89,-89,-69,-72,-70,-72,-66,-62,-60,-56,-53,-47,-49,-49,-49,-48,-46,-39, +-51,-61,-76,-89,-104,15,20,8,9,12,28,7,-2,12,-15,-18,-21,1,8,2,19,25,10,5,0, +-2,1,5,9,23,32,48,30,25,11,29,25,-1,4,8,23,21,65,29,27,27,67,-1,-13,32, +-34,-49,-47,-3,19,4,47,46,22,-17,-47,-49,-42,-21,5,57,93,130,78,46,4,46,42,-11,4, +22,70,72,64,-4,7,22,117,-4,-47,30,-100,-118,-108,-16,41,5,76,86,46,-14,-62,-77,-64,-35, +-9,79,131,214,108,88,19,110,88,-51,-9,11,85,79,193,69,66,84,188,-7,-23,122,23,16,-28, +71,117,79,139,137,35,-69,-170,-213,-187,-120,-28,158,307,426,244,101,-29,106,102,-68,29,105,232,232, +-295,-196,-259,-170,78,101,30,-143,-139,-35,4,146,125,31,-32,-25,145,180,231,292,303,219,107,-100,-249, +-261,-124,150,429,265,160,138,-136,-218,-218,-281,266,270,294,46,-361,-385,-228,-17,92,49,-79,-140,-96,31, +-35,-45,-68,13,26,-42,-27,-61,-44,-55,69,328,255,50,-246,-133,55,210,467,362,-83,87,-648,-1250,-475, +-140,-205,135,99,-123,-118,-69,29,55,7,-77,-58,-16,61,24,-3,-28,57,85,70,53,-12,-61,-68,18, +39,474,274,-545,-364,-274,-208,-261,510,702,479,273,138,57,31,38,19,15,-34,-27,-11,14,13,-18,-68, +-112,-130,-130,-104,-72,-22,59,126,196,157,70,-92,-156,-121,-67,-12,-1,85,231,-380,-280,-216,-81,3,5, +22,88,77,61,22,6,1,25,-80,-136,-172,-171,-154,-140,-82,-25,11,70,139,238,253,287,320,299,255, +165,141,21,-185,-327,284,248,252,245,238,234,210,188,189,170,126,67,-10,-92,-107,-98,-69,-75,-76,-80, +-52,-37,-27,-1,-5,-33,-26,-9,10,41,88,134,163,200,258,276,-102,-145,-150,-155,-177,-143,-100,-68,-83, +-89,-103,-109,-127,-143,-135,-140,-146,-135,-123,-112,-91,-72,-50,-45,-34,-18,-25,-34,-42,-38,-33,-14,1,11, +8,-55,-107,-129,-130,-145,-156,-167,-186,-201,-190,-175,-162,-151,-139,-128,-119,-112,-103,-95,-85,-90,-81,-71,-61, +-46,-31,-15,-16,-11,-8,-4,-3,-7,-38,-67,-85,-95,-115,-126,-122,-125,-126,-133,-136,-144,-134,-130,-125,-119, +-113,-107,-105,-103,-97,-98,-95,-97,-88,-83,-78,-73,-70,-63,-65,-66,-67,-69,-71,-66,-75,-82,-93,-104,-105, +26,30,18,15,17,40,12,4,19,-11,-16,-16,4,13,9,26,32,30,18,13,10,15,21,30,40, +46,53,40,36,24,39,35,12,20,25,40,34,64,29,14,17,75,-9,-27,20,-53,-66,-52,-15,10, +9,50,58,55,7,-23,-26,-13,16,56,96,117,122,76,47,16,58,58,14,37,53,93,80,70,0, +-14,-4,124,-29,-69,12,-141,-163,-140,-58,5,-8,71,84,89,12,-36,-52,-26,12,67,135,167,193,115, +98,48,117,97,-17,39,65,128,101,165,50,1,27,209,-65,-114,36,-101,-124,-149,13,82,67,142,167, +143,-13,-126,-165,-110,-15,121,270,360,356,186,67,-3,113,125,6,114,173,275,229,-236,-147,-253,-198,7, +93,93,-1,-47,-14,-15,27,32,93,-83,-100,59,157,252,310,254,152,29,-158,-236,-179,106,360,424,300, +130,-7,-144,-161,-126,-198,122,254,428,241,-214,-378,-311,-104,9,13,-41,-88,-96,-14,-50,-21,-47,66,92, +63,-3,-34,27,42,157,340,97,-140,-381,-143,101,232,402,233,-288,-88,-299,-1206,-817,-472,-149,28,29,11, +-68,-58,13,53,20,-90,-55,-35,28,44,41,41,59,40,5,-40,-97,-102,-105,9,137,247,36,-408,-218, +-114,-125,87,344,656,618,398,128,109,112,55,9,11,-15,-34,-17,26,17,14,5,-41,-79,-76,-54,-14, +63,80,123,136,96,-14,-181,-165,-111,-78,-95,-93,1,92,-218,-173,-199,-108,-35,-39,-25,71,34,0,-23, +-28,-25,-4,-56,-100,-180,-179,-183,-179,-142,-85,-16,43,119,207,224,255,259,243,169,74,34,-35,-138,-192, +174,196,209,188,179,161,134,123,131,142,130,114,52,-34,-76,-86,-73,-54,-45,-41,-39,-41,-45,-5,6, +0,40,66,88,119,176,230,215,196,187,171,-20,-53,-49,-27,-23,7,46,77,37,12,-34,-54,-94,-114, +-118,-124,-139,-128,-118,-103,-96,-89,-87,-63,-37,-10,-7,0,9,-5,-17,-14,-10,2,12,-3,-149,-159,-168, +-164,-177,-181,-190,-199,-185,-171,-159,-143,-132,-124,-121,-116,-113,-109,-107,-108,-102,-96,-89,-82,-77,-69,-79,-84, +-89,-87,-84,-86,-98,-116,-132,-144,-112,-117,-118,-121,-123,-117,-119,-129,-123,-120,-116,-114,-109,-104,-103,-103,-102, +-103,-103,-104,-97,-92,-87,-83,-79,-74,-77,-78,-82,-86,-92,-95,-99,-100,-102,-105,-100,31,35,25,23,23, +43,16,11,22,-5,-10,-5,6,13,12,28,34,38,26,22,15,22,29,44,49,51,49,43,40,35, +40,36,22,31,37,51,41,59,31,14,13,61,-11,-31,2,-61,-70,-43,-25,-2,3,46,60,62,30, +6,-3,12,44,92,119,125,99,71,49,37,55,56,32,59,75,106,80,74,12,-8,-8,96,-38,-72, +-13,-157,-182,-128,-91,-34,-35,53,66,81,30,-9,-33,-1,42,121,164,176,148,115,101,86,93,74,15, +75,106,160,114,127,37,-25,-11,159,-103,-172,-43,-199,-226,-177,-61,15,41,118,159,176,47,-42,-87,-27, +79,241,337,365,263,150,64,61,94,104,67,172,224,299,208,-81,-69,-155,-135,-17,112,165,153,28,-27, +-50,-58,-25,124,-121,-171,-62,25,116,153,79,7,-106,-201,-199,-147,261,460,323,255,63,-150,-145,-118,-92, +-60,-14,157,434,322,-69,-358,-381,-192,-52,3,-21,-37,-80,-62,-31,29,3,96,121,140,33,23,101,169, +226,208,-61,-273,-433,-117,135,200,225,35,-388,-191,-152,-981,-986,-686,20,-93,-99,60,-27,-30,4,25,11, +-82,-56,-63,-27,35,63,69,41,-11,-78,-130,-160,-132,-118,44,313,2,-234,-288,-71,70,34,167,79,292, +562,469,216,142,154,103,8,-1,-4,-26,-16,3,14,43,68,29,-12,-18,-2,40,123,100,99,65,46, +-48,-150,-102,-54,-48,-105,-74,92,5,-16,-50,-145,-128,-82,-45,-27,47,-1,-44,-61,-47,-36,-30,-29,-64, +-159,-170,-186,-173,-164,-124,-50,21,96,154,189,221,216,183,100,35,-12,-46,-71,-35,6,52,85,81,82, +66,50,45,55,79,88,110,81,20,-34,-64,-80,-64,-53,-37,-31,-23,-30,24,60,86,145,173,197,219, +261,299,248,184,109,40,106,85,81,106,121,142,163,188,144,113,63,26,-31,-60,-75,-86,-111,-101,-94, +-84,-85,-86,-91,-65,-41,-17,9,40,76,59,44,37,32,42,65,91,-129,-124,-137,-115,-128,-126,-124,-129, +-126,-128,-129,-122,-121,-125,-120,-115,-112,-108,-110,-106,-100,-94,-89,-86,-85,-82,-95,-108,-117,-120,-116,-116,-108, +-109,-117,-127,-91,-89,-97,-100,-103,-86,-89,-96,-98,-100,-101,-104,-104,-105,-103,-101,-102,-101,-100,-99,-95,-92, +-88,-86,-83,-79,-82,-83,-86,-89,-93,-99,-99,-98,-94,-90,-97,27,31,25,24,22,32,15,11,12,-4, +-9,-3,3,9,7,22,26,32,24,21,14,21,27,42,45,45,36,36,35,38,29,25,19,32,38, +50,37,42,26,15,7,21,-13,-31,-29,-62,-63,-39,-30,-16,-16,33,49,46,39,27,15,30,58,100, +118,113,70,61,47,55,39,36,28,64,82,100,65,64,29,7,-2,39,-31,-58,-61,-151,-181,-125,-114, +-61,-73,32,41,39,33,8,-14,15,54,131,159,158,97,104,95,113,51,31,18,93,127,163,105,65, +23,-31,-39,45,-109,-185,-130,-260,-279,-155,-117,-58,-18,85,125,136,87,43,5,56,145,290,345,328,181, +133,85,132,61,53,67,187,243,281,157,128,51,21,15,22,158,235,270,93,-20,-46,-72,-40,127,-123, +-195,-171,-133,-93,-99,-128,-156,-253,-245,-186,-140,265,382,166,140,-5,-196,-97,-55,-78,97,-107,35,299,275, +47,-331,-433,-246,-76,8,-7,-6,-62,-92,-6,65,49,93,123,190,100,110,165,267,230,27,-195,-339,-367, +-31,166,145,24,-161,-370,-225,-191,-635,-823,-623,50,-122,-143,3,-16,-7,-2,8,3,-54,-65,-93,-74,-11, +22,-3,-20,-64,-149,-183,-181,-145,-67,100,371,-182,-398,-217,1,198,267,45,-20,-53,332,400,278,100,96, +116,24,5,12,-8,-18,-28,7,57,98,74,49,33,58,90,143,124,75,-4,-2,-57,-71,-52,-18,-37, +29,100,229,55,113,49,-59,-110,-90,-25,-5,6,-17,-40,-52,-46,-33,-28,-3,-28,-97,-138,-164,-149,-146, +-122,-71,6,75,117,152,168,158,100,26,-23,-58,-74,-55,55,-144,-101,-55,-23,3,1,1,-1,8,19, +26,65,71,53,6,-32,-72,-82,-81,-65,-37,-4,7,74,125,159,224,257,280,272,267,254,200,127,16, +-83,192,184,176,180,191,195,194,202,177,162,136,100,47,20,-13,-38,-79,-70,-67,-64,-68,-74,-81,-63, +-48,-35,8,51,100,100,101,104,101,110,140,172,-60,-52,-70,-45,-54,-52,-48,-49,-63,-80,-96,-103,-112, +-127,-118,-109,-103,-99,-101,-94,-87,-81,-76,-74,-72,-72,-77,-85,-87,-88,-83,-77,-64,-56,-55,-61,-55,-49, +-61,-65,-70,-51,-55,-57,-67,-73,-79,-87,-93,-102,-93,-89,-94,-89,-86,-83,-82,-81,-80,-79,-78,-77,-76, +-74,-73,-71,-70,-70,-69,-69,-65,-58,-86,20,25,23,21,18,16,13,10,-3,-5,-10,-12,-4,1,-3, +13,16,19,18,17,14,18,23,34,37,37,25,29,29,38,19,15,11,29,35,42,29,24,21,10, +-2,-18,-12,-25,-58,-49,-43,-42,-24,-19,-35,15,30,25,35,35,32,44,64,91,106,96,48,49,45, +69,27,17,12,60,79,82,46,49,46,15,2,-15,-13,-35,-114,-130,-165,-152,-121,-73,-105,10,11,-3, +23,15,10,30,60,114,142,135,66,90,86,132,21,2,3,99,130,139,84,8,11,-41,-63,-74,-88, +-155,-212,-254,-261,-139,-130,-95,-91,45,71,61,95,93,83,121,184,280,319,275,123,109,103,192,46,10, +27,173,234,224,95,291,182,179,155,100,203,269,295,146,27,6,-26,-20,101,-76,-156,-235,-236,-248,-270, +-267,-275,-349,-263,-167,-84,202,233,28,21,-38,-126,-22,13,-32,217,-143,-60,110,158,121,-267,-398,-234,-92, +-7,-8,6,-45,-89,4,68,65,68,106,199,173,199,210,271,155,-99,-277,-340,-233,75,183,93,-118,-276, +-294,-209,-276,-301,-479,-410,-110,-59,-60,-75,-4,11,-3,3,14,-18,-61,-103,-94,-55,-42,-94,-81,-104,-179, +-180,-156,-137,42,160,268,-270,-382,-53,88,258,430,-87,130,-51,49,136,172,12,-2,59,21,-2,6,4, +-15,-34,3,54,103,93,87,78,109,118,122,118,61,-35,-32,-64,-19,-40,8,33,218,283,241,195,144, +94,31,-36,-26,2,5,-29,-13,-12,-11,-23,-23,-13,14,5,-21,-77,-113,-114,-102,-86,-59,0,51,87, +93,84,68,-3,-59,-97,-116,-99,-41,96,-191,-188,-142,-94,-57,-40,-24,-19,-13,-18,-20,6,33,57,32, +0,-48,-85,-99,-90,-56,-12,28,96,149,185,241,269,281,241,186,115,61,6,-71,-144,163,170,171,159, +163,157,142,134,140,150,158,137,105,89,37,-1,-49,-40,-39,-41,-46,-55,-66,-57,-49,-45,-1,40,87, +103,124,141,136,135,145,156,40,48,24,35,23,18,20,15,-2,-26,-49,-62,-75,-90,-88,-81,-80,-82, +-89,-87,-81,-74,-68,-66,-65,-66,-57,-51,-42,-35,-25,-10,1,16,26,33,-20,-9,-22,-25,-31,-16,-22, +-27,-39,-45,-52,-60,-68,-78,-67,-66,-75,-71,-70,-70,-70,-71,-72,-72,-72,-73,-67,-62,-57,-50,-43,-38, +-35,-33,-30,-24,-72,12,16,19,14,11,4,10,5,-18,-8,-12,-24,-11,-6,-11,2,5,10,9,10, +11,14,18,25,28,27,15,19,20,34,9,5,2,21,27,28,19,9,15,-1,-13,-39,-9,-16,-69, +-28,-21,-43,-13,-16,-42,-7,4,10,21,30,39,48,62,76,84,70,26,27,31,73,15,1,-3,49, +65,55,26,35,53,11,-2,-44,1,-18,-153,-106,-138,-189,-114,-78,-119,-20,-23,-22,2,12,28,38,61, +96,118,108,42,63,63,137,0,-18,-15,89,115,98,61,-24,3,-55,-84,-147,-60,-107,-240,-182,-182,-105, +-90,-82,-125,-7,1,-1,71,96,127,152,196,247,267,202,58,46,84,221,33,-24,-9,146,195,140,40, +359,267,251,225,173,225,241,215,144,56,41,19,13,54,3,-64,-243,-264,-303,-319,-323,-327,-355,-241,-110, +54,153,101,-65,-60,-47,-24,9,52,67,284,-132,-93,-37,41,137,-174,-281,-167,-65,-21,-21,-5,-18,-64, +-5,43,51,33,69,163,201,234,211,180,30,-169,-325,-309,-93,141,169,73,-180,-313,-233,-182,-268,-49,-229, +-242,-270,9,30,-65,34,10,11,2,13,12,-35,-80,-92,-67,-71,-124,-109,-124,-160,-141,-103,-83,170,207, +93,-303,-307,86,148,274,493,-104,253,252,-161,-220,-96,-57,-29,-3,2,-14,-6,-3,-5,-18,0,35,95, +99,106,111,129,112,75,61,29,-34,-55,-77,-17,-40,56,200,301,247,36,166,124,107,125,96,75,19, +-7,-31,4,10,12,5,-3,-2,20,31,44,-2,-41,-59,-49,-37,-15,6,27,49,23,-4,-31,-100,-142, +-167,-154,-80,-2,121,-133,-171,-155,-129,-95,-67,-43,-36,-24,-28,-32,-29,-7,29,35,18,-24,-72,-95,-91, +-71,-39,7,75,127,159,192,202,193,148,77,-22,-73,-109,-129,-134,38,54,73,67,73,67,52,38,67, +94,125,123,120,122,67,28,-10,-12,-19,-33,-32,-36,-44,-38,-32,-27,9,41,78,87,101,114,97,77, +53,47,105,113,99,93,84,76,78,75,61,40,21,7,-7,-18,-28,-29,-38,-50,-68,-70,-65,-61,-56, +-55,-54,-57,-40,-26,-10,3,18,39,47,62,77,93,3,12,4,3,-2,9,1,-5,-14,-19,-24,-30, +-36,-42,-34,-34,-54,-50,-52,-51,-53,-54,-55,-56,-55,-58,-50,-43,-37,-28,-21,-14,-10,-6,-3,0,-49, +8,13,18,10,7,-1,9,4,-23,-6,-10,-25,-12,-8,-11,-5,-2,7,5,7,10,12,15,22,22, +20,12,14,14,33,6,2,0,19,23,20,15,6,15,-5,-15,-37,-3,-4,-60,-8,-2,-41,-8,-14, +-33,-22,-15,7,9,21,36,44,55,66,60,42,11,5,16,73,9,-5,-4,45,56,34,17,31,56, +8,-5,-48,11,-7,-153,-78,-100,-188,-95,-77,-100,-52,-54,-13,-14,5,34,38,60,90,91,78,30,37, +39,136,-11,-23,-13,85,105,68,52,-26,4,-54,-86,-160,-34,-57,-183,-89,-80,-46,-32,-39,-100,-48,-61, +-30,29,67,127,144,181,212,191,112,-4,-28,46,221,22,-39,-7,139,164,69,9,366,290,247,227,214, +209,164,95,85,29,32,15,26,15,56,34,-187,-225,-268,-279,-306,-308,-272,-160,7,241,199,76,-94,-78, +-33,49,3,74,210,333,-92,-67,-96,-32,107,-93,-151,-66,-24,-19,-13,-13,-5,-26,-20,11,33,-2,21, +98,170,209,182,76,-72,-209,-333,-234,57,167,134,75,-201,-304,-185,-152,-112,176,-60,-130,-252,29,42,-1, +25,5,11,7,4,14,-2,-34,-63,-35,-37,-76,-89,-112,-111,-94,-29,46,278,225,-54,-263,-186,207,231, +313,450,-2,129,445,-224,-460,-356,-80,-15,-17,-4,-10,-6,-8,-5,-6,-6,8,68,99,113,129,122,85, +32,-5,-21,-35,-62,-67,-32,25,159,385,203,-8,-233,-64,135,185,264,272,162,40,-11,-8,12,9,12, +12,10,4,22,46,86,76,46,21,15,17,34,34,30,32,-20,-54,-79,-136,-173,-178,-122,-11,62,133, +-33,-81,-107,-116,-100,-77,-50,-42,-22,-21,-26,-32,-26,-4,21,23,1,-46,-69,-67,-64,-52,-23,35,76, +99,111,109,92,73,25,-63,-104,-128,-103,-66,-64,-50,-22,-10,4,1,-6,-16,17,43,74,81,96,109, +78,51,34,21,3,-20,-5,1,4,14,26,40,59,75,92,80,70,64,36,3,-44,-52,122,127,121, +109,103,97,100,101,97,89,83,79,72,69,45,36,22,4,-23,-22,-17,-17,-14,-13,-13,-15,2,15, +31,47,64,82,84,92,100,113,35,39,32,31,24,37,27,18,15,13,10,9,7,8,16,18,-14, +-5,-5,0,-3,-3,-3,-3,-3,-5,2,7,11,17,22,28,30,33,36,35,7,-3,4,7,3,1, +-4,0,0,-19,-4,-6,-17,-9,-9,-7,-14,-14,6,-1,-2,-2,1,3,11,5,3,1,0,1,20, +-6,-9,-9,8,12,6,5,-1,8,-6,-17,-33,-4,-3,-49,-5,-5,-48,-29,-29,-23,-37,-32,5,-6, +8,15,23,31,41,17,0,-14,-19,-2,54,-7,-18,-10,32,37,8,4,25,47,6,-11,-46,9,-5, +-111,-53,-63,-126,-71,-73,-62,-76,-81,1,-26,-5,13,21,39,69,40,27,5,9,11,104,-27,-33,-10, +70,86,39,42,-20,5,-39,-75,-130,-15,-21,-89,-22,-14,-2,-4,-8,-42,-55,-88,-31,-9,28,79,99, +129,150,75,-9,-70,-76,14,173,-1,-50,2,123,123,7,-11,336,246,206,190,185,144,71,22,23,3, +9,0,14,0,54,76,-85,-157,-203,-213,-255,-248,-164,-54,122,346,221,54,-108,-91,-39,61,-20,81,309, +353,-48,-9,-88,-56,46,-39,-47,-6,-10,-4,-3,-3,-5,-5,-20,-17,21,-28,-28,15,95,141,127,-1, +-141,-261,-320,-155,164,134,54,27,-242,-302,-163,-128,51,309,94,-24,-133,8,23,5,4,3,2,3,3, +4,9,5,-24,10,19,2,-47,-86,-67,-61,36,193,296,161,-180,-187,-53,256,288,321,289,72,-186,190, +-209,-453,-412,-82,-5,-5,-3,-3,-3,-4,-4,-3,-8,-10,19,76,102,114,87,44,-11,-62,-90,-83,-92, +-66,-67,127,241,364,-39,-302,-395,-313,129,306,406,403,177,66,-1,6,6,3,6,7,7,4,12,40, +85,127,117,90,70,57,59,51,34,16,-53,-92,-112,-156,-185,-168,-96,-5,46,54,18,-8,-49,-69,-72, +-56,-37,-25,-8,-7,-12,-15,-17,-14,6,17,18,-18,-41,-47,-53,-55,-47,-17,-1,4,10,10,1,8, +-9,-66,-80,-90,-53,-14,-112,-109,-80,-66,-49,-44,-40,-37,-12,3,27,27,47,56,59,53,56,39,22, +-2,18,32,43,60,78,99,95,88,79,47,16,-9,-30,-56,-95,-101,72,71,90,73,80,78,81,86, +90,96,105,109,113,119,98,84,68,53,33,30,34,32,32,31,29,29,35,41,49,59,69,74,69, +68,66,70,47,43,47,49,48,49,47,44,47,48,48,51,52,58,56,57,39,43,42,45,43,44, +44,45,45,45,47,48,48,48,48,50,50,51,52,49,52,-16,-6,-4,-9,-11,-15,-13,-11,-21,-12, +-11,-17,-18,-20,-11,-27,-27,-4,-14,-15,-17,-12,-11,-4,-15,-16,-13,-12,-10,1,-17,-18,-14,-2,1, +-9,-6,-7,-1,-12,-21,-34,-14,-11,-33,-10,-19,-52,-57,-53,-16,-52,-48,-1,-21,-11,-12,-2,1,6, +-33,-46,-37,-28,-10,23,-19,-24,-7,20,19,-15,-7,20,36,1,-19,-44,-5,-9,-55,-30,-28,-56,-48, +-62,-28,-82,-93,1,-37,-23,-20,-4,7,33,-26,-33,-16,0,6,55,-33,-28,12,63,70,12,33,-10, +5,-25,-57,-83,-8,-6,-15,5,5,15,15,5,1,-27,-75,-24,-36,-13,12,39,56,59,-69,-138,-117, +-73,13,92,-18,-36,39,111,85,-43,-22,287,171,157,123,103,60,10,2,1,-2,-6,-6,0,-1,19, +53,2,-80,-144,-155,-192,-169,-51,84,248,394,235,56,-64,-65,-22,77,1,107,352,341,8,52,-48,-37, +10,-6,-9,0,-1,2,3,2,1,-1,-8,-21,6,-25,-49,-43,35,80,75,-42,-179,-290,-263,-62,229, +106,-8,-44,-265,-276,-130,-77,161,352,216,45,-73,15,4,-1,1,-2,-1,-1,0,1,4,11,1,28, +52,55,-4,-43,-27,-10,111,307,245,51,-265,-102,76,246,321,292,76,85,-389,-340,-209,-251,-277,-40,1, +-1,1,1,1,1,0,0,-3,-8,-20,24,62,63,30,-3,-49,-93,-132,-127,-115,-46,-45,240,266,136, +-236,-411,-384,-345,84,367,443,371,130,66,-6,2,-3,-2,-2,-1,0,2,-1,15,51,119,143,126,108, +85,69,53,33,9,-59,-99,-119,-150,-159,-121,-86,-61,-37,-71,50,45,0,-8,-26,-14,-8,2,6,6, +4,3,-1,-4,-1,9,25,9,-14,-27,-36,-48,-55,-58,-66,-75,-62,-52,-53,-40,-40,-62,-43,-28,9, +38,-106,-118,-105,-100,-90,-79,-64,-50,-34,-25,-12,-15,-1,3,19,26,41,36,28,21,35,43,52,70, +88,106,83,59,33,4,-25,-50,-57,-69,-90,-100,2,-7,15,14,27,31,35,42,47,57,71,80,92, +104,98,91,85,77,64,67,69,67,66,65,62,64,59,58,58,57,54,46,35,25,16,10,48,40, +46,47,48,50,51,53,60,64,66,70,73,78,72,74,64,68,71,75,74,76,77,78,79,79,77, +74,70,66,62,61,59,57,55,51,82,-27,-15,-15,-19,-21,-23,-24,-21,-19,-17,-18,-20,-27,-28,-14, +-35,-37,-14,-25,-26,-30,-25,-24,-21,-33,-32,-25,-19,-18,-19,-25,-24,-16,-11,-11,-22,-15,-11,-10,-17, +-26,-33,-26,-20,-15,-14,-23,-43,-70,-69,-19,-59,-54,-11,-33,-28,-36,-24,-28,-33,-76,-81,-54,-26,-11, +-16,-29,-25,1,8,1,-34,-15,19,23,-4,-23,-36,-18,-10,-7,-8,-4,-9,-11,-30,-4,-62,-83,-8, +-45,-41,-52,-27,-27,-16,-86,-82,-33,8,13,-10,-33,-16,43,53,50,-14,27,2,5,-16,-37,-42,-5, +2,2,2,3,4,9,9,6,8,-35,-20,-46,-45,-46,-15,-19,-50,-196,-232,-138,-35,25,-15,-36,-13, +83,86,39,-81,-23,219,106,107,60,32,8,-2,0,-1,-2,-2,-5,-4,-4,1,13,35,-21,-91,-116, +-135,-94,36,208,336,367,218,66,4,-16,17,112,65,157,357,290,63,86,6,7,8,-4,-2,3,0, +1,1,2,2,2,0,-9,-6,-5,-26,-50,10,34,13,-93,-209,-277,-168,26,237,97,-30,-100,-237,-200, +-57,6,203,345,276,50,-40,22,-7,2,-3,0,-2,-1,-2,-1,0,3,7,14,39,63,27,11,24, +84,195,332,149,-58,-282,-6,199,246,346,239,-97,56,-373,-732,-235,-71,-90,7,-1,4,1,2,1,2, +2,2,0,3,-16,-20,1,-7,-35,-52,-85,-115,-148,-134,-121,-8,63,299,212,-135,-275,-296,-241,-179,5, +257,281,192,78,14,-11,-1,-5,-3,-3,-3,-3,-2,-1,-2,15,76,125,130,121,101,78,46,21,-3, +-53,-94,-119,-134,-114,-59,-78,-116,-124,-147,90,97,56,43,20,21,9,11,8,8,6,7,6,6,2, +7,25,32,21,4,-10,-29,-47,-67,-90,-113,-93,-82,-82,-74,-68,-52,-13,30,69,96,-70,-83,-82,-78, +-78,-64,-45,-29,-21,-16,-13,-16,-15,-16,-9,0,14,21,30,40,39,39,39,49,58,66,41,16,-8, +-21,-33,-48,-47,-53,-63,-71,-42,-57,-39,-36,-22,-17,-17,-12,-8,2,14,23,36,49,61,65,71,76, +80,82,82,83,83,83,81,85,73,67,60,51,40,26,12,-2,-13,-26,38,29,41,43,48,41,48, +56,64,68,72,76,80,83,74,73,81,78,79,78,80,81,82,83,84,86,80,75,69,64,60,57, +54,50,45,41,84,-31,-19,-21,-24,-27,-30,-29,-26,-16,-22,-24,-25,-37,-37,-20,-35,-35,-25,-31,-31, +-33,-30,-30,-32,-38,-37,-28,-20,-20,-33,-27,-23,-11,-15,-17,-28,-19,-14,-19,-23,-27,-28,-31,-22,2, +-9,-15,-23,-48,-53,-22,-58,-53,-17,-34,-36,-45,-36,-46,-60,-89,-85,-54,-19,-11,-47,-33,-20,14,-2, +-13,-42,-18,14,3,-9,-22,-30,-20,-5,5,-1,4,4,10,1,7,-19,-47,-20,-41,-46,-63,-38,-48, +-57,-104,-92,-36,15,14,-66,-28,-2,73,37,25,-31,16,5,-8,-15,-24,-17,4,2,-2,0,-1,-2, +-3,0,-2,11,2,-12,-39,-55,-74,-49,-76,-137,-241,-238,-123,-1,18,-110,-51,10,120,55,-5,-95,-22, +129,67,66,25,3,0,-1,0,0,0,1,1,1,-1,-3,-3,16,13,-46,-78,-71,-16,99,277,347, +279,169,74,66,48,60,109,105,175,309,191,87,78,37,24,-3,1,1,0,0,0,0,0,0,0, +2,1,-8,3,6,-21,-4,-17,-61,-149,-212,-206,-62,81,176,78,-28,-114,-161,-102,25,76,167,287,235, +25,-14,5,-4,1,0,0,0,0,0,-1,-1,-2,5,0,8,44,53,71,88,179,237,247,38,-124, +-230,49,223,192,270,131,-175,8,-248,-733,-237,-7,-1,2,2,0,0,0,0,0,1,1,1,1,2, +-25,-44,-63,-80,-86,-108,-126,-141,-116,-102,26,170,226,69,-279,-200,-115,-75,-27,-49,-13,12,14,22,-16, +1,-3,0,0,0,-1,-1,-2,-2,-3,-5,32,81,108,106,94,73,31,2,-24,-50,-86,-108,-109,-71, +-22,-58,-109,-138,-108,106,120,83,54,32,9,6,1,1,0,0,1,2,4,5,5,12,37,42,34, +15,-7,-30,-47,-71,-105,-92,-89,-94,-88,-78,-39,-7,42,77,110,-40,-47,-50,-46,-45,-30,-16,-1,0, +2,1,0,-4,-7,-14,-16,-9,-5,6,20,10,7,1,0,-2,-5,-14,-24,-32,-32,-32,-38,-34,-37, +-41,-45,-52,-66,-62,-55,-49,-45,-45,-41,-36,-29,-22,-15,-9,-1,14,25,36,48,65,68,64,63,61, +60,57,57,47,40,33,22,11,0,-11,-20,-27,-38,10,6,13,15,21,11,18,24,29,32,36,40, +45,49,42,39,56,50,50,47,48,48,48,48,47,48,43,39,34,30,28,25,23,19,15,12,45, +-27,-18,-22,-22,-24,-25,-24,-22,-9,-18,-21,-22,-33,-35,-24,-29,-27,-23,-26,-26,-27,-26,-28,-32,-32, +-30,-25,-18,-19,-35,-24,-20,-7,-16,-18,-25,-18,-14,-23,-21,-21,-22,-28,-14,7,-3,-4,-5,-14,-17, +-9,-33,-40,-23,-22,-28,-38,-37,-48,-65,-72,-63,-42,-14,-14,-57,-31,-16,17,-8,-18,-34,-17,5,-16, +-11,-18,-17,-4,3,0,0,2,3,6,5,5,6,-3,-14,-27,-31,-48,-37,-51,-71,-82,-66,-31,8, +0,-88,-27,-1,71,14,4,-27,5,0,-26,-16,-12,2,3,-1,0,0,-1,-1,-3,-2,-3,-2,4, +2,-16,-39,-66,-61,-98,-161,-194,-168,-87,9,-6,-145,-60,9,112,25,-26,-69,-16,45,41,35,6,-1, +-1,0,1,0,0,1,1,1,1,0,-1,-1,13,-5,-32,-9,42,117,241,258,155,87,50,67,78, +72,52,89,136,208,86,72,43,32,-2,1,1,-1,0,0,0,0,0,-1,0,0,2,-1,-3,11, +-4,-30,-68,-116,-175,-177,-114,13,93,97,48,-18,-90,-77,-20,74,97,105,191,133,-8,-3,1,0,1, +0,0,0,0,0,0,0,-1,0,2,-6,25,63,103,133,210,206,123,-33,-122,-127,69,173,130,143, +23,-157,-13,-154,-459,-163,24,-2,1,0,-1,-1,-1,-1,0,0,0,0,0,3,-3,-46,-76,-81,-86, +-101,-100,-98,-76,-36,69,207,100,-46,-222,-90,7,39,-5,-5,-201,-131,-29,3,-2,1,1,1,1,1, +1,1,1,-1,1,-6,3,48,79,75,67,50,20,-6,-32,-41,-67,-70,-69,-32,2,1,-12,-26,34, +76,99,85,39,6,-1,0,-3,-2,-2,-2,-2,-1,-1,0,4,1,27,48,50,34,17,-4,-14,-34, +-66,-67,-70,-75,-67,-55,-20,-9,24,45,66,-7,-8,-16,-8,-6,-1,5,8,6,6,5,5,3,3, +1,-5,-10,-16,-15,-6,-15,-17,-23,-28,-34,-40,-37,-36,-33,-26,-21,-19,-15,-16,-15,-12,-34,-40,-45, +-39,-40,-35,-30,-24,-18,-17,-15,-13,-11,-10,-8,-3,7,19,39,41,35,33,30,26,23,20,16,12, +7,2,-4,-10,-15,-18,-22,-27,-7,-8,-6,-5,-2,-9,-8,-8,-7,-4,-1,2,6,9,10,10,24, +19,18,15,15,14,13,12,11,10,8,6,4,2,1,0,-1,-2,-4,-6,8,-20,-15,-19,-18,-19, +-21,-19,-17,-5,-12,-14,-14,-20,-21,-18,-21,-20,-23,-18,-17,-18,-20,-21,-25,-22,-20,-19,-16,-17,-28, +-19,-16,-6,-14,-16,-17,-15,-14,-22,-18,-15,-15,-10,-1,3,1,1,2,1,1,2,-3,-9,-17,-13, +-15,-24,-29,-39,-50,-43,-36,-28,-14,-17,-46,-27,-16,8,-11,-17,-21,-14,-5,-26,-13,-8,1,4,1, +-1,0,0,0,0,0,0,1,4,2,-6,-12,-24,-28,-40,-56,-45,-33,-23,-5,-16,-70,-25,-8,42, +-3,-7,-13,-4,-8,-35,-10,1,1,-2,-1,0,0,0,0,0,0,0,-1,-2,0,1,-12,-38,-54, +-86,-125,-109,-83,-51,-4,-26,-116,-56,-6,67,3,-25,-30,-12,-1,20,11,-2,0,0,1,0,0,0, +0,0,0,0,1,1,0,0,7,10,33,69,105,151,135,58,20,18,42,76,61,-6,47,72,99, +18,45,27,4,-5,4,-2,1,-1,0,0,0,0,0,0,0,-1,1,-2,0,-15,-52,-88,-120,-138, +-107,-38,47,80,46,20,-13,-54,-14,27,75,78,44,88,33,-13,4,-1,1,0,0,0,0,0,0, +0,0,1,-1,1,-1,17,59,96,126,154,119,30,-60,-88,-43,56,95,67,25,-48,-101,-17,-101,-201, +-39,21,-7,2,-1,0,0,0,0,0,0,0,0,0,-1,5,-15,-51,-50,-58,-67,-57,-47,-33,29, +83,139,-3,-87,-106,-33,34,92,-33,72,-169,-74,9,-2,2,0,1,0,0,0,0,0,0,0,0, +1,-7,18,51,41,34,18,3,-13,-35,-40,-52,-39,-37,-5,28,60,80,96,129,13,48,47,0,-4, +-1,-2,0,-1,0,0,0,0,0,-1,-1,-1,4,29,41,32,26,13,7,-7,-28,-36,-39,-41,-36, +-33,-23,-30,-20,-13,-6,18,21,9,6,4,3,2,0,1,0,1,0,0,0,1,2,1,-8,-19, +-21,-24,-25,-27,-31,-35,-40,-36,-34,-32,-24,-16,-8,-3,1,7,14,-21,-22,-25,-17,-16,-10,-3,-1, +0,0,0,0,0,0,-2,-5,-7,-6,5,5,1,-1,-4,-7,-9,-12,-12,-12,-13,-14,-16,-19,-19, +-19,-21,-21,-14,-13,-14,-16,-16,-17,-17,-17,-17,-16,-15,-14,-13,-12,-11,-11,-4,-5,-6,-8,-9,-10, +-11,-12,-13,-14,-14,-14,-14,-14,-14,-13,-13,-13,-13,-13,-13,-9,-7,-8,-8,-9,-11,-4,-3,0,-2, +-2,-2,-2,-3,-2,-3,-3,-12,-8,-7,-7,-8,-9,-10,-8,-8,-8,-7,-8,-11,-8,-7,-4,-7,-7, +-7,-7,-6,-10,-9,-2,1,2,1,1,1,1,1,1,1,1,1,2,1,-1,-5,-8,-12,-16,-19, +-15,-12,-11,-8,-10,-18,-12,-8,0,-6,-7,-6,-6,-4,-16,-2,2,0,-1,0,0,0,0,0,0, +0,0,0,-1,0,2,0,-6,-11,-15,-22,-13,-9,-10,-7,-11,-26,-12,-6,11,-5,-4,-1,-4,-5, +-18,2,0,-1,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,-10,-24,-36,-47,-33,-22,-17, +-8,-17,-43,-25,-8,18,-3,-9,-3,-4,-6,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,-1,16,27,39,49,48,35,12,1,5,15,34,25,-15,13,19,21,-2,17,12,-5,2, +-1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,-14,-32,-46,-55,-52,-33,-5,26,33,13, +3,-7,-19,8,23,34,30,8,15,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,8,27,41,52,50,30,-5,-33,-35,-4,21,27,19,-14,-37,-34,-9,-40,-46,10,-3,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,-13,-16,-19,-20,-16,-8,0,33,44,42,-19,-42,-23, +-3,20,47,-18,55,-31,3,2,-1,1,0,0,0,0,0,0,0,0,0,0,1,0,-2,17,11, +8,1,-4,-9,-17,-19,-21,-12,-7,9,29,49,62,77,76,-12,9,3,-3,2,0,1,0,0,0, +0,0,0,0,0,0,0,-1,2,17,14,14,10,7,2,-5,-9,-10,-11,-11,-14,-16,-23,-24,-23, +-21,15,19,5,0,0,-1,-1,0,-1,0,0,0,0,0,0,-1,0,2,-3,-10,-10,-11,-11,-12, +-14,-16,-15,-15,-15,-11,-6,-2,2,6,10,14,-7,-6,-5,1,1,2,1,2,1,1,1,1,1, +1,1,2,1,-2,-6,-7,-7,-8,-9,-10,-11,-11,-10,-10,-9,-9,-10,-10,-10,-9,-9,-8,-7,-6, +-8,-9,-10,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-9,-9,-8,-8,-9,-9,-9,-9,-10,-10,-10, +-10,-9,-9,-8,-8,-8,-7,-7,-7,-10, }; -const UWord32 defaultHRIR_rom_ITD_W_fx[658] /*Q25*/ = { -0xffffffde,0x00037a90,0xff0ed1ae,0xffc52953,0x002ad399,0x01085cda,0xfe7ecf7e,0xff6e3fa1,0xffe757e7,0x00e4982c,0xff986595,0xfe86d766,0xfe417af0,0xff6c553e,0xff9f2374,0xfe9eb08a,0xfdf3707c,0x00be1f75,0xff4511a2,0xff8274f1,0xfefa67d6,0x00016276,0x010869dc,0x008240b5,0x00c41384, -0xff42893a,0x0205fee8,0x015e93cc,0x005e8d67,0x0095178f,0x01b7518e,0x016cd626,0x00661c05,0xff2e08f1,0x0028002f,0x008ed0a6,0x0178697a,0xfeee98ee,0xffd87cce,0x004284ad,0x00f1ac80,0x0029d91b,0xfff2fa8a,0x0083e76e,0x021c1194,0xfeced6a6,0xfe715f1a,0xfc1debf4,0xfa4b89a8,0xfa187350, -0xf86ebf30,0xfb447e68,0xfc7b82bc,0xfd708f04,0xfb1dd548,0xfa4fe7b0,0xfbd43f60,0xfd27e7c0,0xff0fc532,0x00482bc9,0x028a1508,0x009390c2,0xfffd7fcc,0xff660df9,0xfd717c98,0xffa6b230,0x00ef141d,0x02e58130,0x042c7870,0x05b75600,0x04dbc1a8,0x029d0fd8,0x039771a0,0x04c03ee0,0x0771a8a8, -0x05ccfc78,0x05bdbe38,0x03eaf48c,0x01a3b838,0x012351ec,0xfde5fe7c,0xff5f4199,0x0044f539,0x000b8fdf,0x00183620,0xfd268020,0xfa206b38,0xf860a4b0,0xf61c1900,0xf3cabcc0,0xefb2e160,0xf0ff6080,0xece44700,0xec4890e0,0xea1836c0,0xee0df160,0xee2c26c0,0xf28e3790,0xf3d2d3c0,0xf63d9790, -0xf9449610,0xfbd574e8,0x0082debc,0x0002b7eb,0xff88a857,0x0429e930,0x06d2cd08,0x09c43430,0x0c19a0e0,0x0d7610f0,0x11c69ec0,0x11feff20,0x15d440c0,0x13a3a320,0x13141e20,0x0f2541a0,0x106fc980,0x0c22d260,0x09e44430,0x07799c98,0x06013010,0x02be127c,0x0022d553,0xffa9e8a1,0x00252250, -0x00144635,0xfe2344ac,0xfa648e90,0xf5714ff0,0xf03fd070,0xeb896c80,0xe7fa1c40,0xe4f70d40,0xe44a3ac0,0xe4e25820,0xe6cff220,0xe82364e0,0xe6a614a0,0xebfd2fc0,0xf0bb1c10,0xf4e4ff50,0xfb750f00,0xfe6277c0,0x00806a7f,0xfffd5a00,0xff5dd577,0x01b0515a,0x04588548,0x0b15dfc0,0x0f70caf0, -0x13f0b800,0x1978c480,0x17bba560,0x195add20,0x1b3a4e80,0x1bc65d60,0x1acb4e00,0x17c41560,0x14a003a0,0x0fb332d0,0x0ad4c240,0x05693130,0x01dc5e72,0x0014543d,0xfeef2e66,0x00642343,0xff41ca5f,0xf8af6218,0xf2e04cc0,0xed2ad2a0,0xe88db100,0xe2af45c0,0xdd5ec1c0,0xdac9f180,0xd64aab80, -0xce158200,0xd04f8980,0xd4012500,0xdd0acd40,0xe09456a0,0xe4d67d80,0xec90a600,0xf152a540,0xf971a878,0xff012827,0xfffaddaa,0x017e8062,0x061f8bb0,0x0f414690,0x1384e740,0x1aa49ee0,0x1fb2fec0,0x22a3e200,0x2c636380,0x2f32c280,0x31b88040,0x299ac600,0x25927d80,0x235aae80,0x1cbe81c0, -0x17eb27e0,0x11d1ff80,0x0e376c90,0x0611e978,0x024ff450,0xff052478,0x0032dd2e,0xff3b4502,0xf9b73680,0xf439b3f0,0xef265440,0xe8754520,0xe227bf60,0xde0d95c0,0xd9948a80,0xd55fc080,0xcf473700,0xcf5f75c0,0xd24efa00,0xdc108b40,0xdf4c2200,0xe5e6d320,0xec682be0,0xf39f2d10,0xf9394418, -0xffce5a4f,0xffe66dc7,0x00edfc3c,0x058f7dc8,0x0cd13790,0x14152740,0x19984720,0x20a64b00,0x24b8cc40,0x2d629d00,0x30c52180,0x3134ec40,0x2a143f80,0x26b18b40,0x21319680,0x1e8921e0,0x1797d4e0,0x11b991c0,0x0b678550,0x05e02e90,0x01ecb168,0xfeda9d20,0x0066806b,0xff3b5040,0xf8a68990, -0xf2481600,0xe9326260,0xe2ef8700,0xdbb353c0,0xd58fcf40,0xd0c98bc0,0xcc95bbc0,0xc54b6300,0xc8922900,0xcd245e80,0xd8a62780,0xdab39500,0xe21076c0,0xe82a9fc0,0xf0e06200,0xf8cf7a90,0xff216c04,0x0007fb22,0x00e43583,0x07d78ca0,0x0e9b99a0,0x17cf01e0,0x1ed05160,0x24c1ddc0,0x2712b100, -0x33404d00,0x3744d580,0x3a956cc0,0x346055c0,0x2ed75ac0,0x2b68c7c0,0x232fd680,0x1de0c9e0,0x15a8b460,0x0f0a04b0,0x06633d50,0x01810b20,0xff3c6e35,0x008888bc,0xfecb0c76,0xf90a1248,0xf09f8420,0xe912a920,0xe0af3c80,0xd975adc0,0xd4ed8f00,0xcd7b2ec0,0xc71d8980,0xbe81f200,0xc34bb340, -0xc95f8f40,0xd5b20880,0xd966d100,0xdf8690c0,0xe81b49c0,0xf0fa74b0,0xf8f8aa18,0xfea94afe,0xffff685c,0x0189a44e,0x06a9c958,0x0f773bc0,0x17f11920,0x1fd6a960,0x27aba2c0,0x29b36940,0x368d4b00,0x3d13fbc0,0x410e8900,0x38af1d40,0x31dcae00,0x2b0c6540,0x262e3a40,0x1fc95380,0x16c32300, -0x0efad910,0x06ee9a88,0x019f426e,0xff05228a,0x00581ed5,0xff00e290,0xfa0c8c50,0xf1d8ceb0,0xe9dc5b00,0xe0428ca0,0xdb637c40,0xd3424300,0xcc5438c0,0xc3c0bd00,0xbc06f600,0xc2444ec0,0xc795b900,0xd5004f80,0xd6eeaac0,0xdf712a80,0xe6b0db40,0xf1da1820,0xf929b6f0,0xffe593db,0x0005031f, -0x0048a5d7,0x07674148,0x0da5dbe0,0x196366c0,0x20556440,0x283f4700,0x2b74adc0,0x37fc5d40,0x3dc95600,0x44ac4380,0x3b583f80,0x35339b80,0x2b7be200,0x24e99a80,0x1f2d6080,0x15fb48c0,0x0f0593d0,0x05930bc0,0x01f951f4,0xfef5f254,0x006912e5,0xff018826,0xf9a100c0,0xf1f97b30,0xeb7fc420, -0xe3530780,0xdae99cc0,0xd642d380,0xce53f1c0,0xc9617300,0xc046a900,0xc897fd40,0xcd9e7b00,0xd4ecb080,0xd92bc200,0xe09b0d60,0xe8d72320,0xf139f250,0xfa817310,0xfe674bea,0x00086e03,0x018a0dae,0x050981f0,0x0ea933b0,0x175d1820,0x1f7d59a0,0x27826580,0x2ab30040,0x33a1f040,0x3683d580, -0x3f9d67c0,0x374365c0,0x30fa2c80,0x2b8fe7c0,0x23e8eb00,0x1d8d81c0,0x14699660,0x0d84ed70,0x057364d0,0x026654ec,0xfea4947c,0x004bf89d,0xfedf804e,0xfa6ffbb0,0xf4b971c0,0xeb672d60,0xe66c3ce0,0xdee688c0,0xd6e1fe80,0xd26b5b40,0xccf82c40,0xcb6a1d00,0xccfa3980,0xd0b3ebc0,0xd6cbf440, -0xdcc99580,0xe42df080,0xeb0ae2e0,0xf45a1810,0xfbcf3138,0xff6a4b72,0xffe125c5,0x01985dd2,0x044be680,0x0c30eef0,0x1477ad80,0x1c1165e0,0x232c5e00,0x2a129a40,0x2df8f200,0x340a4b40,0x342858c0,0x32a1b580,0x2e9f2cc0,0x27903dc0,0x21722000,0x19686060,0x136809c0,0x0c8c7b80,0x05df1bb8, -0x013c9990,0xff8d494e,0x00795a20,0xfe6ce02e,0xfcea7178,0xf5f515b0,0xf0e613a0,0xe9ae68e0,0xe33b5300,0xdfac6680,0xdb240340,0xd88a8980,0xd5bef980,0xd892a000,0xda9b8f00,0xdf549480,0xe2de7380,0xe928cde0,0xeeca9f00,0xf7444470,0xfc84447c,0xff4f6c76,0x002c1fae,0xff6a6646,0x03800cd0, -0x092181a0,0x1058d300,0x16c52020,0x1d3cc540,0x1ffb9be0,0x262ccfc0,0x26d3ef80,0x2a925e00,0x27852000,0x2422bcc0,0x2191bfc0,0x1c146b00,0x174fcec0,0x0fd5ee20,0x0a726de0,0x02952814,0x0110147e,0xff77b0fb,0x002d720e,0x003706f6,0xfc1350ac,0xf8af0940,0xf3867670,0xefaa66a0,0xeb3e5d00, -0xe6e96ba0,0xe4cd63c0,0xe35593c0,0xe0e3eea0,0xe2a9a4e0,0xe5145320,0xe561d240,0xeaf5b1c0,0xeea98440,0xf38949a0,0xf863c958,0xfcce1d7c,0x0051a873,0xfffa9df8,0x002326e6,0x03464ea4,0x07746010,0x0cce9330,0x115ee8e0,0x15069c40,0x1ae36c40,0x1a972a60,0x1d954f40,0x1ef6db40,0x1ca8f780, -0x1b5c3e60,0x18a28ba0,0x14ee2420,0x0ffc8b40,0x0c02b580,0x07558f70,0x03e03498,0x008e90b7,0xfed31a64,0x0001ac1f,0x0029349d,0xfe3feac8,0xfb406fd0,0xf97cecb0,0xf67ea100,0xf3fd6a00,0xf04bfe40,0xf11dbc30,0xed7e0080,0xeea6a7c0,0xec9a1d00,0xefdab9c0,0xeef63fc0,0xf331f790,0xf4fbecf0, -0xf72ef560,0xfb0ccb00,0xfccd66b4,0x00a47efb,0xfffeab29,0xff24ccf7,0x0322302c,0x0504a378,0x08a52610,0x0afdbce0,0x0ccb7fb0,0x10ea75a0,0x104c6260,0x134a70e0,0x116a43c0,0x1282d4a0,0x0ed55190,0x0fec8fb0,0x0bf36e40,0x09b36b00,0x06c08cc0,0x04cf2598,0x01928b6c,0xffd3a481,0xffb3863b, -0xfffa05a6,0x0058f182,0x01447e48,0xfdbdf9fc,0xfd81915c,0xfbbed5d8,0xfa16f7b0,0xf99ddbd0,0xf84c34f8,0xfaad2370,0xfa73bf40,0xfb350da8,0xf98acd48,0xf9959ba8,0xfb39ba10,0xfc335610,0xfe1e98f0,0xfec90b2c,0x01ad3e90,0x006c3783,0x0003932e,0xffba31e3,0xfe616224,0x012e22d0,0x0200ea4c, -0x03d47498,0x04cbf8b8,0x067d4f90,0x065d9000,0x04d98df8,0x05827a68,0x055257f8,0x07b6f588,0x063bb330,0x05ead9f0,0x041b5b20,0x02468c7c,0x02390f68,0xfedaab24,0xffade7f7,0x004f8d7c,0x00018e86,0xff48977f,0x0035e1f5,0x00e10b6c,0x019ba8de,0xfec09cfc,0xff97854d,0x002a2158,0x0102f1ca, -0x00073c50,0xffc53d17,0xffaef3ae,0x006c6e6f,0x001e3554,0xff07f047,0xfe85f03e,0x01690b7c,0x002de0f0,0x0004a149,0xff2c94fc,0xfffd8383,0x00bfdc23,0xfff389ae,0xffd2c64d,0xfe883edc,0x0173389c,0x00f2eb6a,0xffdb167a,0xff9bf93c,0x004de8c3,0x003de697,0xfff9603a,0xfeffbcf4,0xffe7c878, -0x006e0794,0x0155a804,0xfe867a7a,0xff23a62f,0xffbef3f5,0x00a43429,0x00169261,0xffff467a, +const Word16 defaultHRIR_rom_E16_Q_fx = 29; +const Word32 defaultHRIR_rom_EL16_fx[HRTF_MODEL_N_SECTIONS * 470] = { +206109184,168120064,191836192,182078752,192106976,197882288,207667584,212469392,217470368,208949424,203938496,198973968,193378656,188390048,183902768,179393808,175609504,172489072,169782128,162989616,172482848,153900912,154645488,189723344,148310880, +147260160,175093168,177518016,174857792,169232592,172577584,175110624,174396064,150769184,156768384,187324416,165548368,208977632,238512976,244999424,267489248,291183104,328354304,349786944,360435680,332970464,310346528,289399904,269192896,251692384, +237131536,221576976,209321184,200918752,189855088,180484592,171830512,161160240,141841104,134512256,125414992,119845664,117368384,120750992,123921712,123004512,122238832,125347576,126782232,137111680,144494864,153992368,180505392,204399584,262655728, +298320256,344245376,406163808,490018080,537979392,578338432,507220192,452954496,404439840,355135488,316154528,284176768,251700608,225152384,207103936,181217056,166685616,137923328,121933232,105643760,93692192,83219840,76572280,69140792,76922240, +79131312,84500904,71196768,72010016,79883024,92147624,109890000,127893352,163771200,220321024,312036256,367424160,439088480,554767616,710491840,828487040,898985024,734165248,606421696,507442848,423498240,356850464,308319552,258465792,221124640, +196758640,165635424,143890848,115598728,96854216,72097736,59931184,46227440,39381848,34168920,40089264,44927784,47203808,37241560,34851976,44969456,56426528,76613792,100918192,152480192,399726368,494178240,612774720,738867264,913774016, +1015694784,1084138496,1103635072,1159515776,1164112256,1008717568,974320896,875714176,754657600,617704576,497989984,418706048,292982720,229276752,162655360,123141104,90558760,70114368,48819120,41466720,39266032,50099264,52187744,50348008,46237000, +51234056,72631848,96214440,137178432,187817600,300016992,462471488,567334720,733217280,874097920,1174631680,1286952320,1373828608,1346466048,1287138176,1165757184,991719488,896359168,796200640,719947456,590664768,481113152,399392480,328406592,287663456, +216625440,154972224,107064536,76870360,57428432,46734544,42127024,52522400,62614184,79405976,71736776,80147888,104968928,118662160,165216688,242145088,349083936,503854432,709262784,1012107840,1212962688,1483765632,1619158016,1755042304,1752943744, +1652902144,1454505600,1215569664,985248512,785121280,623493696,502121312,409419296,355543872,298307392,272979360,232664576,199639616,163435072,130697848,92321872,74772040,93719208,81362072,95377064,157825248,86263896,78689784,107160072,131705944, +174796752,254502528,335281472,542202496,771617280,1030022272,1281971200,1635046528,1613323904,1644626688,1726421632,1666416896,1520938368,1267465600,1076028544,884427584,696921856,556420864,434570976,332454784,292162560,265444640,233382608,204264672,170692496, +146950576,114032160,90188616,87566040,72851760,93604624,232943472,104100736,89749600,102672592,125068920,164233728,235126928,354023264,488680192,683078400,1052083200,1286615040,1385048448,1409591296,1367720960,1298312064,1113216384,1033010112,1011368128, +869295296,728075584,592695680,459949664,375870720,322048352,297008768,279547872,261622720,220100848,188427232,156912768,129120672,108937760,96758480,98883608,107011064,153476224,112355080,111255184,112587264,147342896,186114784,244399488,339314240, +528587008,601502144,793711808,906564736,1006623680,1077107456,1057611776,964346624,869017472,771174336,684539520,581343552,506561632,450886240,408277408,373501344,343111424,349389824,344447744,277441472,280565536,227772256,194191264,163515680,136016304, +119446536,120703632,126560952,122274448,130193664,130656400,127536288,152266848,192815808,253773824,350910080,472321056,547797888,639467904,721325376,836666368,815081024,815604736,833188416,767886464,714141376,664641536,620124416,576242240,530260992, +506178784,486917408,468211584,426847104,392531616,353566336,321788384,279274720,244087952,212426640,208305600,172602656,187151504,164453904,187227232,159222960,194007232,178926720,230566400,274833792,348249088,387061440,553421632,483935552,485644416, +510384992,538348160,570222592,606724480,649568896,626935808,614548352,599337024,584361216,573207168,564234560,535950496,506087872,480232032,453680864,425747456,415913120,468902944,340128224,331994400,310439520,287833312,267595344,274276608,287952992, +280450400,292872288,288485280,273626656,306225536,334716032,362626944,392097184,419460928,449196288,408816096,429340096,432539904,444566880,452610368,467366752,457587296,453929920,449801568,446299520,442683104,441308224,430540544,422276832,412714688, +407264384,388588768,425088608,406717344,439550560,604455232,371539840,405388736,532268160,542215104,527923904,494523680,527103296,536172064,518294976,408239712,383602304,591872768,456632128,497591360,267266,213486,180610,210414,224448, +191054,271530,265228,186520,204566,171518,117624,111536,130806,206048,218590,242368,245210,260716,283602,315238,332802,330174,344988,239098,217264,197198,265416,286594,311174, +266414,249202,233786,204796,215524,388986,243256,393942,246684,239336,210012,156358,338488,364384,163522,253404,188940,201616,101594,122790,289950,295360,377124,360192,422756, +515550,635644,723626,716252,691738,397896,273122,220234,386918,486930,544258,433436,324014,253624,182498,264566,943564,502252,462018,546658,390820,442890,319276,793498,725126, +137842,358962,269440,897454,527670,513626,825366,470868,559546,467990,621328,859012,1168948,1413246,1504126,1483454,711350,354838,316246,712958,928244,1156904,819880,589838,390698, +317974,354374,1873780,531892,1255298,723388,505732,322758,701476,1138342,1134664,271232,434984,806966,3305746,2664378,2302900,2046412,1191030,1166408,862000,1091726,1635750,2266378,2703584, +2794324,3115780,1820740,986528,618386,1154338,1810754,2200840,1559766,1267176,550668,1028902,719718,4877388,2063368,9141834,2330896,1404556,3314848,9994588,4589210,2657046,1654550,3446654,2423422, +3640548,3406256,2979336,2004462,831444,723140,693922,682170,894850,1323852,2359638,2768186,3135158,1737916,1204886,942910,314558,404312,2301478,1930490,2435888,2316760,3079952,1443836,3805966, +6705070,10780826,13954706,2660552,2400836,8511080,7115890,3987882,3501532,1254856,1444370,1565692,1000276,851680,738114,803520,942324,816510,665380,725764,888756,739974,649096,793392,904058, +695390,497492,836848,991106,1005186,329920,410306,1415360,3121858,2924416,3717840,8247580,5383982,6276048,3760510,3642820,2899882,3787242,2500622,5394778,3556984,2891776,1722514,804330,606258, +859606,1201306,1187192,785872,1005144,907044,1627682,394236,240650,633430,415080,244090,256424,194250,78010,72954,429066,733310,839192,1188180,1933018,2952736,3857424,11329458,13910518, +24760602,23704384,14811710,6116310,4053928,4405154,2394368,2059856,1807198,1236324,1183462,773120,782670,747508,723826,922860,757160,944004,527824,549332,577368,543808,355870,280710,129782, +147030,263230,318486,440496,1319762,1097264,2315108,5749138,8897220,22214576,30100104,25984080,16421484,9582142,7388242,8597914,7549396,4000656,2548390,1636988,1342566,1000362,865602,641182,589636, +619722,568972,492060,432316,286540,212172,372588,172950,201688,404286,211708,235844,382394,873628,1850956,3397078,9348070,13422044,13732732,16788662,14896624,13846926,12943808,10790152,10846622, +11975116,10806688,7942984,4620840,4233842,4520146,5486060,5447602,3867726,3444998,2779182,1946892,1545348,979228,351728,433780,354894,309166,318464,657728,1404404,2146854,3091710,3814674,5767036, +7528000,8777386,8321046,8295558,9926072,11836506,7439082,8301212,8233734,8946652,10928306,9922590,10835976,13242654,9893378,7774002,7242268,5985236,4925696,4066144,3231772,2622794,2141414,1515900,1025948, +807156,648738,468764,679918,866138,1340016,2022752,2531922,3087370,4140136,4323334,4833078,5661764,6065440,6854600,7737254,7505382,5419186,5395384,5037642,4786908,4677048,4684166,4746616,5049716, +4529476,4458478,4182916,3985612,3745316,3667786,3033548,2516454,2027760,1642538,1256188,929242,1110512,1115666,1286048,1417194,1745654,2069652,2433138,2817534,3229614,3662330,4202498,4723504,4756304, +4828838,4887960,5044636,4042682,4100126,4014476,4037286,4005082,4122866,4193724,4322194,4170272,4044308,3966040,3793754,3666822,3597426,3329336,3127602,2949860,2709340,2551336,2236852,2491476,2627670, +2889034,2756774,2909814,3160450,3259076,3335142,3450622,3583716,3731660,3936224,3881560,3896218,4126348,4040170,4776272,12574,7962,8856,11574,14638,25032,14486,10212,4092,12412, +16186,21848,15654,17568,27090,28732,26974,20804,12406,9514,8946,9064,9796,12268,16964,14560,4536,9776,8672,9122,5990,4100,7302,4872,7112, +16870,8466,9696,13066,37498,59118,103442,64026,39516,8164,24912,31882,62752,29888,62784,145512,180966,169262,109538,55166,35986,33412,25532,18766,25086, +47516,43390,12344,26778,28002,42708,38936,30686,39446,10038,6972,49220,11758,4834,28196,57056,120982,227894,182948,117128,46220,57612,98610,217714,112644, +144048,327832,329196,296626,179258,65802,47694,61434,36420,25244,41046,104250,76564,94178,73424,138852,352698,339404,231686,167096,34534,10508,114804,9724,68018, +38204,259698,461166,840814,589422,385408,138194,95930,112464,483680,130386,475992,1341340,1593506,1393660,901800,462330,374256,365658,217956,94764,176822,233718,159764,116648, +107620,117288,269102,560042,487744,438210,245106,85018,404308,109658,879030,832442,1719392,1673588,1449940,574080,246580,353352,183270,658660,1373800,1193828,1025466,1630402,1316286, +1001492,967188,1032290,1242564,1155152,890890,592992,476454,234168,100668,110570,139416,177496,16046,23638,244602,620576,512974,460354,318696,550448,1173130,509636,495748,597342, +1283514,1744144,1817878,495736,288540,337402,1570374,1153584,1465912,1330824,694698,625402,444270,402738,258518,322680,118862,66756,38142,32612,11584,60428,71688,105424,51568, +17352,113232,399810,1536280,1504100,892274,607144,6187728,11506240,2922548,884782,2058466,1637372,1701042,2105672,1632514,1690052,1204318,404220,634892,802344,545194,484548,331466,204236, +107074,97070,37786,27940,74192,65826,43218,52470,3042,14344,7008,23438,76448,149416,99912,117256,514604,2728242,2806944,5878460,2102208,914458,1178468,1081506,773910, +1031152,509078,593746,370258,153630,273914,351240,282182,215932,214716,175250,212372,222802,194230,159438,117414,23542,1516,7058,2586,6018,10202,1888,3414,63964, +94882,128906,1228174,2397518,1383266,1274728,846896,665736,269998,161532,365982,439022,678938,826982,896796,723606,505574,370076,138744,46512,72566,166208,276596,372870,407130, +351084,286496,124744,39902,5728,9898,18240,20612,32022,32082,50896,20280,40412,203916,948036,440178,500928,578798,543040,486548,410652,436506,524092,476174,488152, +551256,499094,416086,276168,166368,67792,27158,30718,55076,108252,125724,101660,68308,69270,67886,65076,44622,71262,97650,145758,172088,171988,231076,287966,314948, +358540,324222,330350,281824,213506,146672,101000,96600,112610,95526,89332,101596,57882,49748,69804,60474,63518,77136,73904,83644,103020,114396,136402,164556,131152, +135390,186110,160372,167618,199178,209300,230184,290704,300990,362884,414172,347270,227430,220188,189004,162494,129528,103826,86492,91680,89052,91576,90918,86588,81594, +84720,84678,91422,100564,114084,128826,145664,144416,143270,154960,172336,198780,232486,224320,229130,243546,253982,278152,305628,271264,238448,232328,211608,120464,116124, +109624,100118,96518,91816,88820,84582,85346,85350,88822,92212,97390,101608,105924,109820,113596,118122,122622,131664,130724,133056,136540,137080,141160,156212,150422, +150002,147010,147650,145866,151212,135474,130448,130966,127672,150044, }; -const Word32 defaultHRIR_rom_ITD_azimBsShape_fx[84]/*Q30*/ = { -1073741824,782757760,549755840,368293440,231928240,134217728,68719480,28991030,8589935,1073741,0,0,275683200,466003936,582236480,635655168,637534208,599147968,531770624,446676608,355140096,268435456,195689440,137438960,92073360,57982060,33554432,17179870,7247757,2147483,268435,0,0,15121864,56550404,118380040,194705184,279620256,367219712,451597920,526849312,587068352,626349376,640397504,631360192,602995520,559061568,503316480,439518304,371425184,302795200,237386416,178956976,130459632,91625968,61382240,38654704,22369622,11453246,4831838,1431655,178956,0,0,178956,1431655,4831838,11453246,22369622,38654704,61382240,91625968,130459632,178956976,237475904,303511008,373841120,445244928,514501280,578388928,633686656,677173184,705627328,715827904 +const Word32 defaultHRIR_rom_ER16_fx[HRTF_MODEL_N_SECTIONS * 470] = { +206128352,182152384,192350944,168282528,165563744,187485760,156466208,150736768,174374272,175048048,172493136,169116592,174792992,177535520,175115648,147247616,148037728,189523808,154650752,153955408,172592960,163017504,169754832,172491440,175609504, +179393808,183906528,188398144,193378656,198975056,203956096,208932816,217478272,212479760,207633888,197928912,192060992,245076096,237265376,209167392,180870912,154668416,144999264,137137200,126273232,124687720,122656800,123468488,124295824,120827176, +117041504,119796976,126067584,134359840,141160512,161312448,171415936,180462944,189888272,200902112,209354912,221573840,237161808,251710176,269192864,289400160,310378432,332914240,360379168,349797536,328461440,291087456,267655360,297404288,264353088, +204371120,163997952,127128600,109615440,91939512,80331112,72233632,70725944,84350384,78648424,76976496,69349760,76560040,82367712,93814664,105849912,121753608,138633568,166333360,181310384,207104608,225117152,251745312,284160384,316142208, +355141952,404439040,452861952,507200608,578600320,537961088,489810272,406187904,344399264,372253280,308057824,221393504,150575856,102362808,76494544,57050968,44799032,34806624,37048104,47121240,44608632,40231680,34047116,39920144,46443928, +60199856,72279080,96631664,114265184,145370128,164841648,197280352,220866768,258609536,308249888,356906368,423481888,507484064,606399936,734498176,897616768,829517056,709441664,556420992,436480768,623810816,486340224,400565856,299029184,189420192, +136412352,96217752,72738744,51228880,46188136,50339416,52215768,49971120,39824752,40818544,48855680,69671600,90990616,121707128,157415136,234258352,290252064,420749344,496965216,618254400,754238400,875966976,974487296,1008266880,1164100864, +1159669504,1102591616,1085713280,1013506880,918113024,731963648,742570880,560226688,462341920,339907296,248603312,166952400,118087792,105815464,79044456,72631824,78385784,62397088,52989264,42075744,47366416,56566632,78075384,108271584,153591312, +215751680,289314240,327391520,400130560,480698912,591035456,719399360,796348672,896360576,991788736,1165791872,1287385216,1345240576,1375482880,1285031680,1178286592,868637504,1026530240,698549440,514502912,339064064,250493408,175600784,128371112,106690728, +79105416,86226280,159617536,96188088,81177848,93520872,74433144,94104040,129578984,163452624,200297216,231742528,273720640,297944896,355769184,409322656,502137280,623456384,785127872,985208704,1215631616,1454446848,1653367808,1751333376,1756706688, +1617278208,1488954112,1204162816,1057932224,746736832,546228736,348133600,242479808,163856976,124100496,105130240,89699720,104048848,229819552,91023840,74437512,88347512,90195536,114181960,148130144,171596656,203136416,231091456,266767904,291462688, +332834560,434309792,556552896,696823168,884548416,1076196096,1267413120,1520998656,1666752640,1725245184,1645824640,1611564800,1638020096,1271226752,1048591680,691262976,503895168,324293536,238974752,189905472,142309056,114721824,114161032,112459576,151271232, +107770512,98425912,96319880,107356264,130807136,154731072,184381520,226170720,258880976,280958848,296696512,322040032,375936896,459896128,592610432,728096704,869436608,1011262976,1032990336,1113469184,1297538944,1368354688,1409420928,1385334272,1286523776, +786960384,606822528,496098304,352722144,255684928,198413664,151798208,129385152,128773760,130105408,118645056,126465664,121092688,119518416,136201904,163083456,189322672,228552544,275836192,283123616,339294944,350637760,342715904,373676384,408158784, +451008992,506425152,581316608,684496192,771180992,869042688,964212096,1057772416,1077721600,1005589568,908965504,641905152,546072960,479308288,387576000,341689600,269615456,230463760,178570976,194537632,159201952,187096544,163875904,186949920,171652944, +207692384,213874768,249586576,277610592,322849792,351194720,393544032,426866304,468186656,486961440,506174976,530187872,576259264,620124416,664586304,714140864,767872576,833267456,815437632,814990208,836912320,720678400,484890016,487157600,544466304, +386384672,362585888,334775424,305954720,272607328,288666176,293725920,279703872,287797120,274695744,269107328,288776960,310626240,332651488,339874144,467618528,418781120,425573152,453462016,480306336,505995392,536020576,564254912,573175168,584326592, +599365504,614491008,626916352,649499264,606757376,570175616,538457088,510412896,408895104,446780480,420139456,455192224,583051776,385782304,407894752,518266048,536080768,527538080,494605696,527654176,542258112,532377472,405097024,370817184,608365696, +439696160,406397120,423051552,388374752,407580800,412670272,422282688,430541856,441308224,442682112,446298272,449781600,453929920,457584320,467371136,452557952,444602240,432503520,429468032,497591360,267266,210068,180600,213720,244090, +389528,215824,204416,233140,248648,266112,311512,285478,265672,197404,217264,240472,344498,329230,332076,315532,283602,260562,245210,242368,218590,206048,130806,111574,117630, +171518,204566,186886,265228,271404,191054,223978,239472,245560,393968,500940,940958,264932,183426,253874,323906,434678,546484,489412,386870,220234,273704,395620,691980,719368, +723728,634692,515796,422756,360562,377178,295014,289972,122898,101594,202254,188940,253760,163204,364384,339652,156812,210128,390800,546588,461298,529818,1884134,349898,319898, +389194,588856,815202,1154394,924302,714256,318334,353416,720216,1482640,1501678,1414720,1168806,858754,622692,467990,559546,470868,827590,511354,526756,894744,269440,359728,137642, +724540,790620,318498,443670,504910,721302,1249180,2079428,4816616,725480,1015896,552750,1268952,1564988,2202564,1808418,1152614,615076,1006590,1780116,3132800,2806070,2707702,2265352,1638738, +1090640,861790,1166108,1191824,2034122,2308750,2674242,3298990,808152,434014,268290,1137854,1142796,699500,323910,1407602,2338332,9168664,6677630,3787938,1457578,3053288,2312660,2440328,1919574, +2309898,401422,312600,953512,1201354,1725038,3166174,2771694,2354144,1332096,897610,681626,694262,722388,832296,1992846,2993170,3418914,3651512,2429262,3425232,1649906,2662294,4588742,9999410, +3308572,2678340,13922908,10873826,8223618,3732632,2978106,3009616,1439604,401860,327742,1009754,987586,838434,496954,699120,914032,790962,643566,753268,884690,724516,664622,819704,941528, +805522,736330,853262,1003140,1568246,1449040,1248920,3466024,4000512,7130458,8496084,2395484,3792816,6295862,5434476,3704970,2888044,1959684,1173924,856056,735924,407656,72058,78278,194830, +257594,245510,423058,626526,230380,400508,1627138,901984,1006368,787768,1187374,1199044,859018,607388,804886,1719992,2891378,3556458,5366728,2511274,3802598,2899244,3627472,25120990,13514858, +11676680,9234356,5655614,2275916,1134540,1247522,436810,329020,251146,145988,129074,289524,354408,548912,577202,549598,536476,943066,752846,922374,724924,748710,783030,770284,1184780, +1239498,1808262,2062372,2397512,4395182,4058218,6104062,14883780,23501882,25908030,30063392,22571688,17374216,13454604,13582748,9269728,3362702,1831004,862154,389412,233774,209432,420470,204444,173824, +377568,215082,299974,435976,487880,570190,623782,588990,641944,862616,1001646,1342128,1637854,2548390,4005070,7515854,8626528,7394090,9574448,16428088,12961394,13775124,14344812,11868326,10156264, +8557212,8256300,8954982,7439398,5768342,3813870,3090112,2142148,1411170,661910,316202,310410,359106,434186,353476,974994,1545038,1945606,2779182,3445160,3865238,5452030,5492132,4513054,4233476, +4621070,7918000,10825144,11992072,10843026,10785774,8217790,8360738,7587168,7402010,7558166,6728508,6067196,5612286,4847622,4343858,4138596,3091120,2536150,2020520,1339812,867640,688342,463824,643848, +807894,1025134,1515900,2140308,2622794,3231772,4066144,4925696,5985236,7238916,7774424,9893378,13232688,10832346,9917764,10928306,8950016,5038732,5372780,5356036,5025042,4911168,4861548,4769376,4731398, +4203170,3663386,3233542,2814452,2433138,2071270,1747576,1417104,1283476,1118030,1116364,928730,1256188,1642538,2025580,2515912,3033634,3664890,3742086,3985322,4182916,4456344,4531282,5051566,4750352, +4685662,4677048,4786908,4012860,4106442,4060090,4049024,4116280,3896594,3874776,3936128,3731660,3583352,3445884,3330918,3260942,3159440,2911964,2758394,2889628,2623670,2491570,2239538,2551336,2709662, +2947174,3127602,3329336,3597426,3666822,3794276,3966040,4044308,4166678,4322194,4193724,4122866,4005564,4037286,4776272,12574,11574,8856,8016,8466,16870,7112,4860,7168,4164, +5990,9006,8672,9776,4440,14482,17070,12268,9828,9064,8946,9514,12178,20682,26974,28732,27188,17634,15654,21848,16186,12510,4046,10212,14528, +24962,14638,37236,13066,9670,11758,49052,6966,9984,39414,30510,38954,42632,28168,26736,12312,43688,47770,24562,19290,26128,33412,35986,55348,109538, +169262,180966,145512,62784,29888,62752,31534,24912,8034,39642,64092,103442,58828,56302,28082,4834,9770,115388,10630,34764,166610,233100,339290,353698,139122, +73666,93672,76392,104218,41486,24350,36382,60722,47540,65660,178514,296626,329196,328686,144472,112644,217370,98740,58092,46506,117128,182526,227894,120848,257524, +39618,67418,109882,399494,84622,245256,439840,490060,556694,267102,117570,107092,118128,159130,232258,175706,99054,217374,368112,372338,462908,902982,1393660,1593506,1335966, +474310,130484,483680,113076,95428,137488,385290,590356,841548,461166,1714892,834574,879886,550566,323816,458998,510218,621198,243960,22996,15684,177124,137466,112824,100176, +234170,474898,592408,894678,1151806,1245858,1030062,972634,999742,1318350,1619118,1028984,1197246,1376064,658850,183270,350556,247154,573822,1449404,1670198,497674,501710,1188438,599780, +874554,1522072,1512724,404842,110710,17112,52010,105424,70874,59818,11550,30944,38674,63928,125932,320838,258504,402828,445810,625402,694698,1321934,1471694,1156334,1570548, +337402,288540,494540,1823728,1752074,1282592,598614,2934558,11481266,6191586,2706882,508786,116708,100142,149934,77034,23274,6998,13992,3196,52754,42398,64868,72950,28086, +38010,96592,107142,204278,332808,484548,545194,798794,638282,406660,1201560,1698958,1626790,2091692,1703574,1635660,2059296,880728,2122996,5851924,2807572,2384552,1227512,129530,95240, +66280,3448,1952,10522,6118,2572,7272,1646,23522,116180,159840,198390,222592,213372,174908,215732,215932,282744,350676,274540,153572,370436,594940,509308,1022438, +777282,1081368,1177796,909198,843324,1269858,1386722,944092,208076,40188,19574,49384,33222,31772,20596,18080,10010,5598,41284,125306,281170,358216,407638,370640,276146, +166208,72566,46486,138744,369104,506328,723972,899038,826942,678938,438352,367092,162176,270220,665432,577018,503116,433674,357494,318506,291704,231960,173218,171862,147504, +97650,72070,43470,65152,67886,67676,66328,103180,123348,106890,55484,30496,27218,67792,166368,275314,416322,500120,551256,487990,476174,524092,436506,410652,485920, +543836,281420,334078,325006,339514,408624,360116,301824,289242,230758,209818,199178,167616,160240,186028,135390,131712,165870,136084,114520,102844,83622,73904,77136,63518, +60474,69822,49748,57882,101596,89332,95608,112610,96600,101000,146672,212808,189178,220678,229280,210462,230460,236384,270938,305156,278644,254364,243546,229444,224320, +232556,198306,172218,154478,143270,144858,145664,128826,114084,100564,91422,84678,84720,81594,86588,90888,91576,89052,91680,86214,103826,129528,162384,109624,116584, +120546,127320,131738,130566,135474,151212,146400,147650,147010,150002,150422,156626,140990,137786,136914,133056,130930,131664,122622,118122,113596,109820,105924,101608,97390, +92212,88822,85704,85346,84582,88820,91816,96518,100118,150044, }; - -const Word32 defaultHRIR_rom_ITD_azimKSeq_fx[19]/*Q22*/ = { - 0, 41943040, 83886080, 125829120, 167772160, 209715200, 251658240, 293601280, 335544320, 377487360, 419430400, 461373440, 503316480, 545259520, 587202560, 629145600, 671088640, 713031680, 754974720, +const Word16 defaultHRIR_rom_ITD_W_Q_fx = 9; +const Word16 defaultHRIR_rom_ITD_W_fx[658] = { +0,3,-241,-59,43,264,-385,-146,-25,229,-104,-377,-447,-148,-97,-353,-525,190,-187,-126,-262,1,264,130,196, +-189,518,351,95,149,439,365,102,-210,40,143,376,-273,-40,67,242,42,-13,132,540,-305,-399,-994,-1460,-1512, +-1937,-1212,-900,-655,-1250,-1456,-1068,-728,-240,72,650,148,-3,-154,-655,-89,239,742,1068,1463,1244,669,919,1216,1906, +1485,1470,1003,420,291,-538,-161,69,12,24,-729,-1504,-1951,-2532,-3125,-4173,-3841,-4892,-5047,-5608,-4594,-4564,-3442,-3117,-2498, +-1723,-1067,131,3,-119,1066,1747,2500,3098,3446,4551,4607,5588,5028,4884,3877,4208,3107,2532,1914,1537,702,35,-86,37, +20,-477,-1435,-2703,-4032,-5239,-6150,-6921,-7094,-6942,-6448,-6109,-6490,-5123,-3909,-2843,-1163,-414,128,-3,-162,432,1113,2838,3953, +5105,6521,6076,6491,6970,7110,6859,6084,5280,4019,2773,1385,476,20,-273,100,-190,-1873,-3360,-4821,-6002,-7505,-8865,-9526,-10677, +-12778,-12208,-11263,-8949,-8044,-6954,-4975,-3757,-1678,-255,-5,383,1568,3905,4997,6821,8115,8868,11363,12083,12729,10651,9618,9051,7359, +6123,4562,3639,1554,592,-251,51,-197,-1609,-3014,-4314,-6027,-7640,-8690,-9835,-10912,-12473,-12449,-11697,-9199,-8372,-6681,-5016,-3169,-1735, +-50,-26,238,1423,3281,5141,6552,8358,9401,11619,12485,12597,10772,9906,8498,7817,6040,4538,2920,1504,493,-293,103,-197,-1881, +-3512,-5838,-7440,-9293,-10864,-12086,-13162,-15029,-14190,-13020,-10074,-9548,-7664,-6101,-3872,-1841,-223,8,228,2008,3740,6095,7888,9410,10003, +13120,14149,14997,13408,11991,11113,9008,7649,5545,3850,1635,385,-196,137,-309,-1782,-3936,-5869,-8017,-9866,-11026,-12933,-14562,-16766,-15540, +-13984,-10830,-9881,-8313,-6117,-3846,-1799,-343,-1,394,1706,3959,6129,8151,10156,10675,13965,15636,16655,14511,12765,11020,9774,8137,5827, +3835,1775,415,-251,88,-255,-1523,-3623,-5668,-8125,-9373,-11454,-13228,-15423,-17401,-15804,-14442,-11008,-10513,-8335,-6479,-3622,-1750,-26,5, +73,1895,3494,6499,8277,10303,11125,14332,15817,17580,15192,13620,11132,9450,7981,5627,3846,1427,505,-266,105,-254,-1631,-3591,-5248, +-7341,-9494,-10685,-12716,-13983,-16313,-14184,-12898,-11027,-9940,-8037,-5929,-3782,-1407,-409,8,394,1290,3753,5981,8061,10114,10931,13218,13956, +16285,14147,12538,11152,9193,7566,5226,3461,1395,614,-347,76,-288,-1424,-2887,-5273,-6548,-8473,-10526,-11669,-13064,-13462,-13062,-12108,-10548, +-9014,-7122,-5365,-2982,-1073,-150,-31,408,1100,3121,5240,7185,9004,10771,11769,13322,13352,12962,11935,10128,8562,6504,4968,3212,1503, +317,-115,121,-403,-790,-2571,-3866,-5714,-7365,-8276,-9436,-10101,-10817,-10093,-9572,-8363,-7458,-5847,-4405,-2236,-892,-177,44,-150,896, +2338,4185,5829,7485,8188,9773,9940,10898,10117,9251,8594,7188,5968,4054,2674,661,272,-136,45,55,-1005,-1873,-3194,-4182,-5314, +-6423,-6963,-7338,-7964,-7510,-6892,-6814,-5386,-4438,-3191,-1948,-818,82,-5,35,838,1908,3279,4447,5383,6883,6807,7573,7927,7337, +7004,6307,5358,4093,3075,1878,992,143,-301,2,41,-448,-1216,-1667,-2433,-3075,-4020,-3810,-4738,-4441,-4966,-4133,-4362,-3278,-2820, +-2257,-1267,-819,164,-1,-219,802,1285,2213,2814,3275,4330,4172,4938,4458,4739,3797,4077,3059,2483,1729,1231,403,-44,-76, +-6,89,324,-578,-638,-1089,-1513,-1634,-1972,-1363,-1420,-1227,-1653,-1642,-1222,-973,-481,-311,429,108,4,-70,-415,302,513, +980,1228,1661,1630,1242,1410,1362,1975,1596,1515,1051,583,569,-293,-82,80,2,-183,54,225,412,-319,-104,42,259, +7,-59,-81,108,30,-248,-378,361,46,5,-211,-2,192,-12,-45,-376,371,243,-37,-100,78,62,-7,-256,-24, +110,342,-378,-220,-65,164,23,-1, +}; +const Word16 defaultHRIR_rom_ITD_model_configuration[4] = { +18, /* elevDim3 */ +41, /* azimDim3 */ +3, /* elevSegSamples */ +10, /* azimSegSamples */ +}; +const Word16 defaultHRIR_rom_ITD_elevBsLen[4] = { +4, 7, 10, 7, +}; +const Word16 defaultHRIR_rom_ITD_elevBsStart[4] = { +0, 4, 11, 21, +}; +const Word16 defaultHRIR_rom_ITD_azimBsLen[4] = { +11, 21, 31, 21, }; -const Word32 defaultHRIR_rom_ITD_elevBsShape_fx[28]/*Q30*/ = { -1073741824,318145728,39768216,0,0,606465280,556755008,268435456,79536432,9942054,0,0,142502768,424194304,626349376,589895168,394368128,178956976,53024288,6628036,0,0,6628036,53024288,178956976,397682144,616407360,715827904 +const Word16 defaultHRIR_rom_ITD_azimBsStart[4] = { +0, 11, 32, 63, +}; +const Word16 defaultHRIR_rom_ITD_azimBsShape_Q_fx = 15; +const Word16 defaultHRIR_rom_ITD_azimBsShape_fx[84] = { +32767,23888,16777,11239,7078,4096,2097,885,262,33,0,0,8413,14221,17768,19399,19456,18285,16228,13631,10838,8192,5972,4194,2810, +1769,1024,524,221,66,8,0,0,461,1726,3613,5942,8533,11207,13782,16078,17916,19115,19543,19268,18402,17061,15360,13413,11335, +9241,7244,5461,3981,2796,1873,1180,683,350,147,44,5,0,0,5,44,147,350,683,1180,1873,2796,3981,5461,7247, +9262,11409,13588,15701,17651,19339,20666,21534,21845, +}; + +const Word16 defaultHRIR_rom_ITD_azimKSeq_Q_fx = 7; +const Word16 defaultHRIR_rom_ITD_azimKSeq_fx[19] = { +0, 1280, 2560, 3840, 5120, 6400, 7680, 8960, 10240, 11520, 12800, 14080, 15360, 16640, 17920, 19200, 20480, 21760, 23040, }; -const Word32 defaultHRIR_rom_ITD_elevKSeq_fx[16] /*Q22*/ = { --377487360, -327155712, -276824064, -226492416, -176160768, -125829120, -75497472, -25165824, 25165824, 75497472, 125829120, 176160768, 226492416, 276824064, 327155712, 377487360 +const Word16 defaultHRIR_rom_ITD_elevBsShape_Q_fx = 15; +const Word16 defaultHRIR_rom_ITD_elevBsShape_fx[28] = { +32767,9709,1214,0,0,18508,16991,8192,2427,303,0,0,4349,12945,19115,18002,12035,5461,1618,202,0,0,202,1618,5461, +12136,18811,21845, }; +const Word16 defaultHRIR_rom_ITD_elevKSeq_Q_fx = 8; +const Word16 defaultHRIR_rom_ITD_elevKSeq_fx[16] = { +-23040, -19968, -16896, -13824, -10752, -7680, -4608, -1536, 1536, 4608, 7680, 10752, 13824, 16896, 19968, 23040, +}; + + #undef WMC_TOOL_SKIP /* clang-format on */ diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h index 4b1428ac8b572025872d6acbb27a371c452f1aec..f7ecc3ddac87b8bdca88e061df55392e678b1d77 100644 --- a/lib_rend/ivas_rom_binauralRenderer.h +++ b/lib_rend/ivas_rom_binauralRenderer.h @@ -30,6 +30,9 @@ *******************************************************************************************************/ +#ifndef _IVAS_ROM_BINAURAL_RENDERER_ +#define _IVAS_ROM_BINAURAL_RENDERER_ + #include #include "options.h" #include "cnst.h" @@ -39,45 +42,64 @@ * Binaural rendering related ROM tables *------------------------------------------------------------------------*/ +extern const Word16 FASTCONV_factor_Q_HRIR_latency_s_fx; +extern const Word16 FASTCONV_factor_Q_FOA_latency_s_fx; +extern const Word16 FASTCONV_factor_Q_HOA2_latency_s_fx; +extern const Word16 FASTCONV_factor_Q_HOA3_latency_s_fx; +extern const Word16 FASTCONV_factor_Q_HRIR_fx; +extern const Word16 FASTCONV_factor_Q_FOA_fx; +extern const Word16 FASTCONV_factor_Q_HOA2_fx; +extern const Word16 FASTCONV_factor_Q_HOA3_fx; +extern const Word16 FASTCONV_factor_Q_BRIR_fx; +extern const Word16 FASTCONV_factor_Q_reverberationTimes_fx; +extern const Word16 FASTCONV_factor_Q_reverberationEneCorrections_fx; +extern const Word16 hrtfShCoeffs_factorQ_fx; +extern const Word16 parametricReverberationTimes_factorQ_fx; +extern const Word16 parametricReverberationEneCorrections_factorQ_fx; +extern const Word16 parametricEarlyPartEneCorrection_factorQ_fx; +extern const Word16 leftHRIRReal_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ +extern const Word16 leftHRIRImag_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ +extern const Word16 rightHRIRReal_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ +extern const Word16 rightHRIRImag_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ +extern const Word16 leftHRIRReal_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ +extern const Word16 leftHRIRImag_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ +extern const Word16 rightHRIRReal_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ +extern const Word16 rightHRIRImag_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ +extern const Word16 leftHRIRReal_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ +extern const Word16 leftHRIRImag_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ +extern const Word16 rightHRIRReal_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ +extern const Word16 rightHRIRImag_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ +extern const Word16 leftHRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; /* Q29 */ +extern const Word16 leftHRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; /* Q29 */ +extern const Word16 rightHRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; /* Q29 */ +extern const Word16 rightHRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; /* Q29 */ +extern const Word16 hrtfShCoeffsRe_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ +extern const Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ + +extern const Word32 FASTCONV_HOA3_latency_s_fx; +extern const Word32 FASTCONV_HOA2_latency_s_fx; +extern const Word32 FASTCONV_FOA_latency_s_fx; + /* Binaural rendering data set based on HRIRs */ extern const Word32 FASTCONV_HRIR_latency_s_fx; -extern Word32 leftHRIRReal_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ -extern Word32 leftHRIRImag_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ -extern Word32 rightHRIRReal_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ -extern Word32 rightHRIRImag_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ -extern Word32 leftHRIRReal_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ -extern Word32 leftHRIRImag_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ -extern Word32 rightHRIRReal_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ -extern Word32 rightHRIRImag_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ -extern Word32 leftHRIRReal_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ -extern Word32 leftHRIRImag_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ -extern Word32 rightHRIRReal_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ -extern Word32 rightHRIRImag_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]; /* Q29 */ -extern Word32 leftHRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; /* Q29 */ -extern Word32 leftHRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; /* Q29 */ -extern Word32 rightHRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; /* Q29 */ -extern Word32 rightHRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; /* Q29 */ -extern Word32 FASTCONV_HOA3_latency_s_fx; -extern Word32 FASTCONV_HOA2_latency_s_fx; -extern Word32 FASTCONV_FOA_latency_s_fx; -extern Word16 hrtfShCoeffsRe_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q15 */ -extern Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ - /* Binaural rendering data set based on BRIRs */ extern const Word32 FASTCONV_BRIR_latency_s_fx; -extern Word32 leftBRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; /* Q29 */ -extern Word32 leftBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; /* Q29 */ -extern Word32 rightBRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; /* Q29 */ -extern Word32 rightBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; /* Q29 */ +extern const Word16 FASTCONV_factor_Q_BRIR_latency_s_fx; +extern const Word16 leftBRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; /* Q29 */ +extern const Word16 leftBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; /* Q29 */ +extern const Word16 rightBRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; /* Q29 */ +extern const Word16 rightBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; /* Q29 */ /* Reverberation parameters based on BRIRs for fastconv */ -extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ -extern Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ +extern Word16 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q26 */ +extern Word16 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ /* Binaural rendering data set based on BRIRs, to be used in a combined manner * with the above binaural rendering data set based on HRIRs for parametric * renderer */ -extern const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ -extern const Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ -extern const Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; /* Q28 */ +extern const Word16 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q26 */ +extern const Word16 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ +extern const Word16 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; /* Q28 */ + +#endif /* _IVAS_ROM_BINAURAL_RENDERER_ */ diff --git a/lib_rend/ivas_rom_binauralRenderer_fx.c b/lib_rend/ivas_rom_binauralRenderer_fx.c index e7dbbae70cec37257840afd3173d8aa4a751508f..3357eaeb870713885171a0cf4246d69078168189 100644 --- a/lib_rend/ivas_rom_binauralRenderer_fx.c +++ b/lib_rend/ivas_rom_binauralRenderer_fx.c @@ -43,47165 +43,47477 @@ /*------------------------------------------------------------------------- * Binaural rendering related ROM tables *------------------------------------------------------------------------*/ - +#ifdef DEBUGGING /* Binaural rendering data set based on HRIRs */ /* Tables generated by the script at "scripts/binauralRenderer_interface/run_generate_IVAS_tables.m */ /* Can be replaced by your own generated HRIR tables */ /* * Generated with Matlab version 9.3.0.713579 (R2017b) by MUXE6256 */ +#endif - -const Word32 FASTCONV_HOA3_latency_s_fx = 20833; - -const Word32 leftHRIRReal_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA] /* Q29 */= +const Word16 FASTCONV_factor_Q_HOA3_latency_s_fx = 31; +const Word32 FASTCONV_HOA3_latency_s_fx = 44739; +const Word16 FASTCONV_factor_Q_HOA3_fx= 14; +const Word16 leftHRIRReal_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]= { { - { 189679184, 304322592, 107436456, }, - { 242399360, -302261536, 44863616, }, - { 11860552, 60100016, -1683090, }, - { 25304336, 104153, -207232, }, - { 21139292, -19353660, -8217883, }, - { 7248831, -2365453, 9037148, }, - { -26986890, 31329638, 9359807, }, - { -7344931, 43398496, -10575820, }, - { -19937238, 13084081, 28024662, }, - { 26909044, -42307040, -10624675, }, - { -2450816, 4110284, -718333, }, - { 5272609, -27694486, -1728188, }, - { -2057826, -12568685, -1696512, }, - { 4153234, -22881976, 5524939, }, - { 7628936, -1821066, -681826, }, - { -3011309, 570694, 995359, } - }, - { - { 5991480, -273394528, -70961448, }, - { 76770392, -439989344, 50001472, }, - { 1802813, 41517840, -4589173, }, - { 2413235, 12974559, 13751412, }, - { 11226508, 30864708, 13184476, }, - { 11241003, 13223667, 12262132, }, - { -26838176, -61006788, -28770912, }, - { 5379447, 112868520, 14491220, }, - { -50776712, -218518816, -55487220, }, - { 20914344, 47507172, 31159450, }, - { 1543504, 8399345, -417686, }, - { 11120744, 56255480, 37819336, }, - { -4721243, 1569811, 5162014, }, - { 2341294, -30473866, 3795677, }, - { 5437429, 39253852, 18807662, }, - { -3028489, -3227668, -131533, } - }, - { - { -103299336, -110683456, -102613208, }, - { -149763360, 126817496, -135879344, }, - { -1404454, 36626408, 381178, }, - { -23609436, 57801132, 3221226, }, - { -12256763, 65424164, 4438312, }, - { 4104915, 56324736, -8615704, }, - { 4727149, -149730608, 3177739, }, - { 8160438, 96794064, 20379620, }, - { -20394116, -285178304, -28841780, }, - { -28674812, 217949728, -35490388, }, - { 2268280, 26517128, -10790032, }, - { -17635672, 217100928, -30644592, }, - { -10921565, 13795972, 1620276, }, - { 214212, -26433914, 2987150, }, - { -10144176, 91749632, -2559801, }, - { -7639136, 26703960, -14314589, } - }, - { - { -33778308, 274702336, 33510408, }, - { -88140248, 585712192, 58195196, }, - { 4900021, 34997540, -1655173, }, - { -9982041, 43882756, -413927, }, - { -11105712, 50252728, 6448357, }, - { 443455, 63618128, -804233, }, - { 13956496, -165173168, -12775917, }, - { -4399121, 29312078, -5219459, }, - { 21663278, -239384304, -30239790, }, - { -16560857, 380443360, 43821016, }, - { 1107565, 18220326, -13462038, }, - { -14711874, 246313696, -17947058, }, - { -11474542, -3762928, -5577015, }, - { -1122060, -16861504, 4379793, }, - { -15287399, 38154880, -25150792, }, - { -4081293, 62483720, 1358820, } - }, - { - { 61600032, 37331856, 91757144, }, - { 56944824, 351084576, 99906848, }, - { 17413408, 12843026, 1846836, }, - { 26146150, 75161392, -28630788, }, - { 4660040, 135259792, -38225208, }, - { -2360622, 64597920, 166430, }, - { 13772886, -174139984, -3468723, }, - { -2582349, 33209760, -4078608, }, - { 52569864, -344211040, 8208220, }, - { 6097243, 299348480, 76846632, }, - { 2537252, -8970576, 233002, }, - { 7102266, 89445912, 49996640, }, - { -3978750, 6330782, -11567958, }, - { -2896956, -18562312, 6148783, }, - { 5714454, 6291590, -11762305, }, - { 2909304, 16636556, 23424214, } - }, - { - { 35767952, -48289928, 51695836, }, - { 122719024, 248484800, 12538620, }, - { 16426639, 29774324, 5659157, }, - { 56310780, 181175136, -1972464, }, - { 39025684, 217555120, -20864952, }, - { 2611340, 43738872, -11940546, }, - { 13994614, -115656488, 29881698, }, - { 8351564, 18503256, -14416595, }, - { 43786656, -177021376, 90108952, }, - { 2380486, 120777704, -14774687, }, - { 458488, -9656160, 627602, }, - { -9182103, 11922292, 14430553, }, - { 9099425, 37925100, -2336999, }, - { -3535295, -46244988, -2520609, }, - { 31896574, 57557392, 2627983, }, - { 3047279, -31762356, 1707250, } - }, - { - { -133453760, 248134224, -24065238, }, - { 49510236, 309569984, 16902306, }, - { -9960029, 63480152, -102005, }, - { 12905303, 103205376, 40805412, }, - { 39440148, 59966872, 45799920, }, - { 24383604, 28147068, -7584912, }, - { 2330557, -47321948, -1519345, }, - { 31236760, -36228588, 1898912, }, - { -60579440, 97428112, -7415261, }, - { 27457726, 30667678, 19580220, }, - { -1240172, -5094368, -1571958, }, - { -19764902, 37777996, 7081328, }, - { 13549548, 1037772, 12015708, }, - { 6334540, -37628744, -9266929, }, - { 42618424, -2711198, 22687628, }, - { 14770929, -17062294, -7906498, } - }, - { - { -316071488, 37549824, -63453848, }, - { -180852480, -46988552, -71499392, }, - { -49294412, 119185, -16876538, }, - { -128887672, -112254336, -14310831, }, - { -57196080, -112747184, -3730716, }, - { 46474768, 41647224, -7485055, }, - { 19670950, -6565932, 11464878, }, - { 32199906, -13280576, 9488120, }, - { -115142168, 14012331, -24771224, }, - { 8647380, -44480828, -6425271, }, - { -1937030, 11526618, 4697084, }, - { -24869472, -5836324, -8390219, }, - { -4409858, -42788076, -1603633, }, - { 28117540, 15736760, 7562364, }, - { 10062035, -60990148, 5612986, }, - { 31954556, 17682380, 2305324, } - }, - { - { -361012928, -107035952, 1838246, }, - { -339260544, -74138648, -23380192, }, - { -70194800, -31168040, -679679, }, - { -243166560, -1868311, -30283814, }, - { -153038816, 16125455, -30584462, }, - { 59203440, -6156299, 9015673, }, - { 35418448, 3013993, 2372970, }, - { -1691680, 25706990, 1106491, }, - { -87555056, -70230768, 971736, }, - { -10498511, -13577465, -12486544, }, - { -10082973, 18462454, 3297461, }, - { -1347009, -24953224, -4918812, }, - { -22036940, -12890807, -9094593, }, - { 35231080, 14661945, 5639829, }, - { -39492224, 21459268, -15654619, }, - { 33756296, 3649112, 6452652, } - }, - { - { -291765184, 31956168, 34410204, }, - { -375867072, 43094628, 22290880, }, - { -83209624, -4979478, 9856950, }, - { -254651840, 67848136, -1629403, }, - { -175750064, 61229052, -7963406, }, - { 38247220, -31672162, 2454574, }, - { 47128676, 67109, -594316, }, - { -50551764, -20916490, -6397891, }, - { -10248329, 29680372, 20811800, }, - { -12695386, 21452288, 1926293, }, - { -23096724, -7217156, -4312147, }, - { 41781980, 24153822, 5424007, }, - { -21937082, 11606612, 1177358, }, - { 24022288, -16567299, -4268661, }, - { -66468376, 30025580, -6706592, }, - { 13777718, -18653580, 1938641, } - }, - { - { -180420832, 15508053, 16914118, }, - { -315297312, -4876399, 22964654, }, - { -97981624, 13826037, 4172561, }, - { -176048032, -34457984, 18804440, }, - { -125448480, -36109936, 16757889, }, - { -3931506, 16374563, -7987029, }, - { 46259484, 3149285, -1439888, }, - { -84816480, -9487046, -4279935, }, - { 55625196, 20936354, 10554882, }, - { -4123706, -2500208, 8121783, }, - { -29963840, -9622337, -1771674, }, - { 77292232, 7432978, 4481262, }, - { -9511205, -2664490, 3375308, }, - { 4716948, -6528351, -3870839, }, - { -65016140, -18563922, 10410464, }, - { -17283486, 16813186, -5451387, } - }, - { - { -82274392, -4493610, -4998268, }, - { -215839824, 63351, 6945499, }, - { -107246944, -3540664, 659278, }, - { -69171520, 2429878, 10962367, }, - { -49844168, -5693516, 11807402, }, - { -41827076, 13609141, -1554241, }, - { 30812096, -4552129, -1991791, }, - { -88808648, 12234751, 4199405, }, - { 79944376, -20038170, -7359964, }, - { 6064494, -9715753, 3017752, }, - { -29600914, 4624069, 3562139, }, - { 86208584, -8352101, -3291556, }, - { 7969312, -1806034, 34360, }, - { -14738717, -891206, 2032593, }, - { -52577916, -17246978, 7355132, }, - { -40023188, 11195906, -3377992, } - }, - { - { -11520176, -16800838, -8475044, }, - { -121099824, -8950175, -2939905, }, - { -96168616, -3455301, 530965, }, - { 16582869, -2209761, -542240, }, - { 12630425, 2364380, -1235340, }, - { -61056720, -850404, 7627325, }, - { 3321620, 1947768, -172872, }, - { -70016016, 70867, 4503273, }, - { 71465032, -759672, -10794327, }, - { 14083735, 3701188, -3001109, }, - { -25223270, 6362994, 1888712, }, - { 66658428, 2034741, -3216931, }, - { 21100638, -2749316, -1918777, }, - { -33149632, 10821707, -206695, }, - { -39621612, 8810052, -4913980, }, - { -47799764, -4650376, 3549791, } - }, - { - { 42451456, 21299280, -1612760, }, - { -41670848, 17740900, -3934190, }, - { -48837536, 14950781, 521302, }, - { 65235720, -1077500, -5389647, }, - { 51329692, 3191161, -4767414, }, - { -53909892, -8493298, 3687766, }, - { -32504312, -6902013, 2399813, }, - { -41712184, 894964, -538482, }, - { 49881752, 9771587, -2830920, }, - { 21916682, 7760469, -2321967, }, - { -16160888, 1179505, -1459752, }, - { 23418310, -9116068, -65498, }, - { 22019224, 804770, -699543, }, - { -47476032, 4873714, -712428, }, - { -27396522, 13417478, -4742181, }, - { -48884780, -6140193, 2001455, } - }, - { - { 88989040, -11040213, 2617783, }, - { 27049704, -19992536, -533650, }, - { 37626060, -19404662, -939524, }, - { 90464360, -9076340, -4810900, }, - { 75970992, -7735236, -3192771, }, - { -12238509, -5801964, -3783329, }, - { -67951216, 8986682, 2831457, }, - { -14402636, -9207873, -1178969, }, - { 24434068, 2305861, 3216394, }, - { 29472066, -4461934, 941672, }, - { -1956895, -5533529, -1078574, }, - { -30696132, 7948374, 2563022, }, - { 5944235, 5713380, -133144, }, - { -58457188, -2496450, 4172024, }, - { -21294448, -10089415, 2979634, }, - { -49573588, -411780, -426812, } - }, - { - { 128727688, 3776350, 1412507, }, - { 85088672, 12749610, 1985349, }, - { 145171504, 23826868, -3697967, }, - { 111840408, 8870181, -1000191, }, - { 101389680, 9131637, -709207, }, - { 58888832, 21438330, -5841156, }, - { -87093344, -6423661, 1226213, }, - { 4442607, 5873905, 1722282, }, - { -4634270, -12062416, 2022393, }, - { 33332704, -2255395, 806917, }, - { 13388487, 5470178, 262530, }, - { -77616504, -11276437, 3949223, }, - { -24839944, -5436355, 712428, }, - { -68098856, -10958609, 2998961, }, - { -26676042, -6561100, 5107253, }, - { -54116588, -608275, 588947, } - }, - { - { 160432064, -3110093, -737124, }, - { 127650720, -4705674, 1635309, }, - { 241246704, -25421912, -2492155, }, - { 134621984, -2611877, -1050656, }, - { 131793216, -5808407, -472983, }, - { 134059888, -26525718, -2126546, }, - { -73410656, -4699231, -995896, }, - { 13879724, 1817308, 2222109, }, - { -35398048, 12080132, -1765232, }, - { 30884572, 4506495, -1458678, }, - { 24806658, -2606508, 1139777, }, - { -98636608, 8537858, 754304, }, - { -61230664, 6629282, 2826089, }, - { -69490424, 5415954, -2579665, }, - { -38364796, 12315282, 798864, }, - { -63967632, 4951561, 297963, } - }, - { - { 185763248, 4479114, -1353452, }, - { 153832304, -309238, -257698, }, - { 290788064, 7578470, 1229434, }, - { 153667488, 5258651, -2077154, }, - { 161042480, 5226439, -1700270, }, - { 176488800, 10183367, 3265249, }, - { -20143396, 18489298, -1172526, }, - { 22658100, -1901060, 338229, }, - { -62093952, -2499671, -2667712, }, - { 20965346, -1632625, -2285460, }, - { 30292404, 601295, 1700270, }, - { -77775952, 10266582, -1833414, }, - { -89274120, -9709847, 2138357, }, - { -54588496, 11563126, -2695629, }, - { -42026256, -3581466, -3647501, }, - { -75187160, -2548526, -672162, } - }, - { - { 208514224, -5304822, -991601, }, - { 169719920, -48318, -2152316, }, - { 275570464, 19114216, 161061, }, - { 159189200, -3106335, -143345, }, - { 178980944, -3876745, -1544578, }, - { 158604560, 22049288, 1932735, }, - { 61370252, -22639846, 114890, }, - { 43689480, -3373697, -1739462, }, - { -80673984, -3013993, 260382, }, - { 2893734, 114890, -209380, }, - { 34706020, 1522029, 1552631, }, - { -14364518, -24151138, 210453, }, - { -91525752, -1062468, -83752, }, - { -27262304, -13845901, 1780801, }, - { -25509422, -13974213, -2544231, }, - { -82675440, -2627446, 635118, } - }, - { - { 231195936, 5265630, -641561, }, - { 184304032, 5625334, -2100776, }, - { 208716624, -26603564, -4437238, }, - { 143026176, -9013526, 463856, }, - { 176169360, -4109210, -1348620, }, - { 83453896, -32672890, -5035849, }, - { 144423648, 14431627, -525060, }, - { 85177792, 13616120, -2009508, }, - { -92251600, 1479616, 3518652, }, - { -23432804, -5090610, 2103460, }, - { 48676476, -792421, -562641, }, - { 71161168, 19383724, 1622424, }, - { -57096760, 12967580, -226023, }, - { -279710, 5210332, 4049081, }, - { 10645613, 19659676, 3597035, }, - { -83698176, 1516124, 2621541, } - }, - { - { 253110480, -4453881, -644245, }, - { 202792784, -9002251, 316754, }, - { 126104536, 14142790, -4711579, }, - { 106415864, 15707232, -2575370, }, - { 149847648, 8284455, -1737314, }, - { -18028662, 17587892, -6094022, }, - { 199054016, -3391951, -3665755, }, - { 142919872, -15989626, -756988, }, - { -99546064, 6783901, 2951716, }, - { -53973244, 10205916, 1722819, }, - { 81119584, -5608154, -3808562, }, - { 147441392, -6831146, -2094333, }, - { 7497939, -16030429, -641561, }, - { 17021492, 5471789, 1440425, }, - { 55233280, -5935108, 5962489, }, - { -77189688, 3450469, 1087701, } - }, - { - { 271380192, 3393561, -754304, }, - { 225036960, 5210332, 2160369, }, - { 61864172, -3352759, -230854, }, - { 59377384, -7401840, -3531537, }, - { 106045960, -8349417, -395137, }, - { -111889800, -4412542, 1377611, }, - { 204785120, -613107, -4148939, }, - { 199535584, 8651675, -1597191, }, - { -102982040, -9226127, -2387465, }, - { -79090216, -8512088, -667331, }, - { 128752920, 15685757, -4660577, }, - { 186985152, 4001836, -5465883, }, - { 80273472, 16455093, -1806571, }, - { 26085484, -3606162, -2874944, }, - { 100301448, -5814849, -549756, }, - { -62251792, 960999, -2479270, } - }, - { - { 283445824, -2472291, -425739, }, - { 250145872, 394063, 347892, }, - { 31551366, 1824824, 2136746, }, - { 11241540, 1342177, 860067, }, - { 55291800, 12691628, 486942, }, - { -177572208, 8174934, 7242389, }, - { 157573760, 6961068, 1270774, }, - { 233900160, -4170950, -3251290, }, - { -101713416, -5664525, -4573604, }, - { -89047560, -841814, -1887638, }, - { 172231408, -18637474, -468688, }, - { 174405200, -2156074, -1228361, }, - { 133267464, -12697534, -599685, }, - { 36203888, -8750996, -2057826, }, - { 146519056, -4073240, -8343511, }, - { -41135048, -11688753, -1687385, } - }, - { - { 288816672, 65498, -69256, }, - { 279945440, 3285650, -3053185, }, - { 31862752, 1466195, 632971, }, - { -34104188, -8149164, 4543002, }, - { 9822053, -10109816, -583042, }, - { -205254336, -11177652, 4417374, }, - { 71791992, -27465242, 4102768, }, - { 229422656, -2577517, -2360085, }, - { -101560944, 13728326, 1846836, }, - { -82175608, 9631464, 331786, }, - { 185142624, 451508, 3894999, }, - { 109586088, -19167366, 4055523, }, - { 144640544, -3027415, 1314797, }, - { 52999360, 7438884, 1590212, }, - { 190781904, 21658446, -6819871, }, - { -23318988, 8011725, 2361158, } - }, - { - { 289866272, 1352915, -431107, }, - { 315025120, -12282533, -3040837, }, - { 47494284, -6703907, -4832, }, - { -71863928, 13118978, 2914672, }, - { -20838644, 2469606, -643708, }, - { -190062496, -3092377, -1194538, }, - { -19047644, 33006286, -2068027, }, - { 179018528, 16397111, -1230508, }, - { -115382688, 5246840, 7004018, }, - { -67956048, -5418638, 2936684, }, - { 153785056, 24093692, 775242, }, - { 14096620, 36050344, 586800, }, - { 111691696, 18995566, -474594, }, - { 75546328, -217433, 713501, }, - { 214077280, -14137959, 1343251, }, - { -18821620, 4057670, 3177739, } - }, - { - { 291103744, 370978, -772557, }, - { 348790528, 12458090, 287226, }, - { 58636504, 3210488, 1225139, }, - { -92223152, -5486821, -352187, }, - { -35514012, 2880313, 1367410, }, - { -136765712, 22014392, -1087701, }, - { -74584256, -4656819, -6522445, }, - { 90864864, -23682450, -1395328, }, - { -146371408, -21838298, 2491081, }, - { -59137940, -3469260, 1843615, }, - { 91215976, -23076860, -5398774, }, - { -71293232, -19409494, -4901632, }, - { 54820964, -17020418, -3295851, }, - { 101421896, 2614561, -2597918, }, - { 191872288, -16305306, 3377455, }, - { -27441620, -11033234, -479963, } - }, - { - { 296270592, -2617246, -364535, }, - { 370586944, -2314987, 2156074, }, - { 51345796, 5406827, 1508070, }, - { -86875376, -7421704, -424128, }, - { -40845676, 1283122, 2312840, }, - { -65692060, -21493626, 2470143, }, - { -77312632, -19687594, -1716913, }, - { -13135084, 21265456, -473520, }, - { -178148272, 11236171, -3562139, }, - { -60837676, 4228396, -497679, }, - { 25942676, 4966593, -4297115, }, - { -111659488, -8442832, -2335389, }, - { 3730716, 5009006, -2279554, }, - { 125576792, -7951595, -2874944, }, - { 119798984, 29526826, -1306744, }, - { -37692632, 1173600, -2627983, } - }, - { - { 306039520, 2916283, 55298, }, - { 375466048, -7729868, -229244, }, - { 26038776, -9740449, 701153, }, - { -57603564, 12832289, 1970853, }, - { -44336948, -3262028, 929324, }, - { -3132105, 10383083, 3685619, }, - { -45856828, 19236622, 5332739, }, - { -108694344, -19291920, 162672, }, - { -189576096, 8080444, -2288681, }, - { -69859256, -2285460, -953483, }, - { -23221814, -1700270, 803159, }, - { -101647920, 16965658, 4098473, }, - { -21590264, 2845953, 823560, }, - { 137975280, 4347581, -857920, }, - { 19513648, -26326002, -4456566, }, - { -37789808, 6197638, -426276, } - }, - { - { 318587776, -3032784, 149250, }, - { 369527168, 3953518, -2932926, }, - { -4318590, 9765682, -648003, }, - { -16476031, -8249022, 2439005, }, - { -49333604, 2521146, -493384, }, - { 34719440, 4065724, 518080, }, - { -16206522, 1155883, 5816460, }, - { -177921168, 8576513, 460635, }, - { -173933296, -13509820, 2663417, }, - { -79901960, -100932, 41876, }, - { -54387708, 3276523, 2781528, }, - { -61901216, -9036611, 5770826, }, - { -17591112, -6221797, 2840047, }, - { 128530120, 4281009, 378494, }, - { -77983184, 12730820, -2652679, }, - { -24894168, -6537477, 1983738, } - }, - { - { 331023328, 1572495, -158377, }, - { 363240416, 2485176, -2062658, }, - { -23373748, -2558727, -1784559, }, - { 23740432, 7432978, 1649268, }, - { -54683524, 3455838, 938450, }, - { 49672908, -3960497, -3744675, }, - { -12600360, -14341433, -257161, }, - { -215045792, 570157, 2612951, }, - { -140426640, 7584912, 4264903, }, - { -85427440, 1476932, 1599875, }, - { -74498896, -4804995, 2248952, }, - { -18589156, -258235, 1464047, }, - { 6771553, 3172370, 1788317, }, - { 94353992, -13314935, -484258, }, - { -151179632, -4474282, 2142115, }, - { -3787088, 1398012, 1156957, } - }, - { - { 341009120, -1515587, -616328, }, - { 361957824, -4287451, 532039, }, - { -22019224, -7435126, -636192, }, - { 56237228, -2128156, 529892, }, - { -57777512, 2005750, 2416993, }, - { 54333484, -2007360, -4508105, }, - { -34668440, 11482595, -5185100, }, - { -226664752, -2289755, 4807142, }, - { -102528920, -1979980, 1407676, }, - { -83640728, 810138, 1657857, }, - { -90878288, 4764193, 1228898, }, - { 12435004, -1063541, -3004867, }, - { 39201240, -5504001, -520765, }, - { 43192340, 13027173, -1552094, }, - { -195225056, 2522220, 5649493, }, - { 19146428, -3657165, -924492, } - }, - { - { 347595456, 1677185, -417686, }, - { 364211072, -656056, 1167694, }, - { -4296578, 10086731, 2272038, }, - { 82555176, 3663607, -807991, }, - { -54913304, -3373160, 198105, }, - { 57903676, 8464307, -1361505, }, - { -68560024, -1516124, -4011500, }, - { -222998464, -2698850, 3826816, }, - { -67095444, 6439230, -712428, }, - { -72852312, 1525250, 280247, }, - { -105808128, -4806069, 281857, }, - { 26526792, 4527433, -2848637, }, - { 68737728, 4700305, -1606855, }, - { -10790032, -9171366, -679679, }, - { -214334432, -5647345, 5347771, }, - { 39519068, 7033009, -117575, } - }, - { - { 350730784, -349503, -70867, }, - { 366636672, 1081258, -66572, }, - { 17701708, -3133716, 3336653, }, - { 108880104, -4415764, -1509681, }, - { -41920492, -3178813, -2012729, }, - { 59764468, -2437394, 1982664, }, - { -104399920, 922881, 396211, }, - { -208644144, -919123, 1145146, }, - { -34493956, -6276558, -525060, }, - { -52565568, -5551245, -316217, }, - { -117002960, 1362042, -101469, }, - { 23087060, -638876, -347892, }, - { 86126976, -3460133, -1624035, }, - { -55188184, 6024766, 777926, }, - { -210987040, 2057289, 2257542, }, - { 54660976, -2545305, 1357747, } - }, - { - { 351696096, -266288, -39192, }, - { 367900992, 301721, -442382, }, - { 34761856, -4679367, 199179, }, - { 138656576, 8657580, -1464047, }, - { -20651814, 10691784, -737661, }, - { 54502600, -6995965, 925565, }, - { -141045120, -5858873, 3105798, }, - { -183038080, 5861020, -58519, }, - { -2747169, 6265284, -612570, }, - { -25756382, 8061654, 273804, }, - { -122231008, 829466, 453119, }, - { 3658775, -5697811, 901406, }, - { 84907208, -1595044, -946503, }, - { -83002392, -2358474, 1876364, }, - { -183580864, 6935299, 32212, }, - { 66104380, -1711008, 297427, } - }, - { - { 352811168, 619549, -377957, }, - { 368510880, -630286, 12885, }, - { 47033648, -1253594, -2666638, }, - { 169054752, -8256001, -413391, }, - { -831613, -6984154, 2095944, }, - { 41806676, 5986648, -1675037, }, - { -178983632, 11828877, 2625836, }, - { -146943712, -10399190, 165356, }, - { 29367376, -6104759, -1154273, }, - { 1778117, -6456410, 1106491, }, - { -122834992, -752693, 854699, }, - { -26137024, 9786620, 279173, }, - { 62861140, 6782827, -481036, }, - { -93098784, 931471, 2050847, }, - { -133093520, -16054051, 366146, }, - { 79614200, -497142, -1923072, } - }, - { - { 356286336, 1079111, -706522, }, - { 370377568, -118112, 59056, }, - { 58491548, 7219303, -1080721, }, - { 192554656, 5204964, 554588, }, - { 7168301, -2298344, 2442763, }, - { 26358214, -807991, -1415729, }, - { -213923200, -11788075, -175557, }, - { -105548824, 10618233, 1021665, }, - { 59586228, 7743289, -1002338, }, - { 24626268, 2447058, 846109, }, - { -122507496, 52076, 792421, }, - { -56819732, -8184060, -1071058, }, - { 23933706, -11563663, -741956, }, - { -88090856, 888521, 1012002, }, - { -67978592, 17484812, 1989107, }, - { 99579352, 7204271, -2246268, } - }, - { - { 362722880, -2591476, -450435, }, - { 375905728, -1128503, -363998, }, - { 69048576, -3528316, 1149441, }, - { 203336096, 1549946, 347892, }, - { 2265595, 6801618, 430034, }, - { 12047383, 350577, 466541, }, - { -237117088, 1186485, -1096290, }, - { -67009008, -7736847, 1520955, }, - { 82461224, -4238059, -362388, }, - { 41384696, -653372, -377420, }, - { -124182536, -389231, 1152662, }, - { -79066592, 1724966, -1180042, }, - { -22692460, 11189464, -1503239, }, - { -71790912, -5228586, 567473, }, - { -1692217, -11481521, 1993939, }, - { 123079264, -8227547, -708133, } - }, - { - { 370373824, 2542084, 98247, }, - { 386556192, 3310883, -375273, }, - { 76104136, -1887638, 447750, }, - { 202242496, -3654480, -919660, }, - { -5905580, -2692945, -868657, }, - { 347355, -2221035, 1225676, }, - { -243896160, 5133023, 1224603, }, - { -37273872, 2496987, 845035, }, - { 92828200, 244813, -382252, }, - { 54846732, 2807835, -863288, }, - { -127560528, -631360, 1960116, }, - { -89395984, 3245922, 675384, }, - { -66122096, -5112622, -521839, }, - { -49948860, 4191888, 396211, }, - { 54602992, 4352413, -951335, }, - { 140605952, 3172907, 141197, } - }, - { - { 376587552, -702764, 275415, }, - { 401500000, -3802657, -158377, }, - { 78745008, 1107565, -1109712, }, - { 196230608, 2150168, -1660542, }, - { -5272073, -1649804, -909459, }, - { -8028368, 2726767, 667331, }, - { -238401280, -2830920, 2775623, }, - { -16224239, -919660, -752693, }, - { 89822800, 3003256, -701690, }, - { 68125696, -3136937, -624381, }, - { -128559648, 3267933, 1184337, }, - { -91821032, -606664, 2059974, }, - { -99711960, 4389457, 1236414, }, - { -28915330, -4508642, -1611, }, - { 96751120, -6563247, -3388192, }, - { 143558752, 1979980, -37581, } - }, - { - { 379933888, -866510, -223875, }, - { 418189152, 3509525, -179315, }, - { 78002512, 1551557, -689342, }, - { 193020128, 2717641, -788663, }, - { 10403485, 8171712, -40802, }, - { -11798812, -491774, 142808, }, - { -228333888, -441308, 1696512, }, - { 1134408, 3786014, -1302986, }, - { 77307264, -3585761, -798327, }, - { 82289424, 4401805, -170725, }, - { -120315992, 1399623, -513785, }, - { -92718680, -3023120, 1060320, }, - { -122189136, -4933307, 1023276, }, - { -13180181, 3692598, 535797, }, - { 124550296, 8669928, -1908576, }, - { 130201936, -6466610, -628139, } - }, - { - { 381073120, 535260, -813359, }, - { 433806208, -2840047, -312996, }, - { 75059384, 233539, 439160, }, - { 196453952, -3342558, 932545, }, - { 38315940, -9525164, 1642825, }, - { -9557376, -1625108, 333397, }, - { -218855968, -242129, 93952, }, - { 18570902, -4182761, -1089848, }, - { 61713312, 3343632, -601295, }, - { 96362960, -3289945, 426812, }, - { -98379448, -8465381, -415001, }, - { -95044944, 1895691, -373662, }, - { -134432480, 727460, 594853, }, - { -4395362, 85362, 781684, }, - { 136693232, -743029, -285615, }, - { 106566728, 7488276, -1481227, } - }, - { - { 381620192, 1278290, -573915, }, - { 446254624, 1850594, -471373, }, - { 70897024, -4185983, -520228, }, - { 205557136, -587337, 381715, }, - { 69342248, 4027606, 1483374, }, - { -1697049, 411780, -237834, }, - { -210835120, 3384971, 437550, }, - { 35998804, 6389301, -175557, }, - { 48716740, -2058900, -534723, }, - { 108493024, 300648, -104690, }, - { -65671124, 11233487, 1360968, }, - { -97958544, 1491427, 138513, }, - { -139136000, 694174, 1178432, }, - { 346282, -1947231, -251792, }, - { 133537512, -3973382, -887985, }, - { 82236816, -4588099, -1869921, } - }, - { - { 382351936, -1075352, 183073, }, - { 454615840, -816581, -748398, }, - { 66729832, 1833414, -2317672, }, - { 218169312, -1402844, -1505386, }, - { 96211024, -1338419, -772020, }, - { 9361418, -2212982, -1392106, }, - { -202981232, -1261110, 1223529, }, - { 50014896, -2319819, 700617, }, - { 41347652, -806380, 40802, }, - { 118474528, -668404, -1267552, }, - { -30713312, -5957120, 1932198, }, - { -99469296, -617938, 1403381, }, - { -139440944, -980863, 1854889, }, - { 6510634, 270583, -1832340, }, - { 119157424, 5541045, -1895691, }, - { 63735704, -129923, -788127, } - }, - { - { 383144384, -444529, 292595, }, - { 459259776, 1583769, -524523, }, - { 62185756, 3074660, -1435593, }, - { 231434320, 4502200, -1624035, }, - { 117318104, 4323959, -1771674, }, - { 19376208, 4671851, -766652, }, - { -192852624, 653909, 485331, }, - { 57789860, -828929, 118112, }, - { 38961260, -403727, 383863, }, - { 127578784, 3790846, -962073, }, - { -832687, 1974611, 172872, }, - { -97513472, -1676111, 812823, }, - { -137204880, -2003065, 1231045, }, - { 17623324, 6783901, -1333587, }, - { 99434400, -2160369, -1452236, }, - { 50520088, -871342, 569620, } - }, - { - { 384296480, 776852, -302795, }, - { 460956832, -68719, -89121, }, - { 53318796, 558883, 696322, }, - { 240763520, -4166118, -34360, }, - { 133587440, -4829691, -685584, }, - { 22540526, -171262, 424665, }, - { -177651120, -3570192, -296353, }, - { 61066920, 1590749, -952409, }, - { 39507256, -175557, 85362, }, - { 136151008, -2514167, 131533, }, - { 22209812, -2669859, -1468342, }, - { -89513024, -2073932, -286152, }, - { -132348344, -680752, -26307, }, - { 31038654, -5706401, 867047, }, - { 79264160, 2407866, 130997, }, - { 37860672, 2688113, 896574, } - }, - { - { 386752128, 849867, -627065, }, - { 460907424, -860067, -301185, }, - { 36146980, -8155069, 146566, }, - { 241739008, -2721936, 404264, }, - { 145550544, 1211181, -214212, }, - { 15294379, -6343130, -619549, }, - { -156943472, 6531572, 106837, }, - { 64532956, 837519, -1495186, }, - { 41670848, 206695, -30602, }, - { 143601152, -547071, -244276, }, - { 40169756, 4733591, -1357210, }, - { -74599288, 5961415, 316754, }, - { -124122408, 5115306, 801011, }, - { 40080636, -530965, 1106491, }, - { 61127048, -4632122, 347892, }, - { 22113176, -5246840, 465467, } - }, - { - { 391063200, -2029909, -237297, }, - { 461126464, 344134, -667331, }, - { 11589969, 8358007, -1996086, }, - { 233550128, 6007586, -1385127, }, - { 153602528, 243739, -1096290, }, - { -543313, 5778342, -2461016, }, - { -133317392, -5993627, 959925, }, - { 72045928, -3372086, -1061931, }, - { 44400300, 733903, -638876, }, - { 149664576, 162135, -1471563, }, - { 55261732, -5041755, 13422, }, - { -55586004, -4656282, 1148367, }, - { -113788176, -3487514, 2371896, }, - { 41438380, 2802466, -167504, }, - { 46727632, 3631932, -506269, }, - { 2968896, 5842230, -533113, } - }, - { - { 396734720, 1250372, 73014, }, - { 462726880, -500364, -1276142, }, - { -15785079, -1756105, -1324997, }, - { 219574304, -1741072, -1924145, }, - { 157631744, 1241782, -1465658, }, - { -20402168, -221191, -1504849, }, - { -110699560, 1782411, 261993, }, - { 83441016, 3263102, -599148, }, - { 47146928, 1730335, -814970, }, - { 153455424, 3345243, -1052267, }, - { 68853160, 576599, 130460, }, - { -36815924, 1578401, 375810, }, - { -102973992, -1618129, 1462436, }, - { 36476084, -3029563, -1205275, }, - { 36621576, -526134, -565325, }, - { -16523813, -1292248, -19327, } - }, - { - { 402814240, 31139, -442919, }, - { 465080000, -938987, -1842541, }, - { -41941968, -2105071, 3216394, }, - { 203479440, -2962454, 1204202, }, - { 157027232, -5337034, 1045288, }, - { -40497784, -2864743, 2887292, }, - { -91681984, -1256815, -1701344, }, - { 95501816, -3160022, -364535, }, - { 49006112, -3105798, 643171, }, - { 153419984, -6674916, 2768107, }, - { 82031728, 2663954, -2726767, }, - { -21534966, -1419487, -1041530, }, - { -92152280, 4112968, -2525978, }, - { 28469190, -468688, -843424, }, - { 29191282, -1108102, 650151, }, - { -33352032, 449361, 2191507, } - }, - { - { 408395008, 100395, -1385127, }, - { 466746432, 2885144, -1062468, }, - { -63879048, -1842541, 7820599, }, - { 187858656, 2120103, 6287832, }, - { 152399936, 4620848, 6424198, }, - { -57353384, -2039036, 6954089, }, - { -77235864, 4152697, -2153926, }, - { 105173008, 2572686, 300648, }, - { 49308908, 1588601, 2649995, }, - { 149810064, 3342022, 8390219, }, - { 95026152, -714038, -6820408, }, - { -11529840, 3498251, -875100, }, - { -82806432, 520228, -6441377, }, - { 19945828, 4118337, 2282238, }, - { 22079354, 539555, 2406256, }, - { -46061912, -2879239, 3273302, } - }, + {5789, 9287, 3279}, + {7397, -9224, 1369}, + {362, 1834, -51}, + {772, 3, -6}, + {645, -591, -251}, + {221, -72, 276}, + {-824, 956, 286}, + {-224, 1324, -323}, + {-608, 399, 855}, + {821, -1291, -324}, + {-75, 125, -22}, + {161, -845, -53}, + {-63, -384, -52}, + {127, -698, 169}, + {233, -56, -21}, + {-92, 17, 30} + }, + { + {183, -8343, -2166}, + {2343, -13427, 1526}, + {55, 1267, -140}, + {74, 396, 420}, + {343, 942, 402}, + {343, 404, 374}, + {-819, -1862, -878}, + {164, 3444, 442}, + {-1550, -6669, -1693}, + {638, 1450, 951}, + {47, 256, -13}, + {339, 1717, 1154}, + {-144, 48, 158}, + {71, -930, 116}, + {166, 1198, 574}, + {-92, -99, -4} + }, + { + {-3152, -3378, -3132}, + {-4570, 3870, -4147}, + {-43, 1118, 12}, + {-721, 1764, 98}, + {-374, 1997, 135}, + {125, 1719, -263}, + {144, -4569, 97}, + {249, 2954, 622}, + {-622, -8703, -880}, + {-875, 6651, -1083}, + {69, 809, -329}, + {-538, 6625, -935}, + {-333, 421, 49}, + {7, -807, 91}, + {-310, 2800, -78}, + {-233, 815, -437} + }, + { + {-1031, 8383, 1023}, + {-2690, 17875, 1776}, + {150, 1068, -51}, + {-305, 1339, -13}, + {-339, 1534, 197}, + {14, 1941, -25}, + {426, -5041, -390}, + {-134, 895, -159}, + {661, -7305, -923}, + {-505, 11610, 1337}, + {34, 556, -411}, + {-449, 7517, -548}, + {-350, -115, -170}, + {-34, -515, 134}, + {-467, 1164, -768}, + {-125, 1907, 41} + }, + { + {1880, 1139, 2800}, + {1738, 10714, 3049}, + {531, 392, 56}, + {798, 2294, -874}, + {142, 4128, -1167}, + {-72, 1971, 5}, + {420, -5314, -106}, + {-79, 1013, -124}, + {1604, -10504, 250}, + {186, 9135, 2345}, + {77, -274, 7}, + {217, 2730, 1526}, + {-121, 193, -353}, + {-88, -566, 188}, + {174, 192, -359}, + {89, 508, 715} + }, + { + {1092, -1474, 1578}, + {3745, 7583, 383}, + {501, 909, 173}, + {1718, 5529, -60}, + {1191, 6639, -637}, + {80, 1335, -364}, + {427, -3530, 912}, + {255, 565, -440}, + {1336, -5402, 2750}, + {73, 3686, -451}, + {14, -295, 19}, + {-280, 364, 440}, + {278, 1157, -71}, + {-108, -1411, -77}, + {973, 1757, 80}, + {93, -969, 52} + }, + { + {-4073, 7572, -734}, + {1511, 9447, 516}, + {-304, 1937, -3}, + {394, 3150, 1245}, + {1204, 1830, 1398}, + {744, 859, -231}, + {71, -1444, -46}, + {953, -1106, 58}, + {-1849, 2973, -226}, + {838, 936, 598}, + {-38, -155, -48}, + {-603, 1153, 216}, + {413, 32, 367}, + {193, -1148, -283}, + {1301, -83, 692}, + {451, -521, -241} + }, + { + {-9646, 1146, -1936}, + {-5519, -1434, -2182}, + {-1504, 4, -515}, + {-3933, -3426, -437}, + {-1745, -3441, -114}, + {1418, 1271, -228}, + {600, -200, 350}, + {983, -405, 290}, + {-3514, 428, -756}, + {264, -1357, -196}, + {-59, 352, 143}, + {-759, -178, -256}, + {-135, -1306, -49}, + {858, 480, 231}, + {307, -1861, 171}, + {975, 540, 70} + }, + { + {-11017, -3266, 56}, + {-10353, -2263, -714}, + {-2142, -951, -21}, + {-7421, -57, -924}, + {-4670, 492, -933}, + {1807, -188, 275}, + {1081, 92, 72}, + {-52, 785, 34}, + {-2672, -2143, 30}, + {-320, -414, -381}, + {-308, 563, 101}, + {-41, -762, -150}, + {-673, -393, -278}, + {1075, 447, 172}, + {-1205, 655, -478}, + {1030, 111, 197} + }, + { + {-8904, 975, 1050}, + {-11471, 1315, 680}, + {-2539, -152, 301}, + {-7771, 2071, -50}, + {-5363, 1869, -243}, + {1167, -967, 75}, + {1438, 2, -18}, + {-1543, -638, -195}, + {-313, 906, 635}, + {-387, 655, 59}, + {-705, -220, -132}, + {1275, 737, 166}, + {-669, 354, 36}, + {733, -506, -130}, + {-2028, 916, -205}, + {420, -569, 59} + }, + { + {-5506, 473, 516}, + {-9622, -149, 701}, + {-2990, 422, 127}, + {-5373, -1052, 574}, + {-3828, -1102, 511}, + {-120, 500, -244}, + {1412, 96, -44}, + {-2588, -290, -131}, + {1698, 639, 322}, + {-126, -76, 248}, + {-914, -294, -54}, + {2359, 227, 137}, + {-290, -81, 103}, + {144, -199, -118}, + {-1984, -567, 318}, + {-527, 513, -166} + }, + { + {-2511, -137, -153}, + {-6587, 2, 212}, + {-3273, -108, 20}, + {-2111, 74, 335}, + {-1521, -174, 360}, + {-1276, 415, -47}, + {940, -139, -61}, + {-2710, 373, 128}, + {2440, -612, -225}, + {185, -297, 92}, + {-903, 141, 109}, + {2631, -255, -100}, + {243, -55, 1}, + {-450, -27, 62}, + {-1605, -526, 224}, + {-1221, 342, -103} + }, + { + {-352, -513, -259}, + {-3696, -273, -90}, + {-2935, -105, 16}, + {506, -67, -17}, + {385, 72, -38}, + {-1863, -26, 233}, + {101, 59, -5}, + {-2137, 2, 137}, + {2181, -23, -329}, + {430, 113, -92}, + {-770, 194, 58}, + {2034, 62, -98}, + {644, -84, -59}, + {-1012, 330, -6}, + {-1209, 269, -150}, + {-1459, -142, 108} + }, + { + {1296, 650, -49}, + {-1272, 541, -120}, + {-1490, 456, 16}, + {1991, -33, -164}, + {1566, 97, -145}, + {-1645, -259, 113}, + {-992, -211, 73}, + {-1273, 27, -16}, + {1522, 298, -86}, + {669, 237, -71}, + {-493, 36, -45}, + {715, -278, -2}, + {672, 25, -21}, + {-1449, 149, -22}, + {-836, 409, -145}, + {-1492, -187, 61} + }, + { + {2716, -337, 80}, + {825, -610, -16}, + {1148, -592, -29}, + {2761, -277, -147}, + {2318, -236, -97}, + {-373, -177, -115}, + {-2074, 274, 86}, + {-440, -281, -36}, + {746, 70, 98}, + {899, -136, 29}, + {-60, -169, -33}, + {-937, 243, 78}, + {181, 174, -4}, + {-1784, -76, 127}, + {-650, -308, 91}, + {-1513, -13, -13} + }, + { + {3928, 115, 43}, + {2597, 389, 61}, + {4430, 727, -113}, + {3413, 271, -31}, + {3094, 279, -22}, + {1797, 654, -178}, + {-2658, -196, 37}, + {136, 179, 53}, + {-141, -368, 62}, + {1017, -69, 25}, + {409, 167, 8}, + {-2369, -344, 121}, + {-758, -166, 22}, + {-2078, -334, 92}, + {-814, -200, 156}, + {-1652, -19, 18} + }, + { + {4896, -95, -22}, + {3896, -144, 50}, + {7362, -776, -76}, + {4108, -80, -32}, + {4022, -177, -14}, + {4091, -809, -65}, + {-2240, -143, -30}, + {424, 55, 68}, + {-1080, 369, -54}, + {943, 138, -45}, + {757, -80, 35}, + {-3010, 261, 23}, + {-1869, 202, 86}, + {-2121, 165, -79}, + {-1171, 376, 24}, + {-1952, 151, 9} + }, + { + {5669, 137, -41}, + {4695, -9, -8}, + {8874, 231, 38}, + {4690, 160, -63}, + {4915, 160, -52}, + {5386, 311, 100}, + {-615, 564, -36}, + {691, -58, 10}, + {-1895, -76, -81}, + {640, -50, -70}, + {924, 18, 52}, + {-2374, 313, -56}, + {-2724, -296, 65}, + {-1666, 353, -82}, + {-1283, -109, -111}, + {-2295, -78, -21} + }, + { + {6363, -162, -30}, + {5179, -1, -66}, + {8410, 583, 5}, + {4858, -95, -4}, + {5462, -118, -47}, + {4840, 673, 59}, + {1873, -691, 4}, + {1333, -103, -53}, + {-2462, -92, 8}, + {88, 4, -6}, + {1059, 46, 47}, + {-438, -737, 6}, + {-2793, -32, -3}, + {-832, -423, 54}, + {-778, -426, -78}, + {-2523, -80, 19} + }, + { + {7056, 161, -20}, + {5625, 172, -64}, + {6370, -812, -135}, + {4365, -275, 14}, + {5376, -125, -41}, + {2547, -997, -154}, + {4407, 440, -16}, + {2599, 416, -61}, + {-2815, 45, 107}, + {-715, -155, 64}, + {1485, -24, -17}, + {2172, 592, 50}, + {-1742, 396, -7}, + {-9, 159, 124}, + {325, 600, 110}, + {-2554, 46, 80} + }, + { + {7724, -136, -20}, + {6189, -275, 10}, + {3848, 432, -144}, + {3248, 479, -79}, + {4573, 253, -53}, + {-550, 537, -186}, + {6075, -104, -112}, + {4362, -488, -23}, + {-3038, 207, 90}, + {-1647, 311, 53}, + {2476, -171, -116}, + {4500, -208, -64}, + {229, -489, -20}, + {519, 167, 44}, + {1686, -181, 182}, + {-2356, 105, 33} + }, + { + {8282, 104, -23}, + {6868, 159, 66}, + {1888, -102, -7}, + {1812, -226, -108}, + {3236, -255, -12}, + {-3415, -135, 42}, + {6250, -19, -127}, + {6089, 264, -49}, + {-3143, -282, -73}, + {-2414, -260, -20}, + {3929, 479, -142}, + {5706, 122, -167}, + {2450, 502, -55}, + {796, -110, -88}, + {3061, -177, -17}, + {-1900, 29, -76} + }, + { + {8650, -75, -13}, + {7634, 12, 11}, + {963, 56, 65}, + {343, 41, 26}, + {1687, 387, 15}, + {-5419, 249, 221}, + {4809, 212, 39}, + {7138, -127, -99}, + {-3104, -173, -140}, + {-2718, -26, -58}, + {5256, -569, -14}, + {5322, -66, -37}, + {4067, -387, -18}, + {1105, -267, -63}, + {4471, -124, -255}, + {-1255, -357, -51} + }, + { + {8814, 2, -2}, + {8543, 100, -93}, + {972, 45, 19}, + {-1041, -249, 139}, + {300, -309, -18}, + {-6264, -341, 135}, + {2191, -838, 125}, + {7001, -79, -72}, + {-3099, 419, 56}, + {-2508, 294, 10}, + {5650, 14, 119}, + {3344, -585, 124}, + {4414, -92, 40}, + {1617, 227, 49}, + {5822, 661, -208}, + {-712, 245, 72} + }, + { + {8846, 41, -13}, + {9614, -375, -93}, + {1449, -205, 0}, + {-2193, 400, 89}, + {-636, 75, -20}, + {-5800, -94, -36}, + {-581, 1007, -63}, + {5463, 500, -38}, + {-3521, 160, 214}, + {-2074, -165, 90}, + {4693, 735, 24}, + {430, 1100, 18}, + {3409, 580, -14}, + {2305, -7, 22}, + {6533, -431, 41}, + {-574, 124, 97} + }, + { + {8884, 11, -24}, + {10644, 380, 9}, + {1789, 98, 37}, + {-2814, -167, -11}, + {-1084, 88, 42}, + {-4174, 672, -33}, + {-2276, -142, -199}, + {2773, -723, -43}, + {-4467, -666, 76}, + {-1805, -106, 56}, + {2784, -704, -165}, + {-2176, -592, -150}, + {1673, -519, -101}, + {3095, 80, -79}, + {5855, -498, 103}, + {-837, -337, -15} + }, + { + {9041, -80, -11}, + {11309, -71, 66}, + {1567, 165, 46}, + {-2651, -226, -13}, + {-1247, 39, 71}, + {-2005, -656, 75}, + {-2359, -601, -52}, + {-401, 649, -14}, + {-5437, 343, -109}, + {-1857, 129, -15}, + {792, 152, -131}, + {-3408, -258, -71}, + {114, 153, -70}, + {3832, -243, -88}, + {3656, 901, -40}, + {-1150, 36, -80} + }, + { + {9340, 89, 2}, + {11458, -236, -7}, + {795, -297, 21}, + {-1758, 392, 60}, + {-1353, -100, 28}, + {-96, 317, 112}, + {-1399, 587, 163}, + {-3317, -589, 5}, + {-5785, 247, -70}, + {-2132, -70, -29}, + {-709, -52, 25}, + {-3102, 518, 125}, + {-659, 87, 25}, + {4211, 133, -26}, + {596, -803, -136}, + {-1153, 189, -13} + }, + { + {9723, -93, 5}, + {11277, 121, -90}, + {-132, 298, -20}, + {-503, -252, 74}, + {-1506, 77, -15}, + {1060, 124, 16}, + {-495, 35, 177}, + {-5430, 262, 14}, + {-5308, -412, 81}, + {-2438, -3, 1}, + {-1660, 100, 85}, + {-1889, -276, 176}, + {-537, -190, 87}, + {3922, 131, 12}, + {-2380, 389, -81}, + {-760, -200, 61} + }, + { + {10102, 48, -5}, + {11085, 76, -63}, + {-713, -78, -54}, + {725, 227, 50}, + {-1669, 105, 29}, + {1516, -121, -114}, + {-385, -438, -8}, + {-6563, 17, 80}, + {-4285, 231, 130}, + {-2607, 45, 49}, + {-2274, -147, 69}, + {-567, -8, 45}, + {207, 97, 55}, + {2879, -406, -15}, + {-4614, -137, 65}, + {-116, 43, 35} + }, + { + {10407, -46, -19}, + {11046, -131, 16}, + {-672, -227, -19}, + {1716, -65, 16}, + {-1763, 61, 74}, + {1658, -61, -138}, + {-1058, 350, -158}, + {-6917, -70, 147}, + {-3129, -60, 43}, + {-2553, 25, 51}, + {-2773, 145, 38}, + {379, -32, -92}, + {1196, -168, -16}, + {1318, 398, -47}, + {-5958, 77, 172}, + {584, -112, -28} + }, + { + {10608, 51, -13}, + {11115, -20, 36}, + {-131, 308, 69}, + {2519, 112, -25}, + {-1676, -103, 6}, + {1767, 258, -42}, + {-2092, -46, -122}, + {-6805, -82, 117}, + {-2048, 197, -22}, + {-2223, 47, 9}, + {-3229, -147, 9}, + {810, 138, -87}, + {2098, 143, -49}, + {-329, -280, -21}, + {-6541, -172, 163}, + {1206, 215, -4} + }, + { + {10703, -11, -2}, + {11189, 33, -2}, + {540, -96, 102}, + {3323, -135, -46}, + {-1279, -97, -61}, + {1824, -74, 61}, + {-3186, 28, 12}, + {-6367, -28, 35}, + {-1053, -192, -16}, + {-1604, -169, -10}, + {-3571, 42, -3}, + {705, -19, -11}, + {2628, -106, -50}, + {-1684, 184, 24}, + {-6439, 63, 69}, + {1668, -78, 41} + }, + { + {10733, -8, -1}, + {11227, 9, -14}, + {1061, -143, 6}, + {4231, 264, -45}, + {-630, 326, -23}, + {1663, -213, 28}, + {-4304, -179, 95}, + {-5586, 179, -2}, + {-84, 191, -19}, + {-786, 246, 8}, + {-3730, 25, 14}, + {112, -174, 28}, + {2591, -49, -29}, + {-2533, -72, 57}, + {-5602, 212, 1}, + {2017, -52, 9} + }, + { + {10767, 19, -12}, + {11246, -19, 0}, + {1435, -38, -81}, + {5159, -252, -13}, + {-25, -213, 64}, + {1276, 183, -51}, + {-5462, 361, 80}, + {-4484, -317, 5}, + {896, -186, -35}, + {54, -197, 34}, + {-3749, -23, 26}, + {-798, 299, 9}, + {1918, 207, -15}, + {-2841, 28, 63}, + {-4062, -490, 11}, + {2430, -15, -59} + }, + { + {10873, 33, -22}, + {11303, -4, 2}, + {1785, 220, -33}, + {5876, 159, 17}, + {219, -70, 75}, + {804, -25, -43}, + {-6528, -360, -5}, + {-3221, 324, 31}, + {1818, 236, -31}, + {752, 75, 26}, + {-3739, 2, 24}, + {-1734, -250, -33}, + {730, -353, -23}, + {-2688, 27, 31}, + {-2075, 534, 61}, + {3039, 220, -69} + }, + { + {11069, -79, -14}, + {11472, -34, -11}, + {2107, -108, 35}, + {6205, 47, 11}, + {69, 208, 13}, + {368, 11, 14}, + {-7236, 36, -33}, + {-2045, -236, 46}, + {2517, -129, -11}, + {1263, -20, -12}, + {-3790, -12, 35}, + {-2413, 53, -36}, + {-693, 341, -46}, + {-2191, -160, 17}, + {-52, -350, 61}, + {3756, -251, -22} + }, + { + {11303, 78, 3}, + {11797, 101, -11}, + {2323, -58, 14}, + {6172, -112, -28}, + {-180, -82, -27}, + {11, -68, 37}, + {-7443, 157, 37}, + {-1138, 76, 26}, + {2833, 7, -12}, + {1674, 86, -26}, + {-3893, -19, 60}, + {-2728, 99, 21}, + {-2018, -156, -16}, + {-1524, 128, 12}, + {1666, 133, -29}, + {4291, 97, 4} + }, + { + {11493, -21, 8}, + {12253, -116, -5}, + {2403, 34, -34}, + {5988, 66, -51}, + {-161, -50, -28}, + {-245, 83, 20}, + {-7275, -86, 85}, + {-495, -28, -23}, + {2741, 92, -21}, + {2079, -96, -19}, + {-3923, 100, 36}, + {-2802, -19, 63}, + {-3043, 134, 38}, + {-882, -138, 0}, + {2953, -200, -103}, + {4381, 60, -1} + }, + { + {11595, -26, -7}, + {12762, 107, -5}, + {2380, 47, -21}, + {5890, 83, -24}, + {317, 249, -1}, + {-360, -15, 4}, + {-6968, -13, 52}, + {35, 116, -40}, + {2359, -109, -24}, + {2511, 134, -5}, + {-3672, 43, -16}, + {-2830, -92, 32}, + {-3729, -151, 31}, + {-402, 113, 16}, + {3801, 265, -58}, + {3973, -197, -19} + }, + { + {11629, 16, -25}, + {13239, -87, -10}, + {2291, 7, 13}, + {5995, -102, 28}, + {1169, -291, 50}, + {-292, -50, 10}, + {-6679, -7, 3}, + {567, -128, -33}, + {1883, 102, -18}, + {2941, -100, 13}, + {-3002, -258, -13}, + {-2901, 58, -11}, + {-4103, 22, 18}, + {-134, 3, 24}, + {4172, -23, -9}, + {3252, 229, -45} + }, + { + {11646, 39, -18}, + {13619, 56, -14}, + {2164, -128, -16}, + {6273, -18, 12}, + {2116, 123, 45}, + {-52, 13, -7}, + {-6434, 103, 13}, + {1099, 195, -5}, + {1487, -63, -16}, + {3311, 9, -3}, + {-2004, 343, 42}, + {-2989, 46, 4}, + {-4246, 21, 36}, + {11, -59, -8}, + {4075, -121, -27}, + {2510, -140, -57} + }, + { + {11668, -33, 6}, + {13874, -25, -23}, + {2036, 56, -71}, + {6658, -43, -46}, + {2936, -41, -24}, + {286, -68, -42}, + {-6194, -38, 37}, + {1526, -71, 21}, + {1262, -25, 1}, + {3616, -20, -39}, + {-937, -182, 59}, + {-3036, -19, 43}, + {-4255, -30, 57}, + {199, 8, -56}, + {3636, 169, -58}, + {1945, -4, -24} + }, + { + {11693, -14, 9}, + {14015, 48, -16}, + {1898, 94, -44}, + {7063, 137, -50}, + {3580, 132, -54}, + {591, 143, -23}, + {-5885, 20, 15}, + {1764, -25, 4}, + {1189, -12, 12}, + {3893, 116, -29}, + {-25, 60, 5}, + {-2976, -51, 25}, + {-4187, -61, 38}, + {538, 207, -41}, + {3034, -66, -44}, + {1542, -27, 17} + }, + { + {11728, 24, -9}, + {14067, -2, -3}, + {1627, 17, 21}, + {7348, -127, -1}, + {4077, -147, -21}, + {688, -5, 13}, + {-5421, -109, -9}, + {1864, 49, -29}, + {1206, -5, 3}, + {4155, -77, 4}, + {678, -81, -45}, + {-2732, -63, -9}, + {-4039, -21, -1}, + {947, -174, 26}, + {2419, 73, 4}, + {1155, 82, 27} + }, + { + {11803, 26, -19}, + {14066, -26, -9}, + {1103, -249, 4}, + {7377, -83, 12}, + {4442, 37, -7}, + {467, -194, -19}, + {-4790, 199, 3}, + {1969, 26, -46}, + {1272, 6, -1}, + {4382, -17, -7}, + {1226, 144, -41}, + {-2277, 182, 10}, + {-3788, 156, 24}, + {1223, -16, 34}, + {1865, -141, 11}, + {675, -160, 14} + }, + { + {11934, -62, -7}, + {14072, 10, -20}, + {354, 255, -61}, + {7127, 183, -42}, + {4688, 7, -33}, + {-17, 176, -75}, + {-4069, -183, 29}, + {2199, -103, -32}, + {1355, 22, -20}, + {4567, 5, -45}, + {1686, -154, 0}, + {-1696, -142, 35}, + {-3473, -106, 72}, + {1265, 86, -5}, + {1426, 111, -15}, + {91, 178, -16} + }, + { + {12107, 38, 2}, + {14121, -15, -39}, + {-482, -54, -40}, + {6701, -53, -59}, + {4811, 38, -45}, + {-623, -7, -46}, + {-3378, 54, 8}, + {2546, 100, -18}, + {1439, 53, -25}, + {4683, 102, -32}, + {2101, 18, 4}, + {-1124, 48, 11}, + {-3143, -49, 45}, + {1113, -92, -37}, + {1118, -16, -17}, + {-504, -39, -1} + }, + { + {12293, 1, -14}, + {14193, -29, -56}, + {-1280, -64, 98}, + {6210, -90, 37}, + {4792, -163, 32}, + {-1236, -87, 88}, + {-2798, -38, -52}, + {2914, -96, -11}, + {1496, -95, 20}, + {4682, -204, 84}, + {2503, 81, -83}, + {-657, -43, -32}, + {-2812, 126, -77}, + {869, -14, -26}, + {891, -34, 20}, + {-1018, 14, 67} + }, + { + {12463, 3, -42}, + {14244, 88, -32}, + {-1949, -56, 239}, + {5733, 65, 192}, + {4651, 141, 196}, + {-1750, -62, 212}, + {-2357, 127, -66}, + {3210, 79, 9}, + {1505, 48, 81}, + {4572, 102, 256}, + {2900, -22, -208}, + {-352, 107, -27}, + {-2527, 16, -197}, + {609, 126, 70}, + {674, 16, 73}, + {-1406, -88, 100} + } }; -const Word32 leftHRIRImag_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA] /* Q29 */= +const Word16 leftHRIRImag_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]= { { - { -102715752, 295527040, -88424248, }, - { -96281896, 56815440, 11869679, }, - { -8760123, 37118180, -14165876, }, - { -16805134, 23917600, -6433324, }, - { -6374269, -26807576, 12249784, }, - { 1127429, -13645648, 4787278, }, - { 4656282, 38743288, -16459388, }, - { 5360119, -24749212, 7655779, }, - { -9627169, 107434848, -38639672, }, - { -5340792, -41006200, 19219442, }, - { 268435, 7092602, -3980898, }, - { -2935073, -9185324, 4246112, }, - { -741419, -13098040, 6208912, }, - { 931471, -9216463, 4911295, }, - { -3754875, -8075076, 3953518, }, - { -147103, 2249489, -787590, } - }, - { - { -177186736, 179125376, -115792320, }, - { -239960896, -299077888, -104825120, }, - { -9208410, 46498388, -8622147, }, - { -28982440, 16567299, -3951907, }, - { -16998944, -27056684, 16417512, }, - { 7049115, 40280352, 29566554, }, - { 19155554, 43337292, -20049982, }, - { 6044093, -23644868, 7273527, }, - { 2528662, 81792824, -53621592, }, - { -29154238, -116467704, -7671349, }, - { 7763691, 48617956, 14192719, }, - { -10481331, -30494268, -1056025, }, - { -6800544, -35405564, -2618320, }, - { -5965173, -47450800, -11907260, }, - { -10130217, -13799730, 3756486, }, - { 438624, 4456029, 349503, } - }, - { - { -51999168, -317713760, 45510012, }, - { -132898096, -545737344, -39643620, }, - { -308164, 25183540, -2346663, }, - { -10490458, 16738024, -7422241, }, - { -20291572, 66797480, -22439594, }, - { -3951370, 103472744, 4090420, }, - { 38857104, -86104968, 33058364, }, - { -1992328, 11780558, -2269353, }, - { 60647084, -194886288, 50082004, }, - { -30465276, -48754860, -39180840, }, - { 3276523, 72164576, 4759898, }, - { -2859375, -54574540, 8997420, }, - { -1475858, -48667348, 3673808, }, - { -47782, -96552472, 8617315, }, - { 973884, -46942380, 19906100, }, - { 2827699, -5764920, 3810710, } - }, - { - { 34120832, -220877824, 40671192, }, - { 49936512, -199888848, 41771240, }, - { 3815542, 29523606, -4461934, }, - { 18192408, 43142408, -7209103, }, - { 7750269, 111525808, -8528194, }, - { -7198365, 69175280, -11199127, }, - { 13021804, -200965808, -12485470, }, - { -1145683, 12852153, 373662, }, - { 31666258, -357677888, -27057220, }, - { -7707856, -32124208, -42369316, }, - { -4867272, 29853244, -13622026, }, - { -4420595, -104069208, -21484500, }, - { 5786395, -47440600, 2157147, }, - { 3860102, -75734768, 17977660, }, - { 8563091, -98140536, -7536057, }, - { -2442226, -55461448, -19271518, } - }, - { - { 10460393, -181682480, 44848048, }, - { 108469400, -340663936, 99499360, }, - { 4267587, -36406292, 25516938, }, - { 26082262, -82588464, 40497784, }, - { 29406030, -4441533, 31512176, }, - { 13383655, -11658152, 22476638, }, - { -14169097, -91462400, -56171728, }, - { 7954280, -922881, 2018635, }, - { -27049704, -254546064, -60070488, }, - { 27341762, -175464448, 20010252, }, - { -3204046, 10685342, -5061619, }, - { -1270237, -125430760, -10515154, }, - { 7642358, -40255656, -4295504, }, - { -2068027, 463856, -14248554, }, - { 13204877, -75227960, -24315958, }, - { 3937948, -75275744, -8985608, } - }, - { - { -109123848, -363628576, 19850266, }, - { -9291625, -471410240, 91331408, }, - { -23200876, -97610112, 6461242, }, - { -36034776, -107364520, 42067596, }, - { -1789928, -2889439, 32729262, }, - { 20062330, -51043540, 1501628, }, - { -3835943, 12977244, -8718247, }, - { 13856101, 18894098, 5616744, }, - { -66184372, -170432352, 3189550, }, - { 38536596, -82056424, 61956512, }, - { -4857071, 3991635, -8170639, }, - { 4960687, -70343512, 20109574, }, - { 5545877, -7403987, 10499048, }, - { 9702868, 27723478, -3980898, }, - { 12382928, 13322989, 15064598, }, - { 12425877, -38941932, 6793028, } - }, - { - { -195198208, -105714176, -71322760, }, - { -215174640, 32808718, -78798688, }, - { -47779364, -19037980, -21328808, }, - { -133198744, 112761144, -23626616, }, - { -73338176, 144662544, -7880191, }, - { 21403432, -30356828, -10085120, }, - { 6622303, -32783486, 7916699, }, - { 880468, 11415486, 10504953, }, - { -88258896, -64644088, -35305168, }, - { 2688650, 66810364, 1264331, }, - { -3269007, -19416474, 1700807, }, - { 4816806, -14665166, -4730370, }, - { -14203457, 39763880, -4204236, }, - { 19469086, -13660680, 9423158, }, - { -25116432, 59262496, 6179921, }, - { 8930311, -33924872, 1862942, } - }, - { - { -75185016, 178007072, 17114908, }, - { -224526400, 173874768, -14468671, }, - { -35714800, 41899016, 1722819, }, - { -147797872, 57060788, -37157908, }, - { -110517560, 32109712, -40170292, }, - { 13028246, 9739375, 8776229, }, - { 11642583, -30146376, 6591701, }, - { -34980900, -38170448, -902480, }, - { -13600014, 85681376, 7280507, }, - { -15824270, 18907520, -12783433, }, - { -6081674, -16430934, 4125853, }, - { 29388314, 10895795, 162135, }, - { -25477210, 14954002, -10593000, }, - { 11839614, -21398600, 6806987, }, - { -62463320, -21545704, -17193828, }, - { -3930432, -23349052, 8411693, } - }, - { - { 124779536, -22646826, 48507360, }, - { -77259480, -69186552, 43811888, }, - { -10337449, -4553202, 13614509, }, - { -42608224, -104795592, 4864051, }, - { -49625664, -88771072, -3922379, }, - { -20056424, 35947804, 5018133, }, - { 1079111, -107911, -3783866, }, - { -63607928, -75699, -8749922, }, - { 70587248, -13620952, 24923158, }, - { -7115687, -30103962, 4275640, }, - { -10963441, 7543573, -4325569, }, - { 55031952, -24158654, 6695854, }, - { -15417322, -20169704, 1402307, }, - { -11427834, 19712826, -4295504, }, - { -59354836, -50075560, -6753836, }, - { -32708324, 12753905, -102005, } - }, - { - { 286679936, -42412804, 9840844, }, - { 116902568, -6942278, 25850872, }, - { 13852343, -19517406, 3364570, }, - { 110133696, 32694902, 25050396, }, - { 60822104, 43612172, 22499724, }, - { -56594248, -16292958, -8150238, }, - { -18313740, -4286378, -1090922, }, - { -58529128, 17256104, -2695629, }, - { 99918120, -48497696, 5523865, }, - { 9865540, -2490007, 9789841, }, - { -6185290, 13204877, -2734284, }, - { 57276072, -23256712, 6016713, }, - { 1996623, 1510218, 5279052, }, - { -33033130, 7542500, -4423280, }, - { -24627342, 22221624, 13475460, }, - { -56947508, -13872207, -4949413, } - }, - { - { 369951296, 11637214, -19057844, }, - { 275144736, 7006166, -4369593, }, - { 43432856, -7104413, -4556961, }, - { 223252400, 22448720, 7514046, }, - { 149661888, 27103392, 11121818, }, - { -66699232, -26035018, -1901060, }, - { -45021996, 6493454, -987306, }, - { -21727166, -23222888, 5068062, }, - { 68480032, 28010702, -14796162, }, - { 20506858, 13718662, 1280974, }, - { 7138236, -9458592, 3651796, }, - { 26306674, 18474264, -4527970, }, - { 12858595, 8259759, 213138, }, - { -42810624, -7886097, 3251290, }, - { 8556112, 19741280, 7248294, }, - { -62429496, -17578228, -3010772, } - }, - { - { 393655232, 18198314, -15280957, }, - { 366834752, 10258529, -13111461, }, - { 89055072, 13213467, -2873870, }, - { 262732272, -14457397, -9764071, }, - { 184219200, -16023449, -8928700, }, - { -46308336, 9028021, 7953743, }, - { -69313792, 40265, 445603, }, - { 25310780, -430034, 4767951, }, - { 12801150, 2143189, -12394202, }, - { 22710176, -4475356, -5142687, }, - { 21137144, -7526394, 1753420, }, - { -20363514, -2947958, -3504693, }, - { 10953777, -259309, -2443300, }, - { -43550432, -8719320, 2104534, }, - { 27887760, -11151346, -7304129, }, - { -48897128, 11552388, 5156108, } - }, - { - { 393587584, -16003585, -1691143, }, - { 407478592, -13923747, -8107825, }, - { 150810256, -17078400, -2028298, }, - { 246486560, 4512400, -10222022, }, - { 178807536, -2159295, -9586367, }, - { -6522445, 5173288, 2015413, }, - { -84209816, 1737314, 2623688, }, - { 61722976, 1511292, -2246268, }, - { -34659848, -12631499, 715649, }, - { 21009906, -8139500, -2964601, }, - { 33974264, -1009854, -2833605, }, - { -64991980, 3661997, 1915555, }, - { -3665755, 1257889, -104153, }, - { -37127844, -5294084, -829466, }, - { 37775312, -15984795, -6041409, }, - { -32945620, 7146826, 3170223, } - }, - { - { 389030080, -645856, 3390877, }, - { 422571104, 10395968, -1673427, }, - { 215616480, 13672492, -2324651, }, - { 210861424, 412854, -4902705, }, - { 159334160, 3248606, -3352222, }, - { 43313136, 6364605, -6125160, }, - { -83583288, -2106145, 1627793, }, - { 81618872, 6060736, -3098819, }, - { -65605088, -4659503, 7262790, }, - { 17300128, 3033321, 1637993, }, - { 46225124, 6788733, -1626182, }, - { -92247304, -4304631, 3346317, }, - { -26742076, -5826660, 1142461, }, - { -24902758, 7871065, 2764348, }, - { 40583684, 10146860, 3660923, }, - { -22914724, -646393, -1450088, } - }, - { - { 381346400, 8778376, 318901, }, - { 423162720, 911607, 1009317, }, - { 256772480, -5362267, -3470871, }, - { 181759264, -3532611, 468688, }, - { 143814832, -2244657, 301185, }, - { 86775520, -16913582, -5376762, }, - { -60142428, -4284767, -837519, }, - { 86478096, -3433290, 421444, }, - { -85866056, 12759811, 3310883, }, - { 9114457, 6254010, 1319629, }, - { 54241680, -2934537, 525597, }, - { -90273232, -1603633, 2403571, }, - { -48776332, 4350265, 1156957, }, - { -10286447, 5401458, 1887638, }, - { 36567888, 9317932, 4653060, }, - { -18476412, -3271691, -350577, } - }, - { - { 368989216, -5534602, -2714419, }, - { 410308960, -8353175, -446677, }, - { 249583776, -1581622, -1770063, }, - { 160193696, -6912750, 1336272, }, - { 132391296, -3189013, 680215, }, - { 98816464, 7694434, 409633, }, - { -12958453, 11945378, -2587181, }, - { 82759184, -5604933, 719407, }, - { -97562864, -6251325, -1469953, }, - { -4041564, -5899138, -1145146, }, - { 55416352, -1132261, 874026, }, - { -55714316, 4063039, -931471, }, - { -58292368, 212064, 1797981, }, - { 9628780, -887448, -3663070, }, - { 33955476, -9705552, -1395328, }, - { -17141752, -2013803, 310848, } - }, - { - { 354289152, 1707786, -2571075, }, - { 388501792, 8374113, -2523830, }, - { 184855392, 18489298, 1823214, }, - { 135551856, 5879274, -466541, }, - { 114764744, 6063420, -659814, }, - { 60275572, 12415677, 4552129, }, - { 46445776, -17685602, -2125472, }, - { 81105088, 2907693, -1739999, }, - { -98579160, -4654134, -1602560, }, - { -20057498, 1689533, -1277216, }, - { 51474648, 2972117, 359704, }, - { 5354214, -17738752, -3388729, }, - { -46520940, -505196, 658741, }, - { 37961068, -15249281, -3142842, }, - { 44451836, -3827890, -4762045, }, - { -13396540, -1116692, -637803, } - }, - { - { 340785792, -648540, -1286880, }, - { 367042528, -4130148, -3242164, }, - { 77211704, -35029752, 872952, }, - { 100708928, -5694590, 889595, }, - { 83269752, -6628745, -448824, }, - { -25592100, -34553012, 2397129, }, - { 94690608, 10888816, -446677, }, - { 89442160, 3150359, -2889976, }, - { -88895624, 9186398, 1739999, }, - { -36222680, 879931, 1087701, }, - { 48532592, -2396592, -495532, }, - { 74482784, 21537114, -996969, }, - { -9998684, 8573292, -2022393, }, - { 66636956, 12024298, 1883880, }, - { 71037688, 16143708, -2165201, }, - { -2926483, 5681705, 247497, } - }, - { - { 329444928, 1310502, -534723, }, - { 353794720, -2165201, -1990717, }, - { -35852776, 28246390, -2888366, }, - { 55373404, 13240310, 1661079, }, - { 37164352, 11212549, 545461, }, - { -127722128, 30776126, -3580392, }, - { 106435192, 4369593, -664646, }, - { 105386152, -7526394, -2194192, }, - { -73596952, -3322694, 3643743, }, - { -49728204, 2808372, 2727841, }, - { 53045532, 820339, -2132988, }, - { 122394760, -6372121, 637803, }, - { 44829796, -17051558, -1961190, }, - { 82841328, 1896228, 2768643, }, - { 103471664, -14290430, 3080565, }, - { 13754096, -4429722, 1447941, } - }, - { - { 318065408, -2289755, -362388, }, - { 349757984, 4101157, 578210, }, - { -113754360, -4496294, -1942399, }, - { 8507793, -14286135, -691490, }, - { -16632261, -13100724, 366146, }, - { -202864720, -2484639, -2860448, }, - { 68579888, -16773458, -2518998, }, - { 115998480, 4524748, -450972, }, - { -57802208, -2226941, 1721745, }, - { -55953760, -4285304, 1493038, }, - { 64990908, 3839164, -3566434, }, - { 125006096, -11333882, -2152852, }, - { 97701920, 11058467, -1133871, }, - { 83138216, -8892193, -703838, }, - { 125751272, -3743064, 3295314, }, - { 33724084, -200790, -140123, } - }, - { - { 303769600, 3554622, -392453, }, - { 350124128, 987306, 1495722, }, - { -137944144, -8970576, 2792266, }, - { -26552024, 2578054, -1378685, }, - { -65428460, 7725573, 780073, }, - { -224844752, -13725105, 4529043, }, - { -12483322, 17953500, -1854889, }, - { 103481872, 7759932, -520228, }, - { -43051680, 3295314, -2524367, }, - { -48843440, -154619, -881542, }, - { 73293616, -6476274, -2489471, }, - { 76880992, 14780593, -3942780, }, - { 123941480, -2439542, -1432372, }, - { 75282184, 4989142, -3872987, }, - { 130074160, 13528610, -3344169, }, - { 54148264, -2907693, -2643552, } - }, - { - { 285796256, -3981972, -291521, }, - { 350552544, -5566278, -934155, }, - { -118486872, 7196218, 3931506, }, - { -41846404, 7055021, 2590939, }, - { -97731440, -5333276, 1343788, }, - { -194669936, 10606959, 7839926, }, - { -113775832, -16637630, 2842195, }, - { 56706992, -15079093, -1974611, }, - { -29278256, 8361765, -3295851, }, - { -26415122, 8336532, -1655173, }, - { 59804736, 1544578, 1472637, }, - { -8213588, -12548284, 590021, }, - { 108378128, -5355288, -51540, }, - { 70177080, 6913287, -2084133, }, - { 118951264, -5292474, -8668318, }, - { 71132176, 9405978, -1124745, } - }, - { - { 266198848, 4580583, -198105, }, - { 350230976, 1767379, -3656628, }, - { -80328776, -6408091, 1429150, }, - { -38255272, -1089848, 5014911, }, - { -107569064, 468151, 574989, }, - { -127891240, -5308043, 2437931, }, - { -204628880, 22431004, 4451197, }, - { -21296058, 14463839, 33823, }, - { -19694036, -12688944, 2639258, }, - { 4931696, -13265006, 676457, }, - { 12508555, 14493367, 4561256, }, - { -104526616, 20976620, 5231270, }, - { 52614960, 17870822, 1361505, }, - { 70737040, -3554622, 1427003, }, - { 93311384, -9984188, -3721589, }, - { 78050296, -3340948, 2378338, } - }, - { - { 248731760, -3841312, -413391, }, - { 347933152, 4990215, -2474975, }, - { -48056924, 5582384, 192737, }, - { -17847736, -1597191, 1737314, }, - { -95645160, 7235410, 721018, }, - { -41769632, 15646566, -4005057, }, - { -254933696, -15661061, -967978, }, - { -116530512, -22162568, 2592013, }, - { -19997904, -4423280, 6172405, }, - { 32169842, 5239323, 2809446, }, - { -61610232, -30427696, 1196685, }, - { -179832432, -24736864, 1607928, }, - { -22802518, -23575612, -494995, }, - { 71613208, -3980898, 626528, }, - { 43881144, -3936338, 5649493, }, - { 71671728, -8278550, 1923609, } - }, - { - { 236869056, 1332514, -442382, }, - { 337984384, -1898912, 1230508, }, - { -36775656, -474057, 851477, }, - { 20679730, -7783555, -1839320, }, - { -70426728, -8507793, 2003602, }, - { 44932336, -25403120, -3211025, }, - { -247928592, -11966853, -4479651, }, - { -206551424, 20236276, 1881733, }, - { -25847114, 15595563, 737661, }, - { 45509472, 4691715, 1045288, }, - { -135022496, 19324132, -4323422, }, - { -203965856, 22549, -3609920, }, - { -85994912, 11100880, -2160906, }, - { 66792648, 5742908, -2680060, }, - { -36132488, 30173756, 5865852, }, - { 59363428, 8577050, -1539209, } - }, - { - { 231336064, 232465, -187905, }, - { 314608512, -9227200, 2216740, }, - { -47083580, -6296422, 1185411, }, - { 75150656, 17259326, -1380832, }, - { -43449500, 4299263, 2225330, }, - { 109668768, 16653736, 1604170, }, - { -196255840, 30693446, 824097, }, - { -266336288, -7691213, 1482838, }, - { -19513648, -40802, -5159330, }, - { 46906948, -3625489, -1585380, }, - { -178553600, 5398237, -2368675, }, - { -168658528, 26050588, -896038, }, - { -113106352, 3360275, -834297, }, - { 52196200, 1465658, -2229625, }, - { -130574520, -31559420, -607201, }, - { 54207856, 810138, -3128347, } - }, - { - { 229698608, -639413, 103079, }, - { 280268096, 14671608, -709743, }, - { -66435628, 8568460, -228170, }, - { 134516768, -15690052, 752156, }, - { -22232362, 897111, 233539, }, - { 135112160, 6288369, 1469416, }, - { -139269680, -16405701, 7248294, }, - { -280978368, -4770635, 2736431, }, - { 12651363, -20282446, -2835215, }, - { 45940044, -1393180, -1640141, }, - { -184659968, -12319577, 4322885, }, - { -97737352, -26691612, 5443334, }, - { -101278552, -13482439, 2464238, }, - { 23606750, 4308389, 1158567, }, - { -205791216, 10285910, -2576981, }, - { 63715304, -10809896, -556198, } - }, - { - { 228049344, -766115, 147103, }, - { 246180544, -7079180, -2858301, }, - { -76775224, -832687, -1352915, }, - { 183658704, 7169911, 1001801, }, - { -6696391, 2782602, -1196148, }, - { 122947200, -12901545, -2642479, }, - { -114430280, -11481521, 4749160, }, - { -251979824, 10114111, 2804614, }, - { 64481956, 19887846, 2881386, }, - { 50970524, 4954782, 78383, }, - { -167591776, 1422708, 5360656, }, - { -30406220, 4449586, 4957466, }, - { -66963908, 7187628, 3494493, }, - { -20111722, -12416214, 1946157, }, - { -235634256, 7168301, 1110786, }, - { 83446384, 6468221, 2186138, } - }, - { - { 223257776, 2434173, -358630, }, - { 222571648, -1423782, -1270774, }, - { -66901096, -5757941, -1224603, }, - { 213205392, -363462, -601295, }, - { 7517804, -5701032, 143345, }, - { 91403880, 10115722, -4810364, }, - { -129454608, 18477486, -2522220, }, - { -192888048, -18012020, 2818572, }, - { 116327040, -5597953, 3251827, }, - { 64936684, -4624069, 1325534, }, - { -144151984, -967441, 1925756, }, - { 7003481, 5485210, -1249299, }, - { -32142998, -2110440, 637803, }, - { -70955008, 14260902, 665720, }, - { -216462592, -14950781, 4974646, }, - { 102517112, 1085016, 637266, } - }, - { - { 214601264, -2141578, -664646, }, - { 210639152, 2856690, 1705639, }, - { -39098696, 12422119, 195421, }, - { 224401296, -1705102, -2122251, }, - { 23874650, 3256122, 1199370, }, - { 59892244, -667331, -3594888, }, - { -164760848, -9598715, -5667210, }, - { -122378112, 14896557, 3575560, }, - { 153078544, -1903207, -1206886, }, - { 86211264, 2884071, 637803, }, - { -122694328, 2251637, 253940, }, - { 11296301, -5420249, -4977867, }, - { -11534135, 192200, -1800665, }, - { -114549464, -8192650, -90194, }, - { -162886096, 13973139, 6212134, }, - { 113876224, -239981, -1750736, } - }, - { - { 203155712, 2066953, -350577, }, - { 204104896, 4072703, 1747515, }, - { -6510634, -9341554, 2334315, }, - { 225802000, 472983, -2469606, }, - { 44047572, -288837, -622770, }, - { 37247568, -4226785, 686658, }, - { -195934800, -5150203, -1933272, }, - { -55822764, -6788196, 1361505, }, - { 173047984, -2663954, -3274913, }, - { 111873696, -4126927, -835371, }, - { -104021424, -2258079, -476205, }, - { -6830072, -1428077, -2796024, }, - { -11289322, 1420024, -2125472, }, - { -137739072, 110595, 669478, }, - { -94089312, -7212324, 3067144, }, - { 116191752, -2365453, -1021665, } - }, - { - { 190689024, -2371359, 25233, }, - { 197546480, -3785477, -316217, }, - { 16255377, -399969, 1974074, }, - { 225470752, 848256, -2200097, }, - { 67733784, 5657546, -2481417, }, - { 19403588, -2711198, 3480534, }, - { -212375392, 4522601, 3687230, }, - { 2371896, 7086696, -2202245, }, - { 181697520, 2357400, -2130841, }, - { 138478336, 6050535, -1375463, }, - { -84387520, 5470715, -548682, }, - { -35806068, -4025995, 1049583, }, - { -31158914, -4240207, -985695, }, - { -135325296, 6150930, 2264522, }, - { -20935818, 10323491, -1573032, }, - { 111204760, -1440425, 493921, } - }, - { - { 179225232, 2760053, -17717, }, - { 190236448, 1275605, -811749, }, - { 24045912, 6411850, -1258962, }, - { 225514768, -2793339, -1294396, }, - { 90458992, -10246718, -591095, }, - { -167504, 10723460, 1471026, }, - { -217126704, 2069101, 4703526, }, - { 54550916, -13069585, -2480881, }, - { 184158000, -1075352, -1227824, }, - { 161489696, -6567005, -497142, }, - { -61848064, -6723235, 358093, }, - { -67046588, 7152195, 1881733, }, - { -66924716, 8096014, 238371, }, - { -111702976, -5281736, 2227478, }, - { 53031036, -16231755, -3055332, }, - { 102903120, 5515812, -529355, } - }, - { - { 170537584, -1824824, -342524, }, - { 183614688, -394063, -205622, }, - { 22137336, -1753420, -3557307, }, - { 221629984, 302795, -28454, }, - { 103760504, 3090229, 2041720, }, - { -20645370, -6936909, -1555852, }, - { -213660128, -3447248, 2346663, }, - { 100076496, 9751723, -1311576, }, - { 182113600, -1058710, -1208496, }, - { 176058768, 1651952, 193810, }, - { -38847980, 4515621, 702227, }, - { -92197376, -7477001, 769873, }, - { -110912696, -10102300, 789737, }, - { -75545256, 8342974, 1235877, }, - { 122212760, 16909824, -2013266, }, - { 96241088, -2203855, -2356327, } - }, - { - { 165191424, 577673, -507343, }, - { 179486688, 921807, -26307, }, - { 18013092, -6145562, -1138703, }, - { 208220544, 3984119, 584116, }, - { 103398656, 5571110, 1526324, }, - { -36229660, -1289564, -903017, }, - { -200551888, 775242, -777926, }, - { 134781984, -8606041, -266288, }, - { 173686336, 821413, -890132, }, - { 180358560, 1727651, -304406, }, - { -18604724, -3582003, 486405, }, - { -104140072, 1828582, -615254, }, - { -152703264, 9380209, 613107, }, - { -36066452, -5236639, -74088, }, - { 176816832, -12213276, -252866, }, - { 92410520, -2876554, -1875290, } - }, - { - { 161907920, 635655, -172872, }, - { 178636272, -357556, -479963, }, - { 12662100, -326954, 1681480, }, - { 184686816, -8484171, 18254, }, - { 95561952, -7052873, -1110786, }, - { -44053480, 1843078, 1413581, }, - { -174144816, 10176388, -1409823, }, - { 154284352, 120796, -38118, }, - { 156079104, -4118874, -20401, }, - { 177165248, -3488587, -1398549, }, - { -1976759, 2449742, 335007, }, - { -99716792, 5302137, -265214, }, - { -181908512, -4544613, 263067, }, - { -349503, 7743826, -988916, }, - { 206934208, -265214, -577136, }, - { 85982024, 1734093, 284542, } - }, - { - { 158032784, 541166, 315143, }, - { 180236160, -1362042, -498753, }, - { 3595425, 5788006, 567473, }, - { 157179168, 7753490, -1189706, }, - { 92995704, -1237488, -2185602, }, - { -45439144, 1014686, 1642288, }, - { -136143488, -13908178, 1192390, }, - { 158649648, 1945620, -955630, }, - { 128903776, 7742753, -26844, }, - { 171800832, -121333, -1593433, }, - { 13741211, -3517578, 564788, }, - { -83028696, -7720741, 1414655, }, - { -192142336, -2512556, 985695, }, - { 26982596, -4926865, -543850, }, - { 209874112, 5954436, -2946348, }, - { 68932080, 5796595, 1089848, } - }, - { - { 151386864, -2404645, 253940, }, - { 181588528, 503585, -170188, }, - { -8827768, -4410932, -1240172, }, - { 134659040, -2888903, -1367410, }, - { 104213624, 6438693, -1145146, }, - { -42312944, -794569, 366683, }, - { -95989296, 7403987, 2324114, }, - { 153781312, -4433480, -2048163, }, - { 96725344, -7683697, -385473, }, - { 167803840, 656056, -716723, }, - { 32862406, 1418413, -206695, }, - { -63042604, 3702799, 2165201, }, - { -183988880, 5443334, 2400350, }, - { 42643656, 1428077, -680752, }, - { 191339712, -6039798, -4101694, }, - { 38693360, -9665287, 308701, } - }, - { - { 142047456, 3342022, -296890, }, - { 179505472, 1129576, -209380, }, - { -22232362, 354335, -740345, }, - { 122268056, -1197759, -267899, }, - { 127089696, -8201777, -76773, }, - { -35804996, -1121523, -504659, }, - { -62621160, -1944010, 459562, }, - { 147204096, -1213328, -2026688, }, - { 66827544, 5657546, -360777, }, - { 164881648, -201327, -209917, }, - { 58692340, -5550709, -1727651, }, - { -47042776, 1225139, 587874, }, - { -163863744, -2279554, 1731946, }, - { 47356848, -1014686, -275952, }, - { 159833984, 1132261, -1580011, }, - { 1237488, 9800042, -374736, } - }, - { - { 131995080, -2185602, -686121, }, - { 172193296, -2389613, -385473, }, - { -34882112, -1754494, 548682, }, - { 118775712, 1829656, 1057099, }, - { 151923200, 6539625, 869194, }, - { -26918170, 2971044, -383326, }, - { -38384660, 2454037, -1380295, }, - { 142515600, 503048, -854162, }, - { 45397804, -2553895, 5906, }, - { 161184224, -705985, 71941, }, - { 90267864, 9992241, -1291711, }, - { -35852776, 878858, -1010391, }, - { -138178768, 5908265, 526134, }, - { 44611288, -2708514, -45634, }, - { 120780920, -8893267, 904628, }, - { -33002528, -6796786, -682900, } - }, - { - { 123259656, 386547, -297427, }, - { 159658960, 3253975, -445603, }, - { -46336256, 4461934, -53687, }, - { 118589952, 2868501, 408022, }, - { 167935376, 1099512, 287226, }, - { -18038862, -1049046, -440771, }, - { -20253992, -5125507, -966368, }, - { 137852352, -726923, -92342, }, - { 34689912, 804770, 202937, }, - { 155091264, 3265249, -384400, }, - { 120252640, -8320963, 351114, }, - { -26051124, -3993783, -417149, }, - { -111731424, -5927055, 835908, }, - { 39908300, 2525441, -925029, }, - { 78502336, 11174968, 89121, }, - { -55575268, 1717987, -388695, } - }, - { - { 116317912, -416075, 415538, }, - { 143268832, -3914863, -501437, }, - { -56534656, -2570538, -1308354, }, - { 116717344, -2132988, -1386738, }, - { 170748576, -4256850, -1899986, }, - { -12721693, 376883, -1067836, }, - { -4331475, 3602941, 61203, }, - { 130119792, -2341294, 446677, }, - { 32933272, 1725503, 509491, }, - { 146960896, -2652679, -1264868, }, - { 139780240, 676994, 488016, }, - { -14691473, 3594888, 795643, }, - { -87946968, 4322885, 1036698, }, - { 38193532, -301721, -1729261, }, - { 39508868, -8189966, -799401, }, - { -65048352, 2486249, 899259, } - }, - { - { 110479440, 2017024, 375810, }, - { 125087704, 3195993, -301185, }, - { -66401268, -1813013, -260382, }, - { 110462800, -526670, -1109712, }, - { 163715024, 1055488, -2429341, }, - { -14014478, -1299228, -401579, }, - { 11800960, -1622424, -513785, }, - { 118221120, 5338645, -335007, }, - { 35818416, -648540, 755914, }, - { 138514304, -256087, -814970, }, - { 145208544, 4230006, -1448478, }, - { -764504, -854162, 260382, }, - { -67583992, -1777043, 284005, }, - { 40011380, -4359929, -912144, }, - { 9163850, 2971581, -146029, }, - { -67017060, -1034013, 2039036, } - }, - { - { 105450576, -1956358, -323733, }, - { 106948440, -3267396, 158377, }, - { -78411072, -905701, 2007897, }, - { 97738424, -1114544, 679679, }, - { 151885616, 370441, -593242, }, - { -23703924, -2260227, 975494, }, - { 29065118, 3977677, -1253594, }, - { 105585328, -3322694, -1251446, }, - { 39151312, -676457, 128312, }, - { 130260456, -290447, 506269, }, - { 140068016, -2144263, -2621541, }, - { 15606837, 2944737, -1053341, }, - { -49851148, 2172180, -1049046, }, - { 40941240, 2907156, 1347546, }, - { -10340671, -733366, 1454383, }, - { -68507952, -2381023, 1583232, } - }, - { - { 101561480, 300648, -568546, }, - { 89951112, 4433480, -75699, }, - { -93799400, 7416872, 1560684, }, - { 78182904, 6487011, 1120450, }, - { 137742816, 3635690, 416612, }, - { -40410812, 7388955, 376347, }, - { 45799920, -4907000, -733366, }, - { 96689912, 514859, -1169305, }, - { 41371808, -478352, -199716, }, - { 121325312, 3826816, 365072, }, - { 130160056, 69256, -1712618, }, - { 32813550, -5970005, -579284, }, - { -33693480, -6060199, -606127, }, - { 35114580, 5337571, 1307818, }, - { -20415590, 2937758, 1492501, }, - { -71973992, 2348810, 609885, } - }, - { - { 98599568, 495532, -88047, }, - { 75073344, -2914672, -547608, }, - { -108793136, -4763656, -343061, }, - { 55084568, -7936026, -375810, }, - { 122353952, -4451197, -281320, }, - { -58283780, -4212826, -855235, }, - { 58262840, 2534031, -28991, }, - { 92815320, 1783485, -290984, }, - { 42135240, -676457, -319975, }, - { 111458696, -2683818, -582505, }, - { 119100520, -385473, -188442, }, - { 46731928, 2570001, 293668, }, - { -20077898, 2864743, 571231, }, - { 22313966, -5775121, -535797, }, - { -23293218, -1050120, 282931, }, - { -75310104, -1711545, -76236, } - }, - { - { 95407864, 774168, 247497, }, - { 62201328, 2433099, -663036, }, - { -117396488, -2913599, 489089, }, - { 34339336, 1861868, -654446, }, - { 106500160, 2358474, -437013, }, - { -70891656, -2207613, 473520, }, - { 63357212, 2029372, -622770, }, - { 91015728, -407485, 495532, }, - { 41493680, -763430, -267899, }, - { 100730408, -11811, -16106, }, - { 107888504, 3798362, 7516, }, - { 53526568, 1596654, -488553, }, - { -10588168, 2075543, -592706, }, - { 7605314, 3099893, -1168768, }, - { -21086678, -2073396, 204548, }, - { -74581032, -2846490, 326418, } - }, - { - { 90771448, -2081449, -117575, }, - { 49592376, -1717987, -501437, }, - { -116706608, 5574331, 3620121, }, - { 20064476, 2241973, 1702955, }, - { 90603944, -127775, 1071594, }, - { -75449152, 3895535, 3524021, }, - { 60686276, -2705830, -1933809, }, - { 86734184, -1172526, 712428, }, - { 39661340, 1410897, 824634, }, - { 88941792, 665183, 2068564, }, - { 96333432, -5178657, -1554778, }, - { 52489868, -1941325, -1625108, }, - { -5063230, -2674154, -3305514, }, - { -4338454, 185220, -432718, }, - { -16717623, 2758443, 1214402, }, - { -67415952, 3813394, 1714766, } - }, - { - { 84129280, 1676648, -499290, }, - { 35509180, 853088, 664646, }, - { -106909256, -1200443, 4897874, }, - { 13125957, 48855, 3714610, }, - { 76045616, 1665911, 3042984, }, - { -71664752, 399432, 4633196, }, - { 52086680, -175557, -1498944, }, - { 77734080, 1599875, 1329292, }, - { 36881956, 878858, 1655710, }, - { 77481744, 3317325, 3355980, }, - { 83693880, 1409286, -2289218, }, - { 45268420, 208306, -1228361, }, - { -3515968, -1600412, -4469987, }, - { -11599633, -2076080, 1337346, }, - { -12450573, -971736, 2001992, }, - { -54461260, -667867, 1289564, } - }, - { - { 75215616, -398358, 100395, }, - { 19555522, -3034395, 2166811, }, - { -88683560, -1553704, 2289755, }, - { 13752485, -4630512, 2234457, }, - { 65350612, -8352638, 1596654, }, - { -59645284, -3656628, 1658931, }, - { 39149164, -894964, 359167, }, - { 64903936, -2723546, 2352568, }, - { 34983044, -2870112, 938987, }, - { 69646112, -9290014, 470836, }, - { 67845448, 2728378, 355945, }, - { 34161096, -1496796, 13422, }, - { -7281044, 4550518, -2243047, }, - { -14781130, -1541356, 2099165, }, - { -7865696, 2147, 2094333, }, - { -36711768, 1573569, -861678, } - }, + {-3135, 9019, -2698}, + {-2938, 1734, 362}, + {-267, 1133, -432}, + {-513, 730, -196}, + {-195, -818, 374}, + {34, -416, 146}, + {142, 1182, -502}, + {164, -755, 234}, + {-294, 3279, -1179}, + {-163, -1251, 587}, + {8, 216, -121}, + {-90, -280, 130}, + {-23, -400, 189}, + {28, -281, 150}, + {-115, -246, 121}, + {-4, 69, -24} + }, + { + {-5407, 5466, -3534}, + {-7323, -9127, -3199}, + {-281, 1419, -263}, + {-884, 506, -121}, + {-519, -826, 501}, + {215, 1229, 902}, + {585, 1323, -612}, + {184, -722, 222}, + {77, 2496, -1636}, + {-890, -3554, -234}, + {237, 1484, 433}, + {-320, -931, -32}, + {-208, -1080, -80}, + {-182, -1448, -363}, + {-309, -421, 115}, + {13, 136, 11} + }, + { + {-1587, -9696, 1389}, + {-4056, -16655, -1210}, + {-9, 769, -72}, + {-320, 511, -227}, + {-619, 2038, -685}, + {-121, 3158, 125}, + {1186, -2628, 1009}, + {-61, 360, -69}, + {1851, -5947, 1528}, + {-930, -1488, -1196}, + {100, 2202, 145}, + {-87, -1665, 275}, + {-45, -1485, 112}, + {-1, -2947, 263}, + {30, -1433, 607}, + {86, -176, 116} + }, + { + {1041, -6741, 1241}, + {1524, -6100, 1275}, + {116, 901, -136}, + {555, 1317, -220}, + {237, 3404, -260}, + {-220, 2111, -342}, + {397, -6133, -381}, + {-35, 392, 11}, + {966, -10915, -826}, + {-235, -980, -1293}, + {-149, 911, -416}, + {-135, -3176, -656}, + {177, -1448, 66}, + {118, -2311, 549}, + {261, -2995, -230}, + {-75, -1693, -588} + }, + { + {319, -5545, 1369}, + {3310, -10396, 3036}, + {130, -1111, 779}, + {796, -2520, 1236}, + {897, -136, 962}, + {408, -356, 686}, + {-432, -2791, -1714}, + {243, -28, 62}, + {-825, -7768, -1833}, + {834, -5355, 611}, + {-98, 326, -154}, + {-39, -3828, -321}, + {233, -1228, -131}, + {-63, 14, -435}, + {403, -2296, -742}, + {120, -2297, -274} + }, + { + {-3330, -11097, 606}, + {-284, -14386, 2787}, + {-708, -2979, 197}, + {-1100, -3276, 1284}, + {-55, -88, 999}, + {612, -1558, 46}, + {-117, 396, -266}, + {423, 577, 171}, + {-2020, -5201, 97}, + {1176, -2504, 1891}, + {-148, 122, -249}, + {151, -2147, 614}, + {169, -226, 320}, + {296, 846, -121}, + {378, 407, 460}, + {379, -1188, 207} + }, + { + {-5957, -3226, -2177}, + {-6567, 1001, -2405}, + {-1458, -581, -651}, + {-4065, 3441, -721}, + {-2238, 4415, -240}, + {653, -926, -308}, + {202, -1000, 242}, + {27, 348, 321}, + {-2693, -1973, -1077}, + {82, 2039, 39}, + {-100, -593, 52}, + {147, -448, -144}, + {-433, 1213, -128}, + {594, -417, 288}, + {-766, 1809, 189}, + {273, -1035, 57} + }, + { + {-2294, 5432, 522}, + {-6852, 5306, -442}, + {-1090, 1279, 53}, + {-4510, 1741, -1134}, + {-3373, 980, -1226}, + {398, 297, 268}, + {355, -920, 201}, + {-1068, -1165, -28}, + {-415, 2615, 222}, + {-483, 577, -390}, + {-186, -501, 126}, + {897, 333, 5}, + {-778, 456, -323}, + {361, -653, 208}, + {-1906, -658, -525}, + {-120, -713, 257} + }, + { + {3808, -691, 1480}, + {-2358, -2111, 1337}, + {-315, -139, 415}, + {-1300, -3198, 148}, + {-1514, -2709, -120}, + {-612, 1097, 153}, + {33, -3, -115}, + {-1941, -2, -267}, + {2154, -416, 761}, + {-217, -919, 130}, + {-335, 230, -132}, + {1679, -737, 204}, + {-471, -616, 43}, + {-349, 602, -131}, + {-1811, -1528, -206}, + {-998, 389, -3} + }, + { + {8749, -1294, 300}, + {3568, -212, 789}, + {423, -596, 103}, + {3361, 998, 764}, + {1856, 1331, 687}, + {-1727, -497, -249}, + {-559, -131, -33}, + {-1786, 527, -82}, + {3049, -1480, 169}, + {301, -76, 299}, + {-189, 403, -83}, + {1748, -710, 184}, + {61, 46, 161}, + {-1008, 230, -135}, + {-752, 678, 411}, + {-1738, -423, -151} + }, + { + {11290, 355, -582}, + {8397, 214, -133}, + {1325, -217, -139}, + {6813, 685, 229}, + {4567, 827, 339}, + {-2035, -795, -58}, + {-1374, 198, -30}, + {-663, -709, 155}, + {2090, 855, -452}, + {626, 419, 39}, + {218, -289, 111}, + {803, 564, -138}, + {392, 252, 7}, + {-1306, -241, 99}, + {261, 602, 221}, + {-1905, -536, -92} + }, + { + {12013, 555, -466}, + {11195, 313, -400}, + {2718, 403, -88}, + {8018, -441, -298}, + {5622, -489, -272}, + {-1413, 276, 243}, + {-2115, 1, 14}, + {772, -13, 146}, + {391, 65, -378}, + {693, -137, -157}, + {645, -230, 54}, + {-621, -90, -107}, + {334, -8, -75}, + {-1329, -266, 64}, + {851, -340, -223}, + {-1492, 353, 157} + }, + { + {12011, -488, -52}, + {12435, -425, -247}, + {4602, -521, -62}, + {7522, 138, -312}, + {5457, -66, -293}, + {-199, 158, 62}, + {-2570, 53, 80}, + {1884, 46, -69}, + {-1058, -385, 22}, + {641, -248, -90}, + {1037, -31, -86}, + {-1983, 112, 58}, + {-112, 38, -3}, + {-1133, -162, -25}, + {1153, -488, -184}, + {-1005, 218, 97} + }, + { + {11872, -20, 103}, + {12896, 317, -51}, + {6580, 417, -71}, + {6435, 13, -150}, + {4862, 99, -102}, + {1322, 194, -187}, + {-2551, -64, 50}, + {2491, 185, -95}, + {-2002, -142, 222}, + {528, 93, 50}, + {1411, 207, -50}, + {-2815, -131, 102}, + {-816, -178, 35}, + {-760, 240, 84}, + {1239, 310, 112}, + {-699, -20, -44} + }, + { + {11638, 268, 10}, + {12914, 28, 31}, + {7836, -164, -106}, + {5547, -108, 14}, + {4389, -69, 9}, + {2648, -516, -164}, + {-1835, -131, -26}, + {2639, -105, 13}, + {-2620, 389, 101}, + {278, 191, 40}, + {1655, -90, 16}, + {-2755, -49, 73}, + {-1489, 133, 35}, + {-314, 165, 58}, + {1116, 284, 142}, + {-564, -100, -11} + }, + { + {11261, -169, -83}, + {12522, -255, -14}, + {7617, -48, -54}, + {4889, -211, 41}, + {4040, -97, 21}, + {3016, 235, 12}, + {-395, 365, -79}, + {2526, -171, 22}, + {-2977, -191, -45}, + {-123, -180, -35}, + {1691, -35, 27}, + {-1700, 124, -28}, + {-1779, 6, 55}, + {294, -27, -112}, + {1036, -296, -43}, + {-523, -61, 9} + }, + { + {10812, 52, -78}, + {11856, 256, -77}, + {5641, 564, 56}, + {4137, 179, -14}, + {3502, 185, -20}, + {1839, 379, 139}, + {1417, -540, -65}, + {2475, 89, -53}, + {-3008, -142, -49}, + {-612, 52, -39}, + {1571, 91, 11}, + {163, -541, -103}, + {-1420, -15, 20}, + {1158, -465, -96}, + {1357, -117, -145}, + {-409, -34, -19} + }, + { + {10400, -20, -39}, + {11201, -126, -99}, + {2356, -1069, 27}, + {3073, -174, 27}, + {2541, -202, -14}, + {-781, -1054, 73}, + {2890, 332, -14}, + {2730, 96, -88}, + {-2713, 280, 53}, + {-1105, 27, 33}, + {1481, -73, -15}, + {2273, 657, -30}, + {-305, 262, -62}, + {2034, 367, 57}, + {2168, 493, -66}, + {-89, 173, 8} + }, + { + {10054, 40, -16}, + {10797, -66, -61}, + {-1094, 862, -88}, + {1690, 404, 51}, + {1134, 342, 17}, + {-3898, 939, -109}, + {3248, 133, -20}, + {3216, -230, -67}, + {-2246, -101, 111}, + {-1518, 86, 83}, + {1619, 25, -65}, + {3735, -194, 19}, + {1368, -520, -60}, + {2528, 58, 84}, + {3158, -436, 94}, + {420, -135, 44} + }, + { + {9707, -70, -11}, + {10674, 125, 18}, + {-3472, -137, -59}, + {260, -436, -21}, + {-508, -400, 11}, + {-6191, -76, -87}, + {2093, -512, -77}, + {3540, 138, -14}, + {-1764, -68, 53}, + {-1708, -131, 46}, + {1983, 117, -109}, + {3815, -346, -66}, + {2982, 337, -35}, + {2537, -271, -21}, + {3838, -114, 101}, + {1029, -6, -4} + }, + { + {9270, 108, -12}, + {10685, 30, 46}, + {-4210, -274, 85}, + {-810, 79, -42}, + {-1997, 236, 24}, + {-6862, -419, 138}, + {-381, 548, -57}, + {3158, 237, -16}, + {-1314, 101, -77}, + {-1491, -5, -27}, + {2237, -198, -76}, + {2346, 451, -120}, + {3782, -74, -44}, + {2297, 152, -118}, + {3970, 413, -102}, + {1652, -89, -81} + }, + { + {8722, -122, -9}, + {10698, -170, -29}, + {-3616, 220, 120}, + {-1277, 215, 79}, + {-2983, -163, 41}, + {-5941, 324, 239}, + {-3472, -508, 87}, + {1731, -460, -60}, + {-893, 255, -101}, + {-806, 254, -51}, + {1825, 47, 45}, + {-251, -383, 18}, + {3307, -163, -2}, + {2142, 211, -64}, + {3630, -162, -265}, + {2171, 287, -34} + }, + { + {8124, 140, -6}, + {10688, 54, -112}, + {-2451, -196, 44}, + {-1167, -33, 153}, + {-3283, 14, 18}, + {-3903, -162, 74}, + {-6245, 685, 136}, + {-650, 441, 1}, + {-601, -387, 81}, + {151, -405, 21}, + {382, 442, 139}, + {-3190, 640, 160}, + {1606, 545, 42}, + {2159, -108, 44}, + {2848, -305, -114}, + {2382, -102, 73} + }, + { + {7591, -117, -13}, + {10618, 152, -76}, + {-1467, 170, 6}, + {-545, -49, 53}, + {-2919, 221, 22}, + {-1275, 478, -122}, + {-7780, -478, -30}, + {-3556, -676, 79}, + {-610, -135, 188}, + {982, 160, 86}, + {-1880, -929, 37}, + {-5488, -755, 49}, + {-696, -719, -15}, + {2185, -121, 19}, + {1339, -120, 172}, + {2187, -253, 59} + }, + { + {7229, 41, -13}, + {10314, -58, 38}, + {-1122, -14, 26}, + {631, -238, -56}, + {-2149, -260, 61}, + {1371, -775, -98}, + {-7566, -365, -137}, + {-6303, 618, 57}, + {-789, 476, 23}, + {1389, 143, 32}, + {-4121, 590, -132}, + {-6225, 1, -110}, + {-2624, 339, -66}, + {2038, 175, -82}, + {-1103, 921, 179}, + {1812, 262, -47} + }, + { + {7060, 7, -6}, + {9601, -282, 68}, + {-1437, -192, 36}, + {2293, 527, -42}, + {-1326, 131, 68}, + {3347, 508, 49}, + {-5989, 937, 25}, + {-8128, -235, 45}, + {-596, -1, -157}, + {1431, -111, -48}, + {-5449, 165, -72}, + {-5147, 795, -27}, + {-3452, 103, -25}, + {1593, 45, -68}, + {-3985, -963, -19}, + {1654, 25, -95} + }, + { + {7010, -20, 3}, + {8553, 448, -22}, + {-2027, 261, -7}, + {4105, -479, 23}, + {-678, 27, 7}, + {4123, 192, 45}, + {-4250, -501, 221}, + {-8575, -146, 84}, + {386, -619, -87}, + {1402, -43, -50}, + {-5635, -376, 132}, + {-2983, -815, 166}, + {-3091, -411, 75}, + {720, 131, 35}, + {-6280, 314, -79}, + {1944, -330, -17} + }, + { + {6960, -23, 4}, + {7513, -216, -87}, + {-2343, -25, -41}, + {5605, 219, 31}, + {-204, 85, -36}, + {3752, -394, -81}, + {-3492, -350, 145}, + {-7690, 309, 86}, + {1968, 607, 88}, + {1556, 151, 2}, + {-5114, 43, 164}, + {-928, 136, 151}, + {-2044, 219, 107}, + {-614, -379, 59}, + {-7191, 219, 34}, + {2547, 197, 67} + }, + { + {6813, 74, -11}, + {6792, -43, -39}, + {-2042, -176, -37}, + {6507, -11, -18}, + {229, -174, 4}, + {2789, 309, -147}, + {-3951, 564, -77}, + {-5886, -550, 86}, + {3550, -171, 99}, + {1982, -141, 40}, + {-4399, -30, 59}, + {214, 167, -38}, + {-981, -64, 19}, + {-2165, 435, 20}, + {-6606, -456, 152}, + {3129, 33, 19} + }, + { + {6549, -65, -20}, + {6428, 87, 52}, + {-1193, 379, 6}, + {6848, -52, -65}, + {729, 99, 37}, + {1828, -20, -110}, + {-5028, -293, -173}, + {-3735, 455, 109}, + {4672, -58, -37}, + {2631, 88, 19}, + {-3744, 69, 8}, + {345, -165, -152}, + {-352, 6, -55}, + {-3496, -250, -3}, + {-4971, 426, 190}, + {3475, -7, -53} + }, + { + {6200, 63, -11}, + {6229, 124, 53}, + {-199, -285, 71}, + {6891, 14, -75}, + {1344, -9, -19}, + {1137, -129, 21}, + {-5979, -157, -59}, + {-1704, -207, 42}, + {5281, -81, -100}, + {3414, -126, -25}, + {-3174, -69, -15}, + {-208, -44, -85}, + {-345, 43, -65}, + {-4203, 3, 20}, + {-2871, -220, 94}, + {3546, -72, -31} + }, + { + {5819, -72, 1}, + {6029, -116, -10}, + {496, -12, 60}, + {6881, 26, -67}, + {2067, 173, -76}, + {592, -83, 106}, + {-6481, 138, 113}, + {72, 216, -67}, + {5545, 72, -65}, + {4226, 185, -42}, + {-2575, 167, -17}, + {-1093, -123, 32}, + {-951, -129, -30}, + {-4130, 188, 69}, + {-639, 315, -48}, + {3394, -44, 15} + }, + { + {5470, 84, -1}, + {5806, 39, -25}, + {734, 196, -38}, + {6882, -85, -40}, + {2761, -313, -18}, + {-5, 327, 45}, + {-6626, 63, 144}, + {1665, -399, -76}, + {5620, -33, -37}, + {4928, -200, -15}, + {-1887, -205, 11}, + {-2046, 218, 57}, + {-2042, 247, 7}, + {-3409, -161, 68}, + {1618, -495, -93}, + {3140, 168, -16} + }, + { + {5204, -56, -10}, + {5603, -12, -6}, + {676, -54, -109}, + {6764, 9, -1}, + {3167, 94, 62}, + {-630, -212, -47}, + {-6520, -105, 72}, + {3054, 298, -40}, + {5558, -32, -37}, + {5373, 50, 6}, + {-1186, 138, 21}, + {-2814, -228, 23}, + {-3385, -308, 24}, + {-2305, 255, 38}, + {3730, 516, -61}, + {2937, -67, -72} + }, + { + {5041, 18, -15}, + {5477, 28, -1}, + {550, -188, -35}, + {6354, 122, 18}, + {3155, 170, 47}, + {-1106, -39, -28}, + {-6120, 24, -24}, + {4113, -263, -8}, + {5300, 25, -27}, + {5504, 53, -9}, + {-568, -109, 15}, + {-3178, 56, -19}, + {-4660, 286, 19}, + {-1101, -160, -2}, + {5396, -373, -8}, + {2820, -88, -57} + }, + { + {4941, 19, -5}, + {5452, -11, -15}, + {386, -10, 51}, + {5636, -259, 1}, + {2916, -215, -34}, + {-1344, 56, 43}, + {-5314, 311, -43}, + {4708, 4, -1}, + {4763, -126, -1}, + {5407, -106, -43}, + {-60, 75, 10}, + {-3043, 162, -8}, + {-5551, -139, 8}, + {-11, 236, -30}, + {6315, -8, -18}, + {2624, 53, 9} + }, + { + {4823, 17, 10}, + {5500, -42, -15}, + {110, 177, 17}, + {4797, 237, -36}, + {2838, -38, -67}, + {-1387, 31, 50}, + {-4155, -424, 36}, + {4842, 59, -29}, + {3934, 236, -1}, + {5243, -4, -49}, + {419, -107, 17}, + {-2534, -236, 43}, + {-5864, -77, 30}, + {823, -150, -17}, + {6405, 182, -90}, + {2104, 177, 33} + }, + { + {4620, -73, 8}, + {5542, 15, -5}, + {-269, -135, -38}, + {4109, -88, -42}, + {3180, 196, -35}, + {-1291, -24, 11}, + {-2929, 226, 71}, + {4693, -135, -63}, + {2952, -234, -12}, + {5121, 20, -22}, + {1003, 43, -6}, + {-1924, 113, 66}, + {-5615, 166, 73}, + {1301, 44, -21}, + {5839, -184, -125}, + {1181, -295, 9} + }, + { + {4335, 102, -9}, + {5478, 34, -6}, + {-678, 11, -23}, + {3731, -37, -8}, + {3878, -250, -2}, + {-1093, -34, -15}, + {-1911, -59, 14}, + {4492, -37, -62}, + {2039, 173, -11}, + {5032, -6, -6}, + {1791, -169, -53}, + {-1436, 37, 18}, + {-5001, -70, 53}, + {1445, -31, -8}, + {4878, 35, -48}, + {38, 299, -11} + }, + { + {4028, -67, -21}, + {5255, -73, -12}, + {-1065, -54, 17}, + {3625, 56, 32}, + {4636, 200, 27}, + {-821, 91, -12}, + {-1171, 75, -42}, + {4349, 15, -26}, + {1385, -78, 0}, + {4919, -22, 2}, + {2755, 305, -39}, + {-1094, 27, -31}, + {-4217, 180, 16}, + {1361, -83, -1}, + {3686, -271, 28}, + {-1007, -207, -21} + }, + { + {3762, 12, -9}, + {4872, 99, -14}, + {-1414, 136, -2}, + {3619, 88, 12}, + {5125, 34, 9}, + {-551, -32, -13}, + {-618, -156, -29}, + {4207, -22, -3}, + {1059, 25, 6}, + {4733, 100, -12}, + {3670, -254, 11}, + {-795, -122, -13}, + {-3410, -181, 26}, + {1218, 77, -28}, + {2396, 341, 3}, + {-1696, 52, -12} + }, + { + {3550, -13, 13}, + {4372, -119, -15}, + {-1725, -78, -40}, + {3562, -65, -42}, + {5211, -130, -58}, + {-388, 11, -33}, + {-132, 110, 2}, + {3971, -71, 14}, + {1005, 53, 16}, + {4485, -81, -39}, + {4266, 21, 15}, + {-448, 110, 24}, + {-2684, 132, 32}, + {1166, -9, -53}, + {1206, -250, -24}, + {-1985, 76, 27} + }, + { + {3372, 62, 11}, + {3817, 98, -9}, + {-2026, -55, -8}, + {3371, -16, -34}, + {4996, 32, -74}, + {-428, -40, -12}, + {360, -50, -16}, + {3608, 163, -10}, + {1093, -20, 23}, + {4227, -8, -25}, + {4431, 129, -44}, + {-23, -26, 8}, + {-2063, -54, 9}, + {1221, -133, -28}, + {280, 91, -4}, + {-2045, -32, 62} + }, + { + {3218, -60, -10}, + {3264, -100, 5}, + {-2393, -28, 61}, + {2983, -34, 21}, + {4635, 11, -18}, + {-723, -69, 30}, + {887, 121, -38}, + {3222, -101, -38}, + {1195, -21, 4}, + {3975, -9, 15}, + {4275, -65, -80}, + {476, 90, -32}, + {-1521, 66, -32}, + {1249, 89, 41}, + {-316, -22, 44}, + {-2091, -73, 48} + }, + { + {3099, 9, -17}, + {2745, 135, -2}, + {-2863, 226, 48}, + {2386, 198, 34}, + {4204, 111, 13}, + {-1233, 225, 11}, + {1398, -150, -22}, + {2951, 16, -36}, + {1263, -15, -6}, + {3703, 117, 11}, + {3972, 2, -52}, + {1001, -182, -18}, + {-1028, -185, -18}, + {1072, 163, 40}, + {-623, 90, 46}, + {-2196, 72, 19} + }, + { + {3009, 15, -3}, + {2291, -89, -17}, + {-3320, -145, -10}, + {1681, -242, -11}, + {3734, -136, -9}, + {-1779, -129, -26}, + {1778, 77, -1}, + {2833, 54, -9}, + {1286, -21, -10}, + {3401, -82, -18}, + {3635, -12, -6}, + {1426, 78, 9}, + {-613, 87, 17}, + {681, -176, -16}, + {-711, -32, 9}, + {-2298, -52, -2} + }, + { + {2912, 24, 8}, + {1898, 74, -20}, + {-3583, -89, 15}, + {1048, 57, -20}, + {3250, 72, -13}, + {-2163, -67, 14}, + {1934, 62, -19}, + {2778, -12, 15}, + {1266, -23, -8}, + {3074, 0, 0}, + {3292, 116, 0}, + {1634, 49, -15}, + {-323, 63, -18}, + {232, 95, -36}, + {-644, -63, 6}, + {-2276, -87, 10} + }, + { + {2770, -64, -4}, + {1513, -52, -15}, + {-3562, 170, 110}, + {612, 68, 52}, + {2765, -4, 33}, + {-2303, 119, 108}, + {1852, -83, -59}, + {2647, -36, 22}, + {1210, 43, 25}, + {2714, 20, 63}, + {2940, -158, -47}, + {1602, -59, -50}, + {-155, -82, -101}, + {-132, 6, -13}, + {-510, 84, 37}, + {-2057, 116, 52} + }, + { + {2567, 51, -15}, + {1084, 26, 20}, + {-3263, -37, 149}, + {401, 1, 113}, + {2321, 51, 93}, + {-2187, 12, 141}, + {1590, -5, -46}, + {2372, 49, 41}, + {1126, 27, 51}, + {2365, 101, 102}, + {2554, 43, -70}, + {1381, 6, -37}, + {-107, -49, -136}, + {-354, -63, 41}, + {-380, -30, 61}, + {-1662, -20, 39} + }, + { + {2295, -12, 3}, + {597, -93, 66}, + {-2706, -47, 70}, + {420, -141, 68}, + {1994, -255, 49}, + {-1820, -112, 51}, + {1195, -27, 11}, + {1981, -83, 72}, + {1068, -88, 29}, + {2125, -284, 14}, + {2070, 83, 11}, + {1043, -46, 0}, + {-222, 139, -68}, + {-451, -47, 64}, + {-240, 0, 64}, + {-1120, 48, -26} + } }; -const Word32 rightHRIRReal_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA] /* Q29 */= +const Word16 rightHRIRReal_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]= { { - { 189679184, 304322592, 107436456, }, - { -242399360, 302261536, -44863616, }, - { 11860552, 60100016, -1683090, }, - { 25304336, 104153, -207232, }, - { -21139292, 19353660, 8217883, }, - { -7248831, 2365453, -9037148, }, - { -26986890, 31329638, 9359807, }, - { -7344931, 43398496, -10575820, }, - { -19937238, 13084081, 28024662, }, - { -26909044, 42307040, 10624675, }, - { 2450816, -4110284, 718333, }, - { -5272609, 27694486, 1728188, }, - { -2057826, -12568685, -1696512, }, - { 4153234, -22881976, 5524939, }, - { 7628936, -1821066, -681826, }, - { -3011309, 570694, 995359, } - }, - { - { 5991480, -273394528, -70961448, }, - { -76770392, 439989344, -50001472, }, - { 1802813, 41517840, -4589173, }, - { 2413235, 12974559, 13751412, }, - { -11226508, -30864708, -13184476, }, - { -11241003, -13223667, -12262132, }, - { -26838176, -61006788, -28770912, }, - { 5379447, 112868520, 14491220, }, - { -50776712, -218518816, -55487220, }, - { -20914344, -47507172, -31159450, }, - { -1543504, -8399345, 417686, }, - { -11120744, -56255480, -37819336, }, - { -4721243, 1569811, 5162014, }, - { 2341294, -30473866, 3795677, }, - { 5437429, 39253852, 18807662, }, - { -3028489, -3227668, -131533, } - }, - { - { -103299336, -110683456, -102613208, }, - { 149763360, -126817496, 135879344, }, - { -1404454, 36626408, 381178, }, - { -23609436, 57801132, 3221226, }, - { 12256763, -65424164, -4438312, }, - { -4104915, -56324736, 8615704, }, - { 4727149, -149730608, 3177739, }, - { 8160438, 96794064, 20379620, }, - { -20394116, -285178304, -28841780, }, - { 28674812, -217949728, 35490388, }, - { -2268280, -26517128, 10790032, }, - { 17635672, -217100928, 30644592, }, - { -10921565, 13795972, 1620276, }, - { 214212, -26433914, 2987150, }, - { -10144176, 91749632, -2559801, }, - { -7639136, 26703960, -14314589, } - }, - { - { -33778308, 274702336, 33510408, }, - { 88140248, -585712192, -58195196, }, - { 4900021, 34997540, -1655173, }, - { -9982041, 43882756, -413927, }, - { 11105712, -50252728, -6448357, }, - { -443455, -63618128, 804233, }, - { 13956496, -165173168, -12775917, }, - { -4399121, 29312078, -5219459, }, - { 21663278, -239384304, -30239790, }, - { 16560857, -380443360, -43821016, }, - { -1107565, -18220326, 13462038, }, - { 14711874, -246313696, 17947058, }, - { -11474542, -3762928, -5577015, }, - { -1122060, -16861504, 4379793, }, - { -15287399, 38154880, -25150792, }, - { -4081293, 62483720, 1358820, } - }, - { - { 61600032, 37331856, 91757144, }, - { -56944824, -351084576, -99906848, }, - { 17413408, 12843026, 1846836, }, - { 26146150, 75161392, -28630788, }, - { -4660040, -135259792, 38225208, }, - { 2360622, -64597920, -166430, }, - { 13772886, -174139984, -3468723, }, - { -2582349, 33209760, -4078608, }, - { 52569864, -344211040, 8208220, }, - { -6097243, -299348480, -76846632, }, - { -2537252, 8970576, -233002, }, - { -7102266, -89445912, -49996640, }, - { -3978750, 6330782, -11567958, }, - { -2896956, -18562312, 6148783, }, - { 5714454, 6291590, -11762305, }, - { 2909304, 16636556, 23424214, } - }, - { - { 35767952, -48289928, 51695836, }, - { -122719024, -248484800, -12538620, }, - { 16426639, 29774324, 5659157, }, - { 56310780, 181175136, -1972464, }, - { -39025684, -217555120, 20864952, }, - { -2611340, -43738872, 11940546, }, - { 13994614, -115656488, 29881698, }, - { 8351564, 18503256, -14416595, }, - { 43786656, -177021376, 90108952, }, - { -2380486, -120777704, 14774687, }, - { -458488, 9656160, -627602, }, - { 9182103, -11922292, -14430553, }, - { 9099425, 37925100, -2336999, }, - { -3535295, -46244988, -2520609, }, - { 31896574, 57557392, 2627983, }, - { 3047279, -31762356, 1707250, } - }, - { - { -133453760, 248134224, -24065238, }, - { -49510236, -309569984, -16902306, }, - { -9960029, 63480152, -102005, }, - { 12905303, 103205376, 40805412, }, - { -39440148, -59966872, -45799920, }, - { -24383604, -28147068, 7584912, }, - { 2330557, -47321948, -1519345, }, - { 31236760, -36228588, 1898912, }, - { -60579440, 97428112, -7415261, }, - { -27457726, -30667678, -19580220, }, - { 1240172, 5094368, 1571958, }, - { 19764902, -37777996, -7081328, }, - { 13549548, 1037772, 12015708, }, - { 6334540, -37628744, -9266929, }, - { 42618424, -2711198, 22687628, }, - { 14770929, -17062294, -7906498, } - }, - { - { -316071488, 37549824, -63453848, }, - { 180852480, 46988552, 71499392, }, - { -49294412, 119185, -16876538, }, - { -128887672, -112254336, -14310831, }, - { 57196080, 112747184, 3730716, }, - { -46474768, -41647224, 7485055, }, - { 19670950, -6565932, 11464878, }, - { 32199906, -13280576, 9488120, }, - { -115142168, 14012331, -24771224, }, - { -8647380, 44480828, 6425271, }, - { 1937030, -11526618, -4697084, }, - { 24869472, 5836324, 8390219, }, - { -4409858, -42788076, -1603633, }, - { 28117540, 15736760, 7562364, }, - { 10062035, -60990148, 5612986, }, - { 31954556, 17682380, 2305324, } - }, - { - { -361012928, -107035952, 1838246, }, - { 339260544, 74138648, 23380192, }, - { -70194800, -31168040, -679679, }, - { -243166560, -1868311, -30283814, }, - { 153038816, -16125455, 30584462, }, - { -59203440, 6156299, -9015673, }, - { 35418448, 3013993, 2372970, }, - { -1691680, 25706990, 1106491, }, - { -87555056, -70230768, 971736, }, - { 10498511, 13577465, 12486544, }, - { 10082973, -18462454, -3297461, }, - { 1347009, 24953224, 4918812, }, - { -22036940, -12890807, -9094593, }, - { 35231080, 14661945, 5639829, }, - { -39492224, 21459268, -15654619, }, - { 33756296, 3649112, 6452652, } - }, - { - { -291765184, 31956168, 34410204, }, - { 375867072, -43094628, -22290880, }, - { -83209624, -4979478, 9856950, }, - { -254651840, 67848136, -1629403, }, - { 175750064, -61229052, 7963406, }, - { -38247220, 31672162, -2454574, }, - { 47128676, 67109, -594316, }, - { -50551764, -20916490, -6397891, }, - { -10248329, 29680372, 20811800, }, - { 12695386, -21452288, -1926293, }, - { 23096724, 7217156, 4312147, }, - { -41781980, -24153822, -5424007, }, - { -21937082, 11606612, 1177358, }, - { 24022288, -16567299, -4268661, }, - { -66468376, 30025580, -6706592, }, - { 13777718, -18653580, 1938641, } - }, - { - { -180420832, 15508053, 16914118, }, - { 315297312, 4876399, -22964654, }, - { -97981624, 13826037, 4172561, }, - { -176048032, -34457984, 18804440, }, - { 125448480, 36109936, -16757889, }, - { 3931506, -16374563, 7987029, }, - { 46259484, 3149285, -1439888, }, - { -84816480, -9487046, -4279935, }, - { 55625196, 20936354, 10554882, }, - { 4123706, 2500208, -8121783, }, - { 29963840, 9622337, 1771674, }, - { -77292232, -7432978, -4481262, }, - { -9511205, -2664490, 3375308, }, - { 4716948, -6528351, -3870839, }, - { -65016140, -18563922, 10410464, }, - { -17283486, 16813186, -5451387, } - }, - { - { -82274392, -4493610, -4998268, }, - { 215839824, -63351, -6945499, }, - { -107246944, -3540664, 659278, }, - { -69171520, 2429878, 10962367, }, - { 49844168, 5693516, -11807402, }, - { 41827076, -13609141, 1554241, }, - { 30812096, -4552129, -1991791, }, - { -88808648, 12234751, 4199405, }, - { 79944376, -20038170, -7359964, }, - { -6064494, 9715753, -3017752, }, - { 29600914, -4624069, -3562139, }, - { -86208584, 8352101, 3291556, }, - { 7969312, -1806034, 34360, }, - { -14738717, -891206, 2032593, }, - { -52577916, -17246978, 7355132, }, - { -40023188, 11195906, -3377992, } - }, - { - { -11520176, -16800838, -8475044, }, - { 121099824, 8950175, 2939905, }, - { -96168616, -3455301, 530965, }, - { 16582869, -2209761, -542240, }, - { -12630425, -2364380, 1235340, }, - { 61056720, 850404, -7627325, }, - { 3321620, 1947768, -172872, }, - { -70016016, 70867, 4503273, }, - { 71465032, -759672, -10794327, }, - { -14083735, -3701188, 3001109, }, - { 25223270, -6362994, -1888712, }, - { -66658428, -2034741, 3216931, }, - { 21100638, -2749316, -1918777, }, - { -33149632, 10821707, -206695, }, - { -39621612, 8810052, -4913980, }, - { -47799764, -4650376, 3549791, } - }, - { - { 42451456, 21299280, -1612760, }, - { 41670848, -17740900, 3934190, }, - { -48837536, 14950781, 521302, }, - { 65235720, -1077500, -5389647, }, - { -51329692, -3191161, 4767414, }, - { 53909892, 8493298, -3687766, }, - { -32504312, -6902013, 2399813, }, - { -41712184, 894964, -538482, }, - { 49881752, 9771587, -2830920, }, - { -21916682, -7760469, 2321967, }, - { 16160888, -1179505, 1459752, }, - { -23418310, 9116068, 65498, }, - { 22019224, 804770, -699543, }, - { -47476032, 4873714, -712428, }, - { -27396522, 13417478, -4742181, }, - { -48884780, -6140193, 2001455, } - }, - { - { 88989040, -11040213, 2617783, }, - { -27049704, 19992536, 533650, }, - { 37626060, -19404662, -939524, }, - { 90464360, -9076340, -4810900, }, - { -75970992, 7735236, 3192771, }, - { 12238509, 5801964, 3783329, }, - { -67951216, 8986682, 2831457, }, - { -14402636, -9207873, -1178969, }, - { 24434068, 2305861, 3216394, }, - { -29472066, 4461934, -941672, }, - { 1956895, 5533529, 1078574, }, - { 30696132, -7948374, -2563022, }, - { 5944235, 5713380, -133144, }, - { -58457188, -2496450, 4172024, }, - { -21294448, -10089415, 2979634, }, - { -49573588, -411780, -426812, } - }, - { - { 128727688, 3776350, 1412507, }, - { -85088672, -12749610, -1985349, }, - { 145171504, 23826868, -3697967, }, - { 111840408, 8870181, -1000191, }, - { -101389680, -9131637, 709207, }, - { -58888832, -21438330, 5841156, }, - { -87093344, -6423661, 1226213, }, - { 4442607, 5873905, 1722282, }, - { -4634270, -12062416, 2022393, }, - { -33332704, 2255395, -806917, }, - { -13388487, -5470178, -262530, }, - { 77616504, 11276437, -3949223, }, - { -24839944, -5436355, 712428, }, - { -68098856, -10958609, 2998961, }, - { -26676042, -6561100, 5107253, }, - { -54116588, -608275, 588947, } - }, - { - { 160432064, -3110093, -737124, }, - { -127650720, 4705674, -1635309, }, - { 241246704, -25421912, -2492155, }, - { 134621984, -2611877, -1050656, }, - { -131793216, 5808407, 472983, }, - { -134059888, 26525718, 2126546, }, - { -73410656, -4699231, -995896, }, - { 13879724, 1817308, 2222109, }, - { -35398048, 12080132, -1765232, }, - { -30884572, -4506495, 1458678, }, - { -24806658, 2606508, -1139777, }, - { 98636608, -8537858, -754304, }, - { -61230664, 6629282, 2826089, }, - { -69490424, 5415954, -2579665, }, - { -38364796, 12315282, 798864, }, - { -63967632, 4951561, 297963, } - }, - { - { 185763248, 4479114, -1353452, }, - { -153832304, 309238, 257698, }, - { 290788064, 7578470, 1229434, }, - { 153667488, 5258651, -2077154, }, - { -161042480, -5226439, 1700270, }, - { -176488800, -10183367, -3265249, }, - { -20143396, 18489298, -1172526, }, - { 22658100, -1901060, 338229, }, - { -62093952, -2499671, -2667712, }, - { -20965346, 1632625, 2285460, }, - { -30292404, -601295, -1700270, }, - { 77775952, -10266582, 1833414, }, - { -89274120, -9709847, 2138357, }, - { -54588496, 11563126, -2695629, }, - { -42026256, -3581466, -3647501, }, - { -75187160, -2548526, -672162, } - }, - { - { 208514224, -5304822, -991601, }, - { -169719920, 48318, 2152316, }, - { 275570464, 19114216, 161061, }, - { 159189200, -3106335, -143345, }, - { -178980944, 3876745, 1544578, }, - { -158604560, -22049288, -1932735, }, - { 61370252, -22639846, 114890, }, - { 43689480, -3373697, -1739462, }, - { -80673984, -3013993, 260382, }, - { -2893734, -114890, 209380, }, - { -34706020, -1522029, -1552631, }, - { 14364518, 24151138, -210453, }, - { -91525752, -1062468, -83752, }, - { -27262304, -13845901, 1780801, }, - { -25509422, -13974213, -2544231, }, - { -82675440, -2627446, 635118, } - }, - { - { 231195936, 5265630, -641561, }, - { -184304032, -5625334, 2100776, }, - { 208716624, -26603564, -4437238, }, - { 143026176, -9013526, 463856, }, - { -176169360, 4109210, 1348620, }, - { -83453896, 32672890, 5035849, }, - { 144423648, 14431627, -525060, }, - { 85177792, 13616120, -2009508, }, - { -92251600, 1479616, 3518652, }, - { 23432804, 5090610, -2103460, }, - { -48676476, 792421, 562641, }, - { -71161168, -19383724, -1622424, }, - { -57096760, 12967580, -226023, }, - { -279710, 5210332, 4049081, }, - { 10645613, 19659676, 3597035, }, - { -83698176, 1516124, 2621541, } - }, - { - { 253110480, -4453881, -644245, }, - { -202792784, 9002251, -316754, }, - { 126104536, 14142790, -4711579, }, - { 106415864, 15707232, -2575370, }, - { -149847648, -8284455, 1737314, }, - { 18028662, -17587892, 6094022, }, - { 199054016, -3391951, -3665755, }, - { 142919872, -15989626, -756988, }, - { -99546064, 6783901, 2951716, }, - { 53973244, -10205916, -1722819, }, - { -81119584, 5608154, 3808562, }, - { -147441392, 6831146, 2094333, }, - { 7497939, -16030429, -641561, }, - { 17021492, 5471789, 1440425, }, - { 55233280, -5935108, 5962489, }, - { -77189688, 3450469, 1087701, } - }, - { - { 271380192, 3393561, -754304, }, - { -225036960, -5210332, -2160369, }, - { 61864172, -3352759, -230854, }, - { 59377384, -7401840, -3531537, }, - { -106045960, 8349417, 395137, }, - { 111889800, 4412542, -1377611, }, - { 204785120, -613107, -4148939, }, - { 199535584, 8651675, -1597191, }, - { -102982040, -9226127, -2387465, }, - { 79090216, 8512088, 667331, }, - { -128752920, -15685757, 4660577, }, - { -186985152, -4001836, 5465883, }, - { 80273472, 16455093, -1806571, }, - { 26085484, -3606162, -2874944, }, - { 100301448, -5814849, -549756, }, - { -62251792, 960999, -2479270, } - }, - { - { 283445824, -2472291, -425739, }, - { -250145872, -394063, -347892, }, - { 31551366, 1824824, 2136746, }, - { 11241540, 1342177, 860067, }, - { -55291800, -12691628, -486942, }, - { 177572208, -8174934, -7242389, }, - { 157573760, 6961068, 1270774, }, - { 233900160, -4170950, -3251290, }, - { -101713416, -5664525, -4573604, }, - { 89047560, 841814, 1887638, }, - { -172231408, 18637474, 468688, }, - { -174405200, 2156074, 1228361, }, - { 133267464, -12697534, -599685, }, - { 36203888, -8750996, -2057826, }, - { 146519056, -4073240, -8343511, }, - { -41135048, -11688753, -1687385, } - }, - { - { 288816672, 65498, -69256, }, - { -279945440, -3285650, 3053185, }, - { 31862752, 1466195, 632971, }, - { -34104188, -8149164, 4543002, }, - { -9822053, 10109816, 583042, }, - { 205254336, 11177652, -4417374, }, - { 71791992, -27465242, 4102768, }, - { 229422656, -2577517, -2360085, }, - { -101560944, 13728326, 1846836, }, - { 82175608, -9631464, -331786, }, - { -185142624, -451508, -3894999, }, - { -109586088, 19167366, -4055523, }, - { 144640544, -3027415, 1314797, }, - { 52999360, 7438884, 1590212, }, - { 190781904, 21658446, -6819871, }, - { -23318988, 8011725, 2361158, } - }, - { - { 289866272, 1352915, -431107, }, - { -315025120, 12282533, 3040837, }, - { 47494284, -6703907, -4832, }, - { -71863928, 13118978, 2914672, }, - { 20838644, -2469606, 643708, }, - { 190062496, 3092377, 1194538, }, - { -19047644, 33006286, -2068027, }, - { 179018528, 16397111, -1230508, }, - { -115382688, 5246840, 7004018, }, - { 67956048, 5418638, -2936684, }, - { -153785056, -24093692, -775242, }, - { -14096620, -36050344, -586800, }, - { 111691696, 18995566, -474594, }, - { 75546328, -217433, 713501, }, - { 214077280, -14137959, 1343251, }, - { -18821620, 4057670, 3177739, } - }, - { - { 291103744, 370978, -772557, }, - { -348790528, -12458090, -287226, }, - { 58636504, 3210488, 1225139, }, - { -92223152, -5486821, -352187, }, - { 35514012, -2880313, -1367410, }, - { 136765712, -22014392, 1087701, }, - { -74584256, -4656819, -6522445, }, - { 90864864, -23682450, -1395328, }, - { -146371408, -21838298, 2491081, }, - { 59137940, 3469260, -1843615, }, - { -91215976, 23076860, 5398774, }, - { 71293232, 19409494, 4901632, }, - { 54820964, -17020418, -3295851, }, - { 101421896, 2614561, -2597918, }, - { 191872288, -16305306, 3377455, }, - { -27441620, -11033234, -479963, } - }, - { - { 296270592, -2617246, -364535, }, - { -370586944, 2314987, -2156074, }, - { 51345796, 5406827, 1508070, }, - { -86875376, -7421704, -424128, }, - { 40845676, -1283122, -2312840, }, - { 65692060, 21493626, -2470143, }, - { -77312632, -19687594, -1716913, }, - { -13135084, 21265456, -473520, }, - { -178148272, 11236171, -3562139, }, - { 60837676, -4228396, 497679, }, - { -25942676, -4966593, 4297115, }, - { 111659488, 8442832, 2335389, }, - { 3730716, 5009006, -2279554, }, - { 125576792, -7951595, -2874944, }, - { 119798984, 29526826, -1306744, }, - { -37692632, 1173600, -2627983, } - }, - { - { 306039520, 2916283, 55298, }, - { -375466048, 7729868, 229244, }, - { 26038776, -9740449, 701153, }, - { -57603564, 12832289, 1970853, }, - { 44336948, 3262028, -929324, }, - { 3132105, -10383083, -3685619, }, - { -45856828, 19236622, 5332739, }, - { -108694344, -19291920, 162672, }, - { -189576096, 8080444, -2288681, }, - { 69859256, 2285460, 953483, }, - { 23221814, 1700270, -803159, }, - { 101647920, -16965658, -4098473, }, - { -21590264, 2845953, 823560, }, - { 137975280, 4347581, -857920, }, - { 19513648, -26326002, -4456566, }, - { -37789808, 6197638, -426276, } - }, - { - { 318587776, -3032784, 149250, }, - { -369527168, -3953518, 2932926, }, - { -4318590, 9765682, -648003, }, - { -16476031, -8249022, 2439005, }, - { 49333604, -2521146, 493384, }, - { -34719440, -4065724, -518080, }, - { -16206522, 1155883, 5816460, }, - { -177921168, 8576513, 460635, }, - { -173933296, -13509820, 2663417, }, - { 79901960, 100932, -41876, }, - { 54387708, -3276523, -2781528, }, - { 61901216, 9036611, -5770826, }, - { -17591112, -6221797, 2840047, }, - { 128530120, 4281009, 378494, }, - { -77983184, 12730820, -2652679, }, - { -24894168, -6537477, 1983738, } - }, - { - { 331023328, 1572495, -158377, }, - { -363240416, -2485176, 2062658, }, - { -23373748, -2558727, -1784559, }, - { 23740432, 7432978, 1649268, }, - { 54683524, -3455838, -938450, }, - { -49672908, 3960497, 3744675, }, - { -12600360, -14341433, -257161, }, - { -215045792, 570157, 2612951, }, - { -140426640, 7584912, 4264903, }, - { 85427440, -1476932, -1599875, }, - { 74498896, 4804995, -2248952, }, - { 18589156, 258235, -1464047, }, - { 6771553, 3172370, 1788317, }, - { 94353992, -13314935, -484258, }, - { -151179632, -4474282, 2142115, }, - { -3787088, 1398012, 1156957, } - }, - { - { 341009120, -1515587, -616328, }, - { -361957824, 4287451, -532039, }, - { -22019224, -7435126, -636192, }, - { 56237228, -2128156, 529892, }, - { 57777512, -2005750, -2416993, }, - { -54333484, 2007360, 4508105, }, - { -34668440, 11482595, -5185100, }, - { -226664752, -2289755, 4807142, }, - { -102528920, -1979980, 1407676, }, - { 83640728, -810138, -1657857, }, - { 90878288, -4764193, -1228898, }, - { -12435004, 1063541, 3004867, }, - { 39201240, -5504001, -520765, }, - { 43192340, 13027173, -1552094, }, - { -195225056, 2522220, 5649493, }, - { 19146428, -3657165, -924492, } - }, - { - { 347595456, 1677185, -417686, }, - { -364211072, 656056, -1167694, }, - { -4296578, 10086731, 2272038, }, - { 82555176, 3663607, -807991, }, - { 54913304, 3373160, -198105, }, - { -57903676, -8464307, 1361505, }, - { -68560024, -1516124, -4011500, }, - { -222998464, -2698850, 3826816, }, - { -67095444, 6439230, -712428, }, - { 72852312, -1525250, -280247, }, - { 105808128, 4806069, -281857, }, - { -26526792, -4527433, 2848637, }, - { 68737728, 4700305, -1606855, }, - { -10790032, -9171366, -679679, }, - { -214334432, -5647345, 5347771, }, - { 39519068, 7033009, -117575, } - }, - { - { 350730784, -349503, -70867, }, - { -366636672, -1081258, 66572, }, - { 17701708, -3133716, 3336653, }, - { 108880104, -4415764, -1509681, }, - { 41920492, 3178813, 2012729, }, - { -59764468, 2437394, -1982664, }, - { -104399920, 922881, 396211, }, - { -208644144, -919123, 1145146, }, - { -34493956, -6276558, -525060, }, - { 52565568, 5551245, 316217, }, - { 117002960, -1362042, 101469, }, - { -23087060, 638876, 347892, }, - { 86126976, -3460133, -1624035, }, - { -55188184, 6024766, 777926, }, - { -210987040, 2057289, 2257542, }, - { 54660976, -2545305, 1357747, } - }, - { - { 351696096, -266288, -39192, }, - { -367900992, -301721, 442382, }, - { 34761856, -4679367, 199179, }, - { 138656576, 8657580, -1464047, }, - { 20651814, -10691784, 737661, }, - { -54502600, 6995965, -925565, }, - { -141045120, -5858873, 3105798, }, - { -183038080, 5861020, -58519, }, - { -2747169, 6265284, -612570, }, - { 25756382, -8061654, -273804, }, - { 122231008, -829466, -453119, }, - { -3658775, 5697811, -901406, }, - { 84907208, -1595044, -946503, }, - { -83002392, -2358474, 1876364, }, - { -183580864, 6935299, 32212, }, - { 66104380, -1711008, 297427, } - }, - { - { 352811168, 619549, -377957, }, - { -368510880, 630286, -12885, }, - { 47033648, -1253594, -2666638, }, - { 169054752, -8256001, -413391, }, - { 831613, 6984154, -2095944, }, - { -41806676, -5986648, 1675037, }, - { -178983632, 11828877, 2625836, }, - { -146943712, -10399190, 165356, }, - { 29367376, -6104759, -1154273, }, - { -1778117, 6456410, -1106491, }, - { 122834992, 752693, -854699, }, - { 26137024, -9786620, -279173, }, - { 62861140, 6782827, -481036, }, - { -93098784, 931471, 2050847, }, - { -133093520, -16054051, 366146, }, - { 79614200, -497142, -1923072, } - }, - { - { 356286336, 1079111, -706522, }, - { -370377568, 118112, -59056, }, - { 58491548, 7219303, -1080721, }, - { 192554656, 5204964, 554588, }, - { -7168301, 2298344, -2442763, }, - { -26358214, 807991, 1415729, }, - { -213923200, -11788075, -175557, }, - { -105548824, 10618233, 1021665, }, - { 59586228, 7743289, -1002338, }, - { -24626268, -2447058, -846109, }, - { 122507496, -52076, -792421, }, - { 56819732, 8184060, 1071058, }, - { 23933706, -11563663, -741956, }, - { -88090856, 888521, 1012002, }, - { -67978592, 17484812, 1989107, }, - { 99579352, 7204271, -2246268, } - }, - { - { 362722880, -2591476, -450435, }, - { -375905728, 1128503, 363998, }, - { 69048576, -3528316, 1149441, }, - { 203336096, 1549946, 347892, }, - { -2265595, -6801618, -430034, }, - { -12047383, -350577, -466541, }, - { -237117088, 1186485, -1096290, }, - { -67009008, -7736847, 1520955, }, - { 82461224, -4238059, -362388, }, - { -41384696, 653372, 377420, }, - { 124182536, 389231, -1152662, }, - { 79066592, -1724966, 1180042, }, - { -22692460, 11189464, -1503239, }, - { -71790912, -5228586, 567473, }, - { -1692217, -11481521, 1993939, }, - { 123079264, -8227547, -708133, } - }, - { - { 370373824, 2542084, 98247, }, - { -386556192, -3310883, 375273, }, - { 76104136, -1887638, 447750, }, - { 202242496, -3654480, -919660, }, - { 5905580, 2692945, 868657, }, - { -347355, 2221035, -1225676, }, - { -243896160, 5133023, 1224603, }, - { -37273872, 2496987, 845035, }, - { 92828200, 244813, -382252, }, - { -54846732, -2807835, 863288, }, - { 127560528, 631360, -1960116, }, - { 89395984, -3245922, -675384, }, - { -66122096, -5112622, -521839, }, - { -49948860, 4191888, 396211, }, - { 54602992, 4352413, -951335, }, - { 140605952, 3172907, 141197, } - }, - { - { 376587552, -702764, 275415, }, - { -401500000, 3802657, 158377, }, - { 78745008, 1107565, -1109712, }, - { 196230608, 2150168, -1660542, }, - { 5272073, 1649804, 909459, }, - { 8028368, -2726767, -667331, }, - { -238401280, -2830920, 2775623, }, - { -16224239, -919660, -752693, }, - { 89822800, 3003256, -701690, }, - { -68125696, 3136937, 624381, }, - { 128559648, -3267933, -1184337, }, - { 91821032, 606664, -2059974, }, - { -99711960, 4389457, 1236414, }, - { -28915330, -4508642, -1611, }, - { 96751120, -6563247, -3388192, }, - { 143558752, 1979980, -37581, } - }, - { - { 379933888, -866510, -223875, }, - { -418189152, -3509525, 179315, }, - { 78002512, 1551557, -689342, }, - { 193020128, 2717641, -788663, }, - { -10403485, -8171712, 40802, }, - { 11798812, 491774, -142808, }, - { -228333888, -441308, 1696512, }, - { 1134408, 3786014, -1302986, }, - { 77307264, -3585761, -798327, }, - { -82289424, -4401805, 170725, }, - { 120315992, -1399623, 513785, }, - { 92718680, 3023120, -1060320, }, - { -122189136, -4933307, 1023276, }, - { -13180181, 3692598, 535797, }, - { 124550296, 8669928, -1908576, }, - { 130201936, -6466610, -628139, } - }, - { - { 381073120, 535260, -813359, }, - { -433806208, 2840047, 312996, }, - { 75059384, 233539, 439160, }, - { 196453952, -3342558, 932545, }, - { -38315940, 9525164, -1642825, }, - { 9557376, 1625108, -333397, }, - { -218855968, -242129, 93952, }, - { 18570902, -4182761, -1089848, }, - { 61713312, 3343632, -601295, }, - { -96362960, 3289945, -426812, }, - { 98379448, 8465381, 415001, }, - { 95044944, -1895691, 373662, }, - { -134432480, 727460, 594853, }, - { -4395362, 85362, 781684, }, - { 136693232, -743029, -285615, }, - { 106566728, 7488276, -1481227, } - }, - { - { 381620192, 1278290, -573915, }, - { -446254624, -1850594, 471373, }, - { 70897024, -4185983, -520228, }, - { 205557136, -587337, 381715, }, - { -69342248, -4027606, -1483374, }, - { 1697049, -411780, 237834, }, - { -210835120, 3384971, 437550, }, - { 35998804, 6389301, -175557, }, - { 48716740, -2058900, -534723, }, - { -108493024, -300648, 104690, }, - { 65671124, -11233487, -1360968, }, - { 97958544, -1491427, -138513, }, - { -139136000, 694174, 1178432, }, - { 346282, -1947231, -251792, }, - { 133537512, -3973382, -887985, }, - { 82236816, -4588099, -1869921, } - }, - { - { 382351936, -1075352, 183073, }, - { -454615840, 816581, 748398, }, - { 66729832, 1833414, -2317672, }, - { 218169312, -1402844, -1505386, }, - { -96211024, 1338419, 772020, }, - { -9361418, 2212982, 1392106, }, - { -202981232, -1261110, 1223529, }, - { 50014896, -2319819, 700617, }, - { 41347652, -806380, 40802, }, - { -118474528, 668404, 1267552, }, - { 30713312, 5957120, -1932198, }, - { 99469296, 617938, -1403381, }, - { -139440944, -980863, 1854889, }, - { 6510634, 270583, -1832340, }, - { 119157424, 5541045, -1895691, }, - { 63735704, -129923, -788127, } - }, - { - { 383144384, -444529, 292595, }, - { -459259776, -1583769, 524523, }, - { 62185756, 3074660, -1435593, }, - { 231434320, 4502200, -1624035, }, - { -117318104, -4323959, 1771674, }, - { -19376208, -4671851, 766652, }, - { -192852624, 653909, 485331, }, - { 57789860, -828929, 118112, }, - { 38961260, -403727, 383863, }, - { -127578784, -3790846, 962073, }, - { 832687, -1974611, -172872, }, - { 97513472, 1676111, -812823, }, - { -137204880, -2003065, 1231045, }, - { 17623324, 6783901, -1333587, }, - { 99434400, -2160369, -1452236, }, - { 50520088, -871342, 569620, } - }, - { - { 384296480, 776852, -302795, }, - { -460956832, 68719, 89121, }, - { 53318796, 558883, 696322, }, - { 240763520, -4166118, -34360, }, - { -133587440, 4829691, 685584, }, - { -22540526, 171262, -424665, }, - { -177651120, -3570192, -296353, }, - { 61066920, 1590749, -952409, }, - { 39507256, -175557, 85362, }, - { -136151008, 2514167, -131533, }, - { -22209812, 2669859, 1468342, }, - { 89513024, 2073932, 286152, }, - { -132348344, -680752, -26307, }, - { 31038654, -5706401, 867047, }, - { 79264160, 2407866, 130997, }, - { 37860672, 2688113, 896574, } - }, - { - { 386752128, 849867, -627065, }, - { -460907424, 860067, 301185, }, - { 36146980, -8155069, 146566, }, - { 241739008, -2721936, 404264, }, - { -145550544, -1211181, 214212, }, - { -15294379, 6343130, 619549, }, - { -156943472, 6531572, 106837, }, - { 64532956, 837519, -1495186, }, - { 41670848, 206695, -30602, }, - { -143601152, 547071, 244276, }, - { -40169756, -4733591, 1357210, }, - { 74599288, -5961415, -316754, }, - { -124122408, 5115306, 801011, }, - { 40080636, -530965, 1106491, }, - { 61127048, -4632122, 347892, }, - { 22113176, -5246840, 465467, } - }, - { - { 391063200, -2029909, -237297, }, - { -461126464, -344134, 667331, }, - { 11589969, 8358007, -1996086, }, - { 233550128, 6007586, -1385127, }, - { -153602528, -243739, 1096290, }, - { 543313, -5778342, 2461016, }, - { -133317392, -5993627, 959925, }, - { 72045928, -3372086, -1061931, }, - { 44400300, 733903, -638876, }, - { -149664576, -162135, 1471563, }, - { -55261732, 5041755, -13422, }, - { 55586004, 4656282, -1148367, }, - { -113788176, -3487514, 2371896, }, - { 41438380, 2802466, -167504, }, - { 46727632, 3631932, -506269, }, - { 2968896, 5842230, -533113, } - }, - { - { 396734720, 1250372, 73014, }, - { -462726880, 500364, 1276142, }, - { -15785079, -1756105, -1324997, }, - { 219574304, -1741072, -1924145, }, - { -157631744, -1241782, 1465658, }, - { 20402168, 221191, 1504849, }, - { -110699560, 1782411, 261993, }, - { 83441016, 3263102, -599148, }, - { 47146928, 1730335, -814970, }, - { -153455424, -3345243, 1052267, }, - { -68853160, -576599, -130460, }, - { 36815924, -1578401, -375810, }, - { -102973992, -1618129, 1462436, }, - { 36476084, -3029563, -1205275, }, - { 36621576, -526134, -565325, }, - { -16523813, -1292248, -19327, } - }, - { - { 402814240, 31139, -442919, }, - { -465080000, 938987, 1842541, }, - { -41941968, -2105071, 3216394, }, - { 203479440, -2962454, 1204202, }, - { -157027232, 5337034, -1045288, }, - { 40497784, 2864743, -2887292, }, - { -91681984, -1256815, -1701344, }, - { 95501816, -3160022, -364535, }, - { 49006112, -3105798, 643171, }, - { -153419984, 6674916, -2768107, }, - { -82031728, -2663954, 2726767, }, - { 21534966, 1419487, 1041530, }, - { -92152280, 4112968, -2525978, }, - { 28469190, -468688, -843424, }, - { 29191282, -1108102, 650151, }, - { -33352032, 449361, 2191507, } - }, - { - { 408395008, 100395, -1385127, }, - { -466746432, -2885144, 1062468, }, - { -63879048, -1842541, 7820599, }, - { 187858656, 2120103, 6287832, }, - { -152399936, -4620848, -6424198, }, - { 57353384, 2039036, -6954089, }, - { -77235864, 4152697, -2153926, }, - { 105173008, 2572686, 300648, }, - { 49308908, 1588601, 2649995, }, - { -149810064, -3342022, -8390219, }, - { -95026152, 714038, 6820408, }, - { 11529840, -3498251, 875100, }, - { -82806432, 520228, -6441377, }, - { 19945828, 4118337, 2282238, }, - { 22079354, 539555, 2406256, }, - { -46061912, -2879239, 3273302, } - }, + {5789, 9287, 3279}, + {-7397, 9224, -1369}, + {362, 1834, -51}, + {772, 3, -6}, + {-645, 591, 251}, + {-221, 72, -276}, + {-824, 956, 286}, + {-224, 1324, -323}, + {-608, 399, 855}, + {-821, 1291, 324}, + {75, -125, 22}, + {-161, 845, 53}, + {-63, -384, -52}, + {127, -698, 169}, + {233, -56, -21}, + {-92, 17, 30} + }, + { + {183, -8343, -2166}, + {-2343, 13427, -1526}, + {55, 1267, -140}, + {74, 396, 420}, + {-343, -942, -402}, + {-343, -404, -374}, + {-819, -1862, -878}, + {164, 3444, 442}, + {-1550, -6669, -1693}, + {-638, -1450, -951}, + {-47, -256, 13}, + {-339, -1717, -1154}, + {-144, 48, 158}, + {71, -930, 116}, + {166, 1198, 574}, + {-92, -99, -4} + }, + { + {-3152, -3378, -3132}, + {4570, -3870, 4147}, + {-43, 1118, 12}, + {-721, 1764, 98}, + {374, -1997, -135}, + {-125, -1719, 263}, + {144, -4569, 97}, + {249, 2954, 622}, + {-622, -8703, -880}, + {875, -6651, 1083}, + {-69, -809, 329}, + {538, -6625, 935}, + {-333, 421, 49}, + {7, -807, 91}, + {-310, 2800, -78}, + {-233, 815, -437} + }, + { + {-1031, 8383, 1023}, + {2690, -17875, -1776}, + {150, 1068, -51}, + {-305, 1339, -13}, + {339, -1534, -197}, + {-14, -1941, 25}, + {426, -5041, -390}, + {-134, 895, -159}, + {661, -7305, -923}, + {505, -11610, -1337}, + {-34, -556, 411}, + {449, -7517, 548}, + {-350, -115, -170}, + {-34, -515, 134}, + {-467, 1164, -768}, + {-125, 1907, 41} + }, + { + {1880, 1139, 2800}, + {-1738, -10714, -3049}, + {531, 392, 56}, + {798, 2294, -874}, + {-142, -4128, 1167}, + {72, -1971, -5}, + {420, -5314, -106}, + {-79, 1013, -124}, + {1604, -10504, 250}, + {-186, -9135, -2345}, + {-77, 274, -7}, + {-217, -2730, -1526}, + {-121, 193, -353}, + {-88, -566, 188}, + {174, 192, -359}, + {89, 508, 715} + }, + { + {1092, -1474, 1578}, + {-3745, -7583, -383}, + {501, 909, 173}, + {1718, 5529, -60}, + {-1191, -6639, 637}, + {-80, -1335, 364}, + {427, -3530, 912}, + {255, 565, -440}, + {1336, -5402, 2750}, + {-73, -3686, 451}, + {-14, 295, -19}, + {280, -364, -440}, + {278, 1157, -71}, + {-108, -1411, -77}, + {973, 1757, 80}, + {93, -969, 52} + }, + { + {-4073, 7572, -734}, + {-1511, -9447, -516}, + {-304, 1937, -3}, + {394, 3150, 1245}, + {-1204, -1830, -1398}, + {-744, -859, 231}, + {71, -1444, -46}, + {953, -1106, 58}, + {-1849, 2973, -226}, + {-838, -936, -598}, + {38, 155, 48}, + {603, -1153, -216}, + {413, 32, 367}, + {193, -1148, -283}, + {1301, -83, 692}, + {451, -521, -241} + }, + { + {-9646, 1146, -1936}, + {5519, 1434, 2182}, + {-1504, 4, -515}, + {-3933, -3426, -437}, + {1745, 3441, 114}, + {-1418, -1271, 228}, + {600, -200, 350}, + {983, -405, 290}, + {-3514, 428, -756}, + {-264, 1357, 196}, + {59, -352, -143}, + {759, 178, 256}, + {-135, -1306, -49}, + {858, 480, 231}, + {307, -1861, 171}, + {975, 540, 70} + }, + { + {-11017, -3266, 56}, + {10353, 2263, 714}, + {-2142, -951, -21}, + {-7421, -57, -924}, + {4670, -492, 933}, + {-1807, 188, -275}, + {1081, 92, 72}, + {-52, 785, 34}, + {-2672, -2143, 30}, + {320, 414, 381}, + {308, -563, -101}, + {41, 762, 150}, + {-673, -393, -278}, + {1075, 447, 172}, + {-1205, 655, -478}, + {1030, 111, 197} + }, + { + {-8904, 975, 1050}, + {11471, -1315, -680}, + {-2539, -152, 301}, + {-7771, 2071, -50}, + {5363, -1869, 243}, + {-1167, 967, -75}, + {1438, 2, -18}, + {-1543, -638, -195}, + {-313, 906, 635}, + {387, -655, -59}, + {705, 220, 132}, + {-1275, -737, -166}, + {-669, 354, 36}, + {733, -506, -130}, + {-2028, 916, -205}, + {420, -569, 59} + }, + { + {-5506, 473, 516}, + {9622, 149, -701}, + {-2990, 422, 127}, + {-5373, -1052, 574}, + {3828, 1102, -511}, + {120, -500, 244}, + {1412, 96, -44}, + {-2588, -290, -131}, + {1698, 639, 322}, + {126, 76, -248}, + {914, 294, 54}, + {-2359, -227, -137}, + {-290, -81, 103}, + {144, -199, -118}, + {-1984, -567, 318}, + {-527, 513, -166} + }, + { + {-2511, -137, -153}, + {6587, -2, -212}, + {-3273, -108, 20}, + {-2111, 74, 335}, + {1521, 174, -360}, + {1276, -415, 47}, + {940, -139, -61}, + {-2710, 373, 128}, + {2440, -612, -225}, + {-185, 297, -92}, + {903, -141, -109}, + {-2631, 255, 100}, + {243, -55, 1}, + {-450, -27, 62}, + {-1605, -526, 224}, + {-1221, 342, -103} + }, + { + {-352, -513, -259}, + {3696, 273, 90}, + {-2935, -105, 16}, + {506, -67, -17}, + {-385, -72, 38}, + {1863, 26, -233}, + {101, 59, -5}, + {-2137, 2, 137}, + {2181, -23, -329}, + {-430, -113, 92}, + {770, -194, -58}, + {-2034, -62, 98}, + {644, -84, -59}, + {-1012, 330, -6}, + {-1209, 269, -150}, + {-1459, -142, 108} + }, + { + {1296, 650, -49}, + {1272, -541, 120}, + {-1490, 456, 16}, + {1991, -33, -164}, + {-1566, -97, 145}, + {1645, 259, -113}, + {-992, -211, 73}, + {-1273, 27, -16}, + {1522, 298, -86}, + {-669, -237, 71}, + {493, -36, 45}, + {-715, 278, 2}, + {672, 25, -21}, + {-1449, 149, -22}, + {-836, 409, -145}, + {-1492, -187, 61} + }, + { + {2716, -337, 80}, + {-825, 610, 16}, + {1148, -592, -29}, + {2761, -277, -147}, + {-2318, 236, 97}, + {373, 177, 115}, + {-2074, 274, 86}, + {-440, -281, -36}, + {746, 70, 98}, + {-899, 136, -29}, + {60, 169, 33}, + {937, -243, -78}, + {181, 174, -4}, + {-1784, -76, 127}, + {-650, -308, 91}, + {-1513, -13, -13} + }, + { + {3928, 115, 43}, + {-2597, -389, -61}, + {4430, 727, -113}, + {3413, 271, -31}, + {-3094, -279, 22}, + {-1797, -654, 178}, + {-2658, -196, 37}, + {136, 179, 53}, + {-141, -368, 62}, + {-1017, 69, -25}, + {-409, -167, -8}, + {2369, 344, -121}, + {-758, -166, 22}, + {-2078, -334, 92}, + {-814, -200, 156}, + {-1652, -19, 18} + }, + { + {4896, -95, -22}, + {-3896, 144, -50}, + {7362, -776, -76}, + {4108, -80, -32}, + {-4022, 177, 14}, + {-4091, 809, 65}, + {-2240, -143, -30}, + {424, 55, 68}, + {-1080, 369, -54}, + {-943, -138, 45}, + {-757, 80, -35}, + {3010, -261, -23}, + {-1869, 202, 86}, + {-2121, 165, -79}, + {-1171, 376, 24}, + {-1952, 151, 9} + }, + { + {5669, 137, -41}, + {-4695, 9, 8}, + {8874, 231, 38}, + {4690, 160, -63}, + {-4915, -160, 52}, + {-5386, -311, -100}, + {-615, 564, -36}, + {691, -58, 10}, + {-1895, -76, -81}, + {-640, 50, 70}, + {-924, -18, -52}, + {2374, -313, 56}, + {-2724, -296, 65}, + {-1666, 353, -82}, + {-1283, -109, -111}, + {-2295, -78, -21} + }, + { + {6363, -162, -30}, + {-5179, 1, 66}, + {8410, 583, 5}, + {4858, -95, -4}, + {-5462, 118, 47}, + {-4840, -673, -59}, + {1873, -691, 4}, + {1333, -103, -53}, + {-2462, -92, 8}, + {-88, -4, 6}, + {-1059, -46, -47}, + {438, 737, -6}, + {-2793, -32, -3}, + {-832, -423, 54}, + {-778, -426, -78}, + {-2523, -80, 19} + }, + { + {7056, 161, -20}, + {-5625, -172, 64}, + {6370, -812, -135}, + {4365, -275, 14}, + {-5376, 125, 41}, + {-2547, 997, 154}, + {4407, 440, -16}, + {2599, 416, -61}, + {-2815, 45, 107}, + {715, 155, -64}, + {-1485, 24, 17}, + {-2172, -592, -50}, + {-1742, 396, -7}, + {-9, 159, 124}, + {325, 600, 110}, + {-2554, 46, 80} + }, + { + {7724, -136, -20}, + {-6189, 275, -10}, + {3848, 432, -144}, + {3248, 479, -79}, + {-4573, -253, 53}, + {550, -537, 186}, + {6075, -104, -112}, + {4362, -488, -23}, + {-3038, 207, 90}, + {1647, -311, -53}, + {-2476, 171, 116}, + {-4500, 208, 64}, + {229, -489, -20}, + {519, 167, 44}, + {1686, -181, 182}, + {-2356, 105, 33} + }, + { + {8282, 104, -23}, + {-6868, -159, -66}, + {1888, -102, -7}, + {1812, -226, -108}, + {-3236, 255, 12}, + {3415, 135, -42}, + {6250, -19, -127}, + {6089, 264, -49}, + {-3143, -282, -73}, + {2414, 260, 20}, + {-3929, -479, 142}, + {-5706, -122, 167}, + {2450, 502, -55}, + {796, -110, -88}, + {3061, -177, -17}, + {-1900, 29, -76} + }, + { + {8650, -75, -13}, + {-7634, -12, -11}, + {963, 56, 65}, + {343, 41, 26}, + {-1687, -387, -15}, + {5419, -249, -221}, + {4809, 212, 39}, + {7138, -127, -99}, + {-3104, -173, -140}, + {2718, 26, 58}, + {-5256, 569, 14}, + {-5322, 66, 37}, + {4067, -387, -18}, + {1105, -267, -63}, + {4471, -124, -255}, + {-1255, -357, -51} + }, + { + {8814, 2, -2}, + {-8543, -100, 93}, + {972, 45, 19}, + {-1041, -249, 139}, + {-300, 309, 18}, + {6264, 341, -135}, + {2191, -838, 125}, + {7001, -79, -72}, + {-3099, 419, 56}, + {2508, -294, -10}, + {-5650, -14, -119}, + {-3344, 585, -124}, + {4414, -92, 40}, + {1617, 227, 49}, + {5822, 661, -208}, + {-712, 245, 72} + }, + { + {8846, 41, -13}, + {-9614, 375, 93}, + {1449, -205, 0}, + {-2193, 400, 89}, + {636, -75, 20}, + {5800, 94, 36}, + {-581, 1007, -63}, + {5463, 500, -38}, + {-3521, 160, 214}, + {2074, 165, -90}, + {-4693, -735, -24}, + {-430, -1100, -18}, + {3409, 580, -14}, + {2305, -7, 22}, + {6533, -431, 41}, + {-574, 124, 97} + }, + { + {8884, 11, -24}, + {-10644, -380, -9}, + {1789, 98, 37}, + {-2814, -167, -11}, + {1084, -88, -42}, + {4174, -672, 33}, + {-2276, -142, -199}, + {2773, -723, -43}, + {-4467, -666, 76}, + {1805, 106, -56}, + {-2784, 704, 165}, + {2176, 592, 150}, + {1673, -519, -101}, + {3095, 80, -79}, + {5855, -498, 103}, + {-837, -337, -15} + }, + { + {9041, -80, -11}, + {-11309, 71, -66}, + {1567, 165, 46}, + {-2651, -226, -13}, + {1247, -39, -71}, + {2005, 656, -75}, + {-2359, -601, -52}, + {-401, 649, -14}, + {-5437, 343, -109}, + {1857, -129, 15}, + {-792, -152, 131}, + {3408, 258, 71}, + {114, 153, -70}, + {3832, -243, -88}, + {3656, 901, -40}, + {-1150, 36, -80} + }, + { + {9340, 89, 2}, + {-11458, 236, 7}, + {795, -297, 21}, + {-1758, 392, 60}, + {1353, 100, -28}, + {96, -317, -112}, + {-1399, 587, 163}, + {-3317, -589, 5}, + {-5785, 247, -70}, + {2132, 70, 29}, + {709, 52, -25}, + {3102, -518, -125}, + {-659, 87, 25}, + {4211, 133, -26}, + {596, -803, -136}, + {-1153, 189, -13} + }, + { + {9723, -93, 5}, + {-11277, -121, 90}, + {-132, 298, -20}, + {-503, -252, 74}, + {1506, -77, 15}, + {-1060, -124, -16}, + {-495, 35, 177}, + {-5430, 262, 14}, + {-5308, -412, 81}, + {2438, 3, -1}, + {1660, -100, -85}, + {1889, 276, -176}, + {-537, -190, 87}, + {3922, 131, 12}, + {-2380, 389, -81}, + {-760, -200, 61} + }, + { + {10102, 48, -5}, + {-11085, -76, 63}, + {-713, -78, -54}, + {725, 227, 50}, + {1669, -105, -29}, + {-1516, 121, 114}, + {-385, -438, -8}, + {-6563, 17, 80}, + {-4285, 231, 130}, + {2607, -45, -49}, + {2274, 147, -69}, + {567, 8, -45}, + {207, 97, 55}, + {2879, -406, -15}, + {-4614, -137, 65}, + {-116, 43, 35} + }, + { + {10407, -46, -19}, + {-11046, 131, -16}, + {-672, -227, -19}, + {1716, -65, 16}, + {1763, -61, -74}, + {-1658, 61, 138}, + {-1058, 350, -158}, + {-6917, -70, 147}, + {-3129, -60, 43}, + {2553, -25, -51}, + {2773, -145, -38}, + {-379, 32, 92}, + {1196, -168, -16}, + {1318, 398, -47}, + {-5958, 77, 172}, + {584, -112, -28} + }, + { + {10608, 51, -13}, + {-11115, 20, -36}, + {-131, 308, 69}, + {2519, 112, -25}, + {1676, 103, -6}, + {-1767, -258, 42}, + {-2092, -46, -122}, + {-6805, -82, 117}, + {-2048, 197, -22}, + {2223, -47, -9}, + {3229, 147, -9}, + {-810, -138, 87}, + {2098, 143, -49}, + {-329, -280, -21}, + {-6541, -172, 163}, + {1206, 215, -4} + }, + { + {10703, -11, -2}, + {-11189, -33, 2}, + {540, -96, 102}, + {3323, -135, -46}, + {1279, 97, 61}, + {-1824, 74, -61}, + {-3186, 28, 12}, + {-6367, -28, 35}, + {-1053, -192, -16}, + {1604, 169, 10}, + {3571, -42, 3}, + {-705, 19, 11}, + {2628, -106, -50}, + {-1684, 184, 24}, + {-6439, 63, 69}, + {1668, -78, 41} + }, + { + {10733, -8, -1}, + {-11227, -9, 14}, + {1061, -143, 6}, + {4231, 264, -45}, + {630, -326, 23}, + {-1663, 213, -28}, + {-4304, -179, 95}, + {-5586, 179, -2}, + {-84, 191, -19}, + {786, -246, -8}, + {3730, -25, -14}, + {-112, 174, -28}, + {2591, -49, -29}, + {-2533, -72, 57}, + {-5602, 212, 1}, + {2017, -52, 9} + }, + { + {10767, 19, -12}, + {-11246, 19, 0}, + {1435, -38, -81}, + {5159, -252, -13}, + {25, 213, -64}, + {-1276, -183, 51}, + {-5462, 361, 80}, + {-4484, -317, 5}, + {896, -186, -35}, + {-54, 197, -34}, + {3749, 23, -26}, + {798, -299, -9}, + {1918, 207, -15}, + {-2841, 28, 63}, + {-4062, -490, 11}, + {2430, -15, -59} + }, + { + {10873, 33, -22}, + {-11303, 4, -2}, + {1785, 220, -33}, + {5876, 159, 17}, + {-219, 70, -75}, + {-804, 25, 43}, + {-6528, -360, -5}, + {-3221, 324, 31}, + {1818, 236, -31}, + {-752, -75, -26}, + {3739, -2, -24}, + {1734, 250, 33}, + {730, -353, -23}, + {-2688, 27, 31}, + {-2075, 534, 61}, + {3039, 220, -69} + }, + { + {11069, -79, -14}, + {-11472, 34, 11}, + {2107, -108, 35}, + {6205, 47, 11}, + {-69, -208, -13}, + {-368, -11, -14}, + {-7236, 36, -33}, + {-2045, -236, 46}, + {2517, -129, -11}, + {-1263, 20, 12}, + {3790, 12, -35}, + {2413, -53, 36}, + {-693, 341, -46}, + {-2191, -160, 17}, + {-52, -350, 61}, + {3756, -251, -22} + }, + { + {11303, 78, 3}, + {-11797, -101, 11}, + {2323, -58, 14}, + {6172, -112, -28}, + {180, 82, 27}, + {-11, 68, -37}, + {-7443, 157, 37}, + {-1138, 76, 26}, + {2833, 7, -12}, + {-1674, -86, 26}, + {3893, 19, -60}, + {2728, -99, -21}, + {-2018, -156, -16}, + {-1524, 128, 12}, + {1666, 133, -29}, + {4291, 97, 4} + }, + { + {11493, -21, 8}, + {-12253, 116, 5}, + {2403, 34, -34}, + {5988, 66, -51}, + {161, 50, 28}, + {245, -83, -20}, + {-7275, -86, 85}, + {-495, -28, -23}, + {2741, 92, -21}, + {-2079, 96, 19}, + {3923, -100, -36}, + {2802, 19, -63}, + {-3043, 134, 38}, + {-882, -138, 0}, + {2953, -200, -103}, + {4381, 60, -1} + }, + { + {11595, -26, -7}, + {-12762, -107, 5}, + {2380, 47, -21}, + {5890, 83, -24}, + {-317, -249, 1}, + {360, 15, -4}, + {-6968, -13, 52}, + {35, 116, -40}, + {2359, -109, -24}, + {-2511, -134, 5}, + {3672, -43, 16}, + {2830, 92, -32}, + {-3729, -151, 31}, + {-402, 113, 16}, + {3801, 265, -58}, + {3973, -197, -19} + }, + { + {11629, 16, -25}, + {-13239, 87, 10}, + {2291, 7, 13}, + {5995, -102, 28}, + {-1169, 291, -50}, + {292, 50, -10}, + {-6679, -7, 3}, + {567, -128, -33}, + {1883, 102, -18}, + {-2941, 100, -13}, + {3002, 258, 13}, + {2901, -58, 11}, + {-4103, 22, 18}, + {-134, 3, 24}, + {4172, -23, -9}, + {3252, 229, -45} + }, + { + {11646, 39, -18}, + {-13619, -56, 14}, + {2164, -128, -16}, + {6273, -18, 12}, + {-2116, -123, -45}, + {52, -13, 7}, + {-6434, 103, 13}, + {1099, 195, -5}, + {1487, -63, -16}, + {-3311, -9, 3}, + {2004, -343, -42}, + {2989, -46, -4}, + {-4246, 21, 36}, + {11, -59, -8}, + {4075, -121, -27}, + {2510, -140, -57} + }, + { + {11668, -33, 6}, + {-13874, 25, 23}, + {2036, 56, -71}, + {6658, -43, -46}, + {-2936, 41, 24}, + {-286, 68, 42}, + {-6194, -38, 37}, + {1526, -71, 21}, + {1262, -25, 1}, + {-3616, 20, 39}, + {937, 182, -59}, + {3036, 19, -43}, + {-4255, -30, 57}, + {199, 8, -56}, + {3636, 169, -58}, + {1945, -4, -24} + }, + { + {11693, -14, 9}, + {-14015, -48, 16}, + {1898, 94, -44}, + {7063, 137, -50}, + {-3580, -132, 54}, + {-591, -143, 23}, + {-5885, 20, 15}, + {1764, -25, 4}, + {1189, -12, 12}, + {-3893, -116, 29}, + {25, -60, -5}, + {2976, 51, -25}, + {-4187, -61, 38}, + {538, 207, -41}, + {3034, -66, -44}, + {1542, -27, 17} + }, + { + {11728, 24, -9}, + {-14067, 2, 3}, + {1627, 17, 21}, + {7348, -127, -1}, + {-4077, 147, 21}, + {-688, 5, -13}, + {-5421, -109, -9}, + {1864, 49, -29}, + {1206, -5, 3}, + {-4155, 77, -4}, + {-678, 81, 45}, + {2732, 63, 9}, + {-4039, -21, -1}, + {947, -174, 26}, + {2419, 73, 4}, + {1155, 82, 27} + }, + { + {11803, 26, -19}, + {-14066, 26, 9}, + {1103, -249, 4}, + {7377, -83, 12}, + {-4442, -37, 7}, + {-467, 194, 19}, + {-4790, 199, 3}, + {1969, 26, -46}, + {1272, 6, -1}, + {-4382, 17, 7}, + {-1226, -144, 41}, + {2277, -182, -10}, + {-3788, 156, 24}, + {1223, -16, 34}, + {1865, -141, 11}, + {675, -160, 14} + }, + { + {11934, -62, -7}, + {-14072, -10, 20}, + {354, 255, -61}, + {7127, 183, -42}, + {-4688, -7, 33}, + {17, -176, 75}, + {-4069, -183, 29}, + {2199, -103, -32}, + {1355, 22, -20}, + {-4567, -5, 45}, + {-1686, 154, 0}, + {1696, 142, -35}, + {-3473, -106, 72}, + {1265, 86, -5}, + {1426, 111, -15}, + {91, 178, -16} + }, + { + {12107, 38, 2}, + {-14121, 15, 39}, + {-482, -54, -40}, + {6701, -53, -59}, + {-4811, -38, 45}, + {623, 7, 46}, + {-3378, 54, 8}, + {2546, 100, -18}, + {1439, 53, -25}, + {-4683, -102, 32}, + {-2101, -18, -4}, + {1124, -48, -11}, + {-3143, -49, 45}, + {1113, -92, -37}, + {1118, -16, -17}, + {-504, -39, -1} + }, + { + {12293, 1, -14}, + {-14193, 29, 56}, + {-1280, -64, 98}, + {6210, -90, 37}, + {-4792, 163, -32}, + {1236, 87, -88}, + {-2798, -38, -52}, + {2914, -96, -11}, + {1496, -95, 20}, + {-4682, 204, -84}, + {-2503, -81, 83}, + {657, 43, 32}, + {-2812, 126, -77}, + {869, -14, -26}, + {891, -34, 20}, + {-1018, 14, 67} + }, + { + {12463, 3, -42}, + {-14244, -88, 32}, + {-1949, -56, 239}, + {5733, 65, 192}, + {-4651, -141, -196}, + {1750, 62, -212}, + {-2357, 127, -66}, + {3210, 79, 9}, + {1505, 48, 81}, + {-4572, -102, -256}, + {-2900, 22, 208}, + {352, -107, 27}, + {-2527, 16, -197}, + {609, 126, 70}, + {674, 16, 73}, + {-1406, -88, 100} + } }; -const Word32 rightHRIRImag_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA] /* Q29 */= +const Word16 rightHRIRImag_HOA3_fx[BINAURAL_CONVBANDS][HOA3_CHANNELS][BINAURAL_NTAPS_SBA]= { { - { -102715752, 295527040, -88424248, }, - { 96281896, -56815440, -11869679, }, - { -8760123, 37118180, -14165876, }, - { -16805134, 23917600, -6433324, }, - { 6374269, 26807576, -12249784, }, - { -1127429, 13645648, -4787278, }, - { 4656282, 38743288, -16459388, }, - { 5360119, -24749212, 7655779, }, - { -9627169, 107434848, -38639672, }, - { 5340792, 41006200, -19219442, }, - { -268435, -7092602, 3980898, }, - { 2935073, 9185324, -4246112, }, - { -741419, -13098040, 6208912, }, - { 931471, -9216463, 4911295, }, - { -3754875, -8075076, 3953518, }, - { -147103, 2249489, -787590, } - }, - { - { -177186736, 179125376, -115792320, }, - { 239960896, 299077888, 104825120, }, - { -9208410, 46498388, -8622147, }, - { -28982440, 16567299, -3951907, }, - { 16998944, 27056684, -16417512, }, - { -7049115, -40280352, -29566554, }, - { 19155554, 43337292, -20049982, }, - { 6044093, -23644868, 7273527, }, - { 2528662, 81792824, -53621592, }, - { 29154238, 116467704, 7671349, }, - { -7763691, -48617956, -14192719, }, - { 10481331, 30494268, 1056025, }, - { -6800544, -35405564, -2618320, }, - { -5965173, -47450800, -11907260, }, - { -10130217, -13799730, 3756486, }, - { 438624, 4456029, 349503, } - }, - { - { -51999168, -317713760, 45510012, }, - { 132898096, 545737344, 39643620, }, - { -308164, 25183540, -2346663, }, - { -10490458, 16738024, -7422241, }, - { 20291572, -66797480, 22439594, }, - { 3951370, -103472744, -4090420, }, - { 38857104, -86104968, 33058364, }, - { -1992328, 11780558, -2269353, }, - { 60647084, -194886288, 50082004, }, - { 30465276, 48754860, 39180840, }, - { -3276523, -72164576, -4759898, }, - { 2859375, 54574540, -8997420, }, - { -1475858, -48667348, 3673808, }, - { -47782, -96552472, 8617315, }, - { 973884, -46942380, 19906100, }, - { 2827699, -5764920, 3810710, } - }, - { - { 34120832, -220877824, 40671192, }, - { -49936512, 199888848, -41771240, }, - { 3815542, 29523606, -4461934, }, - { 18192408, 43142408, -7209103, }, - { -7750269, -111525808, 8528194, }, - { 7198365, -69175280, 11199127, }, - { 13021804, -200965808, -12485470, }, - { -1145683, 12852153, 373662, }, - { 31666258, -357677888, -27057220, }, - { 7707856, 32124208, 42369316, }, - { 4867272, -29853244, 13622026, }, - { 4420595, 104069208, 21484500, }, - { 5786395, -47440600, 2157147, }, - { 3860102, -75734768, 17977660, }, - { 8563091, -98140536, -7536057, }, - { -2442226, -55461448, -19271518, } - }, - { - { 10460393, -181682480, 44848048, }, - { -108469400, 340663936, -99499360, }, - { 4267587, -36406292, 25516938, }, - { 26082262, -82588464, 40497784, }, - { -29406030, 4441533, -31512176, }, - { -13383655, 11658152, -22476638, }, - { -14169097, -91462400, -56171728, }, - { 7954280, -922881, 2018635, }, - { -27049704, -254546064, -60070488, }, - { -27341762, 175464448, -20010252, }, - { 3204046, -10685342, 5061619, }, - { 1270237, 125430760, 10515154, }, - { 7642358, -40255656, -4295504, }, - { -2068027, 463856, -14248554, }, - { 13204877, -75227960, -24315958, }, - { 3937948, -75275744, -8985608, } - }, - { - { -109123848, -363628576, 19850266, }, - { 9291625, 471410240, -91331408, }, - { -23200876, -97610112, 6461242, }, - { -36034776, -107364520, 42067596, }, - { 1789928, 2889439, -32729262, }, - { -20062330, 51043540, -1501628, }, - { -3835943, 12977244, -8718247, }, - { 13856101, 18894098, 5616744, }, - { -66184372, -170432352, 3189550, }, - { -38536596, 82056424, -61956512, }, - { 4857071, -3991635, 8170639, }, - { -4960687, 70343512, -20109574, }, - { 5545877, -7403987, 10499048, }, - { 9702868, 27723478, -3980898, }, - { 12382928, 13322989, 15064598, }, - { 12425877, -38941932, 6793028, } - }, - { - { -195198208, -105714176, -71322760, }, - { 215174640, -32808718, 78798688, }, - { -47779364, -19037980, -21328808, }, - { -133198744, 112761144, -23626616, }, - { 73338176, -144662544, 7880191, }, - { -21403432, 30356828, 10085120, }, - { 6622303, -32783486, 7916699, }, - { 880468, 11415486, 10504953, }, - { -88258896, -64644088, -35305168, }, - { -2688650, -66810364, -1264331, }, - { 3269007, 19416474, -1700807, }, - { -4816806, 14665166, 4730370, }, - { -14203457, 39763880, -4204236, }, - { 19469086, -13660680, 9423158, }, - { -25116432, 59262496, 6179921, }, - { 8930311, -33924872, 1862942, } - }, - { - { -75185016, 178007072, 17114908, }, - { 224526400, -173874768, 14468671, }, - { -35714800, 41899016, 1722819, }, - { -147797872, 57060788, -37157908, }, - { 110517560, -32109712, 40170292, }, - { -13028246, -9739375, -8776229, }, - { 11642583, -30146376, 6591701, }, - { -34980900, -38170448, -902480, }, - { -13600014, 85681376, 7280507, }, - { 15824270, -18907520, 12783433, }, - { 6081674, 16430934, -4125853, }, - { -29388314, -10895795, -162135, }, - { -25477210, 14954002, -10593000, }, - { 11839614, -21398600, 6806987, }, - { -62463320, -21545704, -17193828, }, - { -3930432, -23349052, 8411693, } - }, - { - { 124779536, -22646826, 48507360, }, - { 77259480, 69186552, -43811888, }, - { -10337449, -4553202, 13614509, }, - { -42608224, -104795592, 4864051, }, - { 49625664, 88771072, 3922379, }, - { 20056424, -35947804, -5018133, }, - { 1079111, -107911, -3783866, }, - { -63607928, -75699, -8749922, }, - { 70587248, -13620952, 24923158, }, - { 7115687, 30103962, -4275640, }, - { 10963441, -7543573, 4325569, }, - { -55031952, 24158654, -6695854, }, - { -15417322, -20169704, 1402307, }, - { -11427834, 19712826, -4295504, }, - { -59354836, -50075560, -6753836, }, - { -32708324, 12753905, -102005, } - }, - { - { 286679936, -42412804, 9840844, }, - { -116902568, 6942278, -25850872, }, - { 13852343, -19517406, 3364570, }, - { 110133696, 32694902, 25050396, }, - { -60822104, -43612172, -22499724, }, - { 56594248, 16292958, 8150238, }, - { -18313740, -4286378, -1090922, }, - { -58529128, 17256104, -2695629, }, - { 99918120, -48497696, 5523865, }, - { -9865540, 2490007, -9789841, }, - { 6185290, -13204877, 2734284, }, - { -57276072, 23256712, -6016713, }, - { 1996623, 1510218, 5279052, }, - { -33033130, 7542500, -4423280, }, - { -24627342, 22221624, 13475460, }, - { -56947508, -13872207, -4949413, } - }, - { - { 369951296, 11637214, -19057844, }, - { -275144736, -7006166, 4369593, }, - { 43432856, -7104413, -4556961, }, - { 223252400, 22448720, 7514046, }, - { -149661888, -27103392, -11121818, }, - { 66699232, 26035018, 1901060, }, - { -45021996, 6493454, -987306, }, - { -21727166, -23222888, 5068062, }, - { 68480032, 28010702, -14796162, }, - { -20506858, -13718662, -1280974, }, - { -7138236, 9458592, -3651796, }, - { -26306674, -18474264, 4527970, }, - { 12858595, 8259759, 213138, }, - { -42810624, -7886097, 3251290, }, - { 8556112, 19741280, 7248294, }, - { -62429496, -17578228, -3010772, } - }, - { - { 393655232, 18198314, -15280957, }, - { -366834752, -10258529, 13111461, }, - { 89055072, 13213467, -2873870, }, - { 262732272, -14457397, -9764071, }, - { -184219200, 16023449, 8928700, }, - { 46308336, -9028021, -7953743, }, - { -69313792, 40265, 445603, }, - { 25310780, -430034, 4767951, }, - { 12801150, 2143189, -12394202, }, - { -22710176, 4475356, 5142687, }, - { -21137144, 7526394, -1753420, }, - { 20363514, 2947958, 3504693, }, - { 10953777, -259309, -2443300, }, - { -43550432, -8719320, 2104534, }, - { 27887760, -11151346, -7304129, }, - { -48897128, 11552388, 5156108, } - }, - { - { 393587584, -16003585, -1691143, }, - { -407478592, 13923747, 8107825, }, - { 150810256, -17078400, -2028298, }, - { 246486560, 4512400, -10222022, }, - { -178807536, 2159295, 9586367, }, - { 6522445, -5173288, -2015413, }, - { -84209816, 1737314, 2623688, }, - { 61722976, 1511292, -2246268, }, - { -34659848, -12631499, 715649, }, - { -21009906, 8139500, 2964601, }, - { -33974264, 1009854, 2833605, }, - { 64991980, -3661997, -1915555, }, - { -3665755, 1257889, -104153, }, - { -37127844, -5294084, -829466, }, - { 37775312, -15984795, -6041409, }, - { -32945620, 7146826, 3170223, } - }, - { - { 389030080, -645856, 3390877, }, - { -422571104, -10395968, 1673427, }, - { 215616480, 13672492, -2324651, }, - { 210861424, 412854, -4902705, }, - { -159334160, -3248606, 3352222, }, - { -43313136, -6364605, 6125160, }, - { -83583288, -2106145, 1627793, }, - { 81618872, 6060736, -3098819, }, - { -65605088, -4659503, 7262790, }, - { -17300128, -3033321, -1637993, }, - { -46225124, -6788733, 1626182, }, - { 92247304, 4304631, -3346317, }, - { -26742076, -5826660, 1142461, }, - { -24902758, 7871065, 2764348, }, - { 40583684, 10146860, 3660923, }, - { -22914724, -646393, -1450088, } - }, - { - { 381346400, 8778376, 318901, }, - { -423162720, -911607, -1009317, }, - { 256772480, -5362267, -3470871, }, - { 181759264, -3532611, 468688, }, - { -143814832, 2244657, -301185, }, - { -86775520, 16913582, 5376762, }, - { -60142428, -4284767, -837519, }, - { 86478096, -3433290, 421444, }, - { -85866056, 12759811, 3310883, }, - { -9114457, -6254010, -1319629, }, - { -54241680, 2934537, -525597, }, - { 90273232, 1603633, -2403571, }, - { -48776332, 4350265, 1156957, }, - { -10286447, 5401458, 1887638, }, - { 36567888, 9317932, 4653060, }, - { -18476412, -3271691, -350577, } - }, - { - { 368989216, -5534602, -2714419, }, - { -410308960, 8353175, 446677, }, - { 249583776, -1581622, -1770063, }, - { 160193696, -6912750, 1336272, }, - { -132391296, 3189013, -680215, }, - { -98816464, -7694434, -409633, }, - { -12958453, 11945378, -2587181, }, - { 82759184, -5604933, 719407, }, - { -97562864, -6251325, -1469953, }, - { 4041564, 5899138, 1145146, }, - { -55416352, 1132261, -874026, }, - { 55714316, -4063039, 931471, }, - { -58292368, 212064, 1797981, }, - { 9628780, -887448, -3663070, }, - { 33955476, -9705552, -1395328, }, - { -17141752, -2013803, 310848, } - }, - { - { 354289152, 1707786, -2571075, }, - { -388501792, -8374113, 2523830, }, - { 184855392, 18489298, 1823214, }, - { 135551856, 5879274, -466541, }, - { -114764744, -6063420, 659814, }, - { -60275572, -12415677, -4552129, }, - { 46445776, -17685602, -2125472, }, - { 81105088, 2907693, -1739999, }, - { -98579160, -4654134, -1602560, }, - { 20057498, -1689533, 1277216, }, - { -51474648, -2972117, -359704, }, - { -5354214, 17738752, 3388729, }, - { -46520940, -505196, 658741, }, - { 37961068, -15249281, -3142842, }, - { 44451836, -3827890, -4762045, }, - { -13396540, -1116692, -637803, } - }, - { - { 340785792, -648540, -1286880, }, - { -367042528, 4130148, 3242164, }, - { 77211704, -35029752, 872952, }, - { 100708928, -5694590, 889595, }, - { -83269752, 6628745, 448824, }, - { 25592100, 34553012, -2397129, }, - { 94690608, 10888816, -446677, }, - { 89442160, 3150359, -2889976, }, - { -88895624, 9186398, 1739999, }, - { 36222680, -879931, -1087701, }, - { -48532592, 2396592, 495532, }, - { -74482784, -21537114, 996969, }, - { -9998684, 8573292, -2022393, }, - { 66636956, 12024298, 1883880, }, - { 71037688, 16143708, -2165201, }, - { -2926483, 5681705, 247497, } - }, - { - { 329444928, 1310502, -534723, }, - { -353794720, 2165201, 1990717, }, - { -35852776, 28246390, -2888366, }, - { 55373404, 13240310, 1661079, }, - { -37164352, -11212549, -545461, }, - { 127722128, -30776126, 3580392, }, - { 106435192, 4369593, -664646, }, - { 105386152, -7526394, -2194192, }, - { -73596952, -3322694, 3643743, }, - { 49728204, -2808372, -2727841, }, - { -53045532, -820339, 2132988, }, - { -122394760, 6372121, -637803, }, - { 44829796, -17051558, -1961190, }, - { 82841328, 1896228, 2768643, }, - { 103471664, -14290430, 3080565, }, - { 13754096, -4429722, 1447941, } - }, - { - { 318065408, -2289755, -362388, }, - { -349757984, -4101157, -578210, }, - { -113754360, -4496294, -1942399, }, - { 8507793, -14286135, -691490, }, - { 16632261, 13100724, -366146, }, - { 202864720, 2484639, 2860448, }, - { 68579888, -16773458, -2518998, }, - { 115998480, 4524748, -450972, }, - { -57802208, -2226941, 1721745, }, - { 55953760, 4285304, -1493038, }, - { -64990908, -3839164, 3566434, }, - { -125006096, 11333882, 2152852, }, - { 97701920, 11058467, -1133871, }, - { 83138216, -8892193, -703838, }, - { 125751272, -3743064, 3295314, }, - { 33724084, -200790, -140123, } - }, - { - { 303769600, 3554622, -392453, }, - { -350124128, -987306, -1495722, }, - { -137944144, -8970576, 2792266, }, - { -26552024, 2578054, -1378685, }, - { 65428460, -7725573, -780073, }, - { 224844752, 13725105, -4529043, }, - { -12483322, 17953500, -1854889, }, - { 103481872, 7759932, -520228, }, - { -43051680, 3295314, -2524367, }, - { 48843440, 154619, 881542, }, - { -73293616, 6476274, 2489471, }, - { -76880992, -14780593, 3942780, }, - { 123941480, -2439542, -1432372, }, - { 75282184, 4989142, -3872987, }, - { 130074160, 13528610, -3344169, }, - { 54148264, -2907693, -2643552, } - }, - { - { 285796256, -3981972, -291521, }, - { -350552544, 5566278, 934155, }, - { -118486872, 7196218, 3931506, }, - { -41846404, 7055021, 2590939, }, - { 97731440, 5333276, -1343788, }, - { 194669936, -10606959, -7839926, }, - { -113775832, -16637630, 2842195, }, - { 56706992, -15079093, -1974611, }, - { -29278256, 8361765, -3295851, }, - { 26415122, -8336532, 1655173, }, - { -59804736, -1544578, -1472637, }, - { 8213588, 12548284, -590021, }, - { 108378128, -5355288, -51540, }, - { 70177080, 6913287, -2084133, }, - { 118951264, -5292474, -8668318, }, - { 71132176, 9405978, -1124745, } - }, - { - { 266198848, 4580583, -198105, }, - { -350230976, -1767379, 3656628, }, - { -80328776, -6408091, 1429150, }, - { -38255272, -1089848, 5014911, }, - { 107569064, -468151, -574989, }, - { 127891240, 5308043, -2437931, }, - { -204628880, 22431004, 4451197, }, - { -21296058, 14463839, 33823, }, - { -19694036, -12688944, 2639258, }, - { -4931696, 13265006, -676457, }, - { -12508555, -14493367, -4561256, }, - { 104526616, -20976620, -5231270, }, - { 52614960, 17870822, 1361505, }, - { 70737040, -3554622, 1427003, }, - { 93311384, -9984188, -3721589, }, - { 78050296, -3340948, 2378338, } - }, - { - { 248731760, -3841312, -413391, }, - { -347933152, -4990215, 2474975, }, - { -48056924, 5582384, 192737, }, - { -17847736, -1597191, 1737314, }, - { 95645160, -7235410, -721018, }, - { 41769632, -15646566, 4005057, }, - { -254933696, -15661061, -967978, }, - { -116530512, -22162568, 2592013, }, - { -19997904, -4423280, 6172405, }, - { -32169842, -5239323, -2809446, }, - { 61610232, 30427696, -1196685, }, - { 179832432, 24736864, -1607928, }, - { -22802518, -23575612, -494995, }, - { 71613208, -3980898, 626528, }, - { 43881144, -3936338, 5649493, }, - { 71671728, -8278550, 1923609, } - }, - { - { 236869056, 1332514, -442382, }, - { -337984384, 1898912, -1230508, }, - { -36775656, -474057, 851477, }, - { 20679730, -7783555, -1839320, }, - { 70426728, 8507793, -2003602, }, - { -44932336, 25403120, 3211025, }, - { -247928592, -11966853, -4479651, }, - { -206551424, 20236276, 1881733, }, - { -25847114, 15595563, 737661, }, - { -45509472, -4691715, -1045288, }, - { 135022496, -19324132, 4323422, }, - { 203965856, -22549, 3609920, }, - { -85994912, 11100880, -2160906, }, - { 66792648, 5742908, -2680060, }, - { -36132488, 30173756, 5865852, }, - { 59363428, 8577050, -1539209, } - }, - { - { 231336064, 232465, -187905, }, - { -314608512, 9227200, -2216740, }, - { -47083580, -6296422, 1185411, }, - { 75150656, 17259326, -1380832, }, - { 43449500, -4299263, -2225330, }, - { -109668768, -16653736, -1604170, }, - { -196255840, 30693446, 824097, }, - { -266336288, -7691213, 1482838, }, - { -19513648, -40802, -5159330, }, - { -46906948, 3625489, 1585380, }, - { 178553600, -5398237, 2368675, }, - { 168658528, -26050588, 896038, }, - { -113106352, 3360275, -834297, }, - { 52196200, 1465658, -2229625, }, - { -130574520, -31559420, -607201, }, - { 54207856, 810138, -3128347, } - }, - { - { 229698608, -639413, 103079, }, - { -280268096, -14671608, 709743, }, - { -66435628, 8568460, -228170, }, - { 134516768, -15690052, 752156, }, - { 22232362, -897111, -233539, }, - { -135112160, -6288369, -1469416, }, - { -139269680, -16405701, 7248294, }, - { -280978368, -4770635, 2736431, }, - { 12651363, -20282446, -2835215, }, - { -45940044, 1393180, 1640141, }, - { 184659968, 12319577, -4322885, }, - { 97737352, 26691612, -5443334, }, - { -101278552, -13482439, 2464238, }, - { 23606750, 4308389, 1158567, }, - { -205791216, 10285910, -2576981, }, - { 63715304, -10809896, -556198, } - }, - { - { 228049344, -766115, 147103, }, - { -246180544, 7079180, 2858301, }, - { -76775224, -832687, -1352915, }, - { 183658704, 7169911, 1001801, }, - { 6696391, -2782602, 1196148, }, - { -122947200, 12901545, 2642479, }, - { -114430280, -11481521, 4749160, }, - { -251979824, 10114111, 2804614, }, - { 64481956, 19887846, 2881386, }, - { -50970524, -4954782, -78383, }, - { 167591776, -1422708, -5360656, }, - { 30406220, -4449586, -4957466, }, - { -66963908, 7187628, 3494493, }, - { -20111722, -12416214, 1946157, }, - { -235634256, 7168301, 1110786, }, - { 83446384, 6468221, 2186138, } - }, - { - { 223257776, 2434173, -358630, }, - { -222571648, 1423782, 1270774, }, - { -66901096, -5757941, -1224603, }, - { 213205392, -363462, -601295, }, - { -7517804, 5701032, -143345, }, - { -91403880, -10115722, 4810364, }, - { -129454608, 18477486, -2522220, }, - { -192888048, -18012020, 2818572, }, - { 116327040, -5597953, 3251827, }, - { -64936684, 4624069, -1325534, }, - { 144151984, 967441, -1925756, }, - { -7003481, -5485210, 1249299, }, - { -32142998, -2110440, 637803, }, - { -70955008, 14260902, 665720, }, - { -216462592, -14950781, 4974646, }, - { 102517112, 1085016, 637266, } - }, - { - { 214601264, -2141578, -664646, }, - { -210639152, -2856690, -1705639, }, - { -39098696, 12422119, 195421, }, - { 224401296, -1705102, -2122251, }, - { -23874650, -3256122, -1199370, }, - { -59892244, 667331, 3594888, }, - { -164760848, -9598715, -5667210, }, - { -122378112, 14896557, 3575560, }, - { 153078544, -1903207, -1206886, }, - { -86211264, -2884071, -637803, }, - { 122694328, -2251637, -253940, }, - { -11296301, 5420249, 4977867, }, - { -11534135, 192200, -1800665, }, - { -114549464, -8192650, -90194, }, - { -162886096, 13973139, 6212134, }, - { 113876224, -239981, -1750736, } - }, - { - { 203155712, 2066953, -350577, }, - { -204104896, -4072703, -1747515, }, - { -6510634, -9341554, 2334315, }, - { 225802000, 472983, -2469606, }, - { -44047572, 288837, 622770, }, - { -37247568, 4226785, -686658, }, - { -195934800, -5150203, -1933272, }, - { -55822764, -6788196, 1361505, }, - { 173047984, -2663954, -3274913, }, - { -111873696, 4126927, 835371, }, - { 104021424, 2258079, 476205, }, - { 6830072, 1428077, 2796024, }, - { -11289322, 1420024, -2125472, }, - { -137739072, 110595, 669478, }, - { -94089312, -7212324, 3067144, }, - { 116191752, -2365453, -1021665, } - }, - { - { 190689024, -2371359, 25233, }, - { -197546480, 3785477, 316217, }, - { 16255377, -399969, 1974074, }, - { 225470752, 848256, -2200097, }, - { -67733784, -5657546, 2481417, }, - { -19403588, 2711198, -3480534, }, - { -212375392, 4522601, 3687230, }, - { 2371896, 7086696, -2202245, }, - { 181697520, 2357400, -2130841, }, - { -138478336, -6050535, 1375463, }, - { 84387520, -5470715, 548682, }, - { 35806068, 4025995, -1049583, }, - { -31158914, -4240207, -985695, }, - { -135325296, 6150930, 2264522, }, - { -20935818, 10323491, -1573032, }, - { 111204760, -1440425, 493921, } - }, - { - { 179225232, 2760053, -17717, }, - { -190236448, -1275605, 811749, }, - { 24045912, 6411850, -1258962, }, - { 225514768, -2793339, -1294396, }, - { -90458992, 10246718, 591095, }, - { 167504, -10723460, -1471026, }, - { -217126704, 2069101, 4703526, }, - { 54550916, -13069585, -2480881, }, - { 184158000, -1075352, -1227824, }, - { -161489696, 6567005, 497142, }, - { 61848064, 6723235, -358093, }, - { 67046588, -7152195, -1881733, }, - { -66924716, 8096014, 238371, }, - { -111702976, -5281736, 2227478, }, - { 53031036, -16231755, -3055332, }, - { 102903120, 5515812, -529355, } - }, - { - { 170537584, -1824824, -342524, }, - { -183614688, 394063, 205622, }, - { 22137336, -1753420, -3557307, }, - { 221629984, 302795, -28454, }, - { -103760504, -3090229, -2041720, }, - { 20645370, 6936909, 1555852, }, - { -213660128, -3447248, 2346663, }, - { 100076496, 9751723, -1311576, }, - { 182113600, -1058710, -1208496, }, - { -176058768, -1651952, -193810, }, - { 38847980, -4515621, -702227, }, - { 92197376, 7477001, -769873, }, - { -110912696, -10102300, 789737, }, - { -75545256, 8342974, 1235877, }, - { 122212760, 16909824, -2013266, }, - { 96241088, -2203855, -2356327, } - }, - { - { 165191424, 577673, -507343, }, - { -179486688, -921807, 26307, }, - { 18013092, -6145562, -1138703, }, - { 208220544, 3984119, 584116, }, - { -103398656, -5571110, -1526324, }, - { 36229660, 1289564, 903017, }, - { -200551888, 775242, -777926, }, - { 134781984, -8606041, -266288, }, - { 173686336, 821413, -890132, }, - { -180358560, -1727651, 304406, }, - { 18604724, 3582003, -486405, }, - { 104140072, -1828582, 615254, }, - { -152703264, 9380209, 613107, }, - { -36066452, -5236639, -74088, }, - { 176816832, -12213276, -252866, }, - { 92410520, -2876554, -1875290, } - }, - { - { 161907920, 635655, -172872, }, - { -178636272, 357556, 479963, }, - { 12662100, -326954, 1681480, }, - { 184686816, -8484171, 18254, }, - { -95561952, 7052873, 1110786, }, - { 44053480, -1843078, -1413581, }, - { -174144816, 10176388, -1409823, }, - { 154284352, 120796, -38118, }, - { 156079104, -4118874, -20401, }, - { -177165248, 3488587, 1398549, }, - { 1976759, -2449742, -335007, }, - { 99716792, -5302137, 265214, }, - { -181908512, -4544613, 263067, }, - { -349503, 7743826, -988916, }, - { 206934208, -265214, -577136, }, - { 85982024, 1734093, 284542, } - }, - { - { 158032784, 541166, 315143, }, - { -180236160, 1362042, 498753, }, - { 3595425, 5788006, 567473, }, - { 157179168, 7753490, -1189706, }, - { -92995704, 1237488, 2185602, }, - { 45439144, -1014686, -1642288, }, - { -136143488, -13908178, 1192390, }, - { 158649648, 1945620, -955630, }, - { 128903776, 7742753, -26844, }, - { -171800832, 121333, 1593433, }, - { -13741211, 3517578, -564788, }, - { 83028696, 7720741, -1414655, }, - { -192142336, -2512556, 985695, }, - { 26982596, -4926865, -543850, }, - { 209874112, 5954436, -2946348, }, - { 68932080, 5796595, 1089848, } - }, - { - { 151386864, -2404645, 253940, }, - { -181588528, -503585, 170188, }, - { -8827768, -4410932, -1240172, }, - { 134659040, -2888903, -1367410, }, - { -104213624, -6438693, 1145146, }, - { 42312944, 794569, -366683, }, - { -95989296, 7403987, 2324114, }, - { 153781312, -4433480, -2048163, }, - { 96725344, -7683697, -385473, }, - { -167803840, -656056, 716723, }, - { -32862406, -1418413, 206695, }, - { 63042604, -3702799, -2165201, }, - { -183988880, 5443334, 2400350, }, - { 42643656, 1428077, -680752, }, - { 191339712, -6039798, -4101694, }, - { 38693360, -9665287, 308701, } - }, - { - { 142047456, 3342022, -296890, }, - { -179505472, -1129576, 209380, }, - { -22232362, 354335, -740345, }, - { 122268056, -1197759, -267899, }, - { -127089696, 8201777, 76773, }, - { 35804996, 1121523, 504659, }, - { -62621160, -1944010, 459562, }, - { 147204096, -1213328, -2026688, }, - { 66827544, 5657546, -360777, }, - { -164881648, 201327, 209917, }, - { -58692340, 5550709, 1727651, }, - { 47042776, -1225139, -587874, }, - { -163863744, -2279554, 1731946, }, - { 47356848, -1014686, -275952, }, - { 159833984, 1132261, -1580011, }, - { 1237488, 9800042, -374736, } - }, - { - { 131995080, -2185602, -686121, }, - { -172193296, 2389613, 385473, }, - { -34882112, -1754494, 548682, }, - { 118775712, 1829656, 1057099, }, - { -151923200, -6539625, -869194, }, - { 26918170, -2971044, 383326, }, - { -38384660, 2454037, -1380295, }, - { 142515600, 503048, -854162, }, - { 45397804, -2553895, 5906, }, - { -161184224, 705985, -71941, }, - { -90267864, -9992241, 1291711, }, - { 35852776, -878858, 1010391, }, - { -138178768, 5908265, 526134, }, - { 44611288, -2708514, -45634, }, - { 120780920, -8893267, 904628, }, - { -33002528, -6796786, -682900, } - }, - { - { 123259656, 386547, -297427, }, - { -159658960, -3253975, 445603, }, - { -46336256, 4461934, -53687, }, - { 118589952, 2868501, 408022, }, - { -167935376, -1099512, -287226, }, - { 18038862, 1049046, 440771, }, - { -20253992, -5125507, -966368, }, - { 137852352, -726923, -92342, }, - { 34689912, 804770, 202937, }, - { -155091264, -3265249, 384400, }, - { -120252640, 8320963, -351114, }, - { 26051124, 3993783, 417149, }, - { -111731424, -5927055, 835908, }, - { 39908300, 2525441, -925029, }, - { 78502336, 11174968, 89121, }, - { -55575268, 1717987, -388695, } - }, - { - { 116317912, -416075, 415538, }, - { -143268832, 3914863, 501437, }, - { -56534656, -2570538, -1308354, }, - { 116717344, -2132988, -1386738, }, - { -170748576, 4256850, 1899986, }, - { 12721693, -376883, 1067836, }, - { -4331475, 3602941, 61203, }, - { 130119792, -2341294, 446677, }, - { 32933272, 1725503, 509491, }, - { -146960896, 2652679, 1264868, }, - { -139780240, -676994, -488016, }, - { 14691473, -3594888, -795643, }, - { -87946968, 4322885, 1036698, }, - { 38193532, -301721, -1729261, }, - { 39508868, -8189966, -799401, }, - { -65048352, 2486249, 899259, } - }, - { - { 110479440, 2017024, 375810, }, - { -125087704, -3195993, 301185, }, - { -66401268, -1813013, -260382, }, - { 110462800, -526670, -1109712, }, - { -163715024, -1055488, 2429341, }, - { 14014478, 1299228, 401579, }, - { 11800960, -1622424, -513785, }, - { 118221120, 5338645, -335007, }, - { 35818416, -648540, 755914, }, - { -138514304, 256087, 814970, }, - { -145208544, -4230006, 1448478, }, - { 764504, 854162, -260382, }, - { -67583992, -1777043, 284005, }, - { 40011380, -4359929, -912144, }, - { 9163850, 2971581, -146029, }, - { -67017060, -1034013, 2039036, } - }, - { - { 105450576, -1956358, -323733, }, - { -106948440, 3267396, -158377, }, - { -78411072, -905701, 2007897, }, - { 97738424, -1114544, 679679, }, - { -151885616, -370441, 593242, }, - { 23703924, 2260227, -975494, }, - { 29065118, 3977677, -1253594, }, - { 105585328, -3322694, -1251446, }, - { 39151312, -676457, 128312, }, - { -130260456, 290447, -506269, }, - { -140068016, 2144263, 2621541, }, - { -15606837, -2944737, 1053341, }, - { -49851148, 2172180, -1049046, }, - { 40941240, 2907156, 1347546, }, - { -10340671, -733366, 1454383, }, - { -68507952, -2381023, 1583232, } - }, - { - { 101561480, 300648, -568546, }, - { -89951112, -4433480, 75699, }, - { -93799400, 7416872, 1560684, }, - { 78182904, 6487011, 1120450, }, - { -137742816, -3635690, -416612, }, - { 40410812, -7388955, -376347, }, - { 45799920, -4907000, -733366, }, - { 96689912, 514859, -1169305, }, - { 41371808, -478352, -199716, }, - { -121325312, -3826816, -365072, }, - { -130160056, -69256, 1712618, }, - { -32813550, 5970005, 579284, }, - { -33693480, -6060199, -606127, }, - { 35114580, 5337571, 1307818, }, - { -20415590, 2937758, 1492501, }, - { -71973992, 2348810, 609885, } - }, - { - { 98599568, 495532, -88047, }, - { -75073344, 2914672, 547608, }, - { -108793136, -4763656, -343061, }, - { 55084568, -7936026, -375810, }, - { -122353952, 4451197, 281320, }, - { 58283780, 4212826, 855235, }, - { 58262840, 2534031, -28991, }, - { 92815320, 1783485, -290984, }, - { 42135240, -676457, -319975, }, - { -111458696, 2683818, 582505, }, - { -119100520, 385473, 188442, }, - { -46731928, -2570001, -293668, }, - { -20077898, 2864743, 571231, }, - { 22313966, -5775121, -535797, }, - { -23293218, -1050120, 282931, }, - { -75310104, -1711545, -76236, } - }, - { - { 95407864, 774168, 247497, }, - { -62201328, -2433099, 663036, }, - { -117396488, -2913599, 489089, }, - { 34339336, 1861868, -654446, }, - { -106500160, -2358474, 437013, }, - { 70891656, 2207613, -473520, }, - { 63357212, 2029372, -622770, }, - { 91015728, -407485, 495532, }, - { 41493680, -763430, -267899, }, - { -100730408, 11811, 16106, }, - { -107888504, -3798362, -7516, }, - { -53526568, -1596654, 488553, }, - { -10588168, 2075543, -592706, }, - { 7605314, 3099893, -1168768, }, - { -21086678, -2073396, 204548, }, - { -74581032, -2846490, 326418, } - }, - { - { 90771448, -2081449, -117575, }, - { -49592376, 1717987, 501437, }, - { -116706608, 5574331, 3620121, }, - { 20064476, 2241973, 1702955, }, - { -90603944, 127775, -1071594, }, - { 75449152, -3895535, -3524021, }, - { 60686276, -2705830, -1933809, }, - { 86734184, -1172526, 712428, }, - { 39661340, 1410897, 824634, }, - { -88941792, -665183, -2068564, }, - { -96333432, 5178657, 1554778, }, - { -52489868, 1941325, 1625108, }, - { -5063230, -2674154, -3305514, }, - { -4338454, 185220, -432718, }, - { -16717623, 2758443, 1214402, }, - { -67415952, 3813394, 1714766, } - }, - { - { 84129280, 1676648, -499290, }, - { -35509180, -853088, -664646, }, - { -106909256, -1200443, 4897874, }, - { 13125957, 48855, 3714610, }, - { -76045616, -1665911, -3042984, }, - { 71664752, -399432, -4633196, }, - { 52086680, -175557, -1498944, }, - { 77734080, 1599875, 1329292, }, - { 36881956, 878858, 1655710, }, - { -77481744, -3317325, -3355980, }, - { -83693880, -1409286, 2289218, }, - { -45268420, -208306, 1228361, }, - { -3515968, -1600412, -4469987, }, - { -11599633, -2076080, 1337346, }, - { -12450573, -971736, 2001992, }, - { -54461260, -667867, 1289564, } - }, - { - { 75215616, -398358, 100395, }, - { -19555522, 3034395, -2166811, }, - { -88683560, -1553704, 2289755, }, - { 13752485, -4630512, 2234457, }, - { -65350612, 8352638, -1596654, }, - { 59645284, 3656628, -1658931, }, - { 39149164, -894964, 359167, }, - { 64903936, -2723546, 2352568, }, - { 34983044, -2870112, 938987, }, - { -69646112, 9290014, -470836, }, - { -67845448, -2728378, -355945, }, - { -34161096, 1496796, -13422, }, - { -7281044, 4550518, -2243047, }, - { -14781130, -1541356, 2099165, }, - { -7865696, 2147, 2094333, }, - { -36711768, 1573569, -861678, } - }, + {-3135, 9019, -2698}, + {2938, -1734, -362}, + {-267, 1133, -432}, + {-513, 730, -196}, + {195, 818, -374}, + {-34, 416, -146}, + {142, 1182, -502}, + {164, -755, 234}, + {-294, 3279, -1179}, + {163, 1251, -587}, + {-8, -216, 121}, + {90, 280, -130}, + {-23, -400, 189}, + {28, -281, 150}, + {-115, -246, 121}, + {-4, 69, -24} + }, + { + {-5407, 5466, -3534}, + {7323, 9127, 3199}, + {-281, 1419, -263}, + {-884, 506, -121}, + {519, 826, -501}, + {-215, -1229, -902}, + {585, 1323, -612}, + {184, -722, 222}, + {77, 2496, -1636}, + {890, 3554, 234}, + {-237, -1484, -433}, + {320, 931, 32}, + {-208, -1080, -80}, + {-182, -1448, -363}, + {-309, -421, 115}, + {13, 136, 11} + }, + { + {-1587, -9696, 1389}, + {4056, 16655, 1210}, + {-9, 769, -72}, + {-320, 511, -227}, + {619, -2038, 685}, + {121, -3158, -125}, + {1186, -2628, 1009}, + {-61, 360, -69}, + {1851, -5947, 1528}, + {930, 1488, 1196}, + {-100, -2202, -145}, + {87, 1665, -275}, + {-45, -1485, 112}, + {-1, -2947, 263}, + {30, -1433, 607}, + {86, -176, 116} + }, + { + {1041, -6741, 1241}, + {-1524, 6100, -1275}, + {116, 901, -136}, + {555, 1317, -220}, + {-237, -3404, 260}, + {220, -2111, 342}, + {397, -6133, -381}, + {-35, 392, 11}, + {966, -10915, -826}, + {235, 980, 1293}, + {149, -911, 416}, + {135, 3176, 656}, + {177, -1448, 66}, + {118, -2311, 549}, + {261, -2995, -230}, + {-75, -1693, -588} + }, + { + {319, -5545, 1369}, + {-3310, 10396, -3036}, + {130, -1111, 779}, + {796, -2520, 1236}, + {-897, 136, -962}, + {-408, 356, -686}, + {-432, -2791, -1714}, + {243, -28, 62}, + {-825, -7768, -1833}, + {-834, 5355, -611}, + {98, -326, 154}, + {39, 3828, 321}, + {233, -1228, -131}, + {-63, 14, -435}, + {403, -2296, -742}, + {120, -2297, -274} + }, + { + {-3330, -11097, 606}, + {284, 14386, -2787}, + {-708, -2979, 197}, + {-1100, -3276, 1284}, + {55, 88, -999}, + {-612, 1558, -46}, + {-117, 396, -266}, + {423, 577, 171}, + {-2020, -5201, 97}, + {-1176, 2504, -1891}, + {148, -122, 249}, + {-151, 2147, -614}, + {169, -226, 320}, + {296, 846, -121}, + {378, 407, 460}, + {379, -1188, 207} + }, + { + {-5957, -3226, -2177}, + {6567, -1001, 2405}, + {-1458, -581, -651}, + {-4065, 3441, -721}, + {2238, -4415, 240}, + {-653, 926, 308}, + {202, -1000, 242}, + {27, 348, 321}, + {-2693, -1973, -1077}, + {-82, -2039, -39}, + {100, 593, -52}, + {-147, 448, 144}, + {-433, 1213, -128}, + {594, -417, 288}, + {-766, 1809, 189}, + {273, -1035, 57} + }, + { + {-2294, 5432, 522}, + {6852, -5306, 442}, + {-1090, 1279, 53}, + {-4510, 1741, -1134}, + {3373, -980, 1226}, + {-398, -297, -268}, + {355, -920, 201}, + {-1068, -1165, -28}, + {-415, 2615, 222}, + {483, -577, 390}, + {186, 501, -126}, + {-897, -333, -5}, + {-778, 456, -323}, + {361, -653, 208}, + {-1906, -658, -525}, + {-120, -713, 257} + }, + { + {3808, -691, 1480}, + {2358, 2111, -1337}, + {-315, -139, 415}, + {-1300, -3198, 148}, + {1514, 2709, 120}, + {612, -1097, -153}, + {33, -3, -115}, + {-1941, -2, -267}, + {2154, -416, 761}, + {217, 919, -130}, + {335, -230, 132}, + {-1679, 737, -204}, + {-471, -616, 43}, + {-349, 602, -131}, + {-1811, -1528, -206}, + {-998, 389, -3} + }, + { + {8749, -1294, 300}, + {-3568, 212, -789}, + {423, -596, 103}, + {3361, 998, 764}, + {-1856, -1331, -687}, + {1727, 497, 249}, + {-559, -131, -33}, + {-1786, 527, -82}, + {3049, -1480, 169}, + {-301, 76, -299}, + {189, -403, 83}, + {-1748, 710, -184}, + {61, 46, 161}, + {-1008, 230, -135}, + {-752, 678, 411}, + {-1738, -423, -151} + }, + { + {11290, 355, -582}, + {-8397, -214, 133}, + {1325, -217, -139}, + {6813, 685, 229}, + {-4567, -827, -339}, + {2035, 795, 58}, + {-1374, 198, -30}, + {-663, -709, 155}, + {2090, 855, -452}, + {-626, -419, -39}, + {-218, 289, -111}, + {-803, -564, 138}, + {392, 252, 7}, + {-1306, -241, 99}, + {261, 602, 221}, + {-1905, -536, -92} + }, + { + {12013, 555, -466}, + {-11195, -313, 400}, + {2718, 403, -88}, + {8018, -441, -298}, + {-5622, 489, 272}, + {1413, -276, -243}, + {-2115, 1, 14}, + {772, -13, 146}, + {391, 65, -378}, + {-693, 137, 157}, + {-645, 230, -54}, + {621, 90, 107}, + {334, -8, -75}, + {-1329, -266, 64}, + {851, -340, -223}, + {-1492, 353, 157} + }, + { + {12011, -488, -52}, + {-12435, 425, 247}, + {4602, -521, -62}, + {7522, 138, -312}, + {-5457, 66, 293}, + {199, -158, -62}, + {-2570, 53, 80}, + {1884, 46, -69}, + {-1058, -385, 22}, + {-641, 248, 90}, + {-1037, 31, 86}, + {1983, -112, -58}, + {-112, 38, -3}, + {-1133, -162, -25}, + {1153, -488, -184}, + {-1005, 218, 97} + }, + { + {11872, -20, 103}, + {-12896, -317, 51}, + {6580, 417, -71}, + {6435, 13, -150}, + {-4862, -99, 102}, + {-1322, -194, 187}, + {-2551, -64, 50}, + {2491, 185, -95}, + {-2002, -142, 222}, + {-528, -93, -50}, + {-1411, -207, 50}, + {2815, 131, -102}, + {-816, -178, 35}, + {-760, 240, 84}, + {1239, 310, 112}, + {-699, -20, -44} + }, + { + {11638, 268, 10}, + {-12914, -28, -31}, + {7836, -164, -106}, + {5547, -108, 14}, + {-4389, 69, -9}, + {-2648, 516, 164}, + {-1835, -131, -26}, + {2639, -105, 13}, + {-2620, 389, 101}, + {-278, -191, -40}, + {-1655, 90, -16}, + {2755, 49, -73}, + {-1489, 133, 35}, + {-314, 165, 58}, + {1116, 284, 142}, + {-564, -100, -11} + }, + { + {11261, -169, -83}, + {-12522, 255, 14}, + {7617, -48, -54}, + {4889, -211, 41}, + {-4040, 97, -21}, + {-3016, -235, -12}, + {-395, 365, -79}, + {2526, -171, 22}, + {-2977, -191, -45}, + {123, 180, 35}, + {-1691, 35, -27}, + {1700, -124, 28}, + {-1779, 6, 55}, + {294, -27, -112}, + {1036, -296, -43}, + {-523, -61, 9} + }, + { + {10812, 52, -78}, + {-11856, -256, 77}, + {5641, 564, 56}, + {4137, 179, -14}, + {-3502, -185, 20}, + {-1839, -379, -139}, + {1417, -540, -65}, + {2475, 89, -53}, + {-3008, -142, -49}, + {612, -52, 39}, + {-1571, -91, -11}, + {-163, 541, 103}, + {-1420, -15, 20}, + {1158, -465, -96}, + {1357, -117, -145}, + {-409, -34, -19} + }, + { + {10400, -20, -39}, + {-11201, 126, 99}, + {2356, -1069, 27}, + {3073, -174, 27}, + {-2541, 202, 14}, + {781, 1054, -73}, + {2890, 332, -14}, + {2730, 96, -88}, + {-2713, 280, 53}, + {1105, -27, -33}, + {-1481, 73, 15}, + {-2273, -657, 30}, + {-305, 262, -62}, + {2034, 367, 57}, + {2168, 493, -66}, + {-89, 173, 8} + }, + { + {10054, 40, -16}, + {-10797, 66, 61}, + {-1094, 862, -88}, + {1690, 404, 51}, + {-1134, -342, -17}, + {3898, -939, 109}, + {3248, 133, -20}, + {3216, -230, -67}, + {-2246, -101, 111}, + {1518, -86, -83}, + {-1619, -25, 65}, + {-3735, 194, -19}, + {1368, -520, -60}, + {2528, 58, 84}, + {3158, -436, 94}, + {420, -135, 44} + }, + { + {9707, -70, -11}, + {-10674, -125, -18}, + {-3472, -137, -59}, + {260, -436, -21}, + {508, 400, -11}, + {6191, 76, 87}, + {2093, -512, -77}, + {3540, 138, -14}, + {-1764, -68, 53}, + {1708, 131, -46}, + {-1983, -117, 109}, + {-3815, 346, 66}, + {2982, 337, -35}, + {2537, -271, -21}, + {3838, -114, 101}, + {1029, -6, -4} + }, + { + {9270, 108, -12}, + {-10685, -30, -46}, + {-4210, -274, 85}, + {-810, 79, -42}, + {1997, -236, -24}, + {6862, 419, -138}, + {-381, 548, -57}, + {3158, 237, -16}, + {-1314, 101, -77}, + {1491, 5, 27}, + {-2237, 198, 76}, + {-2346, -451, 120}, + {3782, -74, -44}, + {2297, 152, -118}, + {3970, 413, -102}, + {1652, -89, -81} + }, + { + {8722, -122, -9}, + {-10698, 170, 29}, + {-3616, 220, 120}, + {-1277, 215, 79}, + {2983, 163, -41}, + {5941, -324, -239}, + {-3472, -508, 87}, + {1731, -460, -60}, + {-893, 255, -101}, + {806, -254, 51}, + {-1825, -47, -45}, + {251, 383, -18}, + {3307, -163, -2}, + {2142, 211, -64}, + {3630, -162, -265}, + {2171, 287, -34} + }, + { + {8124, 140, -6}, + {-10688, -54, 112}, + {-2451, -196, 44}, + {-1167, -33, 153}, + {3283, -14, -18}, + {3903, 162, -74}, + {-6245, 685, 136}, + {-650, 441, 1}, + {-601, -387, 81}, + {-151, 405, -21}, + {-382, -442, -139}, + {3190, -640, -160}, + {1606, 545, 42}, + {2159, -108, 44}, + {2848, -305, -114}, + {2382, -102, 73} + }, + { + {7591, -117, -13}, + {-10618, -152, 76}, + {-1467, 170, 6}, + {-545, -49, 53}, + {2919, -221, -22}, + {1275, -478, 122}, + {-7780, -478, -30}, + {-3556, -676, 79}, + {-610, -135, 188}, + {-982, -160, -86}, + {1880, 929, -37}, + {5488, 755, -49}, + {-696, -719, -15}, + {2185, -121, 19}, + {1339, -120, 172}, + {2187, -253, 59} + }, + { + {7229, 41, -13}, + {-10314, 58, -38}, + {-1122, -14, 26}, + {631, -238, -56}, + {2149, 260, -61}, + {-1371, 775, 98}, + {-7566, -365, -137}, + {-6303, 618, 57}, + {-789, 476, 23}, + {-1389, -143, -32}, + {4121, -590, 132}, + {6225, -1, 110}, + {-2624, 339, -66}, + {2038, 175, -82}, + {-1103, 921, 179}, + {1812, 262, -47} + }, + { + {7060, 7, -6}, + {-9601, 282, -68}, + {-1437, -192, 36}, + {2293, 527, -42}, + {1326, -131, -68}, + {-3347, -508, -49}, + {-5989, 937, 25}, + {-8128, -235, 45}, + {-596, -1, -157}, + {-1431, 111, 48}, + {5449, -165, 72}, + {5147, -795, 27}, + {-3452, 103, -25}, + {1593, 45, -68}, + {-3985, -963, -19}, + {1654, 25, -95} + }, + { + {7010, -20, 3}, + {-8553, -448, 22}, + {-2027, 261, -7}, + {4105, -479, 23}, + {678, -27, -7}, + {-4123, -192, -45}, + {-4250, -501, 221}, + {-8575, -146, 84}, + {386, -619, -87}, + {-1402, 43, 50}, + {5635, 376, -132}, + {2983, 815, -166}, + {-3091, -411, 75}, + {720, 131, 35}, + {-6280, 314, -79}, + {1944, -330, -17} + }, + { + {6960, -23, 4}, + {-7513, 216, 87}, + {-2343, -25, -41}, + {5605, 219, 31}, + {204, -85, 36}, + {-3752, 394, 81}, + {-3492, -350, 145}, + {-7690, 309, 86}, + {1968, 607, 88}, + {-1556, -151, -2}, + {5114, -43, -164}, + {928, -136, -151}, + {-2044, 219, 107}, + {-614, -379, 59}, + {-7191, 219, 34}, + {2547, 197, 67} + }, + { + {6813, 74, -11}, + {-6792, 43, 39}, + {-2042, -176, -37}, + {6507, -11, -18}, + {-229, 174, -4}, + {-2789, -309, 147}, + {-3951, 564, -77}, + {-5886, -550, 86}, + {3550, -171, 99}, + {-1982, 141, -40}, + {4399, 30, -59}, + {-214, -167, 38}, + {-981, -64, 19}, + {-2165, 435, 20}, + {-6606, -456, 152}, + {3129, 33, 19} + }, + { + {6549, -65, -20}, + {-6428, -87, -52}, + {-1193, 379, 6}, + {6848, -52, -65}, + {-729, -99, -37}, + {-1828, 20, 110}, + {-5028, -293, -173}, + {-3735, 455, 109}, + {4672, -58, -37}, + {-2631, -88, -19}, + {3744, -69, -8}, + {-345, 165, 152}, + {-352, 6, -55}, + {-3496, -250, -3}, + {-4971, 426, 190}, + {3475, -7, -53} + }, + { + {6200, 63, -11}, + {-6229, -124, -53}, + {-199, -285, 71}, + {6891, 14, -75}, + {-1344, 9, 19}, + {-1137, 129, -21}, + {-5979, -157, -59}, + {-1704, -207, 42}, + {5281, -81, -100}, + {-3414, 126, 25}, + {3174, 69, 15}, + {208, 44, 85}, + {-345, 43, -65}, + {-4203, 3, 20}, + {-2871, -220, 94}, + {3546, -72, -31} + }, + { + {5819, -72, 1}, + {-6029, 116, 10}, + {496, -12, 60}, + {6881, 26, -67}, + {-2067, -173, 76}, + {-592, 83, -106}, + {-6481, 138, 113}, + {72, 216, -67}, + {5545, 72, -65}, + {-4226, -185, 42}, + {2575, -167, 17}, + {1093, 123, -32}, + {-951, -129, -30}, + {-4130, 188, 69}, + {-639, 315, -48}, + {3394, -44, 15} + }, + { + {5470, 84, -1}, + {-5806, -39, 25}, + {734, 196, -38}, + {6882, -85, -40}, + {-2761, 313, 18}, + {5, -327, -45}, + {-6626, 63, 144}, + {1665, -399, -76}, + {5620, -33, -37}, + {-4928, 200, 15}, + {1887, 205, -11}, + {2046, -218, -57}, + {-2042, 247, 7}, + {-3409, -161, 68}, + {1618, -495, -93}, + {3140, 168, -16} + }, + { + {5204, -56, -10}, + {-5603, 12, 6}, + {676, -54, -109}, + {6764, 9, -1}, + {-3167, -94, -62}, + {630, 212, 47}, + {-6520, -105, 72}, + {3054, 298, -40}, + {5558, -32, -37}, + {-5373, -50, -6}, + {1186, -138, -21}, + {2814, 228, -23}, + {-3385, -308, 24}, + {-2305, 255, 38}, + {3730, 516, -61}, + {2937, -67, -72} + }, + { + {5041, 18, -15}, + {-5477, -28, 1}, + {550, -188, -35}, + {6354, 122, 18}, + {-3155, -170, -47}, + {1106, 39, 28}, + {-6120, 24, -24}, + {4113, -263, -8}, + {5300, 25, -27}, + {-5504, -53, 9}, + {568, 109, -15}, + {3178, -56, 19}, + {-4660, 286, 19}, + {-1101, -160, -2}, + {5396, -373, -8}, + {2820, -88, -57} + }, + { + {4941, 19, -5}, + {-5452, 11, 15}, + {386, -10, 51}, + {5636, -259, 1}, + {-2916, 215, 34}, + {1344, -56, -43}, + {-5314, 311, -43}, + {4708, 4, -1}, + {4763, -126, -1}, + {-5407, 106, 43}, + {60, -75, -10}, + {3043, -162, 8}, + {-5551, -139, 8}, + {-11, 236, -30}, + {6315, -8, -18}, + {2624, 53, 9} + }, + { + {4823, 17, 10}, + {-5500, 42, 15}, + {110, 177, 17}, + {4797, 237, -36}, + {-2838, 38, 67}, + {1387, -31, -50}, + {-4155, -424, 36}, + {4842, 59, -29}, + {3934, 236, -1}, + {-5243, 4, 49}, + {-419, 107, -17}, + {2534, 236, -43}, + {-5864, -77, 30}, + {823, -150, -17}, + {6405, 182, -90}, + {2104, 177, 33} + }, + { + {4620, -73, 8}, + {-5542, -15, 5}, + {-269, -135, -38}, + {4109, -88, -42}, + {-3180, -196, 35}, + {1291, 24, -11}, + {-2929, 226, 71}, + {4693, -135, -63}, + {2952, -234, -12}, + {-5121, -20, 22}, + {-1003, -43, 6}, + {1924, -113, -66}, + {-5615, 166, 73}, + {1301, 44, -21}, + {5839, -184, -125}, + {1181, -295, 9} + }, + { + {4335, 102, -9}, + {-5478, -34, 6}, + {-678, 11, -23}, + {3731, -37, -8}, + {-3878, 250, 2}, + {1093, 34, 15}, + {-1911, -59, 14}, + {4492, -37, -62}, + {2039, 173, -11}, + {-5032, 6, 6}, + {-1791, 169, 53}, + {1436, -37, -18}, + {-5001, -70, 53}, + {1445, -31, -8}, + {4878, 35, -48}, + {38, 299, -11} + }, + { + {4028, -67, -21}, + {-5255, 73, 12}, + {-1065, -54, 17}, + {3625, 56, 32}, + {-4636, -200, -27}, + {821, -91, 12}, + {-1171, 75, -42}, + {4349, 15, -26}, + {1385, -78, 0}, + {-4919, 22, -2}, + {-2755, -305, 39}, + {1094, -27, 31}, + {-4217, 180, 16}, + {1361, -83, -1}, + {3686, -271, 28}, + {-1007, -207, -21} + }, + { + {3762, 12, -9}, + {-4872, -99, 14}, + {-1414, 136, -2}, + {3619, 88, 12}, + {-5125, -34, -9}, + {551, 32, 13}, + {-618, -156, -29}, + {4207, -22, -3}, + {1059, 25, 6}, + {-4733, -100, 12}, + {-3670, 254, -11}, + {795, 122, 13}, + {-3410, -181, 26}, + {1218, 77, -28}, + {2396, 341, 3}, + {-1696, 52, -12} + }, + { + {3550, -13, 13}, + {-4372, 119, 15}, + {-1725, -78, -40}, + {3562, -65, -42}, + {-5211, 130, 58}, + {388, -11, 33}, + {-132, 110, 2}, + {3971, -71, 14}, + {1005, 53, 16}, + {-4485, 81, 39}, + {-4266, -21, -15}, + {448, -110, -24}, + {-2684, 132, 32}, + {1166, -9, -53}, + {1206, -250, -24}, + {-1985, 76, 27} + }, + { + {3372, 62, 11}, + {-3817, -98, 9}, + {-2026, -55, -8}, + {3371, -16, -34}, + {-4996, -32, 74}, + {428, 40, 12}, + {360, -50, -16}, + {3608, 163, -10}, + {1093, -20, 23}, + {-4227, 8, 25}, + {-4431, -129, 44}, + {23, 26, -8}, + {-2063, -54, 9}, + {1221, -133, -28}, + {280, 91, -4}, + {-2045, -32, 62} + }, + { + {3218, -60, -10}, + {-3264, 100, -5}, + {-2393, -28, 61}, + {2983, -34, 21}, + {-4635, -11, 18}, + {723, 69, -30}, + {887, 121, -38}, + {3222, -101, -38}, + {1195, -21, 4}, + {-3975, 9, -15}, + {-4275, 65, 80}, + {-476, -90, 32}, + {-1521, 66, -32}, + {1249, 89, 41}, + {-316, -22, 44}, + {-2091, -73, 48} + }, + { + {3099, 9, -17}, + {-2745, -135, 2}, + {-2863, 226, 48}, + {2386, 198, 34}, + {-4204, -111, -13}, + {1233, -225, -11}, + {1398, -150, -22}, + {2951, 16, -36}, + {1263, -15, -6}, + {-3703, -117, -11}, + {-3972, -2, 52}, + {-1001, 182, 18}, + {-1028, -185, -18}, + {1072, 163, 40}, + {-623, 90, 46}, + {-2196, 72, 19} + }, + { + {3009, 15, -3}, + {-2291, 89, 17}, + {-3320, -145, -10}, + {1681, -242, -11}, + {-3734, 136, 9}, + {1779, 129, 26}, + {1778, 77, -1}, + {2833, 54, -9}, + {1286, -21, -10}, + {-3401, 82, 18}, + {-3635, 12, 6}, + {-1426, -78, -9}, + {-613, 87, 17}, + {681, -176, -16}, + {-711, -32, 9}, + {-2298, -52, -2} + }, + { + {2912, 24, 8}, + {-1898, -74, 20}, + {-3583, -89, 15}, + {1048, 57, -20}, + {-3250, -72, 13}, + {2163, 67, -14}, + {1934, 62, -19}, + {2778, -12, 15}, + {1266, -23, -8}, + {-3074, 0, 0}, + {-3292, -116, 0}, + {-1634, -49, 15}, + {-323, 63, -18}, + {232, 95, -36}, + {-644, -63, 6}, + {-2276, -87, 10} + }, + { + {2770, -64, -4}, + {-1513, 52, 15}, + {-3562, 170, 110}, + {612, 68, 52}, + {-2765, 4, -33}, + {2303, -119, -108}, + {1852, -83, -59}, + {2647, -36, 22}, + {1210, 43, 25}, + {-2714, -20, -63}, + {-2940, 158, 47}, + {-1602, 59, 50}, + {-155, -82, -101}, + {-132, 6, -13}, + {-510, 84, 37}, + {-2057, 116, 52} + }, + { + {2567, 51, -15}, + {-1084, -26, -20}, + {-3263, -37, 149}, + {401, 1, 113}, + {-2321, -51, -93}, + {2187, -12, -141}, + {1590, -5, -46}, + {2372, 49, 41}, + {1126, 27, 51}, + {-2365, -101, -102}, + {-2554, -43, 70}, + {-1381, -6, 37}, + {-107, -49, -136}, + {-354, -63, 41}, + {-380, -30, 61}, + {-1662, -20, 39} + }, + { + {2295, -12, 3}, + {-597, 93, -66}, + {-2706, -47, 70}, + {420, -141, 68}, + {-1994, 255, -49}, + {1820, 112, -51}, + {1195, -27, 11}, + {1981, -83, 72}, + {1068, -88, 29}, + {-2125, 284, -14}, + {-2070, -83, -11}, + {-1043, 46, 0}, + {-222, 139, -68}, + {-451, -47, 64}, + {-240, 0, 64}, + {-1120, 48, -26} + } }; -const Word32 FASTCONV_HOA2_latency_s_fx = 20833; - -const Word32 leftHRIRReal_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA] /* Q29 */= +const Word16 FASTCONV_factor_Q_HOA2_latency_s_fx = 31; +const Word32 FASTCONV_HOA2_latency_s_fx = 44739; +const Word16 FASTCONV_factor_Q_HOA2_fx = 14; +const Word16 leftHRIRReal_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]= { { - { 9749039, 528896224, 129120672, }, - { 41363756, -13267691, 139807088, }, - { 318364, 71011376, 4832, }, - { 4946192, 29243896, 2285460, }, - { 21379810, -23943906, -862215, }, - { 5953899, -15082851, 6302328, }, - { -30930744, 44672492, 2427730, }, - { 5499706, 15232638, -5888937, }, - { -57767848, 97858144, 28123982, }, - }, - { - { -81891064, -177112640, -130106368, }, - { -112628000, -683750720, -60143500, }, - { -6127308, 43266964, -7260642, }, - { -18372260, 7399692, 4738423, }, - { -6642167, 7949985, 20505784, }, - { 1736777, 44741748, 36746668, }, - { 1779190, -17669496, -35038880, }, - { 1783485, 40972376, 4261145, }, - { -8154533, -118214144, -70245800, }, - }, - { - { -12397960, -300077568, -81048184, }, - { -145049632, -316735584, -192968592, }, - { -1750199, 52096344, -8036958, }, - { -31417148, 57874148, -7852811, }, - { -45173928, 93462784, -3615289, }, - { -19227494, 151273584, -3310346, }, - { 62551368, -165313824, 10894185, }, - { -7194607, 46335716, 6969122, }, - { 112488416, -297701888, -26124676, }, - }, - { - { 140419120, 163395056, 61220464, }, - { 134698768, 418562272, 37772088, }, - { 12770012, 47600584, -16543677, }, - { 1829119, 44066900, -22123914, }, - { -33349348, 25675314, -30729954, }, - { -13965623, 83586504, -35370128, }, - { 68233608, -88068304, 41433548, }, - { -11814381, 19326816, -3059091, }, - { 176067360, -24274618, 67555000, }, - }, - { - { 193003488, 110340392, 58983324, }, - { 400174976, 27615030, 115993112, }, - { 35544612, -41037340, 13286481, }, - { 77038832, -66177928, 4207994, }, - { 52810916, -74782896, -8038032, }, - { 35016868, -65575024, 16007343, }, - { -10479720, 87943752, -12978317, }, - { 4599910, -13000866, 7131793, }, - { 59668372, 167397968, 11380053, }, - }, - { - { 88669064, -136434464, -13708462, }, - { 418985344, -219153392, 13563507, }, - { 23226110, -44473848, 13935021, }, - { 115305912, -11606612, 14061723, }, - { 143302128, 39595840, 14180908, }, - { 59085864, -36939404, 20780126, }, - { -87146496, 9683541, -25189446, }, - { 25008520, -13014288, 2070174, }, - { -136447888, -56905632, -32251446, }, - }, - { - { -95292440, 37550900, -37873020, }, - { 206629808, 110094504, -59848220, }, - { -19184546, 36173288, -7810935, }, - { 67421856, 33315524, 4643397, }, - { 158025808, 25906168, 14119168, }, - { 48429516, 45377940, -8228084, }, - { -113663088, -53688164, 4163434, }, - { 42060616, -12084964, -2563022, }, - { -283383008, -24645060, -13195213, }, - }, - { - { -248765584, 30539902, -11682848, }, - { -81042808, 14250165, -36664524, }, - { -54503672, 436476, -13678397, }, - { -51027432, -48062296, -1750736, }, - { 72271416, -56135760, 543850, }, - { 31731756, 13630079, -15043123, }, - { -97211216, -3755949, 17327508, }, - { 44042744, -1282048, 987843, }, - { -314783520, 26202522, 8887361, }, - }, - { - { -318032128, -23928874, 15863999, }, - { -309716544, -19851338, 11929272, }, - { -64207612, -32423782, -834834, }, - { -181705568, 34351684, -7874823, }, - { -67236640, 50014356, -11543261, }, - { 24249922, -23637352, 232465, }, - { -61846456, 13557064, 2641405, }, - { 22053046, 4669167, 2681670, }, - { -235416288, -29829084, 11263552, }, - }, - { - { -321614656, -7707319, 17708688, }, - { -441777120, -23812372, 24769076, }, - { -63085552, 4299799, 10666551, }, - { -257657776, 10072235, -4187056, }, - { -182311168, -965831, -9856950, }, - { 15317464, -2199023, 7827578, }, - { -19076098, 8660265, -5299453, }, - { -16952772, -20622286, 530428, }, - { -101074536, 27609660, 8037495, }, - }, - { - { -299877312, 14833206, 4658429, }, - { -501736992, 30001958, 10576894, }, - { -77060304, 21843666, 5098126, }, - { -255281040, -25045028, 6628745, }, - { -224941392, -25129854, 4932233, }, - { -10722923, 24297704, 745714, }, - { 21924198, -14825690, -2221035, }, - { -55880744, 8342974, -3590593, }, - { 24230058, -11106785, 2217814, }, - }, - { - { -273169056, 1380832, -3224447, }, - { -518796608, -5689758, 501974, }, - { -107435384, -11543261, -1205275, }, - { -200896560, 11400454, 8522826, }, - { -205748256, 6176163, 10351408, }, - { -54589572, -4134980, -2393908, }, - { 52939232, 5274220, -91268, }, - { -76335528, 8250096, -39192, }, - { 108715824, 4263829, -4214437, }, - }, - { - { -241493120, -13797582, -1484985, }, - { -506164576, -10208600, 1411971, }, - { -135031088, 2689187, -19864, }, - { -132891120, -9751186, 4269735, }, - { -159797472, -4487704, 4820027, }, - { -104600168, 5526013, 3636227, }, - { 68510096, -2899103, -59056, }, - { -75732088, -3214783, 3774203, }, - { 153326032, -4451197, -6740415, }, - }, - { - { -201953664, 13988172, 2484102, }, - { -468066080, 11743514, 3473555, }, - { -135009072, 6645925, 2597918, }, - { -76960984, 1656247, 299037, }, - { -114370144, 4749160, 1355599, }, - { -142927920, -12561169, 4122095, }, - { 65720516, -3194919, 500901, }, - { -61929132, -2405182, 1045288, }, - { 170837152, 9755481, -3670587, }, - }, - { - { -157771872, -7571491, 2987150, }, - { -409905760, -14218489, 3198140, }, - { -89839440, -11615202, 2513093, }, - { -38160248, -4485557, -2508798, }, - { -80043160, -2543695, -238908, }, - { -144927232, 1413044, 105227, }, - { 47504484, 7495792, 11811, }, - { -43118788, -5166309, -1449552, }, - { 169407472, 267362, 73551, }, - }, - { - { -114906480, 5610838, 980863, }, - { -342850592, 13112535, 2252174, }, - { -257698, 17945448, -1500554, }, - { -6269579, 9542880, -1308891, }, - { -49730352, 6022081, -804770, }, - { -96365104, 14963666, -2623151, }, - { 26508002, -3325915, 172872, }, - { -27319214, 7948911, 848256, }, - { 152526096, -7221988, -119722, }, - }, - { - { -76454176, -6929930, -69256, }, - { -279726400, -11549704, 1301375, }, - { 114208552, -28898688, -3926137, }, - { 26892938, -5211406, -841277, }, - { -12193949, -7994545, -1019518, }, - { -7168301, -27730456, -2589865, }, - { 18780818, -313533, 1094143, }, - { -20258824, -345208, 3060164, }, - { 125984272, 8527658, -1406065, }, - }, - { - { -41962904, 7059316, 128849, }, - { -228333344, 8655970, 1010928, }, - { 219166272, 28090696, -1050656, }, - { 62499828, 7261179, -2414309, }, - { 36138928, 10872173, -2019708, }, - { 89954328, 27792196, 466541, }, - { 36580772, 5089000, 663036, }, - { -18362596, -4509179, 2020245, }, - { 97064112, -6015639, -1931662, }, - }, - { - { -8992588, -6510634, 267362, }, - { -190033520, -4474819, 350577, }, - { 278282752, -5998459, 1591285, }, - { 95040112, -10720775, -1452236, }, - { 88483840, -14305462, -1738388, }, - { 153659440, -6827925, 2048699, }, - { 83558592, -11030550, -993211, }, - { -8813273, 2103460, -952409, }, - { 71897216, 1779190, -978179, }, - }, - { - { 24793772, 6630893, -18254, }, - { -160462656, 4852776, -434865, }, - { 274668512, -17280800, -1229971, }, - { 113483776, 2928631, 500901, }, - { 129502928, 8119099, -592169, }, - { 157575904, -15821586, -1637993, }, - { 150618064, 16231755, -2345052, }, - { 22151294, 10189273, -2437931, }, - { 53149148, 1124208, 1559073, }, - }, - { - { 59917480, -7263864, -350040, }, - { -132440688, -8647917, 547608, }, - { 222252208, 20497194, -5111011, }, - { 109086800, 9399536, -1176284, }, - { 144204064, 1976759, -942208, }, - { 105299712, 19787452, -5240397, }, - { 215895664, -14326937, -2713883, }, - { 77865072, -19022410, -732829, }, - { 40236328, 4224101, 2659659, }, - }, - { - { 94547264, 7210713, -514322, }, - { -99481104, 9044127, 2510945, }, - { 154022352, -10442139, -4019553, }, - { 82563768, -8490077, -3492345, }, - { 128416840, -6362457, -1036161, }, - { 22603340, -12644921, -2655901, }, - { 252400736, 6924561, -1945620, }, - { 145012592, 13919989, -82678, }, - { 31737660, -10970420, -1664837, }, - }, - { - { 125645512, -7259569, -85899, }, - { -56863756, -4744328, 1486596, }, - { 99314136, 4427575, -335007, }, - { 41075992, 3167539, -968515, }, - { 89500672, 12156905, -797253, }, - { -60453812, 10972568, 2783139, }, - { 242034288, 3270618, 1074816, }, - { 200968496, -7325604, -2245731, }, - { 27202176, -1326071, -5287642, }, - }, - { - { 150700208, 4634807, 561030, }, - { -1191853, 8886824, -2146410, }, - { 70675296, -2062658, 1005022, }, - { -8423505, -8847096, 2709588, }, - { 41706816, -12612171, -1906429, }, - { -119930520, -13067438, 3780645, }, - { 186179856, -22568980, 1925219, }, - { 224940864, 2801929, -3001645, }, - { 21487184, 13031468, 194347, }, - }, - { - { 169636176, -1192927, 61203, }, - { 66094176, -19737522, -2557653, }, - { 63994476, -1108102, 530428, }, - { -57278220, 13596256, 2472291, }, - { -166430, 4035659, -1475321, }, - { -140860976, 5550172, 35970, }, - { 109537232, 28074054, -2848100, }, - { 204103296, 8996883, -2008434, }, - { 1818919, 4411469, 6263673, }, - }, - { - { 185916256, 1898376, -1018981, }, - { 133667976, 19608674, 745714, }, - { 64880312, 1573569, 387621, }, - { -92978528, -8923868, 155156, }, - { -29435022, -97174, 1298154, }, - { -120988152, 12420509, -1513976, }, - { 49056580, -7981660, -5492190, }, - { 139661056, -18445274, -1324997, }, - { -36724656, -22808960, 2743947, }, - }, - { - { 203936864, -5097053, -1052804, }, - { 185728880, -7454453, 2333778, }, - { 58489400, 863825, 1222455, }, - { -104674256, -2811593, -115964, }, - { -48657148, 3922916, 2414309, }, - { -75116832, -19784230, 1840930, }, - { 26552024, -8952859, -2214593, }, - { 48134772, 21822728, -685047, }, - { -79321064, 15090904, -3412889, }, - }, - { - { 225228624, 6438156, -157303, }, - { 214688240, -3755412, -329102, }, - { 38261716, -7221451, 1816234, }, - { -90862184, 8681203, 1593433, }, - { -62400508, -5262409, 942745, }, - { -28787556, 9220758, 4382478, }, - { 34985728, 13614509, 2888903, }, - { -46410880, -20306068, -564251, }, - { -104572792, 3867618, -2895345, }, - }, - { - { 247859344, -4959614, 399432, }, - { 227028208, 1579474, -3234110, }, - { 9644886, 10700911, 573378, }, - { -60634200, -7675107, 1981591, }, - { -72839960, 2655364, -490163, }, - { -729608, 4192962, 1942936, }, - { 48766132, -369367, 4420595, }, - { -121884192, 11087995, -140660, }, - { -103912440, -11213086, 2019172, }, - }, - { - { 268726976, 2394444, -181999, }, - { 235657344, 4387846, -2889439, }, - { -13455596, -6493991, -1464047, }, - { -25911538, 8749385, 2221035, }, - { -79648024, 3604551, 1035087, }, - { 8626979, -6051072, -2256469, }, - { 45754824, -10596758, 946503, }, - { -166654400, -1146756, 1919850, }, - { -84939960, 6331319, 4582730, }, - }, - { - { 286211264, -2729452, -953483, }, - { 248872416, -8239358, -294742, }, - { -18828062, -4189741, -1525787, }, - { 4614406, -1637456, 1565516, }, - { -82404856, 1227824, 2612951, }, - { 11445014, 180926, -4145717, }, - { 21737904, 12543452, -3052111, }, - { -182342832, -2155000, 4099010, }, - { -60702920, 1326608, 2131378, }, - }, - { - { 300383040, 3500935, -717796, }, - { 266191872, 3493956, 970663, }, - { -5042829, 10755135, 1197222, }, - { 30651570, 2687576, -321586, }, - { -79362408, -2752537, 858457, }, - { 18897856, 9425306, -1945083, }, - { -14038101, -5513665, -3498788, }, - { -178168672, -1279363, 3287261, }, - { -37468756, 3229816, -508954, }, - }, - { - { 311666464, -2198487, -265214, }, - { 283031360, -1918777, 70330, }, - { 18464064, -6590091, 3395172, }, - { 58261768, -4366908, -1492501, }, - { -66921496, -2005750, -1306744, }, - { 31464394, -7336341, 1821066, }, - { -51994876, 2715493, -710817, }, - { -161833296, -2287607, 964220, }, - { -14486388, -4322885, -715649, }, - }, - { - { 320947872, 1425929, -280247, }, - { 296547616, 1778653, -544387, }, - { 40380208, -2829847, 1201517, }, - { 91574608, 9750650, -1528472, }, - { -45061724, 9525701, -755377, }, - { 41256384, -2624225, 1612223, }, - { -89262840, -4065724, 2160369, }, - { -137527536, 5949067, 293668, }, - { 10603201, 5882495, -712428, }, - }, - { - { 329596320, -1290101, -507343, }, - { 306918912, -2180233, -387621, }, - { 56913684, -266288, -2163590, }, - { 127935800, -9903658, -440771, }, - { -20552492, -7883413, 1342714, }, - { 43283608, 3977677, -1141388, }, - { -126284920, 9459129, 2925410, }, - { -109121696, -6815576, 498753, }, - { 38045356, -5915244, -879931, }, - }, - { - { 338755872, 1985349, -662499, }, - { 316944416, 1728188, -217970, }, - { 70156144, 6400038, -1461900, }, - { 158782800, 7256347, 613643, }, - { -2733747, 1930588, 1903207, }, - { 38901128, 146029, -1503239, }, - { -160943168, -12184822, 650151, }, - { -80698680, 6174553, 687195, }, - { 63547800, 6309844, -729608, }, - }, - { - { 348667584, -2622078, -528281, }, - { 330204608, -2903398, -394600, }, - { 80498424, -3464428, 624918, }, - { 176407184, -212064, 684510, }, - { 4530117, 2791192, 780610, }, - { 31255550, -34360, 15569, }, - { -186284000, 3796214, -1058710, }, - { -56010132, -4271882, 649077, }, - { 80058728, -2265595, -424128, }, - }, - { - { 358330208, 2345589, -273267, }, - { 348918848, 4343823, -594853, }, - { 86404544, -1669669, 192200, }, - { 179864640, -3940633, -735513, }, - { 5645735, -2221572, -545461, }, - { 22848690, -2136746, 548682, }, - { -196971488, 3864397, 570157, }, - { -36806796, 2615098, 387621, }, - { 82155208, -1394791, -471373, }, - }, - { - { 366297888, -1524177, -97711, }, - { 372433248, -5732171, -681826, }, - { 87542704, 938987, -1042066, }, - { 175921328, 2347200, -1906429, }, - { 9195525, -777926, -1210107, }, - { 15777025, 1827509, 136365, }, - { -195313632, -2768643, 2332167, }, - { -22068616, -1083942, -295816, }, - { 69850128, 4421669, -359704, }, - }, - { - { 371749280, 51003, -288300, }, - { 397624864, 6229850, -351650, }, - { 84823456, 1105954, -449361, }, - { 173494128, 2942590, -1049583, }, - { 21438330, 6756521, -438624, }, - { 11614665, -5369, 123480, }, - { -188027232, -225486, 1703491, }, - { -8943196, 3022583, -632434, }, - { 48287780, -6484864, -573915, }, - }, - { - { 375091296, 123480, -765041, }, - { 420282944, -3861713, -207769, }, - { 79324824, 1246077, 565862, }, - { 177637696, -3994320, 930934, }, - { 42110008, -7602629, 1375463, }, - { 11107859, -586800, 499290, }, - { -180578672, 130997, 265751, }, - { 4147328, -2578054, -663572, }, - { 25565792, 4443681, -760746, }, - }, - { - { 377552320, 1293322, -671089, }, - { 437537440, 1720134, -741956, }, - { 72594072, -5038534, -627602, }, - { 187999840, -449898, 470836, }, - { 65652872, 2403034, 1189706, }, - { 13804562, -1540283, -333397, }, - { -174902880, 2426657, 401579, }, - { 16455093, 4543002, -142808, }, - { 8400419, -1613297, -322659, }, - }, - { - { 379801824, -1159104, -98784, }, - { 449000192, -762357, -1505923, }, - { 66756140, 1897302, -2478733, }, - { 202493216, -1679332, -1592359, }, - { 87476672, -1024350, -1014686, }, - { 18439368, -616328, -1715839, }, - { -170510208, -614717, 1108638, }, - { 25653302, -1463510, 585726, }, - { -814970, -1081258, 744103, }, - }, - { - { 381884864, 102005, 62277, }, - { 456018144, 2931852, -1144609, }, - { 61858268, 3501472, -1437203, }, - { 218079648, 5225365, -1717987, }, - { 106423384, 4740570, -1769527, }, - { 22399866, 3916473, -964757, }, - { -165222560, -275415, 569620, }, - { 30270930, -994285, 135291, }, - { -3977677, -1443109, 878321, }, - }, - { - { 384165504, 471373, -382252, }, - { 459639360, -1001264, -163209, }, - { 53535156, 277025, 810675, }, - { 229669088, -4628364, -55298, }, - { 121935192, -5230734, -398358, }, - { 20921322, 307627, 477815, }, - { -155960992, -2059974, -151398, }, - { 32400696, 1212255, -745177, }, - { -3812857, 365609, 27380, }, - }, - { - { 387472608, 773094, -761820, }, - { 460596576, -1338956, -388158, }, - { 37011880, -8176544, 218506, }, - { 232414640, -2472828, 367757, }, - { 132566312, 363998, 61740, }, - { 10568841, -6884296, -514322, }, - { -141396224, 5043366, 133144, }, - { 35882304, 890132, -1221381, }, - { -1747515, 906775, -19864, }, - }, - { - { 392298016, -2099165, -467078, }, - { 460876832, 654983, -1044751, }, - { 12603045, 8705899, -2084670, }, - { 225417056, 5970542, -1477469, }, - { 137805104, 1513976, -1142461, }, - { -7254737, 6248641, -2473364, }, - { -123040072, -5198521, 973884, }, - { 43224012, -3112778, -925029, }, - { 770410, 405874, -242129, }, - }, - { - { 398138112, 1664837, -5906, }, - { 462098752, -161061, -1531693, }, - { -15297063, -1983201, -1540283, }, - { 212177296, -1755568, -2101313, }, - { 138299024, 763430, -1508607, }, - { -28484760, -306016, -1535451, }, - { -104152424, 1582159, 476741, }, - { 53592600, 3449396, -330712, }, - { 2964601, 1447941, -306016, }, - }, - { - { 404148384, -311922, -176094, }, - { 464220992, -1423782, -1687922, }, - { -42546484, -2144799, 3101503, }, - { 196518384, -3173444, 1027034, }, - { 134805600, -4870493, 1206886, }, - { -49714248, -2751464, 2964601, }, - { -87270512, -921807, -1372779, }, - { 64223720, -2987150, 277025, }, - { 4530654, -2358474, 919123, }, - }, - { - { 409720000, -462783, -1084479, }, - { 466352928, 2785286, -731755, }, - { -65998616, -1939178, 7927436, }, - { 181019984, 2525978, 6302328, }, - { 129010616, 4121021, 6409165, }, - { -67529768, -2459406, 6993818, }, - { -73590504, 3739306, -1999844, }, - { 73398304, 1053341, 575526, }, - { 5841693, 808528, 2232309, }, - }, + {298, 16141, 3940}, + {1262, -405, 4267}, + {10, 2167, 0}, + {151, 892, 70}, + {652, -731, -26}, + {182, -460, 192}, + {-944, 1363, 74}, + {168, 465, -180}, + {-1763, 2986, 858} + }, + { + {-2499, -5405, -3971}, + {-3437, -20866, -1835}, + {-187, 1320, -222}, + {-561, 226, 145}, + {-203, 243, 626}, + {53, 1365, 1121}, + {54, -539, -1069}, + {54, 1250, 130}, + {-249, -3608, -2144} + }, + { + {-378, -9158, -2473}, + {-4427, -9666, -5889}, + {-53, 1590, -245}, + {-959, 1766, -240}, + {-1379, 2852, -110}, + {-587, 4617, -101}, + {1909, -5045, 332}, + {-220, 1414, 213}, + {3433, -9085, -797} + }, + { + {4285, 4986, 1868}, + {4111, 12774, 1153}, + {390, 1453, -505}, + {56, 1345, -675}, + {-1018, 784, -938}, + {-426, 2551, -1079}, + {2082, -2688, 1264}, + {-361, 590, -93}, + {5373, -741, 2062} + }, + { + {5890, 3367, 1800}, + {12212, 843, 3540}, + {1085, -1252, 405}, + {2351, -2020, 128}, + {1612, -2282, -245}, + {1069, -2001, 489}, + {-320, 2684, -396}, + {140, -397, 218}, + {1821, 5109, 347} + }, + { + {2706, -4164, -418}, + {12786, -6688, 414}, + {709, -1357, 425}, + {3519, -354, 429}, + {4373, 1208, 433}, + {1803, -1127, 634}, + {-2659, 296, -769}, + {763, -397, 63}, + {-4164, -1737, -984} + }, + { + {-2908, 1146, -1156}, + {6306, 3360, -1826}, + {-585, 1104, -238}, + {2058, 1017, 142}, + {4823, 791, 431}, + {1478, 1385, -251}, + {-3469, -1638, 127}, + {1284, -369, -78}, + {-8648, -752, -403} + }, + { + {-7592, 932, -357}, + {-2473, 435, -1119}, + {-1663, 13, -417}, + {-1557, -1467, -53}, + {2206, -1713, 17}, + {968, 416, -459}, + {-2967, -115, 529}, + {1344, -39, 30}, + {-9606, 800, 271} + }, + { + {-9706, -730, 484}, + {-9452, -606, 364}, + {-1959, -990, -25}, + {-5545, 1048, -240}, + {-2052, 1526, -352}, + {740, -721, 7}, + {-1887, 414, 81}, + {673, 142, 82}, + {-7184, -910, 344} + }, + { + {-9815, -235, 540}, + {-13482, -727, 756}, + {-1925, 131, 326}, + {-7863, 307, -128}, + {-5564, -29, -301}, + {467, -67, 239}, + {-582, 264, -162}, + {-517, -629, 16}, + {-3085, 843, 245} + }, + { + {-9152, 453, 142}, + {-15312, 916, 323}, + {-2352, 667, 156}, + {-7791, -764, 202}, + {-6865, -767, 151}, + {-327, 742, 23}, + {669, -452, -68}, + {-1705, 255, -110}, + {739, -339, 68} + }, + { + {-8336, 42, -98}, + {-15832, -174, 15}, + {-3279, -352, -37}, + {-6131, 348, 260}, + {-6279, 188, 316}, + {-1666, -126, -73}, + {1616, 161, -3}, + {-2330, 252, -1}, + {3318, 130, -129} + }, + { + {-7370, -421, -45}, + {-15447, -312, 43}, + {-4121, 82, -1}, + {-4056, -298, 130}, + {-4877, -137, 147}, + {-3192, 169, 111}, + {2091, -88, -2}, + {-2311, -98, 115}, + {4679, -136, -206} + }, + { + {-6163, 427, 76}, + {-14284, 358, 106}, + {-4120, 203, 79}, + {-2349, 51, 9}, + {-3490, 145, 41}, + {-4362, -383, 126}, + {2006, -98, 15}, + {-1890, -73, 32}, + {5214, 298, -112} + }, + { + {-4815, -231, 91}, + {-12509, -434, 98}, + {-2742, -354, 77}, + {-1165, -137, -77}, + {-2443, -78, -7}, + {-4423, 43, 3}, + {1450, 229, 0}, + {-1316, -158, -44}, + {5170, 8, 2} + }, + { + {-3507, 171, 30}, + {-10463, 400, 69}, + {-8, 548, -46}, + {-191, 291, -40}, + {-1518, 184, -25}, + {-2941, 457, -80}, + {809, -101, 5}, + {-834, 243, 26}, + {4655, -220, -4} + }, + { + {-2333, -211, -2}, + {-8537, -352, 40}, + {3485, -882, -120}, + {821, -159, -26}, + {-372, -244, -31}, + {-219, -846, -79}, + {573, -10, 33}, + {-618, -11, 93}, + {3845, 260, -43} + }, + { + {-1281, 215, 4}, + {-6968, 264, 31}, + {6688, 857, -32}, + {1907, 222, -74}, + {1103, 332, -62}, + {2745, 848, 14}, + {1116, 155, 20}, + {-560, -138, 62}, + {2962, -184, -59} + }, + { + {-274, -199, 8}, + {-5799, -137, 11}, + {8493, -183, 49}, + {2900, -327, -44}, + {2700, -437, -53}, + {4689, -208, 63}, + {2550, -337, -30}, + {-269, 64, -29}, + {2194, 54, -30} + }, + { + {757, 202, -1}, + {-4897, 148, -13}, + {8382, -527, -38}, + {3463, 89, 15}, + {3952, 248, -18}, + {4809, -483, -50}, + {4596, 495, -72}, + {676, 311, -74}, + {1622, 34, 48} + }, + { + {1829, -222, -11}, + {-4042, -264, 17}, + {6783, 626, -156}, + {3329, 287, -36}, + {4401, 60, -29}, + {3213, 604, -160}, + {6589, -437, -83}, + {2376, -581, -22}, + {1228, 129, 81} + }, + { + {2885, 220, -16}, + {-3036, 276, 77}, + {4700, -319, -123}, + {2520, -259, -107}, + {3919, -194, -32}, + {690, -386, -81}, + {7703, 211, -59}, + {4425, 425, -3}, + {969, -335, -51} + }, + { + {3834, -222, -3}, + {-1735, -145, 45}, + {3031, 135, -10}, + {1254, 97, -30}, + {2731, 371, -24}, + {-1845, 335, 85}, + {7386, 100, 33}, + {6133, -224, -69}, + {830, -40, -161} + }, + { + {4599, 141, 17}, + {-36, 271, -65}, + {2157, -63, 31}, + {-257, -270, 83}, + {1273, -385, -58}, + {-3660, -399, 115}, + {5682, -689, 59}, + {6865, 86, -92}, + {656, 398, 6} + }, + { + {5177, -36, 2}, + {2017, -602, -78}, + {1953, -34, 16}, + {-1748, 415, 75}, + {-5, 123, -45}, + {-4299, 169, 1}, + {3343, 857, -87}, + {6229, 275, -61}, + {56, 135, 191} + }, + { + {5674, 58, -31}, + {4079, 598, 23}, + {1980, 48, 12}, + {-2837, -272, 5}, + {-898, -3, 40}, + {-3692, 379, -46}, + {1497, -244, -168}, + {4262, -563, -40}, + {-1121, -696, 84} + }, + { + {6224, -156, -32}, + {5668, -227, 71}, + {1785, 26, 37}, + {-3194, -86, -4}, + {-1485, 120, 74}, + {-2292, -604, 56}, + {810, -273, -68}, + {1469, 666, -21}, + {-2421, 461, -104} + }, + { + {6873, 196, -5}, + {6552, -115, -10}, + {1168, -220, 55}, + {-2773, 265, 49}, + {-1904, -161, 29}, + {-879, 281, 134}, + {1068, 415, 88}, + {-1416, -620, -17}, + {-3191, 118, -88} + }, + { + {7564, -151, 12}, + {6928, 48, -99}, + {294, 327, 17}, + {-1850, -234, 60}, + {-2223, 81, -15}, + {-22, 128, 59}, + {1488, -11, 135}, + {-3720, 338, -4}, + {-3171, -342, 62} + }, + { + {8201, 73, -6}, + {7192, 134, -88}, + {-411, -198, -45}, + {-791, 267, 68}, + {-2431, 110, 32}, + {263, -185, -69}, + {1396, -323, 29}, + {-5086, -35, 59}, + {-2592, 193, 140} + }, + { + {8734, -83, -29}, + {7595, -251, -9}, + {-575, -128, -47}, + {141, -50, 48}, + {-2515, 37, 80}, + {349, 6, -127}, + {663, 383, -93}, + {-5565, -66, 125}, + {-1853, 40, 65} + }, + { + {9167, 107, -22}, + {8124, 107, 30}, + {-154, 328, 37}, + {935, 82, -10}, + {-2422, -84, 26}, + {577, 288, -59}, + {-428, -168, -107}, + {-5437, -39, 100}, + {-1143, 99, -16} + }, + { + {9511, -67, -8}, + {8637, -59, 2}, + {563, -201, 104}, + {1778, -133, -46}, + {-2042, -61, -40}, + {960, -224, 56}, + {-1587, 83, -22}, + {-4939, -70, 29}, + {-442, -132, -22} + }, + { + {9795, 44, -9}, + {9050, 54, -17}, + {1232, -86, 37}, + {2795, 298, -47}, + {-1375, 291, -23}, + {1259, -80, 49}, + {-2724, -124, 66}, + {-4197, 182, 9}, + {324, 180, -22} + }, + { + {10058, -39, -15}, + {9366, -67, -12}, + {1737, -8, -66}, + {3904, -302, -13}, + {-627, -241, 41}, + {1321, 121, -35}, + {-3854, 289, 89}, + {-3330, -208, 15}, + {1161, -181, -27} + }, + { + {10338, 61, -20}, + {9672, 53, -7}, + {2141, 195, -45}, + {4846, 221, 19}, + {-83, 59, 58}, + {1187, 4, -46}, + {-4912, -372, 20}, + {-2463, 188, 21}, + {1939, 193, -22} + }, + { + {10640, -80, -16}, + {10077, -89, -12}, + {2457, -106, 19}, + {5384, -6, 21}, + {138, 85, 24}, + {954, -1, 0}, + {-5685, 116, -32}, + {-1709, -130, 20}, + {2443, -69, -13} + }, + { + {10935, 72, -8}, + {10648, 133, -18}, + {2637, -51, 6}, + {5489, -120, -22}, + {172, -68, -17}, + {697, -65, 17}, + {-6011, 118, 17}, + {-1123, 80, 12}, + {2507, -43, -14} + }, + { + {11179, -47, -3}, + {11366, -175, -21}, + {2672, 29, -32}, + {5369, 72, -58}, + {281, -24, -37}, + {481, 56, 4}, + {-5960, -84, 71}, + {-673, -33, -9}, + {2132, 135, -11} + }, + { + {11345, 2, -9}, + {12135, 190, -11}, + {2589, 34, -14}, + {5295, 90, -32}, + {654, 206, -13}, + {354, 0, 4}, + {-5738, -7, 52}, + {-273, 92, -19}, + {1474, -198, -18} + }, + { + {11447, 4, -23}, + {12826, -118, -6}, + {2421, 38, 17}, + {5421, -122, 28}, + {1285, -232, 42}, + {339, -18, 15}, + {-5511, 4, 8}, + {127, -79, -20}, + {780, 136, -23} + }, + { + {11522, 39, -20}, + {13353, 52, -23}, + {2215, -154, -19}, + {5737, -14, 14}, + {2004, 73, 36}, + {421, -47, -10}, + {-5338, 74, 12}, + {502, 139, -4}, + {256, -49, -10} + }, + { + {11591, -35, -3}, + {13702, -23, -46}, + {2037, 58, -76}, + {6180, -51, -49}, + {2670, -31, -31}, + {563, -19, -52}, + {-5204, -19, 34}, + {783, -45, 18}, + {-25, -33, 23} + }, + { + {11654, 3, 2}, + {13917, 89, -35}, + {1888, 107, -44}, + {6655, 159, -52}, + {3248, 145, -54}, + {684, 120, -29}, + {-5042, -8, 17}, + {924, -30, 4}, + {-121, -44, 27} + }, + { + {11724, 14, -12}, + {14027, -31, -5}, + {1634, 8, 25}, + {7009, -141, -2}, + {3721, -160, -12}, + {638, 9, 15}, + {-4760, -63, -5}, + {989, 37, -23}, + {-116, 11, 1} + }, + { + {11825, 24, -23}, + {14056, -41, -12}, + {1130, -250, 7}, + {7093, -75, 11}, + {4046, 11, 2}, + {323, -210, -16}, + {-4315, 154, 4}, + {1095, 27, -37}, + {-53, 28, -1} + }, + { + {11972, -64, -14}, + {14065, 20, -32}, + {385, 266, -64}, + {6879, 182, -45}, + {4205, 46, -35}, + {-221, 191, -75}, + {-3755, -159, 30}, + {1319, -95, -28}, + {24, 12, -7} + }, + { + {12150, 51, 0}, + {14102, -5, -47}, + {-467, -61, -47}, + {6475, -54, -64}, + {4221, 23, -46}, + {-869, -9, -47}, + {-3178, 48, 15}, + {1636, 105, -10}, + {90, 44, -9} + }, + { + {12334, -10, -5}, + {14167, -43, -52}, + {-1298, -65, 95}, + {5997, -97, 31}, + {4114, -149, 37}, + {-1517, -84, 90}, + {-2663, -28, -42}, + {1960, -91, 8}, + {138, -72, 28} + }, + { + {12504, -14, -33}, + {14232, 85, -22}, + {-2014, -59, 242}, + {5524, 77, 192}, + {3937, 126, 196}, + {-2061, -75, 213}, + {-2246, 114, -61}, + {2240, 32, 18}, + {178, 25, 68} + } }; -const Word32 leftHRIRImag_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA] /* Q29 */= +const Word16 leftHRIRImag_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]= { { - { -36158792, 332589920, -120427664, }, - { -74782896, 414234016, -138564768, }, - { -1993402, 15385110, -4536559, }, - { -12910672, 37127308, -11034308, }, - { -13785771, -13972065, 10325638, }, - { -5334350, -5939403, 4061429, }, - { 18512920, 23427972, -15831786, }, - { 3295314, -46312096, 20517058, }, - { 24953760, 133811320, -62957780, }, - }, - { - { 6790344, 394416512, -99059128, }, - { -59612536, 289198400, -180918512, }, - { -1410360, -11168526, -15667504, }, - { -16600585, 2608119, -22172232, }, - { -27442156, -41982232, 5173288, }, - { -8725226, -15491410, 4438849, }, - { 45414448, 82660944, -348966, }, - { -9163313, -111122616, -6783901, }, - { 88319024, 252158064, -29414620, }, - }, - { - { 119840864, -172064448, 92515208, }, - { 175912736, -498648928, 68749008, }, - { 10392747, -39891656, -8267812, }, - { 18903224, -44296144, -11482058, }, - { -1028108, 10605348, -22429930, }, - { 5090610, -2387465, -3582003, }, - { 21121038, 29187524, 28092308, }, - { -8322036, -78509320, -20295332, }, - { 75277352, 6205154, 71450536, }, - }, - { - { 84888952, -211159920, 71064528, }, - { 293597536, -167443600, 152749440, }, - { 16649441, 19593640, 12747463, }, - { 57636852, 42297376, 10699837, }, - { 63173064, 90405304, -7914014, }, - { 33967284, 71368936, 15578920, }, - { -59171228, -125028112, -14110578, }, - { 14133127, -4103305, 8483097, }, - { -83939768, -238660064, 3744138, }, - }, - { - { -84856208, 160208720, -34959960, }, - { 96670048, 340704192, -7391102, }, - { -6153078, 38164004, 9969156, }, - { 40164924, 26005490, 17468706, }, - { 94673424, -9172976, 21439402, }, - { 38052336, 47195784, 23022098, }, - { -105601432, -51099912, -31717796, }, - { 23212688, 3580392, 1049583, }, - { -236426672, 242666, -52827024, }, - }, - { - { -241306288, 23081692, -47294568, }, - { -241835648, -76635640, -87011208, }, - { -44483512, -43661564, -12531641, }, - { -49227304, -61918932, 1545115, }, - { 32010928, -61011620, 12165495, }, - { 1369558, -61596812, -11496017, }, - { -72386304, 68689408, 8167954, }, - { 21155936, -1467805, -432718, }, - { -245244240, 94062472, -9156333, }, - }, - { - { -279724256, -83891984, 187905, }, - { -487956064, -96942784, -27740120, }, - { -58395448, -28610388, -14624901, }, - { -154616144, 24776592, -8514773, }, - { -93974960, 58441620, -6685654, }, - { -32097364, -23796804, -18185966, }, - { -4830765, -6265821, 21151104, }, - { 2374043, -548145, 2821257, }, - { -121094456, -55359980, 19837918, }, - }, - { - { -199590352, 46742664, 28198070, }, - { -542467776, 70228080, 36100812, }, - { -38022272, 34528316, 4661114, }, - { -204685792, -340913, -7135015, }, - { -201704016, -17952964, -12763569, }, - { -43963284, 32239098, 4910222, }, - { 53434760, -29083372, 1289564, }, - { -29628296, -16311749, 2477659, }, - { 61041148, 25417616, 12723304, }, - }, - { - { -71485976, 3439732, 18509162, }, - { -449389952, 750546, 36375688, }, - { -10520522, -7513509, 13849659, }, - { -164350688, -39578124, -1079111, }, - { -224162400, -27566710, -6024766, }, - { -51943336, 8273181, 13044889, }, - { 88907968, -7683160, -11099806, }, - { -59125056, 6847252, -629750, }, - { 213081920, -12068321, 914291, }, - }, - { - { 40884868, -8075076, -3076807, }, - { -300000768, -8685498, 6082211, }, - { 957241, -27275726, 4496831, }, - { -53774600, 43806520, 8965744, }, - { -154083568, 52445308, 9099962, }, - { -69969312, -27617176, 1512902, }, - { 104226512, 15185931, -3274913, }, - { -69255272, -3904662, -2665027, }, - { 282055872, -6979859, -5660230, }, - }, - { - { 122261072, -14564234, -10473278, }, - { -150754960, -24950538, -8772471, }, - { 3320010, 4095788, -5724655, }, - { 66658428, -11882027, 7962333, }, - { -44114684, -12880607, 12540231, }, - { -90301152, 203474, -4349728, }, - { 99475200, 3833258, 1317481, }, - { -53058952, -18649822, -327491, }, - { 271441408, 13378286, -8655433, }, - }, - { - { 185318720, 23846196, -4557497, }, - { -15679852, 37565396, -4328254, }, - { 21893596, 13773960, -2983392, }, - { 150678720, 46171, -1040993, }, - { 48956720, -813896, 947577, }, - { -95590400, 9763534, 1977296, }, - { 79202416, -6300180, 253403, }, - { -18629420, 9327058, 4054449, }, - { 217019872, -10098542, -7290707, }, - }, - { - { 240183168, -16076599, 1266479, }, - { 105487080, -26186416, 283468, }, - { 70551816, -16828218, 678605, }, - { 189024736, -49392, -4967130, }, - { 105314744, -5423470, -4425964, }, - { -74048992, -757525, 2923262, }, - { 50586124, 7173133, 416612, }, - { 16224239, 1275605, 724239, }, - { 151719184, 2614025, -1576790, }, - }, - { - { 286097440, 4743792, 1162862, }, - { 210780352, 18678812, -364535, }, - { 145435648, 16265578, -83752, }, - { 195911168, -2299418, -5272073, }, - { 130978784, 1410360, -3964255, }, - { -19889456, 9549323, -2411087, }, - { 22510998, -8150774, -128312, }, - { 42030012, 3780645, -2588255, }, - { 89983856, -10215043, 2976949, }, - }, - { - { 319378048, -1308891, -1722282, }, - { 293717792, -12847321, -1720134, }, - { 224754560, -12506408, -3513820, }, - { 192708208, -6009196, -2883534, }, - { 143904496, -4290673, -3185792, }, - { 58067420, -21905944, -4212826, }, - { 7643431, 352724, -487479, }, - { 56253336, -7172059, -274341, }, - { 34664680, 15397458, 1792075, }, - }, - { - { 340915712, 3598109, -2687576, }, - { 349467520, 7507603, -2401961, }, - { 278644064, 11220065, -4716948, }, - { 190083440, 34897, -506806, }, - { 157392304, 4962298, -2032593, }, - { 131253128, 19497540, -2294050, }, - { 14569066, 4827007, 163746, }, - { 60362544, -1574642, 1777043, }, - { -10620380, -9889162, -326418, }, - }, - { - { 355079968, -3677566, -1744294, }, - { 381102656, -4260071, -2215130, }, - { 281619392, -1296006, -1116692, }, - { 185217248, 2087354, -1416802, }, - { 170087152, -3240553, -1831804, }, - { 165204304, -6737730, 682900, }, - { 41253696, -6271189, -472446, }, - { 62204012, 4499515, -101469, }, - { -42043436, 3895535, -408559, }, - }, - { - { 366027840, 2317672, -1134945, }, - { 397606592, 1345399, -2006824, }, - { 223802160, -20542828, 1700807, }, - { 171571600, -425202, -704912, }, - { 171730512, 1431298, -1205275, }, - { 138801536, -16011638, 1830193, }, - { 75993000, 6881612, -2061047, }, - { 72658496, 653909, -2717104, }, - { -58964532, 883153, 773631, }, - }, - { - { 375740384, -1729261, -1239098, }, - { 409371584, -2474438, -2047626, }, - { 121028960, 34863860, -778463, }, - { 143039056, 6924024, 1210644, }, - { 151491552, 5535676, 226560, }, - { 58364848, 31437014, -1287953, }, - { 100377680, -5044439, -2580739, }, - { 95764888, -8861591, -3254512, }, - { -64630132, -1622961, 2194728, }, - }, - { - { 383609824, 1746441, -1296006, }, - { 424501696, 6113886, -1065689, }, - { 11184632, -24941948, -3841848, }, - { 99827928, -15702937, 8590, }, - { 106059384, -15424838, -74088, }, - { -42509976, -23139674, -3684545, }, - { 95006288, -2285996, -1535988, }, - { 122857000, 11319923, -1122060, }, - { -64195804, -1420560, 2232309, }, - }, - { - { 387407136, -675384, -1110786, }, - { 446154208, -5822902, 92879, }, - { -67740760, 4913980, -1846299, }, - { 51632488, 11216307, -2097018, }, - { 45219028, 14675366, -887448, }, - { -123440048, 5479842, -469762, }, - { 48671644, 12622372, 137439, }, - { 134595152, 173409, 71404, }, - { -62093952, 6441377, -1045288, }, - }, - { - { 385254816, -637803, -812286, }, - { 473090112, 2037425, -1216550, }, - { -99903624, 4727149, 2258616, }, - { 11749957, 366146, 526134, }, - { -13227962, -10634339, -147103, }, - { -159256848, 3637301, 4543539, }, - { -32711544, -19771882, 2049236, }, - { 113054816, -12186970, -1802276, }, - { -60602524, 2531346, -3322157, }, - }, - { - { 377351520, 2255932, -482647, }, - { 501648416, -3520263, -4013647, }, - { -94568200, -5376226, 3605625, }, - { -11883638, 1945620, 3943854, }, - { -54005992, 6682969, 72478, }, - { -146007408, -3005403, 4282620, }, - { -125467272, 25107306, 1941325, }, - { 54234700, 12469901, -1246077, }, - { -62698468, -10954851, 1609002, }, - }, - { - { 366280192, -4061965, -805843, }, - { 525283616, 9440875, -3562675, }, - { -73869144, 2709588, 2083059, }, - { -15278272, -3664681, 2474438, }, - { -69738456, 3156801, 746787, }, - { -94421632, 8872329, -543850, }, - { -197179808, -18215494, -1489817, }, - { -32488206, -20340428, 1323387, }, - { -73730096, -3738769, 6418292, }, - }, - { - { 356168224, 2472828, -1493038, }, - { 533570240, -4927401, 20401, }, - { -58116276, -1755568, 771484, }, - { 5287105, -4551055, -365609, }, - { -63846300, -6586333, 2798171, }, - { -23891292, -20171314, -2127083, }, - { -223493984, -3424163, -3262028, }, - { -127029024, 21662742, 1534377, }, - { -90670520, 17609366, 2166811, }, - }, - { - { 349922272, 618475, -1319092, }, - { 518373568, -8857833, 1140851, }, - { -56720948, -883690, 1331977, }, - { 48408040, 13831405, -606664, }, - { -47076064, 2146947, 2979097, }, - { 40385040, 19214610, 1528472, }, - { -205683296, 20291572, 840740, }, - { -203235712, -13549011, 1227824, }, - { -96553552, -4800163, -4361540, }, - }, - { - { 346649504, -1439888, -318364, }, - { 483399104, 15989626, -1763621, }, - { -66776004, 6590091, 978179, }, - { 103736880, -14713484, 507343, }, - { -28132036, 848256, 367220, }, - { 75919456, 1214402, 2411087, }, - { -171571056, -12617003, 5709622, }, - { -240693728, 845035, 2171106, }, - { -76186280, -17254494, -3004330, }, - }, - { - { 342597184, -1294933, 166430, }, - { 443682464, -9204115, -4066260, }, - { -75551160, -3277060, -437550, }, - { 156191856, 10443750, 1022202, }, - { -9059697, 4929549, -889058, }, - { 78208672, -9521942, -970126, }, - { -153513408, -5825587, 4600984, }, - { -233576432, 5917928, 2312303, }, - { -33381560, 19739132, 3035468, }, - }, - { - { 334624672, 3918621, -566936, }, - { 413670304, -577136, -2447595, }, - { -70139504, -1757715, -1557999, }, - { 193998848, -3168612, 186831, }, - { 10993506, -6357089, 403727, }, - { 61479236, 9741523, -4020090, }, - { -164081168, 14096083, -239444, }, - { -189978208, -16337519, 2595771, }, - { 13108777, -5794448, 4198331, }, - }, - { - { 322606816, -3232500, -1260573, }, - { 396880736, 2692408, 843424, }, - { -46797428, 11288785, -991601, }, - { 214848752, 153545, -1243930, }, - { 32719598, 4962835, 1389959, }, - { 44736380, 1035087, -4147328, }, - { -192954096, -10519986, -3456375, }, - { -127260952, 14543833, 3575024, }, - { 47788492, -2278480, -68719, }, - }, - { - { 308399040, 1808181, -802085, }, - { 386778464, 3155727, 1571958, }, - { -13718662, -11858405, 1543504, }, - { 224974688, 794569, -2326799, }, - { 56534116, -457414, -206695, }, - { 37853156, -7458211, -425739, }, - { -221009888, -892279, -2015950, }, - { -63788316, -7458748, 1576790, }, - { 68279776, -1187559, -2947421, }, - }, - { - { 293636704, -2662343, -128312, }, - { 375935808, -5361193, -153008, }, - { 14427869, 3656628, 2450816, }, - { 232371696, 2226941, -2764348, }, - { 82602960, 5332202, -2313377, }, - { 36209260, 2982318, 2959233, }, - { -236805168, 4200478, 2068027, }, - { -9079561, 6485938, -1704028, }, - { 79947592, 3765076, -2320893, }, - }, - { - { 279406944, 3427384, -205085, }, - { 362203712, 3554086, -1072668, }, - { 28135258, 5444945, -106300, }, - { 240036064, -4869419, -1695975, }, - { 108520400, -9707163, -1090922, }, - { 30004104, 7593502, 1940788, }, - { -240686752, -710817, 3923990, }, - { 35410396, -11063299, -1749125, }, - { 87226488, -2617246, -1141924, }, - }, - { - { 266644992, -2608656, -476205, }, - { 347585248, -2545305, -769873, }, - { 28486370, -4051228, -3284576, }, - { 243368416, 2174864, -173946, }, - { 127333968, 4950487, 1104880, }, - { 16089484, -7972533, -1418950, }, - { -236118512, -1354525, 3016678, }, - { 69019048, 5398774, -811212, }, - { 90053120, 663572, -781684, }, - }, - { - { 255541424, 1991791, -520765, }, - { 335333856, 1934346, -435939, }, - { 22628572, -4581657, -1842541, }, - { 235510240, 2966749, 518080, }, - { 133714680, 2567317, 1082332, }, - { -433255, 551903, -1525250, }, - { -223574528, 2010582, 192737, }, - { 91384560, -5077188, -465467, }, - { 84883048, 1163399, -483721, }, - }, - { - { 245329600, -1373853, -308164, }, - { 327304960, -1559610, -599685, }, - { 13842680, -357556, 1105954, }, - { 214584080, -8028905, 86436, }, - { 130002752, -5317707, -677531, }, - { -14326937, 83752, 653909, }, - { -200260368, 7125888, -1465658, }, - { 103070624, -522375, -449898, }, - { 68426880, -4463008, 12348, }, - }, - { - { 234616880, 2107218, -43487, }, - { 322709344, 124554, -736587, }, - { 1589138, 5553930, 565862, }, - { 186385472, 9103183, -1245004, }, - { 125093072, 1516660, -1810866, }, - { -23804320, 2353642, 1084479, }, - { -166164768, -13082470, 473520, }, - { 106302048, -217433, -797790, }, - { 41465760, 7704098, -18254, }, - }, - { - { 222323072, -2915746, -19864, }, - { 318206080, -789200, -656056, }, - { -13198435, -4537096, -923955, }, - { 161084352, -4031901, -1812476, }, - { 127196528, 2785823, -1559073, }, - { -28687698, -1585380, 195958, }, - { -128549984, 8349954, 2117956, }, - { 105128448, -2126546, -1066763, }, - { 10321343, -6656126, -12885, }, - }, - { - { 208615696, 3557844, -220654, }, - { 309694528, 1555852, -404264, }, - { -28428388, 894427, -419296, }, - { 145905952, -1242856, -609885, }, - { 137842144, -5847598, -500901, }, - { -29700236, -334471, -172336, }, - { -96008088, -2522757, 846645, }, - { 103137200, -988379, -1157494, }, - { -16428787, 5519570, 15569, }, - }, - { - { 194701072, -3233574, -540629, }, - { 294416256, -4551055, -296890, }, - { -42549168, -2559801, 639950, }, - { 140792256, 2094333, 1074816, }, - { 151768576, 4850629, 831613, }, - { -28312962, 867583, 33286, }, - { -71958416, 2250026, -940061, }, - { 101641472, 158377, -641024, }, - { -32029182, -1188095, -28454, }, - }, - { - { 182000320, 1571421, -382252, }, - { 272313280, 6266358, -755914, }, - { -54702852, 4699768, -196495, }, - { 140131904, 2928631, 517544, }, - { 161241664, 1787243, 353798, }, - { -26629334, 1044751, -400506, }, - { -54589572, -4306242, -817118, }, - { 99131064, -478352, -254477, }, - { -34484292, -2201171, 446140, }, - }, - { - { 170964928, -1386738, 183610, }, - { 245976000, -6084895, -1145683, }, - { -64347736, -2036351, -1435056, }, - { 138324256, -2430415, -1476395, }, - { 162479680, -3643206, -1773822, }, - { -26885958, -612033, -1231582, }, - { -40347996, 3263638, 82678, }, - { 94091456, -1321776, 241592, }, - { -27213450, 3658775, 1133871, }, - }, - { - { 161127840, 2494839, 230318, }, - { 218601488, 4053912, -659814, }, - { -72627896, -2632815, -189515, }, - { 132085816, -731218, -1257352, }, - { 157013264, 20401, -2114198, }, - { -31015032, -1607392, -375810, }, - { -26279832, -1437203, -290984, }, - { 86541440, 3720516, -263067, }, - { -16163573, -1236951, 1034550, }, - }, - { - { 152307600, -2508261, -267899, }, - { 192162736, -4103841, 425202, }, - { -82927768, -598074, 2172180, }, - { 118860000, -1208496, 657667, }, - { 147158464, 732829, -167504, }, - { -40805412, -1704565, 1273458, }, - { -10628433, 3490735, -980863, }, - { 79426832, -1911261, -1018981, }, - { -5949067, -68183, -201327, }, - }, - { - { 144696368, 1319092, -537408, }, - { 167141872, 6891812, 175557, }, - { -97344896, 7576323, 1618129, }, - { 98060008, 6953015, 1093069, }, - { 133613752, 4267050, 679679, }, - { -55868396, 7104413, 654446, }, - { 5866926, -4824859, -618475, }, - { 75897976, -449898, -956167, }, - { 2306934, -2581275, -422517, }, - }, - { - { 138049920, -252866, -158377, }, - { 144453168, -4816269, -712428, }, - { -112335944, -5070746, -423591, }, - { 73207184, -8397735, -449361, }, - { 117530168, -5335960, -373125, }, - { -71457520, -3936338, -759672, }, - { 20044612, 3259343, 43487, }, - { 76154064, 2106682, -241592, }, - { 8460549, 700080, -55835, }, - }, - { - { 131315400, 1210644, 288300, }, - { 124574992, 3322157, -743566, }, - { -121577640, -2782602, 380105, }, - { 50560892, 2275796, -740345, }, - { 101227008, 2015950, -554588, }, - { -81823424, -2728915, 527207, }, - { 28654412, 806917, -407485, }, - { 77313704, -1054951, 514859, }, - { 12657805, -1239098, -40802, }, - }, - { - { 123408904, -2617783, 91268, }, - { 106087304, -2538326, -300648, }, - { -121654952, 5787469, 3679713, }, - { 34478388, 2088965, 1676111, }, - { 86537688, 592706, 1213865, }, - { -84390736, 4424353, 3697967, }, - { 30545270, -1830730, -1678795, }, - { 75919992, -574989, 882616, }, - { 15829639, 1928977, 729071, }, - }, - { - { 113971256, 2760590, -429497, }, - { 87232400, 2210298, 769336, }, - { -112382112, -1367410, 5208722, }, - { 25873420, 69256, 3870839, }, - { 75094280, 1138703, 3105261, }, - { -78730512, 127238, 4860829, }, - { 26732414, -753230, -1465121, }, - { 70934608, 1698660, 1145146, }, - { 18898392, -81604, 1235340, }, - }, - { - { 102863928, -1541356, -380105, }, - { 67243080, -4695473, 1672890, }, - { -94158568, -1594507, 2707977, }, - { 24968256, -4831838, 2573759, }, - { 68827928, -7074885, 1530082, }, - { -64571076, -3093450, 1923609, }, - { 18269718, -35970, 229244, }, - { 63774896, -2209761, 1298691, }, - { 23650238, -587337, 591632, }, - }, + {-1103, 10150, -3675}, + {-2282, 12641, -4229}, + {-61, 470, -138}, + {-394, 1133, -337}, + {-421, -426, 315}, + {-163, -181, 124}, + {565, 715, -483}, + {101, -1413, 626}, + {762, 4084, -1921} + }, + { + {207, 12037, -3023}, + {-1819, 8826, -5521}, + {-43, -341, -478}, + {-507, 80, -677}, + {-837, -1281, 158}, + {-266, -473, 135}, + {1386, 2523, -11}, + {-280, -3391, -207}, + {2695, 7695, -898} + }, + { + {3657, -5251, 2823}, + {5368, -15218, 2098}, + {317, -1217, -252}, + {577, -1352, -350}, + {-31, 324, -685}, + {155, -73, -109}, + {645, 891, 857}, + {-254, -2396, -619}, + {2297, 189, 2181} + }, + { + {2591, -6444, 2169}, + {8960, -5110, 4662}, + {508, 598, 389}, + {1759, 1291, 327}, + {1928, 2759, -242}, + {1037, 2178, 475}, + {-1806, -3816, -431}, + {431, -125, 259}, + {-2562, -7283, 114} + }, + { + {-2590, 4889, -1067}, + {2950, 10397, -226}, + {-188, 1165, 304}, + {1226, 794, 533}, + {2889, -280, 654}, + {1161, 1440, 703}, + {-3223, -1559, -968}, + {708, 109, 32}, + {-7215, 7, -1612} + }, + { + {-7364, 704, -1443}, + {-7380, -2339, -2655}, + {-1358, -1332, -382}, + {-1502, -1890, 47}, + {977, -1862, 371}, + {42, -1880, -351}, + {-2209, 2096, 249}, + {646, -45, -13}, + {-7484, 2871, -279} + }, + { + {-8537, -2560, 6}, + {-14891, -2958, -847}, + {-1782, -873, -446}, + {-4719, 756, -260}, + {-2868, 1783, -204}, + {-980, -726, -555}, + {-147, -191, 645}, + {72, -17, 86}, + {-3696, -1689, 605} + }, + { + {-6091, 1426, 861}, + {-16555, 2143, 1102}, + {-1160, 1054, 142}, + {-6247, -10, -218}, + {-6156, -548, -390}, + {-1342, 984, 150}, + {1631, -888, 39}, + {-904, -498, 76}, + {1863, 776, 388} + }, + { + {-2182, 105, 565}, + {-13714, 23, 1110}, + {-321, -229, 423}, + {-5016, -1208, -33}, + {-6841, -841, -184}, + {-1585, 252, 398}, + {2713, -234, -339}, + {-1804, 209, -19}, + {6503, -368, 28} + }, + { + {1248, -246, -94}, + {-9155, -265, 186}, + {29, -832, 137}, + {-1641, 1337, 274}, + {-4702, 1600, 278}, + {-2135, -843, 46}, + {3181, 463, -100}, + {-2114, -119, -81}, + {8608, -213, -173} + }, + { + {3731, -444, -320}, + {-4601, -761, -268}, + {101, 125, -175}, + {2034, -363, 243}, + {-1346, -393, 383}, + {-2756, 6, -133}, + {3036, 117, 40}, + {-1619, -569, -10}, + {8284, 408, -264} + }, + { + {5655, 728, -139}, + {-479, 1146, -132}, + {668, 420, -91}, + {4598, 1, -32}, + {1494, -25, 29}, + {-2917, 298, 60}, + {2417, -192, 8}, + {-569, 285, 124}, + {6623, -308, -222} + }, + { + {7330, -491, 39}, + {3219, -799, 9}, + {2153, -514, 21}, + {5769, -2, -152}, + {3214, -166, -135}, + {-2260, -23, 89}, + {1544, 219, 13}, + {495, 39, 22}, + {4630, 80, -48} + }, + { + {8731, 145, 35}, + {6433, 570, -11}, + {4438, 496, -3}, + {5979, -70, -161}, + {3997, 43, -121}, + {-607, 291, -74}, + {687, -249, -4}, + {1283, 115, -79}, + {2746, -312, 91} + }, + { + {9747, -40, -53}, + {8964, -392, -52}, + {6859, -382, -107}, + {5881, -183, -88}, + {4392, -131, -97}, + {1772, -669, -129}, + {233, 11, -15}, + {1717, -219, -8}, + {1058, 470, 55} + }, + { + {10404, 110, -82}, + {10665, 229, -73}, + {8504, 342, -144}, + {5801, 1, -15}, + {4803, 151, -62}, + {4006, 595, -70}, + {445, 147, 5}, + {1842, -48, 54}, + {-324, -302, -10} + }, + { + {10836, -112, -53}, + {11630, -130, -68}, + {8594, -40, -34}, + {5652, 64, -43}, + {5191, -99, -56}, + {5042, -206, 21}, + {1259, -191, -14}, + {1898, 137, -3}, + {-1283, 119, -12} + }, + { + {11170, 71, -35}, + {12134, 41, -61}, + {6830, -627, 52}, + {5236, -13, -22}, + {5241, 44, -37}, + {4236, -489, 56}, + {2319, 210, -63}, + {2217, 20, -83}, + {-1799, 27, 24} + }, + { + {11467, -53, -38}, + {12493, -76, -62}, + {3694, 1064, -24}, + {4365, 211, 37}, + {4623, 169, 7}, + {1781, 959, -39}, + {3063, -154, -79}, + {2923, -270, -99}, + {-1972, -50, 67} + }, + { + {11707, 53, -40}, + {12955, 187, -33}, + {341, -761, -117}, + {3047, -479, 0}, + {3237, -471, -2}, + {-1297, -706, -112}, + {2899, -70, -47}, + {3749, 345, -34}, + {-1959, -43, 68} + }, + { + {11823, -21, -34}, + {13616, -178, 3}, + {-2067, 150, -56}, + {1576, 342, -64}, + {1380, 448, -27}, + {-3767, 167, -14}, + {1485, 385, 4}, + {4108, 5, 2}, + {-1895, 197, -32} + }, + { + {11757, -19, -25}, + {14438, 62, -37}, + {-3049, 144, 69}, + {359, 11, 16}, + {-404, -325, -4}, + {-4860, 111, 139}, + {-998, -603, 63}, + {3450, -372, -55}, + {-1849, 77, -101} + }, + { + {11516, 69, -15}, + {15309, -107, -122}, + {-2886, -164, 110}, + {-363, 59, 120}, + {-1648, 204, 2}, + {-4456, -92, 131}, + {-3829, 766, 59}, + {1655, 381, -38}, + {-1913, -334, 49} + }, + { + {11178, -124, -25}, + {16030, 288, -109}, + {-2254, 83, 64}, + {-466, -112, 76}, + {-2128, 96, 23}, + {-2882, 271, -17}, + {-6017, -556, -45}, + {-991, -621, 40}, + {-2250, -114, 196} + }, + { + {10869, 75, -46}, + {16283, -150, 1}, + {-1774, -54, 24}, + {161, -139, -11}, + {-1948, -201, 85}, + {-729, -616, -65}, + {-6820, -104, -100}, + {-3877, 661, 47}, + {-2767, 537, 66} + }, + { + {10679, 19, -40}, + {15820, -270, 35}, + {-1731, -27, 41}, + {1477, 422, -19}, + {-1437, 66, 91}, + {1232, 586, 47}, + {-6277, 619, 26}, + {-6202, -413, 37}, + {-2947, -146, -133} + }, + { + {10579, -44, -10}, + {14752, 488, -54}, + {-2038, 201, 30}, + {3166, -449, 15}, + {-859, 26, 11}, + {2317, 37, 74}, + {-5236, -385, 174}, + {-7345, 26, 66}, + {-2325, -527, -92} + }, + { + {10455, -40, 5}, + {13540, -281, -124}, + {-2306, -100, -13}, + {4767, 319, 31}, + {-276, 150, -27}, + {2387, -291, -30}, + {-4685, -178, 140}, + {-7128, 181, 71}, + {-1019, 602, 93} + }, + { + {10212, 120, -17}, + {12624, -18, -75}, + {-2140, -54, -48}, + {5920, -97, 6}, + {335, -194, 12}, + {1876, 297, -123}, + {-5007, 430, -7}, + {-5798, -499, 79}, + {400, -177, 128} + }, + { + {9845, -99, -38}, + {12112, 82, 26}, + {-1428, 345, -30}, + {6557, 5, -38}, + {999, 151, 42}, + {1365, 32, -127}, + {-5888, -321, -105}, + {-3884, 444, 109}, + {1458, -70, -2} + }, + { + {9412, 55, -24}, + {11804, 96, 48}, + {-419, -362, 47}, + {6866, 24, -71}, + {1725, -14, -6}, + {1155, -228, -13}, + {-6745, -27, -62}, + {-1947, -228, 48}, + {2084, -36, -90} + }, + { + {8961, -81, -4}, + {11473, -164, -5}, + {440, 112, 75}, + {7091, 68, -84}, + {2521, 163, -71}, + {1105, 91, 90}, + {-7227, 128, 63}, + {-277, 198, -52}, + {2440, 115, -71} + }, + { + {8527, 105, -6}, + {11054, 108, -33}, + {859, 166, -3}, + {7325, -149, -52}, + {3312, -296, -33}, + {916, 232, 59}, + {-7345, -22, 120}, + {1081, -338, -53}, + {2662, -80, -35} + }, + { + {8137, -80, -15}, + {10607, -78, -23}, + {869, -124, -100}, + {7427, 66, -5}, + {3886, 151, 34}, + {491, -243, -43}, + {-7206, -41, 92}, + {2106, 165, -25}, + {2748, 20, -24} + }, + { + {7799, 61, -16}, + {10234, 59, -13}, + {691, -140, -56}, + {7187, 91, 16}, + {4081, 78, 33}, + {-13, 17, -47}, + {-6823, 61, 6}, + {2789, -155, -14}, + {2590, 36, -15} + }, + { + {7487, -42, -9}, + {9989, -48, -18}, + {422, -11, 34}, + {6549, -245, 3}, + {3967, -162, -21}, + {-437, 3, 20}, + {-6111, 217, -45}, + {3145, -16, -14}, + {2088, -136, 0} + }, + { + {7160, 64, -1}, + {9848, 4, -22}, + {48, 169, 17}, + {5688, 278, -38}, + {3818, 46, -55}, + {-726, 72, 33}, + {-5071, -399, 14}, + {3244, -7, -24}, + {1265, 235, -1} + }, + { + {6785, -89, -1}, + {9711, -24, -20}, + {-403, -138, -28}, + {4916, -123, -55}, + {3882, 85, -48}, + {-875, -48, 6}, + {-3923, 255, 65}, + {3208, -65, -33}, + {315, -203, 0} + }, + { + {6366, 109, -7}, + {9451, 47, -12}, + {-868, 27, -13}, + {4453, -38, -19}, + {4207, -178, -15}, + {-906, -10, -5}, + {-2930, -77, 26}, + {3147, -30, -35}, + {-501, 168, 0} + }, + { + {5942, -99, -17}, + {8985, -139, -9}, + {-1298, -78, 20}, + {4297, 64, 33}, + {4632, 148, 25}, + {-864, 26, 1}, + {-2196, 69, -29}, + {3102, 5, -20}, + {-977, -36, -1} + }, + { + {5554, 48, -12}, + {8310, 191, -23}, + {-1669, 143, -6}, + {4276, 89, 16}, + {4921, 55, 11}, + {-813, 32, -12}, + {-1666, -131, -25}, + {3025, -15, -8}, + {-1052, -67, 14} + }, + { + {5217, -42, 6}, + {7507, -186, -35}, + {-1964, -62, -44}, + {4221, -74, -45}, + {4958, -111, -54}, + {-820, -19, -38}, + {-1231, 100, 3}, + {2871, -40, 7}, + {-830, 112, 35} + }, + { + {4917, 76, 7}, + {6671, 124, -20}, + {-2216, -80, -6}, + {4031, -22, -38}, + {4792, 1, -65}, + {-947, -49, -11}, + {-802, -44, -9}, + {2641, 114, -8}, + {-493, -38, 32} + }, + { + {4648, -77, -8}, + {5864, -125, 13}, + {-2531, -18, 66}, + {3627, -37, 20}, + {4491, 22, -5}, + {-1245, -52, 39}, + {-324, 107, -30}, + {2424, -58, -31}, + {-182, -2, -6} + }, + { + {4416, 40, -16}, + {5101, 210, 5}, + {-2971, 231, 49}, + {2993, 212, 33}, + {4078, 130, 21}, + {-1705, 217, 20}, + {179, -147, -19}, + {2316, -14, -29}, + {70, -79, -13} + }, + { + {4213, -8, -5}, + {4408, -147, -22}, + {-3428, -155, -13}, + {2234, -256, -14}, + {3587, -163, -11}, + {-2181, -120, -23}, + {612, 99, 1}, + {2324, 64, -7}, + {258, 21, -2} + }, + { + {4007, 37, 9}, + {3802, 101, -23}, + {-3710, -85, 12}, + {1543, 69, -23}, + {3089, 62, -17}, + {-2497, -83, 16}, + {874, 25, -12}, + {2359, -32, 16}, + {386, -38, -1} + }, + { + {3766, -80, 3}, + {3238, -77, -9}, + {-3713, 177, 112}, + {1052, 64, 51}, + {2641, 18, 37}, + {-2575, 135, 113}, + {932, -56, -51}, + {2317, -18, 27}, + {483, 59, 22} + }, + { + {3478, 84, -13}, + {2662, 67, 23}, + {-3430, -42, 159}, + {790, 2, 118}, + {2292, 35, 95}, + {-2403, 4, 148}, + {816, -23, -45}, + {2165, 52, 35}, + {577, -2, 38} + }, + { + {3139, -47, -12}, + {2052, -143, 51}, + {-2873, -49, 83}, + {762, -147, 79}, + {2100, -216, 47}, + {-1971, -94, 59}, + {558, -1, 7}, + {1946, -67, 40}, + {722, -18, 18} + } }; -const Word32 rightHRIRReal_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA] /* Q29 */= +const Word16 rightHRIRReal_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]= { { - { 9749039, 528896224, 129120672, }, - { -41363756, 13267691, -139807088, }, - { 318364, 71011376, 4832, }, - { 4946192, 29243896, 2285460, }, - { -21379810, 23943906, 862215, }, - { -5953899, 15082851, -6302328, }, - { -30930744, 44672492, 2427730, }, - { 5499706, 15232638, -5888937, }, - { -57767848, 97858144, 28123982, }, - }, - { - { -81891064, -177112640, -130106368, }, - { 112628000, 683750720, 60143500, }, - { -6127308, 43266964, -7260642, }, - { -18372260, 7399692, 4738423, }, - { 6642167, -7949985, -20505784, }, - { -1736777, -44741748, -36746668, }, - { 1779190, -17669496, -35038880, }, - { 1783485, 40972376, 4261145, }, - { -8154533, -118214144, -70245800, }, - }, - { - { -12397960, -300077568, -81048184, }, - { 145049632, 316735584, 192968592, }, - { -1750199, 52096344, -8036958, }, - { -31417148, 57874148, -7852811, }, - { 45173928, -93462784, 3615289, }, - { 19227494, -151273584, 3310346, }, - { 62551368, -165313824, 10894185, }, - { -7194607, 46335716, 6969122, }, - { 112488416, -297701888, -26124676, }, - }, - { - { 140419120, 163395056, 61220464, }, - { -134698768, -418562272, -37772088, }, - { 12770012, 47600584, -16543677, }, - { 1829119, 44066900, -22123914, }, - { 33349348, -25675314, 30729954, }, - { 13965623, -83586504, 35370128, }, - { 68233608, -88068304, 41433548, }, - { -11814381, 19326816, -3059091, }, - { 176067360, -24274618, 67555000, }, - }, - { - { 193003488, 110340392, 58983324, }, - { -400174976, -27615030, -115993112, }, - { 35544612, -41037340, 13286481, }, - { 77038832, -66177928, 4207994, }, - { -52810916, 74782896, 8038032, }, - { -35016868, 65575024, -16007343, }, - { -10479720, 87943752, -12978317, }, - { 4599910, -13000866, 7131793, }, - { 59668372, 167397968, 11380053, }, - }, - { - { 88669064, -136434464, -13708462, }, - { -418985344, 219153392, -13563507, }, - { 23226110, -44473848, 13935021, }, - { 115305912, -11606612, 14061723, }, - { -143302128, -39595840, -14180908, }, - { -59085864, 36939404, -20780126, }, - { -87146496, 9683541, -25189446, }, - { 25008520, -13014288, 2070174, }, - { -136447888, -56905632, -32251446, }, - }, - { - { -95292440, 37550900, -37873020, }, - { -206629808, -110094504, 59848220, }, - { -19184546, 36173288, -7810935, }, - { 67421856, 33315524, 4643397, }, - { -158025808, -25906168, -14119168, }, - { -48429516, -45377940, 8228084, }, - { -113663088, -53688164, 4163434, }, - { 42060616, -12084964, -2563022, }, - { -283383008, -24645060, -13195213, }, - }, - { - { -248765584, 30539902, -11682848, }, - { 81042808, -14250165, 36664524, }, - { -54503672, 436476, -13678397, }, - { -51027432, -48062296, -1750736, }, - { -72271416, 56135760, -543850, }, - { -31731756, -13630079, 15043123, }, - { -97211216, -3755949, 17327508, }, - { 44042744, -1282048, 987843, }, - { -314783520, 26202522, 8887361, }, - }, - { - { -318032128, -23928874, 15863999, }, - { 309716544, 19851338, -11929272, }, - { -64207612, -32423782, -834834, }, - { -181705568, 34351684, -7874823, }, - { 67236640, -50014356, 11543261, }, - { -24249922, 23637352, -232465, }, - { -61846456, 13557064, 2641405, }, - { 22053046, 4669167, 2681670, }, - { -235416288, -29829084, 11263552, }, - }, - { - { -321614656, -7707319, 17708688, }, - { 441777120, 23812372, -24769076, }, - { -63085552, 4299799, 10666551, }, - { -257657776, 10072235, -4187056, }, - { 182311168, 965831, 9856950, }, - { -15317464, 2199023, -7827578, }, - { -19076098, 8660265, -5299453, }, - { -16952772, -20622286, 530428, }, - { -101074536, 27609660, 8037495, }, - }, - { - { -299877312, 14833206, 4658429, }, - { 501736992, -30001958, -10576894, }, - { -77060304, 21843666, 5098126, }, - { -255281040, -25045028, 6628745, }, - { 224941392, 25129854, -4932233, }, - { 10722923, -24297704, -745714, }, - { 21924198, -14825690, -2221035, }, - { -55880744, 8342974, -3590593, }, - { 24230058, -11106785, 2217814, }, - }, - { - { -273169056, 1380832, -3224447, }, - { 518796608, 5689758, -501974, }, - { -107435384, -11543261, -1205275, }, - { -200896560, 11400454, 8522826, }, - { 205748256, -6176163, -10351408, }, - { 54589572, 4134980, 2393908, }, - { 52939232, 5274220, -91268, }, - { -76335528, 8250096, -39192, }, - { 108715824, 4263829, -4214437, }, - }, - { - { -241493120, -13797582, -1484985, }, - { 506164576, 10208600, -1411971, }, - { -135031088, 2689187, -19864, }, - { -132891120, -9751186, 4269735, }, - { 159797472, 4487704, -4820027, }, - { 104600168, -5526013, -3636227, }, - { 68510096, -2899103, -59056, }, - { -75732088, -3214783, 3774203, }, - { 153326032, -4451197, -6740415, }, - }, - { - { -201953664, 13988172, 2484102, }, - { 468066080, -11743514, -3473555, }, - { -135009072, 6645925, 2597918, }, - { -76960984, 1656247, 299037, }, - { 114370144, -4749160, -1355599, }, - { 142927920, 12561169, -4122095, }, - { 65720516, -3194919, 500901, }, - { -61929132, -2405182, 1045288, }, - { 170837152, 9755481, -3670587, }, - }, - { - { -157771872, -7571491, 2987150, }, - { 409905760, 14218489, -3198140, }, - { -89839440, -11615202, 2513093, }, - { -38160248, -4485557, -2508798, }, - { 80043160, 2543695, 238908, }, - { 144927232, -1413044, -105227, }, - { 47504484, 7495792, 11811, }, - { -43118788, -5166309, -1449552, }, - { 169407472, 267362, 73551, }, - }, - { - { -114906480, 5610838, 980863, }, - { 342850592, -13112535, -2252174, }, - { -257698, 17945448, -1500554, }, - { -6269579, 9542880, -1308891, }, - { 49730352, -6022081, 804770, }, - { 96365104, -14963666, 2623151, }, - { 26508002, -3325915, 172872, }, - { -27319214, 7948911, 848256, }, - { 152526096, -7221988, -119722, }, - }, - { - { -76454176, -6929930, -69256, }, - { 279726400, 11549704, -1301375, }, - { 114208552, -28898688, -3926137, }, - { 26892938, -5211406, -841277, }, - { 12193949, 7994545, 1019518, }, - { 7168301, 27730456, 2589865, }, - { 18780818, -313533, 1094143, }, - { -20258824, -345208, 3060164, }, - { 125984272, 8527658, -1406065, }, - }, - { - { -41962904, 7059316, 128849, }, - { 228333344, -8655970, -1010928, }, - { 219166272, 28090696, -1050656, }, - { 62499828, 7261179, -2414309, }, - { -36138928, -10872173, 2019708, }, - { -89954328, -27792196, -466541, }, - { 36580772, 5089000, 663036, }, - { -18362596, -4509179, 2020245, }, - { 97064112, -6015639, -1931662, }, - }, - { - { -8992588, -6510634, 267362, }, - { 190033520, 4474819, -350577, }, - { 278282752, -5998459, 1591285, }, - { 95040112, -10720775, -1452236, }, - { -88483840, 14305462, 1738388, }, - { -153659440, 6827925, -2048699, }, - { 83558592, -11030550, -993211, }, - { -8813273, 2103460, -952409, }, - { 71897216, 1779190, -978179, }, - }, - { - { 24793772, 6630893, -18254, }, - { 160462656, -4852776, 434865, }, - { 274668512, -17280800, -1229971, }, - { 113483776, 2928631, 500901, }, - { -129502928, -8119099, 592169, }, - { -157575904, 15821586, 1637993, }, - { 150618064, 16231755, -2345052, }, - { 22151294, 10189273, -2437931, }, - { 53149148, 1124208, 1559073, }, - }, - { - { 59917480, -7263864, -350040, }, - { 132440688, 8647917, -547608, }, - { 222252208, 20497194, -5111011, }, - { 109086800, 9399536, -1176284, }, - { -144204064, -1976759, 942208, }, - { -105299712, -19787452, 5240397, }, - { 215895664, -14326937, -2713883, }, - { 77865072, -19022410, -732829, }, - { 40236328, 4224101, 2659659, }, - }, - { - { 94547264, 7210713, -514322, }, - { 99481104, -9044127, -2510945, }, - { 154022352, -10442139, -4019553, }, - { 82563768, -8490077, -3492345, }, - { -128416840, 6362457, 1036161, }, - { -22603340, 12644921, 2655901, }, - { 252400736, 6924561, -1945620, }, - { 145012592, 13919989, -82678, }, - { 31737660, -10970420, -1664837, }, - }, - { - { 125645512, -7259569, -85899, }, - { 56863756, 4744328, -1486596, }, - { 99314136, 4427575, -335007, }, - { 41075992, 3167539, -968515, }, - { -89500672, -12156905, 797253, }, - { 60453812, -10972568, -2783139, }, - { 242034288, 3270618, 1074816, }, - { 200968496, -7325604, -2245731, }, - { 27202176, -1326071, -5287642, }, - }, - { - { 150700208, 4634807, 561030, }, - { 1191853, -8886824, 2146410, }, - { 70675296, -2062658, 1005022, }, - { -8423505, -8847096, 2709588, }, - { -41706816, 12612171, 1906429, }, - { 119930520, 13067438, -3780645, }, - { 186179856, -22568980, 1925219, }, - { 224940864, 2801929, -3001645, }, - { 21487184, 13031468, 194347, }, - }, - { - { 169636176, -1192927, 61203, }, - { -66094176, 19737522, 2557653, }, - { 63994476, -1108102, 530428, }, - { -57278220, 13596256, 2472291, }, - { 166430, -4035659, 1475321, }, - { 140860976, -5550172, -35970, }, - { 109537232, 28074054, -2848100, }, - { 204103296, 8996883, -2008434, }, - { 1818919, 4411469, 6263673, }, - }, - { - { 185916256, 1898376, -1018981, }, - { -133667976, -19608674, -745714, }, - { 64880312, 1573569, 387621, }, - { -92978528, -8923868, 155156, }, - { 29435022, 97174, -1298154, }, - { 120988152, -12420509, 1513976, }, - { 49056580, -7981660, -5492190, }, - { 139661056, -18445274, -1324997, }, - { -36724656, -22808960, 2743947, }, - }, - { - { 203936864, -5097053, -1052804, }, - { -185728880, 7454453, -2333778, }, - { 58489400, 863825, 1222455, }, - { -104674256, -2811593, -115964, }, - { 48657148, -3922916, -2414309, }, - { 75116832, 19784230, -1840930, }, - { 26552024, -8952859, -2214593, }, - { 48134772, 21822728, -685047, }, - { -79321064, 15090904, -3412889, }, - }, - { - { 225228624, 6438156, -157303, }, - { -214688240, 3755412, 329102, }, - { 38261716, -7221451, 1816234, }, - { -90862184, 8681203, 1593433, }, - { 62400508, 5262409, -942745, }, - { 28787556, -9220758, -4382478, }, - { 34985728, 13614509, 2888903, }, - { -46410880, -20306068, -564251, }, - { -104572792, 3867618, -2895345, }, - }, - { - { 247859344, -4959614, 399432, }, - { -227028208, -1579474, 3234110, }, - { 9644886, 10700911, 573378, }, - { -60634200, -7675107, 1981591, }, - { 72839960, -2655364, 490163, }, - { 729608, -4192962, -1942936, }, - { 48766132, -369367, 4420595, }, - { -121884192, 11087995, -140660, }, - { -103912440, -11213086, 2019172, }, - }, - { - { 268726976, 2394444, -181999, }, - { -235657344, -4387846, 2889439, }, - { -13455596, -6493991, -1464047, }, - { -25911538, 8749385, 2221035, }, - { 79648024, -3604551, -1035087, }, - { -8626979, 6051072, 2256469, }, - { 45754824, -10596758, 946503, }, - { -166654400, -1146756, 1919850, }, - { -84939960, 6331319, 4582730, }, - }, - { - { 286211264, -2729452, -953483, }, - { -248872416, 8239358, 294742, }, - { -18828062, -4189741, -1525787, }, - { 4614406, -1637456, 1565516, }, - { 82404856, -1227824, -2612951, }, - { -11445014, -180926, 4145717, }, - { 21737904, 12543452, -3052111, }, - { -182342832, -2155000, 4099010, }, - { -60702920, 1326608, 2131378, }, - }, - { - { 300383040, 3500935, -717796, }, - { -266191872, -3493956, -970663, }, - { -5042829, 10755135, 1197222, }, - { 30651570, 2687576, -321586, }, - { 79362408, 2752537, -858457, }, - { -18897856, -9425306, 1945083, }, - { -14038101, -5513665, -3498788, }, - { -178168672, -1279363, 3287261, }, - { -37468756, 3229816, -508954, }, - }, - { - { 311666464, -2198487, -265214, }, - { -283031360, 1918777, -70330, }, - { 18464064, -6590091, 3395172, }, - { 58261768, -4366908, -1492501, }, - { 66921496, 2005750, 1306744, }, - { -31464394, 7336341, -1821066, }, - { -51994876, 2715493, -710817, }, - { -161833296, -2287607, 964220, }, - { -14486388, -4322885, -715649, }, - }, - { - { 320947872, 1425929, -280247, }, - { -296547616, -1778653, 544387, }, - { 40380208, -2829847, 1201517, }, - { 91574608, 9750650, -1528472, }, - { 45061724, -9525701, 755377, }, - { -41256384, 2624225, -1612223, }, - { -89262840, -4065724, 2160369, }, - { -137527536, 5949067, 293668, }, - { 10603201, 5882495, -712428, }, - }, - { - { 329596320, -1290101, -507343, }, - { -306918912, 2180233, 387621, }, - { 56913684, -266288, -2163590, }, - { 127935800, -9903658, -440771, }, - { 20552492, 7883413, -1342714, }, - { -43283608, -3977677, 1141388, }, - { -126284920, 9459129, 2925410, }, - { -109121696, -6815576, 498753, }, - { 38045356, -5915244, -879931, }, - }, - { - { 338755872, 1985349, -662499, }, - { -316944416, -1728188, 217970, }, - { 70156144, 6400038, -1461900, }, - { 158782800, 7256347, 613643, }, - { 2733747, -1930588, -1903207, }, - { -38901128, -146029, 1503239, }, - { -160943168, -12184822, 650151, }, - { -80698680, 6174553, 687195, }, - { 63547800, 6309844, -729608, }, - }, - { - { 348667584, -2622078, -528281, }, - { -330204608, 2903398, 394600, }, - { 80498424, -3464428, 624918, }, - { 176407184, -212064, 684510, }, - { -4530117, -2791192, -780610, }, - { -31255550, 34360, -15569, }, - { -186284000, 3796214, -1058710, }, - { -56010132, -4271882, 649077, }, - { 80058728, -2265595, -424128, }, - }, - { - { 358330208, 2345589, -273267, }, - { -348918848, -4343823, 594853, }, - { 86404544, -1669669, 192200, }, - { 179864640, -3940633, -735513, }, - { -5645735, 2221572, 545461, }, - { -22848690, 2136746, -548682, }, - { -196971488, 3864397, 570157, }, - { -36806796, 2615098, 387621, }, - { 82155208, -1394791, -471373, }, - }, - { - { 366297888, -1524177, -97711, }, - { -372433248, 5732171, 681826, }, - { 87542704, 938987, -1042066, }, - { 175921328, 2347200, -1906429, }, - { -9195525, 777926, 1210107, }, - { -15777025, -1827509, -136365, }, - { -195313632, -2768643, 2332167, }, - { -22068616, -1083942, -295816, }, - { 69850128, 4421669, -359704, }, - }, - { - { 371749280, 51003, -288300, }, - { -397624864, -6229850, 351650, }, - { 84823456, 1105954, -449361, }, - { 173494128, 2942590, -1049583, }, - { -21438330, -6756521, 438624, }, - { -11614665, 5369, -123480, }, - { -188027232, -225486, 1703491, }, - { -8943196, 3022583, -632434, }, - { 48287780, -6484864, -573915, }, - }, - { - { 375091296, 123480, -765041, }, - { -420282944, 3861713, 207769, }, - { 79324824, 1246077, 565862, }, - { 177637696, -3994320, 930934, }, - { -42110008, 7602629, -1375463, }, - { -11107859, 586800, -499290, }, - { -180578672, 130997, 265751, }, - { 4147328, -2578054, -663572, }, - { 25565792, 4443681, -760746, }, - }, - { - { 377552320, 1293322, -671089, }, - { -437537440, -1720134, 741956, }, - { 72594072, -5038534, -627602, }, - { 187999840, -449898, 470836, }, - { -65652872, -2403034, -1189706, }, - { -13804562, 1540283, 333397, }, - { -174902880, 2426657, 401579, }, - { 16455093, 4543002, -142808, }, - { 8400419, -1613297, -322659, }, - }, - { - { 379801824, -1159104, -98784, }, - { -449000192, 762357, 1505923, }, - { 66756140, 1897302, -2478733, }, - { 202493216, -1679332, -1592359, }, - { -87476672, 1024350, 1014686, }, - { -18439368, 616328, 1715839, }, - { -170510208, -614717, 1108638, }, - { 25653302, -1463510, 585726, }, - { -814970, -1081258, 744103, }, - }, - { - { 381884864, 102005, 62277, }, - { -456018144, -2931852, 1144609, }, - { 61858268, 3501472, -1437203, }, - { 218079648, 5225365, -1717987, }, - { -106423384, -4740570, 1769527, }, - { -22399866, -3916473, 964757, }, - { -165222560, -275415, 569620, }, - { 30270930, -994285, 135291, }, - { -3977677, -1443109, 878321, }, - }, - { - { 384165504, 471373, -382252, }, - { -459639360, 1001264, 163209, }, - { 53535156, 277025, 810675, }, - { 229669088, -4628364, -55298, }, - { -121935192, 5230734, 398358, }, - { -20921322, -307627, -477815, }, - { -155960992, -2059974, -151398, }, - { 32400696, 1212255, -745177, }, - { -3812857, 365609, 27380, }, - }, - { - { 387472608, 773094, -761820, }, - { -460596576, 1338956, 388158, }, - { 37011880, -8176544, 218506, }, - { 232414640, -2472828, 367757, }, - { -132566312, -363998, -61740, }, - { -10568841, 6884296, 514322, }, - { -141396224, 5043366, 133144, }, - { 35882304, 890132, -1221381, }, - { -1747515, 906775, -19864, }, - }, - { - { 392298016, -2099165, -467078, }, - { -460876832, -654983, 1044751, }, - { 12603045, 8705899, -2084670, }, - { 225417056, 5970542, -1477469, }, - { -137805104, -1513976, 1142461, }, - { 7254737, -6248641, 2473364, }, - { -123040072, -5198521, 973884, }, - { 43224012, -3112778, -925029, }, - { 770410, 405874, -242129, }, - }, - { - { 398138112, 1664837, -5906, }, - { -462098752, 161061, 1531693, }, - { -15297063, -1983201, -1540283, }, - { 212177296, -1755568, -2101313, }, - { -138299024, -763430, 1508607, }, - { 28484760, 306016, 1535451, }, - { -104152424, 1582159, 476741, }, - { 53592600, 3449396, -330712, }, - { 2964601, 1447941, -306016, }, - }, - { - { 404148384, -311922, -176094, }, - { -464220992, 1423782, 1687922, }, - { -42546484, -2144799, 3101503, }, - { 196518384, -3173444, 1027034, }, - { -134805600, 4870493, -1206886, }, - { 49714248, 2751464, -2964601, }, - { -87270512, -921807, -1372779, }, - { 64223720, -2987150, 277025, }, - { 4530654, -2358474, 919123, }, - }, - { - { 409720000, -462783, -1084479, }, - { -466352928, -2785286, 731755, }, - { -65998616, -1939178, 7927436, }, - { 181019984, 2525978, 6302328, }, - { -129010616, -4121021, -6409165, }, - { 67529768, 2459406, -6993818, }, - { -73590504, 3739306, -1999844, }, - { 73398304, 1053341, 575526, }, - { 5841693, 808528, 2232309, }, - }, + {298, 16141, 3940}, + {-1262, 405, -4267}, + {10, 2167, 0}, + {151, 892, 70}, + {-652, 731, 26}, + {-182, 460, -192}, + {-944, 1363, 74}, + {168, 465, -180}, + {-1763, 2986, 858} + }, + { + {-2499, -5405, -3971}, + {3437, 20866, 1835}, + {-187, 1320, -222}, + {-561, 226, 145}, + {203, -243, -626}, + {-53, -1365, -1121}, + {54, -539, -1069}, + {54, 1250, 130}, + {-249, -3608, -2144} + }, + { + {-378, -9158, -2473}, + {4427, 9666, 5889}, + {-53, 1590, -245}, + {-959, 1766, -240}, + {1379, -2852, 110}, + {587, -4617, 101}, + {1909, -5045, 332}, + {-220, 1414, 213}, + {3433, -9085, -797} + }, + { + {4285, 4986, 1868}, + {-4111, -12774, -1153}, + {390, 1453, -505}, + {56, 1345, -675}, + {1018, -784, 938}, + {426, -2551, 1079}, + {2082, -2688, 1264}, + {-361, 590, -93}, + {5373, -741, 2062} + }, + { + {5890, 3367, 1800}, + {-12212, -843, -3540}, + {1085, -1252, 405}, + {2351, -2020, 128}, + {-1612, 2282, 245}, + {-1069, 2001, -489}, + {-320, 2684, -396}, + {140, -397, 218}, + {1821, 5109, 347} + }, + { + {2706, -4164, -418}, + {-12786, 6688, -414}, + {709, -1357, 425}, + {3519, -354, 429}, + {-4373, -1208, -433}, + {-1803, 1127, -634}, + {-2659, 296, -769}, + {763, -397, 63}, + {-4164, -1737, -984} + }, + { + {-2908, 1146, -1156}, + {-6306, -3360, 1826}, + {-585, 1104, -238}, + {2058, 1017, 142}, + {-4823, -791, -431}, + {-1478, -1385, 251}, + {-3469, -1638, 127}, + {1284, -369, -78}, + {-8648, -752, -403} + }, + { + {-7592, 932, -357}, + {2473, -435, 1119}, + {-1663, 13, -417}, + {-1557, -1467, -53}, + {-2206, 1713, -17}, + {-968, -416, 459}, + {-2967, -115, 529}, + {1344, -39, 30}, + {-9606, 800, 271} + }, + { + {-9706, -730, 484}, + {9452, 606, -364}, + {-1959, -990, -25}, + {-5545, 1048, -240}, + {2052, -1526, 352}, + {-740, 721, -7}, + {-1887, 414, 81}, + {673, 142, 82}, + {-7184, -910, 344} + }, + { + {-9815, -235, 540}, + {13482, 727, -756}, + {-1925, 131, 326}, + {-7863, 307, -128}, + {5564, 29, 301}, + {-467, 67, -239}, + {-582, 264, -162}, + {-517, -629, 16}, + {-3085, 843, 245} + }, + { + {-9152, 453, 142}, + {15312, -916, -323}, + {-2352, 667, 156}, + {-7791, -764, 202}, + {6865, 767, -151}, + {327, -742, -23}, + {669, -452, -68}, + {-1705, 255, -110}, + {739, -339, 68} + }, + { + {-8336, 42, -98}, + {15832, 174, -15}, + {-3279, -352, -37}, + {-6131, 348, 260}, + {6279, -188, -316}, + {1666, 126, 73}, + {1616, 161, -3}, + {-2330, 252, -1}, + {3318, 130, -129} + }, + { + {-7370, -421, -45}, + {15447, 312, -43}, + {-4121, 82, -1}, + {-4056, -298, 130}, + {4877, 137, -147}, + {3192, -169, -111}, + {2091, -88, -2}, + {-2311, -98, 115}, + {4679, -136, -206} + }, + { + {-6163, 427, 76}, + {14284, -358, -106}, + {-4120, 203, 79}, + {-2349, 51, 9}, + {3490, -145, -41}, + {4362, 383, -126}, + {2006, -98, 15}, + {-1890, -73, 32}, + {5214, 298, -112} + }, + { + {-4815, -231, 91}, + {12509, 434, -98}, + {-2742, -354, 77}, + {-1165, -137, -77}, + {2443, 78, 7}, + {4423, -43, -3}, + {1450, 229, 0}, + {-1316, -158, -44}, + {5170, 8, 2} + }, + { + {-3507, 171, 30}, + {10463, -400, -69}, + {-8, 548, -46}, + {-191, 291, -40}, + {1518, -184, 25}, + {2941, -457, 80}, + {809, -101, 5}, + {-834, 243, 26}, + {4655, -220, -4} + }, + { + {-2333, -211, -2}, + {8537, 352, -40}, + {3485, -882, -120}, + {821, -159, -26}, + {372, 244, 31}, + {219, 846, 79}, + {573, -10, 33}, + {-618, -11, 93}, + {3845, 260, -43} + }, + { + {-1281, 215, 4}, + {6968, -264, -31}, + {6688, 857, -32}, + {1907, 222, -74}, + {-1103, -332, 62}, + {-2745, -848, -14}, + {1116, 155, 20}, + {-560, -138, 62}, + {2962, -184, -59} + }, + { + {-274, -199, 8}, + {5799, 137, -11}, + {8493, -183, 49}, + {2900, -327, -44}, + {-2700, 437, 53}, + {-4689, 208, -63}, + {2550, -337, -30}, + {-269, 64, -29}, + {2194, 54, -30} + }, + { + {757, 202, -1}, + {4897, -148, 13}, + {8382, -527, -38}, + {3463, 89, 15}, + {-3952, -248, 18}, + {-4809, 483, 50}, + {4596, 495, -72}, + {676, 311, -74}, + {1622, 34, 48} + }, + { + {1829, -222, -11}, + {4042, 264, -17}, + {6783, 626, -156}, + {3329, 287, -36}, + {-4401, -60, 29}, + {-3213, -604, 160}, + {6589, -437, -83}, + {2376, -581, -22}, + {1228, 129, 81} + }, + { + {2885, 220, -16}, + {3036, -276, -77}, + {4700, -319, -123}, + {2520, -259, -107}, + {-3919, 194, 32}, + {-690, 386, 81}, + {7703, 211, -59}, + {4425, 425, -3}, + {969, -335, -51} + }, + { + {3834, -222, -3}, + {1735, 145, -45}, + {3031, 135, -10}, + {1254, 97, -30}, + {-2731, -371, 24}, + {1845, -335, -85}, + {7386, 100, 33}, + {6133, -224, -69}, + {830, -40, -161} + }, + { + {4599, 141, 17}, + {36, -271, 65}, + {2157, -63, 31}, + {-257, -270, 83}, + {-1273, 385, 58}, + {3660, 399, -115}, + {5682, -689, 59}, + {6865, 86, -92}, + {656, 398, 6} + }, + { + {5177, -36, 2}, + {-2017, 602, 78}, + {1953, -34, 16}, + {-1748, 415, 75}, + {5, -123, 45}, + {4299, -169, -1}, + {3343, 857, -87}, + {6229, 275, -61}, + {56, 135, 191} + }, + { + {5674, 58, -31}, + {-4079, -598, -23}, + {1980, 48, 12}, + {-2837, -272, 5}, + {898, 3, -40}, + {3692, -379, 46}, + {1497, -244, -168}, + {4262, -563, -40}, + {-1121, -696, 84} + }, + { + {6224, -156, -32}, + {-5668, 227, -71}, + {1785, 26, 37}, + {-3194, -86, -4}, + {1485, -120, -74}, + {2292, 604, -56}, + {810, -273, -68}, + {1469, 666, -21}, + {-2421, 461, -104} + }, + { + {6873, 196, -5}, + {-6552, 115, 10}, + {1168, -220, 55}, + {-2773, 265, 49}, + {1904, 161, -29}, + {879, -281, -134}, + {1068, 415, 88}, + {-1416, -620, -17}, + {-3191, 118, -88} + }, + { + {7564, -151, 12}, + {-6928, -48, 99}, + {294, 327, 17}, + {-1850, -234, 60}, + {2223, -81, 15}, + {22, -128, -59}, + {1488, -11, 135}, + {-3720, 338, -4}, + {-3171, -342, 62} + }, + { + {8201, 73, -6}, + {-7192, -134, 88}, + {-411, -198, -45}, + {-791, 267, 68}, + {2431, -110, -32}, + {-263, 185, 69}, + {1396, -323, 29}, + {-5086, -35, 59}, + {-2592, 193, 140} + }, + { + {8734, -83, -29}, + {-7595, 251, 9}, + {-575, -128, -47}, + {141, -50, 48}, + {2515, -37, -80}, + {-349, -6, 127}, + {663, 383, -93}, + {-5565, -66, 125}, + {-1853, 40, 65} + }, + { + {9167, 107, -22}, + {-8124, -107, -30}, + {-154, 328, 37}, + {935, 82, -10}, + {2422, 84, -26}, + {-577, -288, 59}, + {-428, -168, -107}, + {-5437, -39, 100}, + {-1143, 99, -16} + }, + { + {9511, -67, -8}, + {-8637, 59, -2}, + {563, -201, 104}, + {1778, -133, -46}, + {2042, 61, 40}, + {-960, 224, -56}, + {-1587, 83, -22}, + {-4939, -70, 29}, + {-442, -132, -22} + }, + { + {9795, 44, -9}, + {-9050, -54, 17}, + {1232, -86, 37}, + {2795, 298, -47}, + {1375, -291, 23}, + {-1259, 80, -49}, + {-2724, -124, 66}, + {-4197, 182, 9}, + {324, 180, -22} + }, + { + {10058, -39, -15}, + {-9366, 67, 12}, + {1737, -8, -66}, + {3904, -302, -13}, + {627, 241, -41}, + {-1321, -121, 35}, + {-3854, 289, 89}, + {-3330, -208, 15}, + {1161, -181, -27} + }, + { + {10338, 61, -20}, + {-9672, -53, 7}, + {2141, 195, -45}, + {4846, 221, 19}, + {83, -59, -58}, + {-1187, -4, 46}, + {-4912, -372, 20}, + {-2463, 188, 21}, + {1939, 193, -22} + }, + { + {10640, -80, -16}, + {-10077, 89, 12}, + {2457, -106, 19}, + {5384, -6, 21}, + {-138, -85, -24}, + {-954, 1, 0}, + {-5685, 116, -32}, + {-1709, -130, 20}, + {2443, -69, -13} + }, + { + {10935, 72, -8}, + {-10648, -133, 18}, + {2637, -51, 6}, + {5489, -120, -22}, + {-172, 68, 17}, + {-697, 65, -17}, + {-6011, 118, 17}, + {-1123, 80, 12}, + {2507, -43, -14} + }, + { + {11179, -47, -3}, + {-11366, 175, 21}, + {2672, 29, -32}, + {5369, 72, -58}, + {-281, 24, 37}, + {-481, -56, -4}, + {-5960, -84, 71}, + {-673, -33, -9}, + {2132, 135, -11} + }, + { + {11345, 2, -9}, + {-12135, -190, 11}, + {2589, 34, -14}, + {5295, 90, -32}, + {-654, -206, 13}, + {-354, 0, -4}, + {-5738, -7, 52}, + {-273, 92, -19}, + {1474, -198, -18} + }, + { + {11447, 4, -23}, + {-12826, 118, 6}, + {2421, 38, 17}, + {5421, -122, 28}, + {-1285, 232, -42}, + {-339, 18, -15}, + {-5511, 4, 8}, + {127, -79, -20}, + {780, 136, -23} + }, + { + {11522, 39, -20}, + {-13353, -52, 23}, + {2215, -154, -19}, + {5737, -14, 14}, + {-2004, -73, -36}, + {-421, 47, 10}, + {-5338, 74, 12}, + {502, 139, -4}, + {256, -49, -10} + }, + { + {11591, -35, -3}, + {-13702, 23, 46}, + {2037, 58, -76}, + {6180, -51, -49}, + {-2670, 31, 31}, + {-563, 19, 52}, + {-5204, -19, 34}, + {783, -45, 18}, + {-25, -33, 23} + }, + { + {11654, 3, 2}, + {-13917, -89, 35}, + {1888, 107, -44}, + {6655, 159, -52}, + {-3248, -145, 54}, + {-684, -120, 29}, + {-5042, -8, 17}, + {924, -30, 4}, + {-121, -44, 27} + }, + { + {11724, 14, -12}, + {-14027, 31, 5}, + {1634, 8, 25}, + {7009, -141, -2}, + {-3721, 160, 12}, + {-638, -9, -15}, + {-4760, -63, -5}, + {989, 37, -23}, + {-116, 11, 1} + }, + { + {11825, 24, -23}, + {-14056, 41, 12}, + {1130, -250, 7}, + {7093, -75, 11}, + {-4046, -11, -2}, + {-323, 210, 16}, + {-4315, 154, 4}, + {1095, 27, -37}, + {-53, 28, -1} + }, + { + {11972, -64, -14}, + {-14065, -20, 32}, + {385, 266, -64}, + {6879, 182, -45}, + {-4205, -46, 35}, + {221, -191, 75}, + {-3755, -159, 30}, + {1319, -95, -28}, + {24, 12, -7} + }, + { + {12150, 51, 0}, + {-14102, 5, 47}, + {-467, -61, -47}, + {6475, -54, -64}, + {-4221, -23, 46}, + {869, 9, 47}, + {-3178, 48, 15}, + {1636, 105, -10}, + {90, 44, -9} + }, + { + {12334, -10, -5}, + {-14167, 43, 52}, + {-1298, -65, 95}, + {5997, -97, 31}, + {-4114, 149, -37}, + {1517, 84, -90}, + {-2663, -28, -42}, + {1960, -91, 8}, + {138, -72, 28} + }, + { + {12504, -14, -33}, + {-14232, -85, 22}, + {-2014, -59, 242}, + {5524, 77, 192}, + {-3937, -126, -196}, + {2061, 75, -213}, + {-2246, 114, -61}, + {2240, 32, 18}, + {178, 25, 68} + } }; -const Word32 rightHRIRImag_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA] /* Q29 */= +const Word16 rightHRIRImag_HOA2_fx[BINAURAL_CONVBANDS][HOA2_CHANNELS][BINAURAL_NTAPS_SBA]= { { - { -36158792, 332589920, -120427664, }, - { 74782896, -414234016, 138564768, }, - { -1993402, 15385110, -4536559, }, - { -12910672, 37127308, -11034308, }, - { 13785771, 13972065, -10325638, }, - { 5334350, 5939403, -4061429, }, - { 18512920, 23427972, -15831786, }, - { 3295314, -46312096, 20517058, }, - { 24953760, 133811320, -62957780, }, - }, - { - { 6790344, 394416512, -99059128, }, - { 59612536, -289198400, 180918512, }, - { -1410360, -11168526, -15667504, }, - { -16600585, 2608119, -22172232, }, - { 27442156, 41982232, -5173288, }, - { 8725226, 15491410, -4438849, }, - { 45414448, 82660944, -348966, }, - { -9163313, -111122616, -6783901, }, - { 88319024, 252158064, -29414620, }, - }, - { - { 119840864, -172064448, 92515208, }, - { -175912736, 498648928, -68749008, }, - { 10392747, -39891656, -8267812, }, - { 18903224, -44296144, -11482058, }, - { 1028108, -10605348, 22429930, }, - { -5090610, 2387465, 3582003, }, - { 21121038, 29187524, 28092308, }, - { -8322036, -78509320, -20295332, }, - { 75277352, 6205154, 71450536, }, - }, - { - { 84888952, -211159920, 71064528, }, - { -293597536, 167443600, -152749440, }, - { 16649441, 19593640, 12747463, }, - { 57636852, 42297376, 10699837, }, - { -63173064, -90405304, 7914014, }, - { -33967284, -71368936, -15578920, }, - { -59171228, -125028112, -14110578, }, - { 14133127, -4103305, 8483097, }, - { -83939768, -238660064, 3744138, }, - }, - { - { -84856208, 160208720, -34959960, }, - { -96670048, -340704192, 7391102, }, - { -6153078, 38164004, 9969156, }, - { 40164924, 26005490, 17468706, }, - { -94673424, 9172976, -21439402, }, - { -38052336, -47195784, -23022098, }, - { -105601432, -51099912, -31717796, }, - { 23212688, 3580392, 1049583, }, - { -236426672, 242666, -52827024, }, - }, - { - { -241306288, 23081692, -47294568, }, - { 241835648, 76635640, 87011208, }, - { -44483512, -43661564, -12531641, }, - { -49227304, -61918932, 1545115, }, - { -32010928, 61011620, -12165495, }, - { -1369558, 61596812, 11496017, }, - { -72386304, 68689408, 8167954, }, - { 21155936, -1467805, -432718, }, - { -245244240, 94062472, -9156333, }, - }, - { - { -279724256, -83891984, 187905, }, - { 487956064, 96942784, 27740120, }, - { -58395448, -28610388, -14624901, }, - { -154616144, 24776592, -8514773, }, - { 93974960, -58441620, 6685654, }, - { 32097364, 23796804, 18185966, }, - { -4830765, -6265821, 21151104, }, - { 2374043, -548145, 2821257, }, - { -121094456, -55359980, 19837918, }, - }, - { - { -199590352, 46742664, 28198070, }, - { 542467776, -70228080, -36100812, }, - { -38022272, 34528316, 4661114, }, - { -204685792, -340913, -7135015, }, - { 201704016, 17952964, 12763569, }, - { 43963284, -32239098, -4910222, }, - { 53434760, -29083372, 1289564, }, - { -29628296, -16311749, 2477659, }, - { 61041148, 25417616, 12723304, }, - }, - { - { -71485976, 3439732, 18509162, }, - { 449389952, -750546, -36375688, }, - { -10520522, -7513509, 13849659, }, - { -164350688, -39578124, -1079111, }, - { 224162400, 27566710, 6024766, }, - { 51943336, -8273181, -13044889, }, - { 88907968, -7683160, -11099806, }, - { -59125056, 6847252, -629750, }, - { 213081920, -12068321, 914291, }, - }, - { - { 40884868, -8075076, -3076807, }, - { 300000768, 8685498, -6082211, }, - { 957241, -27275726, 4496831, }, - { -53774600, 43806520, 8965744, }, - { 154083568, -52445308, -9099962, }, - { 69969312, 27617176, -1512902, }, - { 104226512, 15185931, -3274913, }, - { -69255272, -3904662, -2665027, }, - { 282055872, -6979859, -5660230, }, - }, - { - { 122261072, -14564234, -10473278, }, - { 150754960, 24950538, 8772471, }, - { 3320010, 4095788, -5724655, }, - { 66658428, -11882027, 7962333, }, - { 44114684, 12880607, -12540231, }, - { 90301152, -203474, 4349728, }, - { 99475200, 3833258, 1317481, }, - { -53058952, -18649822, -327491, }, - { 271441408, 13378286, -8655433, }, - }, - { - { 185318720, 23846196, -4557497, }, - { 15679852, -37565396, 4328254, }, - { 21893596, 13773960, -2983392, }, - { 150678720, 46171, -1040993, }, - { -48956720, 813896, -947577, }, - { 95590400, -9763534, -1977296, }, - { 79202416, -6300180, 253403, }, - { -18629420, 9327058, 4054449, }, - { 217019872, -10098542, -7290707, }, - }, - { - { 240183168, -16076599, 1266479, }, - { -105487080, 26186416, -283468, }, - { 70551816, -16828218, 678605, }, - { 189024736, -49392, -4967130, }, - { -105314744, 5423470, 4425964, }, - { 74048992, 757525, -2923262, }, - { 50586124, 7173133, 416612, }, - { 16224239, 1275605, 724239, }, - { 151719184, 2614025, -1576790, }, - }, - { - { 286097440, 4743792, 1162862, }, - { -210780352, -18678812, 364535, }, - { 145435648, 16265578, -83752, }, - { 195911168, -2299418, -5272073, }, - { -130978784, -1410360, 3964255, }, - { 19889456, -9549323, 2411087, }, - { 22510998, -8150774, -128312, }, - { 42030012, 3780645, -2588255, }, - { 89983856, -10215043, 2976949, }, - }, - { - { 319378048, -1308891, -1722282, }, - { -293717792, 12847321, 1720134, }, - { 224754560, -12506408, -3513820, }, - { 192708208, -6009196, -2883534, }, - { -143904496, 4290673, 3185792, }, - { -58067420, 21905944, 4212826, }, - { 7643431, 352724, -487479, }, - { 56253336, -7172059, -274341, }, - { 34664680, 15397458, 1792075, }, - }, - { - { 340915712, 3598109, -2687576, }, - { -349467520, -7507603, 2401961, }, - { 278644064, 11220065, -4716948, }, - { 190083440, 34897, -506806, }, - { -157392304, -4962298, 2032593, }, - { -131253128, -19497540, 2294050, }, - { 14569066, 4827007, 163746, }, - { 60362544, -1574642, 1777043, }, - { -10620380, -9889162, -326418, }, - }, - { - { 355079968, -3677566, -1744294, }, - { -381102656, 4260071, 2215130, }, - { 281619392, -1296006, -1116692, }, - { 185217248, 2087354, -1416802, }, - { -170087152, 3240553, 1831804, }, - { -165204304, 6737730, -682900, }, - { 41253696, -6271189, -472446, }, - { 62204012, 4499515, -101469, }, - { -42043436, 3895535, -408559, }, - }, - { - { 366027840, 2317672, -1134945, }, - { -397606592, -1345399, 2006824, }, - { 223802160, -20542828, 1700807, }, - { 171571600, -425202, -704912, }, - { -171730512, -1431298, 1205275, }, - { -138801536, 16011638, -1830193, }, - { 75993000, 6881612, -2061047, }, - { 72658496, 653909, -2717104, }, - { -58964532, 883153, 773631, }, - }, - { - { 375740384, -1729261, -1239098, }, - { -409371584, 2474438, 2047626, }, - { 121028960, 34863860, -778463, }, - { 143039056, 6924024, 1210644, }, - { -151491552, -5535676, -226560, }, - { -58364848, -31437014, 1287953, }, - { 100377680, -5044439, -2580739, }, - { 95764888, -8861591, -3254512, }, - { -64630132, -1622961, 2194728, }, - }, - { - { 383609824, 1746441, -1296006, }, - { -424501696, -6113886, 1065689, }, - { 11184632, -24941948, -3841848, }, - { 99827928, -15702937, 8590, }, - { -106059384, 15424838, 74088, }, - { 42509976, 23139674, 3684545, }, - { 95006288, -2285996, -1535988, }, - { 122857000, 11319923, -1122060, }, - { -64195804, -1420560, 2232309, }, - }, - { - { 387407136, -675384, -1110786, }, - { -446154208, 5822902, -92879, }, - { -67740760, 4913980, -1846299, }, - { 51632488, 11216307, -2097018, }, - { -45219028, -14675366, 887448, }, - { 123440048, -5479842, 469762, }, - { 48671644, 12622372, 137439, }, - { 134595152, 173409, 71404, }, - { -62093952, 6441377, -1045288, }, - }, - { - { 385254816, -637803, -812286, }, - { -473090112, -2037425, 1216550, }, - { -99903624, 4727149, 2258616, }, - { 11749957, 366146, 526134, }, - { 13227962, 10634339, 147103, }, - { 159256848, -3637301, -4543539, }, - { -32711544, -19771882, 2049236, }, - { 113054816, -12186970, -1802276, }, - { -60602524, 2531346, -3322157, }, - }, - { - { 377351520, 2255932, -482647, }, - { -501648416, 3520263, 4013647, }, - { -94568200, -5376226, 3605625, }, - { -11883638, 1945620, 3943854, }, - { 54005992, -6682969, -72478, }, - { 146007408, 3005403, -4282620, }, - { -125467272, 25107306, 1941325, }, - { 54234700, 12469901, -1246077, }, - { -62698468, -10954851, 1609002, }, - }, - { - { 366280192, -4061965, -805843, }, - { -525283616, -9440875, 3562675, }, - { -73869144, 2709588, 2083059, }, - { -15278272, -3664681, 2474438, }, - { 69738456, -3156801, -746787, }, - { 94421632, -8872329, 543850, }, - { -197179808, -18215494, -1489817, }, - { -32488206, -20340428, 1323387, }, - { -73730096, -3738769, 6418292, }, - }, - { - { 356168224, 2472828, -1493038, }, - { -533570240, 4927401, -20401, }, - { -58116276, -1755568, 771484, }, - { 5287105, -4551055, -365609, }, - { 63846300, 6586333, -2798171, }, - { 23891292, 20171314, 2127083, }, - { -223493984, -3424163, -3262028, }, - { -127029024, 21662742, 1534377, }, - { -90670520, 17609366, 2166811, }, - }, - { - { 349922272, 618475, -1319092, }, - { -518373568, 8857833, -1140851, }, - { -56720948, -883690, 1331977, }, - { 48408040, 13831405, -606664, }, - { 47076064, -2146947, -2979097, }, - { -40385040, -19214610, -1528472, }, - { -205683296, 20291572, 840740, }, - { -203235712, -13549011, 1227824, }, - { -96553552, -4800163, -4361540, }, - }, - { - { 346649504, -1439888, -318364, }, - { -483399104, -15989626, 1763621, }, - { -66776004, 6590091, 978179, }, - { 103736880, -14713484, 507343, }, - { 28132036, -848256, -367220, }, - { -75919456, -1214402, -2411087, }, - { -171571056, -12617003, 5709622, }, - { -240693728, 845035, 2171106, }, - { -76186280, -17254494, -3004330, }, - }, - { - { 342597184, -1294933, 166430, }, - { -443682464, 9204115, 4066260, }, - { -75551160, -3277060, -437550, }, - { 156191856, 10443750, 1022202, }, - { 9059697, -4929549, 889058, }, - { -78208672, 9521942, 970126, }, - { -153513408, -5825587, 4600984, }, - { -233576432, 5917928, 2312303, }, - { -33381560, 19739132, 3035468, }, - }, - { - { 334624672, 3918621, -566936, }, - { -413670304, 577136, 2447595, }, - { -70139504, -1757715, -1557999, }, - { 193998848, -3168612, 186831, }, - { -10993506, 6357089, -403727, }, - { -61479236, -9741523, 4020090, }, - { -164081168, 14096083, -239444, }, - { -189978208, -16337519, 2595771, }, - { 13108777, -5794448, 4198331, }, - }, - { - { 322606816, -3232500, -1260573, }, - { -396880736, -2692408, -843424, }, - { -46797428, 11288785, -991601, }, - { 214848752, 153545, -1243930, }, - { -32719598, -4962835, -1389959, }, - { -44736380, -1035087, 4147328, }, - { -192954096, -10519986, -3456375, }, - { -127260952, 14543833, 3575024, }, - { 47788492, -2278480, -68719, }, - }, - { - { 308399040, 1808181, -802085, }, - { -386778464, -3155727, -1571958, }, - { -13718662, -11858405, 1543504, }, - { 224974688, 794569, -2326799, }, - { -56534116, 457414, 206695, }, - { -37853156, 7458211, 425739, }, - { -221009888, -892279, -2015950, }, - { -63788316, -7458748, 1576790, }, - { 68279776, -1187559, -2947421, }, - }, - { - { 293636704, -2662343, -128312, }, - { -375935808, 5361193, 153008, }, - { 14427869, 3656628, 2450816, }, - { 232371696, 2226941, -2764348, }, - { -82602960, -5332202, 2313377, }, - { -36209260, -2982318, -2959233, }, - { -236805168, 4200478, 2068027, }, - { -9079561, 6485938, -1704028, }, - { 79947592, 3765076, -2320893, }, - }, - { - { 279406944, 3427384, -205085, }, - { -362203712, -3554086, 1072668, }, - { 28135258, 5444945, -106300, }, - { 240036064, -4869419, -1695975, }, - { -108520400, 9707163, 1090922, }, - { -30004104, -7593502, -1940788, }, - { -240686752, -710817, 3923990, }, - { 35410396, -11063299, -1749125, }, - { 87226488, -2617246, -1141924, }, - }, - { - { 266644992, -2608656, -476205, }, - { -347585248, 2545305, 769873, }, - { 28486370, -4051228, -3284576, }, - { 243368416, 2174864, -173946, }, - { -127333968, -4950487, -1104880, }, - { -16089484, 7972533, 1418950, }, - { -236118512, -1354525, 3016678, }, - { 69019048, 5398774, -811212, }, - { 90053120, 663572, -781684, }, - }, - { - { 255541424, 1991791, -520765, }, - { -335333856, -1934346, 435939, }, - { 22628572, -4581657, -1842541, }, - { 235510240, 2966749, 518080, }, - { -133714680, -2567317, -1082332, }, - { 433255, -551903, 1525250, }, - { -223574528, 2010582, 192737, }, - { 91384560, -5077188, -465467, }, - { 84883048, 1163399, -483721, }, - }, - { - { 245329600, -1373853, -308164, }, - { -327304960, 1559610, 599685, }, - { 13842680, -357556, 1105954, }, - { 214584080, -8028905, 86436, }, - { -130002752, 5317707, 677531, }, - { 14326937, -83752, -653909, }, - { -200260368, 7125888, -1465658, }, - { 103070624, -522375, -449898, }, - { 68426880, -4463008, 12348, }, - }, - { - { 234616880, 2107218, -43487, }, - { -322709344, -124554, 736587, }, - { 1589138, 5553930, 565862, }, - { 186385472, 9103183, -1245004, }, - { -125093072, -1516660, 1810866, }, - { 23804320, -2353642, -1084479, }, - { -166164768, -13082470, 473520, }, - { 106302048, -217433, -797790, }, - { 41465760, 7704098, -18254, }, - }, - { - { 222323072, -2915746, -19864, }, - { -318206080, 789200, 656056, }, - { -13198435, -4537096, -923955, }, - { 161084352, -4031901, -1812476, }, - { -127196528, -2785823, 1559073, }, - { 28687698, 1585380, -195958, }, - { -128549984, 8349954, 2117956, }, - { 105128448, -2126546, -1066763, }, - { 10321343, -6656126, -12885, }, - }, - { - { 208615696, 3557844, -220654, }, - { -309694528, -1555852, 404264, }, - { -28428388, 894427, -419296, }, - { 145905952, -1242856, -609885, }, - { -137842144, 5847598, 500901, }, - { 29700236, 334471, 172336, }, - { -96008088, -2522757, 846645, }, - { 103137200, -988379, -1157494, }, - { -16428787, 5519570, 15569, }, - }, - { - { 194701072, -3233574, -540629, }, - { -294416256, 4551055, 296890, }, - { -42549168, -2559801, 639950, }, - { 140792256, 2094333, 1074816, }, - { -151768576, -4850629, -831613, }, - { 28312962, -867583, -33286, }, - { -71958416, 2250026, -940061, }, - { 101641472, 158377, -641024, }, - { -32029182, -1188095, -28454, }, - }, - { - { 182000320, 1571421, -382252, }, - { -272313280, -6266358, 755914, }, - { -54702852, 4699768, -196495, }, - { 140131904, 2928631, 517544, }, - { -161241664, -1787243, -353798, }, - { 26629334, -1044751, 400506, }, - { -54589572, -4306242, -817118, }, - { 99131064, -478352, -254477, }, - { -34484292, -2201171, 446140, }, - }, - { - { 170964928, -1386738, 183610, }, - { -245976000, 6084895, 1145683, }, - { -64347736, -2036351, -1435056, }, - { 138324256, -2430415, -1476395, }, - { -162479680, 3643206, 1773822, }, - { 26885958, 612033, 1231582, }, - { -40347996, 3263638, 82678, }, - { 94091456, -1321776, 241592, }, - { -27213450, 3658775, 1133871, }, - }, - { - { 161127840, 2494839, 230318, }, - { -218601488, -4053912, 659814, }, - { -72627896, -2632815, -189515, }, - { 132085816, -731218, -1257352, }, - { -157013264, -20401, 2114198, }, - { 31015032, 1607392, 375810, }, - { -26279832, -1437203, -290984, }, - { 86541440, 3720516, -263067, }, - { -16163573, -1236951, 1034550, }, - }, - { - { 152307600, -2508261, -267899, }, - { -192162736, 4103841, -425202, }, - { -82927768, -598074, 2172180, }, - { 118860000, -1208496, 657667, }, - { -147158464, -732829, 167504, }, - { 40805412, 1704565, -1273458, }, - { -10628433, 3490735, -980863, }, - { 79426832, -1911261, -1018981, }, - { -5949067, -68183, -201327, }, - }, - { - { 144696368, 1319092, -537408, }, - { -167141872, -6891812, -175557, }, - { -97344896, 7576323, 1618129, }, - { 98060008, 6953015, 1093069, }, - { -133613752, -4267050, -679679, }, - { 55868396, -7104413, -654446, }, - { 5866926, -4824859, -618475, }, - { 75897976, -449898, -956167, }, - { 2306934, -2581275, -422517, }, - }, - { - { 138049920, -252866, -158377, }, - { -144453168, 4816269, 712428, }, - { -112335944, -5070746, -423591, }, - { 73207184, -8397735, -449361, }, - { -117530168, 5335960, 373125, }, - { 71457520, 3936338, 759672, }, - { 20044612, 3259343, 43487, }, - { 76154064, 2106682, -241592, }, - { 8460549, 700080, -55835, }, - }, - { - { 131315400, 1210644, 288300, }, - { -124574992, -3322157, 743566, }, - { -121577640, -2782602, 380105, }, - { 50560892, 2275796, -740345, }, - { -101227008, -2015950, 554588, }, - { 81823424, 2728915, -527207, }, - { 28654412, 806917, -407485, }, - { 77313704, -1054951, 514859, }, - { 12657805, -1239098, -40802, }, - }, - { - { 123408904, -2617783, 91268, }, - { -106087304, 2538326, 300648, }, - { -121654952, 5787469, 3679713, }, - { 34478388, 2088965, 1676111, }, - { -86537688, -592706, -1213865, }, - { 84390736, -4424353, -3697967, }, - { 30545270, -1830730, -1678795, }, - { 75919992, -574989, 882616, }, - { 15829639, 1928977, 729071, }, - }, - { - { 113971256, 2760590, -429497, }, - { -87232400, -2210298, -769336, }, - { -112382112, -1367410, 5208722, }, - { 25873420, 69256, 3870839, }, - { -75094280, -1138703, -3105261, }, - { 78730512, -127238, -4860829, }, - { 26732414, -753230, -1465121, }, - { 70934608, 1698660, 1145146, }, - { 18898392, -81604, 1235340, }, - }, - { - { 102863928, -1541356, -380105, }, - { -67243080, 4695473, -1672890, }, - { -94158568, -1594507, 2707977, }, - { 24968256, -4831838, 2573759, }, - { -68827928, 7074885, -1530082, }, - { 64571076, 3093450, -1923609, }, - { 18269718, -35970, 229244, }, - { 63774896, -2209761, 1298691, }, - { 23650238, -587337, 591632, }, - }, + {-1103, 10150, -3675}, + {2282, -12641, 4229}, + {-61, 470, -138}, + {-394, 1133, -337}, + {421, 426, -315}, + {163, 181, -124}, + {565, 715, -483}, + {101, -1413, 626}, + {762, 4084, -1921} + }, + { + {207, 12037, -3023}, + {1819, -8826, 5521}, + {-43, -341, -478}, + {-507, 80, -677}, + {837, 1281, -158}, + {266, 473, -135}, + {1386, 2523, -11}, + {-280, -3391, -207}, + {2695, 7695, -898} + }, + { + {3657, -5251, 2823}, + {-5368, 15218, -2098}, + {317, -1217, -252}, + {577, -1352, -350}, + {31, -324, 685}, + {-155, 73, 109}, + {645, 891, 857}, + {-254, -2396, -619}, + {2297, 189, 2181} + }, + { + {2591, -6444, 2169}, + {-8960, 5110, -4662}, + {508, 598, 389}, + {1759, 1291, 327}, + {-1928, -2759, 242}, + {-1037, -2178, -475}, + {-1806, -3816, -431}, + {431, -125, 259}, + {-2562, -7283, 114} + }, + { + {-2590, 4889, -1067}, + {-2950, -10397, 226}, + {-188, 1165, 304}, + {1226, 794, 533}, + {-2889, 280, -654}, + {-1161, -1440, -703}, + {-3223, -1559, -968}, + {708, 109, 32}, + {-7215, 7, -1612} + }, + { + {-7364, 704, -1443}, + {7380, 2339, 2655}, + {-1358, -1332, -382}, + {-1502, -1890, 47}, + {-977, 1862, -371}, + {-42, 1880, 351}, + {-2209, 2096, 249}, + {646, -45, -13}, + {-7484, 2871, -279} + }, + { + {-8537, -2560, 6}, + {14891, 2958, 847}, + {-1782, -873, -446}, + {-4719, 756, -260}, + {2868, -1783, 204}, + {980, 726, 555}, + {-147, -191, 645}, + {72, -17, 86}, + {-3696, -1689, 605} + }, + { + {-6091, 1426, 861}, + {16555, -2143, -1102}, + {-1160, 1054, 142}, + {-6247, -10, -218}, + {6156, 548, 390}, + {1342, -984, -150}, + {1631, -888, 39}, + {-904, -498, 76}, + {1863, 776, 388} + }, + { + {-2182, 105, 565}, + {13714, -23, -1110}, + {-321, -229, 423}, + {-5016, -1208, -33}, + {6841, 841, 184}, + {1585, -252, -398}, + {2713, -234, -339}, + {-1804, 209, -19}, + {6503, -368, 28} + }, + { + {1248, -246, -94}, + {9155, 265, -186}, + {29, -832, 137}, + {-1641, 1337, 274}, + {4702, -1600, -278}, + {2135, 843, -46}, + {3181, 463, -100}, + {-2114, -119, -81}, + {8608, -213, -173} + }, + { + {3731, -444, -320}, + {4601, 761, 268}, + {101, 125, -175}, + {2034, -363, 243}, + {1346, 393, -383}, + {2756, -6, 133}, + {3036, 117, 40}, + {-1619, -569, -10}, + {8284, 408, -264} + }, + { + {5655, 728, -139}, + {479, -1146, 132}, + {668, 420, -91}, + {4598, 1, -32}, + {-1494, 25, -29}, + {2917, -298, -60}, + {2417, -192, 8}, + {-569, 285, 124}, + {6623, -308, -222} + }, + { + {7330, -491, 39}, + {-3219, 799, -9}, + {2153, -514, 21}, + {5769, -2, -152}, + {-3214, 166, 135}, + {2260, 23, -89}, + {1544, 219, 13}, + {495, 39, 22}, + {4630, 80, -48} + }, + { + {8731, 145, 35}, + {-6433, -570, 11}, + {4438, 496, -3}, + {5979, -70, -161}, + {-3997, -43, 121}, + {607, -291, 74}, + {687, -249, -4}, + {1283, 115, -79}, + {2746, -312, 91} + }, + { + {9747, -40, -53}, + {-8964, 392, 52}, + {6859, -382, -107}, + {5881, -183, -88}, + {-4392, 131, 97}, + {-1772, 669, 129}, + {233, 11, -15}, + {1717, -219, -8}, + {1058, 470, 55} + }, + { + {10404, 110, -82}, + {-10665, -229, 73}, + {8504, 342, -144}, + {5801, 1, -15}, + {-4803, -151, 62}, + {-4006, -595, 70}, + {445, 147, 5}, + {1842, -48, 54}, + {-324, -302, -10} + }, + { + {10836, -112, -53}, + {-11630, 130, 68}, + {8594, -40, -34}, + {5652, 64, -43}, + {-5191, 99, 56}, + {-5042, 206, -21}, + {1259, -191, -14}, + {1898, 137, -3}, + {-1283, 119, -12} + }, + { + {11170, 71, -35}, + {-12134, -41, 61}, + {6830, -627, 52}, + {5236, -13, -22}, + {-5241, -44, 37}, + {-4236, 489, -56}, + {2319, 210, -63}, + {2217, 20, -83}, + {-1799, 27, 24} + }, + { + {11467, -53, -38}, + {-12493, 76, 62}, + {3694, 1064, -24}, + {4365, 211, 37}, + {-4623, -169, -7}, + {-1781, -959, 39}, + {3063, -154, -79}, + {2923, -270, -99}, + {-1972, -50, 67} + }, + { + {11707, 53, -40}, + {-12955, -187, 33}, + {341, -761, -117}, + {3047, -479, 0}, + {-3237, 471, 2}, + {1297, 706, 112}, + {2899, -70, -47}, + {3749, 345, -34}, + {-1959, -43, 68} + }, + { + {11823, -21, -34}, + {-13616, 178, -3}, + {-2067, 150, -56}, + {1576, 342, -64}, + {-1380, -448, 27}, + {3767, -167, 14}, + {1485, 385, 4}, + {4108, 5, 2}, + {-1895, 197, -32} + }, + { + {11757, -19, -25}, + {-14438, -62, 37}, + {-3049, 144, 69}, + {359, 11, 16}, + {404, 325, 4}, + {4860, -111, -139}, + {-998, -603, 63}, + {3450, -372, -55}, + {-1849, 77, -101} + }, + { + {11516, 69, -15}, + {-15309, 107, 122}, + {-2886, -164, 110}, + {-363, 59, 120}, + {1648, -204, -2}, + {4456, 92, -131}, + {-3829, 766, 59}, + {1655, 381, -38}, + {-1913, -334, 49} + }, + { + {11178, -124, -25}, + {-16030, -288, 109}, + {-2254, 83, 64}, + {-466, -112, 76}, + {2128, -96, -23}, + {2882, -271, 17}, + {-6017, -556, -45}, + {-991, -621, 40}, + {-2250, -114, 196} + }, + { + {10869, 75, -46}, + {-16283, 150, -1}, + {-1774, -54, 24}, + {161, -139, -11}, + {1948, 201, -85}, + {729, 616, 65}, + {-6820, -104, -100}, + {-3877, 661, 47}, + {-2767, 537, 66} + }, + { + {10679, 19, -40}, + {-15820, 270, -35}, + {-1731, -27, 41}, + {1477, 422, -19}, + {1437, -66, -91}, + {-1232, -586, -47}, + {-6277, 619, 26}, + {-6202, -413, 37}, + {-2947, -146, -133} + }, + { + {10579, -44, -10}, + {-14752, -488, 54}, + {-2038, 201, 30}, + {3166, -449, 15}, + {859, -26, -11}, + {-2317, -37, -74}, + {-5236, -385, 174}, + {-7345, 26, 66}, + {-2325, -527, -92} + }, + { + {10455, -40, 5}, + {-13540, 281, 124}, + {-2306, -100, -13}, + {4767, 319, 31}, + {276, -150, 27}, + {-2387, 291, 30}, + {-4685, -178, 140}, + {-7128, 181, 71}, + {-1019, 602, 93} + }, + { + {10212, 120, -17}, + {-12624, 18, 75}, + {-2140, -54, -48}, + {5920, -97, 6}, + {-335, 194, -12}, + {-1876, -297, 123}, + {-5007, 430, -7}, + {-5798, -499, 79}, + {400, -177, 128} + }, + { + {9845, -99, -38}, + {-12112, -82, -26}, + {-1428, 345, -30}, + {6557, 5, -38}, + {-999, -151, -42}, + {-1365, -32, 127}, + {-5888, -321, -105}, + {-3884, 444, 109}, + {1458, -70, -2} + }, + { + {9412, 55, -24}, + {-11804, -96, -48}, + {-419, -362, 47}, + {6866, 24, -71}, + {-1725, 14, 6}, + {-1155, 228, 13}, + {-6745, -27, -62}, + {-1947, -228, 48}, + {2084, -36, -90} + }, + { + {8961, -81, -4}, + {-11473, 164, 5}, + {440, 112, 75}, + {7091, 68, -84}, + {-2521, -163, 71}, + {-1105, -91, -90}, + {-7227, 128, 63}, + {-277, 198, -52}, + {2440, 115, -71} + }, + { + {8527, 105, -6}, + {-11054, -108, 33}, + {859, 166, -3}, + {7325, -149, -52}, + {-3312, 296, 33}, + {-916, -232, -59}, + {-7345, -22, 120}, + {1081, -338, -53}, + {2662, -80, -35} + }, + { + {8137, -80, -15}, + {-10607, 78, 23}, + {869, -124, -100}, + {7427, 66, -5}, + {-3886, -151, -34}, + {-491, 243, 43}, + {-7206, -41, 92}, + {2106, 165, -25}, + {2748, 20, -24} + }, + { + {7799, 61, -16}, + {-10234, -59, 13}, + {691, -140, -56}, + {7187, 91, 16}, + {-4081, -78, -33}, + {13, -17, 47}, + {-6823, 61, 6}, + {2789, -155, -14}, + {2590, 36, -15} + }, + { + {7487, -42, -9}, + {-9989, 48, 18}, + {422, -11, 34}, + {6549, -245, 3}, + {-3967, 162, 21}, + {437, -3, -20}, + {-6111, 217, -45}, + {3145, -16, -14}, + {2088, -136, 0} + }, + { + {7160, 64, -1}, + {-9848, -4, 22}, + {48, 169, 17}, + {5688, 278, -38}, + {-3818, -46, 55}, + {726, -72, -33}, + {-5071, -399, 14}, + {3244, -7, -24}, + {1265, 235, -1} + }, + { + {6785, -89, -1}, + {-9711, 24, 20}, + {-403, -138, -28}, + {4916, -123, -55}, + {-3882, -85, 48}, + {875, 48, -6}, + {-3923, 255, 65}, + {3208, -65, -33}, + {315, -203, 0} + }, + { + {6366, 109, -7}, + {-9451, -47, 12}, + {-868, 27, -13}, + {4453, -38, -19}, + {-4207, 178, 15}, + {906, 10, 5}, + {-2930, -77, 26}, + {3147, -30, -35}, + {-501, 168, 0} + }, + { + {5942, -99, -17}, + {-8985, 139, 9}, + {-1298, -78, 20}, + {4297, 64, 33}, + {-4632, -148, -25}, + {864, -26, -1}, + {-2196, 69, -29}, + {3102, 5, -20}, + {-977, -36, -1} + }, + { + {5554, 48, -12}, + {-8310, -191, 23}, + {-1669, 143, -6}, + {4276, 89, 16}, + {-4921, -55, -11}, + {813, -32, 12}, + {-1666, -131, -25}, + {3025, -15, -8}, + {-1052, -67, 14} + }, + { + {5217, -42, 6}, + {-7507, 186, 35}, + {-1964, -62, -44}, + {4221, -74, -45}, + {-4958, 111, 54}, + {820, 19, 38}, + {-1231, 100, 3}, + {2871, -40, 7}, + {-830, 112, 35} + }, + { + {4917, 76, 7}, + {-6671, -124, 20}, + {-2216, -80, -6}, + {4031, -22, -38}, + {-4792, -1, 65}, + {947, 49, 11}, + {-802, -44, -9}, + {2641, 114, -8}, + {-493, -38, 32} + }, + { + {4648, -77, -8}, + {-5864, 125, -13}, + {-2531, -18, 66}, + {3627, -37, 20}, + {-4491, -22, 5}, + {1245, 52, -39}, + {-324, 107, -30}, + {2424, -58, -31}, + {-182, -2, -6} + }, + { + {4416, 40, -16}, + {-5101, -210, -5}, + {-2971, 231, 49}, + {2993, 212, 33}, + {-4078, -130, -21}, + {1705, -217, -20}, + {179, -147, -19}, + {2316, -14, -29}, + {70, -79, -13} + }, + { + {4213, -8, -5}, + {-4408, 147, 22}, + {-3428, -155, -13}, + {2234, -256, -14}, + {-3587, 163, 11}, + {2181, 120, 23}, + {612, 99, 1}, + {2324, 64, -7}, + {258, 21, -2} + }, + { + {4007, 37, 9}, + {-3802, -101, 23}, + {-3710, -85, 12}, + {1543, 69, -23}, + {-3089, -62, 17}, + {2497, 83, -16}, + {874, 25, -12}, + {2359, -32, 16}, + {386, -38, -1} + }, + { + {3766, -80, 3}, + {-3238, 77, 9}, + {-3713, 177, 112}, + {1052, 64, 51}, + {-2641, -18, -37}, + {2575, -135, -113}, + {932, -56, -51}, + {2317, -18, 27}, + {483, 59, 22} + }, + { + {3478, 84, -13}, + {-2662, -67, -23}, + {-3430, -42, 159}, + {790, 2, 118}, + {-2292, -35, -95}, + {2403, -4, -148}, + {816, -23, -45}, + {2165, 52, 35}, + {577, -2, 38} + }, + { + {3139, -47, -12}, + {-2052, 143, -51}, + {-2873, -49, 83}, + {762, -147, 79}, + {-2100, 216, -47}, + {1971, 94, -59}, + {558, -1, 7}, + {1946, -67, 40}, + {722, -18, 18} + } }; -const Word32 FASTCONV_FOA_latency_s_fx = 20833; - -const Word32 leftHRIRReal_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA] /* Q29 */= +const Word16 FASTCONV_factor_Q_FOA_latency_s_fx = 31; +const Word32 FASTCONV_FOA_latency_s_fx = 44739; +const Word16 FASTCONV_factor_Q_FOA_fx = 14; +const Word16 leftHRIRReal_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]= { { - { 97523672, 405096480, 117391120, }, - { 168510352, -226681936, 72761040, }, - { 7752416, 62658204, -7288023, }, - { 23083838, 10139344, -8373576, }, + {2976, 12363, 3582}, + {5143, -6918, 2220}, + {237, 1912, -222}, + {704, 309, -256} }, { - { -91860224, -231391360, -85269600, }, - { -87150256, -545616512, 29677688, }, - { -4872641, 57707180, -5408975, }, - { -1218160, 32580012, 7697655, }, + {-2803, -7062, -2602}, + {-2660, -16651, 906}, + {-149, 1761, -165}, + {-37, 994, 235} }, { - { -171940960, -134628432, -89749248, }, - { -368214528, 37159520, -138843408, }, - { -11674258, 43248712, 5395016, }, - { -37626060, 48839148, 9722195, }, + {-5247, -4109, -2739}, + {-11237, 1134, -4237}, + {-356, 1320, 165}, + {-1148, 1490, 297} }, { - { -48351668, 213029312, 16819628, }, - { -294134400, 328650368, -34809100, }, - { -7545721, 5860483, -10766409, }, - { -56161528, -5217849, -7862475, }, + {-1476, 6501, 513}, + {-8976, 10030, -1062}, + {-230, 179, -329}, + {-1714, -159, -240} }, { - { 166833712, -29396904, 57186952, }, - { 41763724, -163917424, 77779176, }, - { 26105884, -27028766, -4032438, }, - { -19192598, -26607860, -4379256, }, + {5091, -897, 1745}, + {1275, -5002, 2374}, + {797, -825, -123}, + {-586, -812, -134} }, { - { 316903104, -63921460, 13246753, }, - { 380145408, -47550120, 50608136, }, - { 64360084, 26156350, 7871065, }, - { 64651068, 31446140, 2492692, }, + {9671, -1951, 404}, + {11601, -1451, 1544}, + {1964, 798, 240}, + {1973, 960, 76} }, { - { 342714240, 40063992, -23562728, }, - { 562947776, 70490080, -20235738, }, - { 76979232, 18240190, 7850664, }, - { 157704224, -9568113, -242129, }, + {10459, 1223, -719}, + {17180, 2151, -618}, + {2349, 557, 240}, + {4813, -292, -7} }, { - { 279815520, -2827162, -22232898, }, - { 587650304, 112743, -39622684, }, - { 58521076, -19127636, -1853278, }, - { 218817312, 18382996, -1549946, }, + {8539, -86, -678}, + {17934, 3, -1209}, + {1786, -584, -57}, + {6678, 561, -47} }, { - { 194067568, -7948911, -5098663, }, - { 529768096, -24970940, -15723875, }, - { 31035970, 14948634, -8168491, }, - { 219732144, 7948374, 3088082, }, + {5922, -243, -156}, + {16167, -762, -480}, + {947, 456, -249}, + {6706, 243, 94} }, { - { 123001424, -5282810, 5087926, }, - { 450608096, 378494, 4850092, }, - { 19481434, 16145856, -5490579, }, - { 157347744, -37542848, -2373506, }, + {3754, -161, 155}, + {13751, 12, 148}, + {595, 493, -168}, + {4802, -1146, -72} }, { - { 67425616, 16203301, 3928821, }, - { 369236192, 28034862, 4899484, }, - { 28122372, -10347650, 1939715, }, - { 66008816, 19518478, -7190849, }, + {2058, 494, 120}, + {11268, 856, 150}, + {858, -316, 59}, + {2014, 596, -219} }, { - { 16583942, -16200617, -446677, }, - { 285353856, -26029112, -2506114, }, - { 36405752, -2548526, 1474248, }, - { -13980119, -5101348, -2355790, }, + {506, -494, -14}, + {8708, -794, -76}, + {1111, -78, 45}, + {-427, -156, -72} }, { - { -33802468, 10267119, -1898912, }, - { 201879040, 14075145, -3394635, }, - { 22816476, 7213935, -933082, }, - { -64834140, 4773320, 1056562, }, + {-1032, 313, -58}, + {6161, 430, -104}, + {696, 220, -28}, + {-1979, 146, 32} }, { - { -80765248, -6639483, -563714, }, - { 125787248, -11312944, -415538, }, - { -24745454, -13758928, -980863, }, - { -87778392, 4248260, 3027952, }, + {-2465, -203, -17}, + {3839, -345, -13}, + {-755, -420, -30}, + {-2679, 130, 92} }, { - { -120569936, 5925445, 841277, }, - { 63367948, 11264625, 626528, }, - { -102320616, 17017734, 638340, }, - { -97495760, 4630512, 3665218, }, + {-3680, 181, 26}, + {1934, 344, 19}, + {-3123, 519, 19}, + {-2975, 141, 112} }, { - { -152345168, -6521908, 893890, }, - { 16718697, -7630010, 377957, }, - { -190588640, -18248242, 2711735, }, - { -108214384, -6749541, 830539, }, + {-4649, -199, 27}, + {510, -233, 12}, + {-5816, -557, 83}, + {-3302, -206, 25} }, { - { -177624272, 5427765, 150861, }, - { -17577154, 5733782, 326418, }, - { -263011456, 15330349, 2882997, }, - { -121832120, 1862405, 221191, }, + {-5421, 166, 5}, + {-536, 175, 10}, + {-8026, 468, 88}, + {-3718, 57, 7} }, { - { -198991744, -3744138, -146566, }, - { -45709188, -5207111, 259846, }, - { -295502880, -4590247, 1115618, }, - { -133506912, -1175747, 1578937, }, + {-6073, -114, -4}, + {-1395, -159, 8}, + {-9018, -140, 34}, + {-4074, -36, 48} }, { - { -219550144, 3167539, 266825, }, - { -72961832, 5575942, 307627, }, - { -277467232, -11616276, 259846, }, - { -136396880, 1964411, 1173063, }, + {-6700, 97, 8}, + {-2227, 170, 9}, + {-8468, -355, 8}, + {-4163, 60, 36} }, { - { -241995632, -4554813, 776315, }, - { -102694280, -7847442, -87510, }, - { -219062128, 21616034, 1965484, }, - { -124360240, 4155918, 24159, }, + {-7385, -139, 24}, + {-3134, -239, -3}, + {-6685, 660, 60}, + {-3795, 127, 1} }, { - { -267135696, 6463389, 639413, }, - { -136286832, 8490613, -1046361, }, - { -147398976, -16639777, 3440269, }, - { -95881920, -11134166, 1088774, }, + {-8152, 197, 20}, + {-4159, 259, -32}, + {-4498, -508, 105}, + {-2926, -340, 33} }, { - { -292788992, -5709086, 300111, }, - { -174024560, -6152541, -881005, }, - { -90929824, 4872104, 1822677, }, - { -56544856, 7351911, 1556926, }, + {-8935, -174, 9}, + {-5311, -188, -27}, + {-2775, 149, 56}, + {-1726, 224, 48} }, { - { -315248448, 4444755, 176094, }, - { -216430912, 5672578, 1190243, }, - { -63613836, 1815161, -973884, }, - { -14734959, -4429722, -980863, }, + {-9621, 136, 5}, + {-6605, 173, 36}, + {-1941, 55, -30}, + {-450, -135, -30} }, { - { -331795360, -2286533, 193810, }, - { -263258944, -11120744, 2431488, }, - { -60858612, -1745367, -1487132, }, - { 22258132, 7237557, -2788508, }, + {-10126, -70, 6}, + {-8034, -339, 74}, + {-1857, -53, -45}, + {679, 221, -85} }, { - { -342355616, 841277, 440234, }, - { -309661760, 12847858, 1188095, }, - { -67215168, 2202781, -774705, }, - { 46283104, -5788006, -2136209, }, + {-10448, 26, 13}, + {-9450, 392, 36}, + {-2051, 67, -24}, + {1412, -177, -65} }, { - { -349583488, -577673, 766652, }, - { -346501312, -7875360, -385473, }, - { -66369056, 1041530, -863288, }, - { 49858664, 1305133, -173946, }, + {-10668, -18, 23}, + {-10574, -240, -12}, + {-2025, 32, -26}, + {1522, 40, -5} }, { - { -356901056, 1767379, 918049, }, - { -366997440, 160524, -299037, }, - { -49406084, -6653441, -853088, }, - { 30276836, 9475235, 200790, }, + {-10892, 54, 28}, + {-11200, 5, -9}, + {-1508, -203, -26}, + {924, 289, 6} }, { - { -366345152, -3576634, 425202, }, - { -372272192, 4114579, 1374390, }, - { -19810000, 8818642, -529892, }, - { -6595459, -12531641, -1695438, }, + {-11180, -109, 13}, + {-11361, 126, 42}, + {-605, 269, -16}, + {-201, -382, -52} }, { - { -377341856, 2646237, -90731, }, - { -370839296, -1026497, 2412698, }, - { 9653476, -7412040, -16106, }, - { -47739100, 6718403, -1707786, }, + {-11516, 81, -3}, + {-11317, -31, 74}, + {295, -226, 0}, + {-1457, 205, -52} }, { - { -387915552, -1152125, 230854, }, - { -371675744, -3176665, 1544041, }, - { 25164214, 1859184, 654983, }, - { -82804288, -5714991, -727997, }, + {-11838, -35, 7}, + {-11343, -97, 47}, + {768, 57, 20}, + {-2527, -174, -22} }, { - { -396796992, 1392643, 666794, }, - { -378056992, 4689031, -171262, }, - { 19768660, 6249178, 256624, }, - { -108289544, 1178432, 206695, }, + {-12109, 42, 20}, + {-11537, 143, -5}, + {603, 191, 8}, + {-3305, 36, 6} }, { - { -403633504, -1648194, 535797, }, - { -387308864, -1229434, -613107, }, - { -2716030, -9990631, -1557463, }, - { -127641056, -3103114, 1093069, }, + {-12318, -50, 16}, + {-11820, -38, -19}, + {-83, -305, -48}, + {-3895, -95, 33} }, { - { -408498112, 863288, 293132, }, - { -395626080, 571231, 122407, }, - { -31068720, 5430986, -2434173, }, - { -147066656, 3565360, 1324461, }, + {-12466, 26, 9}, + {-12074, 17, 4}, + {-948, 166, -74}, + {-4488, 109, 40} }, { - { -411884672, -142271, 401579, }, - { -401592320, -314606, 565325, }, - { -54940148, 1724429, 31675, }, - { -169158896, -6089190, 1395864, }, + {-12570, -4, 12}, + {-12256, -10, 17}, + {-1677, 53, 1}, + {-5162, -186, 43} }, { - { -414639904, 598074, 517544, }, - { -406241088, 1180579, 527744, }, - { -71434432, 2633889, 2132988, }, - { -191106720, 6543920, 594316, }, + {-12654, 18, 16}, + {-12397, 36, 16}, + {-2180, 80, 65}, + {-5832, 200, 18} }, { - { -417352160, -893353, 362925, }, - { -411894336, -1373316, 320512, }, - { -82008640, -5202279, 586263, }, - { -206321104, -3711389, -562104, }, + {-12737, -27, 11}, + {-12570, -42, 10}, + {-2503, -159, 18}, + {-6296, -113, -17} }, { - { -419996256, 636729, 215285, }, - { -420462816, 2209761, 267899, }, - { -86930136, -235686, -577673, }, - { -209848880, -3002182, -424665, }, + {-12817, 19, 7}, + {-12832, 67, 8}, + {-2653, -7, -18}, + {-6404, -92, -13} }, { - { -422230720, -221728, 270583, }, - { -432432352, -2306398, 485868, }, - { -86706800, 3112778, 707059, }, - { -203022560, 5057324, 1082869, }, + {-12885, -7, 8}, + {-13197, -70, 15}, + {-2646, 95, 22}, + {-6196, 154, 33} }, { - { -423848832, 489089, 251792, }, - { -446671776, 3304977, 759672, }, - { -83068424, 68183, 1319092, }, - { -192733440, -1730872, 1611150, }, + {-12935, 15, 8}, + {-13631, 101, 23}, + {-2535, 2, 40}, + {-5882, -53, 49} }, { - { -424760992, 63351, 202937, }, - { -460961664, -3841848, 443455, }, - { -76892800, -1149441, -119722, }, - { -185762160, -2057289, 271120, }, + {-12963, 2, 6}, + {-14067, -117, 14}, + {-2347, -35, -4}, + {-5669, -63, 8} }, { - { -425047680, -271657, 370441, }, - { -472584928, 1830193, 166430, }, - { -68005976, -2961380, -936303, }, - { -184923568, 1370095, -1126355, }, + {-12971, -8, 11}, + {-14422, 56, 5}, + {-2075, -90, -29}, + {-5643, 42, -34} }, { - { -425072928, -341987, 346819, }, - { -479999104, 78920, 590021, }, - { -57284128, 6429566, 824634, }, - { -189367248, 2083059, -15032, }, + {-12972, -10, 11}, + {-14648, 2, 18}, + {-1748, 196, 25}, + {-5779, 64, 0} }, { - { -424990784, 175020, 139050, }, - { -483562304, -411243, 1259499, }, - { -47154984, -1808718, 2434710, }, - { -197468640, 1500017, 1709934, }, + {-12970, 5, 4}, + {-14757, -13, 38}, + {-1439, -55, 74}, + {-6026, 46, 52} }, { - { -424858176, 115964, 77846, }, - { -484666112, -1862405, 847719, }, - { -38233800, -2864743, 878321, }, - { -206326464, -4465156, 1128503, }, + {-12966, 4, 2}, + {-14791, -57, 26}, + {-1167, -87, 27}, + {-6297, -136, 34} }, { - { -424940832, -514859, 297427, }, - { -483952096, 216359, -72478, }, - { -27022860, -1696512, -1106491, }, - { -210888800, 2183991, -452582, }, + {-12968, -16, 9}, + {-14769, 7, -2}, + {-825, -52, -34}, + {-6436, 67, -14} }, { - { -425639840, -178778, 540092, }, - { -481676288, 1781875, 128849, }, - { -10166724, 7968775, -143345, }, - { -207172576, 4294968, -323196, }, + {-12989, -5, 16}, + {-14700, 54, 4}, + {-310, 243, -4}, + {-6322, 131, -10} }, { - { -427088864, 1015760, 356482, }, - { -479221184, -1410897, 833761, }, - { 11272679, -7029251, 1931125, }, - { -195597648, -5826123, 1405528, }, + {-13034, 31, 11}, + {-14625, -43, 25}, + {344, -215, 59}, + {-5969, -178, 43} }, { - { -428821344, -734976, -3221, }, - { -477736736, 622233, 1392643, }, - { 33686504, 441845, 1117228, }, - { -180261920, 1124745, 1406602, }, + {-13087, -22, 0}, + {-14579, 19, 43}, + {1028, 13, 34}, + {-5501, 34, 43} }, { - { -430334784, -178241, -29528, }, - { -476999616, 1311039, 1312649, }, - { 54553600, 3033321, -3351148, }, - { -164809712, 2705830, -1767379, }, + {-13133, -5, -1}, + {-14557, 40, 40}, + {1665, 93, -102}, + {-5030, 83, -54} }, { - { -431378464, 1071594, 520228, }, - { -476083168, -2218351, 50466, }, - { 72254768, 1032403, -7908646, }, - { -151465776, -1608465, -6150930, }, - }, + {-13165, 33, 16}, + {-14529, -68, 2}, + {2205, 32, -241}, + {-4622, -49, -188} + } }; -const Word32 leftHRIRImag_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA] /* Q29 */= +const Word16 leftHRIRImag_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]= { { - { -91827472, 317236480, -98863704, }, - { -131005096, 193167232, -34935264, }, - { -8050380, 19192062, -6576669, }, - { -16915192, 18672370, -5312338, }, + {-2802, 9681, -3017}, + {-3998, 5895, -1066}, + {-246, 586, -201}, + {-516, 570, -162} }, { - { -122729224, 256856768, -107804752, }, - { -251478928, -99211600, -118276424, }, - { -11542188, 14916958, -6755984, }, - { -32386738, 16429324, -1395328, }, + {-3745, 7839, -3290}, + {-7675, -3028, -3610}, + {-352, 455, -206}, + {-988, 501, -43} }, { - { 54239532, -244900640, 44591424, }, - { -23413478, -467581824, -29682518, }, - { 997506, 14816027, -8756365, }, - { -15600932, 18149458, -2875481, }, + {1655, -7474, 1361}, + {-715, -14269, -906}, + {30, 452, -267}, + {-476, 554, -88} }, { - { 220117072, -45366664, 74753368, }, - { 362508672, 117097448, 109974784, }, - { 21830246, 27549530, -9684614, }, - { 34092912, 30310658, -8868571, }, + {6717, -1384, 2281}, + {11063, 3574, 3356}, + {666, 841, -296}, + {1040, 925, -271} }, { - { 223175088, 142300320, 1409823, }, - { 544197568, 179799680, 43528956, }, - { 34919156, -21948894, 6631430, }, - { 97193496, -32147830, 2729989, }, + {6811, 4343, 43}, + {16608, 5487, 1328}, + {1066, -670, 202}, + {2966, -981, 83} }, { - { 79654464, -59800976, -39559332, }, - { 454156832, -134717024, -48993228, }, - { 13752485, -32286342, 6853694, }, - { 122940752, -17619566, 1726040, }, + {2431, -1825, -1207}, + {13860, -4111, -1495}, + {420, -985, 209}, + {3752, -538, 53} }, { - { -104061688, -7630010, -21617644, }, - { 216328368, 10750840, -49867256, }, - { -31508954, 22065932, -4387309, }, - { 86880744, 8264591, -2589865, }, + {-3176, -233, -660}, + {6602, 328, -1522}, + {-962, 673, -134}, + {2651, 252, -79} }, { - { -240973440, 13051332, 6510097, }, - { -22812182, 23365696, -3999688, }, - { -69285336, -7475391, -7755637, }, - { -2561948, -22775674, 3018825, }, + {-7354, 398, 199}, + {-696, 713, -122}, + {-2114, -228, -237}, + {-78, -695, 92} }, { - { -312108832, 8353712, 14778982, }, - { -195600864, 15555298, 20933134, }, - { -81934016, -17370458, -3028489, }, - { -117253144, 40628244, -170188, }, + {-9525, 255, 451}, + {-5969, 475, 639}, + {-2500, -530, -92}, + {-3578, 1240, -5} }, { - { -344269024, -17826262, 7607998, }, - { -309629568, -41896868, 13034689, }, - { -77344848, 11716671, 5335423, }, - { -210388432, -14371497, -5011690, }, + {-10506, -544, 232}, + {-9449, -1279, 398}, + {-2360, 358, 163}, + {-6421, -439, -153} }, { - { -364532672, 11803644, 40265, }, - { -389468160, 26263726, -153008, }, - { -82385528, 12043088, 4489852, }, - { -249460832, -14286672, 965831, }, + {-11125, 360, 1}, + {-11886, 802, -5}, + {-2514, 368, 137}, + {-7613, -436, 29} }, { - { -380773536, -935766, -1196148, }, - { -445324224, -4230543, -1495722, }, - { -111708344, -12504260, 124554, }, - { -239833664, 7385197, 5639829, }, + {-11620, -29, -37}, + {-13590, -129, -46}, + {-3409, -382, 4}, + {-7319, 225, 172} }, { - { -389682912, -2850785, 1179505, }, - { -477684128, -1794223, 2923799, }, - { -159179008, 11199664, 247497, }, - { -206065008, -8614631, 4379256, }, + {-11892, -87, 36}, + {-14578, -55, 89}, + {-4858, 342, 8}, + {-6289, -263, 134} }, { - { -389125632, 2067490, 2549600, }, - { -488572384, -1506997, 3925600, }, - { -205428816, -7463580, 1919314, }, - { -171335376, 2811593, 2982855, }, + {-11875, 63, 78}, + {-14910, -46, 120}, + {-6269, -228, 59}, + {-5229, 86, 91} }, { - { -381444096, -631360, 1968169, }, - { -484414880, -1114007, 2336462, }, - { -226298608, 986232, 2987150, }, - { -148377168, 3444564, -363998, }, + {-11641, -19, 60}, + {-14783, -34, 71}, + {-6906, 30, 91}, + {-4528, 105, -11} }, { - { -370938080, 1025960, 766652, }, - { -474210560, 2183454, 1662152, }, - { -205100800, 6620155, 2010045, }, - { -132984000, 4664872, -1546725, }, + {-11320, 31, 23}, + {-14472, 67, 51}, + {-6259, 202, 61}, + {-4058, 142, -47} }, { - { -360993088, -2371896, 439697, }, - { -466023808, -693100, 1343788, }, - { -139791520, -16778290, -210453, }, - { -115541064, -5763309, 226023, }, + {-11017, -72, 13}, + {-14222, -21, 41}, + {-4266, -512, -6}, + {-3526, -176, 7} }, { - { -353560640, 1990717, 912681, }, - { -463320128, -323733, 1133335, }, - { -45342508, 24715926, -1067836, }, - { -90984048, 4257923, 55298, }, + {-10790, 61, 28}, + {-14139, -10, 35}, + {-1384, 754, -33}, + {-2777, 130, 2} }, { - { -348975232, -579284, 1252520, }, - { -465747872, 1912871, 869731, }, - { 50002548, -22956064, 155693, }, - { -59099824, -6874095, -1229434, }, + {-10650, -18, 38}, + {-14213, 58, 27}, + {1526, -701, 5}, + {-1804, -210, -38} }, { - { -345565024, -584116, 925029, }, - { -471061824, -1830730, 382789, }, - { 116765128, 9101573, 934155, }, - { -25054692, 10072235, -651224, }, + {-10546, -18, 28}, + {-14376, -56, 12}, + {3563, 278, 29}, + {-765, 307, -20} }, { - { -340056736, -837519, 359167, }, - { -476513184, -745714, 787590, }, - { 139741600, 5599027, -766115, }, - { 1874216, -4294968, 311922, }, + {-10378, -26, 11}, + {-14542, -23, 24}, + {4265, 171, -23}, + {57, -131, 10} }, { - { -329512032, 3326452, 347892, }, - { -479915360, 2155537, 2514703, }, - { 125933272, -9092983, -2538863, }, - { 13040594, -4439386, -1731409, }, + {-10056, 102, 11}, + {-14646, 66, 77}, + {3843, -277, -77}, + {398, -135, -53} }, { - { -313767776, -4133906, 525597, }, - { -479220096, 1701344, 2884608, }, - { 97017944, 6705518, -2516851, }, - { 5670968, 1434519, -2862596, }, + {-9575, -126, 16}, + {-14625, 52, 88}, + {2961, 205, -77}, + {173, 44, -87} }, { - { -295445440, 4591320, 667331, }, - { -470126592, -565325, 970663, }, - { 75033616, -697395, -1292248, }, - { -19925428, -3649112, -606127, }, + {-9016, 140, 20}, + {-14347, -17, 30}, + {2290, -21, -39}, + {-608, -111, -18} }, { - { -278323008, -3292629, 802622, }, - { -447673024, -5935645, -395674, }, - { 71051104, -2177012, -416612, }, - { -61827664, 9865003, 1088774, }, + {-8494, -100, 24}, + {-13662, -181, -12}, + {2168, -66, -13}, + {-1887, 301, 33} }, { - { -265061760, 1615982, 630286, }, - { -412387200, 11010149, -35433, }, - { 81976432, 4446365, -627602, }, - { -112587200, -13473312, 853625, }, + {-8089, 49, 19}, + {-12585, 336, -1}, + {2502, 136, -19}, + {-3436, -411, 26} }, { - { -255525856, -602369, 188979, }, - { -371971552, -11827803, 1505386, }, - { 95436856, -5326297, 31675, }, - { -160003632, 10853919, -83215, }, + {-7798, -18, 6}, + {-11352, -361, 46}, + {2912, -163, 1}, + {-4883, 331, -3} }, { - { -247385824, 1291175, -201863, }, - { -337248896, 4990752, 2053531, }, - { 96728568, -2098092, 571231, }, - { -192391984, -3604015, -186294, }, + {-7550, 39, -6}, + {-10292, 152, 63}, + {2952, -64, 17}, + {-5871, -110, -6} }, { - { -238005072, -3346853, 132070, }, - { -314504352, 184684, 539018, }, - { 78651048, 6275484, 510564, }, - { -205117440, -2432562, 940061, }, + {-7263, -102, 4}, + {-9598, 6, 16}, + {2400, 192, 16}, + {-6260, -74, 29} }, { - { -226535360, 2879776, 651761, }, - { -301594208, -433792, -1168231, }, - { 45513232, -11270531, 24159, }, - { -202783120, 3430605, 2116345, }, + {-6913, 88, 20}, + {-9204, -13, -36}, + {1389, -344, 1}, + {-6188, 105, 65} }, { - { -213762128, -1999307, 403190, }, - { -291736736, -3833258, -1039919, }, - { 9752260, 9126806, -1229971, }, - { -194716640, -1034550, 2008434, }, + {-6524, -61, 12}, + {-8903, -117, -32}, + {298, 279, -38}, + {-5942, -32, 61} }, { - { -200588400, 2588255, 24159, }, - { -280100576, 4541391, 303332, }, - { -15143518, -1603633, -1153199, }, - { -187583232, 324807, 1420560, }, + {-6121, 79, 1}, + {-8548, 139, 9}, + {-462, -49, -35}, + {-5725, 10, 43} }, { - { -187805504, -2961917, 123480, }, - { -266554256, -3057480, 780610, }, - { -23128936, -5175973, 1080184, }, - { -181926224, 722628, 860067, }, + {-5731, -90, 4}, + {-8135, -93, 24}, + {-706, -158, 33}, + {-5552, 22, 26} }, { - { -176120496, 2148021, 235686, }, - { -253305904, 2241436, 539555, }, - { -17506286, 2914135, 2852932, }, - { -173383536, 683437, -49392, }, + {-5375, 66, 7}, + {-7730, 68, 16}, + {-534, 89, 87}, + {-5291, 21, -2} }, { - { -165675680, -1682554, 77846, }, - { -242489552, -1381906, 229244, }, - { -5524402, 2670396, 750546, }, - { -157129760, -4080756, -759672, }, + {-5056, -51, 2}, + {-7400, -42, 7}, + {-169, 82, 23}, + {-4795, -125, -23} }, { - { -156013072, 1801202, -73014, }, - { -234474608, 1538135, 200790, }, - { 9308268, 3935801, -1162862, }, - { -132938904, 8243653, -340913, }, + {-4761, 55, -2}, + {-7156, 47, 6}, + {284, 120, -35}, + {-4057, 252, -10} }, { - { -146564688, -2241436, 11274, }, - { -227799696, -1290101, 381715, }, - { 25715042, -6164352, 228707, }, - { -106540424, -7786239, 1059246, }, + {-4473, -68, 0}, + {-6952, -39, 12}, + {785, -188, 7}, + {-3251, -238, 32} }, { - { -137148512, 1853278, 86973, }, - { -220042992, 1846836, 517007, }, - { 41445896, 2162516, 934692, }, - { -86086712, 1642825, 1195612, }, + {-4185, 57, 3}, + {-6715, 56, 16}, + {1265, 66, 29}, + {-2627, 50, 36} }, { - { -127902512, -1851131, 9127, }, - { -208989888, -1779727, 242129, }, - { 55510304, -83215, -464393, }, - { -75707392, 1755568, -283468, }, + {-3903, -56, 0}, + {-6378, -54, 7}, + {1694, -3, -14}, + {-2310, 54, -9} }, { - { -119002272, 2083059, 107374, }, - { -193420624, 4080219, -36507, }, - { 68245960, 3600793, -1138166, }, - { -73431056, -808528, -1282048, }, + {-3632, 64, 3}, + {-5903, 125, -1}, + {2083, 110, -35}, + {-2241, -25, -39} }, { - { -110767744, -1299765, 119185, }, - { -173817856, -5373004, 339839, }, - { 79296904, -5206037, 417149, }, - { -74193416, -2953327, -99321, }, + {-3380, -40, 4}, + {-5305, -164, 10}, + {2420, -159, 13}, + {-2264, -90, -3} }, { - { -103295040, 1255741, -75699, }, - { -152354304, 4845797, 751619, }, - { 87356952, 671089, 1484985, }, - { -73872904, 734976, 1438814, }, + {-3152, 38, -2}, + {-4649, 148, 23}, + {2666, 20, 45}, + {-2254, 22, 44} }, { - { -96434360, -1574642, -77846, }, - { -131264936, -2705293, 316217, }, - { 92803504, 3612068, -277562, }, - { -69830264, 1721745, 538482, }, + {-2943, -48, -2}, + {-4006, -83, 10}, + {2832, 110, -8}, + {-2131, 53, 16} }, { - { -90215248, 1533840, 112743, }, - { -111481784, 2989834, -623844, }, - { 98670968, 573915, -2318746, }, - { -59650116, 1540820, -1165010, }, + {-2753, 47, 3}, + {-3402, 91, -19}, + {3011, 18, -71}, + {-1820, 47, -36} }, { - { -84677968, -1045288, 243739, }, - { -92820688, -5504001, -319975, }, - { 106743360, -6097780, -1290638, }, - { -43329776, -6536940, -955630, }, + {-2584, -32, 7}, + {-2833, -168, -10}, + {3258, -186, -39}, + {-1322, -199, -29} }, { - { -79586280, 331786, 13959, }, - { -75807784, 3888556, 570694, }, - { 113984672, 2543158, 522375, }, - { -25049860, 5942624, 534723, }, + {-2429, 10, 0}, + {-2313, 119, 17}, + {3479, 78, 16}, + {-764, 181, 16} }, { - { -74304008, -947577, -310848, }, - { -60786672, -2461553, 690953, }, - { 115839024, 4283156, -547071, }, - { -10739566, 200790, 307627, }, + {-2268, -29, -9}, + {-1855, -75, 21}, + {3535, 131, -17}, + {-328, 6, 9} }, { - { -68309304, 1848447, -228707, }, - { -46586972, 1466731, 171262, }, - { 110702784, -5914707, -3579318, }, - { -3607773, -3080029, -1977833, }, + {-2085, 56, -7}, + {-1422, 45, 5}, + {3378, -180, -109}, + {-110, -94, -60} }, { - { -61599496, -2068027, 153545, }, - { -31771484, -1588064, -951335, }, - { 99163816, 1153199, -4716411, }, - { -3590593, 390842, -3318936, }, + {-1880, -63, 5}, + {-970, -48, -29}, + {3026, 35, -144}, + {-110, 12, -101} }, { - { -54124640, 1265942, 319438, }, - { -15888158, 4613869, -1487132, }, - { 81348832, 1777043, -2140504, }, - { -10306311, 3014530, -1531693, }, - }, + {-1652, 39, 10}, + {-485, 141, -45}, + {2483, 54, -65}, + {-315, 92, -47} + } }; -const Word32 rightHRIRReal_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA] /* Q29 */= +const Word16 rightHRIRReal_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]= { { - { 97523672, 405096480, 117391120, }, - { -168510352, 226681936, -72761040, }, - { 7752416, 62658204, -7288023, }, - { 23083838, 10139344, -8373576, }, + {2976, 12363, 3582}, + {-5143, 6918, -2220}, + {237, 1912, -222}, + {704, 309, -256} }, { - { -91860224, -231391360, -85269600, }, - { 87150256, 545616512, -29677688, }, - { -4872641, 57707180, -5408975, }, - { -1218160, 32580012, 7697655, }, + {-2803, -7062, -2602}, + {2660, 16651, -906}, + {-149, 1761, -165}, + {-37, 994, 235} }, { - { -171940960, -134628432, -89749248, }, - { 368214528, -37159520, 138843408, }, - { -11674258, 43248712, 5395016, }, - { -37626060, 48839148, 9722195, }, + {-5247, -4109, -2739}, + {11237, -1134, 4237}, + {-356, 1320, 165}, + {-1148, 1490, 297} }, { - { -48351668, 213029312, 16819628, }, - { 294134400, -328650368, 34809100, }, - { -7545721, 5860483, -10766409, }, - { -56161528, -5217849, -7862475, }, + {-1476, 6501, 513}, + {8976, -10030, 1062}, + {-230, 179, -329}, + {-1714, -159, -240} }, { - { 166833712, -29396904, 57186952, }, - { -41763724, 163917424, -77779176, }, - { 26105884, -27028766, -4032438, }, - { -19192598, -26607860, -4379256, }, + {5091, -897, 1745}, + {-1275, 5002, -2374}, + {797, -825, -123}, + {-586, -812, -134} }, { - { 316903104, -63921460, 13246753, }, - { -380145408, 47550120, -50608136, }, - { 64360084, 26156350, 7871065, }, - { 64651068, 31446140, 2492692, }, + {9671, -1951, 404}, + {-11601, 1451, -1544}, + {1964, 798, 240}, + {1973, 960, 76} }, { - { 342714240, 40063992, -23562728, }, - { -562947776, -70490080, 20235738, }, - { 76979232, 18240190, 7850664, }, - { 157704224, -9568113, -242129, }, + {10459, 1223, -719}, + {-17180, -2151, 618}, + {2349, 557, 240}, + {4813, -292, -7} }, { - { 279815520, -2827162, -22232898, }, - { -587650304, -112743, 39622684, }, - { 58521076, -19127636, -1853278, }, - { 218817312, 18382996, -1549946, }, + {8539, -86, -678}, + {-17934, -3, 1209}, + {1786, -584, -57}, + {6678, 561, -47} }, { - { 194067568, -7948911, -5098663, }, - { -529768096, 24970940, 15723875, }, - { 31035970, 14948634, -8168491, }, - { 219732144, 7948374, 3088082, }, + {5922, -243, -156}, + {-16167, 762, 480}, + {947, 456, -249}, + {6706, 243, 94} }, { - { 123001424, -5282810, 5087926, }, - { -450608096, -378494, -4850092, }, - { 19481434, 16145856, -5490579, }, - { 157347744, -37542848, -2373506, }, + {3754, -161, 155}, + {-13751, -12, -148}, + {595, 493, -168}, + {4802, -1146, -72} }, { - { 67425616, 16203301, 3928821, }, - { -369236192, -28034862, -4899484, }, - { 28122372, -10347650, 1939715, }, - { 66008816, 19518478, -7190849, }, + {2058, 494, 120}, + {-11268, -856, -150}, + {858, -316, 59}, + {2014, 596, -219} }, { - { 16583942, -16200617, -446677, }, - { -285353856, 26029112, 2506114, }, - { 36405752, -2548526, 1474248, }, - { -13980119, -5101348, -2355790, }, + {506, -494, -14}, + {-8708, 794, 76}, + {1111, -78, 45}, + {-427, -156, -72} }, { - { -33802468, 10267119, -1898912, }, - { -201879040, -14075145, 3394635, }, - { 22816476, 7213935, -933082, }, - { -64834140, 4773320, 1056562, }, + {-1032, 313, -58}, + {-6161, -430, 104}, + {696, 220, -28}, + {-1979, 146, 32} }, { - { -80765248, -6639483, -563714, }, - { -125787248, 11312944, 415538, }, - { -24745454, -13758928, -980863, }, - { -87778392, 4248260, 3027952, }, + {-2465, -203, -17}, + {-3839, 345, 13}, + {-755, -420, -30}, + {-2679, 130, 92} }, { - { -120569936, 5925445, 841277, }, - { -63367948, -11264625, -626528, }, - { -102320616, 17017734, 638340, }, - { -97495760, 4630512, 3665218, }, + {-3680, 181, 26}, + {-1934, -344, -19}, + {-3123, 519, 19}, + {-2975, 141, 112} }, { - { -152345168, -6521908, 893890, }, - { -16718697, 7630010, -377957, }, - { -190588640, -18248242, 2711735, }, - { -108214384, -6749541, 830539, }, + {-4649, -199, 27}, + {-510, 233, -12}, + {-5816, -557, 83}, + {-3302, -206, 25} }, { - { -177624272, 5427765, 150861, }, - { 17577154, -5733782, -326418, }, - { -263011456, 15330349, 2882997, }, - { -121832120, 1862405, 221191, }, + {-5421, 166, 5}, + {536, -175, -10}, + {-8026, 468, 88}, + {-3718, 57, 7} }, { - { -198991744, -3744138, -146566, }, - { 45709188, 5207111, -259846, }, - { -295502880, -4590247, 1115618, }, - { -133506912, -1175747, 1578937, }, + {-6073, -114, -4}, + {1395, 159, -8}, + {-9018, -140, 34}, + {-4074, -36, 48} }, { - { -219550144, 3167539, 266825, }, - { 72961832, -5575942, -307627, }, - { -277467232, -11616276, 259846, }, - { -136396880, 1964411, 1173063, }, + {-6700, 97, 8}, + {2227, -170, -9}, + {-8468, -355, 8}, + {-4163, 60, 36} }, { - { -241995632, -4554813, 776315, }, - { 102694280, 7847442, 87510, }, - { -219062128, 21616034, 1965484, }, - { -124360240, 4155918, 24159, }, + {-7385, -139, 24}, + {3134, 239, 3}, + {-6685, 660, 60}, + {-3795, 127, 1} }, { - { -267135696, 6463389, 639413, }, - { 136286832, -8490613, 1046361, }, - { -147398976, -16639777, 3440269, }, - { -95881920, -11134166, 1088774, }, + {-8152, 197, 20}, + {4159, -259, 32}, + {-4498, -508, 105}, + {-2926, -340, 33} }, { - { -292788992, -5709086, 300111, }, - { 174024560, 6152541, 881005, }, - { -90929824, 4872104, 1822677, }, - { -56544856, 7351911, 1556926, }, + {-8935, -174, 9}, + {5311, 188, 27}, + {-2775, 149, 56}, + {-1726, 224, 48} }, { - { -315248448, 4444755, 176094, }, - { 216430912, -5672578, -1190243, }, - { -63613836, 1815161, -973884, }, - { -14734959, -4429722, -980863, }, + {-9621, 136, 5}, + {6605, -173, -36}, + {-1941, 55, -30}, + {-450, -135, -30} }, { - { -331795360, -2286533, 193810, }, - { 263258944, 11120744, -2431488, }, - { -60858612, -1745367, -1487132, }, - { 22258132, 7237557, -2788508, }, + {-10126, -70, 6}, + {8034, 339, -74}, + {-1857, -53, -45}, + {679, 221, -85} }, { - { -342355616, 841277, 440234, }, - { 309661760, -12847858, -1188095, }, - { -67215168, 2202781, -774705, }, - { 46283104, -5788006, -2136209, }, + {-10448, 26, 13}, + {9450, -392, -36}, + {-2051, 67, -24}, + {1412, -177, -65} }, { - { -349583488, -577673, 766652, }, - { 346501312, 7875360, 385473, }, - { -66369056, 1041530, -863288, }, - { 49858664, 1305133, -173946, }, + {-10668, -18, 23}, + {10574, 240, 12}, + {-2025, 32, -26}, + {1522, 40, -5} }, { - { -356901056, 1767379, 918049, }, - { 366997440, -160524, 299037, }, - { -49406084, -6653441, -853088, }, - { 30276836, 9475235, 200790, }, + {-10892, 54, 28}, + {11200, -5, 9}, + {-1508, -203, -26}, + {924, 289, 6} }, { - { -366345152, -3576634, 425202, }, - { 372272192, -4114579, -1374390, }, - { -19810000, 8818642, -529892, }, - { -6595459, -12531641, -1695438, }, + {-11180, -109, 13}, + {11361, -126, -42}, + {-605, 269, -16}, + {-201, -382, -52} }, { - { -377341856, 2646237, -90731, }, - { 370839296, 1026497, -2412698, }, - { 9653476, -7412040, -16106, }, - { -47739100, 6718403, -1707786, }, + {-11516, 81, -3}, + {11317, 31, -74}, + {295, -226, 0}, + {-1457, 205, -52} }, { - { -387915552, -1152125, 230854, }, - { 371675744, 3176665, -1544041, }, - { 25164214, 1859184, 654983, }, - { -82804288, -5714991, -727997, }, + {-11838, -35, 7}, + {11343, 97, -47}, + {768, 57, 20}, + {-2527, -174, -22} }, { - { -396796992, 1392643, 666794, }, - { 378056992, -4689031, 171262, }, - { 19768660, 6249178, 256624, }, - { -108289544, 1178432, 206695, }, + {-12109, 42, 20}, + {11537, -143, 5}, + {603, 191, 8}, + {-3305, 36, 6} }, { - { -403633504, -1648194, 535797, }, - { 387308864, 1229434, 613107, }, - { -2716030, -9990631, -1557463, }, - { -127641056, -3103114, 1093069, }, + {-12318, -50, 16}, + {11820, 38, 19}, + {-83, -305, -48}, + {-3895, -95, 33} }, { - { -408498112, 863288, 293132, }, - { 395626080, -571231, -122407, }, - { -31068720, 5430986, -2434173, }, - { -147066656, 3565360, 1324461, }, + {-12466, 26, 9}, + {12074, -17, -4}, + {-948, 166, -74}, + {-4488, 109, 40} }, { - { -411884672, -142271, 401579, }, - { 401592320, 314606, -565325, }, - { -54940148, 1724429, 31675, }, - { -169158896, -6089190, 1395864, }, + {-12570, -4, 12}, + {12256, 10, -17}, + {-1677, 53, 1}, + {-5162, -186, 43} }, { - { -414639904, 598074, 517544, }, - { 406241088, -1180579, -527744, }, - { -71434432, 2633889, 2132988, }, - { -191106720, 6543920, 594316, }, + {-12654, 18, 16}, + {12397, -36, -16}, + {-2180, 80, 65}, + {-5832, 200, 18} }, { - { -417352160, -893353, 362925, }, - { 411894336, 1373316, -320512, }, - { -82008640, -5202279, 586263, }, - { -206321104, -3711389, -562104, }, + {-12737, -27, 11}, + {12570, 42, -10}, + {-2503, -159, 18}, + {-6296, -113, -17} }, { - { -419996256, 636729, 215285, }, - { 420462816, -2209761, -267899, }, - { -86930136, -235686, -577673, }, - { -209848880, -3002182, -424665, }, + {-12817, 19, 7}, + {12832, -67, -8}, + {-2653, -7, -18}, + {-6404, -92, -13} }, { - { -422230720, -221728, 270583, }, - { 432432352, 2306398, -485868, }, - { -86706800, 3112778, 707059, }, - { -203022560, 5057324, 1082869, }, + {-12885, -7, 8}, + {13197, 70, -15}, + {-2646, 95, 22}, + {-6196, 154, 33} }, { - { -423848832, 489089, 251792, }, - { 446671776, -3304977, -759672, }, - { -83068424, 68183, 1319092, }, - { -192733440, -1730872, 1611150, }, + {-12935, 15, 8}, + {13631, -101, -23}, + {-2535, 2, 40}, + {-5882, -53, 49} }, { - { -424760992, 63351, 202937, }, - { 460961664, 3841848, -443455, }, - { -76892800, -1149441, -119722, }, - { -185762160, -2057289, 271120, }, + {-12963, 2, 6}, + {14067, 117, -14}, + {-2347, -35, -4}, + {-5669, -63, 8} }, { - { -425047680, -271657, 370441, }, - { 472584928, -1830193, -166430, }, - { -68005976, -2961380, -936303, }, - { -184923568, 1370095, -1126355, }, + {-12971, -8, 11}, + {14422, -56, -5}, + {-2075, -90, -29}, + {-5643, 42, -34} }, { - { -425072928, -341987, 346819, }, - { 479999104, -78920, -590021, }, - { -57284128, 6429566, 824634, }, - { -189367248, 2083059, -15032, }, + {-12972, -10, 11}, + {14648, -2, -18}, + {-1748, 196, 25}, + {-5779, 64, 0} }, { - { -424990784, 175020, 139050, }, - { 483562304, 411243, -1259499, }, - { -47154984, -1808718, 2434710, }, - { -197468640, 1500017, 1709934, }, + {-12970, 5, 4}, + {14757, 13, -38}, + {-1439, -55, 74}, + {-6026, 46, 52} }, { - { -424858176, 115964, 77846, }, - { 484666112, 1862405, -847719, }, - { -38233800, -2864743, 878321, }, - { -206326464, -4465156, 1128503, }, + {-12966, 4, 2}, + {14791, 57, -26}, + {-1167, -87, 27}, + {-6297, -136, 34} }, { - { -424940832, -514859, 297427, }, - { 483952096, -216359, 72478, }, - { -27022860, -1696512, -1106491, }, - { -210888800, 2183991, -452582, }, + {-12968, -16, 9}, + {14769, -7, 2}, + {-825, -52, -34}, + {-6436, 67, -14} }, { - { -425639840, -178778, 540092, }, - { 481676288, -1781875, -128849, }, - { -10166724, 7968775, -143345, }, - { -207172576, 4294968, -323196, }, + {-12989, -5, 16}, + {14700, -54, -4}, + {-310, 243, -4}, + {-6322, 131, -10} }, { - { -427088864, 1015760, 356482, }, - { 479221184, 1410897, -833761, }, - { 11272679, -7029251, 1931125, }, - { -195597648, -5826123, 1405528, }, + {-13034, 31, 11}, + {14625, 43, -25}, + {344, -215, 59}, + {-5969, -178, 43} }, { - { -428821344, -734976, -3221, }, - { 477736736, -622233, -1392643, }, - { 33686504, 441845, 1117228, }, - { -180261920, 1124745, 1406602, }, + {-13087, -22, 0}, + {14579, -19, -43}, + {1028, 13, 34}, + {-5501, 34, 43} }, { - { -430334784, -178241, -29528, }, - { 476999616, -1311039, -1312649, }, - { 54553600, 3033321, -3351148, }, - { -164809712, 2705830, -1767379, }, + {-13133, -5, -1}, + {14557, -40, -40}, + {1665, 93, -102}, + {-5030, 83, -54} }, { - { -431378464, 1071594, 520228, }, - { 476083168, 2218351, -50466, }, - { 72254768, 1032403, -7908646, }, - { -151465776, -1608465, -6150930, }, - }, + {-13165, 33, 16}, + {14529, 68, -2}, + {2205, 32, -241}, + {-4622, -49, -188} + } }; -const Word32 rightHRIRImag_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA] /* Q29 */= +const Word16 rightHRIRImag_FOA_fx[BINAURAL_CONVBANDS][FOA_CHANNELS][BINAURAL_NTAPS_SBA]= { { - { -91827472, 317236480, -98863704, }, - { 131005096, -193167232, 34935264, }, - { -8050380, 19192062, -6576669, }, - { -16915192, 18672370, -5312338, }, + {-2802, 9681, -3017}, + {3998, -5895, 1066}, + {-246, 586, -201}, + {-516, 570, -162} }, { - { -122729224, 256856768, -107804752, }, - { 251478928, 99211600, 118276424, }, - { -11542188, 14916958, -6755984, }, - { -32386738, 16429324, -1395328, }, + {-3745, 7839, -3290}, + {7675, 3028, 3610}, + {-352, 455, -206}, + {-988, 501, -43} }, { - { 54239532, -244900640, 44591424, }, - { 23413478, 467581824, 29682518, }, - { 997506, 14816027, -8756365, }, - { -15600932, 18149458, -2875481, }, + {1655, -7474, 1361}, + {715, 14269, 906}, + {30, 452, -267}, + {-476, 554, -88} }, { - { 220117072, -45366664, 74753368, }, - { -362508672, -117097448, -109974784, }, - { 21830246, 27549530, -9684614, }, - { 34092912, 30310658, -8868571, }, + {6717, -1384, 2281}, + {-11063, -3574, -3356}, + {666, 841, -296}, + {1040, 925, -271} }, { - { 223175088, 142300320, 1409823, }, - { -544197568, -179799680, -43528956, }, - { 34919156, -21948894, 6631430, }, - { 97193496, -32147830, 2729989, }, + {6811, 4343, 43}, + {-16608, -5487, -1328}, + {1066, -670, 202}, + {2966, -981, 83} }, { - { 79654464, -59800976, -39559332, }, - { -454156832, 134717024, 48993228, }, - { 13752485, -32286342, 6853694, }, - { 122940752, -17619566, 1726040, }, + {2431, -1825, -1207}, + {-13860, 4111, 1495}, + {420, -985, 209}, + {3752, -538, 53} }, { - { -104061688, -7630010, -21617644, }, - { -216328368, -10750840, 49867256, }, - { -31508954, 22065932, -4387309, }, - { 86880744, 8264591, -2589865, }, + {-3176, -233, -660}, + {-6602, -328, 1522}, + {-962, 673, -134}, + {2651, 252, -79} }, { - { -240973440, 13051332, 6510097, }, - { 22812182, -23365696, 3999688, }, - { -69285336, -7475391, -7755637, }, - { -2561948, -22775674, 3018825, }, + {-7354, 398, 199}, + {696, -713, 122}, + {-2114, -228, -237}, + {-78, -695, 92} }, { - { -312108832, 8353712, 14778982, }, - { 195600864, -15555298, -20933134, }, - { -81934016, -17370458, -3028489, }, - { -117253144, 40628244, -170188, }, + {-9525, 255, 451}, + {5969, -475, -639}, + {-2500, -530, -92}, + {-3578, 1240, -5} }, { - { -344269024, -17826262, 7607998, }, - { 309629568, 41896868, -13034689, }, - { -77344848, 11716671, 5335423, }, - { -210388432, -14371497, -5011690, }, + {-10506, -544, 232}, + {9449, 1279, -398}, + {-2360, 358, 163}, + {-6421, -439, -153} }, { - { -364532672, 11803644, 40265, }, - { 389468160, -26263726, 153008, }, - { -82385528, 12043088, 4489852, }, - { -249460832, -14286672, 965831, }, + {-11125, 360, 1}, + {11886, -802, 5}, + {-2514, 368, 137}, + {-7613, -436, 29} }, { - { -380773536, -935766, -1196148, }, - { 445324224, 4230543, 1495722, }, - { -111708344, -12504260, 124554, }, - { -239833664, 7385197, 5639829, }, + {-11620, -29, -37}, + {13590, 129, 46}, + {-3409, -382, 4}, + {-7319, 225, 172} }, { - { -389682912, -2850785, 1179505, }, - { 477684128, 1794223, -2923799, }, - { -159179008, 11199664, 247497, }, - { -206065008, -8614631, 4379256, }, + {-11892, -87, 36}, + {14578, 55, -89}, + {-4858, 342, 8}, + {-6289, -263, 134} }, { - { -389125632, 2067490, 2549600, }, - { 488572384, 1506997, -3925600, }, - { -205428816, -7463580, 1919314, }, - { -171335376, 2811593, 2982855, }, + {-11875, 63, 78}, + {14910, 46, -120}, + {-6269, -228, 59}, + {-5229, 86, 91} }, { - { -381444096, -631360, 1968169, }, - { 484414880, 1114007, -2336462, }, - { -226298608, 986232, 2987150, }, - { -148377168, 3444564, -363998, }, + {-11641, -19, 60}, + {14783, 34, -71}, + {-6906, 30, 91}, + {-4528, 105, -11} }, { - { -370938080, 1025960, 766652, }, - { 474210560, -2183454, -1662152, }, - { -205100800, 6620155, 2010045, }, - { -132984000, 4664872, -1546725, }, + {-11320, 31, 23}, + {14472, -67, -51}, + {-6259, 202, 61}, + {-4058, 142, -47} }, { - { -360993088, -2371896, 439697, }, - { 466023808, 693100, -1343788, }, - { -139791520, -16778290, -210453, }, - { -115541064, -5763309, 226023, }, + {-11017, -72, 13}, + {14222, 21, -41}, + {-4266, -512, -6}, + {-3526, -176, 7} }, { - { -353560640, 1990717, 912681, }, - { 463320128, 323733, -1133335, }, - { -45342508, 24715926, -1067836, }, - { -90984048, 4257923, 55298, }, + {-10790, 61, 28}, + {14139, 10, -35}, + {-1384, 754, -33}, + {-2777, 130, 2} }, { - { -348975232, -579284, 1252520, }, - { 465747872, -1912871, -869731, }, - { 50002548, -22956064, 155693, }, - { -59099824, -6874095, -1229434, }, + {-10650, -18, 38}, + {14213, -58, -27}, + {1526, -701, 5}, + {-1804, -210, -38} }, { - { -345565024, -584116, 925029, }, - { 471061824, 1830730, -382789, }, - { 116765128, 9101573, 934155, }, - { -25054692, 10072235, -651224, }, + {-10546, -18, 28}, + {14376, 56, -12}, + {3563, 278, 29}, + {-765, 307, -20} }, { - { -340056736, -837519, 359167, }, - { 476513184, 745714, -787590, }, - { 139741600, 5599027, -766115, }, - { 1874216, -4294968, 311922, }, + {-10378, -26, 11}, + {14542, 23, -24}, + {4265, 171, -23}, + {57, -131, 10} }, { - { -329512032, 3326452, 347892, }, - { 479915360, -2155537, -2514703, }, - { 125933272, -9092983, -2538863, }, - { 13040594, -4439386, -1731409, }, + {-10056, 102, 11}, + {14646, -66, -77}, + {3843, -277, -77}, + {398, -135, -53} }, { - { -313767776, -4133906, 525597, }, - { 479220096, -1701344, -2884608, }, - { 97017944, 6705518, -2516851, }, - { 5670968, 1434519, -2862596, }, + {-9575, -126, 16}, + {14625, -52, -88}, + {2961, 205, -77}, + {173, 44, -87} }, { - { -295445440, 4591320, 667331, }, - { 470126592, 565325, -970663, }, - { 75033616, -697395, -1292248, }, - { -19925428, -3649112, -606127, }, + {-9016, 140, 20}, + {14347, 17, -30}, + {2290, -21, -39}, + {-608, -111, -18} }, { - { -278323008, -3292629, 802622, }, - { 447673024, 5935645, 395674, }, - { 71051104, -2177012, -416612, }, - { -61827664, 9865003, 1088774, }, + {-8494, -100, 24}, + {13662, 181, 12}, + {2168, -66, -13}, + {-1887, 301, 33} }, { - { -265061760, 1615982, 630286, }, - { 412387200, -11010149, 35433, }, - { 81976432, 4446365, -627602, }, - { -112587200, -13473312, 853625, }, + {-8089, 49, 19}, + {12585, -336, 1}, + {2502, 136, -19}, + {-3436, -411, 26} }, { - { -255525856, -602369, 188979, }, - { 371971552, 11827803, -1505386, }, - { 95436856, -5326297, 31675, }, - { -160003632, 10853919, -83215, }, + {-7798, -18, 6}, + {11352, 361, -46}, + {2912, -163, 1}, + {-4883, 331, -3} }, { - { -247385824, 1291175, -201863, }, - { 337248896, -4990752, -2053531, }, - { 96728568, -2098092, 571231, }, - { -192391984, -3604015, -186294, }, + {-7550, 39, -6}, + {10292, -152, -63}, + {2952, -64, 17}, + {-5871, -110, -6} }, { - { -238005072, -3346853, 132070, }, - { 314504352, -184684, -539018, }, - { 78651048, 6275484, 510564, }, - { -205117440, -2432562, 940061, }, + {-7263, -102, 4}, + {9598, -6, -16}, + {2400, 192, 16}, + {-6260, -74, 29} }, { - { -226535360, 2879776, 651761, }, - { 301594208, 433792, 1168231, }, - { 45513232, -11270531, 24159, }, - { -202783120, 3430605, 2116345, }, + {-6913, 88, 20}, + {9204, 13, 36}, + {1389, -344, 1}, + {-6188, 105, 65} }, { - { -213762128, -1999307, 403190, }, - { 291736736, 3833258, 1039919, }, - { 9752260, 9126806, -1229971, }, - { -194716640, -1034550, 2008434, }, + {-6524, -61, 12}, + {8903, 117, 32}, + {298, 279, -38}, + {-5942, -32, 61} }, { - { -200588400, 2588255, 24159, }, - { 280100576, -4541391, -303332, }, - { -15143518, -1603633, -1153199, }, - { -187583232, 324807, 1420560, }, + {-6121, 79, 1}, + {8548, -139, -9}, + {-462, -49, -35}, + {-5725, 10, 43} }, { - { -187805504, -2961917, 123480, }, - { 266554256, 3057480, -780610, }, - { -23128936, -5175973, 1080184, }, - { -181926224, 722628, 860067, }, + {-5731, -90, 4}, + {8135, 93, -24}, + {-706, -158, 33}, + {-5552, 22, 26} }, { - { -176120496, 2148021, 235686, }, - { 253305904, -2241436, -539555, }, - { -17506286, 2914135, 2852932, }, - { -173383536, 683437, -49392, }, + {-5375, 66, 7}, + {7730, -68, -16}, + {-534, 89, 87}, + {-5291, 21, -2} }, { - { -165675680, -1682554, 77846, }, - { 242489552, 1381906, -229244, }, - { -5524402, 2670396, 750546, }, - { -157129760, -4080756, -759672, }, + {-5056, -51, 2}, + {7400, 42, -7}, + {-169, 82, 23}, + {-4795, -125, -23} }, { - { -156013072, 1801202, -73014, }, - { 234474608, -1538135, -200790, }, - { 9308268, 3935801, -1162862, }, - { -132938904, 8243653, -340913, }, + {-4761, 55, -2}, + {7156, -47, -6}, + {284, 120, -35}, + {-4057, 252, -10} }, { - { -146564688, -2241436, 11274, }, - { 227799696, 1290101, -381715, }, - { 25715042, -6164352, 228707, }, - { -106540424, -7786239, 1059246, }, + {-4473, -68, 0}, + {6952, 39, -12}, + {785, -188, 7}, + {-3251, -238, 32} }, { - { -137148512, 1853278, 86973, }, - { 220042992, -1846836, -517007, }, - { 41445896, 2162516, 934692, }, - { -86086712, 1642825, 1195612, }, + {-4185, 57, 3}, + {6715, -56, -16}, + {1265, 66, 29}, + {-2627, 50, 36} }, { - { -127902512, -1851131, 9127, }, - { 208989888, 1779727, -242129, }, - { 55510304, -83215, -464393, }, - { -75707392, 1755568, -283468, }, + {-3903, -56, 0}, + {6378, 54, -7}, + {1694, -3, -14}, + {-2310, 54, -9} }, { - { -119002272, 2083059, 107374, }, - { 193420624, -4080219, 36507, }, - { 68245960, 3600793, -1138166, }, - { -73431056, -808528, -1282048, }, + {-3632, 64, 3}, + {5903, -125, 1}, + {2083, 110, -35}, + {-2241, -25, -39} }, { - { -110767744, -1299765, 119185, }, - { 173817856, 5373004, -339839, }, - { 79296904, -5206037, 417149, }, - { -74193416, -2953327, -99321, }, + {-3380, -40, 4}, + {5305, 164, -10}, + {2420, -159, 13}, + {-2264, -90, -3} }, { - { -103295040, 1255741, -75699, }, - { 152354304, -4845797, -751619, }, - { 87356952, 671089, 1484985, }, - { -73872904, 734976, 1438814, }, + {-3152, 38, -2}, + {4649, -148, -23}, + {2666, 20, 45}, + {-2254, 22, 44} }, { - { -96434360, -1574642, -77846, }, - { 131264936, 2705293, -316217, }, - { 92803504, 3612068, -277562, }, - { -69830264, 1721745, 538482, }, + {-2943, -48, -2}, + {4006, 83, -10}, + {2832, 110, -8}, + {-2131, 53, 16} }, { - { -90215248, 1533840, 112743, }, - { 111481784, -2989834, 623844, }, - { 98670968, 573915, -2318746, }, - { -59650116, 1540820, -1165010, }, + {-2753, 47, 3}, + {3402, -91, 19}, + {3011, 18, -71}, + {-1820, 47, -36} }, { - { -84677968, -1045288, 243739, }, - { 92820688, 5504001, 319975, }, - { 106743360, -6097780, -1290638, }, - { -43329776, -6536940, -955630, }, + {-2584, -32, 7}, + {2833, 168, 10}, + {3258, -186, -39}, + {-1322, -199, -29} }, { - { -79586280, 331786, 13959, }, - { 75807784, -3888556, -570694, }, - { 113984672, 2543158, 522375, }, - { -25049860, 5942624, 534723, }, + {-2429, 10, 0}, + {2313, -119, -17}, + {3479, 78, 16}, + {-764, 181, 16} }, { - { -74304008, -947577, -310848, }, - { 60786672, 2461553, -690953, }, - { 115839024, 4283156, -547071, }, - { -10739566, 200790, 307627, }, + {-2268, -29, -9}, + {1855, 75, -21}, + {3535, 131, -17}, + {-328, 6, 9} }, { - { -68309304, 1848447, -228707, }, - { 46586972, -1466731, -171262, }, - { 110702784, -5914707, -3579318, }, - { -3607773, -3080029, -1977833, }, + {-2085, 56, -7}, + {1422, -45, -5}, + {3378, -180, -109}, + {-110, -94, -60} }, { - { -61599496, -2068027, 153545, }, - { 31771484, 1588064, 951335, }, - { 99163816, 1153199, -4716411, }, - { -3590593, 390842, -3318936, }, + {-1880, -63, 5}, + {970, 48, 29}, + {3026, 35, -144}, + {-110, 12, -101} }, { - { -54124640, 1265942, 319438, }, - { 15888158, -4613869, 1487132, }, - { 81348832, 1777043, -2140504, }, - { -10306311, 3014530, -1531693, }, - }, + {-1652, 39, 10}, + {485, -141, 45}, + {2483, 54, -65}, + {-315, 92, -47} + } }; -const Word32 FASTCONV_HRIR_latency_s_fx = 666667; - -const Word32 leftHRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS] /* Q29 */= +const Word16 FASTCONV_factor_Q_HRIR_latency_s_fx = 31; +const Word32 FASTCONV_HRIR_latency_s_fx = 1431656; +const Word16 FASTCONV_factor_Q_HRIR_fx = 13; +const Word16 leftHRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]= { { - { 625042304, -38326140, 24910274, }, - { 335878240, 171201152, 7902740, }, - { 537386304, 24339580, 36527624, }, - { 610952640, -82900920, -32977296, }, - { 162773888, 291606816, 80030808, }, - { 672814144, -110260936, -35019552, }, - { 45806900, 473868032, 110131016, }, - { 704516928, -118449832, -48664128, }, - { 31259846, 506221504, 91921424, }, - { 555327488, 63325536, 28055264, }, - { 365311136, 194221648, 26628798, }, - { 616197376, -46350752, 6811282, }, - { 134318128, 374452416, 114475376, }, - { 584630400, -49424872, -314606, }, - { 269210176, 195440880, 39850856, }, - }, - { - { 615573504, -83027624, 23161684, }, - { 153939680, -135309728, -82342040, }, - { 509388480, -61414812, 27712740, }, - { 678085120, 133931576, 33365990, }, - { -32580012, -194236672, -63221920, }, - { 725016256, 115785872, 39330088, }, - { -56443924, -209270128, -145981104, }, - { 738054144, 93220656, 26321708, }, - { -50629612, -88218632, -142844176, }, - { 558783296, -111704584, -44579076, }, - { 235484464, -10732050, -31916976, }, - { 626338304, -79976048, -6355478, }, - { -55024972, -244054000, -73130944, }, - { 589115456, -29078540, 8979703, }, - { 53143240, -92013232, -23232014, }, - }, - { - { 613705728, 190158608, -87268368, }, - { -47502340, -225702144, 1009317, }, - { 500094176, 66390532, -18193482, }, - { 707738112, 53812184, 55165632, }, - { -160684384, -74954160, -65988952, }, - { 728532736, 116576688, 32762010, }, - { -24977920, -437184192, -53591528, }, - { 726640256, 153417312, 2280628, }, - { 6060199, -491625056, 15927886, }, - { 619300480, -227791104, -7439957, }, - { 68508488, -8391829, -511638, }, - { 642141120, 15699179, -49628348, }, - { -149295744, -68784976, -106736376, }, - { 583061120, 57918708, -26482768, }, - { -174591488, 17845590, -8568997, }, - }, - { - { 711792064, 274690016, -82055352, }, - { -246570320, -252771712, 25805774, }, - { 569176064, 166868064, -9373229, }, - { 639823424, -91681448, 10991895, }, - { -120591408, 45267880, -33620468, }, - { 661089408, -61773976, -25802552, }, - { 45526652, 26081726, 112846504, }, - { 689595136, 6112812, -45711872, }, - { 39781060, -244305248, 111033496, }, - { 685362944, -63247152, 47053516, }, - { -118973816, -45193256, 16270947, }, - { 687694592, 133942848, -11167989, }, - { -50758996, 267372992, -9620727, }, - { 595376448, 97235912, -13216688, }, - { -268843488, -18899466, -7071664, }, - }, - { - { 862057920, -196809360, 76299024, }, - { -363332768, -48200808, -38664368, }, - { 680975680, -66029752, 62313532, }, - { 517202656, 39182988, -13852343, }, - { 42142756, -224898448, 23900956, }, - { 578456384, -10711112, -26575110, }, - { 16899086, 240396304, 28621662, }, - { 675961792, -76532024, -7255274, }, - { -31825708, 272278368, -90252832, }, - { 694145088, 78392816, -15985868, }, - { -275402432, 19490024, 19011136, }, - { 699485376, 22428320, 29043106, }, - { 104157792, -106337488, 88669600, }, - { 594321984, 26122528, 13720810, }, - { -167101616, -96108480, -3835943, }, - }, - { - { 893755328, -228144912, 63108100, }, - { -278544192, 77761992, 6783364, }, - { 720438336, -255192992, -13665512, }, - { 399979552, 6000070, -7042136, }, - { 156205280, -23141820, 77895672, }, - { 512157120, 10667088, -5974837, }, - { -31854698, -64270964, -75585520, }, - { 667064256, 27399744, 34042448, }, - { -14828375, 393006144, -40407588, }, - { 722442496, 111037256, 533113, }, - { -356493568, -38231652, 11823508, }, - { 626011904, -82572360, -625992, }, - { 115784800, -171748224, 61668752, }, - { 536772128, -35543540, -3380139, }, - { 45074072, 72021768, 15156940, }, - }, - { - { 848944832, 184383488, -79126184, }, - { -73698416, 41248328, -20535312, }, - { 734158656, -104955576, -76299024, }, - { 328131200, -52250424, 26017302, }, - { 83268144, 220971232, 1210644, }, - { 478818528, -4858145, 3739306, }, - { -17207786, -185924832, -29459180, }, - { 647532864, 87085832, 14063334, }, - { 37145560, 13910862, 105687336, }, - { 766663488, 87857848, 5260261, }, - { -334238656, -15821586, -947040, }, - { 512291360, 14954002, -14906221, }, - { -16082505, 188711200, -38655244, }, - { 441034624, 10546829, -3133716, }, - { 202894256, -21919902, 18131742, }, - }, - { - { 900337344, 202598976, -76710264, }, - { 182968832, 166872896, -25620554, }, - { 774260736, 183863248, 31660888, }, - { 287297888, -74439840, 22798760, }, - { -58633820, -30077656, -56673168, }, - { 481663936, 8292508, 8747238, }, - { 24970940, 68754376, 57749056, }, - { 644221504, -19704236, -26892400, }, - { -9427453, -322418912, -27601070, }, - { 828069184, 40436044, -29763586, }, - { -206094544, 45814416, -1173063, }, - { 412233120, -1234803, -1341104, }, - { -114652008, 22880364, -75015360, }, - { 329985568, -20840256, 6089727, }, - { 209146112, -50087908, 9846749, }, - }, - { - { 1047088896, -194659728, 43730284, }, - { 366514784, -87303264, 40976672, }, - { 742656192, 139103248, 52795884, }, - { 272615008, 16188805, -11766063, }, - { -114707304, -54439248, -33390686, }, - { 510879904, 21948356, -520765, }, - { 17126718, 143042272, 28806346, }, - { 699449920, -91850024, -6042482, }, - { -24763170, -206299632, -69475392, }, - { 919253440, -104362336, 10414759, }, - { -14831059, -71486512, 9839770, }, - { 358785984, 5443334, 4399657, }, - { -63852204, -181701280, -10722923, }, - { 235267568, 42878804, -1713155, }, - { 77541336, 88224000, -13798119, }, - }, - { - { 1123982208, -105683040, 55635932, }, - { 328002368, -158853120, 19053012, }, - { 635256832, -136615936, -37422052, }, - { 308759840, 62324808, 1898912, }, - { -54308788, 119649200, 13070659, }, - { 567933696, 23300734, -9535901, }, - { -19162534, -72129144, -44424996, }, - { 789915904, 13496935, 18928458, }, - { 20692616, 124913752, 58988692, }, - { 959227776, -50255412, 22593138, }, - { 169172320, 1418413, 5950677, }, - { 362694944, -3298535, -1773285, }, - { 54667956, 60081760, 48018808, }, - { 193888240, 11763915, -7717520, }, - { -84051976, -10931766, -20318954, }, - }, - { - { 1061163456, 129533528, -23348516, }, - { 115933512, 54171348, -20616916, }, - { 550549824, -101550208, -32472638, }, - { 375784928, -266288, 15702937, }, - { 45247480, -22406844, 44503916, }, - { 652130624, -41226856, 1646046, }, - { -17834314, -101530880, -31956704, }, - { 872475392, 27085674, -3548180, }, - { 8262444, 212076896, 22017076, }, - { 921522816, 53132504, -10414222, }, - { 293410688, -7770670, -11642046, }, - { 410655776, -33762736, -339302, }, - { 94559608, 61743376, 34906272, }, - { 215555280, -39306468, 7264401, }, - { -169639392, -46001784, 9142912, }, - }, - { - { 933114368, 22093848, -32720672, }, - { -121721520, -43738336, -8097624, }, - { 494997664, 19759534, 23136452, }, - { 444172096, -36144296, -12401718, }, - { 75576392, -114045880, 3667365, }, - { 733825792, -1081258, 2262374, }, - { 14139032, 87575992, 32541356, }, - { 939120896, 32734094, -12346420, }, - { -19392852, 7123204, -55031952, }, - { 852432896, -9301289, -18699750, }, - { 337437312, 5166309, -13647259, }, - { 472952672, 23739894, 11385958, }, - { 25549150, -84922776, 491237, }, - { 268112256, -3453154, 10877542, }, - { -152883648, -14016626, 17564806, }, - }, - { - { 808061568, 12100533, -4268661, }, - { -269692256, 7937100, -2384781, }, - { 423107424, 58875412, 14115947, }, - { 507483136, -62690416, -14868640, }, - { 38092064, 6757594, -32236950, }, - { 786537344, -938987, -7950522, }, - { 18486612, 77123120, 34720516, }, - { 974787392, -12577812, 1095217, }, - { 1819992, -147699632, 6068252, }, - { 789703808, -11702712, -6681896, }, - { 289339072, -1104880, -3964792, }, - { 519936384, 28106802, 3049427, }, - { -67787472, 68001680, -30844308, }, - { 320355168, 12771085, -5028870, }, - { -55746528, 10052908, -11537356, }, - }, - { - { 710308672, -16774532, -5884105, }, - { -264577504, 33274186, 2607582, }, - { 337924256, -31025770, -6185827, }, - { 532032096, 22328462, 13090523, }, - { -10758893, 44742820, -5711233, }, - { 795033344, 9193914, -5691369, }, - { -10329396, -93899256, -23986856, }, - { 953060224, -46311020, -9642738, }, - { 13652090, -58238144, 38045896, }, - { 745974592, 75162, 3201898, }, - { 153929488, -34870840, 5812165, }, - { 552490112, -8643085, -15971373, }, - { -79250736, 42124504, -40099424, }, - { 359595072, 18285286, -9487583, }, - { 79966920, 67082556, -16285442, }, - }, - { - { 634855232, -24634858, 3785477, }, - { -141451520, -45782204, 6092411, }, - { 254404336, 7821136, -4571456, }, - { 477775936, 54230404, 9673877, }, - { -45016088, -10459319, 21311628, }, - { 744544960, 14347875, 413927, }, - { -18442052, -56763900, -35335768, }, - { 872367424, 952409, -17485886, }, - { -5615670, 84819160, -16463683, }, - { 706909760, 23321672, -1428077, }, - { -37825776, 60159608, 3164854, }, - { 584314176, -42927660, -8116415, }, - { 5742372, -135769280, 3150359, }, - { 369367712, -11576011, -375810, }, - { 172647488, -49075908, 8621610, }, - }, - { - { 538955072, -13040594, 24205362, }, - { 15072651, 50944216, 13710072, }, - { 187226752, -5189394, 2030446, }, - { 367362496, -49736796, -9050570, }, - { -50834696, -49825380, 8231305, }, - { 638520448, -28745680, 1804423, }, - { 5716602, 87666192, 13341242, }, - { 736861248, 15118285, 10206453, }, - { -9424232, 56697328, -25742424, }, - { 649502144, -17821430, -9939091, }, - { -219684352, -36769752, -482110, }, - { 598292672, 6328635, 7124277, }, - { 81932408, 45398880, 53095460, }, - { 334426016, -10021232, 5326833, }, - { 149414400, -23850490, 21712134, }, - }, - { - { 397379488, 104956656, 5082557, }, - { 125673968, 17753784, 9321690, }, - { 149467008, 2914135, 4262755, }, - { 257603008, 8898098, -11051488, }, - { -20718922, 27423366, -28011776, }, - { 506127552, 32068374, 2290828, }, - { 20265266, 5883569, 42024644, }, - { 544590016, 78309064, 19809462, }, - { 7227893, -67430448, 20556250, }, - { 556742656, -2592550, -1637993, }, - { -321714528, 9211631, 1069984, }, - { 567954112, 30062086, 1427540, }, - { 52476984, 129614056, 30575336, }, - { 260188048, 30055108, 3881577, }, - { 18473192, 89390080, 6312528, }, - }, - { - { 258143104, -34475704, -23410792, }, - { 162220384, -35226784, -14843944, }, - { 143663440, 850404, 3514357, }, - { 196611248, 29874718, 7045894, }, - { 39367672, 96164856, -16363289, }, - { 391071808, -25950730, 772557, }, - { -3548180, -142337904, -8863739, }, - { 343604896, -82419352, -5340792, }, - { 7097434, -70594232, 19371376, }, - { 416423392, -35428112, 9055402, }, - { -306525920, 20317880, 2103997, }, - { 494898880, -19892678, -4767951, }, - { -42094436, -123787936, -41830296, }, - { 171719776, -38439956, -6002754, }, - { -125548336, -57329760, -18460306, }, - }, - { - { 186234608, -56275344, -2545842, }, - { 149700544, -15543487, -19137300, }, - { 165364288, -8795019, 3685619, }, - { 207906480, -11742977, 21865142, }, - { 74812960, -56720412, 33527588, }, - { 342108096, -9793599, 3819837, }, - { -22778896, -28792388, -50524920, }, - { 224280512, -4655745, -12516608, }, - { -10169946, 55358908, -28482612, }, - { 240936384, 58211304, 3536906, }, - { -185469568, -39997420, 2193118, }, - { 395104256, 23114440, -3353296, }, - { -74164424, -86611776, -47780436, }, - { 105167104, -6638409, -7066295, }, - { -173409840, -28682866, -19873350, }, - }, - { - { 179931744, 12965433, 22897544, }, - { 105323872, 22173842, 1312113, }, - { 207433504, 2630131, 1804423, }, - { 303123744, -13679471, 8104604, }, - { 30630634, -85687280, 33305860, }, - { 392402720, 24051816, 9910100, }, - { 6169721, 159945648, 18145700, }, - { 236913616, 52297132, 6293201, }, - { -2450279, 113075216, -6314676, }, - { 74994424, -41807748, -5413270, }, - { -14849313, 42407432, 1881733, }, - { 288295936, -18919330, -2345052, }, - { -10800769, 124163744, 16718697, }, - { 77771656, 19129784, 6313065, }, - { -94409288, 83413632, 5292474, }, - }, - { - { 207316464, 32352914, 8996346, }, - { 28367722, 11352135, 17681306, }, - { 260098928, -1567663, -5674726, }, - { 493192160, -18697604, -19944218, }, - { -55946780, 123041688, -25584584, }, - { 544934720, -18092012, 1531693, }, - { 20092930, 83791056, 44481364, }, - { 367152064, -42682312, 18682570, }, - { 11063836, 15476378, 30881352, }, - { -38214472, 3738769, -4303021, }, - { 133796288, -29187524, 2644626, }, - { 197532528, -1098438, 5455146, }, - { 52898964, 14692009, 39791260, }, - { 79354888, 1855963, 11523934, }, - { 39827768, -23616414, 17642652, }, - }, - { - { 255391104, -3300682, -12565464, }, - { -69984344, -64994668, 7815230, }, - { 309282752, 20043538, -7486665, }, - { 754250496, 88805968, -26157962, }, - { -81857248, 52066816, -46926276, }, - { 773598784, 38256884, -16646756, }, - { -7791071, -102232032, -24181202, }, - { 563862080, 4434554, 3325915, }, - { -3101503, -88045216, -9091372, }, - { -87747256, 15495168, 6041945, }, - { 207639120, -3164317, 795643, }, - { 138111120, -15164993, 10856067, }, - { 46018964, -69473240, 9407052, }, - { 103952704, -7817378, 4638565, }, - { 130414000, -16855600, 1413581, }, - }, - { - { 314552672, -41536092, -8077223, }, - { -153698624, 52211768, -22286586, }, - { 332848704, -26689464, 4923107, }, - { 993195648, -101502424, -251792, }, - { -13014288, -137779872, 9877351, }, - { 1013642368, -73787000, -18562312, }, - { -14167486, -78821240, -29317446, }, - { 768001344, -13456669, -25697326, }, - { -8565239, -48564804, -23686208, }, - { -99047848, 2668785, 10101763, }, - { 197247984, 20113332, -4068945, }, - { 126544232, 16342887, 2228014, }, - { -9654550, 48223892, -18820546, }, - { 158825200, -2674154, -4586488, }, - { 130527280, 6726993, -6411313, }, - }, - { - { 357153376, 23606214, 8338142, }, - { -173407152, 80022760, -10335839, }, - { 311526848, -16561931, 13072807, }, - { 1076533504, -11509975, 15732465, }, - { 60987460, -6754373, 41550588, }, - { 1159097344, 47392816, -2072859, }, - { 5602785, 54272280, 18927920, }, - { 918634432, 72778760, -22099754, }, - { 6779606, 63433444, 19216220, }, - { -104071352, -11424076, 4241280, }, - { 133954128, -19498078, -5927592, }, - { 182078704, 12781823, -7573101, }, - { -46579456, 18314278, -20225000, }, - { 249549952, 27696634, -7901666, }, - { 50426136, -12663711, 3757560, }, - }, - { - { 354743360, 22876606, 8448201, }, - { -125086088, -64300492, 37410240, }, - { 263105408, 37308772, 4003983, }, - { 935057856, 98520104, -1078037, }, - { 59869696, 90144920, 3503083, }, - { 1110528256, 38748660, 6838125, }, - { 9542880, 47780436, 17816598, }, - { 936150912, -29707216, 10800769, }, - { 4467303, 80529024, 12106976, }, - { -115432080, 2697776, 1560684, }, - { 60918204, 12298639, -4695473, }, - { 298056224, -43240656, -7306813, }, - { -27349278, -44630616, -2356327, }, - { 360583456, -39258684, -2423972, }, - { -58851788, 43766252, 4701916, }, - }, - { - { 311553696, -29218662, -2420751, }, - { -43643848, -73751568, 23637890, }, - { 249098976, -7734699, -6087043, }, - { 627708416, -90942712, -14872935, }, - { 5525476, -15845208, -22711788, }, - { 851950272, -100369088, 317828, }, - { -1866700, -29127394, -9088151, }, - { 758959936, -100101728, 13643500, }, - { -7909719, -9968619, -22215718, }, - { -129383744, -5531381, 2185602, }, - { 6927246, -2215666, -2097018, }, - { 428251712, 44209172, 894964, }, - { 18997714, 28491202, 12160663, }, - { 449487648, 13390634, 525060, }, - { -125575184, -25443386, -8341900, }, - }, - { - { 261459888, 8723615, -6206228, }, - { 70837968, 58482960, -45040248, }, - { 325033472, -26867168, -9676561, }, - { 283930080, 67042292, -12214887, }, - { -40947680, -31508954, -4011500, }, - { 471827392, 110132624, -9797894, }, - { -7194607, -11471858, -12919262, }, - { 422992000, 129837400, -14223321, }, - { -559956, -64124936, -1170916, }, - { -133630928, 3575024, -60666, }, - { -25354802, -2267743, 1309428, }, - { 506878624, -6169184, 4694936, }, - { 39726300, 7045894, 15430207, }, - { 474422624, 6671158, -2348273, }, - { -102008696, -30327300, -11685532, }, - }, - { - { 240484880, 14042396, -132607, }, - { 217952944, 121817624, -52187072, }, - { 494514496, 60224568, -7513509, }, - { 20397336, -24781962, -4145180, }, - { -48454212, -5237176, 7024419, }, - { 108569792, -68455336, -13811004, }, - { -1296543, 28807420, 542777, }, - { 50323596, -54717348, -17939542, }, - { 7339562, -6582038, 20469814, }, - { -115864792, 11620034, -204548, }, - { -52311628, -2201708, 4130685, }, - { 491351776, -30665530, -1449552, }, - { 14101451, -45034880, 3508452, }, - { 420662528, -21121576, -2969433, }, - { -7735773, 56921200, 1196685, }, - }, - { - { 270012256, -23244364, 9095667, }, - { 302108544, -145636432, 25764972, }, - { 695182848, -53615688, -2393908, }, - { -111943488, -11172821, 7976291, }, - { -17125108, 6622840, -6611029, }, - { -130551976, 1461900, -3079492, }, - { 6505802, -8606578, 12640626, }, - { -250304256, 20928302, 3484292, }, - { -2710661, 67228048, -7895224, }, - { -75185016, -18063558, 3986804, }, - { -89183920, 11238319, 4881767, }, - { 386935200, 44014288, -10276783, }, - { -25879862, 31284004, -15047955, }, - { 302272832, 38888780, -4435091, }, - { 83388400, -25720412, 13156559, }, - }, - { - { 357181280, 13597866, 10020159, }, - { 186142272, -78747152, 69059320, }, - { 826062336, 10807748, -4036733, }, - { -136869872, 11004243, 16057272, }, - { 30802432, 40938556, -4883915, }, - { -225224320, 22747758, 14950781, }, - { 2662343, -36271000, 3084860, }, - { -434281856, -19651086, 14351096, }, - { -5504001, 47386376, -15182709, }, - { -19873888, 9534291, 5590437, }, - { -132748848, -15060303, 3321620, }, - { 232506976, -29129542, -11449846, }, - { -32341104, 26803818, -15712064, }, - { 154529696, -33919504, -7061463, }, - { 104971688, -25116432, 9660992, }, - }, - { - { 504227008, -10380936, -2932926, }, - { -114229488, 228196448, 14908368, }, - { 808694016, 22711788, -7024956, }, - { -107239424, 5180805, 11981348, }, - { 52182780, -21744882, 14767171, }, - { -224969856, -5100811, 21272974, }, - { -5783711, 8522826, -12138651, }, - { -503597248, 4022774, 13465796, }, - { 5198521, -30551176, 14821932, }, - { 44385804, -1563368, 157303, }, - { -158316784, 4875325, 1993939, }, - { 67911488, 13307956, -1172526, }, - { -302258, -49360448, 4401805, }, - { 13918378, 13386339, -2522220, }, - { 51097224, 43914968, -3702799, }, - }, - { - { 701803008, 31803160, -19734838, }, - { -376732512, -105936976, -52158084, }, - { 622177024, -62460100, -6384469, }, - { -59612000, -13386876, -1971927, }, - { 20867636, -43538084, 14351096, }, - { -186044032, -19776714, 9260486, }, - { -2908230, 31246960, -3704946, }, - { -485769920, 526134, 8494372, }, - { 2085744, -53198000, 5521718, }, - { 117180664, 9884330, -6997039, }, - { -134485088, 9373229, 1622961, }, - { -86978456, -23970750, 8986145, }, - { 28893318, 8454106, 18998250, }, - { -101843336, -9178345, 6937983, }, - { -27663884, -22535156, -12045236, }, - }, - { - { 904283328, -64888364, -21122112, }, - { -372928800, -118043416, -44813688, }, - { 301261344, 95022392, -11047193, }, - { -6813966, -10190884, -11519102, }, - { -33595772, 58286464, -11398306, }, - { -133000104, 10397042, -9189083, }, - { 4401268, -8411157, 9586904, }, - { -414447712, -6669011, -659278, }, - { -5110474, -309238, -14335527, }, - { 192929392, -26497264, -6411850, }, - { -45639932, -19439022, -1628866, }, - { -223085440, 39593692, 6857989, }, - { 20511154, 46442556, 7100118, }, - { -191062688, 25187836, 7979513, }, - { -72546832, -16858820, -6147709, }, - }, - { - { 1020359680, 49040472, -3064996, }, - { -97977864, 172937392, 5498095, }, - { -83678848, -74016784, -12161737, }, - { 36763848, 26569204, -6542309, }, - { -51643760, 16670916, -23394150, }, - { -73004784, 22681186, -14823006, }, - { 3170760, -21297132, 4604205, }, - { -324642624, 17212082, -8062728, }, - { 271657, 39352100, 1069984, }, - { 250592544, 19866908, 323733, }, - { 91595544, 28620588, -8014409, }, - { -325997696, -26555782, -1130113, }, - { -10849624, -29150480, -13490492, }, - { -250334320, -19998978, 541703, }, - { -62478888, 26125212, 6773164, }, - }, - { - { 950758144, 45088028, 7181722, }, - { 230774496, -94694368, 33468532, }, - { -466968160, 41601052, 4842039, }, - { 38146824, -9856413, 4327717, }, - { -12726525, -71256728, 816044, }, - { -34454764, -30524332, -4786741, }, - { -3117073, 13539348, -7080791, }, - { -263279888, -25294674, -5777805, }, - { 4219806, 10428181, 11727945, }, - { 262986752, 8453033, 1917703, }, - { 224959120, -37230388, -9239548, }, - { -382932832, -1334124, -1830193, }, - { -24196772, -24077586, -11637214, }, - { -273468608, -2460480, -2448131, }, - { -19270982, -700617, 7786239, }, - }, - { - { 662759616, -123762704, -7464117, }, - { 372294208, -19914690, 33813740, }, - { -810661120, -51490752, 24456618, }, - { -34016676, -30839476, 7538205, }, - { 35114580, 11368242, 20448340, }, - { -70069704, -1327145, 8199093, }, - { -3339874, 17280800, -5366562, }, - { -282629248, 8960376, 7567196, }, - { -1795296, -34127272, -5259188, }, - { 219165200, -27831388, -4094178, }, - { 282418784, 23540716, 503048, }, - { -400790240, 10691784, 3843459, }, - { -8269960, 26900454, 3402688, }, - { -267513104, 12243878, 891743, }, - { 25067576, -6487011, -2902324, }, - }, - { - { 221894656, 116763520, -22308598, }, - { 242817056, 136962208, 7746511, }, - { -1080360960, 71046816, 23397908, }, - { -178594944, 59281288, -1345399, }, - { 40003864, 38815232, 8348343, }, - { -215943984, 54989540, 10739029, }, - { 2113124, -13751948, 5187247, }, - { -410339552, 47098076, 15241765, }, - { -3170760, -24517820, -8753680, }, - { 131049656, 24807732, -8782671, }, - { 210557552, 27944668, 10531797, }, - { -405466400, -171799, 6650220, }, - { 13361643, -3181497, 8449811, }, - { -255399696, -5711770, 3862786, }, - { 50663436, -10238665, -5988795, }, - }, - { - { -262315664, -71206264, -12941273, }, - { -31068720, -130587944, -33651604, }, - { -1221106432, -40506372, 7044820, }, - { -352367712, -35716948, -6782827, }, - { 5936719, -27122718, -7492034, }, - { -448329088, -80601504, 1251983, }, - { 3185792, -11842835, 5377299, }, - { -610926336, -79132624, 5086315, }, - { 3089692, 21311628, 8769786, }, - { 18001282, -15389405, -5661841, }, - { 21592948, -75939320, 6671695, }, - { -422662912, -11905649, 4202626, }, - { 17416630, -10782515, 4671851, }, - { -262331776, -7301445, 3401077, }, - { 46805480, 9417253, 2310156, }, - }, - { - { -707435904, 51271172, 11145977, }, - { -226603008, -18327162, -38191388, }, - { -1183006336, -31270046, -1832877, }, - { -500287456, 8203388, 2072859, }, - { -28250684, 2456721, -9917616, }, - { -683104320, 48995376, -4758287, }, - { -1089848, 12928925, -2975339, }, - { -786317248, 39530880, -5663988, }, - { 1455994, 33645164, 3847754, }, - { -111193480, 20921322, 501437, }, - { -192634112, 63155348, -4294431, }, - { -461840512, 15453292, 817654, }, - { 2214593, 16510391, -981400, }, - { -300300896, 16017544, 1114544, }, - { 13194140, 15024869, 6694244, }, - }, - { - { -1078223616, -68621232, 23726474, }, - { -224664912, 108171432, 4175782, }, - { -973332992, 83570936, 3840775, }, - { -591696192, -11749957, 9123047, }, - { -30763776, 19509352, -3448859, }, - { -830735232, -6813429, 331786, }, - { -3073049, 4521527, -5551782, }, - { -840708736, 18293340, -2704756, }, - { -3465502, -2225867, -9803263, }, - { -260984768, -36910412, 1418950, }, - { -311184352, -5189394, -6243809, }, - { -515333248, -12192875, -68719, }, - { -14047227, -9365176, -6448894, }, - { -362049088, -16235513, 537, }, - { -30389042, -25724706, 301185, }, - }, - { - { -1362811904, 77688440, 13334263, }, - { -85414552, -51876764, 32028108, }, - { -671621760, -84929760, 12796318, }, - { -624009344, 13232257, 3234110, }, - { -3631395, -17330730, 3491809, }, - { -855872064, -12947179, 4281546, }, - { 216896, -15168214, 1034550, }, - { -747763456, -48717276, 4341138, }, - { 352724, -30451318, 1169305, }, - { -439059488, 42351060, -1467805, }, - { -265382800, -39658116, -1537061, }, - { -567934784, 5772973, 1864553, }, - { -12868259, -11892764, -6317897, }, - { -427521056, 10568304, 1278290, }, - { -51245404, 6357626, -6984691, }, - }, - { - { -1546537216, -24615532, 2499134, }, - { 57335128, -21424908, 14519674, }, - { -387294912, 44589276, 12475806, }, - { -614494912, 9084930, -2698850, }, - { 22578106, 1583232, 3779034, }, - { -790453312, 28467044, 3361349, }, - { 3117073, 118112, 6264747, }, - { -561839168, 52027624, 6072010, }, - { 2966749, -11570642, 8281234, }, - { -644597312, -28553480, 3214783, }, - { -83245592, 55242408, -1686848, }, - { -603926656, 3766150, 6805376, }, - { 3478387, 23061826, 2260227, }, - { -473488992, -205085, 5046587, }, - { -31689880, 19377282, -6148246, }, - }, - { - { -1607233664, -59374164, 24469502, }, - { 120469000, 22543210, -11138461, }, - { -194259760, -6671695, 2132988, }, - { -591490560, -34621196, 7472170, }, - { 24184424, -1061394, 4543539, }, - { -702711936, -44425532, 11446625, }, - { 248571, 18603650, -70867, }, - { -377655392, -42054172, 6758131, }, - { -1819456, 23494544, -5267778, }, - { -852840896, 11351062, 22712324, }, - { 128841504, -56617868, -2202245, }, - { -604490880, -11200201, 13851806, }, - { 14465987, -4428648, 10028749, }, - { -478025024, -8836358, 10008348, }, - { 11824582, -26652956, 1130113, }, - }, - { - { -1516199168, 58139900, 60329796, }, - { 99128920, 3651796, -10679973, }, - { -95059440, -290984, -6617471, }, - { -570893504, 23903640, 28049358, }, - { 3212636, -14644765, 6335077, }, - { -640622272, 31571768, 31884226, }, - { -3208341, -1371168, -7168838, }, - { -266206912, 23772644, 13987635, }, - { -1759863, 24443732, -4776004, }, - { -995970176, -21615496, 41095320, }, - { 247099664, 32651416, 7637526, }, - { -542421632, 7269232, 14501957, }, - { 6749004, -25076704, 4926328, }, - { -421268096, 9819369, 10045929, }, - { 41754600, 11839077, 8631811, }, - }, - { - { -1227817856, 31887448, 36262944, }, - { 31780610, 2109366, 4351876, }, - { -41796476, -6394670, -8111583, }, - { -526691296, 30912490, 26707180, }, - { -21230560, 42835856, -9363566, }, - { -582211840, 34218004, 32887102, }, - { -296353, -21707302, -4295, }, - { -226947680, 16712255, 18204756, }, - { 2781528, -8465917, 8039642, }, - { -966141632, 51030652, 20940114, }, - { 205733232, 29428580, 19158776, }, - { -389149280, -6488085, -1595044, }, - { -9344238, 25553444, -10163503, }, - { -290937312, -11132555, -1483911, }, - { 33305324, 17487496, 9344238, }, - }, - { - { -702422016, -12524662, -63307816, }, - { -34587372, -31123480, 4677757, }, - { 13409962, 10168335, -9574019, }, - { -395849408, -55143620, -19904490, }, - { -22231288, 18446348, -21504902, }, - { -443376992, -79262008, -21980568, }, - { 3506841, 831613, 8366060, }, - { -192801616, -61860412, -7623030, }, - { -288837, -30697206, -807991, }, - { -676510528, -4662724, -44772348, }, - { 45564236, -99012952, 7204808, }, - { -144633568, 41230076, -25599616, }, - { -11819750, 21961778, -11959873, }, - { -98791224, 36429376, -16961362, }, - { -3271691, -40654548, -3177202, }, - }, - { - { -2837900, -263309408, -104393472, }, - { -62903556, 22214108, -11652783, }, - { 83321288, -27225260, -9924059, }, - { -140510384, -68141264, -63327684, }, - { 8424041, -95043328, 15469935, }, - { -159801776, -62714576, -81861536, }, - { -774705, 31915902, -3386582, }, - { -88226680, 2919504, -50476604, }, - { -2260227, -16823386, -6184753, }, - { -164298608, -202133504, -72149544, }, - { -109439528, 88497264, -31301184, }, - { 129524936, -112725712, -21399674, }, - { 3622805, -46176268, 10753524, }, - { 102797360, -79412872, -12246026, }, - { -31066036, 12406013, -17940078, }, - }, - { - { 621364224, 460767840, 43075300, }, - { -39567924, 46573552, -9427453, }, - { 141969600, 41977936, 2921115, }, - { 173183280, 253221616, -8589398, }, - { 22793392, -57216480, 28717226, }, - { 208237728, 318084736, -17783848, }, - { -2685428, 21849036, -7056632, }, - { 94066224, 175970720, -26878980, }, - { 2145336, 14760192, 6643778, }, - { 354849664, 357099680, 32628330, }, - { -143160928, 64352032, -39194796, }, - { 317177952, 112315008, 26720066, }, - { 10445897, -34724272, 13976360, }, - { 230905488, 66931696, 18525804, }, - { -21392158, 55930676, -4970888, }, - }, - { - { 821677696, 19742890, 188074464, }, - { 8250096, -53528716, 19508816, }, - { 149194272, -2103460, 19142132, }, - { 366368768, -121583544, 100727720, }, - { -2042257, 85702848, -23702314, }, - { 447949504, -178254032, 129330056, }, - { 2202245, -13095355, 6751689, }, - { 249170912, -161775312, 71844600, }, - { -533650, 32718524, -1122597, }, - { 576970880, -17979806, 144182048, }, - { -50550692, -170051712, 27342298, }, - { 317480224, 68158448, 50017040, }, - { -1150514, 37701760, -12638478, }, - { 223188512, 53187800, 29809758, }, - { 7964480, -27748710, 20958366, }, - }, - { - { 468054272, -778914880, -37406480, }, - { 25666188, -61740156, 13222057, }, - { 90884192, -81121728, 2451353, }, - { 283284224, -362074880, 32602560, }, - { -7944079, 107862200, -10186052, }, - { 350218624, -463973504, 48184700, }, - { 53150, -31307628, -1322850, }, - { 226416176, -237868704, 52872120, }, - { -569083, 32280438, -673236, }, - { 362591328, -576002368, -16647293, }, - { 40658308, -44644036, 57304528, }, - { 145049104, -242396672, -31521302, }, - { -3433826, 53061100, -4096862, }, - { 100901128, -152861648, -22567906, }, - { 13876502, -64969972, 4359929, }, - }, + {9537, -585, 380}, + {5125, 2612, 121}, + {8200, 371, 557}, + {9322, -1265, -503}, + {2484, 4450, 1221}, + {10266, -1682, -534}, + {699, 7231, 1680}, + {10750, -1807, -743}, + {477, 7724, 1403}, + {8474, 966, 428}, + {5574, 2964, 406}, + {9402, -707, 104}, + {2050, 5714, 1747}, + {8921, -754, -5}, + {4108, 2982, 608} + }, + { + {9393, -1267, 353}, + {2349, -2065, -1256}, + {7773, -937, 423}, + {10347, 2044, 509}, + {-497, -2964, -965}, + {11063, 1767, 600}, + {-861, -3193, -2227}, + {11262, 1422, 402}, + {-773, -1346, -2180}, + {8526, -1704, -680}, + {3593, -164, -487}, + {9557, -1220, -97}, + {-840, -3724, -1116}, + {8989, -444, 137}, + {811, -1404, -354} + }, + { + {9364, 2902, -1332}, + {-725, -3444, 15}, + {7631, 1013, -278}, + {10799, 821, 842}, + {-2452, -1144, -1007}, + {11117, 1779, 500}, + {-381, -6671, -818}, + {11088, 2341, 35}, + {92, -7502, 243}, + {9450, -3476, -114}, + {1045, -128, -8}, + {9798, 240, -757}, + {-2278, -1050, -1629}, + {8897, 884, -404}, + {-2664, 272, -131} + }, + { + {10861, 4191, -1252}, + {-3762, -3857, 394}, + {8685, 2546, -143}, + {9763, -1399, 168}, + {-1840, 691, -513}, + {10087, -943, -394}, + {695, 398, 1722}, + {10522, 93, -698}, + {607, -3728, 1694}, + {10458, -965, 718}, + {-1815, -690, 248}, + {10493, 2044, -170}, + {-775, 4080, -147}, + {9085, 1484, -202}, + {-4102, -288, -108} + }, + { + {13154, -3003, 1164}, + {-5544, -735, -590}, + {10391, -1008, 951}, + {7892, 598, -211}, + {643, -3432, 365}, + {8827, -163, -406}, + {258, 3668, 437}, + {10314, -1168, -111}, + {-486, 4155, -1377}, + {10592, 1196, -244}, + {-4202, 297, 290}, + {10673, 342, 443}, + {1589, -1623, 1353}, + {9069, 399, 209}, + {-2550, -1466, -59} + }, + { + {13638, -3481, 963}, + {-4250, 1187, 104}, + {10993, -3894, -209}, + {6103, 92, -107}, + {2383, -353, 1189}, + {7815, 163, -91}, + {-486, -981, -1153}, + {10179, 418, 519}, + {-226, 5997, -617}, + {11024, 1694, 8}, + {-5440, -583, 180}, + {9552, -1260, -10}, + {1767, -2621, 941}, + {8190, -542, -52}, + {688, 1099, 231} + }, + { + {12954, 2813, -1207}, + {-1125, 629, -313}, + {11202, -1601, -1164}, + {5007, -797, 397}, + {1271, 3372, 18}, + {7306, -74, 57}, + {-263, -2837, -450}, + {9881, 1329, 215}, + {567, 212, 1613}, + {11698, 1341, 80}, + {-5100, -241, -14}, + {7817, 228, -227}, + {-245, 2880, -590}, + {6730, 161, -48}, + {3096, -334, 277} + }, + { + {13738, 3091, -1171}, + {2792, 2546, -391}, + {11814, 2806, 483}, + {4384, -1136, 348}, + {-895, -459, -865}, + {7350, 127, 133}, + {381, 1049, 881}, + {9830, -301, -410}, + {-144, -4920, -421}, + {12635, 617, -454}, + {-3145, 699, -18}, + {6290, -19, -20}, + {-1749, 349, -1145}, + {5035, -318, 93}, + {3191, -764, 150} + }, + { + {15977, -2970, 667}, + {5593, -1332, 625}, + {11332, 2123, 806}, + {4160, 247, -180}, + {-1750, -831, -510}, + {7795, 335, -8}, + {261, 2183, 440}, + {10673, -1402, -92}, + {-378, -3148, -1060}, + {14027, -1592, 159}, + {-226, -1091, 150}, + {5475, 83, 67}, + {-974, -2773, -164}, + {3590, 654, -26}, + {1183, 1346, -211} + }, + { + {17151, -1613, 849}, + {5005, -2424, 291}, + {9693, -2085, -571}, + {4711, 951, 29}, + {-829, 1826, 199}, + {8666, 356, -146}, + {-292, -1101, -678}, + {12053, 206, 289}, + {316, 1906, 900}, + {14637, -767, 345}, + {2581, 22, 91}, + {5534, -50, -27}, + {834, 917, 733}, + {2958, 180, -118}, + {-1283, -167, -310} + }, + { + {16192, 1977, -356}, + {1769, 827, -315}, + {8401, -1550, -495}, + {5734, -4, 240}, + {690, -342, 679}, + {9951, -629, 25}, + {-272, -1549, -488}, + {13313, 413, -54}, + {126, 3236, 336}, + {14061, 811, -159}, + {4477, -119, -178}, + {6266, -515, -5}, + {1443, 942, 533}, + {3289, -600, 111}, + {-2588, -702, 140} + }, + { + {14238, 337, -499}, + {-1857, -667, -124}, + {7553, 302, 353}, + {6778, -552, -189}, + {1153, -1740, 56}, + {11197, -16, 35}, + {216, 1336, 497}, + {14330, 499, -188}, + {-296, 109, -840}, + {13007, -142, -285}, + {5149, 79, -208}, + {7217, 362, 174}, + {390, -1296, 7}, + {4091, -53, 166}, + {-2333, -214, 268} + }, + { + {12330, 185, -65}, + {-4115, 121, -36}, + {6456, 898, 215}, + {7744, -957, -227}, + {581, 103, -492}, + {12002, -14, -121}, + {282, 1177, 530}, + {14874, -192, 17}, + {28, -2254, 93}, + {12050, -179, -102}, + {4415, -17, -60}, + {7934, 429, 47}, + {-1034, 1038, -471}, + {4888, 195, -77}, + {-851, 153, -176} + }, + { + {10838, -256, -90}, + {-4037, 508, 40}, + {5156, -473, -94}, + {8118, 341, 200}, + {-164, 683, -87}, + {12131, 140, -87}, + {-158, -1433, -366}, + {14543, -707, -147}, + {208, -889, 581}, + {11383, 1, 49}, + {2349, -532, 89}, + {8430, -132, -244}, + {-1209, 643, -612}, + {5487, 279, -145}, + {1220, 1024, -248} + }, + { + {9687, -376, 58}, + {-2158, -699, 93}, + {3882, 119, -70}, + {7290, 827, 148}, + {-687, -160, 325}, + {11361, 219, 6}, + {-281, -866, -539}, + {13311, 15, -267}, + {-86, 1294, -251}, + {10787, 356, -22}, + {-577, 918, 48}, + {8916, -655, -124}, + {88, -2072, 48}, + {5636, -177, -6}, + {2634, -749, 132} + }, + { + {8224, -199, 369}, + {230, 777, 209}, + {2857, -79, 31}, + {5606, -759, -138}, + {-776, -760, 126}, + {9743, -439, 28}, + {87, 1338, 204}, + {11244, 231, 156}, + {-144, 865, -393}, + {9911, -272, -152}, + {-3352, -561, -7}, + {9129, 97, 109}, + {1250, 693, 810}, + {5103, -153, 81}, + {2280, -364, 331} + }, + { + {6064, 1602, 78}, + {1918, 271, 142}, + {2281, 44, 65}, + {3931, 136, -169}, + {-316, 418, -427}, + {7723, 489, 35}, + {309, 90, 641}, + {8310, 1195, 302}, + {110, -1029, 314}, + {8495, -40, -25}, + {-4909, 141, 16}, + {8666, 459, 22}, + {801, 1978, 467}, + {3970, 459, 59}, + {282, 1364, 96} + }, + { + {3939, -526, -357}, + {2475, -538, -227}, + {2192, 13, 54}, + {3000, 456, 108}, + {601, 1467, -250}, + {5967, -396, 12}, + {-54, -2172, -135}, + {5243, -1258, -81}, + {108, -1077, 296}, + {6354, -541, 138}, + {-4677, 310, 32}, + {7552, -304, -73}, + {-642, -1889, -638}, + {2620, -587, -92}, + {-1916, -875, -282} + }, + { + {2842, -859, -39}, + {2284, -237, -292}, + {2523, -134, 56}, + {3172, -179, 334}, + {1142, -865, 512}, + {5220, -149, 58}, + {-348, -439, -771}, + {3422, -71, -191}, + {-155, 845, -435}, + {3676, 888, 54}, + {-2830, -610, 33}, + {6029, 353, -51}, + {-1132, -1322, -729}, + {1605, -101, -108}, + {-2646, -438, -303} + }, + { + {2746, 198, 349}, + {1607, 338, 20}, + {3165, 40, 28}, + {4625, -209, 124}, + {467, -1307, 508}, + {5988, 367, 151}, + {94, 2441, 277}, + {3615, 798, 96}, + {-37, 1725, -96}, + {1144, -638, -83}, + {-227, 647, 29}, + {4399, -289, -36}, + {-165, 1895, 255}, + {1187, 292, 96}, + {-1441, 1273, 81} + }, + { + {3163, 494, 137}, + {433, 173, 270}, + {3969, -24, -87}, + {7526, -285, -304}, + {-854, 1877, -390}, + {8315, -276, 23}, + {307, 1279, 679}, + {5602, -651, 285}, + {169, 236, 471}, + {-583, 57, -66}, + {2042, -445, 40}, + {3014, -17, 83}, + {807, 224, 607}, + {1211, 28, 176}, + {608, -360, 269} + }, + { + {3897, -50, -192}, + {-1068, -992, 119}, + {4719, 306, -114}, + {11509, 1355, -399}, + {-1249, 794, -716}, + {11804, 584, -254}, + {-119, -1560, -369}, + {8604, 68, 51}, + {-47, -1343, -139}, + {-1339, 236, 92}, + {3168, -48, 12}, + {2107, -231, 166}, + {702, -1060, 144}, + {1586, -119, 71}, + {1990, -257, 22} + }, + { + {4800, -634, -123}, + {-2345, 797, -340}, + {5079, -407, 75}, + {15155, -1549, -4}, + {-199, -2102, 151}, + {15467, -1126, -283}, + {-216, -1203, -447}, + {11719, -205, -392}, + {-131, -741, -361}, + {-1511, 41, 154}, + {3010, 307, -62}, + {1931, 249, 34}, + {-147, 736, -287}, + {2423, -41, -70}, + {1992, 103, -98} + }, + { + {5450, 360, 127}, + {-2646, 1221, -158}, + {4754, -253, 199}, + {16427, -176, 240}, + {931, -103, 634}, + {17686, 723, -32}, + {85, 828, 289}, + {14017, 1111, -337}, + {103, 968, 293}, + {-1588, -174, 65}, + {2044, -298, -90}, + {2778, 195, -116}, + {-711, 279, -309}, + {3808, 423, -121}, + {769, -193, 57} + }, + { + {5413, 349, 129}, + {-1909, -981, 571}, + {4015, 569, 61}, + {14268, 1503, -16}, + {914, 1376, 53}, + {16945, 591, 104}, + {146, 729, 272}, + {14285, -453, 165}, + {68, 1229, 185}, + {-1761, 41, 24}, + {930, 188, -72}, + {4548, -660, -111}, + {-417, -681, -36}, + {5502, -599, -37}, + {-898, 668, 72} + }, + { + {4754, -446, -37}, + {-666, -1125, 361}, + {3801, -118, -93}, + {9578, -1388, -227}, + {84, -242, -347}, + {13000, -1532, 5}, + {-28, -444, -139}, + {11581, -1527, 208}, + {-121, -152, -339}, + {-1974, -84, 33}, + {106, -34, -32}, + {6535, 675, 14}, + {290, 435, 186}, + {6859, 204, 8}, + {-1916, -388, -127} + }, + { + {3990, 133, -95}, + {1081, 892, -687}, + {4960, -410, -148}, + {4332, 1023, -186}, + {-625, -481, -61}, + {7200, 1680, -150}, + {-110, -175, -197}, + {6454, 1981, -217}, + {-9, -978, -18}, + {-2039, 55, -1}, + {-387, -35, 20}, + {7734, -94, 72}, + {606, 108, 235}, + {7239, 102, -36}, + {-1557, -463, -178} + }, + { + {3670, 214, -2}, + {3326, 1859, -796}, + {7546, 919, -115}, + {311, -378, -63}, + {-739, -80, 107}, + {1657, -1045, -211}, + {-20, 440, 8}, + {768, -835, -274}, + {112, -100, 312}, + {-1768, 177, -3}, + {-798, -34, 63}, + {7497, -468, -22}, + {215, -687, 54}, + {6419, -322, -45}, + {-118, 869, 18} + }, + { + {4120, -355, 139}, + {4610, -2222, 393}, + {10608, -818, -37}, + {-1708, -170, 122}, + {-261, 101, -101}, + {-1992, 22, -47}, + {99, -131, 193}, + {-3819, 319, 53}, + {-41, 1026, -120}, + {-1147, -276, 61}, + {-1361, 171, 74}, + {5904, 672, -157}, + {-395, 477, -230}, + {4612, 593, -68}, + {1272, -392, 201} + }, + { + {5450, 207, 153}, + {2840, -1202, 1054}, + {12605, 165, -62}, + {-2088, 168, 245}, + {470, 625, -75}, + {-3437, 347, 228}, + {41, -553, 47}, + {-6627, -300, 219}, + {-84, 723, -232}, + {-303, 145, 85}, + {-2026, -230, 51}, + {3548, -444, -175}, + {-493, 409, -240}, + {2358, -518, -108}, + {1602, -383, 147} + }, + { + {7694, -158, -45}, + {-1743, 3482, 227}, + {12340, 347, -107}, + {-1636, 79, 183}, + {796, -332, 225}, + {-3433, -78, 325}, + {-88, 130, -185}, + {-7684, 61, 205}, + {79, -466, 226}, + {677, -24, 2}, + {-2416, 74, 30}, + {1036, 203, -18}, + {-5, -753, 67}, + {212, 204, -38}, + {780, 670, -56} + }, + { + {10709, 485, -301}, + {-5748, -1616, -796}, + {9494, -953, -97}, + {-910, -204, -30}, + {318, -664, 219}, + {-2839, -302, 141}, + {-44, 477, -57}, + {-7412, 8, 130}, + {32, -812, 84}, + {1788, 151, -107}, + {-2052, 143, 25}, + {-1327, -366, 137}, + {441, 129, 290}, + {-1554, -140, 106}, + {-422, -344, -184} + }, + { + {13798, -990, -322}, + {-5690, -1801, -684}, + {4597, 1450, -169}, + {-104, -156, -176}, + {-513, 889, -174}, + {-2029, 159, -140}, + {67, -128, 146}, + {-6324, -102, -10}, + {-78, -5, -219}, + {2944, -404, -98}, + {-696, -297, -25}, + {-3404, 604, 105}, + {313, 709, 108}, + {-2915, 384, 122}, + {-1107, -257, -94} + }, + { + {15569, 748, -47}, + {-1495, 2639, 84}, + {-1277, -1129, -186}, + {561, 405, -100}, + {-788, 254, -357}, + {-1114, 346, -226}, + {48, -325, 70}, + {-4954, 263, -123}, + {4, 600, 16}, + {3824, 303, 5}, + {1398, 437, -122}, + {-4974, -405, -17}, + {-166, -445, -206}, + {-3820, -305, 8}, + {-953, 399, 103} + }, + { + {14507, 688, 110}, + {3521, -1445, 511}, + {-7125, 635, 74}, + {582, -150, 66}, + {-194, -1087, 12}, + {-526, -466, -73}, + {-48, 207, -108}, + {-4017, -386, -88}, + {64, 159, 179}, + {4013, 129, 29}, + {3433, -568, -141}, + {-5843, -20, -28}, + {-369, -367, -178}, + {-4173, -38, -37}, + {-294, -11, 119} + }, + { + {10113, -1888, -114}, + {5681, -304, 516}, + {-12370, -786, 373}, + {-519, -471, 115}, + {536, 173, 312}, + {-1069, -20, 125}, + {-51, 264, -82}, + {-4313, 137, 115}, + {-27, -521, -80}, + {3344, -425, -62}, + {4309, 359, 8}, + {-6116, 163, 59}, + {-126, 410, 52}, + {-4082, 187, 14}, + {382, -99, -44} + }, + { + {3386, 1782, -340}, + {3705, 2090, 118}, + {-16485, 1084, 357}, + {-2725, 905, -21}, + {610, 592, 127}, + {-3295, 839, 164}, + {32, -210, 79}, + {-6261, 719, 233}, + {-48, -374, -134}, + {2000, 379, -134}, + {3213, 426, 161}, + {-6187, -3, 101}, + {204, -49, 129}, + {-3897, -87, 59}, + {773, -156, -91} + }, + { + {-4003, -1087, -197}, + {-474, -1993, -513}, + {-18633, -618, 107}, + {-5377, -545, -103}, + {91, -414, -114}, + {-6841, -1230, 19}, + {49, -181, 82}, + {-9322, -1207, 78}, + {47, 325, 134}, + {275, -235, -86}, + {329, -1159, 102}, + {-6449, -182, 64}, + {266, -165, 71}, + {-4003, -111, 52}, + {714, 144, 35} + }, + { + {-10795, 782, 170}, + {-3458, -280, -583}, + {-18051, -477, -28}, + {-7634, 125, 32}, + {-431, 37, -151}, + {-10423, 748, -73}, + {-17, 197, -45}, + {-11998, 603, -86}, + {22, 513, 59}, + {-1697, 319, 8}, + {-2939, 964, -66}, + {-7047, 236, 12}, + {34, 252, -15}, + {-4582, 244, 17}, + {201, 229, 102} + }, + { + {-16452, -1047, 362}, + {-3428, 1651, 64}, + {-14852, 1275, 59}, + {-9029, -179, 139}, + {-469, 298, -53}, + {-12676, -104, 5}, + {-47, 69, -85}, + {-12828, 279, -41}, + {-53, -34, -150}, + {-3982, -563, 22}, + {-4748, -79, -95}, + {-7863, -186, -1}, + {-214, -143, -98}, + {-5524, -248, 0}, + {-464, -393, 5} + }, + { + {-20795, 1185, 203}, + {-1303, -792, 489}, + {-10248, -1296, 195}, + {-9522, 202, 49}, + {-55, -264, 53}, + {-13060, -198, 65}, + {3, -231, 16}, + {-11410, -743, 66}, + {5, -465, 18}, + {-6700, 646, -22}, + {-4049, -605, -23}, + {-8666, 88, 28}, + {-196, -181, -96}, + {-6523, 161, 20}, + {-782, 97, -107} + }, + { + {-23598, -376, 38}, + {875, -327, 222}, + {-5910, 680, 190}, + {-9376, 139, -41}, + {345, 24, 58}, + {-12061, 434, 51}, + {48, 2, 96}, + {-8573, 794, 93}, + {45, -177, 126}, + {-9836, -436, 49}, + {-1270, 843, -26}, + {-9215, 57, 104}, + {53, 352, 34}, + {-7225, -3, 77}, + {-484, 296, -94} + }, + { + {-24524, -906, 373}, + {1838, 344, -170}, + {-2964, -102, 33}, + {-9025, -528, 114}, + {369, -16, 69}, + {-10723, -678, 175}, + {4, 284, -1}, + {-5763, -642, 103}, + {-28, 358, -80}, + {-13013, 173, 347}, + {1966, -864, -34}, + {-9224, -171, 211}, + {221, -68, 153}, + {-7294, -135, 153}, + {180, -407, 17} + }, + { + {-23135, 887, 921}, + {1513, 56, -163}, + {-1450, -4, -101}, + {-8711, 365, 428}, + {49, -223, 97}, + {-9775, 482, 487}, + {-49, -21, -109}, + {-4062, 363, 213}, + {-27, 373, -73}, + {-15197, -330, 627}, + {3770, 498, 117}, + {-8277, 111, 221}, + {103, -383, 75}, + {-6428, 150, 153}, + {637, 181, 132} + }, + { + {-18735, 487, 553}, + {485, 32, 66}, + {-638, -98, -124}, + {-8037, 472, 408}, + {-324, 654, -143}, + {-8884, 522, 502}, + {-5, -331, 0}, + {-3463, 255, 278}, + {42, -129, 123}, + {-14742, 779, 320}, + {3139, 449, 292}, + {-5938, -99, -24}, + {-143, 390, -155}, + {-4439, -170, -23}, + {508, 267, 143} + }, + { + {-10718, -191, -966}, + {-528, -475, 71}, + {205, 155, -146}, + {-6040, -841, -304}, + {-339, 281, -328}, + {-6765, -1209, -335}, + {54, 13, 128}, + {-2942, -944, -116}, + {-4, -468, -12}, + {-10323, -71, -683}, + {695, -1511, 110}, + {-2207, 629, -391}, + {-180, 335, -182}, + {-1507, 556, -259}, + {-50, -620, -48} + }, + { + {-43, -4018, -1593}, + {-960, 339, -178}, + {1271, -415, -151}, + {-2144, -1040, -966}, + {129, -1450, 236}, + {-2438, -957, -1249}, + {-12, 487, -52}, + {-1346, 45, -770}, + {-34, -257, -94}, + {-2507, -3084, -1101}, + {-1670, 1350, -478}, + {1976, -1720, -327}, + {55, -705, 164}, + {1569, -1212, -187}, + {-474, 189, -274} + }, + { + {9481, 7031, 657}, + {-604, 711, -144}, + {2166, 641, 45}, + {2643, 3864, -131}, + {348, -873, 438}, + {3177, 4854, -271}, + {-41, 333, -108}, + {1435, 2685, -410}, + {33, 225, 101}, + {5415, 5449, 498}, + {-2184, 982, -598}, + {4840, 1714, 408}, + {159, -530, 213}, + {3523, 1021, 283}, + {-326, 853, -76} + }, + { + {12538, 301, 2870}, + {126, -817, 298}, + {2277, -32, 292}, + {5590, -1855, 1537}, + {-31, 1308, -362}, + {6835, -2720, 1973}, + {34, -200, 103}, + {3802, -2468, 1096}, + {-8, 499, -17}, + {8804, -274, 2200}, + {-771, -2595, 417}, + {4844, 1040, 763}, + {-18, 575, -193}, + {3406, 812, 455}, + {122, -423, 320} + }, + { + {7142, -11885, -571}, + {392, -942, 202}, + {1387, -1238, 37}, + {4323, -5525, 497}, + {-121, 1646, -155}, + {5344, -7080, 735}, + {1, -478, -20}, + {3455, -3630, 807}, + {-9, 493, -10}, + {5533, -8789, -254}, + {620, -681, 874}, + {2213, -3699, -481}, + {-52, 810, -63}, + {1540, -2332, -344}, + {212, -991, 67} + } }; -const Word32 leftHRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS] /* Q29 */= +const Word16 leftHRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]= { { - { 5232344, 17252346, -539555, }, - { -135520176, 194871264, -54369992, }, - { -22220550, 117874840, -40396316, }, - { 11720966, -108904264, 36866924, }, - { -107257680, 255896304, -73097656, }, - { 11458436, -134486704, 49912352, }, - { -50680076, 336556864, -124497144, }, - { 8897562, -128660576, 50126028, }, - { -43055436, 307590528, -120338008, }, - { 10245644, 73467024, -31177704, }, - { -119941256, 172604528, -50995756, }, - { -908386, -22171694, 13412646, }, - { -103657424, 351444832, -110692048, }, - { -13219372, -29753386, 17103634, }, - { -139419472, 198506944, -49185964, }, - }, - { - { 30917858, -50915228, -27016954, }, - { -305028032, 178966992, -27285390, }, - { -31333398, 17824652, -79691504, }, - { -27201102, -118149720, 33646236, }, - { -180582976, 181514448, -78655344, }, - { -25593174, -154673584, 44513576, }, - { -32651416, 465500896, -72493680, }, - { -21735756, -183458992, 31233540, }, - { -8945343, 553823680, -21647708, }, - { 46176804, 103967736, -27739584, }, - { -271011904, 228043440, 6618008, }, - { -21784610, -92931280, -13600551, }, - { -154800288, 253057328, -131308960, }, - { -57660472, -99732360, -5020280, }, - { -288599264, 110345760, -48391932, }, - }, - { - { 99568616, -139327136, -15360414, }, - { -324153536, 9072045, 47385836, }, - { 46054396, -314262752, 41872708, }, - { -148029808, 81420232, -18759344, }, - { -52845276, -129020816, 7718056, }, - { -120695560, 51905752, -15993921, }, - { 49320720, -72422272, 121334976, }, - { -86364816, 64855080, -57959508, }, - { 48910012, 135625936, 140061024, }, - { 79715664, -68266896, 35842040, }, - { -347903616, 196710576, 28915330, }, - { -46603616, -98206040, -14537391, }, - { 3573950, -296180416, 41096932, }, - { -100602096, -66857072, -14718853, }, - { -211719872, -73775728, 8290361, }, - }, - { - { 158430064, 109539384, 60192356, }, - { -238983248, -109216184, -20186346, }, - { 99478424, -106365936, 113992192, }, - { -268344720, -942208, -20194936, }, - { 108341624, 68608344, 33007898, }, - { -190794256, 31733902, -4362613, }, - { 17487496, -307243712, 28120224, }, - { -105947176, 126534568, -27926952, }, - { -23633058, -389901440, -67944776, }, - { 47435768, -191150208, -8434779, }, - { -342148384, 121005872, -7304666, }, - { -92741232, -11922829, 27136140, }, - { 137140448, -296890, 113191712, }, - { -144703888, 2766496, 20560008, }, - { -370978, 66400196, 11968463, }, - }, - { - { 108209552, 185416416, 46416248, }, - { -18681498, -206867632, -19592568, }, - { 32727650, 247064240, -21903796, }, - { -329999520, -24774446, -2032593, }, - { 156707248, -9570261, 57924076, }, - { -212032336, -13562970, 13310641, }, - { -37249716, 38208564, -89804544, }, - { -104133096, -3824132, 22079890, }, - { -28955596, -346057312, -82060720, }, - { 9917616, -101770864, -34786552, }, - { -226855872, 54367844, 4613332, }, - { -200631344, 115047680, -3089155, }, - { 88293256, 239106192, 33024004, }, - { -231136352, 84634480, 1288490, }, - { 199597872, -60316912, 18438832, }, - }, - { - { -18214956, -250354720, -92994632, }, - { 223436016, -51390356, -4157528, }, - { -57046828, 54381264, -80257904, }, - { -314948864, 58884000, 23173496, }, - { 29657286, -269596704, -5538361, }, - { -186629744, 5942088, 11245298, }, - { -15848966, 209089216, -23430120, }, - { -111910744, -61173756, 839666, }, - { 37234144, 136140800, 105880608, }, - { 6058052, -12533251, 5679021, }, - { -54005456, 101106752, -8387535, }, - { -303604800, 5211943, -23613730, }, - { -62708672, -138673760, -66732516, }, - { -322043104, 10297721, -10102300, }, - { 244338000, -47463684, 16740709, }, - }, - { - { -54721104, -251287792, -88000656, }, - { 351504416, -67618888, -30714384, }, - { -113102056, -200841264, 31799938, }, - { -261045968, 42209328, 19190988, }, - { -118671560, 776852, -75185552, }, - { -135094976, 1285269, 3442416, }, - { 28601798, -63060856, 69197832, }, - { -105192872, 9150428, -24213416, }, - { 2437394, 384751776, 6705518, }, - { -12818330, 46677168, -22034792, }, - { 144857440, -12532715, 753767, }, - { -339585888, -34845068, 849867, }, - { -123130808, -83513488, -70629128, }, - { -376464608, 1576253, 6109591, }, - { 117476480, 73857872, -443992, }, - }, - { - { -10631655, 188114192, 68762424, }, - { 326040096, 49028664, 22428320, }, - { -210201600, -159242352, 61620432, }, - { -201035072, -18813568, -14765024, }, - { -114390552, 143538880, -20566988, }, - { -80505400, 2159295, -3675955, }, - { 16927540, -165660640, 29322278, }, - { -70205536, 60418916, -11065983, }, - { -32559610, 127769912, -91239064, }, - { -37865504, 94677184, -2071785, }, - { 297682560, 66001300, 1824287, }, - { -309382048, 12906377, 11574400, }, - { -28137942, 205611360, 12385075, }, - { -382446432, -11492796, 1540283, }, - { -73100344, -77344304, -18161806, }, - }, - { - { -77725488, 196784128, 67276368, }, - { 108923056, 190376032, 10649908, }, - { -352566336, 153094112, -37377488, }, - { -127077344, -64507724, -8101382, }, - { -4843650, -76424112, 31541702, }, - { -34963720, -2215666, -9452686, }, - { -22453552, 70792872, -51737176, }, - { -33504504, -29388314, 15022185, }, - { 17081622, -231734960, 49876920, }, - { -114809848, 67806256, 22993644, }, - { 356293312, 44757856, 889595, }, - { -239530320, 944893, 752156, }, - { 90251760, -22021908, 66466768, }, - { -332159872, -19122806, -6287296, }, - { -192860672, -19954954, -18575196, }, - }, - { - { -277781312, -167457552, -35618700, }, - { -169595904, -62544388, -30911954, }, - { -434085376, 112163608, -35138740, }, - { -58242976, 19576460, 13532368, }, - { 88578872, 6706592, 41794864, }, - { -3717294, 35752920, -918049, }, - { -17199734, 127037080, -28944858, }, - { -43709884, -68236832, -158377, }, - { 16502875, -232059760, 46335716, }, - { -259441792, -90892784, -12786118, }, - { 302439776, -23015120, -15345918, }, - { -164977216, 30413738, -1911797, }, - { 86459840, -128010424, 25755846, }, - { -245588384, 51877300, 4899484, }, - { -172616352, 74084968, 11601244, }, - }, - { - { -479058496, -34588984, -41318660, }, - { -325007168, -33243584, -8560407, }, - { -453216224, -58082452, 32525250, }, - { -30136712, 55057184, -7392176, }, - { 79122960, 135242608, -1163399, }, - { -6920803, 18053896, 5795522, }, - { 16492674, -71891848, 38566120, }, - { -104778408, -209380, -16012175, }, - { -21474300, 47109884, -60942900, }, - { -397912064, -312996, -21223044, }, - { 171231216, 24038932, -9402757, }, - { -118827248, -10425496, 7212861, }, - { -13937706, 81356880, -24482388, }, - { -170254656, 3934727, 10257993, }, - { -55324548, -9509058, 19807852, }, - }, - { - { -601780224, 43026984, 9757629, }, - { -299565376, 35366372, 8828842, }, - { -474717888, -72621992, 25129854, }, - { -41837812, 31529354, -16467441, }, - { 1726577, -15290620, -40343164, }, - { -61786864, -31823560, -5519570, }, - { 18072148, -81266688, 33348810, }, - { -201226192, 67109, 2428804, }, - { -2217814, 185003568, -5108327, }, - { -490028928, 20321100, 1631014, }, - { -2594697, -20058034, 2413235, }, - { -118403656, -31147102, 808528, }, - { -87570088, -6750078, -36289788, }, - { -139467248, -25146496, -6270653, }, - { 75520560, -19526532, -10375030, }, - }, - { - { -655855488, 25572236, 16110422, }, - { -132337072, -58881316, 8665097, }, - { -501111008, 30430380, -9394704, }, - { -91855928, -22336514, 14292041, }, - { -49204756, -74647608, -5505075, }, - { -155968512, 5469641, -3663607, }, - { -12157442, 97756680, -27805618, }, - { -336846240, 58492624, 1365800, }, - { 16540993, 44654240, 46456512, }, - { -548054464, 10231149, 11157251, }, - { -176553760, 33840048, 11727945, }, - { -150341040, 24950002, -15178414, }, - { -58025544, -70031592, -23076322, }, - { -148966640, -8432095, -10384694, }, - { 161219120, -49005040, -15503221, }, - }, - { - { -677316864, 14061186, 9455907, }, - { 70368744, 40104256, 7168301, }, - { -505640608, 25171730, -6891275, }, - { -189773664, -74050072, 12053289, }, - { -53633940, 6905234, 24492588, }, - { -274234208, -24685324, 5230197, }, - { -18511310, 73076184, -34952980, }, - { -492537184, -25987774, -7692287, }, - { -4431870, -109918952, -13494250, }, - { -599594048, -23166516, 4469451, }, - { -306285408, -42193220, 5999533, }, - { -191659696, 30705258, -6935836, }, - { 38758320, 112756312, 18760418, }, - { -190430256, 6300180, 2592550, }, - { 155024704, 18436684, 11340861, }, - }, - { - { -703675648, 6285148, 19589346, }, - { 201780240, -15927349, 6103149, }, - { -480631552, -14164802, 4212289, }, - { -289732576, 36455684, -11339787, }, - { -26402774, 37356016, 6506339, }, - { -392567520, 29936458, 4489852, }, - { 8114267, -85212688, 19082002, }, - { -637229248, -15723875, 13287555, }, - { -11103027, -59286116, -30707406, }, - { -666988032, 24908662, -3487514, }, - { -342789920, -1901597, -1787243, }, - { -247421792, 2945811, 11980811, }, - { 87287160, 509491, 50570020, }, - { -257889696, 23130010, 7347616, }, - { 45361296, 54193360, 18922016, }, - }, - { - { -745239104, -65278672, 3823058, }, - { 218355600, -34307660, 480499, }, - { -427974176, 13306882, 4248797, }, - { -328094688, 20603494, -9194451, }, - { 16760573, -17125108, -23188528, }, - { -472696032, -13945222, 2480344, }, - { 18897320, -29428580, 37408092, }, - { -753866624, -50825568, 22191022, }, - { 6292664, 70817032, 18086644, }, - { -752061120, 3488587, 2753074, }, - { -262117552, 39137352, 463856, }, - { -333270144, -49004504, 5350456, }, - { 26259430, -141933104, 14274324, }, - { -328640160, -23949274, 2633352, }, - { -102069360, -82435456, -2142115, }, - }, - { - { -754358400, 10646150, -22409528, }, - { 144449952, 51578264, -16460999, }, - { -357978016, -12630962, 2121714, }, - { -285058048, -47072840, 8100845, }, - { 55548960, -74437152, -11065983, }, - { -484483040, -2369211, 765041, }, - { -3855270, 108625088, -8880919, }, - { -806595392, 50464792, -6066105, }, - { 8435316, 56591564, 22964116, }, - { -842413824, 19781008, 13151727, }, - { -92471184, -44889924, 1385664, }, - { -431250688, 22603876, -4613332, }, - { -65707096, 88061328, -49775988, }, - { -372310304, 17492864, -4533875, }, - { -180423520, 15318001, -21953188, }, - }, - { - { -684178112, 95209224, -2731062, }, - { 44034688, 8211441, -15715822, }, - { -287447136, 12063489, 279173, }, - { -179376624, 21377126, 15723875, }, - { 54791972, 38640212, 32280438, }, - { -417241056, 28506234, 754841, }, - { -22044994, 1953673, -47797080, }, - { -744435968, 54001160, -14835891, }, - { -8842264, -70665632, -25028922, }, - { -913782720, -34616364, 5817533, }, - { 101118560, 45958296, 417686, }, - { -510893888, -4614943, -121870, }, - { -69034616, 108603080, -42297912, }, - { -367728128, 21326660, -4706211, }, - { -127882648, 64976412, -14567455, }, - }, - { - { -564688896, -35052840, 25179782, }, - { -42392400, -21832930, 8923331, }, - { -228388112, -6603512, -1784559, }, - { -45775760, 11540040, -2239826, }, - { -7439420, 99392520, 24076512, }, - { -287786976, -36048736, 3089155, }, - { 4673998, -168884560, 13025562, }, - { -578127296, -82212656, 6925098, }, - { -4969814, -100874824, -13440026, }, - { -928045824, -1262184, -3357591, }, - { 243358208, -19028316, -324270, }, - { -554744960, 3474092, 3419331, }, - { 15159624, -137618272, 30216706, }, - { -317898976, -36552856, 7756711, }, - { 15227807, -86528024, 12173011, }, - }, - { - { -456805216, -32255742, 6639483, }, - { -112510424, -23877870, 18947786, }, - { -189299072, 1576253, -5324686, }, - { 84136264, 11220602, -24946780, }, - { -75048112, -87878256, -31089658, }, - { -142671296, 12062953, -4116726, }, - { 22120156, -68032816, 49400712, }, - { -386223872, 31193810, 14438069, }, - { 10969883, 14823006, 30617748, }, - { -868519680, 35133368, -316217, }, - { 284063232, -5093295, -1347546, }, - { -553373760, 14804752, 6683506, }, - { 68075232, -55910812, 46515568, }, - { -251979296, 713501, 10266582, }, - { 136529488, 2549063, 20943334, }, - }, - { - { -378490784, -996969, -17370996, }, - { -156559072, 38678864, 4654134, }, - { -177369808, -8266739, -4779225, }, - { 164008688, -47361140, -20721606, }, - { -63569812, -68194416, -41852308, }, - { -41226856, -7129109, -16905528, }, - { -7510824, 127864400, -22777822, }, - { -250573216, 15700790, -3388192, }, - { -351650, 98158256, -1477469, }, - { -758244288, -43934296, 9135932, }, - { 221876944, 31637802, -2272038, }, - { -509314400, -7141457, 8430484, }, - { 32112934, 97078608, -2900177, }, - { -189582544, 6276558, -1442035, }, - { 150665312, 52821120, -552440, }, - }, - { - { -328674528, 40242232, -8975945, }, - { -151924800, -20779588, -18118856, }, - { -197082096, 10024454, 5124433, }, - { 121245856, 23868208, 8290361, }, - { 23447300, 142530640, 18077518, }, - { -43131672, 14383309, -12541841, }, - { -17070348, 82138032, -36723044, }, - { -222328448, -24732570, -24415816, }, - { -10189273, 27262842, -28318866, }, - { -643103680, 13499619, 10624138, }, - { 98813240, -37815576, -5346161, }, - { -433130816, -2343979, -1904281, }, - { -32130650, -23995982, -29850560, }, - { -130950328, 6957310, -9563818, }, - { 66393216, -25447144, -11730629, }, - }, - { - { -316999200, -14724222, 9760850, }, - { -82459080, -81389632, -9319542, }, - { -243403856, 21904334, 10335302, }, - { -99811816, 84763328, 21679384, }, - { 80673984, 31187906, 46925204, }, - { -198692160, 24356222, 7185481, }, - { 6947647, -79027400, 22248468, }, - { -320020704, -14198088, -14484777, }, - { 5288716, -85655072, 15171972, }, - { -556219712, 2996277, 857383, }, - { -23347980, 18650358, -4894652, }, - { -335211456, -24299852, -10462540, }, - { -50790672, -43757664, -17422534, }, - { -80444200, -19557134, -8613020, }, - { -48816600, 7784092, 60666, }, - }, - { - { -347980928, -34109556, 8020315, }, - { 28313498, 68919728, 29562796, }, - { -287355328, -37504728, -2088965, }, - { -463089824, -142948320, 688269, }, - { 43435004, -117633784, -2157147, }, - { -511685216, -97947264, 14437533, }, - { 11658152, -67379984, 22993108, }, - { -545768448, -23956790, 19153406, }, - { 6668474, -75892608, 18337362, }, - { -496568000, 10121090, -3943854, }, - { -100530152, -2284386, -539555, }, - { -244320288, 33477122, -5918465, }, - { -11123428, 53504556, 7702487, }, - { -58093192, 16689706, -701690, }, - { -125293856, -21958020, 3791383, }, - }, - { - { -396235424, 28530394, -5670968, }, - { 121521808, 72422816, 14588393, }, - { -282284032, -7220914, -12603045, }, - { -828566848, 74083352, -14059575, }, - { -29173566, 10940355, -32751274, }, - { -900029696, 114861920, 3750043, }, - { -3834869, 36973764, -14339822, }, - { -871949760, 122431264, 20877836, }, - { -7813620, 29796872, -22095460, }, - { -446641152, -12294881, -1540820, }, - { -124764504, -6745246, 2953864, }, - { -208990432, -14132590, 3662533, }, - { 35043712, -7324530, 17977122, }, - { -93645320, 16217797, 3842922, }, - { -118506736, 918586, -7269769, }, - }, - { - { -419816416, 8409546, -7485055, }, - { 177756880, -53181360, -43604120, }, - { -214271616, 35051228, -9516574, }, - { -1052510208, -350577, -2594160, }, - { -58577984, 59515360, -5730023, }, - { -1222012160, -62816044, -4646081, }, - { -8056822, 27921046, -14477261, }, - { -1199319168, -109910896, -8547522, }, - { -2239289, 70632888, -5808944, }, - { -391830400, 9975598, -1738388, }, - { -115676888, 8247948, 5041755, }, - { -266380320, -31537408, 6293738, }, - { 37157372, -27774480, 10413685, }, - { -199360032, -39514236, 302795, }, - { -31960462, 46750720, -7976828, }, - }, - { - { -396419040, -24897388, 826781, }, - { 199287552, -94219232, -37252936, }, - { -130629816, -32934882, -3066070, }, - { -1081162496, -33790120, 10034117, }, - { -33716568, -9487583, 13584982, }, - { -1362517120, -8376260, -2020782, }, - { 79457, -27114128, 4269735, }, - { -1395718912, -11603928, -10591926, }, - { 7618198, -1657857, 21300890, }, - { -326496960, -19525996, -1824824, }, - { -99994888, -1045288, 5325760, }, - { -410237024, 55961812, -733366, }, - { -1633698, 41486164, -4496294, }, - { -351074912, 34980900, -888521, }, - { 73531984, -48038136, 6064494, }, - }, - { - { -333237920, 21934934, 6692096, }, - { 136010880, 91286848, 39137352, }, - { -113062864, 3367791, 2892124, }, - { -955450368, 55922084, 16620987, }, - { 12907987, -13196824, -686121, }, - { -1298857728, 66461936, 10081362, }, - { 6760816, 1138703, 12552042, }, - { -1401256192, 60880624, 15841450, }, - { -1005559, -65381212, -3132642, }, - { -258166192, 19531900, 1465658, }, - { -90000504, -4531728, 3397856, }, - { -588642432, -44282724, -6445672, }, - { -35472136, -13742822, -16918950, }, - { -504519072, -33069100, 473520, }, - { 120281096, -2138357, 13868986, }, - }, - { - { -254524592, -2734284, 2728378, }, - { -61631708, 124418760, 64017560, }, - { -230375600, 51568600, 2342905, }, - { -770130560, -32261646, 16159814, }, - { 46897820, -24514062, -4051228, }, - { -1104524928, -65782256, 21886616, }, - { 2195265, 32971390, 1871532, }, - { -1255872000, -36322540, 23219666, }, - { -6711960, -24285356, -18641232, }, - { -201167680, -5025649, 1708860, }, - { -76220104, 3022046, 135828, }, - { -739942336, 13878650, -3015604, }, - { -25882010, -39599060, -10532870, }, - { -617759616, 16445430, 190589, }, - { 77534360, 47942036, 4677220, }, - }, - { - { -187215472, -7235410, -10152766, }, - { -302229856, -201453824, -6583648, }, - { -488476288, -75664976, -1499481, }, - { -608733248, 6152541, 4904316, }, - { 40810244, 9884867, 11841762, }, - { -889736320, 22035866, 17557826, }, - { -6236293, -10264972, -12664785, }, - { -1036020224, 34490196, 10843182, }, - { 4205310, 55413132, 12076374, }, - { -163429408, -4794794, -3781182, }, - { -38071128, 9797894, -2145336, }, - { -828692992, 8045548, 7798050, }, - { 13130789, 43269112, 10496363, }, - { -667675776, 8978092, 4118337, }, - { -14405857, -42557220, -9413495, }, - }, - { - { -160387504, -1212255, -19085760, }, - { -372883168, 9153112, -65391952, }, - { -823048896, 74214888, 928250, }, - { -502844576, 3480534, -8838506, }, - { -5722507, 47615080, 8771397, }, - { -725349632, 5845988, -944893, }, - { -2830920, -35772244, -3490735, }, - { -809384448, -33443836, 322123, }, - { 3865471, 58133992, 10559177, }, - { -145547856, -523986, -8354249, }, - { 35654672, -20708722, -2545305, }, - { -854448832, -1685238, 14260902, }, - { 33141042, 9367324, 18559090, }, - { -659427776, -14470282, 10415833, }, - { -82688320, 1826435, -12265353, }, - }, - { - { -216790624, 7305740, -11348914, }, - { -163187280, 201135472, -33787432, }, - { -1140422784, -67091148, 2142115, }, - { -447214016, 13685913, -13014288, }, - { -49104360, -39777304, -14513768, }, - { -622485696, 1927367, -16253230, }, - { 5139465, 7147900, 11028939, }, - { -621990720, 24934970, -7023882, }, - { -5451387, -9884330, -15425375, }, - { -151061520, 8894877, -4932770, }, - { 130730216, 20885352, -3863860, }, - { -831482048, -8508330, 7725036, }, - { 12105365, -50302120, 1881196, }, - { -613759936, 203474, 8196945, }, - { -83483960, 32781338, -2046015, }, - }, - { - { -404893024, 25424058, 9195525, }, - { 185291872, -169782208, 30771830, }, - { -1356832256, 19707458, 4005057, }, - { -434513248, -21893058, -2569464, }, - { -41713260, -31788126, -19857244, }, - { -568107648, -28803124, -13408351, }, - { 3011309, 25533580, 4052839, }, - { -497736256, -24537686, -8870718, }, - { -689342, -44617196, -1606855, }, - { -191575936, 2828236, 2968896, }, - { 208048208, -13804562, -6235219, }, - { -767861248, -8555038, -2246268, }, - { -20891258, 22090090, -17161078, }, - { -545730880, -3384971, -1339493, }, - { -29853244, -30506078, 9749039, }, - }, - { - { -739606272, -100307352, 17949206, }, - { 398036096, -5266167, 44648868, }, - { -1428731648, 29643864, 17725330, }, - { -470966240, -4185983, 9080098, }, - { 10814728, 70556112, 6454262, }, - { -565363712, 21619792, 3001109, }, - { -3702262, -11188927, -8196408, }, - { -451304960, 16711181, -1861868, }, - { 4640176, -5299453, 12935905, }, - { -275544704, -30096446, 4315906, }, - { 219822864, 5193689, -3836480, }, - { -670961920, 34142844, -2099702, }, - { -24570972, 37352256, -10452877, }, - { -462515904, 25297894, -3964255, }, - { 29928406, -4066260, 7910793, }, - }, - { - { -1158839040, 133191232, 3401077, }, - { 320299872, 114648784, 17737678, }, - { -1360001408, -29389388, 28477780, }, - { -553707200, 34342020, 9373766, }, - { 48848812, 1812476, 23652922, }, - { -629009216, 16498043, 14461692, }, - { -3304977, -18860812, -5110474, }, - { -484815360, 2575370, 9782862, }, - { -1039919, 36833104, -3190087, }, - { -390961216, 37847788, -1415192, }, - { 135019280, 15649787, 5561983, }, - { -562095808, -33288144, 4657355, }, - { 581968, -30288646, 8622147, }, - { -378714656, -26498338, 1365800, }, - { 58433032, 15504295, -4299263, }, - }, - { - { -1534202624, -69030864, -7241315, }, - { 29576218, -145640736, -14351096, }, - { -1168657408, 18329310, 17115982, }, - { -649110784, -39743480, 20401, }, - { 31003222, -59195388, 4426501, }, - { -744678592, -49221400, 11759620, }, - { 2608119, 14380624, 6142340, }, - { -568391680, -36477156, 13024488, }, - { -3774740, 17121888, -10470057, }, - { -508062944, -21304648, -3766150, }, - { -33743412, -50315540, 11559368, }, - { -469737888, 12621298, 6405407, }, - { 20067698, -9561134, 10832444, }, - { -315902368, 10422812, 4415227, }, - { 50327888, 2709051, -6794102, }, - }, - { - { -1751132288, -13207024, 7250442, }, - { -246708288, 73049880, -39247412, }, - { -862555584, -51076288, -4444218, }, - { -702395712, 1078574, -4603131, }, - { -14945949, 21788370, -14555107, }, - { -849413504, 41333156, -40802, }, - { 3284039, 15173046, 5415417, }, - { -631552384, 39072392, 281857, }, - { 2523830, -29244432, 7238094, }, - { -601198784, 3279745, 1770063, }, - { -217172336, 63978908, 4052839, }, - { -408027264, 255014, 2056753, }, - { 14478335, 20039780, 1262184, }, - { -285526752, 3602941, 2639258, }, - { 17275970, -4272419, 2461016, }, - }, - { - { -1774035712, 41514616, 28337658, }, - { -311022208, 84281752, -26998702, }, - { -463400128, 103843184, -11556683, }, - { -673888960, 36447628, 4330401, }, - { -38556460, 16538308, -10299332, }, - { -860121984, 13616120, -5515275, }, - { -1606318, -12928388, -4128537, }, - { -589480512, 21443698, -10248329, }, - { 2370822, -30808338, 6453725, }, - { -663360384, -3179350, 8325257, }, - { -313834336, -20128902, -7716983, }, - { -367748000, 2401424, -1614371, }, - { -5477694, -12163884, -4982162, }, - { -279149792, -5903970, -234076, }, - { -24133958, -15887621, 5986111, }, - }, - { - { -1633565056, -29656750, 29936996, }, - { -153765200, -139129024, 20012936, }, - { -41030360, -112123344, -2557653, }, - { -567753856, -29372744, 10521059, }, - { -22300008, -26103200, 1022739, }, - { -733468224, -61831424, 1477469, }, - { -3102040, -8038568, -5382668, }, - { -406942240, -78030968, -4046933, }, - { -3411815, 11391864, -9660992, }, - { -699962112, 10571525, 8303246, }, - { -254887520, -47447576, -7445326, }, - { -326485152, -11907797, -1275068, }, - { -17091822, -501974, -6423661, }, - { -272977376, -2227478, -886374, }, - { -50830400, 18388366, -1570347, }, - }, - { - { -1375184640, 31143344, 11145977, }, - { 61715460, 32014150, 39172788, }, - { 300763136, 64285460, 5029407, }, - { -418000160, 20066088, 2936684, }, - { 12705050, 14372571, 7395934, }, - { -501899136, 63888176, 6962142, }, - { 612570, 13727252, 1901060, }, - { -136055440, 77131168, 5029407, }, - { -515933, 32912334, -1219234, }, - { -712420736, -4226785, 4772783, }, - { -62121332, 72037336, 844498, }, - { -264470672, 20142322, 1314260, }, - { -8580271, 16182900, -2963528, }, - { -242160992, 13138842, 776852, }, - { -42459508, 6663642, -7353521, }, - }, - { - { -1027720192, -77440408, -3391414, }, - { 173917728, 60976724, 8347806, }, - { 483799072, -339839, 655519, }, - { -260935904, -33547452, -3558381, }, - { 30398168, 9349607, 5104569, }, - { -247261808, -51369956, 4529043, }, - { 3087008, 1705102, 5864778, }, - { 119048440, -45323180, 4776004, }, - { 3295314, 5176510, 9279277, }, - { -688588480, -17838610, 6984154, }, - { 158658240, -48439180, 2936684, }, - { -172061760, -25860534, 3860102, }, - { 9170292, -17559974, 4941360, }, - { -172681840, -21907018, 2871723, }, - { -2390149, -26675506, -3151432, }, - }, - { - { -607247168, 129044440, 7869991, }, - { 148426560, -44091060, -21153788, }, - { 504355872, -35570920, -10821707, }, - { -122338920, 43845172, 3470334, }, - { 16774532, -11637751, 798864, }, - { -42919072, 41804528, 5733782, }, - { 70330, -16952772, -434865, }, - { 271430656, 12314208, 1133335, }, - { -1134945, -27432492, -3331284, }, - { -601181056, 36340256, 16134582, }, - { 284485760, 14280229, 1416802, }, - { -46436648, 27926414, 4838281, }, - { 14782741, -4701916, 8718784, }, - { -63385664, 26146688, 3585761, }, - { 38227892, 19090592, 4918275, }, - }, - { - { -131955888, -102776416, 23400592, }, - { 50165220, -2446521, -14534706, }, - { 429276064, 26648124, -16449725, }, - { -5843840, -23798414, 13560285, }, - { -10225243, 10250476, 235149, }, - { 91384016, -18622442, 12086575, }, - { -3149285, 965831, -6698002, }, - { 302248128, 11066520, 1255204, }, - { -2464238, -18131742, -6780680, }, - { -411309696, -33869576, 17572322, }, - { 248285616, 21774410, 6012418, }, - { 112084152, -22398254, 80531, }, - { 2075543, 25417080, 1172526, }, - { 76741400, -22457310, -71941, }, - { 45845556, 5286568, 8261370, }, - }, - { - { 373993952, 17577690, -7036230, }, - { -42478836, 3827353, 5222144, }, - { 342384608, -4961761, -11625940, }, - { 114021184, -14768782, 3609383, }, - { -25247966, -19390166, -7270306, }, - { 199094288, -22322018, 2608656, }, - { -331249, 19904490, -118112, }, - { 266570896, -30332670, -670015, }, - { 2378338, 17207250, 6906308, }, - { -89402432, 24081882, -7893613, }, - { 78420200, -62676456, 9542880, }, - { 293430016, 18987514, -13280576, }, - { -12401181, -14681809, -10343892, }, - { 228244768, 18317498, -9505836, }, - { 15437186, -26183194, 3886946, }, - }, - { - { 865165312, -25497610, -74502112, }, - { -84415968, 16539382, 6498823, }, - { 288153120, -2291902, -5586142, }, - { 269447456, 15268609, -30878668, }, - { -14707042, -15683610, -13768591, }, - { 343504512, 29538100, -36380520, }, - { 3339874, -1758252, 7729868, }, - { 247785248, 36953360, -18047990, }, - { 854162, 28677496, 2340757, }, - { 336332992, -61252676, -49850076, }, - { -113531552, 79529376, -3664681, }, - { 461719200, -34638376, -24414204, }, - { -10072235, -23138600, -8646306, }, - { 356392640, -25852482, -16559783, }, - { -24495272, 27974196, -6864969, }, - }, - { - { 1228776704, 177195312, -76141720, }, - { -67956584, -5862094, -7258495, }, - { 257796816, 5892159, -2051384, }, - { 447683776, 69246144, -48252348, }, - { 14698452, 70069168, 11866995, }, - { 530176128, 71143448, -61755188, }, - { 3221, -25773562, -967441, }, - { 289620928, 16216186, -37874096, }, - { -2878165, 2015413, -8126078, }, - { 735616256, 161502048, -48373680, }, - { -202235520, -27891518, -27511950, }, - { 549467520, 55591908, -11610370, }, - { 6163815, 36712844, 10152229, }, - { 412312032, 35161288, -6841883, }, - { -37738804, 3149822, -14293651, }, - }, - { - { 1281082496, -211401504, 48896056, }, - { -14148159, -41238128, -6071473, }, - { 215368448, -6750078, 6689412, }, - { 560569984, -152013392, 4828080, }, - { 24906516, 30822296, 27560268, }, - { 662074560, -195179424, 1111323, }, - { -3439732, -5625334, -8611946, }, - { 355079968, -117149528, -9849434, }, - { 1498407, -29228326, 4475893, }, - { 905934208, -173703504, 37728068, }, - { -138740864, -89582280, -22839026, }, - { 489035168, -18500572, 24653112, }, - { 11938935, 25028386, 14175540, }, - { 355331232, -2408940, 16406238, }, - { -13491566, -49535468, -1341640, }, - }, - { - { 894766784, -193518336, 137400832, }, - { 35444756, 40083320, 15843061, }, - { 135316704, -25804700, 14344654, }, - { 490654912, 5720360, 78753056, }, - { -4183298, -105033960, -19880330, }, - { 589552960, 32260036, 101505648, }, - { 1813550, 32169842, 6186364, }, - { 345121568, 67742912, 59600724, }, - { 810138, -33732136, 2275796, }, - { 704745088, -125802280, 102349072, }, - { 6849399, 137312256, 30303142, }, - { 274665856, -114824880, 32450088, }, - { -2047089, -48783312, -11823508, }, - { 192652368, -84133040, 18580028, }, - { 19188840, 24214488, 20062866, }, - }, - { - { 204740016, 647619328, -38720204, }, - { 39803072, 51194400, 12788802, }, - { 30276298, 68772624, -49929, }, - { 214110032, 314792640, 22679038, }, - { -16612934, -90500864, -22324704, }, - { 262058496, 396546272, 36606544, }, - { 1224066, 38911328, 2881923, }, - { 187617600, 208635008, 42795056, }, - { -1625645, -15795816, -4760971, }, - { 215489776, 484327904, -23882166, }, - { 94519344, 41808284, 52547316, }, - { 5176510, 190813584, -29558502, }, - { -7446937, -47923244, -10260140, }, - { 1622424, 120248880, -21247204, }, - { 20531018, 61265560, 6198712, }, - }, - { - { -328660576, -106819056, -240462336, }, - { 6014565, -55379308, -21743808, }, - { -49900540, -34383896, -26082800, }, - { -92435216, -211497072, -125123672, }, - { 251792, 29870960, 22744000, }, - { -116375896, -290485824, -160718208, }, - { -1044214, 21117280, -3644280, }, - { -39702140, -239503488, -88157424, }, - { 306553, -1584306, 1057636, }, - { -207131248, -121513752, -184537568, }, - { 55978456, -186956704, -25972204, }, - { -152331216, 24865176, -69481296, }, - { 48318, 9571335, 11224897, }, - { -104797200, 22180822, -42998528, }, - { -513249, -18034568, -19814832, }, - }, + {80, 263, -8}, + {-2068, 2973, -830}, + {-339, 1799, -616}, + {179, -1662, 563}, + {-1637, 3905, -1115}, + {175, -2052, 762}, + {-773, 5135, -1900}, + {136, -1963, 765}, + {-657, 4693, -1836}, + {156, 1121, -476}, + {-1830, 2634, -778}, + {-14, -338, 205}, + {-1582, 5363, -1689}, + {-202, -454, 261}, + {-2127, 3029, -751} + }, + { + {472, -777, -412}, + {-4654, 2731, -416}, + {-478, 272, -1216}, + {-415, -1803, 513}, + {-2755, 2770, -1200}, + {-391, -2360, 679}, + {-498, 7103, -1106}, + {-332, -2799, 477}, + {-136, 8451, -330}, + {705, 1586, -423}, + {-4135, 3480, 101}, + {-332, -1418, -208}, + {-2362, 3861, -2004}, + {-880, -1522, -77}, + {-4404, 1684, -738} + }, + { + {1519, -2126, -234}, + {-4946, 138, 723}, + {703, -4795, 639}, + {-2259, 1242, -286}, + {-806, -1969, 118}, + {-1842, 792, -244}, + {753, -1105, 1851}, + {-1318, 990, -884}, + {746, 2069, 2137}, + {1216, -1042, 547}, + {-5309, 3002, 441}, + {-711, -1499, -222}, + {55, -4519, 627}, + {-1535, -1020, -225}, + {-3231, -1126, 127} + }, + { + {2417, 1671, 918}, + {-3647, -1667, -308}, + {1518, -1623, 1739}, + {-4095, -14, -308}, + {1653, 1047, 504}, + {-2911, 484, -67}, + {267, -4688, 429}, + {-1617, 1931, -426}, + {-361, -5949, -1037}, + {724, -2917, -129}, + {-5221, 1846, -111}, + {-1415, -182, 414}, + {2093, -5, 1727}, + {-2208, 42, 314}, + {-6, 1013, 183} + }, + { + {1651, 2829, 708}, + {-285, -3157, -299}, + {499, 3770, -334}, + {-5035, -378, -31}, + {2391, -146, 884}, + {-3235, -207, 203}, + {-568, 583, -1370}, + {-1589, -58, 337}, + {-442, -5280, -1252}, + {151, -1553, -531}, + {-3462, 830, 70}, + {-3061, 1755, -47}, + {1347, 3648, 504}, + {-3527, 1291, 20}, + {3046, -920, 281} + }, + { + {-278, -3820, -1419}, + {3409, -784, -63}, + {-870, 830, -1225}, + {-4806, 899, 354}, + {453, -4114, -85}, + {-2848, 91, 172}, + {-242, 3190, -358}, + {-1708, -933, 13}, + {568, 2077, 1616}, + {92, -191, 87}, + {-824, 1543, -128}, + {-4633, 80, -360}, + {-957, -2116, -1018}, + {-4914, 157, -154}, + {3728, -724, 255} + }, + { + {-835, -3834, -1343}, + {5364, -1032, -469}, + {-1726, -3065, 485}, + {-3983, 644, 293}, + {-1811, 12, -1147}, + {-2061, 20, 53}, + {436, -962, 1056}, + {-1605, 140, -369}, + {37, 5871, 102}, + {-196, 712, -336}, + {2210, -191, 12}, + {-5182, -532, 13}, + {-1879, -1274, -1078}, + {-5744, 24, 93}, + {1793, 1127, -7} + }, + { + {-162, 2870, 1049}, + {4975, 748, 342}, + {-3207, -2430, 940}, + {-3068, -287, -225}, + {-1745, 2190, -314}, + {-1228, 33, -56}, + {258, -2528, 447}, + {-1071, 922, -169}, + {-497, 1950, -1392}, + {-578, 1445, -32}, + {4542, 1007, 28}, + {-4721, 197, 177}, + {-429, 3137, 189}, + {-5836, -175, 24}, + {-1115, -1180, -277} + }, + { + {-1186, 3003, 1027}, + {1662, 2905, 163}, + {-5380, 2336, -570}, + {-1939, -984, -124}, + {-74, -1166, 481}, + {-534, -34, -144}, + {-343, 1080, -789}, + {-511, -448, 229}, + {261, -3536, 761}, + {-1752, 1035, 351}, + {5437, 683, 14}, + {-3655, 14, 11}, + {1377, -336, 1014}, + {-5068, -292, -96}, + {-2943, -304, -283} + }, + { + {-4239, -2555, -544}, + {-2588, -954, -472}, + {-6624, 1711, -536}, + {-889, 299, 206}, + {1352, 102, 638}, + {-57, 546, -14}, + {-262, 1938, -442}, + {-667, -1041, -2}, + {252, -3541, 707}, + {-3959, -1387, -195}, + {4615, -351, -234}, + {-2517, 464, -29}, + {1319, -1953, 393}, + {-3747, 792, 75}, + {-2634, 1130, 177} + }, + { + {-7310, -528, -630}, + {-4959, -507, -131}, + {-6916, -886, 496}, + {-460, 840, -113}, + {1207, 2064, -18}, + {-106, 275, 88}, + {252, -1097, 588}, + {-1599, -3, -244}, + {-328, 719, -930}, + {-6072, -5, -324}, + {2613, 367, -143}, + {-1813, -159, 110}, + {-213, 1241, -374}, + {-2598, 60, 157}, + {-844, -145, 302} + }, + { + {-9182, 657, 149}, + {-4571, 540, 135}, + {-7244, -1108, 383}, + {-638, 481, -251}, + {26, -233, -616}, + {-943, -486, -84}, + {276, -1240, 509}, + {-3070, 1, 37}, + {-34, 2823, -78}, + {-7477, 310, 25}, + {-40, -306, 37}, + {-1807, -475, 12}, + {-1336, -103, -554}, + {-2128, -384, -96}, + {1152, -298, -158} + }, + { + {-10008, 390, 246}, + {-2019, -898, 132}, + {-7646, 464, -143}, + {-1402, -341, 218}, + {-751, -1139, -84}, + {-2380, 83, -56}, + {-186, 1492, -424}, + {-5140, 893, 21}, + {252, 681, 709}, + {-8363, 156, 170}, + {-2694, 516, 179}, + {-2294, 381, -232}, + {-885, -1069, -352}, + {-2273, -129, -158}, + {2460, -748, -237} + }, + { + {-10335, 215, 144}, + {1074, 612, 109}, + {-7715, 384, -105}, + {-2896, -1130, 184}, + {-818, 105, 374}, + {-4184, -377, 80}, + {-282, 1115, -533}, + {-7516, -397, -117}, + {-68, -1677, -206}, + {-9149, -353, 68}, + {-4674, -644, 92}, + {-2924, 469, -106}, + {591, 1721, 286}, + {-2906, 96, 40}, + {2365, 281, 173} + }, + { + {-10737, 96, 299}, + {3079, -243, 93}, + {-7334, -216, 64}, + {-4421, 556, -173}, + {-403, 570, 99}, + {-5990, 457, 69}, + {124, -1300, 291}, + {-9723, -240, 203}, + {-169, -905, -469}, + {-10177, 380, -53}, + {-5231, -29, -27}, + {-3775, 45, 183}, + {1332, 8, 772}, + {-3935, 353, 112}, + {692, 827, 289} + }, + { + {-11371, -996, 58}, + {3332, -523, 7}, + {-6530, 203, 65}, + {-5006, 314, -140}, + {256, -261, -354}, + {-7213, -213, 38}, + {288, -449, 571}, + {-11503, -776, 339}, + {96, 1081, 276}, + {-11476, 53, 42}, + {-4000, 597, 7}, + {-5085, -748, 82}, + {401, -2166, 218}, + {-5015, -365, 40}, + {-1557, -1258, -33} + }, + { + {-11511, 162, -342}, + {2204, 787, -251}, + {-5462, -193, 32}, + {-4350, -718, 124}, + {848, -1136, -169}, + {-7393, -36, 12}, + {-59, 1657, -136}, + {-12308, 770, -93}, + {129, 864, 350}, + {-12854, 302, 201}, + {-1411, -685, 21}, + {-6580, 345, -70}, + {-1003, 1344, -760}, + {-5681, 267, -69}, + {-2753, 234, -335} + }, + { + {-10440, 1453, -42}, + {672, 125, -240}, + {-4386, 184, 4}, + {-2737, 326, 240}, + {836, 590, 493}, + {-6367, 435, 12}, + {-336, 30, -729}, + {-11359, 824, -226}, + {-135, -1078, -382}, + {-13943, -528, 89}, + {1543, 701, 6}, + {-7796, -70, -2}, + {-1053, 1657, -645}, + {-5611, 325, -72}, + {-1951, 991, -222} + }, + { + {-8616, -535, 384}, + {-647, -333, 136}, + {-3485, -101, -27}, + {-698, 176, -34}, + {-114, 1517, 367}, + {-4391, -550, 47}, + {71, -2577, 199}, + {-8822, -1254, 106}, + {-76, -1539, -205}, + {-14161, -19, -51}, + {3713, -290, -5}, + {-8465, 53, 52}, + {231, -2100, 461}, + {-4851, -558, 118}, + {232, -1320, 186} + }, + { + {-6970, -492, 101}, + {-1717, -364, 289}, + {-2888, 24, -81}, + {1284, 171, -381}, + {-1145, -1341, -474}, + {-2177, 184, -63}, + {338, -1038, 754}, + {-5893, 476, 220}, + {167, 226, 467}, + {-13253, 536, -5}, + {4334, -78, -21}, + {-8444, 226, 102}, + {1039, -853, 710}, + {-3845, 11, 157}, + {2083, 39, 320} + }, + { + {-5775, -15, -265}, + {-2389, 590, 71}, + {-2706, -126, -73}, + {2503, -723, -316}, + {-970, -1041, -639}, + {-629, -109, -258}, + {-115, 1951, -348}, + {-3823, 240, -52}, + {-5, 1498, -23}, + {-11570, -670, 139}, + {3386, 483, -35}, + {-7772, -109, 129}, + {490, 1481, -44}, + {-2893, 96, -22}, + {2299, 806, -8} + }, + { + {-5015, 614, -137}, + {-2318, -317, -276}, + {-3007, 153, 78}, + {1850, 364, 127}, + {358, 2175, 276}, + {-658, 219, -191}, + {-260, 1253, -560}, + {-3392, -377, -373}, + {-155, 416, -432}, + {-9813, 206, 162}, + {1508, -577, -82}, + {-6609, -36, -29}, + {-490, -366, -455}, + {-1998, 106, -146}, + {1013, -388, -179} + }, + { + {-4837, -225, 149}, + {-1258, -1242, -142}, + {-3714, 334, 158}, + {-1523, 1293, 331}, + {1231, 476, 716}, + {-3032, 372, 110}, + {106, -1206, 339}, + {-4883, -217, -221}, + {81, -1307, 232}, + {-8487, 46, 13}, + {-356, 285, -75}, + {-5115, -371, -160}, + {-775, -668, -266}, + {-1227, -298, -131}, + {-745, 119, 1} + }, + { + {-5310, -520, 122}, + {432, 1052, 451}, + {-4385, -572, -32}, + {-7066, -2181, 10}, + {663, -1795, -33}, + {-7808, -1495, 220}, + {178, -1028, 351}, + {-8328, -366, 292}, + {102, -1158, 280}, + {-7577, 154, -60}, + {-1534, -35, -8}, + {-3728, 511, -90}, + {-170, 816, 118}, + {-886, 255, -11}, + {-1912, -335, 58} + }, + { + {-6046, 435, -87}, + {1854, 1105, 223}, + {-4307, -110, -192}, + {-12643, 1130, -215}, + {-445, 167, -500}, + {-13733, 1753, 57}, + {-59, 564, -219}, + {-13305, 1868, 319}, + {-119, 455, -337}, + {-6815, -188, -24}, + {-1904, -103, 45}, + {-3189, -216, 56}, + {535, -112, 274}, + {-1429, 247, 59}, + {-1808, 14, -111} + }, + { + {-6406, 128, -114}, + {2712, -811, -665}, + {-3270, 535, -145}, + {-16060, -5, -40}, + {-894, 908, -87}, + {-18646, -958, -71}, + {-123, 426, -221}, + {-18300, -1677, -130}, + {-34, 1078, -89}, + {-5979, 152, -27}, + {-1765, 126, 77}, + {-4065, -481, 96}, + {567, -424, 159}, + {-3042, -603, 5}, + {-488, 713, -122} + }, + { + {-6049, -380, 13}, + {3041, -1438, -568}, + {-1993, -503, -47}, + {-16497, -516, 153}, + {-514, -145, 207}, + {-20790, -128, -31}, + {1, -414, 65}, + {-21297, -177, -162}, + {116, -25, 325}, + {-4982, -298, -28}, + {-1526, -16, 81}, + {-6260, 854, -11}, + {-25, 633, -69}, + {-5357, 534, -14}, + {1122, -733, 93} + }, + { + {-5085, 335, 102}, + {2075, 1393, 597}, + {-1725, 51, 44}, + {-14579, 853, 254}, + {197, -201, -10}, + {-19819, 1014, 154}, + {103, 17, 192}, + {-21381, 929, 242}, + {-15, -998, -48}, + {-3939, 298, 22}, + {-1373, -69, 52}, + {-8982, -676, -98}, + {-541, -210, -258}, + {-7698, -505, 7}, + {1835, -33, 212} + }, + { + {-3884, -42, 42}, + {-940, 1898, 977}, + {-3515, 787, 36}, + {-11751, -492, 247}, + {716, -374, -62}, + {-16854, -1004, 334}, + {33, 503, 29}, + {-19163, -554, 354}, + {-102, -371, -284}, + {-3070, -77, 26}, + {-1163, 46, 2}, + {-11291, 212, -46}, + {-395, -604, -161}, + {-9426, 251, 3}, + {1183, 732, 71} + }, + { + {-2857, -110, -155}, + {-4612, -3074, -100}, + {-7454, -1155, -23}, + {-9289, 94, 75}, + {623, 151, 181}, + {-13576, 336, 268}, + {-95, -157, -193}, + {-15808, 526, 165}, + {64, 846, 184}, + {-2494, -73, -58}, + {-581, 150, -33}, + {-12645, 123, 119}, + {200, 660, 160}, + {-10188, 137, 63}, + {-220, -649, -144} + }, + { + {-2447, -18, -291}, + {-5690, 140, -998}, + {-12559, 1132, 14}, + {-7673, 53, -135}, + {-87, 727, 134}, + {-11068, 89, -14}, + {-43, -546, -53}, + {-12350, -510, 5}, + {59, 887, 161}, + {-2221, -8, -127}, + {544, -316, -39}, + {-13038, -26, 218}, + {506, 143, 283}, + {-10062, -221, 159}, + {-1262, 28, -187} + }, + { + {-3308, 111, -173}, + {-2490, 3069, -516}, + {-17401, -1024, 33}, + {-6824, 209, -199}, + {-749, -607, -221}, + {-9498, 29, -248}, + {78, 109, 168}, + {-9491, 380, -107}, + {-83, -151, -235}, + {-2305, 136, -75}, + {1995, 319, -59}, + {-12687, -130, 118}, + {185, -768, 29}, + {-9365, 3, 125}, + {-1274, 500, -31} + }, + { + {-6178, 388, 140}, + {2827, -2591, 470}, + {-20704, 301, 61}, + {-6630, -334, -39}, + {-636, -485, -303}, + {-8669, -439, -205}, + {46, 390, 62}, + {-7595, -374, -135}, + {-11, -681, -25}, + {-2923, 43, 45}, + {3175, -211, -95}, + {-11717, -131, -34}, + {-319, 337, -262}, + {-8327, -52, -20}, + {-456, -465, 149} + }, + { + {-11285, -1531, 274}, + {6074, -80, 681}, + {-21801, 452, 270}, + {-7186, -64, 139}, + {165, 1077, 98}, + {-8627, 330, 46}, + {-56, -171, -125}, + {-6886, 255, -28}, + {71, -81, 197}, + {-4204, -459, 66}, + {3354, 79, -59}, + {-10238, 521, -32}, + {-375, 570, -159}, + {-7057, 386, -60}, + {457, -62, 121} + }, + { + {-17682, 2032, 52}, + {4887, 1749, 271}, + {-20752, -448, 435}, + {-8449, 524, 143}, + {745, 28, 361}, + {-9598, 252, 221}, + {-50, -288, -78}, + {-7398, 39, 149}, + {-16, 562, -49}, + {-5966, 578, -22}, + {2060, 239, 85}, + {-8577, -508, 71}, + {9, -462, 132}, + {-5779, -404, 21}, + {892, 237, -66} + }, + { + {-23410, -1053, -110}, + {451, -2222, -219}, + {-17832, 280, 261}, + {-9905, -606, 0}, + {473, -903, 68}, + {-11363, -751, 179}, + {40, 219, 94}, + {-8673, -557, 199}, + {-58, 261, -160}, + {-7752, -325, -57}, + {-515, -768, 176}, + {-7168, 193, 98}, + {306, -146, 165}, + {-4820, 159, 67}, + {768, 41, -104} + }, + { + {-26720, -202, 111}, + {-3764, 1115, -599}, + {-13162, -779, -68}, + {-10718, 16, -70}, + {-228, 332, -222}, + {-12961, 631, -1}, + {50, 232, 83}, + {-9637, 596, 4}, + {39, -446, 110}, + {-9174, 50, 27}, + {-3314, 976, 62}, + {-6226, 4, 31}, + {221, 306, 19}, + {-4357, 55, 40}, + {264, -65, 38} + }, + { + {-27070, 633, 432}, + {-4746, 1286, -412}, + {-7071, 1585, -176}, + {-10283, 556, 66}, + {-588, 252, -157}, + {-13124, 208, -84}, + {-25, -197, -63}, + {-8995, 327, -156}, + {36, -470, 98}, + {-10122, -49, 127}, + {-4789, -307, -118}, + {-5611, 37, -25}, + {-84, -186, -76}, + {-4259, -90, -4}, + {-368, -242, 91} + }, + { + {-24926, -453, 457}, + {-2346, -2123, 305}, + {-626, -1711, -39}, + {-8663, -448, 161}, + {-340, -398, 16}, + {-11192, -943, 23}, + {-47, -123, -82}, + {-6209, -1191, -62}, + {-52, 174, -147}, + {-10681, 161, 127}, + {-3889, -724, -114}, + {-4982, -182, -19}, + {-261, -8, -98}, + {-4165, -34, -14}, + {-776, 281, -24} + }, + { + {-20984, 475, 170}, + {942, 488, 598}, + {4589, 981, 77}, + {-6378, 306, 45}, + {194, 219, 113}, + {-7658, 975, 106}, + {9, 209, 29}, + {-2076, 1177, 77}, + {-8, 502, -19}, + {-10871, -64, 73}, + {-948, 1099, 13}, + {-4035, 307, 20}, + {-131, 247, -45}, + {-3695, 200, 12}, + {-648, 102, -112} + }, + { + {-15682, -1182, -52}, + {2654, 930, 127}, + {7382, -5, 10}, + {-3982, -512, -54}, + {464, 143, 78}, + {-3773, -784, 69}, + {47, 26, 89}, + {1817, -692, 73}, + {50, 79, 142}, + {-10507, -272, 107}, + {2421, -739, 45}, + {-2625, -395, 59}, + {140, -268, 75}, + {-2635, -334, 44}, + {-36, -407, -48} + }, + { + {-9266, 1969, 120}, + {2265, -673, -323}, + {7696, -543, -165}, + {-1867, 669, 53}, + {256, -178, 12}, + {-655, 638, 87}, + {1, -259, -7}, + {4142, 188, 17}, + {-17, -419, -51}, + {-9173, 555, 246}, + {4341, 218, 22}, + {-709, 426, 74}, + {226, -72, 133}, + {-967, 399, 55}, + {583, 291, 75} + }, + { + {-2013, -1568, 357}, + {765, -37, -222}, + {6550, 407, -251}, + {-89, -363, 207}, + {-156, 156, 4}, + {1394, -284, 184}, + {-48, 15, -102}, + {4612, 169, 19}, + {-38, -277, -103}, + {-6276, -517, 268}, + {3789, 332, 92}, + {1710, -342, 1}, + {32, 388, 18}, + {1171, -343, -1}, + {700, 81, 126} + }, + { + {5707, 268, -107}, + {-648, 58, 80}, + {5224, -76, -177}, + {1740, -225, 55}, + {-385, -296, -111}, + {3038, -341, 40}, + {-5, 304, -2}, + {4068, -463, -10}, + {36, 263, 105}, + {-1364, 367, -120}, + {1197, -956, 146}, + {4477, 290, -203}, + {-189, -224, -158}, + {3483, 280, -145}, + {236, -400, 59} + }, + { + {13201, -389, -1137}, + {-1288, 252, 99}, + {4397, -35, -85}, + {4111, 233, -471}, + {-224, -239, -210}, + {5241, 451, -555}, + {51, -27, 118}, + {3781, 564, -275}, + {13, 438, 36}, + {5132, -935, -761}, + {-1732, 1214, -56}, + {7045, -529, -373}, + {-154, -353, -132}, + {5438, -394, -253}, + {-374, 427, -105} + }, + { + {18750, 2704, -1162}, + {-1037, -89, -111}, + {3934, 90, -31}, + {6831, 1057, -736}, + {224, 1069, 181}, + {8090, 1086, -942}, + {0, -393, -15}, + {4419, 247, -578}, + {-44, 31, -124}, + {11225, 2464, -738}, + {-3086, -426, -420}, + {8384, 848, -177}, + {94, 560, 155}, + {6291, 537, -104}, + {-576, 48, -218} + }, + { + {19548, -3226, 746}, + {-216, -629, -93}, + {3286, -103, 102}, + {8554, -2320, 74}, + {380, 470, 421}, + {10102, -2978, 17}, + {-52, -86, -131}, + {5418, -1788, -150}, + {23, -446, 68}, + {13823, -2651, 576}, + {-2117, -1367, -348}, + {7462, -282, 376}, + {182, 382, 216}, + {5422, -37, 250}, + {-206, -756, -20} + }, + { + {13653, -2953, 2097}, + {541, 612, 242}, + {2065, -394, 219}, + {7487, 87, 1202}, + {-64, -1603, -303}, + {8996, 492, 1549}, + {28, 491, 94}, + {5266, 1034, 909}, + {12, -515, 35}, + {10754, -1920, 1562}, + {105, 2095, 462}, + {4191, -1752, 495}, + {-31, -744, -180}, + {2940, -1284, 284}, + {293, 369, 306} + }, + { + {3124, 9882, -591}, + {607, 781, 195}, + {462, 1049, -1}, + {3267, 4803, 346}, + {-253, -1381, -341}, + {3999, 6051, 559}, + {19, 594, 44}, + {2863, 3184, 653}, + {-25, -241, -73}, + {3288, 7390, -364}, + {1442, 638, 802}, + {79, 2912, -451}, + {-114, -731, -157}, + {25, 1835, -324}, + {313, 935, 95} + }, + { + {-5015, -1630, -3669}, + {92, -845, -332}, + {-761, -525, -398}, + {-1410, -3227, -1909}, + {4, 456, 347}, + {-1776, -4432, -2452}, + {-16, 322, -56}, + {-606, -3655, -1345}, + {5, -24, 16}, + {-3161, -1854, -2816}, + {854, -2853, -396}, + {-2324, 379, -1060}, + {1, 146, 171}, + {-1599, 338, -656}, + {-8, -275, -302} + } }; -const Word32 rightHRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS] /* Q29 */= +const Word16 rightHRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]= { { - { 335878240, 171201152, 7902740, }, - { 625042304, -38326140, 24910274, }, - { 537386304, 24339580, 36527624, }, - { 162773888, 291606816, 80030808, }, - { 610952640, -82900920, -32977296, }, - { 45806900, 473868032, 110131016, }, - { 672814144, -110260936, -35019552, }, - { 31259846, 506221504, 91921424, }, - { 704516928, -118449832, -48664128, }, - { 365311136, 194221648, 26628798, }, - { 555327488, 63325536, 28055264, }, - { 134318128, 374452416, 114475376, }, - { 616197376, -46350752, 6811282, }, - { 269210176, 195440880, 39850856, }, - { 584630400, -49424872, -314606, }, - }, - { - { 153939680, -135309728, -82342040, }, - { 615573504, -83027624, 23161684, }, - { 509388480, -61414812, 27712740, }, - { -32580012, -194236672, -63221920, }, - { 678085120, 133931576, 33365990, }, - { -56443924, -209270128, -145981104, }, - { 725016256, 115785872, 39330088, }, - { -50629612, -88218632, -142844176, }, - { 738054144, 93220656, 26321708, }, - { 235484464, -10732050, -31916976, }, - { 558783296, -111704584, -44579076, }, - { -55024972, -244054000, -73130944, }, - { 626338304, -79976048, -6355478, }, - { 53143240, -92013232, -23232014, }, - { 589115456, -29078540, 8979703, }, - }, - { - { -47502340, -225702144, 1009317, }, - { 613705728, 190158608, -87268368, }, - { 500094176, 66390532, -18193482, }, - { -160684384, -74954160, -65988952, }, - { 707738112, 53812184, 55165632, }, - { -24977920, -437184192, -53591528, }, - { 728532736, 116576688, 32762010, }, - { 6060199, -491625056, 15927886, }, - { 726640256, 153417312, 2280628, }, - { 68508488, -8391829, -511638, }, - { 619300480, -227791104, -7439957, }, - { -149295744, -68784976, -106736376, }, - { 642141120, 15699179, -49628348, }, - { -174591488, 17845590, -8568997, }, - { 583061120, 57918708, -26482768, }, - }, - { - { -246570320, -252771712, 25805774, }, - { 711792064, 274690016, -82055352, }, - { 569176064, 166868064, -9373229, }, - { -120591408, 45267880, -33620468, }, - { 639823424, -91681448, 10991895, }, - { 45526652, 26081726, 112846504, }, - { 661089408, -61773976, -25802552, }, - { 39781060, -244305248, 111033496, }, - { 689595136, 6112812, -45711872, }, - { -118973816, -45193256, 16270947, }, - { 685362944, -63247152, 47053516, }, - { -50758996, 267372992, -9620727, }, - { 687694592, 133942848, -11167989, }, - { -268843488, -18899466, -7071664, }, - { 595376448, 97235912, -13216688, }, - }, - { - { -363332768, -48200808, -38664368, }, - { 862057920, -196809360, 76299024, }, - { 680975680, -66029752, 62313532, }, - { 42142756, -224898448, 23900956, }, - { 517202656, 39182988, -13852343, }, - { 16899086, 240396304, 28621662, }, - { 578456384, -10711112, -26575110, }, - { -31825708, 272278368, -90252832, }, - { 675961792, -76532024, -7255274, }, - { -275402432, 19490024, 19011136, }, - { 694145088, 78392816, -15985868, }, - { 104157792, -106337488, 88669600, }, - { 699485376, 22428320, 29043106, }, - { -167101616, -96108480, -3835943, }, - { 594321984, 26122528, 13720810, }, - }, - { - { -278544192, 77761992, 6783364, }, - { 893755328, -228144912, 63108100, }, - { 720438336, -255192992, -13665512, }, - { 156205280, -23141820, 77895672, }, - { 399979552, 6000070, -7042136, }, - { -31854698, -64270964, -75585520, }, - { 512157120, 10667088, -5974837, }, - { -14828375, 393006144, -40407588, }, - { 667064256, 27399744, 34042448, }, - { -356493568, -38231652, 11823508, }, - { 722442496, 111037256, 533113, }, - { 115784800, -171748224, 61668752, }, - { 626011904, -82572360, -625992, }, - { 45074072, 72021768, 15156940, }, - { 536772128, -35543540, -3380139, }, - }, - { - { -73698416, 41248328, -20535312, }, - { 848944832, 184383488, -79126184, }, - { 734158656, -104955576, -76299024, }, - { 83268144, 220971232, 1210644, }, - { 328131200, -52250424, 26017302, }, - { -17207786, -185924832, -29459180, }, - { 478818528, -4858145, 3739306, }, - { 37145560, 13910862, 105687336, }, - { 647532864, 87085832, 14063334, }, - { -334238656, -15821586, -947040, }, - { 766663488, 87857848, 5260261, }, - { -16082505, 188711200, -38655244, }, - { 512291360, 14954002, -14906221, }, - { 202894256, -21919902, 18131742, }, - { 441034624, 10546829, -3133716, }, - }, - { - { 182968832, 166872896, -25620554, }, - { 900337344, 202598976, -76710264, }, - { 774260736, 183863248, 31660888, }, - { -58633820, -30077656, -56673168, }, - { 287297888, -74439840, 22798760, }, - { 24970940, 68754376, 57749056, }, - { 481663936, 8292508, 8747238, }, - { -9427453, -322418912, -27601070, }, - { 644221504, -19704236, -26892400, }, - { -206094544, 45814416, -1173063, }, - { 828069184, 40436044, -29763586, }, - { -114652008, 22880364, -75015360, }, - { 412233120, -1234803, -1341104, }, - { 209146112, -50087908, 9846749, }, - { 329985568, -20840256, 6089727, }, - }, - { - { 366514784, -87303264, 40976672, }, - { 1047088896, -194659728, 43730284, }, - { 742656192, 139103248, 52795884, }, - { -114707304, -54439248, -33390686, }, - { 272615008, 16188805, -11766063, }, - { 17126718, 143042272, 28806346, }, - { 510879904, 21948356, -520765, }, - { -24763170, -206299632, -69475392, }, - { 699449920, -91850024, -6042482, }, - { -14831059, -71486512, 9839770, }, - { 919253440, -104362336, 10414759, }, - { -63852204, -181701280, -10722923, }, - { 358785984, 5443334, 4399657, }, - { 77541336, 88224000, -13798119, }, - { 235267568, 42878804, -1713155, }, - }, - { - { 328002368, -158853120, 19053012, }, - { 1123982208, -105683040, 55635932, }, - { 635256832, -136615936, -37422052, }, - { -54308788, 119649200, 13070659, }, - { 308759840, 62324808, 1898912, }, - { -19162534, -72129144, -44424996, }, - { 567933696, 23300734, -9535901, }, - { 20692616, 124913752, 58988692, }, - { 789915904, 13496935, 18928458, }, - { 169172320, 1418413, 5950677, }, - { 959227776, -50255412, 22593138, }, - { 54667956, 60081760, 48018808, }, - { 362694944, -3298535, -1773285, }, - { -84051976, -10931766, -20318954, }, - { 193888240, 11763915, -7717520, }, - }, - { - { 115933512, 54171348, -20616916, }, - { 1061163456, 129533528, -23348516, }, - { 550549824, -101550208, -32472638, }, - { 45247480, -22406844, 44503916, }, - { 375784928, -266288, 15702937, }, - { -17834314, -101530880, -31956704, }, - { 652130624, -41226856, 1646046, }, - { 8262444, 212076896, 22017076, }, - { 872475392, 27085674, -3548180, }, - { 293410688, -7770670, -11642046, }, - { 921522816, 53132504, -10414222, }, - { 94559608, 61743376, 34906272, }, - { 410655776, -33762736, -339302, }, - { -169639392, -46001784, 9142912, }, - { 215555280, -39306468, 7264401, }, - }, - { - { -121721520, -43738336, -8097624, }, - { 933114368, 22093848, -32720672, }, - { 494997664, 19759534, 23136452, }, - { 75576392, -114045880, 3667365, }, - { 444172096, -36144296, -12401718, }, - { 14139032, 87575992, 32541356, }, - { 733825792, -1081258, 2262374, }, - { -19392852, 7123204, -55031952, }, - { 939120896, 32734094, -12346420, }, - { 337437312, 5166309, -13647259, }, - { 852432896, -9301289, -18699750, }, - { 25549150, -84922776, 491237, }, - { 472952672, 23739894, 11385958, }, - { -152883648, -14016626, 17564806, }, - { 268112256, -3453154, 10877542, }, - }, - { - { -269692256, 7937100, -2384781, }, - { 808061568, 12100533, -4268661, }, - { 423107424, 58875412, 14115947, }, - { 38092064, 6757594, -32236950, }, - { 507483136, -62690416, -14868640, }, - { 18486612, 77123120, 34720516, }, - { 786537344, -938987, -7950522, }, - { 1819992, -147699632, 6068252, }, - { 974787392, -12577812, 1095217, }, - { 289339072, -1104880, -3964792, }, - { 789703808, -11702712, -6681896, }, - { -67787472, 68001680, -30844308, }, - { 519936384, 28106802, 3049427, }, - { -55746528, 10052908, -11537356, }, - { 320355168, 12771085, -5028870, }, - }, - { - { -264577504, 33274186, 2607582, }, - { 710308672, -16774532, -5884105, }, - { 337924256, -31025770, -6185827, }, - { -10758893, 44742820, -5711233, }, - { 532032096, 22328462, 13090523, }, - { -10329396, -93899256, -23986856, }, - { 795033344, 9193914, -5691369, }, - { 13652090, -58238144, 38045896, }, - { 953060224, -46311020, -9642738, }, - { 153929488, -34870840, 5812165, }, - { 745974592, 75162, 3201898, }, - { -79250736, 42124504, -40099424, }, - { 552490112, -8643085, -15971373, }, - { 79966920, 67082556, -16285442, }, - { 359595072, 18285286, -9487583, }, - }, - { - { -141451520, -45782204, 6092411, }, - { 634855232, -24634858, 3785477, }, - { 254404336, 7821136, -4571456, }, - { -45016088, -10459319, 21311628, }, - { 477775936, 54230404, 9673877, }, - { -18442052, -56763900, -35335768, }, - { 744544960, 14347875, 413927, }, - { -5615670, 84819160, -16463683, }, - { 872367424, 952409, -17485886, }, - { -37825776, 60159608, 3164854, }, - { 706909760, 23321672, -1428077, }, - { 5742372, -135769280, 3150359, }, - { 584314176, -42927660, -8116415, }, - { 172647488, -49075908, 8621610, }, - { 369367712, -11576011, -375810, }, - }, - { - { 15072651, 50944216, 13710072, }, - { 538955072, -13040594, 24205362, }, - { 187226752, -5189394, 2030446, }, - { -50834696, -49825380, 8231305, }, - { 367362496, -49736796, -9050570, }, - { 5716602, 87666192, 13341242, }, - { 638520448, -28745680, 1804423, }, - { -9424232, 56697328, -25742424, }, - { 736861248, 15118285, 10206453, }, - { -219684352, -36769752, -482110, }, - { 649502144, -17821430, -9939091, }, - { 81932408, 45398880, 53095460, }, - { 598292672, 6328635, 7124277, }, - { 149414400, -23850490, 21712134, }, - { 334426016, -10021232, 5326833, }, - }, - { - { 125673968, 17753784, 9321690, }, - { 397379488, 104956656, 5082557, }, - { 149467008, 2914135, 4262755, }, - { -20718922, 27423366, -28011776, }, - { 257603008, 8898098, -11051488, }, - { 20265266, 5883569, 42024644, }, - { 506127552, 32068374, 2290828, }, - { 7227893, -67430448, 20556250, }, - { 544590016, 78309064, 19809462, }, - { -321714528, 9211631, 1069984, }, - { 556742656, -2592550, -1637993, }, - { 52476984, 129614056, 30575336, }, - { 567954112, 30062086, 1427540, }, - { 18473192, 89390080, 6312528, }, - { 260188048, 30055108, 3881577, }, - }, - { - { 162220384, -35226784, -14843944, }, - { 258143104, -34475704, -23410792, }, - { 143663440, 850404, 3514357, }, - { 39367672, 96164856, -16363289, }, - { 196611248, 29874718, 7045894, }, - { -3548180, -142337904, -8863739, }, - { 391071808, -25950730, 772557, }, - { 7097434, -70594232, 19371376, }, - { 343604896, -82419352, -5340792, }, - { -306525920, 20317880, 2103997, }, - { 416423392, -35428112, 9055402, }, - { -42094436, -123787936, -41830296, }, - { 494898880, -19892678, -4767951, }, - { -125548336, -57329760, -18460306, }, - { 171719776, -38439956, -6002754, }, - }, - { - { 149700544, -15543487, -19137300, }, - { 186234608, -56275344, -2545842, }, - { 165364288, -8795019, 3685619, }, - { 74812960, -56720412, 33527588, }, - { 207906480, -11742977, 21865142, }, - { -22778896, -28792388, -50524920, }, - { 342108096, -9793599, 3819837, }, - { -10169946, 55358908, -28482612, }, - { 224280512, -4655745, -12516608, }, - { -185469568, -39997420, 2193118, }, - { 240936384, 58211304, 3536906, }, - { -74164424, -86611776, -47780436, }, - { 395104256, 23114440, -3353296, }, - { -173409840, -28682866, -19873350, }, - { 105167104, -6638409, -7066295, }, - }, - { - { 105323872, 22173842, 1312113, }, - { 179931744, 12965433, 22897544, }, - { 207433504, 2630131, 1804423, }, - { 30630634, -85687280, 33305860, }, - { 303123744, -13679471, 8104604, }, - { 6169721, 159945648, 18145700, }, - { 392402720, 24051816, 9910100, }, - { -2450279, 113075216, -6314676, }, - { 236913616, 52297132, 6293201, }, - { -14849313, 42407432, 1881733, }, - { 74994424, -41807748, -5413270, }, - { -10800769, 124163744, 16718697, }, - { 288295936, -18919330, -2345052, }, - { -94409288, 83413632, 5292474, }, - { 77771656, 19129784, 6313065, }, - }, - { - { 28367722, 11352135, 17681306, }, - { 207316464, 32352914, 8996346, }, - { 260098928, -1567663, -5674726, }, - { -55946780, 123041688, -25584584, }, - { 493192160, -18697604, -19944218, }, - { 20092930, 83791056, 44481364, }, - { 544934720, -18092012, 1531693, }, - { 11063836, 15476378, 30881352, }, - { 367152064, -42682312, 18682570, }, - { 133796288, -29187524, 2644626, }, - { -38214472, 3738769, -4303021, }, - { 52898964, 14692009, 39791260, }, - { 197532528, -1098438, 5455146, }, - { 39827768, -23616414, 17642652, }, - { 79354888, 1855963, 11523934, }, - }, - { - { -69984344, -64994668, 7815230, }, - { 255391104, -3300682, -12565464, }, - { 309282752, 20043538, -7486665, }, - { -81857248, 52066816, -46926276, }, - { 754250496, 88805968, -26157962, }, - { -7791071, -102232032, -24181202, }, - { 773598784, 38256884, -16646756, }, - { -3101503, -88045216, -9091372, }, - { 563862080, 4434554, 3325915, }, - { 207639120, -3164317, 795643, }, - { -87747256, 15495168, 6041945, }, - { 46018964, -69473240, 9407052, }, - { 138111120, -15164993, 10856067, }, - { 130414000, -16855600, 1413581, }, - { 103952704, -7817378, 4638565, }, - }, - { - { -153698624, 52211768, -22286586, }, - { 314552672, -41536092, -8077223, }, - { 332848704, -26689464, 4923107, }, - { -13014288, -137779872, 9877351, }, - { 993195648, -101502424, -251792, }, - { -14167486, -78821240, -29317446, }, - { 1013642368, -73787000, -18562312, }, - { -8565239, -48564804, -23686208, }, - { 768001344, -13456669, -25697326, }, - { 197247984, 20113332, -4068945, }, - { -99047848, 2668785, 10101763, }, - { -9654550, 48223892, -18820546, }, - { 126544232, 16342887, 2228014, }, - { 130527280, 6726993, -6411313, }, - { 158825200, -2674154, -4586488, }, - }, - { - { -173407152, 80022760, -10335839, }, - { 357153376, 23606214, 8338142, }, - { 311526848, -16561931, 13072807, }, - { 60987460, -6754373, 41550588, }, - { 1076533504, -11509975, 15732465, }, - { 5602785, 54272280, 18927920, }, - { 1159097344, 47392816, -2072859, }, - { 6779606, 63433444, 19216220, }, - { 918634432, 72778760, -22099754, }, - { 133954128, -19498078, -5927592, }, - { -104071352, -11424076, 4241280, }, - { -46579456, 18314278, -20225000, }, - { 182078704, 12781823, -7573101, }, - { 50426136, -12663711, 3757560, }, - { 249549952, 27696634, -7901666, }, - }, - { - { -125086088, -64300492, 37410240, }, - { 354743360, 22876606, 8448201, }, - { 263105408, 37308772, 4003983, }, - { 59869696, 90144920, 3503083, }, - { 935057856, 98520104, -1078037, }, - { 9542880, 47780436, 17816598, }, - { 1110528256, 38748660, 6838125, }, - { 4467303, 80529024, 12106976, }, - { 936150912, -29707216, 10800769, }, - { 60918204, 12298639, -4695473, }, - { -115432080, 2697776, 1560684, }, - { -27349278, -44630616, -2356327, }, - { 298056224, -43240656, -7306813, }, - { -58851788, 43766252, 4701916, }, - { 360583456, -39258684, -2423972, }, - }, - { - { -43643848, -73751568, 23637890, }, - { 311553696, -29218662, -2420751, }, - { 249098976, -7734699, -6087043, }, - { 5525476, -15845208, -22711788, }, - { 627708416, -90942712, -14872935, }, - { -1866700, -29127394, -9088151, }, - { 851950272, -100369088, 317828, }, - { -7909719, -9968619, -22215718, }, - { 758959936, -100101728, 13643500, }, - { 6927246, -2215666, -2097018, }, - { -129383744, -5531381, 2185602, }, - { 18997714, 28491202, 12160663, }, - { 428251712, 44209172, 894964, }, - { -125575184, -25443386, -8341900, }, - { 449487648, 13390634, 525060, }, - }, - { - { 70837968, 58482960, -45040248, }, - { 261459888, 8723615, -6206228, }, - { 325033472, -26867168, -9676561, }, - { -40947680, -31508954, -4011500, }, - { 283930080, 67042292, -12214887, }, - { -7194607, -11471858, -12919262, }, - { 471827392, 110132624, -9797894, }, - { -559956, -64124936, -1170916, }, - { 422992000, 129837400, -14223321, }, - { -25354802, -2267743, 1309428, }, - { -133630928, 3575024, -60666, }, - { 39726300, 7045894, 15430207, }, - { 506878624, -6169184, 4694936, }, - { -102008696, -30327300, -11685532, }, - { 474422624, 6671158, -2348273, }, - }, - { - { 217952944, 121817624, -52187072, }, - { 240484880, 14042396, -132607, }, - { 494514496, 60224568, -7513509, }, - { -48454212, -5237176, 7024419, }, - { 20397336, -24781962, -4145180, }, - { -1296543, 28807420, 542777, }, - { 108569792, -68455336, -13811004, }, - { 7339562, -6582038, 20469814, }, - { 50323596, -54717348, -17939542, }, - { -52311628, -2201708, 4130685, }, - { -115864792, 11620034, -204548, }, - { 14101451, -45034880, 3508452, }, - { 491351776, -30665530, -1449552, }, - { -7735773, 56921200, 1196685, }, - { 420662528, -21121576, -2969433, }, - }, - { - { 302108544, -145636432, 25764972, }, - { 270012256, -23244364, 9095667, }, - { 695182848, -53615688, -2393908, }, - { -17125108, 6622840, -6611029, }, - { -111943488, -11172821, 7976291, }, - { 6505802, -8606578, 12640626, }, - { -130551976, 1461900, -3079492, }, - { -2710661, 67228048, -7895224, }, - { -250304256, 20928302, 3484292, }, - { -89183920, 11238319, 4881767, }, - { -75185016, -18063558, 3986804, }, - { -25879862, 31284004, -15047955, }, - { 386935200, 44014288, -10276783, }, - { 83388400, -25720412, 13156559, }, - { 302272832, 38888780, -4435091, }, - }, - { - { 186142272, -78747152, 69059320, }, - { 357181280, 13597866, 10020159, }, - { 826062336, 10807748, -4036733, }, - { 30802432, 40938556, -4883915, }, - { -136869872, 11004243, 16057272, }, - { 2662343, -36271000, 3084860, }, - { -225224320, 22747758, 14950781, }, - { -5504001, 47386376, -15182709, }, - { -434281856, -19651086, 14351096, }, - { -132748848, -15060303, 3321620, }, - { -19873888, 9534291, 5590437, }, - { -32341104, 26803818, -15712064, }, - { 232506976, -29129542, -11449846, }, - { 104971688, -25116432, 9660992, }, - { 154529696, -33919504, -7061463, }, - }, - { - { -114229488, 228196448, 14908368, }, - { 504227008, -10380936, -2932926, }, - { 808694016, 22711788, -7024956, }, - { 52182780, -21744882, 14767171, }, - { -107239424, 5180805, 11981348, }, - { -5783711, 8522826, -12138651, }, - { -224969856, -5100811, 21272974, }, - { 5198521, -30551176, 14821932, }, - { -503597248, 4022774, 13465796, }, - { -158316784, 4875325, 1993939, }, - { 44385804, -1563368, 157303, }, - { -302258, -49360448, 4401805, }, - { 67911488, 13307956, -1172526, }, - { 51097224, 43914968, -3702799, }, - { 13918378, 13386339, -2522220, }, - }, - { - { -376732512, -105936976, -52158084, }, - { 701803008, 31803160, -19734838, }, - { 622177024, -62460100, -6384469, }, - { 20867636, -43538084, 14351096, }, - { -59612000, -13386876, -1971927, }, - { -2908230, 31246960, -3704946, }, - { -186044032, -19776714, 9260486, }, - { 2085744, -53198000, 5521718, }, - { -485769920, 526134, 8494372, }, - { -134485088, 9373229, 1622961, }, - { 117180664, 9884330, -6997039, }, - { 28893318, 8454106, 18998250, }, - { -86978456, -23970750, 8986145, }, - { -27663884, -22535156, -12045236, }, - { -101843336, -9178345, 6937983, }, - }, - { - { -372928800, -118043416, -44813688, }, - { 904283328, -64888364, -21122112, }, - { 301261344, 95022392, -11047193, }, - { -33595772, 58286464, -11398306, }, - { -6813966, -10190884, -11519102, }, - { 4401268, -8411157, 9586904, }, - { -133000104, 10397042, -9189083, }, - { -5110474, -309238, -14335527, }, - { -414447712, -6669011, -659278, }, - { -45639932, -19439022, -1628866, }, - { 192929392, -26497264, -6411850, }, - { 20511154, 46442556, 7100118, }, - { -223085440, 39593692, 6857989, }, - { -72546832, -16858820, -6147709, }, - { -191062688, 25187836, 7979513, }, - }, - { - { -97977864, 172937392, 5498095, }, - { 1020359680, 49040472, -3064996, }, - { -83678848, -74016784, -12161737, }, - { -51643760, 16670916, -23394150, }, - { 36763848, 26569204, -6542309, }, - { 3170760, -21297132, 4604205, }, - { -73004784, 22681186, -14823006, }, - { 271657, 39352100, 1069984, }, - { -324642624, 17212082, -8062728, }, - { 91595544, 28620588, -8014409, }, - { 250592544, 19866908, 323733, }, - { -10849624, -29150480, -13490492, }, - { -325997696, -26555782, -1130113, }, - { -62478888, 26125212, 6773164, }, - { -250334320, -19998978, 541703, }, - }, - { - { 230774496, -94694368, 33468532, }, - { 950758144, 45088028, 7181722, }, - { -466968160, 41601052, 4842039, }, - { -12726525, -71256728, 816044, }, - { 38146824, -9856413, 4327717, }, - { -3117073, 13539348, -7080791, }, - { -34454764, -30524332, -4786741, }, - { 4219806, 10428181, 11727945, }, - { -263279888, -25294674, -5777805, }, - { 224959120, -37230388, -9239548, }, - { 262986752, 8453033, 1917703, }, - { -24196772, -24077586, -11637214, }, - { -382932832, -1334124, -1830193, }, - { -19270982, -700617, 7786239, }, - { -273468608, -2460480, -2448131, }, - }, - { - { 372294208, -19914690, 33813740, }, - { 662759616, -123762704, -7464117, }, - { -810661120, -51490752, 24456618, }, - { 35114580, 11368242, 20448340, }, - { -34016676, -30839476, 7538205, }, - { -3339874, 17280800, -5366562, }, - { -70069704, -1327145, 8199093, }, - { -1795296, -34127272, -5259188, }, - { -282629248, 8960376, 7567196, }, - { 282418784, 23540716, 503048, }, - { 219165200, -27831388, -4094178, }, - { -8269960, 26900454, 3402688, }, - { -400790240, 10691784, 3843459, }, - { 25067576, -6487011, -2902324, }, - { -267513104, 12243878, 891743, }, - }, - { - { 242817056, 136962208, 7746511, }, - { 221894656, 116763520, -22308598, }, - { -1080360960, 71046816, 23397908, }, - { 40003864, 38815232, 8348343, }, - { -178594944, 59281288, -1345399, }, - { 2113124, -13751948, 5187247, }, - { -215943984, 54989540, 10739029, }, - { -3170760, -24517820, -8753680, }, - { -410339552, 47098076, 15241765, }, - { 210557552, 27944668, 10531797, }, - { 131049656, 24807732, -8782671, }, - { 13361643, -3181497, 8449811, }, - { -405466400, -171799, 6650220, }, - { 50663436, -10238665, -5988795, }, - { -255399696, -5711770, 3862786, }, - }, - { - { -31068720, -130587944, -33651604, }, - { -262315664, -71206264, -12941273, }, - { -1221106432, -40506372, 7044820, }, - { 5936719, -27122718, -7492034, }, - { -352367712, -35716948, -6782827, }, - { 3185792, -11842835, 5377299, }, - { -448329088, -80601504, 1251983, }, - { 3089692, 21311628, 8769786, }, - { -610926336, -79132624, 5086315, }, - { 21592948, -75939320, 6671695, }, - { 18001282, -15389405, -5661841, }, - { 17416630, -10782515, 4671851, }, - { -422662912, -11905649, 4202626, }, - { 46805480, 9417253, 2310156, }, - { -262331776, -7301445, 3401077, }, - }, - { - { -226603008, -18327162, -38191388, }, - { -707435904, 51271172, 11145977, }, - { -1183006336, -31270046, -1832877, }, - { -28250684, 2456721, -9917616, }, - { -500287456, 8203388, 2072859, }, - { -1089848, 12928925, -2975339, }, - { -683104320, 48995376, -4758287, }, - { 1455994, 33645164, 3847754, }, - { -786317248, 39530880, -5663988, }, - { -192634112, 63155348, -4294431, }, - { -111193480, 20921322, 501437, }, - { 2214593, 16510391, -981400, }, - { -461840512, 15453292, 817654, }, - { 13194140, 15024869, 6694244, }, - { -300300896, 16017544, 1114544, }, - }, - { - { -224664912, 108171432, 4175782, }, - { -1078223616, -68621232, 23726474, }, - { -973332992, 83570936, 3840775, }, - { -30763776, 19509352, -3448859, }, - { -591696192, -11749957, 9123047, }, - { -3073049, 4521527, -5551782, }, - { -830735232, -6813429, 331786, }, - { -3465502, -2225867, -9803263, }, - { -840708736, 18293340, -2704756, }, - { -311184352, -5189394, -6243809, }, - { -260984768, -36910412, 1418950, }, - { -14047227, -9365176, -6448894, }, - { -515333248, -12192875, -68719, }, - { -30389042, -25724706, 301185, }, - { -362049088, -16235513, 537, }, - }, - { - { -85414552, -51876764, 32028108, }, - { -1362811904, 77688440, 13334263, }, - { -671621760, -84929760, 12796318, }, - { -3631395, -17330730, 3491809, }, - { -624009344, 13232257, 3234110, }, - { 216896, -15168214, 1034550, }, - { -855872064, -12947179, 4281546, }, - { 352724, -30451318, 1169305, }, - { -747763456, -48717276, 4341138, }, - { -265382800, -39658116, -1537061, }, - { -439059488, 42351060, -1467805, }, - { -12868259, -11892764, -6317897, }, - { -567934784, 5772973, 1864553, }, - { -51245404, 6357626, -6984691, }, - { -427521056, 10568304, 1278290, }, - }, - { - { 57335128, -21424908, 14519674, }, - { -1546537216, -24615532, 2499134, }, - { -387294912, 44589276, 12475806, }, - { 22578106, 1583232, 3779034, }, - { -614494912, 9084930, -2698850, }, - { 3117073, 118112, 6264747, }, - { -790453312, 28467044, 3361349, }, - { 2966749, -11570642, 8281234, }, - { -561839168, 52027624, 6072010, }, - { -83245592, 55242408, -1686848, }, - { -644597312, -28553480, 3214783, }, - { 3478387, 23061826, 2260227, }, - { -603926656, 3766150, 6805376, }, - { -31689880, 19377282, -6148246, }, - { -473488992, -205085, 5046587, }, - }, - { - { 120469000, 22543210, -11138461, }, - { -1607233664, -59374164, 24469502, }, - { -194259760, -6671695, 2132988, }, - { 24184424, -1061394, 4543539, }, - { -591490560, -34621196, 7472170, }, - { 248571, 18603650, -70867, }, - { -702711936, -44425532, 11446625, }, - { -1819456, 23494544, -5267778, }, - { -377655392, -42054172, 6758131, }, - { 128841504, -56617868, -2202245, }, - { -852840896, 11351062, 22712324, }, - { 14465987, -4428648, 10028749, }, - { -604490880, -11200201, 13851806, }, - { 11824582, -26652956, 1130113, }, - { -478025024, -8836358, 10008348, }, - }, - { - { 99128920, 3651796, -10679973, }, - { -1516199168, 58139900, 60329796, }, - { -95059440, -290984, -6617471, }, - { 3212636, -14644765, 6335077, }, - { -570893504, 23903640, 28049358, }, - { -3208341, -1371168, -7168838, }, - { -640622272, 31571768, 31884226, }, - { -1759863, 24443732, -4776004, }, - { -266206912, 23772644, 13987635, }, - { 247099664, 32651416, 7637526, }, - { -995970176, -21615496, 41095320, }, - { 6749004, -25076704, 4926328, }, - { -542421632, 7269232, 14501957, }, - { 41754600, 11839077, 8631811, }, - { -421268096, 9819369, 10045929, }, - }, - { - { 31780610, 2109366, 4351876, }, - { -1227817856, 31887448, 36262944, }, - { -41796476, -6394670, -8111583, }, - { -21230560, 42835856, -9363566, }, - { -526691296, 30912490, 26707180, }, - { -296353, -21707302, -4295, }, - { -582211840, 34218004, 32887102, }, - { 2781528, -8465917, 8039642, }, - { -226947680, 16712255, 18204756, }, - { 205733232, 29428580, 19158776, }, - { -966141632, 51030652, 20940114, }, - { -9344238, 25553444, -10163503, }, - { -389149280, -6488085, -1595044, }, - { 33305324, 17487496, 9344238, }, - { -290937312, -11132555, -1483911, }, - }, - { - { -34587372, -31123480, 4677757, }, - { -702422016, -12524662, -63307816, }, - { 13409962, 10168335, -9574019, }, - { -22231288, 18446348, -21504902, }, - { -395849408, -55143620, -19904490, }, - { 3506841, 831613, 8366060, }, - { -443376992, -79262008, -21980568, }, - { -288837, -30697206, -807991, }, - { -192801616, -61860412, -7623030, }, - { 45564236, -99012952, 7204808, }, - { -676510528, -4662724, -44772348, }, - { -11819750, 21961778, -11959873, }, - { -144633568, 41230076, -25599616, }, - { -3271691, -40654548, -3177202, }, - { -98791224, 36429376, -16961362, }, - }, - { - { -62903556, 22214108, -11652783, }, - { -2837900, -263309408, -104393472, }, - { 83321288, -27225260, -9924059, }, - { 8424041, -95043328, 15469935, }, - { -140510384, -68141264, -63327684, }, - { -774705, 31915902, -3386582, }, - { -159801776, -62714576, -81861536, }, - { -2260227, -16823386, -6184753, }, - { -88226680, 2919504, -50476604, }, - { -109439528, 88497264, -31301184, }, - { -164298608, -202133504, -72149544, }, - { 3622805, -46176268, 10753524, }, - { 129524936, -112725712, -21399674, }, - { -31066036, 12406013, -17940078, }, - { 102797360, -79412872, -12246026, }, - }, - { - { -39567924, 46573552, -9427453, }, - { 621364224, 460767840, 43075300, }, - { 141969600, 41977936, 2921115, }, - { 22793392, -57216480, 28717226, }, - { 173183280, 253221616, -8589398, }, - { -2685428, 21849036, -7056632, }, - { 208237728, 318084736, -17783848, }, - { 2145336, 14760192, 6643778, }, - { 94066224, 175970720, -26878980, }, - { -143160928, 64352032, -39194796, }, - { 354849664, 357099680, 32628330, }, - { 10445897, -34724272, 13976360, }, - { 317177952, 112315008, 26720066, }, - { -21392158, 55930676, -4970888, }, - { 230905488, 66931696, 18525804, }, - }, - { - { 8250096, -53528716, 19508816, }, - { 821677696, 19742890, 188074464, }, - { 149194272, -2103460, 19142132, }, - { -2042257, 85702848, -23702314, }, - { 366368768, -121583544, 100727720, }, - { 2202245, -13095355, 6751689, }, - { 447949504, -178254032, 129330056, }, - { -533650, 32718524, -1122597, }, - { 249170912, -161775312, 71844600, }, - { -50550692, -170051712, 27342298, }, - { 576970880, -17979806, 144182048, }, - { -1150514, 37701760, -12638478, }, - { 317480224, 68158448, 50017040, }, - { 7964480, -27748710, 20958366, }, - { 223188512, 53187800, 29809758, }, - }, - { - { 25666188, -61740156, 13222057, }, - { 468054272, -778914880, -37406480, }, - { 90884192, -81121728, 2451353, }, - { -7944079, 107862200, -10186052, }, - { 283284224, -362074880, 32602560, }, - { 53150, -31307628, -1322850, }, - { 350218624, -463973504, 48184700, }, - { -569083, 32280438, -673236, }, - { 226416176, -237868704, 52872120, }, - { 40658308, -44644036, 57304528, }, - { 362591328, -576002368, -16647293, }, - { -3433826, 53061100, -4096862, }, - { 145049104, -242396672, -31521302, }, - { 13876502, -64969972, 4359929, }, - { 100901128, -152861648, -22567906, }, - }, + {5125, 2612, 121}, + {9537, -585, 380}, + {8200, 371, 557}, + {2484, 4450, 1221}, + {9322, -1265, -503}, + {699, 7231, 1680}, + {10266, -1682, -534}, + {477, 7724, 1403}, + {10750, -1807, -743}, + {5574, 2964, 406}, + {8474, 966, 428}, + {2050, 5714, 1747}, + {9402, -707, 104}, + {4108, 2982, 608}, + {8921, -754, -5} + }, + { + {2349, -2065, -1256}, + {9393, -1267, 353}, + {7773, -937, 423}, + {-497, -2964, -965}, + {10347, 2044, 509}, + {-861, -3193, -2227}, + {11063, 1767, 600}, + {-773, -1346, -2180}, + {11262, 1422, 402}, + {3593, -164, -487}, + {8526, -1704, -680}, + {-840, -3724, -1116}, + {9557, -1220, -97}, + {811, -1404, -354}, + {8989, -444, 137} + }, + { + {-725, -3444, 15}, + {9364, 2902, -1332}, + {7631, 1013, -278}, + {-2452, -1144, -1007}, + {10799, 821, 842}, + {-381, -6671, -818}, + {11117, 1779, 500}, + {92, -7502, 243}, + {11088, 2341, 35}, + {1045, -128, -8}, + {9450, -3476, -114}, + {-2278, -1050, -1629}, + {9798, 240, -757}, + {-2664, 272, -131}, + {8897, 884, -404} + }, + { + {-3762, -3857, 394}, + {10861, 4191, -1252}, + {8685, 2546, -143}, + {-1840, 691, -513}, + {9763, -1399, 168}, + {695, 398, 1722}, + {10087, -943, -394}, + {607, -3728, 1694}, + {10522, 93, -698}, + {-1815, -690, 248}, + {10458, -965, 718}, + {-775, 4080, -147}, + {10493, 2044, -170}, + {-4102, -288, -108}, + {9085, 1484, -202} + }, + { + {-5544, -735, -590}, + {13154, -3003, 1164}, + {10391, -1008, 951}, + {643, -3432, 365}, + {7892, 598, -211}, + {258, 3668, 437}, + {8827, -163, -406}, + {-486, 4155, -1377}, + {10314, -1168, -111}, + {-4202, 297, 290}, + {10592, 1196, -244}, + {1589, -1623, 1353}, + {10673, 342, 443}, + {-2550, -1466, -59}, + {9069, 399, 209} + }, + { + {-4250, 1187, 104}, + {13638, -3481, 963}, + {10993, -3894, -209}, + {2383, -353, 1189}, + {6103, 92, -107}, + {-486, -981, -1153}, + {7815, 163, -91}, + {-226, 5997, -617}, + {10179, 418, 519}, + {-5440, -583, 180}, + {11024, 1694, 8}, + {1767, -2621, 941}, + {9552, -1260, -10}, + {688, 1099, 231}, + {8190, -542, -52} + }, + { + {-1125, 629, -313}, + {12954, 2813, -1207}, + {11202, -1601, -1164}, + {1271, 3372, 18}, + {5007, -797, 397}, + {-263, -2837, -450}, + {7306, -74, 57}, + {567, 212, 1613}, + {9881, 1329, 215}, + {-5100, -241, -14}, + {11698, 1341, 80}, + {-245, 2880, -590}, + {7817, 228, -227}, + {3096, -334, 277}, + {6730, 161, -48} + }, + { + {2792, 2546, -391}, + {13738, 3091, -1171}, + {11814, 2806, 483}, + {-895, -459, -865}, + {4384, -1136, 348}, + {381, 1049, 881}, + {7350, 127, 133}, + {-144, -4920, -421}, + {9830, -301, -410}, + {-3145, 699, -18}, + {12635, 617, -454}, + {-1749, 349, -1145}, + {6290, -19, -20}, + {3191, -764, 150}, + {5035, -318, 93} + }, + { + {5593, -1332, 625}, + {15977, -2970, 667}, + {11332, 2123, 806}, + {-1750, -831, -510}, + {4160, 247, -180}, + {261, 2183, 440}, + {7795, 335, -8}, + {-378, -3148, -1060}, + {10673, -1402, -92}, + {-226, -1091, 150}, + {14027, -1592, 159}, + {-974, -2773, -164}, + {5475, 83, 67}, + {1183, 1346, -211}, + {3590, 654, -26} + }, + { + {5005, -2424, 291}, + {17151, -1613, 849}, + {9693, -2085, -571}, + {-829, 1826, 199}, + {4711, 951, 29}, + {-292, -1101, -678}, + {8666, 356, -146}, + {316, 1906, 900}, + {12053, 206, 289}, + {2581, 22, 91}, + {14637, -767, 345}, + {834, 917, 733}, + {5534, -50, -27}, + {-1283, -167, -310}, + {2958, 180, -118} + }, + { + {1769, 827, -315}, + {16192, 1977, -356}, + {8401, -1550, -495}, + {690, -342, 679}, + {5734, -4, 240}, + {-272, -1549, -488}, + {9951, -629, 25}, + {126, 3236, 336}, + {13313, 413, -54}, + {4477, -119, -178}, + {14061, 811, -159}, + {1443, 942, 533}, + {6266, -515, -5}, + {-2588, -702, 140}, + {3289, -600, 111} + }, + { + {-1857, -667, -124}, + {14238, 337, -499}, + {7553, 302, 353}, + {1153, -1740, 56}, + {6778, -552, -189}, + {216, 1336, 497}, + {11197, -16, 35}, + {-296, 109, -840}, + {14330, 499, -188}, + {5149, 79, -208}, + {13007, -142, -285}, + {390, -1296, 7}, + {7217, 362, 174}, + {-2333, -214, 268}, + {4091, -53, 166} + }, + { + {-4115, 121, -36}, + {12330, 185, -65}, + {6456, 898, 215}, + {581, 103, -492}, + {7744, -957, -227}, + {282, 1177, 530}, + {12002, -14, -121}, + {28, -2254, 93}, + {14874, -192, 17}, + {4415, -17, -60}, + {12050, -179, -102}, + {-1034, 1038, -471}, + {7934, 429, 47}, + {-851, 153, -176}, + {4888, 195, -77} + }, + { + {-4037, 508, 40}, + {10838, -256, -90}, + {5156, -473, -94}, + {-164, 683, -87}, + {8118, 341, 200}, + {-158, -1433, -366}, + {12131, 140, -87}, + {208, -889, 581}, + {14543, -707, -147}, + {2349, -532, 89}, + {11383, 1, 49}, + {-1209, 643, -612}, + {8430, -132, -244}, + {1220, 1024, -248}, + {5487, 279, -145} + }, + { + {-2158, -699, 93}, + {9687, -376, 58}, + {3882, 119, -70}, + {-687, -160, 325}, + {7290, 827, 148}, + {-281, -866, -539}, + {11361, 219, 6}, + {-86, 1294, -251}, + {13311, 15, -267}, + {-577, 918, 48}, + {10787, 356, -22}, + {88, -2072, 48}, + {8916, -655, -124}, + {2634, -749, 132}, + {5636, -177, -6} + }, + { + {230, 777, 209}, + {8224, -199, 369}, + {2857, -79, 31}, + {-776, -760, 126}, + {5606, -759, -138}, + {87, 1338, 204}, + {9743, -439, 28}, + {-144, 865, -393}, + {11244, 231, 156}, + {-3352, -561, -7}, + {9911, -272, -152}, + {1250, 693, 810}, + {9129, 97, 109}, + {2280, -364, 331}, + {5103, -153, 81} + }, + { + {1918, 271, 142}, + {6064, 1602, 78}, + {2281, 44, 65}, + {-316, 418, -427}, + {3931, 136, -169}, + {309, 90, 641}, + {7723, 489, 35}, + {110, -1029, 314}, + {8310, 1195, 302}, + {-4909, 141, 16}, + {8495, -40, -25}, + {801, 1978, 467}, + {8666, 459, 22}, + {282, 1364, 96}, + {3970, 459, 59} + }, + { + {2475, -538, -227}, + {3939, -526, -357}, + {2192, 13, 54}, + {601, 1467, -250}, + {3000, 456, 108}, + {-54, -2172, -135}, + {5967, -396, 12}, + {108, -1077, 296}, + {5243, -1258, -81}, + {-4677, 310, 32}, + {6354, -541, 138}, + {-642, -1889, -638}, + {7552, -304, -73}, + {-1916, -875, -282}, + {2620, -587, -92} + }, + { + {2284, -237, -292}, + {2842, -859, -39}, + {2523, -134, 56}, + {1142, -865, 512}, + {3172, -179, 334}, + {-348, -439, -771}, + {5220, -149, 58}, + {-155, 845, -435}, + {3422, -71, -191}, + {-2830, -610, 33}, + {3676, 888, 54}, + {-1132, -1322, -729}, + {6029, 353, -51}, + {-2646, -438, -303}, + {1605, -101, -108} + }, + { + {1607, 338, 20}, + {2746, 198, 349}, + {3165, 40, 28}, + {467, -1307, 508}, + {4625, -209, 124}, + {94, 2441, 277}, + {5988, 367, 151}, + {-37, 1725, -96}, + {3615, 798, 96}, + {-227, 647, 29}, + {1144, -638, -83}, + {-165, 1895, 255}, + {4399, -289, -36}, + {-1441, 1273, 81}, + {1187, 292, 96} + }, + { + {433, 173, 270}, + {3163, 494, 137}, + {3969, -24, -87}, + {-854, 1877, -390}, + {7526, -285, -304}, + {307, 1279, 679}, + {8315, -276, 23}, + {169, 236, 471}, + {5602, -651, 285}, + {2042, -445, 40}, + {-583, 57, -66}, + {807, 224, 607}, + {3014, -17, 83}, + {608, -360, 269}, + {1211, 28, 176} + }, + { + {-1068, -992, 119}, + {3897, -50, -192}, + {4719, 306, -114}, + {-1249, 794, -716}, + {11509, 1355, -399}, + {-119, -1560, -369}, + {11804, 584, -254}, + {-47, -1343, -139}, + {8604, 68, 51}, + {3168, -48, 12}, + {-1339, 236, 92}, + {702, -1060, 144}, + {2107, -231, 166}, + {1990, -257, 22}, + {1586, -119, 71} + }, + { + {-2345, 797, -340}, + {4800, -634, -123}, + {5079, -407, 75}, + {-199, -2102, 151}, + {15155, -1549, -4}, + {-216, -1203, -447}, + {15467, -1126, -283}, + {-131, -741, -361}, + {11719, -205, -392}, + {3010, 307, -62}, + {-1511, 41, 154}, + {-147, 736, -287}, + {1931, 249, 34}, + {1992, 103, -98}, + {2423, -41, -70} + }, + { + {-2646, 1221, -158}, + {5450, 360, 127}, + {4754, -253, 199}, + {931, -103, 634}, + {16427, -176, 240}, + {85, 828, 289}, + {17686, 723, -32}, + {103, 968, 293}, + {14017, 1111, -337}, + {2044, -298, -90}, + {-1588, -174, 65}, + {-711, 279, -309}, + {2778, 195, -116}, + {769, -193, 57}, + {3808, 423, -121} + }, + { + {-1909, -981, 571}, + {5413, 349, 129}, + {4015, 569, 61}, + {914, 1376, 53}, + {14268, 1503, -16}, + {146, 729, 272}, + {16945, 591, 104}, + {68, 1229, 185}, + {14285, -453, 165}, + {930, 188, -72}, + {-1761, 41, 24}, + {-417, -681, -36}, + {4548, -660, -111}, + {-898, 668, 72}, + {5502, -599, -37} + }, + { + {-666, -1125, 361}, + {4754, -446, -37}, + {3801, -118, -93}, + {84, -242, -347}, + {9578, -1388, -227}, + {-28, -444, -139}, + {13000, -1532, 5}, + {-121, -152, -339}, + {11581, -1527, 208}, + {106, -34, -32}, + {-1974, -84, 33}, + {290, 435, 186}, + {6535, 675, 14}, + {-1916, -388, -127}, + {6859, 204, 8} + }, + { + {1081, 892, -687}, + {3990, 133, -95}, + {4960, -410, -148}, + {-625, -481, -61}, + {4332, 1023, -186}, + {-110, -175, -197}, + {7200, 1680, -150}, + {-9, -978, -18}, + {6454, 1981, -217}, + {-387, -35, 20}, + {-2039, 55, -1}, + {606, 108, 235}, + {7734, -94, 72}, + {-1557, -463, -178}, + {7239, 102, -36} + }, + { + {3326, 1859, -796}, + {3670, 214, -2}, + {7546, 919, -115}, + {-739, -80, 107}, + {311, -378, -63}, + {-20, 440, 8}, + {1657, -1045, -211}, + {112, -100, 312}, + {768, -835, -274}, + {-798, -34, 63}, + {-1768, 177, -3}, + {215, -687, 54}, + {7497, -468, -22}, + {-118, 869, 18}, + {6419, -322, -45} + }, + { + {4610, -2222, 393}, + {4120, -355, 139}, + {10608, -818, -37}, + {-261, 101, -101}, + {-1708, -170, 122}, + {99, -131, 193}, + {-1992, 22, -47}, + {-41, 1026, -120}, + {-3819, 319, 53}, + {-1361, 171, 74}, + {-1147, -276, 61}, + {-395, 477, -230}, + {5904, 672, -157}, + {1272, -392, 201}, + {4612, 593, -68} + }, + { + {2840, -1202, 1054}, + {5450, 207, 153}, + {12605, 165, -62}, + {470, 625, -75}, + {-2088, 168, 245}, + {41, -553, 47}, + {-3437, 347, 228}, + {-84, 723, -232}, + {-6627, -300, 219}, + {-2026, -230, 51}, + {-303, 145, 85}, + {-493, 409, -240}, + {3548, -444, -175}, + {1602, -383, 147}, + {2358, -518, -108} + }, + { + {-1743, 3482, 227}, + {7694, -158, -45}, + {12340, 347, -107}, + {796, -332, 225}, + {-1636, 79, 183}, + {-88, 130, -185}, + {-3433, -78, 325}, + {79, -466, 226}, + {-7684, 61, 205}, + {-2416, 74, 30}, + {677, -24, 2}, + {-5, -753, 67}, + {1036, 203, -18}, + {780, 670, -56}, + {212, 204, -38} + }, + { + {-5748, -1616, -796}, + {10709, 485, -301}, + {9494, -953, -97}, + {318, -664, 219}, + {-910, -204, -30}, + {-44, 477, -57}, + {-2839, -302, 141}, + {32, -812, 84}, + {-7412, 8, 130}, + {-2052, 143, 25}, + {1788, 151, -107}, + {441, 129, 290}, + {-1327, -366, 137}, + {-422, -344, -184}, + {-1554, -140, 106} + }, + { + {-5690, -1801, -684}, + {13798, -990, -322}, + {4597, 1450, -169}, + {-513, 889, -174}, + {-104, -156, -176}, + {67, -128, 146}, + {-2029, 159, -140}, + {-78, -5, -219}, + {-6324, -102, -10}, + {-696, -297, -25}, + {2944, -404, -98}, + {313, 709, 108}, + {-3404, 604, 105}, + {-1107, -257, -94}, + {-2915, 384, 122} + }, + { + {-1495, 2639, 84}, + {15569, 748, -47}, + {-1277, -1129, -186}, + {-788, 254, -357}, + {561, 405, -100}, + {48, -325, 70}, + {-1114, 346, -226}, + {4, 600, 16}, + {-4954, 263, -123}, + {1398, 437, -122}, + {3824, 303, 5}, + {-166, -445, -206}, + {-4974, -405, -17}, + {-953, 399, 103}, + {-3820, -305, 8} + }, + { + {3521, -1445, 511}, + {14507, 688, 110}, + {-7125, 635, 74}, + {-194, -1087, 12}, + {582, -150, 66}, + {-48, 207, -108}, + {-526, -466, -73}, + {64, 159, 179}, + {-4017, -386, -88}, + {3433, -568, -141}, + {4013, 129, 29}, + {-369, -367, -178}, + {-5843, -20, -28}, + {-294, -11, 119}, + {-4173, -38, -37} + }, + { + {5681, -304, 516}, + {10113, -1888, -114}, + {-12370, -786, 373}, + {536, 173, 312}, + {-519, -471, 115}, + {-51, 264, -82}, + {-1069, -20, 125}, + {-27, -521, -80}, + {-4313, 137, 115}, + {4309, 359, 8}, + {3344, -425, -62}, + {-126, 410, 52}, + {-6116, 163, 59}, + {382, -99, -44}, + {-4082, 187, 14} + }, + { + {3705, 2090, 118}, + {3386, 1782, -340}, + {-16485, 1084, 357}, + {610, 592, 127}, + {-2725, 905, -21}, + {32, -210, 79}, + {-3295, 839, 164}, + {-48, -374, -134}, + {-6261, 719, 233}, + {3213, 426, 161}, + {2000, 379, -134}, + {204, -49, 129}, + {-6187, -3, 101}, + {773, -156, -91}, + {-3897, -87, 59} + }, + { + {-474, -1993, -513}, + {-4003, -1087, -197}, + {-18633, -618, 107}, + {91, -414, -114}, + {-5377, -545, -103}, + {49, -181, 82}, + {-6841, -1230, 19}, + {47, 325, 134}, + {-9322, -1207, 78}, + {329, -1159, 102}, + {275, -235, -86}, + {266, -165, 71}, + {-6449, -182, 64}, + {714, 144, 35}, + {-4003, -111, 52} + }, + { + {-3458, -280, -583}, + {-10795, 782, 170}, + {-18051, -477, -28}, + {-431, 37, -151}, + {-7634, 125, 32}, + {-17, 197, -45}, + {-10423, 748, -73}, + {22, 513, 59}, + {-11998, 603, -86}, + {-2939, 964, -66}, + {-1697, 319, 8}, + {34, 252, -15}, + {-7047, 236, 12}, + {201, 229, 102}, + {-4582, 244, 17} + }, + { + {-3428, 1651, 64}, + {-16452, -1047, 362}, + {-14852, 1275, 59}, + {-469, 298, -53}, + {-9029, -179, 139}, + {-47, 69, -85}, + {-12676, -104, 5}, + {-53, -34, -150}, + {-12828, 279, -41}, + {-4748, -79, -95}, + {-3982, -563, 22}, + {-214, -143, -98}, + {-7863, -186, -1}, + {-464, -393, 5}, + {-5524, -248, 0} + }, + { + {-1303, -792, 489}, + {-20795, 1185, 203}, + {-10248, -1296, 195}, + {-55, -264, 53}, + {-9522, 202, 49}, + {3, -231, 16}, + {-13060, -198, 65}, + {5, -465, 18}, + {-11410, -743, 66}, + {-4049, -605, -23}, + {-6700, 646, -22}, + {-196, -181, -96}, + {-8666, 88, 28}, + {-782, 97, -107}, + {-6523, 161, 20} + }, + { + {875, -327, 222}, + {-23598, -376, 38}, + {-5910, 680, 190}, + {345, 24, 58}, + {-9376, 139, -41}, + {48, 2, 96}, + {-12061, 434, 51}, + {45, -177, 126}, + {-8573, 794, 93}, + {-1270, 843, -26}, + {-9836, -436, 49}, + {53, 352, 34}, + {-9215, 57, 104}, + {-484, 296, -94}, + {-7225, -3, 77} + }, + { + {1838, 344, -170}, + {-24524, -906, 373}, + {-2964, -102, 33}, + {369, -16, 69}, + {-9025, -528, 114}, + {4, 284, -1}, + {-10723, -678, 175}, + {-28, 358, -80}, + {-5763, -642, 103}, + {1966, -864, -34}, + {-13013, 173, 347}, + {221, -68, 153}, + {-9224, -171, 211}, + {180, -407, 17}, + {-7294, -135, 153} + }, + { + {1513, 56, -163}, + {-23135, 887, 921}, + {-1450, -4, -101}, + {49, -223, 97}, + {-8711, 365, 428}, + {-49, -21, -109}, + {-9775, 482, 487}, + {-27, 373, -73}, + {-4062, 363, 213}, + {3770, 498, 117}, + {-15197, -330, 627}, + {103, -383, 75}, + {-8277, 111, 221}, + {637, 181, 132}, + {-6428, 150, 153} + }, + { + {485, 32, 66}, + {-18735, 487, 553}, + {-638, -98, -124}, + {-324, 654, -143}, + {-8037, 472, 408}, + {-5, -331, 0}, + {-8884, 522, 502}, + {42, -129, 123}, + {-3463, 255, 278}, + {3139, 449, 292}, + {-14742, 779, 320}, + {-143, 390, -155}, + {-5938, -99, -24}, + {508, 267, 143}, + {-4439, -170, -23} + }, + { + {-528, -475, 71}, + {-10718, -191, -966}, + {205, 155, -146}, + {-339, 281, -328}, + {-6040, -841, -304}, + {54, 13, 128}, + {-6765, -1209, -335}, + {-4, -468, -12}, + {-2942, -944, -116}, + {695, -1511, 110}, + {-10323, -71, -683}, + {-180, 335, -182}, + {-2207, 629, -391}, + {-50, -620, -48}, + {-1507, 556, -259} + }, + { + {-960, 339, -178}, + {-43, -4018, -1593}, + {1271, -415, -151}, + {129, -1450, 236}, + {-2144, -1040, -966}, + {-12, 487, -52}, + {-2438, -957, -1249}, + {-34, -257, -94}, + {-1346, 45, -770}, + {-1670, 1350, -478}, + {-2507, -3084, -1101}, + {55, -705, 164}, + {1976, -1720, -327}, + {-474, 189, -274}, + {1569, -1212, -187} + }, + { + {-604, 711, -144}, + {9481, 7031, 657}, + {2166, 641, 45}, + {348, -873, 438}, + {2643, 3864, -131}, + {-41, 333, -108}, + {3177, 4854, -271}, + {33, 225, 101}, + {1435, 2685, -410}, + {-2184, 982, -598}, + {5415, 5449, 498}, + {159, -530, 213}, + {4840, 1714, 408}, + {-326, 853, -76}, + {3523, 1021, 283} + }, + { + {126, -817, 298}, + {12538, 301, 2870}, + {2277, -32, 292}, + {-31, 1308, -362}, + {5590, -1855, 1537}, + {34, -200, 103}, + {6835, -2720, 1973}, + {-8, 499, -17}, + {3802, -2468, 1096}, + {-771, -2595, 417}, + {8804, -274, 2200}, + {-18, 575, -193}, + {4844, 1040, 763}, + {122, -423, 320}, + {3406, 812, 455} + }, + { + {392, -942, 202}, + {7142, -11885, -571}, + {1387, -1238, 37}, + {-121, 1646, -155}, + {4323, -5525, 497}, + {1, -478, -20}, + {5344, -7080, 735}, + {-9, 493, -10}, + {3455, -3630, 807}, + {620, -681, 874}, + {5533, -8789, -254}, + {-52, 810, -63}, + {2213, -3699, -481}, + {212, -991, 67}, + {1540, -2332, -344} + } }; -const Word32 rightHRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS] /* Q29 */= +const Word16 rightHRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]= { { - { -135520176, 194871264, -54369992, }, - { 5232344, 17252346, -539555, }, - { -22220550, 117874840, -40396316, }, - { -107257680, 255896304, -73097656, }, - { 11720966, -108904264, 36866924, }, - { -50680076, 336556864, -124497144, }, - { 11458436, -134486704, 49912352, }, - { -43055436, 307590528, -120338008, }, - { 8897562, -128660576, 50126028, }, - { -119941256, 172604528, -50995756, }, - { 10245644, 73467024, -31177704, }, - { -103657424, 351444832, -110692048, }, - { -908386, -22171694, 13412646, }, - { -139419472, 198506944, -49185964, }, - { -13219372, -29753386, 17103634, }, - }, - { - { -305028032, 178966992, -27285390, }, - { 30917858, -50915228, -27016954, }, - { -31333398, 17824652, -79691504, }, - { -180582976, 181514448, -78655344, }, - { -27201102, -118149720, 33646236, }, - { -32651416, 465500896, -72493680, }, - { -25593174, -154673584, 44513576, }, - { -8945343, 553823680, -21647708, }, - { -21735756, -183458992, 31233540, }, - { -271011904, 228043440, 6618008, }, - { 46176804, 103967736, -27739584, }, - { -154800288, 253057328, -131308960, }, - { -21784610, -92931280, -13600551, }, - { -288599264, 110345760, -48391932, }, - { -57660472, -99732360, -5020280, }, - }, - { - { -324153536, 9072045, 47385836, }, - { 99568616, -139327136, -15360414, }, - { 46054396, -314262752, 41872708, }, - { -52845276, -129020816, 7718056, }, - { -148029808, 81420232, -18759344, }, - { 49320720, -72422272, 121334976, }, - { -120695560, 51905752, -15993921, }, - { 48910012, 135625936, 140061024, }, - { -86364816, 64855080, -57959508, }, - { -347903616, 196710576, 28915330, }, - { 79715664, -68266896, 35842040, }, - { 3573950, -296180416, 41096932, }, - { -46603616, -98206040, -14537391, }, - { -211719872, -73775728, 8290361, }, - { -100602096, -66857072, -14718853, }, - }, - { - { -238983248, -109216184, -20186346, }, - { 158430064, 109539384, 60192356, }, - { 99478424, -106365936, 113992192, }, - { 108341624, 68608344, 33007898, }, - { -268344720, -942208, -20194936, }, - { 17487496, -307243712, 28120224, }, - { -190794256, 31733902, -4362613, }, - { -23633058, -389901440, -67944776, }, - { -105947176, 126534568, -27926952, }, - { -342148384, 121005872, -7304666, }, - { 47435768, -191150208, -8434779, }, - { 137140448, -296890, 113191712, }, - { -92741232, -11922829, 27136140, }, - { -370978, 66400196, 11968463, }, - { -144703888, 2766496, 20560008, }, - }, - { - { -18681498, -206867632, -19592568, }, - { 108209552, 185416416, 46416248, }, - { 32727650, 247064240, -21903796, }, - { 156707248, -9570261, 57924076, }, - { -329999520, -24774446, -2032593, }, - { -37249716, 38208564, -89804544, }, - { -212032336, -13562970, 13310641, }, - { -28955596, -346057312, -82060720, }, - { -104133096, -3824132, 22079890, }, - { -226855872, 54367844, 4613332, }, - { 9917616, -101770864, -34786552, }, - { 88293256, 239106192, 33024004, }, - { -200631344, 115047680, -3089155, }, - { 199597872, -60316912, 18438832, }, - { -231136352, 84634480, 1288490, }, - }, - { - { 223436016, -51390356, -4157528, }, - { -18214956, -250354720, -92994632, }, - { -57046828, 54381264, -80257904, }, - { 29657286, -269596704, -5538361, }, - { -314948864, 58884000, 23173496, }, - { -15848966, 209089216, -23430120, }, - { -186629744, 5942088, 11245298, }, - { 37234144, 136140800, 105880608, }, - { -111910744, -61173756, 839666, }, - { -54005456, 101106752, -8387535, }, - { 6058052, -12533251, 5679021, }, - { -62708672, -138673760, -66732516, }, - { -303604800, 5211943, -23613730, }, - { 244338000, -47463684, 16740709, }, - { -322043104, 10297721, -10102300, }, - }, - { - { 351504416, -67618888, -30714384, }, - { -54721104, -251287792, -88000656, }, - { -113102056, -200841264, 31799938, }, - { -118671560, 776852, -75185552, }, - { -261045968, 42209328, 19190988, }, - { 28601798, -63060856, 69197832, }, - { -135094976, 1285269, 3442416, }, - { 2437394, 384751776, 6705518, }, - { -105192872, 9150428, -24213416, }, - { 144857440, -12532715, 753767, }, - { -12818330, 46677168, -22034792, }, - { -123130808, -83513488, -70629128, }, - { -339585888, -34845068, 849867, }, - { 117476480, 73857872, -443992, }, - { -376464608, 1576253, 6109591, }, - }, - { - { 326040096, 49028664, 22428320, }, - { -10631655, 188114192, 68762424, }, - { -210201600, -159242352, 61620432, }, - { -114390552, 143538880, -20566988, }, - { -201035072, -18813568, -14765024, }, - { 16927540, -165660640, 29322278, }, - { -80505400, 2159295, -3675955, }, - { -32559610, 127769912, -91239064, }, - { -70205536, 60418916, -11065983, }, - { 297682560, 66001300, 1824287, }, - { -37865504, 94677184, -2071785, }, - { -28137942, 205611360, 12385075, }, - { -309382048, 12906377, 11574400, }, - { -73100344, -77344304, -18161806, }, - { -382446432, -11492796, 1540283, }, - }, - { - { 108923056, 190376032, 10649908, }, - { -77725488, 196784128, 67276368, }, - { -352566336, 153094112, -37377488, }, - { -4843650, -76424112, 31541702, }, - { -127077344, -64507724, -8101382, }, - { -22453552, 70792872, -51737176, }, - { -34963720, -2215666, -9452686, }, - { 17081622, -231734960, 49876920, }, - { -33504504, -29388314, 15022185, }, - { 356293312, 44757856, 889595, }, - { -114809848, 67806256, 22993644, }, - { 90251760, -22021908, 66466768, }, - { -239530320, 944893, 752156, }, - { -192860672, -19954954, -18575196, }, - { -332159872, -19122806, -6287296, }, - }, - { - { -169595904, -62544388, -30911954, }, - { -277781312, -167457552, -35618700, }, - { -434085376, 112163608, -35138740, }, - { 88578872, 6706592, 41794864, }, - { -58242976, 19576460, 13532368, }, - { -17199734, 127037080, -28944858, }, - { -3717294, 35752920, -918049, }, - { 16502875, -232059760, 46335716, }, - { -43709884, -68236832, -158377, }, - { 302439776, -23015120, -15345918, }, - { -259441792, -90892784, -12786118, }, - { 86459840, -128010424, 25755846, }, - { -164977216, 30413738, -1911797, }, - { -172616352, 74084968, 11601244, }, - { -245588384, 51877300, 4899484, }, - }, - { - { -325007168, -33243584, -8560407, }, - { -479058496, -34588984, -41318660, }, - { -453216224, -58082452, 32525250, }, - { 79122960, 135242608, -1163399, }, - { -30136712, 55057184, -7392176, }, - { 16492674, -71891848, 38566120, }, - { -6920803, 18053896, 5795522, }, - { -21474300, 47109884, -60942900, }, - { -104778408, -209380, -16012175, }, - { 171231216, 24038932, -9402757, }, - { -397912064, -312996, -21223044, }, - { -13937706, 81356880, -24482388, }, - { -118827248, -10425496, 7212861, }, - { -55324548, -9509058, 19807852, }, - { -170254656, 3934727, 10257993, }, - }, - { - { -299565376, 35366372, 8828842, }, - { -601780224, 43026984, 9757629, }, - { -474717888, -72621992, 25129854, }, - { 1726577, -15290620, -40343164, }, - { -41837812, 31529354, -16467441, }, - { 18072148, -81266688, 33348810, }, - { -61786864, -31823560, -5519570, }, - { -2217814, 185003568, -5108327, }, - { -201226192, 67109, 2428804, }, - { -2594697, -20058034, 2413235, }, - { -490028928, 20321100, 1631014, }, - { -87570088, -6750078, -36289788, }, - { -118403656, -31147102, 808528, }, - { 75520560, -19526532, -10375030, }, - { -139467248, -25146496, -6270653, }, - }, - { - { -132337072, -58881316, 8665097, }, - { -655855488, 25572236, 16110422, }, - { -501111008, 30430380, -9394704, }, - { -49204756, -74647608, -5505075, }, - { -91855928, -22336514, 14292041, }, - { -12157442, 97756680, -27805618, }, - { -155968512, 5469641, -3663607, }, - { 16540993, 44654240, 46456512, }, - { -336846240, 58492624, 1365800, }, - { -176553760, 33840048, 11727945, }, - { -548054464, 10231149, 11157251, }, - { -58025544, -70031592, -23076322, }, - { -150341040, 24950002, -15178414, }, - { 161219120, -49005040, -15503221, }, - { -148966640, -8432095, -10384694, }, - }, - { - { 70368744, 40104256, 7168301, }, - { -677316864, 14061186, 9455907, }, - { -505640608, 25171730, -6891275, }, - { -53633940, 6905234, 24492588, }, - { -189773664, -74050072, 12053289, }, - { -18511310, 73076184, -34952980, }, - { -274234208, -24685324, 5230197, }, - { -4431870, -109918952, -13494250, }, - { -492537184, -25987774, -7692287, }, - { -306285408, -42193220, 5999533, }, - { -599594048, -23166516, 4469451, }, - { 38758320, 112756312, 18760418, }, - { -191659696, 30705258, -6935836, }, - { 155024704, 18436684, 11340861, }, - { -190430256, 6300180, 2592550, }, - }, - { - { 201780240, -15927349, 6103149, }, - { -703675648, 6285148, 19589346, }, - { -480631552, -14164802, 4212289, }, - { -26402774, 37356016, 6506339, }, - { -289732576, 36455684, -11339787, }, - { 8114267, -85212688, 19082002, }, - { -392567520, 29936458, 4489852, }, - { -11103027, -59286116, -30707406, }, - { -637229248, -15723875, 13287555, }, - { -342789920, -1901597, -1787243, }, - { -666988032, 24908662, -3487514, }, - { 87287160, 509491, 50570020, }, - { -247421792, 2945811, 11980811, }, - { 45361296, 54193360, 18922016, }, - { -257889696, 23130010, 7347616, }, - }, - { - { 218355600, -34307660, 480499, }, - { -745239104, -65278672, 3823058, }, - { -427974176, 13306882, 4248797, }, - { 16760573, -17125108, -23188528, }, - { -328094688, 20603494, -9194451, }, - { 18897320, -29428580, 37408092, }, - { -472696032, -13945222, 2480344, }, - { 6292664, 70817032, 18086644, }, - { -753866624, -50825568, 22191022, }, - { -262117552, 39137352, 463856, }, - { -752061120, 3488587, 2753074, }, - { 26259430, -141933104, 14274324, }, - { -333270144, -49004504, 5350456, }, - { -102069360, -82435456, -2142115, }, - { -328640160, -23949274, 2633352, }, - }, - { - { 144449952, 51578264, -16460999, }, - { -754358400, 10646150, -22409528, }, - { -357978016, -12630962, 2121714, }, - { 55548960, -74437152, -11065983, }, - { -285058048, -47072840, 8100845, }, - { -3855270, 108625088, -8880919, }, - - { -484483040, -2369211, 765041, }, - { 8435316, 56591564, 22964116, }, - { -806595392, 50464792, -6066105, }, - { -92471184, -44889924, 1385664, }, - { -842413824, 19781008, 13151727, }, - { -65707096, 88061328, -49775988, }, - { -431250688, 22603876, -4613332, }, - { -180423520, 15318001, -21953188, }, - { -372310304, 17492864, -4533875, }, - }, - { - { 44034688, 8211441, -15715822, }, - { -684178112, 95209224, -2731062, }, - { -287447136, 12063489, 279173, }, - { 54791972, 38640212, 32280438, }, - { -179376624, 21377126, 15723875, }, - { -22044994, 1953673, -47797080, }, - { -417241056, 28506234, 754841, }, - { -8842264, -70665632, -25028922, }, - { -744435968, 54001160, -14835891, }, - { 101118560, 45958296, 417686, }, - { -913782720, -34616364, 5817533, }, - { -69034616, 108603080, -42297912, }, - { -510893888, -4614943, -121870, }, - { -127882648, 64976412, -14567455, }, - { -367728128, 21326660, -4706211, }, - }, - { - { -42392400, -21832930, 8923331, }, - { -564688896, -35052840, 25179782, }, - { -228388112, -6603512, -1784559, }, - { -7439420, 99392520, 24076512, }, - { -45775760, 11540040, -2239826, }, - { 4673998, -168884560, 13025562, }, - { -287786976, -36048736, 3089155, }, - { -4969814, -100874824, -13440026, }, - { -578127296, -82212656, 6925098, }, - { 243358208, -19028316, -324270, }, - { -928045824, -1262184, -3357591, }, - { 15159624, -137618272, 30216706, }, - { -554744960, 3474092, 3419331, }, - { 15227807, -86528024, 12173011, }, - { -317898976, -36552856, 7756711, }, - }, - { - { -112510424, -23877870, 18947786, }, - { -456805216, -32255742, 6639483, }, - { -189299072, 1576253, -5324686, }, - { -75048112, -87878256, -31089658, }, - { 84136264, 11220602, -24946780, }, - { 22120156, -68032816, 49400712, }, - { -142671296, 12062953, -4116726, }, - { 10969883, 14823006, 30617748, }, - { -386223872, 31193810, 14438069, }, - { 284063232, -5093295, -1347546, }, - { -868519680, 35133368, -316217, }, - { 68075232, -55910812, 46515568, }, - { -553373760, 14804752, 6683506, }, - { 136529488, 2549063, 20943334, }, - { -251979296, 713501, 10266582, }, - }, - { - { -156559072, 38678864, 4654134, }, - { -378490784, -996969, -17370996, }, - { -177369808, -8266739, -4779225, }, - { -63569812, -68194416, -41852308, }, - { 164008688, -47361140, -20721606, }, - { -7510824, 127864400, -22777822, }, - { -41226856, -7129109, -16905528, }, - { -351650, 98158256, -1477469, }, - { -250573216, 15700790, -3388192, }, - { 221876944, 31637802, -2272038, }, - { -758244288, -43934296, 9135932, }, - { 32112934, 97078608, -2900177, }, - { -509314400, -7141457, 8430484, }, - { 150665312, 52821120, -552440, }, - { -189582544, 6276558, -1442035, }, - }, - { - { -151924800, -20779588, -18118856, }, - { -328674528, 40242232, -8975945, }, - { -197082096, 10024454, 5124433, }, - { 23447300, 142530640, 18077518, }, - { 121245856, 23868208, 8290361, }, - { -17070348, 82138032, -36723044, }, - { -43131672, 14383309, -12541841, }, - { -10189273, 27262842, -28318866, }, - { -222328448, -24732570, -24415816, }, - { 98813240, -37815576, -5346161, }, - { -643103680, 13499619, 10624138, }, - { -32130650, -23995982, -29850560, }, - { -433130816, -2343979, -1904281, }, - { 66393216, -25447144, -11730629, }, - { -130950328, 6957310, -9563818, }, - }, - { - { -82459080, -81389632, -9319542, }, - { -316999200, -14724222, 9760850, }, - { -243403856, 21904334, 10335302, }, - { 80673984, 31187906, 46925204, }, - { -99811816, 84763328, 21679384, }, - { 6947647, -79027400, 22248468, }, - { -198692160, 24356222, 7185481, }, - { 5288716, -85655072, 15171972, }, - { -320020704, -14198088, -14484777, }, - { -23347980, 18650358, -4894652, }, - { -556219712, 2996277, 857383, }, - { -50790672, -43757664, -17422534, }, - { -335211456, -24299852, -10462540, }, - { -48816600, 7784092, 60666, }, - { -80444200, -19557134, -8613020, }, - }, - { - { 28313498, 68919728, 29562796, }, - { -347980928, -34109556, 8020315, }, - { -287355328, -37504728, -2088965, }, - { 43435004, -117633784, -2157147, }, - { -463089824, -142948320, 688269, }, - { 11658152, -67379984, 22993108, }, - { -511685216, -97947264, 14437533, }, - { 6668474, -75892608, 18337362, }, - { -545768448, -23956790, 19153406, }, - { -100530152, -2284386, -539555, }, - { -496568000, 10121090, -3943854, }, - { -11123428, 53504556, 7702487, }, - { -244320288, 33477122, -5918465, }, - { -125293856, -21958020, 3791383, }, - { -58093192, 16689706, -701690, }, - }, - { - { 121521808, 72422816, 14588393, }, - { -396235424, 28530394, -5670968, }, - { -282284032, -7220914, -12603045, }, - { -29173566, 10940355, -32751274, }, - { -828566848, 74083352, -14059575, }, - { -3834869, 36973764, -14339822, }, - { -900029696, 114861920, 3750043, }, - { -7813620, 29796872, -22095460, }, - { -871949760, 122431264, 20877836, }, - { -124764504, -6745246, 2953864, }, - { -446641152, -12294881, -1540820, }, - { 35043712, -7324530, 17977122, }, - { -208990432, -14132590, 3662533, }, - { -118506736, 918586, -7269769, }, - { -93645320, 16217797, 3842922, }, - }, - { - { 177756880, -53181360, -43604120, }, - { -419816416, 8409546, -7485055, }, - { -214271616, 35051228, -9516574, }, - { -58577984, 59515360, -5730023, }, - { -1052510208, -350577, -2594160, }, - { -8056822, 27921046, -14477261, }, - { -1222012160, -62816044, -4646081, }, - { -2239289, 70632888, -5808944, }, - { -1199319168, -109910896, -8547522, }, - { -115676888, 8247948, 5041755, }, - { -391830400, 9975598, -1738388, }, - { 37157372, -27774480, 10413685, }, - { -266380320, -31537408, 6293738, }, - { -31960462, 46750720, -7976828, }, - { -199360032, -39514236, 302795, }, - }, - { - { 199287552, -94219232, -37252936, }, - { -396419040, -24897388, 826781, }, - { -130629816, -32934882, -3066070, }, - { -33716568, -9487583, 13584982, }, - { -1081162496, -33790120, 10034117, }, - { 79457, -27114128, 4269735, }, - { -1362517120, -8376260, -2020782, }, - { 7618198, -1657857, 21300890, }, - { -1395718912, -11603928, -10591926, }, - { -99994888, -1045288, 5325760, }, - { -326496960, -19525996, -1824824, }, - { -1633698, 41486164, -4496294, }, - { -410237024, 55961812, -733366, }, - { 73531984, -48038136, 6064494, }, - { -351074912, 34980900, -888521, }, - }, - { - { 136010880, 91286848, 39137352, }, - { -333237920, 21934934, 6692096, }, - { -113062864, 3367791, 2892124, }, - { 12907987, -13196824, -686121, }, - { -955450368, 55922084, 16620987, }, - { 6760816, 1138703, 12552042, }, - { -1298857728, 66461936, 10081362, }, - { -1005559, -65381212, -3132642, }, - { -1401256192, 60880624, 15841450, }, - { -90000504, -4531728, 3397856, }, - { -258166192, 19531900, 1465658, }, - { -35472136, -13742822, -16918950, }, - { -588642432, -44282724, -6445672, }, - { 120281096, -2138357, 13868986, }, - { -504519072, -33069100, 473520, }, - }, - { - { -61631708, 124418760, 64017560, }, - { -254524592, -2734284, 2728378, }, - { -230375600, 51568600, 2342905, }, - { 46897820, -24514062, -4051228, }, - { -770130560, -32261646, 16159814, }, - { 2195265, 32971390, 1871532, }, - { -1104524928, -65782256, 21886616, }, - { -6711960, -24285356, -18641232, }, - { -1255872000, -36322540, 23219666, }, - { -76220104, 3022046, 135828, }, - { -201167680, -5025649, 1708860, }, - { -25882010, -39599060, -10532870, }, - { -739942336, 13878650, -3015604, }, - { 77534360, 47942036, 4677220, }, - { -617759616, 16445430, 190589, }, - }, - { - { -302229856, -201453824, -6583648, }, - { -187215472, -7235410, -10152766, }, - { -488476288, -75664976, -1499481, }, - { 40810244, 9884867, 11841762, }, - { -608733248, 6152541, 4904316, }, - { -6236293, -10264972, -12664785, }, - { -889736320, 22035866, 17557826, }, - { 4205310, 55413132, 12076374, }, - { -1036020224, 34490196, 10843182, }, - { -38071128, 9797894, -2145336, }, - { -163429408, -4794794, -3781182, }, - { 13130789, 43269112, 10496363, }, - { -828692992, 8045548, 7798050, }, - { -14405857, -42557220, -9413495, }, - { -667675776, 8978092, 4118337, }, - }, - { - { -372883168, 9153112, -65391952, }, - { -160387504, -1212255, -19085760, }, - { -823048896, 74214888, 928250, }, - { -5722507, 47615080, 8771397, }, - { -502844576, 3480534, -8838506, }, - { -2830920, -35772244, -3490735, }, - { -725349632, 5845988, -944893, }, - { 3865471, 58133992, 10559177, }, - { -809384448, -33443836, 322123, }, - { 35654672, -20708722, -2545305, }, - { -145547856, -523986, -8354249, }, - { 33141042, 9367324, 18559090, }, - { -854448832, -1685238, 14260902, }, - { -82688320, 1826435, -12265353, }, - { -659427776, -14470282, 10415833, }, - }, - { - { -163187280, 201135472, -33787432, }, - { -216790624, 7305740, -11348914, }, - { -1140422784, -67091148, 2142115, }, - { -49104360, -39777304, -14513768, }, - { -447214016, 13685913, -13014288, }, - { 5139465, 7147900, 11028939, }, - { -622485696, 1927367, -16253230, }, - { -5451387, -9884330, -15425375, }, - { -621990720, 24934970, -7023882, }, - { 130730216, 20885352, -3863860, }, - { -151061520, 8894877, -4932770, }, - { 12105365, -50302120, 1881196, }, - { -831482048, -8508330, 7725036, }, - { -83483960, 32781338, -2046015, }, - { -613759936, 203474, 8196945, }, - }, - { - { 185291872, -169782208, 30771830, }, - { -404893024, 25424058, 9195525, }, - { -1356832256, 19707458, 4005057, }, - { -41713260, -31788126, -19857244, }, - { -434513248, -21893058, -2569464, }, - { 3011309, 25533580, 4052839, }, - { -568107648, -28803124, -13408351, }, - { -689342, -44617196, -1606855, }, - { -497736256, -24537686, -8870718, }, - { 208048208, -13804562, -6235219, }, - { -191575936, 2828236, 2968896, }, - { -20891258, 22090090, -17161078, }, - { -767861248, -8555038, -2246268, }, - { -29853244, -30506078, 9749039, }, - { -545730880, -3384971, -1339493, }, - }, - { - { 398036096, -5266167, 44648868, }, - { -739606272, -100307352, 17949206, }, - { -1428731648, 29643864, 17725330, }, - { 10814728, 70556112, 6454262, }, - { -470966240, -4185983, 9080098, }, - { -3702262, -11188927, -8196408, }, - { -565363712, 21619792, 3001109, }, - { 4640176, -5299453, 12935905, }, - { -451304960, 16711181, -1861868, }, - { 219822864, 5193689, -3836480, }, - { -275544704, -30096446, 4315906, }, - { -24570972, 37352256, -10452877, }, - { -670961920, 34142844, -2099702, }, - { 29928406, -4066260, 7910793, }, - { -462515904, 25297894, -3964255, }, - }, - { - { 320299872, 114648784, 17737678, }, - { -1158839040, 133191232, 3401077, }, - { -1360001408, -29389388, 28477780, }, - { 48848812, 1812476, 23652922, }, - { -553707200, 34342020, 9373766, }, - { -3304977, -18860812, -5110474, }, - { -629009216, 16498043, 14461692, }, - { -1039919, 36833104, -3190087, }, - { -484815360, 2575370, 9782862, }, - { 135019280, 15649787, 5561983, }, - { -390961216, 37847788, -1415192, }, - { 581968, -30288646, 8622147, }, - { -562095808, -33288144, 4657355, }, - { 58433032, 15504295, -4299263, }, - { -378714656, -26498338, 1365800, }, - }, - { - { 29576218, -145640736, -14351096, }, - { -1534202624, -69030864, -7241315, }, - { -1168657408, 18329310, 17115982, }, - { 31003222, -59195388, 4426501, }, - { -649110784, -39743480, 20401, }, - { 2608119, 14380624, 6142340, }, - { -744678592, -49221400, 11759620, }, - { -3774740, 17121888, -10470057, }, - { -568391680, -36477156, 13024488, }, - { -33743412, -50315540, 11559368, }, - { -508062944, -21304648, -3766150, }, - { 20067698, -9561134, 10832444, }, - { -469737888, 12621298, 6405407, }, - { 50327888, 2709051, -6794102, }, - { -315902368, 10422812, 4415227, }, - }, - { - { -246708288, 73049880, -39247412, }, - { -1751132288, -13207024, 7250442, }, - { -862555584, -51076288, -4444218, }, - { -14945949, 21788370, -14555107, }, - { -702395712, 1078574, -4603131, }, - { 3284039, 15173046, 5415417, }, - { -849413504, 41333156, -40802, }, - { 2523830, -29244432, 7238094, }, - { -631552384, 39072392, 281857, }, - { -217172336, 63978908, 4052839, }, - { -601198784, 3279745, 1770063, }, - { 14478335, 20039780, 1262184, }, - { -408027264, 255014, 2056753, }, - { 17275970, -4272419, 2461016, }, - { -285526752, 3602941, 2639258, }, - }, - { - { -311022208, 84281752, -26998702, }, - { -1774035712, 41514616, 28337658, }, - { -463400128, 103843184, -11556683, }, - { -38556460, 16538308, -10299332, }, - { -673888960, 36447628, 4330401, }, - { -1606318, -12928388, -4128537, }, - { -860121984, 13616120, -5515275, }, - { 2370822, -30808338, 6453725, }, - { -589480512, 21443698, -10248329, }, - { -313834336, -20128902, -7716983, }, - { -663360384, -3179350, 8325257, }, - { -5477694, -12163884, -4982162, }, - { -367748000, 2401424, -1614371, }, - { -24133958, -15887621, 5986111, }, - { -279149792, -5903970, -234076, }, - }, - { - { -153765200, -139129024, 20012936, }, - { -1633565056, -29656750, 29936996, }, - { -41030360, -112123344, -2557653, }, - { -22300008, -26103200, 1022739, }, - { -567753856, -29372744, 10521059, }, - { -3102040, -8038568, -5382668, }, - { -733468224, -61831424, 1477469, }, - { -3411815, 11391864, -9660992, }, - { -406942240, -78030968, -4046933, }, - { -254887520, -47447576, -7445326, }, - { -699962112, 10571525, 8303246, }, - { -17091822, -501974, -6423661, }, - { -326485152, -11907797, -1275068, }, - { -50830400, 18388366, -1570347, }, - { -272977376, -2227478, -886374, }, - }, - { - { 61715460, 32014150, 39172788, }, - { -1375184640, 31143344, 11145977, }, - { 300763136, 64285460, 5029407, }, - { 12705050, 14372571, 7395934, }, - { -418000160, 20066088, 2936684, }, - { 612570, 13727252, 1901060, }, - { -501899136, 63888176, 6962142, }, - { -515933, 32912334, -1219234, }, - { -136055440, 77131168, 5029407, }, - { -62121332, 72037336, 844498, }, - { -712420736, -4226785, 4772783, }, - { -8580271, 16182900, -2963528, }, - { -264470672, 20142322, 1314260, }, - { -42459508, 6663642, -7353521, }, - { -242160992, 13138842, 776852, }, - }, - { - { 173917728, 60976724, 8347806, }, - { -1027720192, -77440408, -3391414, }, - { 483799072, -339839, 655519, }, - { 30398168, 9349607, 5104569, }, - { -260935904, -33547452, -3558381, }, - { 3087008, 1705102, 5864778, }, - { -247261808, -51369956, 4529043, }, - { 3295314, 5176510, 9279277, }, - { 119048440, -45323180, 4776004, }, - { 158658240, -48439180, 2936684, }, - { -688588480, -17838610, 6984154, }, - { 9170292, -17559974, 4941360, }, - { -172061760, -25860534, 3860102, }, - { -2390149, -26675506, -3151432, }, - { -172681840, -21907018, 2871723, }, - }, - { - { 148426560, -44091060, -21153788, }, - { -607247168, 129044440, 7869991, }, - { 504355872, -35570920, -10821707, }, - { 16774532, -11637751, 798864, }, - { -122338920, 43845172, 3470334, }, - { 70330, -16952772, -434865, }, - { -42919072, 41804528, 5733782, }, - { -1134945, -27432492, -3331284, }, - { 271430656, 12314208, 1133335, }, - { 284485760, 14280229, 1416802, }, - { -601181056, 36340256, 16134582, }, - { 14782741, -4701916, 8718784, }, - { -46436648, 27926414, 4838281, }, - { 38227892, 19090592, 4918275, }, - { -63385664, 26146688, 3585761, }, - }, - { - { 50165220, -2446521, -14534706, }, - { -131955888, -102776416, 23400592, }, - { 429276064, 26648124, -16449725, }, - { -10225243, 10250476, 235149, }, - { -5843840, -23798414, 13560285, }, - { -3149285, 965831, -6698002, }, - { 91384016, -18622442, 12086575, }, - { -2464238, -18131742, -6780680, }, - { 302248128, 11066520, 1255204, }, - { 248285616, 21774410, 6012418, }, - { -411309696, -33869576, 17572322, }, - { 2075543, 25417080, 1172526, }, - { 112084152, -22398254, 80531, }, - { 45845556, 5286568, 8261370, }, - { 76741400, -22457310, -71941, }, - }, - { - { -42478836, 3827353, 5222144, }, - { 373993952, 17577690, -7036230, }, - { 342384608, -4961761, -11625940, }, - { -25247966, -19390166, -7270306, }, - { 114021184, -14768782, 3609383, }, - { -331249, 19904490, -118112, }, - { 199094288, -22322018, 2608656, }, - { 2378338, 17207250, 6906308, }, - { 266570896, -30332670, -670015, }, - { 78420200, -62676456, 9542880, }, - { -89402432, 24081882, -7893613, }, - { -12401181, -14681809, -10343892, }, - { 293430016, 18987514, -13280576, }, - { 15437186, -26183194, 3886946, }, - { 228244768, 18317498, -9505836, }, - }, - { - { -84415968, 16539382, 6498823, }, - { 865165312, -25497610, -74502112, }, - { 288153120, -2291902, -5586142, }, - { -14707042, -15683610, -13768591, }, - { 269447456, 15268609, -30878668, }, - { 3339874, -1758252, 7729868, }, - { 343504512, 29538100, -36380520, }, - { 854162, 28677496, 2340757, }, - { 247785248, 36953360, -18047990, }, - { -113531552, 79529376, -3664681, }, - { 336332992, -61252676, -49850076, }, - { -10072235, -23138600, -8646306, }, - { 461719200, -34638376, -24414204, }, - { -24495272, 27974196, -6864969, }, - { 356392640, -25852482, -16559783, }, - }, - { - { -67956584, -5862094, -7258495, }, - { 1228776704, 177195312, -76141720, }, - { 257796816, 5892159, -2051384, }, - { 14698452, 70069168, 11866995, }, - { 447683776, 69246144, -48252348, }, - { 3221, -25773562, -967441, }, - { 530176128, 71143448, -61755188, }, - { -2878165, 2015413, -8126078, }, - { 289620928, 16216186, -37874096, }, - { -202235520, -27891518, -27511950, }, - { 735616256, 161502048, -48373680, }, - { 6163815, 36712844, 10152229, }, - { 549467520, 55591908, -11610370, }, - { -37738804, 3149822, -14293651, }, - { 412312032, 35161288, -6841883, }, - }, - { - { -14148159, -41238128, -6071473, }, - { 1281082496, -211401504, 48896056, }, - { 215368448, -6750078, 6689412, }, - { 24906516, 30822296, 27560268, }, - { 560569984, -152013392, 4828080, }, - { -3439732, -5625334, -8611946, }, - { 662074560, -195179424, 1111323, }, - { 1498407, -29228326, 4475893, }, - { 355079968, -117149528, -9849434, }, - { -138740864, -89582280, -22839026, }, - { 905934208, -173703504, 37728068, }, - { 11938935, 25028386, 14175540, }, - { 489035168, -18500572, 24653112, }, - { -13491566, -49535468, -1341640, }, - { 355331232, -2408940, 16406238, }, - }, - { - { 35444756, 40083320, 15843061, }, - { 894766784, -193518336, 137400832, }, - { 135316704, -25804700, 14344654, }, - { -4183298, -105033960, -19880330, }, - { 490654912, 5720360, 78753056, }, - { 1813550, 32169842, 6186364, }, - { 589552960, 32260036, 101505648, }, - { 810138, -33732136, 2275796, }, - { 345121568, 67742912, 59600724, }, - { 6849399, 137312256, 30303142, }, - { 704745088, -125802280, 102349072, }, - { -2047089, -48783312, -11823508, }, - { 274665856, -114824880, 32450088, }, - { 19188840, 24214488, 20062866, }, - { 192652368, -84133040, 18580028, }, - }, - { - { 39803072, 51194400, 12788802, }, - { 204740016, 647619328, -38720204, }, - { 30276298, 68772624, -49929, }, - { -16612934, -90500864, -22324704, }, - { 214110032, 314792640, 22679038, }, - { 1224066, 38911328, 2881923, }, - { 262058496, 396546272, 36606544, }, - { -1625645, -15795816, -4760971, }, - { 187617600, 208635008, 42795056, }, - { 94519344, 41808284, 52547316, }, - { 215489776, 484327904, -23882166, }, - { -7446937, -47923244, -10260140, }, - { 5176510, 190813584, -29558502, }, - { 20531018, 61265560, 6198712, }, - { 1622424, 120248880, -21247204, }, - }, - { - { 6014565, -55379308, -21743808, }, - { -328660576, -106819056, -240462336, }, - { -49900540, -34383896, -26082800, }, - { 251792, 29870960, 22744000, }, - { -92435216, -211497072, -125123672, }, - { -1044214, 21117280, -3644280, }, - { -116375896, -290485824, -160718208, }, - { 306553, -1584306, 1057636, }, - { -39702140, -239503488, -88157424, }, - { 55978456, -186956704, -25972204, }, - { -207131248, -121513752, -184537568, }, - { 48318, 9571335, 11224897, }, - { -152331216, 24865176, -69481296, }, - { -513249, -18034568, -19814832, }, - { -104797200, 22180822, -42998528, }, - }, + {-2068, 2973, -830}, + {80, 263, -8}, + {-339, 1799, -616}, + {-1637, 3905, -1115}, + {179, -1662, 563}, + {-773, 5135, -1900}, + {175, -2052, 762}, + {-657, 4693, -1836}, + {136, -1963, 765}, + {-1830, 2634, -778}, + {156, 1121, -476}, + {-1582, 5363, -1689}, + {-14, -338, 205}, + {-2127, 3029, -751}, + {-202, -454, 261} + }, + { + {-4654, 2731, -416}, + {472, -777, -412}, + {-478, 272, -1216}, + {-2755, 2770, -1200}, + {-415, -1803, 513}, + {-498, 7103, -1106}, + {-391, -2360, 679}, + {-136, 8451, -330}, + {-332, -2799, 477}, + {-4135, 3480, 101}, + {705, 1586, -423}, + {-2362, 3861, -2004}, + {-332, -1418, -208}, + {-4404, 1684, -738}, + {-880, -1522, -77} + }, + { + {-4946, 138, 723}, + {1519, -2126, -234}, + {703, -4795, 639}, + {-806, -1969, 118}, + {-2259, 1242, -286}, + {753, -1105, 1851}, + {-1842, 792, -244}, + {746, 2069, 2137}, + {-1318, 990, -884}, + {-5309, 3002, 441}, + {1216, -1042, 547}, + {55, -4519, 627}, + {-711, -1499, -222}, + {-3231, -1126, 127}, + {-1535, -1020, -225} + }, + { + {-3647, -1667, -308}, + {2417, 1671, 918}, + {1518, -1623, 1739}, + {1653, 1047, 504}, + {-4095, -14, -308}, + {267, -4688, 429}, + {-2911, 484, -67}, + {-361, -5949, -1037}, + {-1617, 1931, -426}, + {-5221, 1846, -111}, + {724, -2917, -129}, + {2093, -5, 1727}, + {-1415, -182, 414}, + {-6, 1013, 183}, + {-2208, 42, 314} + }, + { + {-285, -3157, -299}, + {1651, 2829, 708}, + {499, 3770, -334}, + {2391, -146, 884}, + {-5035, -378, -31}, + {-568, 583, -1370}, + {-3235, -207, 203}, + {-442, -5280, -1252}, + {-1589, -58, 337}, + {-3462, 830, 70}, + {151, -1553, -531}, + {1347, 3648, 504}, + {-3061, 1755, -47}, + {3046, -920, 281}, + {-3527, 1291, 20} + }, + { + {3409, -784, -63}, + {-278, -3820, -1419}, + {-870, 830, -1225}, + {453, -4114, -85}, + {-4806, 899, 354}, + {-242, 3190, -358}, + {-2848, 91, 172}, + {568, 2077, 1616}, + {-1708, -933, 13}, + {-824, 1543, -128}, + {92, -191, 87}, + {-957, -2116, -1018}, + {-4633, 80, -360}, + {3728, -724, 255}, + {-4914, 157, -154} + }, + { + {5364, -1032, -469}, + {-835, -3834, -1343}, + {-1726, -3065, 485}, + {-1811, 12, -1147}, + {-3983, 644, 293}, + {436, -962, 1056}, + {-2061, 20, 53}, + {37, 5871, 102}, + {-1605, 140, -369}, + {2210, -191, 12}, + {-196, 712, -336}, + {-1879, -1274, -1078}, + {-5182, -532, 13}, + {1793, 1127, -7}, + {-5744, 24, 93} + }, + { + {4975, 748, 342}, + {-162, 2870, 1049}, + {-3207, -2430, 940}, + {-1745, 2190, -314}, + {-3068, -287, -225}, + {258, -2528, 447}, + {-1228, 33, -56}, + {-497, 1950, -1392}, + {-1071, 922, -169}, + {4542, 1007, 28}, + {-578, 1445, -32}, + {-429, 3137, 189}, + {-4721, 197, 177}, + {-1115, -1180, -277}, + {-5836, -175, 24} + }, + { + {1662, 2905, 163}, + {-1186, 3003, 1027}, + {-5380, 2336, -570}, + {-74, -1166, 481}, + {-1939, -984, -124}, + {-343, 1080, -789}, + {-534, -34, -144}, + {261, -3536, 761}, + {-511, -448, 229}, + {5437, 683, 14}, + {-1752, 1035, 351}, + {1377, -336, 1014}, + {-3655, 14, 11}, + {-2943, -304, -283}, + {-5068, -292, -96} + }, + { + {-2588, -954, -472}, + {-4239, -2555, -544}, + {-6624, 1711, -536}, + {1352, 102, 638}, + {-889, 299, 206}, + {-262, 1938, -442}, + {-57, 546, -14}, + {252, -3541, 707}, + {-667, -1041, -2}, + {4615, -351, -234}, + {-3959, -1387, -195}, + {1319, -1953, 393}, + {-2517, 464, -29}, + {-2634, 1130, 177}, + {-3747, 792, 75} + }, + { + {-4959, -507, -131}, + {-7310, -528, -630}, + {-6916, -886, 496}, + {1207, 2064, -18}, + {-460, 840, -113}, + {252, -1097, 588}, + {-106, 275, 88}, + {-328, 719, -930}, + {-1599, -3, -244}, + {2613, 367, -143}, + {-6072, -5, -324}, + {-213, 1241, -374}, + {-1813, -159, 110}, + {-844, -145, 302}, + {-2598, 60, 157} + }, + { + {-4571, 540, 135}, + {-9182, 657, 149}, + {-7244, -1108, 383}, + {26, -233, -616}, + {-638, 481, -251}, + {276, -1240, 509}, + {-943, -486, -84}, + {-34, 2823, -78}, + {-3070, 1, 37}, + {-40, -306, 37}, + {-7477, 310, 25}, + {-1336, -103, -554}, + {-1807, -475, 12}, + {1152, -298, -158}, + {-2128, -384, -96} + }, + { + {-2019, -898, 132}, + {-10008, 390, 246}, + {-7646, 464, -143}, + {-751, -1139, -84}, + {-1402, -341, 218}, + {-186, 1492, -424}, + {-2380, 83, -56}, + {252, 681, 709}, + {-5140, 893, 21}, + {-2694, 516, 179}, + {-8363, 156, 170}, + {-885, -1069, -352}, + {-2294, 381, -232}, + {2460, -748, -237}, + {-2273, -129, -158} + }, + { + {1074, 612, 109}, + {-10335, 215, 144}, + {-7715, 384, -105}, + {-818, 105, 374}, + {-2896, -1130, 184}, + {-282, 1115, -533}, + {-4184, -377, 80}, + {-68, -1677, -206}, + {-7516, -397, -117}, + {-4674, -644, 92}, + {-9149, -353, 68}, + {591, 1721, 286}, + {-2924, 469, -106}, + {2365, 281, 173}, + {-2906, 96, 40} + }, + { + {3079, -243, 93}, + {-10737, 96, 299}, + {-7334, -216, 64}, + {-403, 570, 99}, + {-4421, 556, -173}, + {124, -1300, 291}, + {-5990, 457, 69}, + {-169, -905, -469}, + {-9723, -240, 203}, + {-5231, -29, -27}, + {-10177, 380, -53}, + {1332, 8, 772}, + {-3775, 45, 183}, + {692, 827, 289}, + {-3935, 353, 112} + }, + { + {3332, -523, 7}, + {-11371, -996, 58}, + {-6530, 203, 65}, + {256, -261, -354}, + {-5006, 314, -140}, + {288, -449, 571}, + {-7213, -213, 38}, + {96, 1081, 276}, + {-11503, -776, 339}, + {-4000, 597, 7}, + {-11476, 53, 42}, + {401, -2166, 218}, + {-5085, -748, 82}, + {-1557, -1258, -33}, + {-5015, -365, 40} + }, + { + {2204, 787, -251}, + {-11511, 162, -342}, + {-5462, -193, 32}, + {848, -1136, -169}, + {-4350, -718, 124}, + {-59, 1657, -136}, + {-7393, -36, 12}, + {129, 864, 350}, + {-12308, 770, -93}, + {-1411, -685, 21}, + {-12854, 302, 201}, + {-1003, 1344, -760}, + {-6580, 345, -70}, + {-2753, 234, -335}, + {-5681, 267, -69} + }, + { + {672, 125, -240}, + {-10440, 1453, -42}, + {-4386, 184, 4}, + {836, 590, 493}, + {-2737, 326, 240}, + {-336, 30, -729}, + {-6367, 435, 12}, + {-135, -1078, -382}, + {-11359, 824, -226}, + {1543, 701, 6}, + {-13943, -528, 89}, + {-1053, 1657, -645}, + {-7796, -70, -2}, + {-1951, 991, -222}, + {-5611, 325, -72} + }, + { + {-647, -333, 136}, + {-8616, -535, 384}, + {-3485, -101, -27}, + {-114, 1517, 367}, + {-698, 176, -34}, + {71, -2577, 199}, + {-4391, -550, 47}, + {-76, -1539, -205}, + {-8822, -1254, 106}, + {3713, -290, -5}, + {-14161, -19, -51}, + {231, -2100, 461}, + {-8465, 53, 52}, + {232, -1320, 186}, + {-4851, -558, 118} + }, + { + {-1717, -364, 289}, + {-6970, -492, 101}, + {-2888, 24, -81}, + {-1145, -1341, -474}, + {1284, 171, -381}, + {338, -1038, 754}, + {-2177, 184, -63}, + {167, 226, 467}, + {-5893, 476, 220}, + {4334, -78, -21}, + {-13253, 536, -5}, + {1039, -853, 710}, + {-8444, 226, 102}, + {2083, 39, 320}, + {-3845, 11, 157} + }, + { + {-2389, 590, 71}, + {-5775, -15, -265}, + {-2706, -126, -73}, + {-970, -1041, -639}, + {2503, -723, -316}, + {-115, 1951, -348}, + {-629, -109, -258}, + {-5, 1498, -23}, + {-3823, 240, -52}, + {3386, 483, -35}, + {-11570, -670, 139}, + {490, 1481, -44}, + {-7772, -109, 129}, + {2299, 806, -8}, + {-2893, 96, -22} + }, + { + {-2318, -317, -276}, + {-5015, 614, -137}, + {-3007, 153, 78}, + {358, 2175, 276}, + {1850, 364, 127}, + {-260, 1253, -560}, + {-658, 219, -191}, + {-155, 416, -432}, + {-3392, -377, -373}, + {1508, -577, -82}, + {-9813, 206, 162}, + {-490, -366, -455}, + {-6609, -36, -29}, + {1013, -388, -179}, + {-1998, 106, -146} + }, + { + {-1258, -1242, -142}, + {-4837, -225, 149}, + {-3714, 334, 158}, + {1231, 476, 716}, + {-1523, 1293, 331}, + {106, -1206, 339}, + {-3032, 372, 110}, + {81, -1307, 232}, + {-4883, -217, -221}, + {-356, 285, -75}, + {-8487, 46, 13}, + {-775, -668, -266}, + {-5115, -371, -160}, + {-745, 119, 1}, + {-1227, -298, -131} + }, + { + {432, 1052, 451}, + {-5310, -520, 122}, + {-4385, -572, -32}, + {663, -1795, -33}, + {-7066, -2181, 10}, + {178, -1028, 351}, + {-7808, -1495, 220}, + {102, -1158, 280}, + {-8328, -366, 292}, + {-1534, -35, -8}, + {-7577, 154, -60}, + {-170, 816, 118}, + {-3728, 511, -90}, + {-1912, -335, 58}, + {-886, 255, -11} + }, + { + {1854, 1105, 223}, + {-6046, 435, -87}, + {-4307, -110, -192}, + {-445, 167, -500}, + {-12643, 1130, -215}, + {-59, 564, -219}, + {-13733, 1753, 57}, + {-119, 455, -337}, + {-13305, 1868, 319}, + {-1904, -103, 45}, + {-6815, -188, -24}, + {535, -112, 274}, + {-3189, -216, 56}, + {-1808, 14, -111}, + {-1429, 247, 59} + }, + { + {2712, -811, -665}, + {-6406, 128, -114}, + {-3270, 535, -145}, + {-894, 908, -87}, + {-16060, -5, -40}, + {-123, 426, -221}, + {-18646, -958, -71}, + {-34, 1078, -89}, + {-18300, -1677, -130}, + {-1765, 126, 77}, + {-5979, 152, -27}, + {567, -424, 159}, + {-4065, -481, 96}, + {-488, 713, -122}, + {-3042, -603, 5} + }, + { + {3041, -1438, -568}, + {-6049, -380, 13}, + {-1993, -503, -47}, + {-514, -145, 207}, + {-16497, -516, 153}, + {1, -414, 65}, + {-20790, -128, -31}, + {116, -25, 325}, + {-21297, -177, -162}, + {-1526, -16, 81}, + {-4982, -298, -28}, + {-25, 633, -69}, + {-6260, 854, -11}, + {1122, -733, 93}, + {-5357, 534, -14} + }, + { + {2075, 1393, 597}, + {-5085, 335, 102}, + {-1725, 51, 44}, + {197, -201, -10}, + {-14579, 853, 254}, + {103, 17, 192}, + {-19819, 1014, 154}, + {-15, -998, -48}, + {-21381, 929, 242}, + {-1373, -69, 52}, + {-3939, 298, 22}, + {-541, -210, -258}, + {-8982, -676, -98}, + {1835, -33, 212}, + {-7698, -505, 7} + }, + { + {-940, 1898, 977}, + {-3884, -42, 42}, + {-3515, 787, 36}, + {716, -374, -62}, + {-11751, -492, 247}, + {33, 503, 29}, + {-16854, -1004, 334}, + {-102, -371, -284}, + {-19163, -554, 354}, + {-1163, 46, 2}, + {-3070, -77, 26}, + {-395, -604, -161}, + {-11291, 212, -46}, + {1183, 732, 71}, + {-9426, 251, 3} + }, + { + {-4612, -3074, -100}, + {-2857, -110, -155}, + {-7454, -1155, -23}, + {623, 151, 181}, + {-9289, 94, 75}, + {-95, -157, -193}, + {-13576, 336, 268}, + {64, 846, 184}, + {-15808, 526, 165}, + {-581, 150, -33}, + {-2494, -73, -58}, + {200, 660, 160}, + {-12645, 123, 119}, + {-220, -649, -144}, + {-10188, 137, 63} + }, + { + {-5690, 140, -998}, + {-2447, -18, -291}, + {-12559, 1132, 14}, + {-87, 727, 134}, + {-7673, 53, -135}, + {-43, -546, -53}, + {-11068, 89, -14}, + {59, 887, 161}, + {-12350, -510, 5}, + {544, -316, -39}, + {-2221, -8, -127}, + {506, 143, 283}, + {-13038, -26, 218}, + {-1262, 28, -187}, + {-10062, -221, 159} + }, + { + {-2490, 3069, -516}, + {-3308, 111, -173}, + {-17401, -1024, 33}, + {-749, -607, -221}, + {-6824, 209, -199}, + {78, 109, 168}, + {-9498, 29, -248}, + {-83, -151, -235}, + {-9491, 380, -107}, + {1995, 319, -59}, + {-2305, 136, -75}, + {185, -768, 29}, + {-12687, -130, 118}, + {-1274, 500, -31}, + {-9365, 3, 125} + }, + { + {2827, -2591, 470}, + {-6178, 388, 140}, + {-20704, 301, 61}, + {-636, -485, -303}, + {-6630, -334, -39}, + {46, 390, 62}, + {-8669, -439, -205}, + {-11, -681, -25}, + {-7595, -374, -135}, + {3175, -211, -95}, + {-2923, 43, 45}, + {-319, 337, -262}, + {-11717, -131, -34}, + {-456, -465, 149}, + {-8327, -52, -20} + }, + { + {6074, -80, 681}, + {-11285, -1531, 274}, + {-21801, 452, 270}, + {165, 1077, 98}, + {-7186, -64, 139}, + {-56, -171, -125}, + {-8627, 330, 46}, + {71, -81, 197}, + {-6886, 255, -28}, + {3354, 79, -59}, + {-4204, -459, 66}, + {-375, 570, -159}, + {-10238, 521, -32}, + {457, -62, 121}, + {-7057, 386, -60} + }, + { + {4887, 1749, 271}, + {-17682, 2032, 52}, + {-20752, -448, 435}, + {745, 28, 361}, + {-8449, 524, 143}, + {-50, -288, -78}, + {-9598, 252, 221}, + {-16, 562, -49}, + {-7398, 39, 149}, + {2060, 239, 85}, + {-5966, 578, -22}, + {9, -462, 132}, + {-8577, -508, 71}, + {892, 237, -66}, + {-5779, -404, 21} + }, + { + {451, -2222, -219}, + {-23410, -1053, -110}, + {-17832, 280, 261}, + {473, -903, 68}, + {-9905, -606, 0}, + {40, 219, 94}, + {-11363, -751, 179}, + {-58, 261, -160}, + {-8673, -557, 199}, + {-515, -768, 176}, + {-7752, -325, -57}, + {306, -146, 165}, + {-7168, 193, 98}, + {768, 41, -104}, + {-4820, 159, 67} + }, + { + {-3764, 1115, -599}, + {-26720, -202, 111}, + {-13162, -779, -68}, + {-228, 332, -222}, + {-10718, 16, -70}, + {50, 232, 83}, + {-12961, 631, -1}, + {39, -446, 110}, + {-9637, 596, 4}, + {-3314, 976, 62}, + {-9174, 50, 27}, + {221, 306, 19}, + {-6226, 4, 31}, + {264, -65, 38}, + {-4357, 55, 40} + }, + { + {-4746, 1286, -412}, + {-27070, 633, 432}, + {-7071, 1585, -176}, + {-588, 252, -157}, + {-10283, 556, 66}, + {-25, -197, -63}, + {-13124, 208, -84}, + {36, -470, 98}, + {-8995, 327, -156}, + {-4789, -307, -118}, + {-10122, -49, 127}, + {-84, -186, -76}, + {-5611, 37, -25}, + {-368, -242, 91}, + {-4259, -90, -4} + }, + { + {-2346, -2123, 305}, + {-24926, -453, 457}, + {-626, -1711, -39}, + {-340, -398, 16}, + {-8663, -448, 161}, + {-47, -123, -82}, + {-11192, -943, 23}, + {-52, 174, -147}, + {-6209, -1191, -62}, + {-3889, -724, -114}, + {-10681, 161, 127}, + {-261, -8, -98}, + {-4982, -182, -19}, + {-776, 281, -24}, + {-4165, -34, -14} + }, + { + {942, 488, 598}, + {-20984, 475, 170}, + {4589, 981, 77}, + {194, 219, 113}, + {-6378, 306, 45}, + {9, 209, 29}, + {-7658, 975, 106}, + {-8, 502, -19}, + {-2076, 1177, 77}, + {-948, 1099, 13}, + {-10871, -64, 73}, + {-131, 247, -45}, + {-4035, 307, 20}, + {-648, 102, -112}, + {-3695, 200, 12} + }, + { + {2654, 930, 127}, + {-15682, -1182, -52}, + {7382, -5, 10}, + {464, 143, 78}, + {-3982, -512, -54}, + {47, 26, 89}, + {-3773, -784, 69}, + {50, 79, 142}, + {1817, -692, 73}, + {2421, -739, 45}, + {-10507, -272, 107}, + {140, -268, 75}, + {-2625, -395, 59}, + {-36, -407, -48}, + {-2635, -334, 44} + }, + { + {2265, -673, -323}, + {-9266, 1969, 120}, + {7696, -543, -165}, + {256, -178, 12}, + {-1867, 669, 53}, + {1, -259, -7}, + {-655, 638, 87}, + {-17, -419, -51}, + {4142, 188, 17}, + {4341, 218, 22}, + {-9173, 555, 246}, + {226, -72, 133}, + {-709, 426, 74}, + {583, 291, 75}, + {-967, 399, 55} + }, + { + {765, -37, -222}, + {-2013, -1568, 357}, + {6550, 407, -251}, + {-156, 156, 4}, + {-89, -363, 207}, + {-48, 15, -102}, + {1394, -284, 184}, + {-38, -277, -103}, + {4612, 169, 19}, + {3789, 332, 92}, + {-6276, -517, 268}, + {32, 388, 18}, + {1710, -342, 1}, + {700, 81, 126}, + {1171, -343, -1} + }, + { + {-648, 58, 80}, + {5707, 268, -107}, + {5224, -76, -177}, + {-385, -296, -111}, + {1740, -225, 55}, + {-5, 304, -2}, + {3038, -341, 40}, + {36, 263, 105}, + {4068, -463, -10}, + {1197, -956, 146}, + {-1364, 367, -120}, + {-189, -224, -158}, + {4477, 290, -203}, + {236, -400, 59}, + {3483, 280, -145} + }, + { + {-1288, 252, 99}, + {13201, -389, -1137}, + {4397, -35, -85}, + {-224, -239, -210}, + {4111, 233, -471}, + {51, -27, 118}, + {5241, 451, -555}, + {13, 438, 36}, + {3781, 564, -275}, + {-1732, 1214, -56}, + {5132, -935, -761}, + {-154, -353, -132}, + {7045, -529, -373}, + {-374, 427, -105}, + {5438, -394, -253} + }, + { + {-1037, -89, -111}, + {18750, 2704, -1162}, + {3934, 90, -31}, + {224, 1069, 181}, + {6831, 1057, -736}, + {0, -393, -15}, + {8090, 1086, -942}, + {-44, 31, -124}, + {4419, 247, -578}, + {-3086, -426, -420}, + {11225, 2464, -738}, + {94, 560, 155}, + {8384, 848, -177}, + {-576, 48, -218}, + {6291, 537, -104} + }, + { + {-216, -629, -93}, + {19548, -3226, 746}, + {3286, -103, 102}, + {380, 470, 421}, + {8554, -2320, 74}, + {-52, -86, -131}, + {10102, -2978, 17}, + {23, -446, 68}, + {5418, -1788, -150}, + {-2117, -1367, -348}, + {13823, -2651, 576}, + {182, 382, 216}, + {7462, -282, 376}, + {-206, -756, -20}, + {5422, -37, 250} + }, + { + {541, 612, 242}, + {13653, -2953, 2097}, + {2065, -394, 219}, + {-64, -1603, -303}, + {7487, 87, 1202}, + {28, 491, 94}, + {8996, 492, 1549}, + {12, -515, 35}, + {5266, 1034, 909}, + {105, 2095, 462}, + {10754, -1920, 1562}, + {-31, -744, -180}, + {4191, -1752, 495}, + {293, 369, 306}, + {2940, -1284, 284} + }, + { + {607, 781, 195}, + {3124, 9882, -591}, + {462, 1049, -1}, + {-253, -1381, -341}, + {3267, 4803, 346}, + {19, 594, 44}, + {3999, 6051, 559}, + {-25, -241, -73}, + {2863, 3184, 653}, + {1442, 638, 802}, + {3288, 7390, -364}, + {-114, -731, -157}, + {79, 2912, -451}, + {313, 935, 95}, + {25, 1835, -324} + }, + { + {92, -845, -332}, + {-5015, -1630, -3669}, + {-761, -525, -398}, + {4, 456, 347}, + {-1410, -3227, -1909}, + {-16, 322, -56}, + {-1776, -4432, -2452}, + {5, -24, 16}, + {-606, -3655, -1345}, + {854, -2853, -396}, + {-3161, -1854, -2816}, + {1, 146, 171}, + {-2324, 379, -1060}, + {-8, -275, -302}, + {-1599, 338, -656} + } }; -const Word16 hrtfShCoeffsRe_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS] /* Q14 */= -{ -{ -{ -15262, 9658, 3901, -1418, -6208, 15041, 14881, 14660, 14204, 13703, 13419, 13245, 13095, 12861, 12511, 12433, 12732, 13082, 13228, 13103, 12857, 12674, 12535, 12386, 12244, 12154, 12223, 12430, 12577, 12569, 12440, 12235, 11999, 11774, 11585, 11429, 11326, 11309, 11365, 11424, 11437, 11421, 11438, 11534, 11703, 11911, 12128, 12307, 12428, 12507, 12560, 7803, 353, 233, 185, 159, 141, 129, 120, 114, -}, -{ -2512, 7073, 3663, -4932, -11832, 9125, 9258, 9001, 9549, 10692, 11890, 12599, 12894, 13032, 13105, 13144, 13280, 13430, 13430, 13294, 13274, 13495, 13890, 14466, 15013, 15123, 14698, 13966, 13231, 12756, 12530, 12357, 12159, 11993, 11874, 11774, 11758, 11938, 12322, 12777, 13151, 13382, 13513, 13613, 13702, 13762, 13802, 13836, 13861, 13868, 13854, 8509, 224, 69, 10, -28, -57, -78, -93, -103, -}, -{ -1909, 491, -1490, -1812, -1939, 2695, 2572, 2313, 2118, 1834, 2422, 3343, 4702, 6558, 8164, 8525, 7404, 5240, 2686, 530, -697, -985, -667, -226, 2, -88, -459, -927, -1247, -1175, -592, 364, 1309, 1920, 2178, 2250, 2242, 2154, 2001, 1848, 1750, 1670, 1488, 1132, 617, -25, -757, -1460, -2044, -2505, -2833, -1911, -67, -26, -8, 1, 8, 12, 16, 18, -}, -{ -1352, 749, -1645, -2697, -3639, 3522, 4737, 6008, 7651, 8786, 8842, 8532, 7930, 6997, 6499, 6176, 5536, 4673, 3558, 2162, 759, -365, -1149, -1511, -1268, -292, 1348, 3286, 5013, 6292, 7162, 7818, 8446, 9053, 9451, 9438, 9056, 8541, 8111, 7870, 7802, 7835, 7891, 7901, 7800, 7533, 7097, 6592, 6120, 5726, 5439, 3221, 144, 100, 82, 71, 64, 60, 56, 54, -}, +/* Binaural rendering data set based on BRIRs + * Tables derived from Mozart IIS BRIRs.*/ +const Word16 FASTCONV_factor_Q_BRIR_latency_s_fx = 31; +const Word32 FASTCONV_BRIR_latency_s_fx = 2013266; +const Word16 FASTCONV_factor_Q_BRIR_fx= 15; +const Word16 leftBRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]= { -57, -757, -2771, -4035, -4237, 2024, 3174, 4548, 5873, 6766, 6152, 5490, 5138, 4788, 4745, 4906, 4987, 4705, 3868, 2359, 537, -1152, -2449, -3071, -2949, -2363, -1674, -1022, -389, 245, 847, 1472, 2246, 3043, 3445, 3217, 2621, 2163, 2162, 2601, 3254, 3888, 4376, 4728, 5014, 5258, 5411, 5446, 5386, 5256, 5093, 3070, 89, 31, 7, -8, -19, -26, -32, -36, -}, -{ --227, 335, -2902, -2520, -2019, 593, 199, -974, -1944, -2169, -1372, -472, 171, 1206, 2475, 2936, 2001, -88, -2808, -5241, -6657, -7056, -6750, -5825, -4122, -1873, 115, 1229, 1485, 1330, 1220, 1326, 1481, 1383, 984, 499, 99, -181, -337, -313, -61, 337, 681, 803, 661, 271, -292, -881, -1388, -1800, -2101, -1437, -88, -60, -48, -41, -36, -33, -30, -28, -}, -{ --181, 1118, 2818, 3684, 3341, -2320, -2914, -2841, -2539, -2909, -3164, -3287, -3378, -3519, -3097, -1559, 673, 2638, 3664, 3564, 2365, 323, -2103, -4328, -5612, -5607, -4829, -4102, -4010, -4659, -5684, -6646, -7402, -8060, -8598, -8842, -8709, -8308, -7828, -7397, -7045, -6717, -6318, -5790, -5143, -4430, -3746, -3199, -2822, -2574, -2418, -1452, -44, -12, -1, 5, 10, 13, 16, 18, -}, -{ -208, -2005, -2657, -802, -194, -102, -968, -1233, -646, -223, 744, 1312, 1694, 2070, 2354, 2369, 2478, 3045, 3905, 4811, 5328, 5086, 4068, 2061, -1074, -4579, -7300, -8665, -8731, -7878, -6590, -5212, -3825, -2394, -1030, 56, 773, 1236, 1633, 2036, 2393, 2634, 2747, 2794, 2872, 3044, 3287, 3523, 3706, 3825, 3872, 2400, 105, 58, 38, 25, 17, 10, 6, 3, -}, -{ -482, 4180, 6357, 5316, 2943, 2790, 3261, 4049, 3526, 1759, 136, -746, -1202, -1670, -2389, -3083, -3580, -3766, -3721, -3504, -3243, -3066, -2918, -3002, -3503, -3982, -3623, -2223, -366, 1255, 2487, 3507, 4413, 5157, 5639, 5817, 5677, 5265, 4686, 4057, 3483, 3033, 2731, 2550, 2440, 2349, 2225, 2057, 1876, 1711, 1600, 884, 71, 81, 83, 86, 88, 90, 91, 92, -}, -{ --673, -4039, -7432, -9477, -7969, 1394, 1273, 1722, 1589, 743, 341, 266, 539, 698, 553, 268, -124, -490, -812, -1179, -1505, -1515, -1122, -772, -964, -1612, -2162, -2151, -1583, -741, 264, 1455, 2771, 3973, 4716, 4876, 4665, 4453, 4496, 4789, 5164, 5472, 5666, 5811, 5978, 6177, 6329, 6365, 6295, 6135, 5908, 3542, 61, -23, -57, -79, -95, -107, -117, -123, -}, -{ --25, 563, -1623, -937, 97, 143, 46, -388, 38, 771, 1168, 1016, 925, 1244, 1570, 1830, 2133, 2599, 3152, 3747, 4305, 4670, 4517, 3350, 1238, -1011, -2726, -3794, -4328, -4495, -4472, -4379, -4176, -3806, -3362, -3028, -2910, -2898, -2744, -2281, -1517, -604, 262, 937, 1394, 1727, 2068, 2457, 2851, 3224, 3538, 2357, 106, 60, 40, 29, 21, 15, 10, 7, -}, -{ --464, -2594, -6346, -3429, -2268, 408, 1246, 1126, 1423, 370, -768, -1616, -2586, -3550, -3776, -2915, -929, 1628, 3769, 4801, 4500, 3094, 888, -1968, -4831, -6457, -6194, -4598, -2800, -1518, -815, -597, -860, -1539, -2336, -2878, -3022, -2910, -2795, -2844, -3057, -3281, -3324, -3088, -2606, -1980, -1341, -824, -474, -262, -174, -76, -24, -40, -47, -52, -57, -60, -63, -65, -}, -{ --205, -401, 437, 1642, 494, -311, -32, 875, 1027, 701, 615, 704, 534, -104, -1146, -2140, -2371, -1570, 320, 2713, 4714, 5885, 6067, 5127, 3396, 1693, 561, 43, 10, 282, 725, 1147, 1259, 823, -236, -1691, -3113, -4191, -4872, -5275, -5531, -5700, -5772, -5722, -5552, -5275, -4867, -4361, -3849, -3371, -2970, -1636, -72, -50, -39, -32, -27, -24, -22, -21, -}, -{ --585, -463, 924, 2364, 1444, -871, -1456, -1290, -1372, -1161, -722, -1056, -1376, -1142, -1080, -1076, -469, 674, 1657, 2449, 2920, 3102, 3447, 4242, 5372, 6064, 5466, 3614, 1237, -1079, -3078, -4664, -5730, -6180, -5973, -5235, -4293, -3464, -2894, -2547, -2265, -1879, -1315, -667, -121, 182, 242, 175, 84, 27, 23, 16, -14, -7, -3, -1, 0, 2, 3, 4, -}, -{ -108, -471, -1814, 888, 813, -1341, -518, 44, 1291, 1663, 1231, 744, 898, 1175, 1132, 992, 1153, 1783, 2823, 3915, 4657, 5033, 5245, 5052, 3755, 1132, -2032, -4707, -6378, -7010, -6834, -6122, -4960, -3218, -1003, 1201, 2935, 4075, 4749, 5071, 5039, 4652, 3991, 3191, 2419, 1815, 1415, 1186, 1070, 1013, 977, 562, 29, 21, 18, 15, 13, 11, 10, 9, -}, -{ -1, 232, -515, -204, 275, -374, -1326, -2166, -2161, -2251, -1547, -696, -539, -756, -795, -979, -1389, -1454, -1000, -231, 661, 1631, 2559, 3165, 3164, 2711, 2425, 2692, 3254, 3766, 4170, 4506, 4702, 4810, 5123, 5773, 6496, 6846, 6578, 5791, 4779, 3827, 3101, 2583, 2096, 1493, 771, 59, -528, -962, -1225, -872, -36, -12, 0, 7, 12, 16, 19, 21, -}, -}, -{ -{ -15262, 9658, 3901, -1418, -6208, 15041, 14881, 14660, 14204, 13703, 13419, 13245, 13095, 12861, 12511, 12433, 12732, 13082, 13228, 13103, 12857, 12674, 12535, 12386, 12244, 12154, 12223, 12430, 12577, 12569, 12440, 12235, 11999, 11774, 11585, 11429, 11326, 11309, 11365, 11424, 11437, 11421, 11438, 11534, 11703, 11911, 12128, 12307, 12428, 12507, 12560, 7803, 353, 233, 185, 159, 141, 129, 120, 114, -}, -{ --2512, -7073, -3663, 4932, 11832, -9125, -9258, -9001, -9549, -10692, -11890, -12599, -12894, -13032, -13105, -13144, -13280, -13430, -13430, -13294, -13274, -13495, -13890, -14466, -15013, -15123, -14698, -13966, -13231, -12756, -12530, -12357, -12159, -11993, -11874, -11774, -11758, -11938, -12322, -12777, -13151, -13382, -13513, -13613, -13702, -13762, -13802, -13836, -13861, -13868, -13854, -8509, -224, -69, -10, 28, 57, 78, 93, 103, -}, -{ -1909, 491, -1490, -1812, -1939, 2695, 2572, 2313, 2118, 1834, 2422, 3343, 4702, 6558, 8164, 8525, 7404, 5240, 2686, 530, -697, -985, -667, -226, 2, -88, -459, -927, -1247, -1175, -592, 364, 1309, 1920, 2178, 2250, 2242, 2154, 2001, 1848, 1750, 1670, 1488, 1132, 617, -25, -757, -1460, -2044, -2505, -2833, -1911, -67, -26, -8, 1, 8, 12, 16, 18, -}, -{ -1352, 749, -1645, -2697, -3639, 3522, 4737, 6008, 7651, 8786, 8842, 8532, 7930, 6997, 6499, 6176, 5536, 4673, 3558, 2162, 759, -365, -1149, -1511, -1268, -292, 1348, 3286, 5013, 6292, 7162, 7818, 8446, 9053, 9451, 9438, 9056, 8541, 8111, 7870, 7802, 7835, 7891, 7901, 7800, 7533, 7097, 6592, 6120, 5726, 5439, 3221, 144, 100, 82, 71, 64, 60, 56, 54, -}, -{ --57, 757, 2771, 4035, 4237, -2024, -3174, -4548, -5873, -6766, -6152, -5490, -5138, -4788, -4745, -4906, -4987, -4705, -3868, -2359, -537, 1152, 2449, 3071, 2949, 2363, 1674, 1022, 389, -245, -847, -1472, -2246, -3043, -3445, -3217, -2621, -2163, -2162, -2601, -3254, -3888, -4376, -4728, -5014, -5258, -5411, -5446, -5386, -5256, -5093, -3070, -89, -31, -7, 8, 19, 26, 32, 36, -}, -{ -227, -335, 2902, 2520, 2019, -593, -199, 974, 1944, 2169, 1372, 472, -171, -1206, -2475, -2936, -2001, 88, 2808, 5241, 6657, 7056, 6750, 5825, 4122, 1873, -115, -1229, -1485, -1330, -1220, -1326, -1481, -1383, -984, -499, -99, 181, 337, 313, 61, -337, -681, -803, -661, -271, 292, 881, 1388, 1800, 2101, 1437, 88, 60, 48, 41, 36, 33, 30, 28, -}, -{ --181, 1118, 2818, 3684, 3341, -2320, -2914, -2841, -2539, -2909, -3164, -3287, -3378, -3519, -3097, -1559, 673, 2638, 3664, 3564, 2365, 323, -2103, -4328, -5612, -5607, -4829, -4102, -4010, -4659, -5684, -6646, -7402, -8060, -8598, -8842, -8709, -8308, -7828, -7397, -7045, -6717, -6318, -5790, -5143, -4430, -3746, -3199, -2822, -2574, -2418, -1452, -44, -12, -1, 5, 10, 13, 16, 18, -}, -{ -208, -2005, -2657, -802, -194, -102, -968, -1233, -646, -223, 744, 1312, 1694, 2070, 2354, 2369, 2478, 3045, 3905, 4811, 5328, 5086, 4068, 2061, -1074, -4579, -7300, -8665, -8731, -7878, -6590, -5212, -3825, -2394, -1030, 56, 773, 1236, 1633, 2036, 2393, 2634, 2747, 2794, 2872, 3044, 3287, 3523, 3706, 3825, 3872, 2400, 105, 58, 38, 25, 17, 10, 6, 3, -}, -{ -482, 4180, 6357, 5316, 2943, 2790, 3261, 4049, 3526, 1759, 136, -746, -1202, -1670, -2389, -3083, -3580, -3766, -3721, -3504, -3243, -3066, -2918, -3002, -3503, -3982, -3623, -2223, -366, 1255, 2487, 3507, 4413, 5157, 5639, 5817, 5677, 5265, 4686, 4057, 3483, 3033, 2731, 2550, 2440, 2349, 2225, 2057, 1876, 1711, 1600, 884, 71, 81, 83, 86, 88, 90, 91, 92, -}, -{ -673, 4039, 7432, 9477, 7969, -1394, -1273, -1722, -1589, -743, -341, -266, -539, -698, -553, -268, 124, 490, 812, 1179, 1505, 1515, 1122, 772, 964, 1612, 2162, 2151, 1583, 741, -264, -1455, -2771, -3973, -4716, -4876, -4665, -4453, -4496, -4789, -5164, -5472, -5666, -5811, -5978, -6177, -6329, -6365, -6295, -6135, -5908, -3542, -61, 23, 57, 79, 95, 107, 117, 123, -}, -{ -25, -563, 1623, 937, -97, -143, -46, 388, -38, -771, -1168, -1016, -925, -1244, -1570, -1830, -2133, -2599, -3152, -3747, -4305, -4670, -4517, -3350, -1238, 1011, 2726, 3794, 4328, 4495, 4472, 4379, 4176, 3806, 3362, 3028, 2910, 2898, 2744, 2281, 1517, 604, -262, -937, -1394, -1727, -2068, -2457, -2851, -3224, -3538, -2357, -106, -60, -40, -29, -21, -15, -10, -7, -}, -{ -464, 2594, 6346, 3429, 2268, -408, -1246, -1126, -1423, -370, 768, 1616, 2586, 3550, 3776, 2915, 929, -1628, -3769, -4801, -4500, -3094, -888, 1968, 4831, 6457, 6194, 4598, 2800, 1518, 815, 597, 860, 1539, 2336, 2878, 3022, 2910, 2795, 2844, 3057, 3281, 3324, 3088, 2606, 1980, 1341, 824, 474, 262, 174, 76, 24, 40, 47, 52, 57, 60, 63, 65, -}, -{ --205, -401, 437, 1642, 494, -311, -32, 875, 1027, 701, 615, 704, 534, -104, -1146, -2140, -2371, -1570, 320, 2713, 4714, 5885, 6067, 5127, 3396, 1693, 561, 43, 10, 282, 725, 1147, 1259, 823, -236, -1691, -3113, -4191, -4872, -5275, -5531, -5700, -5772, -5722, -5552, -5275, -4867, -4361, -3849, -3371, -2970, -1636, -72, -50, -39, -32, -27, -24, -22, -21, -}, -{ --585, -463, 924, 2364, 1444, -871, -1456, -1290, -1372, -1161, -722, -1056, -1376, -1142, -1080, -1076, -469, 674, 1657, 2449, 2920, 3102, 3447, 4242, 5372, 6064, 5466, 3614, 1237, -1079, -3078, -4664, -5730, -6180, -5973, -5235, -4293, -3464, -2894, -2547, -2265, -1879, -1315, -667, -121, 182, 242, 175, 84, 27, 23, 16, -14, -7, -3, -1, 0, 2, 3, 4, -}, -{ -108, -471, -1814, 888, 813, -1341, -518, 44, 1291, 1663, 1231, 744, 898, 1175, 1132, 992, 1153, 1783, 2823, 3915, 4657, 5033, 5245, 5052, 3755, 1132, -2032, -4707, -6378, -7010, -6834, -6122, -4960, -3218, -1003, 1201, 2935, 4075, 4749, 5071, 5039, 4652, 3991, 3191, 2419, 1815, 1415, 1186, 1070, 1013, 977, 562, 29, 21, 18, 15, 13, 11, 10, 9, -}, -{ -1, 232, -515, -204, 275, -374, -1326, -2166, -2161, -2251, -1547, -696, -539, -756, -795, -979, -1389, -1454, -1000, -231, 661, 1631, 2559, 3165, 3164, 2711, 2425, 2692, 3254, 3766, 4170, 4506, 4702, 4810, 5123, 5773, 6496, 6846, 6578, 5791, 4779, 3827, 3101, 2583, 2096, 1493, 771, 59, -528, -962, -1225, -872, -36, -12, 0, 7, 12, 16, 19, 21, -} -} + { + { + 58, -3442, 4367, -440, 907, -18, -1571, -1474, -586, 469, + 241, 999, 1474, 186, -1134, 617, 68, 1100, -545, -1085, + 149, -238, -672, -408, -114, -226, 109, 904, -128, 564, + 239, -285, -526, 412, 508, 53, -830, -255, 857, 714, + 578, -1153, -780, -169, 238, 238, 78, -220, -40, -470, + -298, -67, 377, 228, -149, 274, 718, 385, 61, 204, + -66, -186, -107, -227, -230, -263, -596, -665, -245, 297, + 227, 259, 429, 53, 448, 296, 211, 69, 13, -180, + -28, -94, -151, -266, -234, -45, -83, -162, -96, 126, + 182, 73, -38, -60, -39, 173 + }, + { + -80, -2736, 3223, 1228, -445, 453, -1228, -1588, -961, 441, + 231, 599, 1407, 506, -291, -570, -213, 1390, 394, -951, + -236, -198, -889, 267, -1152, 71, -277, 302, 447, 1008, + 432, -592, -157, 395, 963, -462, -569, -108, 82, 524, + 249, -809, -296, 86, -274, -373, 664, 178, -221, -553, + -73, 56, -38, 47, 228, 194, 489, 230, 384, 125, + 173, -231, -252, 29, -225, -558, -439, -583, -129, -112, + 73, 353, 244, 280, 400, 435, 264, 390, -1, -249, + -85, -259, -227, -300, -279, -29, -121, -174, -18, 152, + 177, 122, -45, 220, -44, 0 + }, + { + 52, -3147, 4003, -212, 732, -1, -2087, -648, 409, -1023, + 243, 776, 1062, 26, 451, 516, -732, 308, 355, -294, + 278, 443, -1025, -746, -1069, -782, -1126, 772, 1081, 1938, + -72, 175, 510, -392, -305, -156, 241, -413, -221, -151, + 1060, -65, -590, -395, 14, 315, 22, -591, -863, -193, + 148, 292, 304, 257, 440, -30, -289, 506, 1004, 551, + -6, -275, -465, -72, -161, -756, -351, -643, -412, -506, + -78, 361, 459, 497, 505, 427, 664, 260, 209, -45, + -209, -343, -346, -162, -216, -397, -239, 41, 272, 140, + -107, 56, -109, -88, -196, -63 + }, + { + 0, -909, 2527, -1493, 1057, -292, -924, -756, -906, -916, + 1351, 781, 1817, 48, -112, -470, -960, 453, 29, 131, + 369, -951, -1264, 1323, 647, -1179, -1114, 1109, 878, -39, + -469, 297, 243, -414, -64, 408, 119, -111, 167, -254, + 231, 142, -656, 195, -141, -371, -14, 370, 188, -394, + 128, 273, -433, 26, 201, -95, 366, 116, 55, 77, + -162, -111, 33, -69, -74, -209, -91, -170, -71, -143, + 244, 190, 303, 202, 27, 58, -160, 57, -136, -3, + -122, -38, 35, -80, 68, -120, -105, -12, 22, 71, + -39, -70, 104, 120, 92, 78 + }, + { + -5, -2303, 2980, 1074, -1002, 683, -944, -1034, -1227, -881, + 1228, 765, 1681, 98, -118, -113, -905, 480, 870, -1028, + 150, -883, -588, 702, 626, -1659, 283, 933, 705, 234, + -928, 19, 152, -216, 154, -109, -273, 1072, -56, -89, + 28, -312, -473, 283, 58, -114, -882, 147, 582, 275, + -57, -160, -71, 240, -178, 74, -7, 277, 216, -170, + -209, -125, 237, 196, -235, -188, -393, -15, -77, -81, + 15, 276, 292, 194, 226, -12, 146, -83, 34, -368, + -66, -40, 47, -118, -40, -24, -25, -178, 14, 80, + 14, -17, -9, 113, 183, 133 + }, + { + 26, -1113, 3153, -2211, 1516, -405, -1532, -706, -718, 411, + -652, 967, 2299, 1242, 265, 156, -2485, -777, 541, 801, + -1360, -1195, 274, 1327, -113, 1070, -485, -848, -92, 68, + -66, 1260, 567, -158, -1427, 183, 219, 348, -23, -373, + -1173, 736, 316, -31, -477, 240, 202, 86, 195, 431, + 42, 114, 194, 71, -234, -500, -759, -178, 46, 64, + -206, 20, -57, 405, 213, 271, -199, 102, 158, 314, + 159, 336, -182, -117, -124, -187, -248, -291, -291, -138, + -120, 187, 297, 265, 215, -42, -317, -140, 71, 104, + 132, 183, 143, -16, -27, -41 + }, + { + -93, -2024, 2646, 1338, -1131, 735, -805, -1228, -1037, -597, + 333, 46, 1739, 2222, 374, -386, -1486, -999, 297, 950, + -614, -1599, -656, 1208, 1082, 65, -694, 296, 214, -710, + 42, 1493, 271, -783, -894, 139, 175, 300, -37, -761, + -316, 690, 285, -612, -50, 369, 69, 22, -100, 236, + 661, -74, 447, -162, -412, -517, -210, -370, 33, -433, + -45, -37, 547, 286, 307, 44, -2, -238, 151, 156, + 216, 252, 42, 32, -344, -253, -27, -245, -190, -156, + -27, 119, 203, 79, 122, -28, -144, -95, 27, 204, + 88, 138, 48, -129, -23, -19 + }, + { + 46, -1472, 3502, -2140, 1231, -318, -970, -749, -1205, -100, + -247, 2224, 1775, 247, -412, -130, -1001, 1612, -672, -1456, + -835, -289, -463, -367, 2312, 985, -751, -1004, 336, 61, + 356, 380, 136, 727, -408, -827, 136, 70, -435, -433, + -345, -428, 282, 950, -336, -33, 8, 869, -41, 158, + 98, 481, 309, 18, -536, -590, -639, -880, -155, 63, + -84, 331, 174, 116, 282, 634, 423, -287, 8, 254, + 326, 231, -34, -451, -266, -193, -475, -445, -119, -96, + 74, 227, 341, 246, 81, -23, -113, -133, 66, 263, + 216, 217, 39, -155, -168, -105 + }, + { + -114, -1804, 2471, 1192, -1048, 1079, -1165, -1312, -1048, -282, + -147, 700, 1820, 1442, -453, 604, -911, -144, 231, -842, + -1105, -232, -617, -802, 2175, 1640, -606, -1957, 542, 244, + 1175, 207, -5, 293, -1130, -139, 488, -390, -359, -558, + -91, 282, -37, 410, 1, 29, 96, 132, 586, 112, + -479, 845, 562, -122, -452, -643, -494, -1090, -184, 135, + -164, 302, 263, 419, 404, 277, 254, -209, -101, 218, + 424, 98, 103, -297, -433, -218, -244, -428, -165, 74, + 145, 208, -1, 304, 22, -137, -166, -20, 212, 435, + 100, 82, 63, -236, -274, 1 + }, + { + 97, -2111, 3265, 235, -291, -2499, 1266, -238, -21, -431, + -941, 1447, 276, -721, 558, -291, 957, -7, 383, -212, + 1129, -911, -301, -189, -2074, 120, -118, 609, 2, 983, + -987, 373, 154, -102, 854, 340, -254, 45, 706, 598, + -389, -1156, -734, -708, 684, -150, 963, 270, -136, -735, + -347, -166, 175, 279, 170, 334, 92, -109, -123, -275, + 242, 321, 297, 161, 67, -219, -458, -120, -381, -151, + -187, -86, -67, 173, 258, 232, 319, 201, 191, 10, + 119, -133, -243, 84, -12, -208, -74, -203, -290, -41, + 74, -103, 131, 90, 57, -59 + }, + { + 52, -2493, 3761, 267, -743, -2139, 402, 548, 568, -1272, + -290, 1567, 136, -310, -98, 638, 11, -454, 853, -642, + 939, -565, -1572, 22, -1459, 390, 682, 594, 744, 870, + -87, -15, -344, -511, 414, -227, -172, 57, -135, -570, + 10, -515, -119, 517, 778, 341, 895, -261, -787, -320, + -1200, -158, 486, 831, 544, 412, -329, 141, -748, -52, + -400, 547, 229, 123, -273, -507, -44, 36, 46, 112, + 7, 56, -235, 60, 327, 333, 88, -125, 183, -34, + 35, -264, -349, -171, -37, -150, -122, 168, 7, 234, + 205, 132, 162, -46, -155, -56 + }, + { + -207, -674, 2549, -450, -991, -1877, 1895, -300, -323, -200, + -1717, 1445, 122, 1815, 1013, -613, -1151, 134, -779, -634, + 398, 358, -245, 597, -1039, 1297, -188, 752, -1698, -58, + 466, 544, -18, 252, -439, -760, -373, -127, 857, -408, + -127, 979, 606, -245, 621, 184, 74, -235, -222, 5, + -707, -502, -372, -357, -244, -518, 162, 476, 479, 988, + 285, -116, -234, -102, -35, -119, 29, 452, 196, -24, + 35, -157, 97, -204, -410, -300, -391, -241, -104, 136, + 22, 166, 176, 390, 160, 293, 346, 213, -128, 35, + -133, -319, -349, -286, -267, -84 + }, + { + 2, -2743, 3779, 739, -771, -1264, -406, 1178, -812, -97, + -2743, 1997, 724, 400, 1955, 268, -1060, -1334, 575, -1163, + 557, -94, 317, 58, -760, 371, 494, 18, -270, -715, + 656, 537, 749, -36, -1050, -940, -451, 220, -62, -106, + 825, 946, 359, -566, 445, 192, 302, 122, -100, -9, + -628, -741, -896, -248, -220, -246, 599, 151, 388, 540, + 259, 160, -210, 54, 165, -208, 54, 315, 408, -291, + -95, 44, -76, -188, -552, -287, -257, -289, -23, 68, + 195, 201, 298, 169, 354, 245, 203, 85, 28, -47, + -152, -73, -330, -310, -252, -201 + }, + { + -168, -888, 2680, -360, -475, -2342, 1972, -831, -82, 86, + -1404, 1023, 1376, 468, -854, 742, -477, -810, 101, 735, + -212, 816, -677, -326, -109, 86, -458, -450, 226, -28, + -454, 115, 196, 205, -171, 1230, -176, 313, 632, 258, + -257, -1062, -879, 494, -594, 197, 700, 298, -24, 193, + -734, -125, -629, -542, 427, 538, 306, 194, 20, 124, + -252, 114, 279, 368, -81, -199, -251, -392, -176, 101, + -6, 271, -117, -49, -114, -17, -62, -67, 254, 245, + 83, 124, 83, -33, -114, 32, -130, -108, -114, -157, + 27, -100, -2, 43, 2, 17 + }, + { + 84, -2322, 3438, 98, -29, -1703, 134, 427, -1154, 680, + -1091, 527, 626, 1150, -971, 980, -227, -482, -333, 51, + 836, 386, -778, -602, -846, 232, 164, 218, 236, 93, + -585, 822, -151, -617, -103, 828, -9, 342, 263, 301, + -506, -540, -451, -17, 190, 58, 608, 195, 282, -495, + -991, -159, 258, -245, 244, 245, 189, 241, 85, -283, + -55, 160, 83, 44, 205, -225, 186, 70, -499, 12, + -21, -47, -151, 5, 60, -49, -128, 32, 247, 165, + 148, 10, -16, 145, 100, -92, -168, -302, -194, 98, + -10, 51, 69, -31, -46, 18 + } + }, + { + { + -220, -6301, -477, 1370, 1853, -309, -339, 92, -318, -22, + 272, 184, 62, 188, 41, 924, -331, 457, -454, -303, + 360, 52, -424, 110, 842, 675, 20, 720, 87, 503, + 244, 39, -544, 251, 242, 342, 38, -144, 395, 264, + 711, 183, 169, -269, 21, 346, 202, -128, 18, -147, + 46, 8, 128, 48, -156, -233, 20, -81, -193, 38, + -143, -63, 56, -113, 99, 40, -59, -92, -62, 219, + -59, -84, 196, -101, 25, 17, 210, 20, 115, 32, + 28, 40, 42, 2, -40, 81, 4, -34, 2, 89, + 168, 100, -59, -87, -80, 130 + }, + { + 147, -351, 3277, 1442, 372, 200, -552, -78, 29, 510, + 219, -247, 249, 181, 19, -1013, -954, 389, -211, -488, + 197, -376, -778, 1078, -468, -318, -444, 422, 292, 135, + 140, -89, 447, -280, 437, -380, -291, 204, -254, -267, + -59, -88, 246, 212, -168, -186, 452, -38, -175, -46, + 424, 24, -216, -91, -224, -185, 302, -89, 117, 31, + 319, 23, -142, -64, -9, -228, -140, -213, 13, -188, + -87, 136, -64, -67, 83, 39, -185, 94, 67, 10, + 48, -164, 51, 96, -35, -3, -59, 46, 61, -68, + -26, 120, -49, 126, -68, 18 + }, + { + -78, -3416, 2178, 1216, 1748, 6, -784, -219, 144, 1, + 819, -91, 62, -197, 207, -194, -471, 785, 787, 122, + -48, 211, -478, -50, -132, 351, -343, 196, -472, 371, + -572, 56, 157, -147, -214, -369, -84, -232, 194, -356, + 534, -151, -273, -99, 92, 103, -325, -106, 156, 156, + 153, 168, 60, -59, 446, 72, -368, 69, 237, 84, + -11, 26, -39, 313, 265, -289, -11, -81, 176, -226, + -231, -62, 77, 195, 155, -91, 136, -2, 160, -27, + -85, -62, -42, -16, 17, 23, 4, -27, 69, 46, + -119, 9, -86, 7, 38, 104 + }, + { + 58, -4908, -1296, -1060, 1753, 258, -39, 274, -284, -1819, + -7, -33, 619, -336, -677, -531, 135, 700, -115, -207, + 150, -639, -620, 696, 266, -406, -553, 44, -150, 105, + -212, -104, 207, -251, -201, 385, 325, 177, 263, -289, + -30, -214, -540, 327, 169, 226, 149, 136, 212, -9, + 417, 556, -53, 232, 263, -126, 59, 13, 21, 2, + -206, 21, 304, 35, 34, -193, -103, -38, 207, 20, + 239, 35, 69, 40, -64, 110, -1, 148, -98, 66, + 52, 75, 27, -69, 50, -68, 75, 63, -105, -115, + -104, -103, -12, -22, 10, 95 + }, + { + 24, -1067, 2369, 826, -758, -126, -225, -53, -463, -133, + 1282, -9, 810, 312, -534, -892, -554, 91, 179, -744, + -189, -572, 619, 288, -187, -883, 682, 322, 431, 264, + -577, 45, 208, -375, -294, -53, 247, 641, -409, -134, + 319, 288, 67, -32, -354, 200, -599, -170, 87, 180, + 237, 33, 253, 448, -7, -57, -252, 96, 39, 50, + 193, -85, 69, 161, -25, 162, -118, 89, -79, -193, + -169, -54, -88, -117, 110, -23, 171, -29, 123, -137, + -30, -39, 87, 0, 24, -55, 63, -96, -30, 75, + 28, 39, -32, -24, 31, 4 + }, + { + 58, -6746, -2011, -1332, 2480, 305, -345, 312, -469, 257, + 281, 368, -787, -413, -147, 135, -680, 486, 576, 175, + -810, -247, -749, -59, -430, 658, -415, -925, -126, 427, + -224, 441, -211, 218, -411, 609, 576, 36, -204, -228, + -776, 589, 112, 93, -82, 175, -238, -251, 26, 273, + -249, -22, 456, 365, 89, 109, 140, 246, 89, -77, + -286, 188, -84, 263, 73, -82, -234, 166, 69, 82, + 10, 2, -274, 48, -20, -36, 51, -78, -161, 16, + -7, 1, -6, -19, 31, 0, -173, 51, 50, -32, + 46, 119, 120, -10, 29, 109 + }, + { + 130, 967, 3672, 611, -906, -76, -340, -70, -54, -192, + 402, 243, 534, 233, -898, -534, -802, -945, -301, 395, + -74, -312, -407, 309, -369, -832, 120, 892, -394, -537, + -132, 520, -312, -230, 160, 274, -300, -35, 62, -176, + -14, 220, -218, -593, 97, 413, 288, 86, -387, -88, + 381, -148, 444, 91, 22, -7, 71, -397, 136, -192, + -27, -132, 63, -89, 251, 103, 148, -169, 0, 125, + 47, 110, 121, 216, -35, 138, 164, -22, 33, -142, + -7, 150, 99, -13, 49, -89, -102, -99, -75, 17, + -67, 8, 16, -56, -27, 36 + }, + { + -30, -6910, -1883, -1204, 1851, -158, -157, -119, -528, 361, + 8, 694, -152, 438, -719, -564, -618, 787, -538, -424, + -322, -493, 254, 239, 581, -178, -434, -611, 18, -194, + 229, -54, -88, 291, -291, -163, 97, 130, -359, -486, + -385, -478, -326, 182, -524, 73, 42, 400, -570, 0, + 197, -135, -324, -49, -312, -150, 109, 84, 250, -99, + -68, 170, -189, -57, -30, 31, 164, -113, -29, -108, + 48, 222, 53, -95, 85, -40, 14, 42, 46, 77, + 58, -53, -39, -50, -33, 38, 19, 19, 41, 62, + 20, 112, 121, 48, 4, -30 + }, + { + 128, 1532, 4019, 584, -825, 119, -862, -188, -105, -80, + 10, 199, 231, 359, -410, -115, -855, -525, 407, 474, + -174, 493, 191, -1618, -72, 384, 203, -758, 669, 220, + 219, 75, -133, -114, -352, 20, 497, -40, -183, -215, + -79, 79, -18, 119, -238, 217, 329, 17, 120, -65, + -338, 472, 15, -31, 29, -206, 162, -76, 69, 58, + -125, 79, -188, 13, 56, -98, 103, 9, 69, 21, + 119, -193, -11, 112, 102, 145, 0, -119, 52, 15, + 27, 29, -168, 166, -65, 34, 124, 76, 47, 128, + -65, 49, 81, -114, -36, 172 + }, + { + -199, -5750, -231, 268, 1525, 282, 2791, -979, -86, 175, + -469, 931, 194, -750, -902, -699, 541, 209, 172, -838, + 761, -603, 256, 1041, -222, 412, -267, 574, 95, 1088, + -518, 254, 549, 492, 247, -216, -295, 4, 23, -74, + -660, -1018, -262, -521, 173, 20, 633, -158, -37, -181, + 360, 9, 532, 180, -491, -61, -59, -73, 153, 11, + 351, 334, 203, 27, -37, 60, -225, -135, -126, 50, + -25, 127, 171, 29, 42, -45, 29, 26, 86, -63, + 27, 113, 38, 210, 185, 95, 109, 122, -42, 59, + 87, -118, -40, -64, 92, 100 + }, + { + -80, -2681, 2708, 295, 46, -431, 792, -1091, 400, 17, + -149, 716, 1, 435, 181, 163, -120, -689, 739, 55, + 1315, -190, -317, 1137, -425, 363, 244, 127, -539, -344, + -562, -173, -400, -194, 820, 206, -442, -297, -232, -36, + 621, -407, -247, 267, 746, 48, 191, -344, -371, 90, + -351, 11, -79, 291, 188, 47, -620, 161, -276, 192, + -280, 203, -97, 19, -160, -249, 74, 245, 122, 54, + -125, -140, -170, 97, -77, -42, -54, -279, 102, 48, + 59, -87, 43, 94, 25, -173, -232, 72, -93, 20, + 88, 48, 176, 56, -20, 52 + }, + { + 639, -3171, -1443, -860, 761, 507, 1449, -444, 476, 933, + -2210, -517, 122, 472, -1164, -61, 602, 1445, 294, -30, + 693, 575, -354, 575, -803, 853, -542, 694, -515, 675, + -232, -405, -386, 812, 344, -209, 435, -23, 189, -501, + -305, 301, 278, -510, 43, 117, 273, -225, -175, 303, + 81, 5, -93, 27, 206, 2, 110, -38, 79, 435, + -10, -360, -271, 85, 173, 42, -156, 120, 25, 10, + 72, -172, 41, -93, -104, -62, -92, -13, -62, 86, + -15, 150, 59, 96, -138, -9, 39, 51, -47, 97, + -86, -98, -2, 36, -49, 47 + }, + { + 5, -2003, 2850, 735, 316, -678, -1339, -591, -909, 579, + -1010, 1125, -427, 737, 927, -185, -407, -502, 392, -419, + 595, -215, 770, -197, -244, 703, 667, 980, 401, -557, + 28, -615, -14, -621, -543, -213, -37, 320, -318, -551, + -98, 507, 482, -51, 273, 220, 347, 186, 24, 44, + 75, 91, -619, -248, -156, -94, 37, -351, -19, 126, + -68, 19, -112, 134, 255, -36, 167, -59, -1, -215, + 32, -41, -1, 172, -264, -254, -88, -121, -24, -57, + 110, 94, 43, -232, -98, -133, -65, -53, -18, -39, + -96, 167, -37, -57, 56, 27 + }, + { + 511, -3632, -1282, -614, 1305, 264, 1724, -649, 1868, 1566, + -840, 948, 77, 289, 514, 1448, 44, -206, 223, 263, + -494, 378, -526, 358, 146, -458, -339, 232, 380, 83, + -278, -97, -420, -101, -560, 552, -417, 218, 431, -449, + -383, -287, -245, 515, -72, 205, -1, 21, 77, 191, + -152, 553, -190, -497, -176, 210, 271, 102, -17, -40, + -192, 78, 8, 29, -308, -148, 28, 134, 260, 77, + -38, 387, -79, 56, -88, -111, -31, -118, 38, -54, + -156, -79, -95, -255, -156, 114, -62, 45, 23, -98, + 13, -95, -39, 73, 57, -18 + }, + { + -147, -3625, 1694, -17, 607, -593, -267, -570, -891, 940, + -315, 213, -532, 1152, 1151, 819, -1019, -294, -312, -363, + 778, 957, -449, 338, -115, 175, 194, 94, 168, 56, + -1463, 314, 37, 192, 230, 366, 289, 178, -429, 20, + -125, 18, 57, -102, 70, 20, 203, -296, 191, 171, + -230, 151, 412, -14, 361, 267, 165, 380, 357, 11, + -58, -182, -19, 152, 387, -139, 47, 87, -185, 64, + -27, 29, 93, 45, 12, -232, -328, 56, 157, -3, + 135, 77, -92, 152, 192, 161, 195, -17, -138, 86, + -11, -4, 34, 7, -34, 110 + } + }, + { + { + 369, -3913, -4321, 4260, -296, -528, 3, 436, -568, -274, + 233, 179, -413, 446, 660, 173, 105, -47, 187, -3, + -152, 116, -376, 480, 1098, 487, -295, 757, 472, -44, + 202, 605, -335, -191, 441, 129, 112, -87, 150, 352, + 369, 618, 122, -73, 10, 248, 51, -25, -136, 155, + 250, -40, -40, -162, 41, -277, -264, -49, -91, -130, + -150, 106, 63, -231, 219, -69, 65, 134, -56, 190, + -54, -229, 129, 33, -181, 169, 89, -23, 63, -4, + -3, 141, 115, 95, -22, 88, 22, -99, 61, 126, + 79, 101, -83, -88, -5, 45 + }, + { + -50, 3515, -206, 1088, 692, -107, -305, 546, -7, 391, + 303, -486, -286, 341, 44, -1082, -46, -413, -535, 45, + 401, -33, -721, 271, 457, -796, 46, 209, 631, -850, + 382, -567, 1171, -643, -7, 49, -379, 74, -161, -168, + -136, 221, -194, 745, -233, -29, 151, -112, -41, 236, + 192, -40, -31, 12, -272, -368, 297, -209, -33, 230, + 149, 78, -140, -29, -110, 83, -41, -70, -88, -205, + -9, -77, -29, -142, -9, -57, -95, -40, 22, 133, + -4, -150, 176, 108, -13, 13, 20, 97, 27, -146, + -60, 101, 31, 7, 57, -15 + }, + { + -3, 1216, -2583, 2735, 833, -448, -117, -229, -646, 1111, + -28, -24, 35, -47, -382, -336, 622, 266, 739, 415, + -22, -543, 18, -34, 446, -71, -557, 256, -534, -4, + 21, -354, 126, 299, -818, -222, 184, -450, 174, -154, + 14, 268, 19, -16, -465, 51, -96, -173, 470, 174, + 239, -343, 233, 145, 171, 16, -134, 46, -9, -9, + -7, 152, 88, 324, 166, 61, -140, 126, 78, -135, + -103, -150, -109, 211, 61, -221, 122, -32, 122, 42, + -71, -68, 112, -115, 77, 177, -58, -11, -4, 92, + -161, -74, 65, -50, 112, 85 + }, + { + -198, -8435, 1321, 924, 6, 16, 131, 409, -32, -803, + -1131, 330, -550, 176, -302, -1070, 810, -159, 541, -644, + -48, -189, -128, 338, 63, -170, 39, -370, -200, -102, + -35, -350, -119, 29, 38, 61, 170, 379, 332, -206, + 97, -612, 49, 5, 395, 244, 149, 17, -69, 244, + 601, 318, -28, 192, 199, 51, -88, -162, 238, 74, + -280, 21, 298, -71, 201, -178, -81, -180, 270, 117, + 154, 102, 17, -39, 23, 106, 82, 57, -52, 2, + 112, 65, -29, 36, -55, 18, 86, 8, -48, -136, + -74, -126, 29, -42, -103, 127 + }, + { + -39, 1711, -292, 17, 171, -240, 133, 59, -250, 460, + 276, 175, 401, 366, -335, -309, -518, -580, -336, -197, + -354, -241, 902, 76, -748, -268, 166, 131, 640, -82, + 422, -605, 592, -865, 84, -221, 668, 122, -201, -124, + 190, 407, 342, -365, -331, 149, -386, -160, 170, 9, + -7, 37, 670, 250, 57, -51, -345, 4, 39, 185, + 161, -76, 28, 84, 199, -145, 9, 53, 15, -56, + -231, -197, -119, -86, -15, 97, 61, 105, 43, 11, + -128, -1, 8, 19, 22, 56, -41, 3, -43, 85, + -14, 59, -60, -16, 0, -35 + }, + { + -327, -10885, 1132, 2211, -598, 183, 73, 420, -113, -182, + 559, 96, -1287, -897, 142, -578, -89, 1054, 358, 55, + -519, 37, -835, -192, -119, 58, -333, -464, -179, -24, + 167, 296, -117, -219, 223, 20, 824, -220, 14, -387, + -39, -279, 456, -121, 66, 151, -179, -29, 70, 88, + -397, 64, 508, 172, 133, 76, 437, 185, 119, -109, + -144, 58, -29, 255, 13, -210, 28, -107, 165, -110, + 131, -247, -65, 46, -107, -5, 103, -63, -68, -68, + 122, 2, -30, -123, -37, 43, -167, 209, -49, -10, + 17, 62, 121, -12, 46, 155 + }, + { + 31, 2657, 1917, -867, 572, -156, -360, 160, 334, -154, + -113, 405, 441, -424, -470, -540, -1098, -445, -503, 318, + 330, -57, -567, 915, -1112, -692, 463, 178, -319, -398, + -338, 768, -380, -268, 527, 176, -208, -215, -100, 364, + -107, -150, -178, -168, 77, 75, 453, 69, -494, 99, + 65, 271, 41, 203, 49, 65, 69, -353, 8, -74, + 84, -104, -268, 60, 89, 136, 152, 65, -87, 244, + -41, -88, 191, 190, -30, 320, -61, 16, 154, -87, + -1, 100, 129, -54, 43, -135, -67, -79, 10, -34, + -97, -43, -56, 32, -34, 95 + }, + { + -147, -10218, 66, 2336, -675, -789, -222, 103, 170, 297, + -130, -261, 404, 419, -1009, -559, 432, -181, 280, -279, + -550, -323, 420, 145, -204, -234, 14, -475, -331, -37, + 16, -304, 314, 171, -313, -100, -200, 401, -299, -365, + -749, -109, -133, -404, -277, 4, 276, 52, -482, -219, + 189, -359, 173, -419, -110, 26, -31, 472, 256, -106, + -164, -51, -94, -277, 142, -77, -74, 101, -39, -187, + -94, 134, 84, 91, 68, 108, 41, 51, 60, 131, + -20, -81, -75, -31, -13, -15, 63, 54, -4, 8, + 24, 68, 153, 15, 53, 34 + }, + { + 99, 2193, 2906, -578, 439, -171, -377, -80, -29, -180, + 282, -253, 215, -172, 285, -943, -101, -627, 494, 469, + 145, 507, 465, -1344, -739, -96, 80, 91, 400, 77, + -101, -291, 287, -777, 469, 337, 227, -34, -231, 1, + -262, 15, -73, -42, 52, 216, 141, 25, 127, -239, + -100, 215, 1, 50, 23, -136, 101, 350, -55, -24, + 95, -94, -277, 22, 16, -84, 108, 78, 7, 36, + 30, -176, -117, 187, 93, 265, 51, -39, 78, -137, + 75, 1, -128, 81, -21, 29, 123, 130, -23, 26, + -30, 35, 30, -93, 41, 195 + }, + { + 162, -7142, 346, 44, 1015, 1646, 2152, -1407, 2, -266, + 311, 294, 22, 79, -1201, -27, -368, 651, -253, -401, + 153, -325, -81, 581, 1115, 228, -417, 774, 814, -169, + 113, -178, 421, 1056, -550, -320, -23, 285, -512, 13, + -1010, -695, -362, 98, -283, 210, 175, 11, -7, -135, + 696, -135, 583, 54, -613, -136, -166, -97, 548, 54, + 106, 433, 71, 94, -180, 182, -64, -167, 48, -162, + 99, -32, 343, -122, 121, -79, -116, 124, -8, 57, + -120, 274, -116, 336, 198, 130, 54, 212, -44, 99, + 69, -98, -77, -66, 115, 90 + }, + { + 11, 85, 33, 237, -549, 237, 1341, -917, -735, 1051, + -41, -749, 462, 503, 408, -844, 62, 913, -482, 392, + 1128, -274, 450, 546, 131, 44, 293, -218, -72, -188, + -1084, 32, -931, 191, 631, 594, -487, -565, -222, 267, + 449, -373, -335, 323, 543, 135, 35, -505, -77, -237, + 239, 7, -334, 275, 42, -2, -375, -305, 83, 50, + 177, -274, -54, 30, -385, 245, 36, 140, 104, 43, + -137, -252, -31, 241, -285, -153, -13, -69, -73, 41, + 25, -29, 237, 121, -157, -55, -112, -18, 32, -53, + -42, 86, 156, 30, 11, 19 + }, + { + -1005, -3386, 349, -761, 611, 2379, -884, -282, 400, -57, + -583, -775, 567, -293, -1973, 645, 1443, 941, 479, 346, + 534, 166, -363, 266, 406, -269, -89, 298, -159, 497, + -76, -531, -108, 720, 148, 394, 434, -88, -16, -485, + -217, 105, 50, -150, -281, 143, 330, -183, 0, -5, + 131, 161, 12, 105, 130, 69, 446, -188, 68, 133, + -75, -485, -69, 168, 64, 158, -234, 67, -76, 63, + 13, -39, -144, -36, 152, -176, -20, 16, -36, 31, + 190, 84, -110, 63, -126, -89, 14, 6, 61, 26, + -102, 9, 89, 12, 46, -3 + }, + { + -10, 1501, -899, 784, 434, -775, -623, -1012, -447, -41, + 197, 312, -802, 1375, -324, -326, -187, 1302, -947, -220, + 476, -396, 1623, -648, 254, 326, 139, 1381, 586, -307, + -318, -1172, 12, -412, -444, 62, -288, 203, -215, -51, + -554, 360, 55, 649, -29, 404, 138, 300, 54, -87, + -91, 234, -218, -267, -350, 93, -294, -244, -39, -34, + -146, 89, -44, 195, 216, 27, 119, -56, -273, -36, + 40, -10, -159, 266, -119, -304, -7, -227, 80, -11, + 48, 47, 34, -155, -213, -234, -136, -42, -31, 84, + -84, 167, -39, -20, 82, 19 + }, + { + -790, -4496, 360, -502, 834, 2142, -308, 78, 1459, 1024, + -84, 798, -601, 601, 1430, 1329, -129, -435, 965, -67, + 37, -855, -132, 594, 61, -46, -17, 344, -251, -140, + 133, 115, -621, 33, -546, -99, 190, 203, 100, -493, + -496, -266, 175, 119, 314, 156, -114, 155, 331, -374, + 411, 132, 61, -58, -371, -21, 394, -144, 266, -82, + -152, 34, -270, 28, -205, -201, 234, 241, 352, -118, + -121, 364, -50, 31, -2, -125, -34, -78, -8, -93, + -170, -34, -87, -312, -124, 33, 64, 45, -60, -53, + -21, 132, -128, 42, 47, 11 + }, + { + 67, -1674, -1073, 442, -234, -366, 558, -470, -349, -67, + 274, -119, -60, -629, 3833, -684, -243, -356, -246, 63, + -273, 1832, -416, 459, -242, 356, -294, 333, 432, -65, + -1481, 314, -270, 392, 726, -274, 859, -516, -542, 86, + 85, 30, 454, -19, 7, -100, 57, -69, -218, 422, + -90, -100, 236, 324, 203, 265, 288, 135, 289, 362, + -91, -518, 84, 173, 239, 115, -14, -221, 241, -48, + -195, 103, 258, -127, 100, -125, -530, -55, 128, 216, + -96, 277, -115, 46, 193, 215, 109, 176, -122, 58, + 23, 6, -90, 104, -41, 62 + } + }, + { + { + -341, -69, 481, 2969, -1282, -53, 376, 14, -569, 143, + 270, 241, -338, -170, 279, -4, -517, 141, 1179, -373, + -246, 281, -95, 650, 428, -8, -430, 252, -46, 26, + 101, 268, -191, -241, 397, -149, -341, -140, 131, 232, + 131, 212, -138, -61, -250, 2, 90, 18, -23, 222, + 278, -165, -127, 27, 77, -217, -104, 110, 6, -48, + -26, 122, 39, -81, 218, -10, -69, -22, -92, 76, + 24, -149, 115, 42, -116, 128, -202, -162, 103, -28, + -74, -33, 43, 101, 79, 57, -28, -92, 24, 15, + -96, -40, -82, 18, 33, -49 + }, + { + -86, 2751, -1016, -832, -871, 106, -140, 213, -86, 574, + 39, -480, -365, -44, 262, -2, 892, 90, -25, 548, + 893, 662, -101, 130, 703, -201, -374, -636, 515, -818, + 58, -951, 540, -1020, -346, 138, 28, 208, -136, -20, + -197, 406, -84, 604, 126, 125, -162, -60, -116, 100, + 141, -41, 90, 53, 41, -147, 123, -126, 171, 150, + -110, -29, -161, 145, -4, 127, 51, 0, 23, -62, + 64, 29, -37, -149, -56, -92, 33, 86, -68, -116, + 35, 82, 122, 36, 48, 21, 62, 89, 23, -61, + -17, -13, -66, -68, 50, 30 + }, + { + 63, 4615, -734, -140, -1126, -135, 315, 339, -505, 653, + -291, -300, -453, -10, -200, 154, 706, -135, 24, 85, + 309, -109, -116, -459, 358, -471, -709, 143, -600, -242, + 61, -236, -303, -14, -639, -50, 458, -93, 191, 20, + 3, 221, 155, -155, -619, -17, 246, 47, 252, 59, + 148, -344, 231, 116, 10, -82, -25, 78, 100, 162, + -19, 192, 123, 202, 56, 24, -69, 233, 63, -83, + 75, -40, -152, 154, 49, -86, 151, -99, 83, 147, + -119, -64, 107, -139, -36, 61, -82, -23, -12, 110, + -35, 17, 86, -39, 63, -3 + }, + { + 323, -9425, -118, 1892, 301, -301, 225, 202, 133, 296, + -597, 120, -537, 271, -12, -792, 410, -97, 707, -742, + 67, 87, 294, 619, -28, 219, 595, 338, 322, 68, + 63, -275, 35, 221, -97, -362, -154, 235, 406, -78, + 478, -239, 306, -133, 163, -107, -211, -168, -93, -7, + 114, 32, -192, -91, -154, -42, 76, -133, 149, 141, + 39, -259, -106, -176, 189, 7, 123, -79, 65, -44, + 95, 120, 174, 28, -4, 53, 1, -116, -90, -14, + 19, 3, -36, 33, -61, 36, 98, 20, 69, 28, + 21, -82, 44, -11, -140, 56 + }, + { + 16, 2920, 521, -273, 100, -156, 70, 303, -101, 245, + -313, -283, 36, 196, -274, -33, -270, -517, 273, 269, + 217, -265, 247, 127, -381, 214, 146, -246, 190, -719, + 221, -264, 873, -377, 215, -644, -10, -242, -6, 28, + -153, 361, 274, -431, -458, 199, 12, -26, -31, -211, + -14, -238, 23, -106, 66, 188, -49, 184, 24, -5, + -25, -239, -168, -108, 114, -257, -19, 95, 226, 169, + -118, 92, 103, -21, 41, 14, -145, 16, -65, -54, + -130, 111, 29, -48, -58, 59, -48, 36, 20, 6, + -86, 84, -20, -7, -58, -85 + }, + { + 540, -10306, 864, 3886, 90, -440, 167, 958, 64, -355, + -105, 270, 14, -445, -212, -605, -667, -189, 235, 908, + 275, 458, -241, 377, -176, -134, 182, 108, 38, 213, + -6, -290, -382, -321, 66, -187, 480, -237, 39, -319, + 304, -119, 409, 46, 95, -158, 44, 479, 349, 364, + -200, -98, -38, -363, 78, -3, -180, -331, -12, 103, + 66, -10, -94, 267, 22, -271, 85, -133, 148, 13, + -13, -344, -70, -36, -103, -131, -6, -51, 3, 38, + 117, 123, 184, -85, -9, 38, -186, 76, -146, 25, + 1, 13, 58, -51, -4, 76 + }, + { + -122, -570, -1071, -628, 466, -158, -170, -103, 30, 145, + 124, 215, 415, -633, -322, 48, -264, 619, 461, 940, + 666, 321, 29, 1344, -632, -269, 407, -44, -145, 189, + 248, 432, -385, 37, 105, -27, -36, -202, -56, 180, + -372, 36, 15, 319, 295, -202, 109, 49, -188, 427, + 132, 67, -351, -167, -163, -21, 166, -126, 102, 48, + 151, -160, -382, 25, 51, 52, 119, 131, -29, 268, + -78, -289, -28, 31, -20, 240, -190, -43, 80, 12, + 130, 66, -16, -95, -22, -138, 128, 70, 37, 32, + 27, -39, -18, 94, 13, 83 + }, + { + 312, -9481, 880, 3550, -100, -596, -56, 286, 515, 323, + -607, -231, 629, 211, 182, 775, 235, -335, 881, 317, + 30, -142, 217, -298, -205, -50, 247, -207, -214, 162, + -182, -353, 371, -31, -396, -59, -395, 76, -224, 60, + -208, 115, 8, -52, 111, 23, 139, -28, -209, -124, + 196, -292, 486, -119, -156, 15, 10, 364, 29, -159, + -53, -5, 20, -267, -108, -199, -134, -43, 12, -154, + -128, 13, -25, 23, 19, 12, -26, 65, 33, 153, + -19, 36, 11, 5, 52, 36, 105, -16, -27, 13, + 27, 13, 25, -82, -63, 29 + }, + { + -140, -2168, -1156, -494, 529, 39, -139, 125, 147, -65, + 245, -577, 187, 49, 376, -391, 298, -417, 87, 587, + 257, 177, 351, -1072, 237, -196, -127, -41, 31, -549, + -230, 259, 260, -685, 214, -227, -15, 161, -39, -154, + -402, -261, -33, 65, 99, 217, -72, -82, 139, -122, + 24, 76, -37, -30, 18, -240, -152, 260, -8, -23, + 159, -30, -150, 72, 56, 12, 147, 18, -165, 9, + 64, -24, 14, 15, -97, 142, -1, 32, 153, -113, + 100, 167, 48, 31, -75, -29, -41, 68, 22, -20, + -68, 28, -47, -56, 24, 45 + }, + { + -142, -6630, 696, -122, 429, -395, 348, -909, -58, -759, + -507, -132, 90, 1034, 168, 177, -200, 118, -782, -389, + 17, -170, -355, 140, 413, 23, -393, 272, 219, -999, + -27, 64, -326, -50, -691, -133, 209, -103, -904, 302, + -242, -117, 13, 731, -379, -237, -42, -180, -315, -334, + 271, -337, 233, -103, -201, -131, -105, -7, 387, 54, + 121, 315, -34, 125, -47, -2, -110, 62, 167, -23, + 87, -92, 136, -260, 124, -66, -80, 311, 141, 90, + -63, 200, -356, 227, 162, 38, -54, 15, -149, -35, + -39, 25, 86, -52, -28, -88 + }, + { + 18, 2904, 1421, -749, -877, -296, 1054, -268, -785, -63, + -422, -283, 802, 365, -1032, -1338, 441, 1057, -524, -66, + 704, -256, -189, -430, -213, -262, -449, -194, 506, 101, + -677, 77, -1158, 345, -120, -87, -27, -187, -28, -94, + 149, -49, -105, 255, 219, -97, 161, -380, -155, -215, + 325, 65, -258, 197, -85, 172, -192, -420, -81, -135, + 117, -167, 114, 185, -120, 287, 51, -69, -186, -32, + 50, 32, 33, 167, -256, 21, 170, 300, 51, -22, + 33, -78, 77, 205, 141, 148, -85, 15, 141, 107, + 10, 25, -29, -80, 15, 12 + }, + { + 1138, -2199, -695, -609, 97, 345, -2018, -229, 275, 236, + 630, -35, 862, 446, -675, 949, 423, -144, 332, 118, + -146, -170, 32, 725, 667, 13, -46, -172, -94, 334, + 256, 205, 216, 220, -337, 348, 172, 113, 269, -117, + -203, 55, -117, -384, -248, 168, 150, -88, 280, 80, + -258, -272, -35, 93, 382, 240, 230, -256, 211, 201, + -17, -223, 105, 218, 17, 250, -142, 170, 158, -8, + -50, 102, -167, -60, 163, -81, 54, 99, 47, -10, + 131, -12, -255, -56, -78, 39, 37, -84, 72, 9, + -73, 63, 11, 20, 161, -82 + }, + { + -19, 3144, -191, 364, 203, -232, 67, -406, 35, -174, + 165, -77, -301, 1947, -1223, -1144, -312, 1209, -693, 152, + 569, -627, 956, -1072, 149, 68, -723, 5, 31, -39, + -15, -507, 554, 736, 404, 450, -396, -477, -803, -24, + -128, 42, -295, 612, -269, 41, -225, 34, 37, 34, + -183, 118, -79, -58, -70, 187, -115, -172, -203, 20, + -221, -11, -96, -96, 42, 142, 81, -63, -199, -59, + -2, 70, -241, 231, -1, -278, 80, -78, 101, 5, + 150, 156, 68, 12, -13, -34, -92, 74, 47, 93, + -59, -32, -237, -101, 58, -17 + }, + { + 884, -3835, -742, -761, 116, -15, -1658, -39, 71, 92, + -341, 910, -777, -16, 666, 357, 538, 343, 591, -519, + 121, -674, 43, 660, 301, 113, -148, 554, 112, -18, + -66, 272, 115, 698, -327, -467, 39, 52, -63, -326, + -374, 155, 95, -40, 411, 308, 400, 214, 58, -338, + 720, 185, 254, 328, 157, 161, 369, -326, 255, 49, + -269, -114, -141, 35, -74, -39, 99, -34, 104, -104, + -150, 354, -118, -58, 24, 3, 58, -61, 66, 50, + -115, -59, 53, -54, -18, 33, -5, -66, 5, 46, + -17, 173, -44, 84, 20, -50 + }, + { + -21, 1034, 600, 427, -216, 140, 820, -251, 250, 196, + 375, -296, -48, -1175, 2923, 26, 1583, 786, 490, 555, + -1112, 868, -430, 214, -431, 637, 74, 662, -141, -207, + -1107, 91, 0, 507, 445, -102, 650, -679, -204, 50, + -308, -137, 676, 382, 215, 34, 50, -69, -192, -13, + -278, -80, -217, 53, -21, -40, 8, -246, 53, 92, + -73, -389, -205, -94, 117, 144, 141, -92, 236, -100, + -276, 112, 158, -230, -136, -67, -312, -146, -104, 159, + -98, 295, 17, -19, -6, 77, -64, 109, -33, 35, + -16, 11, -80, 174, 35, 135 + } + }, + { + { + 205, 2530, 45, -904, 1303, 395, 78, -294, -527, 138, + 323, 112, -92, -140, -244, 539, -687, 328, 279, -846, + 618, 79, 396, 592, 220, -367, -206, -143, -190, 179, + 647, -106, -332, 3, 275, 145, -684, 157, 42, 19, + 45, 42, -73, 80, -224, -273, 180, -147, 372, -56, + 127, 119, -167, 37, 62, -75, -114, 206, -45, 101, + -19, 147, -12, 24, -16, 127, -320, -118, -6, 45, + 122, -112, 12, 87, 62, 38, -194, -91, 41, -123, + 10, -142, 161, 7, 79, -25, -14, -59, 22, -45, + -62, -92, -55, 30, 26, -99 + }, + { + 109, -785, 1775, -1586, -714, 20, 123, -12, -164, 455, + -64, -262, 257, -793, 286, 336, 258, 154, 921, 426, + 278, 842, 295, 41, -20, 321, -379, -512, 143, -237, + -487, -584, -218, -390, -135, 201, -159, 108, -32, 61, + -367, 300, 399, 10, 358, 191, -104, -202, -75, 14, + -128, 231, 83, 203, 15, -58, -103, 101, 170, -14, + -53, 134, -244, 76, 74, -62, 119, 80, -73, 30, + 145, -23, -111, -24, -51, -89, 2, 164, 10, -240, + 101, 176, -12, -2, 20, -21, 95, 69, 49, -49, + -28, -41, -35, -10, -67, 7 + }, + { + -40, 5104, -698, -2394, 755, -137, 332, 268, -341, 144, + -226, -595, -138, -117, -134, 477, 353, 478, -355, -99, + 153, 440, -737, -324, 172, -601, -314, -250, -14, -122, + -421, 97, -269, -562, -182, 48, 540, -20, -24, 82, + 147, 29, 109, -194, -154, -171, 222, -120, -27, 201, + 55, 0, -114, 227, -30, -81, 211, -101, 150, 201, + 58, 250, 27, -58, 277, -106, 52, 186, -107, -46, + 91, 153, -312, 131, -76, 175, 40, 91, -63, 225, + -162, 41, -32, -90, -82, -15, -34, -63, 47, 30, + 66, 43, -25, 72, -45, 36 + }, + { + -383, -8071, -221, 2669, -219, -298, -32, -78, -46, 838, + -375, -393, 53, -179, -101, 91, -86, 172, 330, -88, + -268, -27, 368, 764, -367, 376, 483, 655, 450, 114, + -175, 321, -276, -145, -67, -539, 445, -54, 304, 108, + 218, 303, 34, 75, -74, -639, 222, -216, 86, 12, + -127, -12, -131, -206, -262, 60, -59, -5, 89, -58, + 415, -269, -410, 10, -27, 160, 233, -107, -75, -8, + -65, 206, 238, -31, 60, 19, -52, -104, -102, 49, + -50, 39, 23, -93, -26, 59, -33, 33, 90, 176, + -55, -37, 71, -65, -61, 13 + }, + { + 17, 2283, 1091, -329, -131, -11, -24, 257, -54, 168, + -181, -339, -253, -161, -393, 12, 477, -762, 312, 539, + 131, 39, -301, -345, 566, 49, -174, -119, 37, -972, + 154, 438, 211, 274, 263, -831, -196, -358, -120, 620, + -587, 436, -39, -225, -369, 189, 117, -200, 38, -72, + -185, -307, -49, -107, -14, 335, -37, 90, 160, -91, + -93, -235, -148, -6, -18, -249, -173, 244, 129, 107, + -29, 150, 159, -15, 61, -21, -117, 0, -105, -78, + -37, 100, -89, 70, -93, 20, -21, 19, 17, 21, + -31, 21, 23, -26, 21, -108 + }, + { + -593, -7547, 170, 3828, 123, -219, -184, 680, 111, 87, + -436, 207, 575, -196, -626, -116, -823, -658, 171, 1455, + 149, 37, 232, 481, 344, -411, 56, 324, 222, -157, + 233, -313, -610, -124, -269, 127, 12, 68, 26, -201, + 265, -14, 33, 192, -39, 174, 119, 477, 324, 249, + 144, -218, -345, -207, 103, -56, -365, -372, -163, 260, + 111, 66, -32, 50, 73, -194, 31, 8, 44, 134, + -89, -248, -167, -8, 9, -190, -134, -46, 19, 65, + 77, 98, 151, 50, 16, 29, -82, -155, -16, -6, + 41, 28, -73, 19, -55, 44 + }, + { + 25, -1569, -1089, 144, -262, 122, -123, -74, -251, -34, + 493, -220, 337, -265, -359, -526, 114, 988, 687, 789, + 353, 557, 775, 192, 422, -319, -28, -245, 639, 310, + -98, 108, -6, 449, -585, 202, -187, -78, 365, -390, + -371, -33, 350, 347, -143, 95, 11, -143, 177, 409, + 9, -211, -135, -26, -342, -86, 191, 100, -108, 84, + 110, -234, -115, -83, 121, -7, 184, 42, 99, 47, + 87, -222, -160, -71, 125, 32, -76, 3, -51, 24, + 116, 172, -169, -17, -151, 9, 96, 58, 59, 36, + 48, -40, 34, -9, 64, 24 + }, + { + -357, -7626, 835, 2812, 347, 78, -632, 302, 617, 254, + -659, -253, 741, -11, 899, 603, -831, 722, 442, 576, + -244, 53, -215, -190, -146, 158, 199, -20, -36, -193, + -212, -3, 306, -141, -387, 66, -38, -545, 63, -58, + 50, -267, 19, 266, 301, -59, -212, -82, 163, -178, + 15, 79, 101, 99, -21, 33, 26, 31, -46, -40, + 90, -202, 15, 72, -287, -52, -122, -225, 86, -143, + -48, -121, 74, 11, -48, -17, 8, 86, -15, 65, + 19, 94, 54, 54, 17, -57, 186, -37, -23, -38, + 69, 39, 22, -113, -137, 37 + }, + { + -83, -1539, -2595, 302, 22, 150, -175, 165, 41, 44, + 186, -453, -358, 440, 273, 981, -849, -248, 169, 406, + 318, -289, -40, -594, 933, -610, -142, 155, -144, -743, + -44, 234, -170, 66, -393, 127, -176, -257, 238, -276, + -91, -498, 101, 131, 151, 51, 110, 27, -59, 84, + 25, -155, 178, -78, 51, -321, -20, -46, -50, 84, + 117, -40, 139, -162, 105, 206, 3, 33, -262, 39, + 59, 33, 69, -34, -143, 37, -39, 62, 91, 37, + 110, 99, 72, 47, 35, -128, -36, 79, 67, -19, + -103, 65, -104, -18, 53, 10 + }, + { + 267, -3255, -2365, -173, 17, 166, -1143, -503, -338, -269, + -739, 258, 209, 578, 652, -912, 463, -294, -88, 36, + -667, 388, -189, 171, 129, -564, -14, 119, -248, -722, + -176, 357, -515, -249, -501, -179, 325, -522, -161, 49, + -210, -114, 130, 482, -86, -137, -165, -238, -487, -54, + -64, 115, -130, -636, 462, -223, 76, -136, 359, 100, + 2, 408, -196, 180, 10, -228, 130, 250, -166, 167, + 96, -186, 33, -46, 8, 49, -66, 115, 173, 191, + 110, -104, -230, 219, 135, -24, 123, -287, -55, -49, + -75, 12, 174, -15, -106, -96 + }, + { + 27, 3842, 429, -905, -133, -371, 277, 151, -458, -332, + -255, 106, 450, 30, -1543, 116, 128, 294, -170, -24, + 2, 619, -872, -598, 103, -640, -342, 102, 392, -274, + -292, -280, -553, 30, -406, -283, 232, -102, 101, -22, + -387, 164, 328, 104, -195, 255, 112, -423, -88, -162, + 334, -132, -177, 19, 187, -43, -103, -224, -67, -248, + -54, 104, 259, -114, 140, 22, 42, -67, -35, -172, + 35, 119, -41, 27, -94, 251, 104, 169, 114, 44, + -63, -21, -61, 167, 211, 269, -94, 3, 58, 108, + 75, -31, -62, -54, 55, -86 + }, + { + -1074, -1947, 1247, 236, -142, -1154, -748, -157, -248, 358, + 1374, -348, 461, 228, 1061, 563, -94, -312, 518, 208, + -690, -138, 728, 222, 431, 543, -213, -441, 129, 77, + 120, 751, 219, -7, -645, 754, -59, 178, 158, -62, + -245, -134, 113, -376, -353, 458, -317, 167, 300, 25, + -298, -170, 22, -167, 503, 1, 104, -187, 336, 254, + -87, 41, 241, 47, -148, 333, -150, 297, 191, -219, + 91, 112, -98, 21, -51, -21, 163, 95, -90, 37, + 159, -182, -12, -173, -8, 46, 81, -7, 78, -81, + -34, 35, 29, -22, 124, -70 + }, + { + 52, 2139, 670, 372, -185, -38, 123, 150, -78, -357, + 61, -40, 491, 847, -584, -824, -249, 636, -686, -200, + 1124, 27, -289, -736, 272, 196, -803, -696, 15, 673, + -768, 407, 165, 1083, 493, 70, -384, -640, -199, 82, + 1, -424, 46, -97, 187, -12, -270, 47, -118, 151, + -416, 65, 34, 41, 191, -281, 330, -335, -66, 118, + -226, -264, -95, 104, -116, -1, 283, -135, -132, 24, + -95, 40, -25, 50, -37, -289, 273, -64, 11, 60, + 49, 225, -18, 192, 17, -45, -131, 242, -67, -14, + 102, -101, -213, -233, 54, -36 + }, + { + -835, -3621, 1360, -343, -653, -510, -861, -406, -524, -2, + -544, 789, -387, -469, 650, 20, 802, 293, 271, -194, + 71, -427, -499, 999, 177, 110, 227, 133, -15, 73, + -113, 330, 225, 453, 323, -356, -292, 55, -56, -268, + -259, 404, 123, -329, 288, 328, 550, 352, -414, 328, + 340, -12, 413, -57, 559, 264, 179, -57, 41, 18, + -203, -306, -31, -45, 143, -80, -3, -58, -87, 126, + -87, 62, -78, 121, -92, 128, -135, 130, 25, 126, + -91, -83, -48, 135, -36, -29, 59, -126, 31, 33, + 3, 14, 116, 81, -2, -116 + }, + { + 78, 2969, -1079, 552, 290, -153, 186, 493, 160, 281, + 253, -257, -360, 1493, -459, 1138, 921, 1322, 28, -70, + -27, -123, 16, 346, -676, 681, 352, 236, 270, -199, + -1176, 189, -19, 639, -31, 313, 150, -688, 83, 176, + -455, -47, 625, 210, 320, 344, -333, 143, 110, -204, + -376, 45, -407, -132, 17, -14, 146, -325, 44, -211, + 109, -242, -340, -37, 84, 262, 18, 185, -146, 99, + -267, 14, 45, 56, -335, -38, -36, -257, -136, 88, + 52, 81, 99, 53, -33, -43, -22, 1, 14, 38, + -80, 58, 52, 42, 70, 93 + } + }, + { + { + -178, 6580, 3129, -2544, -53, 18, 16, -614, -598, 49, + 242, 427, 115, -94, -546, 504, -984, 131, 203, -810, + 353, -177, 30, 506, 257, -560, -386, -224, 70, 542, + 453, -236, 87, 479, 140, 284, -95, 353, -269, -183, + -19, 95, -10, -5, -178, -105, 294, -180, 378, -137, + 15, 275, 74, 184, 90, -26, 26, 151, -206, 59, + -211, 55, -112, -185, -38, 210, -116, -24, 37, 67, + 85, -49, -63, -2, 94, 26, -100, -42, 7, -59, + 52, -160, 97, 5, 29, -38, 19, -46, -22, -121, + -14, -55, -50, -25, -34, 2 + }, + { + -25, -3375, 260, -119, 579, -215, -234, -31, -135, -115, + -315, -374, 313, -597, 380, -31, -367, -538, 164, 180, + 203, 258, -391, 18, 137, 377, -62, -7, 104, -162, + -155, -52, -2, -247, 166, 336, -194, 354, 25, -100, + -220, 146, 254, -390, 167, 74, -77, -112, -280, -238, + -182, 267, 182, 315, -65, -224, -181, 147, 167, -163, + -147, 287, -171, -41, -8, -186, 26, 71, 95, 134, + 100, -61, -67, 60, 73, -20, -55, 55, 21, -175, + 34, 0, -146, -10, 72, 39, 84, 44, -6, -54, + -46, -21, 24, -9, -43, 33 + }, + { + 40, 3336, -1685, -2487, 1159, -67, 222, 324, -304, -289, + -115, -491, -126, -345, -419, 275, 693, 1056, -582, -422, + -398, 145, -501, -337, 435, 447, 425, -59, 146, 141, + -191, 369, -231, -409, -40, -24, 276, -97, -9, -28, + 98, -165, 269, 133, -107, -368, 8, -246, -44, -36, + -115, 345, 30, 69, 241, 55, 133, -114, 214, 312, + 59, 119, -16, -3, 279, -59, -74, -59, -171, -85, + -123, 68, -212, 100, -198, -21, -129, 215, -49, 92, + -133, 175, -2, -60, -19, -59, -86, -60, 77, 5, + 83, 73, -17, 94, -28, 55 + }, + { + 453, -5062, 1026, 2355, -141, -100, 0, -122, -335, 390, + -420, -98, 169, -270, -190, 246, 306, 63, 9, 297, + 8, 10, 200, 88, -479, 369, 276, 509, 501, 324, + 2, 378, -255, -38, -91, -436, 555, -167, -138, -338, + -97, 178, 9, 214, 18, -355, 479, 123, 169, 126, + 72, 12, -82, -93, -225, -40, -165, 74, 11, -350, + 220, -84, -205, 89, -191, -3, 134, -61, 17, 18, + -120, 43, 49, -41, 35, 90, 23, 37, -8, 60, + -86, -24, -65, -110, 21, 37, -122, -105, -43, 85, + -7, 24, 56, -74, -46, 37 + }, + { + 2, -514, -1107, 64, 30, -84, -53, 299, -99, -124, + -250, -165, 250, 56, -626, -122, 416, -833, -135, -95, + 6, 75, -766, -820, 566, -199, -366, 145, 337, -393, + 428, 286, 60, 0, 10, -727, 23, -72, -95, 212, + -423, 452, -224, 13, -51, 65, -26, -130, 66, -18, + 8, 85, 27, -340, -295, 171, 18, -38, 100, -217, + -168, -202, -56, 128, 40, -30, -66, 21, -186, -17, + -60, 41, 111, -112, -92, -84, 15, 185, 68, 107, + 78, 59, -150, 211, -42, -90, -29, 16, 45, 82, + 68, 69, 47, -54, 85, 38 + }, + { + 667, -4928, -52, 2832, -16, -1, -397, 151, 418, 368, + 39, 485, 486, 550, 156, 114, -645, -363, -115, 606, + -230, -331, 240, 269, 229, 250, 247, 107, -41, -409, + 383, 238, -226, 3, 124, 469, 60, -13, 157, -128, + 41, 46, -22, 15, 38, 202, 230, 395, 72, 191, + -33, -312, -105, 162, 127, -52, -98, -131, -189, 61, + 119, 177, 135, 34, 4, -158, 19, 31, -22, 72, + -19, 47, 101, 4, 27, -76, -47, 8, -9, 31, + -71, -73, 67, 27, 50, 127, -6, -115, -26, -108, + 28, 85, -29, 59, -41, -10 + }, + { + 68, -487, 154, 394, -254, 177, 19, 200, -113, -205, + 123, -437, 320, 146, -253, -416, 119, 4, -158, 268, + -319, -305, 152, -10, 700, -378, 80, -59, 147, 280, + 31, 160, 144, 799, 129, 38, -341, -1, 212, -348, + -84, -131, -192, -112, -334, 192, 28, -128, 73, 64, + 9, -221, 12, 131, -114, -47, 125, 154, -245, 70, + 189, -120, 81, -52, -20, -208, 33, -101, -31, -170, + 41, -10, -7, -7, 92, 13, 51, 27, 11, 8, + 39, 171, -152, 48, -152, -47, -12, 34, 17, -42, + -47, -61, 41, -71, -49, -7 + }, + { + 417, -5980, 819, 1912, -9, 282, -643, -15, -18, -251, + 50, 169, -30, -463, 148, -92, -1303, 287, -82, 381, + -425, -458, -83, 270, -200, 12, 42, 294, 329, -33, + -89, 222, 316, 36, -9, 215, 213, -258, 84, -403, + -261, -428, -156, -36, 21, -233, -352, -264, 64, 9, + -36, -74, -150, 25, -40, -56, -126, -46, 58, -63, + 305, -16, 62, 223, -181, 125, -32, -100, 168, -179, + 125, -11, 69, 110, -14, -76, 84, 186, -113, -121, + -40, 102, 76, 40, 34, -72, 95, -34, 38, -46, + 55, 35, 25, -50, -66, 7 + }, + { + 157, 1851, -58, 410, 69, 80, -176, 207, 248, 104, + -79, -626, -262, 463, 28, 489, -1175, -369, -76, 314, + 446, -261, 238, -348, 729, -993, -253, 366, -409, -576, + 173, 303, -341, -51, -372, 99, -307, -102, 157, -364, + 253, -192, 381, -68, -59, 339, 326, 346, 93, 75, + 24, -51, 290, -78, 57, -310, -72, -8, -12, 131, + 47, -93, 145, -219, 69, 139, -99, -4, -259, -17, + 8, -25, 7, 57, -2, 55, -28, 136, 104, 21, + 39, 36, 7, 26, 83, -50, 12, 83, 86, 37, + -88, 96, 20, 9, 84, 66 + }, + { + -463, -772, 188, -76, -568, -631, -709, 607, 550, 340, + -396, 155, -369, -907, -573, -611, 762, -114, 1103, 671, + -251, 687, -230, 302, -147, -371, 261, -306, -271, -194, + -182, 195, -381, 223, 172, -259, 281, -190, 34, -81, + -323, 253, 126, -233, 74, 127, -286, -36, -133, 172, + 24, 43, 111, -219, 565, -5, 284, -247, 164, -82, + -307, 261, -183, -8, -106, 7, 274, 235, -104, 53, + -12, -117, 146, 120, 66, 80, -49, -36, 70, 182, + 68, -97, -153, 60, -6, -125, 184, -165, 78, 38, + -54, 40, 150, 22, -15, -68 + }, + { + -18, 1984, -797, -139, 736, -397, -184, 1295, 884, 383, + 40, 53, 201, 130, -912, 299, -49, -489, -178, -144, + -1011, 206, -8, -152, -289, -215, 39, -264, 231, -332, + -298, 21, -238, 318, -51, -429, -78, -189, 90, 333, + -396, -240, 175, -148, -362, 488, 357, -295, 158, 189, + 331, -229, -81, -267, -103, -193, 132, -85, -57, -115, + 91, -10, -72, -319, 41, -27, 41, 39, -29, -94, + 170, -33, -229, 33, -52, 67, -78, -59, 26, 11, + -75, 7, -144, -76, 20, 129, -150, -6, -57, -5, + 115, -67, -63, -12, -25, -161 + }, + { + 1021, -1910, -823, 706, 324, 249, 412, -289, -245, 662, + 770, -1048, -11, 62, 1079, -95, 137, -312, 390, 967, + -306, -57, 637, -123, -188, 288, 112, -76, -65, 9, + 195, 468, -25, 19, -342, 737, -441, -71, -220, -409, + -83, -49, 2, -306, -274, 414, -256, -244, -106, -40, + -16, 158, -105, -157, 532, -267, -88, -160, 299, 115, + 113, 262, 372, 86, -349, 170, -188, 32, -62, -105, + 282, 66, -79, 209, 10, -27, 92, -186, -140, 53, + 127, -89, 181, 7, 165, 62, 119, 67, 7, -91, + 49, 43, 48, 11, 32, -62 + }, + { + -23, -38, -1112, -12, 57, 440, 321, -89, -69, -73, + 65, 33, 47, 178, 41, 120, -307, -59, -407, -103, + 1646, 87, -310, 378, 557, 412, -444, -774, -112, 774, + -182, 272, -533, 575, 345, 253, -113, -121, 305, 330, + -102, -563, -121, -447, 124, -69, 61, 249, -336, 218, + -187, 54, -73, -175, 114, -72, 426, -190, 72, 86, + -154, -94, 80, 251, 49, -21, 225, -157, -16, 40, + -62, 95, 137, -76, -82, -158, 316, -79, -85, -6, + -114, -119, 5, 173, -163, -59, 53, 369, -62, -120, + -15, -60, -28, -124, 52, 51 + }, + { + 821, -2834, -12, -85, -137, 588, 93, -200, -587, -349, + -593, 1156, 31, -604, 230, -113, 757, -717, -406, 115, + 230, -179, -741, 230, 182, 406, 379, -118, -203, 17, + -672, -445, -87, 197, 517, 40, -7, 60, -78, 141, + 247, 356, 56, 1, 224, -91, 175, 143, -320, 577, + 302, -284, -155, -453, 316, 163, -46, -237, 20, -144, + -193, -154, -87, -187, 81, -168, -31, 7, -13, 294, + -77, -69, -25, 187, -125, 126, -78, 195, -35, 76, + -151, -63, -16, 101, -112, -144, 99, 12, -16, -62, + -106, -72, 57, 26, 60, 1 + }, + { + -93, 2712, -841, 354, 392, 110, -93, 121, -239, -95, + 10, 244, 76, 343, -3222, 310, -248, 345, -261, 89, + 535, -134, 205, 464, -265, 600, -57, -156, 693, 540, + -511, 220, -118, 516, -492, 283, 344, -295, -30, 252, + 98, 200, 100, -468, 33, 380, -507, 7, 256, 34, + -117, 346, -205, 3, 60, -131, 333, -93, 218, -105, + 242, 72, 34, 310, 89, 142, -87, 233, 42, 238, + -127, 45, 74, 259, -110, 99, 55, -170, -73, -20, + -14, -21, 25, 124, 137, -66, -23, -13, -161, -152, + -77, 92, 87, 62, 7, -74 + } + }, + { + { + 227, 9268, -453, -3015, 761, -510, 325, -428, -352, -620, + 30, 518, 459, 54, -610, 293, -308, -50, -505, 721, + -396, -601, -108, 316, 400, -326, -457, 174, 31, 733, + -150, 208, 16, 220, 152, 351, 294, -66, -148, -293, + -176, 348, 112, -149, -96, 40, 194, 57, 3, -48, + 13, 286, 25, 58, 49, 43, 76, -103, -39, -36, + -212, -11, -2, -180, -52, 118, 72, 18, 47, 48, + 39, 17, -38, -94, 34, -16, -4, 10, -16, -50, + -39, -9, -21, 109, -35, -9, 17, -28, -8, -102, + -23, -49, -3, -38, -117, 78 + }, + { + -31, -2518, -691, 887, 219, -190, -20, 60, -156, -363, + -465, -135, 207, -431, 237, -13, -117, -438, -301, 519, + 87, -511, -98, -117, 521, 111, 231, -30, -121, -64, + 93, -60, -71, -30, -49, 456, -159, 205, 98, -437, + 235, 118, 7, -155, 62, -69, -247, -103, -113, -153, + -3, 69, 109, 120, -28, -213, -33, 73, -61, -22, + 65, 86, -90, -185, 28, -28, -2, 36, 135, -31, + 147, -103, 21, 5, 41, 12, -40, -2, -7, -56, + -5, -82, -171, 43, 80, 80, -4, 114, -60, 10, + -33, -59, 40, -100, 4, 23 + }, + { + -132, -1123, 1769, -1215, 356, 63, 293, -212, -106, 191, + -482, -437, 253, -528, 182, -563, 724, 819, -126, -232, + -453, -284, -81, -166, 18, 650, 472, 321, -176, 244, + 15, 184, -573, 138, -137, 36, -145, -306, 450, 9, + 231, -400, 408, -83, 82, -105, -433, -160, 195, -155, + 98, 117, 248, -127, 218, 277, -80, -17, 64, 231, + 28, 96, 55, 80, 69, 179, -172, -83, -92, -103, + -122, -46, 13, -136, -168, 46, -159, 122, -3, -42, + -25, 96, 104, -92, -48, 2, -36, -63, 63, -2, + -20, 107, 20, 25, 55, 56 + }, + { + -592, -2646, 752, 1825, -134, 128, -413, 66, -378, 231, + -598, 438, 94, -311, -290, 33, 1138, -290, 123, 220, + 7, -244, 488, -227, 80, -144, 222, 693, 42, 459, + 400, -40, -284, 105, -106, -43, 182, 68, -333, -118, + -49, -250, 228, 21, -179, 181, 219, 268, 31, 208, + 112, 155, -133, -60, -169, -7, -158, 51, -201, -43, + -166, 108, 44, -137, -158, 65, -49, 56, -34, -48, + 12, 37, -23, 38, -106, 180, -81, 148, -21, 37, + -41, -29, -92, -63, 15, 35, -113, -103, -68, 13, + -41, 77, 62, -143, -10, 53 + }, + { + -60, -2075, 67, 150, -151, -73, 87, 273, -104, -286, + 50, -476, 167, -70, 369, -878, 238, -368, -750, 33, + -24, -65, -647, 138, -252, -129, -152, 259, 38, 261, + 180, 30, 251, -273, -222, -265, 218, -167, -200, -123, + 163, -179, 41, -86, 53, 114, -144, -162, 21, 51, + 103, 227, 140, -496, -174, -28, 148, -227, 138, -262, + -65, -7, -196, 117, -9, -28, 165, -142, -187, 14, + -61, -69, 16, -34, -39, -102, 26, 125, 90, 137, + 193, -63, -81, 158, 32, -166, 24, -21, 40, 54, + 153, 23, 89, -84, 41, 52 + }, + { + -858, -1864, -1228, 2773, -190, 212, -25, 21, 363, -124, + 340, 709, 453, -56, 573, -260, -208, -24, -171, 203, + -320, -288, 131, 265, 339, 371, -67, -14, 24, -323, + 299, 216, 83, -289, 519, 64, 225, -75, 264, -142, + -6, -18, -18, 191, 50, 187, 263, 70, 208, 78, + -109, -58, 1, 254, -155, 79, 7, -52, -247, -43, + 198, 164, 38, 156, -79, -124, -23, 15, 76, -118, + 23, 92, 100, -17, 72, -18, 26, -36, -15, 97, + -83, -140, 30, 29, 47, 119, 22, -62, -58, -134, + 68, 31, 22, 54, -19, -27 + }, + { + -23, 113, 445, -57, 52, 75, 116, 76, 55, 11, + -147, -98, -114, 726, -908, 136, 102, -299, -35, -560, + -144, 23, -97, 239, 148, 37, -30, 350, -152, 43, + 95, -28, 516, 487, 494, -304, -126, -181, -12, -181, + 202, -116, -405, -161, -384, 167, 81, -16, 30, -229, + -70, 54, -136, 54, 51, 46, 162, 34, -96, -33, + 63, -25, -37, 56, -49, -23, -95, -167, -92, -11, + -159, 111, 28, 20, 49, -31, 76, 56, 98, -120, + 69, 55, -2, -67, -1, -92, -66, 40, -14, -8, + -161, 51, -21, -33, -99, 30 + }, + { + -664, -4117, -303, 1769, 390, 254, -209, -354, -173, -55, + 604, -245, -155, -163, -72, -888, -694, 85, -280, 128, + 34, -575, 151, 122, -275, -47, -101, 376, 439, 131, + 65, -57, -155, 138, 399, 231, 206, -160, -120, -341, + -281, -203, -235, -95, -224, -164, -95, -213, -193, -90, + 78, -275, 27, -71, -115, 10, -82, -138, 155, -118, + 250, 171, -25, 23, 110, 87, -145, 124, 81, -226, + 9, 12, 154, 112, -70, -111, 235, 147, -125, -134, + 19, 76, -60, 64, 41, 42, -69, 28, 50, -46, + -24, 42, 55, -49, 31, -41 + }, + { + 50, 1457, 1072, 244, 217, -23, -149, 229, 415, -146, + -148, -298, 60, 59, -245, -184, -429, -79, -150, 50, + 531, 60, 136, 233, -400, -710, -214, 159, -212, -539, + 15, 408, -411, -190, 131, -15, -402, -19, -160, 218, + -193, -145, 501, -268, -162, 494, 97, 573, 136, -96, + 59, 199, 51, -34, -32, -105, -29, 4, -84, 217, + 21, -59, -103, -59, 142, 4, -57, -2, -177, -102, + 42, -48, -20, 161, 16, 102, -36, 158, 53, -17, + 32, 11, -23, 55, -1, -9, 67, 57, 82, 2, + -79, 13, 136, 28, 63, 14 + }, + { + 590, -1145, -378, 298, -741, -564, 741, -188, 725, -310, + -32, 491, -634, -1034, -1131, 463, -59, -411, 1231, 210, + 830, 204, 294, 128, -23, -94, -118, -186, -594, 426, + -260, -226, 150, 245, 136, -448, 157, -47, 157, -4, + -424, 157, 301, -536, 106, 34, -53, 76, -145, 111, + 40, 340, 37, -38, 208, 47, 204, -90, -69, -42, + -35, 129, -143, -274, 2, 120, 236, 65, 80, 34, + -130, -13, 149, 0, 143, 48, 109, -166, -10, 157, + 60, -86, -67, 15, -45, -79, 107, 37, -6, 52, + -27, 55, -29, 56, 73, -100 + }, + { + -100, 130, 327, 381, 426, 20, -421, 1246, 639, 497, + 346, -167, 163, -71, -202, 32, -128, -904, 246, -704, + -273, -240, -45, 549, -460, 108, 182, -341, -288, -205, + 276, -259, -122, 78, 29, -312, -234, 37, 116, 379, + -291, -300, 46, -191, -5, 382, -125, 54, 337, 65, + 235, -182, 10, -182, -58, -285, 29, -128, 347, -241, + 136, -281, -202, 56, -327, 53, 15, -1, 119, -60, + 104, -71, -285, 31, 13, -92, 91, -134, -192, 91, + -25, -83, 63, -82, -51, -46, 3, -73, -24, -96, + 104, -76, -24, -47, -28, -69 + }, + { + -972, 61, 94, 103, -496, 998, 202, -30, 193, -94, + 180, 7, 173, -611, -26, 145, 516, 291, 242, 836, + -161, -58, 71, 177, -331, -9, 105, 220, 77, -41, + 175, 147, -134, -56, 508, 226, -242, -348, -107, -255, + 163, -366, -175, -182, 50, -308, 343, -500, -266, 84, + 45, 50, -133, 161, 346, -214, -72, -52, 83, -123, + 246, 241, 288, 158, -216, 44, 64, -165, -64, -106, + 208, 84, -24, 50, 34, 31, 85, -257, -24, 14, + 115, -44, 177, -16, 116, 39, 56, 135, 7, -29, + -21, 45, 19, 86, -38, 38 + }, + { + -58, -1374, -121, -429, 615, 122, 208, -203, -101, 118, + 211, 252, 249, -885, 668, -123, -188, -232, -101, 79, + 811, -45, -176, 824, 188, 251, -324, -14, -29, 349, + 594, -656, -270, 305, 179, 13, 399, 30, 319, -4, + -523, -484, 92, -248, 9, -247, 319, 211, -265, -176, + 236, 130, -48, -175, -221, 399, 18, -37, 29, 92, + 45, -258, 241, 92, 175, -104, 136, 71, -76, -132, + 64, 91, 160, -87, -37, -143, 155, -90, 10, -111, + 0, -210, -58, 169, -82, -163, 148, 227, -30, -47, + -62, -29, -46, -25, -5, 106 + }, + { + -863, -711, -639, 871, -140, 369, 750, -596, 24, -186, + -123, -33, 538, 303, -146, -102, 535, -892, -350, 54, + 172, -40, -132, -425, 394, 295, 472, -534, -88, -313, + -747, -428, 453, -106, 12, -116, 267, 169, -43, 148, + 160, -110, 368, 272, 85, 40, 63, 153, 126, 118, + 115, 11, -527, -188, 118, 42, -111, -72, 73, -392, + -63, -139, -43, -103, -192, 10, -44, 105, 62, 263, + -25, -76, -56, 158, -86, -64, 124, 156, -104, 69, + -105, 0, 12, -67, -111, -58, 43, 84, -87, -29, + -121, -32, -19, 20, 24, 169 + }, + { + -20, 1360, 303, -182, 566, -86, 376, -131, -383, 276, + -738, 666, 223, -167, -1781, -721, -141, 28, 179, -329, + 475, -189, 442, 83, 569, -63, 230, -241, 840, 234, + -216, 224, -72, 57, 237, -15, -89, 306, -138, 125, + 124, 318, -139, -240, -30, -75, -247, 68, 90, 57, + 131, 157, -159, 45, 149, -50, 289, 80, 76, 31, + 1, 234, 165, 216, 126, 52, 4, 125, 57, 196, + -96, 102, 171, 63, -15, 62, 68, -116, -64, -51, + 50, -104, 42, 45, 213, -115, 110, -76, -210, -165, + 40, 104, 71, 62, 20, -123 + } + }, + { + { + -144, 7791, -1321, -3604, 642, -413, 233, -414, -258, -235, + 810, 769, 535, 252, -469, 270, 427, 448, -101, 488, + -383, -395, -483, -274, -4, -61, -149, 25, -407, 165, + -430, 324, -114, -188, -387, -210, 244, 10, -63, -162, + 111, 436, 258, 32, -61, -102, 45, 236, -60, -129, + 80, 169, -294, -285, -201, -68, -101, -324, -161, -121, + -211, -98, 66, -24, -17, 97, 192, 94, 9, -15, + -33, -63, -55, -76, -23, 3, 37, 8, 9, -14, + 12, -33, -118, 103, 10, -23, -8, 3, 47, -33, + 42, 23, 6, -32, -96, 25 + }, + { + -6, -582, 670, 1762, 609, 110, 38, -3, 41, 116, + -19, -261, -77, -364, 186, 201, 111, 144, 361, 632, + 88, -220, 437, -110, 503, 85, -42, -307, -361, -138, + 357, 638, 5, -273, -493, 241, -407, -248, 184, -136, + 512, -58, -242, -43, 64, -144, -161, 251, -42, -69, + 95, -108, -168, -130, 127, -70, 101, 67, -123, 46, + 18, 28, -33, -190, -7, 28, 59, -14, 32, -140, + 62, -44, 21, -120, -110, -79, -81, 12, -13, -30, + 66, 2, -68, 63, 20, -38, -89, 47, -71, 13, + 44, 28, 40, -71, 51, 5 + }, + { + 213, -3704, -532, 41, 970, -293, 70, -167, 98, 445, + 37, -46, 317, 3, 397, -440, 843, 838, 239, -55, + -415, -431, 27, 47, 19, 82, -86, 285, -126, 350, + 230, 172, -558, 129, -237, 37, -202, -583, 391, -15, + 162, -293, 553, -26, 47, 84, -284, -126, 189, 127, + 350, -136, 63, -94, -20, 16, -246, -1, -40, 31, + -189, -85, 50, 104, -9, 120, -169, -6, 63, 112, + -7, -89, 70, -58, -41, 78, -202, -85, -72, -62, + -132, -29, 76, -74, -10, 30, -63, -89, 20, -28, + -65, 75, -11, 17, 136, 83 + }, + { + 723, -444, 583, 1346, -166, -88, -330, 388, -256, 85, + -614, 699, 343, 420, 44, -274, 1078, 205, 169, -481, + 5, -239, 228, -50, 361, -10, -180, 353, -45, -101, + 239, 71, 51, 123, 32, 235, 213, 429, 28, -72, + -272, -395, 110, -346, -213, 394, 36, 65, 48, -76, + -72, 174, -123, 61, 190, 294, -19, -37, -58, 160, + -285, 2, 64, -124, -225, -76, -45, 119, 33, 0, + 94, 75, -25, 70, -68, 89, -181, 120, 16, -30, + -25, 20, -66, 72, 44, 20, -43, -16, -35, -25, + -60, 46, 48, -118, 14, 88 + }, + { + 66, -2181, -14, 426, 141, -74, -25, -233, -472, -439, + 102, -513, -39, 413, 1317, -917, 288, 416, -623, -67, + -16, 191, -269, 556, -211, 289, 233, 165, -179, -99, + -216, -52, 209, -194, -29, -91, 147, 197, -98, -287, + 82, -182, -139, -324, -97, 129, 68, 17, -39, -79, + 77, 301, 278, -324, 26, 143, 238, -211, 229, -64, + 97, 115, -164, -164, -176, -56, 183, -59, -80, -88, + -171, -52, 102, 127, 118, -63, -41, 49, 70, 127, + 126, -72, -30, 92, 28, -184, -21, -13, 41, 5, + 69, -84, 60, -38, -25, -3 + }, + { + 959, 909, -637, 2971, -554, 141, -71, 42, 37, -722, + -174, 598, 228, -325, 258, -510, 297, 313, -549, -268, + -404, -137, 227, 273, 308, -20, -401, 182, 111, -370, + -95, 70, 164, -464, 692, -51, 35, 56, 10, -264, + -27, -37, 135, 154, -2, 185, 358, 105, 61, -38, + 2, 48, -116, 110, -287, 57, -70, -83, -173, -171, + -89, 97, -57, 53, -60, -7, 4, -94, 86, -125, + -60, 26, -62, -82, 65, 42, 188, 47, 98, 138, + 47, 21, 42, -48, -27, 4, 34, 30, -27, -81, + 16, -20, 35, 52, 41, 51 + }, + { + -35, 417, 421, -314, 18, 50, 45, 8, 14, -48, + -19, -226, -159, 1319, -446, 379, 336, 88, 110, 12, + 624, 260, -469, -54, -356, -133, 381, 665, -34, -294, + -410, -346, 441, 8, 84, -204, 67, -296, -104, -7, + 156, 109, -26, 136, -278, -31, -136, -244, -62, -160, + 36, 272, -210, -54, -48, -130, -29, -110, -87, -73, + 7, -92, -185, 9, -6, 79, -92, -132, -41, 166, + -134, 85, 67, -4, -14, -62, 13, -142, -3, -101, + 45, 26, 59, -49, 54, -56, -36, 62, 8, 36, + -86, 67, -46, 55, -47, -7 + }, + { + 1033, -2171, 295, 2449, -136, -340, -186, 18, 9, 46, + 0, 47, 805, 281, 443, -810, -406, 107, -91, -85, + 224, 13, 96, -364, -257, 96, 119, 351, 428, 204, + -84, -393, -447, -179, 439, 232, -5, -105, -25, -75, + -14, -38, 19, 178, -181, -106, 68, -27, -30, -140, + 108, -206, 258, -78, -103, 57, -13, -93, 74, -182, + 106, 73, -144, -174, 81, -24, -22, 174, -11, -135, + -100, -144, -24, -40, 16, 61, 194, 25, -78, -82, + -13, 47, -155, -76, -44, 62, -56, 30, -4, -71, + -23, -12, -26, -75, 58, 20 + }, + { + -158, -946, -438, -240, -81, -116, -207, 96, 37, -227, + 219, -15, 127, 615, -24, 81, 579, 776, 105, 25, + 485, 231, 137, 312, -286, -644, -534, -134, 77, -213, + 202, 371, -566, -388, 52, 35, -306, 121, -81, 266, + -141, -408, 83, -352, -436, 185, 41, 329, -102, -82, + 150, 104, -11, -140, -100, 170, 149, -39, -215, 129, + 51, -131, -111, 148, 237, 30, 16, 85, -80, -46, + -7, -97, 60, 162, -41, 72, -70, 93, -75, -144, + -27, -27, -13, 33, -137, -136, -49, -32, 13, -74, + -119, -19, 71, -49, -40, -45 + }, + { + -637, -1623, 815, 526, -229, 750, 1778, -552, 177, -624, + -212, 56, -368, -173, -701, 188, -264, -560, 234, -15, + 905, -161, 264, -198, -129, -458, -489, -140, -126, 680, + -385, -183, -42, -9, 138, -55, 387, 150, 361, 429, + -392, -367, 155, -450, -257, -420, 78, 319, -37, -21, + 137, 635, -46, -159, 70, 16, 186, 113, 50, -21, + 0, 0, -231, -164, 81, -47, 22, -133, -70, -78, + -148, 37, 79, -102, 38, -62, 30, -153, -24, 111, + 24, -31, -54, 37, -44, -234, 8, 110, -67, -42, + -16, 59, -102, -41, 51, -83 + }, + { + 197, -541, -588, 55, -195, -202, 155, 410, -911, -481, + -161, -287, 423, 186, -415, -52, 128, -581, 155, -143, + 1016, 526, -37, 529, 97, 508, 278, -174, -135, -218, + 405, -123, -165, -37, 190, 155, 420, 324, -123, 54, + -158, -211, -81, -38, 197, 228, -270, 342, 0, -512, + 105, 139, 249, 116, 294, 158, 253, -86, 394, -177, + 120, -282, -89, 86, -331, 104, -193, -275, 35, -28, + 53, 22, -174, 38, -6, -114, 69, -27, -197, 35, + -5, -111, 88, -26, -89, -60, 38, -90, -39, -110, + 93, -46, 9, -11, 14, 49 + }, + { + 630, 2755, -221, -188, -808, -1065, -878, 267, 306, -514, + -216, 187, 32, -1678, -870, 18, 59, 16, -446, 76, + -526, -95, -58, -37, -524, -665, -518, -27, 244, -125, + 135, 185, 202, 175, 403, 263, 231, -24, -190, -389, + 329, -512, -135, 59, 106, -225, 626, -276, 0, 60, + -543, -206, 75, 228, 105, -329, 21, -47, -115, -185, + -13, -16, 75, 23, -56, 217, 104, -243, -28, -180, + 41, 42, -145, -139, -132, 46, 132, -209, 83, 77, + 22, -220, -38, -47, 4, -78, -7, 47, 0, 12, + -17, 18, -20, 80, -57, 65 + }, + { + 88, -1458, -428, -441, 672, -203, -55, 42, 103, -85, + -125, 426, -58, -1942, 308, 214, 456, 117, -318, -178, + 21, -315, -594, 31, -80, -533, -679, 272, 134, 520, + 886, -550, -12, 22, 125, 64, 71, -214, -122, -630, + -397, -119, 233, -111, -6, -351, -44, -186, -161, -110, + 231, 105, 46, 115, 11, 276, -114, -125, -102, 234, + 212, -157, 171, -21, 244, -37, -63, -3, -20, -146, + -182, -18, 88, -38, 49, -88, 97, -87, -44, -96, + 108, -34, 27, 169, -96, -134, 101, 77, -24, 54, + 89, 63, -77, 11, -41, 38 + }, + { + 742, 1984, 84, 1078, 65, 66, 441, 195, 851, -326, + -141, -601, 347, -78, -951, 382, 589, -851, 15, -180, + -378, -199, 202, -164, 595, -69, 190, -166, -162, -644, + -318, -133, 256, -69, -33, -307, -130, -294, -232, 2, + -216, -192, 401, 343, 97, -3, 65, -5, -289, -328, + 97, 304, -163, -79, -191, -13, 40, -57, 245, -144, + 266, 29, 81, 165, -92, 149, 74, 98, -49, 80, + -83, -54, -67, 66, -21, 50, 187, 103, -21, 166, + -117, -68, -49, -45, -41, 14, -14, 34, -68, 18, + -74, -64, -48, 46, -64, 84 + }, + { + 140, 1083, 16, -262, 35, -394, 651, -158, -505, 134, + -515, 792, 101, 1445, 2318, -182, -63, -332, -183, -99, + -105, -479, 198, 226, 896, -1, 595, -137, -114, -37, + 98, 165, 170, 205, 773, -312, -342, 594, -183, -1, + -46, 212, -7, -52, 116, -225, -131, -58, -419, -158, + 89, -295, -331, 129, 80, 12, 201, 120, 197, 74, + -197, 36, 24, -9, 0, -32, -205, -107, -92, 138, + -49, 67, -174, -219, 18, 86, 133, 8, -38, -121, + 51, 78, 94, -106, 33, -103, 89, -136, -92, 7, + 77, 60, 32, -6, 38, -51 + } + }, + { + { + -53, 5323, 950, -2957, 170, 136, -256, -414, -231, -85, + 463, 767, 845, -304, 162, -127, 447, 410, 554, -310, + 49, -392, -540, -189, -304, 98, 266, -471, -283, 19, + -78, 16, -272, -205, -374, -208, 187, 107, 25, -374, + 267, -70, 374, 86, 315, -140, -119, 200, 37, -20, + -184, 280, -215, -445, -135, 22, -252, -250, -227, -218, + 3, -69, -84, -24, -78, 99, 229, -56, 6, 14, + 3, -105, -55, 14, -118, -4, 65, 67, -74, 13, + 39, -41, -52, 21, 10, 42, -100, -59, 146, -56, + 58, 43, -4, 4, -53, -69 + }, + { + 61, 1341, -641, 1528, 376, 39, 207, -167, -42, 106, + -221, 22, 247, -255, 74, -176, -162, 360, 1034, 159, + 246, 392, 278, -344, 148, 335, -376, -29, -227, 61, + -120, 802, -70, -330, -403, 103, 113, -402, -118, 283, + 233, -95, -281, 251, -256, -18, -121, 357, -124, -123, + 37, -111, 66, -391, 284, -42, 210, 44, -239, 205, + 31, 19, -217, -70, 33, -9, 41, 11, -164, 30, + 11, -5, 23, -72, -178, -51, -69, -48, 116, -62, + -5, 68, 29, -54, -32, -21, -47, -85, 36, -14, + 66, 21, 31, 24, 17, -97 + }, + { + -151, -4168, 497, 1584, -804, -38, -385, -90, 392, -196, + -95, 816, -14, 651, -19, -289, 909, 245, 786, -196, + -477, -403, 297, -153, 133, 106, -294, -69, 136, 455, + -205, 500, -495, -167, -155, -255, 187, -425, 36, 168, + -75, 124, 216, 113, 10, -9, -73, -27, -64, 159, + 48, 82, -131, 90, -140, -33, -82, -115, 86, -165, + -35, -122, 199, -34, 6, 41, -92, 27, 0, 158, + -2, -36, 90, -120, 38, 57, -49, -171, -86, 37, + -173, -58, 46, 6, -36, -39, -75, -74, -24, 63, + -46, 13, 22, -57, 148, 25 + }, + { + -690, 1356, 724, 1576, -431, -233, -93, 100, 227, -340, + -528, 971, -20, 254, 606, -477, 895, -70, -111, -403, + 176, 205, -147, 228, 85, -93, 111, 86, 369, -472, + 241, -124, 656, -29, -136, 383, 100, 208, 169, 91, + -396, -275, -98, -312, 94, 98, 132, -70, 132, -241, + -89, 12, 72, -85, 198, 312, 276, -299, 159, 54, + -56, -187, 14, -67, -191, -126, 63, 57, 165, -122, + 152, 20, 43, 74, 17, -16, -187, 53, 69, -85, + 66, -8, -123, 112, 63, 66, -16, -48, -22, -45, + -27, 24, 36, -23, -75, 155 + }, + { + 10, -1773, -127, 388, 188, -30, -97, -678, -159, -278, + -26, -586, -83, 425, 1320, -610, -359, 1094, -600, -304, + 188, 307, -295, 316, 427, -95, -339, 488, -161, -523, + 58, 328, -474, 301, -17, 217, -352, 500, -128, -10, + -255, 181, -474, -360, -5, 199, 209, -89, -91, 30, + 81, 212, 13, 78, -70, 236, 198, -115, 63, 52, + 78, 60, 15, -365, -97, -177, 314, -199, 102, -146, + -162, -1, 94, 174, 53, 3, -78, 66, 100, 18, + 89, -19, -62, 52, 23, -68, -122, -1, 98, -25, + 8, -65, 37, 38, -90, 33 + }, + { + -718, 3090, -179, 2518, -33, -152, -23, 280, -674, -72, + -610, 712, 77, -248, -6, -229, 268, -170, -375, -324, + -246, 90, 288, 262, 139, -6, -247, 227, -301, 87, + -223, -66, 412, -546, 403, 208, -231, 231, -240, -71, + 125, -164, 208, 136, -82, 244, 385, 102, -109, -30, + 112, -83, -128, -52, -29, -9, -157, -100, -190, -43, + -236, 132, 54, -110, -30, -30, 97, -1, -40, -13, + -177, 47, -128, -52, 38, -12, 287, 17, 129, 50, + 89, 83, 26, -46, 6, -76, 40, 110, -56, -56, + 30, -43, 41, 48, 49, 60 + }, + { + 0, 942, -574, -191, 50, 82, -56, 48, -56, -225, + 377, -645, 351, 226, 44, 456, -355, 1026, 4, 397, + 680, 117, -352, -58, -555, 167, 331, 149, 185, -263, + -86, -335, 169, 106, -200, -228, 46, -219, 60, -47, + -264, 422, 205, -61, 14, -165, -314, -80, -104, 32, + -16, 203, -212, -83, -195, -131, 105, -135, -82, -225, + 133, -90, -150, -63, -4, 153, -162, 42, -166, 202, + -25, 5, 122, -119, -40, -22, -56, -119, -2, -61, + 130, -105, 119, 4, -50, 13, 21, 16, 34, -8, + 9, 14, -27, 15, -24, 14 + }, + { + -1253, 765, 457, 2561, -52, -93, -782, 478, 94, -77, + -980, 461, 1407, -302, 699, -415, -106, -126, 243, 75, + 35, 106, -52, -570, 38, -259, 632, 260, -88, 478, + -66, -530, 100, -362, 199, 164, -208, -14, 57, 52, + 6, -154, 197, 141, -85, -286, 104, -67, 202, -240, + 98, -85, 268, -66, -47, 103, 146, -318, 93, -64, + 35, -142, 25, -276, 59, -93, 246, 59, -211, 74, + -73, -134, -214, 4, 84, 78, 50, 19, -38, -28, + -35, 38, -159, -81, -52, 2, 68, -45, -34, 28, + -44, -16, -43, -122, 53, 44 + }, + { + -16, -1607, -528, -525, 68, -20, -148, 160, -482, 25, + 199, 261, 109, 238, 461, 1353, -77, 149, 350, 451, + 186, 245, 14, 160, -117, -61, -557, -374, 348, -99, + -187, 390, -146, -173, -357, -370, 135, 131, -150, 169, + -345, -179, 14, -145, -280, -315, 353, 161, -103, -23, + 235, -21, 5, -247, -145, 242, 68, -122, -108, 269, + -49, -158, -46, 167, 200, -67, -2, 276, -140, -141, + -69, -58, 201, 28, -74, 27, 40, -56, -40, -120, + -49, 2, -45, 12, -119, -77, -93, -22, -37, -80, + -124, 75, -58, -11, -106, 9 + }, + { + 685, -2449, -233, 596, 964, 446, 524, -217, -83, -280, + -344, -929, -109, 335, 207, -528, -400, 204, -302, -149, + 594, -165, 403, -204, -547, -195, -619, 11, 194, 79, + -129, 199, -350, 7, -38, 475, -14, 272, 438, 197, + 74, -494, -338, 122, -197, -732, 40, 109, 132, 305, + -149, 652, -57, -204, -35, 125, 143, 117, 1, 82, + -126, 196, -148, -165, 104, -87, -107, -75, -126, -92, + -173, 138, -179, -10, 68, 96, -175, -81, 59, 87, + 127, -134, -174, 178, -41, -228, 111, -42, -97, -43, + -14, 3, -4, -72, -12, 34 + }, + { + -169, -1050, 779, -267, -342, -704, 879, 208, -1103, -671, + -219, -103, 119, 406, -642, 405, 111, -68, -321, 130, + 589, 389, 393, 286, 541, 259, -122, -70, 118, -14, + -137, 367, -86, -748, 220, 319, 488, 461, -1, -229, + 86, -309, -341, 367, -138, 246, -241, 412, -43, -241, + -153, 224, 161, 348, 181, 414, 3, 96, 176, -36, + 110, -316, -59, 60, -118, 13, -102, -333, -49, 108, + -104, 117, -81, -50, -27, 76, -67, 64, -170, -74, + 32, 56, -139, -7, 3, 4, -55, -18, -114, -19, + 4, -19, 5, -40, 2, 39 + }, + { + 134, 3837, -824, 435, -321, -2998, 13, 37, 373, -197, + -1207, 915, 212, -1630, -1153, 261, -716, 16, 197, -561, + -577, -234, 15, 80, -104, -590, -369, -669, 432, 16, + -289, 274, 491, 200, 184, 366, -12, -144, -49, -215, + -28, -79, -4, 34, -159, 261, 287, -231, 235, -81, + -501, -383, 84, 288, -48, -281, -27, 229, -281, 21, + -216, -25, 67, 29, -49, 232, -111, -189, 79, -40, + -62, 13, -105, -127, -304, 135, 67, -46, -43, 163, + -103, -198, -102, 3, 5, -57, -12, 6, -23, 58, + -39, 28, -1, -50, 23, 29 + }, + { + -19, -1366, 2, -359, -62, 292, -404, 485, -135, 215, + -444, 433, -776, -1565, 800, 427, 265, 18, -387, 421, + -621, -711, 124, -312, -512, -167, -538, -365, 969, 20, + 890, -278, 143, 26, 58, 110, 107, -267, -487, -457, + -223, 60, -106, 59, -130, -170, -128, -381, 246, -114, + 75, -169, 181, 120, 302, -214, 149, -39, -139, 440, + -22, -235, 157, 105, -40, 77, -41, -152, -6, 149, + -341, 24, -38, 91, 3, 52, -74, -25, -199, 141, + 17, 74, 16, 170, -140, 46, 15, 66, 29, 12, + 140, 21, -129, -22, -15, 53 + }, + { + -292, 3263, 606, 624, 107, -116, -136, 822, 494, -389, + -68, -1090, 199, 548, -1230, -231, 314, -2, 12, -378, + -705, 44, 200, -85, 458, 312, -193, 332, -3, -897, + -359, 78, -54, 308, -1, -187, -622, -352, -192, -52, + -365, 349, 96, 450, -138, 89, 235, -144, -463, -219, + -4, 187, 263, -190, -111, -259, 239, -87, 244, 36, + 161, 20, 37, 203, 60, 156, -82, 83, -9, 59, + -163, 32, 18, -141, 31, 129, 198, -51, 74, 137, + -43, -174, -164, 107, 3, 72, -109, 48, -4, 50, + -35, -114, -98, 70, -39, -36 + }, + { + -162, 1339, -3, -97, -222, -109, 421, -208, -221, -423, + 433, 196, 265, -1410, 5130, 462, -385, 483, -1070, 120, + -537, -205, -463, 882, 135, 596, 240, 435, -299, 28, + 9, -206, 502, -87, 878, -567, 298, 365, -174, -87, + 84, -19, 277, -191, 143, -79, -98, 142, -572, -384, + 264, -425, -354, 203, -38, 19, 24, 213, 235, 118, + -186, 46, -212, -23, -40, -6, -249, -1, -119, 92, + 66, -71, -121, -170, -46, 129, 81, -22, -8, -60, + 63, -7, -61, 8, -86, -34, 35, -95, -117, 165, + -8, -12, 72, 4, 5, 14 + } + }, + { + { + 185, 5029, 178, -477, 1786, 18, -223, -249, -234, -163, + 319, 452, 130, -386, 85, -314, -298, -46, 406, -299, + 336, -86, -13, 495, 164, -30, 216, -255, 177, 79, + -167, -254, -300, -171, -479, -199, 4, 229, 155, -320, + 126, -423, 355, 332, 510, 50, -107, 92, 188, 202, + -12, 228, 78, -60, -78, -55, -225, -25, -111, -69, + -112, -190, -180, -163, -262, -245, 68, -140, -70, -62, + -44, 18, -27, -58, -138, -56, -1, 91, 20, 136, + 112, 48, -39, 34, -30, 50, -31, -44, 156, -23, + 45, 17, 16, 42, -29, -89 + }, + { + -41, 2513, 545, -732, -1281, 141, 155, -358, -179, 91, + 203, 207, 40, -340, -75, -344, -323, -209, 120, -591, + 607, 488, -103, 99, 607, 414, -482, 174, -28, 85, + -363, 757, 140, -186, 107, 323, 301, -98, -83, 118, + 88, 103, -214, -9, -604, -60, 111, 268, -300, -155, + 178, -1, 454, -27, 203, -141, 156, -1, -417, 54, + 252, 162, -148, -136, -131, 18, -6, 47, -197, -4, + 14, -42, 37, 53, -73, 18, -45, -58, 242, 33, + -77, -12, 20, -111, -56, -2, -41, -33, 91, -89, + -40, -5, 54, 50, -5, -112 + }, + { + -30, -4796, -84, 3282, 347, -128, -512, -444, 34, -396, + 261, 1162, 86, 411, -404, -197, 896, 234, 894, -64, + -328, -435, -13, -245, 427, 90, -502, -90, 233, 198, + -609, 726, -21, -137, -290, -74, 352, -674, -399, 142, + -3, -11, -220, -120, -187, 18, 146, -289, -502, -98, + -266, 14, 25, 60, -177, 23, 38, 92, 401, -80, + 170, 259, 288, -95, 69, -57, -91, 150, -26, 50, + -90, 7, 167, -43, 29, 58, 109, 74, 73, 135, + -61, -9, -66, -43, 17, 34, -9, -48, 23, 115, + 11, -58, 11, -50, 125, 44 + }, + { + 398, 2557, 320, 2219, 11, -188, 128, 24, 109, -375, + -734, 219, -211, 83, -186, -1134, 205, -838, -443, -290, + 473, 299, -165, 30, 321, -88, -142, -359, 346, 36, + 24, -308, 712, -170, -19, 333, -186, -192, -224, 210, + -44, -165, -167, -137, 132, -141, 134, 79, -26, -289, + -56, -97, 140, -65, 78, 122, 213, -38, -8, -102, + 268, 87, 85, -3, 115, 51, 132, -69, 100, -25, + 37, -102, -4, -60, -49, 70, -39, 13, -25, -39, + 166, 46, -119, 21, 8, 2, 16, 26, 12, 55, + 56, 57, 50, 63, -26, 68 + }, + { + -95, -1547, 20, -97, -122, 1, -102, -476, 102, 96, + 312, -491, -249, -67, 1326, 103, -703, 477, -267, -723, + -519, 314, -618, -298, 68, -801, -224, 980, 41, -487, + 247, 595, -513, 439, 234, 153, -410, 289, 270, 554, + -400, -124, -205, 4, 76, 166, 300, 116, 156, 184, + -93, -92, -47, 367, -23, 113, 125, -37, 90, 128, + 126, -60, 123, -2, 186, -107, 108, -377, 34, -45, + -74, -122, 16, 77, -92, -40, -118, -5, 152, 12, + -15, -66, -78, 57, 3, -17, -57, -20, 92, 1, + -9, 24, 107, 57, -57, 45 + }, + { + 125, 3910, 86, 2614, -7, -233, -38, 696, -700, -37, + -955, 178, 54, 176, 279, -486, 91, 9, -14, -268, + -238, 431, 496, -111, 100, 100, -126, 178, -343, 249, + 94, -2, 332, -210, 258, 160, -366, 16, -24, 202, + 332, 20, 122, -88, -253, 144, 190, 94, 53, 137, + 122, -399, -257, -127, -39, 9, 86, 49, -124, 149, + -52, 45, 120, 41, -105, -134, 199, 141, 1, 66, + -42, 162, -110, -125, 9, -30, 154, 31, 149, 18, + -9, -43, -74, -44, 17, -89, 40, 117, -28, -21, + 117, -36, 66, 84, -19, 4 + }, + { + 34, 1038, -422, -212, -78, 100, -56, 105, -21, -187, + 263, -674, -37, -394, -357, -153, -942, 831, 266, 395, + 197, -400, -221, -203, -607, 152, 408, -109, 218, 130, + -306, -285, -496, -369, 41, -191, 56, -205, 240, 123, + -60, 353, 21, -208, -123, 21, 115, 322, -20, -132, + -217, -46, -87, 92, -7, -125, 250, 89, -186, -197, + 227, 28, -48, -92, -112, 51, 21, 160, -132, 126, + -78, 68, 100, -142, 82, 42, 57, 71, 151, 33, + 185, -20, 74, -52, 8, 95, 49, -102, -99, -35, + -34, -20, -57, -13, -12, 36 + }, + { + 1071, 3743, 662, 1838, -1379, 147, -1755, -220, 127, -348, + -455, 274, 842, -348, 661, 143, 16, -429, 281, 522, + 15, -79, 312, -217, -321, -428, 194, 143, -72, 327, + -202, -465, 504, -264, 109, 202, -261, -152, 159, -22, + -197, -238, 194, 183, -229, -434, -66, -157, 323, -307, + -29, 74, 242, 257, 178, 36, 296, -225, 162, 102, + 113, -135, 175, -208, -3, -139, 21, -33, -197, 30, + 108, 63, -85, 85, 130, 47, -102, -117, -48, 89, + -13, 11, -26, 45, -26, -29, -15, -103, 19, 147, + 52, -51, -49, -78, 22, -76 + }, + { + 141, -118, 232, -136, 422, 41, -13, 225, -334, 110, + -128, -123, -532, -7, 961, 1495, 657, 560, 233, 586, + 232, 354, 141, 168, 157, 775, 69, -50, 577, 146, + 130, 684, -259, -539, -645, -670, 156, 498, -76, 227, + 229, 115, -196, 137, 143, -419, 5, 6, -6, 135, + 207, -113, -90, -93, -136, -55, -36, -73, 109, 318, + -128, -85, -73, -133, -172, -270, -195, 144, -120, -125, + -116, -29, 186, -64, -27, 20, 42, -92, -45, -75, + 7, -1, -18, 55, -66, 4, -24, 74, 82, 27, + -70, 73, -110, 26, -42, 76 + }, + { + -756, -4023, -120, 132, 709, -712, -650, 99, -94, -368, + -158, -564, 183, 511, 421, -281, -76, 347, -721, -901, + 245, -14, 305, 343, -430, 123, -286, 147, 278, -50, + 182, 172, -379, 51, -123, 295, -321, 45, 21, 40, + 529, -80, -139, 318, 47, -348, 40, -76, 390, 435, + -366, 217, -145, -87, -116, -39, 99, 36, -23, 117, + -349, 160, -76, 105, 250, 119, 19, -101, -126, 17, + -4, 212, -117, 64, -3, 78, -119, -4, 25, 82, + 180, -91, -71, 231, 124, 17, 229, -40, -42, -52, + 6, 16, 27, 25, 19, 82 + }, + { + 89, -1489, 892, 20, -140, 17, 940, 356, -449, -110, + 447, -82, -479, 93, -468, 571, 323, 588, 114, 397, + -95, -112, 789, 307, 233, 126, -417, -155, 380, -399, + -693, 195, -87, -531, 285, 349, 344, 72, -368, -533, + 101, -206, -344, 430, -204, 319, -245, 7, 94, 221, + 17, 35, -68, 197, -31, 71, -193, 49, 80, 1, + 322, 55, 34, 175, 153, -11, -38, -27, 55, 27, + -97, 201, -36, -94, -36, 19, -79, 83, -115, 67, + 59, 31, -130, -53, -46, 11, -90, -31, -74, 26, + -14, -54, -90, -109, 2, -11 + }, + { + -950, 2205, -608, 385, -414, -2322, 867, -306, 113, 754, + -1001, 665, 187, -826, -479, 895, -577, -420, 133, -346, + 40, 196, 433, 318, 286, -42, 305, -460, 343, -39, + -332, 474, 31, -133, -244, -209, -495, -228, 162, -102, + 103, 271, 109, -15, -258, 3, -107, -226, 416, 266, + 76, -320, -154, 307, -132, -224, 117, 211, -285, 334, + -95, -107, -108, 20, 28, 55, -387, -160, 261, 181, + 3, -52, 92, 67, -297, 76, -115, -63, -24, 75, + -142, -39, 44, -59, 56, 77, -67, -74, -5, 49, + -31, 91, -7, -174, -17, 14 + }, + { + -77, -1246, 328, -224, -277, 139, -584, 57, 40, 553, + -420, 376, 523, -375, 172, 118, -377, -400, -380, 736, + -418, -611, 805, 266, 151, 635, -151, -413, 964, -239, + 281, -103, 574, 109, -13, 286, 96, -24, -395, -26, + -37, -5, 101, 279, -30, -129, -63, -341, -108, -224, + 92, -268, 119, 67, 377, -69, 333, -127, -161, 101, + -221, -55, 68, -95, -243, -25, 6, -37, 50, 124, + -181, 69, -108, 22, 4, 146, -26, -4, -89, 209, + -28, 55, 22, 145, -209, -21, -68, -13, 3, -46, + 14, -45, -100, 22, 19, 64 + }, + { + -364, 2249, -1008, -110, -151, -270, -233, 249, -506, -344, + 438, 392, 615, 557, -891, -934, -33, -357, -575, -356, + -660, -75, 116, 199, 641, -301, -237, 1080, 465, -275, + 214, -38, -466, 255, 352, 32, -615, -128, 39, 207, + -89, 424, -119, 465, -100, -105, -72, -178, -69, 169, + -327, -286, 442, -52, 112, 16, 240, -146, 82, 107, + 72, -153, 29, 42, -85, 32, -258, -73, -43, -9, + -188, -47, 31, -58, -32, -20, 93, -31, -55, -27, + -36, -164, -137, 215, 80, 113, -111, 71, 2, 23, + 20, -91, -113, 9, -41, -15 + }, + { + 155, 959, -992, -390, 103, -178, 100, -72, 59, -141, + 307, -343, 163, -2286, 1920, -215, -261, 983, -1491, -1345, + -1167, -41, -611, 347, 14, 243, -736, 444, 344, 362, + 11, 111, 636, -84, 243, -512, 1024, 250, -147, -28, + -404, -275, 429, -247, 57, 201, 158, 529, -32, -448, + -116, -348, -220, 229, 69, -77, -133, 46, 205, 187, + -173, -98, -86, 254, -65, 158, -207, -26, -19, 116, + 73, -72, 126, -3, -97, 2, 15, 21, 11, -78, + 11, -124, -143, 25, -77, -48, 8, 41, -41, 117, + -84, -46, 15, 48, 3, -3 + } + }, + { + { + -290, 8025, -1628, 2083, -708, 171, -183, 162, -308, 449, + -639, 625, -100, -58, -278, 54, -341, -28, -207, -16, + 461, -93, 380, 116, 488, -198, 213, 58, 270, -145, + -290, -289, -386, 180, -450, 16, -223, 262, -153, -147, + 120, -141, 364, 293, 50, 300, 15, -9, 184, 180, + 134, -4, 170, -62, 40, -10, -42, -52, -141, 63, + -357, -41, -208, -165, -214, -245, -9, -138, 13, -62, + -93, 5, -63, -49, -159, 3, -107, 99, 41, 165, + 74, 67, -33, 62, -65, 52, 10, -20, 88, 65, + 23, -3, 24, 11, -62, -23 + }, + { + -36, 2869, 125, -2456, 382, 151, -85, 5, -104, -221, + 82, 189, 155, -185, -81, -554, -72, -57, -440, -364, + 1049, -87, -228, 861, 284, -35, -504, 196, 450, -401, + 28, 356, 208, 172, 418, 316, 40, 6, -156, 30, + 78, 146, -378, -296, -31, -190, 396, -331, -130, -217, + 150, 111, 384, 17, 218, -148, 4, -5, -225, -195, + 287, 156, -31, -235, -168, 245, -231, 72, -5, -159, + -11, -71, 114, 57, -57, -44, 45, -72, 114, 107, + -22, -24, -46, -108, 7, -26, -6, 54, 0, -38, + -118, 19, 22, 3, -20, -52 + }, + { + 203, -5420, 89, 2788, 815, -160, -244, -407, -56, -413, + -263, 1786, 22, -81, 349, -734, 828, 167, 1236, 1, + -526, -501, -118, -130, 286, 325, -146, -23, -49, -309, + -78, 816, 6, -107, -421, 321, -355, -276, -560, 106, + 24, -134, -80, -83, -273, -99, 203, -414, -264, -169, + -201, -171, 304, -170, -13, -281, 217, 101, 314, 72, + 266, 356, 135, -43, 121, -31, -117, 162, 29, -23, + -115, 58, 44, 33, -82, 214, 17, 48, 57, 69, + -20, 89, -130, 20, 115, -38, 35, -52, 153, -17, + 47, -74, 23, 10, 65, 63 + }, + { + 108, 3014, 174, 2780, -459, -134, 102, 148, 154, -666, + -391, -168, 338, -244, -868, -365, -114, -919, -526, 285, + 241, -260, 102, 149, 115, -87, 517, -788, 107, 393, + -213, -51, 382, 79, 86, 38, -41, -292, -34, -50, + 114, -184, -280, 241, -117, 53, -155, 194, -44, 11, + -169, -143, 32, 144, -100, 168, 102, 339, -404, -20, + 255, 45, -26, 95, 231, 100, -36, 67, -31, 9, + -18, -20, -68, -167, -5, 50, 11, 117, -138, 19, + 172, -41, 3, -84, 31, -44, 76, 95, -45, 9, + 64, 111, -59, 81, 41, -14 + }, + { + 124, -1161, -629, -443, 166, 22, -227, -79, -25, 237, + -40, -232, -33, -115, 1863, -400, 268, -1442, 270, -259, + -820, -415, -86, -174, -24, -820, 336, 628, 35, -88, + 407, 175, -336, 291, 145, -250, 257, -441, 400, 444, + -7, -430, -8, 80, -135, 216, 462, 69, 178, 181, + -279, 226, -105, 266, 6, -39, 120, 86, 78, 126, + 72, 29, 13, 151, 38, 23, -72, -260, 53, -142, + 82, -49, -143, -24, -41, -47, -67, -76, 53, 142, + -50, -91, -12, -51, 41, -57, 47, 45, -22, 31, + 5, 55, 120, -6, 0, -17 + }, + { + 651, 3012, -173, 2712, 313, -83, -26, -96, 423, -231, + -101, -344, -471, 653, 108, -947, 75, 836, -12, -506, + -329, 339, 298, 290, 189, -137, 80, -522, 153, 286, + 213, 292, 16, 81, 6, 162, -21, -528, 149, 429, + 119, 155, 59, -219, -116, 315, 84, 107, 77, 3, + 76, -349, -167, -207, 66, -85, 190, -13, 28, 36, + 180, -166, 79, 175, -159, -47, 127, 164, -23, 21, + -67, 166, -44, -23, -56, 70, 13, 134, 87, 4, + -20, -21, -80, -71, -32, 5, -15, 57, 31, -51, + 138, 10, 61, 52, -28, -29 + }, + { + 4, -91, 827, -112, -85, -117, 3, 108, 15, 178, + -392, -259, 111, -577, -303, -634, -868, 857, 329, 468, + 163, -972, -161, -912, 264, -95, 444, 600, -442, 494, + -541, -227, -473, -247, 275, -493, -145, 41, 177, 175, + 157, -135, -275, 333, -234, -116, 367, 81, 100, -57, + -116, -284, 174, 60, 61, -163, 150, 134, -251, 14, + 44, 255, 31, -129, -82, -67, 126, -62, 197, -71, + -48, 120, -130, -13, 151, -18, 177, 53, 94, 9, + 205, 78, -67, 15, 86, 34, -16, -31, -95, 12, + -143, -4, -75, 42, -42, 74 + }, + { + -396, 6315, -783, 852, -152, 256, -1093, -707, -232, -766, + 1151, 52, -407, 616, -138, -206, 128, 441, 105, 284, + 16, -364, 151, 317, -789, 298, -41, 73, 126, -46, + -287, -200, 304, -158, 147, 3, 88, -329, 219, -30, + -239, -264, -56, 295, -414, -26, -224, -100, -76, -104, + 32, 207, -107, 308, 319, -62, 273, 32, 87, 108, + 107, 10, -56, 55, -44, -170, -15, -78, -79, -185, + 187, 87, -24, 48, 77, 44, -26, -143, -4, 24, + 94, -21, 18, -27, -9, -13, -101, -50, 54, 128, + 65, -162, 29, -16, 62, -76 + }, + { + -9, 1295, -387, 346, 116, -102, 118, -11, 17, -27, + 49, -216, -599, -144, 1058, 779, 977, 396, 153, 888, + 190, 22, 418, -63, 367, 599, 441, 3, 202, -339, + 278, 949, -294, -571, -164, -1008, 179, 355, -104, 113, + 472, 381, -370, 150, -233, 233, -316, -128, 27, 339, + 144, -34, -307, 163, -152, -54, -12, -36, 274, -93, + -6, 90, -158, -201, -199, -321, -150, -25, -107, 23, + -88, -109, 219, -98, 94, 64, -14, -88, 34, -79, + -6, 60, -61, 0, 10, 39, -44, 120, 72, -63, + -14, 51, -71, -11, 19, 45 + }, + { + 782, -5915, 8, -231, -20, -581, -647, 1685, -373, -1287, + -71, 9, 343, 314, -115, 167, 146, -384, -708, -277, + 196, -266, 54, 982, -417, 36, -142, -33, 509, -282, + 357, -79, -336, -106, 266, -108, -73, -138, 105, -60, + 262, -42, -120, 226, 73, -183, 61, 40, 326, 50, + 174, -391, 66, 198, -24, -426, 217, 190, -276, 220, + -448, 310, -42, 151, -72, 460, 7, -9, -204, 26, + 46, 159, 64, 20, -144, 60, 14, -25, -13, -9, + 211, 10, -17, 117, 132, 153, 128, -48, 34, -90, + 23, 68, -7, 18, 48, -13 + }, + { + -63, -2251, 1326, 124, -25, 1447, -655, 31, 690, -68, + 282, 95, -1245, -105, 552, 212, 291, 803, 377, 185, + -445, 110, 400, 459, 593, -287, -373, 59, 205, -317, + -424, -5, -147, -298, 686, -80, 371, -31, -286, -310, + 63, -200, -250, 74, 112, -94, 160, -409, 157, 337, + 67, -164, 50, 67, 56, -268, 188, 12, -110, 45, + 23, 306, 134, 142, 158, -113, -119, 198, -4, -38, + 39, 45, -26, -110, -24, -33, -25, 10, -134, 136, + 50, -15, -1, -99, -8, -18, -124, -107, 24, 45, + -74, 45, -198, -4, -26, -11 + }, + { + 1246, -2204, 1682, -203, -1104, 570, -1058, -329, 5, 1489, + -733, 104, -512, 444, -592, 349, 608, -983, 22, -435, + 819, -205, 636, 228, 51, 244, 275, -218, -55, 765, + -647, -114, 284, 112, -576, -121, -471, -36, 53, -326, + 220, 423, -51, -94, -78, -216, -437, -19, 411, 62, + 353, 42, -544, 233, -71, 0, 27, 210, -105, 85, + 65, -40, -313, 29, 233, 23, -377, -69, 121, 183, + 92, -93, 19, 60, -134, -55, -12, -46, -119, 82, + -88, -10, 165, -133, 31, 172, -159, -108, 65, 12, + 56, -24, 25, -111, -85, 12 + }, + { + 116, -1657, 654, -400, -174, -11, -563, -77, 43, 469, + 261, -96, -546, 859, -684, 395, -338, -544, -336, 645, + 81, 28, -410, 629, 397, 566, 360, -436, 603, 379, + -427, 358, -49, 172, 42, 240, 234, 313, -594, -29, + 36, 44, 56, 153, 75, -190, -241, 100, -458, -152, + -55, -3, 72, 66, 201, 50, 126, -97, -61, -88, + -18, -54, -182, 48, -16, -246, 80, 81, 109, -188, + -14, 13, 57, -137, 34, 79, 8, -15, 31, 127, + 4, -73, 103, 23, -182, -79, -8, -100, -3, 3, + -136, 34, -34, 44, 75, -85 + }, + { + 928, 439, -1195, -273, 119, 471, -581, 81, -819, 401, + -65, 365, 742, -332, 800, -339, -595, -430, -159, -133, + -439, -424, -43, 484, -135, -291, 416, 365, 531, 482, + 17, -396, -484, 384, 773, -701, -360, 312, 158, -176, + 372, 99, 150, 47, 285, 64, -308, -518, 277, 45, + -32, -572, 171, 111, 189, 280, -206, 165, -230, 190, + -45, -28, 24, -25, 52, -150, -128, -122, 92, -94, + -140, -160, 40, 123, -72, -90, -40, 4, -51, -36, + 29, -121, -76, -6, 141, 99, -52, 40, -15, 75, + -72, -21, -71, -40, 8, 36 + }, + { + -213, 745, -374, -678, 507, -98, -165, 101, -169, 218, + -387, 44, 18, 767, -3079, 835, -388, 536, -1328, -1394, + -512, -630, -166, 0, 197, 201, -793, 430, 315, 729, + -349, 528, 325, 242, -248, -466, 911, 273, -242, -38, + -339, -93, 52, -103, 107, 121, 5, 565, 6, -105, + -554, -219, 183, 94, -22, -240, 112, 47, 49, 156, + -38, -300, 52, 311, -7, 130, -155, 21, -157, 55, + 107, -28, 186, 46, -111, -86, -13, 59, -21, -56, + 53, -137, -113, 7, -23, 2, -120, 152, -49, 7, + -19, -26, -7, 105, -78, -38 + } + }, + { + { + 517, 11878, 1103, 4104, 586, 530, 34, 197, -477, 411, + -419, 1015, 352, 333, -160, 198, 384, 287, -300, -245, + 275, 79, 598, -13, 564, -385, 209, 546, 428, -680, + -547, -114, -328, 392, -148, 136, -590, -98, -84, -143, + 441, 393, 169, -304, -284, 359, 51, 39, 171, 30, + 40, 12, 96, -141, 199, 175, 96, 147, 41, 38, + -407, 121, -26, 28, -42, -98, 72, -50, -46, -91, + -196, -174, -82, -68, -129, 26, -202, 17, -26, 11, + -50, 29, -19, 40, -28, 54, 9, 7, 3, -4, + -8, -8, 45, -1, -26, 58 + }, + { + 87, 2062, -649, -1348, 1244, 93, -203, 327, -30, -238, + -17, 120, 274, 234, 19, 173, 787, -251, -229, -15, + 273, -423, 377, 950, 259, 36, -517, -220, 101, 48, + 463, 275, -269, 146, 695, -54, -359, -106, -219, 198, + 13, -99, -258, -146, -100, -286, 483, -129, 70, -366, + -29, -35, -44, -328, 274, -219, -115, 7, -82, -339, + -46, 54, 45, -70, -7, 298, -181, 106, 190, -93, + -141, -156, 101, -17, -157, -25, 59, -178, -21, 28, + -50, -26, 21, -36, 49, -49, 34, 194, -48, -76, + -61, 7, -7, -66, -43, -27 + }, + { + -307, -4898, 969, 166, -1041, 25, 183, -114, 360, -49, + -118, 2002, -763, -556, 231, -957, 690, -76, 808, -188, + 17, -88, -104, -449, -64, 351, 109, 358, 158, -87, + -105, 208, -114, -305, -135, 574, -527, -37, -492, 145, + 224, -146, -58, 175, -184, -78, 334, -28, 226, 221, + 103, -149, 305, -270, -1, -248, 169, -19, 185, 35, + 202, 97, -123, 129, 322, -47, -188, 140, 56, 42, + -87, -71, -61, 145, 10, 125, -137, -45, -28, -35, + -82, 93, 21, 84, 94, -15, 28, -93, 51, -137, + 29, -29, 2, 12, 49, 67 + }, + { + -642, 1520, -528, 3271, 246, -174, 72, 154, 441, 31, + -908, -646, 459, -126, -370, 831, 752, 99, 753, 498, + 206, 296, 132, 114, 571, -198, -150, -793, -50, 20, + -109, 165, 42, -76, 510, 312, 118, 108, 507, 304, + 319, 47, -234, 70, -101, 21, -455, -104, -155, 40, + -144, -12, 8, 217, -14, 118, 53, 213, -423, -62, + 31, -65, -200, -116, 42, 155, -166, 2, 8, -4, + -89, 44, 33, -162, 45, 16, -92, 117, -61, 64, + 11, -140, 58, -84, -6, -89, -22, 28, -50, -58, + 3, 104, -85, -74, -85, -45 + }, + { + -119, -190, 539, -544, 62, 61, -116, 148, -22, 137, + 129, 309, 57, -372, 2788, -145, 21, -1948, -490, -33, + -277, -82, 84, 138, 259, -400, 902, 575, 433, 674, + 441, -115, -283, 91, -310, -583, 259, -437, 206, -40, + -201, -399, 9, 120, -314, -48, 343, -93, -124, -37, + -179, 412, -61, 147, -42, -19, 26, 237, 303, 123, + 29, 92, -46, -73, -152, 24, -80, -268, 29, -110, + 213, 172, -78, -51, 15, 18, 43, -84, -92, -33, + -104, -87, 19, -5, 96, -71, 18, 58, -22, 37, + 45, 14, 28, -14, 57, -27 + }, + { + -1362, 611, 536, 2918, -82, 13, 653, 531, 1049, -359, + -174, -35, -589, 22, 188, -257, 155, 592, -145, -453, + -245, 23, -202, -97, 112, 199, 108, -378, 632, 443, + 154, 290, 5, -51, -253, 57, 408, -244, -59, 58, + -246, -50, 146, 6, 172, 530, 21, 176, 267, -156, + 2, -20, 17, -279, -67, -17, 251, 35, -30, 17, + 95, -251, -55, -14, -104, -91, -191, -18, -103, -12, + -88, 94, -17, 67, -11, 74, -93, 22, 67, 38, + 35, 56, 4, -25, -70, -16, -34, 9, 64, -5, + 68, -47, 46, 22, -30, -31 + }, + { + -22, -1089, 164, -11, 27, -191, 63, 331, 249, 132, + -400, 127, 378, -40, 357, -470, -991, 246, -395, -76, + 370, -902, -588, -540, 1229, 171, 108, 505, -17, 500, + -494, 151, 72, 180, 450, -38, -73, 120, 278, 97, + -159, -154, -287, 292, -120, -108, 55, 94, 155, 63, + 270, -282, 122, 296, 231, -147, -42, 143, -136, 70, + 87, 243, 88, 125, 148, 24, 99, -76, 285, -24, + -29, -8, -259, -119, 37, -99, 65, -75, 29, 1, + 70, -30, -68, 24, -20, -12, -4, 39, 24, 33, + -95, 91, -89, 46, -34, 28 + }, + { + -696, 6209, 322, -49, -1216, 603, -702, -504, 60, -435, + 1723, 502, -248, 696, -72, 456, 516, 427, 128, 118, + -181, -876, -117, 727, -241, 458, 154, 101, 83, 130, + -222, -270, -21, -209, 396, -240, 154, -321, 174, 169, + 63, 61, -67, 119, -337, 23, -49, 16, -418, -80, + 160, 246, -240, -42, 199, -123, 157, -54, 19, 205, + 360, 141, -230, 86, 101, -141, -99, -89, -51, -195, + 29, -17, -35, -87, 2, 128, 39, -208, 9, 48, + 51, -32, 97, 39, -47, -101, -129, 22, 104, 18, + -9, -71, 138, 70, 79, -101 + }, + { + -115, 500, -653, 422, 9, -173, 149, 230, 277, -190, + 324, 126, -469, -684, -379, -390, -127, 255, 432, 353, + -14, 446, -13, -508, 303, -278, -273, -105, 43, -1051, + 282, 143, -1048, -20, 629, -544, 194, 183, 120, 135, + 46, 95, -602, 70, -241, 110, -280, -79, 40, 304, + 177, 108, -266, 199, -98, 157, 183, -64, 160, -162, + 137, 51, -164, -60, 42, -88, -53, 50, -161, 18, + 16, -60, 212, -98, 212, 184, 85, 50, 98, 37, + 13, 23, -39, -41, -3, 14, -142, 37, 38, -51, + -14, 11, -18, 76, 93, 30 + }, + { + -730, -7444, 724, -82, -1151, 222, 1356, 2320, -433, -2191, + 152, 487, 197, 639, -228, -67, -138, -570, -541, -52, + 415, 196, 337, 882, -473, -587, -388, -541, -23, -505, + 135, -307, -280, -425, -96, -415, -96, -201, -5, -131, + -191, -434, -240, 224, 220, -149, 126, 124, 99, -467, + 67, -271, 33, -38, 81, -25, 416, 24, -247, 477, + -312, 108, -117, -2, -141, 506, 92, 177, -96, 151, + 126, 200, 95, -154, -306, -23, -1, -77, -90, -93, + 132, 105, -61, -136, -5, 26, 8, 5, -26, -158, + 17, -4, -22, 15, 47, -56 + }, + { + 52, -2828, 537, 101, -416, 733, -1154, 189, 638, -366, + 151, 731, -638, -566, 245, -76, -126, 656, 225, 738, + 308, 184, -34, -208, 263, -165, 22, 705, 365, -304, + 286, -110, 138, 127, 693, -245, 111, 227, 299, 93, + 271, 187, 46, -181, -235, -400, 115, -143, 304, -97, + -309, -259, 78, 2, 18, -31, 238, -188, -120, 9, + -164, 26, -49, -22, -57, -164, -200, 38, -182, -97, + 200, 79, -36, -93, -150, -43, 185, 140, -148, 113, + -32, -115, 9, -14, 17, 21, 30, 53, 153, 112, + -56, 70, -150, 46, -39, 16 + }, + { + -757, -4803, 2067, 59, -864, 2415, 285, -105, 18, 832, + -249, 732, 221, 695, -843, 497, 705, -1002, 807, -320, + 550, -299, 312, -255, -660, 234, 538, 190, 15, 561, + -402, -275, 73, 314, -358, 27, 35, 272, -334, -477, + 156, -40, -308, -76, 113, -76, -321, -290, 38, -89, + 324, 149, -598, 178, 117, 247, 29, 129, -27, 60, + 229, 267, -63, 70, 127, 52, -74, 133, 128, 47, + 64, -203, -124, 64, -83, -45, 111, 124, -93, 75, + -28, 76, 204, -87, 2, 125, -64, 30, 37, -34, + 74, -73, 26, -31, -83, -93 + }, + { + -116, -1653, 763, -250, 290, 259, -623, -386, -293, 440, + 260, -455, -1255, 25, -1171, 67, -235, -542, -1160, 623, + 627, 193, -1733, 202, 625, 803, 733, -560, 556, 350, + -451, 343, -573, -139, -131, 379, 413, 199, -275, 15, + 27, -173, -212, -135, -88, -229, -307, 36, -406, 26, + -21, -148, -357, -211, 142, -124, -21, 188, 84, -36, + 177, 223, -43, 92, 190, -217, -137, -17, -161, -243, + 165, 47, 157, -93, -69, -73, -138, -11, 7, -73, + 70, 4, 17, -130, -235, -143, -107, -162, -58, -37, + -157, -21, -22, 117, 54, -79 + }, + { + -1136, -1688, 63, 837, 726, 1091, 153, 494, -484, 532, + 596, 98, 433, 677, 2739, 768, -128, 279, 816, 418, + 658, -101, -784, -221, -138, -88, -32, -427, -91, 617, + -311, -838, -103, 550, 782, -506, -190, 76, 315, 88, + 222, -378, -335, -142, 381, 122, 17, -233, 322, -264, + 121, -365, -128, 57, 77, 294, -291, -126, -249, 144, + -91, 58, 150, 187, 223, 60, 117, 33, 151, -66, + -124, -303, -17, 136, -71, -81, -87, -2, 51, 102, + 98, -78, -25, -169, 15, 43, -86, -30, -30, 108, + -98, 11, 11, 21, 51, 54 + }, + { + 287, 1452, -189, -740, 584, 476, 51, -178, -239, 383, + -447, 336, 352, 851, -2588, 97, -1117, 513, -26, 93, + 605, 101, -30, 46, -67, 482, 101, 710, -466, -398, + -863, 200, 333, 93, -106, -262, 331, -194, -471, -187, + -790, -416, 12, 41, 29, -162, 109, 247, -317, -13, + -461, 49, 169, 57, 120, -271, -12, -75, -127, -135, + -90, -120, 81, 316, -120, -95, -46, 49, -324, 7, + 100, -48, 31, 10, -74, -144, -91, 25, -50, -58, + 104, 69, 57, -18, -86, 107, -17, 141, -129, -72, + -3, -18, -57, 57, -56, -62 + } + }, + { + { + -750, 14837, 1360, 4372, -139, 349, 537, -165, -750, 711, + 277, 925, 211, 132, 144, 17, 671, -228, 535, -397, + 29, 23, 693, -213, 239, -430, 309, 480, 504, -808, + -297, -54, -247, 298, 75, -191, -375, -309, 196, -337, + 262, 797, -147, -555, -111, 255, -82, 65, 414, -165, + 74, 225, -259, -223, 304, 57, 160, 161, 3, 23, + -204, -81, 14, 137, -37, 48, -176, 85, -106, 41, + -242, -224, -70, -89, -124, -22, -120, -22, 40, -130, + 78, -56, 48, -10, -36, 39, -32, 53, 52, -11, + -56, -13, 60, 18, 42, -33 + }, + { + -75, 534, 687, 605, -593, 272, -114, 389, -144, -423, + -826, 1321, -323, 323, 334, -60, 724, 69, -25, -459, + 554, -852, 708, 1013, 63, 553, -815, -466, -297, 915, + 119, 561, -618, 51, 722, -240, -253, -255, -125, 481, + -73, -129, -89, -324, 117, -110, -48, 114, 87, -273, + -76, -221, -105, -198, 213, -323, -87, -60, 98, -208, + -203, 49, 33, 23, 143, -20, 142, 23, 176, -138, + -105, -68, 14, -61, -118, -89, 54, -29, -106, 18, + -46, -12, 44, -106, 53, -70, 84, 123, 6, -62, + -20, -8, -43, -32, -61, -45 + }, + { + 364, -3191, -1090, -1945, 462, 78, -2, 77, 464, -332, + 732, 1149, -1046, 501, -814, 10, 190, -310, 163, -70, + 555, 271, -384, -82, -120, 105, -7, 453, -78, 257, + 89, -487, 39, -483, 425, 224, -529, 48, -302, -2, + 441, -347, -2, 188, -33, -272, 395, 381, 265, -32, + 367, -4, -176, 20, 46, -78, -11, -182, 108, 214, + 6, -37, -42, 94, 154, 188, -163, -68, 216, -14, + -39, -79, -56, 149, 156, -20, -91, -66, 23, -20, + -114, 90, 38, 5, 17, 93, -50, -42, -85, -92, + -25, 20, -34, 32, 58, 79 + }, + { + 906, -1456, 390, 3613, -166, -315, -231, 337, -69, 734, + -1151, -559, 343, -118, -20, 828, 1034, 497, 494, 274, + 194, 711, 157, 244, 101, 425, -638, 65, -38, -720, + 358, 197, 54, -4, 427, 137, 207, 203, 403, 643, + 267, -39, -104, -451, 144, -220, -374, 60, -109, -230, + -96, 89, -65, 67, 82, 269, 130, -133, -219, 133, + -195, -41, -121, -202, -1, 227, -71, -100, -72, 60, + -82, 126, 36, -108, -15, -16, -86, 18, 29, 87, + -55, -128, -73, 48, -38, -52, -31, -9, 13, -69, + 15, 81, -1, -158, -115, -60 + }, + { + 119, 564, 11, -338, -116, -22, -42, 262, -32, -64, + -119, 687, -61, 334, 3065, -958, -1046, -374, -836, -329, + 412, -493, -270, 385, 518, 82, 497, 373, 519, 390, + 451, -332, 379, -351, -428, 134, -282, 17, -101, -77, + -89, -217, 89, 14, -551, 129, 286, -139, -57, -156, + 42, 70, -67, 172, -45, 189, 120, 153, 312, -53, + 286, 55, -176, -44, -86, -85, -77, -162, 36, -37, + 41, 309, -55, -127, 102, 104, -44, -25, 45, -204, + 3, -108, -38, -6, 40, -41, 88, -21, -10, 53, + 40, -4, -3, -42, 69, 55 + }, + { + 1629, -4486, 572, 3415, -49, 85, 691, 737, 948, 103, + -380, -638, 760, -1201, 168, -6, -524, 587, -245, 7, + 102, -292, -320, -258, 254, 70, 71, 73, 503, 357, + -184, 129, 338, -198, -55, -78, 150, -98, -204, 65, + 63, -170, -204, 327, 168, 343, 212, 176, 210, -247, + 79, 152, -53, -167, -216, 110, 68, 134, -64, -66, + 68, -125, -251, 24, 37, -144, -321, -62, -41, 66, + -165, 144, 51, -60, -16, 5, 54, -63, 0, -1, + 109, 50, 101, -60, -64, -60, 8, 4, 15, 96, + -8, -21, 40, -22, 32, -37 + }, + { + -26, -944, -263, 59, -13, -100, 10, 281, 231, 152, + -393, -24, 510, -653, 1458, -847, 201, -616, -404, -343, + 19, 35, -361, -227, 568, 33, 150, 54, 653, 321, + -94, 103, 80, 703, -257, 524, -253, 591, -400, 368, + -380, -238, 158, 275, -224, 24, -241, 164, 261, 165, + 147, 77, -122, 196, 188, -24, 21, -115, 12, 226, + 23, 157, 87, 132, 21, 170, 62, -2, 90, 56, + 56, -173, -113, -93, -149, -20, 66, -122, -20, 109, + -10, -144, 1, 101, -126, 34, 45, -45, 16, 16, + 39, 11, -50, 13, -45, -30 + }, + { + 2004, 3321, -926, -633, 649, 240, -632, -477, 199, 419, + 478, 1168, 428, -115, -84, 897, 316, 739, 156, 22, + -411, -888, 15, -186, 1003, -14, 390, -9, -462, 617, + 28, -332, 148, -460, 560, -714, 301, -268, -51, 381, + 156, 34, 174, -251, 413, -282, -113, 239, -658, -33, + 197, -3, -54, -118, 84, -19, 81, -55, 124, 217, + 233, 111, -218, 103, 49, -138, 53, -190, -156, -9, + -21, -65, -33, -89, 10, -57, 152, -166, 34, 78, + -90, 92, 60, -30, 5, -84, -139, 71, 123, -56, + -61, 67, 96, 71, -44, 60 + }, + { + 16, -608, -4, -25, 121, 22, 121, 73, 321, 240, + -3, -7, -223, 286, -1417, -351, -757, 870, 901, -495, + -297, 722, 104, -722, 655, -476, -236, -578, 675, -1479, + 13, -406, -426, 355, -54, 170, 118, -525, 700, -134, + 282, -201, -512, 121, 139, -202, -195, -285, 352, 119, + 101, 87, -127, 159, -75, 268, 70, -63, 155, -113, + 91, -94, 54, -98, -22, 144, -125, 122, -147, 33, + -19, -67, 134, 39, 45, 160, 78, 106, 75, 45, + 91, -93, 49, -10, -57, -69, -41, -4, -33, 23, + -52, -69, 75, 23, 49, 80 + }, + { + 635, -7314, -955, -1038, -202, 1053, 1223, 734, -934, -648, + -285, 1149, -11, -749, 1154, -216, -527, -319, -550, -228, + 250, 437, 629, 66, 74, -994, -143, -423, -405, -418, + 348, -583, -677, -102, -243, -287, 54, -263, -22, -193, + -326, -394, 42, 83, 435, -332, 98, -9, 91, -222, + -29, -212, -2, -408, 299, 247, 271, -133, 5, 114, + 156, -142, 19, -236, 288, 43, 51, 273, -48, 254, + 104, 18, 174, -304, -143, -110, -36, 9, -89, 6, + 48, 88, -48, -221, -21, 49, -77, -10, -8, -143, + 31, -47, -65, 46, 33, -108 + }, + { + 23, -2513, 37, 71, -553, 36, -182, 163, 261, -1, + -581, 471, 920, -873, -76, 137, -770, 704, 565, 661, + -95, 203, -135, -118, 497, 57, 196, 72, 760, -470, + 470, -326, 28, 265, 311, -291, 258, 269, 405, 49, + 83, 467, 147, -262, -296, -390, 127, 259, -149, -254, + 52, -403, 57, -53, 39, 254, 102, -162, -128, -43, + -97, -107, -33, -82, 80, -73, -220, -26, -264, 28, + 88, 53, -93, 78, -196, 7, 136, 200, -85, -1, + 13, -96, -47, 10, -30, 31, 126, 121, 99, 39, + -41, 21, 9, -35, -23, 36 + }, + { + -330, -5125, 1812, 627, -107, 1497, -574, 485, 365, -887, + 1086, 156, 1002, 114, 328, -825, 43, -101, 811, -112, + 536, -246, -214, -5, -572, 117, 261, 151, 80, 3, + 163, -202, 100, 122, -337, 28, -128, 212, -157, -310, + -70, -128, -50, -403, 165, 19, -65, -237, 6, -15, + -15, 194, -291, -61, 337, -30, 34, 189, 33, 47, + 259, 212, 43, -1, 150, -57, 314, -16, 201, 1, + -25, -130, -108, -78, -59, 90, 24, 237, -19, 14, + -58, 84, 1, 109, -3, -10, 45, 110, -38, -24, + 5, 44, -85, -22, -77, -28 + }, + { + 138, -596, -739, 3, 514, 185, -931, 123, -277, 181, + 75, -329, 118, -1819, -959, 806, -1114, 13, -1633, 1102, + -141, 656, -1946, 315, 357, 787, 384, 82, 549, -343, + 164, -481, 422, -580, 431, 122, 359, -139, 250, -432, + 282, -427, 219, -387, -280, -215, -131, -170, -40, 118, + -97, -113, -556, -96, 103, -32, -97, 163, -52, 327, + -10, 280, 56, -25, 187, 4, -328, -163, -163, -158, + 139, 173, 73, 15, -156, -72, -205, 34, -103, -30, + 94, 73, -30, -71, -160, -123, -89, -103, -197, -72, + -33, -65, -24, 45, 82, -38 + }, + { + 830, -4347, 823, 1284, 130, -452, 1580, 227, -434, 958, + 647, -277, -74, 541, 2947, 1139, 88, 236, 603, -46, + 430, 199, -316, -651, -247, 449, -392, -337, -94, 130, + -9, -481, -8, 387, 96, 33, 57, -111, 165, 300, + 91, -521, -527, -206, 131, -137, 461, 292, -223, -351, + 179, -63, -261, 54, -69, 199, -20, -261, -204, 73, + 147, -32, 183, 323, 222, 114, 20, 48, 99, -41, + -117, -147, -69, -80, 62, -63, -43, -145, 121, 117, + 25, 60, -88, -202, 22, -13, -28, -54, 35, 53, + -40, -41, 58, 38, 4, -9 + }, + { + -306, 1609, 757, -158, -674, 1074, -16, -144, -85, 232, + -304, 117, 566, -2597, 3117, -985, -550, -628, 680, 810, + -345, 722, -276, 193, 284, 181, 695, 120, -504, -1274, + -201, -86, 463, -226, 687, -71, -143, -223, -530, -83, + -866, -596, 410, -78, 184, -585, 531, 278, -774, 95, + -161, 1, -86, 75, -49, -59, -10, -122, -32, -100, + -123, 41, 2, 38, -204, -34, -40, 45, -238, 11, + -89, 138, -41, -141, -26, -132, -86, -26, -124, 240, + 11, 93, 45, -18, -111, 132, 35, -96, 18, -67, + -70, -28, 64, -102, 25, -40 + } + }, + { + { + 799, 15136, -875, 2876, -763, -15, 351, 457, -531, 1463, + 939, 455, -409, -437, 415, 49, 0, -1056, 217, 6, + 224, 58, 268, -344, 78, -516, -241, -118, 679, -447, + 96, 522, -79, -193, -145, -235, 78, 47, 394, -160, + -272, -1, -377, -580, -77, 60, -309, -261, 343, 148, + 153, 84, -376, -299, 172, -214, 147, 167, -164, 114, + 53, -194, -153, 12, -46, 152, -174, 102, -79, 147, + -147, -162, -3, -85, -275, -59, 54, -9, 29, 26, + 190, -68, -39, -128, -92, -4, 18, 48, 74, 86, + 12, -21, -43, -1, 39, -58 + }, + { + 39, -1565, -921, 1369, -123, 77, -252, 14, -504, -106, + -256, 1275, -920, 68, 486, -567, 11, -138, 176, -925, + 441, -71, 233, -533, -571, 730, -1090, -347, -98, 1168, + 93, 496, -493, -147, 278, -306, -198, 1, -1, 257, + 151, 376, 244, -191, 327, -114, -511, 66, 107, -54, + 77, -213, -106, -154, -9, -382, 198, 23, 84, 19, + -52, 5, -2, 103, 146, -106, 317, 56, 57, -13, + 92, -56, 49, 41, 54, -27, -32, -23, -115, 42, + -111, -55, 55, -179, 14, 3, 66, -10, 5, 42, + -2, -30, -8, 78, 27, -48 + }, + { + -378, -412, 1540, -2378, -3, 62, 31, -333, -135, -165, + 1013, 1002, -1011, 347, -718, 639, 366, -271, -98, -423, + -94, -243, -348, 299, 371, 24, 49, 686, 80, 409, + 155, -303, 350, -414, -63, 168, -386, 160, -255, -354, + 201, -778, -312, 213, 344, 345, 805, 544, 322, -381, + 187, 296, -311, -33, 279, 11, -96, -290, -66, 110, + 26, 27, -111, -232, -158, 240, -12, -74, 116, -1, + 105, 55, 39, 46, 53, 47, 172, 49, 55, 43, + -86, 64, -29, -58, -72, 27, -68, -36, -97, -37, + -45, -48, -42, 1, -9, 76 + }, + { + -624, -5150, -965, 3683, 189, -226, -251, -205, -319, 821, + -1109, -414, 257, 17, -79, 4, 963, 343, -187, -19, + -49, 293, 769, 1032, 427, 597, -666, 583, 845, -401, + 265, 659, 384, -82, 166, 268, 289, 27, -39, 232, + -248, -590, -215, -403, 77, -189, -158, 187, -21, -347, + -42, 238, 100, 153, -9, 57, 182, 81, -145, 213, + 65, -20, -68, -4, 180, 232, 135, 99, -115, 92, + 136, 71, -55, -14, 4, -55, -176, 49, 97, 70, + 8, -5, -42, 28, -67, -78, -55, -26, 64, 40, + 7, 12, 45, -19, -4, -23 + }, + { + -116, 1163, 552, -34, 90, -5, 7, 44, -62, -98, + -109, 715, 102, -362, 1164, -1310, -654, 1467, 417, -669, + 123, -803, -864, -235, 402, 745, 738, 248, 390, -384, + -113, 64, 1129, 401, -145, 245, -73, 176, 186, 173, + 13, 38, 117, -45, -150, 136, 128, 29, 86, -35, + 142, -151, -170, 294, 31, 77, 257, 226, 114, -36, + 454, 191, -123, -61, -90, 26, 263, -24, 76, 21, + -114, 344, 80, -130, 115, 84, -70, 110, 170, -174, + 164, -22, -140, -43, 6, -99, 38, -45, -50, -22, + -29, -14, 26, 3, 83, 33 + }, + { + -1051, -10690, -661, 3335, -782, -11, 497, -267, 29, 116, + -272, -862, 111, -1647, -37, -272, -899, 117, -632, -502, + -24, 290, -290, -145, 720, -165, -369, -361, 163, 355, + -86, -153, 335, -26, -18, -196, -35, -255, -363, 149, + 554, 228, -39, 51, -288, 34, 18, -91, -74, -227, + 134, 181, 87, -17, 3, 129, -33, 79, 27, -97, + -37, 61, -122, 10, 20, -89, -121, 18, -35, 54, + -179, 123, 47, -131, -53, 15, 188, 15, -45, -56, + 49, -31, 58, -15, 35, -53, 14, 47, 17, -13, + -58, 32, 40, -61, 26, -24 + }, + { + 37, -218, 107, 78, -72, -50, 80, 208, -170, 33, + -50, -35, 411, 218, 2665, -875, 389, 173, 562, -166, + -280, 305, 204, -704, 195, 471, -405, -569, 1118, 1374, + 948, 112, -369, 794, -113, 491, -340, 647, -410, 344, + 43, -57, -137, -2, -78, 177, -292, -174, 143, 170, + -79, 180, -331, -216, 117, 80, 98, -252, -178, 247, + 100, 56, -123, 52, 20, 21, -13, 72, 10, -42, + 15, -118, 12, -14, -111, -58, 13, -46, -10, 20, + -14, -24, 81, 127, -106, 0, -26, -154, -34, -65, + -58, -47, -95, -10, -12, -73 + }, + { + -3235, -1170, 1768, -915, 298, 339, -1209, 225, 1122, 616, + -55, -124, -682, -605, 37, 961, -314, 432, -179, 361, + -242, -851, 504, 374, 1233, 33, 157, -324, -122, 730, + 136, -79, 176, -321, 495, -1136, -202, -557, -147, 169, + 93, -16, 436, -73, 615, -34, -157, 130, -329, 140, + -28, -20, -160, -476, -9, 165, 36, -24, 185, -6, + -15, 59, 41, 244, -78, -251, 78, -127, 19, 200, + 86, -120, -41, 69, 120, -156, 185, 17, -46, 100, + -41, -38, -51, -70, -39, 58, 18, 17, 133, 11, + -54, -3, 22, 17, -72, 80 + }, + { + 90, -133, 336, -223, -80, 55, -47, 5, 431, 111, + -419, 155, 191, 544, -673, 890, 157, 666, 438, -1103, + -920, -157, -258, -789, 777, -741, -337, -456, 957, -422, + 78, -105, 163, 299, -198, 220, -33, -307, 789, -515, + 146, -163, -315, 328, 423, -182, -119, -53, 376, -253, + -204, 168, 202, 342, -205, 96, 40, 90, 158, 33, + 6, -226, 54, -105, 30, 141, -161, 212, -3, 40, + 6, -33, -60, -60, 41, 12, -75, 54, 71, -58, + 8, -50, 77, -97, -48, 41, 65, 38, -66, -12, + -49, -73, 21, 7, -31, 4 + }, + { + -521, -9499, -1586, -652, -147, -406, -711, 147, -205, 512, + 135, 1069, 29, -965, 1090, -858, -1024, 299, 194, 34, + -71, 354, 275, -443, -71, -683, -126, -380, -221, -488, + 154, -183, -449, 190, 73, -337, -11, -55, 234, 212, + 73, 20, 262, -115, 596, 38, -72, -157, 297, -50, + -10, 10, 156, -451, 104, 7, 84, -259, -41, 136, + 269, -182, 47, -121, 210, -102, 57, 41, -65, 348, + 13, -116, 157, -193, 39, 37, 38, 21, -13, 4, + -123, -80, -38, -101, 73, 29, -45, 23, 29, -34, + 36, -37, -66, -5, 61, -9 + }, + { + -133, -2854, 85, 290, -42, 577, 619, 319, -286, 137, + 7, 401, 1082, -743, 338, 984, -292, 654, -136, -584, + -533, 39, -379, -184, -105, -350, 112, -347, 363, -565, + 349, -424, -457, -383, -190, -338, 109, -53, -38, -200, + -112, 432, 327, -214, -163, 53, 276, 79, -280, -101, + 304, -239, -94, -232, 125, 237, 152, 27, -99, 35, + 98, -46, -75, 40, 307, 136, 2, 184, -112, -6, + -17, 17, -127, 75, -25, 61, 47, 127, -54, 0, + -54, -60, -61, -47, -68, 46, 161, 36, -34, -29, + 14, 69, -11, -6, 73, -2 + }, + { + 1500, -2745, 838, -396, 189, 619, -1080, 681, -305, -1098, + 1046, -824, 195, -231, 365, -908, 663, 335, 615, -224, + 183, 116, 597, 575, -451, -166, -196, -317, -267, -310, + -254, -82, 45, -195, -204, -54, -785, -537, 26, 190, + 25, -101, 515, 314, 269, 82, -21, -30, 452, 234, + -249, 144, 27, -63, -16, -286, 65, 173, -61, -45, + 269, 158, 108, 63, 120, -62, 351, 23, 142, -44, + -62, 3, 88, -54, -15, 93, 22, 142, -124, 49, + 4, 107, -86, 103, 25, -96, -23, 59, -51, 36, + 83, 120, -88, 29, 4, 5 + }, + { + -173, 348, 16, 54, 564, 178, -707, 192, -312, -58, + 186, 215, -209, -1718, -395, 949, -1062, 473, -966, 435, + -1491, -251, -574, 782, 393, 844, 52, -20, 324, 9, + 707, -383, 1045, -352, 508, 85, 393, -222, 286, 123, + 658, -308, 182, -257, 78, 136, -47, -115, 110, 234, + -53, 126, -134, -162, -144, 75, 86, 185, 65, 230, + -536, 25, 219, -106, -43, 4, -190, -94, 242, 72, + -43, 1, -68, 65, 67, 132, -139, 80, -85, -14, + 82, 41, -45, -16, 8, 54, 1, 55, -101, 28, + 68, -90, 9, -55, 5, 38 + }, + { + -12, -5067, 1073, 436, -279, -1706, 11, -179, -506, 559, + 185, 410, -220, -583, 1410, -187, -1210, -454, 102, -300, + -516, -39, -111, -293, 519, 507, 77, 600, 130, 1, + 149, -25, -351, -159, -384, 76, 113, -461, -277, -184, + 68, -310, -249, -413, -498, -296, 181, 129, -611, -220, + 323, -147, -100, 144, -112, -101, -183, 7, 111, 205, + 140, -159, 195, 241, 106, -12, -55, 55, -20, 126, + 90, -27, -55, -143, 115, -4, 92, 37, 47, -42, + -90, 56, -108, -186, 45, 12, 53, 10, -12, 12, + -67, -72, 5, -54, -66, -58 + }, + { + 308, 1364, -179, 209, -483, 847, 16, -16, 420, 488, + -419, -170, 548, -89, 6211, -482, -620, -1247, 714, 1041, + -599, 396, -214, 164, -105, -439, -52, -277, -324, -1255, + -37, -247, -30, -530, 507, -146, 15, 225, -161, -108, + -640, -154, 794, -73, 385, -148, 659, 329, -882, 68, + 58, -57, -225, -39, -205, 79, 282, 91, 310, 432, + 56, 23, -3, -271, -220, -161, -313, 38, -68, 77, + -206, 89, -5, -211, -60, -143, -133, -1, 84, 315, + -148, 44, 96, -56, -151, 93, 25, -164, -22, 1, + 8, -99, -61, -35, 143, 16 + } + }, + { + { + -840, 12002, 2223, 601, 1099, 214, -95, 1170, -781, 1106, + 1001, -260, 142, -930, 128, 384, -863, -154, -164, 682, + -132, 215, 30, -3, -86, -447, -539, -15, 203, 32, + 139, 250, 163, -247, -456, -106, 283, 133, 233, -23, + -168, -484, 45, -574, -8, -465, 97, -147, 100, 460, + -272, 57, -79, -314, 74, -123, 160, 54, -17, -23, + -40, 8, -29, -273, -5, 82, -65, 34, -42, 107, + -156, -86, -84, -86, -68, -182, 188, -97, 25, 148, + 122, -50, -44, -85, -106, -29, 34, 6, 108, 96, + 25, -55, -56, 39, -63, 26 + }, + { + -18, -3311, 537, 1070, 138, -245, 54, -582, -163, -473, + 1007, 498, -623, 748, -547, 268, -598, -490, 77, -580, + 294, 129, -1045, -95, -19, -191, -1176, -141, 374, 1341, + -238, 492, -19, -193, -134, -181, -534, 461, 26, -100, + 155, 517, 122, 116, 111, 54, -598, -81, -191, 334, + 238, -288, -163, 7, -445, 116, 155, -66, -46, -41, + 349, -199, -87, -17, 285, 102, 97, 24, 81, 39, + 95, -81, 150, -14, 15, 57, -140, 91, -57, 23, + -93, -54, -5, -50, -129, 75, 24, -29, -31, 26, + -20, 25, -21, 89, 22, -18 + }, + { + 325, 3284, -2112, -1567, -631, 487, -41, -446, -690, 131, + 1829, 243, -290, -413, -136, 493, -481, 382, 150, -207, + -542, -417, -184, 754, 233, -260, 409, 295, 560, 129, + 12, -12, 121, 170, -499, 197, -285, 448, -371, -611, + -81, -330, -362, -195, 596, 700, 668, 154, 510, -244, + -162, 320, -256, -119, 320, 191, -225, -302, -193, 189, + 120, 45, -114, -223, -122, 132, 97, 40, -58, 100, + 22, 18, 135, 35, 21, -10, 229, 81, 70, 31, + 26, 60, -68, -70, -79, 30, -21, -63, -68, 4, + 24, -148, 8, -11, 49, 27 + }, + { + -266, -7440, 695, 3677, -300, -402, 244, -368, -216, -193, + -397, -78, -192, -88, 640, -553, 613, 378, -77, -459, + 401, 23, 619, 764, 545, 482, -145, 29, 795, -318, + 357, 718, 192, 298, -44, 280, -103, 218, -182, -113, + -178, -341, -392, -238, -179, 62, -81, 222, -186, 106, + 73, -238, 272, 249, -103, -26, 158, 132, 143, 2, + 66, -36, 129, -66, 108, 167, 206, 109, -78, 53, + 71, 126, -135, 5, 85, -75, -128, 48, 75, 51, + 37, 59, -59, -82, -48, 18, -54, -4, 8, 9, + 26, 0, 30, 53, 5, 8 + }, + { + 88, 1782, -282, 209, -117, 52, 164, -243, -32, 53, + -120, 608, 113, 497, -393, -554, -781, 912, 1420, -1047, + -419, -470, -408, -249, 36, 1075, -106, 575, 379, -22, + 133, 339, 323, 115, 175, -139, 559, -149, 469, -132, + 50, -114, 55, 65, 71, -24, 58, 146, 133, 151, + -201, -85, -28, 401, 205, -423, 459, 94, -109, 394, + 212, 176, 44, -107, 46, 76, 2, 0, 161, 2, + 24, 136, 83, 63, -137, 29, 74, 64, 101, -34, + 82, -34, -43, -72, -25, -38, 11, -29, -99, 9, + -111, 71, 27, 29, 65, -29 + }, + { + -440, -13857, 351, 2629, 358, 52, 634, -279, -622, -648, + -30, 356, -822, -999, -317, -587, -369, -495, -531, -424, + -361, 491, -205, 127, 491, -415, 211, -673, 78, 182, + -80, -12, 530, -279, 297, -35, -325, -145, -302, -88, + 464, 594, -10, -63, -73, -180, 185, -476, 52, -4, + 107, -97, 111, -142, 244, 169, -182, 65, 220, -330, + 21, 235, -212, -30, 30, -100, 48, -3, -52, -40, + 98, -68, 54, -112, 26, 29, 90, 137, -145, 3, + 24, 6, -11, 45, -60, -12, 29, 4, 83, -112, + 29, 49, -32, 13, 13, -27 + }, + { + 33, 90, 72, 46, -66, 25, 33, 199, -276, 24, + 18, 330, -121, 388, 2569, 65, -9, 231, 421, 6, + 6, 153, 972, -1288, -236, 335, -128, 161, 217, 2173, + 954, -854, 331, 53, 447, 197, -165, 129, -188, 148, + 280, -131, -3, -382, 20, 34, 50, -284, -2, 78, + -230, 248, -131, -486, 167, 111, -121, -1, -295, 334, + 21, 89, -30, -1, -53, 25, 71, -60, 10, 23, + -194, 43, -9, 49, -18, -146, -75, 132, 6, -77, + 43, 71, 76, 20, -44, -4, -27, -170, -66, -54, + -65, -11, -111, -31, -30, -53 + }, + { + 4041, -6898, -2497, -1710, 1397, -376, -676, 532, 1084, 221, + 201, -4, -990, -277, -472, 931, -216, 276, 124, -81, + -396, -358, 620, 633, 695, 151, -84, -208, 345, 43, + -17, 509, -45, 8, -159, -862, -299, -910, 411, -174, + 320, -59, 188, 168, 264, 458, -433, -92, 33, -90, + -164, 163, -185, -237, -121, 185, 45, -47, 39, 130, + 17, -211, 366, 90, -30, -111, -146, -58, 203, 123, + 43, -87, -9, -7, 132, 56, 4, 118, -97, 23, + 97, -84, -136, -44, -43, 123, 23, -34, 87, 14, + 1, -39, 34, -16, 2, -45 + }, + { + -11, 392, 126, -57, -145, 38, -8, -49, 356, 143, + -556, 219, 724, -1037, 732, 1010, 462, 466, -568, -1024, + 269, -1183, 664, -1604, -32, 105, -443, 96, 52, 489, + -287, -56, 169, 430, -331, 221, 64, -1, 494, -325, + -92, -87, 56, 127, 126, 171, -293, 132, 264, -100, + -379, 309, 111, 430, -271, 16, -21, 197, 48, 184, + -144, 59, -119, -95, 117, -192, 8, 86, 133, 62, + -162, 62, -60, -65, 17, 67, -26, -73, 147, -102, + -13, -5, 0, -26, -87, 74, 82, -6, 2, -4, + -26, -83, -24, -4, 12, -34 + }, + { + 368, -11188, -1010, -1139, 775, -1225, -1241, -60, 918, 681, + 97, 200, 251, -504, -277, -261, -702, 482, 276, -29, + 197, 461, -542, -38, -305, -15, -579, -294, 17, -194, + -608, 333, -502, 339, 123, -195, -388, 177, 389, 244, + 49, 116, 224, -134, 140, 575, -376, 24, 159, 208, + -83, -140, 33, -5, -54, -157, 55, -73, -90, 95, + 136, 4, -40, 44, 131, -15, -24, -28, 34, 36, + 91, 41, 60, 22, 66, 58, -60, -61, 98, 20, + -103, -55, -1, -161, 18, 106, 65, -83, 1, 86, + -75, 71, -22, -37, 8, 104 + }, + { + 198, -3145, 323, -92, 104, 762, 748, -228, 275, -141, + 318, 74, 730, 401, 249, 171, 792, 120, -250, -736, + 80, -502, -168, -113, -472, -451, 223, -249, -123, 233, + -76, -311, -712, -458, -220, 0, -5, -203, -422, 41, + -110, 437, 149, -87, -71, 79, 109, -197, 75, -79, + 113, -157, -132, -253, 177, 86, 237, -7, 16, -75, + 128, 97, -231, 222, 178, 160, 198, 105, -10, -105, + -101, -43, -25, -6, 121, 2, -11, 109, 91, -113, + -46, -117, 21, 16, -134, 56, 131, 10, -44, -40, + 64, 4, -25, 56, 61, -47 + }, + { + -2072, 2125, 774, -6, 538, -1546, -91, 1236, -524, -539, + -88, -360, 268, -66, -237, -555, 990, 148, 65, 160, + 80, -53, 802, 338, 272, -290, -147, -406, -348, -29, + -489, 128, -151, -468, -129, -449, -76, -961, 111, 382, + -188, 399, 388, 253, -57, 520, -213, -80, 556, 410, + -153, -152, 236, -34, -363, 38, -63, 18, 120, 47, + 115, -63, 215, -69, 262, 68, 44, 174, 74, -17, + -166, 117, 150, -44, 80, -31, 48, -31, 44, -23, + -24, 129, 13, 64, -68, -58, 20, -68, 47, -18, + 80, 113, -67, 142, -89, 48 + }, + { + 163, 1132, -593, -43, 4, 166, -95, -324, 261, -172, + 195, 229, -670, -791, -828, 961, -1103, -176, 57, 376, + -704, -2608, 2176, -860, 1130, 1241, 81, -974, 718, -48, + 426, 619, -32, 289, -63, 374, 294, -84, 321, 284, + 385, 184, -139, 21, 0, 238, -25, -59, 105, 102, + 3, 44, 7, 2, -366, 311, -48, 70, 153, 42, + -346, -223, 225, -33, -110, -9, -5, -328, 433, -60, + 57, -90, -64, 116, 33, 122, 36, -55, 22, 77, + -127, -39, 53, 47, 22, 43, -1, 151, -133, 2, + 54, -88, 3, -35, 39, 74 + }, + { + -1010, -3270, 442, -41, -17, -1132, -774, -411, 209, 587, + -1001, 1623, -877, 1510, -1036, -329, -707, -400, -546, -513, + -525, -36, 280, -40, 0, 611, 310, 487, -44, -71, + 216, 223, -39, -435, -350, -211, -158, -92, -126, -494, + 189, -590, 203, -372, -682, 227, -214, 138, -530, 28, + -83, -203, -1, 72, -80, 16, -208, -36, -24, 426, + 81, -4, 110, 37, 145, 68, -202, 116, -13, 249, + 7, -55, -1, 60, 38, -122, 19, 128, 34, -61, + -55, 66, -101, -82, -50, 75, 33, 50, -61, 21, + -89, 17, -98, -37, -7, -38 + }, + { + -353, 508, 887, 499, -134, 10, 187, 278, 281, 458, + 21, -170, -49, 2596, 2448, 124, -485, -813, 624, 485, + -542, 350, -242, -172, 176, -737, -813, -329, -23, 203, + -651, -263, -423, -253, 332, -589, 153, 483, -120, -482, + -111, 113, 414, -200, 77, 704, 243, -60, -150, -142, + -66, 59, -244, -150, 13, 179, 303, 121, 254, 331, + 138, -101, 142, -285, -134, -367, -134, -139, 131, 1, + -167, 0, -53, -101, -160, -43, -91, -20, 23, 122, + 113, -205, 172, 6, -32, -79, 61, -59, -18, -4, + -62, -75, -92, 45, 107, 27 + } + }, + { + { + 1147, 7864, -1715, -566, -93, 141, -336, 1313, -778, -904, + -1221, -1429, 6, -1070, 34, 471, -344, 488, 74, 991, + 97, -289, -421, -234, -137, 12, -271, -362, -442, -447, + -581, -362, 164, 58, -126, 288, 156, -203, -63, 256, + 134, -183, 565, -343, -126, -576, 154, 148, 52, 260, + -330, 202, -59, -127, 190, -163, 269, 402, 286, 18, + 112, 0, -132, -207, -1, 75, 35, 64, 32, 46, + -44, 36, -102, -57, 148, -1, 193, -163, -39, 65, + 11, -51, 51, 41, 19, -42, 25, 18, -31, -40, + 57, -6, -14, 78, -64, 24 + }, + { + 12, -3257, 475, 503, -102, -137, 230, -316, 209, -71, + 808, -28, -348, 277, -1563, 1141, -486, -826, 939, 297, + -168, -537, -1284, -175, -830, -437, -210, 378, 508, 771, + -118, 715, 242, -38, -589, -393, -606, 192, -221, -11, + 191, 59, -471, -78, -30, 222, -479, -101, -205, 269, + 421, -184, -106, 81, -331, 115, 60, -45, -138, -149, + 331, -219, -80, 48, 225, 193, 97, -166, -22, -15, + -23, -121, 138, 82, 126, 160, -48, 73, -45, 56, + -48, -3, 3, -17, -123, 3, 11, -11, -139, -140, + -61, 72, -21, 18, -87, -24 + }, + { + -219, 6362, 723, -806, -145, 202, -261, -379, -255, 591, + 1024, -197, 673, -356, -540, 388, -205, 1025, 262, 586, + 188, -549, -275, 632, 261, -254, 72, -7, 481, 39, + 373, 93, -113, 505, -137, 19, -530, 537, 29, 17, + 267, -112, -352, -280, 237, 290, 152, -175, 559, -32, + -174, 165, -119, -255, -13, 120, -169, -29, 55, 215, + 126, 144, 36, 46, 20, 37, 44, 57, -82, 84, + -22, 39, 47, -109, -62, -3, 173, 55, 203, 133, + 59, 83, -51, 26, 32, 35, 14, -24, 88, 80, + 82, -8, 51, -26, 35, 21 + }, + { + 1541, -6750, -1004, 3073, -234, -263, 207, -145, -376, -473, + 270, 570, 335, 282, 469, -773, -322, -569, -32, -261, + 184, -667, -43, 230, -100, 184, -110, -773, -83, -392, + 125, -59, -422, 192, -28, 267, -11, 110, -289, -275, + 363, 306, -142, 229, 142, 106, -177, 213, -337, 35, + 79, -218, 308, 291, -99, -8, 228, 201, 16, -227, + -50, -61, 46, -140, -85, -88, -66, 51, -67, -111, + -110, 77, -31, 82, 79, -35, -2, 3, -114, -59, + 35, 59, -15, -24, 19, 73, -76, -21, 27, -44, + -72, -37, 45, 71, 10, 55 + }, + { + -48, 1809, -146, 369, -1, 30, 70, -219, -4, -47, + -285, 334, -216, 474, 56, 733, 406, -1401, -635, -639, + -310, 93, 195, 531, 131, 1287, 775, 571, -394, -486, + -399, -251, -350, -474, 19, -723, 260, -153, 44, -558, + -163, -260, -43, 325, -89, -201, -107, -93, 243, 350, + -228, 62, 50, 331, 159, -593, 251, -61, -227, 241, + -24, 18, 65, -55, -86, 10, 70, 114, 44, -156, + 33, 34, -5, 12, -203, -69, 5, 24, -49, -128, + 39, -3, 109, 14, -68, -33, 33, 55, -20, 83, + -75, 36, 1, 41, 30, -71 + }, + { + 2402, -12233, -782, 1699, -667, 159, 373, -676, -304, -596, + -243, 453, -671, -108, -581, -431, -9, -675, -29, -438, + -1013, 626, 317, 233, 270, -174, 165, -510, 600, 605, + 431, 233, 118, -616, 261, 57, 120, 159, -32, -114, + 29, 568, 334, -65, -214, -142, 389, -210, 134, 113, + -41, -456, -2, -139, -20, 74, -202, 89, 226, -286, + 152, 184, -333, -217, 22, 30, 52, 28, -40, -148, + 93, -8, 156, 54, 88, 44, 10, 172, -75, 25, + 8, 56, 36, 87, -83, -48, -26, -39, 82, -81, + 54, 11, -83, 62, 55, -24 + }, + { + -67, -112, 107, 73, 56, 33, -30, 134, -217, 86, + 25, 425, -174, -92, 1894, 873, -57, -40, 1040, 654, + 172, -14, 1347, -1539, -953, 566, 196, 171, -638, 1053, + 236, -1213, 293, -63, 320, -150, -426, -133, -553, -278, + 168, -81, 56, -401, -63, -186, 139, -402, -237, -55, + -407, 228, 2, -551, 43, 186, -137, 37, -165, 344, + -13, 280, 208, 20, -10, 28, -101, -136, 57, 30, + -182, 46, -29, 40, -71, -151, -66, 189, 120, 25, + 110, 20, -47, -21, 2, -5, 50, 14, 27, 45, + 82, 55, -97, 29, -1, -22 + }, + { + -4093, -14333, 970, -2687, -569, -451, -248, -76, 148, -254, + 222, 391, 316, 17, -665, 1014, -343, 287, 409, -786, + -119, 439, 1071, 630, -204, -361, -464, -294, 502, -196, + -377, 332, -22, -109, -596, -1124, -50, -440, 296, -240, + 166, -248, 138, 304, 0, 247, -206, -14, 16, -237, + -328, 215, 305, 245, 184, 219, -208, -31, 66, 46, + 59, -175, 310, -52, 6, 73, -29, 33, 133, 30, + 25, -106, 27, -58, -16, 60, -31, 109, -2, 8, + 27, -84, -85, -33, -57, 114, 32, -12, 5, -66, + 14, -55, 66, 32, 2, -59 + }, + { + -77, -277, -384, 115, 48, -11, 46, -186, -108, 249, + -252, 179, 431, -2070, -172, 212, -450, 137, -660, -828, + 649, -763, 59, -2474, -428, 46, -59, 399, 475, 424, + 68, 498, -195, 291, -195, 292, 450, 69, 403, -96, + -349, -145, 96, 88, -275, -28, -407, 146, 196, -54, + -110, 272, -374, 145, -180, -35, -123, 142, 37, 83, + -228, 217, -92, -75, 119, -119, 89, -62, 17, 73, + -66, 139, 26, -24, -12, 141, 49, -96, 99, -198, + -30, 112, -22, -33, 28, 79, -13, -68, 3, -13, + -7, -2, 45, -32, -5, 10 + }, + { + -175, -12532, 10, -404, 451, 55, 204, 19, 683, 51, + -697, -647, 23, 145, -279, 110, 203, 622, -140, -354, + 425, 424, -405, 133, -37, 493, 385, 271, 30, 369, + -622, 116, -421, 174, -117, 41, -186, -55, 57, -110, + -459, 29, 472, 73, -74, 463, -474, -112, 66, 255, + -52, -308, -138, 378, 156, -132, 129, -96, 38, 181, + 117, 157, -22, 1, 146, 236, 112, -64, -88, -123, + 72, 105, 114, 104, 41, 8, -203, -73, 95, 56, + 57, 74, 68, -117, -67, 6, 86, -19, 4, 34, + -61, 100, -10, -57, -19, 89 + }, + { + -216, -2485, 1128, 338, 382, 81, 130, -215, 765, -333, + -74, -703, -266, 394, 492, -796, 994, 114, -841, 305, + 1590, -345, 53, 297, -531, -433, 247, -285, -313, 724, + 300, -218, -310, -153, 6, 159, 116, -150, -566, -267, + -176, 493, -125, -90, -73, -336, -190, -447, -142, -262, + 17, -99, -112, -154, 228, -30, 144, -183, -132, 38, + 115, 45, -120, 177, 9, 156, 135, -105, -33, -223, + -171, -11, -97, -131, 30, -48, -48, 100, 123, -40, + 53, -69, 95, 116, -28, 83, 59, -24, -22, -66, + 24, -49, -79, 81, 28, -54 + }, + { + 1477, 7186, 454, -158, -103, -1396, 960, 835, -259, 6, + 347, 140, 514, 335, -414, -169, 790, 367, 50, -934, + -274, -187, 465, 112, 678, 303, -139, -512, 194, 256, + -620, 248, 203, -248, -159, 26, 769, -83, 720, 217, + -92, 729, -80, -463, -290, 338, 99, 82, 194, 84, + -188, -196, -129, -83, -268, -47, -122, -115, 8, -51, + -127, -171, 229, -103, 77, 15, -155, -27, -23, -112, + -171, 139, 133, 6, 95, -37, 104, 8, 111, 9, + -20, 63, -73, -35, -121, -94, -44, -137, 80, -16, + -12, 98, -47, 167, -21, 113 + }, + { + -97, 2092, 524, 242, 15, 105, 32, -478, 74, -154, + 67, 284, 290, 1010, -1701, -354, 279, 946, 685, 675, + 372, -1556, 1833, -576, 1274, -337, 41, -343, 342, -564, + -142, 312, -627, 78, -296, 338, 111, 34, 583, -117, + -76, 55, 280, 331, -166, 320, 54, -271, -58, 259, + 218, 69, -199, -41, -425, 200, -232, 4, 146, 162, + -64, -147, 100, -118, -64, 75, 65, -235, 241, -193, + 154, 36, 42, 138, -21, -73, -29, -7, 72, 33, + -172, -58, 143, 76, -69, 18, -47, 98, -70, 3, + 23, -28, -49, -24, 18, 17 + }, + { + 1661, 219, 335, 180, -254, -431, 87, -480, -235, 457, + -1009, 771, -710, 1818, -1673, 119, 1004, 431, -593, -199, + 67, 101, -250, -611, -405, 442, 278, 112, -444, -326, + 204, 159, -7, -387, -283, -157, 191, 294, 277, -334, + -68, -410, 628, 214, -184, 549, -247, 92, -56, -26, + -448, -23, 138, 32, -15, 180, -18, -103, -126, 268, + -29, 153, 12, -242, 82, 140, -76, 137, -17, 179, + -125, -79, 53, 231, 162, -96, -11, 126, 121, 6, + -16, 170, 97, 36, 19, 185, 15, -110, -54, 76, + -66, 82, -1, -34, -27, -10 + }, + { + 407, -37, -481, 445, 76, -175, 90, 436, 37, 351, + -161, -496, -151, -116, -1794, 147, 1118, -11, 137, 422, + -692, -625, -690, -77, 266, -231, -108, 672, 324, 637, + -852, -702, -132, 162, 258, -827, -351, 23, -335, -215, + 304, -135, -324, -222, -255, 160, -107, -151, -12, -18, + 70, -29, -296, 80, 187, 103, 187, -36, -203, -225, + -63, -96, 138, -268, 4, -54, 173, -164, -101, -102, + -39, -182, -174, -51, -231, 68, 31, -25, -125, 21, + 181, -231, 130, 28, -17, -56, 111, 44, 26, -28, + -44, 7, -44, 30, 42, 62 + } + }, + { + { + -1506, 5368, 3656, -1050, 69, 125, 530, 50, -344, -1283, + -621, -1987, 301, -1214, 103, 511, -87, 478, 497, 64, + 441, -121, -381, -247, -576, -274, 441, -400, -967, -191, + -999, -200, 29, 106, 68, 819, -431, -70, -88, 241, + 239, -15, 282, -134, -375, -127, -218, 575, -137, 95, + -369, 227, -65, -66, 337, -161, 125, 285, 773, -304, + 209, -36, -334, 37, 19, 83, 131, -119, 53, -99, + 141, 1, -8, -90, 164, 36, 35, -77, 60, -65, + 13, -18, 61, 69, -3, -51, 10, 146, -96, -47, + 1, -79, 80, 50, -4, -45 + }, + { + -1, -1435, -598, -259, 197, 67, -23, 346, -267, 249, + 594, -319, -526, 644, -1582, 475, -74, -63, -447, 1679, + -194, -1642, -61, -631, -1053, 75, 335, -604, 1233, -28, + 306, 599, -19, 275, -694, -508, -209, -287, -234, 342, + 100, -196, -276, -165, -6, 195, -253, -123, -107, -15, + 293, 137, 35, -259, 33, -141, -52, 170, -328, -9, + 262, -135, -34, 97, 186, 5, 34, -46, 56, 29, + -83, -73, -103, 153, 65, 183, 54, 49, -47, -95, + 45, 27, 12, -75, -28, -23, 4, -15, -138, -108, + -63, 35, 82, -27, -101, -43 + }, + { + 118, 7260, 62, -711, -146, -193, -245, 33, -206, 447, + 783, -345, -267, 653, -49, 428, -835, 1888, -713, 849, + 633, -574, 16, 205, 153, 2, 63, -443, 258, 412, + 383, 290, -431, -52, 360, -51, -294, 155, -36, 822, + -272, -115, -86, 111, 30, 93, -24, 79, -50, 506, + -112, -268, 169, -21, -326, 61, -362, 156, 47, 185, + 192, -3, 100, 14, 183, -49, -120, 216, -37, 203, + -132, -4, -14, -116, 60, 51, 46, 58, 249, 115, + 8, 40, -6, 17, 92, -73, 65, -2, 124, 18, + 10, 119, -66, 74, -13, 30 + }, + { + -2788, -2693, 649, 2100, 356, -45, -559, 295, -78, 205, + -57, 181, 294, 983, -94, -487, -45, -336, -767, -253, + 598, -455, -697, 122, 431, -713, 132, -516, -467, -137, + -1, -203, -544, -115, 495, 118, 124, -323, 116, 232, + 292, 370, -304, 129, 200, 431, -251, -181, 60, -326, + 142, -150, 83, 362, -85, 155, 198, 58, 35, -88, + -230, 77, -290, 127, -159, -145, -7, -15, -86, -31, + -252, -3, 124, 58, 50, -88, 54, -52, -24, -81, + -56, 52, 28, -10, 28, 22, -48, -43, 105, -97, + -34, -12, -38, 41, -37, 96 + }, + { + 7, 1552, 103, 366, -22, 7, -25, -109, 21, -122, + -109, 574, -17, -341, -305, 230, 834, 1097, -2588, -1627, + 224, 713, 31, 616, 413, 580, 1525, -461, 343, -594, + -610, 50, -791, -736, 136, -677, 193, -182, -283, -122, + -587, 91, -355, 301, -321, 666, -651, -226, 442, 74, + -175, 108, 166, 20, -7, -123, 35, 106, -77, 131, + -268, -1, 4, -37, 14, -59, 137, 149, -128, 32, + 45, -38, 12, -15, -290, 46, 86, -58, -58, -66, + -2, -42, 39, 7, -61, 110, 15, -15, 11, 15, + 46, 3, -59, 24, 24, -21 + }, + { + -4157, -6307, 1640, 320, 359, 72, -43, 157, -598, 15, + -633, 162, -406, 468, -668, -305, -459, -590, 34, -445, + -300, 303, 119, 420, -93, 463, -504, -111, 670, 538, + 96, 93, 223, -516, -35, 313, 546, 57, -351, 22, + 42, 68, 529, -81, -279, 115, 177, 101, -176, 423, + -147, -237, -187, -10, -334, 188, -202, 98, 26, 1, + 152, -38, -171, -303, 15, 193, -103, -38, -4, -50, + -41, 162, -33, 164, 40, 0, 53, 84, -27, 48, + -48, 203, -67, 140, -95, -15, -49, 24, -13, -25, + 7, -28, -65, 64, 39, -30 + }, + { + 6, 20, -100, -183, 163, 49, 22, -86, 3, 101, + -156, 533, -150, 232, 685, 788, -313, -69, 608, 1225, + 440, -245, 1359, -1692, -975, 946, -705, 310, -186, 214, + -69, -279, 718, -252, -603, 182, -306, -296, -446, 167, + -297, -2, 187, -412, 57, -104, -42, -383, -7, -157, + -115, 53, -94, -207, -188, 188, 9, -182, 16, 146, + 192, 124, 132, 88, 155, 44, -227, -36, 32, 44, + -138, 13, -74, 48, -88, -126, -31, 131, 95, 122, + 14, -90, 37, -37, 52, -13, -7, 158, -3, -1, + 135, -2, -20, 63, -9, 29 + }, + { + 3231, -22100, -1153, -1458, -1308, -554, 202, -397, 486, -266, + -192, 387, 1062, -914, 1157, 121, 85, -292, -186, -348, + -185, 906, 1211, 492, -765, -39, -348, -372, 663, -98, + -534, -141, 171, -45, -406, -905, -706, 131, 1, 105, + -29, -164, 244, 432, 50, -105, -2, -295, 66, -64, + -247, 242, 4, 129, 650, -30, -51, -1, -174, 124, + 12, -21, 143, -15, -82, 121, 70, 22, 70, 54, + -97, 12, -91, 50, -51, -22, 100, -27, 92, -53, + -40, -6, -52, -23, -86, 50, 144, 20, -95, -84, + 75, -21, 12, 89, -44, -42 + }, + { + 3, -779, -255, 184, 128, -8, -96, 178, -489, 97, + 254, -25, 41, -207, -3078, -218, -632, 666, -829, -333, + 78, -474, -57, -957, -168, -938, 350, -62, 937, 322, + -504, 348, -121, 610, -118, 247, 220, 329, 249, -257, + -335, 71, -293, 476, -561, 10, -311, 335, 143, -380, + 133, 255, -400, 187, -79, -125, -196, 149, 27, -65, + -116, -3, -32, 195, 23, -5, 17, -136, 5, 66, + 62, -117, 237, 74, -130, 114, -18, 23, -129, -46, + -13, 73, 1, -63, 148, -23, 5, -91, -18, -37, + 31, 15, 40, 2, -77, 60 + }, + { + -8, -14470, 1046, 67, 296, 1111, -909, 588, 529, 514, + -971, -490, 395, 599, -276, -66, 1126, 154, -281, -753, + 708, -209, -77, -189, 537, 0, 520, 219, -288, 582, + -576, 217, -489, -121, 249, -58, 271, 37, -512, -93, + -183, -263, 479, 162, -211, 242, -109, -158, -74, 202, + -121, -9, -204, 267, 230, -91, 10, 31, 33, 267, + 242, 109, -166, -92, 261, 218, 28, 147, -358, 100, + -17, -11, 203, 100, 124, -104, -322, 161, -50, 34, + 104, 186, -59, -113, -69, -27, 40, 86, -34, -113, + 113, -43, 52, -108, 26, -40 + }, + { + 230, -1195, -710, 452, 764, -627, 297, 36, 533, -526, + -14, -1037, 368, 126, 102, -760, 1114, -9, 16, 336, + 442, 458, 100, -318, 191, -394, -192, 160, -172, 305, + 509, -417, 273, -92, 300, -255, -258, -8, -331, -305, + -34, 554, -180, -140, -110, -237, -319, -168, -225, -362, + -267, -114, 149, 15, 79, 131, -95, -148, -24, -16, + 23, -151, 199, -101, 39, 187, 27, -180, 84, -208, + -150, 12, -129, -89, -53, 25, -28, 19, 162, -114, + 92, 14, 5, 122, 84, 26, 53, -41, 40, -92, + -30, -50, -12, 35, -31, 62 + }, + { + 256, 9431, -358, 407, -190, -622, 382, -265, 777, 751, + -32, 504, 224, -199, -698, 549, 577, 264, 35, -1641, + 331, 58, 81, -559, 1209, 591, -425, -318, 144, -208, + 327, 299, -320, 67, -7, -64, 513, 587, 154, 186, + 112, 506, 143, -697, 63, 19, 398, -4, 140, -21, + -200, -205, -350, -9, -40, -187, -217, 71, -176, 38, + -344, 110, 56, 162, -127, 21, -103, -77, 231, -300, + -195, 216, -42, 65, -9, 3, 101, 1, 100, 122, + 25, -127, -37, 15, -140, -76, -96, -74, 49, 44, + -11, 33, 35, 44, 81, 17 + }, + { + 18, 3123, -371, 356, -12, -40, -3, -224, -211, 36, + -31, 144, 24, 1130, -1583, -152, 881, 1796, -336, 1116, + 449, 489, -682, 199, 1019, -1114, 422, -201, -657, 1056, + -728, 11, -527, -20, -202, -263, 505, 104, 896, -410, + 197, -315, 253, 44, 15, 331, 18, -299, 36, 502, + 148, -180, -279, 28, -131, 149, -313, 214, -99, 152, + 162, 189, -248, -21, -86, 100, -175, 138, -45, -119, + 17, 199, -2, 100, 93, -104, -42, -19, 156, -141, + -101, -27, 111, 34, -3, -13, 36, -49, -4, 18, + -36, 12, -181, 68, -24, -23 + }, + { + -1478, 4934, 107, 77, -368, -277, 199, -414, -167, -113, + 217, -872, 137, 1147, -960, -495, 1777, 113, 241, -399, + 413, 68, -706, -381, -374, 566, -126, -325, 421, -795, + 180, -188, 76, 32, 166, -426, -376, 722, 107, 266, + -210, -191, -64, 357, -19, 437, 248, -430, 85, -127, + -380, 172, 89, -22, 114, 117, 119, -7, -348, 56, + 199, 106, -28, -201, 92, -19, 184, -100, 132, 230, + -208, -83, -88, 127, 227, -40, 140, 73, 55, 94, + 56, 54, 151, 17, 82, 18, 85, -145, -21, 70, + 40, -37, 84, -79, -21, 22 + }, + { + -412, -389, 604, 61, 241, -124, 19, 534, 61, 209, + -141, -163, 24, -649, -989, -702, 524, 813, 221, 842, + -1438, -475, -1046, 529, 64, -216, -67, 1661, -613, 648, + -285, -929, 669, -508, 729, -658, -773, -221, -66, 475, + -771, 507, -582, -91, -394, -327, -38, -21, 259, -245, + -35, -21, -162, 213, 53, 82, -146, 50, -226, -209, + 96, -232, -161, -41, 93, -12, 153, -83, -222, -30, + -37, -283, -196, -2, -86, 42, 4, 0, -166, 125, + -50, -56, 39, 49, -83, 4, 129, -30, 57, -1, + -13, -16, -29, -29, 17, 105 + } + }, + { + { + 1459, 4942, -28, -566, -32, 16, 403, -826, -336, -19, + 235, -1809, 185, -559, 440, -95, -326, 375, 255, -331, + 95, 85, -407, -981, -1150, -397, 524, 138, -281, 77, + -698, 105, 220, 325, -95, 855, -256, 38, 316, 55, + 74, 21, 113, -21, -116, 61, -300, 499, -86, 343, + -249, 23, -44, -217, 87, -132, -360, -463, 520, -204, + 136, -67, -218, 211, -1, -89, 181, -148, -11, -157, + 121, 95, 50, -127, 61, -9, 37, -70, 69, -57, + 72, 90, 75, 90, -44, -80, 35, 138, -70, 29, + -66, -116, 125, -15, 4, -39 + }, + { + -31, 951, 1516, -702, -355, -12, -49, 591, -524, -353, + 41, -612, -330, 1609, -730, -357, -780, 118, -336, 815, + -227, -389, 515, -1120, -629, 902, 739, -1031, 382, -366, + 346, 637, 147, 202, -472, 39, 502, 111, -411, -56, + 128, 55, 273, -45, -93, 109, -31, 22, -23, -26, + -23, 184, 498, 21, 123, -227, -234, 28, -357, 23, + 363, 66, 65, 89, 159, -129, 95, 182, 66, -85, + -74, -92, -302, 14, -102, 51, 21, -13, -74, -121, + 77, 50, 44, -42, 29, -11, 22, 72, -13, 31, + -3, 82, 113, 41, -47, -74 + }, + { + -45, 5506, -1184, -370, 343, 121, -277, 320, -248, 255, + 664, -437, -252, 639, 402, 744, -874, 1563, -1421, 312, + 640, -687, -57, -116, 237, 438, 181, -130, -27, -48, + -228, -328, -681, 35, 159, -173, -60, 225, -205, 545, + -600, -331, 265, 497, -148, -159, -57, 186, -242, 621, + 78, -273, 232, -11, -430, -89, -416, 206, 30, 85, + 4, -206, -33, -94, 130, -4, -98, 202, -22, 147, + -198, 25, 166, 17, 95, -65, -112, -43, 92, 7, + -92, -17, 28, -51, -6, -56, 110, -54, 34, 7, + -71, 44, -38, 101, -58, 18 + }, + { + 3558, 3491, -1480, 1349, 260, 35, -637, 759, 222, 734, + -330, -295, 416, 945, 130, 433, 663, 396, -350, -831, + 528, 137, -414, -214, 47, -999, 82, -285, -194, 108, + -19, 125, -193, -245, 531, 165, 417, 145, 507, 577, + 84, 139, -238, -113, -200, 513, 70, -87, -2, -544, + 168, -189, 0, 419, -63, -56, 83, 89, 44, 34, + -64, 200, -269, 193, -30, -64, 33, -145, -167, 88, + -148, -61, 25, 69, 46, -138, -1, -111, -7, -2, + -1, 53, 47, 39, 51, 3, -7, -91, 25, -77, + 8, -11, -92, -35, -46, 91 + }, + { + 42, 1509, 36, 74, -222, -94, -1, 219, 149, -59, + -80, 236, -540, -654, -1411, -2238, -657, 2953, 116, -470, + 131, -486, -600, 748, 597, -661, 415, -507, 507, -785, + -375, -84, -894, -475, 603, -565, -126, 172, -169, 162, + -392, 84, -168, 62, -657, 769, -373, -244, 200, 61, + -100, -152, 81, 51, 4, -25, 151, 190, -222, 134, + -240, -98, 89, 124, 64, -27, 222, 149, -97, 99, + -156, -152, 118, 80, -228, 53, 197, 24, 10, 16, + 54, -59, -114, 22, -9, 118, 42, -23, 34, 0, + 53, -19, -95, -6, 9, 14 + }, + { + 5117, 1938, -2005, -205, 0, -259, 391, 738, -1234, 137, + -122, 784, 239, -245, -656, -175, -546, -42, 714, 238, + 599, 312, -172, 519, -382, 375, -205, -209, 2, 142, + -613, -619, 140, -503, -160, 254, 270, 104, -192, 114, + 138, -250, 194, -183, -269, 89, 85, 89, -310, 224, + -174, 89, 153, 59, -330, 170, -151, 152, 5, -50, + 5, -26, 150, -18, 32, 90, -210, -159, 7, 100, + -20, 145, -64, 159, -25, -92, -52, -78, -14, 115, + -77, 151, -179, 32, 20, 73, -59, 35, 35, 48, + -32, -32, -54, -40, -16, -17 + }, + { + 44, 834, 457, -359, -104, -6, -11, -98, 43, -284, + -484, 172, -637, -893, -340, -814, -2245, -888, 89, 347, + 504, -77, 1141, -1598, -1548, -19, -1405, -78, -159, 1274, + 1169, 405, 488, 214, -103, 480, 68, 33, -163, 534, + -58, 6, 234, -273, 223, 10, 154, -90, 168, 117, + 162, 229, 227, 168, -67, 127, -22, 65, 196, -112, + -76, -216, 42, 164, 49, -5, -102, 171, 199, 26, + -279, -23, -103, 50, 107, -58, -23, 63, 6, 31, + -110, -113, 116, 15, 40, 7, 22, 156, 44, 38, + 41, -37, 54, 114, 38, 12 + }, + { + -1608, -27141, 616, 383, -430, -154, -192, -584, 310, -141, + 471, -126, 361, 24, 1408, -403, -31, -817, -548, 198, + -84, 570, 533, 35, -780, 199, 174, -319, 196, 57, + -250, -289, 79, 195, 69, -39, 160, 667, 269, -24, + 5, 199, 283, 77, 83, 84, 302, -125, 46, 53, + -298, 262, -312, -305, 380, -257, 10, 126, -83, 86, + -145, -223, -16, -46, -83, 126, 176, 25, 7, 99, + -147, -21, -99, 157, 29, -58, 102, -39, 80, -25, + -82, 18, 34, 66, 18, 58, 170, 81, -72, -76, + 59, 26, 53, 40, -109, -33 + }, + { + 74, 296, 357, 90, 271, -23, -150, 223, -486, 89, + 14, -190, 282, -578, -4855, -1719, -1345, 605, -974, 733, + 630, -799, 66, 820, 1347, -1229, 344, 322, 261, 500, + -537, 111, -223, 179, 50, 141, -411, -45, -72, -186, + 32, 229, -173, 527, -300, 431, -74, 243, 65, -145, + 251, 162, -307, 290, 80, 6, -113, 178, -70, -274, + -322, 4, 62, 123, -19, 119, 24, -83, -39, -55, + -9, -148, 217, 37, -179, 2, -51, -46, -218, 47, + 41, -5, 11, -20, 108, -129, 22, 10, -13, -67, + -4, -28, -4, -25, -90, 85 + }, + { + 143, -17241, -1447, 592, -383, 1562, 817, 1348, 926, 1146, + -537, 257, 1120, 1235, 297, 78, 1295, 104, -114, -253, + 604, -14, 374, -747, -358, -145, -211, -555, -729, 263, + -126, 464, -543, -68, 575, 11, 298, 285, -502, -13, + 536, 3, 94, -152, -260, -213, 17, -11, -13, 308, + 188, 396, -162, -291, -89, 66, 83, 157, 90, -6, + 9, -17, -173, 113, 146, -86, -29, 170, -208, 161, + -66, -28, 150, 14, -4, -84, -178, 118, -89, 84, + 9, 25, -165, -96, -1, 26, 97, 72, -136, -221, + 62, -108, -59, -127, 33, -61 + }, + { + -233, 916, 806, -421, 221, -583, 669, 16, -119, -830, + 301, 22, 1313, -35, 592, -384, 130, -765, 655, 41, + -768, 758, 776, -48, 334, 74, -116, -36, -430, -119, + 571, 91, 722, -119, -227, -421, -229, -80, -40, -75, + 158, 1036, 190, -37, -216, -513, -460, 44, 231, -34, + -97, -63, 165, -26, 57, 213, -77, 12, 178, -81, + -31, -278, 10, -268, -18, 115, -115, -223, 184, 27, + 5, 56, 38, 61, -22, 44, -100, -67, 66, -158, + 138, 12, -56, 5, 43, -85, -77, -59, 107, -19, + 31, 1, -16, -50, -13, 133 + }, + { + -2289, 6438, -445, -532, 1048, 1399, -53, -140, 688, 71, + 129, 801, 179, -126, -986, 55, 82, -130, 785, -1443, + -380, 81, 547, -134, 1120, 459, -469, -304, 424, -233, + -2, -21, -487, 175, -8, 82, -194, -215, -218, 284, + 298, 406, 35, -118, 479, 55, 456, -198, 65, -56, + -349, -159, -216, -183, 44, 21, -178, 208, -22, 185, + -103, 156, -80, 213, -60, -1, 83, 76, 188, -171, + -23, 177, -211, -126, -125, 14, 119, 9, 41, 43, + 8, -92, 28, 114, -84, -63, -52, -14, 35, 42, + -12, 47, 37, -32, 42, -52 + }, + { + 40, 3636, -306, 209, -7, -426, -214, -76, -5, 165, + 27, 63, -715, 2411, 842, 1478, 803, 730, -765, 883, + -790, 620, 688, 198, 42, -705, 608, -89, -295, 1652, + -647, -235, 50, 384, 16, -75, 749, -217, 696, -144, + 267, -395, -18, -227, -116, -137, -89, -275, 164, 550, + 158, 274, 146, 163, 83, 335, 77, 430, -105, 153, + 50, 422, -42, -125, -94, 110, -103, 0, -235, -142, + -248, 202, -47, -68, 183, 70, 19, -33, 74, -146, + -40, -46, 29, -35, 50, 59, -9, -181, -60, 77, + -40, 5, -90, 55, -73, -10 + }, + { + 487, 8074, 445, -495, -884, 9, 32, -548, 301, -234, + -503, -1918, -911, 683, 264, -619, 1190, 90, -293, -654, + 749, 561, 100, 474, 385, 663, -194, 10, 1569, -577, + -359, -623, -66, 70, 16, -766, -1018, 436, 397, 822, + -37, -103, -299, 94, -394, 59, 389, -409, -155, -42, + -169, 199, 192, 90, -62, 21, 143, 80, -363, -93, + 133, -14, -8, -91, 167, -71, 139, -107, -12, -111, + -171, -61, -224, 64, 110, -90, 142, -52, -104, 52, + 102, 23, 4, -114, 4, -120, 34, -110, 35, 165, + 106, -83, 38, -66, -1, 69 + }, + { + 387, -1313, -943, -44, -184, -430, -50, 682, 182, -246, + 11, 123, -122, 1878, 2556, -423, -889, -37, 58, -1287, + -1866, 1522, 25, 625, 56, 30, -11, 1101, -681, 795, + 1198, 421, 810, -694, 378, -250, 59, -457, -367, 902, + -435, 726, -316, -237, -551, -412, -144, -309, -157, -314, + 37, 242, 246, 41, -487, -161, -241, 119, 163, 309, + 250, -114, -174, 13, 223, -27, -4, -174, -61, 93, + 24, -65, 21, 69, 6, 20, 12, 36, -119, 117, + -210, -89, -13, -49, -68, 12, 21, -107, 83, -9, + -27, 10, 7, 32, 40, 24 + } + }, + { + { + -1057, 3421, 738, 264, 370, -12, -332, -631, -374, -389, + 473, -727, -614, 255, 498, -499, -626, 230, -67, 481, + -741, 386, -608, -620, -769, -190, -87, 2, 476, -142, + -268, -201, 134, 691, 45, 301, 88, -233, 423, 163, + -172, 326, 8, -300, 141, -97, -235, 219, 89, 371, + -100, -172, 62, -143, -55, -201, -376, -394, 257, -148, + -48, 79, 19, 78, -19, -192, 66, -34, 81, -101, + -30, 194, -102, -65, -31, 34, 13, 15, -60, 15, + -23, 210, 74, 40, -55, 13, 52, 10, -43, 67, + -61, -107, 109, -46, 32, -56 + }, + { + 75, 2104, 564, -1023, 119, -84, 65, 204, 73, -829, + -232, -448, -211, 727, 406, -478, -783, -518, 1369, -827, + 14, 646, -279, -381, -545, 99, 531, -627, 93, -356, + 573, 70, 735, -148, 141, 38, 363, 387, -456, -175, + 396, -89, 358, -443, -104, 213, 473, -79, -182, 15, + 25, 138, 476, 172, 49, -50, -300, -363, -92, 59, + 324, 169, 23, 70, 163, -159, 104, 254, 71, -107, + -139, -94, -182, -123, -50, -52, -43, -5, -14, -65, + 97, -18, 32, 30, -15, 20, 7, 84, -35, 79, + -11, 76, 52, 74, 13, -61 + }, + { + -21, 2318, 1034, 699, -601, 162, -58, 274, -52, -440, + 1168, 62, -709, 289, 815, 290, 396, 490, -926, -176, + 279, -647, 566, -229, -302, 621, 108, 415, -672, 36, + 352, -960, -563, 382, -533, 241, -231, 271, 6, 14, + -463, -333, 156, 530, -108, -141, -117, 392, -317, 148, + 138, 159, -97, -88, -142, -253, -268, 161, 22, 222, + -160, -177, -107, -73, 143, 25, 32, -44, 59, 74, + -72, -90, 186, 26, -10, 8, -55, -76, 54, 9, + -68, -19, 51, -48, -102, 65, 78, 27, -144, 54, + -34, -15, 47, -1, 12, -14 + }, + { + -3514, 9836, 1532, 158, 636, 231, -215, 110, 286, 1340, + -298, -648, 517, 192, 741, -14, 987, 697, -471, -263, + -199, -298, 218, -422, -29, -292, -963, 80, -177, 265, + 180, 369, -53, -13, 92, 376, -20, 410, 85, 978, + 202, -266, -61, -461, 32, 155, 579, -149, 91, -362, + -151, 25, -8, 176, 15, -131, 56, 263, -53, 9, + -35, 197, -54, -31, 168, -150, 115, -151, -141, 128, + -26, 22, -104, -31, 30, -23, -37, -52, -29, 15, + -38, 24, 89, 45, 15, -17, 31, -111, -58, -6, + 44, -45, -58, -64, -17, 82 + }, + { + -93, 1485, 107, -273, 143, -88, -13, -12, 225, -165, + 320, -221, -135, -1181, -1683, -1372, -659, 370, 1986, 146, + 377, -969, -984, 1001, 25, -832, 922, -299, 810, -1310, + 184, -177, -1461, 489, 411, -448, -160, -28, 120, -54, + -31, 40, -42, -365, -184, 1, 106, -263, 107, 83, + 16, -95, -95, 158, -63, 182, 142, -23, -309, 100, + -25, -115, 159, 213, -31, 55, 162, 121, -15, 71, + -207, -111, 86, -7, -71, 0, 127, 65, 99, 68, + -106, 2, -103, -10, 54, 115, 53, -34, 11, 16, + 36, -13, -29, -52, -30, 6 + }, + { + -4906, 11302, 788, 640, -146, -231, 256, 404, -949, -228, + 543, -500, 1258, -1098, -126, 101, -965, 90, 468, 795, + 631, 372, -302, 285, -75, 234, -62, -66, -375, -291, + -339, -806, -43, 212, -333, 315, -200, 86, 104, 253, + 64, -193, -11, -109, -353, 36, 159, 24, -405, 114, + 157, 5, 335, -129, 106, -121, 68, 22, -91, -42, + 18, -78, 177, 201, 52, -151, -26, -65, -94, 67, + 56, -10, 173, -31, 7, -54, 6, 8, -94, 62, + -62, 73, -81, -103, 108, 39, 9, -29, 78, -37, + -71, 82, -30, -56, -58, 54 + }, + { + -11, 1006, 406, -23, -235, 3, 32, -156, 182, -639, + -209, -312, -195, -969, 635, -616, -2867, -362, 546, -644, + -214, 1008, 120, -1677, -797, -606, -254, -869, -124, 1610, + 1288, 428, -9, 220, -12, 486, 32, 243, 38, 332, + 52, 66, -301, 56, 388, 34, 43, -54, 235, 206, + 157, 127, 253, 135, 7, 53, 19, 56, 413, -60, + -135, -268, -164, 190, 2, 27, -81, 157, 220, 11, + -317, -150, 58, 22, 126, 0, 55, -74, -5, -4, + -24, -52, 43, 97, -83, -13, 183, -37, 56, 147, + -59, 14, 37, 50, 81, -32 + }, + { + -337, -27789, -669, 327, 29, 329, -938, 100, 9, -154, + 418, 1, -588, 686, 567, 351, -812, 309, -920, 197, + 153, 225, 409, -82, -435, -237, 342, -20, -326, -148, + 226, -92, 103, 221, 178, 478, -46, 526, 140, 18, + -204, 331, 238, -9, 103, 290, 468, -319, -221, 365, + -426, 260, -293, -198, 143, -269, 68, 30, 139, -25, + -122, -325, 78, -96, -81, 224, 158, 48, -53, 171, + -236, -31, -24, 149, 58, 0, -13, 34, 28, -6, + -87, -45, 63, 65, 120, 104, 23, 61, 2, -37, + 48, 2, 45, -20, -72, -40 + }, + { + -3, 855, 59, 107, 360, -80, -32, -148, -109, 72, + -211, 78, 118, -1110, -4428, -1306, -866, 415, -1157, 1224, + 601, -930, -680, 1660, 19, -237, 259, 451, -114, 1129, + -1052, 244, 275, -160, -156, 425, -240, -325, 10, -69, + -208, 364, -26, -85, 391, 174, 69, 67, 117, 245, + -1, 80, -108, 115, 97, 152, -272, 250, -138, -17, + -456, 66, -80, 269, -8, 40, 17, -96, -2, -184, + 21, -8, 15, 101, -45, -183, 77, -120, -108, 60, + 57, -85, -37, 30, -18, -2, 39, 28, -76, 16, + -69, -25, 35, -104, -19, 82 + }, + { + -255, -18042, -873, 1247, -680, 136, 1218, 1334, 1457, 807, + -61, 249, 1049, 501, 76, 1213, 968, 584, 237, 75, + -560, 52, 219, -571, -647, 798, -897, -893, -813, 377, + 150, 189, -319, 165, 314, 203, 794, -294, -442, -459, + 1087, -35, 256, -608, 344, -387, -49, 48, 7, 77, + 615, 153, -186, -322, -102, 73, -35, 307, 68, 72, + -13, -355, -60, 193, -29, -105, 194, 17, -131, 103, + 129, -90, -38, 123, -104, -14, -71, -64, -33, 141, + 11, -68, -77, -40, -54, -77, 79, 59, -100, -10, + -124, -48, -117, -25, -92, 58 + }, + { + 197, 2340, -478, -273, -381, 350, 171, -59, -235, 78, + -166, 493, 455, -52, 1253, -391, 616, -1393, 461, 262, + -726, 378, 1171, -279, 603, 55, -165, -406, -205, 340, + -36, 161, 791, -45, -869, -5, -38, -237, 433, 46, + -63, 586, 247, -44, -66, -283, -424, -203, 233, 205, + -169, 33, 255, -175, -29, -1, 240, -38, 330, -232, + -88, 100, -202, -221, -105, -120, 11, 48, 37, 37, + 41, -15, 151, 76, -24, 22, -43, -57, -15, -59, + 94, -63, 12, -82, 72, -160, -30, -61, 131, -5, + -29, 54, -44, -84, 65, 94 + }, + { + 3443, -250, -1074, -1224, 1234, 2708, -1388, 384, 465, 37, + 704, 61, -252, -413, -538, 105, 394, -648, 624, -572, + -699, 217, 742, 320, -307, 509, -130, 157, 152, -184, + -44, -70, -147, -164, -235, 1093, -756, -491, -273, 475, + -66, 879, -519, 191, 408, 189, 80, 144, -70, -87, + -78, -200, -410, -73, 80, -169, 238, 63, 150, 17, + 168, 10, -72, 46, 54, 124, -21, 135, -38, 91, + 8, 33, -19, -164, -144, 65, 59, 28, 38, -85, + 17, 11, 44, 68, -94, -21, -86, 26, -23, -3, + 50, -25, 74, -49, 30, 5 + }, + { + -86, 3060, 69, -142, 526, -795, 170, -64, -35, -172, + 85, 137, -801, 1457, 200, 2761, 208, 941, -218, 266, + -1216, 383, 2318, 176, -1269, 1117, 680, -939, -119, 850, + -33, -168, 770, -273, 339, 198, 99, 248, 255, 446, + -191, -8, -419, 117, -208, -484, 269, -219, 347, 27, + 232, 453, 365, -238, 359, 234, 398, 134, 23, 86, + -131, 378, -46, -236, 80, -20, 134, -149, -180, -160, + -279, 258, -130, 20, 123, 1, 88, -77, -14, -41, + 61, -36, -62, -17, 3, 108, -99, -80, -35, -23, + -16, -24, -6, -8, -3, -26 + }, + { + 826, 7685, -64, -663, -296, 214, -13, -575, 181, -284, + -852, -1921, -863, -626, 1866, 247, -240, 88, -632, 69, + 482, 323, 551, 242, 1055, -521, 616, 286, 1161, -123, + -713, -547, -7, 8, -104, -294, -721, -119, 275, 488, + 685, -258, -427, 225, -631, 120, -80, -435, -289, 133, + 130, 299, -24, -67, 119, 1, 14, 107, -310, 123, + 66, -142, -10, 19, 232, -39, -46, 47, -79, -363, + 74, -160, -172, 59, -17, -15, 80, -28, -47, 48, + 23, 38, -64, -113, -45, -79, 1, -27, 46, 104, + 47, 8, 1, -72, 35, 35 + }, + { + -371, -1744, 188, -158, -152, -339, -448, 227, 347, 95, + 51, 65, -763, 85, 3682, 1695, -697, -604, 209, -2701, + -454, 1699, -252, -262, -83, -127, -85, 189, 1153, -402, + 1300, 1069, 93, -268, 399, -367, 165, -51, -286, 204, + 170, -25, 390, -823, -332, 4, -306, -84, -597, 100, + 116, 134, 350, -49, -460, -173, -406, 214, 333, 221, + 236, 44, -177, -43, 69, -1, 173, -487, 182, 132, + -54, 43, 119, -53, -12, 114, 0, -200, 61, 55, + -154, -95, 6, -108, 70, -33, -7, -8, -15, -2, + 11, -5, -1, 82, 26, -19 + } + }, + { + { + 787, -4454, -7368, -1375, -270, 1, -180, -251, -244, -1062, + -272, -433, -635, 341, 752, -271, -816, -164, -527, -1, + -980, 522, -334, 37, 405, 594, 132, -314, 572, 105, + -407, -258, 126, 319, -141, 318, 188, -139, 394, 417, + -85, 178, -45, -188, -134, -384, -50, 80, -40, 134, + -433, -265, 114, -32, 214, 32, -246, -336, 66, -389, + -228, 193, 175, -66, -241, -361, -27, -52, 53, 33, + -22, 84, -112, -27, -46, -14, -58, -6, -88, 20, + -93, 38, 10, 116, -30, -26, 29, 11, -39, 46, + -5, -57, 61, -50, 29, -47 + }, + { + -97, 1400, -204, -371, 861, -141, -187, -247, 98, -794, + -96, -416, 22, 1008, 955, 820, 120, -697, 1142, -682, + 389, 1083, -471, 150, -534, -902, -75, -611, 618, 215, + 523, -252, 1004, -222, 43, -313, -100, 680, 149, 7, + 259, -175, 302, -291, 41, 41, 360, 233, 69, -38, + 72, 41, 181, 45, 303, 352, -140, -364, -139, -12, + 106, 112, 79, 0, 101, -188, -76, 53, -15, -153, + -67, 135, 99, -113, -93, -44, -32, -2, 36, -6, + 51, -21, 23, 36, -29, -29, -28, 68, -71, 41, + 2, 23, -63, 16, 50, -6 + }, + { + 88, -574, -855, 1570, -51, 236, 185, -105, -431, -73, + 986, 415, -388, -667, 525, 544, -8, 153, 63, -105, + 400, -452, 694, -52, -1082, 341, 320, 194, -787, -234, + 272, -619, -277, 457, -244, 424, -152, 57, -273, -94, + 56, 2, -180, 163, -123, -128, -329, 198, -221, -54, + -155, 68, -196, -39, 109, -32, -134, 125, 74, 225, + -103, -159, -82, -57, 5, -79, 48, 20, 67, 44, + 25, -149, 33, -15, -11, 28, -9, -90, 9, 112, + 107, 53, -11, -26, -32, 82, -5, 33, -88, 98, + -23, -79, 45, 31, 50, -35 + }, + { + 2592, 14244, -1644, -866, 15, 398, 334, 3, -463, 763, + 358, -690, -281, 6, 869, -508, 585, 969, -471, -296, + -313, -695, 351, -230, 36, 837, -172, 421, -79, 146, + 277, 320, 87, 81, -246, 364, -312, -3, -247, 255, + -56, -138, -22, -95, 192, -249, 571, -69, 238, -33, + -170, 193, 44, 11, -124, -304, -3, 87, -142, 40, + -114, 240, 29, -112, 169, -97, 106, -51, 25, 188, + 78, 184, -4, -70, 20, 55, 34, 35, -12, 24, + -9, -34, -33, 18, 23, 25, 46, -86, -48, -20, + 8, -40, 14, -34, -20, 56 + }, + { + 118, 1550, 25, -477, 77, 52, -73, -199, 179, -65, + 295, -398, -169, -965, -1497, -379, 1037, -1470, 678, 921, + 63, -408, -649, 17, 239, 142, 1296, -239, 643, -885, + 283, 258, -345, 625, -189, -408, -165, -276, 186, -126, + 221, 137, -329, -464, 149, 173, 115, -382, 179, 103, + -17, 5, -133, 101, -5, 195, 46, -17, -191, 187, + -14, -83, 154, 153, -191, -64, 111, 110, 19, 43, + -133, -79, 28, 7, -58, -106, -24, 17, 17, 47, + -49, 86, -48, 27, 38, 50, 32, -9, -36, -43, + 19, 45, 52, -48, -54, -27 + }, + { + 3469, 18127, -2204, 2505, 1000, 232, -462, -360, -282, -591, + -186, -606, 1407, -1486, -503, 716, 214, 433, -39, -342, + -460, 302, -120, 146, -417, 225, 177, 355, 130, -338, + -155, -53, 119, 72, -99, 394, -516, -356, 47, 220, + 185, 361, -44, -244, -156, 530, 377, -80, -217, 71, + 223, 106, 365, -118, 128, 61, -4, -162, -200, -128, + -50, -158, 215, 125, 71, 61, 148, 90, -93, 4, + 72, -64, 210, 75, 110, 31, 10, -1, 6, 97, + -75, 66, -87, -135, 31, -23, 23, -29, 107, -14, + -35, 137, 10, 0, -22, 24 + }, + { + -20, 308, -70, 372, 115, 34, -13, -165, 370, -72, + 290, 49, 158, 595, 2951, 2564, 125, 627, 454, -942, + -291, 793, 1354, -728, -735, -479, -162, -325, 716, 621, + -241, -291, 128, 372, -385, -30, -164, -9, -138, 5, + -1, 101, -365, 116, 193, -265, 99, 140, 83, -79, + -120, -152, -4, 145, 29, -16, 59, 154, 389, -46, + -5, -52, -63, 127, -90, -40, -185, -39, 54, 101, + -152, -90, 57, -31, 53, -16, 100, -105, -18, -53, + 13, 65, 18, 65, -77, -80, 118, -92, 47, 171, + -51, 38, -16, -47, 52, -52 + }, + { + 2089, -24563, -462, -1345, -1203, 337, -356, 524, -4, -372, + -559, -377, -610, 1171, 264, -716, -411, 1457, -375, -128, + -110, -319, -201, -178, 133, -110, 18, 5, 128, 272, + 353, -208, 202, 356, 208, 620, -362, 221, 49, -51, + -53, 252, -6, -156, 130, 400, 322, -142, -52, 58, + -570, 416, -13, -202, -175, -482, 50, 92, 301, 327, + 236, -197, 8, -180, -90, 59, -111, 44, 84, 142, + -192, 104, -79, 31, 73, 3, -29, -30, -7, 76, + -54, -62, 53, 18, 80, 57, -83, 23, 56, -22, + -7, -85, -51, -52, -27, 20 + }, + { + -69, 28, -506, -136, 66, -45, 28, -117, 7, 77, + -219, 73, 341, 924, -2266, -24, 668, 1153, -1504, 17, + 90, -748, -165, 461, -1999, -371, -507, -287, -228, 1045, + -335, 736, 428, -310, -417, 640, 273, -306, 133, 370, + -351, 10, 164, -206, 198, -3, -6, 198, 303, 258, + -75, 221, -109, 141, 214, 220, -293, 52, -165, 280, + -143, 257, -169, 123, 34, -22, 63, 50, 94, -165, + 70, 103, -70, 72, 25, -107, 134, -118, -38, 34, + -27, 60, 81, -48, -93, 38, 42, -2, -22, 83, + -109, -29, 81, -45, 32, 11 + }, + { + 377, -15874, 1032, 179, -1543, -1182, -58, 326, 368, -320, + -473, -326, -313, -378, 367, 1854, 1032, 127, 429, 459, + -936, -314, 300, -123, -644, 610, -661, -419, -963, -19, + 392, 271, -225, 717, -161, -322, 627, -327, -170, -176, + 877, -328, 519, -228, 429, -616, -92, 180, 101, 16, + 159, -147, -132, -304, -58, 66, -253, 178, 121, 99, + 6, -340, -9, 140, -4, 6, 12, -56, -99, 1, + 82, -105, -22, 155, -117, 8, -93, -111, -57, 89, + -35, -27, -36, -93, -123, -129, 34, 78, -6, 90, + -80, 45, -38, 14, -43, 102 + }, + { + -143, 3283, 694, 97, -174, -48, -519, -92, 440, 633, + -662, -57, 657, 577, 1696, 188, 1371, -300, -399, -538, + 310, -75, 572, -85, 817, -104, -306, -677, 112, 602, + -82, -250, 50, 41, -814, 73, 319, -292, 180, -53, + -42, 139, -311, -378, -67, 213, -320, -354, 443, 584, + 44, -121, 290, 76, 5, -206, 120, -105, 201, -65, + 171, 40, -322, -80, -73, -24, 121, 37, 31, 103, + 76, -11, 211, 92, -50, 69, 83, -4, 42, -76, + -22, 40, 48, -132, 51, -144, 45, -2, 116, -27, + -66, 30, 9, -12, 20, -9 + }, + { + -3012, -8024, -199, -1097, -30, 1016, -1184, 1015, 214, -6, + 753, -488, -359, 698, 174, -104, 409, -570, 564, -99, + -511, 183, 768, 68, -1061, -117, -20, 134, 166, 252, + -59, -188, 368, 35, 55, 1761, -338, -383, -169, 120, + -391, 443, -760, 167, -56, -42, -104, -352, -46, 370, + 132, 11, -298, 165, 343, -176, 247, 138, 301, -90, + -129, -72, -16, -19, 57, 140, -177, 67, 39, 192, + 71, -16, 36, -39, -50, 59, 39, 21, 15, -86, + 50, 7, 13, 46, -134, -24, -127, -43, -75, -75, + 30, -83, 37, -3, 34, 18 + }, + { + 132, 1906, -801, -285, 758, -661, -109, 13, 241, -319, + -69, 163, -1042, 137, -3396, -1146, -789, 439, 509, 888, + 63, 1523, 1651, -159, -1372, 745, 740, -219, 389, 341, + -107, 206, 1520, -196, -220, 295, 130, 219, -368, 58, + -359, 283, -10, 395, -163, -446, 349, -213, 16, -382, + 86, 184, 75, -460, -56, -123, 279, 6, -61, 108, + -188, -59, -185, -84, 97, 6, 346, -44, -138, -129, + -292, 140, -86, -6, -75, -106, 87, -121, -4, 24, + 67, -41, 34, 36, -93, 47, -131, -24, 10, 10, + 21, 2, 32, 1, 51, 6 + }, + { + -1835, 4276, 542, -892, -110, 687, 192, -453, -164, -300, + 423, -585, -441, -829, 904, -130, 365, 1134, -465, -14, + 116, -254, 475, 384, 801, -916, 479, -19, 373, -43, + 182, 67, 306, 138, -86, 175, -354, -172, -113, -540, + 698, -252, -713, 214, -191, 402, -336, -624, -376, 133, + 374, 238, -505, -484, 141, 164, 140, 236, -143, 120, + -114, -172, 51, 113, 216, -81, -118, 108, 32, -76, + 209, -109, -60, 4, -88, -33, 117, 35, -21, 14, + -76, -56, -50, -33, 10, 50, 122, -4, 4, 44, + 23, 63, 12, -59, 40, -16 + }, + { + 344, -2424, -795, -105, -202, -415, -1009, -332, -84, 357, + 423, -432, -755, -518, 2014, 525, -1033, -318, 335, -2110, + -680, 1026, -954, -1029, -758, -784, -749, -774, 1798, -135, + 125, 378, -234, -189, 546, -356, 215, 614, -134, -320, + -3, -707, 58, -445, 137, 84, -87, 374, -196, 320, + 258, 145, 222, -146, -250, 92, -367, -16, 100, -47, + -127, -64, -41, -72, -56, -78, 221, -289, 354, 92, + -160, 56, 138, -37, -120, 27, -31, -256, 70, 107, + 12, 20, 61, -69, 130, -23, 25, 72, 42, 37, + 24, -3, -3, 65, 5, 24 + } + }, + { + { + -766, -12744, 2287, -2146, -157, 276, 62, -731, 70, -776, + -1468, -202, 328, 561, 320, -961, 259, -516, -326, -615, + 138, -169, -193, 132, 712, 395, 641, -580, -372, 477, + -473, 216, 292, -144, 23, 112, 144, 262, 114, 253, + -27, -23, 36, 12, -498, -163, -58, -22, 20, -101, + -276, -118, -8, 113, 104, 83, -167, -90, -127, -241, + -140, 10, 114, 3, -284, -157, -162, -105, 76, 20, + -2, 22, -20, -63, -11, 58, -85, -46, -1, -49, + -40, -55, -16, 72, 50, -34, 19, 36, -35, 14, + -12, -2, 12, -3, 0, 12 + }, + { + 61, 4, 261, 721, 59, 1, -211, -459, 70, -780, + -1, 180, 130, 478, 1036, 1433, -192, -570, -137, 970, + -464, 1011, 229, -746, -1, -622, 36, -597, 412, 206, + 294, 125, 635, 63, -203, -298, 2, 374, 219, 224, + 75, 115, -178, 52, -120, 96, 166, 271, 96, -181, + 224, 173, 108, -138, 358, 294, -31, -129, -166, -94, + -62, 88, 185, 6, -73, -12, -16, -88, -23, -229, + 108, -2, 21, 4, -5, -94, 17, -1, 3, 28, + -11, 6, 67, 50, -46, -81, -18, 30, -13, -47, + 24, 19, -36, -35, 33, 25 + }, + { + -126, -2198, 541, 796, 685, 150, 97, -48, -256, 161, + 479, 426, -513, -24, 547, 713, 46, -693, 393, 178, + 287, -163, 37, 169, -276, -830, 479, -68, -210, -380, + -79, -383, 50, -99, 397, 305, 151, -362, -118, -77, + 226, 128, -171, -138, -60, 25, -144, -179, -133, 20, + -68, -159, -101, 31, 102, -40, 116, -102, 107, 181, + -32, -116, -127, -89, 78, -45, -41, 1, 74, 25, + -7, 13, -88, 28, 7, -62, -78, 79, 28, 119, + 41, 18, -26, 8, 55, -13, 6, 11, 36, -16, + -11, -67, 1, 80, 40, 7 + }, + { + -1107, 14554, 2315, -647, -923, 200, 465, 166, -196, -209, + 1017, -792, -192, -431, 540, -203, -16, 1636, -579, 3, + -309, -218, -503, 34, 139, 602, 92, 489, -61, 117, + 176, 98, 185, 23, -7, 39, -154, -347, 232, -117, + -31, 170, -172, -161, 189, -241, 146, 217, 196, 272, + -116, -37, -115, 167, -19, -255, -41, -225, 61, -24, + 86, 28, -197, 66, 98, 93, 19, -132, 74, 166, + -9, 186, 67, -101, 28, 60, 79, -5, -23, 7, + -9, -35, -60, 30, 35, 35, -5, -22, -40, 21, + -11, -56, 31, -1, -12, 8 + }, + { + -118, 861, 907, -311, -108, 74, 29, -117, -1, -140, + 299, -632, -296, -993, -1393, -624, 2132, 416, -1696, 853, + 391, -537, -390, -198, 156, 605, 1100, -191, 120, 178, + -306, 107, 87, 139, -398, -148, -210, 15, 85, -296, + -19, 280, -247, -320, 135, -83, 16, 9, 10, 145, + -132, -80, -65, -40, 77, 179, -17, 29, -125, 274, + -215, 47, 148, -47, -105, -102, 138, 100, -63, 49, + -55, -54, 33, -14, -112, 50, -144, 24, -89, 73, + -7, 41, -10, -1, 47, 56, -3, 32, -21, -41, + 16, 17, 31, -3, -53, -34 + }, + { + -1260, 19158, 2072, 3887, -149, 381, 331, -1685, 203, -9, + -977, -126, 775, -859, -559, 564, 202, 470, 79, -204, + -796, 375, -273, 69, -324, 409, 259, 156, 551, -505, + -515, 70, 51, 6, 126, 137, -99, -323, -174, 365, + 259, 510, -240, -10, -13, 179, 416, -82, 64, 21, + 134, 95, 218, 172, -263, 231, -202, -85, -239, -34, + -102, -47, 141, -55, 73, 189, 91, 81, -17, -42, + 13, 34, -12, 234, 51, 52, 26, 6, 61, 33, + 1, -18, -81, -29, -25, 11, -22, -11, 88, 27, + -38, 89, 30, -2, 14, 7 + }, + { + -16, -179, 149, 342, 62, 20, -15, -4, 149, 170, + 338, -65, 359, 1138, 2718, 1849, 1007, 762, 216, -55, + -491, 619, 1864, -2175, 19, -724, 435, 142, 579, -359, + 17, -527, 531, 474, -682, -75, 95, -286, -35, -78, + 25, 46, -213, 143, 90, -83, 28, 245, -174, -164, + -31, -95, -245, 146, 34, 61, -23, 165, 223, 34, + -54, 66, -33, 88, -23, 27, -178, -1, -38, -18, + -45, -52, 49, -114, 66, 12, 101, -107, -60, -15, + 14, 99, 29, -22, -36, -33, 17, -31, 96, 54, + 10, 32, -2, -43, -2, -17 + }, + { + -3251, -19459, 1626, -3079, 425, 21, 287, 28, 36, -161, + -1225, -512, 851, 533, 224, -1001, 733, -50, 269, 75, + -156, -246, -273, -418, 259, 15, 0, -384, 256, 262, + 306, 2, 171, 269, 138, 267, -42, -31, 30, 64, + 7, 6, 30, 180, 31, 124, 345, 119, 4, -117, + -219, -24, 71, -113, -160, -251, -253, 80, 207, 421, + 222, -79, 15, -186, 39, 19, -192, 94, 52, 1, + -25, -25, 6, -59, 73, -17, 26, -104, 34, 104, + -24, 3, -4, 1, 73, 9, -51, 42, -27, -12, + -37, -30, -57, -57, 24, 29 + }, + { + 5, -567, -198, 54, -315, 65, 3, -39, -97, -6, + 80, -47, -47, -208, -966, 559, 400, 1417, -1158, 1000, + -1913, 94, 505, -1767, -1074, -227, -301, -197, 64, -221, + 523, 622, 27, -72, 157, -44, 534, -172, 420, 24, + -338, -77, 291, -263, -126, 114, 23, 313, 249, 217, + -157, 168, 101, 152, 95, 228, -113, -226, 11, 100, + 26, 101, -74, 83, 116, -102, 154, 59, 11, -46, + -13, 140, -7, 18, 19, 32, 16, -87, 4, -17, + -84, 105, 82, -6, -123, 40, -34, 51, -14, 14, + -10, -36, 30, 29, 8, -16 + }, + { + -487, -15214, 3223, -916, -1043, -111, -812, -738, 704, -455, + -380, -765, -1125, -145, 1346, 920, 1451, -172, 174, 457, + -247, -672, 227, 51, -137, -148, -495, -74, -822, -341, + 284, 428, 7, 479, -641, -41, 158, 136, -52, 212, + 75, -159, 518, 129, -143, -430, 149, 46, -26, 308, + -273, -27, -92, -195, 19, -162, 9, 55, 113, 75, + 7, -293, 97, 7, -19, 111, -71, 72, -145, -39, + 31, -67, -56, 145, -31, -74, -6, -106, -49, 50, + -25, 0, -89, -20, -184, -55, -63, 50, 34, -8, + 3, 3, 19, 54, 9, 11 + }, + { + 99, 3050, 675, 27, -125, -341, -652, 32, 869, -79, + -182, -407, 421, 1020, 1101, 356, 898, 470, -792, -587, + 923, 39, 228, 51, 507, -698, 128, -299, 455, -63, + 277, -425, -56, 153, -540, -387, 399, 76, 40, -240, + 205, -229, -242, -354, 24, 200, -329, -181, 165, 380, + 208, 84, 68, 266, -244, -124, 240, -53, 65, 104, + 80, -93, -167, 16, -113, 10, 27, -12, 51, 77, + 101, 63, 29, 105, -47, 124, 37, 41, 42, -26, + -103, 117, -16, -53, -21, -5, -26, 72, 0, 4, + -33, 77, -44, 2, 16, -58 + }, + { + 1186, -11638, -1998, -764, -99, -1048, 603, 360, -208, 811, + 467, -418, -396, 430, 255, 61, 476, -596, 148, 71, + 97, -138, 234, 149, -392, -450, 188, -277, 86, 413, + 62, -99, 363, -61, 680, 622, 172, -390, 264, -342, + 96, -1, -370, -194, -98, -448, 184, 27, -140, 75, + -92, 154, -82, 140, 293, -171, 169, 245, 47, 195, + -94, -102, -57, -40, 31, 40, -44, 9, 81, 49, + 88, 21, 100, 5, 15, -3, 41, 52, -62, -66, + 10, 64, 25, -58, -69, -66, -56, -125, -70, 26, + -76, -58, 29, 23, -7, -11 + }, + { + -169, -7, 1393, -174, 215, -114, -426, 148, -149, -291, + 75, 129, 159, -1001, -3313, -2613, 840, -573, 278, 934, + 1105, 1606, -687, -230, 34, -8, 485, 372, 690, 363, + -816, 1078, 622, 17, -203, -116, 570, 123, -606, -141, + 80, 324, 252, 147, -261, 16, -39, -160, -210, -21, + 18, -155, -123, -173, -138, -111, -14, 68, 58, -72, + 27, -83, -114, -135, 9, 96, 86, 97, 0, -327, + -3, -54, 25, -80, -64, -39, -65, -62, -1, 30, + 15, -8, 83, 35, -79, -31, -47, -6, -52, 61, + 19, 48, -3, 10, 40, -22 + }, + { + 2072, -62, -253, -1122, 2, -476, 1292, -234, 38, -283, + 384, -539, -211, 246, 134, -113, 764, 478, -149, 519, + -186, -241, -10, 791, -147, -262, 120, 217, 42, -321, + 482, 250, 92, 109, 229, 11, -299, -195, 72, -332, + 543, -764, -356, 150, -64, 275, -102, -552, -80, 59, + 368, -154, -337, -318, 20, 91, 126, 102, 102, 75, + -278, -32, -27, 152, 87, 21, -81, 122, -77, 103, + 118, -112, 58, -87, -93, -48, 178, 18, 92, -53, + -113, -76, 68, -12, -10, 58, 68, 13, -11, 10, + 70, 57, 3, -12, 9, -4 + }, + { + -288, -2896, 508, -15, -717, -157, -759, -526, -209, 407, + 427, -705, -566, 1240, 181, -699, 229, -398, -284, -423, + -1813, 274, -591, -405, -811, -1175, -773, -592, 1273, 1011, + -415, -114, -110, -48, 399, 132, 13, 269, 112, -421, + -289, -517, -47, -426, 227, -206, 389, 211, 71, 52, + 382, 218, 52, 54, -204, -33, -273, -183, 77, -183, + -141, 43, -22, -135, -109, -3, 7, 63, 54, 172, + -75, 56, 0, 66, -114, 19, -89, -155, 16, 66, + 31, 23, 131, 10, 39, -86, 66, 6, 54, 56, + 36, 1, 35, -1, 31, 65 + } + }, + { + { + 644, -9520, 4609, -754, 435, -38, -67, -646, 643, -18, + -748, 553, 413, -657, -9, -309, 823, 110, 475, -305, + 34, -307, -99, -82, -74, -82, 657, -517, -494, 656, + -309, -89, 178, -8, 95, 2, -45, 212, 109, -95, + -175, 101, -113, -120, -301, -60, -82, 55, 9, -94, + 1, 75, -31, 57, -36, 151, 76, 149, -44, -60, + 116, 1, -30, 86, -104, -9, -1, -75, -23, -68, + -24, 10, 114, 85, 36, 50, -100, -60, 14, 2, + 58, -59, -66, 7, 21, 15, 39, 79, 10, 1, + -2, 30, 23, -7, 2, 11 + }, + { + 7, -503, -74, 145, -391, 138, -78, -180, 362, -15, + 466, -23, -54, 287, 369, 559, -294, -245, -1073, 423, + -656, 215, 248, 247, 678, -647, 519, -226, 255, -284, + 215, 175, 45, -190, -196, 112, 168, 239, 125, 180, + -150, 41, 7, 105, -223, 113, 14, 60, -20, -107, + 184, 81, 125, -135, 177, -42, -20, 5, -118, 56, + -36, -3, 4, -41, -50, 76, 105, -140, -2, -146, + 110, -32, -37, -40, 6, -54, 27, 21, -9, -42, + 10, 53, 56, 22, -23, -32, -20, -20, -19, -35, + 49, 9, -10, -6, -6, 3 + }, + { + 109, -1600, 273, -664, 138, 118, -60, 68, -194, -203, + 268, 289, -549, 76, 360, 860, -184, -507, 291, -443, + 238, 77, 135, 198, 49, -701, 546, -56, 143, 26, + -29, -159, 398, -256, 58, 132, 370, -186, 174, 202, + 127, -31, -32, -31, 103, 246, -9, 56, 42, 44, + 84, -40, 21, 59, 46, -29, 97, -174, -48, 29, + 31, 1, -48, -39, 39, -35, -14, -53, -18, 43, + 35, 31, -92, 17, 2, 19, -2, 95, -15, -17, + -70, 18, -29, -28, 49, -35, -3, -11, 38, -34, + 0, -51, -25, 22, -25, 38 + }, + { + -369, 10368, -2376, 347, 279, -181, 369, 198, -146, -696, + 502, -382, 277, -318, -151, -449, -260, 827, -948, 31, + -93, 94, -256, 172, -362, 44, 10, 438, 6, -179, + 19, -7, -43, 54, 110, 21, 3, -165, 314, -255, + -59, 230, -54, -236, 52, -59, 59, 40, -118, 148, + -147, -201, -40, 180, 39, -101, 5, -169, 96, -124, + 74, -26, -194, 153, 36, 37, -3, -226, -62, 24, + -143, 36, 44, -79, 5, -8, 16, -10, 14, 47, + 30, 22, -33, -6, -12, 12, 34, 15, -19, 48, + 13, -43, 36, 29, 5, 21 + }, + { + 126, -167, -181, -36, 49, 26, 72, 17, 89, 15, + 264, -490, 358, -103, -936, -1302, 816, 1409, -1377, -146, + 257, 41, 488, -61, -231, -1168, 68, 68, -65, 20, + -664, -267, -158, -140, -309, 14, -127, 304, 211, -348, + -67, 300, -110, 3, 93, -234, 4, 41, -188, 114, + 31, -16, -95, -101, 116, 160, -9, 108, -212, 46, + -265, -5, 27, -125, -50, -89, -24, 11, -26, 181, + 3, -57, 37, 23, -17, 111, -126, 45, -67, 28, + -38, 24, -20, -7, 19, 33, -18, 22, 13, -28, + 8, 15, 3, -18, -15, 12 + }, + { + -856, 14733, -1353, 3927, -464, 31, 591, -1160, 165, 408, + -333, -421, 400, -38, -238, 517, 21, 119, -89, 151, + -107, 411, -174, 364, -260, 25, -158, -267, 462, -28, + -163, 167, -23, -268, -160, -47, 150, 92, -3, 294, + 69, 216, -172, 5, -141, 197, 287, -351, -54, 77, + -17, -38, 112, 144, -267, 246, -51, 87, -188, -135, + -146, -63, -63, -153, 56, 63, -10, 54, 15, -39, + -64, 38, -131, 108, -34, 36, 39, -29, 21, -28, + -33, 12, 18, 42, 11, 51, -5, -14, 17, 24, + -42, 30, 12, -33, 5, 18 + }, + { + 41, -594, -402, -32, -184, 34, -59, -5, 88, -9, + 19, -158, 203, 558, 1570, -735, -777, 264, 422, 363, + -785, 55, 1703, -1817, 209, 43, 786, -162, 31, -629, + 383, -387, 538, 900, -108, 217, 147, -29, 306, 75, + 57, 100, -33, 164, 3, 94, 60, 181, -138, -159, + -47, -111, -251, 71, -70, -35, -56, -87, 39, 71, + -163, -12, -23, 100, 71, 107, -87, 38, -14, -21, + -8, 51, 73, -115, 96, 39, 102, -31, -10, 28, + -1, 23, -11, -5, 1, -33, -15, 0, 28, -53, + 13, 19, 5, 7, 11, -6 + }, + { + 3583, -11037, 1661, -2780, -34, 142, 110, -433, -136, 212, + -519, -150, 922, -102, 514, -626, 32, -864, 137, 339, + 105, -5, -104, -441, 145, 32, 63, -303, 181, 66, + 50, -189, -138, 7, -114, 25, -207, -174, 44, 152, + -94, -245, 86, 102, 38, 47, -2, 47, 189, 75, + 202, -45, -95, 37, 155, 91, -20, 16, -25, 271, + 22, -80, 150, -76, 49, 63, -60, 14, -73, 11, + -24, -49, 84, 0, 51, -40, 50, -70, 48, 63, + -12, 59, -3, -39, -39, -52, 25, 41, -36, 28, + -31, 14, 0, 9, 27, -9 + }, + { + 62, 16, 108, 127, -128, 58, -37, -25, -137, 50, + -15, -286, -126, 1105, 441, -521, -1274, 825, -1012, 1413, + -768, 708, 460, -1226, 7, 106, 438, -18, -176, -412, + -96, 166, -112, -313, 140, -211, -32, -346, 240, -145, + -78, -62, 360, 155, 88, 190, 2, 146, 60, 65, + -122, 129, 37, 50, -33, 101, -38, -124, -8, -133, + -72, 49, -56, 48, 68, -63, 127, -33, 6, 10, + -104, 10, -98, -11, 76, 77, 2, -54, -1, 26, + -66, 0, 10, 41, -91, 41, -45, 15, -34, -10, + 37, 2, 0, 11, 0, -7 + }, + { + 547, -11949, 4104, -437, 542, 581, -809, -343, 865, -159, + -191, -278, -381, 117, 661, -408, 725, -171, -166, -56, + 136, -377, 417, -270, -441, 119, 109, 246, -451, -2, + 65, 116, -114, 400, -449, -156, -56, 122, -140, 273, + -166, -372, 257, -133, -46, 110, 255, -84, -34, 222, + -183, 247, 9, -98, 107, 32, 106, -41, 102, 48, + 169, -63, 55, -91, -36, 19, -83, 105, -145, -43, + -26, -44, -18, 87, 23, -12, 64, -22, -63, -10, + -43, 41, -68, 28, -74, 24, -62, 35, 3, -53, + 16, -14, 44, 53, -4, -12 + }, + { + -50, 1809, -135, -109, -167, -168, -448, -250, 343, -259, + 432, -211, 173, 241, -411, -705, -225, 555, 92, -417, + 502, 153, -73, -435, 261, -434, 534, 20, 96, -668, + 492, -107, 85, 168, -181, -376, 177, 173, -24, -143, + -63, -251, 106, -323, 132, 188, -189, 49, -79, 22, + 14, 12, -152, 117, -104, -44, 119, -63, -70, 25, + 171, 9, -76, 42, 72, 110, -116, -139, -19, -32, + -37, -41, -63, 64, -78, 71, 7, 61, 70, 47, + -64, 109, -16, -46, -22, 25, -22, 38, -49, 22, + -10, 67, -22, 15, 14, -42 + }, + { + 1131, -10536, -1351, -834, -161, -1726, 78, -65, -450, 339, + 226, -131, -290, 26, 139, 192, 624, -281, -243, -425, + 316, -24, -80, -136, 183, 10, 334, -103, -10, 193, + 91, 235, 346, -377, 102, 5, 92, -180, 352, -277, + 122, -75, -170, -268, 199, -207, 98, 68, -82, -171, + -170, 136, -23, 51, 180, -165, 59, 138, -121, 84, + -15, 51, 17, 31, -8, 24, -50, -131, 58, -38, + -28, -14, 123, 46, 30, -49, -9, 18, -35, -17, + -5, 64, 4, 18, 24, -62, 22, -45, -55, 69, + 16, -6, -2, 7, -6, -22 + }, + { + 183, -1084, 439, 51, 164, -22, -396, 80, -205, -282, + 100, 249, 151, -213, -897, -1398, 1050, -638, -659, 500, + -382, -161, -1189, -73, 101, -775, -79, -55, 322, 638, + -279, 1061, -10, -95, -268, -724, 115, -209, -499, -22, + 240, 183, 96, 195, -8, 225, -64, -190, -131, 106, + 19, -238, -251, -28, 89, -3, -90, 24, 36, -93, + 121, 86, 105, -5, -78, -28, 13, 112, 88, -146, + 127, -20, 88, -48, -6, 19, 12, 2, -66, -15, + 19, -43, -20, -37, -28, 21, -8, 1, -54, 37, + -6, 52, -2, -32, -6, 9 + }, + { + -1409, -4065, -208, -1275, 429, -392, 1485, 237, 467, -356, + 870, 222, -145, 294, -41, -403, 188, 397, 101, 538, + -216, -20, -14, 526, -275, 209, 198, 143, 131, -529, + -56, -14, 33, 66, 192, -19, -245, -126, 270, -60, + 167, -694, -36, 184, -64, 196, 133, -59, 110, -41, + 121, -95, 34, -187, 28, 1, -75, 3, -4, 81, + -155, 15, -76, -42, -77, 5, -70, 41, -28, 31, + -5, 29, 114, -115, -22, -23, 98, -82, 58, 5, + 6, -21, 63, 25, 32, -32, -43, -17, 10, -7, + 3, 2, 16, 16, -11, -9 + }, + { + 240, -3243, -136, 395, -364, 531, -18, -251, -147, 32, + 213, -398, 198, 718, -506, -500, -154, -339, 124, 1067, + -979, 102, -290, 110, 355, 94, 251, -521, 124, 666, + -385, -219, 89, -108, 140, 235, -76, 48, 329, -154, + 37, 93, 395, -112, 19, -308, 392, 43, 83, -62, + 232, 179, -130, 36, -101, 78, -76, -115, 32, -137, + 2, 14, -11, 68, 44, -49, -109, 103, -86, 75, + -55, 75, -13, 81, -68, 13, -2, -27, -22, 11, + 1, -65, -17, -51, 5, -61, 65, -28, 17, 15, + -13, -43, 28, -47, -6, 62 + } + }, + { + { + -288, -3327, -441, 680, -216, -51, -248, -205, 218, -179, + 197, 458, -267, -338, -356, 88, 512, 485, 261, 65, + -104, 77, -279, -74, -320, -43, 296, -182, -195, 169, + 178, -209, 64, 97, 67, 48, -19, -11, 239, -49, + -313, 94, -177, -214, -77, 43, -182, -1, -2, -90, + 89, 68, 22, -12, 43, 34, 116, 77, 15, -21, + 113, 21, -1, -12, 32, -3, 45, -51, -79, -60, + 15, 15, 94, 79, -4, 33, -34, -32, 1, 14, + 42, -52, -57, 1, 20, 9, 52, 46, 44, 17, + 3, 8, 23, -2, 0, -4 + }, + { + -33, -111, -247, -514, 125, -44, -26, 232, -49, 106, + 387, 79, -76, 177, 439, -335, 490, 48, -861, -798, + 133, -227, 421, 263, 403, -76, 201, 135, -35, 23, + -173, 305, -159, -346, -48, 223, 153, 379, 22, -31, + 14, 1, 134, -78, -194, 230, -104, 5, 0, -19, + 42, 72, 122, -7, 76, -129, 15, 9, -43, -48, + 38, 34, -74, 5, -31, 27, 100, -58, -60, 7, + 12, -24, -39, -51, -18, 3, 8, 22, -40, -79, + 71, 40, 25, -5, 25, -27, -16, -3, -22, 2, + 5, -14, 35, 3, -9, -15 + }, + { + -44, 178, -881, -881, 87, 171, 11, -166, -24, -105, + -108, 41, 102, 18, 400, 133, 196, -375, 12, -143, + -38, -211, 582, -94, 320, -302, 167, 197, 63, -184, + 163, 18, 41, -164, -143, 243, 353, -102, 254, 203, + -31, -94, -26, 65, 89, 125, 78, 97, -21, 58, + 135, 14, -27, 100, -10, 89, -56, -142, 16, -58, + -11, 67, -48, -5, -15, 37, -37, -6, -32, 14, + 19, -48, -18, -3, 17, 27, 21, 52, -6, -83, + 13, -6, -7, -32, -9, -27, 15, -16, 3, 0, + -22, -32, -17, 1, -25, 18 + }, + { + 1306, 5472, -39, 377, -263, -72, 123, 73, 69, -492, + -110, 92, 1, -77, -168, -371, -281, 56, -490, 189, + -172, -87, 127, 161, -349, -32, 29, 139, 151, 38, + -242, -51, -109, 110, 107, 58, 69, -82, 183, -325, + 26, 194, -73, -78, 2, 144, -154, -11, -183, 21, + 128, -196, -75, 53, 55, -98, -16, -61, 76, -81, + 67, -99, 27, 38, 26, 10, -16, -161, -45, -41, + -38, -68, -24, -2, -28, -8, 9, -8, 16, 34, + 54, 4, -6, -22, 27, -6, 11, 24, -18, 19, + 21, 2, 6, 14, 24, 18 + }, + { + -146, -574, 160, 134, -24, -21, 4, 145, 106, -51, + 113, -263, 102, 107, -614, -505, -511, 208, 817, -672, + 171, 129, 405, -233, 344, -1540, -507, 187, 535, -771, + -102, -404, -247, -41, -201, 27, 51, 165, 39, 3, + -41, 44, 82, 101, 35, -161, -61, 41, -157, 91, + 72, -67, -79, -32, 74, 77, 75, 42, -17, -160, + -200, -24, 9, -81, -11, -94, -21, -44, 66, 137, + -59, -28, 74, -22, 36, 37, 1, -52, 0, -2, + 2, 12, -19, 1, -14, -1, 30, -19, 35, -4, + 10, 14, -25, -22, 5, 2 + }, + { + 2102, 7881, 134, 2824, 598, -98, 103, -54, -273, 252, + 113, -375, -161, 630, 129, -16, 58, -163, 204, -123, + 231, -17, 190, 136, -22, -75, -202, -217, 127, 142, + 81, -24, -144, -188, -183, -105, 146, 318, -113, 22, + 160, -15, 44, -63, 87, 72, -24, -94, -238, 2, + 112, -50, 198, 25, -22, 29, 153, 5, -133, -205, + -118, -33, -148, -10, -41, 41, -2, 12, 81, -25, + -57, 0, -53, 10, -23, 18, 64, -51, -30, -11, + 17, -23, 33, 18, 54, 24, -18, 33, -15, -17, + -6, 13, 15, -15, -24, 6 + }, + { + 0, -715, -160, -187, -101, -38, 5, 101, -42, 6, + -83, -6, -4, 439, 1200, -1282, -452, -247, 288, 93, + -299, 165, 479, -336, -131, 258, -243, 60, 44, 173, + -184, -91, 526, 862, 164, 187, 61, 111, 279, -1, + 100, -2, 125, 219, -35, 119, 57, 131, -127, -163, + -131, 17, -95, -134, 90, -120, -51, -119, 10, 24, + -61, -41, -36, 12, 103, 41, -16, -25, 9, 18, + -10, 76, 0, -1, 53, 60, 33, 65, -22, 2, + 13, 19, -23, -25, 17, 5, -60, 18, -4, -31, + -16, 18, 26, 11, 9, -10 + }, + { + -3021, -1062, -477, -1667, 287, 95, -218, 104, -143, -192, + -14, 37, 324, 82, 131, -218, -193, -439, -223, 447, + -174, -171, 106, -77, -184, 162, -202, -30, 181, -38, + 5, -21, -118, -21, -226, -99, -141, -45, 103, -36, + -29, -176, 48, -41, 130, 14, 72, 49, 88, 58, + 212, -35, -37, 11, 185, 118, 69, 7, 15, 52, + 57, -4, 31, 95, 10, 12, -7, -50, -54, -14, + 1, -10, 18, 44, -4, -8, 66, -3, 21, 19, + 33, 33, -15, -17, -33, -48, 32, 16, 6, 3, + -13, 3, 15, 38, 3, -7 + }, + { + -6, 225, 250, 27, 39, -12, -25, -16, -74, 47, + -132, -236, 87, 409, 746, -1161, -199, -135, -94, 795, + 560, 16, -69, -180, -81, 469, 585, -224, -525, 397, + -314, -304, -235, -6, -68, -264, -255, -139, 71, -127, + 130, -88, 84, 227, 227, 247, 48, 23, 13, -1, + 124, -89, 71, 34, 16, -9, -45, 36, -11, -135, + -96, 5, -28, 15, 13, 22, -3, -12, -6, 19, + -84, -10, -94, -21, 100, 45, -7, -17, -10, 35, + -20, -27, -21, 62, -60, 4, 4, -12, -36, -21, + 18, 11, -6, 10, 3, -4 + }, + { + -577, -7567, 185, 535, 941, -182, 123, 15, 182, 143, + -136, 180, -188, 253, -106, -172, 198, 223, -139, 91, + -32, -223, 211, -143, -589, 143, 206, 29, 84, -141, + 12, 90, 2, -63, -46, -102, -133, 252, -161, 20, + -169, 16, -128, -298, 248, 193, 56, 23, 66, 1, + 99, 96, 21, -73, 56, 103, 60, 27, -4, 44, + 91, 67, 2, -45, 2, -91, 21, 57, -99, -66, + -27, -23, -3, 24, 73, -23, 26, 21, -45, 15, + -30, -45, -42, 13, 16, 6, 2, -16, -14, -56, + 37, -28, 41, 38, -12, 7 + }, + { + -23, 953, 352, -219, -110, -147, -103, -236, -16, 89, + 141, 269, 97, 78, -1022, -361, -368, 485, 155, 233, + -585, 408, -110, -71, -101, -228, 149, 390, -57, 21, + -267, 30, 147, -97, -129, -60, 65, 220, -152, -22, + -265, -84, 136, -109, 138, -54, -4, 122, -94, -16, + -124, 30, -71, -4, -22, -124, -3, 64, -26, 14, + 88, -1, 71, -52, 97, 35, -107, -68, -21, -72, + -23, -46, -4, -14, -45, 25, 22, 46, 30, 59, + 12, 16, 7, -39, -17, -8, 21, -5, -21, -18, + 34, 27, 12, -1, 10, -7 + }, + { + -2823, -5849, -569, -742, -318, 124, -1183, -586, 354, -80, + 360, -191, -316, -180, 248, 132, 336, -237, -155, 175, + -123, 212, -95, 23, 151, 179, 121, -97, -103, -32, + 192, 231, 119, -118, -62, -218, 46, 214, -60, 101, + -136, -136, -143, 53, 99, -106, 50, 132, -23, -225, + -2, -65, 152, -87, 31, 83, 20, 92, -69, -56, + 104, 26, 3, 51, 45, 2, -91, -102, 46, -54, + 34, -54, 74, 11, 66, -35, -29, -15, -18, 14, + -1, 46, -6, 49, 11, -30, 12, -39, 1, 28, + 40, 8, 4, -10, -3, -6 + }, + { + -163, -1426, 593, 441, -11, -149, -141, -40, -206, -120, + 55, 94, -126, 251, -833, 59, 177, -361, -345, -130, + -936, -544, -181, -105, -76, -662, -353, 143, 375, 149, + 455, 723, -86, -360, 110, -646, -107, -368, -271, -43, + 319, 164, -150, 157, 116, -67, 61, -156, -37, 124, + 17, -134, -203, -131, 166, 18, -49, 107, -72, -49, + 89, 88, 161, -16, -101, -67, 68, 36, 116, -13, + 64, 15, 82, -73, 56, -4, 13, 7, -27, -14, + 30, -59, -72, -29, -20, -9, 23, -26, -13, 25, + -11, 4, 25, -10, -23, 20 + }, + { + 155, -6166, -360, -528, 35, 663, 3, 791, -13, -19, + 235, 675, -187, 286, -106, -184, -252, 51, 402, 348, + -113, 58, 162, 216, -121, 148, 124, 363, 77, -190, + -289, -177, 75, 2, 24, 124, -224, -31, -31, 96, + -96, -219, -81, 162, 147, -9, -50, 244, -55, 42, + 117, -8, -33, -42, 5, -37, -174, 18, -79, 103, + 13, -59, -28, -109, -109, -18, -48, -16, 45, -25, + 19, 77, 3, -75, 7, -48, 60, 3, -9, 32, + -10, 7, 13, 31, 26, -74, -33, 13, -11, 9, + 2, -16, 7, 10, 12, -13 + }, + { + -217, -2779, -126, 198, 65, 202, 251, -86, -45, -118, + -93, 0, 502, 938, -596, -633, -619, -364, 247, 723, + -38, -482, 310, -243, 731, 153, 530, -450, 91, -5, + 49, 55, -169, -38, 291, 103, -120, 209, 41, 71, + 128, 328, 343, -96, -262, 62, 110, 67, 18, -50, + 107, 255, -125, 3, -66, 20, -41, 0, 49, -84, + 35, 61, -31, 16, 60, -5, -106, 69, -30, -26, + 56, -5, 58, 29, -12, -19, -27, 24, -45, -47, + 25, -32, -66, -43, -16, -12, 37, 4, -24, -3, + -6, -17, -22, -23, -6, 23 + } + }, + { + { + -18, -1731, -1164, 387, -216, -68, -13, 155, -13, -285, + 327, 205, -275, -12, 48, 210, -147, 120, -112, -93, + -186, 132, -15, 335, 34, -73, -98, -119, 59, 76, + 225, -83, 73, 52, 82, 27, 155, 150, 211, -28, + -269, 38, -207, -127, -23, 43, -146, -1, -12, -65, + 99, 3, 1, -12, 70, -30, 85, 59, 48, 55, + 65, 39, 59, -46, 42, -23, 72, 32, -10, 38, + 53, -5, 9, 3, -54, -19, -7, 2, -9, 2, + 5, -10, 16, 8, 3, 0, 14, -6, 29, 17, + 18, -1, -1, -17, -1, 1 + }, + { + 1, 412, -79, -316, 315, -29, 77, 179, -129, -39, + 173, -171, -194, -15, 352, -103, 628, 221, -36, -410, + 358, -42, 143, -279, 29, 88, 116, -155, -162, 190, + -108, 166, -303, -211, 158, 189, 115, 170, -99, -16, + 21, -136, -5, -45, -106, 107, -186, -59, -110, -43, + 41, -54, 12, -35, 0, -120, 28, -13, 1, -40, + 43, 27, -67, 58, 38, -1, 19, 2, -6, 6, + -16, -13, 13, -1, 4, 50, -3, 23, 0, -54, + 33, 6, 28, 6, 27, -15, -19, 3, -25, 8, + 5, -14, 30, -8, -8, -3 + }, + { + -32, 1219, 266, 384, 442, 40, -41, -129, 141, 21, + -38, 111, 121, 11, 59, -496, 143, -381, 225, -32, + -56, -532, 506, 88, 497, -32, 59, 160, 65, -38, + 294, 32, -135, -272, -250, 120, 191, -101, 102, -6, + -82, -36, 17, 38, -43, -59, 83, 90, -91, -48, + -26, -22, -32, 12, -4, 142, -100, -32, 148, 25, + -63, -19, -75, 27, -41, 31, 10, 33, -46, -79, + -32, -37, 26, 11, 1, -3, 7, 27, -15, -63, + 31, -12, 10, -10, -3, 0, 30, -19, -6, 16, + -10, -4, -5, -3, -26, -2 + }, + { + -1438, 1132, -1072, -48, 336, -80, -122, -65, 302, 34, + 89, -47, -80, 142, 461, 98, -206, -148, -483, 215, + -19, 11, 251, 173, -338, 145, -113, -142, 76, -33, + -205, 69, -131, 87, 96, 163, 106, -88, 28, -217, + 53, 70, 46, -133, -15, 283, -140, -15, -134, -41, + 74, -77, -10, -43, -24, -73, 75, -29, 25, -44, + 103, -56, 56, 14, 59, -9, 22, -59, 16, 55, + 84, -30, -43, -6, -33, -27, 0, -1, -27, -27, + 23, 10, 16, -31, 11, 4, 0, 17, -23, -2, + 5, 18, -9, -25, 6, -6 + }, + { + 143, -812, -278, 138, -10, -30, -18, 79, 25, 2, + 232, -52, -7, 93, -180, 588, 311, -687, 506, -616, + 333, 347, 579, 2, 527, -570, 108, 134, 505, -798, + 324, 45, -64, 165, 120, 188, -32, -76, 14, 202, + 168, 19, 60, 104, 99, -55, 9, 51, -92, 94, + 116, -1, -48, 0, 35, -16, 80, -57, -72, -45, + -32, 5, 28, -30, -11, -46, -7, -80, 19, 30, + -70, -34, 52, -35, 34, 13, 32, -38, 5, 15, + 17, 27, 19, 16, -8, -25, 17, -40, 17, 8, + 23, 22, -2, 13, 6, -18 + }, + { + -2189, 1075, -480, 2230, 219, -121, 104, 464, 168, 164, + 54, -174, -202, 332, -115, -246, 53, -290, 165, -134, + -84, -344, 256, 28, -82, -1, -18, -52, 77, 87, + -34, -59, -136, -147, -219, -169, 1, 126, -198, -40, + 109, -78, 43, 86, 168, -36, -159, 2, -158, -32, + 196, -50, 40, -19, 107, -46, 24, -9, -24, -51, + 113, 63, -154, 33, -46, 33, 10, 21, 90, 23, + 2, 11, 6, -17, -25, 5, 3, -58, -12, 13, + 28, -27, 35, -24, -1, -6, -10, 23, 10, -35, + -42, 0, 5, 10, -14, -15 + }, + { + -33, -796, -88, -66, -2, 8, 24, 85, -90, -12, + -72, -59, -251, -43, 418, -827, 269, -135, 63, -160, + -265, -312, 351, 708, 466, 382, -792, -169, 131, 525, + 233, 155, 441, 342, 48, 32, -65, 27, 151, -196, + -102, -105, 8, 153, -111, 57, -1, 107, 4, -18, + -79, -36, -1, -22, 171, -121, -147, -89, 60, -20, + -67, -11, -84, -94, 1, -3, 10, -34, -31, 23, + -5, 41, -6, 44, 42, 10, -31, 45, -27, -26, + 10, -2, -23, -10, 11, 2, -32, 24, 3, 20, + -21, 5, 15, 8, 18, -11 + }, + { + 1777, 5845, -221, -1541, -37, 217, -45, 99, -238, -260, + 240, 93, -68, -71, 63, 134, 83, 218, -156, 193, + -167, -196, 187, 1, -233, 192, 51, 267, 128, -238, + 104, 189, 37, -6, -28, 34, -60, 77, -67, -245, + 41, -155, -81, -68, 68, 21, 113, 44, 35, 18, + 83, 78, 104, -22, 72, 58, 116, 19, -31, -82, + 71, -67, -83, 62, -52, -19, 23, -32, -27, -33, + 0, 2, -13, 58, 22, 30, 55, 7, 3, 3, + 26, 16, -9, -14, 6, -6, 6, -3, 19, -14, + -20, -11, 7, 11, -23, 5 + }, + { + -51, -194, 26, -41, -12, -21, 41, 30, -33, 13, + -82, -16, 56, -84, 641, -888, 603, 440, 133, 554, + 534, -357, 112, 231, -428, 525, 763, -4, -304, 562, + -146, -273, -62, 156, -237, -285, -263, -183, 67, -186, + -7, -5, 0, -87, -17, 107, 69, 99, 28, -22, + 45, -52, 49, -13, 66, 8, -8, 87, -58, -105, + -18, 66, 14, 38, 25, 31, -5, 24, 23, 46, + -31, 19, -73, -3, 94, -7, 9, -5, -24, 30, + -1, 6, -31, 63, -49, 1, 4, -15, -8, -25, + -17, 4, -6, -3, -8, -2 + }, + { + 631, -6945, -1424, 391, 773, -317, 506, 138, -43, 9, + -57, 197, 169, 522, -80, 30, -93, 317, -224, -28, + -44, -244, 60, 73, -284, 391, -46, -287, 268, 264, + 53, -234, -201, -138, 270, 50, -135, 263, -20, 84, + -167, -15, -75, -221, 170, -5, -162, -36, 50, -187, + -21, -42, -13, -49, 5, 2, -46, -48, -47, 11, + -25, 18, -25, -43, 25, -33, 28, -18, -51, 28, + 42, -12, -18, 23, 40, -25, -16, 22, -9, 53, + 11, -15, -23, -22, 0, -21, 7, -4, -18, -45, + 25, -26, 11, -4, -13, 24 + }, + { + 88, 530, -28, 226, 115, 127, 248, -187, -165, -5, + -21, 572, 73, -75, -787, 103, 29, 117, 88, 768, + -451, 179, -33, -98, 95, 201, -8, 160, -249, 151, + -198, 68, -10, -19, -56, 24, -13, 97, 45, 232, + -78, 161, 182, -35, 136, -44, -43, 54, -71, -42, + -113, 53, 16, -3, -1, -120, -76, 30, -27, -73, + 22, -31, 5, -86, 31, 1, -59, -35, 14, 0, + 62, 21, 41, -12, -12, 15, -16, -15, -57, 27, + 12, -8, 23, -12, -1, -33, 9, 2, 26, 0, + 19, 18, 17, -4, -2, -6 + }, + { + 3077, 2152, 43, -443, -389, 1794, 320, -304, 167, -452, + 437, 18, -76, -134, -274, -221, 450, 174, -75, 277, + -41, 185, 20, 103, -21, -88, 88, -64, -114, -131, + -1, 28, 39, 127, 164, -90, -19, 291, -82, 155, + -165, -84, 75, 256, 45, -51, 67, 196, 54, -34, + 119, -18, 56, -191, -4, 107, -48, 45, 60, -33, + 45, 39, 35, -25, 17, -13, -31, -19, 8, -79, + 79, -41, 35, -15, 46, -41, -51, -29, -14, 17, + -4, 16, -1, 36, 20, 10, 4, -19, 4, -35, + 16, -2, 9, 4, 0, 3 + }, + { + 109, -1749, -82, 356, -79, -289, 43, 188, 10, 37, + -23, -51, -182, 541, -849, 172, 402, 111, 104, -180, + -80, 119, 276, -185, -530, -225, -198, -409, -344, -361, + 194, 328, -267, -338, 321, -255, 7, -187, 18, 91, + 141, -95, -411, -47, -80, -89, 73, -165, 14, -11, + -16, 40, -9, 14, 141, -34, -17, 84, -71, 33, + -5, -61, 53, -12, 2, -48, 74, 60, 139, 2, + 40, 24, 58, -76, 18, -46, 26, 22, 12, 5, + 34, -18, -46, -19, -29, -37, 5, -5, 15, 2, + -32, 0, 34, 25, 4, 5 + }, + { + 1053, -5125, -197, -44, 22, 999, -439, 231, -283, -139, + -246, 264, -107, -54, -621, 165, -60, -38, 147, 33, + -332, -287, -21, -125, -220, 91, -21, 76, 183, 207, + -21, -188, -34, -35, -33, -64, -115, 185, -60, -59, + 97, 70, -179, 27, -14, -27, 99, 288, -13, 76, + 74, 42, 39, 60, 98, 33, -159, 101, -58, 62, + 77, -16, -19, -39, -28, 25, -21, -14, 23, -59, + 28, 44, -6, 32, 62, -34, 31, -4, 0, 40, + -4, 14, -7, -16, 14, -38, -30, 12, -16, 16, + 16, -8, -1, 25, 27, -2 + }, + { + 176, -2272, -261, 72, -17, -1, 205, 68, 130, 20, + 74, 293, 296, 508, 34, 114, -322, -231, 103, 2, + 223, 43, 319, -701, 314, 79, 465, -435, 389, 90, + 338, 305, -66, 64, 246, -5, -20, 130, -177, 73, + 121, 59, 97, -97, -173, 92, -46, -32, -41, -48, + -16, 166, -92, 68, 62, 45, -83, 51, 138, -12, + -3, -16, -76, -29, 14, -15, -56, 64, -5, -43, + 47, -24, 37, -32, -64, -45, -45, -7, -41, -27, + 35, -19, -21, 4, 35, 0, 15, 17, -25, -7, + 5, -3, -33, -14, -1, -5 + } + }, + { + { + 149, -799, -1116, -850, 425, -121, 79, 117, 115, -25, + 96, -306, -78, 187, -9, 217, -169, 17, -116, -378, + 96, -64, 169, 59, 257, -15, -217, 52, 124, -7, + 150, 119, -102, -40, 125, 57, 271, 131, 30, 70, + -125, -21, -146, -159, 16, -12, -154, 50, -22, -62, + 24, -18, 35, 55, -44, -19, 65, 31, 152, 45, + 13, 68, 21, -13, 2, -33, 34, 61, -14, 80, + 23, -11, 43, -47, -46, -22, 7, -18, 5, 2, + -23, -7, 37, -1, 15, 11, -19, 6, 17, 8, + 20, -5, -12, 2, -17, 11 + }, + { + 6, 639, -376, 765, -604, 61, 130, -83, 167, -137, + 150, -154, -169, 182, -234, 568, 338, -137, 42, 298, + 79, 278, -183, -381, -296, 288, 105, -50, -103, 144, + 79, -282, 173, -367, 46, 292, -1, -30, 67, 12, + 38, -156, -57, 96, -140, -144, -3, -7, -141, -91, + 2, -28, 8, -16, -76, -6, 46, -25, 23, -76, + 39, -38, -23, 104, 30, -6, 2, 10, -18, -2, + -28, 19, 37, 8, -11, 42, -6, 1, 11, 16, + -42, 46, 6, 21, 6, -2, -6, -33, -9, -8, + 21, 4, 8, -21, -13, -1 + }, + { + 73, 846, 415, 2023, -666, 65, -8, -45, -13, 81, + 85, 143, 16, 244, -61, -476, -53, -128, 144, -193, + 140, -561, 349, 193, 210, 333, -109, -51, 95, 299, + 26, 189, -111, -361, -69, 124, -24, 8, -51, -10, + 17, 138, 29, -81, -21, -136, 70, 26, -17, -4, + -93, 34, -22, 12, -22, 87, -76, 60, 63, 71, + -64, -45, -97, 65, -51, 7, 16, 39, -10, -97, + -21, 2, -8, 18, -1, -12, 21, -8, -17, 6, + -7, -17, 1, 20, 3, -2, -8, -13, 16, 4, + -9, 31, -9, -15, 0, -28 + }, + { + 807, -1915, -126, -251, -290, -8, -57, 24, 91, 55, + 421, -223, 126, 71, 448, 51, -109, -208, -68, -32, + 102, -166, 265, 36, -162, 125, -157, -113, -81, -48, + 20, -21, -17, -1, 133, 85, 94, -21, -103, 8, + 73, -21, 59, -198, 83, 214, -96, -111, 6, -118, + -18, 43, 38, -99, -83, 40, 10, -58, 9, 6, + 3, 29, -21, 74, 10, -31, 26, 8, 22, 67, + 62, -1, -17, -23, -22, -28, -23, 7, -7, -11, + -10, -5, 14, -11, -10, 24, -6, 1, -11, 9, + -17, 16, -6, -24, -6, 0 + }, + { + -99, -1241, 433, 139, -29, 0, 7, -74, 51, 66, + -50, 333, -238, -37, 161, 301, 501, 287, -465, -273, + 48, 283, 603, 221, -97, 584, 130, -140, 239, -276, + -5, 134, -76, 50, 351, 28, -70, -142, 22, 231, + 44, 127, 79, 27, 58, -72, 56, 44, 17, 36, + 98, -15, -16, -49, 19, 18, 56, -53, -82, -39, + 61, -77, 6, 22, -27, -60, -34, -16, -42, -2, + -3, -45, 27, 12, 23, 6, -3, -24, -2, -14, + 30, 12, 57, 13, 10, -20, -30, -8, 12, -9, + 26, 32, 13, 0, 4, -16 + }, + { + 1287, -4077, -193, 2497, 105, -90, 284, -7, 351, 283, + -162, -40, 40, -1, -224, -127, 45, -183, 143, -280, + -184, -80, 126, -52, -54, -101, 164, 84, 139, -100, + -69, -13, -221, 17, -147, -102, -149, 39, -121, -51, + 32, 9, -13, 237, 42, 22, -44, -98, -103, 46, + -4, 196, -105, 146, -43, -31, -91, -33, 0, 21, + 86, 51, -49, -38, -5, 38, -12, 30, 24, 83, + 1, -46, 16, 16, -6, 6, -14, -26, 2, -12, + 35, -4, 22, -4, -29, -9, -9, 0, 23, -19, + -36, -1, -6, 14, 1, -19 + }, + { + 7, -317, -626, -14, 71, -16, -7, 75, -84, -123, + 164, -140, -340, 352, -72, 429, -612, 491, 319, -899, + 72, -395, 379, 757, 559, -353, -580, 289, 260, 182, + 560, -91, 384, 232, 198, -276, 71, 105, -41, -270, + -139, 11, 3, 10, 29, 4, -17, 37, 80, -56, + -32, -64, 50, -14, 20, -7, -171, 15, -10, -26, + -13, -11, -78, -37, -58, -19, -27, 26, -62, 25, + 25, -11, 17, 42, -5, 9, -7, -22, -8, -41, + 35, -12, -4, -24, 11, -8, -9, 18, 18, 16, + 1, 8, 3, 16, 1, -5 + }, + { + -329, 8050, 519, -2149, 421, 123, 233, -213, -113, -156, + -19, 302, -36, -35, -145, 213, 102, 174, 361, -111, + -56, -219, 1, -95, 34, 95, 142, 299, 163, -191, + 7, 50, 236, -153, 118, 84, -4, -31, -144, -175, + 7, -87, -92, -49, -16, 15, 54, 100, 76, -13, + 47, 43, 208, -28, 34, 42, 53, -11, -13, -122, + 97, -23, -44, -50, -18, -28, -19, 4, -40, -30, + 22, 1, 0, 20, 0, 55, 16, 16, 25, 13, + -16, 13, 1, -28, 25, 11, -11, -7, 20, -5, + -28, -21, 18, -22, -24, 27 + }, + { + 0, -174, -310, -40, 6, -24, 34, 78, -23, -54, + 24, -51, 95, 70, 369, -168, -73, 604, 327, 106, + 215, -176, 140, -41, -219, 236, 642, -104, -39, 111, + -86, 120, -32, 15, -232, -158, -265, 1, 19, -74, + -149, 16, 45, -163, -49, -40, 121, 169, 10, -31, + -52, 96, -55, 53, 24, -7, 54, 44, -100, -25, + -3, 8, 63, 44, 14, 7, 48, 16, 28, -6, + 48, -1, -40, 33, 37, -15, 6, 5, -15, 21, + -22, 55, -20, 2, -13, 2, -7, -26, 10, -23, + -15, -10, 7, -12, -2, -7 + }, + { + -703, -6149, -130, 172, 231, -298, 312, 96, -226, -26, + 190, -104, 155, 250, 139, 254, 34, -189, -111, 100, + -277, -61, -177, 113, 95, 54, 88, -76, 88, 58, + 177, -187, -189, -32, 72, -36, 30, 153, 136, 7, + -140, -65, -29, -108, 81, 22, -153, -16, -35, -140, + -133, 9, -81, 36, -40, -18, -42, -118, 81, 0, + -93, -4, -50, -24, 53, -5, -7, -50, 10, 69, + -32, 16, -32, 36, -12, -16, 5, -10, 21, 7, + 30, 27, -41, -35, -16, -13, -28, 6, -29, -10, + -3, 9, -19, -2, 9, 11 + }, + { + -102, 534, 41, 663, -54, 33, 293, -143, -97, -117, + 0, 459, 110, -63, -511, -156, 379, -86, 396, 193, + 525, -197, -5, -147, -196, 439, -90, 117, -122, 156, + 7, -126, -262, 89, 79, -19, 41, 75, 88, 138, + 44, 228, -67, 135, -64, 94, -14, -54, 3, -165, + 38, 40, 62, -76, 44, -40, -78, -14, 15, -56, + -42, -49, -8, -43, -1, -42, -21, -18, -32, 2, + 59, 63, 38, -7, -29, 33, -28, -17, -32, 2, + 4, -7, 21, 2, 9, -38, -8, 32, 16, 34, + 5, 17, 8, 8, -23, -5 + }, + { + -1797, 8580, 337, -179, -780, 1399, 1062, -200, 126, -236, + 77, 110, 120, 84, -332, 10, -101, 184, 33, 11, + 552, -92, 75, -88, -133, -184, 333, -115, -83, -188, + 8, 30, 5, 233, 24, 225, -123, 159, 206, -64, + -91, 53, 17, 149, 43, 99, -56, 172, 66, 71, + -36, 25, 2, -162, 23, 30, -54, 30, 65, 82, + -80, 87, 24, -59, -1, -5, -23, 10, -12, -33, + 26, -18, 25, 11, -2, -13, -39, -13, -5, 4, + 17, -28, 24, 1, 19, 0, -10, -6, -11, -23, + 14, -10, 5, 10, 2, 4 + }, + { + -40, -2012, 433, 254, -25, -207, -99, 97, 188, -50, + 205, -143, -81, -319, -399, 18, 252, 182, 75, -156, + 813, 76, -292, -291, -879, 575, -486, -407, -314, -160, + -69, 199, -141, -182, 7, 159, -243, -62, 110, 36, + -94, -166, -155, -133, -5, -34, -126, 8, -46, -65, + 3, 66, -30, 92, 17, -28, -22, -16, -45, 153, + -94, 7, -64, 41, 10, -4, 3, 150, 24, 59, + 15, 40, 8, -21, -30, -39, 23, -9, 22, 16, + -6, 32, -13, -19, -23, -56, -5, 26, 1, -6, + -18, 16, 2, 17, 29, -14 + }, + { + -1608, -1551, -8, -127, -254, 528, 54, 94, -265, -146, + -179, -33, 222, 230, -969, 140, 103, -12, -123, -187, + -53, -184, -125, -226, -42, -195, 244, -163, 149, 224, + 167, -230, 26, -78, 42, -273, -11, 154, -44, 10, + 44, 57, -164, -31, -110, 147, 139, 89, 158, -28, + 95, -1, 65, 64, 38, 106, -95, 18, -14, 87, + 11, -1, 12, -58, 16, 46, 7, -41, 33, -51, + 58, -6, 18, 28, 56, 16, -4, -2, 23, 34, + 1, 10, -12, -16, 21, -5, -7, -35, 7, 21, + 12, 9, -6, 27, 11, 7 + }, + { + -98, -2090, 88, -121, -51, -2, 38, 172, -74, 250, + 69, 207, 312, -226, 1234, -318, -67, -257, -85, -121, + 192, 27, 199, -350, -252, 254, 186, -250, 307, 391, + 232, 136, 184, -88, 245, 66, 46, -110, -37, -21, + 274, -198, -56, -24, 45, -39, -10, -68, -77, 45, + 45, -9, -45, 56, 104, 60, -87, 1, 50, -19, + 23, -40, -46, -39, -28, 14, -9, 41, -46, 1, + -20, 34, -34, -56, -70, -27, -11, -28, -40, -29, + 29, -10, 6, 38, 6, 4, 1, 16, 2, -2, + -3, -9, -19, -19, 6, -15 + } + }, + { + { + -314, 922, 1683, -1523, -16, 21, -28, 52, 451, -13, + -309, -351, 10, -185, -322, 123, -146, 12, -10, -425, + 172, 40, 201, -98, 117, 71, -129, 119, 251, 19, + -53, 121, -41, -53, 167, -60, 82, 21, -100, 47, + -9, 52, -56, -24, 34, -60, -44, 125, 7, 48, + 31, -110, -50, 13, -100, -88, -20, -18, 101, 4, + -15, -8, -4, 27, -1, -34, -21, 16, -52, 46, + 10, -13, 63, -18, -17, 9, 34, -24, 3, -7, + -4, -10, 24, 5, 4, 9, -5, 12, 1, -5, + 11, 11, -10, -1, -18, 2 + }, + { + 63, 1003, 5, 1057, -573, -44, 41, -79, 224, -94, + 110, -147, -226, 46, -455, 245, -119, -302, -248, 368, + -63, 85, -22, -35, -305, 204, 40, -30, -19, 101, + 49, -157, 388, -332, -112, 167, -27, -58, 144, 54, + 58, -9, 23, 160, -157, -197, 27, -40, -95, -24, + 75, 72, 82, -17, -55, 1, 29, 0, 22, -33, + 12, -47, 19, 69, 5, 10, 11, -16, -23, -1, + -60, -36, 22, 6, -28, -2, -39, -5, 9, 18, + -57, 30, -3, 7, 4, 4, 3, -38, 0, -18, + 17, 0, 2, 3, -2, 8 + }, + { + -33, 815, 99, 1323, -702, 282, 166, 91, -100, -84, + 49, 167, 89, 31, -81, 19, 266, 137, -149, -419, + 373, -181, 118, -99, -77, 170, -179, -76, -3, 240, + -191, -45, 33, -122, 28, 85, -28, -66, -63, 71, + 117, 232, 51, -48, 117, 40, 119, 45, 22, -28, + -45, 45, -41, 81, -2, 1, -112, 32, -1, 89, + -15, 16, -26, 109, -41, -38, -20, 15, -20, -61, + 35, 44, 11, 29, -2, -11, 22, 16, -1, 19, + -21, -11, -13, -7, 1, 5, -15, -6, 19, -10, + -7, 32, -3, -6, 6, -25 + }, + { + 286, -1500, 290, 131, 573, -22, -75, 160, 149, 27, + 178, -483, 432, 270, 333, -94, -222, -308, 32, 77, + 102, -198, 119, 69, -142, -23, -4, -50, -67, -6, + 172, 111, 56, -77, 132, 154, 173, 5, 26, -7, + 21, -1, -77, -189, 125, 90, -151, -82, 139, -28, + -19, 12, 33, -57, 8, 65, -16, -71, -11, 3, + -50, -24, -50, 105, 9, -11, 19, 24, 29, 47, + 8, -12, 35, 22, -16, -12, -9, -20, 4, 29, + 6, -5, 3, -11, -12, 8, -14, -10, -14, 24, + -22, -8, -14, -10, -9, -11 + }, + { + 41, -1701, 8, 113, -77, 17, -70, -171, 39, -11, + -75, 236, -494, -47, 251, -108, -385, 634, -395, -460, + -227, -176, -11, 60, -62, 607, -59, -262, -68, -207, + -148, -190, -197, 22, 90, -338, -272, -26, -58, 58, + -22, 55, 6, -58, -66, -114, -41, -25, 8, 16, + 87, -35, -3, -85, -18, -5, 53, 0, -64, -10, + 42, -94, 7, -6, 38, -34, -39, -27, -64, 12, + 17, 17, 34, 13, 12, 3, -25, -13, 5, -16, + 19, -23, 19, 4, 12, 1, -24, -2, 6, -13, + 34, 24, 8, 10, 11, 12 + }, + { + 161, -5303, 418, 2381, -390, -176, -6, -553, 46, 271, + -156, -105, 21, -216, -303, 45, 253, -65, 101, -104, + 135, 179, 138, -166, -147, -100, 165, -73, 32, 82, + 136, 65, -214, 80, 25, 15, -133, -57, 18, 89, + -122, -73, -26, 125, -9, 38, 75, 53, 44, 127, + -194, 27, -120, 143, -118, 43, -60, -13, 22, 14, + 17, 9, -16, -3, 27, 59, -14, 4, 1, 35, + -8, -19, -26, 29, -4, 18, -1, -18, 20, -17, + 6, -24, 14, 18, -6, 7, -7, 3, 14, 5, + -16, 3, -3, 9, 10, -2 + }, + { + 10, 454, -72, -58, -6, 3, -11, 21, -143, -123, + 131, -109, -195, 212, -37, 749, -656, 117, -60, -836, + 476, 52, 886, 320, -395, -753, -301, 276, -32, -85, + 323, -266, 130, -41, 201, -55, 9, -95, -111, -101, + -31, -93, -73, 61, 75, 83, 18, -60, -25, -55, + 61, -32, 38, -14, -2, 86, -40, 63, 45, 23, + 6, -9, -2, 55, -62, -54, 8, 123, -50, -39, + -30, -20, 25, 0, -6, 21, 9, 0, 3, -33, + 24, -28, -1, -13, 19, 4, -1, 18, 5, -8, + 11, 13, 1, 7, -13, -5 + }, + { + -815, 6024, 6, -2495, -236, -114, 31, -167, -31, -126, + -198, 316, 248, -223, -107, 87, -53, -144, 257, 52, + 38, -106, -38, -197, -182, -4, 38, 113, 112, -144, + -149, -120, 172, -155, 169, -69, -87, -43, -176, -151, + -29, 13, -54, -105, 5, -39, -66, -105, 20, -4, + 29, -103, 46, -49, 44, 44, -20, -95, -5, -87, + 74, 4, 18, -13, 5, -21, -22, -7, -8, 28, + 34, -5, -1, 12, -24, 12, 0, 3, 19, 5, + -29, 0, -5, -14, 22, 0, 25, 13, -10, -13, + -22, -8, 20, -9, -6, 16 + }, + { + 45, 166, -97, 135, 55, 4, -36, 78, 72, -66, + -63, 24, 55, 59, -158, 190, -315, -306, -9, -238, + -179, -114, -213, -557, -146, -300, -134, -227, 85, -95, + -331, 19, 5, 60, -61, 179, 89, 191, 21, -9, + -69, 131, 143, -91, -8, -53, 96, 12, -18, 17, + -81, 73, -35, 31, 34, 66, 20, 15, -5, 66, + 29, -30, 30, -32, -25, -19, 2, -33, -15, -30, + 29, -16, 14, 83, 21, -23, -18, -14, 0, 41, + -24, 35, -32, -1, -9, 3, 9, -21, 8, -1, + 3, -16, 3, -9, 6, -5 + }, + { + 722, -5892, -1281, 60, 16, -682, -484, -144, -362, -21, + 172, -45, -77, -201, 91, 195, -161, -214, 53, -334, + -472, 58, -25, -85, -16, -58, 148, 67, 130, -23, + 236, 0, -43, 140, 77, -166, 88, 59, 32, 191, + -75, 7, 190, -80, 71, 148, -100, -5, -39, -59, + -193, 18, 62, 144, -81, 11, 79, -37, 152, -15, + -109, 25, -22, -57, 8, -38, 9, 6, 22, 73, + -37, 28, -2, 8, -30, -34, 18, -4, 9, -44, + -25, 14, -38, -31, -27, 3, -36, -10, -5, 21, + 12, 9, -7, 17, 15, 1 + }, + { + 79, 591, 47, 522, -178, -68, 171, -160, 126, -76, + 68, 114, 31, 92, -378, -384, -59, -149, 724, 265, + 554, -269, -26, 155, 7, 292, -250, -110, -255, -51, + -26, -173, -202, 167, 70, -115, 51, 21, -126, 15, + -91, 64, -159, 155, -89, 19, 37, 81, 71, -107, + 157, 24, 11, -47, 106, 30, 23, 36, -19, -94, + -44, -40, 55, -16, -2, -62, -17, 4, -39, -23, + 1, 6, -15, 0, -15, 33, -22, 0, -2, -11, + -22, -22, -16, -18, 19, 13, 0, 13, -12, 33, + -3, 3, 2, 13, -12, -4 + }, + { + -299, 10690, 187, 224, -737, -32, 82, -15, 428, 190, + 135, 155, 12, 140, 182, 254, -231, 51, -5, -353, + 296, -88, 132, -7, 151, -100, 179, -306, 26, 31, + 226, 68, -129, 299, 69, 185, -202, 50, 170, -201, + 64, 70, -69, 136, 115, 79, -152, 49, 42, 11, + -143, -23, 2, -202, -38, -85, -70, 10, 6, 103, + -44, 75, 14, -25, -45, -22, 1, 9, 32, -4, + 5, -7, 10, -7, 12, 14, -19, 10, -15, -22, + 10, -16, 2, -25, 12, -24, -4, -1, -13, 1, + 25, -2, -2, 0, -2, 9 + }, + { + -15, -1998, 437, -58, -82, -72, -79, -8, 91, -43, + 165, -153, -85, -538, -651, -611, -63, -155, -164, 14, + 260, -454, -276, 598, 160, 666, -431, 271, 69, 233, + 126, 203, -48, -172, -80, 152, -95, 66, 82, -140, + -93, -106, 77, 95, 77, 6, -78, 91, 5, -5, + 30, 83, -56, -25, -17, 40, -17, -43, -22, 185, + -43, 90, -11, 29, -23, -12, -88, 84, -10, 36, + -32, -3, 9, 21, 8, -20, 11, -10, 17, -6, + -33, 38, -4, 6, 10, -27, 12, 11, -1, 14, + -5, 11, -22, -8, 21, -16 + }, + { + 1299, 2323, -263, -1073, -923, 37, -159, 340, 89, 18, + -6, -35, 60, 708, -400, -102, -274, 30, -30, -269, + 261, 96, -111, -169, -55, -349, 109, -248, 70, 200, + 230, -73, 248, 71, 96, -264, -141, -69, -115, 136, + -13, 201, 25, -171, -200, 124, -16, -96, 89, -107, + -101, -70, 98, -22, -35, 10, -100, 37, -19, 61, + -36, -6, 32, -29, 74, 58, 22, -47, 8, -36, + 73, -32, 40, 22, 26, 7, 6, -30, 8, 49, + 17, 7, 0, -12, 3, -1, 8, -30, 27, 23, + -1, -2, -1, 4, -16, 1 + }, + { + 41, -2316, -197, 14, 1, -118, -2, 176, -101, 88, + -167, -190, -137, -260, 1348, -577, -95, -161, -343, -536, + -478, -526, -24, -32, -257, 70, 65, 203, 379, 123, + 55, -18, 305, -53, 76, -32, -55, -179, 63, -111, + 86, -100, 39, 46, 44, -115, 74, 1, -22, 25, + -23, -38, -11, 23, -32, -41, -44, -74, -31, 56, + 60, -24, 14, 25, 16, 94, 16, 16, -99, -36, + -38, 39, -20, -11, -8, -7, 13, 13, -35, -26, + 15, -13, -17, 8, -27, 0, -4, -6, 3, 1, + -15, -6, 9, -3, 17, -9 + } + }, + { + { + 572, -470, 1029, -908, -349, -42, 16, 71, 160, 290, + -403, -108, -283, -10, -511, -156, 190, 17, -110, -148, + 59, 337, -79, -5, 81, -41, 34, 14, 301, -12, + -3, -173, 117, -14, 32, 166, -141, 186, -70, -175, + 16, -10, -65, 53, 42, -76, 33, -25, 13, 128, + 34, -95, -39, 4, -86, -85, -89, -33, 77, 17, + 25, -44, -22, 37, 63, -27, -36, 18, -61, 4, + -3, 6, 20, 37, -13, 7, 17, -5, -18, 13, + 33, -16, 4, 6, -1, 1, 10, 6, 13, 5, + 6, 9, -5, -8, -12, 1 + }, + { + -126, 1581, -93, -161, 403, -9, 59, 105, -16, -388, + 276, -31, -146, -102, -185, -115, -468, 182, -382, 382, + -221, -58, -17, 139, -355, 36, -49, 379, 11, -3, + -33, 117, -25, 123, -188, 53, 215, -71, -63, 113, + -8, 58, 44, 77, -140, -177, 84, -114, 38, -41, + 42, 77, 153, -35, -42, -33, -16, 20, 19, -17, + 6, -56, 82, -25, 0, 15, 16, -11, -28, 25, + -77, -50, 3, 3, -33, 12, -40, -2, 9, -18, + -21, 2, 14, -21, 15, 10, -11, -28, 1, 1, + 5, 0, -7, 28, -3, -4 + }, + { + -93, 1961, -1176, -842, 1367, 176, 152, 100, 19, -135, + 194, -171, 238, -346, -203, 524, -150, 263, -302, -34, + 144, 1, -107, -3, -87, 41, 18, -200, -80, 71, + 4, -177, 150, -143, -29, -89, 105, -75, 11, 114, + 131, 72, -30, 98, 83, 111, 100, 54, 8, -38, + 30, -25, -9, 87, -25, -24, -76, -2, -48, 8, + 18, 98, -1, 94, -15, -104, 10, 30, -79, 34, + -1, 46, 7, 5, 3, 27, -23, 29, 16, -2, + -10, -6, -10, -14, -19, 16, -8, 7, -8, -9, + 15, -8, 12, 2, -7, -15 + }, + { + -1342, 1109, 690, 704, -399, -45, 33, 40, 193, 49, + -26, -379, 263, 359, 22, 54, -53, -381, 90, -8, + 7, -78, 181, 6, -154, 58, -10, -221, 77, -132, + 339, -12, 1, 65, 53, 209, 191, -69, 87, 57, + -86, -64, -134, -49, 42, 93, -89, -31, 98, -12, + 19, -114, -2, 60, 26, 30, -15, 5, -57, 17, + -52, 21, -38, 56, 9, 46, -8, 12, 10, 20, + 5, 15, 1, 32, -13, 17, -22, -29, 17, 15, + 7, 12, 4, -13, -9, 0, -10, -18, -14, 15, + -8, -4, -25, 3, -6, -9 + }, + { + 5, -2004, 55, 20, 35, -38, 9, -90, 12, -164, + 115, 175, -352, 255, 0, 74, -677, -58, -636, 56, + -587, -331, -76, 301, -285, 499, -262, 202, -278, 21, + -247, -511, -119, -115, -157, 0, -249, -70, 33, -23, + -40, 77, -22, -10, -128, -87, 35, -50, -29, -5, + 62, 1, -37, -70, 28, -59, 54, 39, -53, -35, + 20, -43, -8, -25, 78, -30, 4, -54, -55, 20, + -5, 57, -21, 19, -9, 1, -14, -8, 18, 22, + -15, -4, -20, 18, 8, -13, 15, -5, -17, 11, + 17, 37, -6, 13, 10, 26 + }, + { + -1501, -1873, -936, 2018, 252, -153, -149, -456, -74, -94, + 195, -108, -246, -221, -166, 213, 159, 95, -50, -21, + 334, -49, 72, -100, -162, -63, 61, -111, -48, 116, + 209, 9, -33, -135, 73, 96, -108, -37, 87, -51, + -138, -6, 62, 5, 37, -73, 51, 117, 94, 17, + -101, -33, -102, 35, 56, -24, -12, 10, -15, 32, + -22, -41, 17, 47, 28, -18, 0, 18, 34, 7, + 22, -21, -34, 28, -24, 14, 20, 15, -5, -17, + 5, -29, -7, 23, 6, -1, 8, 0, -3, 19, + -12, -3, -6, 5, 13, 2 + }, + { + 20, 674, -2, -93, -57, -29, 13, 12, -105, 13, + -134, -77, 26, -214, 160, -157, -82, 102, -106, -472, + 176, 63, 558, 350, -587, -297, -416, 78, 99, 1, + 210, -171, 52, -99, -58, 307, -154, -86, -186, 15, + 54, -167, -61, 109, 33, 117, 9, -67, -26, -26, + 11, 1, 21, 40, 34, 3, 74, 3, 30, 61, + -25, 5, -13, 30, -46, -8, 30, 54, 17, -36, + -69, -16, 34, 6, 11, 16, 3, 18, -20, 37, + -25, -22, 0, 8, 5, 8, 9, 4, 2, -18, + 0, 6, 12, 4, -15, -5 + }, + { + 1351, 905, 798, -2036, -75, -156, -13, -46, -30, -25, + -120, -90, 312, -69, -261, 142, -197, -46, -117, 64, + -41, 140, -308, 42, -406, 127, 58, -134, 121, 13, + -90, -132, -14, -67, -29, -108, -161, 14, -168, -187, + -60, 70, 39, -137, 36, -109, 27, -289, 51, 61, + 31, -101, -77, -1, 58, 59, 17, -106, -17, -23, + -35, 38, 61, 15, -15, -19, 10, -6, -32, 82, + 16, 2, 20, 6, -10, -35, 21, 34, -10, -6, + -11, -3, -8, 1, 5, -1, 39, 8, -28, 1, + -12, -4, 7, 6, 0, 1 + }, + { + 8, 309, 153, 73, -41, 35, -76, 77, 58, -61, + -199, 272, -132, 329, -245, 184, -259, -469, -173, -260, + -100, 159, -620, -322, -76, 3, -270, -40, 2, -280, + -174, -25, -78, 73, -65, 23, 134, 191, -75, -75, + -2, 276, 84, -86, -13, 87, 76, -108, 26, 12, + 25, 9, 3, 41, 16, 46, -22, 47, 47, 34, + -18, -8, 32, -11, -54, -21, 1, -33, -40, -41, + 22, -48, 71, 47, 24, 12, -44, -17, 34, 22, + 10, -5, -28, -1, -5, -3, 8, 6, -21, 23, + 2, -20, -11, -13, 23, 14 + }, + { + -659, -6836, 1029, -295, 179, 140, -1599, 119, -232, 259, + -263, 111, -10, 44, -37, -117, -48, -214, 140, -360, + -256, -102, 27, -140, -58, 11, 264, -128, 196, -122, + 256, -105, 156, 152, 92, -15, 60, 3, 100, -17, + 23, 116, 153, -73, -30, 192, -84, 66, -88, -12, + -52, -92, 141, 144, -129, 30, 88, 81, 38, 17, + -85, -50, 84, -116, -22, -10, 5, -25, 16, 67, + 15, 1, 11, 3, 5, -41, 15, -1, 0, -29, + -33, -18, -28, -5, -14, -13, -6, -11, 0, 24, + 11, -3, 0, 17, 11, 9 + }, + { + -53, -108, 903, -107, 169, 85, -64, -257, 223, -128, + 219, -160, 193, -126, -97, -355, -578, 83, 405, 623, + 277, -287, 160, 36, 299, -340, 240, -180, -236, -257, + 28, -172, -102, 151, -40, 59, -96, 18, -128, 6, + -184, -33, 58, 21, -12, -10, -1, 43, 84, -51, + 133, 22, 17, -8, 48, -28, 75, 67, -47, -58, + -1, -58, 52, -71, 9, -35, -27, 20, -25, 0, + -11, -26, -7, 8, -23, -4, -1, -9, 3, 6, + -50, -15, -8, -17, 12, 10, -1, -8, -7, 10, + 10, 20, -6, -2, 12, -6 + }, + { + 2088, 7804, -616, 183, -590, 64, -147, 59, 342, 487, + 82, 25, -58, -174, 623, 34, 129, -39, -148, 274, + -240, 37, 75, 192, 66, 55, -53, -206, 7, 54, + 229, 38, -51, 47, 309, 178, -248, -14, -31, -27, + -6, 127, 60, 149, 182, -78, 8, -54, 75, -101, + -79, -134, 111, -184, -40, -105, 21, -45, -19, 47, + 82, 44, 35, -11, -13, -79, 12, -4, 36, 23, + -17, 8, 16, -30, 5, 40, -11, -11, -5, -34, + 0, 7, -23, 0, 11, -24, 7, -1, 0, 1, + 7, 25, 0, -7, -7, 22 + }, + { + 42, -1547, 114, -529, 76, -20, -2, -297, 142, 124, + -86, -72, 91, -701, -591, -71, -579, -162, 14, -72, + -190, -187, -45, 586, 407, 115, -34, 281, 133, 190, + 379, -10, 112, -147, -56, -53, 27, 50, 95, -146, + 15, -146, 58, 208, 33, 52, -83, -31, 141, -4, + 85, 18, 31, -112, 4, 36, 51, -43, 9, 95, + -1, 68, 78, -67, -17, -9, -50, 38, 16, -28, + 27, -32, 29, 25, 31, -2, -15, 34, -14, -8, + -13, 15, -15, -23, 32, -15, 12, -3, 1, 10, + 2, 2, -2, -7, -14, 2 + }, + { + -382, 4254, 236, -1329, -301, -86, -424, 283, 101, 310, + -338, -3, 179, -269, 1098, -183, -360, -141, -202, 102, + 164, -37, 101, -124, -222, -47, -176, -90, 8, 184, + -10, 115, 245, 118, 33, -39, -161, -225, -130, 186, + -139, 223, 103, -114, -142, 24, -106, -8, 7, -48, + -139, -32, 75, -63, -37, 5, -41, -22, -12, 3, + 27, -56, 34, -3, 53, 15, 21, -15, 11, -24, + 21, 7, 59, -14, 23, -9, 13, -41, 16, 29, + 31, -7, -14, 3, -17, -8, -6, 15, 22, 13, + -5, -24, 12, -9, -16, 2 + }, + { + -41, -2389, -6, 183, -183, -82, 137, -79, 154, -64, + -277, -121, -209, 852, -763, -218, 39, -131, -434, -238, + -425, -718, 55, 73, -275, 15, 20, 357, 277, -137, + 142, 41, 188, 34, 98, -36, -208, -35, 56, -45, + -160, 141, 42, 35, -101, -81, 131, -55, 39, 8, + -2, 9, -55, 59, -66, -67, -7, -83, -22, 44, + 103, 22, 34, -10, 22, 88, 13, -21, -41, -20, + -29, -18, 18, -1, 25, -16, 10, 10, -11, -28, + 4, -12, -37, -1, -8, -11, 1, -1, -7, -16, + -16, 2, 18, 1, 8, 10 + } + }, + { + { + -699, -5492, -3071, -202, 334, -12, -40, 40, -17, 338, + -175, 184, -328, -192, -575, -65, 509, 213, 282, 435, + 129, 204, -51, -42, 74, 106, -27, -176, 30, -177, + -5, -25, 354, 41, -86, 48, -274, 169, -153, -317, + -180, 43, -55, -112, -3, -101, -61, -153, -55, 25, + -48, -110, 88, 118, -30, 16, -7, 12, 45, -10, + 83, 6, -6, 27, 88, 19, -24, -6, -25, 42, + -7, -42, -39, 46, 25, -3, 8, 12, -9, 21, + 24, -19, -14, -2, -14, -14, 12, -1, 23, 15, + 3, 2, 3, -3, -3, 17 + }, + { + 78, 1066, -737, -750, 115, 2, 84, 14, -214, -382, + 329, -41, -178, -39, 49, 393, -89, 177, -273, 170, + -158, -309, -160, 88, -505, 48, -151, 403, 85, -73, + 81, 311, 30, 242, -78, 164, 207, -171, -211, 88, + 31, 63, 47, 6, -90, -1, 142, -99, 34, -66, + -1, -41, 93, -31, 1, -44, -63, 1, 34, 33, + 53, -53, 38, -69, -11, -70, -112, -41, 0, 34, + -43, -12, 6, 6, -42, 27, 14, 20, -24, -27, + -3, -8, -1, -30, -14, -9, -23, -21, -3, 4, + 5, 1, -9, 24, 3, 2 + }, + { + 246, 4193, -171, -2799, 156, 190, 53, 123, 310, -223, + -749, -727, 165, -651, -252, 361, -504, 50, -184, 41, + -185, -265, -148, -17, 322, -74, -173, -197, -192, -76, + 36, -306, 101, 50, 63, -134, 65, -29, 17, 144, + 64, -192, -3, 176, -1, -62, -4, 30, 11, 5, + 120, 36, -58, -58, -92, 45, -50, -65, -125, -41, + -3, 96, 31, 74, -17, -76, 12, 60, -53, 27, + -9, -20, -49, -17, 7, 24, -56, -8, 20, 9, + 8, 14, 5, -1, -21, 10, -5, 13, -6, -14, + 8, -25, -2, -8, -7, -8 + }, + { + 1854, 5356, -159, 927, 474, -123, 55, -136, -37, 2, + 131, -363, -289, 33, 142, 153, 198, -278, -38, -76, + -65, 44, 283, 76, -132, 130, -127, -245, 165, -124, + 125, -198, -175, 26, -6, 62, 93, -80, 26, -35, + -41, -34, -96, 23, -10, 22, -5, 96, 48, -72, + 26, -22, 27, 90, 1, -26, -11, 47, 4, 56, + -39, 38, 0, 2, -25, 63, 6, -14, -39, -9, + -3, 9, -24, 25, 1, 7, -25, 3, 31, -5, + -26, -5, 6, -10, 0, 2, -5, -5, -13, 4, + -9, 2, -20, 15, 11, -2 + }, + { + -46, -2345, -251, -105, -30, -75, 5, -96, 74, 41, + 246, 313, -8, 181, -160, 637, -542, -1352, -833, 409, + -645, -84, 5, 287, -16, 386, -227, 355, -126, 167, + -78, -537, -247, -191, -203, 121, -68, 1, 185, 117, + 6, -33, -67, 66, -8, 14, 32, -165, -102, 27, + 100, 30, -34, 6, 60, -61, 24, -26, -59, -36, + 56, 14, 11, 2, 51, -24, 37, -10, -24, -1, + -24, 13, -36, -6, -34, -11, -5, -5, 28, 11, + -31, 19, -15, 5, 9, -23, 32, 14, -5, 12, + -8, 26, -11, 5, -4, -3 + }, + { + 2020, 4821, 521, 1188, -586, -43, 15, -238, -307, -723, + -225, -212, -182, 8, -37, 353, 204, 25, -59, -186, + 61, -19, 56, -222, -173, -152, -36, 3, -38, -73, + 23, 56, 225, 16, 19, 48, -57, -8, 184, 86, + -51, 49, 59, -59, -8, -25, 57, 62, 90, 4, + -51, -55, -129, -93, 94, -6, -3, -40, -63, 30, + 17, -29, 68, 112, 6, -48, 2, 14, 77, 28, + 28, 42, 16, -6, -1, 12, -18, -1, 9, 20, + 27, -18, -15, -4, 3, -7, -12, -17, -16, -4, + -7, -3, 1, 14, 5, -3 + }, + { + -30, 543, 148, 78, -1, -75, -9, 90, 30, 9, + -214, -40, 116, -316, -83, -150, 446, 205, 164, -370, + -94, -335, -412, 198, -172, 246, -351, -113, 80, 113, + 88, -419, 50, -117, -54, 216, -310, -83, -143, -16, + 9, -36, 53, 85, -108, 17, -7, -42, -53, 16, + 91, 46, -9, 35, 101, 6, 108, 9, -58, -15, + -16, 47, -30, 1, -49, 18, 10, 6, 26, 12, + -30, -18, 33, 43, 13, 2, -17, 12, -2, 57, + -44, -34, 23, 28, 11, 13, 19, 1, 6, 8, + -5, -14, -4, 5, -13, -8 + }, + { + -1188, -6090, -1916, -1319, 453, -46, 389, 383, 333, 151, + -62, -207, 169, -280, -588, -1, -353, 76, -406, -84, + -221, -165, -430, -61, -477, 69, -8, -236, 9, 32, + 187, -26, -160, -296, -192, -283, -387, -19, -156, -175, + -18, -10, 57, -2, 97, 0, 113, -194, 120, 47, + -31, -58, -89, -53, 3, 63, 56, -25, 90, 43, + 4, 33, 33, 34, 23, 34, 21, 28, 24, 68, + -13, 15, -2, -11, 32, 0, 2, 14, -1, 4, + -5, -12, -28, -5, 23, -4, -2, 5, -8, 13, + 5, -3, -2, 10, -1, -12 + }, + { + -44, -188, -79, 5, -102, 79, -35, -71, -111, 102, + 71, 463, -189, -91, -431, 211, 728, 249, 161, 156, + -6, 233, -302, 46, 123, 784, 301, -96, -222, -169, + -232, -132, -27, -218, -140, -39, -119, -30, -69, -53, + -70, 211, -48, -77, 0, 66, 89, -9, 68, 80, + 104, 0, 23, 80, -37, 10, -32, -27, -39, 29, + 14, -6, 33, 52, -5, -15, -5, 10, 5, -31, + 57, 2, 68, 28, 2, 9, -14, -2, 33, 11, + 16, -12, -21, 5, -10, -6, 12, 16, -29, 8, + -7, -17, -21, -13, 17, 7 + }, + { + 569, -8188, -819, 590, 692, -533, -1576, 305, 349, 410, + -355, 409, 433, 108, -93, -41, -228, -128, 241, -110, + -209, -110, 113, -249, -409, -20, 258, -136, 208, -168, + 301, -88, 30, 91, 208, 259, 305, 108, 49, -203, + -6, 198, 93, -39, 103, 174, -125, -21, -133, 104, + 132, -141, 33, 74, -154, -11, 19, 51, 3, 48, + -75, -94, 77, -86, -82, -63, 37, -44, -9, 56, + 7, 8, 21, 8, 26, 8, 12, 1, 34, 13, + 9, -13, -18, 22, 16, 8, 7, -15, 0, 11, + -5, 10, 6, 4, 9, 22 + }, + { + 28, -1201, -641, -507, 365, -128, -332, -258, 179, -183, + 182, -86, -31, -127, 18, -309, -237, -18, -186, 350, + 139, -376, 283, -269, -14, -535, 87, -65, 71, -52, + 10, -39, -96, -80, -101, 154, -110, -29, -182, 49, + -32, 19, 79, -47, -29, -22, -53, -63, 6, -79, + 41, -10, 1, -1, -5, -90, 17, 25, -46, -20, + 51, -61, -19, -117, -46, -8, 12, 32, -5, 35, + 27, -4, 4, 2, -26, -11, 16, -14, -28, 12, + -20, 4, 18, -1, 7, -3, 9, -5, -4, 2, + 0, 14, -1, -1, 5, -11 + }, + { + -2732, 1430, -605, -300, -726, 260, 110, 30, 3, 591, + 450, 46, 201, 124, 779, 85, 534, 210, -307, 191, + -268, 72, 41, 184, 106, 368, -109, -67, 28, -19, + 140, -175, 6, -23, 175, 175, -63, 81, -56, 105, + -55, 138, 283, 272, 67, -31, 153, -39, 73, -52, + -49, -74, 147, -103, 67, 19, -4, -58, 29, -8, + 104, 19, 21, 1, 46, -35, 35, -1, 20, 52, + 7, 5, 18, -24, -13, 30, 4, -2, 8, -20, + 10, 6, -9, 16, 23, -11, 2, -7, 9, 9, + 1, 19, 4, -10, -17, 23 + }, + { + -56, -1066, 204, -899, -130, -115, 188, -230, -161, -11, + -409, -197, 144, -285, -76, 318, -418, 99, 308, -271, + -225, 286, 363, 275, 263, 238, 272, 180, 145, -65, + 312, 37, 135, -115, -71, 2, -4, -96, 111, 82, + 43, -185, 21, 238, -56, -116, -117, -94, 104, 73, + 219, 13, 5, -146, -69, 4, 72, -28, 4, 33, + -37, 11, 17, -73, 29, 13, -1, 30, 12, -30, + 30, -20, 65, 24, 46, 2, -38, 10, -19, -8, + -17, -6, -31, -32, 22, -8, 12, -14, -15, -12, + -10, -4, 3, 3, -13, -4 + }, + { + -631, 4065, 481, -365, 840, 263, -392, 313, 242, 339, + -389, 98, 248, 72, 2090, -81, -342, 32, 30, 253, + 206, -279, 108, 0, -347, -76, -60, -112, -139, 32, + -249, 64, 220, 181, 120, 78, -1, -129, -78, 135, + -154, -11, -11, 77, -12, -29, -53, 133, 30, 16, + -28, -18, -82, -159, -17, 0, -45, 28, 64, 0, + 32, -33, 20, 18, 69, 4, -5, -12, 12, -33, + 21, 42, 24, -51, -10, -16, 5, -22, 6, -4, + -4, -12, 14, 4, -9, 2, -18, 14, 5, 7, + -1, -19, 2, -14, -14, -4 + }, + { + 49, -1683, 358, 163, 38, -50, 118, -70, 114, -55, + -140, 243, -189, 113, -1549, 265, 323, -96, -149, 104, + 53, -507, 135, 104, -190, 164, -111, 96, -32, -603, + 22, 191, 90, -163, -26, -80, -149, 16, 36, 31, + -115, 36, -102, -12, -133, -62, 113, -122, 55, 77, + 3, 17, -96, 12, -85, -37, 35, -14, 45, -8, + 33, 4, 14, -40, 23, 33, -53, -65, -10, 32, + 36, -28, -21, -27, 14, -8, 8, 26, 22, -13, + 18, -5, -20, 14, 20, 6, 31, 20, -12, -11, + -8, 1, 3, -7, -6, 9 + } + }, + { + { + 652, -5030, -4311, 809, -663, -4, 199, 78, -281, 299, + -75, -249, 244, -297, -457, 316, 43, 109, 512, 327, + 94, 227, 55, -104, 53, 88, 52, -117, -211, 27, + -166, 208, 288, 20, -178, 187, -246, 243, -363, -96, + -176, 25, -66, -111, 66, -115, -164, -131, -30, -86, + -54, -90, 96, 72, 86, 0, -14, 75, 34, -5, + 48, 47, -11, 8, 16, 54, 36, -59, 11, 23, + 9, -43, -46, 9, 51, 9, 6, -18, 14, 20, + -5, -18, -5, 16, -7, -13, -7, 5, 14, 18, + 15, -8, -3, 19, -13, 19 + }, + { + 37, -912, 787, -442, -255, -28, 17, -47, -283, -69, + 186, -54, -102, -223, -110, 427, 209, -85, 430, -302, + 114, -765, -23, 36, -251, -109, 41, -16, 344, 71, + -143, 310, 101, 153, 156, 64, 73, -88, -204, 168, + 79, -96, 46, -25, 43, 90, -20, 28, -13, -149, + 14, -18, -4, -24, 28, -20, 6, -71, 80, -11, + 29, 4, -42, -45, -22, -32, -103, -67, 29, -10, + -23, 14, 12, 8, -34, 10, 36, 0, -41, 19, + -13, 2, -20, 1, -39, -14, -16, -15, 5, 3, + 4, -1, -4, 5, 1, 7 + }, + { + -335, 5569, -215, -1945, -846, 166, 272, -55, 118, 38, + -1006, -268, -162, -606, -180, -167, 133, -556, -17, -26, + 91, -466, 104, -162, 367, -9, -124, -382, -23, -135, + -14, -138, 82, -140, 105, 92, -166, 68, -81, 104, + 218, -291, 183, -2, 69, -167, 43, 29, 56, -11, + 82, 44, -26, -82, -103, 33, -7, -83, -72, -40, + 6, -31, 99, 16, 4, -21, -10, 29, 38, -31, + 2, -37, -54, 1, 12, -19, -32, -26, 7, 18, + 33, -9, 27, 2, -6, -18, -4, 5, 18, -15, + -12, 0, -12, -8, -8, -5 + }, + { + -1580, 9166, 1083, 625, 85, -139, 136, -258, 13, -97, + 247, -163, -656, 178, 603, -203, 79, -271, -203, 201, + -206, 132, 88, 237, -315, 130, 37, -196, 83, 38, + -55, 92, -315, -18, 78, -212, 44, -14, 75, -107, + 39, -44, 84, -147, 50, 39, 27, 55, -98, 53, + -51, 53, -57, 147, -42, 55, -24, -46, 87, 1, + -18, -25, 55, -34, -3, 26, 35, -14, -41, -18, + 10, -11, 7, -29, 33, 6, -23, 37, -12, 10, + -27, -20, 3, 4, -6, -1, 3, -17, 17, -17, + -7, 0, -10, 11, 5, 2 + }, + { + 82, -2101, -447, -112, -39, 6, -83, -179, 144, 14, + 183, 559, 48, -154, -727, 782, -345, -1189, -165, 635, + -401, -245, 406, -74, 175, 211, 429, -201, 66, -105, + 178, -271, -374, -73, -184, -58, 282, -216, -26, 247, + 46, -21, -27, -25, 77, 78, -89, -37, -115, 9, + -20, 124, -31, 30, -29, -7, 6, -55, 2, -98, + 17, 94, -29, 38, 29, -18, -18, -4, 34, -55, + 28, -23, -14, -17, -29, 3, -5, -18, 35, -8, + 3, -22, 11, -6, 13, -29, 30, 19, -6, 19, + -13, 11, 2, -10, 1, -17 + }, + { + -1376, 11464, -837, 269, 89, 56, -26, -94, -239, -292, + -806, -14, -467, 106, 100, 169, 338, 97, -189, -24, + 44, -229, -56, -280, 44, -208, -56, 144, -49, -66, + 30, -21, 380, 141, -191, 13, -141, 53, 283, 30, + 56, 23, 10, -28, -89, 137, 18, 30, 154, -22, + -2, -139, 25, -164, 96, -21, -65, -85, -81, 47, + 103, -44, 73, 71, 31, -48, 0, 23, 62, 34, + 46, 7, 40, 18, -5, -16, -33, -8, 31, 20, + 26, 12, -17, 7, -13, -7, -18, -24, -13, -18, + 6, -12, 6, 21, 4, -10 + }, + { + -15, 328, 166, 116, 28, -44, -45, 77, -8, -15, + -50, -153, -77, 127, -525, 204, 603, 206, 473, -466, + -40, -354, -481, 89, -59, 192, -187, -115, 153, 63, + -106, -290, 209, -362, 77, 53, -260, -110, -133, -36, + -50, 96, 36, 27, -56, -61, -83, 15, -66, 18, + 74, 56, 90, -20, 54, 45, 75, -49, -40, 16, + -53, 60, -15, -5, -36, 78, -62, -7, 12, 34, + 34, -23, -10, 27, 28, 6, -36, 11, 11, 20, + -8, -32, 12, 16, 20, 17, 13, 7, 0, 22, + -2, -19, -4, 13, -17, -10 + }, + { + 393, -11834, 950, -903, 3, 18, 416, 134, 598, 257, + -112, 65, -89, -168, -507, -78, -232, 141, -468, -281, + -89, -120, -361, -232, -194, -109, 122, -199, 33, -103, + 269, -100, -100, -253, -201, -333, -374, 29, -101, -207, + 105, -83, 106, -17, 52, 80, -23, -31, 98, -81, + -23, -22, -113, 73, -61, 93, -1, 31, 98, -19, + 52, 62, -1, 2, 8, 93, -15, 35, 40, 48, + -33, 2, 10, -24, 11, 30, 0, 1, -2, 9, + -1, -8, -47, 5, 38, -8, -6, 6, -3, -5, + 13, -1, -1, 0, 0, -1 + }, + { + -15, -205, -235, -69, -81, 106, 28, -20, -255, -30, + 260, 247, 331, -483, -400, 510, 766, 89, 165, 33, + -175, 361, -286, 258, 128, 564, 620, -359, -412, -59, + -71, -301, 85, -236, -7, -62, -183, -143, 20, 86, + -164, 14, 29, 26, -68, 140, 19, 117, -92, 138, + 52, 47, 45, 78, -137, 27, 68, -132, 1, 34, + 33, -6, 10, 26, -16, 23, 13, 16, 6, -19, + 35, 36, 52, 6, -5, 12, -7, 10, 7, 17, + 17, -23, -1, 19, -17, -14, 3, 13, -22, -6, + -4, -16, -16, -1, -3, 5 + }, + { + -500, -10713, 2616, 1002, 637, -2076, -282, 180, 590, -124, + -45, 620, 442, -35, 58, -465, -85, 135, -339, 218, + 21, -182, -188, -117, -499, 48, 161, 121, -102, 19, + 352, -98, 34, 116, 52, 369, 162, 243, -108, -30, + -72, 145, 73, -27, 223, -77, 33, -109, -69, 53, + 99, -32, -90, 9, 21, -35, -51, 18, 41, -65, + 3, -46, -60, 9, -69, -88, 19, -14, -48, 53, + 17, 24, 15, 13, -32, 23, 12, 4, 44, -4, + 45, -6, 4, -17, 5, -1, 20, -4, 1, -1, + -1, 13, 6, -12, 9, 15 + }, + { + 2, -1941, -507, 117, 24, -186, -356, -51, 129, -79, + -148, 31, 99, -236, 226, -437, 498, -397, -161, -563, + 627, 6, -95, -331, 61, -280, -228, 88, -96, 316, + -113, -190, 29, -233, 5, 49, 34, -5, -167, 21, + 138, 37, 42, -48, -61, 10, -62, -74, -88, 10, + -73, 83, -16, -37, -54, 50, -85, -8, -36, 8, + 18, -24, -43, -40, -84, -11, 13, 28, -33, 24, + 61, 5, 20, -14, -13, -15, 0, 21, -40, 8, + 3, -1, 10, 7, 5, -1, 12, 11, 1, 2, + -11, 2, 2, 1, 0, -13 + }, + { + 2120, -4822, -338, -713, -398, -54, 362, -87, -187, 519, + 358, 18, 281, 245, 1034, 22, 475, 6, 63, -200, + -232, 262, 83, -22, 16, 408, -174, 106, 85, -106, + -10, -131, 6, 28, 60, 173, 187, 78, -93, 151, + -77, 141, 165, 218, 90, 35, 120, -24, 36, -65, + -24, 36, 1, -38, 57, 111, -88, -10, 14, -25, + 30, 30, 6, -5, 79, 13, 21, -11, 32, 43, + 16, 22, -30, -26, 42, 27, -12, -17, 3, -12, + 16, 19, 8, -4, 2, 11, -2, 2, -9, 18, + 7, 0, -4, 5, -3, 7 + }, + { + 71, 41, -1006, -440, -395, 72, 6, -156, -265, 70, + -338, -273, -724, 210, 604, -67, -134, 122, 328, -57, + -248, 864, 907, -968, 372, 65, 477, -27, 274, -96, + -38, 181, -116, 43, 53, -162, 73, -8, -9, 37, + 77, -37, -67, 77, 2, -37, -112, -154, 73, 132, + 176, 43, -75, -53, -120, -74, -21, 42, 29, -31, + 63, -37, -39, -19, 29, 0, -4, 24, 20, -36, + 58, -12, 37, 11, 27, -8, -11, 3, 10, -34, + -5, -33, -21, 0, 11, 2, 1, -6, -22, -23, + -3, 8, -4, 6, -2, -15 + }, + { + 1248, 2065, -81, -133, 749, 85, -80, -66, 817, -58, + -18, -159, 479, 22, 2149, -388, -52, 88, 300, -63, + 151, -247, -25, 152, -312, -195, 25, -353, 50, -33, + -177, 25, 147, 120, 158, 21, 6, -39, -15, 20, + -26, -247, 73, 126, -13, -57, -67, 195, 13, -21, + 76, -26, -193, -91, -24, -8, 2, 27, 50, -19, + 37, 39, -4, 18, 45, 9, 8, -8, -11, -6, + -19, 80, -29, 17, -39, -1, -13, 21, -3, 10, + -4, -13, 20, -4, 3, -5, -10, 10, -1, 9, + -5, -10, -7, 4, -9, -14 + }, + { + -21, -796, -195, 47, 177, 33, 54, -132, -159, 133, + -115, 280, -68, -1160, 567, 311, 427, -157, 115, 134, + 95, -283, -398, 240, -327, 433, -177, -330, 4, -204, + -149, 229, 112, -247, 33, -166, 13, -106, -113, 17, + 37, -158, -99, -5, -6, -112, 97, 0, -37, 71, + 34, 23, -78, -30, -92, -10, 0, -45, 82, 12, + -21, -75, 25, -12, 23, -11, -47, -40, -16, -22, + 62, -2, -76, -16, -9, 5, 0, 28, 18, 4, + 27, -3, -2, 1, 11, 25, 29, 24, -5, -11, + 0, 1, -7, 8, -19, 2 + } + }, + { + { + -662, 2645, 4392, 1407, -192, 166, 278, 319, -265, 9, + -189, -419, 340, -266, -103, 592, -196, 276, 394, -48, + -290, -41, -70, -203, 235, 66, 96, 100, -116, 212, + -200, 164, 353, 178, 110, 252, -149, 539, -113, 127, + 7, -29, -87, 11, 160, -5, -60, 23, -15, -78, + 5, -74, -13, -8, 130, 34, 14, 71, 40, -6, + -1, 2, -23, -43, -74, 28, 31, -32, -1, -29, + 20, 5, -12, 6, 48, 2, 6, -16, 11, 11, + -7, -4, 16, 30, 1, 16, 14, 0, -4, 7, + 4, 5, 6, 12, -11, 12 + }, + { + -73, -3555, -766, 274, 9, 30, 40, 49, 103, 146, + 32, -21, -104, -354, -312, -211, -25, 29, 200, -310, + 301, -985, 28, 276, 353, 290, -345, -660, -49, -51, + -193, 181, 74, -17, 105, 204, 281, 117, -13, 138, + -47, -36, 192, -40, -52, 94, 20, -11, -55, -76, + 28, -17, 3, -38, 42, -32, 57, -47, -9, -71, + -11, -12, -24, 5, 4, 37, 17, 6, 20, -3, + 4, 0, 8, 22, -2, 14, -2, -8, -6, 35, + 1, 13, -11, 19, -12, -3, 1, 14, 26, -1, + 12, 5, -10, -7, -4, 4 + }, + { + 321, 4714, -1074, -125, 113, -6, 280, -84, -44, 313, + -793, -115, 306, -4, -231, -586, 161, -450, -44, -176, + 46, -439, 366, 111, 32, 59, 467, -61, 70, -121, + 139, -52, 203, 14, 69, 76, -128, -64, -264, 54, + 278, -130, 235, -91, 126, -14, 102, 34, 113, -14, + -19, 75, 49, -16, -51, -8, -24, -18, 49, -1, + -22, -52, 81, -33, 26, -11, -36, 4, 15, -46, + 13, 24, -5, -19, -16, -34, -4, 4, 3, -1, + 17, -8, 12, -4, 8, -30, -12, 8, 37, 4, + -7, 9, -4, -11, -13, 6 + }, + { + 673, 10514, -803, 272, 177, -29, 220, -239, -108, -247, + 194, 2, -141, 169, 276, -167, 60, -424, -371, 112, + -223, 83, -230, -8, -250, 90, 68, -146, 133, 133, + 77, 268, -103, 12, -14, -287, 105, -30, 88, -63, + 56, -22, 146, -64, 116, 47, -9, 8, -91, 89, + -44, -20, -134, 98, -76, 43, 17, -125, 31, -15, + -58, -25, 51, -9, 13, 0, 23, -13, -32, -27, + -16, -50, 13, -29, 14, 0, -2, 33, -5, 39, + -2, 0, 10, 14, 0, 7, 5, -16, 27, -10, + -7, -3, 3, 5, -6, 0 + }, + { + -98, -934, 683, -75, -23, 11, -23, -140, 65, -100, + -62, 230, -17, 63, -1651, 202, 1029, 1813, 1039, 306, + -289, -358, 448, -67, 22, -131, 357, -301, 225, -163, + 151, 127, 98, 298, 82, 72, 243, -354, -157, 201, + -10, 23, 47, 24, 122, 15, -86, 104, -49, 125, + -49, -77, -121, 1, -67, -14, -36, -67, 82, 10, + -56, 4, -66, -40, 10, -2, -38, 1, 61, -33, + 20, -24, -7, 16, 0, 5, -13, -7, 39, -9, + 4, -34, 30, 8, 4, -28, 12, -4, -5, 14, + -7, 6, 0, -12, -5, -7 + }, + { + -125, 14165, 132, -89, -319, 64, 258, 165, 23, 239, + -712, -21, -246, 191, -16, 96, 30, -65, 2, 86, + 337, 21, -36, -323, 7, -72, 76, 207, 78, 45, + 45, -156, 211, 112, -190, 50, 1, 99, 131, -24, + 145, -18, -174, -4, -62, 8, 29, 63, 171, 106, + 92, -129, 64, -71, -9, -73, -26, -30, -14, 28, + 70, -46, 25, -33, -17, 1, 36, -23, -8, -6, + 9, -38, 8, 30, -2, -1, -29, 2, 49, -21, + -27, 14, 1, 32, 2, 10, -10, -1, 13, -7, + 12, -7, -10, -3, 2, -1 + }, + { + 39, 166, -149, 39, 14, -16, -15, 46, -103, 47, + 198, 13, -127, 119, -345, 264, 187, -106, 242, -288, + 512, -124, -964, -221, 96, 28, 322, 177, 123, 132, + 114, 131, 120, -301, 293, 35, -216, -123, -122, 47, + -87, 55, 6, -37, -4, -48, -162, -48, -108, -9, + 8, -26, 102, -60, -23, -7, 42, -83, -3, 63, + -54, 72, -7, 6, -27, 65, -18, 54, -4, -12, + 45, 13, -23, -9, 20, 25, -17, 17, 4, -9, + 9, 0, -2, -17, -5, 4, 4, 8, -3, 3, + -3, -6, 0, 2, -20, -9 + }, + { + 751, -13493, -310, -519, 113, -65, 80, -205, 260, 98, + 152, 169, -99, 982, 711, 30, -114, 87, -120, 169, + 249, 36, -281, -145, -19, -87, 148, -70, 225, 56, + 30, -127, 130, 27, 7, -197, -231, 155, 100, -79, + 63, -125, 225, 73, 4, -146, -91, -94, -11, 18, + 68, -51, -126, 121, -29, 95, 27, 3, 3, -74, + 15, 17, -12, -43, -65, 50, -11, 22, 2, 21, + -34, -26, 1, -4, 10, 14, 1, -2, -7, 19, + 12, 7, -28, 1, 19, 3, -2, 5, 5, -8, + 15, 5, -18, -9, 5, -3 + }, + { + 48, 280, 54, 5, -47, 82, 53, 19, -217, 11, + 158, -92, 185, 70, -355, -144, -360, -652, 246, -234, + -557, 324, -213, 301, -192, -425, 216, -203, -286, -251, + 189, -99, -41, 121, 263, -14, -41, 81, 129, 238, + -71, -163, -108, 84, 3, 137, 75, 57, -198, 114, + 8, 1, 26, 96, -114, 33, 64, -119, 3, 22, + -13, -75, -11, -19, -71, 3, 6, 6, -17, -49, + 13, -26, -6, -15, -27, -7, -16, -1, -34, 5, + 13, -7, 10, 13, -17, -2, -1, 7, -20, -4, + 11, 0, 2, 13, -7, 0 + }, + { + 428, -10427, 1251, -440, 156, -951, 517, -131, 207, -370, + -197, 350, 219, -160, 140, -462, -249, -181, -585, 85, + 124, -179, -346, -85, -149, -62, -9, 125, -118, 89, + 385, 200, -33, -10, -29, 29, -100, 135, -136, 307, + -39, -67, 54, -14, 219, -102, -2, -75, 5, 21, + 4, -15, -29, 32, 59, -28, -96, -30, 54, -120, + 24, -42, -101, 69, 3, -64, -4, 18, -50, 11, + -37, 23, 22, -25, -52, 4, -1, -6, 31, -10, + 41, -3, 6, -19, 2, -6, 16, 8, 0, -7, + 1, -2, 15, -7, -2, 4 + }, + { + -25, -1806, -292, 204, -33, -110, -105, 130, 187, -33, + -106, 123, 395, 167, 455, -376, 404, -503, 37, -690, + 540, -51, -9, -85, 126, 300, -64, 23, -57, 48, + -224, -233, 134, -130, -36, -70, 84, 183, 44, 102, + 115, 68, 85, 14, -1, 29, -45, -13, -58, 54, + -110, 51, -20, -36, -47, 108, -71, -69, -47, -23, + 36, 16, -38, 36, 8, 2, 10, 19, -44, -7, + 29, -9, -10, -15, 0, -5, -11, 22, -17, 7, + 5, 14, -1, -5, 0, 7, 11, 10, -8, 1, + -18, -11, -9, -6, 0, -18 + }, + { + -792, -7090, 1468, -270, -258, -281, 71, -332, -236, 167, + -243, -298, 445, 401, 748, -324, 225, 0, 268, -254, + -204, 251, -192, -173, -91, 152, -96, 13, -55, -64, + 144, 55, -54, 70, -11, -180, 1, 78, -14, 122, + -30, 71, -226, -90, 44, -9, 37, -135, 29, -13, + 27, 19, 2, 16, 0, 25, -126, 8, 28, -38, + -104, -48, 2, -31, 46, 16, 29, 9, 46, 43, + 10, 2, -30, -14, 27, 21, 8, -5, -16, 8, + 35, 32, 13, -14, -16, -1, -9, -1, 3, 34, + 13, 1, -1, 11, -5, 1 + }, + { + -77, 745, -6, 125, -375, -12, -37, 36, 37, 219, + -63, -148, 681, 1692, 102, -310, 89, 416, 488, 185, + -351, 805, 1348, -1043, -164, -160, 448, -259, -275, -211, + -47, 116, -204, -56, 144, -233, 93, 35, -180, -34, + 47, 49, 106, 27, -57, -39, -104, -26, 66, 6, + 61, 63, -49, -42, -82, -71, -72, 41, 46, -39, + 53, -6, 9, -31, 3, 11, -11, 1, -10, -16, + 45, -32, 5, 10, 23, -6, 5, -12, 10, -24, + -5, -2, 6, 8, 11, 0, 13, 1, -20, -20, + 5, 19, -1, 8, 9, 3 + }, + { + -1215, -1278, -124, -317, -20, -40, 111, -295, 819, -46, + 318, -17, 320, -1431, 451, 27, 419, 96, 115, -157, + 185, -148, -68, 20, -234, -10, 69, -420, 72, 31, + 45, 37, 145, 143, -8, -69, 57, 11, -26, -51, + -37, -207, -118, -138, -84, 9, -14, 82, -119, 0, + 57, -56, -103, 44, 61, -49, -37, -2, -28, -59, + 2, 44, 8, -40, 6, 18, 16, -7, 19, 8, + -18, 68, -26, 43, -29, 16, -8, 13, 6, 33, + 14, -11, -5, -16, 3, -12, 1, 11, 2, 15, + 2, 0, 4, 12, -6, -20 + }, + { + -9, -231, 183, -92, 53, -49, -27, -86, -141, 134, + -183, 212, 238, 1166, 4127, 884, 244, -71, 373, 496, + 105, -336, -509, 24, -351, 424, -197, -259, 70, -4, + -165, 112, 203, 0, 128, -107, 67, -257, -182, -19, + 46, -74, 46, 103, 66, -122, 97, 7, -31, 50, + -40, -53, -49, 63, 17, 43, 31, -89, 30, 18, + -25, -89, 35, -14, -35, -78, -59, 12, -3, -39, + 9, 22, -55, -28, -9, 9, -1, 25, 8, -2, + 20, -5, -12, -4, -13, 11, 9, 7, 8, 9, + 15, 1, -9, 17, -10, 1 + } + }, + { + { + 773, 7498, -141, 941, 260, 180, 178, 110, 147, -123, + -237, -100, -75, 72, -107, 587, -246, 277, -256, 379, + -235, -91, -316, 1, 107, 180, -33, 63, -8, 340, + -167, -34, 327, 121, 435, -23, 94, 238, 115, 69, + 62, -138, -107, 111, 126, 75, -6, -26, -39, 5, + -9, -9, 23, -31, 56, 32, 85, 9, 47, -14, + -10, 21, -53, -51, -39, -5, 14, -1, -30, 1, + -30, 45, -12, 3, 41, 34, 15, -26, -22, 22, + 6, 22, 4, 6, 19, 9, 24, 7, -3, 0, + -18, 10, 15, -9, 13, 0 + }, + { + 5, -4102, -261, 367, -3, -37, 223, -30, 170, 207, + -13, -135, -101, -392, 154, -762, -99, 346, -325, 116, + 388, -807, -225, 117, 453, -6, -105, -550, -301, 50, + 74, -39, -46, 56, 22, 312, 236, 69, 148, -68, + -3, 206, 73, 2, -242, 197, 11, -26, -115, -26, + 71, -45, 58, -98, 94, -70, 58, 30, -113, -46, + -6, 2, 0, -12, -2, 61, 37, 10, -28, 25, + -19, 18, 2, -2, 25, 24, -16, -19, 26, -1, + 25, -6, 6, 12, 6, -17, -1, 32, 16, 12, + -4, -2, 1, 4, -5, -2 + }, + { + -263, 439, 2259, 764, 18, -155, 139, 93, -97, -113, + -189, -146, 197, 143, -164, -814, 425, -560, -144, 261, + -318, -264, 235, 290, -19, 15, 386, 74, 76, 79, + 5, 67, -105, 136, 187, -115, -28, -171, -82, -26, + 95, 69, -16, 53, -57, 244, 27, 44, 61, 29, + -6, 20, 64, -17, 19, -64, -37, 61, 36, -43, + -4, 34, -19, -43, 42, -3, -32, -9, 9, -21, + -7, 51, 22, -30, -30, -42, 17, 0, -7, 12, + 22, -18, 1, 4, 4, -29, -1, 12, 19, 16, + -2, 9, -13, -17, -5, 2 + }, + { + 463, 10160, -229, 298, -249, 114, 56, -29, -279, -200, + -28, 136, 168, 271, -119, -60, 119, -848, 0, -147, + -10, 75, -204, -178, 16, -162, 54, -133, 125, 49, + 190, 265, -45, -67, -104, -172, 101, 2, 61, 27, + 73, -53, 10, 29, 109, -26, 134, -42, -40, 52, + -19, -68, -95, 56, 11, -25, -18, -70, 11, -29, + -31, -6, 63, -8, -4, 23, -18, 21, -13, -35, + -23, -42, 6, -45, 0, 16, 14, 11, 9, 19, + 22, 2, 16, -4, 5, 14, -3, 3, -1, 4, + 5, -14, 1, 1, 3, 2 + }, + { + 97, 324, -504, 31, -21, 5, -65, -66, 10, -27, + 59, 90, -258, -105, -1223, 132, 712, 2583, 634, -141, + 158, -1104, 679, -44, -98, -266, -25, -3, 146, -58, + 107, 185, 116, 265, 137, 103, 19, -236, -90, 87, + -40, 29, 84, -3, 127, -41, 55, 39, -94, 163, + -48, -113, -117, -23, -19, -35, -92, 8, 76, 39, + -90, -28, -22, -52, 13, 41, -40, 15, -11, 22, + -16, 24, -22, 1, -20, 16, 6, 4, 21, -2, + 12, -30, 14, 14, 2, -4, -1, -10, 4, 0, + -1, 3, 9, -14, -15, 12 + }, + { + 1772, 12122, -552, 8, -181, 68, 29, 337, 80, 12, + -197, -311, 72, 194, -12, 13, 8, -29, -22, 42, + 421, 167, -166, -163, -88, -10, 107, -88, 16, 122, + 293, -99, 45, 0, -72, 59, -30, 56, 112, 102, + -2, -18, -204, -91, 65, -49, 116, -31, 106, 134, + 8, -52, 18, 39, -97, -43, 50, -12, 55, -34, + -9, -6, 37, -52, -16, 21, 10, 2, -43, -15, + 11, -19, 1, 19, -29, 6, -4, 18, 15, -25, + -37, 3, 19, 22, 12, 5, -4, 4, 13, 11, + 0, -6, -8, -7, 0, -3 + }, + { + -3, -133, 219, -81, 20, 19, -65, 52, -60, 6, + 131, -68, 463, -463, 45, 275, -400, 13, 121, 20, + 332, 1, -959, -282, -176, 88, 143, 475, 60, 74, + 101, 414, -295, -29, 132, 189, -159, -50, -58, -60, + 46, -48, -14, -36, -21, -39, -109, -62, -88, -48, + -2, -31, 113, -45, -5, 19, -31, -24, 62, 25, + -30, 18, -19, -21, 31, -22, 19, 39, 14, 2, + 14, 12, 15, 0, -7, 24, -14, 20, 6, 4, + -7, 20, -10, -9, -15, -6, 12, 1, -9, -5, + -5, -2, -8, 0, -10, -8 + }, + { + -1774, -11481, 620, -164, -123, -41, -134, 71, -234, 270, + 234, 55, 111, 391, 1257, -52, 22, 114, -136, 412, + 114, -111, -114, 98, -175, -101, 27, 250, 57, 151, + -151, 222, -223, 47, 210, -482, 167, -96, 54, 191, + -73, -61, 170, 82, 109, -246, -137, 39, -69, 42, + 13, -84, -98, 70, 111, 33, 19, -20, -6, -72, + -19, -5, 15, -21, -56, 23, 17, 16, 3, -13, + -11, -15, 1, 11, 13, -11, 10, 12, 1, 8, + 18, -7, -17, -11, -1, 27, -10, 13, 0, 2, + -6, 16, -12, -9, 6, -8 + }, + { + 18, 201, 310, -48, 57, 27, 7, -77, 17, 26, + -15, 32, 73, -50, -258, -76, -815, -177, -182, -276, + -245, 149, 276, -448, 329, -576, -399, 379, -385, -348, + 279, -57, -76, 140, 173, 164, -101, 128, 67, 169, + 6, -173, -61, 63, 99, 52, 99, -45, -33, 18, + -17, 2, 19, 45, -23, 23, 12, -10, -87, -10, + 5, -23, -25, -37, -82, 6, -5, 12, 11, -90, + 10, -60, -6, 2, -37, -7, -26, 9, -31, 8, + 5, -3, 5, 6, -23, 5, 4, 9, -16, 0, + 8, 9, 2, 16, -6, -2 + }, + { + -313, -8764, -221, -130, -259, 7, -49, 224, -363, -6, + -88, 81, 236, 5, -340, 20, -436, -443, 276, -664, + 123, 10, -255, -186, 190, -230, -87, 67, -185, 205, + 317, 349, -138, -113, 146, -286, 34, 142, -3, 292, + -73, -40, 39, -48, 51, 35, 65, -76, -55, 58, + -14, -4, 56, 101, -44, -45, -50, 0, -2, -78, + -3, -42, -52, -3, 26, 8, -39, 6, -15, -20, + -26, 42, -5, -42, -21, 12, -6, -14, 5, 13, + 12, 17, -12, 5, -9, -4, 28, 12, 3, 6, + -12, -11, 5, 14, -7, 2 + }, + { + 35, -1201, -612, 222, -127, -55, 8, 102, 118, 4, + -22, 96, 392, 106, 428, -199, -93, -63, -41, -245, + 234, -9, 95, 58, -159, 363, 194, -90, -45, -262, + -164, -75, 61, -16, -169, 45, 29, 159, 48, 167, + -109, 121, 125, -15, 98, -24, 1, -45, -15, 9, + -59, 18, 27, -40, -16, 0, -21, -45, -8, -55, + 24, 4, 2, 5, 51, -18, 18, 17, -31, -1, + -15, -4, -35, 7, 3, -2, -20, 17, 3, -3, + -2, 11, 12, -9, -8, 11, -2, 7, -11, -10, + -6, -12, -8, -9, 5, -14 + }, + { + -493, -6262, 365, -13, -122, -91, -297, -164, 5, -23, + -364, -357, 754, 190, 187, 156, -85, 130, 129, -17, + -192, -25, 14, -134, -185, -67, 3, 17, -106, 85, + -27, 312, -228, 153, -53, -287, 0, -45, 48, 23, + 119, 87, -208, -260, 95, -26, -18, -107, 72, -85, + 10, 44, 5, 82, -3, -52, -61, -22, -19, -17, + -42, -85, -16, 22, 3, 23, 29, 15, 35, 31, + 7, 20, -37, -2, -6, 45, 6, -10, -8, 18, + 20, 23, 19, 1, -32, -8, -3, 9, 13, 14, + 20, 6, 11, 4, -7, -2 + }, + { + 60, 903, -27, 92, -279, -149, -72, 90, 142, 180, + 46, -210, 83, 2913, -382, 174, -181, 444, 163, 40, + 533, 96, 1063, -647, -203, -92, 329, -32, -616, 14, + 23, 74, -154, -152, 198, -296, 65, 147, -354, 151, + -22, 116, 136, -34, -24, 32, -137, 65, -100, 100, + 80, 15, 87, -129, -44, -55, 1, -42, 96, -73, + 41, 15, 32, -44, -19, 27, 7, 14, -14, -13, + 8, -10, -2, 16, 10, 10, 34, -9, -16, 1, + -17, -1, 0, 0, 7, 4, 2, -2, -1, -21, + 12, 9, 11, 3, 10, 13 + }, + { + 623, -3827, -187, -204, -182, 194, -249, 86, 428, 41, + 323, 126, -284, 395, -1508, -123, 477, 172, -111, 120, + 65, -109, 188, -240, 0, -79, 28, -147, -196, 185, + 72, 46, 80, 205, -174, -33, -25, 126, -53, -92, + -35, -72, -289, -88, -13, -56, 9, -60, -31, 32, + 24, -63, 11, 64, -43, -51, -23, -22, -38, -74, + -9, 34, 5, -27, -7, 1, 12, 11, 10, 6, + 3, 15, -2, 47, -15, 32, -17, 0, -2, 20, + 16, 7, -30, 1, -8, -18, 6, 6, 7, 9, + -1, 6, -4, 13, -1, -5 + }, + { + 0, -99, -50, -90, 122, -3, -89, 3, -82, -103, + 82, -56, 398, 1240, 3546, 932, 64, 19, 445, 466, + -8, -400, -225, -66, -180, 123, -150, -44, 144, 9, + -162, 3, 92, 175, 66, -128, 89, -241, -62, 31, + -129, 161, 41, 61, 100, -73, 46, -38, -7, 27, + 18, -119, 5, 48, 20, 14, 98, -87, -5, 41, + 29, -62, -33, 21, -55, -41, -39, 3, -16, -8, + -9, -10, 3, -18, -2, -10, -9, 18, 14, 4, + -3, -4, -18, -5, -10, -8, 14, 5, 6, 12, + 12, 0, -4, 1, 9, -5 + } + }, + { + { + -757, 8354, -109, 13, 56, 24, -148, -206, -91, -106, + 173, 212, -148, 202, -510, 417, -151, -264, -300, 570, + -263, -65, -121, 26, -231, 89, -119, -29, 44, 286, + -126, 25, 135, -206, 258, -170, 10, 124, 44, -173, + -142, -105, -168, 20, 166, 104, 55, 28, 50, 91, + 43, 6, 53, -35, 54, 39, 15, -73, 78, 17, + -6, 80, 4, -49, -1, 4, 9, 23, -6, 9, + -51, 45, -27, 11, 43, 34, 32, 0, -26, 12, + -9, -6, -15, 3, 18, -10, 9, -6, -8, -4, + -18, 1, 8, -12, 12, -5 + }, + { + 33, -1496, 1458, 294, 136, 1, 201, -99, 29, -40, + -14, 39, 44, 71, 816, -575, -49, -76, -666, 372, + 407, -447, -58, -131, 29, -135, 51, -204, -57, 13, + -48, 34, 98, 162, -99, 55, 47, 23, 25, -222, + -45, 208, 45, 58, -149, 132, -98, -46, -81, 14, + 72, -96, 39, -73, 84, -79, 15, -2, -54, 18, + -28, -35, 8, -15, -1, 34, -13, -11, -10, 50, + -24, 11, -15, -11, 17, 13, -10, -22, 7, -9, + 33, -14, 11, 18, -4, -22, -33, -11, -14, 4, + -1, 7, 2, 8, -1, -3 + }, + { + 242, -4987, -2363, 598, 161, -68, 106, 138, -37, -57, + 60, -278, 66, 165, 79, -462, 336, -603, -75, 319, + -115, 46, 332, 216, -342, -196, 261, -138, -99, -2, + -150, -75, -211, -112, -1, -16, 94, -64, -69, -105, + 35, -75, -292, 41, -4, 251, -63, -36, -11, 11, + 32, -1, 17, -26, 41, 0, 16, 38, -23, -62, + 6, 65, -23, -46, 21, -37, -15, 9, -11, 8, + 4, 29, -2, -31, -1, 6, 9, -12, 14, -2, + 19, -3, 13, 8, 11, -6, 3, 3, -8, 9, + 0, 4, -8, -6, 8, 4 + }, + { + -1410, 8349, 46, 212, -50, -37, -169, 13, -43, -26, + -67, 89, 204, -14, -513, 159, 155, -983, 137, -139, + 60, 102, -94, -176, 105, -72, -85, -276, -45, -225, + -37, 236, 46, 62, -51, -93, 112, 68, 5, -17, + 67, -101, -14, 63, -29, -181, 141, 41, 6, 32, + -17, 20, -14, 90, 78, -36, -33, -4, 15, 17, + 19, -18, 35, -11, 23, 25, -30, 36, 3, -2, + 31, -4, 0, -24, 11, 12, -7, -22, -9, -3, + 18, -13, 0, -14, 0, 5, -7, 6, -14, 3, + 13, -9, -9, -4, 6, 2 + }, + { + -99, 1220, 221, 32, 17, -11, -19, -12, 11, 59, + 39, -133, -416, 325, -529, -138, -804, -712, -644, 103, + 297, -1190, 111, -190, 155, -125, 2, 175, 77, -186, + -132, 5, -186, 132, 262, 29, -91, -238, -174, -96, + -190, -117, 14, 10, 135, -5, 100, -44, -163, 103, + -61, -18, -35, 40, 50, 24, -43, -29, 47, 55, + -51, 1, 35, -18, 36, 63, -59, -13, -39, -2, + -13, 48, -31, -16, -14, -6, -15, 7, 22, -15, + -3, -12, 18, 8, 12, 17, 17, -2, -2, -1, + 4, -2, 9, 4, -13, 5 + }, + { + -2931, 7696, 872, 397, 109, 5, -150, 265, 123, 69, + 226, 37, 325, 94, 29, -52, -153, -71, -40, -16, + 199, 173, -33, -71, -58, 16, -1, -160, 30, 127, + 313, -106, 60, -47, -14, 132, 18, -1, -76, -61, + -278, -83, -146, -180, 23, -39, 110, -101, -91, -29, + 33, -13, -52, 62, 53, 65, 115, 24, 69, -52, + -25, 2, 41, -30, 27, 26, 6, 24, -35, -11, + 5, -11, 14, -26, -35, 6, -15, 15, 11, -16, + -32, -4, 6, 2, -3, -11, 1, 4, 6, 6, + 1, -1, -8, -3, 1, -7 + }, + { + -19, -612, 7, -25, -1, 4, -54, 89, 4, 4, + 74, 65, 443, -360, 567, 163, -708, -94, 541, 357, + 63, -215, -1417, -242, -25, -53, -269, 289, -8, 20, + 12, 377, -252, -85, 109, 263, -38, 60, 57, 17, + 103, -22, -41, -77, -82, 28, 9, -61, -60, 22, + 20, -56, 83, 19, 89, 48, -13, 6, 46, -29, + -55, 0, -39, -44, -5, -58, 7, 27, 14, -11, + -26, -11, 37, 8, -28, 23, -6, 19, -10, 8, + -14, 14, 6, 14, -3, 2, 13, -13, -5, 4, + -1, 11, -8, 1, 2, 1 + }, + { + 2316, -8372, -1557, -49, 321, 22, -54, 44, -471, 113, + 38, -9, 22, 115, 886, -181, 86, 263, -82, 354, + 108, -40, -80, 162, -8, -120, -11, 322, 1, 49, + -170, 305, -301, -12, 107, -558, 254, -67, 36, 154, + -60, -15, 97, 63, 150, -22, -25, 92, -6, 29, + -18, -17, -97, 29, 75, -19, 3, -43, 78, -12, + -45, -33, 17, 56, -4, 37, 54, 31, 4, -4, + 14, 18, 2, -1, 20, -2, 2, 0, 0, -9, + -10, -10, 9, -6, -11, 14, -24, 2, -2, 0, + -13, 12, -1, -2, 15, 4 + }, + { + -53, -436, -115, -104, 88, 5, 27, 41, 135, 62, + 55, 106, -53, -23, -479, 47, 221, 188, -252, 142, + 222, 100, 329, -760, -137, -138, -317, 241, -35, 8, + 268, -31, 79, -55, -175, 71, -167, -13, -89, 116, + -21, -70, 21, -49, -7, -83, -22, -14, 49, 16, + -67, -56, 12, 20, 13, 2, -46, -16, -31, 39, + -16, 17, 25, 15, -46, -1, -8, 39, 75, -55, + 15, -32, -3, 1, -24, 15, 4, 8, -19, 12, + -4, -5, -3, 5, 5, 6, -12, 16, 1, 4, + -5, 5, -3, 12, 1, 7 + }, + { + 195, -8178, -714, -6, -19, -100, -341, 392, -231, 233, + -79, -98, 207, 146, -304, 189, -148, -194, 536, -491, + 128, -23, -73, 13, 139, -241, -110, 17, -189, 165, + -42, -62, -119, -12, 304, -84, 111, 11, -90, 202, + -44, 4, 111, 21, 12, 30, 40, -63, 8, 58, + -13, -24, 14, 21, -70, 2, -42, 28, 26, -17, + 16, -28, -44, -3, 24, 9, 9, 13, -1, 14, + -14, 22, -15, -17, 3, 11, -16, -4, 0, 10, + -3, -3, -9, 32, 4, -5, 9, 0, 1, 11, + -15, -3, -5, 2, -8, 6 + }, + { + -49, 35, 510, 147, -192, -37, -21, 31, 56, -18, + -5, -76, 82, -127, 59, -388, -322, 105, 2, 220, + 459, 16, 431, 170, -252, 108, 72, 29, 33, -140, + -10, 65, 171, -9, -119, 179, -41, -35, -112, 48, + -170, 91, 31, -52, 145, -50, -17, -56, -51, -21, + 18, 79, 41, -18, -14, -61, 11, 5, 46, -41, + -14, -5, 24, 4, 46, 3, 9, 6, 12, 16, + -49, -31, -35, 22, 4, 0, -6, 22, 1, 0, + -3, 5, 0, -14, -1, 6, -5, 9, -8, -3, + 14, 6, 6, -4, 3, -4 + }, + { + 1187, -3943, 356, 123, -34, 417, 33, 112, 74, 27, + -27, -198, 311, -730, -177, 413, -45, 14, 83, 145, + -213, -31, 37, -82, -74, -43, -134, 56, -58, 4, + -189, 198, -191, 30, -44, -114, 15, 46, 33, -90, + 102, 38, -128, -141, 28, -49, 25, -18, 75, -99, + -23, 70, 29, 80, 17, 14, 36, -21, -5, 61, + 36, -51, 6, 15, -22, -1, 28, 5, 12, 22, + -16, 12, -30, -8, -10, 39, -4, -1, 6, 10, + -5, -4, 11, 7, -21, 3, 4, 17, 5, -12, + 14, 6, 10, 1, -10, -8 + }, + { + -32, 783, 59, 170, -25, 89, -57, 80, 52, -63, + -228, -196, -272, 2138, -503, 472, -171, 53, -98, -137, + 393, -535, -61, -717, 420, 201, 100, -85, -376, 187, + 256, 200, 91, 7, 321, -81, -33, 205, -214, 160, + -92, -24, 53, 81, 91, 85, -72, 179, -59, 59, + 65, 13, 147, -125, -48, 1, 104, -44, 99, -21, + 36, 26, 53, -42, 11, 33, 22, 9, -2, 12, + 31, 32, 14, -10, -2, 16, 45, 1, 9, 28, + -1, -16, -23, -12, -2, 20, -2, -4, 5, -17, + 4, -23, 8, 6, -6, 9 + }, + { + 157, -4511, 240, 341, 148, 307, -320, -106, 6, -47, + -123, -351, -471, 491, -1896, -30, 491, 110, -133, 161, + 138, -39, 203, -161, 230, -15, 39, 71, -251, 24, + 19, 42, 64, 53, -137, 139, -152, -46, -11, -8, + 104, 117, -194, -50, -16, -9, -28, -117, 61, 97, + 30, -88, 22, 98, 1, 17, 38, -53, -37, -32, + 20, 12, -31, -24, -16, -10, 6, 24, 10, 4, + -8, 17, -5, 27, -8, 38, -29, -6, -11, -4, + 17, 21, -12, 16, 2, -3, -4, -6, -5, -1, + -19, -2, -7, 9, -5, -3 + }, + { + 25, -145, -90, -100, 43, 71, 56, -25, -75, -28, + 211, -265, -265, -2280, -1631, 195, -153, -397, 306, 487, + 214, -286, -73, -175, -81, 387, 197, 47, -55, -212, + -102, 104, -99, -52, 62, -152, 151, 176, 204, 53, + -155, 124, 51, 33, 51, -2, 21, -103, -95, -6, + 109, -36, 10, 23, 8, 2, 126, -49, -30, 21, + 38, -88, -51, 29, -33, 59, 26, -51, -3, 17, + 5, -5, 33, -6, -18, 2, -26, -13, 11, -12, + -9, 3, -19, -19, -4, -10, 9, 5, -2, 2, + 10, 2, -4, 1, 13, -5 + } + }, + { + { + 586, 10718, -4673, 126, 278, -42, -116, -196, -312, -71, + 83, 414, -86, 88, -238, 21, 53, -350, 102, 113, + -167, -177, 26, 122, -142, -158, -73, -209, 320, 48, + 7, 151, -119, -9, -7, -65, 27, 55, 46, -196, + -109, -84, -148, -37, 117, 46, 58, -13, 69, 138, + 69, -94, 48, 40, 72, -20, 6, -18, 34, 36, + 42, 0, 58, -43, -2, 9, 6, 12, 4, 15, + -5, -4, -19, 28, 34, 25, 19, 7, -6, -4, + -30, -10, -2, 0, 15, -14, -5, -5, -9, 1, + -11, -6, 5, 1, 4, 0 + }, + { + 38, 2145, -1398, 79, 129, 128, 41, 128, -65, -205, + 4, 108, -4, -147, 901, 233, -313, -92, -663, 128, + -15, 236, -147, -174, -52, -171, 98, -119, -65, 40, + -18, 199, -44, 73, 1, -77, 18, 87, -83, -106, + 28, 50, -89, 56, 82, -33, -1, -53, -52, 32, + 22, -77, -57, -5, -21, 21, -5, -17, 25, -7, + -39, -54, 16, -18, 22, -11, -5, -21, -6, 36, + -23, 10, -7, 3, 4, 12, -6, 0, -7, -13, + 15, 6, -4, 17, -7, -10, -36, -19, -16, -14, + 17, 3, 11, -1, -9, 6 + }, + { + -256, -8072, 883, 571, -139, -41, -97, 93, 55, 40, + 18, -110, -172, 306, -186, -177, -286, -274, 56, 142, + -25, -18, 465, 73, -291, -234, 37, -41, 140, -71, + -147, -83, -245, -20, -297, 276, -65, -8, -43, -105, + -87, 17, -200, -12, 82, 23, -42, 42, -65, 17, + 69, -12, -41, 6, 34, 12, -3, 30, -8, -52, + 17, 54, -20, -56, 23, -51, -3, 29, -1, 4, + -3, -2, -17, 10, -7, 3, -1, -14, 24, -11, + 20, 14, -3, 19, 13, -3, -2, -2, -10, 10, + 5, -7, -2, 2, 9, 7 + }, + { + 1876, 5413, -684, 218, -313, -50, -176, -21, -12, 21, + -66, 133, 0, 11, -616, 287, 202, -843, 52, -225, + 43, -107, 169, -86, -27, 19, -126, -105, -146, -121, + -186, 127, 97, 117, -92, -34, -14, 154, -12, -67, + 36, -31, 13, 22, -63, -107, 14, 107, -18, 35, + 10, 6, 13, 103, 47, 8, -58, 5, 12, 68, + -41, 22, -11, 6, 4, 9, 1, 23, 1, -6, + 35, 0, -4, 17, 13, -14, -12, -26, 0, -9, + -7, -10, 5, 1, -13, -3, 2, -2, -8, 9, + 2, -4, -10, -1, -4, 5 + }, + { + 100, 1337, -46, 74, -22, -2, 10, -16, 23, -43, + 93, -63, -265, -56, 135, -438, -10, -2262, -337, 658, + -403, -390, -387, -241, 245, 53, 93, 119, 95, -121, + -191, -43, -51, 52, 95, -33, -15, -157, -161, -180, + -126, -92, -79, 123, 87, 9, 52, -79, -39, -38, + -30, 50, -58, -3, 124, 1, 5, -99, 48, 19, + 21, 14, 23, 32, 5, 18, -45, -9, -14, -50, + 19, 28, -18, -15, 7, -38, -6, 8, -3, -8, + -7, 2, 23, 2, 0, 24, 13, 6, -3, 7, + 0, 4, -8, 13, -8, 0 + }, + { + 3285, 3118, -2035, 539, 195, -39, 57, 9, 157, 152, + 40, 39, 481, -167, 197, -142, -225, 103, -93, 76, + -54, 218, 30, -79, 24, 35, -23, -46, -51, 9, + 367, -14, -104, 16, 102, 71, 89, -88, -56, -62, + -297, -18, -114, -200, -83, 33, -8, 18, -84, -113, + 74, 6, -38, -25, 82, 86, 55, 80, 21, -17, + -19, -4, 41, -17, 43, 2, 17, 6, 2, -5, + -3, -5, 5, -37, -17, 12, -22, 6, 8, 10, + -20, -11, -12, 12, -5, -15, -8, 7, 2, 4, + -1, 2, 0, -8, 8, -14 + }, + { + -11, -576, -194, 131, -44, -10, -47, 79, 48, 34, + 25, 138, 300, -437, 810, 168, -353, -145, 121, 665, + 19, -185, -1189, -407, -15, 101, -173, 60, -51, -22, + 6, 103, 19, -127, 18, 193, 73, -9, 138, 32, + -55, 48, 74, -157, -36, 4, -10, -57, -17, 6, + -1, -12, 72, 26, 64, 11, 16, 52, -30, -33, + 3, -24, -37, 0, -38, -68, 10, 20, 14, -4, + -20, -21, 19, 28, -15, -2, -4, -2, -3, 13, + -2, -6, 12, 6, 1, 6, 6, -4, 5, 18, + -3, 5, -5, 0, 6, -4 + }, + { + -2346, -6468, 1980, -13, 222, 24, 157, -136, -274, -6, + -29, 178, -112, 300, 384, 84, -1, 274, 3, 71, + 148, -43, 70, -22, -17, -56, 94, 219, 24, -43, + -42, 113, -117, -89, 125, -250, -77, -60, 23, 76, + -37, -7, 77, 131, 50, 119, -96, 145, 58, 25, + -81, -14, -60, 31, 41, -23, 29, -49, 37, 21, + -24, -15, -22, 48, 65, 20, 1, 61, -9, 19, + -14, 27, 16, -21, 19, 19, 0, -20, 10, -8, + 0, -20, 7, -4, 14, -11, -5, -13, 0, -3, + -7, -2, 5, 0, 3, 16 + }, + { + -17, -423, -455, 100, -32, 29, -18, 102, 74, 33, + 153, 48, -58, -283, -317, 347, 577, -1, -340, 18, + 316, 330, -259, 164, -608, 164, -129, -289, 275, 63, + 154, -35, 26, -27, -57, -53, -163, 41, -41, 14, + -98, -32, 42, 10, -142, -58, -16, -62, 107, -69, + 44, -41, -53, 42, 38, -45, 4, -52, -19, -8, + 4, 52, -7, 52, -36, -6, 20, 25, 45, 11, + 3, -21, -3, -5, 10, -5, 11, 4, 3, -2, + -11, 7, 2, -9, 18, -8, 3, -6, 18, -1, + -16, 5, -1, 14, 0, 1 + }, + { + -152, -7421, -696, 23, 238, -341, -64, 57, 78, 31, + 21, -78, 37, 246, 49, -98, 194, -194, -114, 143, + 1, -160, 138, 142, -105, -129, -114, -13, -107, 58, + -160, -105, -20, 81, 150, 101, 76, -155, 87, 72, + 75, -79, 152, 26, 59, 13, -59, -35, 24, 14, + -59, -27, 1, -25, 12, -18, -22, 18, 23, 8, + -15, -40, 5, 0, -12, 5, 36, 4, 9, 10, + 11, -26, -9, 15, -6, 14, -23, 9, -7, -3, + 3, 2, 3, 12, 2, 4, -5, 5, 2, -4, + -5, -1, 0, -9, 0, 0 + }, + { + 73, 916, 91, -338, 13, -158, -50, 204, -116, -69, + 24, -133, 0, -206, -30, -114, -501, 521, -190, 33, + 837, -301, 258, 103, 125, 100, -135, 318, -265, 67, + -199, 189, 309, -192, 1, 46, 39, -94, -138, -28, + -24, 73, -4, -20, 55, -44, 40, -85, -69, -33, + 65, 33, 46, -1, 28, -87, 5, 20, 34, -5, + -31, -13, 17, 24, 8, 25, 3, -21, 14, -9, + -16, -18, -28, 21, -14, 7, 1, 23, 3, 3, + -8, 6, -13, -1, 6, 7, 4, 5, -6, 4, + 7, 13, 4, 9, -13, 0 + }, + { + -1172, -1029, 674, -268, 88, 420, 261, 63, -80, 53, + 189, -116, -2, -327, -376, 205, 48, -39, 115, 150, + -126, -14, -37, -88, 2, -68, -71, -141, 18, -129, + 27, -60, 60, -149, -147, 38, 100, 63, 32, -97, + 116, 98, -202, -97, 11, -21, 17, 113, -138, 1, + -29, 81, 19, 79, 18, 31, 53, -8, -22, 37, + 28, 1, 7, 5, -26, 14, 0, 17, 12, 10, + -13, 15, -32, -12, -2, 11, 9, 8, 6, 0, + 6, -13, 16, 1, -6, -5, 2, 12, 12, -17, + 5, -3, 11, -1, 2, -6 + }, + { + 11, 689, -71, 250, 39, 124, -143, 141, 21, -136, + -192, -126, 907, 223, 135, -195, -158, -10, -208, 11, + -453, 169, -460, -58, 178, 225, 50, -293, -121, -170, + 384, 278, 64, 81, 114, 118, -86, 140, 18, 29, + -58, -20, -33, 66, 75, 135, -24, 10, 19, -25, + 90, 59, 114, -93, -32, -19, 74, 1, 13, 55, + 3, 48, 20, -28, 20, 32, 34, -30, 18, 1, + 52, 41, 22, -34, -2, 25, 31, -17, 26, 12, + 15, -17, -22, 4, -9, 27, 0, -6, -8, -9, + 11, -27, -11, 10, 3, -8 + }, + { + -722, -3716, 537, 587, 100, 196, -44, -113, -133, -9, + -245, -260, -307, -392, -996, 185, 208, 65, 24, 146, + 91, 134, 36, 67, 46, 14, 5, 62, -183, -78, + 99, -87, 124, -57, 71, 35, -147, -16, -104, 53, + 196, -30, -131, -7, -11, 20, -112, -11, 71, 18, + 61, -27, -37, 52, 54, 12, 60, -52, 6, -28, + -9, 18, -43, 9, -24, -18, 30, 44, 1, -20, + -4, 0, 11, 25, 13, 13, -21, -2, -1, -15, + 11, 20, -2, 8, 20, 9, -17, -2, -15, -5, + -2, -5, -3, 3, 1, -13 + }, + { + -27, -96, -43, -80, 0, -7, 36, -12, 64, 96, + -33, -181, -551, -179, -5034, 730, -35, -199, 124, -127, + 750, -227, -425, -295, 397, 178, 176, 75, -36, -261, + -39, -100, 80, 14, 39, -242, 78, 333, 70, 67, + -7, -44, 79, -4, -5, 33, -45, -36, -42, -13, + 73, -24, -32, 18, 6, 35, 96, -43, -21, -25, + -6, -61, -23, -17, -8, 31, 33, -52, -1, 19, + 8, 10, 5, 1, -16, -3, -17, -25, 9, -11, + -8, 14, -13, -25, 3, -5, -1, 17, -4, 1, + 6, 4, 0, -2, 9, -7 + } + }, + { + { + -491, 10412, -2355, 551, -98, -37, -15, -122, -139, 156, + 94, 181, -105, -66, -135, 130, 118, -8, 218, -124, + -55, -120, -6, 122, -30, -63, 102, -178, 225, 70, + 144, 196, -114, -20, -24, 45, 24, 36, 26, -204, + -72, 23, -68, -39, 15, -69, -5, -35, 10, 19, + 9, -63, 11, -16, 34, -35, 32, 11, 12, 11, + 35, -29, 29, -17, 13, 16, 4, -8, 1, 17, + 15, 1, -10, 2, 7, 1, -1, -2, 15, 13, + -15, -10, 9, 11, 10, -4, -9, 2, -7, 0, + -3, 2, 6, 5, 6, 3 + }, + { + -121, 3089, -666, -243, -273, 8, -85, 72, -81, -51, + 62, 34, -109, -261, 455, 294, -108, -55, -578, -26, + -227, 165, -67, -93, 208, 58, -36, -200, -92, -14, + -118, 223, 175, 69, 102, -150, -143, 57, -48, 13, + 52, 32, -92, 35, 134, -65, 15, -7, -10, -9, + -14, -18, 1, 30, -33, 31, -32, -30, 27, -1, + 11, -6, 21, -24, 16, 2, 14, -16, -11, 6, + -14, 19, -10, 8, 9, 3, -9, 14, 6, -11, + -3, 7, -3, 9, -3, 8, -8, -2, -4, -17, + 17, -2, 6, -8, -12, 8 + }, + { + 211, -6768, 1541, 688, -258, -8, 4, -23, 11, -11, + -11, 79, -242, 195, -161, 76, 57, -45, -279, -70, + -72, -107, 169, -107, -86, -160, -40, -30, 162, -148, + -117, 160, 11, 86, -334, 255, 58, 82, -56, -16, + -33, 160, -19, -34, 27, -30, 3, 28, -78, 0, + 47, 4, -27, 62, 50, 6, 4, 0, -15, -34, + -24, 18, 25, -18, 42, -15, 1, 15, 14, -2, + -16, -13, -7, 30, -11, -16, 2, 2, 19, -16, + 1, -2, -10, 8, 10, -12, -5, -5, -7, 10, + -4, -2, 7, -3, 1, 10 + }, + { + -1748, 2459, 740, 232, -14, 6, -110, 11, -60, 9, + -103, 87, -13, 37, -652, 53, 92, -672, 155, -146, + 52, -63, 225, -4, -30, 87, 32, 54, -18, 0, + -109, 11, -68, 29, -51, -77, -89, 107, -74, -39, + 82, 9, 2, -69, 6, 17, -20, 39, -51, 13, + 5, 18, -15, 31, 31, 63, -26, 12, -10, 34, + -35, 28, -35, 7, -12, 5, 6, -3, 4, -1, + 26, -13, -7, -2, -3, -14, -10, -7, 13, -2, + -12, -10, 7, 11, -7, -5, 3, -4, -3, 6, + -1, -1, 1, 2, -7, 6 + }, + { + -74, 937, -93, 88, -64, -9, 11, -25, 33, -31, + 70, -33, -114, -41, 574, -12, 153, -368, 941, 384, + -229, 224, -21, -89, 162, -63, 10, -20, 94, 89, + 51, 4, -91, -87, 127, 19, 29, -72, -32, 50, + 49, 43, -45, 0, -24, 18, 9, -34, 39, 6, + -2, -1, -48, -42, 37, -35, 17, -71, 42, 17, + 58, 13, -35, 4, 4, 12, -25, 7, 16, -35, + 6, 21, -8, -6, 32, 0, 6, 7, 13, 3, + 1, -2, 11, -1, -9, 6, -4, 4, -4, 12, + 1, 0, -12, 16, 2, -2 + }, + { + -2804, -131, 1994, 203, -66, 34, 46, -221, 87, 129, + -149, -108, 216, -298, 163, 43, -140, 12, -48, 133, + -84, 115, -4, -56, 73, 77, 34, 68, 41, -59, + 254, 17, -40, 56, 58, -27, 40, -112, -21, 9, + -105, 99, 8, 46, -42, 0, -83, 16, 58, -82, + 52, 20, -6, -21, 18, 44, -2, 28, -11, 18, + -17, -20, 46, -17, 27, -3, 27, 3, 14, -5, + -7, -6, 0, 8, 9, 19, -13, 1, -1, 23, + 1, 1, -8, 19, 1, -1, 2, 1, -13, 6, + 4, 0, 1, -8, 10, -5 + }, + { + 24, -143, -30, 122, -28, 18, -24, 64, -1, -10, + -13, -41, 124, -393, 580, 364, 270, 48, -58, 442, + -18, -58, -817, -236, 48, 100, -74, 41, -92, -126, + -139, -69, 178, 64, -26, -39, -23, -20, 84, 66, + -40, -20, 75, -18, 87, -1, -8, -29, 18, -16, + -19, 3, 33, -4, 12, 12, 36, -5, -27, -1, + 20, 1, -19, 14, 7, -28, -9, 6, -11, -6, + 8, -23, -13, 19, 10, 11, 7, -7, -19, 8, + 8, -16, 8, 0, -4, 3, 1, 5, 5, 13, + -5, -1, -2, -4, 2, -1 + }, + { + 2021, -4322, -835, -212, 21, 5, 139, -52, -1, 56, + -23, 180, -86, 24, -110, 17, -134, 3, 21, 65, + 8, -147, 32, -73, 59, 16, 68, 101, -36, 34, + 25, -47, -60, -119, 21, 25, 37, -19, -76, -11, + 72, 50, 48, -9, -41, 89, -59, 116, -4, 25, + -48, -32, -6, 51, -9, 37, 72, -32, -7, 14, + 19, 0, -25, -10, 18, 14, -26, 32, -8, 26, + -36, -26, 6, 5, 19, 15, 15, -9, 30, 3, + 8, -4, 12, 3, 12, -13, 4, -8, 2, 0, + 5, 7, 0, -6, -3, 8 + }, + { + 59, 403, 60, 127, -108, 9, -31, 83, -21, -23, + 145, 9, 148, 151, -149, 262, 145, -10, 103, -167, + -98, 189, -181, 462, -575, 121, 120, -279, 124, -107, + 84, 37, 97, 85, 1, 6, -53, 36, -62, 53, + -21, -30, 19, 88, -26, 0, 12, -95, 86, -57, + 37, -9, -49, 2, -11, -46, 12, -50, 39, 5, + 10, 38, -38, 23, -15, -1, 5, -4, -12, 16, + 22, -5, 18, -2, 6, -9, 0, 9, 7, 4, + -3, 2, -3, -14, 10, -12, 5, -7, 13, 1, + -3, 1, -9, 6, -5, 5 + }, + { + 180, -4899, 1295, -52, 212, -246, -74, -120, -24, -76, + 112, -14, -185, 1, 214, -179, 364, 130, -112, 344, + 173, -187, 68, 130, -122, 5, 92, 40, -128, 58, + -143, -125, 14, 2, -112, 76, 96, -157, 91, 51, + 79, -76, 100, 42, 60, -42, -59, 20, -5, 1, + -36, -15, 7, -40, 32, 23, -4, -18, -7, -26, + 10, -17, -3, 11, -19, 5, 31, -11, 0, -3, + 8, -17, 3, 12, -6, 6, -17, 5, -4, -2, + -2, 0, 1, -2, -1, 4, -5, 7, 1, -3, + 7, -3, 5, -3, 7, 1 + }, + { + -79, 904, 288, -263, 75, -119, -56, 244, -11, -40, + 56, -65, -222, -179, 194, -122, -281, 509, -118, -352, + 394, -394, 134, 63, 136, 39, -273, 294, -127, 271, + 14, 30, 96, -142, 48, -43, -81, -94, -29, 27, + -2, -20, -17, 28, 13, 15, 50, -74, 21, 34, + 60, -15, 10, -20, 57, -6, 20, -6, -12, -17, + -1, -5, -8, 19, -3, -10, -2, -7, -3, -4, + 18, 5, -13, 24, -14, 8, -8, 9, 1, 1, + -1, 8, -19, -2, 2, 8, 0, 5, -8, 1, + -2, 7, 1, 7, -8, 4 + }, + { + 702, 774, 18, -254, 91, -230, -128, 20, -121, 131, + 87, -66, 242, -65, -375, -50, -131, -115, 96, 11, + -29, 10, -130, -91, 8, -62, 54, -93, 36, -163, + -8, -203, 51, -49, -45, 34, 51, 48, 40, -119, + 29, 48, -71, -9, 40, 25, -11, 57, -126, 94, + 8, 28, -61, 17, -22, 1, 48, 11, -23, 25, + -10, -15, 6, 2, -32, 20, 9, 3, 0, 14, + -19, 13, -18, 7, 7, 0, 4, 13, -2, -2, + 20, -4, 7, 1, 4, -7, 1, -8, 6, -1, + 3, -6, 5, -3, 6, 0 + }, + { + 2, 386, -433, 125, -45, 76, -165, 88, 7, -45, + -120, -40, -384, -1212, 511, -581, -306, 12, -255, 37, + -358, 399, -230, 181, -205, -204, 50, -180, -79, -149, + 79, 50, 5, 69, -32, -18, -145, 13, 40, -83, + -105, 59, -37, -23, -44, -7, -40, 9, 59, -53, + 7, -17, 38, -58, 24, -34, -12, -17, -12, 40, + -2, 45, -16, -15, 10, -1, 10, -15, 24, -22, + 25, 5, 17, -6, 15, 5, 2, -22, 13, -11, + 10, 0, -8, 8, -13, 16, 8, -7, -8, -3, + 11, -6, -8, 1, 11, -8 + }, + { + 863, -1869, -56, 46, -340, 261, 413, -38, -5, -9, + -23, 72, -48, 405, 109, -229, -217, 128, 30, -4, + 73, 122, -101, 16, -24, -6, -43, 23, -63, -118, + 75, -99, 77, -38, 122, 30, -114, 29, -87, -5, + 25, -101, -95, -20, -55, 0, -56, 25, 38, -12, + 42, -16, -27, 45, 26, -9, 38, -35, 24, 2, + 3, 22, -7, 16, -20, -14, 29, 11, -11, 0, + 2, -8, 12, -7, -6, 10, -2, 1, -2, -10, + -4, 4, -8, -3, 2, -5, 5, 13, -14, 2, + 6, -12, 1, 3, 6, -9 + }, + { + 23, -245, -131, -25, -34, -30, 5, 13, 64, 34, + -112, -136, -290, 1754, -3135, 273, -146, -172, -146, -420, + 240, -456, -190, -4, 172, -14, 55, -90, -41, -100, + 16, -106, 93, 2, 89, -112, 60, 101, -69, -1, + 37, -58, 33, -26, -1, 4, -33, -8, -45, 13, + 63, -37, 8, -43, -88, -20, 43, -25, 3, -30, + -10, -31, -7, -23, -14, -19, 10, -13, 0, 19, + 7, 27, -10, 1, -4, 0, 7, -8, 6, -8, + -14, 2, -3, -3, -4, -3, -2, 4, -1, 5, + -4, -2, 3, -2, 5, -9 + } + }, + { + { + 497, 4956, 2498, -265, 66, -6, -16, -84, 69, 12, + 74, 99, 17, -142, -5, 156, -4, 204, -119, -75, + 58, -39, -39, 15, 17, 5, 106, -62, 62, 72, + 221, 69, -11, 10, -26, 116, -52, 79, 0, -125, + -44, -14, -1, -5, -31, -11, -11, -98, 0, 1, + 0, -2, -15, -5, -3, -17, 18, 24, -19, 10, + 20, -6, -5, -3, -1, 15, 5, 2, -2, 3, + 21, -7, 14, 1, -12, -7, 4, 7, 5, 6, + 6, 0, 5, 8, 7, 2, -1, -2, -2, -4, + 4, 2, 4, 6, 3, 4 + }, + { + 90, 1605, 400, -305, -178, -50, -52, -7, 10, 14, + 29, -56, -69, -15, 137, 203, -244, -81, -333, -149, + -127, -55, 23, -32, 283, 67, -86, -229, -77, -72, + -7, 124, 187, 66, 109, -75, -34, -45, 1, 38, + -58, 72, 6, 9, 64, -36, 3, -18, 11, -16, + -7, 11, 25, 6, -6, -5, -30, -14, 5, 8, + 3, 25, 6, -10, 3, 14, 18, 7, -15, -8, + 5, -6, -5, 2, 11, 2, -8, 3, 9, 1, + -2, 2, 1, -2, 6, 7, 2, 0, -2, 0, + -1, 3, 2, -5, -4, 1 + }, + { + -48, -3496, -1039, 402, 296, 19, 20, -6, 2, 8, + -124, -3, 112, -4, -175, 111, 11, -19, -232, -151, + -153, 209, -46, -57, -62, -73, -74, 18, 22, -26, + -36, 53, 169, -49, -80, 41, 79, 82, -71, 13, + 25, 87, 80, -34, -16, -2, 13, 21, -21, 0, + -41, 30, 10, 70, 62, -10, -7, -7, -20, -18, + -22, 12, 8, 12, 11, 20, -11, 10, 14, 1, + -24, -10, 13, 18, -7, -10, 0, 9, -2, 4, + -10, -9, -4, 0, 3, -5, -3, -6, 2, 4, + -3, -1, 4, -2, 0, 7 + }, + { + 1138, -211, -135, 150, -52, -51, -48, -3, -14, -52, + -47, -9, -68, -31, -327, -70, 50, -360, -165, -59, + 38, 50, 57, 63, 19, -1, 41, 26, 27, 38, + -3, -61, -62, -21, -16, -57, -61, 18, -15, -6, + 20, -19, -23, -9, -15, 48, 0, 17, -22, -21, + 13, -11, 11, 12, 29, 49, 7, 5, -1, -1, + -9, 4, -8, 8, -9, 7, 13, -13, 6, 9, + -5, -7, -9, -3, -19, -4, -5, 4, 5, 7, + -4, -1, -1, 3, -1, -3, -1, -5, 1, 3, + 0, 0, 3, 1, -1, 1 + }, + { + 27, 540, 74, 23, -7, 8, -11, -2, 13, 1, + 7, -40, -31, 56, 303, 23, -162, 653, 796, 164, + -33, 9, 137, 118, -6, -30, -91, -4, 27, 77, + 179, -59, -55, -84, 74, 51, -15, 61, -27, 11, + 25, 58, 15, -22, -52, 6, -17, 32, 28, 29, + -8, -27, -31, -16, -26, -12, 2, -33, 13, 38, + 37, -10, -21, -7, 8, 3, 12, -3, 4, -10, + -2, 11, -1, 3, 14, 13, 11, 8, 10, 11, + 6, 1, -10, 0, -1, -3, -1, -1, 5, 6, + 2, 0, -5, 3, 5, 3 + }, + { + 1709, -2807, -605, -6, 27, 21, 11, -87, -36, 51, + -43, -20, -161, 22, 22, -41, -37, -5, 52, 53, + 57, 28, -7, -53, 61, 39, 91, 12, 31, 36, + 121, -47, 76, 50, 67, -47, -41, -46, 4, 2, + 16, -35, -3, 47, 16, -27, -42, -8, 50, 10, + -29, 25, 23, -2, -5, 2, 24, 25, 14, -16, + -5, 4, 17, -4, 4, 12, 16, 11, 0, -9, + -3, 3, -12, 16, 6, 7, 8, 0, 1, 13, + 3, -2, -3, 2, 11, 7, 2, -1, -8, -1, + 3, 4, 0, -4, 0, 7 + }, + { + 15, 226, -65, -73, 1, 16, 15, 1, 7, -22, + -5, -3, -90, 367, -17, 230, 209, 33, 220, 87, + -85, -112, -245, -545, -20, 101, -15, -73, -57, -89, + -10, -68, 88, 80, 24, -62, -44, 27, 22, 46, + 35, -29, 9, 18, 83, 12, 10, -9, -12, -29, + -11, 23, 8, 7, 7, 12, 28, -17, -7, 13, + -4, 0, 0, 8, -1, -9, -14, 14, -8, -1, + -15, -6, -11, 5, 17, 15, 16, -1, -13, -7, + 4, 5, -1, 0, -4, 3, -1, 3, 2, -4, + -1, -6, 0, 0, -1, 1 + }, + { + -1440, -716, -214, -147, -103, 2, 21, 3, 36, 39, + 84, 12, -20, -49, -50, 8, -149, -108, 86, 19, + -3, -47, -6, 22, -55, 51, 73, 5, -14, 86, + -16, -66, -63, -83, 7, 136, 16, 22, -91, -69, + 23, 77, 62, -5, -26, -25, 12, 61, -19, 28, + 1, -53, -1, 11, 7, 52, 32, 17, -14, -18, + 30, -11, 0, -14, 11, -9, -4, 4, 7, 5, + -15, -26, 1, 14, 9, 11, 20, 9, 17, 5, + 9, 5, -2, 8, 1, -3, 2, -3, -2, 11, + 5, 3, 2, -5, -2, -1 + }, + { + 8, 532, 273, 45, -14, -16, 12, 18, -16, -10, + 84, 4, 122, -13, 133, 180, 77, -100, 179, -259, + -30, 69, -44, 237, -208, -101, 11, -1, -88, -103, + 23, 93, 91, 52, 25, 22, -4, -15, 35, -9, + 9, 22, -15, 41, 52, 27, -5, -32, 2, 1, + -5, 8, -33, -35, -13, -14, -1, -2, 24, 0, + 8, -6, 7, -16, 2, -21, -11, -4, -7, 19, + 7, -12, 10, -3, 3, 2, -7, 9, 5, 4, + -2, -2, -8, -6, -3, 0, 3, 2, 5, 0, + 5, -1, -5, 0, -1, 6 + }, + { + -207, -2939, 90, 75, 108, 261, -417, -143, -65, -22, + 16, 22, -67, -148, 173, 3, 349, -6, -39, 230, + 114, 56, -23, 40, -67, 11, 81, -11, -18, 13, + -49, -82, -107, -44, -46, -1, 30, 9, 19, 45, + 27, 23, 16, 33, 38, 9, -42, 3, -22, 23, + 8, -12, 1, -1, 10, 26, -5, -18, -16, -13, + -2, -3, -14, 3, -5, 6, 5, 14, -15, 1, + 2, -2, 3, -4, 4, -7, 3, -5, -4, 0, + -13, 1, 5, -8, 6, 5, 3, 6, 3, 1, + 4, -2, 0, 5, 3, 5 + }, + { + 50, 615, 155, -19, -58, 26, 34, 54, 24, 44, + 33, -32, -99, -223, 277, -249, 95, 80, 68, -186, + -74, -92, 12, 35, 103, 28, -36, 0, 78, 26, + 80, 84, -20, -75, -58, 2, -87, -17, -23, 38, + -15, -21, 23, 17, -4, 36, 19, -33, 57, 46, + 28, 9, -11, 8, 10, 5, 3, 1, -17, 12, + -9, -10, 1, 5, 9, -11, -9, 14, -7, 3, + 5, -9, 8, 6, -5, 6, -2, -6, 0, 2, + 3, 2, -6, -9, 0, 3, -1, 2, -4, -6, + 1, -1, 1, 2, 4, 2 + }, + { + -157, 1483, 110, -21, 121, -249, -254, -54, 39, 113, + -65, -45, 81, 105, -112, -271, -100, -28, 4, -59, + 15, -7, -88, -18, -26, -16, 4, -47, -42, 7, + -143, -123, -26, -17, 23, -14, 21, 29, -22, -71, + 18, -34, -13, 55, 40, 4, 1, -30, -4, 0, + 61, -11, -24, -5, -7, -9, 5, 23, -6, -1, + -20, -7, -2, 4, -18, 4, 16, -4, 2, 8, + 3, -7, 4, 2, 6, 6, 2, 8, -9, 3, + 10, 10, 2, 5, 0, -2, -5, -7, 1, 8, + 6, 2, 0, 0, 3, 5 + }, + { + -15, 25, -111, 57, 4, -1, -30, -27, 31, 13, + -34, -69, -274, -1038, -33, -189, -246, -99, -130, -67, + -41, 22, 265, -31, -225, -283, 37, -164, -94, 6, + -9, 17, -52, 87, -18, -93, -57, -38, 16, -48, + -67, -13, -9, -64, -28, -25, 3, 9, 17, -5, + -46, -7, 12, -10, 29, -15, -42, 2, -2, 7, + 4, 4, 9, 3, 2, -3, -5, -8, 18, 1, + 6, 5, 2, 10, 11, 5, -5, 1, -6, -2, + -4, 1, 1, -1, -7, 5, 7, 1, -4, -2, + -1, 5, 1, -3, 7, 0 + }, + { + -623, 6, 51, -246, -168, 74, 352, 37, 62, 2, + 87, 7, 69, -172, 690, -126, -240, 39, 15, -57, + 71, 106, -65, -57, 1, 44, -14, -7, -80, -22, + -48, -2, 4, 46, 18, 6, -17, -20, -57, -7, + -40, -53, -78, -73, -46, -36, -25, 21, 25, 14, + -1, -17, 40, 8, 22, -20, -19, 13, 0, 13, + 1, -6, 23, -10, -6, -11, 13, 4, 0, 4, + -7, -4, 6, -1, -7, -4, 10, 2, -10, -4, + -7, -5, -6, -6, -4, -9, 11, 6, -2, 0, + 6, -8, -3, 1, 0, -1 + }, + { + -35, -330, -43, -28, -21, -1, -33, 7, 53, -26, + -112, -80, -32, -585, 523, -259, -237, -171, -99, -105, + -317, -356, -97, 96, 92, -72, -31, -24, 20, -32, + -79, 20, 32, 21, 28, -9, 66, 6, -28, -22, + 10, 38, 13, -55, 16, -18, -12, -42, -4, 29, + -1, 2, 3, -39, -61, -29, 1, 1, 8, 4, + -15, -14, 7, -24, 2, -34, -15, 19, -1, 9, + 2, 28, 5, 5, 1, -7, 2, 6, 6, -3, + -16, -9, -5, 3, -4, -6, 1, -1, 1, 0, + -1, -4, 1, 0, 0, -2 + } + }, + { + { + -381, 1183, 857, -356, 67, 19, -10, -51, 52, -92, + 5, 79, 38, -43, -62, 106, -47, 48, -226, 68, + 25, -21, -71, -37, 43, 19, 73, -15, -17, -39, + 119, -29, 45, 90, 45, 77, -80, 77, 44, -25, + 25, -7, 19, 27, -35, 11, 33, -83, 15, 26, + 24, 18, -14, -4, -2, 1, -6, -8, -17, 0, + 14, 1, -12, -9, -15, -1, -4, 2, 2, 0, + 11, -2, 17, 11, -3, -7, 5, 15, -5, 2, + 4, 0, 2, 4, 2, -6, 8, -3, -1, -3, + 4, -2, 1, -1, 0, 3 + }, + { + 19, 650, -3, -128, 91, 5, -25, -56, 41, -3, + -27, -44, 34, -49, -56, -12, -333, 34, 60, 92, + 34, -49, -20, -98, 125, 41, -48, -108, 41, -31, + -28, -27, 57, 0, 30, 13, 113, 50, 43, 46, + -67, 82, 31, -20, -7, -8, 14, -23, -3, -22, + 1, 1, 21, 11, 9, -26, -20, 7, -4, -11, + 5, 22, 5, 3, -2, 0, -6, 13, -3, -1, + 4, -6, -2, 1, 6, 1, -6, -1, 5, 1, + 3, -3, 0, 1, 4, 2, 0, 1, -4, 7, + -5, -1, 0, 0, 3, 0 + }, + { + -154, -1710, 0, -321, -34, 16, 4, -12, -16, 24, + 12, 28, 129, -108, -156, 48, -48, 131, -53, -5, + -94, 179, -24, -8, 40, 54, -11, 45, -53, -13, + 15, -11, 116, -48, 6, -67, -10, 35, -36, 25, + -24, -26, 28, -10, 5, 41, 5, 11, -18, 0, + -58, 27, 12, 14, 5, -14, -2, 7, -9, 3, + 3, 4, -18, 13, -7, 14, -17, -7, -6, 13, + -8, -4, 8, -1, -1, 10, 1, 0, -9, 8, + -1, -6, 5, -2, -3, -1, 0, 2, 1, 2, + 0, -1, -1, -1, 0, -1 + }, + { + -345, -2000, -227, 67, 67, -13, 2, -14, -14, -19, + 16, 16, -27, 87, -77, -21, 18, -162, 19, 11, + 27, 13, 4, 24, 31, 1, -60, -30, 24, 32, + 32, -32, -32, -7, 7, 27, -31, 8, -26, 4, + 26, -27, -10, 31, -22, 7, 17, 11, -13, 4, + 22, -19, 4, 3, -12, 5, 2, 20, 11, -2, + 5, 3, 7, 6, 2, 9, 2, -1, -2, 3, + 3, 11, -10, 2, -8, 5, -1, 1, 0, 3, + 1, 4, 1, -3, 2, -1, -3, 0, -3, -1, + 1, 1, -1, 0, 2, 1 + }, + { + 1, 406, -74, -54, 24, 4, -18, 8, -13, 12, + 9, -9, -16, -163, -34, 34, -152, 5, 101, -89, + 30, 1, 59, 75, -3, 22, -113, -1, -25, -9, + 82, -63, -1, -32, 9, -33, -100, 52, -9, -30, + 5, 22, 1, 4, -33, 17, 3, 4, -10, -1, + -3, 3, -18, 12, -19, -13, 8, -3, -7, 0, + -3, -22, -9, -3, 12, -1, 13, 4, 3, 1, + 5, 6, 0, 1, -7, -9, 3, -1, 0, 9, + 2, 7, -10, -6, 4, -1, 3, 0, 1, -2, + 0, 3, 0, -1, -3, 4 + }, + { + -434, -4418, 207, -60, -29, 20, -7, 42, -56, -59, + 64, 38, -153, 100, 14, -19, -12, -28, 55, -27, + 18, -8, 15, -22, 13, -12, 15, -33, -38, -52, + 32, -75, 65, -59, -8, -42, -40, -4, 23, 20, + 3, -70, -14, 31, 25, -21, 3, 2, -5, -4, + -20, 0, 9, 3, 22, -7, 22, 6, -1, -16, + -1, 2, 8, -5, -3, 1, 2, 6, -5, -8, + 0, 8, -3, 1, -1, -2, 4, 2, -4, 4, + 0, 0, 0, -12, 5, 3, 3, -2, 4, 0, + 2, 1, -2, -1, -3, 4 + }, + { + -36, 187, 103, -45, 15, 1, -1, -17, 14, -1, + -9, 11, -74, 317, -131, 108, -35, -87, 39, -136, + -47, -1, -44, -225, 65, 25, -64, 35, 9, -56, + 66, 10, -16, -57, 21, -6, -35, 14, -6, -12, + 48, -21, -16, 10, 9, -24, 19, -6, -14, -26, + -21, 6, -13, 0, 12, -2, 5, 9, 5, 11, + -8, 9, 7, 1, 1, -2, -8, 12, -2, 2, + -19, 2, -4, -5, 2, 1, 6, 3, -5, -6, + -5, 4, -3, 3, -4, 0, -1, -2, 1, -3, + -1, -1, 0, 2, 0, 0 + }, + { + 694, 2158, -515, -87, -18, -11, -13, -21, -14, 5, + 81, 5, -23, -62, -18, 66, -33, 14, 12, -29, + 57, 4, -13, 65, -13, 20, 3, -12, -18, 30, + -42, 1, 7, 4, 11, 51, -35, -14, -56, -28, + -23, 16, -6, -1, 9, -19, -22, 42, -23, 7, + 9, -7, -4, -17, -3, 8, 1, 12, 11, -7, + 17, -15, -2, -15, 20, -1, 0, -5, 3, -6, + -4, -11, -4, 4, 3, 1, 0, 6, 2, -6, + 8, 4, -6, 2, -1, 1, -2, 0, -5, 6, + 0, -1, 3, 0, 3, -3 + }, + { + -59, 12, 46, -65, 18, -9, 7, -15, 20, -1, + -23, -55, 55, 26, 262, 15, 111, -63, -13, -186, + 182, -18, -154, 50, -77, -39, -131, 27, -29, 15, + 37, -77, -11, -33, 1, 46, 5, -15, 30, -20, + 21, 37, -34, -17, -8, -7, -14, -5, -19, -7, + 4, 3, -16, -5, 25, 9, -10, -2, -1, -14, + -2, 3, 16, -20, 1, -10, -6, -8, 1, 6, + -5, -11, -2, -15, 1, 5, -6, -1, 0, -2, + 0, 2, -9, 1, -4, 2, 2, 7, 4, -3, + 1, 2, -2, -1, 1, 2 + }, + { + 203, -1627, 230, -240, -101, 191, -410, 37, -29, -39, + 46, 11, 26, -71, -11, 0, 164, -98, 40, 95, + -38, 37, -69, -9, -51, 5, 22, -53, 5, 18, + -26, -39, -78, -20, 1, -22, -4, 0, 24, 7, + 5, 12, -10, -2, -2, 40, 0, 17, -16, 10, + 18, -6, 5, 18, -9, 2, -1, 8, -7, 10, + -10, 0, -8, -2, 4, -2, -8, 8, -17, 5, + 6, 1, -5, -6, 7, -5, -2, -5, -8, 9, + -7, 0, 4, -3, 0, -2, 3, 3, -1, 3, + -3, 1, -2, 3, -3, 4 + }, + { + -19, 302, -206, -88, -15, 45, -6, -59, 2, 13, + -17, 54, 10, -59, 262, -182, 322, -32, -46, 36, + -77, -65, 41, 66, 17, -11, 79, -60, 40, -52, + 1, 44, -18, 15, -32, 55, -28, 42, 1, 55, + -12, -15, 49, 8, -11, -10, -10, -14, 38, -3, + 4, 21, -1, 4, -1, -2, -12, -4, -4, 14, + -13, -3, 2, -6, 4, 8, -5, 14, 5, 7, + -2, -15, 0, -5, -3, 1, 3, 0, -2, 7, + 2, -2, 6, -5, -5, -2, -2, -3, 4, -5, + 2, -1, -2, 1, 3, 2 + }, + { + -192, 1135, -151, 87, 97, 5, -68, 3, 41, -15, + -49, -27, 47, 163, 95, -152, 3, 55, -21, 13, + 17, 23, 8, 33, -46, 39, -1, 20, -37, 66, + -68, 12, 3, -35, 45, -11, 1, 6, -29, -21, + 11, 3, 2, 27, 26, -14, -9, -30, 31, -17, + 28, -6, 6, 12, -6, -12, -2, 6, -6, -19, + -16, 1, -1, 0, -2, -2, 2, -3, 5, 2, + 7, -7, 11, -1, -3, 7, -1, 3, -5, -1, + -1, 4, 1, 2, -6, 4, -4, 0, 0, -1, + 4, 0, 0, 2, -1, 2 + }, + { + 25, -19, -43, 95, -34, -28, 53, -67, -10, 49, + 24, 7, 462, 15, -51, 151, 1, 39, 33, 18, + 343, -187, 42, 8, -22, -77, 100, -76, -25, 2, + 61, 7, -57, 17, -43, -31, -3, 8, -25, -3, + -18, -4, -21, -30, 16, -10, 7, -5, -8, 30, + -26, -13, 20, -17, 15, 12, -7, -3, -1, -18, + -17, -6, 20, -1, 2, -11, 5, 4, 0, -5, + 0, 3, -5, -2, 0, 3, 0, 6, -2, 8, + 0, -1, -5, -1, -6, 1, -2, 7, 4, 1, + -2, 2, 6, 1, -1, 0 + }, + { + 200, 1121, -8, -225, 23, 19, 48, -123, -38, 29, + 58, -15, 150, -258, 341, 54, -13, -17, 27, 31, + 20, 32, 31, -79, -13, 19, -47, -33, -76, 62, + -52, 49, -9, 62, -50, -9, 27, -17, -24, -12, + -20, 40, 6, -22, 23, -4, -19, -8, 8, 5, + 21, -7, 15, -15, 16, -11, -22, 11, 4, -7, + 0, -1, 14, -12, 5, -8, -4, 7, 0, 1, + -10, 2, 4, 4, -13, -12, 2, 3, -4, 2, + -2, 1, 3, -1, -3, -5, 3, 1, 4, -2, + 0, 1, -2, -1, 0, 4 + }, + { + 44, -197, -32, -9, 17, 4, 12, 13, 26, 3, + -3, 21, -24, -711, 983, -65, -71, -38, 31, 176, + -8, -83, 96, 21, 12, -41, -43, -16, 33, 10, + -15, 66, 22, 44, 60, -45, 45, 42, -13, 3, + 7, 35, 11, -38, -14, -3, -10, -38, 18, 6, + -26, 5, 9, 1, -6, -9, 8, 10, -14, -1, + 15, 7, 12, -7, 13, -8, 5, 2, 4, 6, + -2, 6, 3, 6, -1, 1, -6, -4, -1, 1, + -1, -5, -1, 0, 4, -3, 3, 2, 1, -2, + 2, -1, 0, 0, 1, 0 + } + }, + { + { + 169, 1929, -1233, -211, 172, 24, -30, -23, -31, -64, + -25, 85, 4, 59, -141, 37, 52, -96, -72, 19, + 5, -3, -58, -70, 64, 45, 33, -24, -24, -49, + 41, -10, 73, 45, 57, 38, -49, 38, 40, 16, + 6, -19, 25, 0, 0, 4, 7, -22, -11, 22, + 11, 13, 0, -1, -3, 19, -14, -15, 7, -8, + 0, 12, -1, -10, -10, 1, -15, 3, 2, 9, + 0, 6, 3, 10, 5, 5, 2, 8, -1, -2, + -3, -4, 2, 3, 1, -4, 4, -3, -4, -2, + 1, -2, 0, 1, 0, 1 + }, + { + -79, 359, 216, 13, 35, 9, -20, -56, 18, -5, + -72, -31, 31, 28, -98, -110, -67, -26, 300, 10, + -15, -62, 9, -68, -30, 26, 26, -94, 19, 3, + 10, 23, -58, 66, -40, 28, 75, 55, 31, 37, + -16, 37, 18, -10, -26, 30, -9, -10, -12, -24, + 1, -4, -4, 9, -1, 4, -18, -1, 3, -12, + 0, 8, 5, 11, -6, -4, -10, -2, 1, 0, + 7, -2, 4, 1, -2, 0, 4, -3, -1, 0, + 4, -1, 1, 3, 0, -2, 0, -2, -4, 1, + 2, -2, -3, -1, 3, 1 + }, + { + 253, -1689, -263, -524, -34, 17, -31, -23, 14, -13, + 51, 31, 46, -10, -167, -9, -104, 128, 63, -1, + 20, 30, -1, 10, -2, 54, 3, 28, -49, -12, + 17, 21, 17, -66, 49, -50, -58, -27, 39, -4, + 2, -40, -8, -27, 21, 28, -12, -3, 4, -13, + -12, -2, 3, 8, -21, -7, 5, 13, -6, 6, + 9, -4, -9, -2, -3, -8, -6, 0, -9, 5, + 1, -3, -1, -5, 8, 17, -5, -5, -3, 6, + 3, -4, 2, 1, 1, -1, -4, 5, 1, 1, + 1, 0, -2, 0, 3, -4 + }, + { + -291, -1946, -187, -45, -13, -1, -3, -43, 4, 28, + 16, 4, -9, 15, 47, 2, -13, -145, 31, 23, + 29, 5, 4, 6, 2, 21, -62, 4, 1, -19, + 12, -24, -6, -11, 7, 51, -35, -5, 2, -2, + 23, -20, 9, 11, -1, -13, 19, 4, -1, -10, + 14, -2, 0, -1, -11, -1, 4, 16, 10, 8, + 2, -6, 8, -3, 5, 4, -3, 4, 3, -5, + 8, 17, 0, -2, 1, 2, 0, -4, -1, -2, + -2, 1, 0, -2, 2, 2, -2, 0, -1, -2, + 1, 1, 0, -1, 1, 0 + }, + { + -1, 386, -29, -38, 7, 4, -2, -4, -30, 41, + 11, -47, 23, -21, -365, 169, 24, -402, -135, 4, + 69, 61, -41, -32, 81, 36, 58, -30, -43, 5, + -2, -19, -24, -1, -51, -28, -54, 7, 1, -26, + -28, 13, -11, -2, -11, -4, 26, -8, -3, -12, + -9, 3, 3, 3, -18, -1, 4, 1, -3, -9, + -24, 2, -5, 5, -3, -3, 1, 7, 10, -4, + 9, 5, -3, 1, -5, -8, -4, -3, -3, -3, + 0, 6, 1, -5, 1, 2, 2, 2, 2, -4, + -1, 1, 4, 0, -4, -1 + }, + { + -550, -3940, -81, -38, 24, 21, -15, 31, 6, -65, + 25, 23, 5, 12, -21, 48, -38, -33, 39, -40, + -31, -8, 30, 1, -4, -18, -30, 20, -57, 4, + -45, -21, 18, -72, -8, -6, -8, -14, 1, 8, + -42, -46, 6, 30, 21, -8, -1, 6, -14, -31, + 11, 4, -17, 11, 26, -1, 0, -1, -10, -10, + 4, 5, 0, -7, -1, 3, 1, 5, 0, -3, + 0, 1, 4, -5, 0, 2, -2, -2, 1, -1, + 4, 3, 0, -6, -2, -4, 4, -6, 6, 2, + 1, 2, -3, 0, 0, -1 + }, + { + 2, 112, 22, 17, 15, 3, -15, -7, -1, 12, + -3, 30, 21, 13, 160, 138, -148, -26, -60, -84, + -35, 6, -107, 4, 64, -18, -96, 61, 21, -10, + 7, 8, 10, -83, -36, 15, -43, 2, 9, -30, + 19, -1, -6, 0, 3, -18, 1, -3, -18, -14, + -10, -6, -16, -4, 6, 7, -14, 13, 13, 2, + 3, 5, 10, -3, 2, 0, -6, -5, 4, 3, + -4, -8, 3, -7, -7, -2, -1, -5, -3, -1, + -3, -3, -1, 1, -1, -1, 2, -1, 2, 2, + 1, 4, -1, 0, 1, 0 + }, + { + -28, 3007, -47, -192, 5, -23, 7, -17, -8, 7, + 3, 17, 35, -11, -38, 46, 2, 98, -7, -49, + 13, 28, 11, 12, 62, 3, -29, 21, -40, -22, + -6, 36, 7, 20, 18, -46, -3, -35, -35, 11, + -35, 3, -16, 17, 18, 0, -39, 30, 0, -1, + -5, 22, 8, -17, -7, -11, -6, 5, 17, 6, + 0, 1, -18, 3, 8, 8, -2, 0, 9, -12, + -4, -1, -5, -12, 0, 6, -3, 0, -3, -1, + 3, -1, 1, 1, 1, 0, -5, -1, -3, -1, + 1, -1, 2, 3, -1, 0 + }, + { + 1, -439, 57, 2, 6, 5, 10, -7, 10, -4, + -19, -1, 28, 56, 204, -24, 212, -58, -78, -69, + 90, 19, -13, -133, -95, 11, -44, -133, 99, -1, + 63, -67, -28, -34, -9, 10, -14, -19, 28, 11, + 4, 15, -11, -30, -44, -17, -17, 3, -14, -13, + 10, -7, 11, -7, 26, 9, -15, -7, -22, -7, + 6, 15, 0, 4, -2, 2, -2, -4, 8, 1, + -8, 2, -5, -6, -6, 4, 3, -5, -2, -2, + -2, 5, -4, 2, 0, -1, -5, 5, 2, 0, + -1, 1, 1, -1, 0, 0 + }, + { + -214, -953, 246, -258, -88, -215, 24, 8, -53, -5, + 30, -39, 13, 29, -24, 7, 67, -21, 6, 65, + -4, 3, -36, -37, -19, -1, -24, -29, 8, -8, + -23, -54, -9, -33, 4, -7, 15, -25, 23, -17, + -3, 23, -15, 3, 1, 12, 11, 14, 0, -8, + 2, -1, -9, 3, 18, -7, -8, 9, -8, 5, + 3, -3, 3, -9, -4, 0, -2, -4, -1, 1, + 6, -2, -6, 0, -1, 0, -7, -3, -2, 2, + 3, 1, -3, 0, -4, -4, -2, 0, -2, 1, + -3, 1, 2, -2, -1, 0 + }, + { + 13, 138, 34, -169, -60, 6, -85, -9, 4, -30, + -5, 9, -40, 62, 84, -19, 156, -3, 24, 17, + -61, 30, 24, 13, 29, -23, 55, -15, -11, 6, + -30, 24, -5, 35, 10, 11, 33, 13, 13, 11, + 2, 18, 26, -2, -7, -21, -13, 2, -4, -8, + 2, 9, 20, 14, -5, -11, -10, -8, 2, 4, + -10, -1, 3, -2, -7, 8, 4, -1, 6, 4, + -3, -4, -3, -6, 0, -2, 8, 7, 1, 3, + -1, -2, 4, 3, -3, -1, 2, -3, 4, 2, + 0, 0, -1, 3, -1, 1 + }, + { + 279, 368, -43, 42, 21, 57, 80, 39, 10, -41, + -72, 59, 108, -30, 173, -80, -14, 58, 5, 3, + 6, 27, 17, 30, -47, 40, 2, 4, -9, 8, + -6, 10, 2, -5, 30, -3, 30, 7, -3, -4, + -23, 27, 34, -2, -25, 9, -11, -7, 5, 5, + 1, 1, 16, -4, 11, -11, 0, -1, -1, -16, + -9, 2, 4, -12, 3, -3, 0, 5, 5, -3, + 3, 0, 3, -3, -4, 4, -2, 2, 1, -1, + -2, -2, 0, -3, -4, 4, -2, 2, 0, -5, + 0, -2, -2, 2, 0, 0 + }, + { + -22, -15, 2, 120, -70, 13, 32, -19, -22, 22, + 23, 42, -1, 587, -95, 80, 77, 47, 39, -14, + 237, 88, -222, 24, 31, -44, 44, -41, 23, -67, + 99, 10, -26, -10, -46, 30, -14, 7, -10, -8, + -1, -8, -43, 6, -13, 20, -4, -32, -19, 31, + 5, -4, -10, 13, -9, -5, 12, -3, -15, -4, + -15, 0, 1, -2, 8, 2, -4, 13, -10, -6, + 5, 2, 0, -3, -10, -3, -1, 6, 9, 2, + 4, 1, -5, 0, -3, 3, -4, 4, 5, 2, + 1, 1, 0, 4, -4, -3 + }, + { + 164, 1060, -5, 75, 63, -6, -68, -20, -78, 40, + 22, -70, 119, 215, -310, 79, 180, -51, 37, 61, + 34, 6, 24, -18, -74, 2, -43, -44, -62, 8, + 17, 27, 4, 34, -28, 9, 15, -7, -10, 5, + -19, 38, -10, 8, 32, 11, -12, -3, 28, -12, + 26, 11, -25, -14, 15, 8, 0, -13, 10, -6, + 2, 12, 0, -6, 13, -1, 0, 6, 0, -3, + -1, -4, 4, -1, -8, -6, -2, -1, 6, 2, + 0, 1, 7, 3, -4, 2, 1, -4, 1, 1, + 0, 3, 0, 1, -1, 2 + }, + { + -31, -125, 74, -33, 8, -5, 15, 38, 6, 13, + 48, 37, -109, 230, -542, 161, 36, -15, 95, 143, + 13, 89, 35, -94, 69, 1, -40, 11, -9, -14, + 11, 29, 28, 33, 49, -31, 5, 56, 28, -6, + 3, 5, -32, 11, -3, -19, -18, -12, 10, -12, + -6, 0, -11, 1, 18, 1, -6, 11, -19, -14, + 0, 10, -4, 7, 0, 4, 14, -11, 7, 2, + 4, -4, -5, -1, -2, 4, -6, -10, -4, 0, + 5, 0, 2, 0, 2, -1, 2, 3, 3, 1, + 1, 1, 0, -1, -1, 3 + } + }, + { + { + -159, 4426, 569, -428, 66, 46, -30, -21, -17, -16, + -29, 40, 4, 26, -130, -10, 42, -38, 89, -2, + -27, -20, -18, -55, 41, -15, 13, -24, -23, -32, + 50, -4, -8, -21, 15, 53, -31, 11, -12, -5, + 14, -14, 24, -10, -2, -21, -23, 24, 12, -4, + -18, 2, -2, -10, -17, 7, -6, -2, 24, 2, + -10, 2, -1, 1, -5, 10, -6, -3, -1, 6, + 2, 3, -5, 1, 2, 9, 0, 1, 10, 0, + -2, -6, 0, 0, -1, 2, -1, 2, -2, 0, + 1, 1, 0, 2, 0, 0 + }, + { + 54, -62, -366, 47, -16, 25, -20, -12, 14, 20, + -45, -12, 37, 51, -121, -79, 135, 8, 166, 37, + 0, -94, 59, -11, -88, -17, 60, -75, 36, -2, + 19, 40, -102, 50, -7, 13, 2, -28, -34, 23, + 2, 5, 1, -7, 2, 27, -10, -3, -3, -25, + -7, -2, -15, -5, -16, 29, -3, -15, -10, -6, + -9, -8, -10, 4, -7, -5, -1, -11, -3, -3, + 6, -8, 3, 2, -7, -7, 6, 0, 5, -1, + -5, 3, 5, -1, -3, -2, 2, 0, 3, -6, + 3, 2, 0, -3, -1, 0 + }, + { + -216, -1414, 694, -265, -86, -50, -34, -80, -41, 16, + 31, -41, -81, -21, -105, 69, -110, 47, 91, 88, + 11, -2, -39, -79, -19, 54, -43, -8, -25, 6, + 38, 8, -71, -95, 8, -27, -63, -19, 49, -23, + 0, 4, -3, -59, 13, -29, -35, 0, 14, 6, + 19, 6, -14, -2, -21, -14, 12, 25, 11, 10, + 6, -8, 1, -4, 11, -5, 2, 12, 2, -9, + -3, 8, -2, -5, 5, 5, -2, 3, -3, 5, + 1, 1, 1, 1, 6, -1, -5, 1, 2, 1, + -1, 0, 0, 1, 3, -2 + }, + { + 572, -784, -184, -42, 4, -2, 9, -22, -16, 9, + 7, -34, 4, -1, -41, -4, -6, -178, 12, 30, + 23, 6, 2, -9, -34, -2, -3, 36, -9, -48, + 20, -6, 4, -7, 12, 50, -9, -6, 32, 2, + 14, 13, 43, 1, -7, -10, 4, -3, 1, -14, + 0, -6, 6, -14, -12, -5, -8, 2, -1, 1, + -8, -11, -7, 0, -1, -2, -1, -4, 8, -6, + 0, 3, 9, 5, 5, 3, -2, -3, 0, 0, + -3, -2, -3, 4, 2, 3, 2, -3, 4, 2, + -1, -1, 0, -1, -2, -1 + }, + { + 3, 412, 42, 1, -13, 0, -9, 12, 1, 8, + 10, -7, 61, -69, -480, 152, 16, -89, 6, 63, + 109, 136, -20, -53, 42, -57, 125, 34, -3, 4, + 34, 57, 27, 1, -20, 20, 20, 7, -18, -13, + -34, 20, -23, -5, 14, -6, 9, -1, 6, 11, + -7, -5, 4, -18, -8, 11, 10, -9, -4, 4, + -6, 12, -12, 0, -3, -5, -6, -6, 5, -4, + -2, 2, 1, -1, 5, 4, -10, -3, -1, -9, + -4, -4, 2, 2, -4, 3, -1, -1, 3, -3, + 0, 1, -1, 0, 2, 0 + }, + { + 974, -2096, -98, -15, -28, 12, 24, -24, 66, 38, + -58, -10, 58, -4, -62, 41, -19, -16, -13, -43, + 14, -6, 19, 29, 25, -1, -26, 37, 4, 32, + -38, -5, 31, -24, -2, 5, 30, 4, 0, 1, + -18, -15, 9, 7, -5, 2, -10, 1, -1, -16, + 20, 20, -2, 6, -7, -9, -16, -4, -10, -2, + 3, 0, -4, -13, -1, 5, 2, 3, 7, 5, + -1, -2, 1, 1, 2, 6, -4, -3, 3, 1, + -1, -2, 0, 2, -1, -6, 0, -3, -2, 2, + 0, 1, -1, -2, 3, -1 + }, + { + 22, 205, -26, 28, 0, -3, -12, 3, -21, -1, + 3, -9, -47, -103, 145, 157, -170, -80, -20, 47, + 57, 77, -66, -7, 73, 40, -5, 25, 32, -17, + -19, -20, -20, -53, -50, -13, -17, 7, -2, -9, + 11, -7, 12, -8, 24, -5, -9, 4, -7, 0, + 12, 5, 2, -9, -12, 9, -9, -12, -7, -2, + 3, 3, 12, -7, -4, 4, 5, -1, -3, -2, + 13, 1, 3, 0, 0, 0, -1, -9, -4, -1, + 2, -4, 0, -2, 2, 1, 0, 1, 1, 0, + 2, 4, 1, -2, 1, 1 + }, + { + -296, 2609, 357, -3, 61, -18, -6, 5, 19, 9, + -47, -57, 49, 91, 18, 72, 5, 16, 48, 6, + -19, 34, 16, -42, 29, -1, -2, 41, -25, -1, + 20, 37, 28, 13, 24, -30, -8, 12, 17, 29, + -7, 21, 1, -7, -5, 6, -9, 28, 10, -19, + -21, 7, 17, 7, -3, 8, -1, -6, 0, 1, + -2, 10, -12, 2, -7, 4, 2, 4, 6, -4, + 1, 2, 6, -4, -5, 0, 5, -3, -1, 6, + -1, -3, 5, 4, 2, 0, 1, -1, -2, -4, + 2, 3, 0, 1, -2, 2 + }, + { + 51, -270, -46, 44, -18, 9, 10, 8, 3, 3, + 12, -3, -16, -154, 119, 39, -2, -114, 21, -68, + 14, 75, 33, -18, 17, 93, 69, -148, 129, -1, + 33, -15, -4, -1, 2, -44, -27, -3, 20, 28, + 8, 0, 10, 10, -22, -13, 0, 8, -6, -6, + 20, 0, 25, -2, 8, -6, -6, -6, -17, -3, + 2, 1, 0, 13, 3, 13, 8, 2, 0, -4, + -8, -3, -1, 9, -5, 2, 4, 2, -4, 0, + -6, 1, 3, 3, 2, 0, -5, -1, 0, 0, + 0, -1, 2, 1, -1, 0 + }, + { + 257, -576, 323, 102, 47, -98, 229, -39, -29, 6, + 22, -45, -52, 41, 72, -79, 53, 0, -22, 64, + 12, -21, 21, 19, 27, 10, -11, 17, 17, 1, + 7, 6, 58, 18, 18, -2, 29, -33, -18, -7, + -7, 0, -31, 7, 11, -8, -6, 10, 9, -2, + -11, 7, -2, -20, 16, -3, -12, 0, -1, -6, + 15, -6, -3, -6, -8, 5, -1, -2, 9, 2, + 5, -1, -2, -3, -4, -4, -2, -5, 5, -1, + 3, 4, 1, 0, 3, 0, -4, 0, -1, -3, + 0, -3, 4, -1, 1, -3 + }, + { + -18, 18, 152, -17, -12, -11, -120, -14, -23, -10, + 28, -63, -69, 2, 22, -90, -50, -90, 29, -106, + 22, 73, 5, -37, 9, -42, -25, -15, -23, 26, + -16, 9, -23, -11, 6, -27, 8, -20, -3, -1, + 5, 12, -5, -7, -5, -21, -11, 10, -13, 1, + -4, -17, 0, 4, -4, -5, -2, -4, -3, 9, + -1, -9, 2, 7, -3, -3, 6, -5, -4, -1, + -2, 4, -1, -3, -1, -1, 2, 2, 6, -2, + -3, 3, -3, 0, 3, 3, -1, 1, 0, 5, + 0, 1, 1, 1, -2, -3 + }, + { + -194, -258, -84, -138, 0, -70, 127, 85, 1, -2, + -140, 45, 18, -128, 166, 14, 44, 13, 13, -41, + 38, 31, -13, 17, -33, -20, -22, -52, 4, -28, + 30, 9, 6, 17, -8, -34, 28, 22, 22, -11, + 1, 12, 14, -21, -24, 10, -9, 6, -21, -3, + 8, 3, 10, -24, 14, -7, 5, -4, -12, 1, + -5, 2, 6, -5, -2, 2, -1, 0, 7, 1, + -4, 4, -1, -4, -3, -1, -3, 3, 2, 0, + -1, 1, -3, -6, -1, -3, 3, 3, 1, 1, + -1, 0, -2, 0, 1, 0 + }, + { + 11, -101, -77, 164, -97, 29, -6, 12, 4, 3, + -45, -7, -269, 132, -129, -142, -134, -47, 39, 9, + -104, 36, -240, -80, 6, 60, 10, -36, 50, -43, + 26, 6, 21, 0, -21, 30, 5, 15, 35, -16, + 4, 19, -26, 7, -13, 3, -19, -31, -9, 32, + 23, 3, -31, 13, -1, -11, -11, 3, -8, 4, + -2, 17, -15, -10, -1, 11, -13, 4, -5, -3, + 9, 1, 3, -1, -2, 0, -3, 5, 4, -5, + 1, 3, -2, 1, -2, 1, 0, -3, 0, 3, + 2, 3, -3, 0, 1, -4 + }, + { + -307, 226, 30, 282, 4, 3, -23, 28, -11, -12, + 29, -77, 77, 88, -515, -36, 142, -37, 87, 23, + 6, 29, 9, 60, -43, -1, -46, 17, 3, -53, + 7, -15, -17, -6, -1, 18, 1, 8, -9, 15, + -21, 36, -1, 4, 17, 18, 1, 28, 28, -34, + -3, 25, -11, -18, 10, 12, 11, -14, -2, 2, + 3, 13, 3, -5, 9, -2, 15, 5, 1, -2, + 6, -8, 0, -4, -1, 1, 3, -8, 1, 3, + 2, -5, 1, 4, -2, -1, 5, -3, -2, 2, + 0, -2, 2, 2, 1, -1 + }, + { + 19, -161, 8, -4, 22, -10, -10, 43, -6, 13, + 70, 26, -47, 538, -772, 16, 104, 53, 63, 113, + 11, 142, 62, -48, 65, 12, -35, -19, -19, 12, + -17, -53, 2, -20, 15, 23, -6, -13, 16, -22, + 10, 11, -24, 9, 29, -13, 5, 7, 6, -12, + 6, 1, -7, -13, -3, 4, -5, 1, -4, -5, + -12, 4, -7, -5, -8, -5, -1, 2, -2, -5, + -2, 2, -10, -4, -3, -4, 6, -1, -3, -2, + -1, 0, 0, 4, -2, 2, 0, -2, 0, 4, + 0, 0, 3, 0, -2, 1 + } + }, + { + { + 367, 4515, 322, -228, -17, -32, -4, 17, -28, -11, + 39, -8, 29, -106, -77, 59, -5, 59, 52, -19, + -38, -42, 17, -9, -26, 16, 3, -23, -14, 18, + 16, 48, -40, -11, 1, 40, 25, -8, -7, 0, + 8, -2, 6, -15, -5, 3, -30, -4, 40, -7, + -12, 0, -7, -11, -18, -4, -3, -4, 7, 15, + -7, -8, -3, 0, 1, 2, 5, -3, -4, 4, + 5, -3, -1, -3, -2, 6, 3, 4, 6, 7, + 1, 0, 0, 0, -2, 2, 0, 5, 1, 2, + -1, 1, 1, 0, 0, 0 + }, + { + -21, -601, 114, 41, -33, -16, 6, 35, 2, 1, + 34, -46, -15, 16, -39, -35, 88, -30, -21, 66, + 42, -67, 29, -1, 6, 37, -63, -3, 18, -46, + 6, 50, -34, 5, 37, 33, -21, -21, -32, -9, + 0, 3, 16, 15, 3, 1, -2, -1, -2, -20, + 0, -7, 1, -3, -15, 6, 6, -9, -21, -2, + -5, 2, -12, -5, -6, 2, 6, 1, -9, -3, + 6, -9, -4, 1, -2, -5, -4, -1, 5, -1, + -3, 1, 3, -1, -1, 0, 4, 1, 5, -3, + -1, 2, 1, 0, 1, -2 + }, + { + 149, -275, -488, -106, -139, -43, 1, -88, -69, 38, + 11, -25, -97, -132, 61, 38, 29, -22, 91, 24, + 13, -34, -26, -67, -31, 18, 26, 4, -19, -2, + 19, 25, -54, -41, -57, -41, -11, -5, -15, 7, + 3, 18, -16, -22, 2, -49, -11, -2, 26, -4, + 5, 31, -12, -5, -12, -10, 15, 12, 6, 10, + 1, 8, -9, 0, 14, 5, 2, 1, 8, -7, + -6, 10, 3, -2, -1, -1, 3, 0, 2, 1, + -4, 6, 3, -3, 4, 1, -3, 1, -2, 2, + -1, -1, 1, 0, 0, 2 + }, + { + -502, 357, 88, 29, -89, 36, -12, 15, -25, -29, + -19, -25, 79, -35, -90, -34, 11, -186, -1, 21, + 25, 11, -4, -8, -29, -26, 25, 50, -44, -7, + 33, -6, 14, -3, 1, 25, 17, -4, 24, 1, + 15, 21, 26, -12, -1, 20, -2, -7, 11, -26, + 8, -5, -2, -6, -3, -17, -9, -2, 8, -11, + -5, -3, -5, 2, 2, -5, 1, -2, 4, 0, + -3, -6, 5, 6, 1, 2, -1, 1, 1, 2, + 2, -2, 0, 3, -1, 3, 1, 0, 2, 2, + 1, -2, -1, 0, -1, -1 + }, + { + -20, 429, 36, -1, -9, 0, -10, 5, 16, 14, + 0, 33, 11, -13, -463, -65, 33, 216, 178, 22, + 25, 88, 37, -42, 51, -105, 31, 44, 15, 6, + 95, 29, 11, 30, 6, 7, 28, 12, -16, 4, + -22, 5, -1, -16, 8, 6, -21, 19, 18, 11, + 2, -13, -6, -11, 2, -9, 4, -4, -3, 2, + 1, 6, -15, 2, -1, 2, -5, -5, 1, 1, + -6, -3, 5, -2, 1, 8, -5, -3, 2, -5, + -2, -4, -2, 1, -2, 0, -1, 1, 1, 0, + 0, 1, -2, -2, 2, 2 + }, + { + -863, -178, 364, -65, -27, 8, 29, -30, 47, 47, + -25, -18, -13, -2, -11, 8, 22, -18, -17, -16, + 15, 6, 0, 28, 30, 11, -7, -21, 12, 1, + 23, -7, 15, 11, 2, 15, 5, 29, -15, 9, + -2, 9, -28, 7, -5, 1, -12, -23, 17, -1, + 9, 0, 28, 7, -25, -14, 4, 1, 1, -7, + -8, 0, 2, -8, -6, -4, 8, 4, 5, 3, + -2, 1, -2, 2, 1, 4, 0, -2, 5, -2, + -5, -4, -1, 1, 0, 0, -2, 1, -4, -1, + 2, 0, 1, -2, 1, 1 + }, + { + 2, 176, 90, -5, -1, 5, 7, -7, -32, -11, + 1, 2, -85, -38, -52, 88, -87, -66, -64, 98, + 49, 27, 9, -6, -19, 9, 86, 4, -32, 30, + 16, -5, -49, -2, -38, -7, -18, 11, -21, 21, + 15, -12, 22, -8, 7, 7, 12, -6, -14, 4, + 8, 1, 7, -4, -8, 8, 0, -14, -13, 13, + -4, -4, 4, 2, -4, 2, 10, 9, -11, -5, + 5, 8, 2, 4, 5, 3, -1, -2, -4, -1, + 1, 1, -3, -2, 2, 1, 0, -1, -2, -3, + 0, -2, 2, -1, 1, 1 + }, + { + 280, 1903, 147, 187, -24, 3, -61, 30, 13, -9, + -12, -42, -29, 47, 109, 45, -15, -49, 36, 59, + -2, 2, 30, -24, -19, 16, 7, 0, 15, 14, + 28, 11, 37, 14, -3, 24, 3, 10, 5, 13, + 18, 23, -5, -28, -4, -2, 7, 8, 10, -6, + -15, -9, 8, 12, -2, 14, 4, 1, -5, 2, + -9, 7, 0, -7, -9, 0, 3, 6, 0, 4, + 1, -4, 7, 6, -2, -4, 4, 6, -1, 5, + 1, 1, 2, 4, -1, 1, 4, -1, -1, -1, + 0, 4, 0, 0, 0, 0 + }, + { + -6, 179, -142, -4, -2, -5, 6, 0, 16, 0, + 34, -44, -19, -142, 109, -37, -37, -72, 83, -80, + -56, 89, 33, -7, 66, 76, 47, -50, 10, 42, + -10, 68, -12, 0, -17, -58, 18, 11, -4, 10, + 18, 11, 18, 9, 7, 13, -7, -12, 7, -4, + 5, 11, 5, 10, 1, -4, -5, 2, -6, -2, + 1, -4, -4, 1, 4, 7, 0, 3, -5, -7, + -7, -10, -3, 11, -1, -4, 2, 7, -4, -1, + -1, -4, 3, -2, 3, -1, 3, 0, -1, -2, + 2, -2, 0, 2, 0, 2 + }, + { + -280, 249, -26, 202, 35, 155, 0, -64, 7, 31, + 20, -26, -37, 2, 100, -167, 111, 19, -53, 53, + 13, -18, 20, 40, 22, -3, 11, 29, -3, 13, + 25, 17, 24, 45, 40, -32, 20, -4, -26, 3, + 6, -18, -9, -21, 5, 20, -4, -10, 14, -1, + 2, 4, 12, -8, -4, 5, -5, -6, -1, -6, + 0, 5, -5, 1, -9, 0, 2, 2, 6, 4, + 0, 2, 0, -4, -3, -5, 4, -4, 3, 1, + -4, 3, 3, 2, 5, 2, 1, 0, 2, -1, + 1, -3, 0, 1, 1, -1 + }, + { + 12, -32, 58, 72, 26, -8, -81, -13, -55, 38, + 26, -32, -61, 22, -8, -88, -89, -145, 144, -159, + 28, 13, -8, 3, 34, -57, -32, -30, -3, -29, + -18, 20, -41, 2, 10, -36, -21, -7, -10, -1, + 5, 18, -11, -12, -7, -11, -9, 7, -3, 30, + -18, -10, -15, -11, 8, -5, -6, 4, -4, 7, + 6, -3, -1, 2, 6, -6, 4, 4, -3, -2, + 1, -1, -4, -1, 1, -2, -3, -4, 6, -3, + -3, 4, 0, -5, 1, 3, -2, 0, -2, 0, + 2, 0, 0, -1, 1, -1 + }, + { + 75, -470, -190, -201, 19, -35, 78, 35, 2, -1, + -125, -14, 1, -35, 29, 76, 18, 9, 16, -32, + 31, 32, 1, -4, 5, -42, -23, -31, -23, -26, + 50, -7, -11, 11, -7, -37, -15, 9, 30, -10, + 28, -11, -26, -1, 3, 1, -6, -13, -4, -9, + 16, 7, -7, -10, -2, 0, 0, 1, -18, -1, + 2, -6, 0, 7, -3, 3, 0, -3, -1, 8, + -3, 0, 1, -3, 1, -2, -1, 1, -2, -1, + 1, 6, 0, -6, 1, -5, 4, 1, 1, 4, + 0, 2, 2, -1, 1, -1 + }, + { + -5, -212, 34, 69, -10, 5, -7, 5, -6, 18, + -7, 33, 160, -529, -169, -36, -186, -77, 19, 58, + -164, -38, -58, -82, 4, 51, -23, -13, 37, -9, + -15, -2, 11, -3, 39, -9, -10, 29, 14, -4, + 14, 15, -13, -5, -1, -12, -24, -8, 13, 2, + 21, 9, -5, -7, 15, -10, -10, -6, -3, 2, + 0, 13, -14, -2, -4, 1, -4, -6, -1, 5, + -1, 1, 2, -2, 10, 1, 2, 5, -3, -4, + -1, 1, -2, -3, -1, -1, 3, -2, -5, 5, + 1, 3, 3, -2, 1, 1 + }, + { + 225, -527, 32, 117, -5, -52, 49, 63, 9, -23, + -24, 57, 24, -147, -155, -16, -70, -15, 73, 9, + -14, 41, 43, 49, 16, -35, -47, 42, 7, -34, + -9, -30, -9, -24, -1, 6, 12, -11, -4, 0, + 18, 5, 26, -4, -6, 0, 4, 24, 12, -12, + -16, 7, 12, -6, -2, 10, -7, -2, -14, 16, + -2, 1, 3, -1, -5, 3, 5, 4, 6, -2, + 2, -5, 0, -2, -1, -1, 1, -4, -5, -3, + 2, -3, -4, 0, -1, -4, 3, 4, -2, 1, + 0, -2, 0, 0, 2, -1 + }, + { + -27, -139, -20, 35, 1, -12, -9, 3, 57, -29, + 47, 12, -11, -197, 288, 106, -37, 97, 2, 74, + 30, 26, 77, 43, 42, -57, -30, -25, 17, 28, + -21, -12, -23, -49, 16, 26, 9, -31, -5, 1, + 24, 9, 31, -16, 11, -10, 21, 3, 1, -11, + 12, 5, 8, -23, -13, -4, 1, 5, 5, 17, + -5, -3, 1, -4, -3, -8, -11, 6, -1, -4, + -8, 4, 4, -3, 1, -3, 3, 3, 0, -4, + -6, -4, -1, 1, -2, 3, 0, -3, 0, 2, + -1, -1, 1, 3, 0, -1 + } + }, + { + { + -444, 2061, -516, -76, 76, -40, -10, 60, -4, -36, + 41, -19, 23, 20, 13, 81, 7, 77, -79, -23, + 33, -4, 36, 19, -28, 24, -6, 19, 1, 9, + -3, 38, -28, -4, 12, 24, 15, -29, -10, -5, + 9, 14, 0, -41, -19, 16, 2, -16, 30, 11, + 4, -1, -3, 7, 4, 3, -3, -5, -10, 6, + 4, -4, -2, -11, -2, 2, 7, 4, -8, -3, + 0, -4, 0, 4, -1, -3, -6, 4, -5, 4, + 0, 7, 2, -2, -1, -4, 3, 0, 0, 1, + -1, -1, 2, -2, 0, 0 + }, + { + 25, -857, 20, 64, 9, 13, 45, -5, 4, 15, + 85, -20, 6, 51, 45, -30, 24, -21, -30, -18, + 46, -72, -9, 35, 73, 54, -79, 65, 24, -33, + 10, 8, -10, 14, 18, 45, 7, 14, 10, -11, + -17, 20, 33, 16, -30, -6, 3, 0, 3, 9, + 20, -13, 1, 9, 12, -6, 1, -3, -9, 3, + -3, 1, -5, 2, -4, 12, 5, 10, 0, 1, + 5, 0, -4, -5, -1, 5, -3, -3, 1, -3, + 4, -1, -4, -1, -2, -1, 4, 1, 0, 2, + -3, -2, 1, 2, 2, -2 + }, + { + -143, 943, 513, -24, 64, -7, 23, -24, -5, 20, + -25, -11, 37, -72, 111, 52, 57, -12, 165, -11, + -22, -25, 8, -1, -3, -15, 17, 41, 2, -11, + 30, 62, 9, 20, -26, -52, 14, 3, -2, 20, + 12, 16, -7, 2, 6, -17, -10, -11, 15, 0, + -21, 19, -6, -3, 11, 1, 1, -1, 2, 10, + -7, 12, -9, 10, 1, 4, 1, -9, -1, 5, + 2, -1, 2, 2, -1, 0, -1, -4, 4, 2, + 0, 3, 3, -4, -2, 3, 1, 4, -5, 3, + 2, -2, -1, -1, -2, -1 + }, + { + 233, 769, -495, 29, -20, 18, -15, 4, -12, -13, + -4, -9, 79, -28, -35, -34, 34, -116, 4, -4, + 19, -14, -6, 11, 5, 8, -11, 49, -48, 15, + 57, -4, 24, -1, -20, 12, -22, -2, 9, 1, + 27, 7, 10, 1, 0, 12, -5, -13, 23, -22, + 7, 4, 0, 15, 5, -11, 5, 3, 10, -12, + -2, 6, 10, -2, 5, -2, -2, 4, 0, 2, + 1, -1, -8, -4, -2, 2, 1, 2, 0, 0, + 4, 2, 4, -1, -2, 1, -3, 4, -1, 0, + 2, 0, -1, -1, 2, 1 + }, + { + 28, 418, -51, -21, 11, -1, -15, 11, 1, -13, + -13, 14, -30, 96, -286, -69, -58, -15, 178, -21, + -45, 3, 71, 10, -21, -151, -58, -8, 19, 40, + 72, -13, -10, 14, -24, -36, -11, 13, -33, 6, + 7, 1, 15, 1, 7, 2, -18, 7, 10, -4, + 8, -4, -12, 11, 11, -17, -2, 8, -7, -10, + 2, 2, -19, 1, -4, 4, -1, 1, 0, 0, + 3, -2, 3, 1, -3, -3, -3, -1, 2, 2, + 1, 3, -1, -4, 1, -3, 1, 2, -3, -1, + -2, 1, 0, -1, -2, 1 + }, + { + 454, 651, -459, 30, 10, -10, -36, -3, -1, -45, + 40, 12, -20, 15, -5, 5, 28, -27, 15, -16, + 1, 13, 6, 18, -14, 1, -13, -39, -39, -18, + 48, 9, 0, -3, 22, 4, -44, 7, -21, 11, + -5, 31, -28, -9, -1, 3, 4, -12, 4, -3, + 29, -14, 10, 5, 6, -15, 12, 6, 4, -7, + -11, -3, 6, 4, 1, -7, 4, 4, -4, -6, + -4, 3, 5, -1, 0, -5, -1, -1, 3, -2, + -2, 0, 0, -6, -2, 1, 2, -1, 3, -3, + 1, 1, 1, 1, 0, 1 + }, + { + -17, -48, 55, -14, -4, 2, -13, -11, -2, -3, + -1, 12, -15, 100, -127, -104, -91, 8, -30, 135, + -4, -25, -15, -30, -40, -20, 37, 39, -89, 51, + 55, 48, 4, -16, -13, 16, -38, -3, -20, 4, + 26, -7, 4, -8, -20, -13, 8, -4, -13, 9, + 2, -8, 5, 11, 7, 5, -3, 13, -3, 11, + -2, -4, -9, -4, -4, -2, 1, 10, -2, 0, + -8, 1, 1, -1, -3, 4, 1, 1, 1, 3, + -2, 2, -3, 3, 0, -1, 4, -3, -1, 0, + -1, -3, 0, 0, -1, -2 + }, + { + -150, 1662, 96, 164, -23, -4, -46, -5, -22, -12, + 23, 24, -57, -54, 4, -44, -52, -24, -34, 17, + 28, -11, -3, -3, -1, -2, 3, -10, 30, 2, + 2, -6, 2, 16, -1, 22, 17, -8, -23, 10, + 2, 4, -6, 11, -21, -2, 9, -2, -11, -4, + -2, 20, 16, -5, -5, 9, 8, 5, 10, 11, + -11, -1, 3, 10, 3, -1, -2, 2, 6, 0, + -1, -1, 1, 3, 6, 0, -8, 8, 0, 0, + 1, 2, -1, 0, -2, 1, -1, 2, 1, 2, + -1, 0, -2, -1, 2, -2 + }, + { + -40, 179, 93, 3, 16, -8, -16, -40, 15, 0, + 22, -30, 20, -117, 179, 55, 100, 9, 100, -41, + 10, 9, -6, -47, 61, 58, -58, 16, -36, 4, + 46, 49, -40, -4, -23, -24, 15, -27, 5, -7, + -13, 16, -6, -18, 1, 17, -13, -8, 12, 4, + -3, -5, -14, -1, -3, 0, -10, 10, -2, -3, + 4, 2, -5, -5, -9, -4, -2, -1, -1, 0, + 3, -1, -6, 0, 2, 0, 1, 1, -3, -5, + 3, -2, -4, -5, 0, -2, 1, 3, 1, -1, + 0, 0, -1, -1, 0, 0 + }, + { + 241, 649, -743, -223, -48, 44, -204, 3, -11, 2, + 35, 4, 10, 30, 32, -113, 52, -18, -16, 13, + -34, -13, -12, -2, -1, 4, 26, 7, -15, -2, + -11, -9, -8, -11, 32, -10, 9, -3, 9, 2, + 13, -21, -1, -8, -7, 21, 13, -14, -13, -14, + 16, -13, 8, 22, -10, -4, 4, 8, 2, 8, + -13, 7, -1, 2, -4, -7, 1, 2, -2, 1, + 0, 3, -3, 3, 1, 0, 4, 3, -2, 4, + -5, -1, 0, 2, -1, 1, 5, 0, 0, 2, + 0, 2, -2, -1, -2, 2 + }, + { + -5, 83, -9, -26, 14, 12, -10, 20, -60, -4, + 1, 55, -7, 20, 8, 37, 2, -137, 118, -12, + -8, -59, -21, -3, 34, -65, 22, -43, -6, -4, + -9, 20, -24, 11, -17, 16, -1, 18, 2, 0, + -5, -11, -3, 6, -6, -1, 6, 4, 5, 27, + -19, 5, -5, -12, 7, -1, -3, 7, 1, 3, + 3, 7, -1, -4, 0, 0, -2, 6, 7, -3, + 2, -4, -7, 1, 6, 0, 1, -3, -3, 1, + -2, 1, 6, -2, -1, -1, -1, -1, 2, -4, + 0, -1, -2, 0, 1, 3 + }, + { + -7, -444, 7, -65, 6, 86, 30, -14, 5, -3, + -26, -44, 36, 24, -42, 16, -23, 35, 6, 2, + -27, -13, -5, 12, 12, 4, -31, -11, -29, 2, + 21, -12, -6, -19, 7, -26, -31, -5, 13, -3, + 10, -13, -25, 18, 12, 10, -6, -12, 15, -6, + 0, -3, -12, 1, -6, 2, -3, 4, -1, -9, + 4, -6, -4, 5, 4, -1, -2, 0, -6, 0, + 1, -5, 2, 0, 1, 2, 3, 1, 0, -1, + -1, 0, 3, 1, 3, 3, 2, 0, 0, -1, + 1, -1, 4, 2, 0, 0 + }, + { + 3, -272, -10, 17, 13, -10, 30, -27, -26, 18, + -14, 53, 89, -442, -142, 79, -25, -8, 63, 54, + 61, 7, 71, 44, 48, 15, -29, -37, 39, 15, + 64, -12, -5, -20, 41, 11, -32, 10, -22, 24, + 18, 5, 4, -1, -3, 11, -18, -1, 5, -19, + 11, 0, 13, -5, 7, -1, 14, -11, 2, 4, + -6, -3, 1, 8, 2, -4, 4, -2, -4, 5, + -4, 2, 2, -6, 1, -1, 3, 3, -4, 0, + 3, -1, -2, 0, -1, 0, -2, 3, -3, 2, + 0, -4, 3, 3, -3, 2 + }, + { + -54, -700, 23, -195, -38, 10, 27, 24, -12, 14, + 5, 82, -14, 48, 159, -16, -147, -6, 1, -18, + -29, 0, 56, -1, 64, 16, -22, 65, 4, 11, + -27, -24, 4, -10, -44, -18, 25, -10, 0, -14, + 45, -9, 20, -1, 1, 10, -10, -12, 2, -1, + 6, -5, 11, 9, 1, 0, -22, -4, -4, 9, + -12, -4, -1, -3, -12, 0, -13, -1, 3, -3, + -1, 1, -2, 3, -1, -5, -6, 3, 0, -5, + 1, 2, 0, -2, 0, 1, -4, 4, 2, 0, + -1, 2, -2, -1, 0, 1 + }, + { + 34, -45, -40, 15, -9, -6, -3, -76, 2, -52, + 17, 61, -25, -169, 699, 78, -135, -33, -11, 24, + -96, -72, 31, -62, -30, -37, 41, 16, 34, 24, + 0, 48, -9, -30, 19, -27, 18, 1, -12, 4, + 10, 28, 46, -24, -16, 3, 11, -13, 2, -7, + 2, 4, 13, -7, 4, 2, 5, 9, 2, 19, + 10, 2, -7, -3, 7, 2, -2, -7, 10, 6, + 1, -1, 9, 4, 0, 4, -5, -4, 3, -1, + -1, -3, 1, -7, 1, 1, 1, 1, 0, -2, + 0, -1, -2, 3, 2, -2 + } + }, + { + { + 274, 771, -578, -37, 14, -21, -1, 39, -15, -38, + 5, 2, 10, 50, 63, 48, 14, 27, -32, -40, + 5, 31, 33, -1, 1, 36, -20, 22, -10, -2, + -12, 9, -6, 14, -9, 21, -15, -9, -35, 17, + 1, 1, 4, -28, -18, -2, 8, -5, 15, 7, + 6, 2, 3, 7, 10, 5, -4, 5, -6, -5, + 5, 4, 2, -10, -4, 4, 2, 0, -2, -2, + -3, -2, -2, 2, 3, -1, -5, 1, -3, -2, + -1, 2, 1, -2, 1, -3, -1, -2, -1, -2, + 1, -2, 1, 0, 0, 0 + }, + { + -31, -610, -24, -6, 13, -8, 66, -19, 2, 17, + 36, 30, 2, 22, 57, -35, 61, 24, 23, -27, + -22, -55, 3, 64, 46, 7, -42, 62, 31, -7, + 15, -20, 12, -7, 15, 12, 29, 11, 33, -15, + -5, 11, 20, -3, -19, -3, 3, 5, -2, 15, + 10, -6, -11, 5, 16, -4, -2, 0, 7, -4, + -8, -6, 1, 9, -4, 10, 1, 0, 7, 1, + 0, 5, 1, -5, -1, 3, 2, 0, -3, -2, + 4, 0, -3, -2, -2, -1, -2, 1, -2, 1, + -1, -2, -2, 1, 1, -1 + }, + { + 164, 1587, -252, -26, -15, -5, 7, -10, 25, -6, + -27, -16, 51, -18, 65, 35, 24, 26, 97, 33, + 8, -8, -13, 24, -35, -18, 9, 29, 1, -22, + 57, 51, 14, 3, -3, -21, 0, -16, 15, 24, + 21, -3, -3, 8, -14, -6, -17, -1, -7, 10, + -12, -6, 1, -1, 1, 4, -2, 1, 4, 7, + -2, 3, -11, 14, 0, -4, -1, -5, -5, 6, + 5, -3, -2, 3, 2, 5, -3, -5, 1, 3, + 5, 0, 2, 2, -3, 0, 2, 3, -1, 0, + 1, 1, -1, -2, 0, -1 + }, + { + 29, 366, 42, -8, -10, -7, -4, -22, -9, -8, + 37, 15, 18, -11, 47, -37, -22, -31, -9, -10, + 2, -3, -19, 10, 9, 27, -13, 22, -19, 10, + 4, 15, 10, -11, 16, -26, -2, 7, -6, 8, + 26, 6, -4, 10, 15, -4, -8, 2, 2, -1, + -11, 10, 4, 7, 3, 1, 1, 9, -3, 0, + -3, 8, 3, -2, -2, 1, -2, 4, -1, -1, + 3, 6, -6, -5, 1, 2, 0, 0, 1, -1, + -1, 1, 1, -2, 0, 1, -3, 2, 1, -1, + 1, 1, -1, -1, 1, 1 + }, + { + -22, 307, 109, -30, 9, -2, -9, 10, -8, -11, + -13, 3, -17, 83, -235, -43, -53, -111, -57, 49, + -6, -15, 42, 17, -61, -81, 5, -23, 14, 66, + 12, -19, -32, 17, -36, -39, -27, 7, -5, -18, + 10, -17, 7, 13, 4, -2, 5, -5, 7, -11, + 3, 7, -11, 15, 1, -1, -10, 5, -1, -11, + 0, -2, -8, -9, -7, 0, 1, 4, 2, -5, + 6, 5, -2, 1, -1, -6, -1, -3, -3, 0, + 0, 5, 3, -4, 1, -2, 1, 2, -2, -3, + -2, 0, 0, 0, -3, -1 + }, + { + -54, 527, 94, 71, 26, -1, -46, 20, -4, -65, + 14, 24, 15, -16, 52, 12, -21, -38, 8, -9, + -24, -8, 1, 36, -3, -5, -38, 0, -29, -28, + 6, 36, -11, -2, 29, -9, -55, 8, -1, 2, + -19, 5, -1, -5, 2, 5, 4, 11, -4, -3, + 18, 1, -4, 1, 15, -5, -7, 1, -1, -1, + 0, -7, 2, 7, 4, -4, -2, 3, -1, -3, + -2, 0, 5, 0, 0, -5, -6, 0, 1, 1, + 1, 2, 2, -4, -5, -1, 1, -3, 2, 0, + 0, 1, 0, 2, 1, 0 + }, + { + -10, -164, 48, 11, 3, -3, -14, -7, -4, 5, + 10, -5, 9, 19, -34, -65, -4, -21, 26, 91, + -8, -19, -92, 28, -10, -6, 14, -27, -28, 28, + 49, 32, 21, -24, -39, 16, -15, -23, -13, -8, + 16, 4, 7, -8, -33, -14, -11, -6, 4, 3, + -1, -2, -5, 10, 13, 1, -4, 15, 1, 4, + 1, -1, -5, -7, -4, 2, -5, 1, 6, 6, + -8, -3, 1, -3, -7, -2, 1, -1, -1, 4, + 0, -1, -2, 3, 1, -1, 2, -1, 1, 2, + 2, 1, -1, -1, 0, -2 + }, + { + 65, 1880, -212, 18, 25, -14, -17, -21, -19, 1, + -2, 22, 1, -37, -88, -36, -17, 21, -25, -28, + 32, 5, -37, 3, 14, -6, -2, -10, 28, -5, + 2, 11, 2, -3, 20, 0, 5, -5, -43, 23, + -8, -1, -11, 30, -12, 14, -17, 9, -2, -11, + -12, 30, 24, -1, -1, -5, 3, 3, 11, 11, + 1, -4, -3, 12, 8, 3, -4, 2, 6, -1, + 0, 0, -2, -4, 3, 5, -8, -1, 1, -1, + -1, 3, 2, -2, -1, 1, -3, 2, 0, 2, + -1, -1, -1, -2, 0, 0 + }, + { + 4, -9, 70, 5, 0, 2, -30, -14, -1, 3, + 15, 0, -1, 18, 39, 31, 256, 26, 87, -20, + -41, 31, -1, -24, -8, 31, -40, -25, -9, 12, + 61, 17, -38, -27, 3, -12, -24, -15, 4, 2, + -40, 7, -2, -15, -18, -5, -4, 1, 8, 3, + -6, -12, -9, -7, 3, 1, -7, -1, -3, -4, + 2, 4, 0, 3, -8, -5, 8, -4, 4, -2, + 4, 4, -1, -4, 0, 0, 4, -3, -1, -4, + 0, 3, -3, -3, -3, 0, -3, -1, 2, 1, + -2, 0, 0, -2, 1, -1 + }, + { + -178, 596, -120, -294, 2, -122, -131, 56, -27, -19, + 8, 12, 2, 38, 9, -2, -1, -13, -25, 6, + -28, -19, -18, 5, -17, 5, 25, -12, -2, 0, + -25, -15, -10, -30, 17, 26, -4, -9, 17, 0, + -5, -14, -4, 6, -1, -2, 9, -2, -20, -18, + 7, -10, -10, 13, 3, 1, 1, 4, 4, 11, + -7, 5, 0, -3, 1, -5, -1, 0, -2, -2, + 2, 0, -3, 3, 2, 2, -1, 3, 1, 2, + 0, -1, -3, 2, -4, -3, 1, 0, -2, 1, + -1, 3, 0, -2, -2, 0 + }, + { + 10, 240, -104, -56, -17, -11, -50, 31, -5, -33, + -31, 45, 6, -22, 27, 54, -37, 11, -52, 98, + -2, -42, -6, -35, -4, -22, -3, -23, 0, 20, + -2, 2, 2, 4, -23, 32, 11, 22, -9, 0, + -3, 2, -5, 4, -6, -4, 5, 0, 12, -6, + -7, 5, 5, -5, 8, 0, -1, -2, 2, 3, + -2, 5, 2, -2, -4, 3, -2, 0, 5, 0, + 3, -3, -4, -1, 3, 3, 2, 2, -4, -1, + 0, 0, 4, 2, 0, -1, 2, 0, 2, -1, + -1, 0, -1, 1, -1, 1 + }, + { + -16, -507, 60, 62, -50, 107, 72, -15, 3, -24, + 11, -3, 7, 37, -27, 5, -20, 19, -3, 5, + -18, -37, 17, -16, 7, 23, -24, -27, -12, -3, + 3, 1, 15, -28, -7, 11, -8, 3, 0, 1, + -7, -7, -5, 10, 6, -2, 6, -3, 14, 0, + -15, -10, -2, -2, 0, 3, -5, 5, 6, -10, + 1, 0, 0, -3, 5, 0, 0, -1, 0, -6, + 1, -3, 0, -1, -1, 2, 3, 3, 3, 0, + -1, -3, 1, 3, 1, 4, 1, 1, 0, -3, + 0, -2, 1, 2, 1, -1 + }, + { + 0, -234, -42, 3, 32, -2, 15, -2, -19, -23, + 4, 15, -106, -55, -148, -2, 84, -6, 35, 26, + 120, 29, 24, 37, 82, -2, -27, -35, 66, -4, + 51, -11, -26, 26, 26, 20, -27, 0, -12, 9, + 20, -17, 13, -3, 8, 12, -11, -8, -5, 3, + -7, -7, 11, 0, -6, -1, 11, -5, 1, 3, + 4, -11, 1, 4, 5, 1, 2, 1, -2, -1, + -2, 3, 1, -4, -5, -3, 0, 1, 0, 1, + 3, 1, 1, 2, 0, 1, -3, 2, 1, -1, + 1, -3, -1, 2, -2, -1 + }, + { + -66, -441, -74, -248, 28, 70, -14, -7, -30, 16, + -2, 51, -18, 48, 174, 16, -74, -12, -23, -12, + 1, -20, 27, 28, 31, 41, 5, 18, -12, 15, + -23, 18, -15, -13, -32, -9, 16, -6, 3, -15, + 26, 4, 9, 6, 9, 11, 1, -21, 11, 6, + 2, 5, 0, 7, 2, 2, -8, -12, 6, 2, + -8, 2, -5, 1, -5, 0, -9, -4, -2, 1, + -3, 2, -2, -1, 0, -1, -6, 2, 3, 0, + -1, 1, 5, 0, -1, 4, -2, -2, 1, 0, + -1, 3, 0, 0, -1, 1 + }, + { + -21, -28, 72, 1, -17, -5, 6, -54, -40, -26, + 9, 42, 22, 221, -28, 46, 30, -72, 29, -58, + -25, -24, -3, -117, -30, 4, 47, 28, -25, 32, + 45, 19, -14, 3, 18, -48, 13, 23, -19, 15, + 4, 13, 14, -13, -7, 3, -3, 1, -5, -7, + 2, 6, -2, -4, 10, 3, 4, 2, 4, 5, + 4, 5, -13, -3, 2, 5, 4, -5, 5, 3, + 7, -3, 0, 4, -4, 4, -3, -7, 0, 0, + 2, 0, 4, -5, 0, 0, 0, 2, 1, -2, + 1, 0, -1, -1, 0, 0 + } + }, + { + { + -154, 1931, 738, 22, -25, -4, 21, -8, -28, -2, + -17, -7, 24, 28, 29, -28, -18, 2, 14, -62, + -6, 3, 20, 4, 11, 17, -8, 31, 18, 7, + -22, -5, -31, 10, -14, 24, -22, 13, -37, 0, + -4, -2, 6, -7, 2, -2, -2, 0, 11, 0, + 0, -3, -1, 4, 3, 2, -1, 7, 1, 3, + 0, 3, 3, 5, 0, 6, 3, -7, 2, 0, + 0, 3, -1, -3, 1, 6, 0, -6, 3, -2, + -2, -3, -1, 0, 0, 3, -4, 1, 0, -2, + -1, 0, -1, 1, 1, 1 + }, + { + 6, -257, 148, 1, -42, -28, 29, -17, -21, -20, + -44, -2, -29, -7, -30, -78, 90, -32, -51, 11, + -19, -29, 12, 27, 28, 10, 6, 22, 5, 28, + 41, -11, -10, -37, 16, -23, 14, -1, 14, -3, + 17, 0, 13, -9, 8, 1, 1, -4, -4, 3, + 0, 7, -12, -3, -3, 8, 4, 0, 2, 2, + -2, -2, -3, 6, -4, -1, 3, -7, 1, -3, + 1, -1, 2, 3, 1, -5, 1, 2, 2, 0, + -1, 2, 2, -1, 1, -1, -2, 1, 2, -4, + 2, 1, 0, -2, -2, 0 + }, + { + -137, 1316, -31, 115, -8, 15, 10, -12, 13, 4, + -3, -25, -7, -16, -6, -15, -46, -16, -13, 0, + 6, -1, -37, 22, -16, -20, -9, 0, 3, -10, + 30, 34, -11, -19, -5, 22, 18, -11, 0, 7, + 10, -3, 9, 1, -6, -6, -15, 1, -8, 6, + 4, -9, -10, 3, -9, -2, 1, -3, 1, 4, + 1, -7, -9, 5, 4, -4, -3, -4, 0, -2, + 2, 3, -4, 0, 1, -1, 2, 3, -3, 1, + 4, -1, -2, 4, 2, -2, -1, -2, 1, 0, + -1, 1, 1, -1, 1, 1 + }, + { + -121, -308, -225, -15, 23, 0, -3, -1, -7, -13, + 26, 12, -25, -44, 54, 22, -5, -38, -3, -2, + -2, 7, -14, 10, -10, 9, 18, 13, 1, -17, + -24, 19, 12, -6, 31, -33, 9, -16, -3, -4, + -2, 6, 4, -1, 9, 3, -2, 5, -1, 19, + -11, -4, 6, -10, -6, 2, 0, 5, -14, 5, + 1, 4, -6, 6, -6, -2, 2, -6, 3, 0, + -1, 0, 4, 2, 3, 3, -1, -2, 1, 1, + -4, -2, -4, 2, 1, 0, 0, -2, 3, 1, + 0, -1, 0, 0, -1, 0 + }, + { + 24, 122, -9, 18, -12, 1, 16, 16, -12, -9, + 0, 3, -11, 3, -271, 23, -10, 38, -228, -26, + 9, 63, -4, -52, -36, -47, 70, -34, -11, 18, + -21, -17, -14, 19, -23, -29, -24, 7, 20, -11, + -7, -5, 7, 2, 4, 2, 0, -3, 1, -15, + -9, 2, 3, 4, -3, 10, -3, -2, 2, 0, + 6, 1, -1, 0, -3, -3, 0, 3, 4, -4, + -2, 5, 0, -1, 1, 0, -1, 0, -1, -4, + -1, -3, 3, 3, -1, 1, -1, 0, 1, -1, + -1, 0, -1, 1, 1, -1 + }, + { + -109, -184, -256, 47, -4, -3, 19, -15, 0, 20, + -31, -8, 12, -29, 18, -20, -6, -35, -25, 12, + 9, -29, -32, 15, 1, 3, -21, 10, 23, 3, + -38, 2, 7, 8, 10, -7, -33, 20, 7, 12, + 0, 4, 10, -14, -3, 17, 12, 24, 11, -1, + -4, 10, 1, 2, 1, 8, -5, -5, -5, 4, + 4, -1, -3, -5, 1, 1, 0, 1, 4, 3, + 1, -1, -3, 3, 0, 3, -2, -1, -2, 0, + 0, 0, 2, 5, -1, 0, -1, 0, -4, 4, + 0, -1, -1, -1, 3, 0 + }, + { + 24, -85, -59, 11, 5, 2, -6, 10, -6, -2, + 7, -16, -27, -79, -35, 53, 164, 14, -44, 15, + 15, 3, -101, -38, -32, 4, 39, -62, -16, -5, + 0, -26, 10, 20, -44, 0, -9, -16, 9, 22, + -9, -12, 23, -8, -12, -1, -12, -6, 7, 2, + 3, 1, -4, -4, -1, -2, -4, -2, -5, -1, + 2, 1, 5, -3, -2, 7, 1, -2, -6, 0, + 2, 2, -3, -2, -1, -2, 2, -2, -2, 0, + 3, -1, 0, 1, 1, 0, -1, 1, 0, -1, + 2, 2, 2, -2, 1, 1 + }, + { + -34, 1927, 103, -54, -25, -7, -13, 0, 3, 21, + -13, -21, 42, 32, -43, 12, 39, 15, 27, -2, + -7, 16, -18, -19, -3, 4, 12, -16, -18, -8, + 0, 3, 22, -12, 22, 6, -12, 16, -21, 4, + -6, -5, -7, 23, -3, 5, -17, 3, 2, -10, + -20, -7, -1, 3, 0, -1, -1, -7, -6, 4, + 6, 3, -3, 3, -2, 2, -5, 2, 0, 1, + 2, -3, 2, -2, -6, 2, 4, -8, -3, 3, + -3, -1, 0, -1, 0, 1, 0, 1, 0, 0, + -2, 1, 1, -1, -1, 0 + }, + { + 31, -19, -154, 13, -23, 4, 5, 32, -6, -4, + 3, 4, 11, 70, 23, -61, 120, -21, 40, -54, + -65, 60, -24, 6, -42, -25, 29, -82, 9, -22, + -13, 19, -27, -10, 8, -38, -20, 15, -4, 22, + -14, -8, -2, -3, -14, -15, -3, 0, -1, -9, + -3, -3, 5, 1, -2, -1, 8, -4, -7, -9, + -1, -2, 0, 3, 1, 2, 10, 0, 1, -6, + -1, -1, 3, 5, -1, -3, 3, 0, -1, 1, + -3, 0, 2, 1, 0, 2, -1, -4, 0, 1, + -1, -2, 1, 1, -1, 0 + }, + { + 138, 958, 312, -43, 59, 5, 37, 23, -4, -14, + -18, 8, -28, -2, 54, -5, 40, 12, -62, 8, + 26, -13, 0, 23, 11, -4, -11, -20, -5, 9, + -2, -8, 16, -16, -12, 8, -16, -3, -6, -2, + -16, -4, -1, 9, 14, -12, -16, 1, 2, -6, + -7, 7, -2, -10, 10, 13, 0, -10, 2, 2, + 7, 6, 0, 2, 0, 2, -1, -1, 2, -5, + -2, -2, 1, -1, 1, -1, 0, -3, 4, -4, + 1, 4, 0, -1, 1, 0, -3, 0, -1, -3, + 0, -2, 2, 0, 1, -2 + }, + { + -16, 290, 38, -41, -7, -4, -23, 41, -7, -21, + -51, -17, 2, -44, 22, -48, -95, 83, -89, -56, + 13, -12, 33, -4, 12, 25, -23, -10, -2, 15, + 2, 5, 7, -4, 4, -5, -9, 20, -6, 14, + -2, 14, 6, 0, -2, 7, -1, 1, 2, -10, + 2, 2, 0, -6, 8, 3, 6, -2, -2, 4, + -2, -10, 1, 5, 2, -4, 2, 0, -2, -2, + 1, 0, -1, 1, -2, 0, -1, 3, 5, -3, + 0, 3, -3, -1, 3, 2, 1, 2, -2, 3, + 0, 0, 1, 0, 0, -3 + }, + { + 48, -465, 24, 23, -1, -4, 32, -20, 8, 13, + -14, 39, -5, -11, -32, 1, -19, -12, 8, -9, + 31, -22, 21, -19, 17, -13, 1, -28, 23, -23, + -8, -12, 6, -5, -32, 2, 2, 2, 10, -6, + 6, 3, 11, -6, -9, -8, 11, 1, 10, 6, + -7, -14, 7, -3, 4, -2, -5, 2, -4, 5, + 2, -1, 3, -1, -5, -1, 1, -4, 7, 1, + -2, 2, 0, 0, -1, -2, -1, 0, 2, 1, + -1, -1, -3, 0, 0, -3, 3, 0, 1, 1, + -1, 0, -2, -1, 2, -1 + }, + { + -5, -117, 33, -15, -13, 7, -20, 2, -19, -20, + 0, -40, 114, 301, -20, -79, 43, -15, -13, 6, + -29, 77, -5, -67, 10, 10, 34, 22, 46, -13, + -51, 1, -10, 16, 4, 4, 14, -10, 8, -16, + 5, -9, 19, -14, 17, 17, 5, -3, -6, 4, + -7, -4, -7, 1, -2, -8, -11, 1, -3, -3, + 10, 7, -3, -4, -3, 11, -3, -1, 2, -3, + -1, 2, 4, -1, 0, -2, -4, -2, 2, 0, + -2, 2, 3, 1, 1, 1, 2, -3, 0, 0, + 2, 3, -3, -3, 2, -1 + }, + { + 90, -120, 104, -62, 40, 54, -6, 3, 14, -18, + -30, 11, 6, 4, 33, -31, 16, 1, -10, -21, + 18, 19, -19, 23, -33, 12, 7, 21, -1, -19, + 12, 20, -14, -1, 4, -11, -3, -4, 10, 13, + -4, -10, -6, -9, 0, 5, 7, -4, 11, 9, + -17, 6, -10, -10, -8, 4, 9, 3, 3, 1, + -7, 6, -1, 3, 4, 0, 5, -1, -3, -1, + 2, 0, 1, -5, -1, 1, 1, -2, -1, 2, + 1, -2, 1, 2, 1, 1, 5, -2, -3, 1, + 0, -1, 1, 0, 1, -1 + }, + { + 12, -67, 46, 18, -6, -4, 0, -6, -27, -7, + 6, -18, 8, 169, -324, 68, 107, -1, 42, 14, + 92, 47, -11, -28, 40, 9, 40, 27, -51, 43, + 32, -9, -3, -2, 12, -14, 6, -14, 5, 35, + 5, -19, -8, -10, 22, 1, -3, 6, -1, -7, + 4, 4, -7, -13, 0, 1, 3, -6, 9, 0, + -16, -2, -3, 2, -3, 0, -4, 9, -4, -1, + 4, 3, -5, 1, 0, -3, 4, -1, -1, -1, + 0, 2, 3, 4, -2, 0, -1, -1, 0, 2, + 1, -1, 2, 0, -1, 1 + } + }, + { + { + 242, 2843, 32, 34, -50, 0, 7, -36, -5, 16, + -6, -1, 23, 44, -50, -7, -19, -10, 2, -13, + 13, -28, 7, 2, 11, 6, 4, 8, 33, 19, + 10, -21, -18, -2, 10, 3, 5, 7, -19, -16, + -4, -3, 0, 5, 13, -2, -12, 5, 2, 7, + 5, -3, 1, 3, -6, 1, 3, -3, -4, 10, + -3, -1, -1, 7, 2, 4, 4, -5, 0, -2, + 3, 2, 1, -3, -2, 1, 3, -4, 3, 1, + 1, -1, -1, 1, -2, 3, 0, 0, 1, 0, + -2, 1, 0, 0, 0, 0 + }, + { + 25, -97, 2, -38, -14, -16, 2, -3, -10, -13, + -53, -16, -38, -15, -62, -36, -9, 19, -77, -7, + -14, -6, 6, -11, 61, 32, 18, 8, -6, 9, + 26, 8, -16, -29, 9, -9, 5, 4, -1, 3, + 9, 7, 19, 4, 5, -3, 1, -18, 6, 2, + 0, 10, 2, -2, -10, 4, 2, 4, -5, 2, + 3, 5, -4, -3, 1, -3, 5, 1, -4, -2, + 3, -6, 0, 2, 2, -5, -4, -1, 4, 2, + -2, 1, 2, 0, 1, 2, 0, 0, 4, -3, + 0, 1, 1, 0, -2, -1 + }, + { + 74, 796, 208, 193, -40, 23, 32, -8, -23, 2, + -9, 4, -43, 14, -17, -19, 1, -55, -15, -9, + -14, -15, -35, -8, 24, -11, -3, -12, 8, 9, + 31, -9, -7, -1, -11, 31, 10, 3, -18, -6, + 6, -3, 8, 0, 1, -3, -8, 2, -2, -2, + 2, -2, -10, 9, -3, -6, -4, -1, -4, 4, + 3, -3, -1, -3, 3, 1, -1, -4, 1, -3, + -2, 4, -2, 2, -2, -6, 3, 6, -1, -2, + 1, 2, -1, 0, 1, 0, -1, -2, 1, 0, + -1, -1, 2, 0, -1, 1 + }, + { + 16, -980, 184, -3, 13, 6, 8, 13, -12, -9, + -12, 4, -17, 19, -36, 20, 16, -49, -17, 8, + -8, -8, 17, 1, -16, -1, 32, 19, -2, -18, + -10, 20, 12, 0, 19, -23, 7, -13, 2, -5, + -14, 6, 4, -4, -2, 12, 12, 1, -1, 15, + 3, -15, 4, -11, -1, 2, -5, -1, -9, 0, + 4, 4, -1, 6, -1, 0, 2, -8, 0, 4, + -1, -5, 1, 3, 1, 1, 1, 1, 1, 3, + -1, -1, -2, 1, 0, -1, 2, -2, 0, 1, + 1, -1, -1, 1, -1, 0 + }, + { + -37, -6, 117, 32, -12, 0, 19, 9, 1, 0, + 0, -6, 14, 3, -254, -32, -30, 80, -19, -83, + 15, 39, -34, -31, -38, 2, -42, -24, 2, 6, + -14, 3, -11, 6, -17, 7, -29, -10, 25, 11, + -15, 1, 18, -4, -4, 3, -1, -2, -3, 0, + -1, -18, 9, -2, -5, 5, 4, 1, -2, 3, + 7, 2, -3, 2, 2, -1, 2, -1, 4, 3, + -5, 0, 2, -1, 0, 1, -1, 2, 2, -1, + 0, -3, 0, 2, -1, 1, -1, 0, 0, 0, + 0, 0, -1, -1, 2, 1 + }, + { + 2, -861, 173, 23, -28, 0, 28, -19, -12, 46, + -11, -19, -11, -18, 15, -41, -9, -18, -9, 2, + 27, -9, -30, -11, 9, 5, 0, -14, 16, -1, + -14, -10, 20, 12, -14, -3, 5, 0, 9, 21, + 27, -10, -7, -11, 4, 12, 8, 11, 13, 10, + -12, 0, 11, 11, -5, 5, 7, -4, -4, 3, + -2, 2, 0, -3, -2, 0, 2, -1, 5, 3, + 0, 0, -3, 1, -1, 3, 2, -1, -2, -2, + 0, -2, -1, 4, 1, 2, 0, 3, -3, 1, + 0, -1, 0, -1, 0, 1 + }, + { + 4, 15, -54, -9, 2, 2, -17, 13, 5, -5, + -4, -20, -28, -148, -46, 169, 59, 11, -25, 2, + -6, 39, -73, -121, -25, 20, -10, 6, -36, 7, + 11, -8, -22, 19, -8, -11, -15, -2, 17, 24, + -11, 1, 12, -17, 0, 8, -6, -2, -1, 0, + 6, -1, 2, -4, -4, -2, 2, -8, -3, -4, + 4, -2, 2, 1, -2, 2, 6, 3, -7, -4, + 1, 4, -1, 0, 3, 1, 2, 1, 0, -2, + 2, 0, 2, -2, 1, 1, -2, 0, -2, -3, + -1, 1, 2, -1, 0, 2 + }, + { + 73, 1956, -62, -69, -4, -2, -31, -11, 25, 8, + 17, -27, 14, 3, 25, 14, 35, -14, 12, 37, + -18, 3, 2, -17, -10, 5, 14, -12, -43, -2, + 4, -11, 40, -17, 9, 31, -14, 7, 23, -19, + 4, -22, 10, -4, 2, 4, -14, -10, 1, 1, + -14, -17, -15, 1, 7, 5, 3, -5, -11, 0, + 3, 2, 2, 0, -3, -2, -3, 3, -1, 1, + 1, -3, 3, 1, -2, -4, 6, -2, -4, 2, + -3, 0, -2, 0, -1, 0, 3, 1, 0, 0, + 0, 1, 1, 0, -2, -1 + }, + { + 3, 68, -64, -24, -11, -3, 7, 28, 18, -13, + -14, 5, 26, 61, 73, -177, 76, -9, 0, -34, + -36, 25, 48, -36, 1, -61, -10, -49, 37, -46, + -21, 0, -3, 5, -16, -20, -1, 5, -1, -2, + 27, -11, -5, 3, -6, 4, -2, -2, -6, -9, + -5, 6, 1, 2, -4, 1, 9, -2, 0, -6, + -3, -7, -1, -3, -1, 0, 2, -1, 1, -6, + -3, -5, -2, 8, 2, -3, -1, 3, 0, 1, + -1, -4, 1, 1, 1, 1, 3, -1, -2, -1, + 1, -2, 0, 1, -1, 1 + }, + { + -102, 1161, 348, 86, 14, 70, 73, -26, 20, 5, + -10, 3, -5, -35, 24, 11, 44, 8, -42, -8, + 31, -9, 14, 11, 23, -6, -14, -4, -11, 0, + 8, 16, 6, 11, -4, -16, -15, 4, -21, 1, + -6, 6, -13, 5, 10, 3, -16, -5, 2, 4, + -4, 9, 7, -6, 4, 9, 8, -11, 2, -6, + 7, 7, 0, 4, -2, 4, -1, -1, 2, -3, + -4, 1, 3, -1, 1, -2, 2, -3, 1, -2, + -2, 2, 2, -1, 3, 4, 0, 0, 1, -2, + 1, -4, 1, 1, 2, -1 + }, + { + 9, 207, 89, -34, -14, 0, 13, 17, 10, -2, + -30, -7, -30, -63, -11, -18, -48, -20, -23, -88, + -18, 2, 49, 5, 28, 11, -13, 16, -19, -13, + -10, 1, 9, -7, 11, -10, -20, 8, 2, 15, + -1, 1, 20, -2, 1, 8, 0, 7, 2, 0, + 6, 0, -6, -8, -1, 9, 0, 2, 0, 0, + 2, -7, -2, 4, 4, -2, 0, 5, -3, 0, + 0, -2, -1, 1, -1, -1, -4, 0, 4, -1, + 0, 4, -1, -3, 0, 2, -1, 1, -2, 0, + 1, 1, 1, 0, 1, -2 + }, + { + -95, -312, -4, 9, 39, -84, 42, 7, -9, 39, + -47, 12, 7, -24, -30, -23, 9, -22, 3, 5, + 10, 9, 1, -5, 15, -12, 7, -26, 11, -2, + -13, -12, -24, 10, -12, -33, -6, -12, 10, -1, + 3, 10, 7, -4, -9, -3, -2, 11, 1, 0, + 8, -6, -3, 0, -4, -1, -5, 0, -7, 6, + 3, 1, -1, 2, -5, 0, -1, -4, 2, 5, + 0, 1, 1, 1, 1, -1, -2, -1, -1, 0, + 0, 3, -1, -1, 0, -3, 2, 0, 1, 2, + 0, 2, -1, -1, 1, 0 + }, + { + 10, -35, -26, -53, 11, -2, -17, -10, -24, 4, + 3, -14, 34, 290, 42, -26, -28, -7, -36, 50, + -99, 5, 60, -65, 12, 12, 15, 60, 11, 29, + -65, -19, 3, 7, -4, -18, 19, 7, 17, -10, + -15, 10, 11, -7, 20, 6, 11, 2, 3, -7, + -5, 3, -4, 2, -4, -1, -13, 0, 4, -8, + 0, 11, 2, -1, -7, 7, -1, -3, 3, 0, + -1, 0, 1, 1, 3, 1, -1, 0, 0, -1, + -3, -1, 2, -1, 1, 0, 2, -2, 0, 1, + 0, 4, 0, -3, 1, 2 + }, + { + -50, 133, -97, 73, -6, -70, 83, 33, 28, -22, + 35, -37, 32, -3, -38, -25, 10, -18, -3, -30, + 9, 36, -15, 12, -21, 3, 7, 23, 11, -11, + 22, -14, -6, -10, 10, -10, -10, 5, -2, 10, + -10, 1, 0, -12, -10, 1, -7, 2, 5, 3, + -11, -3, -4, -6, -11, 2, 4, 8, -4, 0, + 1, -3, 4, -4, 4, -4, 5, -1, 0, -2, + 3, 0, 1, -2, -2, -2, 2, -2, -4, 0, + 0, -2, -3, -1, 1, -3, 4, 2, -2, -1, + 0, -3, 0, 0, 1, 0 + }, + { + -20, -53, 6, 9, 16, -1, -20, 49, -58, -15, + 10, -16, 26, -27, 94, 91, 19, 15, -23, 56, + 73, 46, -17, 38, 49, -8, -11, 13, 29, 13, + 27, 3, 3, -10, -6, 3, 5, -19, 15, 20, + 20, -11, 6, -10, 7, 6, 1, 1, 2, -7, + 5, 2, 1, -10, -11, 0, 2, 3, 4, 14, + -7, -6, 1, 4, 0, -2, -7, 7, -1, 1, + -3, 6, 3, 0, 2, -3, 1, 4, 0, 0, + -2, 0, -3, 4, -1, 0, 0, -2, -1, 1, + 0, -2, 2, 1, 0, 0 + } + }, + { + { + -307, 2388, 141, -97, 56, -2, -31, -16, 6, -8, + 31, 32, -16, 11, -72, 44, 8, -7, -11, 54, + 48, -4, -12, -11, 6, 5, -20, -8, 3, -2, + 26, -12, 8, 3, 21, -19, 4, 7, 13, 14, + 10, -4, -2, 3, 4, 1, -4, 1, 0, 8, + 9, -3, -2, 1, -6, 4, 4, -6, -12, 0, + 3, 1, -2, -3, 0, -2, -1, 3, 2, 0, + 2, -2, 1, 3, 0, -6, -1, 2, -3, 3, + 1, 2, 1, 1, 1, -3, 4, -2, 0, 1, + 0, -1, 1, -1, -1, 0 + }, + { + -27, -100, 94, -77, 11, 6, 13, -16, 17, 1, + -15, -4, -25, 39, 37, 5, -55, 48, 22, -2, + -2, 8, -19, -46, 15, 25, 3, 18, -3, -36, + -10, -13, -13, -8, -14, 8, 2, 0, 6, 10, + -4, -4, 10, 8, -11, 2, 2, -11, 7, 3, + 9, 1, 5, 4, 8, -10, -12, 2, -2, -3, + 1, 6, 1, -4, 1, 3, -3, 6, -1, -3, + 1, 0, -2, -5, 1, 3, -3, -3, 0, 2, + 3, -2, -2, 1, -1, 2, 2, 0, 0, 3, + -1, -2, 0, 2, 1, 0 + }, + { + -38, 630, 159, 161, 64, 25, 19, 18, 6, -11, + -1, 40, -29, -13, 12, -9, 29, -24, 56, -7, + 9, -6, -17, -12, 13, -10, 18, 14, 15, 9, + 23, -56, -16, 7, -10, -8, 2, 2, -13, -8, + -4, -23, -12, -1, -12, 7, -6, -1, 1, -4, + -16, 0, 8, 8, 3, 5, -2, 4, -4, 2, + -5, 4, 5, 4, -6, 1, 3, 0, -2, 2, + 0, -4, -2, 5, -1, -2, -2, -1, 2, -2, + -1, 0, 2, -1, -4, 2, 2, 2, -2, 0, + 1, -1, 0, 0, -1, -1 + }, + { + 189, -870, 58, -81, -17, 7, 12, 5, -3, 19, + -11, -15, -21, 33, -13, 3, 16, -11, 1, -3, + -10, -16, 25, 8, -5, 2, -13, 31, -21, -7, + 9, 11, 4, 6, 2, -4, 10, -1, -7, -1, + -2, -1, -7, 5, -15, -9, 14, -3, 2, -1, + 6, 2, -4, -1, -1, 1, -2, 1, 6, -3, + -3, 2, 3, -3, 4, 3, 0, 4, -4, 3, + 4, 1, -7, -1, 0, -3, 0, 2, 0, 1, + 2, 2, 3, -1, 0, 0, -1, 2, -3, -1, + 1, 2, -1, 0, 1, 0 + }, + { + 38, -59, -60, -6, 14, 2, -2, 9, 11, 8, + 5, -5, -10, 10, -144, 36, -49, -24, 208, -23, + 30, -30, -24, 37, -38, 31, -81, -21, -19, 17, + 37, 36, -17, 11, -1, 21, -42, -9, 2, -7, + -4, -10, 12, -4, -13, 1, 5, -2, 8, -1, + 9, -10, -3, 7, 0, -1, -4, 8, 4, -2, + 2, 3, -3, -3, 0, 2, 1, 4, 2, 0, + 3, -2, -2, 0, -1, -2, 1, -1, 0, 4, + 1, 3, -1, -5, 2, -1, 1, 1, -2, 1, + -1, 0, 2, -1, -2, 0 + }, + { + 227, -760, -42, 16, -21, 1, -17, 28, -17, -28, + 30, -1, -17, -7, 33, 4, 15, 1, 33, -9, + -1, 8, 10, -6, -13, -5, -12, -5, 2, -6, + 23, 11, 11, -8, -14, 4, 21, 8, -2, 11, + 13, -14, -10, 6, 3, -7, -7, -7, -2, 6, + 5, -13, 0, 1, 7, -7, 4, 5, 6, 1, + -8, -1, 3, 5, 4, -3, -1, 2, 1, 0, + 0, -1, 2, -3, 0, -1, 3, 2, -1, -2, + 2, 0, -2, -4, -1, 1, 1, -1, 3, -2, + 0, 0, 0, 1, -2, 0 + }, + { + -20, -41, 51, -2, 3, -5, -17, 6, 11, 0, + -8, 0, 18, 96, 65, 81, -28, 5, -43, -53, + -17, 27, -56, -24, 18, 41, -32, 70, -5, 24, + -4, 11, -20, -26, 8, 20, -13, -8, -5, -9, + 5, 10, -5, -10, -13, 4, 7, 3, -2, 2, + -4, -6, 3, 3, 0, -3, -1, 3, -3, -5, + 4, -2, -5, -1, -4, -1, -2, 3, 2, 1, + -8, 0, 3, 0, 1, 3, -1, 2, 2, 0, + 0, 1, 1, -2, -1, 0, 2, -2, -1, 0, + -2, -1, -1, 1, 0, 0 + }, + { + -228, 1877, 2, -59, 14, -3, 9, -9, 13, -11, + 27, 21, -19, -25, 57, 17, 4, -2, -48, 8, + 18, -18, -18, 5, 3, -5, 19, 8, -15, -6, + 2, -20, 6, -28, -16, 22, 16, 15, 28, -6, + 5, -12, 12, -1, -16, 4, -2, 2, -8, 10, + 4, 9, -5, -10, 1, -3, 4, 1, -1, 1, + -5, -5, 1, 2, 3, -2, -2, 1, 0, -2, + 0, 1, -1, -1, 5, -1, -5, 4, 0, -1, + 2, 2, -2, 0, -1, 0, -1, 2, -1, 1, + 0, -1, 0, 1, 1, 0 + }, + { + -29, -45, 88, -13, 14, -1, -1, -16, 17, 7, + -6, 0, -5, -23, 105, -55, 108, -63, -13, 5, + -11, -13, 103, -8, 68, -16, -46, 21, 12, -29, + 32, -23, 4, 0, -35, 12, 14, -8, 16, -16, + 10, 1, -7, 4, 3, 12, -9, -1, -5, 2, + 1, 5, -8, -1, 5, 5, -6, 2, 7, -3, + 6, -1, -3, 0, -3, -4, -4, -9, 3, 1, + 1, -2, -5, -3, 1, 0, -1, 2, 3, -1, + 3, 0, -4, -1, -1, -2, 1, 4, 0, -1, + -1, 0, -1, 0, 0, 0 + }, + { + 40, 1055, -185, -10, -1, 68, 8, -30, -2, 3, + 1, -19, 18, -11, -60, -4, 7, 2, 9, 4, + -2, 1, -3, -13, 3, 18, 6, -16, -7, 2, + 4, 18, -18, 5, 27, 4, 0, 7, 5, -10, + -10, 0, -7, -6, -20, 13, 6, -8, -9, 0, + 10, -2, 2, 13, -3, -7, 12, 4, -1, 0, + -4, 3, -3, -1, 1, 0, 1, 1, -5, 0, + 0, 2, -2, 1, 0, 1, 0, 2, -2, 3, + -2, -2, -1, 1, -1, 1, 2, 0, 0, 2, + 0, 1, -1, -1, -1, 2 + }, + { + -2, 133, -27, -36, -16, -2, 10, -24, -15, 9, + 16, 39, -36, -37, -49, 18, 14, -57, -17, 58, + -25, -45, 29, 9, 30, -3, 19, 13, -10, 0, + -10, -5, -5, -2, -8, 14, -10, 2, -4, -2, + -6, -13, 11, 2, 5, -1, 0, 2, 3, 4, + 2, 3, 1, -3, -6, 3, -8, 1, 8, 1, + -1, 5, -1, -2, -4, 4, -4, 1, 2, 1, + 2, -2, -3, -1, 2, 1, 0, -1, -6, 1, + 0, -1, 4, 1, -2, -2, 0, -2, 1, -3, + -1, 1, -1, 1, 0, 2 + }, + { + 105, -6, -68, -71, -21, -39, -24, -12, -7, 20, + 10, -19, -8, 4, -11, -17, 16, 0, -21, 20, + -26, 13, 13, 8, -15, -6, -18, 7, 6, 23, + -12, -2, -15, -7, 16, -8, 2, -6, -3, -3, + -15, 10, -8, -4, -4, 6, -4, 3, -7, -10, + 5, 6, -9, 7, -10, 4, 2, 3, 2, -6, + 4, 4, -5, 0, 5, 2, -3, 0, -3, -2, + 5, -2, 0, 0, 2, 2, -1, 0, -2, -3, + -1, 0, 2, 1, 0, 3, -2, 0, 1, -2, + 1, 0, 2, 1, -1, 0 + }, + { + -11, 10, 90, -30, 23, -8, 32, -19, -24, 6, + -8, 20, -124, 44, -70, 52, -25, 6, -6, 30, + 25, -57, 94, 15, 12, -12, 2, 28, -7, 21, + 24, 0, 11, -12, 4, 1, -22, 11, -8, -5, + -18, 10, 12, 1, 0, -9, 1, 5, 10, -7, + -1, 3, 8, -1, -6, 5, 7, -2, 5, -1, + -6, -8, 3, 1, 1, -1, 2, -1, -2, 3, + 0, 0, -2, 1, -2, 2, 5, 3, 1, 0, + 2, -2, -2, -1, -1, 0, -2, 2, 0, 1, + -1, -2, 2, 3, -3, 2 + }, + { + -7, 241, -100, 37, -20, -115, 8, 5, -2, 10, + 14, -34, 47, 3, 21, 41, -9, -7, -9, -22, + -7, -2, 2, -18, -8, -23, -26, 16, 0, 26, + 16, -3, 10, -7, -5, -2, -8, -5, -3, -3, + 9, 3, 9, -2, -2, 0, -21, -19, -5, -10, + 10, -4, 0, 9, -3, 2, -5, -3, -3, -1, + 6, -7, 1, -2, 0, -3, -4, 2, 0, 1, + -2, 2, -1, 3, 0, -2, -3, 3, 1, -2, + -2, 2, 0, -4, -1, -1, -3, 2, 3, -1, + -1, 1, -1, 0, -1, 2 + }, + { + 24, -35, -100, -25, 9, -4, -3, 40, -40, 8, + 5, 3, -30, -51, 432, 158, -26, 20, -48, 5, + 18, -2, 8, 18, 24, -9, -29, -21, 31, -14, + 6, 20, 6, -12, 0, -20, -6, 3, 8, 15, + 7, -3, 21, -1, -20, -1, -9, -9, -1, 0, + 2, -2, 5, 2, -2, -3, -2, 11, -9, 8, + 9, 2, -4, 0, -1, 2, 4, -8, 3, 2, + -3, -3, 3, 2, 0, 7, -3, 1, 2, 1, + 1, -1, -3, -4, 2, -1, 0, 1, 0, -2, + 0, 0, -1, 1, 1, 0 + } + }, + { + { + 205, 1711, -348, 81, 41, -8, -32, 4, -11, -17, + 21, 22, 3, -24, 0, 9, 54, -24, 0, 27, + 43, 17, -12, -8, 2, 3, -6, -27, 8, -19, + 7, 7, 10, -3, 9, -7, -4, -13, 20, 15, + 16, 4, -14, 2, -2, -6, 1, 4, -2, 3, + 10, 3, -4, -1, -1, 8, 2, 0, -5, -5, + 4, 0, 5, -5, -1, -2, -2, 2, 2, 1, + 2, -3, -1, 4, 1, -2, -3, 1, -2, -1, + -1, 1, 1, -1, 3, -3, 0, -1, -1, -1, + 1, 0, 1, 0, 0, 0 + }, + { + 13, -64, -3, -12, 0, 7, 17, -22, 1, 1, + 3, 3, -17, -2, 106, 30, -14, 5, 42, 16, + 3, -18, 5, -22, -33, 13, 16, -13, 2, -16, + -19, -3, -6, -4, -18, 6, 1, -22, 6, 27, + -6, -10, -10, 17, -12, 4, 0, -4, 5, 4, + 10, -5, 0, 0, 10, -5, -5, -3, 2, -2, + -3, -1, 3, 0, 2, 4, -6, 1, 0, -1, + -1, 4, -1, -2, -2, 4, 2, -1, -3, 0, + 3, -1, -2, 1, 0, -1, 1, 0, -3, 3, + 0, -1, -1, 0, 1, 1 + }, + { + 35, 537, 164, 67, 78, 24, 8, 19, 25, -10, + -16, 22, 13, -26, 7, 20, 11, -9, 31, 53, + -12, 9, 11, -8, -10, -29, 32, -8, 16, 24, + -4, -28, -37, 6, 3, -8, -4, -8, 10, -17, + -3, -30, -6, -13, -2, -4, -2, -4, 0, -9, + -11, -2, 8, 0, 5, 3, 2, 3, 0, -1, + -2, -1, 2, 8, -5, -2, 1, 0, -1, 1, + 2, -4, -1, 2, 2, 3, -3, -5, 2, 1, + -1, -1, 2, 1, -4, 0, 1, 1, -1, 0, + 1, 1, -1, 0, 0, -1 + }, + { + -358, -205, 93, -129, 14, 12, -7, 5, 0, 20, + 13, -7, -31, 19, 9, 2, 6, -2, 17, -1, + -4, -13, 5, 14, 0, 24, -19, 25, -36, -5, + 14, 1, -7, 15, -5, 12, -5, -1, -4, -9, + 2, 3, -10, 11, -7, -20, 0, 5, 1, 0, + -3, 10, -8, 7, -6, 0, 2, -1, 6, 2, + -4, 1, -1, -6, 0, 2, 1, 6, -2, 0, + 5, 5, -3, -3, 0, -1, -1, 1, -1, 0, + -1, 2, 3, -1, -1, 1, -2, 2, -1, -2, + 0, 2, 0, -1, 1, 0 + }, + { + -22, -116, 49, -11, 8, 6, 8, 0, 1, 16, + 0, -4, -4, -58, 5, 70, -74, -67, 84, 32, + 4, -44, -13, 22, 5, -4, -20, 23, -18, -3, + 34, 14, -7, 5, -15, 5, -31, 2, -15, -8, + -5, 2, -15, -3, 1, -4, 8, 0, -4, 3, + -2, 7, -5, 4, 4, 2, -4, 6, 6, -2, + -3, 4, 0, -7, -5, -1, 2, 5, 0, -3, + 6, 2, -5, 1, -1, -2, 0, -4, -3, 1, + 0, 4, 2, -5, 1, -1, 1, 1, -1, 0, + -1, 0, 2, 0, -2, -1 + }, + { + -394, -20, 38, 64, -21, 1, -15, -3, 14, -40, + 7, 4, 2, 3, 8, 40, 8, 9, 16, 2, + -25, -4, 18, 4, -14, -17, -2, -3, 3, -7, + 24, 26, 5, -14, -13, 6, 13, 11, -1, -1, + -15, 0, 4, 11, -9, -15, -2, 4, -2, -2, + 8, -9, -5, -7, 8, -3, -1, 2, 3, 1, + -4, -3, 2, 4, 1, 2, -2, 3, 0, 0, + 1, -1, 3, -3, 1, -1, 0, 1, 1, 1, + 1, 3, 0, -5, -2, -1, 0, -2, 3, 0, + -1, 0, 0, 2, -1, -1 + }, + { + -4, -90, 16, 27, 6, -2, -9, -3, 6, 7, + -6, 5, 17, 80, 118, 52, 19, -8, 0, -33, + -11, -15, -74, 75, -4, 21, 2, 34, 17, 2, + -5, 11, -3, -24, -8, 20, -18, -8, -12, -24, + 9, 6, -4, -3, -13, -5, 3, 1, -3, 3, + -4, -1, -4, 3, 3, -4, -6, 6, -1, -3, + 2, 3, -5, -3, -2, -1, -4, -1, 3, 4, + -5, -2, 3, -1, -2, -1, -1, -1, 1, 3, + 0, 0, -1, 0, -1, 0, 2, 0, 0, 2, + 0, 0, -2, 2, 0, -1 + }, + { + 428, 1200, -123, -14, -22, 0, 9, 12, -7, -4, + -1, 33, -9, 0, 16, 22, -9, 26, -28, -22, + 13, 2, -24, 1, 9, -4, 10, 3, -7, 0, + 5, -8, -19, -13, -23, 3, 24, 19, 7, 12, + -7, 2, -1, 1, -2, 1, -1, 9, 2, -4, + 4, 17, 7, -8, -3, -6, -2, -1, 3, 5, + -7, -2, 0, 0, 6, -1, -1, -1, 1, -1, + 0, 2, -3, -4, 3, 2, -6, 0, 2, -1, + 1, 2, 0, 0, 0, 0, -3, 0, 1, -1, + 1, -1, -1, 0, 1, 1 + }, + { + -7, -120, 45, -21, 7, 3, -8, -14, 11, 7, + 7, 7, -3, 36, -11, 139, 29, -26, -60, 10, + 12, 4, 27, 57, 14, 40, -49, 17, -23, 6, + 34, -13, -14, 0, -30, 7, 18, -7, 8, 1, + -22, -2, 4, -7, -4, 0, -10, 5, 2, -5, + 3, -1, -4, -4, 8, 4, -10, 3, 1, 3, + 3, 3, -2, 4, 0, 1, -4, -4, -1, 3, + 6, 0, -2, -5, -3, 1, 0, 2, 3, -1, + 1, 3, -1, -2, -1, -2, -3, 2, 2, 0, + -2, 1, 0, -1, 0, -1 + }, + { + 24, 907, -101, -52, -8, -6, 2, 17, -22, -5, + -3, -27, 6, 34, -73, -8, 10, -1, 12, 12, + -9, 3, -11, -6, -10, 2, 19, -15, -9, 3, + -1, 2, -14, -5, 18, 15, 12, -2, 17, -15, + -6, -14, 1, -6, -10, -9, 13, -4, -11, -9, + 7, -7, -7, 15, 5, -8, 5, 9, -3, 4, + -1, -1, -3, -3, 4, -2, -1, 2, -4, -1, + 2, 1, -3, 1, 0, 2, -2, 2, -1, 3, + 1, -1, -2, 0, -3, -2, 0, 0, -1, 1, + -1, 3, 0, -1, -2, 0 + }, + { + 7, 71, -80, 13, 7, 6, -34, -20, -20, 1, + 22, 0, 3, 6, -95, -1, 15, -7, -35, 85, + -12, -19, -15, -1, 13, 10, 10, 2, 0, 21, + 8, -9, -8, 3, -6, 12, 7, -1, -6, -6, + 4, -6, -6, 2, 5, -3, 0, 0, 2, -4, + -2, 1, 4, 6, -2, -2, -4, -3, 6, 3, + -3, 2, 1, -1, -8, 4, -1, -4, 1, 2, + 1, 1, -1, -2, 1, 1, 4, 1, -5, -1, + 1, -2, 3, 2, 0, -2, 1, -1, 3, -1, + -1, 0, 0, 1, -1, 1 + }, + { + -45, 146, -12, 1, -85, 21, -40, -2, 4, -27, + 43, 2, -21, 24, 6, -22, 4, 13, -25, 7, + -19, 1, 16, 4, -23, 5, -20, 14, 4, 6, + 3, -5, 3, -12, 6, 22, -5, 8, 4, -11, + -12, 5, -3, -9, 0, 3, 0, 4, -5, -12, + -4, 6, -4, 4, -7, 5, 6, 1, 6, -4, + 0, 5, 0, -4, 4, 2, 0, 2, -1, -5, + 3, -1, -2, 0, 0, 1, 0, 1, 1, -3, + 0, -2, -1, 1, -1, 3, 0, 0, 1, -3, + 1, -2, 1, 1, -1, 0 + }, + { + 11, 39, 48, -2, 4, -2, 27, -5, -20, -8, + -7, 0, 24, -57, -170, 41, 65, -4, 3, -3, + 78, -26, -16, 30, 59, -6, -15, 34, 4, -13, + 57, 27, -4, -5, -1, 18, -28, -6, -8, -5, + -5, 3, 10, 8, -8, -8, -6, 0, 7, -2, + 2, -3, 7, -3, -4, 1, 4, 4, -2, 6, + -1, -13, -2, 0, 4, 1, 0, 1, -2, 1, + 1, 1, -2, 0, -2, -2, 3, 2, 2, 1, + 3, 1, -2, 2, -1, 0, -3, 1, 2, 0, + 0, -3, -1, 3, -2, -1 + }, + { + 42, 197, -116, 69, 5, 20, -121, 7, -15, 20, + -38, 7, 7, -12, 90, 36, 5, 26, -16, -1, + -8, -21, -6, -14, -10, -22, -19, 12, -28, 35, + 5, 5, 16, 12, -20, 4, 9, -12, -4, -9, + 11, 2, 5, 2, 6, 1, -7, -20, -3, -14, + 11, 1, -4, 6, 4, 2, 0, -5, 1, -1, + 4, -3, -4, 3, 0, 1, -3, 1, -1, 1, + -2, 3, -2, 2, 1, 1, -3, 2, 4, 0, + -1, 2, 3, -1, -2, 2, -3, -1, 2, 0, + -1, 2, -1, 1, -1, 1 + }, + { + -12, -12, -31, -18, -17, 0, 1, -7, -14, 20, + 0, 18, -3, 99, 73, 173, 8, 0, -61, 15, + 32, -52, 30, 34, -18, -11, -29, -2, 15, -5, + -3, 21, 6, -25, 3, -3, -25, 16, -7, 15, + 3, -3, -3, 4, -12, -9, -8, 1, -4, -4, + -2, 0, -2, 3, 3, 1, -2, 4, -7, -8, + 8, 2, -4, -6, -1, 2, 9, -6, -1, 1, + 0, -5, -2, -1, -1, 6, -1, -1, 0, 1, + 4, 0, 1, -4, 0, 0, 0, 1, 1, -1, + 0, 1, -1, -1, 1, 1 + } + }, + { + { + -122, 1545, -310, 77, 10, 0, 9, 8, -2, 1, + -17, -22, 5, -3, 80, -37, 8, -25, 15, -20, + 8, -3, -5, -12, 8, 2, 17, -22, 9, -23, + -4, 19, 3, -5, -11, 5, -6, -22, -5, -2, + 18, 19, -5, 2, -3, -10, -5, 14, 8, 6, + 2, 1, -2, -1, -1, 1, -4, 3, 5, 3, + -2, -4, 1, 2, 2, 3, 4, -3, 1, 0, + 3, 0, 0, 0, -1, 5, 1, -3, 5, -1, + -1, -2, -1, -2, 0, 3, -4, 2, 0, -1, + -1, 1, -1, 0, 1, 0 + }, + { + -8, 90, 58, 21, -5, -4, 3, -5, -17, 12, + 4, 15, -21, -15, 88, 6, 19, -31, -76, -5, + -11, -29, 53, 6, -51, -35, 17, -35, 9, 12, + 12, 44, -7, -15, 7, -1, 8, -29, -10, 20, + 8, 5, -13, -6, -5, 2, 0, -1, 11, -3, + -5, -1, -2, -7, -10, 4, 9, 1, 2, 5, + -5, -6, -2, 2, 4, 1, 3, -3, -4, 0, + 1, -2, 0, 4, 0, -2, 2, 2, 1, -1, + -3, 2, 2, 0, 1, -1, -1, 0, 1, -3, + 1, 2, 0, -2, -2, 0 + }, + { + -22, 476, 208, -16, -101, -26, -23, -4, 4, 11, + 2, 2, 3, 5, -20, 25, 8, -5, -43, 52, + 7, 54, 14, 3, 7, -17, 13, -34, 23, 7, + -18, 25, -21, 1, -3, 12, -6, -11, 7, -16, + 1, -9, 20, -12, 11, -10, 8, 2, 1, -9, + 0, 3, -1, 0, -1, -5, 5, -4, -4, 0, + 4, -7, -1, -1, 4, -3, -5, -1, 4, -1, + 1, 3, -1, -2, -1, 0, 2, -1, -2, 1, + 0, 1, -2, 3, 1, -1, -1, -2, 1, -1, + -1, 1, 1, 0, 1, 1 + }, + { + 392, 668, -48, -162, -11, 3, -30, 9, -12, 1, + 23, 7, -33, -15, -24, 3, 7, -23, 1, 14, + 1, -1, -8, -2, 1, 19, 20, 25, -1, -4, + -12, 2, -10, -6, -11, 4, 8, -22, -3, -17, + -6, 10, -8, 2, 7, -3, -11, 4, 0, 11, + -4, 3, 1, 4, -2, 0, 3, 2, -3, 3, + 1, 1, -5, 2, -6, -4, 2, -5, 3, -1, + -2, -1, 4, 1, 1, 2, -2, 0, -1, 1, + -2, -1, -2, 0, -1, 1, 0, -2, 2, 1, + 0, -1, 1, 0, -1, -1 + }, + { + 14, -252, -47, 17, -16, 3, 11, -2, 2, 16, + 0, 6, 13, -5, 119, 90, 7, 39, -223, -23, + -6, -10, -13, -36, 16, 18, 98, 26, -46, -47, + -14, -8, 9, 3, -3, -8, -9, 20, -2, 13, + -9, 12, -10, -5, 11, 4, 4, 11, -6, -2, + -11, 7, 10, -5, -2, 2, -1, 0, 3, 4, + -2, 1, 2, -1, 2, -4, -3, -1, 1, -1, + -2, 1, -2, 0, -1, 2, -1, 0, 0, -3, + -1, -2, 2, 2, -3, 1, -1, -1, 2, 0, + 0, 0, -1, 0, 2, 0 + }, + { + 388, 965, 7, 148, 57, 2, 27, -49, 29, 39, + -32, -19, 4, 16, 24, 26, -2, 15, -5, 19, + -1, -27, -12, -3, 3, -13, 10, 2, 20, -7, + -10, 4, 16, 5, -13, 10, -1, -5, -3, -8, + -16, -9, 6, -2, -13, -8, -7, 4, 1, -2, + -5, 10, 5, -5, -8, 8, 4, -5, -7, 1, + 1, 2, -1, -4, -5, 4, 0, -1, 2, 1, + 0, -1, 0, 1, -1, 2, -2, -3, 0, 1, + -1, 1, 1, 2, 0, -1, -2, 1, -3, 2, + 0, 0, -1, -1, 2, 0 + }, + { + 15, 25, -31, 13, -2, 2, 4, 10, -4, 7, + 4, 0, -15, 25, 88, -101, -35, 26, 35, -8, + 19, -26, -76, 64, 2, 20, 24, -21, 15, -7, + -2, 18, 6, 15, -15, 2, -9, 8, -4, -7, + -8, -14, 9, -2, 8, -2, -9, -1, -1, 1, + 3, 2, -6, -5, 0, 0, 0, -3, 1, 1, + 1, -1, 2, 4, 0, 0, 1, -2, -4, 1, + 4, 3, -1, -1, 1, -3, 1, -1, -2, -1, + 2, 0, -1, 0, 0, 0, -2, 2, -1, -1, + 1, 2, 1, -1, 0, 0 + }, + { + -513, 21, 162, 21, -16, 2, -18, 27, 1, 3, + -27, -25, 21, 32, -10, 17, -19, -4, 43, 6, + -22, 29, 13, -5, -7, 12, -2, -3, -17, 6, + 16, -1, 3, 5, -6, -6, -12, 2, -11, -4, + -6, 6, -1, -12, 14, -13, -17, -1, 10, -6, + -2, -8, 2, 12, -2, 1, -1, -2, -3, 2, + -2, 6, 3, -4, 0, 2, 1, 0, -1, 2, + 2, 0, 1, 0, -5, -2, 5, -6, -2, 1, + -2, -1, 1, 0, 0, 1, 1, -2, 1, -2, + 0, 1, -1, 0, -1, 0 + }, + { + 28, -6, -102, -13, -13, 3, 3, 4, -10, -8, + 0, 0, -24, -17, -50, 121, -125, -13, 20, 13, + -25, 38, -59, 40, -33, 31, 46, -27, 12, 24, + -20, 12, -21, 25, 16, -7, 15, 6, -14, 13, + -14, -16, 10, -3, -12, -11, -1, -1, -1, -10, + 0, -2, 7, -3, -3, 2, 6, 2, -4, 3, + -4, 0, 3, -1, 2, 8, 2, 5, 0, -1, + 1, -1, 4, 5, -4, -1, 0, 3, -1, 0, + -4, 0, 4, 1, 1, 1, -1, -2, -1, 1, + 0, -1, 0, 0, 0, 0 + }, + { + -47, 630, -53, -4, 11, -40, 15, 11, -5, 6, + -15, -17, -17, -1, 8, 6, 16, -11, -20, 8, + 22, -8, -5, 5, 6, -4, 7, -11, -10, -2, + 10, 0, -2, 4, -5, 1, 8, -4, -1, -3, + 1, -4, -7, -2, 13, -16, 0, -2, -1, -6, + -10, -1, -5, -9, 5, 1, -1, -2, -1, -4, + 8, -1, -2, 0, -1, 2, -2, 1, 2, -3, + -1, -1, 1, -3, 0, 0, 1, -3, 3, -2, + 0, 2, 2, -2, 1, 0, -3, -1, 0, -3, + 0, -1, 1, 1, 1, -1 + }, + { + -12, -9, -69, 3, -2, -7, -66, -8, 5, 5, + -2, -37, 41, 19, -30, 0, -16, 39, -12, -40, + -13, 28, -25, -47, -34, 38, -16, -23, -23, 3, + 17, 9, 6, 3, 14, -18, 3, 5, 2, 5, + 7, 7, -7, -5, -2, 1, -1, 5, 2, -4, + -3, -9, -5, 6, 8, 0, 2, -1, -1, 1, + 2, -5, 0, 4, 2, -1, 5, 0, -4, 0, + -2, 2, 2, 0, -2, -1, 0, 1, 4, -2, + 1, 1, -3, -2, 2, 1, 0, 1, -1, 3, + 0, -1, 1, 0, 0, -2 + }, + { + -47, 120, 31, 37, -18, 10, 39, 13, -11, -14, + 0, 31, -11, 24, 23, -6, 11, 1, -1, -21, + 12, -9, -7, -10, 5, 6, 0, -14, 9, -28, + 7, 0, -1, 4, -21, 5, -13, 10, 30, -2, + 0, -5, 4, -8, 10, -5, 1, 13, 0, -2, + 4, -2, 7, -1, -2, -1, 2, 1, 0, 6, + -3, 0, 4, 1, -6, -1, 1, -1, 5, 1, + -4, 2, 0, 0, -1, -2, 0, 0, 1, 1, + 2, 1, -4, 0, 0, -3, 2, 0, 1, 1, + -1, 0, -2, -2, 1, 0 + }, + { + -9, 47, 26, 13, 9, 9, -15, 15, 8, 16, + -2, -31, 63, 25, 28, -8, 37, 23, -18, 36, + -38, 61, 37, -9, 27, -5, -12, 53, -12, 27, + 12, 20, -12, 5, -3, 7, 10, -19, 12, -6, + 3, 3, 4, -1, 8, 2, -4, -6, 5, 2, + -1, -3, -6, 1, 7, 2, -12, 5, -9, -1, + 7, 5, -7, -6, -4, 8, -4, -2, 4, -1, + -1, 1, 0, -1, 3, -2, -1, -2, -1, -1, + -1, 3, 1, 1, 0, 0, 2, -3, 1, -1, + 1, 3, -3, -2, 2, -1 + }, + { + -34, 94, -87, 79, -6, 105, -49, 22, 17, -8, + -17, 8, -34, -6, 58, -32, 10, 21, 12, -5, + -5, 10, -18, 19, -11, 8, -3, 21, -9, -9, + 4, -10, -5, 10, -4, -5, 5, 1, -4, 0, + -2, 7, 1, -2, 3, 4, 16, 5, 1, -2, + -4, 6, 1, -3, -1, 1, 7, 2, -1, 1, + 0, 0, -3, 0, 5, 1, 6, 0, 1, -1, + 1, 0, 0, -2, 0, 1, 4, -3, -1, 2, + 2, -1, 1, 3, 0, 1, 3, -2, -2, 1, + 1, -1, 1, 1, 1, -1 + }, + { + 3, 7, 46, 26, -10, -5, -15, -10, -15, -3, + -10, 5, 25, 239, -275, -111, 2, 2, -63, -2, + 20, -51, 6, 47, -36, 12, -2, -7, -3, -7, + 4, 11, 14, -11, -10, 17, -16, -11, -8, 8, + 9, -3, -21, -11, 14, -4, -3, 14, 5, -9, + -4, 0, -4, -5, 1, 8, 0, -5, 5, -4, + -9, -5, 3, -3, 0, -5, 0, 11, -6, 1, + 0, 4, -2, -3, 1, -4, 3, 2, -1, -2, + -1, 2, 2, 4, -3, 1, 1, -2, 0, 2, + 0, 0, 2, -1, -1, 1 + } + }, + { + { + 181, 905, 153, 96, -37, -4, 22, -11, 3, 15, + -5, -18, -2, 5, 40, -6, -34, -6, -7, -6, + -3, 6, -15, -5, 6, 4, 13, -8, 4, 9, + -13, 17, -9, 0, -15, 11, -8, -13, -3, -7, + 7, 21, 5, -1, -3, 1, -7, 10, 4, 10, + 1, 4, 2, -3, -4, -3, -4, 1, -1, 7, + -2, -6, -4, 5, 3, 1, 4, -1, 0, 1, + -2, 3, 1, -2, -2, 3, 3, -2, 4, 2, + 1, 1, -2, -1, -2, 3, -1, 2, 1, 0, + -1, 1, -1, 0, 1, 0 + }, + { + 11, 239, -89, 34, -10, 2, -24, 15, -5, 1, + 7, 11, -35, 19, 62, -15, -20, 4, -123, -36, + 14, -42, 45, 32, -32, -38, 27, -31, 4, -4, + 23, 48, -13, -1, 5, -2, 9, -12, -10, -1, + 15, 15, -3, -11, -6, -3, 4, 0, 0, 4, + -7, 2, 3, -3, -14, -3, 9, 2, 1, 0, + 0, 0, -2, 0, 3, -1, 7, 0, -3, -1, + 1, -4, -1, 1, 2, -2, -2, 1, 1, 1, + -3, 1, 2, 0, 2, 1, -1, 0, 2, -2, + 0, 2, 1, -1, -1, -1 + }, + { + -6, 636, 24, -50, -47, -33, -13, -7, -7, -1, + 17, -4, 7, 29, -24, -3, 16, -1, -47, 24, + 13, 37, 4, 7, 9, -1, 9, -10, 13, -11, + -2, 14, 0, -4, 1, 9, -2, -8, -1, -9, + -11, 6, 9, 0, 9, 0, 6, 5, 1, -3, + -6, 5, 0, 2, -2, -5, 2, -3, -4, -2, + 2, -1, 0, -4, 3, 2, -4, 1, 2, -1, + -1, 3, 2, -1, -2, -3, 2, 3, -2, 0, + 0, 1, -1, 0, 3, -1, -1, -1, 0, -1, + -1, -1, 1, 0, 0, 2 + }, + { + -260, 1552, -69, -146, 1, 0, -16, 4, -4, 9, + -15, 2, 2, -51, -10, -28, 15, -30, -10, 11, + 4, 1, 2, -5, 0, 3, 28, 17, 12, 2, + -8, 2, 0, -12, -16, 9, 10, -16, -1, -23, + -3, -6, 8, -4, 4, 2, -5, 5, -5, 10, + 4, -5, 6, 1, -2, -1, 0, 4, -3, -1, + 2, 3, -4, 6, -4, -4, 1, -5, 1, 0, + -1, -4, 1, 3, 0, 1, 0, -1, 0, 1, + 0, -1, -2, 1, -1, 0, 1, -2, 0, 1, + 0, -1, 0, 1, -1, 0 + }, + { + -19, -309, 23, 7, -9, 0, 10, 11, -10, 12, + 10, -5, 17, -32, 228, -37, 36, 42, -69, -82, + -21, -14, 6, -54, 42, -7, 40, 10, -8, -54, + -16, -1, 4, 7, 5, -2, -5, 14, 1, 21, + -2, 3, 0, -3, 10, 5, 4, 5, -3, -4, + -1, -3, 10, -6, -3, -1, 0, 2, -3, 2, + 3, 0, 0, 2, 4, -2, -1, -2, 1, 1, + -5, -2, 1, -1, -2, 3, 0, 2, 3, -2, + 1, -3, -2, 4, -2, 0, -1, -1, 1, 1, + 0, 0, -2, -1, 2, 0 + }, + { + -187, 1850, -41, 165, 1, 2, 20, -22, 8, 52, + -19, -22, -7, -8, 47, 11, 8, 13, -7, 14, + 13, -1, -39, -11, 14, -4, 3, 2, 3, 11, + -10, -9, 11, 21, -10, 7, 2, -15, 2, -4, + -13, -1, -1, -13, -14, 3, -12, -2, 0, 6, + -10, 6, 10, -1, -5, 3, 9, -2, -3, -2, + -2, 6, 0, -3, -6, 0, 2, -1, 2, -1, + -1, 1, -2, 2, -1, 1, 0, -1, -1, -1, + -1, -2, 0, 2, 1, 1, -1, 2, -3, 0, + 0, -1, 0, -2, 1, 1 + }, + { + 8, 74, 12, -25, -3, 3, 7, 13, -4, -2, + 1, 3, -25, -22, 72, -105, -38, -9, 25, 19, + 8, 3, -123, 19, 25, 23, 43, -14, -4, 17, + -14, 7, 8, 21, 0, -10, -4, 14, 1, 7, + -8, -14, 6, -3, 11, 4, -5, 0, -3, -2, + 0, 4, -3, -4, -2, 2, 5, -7, 1, 3, + -1, -5, 3, 2, 1, 1, -1, 2, -4, -2, + 3, 4, 0, -1, 4, 0, 1, 1, 0, -2, + 1, 0, 1, -1, 1, 0, -2, 0, -1, -2, + -1, 0, 2, -1, -1, 1 + }, + { + 419, -1120, 8, 18, -3, -1, -20, 7, 4, 9, + -15, -29, 0, 26, 21, -4, 1, -30, 26, 30, + -14, 13, 20, 3, -9, 7, -5, 6, -29, 7, + 21, -4, 9, 2, -2, 2, -12, -10, -1, -8, + -7, 4, 1, -16, 3, -13, -14, -3, -2, 5, + 0, -14, -7, 10, 0, 5, 5, 0, -4, -3, + -3, 4, 3, -2, -2, 1, 1, 1, -1, 2, + 2, 0, 2, 4, -3, -3, 5, -2, -2, 0, + 0, -2, 0, 0, -1, 1, 2, 0, 0, 0, + 0, 0, 1, 0, 0, -1 + }, + { + 9, 96, -111, 13, -11, -4, 4, 8, -6, -8, + -3, -19, -15, 17, -127, -55, 29, -57, 22, -7, + -15, 30, -53, 58, -25, 23, 19, 5, 10, 8, + -26, 5, 5, 2, 23, -5, 14, 8, -9, 6, + 0, -13, 3, 10, -6, -3, 2, -8, -4, -8, + -4, 0, 5, -1, -1, 2, 8, 4, 0, 1, + -3, -5, 2, -6, 1, 3, 1, 4, 1, -1, + -2, -2, 2, 6, 0, -1, 0, 2, -1, 0, + -2, -3, 2, 1, 1, 1, 2, -1, -2, 0, + 2, -1, 0, 0, 0, 1 + }, + { + 42, 350, 157, -18, -12, 25, -2, -16, 4, 10, + -9, 1, -8, -32, 38, -19, 8, 1, -8, -2, + 32, -17, 2, -9, 22, 0, -3, -4, -4, -11, + 16, 11, -2, 6, 7, -9, -2, 3, -11, 4, + 3, 5, -7, -6, 7, -4, -7, 0, 7, -3, + -11, 4, 3, -10, -1, 2, 0, -4, 0, -5, + 2, 0, 1, 1, -3, 2, 0, 0, 3, -1, + -2, -1, 3, -3, 1, -1, 3, -3, 1, -2, + -1, 1, 2, -1, 3, 2, -1, 0, 0, -1, + 1, -2, 0, 1, 2, 0 + }, + { + 10, -62, -31, -23, 20, -7, -22, -20, 13, -1, + 2, -7, 19, 3, 5, -9, -27, 14, 11, -53, + -36, 24, -42, -8, -35, 22, -10, -16, -36, -1, + 3, 10, 8, 2, 18, -22, -4, -2, 6, 4, + 6, 0, 1, -2, -3, 4, 1, 0, 7, 1, + 0, -8, -7, -3, 5, 1, 2, 2, -2, 1, + 3, -4, -1, 2, 7, -2, 3, 4, -1, -1, + -2, 0, 1, 1, -2, -2, -3, -2, 4, 0, + 0, 2, -2, -3, 0, 1, -1, 0, -3, 2, + 1, -1, 1, 0, 1, -1 + }, + { + 101, -184, 124, -8, 15, 17, 12, 17, -24, 14, + -18, -5, 21, 11, 14, -7, 0, -7, 15, -22, + 23, -1, -25, -1, 13, 1, -2, -12, 3, -15, + -7, 6, -8, 2, -12, -11, -17, 1, 19, -1, + 9, -3, -7, -2, 7, 2, -1, 5, 3, 0, + 11, -2, 7, -2, -2, -4, 1, 3, -5, 4, + 3, -1, 0, 3, -4, -2, 1, -2, 2, 3, + -3, 1, 2, 0, 0, -2, -2, -1, 0, 2, + 1, 2, -2, 0, 1, -4, 2, 0, 0, 3, + 0, 2, -1, -1, 0, 0 + }, + { + 5, 94, -36, 11, 2, 12, -21, -2, 18, 24, + 2, -22, -6, 81, 52, 52, 10, 10, -21, 48, + -69, 35, 82, 12, -29, 13, -6, 58, -8, 44, + -15, 4, -9, 5, -1, -9, 7, -5, 9, 0, + 2, 8, 0, -1, 11, 1, 1, 1, 3, 1, + -2, 4, -2, -2, 9, 6, -10, 0, -4, -5, + 1, 7, -2, -5, -5, 4, -1, -4, 3, 2, + -1, -1, 1, -1, 4, 2, -1, -1, -1, -1, + -2, 0, 0, -1, 0, -1, 3, -2, -1, 0, + 0, 3, 1, -3, 2, 1 + }, + { + 3, 39, -45, -15, 0, 31, 49, -8, 40, 2, + -3, -10, -22, 59, -41, -35, -6, -20, 21, -7, + -6, 17, -8, 24, -8, 4, 1, 19, 12, -16, + 4, -12, -9, -6, 5, -14, -4, 5, -5, 3, + -6, 5, 7, -4, -2, 2, 7, 8, 1, 3, + -7, -2, 9, -1, -5, -2, 3, 3, -1, 0, + 0, 2, -1, -4, 3, -1, 5, 0, 2, -2, + 3, 0, 0, -1, 0, 0, 4, -1, -4, -1, + 2, 0, -1, 1, 0, -2, 3, 1, -2, 0, + 1, -2, 0, 0, 1, -1 + }, + { + -11, 4, 40, 24, 1, -6, -19, 6, -19, -5, + -5, -7, 10, -9, 32, -55, -38, 0, -24, -25, + 13, -4, -33, 46, -1, -13, 40, -40, -16, 5, + 0, 14, 15, -1, -12, 9, 2, -16, -9, 1, + 6, 7, -12, -5, 5, 4, -2, 14, 5, -5, + -4, -3, 3, -3, -2, 2, 2, -4, 7, 7, + -5, -7, 6, 0, 2, -6, -5, 9, -2, 1, + -1, 4, 2, -1, 3, -5, 2, 3, 0, -1, + -4, 0, -1, 4, 0, 0, 1, -2, 0, 1, + 0, -1, 1, 1, -1, 0 + } + }, + { + { + -216, -89, 76, 147, 22, -12, -6, -2, -1, -18, + 11, 24, -5, -38, -48, 35, -12, 3, -3, 48, + -12, 2, -1, 2, -5, 2, -17, -17, -3, 21, + 1, 3, -14, -8, -1, -8, -5, -14, 0, 2, + -8, 2, 4, -2, -7, 6, 3, 1, -7, 3, + 2, 0, -1, 0, -4, -2, -4, -2, -7, -1, + 5, 1, 0, -1, 2, -2, -1, 6, -2, 1, + -3, 0, 0, 2, 1, -3, -1, 2, -4, 2, + 0, 3, 0, 1, 0, -4, 3, -1, 1, 1, + 1, -1, 1, -1, 0, 0 + }, + { + -9, 271, -26, -9, 19, 11, -21, 7, 13, -11, + 4, 2, -19, -23, 11, 68, 16, 67, -6, -36, + -7, -51, -22, -1, 27, 30, 34, 6, 19, -9, + 9, 11, -15, 29, 6, 13, -3, -1, 8, -4, + -7, 5, 7, 6, -13, 1, 3, -1, -9, 6, + 1, -4, 2, 4, 6, -11, 0, -1, -1, -8, + 0, 4, 5, -2, -2, -1, -2, 6, 2, -1, + -1, 3, -1, -5, 1, 4, -2, -1, -3, 2, + 2, -1, -2, 1, 0, 0, 2, 1, -1, 3, + -1, -2, -1, 1, 2, 0 + }, + { + 16, 711, -36, -86, 54, 3, 6, 2, -3, -20, + 13, 11, 1, -6, -18, -32, 25, -4, 29, 8, + -25, -14, -2, -11, -11, -6, 17, 14, 5, -7, + 22, -19, 11, 23, 19, -16, 1, -1, 8, 1, + 2, -2, -12, 8, -1, 7, -1, -1, 5, 7, + -16, 2, 3, -6, -1, 5, 2, 4, 1, 1, + -4, 4, 3, 3, -6, 4, 1, 2, -2, 3, + 0, -3, 1, 2, 0, 1, -2, -1, 3, -1, + -1, -1, 2, -1, -1, 1, 1, 2, -2, 0, + 1, -1, -1, 0, -1, -1 + }, + { + 2, 2010, -17, -150, 7, 9, 9, -3, 7, 27, + -34, -24, 10, -28, 19, -46, 2, -2, 3, -6, + -9, -15, 14, 10, 6, 15, -23, 1, -5, 11, + 19, 7, 4, 9, -5, 22, -3, 1, -8, -13, + 18, -17, 3, 7, -4, -5, 11, 10, 1, 1, + 2, 2, -1, 5, 0, 2, -1, 1, 4, -6, + -3, 5, 4, 0, 2, 1, -2, 4, -4, 1, + 4, 2, -6, 0, 0, 0, 2, 0, -1, -2, + 2, 1, 2, -1, -1, 1, -1, 2, -2, -2, + 0, 1, 0, 0, 1, 1 + }, + { + 16, -252, -10, -25, 15, -2, -10, 5, -11, 5, + 3, -1, 23, -31, 278, -2, -78, -129, 189, -25, + -12, -42, 26, 3, 7, -44, -71, -25, 61, 6, + -16, 17, -11, 11, -16, 1, -5, 1, -2, 9, + -3, -7, 7, 2, -3, -6, -2, -5, 3, -11, + 5, -2, -5, 3, 0, 0, -2, 4, -1, -4, + 2, 3, -3, -3, 2, 3, 3, 2, -1, 0, + 5, 0, 1, 1, -1, -2, 1, -1, 0, 2, + 1, 3, -2, -2, 2, -1, 1, 1, -1, 0, + -1, 0, 1, 0, -2, 0 + }, + { + -148, 2094, 56, 155, -39, 0, -13, 32, -15, -24, + 29, 13, -10, -32, 25, 8, -3, -9, -2, -4, + -4, 33, -4, -12, -5, 0, 0, 13, -28, 0, + 10, 7, 4, 9, -3, -5, 1, -12, -2, 1, + -7, 22, -11, -7, 0, 8, 0, -7, -12, 0, + 3, -10, 3, -2, 10, -6, 3, 4, 5, -1, + -6, -1, 0, 4, 2, -1, -1, 3, 1, -1, + 0, 0, 1, -1, 1, -4, 1, 2, 0, -1, + 2, 0, -1, -3, -1, 1, 2, 0, 4, -2, + 0, 0, 1, 0, -2, 0 + }, + { + -18, 0, 118, -6, 0, -3, -3, -2, -1, 0, + -4, 9, 5, -17, 72, -2, -8, -7, -5, -21, + -21, 3, -154, -7, 3, 37, -22, 6, -17, 14, + -15, 10, 13, -14, 16, 11, -3, 14, 7, -2, + 13, 2, -8, -1, -5, 1, 7, 5, -3, 3, + -5, -2, -2, 1, 0, -1, -1, 4, 0, -1, + -2, -2, -2, -3, 0, -1, -8, 4, 5, 1, + -5, -1, 3, -1, 1, 3, -1, 1, 2, 1, + -1, 0, 0, 0, 0, 0, 2, -2, 0, 0, + -2, -2, -1, 1, -1, 0 + }, + { + -220, -1888, -112, -20, 7, 8, 22, -7, -4, 1, + 1, 27, -27, -6, 47, -5, 13, 13, -34, -4, + 12, -12, -1, 24, 5, -17, -12, 6, -27, -17, + 5, -9, -3, 1, -13, -1, -6, -19, 11, 3, + -9, 0, -1, -9, -13, 7, 1, 4, -21, 2, + 3, 6, -3, -8, -2, 0, 6, 4, 2, 2, + -2, -4, -2, 4, 3, -2, -1, -1, 1, -1, + -1, 2, -2, 0, 5, 1, -4, 4, 2, -3, + 3, 0, -1, 0, 1, 0, -1, 1, 0, 1, + 1, -2, 0, 0, 1, 0 + }, + { + -26, 18, 54, 7, 9, -2, -4, -11, 6, 1, + 5, -6, 5, -37, -90, -73, 20, -82, -22, -2, + -4, -37, -37, 32, -17, 34, -14, 65, -1, 2, + 2, -29, 19, -10, -1, 4, 3, -16, 9, 3, + 1, 11, -2, 4, -4, 4, -2, -1, 3, 4, + -1, -2, -6, 0, 7, 3, -4, 3, 3, 3, + 2, -2, 0, 1, -2, -2, -2, -2, 3, 1, + 0, 1, -3, -4, 3, 3, 1, -1, 2, -2, + 2, 0, -4, -2, 0, -1, -1, 3, 0, 0, + 0, 1, 0, 0, 0, 0 + }, + { + -51, 160, -7, -35, -4, 55, -16, -13, -25, -13, + 10, 4, 21, -2, -3, -7, -19, -1, 16, -4, + -1, -15, -3, -17, 1, 2, 2, -14, 2, -4, + 8, 12, -18, -3, 27, 0, -8, -4, 7, -8, + 2, 8, 7, -3, -11, 7, 12, 1, 0, 0, + 6, 1, 3, 12, -2, -6, 4, 4, -2, 3, + -8, -1, 3, -1, 1, -2, 2, 1, -2, 2, + 1, 0, -1, 1, 0, 1, 0, 2, -3, 2, + 0, -2, -2, 1, -2, 1, 2, 1, 0, 2, + 0, 2, -1, -1, -1, 1 + }, + { + -8, -5, 48, 14, 1, 12, 17, -27, -5, -18, + 8, 22, -18, -20, -34, 20, 4, -22, 0, 64, + -47, -21, -19, 35, -15, -2, 15, -12, -26, -2, + -30, -10, -5, 5, 0, 1, -4, -14, 1, -5, + 9, -9, -3, 4, 1, -6, 0, -5, 5, 2, + 5, 4, 2, -3, -3, 1, -2, 0, 1, -2, + -1, 6, 0, -4, -1, 3, -3, 1, 4, 0, + 1, -1, -1, -1, 1, 0, 0, -2, -4, 2, + 0, -2, 3, 1, -2, -1, 1, -1, 1, -2, + -1, 0, -1, 0, 0, 2 + }, + { + -76, -493, -1, -52, -17, 47, -30, 4, -16, 8, + 25, -33, 14, -8, -13, -22, -1, 15, 0, 4, + -8, 9, -12, 10, -6, 10, -15, 20, -11, 16, + -9, 5, -1, -8, 18, 3, -8, -5, -11, -9, + -2, -4, -21, 3, -1, 6, -4, -4, 4, -2, + 4, 6, -1, 4, -3, 1, 0, 4, 2, -8, + 3, 2, -4, -3, 7, 0, -2, 0, -4, -3, + 5, -1, 0, 0, 1, 1, 0, 0, -1, -1, + -1, 0, 2, 1, 0, 2, -2, 0, 0, -1, + 1, 0, 2, 1, -1, 0 + }, + { + -4, 101, -17, -18, 8, -4, 12, -18, -5, -2, + -21, 19, -41, 65, 12, 113, 1, 3, 4, 15, + 22, -17, 104, 38, -34, 11, -1, 31, -15, -30, + -9, -8, -5, 0, -8, 0, -15, 21, -6, 7, + 6, 4, -4, 5, -3, -1, 1, 4, 5, -4, + -4, 3, 10, -5, 1, 8, 8, -4, 1, 1, + -6, -7, 6, 1, 2, -4, 5, 1, -4, 3, + 1, -1, -1, -1, -2, 1, 3, 2, 0, 0, + 2, -2, -2, -1, -1, -1, -1, 2, 0, 0, + -1, -3, 2, 2, -3, 1 + }, + { + 5, 166, 49, -67, -11, -57, -1, -6, 7, 26, + -21, -14, 15, -25, -100, 37, -33, -25, 7, -8, + -10, -9, 14, -15, -3, 3, -7, -10, -10, 19, + -11, -6, 3, -9, -6, -7, 1, -8, -2, -9, + 3, -2, 6, 3, 3, 2, -10, -10, 2, -4, + 10, -8, 3, 5, 0, -1, -4, -3, 7, -1, + 2, 2, 2, 0, -2, -1, -5, 0, 1, 2, + -1, 2, 0, 3, 0, -1, -2, 4, 1, -2, + -2, 1, 0, -3, -1, 0, -4, 1, 2, 0, + 0, 1, -1, -1, -1, 1 + }, + { + 15, 38, -40, -9, 10, 3, -6, 4, -6, 18, + -5, -9, -25, -156, 255, 170, -29, -8, 4, 5, + 41, 8, 0, 34, -17, -22, 32, -39, 5, -13, + -16, 12, 8, 9, 2, -22, 12, 16, -15, 1, + -10, -1, 9, 19, -15, 10, 0, 1, -2, 2, + 0, -1, 6, 6, -1, -4, -2, 0, -4, 1, + 8, -1, -1, 0, 6, 1, 1, -9, 3, 2, + 0, -4, 4, 2, 1, 4, -3, -1, 2, 2, + 1, -1, -1, -3, 3, 0, 0, 1, 0, -2, + 0, 0, -1, 0, 1, 0 + } + }, + { + { + 125, -375, -220, 109, 58, -2, -14, 3, -6, -36, + 9, 26, -2, -20, -65, 26, 21, -15, 22, 44, + -9, -4, 11, -3, -5, 1, -10, -32, 16, 0, + -6, -5, -8, -6, 8, -19, -3, -22, -3, 10, + 2, -5, -3, -8, 3, -7, 11, 2, -8, -7, + 5, -7, 1, 6, -5, 1, -2, -2, -2, -4, + 5, 2, 2, -3, -1, -1, -2, 4, 0, 0, + -1, -2, -1, 3, 2, 0, -3, 2, -3, 0, + -1, 0, 1, 1, 2, -4, 1, -1, 0, 0, + 1, -1, 1, 0, 0, 0 + }, + { + 1, 183, 40, -14, 23, 6, -3, -5, 8, 6, + 2, -11, -29, 58, -59, 96, 24, 21, 37, 15, + -15, -38, -33, -15, 18, 30, 12, 37, 14, 1, + -17, 2, 14, 15, 12, 16, -11, -3, 7, -1, + -8, -1, 1, 4, -4, -1, -1, 2, -6, 3, + 0, -1, -6, 3, 9, -3, -4, -4, 0, -7, + -2, 1, 4, 0, -2, 0, -5, 2, 2, 0, + -1, 3, 1, -2, -1, 4, 1, 0, -4, 0, + 2, 0, -3, 1, -1, -1, 1, 1, -2, 2, + 0, -2, -2, 1, 1, 0 + }, + { + -3, 580, 93, -77, 22, 17, 2, -5, 9, -9, + 5, 13, -3, -6, 3, -49, 6, -3, 63, -32, + 24, -48, 10, 7, -30, -16, 12, 13, 3, 4, + 23, -25, 6, 17, 26, -10, -5, 1, 7, -1, + 10, -10, -5, 0, -3, 6, -2, -3, 2, 6, + -8, -4, -3, -3, -3, 6, -1, 5, 4, 2, + -4, 2, 1, 6, -4, -2, 3, 1, -1, 3, + 1, -3, -1, 2, 2, 4, -2, -4, 4, 0, + -1, -2, 1, 1, -2, 0, 0, 2, -1, 0, + 1, 0, -1, 0, 0, -1 + }, + { + 271, 1744, -59, -165, 2, 0, 15, -6, -6, 23, + -4, -19, -5, -4, -20, 3, -12, 13, 18, -14, + -11, -2, 3, 10, 9, 18, -23, -9, 1, 5, + 12, 10, 1, 6, 1, 10, -3, 11, -16, -8, + 19, -7, -3, 8, -3, -8, 9, 5, 3, 1, + -7, 10, -3, 4, 2, 3, 4, -5, 3, -2, + -3, 1, 4, -6, 2, 1, -2, 5, -2, 0, + 2, 6, -2, -2, 1, 0, 1, 0, -1, -2, + 0, 0, 3, -1, 0, 1, -1, 1, -1, -2, + -1, 1, 0, -1, 1, 0 + }, + { + 1, -212, -18, -15, 10, 1, -11, 1, -8, -6, + 6, 9, 1, 45, 187, 59, -103, -101, 48, 19, + 3, -17, -16, 69, -45, -31, -42, -48, 50, 49, + -21, 29, -13, -2, -11, 1, -3, -13, -2, -5, + 1, -4, 2, -1, 3, -9, -4, -6, 3, -10, + -2, 7, -9, 6, -2, 4, -2, 2, 4, -6, + -1, 3, -2, -4, -1, 2, 1, 4, 0, -1, + 7, 3, 0, 1, 0, -3, 0, -1, -2, 1, + 0, 3, 1, -3, 2, -1, 1, 1, -1, 0, + -1, 0, 2, 0, -2, -1 + }, + { + 464, 1434, -52, 96, 1, 4, -15, 20, -4, -38, + 23, 13, 8, 11, -42, 16, -2, -14, 3, -10, + -8, 11, 18, -4, -13, 11, -12, 19, -23, -6, + 10, 18, 0, -3, -3, 6, -6, -2, -12, 1, + 0, 7, -1, -8, 11, -3, 13, -9, -9, -6, + 9, -6, -6, -5, 9, -1, -4, 1, 2, -1, + 0, -4, -2, 3, 4, 0, 0, 2, 1, 0, + 0, -1, 2, -2, 2, -4, 0, 1, 1, 0, + 2, 3, 0, -3, -2, -1, 1, -1, 3, -1, + 0, 0, 0, 1, -1, -1 + }, + { + -7, -20, 73, 14, 1, -2, -8, -4, -2, 8, + -4, 4, 5, 0, 119, 34, -13, 9, -1, -45, + -10, -18, -167, 37, -8, 62, -49, -13, 10, 17, + -23, 5, 18, -16, 5, 1, 8, 0, 10, -4, + 7, 3, -3, -2, -8, -5, 10, -1, 0, 3, + 0, -5, -3, 2, 3, -3, -5, 6, -2, -1, + -1, 1, -3, -2, 0, -2, -5, -1, 4, 3, + -2, -4, 1, 1, -3, 1, -1, -1, 1, 2, + -1, 0, 0, 0, -1, 0, 2, -1, 1, 2, + 0, -1, -2, 1, 0, -1 + }, + { + -20, -2195, -60, -38, 10, -2, 46, -10, -7, 0, + 0, 21, -4, -2, 26, -6, 3, 42, -27, -29, + 14, 4, -23, 14, 9, -13, -6, -10, -11, -9, + -7, -9, -10, -3, -10, -12, -1, -14, 2, 11, + -6, -1, -6, 0, -14, 16, 2, 5, -11, -2, + -3, 12, 6, -8, -2, -3, 0, 3, 3, 2, + 3, -3, -4, 2, 5, 0, -1, -3, 1, -1, + -2, 2, -2, -4, 3, 4, -6, 2, 2, -1, + 0, 2, -1, 1, 1, 0, -3, 0, 0, 1, + 1, -1, 0, 0, 1, 1 + }, + { + -10, -55, 39, 4, 8, 2, -1, -14, 6, 4, + 9, -2, -2, -92, -13, 37, -53, -18, -28, -27, + 7, -27, 8, -46, -2, 48, -3, 36, -4, 2, + 5, -12, 13, -6, -14, 5, 0, -12, 13, 0, + -6, 7, 3, -10, 1, -5, -4, 7, 0, 3, + 4, -2, -6, -2, 9, 4, -6, -1, -2, 4, + 4, 5, -2, 1, 1, -1, 1, -2, 2, 3, + 3, 2, -2, -4, 1, 3, 2, -1, 1, -1, + 1, 3, -2, -2, -1, -2, -2, 1, 1, 0, + -1, 1, 0, 0, 0, -1 + }, + { + 62, -164, 27, 38, -10, -7, 22, -9, -31, -21, + 8, -7, 17, 25, -23, 3, -24, 2, 8, 4, + -14, -13, -8, -1, -6, -1, -8, -2, 2, -7, + -4, 7, -17, -13, 22, 13, 1, -4, 6, -6, + -5, 1, 6, 6, -10, 2, 13, -1, -3, -1, + 3, 0, -3, 7, 4, -4, 4, 4, -2, 5, + -4, -4, 2, -2, 3, -2, 0, 1, -3, 1, + 2, 1, -4, 1, 0, 2, -2, 3, -2, 2, + 1, -1, -3, 0, -3, -2, 1, 0, -1, 1, + -1, 2, 0, -1, -1, 0 + }, + { + 12, 119, -34, -8, -4, -1, 10, -21, -15, -13, + -7, 18, -10, -3, -49, -7, 37, -16, 1, 63, + -6, -37, 0, 5, -1, -21, 9, -10, -3, 0, + -24, -9, -17, 3, -7, 14, -3, -7, 2, -8, + 6, -2, -5, -2, -1, -7, -1, -1, -2, 0, + 1, 5, 6, 2, -3, 1, -2, -2, 1, -1, + -3, 4, 2, -3, -4, 2, -2, -2, 2, 1, + 1, 1, -1, -2, 1, 2, 2, 1, -4, 0, + 0, -2, 2, 3, 0, -1, 1, 0, 2, -1, + -1, 0, -1, 1, -1, 2 + }, + { + -25, -621, 0, -11, -22, 9, 11, -8, 1, -11, + 26, -2, 9, -17, -9, -5, 1, 11, -7, 7, + -17, 2, 3, 1, -10, 11, -11, 11, -6, 15, + 6, -4, 0, -1, 11, 14, 8, -1, -11, -8, + -10, -5, -10, -3, -4, -1, 3, -1, 2, -1, + -4, 6, -4, 5, 0, 3, 1, 2, 7, -10, + 2, 2, -1, -4, 6, 1, -1, 1, -3, -4, + 4, 0, -1, -1, 0, 1, 0, 1, 1, -2, + 0, -3, 1, 0, -1, 2, -1, 0, 0, -2, + 0, -1, 1, 1, -1, 0 + }, + { + 3, 76, 15, -14, 2, -4, 14, -3, -9, -23, + -13, 8, 51, -49, 1, 110, 27, -25, 13, 4, + 109, -39, 52, 22, 20, -18, 18, 10, -3, -35, + -11, -5, -5, 2, -9, 7, -12, 15, -7, 5, + 2, 1, -2, 5, -5, 1, 3, -3, 3, -3, + -3, -1, 6, -1, -1, 0, 9, -2, 0, 5, + -3, -8, 1, 3, 4, -3, 4, 4, -4, 0, + 2, 0, -1, 0, -3, -2, 2, 1, 1, 1, + 2, 0, -2, 0, -1, 0, -2, 2, 1, 0, + 0, -3, -1, 2, -2, -1 + }, + { + 29, 207, -9, 0, -1, -45, -41, 1, -9, 17, + -22, -7, 11, -34, -57, 14, 1, -10, -2, -5, + 2, -20, 18, -20, -5, -11, -8, -18, -9, 10, + -7, 2, 6, -4, 0, -8, 1, -10, -3, -4, + 2, -7, 5, 8, 4, 5, -8, -8, -1, -2, + 7, -1, -5, 2, 7, 1, -2, -4, 5, 1, + 3, 0, 2, 3, -2, 0, -4, -1, 0, 3, + -2, 1, 0, 2, 0, 0, -2, 3, 3, 0, + -2, 1, 2, -2, -1, 2, -3, -2, 2, 1, + 0, 2, 0, 0, -1, 1 + }, + { + -5, 103, -57, -12, 8, -2, 13, 5, -13, 7, + 3, 14, -70, 149, -147, 141, 26, 24, -3, 8, + 62, 2, -6, 8, -9, -11, 12, -4, -20, 2, + -28, -3, 21, -3, 7, -13, -4, 8, 9, -11, + -10, -11, 8, 13, -6, 0, 4, 1, -5, 1, + 2, 1, 0, 3, 4, -1, -6, 1, -7, -6, + 3, 4, -5, -1, 2, 2, 6, -9, 1, 1, + 2, -4, 0, 2, -1, 5, -2, -2, 0, 1, + 4, 0, 2, -3, 1, 0, 0, 1, 1, -1, + 0, 1, -1, 0, 1, 0 + } + }, + { + { + -70, 430, 353, 6, -48, 10, 14, 6, 12, -11, + -23, -7, 9, 27, 8, -3, 24, -17, 20, -22, + 1, 10, 20, 0, -6, -10, 8, -34, 18, -4, + -5, 8, -1, 8, 2, 5, 8, -13, -8, 4, + 5, 1, -7, -7, 13, -17, -3, 4, -5, -5, + 0, -7, -2, 1, -1, 1, -3, 1, 5, 2, + -3, -2, 0, 2, -1, 2, 2, -3, 0, -1, + 2, 2, 0, -1, -2, 4, 1, -2, 3, -1, + -1, -3, -1, 0, -1, 2, -2, 1, 0, -1, + -1, 0, -1, 1, 1, 0 + }, + { + 3, 69, -42, 20, -24, 2, 3, -2, -18, 17, + 0, -4, -36, 24, -158, 37, 38, -26, -23, 41, + -14, -26, 17, 8, -6, -22, -24, 3, 9, 13, + 1, 25, -3, -12, 17, 0, -4, -9, -2, -2, + 2, 0, -9, -4, 6, -8, -7, -4, 6, 5, + -5, 12, -2, -3, -11, 7, 4, -3, 0, 3, + -2, -2, 1, 3, 2, 0, 3, -4, -3, 1, + 1, -3, 3, 3, -1, -4, 1, 4, 1, -1, + -4, 3, 2, 0, 1, -1, -2, 0, 0, -3, + 1, 2, 0, -1, -1, 0 + }, + { + 2, 222, -69, 29, -30, 0, -3, -15, 3, 14, + 9, 1, -7, 36, 12, -14, 8, -8, 4, -30, + 16, -31, 0, 14, -7, 3, -3, -10, 7, -10, + 7, 8, 6, 1, 6, 16, -2, -4, 3, -5, + 3, -1, 13, -10, -2, -6, -1, -4, -4, -2, + 5, 4, -7, 1, -5, -4, -1, -2, 1, 2, + 2, -2, -1, -4, 3, -3, -1, 0, 3, -2, + 0, 4, -2, -2, 0, 0, 4, 1, -1, 0, + 1, 0, -2, 2, 2, -1, -1, -1, 1, 0, + -1, 0, 1, -1, 1, 1 + }, + { + -432, 905, 69, -135, 18, -5, -9, -3, -16, -5, + 7, 22, 7, -12, -48, 22, 5, 1, 14, 1, + -1, 19, -5, -7, 8, 7, 11, -8, 15, -6, + -12, 5, -5, -5, 7, -16, -6, -7, -2, 0, + 2, -6, -5, 1, 7, 2, -11, -5, -7, 7, + -6, 2, 4, -2, 4, 0, 1, -6, -3, 5, + 5, -1, -4, -1, -2, -1, 2, -2, 3, -1, + -4, -1, 5, 1, -1, 1, -1, 0, -1, 1, + 0, -1, -2, 0, 0, 1, 1, -2, 2, 1, + -1, -1, 1, 0, -1, -1 + }, + { + -9, -213, 33, 16, -12, 4, 2, 2, 0, -9, + 0, -4, 11, -52, 10, 39, -15, 95, -187, -19, + -6, 15, -31, 61, -11, -15, 68, -12, 27, 33, + -27, 18, 25, 2, 0, -8, -6, -5, -1, 1, + 4, 12, 0, -10, 10, -2, -2, 6, 7, 5, + -8, 4, 7, 2, -6, 5, 3, -3, 3, 0, + -4, -2, 0, -1, 0, -1, -2, -1, 1, 1, + -2, 1, 1, -1, 1, 3, -1, 1, 0, -2, + -1, -3, 1, 2, -3, 2, -1, 0, 1, 0, + 0, 0, -2, 0, 2, 0 + }, + { + -597, 73, 93, 76, 0, 1, 2, -42, 17, 27, + -27, -21, 4, 23, -45, -1, 6, 8, -6, 7, + 13, -18, 6, 10, -1, 1, -12, 4, -5, 7, + -2, 4, 1, -2, -10, 17, -2, -4, -6, 10, + 9, -11, 2, 3, 20, -10, 10, -1, 1, -5, + -4, 8, 2, -1, -7, 4, -4, -5, -4, 1, + 6, 1, -2, -3, -4, 0, 3, -3, 1, 2, + 1, -1, -3, 1, 0, 1, -1, -2, 0, 1, + -2, 0, 1, 4, 0, 0, -1, 1, -3, 2, + 0, 0, 0, -1, 1, 0 + }, + { + 16, 44, -45, 0, 1, 4, 1, 0, -14, 6, + 3, 4, -4, -19, 128, 80, 59, 0, 5, -32, + 10, 13, -104, 47, -4, 21, -37, -38, 17, 4, + -12, 2, -8, 12, -3, -16, 12, -3, 7, 10, + -7, -8, 9, -6, 9, 1, -3, -6, 3, -2, + 7, 0, -1, -2, 2, 0, -1, -4, -1, -1, + -4, -1, 2, 0, 0, 1, 3, -2, -4, -3, + 6, 2, -3, 1, 0, -2, 1, -2, -2, -1, + 1, 0, 1, 0, 0, -1, -1, 1, 0, 0, + 1, 1, 1, -1, 1, 0 + }, + { + 282, -2000, -40, -13, 13, -8, 14, 9, -3, 11, + -1, -24, 26, -2, -24, 2, -14, -6, 29, 15, + -11, 13, -21, -19, -7, 8, -4, -3, -7, -1, + -13, -14, 2, 3, 10, -1, -16, -7, 0, 3, + 2, 8, 1, -7, 8, 10, -2, 5, 12, 2, + -7, -6, 2, 10, 2, 0, -6, 0, -2, -2, + 4, 5, 3, -3, -1, 1, 0, 0, -1, 2, + 1, -1, 2, 0, -5, 0, 4, -3, -1, 1, + -3, 0, 0, 1, 1, 1, 1, -1, 1, -1, + -1, 1, 1, -1, -1, 0 + }, + { + 24, 31, -105, 12, -12, 0, 9, 16, 5, -2, + 5, -2, 17, 76, 115, 132, -22, 3, 8, -27, + -37, 2, 28, -5, -35, -8, 34, -20, -12, 4, + -11, 15, -6, 6, 4, -17, -4, 4, -9, 7, + 0, -9, 14, -1, 4, -12, -1, 5, -3, -6, + 4, 2, 5, -4, -2, -1, 6, 1, -10, -2, + -2, 3, 0, -4, 2, 4, 5, 2, -1, -1, + 0, 1, 3, 3, -2, -1, 0, 0, -2, 1, + -3, 0, 3, 1, 1, 1, 0, -3, 0, 0, + 0, -1, 0, 1, 0, 1 + }, + { + -43, -492, -55, 33, 14, -59, 19, 1, 12, 12, + 1, -6, -18, -12, -3, -36, -6, 11, -16, 1, + 17, -13, 2, 11, 8, -11, -12, 17, -6, -19, + -8, -9, -5, -2, -9, -6, 11, 4, -11, 11, + -7, -4, -5, 6, 13, -5, -9, 0, 8, 2, + -11, 3, -6, -15, 7, 5, -1, -2, 3, -4, + 8, 0, 0, -3, -1, 3, -2, 0, 2, -1, + -1, -1, 1, -1, 1, -1, 0, -2, 2, -1, + 0, 1, 1, -1, 2, -1, -2, -1, 0, -2, + 0, -1, 1, 1, 1, -1 + }, + { + -11, 258, 89, -43, 7, -12, -12, -8, -2, 7, + -4, -21, 21, 3, -32, -27, 31, 46, 36, -61, + 3, 24, 21, -9, -11, -3, -21, -17, -14, 1, + 9, 5, -19, -12, 0, -15, -8, 1, 8, 4, + 0, 7, -1, -7, -3, 1, 0, 7, 1, 2, + -3, -7, -1, 3, 4, 1, 3, 1, -3, 1, + 3, -6, 0, 2, 3, -4, 3, 0, -5, 0, + -2, 2, 2, 1, -2, -1, -1, 1, 4, -2, + 0, 2, -2, -1, 1, 0, -1, 1, -1, 2, + 0, 0, 1, 0, 0, -2 + }, + { + 157, -463, -54, 2, 23, -71, 28, 13, 4, -12, + -22, 29, 10, -7, 14, 25, 28, -6, 0, -20, + 14, 4, 6, -7, 8, 1, 6, -21, 4, -10, + 8, -7, -10, 23, -8, -7, 1, 10, 16, -1, + 2, 0, 12, -6, 1, -8, 5, 3, -4, -5, + 0, -3, 2, -3, 3, 2, 0, -1, 1, 1, + -1, -2, 3, 2, -4, -1, 2, -1, 2, 1, + -4, 2, 0, -1, 0, -1, 0, 1, 1, 0, + 1, 0, -2, -1, 0, -3, 2, 0, 0, 1, + -2, 0, -2, -1, 1, 0 + }, + { + -1, 68, 24, 27, -5, 7, -17, 13, 4, -10, + 20, -6, -10, -42, 87, -12, 64, -23, -21, 3, + 8, 51, 20, -28, 42, -10, -8, 21, 6, 24, + -16, 16, 2, 10, -4, -5, 15, -2, 4, -8, + -8, -7, 0, 1, 5, 1, 3, -12, -2, 5, + 2, 0, -5, 1, 3, -3, -10, 2, -1, 0, + 3, 7, -5, -3, -3, 5, -2, 0, 2, -2, + 1, -2, 1, 1, 3, -1, -2, -3, 0, 0, + -2, 2, 1, 1, 1, 0, 1, -2, 0, 0, + 1, 3, -2, -3, 3, -1 + }, + { + -75, 107, 60, 57, -6, 1, -15, 14, 12, -21, + 14, 8, -26, 25, 17, -28, 10, -13, 4, -7, + 10, 7, 3, 13, 2, 8, -1, -20, -10, -18, + 15, -5, -2, 11, 22, -9, -2, 2, 3, 16, + -9, -9, -14, -12, -6, 4, 5, 7, -4, 6, + -10, 7, -1, -5, 2, 0, 6, 2, -4, 1, + 0, 0, 0, -2, 1, 0, 5, -2, 0, -1, + 3, -1, 1, -3, 0, 1, 3, -2, -1, 2, + 1, -1, 0, 2, 0, 0, 4, -1, -3, 1, + 1, -1, 1, 0, 1, -1 + }, + { + 1, 126, 18, 7, 3, -2, -3, 0, -11, 10, + 11, -2, 14, 185, -504, -4, 42, 43, -29, -9, + 53, 4, -29, 28, 38, 16, 0, 18, -8, 31, + -11, -23, 12, -19, -17, 21, -5, -31, 22, -1, + 6, -6, -8, -13, 13, -6, 3, 11, -2, -1, + 3, 1, -1, -8, 0, 7, 0, -2, 2, -2, + -9, 1, -1, -2, -1, -3, -1, 9, -3, -1, + -1, 3, -2, -1, 0, -4, 4, 2, -1, -3, + -2, 0, 2, 4, -3, 1, 1, -1, -1, 2, + 0, 0, 1, 0, -2, 0 + } + } }; -const Word16 hrtfShCoeffsIm_fx[2][16][60] /* Q14 */ = -{ -{ -{ -973,5300,9536,10289,7948,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -9151,18404,17553,15119,10744,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ --429,-1502,-365,506,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -630,132,845,554,-945,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -142,618,178,151,-1950,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ --144,-942,-1322,573,141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -399,946,954,317,716,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ --1391,-1978,495,375,-308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -2594,4388,3089,1617,1339,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -120,2049,4760,7098,6418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -81,-957,-1575,249,-254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -172,-152,4254,6571,4169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -106,894,1364,326,-1185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -278,1694,2518,1214,519,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -13,-146,1965,2096,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -41,30,104,1304,1210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -}, -{ -{ -973,5300,9536,10289,7948,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ --9151,-18404,-17553,-15119,-10744,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ --429,-1502,-365,506,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -630,132,845,554,-945,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ --142,-618,-178,-151,1950,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -144,942,1322,-573,-141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -399,946,954,317,716,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ --1391,-1978,495,375,-308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ -2594,4388,3089,1617,1339,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, +const Word16 leftBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]= { --120,-2049,-4760,-7098,-6418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ --81,957,1575,-249,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -{ --172,152,-4254,-6571,-4169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, + { + { + 324, -936, 994, 1793, -952, 782, 111, 11, -604, 151, + 30, -728, 349, 322, 383, -754, 139, -284, 680, -212, + 299, -227, 219, -359, 427, -193, -285, -74, 376, -191, + 265, -137, 137, -49, -68, 587, -73, -292, -166, 35, + 403, 383, -446, -163, 79, 116, -30, 92, -44, 47, + 14, -18, -152, 254, -137, -164, 32, 93, 17, 84, + -33, 45, -16, 36, 16, -24, 84, -82, -143, -23, + -51, 36, 0, 70, -203, 203, 18, -2, 96, -44, + -85, 50, -8, 54, -69, 12, -2, 81, -144, 10, + 33, 19, 4, 9, -64, 35 + }, + { + -115, 1083, -1057, 1220, -874, 458, 183, 214, -526, -113, + 81, -395, 61, 96, 499, -851, 298, -224, 623, -269, + 45, -165, 534, -354, 97, -307, 199, -144, 33, -201, + 385, 129, -377, -256, 348, -71, 252, -367, -103, -207, + 361, 340, -357, -129, 295, -179, -107, 139, -36, 239, + -169, -77, -3, 82, -162, 188, -126, 132, -131, 92, + 86, 54, -142, -26, 176, -205, 276, -167, 73, -158, + 90, -122, 30, -3, 5, -60, 22, 102, 113, -28, + 14, -24, 50, 4, -85, -57, 89, 20, -49, -110, + 103, -4, 4, -38, 48, 43 + }, + { + 92, 92, -270, 1695, -876, 842, 199, -582, 48, 340, + -373, -611, 535, 190, -159, -211, 483, -294, 149, -54, + -89, 296, -109, 117, -35, 311, -560, -596, -42, -89, + 601, -105, -122, 554, -119, -209, 126, 264, -178, -228, + -1, 169, 209, -18, -2, -348, 246, 293, -97, -270, + 99, -69, -187, 122, 122, 1, -108, -203, -9, 218, + 87, 90, -23, -25, 147, -68, 102, 8, 50, -202, + -74, -104, 63, -54, 70, -153, 81, 90, 41, 14, + 64, 44, -67, -8, 15, 89, -139, -57, -40, 128, + 1, -36, 15, 74, -14, -19 + }, + { + 901, -2909, 953, 1144, -396, 371, -127, 190, -219, -497, + 357, -329, 331, 215, -46, 578, -146, -265, -152, 266, + -190, 481, -392, -487, 655, 359, -444, -412, 423, 376, + -230, -62, 246, -292, 104, 38, 142, -233, 173, -160, + 42, 42, 52, -70, 91, 111, -191, 22, 221, -172, + 40, 131, 36, -170, 65, -75, -84, 163, -169, 166, + -18, 11, -8, -1, 2, 41, -3, 40, -53, -62, + -54, -21, 20, 22, -10, 71, 10, -6, 19, 11, + 21, -37, -25, 25, -18, 35, 29, -64, -36, 19, + 42, -28, -51, 41, 8, 21 + }, + { + -14, 683, -1228, 1426, -1290, 536, 377, -116, 57, -172, + -197, -473, 315, 466, -642, 638, 513, -888, 648, -120, + -184, 407, -138, -775, 1020, -207, -450, -588, 615, -420, + 663, -571, 392, -330, -59, 206, -138, -268, 428, -131, + 170, 53, -92, -242, 168, 337, -377, -92, -79, 417, + -85, -98, 78, 42, 93, -108, 50, -43, -27, 225, + -61, -136, 6, 62, 114, 90, -169, 45, -166, 126, + -82, 8, -85, 69, 29, -17, 34, -36, 88, 26, + -82, 38, -40, 91, -138, 59, 48, -53, -23, 32, + -8, 42, -69, -2, -11, 26 + }, + { + 1191, -3931, 1432, 1329, -148, 138, 203, -216, -246, 88, + 316, -1095, -261, 993, -553, 912, -216, -624, -79, -124, + 939, -680, -642, 273, 352, -329, 744, -716, 584, -465, + -79, -352, 499, 512, -144, -175, -36, -237, 323, 28, + 81, -444, 161, 191, -68, -241, -14, 49, 2, 104, + -88, -4, 131, 25, 46, 98, -39, -219, 30, -25, + 42, 134, -329, 185, -72, 6, 170, -51, -113, 56, + -74, 7, 85, 98, -124, 98, -7, -12, -16, 17, + -90, -92, 43, 5, 33, 100, -25, -11, -78, 15, + 2, -10, 31, 31, -2, 65 + }, + { + -110, 1264, -2001, 1449, -1150, 461, 404, -74, -141, -134, + -34, -242, -740, 346, 200, 740, 4, -592, -136, -124, + 666, 5, -757, -436, 394, -161, 928, -963, 276, 61, + -563, -265, 672, 37, -45, -401, 79, 92, 132, -9, + -56, -238, 271, -27, 71, -121, 161, -65, 16, -148, + 89, -34, 242, -38, 166, -54, -2, -162, 189, -146, + 10, -60, -140, 92, 108, -84, 138, -168, 26, 32, + -17, 31, 36, 27, 92, -60, -15, -3, -44, -64, + 35, -80, -24, 77, -63, 139, -68, 6, -100, 59, + -1, -8, 63, -33, -28, 45 + }, + { + 1036, -3473, 1502, 1339, -326, 468, -158, -181, 152, -360, + 119, -1021, 473, 907, -778, 448, -431, -247, 822, 95, + -293, -304, 772, -741, -602, 882, 172, -100, -429, 338, + -249, 15, -32, -177, 668, -242, -303, 224, -26, 121, + -70, -158, -166, 254, 58, -22, -133, 41, 89, 114, + -54, -411, 278, 262, -65, 168, 11, -3, -261, 67, + 122, -281, 157, 14, -262, 92, 180, 23, -94, -50, + 69, 11, 13, 174, -153, -2, 279, -238, 16, -26, + -71, -75, -11, 30, 80, 51, 31, -24, -96, -21, + 25, 25, 74, 28, -46, 25 + }, + { + -116, 1382, -2353, 1521, -1038, 269, 555, 14, -211, -234, + 108, -642, -242, 741, -34, -181, 162, -498, 726, -33, + -283, 222, 115, -684, 8, 297, 1031, -781, 108, -288, + -195, 681, -732, 628, -284, -132, 157, 203, -99, 142, + -274, 102, 76, -235, 136, 107, 65, -318, 46, 245, + -99, -335, 247, 222, 105, -137, 226, -83, -292, 112, + -69, -36, -47, -31, 47, -31, 143, 127, -132, -107, + 81, -10, 140, 117, -61, -62, 57, 53, -80, -55, + -28, -10, 27, -21, 46, 105, -46, -78, -77, -27, + 103, -20, 35, 49, -25, -73 + }, + { + 674, -2007, 509, 1105, 196, 6, -856, -35, 706, -192, + -278, -457, 784, -617, -91, 363, -137, 482, -519, 271, + -100, 740, -590, 671, -601, -230, 203, -289, 332, 218, + 184, -430, 476, -388, 3, 112, 4, -100, -157, 124, + 328, -154, 250, -636, 117, 165, -504, 366, 112, 223, + -261, 51, 13, -146, 120, 30, 50, -54, 132, -48, + -45, -66, 44, -7, 64, 83, -27, -58, 178, -110, + 15, -35, -5, -172, 97, -119, 95, -39, 119, -77, + 68, 64, -12, -150, 179, -73, 6, 36, -39, -72, + 33, -6, -61, 26, 56, 52 + }, + { + 119, -76, -272, 1074, -187, 364, -1160, 271, 925, -274, + -82, -133, 301, 104, -407, 421, -638, 163, 318, 94, + -500, 707, -326, 228, -203, -581, 193, -84, -558, 653, + 144, 120, 120, -187, 59, 111, -110, 257, -173, 418, + -228, 140, -252, -101, 114, -122, 21, 491, -254, 254, + -66, -341, -131, 67, 81, 13, 51, 217, -111, -62, + -72, -75, 19, 68, 154, -245, 111, -43, -15, -39, + 49, -53, 105, -165, -6, 58, -9, -20, 102, -54, + 3, 79, -25, 22, -40, -28, -90, 84, -123, 102, + -18, -4, 72, 20, 14, -23 + }, + { + 1021, -3322, 1466, 990, 160, -14, -408, 662, -183, 602, + -1784, 602, 516, -967, 776, 211, -32, 169, -13, -257, + 149, 123, -237, 151, -55, -50, -173, 393, 477, -815, + -56, 116, 52, 352, -146, 40, 194, -547, 85, 358, + -484, 80, 234, -217, 88, 244, -133, 144, -102, 238, + 4, -167, 2, 15, 41, -100, -316, 209, -64, 15, + 223, -45, 53, -54, 56, -21, -140, 42, 47, 7, + 12, -59, 38, -6, 56, -14, 33, -129, -78, -27, + -49, 96, -84, -39, 52, -61, 15, 61, 67, -57, + 69, 31, 33, -39, -14, -30 + }, + { + 27, 405, -551, 937, -145, 75, -1209, 694, 130, 352, + 165, -1608, 1427, -861, 261, 190, 264, -599, 319, 323, + -859, 300, -583, 601, 48, -205, -10, 305, -151, 160, + -479, 304, -256, 288, 411, -458, 149, -439, 238, -349, + 80, -17, 350, -272, -6, 147, -157, 200, 11, 39, + 277, -277, -11, -21, 37, -176, -171, 120, -131, 113, + -166, 217, -56, 18, -39, 168, -158, -134, 213, 109, + -135, 11, 113, 13, -15, -75, 142, -171, -52, -47, + 73, -83, -25, -33, 28, 9, 2, 40, -56, 63, + 10, 79, -27, 11, 24, -65 + }, + { + 985, -3109, 1355, 393, 491, -216, -695, 752, 56, -395, + -298, -313, -626, 840, -210, -28, 430, -357, -475, 98, + 112, -13, -2, 197, -512, -35, 432, 56, -220, 157, + -236, -10, -212, 474, -456, 129, -221, 355, -242, 82, + 381, 133, -555, 52, 192, -444, 72, 90, 129, 73, + 184, -74, -53, -216, -97, 203, -89, 76, -94, 76, + 126, -189, 75, -147, 227, -102, 96, 32, -25, -94, + 52, -41, -4, 60, -123, 64, -46, -41, -90, 9, + 0, -22, 86, -20, 87, -77, 25, 61, -15, -64, + -25, -16, 77, -40, 24, -79 + }, + { + 240, -534, 120, 472, 143, -113, -1352, 1110, -202, 234, + -49, -739, 24, 554, 346, -1104, 752, -43, -249, -85, + 155, -73, 337, 406, -565, 148, -47, -351, 236, 147, + -500, 627, -70, 363, -723, 405, 35, -35, -221, 356, + -81, 253, -214, -27, 184, -10, -154, 200, 166, 265, + -39, -220, -28, 28, -51, -13, -12, 187, -103, 125, + -63, -61, 54, 62, 50, -52, -5, 182, -105, 45, + -52, 0, 107, -105, 38, 4, 106, -73, -130, 60, + 95, -81, 55, 10, -28, 142, -34, -19, -50, 3, + -24, 38, 17, -17, 39, 15 + } + }, + { + { + -274, 1760, 4657, 3757, 163, 854, 259, 282, -375, 238, + -181, -1117, -51, -89, 708, -970, -57, -415, 456, 118, + 723, -574, 171, -127, 892, -108, -316, -262, 422, -128, + -98, -272, 646, 572, 235, 791, -1, 40, 75, 146, + 310, 163, -549, -131, 394, 350, -110, -7, -159, 32, + 234, 267, 53, 223, -229, -20, 84, -12, 65, 124, + -101, 107, 66, 59, -24, -193, -120, -92, -5, 76, + -43, 129, -40, 52, -166, 292, 86, 43, 75, -196, + -261, -68, -43, 89, 14, 63, 21, 97, -129, 82, + 64, -29, -43, -14, -28, 52 + }, + { + -21, 3748, 953, 576, -1314, 149, -201, 390, -100, 19, + -90, -442, -164, -384, 20, -1371, 735, 11, 81, -570, + 50, -177, 1174, -499, -386, -453, 349, 351, 463, -187, + 79, -203, -669, -316, 104, -493, 257, -700, -493, -329, + 370, 487, -421, -279, 345, 45, -24, -81, -151, 531, + -97, -308, -46, 282, 79, 448, -64, 140, -214, 32, + 23, -151, -240, -97, -7, -337, 415, 54, 299, -79, + 332, -48, -10, 57, 23, -153, 52, 152, 3, -57, + 2, -88, 59, -3, -129, -79, 141, 131, 4, -113, + 108, -71, 3, -34, 58, 103 + }, + { + 23, 3616, 2930, 2584, 39, 916, 523, 21, 92, 556, + -320, -1075, 480, 315, -314, -876, 696, 223, 137, -33, + 217, 14, -611, 77, 142, 294, -886, -1106, -309, -412, + 627, 149, -96, 806, 51, -174, 335, 507, -215, -96, + -63, -59, 503, 510, 297, -543, 178, 379, 13, -104, + 269, -156, -424, 202, 160, -304, -109, 45, 67, 86, + -29, 72, 100, 119, 20, -57, 315, 157, 72, -281, + 72, 71, 179, -42, 10, -247, -11, 14, 0, -94, + 28, 57, -43, 22, 2, 166, -83, 15, -3, 129, + 8, -73, -15, 128, 21, 15 + }, + { + -791, -5713, 678, 2924, 924, 162, -338, -1, -585, 240, + 1482, 193, 390, -186, 181, 1092, 421, -112, -474, 371, + -496, 277, 294, 64, 561, 366, 124, 236, 787, 614, + -105, 154, 79, -659, 245, 164, -83, -420, -25, -226, + 148, -132, 216, 212, 237, 316, 33, 250, 198, -198, + 360, 206, -36, -145, -85, -94, -66, 20, -279, 214, + -5, 103, 26, -88, -38, 78, 90, 61, -165, -71, + -61, -58, 13, -81, -42, 108, 72, 36, 52, 61, + 30, -28, -76, 21, -29, 31, 71, -136, -101, -2, + 45, 6, 14, 102, 39, -1 + }, + { + 17, 2854, 4, 151, -2399, 406, 329, -98, 230, 701, + 77, -698, 261, -13, -1000, 1163, 1597, -323, 459, -511, + -252, 534, 446, -774, 741, -236, -555, -1371, 44, -1253, + 633, -341, 259, -700, -305, 222, 112, -282, 324, 86, + 322, 56, -49, -253, 245, 347, -463, 208, 234, 762, + -104, -237, 298, 288, 220, 33, 227, 43, -79, 328, + -2, -90, 138, 113, 246, 130, -250, 8, -286, 149, + 56, 61, -196, 64, -33, -105, -10, -61, 94, 62, + 26, 122, -76, 20, -203, 86, 50, -64, 51, 82, + 29, 63, -72, 24, 7, 37 + }, + { + -957, -7376, 1159, 3975, 1829, -276, 263, -177, -182, 363, + 475, -1192, -712, 564, -1116, 131, -1073, -638, -87, -755, + 588, -858, -604, 334, 621, -261, 382, -684, 1219, -616, + -203, -234, 780, 661, 115, 172, -240, -565, 147, -129, + 504, -179, -114, -17, -330, -445, -123, 229, 368, 213, + -189, 99, 245, -32, -67, -99, -122, -176, 35, -81, + 146, 244, -282, 337, -133, -62, 324, 93, -126, -18, + -206, -139, 42, 216, -165, 64, -43, -75, 17, 41, + -108, -21, 76, -1, -27, -27, -57, 80, -8, 82, + 82, 31, 3, 19, 44, 101 + }, + { + -66, 2750, -1268, -145, -2444, 411, 237, -155, 25, 249, + -49, -522, -1081, -388, -262, 751, -351, -803, -129, -557, + 185, -241, -752, -416, 201, -174, 1468, -1349, -540, -359, + -935, -809, 344, -165, -67, -485, 41, 125, -33, -69, + 296, -259, -21, 146, 490, -38, 106, -152, 23, 64, + 46, 24, 404, -127, 212, 28, -30, -149, 198, -309, + 28, 22, -148, 105, 94, -234, -5, -187, 228, 200, + 104, 91, 58, 2, 65, -15, -104, -177, -169, -69, + 108, -89, -84, 86, -102, 111, -104, -20, -45, 145, + 30, -9, -4, -116, -47, 44 + }, + { + -869, -5876, 1818, 3734, 1822, 532, -445, -629, 298, -66, + 342, -1339, 29, 798, -1210, 79, -205, 62, 817, 649, + 94, 23, 1373, -350, -677, 343, -41, 137, -252, 382, + -346, -246, -44, -161, 738, -103, -350, 107, -24, 358, + -66, -140, 284, 442, 16, 198, 111, 85, 49, 290, + -210, -743, 335, 291, -97, 431, 161, 159, -67, 292, + 391, -306, 56, -38, -302, 223, 111, -41, -3, 16, + 117, -127, -218, 141, -119, 40, 454, -167, 100, 18, + -85, -121, -48, 42, 159, 109, 40, 18, -50, -24, + 26, 31, 49, -11, -73, 68 + }, + { + -110, 2365, -2104, -99, -2149, -66, 379, 287, -115, -232, + 203, -689, -349, 316, -331, -481, -97, -221, 1168, -34, + -234, 538, -40, -70, 1091, 290, 654, -718, 754, -298, + -167, 266, -1328, 145, -685, 295, 545, 232, -96, 268, + -125, 176, 109, -424, 166, 360, 73, -383, 41, 125, + 2, -290, 72, 215, 73, -174, 199, -70, -193, 86, + -22, 12, -81, 2, 20, 19, 247, 225, -12, 29, + 135, 36, 225, 104, -67, -84, 62, 173, 48, -50, + -41, -75, 39, -38, 0, 149, -45, -71, -68, -128, + 33, -41, -72, -63, -31, -77 + }, + { + -489, -2034, 2257, 1884, 183, 531, -546, -755, 642, -862, + -348, -472, 85, -1039, -76, 1004, 303, 458, -610, 797, + 190, 736, -421, 41, -1073, 47, 405, 64, 1155, 659, + 321, -50, 434, -291, 25, -262, -166, -8, 12, -51, + -98, -437, 265, -653, 227, 293, -689, -8, 2, 348, + -55, 363, 253, -201, 139, 70, -24, -165, 201, 257, + 154, -100, -18, -81, -10, -63, 33, 108, 415, 4, + 44, -40, -94, -222, 88, -109, 128, -47, 69, -117, + 109, 16, -27, -160, 148, -126, -35, -50, -76, -49, + 20, -3, -64, 41, 102, 92 + }, + { + -5, 2514, 1540, 526, -818, 220, -1164, 751, 1443, -156, + 1033, 90, -200, -271, -738, 155, -1537, 497, 865, 286, + -648, 0, -140, 272, -368, -525, 123, -253, -619, 1223, + 627, 404, 260, 149, 180, 238, 220, 593, -77, 878, + -7, 135, -66, 176, 44, -253, -35, 256, -284, 180, + -85, -96, 45, 131, -15, -250, 29, 221, -266, -103, + 64, 107, -90, -53, -113, -307, 344, -3, -37, -87, + 11, -174, 81, -103, 47, 21, -133, 42, 185, -121, + -134, -13, 59, 150, -132, -196, -30, 212, -30, 273, + 2, -5, 65, -26, -14, -90 + }, + { + -750, -6621, 1157, 1871, 1135, 1523, 791, 742, -68, -643, + -2705, 1452, 1370, -983, 400, 174, 531, 702, -35, 236, + 857, 200, -244, -137, 129, 243, -363, 381, 430, -944, + -380, -16, 319, 565, -388, 191, 637, -377, 60, 213, + -342, 259, -78, -245, 376, 331, -181, 194, 177, 290, + -275, -273, 82, 161, 72, -224, -254, 527, 322, 99, + 10, -230, 98, 103, 101, -74, -126, 62, -127, -188, + -153, -196, -115, -231, 10, -33, -24, -210, -160, -119, + -39, 187, -108, -143, 0, -58, -50, -12, 82, -86, + -12, 19, 110, 21, 23, -14 + }, + { + -14, 3170, 1352, 77, -1176, -846, -1629, 875, 385, 318, + 574, -1302, 1520, -897, -509, -994, -485, -285, 774, 201, + -1305, -79, -760, 681, 707, 253, -73, 97, -296, 482, + -209, 208, -642, -128, 264, -566, 0, -975, -172, -88, + 631, 51, 42, -491, 86, 256, -103, 266, 146, 60, + 109, -747, -126, 175, 56, -250, -388, -104, -129, 14, + -442, 74, -119, 150, 24, 239, -126, -134, 117, 30, + -87, 21, 113, -126, -168, -40, 199, -217, -103, 4, + 148, -157, -160, -33, 89, -36, -105, -50, -177, 11, + 59, 102, -74, 56, 40, -114 + }, + { + -759, -6168, 994, 903, 726, 413, -182, 804, 297, -1794, + -1249, -668, -1827, 142, -285, 122, 86, -830, -820, -13, + 321, -205, -646, -74, -1133, -324, 953, 782, -184, -402, + -650, 10, -197, 441, -417, 11, -388, 825, -254, -131, + 362, 31, -529, 80, 51, -407, -22, 63, 361, 166, + 333, -172, -456, -120, 265, 334, -204, -91, -141, 104, + 258, -36, 40, -443, 92, -146, 133, 214, 190, -33, + 108, -171, -251, -42, -268, 34, -141, -70, -105, -103, + -81, -9, 122, -9, 196, -87, 1, 152, -22, -123, + -66, 36, 250, 44, 27, -37 + }, + { + -87, 1516, 1719, -138, -811, -1377, -2194, 1054, 444, 407, + -545, -1044, 91, 418, 61, -1447, 371, -59, -384, 107, + 174, -487, 457, 825, -342, 451, -100, -707, 222, 97, + -205, 1400, 92, 507, -412, 752, 188, -1, -490, 167, + -186, 491, 86, 471, 654, 394, -1, 527, 507, 343, + 287, 68, -142, 43, 94, -3, 108, 320, -261, 114, + 136, -5, 92, 237, 31, -48, 181, 73, -136, 184, + -55, -35, 134, -94, 38, 114, 288, -24, -242, 100, + 167, -89, 166, 91, -38, 146, -125, -89, 47, 86, + 24, 130, 66, -17, 107, 42 + } + }, + { + { + 82, 6214, -885, 1260, 2343, 758, 190, -8, 529, -568, + -317, -437, -360, -609, 728, -649, -86, 323, 237, -599, + 780, -665, 380, -502, 541, 433, -196, -413, 187, 164, + -818, 573, 424, 253, 348, 374, 242, 101, 89, 43, + 118, -115, 39, -157, 165, 344, 60, -171, -57, -29, + 142, 132, 402, -14, -154, 208, -53, -61, 109, 36, + -4, 0, 220, 64, -170, 68, -362, 91, -144, 64, + 162, 2, -104, 33, 24, 30, 83, 206, 7, -169, + -244, -159, 37, 103, 91, -60, 145, -35, -46, -7, + 39, 35, 45, -35, -55, 16 + }, + { + 131, 1495, 2083, -861, 926, -253, -213, -160, 548, -350, + 11, -50, -417, -226, -20, -198, -275, 17, -417, -64, + -295, 378, 448, -345, -28, -479, -287, 402, 772, -81, + -58, -553, -454, -13, -311, 112, -120, -586, -496, -67, + 38, 303, -559, 7, 391, -281, 115, 108, -284, 424, + -147, -153, -36, 131, 573, -100, 28, 150, -121, -213, + 58, -121, -8, -114, -114, -119, 137, 193, 271, -54, + 218, 96, -78, 66, -77, 0, 30, 23, -121, -6, + 135, -94, -129, 170, -119, -48, 43, 84, 46, 61, + -141, -48, -18, 27, 83, 73 + }, + { + -84, 5324, 1480, -459, 2720, 665, 438, 393, -226, 2, + 273, -927, 156, 239, -101, -794, 65, 223, 195, 315, + 419, -26, -537, -169, 356, -100, -227, -1217, -252, -447, + 815, -395, 212, 508, 255, -335, 373, 432, -326, 202, + -456, 316, 283, 470, 333, -249, 307, -77, -35, 84, + 209, -47, -318, -45, 177, -221, 78, -95, 225, -102, + -38, 75, 45, 22, 25, 154, 171, 155, 8, -33, + 36, 87, 67, -113, 108, -161, -139, -67, 61, -27, + -5, 68, -51, 79, -127, 211, -24, 41, -50, 137, + 34, -64, -47, 62, -18, -11 + }, + { + 722, -4784, -1767, 2821, 610, 653, -440, -203, -13, 912, + 397, 386, 251, -294, 637, 320, 93, 515, -477, 329, + -211, 94, 377, 107, 492, 356, 250, 522, 431, 525, + 20, 115, 41, -430, -218, 18, -366, 38, -299, 152, + 110, -78, 199, -143, 543, -14, 191, 312, 58, -176, + 158, 420, -90, -61, -231, 193, 21, -233, -224, 339, + -23, -169, 207, -175, 132, -2, 160, -71, -302, 111, + -135, 0, 50, -111, -49, 100, 17, 74, 83, -14, + -9, 24, -14, -12, -6, -3, 41, -128, 18, -60, + 84, -80, 81, 73, -10, -38 + }, + { + 7, 2256, 714, -782, -736, -367, 190, 232, -104, 448, + 16, -111, -20, -56, -261, 604, 939, 395, 168, -675, + 394, -728, 999, -152, 187, 31, -698, -1013, -412, -698, + 98, 63, -85, -182, -589, 134, -232, 429, 20, 106, + 28, 199, 42, 132, -106, 340, 8, -102, 173, 613, + 103, -423, 8, 592, 145, 319, 150, -60, -55, 174, + 140, 14, 37, 134, 278, 89, -126, -147, 90, -104, + 161, 23, -191, -3, -64, -187, 11, 5, 68, 107, + 42, 123, -123, -52, -94, 78, -8, 34, -5, -5, + 129, 28, -3, -38, 12, 73 + }, + { + 825, -5136, -2818, 4076, 994, 498, 145, -29, -258, 273, + -172, 344, -388, -649, -688, -147, -1444, -573, 189, -257, + 54, -636, 2, -246, 134, 362, 195, -338, 677, -216, + -551, 200, 702, 304, 142, -74, -203, 20, -171, 128, + 227, -16, -344, 184, -711, -242, 227, 22, 365, 218, + -60, -73, -43, 88, 186, -330, -248, 116, 14, 110, + 24, -7, 81, 115, -23, 31, 195, -35, 59, -75, + -205, 101, -143, 127, 21, -123, 56, -67, 29, -29, + -182, 213, -72, 5, -23, -59, -8, -61, 139, 68, + 29, 62, -10, 41, 0, 58 + }, + { + 131, -1024, 2671, -997, -1473, 179, 4, -369, 382, 334, + -435, -477, -607, -434, 66, 353, -538, -544, -523, -597, + -7, -215, -324, -159, 380, 47, 152, -413, -650, 98, + -1324, -820, 517, -303, -397, -2, 112, -243, 186, -241, + 402, -236, -156, 534, -164, 57, -53, 285, -175, 136, + -163, 127, -8, 172, 174, -28, 116, -36, -13, -225, + -35, 20, -109, 40, -92, -75, -114, 66, 104, 185, + 108, 129, -37, 146, -32, -29, -22, -158, -164, 96, + -76, -68, -49, 116, -100, 66, 22, -145, 11, 131, + 36, -35, 7, -114, -40, -58 + }, + { + 780, -3267, -2446, 3234, 1992, 780, -482, -490, -32, 364, + -182, -570, -540, 590, 160, -537, -700, 860, 372, 917, + 309, -69, 720, -254, 303, -546, 485, -101, 219, -175, + -207, -160, -239, 344, 344, 78, -409, 162, 176, 486, + -65, -217, 183, 475, -75, 217, -49, 271, 128, -6, + -203, -364, 316, -9, -72, 407, 85, 79, 94, 444, + 235, -22, -96, -119, -210, 273, -50, 70, 73, -34, + 38, -190, -81, -59, 66, -16, 346, -66, 97, 23, + -19, -25, -97, 98, 120, 69, -47, 63, 35, -55, + -9, -17, 50, 54, -98, 127 + }, + { + 134, -2134, 2754, -1086, -1138, -173, 84, 226, -52, -276, + 17, -345, -58, -451, 29, 2, 193, -423, 227, 835, + -459, 411, 210, 520, 678, -262, 710, -855, 1009, -651, + 907, -706, -706, -173, -802, 147, 817, 198, -99, 111, + 4, -34, 175, -453, 278, 52, -57, 76, -28, 173, + -163, -150, -23, 121, 129, -138, -54, 109, -108, -54, + 83, 20, -71, 2, -57, 111, 148, 155, 88, 113, + 88, 205, 1, -22, 47, -112, 165, 70, 90, -114, + 18, 18, -46, -142, 129, 1, -76, 49, -38, -116, + 23, -73, -25, -42, -167, -47 + }, + { + 333, 589, -99, 875, -11, -573, 2066, -498, -590, -825, + -448, -33, -449, 189, -176, 302, 168, -417, 623, 177, + 676, -178, 48, -684, -462, 772, -580, 502, 706, 891, + 262, 353, -748, 521, 388, -489, 33, -498, 609, 63, + 262, -833, 63, -407, -114, 2, -1, -371, 92, -83, + 138, 339, 141, 295, -48, -198, 214, -398, 0, 539, + -90, -1, 74, -17, 69, -313, 297, 99, 329, -28, + 49, -36, -256, 80, -61, 88, 7, 12, -106, -34, + 107, -67, -109, -55, 53, -46, -26, -39, -25, -110, + 85, 70, -110, 24, -36, 91 + }, + { + -51, 3739, -12, 440, -25, -1099, 122, 957, 113, -169, + 1639, -247, -336, -475, -898, 412, -1163, 280, 669, -513, + 548, -658, 271, -339, 461, -584, -85, 306, -122, 1017, + 612, 39, 236, 256, -778, 1123, 332, 370, -67, 207, + 514, 208, -224, 104, -105, -99, 414, -165, 2, -137, + -73, 168, -28, -130, 20, 116, -79, -46, -184, -93, + 124, 172, -99, 117, -323, -161, 228, -156, 95, 35, + 93, -165, -155, -7, 115, -69, 15, 92, -135, 44, + -125, -97, 23, 226, -86, -199, 36, 107, 135, 145, + -31, -26, -53, 130, -79, -28 + }, + { + 486, -6883, -197, 1041, 873, 642, 2393, -63, 167, -1039, + -564, 80, 722, 436, -268, -325, 64, 856, 460, 263, + 616, 387, 165, -294, -113, 652, -501, 329, 34, -667, + 54, -297, 183, -126, 380, -263, 768, 92, 238, 49, + -343, 104, -334, 315, 35, -17, 153, 157, 310, 31, + -366, -93, 276, -58, 336, -449, -45, 389, 252, 98, + 163, -167, -85, 161, -38, 81, -165, -7, -49, -386, + -13, -166, -219, -160, -20, -6, -162, -32, -158, -231, + 78, 75, -88, -60, 5, -43, -164, 18, 91, -55, + 38, -73, 48, 158, -38, -29 + }, + { + 24, 3244, 440, 97, -643, -369, -1218, 589, -35, 181, + -7, -340, 818, -703, -1034, -256, -1019, 386, 982, -858, + -530, -443, 109, 215, 703, 81, -131, -535, 767, 193, + 581, -536, -254, -19, -308, -122, -628, -754, -359, 505, + 346, -262, 136, -271, -195, 224, 110, 143, 293, 118, + -110, -494, -26, -35, 167, -395, -121, -344, -174, 106, + -399, 61, -279, 13, 281, 72, -135, 186, -157, -88, + 53, 23, -134, 76, -89, -74, 54, -26, -239, 97, + 24, -100, -91, 104, 63, 2, -244, 31, -215, 17, + -33, 35, 73, 23, -50, -69 + }, + { + 532, -6199, -813, 1217, -154, -209, 1783, -243, -376, -447, + -1341, -250, -1785, -269, -1070, 792, 472, -949, -983, 572, + 181, 215, -1109, -439, -460, -383, 579, 844, -12, -621, + -707, 393, 14, -153, -264, -170, 207, 71, 353, -10, + 73, 53, -601, 404, -483, 215, -284, 53, 252, 292, + 149, -196, -185, 75, 122, -98, -1, -176, 143, 73, + 68, 167, -32, -462, 205, -234, -20, 109, 257, 175, + -99, -45, -313, 13, -216, 82, -172, -88, -17, -28, + -94, 4, 175, -19, 54, -58, -21, 122, 85, -127, + -72, 116, 122, 105, 0, 51 + }, + { + -4, 3632, -348, -97, -605, -1140, -1640, 504, 506, -86, + -490, -378, -20, -955, -381, 1316, -595, 25, -242, -136, + -960, 374, 384, 196, 557, -207, 392, -732, -116, 1038, + -50, 210, 799, -527, 548, 330, 113, 555, -575, -295, + 20, 188, 258, 627, 250, 599, -65, 590, 316, 144, + 677, -71, -238, 169, -70, 75, 126, 150, -39, -32, + 498, -56, -184, 167, -10, 106, 264, -142, 23, 13, + 108, -152, -19, 28, -40, 428, 67, -150, -235, 196, + 19, 104, 124, -87, 62, 24, -64, 36, 56, -25, + 168, 5, 128, 5, 46, 9 + } + }, + { + { + 160, 6927, -1919, -2777, -1000, 408, 206, -286, 779, -349, + 57, -90, -293, -537, 551, -456, 445, 1194, -239, -2002, + 30, -837, 588, -128, 136, 69, 98, -230, -274, -145, + -683, 664, -95, -153, -54, -180, 145, 168, 232, -76, + -255, -451, 65, -45, 124, 192, -131, -306, 51, -10, + -231, -226, 308, -140, -255, 136, -37, -138, -32, -26, + 103, 98, 196, 269, 52, 215, -247, 25, -209, -29, + 27, -32, -140, -99, 78, -61, -50, 262, 101, -50, + -63, -37, 111, 118, 72, -112, 20, -63, 38, -32, + 4, 33, 76, 33, -8, 0 + }, + { + -96, -2345, -979, -1426, 1034, -363, -152, -130, 621, -323, + -134, 173, 360, 437, 65, 299, -538, -804, -254, 922, + -92, -314, -19, 307, 74, -773, -547, 269, 213, -244, + -101, -296, -372, -226, 171, 585, 188, -188, -263, 77, + -194, -87, -368, 88, -22, -431, 156, 115, -323, 269, + -290, -109, -10, -80, 330, -235, -6, 69, 35, -315, + -11, 7, 246, 46, -41, -30, -89, 69, 133, -123, + 135, 76, -146, 14, -78, 10, -66, -143, -168, 21, + 170, 60, -21, 214, -31, -36, -75, -50, -25, 76, + -157, -56, -42, 57, 32, -123 + }, + { + 25, 2430, -2109, -3201, 761, -71, 218, 206, -204, -182, + 190, -832, -154, -203, 53, -126, -120, -70, 276, 436, + 201, 191, -177, -3, 270, -575, 318, -528, 139, -1, + 512, -700, 84, -240, -201, -35, 242, 245, -172, 314, + -276, 319, -176, -200, 313, 450, 501, -167, -132, -63, + 82, 260, 29, -141, 46, -220, 269, 18, 179, -282, + -90, 76, 22, -186, -179, -1, 15, 105, -79, 4, + 53, 95, 121, -140, -76, -107, -44, -57, 96, -71, + -44, 136, -48, 63, -108, 95, -40, 96, -28, 37, + -17, 32, -63, -24, -43, -31 + }, + { + -776, -2073, 1369, 1549, -457, 651, -176, -305, -273, 210, + -284, -84, -164, -489, -322, -201, 126, 678, -230, 523, + 393, 105, 333, -3, 87, 49, 74, 181, -61, 60, + -203, 132, 382, -380, -751, -477, -317, 355, -324, 258, + 73, -7, 422, -99, 468, -493, -148, 64, -2, 115, + 82, 119, -88, 87, -189, 259, 37, -163, -132, 86, + -112, -69, 265, -132, 121, -127, 160, 45, -127, 163, + -123, -54, 38, -113, -29, 51, -132, -57, -10, -56, + -41, 23, 76, 42, -6, 6, -28, -156, 34, -40, + 91, -81, 106, -27, 0, 29 + }, + { + -37, 379, -296, -311, 348, -248, 81, 89, -360, 128, + 59, 497, -11, -676, -873, -733, -464, 364, -80, -508, + 559, -804, 932, -350, -40, 534, 160, 27, -61, -389, + -220, 172, -90, 34, -7, 414, 17, 420, -272, 36, + 185, 212, -179, -40, -141, 262, 169, -56, -163, 224, + 85, -369, -252, 218, -71, 217, 60, -70, -127, 47, + 65, 44, 110, 204, 166, 26, 8, -67, 236, -265, + -10, 30, -132, -23, 15, -107, 110, 62, -15, -22, + 11, 102, -158, -41, -28, 45, -76, 49, -54, -97, + 101, 3, -34, -47, 11, 67 + }, + { + -931, -1614, 1369, 1590, -1586, 301, 377, -128, -658, -45, + -175, 592, -244, -532, -535, -284, -643, 141, 293, -160, + 35, -490, 258, -396, 199, 739, 172, -245, 599, 218, + -156, 318, 153, -117, -49, -62, -249, -21, -210, 84, + 139, 129, -401, -67, -700, -48, 560, 9, 160, -107, + -121, 162, -157, 4, 286, -168, -136, 180, -52, 27, + -86, -52, 295, 12, -221, -29, 66, -77, 186, 16, + -82, 231, -134, -15, 93, -4, 107, -97, 8, 0, + -121, 220, -212, -69, 56, -48, 86, -48, 64, 83, + 43, 117, -45, -30, -46, -64 + }, + { + 0, -2137, 2242, -236, -24, 188, -44, -80, 396, 120, + -329, 107, -381, -519, -85, -575, -1013, -251, -11, -331, + -474, -298, 853, 169, -48, 377, -39, -232, 55, 1326, + -62, -446, 255, 236, -101, 21, 89, -349, 480, -153, + 171, -331, -186, 602, -464, -88, -122, 93, -224, 308, + -288, -273, -444, 102, 96, -120, 36, -28, 30, -109, + -146, -240, -99, 46, -150, 49, 24, 124, 82, 72, + -43, 228, 93, 112, 18, -2, 11, 122, 30, 118, + -75, -18, -44, 49, -180, 9, 93, -130, -26, 31, + -36, -34, 66, -71, -26, -91 + }, + { + -904, -413, 936, 434, -956, 358, 153, 111, 130, 393, + 180, 336, -340, 308, 990, 289, -849, 782, 125, 427, + 77, -84, 243, -485, 497, -622, 435, -70, 627, -126, + -259, 184, 8, 69, -159, 92, 89, 293, -85, 238, + 21, -85, -267, 88, -25, 335, -130, -112, -30, 48, + -124, 17, 197, -410, -81, 403, 223, 176, -139, 171, + 176, 74, -193, -47, 52, 298, 0, 165, 19, -55, + 118, -132, 0, -43, 64, -133, 193, -10, 139, 32, + 31, 126, 9, 158, 80, -10, -96, 63, 101, -37, + -32, -39, 25, 61, -68, 64 + }, + { + 93, -1826, 3533, -233, 295, 18, -154, 159, -27, -162, + -25, 164, 228, -808, -97, 617, 924, -210, 263, 1002, + -301, 300, -610, -83, 440, -703, 531, -671, 873, -625, + 1098, -511, -600, -53, -361, -20, 561, -211, -570, -185, + -14, -96, 114, -381, 300, -253, -209, 324, -94, 4, + -5, -50, -205, -103, -21, -154, 130, 232, -164, -127, + -23, -98, 24, 89, -110, 107, 53, -44, 33, 94, + -45, 82, -66, -36, 135, -91, 10, -83, -64, -133, + 151, 25, -110, -167, 115, -21, -32, 136, 62, -8, + 60, -14, -17, 8, -45, 42 + }, + { + -330, 4107, 2331, -266, -727, -607, 2324, -747, -1001, -961, + -221, 269, -2, 663, -137, -521, -881, -1339, 123, -214, + 332, -843, 520, 225, 411, 858, -829, 400, -452, -43, + 23, 254, -688, 517, 268, -238, 293, -810, 685, 373, + 421, -516, 204, -296, -295, 65, 368, -279, -73, -167, + 13, 271, 243, -140, -421, -272, 206, -250, -126, 225, + -97, 49, 9, -90, 73, -380, 178, 111, 136, -164, + 106, 79, -198, 194, 32, 96, 111, -1, -302, -147, + 107, -147, -121, 138, 16, -3, 125, 25, 12, -55, + 74, 54, -102, 19, -101, 19 + }, + { + 1, 2765, -1580, -725, 130, -228, 635, -145, -870, -698, + 736, -179, -25, -888, -1568, 794, 345, -109, -262, -681, + 541, -517, 655, -657, 810, -67, 37, 908, 409, -35, + -37, -525, 47, 521, -1233, 377, -364, -42, -144, -39, + 108, -159, 48, 405, -62, 35, 330, -358, 199, 1, + 24, 73, -102, -325, -62, 114, -305, -79, 176, 199, + 73, 113, 220, 312, -19, 106, 42, -285, 161, 193, + 75, -152, -112, -151, -91, 57, 232, 68, -275, 95, + -36, -81, -24, 70, -67, -75, 149, 154, 91, -26, + -106, -68, -155, 76, -42, 53 + }, + { + -365, -7475, -933, -267, 259, -1399, 458, -263, 334, -528, + 439, 5, -65, -339, -362, 377, -87, 339, 642, 267, + 134, 43, 663, 211, -357, 500, -299, -56, -84, -130, + 83, -475, 125, -451, 299, -463, 523, 327, 251, -23, + -76, -20, -599, 292, -78, -106, -72, -143, 220, -142, + -224, 127, 483, 97, 366, -377, -211, -106, -60, -161, + -73, -142, 99, 83, -231, -46, -208, 52, 68, -286, + 17, -125, -79, 108, -47, -99, -81, 195, 42, -96, + 114, -98, -60, 84, 19, -17, -152, 32, 139, -9, + 71, -65, -7, 162, -80, -80 + }, + { + -43, 718, -1646, 189, -280, 226, -727, 381, -154, -78, + -220, -219, 1028, -382, -1263, 730, 254, 794, 402, -651, + -69, 353, 658, -632, 245, -212, -120, -563, 317, -89, + 379, -549, 450, 51, -193, -123, -778, -654, -133, 776, + 316, -269, 307, -132, -408, 186, 156, 1, 90, -34, + -186, -346, -93, -105, 439, -115, 33, -145, -3, 300, + -35, 206, -388, -25, 183, -148, -262, 142, -251, -57, + 87, -102, -141, 190, -146, -96, 39, 179, -35, 172, + -2, 3, 18, 95, 124, 129, -91, 159, -116, -76, + -126, 6, 99, 42, -79, -77 + }, + { + -431, -6037, -445, 1082, 35, -765, 1706, 224, 42, 588, + -29, 587, -1210, 368, -1066, 442, 177, -462, -451, 552, + 51, 493, -432, 25, 189, -311, 231, 402, -318, -640, + -560, 381, 62, -455, -259, 340, 542, -279, 239, -92, + -53, 289, -24, 761, -506, 361, -212, 70, -75, 292, + 168, -295, -24, -13, -204, -172, -69, -35, 367, -165, + -76, 86, -65, -358, 214, -102, 2, -53, 49, 20, + 63, 81, -359, 120, -44, 178, -106, -35, 105, 59, + 41, 116, 85, -97, 59, 13, 24, 74, 116, -8, + 57, 45, -49, 129, 25, 45 + }, + { + -35, 3654, -595, -285, 74, 416, -878, -151, 134, -123, + -100, 140, -128, 564, 1479, 1952, -57, 246, 143, -705, + -995, 431, -383, -242, 664, -358, 565, -199, -135, 791, + -54, -181, 628, -565, 477, 135, -385, -119, -464, -307, + -137, -12, -33, -28, -379, 272, -330, 128, 72, -14, + 570, 56, -74, 115, -318, 18, 83, 156, 212, -183, + 178, -111, -124, 50, -102, 90, 135, -34, 58, -268, + 127, -98, -255, -115, -125, 90, -120, 38, -37, 94, + -60, 76, -82, -102, 75, -89, -50, 13, -57, -68, + 106, -113, 174, 54, -32, 0 + } + }, + { + { + -271, 6944, -338, -3706, -1086, 459, 251, -109, 788, -477, + 248, -166, -182, -191, -72, 104, 217, 966, -266, -1547, + -257, -527, 53, 224, 60, 116, 24, -240, 21, -576, + -79, 470, 240, -465, -234, 259, 276, -209, 139, 74, + -364, -227, -65, 116, 206, -25, -198, -162, 31, -120, + -143, -33, 53, -137, -184, -6, -15, -230, -61, 54, + -61, 221, -4, 337, 144, 128, 34, -276, -48, -163, + 23, 1, -181, -28, 2, -1, 70, 30, 134, 47, + -63, -25, 28, 143, -20, 50, -91, 28, -50, 50, + 52, -7, 55, -6, 58, 16 + }, + { + -20, -3556, -160, 262, -1024, -202, -175, 395, -82, -181, + 284, -159, 730, 264, -23, -251, -104, -920, 85, 743, + 209, -584, 52, 464, -60, -363, -210, 44, -394, 253, + -223, 30, -723, -44, 49, 427, 200, 117, -337, 215, + -404, -301, 28, -161, 29, -213, 314, -129, -319, 102, + -138, -62, 13, -21, 40, -95, 81, -93, 57, -314, + 35, 204, 51, 54, -98, 18, -67, 89, 136, -132, + 29, 101, -78, -5, -35, -42, -166, -123, 50, -31, + -5, 118, 114, 62, 71, -57, -95, -58, 36, 29, + -62, -24, -26, 4, 17, -170 + }, + { + 27, -1125, 50, -2009, -913, -103, 258, 313, -348, -302, + 613, -1000, 33, -524, -31, 134, -138, -14, -14, 697, + -361, 734, -68, -218, 336, -279, -356, -81, 87, 215, + -58, -110, -209, -64, -427, -50, 185, 116, 13, 56, + 82, 29, 129, -212, -57, 586, 319, -28, -164, -201, + 191, 437, -237, 79, 43, -243, 208, 69, 42, -210, + -82, -49, 218, -305, -80, -14, -110, 85, 104, -110, + -54, 235, 70, -124, -176, -181, 129, 43, -74, -28, + 71, 33, -6, 62, -58, -83, 75, 41, 8, -13, + 25, -4, -3, -57, -6, -34 + }, + { + 864, -37, -2165, 778, 725, 258, 49, -346, -369, -245, + 243, -426, -235, -81, -626, -245, 309, -72, 370, 681, + 319, 35, -360, 235, 340, -242, -69, 117, 93, -74, + 52, 37, 491, -494, -406, -620, -159, 6, -25, 49, + 208, 72, 345, 187, 249, -348, -237, 46, -236, 363, + 29, -14, 138, 40, -71, -3, 55, -84, -32, -327, + 214, 79, 147, -112, -69, -30, 152, 131, 45, -75, + -53, -193, 123, -3, -73, 65, -113, -2, -115, -57, + -37, 2, 77, 136, -87, 25, -101, -73, -52, 42, + 132, -125, 115, -37, 14, 26 + }, + { + 23, -2302, 1599, 329, -80, -62, -102, 112, -162, -90, + 361, 485, -88, -808, -871, -580, -780, 623, -1142, 327, + 171, -25, -293, 210, 21, 86, 368, 277, -2, -13, + -638, 42, 86, -130, 624, 201, 221, 296, -540, 9, + 605, -335, 86, 95, -210, -122, 303, 15, -220, 91, + 117, -174, -349, 88, -180, 298, -68, -30, -101, 20, + 58, 101, 101, 104, 170, 107, -153, -132, 135, -21, + -96, -64, 42, -155, 92, 16, 151, -5, 18, -95, + 5, -27, -55, 55, -133, 46, -80, 46, -79, -30, + -1, 11, -44, -9, 45, 57 + }, + { + 1023, -829, -1435, -11, 353, 14, 33, -201, 194, -673, + 364, -518, 302, -1, -559, -504, -205, 29, -650, 62, + 486, -551, 325, -855, 1094, 551, -103, 10, 133, 390, + 131, 592, -296, 9, -60, -178, -254, -175, 74, -109, + -28, 215, -465, -197, -254, -210, 493, -257, 177, -20, + -131, 316, -12, 2, -113, 223, 13, 57, -276, -54, + -12, 74, 192, -187, 99, -150, 29, -75, 115, 53, + 121, 182, -149, -156, 156, 90, 40, -90, -51, -27, + -23, 44, -90, -58, 60, 22, 80, 22, -74, 62, + 46, 129, -47, -6, -79, -66 + }, + { + -97, 54, -506, 406, 125, 52, -40, 297, -104, -56, + -236, 229, -323, -30, -274, -656, -1190, -723, 375, -185, + -726, -228, 755, 365, -22, 130, 213, -407, 134, 1308, + 228, 29, -365, 712, 78, -398, 450, -449, 314, 242, + -77, -303, -258, 420, -129, -114, -153, 173, -409, 323, + -82, -354, -216, -90, 141, -341, 100, -27, -51, 77, + -157, -155, -102, -177, -87, -10, 151, 75, 28, 44, + 162, 163, 108, -66, 45, 96, 14, 50, 224, -142, + 5, -6, 98, -76, -115, -41, -13, 20, -118, 45, + -65, 17, 5, -52, -69, 12 + }, + { + 1082, -230, -1054, -1051, 309, 140, 370, -190, 233, 165, + 1211, -290, -254, 350, 497, 980, -750, 67, 233, 455, + -80, 22, 323, -322, -1, -332, 275, 84, 392, 65, + -212, 143, -81, 59, -243, -141, 555, 124, -217, 5, + 50, 83, -390, -168, 202, 143, 151, -292, 158, 14, + -248, 174, -166, -3, -111, 271, 131, 323, -112, 3, + 244, -88, -33, -53, 158, 200, 65, 111, -35, 72, + 103, -239, -4, 120, -84, -59, 54, 112, -14, 68, + 28, 157, 24, 101, 97, -67, 2, 59, 83, -57, + 1, -69, 73, 55, -12, -64 + }, + { + -150, 2163, -1006, 714, 229, 158, -159, 5, 59, -22, + -194, 389, -15, -598, -272, 548, 809, -15, 178, 458, + 212, 223, -239, -443, 283, -466, 292, -162, 194, 297, + -206, 70, -429, -189, -89, 9, 228, -6, -791, 38, + 146, -232, -35, -397, 245, -192, -71, 153, -94, -95, + 77, -71, -111, -209, 108, -196, 146, 158, -105, -135, + -127, 5, 79, -66, -36, 18, 85, 20, -1, -67, + 10, -28, -4, 75, 41, -55, -3, -109, -87, -60, + 52, 44, -116, -26, 51, 14, -59, 86, 65, 136, + -66, 88, -58, -24, 22, 85 + }, + { + 366, 6307, -588, -115, -1034, 138, 1251, -222, -869, -501, + -774, -105, 336, -47, 629, -480, -1082, -787, -174, -695, + 309, -788, 386, 404, 449, 917, -642, -3, 67, -389, + -89, -80, 72, 331, 171, -498, 339, -325, 9, 415, + 248, 85, -595, 16, 99, -205, 228, 229, -145, -217, + -92, 120, 698, -491, -329, -24, -169, -179, -19, -112, + -30, 177, 39, -229, 127, -161, -157, 208, 51, -219, + 247, -31, 34, 39, 45, 42, 100, -72, -212, -91, + -19, 88, -235, 36, 59, 46, 216, 38, 26, -59, + 64, -54, -7, 9, 16, -104 + }, + { + 12, -532, 1292, -512, -213, -238, 867, 34, -921, -325, + -244, 174, -210, -190, -955, -201, 647, -534, 281, -870, + -372, 690, 657, -1124, 674, 342, -170, 279, 990, -748, + 334, -311, -79, 81, -411, -645, -88, -271, -11, 183, + -279, -335, 348, 63, 219, 208, 185, -237, 165, 2, + -113, 186, -147, -480, 123, 34, -17, -339, 338, 233, + 10, -146, 326, 232, 241, -4, -11, -113, 36, 327, + -142, -94, -60, -64, -236, 13, 188, 42, -51, -74, + 146, -144, -87, -77, 58, 2, 215, 76, -20, 11, + -23, -109, 5, -104, -2, 56 + }, + { + 224, -8132, -491, 27, -382, 14, -1368, -126, 86, -250, + -389, 657, -582, -32, -740, 143, 820, -529, 1030, 417, + 83, -188, 298, 312, -158, 272, 293, -423, -283, 344, + -272, -343, 177, -185, 21, -472, 325, 363, -36, 225, + 225, -287, -262, 146, -204, 31, -183, -397, 234, -139, + 246, -89, 141, 310, -100, -75, -75, -171, -292, -49, + -15, -220, 113, -60, -243, -28, -101, -113, 213, 25, + -226, -84, 98, 115, -168, -30, -138, 163, 167, -134, + 90, 4, -6, 121, -82, -102, 13, -54, 69, 153, + -13, -47, 24, 28, -49, 66 + }, + { + 17, -1827, 171, 119, 159, 45, -479, -49, 181, -172, + -427, 372, -334, 716, -230, 680, -495, 1092, 132, -435, + 160, -267, 995, -317, -847, 589, -431, -197, -384, 275, + 403, -887, 513, -380, 660, -476, -206, -493, -83, 397, + 177, -59, -142, -10, -152, 92, 229, -161, 57, 84, + -419, -231, -90, -19, 333, 68, 8, 125, -126, 195, + 221, 157, -400, 95, -74, -120, -275, 215, -127, -14, + -76, -15, -64, -25, 145, -144, -81, 191, -33, 228, + -209, 137, 168, -162, 264, 143, 21, -36, 44, -196, + 5, 63, 152, -120, -54, -39 + }, + { + 354, -5756, -980, 536, 300, 216, 346, 563, -362, 669, + 197, 240, -522, -279, -478, 321, -127, -511, 442, 20, + 178, 352, -506, -48, 779, -349, 207, 72, -154, -454, + -570, -66, 128, -232, 232, 192, 145, -282, 317, 122, + -190, -238, 464, 453, -578, 219, -71, 245, 73, 156, + 35, -170, -77, -35, -361, 156, -239, 216, 244, -187, + 204, -174, -179, -111, 21, -80, 87, -118, 54, -37, + 46, 44, -127, -82, 160, 1, -8, -106, 76, 29, + 112, 128, -1, -28, 17, -33, 181, 9, 7, 57, + 38, 2, -56, 104, 104, 0 + }, + { + 37, 1735, 790, -836, 632, 172, -697, -120, -159, 42, + 279, 147, -404, 2, 3203, 373, 531, 214, 890, -725, + -478, -155, -158, -71, 333, -406, 164, 88, 327, 614, + -10, -590, 542, -535, 449, 70, 72, -633, -408, 21, + -105, -435, -186, -151, -22, 93, -164, -84, 152, 227, + 242, 131, 13, -59, -379, -3, 254, 98, 265, -153, + 94, -66, 28, -147, -184, 186, -31, 285, -46, -144, + 41, -232, -70, -40, -29, -196, -29, 83, -38, -117, + 28, -26, -94, 61, -11, -112, 4, -32, -132, 14, + 15, -66, 124, 48, -25, -44 + } + }, + { + { + 311, 6139, -395, -2025, 339, 348, -1, -55, 1013, 88, + 90, -726, -284, -41, 8, -80, -133, 741, -357, -244, + 1140, -264, -187, -184, -514, -333, -129, 19, 689, 216, + 314, 311, 629, -124, -149, 429, 521, -110, 25, 314, + -66, -72, -160, -70, 39, 114, 46, 172, 86, -190, + 82, -8, -143, -141, -285, -198, -32, -290, -144, 0, + -179, 90, -261, 164, 76, -85, -33, -211, 50, -141, + -74, -2, 16, 110, -56, -85, -40, -63, 72, 45, + -109, -33, 7, 43, -78, 40, -77, 48, -67, 79, + 87, -50, 32, 13, 55, 30 + }, + { + 70, -1006, 2043, 1342, -1053, -279, 38, 631, -130, -186, + -100, -489, 373, -47, 66, -504, 368, 266, 745, 460, + 425, -527, -218, 24, -154, -79, 100, 200, -453, 255, + 113, 388, -677, 81, 33, 42, 65, 395, -272, 162, + -222, 181, 208, 19, 431, -43, 158, -393, -372, 186, + 212, 204, 68, -94, -271, -145, 185, -6, -64, -355, + 240, 226, -160, 10, -158, 71, 142, 119, 162, -140, + -87, -22, -39, 58, -11, -21, 19, 97, 126, 66, + 75, 51, 49, -23, 24, -7, 16, -22, 24, 53, + 136, 111, 27, -39, -2, -109 + }, + { + 9, -4921, -2305, 777, 339, -207, 371, -117, -627, -176, + 435, -965, 387, -198, 454, 652, 34, -713, -920, 312, + -425, 449, -265, 92, 324, -399, -657, -82, 78, 5, + -10, 23, -502, -16, -107, 49, -145, -450, -289, -54, + 239, 120, 279, -340, -437, 290, 84, -41, 37, -118, + 169, 259, -256, 242, 33, -163, 177, 47, 143, -135, + -126, -138, 193, -70, -50, -125, -89, 14, 70, -137, + -136, 47, 59, -21, -177, -126, 244, 125, -45, -33, + 79, 46, -48, 72, -29, -122, 65, 100, 89, 53, + 57, -52, 39, -5, 18, -25 + }, + { + -830, 117, 308, 544, -82, 122, 102, -410, -369, -594, + 71, -215, 105, 229, -373, -123, 223, -207, 93, 335, + -31, -102, -509, 31, 508, 134, -286, 157, 0, -151, + 389, 69, 239, -259, 141, 223, 337, -100, -20, 4, + 537, 220, 233, 145, -39, -44, 16, 79, -232, 169, + -59, -6, 157, 75, 29, -56, 54, 90, -65, -317, + 210, -103, 191, -6, -78, 181, 151, 141, 95, -165, + 1, -47, 136, 104, 0, 59, -79, 36, -84, -48, + -23, -6, -2, 120, -58, 33, -66, 41, 9, 25, + 54, -122, 66, -77, 32, 26 + }, + { + 15, -3099, 969, 580, -328, -9, 69, 173, 69, 32, + 326, 318, -13, -578, -313, 387, -769, -24, -926, 155, + -277, -364, -1068, 466, 394, -438, -67, 198, -122, 264, + 28, 16, 62, -260, 92, -73, 476, 346, -285, -105, + 641, -369, -217, 33, -135, -87, 70, -92, -259, -34, + 120, 137, -158, 99, -27, 255, -204, 17, -163, -169, + -117, 52, 76, -68, -20, -33, -113, -90, -15, 86, + 71, 55, 16, -182, 133, 76, 196, -58, -29, -111, + -4, -48, 15, 97, -215, 30, -36, 42, -74, -40, + -74, -11, -44, 17, -3, -30 + }, + { + -848, -1518, 996, -194, -289, -221, 59, 384, 613, -744, + 383, -747, 470, 303, -453, -330, -199, 44, -380, 102, + 275, -412, 414, -698, 953, 248, -41, -110, -325, 153, + 139, 227, -353, 322, 201, -211, -401, -366, -90, -199, + -137, 107, -392, 31, 194, -97, 330, -506, -101, -152, + -365, 156, 225, 225, -191, 148, -15, 42, -175, -29, + 77, 107, -23, -177, 189, -102, 76, -77, 78, -6, + -7, 70, -96, -133, 35, 53, 60, -26, -30, 0, + 8, -1, -70, -78, 36, -26, -17, 14, -103, -6, + 10, 51, -66, 36, -36, -43 + }, + { + 31, 883, -884, 116, -237, 24, -23, 137, -494, 49, + -63, 372, 128, 285, -156, 111, -181, -412, 533, -123, + -1007, -481, 65, 213, -323, -97, 562, -209, 68, 493, + -112, 267, -86, 586, 57, -427, 442, -232, -25, -110, + 4, 126, -21, 228, -32, 37, -193, 307, -75, 299, + -152, -208, 55, -296, -97, -286, 188, -49, 55, 287, + -118, -110, -86, -169, -28, 64, 219, 13, -19, 53, + 127, 2, 66, -49, 52, 31, -96, -71, 224, -138, + 74, -102, 21, -82, -59, 76, 9, 69, -134, 19, + -103, -9, -21, -53, -66, 56 + }, + { + -1086, -1161, 1253, -1501, -394, -223, 447, -115, -21, -261, + 1304, 82, -66, 410, 22, 282, -581, 208, -130, -227, + -412, 86, 619, -147, -15, -29, 146, -244, -83, 21, + 146, 297, -414, -401, -169, -119, 310, 13, -286, -211, + -74, 220, 82, 107, 116, -79, 302, 197, 439, 114, + -189, 107, -97, 263, -41, 98, 12, 254, -172, -8, + 105, -199, 154, -86, 30, 208, 44, 135, 42, 95, + 78, -240, 35, 172, -96, -64, 2, -5, -172, -7, + 10, 106, -101, -64, 15, 22, 74, -30, -2, -29, + 48, -96, 12, -6, 43, -22 + }, + { + -67, 1395, -2973, 268, -219, 30, 11, 94, 101, 71, + -398, 56, 603, 269, -323, -699, -352, 133, 321, 80, + -192, 108, 34, -4, 273, -639, 651, -190, -273, 317, + -370, -26, -317, -8, 212, 262, 99, 313, -511, 297, + 215, -234, 72, -444, 200, 1, -137, -218, -160, -66, + -83, 8, 59, -193, 71, -205, 141, 21, -96, 22, + -96, 58, -8, -163, 57, -82, -22, -63, -56, -67, + -35, -48, 60, 75, 41, 7, 106, 38, -28, -39, + -9, -1, -62, 30, -40, -29, -28, 55, -6, 70, + -61, 87, -89, 50, 95, 19 + }, + { + -307, 4970, -1269, 239, -419, 304, 525, 453, 10, -265, + -920, -213, 196, -577, 311, 476, 113, -264, -402, -1485, + -217, -585, 12, 219, -263, 678, -154, -8, 239, -340, + 172, -154, 240, 420, 109, -353, 127, -495, -346, -148, + -75, 306, -482, 66, 168, -326, 74, 446, 149, 115, + 3, 49, 647, -59, 185, 49, -255, -137, -38, -471, + 6, 198, 35, -222, 34, 35, -117, -47, -67, -98, + 187, -43, 103, -138, -99, -89, 93, 125, 50, -18, + -108, 82, -147, 52, -49, 24, 155, 18, 126, -28, + 91, 30, -25, -87, 28, -80 + }, + { + 71, -2656, 55, 272, 28, -96, 996, 276, -396, -151, + -279, 542, 124, 59, -185, 325, 323, -647, 599, -589, + -524, 433, -224, -1202, 278, 93, -180, -114, 305, -1094, + 593, 109, 116, 80, -298, -710, -190, -446, 19, 76, + -403, -173, 198, -334, 347, 313, -159, -378, 140, 155, + -126, -3, -58, -113, 398, 174, 96, -397, 281, 244, + 82, -261, -75, -26, 256, -187, -94, -112, -59, 306, + -84, -65, 31, 2, -175, -25, 61, 118, 23, -190, + 99, -130, -5, 81, 221, -36, 89, 61, -4, 125, + 45, -80, 106, -103, -70, 64 + }, + { + 95, -6664, 1944, 1113, -793, -87, -1542, -309, 77, -273, + -1941, 67, 6, 433, -920, -960, 36, -776, 972, 7, + -159, 80, -322, -287, -206, -36, -18, -192, 54, 525, + -1, -129, 49, -470, 200, -135, -145, -274, -646, 260, + 523, 88, 12, 9, 188, 189, -349, -298, 87, -302, + 251, -230, -353, 208, -236, -96, 84, 157, -39, -144, + -89, -183, -67, -324, -59, 96, 10, 64, 253, 270, + -17, -68, 203, 144, -203, 102, -126, -25, 178, -24, + 40, 78, 114, 138, -77, -68, 32, -110, -20, 146, + 26, -29, -4, -65, -87, 71 + }, + { + 38, -2443, 278, 470, 264, 118, -467, -207, 39, -100, + -73, 566, 2, 1212, 426, 941, -530, 520, 35, 768, + 270, -1507, -57, -36, -864, -101, -814, 177, 332, 384, + 496, -536, 498, -153, 672, -715, 16, 226, 293, 25, + -381, -469, -470, -7, 46, -136, 48, -206, 93, -9, + -379, 37, 125, 186, 137, 60, 57, 85, -1, 98, + 158, 283, -47, 241, -148, -18, -303, 145, 135, 38, + -93, 168, 59, -48, 198, 96, -38, -88, -130, 156, + -203, 160, 124, -327, 118, 156, 164, -53, -19, -51, + 151, 37, 53, -90, 34, 28 + }, + { + -176, -4502, 521, -81, 474, -111, -861, 12, -921, 67, + 438, 12, -771, 404, 965, 998, -157, -441, 612, -218, + -181, 28, 249, 661, 842, 7, 430, -56, -6, -134, + -556, -227, 422, 510, 136, -597, -495, -383, 216, 138, + -54, -618, -290, 35, -551, 25, -19, 116, 449, 560, + -10, -158, -134, 44, 10, 289, -383, 176, 218, -199, + 170, -245, -108, 74, -88, -202, 62, -152, 78, -56, + -6, 130, 107, -82, 102, -145, -71, -100, -49, -197, + -86, 81, 77, -8, -71, -31, 164, -52, -49, -12, + -4, 61, 16, 22, -10, 23 + }, + { + 81, -677, -582, -562, 85, -359, -610, 95, -166, 301, + 257, -323, -289, -934, 1817, -382, 300, 3, 1139, 224, + -45, -357, 81, -223, 34, -302, -337, -141, 254, -118, + -305, -280, 566, -636, 47, 90, 15, -590, 55, 379, + -41, -298, -320, -53, 352, -216, -348, 44, 171, 70, + 31, -19, -61, 8, -231, 163, 251, 89, 214, -118, + 53, -130, 230, 15, -113, 76, -49, 319, -3, -84, + -7, -123, 206, 114, 24, -134, -46, 37, -7, -79, + 136, -12, -70, 37, -107, -135, -3, -68, -166, -33, + 1, 22, 90, 21, 45, 16 + } + }, + { + { + -477, 2003, 2809, -480, -166, 94, 102, 530, 317, 590, + -609, -850, -138, 316, -404, 174, 51, 119, -247, 92, + 1321, -271, -519, -445, -198, -71, -351, 102, 144, 433, + 520, 277, 329, 58, -207, 391, 520, 158, 111, 299, + -100, -229, 18, -195, -90, 87, 180, 247, -119, 95, + -85, -120, -8, -185, -179, -123, -120, -150, -103, -40, + -131, -6, -21, -9, -58, -117, 27, -148, -31, -110, + -23, -33, 122, 53, -63, -23, -132, -2, 58, -11, + -56, -123, 25, 5, 15, -70, 62, -73, 38, 27, + 43, -34, -27, 75, 18, -34 + }, + { + -20, 1818, -5, 1090, -60, -263, -112, 537, 78, 113, + -465, -792, 473, -149, -8, -22, 93, 733, 192, 202, + 491, -53, -114, -464, -204, -152, 299, 73, -58, 63, + 435, 178, -554, 207, -423, 306, -361, 683, -175, 182, + -225, 138, 167, 255, 277, 96, 88, -380, -196, 146, + 78, 98, -2, 26, -122, -128, -5, 27, -80, -187, + 109, 204, -12, -165, -4, 22, 125, 55, 128, -141, + 4, 0, -56, 0, 25, -10, 95, 115, 45, 171, + 46, 65, 4, -51, -53, 5, 63, -25, 53, 14, + 211, 35, 26, 23, -60, -49 + }, + { + -22, -5867, -1011, 1876, -471, 115, 242, -132, -464, 160, + 7, -727, 107, 182, 369, 310, -247, -387, -512, -130, + -108, 3, -58, 256, -300, -346, -211, 23, -177, 85, + 125, -198, -58, -555, 148, -100, -296, -474, -321, -150, + 370, 83, 186, -268, -96, 138, -11, -137, 114, 115, + -31, -174, 232, -9, -67, -1, 255, 33, -23, 9, + -187, -20, -17, 146, -207, 19, -26, 25, -26, 0, + -193, -19, 63, 46, -177, -26, 55, 49, 102, -30, + 37, 0, 50, 82, -8, -63, 27, 75, 52, 75, + 31, -42, 43, 11, 9, -33 + }, + { + 602, -1458, -590, 907, 247, 110, 176, -430, -426, -314, + -84, -229, 366, 83, -488, -198, -73, 777, -828, 370, + -25, -229, -154, 319, 139, 366, -886, 648, -175, -18, + 453, 329, -149, -28, 246, 170, 226, 181, -187, 11, + 401, 377, -29, 180, -7, 88, -268, 339, -143, -60, + -4, 130, 59, 196, -37, -54, 39, 92, -73, -85, + -121, 94, 33, 170, -221, 216, 90, 148, 14, -22, + -116, 99, -32, 241, -37, 34, -12, 9, -37, -66, + 58, -20, 19, 14, -69, 64, 53, 9, -27, 17, + -22, -68, 46, 11, -44, -28 + }, + { + 1, -1592, -467, 626, -197, -37, 52, -59, 369, 74, + 459, -62, -83, -141, -20, -64, -104, -550, -204, -614, + -305, -147, -604, 5, 205, 306, -536, -49, -3, -46, + 221, 26, 30, 30, -186, -94, 377, 347, -154, -30, + 235, -11, -279, 13, -208, 156, 106, -146, -279, -18, + -1, 264, 20, 135, -38, 19, -14, -26, -26, -121, + -184, 73, 0, -208, 116, -194, -38, 129, -177, 41, + 136, 72, -60, 4, 31, 49, 66, -51, 18, -83, + -47, 132, -63, -41, 8, -73, 45, -62, -34, -75, + -47, -27, 44, 10, -82, -21 + }, + { + 432, -2530, 71, -546, 465, -149, -119, 601, 132, -191, + -45, -361, 361, 392, -601, 225, 17, -390, -415, 253, + -24, 14, -200, 49, 135, 90, 336, -102, -86, -185, + 77, 99, -22, 102, 196, -420, -51, -313, -327, 68, + -276, 180, -371, 14, 199, -32, 127, -235, -211, -75, + -90, -96, 121, 194, -14, 50, -25, 101, -38, -272, + 133, 114, -96, 68, 85, 69, -140, 14, 86, -25, + -31, -59, -45, 13, -92, 103, -38, 62, -87, -1, + 80, -63, -125, -45, -33, -36, 47, -33, 6, -66, + -54, 60, -68, 39, 10, 9 + }, + { + 44, 647, -284, -198, -238, 16, -22, -17, -296, 38, + 203, -3, 283, 581, -497, 127, -3, -52, -6, 271, + -1078, -320, -578, 586, -405, 345, 366, -144, 200, -219, + -130, 245, 109, 91, 415, 25, 4, -92, -32, -156, + -184, 327, 112, 144, -238, 28, -120, 55, 330, 26, + -52, -88, -86, -221, -248, -230, 96, 110, 151, 56, + -54, -11, -175, -23, -60, 147, 108, 74, 21, 33, + 26, 16, 35, 58, -23, 4, -95, -144, 209, -45, + 24, -38, -55, -8, -16, 18, 25, -3, -23, -7, + -55, -72, -11, 38, -133, -5 + }, + { + 857, -3018, 59, -1491, -15, -98, 690, -299, -93, 85, + 228, 656, -83, 437, -142, 45, -116, -32, -98, -643, + 492, -98, 161, 105, 172, 14, -201, -139, -120, -75, + 413, 85, -297, -383, 56, -99, 150, 98, -113, -106, + -12, -4, 332, 128, 50, 113, 15, 495, 174, 97, + -3, 5, 32, 95, 122, -86, 242, -30, -93, 72, + -107, 88, -13, 65, -86, 161, 175, -37, 225, 55, + -103, -32, -78, 111, 119, -120, -164, 52, -9, -94, + -3, 31, -59, -123, 42, 49, 26, -10, -62, 57, + -24, -88, 36, -3, 15, 23 + }, + { + 159, -1507, -176, -719, 54, -86, 181, -170, 235, 38, + 122, -371, 557, 648, -661, -161, -100, -251, 71, -21, + -105, -35, 121, 260, 204, -282, 104, -138, 146, 50, + -303, -314, -88, 37, 194, 333, 10, 257, -279, 330, + 114, -499, 74, -18, -245, 164, -327, -209, 62, 130, + -333, 90, 84, -88, -47, 69, -154, 14, -242, 107, + 70, -11, -18, -97, -65, 44, -97, 17, 34, -86, + -127, 28, 26, 16, 67, 2, 85, 40, 1, 0, + -26, -20, 20, -53, -33, -35, -17, 31, 23, 26, + 20, -56, -13, 36, 90, -9 + }, + { + 205, 3926, -851, -39, 300, 826, -201, 463, -55, -12, + -699, -180, 312, -416, -391, 379, 554, -670, -720, -335, + -1247, 167, -361, 306, -144, 57, 284, 39, 343, -587, + 259, -25, -47, 397, 215, 10, -281, -286, -259, 43, + -473, 120, 8, -6, -116, 55, 64, 240, 8, 59, + 301, -140, 467, 106, 187, -116, 16, -94, -214, -311, + -38, 21, 256, -71, -224, 67, -77, -60, -67, 103, + 100, -41, 2, -153, -147, 12, 92, 126, 6, -18, + 10, 116, -164, 32, -45, -54, 124, 106, -3, 65, + 47, 38, -84, -61, 12, -21 + }, + { + -108, -2560, -267, 469, -2, 476, -104, -286, 477, -268, + 198, 179, 283, 77, -73, 357, 236, -176, -70, 359, + -413, -239, -1019, -4, -120, -12, -27, 127, -394, -273, + 161, 258, 110, 18, -282, -323, -401, -631, -61, -5, + 78, -215, -66, -104, 143, -117, 179, -393, -164, 183, + 190, -7, -109, 187, 267, 215, 38, -342, 228, 120, + 179, -11, -256, -125, 179, -252, -89, -73, 4, 104, + 17, 104, -52, -78, -64, -56, 45, 221, -110, -70, + -63, -33, 71, 56, 125, 63, 27, 60, 97, 38, + 74, -26, 51, -29, -85, 39 + }, + { + -509, -3745, -99, 1368, -639, -1260, 78, -463, -247, -345, + -1443, -358, 311, 230, -481, -909, -683, -257, 10, 640, + -219, 425, -855, -131, -315, -71, -155, 195, 55, 176, + 58, -47, 120, -572, -113, 510, -90, -441, -667, 313, + 364, -22, 421, -239, 266, -80, 5, -91, -64, -364, + -33, 99, -363, -183, -9, 104, 10, 20, 143, -150, + -276, -49, -204, -16, 114, -90, 75, 82, 202, 53, + 123, 17, 106, 78, -89, 61, -22, -7, 81, -22, + 50, 29, 108, 110, -132, 88, -119, 6, 23, 70, + 31, -61, 28, -76, -66, 63 + }, + { + -31, -1360, -288, 354, -84, -13, 42, -122, -80, -438, + 377, 186, 530, 353, 695, 718, 64, -31, 47, 518, + -4, -148, -1310, 213, -179, -994, 301, -585, 628, 210, + 382, 310, -311, 64, 427, -481, -156, 561, -73, 218, + -4, -696, -428, -109, 10, -289, -158, 13, 230, -237, + -83, 31, 170, 239, -89, -136, 239, -131, 164, 27, + 345, -29, 56, 135, 98, -218, -119, 49, 189, -172, + 0, 126, 91, 82, 128, 77, 14, -112, -102, 17, + -8, 108, -117, -92, 40, 130, -18, 54, 72, 23, + 142, 14, -19, -4, -100, 26 + }, + { + -96, -3204, -426, -329, 837, -1025, -193, 72, -675, -508, + 793, -720, -32, -203, 1777, 633, -505, 605, -34, -138, + -277, 254, 471, 574, 117, 225, 839, 51, -117, 219, + -210, -738, 287, 685, -33, -528, -518, -224, 149, -113, + 11, -374, -488, -183, -76, -367, 152, -7, 476, 403, + 197, -25, 44, -266, 144, 246, -272, 111, 117, 135, + -118, -145, -107, 111, -259, 8, -174, -58, -118, 79, + 95, 59, 147, -63, 81, -193, -90, -32, 4, -202, + -64, -7, 66, 23, -57, -1, -29, 41, -17, 12, + 5, 36, 61, -15, -86, 77 + }, + { + -180, -1255, -8, -219, -565, -216, -149, -117, 40, 67, + 267, -651, 92, 626, -1456, 57, 76, -169, 1063, 426, + -277, -59, -362, 47, -241, -204, 48, -576, 18, 514, + -494, -11, 43, -236, -156, -218, 186, -168, -118, 325, + -195, -6, -281, 154, 90, -215, -179, -187, 234, 58, + -91, -4, 194, -275, 89, 101, 64, 221, 55, -1, + -99, 9, 163, -94, 127, -149, 85, 37, 117, -32, + 62, -156, 51, 300, 3, -74, 98, -39, -36, -70, + 239, 12, -97, -138, -9, -44, -113, 51, -69, -122, + -72, 42, 40, 28, 125, 43 + } + }, + { + { + 727, -1683, -2477, 641, 1030, 219, 431, 376, 204, 780, + -281, -784, -231, -139, -482, 354, -178, -95, -28, -88, + 462, -297, -128, -112, -113, 19, 49, 167, -135, 63, + 264, 193, -167, -211, -226, 222, 395, 221, 199, 225, + -23, -253, -94, -357, -137, 208, 226, 135, -161, 299, + -48, -261, 109, -84, 12, 151, 45, 31, 77, -51, + -96, 216, 180, -33, -77, -15, 140, -63, -24, -51, + 99, -15, 32, 18, 14, -12, -85, 71, 45, -66, + -30, -151, 78, 45, -4, -39, 80, -151, -28, -85, + -59, -61, -61, 13, -2, -38 + }, + { + -29, 2840, 277, -6, 327, 45, -254, 229, 123, 83, + -625, -931, 289, 234, 487, 135, -531, -101, -320, 145, + 273, 410, 580, 104, 1, -622, -299, -242, 141, 300, + 440, -21, -598, 87, -382, 278, -472, 905, -114, 338, + 7, -177, -165, 155, 61, -106, 204, -54, 5, 171, + -161, -140, -32, 6, -130, -125, 15, -12, -25, 24, + 109, 92, -51, -202, 123, 59, 21, -64, -60, -122, + 69, -10, -40, 2, 26, -8, 63, 10, -97, 118, + -31, -26, 18, 45, -70, -56, 42, -54, -12, -45, + 74, -52, -24, 66, 24, -38 + }, + { + -103, -3515, 1569, 3060, 225, 86, 63, -138, -4, 91, + -499, -642, 155, 158, 281, 209, 37, -244, -499, -139, + -257, -140, 32, 429, -206, 26, 512, 230, -204, 161, + 39, -343, 120, -516, -61, -290, -605, -121, 104, -195, + 5, -35, 209, -202, 264, 92, -81, 2, 324, 241, + -181, -351, 195, -237, -82, -110, 179, 59, -72, -102, + -184, 51, -93, 139, -135, 52, 5, 113, -15, 97, + -92, 72, 54, 14, -61, 5, -45, -2, 57, -59, + 22, 13, 19, 103, 131, 33, -15, 29, -14, 2, + 67, 21, 58, 24, -6, -116 + }, + { + -201, -2434, -175, 646, -391, -79, 172, -234, -22, 47, + -126, 102, 171, -478, -730, 321, 6, 488, -1318, -76, + -207, 51, 345, 382, -127, -98, -647, 631, -215, -39, + -19, -48, -259, 143, 174, -75, 41, -53, -417, -66, + -68, 129, -263, -143, 184, 295, -202, 350, -148, -36, + 24, -9, -103, 123, -110, -137, 34, 76, -2, 156, + -61, 188, -138, 75, -216, 68, -73, -48, -17, 99, + -97, 60, -113, 163, 37, 101, 11, 34, -16, -19, + 112, -7, -4, -31, -61, 84, 152, 62, 23, -8, + -37, -41, -21, -1, -38, -87 + }, + { + -81, -173, 390, 221, -22, 62, 43, -380, 19, 125, + 283, -261, 83, 290, -141, -351, 288, -263, -135, -581, + -59, 139, 106, 229, 172, 971, -278, -280, -299, -351, + 64, 267, -79, -15, -157, -7, 226, 174, -29, 74, + 5, 249, 54, 46, -77, 286, 279, 86, -156, 29, + 41, 269, -118, 79, 146, 159, 83, 108, 124, -24, + -40, -4, 38, -118, 88, -196, -35, 62, -121, -13, + 27, 121, 35, 61, -58, -70, 38, 62, 155, 8, + -87, 72, -43, -62, -14, -28, 104, -48, 46, 3, + 9, -2, 45, -14, -40, 34 + }, + { + 100, -3335, 587, -760, -468, -9, -85, 350, -467, -60, + 301, 382, 52, 103, -710, 194, 418, -388, -536, -39, + -371, 225, -79, 77, -385, -500, 310, 57, -179, -267, + 121, 51, 28, 179, 156, -434, 255, 75, -214, 188, + -39, 312, -154, 58, 158, 183, 309, 113, -9, -2, + -48, -235, -106, -67, -25, 150, -23, 121, 73, -99, + 134, 31, 53, 112, -93, 75, -141, 95, 119, -46, + 9, -106, -146, 35, -95, 10, -98, 59, -63, -82, + -62, -52, -102, -16, -31, -54, 0, -51, 49, 10, + -18, 65, -23, 29, 19, 49 + }, + { + -9, 607, 297, -271, -18, 52, -151, -45, -82, 36, + 25, -166, 441, 31, -1365, -144, -530, -255, -335, 345, + -456, 41, -428, 521, -287, 579, 392, -335, -214, -615, + -182, 455, 141, 66, 382, 147, -134, -122, 230, 94, + -277, -101, -26, -4, -253, 219, -217, -163, 112, -80, + 138, 1, -131, -26, -201, -226, 49, -16, 32, -76, + -132, -8, -41, 113, -62, 122, 3, 87, 111, -34, + 16, 149, 36, 105, -82, -38, -74, -177, 83, -43, + 78, -8, -111, 49, -7, -86, 17, -31, 38, 4, + 19, 16, 34, 76, -108, 13 + }, + { + -448, -4281, 710, -1672, -517, -164, 323, 52, 226, 234, + -743, -113, -460, -81, -806, -598, 141, 246, 302, 67, + 903, 47, -82, -151, 301, -20, -67, 413, -31, -392, + 81, 35, 284, 515, 553, -85, -129, 21, 95, 129, + 215, 44, 381, 22, -72, 112, -235, 181, -144, -53, + 17, 68, 74, -112, 48, -29, 301, 23, 4, 202, + 54, 135, -146, 55, -129, -55, 147, 49, 80, -20, + 15, 173, -25, -25, 142, -8, -120, -24, 48, 0, + 62, 13, -23, -61, 24, -61, -70, 20, -73, 50, + -26, -72, 19, -19, -31, -2 + }, + { + 33, -1571, 1321, -342, 101, -184, 245, -23, 70, -200, + 179, -197, 684, 515, -443, 1323, 1331, -373, -457, 203, + 142, -23, 87, -24, -349, -341, 183, 85, 288, 208, + 50, -645, -317, 381, 395, 0, -60, 406, -137, 233, + -296, -679, 66, 66, -28, 146, -251, 46, 53, 248, + -124, 199, 58, -80, -124, 105, -240, -96, -189, 174, + 96, -4, 91, 102, 21, 68, -93, 115, 197, 60, + -143, 17, 21, -31, -1, -69, 48, 26, -51, 74, + 67, 36, 76, -106, -48, 49, 106, 107, 35, -59, + 14, -11, 27, -22, 11, -15 + }, + { + -204, 3995, 54, -219, 785, 1719, 184, 19, -118, 296, + 249, -281, -650, -724, -264, 89, -37, -495, 184, 628, + -750, -25, -387, 68, -348, -351, -17, -40, 407, -591, + -105, 51, -79, 295, 145, 288, 114, 81, 288, 292, + -380, 351, -38, -157, 38, 301, 18, -313, -446, -153, + 380, -374, -56, -70, -55, -251, 118, -129, -224, -196, + -59, -125, 322, 290, -46, 159, 16, 0, 56, 100, + 38, -4, -88, -191, -104, 102, 47, -42, 1, 59, + 59, 139, -111, 44, -75, -39, 160, 55, -117, -9, + -7, -70, -118, -20, -72, -16 + }, + { + 5, -2020, -217, 321, 19, 171, -394, -637, 195, -42, + 203, -228, 47, -506, -197, 352, 354, 434, 215, 657, + 42, -590, -805, 374, 92, 235, -309, -47, -399, 82, + 68, -92, 298, 65, -503, -160, -312, -645, -25, 45, + 386, 81, 21, 11, 44, -523, 14, -306, -266, 242, + 388, 47, -52, 198, 146, 183, 133, -89, 173, -34, + 234, 55, -128, -215, 45, -149, -16, 83, 7, -2, + 24, 16, -77, 28, -44, 6, 84, 102, -65, 59, + -144, 65, 103, -115, -1, 106, 18, 45, 106, 26, + 56, -72, 8, 24, -51, -21 + }, + { + 830, -1417, -960, 368, -112, -734, 1029, 125, 127, 419, + -265, -236, 57, 570, 689, -36, -592, -484, -122, 704, + -383, 338, -885, -264, -337, 255, 361, 387, -132, 7, + 154, -375, -110, -253, 15, 467, 32, -106, -445, 225, + -80, -416, 554, -79, 96, -7, 383, 3, 264, -321, + -103, 279, -39, -174, -101, 21, -1, -99, 270, 109, + -70, 96, -50, 200, 224, -39, -103, -120, -19, -83, + 189, -11, -13, 10, -38, 34, -97, 61, 130, -39, + -21, -80, -20, 19, -81, 116, -88, 64, 3, -14, + 20, -53, 34, -36, -52, 46 + }, + { + -60, -450, 44, 449, -316, -248, 222, 58, 38, -409, + 514, -32, -879, -1438, -15, 72, -7, -305, -291, 243, + 4, 273, -719, 409, -124, -1169, 660, -600, 450, 115, + -248, 172, -99, -60, 164, -355, -157, 360, -418, 102, + 213, -43, -30, -216, -222, -359, -77, -133, 249, 238, + 313, 29, -38, 16, -53, -260, -173, -325, 241, 70, + 268, -207, -127, -25, 76, -293, -35, -104, -187, -313, + 104, 71, -45, 56, 76, 90, 49, -87, -120, -32, + 8, 34, -45, -9, -123, 74, 2, 51, 108, 69, + 94, -30, -16, 14, -101, 57 + }, + { + 418, -2384, -138, -72, 435, -536, 546, 369, 61, -165, + 907, -490, -426, -1076, 871, 89, -1350, 149, 242, 233, + -119, 494, 317, 346, -327, -81, 894, 204, 203, 528, + 339, -417, 117, 252, 152, 101, 144, -159, 75, -318, + -194, 89, 64, 21, 10, -216, 241, -71, 52, 74, + 23, -48, 149, -77, 171, 74, -331, 43, -79, 142, + -156, -100, -116, -110, -216, 173, -182, -80, -99, 109, + 32, -7, 200, -11, 44, -22, 106, -32, 43, -73, + -1, -16, -70, -88, -75, 21, -87, 2, -1, 98, + 80, 75, 75, -13, -14, 77 + }, + { + 148, -988, -146, 150, -338, 314, 475, -344, 125, -354, + 319, 22, 241, -656, -4086, -405, -56, -350, 315, -126, + -321, 344, -408, 145, -277, -470, 274, -198, 414, 985, + 74, 55, -200, -160, -390, -621, 255, 62, -248, -79, + -249, 255, -186, 116, -158, -167, 71, -94, 76, -93, + -81, -6, 359, -31, 198, 63, -106, 28, 34, -23, + 13, 180, 137, -237, 45, -300, -111, -84, 146, -22, + 122, -57, -91, 261, 146, 137, 203, -43, 15, 43, + 309, 106, -129, -188, -17, -24, -96, 70, 26, 1, + 27, -1, -38, 10, 30, -23 + } + }, + { + { + -865, -1912, 383, 2036, -1146, 684, 555, 86, 427, 165, + 221, -1096, 289, -58, -342, 158, -563, 374, -58, 225, + -177, 226, -66, 60, -351, -132, 369, 167, 4, -248, + 360, 47, 50, -486, 233, -216, 363, 310, 326, -51, + -80, -234, -15, -176, -34, 214, -13, 143, 23, 202, + -16, -347, 463, -261, -50, 22, 304, 32, 18, -34, + -221, 252, 116, 46, -141, -71, 233, -59, 14, -49, + 142, 71, -112, 13, 75, -137, 47, 30, 89, -137, + 47, -96, 13, 55, -75, 89, 5, -129, -83, -44, + -117, 6, -29, 6, -22, -55 + }, + { + -5, 2478, 442, -2072, 1571, 24, -99, -21, 198, -101, + -203, -961, -16, 560, 304, 253, -716, -629, -331, 509, + 417, 147, 812, 403, 70, -497, -447, -325, 94, 294, + -180, 193, -353, -6, -105, -183, 283, 355, 127, -79, + 276, -31, -230, -106, -6, 119, 29, 116, -8, 162, + -207, -181, 225, -240, -247, -1, -4, 64, -130, 119, + 137, -7, 109, -335, 92, 71, 0, -12, -172, -6, + -7, -54, -4, 116, -52, 39, -70, -5, -36, 22, + -99, 51, 21, 26, -18, -42, -13, 19, -71, -45, + 7, -16, 11, 9, 63, -50 + }, + { + 288, -1733, 24, 2760, 206, 195, -28, -273, 184, -45, + -522, -909, 657, -435, 706, 40, -352, 47, -399, 606, + -370, -320, -271, 526, -247, 33, 508, 324, -153, 50, + -296, 371, -45, -184, -221, -200, -428, -274, 267, -121, + -52, -328, 192, -3, 222, 164, 33, -168, 307, 140, + -161, -67, 53, -272, 62, -117, -16, 133, -125, -221, + 18, -8, -154, 109, -23, -20, 117, 50, -41, 55, + 23, 94, 28, 37, -125, 20, 95, 20, -84, -25, + 0, -63, -22, 106, 151, 67, -26, -11, -33, 30, + 48, 5, 112, -32, -4, -50 + }, + { + -283, -2807, -193, 938, -187, 55, -181, -68, 48, 468, + -945, 206, 284, -409, -783, 531, -208, 350, -793, -187, + -206, -9, 143, 11, 412, -1078, 319, -274, 361, -76, + -537, 89, -257, 275, 246, -392, 189, -282, -93, 243, + -243, -126, -228, -102, 8, 66, 264, -31, -109, 187, + 9, -133, 37, -101, -74, -240, 196, 154, -204, 352, + 48, 137, -263, 120, -24, -166, -50, -250, 251, -16, + -120, 78, -39, -13, 120, 160, -25, -104, 104, -10, + 72, 24, -21, -87, 19, 19, 231, 25, 93, -29, + -51, -44, -8, -10, -55, -132 + }, + { + 136, 616, -242, -435, 477, -31, 212, -212, -219, 174, + 140, -267, -203, -275, 510, 10, -547, 554, -425, -580, + 166, 291, -387, 569, 2, 883, 27, -324, -150, -248, + -167, 593, -309, 101, -53, 71, 33, 58, 326, -53, + -237, 397, 391, -283, -67, 31, 301, 250, -96, -52, + -43, 52, 268, -8, 106, 69, 146, 191, -29, 65, + -14, -124, 282, -9, -56, -273, -40, -10, -24, 133, + -194, 90, 79, -13, 19, 16, -48, 103, 129, -61, + 45, -21, 15, -74, -16, 73, -18, -56, 89, -9, + 29, 33, -42, 31, -2, -7 + }, + { + -673, -2671, 346, -1189, 432, -283, 376, 19, -694, 400, + -683, 1145, -275, 191, -435, -161, 96, 97, -275, -361, + -267, 28, -292, -204, 347, -587, 400, -183, -116, -289, + 244, -318, 467, 129, -295, 180, -28, 213, 26, -66, + 220, -28, -7, 96, 7, 205, 184, 476, -40, 56, + -232, -98, -75, -184, -32, 223, 78, 21, 0, 153, + -141, -39, 203, 43, -161, 17, -14, 97, 83, 35, + -8, -120, -142, -78, 28, -153, -29, 83, -49, -44, + -135, 2, -44, 54, -96, 24, -79, 30, 24, 45, + -25, 1, 71, -33, 9, 52 + }, + { + -34, 302, 399, -255, 116, -34, -140, -17, 6, -55, + -106, 93, -351, 252, -1260, 19, -1187, -106, -161, -186, + 10, 302, 108, -412, 29, 47, 239, -326, 265, -770, + 271, 331, -502, 750, 229, 251, -203, -104, 222, 152, + -107, -411, 70, -215, 113, 189, -127, -95, -331, 72, + 16, 78, 10, -1, -87, -308, 127, -150, -40, -27, + -204, 27, 4, 50, -92, 127, 121, -48, 64, -33, + 50, 166, -13, 97, -24, -82, 1, -81, -29, -80, + -3, 71, -160, 85, 11, -75, -29, -91, 90, 31, + 10, 37, 24, 35, -25, -7 + }, + { + -121, -4707, 499, -2487, 632, 316, -979, 1190, -123, 346, + -506, -849, -47, -375, -232, -393, -537, 15, 578, 468, + 244, 279, 145, -400, 101, -183, -144, 754, -196, 20, + -207, 240, 310, 340, 392, 4, -30, -82, 197, 13, + 285, 108, 107, 28, -53, -28, -73, -59, -15, -286, + 149, 10, -13, 135, -261, 121, 273, 29, 107, 88, + 105, 58, 15, -169, 48, -184, 6, 329, -85, 36, + 134, 104, 22, -116, 65, -57, 9, -54, 137, -7, + -18, 95, 52, -63, -56, -72, -81, 59, -58, 46, + -26, -54, 7, -17, -109, 19 + }, + { + -152, 464, 12, 214, -146, -67, 149, 28, 147, -399, + -102, 203, 298, 429, -376, 1253, 1893, -679, -300, -59, + 451, 215, -134, -36, -317, 96, -240, 408, -57, 283, + -223, -448, -130, 257, 511, -152, -32, 392, -228, 177, + -193, -674, -45, 416, -174, -282, -50, 204, 10, 7, + 76, 202, 29, 160, -386, 5, 10, -94, 1, -81, + 180, 60, 52, -62, 172, 115, -186, 218, 168, 52, + -126, 2, -137, 134, -68, -17, 30, 31, -30, 135, + 5, 50, 92, -96, 13, 40, 130, 63, 105, -49, + -40, -28, 60, 5, -45, 25 + }, + { + 333, 3734, -220, -515, 1187, 149, 1103, -368, 684, 84, + 664, -586, -840, -586, 221, -402, -98, -512, 232, -119, + 525, -585, -74, 180, -407, 39, -387, -65, -185, 91, + -261, -201, 397, -234, 216, 87, 320, 27, 164, 575, + 94, 253, -164, -224, 221, 238, -436, -250, -189, -334, + 59, -178, 37, -114, -170, -152, -60, -80, -32, -236, + -138, -47, 284, 321, -64, 136, 25, 31, 142, 31, + -48, -70, 22, -241, -53, 49, 166, -145, -73, 99, + 44, 182, -95, -46, 107, -43, 44, 82, -65, -87, + 32, -177, 43, -54, -87, -23 + }, + { + 128, -1938, -13, -181, 368, -34, -318, -86, -18, 107, + 57, -497, 92, -818, 340, -336, 833, 409, 426, 153, + -432, -62, -249, -344, 325, 388, -528, 38, -286, -392, + 336, -355, 786, -333, -519, -232, -446, -249, 8, 106, + 525, 70, 0, -29, -105, -80, -443, -103, 19, 223, + 127, -101, 67, 55, 115, 95, 170, 153, 80, 96, + 201, 13, -190, 52, -83, -97, 89, 120, -155, 15, + 55, -10, -60, 37, -83, 16, 140, -18, 69, -9, + -162, 116, 53, -122, -18, 138, 8, 67, 16, 22, + -6, -8, -34, 3, 32, -126 + }, + { + -915, 717, -655, 15, 518, 499, -136, -426, 741, 612, + -44, -540, 659, 542, 414, -161, -368, -332, 36, 514, + -38, -354, -492, -228, 85, 121, 636, -237, -14, -60, + 611, -817, -445, 392, -214, 214, 217, 121, -145, -113, + -149, -206, 195, 92, 55, -143, 572, -143, 294, -82, + 134, -305, 229, -258, -14, -58, -5, -215, 387, 138, + -97, 48, -62, 294, -60, 82, -27, -34, -126, -7, + 24, 54, 146, -138, 32, -169, -53, 224, -73, -23, + 61, -20, -127, -53, 97, -27, -24, 35, 3, -42, + 32, 26, -91, 29, -13, -27 + }, + { + 140, 50, -497, 502, -634, 154, -222, 77, 281, -265, + 266, 119, 177, -3060, -1, -374, 337, -245, -173, 54, + 164, -172, 16, -123, -129, -699, 215, -429, -181, 22, + -155, 393, 137, -519, 250, -355, 39, 299, -299, 210, + -411, 366, 48, -315, -163, -223, -50, -209, -4, 555, + 22, 52, -107, 11, 19, -21, -394, -148, 123, -157, + 549, -192, -318, -91, 65, -177, -22, -56, -369, 6, + 79, -149, -13, 29, 80, 82, -5, 11, -84, -146, + 85, -52, 3, -4, -61, -44, 38, 22, 128, 27, + 43, 39, 59, -51, -27, 36 + }, + { + -732, -1495, -50, 639, -535, 795, 303, -272, 580, 689, + 225, 297, -2030, 469, -697, -51, -663, -615, 369, 519, + -109, 233, 132, 317, -231, -526, 1190, 87, 468, 517, + 321, -608, 201, -239, 808, 42, 318, -341, 114, -299, + -339, -113, 166, 338, -238, 154, 128, 345, -173, -23, + -441, 312, 45, 63, 69, -10, -314, -11, -163, 168, + -270, 16, -114, -310, 1, 71, -124, -79, -18, 61, + 71, -85, 168, 27, -22, -9, 160, -20, -131, 75, + 80, 13, -121, -107, -111, 39, -94, 37, -72, 138, + 130, 10, 44, -83, 123, -33 + }, + { + -84, -1237, 324, 55, 179, -85, 607, -99, 218, -394, + -173, 238, 451, -2224, -2254, 341, -196, 346, -449, -536, + 308, 381, -815, 70, -23, -681, 105, 470, 329, 557, + 530, -23, -241, -146, -470, 151, -507, -58, 279, -574, + -335, 487, -45, -73, -263, 234, -98, 178, 31, -446, + 152, 112, 12, 170, 137, -122, -62, -94, 224, -8, + 150, 29, 285, -286, -63, 76, -404, 163, -41, 13, + 13, 112, 44, 26, 164, 57, 236, 16, 53, 55, + 127, 148, -109, -87, -65, -17, -55, 113, -72, -1, + 45, 9, -102, 152, -107, 86 + } + }, + { + { + 925, 443, 1533, 4101, -313, -105, -141, -217, 339, 615, + 1273, -410, 486, 237, -33, 328, -34, 798, -157, 110, + -159, 424, 395, 471, -311, -150, 187, 149, 257, -285, + 205, -215, 128, -370, 460, 66, 376, 240, 7, -130, + 100, 80, 370, 210, 44, -151, -135, 128, -65, -98, + 67, -291, 102, -472, -186, -271, 216, 43, -60, -29, + -222, 89, -101, -11, -108, 23, 173, -202, 20, -21, + 92, 72, -118, -14, 56, -84, 86, -69, 33, -95, + 75, -57, -10, 25, -97, 35, -54, -3, -53, 30, + 34, 86, 30, -1, -46, -40 + }, + { + 76, 1209, -493, -2908, 171, -183, -122, -103, 213, -8, + 38, -759, -255, 39, -37, 53, -682, -183, 9, 277, + 578, 23, 539, 621, 545, -323, -353, -424, -59, 29, + -356, 99, -777, 63, 316, 94, 468, 69, 181, -95, + 159, 38, -119, -444, -92, 632, 390, 130, -302, 130, + -139, -110, 172, -214, -137, 63, 12, -118, -111, 202, + 63, -171, 56, -232, 49, 24, 2, -59, -93, 48, + -114, -100, -19, 54, -59, 36, -135, 118, 13, -134, + -97, 130, 21, -50, 11, -14, 34, 120, -46, 6, + 88, 46, 35, -76, -23, -30 + }, + { + -372, -599, 1040, 562, -1571, -125, -123, 24, 296, -99, + -121, -1008, 268, -808, 331, 514, -90, 64, -259, 646, + -163, -163, -505, 152, -239, -312, 163, 596, 106, -363, + -386, 733, 142, 378, 354, 397, 12, -260, 543, 48, + 4, -457, 122, 44, 65, 111, -53, -281, 155, 89, + -38, 161, 63, -114, 203, -105, -255, 74, -243, -256, + 174, 123, -68, 95, -47, -113, 147, 53, -19, 17, + -26, 145, 27, 26, -125, 28, 179, 61, -125, -131, + -130, -112, -114, -42, 65, 2, -90, -10, 69, 96, + 19, -13, 94, 52, 102, 14 + }, + { + 673, -1484, 389, 1046, -571, 101, -203, -60, -114, -6, + -739, 461, 457, 412, -623, 648, -299, 109, -439, 80, + 32, -681, -995, -506, 13, -1562, 275, -209, 337, -39, + -418, 343, -35, 208, 616, -249, 186, -105, 302, 370, + -256, -150, -233, 88, -49, -114, 164, -294, -190, 313, + 199, 27, 26, -100, 45, -196, 74, 169, -118, 256, + 94, 63, -377, -19, 82, 0, 31, -79, 285, -121, + -112, 117, 1, -114, 4, -10, -110, -93, 75, -29, + 6, -77, -24, -22, -6, -93, 92, 29, 136, 28, + 26, 31, -5, -56, 48, -19 + }, + { + -108, 1054, 308, -683, 85, -174, 42, -20, 32, 152, + -214, -580, -136, 297, 991, -208, -187, 342, -487, 134, + 796, 29, -1156, 537, -365, 464, 696, 279, 10, 259, + 304, 443, -225, 422, -8, -100, 3, -20, -94, -562, + -426, 142, 189, -253, -155, -231, 11, 112, 65, 5, + -83, 5, 400, -44, -30, -65, -108, 118, -34, 48, + -55, -113, 219, -20, -50, -211, -185, -119, 48, 162, + -161, 177, 161, -61, 3, 89, 4, 82, -18, -150, + 82, -17, 125, -12, -106, -34, -55, 44, 104, -51, + -6, 39, -35, 13, -11, -34 + }, + { + 1096, -691, 357, -1343, -189, -201, 523, -608, -1139, 285, + -118, 1537, -317, 582, -74, -360, -590, -67, 112, -59, + 96, 34, -565, -258, 1144, -106, 454, -368, -261, -221, + 239, -145, 408, 178, -37, 214, -38, 88, -161, -130, + 133, -67, 53, -42, -54, 164, 18, 379, -40, 28, + -335, -95, 90, -103, -1, 203, -15, -232, -131, 131, + -183, -18, -40, -124, -138, 81, 145, 82, 32, 47, + 8, -121, -112, 2, 150, -23, 70, 130, 66, 30, + -52, 76, 81, 146, -47, 139, 51, 44, -39, 63, + -22, 14, 163, -15, -15, 25 + }, + { + -2, -752, -912, -35, 292, -14, -61, -22, -248, -67, + -277, -139, -410, 488, -495, 193, -1114, 99, -126, 210, + 259, 132, -20, -939, -544, -388, -243, -268, 591, -662, + 376, 262, -504, 825, 280, 199, -239, -89, 161, -29, + 231, -247, -377, -408, 290, 118, 6, -47, -594, 78, + 46, 77, 228, 176, 62, -127, 146, -328, -242, 62, + -140, -50, 45, 103, 3, 83, 58, -203, 12, 21, + -7, 103, -188, -91, 32, -40, 82, 60, -8, -165, + -120, 30, -133, 1, 64, 50, -55, -94, 99, 84, + 43, -7, -49, 32, 36, 67 + }, + { + 833, -3515, 736, -3690, -118, 290, -622, 1950, -197, 78, + 628, 705, 481, -103, 399, -431, -1259, -209, 736, 140, + -376, -56, -8, -767, -322, 7, 319, 635, 35, 317, + -493, 257, 51, -138, 155, -254, -28, 3, 136, -182, + 107, -10, -192, -316, -343, 26, 251, 44, -35, -342, + 235, 117, -9, 53, -347, 46, -26, -34, 260, 54, + 1, -84, 24, -132, 251, -100, 33, 217, -91, 97, + 44, -36, 19, -41, -16, -159, -50, -48, 145, -30, + -47, 146, 125, -15, -73, -15, -44, 71, -7, 53, + -14, -62, -65, -6, -61, 64 + }, + { + -2, 1484, -75, 632, 204, 5, 223, -154, 6, -218, + -6, 39, -15, 569, 100, 225, 785, -534, 17, -152, + 556, -51, -532, -177, 25, 395, -117, 908, -184, -222, + -491, -622, -137, 192, 447, 225, 232, 87, -482, -170, + -324, -301, 70, 394, -485, -228, 272, 31, -210, -75, + 9, -1, -98, 218, -141, 183, 183, 130, 366, -101, + -88, 13, 105, -64, 104, 33, -73, 55, -208, -20, + 15, 135, -109, 118, 12, 105, 43, -10, -13, 132, + -16, 54, 139, -36, 51, 69, 122, 91, 137, -46, + -41, -21, 24, 1, -64, -32 + }, + { + -508, 3521, 572, -412, -118, -1370, -178, -589, 913, -126, + 276, -563, 441, 153, 259, -274, 366, -362, -610, -214, + 1102, -290, -171, -61, -389, 326, -206, 55, -102, 382, + -63, -290, 340, -573, 94, -94, 218, 90, 44, 561, + 75, 21, -91, -201, -177, -65, -353, 156, 191, -496, + -95, -133, -171, -47, 230, 120, -214, -64, 172, -327, + -207, -47, 90, 230, -98, -46, -70, 21, 113, -26, + -23, -136, 40, -90, -12, -134, 61, -29, 15, 75, + -118, 71, 9, 23, 83, 43, 58, -22, -38, -25, + 82, -73, 174, 15, 10, -29 + }, + { + -167, -1655, 442, -796, 15, 762, 640, -308, -281, 486, + 254, -345, -63, -1134, 279, -235, 556, 69, 595, 382, + -834, 291, -139, -944, 28, 32, -726, 80, -462, -730, + 447, -250, 444, -321, 223, 52, -178, -21, -36, 205, + 445, -38, 248, 13, -6, 233, -262, 285, -61, -113, + -123, -201, 20, -94, -35, -124, 18, 374, 152, 73, + -120, -288, -23, 287, 73, 20, 42, 134, -22, 110, + 166, 41, -79, 7, -54, 39, 118, -125, 22, -17, + -131, 15, 24, -12, 65, 133, -9, -30, -112, -17, + -64, -7, -16, 0, 107, -21 + }, + { + 610, 2236, -22, 919, 162, 2347, 694, -842, 432, 16, + 498, 280, -235, -569, 701, -12, -147, 684, 135, -127, + 153, 32, 61, 184, 270, 205, 404, -258, 77, -81, + 1006, -547, -400, 539, -230, -45, 84, 192, -8, -58, + -31, -41, 82, 10, 182, -38, 34, -448, 247, -148, + -35, -394, 409, -212, -282, -98, 43, -304, 278, 61, + -219, 36, -198, -91, -263, 34, 30, 283, 79, -9, + -89, 28, 183, -282, 6, -102, -75, 186, -113, -102, + 11, 87, -30, 17, 135, -34, 12, -21, -36, -32, + 65, 59, -149, 21, 32, -43 + }, + { + -129, 267, 68, 553, -239, 114, -499, 72, 461, -270, + 221, 396, 158, -2579, 309, -777, 94, -405, 128, 98, + -217, 77, 307, -414, -172, -536, -214, -41, -293, -313, + 56, 154, 79, -799, 220, -319, -192, 188, -192, 81, + -577, 402, 151, -220, -91, -18, -160, -219, -104, 286, + -392, -153, 42, 300, 112, 131, -168, -156, 30, -337, + 330, -77, -313, -269, 43, -59, -27, 95, 21, 260, + 0, -154, 25, -32, -27, -38, -110, 1, 38, -26, + 101, -63, 15, -114, -82, -16, 62, 3, 31, -27, + 17, -16, 134, 74, 114, 62 + }, + { + 855, 663, 409, 807, -662, 1183, 138, -526, -146, 620, + -190, -118, -1958, -352, -2109, 315, 36, -837, -4, 405, + 132, -37, -247, 296, -287, -1399, 666, -447, -450, 101, + 264, -506, 229, -287, 696, -488, -216, -225, 501, -157, + -84, -99, 242, 393, -317, 424, 281, 252, -232, -153, + -354, 406, -270, -274, -67, 169, -297, -39, -109, -21, + -335, -39, -26, -228, 65, -15, -137, 10, -12, -53, + -24, -108, 50, -35, 65, 35, 42, -142, -188, 7, + -12, 52, 106, -2, -136, -46, -90, 56, -131, 32, + -26, -113, 39, -70, 96, -18 + }, + { + 97, -1752, -214, 210, 492, -67, 388, 38, 465, 102, + -198, -103, 204, 929, 1997, 202, 460, 231, -1058, -490, + 649, 117, -647, 159, -22, -516, -12, 307, -355, -181, + 283, 429, 210, 249, -119, 501, -436, -513, 146, -499, + -353, 702, 59, -40, 76, 487, -15, 43, -111, -211, + 233, -116, 42, 411, -17, -337, -9, 85, 236, -111, + 192, -16, 319, -148, 8, 324, -187, 355, 3, -7, + -168, 30, 99, -73, 81, -78, 59, -63, -36, -25, + 17, 36, 31, 71, 29, 130, 15, 21, -80, -9, + -27, 67, -41, 189, -92, 85 + } + }, + { + { + -1057, 1932, 1924, 3669, 796, -508, -265, 222, -240, 890, + 704, 278, 281, 311, -24, 215, 616, 100, 58, -19, + 74, 509, 73, 514, -167, -172, 23, 373, -107, 19, + 151, -184, -73, 28, 165, 307, -123, 489, -21, -87, + 188, 3, 141, 197, 220, -279, 120, -191, 73, -260, + 76, -35, -159, -361, -111, -292, 91, 66, -60, -141, + 62, -18, -188, -22, -68, 32, -11, -128, -114, 129, + -74, 89, -29, 0, 16, -68, -32, -74, -41, -43, + 9, 63, -57, 3, 4, -95, 2, -43, -47, 72, + 84, 48, 38, -6, 38, -23 + }, + { + -90, -528, 918, -668, -1606, -142, 61, 124, 8, 284, + -542, -540, 169, -428, -150, 384, -960, -201, 819, -857, + 345, 825, -121, 332, 638, -121, 131, -858, 239, 70, + -427, -167, -507, 219, 120, 35, 647, 10, 25, 119, + -106, 244, 139, -497, -151, 639, 327, 235, -237, -97, + -74, -85, -176, 93, 34, -8, -68, -65, 45, -127, + 15, -29, 40, 20, -110, -19, 23, -90, 135, -121, + -144, -37, -21, -52, 50, 0, -124, 89, -3, -103, + 28, 52, 118, -111, 12, -54, 98, 70, -82, 155, + 31, 28, 28, -67, 5, -64 + }, + { + 320, 1344, -1601, -1995, 735, 7, -138, -51, 357, -180, + -551, -405, -714, 330, -201, 516, -130, -118, -212, 559, + 254, -258, -296, -462, 100, -115, 223, 331, 179, -387, + -395, 254, 727, -97, 852, -120, 519, -190, 43, 6, + 150, -297, 15, 238, -92, 95, -249, 215, -175, 176, + -161, 224, -172, 175, 99, -27, -306, -43, -233, -51, + 18, -9, 144, 201, -208, -36, 104, -36, 31, 110, + -92, 47, 61, 72, -157, 32, 127, 57, -135, -29, + -159, -39, -30, -179, 45, 16, -58, -32, 48, 122, + 34, 1, 6, 73, 48, 66 + }, + { + -752, 145, -80, 1411, 166, -77, -119, -387, 439, -370, + -585, 515, 35, 834, -97, 196, -441, 617, -503, -679, + 334, -539, -1326, -125, -324, -1267, 67, 337, -98, 22, + 213, -93, -39, 418, 523, -69, 103, 172, 103, 133, + 42, 80, -375, 139, -73, -17, -189, -159, 42, 258, + 40, 202, -228, 139, -223, -24, 53, 151, 172, -192, + 258, -90, -127, -269, 120, 167, -103, 255, 2, -52, + -82, 153, -6, -41, -35, -152, -63, 7, 18, -71, + -100, 92, -100, -32, -35, -53, -79, 134, 80, 32, + 15, 80, 4, -85, 87, 34 + }, + { + 44, 1782, -475, -462, -174, 5, -57, 15, 62, 38, + -21, -473, -229, -276, 1740, -336, 637, -562, 206, 405, + 429, -83, -1009, 223, -210, 463, 325, 370, 514, 106, + 77, 263, 42, 258, -237, 109, 21, -70, -481, -565, + 111, -117, -45, 42, -352, -355, 211, -124, 200, 69, + 98, -51, 213, -92, 55, -203, -42, 131, 1, -24, + -84, 166, -98, -33, 2, -61, -217, -47, -14, 104, + -27, 191, 21, 20, -73, 129, 61, -83, -78, -59, + 132, 24, 99, -29, -72, -124, -27, 97, 16, 0, + -9, -33, 16, 62, -52, -47 + }, + { + -1023, 2586, -1009, -993, 289, 114, 262, -876, -422, -339, + 1229, 476, -51, 449, 530, -119, -1341, -149, 457, 126, + -8, -319, -227, -164, 868, 388, -75, 14, -405, -83, + 12, 78, 201, 97, 74, 187, 280, -175, -524, -73, + 42, 206, 69, -113, 8, -138, 79, 285, 120, -255, + 66, -49, -7, -141, 132, -30, 7, -228, -78, -18, + -95, 143, -331, -22, 81, -97, 105, 101, 11, 119, + -75, -147, 115, -36, 117, -52, 65, 85, 145, 11, + 32, 55, 128, 74, -17, 110, 30, 26, 37, -30, + -6, 57, 92, 32, 28, -5 + }, + { + 28, -1404, -389, 184, 31, 25, -12, -69, -273, -113, + 210, -494, -65, 314, -123, -153, -899, -58, -276, 599, + 549, -156, -211, 9, -925, -519, -663, 278, 343, -404, + 337, -81, 186, 41, 566, 25, -317, 10, 69, -352, + 352, -59, -648, -169, 349, -290, -1, 34, -506, 243, + 33, -129, 339, 92, 87, -108, -56, 65, -367, 26, + -134, -41, 169, 160, -19, 1, -26, -70, -27, 42, + -4, -31, -42, -196, 64, -105, 98, 48, 33, -165, + -88, 18, -34, -87, 18, 151, -70, 57, 11, 47, + 104, -19, -118, 96, -22, 62 + }, + { + -1543, -642, 466, -3960, 600, -101, 620, 679, 84, -212, + 728, 599, 806, -94, 532, -215, -1323, 61, 508, -6, + 80, -397, 119, -332, -557, -26, 539, 173, 265, 161, + -66, 21, -204, 268, -230, -75, 57, -79, 66, -87, + 243, -208, -335, -218, -27, -62, 372, -127, 56, -124, + 15, 182, -114, -137, -6, -112, -50, -26, 246, 95, + 123, -194, 80, -31, 254, -133, 105, 105, 50, -41, + -106, 108, -47, -45, 14, -63, -170, 41, -2, 30, + -73, 159, 116, 18, -137, 66, -37, 34, -38, -8, + 78, -10, -115, -5, -44, 67 + }, + { + 129, 409, 611, 225, 257, 119, 102, 45, -273, -156, + 520, -183, 109, -384, 809, -396, 114, 280, 49, -263, + 907, -671, -402, -3, 31, 29, 657, 527, -40, -182, + -458, -1173, 721, 259, 301, 82, 80, -192, -83, -582, + -463, 368, -192, 320, -444, -2, 292, -224, -179, -83, + 61, 49, -133, 53, 74, 202, 97, 81, 233, 151, + -143, -54, 149, 55, 70, -91, 18, -75, -239, 33, + 98, 14, -57, 95, 96, 17, 140, -93, 71, 43, + -65, 100, 75, 6, 80, 42, 23, 122, 104, 43, + -97, 8, -2, 20, -97, -85 + }, + { + 691, 3579, -354, -192, -1575, 1098, -1745, 331, 327, -297, + 495, -1216, 1242, -48, -248, 526, 68, 426, -911, -116, + 188, 407, -962, 286, -366, 278, -155, -83, 213, 237, + -54, 350, -97, -632, 131, -113, 339, -74, 283, 160, + 62, -17, -116, -43, -65, -262, -149, 100, -119, -212, + 85, -95, -336, -25, 424, 133, -376, -5, 195, -200, + -293, -98, 208, -77, 80, -97, 47, 49, 20, -33, + 8, -99, -29, 9, -48, -91, -77, 46, 63, -73, + -25, 110, -78, 30, 66, 7, 162, -42, -44, 73, + -57, 74, 121, -27, 78, -74 + }, + { + 160, -1485, -243, -395, -379, 444, 961, -298, -331, 503, + 135, 323, -728, -742, -190, 107, 60, 34, 415, 1094, + -799, -196, -461, -805, 168, 188, -295, -30, -789, 308, + -147, -168, 486, -659, 495, -152, -26, 293, 29, 82, + 74, 328, -23, -78, 43, 153, -37, 409, -290, -408, + 81, -29, -141, -67, -21, 73, -247, 440, 136, 2, + -226, -291, 82, 129, 112, 257, -100, 63, 46, 164, + 173, -27, 85, -132, 16, 47, 116, -149, 26, -148, + -4, -50, 111, 11, 60, 85, 79, -92, -68, -40, + -52, -19, 31, -21, 10, 71 + }, + { + 171, 3151, -373, 1656, -48, 2895, 31, -452, -417, -169, + 1091, 94, -54, -892, 666, 229, -428, 845, 398, -1052, + 496, 152, 160, 40, 242, 573, -9, 203, -480, 264, + 677, -521, -13, 362, -5, -30, 224, -374, 126, 182, + -317, 77, 226, 112, 26, 202, -432, -342, 5, 91, + -225, 43, 4, -109, -159, 15, -351, 98, 65, -30, + -41, 27, -126, -443, -110, 104, 120, 126, -11, 53, + 18, -33, 108, -108, -104, -76, 49, 11, -45, -56, + 57, 23, 7, 59, -18, 79, 88, -87, -105, 50, + 37, -13, 34, -46, -15, -120 + }, + { + 69, 556, -35, 229, 149, -5, -313, -293, 322, -104, + 142, 265, -381, -530, -722, -439, 191, -441, -246, 285, + -120, 383, -159, -185, -172, -243, -338, -436, 412, -717, + 884, -667, -35, -236, -310, 285, -639, 426, 133, -358, + -238, -8, 0, 122, -184, 147, -397, -11, -92, 45, + -350, -98, -107, 363, 90, -17, 145, -27, -303, -82, + 65, 42, -252, -244, 86, -117, -35, 39, 97, 380, + -220, -31, 73, -40, -118, -8, -107, 67, -123, 32, + 156, -111, -31, -65, 52, -101, 78, 52, -30, -11, + 33, -65, 178, 9, 132, 69 + }, + { + -534, 3641, 15, 356, -159, 730, -584, 589, -988, 349, + 255, -1166, -542, -721, -1727, 173, 131, -71, -342, 331, + 607, -911, -87, -14, 204, -1316, 1, -632, -258, 255, + -420, 482, -202, -342, 429, -72, -640, -217, 697, -335, + 150, -125, 243, 140, -11, 195, 457, -64, -80, -393, + 363, -199, -261, -190, -190, 255, -278, -36, 120, -376, + -17, -153, -19, -81, 57, 23, -88, -47, -87, 64, + -85, -119, 92, -113, 133, 3, -23, -74, -109, -46, + -59, 78, 119, -148, -17, -93, 7, -75, 6, -47, + -32, -16, -30, 29, -22, 16 + }, + { + -132, -1396, -187, 264, 195, 178, -5, 150, 480, 116, + 40, -321, 203, 1157, 1675, -476, 1003, 47, -14, -651, + 635, -994, -63, -563, -86, 332, -140, -103, -619, -45, + 67, 210, 470, 14, 553, -49, -386, 54, -130, -79, + -217, 297, 80, 151, 79, 409, -161, -90, 302, -50, + 186, -102, -223, 536, -14, -281, -76, 158, 13, -18, + 352, 37, -53, 109, -147, 242, 230, -37, 151, -104, + -61, -131, 99, 82, -24, -51, -65, -32, -73, -56, + 150, 5, 94, -53, 136, 109, 61, -97, -36, 16, + -9, 12, 6, 133, 4, -10 + } + }, + { + { + 1167, 712, -1884, 2093, -15, -370, 19, 351, -416, 285, + -77, 419, -156, -93, -195, 30, 304, -490, 87, 533, + 454, 360, -217, 312, -302, -349, -44, 220, -555, -274, + 204, -43, -57, 189, 92, 226, -186, 530, 7, 51, + 77, -105, 64, -101, 236, -178, 1, -249, 220, -84, + 36, 155, 18, -187, 104, -222, -53, -97, -83, -225, + 89, -12, -221, -57, -62, 63, -96, -181, -162, 72, + -119, 64, -24, -118, -45, -115, -100, -46, -23, -51, + -73, 11, -65, 36, 60, -69, -1, -65, 30, 73, + 20, -21, 3, 17, 128, 53 + }, + { + 36, -2135, -148, 1946, 439, -139, 217, 366, 117, 402, + -902, -594, 205, -469, -396, 400, -801, -402, 630, -952, + -22, 296, -842, -345, 323, -264, 428, -349, 180, 143, + 0, 38, -66, 429, -112, -382, 182, -175, -128, 263, + 14, 202, 251, -159, -115, 473, 107, -22, -179, -11, + 107, -32, -382, 180, 98, -136, -105, -224, -90, -126, + 82, -21, 2, 82, 78, -14, 17, 77, 156, -139, + -99, 83, 69, -154, 7, -24, -185, 22, 68, 4, + 87, 73, 121, -47, 45, -70, 79, -13, -125, 136, + -21, 27, 10, -35, 3, -82 + }, + { + -212, 3856, 624, -3327, 222, 171, -237, -242, 242, -161, + 463, 4, -1523, 924, -369, 396, -30, -263, -1087, -807, + -265, 93, 212, 126, 833, 288, 424, 74, -129, -327, + -55, -172, -134, -993, 584, -427, 1, -404, -220, 55, + 132, -79, 217, 216, -19, 191, -421, 145, -52, 151, + -211, 305, -263, -8, 44, 233, 117, 53, -142, 66, + -7, -291, -77, 135, -286, -126, 126, -52, -59, 104, + -137, -29, -2, 25, -54, 36, -83, -42, -47, 107, + 31, 146, 133, -73, -11, 12, 17, 12, -14, -9, + -31, -54, -44, -8, -2, 62 + }, + { + 398, 1350, 562, 1766, -303, 158, 39, -387, 292, -795, + -586, 674, -341, 87, -102, 381, -355, 864, -57, -638, + 258, 63, -144, 556, -187, -869, 277, 769, 545, 43, + 451, 190, -82, 467, 488, -150, -127, 129, -195, -100, + 64, 323, -18, 176, -138, -91, -370, 115, 201, 123, + -108, 208, -150, 65, -384, 87, 167, -103, -25, -49, + 167, -212, 112, -36, 111, 83, -61, 242, -168, -28, + -79, 96, 1, 92, 75, -154, 45, 64, -44, -27, + -113, 86, -186, -157, -87, -57, -68, 40, -12, 3, + 12, 44, 39, -2, 46, -33 + }, + { + -2, 2162, -191, 55, 338, 27, -44, 136, 279, 135, + 112, -252, -134, 444, 2310, -213, 754, -193, 498, 42, + 124, 224, -467, 241, -162, 877, 538, 121, 272, -322, + -378, -283, -81, -57, -945, 83, 24, -10, -179, -538, + 13, -20, 137, 266, -165, -108, 281, -303, 93, 39, + 238, -140, -130, -288, -91, -146, 222, 182, -29, -125, + -95, 175, -265, -115, 106, 118, -168, 6, 49, 69, + 16, 31, -178, -42, -175, 12, -30, -136, 17, 39, + 120, 22, 50, -17, -61, -145, 39, 66, -49, 20, + 39, -3, 37, 25, -82, -18 + }, + { + 267, 4489, -401, -1448, -733, 53, 194, -512, 242, -55, + 1410, 3, 280, 945, 472, 169, -670, -428, -300, 28, + 491, 149, 123, -30, 67, -159, -480, 405, 355, 180, + -202, -234, -158, -189, 54, 260, 76, -400, -463, -82, + -17, 253, -147, -390, 109, -283, -135, 149, 30, -257, + 201, 36, -28, -15, 251, -40, 76, -79, 99, -19, + -119, 208, -216, -23, 95, -51, -12, -83, -98, 60, + -27, -17, 223, 53, 75, -78, 29, 68, 39, -110, + -43, -33, 16, 26, -52, 0, -42, 4, -11, -53, + 7, 35, 26, -15, 50, 51 + }, + { + 12, -627, 641, 102, -101, 56, 112, -41, -177, -57, + 321, -271, -86, -261, -928, -632, 466, 1028, -356, 237, + -455, -614, 357, 1607, 450, -358, -571, 168, 186, -365, + -8, -278, 196, -19, 223, -201, -103, 344, 77, -633, + -44, -425, -451, 114, 117, -398, -149, -23, -248, 256, + -107, -163, 331, -17, -130, -138, 75, 163, -234, 300, + 150, 97, 209, 239, -85, -37, 35, 132, -34, -134, + -30, -102, -6, 27, 73, -153, 94, 13, 76, 33, + 95, 27, -11, -24, -6, 107, 10, 120, -34, -92, + 110, 57, -38, 148, -59, -21 + }, + { + 1964, 3881, -236, -4417, 352, -490, 92, 217, -330, 137, + 247, -688, 1021, 433, 495, 144, -288, 587, 858, 497, + 316, 41, 799, -30, -340, 260, 122, -80, -127, -420, + -65, 209, 48, 707, -135, -98, -107, -64, 129, -174, + 223, -115, 21, -99, 321, 272, 367, -26, 281, 79, + 33, -83, -362, -2, 158, -81, -6, -86, 248, 238, + 247, -141, 124, 32, 55, -154, 157, 95, 27, -57, + -75, 110, -10, 37, 112, -67, -268, -12, 23, 108, + -119, 41, 58, -38, -147, 90, -44, 64, 20, -49, + -27, 30, 11, 34, -83, -24 + }, + { + -15, -942, 175, -253, -288, -82, 48, 72, -399, 4, + 787, -368, -16, -47, 1252, -346, -445, 31, 362, -219, + 323, -757, -68, 531, 81, -322, 814, 294, 167, 382, + 161, -1474, 251, 353, -140, -369, 324, -291, -247, -441, + -199, 215, -312, 347, -57, 290, 230, -122, 70, 126, + 78, 11, -71, -42, -4, 266, -45, -60, -5, 164, + -54, -150, 72, 123, -15, -124, 127, 22, -56, 200, + 89, 44, -98, 68, 120, -179, -3, -133, 11, -58, + -63, 46, -40, 6, 105, -72, -43, 90, -30, 12, + -34, -49, -32, 28, -139, -78 + }, + { + -921, 4447, 2679, -205, -1191, 3127, 870, 835, -1730, -603, + 1335, -531, 1438, -698, -1071, 412, 105, 573, -176, 155, + -510, 133, -707, 28, -721, 213, -140, 442, 359, 218, + 424, 637, -306, -302, 208, -154, 497, 110, 380, -70, + -376, -301, 31, 301, 151, 14, 91, -54, -414, -62, + 452, 113, -184, -177, 58, 172, -52, -142, 246, -70, + -199, 68, 233, -103, 292, 132, -65, -120, 33, 105, + 130, 1, -123, -85, -8, 38, -165, -72, 20, -8, + 115, 105, -29, 106, 47, -42, 133, -82, -76, 107, + -4, 71, 18, -67, 50, -101 + }, + { + -203, -350, 806, -517, -289, -718, -128, -144, -461, 414, + 115, -538, -842, 338, 558, 128, -203, -481, -373, 734, + -511, -625, -780, -439, 340, 660, 795, 670, -529, 877, + 148, -117, 381, -441, 310, -448, -30, 180, -69, -35, + -158, 143, -153, -135, -44, 57, -41, 390, -149, -534, + 128, 194, -69, -57, -55, 197, -251, 116, -37, -65, + -92, -127, -22, -100, -89, 210, 25, 110, -24, 174, + 140, -169, -56, -162, 78, 42, 96, -213, 56, -78, + -17, -9, 126, 7, 4, -9, 59, 45, 124, -31, + -65, -124, -29, 30, -67, 17 + }, + { + -1152, 2699, -236, 779, 943, 2309, -594, -250, 24, -547, + 246, -316, 202, -460, 1076, 916, -1348, -212, 374, -846, + 914, 527, 280, -510, 139, 666, -187, 21, -431, -284, + -47, -96, 363, 169, -40, -13, 94, -501, 97, 480, + -85, -21, 338, -21, -463, -313, -438, 67, 136, 46, + -182, -81, 2, 94, 100, 175, -339, 46, -54, 57, + 97, -50, -66, -227, -54, -72, 44, 93, -90, 42, + 4, -81, 111, -51, -105, 33, 135, -45, 163, 189, + 145, 79, -75, -28, 11, 23, 28, 35, 10, 106, + -18, -57, 77, -92, -70, -87 + }, + { + -36, 1709, 453, -321, 87, -190, -357, -344, 358, 10, + -241, -399, 484, 1373, -313, 55, 34, -578, -191, 387, + -330, 217, 248, 619, 514, 2, -492, -197, 1436, -551, + 593, -938, -256, 128, -45, 793, -450, 65, 201, -1, + -199, -408, -121, 344, -265, -208, -390, 17, -77, 269, + -9, 246, -132, 238, 36, 22, 332, 29, -353, -38, + 96, 144, -7, -7, 92, -22, 186, 2, -186, 60, + -250, 63, 96, 80, 31, 12, -114, 61, -250, -70, + 39, -159, -64, -37, 156, 10, 131, 167, 63, -45, + -11, -48, 147, -90, -1, 58 + }, + { + -239, 4530, 51, 723, 242, -629, -976, 897, -701, 712, + 1063, -124, 373, 183, -784, -342, 655, 1381, 377, 7, + -35, -1212, 133, 211, 210, -864, 168, -548, -69, -337, + -1170, 464, 225, 24, -388, -480, -183, 178, 626, -145, + 366, -75, 54, -149, -235, -537, -280, -70, 162, -246, + 201, -278, 172, 27, -225, -93, -260, 125, 180, -304, + 66, 71, 185, 95, 181, 167, 104, 23, -31, 91, + -51, 51, 340, -72, 86, 31, 103, 20, -43, -24, + -151, -28, 52, -118, 74, -114, 5, -64, 108, -4, + 3, 99, 30, 126, 22, 30 + }, + { + 101, -1556, -606, 900, 361, -68, -167, -95, 456, -205, + 160, -67, -83, -1997, -2267, -893, 808, 143, 178, -208, + 419, -1193, 41, -749, 74, 573, 245, 63, -710, -253, + -369, -218, -179, -583, 429, 479, 392, 333, 11, 95, + 38, 388, 80, 257, 60, 166, -143, -91, 234, -91, + 287, 348, -86, 278, -128, -55, 116, 146, 54, 43, + 225, 142, 74, 69, -405, -143, 136, -250, 139, 55, + 0, -109, 68, 24, -125, -70, -27, -43, -155, -78, + 238, 77, 58, -133, 152, 96, 99, -86, -37, 103, + -8, -75, 43, 113, -61, -9 + } + }, + { + { + -1094, -2979, 2497, 467, 1238, -201, 466, 415, -415, 255, + -745, 485, -52, 55, 52, -383, -30, -618, 587, 423, + 598, -235, 134, 205, -84, -126, -522, 39, 118, -249, + 130, 206, -503, 202, 402, -9, 381, -168, 329, -30, + -461, 175, 419, -77, -28, -17, -206, -112, 156, 346, + -234, 209, 139, -40, -161, -58, 39, -185, -53, 47, + -54, -295, 73, -152, 105, -36, -90, -159, -81, 22, + 10, -75, 4, -229, -87, -16, -97, -106, 11, 2, + -137, 17, -97, 114, -11, 2, 30, -151, 111, 46, + 22, -72, -23, 96, 49, 86 + }, + { + 24, -3074, 266, 2169, 528, -133, 166, 208, 247, 564, + -1380, -317, -315, 307, -231, -350, -13, -224, 272, -748, + 226, 158, -1567, -539, 983, 96, -78, 116, -669, 188, + 89, 101, 427, -303, 19, 153, -264, 51, -309, 81, + 421, -8, 206, -113, 146, -140, 235, -19, -114, 48, + 42, 8, -290, 87, -99, 23, 36, -434, 4, -48, + -68, 15, 10, -6, -57, 120, 82, -20, 90, 100, + -112, -51, 108, -45, 3, -190, -102, -54, 50, 85, + -16, 160, 7, 48, 27, -13, -80, -12, 52, 42, + -87, 60, -7, 22, -39, -88 + }, + { + 96, 5941, -845, -2322, -714, -1, 109, -661, 325, -185, + -144, 650, -808, 592, -55, 182, -385, -69, -1322, -460, + -940, 648, 21, 570, 550, 120, 568, -165, 39, -227, + 154, -151, -431, -720, -160, 311, -540, 25, -265, -59, + -11, -6, 357, -50, 242, -35, -314, -32, 179, -129, + 178, 162, -207, -41, 49, 102, 338, -90, -135, -15, + 109, -267, -104, -207, -25, -12, 71, -87, -70, 125, + -47, -73, -83, -109, 113, 65, -45, -170, 74, 22, + 96, 70, 159, 0, -54, -11, 131, -24, 30, -106, + -21, -55, 1, -82, -3, 98 + }, + { + 325, 1300, -178, 1522, 988, -9, -68, -339, 327, -648, + -27, -218, -22, -245, -400, -14, 614, -120, 398, -57, + -270, 102, 1019, -230, 42, -608, 658, 298, 899, -413, + 147, 533, -202, 415, 188, 344, -435, 93, -395, 79, + -115, 444, 284, -8, -293, 123, -477, 193, 103, -44, + 219, -79, 14, -112, -314, -5, 248, -29, -230, 262, + -39, -187, 185, 172, -145, -8, 236, -22, -171, 87, + -61, -166, 248, -10, 49, -74, 34, 77, -107, -5, + 42, -2, -150, -184, -66, -88, 34, -51, 75, -50, + -44, 23, 117, 74, -32, -63 + }, + { + -26, 1931, 127, 451, 35, 73, -15, 54, 400, -27, + 114, -336, 293, -635, 2007, 1679, 424, 360, -658, 110, + 202, 164, -247, -48, 376, 929, -61, 7, 273, -731, + 296, 2, 25, -241, -857, -7, 11, -107, 76, -331, + -123, 162, -201, 459, 32, -417, 151, 77, -168, 160, + 63, -212, -122, -267, -10, -191, 362, -81, -26, -87, + 7, 59, -147, -72, 52, 208, 27, -307, 159, -66, + -59, 89, -135, -110, -74, -140, 21, -59, 5, 81, + 120, -91, -8, 23, -78, -97, 26, 50, -66, 8, + 49, 1, 63, -42, -47, -24 + }, + { + 972, 3150, -202, -2515, 532, -290, -23, -591, 1049, 150, + 832, -358, 752, 813, 196, 68, -235, -473, -378, -256, + 813, 336, -309, 497, -439, -309, -322, 425, 203, 473, + -315, -409, 52, -52, -116, 330, -40, -372, -184, -134, + 101, -31, -50, -723, 284, -308, 92, -65, 68, 74, + -84, 214, -50, 135, -29, 24, 19, 71, 184, -110, + -99, 251, -180, -90, 32, 131, -124, -145, -88, -15, + -22, 88, 75, 172, -72, 67, -11, 72, -55, -86, + -104, -11, -16, 111, -51, -85, -32, 2, -81, -53, + 62, 29, -17, -10, 70, 43 + }, + { + -23, 406, -35, 6, -33, 77, -25, -116, -151, 316, + 7, -359, 8, -336, -1348, -278, 807, 879, -141, -530, + -658, -135, 599, 384, 1323, -608, -739, 385, -135, 91, + 294, -538, -28, 292, -135, 80, -26, 418, -108, -191, + -12, -741, -331, 265, 14, -237, -235, -295, 244, -139, + 18, 75, -84, 137, -133, 76, -39, 0, -85, 277, + 169, 61, 155, 306, -101, -143, 200, 115, -132, -51, + -13, -35, -41, 68, 13, -124, 58, 54, -20, 55, + 168, 56, -81, 63, 6, -44, 112, 62, -7, -138, + 97, 65, 68, 65, 12, -116 + }, + { + -1802, 10530, -1027, -4141, -37, -422, -225, 426, -768, 166, + -515, -514, 1139, 654, 480, -696, 614, 169, 1006, 1205, + -39, 429, 274, 24, -488, 719, -681, 639, -364, -600, + 76, 56, 265, 547, -86, -133, -182, 115, -259, 28, + 25, 103, 220, -235, 308, 424, 68, 221, 413, -262, + -26, -15, -424, 41, 263, -97, -39, 142, -62, 169, + 258, 145, 20, 18, -140, 115, 63, 139, -17, -45, + -2, -22, 123, 54, -17, -148, 57, -139, -41, 165, + -116, -43, 87, -62, -61, 158, -100, -58, 111, -25, + -62, -63, 106, -13, 19, -53 + }, + { + -101, -338, -192, -464, -95, -151, -74, 119, -345, 136, + 379, 103, -132, 527, 363, 599, -913, -389, 572, -41, + -343, -169, 431, 486, -185, -430, 1168, -384, 991, 200, + -365, -299, -617, 42, 129, -631, 354, -104, -645, -236, + 158, -60, -9, -55, 241, 199, 282, -118, -155, 116, + 275, 52, 92, -178, -6, 108, 138, -65, -92, 240, + -191, 77, 30, 147, -60, -7, -15, 153, 0, 158, + 79, -55, -126, 156, -24, -182, -11, -33, -56, -60, + 44, 71, -129, 40, 147, -107, 16, -10, -34, -8, + 80, -124, -27, -4, -174, 36 + }, + { + 1203, 3600, 1967, -798, -330, 989, 1825, 1086, -1072, -85, + -2, 530, 732, -508, -834, -278, 697, 125, 452, -374, + -485, -38, -253, -87, -88, 118, -194, 508, 173, 73, + 504, 780, -601, 143, -141, -32, 372, 210, 192, 178, + -438, -58, -261, 136, 339, 185, -171, -32, -217, -75, + 420, 180, -165, -217, -263, 82, 181, -58, 109, -5, + -76, 24, 191, -12, 24, 349, -148, -190, 230, -33, + 14, 77, -5, -26, -26, -7, -99, -141, -3, -50, + 111, 87, 178, 76, -46, -52, 166, -90, -5, 33, + 5, 39, -28, -53, 85, -113 + }, + { + 261, 112, -37, -65, -238, -867, -167, -555, -339, 751, + -175, -1207, 107, 69, 1099, -171, -184, -792, -386, -84, + 645, -1118, -316, -398, 30, 756, 771, 225, 117, 514, + 370, 36, -62, -159, 40, -275, -153, 31, -60, 125, + -215, 29, 127, -163, 235, -123, -125, 29, 150, -236, + 86, 90, -201, 14, -78, -79, 165, -57, -80, 15, + -129, -23, -100, -73, -55, 135, 55, 189, -46, 20, + 58, -91, -170, -18, 90, -126, 10, -120, 145, -93, + 10, 90, -71, 92, -65, 6, -42, 60, 121, 14, + -6, -131, -82, 91, -84, -45 + }, + { + 1648, -1438, -519, 769, 2268, 145, 817, -825, 608, 8, + -682, -632, 464, 314, 1019, 472, -224, -1331, 370, -405, + 905, 520, 299, -538, 305, -91, 226, -203, -5, -354, + -192, 414, -118, 447, 18, -279, -284, -32, 220, 165, + -42, -176, 743, -433, -509, -478, 27, -141, 220, -322, + 46, 27, 74, -143, 54, 127, -53, -211, 4, 23, + 199, -140, 78, -195, -114, -36, 7, 30, -87, 100, + 13, 52, -29, -19, -46, -28, 126, -121, 282, 226, + 69, 11, -62, 30, 35, -72, 42, 52, 112, 67, + -46, -10, 9, -4, -80, -72 + }, + { + 23, 2474, -354, -70, -365, 119, -262, -412, 41, 77, + 100, -189, 88, 2267, -1338, 756, -215, 15, -847, -372, + 236, 42, 756, -307, 411, -257, 418, -81, 578, 832, + -964, 14, -288, -146, 143, 175, 406, -500, 455, 78, + -273, -367, -15, 254, 33, -501, -249, 13, -118, 312, + -38, 551, -157, -125, 74, 313, 83, 66, -166, -145, + 20, 309, 34, -25, 24, 227, 203, -24, -67, -346, + -177, 90, 18, 238, 87, -55, -116, 34, -257, -49, + -87, -88, -65, 50, 145, 18, 89, 194, 52, -13, + -103, 7, 59, -169, 75, 50 + }, + { + 1068, 3153, -788, 323, 1224, -1914, 383, 273, 137, 75, + 1284, 565, -190, -917, 634, -646, 1385, 717, 1114, -489, + -650, -140, -205, 682, -422, -649, 633, -601, -107, -794, + -240, -149, -100, 407, -621, 21, -336, 308, 41, 247, + 395, 103, -36, -517, -191, -403, -662, 322, -89, 411, + -500, 124, 101, -18, -250, -332, 130, 226, -241, -173, + 0, 103, 201, -53, 314, 104, 361, -210, 180, 111, + 16, 62, 159, 41, 156, -5, 212, -121, -139, 2, + -95, 39, -26, -12, -44, -54, 16, -67, 31, 71, + 10, 80, 22, 69, 92, 21 + }, + { + -47, -2385, 115, 1269, -173, 8, 86, -87, 426, -438, + 210, -28, 33, -876, -4030, 274, 19, 60, 239, 51, + -373, -318, 173, -783, 88, 255, 217, 256, -339, -196, + -392, -613, -236, -487, 271, 516, 492, 375, 91, -119, + 333, 64, -3, 154, 160, -97, -87, 246, -95, 166, + 86, 233, 180, -81, -91, 177, 69, 112, 162, 250, + -207, 323, -4, 44, 5, -496, 101, -40, 36, 65, + -92, 70, 39, -20, -21, -132, 15, -22, -65, -262, + 175, 208, -83, -16, 71, 76, 66, -19, -2, 141, + -30, -161, 65, 147, -108, 43 + } + }, + { + { + 992, -8203, -2604, -2031, -1269, -92, 535, 208, -175, 507, + -595, 219, -77, 520, 123, -703, -732, -777, 718, 225, + 381, -239, 344, 445, 318, 163, -372, 185, 103, -424, + 484, 319, -303, 234, 312, -285, 340, -270, 354, -31, + -179, 252, 170, 94, 290, -5, -194, 343, 353, 436, + -59, -71, 6, 344, -55, 110, 446, -70, 11, 185, + -197, -315, 366, 55, 167, -77, -2, -11, -15, -68, + -127, -154, -70, -304, -28, 134, -1, -50, 27, 107, + -61, 60, -53, 130, 21, 70, 81, -102, 76, 43, + 61, -53, -13, 72, -73, 3 + }, + { + -45, -3030, 153, 875, -463, -277, -112, -391, -527, 17, + -562, 300, -315, 1374, 770, 499, 851, 386, 352, -325, + 629, 255, -1114, -928, 934, 80, -860, -152, -713, 189, + -111, -236, 184, -98, 25, -19, -324, 52, -21, -23, + 30, -429, -180, -49, 289, -365, 216, 106, -371, -105, + 15, 38, -79, 66, -334, 31, 384, -232, 38, -143, + -7, 118, -25, -189, -280, 182, 76, -215, -60, 106, + -75, -42, 138, 33, -55, -236, -140, -136, 47, 42, + -117, 157, -78, 58, 75, 14, -62, -37, 1, -57, + -118, 29, -2, 12, -34, -4 + }, + { + 39, 7348, 476, -343, 133, -199, 263, -486, 175, -380, + 36, 738, -169, 432, 207, 811, -591, -216, -562, 483, + -698, 210, -233, 556, 248, -346, 317, -201, 184, 152, + 71, -92, -185, -163, 81, 181, -304, 636, 216, 202, + -367, -437, 501, -105, 33, 261, 225, 62, -19, -77, + 445, -35, -253, 87, 31, -40, 218, -76, -106, -188, + 84, -173, -101, -235, 126, -24, -59, 27, 2, 59, + 7, -106, -97, -51, 165, 96, 29, -86, 108, -90, + 71, 21, 81, 25, -26, -57, 79, -26, 53, -55, + 84, 18, 49, -13, 83, 131 + }, + { + -1180, -588, 741, 1245, -99, -313, -24, -69, 701, -604, + -251, -27, 149, -499, -325, 403, 524, -650, 717, 348, + -80, 493, 1228, -574, 120, -604, 420, 54, 173, -785, + -83, 326, -337, 328, 249, 565, -503, -75, -237, 67, + -516, 55, 156, -21, -487, -152, -252, 71, -274, -30, + 650, 40, -55, -88, -133, -37, 40, -214, -145, 436, + -39, -122, 172, 291, -74, -105, 136, -70, -76, 160, + -45, -239, 138, -165, 15, -37, 54, 85, -63, 47, + 79, 42, 50, -50, -46, -42, 133, 63, 137, -62, + -41, 19, 55, 29, 2, 24 + }, + { + 66, 1691, 29, 521, -72, 72, 129, 27, 120, -160, + 375, -162, 299, -119, 1113, 421, -168, -634, -472, 605, + 268, -67, 276, 878, 920, 1009, -675, -909, -279, -469, + 1184, 1346, 757, -297, -478, 49, 82, 156, 457, 87, + 14, 94, -429, 67, -29, -293, -93, 75, -97, 120, + -105, -377, 10, 0, 185, -72, 162, -272, -262, -29, + 89, -192, -76, 24, 70, 371, 51, -482, -14, -140, + 48, 122, -201, 29, 126, -230, 34, 50, -117, -5, + 91, -228, -29, 27, -89, -16, 49, 8, -63, -28, + -63, -64, 5, -33, -17, -88 + }, + { + -2264, -194, 1633, -3036, -349, 23, 209, 46, 1176, -1137, + -772, -652, 646, 395, 361, 64, 267, 34, -399, -394, + 765, 218, -506, 842, 21, -309, -43, 801, 229, 185, + -524, -467, 29, -9, -181, 440, 49, -164, 327, 42, + -102, -318, 44, -562, 499, 84, 294, -86, -58, 283, + 82, 263, -71, -42, -164, 140, -6, -34, 33, -96, + -185, 88, -148, -61, -73, 13, -55, -7, -76, -82, + 75, 189, -113, 6, -50, 157, -28, -23, -107, -41, + -65, 30, 2, 82, -70, -88, 1, -14, -96, -74, + 42, 20, -28, -20, 35, -4 + }, + { + -37, 665, -190, -68, -136, 27, 21, -142, -258, 65, + -271, -102, -3, 285, -1015, -243, 458, 149, -558, -1176, + -554, 162, 256, -466, 954, -1020, -1119, 656, 256, 201, + 678, -385, 231, 371, -257, 195, 217, 293, -274, 221, + 183, -311, 112, 302, 0, -88, -31, 24, 432, -251, + -2, 49, -154, 324, 48, 137, -253, -197, 42, 187, + -40, -135, -99, 151, -117, -188, 155, 56, -145, 34, + -47, -98, -52, -43, 51, 19, -2, 5, -2, -31, + 27, 33, 28, 64, -40, -44, 50, 2, 15, -108, + 40, -10, 59, 36, -2, -83 + }, + { + 914, 17207, 1294, -3742, 229, -1129, -1010, 647, -560, -142, + -612, -273, 655, 233, 782, -738, 400, -77, 223, 584, + -769, 245, 364, 125, -547, 327, -853, 672, 210, -195, + -379, -120, 45, 275, -369, -341, 55, -120, -260, 194, + -43, 427, 313, -85, 61, 185, 133, 21, 232, -181, + -83, 98, -214, 220, 419, -35, 22, 295, -231, -99, + 140, -16, -52, -38, -210, 219, 38, 8, 54, 134, + 23, -95, 139, -2, -146, -6, 299, -90, 3, 80, + -122, 32, 71, -55, 17, 175, -34, 7, 51, -94, + -45, -47, 111, -57, 63, -73 + }, + { + 14, 385, -130, -203, 199, 13, 16, 266, -95, -97, + -63, 170, 7, -68, -354, 1019, -57, 225, -260, -1033, + 128, 445, 289, 662, -217, -599, 911, 62, 751, -380, + 36, 5, -727, -324, 13, -530, 10, 95, -371, -260, + 125, -329, 162, 102, -176, -235, 206, 76, -167, -27, + 378, 80, 265, 22, 115, 100, 202, 52, -28, 132, + -161, 265, 158, 209, 184, 64, -72, 136, -65, 132, + -6, -126, -111, 150, -53, -95, 82, 79, -57, -19, + 109, 104, -126, 26, 158, -70, 20, -77, -34, 25, + 131, 10, 20, -13, -87, 83 + }, + { + -1478, 1406, 2333, -815, 67, -289, 61, -154, -499, 854, + 421, 449, -114, 355, -216, -1072, 543, 225, 431, 20, + 481, 856, 240, 152, 92, 371, 42, -114, -188, 63, + -158, -79, -433, 210, -319, 45, 74, -102, 114, 360, + 108, 653, 15, 139, 48, -213, -335, 208, 43, -110, + 165, 63, -206, -59, -94, 0, -60, -58, 272, 74, + -148, -109, 37, 22, 34, 271, -139, -216, 224, -218, + -373, -65, -49, -68, 110, 72, 27, -98, -28, -27, + 74, 104, 186, 56, -57, -91, 188, -7, -30, -46, + -42, -56, 33, 44, 107, -48 + }, + { + -245, 569, 1041, 169, -233, -524, 1, -566, -570, 92, + -647, -890, -160, -38, 1438, -439, 273, -375, -304, -88, + 769, -525, 402, -190, -391, -126, -174, -281, -94, 66, + 298, -95, -21, -125, -87, -106, 57, -78, -335, -34, + -6, 76, 7, -161, 381, 136, -137, -334, 161, 245, + 17, -186, -222, 51, -41, -195, 116, -149, 35, 171, + -175, -9, -36, 82, -26, -71, -21, 141, -94, -22, + -28, -181, -179, 1, 56, -71, 44, -100, 202, -5, + -1, 27, -162, 85, -21, 56, -91, -67, -26, -14, + 72, -47, -67, 105, -48, -45 + }, + { + -1099, -5267, -378, 587, 2169, -682, -109, -626, 838, 988, + -337, -770, 967, 456, 445, 188, 916, -644, 3, -625, + 513, -222, -47, -889, 81, -57, 312, 87, 443, 28, + 242, 835, -26, 248, -147, -596, -548, 176, -202, -424, + -328, -290, 456, -498, -401, -308, 180, -291, 30, -402, + 210, -41, -76, -45, -267, -18, 151, -296, -53, 139, + 302, -195, 16, -265, -157, 81, -11, -24, -19, 77, + -30, 78, 19, 39, 119, 25, 93, -245, 56, 45, + -99, -114, -52, 106, -9, -129, 78, 23, 68, 41, + -25, -42, -55, 92, 21, -50 + }, + { + 29, 2494, -7, 606, -447, -554, -360, -201, 46, 445, + 455, 148, -830, 903, -1040, 1236, 33, -73, -986, -281, + 565, -720, 164, -315, -546, -294, 929, -266, -733, 394, + -1253, 540, 2, -433, 102, -445, 167, -600, 204, -28, + -245, 12, 269, 34, 280, -137, -52, 154, 86, 299, + -238, 202, -296, -8, 214, 453, 148, 226, 119, -130, + -3, 409, -46, -35, 64, 159, 146, 82, 25, -256, + -97, -8, -142, 51, -69, -182, -67, 95, -145, 121, + -34, -152, -131, -68, 67, -11, 10, 99, 30, 36, + -103, -39, -22, -163, 81, 41 + }, + { + -1434, 382, 129, -505, 310, -978, 965, -639, 399, 453, + 380, 22, -159, 534, 1958, -999, 824, 41, 715, -981, + -861, -142, -425, 961, 76, -430, 901, -431, -73, -505, + -16, -471, -11, 766, 17, 524, -644, -277, -251, 55, + 87, -322, -161, -421, -59, 100, -184, 359, -153, 747, + -348, 67, -120, -94, -240, -186, 165, 141, -358, -180, + -74, 88, 210, -183, 96, -73, 286, -249, 170, 100, + -3, -23, 5, 147, 266, -45, 75, -220, -202, -62, + -32, 88, -74, 98, 47, -11, -10, -63, -7, 6, + -50, 61, -29, -59, 87, 84 + }, + { + 39, -3268, -797, 657, -14, 23, -419, -62, 364, -536, + 43, 677, 466, 2683, -123, 18, -285, 151, 955, -6, + -603, 85, 610, -342, 9, -108, -516, -797, -1243, -170, + 493, 54, 173, -179, 28, -346, -282, -245, -236, -511, + -119, 227, 88, -188, -337, -116, 247, -267, -360, 430, + -237, -181, 48, -176, -181, 289, 103, 132, 199, 171, + -329, 243, -89, 91, 372, -236, 131, 52, 4, 114, + -34, 150, -8, -76, 75, -45, 170, 165, 152, -315, + -65, 57, -211, -78, 73, 51, -84, -30, 49, 144, + -37, -149, -7, 119, -82, 64 + } + }, + { + { + -1080, -12630, 2009, -2792, -697, 20, -124, 946, -590, -579, + 584, 344, 107, 589, -476, -222, -395, -653, 202, 335, + -40, -100, 566, 333, 668, 150, -435, 64, -5, -284, + 230, -65, 598, -108, 273, -430, 145, -282, 486, 28, + 143, 177, 125, 20, 269, -210, 101, 183, 278, 178, + 373, -335, 73, 255, -120, 169, 337, 112, -64, 253, + -189, -142, 231, 174, -109, 94, -25, 76, -81, -115, + 0, -217, -144, -119, 9, 27, -65, 18, -56, 95, + -6, 153, -32, 127, 17, -4, 38, -22, -32, 121, + 131, -50, -3, 10, -31, -52 + }, + { + 42, -1338, -1005, -225, 188, -160, -101, -366, -377, -685, + -524, 827, 34, 364, 1361, 1261, -233, 1275, 219, -684, + 670, 67, -280, -760, -370, 1039, -596, -751, -962, 251, + 274, -332, 292, -116, 78, -4, -269, -327, 158, 46, + -318, -481, -82, 52, 145, 257, -134, 166, -467, -132, + 95, -29, 162, -99, -135, -215, 288, 0, 37, -278, + 141, 73, 10, -235, -263, 280, -129, -158, -32, 42, + -34, 105, -42, 164, -194, -66, -186, -80, 61, -18, + -40, 47, -35, 82, -7, -32, 54, -54, -60, -89, + 34, -74, 19, -27, 0, 68 + }, + { + -173, 7104, 799, 889, -868, -138, 185, 177, -50, -783, + -435, 1543, 327, -774, 633, 676, 2, -914, 209, 493, + -288, -296, -40, -2, 623, -399, -16, 101, -88, 435, + 189, -460, 256, 76, -48, -183, 198, 470, 485, 49, + -233, -393, 180, -106, -268, 346, 269, 380, -86, 214, + 228, -56, -7, -175, 108, 114, 190, -23, -188, -367, + 108, -45, -49, -95, -153, -21, -81, 7, 61, -35, + 120, -135, -114, 1, 127, 94, -38, 55, 85, -52, + 39, 40, 41, 78, -63, -14, -2, 31, 59, -49, + 112, 52, -54, 14, 98, 71 + }, + { + 1831, -3973, -683, 879, 949, -311, -134, 203, -66, 249, + -114, -136, -47, -579, -15, 367, -514, 456, 830, -123, + -112, 603, 545, -380, -9, 356, -313, 40, -100, 74, + -692, 196, 39, 297, 50, 612, -305, -173, -174, 27, + 114, -291, 179, -116, -431, -451, 184, -269, -182, 88, + 423, 207, -280, 16, 17, -88, -1, -181, -95, 316, + 42, 30, 19, 134, -39, -65, 0, 194, -77, 34, + -9, -81, 51, -173, 3, 72, 3, -92, 12, 102, + 55, 23, 134, -27, -46, -22, 49, 101, 96, -40, + -24, 65, 27, -12, 41, 25 + }, + { + -107, 1057, 647, 405, -17, 20, 105, 227, -178, 45, + -3, 41, 289, 692, 773, 237, -918, -2495, 3014, -343, + 194, -235, 508, 737, 176, 983, -124, -1187, -568, 447, + 616, 1303, 831, -88, -36, -551, 493, 130, 121, 424, + 57, -123, -208, -41, -478, 218, -197, -75, 215, 38, + -162, -178, -259, 163, 85, 43, -237, 3, -283, -16, + 99, -172, 151, -111, 18, 313, 7, -232, -284, 12, + 57, 27, -44, 76, 113, -287, 114, -6, -80, -19, + 68, -93, 39, -120, -60, 9, 46, 42, -56, -27, + -140, -51, -20, -18, -55, -10 + }, + { + 3154, -5602, -916, -2794, 372, -32, -42, 733, 975, -1405, + -571, -611, 1246, -131, 196, 696, -240, 195, 158, -727, + 267, 418, -91, 15, 454, 11, -5, 733, -23, 204, + -308, -655, -244, 324, -336, 434, 157, 129, 235, -366, + -295, 62, -48, -250, 202, 227, 283, 8, -231, 293, + 34, 211, 132, -164, -240, 264, -71, -63, -97, 72, + -211, -44, 0, -128, 4, -75, 6, 33, -109, -89, + 142, 85, 42, -152, 56, 13, -21, 39, -95, -54, + -55, 68, 26, 6, -7, -110, 26, -77, 25, -71, + 13, -33, 21, -9, 9, -14 + }, + { + 56, 284, -50, 6, -138, -62, -33, -65, -133, -159, + -202, -44, 81, -777, 241, 449, -479, 174, -332, -1238, + -24, -273, 818, -362, -51, -221, -862, -110, 17, 73, + 1013, -96, 249, 367, -222, 106, 303, 130, -444, 253, + 136, 46, 119, 201, -200, -16, 202, -108, 284, -103, + -67, 137, 46, 46, 103, 104, -204, -36, -35, -108, + -14, 41, -188, -32, 2, -110, 3, 109, -108, 69, + -40, -145, 8, -123, 97, 76, -99, 2, 57, -36, + -15, -86, 91, 72, -37, 12, 70, -15, -19, -2, + -32, -37, 23, 27, -40, -14 + }, + { + 591, 20772, -860, -3660, -183, -382, -1173, -358, -293, 374, + -653, 579, 529, -529, 452, 171, -387, 1004, -671, 86, + 190, -610, 331, -247, -62, 63, -86, 232, 142, 255, + -442, 18, 33, -4, -10, -81, 245, -567, -437, 372, + -216, 650, -80, 419, -358, 614, 216, -72, -14, 59, + -178, 231, 252, -130, 227, -46, 37, 405, -330, -72, + 154, -121, -68, -41, 120, 63, 84, -151, 16, 209, + 26, -38, 111, -180, -45, 84, 123, 85, 31, -85, + -26, 128, 19, -42, 28, 19, 66, 46, -61, -22, + -29, -29, 61, -43, 46, -17 + }, + { + 82, -126, 43, 249, -76, 87, 119, -124, 125, 233, + -351, 104, 5, -82, -45, -212, 464, 495, -45, -1027, + 315, -24, -263, 1102, -530, 519, -62, 540, 220, -370, + 728, -696, -684, -112, -157, -134, -56, -490, 397, -241, + -288, 17, -117, 158, -360, -33, -24, 38, 5, 211, + 64, -108, 100, 308, 366, -136, 276, -86, 246, -189, + 207, 121, 126, 129, 233, 151, -131, -8, -11, 151, + 32, -128, -57, 90, -107, 107, 1, 53, -25, -27, + 130, 23, -76, 83, 53, -58, -17, -17, -16, 40, + 61, 123, -56, -39, 38, 18 + }, + { + 1702, 604, -754, -931, -206, 1229, -1414, -1096, -61, 548, + 618, 77, 200, 693, -324, -44, -166, 354, -12, 472, + 405, 936, 433, -82, 361, 308, 378, -818, 38, 285, + -761, -176, -24, -456, -5, 370, -400, -196, 190, 196, + 447, 603, 108, 226, -328, -90, -200, 181, -14, 126, + -19, -121, -56, 156, -187, 151, -317, 119, 168, -103, + 12, 14, -62, -24, 87, 235, -169, -66, 12, -226, + -162, -261, 21, -93, 124, 101, -26, 29, -96, 105, + 7, 102, 180, 12, -149, -16, 150, 26, -19, -97, + 8, -82, 84, 32, 33, 28 + }, + { + 169, 1725, -693, 560, -919, -254, -201, 62, -538, -477, + -797, -592, -757, 1018, 257, -587, 1033, -897, 566, 650, + -84, -450, 932, -660, -62, -466, -385, -366, 87, 161, + -53, 298, -60, -241, -96, 142, -50, -75, -364, -339, + 73, -9, -39, 316, -142, 164, 21, -280, 127, 231, + 19, -210, -155, 30, -149, -135, 137, -188, 192, 119, + -212, 57, -58, -69, -28, -3, -58, 51, 76, -106, + 50, -180, -114, -74, 23, 26, 1, -3, 120, 126, + -65, -25, -94, 41, 48, -64, -30, -10, -41, -28, + 36, -11, -20, 50, -50, 34 + }, + { + -364, -6975, 77, 1146, 682, 1113, -1615, -168, 967, 341, + 632, -1023, 1225, 104, 471, -234, 224, 871, -899, -414, + 274, -406, -196, -524, -100, 399, -192, 533, 316, -205, + 345, 718, 352, -175, -130, -9, -799, 473, -913, -414, + -222, -163, -491, 309, -574, 15, 171, -420, -406, 198, + 123, -79, -344, 429, -481, 54, 10, -239, 22, 36, + 176, -115, 11, -357, -38, 66, -98, 4, 112, 139, + -57, -26, 96, 44, 87, 70, -4, -97, -81, -19, + -68, -133, -44, 110, 1, -80, 37, -7, 66, -54, + 0, 27, -89, 115, 37, 6 + }, + { + -117, 2382, 385, 480, -434, -396, -247, -221, -10, 434, + 71, 640, 36, 31, -2005, 1694, 277, -433, -746, -370, + 1402, -608, -865, 544, -1861, 251, 1428, -460, -1319, 12, + -324, 158, 134, -316, -5, -529, -365, 155, -309, -183, + -10, 299, 450, -333, 41, 231, -6, -92, 257, 89, + 135, -216, -201, 148, 84, 260, 213, 139, 143, 46, + 34, 110, -14, 30, 175, 25, 178, -92, -60, 29, + -87, -61, -120, -109, -113, -181, 128, -55, 9, 76, + 22, -196, -51, -167, 37, 44, -64, 145, 37, -46, + 10, -19, -164, 11, -83, 89 + }, + { + 1079, -3548, 989, -541, -277, 700, -459, -583, -252, 1100, + -501, -158, 508, 468, 1782, 3, 438, -458, 355, -269, + -753, -392, -398, 626, 81, -88, 564, -445, -14, -262, + -142, -421, 268, 274, 537, 317, -405, -788, 301, -518, + 335, -185, -291, -82, -346, -30, 23, 422, 97, 6, + 130, 175, -540, 79, -297, 174, -74, 20, -232, -288, + 34, 166, -126, 60, -43, 83, -6, -61, -82, 119, + 112, 23, -59, 151, 121, 48, -167, -47, -125, -87, + -28, 110, -18, 67, -4, 64, -167, 49, 13, -54, + -6, 49, -6, -103, 73, 71 + }, + { + -40, -3813, -310, 393, 2, -81, -537, 250, -464, 447, + -500, 992, 119, 77, 3549, 971, -336, -640, 224, 874, + -415, -451, 796, -560, 411, -137, -558, -1172, -1105, -448, + 562, -53, 606, -426, -58, -229, -707, -177, -245, 91, + -408, -435, 464, -69, -606, -127, 272, -200, -167, 396, + -348, -220, -9, 5, -271, 152, 112, 131, -42, 86, + 119, 104, -119, 146, 237, 173, -170, 9, -79, 229, + 52, -110, 180, -181, 81, 88, 66, 107, 35, -101, + -7, -176, -59, -63, 90, -34, -35, -2, 2, 80, + 22, -33, -74, -21, -26, 74 + } + }, + { + { + 1140, -13490, -1574, -2328, -133, -354, -191, 597, -1142, -838, + 73, 484, -149, 258, -329, 108, 367, -29, 236, -57, + -743, -288, 297, 116, 595, -14, -170, 379, -89, -305, + -57, -312, 369, -612, -32, -80, 129, -199, 420, -74, + 155, 177, -20, -327, 27, -251, 329, -2, 183, -239, + 23, -499, -249, -69, -105, 134, 124, 18, 3, 339, + -34, -20, -18, 31, -136, 214, 59, 126, -108, -151, + 40, -80, -9, 128, 94, 28, -159, -69, 18, 105, + -43, 117, -29, 85, -24, -47, 19, 27, 45, 142, + 93, -63, -16, -28, 14, -14 + }, + { + -42, 1284, 1109, -756, -39, 82, 81, 120, 222, 17, + -90, 490, -156, -793, 368, 382, -1611, 1262, -160, -1204, + 687, -131, 6, 29, -477, 999, 225, -39, -199, 357, + 314, -164, -51, -356, 27, 23, -38, -331, -272, 123, + -98, -375, -38, 25, 26, 177, -179, 370, 18, 155, + -159, -93, 382, -46, 71, -87, 33, -52, 64, -93, + 164, -39, 234, 190, 64, 210, -323, -199, 23, 88, + 84, 224, -30, 75, -157, 20, -48, 52, 87, -31, + -55, -1, -40, -12, -45, 8, 98, -71, -62, -16, + 128, -72, 23, 14, 2, 100 + }, + { + 252, 4453, -1835, 1100, 264, 262, 8, 578, 546, 286, + -514, 813, -766, -1646, 527, 644, 370, -368, 179, 311, + -231, 5, 746, 342, 599, -121, 533, 333, -465, 32, + 206, -158, 805, -113, -416, -251, 388, 181, -254, 80, + 85, -292, 123, 316, 298, 513, 114, 495, -97, 17, + 153, -94, -69, -19, 326, 39, -20, -106, -85, -312, + 13, -116, -82, -71, -189, -24, -205, -173, 30, 52, + 196, -5, -128, -144, -27, 89, -35, 50, 92, -6, + 36, 30, -20, 68, 0, 53, -49, 43, 129, -17, + 12, -5, -91, -50, 30, -8 + }, + { + -1929, -8741, 448, 236, -540, -93, -101, -244, -319, 993, + 728, 463, -103, -149, 129, 108, -478, 1103, 357, -653, + -130, 398, 202, -489, -29, 415, -708, 147, 67, 480, + -180, 152, -111, 17, -317, 376, -125, -271, -469, 206, + 643, -87, 180, -132, -124, -87, 502, -148, -82, 246, + 22, 176, -87, -73, -120, 67, 187, -91, -203, 145, + 31, 20, -159, -112, -9, -19, -30, 202, -60, 103, + 105, -17, 59, 5, -5, 1, -24, -91, 69, 177, + 41, -37, 60, -10, 10, -57, -76, 1, 40, -12, + 35, 131, 53, -50, -22, -43 + }, + { + 130, 255, -393, 60, -96, -24, -94, 63, -236, -22, + 84, 425, 793, 864, -478, -1037, -776, -364, 3828, -1314, + -862, -611, 576, 130, -581, 271, 106, -784, -648, 500, + -2, 453, 471, 107, 41, -535, 738, -13, -423, 171, + 8, 28, 100, -209, -713, 609, 266, -17, 304, -42, + -256, 23, -65, 66, -524, -107, -65, 12, 139, 326, + 88, -113, 45, -279, -88, 146, 26, 40, -206, 38, + 160, 139, 64, 27, 7, -164, 221, 24, -6, 102, + 203, 51, 83, -171, -69, 56, 125, 69, -22, -43, + -93, 32, 15, -24, -97, -4 + }, + { + -3210, -13143, 640, -2371, -188, 112, -412, -236, 697, -249, + 908, -385, 400, -288, 520, 1073, -111, 362, 517, -698, + 400, 684, 82, -223, 22, 181, -179, 254, 141, 235, + -350, -581, -591, 144, -319, 105, 370, 434, 55, -324, + -44, 58, -370, -484, -259, -43, -41, -210, -305, -51, + -167, 182, 222, -76, -88, 51, -80, 68, -271, 22, + 102, -80, -44, -3, 39, -49, 63, 11, -67, -7, + 114, 31, 104, -142, 24, -94, -41, 24, -84, 0, + -49, 69, 8, -29, 23, -46, 76, 40, 130, -35, + 12, -94, -19, -5, -24, -65 + }, + { + 15, 249, 216, -49, -129, -46, 14, -55, -64, 65, + 218, 99, 314, 297, 1066, -435, -592, 733, 194, -569, + 819, 238, 675, -545, 669, 966, -1, -353, 504, 299, + -540, -557, 863, 851, -284, -585, -282, -341, -717, 230, + -42, -159, -222, -112, -235, -2, 104, -396, 254, -29, + 145, 303, -161, -64, 227, -8, -33, 153, -50, -193, + -46, 209, -191, -185, 26, 63, -27, 162, -48, -42, + 11, 24, 72, -47, 31, 26, 43, 78, 41, 26, + 30, -153, 4, 3, -13, 58, 37, -24, 24, -7, + -79, -139, -71, 4, -78, 18 + }, + { + -2376, 19548, 850, -2276, 835, -293, -823, -153, -112, 993, + -314, 72, 61, -1128, 426, 849, -415, 1279, -1217, -623, + 258, -456, 427, -94, -33, 45, 163, 299, 288, 640, + 290, 333, -98, 135, 225, 786, 576, -348, -199, 308, + -146, 410, -81, 594, 55, 620, 132, -145, -233, 26, + 91, 449, 136, -489, -9, -131, -30, 458, -174, -25, + 24, 61, 126, 8, 189, -42, 57, -91, 43, 89, + -105, -19, 107, -146, 113, 48, 20, 107, 37, -53, + -47, 56, 10, 5, 16, -79, -9, 52, -77, -27, + -8, 34, 37, -75, 14, 15 + }, + { + -7, -564, 26, 261, -184, 21, -10, -141, 249, 116, + -288, 446, -491, 249, 1010, -1548, -736, -322, -324, -341, + -352, -1137, -1338, 1362, 867, 1034, 281, 413, 155, 55, + 689, -966, -601, 183, 134, 202, 66, -295, 684, -217, + -245, 199, -116, 10, -249, -85, -190, 224, 217, 128, + -173, -252, -46, 258, 344, -36, 219, -127, 168, -318, + 232, -51, -230, 1, 176, 160, -45, -67, -49, 52, + 55, -34, -117, 115, 55, 163, -122, -2, -76, -131, + 82, -51, -93, 21, 1, -39, 0, 38, -17, -22, + -33, 84, -40, 9, 83, 15 + }, + { + -1895, -1138, 1428, -766, -22, 2050, -1242, -1367, -726, -722, + -139, -183, 313, 711, 40, 784, 687, 949, 320, 821, + 275, 74, -466, -684, 241, 144, -29, -801, -136, -176, + -821, -96, -131, -477, -91, 196, -162, 372, 289, -135, + 189, 353, -150, 132, -226, -79, -111, 332, 62, 82, + -181, -185, 131, 294, -132, 264, -282, -12, 54, -85, + 287, 253, 94, 2, -20, 163, -98, 38, 21, -54, + 193, -157, 0, -82, 139, 94, -95, 125, 33, 52, + -60, 52, 85, -15, -59, 18, 18, -57, 39, -68, + 81, -17, 30, 5, 21, -5 + }, + { + -102, 3061, -315, -181, -833, -39, -517, 146, -444, -391, + -291, -330, -721, 669, -762, -1123, 874, -979, 1315, 1456, + -66, -864, 898, -922, -15, 155, -174, -329, 404, 474, + -472, -79, -167, 34, 423, 578, -231, -414, -367, -251, + 304, 111, -317, 133, -588, -3, 247, 86, 300, 184, + 49, -296, -127, 281, 186, 93, 120, -235, 210, 135, + -111, -68, -56, -81, -101, -22, -199, -123, 51, -67, + 205, 6, 44, 9, 68, 36, 116, 81, -16, 80, + -101, 14, 52, -8, 72, 13, 52, 73, 61, 35, + 13, -72, 5, 72, -77, 54 + }, + { + 1949, -4047, -781, 381, -79, 1413, -372, -593, -444, 299, + 1767, -177, 1131, -816, -561, -467, -191, 867, -1058, -933, + 100, 184, 302, -520, -540, -72, -755, 210, -64, -1095, + -154, 653, 122, -360, 170, 760, -583, 720, -364, -281, + -32, -192, -845, 498, -183, 184, 29, -157, -225, 138, + -18, 91, -347, 294, -173, 231, -54, -36, 78, -118, + -123, -161, 40, -171, 132, -4, -90, -5, 130, 204, + 63, 53, 18, -6, 7, 11, -23, -71, -126, -42, + 103, -42, -97, 24, -40, -9, -7, -57, 33, -82, + 67, 54, -40, 85, -19, 24 + }, + { + 181, 2069, -289, 221, -280, -44, -137, -67, -52, 56, + -227, 210, -195, -504, -3001, 339, -901, -193, -159, -544, + 608, 1741, 699, 696, -845, -67, 541, -386, -1032, -46, + 532, 13, 29, -45, -42, -484, -889, 220, -106, -67, + 266, 258, 198, -727, -366, 13, -206, -257, 304, 71, + 329, -244, -386, -187, -139, 32, -32, 1, -33, -216, + -202, 156, -31, -94, 149, -145, -134, -185, 11, 24, + -27, -58, -66, -88, -31, -39, 205, -3, 98, 39, + 22, -17, 87, -136, 38, 34, -43, 106, 11, 30, + 43, 9, -144, 17, -129, 11 + }, + { + -117, -5402, 537, -753, -588, 719, -708, -321, -333, 64, + -599, -96, 639, -229, 201, -92, 8, -992, 103, 907, + 498, 371, -355, 226, 248, 161, 59, -755, -179, -226, + -165, -528, -322, -397, 495, 553, 111, -376, 521, -445, + 578, 595, 143, -262, -267, 45, 39, 215, -260, -463, + -20, 295, -331, 67, -224, 255, -156, 176, 155, -165, + -56, 132, -272, 102, -6, -91, -173, -83, -227, 94, + 165, 99, -14, -94, -303, -134, -94, 178, 45, 16, + 99, 121, -69, 26, 37, 44, -231, 51, 87, -46, + 19, 62, -9, -69, 7, 13 + }, + { + -12, -3700, -79, 20, -542, 43, -234, 134, -698, 354, + -679, 699, 322, -634, 2195, 784, -1061, -1117, -135, 742, + 337, -396, 205, -697, 284, -432, -355, -580, -419, -722, + -223, -547, 491, -397, -149, 193, -183, -200, -25, 890, + -24, -602, 394, 55, -196, -177, -278, -330, 151, 552, + -126, -128, 65, 277, 40, 254, -21, -163, -228, -6, + 215, 120, -385, -174, -32, 131, -218, -76, -50, 173, + 38, -240, 45, -252, 90, 169, -12, -52, 6, 115, + 9, -133, 103, -84, 48, -39, 33, 14, -40, 0, + 97, 78, 1, -24, -67, 8 + } + }, + { + { + -808, -12665, 219, -1318, -557, -323, -47, -280, 305, -690, + -677, 481, -380, 370, -1055, 455, 255, 28, -83, 22, + -491, 134, -143, 30, 653, -255, 248, 402, -118, -115, + -35, -303, -269, -310, -470, 633, -87, 205, -68, -227, + 422, -139, 271, -188, -57, -162, 46, -95, 230, -47, + -279, -398, 25, -571, 288, 76, -339, -30, 342, 326, + -209, 298, -196, 75, -262, 280, 82, 42, -53, -72, + -48, 103, -29, 95, 4, 60, -92, -76, 66, 8, + 39, -26, 15, 80, -65, 22, -29, 36, 135, 76, + -24, 61, -113, -17, 68, -19 + }, + { + 55, 2881, -89, -948, 29, 124, 26, 406, -3, 279, + 134, 340, -129, -183, -444, -735, -575, 546, -746, -544, + 906, 523, -1121, 619, 324, -110, 449, -449, 0, 526, + -139, 282, -329, -99, 84, 168, -263, -75, -722, 97, + 108, 22, -6, -206, -202, 3, 228, 67, 280, -77, + -241, 277, 246, 22, 19, 39, -126, 56, -79, -44, + 104, 109, 111, 128, 244, -19, -65, -180, -47, 111, + 277, -20, 74, -61, -82, 23, 17, 17, 113, -59, + -9, -59, 41, -66, -5, -42, 97, -29, 11, -36, + 22, -35, -28, 105, -25, 36 + }, + { + -266, 472, 2036, 799, 524, 136, -185, 849, -198, 779, + -744, 1166, -1477, -641, 14, 486, -224, 469, -145, 169, + 75, 121, 509, 489, 633, -61, 645, 257, -601, -229, + 114, 667, 398, 67, -740, 337, 6, 50, -534, 305, + 79, 44, 29, 112, 360, 463, 141, 309, -23, 179, + -134, 76, -88, 35, 217, 50, -37, -235, -130, -194, + -35, -108, -53, -154, -75, 13, -219, -127, -67, 112, + 136, 83, -96, -162, -143, -41, 61, 0, -16, 152, + -43, 123, -32, 12, 30, 82, -56, 24, 101, 19, + -74, 10, 1, -93, -17, 10 + }, + { + 1281, -13688, 349, -214, 42, 150, -33, -93, -689, 1306, + 148, 1001, -504, 256, 353, 364, -653, 1767, -734, -385, + 322, 378, -379, -320, 1, 376, -307, -100, 117, -2, + 7, 405, -286, -275, -76, -65, 417, -480, -360, -190, + 524, 292, 218, -502, -38, 347, 205, 130, -171, 390, + -143, 19, 16, -4, -221, -17, 153, 22, -52, 76, + 17, -84, -69, -128, 46, -61, -42, 43, 85, 136, + 42, -53, 29, 136, -71, 26, -59, 13, 76, 171, + -12, -26, 10, 28, -11, -35, -14, -120, 38, 43, + 22, 90, 11, -4, -44, -95 + }, + { + -142, -132, 32, -211, 168, -105, 83, -57, -326, 144, + -305, 559, 638, 1338, -1763, -870, -320, 2671, 869, -648, + -2044, -7, 358, -115, -239, -1150, 612, 5, -448, 563, + -251, 201, 487, -214, 341, -631, 598, 158, -554, 396, + -360, 268, 112, -478, -294, 459, 423, -218, -19, 263, + -341, -53, 120, -126, -328, -278, 176, -134, 202, 344, + -70, 4, -74, -163, -94, 28, -7, 47, 1, -35, + 28, 224, 93, 43, -111, -71, 166, -26, 125, 97, + 179, -11, 17, -8, -142, 45, 139, 42, 13, -102, + 22, -16, 64, -79, -27, -30 + }, + { + 2150, -20882, 395, -1458, -444, 15, 236, -772, 160, 847, + 299, 517, -1131, 272, 785, 450, 481, 133, 26, -299, + 354, -122, 577, -243, -270, 489, 163, -578, 256, 153, + -436, -142, -419, -121, -102, -209, 386, 626, -134, -107, + 7, -309, -232, -185, -351, -341, -85, -177, -214, -445, + 244, 61, 166, -176, 119, -203, 138, -48, -78, -182, + 162, 47, 59, -142, -44, -31, 76, -63, 104, -44, + 4, -5, 62, 9, -119, -17, -135, 89, 23, -45, + -91, 37, -35, 49, 75, -54, 26, 101, 98, 8, + -103, 17, -99, -36, 20, -59 + }, + { + -62, 675, -64, -171, -40, 19, -21, 73, -96, 1, + 226, -19, 267, -7, 911, -549, 403, 283, -24, -15, + 1229, -539, 1442, -407, 341, 169, 1191, -680, 445, 542, + -607, -451, 401, 1386, -658, -348, -446, -356, -482, 61, + -82, -326, -45, -393, -6, -132, 311, -493, 129, 61, + 183, 102, 140, -142, 82, -170, 209, 198, -352, -40, + -2, 158, 35, -231, -74, 246, 20, 59, -45, -70, + 23, 120, -135, 182, 7, -79, 95, -15, 65, -4, + 91, -44, -39, -52, 56, -7, 9, -9, 59, -106, + -78, -31, -76, -42, -33, -32 + }, + { + 4012, 14925, -1884, -584, -585, -212, -1011, 88, -310, 1184, + -168, -927, 385, -105, -1307, 1576, -140, 291, -91, -504, + -576, -255, -84, 943, -89, 256, -5, 0, 131, 983, + 42, 297, -206, 681, 111, 1380, -215, -68, -161, -114, + 424, -198, 74, 85, 792, 82, 465, -293, -210, -70, + 122, 244, -216, -253, -179, 150, 49, 245, -48, -6, + -83, 107, 52, 195, -11, -46, 79, -41, 58, 43, + -45, 2, 9, 13, 76, -17, 55, 40, 75, 15, + -66, 38, -40, 55, -59, -102, 29, 24, -27, -47, + -42, 117, -69, -9, 1, 24 + }, + { + -74, 381, -751, 142, -75, -9, -43, 79, 29, 20, + -259, 412, -13, 488, 815, -1894, -557, -799, -89, 269, + -1391, -415, -935, 1214, 834, -220, 1286, -440, -232, 1475, + -506, -249, -864, 351, 408, -418, 325, 33, 358, 283, + -170, -73, 116, -387, 315, -168, -218, -4, 357, 247, + -436, 88, -52, 186, 158, 238, -69, -52, -12, -85, + 128, -24, -266, -120, 311, 56, 85, -57, -97, 10, + -1, 40, -200, 150, 95, 51, -65, -43, -40, -42, + -67, -14, -13, -55, -66, -5, 100, 43, -71, -31, + -16, -18, 27, 52, 10, 33 + }, + { + 2057, -2965, -601, -901, -187, 2044, -734, -1862, -452, -710, + 129, -446, 281, 483, 176, 18, 1147, 487, 1615, 288, + 219, -22, -420, -1110, 130, 271, -611, 254, -806, -174, + -130, -411, -172, -405, -3, -333, 344, 779, -63, 39, + -5, -77, -300, 361, -399, 122, 270, -102, 217, -137, + 84, -63, -31, -144, 320, 73, -77, -106, -35, -201, + 549, 201, 255, -48, -253, 171, 34, 140, 64, -197, + 266, -74, -77, -25, 102, 238, -82, -107, 184, -91, + -33, 49, 128, 40, 4, -14, -72, -66, 33, -27, + 87, -14, 1, 66, -39, -23 + }, + { + 51, 4097, -1570, -373, -226, 136, -440, -239, -355, 62, + 297, -361, -514, -509, 363, -1569, -28, 201, 1242, -141, + 775, -493, 397, -641, -91, 517, -457, -2, -149, 347, + 76, -235, -269, 146, 166, 737, -402, -264, -195, -62, + 66, 183, -240, 2, -522, 72, 205, 366, 242, 78, + 94, -435, 30, 93, 299, 79, 58, 6, 27, 8, + 69, -243, 103, -111, -37, -150, -124, -56, 77, 55, + 20, 15, 129, -58, 69, -22, 85, 62, -16, 85, + -52, 4, 43, -60, 108, -33, 94, 92, 91, 64, + -14, -76, -23, 2, 23, -14 + }, + { + -2735, 2144, -429, -355, 1668, -162, 495, -464, -1161, 839, + 1442, 560, 421, -95, -1450, -75, -501, 682, -6, -1196, + -441, 619, 154, -225, -986, -9, -427, -136, -79, -1052, + -398, 536, 133, -10, -104, 588, -491, 559, 9, 3, + -228, -403, -11, 260, -425, 222, -158, -60, 107, -85, + 75, 278, -241, -274, 404, -71, -138, 169, -85, 60, + -253, -185, -109, 178, -52, 15, 98, -180, 101, 335, + -35, -14, 3, 48, 8, -14, -16, -66, -107, -4, + 133, 24, -85, -2, -18, -2, -9, -83, -9, -31, + 36, 50, -15, 20, -24, 18 + }, + { + -192, 1315, 424, 0, -148, -42, -83, 110, -76, -143, + -145, -177, -957, 971, -2846, -851, -2129, 256, 373, -345, + -345, 2150, 1096, -607, 827, -152, -67, 255, -715, -321, + 312, 67, 210, -63, -296, -158, -829, -442, 388, 171, + 190, 167, -221, -370, -323, -455, 243, -386, 276, -125, + 443, 32, -338, -325, -198, 59, 21, -96, -66, -184, + -248, 376, -149, -82, 25, -129, -82, -333, 218, -141, + -99, 77, -153, -50, 175, -2, 72, 15, 61, 105, + -45, 33, 20, -17, 67, -37, 31, 8, 95, 74, + -54, 88, -77, -137, -29, -34 + }, + { + -1068, -4433, -1, -536, -9, 276, -614, 297, -139, -773, + -77, 147, -450, 527, -438, -644, -46, -247, -491, 1265, + 245, 810, -87, 106, -240, 315, -495, 64, -192, -507, + -235, -429, -393, -344, 290, 397, 100, 187, 278, -43, + 213, 861, -77, -67, -291, 86, 339, -145, -327, -245, + -261, -59, 269, -287, -156, 210, -117, 345, -48, -128, + -35, 88, -37, -17, -1, -97, -87, -51, -251, 104, + 346, -79, 57, -227, -282, -85, -55, 94, 78, 91, + 135, 3, -4, 9, 64, -85, 7, -20, 65, -13, + 23, -20, 31, 19, -72, 52 + }, + { + 90, -4029, 404, -320, -388, 215, -73, -190, -345, -251, + 579, -299, 626, 1280, -1758, 692, -1399, 320, -503, -67, + 1951, 81, -660, -445, 15, -211, -945, -484, 417, -584, + 147, -1051, -10, -298, -223, 1020, -356, -714, 427, 723, + 5, -283, 184, -26, -18, -231, -397, -339, 358, 254, + 142, 40, 100, -168, 371, 196, 69, -288, 170, -183, + 87, 210, -356, -106, -171, -62, -96, 70, -21, 22, + 85, -40, -187, -93, -10, 47, 113, -73, -43, 53, + -4, 19, -49, -3, 35, -90, 30, 64, 18, -71, + 157, 31, 60, -46, -61, -106 + } + }, + { + { + 254, -12468, 285, -957, 151, 267, -175, -1166, 243, -954, + -1711, -51, -75, 653, -378, 239, -184, -210, -567, 193, + 45, 19, -654, -265, 697, 384, 340, -185, 22, 20, + 415, 328, -161, 19, 400, 889, -189, 301, -187, -313, + 169, -156, 449, -143, -91, -74, -43, -294, -76, -149, + -214, 20, 193, -273, 336, -217, -494, 120, 197, -62, + -349, 97, -105, 256, -194, 244, -70, -119, 85, 166, + 74, 133, -83, -8, -73, 36, -19, -3, 55, -82, + -42, -111, 21, 9, -169, 85, 90, -7, -14, -31, + -116, 98, -69, -38, 20, -19 + }, + { + -64, 2722, -260, -785, -27, 47, 135, 189, -173, 700, + 47, -31, 501, -257, -1202, -602, -271, -11, -84, 228, + 79, 468, -1128, 622, 1206, 105, -521, -487, 9, -28, + -523, -5, -745, -452, -103, 504, 68, 211, -395, 297, + 358, 389, 114, -380, -560, -468, 237, 187, 199, -118, + -74, 326, 47, -60, 62, 91, 51, -124, -248, 125, + 51, 29, -4, -16, 62, -103, 177, 36, 34, 146, + 239, -150, 113, 12, -6, 28, -109, -155, -19, -48, + 60, -18, 6, -50, 37, -50, 80, -23, 14, -57, + -9, -15, -98, -14, -94, 9 + }, + { + 256, -3064, -905, 1075, 320, -404, -503, 267, -411, 766, + -1253, 1130, -546, 195, 64, -213, 137, 1134, -121, 664, + -400, -467, 384, 371, 328, -352, -148, 3, -392, -270, + 225, 699, 90, 619, -470, 309, -147, -23, -183, 317, + -264, 100, 43, -251, -163, 93, -48, 145, 140, 14, + -646, 115, -19, -254, -52, -110, -56, -33, -56, 6, + 20, -76, 4, -107, 78, 108, 125, 83, -124, -47, + -14, 117, -62, -121, -189, -203, 54, 6, -45, 51, + -106, 48, -67, -1, -30, 36, -21, 42, 58, -83, + -99, 24, 90, -47, -50, 22 + }, + { + -9, -17404, -725, -266, -303, 15, 403, 313, -795, 1015, + -72, 1108, 258, 545, 2, 525, -550, 1108, -844, 879, + 917, -104, -425, -19, -72, 433, -246, -796, -487, -642, + -379, 242, -154, 230, 376, -72, 219, -455, -208, -510, + 301, 143, 174, -435, -139, 71, -236, 126, -163, 461, + 36, -17, 212, -36, -384, -103, 51, 2, 79, 16, + -2, -130, 12, 26, -14, -50, -57, -71, 102, 75, + 41, 121, 165, 107, -138, 35, 27, 81, 91, 121, + -5, -56, -12, 58, 3, -39, -8, -102, -36, -50, + -16, 2, -29, 17, 17, -27 + }, + { + 143, -388, -453, -475, -49, 0, 172, -92, -503, -129, + -520, -69, -449, 450, -1951, 716, 1217, 586, -2308, -461, + -846, 615, 17, 107, -204, -1652, -111, 164, 0, 388, + 2, 193, -154, -360, 574, -362, 638, 179, -189, 439, + -247, 449, 331, -108, 336, 96, -421, -144, -116, -4, + -318, 79, 186, -106, -91, -38, 420, -228, -105, -121, + -388, 15, -1, -14, -68, 74, -8, -128, 9, -57, + -141, 130, 50, -141, -105, 72, 67, -163, 95, 75, + 39, -222, -36, 36, -118, 36, 34, -11, 18, -42, + 71, -41, 76, -3, 17, -54 + }, + { + -157, -25371, 11, -134, 241, 178, 538, -861, -297, 518, + -40, 308, -1904, -394, -8, -5, 83, -475, -888, -714, + 494, -328, 540, -253, -126, 589, 238, -164, 326, -331, + -590, 172, -526, -158, 389, -74, -170, -79, -134, 302, + 293, -132, -36, 7, 36, -206, -191, -242, -151, -532, + 100, -30, 57, -323, 251, -33, 165, 87, -33, -191, + 50, 11, -27, -188, 123, -77, -68, 15, 182, -61, + -49, -106, -1, 26, -242, -31, -104, 185, 178, -31, + -85, -50, -80, 92, 48, -42, 23, 85, 10, -62, + -185, -18, -76, -4, 5, -26 + }, + { + 17, 567, -609, -160, 132, 84, 30, 180, -23, -216, + -57, -510, -457, 28, 914, 128, 574, 578, 763, 556, + 521, -744, 670, -2256, -79, -774, 1077, 259, 460, 394, + -236, 81, -40, 368, -902, -104, -430, -154, 74, 281, + -84, -130, -125, -499, 183, 14, 427, -409, 120, 36, + 251, 87, 201, -120, 8, -199, 63, 85, -283, 272, + 240, 250, 172, -190, -153, 93, 33, 64, -11, -84, + -19, 19, -246, 160, -81, -96, 151, -36, -38, -149, + 63, 111, 55, -16, 46, -109, 41, -4, -15, -91, + -17, 64, 29, -20, -21, -63 + }, + { + -5097, 7869, 2471, -444, -508, 445, -443, 551, -272, 603, + -217, -617, 457, 402, -2077, 541, -444, -251, 587, 178, + -139, 405, -74, 588, -39, 397, -375, 121, -144, -102, + -889, 135, -77, 517, -246, 1081, 9, 388, -270, -274, + 212, -488, -231, -429, 283, -329, 306, -192, -279, -439, + -22, -38, -523, 128, -69, 88, 92, 42, -79, -2, + -268, -117, -141, -13, -166, -24, 129, 91, 94, 8, + 18, -52, -20, 104, -26, 7, 74, -58, 53, -11, + -88, -11, -114, -16, -26, 50, 49, -95, -80, 5, + -4, 90, -51, -34, -42, 25 + }, + { + 2, 867, -729, 22, -30, -11, 108, -57, -199, 118, + -311, 415, 8, -1302, -507, -235, 766, -514, -235, 970, + -705, 742, -189, 17, -856, -1513, 927, -516, -315, 1047, + -769, 155, -489, 403, 250, -457, 489, 297, 260, 480, + 102, 9, 392, -471, 349, 105, 28, 9, -21, 304, + 78, 199, 84, 213, -172, 56, -86, -95, -115, -15, + 184, 121, -142, -74, 318, 48, 129, 24, -74, -71, + -122, 70, -158, -44, -13, 8, -85, -45, 54, 158, + 71, 120, -31, -49, -103, -42, 121, 28, -63, -18, + 7, -22, 36, 3, -33, 48 + }, + { + -2134, -3430, 3249, -538, 225, 762, -1023, -1292, 142, -648, + 149, 133, 371, -275, -846, -658, 426, -319, 1698, 658, + 468, -172, -374, -1106, -86, 323, -223, 287, -801, -9, + 268, -528, -87, 61, -82, -354, 711, 643, -362, -50, + -459, -289, -352, 34, -473, 306, 360, -131, 286, -269, + 90, 76, -207, -334, 289, -26, -3, 4, 84, -86, + 505, -58, 74, -24, -333, -99, -45, 91, 52, -178, + 200, 144, 27, -105, -65, 50, -4, -106, 69, -77, + 10, 28, 68, 171, 162, 37, -111, -192, -117, 36, + 122, -74, -43, 76, -20, -56 + }, + { + 18, 4255, -921, 441, 37, 456, 345, -66, -194, 530, + 947, 774, 147, -1053, 463, -1196, -18, -141, -136, -1392, + 633, -276, 57, -643, -268, 104, -565, -276, -475, 239, + 201, -381, -288, -104, -551, 60, -400, 51, 359, 762, + 714, 124, -526, -60, -234, 329, 314, 606, 141, -63, + 0, -218, 255, -29, 45, -316, -125, 115, 11, -14, + -71, -149, 383, 146, 221, -156, -240, 110, 179, -27, + -117, -91, 15, -125, -6, -120, -52, 54, -34, 65, + 87, -19, -49, -71, 12, -117, 4, 36, 19, 34, + 3, -49, -23, -66, 41, -38 + }, + { + 2182, 9292, 668, 308, 1928, 32, 1071, 405, -377, 812, + 1033, 605, 69, -402, -1489, 497, -268, 445, -318, -903, + 60, 727, 56, 514, -689, -812, -845, 26, 271, -597, + -319, 201, 213, 322, -360, 372, -298, 463, 59, 237, + -73, -129, 233, 72, -495, 255, -349, -135, 403, -263, + -12, 295, -226, -368, 162, -462, -179, 186, -126, 30, + -76, 93, -3, 133, -218, 49, 195, -84, -123, 59, + -19, -89, -42, 139, 110, 118, 93, 42, 71, 32, + 4, 34, 84, 27, -25, 22, 46, 24, 52, -34, + 4, 11, -64, -27, -64, -2 + }, + { + 174, -340, -1219, -235, -463, -294, -40, 421, 141, -226, + -338, -517, -659, 736, -3538, -537, -1739, 47, 653, -269, + -1207, -134, -427, -765, 528, 167, 989, 886, -13, -741, + -966, 55, 487, -227, -199, 526, -385, -658, 135, -69, + -52, 13, -205, -121, 32, -434, 192, -193, 569, -126, + 85, 47, 21, -105, -12, 287, 300, 141, 119, 160, + -81, 290, -263, -139, -52, -59, 16, -247, 172, -179, + -26, 190, -121, 86, 254, -57, -64, -46, -103, -64, + -26, 155, 96, 0, 82, -38, -9, -21, 183, 85, + -113, 58, -17, -91, 24, 6 + }, + { + 1940, -1226, -1067, -1215, 213, 332, -253, 768, 434, -440, + -267, -410, -799, -454, -1409, 484, 986, -640, -1289, 608, + -81, 335, -67, 147, -356, -170, -829, 765, -87, -540, + 11, -430, -171, -330, -326, -102, 580, 815, -11, -238, + -117, 501, 79, 371, 123, 308, -43, -590, -399, -257, + -283, -23, 307, -281, -80, 239, -139, -2, -295, 80, + 168, 128, 66, 75, 179, 182, 244, 207, 86, 38, + 136, -144, 112, 6, -122, 37, -4, -99, 20, 150, + 122, 1, 25, 28, 47, -50, 68, -48, 117, 24, + -81, -103, 15, 16, -20, 43 + }, + { + -139, -4023, 1010, 134, 127, 573, 501, -36, -417, -123, + 836, -506, 291, -373, -5273, -1110, 256, 2210, 205, -673, + 2518, 1721, 419, 400, -260, -175, -548, -446, 819, 76, + 91, -812, -257, -309, -93, 748, -257, -494, 697, 229, + -239, -223, -234, -196, -263, -21, 66, 13, 149, 10, + 358, 245, 131, -314, 349, 198, 119, -105, 424, -92, + -138, 230, 42, 250, -96, -135, 8, 151, -48, -56, + 21, 103, 21, 18, -79, -24, 149, -114, -96, -101, + -130, 59, -82, -30, 30, -20, 13, 95, 78, -109, + 86, -19, 56, 25, 17, -60 + } + }, + { + { + 16, -15462, 1950, -1116, 487, -46, 334, -1157, -118, -1516, + -425, -945, -19, 136, 700, -135, -459, -201, -606, 154, + 231, 116, -574, 262, 118, 446, 27, -209, 293, -179, + 349, 175, -14, -96, 967, 284, 231, 26, -119, 100, + -284, 66, 235, 222, -553, 343, -326, -304, -192, -196, + -78, 221, -140, 198, 82, -199, -228, -88, 9, -124, + -105, -36, -22, 52, 105, 0, 34, -207, 142, 221, + -58, 79, 73, -107, -68, -24, 43, 35, -8, -27, + -150, -108, 112, -21, -118, 39, 81, 56, -88, -26, + 5, -39, -38, 29, -51, 18 + }, + { + 45, 860, 551, 608, -784, 58, 32, 28, 212, 449, + -85, -89, 365, -435, -773, 337, -225, -874, 47, 779, + -287, -82, -90, 860, -278, 545, -684, 347, -354, -67, + -991, 102, -597, -249, 2, 34, 278, 461, -12, -112, + 288, 438, 124, -162, -560, -682, 330, 411, -35, -249, + 152, -115, 144, 8, 309, -60, 219, -275, -134, -53, + -65, 196, -90, -2, -4, -29, 28, 137, 152, 174, + 105, 80, -44, -77, 53, 2, -131, -118, -49, -57, + 3, 67, -97, 73, -15, -3, 2, 32, -36, -12, + -36, -65, -49, -45, -15, -21 + }, + { + -242, -4436, 350, 1131, -88, -337, -204, -611, 507, -100, + -1005, 1419, -536, -380, 594, -117, 47, 1588, 225, -94, + 315, -702, 403, 111, -219, 485, -950, 234, -245, -237, + 377, 763, -511, 642, -170, 70, -73, -180, 119, 251, + 45, -303, -217, -6, -133, -35, -131, 253, 113, -279, + -329, 60, -64, -17, -200, 17, -306, 125, -161, 110, + 120, -74, 44, -195, 50, 129, 226, 76, -152, 3, + 24, -102, 28, -67, -73, -189, 53, -148, 83, -3, + 44, -175, 9, 10, -12, -86, 14, 120, 0, -55, + -88, 5, 54, 3, -41, 0 + }, + { + -1466, -18185, 882, -81, 37, 118, 285, -147, -460, 613, + 996, -72, 538, 685, -374, 235, -307, 651, -118, 1054, + 433, -15, 115, -360, 165, 755, -775, -558, -880, -564, + -280, -125, 379, -54, 340, 296, -376, -93, -395, -450, + 672, 54, 187, -2, -644, -190, 7, -137, 287, 107, + 175, 109, -99, -58, -100, -135, 71, -187, 346, -113, + -24, 67, -77, -41, 23, -10, -34, 95, -40, 12, + 125, 122, 203, -81, 40, -41, 112, 43, 79, 41, + 47, -147, 28, 63, 4, -4, -51, 5, -104, -69, + -4, 26, -14, -19, 7, -2 + }, + { + -119, -710, 9, -358, -104, 110, -75, -1, -333, -202, + -476, 36, -363, 282, -1309, 838, 228, -2110, 112, -849, + -187, 1569, -1661, 290, 346, -1379, -532, 146, 308, 566, + -254, 1006, -393, -927, 526, 426, -123, 271, 271, 95, + 247, -42, 376, 278, 377, -161, -545, -8, -19, -246, + 69, -9, 23, -73, 64, -55, 251, 57, -196, -349, + -165, -140, -13, 37, -52, 51, -34, -43, 14, -81, + 58, -113, 53, -76, -50, -51, 50, -87, 15, 89, + 35, -197, -29, -50, -113, 31, 27, 18, -43, 37, + 22, 45, -4, 34, -1, -50 + }, + { + -2071, -24637, 899, 909, 123, 171, -498, 1026, -634, -318, + 73, -40, -1012, -328, -563, 704, -408, -981, -1054, -617, + 508, 244, 285, -346, 145, 428, 241, 462, 72, -335, + -100, -92, -997, 50, 234, -106, -302, -235, 81, 18, + 564, 24, -161, 204, 198, -113, -477, 85, -214, -445, + 128, -124, 8, -104, 141, 183, -183, 226, -145, -2, + -139, 49, -72, -165, 246, -32, -112, 114, -34, 46, + -95, -77, -20, 1, -145, -58, -92, 156, 192, -81, + 1, -67, -14, 19, -41, 49, 48, 8, 0, -31, + -138, -71, -22, 23, -65, -13 + }, + { + 25, -441, 149, 201, -52, 1, 93, 72, 189, 23, + -455, -173, -786, 963, -314, 2544, -822, -122, 367, 1269, + -410, -393, 1502, -2208, -668, -691, -83, 1416, -404, -924, + 591, 576, 105, -274, -707, -75, -293, -85, 62, 93, + 113, -14, -138, -415, -91, 222, 346, -166, -97, 58, + 197, 102, 128, 140, -204, 11, -32, -120, -74, 329, + 311, 155, -2, -197, 8, -64, 101, -146, 180, 97, + -7, -205, -123, -31, -72, 28, 67, -15, -49, -168, + 107, 40, 26, 65, 21, -163, 72, -15, -30, -25, + 26, 29, -2, -12, 28, -68 + }, + { + 5322, -585, -2029, -1478, 241, 285, 439, -194, 175, -92, + -413, 478, -398, 708, -1835, 194, 378, -156, -45, 43, + 163, 154, 376, 470, 356, -257, -141, 396, -79, -527, + -865, -6, 182, 46, 124, 477, 8, 674, -475, 281, + -302, -291, -453, -43, -119, -197, -9, 451, -613, -276, + 38, -56, -268, -87, -11, 132, 105, -159, 23, -8, + -116, -318, -184, -41, -201, -69, 121, 239, 47, -24, + 162, -122, -168, 149, -73, 75, 30, -90, 55, 15, + -86, -29, -101, -77, -2, 90, 2, -16, -40, -53, + 18, -9, 13, 3, -33, 4 + }, + { + 72, -148, 263, -373, 282, 21, 147, -56, -156, -56, + -26, 99, 324, 777, -2770, 652, -696, 324, -1117, 418, + 1068, 11, 626, -2016, -165, -731, -826, 531, -211, 398, + 43, -559, 159, -108, 79, 213, 233, 160, 403, 601, + -357, 276, 329, -288, 31, 96, 158, 10, -36, 48, + 463, 3, 100, 166, -101, -22, 10, -212, 96, 102, + 61, -8, -189, 35, 271, -15, 223, 5, -16, -144, + -27, -90, -63, -28, 1, 4, -56, 13, 52, 73, + 113, 237, -167, -22, -53, -8, 6, 22, 54, -69, + -11, 39, 9, 27, -65, -17 + }, + { + 2086, -1461, -4098, 138, 981, -1256, -50, -1335, 81, 39, + 462, -164, -227, 7, -694, -609, -185, 347, 1350, 516, + 494, -167, -56, -564, -517, 185, 768, -343, -632, -346, + 471, -810, 429, -130, -552, 97, 489, 548, -36, -347, + -665, -27, 11, -136, -297, 27, 340, -15, 123, -358, + -59, 331, -81, -293, 206, -146, -126, 145, 75, 103, + 335, -25, -110, -139, -3, -345, -128, 254, -104, -55, + 51, 220, -19, -91, -12, -46, -11, 33, -139, 36, + -9, 172, -59, 216, 109, 34, -131, -78, -122, 48, + 26, -5, -62, 15, 24, -88 + }, + { + -89, 3111, 419, 513, -61, -176, 726, -81, 370, 95, + 278, 939, 336, -1082, 81, -382, -8, 299, -2286, 590, + -345, -621, 296, -127, -358, -265, -315, -481, 35, -461, + 446, -813, 17, 295, -593, -265, -232, -173, 424, 782, + 516, -124, -122, -105, 125, 531, -114, 593, -86, 177, + -378, -21, 295, 73, -208, -413, -51, 83, -36, 341, + -330, -18, 339, 278, 38, 24, -319, 113, 80, 48, + -193, 20, -113, -34, -96, 21, -85, -5, 54, -89, + 135, 60, -191, 51, -85, 15, -59, -20, -33, 59, + -33, 11, 53, -123, -36, -6 + }, + { + -390, 13633, 1033, 251, -409, 1322, 1288, 220, -75, 698, + 587, 689, 400, -55, -1526, -103, 274, 167, -611, 122, + -633, 603, -352, 663, -762, -423, -634, -103, 127, -7, + -520, 261, 354, -27, -169, 213, 104, 218, -304, 108, + -160, 91, 533, -339, -391, 329, -545, -37, 650, -226, + -84, 129, -235, -157, -204, -425, -131, 19, 7, -258, + 143, 221, 31, -85, -92, 22, 11, 141, -104, -81, + -21, -124, 105, 108, 99, 49, 142, 51, 150, 20, + -31, -50, 162, 39, -1, 47, -13, 79, -18, -8, + 31, -84, 3, -35, -48, -8 + }, + { + -153, -1944, 279, -349, -11, -504, -30, 534, 109, -451, + -298, -331, -417, -568, -3328, -351, -86, -269, 1109, -989, + 588, -2008, -804, 647, -786, 251, 1383, 1017, -719, -402, + -605, -262, 775, -942, 323, 87, -160, -499, -287, 113, + -79, 226, -203, 10, -38, -135, -52, 33, 100, 161, + -46, -115, 270, -41, -81, 313, 329, 187, 151, 304, + -147, -2, 209, -168, -228, 96, -37, -78, 32, -25, + -212, 145, 26, -1, 65, 89, -89, -60, -72, -118, + 1, 104, 137, -65, 25, 26, -5, 45, 77, 55, + -51, 2, -11, -46, 50, -35 + }, + { + -2005, 3165, 609, -1812, 896, -1010, 511, 138, 190, 356, + 594, -1296, -782, -1603, -891, 1051, 1202, -470, -1070, -130, + 15, 30, 303, -213, -39, -428, -437, 86, -43, 478, + -115, -616, -159, -442, -231, 271, 29, 521, -549, -180, + 715, -83, 116, 443, 406, -218, 36, -416, -454, -242, + -80, -102, 7, 4, 101, 35, 40, -168, -150, -65, + 254, 91, 119, -25, 168, 218, 280, 189, 294, 36, + -158, 113, -113, 34, 7, -28, 18, -107, 19, 121, + 47, 47, 99, 60, -23, 55, -6, -56, 46, -2, + -34, -61, 5, -7, -2, -36 + }, + { + 173, -3683, 495, 71, 614, 117, 366, -104, -376, 424, + 198, -163, 420, -3142, -2552, -1789, 2203, 992, 1202, 350, + 148, 1790, 683, 767, -496, 142, -840, -529, 838, -504, + -84, 45, -105, -176, 147, 91, 50, 253, -199, 255, + -244, -336, 38, 144, -713, -48, 153, 294, -188, -63, + 164, 222, 1, 181, 301, 153, -77, -106, 231, -9, + -143, 329, 180, 75, -16, -123, 171, 97, -195, -111, + 78, 67, 81, 24, -138, 38, 134, -86, -99, -94, + -21, -96, -47, -7, 6, 23, -1, 73, 22, -28, + -23, 32, -18, 44, 10, 64 + } + }, + { + { + 48, -17353, -1743, -1293, 125, -679, 265, -683, -293, -1011, + 106, -1596, -512, 355, 952, -750, -442, 108, -553, -540, + 45, 441, -514, 363, 96, 460, 75, 274, 113, -988, + -482, 94, 632, 68, 584, -128, -68, 277, 377, 163, + -307, -151, -360, 88, -641, 166, -142, -274, -259, -429, + -296, 141, -225, 146, -17, -234, -148, 28, -71, -94, + 288, 92, -151, -182, -72, 21, 159, -179, 12, 43, + -134, -47, 26, -88, -63, -57, 41, 37, 37, 93, + -3, 18, 123, -49, -87, 36, 42, 46, -36, 44, + 30, -5, 2, 48, -21, 72 + }, + { + 14, -746, -915, 1025, -97, -77, -114, -94, -318, -395, + -715, -231, 848, -31, -276, 891, -43, -294, -580, 111, + -7, -361, 170, 473, -1728, 692, 107, 1119, 189, 244, + -593, 400, -50, -26, 300, -57, 475, 442, -107, -115, + 9, 334, 158, 23, 103, -181, 217, 2, -256, -352, + -2, -194, 164, -31, 191, -409, -29, -97, 291, 119, + -102, 41, -121, 98, -70, -46, 54, 138, 62, -10, + 66, 135, -246, -234, 59, 54, -16, 24, -4, -3, + 15, 18, -71, 127, 21, 31, -1, -1, -31, 50, + -35, -73, 11, 13, -12, -29 + }, + { + 203, -3784, -114, -295, -877, -163, -157, -786, 426, 381, + -484, 551, -1056, -133, 1321, 532, 410, 1274, -325, 168, + 851, -86, 450, -626, 217, 1265, -933, -162, -243, 170, + -259, -141, -577, 38, -398, 103, 94, -64, 11, 88, + 40, -160, 51, 145, -164, -57, 106, 287, -161, -170, + -3, 35, -146, 91, -115, 75, -60, 322, -84, 64, + 45, 16, 167, -113, 0, 118, 182, 31, -60, 52, + -57, -107, 150, 45, 147, -53, -73, -182, 195, 76, + 122, -166, -34, -21, 50, -41, -19, 53, 29, 45, + -84, -17, -20, -29, -25, 11 + }, + { + 2632, -15887, -1017, 1383, 638, -113, -267, -463, -23, 258, + 100, -554, 193, 126, -1412, -583, -822, -321, -595, 579, + 44, 573, 709, -380, 317, 648, -576, 254, -224, 308, + 274, -232, 280, -203, 272, 272, -405, 124, -80, -61, + 520, 15, 281, 270, -427, -69, -145, -531, 127, -70, + 348, 342, -196, -59, 140, 221, 359, -219, 206, -91, + 217, 293, -181, -113, -1, 108, 138, 174, 18, 48, + 94, 19, 41, -104, 101, -43, 109, 9, 23, -40, + -8, -137, -6, -15, -38, 7, -99, -7, -42, 6, + 37, 52, 18, 3, 77, 41 + }, + { + 73, -1275, -579, 25, 235, 52, -96, 379, 103, 101, + -324, 11, -766, -513, -1619, -145, -737, -472, 2574, -418, + -280, 1188, -1515, 254, 58, -383, 335, -7, -138, 474, + 275, 896, 145, -327, 35, 218, -103, 504, 489, 175, + 353, -375, 182, 475, 532, 67, -365, 256, 474, 59, + 324, -39, -38, -37, 76, -137, -20, -53, -59, -55, + 52, 4, 140, -34, -78, 104, 95, 110, 54, -97, + 67, -57, 114, 13, -35, -36, 133, -14, -44, -39, + 56, -69, -3, -46, -74, 10, -32, -4, -35, 69, + 37, 45, -70, -7, 21, -2 + }, + { + 3721, -20056, -1239, 1453, -134, 16, -217, 1466, -594, 108, + 274, 613, -113, -237, 306, 990, -511, -457, -211, 159, + 761, 348, 226, -467, -63, 351, 306, 685, 288, 176, + 94, -279, -1119, -350, -184, -423, -406, 35, 85, -294, + 393, 201, -70, 258, 674, 402, -478, 63, 176, 161, + 320, 64, 63, 68, 208, 110, -355, 27, -240, 89, + -84, 187, 171, -47, 151, -24, -23, 47, -80, 128, + -37, 47, 0, -45, -67, -37, -103, 41, 116, -76, + 91, 11, -84, -5, -20, 54, 26, -15, 22, 19, + 17, 0, -33, 24, -26, 6 + }, + { + 6, -844, 382, 373, -49, -51, -29, 158, 247, 153, + -40, 305, -293, 1790, -240, 620, -1883, -71, -514, 701, + 357, 563, 1571, -1939, -517, -593, -968, 1087, -153, -1196, + -140, 104, 149, -183, -390, 33, -160, 14, -126, -139, + 19, -100, -39, -44, -191, 126, 383, 108, -1, -105, + -1, 80, 83, 36, -222, 139, 49, 0, -77, -93, + -65, -93, -39, -158, 13, -95, 145, 36, 289, -3, + -74, -84, 8, -58, -72, 31, 7, -35, 11, -120, + 68, -42, 35, 28, -30, -44, 89, -49, 75, 10, + -19, -25, -38, 17, 9, -73 + }, + { + -4551, -9159, 686, -3014, 7, 198, 552, -41, 114, -38, + -419, 238, -258, 1453, -1043, 132, 1175, 365, -737, 143, + 491, 249, 456, 356, 360, -123, 300, 390, -58, -319, + -588, 101, 403, 38, 96, -103, -382, 622, -497, 359, + -203, 19, -359, 266, 257, -26, -282, 546, -38, 188, + 481, 319, -138, -58, -13, 229, 235, -219, -19, -131, + -229, -242, -101, -24, 35, 59, 59, 151, 68, -156, + 57, -53, -190, 66, -150, -38, -83, -112, -11, -41, + -49, 104, 26, -13, 15, 41, -5, 77, 0, -85, + -52, -69, 19, 21, 7, 92 + }, + { + -3, -753, 432, 129, 424, -41, 101, 35, 75, -31, + 75, 226, 191, -597, -4263, 271, -1225, -83, -1116, 1415, + 1000, -955, 955, -2278, -779, -312, -853, 719, 425, -124, + -106, -266, -115, -613, 404, 441, -313, -29, 608, 476, + -464, 359, 269, -87, -205, -340, -73, 21, 9, -192, + 157, -367, -136, 211, 8, -117, 98, -58, 165, 13, + -26, -115, -235, 0, 41, -149, 80, -53, -6, -93, + 86, -107, 40, 84, 19, 128, 58, 18, 108, 32, + -2, 139, -164, 22, 44, 43, -73, -24, 108, -71, + -23, 109, -11, 30, 17, -27 + }, + { + -1954, -781, -215, -270, 574, -9, 1891, -306, -97, -3, + 644, -67, -832, -433, 27, 144, -570, -156, 117, -662, + 98, 367, 261, -253, 487, 465, 376, -393, 172, 192, + 336, -711, 747, 94, -806, 47, -323, -337, 192, 485, + -252, 53, 205, 144, -104, -382, 261, -38, -28, -204, + -53, 0, -103, -65, 301, -215, -163, 220, -29, -66, + -65, -224, -48, -114, 20, -284, -111, 144, -85, 58, + -63, 46, -33, -109, -8, -49, -30, 121, -33, 119, + 1, 169, -122, 120, 29, 117, 54, 37, -59, -11, + -86, -15, -96, -17, 82, -7 + }, + { + 125, 1667, -861, 86, -307, -618, 89, -200, 455, -506, + -568, 373, -8, -750, -238, -383, -273, -9, -1972, 902, + -344, -321, 514, 402, -7, -738, -684, -252, 706, -257, + 161, -607, 126, 45, -251, 65, -359, -361, 101, -23, + 18, -220, -253, -38, 178, 248, -423, 439, -141, -166, + -647, 76, 200, -21, -250, -384, -54, 76, -15, 421, + -107, -126, 43, 197, 48, 189, -194, 27, -20, 56, + -89, 209, -11, -72, -86, 120, -53, -37, -10, -136, + 54, 32, -196, 75, -83, 62, 21, 18, -42, -52, + -41, 75, 101, -66, -19, -19 + }, + { + -1851, 12565, 1240, 228, -586, -130, 250, 437, -626, 243, + 291, 118, 546, 275, -1174, -217, -151, 43, -792, -78, + -298, 818, -758, -153, -175, 719, 179, 141, -86, -32, + -359, 302, 123, -359, 524, 117, -853, -166, -462, -113, + -109, -24, 242, 97, -253, -62, -826, 68, 774, -124, + -396, -350, -218, 165, -228, -291, -65, -144, -194, -431, + 229, 275, 59, -72, 3, -115, -179, 203, -9, -132, + -127, -135, 83, 57, 135, 98, 148, 75, 119, -6, + -4, -81, 158, -4, -54, 43, -30, 50, -79, 48, + 46, -102, 42, 7, -25, -66 + }, + { + 121, -3099, -642, 378, 316, -343, 335, 409, -167, -619, + -17, -138, 625, 481, -1474, 1058, 1188, 357, 919, -1053, + 1588, 337, -620, -887, -1523, 181, -54, -15, -178, 488, + 75, 44, 430, -1488, 131, -374, -221, -156, -310, -131, + -74, 473, 310, 337, -103, 327, 211, -5, -91, 180, + 323, -109, -39, -41, 62, 213, 82, -169, 5, 142, + -209, -21, 345, 75, -92, 149, -111, -284, -49, -41, + -144, 126, -62, -96, -137, 102, -70, -125, -40, -81, + -83, -101, 22, -126, -3, -44, -82, 55, -31, -21, + -29, 13, 21, 22, 63, -32 + }, + { + 1144, 7366, 646, -1210, 1080, -1723, -632, -679, -145, 487, + 711, -1496, -120, -96, 655, 940, 1467, -18, -692, 499, + 475, 294, 389, -90, -232, -451, -164, -233, -210, 84, + -296, -333, -56, -714, -297, -72, -707, -162, -721, 30, + 748, -663, -183, 75, 86, -560, -249, -95, 213, 453, + 497, -83, -253, 348, 462, 34, 75, -214, 15, 59, + 56, -6, 58, -72, -53, -95, 81, 67, 94, -2, + -123, 86, -101, 49, -7, -54, -6, -53, 98, 93, + -58, -35, 63, 104, 22, 92, -50, -79, 24, -65, + -7, 12, -12, -4, 19, -22 + }, + { + -220, -3437, 915, 101, 320, -499, 79, 133, -178, 373, + -301, -477, 565, -302, 1990, -1355, 1255, 301, 383, 315, + -184, -117, -1090, 533, 5, 331, -820, -449, 130, -858, + 518, 384, -10, 143, 198, 31, 693, 576, -460, 321, + -196, -272, 169, 72, -614, -246, -52, 118, -212, -35, + -157, 10, -132, 183, 322, 80, -115, -53, -40, -123, + -182, 162, 86, -4, -69, -74, -46, -80, -123, -275, + 31, 55, -10, -54, -37, 115, 12, -40, 92, -6, + -7, -121, -3, 119, 125, 20, -18, -21, -93, -78, + -83, 4, -26, 1, -17, 93 + } + }, + { + { + -28, -9100, -7891, 118, -1614, -181, -113, 147, -647, -90, + -675, -1003, -1331, -46, 1487, -815, -383, 13, -165, -972, + -179, 402, -45, -280, 69, 465, 300, 649, -464, -328, + -834, 2, 577, 450, -69, 106, -128, 364, 280, 37, + 121, -266, -481, 57, -161, -390, 137, -379, -185, -342, + -84, -332, 42, -190, 39, -38, -47, -74, -96, 95, + 122, -38, -133, 2, -145, 67, 77, -127, -84, -24, + -69, -49, 69, -85, -87, -61, 66, -4, 82, 95, + 54, 13, 34, -65, 21, 25, -31, 79, -18, 48, + 30, 3, 1, 18, 33, 34 + }, + { + -75, -963, -545, 58, 635, -52, -126, -9, -174, -399, + -1065, -283, 580, -338, -86, 571, 435, 98, -1239, 351, + -292, -367, 684, 555, -1762, 418, 752, 431, 272, -128, + 503, -551, 572, -102, 607, -132, 159, 203, 114, -117, + -41, 318, 309, -148, 201, -65, 28, -202, -11, -187, + -333, -21, 160, -3, -167, -142, 57, -60, 325, 54, + -108, -117, -36, 201, -79, 41, -19, 85, 143, -96, + 47, 74, -193, -182, 58, 7, 14, 61, -9, -3, + 57, -74, 9, 73, 80, 42, -67, 4, 13, 47, + -48, -53, 32, 11, -50, 29 + }, + { + -126, -1521, -1442, -1252, -27, -226, -105, -196, -119, 50, + 417, -445, -274, -334, 772, 970, 440, 1337, -1103, 643, + 668, 384, 22, -267, 657, 503, -327, -267, 175, -50, + -409, -180, -264, -651, -299, 109, 292, 26, -52, -64, + -98, 123, 176, -72, 108, -157, 210, 232, -281, -151, + 180, -95, -73, -155, 129, -79, 187, 34, -7, 46, + 140, 6, 132, -109, -41, 175, 79, -64, 50, 62, + -57, -54, 101, 15, 130, 74, -196, -86, 77, 69, + 108, 0, -93, -8, 29, 9, -28, 15, 34, 46, + -20, -54, -66, -65, 27, 39 + }, + { + -3098, -11294, 1505, 3042, -757, -33, -254, -348, 277, -410, + 176, 159, -286, -415, -1340, -188, -1375, -394, 68, 8, + 257, 506, 579, -386, 26, 384, -69, 225, 118, 172, + 590, -346, 201, -26, 77, 83, 57, -38, -233, 311, + 38, 251, 284, -119, 49, -21, -354, -335, -139, 232, + 145, 416, -97, -153, 303, 238, 151, 56, -157, 67, + 198, 243, -64, -131, -92, 174, 178, 87, -20, 107, + 31, 20, 37, -17, 9, -25, 86, 65, -9, -19, + -53, -16, -98, -57, -37, 29, -42, -54, -14, 10, + 40, 29, 23, 32, 35, 44 + }, + { + -39, -2107, 261, 346, -2, -22, 71, 230, 263, 24, + -225, 163, -433, -588, -1264, -1743, -1007, 2402, 368, 189, + 162, 594, -524, -617, -259, -690, 1382, -455, 65, 303, + 374, 415, 166, 253, -69, -50, 140, 389, 308, 232, + 211, -223, 358, 299, 155, 222, 30, 59, 320, 339, + 296, -73, -66, -32, -23, -153, 20, -91, -101, 102, + 190, -172, 208, -58, 114, -111, 65, 221, 24, 47, + -57, 19, 28, 130, -69, -9, 89, 46, -61, -71, + 42, 29, -31, -41, -53, -14, -16, -2, 13, 15, + 42, 34, -50, -3, 33, 7 + }, + { + -4283, -12292, 870, 316, 770, -19, 823, 454, -524, 732, + 191, -391, 729, 12, 182, 437, -335, -137, 70, 822, + 179, 180, 198, -146, -380, 71, 508, 257, 627, 550, + -147, -476, -724, -488, -396, -277, -105, 118, -193, -294, + 77, 268, 305, -73, 545, 339, -335, 36, 236, 247, + -7, 293, -107, 411, 8, 83, -98, -38, -194, -22, + 62, 34, 93, 185, -97, -38, 115, -46, 43, 26, + -3, 86, -115, -2, -21, -7, -67, 24, -9, 20, + 45, 94, -90, -45, 2, 50, -1, -21, 5, 81, + -11, 9, 1, -10, 29, 4 + }, + { + -30, -757, 387, 79, 240, -52, -69, 205, 114, 35, + 222, 244, -5, 310, 342, -938, 89, -97, 47, -37, + 442, 382, 1278, -267, -1080, 45, -1278, 250, -317, 106, + -473, -372, -74, 380, 7, -445, 66, 72, -199, -203, + -6, -100, -87, -85, -35, 243, -8, 348, 88, -103, + -98, 110, 58, -169, -20, 66, 113, -206, 185, -194, + -135, -40, -57, -78, -11, -3, 103, 74, 202, -65, + 7, -51, 11, -69, -10, -51, 48, 16, -14, -52, + -30, -50, 89, 13, -32, -7, 46, -38, -1, 53, + -4, -68, 19, 16, -39, -13 + }, + { + 2961, -14163, -2366, -3111, -616, 212, -96, 235, 220, 437, + -126, -719, -192, 463, 937, -610, 488, 811, -564, 407, + 359, 281, 275, 278, 145, 86, 493, -29, -199, -293, + -117, -16, 223, 200, 68, -79, -252, 204, -64, 115, + -222, 67, -76, -38, 487, -193, -174, 505, 179, 356, + 411, -23, 106, 4, 38, 208, 67, -298, -57, -161, + -161, 27, -96, -46, 32, 153, 45, -68, 152, -72, + -63, 15, -64, -101, -63, -101, -81, -32, -124, -31, + 32, 58, 23, 3, -25, 85, 7, 14, 64, -72, + -80, -16, -11, 24, -30, 73 + }, + { + -67, -22, -327, 611, 69, 7, 37, 104, 75, 56, + -74, 281, -88, -156, -3289, -1837, -982, 255, -677, 1568, + 719, -1092, 228, -356, -1469, -644, 135, -399, 823, -438, + -237, 226, -249, -578, 685, -166, -167, 228, 231, 523, + -25, -27, 302, 73, -374, -286, -200, -48, 32, -25, + -41, -295, -172, 106, 10, 20, 150, -7, -8, -29, + 56, -171, -86, -134, 10, -49, -79, -32, 88, -106, + -13, -74, 52, 96, 68, 50, 120, 10, 65, 55, + -33, -61, 32, 42, 33, 23, -64, 3, 59, -38, + 39, 13, -1, 17, 59, -12 + }, + { + 1793, -832, -3532, 822, -186, 385, 1592, 175, -533, 524, + 178, 423, -826, -1139, -406, 113, -40, 304, -787, -3, + 240, 153, 77, -231, 831, 559, -27, -159, 351, 66, + -515, 264, 124, 440, -507, -339, -376, -281, 242, 368, + -82, 9, 103, 109, 335, -332, -238, 96, -121, -110, + 248, -285, 21, 31, 25, -1, -274, 144, -15, -91, + 32, -244, -158, 11, -107, -140, 10, -35, 100, -57, + 22, -9, -61, -113, 100, -65, 28, 22, 15, 52, + 109, 80, -31, 60, 61, 49, 57, 33, -21, -12, + -103, -6, -102, -3, 32, 62 + }, + { + -140, -261, 925, -136, -141, -90, -567, -287, 49, 176, + -168, -567, -265, -599, -336, -105, -554, 404, -584, -456, + -130, -27, 35, 423, 297, -330, -855, -112, -72, 470, + 73, -339, -53, -100, 350, -653, -94, -331, 104, -121, + -405, 286, -377, -72, 115, -58, 128, -146, -139, -252, + -223, -26, -50, 105, 17, -478, -72, 34, 21, 225, + 193, -104, -59, 103, 160, -27, -44, -25, -40, -9, + 23, 138, 33, -24, -58, 24, 27, -36, -46, 9, + -99, 10, -44, -24, -31, 28, 21, -7, 17, -50, + -53, 61, 81, -24, -15, 9 + }, + { + 3363, 6619, -83, 103, -312, -409, 121, 162, -496, -126, + 783, 284, 213, -332, -146, -595, 68, -188, -921, -9, + 386, -87, -177, -520, 922, -109, 839, -237, -104, -382, + 213, 28, -122, -357, 295, 249, -545, -203, -456, 6, + -293, 275, -161, 150, 167, -594, -642, 319, 217, 30, + -246, -442, -91, -85, -71, -139, -230, -87, -246, -193, + 238, 141, 38, -18, -46, -24, -197, 57, 59, -133, + -108, -30, 32, 66, 82, 94, 106, 102, 121, -46, + 7, -22, 69, 78, -70, 10, 36, -18, -99, 88, + 23, -86, 1, 38, -32, -51 + }, + { + -68, -3338, -179, 336, 212, 85, 187, -11, 55, -611, + 68, -180, 523, 1492, 595, -1358, 1074, 223, -104, 274, + -717, 1901, 0, -1151, -1151, -195, -473, -476, 444, 707, + 258, -517, 298, -419, -344, -519, -158, 178, -13, -446, + 24, 148, 588, 330, 124, 105, 208, 22, -48, -13, + 419, -49, -54, 6, 39, 53, -80, -114, 62, -58, + -36, 27, 276, 50, -73, -12, -34, -261, 53, -63, + -127, 2, -29, -75, -113, 50, -5, -164, -90, -12, + -92, -119, -73, -1, 7, -81, -57, 29, -74, -40, + 1, 24, 17, 11, 46, 20 + }, + { + 231, 8520, -133, 677, -439, -932, -811, -407, 99, -281, + 1094, -1300, -24, -287, 1304, 46, 959, 472, -382, 414, + 577, 486, -164, 80, 50, -251, -438, -318, 218, -544, + -246, -59, -198, -607, -189, -205, -284, -682, -70, -284, + 278, 119, -442, -237, -51, -336, -47, 31, 7, 323, + 380, 366, -132, 137, 357, -37, 32, -42, -34, 238, + -65, 25, -115, -37, -37, -19, -66, 59, 80, -189, + 164, 33, -68, 35, -10, -142, -75, 72, 96, 123, + -20, -88, 6, 120, 31, -23, -12, -2, 2, -105, + 0, 50, 5, 0, -20, 51 + }, + { + 253, -2788, -92, 394, -6, 15, -284, 38, -171, -115, + 64, -34, -169, -356, 3454, -690, 25, 515, 52, 1057, + -743, -737, -693, 161, 752, -215, -512, -1160, -540, 362, + 211, 426, 77, -161, 126, 458, 410, 437, 123, 29, + 214, -392, 337, -333, -377, -212, -285, 31, 73, -222, + -148, 0, -47, 326, 166, 138, -74, -137, -163, 55, + -150, -58, 213, -9, -142, -136, -54, -166, -105, -142, + 32, -2, -40, -6, 42, 61, 71, -70, 18, 27, + -15, -142, 40, 124, 145, 8, -29, -29, -114, -62, + -67, -5, 5, -45, 9, 36 + } + }, + { + { + -203, 1348, 2018, 1631, -624, 278, -162, 505, -59, -164, + -332, 322, -1029, -600, 536, -959, -385, -272, -93, -705, + -127, 364, 318, -152, -89, 230, -212, 136, 93, 334, + -444, 302, 247, 191, -143, 282, 92, 164, -149, -132, + 335, -34, -294, 45, 67, -132, 334, -106, 42, -104, + 89, -270, 157, -210, 110, 52, -14, -109, -108, 76, + -70, -123, -69, 43, -154, 83, 65, -38, -12, -26, + 12, 49, 94, -54, -60, -75, 32, 18, 96, 71, + 26, -49, -11, -42, 36, 31, -49, 38, -53, 24, + 12, 15, -23, -5, 30, -13 + }, + { + 78, -66, 54, -564, 120, -75, -225, 211, 44, -28, + -587, -385, 394, -195, -174, -582, -230, 462, -43, 643, + -332, -62, 138, 695, -1099, 373, 393, -127, 199, 18, + 870, -583, 402, -385, 275, -226, -142, -127, 40, -190, + -161, 126, 153, -309, 26, -79, -24, -250, 47, 93, + -173, -26, -17, -67, -133, -44, 101, -122, 207, 11, + -102, -67, -46, 130, -40, 64, -90, -26, 49, -35, + 108, 10, -5, 5, 74, 3, 60, 81, 0, -29, + 49, -24, 19, -47, -3, 12, -58, 33, 33, 73, + 4, -30, 13, 18, -30, 42 + }, + { + 46, 875, 785, -355, 435, -161, 166, 91, -266, 141, + 441, -958, 53, 237, 475, 124, -691, 964, -1014, 494, + 268, 32, 26, -55, 167, 291, 243, -2, 429, -66, + -305, 311, 23, -497, -142, 87, 50, -39, 90, 51, + -62, 125, 152, -125, 190, -201, 5, 22, -264, -144, + 90, -89, -11, -160, 143, -109, 86, -157, 11, -6, + -9, -142, 35, -74, -22, 70, -5, -62, 98, 62, + -6, -67, -12, -80, 4, 49, -57, -12, -43, -64, + 41, 82, -22, 60, 22, -9, -34, -19, -21, -7, + -18, -34, 4, -35, 28, 20 + }, + { + 2700, -4600, 715, 3388, -681, 329, 203, -194, 159, -162, + 127, 102, -156, -54, -375, 637, -345, -517, -399, 79, + 124, -159, 38, -386, -5, 306, 155, 203, -37, 66, + 618, -309, 73, -84, -50, -80, 92, 68, -180, 51, + -259, 66, -33, -196, 397, 353, 26, -80, -174, 49, + -159, 372, 155, -102, 21, -48, -94, 34, -175, 72, + 81, -25, 43, 109, -114, 16, -78, -92, 42, 58, + -15, 21, -37, -31, 3, -40, 35, 28, -9, 6, + -22, 17, -84, -26, 6, 82, 11, -46, 11, -1, + -41, -13, 8, -4, -26, 6 + }, + { + 21, -2016, 347, 291, -59, -22, -3, -47, 83, -8, + -508, -24, -383, -699, -591, 260, 186, 319, -1690, 738, + 230, 483, -76, -613, -170, -314, 1167, -899, -17, -166, + -157, 25, -127, 198, 1, -90, 135, 226, -243, -99, + 255, -207, 52, 36, -94, 139, 136, -129, 51, 207, + 68, -127, -43, 34, 37, -157, 18, -164, 21, 182, + 110, -143, 125, -99, 141, -92, 7, 86, 42, 115, + -132, 35, 33, 102, 9, 8, 58, 69, -14, -27, + 35, 50, 12, 63, 4, -18, -18, -1, 1, -1, + 50, 42, -22, -10, 19, -13 + }, + { + 3623, -3088, 372, -1220, -1157, -143, -100, -473, -202, 237, + -407, -500, 304, -277, 451, 478, -51, 123, 37, 446, + -222, -246, -49, -82, -357, -34, 127, -87, 219, -3, + -16, 163, -114, -108, -34, 102, 94, 222, 102, -167, + -259, -293, -48, -380, 153, 209, -437, -154, 84, -79, + -323, 138, -150, 223, -53, 140, 54, 101, -79, 23, + 48, -75, -89, 105, -110, -90, 65, -100, 2, -23, + -2, 48, -87, 62, -27, 40, -41, 27, -62, -30, + -9, 93, -35, 7, 34, 42, -33, 10, 4, 15, + -33, 36, 0, 7, 57, -9 + }, + { + -12, -522, 199, -198, 146, -7, -56, 224, 8, -47, + 137, 280, 128, 228, 55, -1094, 1276, 683, 199, -804, + 37, 655, 308, 5, 545, 976, -927, -333, -499, 937, + -54, -395, 103, 277, 77, -114, 188, 203, 26, -147, + -9, -186, -42, 76, 178, 313, -54, 233, -9, -39, + -144, -28, 178, -32, 23, 12, 95, -149, 215, -183, + -21, 147, 117, 74, 46, -3, 33, -43, 2, -106, + 87, 48, -8, -5, 80, -53, 11, -14, 31, -11, + -9, -15, 67, -26, -42, -7, 26, -39, -42, 7, + 6, -34, 43, 28, -14, 13 + }, + { + -1044, -13421, 2010, -2479, 411, -17, -775, 15, 361, 306, + -106, -210, 12, -123, 627, -882, -62, 583, 184, 544, + -187, -274, -401, 17, 51, -14, -28, -405, -194, -85, + -31, -156, 88, 180, 39, -147, -384, 49, 1, 23, + -249, 168, 181, -179, 309, -168, -61, 381, 56, 35, + -18, -346, 1, 101, -8, 59, 13, -132, 121, -53, + -167, 166, 12, 7, 108, 143, 30, -106, 98, -24, + -34, 93, 49, -62, -71, -117, -51, 12, -41, -29, + -6, -7, -60, -24, -40, 64, 2, -44, 50, -27, + -35, 23, -25, 20, -37, 38 + }, + { + 7, 343, -608, 249, -191, -2, -22, 12, 44, 98, + -223, 132, 124, 642, -1844, -1401, -10, 285, -591, 826, + 23, -43, -149, 153, -120, 334, 877, -602, 360, -172, + 334, 561, -359, -414, 538, -499, -243, 188, -129, 139, + 186, 94, 100, -193, -166, -5, 37, 16, -66, -123, + 38, 12, -118, -4, -58, -28, -36, -82, -42, 23, + 203, 10, 84, -35, 7, 18, -53, -96, 11, -190, + -61, -81, -16, 56, -3, -79, -9, -74, 10, 7, + -33, -27, 90, 23, 26, 63, 4, 39, 24, -7, + 39, -44, -17, -5, 34, -7 + }, + { + -1606, 1057, 1930, 274, -182, -605, 376, 711, -131, -51, + -347, 536, 218, -76, -290, -156, -111, -70, -618, 404, + 198, 48, 33, -526, 453, 54, -472, -281, 206, 252, + -519, 284, 9, 277, -450, -81, 31, -10, 161, 77, + -386, 49, -12, -316, 215, -66, -278, 34, 81, -64, + 292, -140, -47, -41, -38, 70, -171, 125, 22, -89, + 10, -164, -50, 55, 11, 21, 95, -27, 156, 0, + 48, 18, 70, -38, 92, -26, 8, -79, 15, 28, + 87, 18, -63, -19, 7, 3, 34, 37, -44, -1, + -49, 32, -34, 10, -18, 26 + }, + { + 159, -1098, 127, -108, -17, 97, -419, 103, 35, 489, + 253, -324, 291, -70, -159, 16, -223, 676, 4, -72, + 188, -158, -532, 100, 332, 10, -535, -337, -459, 761, + 613, -276, 12, -386, -1, -573, 286, -79, 152, -78, + -457, 234, -413, -56, 236, -254, 50, -61, 90, 75, + 41, -88, -82, 103, 154, -186, -30, -71, -32, 128, + 143, -182, -19, 122, 132, -150, -93, 22, 16, -27, + -37, 25, 57, 23, -39, -21, 2, 2, -9, 25, + -43, 49, -58, -34, -7, -6, 15, 7, 39, 4, + -14, 16, 8, -2, -1, 12 + }, + { + -3259, -3542, -1238, 185, 207, 689, 841, -405, -316, 279, + 509, 64, 119, -276, 371, 144, 119, -584, -737, 424, + 586, -136, 314, -15, 1094, -126, 887, -268, 135, -401, + 139, -50, -313, -279, 139, -50, -480, 195, -112, 177, + -199, 71, -460, -27, 167, -364, -210, 158, -147, -9, + 121, -118, 4, -33, -96, -73, 4, 88, -26, 14, + 97, -19, -54, -6, -26, 87, -114, 3, 63, -31, + 36, 93, 12, -73, -71, -27, 6, -25, 15, -48, + 56, 12, -11, 40, -79, -23, 24, -46, -43, 89, + -2, -33, 14, 28, -15, 14 + }, + { + -1, -2375, 295, -116, -65, -224, 0, -173, 35, -262, + 308, -380, -392, 456, 35, -1069, 562, -772, -73, 399, + -1921, 59, -520, -437, -329, -31, -527, -478, 608, 143, + 240, -84, 314, 60, -50, 183, 414, 120, 314, -50, + 121, -25, 317, 31, 67, -180, -236, -163, -11, -109, + 181, -65, 92, 42, -83, -84, -112, 6, 56, -87, + 58, 24, 70, -38, -76, -35, 45, -143, -1, -34, + -4, 4, -14, -18, -1, 40, -9, -126, -39, 74, + -8, -10, -26, 36, 49, -43, -27, 0, -39, 13, + 24, 16, -43, -39, 21, 7 + }, + { + -1412, 5510, -999, 1323, 403, 861, 414, -63, 175, -651, + 718, -1135, 245, -354, 639, -511, 322, -172, -509, -96, + -230, 278, -35, 98, 34, 50, -353, -128, 153, -437, + 217, 102, 38, -60, -15, -154, 234, -12, 219, -416, + -323, -23, 12, -81, 207, 262, 113, 27, -69, 21, + -5, 314, -28, -3, 230, -82, 45, 17, -155, 67, + -96, 92, -33, 68, 31, 12, -56, -1, 28, -147, + 214, 68, -44, -18, 1, -63, -78, 39, 54, 77, + 27, -28, -13, 39, -17, -92, 3, 29, 18, -50, + 20, 31, 11, 2, -20, 55 + }, + { + -251, -1899, 1057, 10, -85, 258, -448, 162, 125, 41, + 37, -117, 340, -184, 2678, -440, -281, 116, -356, 159, + -506, -58, -530, 25, 355, -283, -116, -266, 426, 358, + -398, 155, -83, -268, 113, 373, -92, 76, 89, -184, + 313, -50, 417, -183, -7, 175, -11, 4, 152, -74, + -1, -69, -101, 104, -66, -5, -135, -24, -61, 82, + -89, -65, 204, 8, -137, -132, 70, 5, 52, -4, + 46, 40, -21, 5, 29, 26, 48, -51, 15, -48, + -66, -63, 50, 49, 28, -18, 7, 19, -17, 0, + -30, 29, 29, -31, 29, -14 + } + }, + { + { + 328, 2976, 2124, 660, 153, 182, 109, -34, 27, -29, + -387, 268, -233, -474, -173, -904, -400, -198, -233, -38, + -186, 266, 319, 94, -221, -103, -156, 134, 77, 129, + 59, 290, 20, 79, 122, 74, 365, -105, -186, 80, + 202, -89, 117, -74, -66, 150, 71, 39, 8, 13, + -60, -80, 13, -23, 46, -32, 47, -128, 31, -26, + -169, -7, -45, 12, -45, -13, 52, 7, 16, -23, + -8, 39, 1, 42, -68, -16, 19, 24, 43, 43, + 14, 10, -59, -36, 17, 18, -41, 19, -35, 20, + 7, 10, -25, 17, 8, -8 + }, + { + -31, 535, -168, -84, -352, 51, -193, -1, 49, -115, + -247, -154, 82, -179, 24, -637, -81, 480, 794, -81, + -287, 106, -248, 151, 29, 87, -126, -19, 234, 283, + 325, -133, -8, 295, -579, 103, -320, -203, 160, -97, + -132, 16, -48, 90, -259, -77, -46, -74, -32, 96, + -90, -121, -26, -113, -16, -1, 41, -28, 86, -23, + -83, -15, -21, 9, 33, -64, 6, 19, -40, 15, + 71, -23, 106, 33, 31, 16, 25, 86, 6, -42, + -29, 53, 12, -59, 2, -18, -13, 30, 18, 40, + 17, -1, -13, 11, 0, 23 + }, + { + -5, 1540, 383, 658, -220, -60, 195, 174, -148, 48, + -15, -532, 61, 332, 26, 134, -217, 104, 93, -94, + 272, -426, 181, 129, -21, 65, 148, 185, 259, 7, + -184, 252, -92, -64, -258, -58, 68, 21, -14, 122, + 65, 79, 51, -49, -37, -31, -32, -170, -82, -160, + -35, 27, -17, -120, 120, -91, 56, -73, -19, -13, + -95, -65, -25, -28, -24, 10, 21, -19, 54, -2, + 74, -23, -69, -61, -26, -19, 45, -20, -34, -51, + -18, 61, 32, 46, 11, -12, -26, -32, -16, -26, + -5, -15, -6, 5, -5, 17 + }, + { + -1576, 2066, -83, 2739, 85, -43, 230, 114, 159, 73, + -157, 11, 139, -45, 410, 138, -90, -470, -270, 49, + 275, -346, -279, 25, -12, 244, -74, 230, -41, 79, + 392, -103, -77, -49, -2, 9, -15, 5, 14, -4, + -399, 138, -20, -167, 348, 261, 116, 42, -150, -133, + -34, 274, 75, 14, -60, -30, -78, -118, -24, 65, + 6, -62, 11, 118, -35, -68, -37, -96, 36, 20, + 5, -5, -20, -36, -9, -32, 21, -11, -11, -9, + 28, -5, -34, -35, 23, 56, -2, 13, -15, -10, + -45, 6, -36, 8, -36, -6 + }, + { + 14, -1619, 35, 119, 36, -5, -2, -157, -3, -1, + -303, -260, -444, -395, -173, 761, 107, -1739, -548, 501, + 375, 6, 198, -359, 10, 596, -429, -337, -94, 136, + -220, 12, -257, 56, 99, -56, -107, 209, -200, 24, + -15, -47, -89, 49, 14, 114, -62, 19, -65, 108, + -1, 33, -79, 38, -68, -29, 8, -141, 149, 164, + -52, -46, -1, 13, 30, 45, -82, 9, 15, 74, + 20, -41, 46, 37, 67, 22, 68, 14, -2, 5, + -14, 39, 32, 58, 8, -13, -10, -16, 13, 16, + 22, 24, 29, -1, -23, 0 + }, + { + -1979, 4432, -380, -1484, -104, -170, -251, -257, -149, -436, + -93, -204, -370, -50, 364, 332, 232, -98, 238, 52, + -349, -148, -13, -224, 44, -87, 32, -96, 65, -127, + -9, 350, -69, -6, -27, 153, -63, 152, 206, -115, + -276, -290, -130, -116, -126, 20, -86, -10, -151, -225, + -121, -183, 22, 116, 88, -34, 134, 126, 40, 11, + -4, -154, -44, -30, -48, -41, -27, -36, -29, 19, + 1, -16, -33, -11, 21, -21, -2, 47, -53, -27, + -29, 55, 4, 8, 16, 52, -20, -4, 36, -49, + -10, 11, 13, 45, 9, -1 + }, + { + 43, -114, -190, -140, 7, 24, -31, 104, 32, 35, + -1, 269, -89, -168, 18, 932, 411, 253, 285, -146, + -304, 132, 527, 227, 605, 394, -716, -213, -389, 708, + 98, -277, -349, 97, 359, 7, 165, 33, 212, -148, + -56, -116, -28, 104, 187, 233, -11, 217, 32, 44, + -200, -52, 198, 25, -18, 13, -23, 57, -20, -43, + 51, 134, 51, 90, 33, 78, -7, -67, -80, 11, + 24, 36, 5, 15, 6, -18, -7, 14, 11, -10, + -21, 21, 52, -35, -32, 1, 14, -47, -11, -2, + -25, 16, 12, 31, 14, 4 + }, + { + -627, -10607, -158, -1664, -393, -2, -497, -77, 283, 204, + -108, -136, 224, -136, 361, -427, -58, 185, 167, 395, + -49, -291, -379, -126, -67, 139, -224, -342, -276, 98, + -76, -92, -46, 119, 106, -309, -29, -193, -71, 67, + 11, -51, 159, -20, -62, 5, 73, 105, 153, -97, + -147, -51, -156, 123, -76, 119, -61, 34, -40, 27, + -55, 18, 71, 36, 63, 159, 23, -24, 9, -17, + 36, 2, 58, -23, -83, -88, -35, -20, -12, -7, + -32, -4, -49, -39, 7, 9, -23, -10, -4, 4, + 3, -7, -18, -7, 0, 17 + }, + { + 56, -134, -44, -201, -18, -4, 27, -42, 38, -8, + 67, -6, -124, -17, -446, -681, 39, -170, -316, 20, + 83, 518, 75, -225, 23, 507, 455, 346, -443, 126, + 467, 162, -37, -233, -20, -100, -216, -64, -9, -76, + 297, 132, -154, -220, -37, 53, 150, -12, -53, -128, + 33, 154, -170, 16, -48, -31, -68, -81, -44, 127, + 92, 82, 51, 1, 19, -12, -9, -59, -95, -81, + -108, -18, -25, -29, -41, -43, -2, -76, -7, -5, + 9, 9, 34, 51, 7, 44, 20, 53, 4, 3, + 4, -14, -25, 5, -6, 34 + }, + { + 1373, -1350, 1135, -162, 454, -535, -261, 441, 230, -214, + -175, 226, 632, -90, -6, -496, -79, 15, -557, 498, + 203, -75, -48, 31, -72, -213, -561, 117, 73, 250, + -569, 216, -7, 176, -116, -224, 61, 80, 134, -95, + -290, 2, 28, -299, -226, 151, -182, 113, 1, 43, + 35, 114, -49, -74, -46, 6, 10, 1, 57, -50, + -51, -44, -29, -14, 85, 40, -28, 74, 129, 31, + 13, -2, 70, -13, 40, 4, -38, 0, -30, 52, + 26, 44, -77, -24, -12, 0, 28, 17, -35, -16, + -22, 4, -10, 4, 13, -29 + }, + { + -160, -1091, 317, 183, -135, 69, -209, 0, -4, 279, + 139, 216, -73, 422, 91, -231, -162, 52, 532, 140, + -148, 11, -231, -223, 496, -368, -312, -534, -41, 392, + 815, -381, 63, -242, -326, -289, -1, 180, 232, -171, + -94, -137, -208, -67, 85, -76, -112, 117, 28, 135, + 11, -77, 28, 10, 89, -33, -117, -31, -33, 66, + 57, -102, 48, 95, 37, -31, -64, -24, 57, -42, + -36, -29, 36, 30, -7, -78, 6, -16, 22, 4, + 23, 4, -23, -15, -11, -27, 0, 28, 23, 3, + -5, 19, -14, 12, 2, 12 + }, + { + 1569, -10195, -655, -310, 26, 1468, 183, -608, -261, 325, + 353, 239, 6, -249, 19, 586, 127, -399, -724, 488, + 10, 297, 157, 526, 199, 297, 439, 87, 114, -286, + -33, -139, -75, 20, -157, -307, -156, 89, -22, 192, + -145, -3, -202, -334, 8, -90, -40, -79, -21, 9, + 20, 39, -132, 78, -179, -4, -58, 175, 37, 50, + -64, 90, -112, -24, -25, 88, 56, -98, 0, 7, + 94, 8, 6, -75, -50, -20, -21, -17, -26, 1, + -3, 31, -2, -6, 7, -45, 4, -24, -27, -1, + 31, -5, 12, 1, 10, 12 + }, + { + 72, -1757, -321, -120, 73, -191, 101, -223, 65, -159, + -54, -34, -266, 134, -776, -109, -168, -244, -168, -113, + -246, -1555, -185, -665, 105, -182, -399, -676, 387, 59, + -66, 303, 393, 224, 48, 389, 278, 120, 213, -93, + 21, 32, 184, -97, 131, -40, -370, -51, -57, -128, + 107, 47, 135, -42, -151, -16, -67, 25, 36, -25, + -43, 62, -33, 64, -33, -86, -24, -7, -53, -29, + 34, -15, 20, 4, 4, 4, -19, -56, -22, 10, + 35, 54, -33, 34, 9, -10, -19, -10, -11, -8, + 39, -11, -36, -14, -13, -16 + }, + { + 1840, 580, 264, 326, 413, 917, 32, 456, -22, -127, + -519, -112, 2, -212, 273, 240, -322, -240, -473, -81, + -433, 128, 21, 54, 129, 11, -502, 203, 8, 43, + 130, -34, 13, 216, -183, -24, 288, 87, -52, -293, + -77, -287, -44, 28, 111, 467, 121, -143, 124, -198, + 26, 243, 66, -21, 73, 43, 22, 6, -209, -24, + 69, -5, 60, 100, -23, 24, -19, -36, -27, 10, + 51, 61, 42, -4, -53, -6, -90, 25, 38, 40, + 49, -17, 8, -36, 36, -62, -7, 9, -6, 9, + 6, 2, 25, -1, 2, 26 + }, + { + 252, -1001, -203, -39, -94, 178, -192, 233, -8, 86, + 67, -158, -99, 671, 1220, 347, -151, -189, -493, -374, + 416, -232, -362, -148, -145, 49, -55, 232, 170, 126, + -127, -134, 62, -305, 39, 274, -82, -190, 225, -184, + 41, 138, 182, 200, -35, 48, 101, 44, 93, -63, + -40, 18, 1, -15, -48, -97, -54, -21, 32, -36, + -104, 36, 81, 27, -93, -24, 38, 63, 16, 44, + -13, 56, -11, 24, 1, 19, 26, -13, 18, -85, + -81, 25, 22, 17, -17, -25, 6, 27, 19, 4, + -2, 26, 4, 6, 0, -20 + } + }, + { + { + -220, 2131, 705, -729, -167, 39, -5, -150, -193, 291, + 356, 323, 26, -46, 313, -326, 193, 181, -116, 209, + 83, 212, 175, 97, -331, -141, -217, 71, 62, 65, + 19, 275, 38, 4, 15, -153, 312, 27, -52, 7, + 97, -26, 232, 42, -41, 195, 18, 46, -4, 71, + -32, -46, -3, 145, 56, -78, 66, -115, 38, 28, + -32, 112, 5, 13, 13, -24, 10, -24, 14, 31, + -21, -14, -19, 47, -41, -2, -13, -12, -26, 5, + -8, 29, -5, -8, 8, 19, -12, 24, -13, 25, + 6, -1, -28, 16, -6, -7 + }, + { + 11, 452, -102, 828, 160, 49, -92, -133, -73, 42, + -23, 40, 174, 171, 354, 56, 256, -91, -12, -218, + 24, 382, -72, -116, -201, -277, -507, -69, 313, 155, + 88, -69, -149, 549, -422, 250, -70, -156, 54, -50, + -120, -23, -55, 232, -82, -66, -96, 78, 7, 88, + -61, -174, -48, -60, 31, -80, 32, -25, 39, -33, + -19, -6, -39, -15, 25, -56, -6, 14, -41, -24, + -4, -18, 88, 5, 27, -3, -29, 12, -60, -9, + -2, 41, 6, -22, 4, -18, 23, 6, -31, 8, + -2, 12, 9, 4, -1, -1 + }, + { + 27, 668, -655, 1108, 252, 9, 50, 146, 1, -70, + 39, -19, -27, 142, -49, 340, -29, -56, 360, -274, + 64, -470, 130, -242, -347, -167, 10, -146, -306, -17, + -167, -47, -115, 93, 0, 116, -24, -66, -60, -53, + -27, 23, 43, 66, -23, 31, -55, -232, -74, -70, + -17, 50, 126, 29, 154, -80, 42, 118, 68, -48, + -69, 3, -5, -9, -63, -28, -3, -39, -1, 4, + 95, 34, 29, 9, 14, -12, 59, -21, -22, 7, + 0, -1, -5, 14, 16, 12, -13, -31, -8, -23, + -11, 0, 2, 10, -16, 8 + }, + { + 190, 4474, -608, 2426, 80, -136, 168, 315, 169, 44, + -124, 166, 488, 266, 358, -325, 17, -31, 351, 428, + 367, 46, 105, 158, 38, 380, -219, 208, -119, -128, + 191, -43, 37, 113, 109, 70, -200, 2, -41, 80, + 19, 235, -22, -74, 194, -48, 2, 109, 12, -35, + -112, 55, -11, 101, -19, 73, 30, -109, 34, 31, + -53, -63, -5, 58, -3, -67, -28, -24, 55, 20, + -5, -9, 7, -28, -1, -15, -9, -64, -11, 22, + 46, -9, -10, -13, 13, 8, -16, 24, -19, 10, + -13, 24, -38, 17, -12, 15 + }, + { + -75, -1453, -2, -99, 30, 2, 35, -71, -53, 123, + -99, -126, 27, 70, 139, 516, -430, -898, 582, 314, + 333, -353, -29, -136, -238, 377, -92, 267, -139, 316, + 252, 105, -97, -88, -30, 0, -190, 139, -127, 129, + -107, -94, -26, 114, -50, -16, -128, 61, 0, 122, + -14, 51, -52, 73, -46, 47, 56, -72, 113, 31, + -51, 59, -56, -6, 18, 67, -65, 19, 11, -20, + 51, -9, 5, -12, 59, -7, 14, -35, 1, 7, + -45, -3, -11, 7, 14, 31, 10, -4, 32, 22, + -2, -1, 42, 19, -27, 15 + }, + { + 5, 6761, -285, -772, -123, -5, 47, 194, -113, -452, + 6, 64, -22, 19, -14, 152, 38, -141, 295, -80, + -325, 167, 233, -272, 152, -71, -56, 61, 221, -65, + -168, 28, -344, -31, -12, 221, -46, -59, 57, 8, + -81, -49, 25, 136, -72, -20, 140, 158, -131, -37, + -40, -175, 122, 131, 180, -40, 28, 2, -42, 16, + 4, -174, 33, 53, 63, 56, -21, 21, -49, -16, + 6, -52, -52, -65, 0, -36, -34, 40, 8, 7, + -34, 36, 4, -5, -6, 29, -6, -15, 10, -60, + 13, 13, 3, 21, -21, 1 + }, + { + -10, 337, 414, -3, 30, 34, -53, -46, -4, 11, + -147, 107, -155, 134, -11, 1140, -41, -247, 585, 537, + -197, 96, 373, -393, -93, -539, -1151, 30, -199, 196, + -50, 151, -284, -293, 156, -109, -95, -32, 165, -231, + -84, -30, 128, 9, -86, 100, -75, 85, -70, 83, + -114, -4, 139, 93, -62, -79, -38, 181, 14, -58, + 36, 59, -39, 69, 37, 44, -35, -45, -22, 49, + 4, 6, 2, 27, -8, -26, 7, -4, -45, -19, + -26, -22, 22, -9, -6, -9, 24, -16, 13, 4, + -16, 24, -13, 17, 4, -4 + }, + { + 1652, -6953, -487, -1492, 220, 152, 16, 13, -21, 229, + 132, 210, 299, 5, 259, -279, 2, -220, -138, 209, + 50, 41, -152, -333, -99, 128, -75, 41, -56, 206, + 115, -12, -77, -24, 68, -163, 314, -27, -121, 119, + 80, -108, 100, 95, -96, 2, -39, -108, 83, -4, + 2, 139, -58, 123, -17, 142, -49, 26, -63, 71, + -41, -71, 99, 38, -27, 72, -24, -18, 2, -40, + 31, -25, 60, 29, -8, 8, -17, -16, 28, 48, + 2, 6, -29, -23, 0, -2, -12, 3, -24, 9, + 27, 1, 3, -7, -11, 9 + }, + { + -3, -152, 493, -191, 18, -4, 3, -59, 29, -59, + 141, 51, -110, 250, 160, 547, 503, -56, 20, 78, + -217, 107, 87, -415, 100, 521, -86, 301, -247, -15, + -160, -233, 395, -45, -213, 122, -104, -51, 115, -91, + 176, 105, -101, -22, 87, 29, 18, -11, 69, -37, + -10, 123, -102, 94, 49, -43, -31, 7, -45, 66, + 21, -33, -54, -10, -4, -70, -10, -23, -27, -6, + -47, 25, 1, 28, 0, -24, 7, -54, 27, -8, + 8, 4, 8, 0, -53, 19, -23, 22, -1, -1, + 1, 12, -13, 4, -21, 23 + }, + { + -1137, -3728, 1777, 351, 749, -162, -179, -123, -88, -152, + 135, 92, 386, -143, -20, -227, 203, 175, -642, 318, + -62, -73, -13, -104, -33, -15, -353, 406, 227, 104, + -585, 69, -98, 247, 3, -268, -5, -51, 93, -81, + -261, 73, 15, -139, -177, 72, -9, 217, -63, 16, + 15, 201, 64, 57, 48, 25, 31, -37, 59, 53, + 28, 12, -55, -57, 66, 3, -41, 0, 18, 71, + 9, -42, 31, -18, -21, -42, -20, 37, -46, 10, + -61, 27, -53, 5, -17, 11, 17, 4, -33, 17, + -4, 13, 2, -20, 16, -13 + }, + { + 110, -823, -114, -72, -191, 22, -187, -48, -54, -122, + -11, 190, -310, 41, 30, -8, -46, -127, 478, 12, + -202, 397, 302, 89, 288, -592, -105, -325, 112, 57, + 477, -184, 147, -210, -218, 34, 55, 79, 181, -147, + 95, 87, -23, 23, -14, -60, -9, 117, -120, -14, + -74, 27, 87, -47, -64, 11, -5, 24, -17, 111, + 77, -10, 46, 28, 8, 15, -28, 10, 70, -20, + -16, -33, 9, 14, 30, -36, 9, -43, 5, -7, + 9, -11, -8, 16, 12, -9, -18, -6, -7, -10, + 7, 27, -10, 11, -13, 0 + }, + { + 765, -10894, -233, -520, -458, 249, -922, -280, -125, 194, + 86, -279, -133, 27, -36, 656, 149, -200, -580, 123, + -251, 485, 33, 289, -463, -109, -46, 33, 245, -53, + 13, -149, 54, 60, -267, -254, 61, -84, -251, 58, + -197, 76, 148, -140, -56, 86, 168, -32, 29, 97, + -10, 39, -167, 116, -48, 55, -85, 93, -56, 8, + -51, 113, -80, -29, -38, 9, 26, -55, -35, -20, + 57, -78, -3, -19, -7, -37, 1, 17, 13, 37, + 11, 21, 13, 10, 26, -23, -20, -17, -30, -31, + 27, -7, 21, -3, 13, 12 + }, + { + -124, -1125, 369, -52, 140, 86, 406, -167, 26, -119, + 29, 313, 158, -513, -1138, 912, 320, 50, 64, -38, + 1081, -59, 644, -433, -344, -253, 118, -485, 49, 132, + 114, 6, -108, 209, -14, 161, 74, -73, 78, 26, + -3, -310, -23, -131, 67, 209, -183, 65, 68, -91, + 80, 16, 111, 91, -14, 27, 50, -26, -47, 32, + -90, 15, -43, 18, 2, -28, 23, 69, -40, -37, + 54, 11, 18, -4, -8, 12, 43, 7, -7, -19, + 3, 8, -17, 33, -8, 21, -10, 16, 14, -27, + 16, -1, -3, 4, -26, -13 + }, + { + -1379, -3663, 475, -285, 202, -85, -747, 241, -312, 116, + -357, -37, 45, -65, 420, 592, -173, 226, -345, -235, + -589, 34, -28, -93, 120, 134, -234, 412, 106, 222, + 73, 27, 91, 146, -145, -98, 47, -128, -168, -52, + 236, -272, -114, -11, -131, 111, 27, -207, 88, -136, + 34, 77, -39, 7, -7, -61, 59, 42, -118, 36, + 54, -57, 7, 30, -75, -5, -28, -20, -31, 38, + -18, 11, 30, 11, -60, 37, -38, 7, 24, -19, + -10, -23, -3, -69, 24, -18, 20, 7, -1, 27, + 7, 5, 30, 4, -8, -3 + }, + { + -275, -801, 393, 47, -161, 151, -114, 72, -245, -78, + -2, -58, -108, -139, -268, -27, 94, -89, -323, -515, + 145, -232, -259, 44, 5, 115, -153, 54, -209, -244, + -11, -195, 124, -162, -154, -149, 10, -180, 48, -128, + 53, 84, -77, -19, -86, 52, 81, -20, -59, -73, + 87, 71, -24, 21, -19, -40, 51, 72, 6, -101, + -60, 40, -7, 49, -8, 50, 57, 35, -51, 43, + -8, 31, -4, -37, -67, -24, 2, -14, 27, -6, + -34, -8, -16, 2, -2, -13, 0, -2, 13, 24, + 11, 10, -18, 13, 2, -10 + } + }, + { + { + 125, 2964, -1624, -709, 20, -58, -227, 174, -233, 182, + 571, 327, -145, -125, 493, -160, 177, 213, 184, -171, + 265, 53, 196, -225, 41, -129, -124, 59, 59, -27, + 6, 342, -75, 103, -209, -73, 114, 156, 107, 118, + -40, 112, 59, 113, -118, 196, 72, -51, 28, 69, + -106, -2, -6, 157, 37, -51, -8, -53, -42, 90, + 36, 80, 54, -37, 35, 8, -41, 38, -31, 41, + -20, -14, -7, 46, -29, -8, -22, -22, -22, -8, + 27, -3, 26, 0, -14, 28, 10, -14, 24, 17, + 12, 5, -23, 12, -15, 5 + }, + { + -54, 292, 85, 608, 237, -102, -7, -7, -46, 14, + -187, 316, -127, 354, 101, 239, 99, 147, -632, -13, + 118, 236, 405, -175, -538, -319, -406, 130, 162, 57, + 52, 159, -59, 136, -83, 0, 171, 5, -62, -92, + 10, -36, -17, 140, 50, -100, -111, 25, 95, -14, + -60, -146, -34, 3, 21, -136, 17, -6, 48, -22, + -27, 20, -76, -15, 30, -17, -38, 24, -14, -39, + -36, 14, 29, -10, 23, -29, 14, -36, -24, 12, + -5, -10, 20, 4, 2, 5, 24, -19, -12, -24, + 8, -8, 39, 7, -2, -15 + }, + { + -109, 258, -620, 374, 740, 147, -43, 82, -59, 12, + 24, 307, -266, 1, 333, 240, 144, -187, 8, -49, + 205, -347, -225, -311, -115, -87, 101, -181, -492, 35, + -214, -56, 218, -26, -119, 125, -75, -2, -95, -48, + -59, 58, 19, 124, 52, -16, -129, -57, -139, -42, + 57, -33, 114, 114, 42, -10, 61, 70, 56, -2, + -68, 50, -35, -22, -60, -13, -60, 5, -15, 56, + 17, 27, 74, -9, 27, 1, 16, -2, -6, 13, + 19, -6, -26, -2, 34, 10, -10, -14, -31, 2, + -23, 2, 3, 2, -6, -2 + }, + { + 856, 3552, -678, 2641, -166, 20, -7, 351, 25, 53, + -238, 428, 318, 188, 51, -283, 140, 18, 484, 189, + 245, 190, 184, 292, -78, 307, 92, -43, 12, -61, + 5, 129, -99, 103, 26, 89, -142, 103, -121, 4, + 266, 66, -12, 134, -138, 17, 98, 50, 97, -30, + -68, -35, -9, 112, 12, 15, 63, -40, -3, -15, + -56, 10, 21, -36, 56, -62, 0, 13, -13, 27, + -10, 23, 0, -7, -30, 24, -45, -53, 6, 30, + 7, 0, -10, 1, -7, -17, 18, -10, 1, 4, + 2, 6, 1, 5, -8, 12 + }, + { + 127, -1334, -349, -111, 116, -38, -39, 87, -18, 14, + 22, -127, 164, 197, 189, -207, -712, 1209, 473, -187, + 196, -623, -98, 158, -126, -268, 441, 19, 129, 259, + 309, -117, 213, -254, -243, 59, 103, -29, -210, 211, + -121, -121, 104, 15, 25, -64, -119, 120, 32, 67, + 60, 33, 17, -24, -25, 18, 34, 50, 27, 7, + -15, 92, -88, 5, 66, -26, 19, 3, 29, -56, + 71, -9, -21, 5, 13, 4, 10, -15, -5, -7, + -27, -24, -10, 0, 31, 36, 6, 6, 11, 26, + -13, 5, 41, 11, -9, 33 + }, + { + 1406, 4550, -666, -879, 670, -16, -10, 279, -293, 98, + -138, 196, -44, 70, 73, 21, 66, -100, 264, 30, + -103, 110, 33, -75, 76, -82, -49, -15, 209, 206, + -217, -112, -290, 43, -107, 151, -70, -19, 109, -120, + -108, 133, -97, 93, 94, 6, 149, 105, -92, 12, + -214, 64, 118, 58, 220, 46, -33, 0, -47, -16, + -22, -50, 59, 49, 31, 53, -19, -8, -35, -43, + 71, -68, -61, -40, -34, -21, -28, 21, 25, -11, + -14, 17, -5, 10, 4, 4, 0, -4, -20, 6, + 1, 8, 2, -4, 1, 11 + }, + { + -17, 943, 69, -90, 51, 21, -71, -35, 32, -6, + -88, 122, -135, -46, 445, 509, -313, -320, 717, 692, + 13, -51, 39, -756, 10, -293, -655, -748, 185, -154, + 25, 297, -346, -65, 260, -140, -233, 38, 167, -98, + -145, -134, 144, -6, -118, 96, -62, -14, -9, 104, + -67, 19, 12, 80, -35, 28, -44, 91, 30, -36, + 4, 12, 42, -14, 17, 0, 23, -10, -24, 6, + 7, 32, -14, 22, 32, -36, 31, -8, -44, -30, + -13, -29, 14, -4, 4, -5, 4, -12, 14, -1, + 1, -9, -2, 4, 6, -4 + }, + { + -1853, -3062, 543, -1504, -223, 65, 169, 256, -209, 256, + -6, 383, -138, 262, 109, -286, 191, -465, 90, 117, + 163, 0, -51, -331, -124, -24, 24, 50, 148, 118, + 115, 33, 46, 5, -11, -110, 349, -65, 89, -101, + 89, -40, -8, 61, 53, -79, -102, -118, 88, 17, + 113, -10, 81, 42, 42, 83, 11, 38, 18, -30, + -32, -24, 70, 46, -17, 7, -32, 12, 17, -70, + 2, 13, 22, 46, 12, 5, -20, 15, 12, 54, + 14, -9, 7, 0, -32, 2, 21, -18, -13, 22, + 18, -3, 5, 17, -23, -14 + }, + { + -48, 222, 342, -65, -21, -28, -90, 53, 43, -81, + 75, 88, -153, 107, 116, 1433, -847, 289, 229, 36, + 1, -108, -185, 35, 30, -231, 213, 411, -9, -71, + -428, -6, 303, 16, 43, 66, -138, -124, 107, 60, + -43, 100, -38, 129, -54, 25, -117, 10, 164, 4, + -88, 49, 4, 10, 130, -48, -77, 105, 25, -21, + -29, -96, -62, -30, 28, -100, -10, -24, 35, -33, + -9, 9, 6, 13, 3, 18, -32, -13, 17, -11, + -5, -15, 20, -12, -35, 2, -4, -10, 12, -4, + -5, 4, 1, -9, -2, -5 + }, + { + 987, -4618, -295, 715, 23, 466, 242, -214, -251, 17, + 237, 97, -276, -33, 39, -44, 68, 373, -562, -24, + 67, 15, -114, -293, 170, -62, 41, 227, 213, -130, + -116, -35, -87, 161, -109, -117, -81, -225, 209, 77, + -253, 119, -56, -155, 8, -93, 121, 29, 55, -4, + 12, 123, 124, 59, 7, 79, 6, -13, -1, 56, + 78, 5, -57, -17, -38, 46, 28, -29, -54, 91, + 4, 9, -29, -24, -2, -36, 8, -2, -15, -33, + -29, 12, 4, -24, -2, 35, -15, 15, 7, -2, + -8, 13, -8, -16, -5, 24 + }, + { + -34, -720, -259, -189, 29, -39, -69, 33, 2, -291, + 14, -306, 256, -105, 104, -251, -50, -163, 346, -303, + 279, 96, 559, 318, -173, -441, -159, -38, 114, 54, + 35, 285, -85, -167, -111, 97, 56, -97, 78, 61, + -37, 109, 38, 124, -178, 35, 84, 16, -93, -18, + -140, 25, 38, 24, -89, 32, -3, 6, 9, 99, + 93, 53, 13, -25, -2, 27, 8, 15, 8, -10, + -20, -8, 12, 46, 4, -10, 11, -38, -14, -14, + 4, -31, 19, 0, 33, 8, -45, -18, -10, -10, + -3, 20, 15, 9, -7, -8 + }, + { + -2529, -6279, -98, -211, -848, -1255, 99, 146, -272, 282, + -262, -70, -398, 520, -149, 282, -123, 80, -397, -366, + 189, 454, 23, 112, -184, -338, -133, 158, 183, -44, + -60, -185, 24, -4, -259, 42, -99, -160, -203, -13, + 15, -216, 214, 10, 6, 38, 61, 42, 102, 74, + 8, -39, -56, 29, -19, 37, -17, -36, -59, -9, + 30, -23, 60, -25, -24, 7, -50, -2, -24, -20, + 2, -48, -36, 31, 9, -42, 20, 3, 14, 23, + 43, 11, -7, 20, 14, -3, -17, -22, -20, -14, + 0, 0, 20, 4, 7, 8 + }, + { + 139, -561, -483, 117, 267, 174, 215, -219, 1, -35, + 69, 299, 148, -189, -769, 420, 508, -61, 357, -79, + 219, 1385, 434, 291, -795, -474, 335, -96, -432, 332, + -75, 19, -80, 88, 10, 89, 41, -50, -130, 135, + 57, -235, -58, -86, -59, 199, 33, -31, 29, -19, + 38, 79, -16, 51, 118, 19, 16, -27, -60, 3, + -29, -31, 21, -43, 22, -29, -18, 21, 38, -37, + 15, 29, 22, 13, -9, 18, 28, 21, -1, -32, + 4, -27, 31, 16, -6, 21, -35, 22, 10, -3, + -19, 5, 12, 3, -14, -7 + }, + { + 315, -5565, -88, -355, 290, -578, -205, 76, -145, -55, + -20, -294, -86, 621, -52, 264, -98, 678, -638, -68, + -244, -128, -102, 95, -103, 15, 114, 132, 190, 138, + 83, 98, 64, -77, 51, -66, -158, -144, -52, 69, + 21, 109, -248, -129, -37, -185, -54, -15, -2, 21, + -25, 93, -90, 76, -31, -60, 134, -30, -1, -8, + 38, -11, -25, -3, -61, -61, 3, -40, -15, 35, + -25, -4, 54, -28, -31, 16, 19, -15, 15, -8, + -25, -6, -19, -57, 1, 17, 2, 9, 5, -2, + 23, 18, 8, -6, 10, -7 + }, + { + 272, -822, -279, 304, -212, -56, 81, -120, -109, -199, + -27, -158, -85, 6, -66, -161, 200, -290, -283, -505, + 77, -409, 111, 131, 7, -152, 50, 77, -595, -131, + 75, -109, 149, -216, -171, -130, 194, -122, -33, -154, + 185, 67, -25, -134, -49, 16, 46, -22, -103, -72, + 40, 145, -46, -25, -34, 84, 98, -59, 59, -55, + -68, 61, -2, 34, -19, 83, -54, 32, -23, 13, + 38, -17, 43, -52, -24, -70, 11, -8, 7, 16, + -24, -19, -46, 5, 26, 3, -16, 2, 3, 19, + 6, 11, -12, 10, -22, 8 + } + }, + { + { + -132, 2349, -1003, 433, 676, 87, -38, 568, -32, -82, + 139, 191, -231, -165, 479, -130, -95, 83, 147, -306, + 169, -27, 190, -318, 334, -9, 47, 246, 114, 40, + 84, 152, -367, 22, -293, -36, 50, 53, 178, 141, + 10, 99, -180, 101, -52, 90, 101, -3, -14, 47, + -87, 55, 97, 52, 35, 69, 40, 4, -45, 51, + 0, 16, 12, -32, 33, 62, 19, 69, 17, 44, + -48, 7, -22, -2, -15, 33, -8, -28, -7, -25, + 26, -7, 20, -5, -17, 23, -1, -17, 14, 5, + 8, 13, -11, 12, -2, 18 + }, + { + 75, 137, -114, -613, -747, 0, 142, 267, 133, -49, + -408, 22, -110, 264, -39, 62, -515, -93, -280, 339, + 54, -104, 118, -200, -217, -45, -420, -24, 1, 1, + -7, 197, -205, -206, 243, 20, 127, 217, 70, -22, + 104, -8, -1, -97, -103, -76, -95, -91, 70, 68, + 17, -13, 57, 13, 43, -17, 69, -8, 52, 16, + -37, -6, -33, 1, -37, -50, -37, 15, 2, -20, + -21, -8, -9, -57, -11, -42, 29, -16, 19, 1, + -14, -18, 9, -13, -9, -9, -17, -28, 6, -18, + 15, -14, 18, -8, -6, -10 + }, + { + 217, 796, -600, -1755, -756, 148, -110, 32, -121, 127, + 284, 582, 10, 46, 146, 17, 68, -330, -369, 116, + 400, 60, 50, 65, 295, -114, 225, 154, -87, 53, + -189, 201, 329, 88, -37, 45, -188, 17, -10, 88, + 44, 112, -38, 11, 23, -11, 3, 67, -56, 1, + 117, -90, -7, 35, 4, -61, 0, -16, -1, -42, + -133, 0, -18, -4, -24, 15, -67, 6, -69, 24, + -4, -16, 38, -47, -18, -9, 5, -15, -12, -7, + 7, 10, -22, -4, 12, -11, -15, 9, -21, -1, + -3, 1, -10, 2, 2, 2 + }, + { + -1140, -96, -969, 3140, -115, -37, -12, 212, -147, 72, + -343, 221, 75, -83, -256, -411, 72, -116, 353, -67, + -73, -7, 74, 9, -263, 146, 147, -90, 29, -98, + -58, 87, -241, 53, 2, 80, -31, 78, -111, 30, + 199, -95, -146, 101, -81, 2, 61, 97, 93, 44, + 74, -2, -116, -38, -22, -62, 5, 32, 6, -15, + -26, 47, 102, -21, 12, -19, 42, -6, -17, -10, + -68, 2, 8, -7, -44, 41, -4, 4, 21, 4, + -37, -10, -13, 5, 5, -8, 27, -27, 10, -1, + -15, -3, 7, 13, -7, 10 + }, + { + -144, -926, 440, -123, -22, -56, -34, 220, 166, -40, + 54, -109, 151, 497, 504, 63, 115, 1505, -237, -415, + 196, -499, -210, 86, -31, -651, 27, -187, 125, 123, + 245, -280, 185, -164, -470, -208, 212, 33, -167, 140, + -172, -101, 57, -102, -26, -79, -48, 133, 61, 92, + 6, -40, 4, -67, -21, -17, -33, -42, -13, 57, + -28, 47, -21, 3, 13, -77, 37, 0, 51, -14, + 27, 21, 4, -13, -18, -27, -19, -10, -14, -2, + 7, -11, -1, 3, 4, -5, -6, 16, -8, 9, + 0, -3, 11, 0, 1, 28 + }, + { + -1652, 407, 274, -1392, -253, 117, -17, 128, 3, 252, + -202, 260, 1, -94, 9, 80, 171, -13, 229, 122, + 294, 148, -201, -107, 40, 0, 43, -140, 82, 164, + -101, 28, 21, 157, -231, 30, -49, 101, 218, -147, + -249, 69, -47, 48, 106, -8, -74, -68, -6, 14, + -179, 182, 82, -48, 95, 88, 4, 53, 19, 30, + 49, -13, 18, 0, -24, -17, -69, -33, -3, -51, + 61, -23, -34, 4, -27, -18, -38, 28, 37, 7, + -7, 18, 3, 17, 15, -3, 1, 23, -18, 29, + 16, 23, 7, -7, 11, 19 + }, + { + -7, 745, -291, -55, 63, 3, -28, -11, -45, 109, + 19, 38, 26, -130, 92, -628, -726, -188, 114, 248, + 346, -44, -26, -933, -141, 72, 295, -345, 305, 223, + 67, 354, 176, 316, 211, -196, -20, 58, 61, -58, + -5, -120, 96, -4, -8, 126, -74, -35, -10, 126, + -31, -30, -76, 22, 31, 30, -58, -5, -49, -37, + -19, -31, 42, -81, -69, 1, 102, -7, -57, 15, + 25, 48, -14, 6, 41, -25, 22, -9, -40, -8, + 17, -6, 23, 4, 16, -13, 2, -4, 6, -4, + 1, -18, 5, -3, -2, 3 + }, + { + 1246, -15, -599, -1019, 431, -9, -13, 209, -227, 139, + -40, 95, -652, -87, 277, -163, 313, -150, 330, -95, + -248, -71, 2, -220, -6, 69, 108, 16, -84, 42, + 206, 206, 96, 99, 54, -265, 107, -227, 41, -209, + -5, -105, -5, 65, 179, -63, -49, -61, -11, -118, + 15, -123, -10, -20, 15, 22, -21, 69, 22, -33, + -11, -52, 20, 22, -29, -22, -36, 22, 16, -38, + 15, 14, 22, 48, 8, -6, -21, 27, -3, 0, + -8, -5, 23, 42, 3, 17, 46, -7, 1, 8, + 8, 20, 9, 12, -7, -8 + }, + { + -4, 238, 90, 164, 58, -4, -44, 78, 23, -114, + -109, 10, -225, 109, 117, 1247, -692, 330, 174, -182, + -289, -151, -373, -33, 17, -321, 162, 195, 245, 3, + -313, 476, 169, 44, 346, 26, -90, -10, -22, -76, + -128, 44, -77, 42, -136, 25, -28, -52, 19, -59, + -69, 68, 44, 7, 101, -14, -76, 41, 21, 1, + -54, -64, -10, -24, 63, -47, 35, 22, 46, -47, + -17, -48, -8, -5, -65, -9, -33, -17, 9, -13, + -11, -18, 24, 5, -13, 12, -9, -31, -8, -12, + 0, -10, -7, -20, -6, 3 + }, + { + -942, -6081, 593, 578, -1002, 336, 833, 18, -17, 185, + 44, -200, -583, -147, 248, -180, -259, 313, -488, -224, + 207, 254, -95, -315, 247, 162, 216, 182, 36, -81, + 8, -157, -91, 173, -118, 68, 192, -156, 183, 76, + -162, 179, -76, -35, 168, -252, -126, -93, 43, -61, + -9, 31, 34, -46, -56, 92, -21, 75, 51, -36, + 78, 36, -19, 60, -60, 89, 79, -25, -39, -3, + -29, 45, -21, -15, 32, 22, 36, -12, 9, -18, + 24, 7, 11, -7, 28, 16, -39, 24, 30, 7, + 3, 3, -2, 9, -4, 14 + }, + { + -16, -1096, -200, 36, -40, 246, 113, 74, 86, -78, + 175, -451, 174, -293, 9, 51, 25, -157, 83, -651, + 28, -333, 133, -84, -116, -293, -161, 136, 127, 5, + -149, 145, -91, 28, 3, 47, 83, -167, 77, 175, + -88, -17, -27, 131, -136, 102, 68, -63, -140, 22, + -72, -86, -59, 79, -13, -39, -27, -10, -61, 16, + 72, 54, 15, -47, -21, -22, 16, -5, -28, 11, + 14, 12, 20, 49, 7, -14, -4, -16, 9, 9, + 4, -29, 12, -8, 34, 9, -26, -16, -10, -11, + -31, 4, 10, -9, -6, -2 + }, + { + 2949, 1111, -134, -189, -376, -691, 415, 277, -127, 378, + -163, 100, -432, 178, -430, -211, -392, 8, -354, 32, + 481, 156, -48, 112, 191, -186, -138, -51, 4, -121, + -84, -237, 28, -24, -187, 198, -4, 88, -166, -77, + 47, -253, 215, 59, 101, -44, 12, 90, 35, -77, + -41, -76, -155, -50, -1, -23, 0, 20, -35, -24, + 9, -55, 73, 34, 34, 55, -30, 14, 15, 10, + 3, 5, 1, 30, 1, -34, 28, 4, -4, 5, + 15, 1, -30, 2, -8, -17, 12, -7, 16, 26, + -9, -13, 8, 0, 4, 12 + }, + { + -118, 355, 527, -9, 56, -11, 125, -296, -66, 43, + -23, 13, 42, 418, -208, 204, 174, -344, 226, -32, + -582, 788, 533, 768, 37, -335, 71, 211, -279, 192, + -158, -62, -178, 53, 104, -35, -94, -10, -98, 1, + 10, -54, 104, 27, -81, 69, 105, -70, -28, 36, + 30, 2, -98, -10, 79, -21, -55, 14, 57, -2, + 3, 23, 29, -32, -33, -47, -1, 16, 37, -59, + -45, 13, -13, 6, 5, 3, -6, 7, 16, -23, + 22, -1, 30, 14, -14, 25, -12, 8, 3, 7, + -13, 19, 17, 23, 9, -3 + }, + { + 800, -4845, -351, -122, 764, 119, 462, 275, -130, -80, + 144, -256, -160, -33, -1167, 5, 94, 841, -538, 274, + 182, -60, -53, 208, -174, 128, 226, -71, 122, -105, + -171, -29, 28, -58, 48, 49, 177, 152, 160, 109, + -142, 118, -216, -82, 137, -17, -23, 79, -22, -3, + -75, 126, -45, 34, -3, -43, 186, 73, 56, -13, + 5, 15, -27, 29, 22, -60, -21, -30, 8, 47, + 19, -30, 57, -7, 3, 9, 20, -17, 24, 29, + 12, 26, -4, -18, 7, -14, -19, 9, 23, -6, + 8, -6, -8, -13, 9, 0 + }, + { + -215, -665, 382, 487, -35, -25, 216, -95, 35, -59, + 34, -178, -83, 871, 704, -709, -119, -220, -89, -108, + 551, 69, 490, 229, 251, -49, 41, 261, -274, 74, + 121, -40, 12, -182, 120, 174, 221, -31, 171, -19, + 138, -46, 46, -71, -37, -53, -55, -75, -37, -49, + -18, 92, -38, -19, -3, 113, 86, -58, 97, -19, + -93, 42, 65, 56, -33, -9, -134, -3, -25, 48, + 60, -27, 6, -33, 31, -34, 42, -14, -20, 16, + -11, 0, -18, 18, 18, 15, -13, -1, -8, -7, + -27, 0, -5, 21, -17, 22 + } + }, + { + { + 32, 99, 2177, 1019, -30, 111, -2, 432, 55, 63, + -10, 201, -442, 338, -69, 119, -142, -104, 222, -121, + -288, 39, 297, -314, 408, -53, 53, 39, 110, 184, + 144, 19, -235, -160, -150, -104, 110, -19, 232, 0, + 107, 139, -214, 11, 116, 33, 41, 54, -28, -37, + 62, 53, 131, -54, 90, 127, -17, -8, -56, 51, + 5, -15, -9, 4, 20, 62, 5, 61, 66, -5, + -30, -6, -19, 0, 3, -1, 19, -27, -5, -43, + 21, -16, -3, 1, -1, 12, -7, -8, -2, -7, + 10, 19, 5, 2, 15, 0 + }, + { + 2, -672, 809, -1133, -383, -5, 173, 90, 328, -150, + -286, -94, 97, 195, -168, 194, -702, -198, 51, 352, + 33, -291, -6, -267, 69, -159, -478, -12, -179, 200, + 59, -66, -88, -194, 220, 9, -5, 225, 86, 45, + 126, -14, -55, -140, -4, -70, -123, -21, -2, 92, + -30, 11, 80, 7, 83, -28, 102, -30, 47, 51, + -58, -25, -33, 20, -65, -82, 8, 17, -7, 6, + 25, -64, -2, -20, -35, -9, 27, -30, 11, -4, + -8, -21, 10, -29, -10, -15, -13, -11, -18, -2, + 7, 6, -14, -8, 0, -7 + }, + { + -281, 1506, -304, -2509, -214, -87, 29, 152, 1, -89, + 60, 766, 211, 152, 4, -251, -1, -70, -264, 33, + -18, 553, -242, 526, 91, -297, 442, 107, 62, -36, + 23, 103, 311, 235, -107, -75, -63, -37, -1, 61, + -3, 98, 108, -157, 4, -51, 83, 11, 65, 4, + 70, -72, -62, -13, 56, -20, -57, -40, -28, -23, + -115, -30, -40, -2, 54, -26, -75, 39, -75, 2, + -5, -22, 2, -19, -19, -16, 9, -31, 12, -33, + 6, 2, -10, 17, -25, -6, -16, 10, -11, -15, + 7, -7, -3, 4, 15, -2 + }, + { + 626, -4612, 608, 3050, 9, -49, 139, -105, -48, 117, + 69, -108, -219, -10, -8, -122, 139, -248, 117, -71, + 84, -183, -80, 29, -106, -106, 125, 44, -106, -156, + -135, 139, -156, 57, -24, 39, 87, -6, -15, 39, + 144, -131, -18, -40, -91, 54, 130, 45, -19, 80, + 98, 35, -168, -57, -65, -41, 24, 19, 27, -19, + 1, 2, 64, -17, -2, 24, 1, -17, 5, -39, + -42, 6, 3, -3, -25, 10, 30, 17, 1, -22, + -18, -13, 3, 7, 12, -4, 22, -13, -4, -2, + -18, 2, 2, 8, -4, 2 + }, + { + 138, -433, -98, -159, -43, -21, 77, 49, 220, -18, + -231, 178, 209, 100, 636, 408, 548, -210, -67, -212, + 32, -72, -651, 328, -241, -455, 19, -89, 151, 115, + 101, -58, -97, -102, -268, -219, 99, 54, -82, -95, + -109, -88, 36, -64, -10, -104, -24, 10, 146, 37, + -34, -37, 45, -59, -11, -36, -51, -35, 43, -1, + -11, -27, 42, -40, -22, 12, 0, 17, -15, 38, + -43, 59, 10, -21, -4, -13, -31, -10, -32, -6, + 25, 5, -17, 15, -4, -9, -8, 23, -8, -17, + 4, 8, 2, 5, 1, 7 + }, + { + 786, -2970, 187, -2098, 489, 94, 157, -165, 89, -101, + 198, 66, 339, -384, -29, -30, 125, 75, 268, -173, + 505, 111, -234, -14, -12, -59, 38, 2, -46, -123, + 86, 156, 143, 25, -170, 39, -1, -10, 207, -37, + -245, -63, -22, 62, 27, 73, -197, -90, 67, -37, + -26, 91, -11, -35, 52, 123, 5, 14, 35, 8, + 69, -14, -6, -55, -1, -4, -83, -36, 18, -43, + 32, 49, -88, 24, 7, -48, -24, 22, 37, 12, + -6, 27, -3, 17, 25, -12, 1, 22, -15, 28, + 14, 11, 10, -8, 15, 14 + }, + { + 16, 202, 6, 28, -38, 15, -27, 71, -72, 22, + 105, 12, 36, -242, -110, -506, -398, -398, 532, -449, + 536, -416, -252, 26, -64, 108, 6, -54, 128, 294, + 123, 124, 519, 177, 29, -158, 238, -24, 23, -167, + 73, 16, -40, -66, 88, 57, 31, -53, -12, 93, + -6, -95, -61, 52, 37, -22, 10, -69, -84, 9, + 23, -46, 1, -47, -50, -3, 46, -21, -10, 32, + 32, -15, 15, -9, -6, 24, -19, -1, -19, -10, + 2, 32, 8, -4, 9, -9, 8, -2, 9, 6, + -10, -8, 0, 11, -2, 3 + }, + { + -83, 644, 597, 66, -708, 111, 27, 19, -106, 52, + -58, -106, -174, -327, 396, -208, 283, 57, 192, -49, + -544, 109, -50, -141, 18, -45, 95, 23, -136, 210, + 120, 140, -25, 141, 75, -199, -58, -124, 0, -110, + -152, -113, 139, 50, 51, 4, 29, -12, -133, -132, + -62, -17, -120, -6, -20, 17, 1, 83, -15, -4, + -45, -51, 3, 23, -13, -13, -38, 47, -40, -14, + 38, 6, 1, 56, 2, -15, -29, 15, 33, -38, + 0, -8, 19, 10, 44, -11, 32, 27, 4, -4, + 12, 7, 4, 9, -9, 7 + }, + { + 44, -173, 238, 130, 104, 30, 5, -56, 112, 51, + -268, -60, -228, 203, 293, 440, 809, -279, 278, -374, + -455, 171, -166, -424, 82, -18, 21, -3, 257, 59, + -188, 562, -139, 118, 415, -140, -10, 16, 53, -179, + -75, -132, 41, 36, -172, -35, 128, -22, -85, -58, + 5, 6, 100, -9, 27, 11, -21, -76, 24, 69, + -37, -31, 26, 18, 27, -35, 50, 50, -5, -50, + 11, -79, -12, -27, -64, 10, -14, -35, -21, 6, + -4, 12, 14, -7, 10, -6, -5, -23, -18, -11, + 15, -14, -14, -12, -29, 22 + }, + { + 937, -6792, -1092, 797, -1079, 494, 252, -44, 314, -270, + 47, -261, -142, -364, 569, -344, -223, 125, -229, -172, + 107, 259, -95, -220, 36, 127, 189, 185, -54, -63, + 97, -223, -126, 134, 12, 150, 204, -78, 83, -48, + 83, -48, 0, 131, -30, -136, -163, -80, 52, 22, + -70, -38, -44, -23, 24, 17, -8, 83, 78, 40, + 5, 18, 30, 47, -55, 94, 37, -15, -13, -65, + 5, 46, -17, 12, 41, 22, -13, 20, 11, 0, + 28, -10, 14, 6, 16, -15, -31, 16, 14, -5, + 27, 3, 7, 1, 11, -13 + }, + { + 39, -1623, -157, 617, -196, 78, 345, -16, 6, 67, + 48, -187, -194, 230, -323, 381, -60, -222, -392, -124, + -269, 96, -207, -493, 154, -141, -189, 272, 38, -173, + 138, -73, -180, -4, 87, -67, 57, -17, 22, 157, + -40, -92, -26, 28, 60, 12, 30, -89, -44, -66, + -33, -89, 0, 41, -25, -33, -47, -11, -19, -11, + 30, -22, 54, -17, -16, -8, -21, -19, 0, -9, + 12, 20, 4, 51, -8, 11, -30, 10, -1, 31, + 7, -18, -12, 4, 10, 5, -1, -19, -13, -4, + -30, 6, 5, -16, -2, 3 + }, + { + -2001, 7419, 142, 86, -388, -143, 289, -93, 9, 348, + -3, 8, 18, -588, -195, -209, -61, -310, -311, 287, + 338, -169, 177, 7, 306, -86, -180, 91, -293, 80, + -265, -30, 11, -205, -138, 195, 165, 13, -22, -86, + -117, -43, 141, -168, 183, 75, 30, -20, 80, -97, + -40, -70, -133, -9, -62, -29, -72, 129, -77, -4, + -33, -43, 80, 13, 65, 32, 21, -39, 39, 14, + 0, 19, 28, -8, -43, 38, 7, 17, -18, 17, + -41, 14, -18, -4, -18, -13, 10, -3, 31, 5, + -14, 1, -5, -1, 4, 15 + }, + { + 87, 976, 84, -100, 66, -155, 384, -439, -90, 93, + -89, 162, 31, 384, -285, 110, -159, -87, -171, 84, + -134, -13, 437, 426, 493, -58, -105, -37, 147, -327, + 150, -156, 65, -129, 152, -40, -136, -113, 192, -108, + -117, 106, -17, 30, -66, 42, 138, -136, -16, 106, + -42, -51, 44, -28, 16, -13, -43, 24, 36, -22, + 62, 1, 5, 49, -75, 6, -38, 15, 4, -18, + -72, 48, -43, 3, 21, -23, -26, 2, 31, -1, + 6, 39, 3, 12, -9, 30, -8, 2, 4, 6, + 5, 13, 3, 28, 12, -8 + }, + { + -1406, -1585, -146, 607, -197, 453, 325, 125, -180, 126, + 2, -169, -303, -100, -1336, 312, 289, 362, -130, 120, + 125, -101, 207, 29, -17, 153, 200, -176, -21, -81, + -60, -46, -38, 184, -82, 221, 172, 223, 13, 38, + -104, -167, 52, 105, -15, 105, 73, -60, 33, -23, + -38, 18, -20, 15, 6, -3, 135, 92, 30, -52, + 42, 5, -5, 41, 12, -24, -22, -8, 17, 11, + 28, -36, 10, 15, 35, 11, -2, -2, -14, 40, + 22, 56, 0, -6, 12, -29, -11, -12, 19, 18, + 5, -15, -14, 3, 0, -6 + }, + { + 158, 102, -516, 308, 247, -214, 281, -66, -22, 80, + 102, -156, -169, 319, 952, -429, -397, 119, -28, 128, + 428, 259, 321, 116, 214, -56, 19, 120, -104, 111, + 102, 8, -128, -5, 167, 364, -37, 86, 133, 66, + -48, -68, -26, 100, -73, -53, -110, -35, 36, -71, + -1, 30, -8, -5, 58, 80, 36, 16, 5, -79, + 1, 9, 65, 35, 1, -96, -2, -18, 7, 43, + 11, -13, -28, 1, 3, 7, 15, 8, -21, -14, + -5, 19, 7, 3, -9, 15, 1, -15, 17, -9, + -30, -7, -1, 15, 2, 23 + } + }, + { + { + 208, 2378, 3162, 1472, 316, -40, -42, 295, -107, -99, + -176, -6, -473, 398, 45, 594, 282, -223, -96, -110, + -384, -48, 189, -60, 280, -297, -108, -90, -80, -8, + 19, 148, 71, -110, -57, -235, 178, 19, -32, -119, + 115, 127, -103, 39, 139, 98, 47, 26, 2, -32, + -3, 7, 77, -93, 16, 95, -40, 16, -43, 45, + 11, -16, 21, 9, -41, -52, -33, 33, 31, 0, + -30, -9, 7, 1, -30, -36, 20, -27, -10, -29, + -5, -37, -14, -5, 7, 15, -3, -8, -6, -14, + 11, 15, -1, 1, 21, -5 + }, + { + -107, -2227, 107, -2, 587, 190, 92, -164, 28, -30, + 58, -45, 76, 67, -249, 56, -645, -202, 18, 294, + -213, -378, -76, -498, 25, -184, -412, 69, -302, 335, + 110, -142, -47, -104, 158, 144, -184, -63, 55, 65, + 92, 32, -78, -134, 67, 196, 23, 56, 48, 51, + -55, 2, 11, -79, 53, -99, 100, -13, 30, 47, + -51, 22, 1, -11, -57, -67, 42, 47, 19, 9, + 16, -14, 39, 8, 12, 25, 14, -35, -42, -15, + 14, -3, 1, -13, 5, -16, -1, 3, -12, 18, + 12, -1, -5, 4, 5, -2 + }, + { + 240, 726, -1182, -300, 1443, -83, 129, 264, -58, -465, + -383, 838, 188, -44, 84, -317, 7, 178, -262, -158, + -345, 479, -79, 574, -20, -98, 454, 60, 69, 165, + 43, -18, 300, 71, -267, -63, 33, -115, -12, -32, + -160, -27, 103, -139, -51, -83, 18, -54, 71, -4, + 20, -85, -50, -30, 39, -16, -58, 6, 4, 47, + -2, 3, -75, -51, -58, -42, -9, 20, -55, 53, + 9, -25, -14, 14, 30, -20, -4, -23, 8, -54, + -6, -16, -8, 25, -10, 12, -5, 13, -8, -3, + 2, -9, 0, 0, 8, -6 + }, + { + 409, -7214, -931, 2421, -366, -3, 102, -170, 30, 224, + 69, -66, -22, 96, 465, 297, 123, -330, -61, -158, + 151, -70, -108, -16, -51, -251, -194, 149, -58, 9, + -61, 173, 175, 237, 101, 98, -113, -128, 2, -34, + 66, -101, 116, 62, -68, 11, 117, 56, -137, -68, + -11, -2, -120, -23, -59, 48, 76, -36, 56, -32, + -5, -36, -28, -42, 6, 17, -37, -2, 16, -2, + 11, 29, 11, -2, -24, -2, 30, 37, 18, -21, + 22, 21, 17, 7, 18, -11, 1, -2, 0, 4, + -11, 9, -2, 6, -6, -3 + }, + { + -124, 337, 539, -146, 55, 45, 69, -128, 59, -29, + -171, 162, 278, -319, -202, -438, -953, -1857, -617, -246, + 99, 479, -163, 466, -98, -17, 294, 274, 132, -36, + -138, 184, 198, 134, 215, 24, 77, 258, -4, -207, + -96, -49, 71, 7, -12, -1, -5, -37, 185, 49, + -114, -111, 65, 41, 15, -23, -7, -5, 71, -31, + -88, -78, 4, -26, 13, 66, -3, -23, -50, 17, + -37, 33, -5, -8, -7, 4, -2, 19, -5, 3, + 40, 38, -15, 8, -11, 2, 2, 16, 2, -1, + 17, 8, -1, 5, -13, -7 + }, + { + 670, -4037, -146, -2152, -119, -77, -55, -320, -10, -46, + 529, 112, 333, -513, 59, -34, -176, 24, 226, -187, + 527, 94, -286, -278, -78, -42, -13, -7, -139, -229, + 57, 68, 27, 108, 23, 34, -137, -190, 49, -17, + -74, 6, -62, 20, -160, 57, -47, 4, 27, -64, + -36, -81, -63, 46, 45, 65, -35, -53, -53, -82, + -18, -17, 38, -52, 10, 44, -38, 14, 40, -28, + 34, 54, -47, 50, 54, -31, -26, -6, -7, -18, + -17, 17, 4, 15, 18, -6, 3, 15, -8, -4, + -14, -17, -3, -7, 0, -10 + }, + { + 24, -175, -65, 53, -94, 21, 10, 33, -106, -111, + -24, -69, -247, -329, -41, -123, -155, -460, 389, -246, + 540, -359, 245, 655, 70, 53, -127, 137, 95, 97, + -147, -156, 308, -114, -51, -232, 57, -122, -8, -164, + 27, 88, 32, -76, 7, -18, -32, -74, -46, 39, + -67, -95, 13, 128, 26, 12, 74, -45, -52, 24, + 50, -60, -40, -24, -4, 34, 19, -42, -29, -9, + 11, 1, 40, -32, -40, 23, -23, 9, 15, -6, + -25, 39, 12, -13, 2, 11, 24, 2, 10, 3, + -10, -7, -11, 8, -5, 6 + }, + { + -1173, -789, 297, 804, 31, 229, 121, -171, -220, 75, + 86, 331, 416, -171, 225, -257, 165, 48, -60, -162, + -570, -49, -53, -106, 98, 25, 7, 132, 103, 154, + -97, -54, -193, 5, 55, -202, -2, 8, -8, 82, + 7, 65, 198, 59, -74, 60, 40, 20, 70, -54, + -127, -3, -133, -23, 2, 31, -50, 22, -3, 17, + -41, -21, 8, 1, -11, 18, 1, 53, -6, 5, + 16, -16, -27, 32, -7, -19, -23, 8, 27, -39, + -1, -19, -13, -29, 23, -37, 3, 22, -1, -11, + -6, -20, -6, 6, -12, 11 + }, + { + 12, -267, 399, -56, 30, 40, 44, 3, 213, 88, + -171, -120, -90, 246, -70, 313, 1018, 29, 336, -364, + -140, 170, -9, -165, 379, 321, 30, 45, -33, -29, + 33, 217, -213, 37, 218, -34, 100, -73, 4, -136, + 42, -194, -120, 81, -35, 87, 165, 51, 50, -7, + 2, -71, 94, -14, -37, -61, -21, -64, 30, 103, + 19, 43, 79, 2, -41, -54, 33, 19, -12, 21, + 53, -38, 34, -31, -36, 20, 7, -4, -2, 5, + 11, 2, -12, -8, 24, 4, 3, -4, 6, 4, + 6, -6, -3, 15, -15, 8 + }, + { + -921, -7047, -254, 779, -316, -364, -916, -83, 218, -590, + 6, 230, 478, -12, 671, -341, -297, 220, -75, -195, + 66, 346, -41, -204, -82, -37, -41, 41, -37, -76, + 218, -141, -22, 256, 102, 167, 118, -76, 48, -73, + 165, 12, 15, 118, -7, -76, -65, 8, 39, 107, + -112, 28, 68, -50, 25, 106, 56, 62, 54, -1, + -78, 50, 31, -24, -6, 67, -10, -8, 20, -40, + 4, 53, 6, 40, 18, -25, -46, 27, -4, -13, + -1, -16, 24, 23, -19, -29, -24, 16, 12, 6, + 28, 23, 18, -7, 6, -25 + }, + { + -55, -1484, -320, 532, -155, -327, 79, -38, 19, 30, + 69, -125, -196, 296, -477, 265, 273, 342, 107, 129, + -714, 185, 72, -483, 172, 73, -71, 131, -157, -240, + 167, -205, -199, -130, -87, -184, -78, -28, -79, -31, + -39, 23, 32, 2, 67, -26, 14, -11, -21, -77, + -13, -16, 58, -12, -123, -14, -43, -76, -62, -27, + -47, -107, 9, 2, 35, 41, -10, -20, 11, -23, + -17, -9, -21, 19, -9, 31, -35, -5, -9, 14, + 16, 15, -1, 7, -6, -1, 7, -4, 14, 12, + -7, 8, -6, -9, -7, 2 + }, + { + 302, 10028, -346, 179, 17, 570, 218, -55, 119, 150, + -272, -178, 58, -522, -100, 86, 316, -287, -163, 170, + -118, -245, 250, 44, 83, -57, -284, 161, -91, 367, + -218, -82, -3, -187, -197, -136, 93, 59, 75, -18, + 6, 93, 73, -287, -4, 79, 24, -63, 96, -107, + -61, 72, -28, 7, -51, 10, -49, 161, -36, -4, + -57, -61, -21, -89, 4, 3, 52, -33, 23, -12, + -11, 12, 9, -51, -23, 82, 15, 7, -40, 3, + -58, -2, 5, 17, -24, -15, -3, 4, 21, -18, + -3, 6, -13, -11, 16, 20 + }, + { + -64, 1566, 412, -134, 339, 75, 553, -272, 45, -35, + -84, 301, -548, -1250, -819, 120, -106, 209, -344, -37, + 353, 264, 703, 217, 118, 24, -161, -268, 114, -66, + 269, -246, -104, -366, 78, -75, -159, -77, 210, -152, + -180, 145, 59, -131, -241, 14, 154, 21, 38, 122, + 28, -15, 102, 36, 101, 27, -51, -65, 4, -58, + 13, -1, -32, 54, 8, 21, -33, -15, -51, 5, + -32, 77, -6, -17, -40, -69, -27, 9, 38, 15, + 17, 17, -52, -1, -13, 26, -5, 3, 2, -4, + 1, -2, -5, 23, 2, 0 + }, + { + 1234, 2567, 250, 502, -356, -91, -273, -87, -270, 114, + -68, 122, -258, 569, -156, 270, 85, 238, 201, 380, + -66, -131, 225, -89, 220, 336, 139, -88, 162, 217, + 200, 250, 95, 98, -232, 69, -127, -79, -105, -49, + -25, -190, 32, 170, 11, 86, 45, -132, 14, -33, + 11, 23, -64, 20, 12, -75, 30, 32, -5, -78, + 14, 26, 40, 57, 1, -29, -31, 5, -9, -22, + -12, -59, -55, -31, 18, -9, -37, 3, 0, 11, + -7, 47, 11, 0, 25, -6, 2, -2, 19, 15, + -3, -10, -15, -5, -2, -2 + }, + { + -147, 815, 138, -73, 35, -138, 351, -29, -176, -215, + -15, -89, -206, -902, -819, -221, -135, 118, 136, 250, + 39, 282, 246, -280, 12, 19, 105, -21, -514, -47, + 264, 153, 37, 89, 74, 98, -95, 163, 1, -106, + -130, -96, -110, 34, -140, 49, -46, 38, 154, -56, + -2, 57, 113, 114, 51, 37, -21, -14, -28, -27, + 101, -15, -60, -28, 45, -39, 64, 10, 43, 10, + -38, -20, -22, 12, -4, 7, -8, -5, -26, -1, + 11, 11, 22, -4, -30, 3, 11, -12, 25, 7, + -1, 10, 0, 16, 16, 17 + } + }, + { + { + -350, 10571, -4073, 1433, 452, -257, 55, 300, -474, 193, + -53, -201, -139, 151, 417, 53, 437, 79, -604, 59, + -361, 288, -145, 314, -41, -309, 130, -82, -93, -59, + -61, 38, 183, 12, -63, -242, 207, 115, -70, -56, + 3, -52, 117, -52, 114, 143, 96, -24, -82, 83, + -92, -15, -89, 92, -35, 57, -42, 7, 0, 39, + -9, 42, 41, -71, 1, -68, 17, 45, -59, 25, + 10, -13, 3, -30, -31, -37, 43, -22, -27, -8, + -8, -7, -18, -10, 7, 25, -12, -15, 9, -2, + 10, 17, -13, 3, 16, -8 + }, + { + 107, -3100, 312, 746, 244, 182, -87, 160, -135, -181, + 95, 228, -154, 69, -253, -389, -82, -267, -297, 302, + -2, -205, -123, -398, 129, -531, -422, 92, -237, 382, + -86, 52, -117, 5, 75, 222, -65, -1, -114, -14, + 2, 207, -110, -40, 8, 195, 84, -23, 160, -17, + -111, 25, -27, -13, -42, -52, 55, -11, 2, 32, + -10, 29, 44, -40, -38, -4, 44, 6, -15, 42, + -31, 10, 17, 14, 25, 1, -20, 30, -66, 3, + 4, -1, -7, 19, 0, -10, 0, -3, -13, 17, + 14, -13, 6, 4, 13, -12 + }, + { + -108, -1994, 1361, 1318, -169, -8, 222, 90, 7, 29, + -437, 501, 203, 28, -402, 12, -17, 432, -671, -20, + -180, 263, 178, 135, -280, 835, 14, 202, -297, 368, + 17, -79, 359, -187, -221, 102, -7, -162, -17, -86, + -45, 20, -112, 5, 19, -93, -51, -39, 75, -81, + 4, 27, -58, 28, -36, -33, -15, 57, 7, -31, + 19, 8, -78, -52, -49, -59, 22, -58, 8, 45, + -3, 17, -18, -13, 47, -8, -6, -17, -24, -45, + 18, -16, -14, 22, 13, 4, 5, -2, 3, 14, + -17, 1, 4, -11, 3, 1 + }, + { + -1541, -7422, 1320, 1593, 219, 139, -120, 34, -46, 120, + -55, 244, 75, -478, 701, 371, 62, -101, -354, 5, + -43, 91, -163, 160, -3, -256, -131, 97, -71, 123, + -53, 219, 310, 11, 132, 84, -150, -153, 4, -19, + 11, -11, 114, 44, -88, 20, 23, 131, -113, -34, + -74, -49, -70, -24, -29, 96, 77, -111, 94, -55, + 12, -9, -75, 25, -32, -2, -8, 23, -4, 20, + 13, 11, 22, -5, -39, 25, 15, 14, 43, -9, + 37, 15, 10, 4, 6, -4, -8, 5, -7, 11, + -6, 18, -8, -6, 5, 0 + }, + { + 96, 1594, -798, 5, 32, 22, 145, -195, -55, -59, + -136, 120, 545, 11, -1409, 150, -1001, -591, -1643, -22, + 300, 101, 58, 371, -208, 167, 286, 362, 165, -313, + 186, 257, 247, 8, 252, 1, 74, 207, -37, -135, + -37, 3, 49, 39, -87, 28, 89, 35, 57, 80, + -177, -79, 88, 37, 3, -18, -20, 20, 78, -32, + -175, 14, -69, -12, 52, 48, -2, -3, -33, -24, + -12, 6, 0, 26, -49, -5, 21, 13, 3, 29, + 15, 52, -20, -5, -8, 16, -14, 18, 9, 8, + 19, -6, 18, -6, -10, 11 + }, + { + -2112, -2425, 943, -1452, -192, -171, 95, -370, 97, 185, + 221, 177, 65, -468, 97, -124, -300, 422, 111, -94, + 481, 11, -52, -435, 13, -51, -78, -64, -125, -180, + -16, -100, -2, 264, 66, 16, -80, -347, -88, 106, + 70, -67, -63, 97, -283, -2, 110, -12, -41, 104, + -72, -131, 12, 53, -38, 98, -9, -19, -107, -114, + -18, -4, -4, 0, 31, 57, -35, -20, 32, -8, + 35, 6, 33, 19, 61, -21, -17, -20, -17, -51, + 18, 1, 7, 9, 16, 10, 3, 16, -5, -26, + 5, -26, -17, -5, 10, -10 + }, + { + -40, -346, 209, 13, -36, 21, 8, -70, -27, -40, + -54, -135, -461, 111, -185, -331, -331, -129, 41, 672, + -25, 122, -184, 1037, -320, 139, 134, -343, 283, -18, + 38, -75, -187, 233, -284, -58, -41, -134, 18, -113, + -92, 106, -31, 23, -23, -34, -82, -21, -55, -20, + -144, 8, 28, 75, 15, 36, 106, -36, 37, -26, + 43, -45, -35, -5, -20, 41, 38, -42, -48, -32, + 34, 21, 2, -6, -13, 20, -11, 4, 2, 1, + 17, 0, -10, 2, -4, 25, 9, 18, -2, -7, + 0, -4, -25, 5, 3, -7 + }, + { + 2086, -2808, -1275, 634, -40, 124, -132, -31, -311, 281, + 376, -11, 416, 799, -888, 186, -218, 201, -93, -202, + -289, -219, -27, -35, 53, -151, 118, 39, 323, -147, + -79, 126, -13, -98, -2, -15, -229, 142, -108, 68, + -74, 206, 84, 76, -122, 118, 70, -116, 181, 80, + -148, -3, -136, -36, -38, 75, 0, -65, 27, 34, + -75, 13, 22, -8, -29, 20, 44, -3, 26, 16, + 15, -29, 13, 8, 4, -32, 4, 3, 4, 2, + -3, -4, -15, -47, -1, -2, -20, 26, 1, -13, + -6, -27, -2, 10, -6, 2 + }, + { + -45, 228, 115, -48, -41, -8, 103, 61, 174, -62, + -196, -216, 258, 636, -859, 438, 107, 819, 247, -359, + 180, -221, 265, 19, -191, 372, 338, 345, -120, -263, + 489, -552, 253, 56, -101, 110, 164, -137, -95, 10, + -38, -223, -77, 101, -20, 104, 104, 8, 144, -11, + -10, -78, 71, 34, -16, -127, 20, 20, -10, 29, + 20, 50, 61, -12, -53, -25, -2, 8, 25, 39, + 11, -27, 29, 0, 11, -14, 27, -28, 22, -12, + 37, -15, -22, -2, 30, -1, -7, 16, 6, 1, + 1, 5, -2, 5, 0, -4 + }, + { + 919, -5425, -3803, 353, 1259, 88, -1710, -293, 1, -191, + -149, 122, 533, 298, 370, -211, -216, -83, 118, -83, + -12, 183, 19, 7, -41, -393, 126, -114, 230, -369, + 283, 109, -160, 314, -11, 43, 8, 78, 93, 173, + -202, 154, 72, 8, 2, -28, -36, 137, -114, 46, + -51, 93, 48, -14, 40, 69, 64, 33, 64, -45, + 27, -38, 83, -45, 41, -23, 22, 1, -22, -12, + 1, 54, 16, 35, 11, -44, -9, 0, -9, 4, + -32, 19, 15, 26, -29, -13, -13, 25, -7, 40, + -2, 33, 11, -11, -4, 0 + }, + { + 62, -431, -1012, -90, 176, -198, -14, -236, 112, -25, + 129, -278, 139, -44, -166, 66, 68, 568, 292, -192, + -564, 123, 390, -207, -21, 350, -453, 339, -383, -55, + 20, -58, -107, -179, -206, -102, -75, 3, -68, -191, + 15, 12, 95, 10, 22, -40, 66, -14, -21, -52, + -88, 53, 23, 1, -133, 36, -93, -52, -32, -71, + 26, -105, -22, 41, 7, 14, -12, 8, 5, -53, + 9, -30, -1, 3, 14, -1, -16, -22, 12, -19, + 26, 6, 11, 1, -5, 3, -1, 1, 22, -1, + 9, -3, -4, -1, -3, 1 + }, + { + 1269, 9165, -517, 39, 54, 345, -129, 365, -97, -77, + -111, -162, -9, -365, -263, 335, 291, -8, 83, -98, + -105, -167, 18, 381, -358, 155, -130, -111, 144, 258, + -65, -123, -141, -91, -176, -267, 173, 19, 95, -92, + 147, -79, -62, 50, -97, 86, -26, 8, 80, 1, + -104, -7, 86, -57, -67, 66, 18, 58, -11, -59, + -70, 25, -88, -70, -3, -8, 32, 4, -31, 15, + -15, 2, 34, -69, -1, 46, 60, -32, -15, -7, + -40, -5, 7, 11, -17, -6, -26, 25, -2, -14, + 4, 3, 4, -11, 9, 15 + }, + { + 42, 1761, 296, -2, -45, 286, 211, 121, -94, -118, + 269, -104, 273, -2816, -186, 170, 72, -54, -145, -122, + -41, 723, 986, 140, -389, 369, -355, -25, -220, 574, + -108, -31, -220, -255, 100, -247, -2, -106, 41, -75, + -93, 102, 52, -233, -92, 8, 153, 76, -85, -16, + 179, 85, 74, 58, 122, -38, -20, -101, -2, -51, + -44, 58, -8, -32, 70, -35, 19, -98, 34, -32, + 7, 19, 15, -11, -57, -22, -25, 2, 49, 6, + 23, -7, -47, -21, -8, 10, 7, 1, 0, -8, + -12, -4, 13, 8, 1, 20 + }, + { + -457, 4693, 637, -144, -338, 425, -723, -201, -84, 232, + 45, 38, -169, -772, 1900, 309, -313, 119, 222, 459, + -93, 131, -134, 173, 268, 307, -71, 210, 5, 343, + 162, 113, 180, -85, -74, 48, -139, -187, -54, -77, + 128, -137, -138, 92, 153, 1, -66, -122, 26, 76, + -56, 107, -30, 68, -61, -93, 8, -3, 1, -9, + -52, 63, 17, 5, 19, -14, -35, 21, -17, -34, + -30, -50, -27, -35, -11, -14, -26, 6, 14, -15, + 8, 11, 3, 15, 16, 3, 3, 2, 14, 6, + 6, -4, -18, -10, 2, -3 + }, + { + 144, 850, -213, -184, -49, 60, 233, 65, -151, -307, + -196, 25, -89, 167, -2465, -103, -40, 252, -98, 469, + -189, 489, -299, 2, 25, -92, 235, -202, -371, -9, + 69, 105, 250, 110, -100, 30, 33, 71, -74, -82, + -58, -60, -40, -155, -41, 3, -34, 76, 78, -37, + -6, 120, 126, 155, 13, -13, -2, -57, -37, 49, + 84, 5, -77, -49, 16, 21, 61, -2, 62, -62, + -4, 19, -16, -15, 20, -9, -24, -14, -4, 5, + 21, -7, 16, -12, -7, -18, 9, 11, 17, 3, + 16, -9, 14, 11, 14, -4 + } + }, + { + { + 350, 13672, -2755, 376, -550, -190, -25, -58, -484, 441, + -73, 81, 48, -98, 580, 90, 255, 464, -428, -178, + -125, 504, -253, 149, 57, -97, 319, -58, 20, 21, + 97, 143, -24, -124, 79, -97, 282, 54, -216, 11, + 13, -87, 26, -7, 30, -25, 71, 3, -123, 52, + -148, -34, -22, 176, -18, -29, -16, 88, 50, 46, + -4, 54, 33, -57, 76, 16, 19, 19, -66, 24, + 27, -12, 10, -5, -14, 2, 79, 12, 3, -7, + -4, 24, 27, 0, -7, 30, -10, 1, 35, 15, + -3, -1, -18, -14, 4, -4 + }, + { + -14, -1830, 1038, 418, -179, -33, -142, 239, -90, -58, + 142, 122, -371, 20, -152, -300, 132, -109, -261, 316, + 195, 364, 679, -36, 241, -565, -510, 214, -175, 69, + 62, 389, -113, -63, 6, 186, -29, -87, -188, -85, + -131, 298, 29, -16, -60, -13, -42, -108, 56, -71, + -113, 23, -33, -22, -95, -21, 18, -12, 4, -11, + -26, 14, 50, 6, 12, 34, 46, 10, -37, -2, + -76, -30, -8, -21, -14, -15, -17, 47, -5, 28, + -10, -7, 3, 16, 2, -3, -12, 9, 3, 8, + 12, -21, -2, 2, 9, -9 + }, + { + -28, -6096, -1765, 1250, -201, 140, 95, -109, 98, -45, + -577, 463, 83, -87, -362, 120, -156, 313, -566, 313, + 23, 185, 55, -198, -339, 808, -392, -99, -348, 376, + 107, 137, 293, -251, 75, 240, -2, -86, 122, 229, + -1, 52, -25, 36, 17, -124, 0, -20, 3, -132, + 50, 37, -106, -24, -48, -36, -60, 19, 16, -50, + -5, 57, -26, -66, -29, -66, 26, -66, -12, 9, + -18, 12, -6, -1, 39, -9, 12, 11, -23, -18, + 49, 9, -17, 6, 9, -6, 11, 11, 5, 11, + -2, 21, 14, -14, 4, 3 + }, + { + 2330, -4086, -197, 1201, -82, 104, -181, 78, -101, -72, + -270, -24, 170, -278, 500, 130, -71, -161, -135, 76, + -107, 188, -47, 198, 186, 73, -43, 65, 34, 49, + 2, 131, 95, -148, -169, -72, -85, -173, -70, -69, + 32, 42, 20, -91, -101, -29, -38, 111, -18, 86, + -45, -27, 21, 12, -35, 56, -22, -111, 72, -81, + -3, 42, -6, 69, -29, -9, -11, -14, 6, 41, + 0, 2, 39, 12, -37, 11, 3, 3, 36, -8, + 4, -3, 1, -7, -9, 2, -2, 8, -1, 7, + 3, 18, -2, -2, 5, 10 + }, + { + -57, 2367, -66, 66, 19, -3, 85, -125, -16, -11, + 120, 164, 345, -315, -1191, 1275, 196, 1342, -57, 446, + 291, 178, 90, 353, -39, 102, -97, -185, -52, -404, + 278, 98, 240, 1, 75, -32, -117, -135, 80, 30, + -20, 37, 60, 36, -77, -65, 103, 41, -23, 59, + -134, -30, 55, -29, -49, -27, -101, -46, 32, -26, + -117, 24, -89, -7, 11, -37, -8, 47, -11, -34, + -17, -1, 18, 32, -59, -28, 8, 30, -5, -9, + -24, 30, -11, -1, -18, 26, -6, 4, 11, 6, + 7, -14, 12, -3, 2, 17 + }, + { + 3019, 1678, -907, -666, 108, -6, 124, -444, 86, -141, + -275, -68, -80, -122, 220, -57, -153, 408, 70, -39, + 240, -132, 53, -130, 253, 66, 113, -70, -223, -224, + -95, 81, 192, 59, -4, 72, 30, -231, -125, 78, + 79, -93, -62, 76, -158, 85, 183, 52, -4, 120, + -115, -79, 44, 45, -77, 24, -7, 35, 17, 18, + -2, -30, -14, -5, -3, 34, -21, -37, 16, -31, + -10, -17, 40, -6, 19, -30, 3, 29, 4, -57, + 20, -13, 8, 12, 10, 3, -5, 15, -11, -4, + 27, -11, -3, 5, 19, 0 + }, + { + -2, -446, -36, -50, -52, 3, 5, -116, -28, 34, + -109, -224, -211, 410, -81, -9, -51, 186, -60, 534, + -39, -92, -248, 1128, -365, 144, 176, -396, 385, 78, + 93, 41, -375, 281, -153, -193, -69, 2, 214, 30, + -57, 62, -100, 11, 4, -43, -93, 13, 0, 35, + -123, 46, -17, -19, 6, 31, 45, -68, 143, 32, + 111, 57, 28, 13, 11, 45, 30, -36, -63, -16, + 49, 11, -1, 51, 44, 14, -8, -2, -24, -1, + 23, -1, -7, 14, 3, 8, -18, 10, -8, -12, + 2, 6, -16, -12, -6, -2 + }, + { + -2465, -5525, 1249, 558, 39, -20, -285, 150, -166, 68, + 192, -342, 248, 660, -1385, -28, -313, 134, 85, 215, + 22, -301, -147, 101, 103, -130, 35, -60, 294, -193, + -6, 295, 165, -148, -119, -49, -103, 195, -311, -78, + -78, 161, 4, -35, -58, 83, -1, -70, 252, 146, + -66, -65, -62, 60, -9, 151, 24, -24, 10, -9, + -48, 5, -5, -19, -9, 32, 23, -14, 29, 3, + -8, -13, 28, 12, 11, -24, 12, -5, 11, 33, + 16, 13, 12, -12, -9, 3, -13, 12, 2, -1, + 4, -22, 2, 13, -5, -16 + }, + { + -18, 158, -301, -70, -39, -24, 0, -186, -58, -16, + -151, -146, 144, 256, -1057, 398, -700, 380, 271, -517, + 144, -277, 308, 57, -386, 396, 91, -2, 60, -211, + 300, -525, 290, -8, -178, -43, 190, -4, -6, -2, + -126, -145, 0, 61, 5, 69, -1, -138, 106, 73, + -31, -26, 75, -42, -15, -16, 22, 56, 20, -91, + -102, 23, 50, -26, -3, 33, 16, 31, 41, 30, + 9, -32, 14, 11, 23, -23, 8, -38, 28, 1, + 21, -12, 14, 5, 7, -15, -9, -4, -14, 2, + -1, 1, 6, 8, 10, 3 + }, + { + -955, -2017, 1029, -56, 466, 276, -449, 129, -72, -261, + 7, 9, -84, -138, -169, -366, -9, -348, 231, 171, + -288, -238, 2, 54, 187, -63, 290, -167, 151, -308, + 178, 93, -79, 160, -172, -239, -212, -73, 112, 307, + -245, 189, 34, -15, -80, -178, -95, 138, -119, -60, + -110, -21, -5, 33, 58, -29, 0, 52, 21, -64, + 82, -90, 92, -21, -43, -12, 77, -17, -1, 2, + -15, 57, -6, -23, 2, 0, 33, 3, -12, 2, + -24, 15, 14, 14, -9, -3, -13, 16, -9, 38, + -8, 12, -9, -8, 13, 14 + }, + { + -53, 670, 162, 5, 186, -39, 86, -64, 100, -104, + 140, -144, 223, -182, -227, -42, -284, 199, 203, 207, + 171, 251, 534, 167, 132, 294, -323, 583, -119, 107, + -68, 209, 113, -26, 49, 62, 110, 49, 53, 8, + 34, -81, -1, -54, 11, -44, 89, -10, 36, 9, + -54, 25, -45, 65, 20, 79, -81, 32, 57, 8, + 101, -59, 9, 45, -7, -19, -7, 3, -9, -36, + 1, -45, -3, -16, -4, -15, 4, -15, 25, -11, + 12, -16, -2, 5, 13, 13, 2, -6, 10, -5, + 3, -4, -1, 4, 2, -2 + }, + { + -2026, 5237, -108, -282, 82, 250, -253, 263, 155, 233, + -24, 153, 392, 439, 0, 163, 285, 71, 190, -136, + 355, 35, -113, 479, -106, 52, -169, -152, 0, 104, + 11, -38, 0, 137, 46, -126, 184, -56, 0, -143, + 98, -89, 68, 254, -58, 55, -69, 6, 69, 21, + -69, -73, 25, -66, 12, 46, -9, 25, -46, -80, + -45, 64, -54, -4, 14, -18, 14, 12, -5, 6, + -44, -13, 30, -27, 8, -21, 22, -38, 9, 27, + 7, 7, -16, 4, -3, -7, -22, 18, 6, 3, + -8, -7, 5, -6, -2, 3 + }, + { + -8, 1143, -33, 44, -80, 154, -199, 25, -48, -84, + 205, -82, 769, -2048, 210, 188, 160, -22, -192, -606, + -190, 985, 41, -264, -22, 415, -249, 203, -115, 576, + -61, 139, 5, 65, 140, -256, 98, -187, -108, -54, + -67, 56, 120, -107, 11, -33, 108, 74, -152, -141, + 101, -3, -27, -8, 74, -17, 52, -4, 21, -24, + -23, 57, -30, -72, 26, -69, 30, -54, 100, 6, + -1, -30, -3, 9, -18, 4, -5, 9, 29, -17, + 10, -6, -10, 0, -5, -8, -16, -35, -22, -4, + -9, 3, 10, -9, -1, 18 + }, + { + -464, 4263, 39, -174, -53, 613, -383, 348, 310, 25, + 102, 222, -111, 21, 2803, 3, -583, -150, -195, 165, + -133, 72, -93, 185, 50, 177, -230, 250, -20, 98, + 55, 92, 175, -34, 53, 43, -104, -24, 159, 8, + 94, -20, -146, -78, 136, 28, -15, -53, -3, 141, + -90, 115, 100, 222, 7, -51, 43, 6, 12, 42, + -35, 12, -47, -19, 49, 10, -6, 31, 4, -27, + 37, -25, -21, -27, -11, 18, 20, 22, 14, -6, + -4, -17, -13, 7, 3, -14, 8, -5, -8, -15, + -11, -5, -10, -13, 0, 12 + }, + { + -104, 465, -171, -165, -38, 60, 68, 18, 152, -130, + -45, 114, 33, 1404, -926, -292, -410, 216, -16, 342, + -501, 22, -348, 197, 291, -138, -207, -183, -20, 195, + 158, 63, -61, -43, -164, 1, -47, -118, -65, 38, + 0, 16, 91, -130, 13, 82, 19, -6, 16, -14, + 2, 57, 24, 56, -62, -34, -30, -44, 13, 5, + -27, 38, 23, -50, -22, -16, 28, 23, 52, -39, + 49, 18, -16, 8, 55, -3, -6, -1, -11, -3, + 8, -30, -1, 4, 16, -10, -6, -2, -4, -4, + 10, -21, 14, -7, -15, -12 + } + }, + { + { + -438, 10361, 2246, -671, -168, -18, -144, -82, -132, 332, + -41, -47, 137, 56, -124, 758, -196, 276, 213, -466, + 287, 86, 163, -456, 246, 122, 156, -82, -7, 32, + 256, 1, -232, -102, 172, 41, 119, -23, -81, -42, + 123, 85, -226, 111, -45, 11, 31, 48, -104, -52, + -50, -53, 26, 50, 74, -61, -7, 96, 113, -30, + 34, 53, 1, 9, 36, 16, 14, -3, -8, -19, + 28, 3, -10, 5, -22, 53, 47, 39, -13, -8, + -7, 4, 42, -1, 2, 6, 0, 15, 16, 17, + 1, -22, 0, -12, -4, 1 + }, + { + -29, 1595, -1332, 65, -154, -72, -67, 123, -17, 40, + 223, 0, -144, 34, -374, 0, -25, -421, 621, -112, + 264, 657, 258, -89, 95, -109, -312, 115, -220, -225, + 189, 408, -81, -84, -136, 26, 51, -42, -153, -2, + -108, 184, 58, 79, -118, -176, 9, 31, -45, -80, + -48, -6, -8, -57, -83, 31, -53, 53, 43, -42, + -70, 41, 7, 44, -16, 36, 18, 39, -25, -22, + -60, -44, -8, -5, -46, 0, 24, -5, 33, 5, + -6, -2, 14, -15, 11, -2, -34, 11, 14, 3, + 15, -9, -19, 9, -7, 7 + }, + { + 95, -8889, 271, 597, 267, 165, -67, 23, 24, 24, + -267, -48, 279, -136, 305, -309, -185, -5, -250, 110, + 439, -214, -169, -138, -109, 287, -333, -175, -23, 215, + 91, 399, -12, -162, 329, 141, 55, -7, 23, 240, + 16, -44, 56, 80, -82, -89, -20, 14, -41, -34, + 38, -37, -36, -45, -38, 1, -95, -64, 51, -6, + -33, 26, 15, -61, -28, -45, 19, -64, 2, -4, + -19, -11, 2, 30, 25, -2, -21, 31, -32, -14, + 33, 21, -11, -4, 18, -9, -7, 9, 2, 12, + 10, 25, 12, -3, -2, -4 + }, + { + -2450, 1701, 235, 1128, 42, -114, 39, 156, -32, -236, + -201, -171, 138, -169, 506, 99, -35, 13, -145, -33, + -41, -4, 57, 79, 207, 47, -18, -18, 40, -136, + 138, 88, 67, -75, -135, -176, -79, -141, -83, -52, + 22, 31, 4, -133, -104, -18, 12, 61, 7, 32, + 20, 57, -71, 8, 11, -27, -1, -46, -49, 49, + -65, -9, 39, 69, -30, -17, -9, -17, 34, 16, + 4, 0, 27, 16, -34, 4, -16, 21, 3, 12, + -14, -15, 2, 8, -14, 5, 6, 3, 4, 3, + 7, 6, -3, 5, -4, 13 + }, + { + 26, 2268, 68, 59, -70, 84, -5, -42, -56, 62, + -59, 336, 67, 179, -696, 326, 55, 545, 1738, 313, + 655, -188, -14, 444, 191, -147, -56, -416, -97, -182, + 86, 102, -14, 296, -28, -137, 62, -200, 1, -13, + 21, -2, 58, -42, 40, -60, 53, 11, 5, -35, + -5, 60, -51, -42, -63, 44, -139, -78, -20, 20, + -70, -22, -37, -33, -13, -45, -3, 20, 13, -28, + -8, 10, 10, 14, -14, -50, 0, 25, -18, -25, + -2, 1, -2, 2, -3, 9, -4, 3, -1, 14, + -5, -12, 13, 9, -4, 3 + }, + { + -3008, 8396, 147, -15, -325, 104, -195, -82, 14, -52, + -250, -188, -280, 60, 114, -91, 99, 114, 98, -55, + -61, 149, 36, 79, 91, 102, 38, 96, -241, -276, + -115, 255, 220, -120, 125, -49, 93, -221, -62, 56, + -15, 107, -14, -93, 32, 20, 122, 1, 33, 45, + 29, -68, -21, 67, -47, -35, -37, 23, 44, 48, + 5, -42, -32, 11, 1, -18, 7, -17, -6, -16, + -36, 23, -8, 11, 14, -31, 8, 17, 20, -19, + 3, -15, 9, 6, 14, -3, 12, -16, -2, 12, + 14, -1, 0, 11, 7, 6 + }, + { + 28, -591, -32, -62, -6, -2, -13, -97, -13, -46, + -67, -194, -108, 637, -502, 225, 100, 226, 222, -313, + 250, 114, -1, 592, -252, 31, -65, 127, 155, 204, + -47, 148, -84, -49, -80, -158, 83, -52, 199, 3, + 10, -32, -25, 1, 10, 43, -101, -29, 38, 3, + -70, -41, -7, 38, -25, 22, -12, -34, 86, 53, + 110, 65, 57, -13, 34, 27, -4, -31, -48, 11, + 27, 10, 10, 26, 50, 17, -5, -23, -25, 18, + -1, 18, 4, 13, 0, -6, -21, 12, -2, -5, + 14, 3, -11, -12, 2, -7 + }, + { + 2296, -9357, -820, 693, -90, -166, -35, -57, 21, -146, + -28, 50, 43, -176, -561, 54, -199, 107, 167, 22, + 193, -148, -252, 152, 130, -236, 44, -91, 176, -80, + 115, 156, 174, -152, -53, 30, -30, -15, -240, -130, + 115, -81, -14, -31, 103, 107, -135, 58, 129, 40, + 75, -80, -61, 25, -7, 138, 0, 55, 18, -62, + -17, -22, -4, 0, -38, 49, -5, -8, 18, 19, + -12, -12, 0, 9, -8, 10, -9, -9, 24, 3, + 21, 41, 2, -12, -16, 9, 0, -2, 7, 1, + 2, -5, 6, -9, 7, -15 + }, + { + 50, -377, -110, 32, -56, -14, 7, -149, -200, -15, + -89, -83, 31, 118, -930, 600, -286, -274, 247, -210, + -426, -115, 321, -440, 235, 442, -328, -18, 372, -355, + -61, 78, -35, -254, 36, 16, 108, -46, 72, 20, + -109, 16, -129, -42, 68, -55, 77, -17, -49, 93, + -87, 121, -39, -11, -3, 10, 16, 60, 50, -135, + -96, 64, 8, 18, 12, -7, 44, 29, 60, -18, + 26, -11, -20, 18, -6, 11, -25, -20, 14, 7, + -3, 20, 10, 21, 2, -38, 1, -6, -10, -4, + -3, 1, 2, 9, 12, 6 + }, + { + 975, -1002, -748, -252, 46, -311, 350, -22, 33, -249, + -168, -47, -161, 14, -190, -206, 155, -462, 200, 13, + -193, -339, 199, -168, 167, 129, 125, -37, -75, -146, + -181, 173, 270, -213, 63, -283, -158, -206, 136, 144, + 68, 14, 78, -11, -138, -106, -79, 92, -52, -155, + -34, -102, -62, 13, 157, -56, -34, 57, 17, -11, + 27, -39, -3, 35, -85, 37, 43, -21, 22, -7, + -30, 38, 5, -6, -25, 11, 35, 2, -10, -13, + 0, 2, 31, -11, 10, -36, -9, 6, 11, 10, + 15, -6, -12, 6, 13, 2 + }, + { + 42, 1579, -330, -12, 59, 119, -110, 106, 13, 24, + -55, -96, 95, -161, -204, 127, -233, 161, 30, 386, + 98, 538, 138, 187, 85, 44, 159, 420, 99, 176, + -50, 18, 166, 24, 168, -72, 124, 27, 112, 41, + 77, -155, -11, -4, 36, -50, 96, 6, -4, 19, + 15, -71, -13, 83, 37, 45, -4, 5, 61, 12, + 29, 13, 32, 0, 19, -29, -8, 3, 11, -50, + -18, -10, -4, -24, -15, -2, -4, 0, 16, 0, + 5, -22, -12, 19, 16, -2, 14, 1, -2, 14, + -10, 2, -4, -5, 8, -2 + }, + { + 1794, -476, 482, -211, 26, 163, 31, 59, 75, 352, + 121, 72, -106, 590, 520, -3, 110, 26, 227, 1, + 359, -26, 73, 235, 222, -253, -43, -27, -102, -66, + 3, 66, 130, -3, 237, -105, 13, 112, -218, 6, + -61, 48, 300, -35, -20, 53, -5, 15, -4, 0, + -69, -24, -83, -8, 58, 27, 9, -36, 17, -52, + -47, 20, -31, -14, -4, 11, 23, -23, 41, -30, + -22, 14, 7, -14, -5, -38, 13, -8, 3, 3, + 11, 3, -8, 14, 2, -18, 0, -10, 7, 6, + -5, -10, -9, 8, -5, -2 + }, + { + -26, 535, 477, -13, 194, -128, -247, 20, -140, 105, + 10, 276, -943, -41, 382, 254, -133, -162, 78, -577, + -27, -47, -52, 492, 215, -301, 99, 393, 158, -47, + -3, 181, 203, -29, 105, -102, -187, 94, -220, -100, + -45, -12, 146, 51, -23, -23, 98, 2, -147, -137, + -15, -3, 31, 22, 2, 29, 15, 12, 37, 4, + -17, 37, -42, -10, -47, -31, -3, 25, 58, 17, + -17, -1, -36, 11, 2, -14, 6, 19, 13, -11, + 4, -5, 9, -6, 2, -2, -31, -17, -25, 0, + -21, 10, 2, -13, 4, 10 + }, + { + 1076, 2172, -13, -164, 131, 100, 321, -143, 498, -79, + 76, 124, 296, 688, 1370, 174, -516, -35, -260, -47, + 60, -89, 3, 272, -19, -14, -25, 220, -231, 46, + 98, 108, 40, 75, 239, -70, -160, 140, 207, -46, + 68, 49, -133, -129, 64, 151, -87, 49, -7, 30, + -41, 120, 103, 144, 59, 23, 8, -21, 61, 16, + -24, -44, -2, -7, 37, 4, 18, 3, 29, -13, + 14, 0, -54, -2, 9, 22, 21, 14, 1, 9, + 3, -15, 11, -15, 9, -15, -2, -16, -6, -14, + -18, 2, -6, -10, 2, 15 + }, + { + 55, 29, 150, -262, 35, 108, -17, -71, 217, -7, + 115, -251, 104, -1380, 2159, 33, -241, 80, 223, 75, + -66, -38, -127, -113, 217, 32, -256, -258, 54, 278, + 140, 2, -343, 87, 65, -17, -119, 63, -223, 51, + -47, 7, 59, -49, 70, 59, 9, -8, -47, 63, + 65, 7, -57, 2, -31, -45, 3, -7, -20, -10, + -41, 30, 54, -40, -6, 8, -36, 37, 25, -9, + 41, 4, 1, -2, 30, 25, -22, 9, -17, -10, + 5, -3, -8, 7, -1, 1, -23, 4, -7, 3, + -4, 1, 2, -9, -13, -7 + } + }, + { + { + 638, 7885, 710, -437, -56, 130, -73, 144, -5, 119, + -203, -251, 122, -23, -157, 706, -532, 86, 553, -160, + 46, -235, 97, -405, 325, 86, -162, -287, -62, -97, + -7, 21, -246, -65, 126, -187, 50, -54, -79, -68, + 162, 169, -80, 247, -18, -15, -39, -12, -116, -42, + 71, 19, -50, -23, 107, -20, -54, 29, 46, -100, + 56, 11, -71, 1, 6, -21, -15, -18, -2, -37, + 29, 14, -19, 47, 13, 31, -10, 10, 0, 14, + -13, -16, 30, 5, 1, -16, -9, -8, -17, -2, + 8, -8, 7, 0, 2, -4 + }, + { + -34, 4216, 823, -24, -190, 35, -54, 74, 203, 90, + 83, -18, -46, 61, -599, 236, 380, -298, 865, -110, + -583, -84, 25, -165, 49, 33, -194, 148, -62, -134, + 103, 412, 59, -63, -218, -91, -33, 40, -42, 125, + 103, 154, -121, -63, -78, -91, 7, 108, 5, 71, + 65, 39, 21, -13, -37, -33, -52, 28, 66, 23, + -30, 45, -13, 28, -1, 10, -33, 41, 13, 1, + -17, -9, -12, 16, -18, 8, 11, -18, 23, 1, + -10, -11, 5, -37, -15, -6, -13, 13, 3, -4, + 4, -4, -9, 16, -6, 10 + }, + { + -118, -7775, 1368, 556, 349, 354, 4, -51, -75, 64, + -2, 112, 428, 45, 350, -165, -378, -569, -30, -165, + -36, -401, -262, -228, -326, 29, -434, -289, 60, 182, + 74, 288, -42, 27, 262, 4, 69, -90, -65, 130, + -98, -223, 33, 152, 51, 1, -128, 8, 20, 29, + 41, -12, 19, -10, -2, 41, -57, -79, 4, 5, + 7, 41, 25, 2, -1, -30, 33, -13, 37, 33, + 18, -14, -29, 20, 21, 0, -40, 13, -20, -18, + -10, 0, 1, -9, 4, -10, -2, 2, -8, -2, + -1, 3, -16, 0, 2, -3 + }, + { + 1862, 6729, -635, 1042, 29, -66, 134, 145, 60, -5, + 59, -36, 92, -393, 198, 7, -230, 277, 282, -26, + -24, -296, -225, -27, 45, -137, -189, -12, 47, -51, + 247, -64, -43, 30, -12, -18, 52, -47, 4, 32, + -47, -64, 33, -39, -83, 26, 30, -65, -48, -54, + 10, 58, -85, 53, 7, -37, 29, -8, -26, 88, + -42, -7, 16, 31, -5, -13, -3, 16, 11, -5, + -11, -25, -27, 5, 15, 11, -25, 4, -18, 8, + -23, -25, 2, 16, 1, -3, -6, -1, -8, 3, + 1, -1, -4, 6, -5, 0 + }, + { + -4, 1511, -414, 40, -65, 57, -21, 49, 33, 55, + -225, 119, 113, 382, -258, 103, -121, -3, 874, 79, + 203, -230, 178, 25, -139, -230, 74, -203, -8, 0, + 34, -33, -86, 461, -36, -296, -76, -155, 86, -60, + -45, 1, 14, 1, 139, 14, 15, -80, 80, 4, + -38, 78, -25, -8, -28, 90, -45, 28, -5, -31, + -59, 23, 3, 27, 65, -15, -15, 20, 23, 1, + 28, 7, -20, 21, 30, -21, -7, 20, -29, -30, + 1, 5, 7, -1, -3, -9, -13, -6, -10, 12, + -4, 0, 12, -3, -13, -2 + }, + { + 2022, 15041, -269, -14, -309, 102, -37, 292, 33, 31, + 24, -5, -125, -82, -31, -161, -149, -145, 67, -14, + -96, 40, -50, 46, 57, 135, 49, 307, 42, -78, + -113, 139, 40, -286, 126, -26, 151, -51, 66, 62, + 44, 249, 124, 75, 70, -24, -52, -86, 34, -3, + 55, -67, 4, 55, -49, -39, -88, -21, 4, 0, + 4, -6, -15, 17, 42, -11, 9, -12, -5, 29, + 0, 48, -2, -7, 15, -19, 16, 10, 12, -2, + 32, 14, 2, -18, -2, -4, 11, -24, 8, 2, + -6, -11, 3, 10, -6, -3 + }, + { + 3, -313, 314, -7, 60, -4, 26, -27, 32, 52, + 84, 123, -136, 371, -361, 140, 27, 376, 67, -838, + -56, -306, 76, 721, -209, 41, 142, 480, -46, 54, + -27, 85, -91, -37, 18, -144, 77, -76, 95, 13, + 10, -81, 47, 53, 8, 89, -52, -28, 49, 26, + -54, -29, 25, 72, -24, -38, -77, -11, 3, -89, + 22, -9, -17, -12, 32, -23, -26, -8, -13, 20, + -5, -6, 3, -24, 29, 21, -5, -18, -14, 28, + -4, 25, 6, 0, -12, 0, -15, 0, 8, 13, + 21, 0, -8, 2, 5, -7 + }, + { + -1623, -13471, -224, 511, -88, -117, 191, -129, 109, -25, + -77, 248, 82, 88, 33, 200, 174, 204, 173, -53, + 22, -49, 6, 218, 35, -226, 245, -32, 103, -62, + 120, -105, -15, 35, 42, 399, 343, 15, -20, 20, + 51, -140, -50, -14, 31, 43, -89, 15, 6, 16, + 101, -18, -5, 17, -49, 40, -52, 66, 2, -76, + -10, -14, -3, -23, -20, 71, -33, -39, -24, -14, + -30, -33, -23, -6, -17, 8, -16, -12, 7, -32, + 5, 27, -16, -22, -1, 7, 4, 18, 7, 4, + 14, 2, -2, -5, 10, -10 + }, + { + 19, -296, 211, 66, 39, 0, 11, -66, -120, 2, + -22, -118, -212, -274, -942, 665, 93, -145, -93, -381, + -589, -160, -266, -746, 526, 405, -123, 50, 173, -106, + 98, 64, -125, -382, 114, 68, -23, -50, 232, 109, + -116, 71, -87, 19, 48, -105, 90, 14, -84, -30, + -129, 149, -46, -3, 34, 28, 11, 65, 106, -51, + -53, 42, -27, -3, -7, -34, 27, 0, -17, -42, + 42, -7, -21, -22, -5, 38, -12, -12, 15, 11, + -10, 18, 0, 9, 5, -31, 16, 14, 6, 8, + -1, -2, -2, 6, 8, 5 + }, + { + -906, -528, 1200, -442, -215, -505, 450, -81, 19, -54, + -91, 114, 1, 81, 243, 216, 446, 95, 2, -257, + 48, -321, 219, -41, 86, 14, 107, -83, 19, 30, + -327, -84, 150, -113, 234, -29, 111, -209, 97, 11, + 84, 51, 118, 49, -27, 112, 37, 58, 28, -35, + -17, -98, -77, -77, 73, -66, -35, 41, -10, 13, + -8, -73, -26, 64, -51, 3, -14, -28, 15, 3, + -11, 11, -38, 7, -5, 4, 10, 17, 2, -13, + -12, -22, 17, -15, -11, -29, 2, 1, 8, -8, + 4, 0, -4, 1, 4, -6 + }, + { + -39, 1860, 265, 107, -113, 67, -79, 205, 10, -74, + -99, -85, -91, -59, -372, 106, 54, 278, 90, 498, + 13, 399, -241, -369, -57, 196, 294, 447, 170, 158, + -103, -187, 154, -5, 175, -101, -17, -25, 35, -118, + 49, -44, 43, 77, 55, -107, 36, 13, -3, 1, + 54, -25, -31, 13, -9, 36, -7, -19, 26, 0, + 28, 36, 42, 7, 30, 14, 29, 9, 30, -42, + -20, 14, 22, 5, -6, 1, -4, -6, -11, -4, + 6, -20, -21, 3, 2, -12, 15, 2, -10, 11, + -13, -1, -10, -7, 1, -4 + }, + { + -922, -4062, 677, -330, -215, 31, 81, 35, -134, 32, + -72, 146, -466, 66, 623, -175, -225, -129, 46, -142, + 173, 32, 100, 51, 225, -54, 172, 122, -166, -164, + -14, 61, 113, -71, 9, -238, -35, 73, -242, 37, + -28, 58, 209, -143, -7, 53, 23, 72, -7, -68, + -30, 38, -45, 55, 38, 28, 22, 12, 85, -18, + -81, 12, 14, -3, 14, 35, 22, -41, 43, -38, + -1, 13, -1, -1, 13, -29, -7, 1, -3, -16, + -14, -6, 2, 11, 9, 9, 7, -14, 0, 5, + 3, -13, -14, -3, -8, 4 + }, + { + 40, 79, 38, -95, 265, 17, 12, 147, -56, 87, + -36, 539, 580, 1807, 483, 624, 11, 36, 195, -138, + -231, -996, -550, 483, 556, -136, 256, 111, 135, -182, + -186, 12, 64, -95, -88, -202, -158, 85, -112, 73, + 42, 83, 122, 27, -62, -17, 140, 18, -122, -89, + -114, -40, 22, -9, 27, 68, 24, 18, 34, -6, + -10, 3, -30, 35, 1, 5, 12, 16, -22, -4, + -7, 29, -9, 12, -7, 2, 16, 2, -2, -21, + -9, -14, -1, -5, 11, 16, -8, 23, -7, 7, + -4, 14, 2, -8, 0, 4 + }, + { + -1157, -701, 107, -237, 47, -243, 70, -224, 251, -186, + -94, -99, 479, -516, -722, 303, -81, -89, -314, -21, + -60, -104, 11, 244, 75, -18, 17, 90, -181, 178, + 107, 73, -41, -69, 171, -47, -167, 93, 19, -148, + 89, -27, -89, 5, 31, 140, -110, 54, 55, -22, + -78, 43, 42, -1, -34, 16, -42, -53, 64, 32, + 6, -45, -9, -16, -4, -29, -10, -4, 42, -4, + -21, -7, -56, 7, 25, 12, -16, 7, 3, 7, + -3, -19, 8, -30, -1, 1, -2, -17, 3, -10, + -11, 18, 10, 2, -1, 5 + }, + { + -40, -133, 180, -115, 133, 4, -146, -242, 118, 190, + 144, -370, -54, -768, 3103, 57, -189, 284, 561, -209, + -335, 175, 104, -486, 74, 250, -209, -212, -27, 101, + 91, -21, -319, 320, 268, 96, -26, 199, -165, -19, + 10, 89, 81, 60, 8, -39, -70, -73, 16, 173, + 56, -19, -49, -29, -10, 19, 36, 6, 11, 21, + -42, -18, 61, -3, 27, 37, -62, -24, 1, -20, + 6, -20, -6, -21, 5, 30, -25, 18, -13, -7, + 7, 4, -3, -6, -11, 11, -14, 6, 4, 8, + -4, 4, 1, 4, 1, 0 + } + }, + { + { + -714, 5792, 2927, -895, 114, 123, 4, 190, 27, -45, + -325, -233, 155, -122, 282, 53, -5, 105, -18, 254, + -66, -213, -178, 43, 101, 85, -211, -253, -213, 104, + -215, 48, -97, -66, 37, -151, -38, -40, 51, -70, + 137, 86, 71, 36, 19, 15, 26, -80, -108, -43, + 139, 33, -118, 8, 42, 55, -53, -7, -34, -24, + 45, -16, -36, 16, -37, -18, -26, 3, -22, -7, + 1, 26, -21, 26, 26, 1, 4, 5, 18, 17, + -6, -14, 17, -4, 3, -6, -13, -5, -20, 2, + 3, 1, -5, 6, 2, 1 + }, + { + 84, 3471, 1173, -168, 91, -33, -8, 55, 263, 138, + -123, 36, -9, -216, -548, 738, 27, 316, 100, -174, + -456, -230, 35, -144, 106, -130, -80, 194, -193, 88, + -149, 439, 91, -104, -19, -246, 46, 71, 60, 71, + 69, 122, -100, -89, -36, -16, 23, 63, 18, 38, + 108, 54, 30, -25, -17, -95, -16, 17, 33, 52, + 49, -24, 11, -19, 36, -9, -13, 32, 5, -8, + 30, -18, -18, 0, 7, -1, 2, -3, 0, 4, + -12, -3, -12, -16, -12, 5, 6, -9, 1, -6, + -11, -4, 8, 14, 4, -3 + }, + { + 184, -3129, -2446, 474, 456, 419, -48, -96, 26, -101, + 344, 64, 56, 285, 262, -23, -172, -764, -263, -24, + -411, -270, -397, 121, -173, -268, -261, -235, -57, 141, + 207, 118, 22, 101, -67, 48, 158, -173, 33, -38, + -127, -74, -52, 58, 61, 82, -126, -26, 59, -9, + 36, 21, 19, -3, -3, 42, -35, -53, 2, -4, + -25, 84, 31, 5, -33, 35, -49, 33, 19, 48, + 0, 1, -11, 3, 6, -1, -20, -6, -15, -7, + -28, 8, 0, -16, 10, -4, 13, -15, -1, -10, + 0, -1, -18, -9, 2, 3 + }, + { + -855, 9344, 213, 922, 160, -26, 127, -9, 105, 82, + -58, 125, -57, -37, -198, -179, 217, 317, 108, -66, + -56, -227, -158, -52, -42, -63, -167, 44, -45, 146, + 41, -130, 14, 76, 84, -64, 34, -19, 8, 133, + -130, -8, -76, 49, 22, -34, -45, -56, -2, -89, + 55, -18, -65, 22, 52, 17, 10, 0, -37, 57, + 25, -13, 1, 10, 12, 1, -11, 31, 0, 2, + -11, -25, -40, -7, 40, 2, -3, -5, -20, 3, + -13, -9, -7, 12, 6, -12, -5, 0, -17, 6, + 6, 4, -1, -6, 7, -9 + }, + { + -31, 539, 277, -18, 35, -17, 34, 34, 75, -3, + -118, 88, 226, 41, 399, -459, -51, 1365, -1379, 466, + 327, -71, 12, -247, -305, -48, -52, 73, -26, 221, + -146, -4, -74, 288, 75, -182, -106, 5, 71, -7, + -122, 12, -84, -13, 137, 94, -46, 47, -5, 69, + -67, 15, 58, -93, 24, 42, 67, 16, -47, -18, + -9, -12, -7, 65, 51, 33, -5, 13, 20, 3, + -2, 18, -15, 21, 19, 13, -25, 14, -2, -22, + 3, -3, -2, 3, -4, -23, 7, -11, -5, 11, + -5, 15, 2, -4, -11, 0 + }, + { + -482, 18467, -379, -419, 244, -58, 30, 232, 33, 29, + 255, -169, 17, -114, 45, 22, -430, -81, 85, -81, + 1, -43, 106, -66, 62, 69, 130, 209, 48, -120, + 20, 98, -121, -117, -24, 70, 99, 54, 77, 81, + 191, 79, 216, 103, -146, 49, -174, 77, -14, -43, + 38, -53, 67, -25, -22, -60, -46, -33, 31, -2, + -38, 20, 13, 18, 10, 20, 1, 1, 4, 9, + 35, 13, 30, 1, -16, -1, 13, -7, 1, 29, + 17, 16, -19, -10, -6, 16, -10, -15, 11, -5, + -4, -15, 13, -8, 2, -5 + }, + { + -18, 275, -19, 17, 54, 0, 5, -7, 29, 54, + 58, 23, 175, -168, 10, 272, 141, -135, -149, -431, + 50, -32, 414, 55, -160, 10, 227, 309, -49, 19, + -90, 106, 36, -78, -89, -89, 87, -44, -10, 122, + -31, -118, 136, 84, -85, 48, 28, -22, 26, -52, + 10, -48, 18, 64, -30, 20, -97, 19, 5, -89, + -8, -20, -44, 9, 48, -64, -36, 7, 6, 19, + -14, -16, -1, -1, 21, 10, 7, -12, -1, 20, + 0, 7, 14, -8, -6, -4, 1, -10, 4, 13, + 7, 0, -3, 0, 2, -4 + }, + { + 630, -14744, -1341, 66, 128, 11, 93, 98, -7, -81, + 63, 105, 91, -217, 390, 267, 126, 159, 138, -7, + -89, 77, 105, 186, 6, -158, 98, 56, 89, 90, + -12, -142, 123, -139, 222, 493, 154, 104, -73, 194, + -74, -87, -134, 8, 50, 34, -9, -121, 50, 96, + 71, 13, 28, -118, 43, 11, -19, 27, -37, 9, + -46, -3, -17, -50, 26, 43, -42, -12, -14, -33, + -30, -39, 14, -11, -12, -9, 5, -1, -8, -28, + 21, -3, -8, -23, 1, 6, 5, 24, -4, 14, + 7, 1, -9, 12, -9, 3 + }, + { + -57, 472, -157, -80, 86, -10, -28, -37, -31, -39, + -38, -83, -48, -347, -764, 67, -61, 659, -536, -409, + -568, 4, -377, -246, 217, 207, 203, -61, -106, 130, + 81, -33, -67, -238, -1, 160, -133, -24, 162, 143, + -29, -36, -51, 124, -9, -57, 23, -40, 27, -118, + -35, 52, -22, -19, 50, 28, 7, 104, 55, -28, + -10, -38, -12, -3, 4, -57, 6, -28, -15, 17, + 15, 3, -20, -31, 22, 10, 1, 3, 6, 10, + 3, -17, 11, -9, 8, -10, 16, 11, 8, 15, + -1, -11, 2, 0, 17, 0 + }, + { + 766, 932, -2190, -362, -30, -88, 65, -63, -69, 111, + 47, -11, -9, 73, 409, 92, 565, 311, -207, -177, + -21, -169, 47, 111, 103, 93, -29, -93, 71, -7, + -145, -110, 33, -103, 147, 166, 13, -46, -12, -34, + 176, 3, 91, 48, 18, 150, 117, -8, -49, 113, + -61, -62, -46, -59, -25, 8, -35, -9, -8, 30, + -8, -52, -26, 29, -23, 0, -49, 4, -1, 8, + 21, -9, -31, 3, 5, -3, 10, 4, 14, -14, + -26, -13, 0, -2, -18, -3, 4, -1, 8, 5, + -7, 1, -1, -4, 2, -2 + }, + { + 23, 1150, 738, 53, -5, -54, -38, 127, 112, -178, + 70, -153, -285, 322, -505, 211, 1, 53, 509, -185, + 286, 310, -183, -225, -150, 288, 227, 410, 261, 75, + -129, -415, 326, 77, -5, -47, -122, 106, -75, -117, + -56, -18, 154, 11, 17, 0, -73, 92, -8, -26, + -4, 21, -9, -31, 38, 14, -41, -14, 3, 32, + 57, 0, 7, 25, 14, 38, 48, 17, 1, 10, + -24, 10, 0, 13, 2, -7, -10, -16, -9, 4, + -5, -12, 0, -21, -9, 0, -1, 10, -4, -8, + -4, -3, -9, 1, 0, -4 + }, + { + -9, -4971, 70, -23, -343, -250, 318, 55, -133, -26, + -172, 186, -253, -73, 216, -114, -127, -79, -84, -15, + 93, 4, 152, 27, 50, 182, 145, 59, -153, -78, + -87, 35, 97, 6, -103, -278, -33, -66, -20, -89, + -10, 158, 151, -185, 48, -15, 6, 66, 89, -91, + -50, -5, 5, 65, 9, 68, 8, 60, 15, -5, + -49, 4, 6, 14, 21, 9, 9, -31, 13, -3, + 0, 6, 12, -2, -4, -11, -8, 6, -16, -4, + -13, -8, 3, 19, 5, 14, -11, -11, 11, -1, + 2, -7, -5, -9, -3, 10 + }, + { + -38, -168, 44, 68, 134, 161, 123, -40, 166, 32, + 121, 314, -102, 2853, 301, 505, 242, 90, -19, 106, + -258, -984, 74, -35, 130, 272, 384, -44, 53, -179, + -325, 97, -7, -91, -183, -77, -147, 6, 38, 14, + 152, 89, -11, 28, -138, 91, 125, 22, -64, -122, + -81, -58, 59, 19, 40, -1, 39, 5, 21, -25, + 2, -33, 25, 35, -18, 5, 38, 2, -58, -6, + -7, 21, 42, 4, -25, 1, 29, 6, -22, -7, + -5, -12, -19, -3, -3, 9, 20, 13, 13, -13, + 11, 16, -7, -1, 0, -1 + }, + { + 763, -2881, -604, -8, -78, 169, -335, -22, 7, -59, + 73, -3, 206, 84, -1544, -219, 295, -43, -340, 77, + -167, 19, 15, 155, 119, 35, 34, 69, 76, -30, + 171, -18, -17, -46, 31, 31, -85, 0, -89, -137, + 53, 108, -67, 11, -39, 73, -41, -40, 48, -12, + 5, -19, 36, -42, -30, 6, -63, 27, -1, 62, + -39, 4, -26, -27, -23, -38, -41, 9, 41, 19, + -51, -2, -46, -10, 27, 5, -3, -1, 10, -10, + -19, 4, -18, -19, -16, 23, 0, -8, -4, -4, + -8, 15, 7, 1, 10, -2 + }, + { + 42, -259, 159, -46, 46, -42, -103, -163, -27, 145, + 90, -89, -109, 1789, -226, -191, 423, -123, 471, -349, + -177, 403, 190, -679, -166, 335, -202, -62, 15, 85, + -31, -25, -170, 289, 205, 129, -93, 94, 25, -39, + 114, 10, 116, 50, -16, -43, -45, -74, 31, 136, + -5, 52, -8, -104, 41, -26, 80, 32, -5, 25, + 27, -28, -1, 31, 9, 9, -10, -44, -4, -20, + -10, -16, -6, 4, -3, 19, -12, -2, -7, 16, + -16, 4, 10, -16, -11, 8, -10, 3, 11, -3, + -1, 7, -1, 8, 0, 0 + } + }, + { + { + 637, 69, -3341, -495, -106, -60, -128, 2, 52, 74, + -235, -253, 11, -186, 312, -41, 60, 147, -245, -45, + -137, -19, 5, 139, -68, 77, -3, 99, 14, 98, + -171, 3, -85, -4, 14, -58, 4, -49, -33, -121, + 100, -25, 35, 31, 40, 65, 118, 8, -3, -26, + 15, -10, -52, 44, 3, 45, -13, 18, -2, 21, + 6, -13, 5, 28, -14, 4, -13, 15, -4, 12, + -6, 16, -19, 18, 6, -11, 5, 2, 18, -5, + -12, -3, 12, -11, -6, 4, -5, 3, -7, 5, + -1, 9, -7, 4, 4, 2 + }, + { + -17, 406, -1314, -261, 86, -42, -28, -45, 8, 67, + -103, -35, -125, 200, -91, 380, -230, 39, -233, 49, + -27, -87, -28, -5, 208, -181, -116, 100, -196, 78, + -191, 312, -80, -110, 96, -125, 235, 121, 17, 49, + 3, 15, -56, 39, 8, -7, -1, -41, -11, -18, + 23, 28, 46, -26, -12, -32, 6, 10, -6, 26, + 36, -42, 4, -34, 33, -7, -2, 10, 7, -4, + 35, -15, -12, 2, 1, -20, -1, 7, -12, 0, + -1, 8, 6, 4, -2, 3, 2, -8, -1, 1, + -2, -2, 7, -1, 3, -3 + }, + { + -315, 1652, 1438, -482, -517, 123, -104, -53, 90, -25, + 248, -284, -117, 140, -27, 1, 16, -562, -310, 21, + -459, 68, -126, 171, -41, -45, -4, -63, -206, -125, + 126, 31, -48, -73, -124, 136, 17, -211, -18, -104, + -45, 34, -80, 32, 14, 30, -87, -53, 27, 11, + 18, -40, -13, 16, -8, 30, 0, -18, -6, -5, + -10, 59, -20, -9, -28, 19, -55, 16, -15, 7, + -30, 2, -2, -14, -17, 11, 14, 14, -17, 6, + -3, 9, -4, -9, 4, -11, 15, -17, 11, -1, + -1, 7, -1, -5, 8, 5 + }, + { + -130, 8689, -732, 771, -8, -18, 39, -62, 51, 56, + -10, 207, -117, -246, -200, 146, 101, 318, 237, -55, + 69, 99, 67, -27, 84, 88, -31, 41, -76, 69, + 6, -34, 29, 7, 30, -52, 112, -18, -38, 190, + -74, 10, -118, 29, 49, -28, -22, -15, 56, -9, + 35, -58, -20, 9, 25, -12, -7, 31, -23, 26, + 24, -8, -11, 9, 3, 6, -4, 17, 0, 22, + -6, -25, -10, 1, 16, -9, 3, 14, 0, 7, + 3, 17, 0, -2, -3, -4, 4, -4, -8, 10, + 1, -1, 2, -5, 10, -5 + }, + { + 70, -34, -175, -12, -9, 7, 66, 20, 53, 33, + -39, -36, 105, 47, 368, -452, -300, 1405, -1343, 70, + 62, -124, -186, -108, -69, 56, 86, 215, 27, 129, + -93, 79, -45, 171, 64, -75, -9, 81, 184, 110, + -75, -8, -75, -29, 45, 18, -97, 39, -38, 67, + -62, -31, 57, -40, 25, -13, 50, 15, -10, 28, + 22, -26, -16, 49, 8, -7, -6, 20, 2, -4, + -4, 15, -11, 28, 6, 18, -5, 25, 14, -11, + 6, 0, -3, -2, -3, -12, 10, -8, 4, 13, + -6, 8, 0, 0, -6, 2 + }, + { + -935, 16447, -1003, -303, 262, -24, -16, 96, 113, -21, + 97, -37, 27, -47, 187, -37, -327, 56, 97, -29, + 102, -33, 55, -63, 60, -54, 5, 0, -35, 41, + 74, -100, -90, 56, 29, 82, 16, -1, 89, 29, + 173, -28, 30, -53, -221, 37, -118, 126, -42, -2, + 58, -40, 78, -3, 28, -20, -5, -33, 24, -8, + -41, 56, 17, 1, -18, 12, 6, -5, 2, -20, + 15, -11, 22, 2, -13, -3, -1, -6, 2, 20, + -5, 7, -3, 10, -7, 15, -7, -6, 5, -4, + -4, -13, 6, -11, 8, -2 + }, + { + -18, 519, 128, 64, 13, 4, 47, 15, -28, 3, + 0, 19, 72, 241, 675, 171, 50, -205, 266, 231, + 145, -241, 326, 271, -26, -7, 142, -38, -204, 18, + -24, 183, 52, 0, -36, -48, 61, 19, 5, 43, + -67, -66, 83, 13, -95, -13, 4, -5, 21, -79, + 31, 2, 13, 24, -7, 67, -43, 7, 30, -18, + 10, -20, -15, 22, 20, -45, 10, 9, -6, 20, + 2, -3, 10, 11, 6, -12, 5, -5, 4, 7, + -18, -6, 13, -9, 2, 2, 6, -4, 1, -7, + -11, -1, -2, -3, 2, 2 + }, + { + 292, -11378, 1893, 195, 219, 38, -60, 69, 15, -2, + 144, -121, -18, -202, 156, 50, -50, 0, 85, 36, + -191, 64, 101, 146, 42, -60, 86, -19, -20, 53, + -28, -94, 117, -174, 71, 204, -41, 106, -8, 181, + -103, -27, -84, 13, 93, -9, 28, -67, 38, 39, + 7, -2, 75, -58, 49, 33, -36, -15, -16, 28, + -43, 2, -1, -11, 37, 13, -20, 17, 4, -15, + -10, 7, 55, 13, -4, -15, 16, 11, 4, -11, + 20, -6, 9, -6, -2, 2, -1, 5, -11, 9, + 3, 1, -10, 11, -11, -3 + }, + { + -13, 496, -462, -155, -5, -4, 38, 48, -4, -5, + -30, 7, 117, -196, -568, 2, -353, 599, -358, -13, + -135, 162, -30, -8, -69, 148, 95, -42, -41, 64, + -63, -97, 50, -87, -60, 9, -125, -52, -14, 77, + -64, -47, -8, 34, -91, -35, -42, -40, 74, -65, + 19, -5, 8, -13, -22, -13, -18, 66, 23, -22, + 26, -46, -11, 5, 28, -14, 5, -22, 11, 40, + 10, 11, 4, -9, 14, -12, 9, 11, 3, 5, + 0, -26, 11, -6, 7, -3, 11, -4, -4, 1, + 0, -11, 6, -4, 11, 0 + }, + { + -631, 1588, -396, -211, 171, 179, 297, 66, -30, 180, + 13, -181, -54, -13, 84, -64, 489, 162, -56, 6, + -104, -55, 188, 88, 65, 131, -12, -110, 96, 64, + 63, 134, 106, -148, 5, 84, -114, 36, 89, -23, + 33, -59, 27, -47, -35, 6, 28, -28, -95, 54, + -47, 23, 11, -21, -3, 39, -12, -6, -15, 18, + 29, -6, 6, 12, -27, 33, -32, 5, 6, 1, + 15, 6, 5, 4, 5, -10, 9, -7, 15, -3, + -12, 2, 7, 2, -2, 8, 4, -3, 2, 7, + -9, -3, -1, -3, 3, -2 + }, + { + 15, 343, -165, -126, 107, -23, 117, 73, -6, -105, + 152, -125, -130, 543, -265, 132, 150, 37, 192, -206, + 208, 148, 191, 46, -128, 72, 45, 171, 32, 28, + -123, -226, 210, -80, -114, -160, -173, 75, -34, -41, + -79, -25, 118, -47, -20, 16, -103, 45, 21, 16, + -22, 6, 5, 19, 69, -11, -35, -16, -24, 16, + 58, -29, -9, 19, -5, 1, 24, 8, -10, 27, + -13, -12, -4, 9, -11, -10, 3, 0, 4, 2, + -4, -7, 6, -13, 1, 3, -11, 4, 0, 1, + 7, 0, -6, -1, 3, 2 + }, + { + 554, -3572, 187, -104, -109, -281, 229, -2, -43, 153, + -197, 227, -174, -312, 57, 76, 62, 134, 71, -73, + 4, -134, 7, 12, 11, 129, 57, -27, -78, 47, + -5, -8, 30, 8, 6, -79, 79, 1, 58, -51, + 35, -11, -17, -74, 122, -39, 6, -2, 91, -8, + -29, -34, 2, 31, -15, 85, -5, 2, -14, 25, + -24, 3, 1, 3, 5, -1, -1, -20, 11, 3, + -2, 6, 13, 8, 1, 2, 8, 9, -9, 14, + 0, -1, -2, 7, -7, 3, -8, -7, 6, -6, + 0, 3, 4, -5, -2, 5 + }, + { + 33, -469, -245, 21, -101, 13, 21, -41, 105, -18, + 78, 133, -715, 1820, -405, -262, 164, 11, -89, 126, + 121, -230, 548, -51, -151, 161, 111, -249, -72, 34, + -150, 66, -70, -50, -77, 10, 2, 49, 31, -30, + 149, 50, -98, 1, -122, 25, 48, 32, -23, -59, + -1, -44, -25, -44, 35, -34, -4, -20, 25, -30, + 23, -29, -32, -11, -30, -3, 13, -21, -39, 4, + 1, 2, 22, 3, -6, -9, -5, -4, -9, 3, + -1, -14, -8, 5, -1, 3, 4, -9, 14, -3, + 5, 9, -1, 4, 4, 0 + }, + { + -167, -3354, 57, 91, 82, 472, -404, -49, 56, -12, + 231, 2, 3, 48, -1288, -126, 368, 160, -116, 189, + -93, 64, -70, 29, -19, 0, 63, 95, 88, -74, + 90, -73, 39, 8, 7, -26, -18, 50, -22, 1, + 8, 92, -26, 17, -64, -5, -42, -17, 23, 27, + 7, -43, 66, 10, -14, 27, -46, 35, -31, 39, + -31, 9, -30, -25, -11, 2, -5, -5, 10, 16, + -23, 14, -20, -18, 11, -5, 2, -1, 4, -1, + 2, 8, -16, 7, -9, 19, 14, -3, -10, 5, + -7, 7, 5, 0, 7, -7 + }, + { + -28, -395, 99, -51, -15, -16, -6, -59, -90, -128, + -100, -78, 133, -409, -2827, 214, 307, -274, 223, 100, + 89, 55, 182, -276, -29, 145, -235, -10, 49, 139, + -45, 67, -41, 120, -106, 50, -25, -24, 39, 12, + 79, -27, 66, -53, 0, -16, -16, -44, -11, 67, + -77, 18, 6, -115, 49, 6, 42, -33, -14, 20, + 15, -28, 5, 22, -3, 5, -1, -10, 28, -8, + -4, -4, -5, 10, -2, -1, -14, -5, -7, 10, + -13, 5, 6, 1, 0, 9, -5, 1, 2, -7, + -3, 4, -2, 5, -11, -4 + } + }, + { + { + -634, -2321, -155, -406, -220, -54, -51, -131, 54, -30, + -171, -107, 10, -57, 28, 9, 90, 9, 57, -289, + -68, 65, 27, 48, -16, -17, 154, 76, 17, -25, + -23, -15, -22, -14, -32, 2, 4, -75, -17, -15, + 7, -42, 20, 31, 21, 79, 93, 55, -3, -22, + -33, -24, 8, 27, 16, 17, -1, 44, 23, 6, + -16, -2, 25, 22, -16, 24, -18, 11, 9, 5, + 7, 3, -6, 11, 3, 1, 1, 8, 5, -12, + -11, -2, 2, -5, -6, 7, 0, 0, -2, -3, + -1, 4, -3, 2, 5, 2 + }, + { + -95, -1098, -245, -90, -193, -22, -42, -51, -34, -12, + -3, -41, -80, 5, 186, 89, 63, -79, 38, -33, + 88, -111, -14, -53, 101, 8, -64, 10, -140, -61, + -85, 59, -46, -28, 73, 64, 129, 63, 12, 71, + -32, -28, -6, 18, 17, 11, -24, -33, -21, -21, + 4, 15, 16, -9, -19, 34, 11, -8, -16, 18, + 0, -29, 4, -7, -7, 1, 10, 2, 8, 5, + 6, -3, 4, 1, -16, -7, 5, 2, -5, -10, + 4, 11, 8, 0, 0, -4, -2, 1, -5, -1, + 3, 2, -1, -4, -3, 1 + }, + { + 408, 3192, -334, -925, -254, -7, -53, -9, 35, 164, + -12, -268, -48, 65, 34, -172, -8, -209, -334, 5, + -392, 40, 13, 75, 29, -62, -51, -52, -157, -70, + 4, 24, -42, -15, -53, 36, -57, -54, -45, -77, + -53, 30, 2, 5, -15, -42, -20, -48, -1, 27, + -1, -40, -40, -13, 15, 40, -14, 11, -12, 12, + -13, -7, 1, -13, -3, -15, -23, -10, -4, -3, + -14, -11, -23, -3, -4, 9, 19, 3, -9, 9, + 5, 2, -7, -4, -2, -8, 1, -3, 3, 1, + 6, 4, 6, 1, 3, 2 + }, + { + 757, 5438, 946, 536, 63, 33, -21, -25, -3, 65, + 82, 58, -55, -133, -72, 29, 172, 339, 67, 1, + -13, 136, 32, 49, 83, 93, -3, 24, -41, -22, + 15, 42, -30, -9, 2, 22, 17, -7, 17, 67, + 14, 10, -81, -14, 10, -28, 1, -8, 66, 24, + -25, -26, -1, -21, -10, 1, 3, 21, 1, 18, + 10, -20, 7, -1, -1, -9, 11, -1, 7, 12, + -1, -7, 7, 5, -3, -7, 1, 7, 8, 0, + 7, 7, 5, -3, -3, 2, 4, -5, 2, 0, + 0, -4, 3, 0, 1, 4 + }, + { + -79, -111, 62, -1, -24, 20, 60, 1, 22, 17, + 26, 24, -60, -68, 253, 39, 152, -410, -31, -41, + 145, -136, -277, 33, 65, 54, 67, 81, 76, -36, + 61, 113, 38, -6, -16, 0, 14, 79, 138, 63, + 7, -70, -14, -13, 2, -39, -56, -19, -11, 8, + 8, -15, 1, 8, 2, -7, 31, -8, -17, 28, + 11, 6, -3, 15, -11, -25, 12, 5, 9, -2, + -12, 16, 11, 3, 9, 8, 9, 10, 4, -4, + 0, 3, 5, -6, -3, -2, -3, 2, 0, 6, + 3, -2, 0, 1, -1, 1 + }, + { + 1721, 10044, 1190, -181, 78, 65, 14, 10, 103, -11, + -65, 49, 13, 40, 32, -2, -138, -14, -9, 33, + 37, -22, 78, -21, 17, -51, -10, -5, -46, -2, + 87, -69, 7, -45, 126, 50, 36, 1, 52, 63, + 52, 1, -32, -105, -73, -34, 12, -5, -6, 34, + 5, 13, 25, 2, 18, -9, -12, -34, 31, 10, + -21, 23, 3, -2, -13, 4, 2, -1, 10, -17, + -4, -2, 3, -2, 1, -9, -4, 2, 5, 9, + 1, 10, 7, 6, -1, 0, 0, 0, -3, -1, + -8, -5, 1, -1, 3, -2 + }, + { + 34, 307, 144, 76, 0, 10, 41, -1, -16, 9, + -27, 32, 2, 307, 564, 219, 122, -20, 97, 468, + 139, -55, 203, 210, -136, 72, 112, -94, -106, -40, + 79, 45, 22, 69, -27, 22, -7, 23, 25, -28, + -23, 8, 16, -37, -33, -12, -7, 12, 5, -33, + 4, 3, 13, -6, 27, 9, 15, -8, 10, 28, + -2, 11, -6, 19, -6, 5, -5, -11, -5, 24, + 20, -5, -9, 12, -7, -10, 3, 2, 0, -8, + -10, -5, 6, 0, 1, -3, 5, 2, 1, -5, + -3, 1, -3, -3, 3, 1 + }, + { + -790, -6436, -318, 192, 55, 12, -45, 56, 9, 14, + 36, -45, -23, -66, -34, 65, -45, -33, 40, 49, + -92, 26, 0, 118, 58, 1, -7, 40, -54, 6, + -10, 42, 23, -99, -31, 0, 25, 94, 77, 12, + -52, -56, -22, 49, 65, -20, -12, 40, 4, -18, + 29, -9, 36, 30, -12, 16, -13, -16, 14, -11, + -9, 1, -19, 5, 31, -1, 1, 3, 4, 9, + 2, 10, 30, 7, -9, -4, 12, 2, 8, 8, + 4, 7, 4, 3, 1, 3, 1, -8, -7, 0, + 6, 2, -2, 0, -5, -6 + }, + { + 59, -219, -206, -20, -43, 10, 33, 30, 0, -36, + -56, 76, 14, -58, -406, -204, 120, 61, -38, 102, + -148, 58, 28, 146, -67, 39, -38, 28, 50, -41, + -170, -20, 7, 26, -46, -94, 3, -88, -62, 46, + -65, -38, 11, -67, -74, -10, -36, -8, -25, 31, + 10, -8, 34, -21, -38, -12, -4, 0, 14, -1, + 10, -1, -16, 14, 34, 21, -13, -4, 6, 17, + 26, 11, 5, 3, -11, -4, 7, 2, 7, 3, + -1, -6, 9, 0, -4, 3, -4, -9, -4, -1, + 1, -3, 1, -2, 1, 0 + }, + { + 520, 732, -545, -133, 14, 233, 301, 122, -54, 46, + 6, -197, 28, -82, -89, 63, 193, 218, -41, 6, + -68, 57, 109, 106, 53, 49, 24, -4, -11, 90, + 108, 153, 41, -81, -92, 24, -70, 57, 38, 36, + -56, -28, -6, -38, -19, -33, -21, -12, -49, -62, + 9, 19, -21, -5, 13, 26, 8, 4, -5, 1, + 23, 14, -1, 3, -12, 3, -4, 5, 6, -4, + -1, 17, 5, 4, -2, -1, 3, 0, 4, 6, + -1, 2, 3, -3, 1, -1, -3, 0, -4, 2, + -3, -2, 0, 0, -2, -3 + }, + { + -44, -47, -14, 184, -29, 5, 84, 41, 1, -57, + 53, 43, 73, 145, -65, 181, 65, -41, 74, 67, + 146, 33, 192, 36, -56, 46, 25, 42, 20, 27, + -95, -5, 38, -9, -160, -150, -39, -23, -14, 5, + -66, -6, 11, -28, -2, -36, 3, -13, -17, 27, + -7, 1, 9, 52, 61, -11, -24, -9, -23, 14, + 19, -16, 5, 5, 6, -8, 1, -2, 1, 6, + 4, -13, -8, 5, -14, -7, 9, 12, 6, -3, + -2, -2, -4, -2, 4, -1, -5, 1, 5, 5, + 3, -1, -3, -4, 2, 0 + }, + { + -606, -1405, -203, -75, -152, 94, -44, -36, -17, 99, + 71, -2, -66, -70, -18, 96, 40, 65, 76, -12, + -43, -85, -44, 0, 72, 28, 33, -22, -38, 55, + 84, -51, -23, 13, -1, 30, 47, 84, 54, -8, + -26, 11, -126, 49, 47, 3, 28, 1, 27, 2, + -23, 3, -16, 2, 10, 40, 6, -11, 9, 15, + -5, -1, -1, 2, -4, -4, -1, 7, 4, -7, + 4, 10, 6, 2, -2, 6, 5, 9, 5, 0, + 5, -1, -4, -1, -3, -2, 3, -8, -2, -5, + -3, 2, -1, 0, -3, 0 + }, + { + -27, -384, -120, -146, -95, -10, -43, 6, 24, 82, + 26, 23, 462, -107, -69, -248, 14, -18, -4, -9, + 158, -193, 392, 65, 110, -102, -26, -50, -183, -39, + -53, 30, -36, -63, 52, 16, 49, -28, 19, 28, + 68, 17, -57, -2, -51, -46, 14, -14, 12, -22, + -34, -48, -42, -32, 12, -11, -30, 5, 2, -10, + 35, -22, -46, -34, -12, -6, 5, -21, -16, 2, + -6, 11, -4, 10, 6, -17, -14, -10, 8, -3, + 4, -4, 1, 10, -4, 1, -4, -5, 6, 7, + 2, 3, -3, 3, 4, 0 + }, + { + -302, -2463, -335, 160, 110, 90, -66, -1, 52, 24, + 162, 18, -15, -372, -438, 66, -1, 131, 113, -32, + -25, 54, 17, -77, -36, -30, 76, 73, 66, -77, + 33, -46, 19, 89, -60, 40, 4, 68, 14, 18, + -7, 80, -19, -10, -12, -28, -7, -42, 15, 18, + 19, -13, 15, 32, 16, 30, -6, -1, -18, -3, + 13, -15, -20, 0, -1, 4, 8, -2, -2, 6, + 10, -7, -8, -7, -2, 5, -1, 1, 4, 11, + 6, 1, 1, 7, 0, 7, 7, -1, -6, -2, + 1, 5, 2, 3, 3, -5 + }, + { + 15, -235, -100, 14, -80, 17, -11, -43, -77, -64, + -91, -37, 137, -938, -1849, -122, 153, -56, -53, 437, + 163, -112, -30, -129, 45, -21, -107, 7, 50, 162, + -87, 38, 12, 6, -54, -18, -29, -31, 52, 48, + -24, -7, 31, -36, 1, 16, -18, 6, -52, -12, + -6, -19, -16, -33, 0, 12, -3, -30, -5, 0, + -4, -15, 21, -1, 3, 3, -3, 12, 5, 3, + -5, 1, -4, 7, 0, -5, -4, -11, -6, 4, + 1, 3, 4, 3, 1, 2, -5, -2, 3, -3, + -3, 3, 1, -4, -5, -5 + } + }, + { + { + 701, 474, 1231, -280, 43, 8, 0, -60, 40, -20, + 57, 47, 29, -44, -31, 7, -6, -108, 168, -126, + -19, 32, 13, -16, -14, -22, 80, -31, -23, 14, + 25, -42, 23, 9, 1, -34, 11, -15, -9, 31, + 24, -36, -1, -20, -33, 43, -1, 34, 26, -16, + -13, -14, 6, 14, 6, 9, -5, 28, 9, -6, + -7, -11, 5, 5, -13, 30, -18, 11, 7, 3, + 1, -4, -1, 2, -4, 4, 5, 8, -6, -5, + -4, 1, 6, 2, -3, 1, 5, 0, -1, -1, + 0, -2, -1, 1, 1, -2 + }, + { + 118, -988, -106, 185, -22, 16, -17, -4, 14, -24, + 12, -6, -62, -99, 114, -134, -26, 27, 341, 109, + 51, -90, -30, -81, 17, 13, -73, 67, -53, -70, + -40, 51, 24, 53, 32, 47, 15, -36, -6, 32, + -37, 6, -7, 30, 2, 11, 3, 19, -10, -5, + 17, -2, 0, 2, -1, 15, 6, 3, -12, 0, + -4, -7, 11, 6, -11, -3, 5, 6, 4, -1, + -3, 9, 13, 9, -9, 7, 8, -1, -5, -10, + 3, 4, 0, -3, -2, -5, 0, 3, -3, 3, + 3, 1, -5, -2, -1, 3 + }, + { + -359, 2362, -185, -552, 164, 65, -32, -3, 0, 49, + -100, -95, -8, -9, 179, -110, 42, 26, -21, 156, + -62, 135, -79, 0, 10, -93, -39, 27, -10, 48, + -12, 32, -10, 23, 31, 20, 15, -4, -25, -5, + -13, 33, 9, -6, -24, -33, 10, -29, -8, 15, + 2, 6, -12, -9, 0, 23, -18, 14, -13, 15, + -16, -20, 19, 14, 4, -15, -6, 3, 6, 2, + -1, -2, -15, 9, 6, 6, 1, -7, 4, 10, + -4, 1, 0, -4, -4, -5, 0, 4, 2, -1, + 5, 1, 2, 3, 1, -1 + }, + { + -909, 1856, -29, 388, -22, 18, 11, -9, -4, 76, + 68, -55, 23, -30, 27, 31, -17, 151, -17, -27, + -45, 41, -19, 24, -19, -22, -85, 53, -14, -19, + -7, -5, -25, 12, -6, 15, -25, 2, -1, 26, + 20, 18, -21, -18, -23, -6, 38, -15, 38, 2, + -29, 8, 3, -16, -10, 10, 7, 8, 1, 4, + -5, -20, 12, -6, 6, -6, 3, -2, 1, 5, + 5, 5, 7, 2, -3, -6, 0, 1, 2, -6, + 0, -3, 3, -3, -3, -1, 0, 2, 3, -5, + -1, -2, 2, 0, -1, 4 + }, + { + 57, -39, -63, 3, 12, -5, 19, -1, -2, 21, + 39, 26, -108, -3, 264, -14, 61, -616, 472, 22, + 133, -4, -89, 46, -43, -61, -43, 5, 11, -4, + 30, 42, -21, -34, -61, -53, -4, 23, -5, -5, + 46, -43, 22, 13, -4, -26, -37, -22, 14, -5, + 35, 0, -23, 20, -4, -5, -3, -14, -2, 11, + -19, 0, 1, 10, -3, -9, 13, -8, 0, 2, + 4, 8, -3, -12, -2, -5, 5, -1, -2, -2, + -2, -1, -1, -5, 5, 0, -3, 3, -4, 1, + 1, -6, 0, 3, -1, 0 + }, + { + -1751, 3296, -222, -186, -24, 24, -28, -12, 12, -43, + -17, 28, 47, 50, -69, 46, -5, 5, -20, 6, + -10, -5, 70, -8, 23, -21, -29, 21, -54, -21, + 63, -6, 33, -131, 55, -17, 59, 31, 25, 2, + -51, -9, -1, -12, 46, 20, 46, -20, -11, 8, + -4, 1, -16, -10, 23, -3, 0, -18, 19, 11, + -13, 3, -7, 2, 8, 1, -3, 5, 10, -2, + 4, 3, -4, -5, 8, -9, 4, 5, 5, 0, + -4, 7, -2, 0, 1, -4, 2, -1, 2, 0, + -4, 0, 3, 4, 0, -4 + }, + { + 5, 45, 5, 3, -14, -8, 11, -10, 3, 0, + -23, 19, 49, 3, 76, 112, -25, 12, -92, 57, + -48, -158, -70, 111, -23, 28, -40, 7, -73, -31, + 84, -21, 3, 44, 16, 50, -2, -6, 5, -21, + 15, 22, 3, -28, -12, 17, 14, 10, 12, 1, + 17, -3, 4, -7, 4, -21, 9, -13, -12, 19, + 6, 28, -9, 7, -6, 17, -5, -6, -6, 12, + 6, -6, -4, 9, -8, 2, 1, -4, -3, 0, + 1, 2, 4, -1, 0, -2, 5, 3, 4, 1, + 3, 1, -1, 3, 1, -1 + }, + { + 854, -2923, 174, 106, -31, -5, 4, -31, -4, -3, + -35, 19, 17, 3, 56, 65, -20, 38, -19, 29, + -3, -17, -66, 39, 36, 28, 3, 41, -27, -26, + -31, 30, -4, -25, -2, -80, -24, 9, 1, -4, + 13, -21, -4, 40, 15, -5, -3, 29, -65, -53, + 14, -5, 16, 16, -16, 3, -7, -1, 17, -3, + 1, -13, -24, 8, 18, -16, 0, -4, 2, 9, + 0, 1, 5, -5, -2, 3, -1, 0, 7, 3, + 1, 4, -3, 2, 2, 0, 1, -1, -1, -1, + 2, -1, -2, -1, 1, -2 + }, + { + 4, -514, -53, 45, -6, 15, 9, 3, 7, -1, + -33, 71, 5, 182, 45, -1, 213, -108, -65, 191, + -45, -71, 57, 133, -36, -5, -158, 44, 24, -44, + -112, 26, 27, 37, 33, -20, 31, -72, -35, 4, + -30, 4, 3, -34, -23, 20, 10, 23, -40, 34, + -2, -24, 13, 6, -2, -1, -6, -20, 10, -4, + 10, 20, -10, 6, 9, 8, -10, -2, 0, -4, + 3, -3, -4, -4, -4, 4, 5, -1, 3, -3, + 4, 4, 1, 0, -1, 3, -4, 0, 0, -4, + 1, 2, 0, -1, -2, -2 + }, + { + -385, -102, 132, 6, -40, -209, -139, 83, -103, -27, + 59, -108, 73, -20, -35, 67, -96, -9, -13, -16, + -87, 32, 26, -2, -40, 4, 4, -6, -35, 4, + -47, 7, 12, 17, -19, 48, -28, 32, 11, 2, + -46, -8, 35, -1, -13, -21, -6, 10, -2, -28, + 16, 7, -23, 7, 15, 7, 7, 11, -3, -10, + -19, 1, -4, 12, -2, -14, -2, 1, -4, 7, + -9, 1, -7, 11, -3, -1, -2, 8, 1, 8, + 2, 4, -4, -4, -3, -5, 0, 2, -5, -1, + 1, 3, 1, -2, -2, -2 + }, + { + 40, -96, -57, 322, -21, -27, -17, -11, 23, -37, + 23, 89, -42, 55, -153, 127, 23, -273, -32, 188, + -12, -100, 87, -26, -33, 24, 8, 0, 12, 13, + -21, -5, -52, 5, -19, -2, 45, 6, 14, 21, + -34, 4, -11, -14, 12, -27, 37, 5, -26, 5, + 9, 4, 1, 26, 17, -8, -10, 1, -2, -2, + -22, 1, 17, -3, 5, 0, -8, -7, 6, -5, + 0, -4, -7, -1, -4, 5, 3, 5, -1, -1, + 0, -2, -6, 3, 4, -2, 2, 3, 1, 0, + 1, 1, 0, -1, -1, 1 + }, + { + 354, 194, 41, 20, -155, 148, -57, -14, 0, 35, + 79, -50, 56, 86, -76, 0, -31, -49, -2, 30, + -25, -30, -17, -30, 31, -6, -4, 34, -12, 15, + 36, -7, -19, -20, 28, 42, 19, 26, -21, 26, + -13, 38, -44, 85, -1, -1, 31, -5, -3, 6, + 1, 29, -9, 12, -4, 7, -5, -13, 9, -5, + 1, 17, 2, -4, 3, 1, -1, 10, 6, -15, + 5, 4, -2, -6, -2, 5, -2, 3, -2, -5, + 1, -4, -2, -4, -2, 4, 3, -3, 0, -3, + 0, -2, 0, 2, -2, -2 + }, + { + 13, -227, 70, -95, -47, 6, -26, -7, -4, 38, + -34, 113, 94, -899, -3, -18, 19, 59, 56, -33, + 38, -382, 173, 31, 205, -90, -40, 4, -47, -12, + 27, 30, 15, -35, 39, 14, 30, -19, -8, 8, + 24, 12, -16, 52, -4, -21, 11, -26, 12, -23, + -38, -5, 8, 3, 20, -5, -5, 19, -2, -4, + 24, -12, -14, -8, 6, -1, 10, 2, -6, 10, + -1, 9, -14, 7, 4, -12, -4, -5, 12, -1, + 7, 1, 2, 4, -6, 5, -4, 2, -2, 1, + 0, -1, -5, 5, -3, -2 + }, + { + 454, -932, -23, -53, -12, -79, -60, -44, 42, 52, + 41, 14, 58, 89, 319, 167, -184, 35, 53, -105, + -14, 13, 17, -53, 31, -58, -1, -34, 13, -42, + 26, 0, 1, 43, -84, 48, -30, 16, 0, 26, + 28, 42, -31, 14, 15, -14, 13, -22, 17, 0, + 44, 1, -11, 16, 8, 12, 4, -3, -10, -19, + 17, -5, -4, 8, -6, 2, 9, -1, -5, 3, + 7, 3, 0, 0, -5, 10, -3, -1, 2, 4, + -3, 1, 6, 0, -2, 2, -5, -2, 1, -3, + 1, 3, -2, 1, -1, -4 + }, + { + -22, -146, -23, 61, -37, 23, 3, -2, 1, 59, + -7, -9, 38, 330, 466, 242, 81, 37, 52, 315, + -55, -92, 59, -100, 16, -11, -14, 45, -3, 57, + -83, 41, -16, 14, -12, -50, -10, -21, -19, 28, + -50, -19, -3, -3, 15, 26, -16, 28, -19, -11, + 20, -4, -4, 4, 1, 12, -4, -11, -1, 2, + 11, -3, 4, -11, 11, 12, 9, 0, -1, 10, + 7, 3, -3, 4, -3, 10, 1, -4, -2, 5, + 2, 1, 1, -5, -4, -1, -3, -3, 3, 0, + -1, 3, -1, -4, 2, -1 + } + }, + { + { + -582, 3752, 6, -46, 77, -26, 10, 61, -28, 21, + 65, 17, 5, 15, -26, -45, -6, -23, 58, -24, + -34, 3, -1, -42, -25, -29, 36, -8, -36, 30, + -31, -32, 18, 31, -14, -15, -2, 6, 8, 40, + 2, -6, 1, -31, -7, 11, 14, 14, -13, 3, + 7, 4, -12, 3, -9, 15, -1, -3, -7, -7, + 10, -8, -7, -7, -1, 7, 2, 5, -3, -1, + 0, -4, 3, 1, -5, -3, 4, 6, -3, 6, + 3, 3, 0, 5, 0, -1, 4, 2, 3, 1, + -1, -3, 0, -1, -1, -1 + }, + { + -46, -937, 272, 136, 97, -8, -18, 31, 0, 16, + -16, 2, -66, -59, -20, -69, -33, -40, 150, 197, + -61, -49, -29, -53, -129, 86, -8, 57, -57, -53, + -35, 10, 85, 63, 18, 33, -36, 20, -6, 16, + -21, 16, 17, 17, 7, 11, 18, 17, -2, 17, + -4, 5, 0, 24, -3, -15, -3, -1, 2, -2, + -2, 10, 5, 6, -1, -2, -3, 18, 2, -7, + 4, 14, -1, 4, 6, 8, -2, -4, -3, -2, + 1, -2, -2, -1, -1, 1, 2, 0, 2, 1, + -3, 1, 0, 3, 0, -1 + }, + { + 196, 1909, -555, 7, -28, 59, 4, -26, -6, -26, + -75, 14, -49, 63, 115, -11, -30, 0, 190, -40, + 45, 68, -66, -32, 27, -69, -18, 30, 16, 62, + -27, -58, 83, 30, 2, 10, 43, -14, -36, -33, + 20, -2, -4, 9, -14, -8, 1, -7, -2, 13, + -23, 32, -14, 11, 12, -3, 3, 7, -9, -11, + -1, 2, 17, 8, -5, 1, 0, -1, 4, 3, + 5, -4, 1, 2, 3, 0, 0, -4, 8, 2, + -1, 3, -1, -6, -1, 3, 0, 0, 0, 3, + -1, -2, -1, 1, -2, 1 + }, + { + 665, -689, 103, 303, 26, 26, 26, -15, 21, 48, + 9, -61, 82, -47, 14, -6, 51, 34, -51, -31, + -23, 10, 5, 0, -44, -48, -63, 28, -4, 39, + 2, -41, 18, 1, -10, 21, -18, 6, -7, 11, + 13, 4, 9, -14, -39, 25, 22, 8, 12, -18, + -5, 10, -10, 1, 4, 4, 12, -2, 7, -9, + 6, -2, 1, -1, 12, -2, 2, 4, -4, 8, + 2, -1, 1, 0, 3, -6, 4, -3, -1, 0, + 2, -2, -1, -4, -3, -3, -1, 2, -3, -2, + 2, 1, -2, 3, 1, 2 + }, + { + -41, -12, -36, 18, 20, -17, 3, 54, -32, 14, + 66, -11, -5, 113, 107, -180, -259, 206, 49, 88, + -19, 28, 75, -88, -144, -38, 2, 55, -63, 43, + 12, 34, -57, 16, -41, -22, -24, 1, -19, 17, + 8, 3, 18, 38, -25, -9, -18, -17, 24, 18, + 13, 4, -20, 23, -3, -9, -12, 4, 1, 6, + -11, -9, -5, 8, 20, 7, 2, -11, 1, 4, + 5, 0, -7, -8, -2, -7, 5, 2, 4, 1, + 0, -1, -7, -1, 2, 0, 1, -2, -1, 2, + 1, -1, -1, 1, -1, 0 + }, + { + 1215, -1540, 82, -140, -32, -15, 9, 18, -52, 7, + 71, 11, 41, -33, -11, 19, 17, -3, -13, 34, + 16, 4, 31, -8, -9, 17, -48, 33, -48, 1, + 12, 6, -36, -30, -49, 23, 42, 43, -2, 6, + -1, -7, -29, 18, 49, 38, 3, 0, -11, 17, + -21, -3, -8, 3, 17, -6, 12, 10, 1, -3, + -10, -4, 14, 9, 7, -8, 2, 10, 2, 10, + 1, 8, -3, -4, 3, -6, 12, 0, 0, -1, + -3, 1, -8, -2, 2, 2, 2, 2, -1, -2, + -1, 2, 2, 0, -1, -2 + }, + { + -31, 59, 87, -40, -7, -4, 8, 7, 7, -17, + 1, 2, 79, -123, -36, 46, -80, 28, -38, -153, + -60, -72, -56, -36, 26, 22, -121, 38, -59, -23, + 33, -7, -22, 65, 27, 39, 0, -34, -9, 18, + 22, -17, 6, -21, -3, 17, 26, 15, 5, 6, + -1, 5, 6, -10, -7, -6, 2, -8, -14, 4, + 9, 11, -12, 0, 5, 8, -1, 10, -1, -3, + -4, 3, 7, 2, -1, 7, 2, 5, -1, 2, + 1, 4, 0, -1, 1, 1, 2, -1, 3, 0, + -2, -2, 1, 3, -1, -2 + }, + { + -714, -623, -147, 76, -28, 3, 14, -58, -10, 6, + -16, 2, 1, 68, 34, 68, -4, 7, -15, 14, + 19, -32, -12, 24, -19, 50, 44, 12, 14, -44, + 0, -31, -6, 17, 18, -23, -1, 9, -20, -3, + 7, -3, 3, -3, -2, 53, -30, -28, -43, -19, + 13, 8, -6, -13, 12, -5, 1, -1, 12, 0, + -2, -12, 0, -1, -7, 0, -3, -7, 6, 1, + 4, 1, -3, 3, 3, -3, 0, 9, 0, 1, + 2, 2, -5, 1, 1, -1, 2, 5, 0, -1, + 0, -3, 0, 3, 1, -1 + }, + { + -56, -180, 37, -47, 19, 1, -15, 25, 22, 10, + -2, 6, -8, -23, 374, -94, 44, 53, -32, 68, + 25, -112, 103, 74, 75, -138, -13, 7, -69, 7, + -65, 12, 39, -4, 48, 12, -7, -42, 4, -39, + 25, 6, -3, 19, 3, 5, 29, -1, 4, -6, + -18, -17, -1, 7, 12, -6, 10, 0, 9, -8, + -3, 2, 12, -12, -10, -1, -8, -6, -1, 0, + -4, -11, -2, -5, 10, 1, 2, 3, 0, 0, + 0, 1, -6, 0, 3, 2, 0, 7, 1, -4, + 0, 3, -1, 2, -1, 1 + }, + { + 214, -1041, 309, -17, -55, -84, -274, -28, -32, -45, + 77, -6, 27, -7, 16, 7, -108, 63, -29, -90, + -10, 22, 29, -39, 6, -35, 3, -23, 22, -49, + -15, -28, -18, 57, 28, -7, 15, -11, 16, -18, + 4, 2, 36, -7, -9, 24, 11, -5, 5, 28, + 0, 0, 11, -6, -6, 12, 11, 4, -5, -9, + -27, -5, 6, 9, 2, -13, -3, -2, -3, 9, + 2, -8, -5, 10, -2, 1, -2, 4, 4, 1, + -2, 1, 1, -1, -4, 4, 4, 2, 1, -1, + 1, 2, -2, -3, -1, 3 + }, + { + -22, -85, 179, 103, 6, 14, -71, -14, 4, 45, + -2, 30, -35, -61, 7, -22, -46, -137, 29, 162, + -135, -31, 9, -23, 11, 26, 33, 7, 31, -34, + -19, -46, -25, -43, 58, 34, -25, 18, 4, -3, + -9, -12, 11, 24, -13, -7, 20, -2, -2, -5, + 18, 2, 3, -8, 1, 4, -2, -7, 8, -10, + -9, 5, 1, -2, 2, 10, -3, 2, 7, -5, + 1, -2, -5, -3, 3, 2, -6, -6, -3, 3, + -1, 0, -1, -1, -4, -3, 3, 3, -3, -4, + 3, 1, -2, 0, 1, 1 + }, + { + -71, 863, -61, -21, 5, -21, 7, -20, 28, 18, + -18, -81, -7, 103, -28, 27, -95, -62, 0, 20, + -39, 18, -7, -7, -39, 32, -9, 69, -13, 5, + -8, 20, -29, -37, 29, 14, -14, -24, -25, 35, + 15, -8, 45, 35, 11, -8, 21, 0, -7, 6, + 21, 17, 10, 8, 6, -3, -3, -14, 11, -17, + 14, -2, 7, 1, 10, -10, -2, 1, 1, -3, + 7, -3, -2, 1, -1, 4, -2, 1, -6, -4, + -2, 2, 0, -1, -2, 4, -2, 0, -1, 0, + 3, 0, 4, -2, -1, 1 + }, + { + 4, -198, 42, -71, 23, -8, 21, -27, 10, -42, + 20, 137, -286, -291, 13, 55, -36, 137, 10, -11, + -254, 31, 56, 20, 164, 30, -117, 60, -40, 49, + -36, 61, -18, -24, 16, -24, 20, 5, 3, 11, + 16, 18, 11, 20, -13, 6, 23, 8, -29, -12, + -14, 8, 15, 6, 23, 6, 3, 9, -5, -6, + -10, -3, 8, 3, 2, 4, 0, 4, -2, 4, + 3, -1, 1, -3, 4, -1, 4, -4, 1, 6, + -1, -3, 0, -4, -4, 1, 1, 5, -4, -1, + -4, 1, 4, 3, -4, 1 + }, + { + -324, 227, 58, -296, -12, -95, -155, 23, -29, 75, + -13, 47, 25, 115, 398, 8, -88, 7, -38, -40, + -12, 13, 23, 27, 37, -41, 0, -5, -20, -12, + -12, 30, -28, -36, 3, -13, -23, -15, -21, 24, + 57, 15, 10, -8, -1, -16, -19, 7, -7, 21, + 30, 14, -6, -1, -4, -5, 0, -2, -1, -7, + -2, -2, 6, -10, -14, -3, -2, 0, 4, -1, + 2, 2, -1, 7, -6, -2, -2, 3, -2, -5, + -5, -2, 0, -5, 2, -4, -4, 4, 2, -4, + 2, 2, -3, -1, -1, 0 + }, + { + 29, -209, -16, 62, -12, 2, -14, -2, 3, 73, + -25, 54, -73, 553, 635, 177, 49, -11, 150, 53, + -38, 44, 10, -80, -14, 59, -33, 3, 5, -14, + -15, 2, 11, 4, 17, -34, -4, -1, -36, 4, + 0, 14, -9, 0, 10, 16, -12, -7, 15, 6, + 4, 14, 16, 1, -2, 14, -6, 9, 3, 17, + 20, -2, -14, 1, 17, 9, 0, -7, 6, 7, + 6, 1, 8, 1, 1, 11, -2, 1, 0, 7, + -3, -2, -6, -4, 2, -6, 2, -3, -2, 2, + 0, 0, -2, 0, 1, -2 + } + }, + { + { + 303, 3629, -1615, 15, 250, -27, 6, 100, -13, 15, + 21, 7, 13, -27, -54, -69, 0, 20, 12, 15, + -32, -48, -58, 12, 0, -42, 30, -4, -33, 47, + -40, -30, 11, 28, -13, -19, -21, 21, -4, 31, + 12, 26, 25, -22, 8, -3, 24, -4, -26, 12, + 5, 5, -17, -6, -14, 7, -11, -12, -17, -8, + 3, -7, -7, -5, 4, 1, 1, 1, -7, 2, + 7, 2, 2, -4, -8, -5, 1, 1, 2, 5, + 3, 0, -5, 1, -1, 4, -3, -2, 3, 4, + -1, 0, -2, -2, -1, 0 + }, + { + -14, -1036, 112, 23, 45, -29, -59, 48, 2, 6, + -34, 32, -49, -96, -126, 44, 134, -24, -185, -83, + -165, -38, 31, -26, -85, 91, -23, 11, -35, -12, + -44, -48, 37, 29, 23, 52, -1, 47, 10, 7, + -7, 14, -22, -23, 22, 11, -7, -7, 9, 19, + -9, 12, 0, 12, -15, -11, -13, -4, 6, 7, + 4, 5, 2, -2, 1, 4, -2, 9, 0, 0, + 4, 0, -6, -2, 6, 5, -1, 3, 4, -2, + -1, 0, 1, 0, 2, 4, -1, -2, 2, -3, + -4, 1, 1, 2, -1, -1 + }, + { + -60, 2564, 342, 293, -14, 16, 13, -1, 23, 38, + 17, 55, -21, -52, -13, 33, 38, 87, 133, -86, + -3, 34, -71, 11, 66, -62, -26, 24, -12, 45, + -11, -67, 41, 22, -25, -13, 17, 32, -18, -61, + 17, 6, -29, 8, 26, -14, -4, 7, 3, 2, + -28, 26, -16, 20, -1, -9, 21, 6, -12, -19, + -3, 6, 1, -14, -7, 6, 2, -6, -8, -6, + 1, 3, 4, -3, -1, -3, 7, 0, -2, -1, + -3, 2, -3, -1, 2, 1, 1, -3, 0, 1, + -5, -3, 1, -1, -2, 2 + }, + { + -235, -2186, -127, 251, -17, 17, -2, -15, 15, -13, + -53, -21, 108, -32, -11, 7, -3, -35, 4, 8, + -15, 10, -2, -20, -20, -13, 9, 21, -22, 32, + -7, -39, 18, -8, 12, -7, -20, 11, -7, -4, + -20, 6, 11, -22, -33, 24, -5, 3, 2, -3, + 9, 3, 5, 1, 15, 0, 3, -5, -6, -9, + 14, 9, 6, 4, 6, -3, 0, 1, -1, 5, + -1, -7, 1, 1, 6, -2, 2, -3, 1, 2, + 3, 0, -3, 0, -1, -2, 0, -3, -1, 2, + 2, 0, -2, 2, 0, 0 + }, + { + 44, -44, -103, 32, 3, -11, 14, 43, -41, -1, + 48, 17, 65, -41, 69, -98, -223, 540, -227, 58, + -14, -26, 13, -97, -100, 53, 78, 46, -58, 31, + 8, 22, -54, 19, 28, 38, 7, -5, 0, 44, + 12, 26, -5, 18, -25, 7, 1, -9, 9, 22, + -13, 6, 3, 12, 12, 8, 0, -3, -6, 10, + -3, -14, -11, 8, 10, -4, -4, -8, 6, 2, + -4, 1, 1, 4, 4, -5, 4, 5, 5, -3, + -2, -3, -3, 3, -4, 0, 0, -3, 2, 2, + 4, 3, -1, 1, 2, 1 + }, + { + -461, -3919, 103, -88, 38, -14, 21, -3, -25, 27, + 28, -22, -8, -80, 4, -5, -9, 44, -9, 53, + 50, -44, -9, -33, -25, 4, -16, -1, -46, -13, + -48, -11, -30, 30, -31, 35, 8, 24, 6, 16, + 29, 14, 5, 4, -2, 10, -7, 13, -6, 40, + -11, 5, 8, 11, -6, -17, 14, 4, -3, -1, + -1, 2, 9, 5, 0, -7, 4, 2, -2, 3, + 0, 5, 2, 1, 1, 0, 9, -3, 1, 3, + -3, -1, -4, 4, 2, 4, -1, 3, -4, -1, + 1, 2, -2, -2, 2, 1 + }, + { + 3, 21, -90, -62, -5, 0, 24, 32, 2, -8, + 5, -16, 62, -51, -63, -230, -154, 55, 34, -74, + 9, -39, -82, -20, 31, -47, -76, -17, -69, -38, + -31, -32, -80, 49, -7, -5, -3, -6, -12, 27, + -6, -51, 21, 15, 13, -10, 15, 10, -7, -3, + -2, 2, -5, -23, 0, 1, -2, -6, 1, 7, + 3, 2, -13, -2, 6, 6, 11, 17, 0, -4, + 0, 6, 2, 4, 7, 5, 0, 5, 0, 0, + 1, 3, 0, -2, 1, -1, -3, -2, 0, -2, + 0, 0, 0, -1, 0, 0 + }, + { + 520, 745, -302, 47, 18, 4, -13, 14, 14, 11, + -3, -42, -2, -5, -78, 22, -45, -21, 3, 5, + -7, 1, 6, 28, -51, 19, 20, -32, -9, -16, + 31, -8, 25, 23, 21, 12, 28, 32, -6, -21, + -4, 25, -1, -43, -18, 30, -20, -21, 2, 21, + 26, 2, -9, -8, 22, 2, -3, -6, 4, -3, + 4, 3, 18, 0, -14, 4, -2, -1, 4, -2, + 9, 3, 1, 4, -2, -7, 5, 2, -6, 0, + -3, 0, 1, 2, -1, 0, 3, 0, -1, 1, + 0, -2, 1, 3, -2, -2 + }, + { + 4, 316, 189, -42, 3, -4, -23, 26, 11, 1, + 1, 18, -33, -68, 298, -257, -185, 110, 52, 69, + 73, -57, 66, 25, 34, -118, 73, 24, -53, 18, + -52, 8, 62, 23, 27, -36, 0, 45, 46, -13, + 28, -19, 8, 27, 8, 12, 22, -19, 15, -1, + -13, -9, -2, -14, -1, -15, 14, 5, -4, -7, + 0, 2, 18, -13, -1, 10, -2, 2, 3, -1, + -6, -7, 4, 1, 8, -8, -6, -1, -2, 2, + -3, -2, 2, 3, 1, 1, 2, 4, -1, -1, + 1, 0, -1, 0, 0, 2 + }, + { + -68, -1207, 317, -113, 17, 165, -9, -47, -1, 12, + 38, -33, 5, 0, -8, -10, -30, 112, 11, -51, + 10, 4, 3, -13, 57, -27, -11, -22, 30, -52, + 25, 1, -43, -2, -2, -29, -2, -15, 21, 12, + 30, 0, 15, 6, 15, 28, 13, -2, -1, 25, + -11, -5, 13, -12, -14, 11, 11, 3, -3, 0, + -5, -9, 3, 2, 1, 2, 0, 1, 4, 4, + 5, -4, -1, 1, -4, -1, -1, -5, 7, -3, + -4, 2, 5, 1, 2, 4, 0, 0, 2, 1, + 0, 1, 0, 0, 1, 3 + }, + { + 19, -18, 49, -142, -6, 26, -55, 15, -9, 57, + -18, -54, 14, 21, 86, -71, -57, -5, 73, -3, + -32, 75, -7, -3, 32, 57, 27, 2, 49, -6, + -6, -21, 7, -37, 61, 24, -39, 16, 2, -1, + -16, 12, 39, 12, -21, -2, 2, -12, 6, -2, + -1, -11, -5, -24, -1, 0, 4, -4, 6, -6, + 7, 1, -1, 3, 2, 2, 5, 7, 0, -2, + 4, 2, 4, 2, 2, -3, -5, -6, 3, 1, + -4, 1, 0, -4, -3, -3, -1, 2, -2, -2, + 3, 0, -1, 0, 2, -2 + }, + { + -90, 841, -16, 59, 65, -86, 86, 25, 15, -42, + -65, 18, -48, 85, -20, 10, -20, -27, -11, -12, + -7, 1, -1, 13, -41, 35, -19, 40, 12, 8, + -1, 25, -11, 5, -11, -15, -9, -31, -10, 18, + 34, -3, 16, -26, 6, -26, -2, -5, -7, 5, + 10, -12, -3, -13, 3, -5, 5, -15, 3, -10, + 14, -14, -1, -1, 3, -9, 1, -1, 0, 4, + 3, -1, -1, 1, -1, 0, -1, 0, -4, -1, + 0, 6, -1, 3, 0, 1, 0, 1, 0, 1, + 0, 0, 2, -2, 1, 3 + }, + { + -12, -231, 83, -63, -32, 25, 4, -19, 36, -56, + 35, 98, 203, 585, 62, -47, -60, 86, -70, -17, + -232, 135, 65, -30, 71, 82, -85, 96, -23, 109, + -84, 15, -54, -33, 26, -10, 32, -2, 9, -14, + 6, 5, -7, -4, -7, 1, 3, 9, -1, 16, + -4, -4, 8, 6, 19, 8, -3, 5, -7, -11, + 2, 15, 2, -3, -1, 2, -4, -1, 1, 2, + -2, -8, 3, -7, 6, 3, 7, -1, -4, 3, + -4, -5, 1, -3, -1, 0, 3, 1, -2, -1, + -5, 2, 2, -2, -1, 3 + }, + { + 80, 816, 134, -170, 22, -25, -169, 64, -21, 24, + -67, -15, -32, -219, -15, 36, 56, 11, -32, 0, + -2, 19, 11, 52, 59, 7, 29, 36, -22, -30, + -10, 8, -14, -23, 27, -3, 3, -2, -22, 2, + 21, 21, 9, 0, 18, -16, -16, 25, -26, 15, + 4, 3, -11, -7, -7, -9, -1, 9, 2, 11, + 5, 4, -3, -11, -2, 1, 2, -4, 2, -5, + 1, -8, -3, 1, -5, -2, 0, 0, -2, -3, + -3, -4, -3, -3, 1, -3, 4, 3, -1, -3, + -1, -2, -2, -2, 1, 1 + }, + { + -16, -218, 66, 67, 5, 3, -11, -2, -6, 60, + -9, 29, -47, -215, -800, -105, 33, -16, 93, -98, + 23, 117, -58, -30, 51, 22, -82, -22, 0, -4, + -5, 25, 37, -9, -16, 2, -13, -28, -24, -11, + 47, 22, -15, -2, 11, -6, -12, -5, 16, -3, + -10, 16, 19, -9, -4, 4, -11, -1, 3, 15, + 10, -5, -7, 9, 9, -2, -2, 7, 8, -3, + -4, -4, 3, -2, 0, 0, 2, 3, 1, 1, + -9, -2, -3, 4, 2, -5, 2, -2, -2, 1, + -1, -1, 0, 1, -1, -3 + } + }, + { + { + -205, 1082, 935, -40, 49, 67, -17, 47, 27, -22, + -51, 46, 58, 43, -184, -44, 5, 36, -59, 100, + -32, -64, -25, 4, -19, -8, 47, 2, -27, -6, + -12, 3, -22, 13, -9, 7, -35, 10, -16, 25, + 39, 23, -7, 11, 1, -5, 32, -23, 2, 6, + -13, -1, 7, 1, -2, -12, 9, -8, -9, 0, + -15, -3, 4, 3, 2, 5, -4, -4, 0, 2, + 14, 0, 1, -8, -4, -1, -3, 0, 4, -5, + 2, -4, -5, 0, 1, 2, -6, -2, 1, 0, + 1, 0, -2, 0, -1, -1 + }, + { + 14, -811, -175, -47, -26, 28, -85, 16, 0, 18, + -20, 9, -50, -37, -112, 56, 113, 19, -167, -88, + -53, -51, 18, -18, 9, -12, 30, -74, -15, 24, + -78, -14, -23, 7, 21, 37, 40, 13, 34, -3, + 12, -22, -28, -16, 15, 4, -6, -9, 26, -8, + 0, 4, -8, -6, -4, 12, -8, -2, 8, 1, + -10, -3, 6, -2, -3, 4, 1, -5, 5, 1, + 0, -4, 3, 0, 1, 2, 5, 7, 0, -7, + 3, 1, 3, -1, 1, -2, -3, 0, -1, -2, + 1, 0, 0, -6, 0, 2 + }, + { + 26, 2961, 270, 159, -147, -13, 20, 38, 3, 25, + 15, 44, 87, -128, -87, 35, 16, 102, 28, -8, + 49, -4, -6, 37, -16, -92, -17, 25, 21, -48, + 34, 16, -18, 21, -8, 16, -50, 50, -20, -18, + 4, 28, -15, -21, 28, -28, -6, -14, 5, 8, + -22, 8, -11, 28, -20, -9, 2, 8, 2, -11, + -10, 3, -8, -16, -1, 3, -5, 0, -11, -2, + -5, -1, 1, 0, -6, 5, 11, -1, -8, 2, + -2, -5, 0, 5, -2, -2, -3, 0, 0, -1, + -2, 1, 2, -1, 1, 0 + }, + { + -139, -2393, 12, 200, -60, 16, -13, 14, -16, -11, + -26, 10, 13, 61, 12, 36, 9, -30, -21, 26, + -11, 2, -3, -8, 9, 0, 13, 12, -13, -34, + -12, -11, -4, -29, 24, -36, 3, 3, 7, -17, + -8, 11, -1, -25, -7, -11, -13, 9, 12, 5, + -3, 5, 12, -4, 5, 2, -8, -13, 1, 6, + 0, 2, 3, 5, -9, 4, -8, -3, 8, -5, + -2, 1, 8, -1, 4, -1, 0, -2, 2, -1, + -1, 0, -3, 3, -3, 1, 0, -2, 3, 1, + -2, 0, 0, -1, 0, 0 + }, + { + -42, -135, 147, -15, -14, 15, 12, -6, -25, -12, + 39, 15, 49, 91, 38, -96, 86, -30, -88, 71, + 19, 24, -66, -10, -49, 114, -23, 24, 14, -21, + -4, 53, -26, -31, 56, -3, 38, -29, 28, 46, + 0, 23, -24, -3, -13, -7, -4, -10, -6, 13, + -7, 12, 11, 1, 17, 10, 6, -14, -6, 8, + -2, -16, 2, -2, -13, -10, -5, -3, 6, -1, + -2, 5, 7, 5, 4, -4, 6, 0, -3, -5, + -7, -3, 5, 0, -5, 1, -3, -1, 3, 1, + 2, 0, 1, 3, 0, -2 + }, + { + -152, -4184, 132, -30, -41, 10, -13, -25, 39, -6, + -61, -4, -4, -36, -52, 26, 14, 25, 1, 24, + 12, -61, -7, -27, -3, 4, 9, -31, -18, -29, + -50, -1, 0, 16, -1, 18, -14, 26, 21, 21, + 2, 18, 0, -8, -2, 4, 18, 4, 0, 23, + 4, 3, -5, 12, -12, -8, -6, -12, 10, 8, + 0, 2, -8, 1, -1, -1, -2, -4, 4, -3, + 3, -2, 4, 3, -2, 5, 0, -1, 6, 4, + 0, 2, 4, 6, -1, 0, -2, -1, -3, 0, + 0, 1, -3, 3, 2, 1 + }, + { + 17, -194, -54, 0, -6, 9, 5, 54, -25, 12, + -14, 14, 36, 58, -173, -128, 78, -64, 47, -2, + -24, 10, -118, 6, 74, -116, 56, -96, -29, -25, + -71, 19, -40, 2, -38, -17, 2, 20, -3, -16, + -20, -3, 7, 34, 13, -26, 5, 16, -10, 5, + -3, -1, -12, -14, -8, -1, -6, 1, -3, 12, + 10, -1, 0, 2, 2, 5, 10, 4, 1, 6, + 7, -4, -5, 6, 2, 3, -4, -2, -1, -3, + 2, 1, 2, -2, -1, -2, -1, 2, 0, 2, + 4, 3, -1, -3, 1, 1 + }, + { + -291, 1331, 341, 22, 29, 16, -18, 21, 35, -10, + -17, -9, 3, -94, -77, 12, -21, -3, 23, -16, + -16, 21, -25, 18, -3, -6, 0, -45, -6, -23, + 15, 14, 42, 2, 12, -18, 30, 12, 5, -26, + 5, 9, 25, -35, -28, 10, -7, 3, 17, 11, + 6, -9, 10, 15, 3, 6, -13, -5, 2, 1, + 9, 6, 11, -2, -8, 2, -5, 7, 0, 5, + 8, 1, 2, -2, -8, 1, 0, -6, 1, -5, + -2, 1, 3, 2, 2, 1, 2, -3, -2, 1, + -1, 1, -1, 0, -3, -1 + }, + { + 45, 254, 2, 14, -17, 7, -10, -2, -11, -1, + 15, 49, 13, -31, 56, -111, -115, 76, 65, 75, + -15, 15, 76, -15, -51, -22, 60, 1, -42, -34, + 39, -29, 75, 52, -8, -31, -7, 44, 35, 1, + -9, -21, 16, 2, -6, 12, 9, -6, -1, 9, + -2, -1, -1, -25, -8, 8, -3, -6, -13, 0, + 5, 14, 7, 2, 14, 14, 10, 3, 3, 0, + 0, 1, -1, 1, -4, -7, -6, -2, 0, 1, + -1, 2, 8, 3, -2, -1, -3, -4, 0, 3, + -1, -1, 0, -2, 0, 0 + }, + { + -15, -1189, 38, 57, 45, -34, 250, -54, -17, -12, + -1, -36, -34, 14, -15, 8, -54, 111, -41, 36, + -5, 4, -39, 24, 27, -8, 1, -23, -15, -18, + 20, 5, -15, -90, 23, -11, -7, 4, 17, 18, + 8, -11, 12, 26, -11, -7, 13, 2, -2, -8, + -11, -6, -6, -7, 0, 11, 4, 6, 3, -4, + 9, -8, 1, -1, 1, 2, 1, 3, 3, -4, + 3, 4, 1, -5, -2, -3, 1, -4, 2, 0, + 3, 2, 1, -2, 3, -4, -5, -1, -3, 1, + 1, 0, 3, 2, -1, -2 + }, + { + -24, 151, -174, -10, -23, 22, 15, -27, -18, -20, + 9, 3, 21, -17, 128, -36, -34, -4, -25, -10, + 68, 61, -25, 5, 50, 25, 26, -22, 42, 52, + -13, 2, 8, -29, 33, 0, 15, 15, 2, 6, + -23, 15, 43, -20, 2, 6, -19, -8, -8, -1, + -9, -12, -2, -4, 7, 1, 1, -5, -7, 0, + 4, -7, 12, 5, -1, -8, 3, 1, -5, 0, + 8, 3, 8, -1, -3, -3, 4, 2, 6, -1, + -3, -3, -3, 2, 1, -2, 1, 0, 2, 2, + 0, 0, 0, -1, 1, -1 + }, + { + 134, 562, 111, -10, -40, -40, 69, 68, 21, 4, + -22, 5, 61, -42, 3, -2, 25, 4, -16, -25, + -6, -31, 1, 38, -9, 9, -22, 8, 30, -14, + 14, 18, 20, 19, -20, -4, 19, 3, 17, -10, + 18, 19, -9, -36, 7, -16, -1, -5, -12, 4, + -17, -6, -11, -13, -3, -4, 0, 2, 0, 0, + -5, -4, -3, -5, -8, 6, 5, 3, 1, 0, + 0, 3, 0, -2, -5, -1, 0, 0, 3, -1, + -2, 0, 2, 2, -1, -1, 2, 0, 2, -1, + -3, -2, -3, 1, 1, 1 + }, + { + 10, -169, -19, -44, -32, -13, -5, -1, 35, -34, + 16, 29, 294, 778, -269, -8, -30, -26, -72, -40, + 24, 15, -25, -24, -13, 34, 28, 17, 19, 50, + -72, 17, -46, -6, 7, 54, -1, -15, 24, -29, + -8, 14, -4, -31, 28, -13, -21, -10, 2, 10, + -3, -21, 10, 6, 4, 9, -8, 13, -7, 2, + 16, 12, -9, -12, -1, 5, -6, 5, 1, -1, + -5, -1, -3, -4, 2, -1, -5, 3, 2, -1, + 0, 4, 3, 1, 1, -1, -1, -2, -2, 1, + -1, -3, -4, 0, 2, -1 + }, + { + 121, 906, -152, 116, 26, 43, -101, 59, -3, -22, + -5, -148, -1, 32, -351, 35, 175, -32, -30, 18, + -1, -8, -7, 40, 62, 24, 6, 27, -41, -22, + -9, -9, 31, 20, -14, 12, 34, 20, -6, -6, + -17, -2, 22, 2, 43, 2, 4, -3, 1, 3, + -11, 2, -3, -8, -4, 5, 17, 1, -2, 3, + 12, 8, -7, 5, 6, 8, 4, -1, -1, -1, + 5, -12, -3, -1, 1, 2, 1, -3, 1, 4, + 1, -4, 1, 2, 1, 0, 2, -1, -4, 1, + -4, -2, 1, -1, 0, 0 + }, + { + 2, -140, 9, 20, 32, 6, -11, -25, 34, 23, + 21, 37, -2, -286, -1128, -118, 96, 4, 81, -90, + 118, 17, -22, 10, 47, 23, -51, -29, -15, 5, + -14, 41, 15, -19, -39, 29, -56, -33, 16, -40, + 35, -9, -15, 8, 24, -20, 1, 8, 2, -15, + -10, 7, 5, -4, -1, -3, -18, -10, 4, -11, + -2, -1, 6, 5, 1, -4, 10, 12, 1, -2, + -4, -6, -5, -1, -5, -1, 6, 1, 0, -7, + -2, 1, 2, 3, -4, 0, -3, -1, 2, 0, + 0, 1, 0, -1, -2, 0 + } + }, + { + { + 357, 287, 325, 109, 22, 13, -22, -14, -21, -22, + -28, 31, 29, 25, -140, 66, 18, -13, -63, 115, + -18, -22, 36, -23, -14, 16, 32, -4, -25, -16, + 18, 2, -37, 31, 26, 11, -37, 5, -11, 20, + 29, -3, -38, 13, 20, 10, 15, -4, 18, -15, + -13, 5, 23, 17, 14, -4, 13, 8, 12, 4, + -8, 2, 6, 4, 2, 7, -7, -5, 3, 2, + 6, -7, 4, -1, 2, -3, -4, 4, 0, -7, + 1, 0, -2, -1, 1, -2, 0, -1, -2, -3, + 1, 1, 1, 1, 0, -1 + }, + { + -4, -230, 319, 12, -40, 28, -85, -22, -3, 26, + -24, 1, 11, -1, -73, 13, -47, -3, 74, 73, + -1, -57, -4, -13, 45, -24, 28, -24, 6, 43, + -31, -9, -23, 20, -24, -14, -10, -18, 34, 13, + 20, 2, 7, 1, -4, 0, 3, 8, 13, -10, + 4, -10, -2, 6, 15, 7, -13, -7, 8, -4, + -15, -6, 4, 4, -1, 5, 0, -3, 4, 2, + -2, -1, 4, 1, -1, 4, 2, 1, -5, -6, + 7, 0, 1, -1, -1, -1, 1, -1, -3, 1, + 2, 0, -1, -5, 1, 2 + }, + { + -30, 2513, -67, 53, -21, 25, -2, 24, 9, -20, + -57, 2, 50, -51, 18, -19, -57, 65, -6, -81, + 45, -4, 28, 25, -37, -74, 9, 11, 11, -59, + 33, 0, -48, 12, -2, 26, -18, 35, -11, 25, + 16, 17, -3, -2, 14, -29, 9, 3, 12, 12, + -6, 5, -13, 25, -12, 6, -7, 6, 11, 0, + -8, -2, -2, 2, 0, 1, -6, 4, -2, 5, + -2, -7, -3, 5, -2, 5, 1, -3, 0, 1, + -3, -6, 1, 5, -2, -3, -3, 2, 0, 1, + 0, 0, -1, 1, 0, -2 + }, + { + 292, -1830, -5, 180, -69, 19, -8, 14, -26, 10, + 2, 10, -39, 32, 64, 65, -22, 24, 45, 33, + -6, -8, 14, 8, 6, 0, -12, 1, -30, 9, + 9, -19, -8, -51, 9, -39, -19, 22, 14, -4, + 22, 3, -16, -30, 0, -15, -8, 17, 14, -10, + -4, 4, -3, -9, -14, 2, -2, -14, 4, -3, + -11, -4, -3, -3, -9, 3, -6, 3, 3, -9, + 0, 5, 4, -3, 2, -4, -1, -4, 0, 0, + 0, 2, 1, 1, -3, 1, -1, 2, 1, -2, + -3, 2, 0, -2, 0, 0 + }, + { + 26, -257, -34, -40, -3, 3, -11, -17, -14, -6, + 22, -18, -1, 5, 43, 35, 23, -308, 129, 42, + 35, 64, -78, 38, -72, 50, -72, 7, 41, 36, + 6, 51, -13, -44, 1, -34, 29, -34, 13, 25, + -4, 8, -29, 3, -9, -19, -7, 2, 2, 2, + 13, 18, 6, 11, 8, 5, 6, -8, -1, 6, + 7, -8, 7, -4, -17, -4, 1, 5, 2, -1, + 6, 5, 4, -3, 0, -8, 5, -1, -5, -2, + -1, 3, 3, -4, 0, 2, 0, 2, 1, 0, + 0, -1, 1, 3, -2, 0 + }, + { + 410, -3059, 353, -22, -79, 8, -27, 24, 45, -32, + -34, 15, 14, -26, -31, 109, 28, -17, -4, -14, + -16, -25, 4, -31, 5, 22, -4, 4, 20, 10, + -18, 11, -12, -16, 13, -10, -24, 4, 6, 21, + -10, 5, -41, -2, 17, 5, 5, -9, -10, 8, + 4, -18, -18, 4, -4, 3, -6, -14, 5, 3, + 0, 2, -10, 1, 8, 3, -4, -5, -1, -4, + 4, 2, 2, 1, 2, 0, -2, 2, 5, -1, + 2, 5, 0, -1, -2, 0, 0, -2, 1, 1, + 0, 0, 0, 5, -1, 0 + }, + { + 8, -230, 38, 20, -3, -4, -23, 33, -20, 14, + -9, -1, -1, -16, -167, 44, 153, -50, 80, 41, + -48, 26, -64, 8, 75, -43, 101, -52, -16, 27, + -25, 57, -3, -32, -18, -2, 9, 29, 8, -16, + 3, 41, 10, 16, 1, -10, 3, -1, -3, 18, + -13, -7, -4, -2, -9, -7, -3, 10, -10, 5, + 3, -2, 0, 2, 0, 1, -5, -11, -4, 9, + 2, -9, -3, 1, -3, 3, -7, -3, 2, 0, + 0, -1, 2, 0, -2, 1, 1, 0, 1, 2, + 1, 1, 0, 1, 1, -1 + }, + { + 110, 1330, -49, 5, -43, 15, 17, -24, 12, -16, + -13, 42, 11, -32, 6, -2, 4, 31, 6, -15, + 15, 20, -42, 10, 26, -17, -1, -31, 7, -26, + 6, 4, 25, -8, 7, -20, 24, -6, 13, 0, + 8, -24, 21, -8, -23, 25, -3, 6, -10, -12, + -3, 0, 1, -4, -2, 7, -9, 4, 11, 0, + 6, -1, -1, 0, 0, 4, -2, 9, -1, 1, + 3, 0, -3, -4, -1, 4, -4, -2, 5, -6, + -1, 2, -1, -1, 1, -2, 1, 0, -2, 0, + 1, 1, 0, 0, 0, 1 + }, + { + -6, -69, -26, 37, -5, 9, -18, -19, -8, 5, + 3, 21, -7, 52, 68, -75, 3, 11, -17, 47, + -13, -37, 17, 5, 61, 15, -65, 1, -16, -25, + 87, -63, 22, -4, -31, 25, 2, -13, 25, -18, + -19, -14, -13, -13, -1, 2, 5, 19, 0, 12, + 4, -3, -5, -15, -2, 11, -6, -8, 0, 13, + 6, 1, -6, 5, 7, 5, 6, -2, 1, 3, + 4, 0, -3, -3, -5, 1, -1, -3, -2, 0, + 2, 3, 1, 1, -2, -4, -4, -1, 1, 1, + -2, 1, -1, -3, -3, -1 + }, + { + 73, -1506, -399, 67, 43, -180, 98, -36, -15, -29, + -5, -36, -8, 18, -81, 28, -49, 27, -50, 48, + -44, 2, -31, 7, -21, -22, 16, -25, -20, 7, + 7, 14, 28, -55, 43, 9, 8, -3, 13, -2, + -7, -17, 22, 19, -27, -13, 4, -5, -4, -6, + 3, 3, -3, -2, -4, -2, 0, 2, 2, -4, + 2, 0, 1, -4, 1, -4, 2, 3, -2, -3, + 0, 0, -1, 0, -2, 1, 1, 2, -3, 1, + 5, 1, -4, -2, -1, -4, -3, 0, -3, 1, + 1, 1, 0, -1, -1, -2 + }, + { + 18, 273, -99, 132, 2, -7, 13, -70, -34, -20, + 28, 50, -7, -64, 20, -25, -36, -27, -81, 24, + 28, -3, -5, 21, 4, -42, 21, -43, 32, 31, + -9, -9, 0, -13, 4, -8, 30, 8, -13, -10, + -18, -6, 13, -18, 11, 8, -8, -4, -7, -6, + -7, 4, 4, 8, 4, 3, 1, -4, -3, 1, + -7, -3, 12, -2, -2, 2, 0, -1, 1, 2, + 9, 1, 4, 0, 1, 2, 6, 3, 0, -2, + 0, 0, -3, 4, 2, -2, 2, -1, 1, -1, + -2, 0, 1, 0, -1, 1 + }, + { + -125, 131, -49, -87, -28, 53, 17, 10, 8, 15, + 38, 3, 57, -79, 28, -2, 20, 23, -24, -9, + -13, -13, 9, 24, -23, -6, -31, 8, -3, -16, + -9, -13, 14, -12, -16, 7, 42, 36, 9, -20, + -10, -3, -5, -12, 11, 2, 0, 1, -5, 5, + -18, 7, -7, 6, -1, -5, -4, 4, 4, -3, + -10, 5, 5, -4, -3, 7, 5, 5, 2, -5, + 1, 2, 0, -1, -3, 2, -1, 1, 4, -1, + -2, -4, 2, 1, 0, 2, 0, -1, 0, -3, + -1, -1, -1, 2, -1, 0 + }, + { + -9, -43, 62, -56, -12, -12, 6, -21, 35, -14, + -7, 12, -164, 78, -260, 155, 21, 67, 16, -1, + 110, -104, -133, 10, -3, -21, 10, -20, 18, 10, + -12, 18, -50, -1, 6, 38, -32, -4, 19, -6, + -7, -5, -15, -34, 20, -18, -29, -6, -4, 12, + 5, -23, 12, 3, -12, 1, -4, 8, 1, 11, + 6, -3, -6, -1, 4, 2, -6, 7, -3, 4, + 1, 7, -6, -3, -1, -2, -4, 2, 3, -1, + 3, 4, 1, 0, 0, 1, -3, 1, -1, 4, + 0, -5, -2, 3, -1, -1 + }, + { + -197, 600, -38, 114, 10, 74, 25, 55, -28, 14, + 31, -90, 48, 86, -298, 28, 105, -13, -23, -23, + -8, -14, -28, -23, 26, -7, 25, 30, -47, 17, + -2, 20, 52, 13, -27, 31, 27, 8, 2, 3, + -18, -39, 17, -4, 30, -9, -5, -22, -3, -12, + 1, -7, -4, 6, 6, 0, 7, -9, 1, -14, + 5, 8, -1, 11, 4, 8, 2, 4, -2, 3, + 5, -3, 2, 1, -1, 2, 0, 2, 3, 3, + 1, -1, 5, 1, 2, 0, -3, -1, -1, 1, + -2, 1, 1, 1, -1, 0 + }, + { + -9, -126, -37, -20, 8, 2, -4, -3, 48, 34, + 28, 6, -10, 341, 13, 44, 21, 3, 121, -82, + -4, -35, 15, -4, 2, 30, 12, -21, -46, -51, + -30, 22, -40, 0, -1, 3, -34, 9, 18, -30, + 3, -13, -7, 10, 10, -10, 3, 5, -3, -11, + 4, 1, -5, 8, 5, -6, -17, -8, -5, -19, + 0, 1, 1, 1, 1, -1, 7, 1, 1, 1, + 0, -4, -2, 1, -4, 5, -2, -1, 1, -2, + 5, 3, 2, -2, -1, 2, -3, -1, 2, -1, + -1, 2, 1, -1, 0, 1 + } + }, + { + { + -422, 2074, -191, 124, 31, -34, 7, -24, -2, -10, + 29, -19, -22, -28, -17, 48, 19, -40, 24, 39, + -12, -18, 31, -12, -18, 7, 2, 8, -9, -16, + 2, -4, 0, 31, 9, -15, 15, 19, 2, -9, + 14, -13, -4, 4, 14, 25, -11, -5, 8, -5, + 7, -3, 18, 8, 8, 9, -3, 3, 7, 2, + 8, 0, -2, 0, -3, 1, 2, 1, -1, -3, + -2, 0, 2, 2, -2, -6, -1, 0, 1, 2, + 2, 5, 0, -1, -1, -2, 4, -2, 1, -2, + 0, 0, 1, 0, 1, 0 + }, + { + 25, 247, 4, 66, 25, -47, -33, -5, 1, -17, + 0, 11, 11, -38, -16, -57, -116, -23, 112, 39, + 3, -51, -82, 7, 16, 43, 3, 3, 35, 22, + -19, -7, 24, 3, -23, -17, -10, 4, 9, 23, + -6, 27, 27, 10, -2, -4, 8, 2, 0, 5, + 5, -8, 14, 13, 6, -17, -7, -7, -1, 4, + 0, 0, -5, 5, 3, -3, 7, 8, 0, -1, + 4, 0, -2, -1, 3, 3, -5, -3, -3, 3, + 1, -2, 1, 2, -2, 3, 3, -3, 1, 2, + -3, -1, 2, 1, 2, -2 + }, + { + -9, 1411, 489, 199, 132, -22, 13, 12, -14, -30, + 0, -30, -26, 5, 33, -21, 1, 11, -23, -33, + -2, 27, 12, 5, -23, -14, 15, -14, 1, -18, + -44, 0, 1, 11, -19, 4, 46, -23, 0, 1, + 18, -7, 21, 9, 19, -2, -6, 14, 11, 0, + 9, -1, 10, -2, 17, 5, -4, 2, 0, 2, + 1, 2, 7, -3, 1, 8, -3, 0, 4, 4, + -2, -5, 1, 2, 0, -1, -4, 1, 3, -2, + -2, -1, 3, -1, 1, 1, 0, -1, 0, 1, + -1, -3, -2, 0, -3, 0 + }, + { + -208, -887, -231, 104, 6, -9, 9, 5, -5, -9, + -35, 14, -39, 37, 46, 24, -6, 44, 4, 3, + 9, -1, 31, -10, -17, -10, -32, 15, -3, 33, + 18, -32, 17, -35, -18, -9, -35, 20, -1, 8, + 13, -8, -2, -20, -15, 14, 8, 1, 13, -11, + -1, -5, -7, -1, -9, 9, -3, -4, -3, -9, + -7, 2, -2, -3, 3, -3, 3, 1, -2, 0, + 0, -2, -5, -1, -1, -1, -1, -4, 0, 3, + 5, 3, 1, -3, -2, -3, 0, 0, -3, 0, + 1, 2, -1, 0, 0, 0 + }, + { + -17, -400, 32, 1, 4, -13, -6, -10, 1, 20, + 0, -21, 0, 54, 82, -105, -207, 30, 103, -13, + 34, 18, -27, 20, -44, -52, -32, 8, 3, 45, + 46, 19, 3, -12, -16, -12, -4, 5, -2, -2, + 19, -9, 2, -3, -3, -6, -7, 8, 10, 3, + 29, 5, 9, 10, 7, -2, 3, 3, 7, -3, + 12, -1, 4, -4, 0, 2, 3, 3, -3, 5, + 4, -3, 0, -2, -6, 0, 4, 1, 2, 2, + 3, 1, -4, -1, 2, 0, 2, 0, 1, 1, + -1, 2, 1, -2, -1, 2 + }, + { + -321, -1521, -215, -34, -18, -9, 18, 11, -9, 30, + 34, -3, -12, -28, 2, 107, 23, -20, 8, -6, + -4, 13, -29, -38, 9, 34, -13, 7, 23, 8, + -23, -1, -19, -27, 20, -11, 7, -26, 2, 18, + 15, 7, -46, 4, 12, 8, -12, -9, -11, 2, + -3, -17, -2, 7, 8, 1, 5, 1, -2, -8, + -1, 2, 0, 7, 9, -2, 0, -1, -5, 2, + 3, 4, 0, 1, 2, 0, 2, 0, -2, 0, + 0, -1, -6, -2, 1, 1, 3, 1, 2, -1, + 0, 0, 2, 1, -2, 0 + }, + { + -22, -64, 58, -12, -5, -7, -7, 6, 7, -16, + 7, 10, -21, -119, -96, 47, -4, -24, -39, 45, + 10, 1, 50, -79, 16, 18, 13, 30, -60, 9, + 12, 39, 12, -17, 28, -16, 9, 8, 12, -3, + 20, 15, 20, 6, -9, 16, 4, -14, 5, 0, + -12, -2, -1, -4, -2, -5, 5, 7, -10, -3, + -1, -3, -5, 0, 1, -6, -3, -4, 0, -2, + -7, 0, 4, 2, 0, 2, -1, 5, 2, 1, + 1, 0, 1, -2, 0, 3, -1, -3, 0, -3, + -4, -2, 1, 2, -1, -1 + }, + { + -109, 759, 363, 10, 15, 29, 12, -51, -8, 3, + 20, 11, -25, 54, 27, -25, 27, -23, -27, 15, + 23, 7, 10, -3, -6, -9, 18, -26, 1, -1, + -5, -4, 4, 18, 2, 31, 12, 21, -6, 6, + 5, -20, 4, -7, -9, 21, -2, -27, -10, 11, + -8, -3, -18, -9, 8, 4, 8, 3, 12, 0, + 1, -1, 0, 1, 2, 1, 2, 2, 2, -1, + 1, 2, -3, 4, 7, -2, -1, 4, 0, -2, + 0, -4, -1, 0, -1, -4, 1, 5, -1, 0, + 1, 1, 2, 2, 1, 0 + }, + { + -35, -83, 184, -4, 14, -4, -3, -30, 20, -4, + -2, -3, -21, 66, 70, -130, -7, -5, -33, 126, + -18, -84, -9, 96, 39, 38, -60, 9, -38, 7, + 15, -6, 17, -55, 8, 35, 1, -25, 13, -11, + 8, -14, -18, 11, 17, -6, 13, 13, 7, 5, + 0, -9, -8, 0, -2, 2, 1, 7, 9, 7, + 1, -12, -4, -1, -5, -8, -3, 0, 2, 3, + -2, -2, -6, 1, 4, 1, -2, 0, 1, -2, + 1, -5, -4, 1, -1, -2, 2, 3, 0, -2, + 1, 1, -1, -2, -1, 1 + }, + { + -142, -1255, -290, -126, 34, 28, -184, 2, -24, 3, + 4, 12, 4, -49, -29, 1, -18, 15, -10, -17, + -14, -11, -12, -15, -4, -32, -10, -1, 10, 3, + -2, 4, 27, 5, 31, -3, 12, 7, -7, -8, + 17, 13, 9, -17, 3, 14, 1, 0, 1, 13, + 7, 10, 7, -3, -17, -4, 6, -8, 0, 1, + -11, 6, 4, 0, -3, -2, 1, -1, -1, 3, + 0, -3, -1, 2, 1, 1, 1, 3, -4, 1, + -1, -1, -1, 0, 0, 3, 3, 1, 2, 1, + 1, 0, -3, -2, 1, 1 + }, + { + -9, 205, 68, 72, 18, 20, -28, -99, 8, 11, + 18, 23, -14, -35, -73, -28, 26, -78, -49, 47, + -79, -6, 60, 5, -15, -5, -3, -13, 12, -26, + -5, -15, -6, 2, 1, -5, -1, -4, -12, -19, + -16, 0, -2, 8, 4, -3, -2, -4, -1, 9, + 4, 6, -4, -5, -12, 11, -2, 1, 4, -4, + -1, 6, -2, -4, 3, 10, -1, 7, 5, 2, + 5, 1, 0, 1, 4, 2, 0, -5, -3, 1, + -2, 1, 3, -1, -3, -1, 0, 0, -2, -4, + -1, 1, 0, 1, 0, 1 + }, + { + 105, -147, -207, -62, 44, -18, -32, 51, -11, 35, + 6, -34, -13, -27, 27, -15, 26, -5, 2, 5, + -22, 21, 16, -20, -21, -6, 27, -5, -21, -26, + -23, -8, -11, -26, 0, 7, -11, 3, -4, 3, + -1, -12, 1, 3, 2, 11, -13, 4, 10, -2, + 7, 4, 9, 5, -7, 1, -5, -4, 2, -7, + -1, 2, 1, 3, 4, -3, 1, 1, -1, 1, + 4, -5, 3, 1, 1, 2, -2, 1, 1, 0, + -1, 1, 2, 0, 3, 2, -3, 1, -2, 0, + 2, 1, 3, -1, -1, 0 + }, + { + 12, 115, -116, -38, 13, 13, 12, -32, 22, -1, + 0, 23, 50, -425, 72, 94, 10, 99, -20, 52, + -22, -44, -47, -3, -8, 59, -6, -64, 14, 24, + 35, 13, -77, -17, 0, 16, -27, 5, 5, 18, + -1, -7, -19, -15, -9, 3, 1, 0, -12, 7, + 17, 0, 5, -1, 0, -1, 6, -9, 5, -1, + -9, 1, 7, 3, 5, -4, 1, -4, -4, 7, + 4, 1, 0, -4, -2, 6, 1, 2, 0, 0, + -2, -3, -4, -3, 0, -1, 1, 2, 0, 1, + -2, 0, 4, 1, -2, 2 + }, + { + 143, 107, 124, -90, -37, -7, 10, 37, -9, 30, + -50, 94, -5, -77, -19, 26, -22, -21, -12, -23, + -15, -8, -32, -12, 15, 19, 38, 18, 6, 28, + -6, 28, 18, -16, -10, 9, 0, -10, 7, -3, + -8, -15, 8, 3, -8, -23, -14, -18, -8, 1, + 3, -18, 1, 11, -1, -7, -5, -1, -4, -9, + 3, -1, 7, -1, -2, -4, 4, 1, 0, 3, + 0, 5, 3, 0, -4, -2, 1, 5, -1, -5, + 0, 0, -2, -2, 1, -2, -3, 4, 2, -2, + 1, 1, -2, 1, 0, 1 + }, + { + 15, -184, -53, 13, -4, -2, 9, 21, 35, 15, + -21, 1, -52, 236, 719, -74, -13, -22, 89, -39, + -95, -31, 53, -5, -22, -10, 32, -52, -33, -66, + -6, 25, -39, 18, 6, -27, 25, 12, -7, -8, + -13, 15, 28, -1, -16, 10, -16, 2, 9, 0, + 0, 8, 11, 11, -7, -5, -6, -3, -10, 6, + 12, 1, 0, -3, 4, 7, -11, -4, 5, 5, + -3, 0, 5, 3, 2, 3, -6, 2, 1, 6, + 0, -3, -2, -1, 2, 0, 1, -1, -2, -1, + 0, -1, 1, 1, 1, -2 + } + }, + { + { + 259, 3140, -603, 17, 27, -11, 38, -16, -1, 3, + 11, -34, -21, 21, 64, -11, 6, -16, -20, -8, + 24, 12, 9, -2, -10, -11, 2, 16, -14, -18, + -9, -3, 11, 24, -4, -2, 24, 21, 6, -6, + -1, -10, 4, -11, 7, 9, -19, -10, -6, -9, + 0, -17, 3, -5, -3, 6, -2, -1, 1, 8, + 6, -2, -4, -1, -1, 1, 4, 1, -1, -2, + 1, 6, 1, 1, -1, -1, 0, -3, 4, 3, + 2, 3, -1, 0, -1, 1, 1, -1, 3, 0, + -1, 1, -1, 0, 1, 1 + }, + { + -45, 340, 70, -39, 5, -11, 11, 13, 0, -9, + 17, 2, -1, -13, -58, -33, -31, -59, 5, -14, + -10, -14, -16, 35, -9, 8, 11, 18, 16, 18, + -17, 1, 25, 0, 20, 3, 8, 9, -22, -7, + -16, 16, 1, -14, 9, 0, 0, -21, -2, 5, + -3, -6, 11, 3, -13, -13, 1, -4, -1, 9, + 6, 1, -5, -1, 2, 0, 5, 4, -3, -1, + 6, -4, -1, 1, 3, -2, -5, 0, 1, 3, + -3, -3, 1, 2, 0, 3, 1, -2, 2, -2, + -3, 1, 3, 2, 1, -2 + }, + { + 72, 446, -337, 211, 45, -41, 22, 22, 1, 0, + 27, -42, -38, 16, 32, 9, 48, 38, -21, 27, + 4, 22, -8, -1, -6, 37, 31, -24, -18, 15, + -13, 10, -4, -2, -24, 31, 47, -17, 21, -16, + -3, -14, 14, -12, 11, -1, -5, 13, 5, -7, + 9, 3, 9, -5, 18, 3, 0, -4, -6, -5, + 5, 6, 12, -3, 2, 5, -5, -1, 4, 1, + 0, 2, 3, -2, -2, -2, 1, 2, -1, -1, + 1, 1, 2, -2, 2, 2, 1, -4, 1, 1, + -1, -2, 0, -1, -1, 2 + }, + { + -7, -419, -151, 62, -6, -21, -10, -3, -8, -12, + -42, 20, -39, 47, 13, -21, -24, 1, -17, -11, + 3, -19, 8, -26, -22, -9, 3, 14, 10, 21, + 8, -16, 20, -11, -8, 2, -14, -6, -5, 7, + -8, -8, 10, -4, -11, 16, -1, -4, 6, -4, + 4, -4, 3, -2, 1, 10, 0, 1, -12, -6, + 4, 6, -1, 2, 2, 0, 7, -3, 0, 2, + -1, -5, -2, 2, -1, 1, -1, 0, 2, 2, + 2, 1, -2, -1, 0, -2, 2, -2, -1, 1, + 1, 0, -1, 1, 0, -1 + }, + { + 21, -438, -35, 8, -1, -5, 16, -4, -9, 16, + 7, -14, 31, -17, 104, 28, -38, 272, -118, -4, + 55, 23, -17, -20, -25, 26, 73, 19, 2, 19, + 17, -23, 22, 2, -16, 1, 14, 8, -23, -12, + 12, -1, 13, -5, 5, 2, 2, 13, -7, 0, + 18, -8, 10, -4, -4, -14, 2, 5, 4, -1, + 9, -4, 5, 4, 10, 2, 1, -3, -6, 3, + -2, -4, 0, 3, 0, 5, 0, 0, 4, 0, + 1, -2, -1, 4, -1, -1, -1, -3, 1, 0, + 0, 2, 0, -2, 2, 1 + }, + { + 54, -704, -37, -18, 34, 1, 35, -31, -23, 59, + 33, -5, -1, 33, 30, 39, -20, -12, 15, 16, + 7, -8, -6, -11, 0, 5, -2, 3, 10, -8, + -26, 0, 7, 12, 6, -24, 26, -4, -4, 7, + 23, 17, -20, -1, -1, 9, -6, 5, -6, 7, + -5, 2, 9, 6, 4, 2, 15, 6, -2, -11, + -1, 4, 1, 5, -1, -4, 6, 0, -3, 1, + 0, -1, 1, 3, -3, 3, 2, -1, -3, 1, + -3, -2, -2, 1, 2, 1, 0, 2, 0, 0, + -1, -1, 0, -1, 1, 0 + }, + { + -7, 66, 52, -22, 2, 2, 0, -13, -6, -11, + 7, -1, -12, -94, -114, 15, -50, -87, -70, 59, + 28, -15, 65, -68, -8, 12, -40, -44, -25, 13, + -8, 15, 10, 10, 29, -18, -13, -6, 19, 16, + -6, -19, 14, -8, -4, 18, 2, -6, 5, -12, + -5, 8, 3, -5, 6, 0, 5, -1, 1, 1, + -3, -1, -2, -1, 5, -4, 5, 0, -1, -6, + -2, 7, 2, 4, 3, 2, 1, 4, 0, 0, + 2, -1, 1, -1, 1, 2, -3, -2, -1, -3, + -3, 0, 1, -1, 0, 0 + }, + { + 264, 410, -274, -27, 11, 11, -17, -15, -8, 7, + 17, -37, -19, 35, -30, -23, 6, -47, 2, 29, + -11, -12, 20, -2, -19, 16, 25, -13, 3, -5, + -16, -11, -4, 11, 2, 26, -8, 2, -18, 5, + 7, -1, 2, -21, -9, 7, 0, -29, 0, 16, + -2, -5, -15, -2, 9, 5, 9, -3, 5, -5, + -4, 1, 5, -2, -3, 0, 0, 0, 2, 0, + 1, 1, 2, 4, 0, -5, 3, 1, -2, 2, + -1, -5, 0, 1, -1, -1, 1, 3, 0, 0, + 0, 1, 2, 2, 0, -1 + }, + { + 1, 23, 87, -18, 1, -4, 11, -12, 29, -1, + -13, 2, 7, 66, 87, -75, -73, 13, -10, 62, + 23, 20, 46, 134, -10, 28, -5, -35, -32, 28, + -19, -8, -5, -30, 12, -4, 20, 12, 3, -7, + 17, -5, 2, 14, 6, -16, 3, -3, 6, -1, + -3, -2, 7, 4, -8, -4, 4, 8, -6, -2, + 2, -5, 6, -2, -1, -3, -4, -1, 0, 0, + -3, 0, -1, 4, 3, -2, -1, 2, 2, -1, + -1, -7, -1, 1, 0, 1, 3, 1, 0, -1, + 1, 0, 1, 0, 1, 2 + }, + { + 194, -774, -214, -117, 59, 52, -171, 12, -17, 25, + -1, 9, -4, -32, -22, -8, 35, 16, 6, -7, + 11, -7, 6, 2, 23, -16, -24, 7, 32, -10, + -12, -12, 5, 9, 23, -19, 11, 17, -15, -6, + 17, 23, -4, -20, 29, 20, -1, 11, 4, 14, + 2, 3, 5, -9, -12, 2, 2, -8, 3, -2, + -5, 0, 0, 2, -6, 2, 0, -5, 1, -1, + 1, -2, 1, 0, 2, -1, 1, -2, 1, -1, + -2, 0, 2, 0, 2, 4, 2, 0, 2, 0, + 0, -1, -1, 0, 1, 2 + }, + { + 14, 66, -41, 1, 9, 5, -37, -70, 23, 30, + 10, -12, -1, -28, -82, -105, 57, -9, -19, -16, + -87, 13, 65, -6, -10, 8, -25, 12, 27, -19, + 1, -10, -10, -8, 4, -14, -11, -9, -7, -1, + -15, 7, -2, 2, -4, -8, -5, 3, 10, 14, + 3, 0, -9, -2, -5, 4, 1, 3, 3, -4, + 4, 2, -4, 1, 3, 1, 3, 8, -3, -2, + -1, -2, 2, 3, 1, -3, -2, -4, 2, 0, + -2, 1, 2, -3, -1, 0, -1, -1, -2, -1, + 1, 0, 0, 1, 1, -1 + }, + { + -80, -289, -95, -14, 66, -125, -79, 68, 16, 35, + -24, -9, -7, 9, 26, -4, 30, -1, 20, 11, + -6, 12, 3, -30, -17, -13, 41, -7, -4, -18, + 0, 5, -20, -10, 8, 2, -38, -21, -9, 6, + 8, -14, 6, 7, 3, 2, -17, 5, 14, -8, + 12, -1, 15, -5, -5, 5, 1, -7, -4, 1, + 4, -6, 0, 6, -1, -6, -3, -1, -1, 4, + 1, -4, 3, -1, -1, -1, -1, -1, -1, -1, + 0, 4, 0, 0, 1, -1, -1, 1, 0, 2, + 1, 1, 1, -2, 0, 1 + }, + { + -12, 183, -14, -19, -3, 11, -8, -33, 14, -6, + 15, 6, 125, -317, 84, 21, -31, 47, -40, 51, + -66, 55, 14, -54, -29, 67, -24, -40, -12, 18, + 7, 22, -53, 8, -11, -25, -28, -14, 2, 19, + 4, 5, -8, -3, 8, 10, 19, 9, -4, 3, + 12, 6, -2, -3, 8, -2, -1, -9, 4, -5, + -5, 5, 3, -1, 3, -3, 0, -6, 3, 2, + 1, -1, 3, -1, 2, 4, -1, 0, -2, 0, + -3, -2, -3, -3, 1, -1, 2, -2, 1, 0, + -2, 2, 2, -2, 1, 2 + }, + { + -24, -183, -18, -169, -12, -101, -131, 3, -7, -8, + -9, 144, -40, -9, 76, -43, -42, -13, -1, 10, + 5, 14, -11, 13, 0, 18, 34, 19, 5, 8, + 6, 4, -17, -21, 0, -3, -3, 1, 18, -3, + -20, 6, 3, -3, -2, -10, -3, 6, 3, 6, + -8, -4, 2, -2, -7, -3, 0, 10, -3, 1, + 3, 1, 6, -5, 1, -4, 6, -2, 1, -1, + 2, 2, 1, -1, -1, -2, 3, 0, -3, -3, + 1, -1, -5, 0, 0, -1, 2, 3, 0, -1, + 0, -1, -2, 0, 2, 0 + }, + { + -3, -169, 49, 28, -8, 8, 7, 27, 28, -16, + -30, 17, 11, 5, 244, -120, 47, -13, 19, -33, + -17, -13, 8, -5, 0, -29, -1, -84, 20, 15, + 2, 21, -9, 30, -8, -5, 24, -18, 19, 3, + -3, 25, 19, -13, -2, 8, -13, 3, 12, 5, + -2, 7, 4, -1, -7, 1, 3, 1, -1, 6, + 2, -2, 3, -2, 0, 2, -11, 4, 3, 4, + -3, 2, 6, 2, 2, -4, -3, 3, 0, 2, + -3, -2, -2, 3, 1, 0, 2, 0, -2, 1, + 0, -3, 1, 1, -1, -2 + } + }, + { + { + -131, 2235, 252, 126, 1, 24, 10, -4, -7, -23, + -28, -13, -5, 51, 45, -34, 5, 14, -19, -38, + 44, 14, -11, 16, -12, 1, 18, -4, -31, 5, + 2, 4, -1, -9, 13, 15, 7, 8, 3, 7, + -2, -6, 0, -14, 2, -11, -2, -2, -12, -16, + -11, -8, -3, 1, 3, -1, 13, 6, 6, 2, + -2, -4, 5, 4, 1, 1, 1, -1, 3, 1, + 4, 3, 0, 0, 2, 5, -3, -1, 2, -4, + -3, -2, -1, -1, 2, 0, -2, 0, -2, 0, + -1, 0, 0, 1, 0, 0 + }, + { + 31, 230, -18, -79, -21, 18, 6, 2, -2, 8, + 20, -19, 5, 25, -93, 15, 26, -20, 9, -24, + 4, -1, 21, -6, -8, 15, -3, 8, 6, -5, + 23, -11, 2, 0, 15, 9, -1, -3, -11, 4, + -12, -16, -21, -3, 11, -2, -8, -6, -11, -7, + 0, 0, -6, -14, 1, 6, 2, 1, 3, 1, + -5, -5, 1, -3, -1, 4, -2, -3, -2, 2, + -1, -1, 5, 3, 0, -1, 2, 2, 0, -4, + -1, 3, -1, -1, 0, -1, -2, 1, -2, -2, + 2, 1, -1, -1, -1, 2 + }, + { + -93, 169, 71, 85, -44, -19, 28, 35, 18, 18, + -2, -45, 3, -6, 0, 14, 31, 46, -35, 70, + 40, -5, -8, 3, -6, 15, -12, 9, -23, 0, + 18, 33, -24, -16, 14, 28, 9, 22, 23, -6, + -1, 6, -7, -19, -8, -1, -3, 1, -1, 5, + 2, 4, -4, 1, 0, 5, -1, -5, 0, -4, + 0, 6, 0, 0, 6, -7, 1, 0, -4, -2, + 3, 1, -3, -1, 0, 3, 4, -3, -2, 1, + -1, 0, 0, 3, 0, -2, -1, -1, 1, 0, + 1, 3, 0, 0, 2, 0 + }, + { + 202, -460, -251, -27, 3, -22, -11, -8, -12, -2, + -10, 6, -21, 40, 37, -16, 1, -19, -4, -9, + 7, -29, -27, -6, -4, -15, 30, 7, 9, -22, + -12, 6, -12, 6, -2, 11, -8, -22, 16, -10, + -6, 5, -2, -1, -5, -5, -10, 3, 1, 1, + 10, -1, 2, -3, -3, 5, -3, 1, -7, -4, + 1, -3, 0, 2, -7, 3, 1, -2, 0, -3, + -2, 4, 6, -1, 0, -1, -2, 2, 0, -1, + -1, -3, 0, 2, 1, 1, 0, 0, 3, 0, + -2, -1, 1, 0, -2, 1 + }, + { + -14, -391, 15, 8, -14, 11, -5, 12, -22, 3, + 7, 6, -1, 34, 129, 81, 186, -11, -154, 65, + 41, 18, 11, -20, 19, 82, 44, -8, 1, 29, + 10, -12, 4, -4, 6, -21, 18, -21, -24, 9, + -3, -1, -8, -1, 6, -3, 1, 9, -14, -6, + 4, 2, 1, -4, -1, -7, -1, -1, 5, 0, + -1, 3, 6, 0, 0, -10, 1, -3, -1, -1, + 0, 3, 3, 4, 7, 2, -5, -2, -4, -4, + -3, -2, 6, 3, -3, 0, -4, -1, 1, -1, + 0, -1, -1, 2, 1, -1 + }, + { + 187, -620, -154, 16, 24, 6, 1, -18, 16, -6, + -30, 14, 32, 43, 15, 20, -11, -4, -18, 12, + -18, -23, 19, -1, 3, -16, 19, 13, -1, -20, + -18, 4, 26, 17, -3, -2, 1, 7, -8, 5, + 0, 8, 21, -15, -14, 10, 2, 16, 1, 6, + 1, 10, -8, -6, 3, 0, 5, 1, 1, -3, + 3, -1, -8, -1, -2, 2, 1, -3, 2, -1, + -3, -3, 3, 2, -3, 3, -3, 0, 2, 0, + -1, 3, 6, 2, 0, -3, -2, 0, -1, 3, + -2, -1, -2, 1, 2, -1 + }, + { + 23, 16, -64, 18, 5, 8, 8, -35, -7, 7, + 6, -8, -3, 111, -316, 51, 22, -16, -68, 73, + 37, -10, 30, 3, -16, -17, -15, -69, 39, -66, + 1, 10, 26, 8, -18, 4, -9, -9, 2, 14, + -22, -2, 12, 8, 1, -5, -3, 2, -1, -7, + 5, 4, -1, -8, 7, 1, -4, -8, 14, 0, + 2, 4, 6, 0, 3, 1, -1, -3, -2, 3, + 6, -1, -3, 3, 0, -2, -2, -1, -3, 0, + 2, -1, 0, 0, 0, -2, 0, 1, -1, 1, + 2, 3, 0, -1, 1, 1 + }, + { + -384, 819, 206, -7, -41, 5, -1, 1, -8, -12, + -16, -10, 30, -24, -46, -21, -30, 16, 31, -7, + -17, -8, 4, -15, 13, 16, 2, 13, -15, -19, + -18, -8, 5, -9, -8, -7, 0, -17, -11, 6, + 10, 11, -19, -4, -15, -1, 15, -8, 5, -4, + -2, -16, 17, 0, -1, 3, 0, -1, -5, -3, + 3, 3, -2, -5, 2, 3, 0, -3, 3, 5, + 0, -2, 4, -4, -7, 1, 1, -5, 1, 1, + -3, -1, 2, 0, 0, 1, -1, -2, 1, 0, + 1, 1, 0, 0, -1, 0 + }, + { + 29, -37, -68, 22, -20, 9, 3, -23, 19, 7, + -6, 6, 23, 18, 105, 28, -112, 87, 52, -39, + 1, 104, 76, 58, -18, 20, 37, -104, 14, -4, + -3, -1, -18, 14, -9, -21, 23, 19, -3, 0, + -13, 3, 12, -3, -22, -15, -4, -4, 2, 8, + 0, 6, 7, -7, -8, 0, -2, -3, -15, 2, + 8, 7, 6, 6, 12, 1, 4, -2, 0, -1, + 2, 5, 2, -3, -5, -2, 1, -1, 1, 1, + -3, 2, 4, -1, -1, 0, -3, -3, 1, 1, + 0, -1, 1, 0, 0, -2 + }, + { + -192, -624, 212, -22, -30, -52, -14, -10, 10, -17, + -27, -25, -10, 13, -34, -16, 56, -8, 16, -2, + 22, -16, 1, 7, 14, 5, -19, 7, -1, -4, + -9, -12, -9, -9, -4, 13, 11, 0, 3, -5, + -3, 4, -3, 3, 13, 1, -6, 19, 0, -11, + -6, -2, -14, -8, 8, 1, 0, 3, -3, 0, + 4, -6, -2, 1, -2, 1, -1, -2, -1, -4, + -3, 2, -2, -2, 1, -1, 0, -1, 2, -2, + 3, 1, -1, -1, 0, -3, -3, -1, -2, -1, + 0, 0, 2, 0, 0, -2 + }, + { + -21, -17, 28, 10, -20, -22, -27, -22, 8, 17, + -7, -18, 42, -41, -60, -70, 30, 12, -27, -60, + 31, -20, 14, -14, 12, -9, -27, 16, 20, 30, + 8, -14, -11, -1, -17, -9, 15, -9, 7, -5, + 5, -5, -3, -6, 0, -10, -2, 1, 7, 3, + -10, -1, 6, 8, 4, -3, 6, -1, -3, 0, + -2, -3, 4, 7, -4, -4, 1, -4, -4, -2, + 1, 3, 2, 0, -3, 0, 1, 4, 4, -2, + -1, -3, -1, 3, 3, 0, 0, 0, 1, 3, + -1, 1, 0, 0, 0, -1 + }, + { + 45, -350, -121, 38, -14, -114, -5, 42, 35, 20, + 9, 29, 11, 47, -3, 24, -11, 25, -6, 5, + 17, -29, -8, -6, -17, -6, 8, 6, -5, -2, + 17, 3, 0, 7, 0, 9, -2, 3, -12, 1, + -13, 5, -12, 8, 4, -5, -3, -5, 3, 1, + -1, -2, -1, -3, -1, 3, 2, -4, 1, 2, + 0, -5, 5, -3, -5, 2, 1, 2, 2, -2, + -1, 3, -2, -2, -4, -2, 2, -1, 1, 0, + 0, -1, -2, 1, -2, -1, 3, -1, 2, 0, + -2, -1, -3, 0, 1, 0 + }, + { + 8, 151, 67, -64, -25, -6, -18, 4, 8, -28, + 7, -15, -113, 102, -45, -93, 37, -1, -1, -10, + 66, -20, -6, -110, -11, 1, -12, -14, -16, 11, + -16, 25, -18, 7, 8, -30, -15, -25, 1, -4, + 8, 0, 0, -4, 11, 5, 8, -4, 13, 1, + -6, -9, -6, 6, 3, -12, -2, -1, 1, 7, + 8, -3, -9, -2, 1, -1, -2, 2, 6, -2, + -1, 0, 1, 2, 0, -5, -7, 0, 0, 0, + 3, 3, 1, 2, 1, 0, -1, -4, 2, 1, + 1, -1, -4, -1, 2, -2 + }, + { + -60, -110, -75, -79, 6, -81, -79, -7, 3, -38, + 44, 22, -6, 47, -21, -16, 15, 6, 5, -4, + 8, -3, 3, 6, -14, 3, 14, 23, -20, -8, + 26, -9, 6, 7, 8, -14, 15, 25, 17, -7, + -31, 3, -9, 8, 12, 16, 14, 3, 1, -1, + -8, 12, -7, -7, -2, 11, 7, 2, -1, 8, + 2, 4, 5, 4, 9, 6, 5, -2, -1, 0, + 1, -1, 0, 0, 4, 2, 1, -5, 2, 4, + 2, 0, 2, 3, -1, 2, 2, -3, -1, 1, + -2, -1, 1, 0, 0, 0 + }, + { + -7, -125, 70, 4, 3, 13, 11, 25, 32, -32, + -3, 4, 61, 23, -306, 1, 164, 38, -75, 9, + 54, -8, -13, -11, 10, -6, -39, -47, 22, 24, + -11, 16, 28, -9, 12, 13, -41, -6, 28, -13, + 7, 2, -9, 8, 8, -12, 14, 2, 4, 2, + -8, 0, -6, -6, 2, -5, -1, -4, -4, -11, + -8, 3, 2, -5, -3, -4, 9, 3, -3, -1, + 3, -2, -2, 0, -1, -3, 3, -1, -3, -4, + 1, 3, 3, 1, -2, 0, -1, 1, 2, 0, + -1, 0, 0, -1, -1, 1 + } + }, + { + { + 192, 1187, -540, 117, 1, -2, -24, -8, -7, -27, + -5, -5, 1, -3, -39, -12, 6, 22, 32, -3, + 8, -14, -4, 21, 4, 3, 10, -2, -19, 27, + 17, 11, 11, -4, 13, 3, 8, 2, 3, 15, + 2, -2, -2, -11, -5, -12, 3, 4, -6, -18, + -10, 1, 4, 3, 2, -7, 4, -3, 3, -4, + 0, -5, 4, 3, 1, 0, -2, 1, 5, 1, + 1, -3, 0, -1, 0, 1, -4, 2, -1, -4, + -3, 0, 2, 0, 2, -3, -1, 0, -2, 0, + 0, -1, 1, 1, -1, -1 + }, + { + -3, 198, -54, -62, 16, 22, -9, -14, 4, -16, + 3, -18, 10, 11, -74, 38, 41, 13, 37, -23, + 5, -1, -9, -24, 4, 31, 5, 4, -17, -29, + 18, -36, -6, 15, 3, 20, 4, -3, 4, 15, + -8, -16, -18, 3, 4, -1, -3, 15, -8, -7, + 8, -3, -7, -6, 14, -1, 2, 6, 1, -8, + -9, -3, 3, 1, -1, 2, -5, -1, 0, 2, + -3, 3, 2, 1, -1, 1, 3, 1, -1, -3, + 2, 2, -3, -2, -1, -2, -1, 1, -2, 1, + 3, -1, -2, -1, 0, 2 + }, + { + 71, 212, -89, -112, -94, -15, 6, 11, 4, -9, + -21, -44, -2, -10, -18, -13, -5, 38, -16, 37, + 39, -34, 10, 36, 0, -7, -13, 34, -7, 4, + 6, 5, -17, -6, 24, 1, -9, 8, 15, 15, + 3, 1, -8, -15, -13, -1, -3, -1, -1, 4, + -7, 1, 0, -4, -11, 4, -5, -1, 5, 0, + -6, 1, -5, -1, 0, -7, 4, -1, -4, -1, + 1, -6, -2, 4, 0, 4, 1, -3, 2, 2, + -1, -2, 1, 2, -1, -2, -1, 1, -1, -1, + 2, 3, -1, 1, 1, -1 + }, + { + -252, -865, -47, -58, 5, -10, 5, -5, 6, 28, + 9, -8, -5, 28, 32, -17, -10, -15, -3, -15, + 7, -8, -11, 2, 6, -4, 26, 9, -21, -28, + 5, 15, -16, 10, -1, 25, 3, -5, 22, -7, + 9, 0, -9, -1, -2, -5, -6, 1, 5, -3, + 6, 2, -7, 2, -4, 4, -5, -4, 0, -3, + -3, -4, 0, -1, -5, 0, -4, 1, 0, -2, + 1, 6, 4, -1, 0, -3, 0, 1, 0, -2, + -1, -2, 2, 1, 0, 0, -2, 2, 2, -1, + -1, 0, 1, -1, -1, 2 + }, + { + -6, -328, 50, -3, -7, 7, -10, 26, -12, 7, + 4, 9, -18, -28, 66, 92, 96, -191, 57, 116, + 32, -11, 5, -2, 19, 40, -80, -36, 36, 77, + 28, 19, 1, 11, 7, -44, 2, 1, -5, 9, + -2, 8, -1, -2, 5, 3, -4, 6, -7, -14, + 2, 2, -2, 0, 3, 3, 2, 5, 8, 0, + 2, 5, 4, -3, -3, -8, 6, 4, -1, -2, + 5, 3, 3, 1, 3, -1, -2, -1, -5, -2, + -1, 2, 4, -2, 0, 0, -2, 2, 0, -1, + -1, -1, 0, 2, -1, -1 + }, + { + -244, -1051, 31, 64, -17, 4, -7, 16, 7, -39, + -29, 13, 15, 7, -29, 0, -7, 3, -14, -10, + -30, -5, 19, -12, 0, -16, 9, 24, -19, -26, + -1, 17, 10, -9, 7, 10, -4, 4, -2, 7, + -31, -7, 23, 4, 0, 0, -9, 7, 0, 4, + 5, -1, -16, -7, 0, -9, -7, 0, 6, 3, + 3, -2, -6, 0, 2, 0, -3, 0, 2, -2, + -4, 0, 2, 0, 0, 1, -3, 1, 3, 1, + 2, 4, 4, -2, -1, -1, 0, -2, 1, 1, + -1, -1, 0, 2, 0, -1 + }, + { + 2, -42, -34, 15, -2, -1, 20, -8, 8, 5, + 0, -3, 1, 125, -310, 21, -12, 2, -67, 56, + 37, -32, 9, 61, 37, -29, 6, 1, 26, -79, + -6, -1, 6, -19, -3, 25, 0, -4, -10, -7, + -8, 22, -1, 2, -1, -5, 1, 6, 0, -3, + -3, -4, 1, -2, 2, -2, -4, -4, 4, -1, + 5, 2, 5, -2, 1, 2, -6, -1, 1, 4, + 2, -5, -2, 0, -3, 0, -4, -2, -2, 2, + 0, -2, 0, -1, -1, -1, 2, 1, 1, 2, + 2, 1, -2, 0, 0, 0 + }, + { + 352, 1402, -178, 34, 1, 18, 27, -11, 3, -18, + -21, 27, 12, -35, 11, -8, -22, 23, -1, -21, + 0, -12, -1, 2, 34, 2, -10, -4, -26, -12, + -6, 2, -3, -18, -5, -23, 1, -7, -4, 8, + 3, 2, -10, 3, -19, -1, 12, 7, 2, -11, + -2, -5, 20, -5, -4, -1, -3, -1, -2, 1, + 3, -2, -5, -1, 5, 0, 1, -2, -1, 1, + 0, -2, -1, -5, -1, 5, -3, -3, 4, -1, + 0, 3, 0, 0, 2, 0, -1, -1, -1, 0, + 1, 0, -1, -1, 0, 2 + }, + { + 5, -107, 29, 39, -7, 8, -10, -34, 6, 2, + 6, 4, 14, 51, 99, 119, 60, 86, 41, -73, + -12, 84, -14, -40, -6, 18, 20, -22, 41, -25, + 31, -6, 9, 13, -12, 1, 4, -5, 5, -3, + -19, 2, 3, -7, -18, -4, -1, 4, 3, 11, + 1, -1, -6, -7, 2, 4, -11, -8, -6, 7, + 8, 0, -3, 2, 4, 0, 5, -1, 2, -2, + 4, 5, 1, -6, -5, 1, 0, -3, 0, 0, + 0, 4, 1, 0, -1, -1, -3, -2, 2, 1, + -1, 0, 0, 0, -1, -2 + }, + { + 162, -434, 66, 59, -19, -69, 8, -12, 4, -39, + -19, -17, 2, 30, 4, -4, 1, -37, 16, 11, + 6, -12, 8, 8, 3, -2, -19, -1, -10, 10, + 4, -4, -4, -4, -2, 10, -4, -15, 8, -13, + -4, -5, 11, 11, -9, -4, -7, 8, -3, -9, + -3, -2, -13, 4, 14, 3, 2, 3, -3, 4, + 3, -2, -2, 1, 4, -2, -1, 0, -2, 1, + -1, 2, -3, 1, 0, 0, -2, 3, -1, -1, + 3, 0, -3, 0, -2, -3, -2, 0, -3, 0, + 0, 1, 1, -1, -1, -2 + }, + { + 15, -50, -123, -43, -37, -2, 31, 15, 2, -11, + 8, 5, 18, 18, 30, -2, -21, -57, -29, 18, + 39, -25, -10, -33, 10, -27, -16, -17, -13, 12, + -3, -14, -10, 3, -14, 2, 25, -4, 4, -14, + 16, 1, -2, -7, 1, -7, 4, -3, -6, -5, + -5, 4, 6, 5, 2, -2, 0, -2, -1, 1, + -5, 0, 5, 2, -5, 1, -4, -6, 2, 1, + 2, 1, -1, -2, -1, 3, 2, 3, 0, -1, + 0, -2, -1, 4, 1, 0, 1, -1, 2, 1, + -1, 1, 0, 0, -1, 1 + }, + { + 8, -338, -85, 32, -18, 33, 60, -5, 16, 5, + 20, 4, -1, 17, -11, 19, -38, 6, -22, -1, + -2, -20, -1, 2, -8, 0, -14, 27, 2, -1, + 9, 6, 16, 5, 3, 21, 22, 17, -15, -10, + -20, 13, -22, 2, 0, 6, 9, -7, -6, 4, + -9, -1, -6, 5, -2, 1, -1, 3, 4, -2, + -1, -1, 3, -6, -1, 2, 1, 4, 1, -6, + 1, 2, -3, -1, -2, 0, 1, -1, 0, -1, + -1, -3, 1, 1, -2, 1, 1, 0, 1, -2, + -1, -1, -2, 0, 0, -1 + }, + { + -3, 135, 55, -47, 14, -9, 0, -3, 4, -27, + -13, -10, -2, 261, -52, -75, 64, 23, 42, -7, + 97, -58, -74, -136, -28, -48, 5, -22, 2, -17, + -26, 22, 5, 8, 16, -3, -2, -6, -15, -20, + 8, 9, 6, 3, 10, 0, -8, -11, 6, -7, + -9, -10, 3, 5, -5, -8, 4, -1, -1, 10, + 6, -8, -6, 2, 3, -3, -5, 4, -1, -2, + 0, 1, -2, 0, -3, -2, -3, 1, 0, -2, + 3, 3, 1, 2, 0, 1, -3, -1, 1, 1, + 2, -3, -3, 2, 0, -2 + }, + { + 64, 53, -34, -18, 8, 63, 98, 12, 2, 4, + 3, -40, 26, -5, -91, 22, 14, 5, 2, -8, + 24, -12, 3, -14, -7, -7, 5, 23, -20, 12, + 14, -15, 12, 15, 9, -9, 21, 24, 10, 0, + -8, -5, -7, 9, 9, 9, 6, -3, 5, -4, + 6, 4, -9, 1, 3, 11, 0, -6, 4, 6, + 2, 3, 4, 7, 4, 3, 1, -1, -1, 2, + -3, 0, -1, 0, 2, 2, -1, -2, 4, 2, + -1, 1, 3, 1, -1, 2, -2, -3, 1, 0, + -1, 1, 1, 0, -2, 0 + }, + { + -1, -102, 22, 1, 12, 7, 15, -34, -15, -9, + 4, -11, 39, 151, -89, 49, 116, 14, -55, 33, + 30, -32, -13, 20, 42, 22, -28, -14, 7, 9, + 5, 18, 20, -15, 11, 0, -18, 30, 18, -17, + -13, -10, -8, 14, 0, -15, 14, 6, 3, 3, + -3, -4, -6, 2, 7, -7, -1, -1, -6, -11, + -4, 3, -1, -4, -1, -1, 10, -6, -3, -2, + 3, -4, -4, -1, -2, 2, 0, -1, -1, 0, + 4, 2, 3, -3, -2, 0, -2, 0, 2, -1, + -1, 1, -1, -2, 0, 2 + } + }, + { + { + -235, 1012, 185, 43, 18, -18, -8, 0, -20, -5, + 23, -26, -7, -12, -28, -28, 27, 6, 21, 29, + -46, 24, -6, 7, 11, -6, -3, 3, 1, 26, + 8, 20, 17, 20, -16, 6, 20, 8, 9, 3, + -3, 9, -4, -11, -1, 7, -10, -7, -3, -8, + -4, 5, 4, 0, -8, -7, -6, -7, -6, -2, + 7, -4, -5, -2, 2, -2, 4, 2, -1, -1, + -2, -1, 1, 0, -3, -6, 1, 1, -2, 3, + 2, 4, 2, 1, -1, 0, 2, 0, 1, 2, + 0, -1, 1, 0, -1, 0 + }, + { + -6, 260, -74, 61, 10, -11, -1, 6, 0, -10, + -19, 15, -12, -56, 6, -27, -1, 10, -22, -7, + -8, -3, -39, -4, -5, 14, 41, 18, -5, -37, + 1, -22, 18, 15, 0, 17, 16, 6, -6, -11, + 9, 9, -5, -3, 7, -2, 8, 7, -10, 4, + 3, 1, 6, 14, -4, -13, 2, 1, -3, -4, + 1, 2, 1, -1, 2, -3, 3, 5, 0, -1, + 0, 3, -5, -2, 3, 0, -4, -2, 0, 3, + 1, -3, -1, 0, 0, 2, 1, -1, 1, 2, + -2, -1, 1, 2, 1, -1 + }, + { + -60, 119, 6, -80, 89, -32, 13, -9, -6, -14, + -6, -32, -28, 8, -13, 5, 16, 15, -12, 0, + 20, -15, 14, 22, 20, 10, 3, 27, -13, 5, + 7, -13, 3, -3, -14, -9, 24, -15, 7, 10, + -1, -9, -5, 0, -2, 4, 0, -3, 11, -10, + -4, 2, 3, -4, 2, 4, -5, 0, -1, 2, + -4, 5, -3, 1, -4, 2, 3, -4, 4, 1, + -4, -5, 4, 0, 1, 0, -6, 2, 4, -1, + 0, 0, 1, 0, 1, 2, 1, 0, -2, 1, + -1, -2, -1, 0, -1, 0 + }, + { + 113, -1455, 71, -57, -14, -2, 6, 3, 12, 16, + -2, -11, 25, -19, 6, -32, 12, -19, -27, -7, + -8, 16, 1, -3, -2, -11, 5, 15, 6, -7, + 9, 8, 3, -1, 0, 22, 4, 12, 0, 13, + 3, -20, 1, 3, 3, 5, 0, 1, 2, -5, + 6, -1, -8, 11, -2, 2, -1, -3, -3, -5, + -1, 6, 1, -2, 4, -5, 1, 2, -1, 1, + 4, -2, -5, 2, -1, 0, 1, 0, 0, 2, + 3, 1, 1, -1, 0, -3, 0, 1, -2, 1, + 2, 1, 0, 0, 1, 0 + }, + { + 17, -332, -22, 9, 11, -17, 3, 31, 5, 13, + 4, 7, -6, 59, -78, 2, -65, -48, 189, 75, + -23, 24, -18, -6, -19, 9, -90, -26, 47, 58, + 16, 53, -12, 43, -15, -11, 3, 3, 6, 1, + 1, 11, 21, -7, 1, 9, -6, 16, -6, -3, + 9, -8, 3, 1, -3, 1, 5, 9, 6, 4, + 6, 5, 1, 4, 5, 1, 5, 3, -2, 2, + 1, -1, 1, -1, -3, 0, 5, 2, 2, 1, + 3, 1, -3, -1, 2, -1, 1, 0, -1, 1, + 1, 1, 0, -1, -1, 2 + }, + { + 65, -1534, 18, 90, -32, -3, 19, 17, -36, 17, + 35, -6, -21, -14, -15, -16, -2, 17, 0, -8, + 1, 22, -15, -22, 3, -3, -4, 4, -32, 1, + -5, 6, -12, 3, 9, -2, -2, 4, 0, 9, + -7, -4, -6, 18, 15, -16, -15, -9, 1, 8, + 3, -11, -2, 6, -3, -5, 1, 7, 1, 2, + -3, 0, 5, 6, 1, -4, 0, 3, -1, -1, + -1, 4, 0, -1, 0, 0, 3, 0, -2, 1, + 1, -1, -5, -2, 0, 2, 1, 1, 1, -2, + 1, 0, 1, -1, -1, 0 + }, + { + -16, 58, 15, -28, 0, -2, 16, 10, 14, -6, + -1, 3, -6, -76, -129, -144, 26, -14, -53, 1, + 20, 3, 55, -34, 32, -35, -6, 49, -38, 2, + -8, 10, -42, 8, 29, 14, -1, 0, -17, 5, + 6, 5, -4, -4, -7, 9, 9, 4, -1, -5, + -11, -3, 5, 3, 0, 1, 5, 2, -7, -2, + -1, -2, 1, -1, -3, -1, -3, 6, 2, -5, + -6, 1, 4, -1, 1, 2, 1, 3, 1, 0, + 0, -1, 1, -1, -1, 1, -1, -2, 0, -2, + -3, -2, 0, 1, -1, 0 + }, + { + -213, 1782, -1, 44, 27, 18, 7, -23, 3, -4, + 15, -2, -28, -12, 40, -11, 6, -8, -38, 2, + 13, -8, 17, 10, -2, -1, -8, 11, -28, -5, + 5, -5, -6, 8, -13, -5, -2, 5, 8, 9, + -2, -9, 4, -13, -1, -9, 0, -8, -1, 8, + 0, 3, -5, -11, 2, 4, 4, 3, 0, 1, + -3, -5, 2, 2, 0, 0, -1, 1, -3, -4, + 1, 1, -3, 6, 5, -1, -1, 4, 0, 0, + 2, 0, -2, 0, 1, -1, 2, 1, 0, 0, + -1, 0, 1, 1, 1, 0 + }, + { + -28, 35, 131, -5, 10, -6, -16, -16, 10, 3, + -1, -5, -21, 48, 191, -78, 146, 74, -7, -25, + 15, -19, -70, 35, 21, 44, -15, 44, 26, -25, + 15, -4, 21, -3, 3, 4, -17, -5, 8, -3, + 13, -2, -10, 7, 5, 9, 1, -2, 16, -3, + -5, -10, -5, -2, 5, 0, -4, 0, 9, 2, + -1, -6, -6, -8, -9, -3, -3, -1, 3, -4, + 0, 0, -4, 1, 3, 1, -4, -1, 0, 0, + 1, -3, -4, 1, 0, 1, 3, 3, 1, -1, + 0, 1, -1, 1, 0, 1 + }, + { + -142, -252, 125, 70, 14, -18, -21, -18, -13, 3, + 11, 11, 5, -20, 59, -40, -45, 20, 10, -10, + -4, 9, 13, -1, 8, -7, -21, 4, 7, -3, + 10, -2, 9, 17, 8, -8, -16, -1, -1, -11, + 17, 2, 9, -3, -4, 19, -2, -7, 4, 12, + 2, 1, 6, 2, -2, 4, 4, -3, 1, 0, + -6, 5, 2, -1, 2, 0, -1, -1, 0, 5, + 0, -1, 1, 2, 0, 1, 0, 1, -3, 0, + -3, -2, 1, 1, 0, 3, 3, 1, 2, 1, + 0, 0, -2, -1, 1, 1 + }, + { + -8, -57, -61, -103, -5, 24, 25, 14, -1, -5, + 27, 20, -21, 54, 44, -15, -60, -63, 11, 15, + -40, -2, -1, -25, -8, 12, -22, -18, -20, -39, + -5, -4, -8, -7, 2, 10, -8, -4, -7, -15, + 10, 2, 3, 2, -8, 3, 1, -4, 0, 2, + 9, 5, -6, -7, -5, 0, -2, 1, 3, -1, + 7, 2, -6, -3, 5, 3, -1, 4, 5, 0, + 0, -2, -2, 1, 2, -1, -2, -5, -2, 1, + -2, 2, 2, -2, -3, 0, -1, -1, 0, -3, + 0, 0, 0, 0, 0, 1 + }, + { + -65, -202, -139, 2, 24, 89, -16, -28, 13, 6, + -6, -35, -7, -18, 21, -12, -7, -16, -1, -10, + -12, 8, 9, -12, 8, 1, -4, 16, -3, 1, + -2, 5, -6, -6, 11, 9, -7, -13, -5, -4, + -12, 1, -2, 8, -8, 5, 3, 1, 2, 4, + -6, 8, 2, 6, -3, -3, -2, 4, -4, -4, + 2, 1, -1, 2, 2, -5, -1, -1, -2, 1, + 2, -2, 0, 1, 2, 1, -2, -2, -2, -1, + -1, 2, 2, -1, 2, 0, -2, 1, -1, 0, + 2, 1, 2, -1, -1, 0 + }, + { + -1, 112, -6, 46, 15, -4, 20, -21, 1, -9, + -11, 18, 48, 127, 111, -106, 83, 23, 35, 38, + -52, 37, -49, -90, -46, -12, -3, -55, 36, 4, + -16, -6, 11, -2, -1, 8, -3, -1, -10, 2, + -2, -2, 10, 9, 7, 2, -3, 5, -8, -4, + 3, 6, 7, -1, -3, 7, 0, -8, 1, -2, + -5, -1, 6, 3, -2, -3, -1, -5, -4, 1, + 1, 0, -2, -2, 1, 5, 4, 0, -1, -1, + -2, -3, -2, -2, -1, 0, 0, 2, -2, 0, + 0, 0, 4, 1, -2, 2 + }, + { + -24, 154, -24, -74, -8, 110, 37, -2, 4, 46, + -18, -1, 11, -51, -15, 9, -40, 5, -2, 1, + 11, 9, 5, -14, 29, -7, -3, 26, 17, 5, + 4, -6, -10, -2, 4, -1, 4, 3, -2, 6, + 18, -10, 10, -4, -9, -12, -3, -6, 5, 8, + 3, -10, 2, 5, -1, -7, -7, 2, 5, -3, + 4, 1, 2, -2, -3, -5, -4, 3, 1, -1, + -3, 3, 0, 0, -4, -2, 1, 2, -2, -4, + -2, 0, -2, -2, 0, -2, -2, 4, 1, -1, + 1, 0, -2, -1, -1, 0 + }, + { + 6, -75, -67, 29, -4, 9, 4, -34, -17, -27, + 9, -7, -27, 184, 35, 197, -30, 31, -5, -36, + -33, 24, -27, 26, 44, 65, -65, 14, -35, 13, + 28, 11, 10, 24, -34, 4, 47, 16, -14, 1, + -1, 10, 10, -4, -5, 2, -11, 7, 10, 4, + 4, 0, 10, 4, 2, -5, 2, 4, 1, 6, + 7, 0, -4, 4, 0, 1, -6, -6, 3, 1, + -2, -1, 4, -1, 3, 0, -4, 1, 5, 3, + 0, -2, -3, -1, 1, 0, 1, 0, -2, -1, + 0, -1, -1, 1, 0, -1 + } + }, + { + { + 126, 776, -513, 88, -4, -7, 21, 11, -17, 2, + 13, -16, -2, 24, 37, -32, 24, -7, -13, -3, + -58, 23, -16, 0, 5, -7, -2, 18, 15, 26, + 11, 14, 2, 17, -23, 9, 6, -3, 7, -1, + -7, -1, -3, -5, 0, 6, -3, -2, -2, 1, + -7, -5, 0, -1, -6, 1, -1, -2, -3, 4, + 4, -1, -4, -1, 4, 0, 6, -1, -3, 0, + 0, 1, 1, -1, -2, -2, 1, -1, 1, 3, + 2, 2, -1, 0, -1, 2, 1, 1, 1, 1, + -1, 0, 0, -1, 0, 1 + }, + { + 1, 298, -29, 73, 4, -7, 10, 15, 3, 9, + -9, 15, -18, 9, 69, -32, -1, -16, -57, -8, + -21, 0, -28, 13, 12, -3, 23, 9, 14, -20, + 10, -5, 8, 3, 12, -3, -7, 0, -1, -21, + 3, 19, 3, -9, 10, -1, 2, -2, -3, 3, + -3, 6, 8, 9, -13, -4, 2, -6, -3, 2, + 2, 1, -2, -2, 5, -3, 5, 1, -2, 1, + 2, -2, -3, 0, 3, -3, -4, -1, 2, 2, + -1, -2, 2, 1, 1, 2, 0, -1, 2, -1, + -2, 0, 2, 1, 0, -1 + }, + { + 69, 204, -14, -50, 64, -28, 17, -11, -1, 8, + 23, -18, -12, 42, 38, 57, 23, 3, 0, 7, + 6, 14, -11, -3, 7, 16, -3, 12, -3, -5, + -3, -6, 14, 0, -29, 5, 25, -12, 1, -5, + -3, -1, 4, -1, 5, 4, 5, -2, 7, -12, + 10, 6, -1, 1, 7, 0, -3, -5, -3, 3, + -2, 6, 0, 0, -2, 1, -2, -3, 6, -1, + -3, 0, 5, -3, 0, 0, -2, 4, 0, -2, + 2, 2, 0, -2, 1, 3, 1, -1, -1, 1, + -2, -2, 1, -1, 0, 1 + }, + { + 147, -1493, -13, -36, 30, -7, -1, 4, -1, 5, + -7, -3, 35, -22, -6, -5, 19, -25, -9, 0, + -16, 17, 8, -2, 7, -10, 4, -6, 13, 3, + 3, -3, 2, -5, -7, 5, -9, -1, -2, 16, + 0, -16, 11, 13, 7, 13, 2, 3, -1, -4, + 2, -5, 0, 7, -3, -2, -2, 1, -8, -3, + 3, 5, -1, -1, 4, -2, 4, -1, 2, 1, + 1, -5, -4, 3, 0, 2, 1, 0, 0, 2, + 2, 1, -2, -2, 0, -2, 1, -1, -2, 1, + 1, 0, 0, 1, 0, -1 + }, + { + -11, -281, 49, 17, 3, -8, 12, 26, 11, 2, + -4, 5, -13, 47, -66, -65, -75, 80, 2, 25, + -46, 21, -15, -9, -8, 44, -9, -22, -1, -1, + -2, 24, -16, 30, -11, 19, 19, 1, 1, -7, + -3, 6, 6, -15, 1, 6, 2, 16, -13, 5, + 8, -3, 10, -2, -2, -2, 5, 6, 0, 0, + 1, -2, -3, 5, 7, -2, 0, -2, 0, 4, + -4, -4, 0, 0, -2, 2, 3, 2, 4, 0, + 2, -2, -3, 1, 1, 0, 2, -1, -1, 1, + 1, 2, -1, -1, 1, 2 + }, + { + 245, -1338, 31, 106, -18, -1, 7, -18, -15, 42, + 21, -20, -20, 5, 0, -25, -1, 25, 1, 6, + 7, 7, -20, -21, 3, 1, -1, -17, -24, 13, + -1, -2, -16, 2, 1, 1, 2, 2, -1, 8, + 8, -2, -7, 5, 0, -12, -4, -6, 0, 7, + 0, 2, 7, 4, -2, 6, 6, 0, -4, -3, + -4, 2, 5, 4, -1, -3, 3, 2, 0, 0, + 0, 2, 0, 1, 0, 2, 2, -1, -2, 1, + -1, -3, -4, 2, 1, 2, 0, 2, -2, -1, + 2, 0, 0, -2, 0, 1 + }, + { + -7, 109, 3, -23, -2, -3, 11, 6, 7, -8, + -3, 1, -8, -56, -27, -135, 66, 1, -60, -12, + 21, -6, 40, -94, -17, -28, -3, 33, -4, 65, + 26, 12, -44, 34, 22, -11, -14, 3, -14, 18, + -2, -14, -1, -2, 0, 7, 4, 1, -1, -5, + -7, 0, 2, -1, 2, 2, 7, 1, 0, 3, + -2, -4, 1, -1, -4, 0, 3, 3, -3, -7, + -3, 4, 1, -1, 2, 0, 3, 3, 0, -1, + 1, -1, 0, -1, 0, 1, -2, -2, -2, -3, + -2, -1, 1, 0, -1, 0 + }, + { + 18, 1968, -19, 33, 19, 11, -5, 9, -4, 1, + 24, -29, -7, 15, 14, -21, 3, -7, -12, 5, + 2, 0, 9, -17, -32, 2, -14, 9, -15, 12, + 3, -1, 8, 10, -6, 11, -3, 6, -3, -5, + -3, 0, 3, -14, 13, -20, -4, -14, 2, 11, + 1, -3, -7, -4, 2, 3, 3, 3, 0, -1, + -4, 0, 3, -3, -4, 0, -1, 2, 0, -1, + 1, 1, 0, 7, 0, -3, 4, 1, -3, 1, + 1, -1, -1, 0, 0, 0, 1, 0, 1, 0, + -1, -1, 1, 1, 0, -1 + }, + { + -8, 115, 22, -42, 6, -5, -5, 3, 11, -2, + -6, -6, -31, 10, 155, -309, -63, 66, 6, -9, + -3, -39, -44, 96, 18, 64, 12, 19, 22, -16, + -13, 4, 18, 3, -5, -11, -14, -1, 0, 5, + 18, -7, -10, 2, 9, 10, 2, -8, 9, -11, + -6, -8, 2, -2, 0, 0, 7, 8, 6, -4, + -4, 0, 1, -7, -3, -1, -4, 0, 0, -4, + -3, -2, -1, 6, 3, 0, -2, 2, 0, 0, + 0, -5, -2, 2, 0, 2, 4, 0, -1, -1, + 0, 0, 0, 1, 1, 1 + }, + { + 120, -107, -88, 57, 39, 38, -1, -12, -5, 22, + -4, 9, 0, -44, 50, -31, -25, 18, 6, -9, + 11, 9, 8, -8, 8, 3, -20, 3, 19, -6, + 5, -12, 3, 12, -5, -15, -8, 9, -7, -3, + 19, 2, -4, -3, 10, 18, -10, -12, 6, 15, + 0, 0, 10, -5, -10, 2, 1, -6, 0, -1, + -2, 0, 1, -1, -2, 3, 0, -2, 2, 2, + 2, 0, 2, -1, 1, 1, 1, -3, 1, -1, + -3, 0, 3, 0, 2, 3, 2, 1, 2, 0, + 0, -1, -1, 0, 1, 1 + }, + { + 10, -19, 39, -69, 7, 1, -15, 18, 17, 17, + 5, 7, 1, 9, 36, -9, -16, 7, 37, -35, + -29, 27, 0, -21, 8, 28, -45, -12, -10, -27, + 9, 9, -1, -3, 5, 0, -12, -1, -1, -2, + -4, -7, 0, 1, -8, 4, 1, 0, 6, 6, + 6, -1, -4, -2, -2, -4, 0, 3, 1, -3, + 9, -2, -8, -2, 6, 0, 2, 5, 0, -2, + -2, -1, 1, 2, 1, -3, -2, -4, 1, 1, + -1, 3, 1, -4, -2, 1, -1, 0, -1, -2, + 1, -1, 0, 0, 2, -1 + }, + { + 74, 48, -51, 33, 31, 31, -36, -10, 15, 10, + -15, -20, 5, 11, 26, 6, 32, -22, 6, -11, + 7, 16, 9, -12, 15, -2, 6, -5, -9, 0, + -2, -5, -14, 5, 5, -4, -17, -4, 6, -2, + -1, 0, 6, 9, -8, -8, 0, 5, 0, 4, + 4, 5, 6, -3, -2, 2, 0, 0, -6, 0, + 4, -1, 0, 5, 0, -4, 0, -1, -1, 4, + -1, -2, 2, 0, 2, 1, -1, -2, -1, 0, + 1, 3, 0, -1, 1, -2, -1, 1, -1, 1, + 1, 1, 1, -1, 0, 1 + }, + { + 4, 106, -12, 64, 13, 3, 17, -16, 14, 5, + 6, 24, -19, -37, 70, -125, 63, -13, 11, 30, + -101, 130, 39, -25, -7, 6, 7, -36, 19, 45, + 0, -5, -1, 3, 2, 6, -1, -7, 2, 5, + -4, -8, -2, -3, 1, -5, 3, 11, -9, -6, + 6, 9, 1, -3, 3, 5, -5, -4, 1, -4, + -2, 3, 2, -2, -2, 1, 0, -5, 1, 0, + 1, -1, 0, 0, 3, 3, 3, -2, -1, 1, + -3, -3, -2, -2, 0, 0, 2, 1, -1, 0, + -1, 2, 3, -1, 0, 2 + }, + { + 1, 99, -28, -4, -18, 0, -72, 4, -11, 9, + 0, 25, -25, 29, 109, -7, -20, 11, -19, -4, + 3, 14, 4, 7, 34, 2, 1, 14, 14, -11, + -3, 0, -2, -6, 4, 3, -7, -13, -6, 4, + 12, -2, 3, -14, -9, -11, -3, -3, 1, 13, + -5, -6, 5, -1, -4, -6, -3, 7, -1, -2, + -1, -2, 1, -4, -2, -5, -1, 2, 1, -4, + 0, 1, 0, -1, -3, -2, 3, 1, -3, -2, + 0, 0, -3, -1, 0, -2, 1, 4, -1, 0, + 1, -1, -1, 0, 1, 0 + }, + { + 5, -72, -28, 31, -20, -1, -4, -3, 10, -20, + 27, 17, -13, -40, -328, 37, -103, -1, 3, 0, + -27, 62, 23, -13, -14, 50, -40, 65, -23, 7, + 17, -5, -10, 20, -31, 20, 35, -8, 1, 12, + 2, 5, -2, -18, 2, 5, -13, 3, 4, 1, + 5, 2, 6, -5, 1, -1, 0, 0, 3, 8, + 3, 0, 1, 5, 0, -1, -5, 1, 3, 1, + -4, 2, 4, -2, 3, -4, 0, 1, 2, 0, + -2, -1, -3, 2, 1, 0, 1, -1, -2, 0, + 0, -1, 0, 2, -1, -1 + } + }, + { + { + -42, 264, -54, -6, 28, 19, 13, -3, -2, -28, + -21, 28, 9, 8, 40, -4, 4, 10, -20, -50, + -10, 9, 6, -19, 0, 4, 16, 11, 3, 26, + 7, 7, -9, -1, 8, 3, 1, -26, -3, 6, + -7, 2, 0, 0, -8, -8, 3, 8, -4, -7, + -12, -6, 1, 5, 0, 5, 6, 8, 4, -2, + -2, 1, 3, 3, 3, 2, 0, -4, 0, 4, + 2, 0, -1, -2, 2, 4, -3, -1, 0, -3, + -2, -3, 0, -1, 0, 1, -2, 1, -1, -1, + 0, 1, 0, 0, 0, 0 + }, + { + -3, 192, 37, -18, 0, 18, 13, -6, -2, 12, + 4, 9, 3, -22, 74, 96, 11, -6, 10, -46, + -3, -2, -25, 40, 45, -40, -3, -10, 11, 7, + -12, -2, -10, 9, 8, -17, -13, -2, -4, 0, + -11, 4, -5, 0, 3, -3, -6, 1, 4, -9, + 4, 3, -5, -7, 5, 13, -3, -3, 2, 1, + -9, -4, -3, -1, 1, 2, -2, -6, 0, 1, + 0, -2, 5, 0, -1, -2, 3, 3, 1, -4, + -1, 4, 1, -1, -1, -2, -1, 1, -2, -2, + 2, 0, -2, -3, -1, 1 + }, + { + -62, 150, 243, -42, -84, 1, -2, -10, 22, 18, + -8, -11, 20, 29, 43, 37, 9, -2, 33, -7, + 25, 22, -15, 3, 0, -18, -17, 7, 9, 1, + 5, 12, -1, -12, 4, 13, -4, 10, 6, 1, + 10, -5, 5, -14, -7, -3, 3, -1, -1, 4, + 8, -5, -5, 6, -2, -3, 0, -6, 5, -1, + -3, -1, -2, 1, 2, -7, -3, 1, -1, -3, + 3, -1, -3, 0, 1, 3, 3, -1, -3, 1, + 2, 0, 0, 2, -1, -1, -1, 0, 1, -1, + 0, 2, 1, 0, 1, 0 + }, + { + -383, -831, 72, -22, -33, -2, -7, -5, -9, 3, + 19, 13, 14, 12, 11, 9, -2, -11, 11, -6, + 1, -10, -1, 6, 8, 8, -8, 2, 0, -19, + 0, -8, -6, 8, -6, -15, -1, -6, 14, 1, + -4, 4, 5, 7, 11, 2, -7, 2, 0, -1, + -5, 3, 1, -4, 2, -9, -3, -1, -3, 2, + 0, -5, 0, -2, -4, 1, -2, -1, 3, -3, + -3, 4, 6, 0, 2, 0, -1, 1, -1, -1, + -2, -2, -1, 1, 0, 1, -1, 0, 2, 0, + -2, 0, 1, -1, -1, 0 + }, + { + 11, -128, -38, 1, -10, 11, 4, 8, 9, -23, + 9, 5, -2, -105, 92, 25, 52, -8, -134, 38, + 5, 6, -17, 5, 12, 64, 12, -6, 15, -65, + 17, -10, 7, -9, -4, 34, -3, -6, 2, -16, + 3, 1, -17, -15, 4, -7, 9, 4, -9, -3, + -4, 8, 5, -2, 2, 6, -4, 0, 4, -3, + -5, -2, 0, -1, -4, -6, -4, -2, 4, -1, + -1, 3, 0, 4, 3, 0, -3, -1, -2, -3, + -3, 0, 3, 0, -1, 0, -1, 0, 1, -1, + 0, -1, 0, 1, 1, -2 + }, + { + -489, -390, 132, 39, 62, 6, -17, -28, 26, -5, + -35, 0, 5, 10, -19, -6, 12, -5, -1, 9, + -15, -18, 5, -9, -2, -4, 8, -15, -1, -8, + -2, 10, 2, 0, -5, -3, 12, -2, 8, -3, + 1, -10, 6, 8, -19, 5, 4, 0, 3, -2, + 6, 8, 1, -12, 0, 5, -6, -6, 0, 1, + -1, -2, -5, -1, 2, 1, 1, -2, 4, -1, + -2, -3, 2, 3, 0, 2, -3, 0, 2, 1, + 0, 1, 5, 3, -2, -2, -1, -1, -2, 2, + -1, 0, -1, 1, 2, 0 + }, + { + 17, -6, -34, 23, -5, 4, -2, -4, -2, 10, + -7, -2, 0, -39, 28, 36, 17, -9, -27, 11, + 21, 31, -59, -68, -2, -11, -4, 21, 27, 41, + 16, -5, 14, 13, -19, -3, -10, 1, -2, -2, + -12, -3, 3, 7, 4, -8, -5, 4, -2, 4, + -2, 1, -5, -5, 2, 1, -2, 0, 8, 4, + 4, 3, 1, 0, -1, 3, 0, -6, -4, 3, + 5, -4, -4, -2, -2, -3, -1, -3, -2, 0, + 1, -1, 0, 1, 0, -1, 0, 1, -1, 2, + 3, 2, 0, -1, 1, 0 + }, + { + 234, 1763, 66, 3, 2, -1, 15, 22, -1, -9, + -10, 2, 25, -8, -17, -2, -5, 13, 28, -28, + -8, 5, -9, -30, -2, -3, -13, -1, -5, -5, + -1, 17, 11, -13, -2, -11, -11, 9, -17, -4, + 5, 2, -1, 0, 4, -12, -1, 1, 1, -6, + -3, -4, 11, 7, -4, -6, -2, -1, -2, 3, + 0, 0, -1, -7, -1, 2, 1, -1, 2, 3, + -2, 0, 1, -3, -5, 3, 1, -5, 1, 0, + -2, 2, 1, 0, 0, 1, -1, -3, 0, -1, + 0, 0, -2, -1, -1, 1 + }, + { + 27, 19, -135, -3, -8, 5, 1, 1, -11, -1, + 8, 11, 7, -14, 68, -244, -60, 62, 17, -20, + -64, 37, 6, 35, -22, 81, 34, -30, 25, -14, + -3, 16, -2, 22, -22, -26, 9, -2, 2, 10, + -7, -12, -3, -13, -7, -3, 2, 0, -5, -2, + -3, 0, 3, -8, -8, 5, 5, -4, -2, -2, + 6, 6, 7, 3, 6, 5, 2, 2, -5, -1, + 1, 3, 3, 1, -4, -1, 1, 0, 1, 0, + -2, 2, 3, 0, 0, -1, -3, -4, 0, 1, + 0, 0, 1, 0, 0, -1 + }, + { + -66, 70, 20, 59, -15, 5, 23, 14, -9, -10, + -27, -19, -14, 18, -1, -2, 8, -29, -9, 19, + 19, 1, 2, -7, -10, 8, 2, -5, 4, -2, + -10, -6, -3, -25, -18, 6, 7, 1, 1, 2, + -3, -5, -3, 14, 5, -15, -8, 0, 1, -7, + -7, -3, -7, -7, 8, -2, -5, 2, -1, 1, + 5, -6, -2, -2, 1, 0, -1, 1, 0, -3, + 1, 2, 0, -2, 0, 0, 0, -1, 2, -1, + 2, 1, -1, -2, 0, -3, -3, -1, -2, -1, + 0, 0, 2, 1, -1, -2 + }, + { + -15, 93, 22, -64, -14, -11, -16, 20, 0, 11, + -28, 6, 38, -14, 34, -8, 22, 45, -26, -15, + 51, 21, -13, -31, 10, -10, -30, -1, -9, 11, + 14, 9, -4, 5, -9, -5, 13, 6, 9, 5, + -4, -4, -9, -4, -1, -5, 3, 2, -2, 1, + -6, -3, 7, 10, 4, -2, 1, -2, -4, 1, + -2, -5, 3, 2, -3, -3, 1, -5, -4, -1, + -1, 3, 3, 0, -2, 0, 2, 5, 3, -2, + 2, -1, -2, 2, 3, 0, 1, 1, 1, 2, + 0, 0, 0, 0, 0, -1 + }, + { + 0, 203, -35, 92, -45, -27, 41, 11, 20, -9, + 12, 29, 3, 29, 22, 27, 17, -12, 1, -15, + 18, -6, -6, 6, 0, -3, 7, -18, -2, 8, + -1, 0, 8, 22, -15, 8, 15, 14, 6, -2, + -2, -1, 7, -10, -4, -5, 2, 2, -1, -1, + -1, -1, -3, -2, 4, -2, 2, 0, 3, 3, + -4, 3, 3, -3, -1, 3, 2, 2, 2, -2, + -2, 1, -1, -1, -2, 0, 1, 0, 1, 1, + 1, -1, -3, 0, -2, 0, 2, -1, 1, 0, + -2, -1, -3, 0, 1, 0 + }, + { + -6, 74, 66, 13, 6, -3, 7, 9, 6, -4, + 11, 9, -56, 48, -137, -80, 43, 10, -2, -24, + 46, 59, -32, 1, 16, -13, -25, 22, -22, 8, + 21, 24, 3, 13, 1, 20, -3, -10, -9, -7, + -3, -7, -2, -7, 1, -4, -7, -6, 4, -5, + -5, -7, -3, 3, -1, -4, -3, 7, -2, 4, + 11, -2, -10, -5, -1, 3, -1, 2, 2, -2, + -1, 0, 1, 1, 0, -5, -3, 0, 1, 0, + 2, 3, 1, 2, 1, 0, 0, -2, 1, 0, + 1, 0, -4, 0, 1, -2 + }, + { + -10, 118, -17, 38, 18, -76, 10, -3, -31, -12, + 20, -15, -21, 16, 134, -12, 35, 22, -23, -1, + 2, -1, -4, 8, 11, 10, -10, -12, -2, -14, + 1, 8, 16, 17, 6, 3, 2, -1, 13, -18, + -3, -8, -8, -2, 9, 9, 10, 0, 1, -3, + -3, 8, -6, -4, 3, 8, 6, 1, -3, 1, + -2, 2, 2, 3, 4, 5, 2, -2, 0, -2, + 0, -2, 0, -1, 3, 2, 0, -3, 3, 4, + 1, 0, 3, 3, -1, 2, 2, -3, -1, 1, + -1, 0, 1, 0, 0, 0 + }, + { + -13, -46, 36, 1, -3, -3, -14, 27, 2, 7, + 10, 21, 52, -242, -272, -158, 20, -2, -6, 37, + 29, 23, 32, -31, -22, 16, 4, 80, -24, 7, + -21, -7, 5, 2, -1, 30, -28, -4, 22, 0, + -14, -11, -17, -3, 5, -3, 1, -3, 1, 1, + 0, -3, -12, -4, 0, 6, -9, -2, -4, -10, + -6, 2, 3, -1, -1, -3, 8, 6, -5, -2, + 0, 0, -6, -2, -3, -1, 5, -3, -2, -3, + 1, 3, 3, 1, -3, 1, -2, -1, 2, 1, + 0, 1, 0, -1, 0, 1 + } + }, + { + { + 95, 453, 218, -13, -21, 11, 3, -5, 2, -29, + -5, 32, -1, -10, 4, -1, -21, -1, 2, -22, + 16, 5, 8, -22, -4, -3, -1, -5, 1, 21, + -1, -8, -22, -12, 17, -6, -3, -22, -2, 2, + -1, 8, -5, -3, -10, -7, 2, 8, 2, -5, + -7, -2, -1, 8, 4, 3, 6, 8, 3, -4, + 1, 1, 4, 1, -1, -1, -3, -3, 1, 3, + 0, -2, -1, 0, 2, 2, -4, 1, -1, -4, + -2, -2, 1, -1, 1, -1, -1, 0, -1, -1, + 0, 0, 1, 1, 0, -1 + }, + { + 11, 15, -103, -32, -6, 6, -2, -13, -1, 15, + 22, 4, 1, -10, 112, 125, -1, -26, 4, -41, + 9, 31, 15, 25, 28, -21, -18, -14, 15, 10, + -13, -42, -22, 18, -11, -5, -3, 6, 10, 11, + -13, -8, -7, 5, -2, 0, -6, 6, 4, -8, + 5, -2, -9, -6, 15, 12, 0, 2, 3, -3, + -8, 1, 0, -1, -3, 1, -3, -3, 1, -1, + 0, 0, 2, -1, 0, 1, 4, 1, -1, -3, + 1, 4, -1, 0, -2, -2, 0, 0, -3, 0, + 2, -1, -2, -2, 0, 2 + }, + { + 37, -86, -78, -50, -33, 6, -2, -8, 11, -2, + -13, 3, 17, -2, 12, 10, -18, -18, 45, -40, + 6, 4, -15, 11, 6, -16, -15, 10, 5, 10, + 16, 6, -1, -8, 13, -4, -11, 12, 4, -1, + 6, -14, 2, -10, -12, -5, 0, 1, 1, 4, + 2, -2, -5, 2, -3, 4, 0, -4, 5, -2, + -5, -2, -2, 2, 2, -4, 1, 2, -3, -1, + 4, -3, -3, 1, 1, 3, 0, -3, -1, 1, + 0, -1, 1, 2, -1, -2, -1, 1, 0, -1, + 1, 2, -1, 0, 1, -1 + }, + { + 478, 155, -125, 11, 20, -3, -6, -1, -2, -12, + 2, -1, -14, 15, 6, -23, -6, 4, 17, -8, + 6, -6, 6, 9, 6, -1, -23, 7, -13, -10, + 8, -7, -1, 12, -2, -14, -10, -1, 9, -6, + 1, 3, 6, -2, 0, -8, 1, 2, 2, -1, + -6, 7, -4, -4, 1, -3, 2, 2, 3, 3, + 0, -4, 2, -2, -3, 1, -3, 2, 1, -1, + -2, 4, 4, -2, 1, -1, 0, 1, -2, -1, + -1, -2, 1, 0, 0, 2, -1, 2, 1, -1, + -2, 0, 0, -1, 0, 1 + }, + { + -24, -19, 51, -13, 0, 7, -9, -5, 2, -20, + 4, 10, -9, -15, 172, -21, 31, -55, 13, 20, + 11, 27, 9, 38, 7, 25, -27, -16, -12, -87, + 14, 3, 11, -17, -14, 22, -1, 6, 6, -14, + -1, -3, -11, -2, 6, -6, 3, -3, -3, -7, + -1, 7, -5, -1, 2, 6, -8, -1, 4, -2, + -1, 1, -1, -5, -5, -2, 0, 1, 2, -2, + 4, 4, 0, 2, 2, -2, -3, -2, -3, -1, + -1, 2, 3, -2, 0, -1, -1, 1, 0, -1, + -1, -2, 0, 2, -1, -2 + }, + { + 521, 842, 5, -38, -36, 3, -16, 5, 14, -38, + -30, 14, 11, 32, 11, -1, 1, -25, -3, -4, + -22, -12, 7, -5, -6, -1, 14, 0, 2, -9, + -3, 14, -1, -14, -9, -4, 7, 0, 13, -8, + 2, 1, -1, 9, -14, 8, 3, -1, -1, -6, + 7, 2, -4, -11, 2, -2, -8, -2, 3, 2, + 1, -2, -6, -3, 3, 1, -2, -1, 4, -1, + -1, -2, 1, 1, 0, -1, -2, 1, 3, 1, + 0, 2, 4, 0, -2, -2, 1, -2, 1, 1, + -1, 0, 0, 2, 1, -1 + }, + { + 8, -34, -1, 17, -2, 2, -8, -12, -1, 14, + -2, -4, -3, 2, 35, 86, 1, -9, -1, 6, + -5, -33, -68, 6, 10, -19, -25, 8, -18, -8, + 2, 10, 26, -6, -12, 11, 2, 3, -5, -8, + -1, 12, 1, 6, -3, -12, -4, 6, -3, 7, + -2, -1, -5, -1, 0, 0, -3, 2, 1, -2, + 4, 4, -1, 0, 2, 1, -4, -2, 0, 4, + 3, -5, -2, -2, -3, -3, -2, -3, -1, 1, + 0, -1, 1, 1, 0, -1, 1, 2, 1, 3, + 2, 1, -1, 0, 1, 0 + }, + { + -471, 932, 118, 4, -4, 0, 28, -4, 4, -11, + -11, 32, 14, -13, 15, 9, -1, 13, 16, -25, + 3, 4, 1, -8, 14, -13, 0, -4, -11, 6, + 9, 11, 3, -21, -8, -21, -15, 13, -6, 1, + 8, 0, -6, 3, -2, -3, 4, 5, -7, -7, + -3, 1, 11, 2, -3, -3, 0, -2, -2, 3, + 0, -1, -2, -2, 2, 1, 2, -1, 0, 1, + -2, 0, -3, -4, -2, 4, -4, -3, 2, -1, + -2, 2, 0, 0, 1, 0, -1, -1, 0, -1, + 0, 0, -1, -1, 0, 1 + }, + { + 9, -76, -69, 31, -5, 7, 1, -4, -12, 6, + 14, 7, 0, -107, -26, -49, 26, -9, 10, -27, + -62, 54, 48, -9, -58, 58, 3, -19, 8, -23, + -2, -4, 2, 19, -14, -8, 11, -7, 18, 3, + -14, 4, 3, -14, -13, -3, 3, 10, -5, 0, + -1, 2, -1, -4, -2, 5, -1, -9, -2, -1, + 6, 4, 7, 5, 3, 3, 1, 0, -5, 0, + 3, 3, -1, -4, -4, 1, 0, -2, 1, -1, + 0, 3, 2, -1, 0, -3, -4, -2, 1, 1, + -1, 1, 0, -1, 0, -2 + }, + { + -1, 62, -114, -6, -38, -44, 3, 16, -13, -18, + -15, -16, -6, 34, -10, 6, 13, -26, -8, 21, + -7, -16, -5, -6, -9, 8, 8, -9, -1, 10, + -5, -5, -2, -16, -12, 12, 9, 3, 15, 1, + -3, -4, 5, 12, -8, -12, 7, 5, -5, -11, + -3, -1, -7, 0, 8, -6, -1, 4, -3, 2, + 2, -1, -2, -2, 4, -2, -1, 1, -3, -2, + -1, 0, -1, 0, 0, 0, -2, 2, 0, 1, + 3, 0, -2, -1, -2, -3, -2, 0, -2, 0, + 0, 1, 1, 0, -1, -2 + }, + { + 14, 204, 58, -5, 0, -12, -6, 15, -16, -3, + -16, 10, 19, -12, 39, 22, 19, 15, -32, 31, + 50, 17, 8, -5, 18, -8, -11, -7, 8, 29, + 5, 3, -5, 4, -22, -5, 15, 3, 9, 3, + 7, -2, -2, 5, 0, -7, 3, 2, -8, -6, + -5, 0, 7, 7, 1, 2, -1, -4, -2, 3, + -6, -1, 4, 0, -5, 0, -3, -7, 0, 0, + 0, 3, 0, -2, -1, 2, 2, 4, 0, -1, + 1, -2, -2, 3, 2, 0, 1, 0, 1, 1, + -1, 0, 0, 0, -1, 1 + }, + { + -119, 140, -5, 23, -68, -14, 32, -10, -2, -9, + 17, 9, 0, -1, -7, 11, 4, -2, -5, -5, + 11, -18, -8, 10, -7, -4, -4, -6, -8, 4, + 1, 11, 11, 9, -16, 4, 22, 19, -3, -1, + -2, -2, 2, -4, 0, 0, -2, -1, -2, 2, + -3, 1, -7, 2, 4, -1, 2, 4, 5, 1, + -5, 4, 0, -5, 1, 1, 1, 2, 0, -5, + 0, 1, -1, 0, -1, 0, 1, 1, 1, 0, + -1, -2, -1, 1, -2, 1, 1, -1, 1, -1, + -2, -2, -2, 1, 0, -1 + }, + { + 6, 22, 3, -17, 3, -12, 6, 10, 5, -11, + 1, 10, 7, 144, -141, 10, 33, -6, -16, -38, + 109, 16, -93, -33, 8, -21, -7, 28, -30, -11, + 31, 17, -1, 3, -8, 14, -8, 4, -14, -4, + -1, -6, 3, -4, -2, 2, -6, -2, 11, 0, + -5, -7, 0, 5, -2, -4, -1, 5, -2, 6, + 7, -6, -7, -1, 3, 2, -2, 3, -1, 0, + -1, 0, -1, 0, -2, -4, -2, 1, 1, 0, + 2, 3, 1, 2, 0, 1, -1, -1, 1, 1, + 1, -2, -4, 1, 0, -2 + }, + { + 31, 167, -65, -14, 20, -39, 66, -4, -30, -12, + -10, -33, 12, -47, 51, -4, 13, 26, -12, -5, + 3, -3, 6, -1, 11, 2, -24, -26, -1, 8, + -3, 8, 17, 15, 3, 7, 6, -1, 8, -21, + 0, -20, -5, 10, 16, 9, 6, -2, 3, -8, + 7, 5, -7, -1, 5, 10, 4, -3, 1, -2, + 2, 2, -1, 5, 3, 4, -1, -2, 0, 2, + -2, -1, -1, 0, 3, 2, -2, -2, 4, 3, + 0, 1, 4, 1, -1, 2, -1, -3, 1, 1, + -1, 1, 1, 0, -1, 0 + }, + { + 7, -2, 25, -12, 2, -4, -4, 32, 16, 17, + -23, 4, 43, -6, 242, -50, 0, -4, 6, 55, + 25, -9, 36, -14, -21, 28, -6, 45, -19, 7, + -15, -1, 3, -2, 4, 14, -29, 1, 8, 0, + -20, -11, -3, 13, -1, -5, 6, -1, -3, 0, + -1, -1, -9, 2, -1, 3, -10, 0, -6, -10, + -2, 2, 0, -1, 1, -2, 9, 0, -4, -1, + 0, -2, -5, 1, -3, 2, 2, -3, -1, -2, + 3, 2, 3, -1, -2, 0, -2, 0, 2, 0, + 0, 1, 0, -1, 1, 1 + } + }, + { + { + -118, 1412, -104, -68, 44, -14, 7, 13, -4, 1, + 21, -7, -12, 19, -47, 19, -26, -16, -12, 35, + 9, -10, 0, -13, -1, -15, -4, -11, 11, 19, + 6, -15, 8, -12, 1, -8, 12, 0, -4, -15, + -1, 9, -5, -2, -3, 3, -4, -6, 12, 0, + 3, 1, -7, 6, 3, -4, -2, -4, -3, 0, + 7, 0, -2, -5, 0, -3, 2, 2, -1, -2, + -2, 0, 1, 0, -3, -5, 3, -1, -1, 3, + 2, 4, 0, -1, -1, 0, 2, -1, 2, 1, + 0, 0, 1, 0, 0, 1 + }, + { + -12, -114, 62, -8, 16, -7, -14, 2, 9, 5, + 22, 16, -20, -17, 99, 26, -29, 5, -50, -33, + 6, 41, 4, 4, -16, 13, -15, 30, 3, -2, + -8, -53, 10, 4, -13, 22, 10, 11, 8, -13, + 1, -2, 16, -1, -5, 4, 0, 2, -2, 5, + 1, -3, 6, 8, 2, -7, 3, 3, -2, -1, + 3, 6, 1, -2, 0, -3, 1, 6, 0, -2, + 1, 1, -5, -2, 4, 1, -2, -2, 0, 4, + 0, -3, 1, 1, 0, 2, 1, -1, 1, 1, + -3, -1, 1, 2, 1, -1 + }, + { + -26, -403, 101, 56, 41, -11, 5, -5, -16, -22, + 15, 14, -19, 24, 5, 24, -23, -12, 23, -36, + -29, 10, -13, 12, 19, 9, -6, 17, -17, 12, + 10, -9, 8, -1, -12, -1, 9, -6, 0, -9, + -10, -7, -6, 6, -2, 4, -4, 6, 4, -2, + -1, 11, -2, -2, 5, 4, 0, -3, -2, -3, + 1, 3, 0, -1, 0, 4, 1, -2, 2, 2, + -1, -2, 3, -1, -1, -2, -3, 1, 1, 0, + 0, 1, 1, -2, 1, 2, 1, 0, -1, 0, + 0, -2, -1, 0, -1, 0 + }, + { + -398, 1120, 89, 31, -18, 3, -2, 13, 1, -24, + -11, -9, -4, -5, -32, -41, 10, -6, -7, -2, + -1, 13, 13, -3, 4, -22, -5, -4, -8, 27, + 3, -2, 15, 1, -5, -17, 1, 5, 5, -4, + -3, -10, 11, -2, 1, -4, 12, 0, 0, 3, + -1, -1, -5, 7, -3, 3, 1, 8, 0, -1, + 1, 4, 4, 1, 6, -2, 2, 2, -2, 4, + 1, -6, -4, -1, -1, 0, 2, 0, -1, 2, + 3, 1, -1, -2, 0, -1, 1, 1, -3, 0, + 1, 0, -1, 1, 1, 0 + }, + { + 26, 14, -76, 3, 11, -8, -4, 6, 5, -4, + -2, -8, 20, -42, 117, -47, -34, 32, 154, -46, + -7, 18, 20, 34, -9, -25, -18, -46, -36, -14, + -21, 25, 13, -7, 3, -8, 23, 17, -5, 4, + -2, -4, 13, 2, 1, 9, -4, 1, 8, 0, + 1, -4, -1, 2, -4, -1, -1, 3, 1, 2, + 3, 3, -2, -2, 7, 5, 3, 0, -3, 2, + 0, -2, 0, -1, -3, 0, 1, 1, 4, 4, + 2, 1, -5, 0, 1, -1, 1, 0, -1, 0, + 0, 1, 1, -1, -1, 2 + }, + { + -339, 1826, 47, -46, -12, -7, 2, 34, -41, 5, + 33, -4, -15, 21, 33, -13, -7, -3, 0, -13, + 6, 13, -9, -23, -8, 6, 3, -4, -5, 7, + -4, -5, -16, -3, -6, -3, 5, -1, 8, -2, + 10, 5, -8, 12, -11, -3, -3, -3, -10, 3, + -3, -3, 7, 5, -2, -6, 8, 6, 0, -3, + -2, 2, 5, 1, 0, -2, 1, 2, -1, 3, + 0, 3, -1, -1, 1, -1, 2, 1, -1, -1, + -1, -2, -4, -2, 2, 2, 1, 1, 1, -2, + 0, 0, 1, 0, -1, 1 + }, + { + -18, 29, 77, -9, 0, -5, -2, -1, 5, -3, + 3, 4, -16, -61, 5, 75, -71, -4, -1, -13, + -18, 13, -29, -46, -36, -27, 9, -1, -65, 19, + 18, 5, -17, 19, 28, 7, -7, 2, -5, 10, + 15, -1, -4, -4, -6, 2, 1, 8, -6, 0, + -5, -1, 2, 3, -2, 3, 5, 5, -8, -3, + -1, -1, -4, -2, 2, -3, 0, 6, 1, -6, + -3, 2, 3, -1, 1, 1, 2, 2, 3, -1, + 0, 1, 1, 0, 0, 1, -1, -1, 0, -2, + -3, -2, 0, 1, -1, 0 + }, + { + 553, -316, -171, 36, 1, 9, 1, -14, 0, 9, + 23, -1, -31, -9, 64, -2, 4, -15, -14, 24, + -7, -1, 8, 18, -10, -13, 10, 2, -16, 3, + 20, -5, -6, 5, -8, -2, -8, 12, 1, 5, + 0, -2, -3, -6, -2, -1, -2, -9, -7, 5, + 4, 1, -11, -5, 4, 3, 6, 4, 1, -3, + -5, 1, 1, 2, -1, -2, 2, 1, -3, -3, + 1, 0, -2, 4, 4, -3, 0, 4, -1, 0, + 1, -2, -2, 0, 0, -2, 1, 2, 0, 0, + -1, 0, 1, 1, 1, 0 + }, + { + -25, 9, 106, -23, 10, -7, 0, 4, 4, 4, + 2, -9, -10, 1, -179, 64, 0, -80, 8, -2, + -9, 0, 38, -1, -28, -3, 8, 31, -22, 23, + -23, -31, 24, -11, 13, 5, -11, 2, 11, 1, + 10, 12, -3, 6, 3, 6, -1, 9, 0, -2, + -7, -1, -6, 2, 5, -3, 5, 2, 3, -1, + -2, -4, 3, -4, -8, -2, -5, -3, 2, -3, + 2, -4, -5, 0, 4, 0, -1, 0, 0, 0, + 1, -3, -2, 0, 1, 0, 2, 3, 0, -2, + 0, 0, -1, 1, 1, 1 + }, + { + 40, -63, -142, 15, 5, -27, 2, 5, -9, 6, + 14, 0, 8, -16, 7, -2, 0, 13, 9, -12, + -13, -3, -8, -9, 9, 3, 3, -9, 10, 9, + -6, 9, 1, 15, -11, 8, -4, 9, 11, 0, + 7, 12, 6, -9, 3, 11, 10, -2, -2, 9, + 7, -1, 11, 3, -11, -5, 5, -1, -2, -2, + -3, 5, -1, 1, 0, 0, 2, -3, -1, 3, + -1, -1, 1, 2, 0, 0, 0, 1, -2, 2, + -3, -1, 1, 1, 0, 4, 2, 1, 2, 1, + 1, 0, -2, -1, 1, 2 + }, + { + -16, 260, -6, 42, 4, 9, 11, -10, -5, 6, + 23, -14, 2, 13, 37, 19, -17, -23, 21, 30, + -23, 13, 29, 22, 3, 7, 5, -15, 2, 1, + -9, -2, -3, -10, -4, 4, -11, -10, 1, -3, + 6, 0, 11, 7, -3, -1, -2, -1, 0, 0, + 6, 5, -6, -6, -6, 2, -2, 2, 2, 1, + 1, 3, -6, -4, 2, 3, -2, 3, 4, -1, + -1, -2, -2, 1, 1, 0, -1, -5, -2, 2, + -1, 1, 1, -2, -2, 0, -1, 0, -1, -2, + 1, 0, 0, 0, 0, 1 + }, + { + 187, -249, -67, -42, 6, -1, -23, -1, -26, 6, + -10, -44, 4, -13, -19, 0, 4, -1, 0, 13, + -10, 13, 2, -10, 0, 3, -3, 4, -10, -8, + 0, 11, -15, -4, -3, -9, -5, -6, -5, 9, + 1, 4, -7, 10, -4, 0, -10, 2, 2, 5, + 4, 5, 2, 1, 2, 1, -1, 3, -1, -3, + 3, 1, -4, 3, 2, -4, -3, -1, -4, 1, + 1, -2, 1, 2, 2, 1, -1, -1, -1, -1, + 0, 2, 3, -1, 2, 0, -2, 1, -1, 1, + 1, 1, 2, -1, -1, 1 + }, + { + -6, 4, -12, 11, 7, 7, 6, -10, 4, 8, + 10, 4, -21, 164, -95, 140, -13, 1, -18, -18, + 26, 4, -35, 6, -6, -5, -7, 8, 10, 31, + 6, -11, -10, -12, -1, -13, -2, 9, -8, 12, + -8, 3, 1, -1, -6, 5, 5, 11, 0, 7, + 2, 7, 6, -2, 0, 8, -2, -3, 0, -3, + -9, 2, 5, 3, 2, -3, 1, -4, 0, 2, + 0, -2, 0, -2, 1, 5, 3, 0, 0, 0, + -2, -4, -1, -2, -1, 0, 0, 2, -2, 0, + -1, 0, 4, 0, -1, 2 + }, + { + -44, 224, -37, -85, -2, 20, 7, -18, -4, 10, + -14, -9, 16, -11, -2, -17, -35, 1, -2, 3, + -8, 10, 13, 9, 33, -11, -7, -19, 22, 22, + -11, -3, 3, -10, 2, 8, -7, -8, -11, -1, + 7, -17, 4, 2, -1, -9, -9, -2, 3, 5, + 7, -9, 5, 3, -4, -3, -3, 0, 3, -5, + 3, -2, -2, -3, -3, -4, -4, 1, -1, 1, + -1, 2, -1, 0, -2, -2, -1, 3, -2, -3, + -1, 1, -2, -3, 0, -2, -2, 4, 1, -1, + 1, 0, -1, -1, 0, 1 + }, + { + -4, -1, -23, -2, 6, -4, 3, 8, 36, -8, + -29, 8, -11, 33, 499, 23, -89, -25, 27, -9, + -14, 41, 4, 13, 24, -1, 1, 10, 1, 5, + 9, -12, 0, 16, -12, -2, 28, -3, -10, 5, + -1, 8, 9, -3, -3, -1, -4, -1, 4, 4, + -2, 5, 9, 2, -2, -3, 3, -1, 2, 8, + 9, -3, -2, 4, 3, 2, -6, -3, 3, 0, + -2, -1, 4, 1, 2, 1, -4, 2, 2, 2, + -2, -2, -2, 0, 3, -1, 1, 0, -1, 0, + 1, -1, 0, 1, 1, -1 + } + }, + { + { + 17, 1853, -91, -142, 4, -10, 8, 13, -4, 8, + 17, -18, -19, 9, -41, 39, 2, 12, 9, 48, + 3, -5, -5, -7, 8, -3, -2, -5, 14, 2, + 9, -2, 27, 7, -4, 3, 9, -5, 2, -8, + 1, 7, -4, 7, 5, 3, 0, -13, 6, 6, + 6, 2, -3, 1, -2, -6, -4, -4, -2, 4, + 2, -2, 0, -3, 2, -1, 4, 0, -2, -1, + -1, 2, 0, -1, -3, -3, 3, -1, 1, 3, + 2, 3, -1, -1, -2, 2, 1, -1, 2, 1, + 0, 0, 0, -1, 0, 1 + }, + { + 9, -136, 47, 9, 11, -13, -17, 6, 4, -6, + -8, -6, -20, -73, 4, -31, -55, 18, -27, 0, + -3, 51, 12, -3, -41, -2, 7, 38, -13, -16, + 0, -33, 8, -4, 0, 10, -3, 7, 5, -17, + 11, 6, 15, -12, -8, 0, 3, 0, 0, 4, + -4, -3, 5, 6, -7, -6, 0, -3, -4, 3, + 8, 6, 0, -3, 2, 0, 4, 3, -1, -1, + 1, -1, -3, -1, 3, -1, -2, -2, 0, 3, + -1, -3, 1, 1, 0, 2, 0, 0, 2, 0, + -3, 0, 2, 2, 0, -1 + }, + { + 36, -529, -52, 83, 40, -12, 2, -5, -11, -6, + 27, -1, -15, 35, -15, 44, 2, -1, 20, 7, + -23, 22, 8, 1, 0, 11, -4, 5, -31, 3, + 3, -10, 17, 7, -15, 10, 12, -6, 0, -9, + -6, 1, -8, 3, 7, 5, -4, 5, 3, -4, + 1, 9, -5, -3, 4, 0, 0, -2, -2, -1, + 4, 4, 0, -3, 1, 4, -1, -2, 4, 1, + -2, 1, 3, -3, -1, -2, -1, 2, -1, -1, + 0, 1, -1, -2, 1, 1, 1, -2, -1, 1, + -1, -2, 0, -1, -1, 1 + }, + { + 185, 1731, -60, 51, 21, 14, 11, 15, 0, -20, + -7, 2, -1, -33, -31, 1, 17, -20, -12, -7, + -5, 10, -4, -8, 11, -14, 5, -12, 0, 22, + 3, 1, 4, -14, -13, -25, 6, 3, 14, 18, + -2, -11, 14, -1, -1, 0, 8, -2, -1, 4, + -2, -4, -1, 6, -3, 0, -4, 5, -3, -1, + 1, 2, 2, 2, 5, -3, 4, -1, -2, 2, + 1, -5, -3, 0, -1, 2, 1, -1, 1, 2, + 2, 1, -1, -1, 1, -1, 1, -1, -2, 1, + 1, 0, -1, 1, 0, -1 + }, + { + -14, 55, 5, 10, 2, -8, 2, 5, 4, 5, + 4, -4, 40, -5, 118, -87, -17, 65, 24, -28, + 11, 14, 34, 24, -38, -8, 20, -22, 20, 7, + -10, 37, 12, -4, 7, -16, 16, 11, -4, 6, + 0, 3, 12, 0, 3, 6, 1, 10, 6, 2, + -4, -8, 4, -1, -3, 2, 3, 6, 1, 2, + 3, 2, -1, 1, 8, 3, 1, -1, -1, 3, + -3, -2, 0, 0, -2, 2, 2, 2, 4, 2, + 1, 0, -3, 3, 0, 0, 1, -1, 0, 1, + 1, 1, 0, -2, 1, 2 + }, + { + 28, 2237, -13, -55, -13, -6, 5, 20, -28, 30, + 30, -15, -18, -8, 9, -8, -8, 2, -2, -4, + 15, 6, -21, -28, 2, 4, 2, -15, -5, 19, + 0, -5, -8, 6, -7, -6, -7, -14, 3, 0, + 2, -10, -10, 17, -8, -7, -7, -10, -7, 7, + -4, 3, 9, 3, -6, -2, 10, 3, -2, -5, + -3, 1, 7, 2, -4, -1, 3, 1, -1, 2, + 0, 2, -2, 0, -1, 0, 3, 0, -2, 0, + -2, -2, -3, 0, 2, 2, 0, 2, -1, -1, + 1, 1, 0, -2, 0, 1 + }, + { + -6, 52, 32, -23, 0, -2, 7, 7, 7, -3, + 6, 7, -16, -24, 41, 15, -72, 3, -21, -13, + 12, -1, 1, 9, -22, -38, -19, -13, -37, 20, + 6, -4, -32, 30, 22, 2, -4, 8, 3, 11, + 1, -14, -1, -5, 5, 9, -1, 3, -4, -1, + -3, -1, 4, 2, -2, 0, 3, 0, -5, -2, + -3, -1, -2, -3, 0, -2, 4, 4, -2, -6, + -1, 3, 2, 1, 2, 0, 2, 2, 2, -2, + 1, 1, 0, -1, -1, 1, -2, -1, 0, -2, + -3, -1, 1, 0, -1, 0 + }, + { + -440, -1481, 6, 36, 11, 6, -27, -11, -1, 13, + 16, -32, -23, 2, 28, -29, 1, -16, -2, 27, + -25, -22, -20, 4, -23, -8, -4, -15, -24, -4, + 6, -7, 2, 16, -6, -6, -12, 20, 9, 4, + -3, 2, -3, -10, 11, 0, -4, -11, -2, 5, + 3, -1, -10, 0, 3, 3, 5, 2, 0, -2, + -3, 3, 1, 1, -2, -2, 1, 1, -1, -2, + 1, 0, 2, 5, 2, -3, 3, 3, -3, 1, + 1, -2, 0, 1, 0, -1, 2, 1, 0, 0, + -1, 0, 1, 1, 1, -1 + }, + { + -11, 45, 52, -29, 1, -7, 2, 8, 4, -6, + -11, -4, 7, 45, -169, -57, -50, -37, 29, 59, + 74, 28, 11, -1, -25, -22, -10, -7, -29, 44, + -22, -9, 14, -17, 14, 0, -7, 13, 3, 5, + 13, 3, -5, 8, 5, 5, 0, 2, 3, 6, + 1, 0, -3, 2, 3, -5, 7, 3, 3, -1, + -4, -6, -2, -8, -4, 0, -4, -2, 5, -4, + 0, -4, -2, 4, 4, -2, -2, 1, -1, 1, + 0, -4, -1, 1, 1, 1, 3, 2, -1, -2, + 1, -1, 0, 1, 1, 1 + }, + { + -58, -58, 49, 60, 15, 26, 30, 9, 11, 30, + 9, -8, -2, -34, 9, -3, 36, 42, 21, -12, + -5, 3, 2, -3, 7, -7, 3, -5, 4, 2, + -1, 8, -2, 23, -8, 6, -5, 0, -2, 3, + 7, 16, 0, -8, 14, 11, 2, -1, 2, 9, + 7, -1, 9, 0, -9, -1, 4, -2, 0, -3, + -1, 3, -1, 1, -3, 0, 1, -3, 2, 2, + 0, 0, 2, 1, 0, 0, 1, -2, 0, 0, + -4, 0, 3, 1, 2, 4, 2, 1, 2, 0, + 0, -1, -2, 0, 1, 1 + }, + { + 24, 245, -62, 10, 11, 11, -7, -24, 3, 16, + 22, -20, 8, -11, 22, 9, -20, -17, 3, -38, + -46, -9, 6, 3, -10, 10, -6, -8, 3, -2, + 1, 1, -7, -5, 10, 2, -15, -8, -2, -4, + -3, -1, 7, 0, -3, 3, -3, -1, 5, 3, + 4, 1, -8, -6, -3, 1, 1, 4, 1, 0, + 4, 1, -6, -2, 3, 0, 2, 5, 1, -1, + -2, -2, 0, 2, 0, -2, -1, -4, 0, 1, + -1, 2, 1, -3, -2, 0, -1, 0, -2, -1, + 1, -1, 0, 0, 1, 0 + }, + { + -142, -708, -30, -6, 21, -13, -1, 24, -10, 4, + -18, -22, 3, -6, -19, -7, 8, -10, 4, 9, + -5, 17, 2, -10, 10, 3, 6, 7, 4, -4, + -2, -6, -21, 3, -11, -9, -14, -13, -3, 10, + 3, -1, -14, 0, -8, -4, -6, 4, 3, 4, + 5, -1, 5, -4, 0, 0, -2, 2, -4, 0, + 6, -2, -3, 5, -1, -3, -2, -2, -2, 5, + 0, -2, 1, 2, 2, 0, -1, -1, -1, 0, + 1, 3, 2, -1, 2, -1, -1, 0, -1, 1, + 1, 2, 2, -1, 0, 1 + }, + { + 8, -2, -25, 26, 5, 9, -2, -14, -1, 6, + 1, -19, -82, 119, -19, 109, -50, -10, 32, 14, + -68, 4, -33, -11, 6, 13, 6, 12, 10, 33, + -32, -15, -14, -11, -1, -15, 6, 0, -7, 10, + -4, 10, 0, -2, -7, 0, 4, 6, -6, 4, + 2, 8, 2, -4, 2, 6, -5, -1, 0, -7, + -7, 6, 4, 0, -2, -2, 1, -5, 2, 1, + 0, -2, 2, -1, 2, 4, 2, -1, 0, 1, + -3, -4, -1, -1, 0, -1, 2, 1, -1, 0, + -1, 2, 4, -1, 0, 2 + }, + { + 33, 304, -25, -52, -2, 19, -7, 7, 7, 1, + 3, 5, -5, -2, -4, -29, -27, 2, 6, 7, + -11, 9, 5, 14, 34, -8, 1, -11, 29, 20, + -8, -10, 3, -9, -6, -2, -6, -6, -5, 2, + -5, -7, 2, -8, -5, -12, -11, 0, 2, 10, + -1, -5, 9, 2, -7, -7, -2, 4, 1, 0, + 3, -2, -1, -4, -1, -3, -2, 1, 1, 0, + 1, 1, 0, -1, -3, -2, 1, 2, -4, -2, + 1, 1, -3, -2, 0, -2, 0, 3, -1, -1, + 1, -1, -1, -1, 1, 1 + }, + { + 13, -49, -62, 10, 6, 0, 4, -6, 26, -14, + -13, -2, -3, -227, 173, 117, -62, -57, -17, -7, + -10, 28, 4, 23, 23, 1, 19, 21, 32, 22, + 3, -2, 7, 10, -16, 6, 25, -5, 2, -2, + 10, 16, 3, -16, 2, -1, -8, -6, 0, 1, + -5, 6, 9, -2, 1, -2, 6, 0, 7, 9, + 5, -5, -1, 4, 1, 0, -7, 0, 2, 1, + -2, 1, 5, -1, 2, -2, -2, 2, 1, 0, + -3, -2, -2, 1, 2, 0, 1, -1, -2, 0, + 0, -1, 0, 1, 0, -1 + } + } +}; + +const Word16 rightBRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]= { -106,894,1364,326,-1185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, + { + { + -86, -3014, 3685, 1078, -616, 660, -1316, -1522, -1282, 440, + 563, 205, 1696, 590, -566, -477, 158, 1497, 82, -946, + -610, -8, -466, -11, -1092, -8, -272, 479, 87, 1351, + 262, 32, -545, 71, 590, -173, -644, -149, 524, 797, + 404, -930, -1211, 0, 467, 144, -48, -216, 221, -687, + -99, 166, 41, 112, 43, 286, 550, 531, 155, -99, + -55, -10, 17, -336, -240, -324, -399, -727, -168, -33, + 313, 285, 278, 147, 380, 328, 229, 139, 70, -61, + 3, -178, -138, -266, -304, -137, -50, -164, -278, 187, + 203, 101, 11, 5, 123, 72 + }, + { + 161, -3126, 4065, -514, 1177, -607, -1191, -1721, -431, 321, + 292, 1208, 1264, 146, -823, 538, -305, 1636, -752, -744, + 108, -901, -523, -130, -233, -477, 18, 1039, 345, 206, + 12, -174, -238, 282, 798, 216, -736, -191, 353, 440, + 18, -680, -308, 236, -198, -499, 307, 151, -57, -311, + -277, -96, 109, 88, 25, 643, 376, 314, 210, 342, + -26, -182, -261, -147, -374, -500, -518, -582, -103, 50, + 57, 318, 442, 334, 577, 370, 268, 199, -129, -297, + -98, -174, -286, -416, -192, 15, -77, -79, 65, 58, + 213, 72, -34, 118, -17, -3 + }, + { + 78, -3350, 4280, -421, 1033, -62, -2201, -599, 104, -841, + 346, 673, 1246, 61, 327, 285, -384, 308, 77, -61, + 230, 206, -811, -782, -1066, -857, -1272, 604, 1435, 1840, + 294, -26, 439, -154, -512, -232, 196, -161, -426, -54, + 847, 83, -511, -358, 103, 104, 8, -724, -560, -245, + -89, 366, 500, 124, 486, -26, -318, 579, 1056, 545, + -103, -260, -395, -79, -372, -651, -386, -753, -402, -512, + -62, 497, 388, 484, 609, 502, 566, 345, 171, -32, + -301, -340, -390, -171, -227, -331, -309, 45, 342, 111, + -127, 48, -47, -128, -179, -109 + }, + { + 18, -2182, 2853, 860, -798, 494, -817, -817, -1414, -1050, + 1342, 608, 2054, 137, 162, -816, -1254, 874, 538, -211, + -51, -686, -644, 366, 719, -957, -777, 753, 395, 387, + -261, 195, 427, -575, 34, 256, 125, 11, 42, -98, + 252, -400, -398, 230, -220, -141, -47, 309, -1, -340, + 484, 138, -318, 3, -23, 110, 141, 20, 204, 5, + -174, -128, 185, 2, -252, -128, 29, 26, -408, -132, + 228, 214, 164, 186, 16, 59, -139, 180, 52, -137, + -64, 31, -29, -92, -41, -9, -138, -187, 56, 69, + -30, 4, 19, 256, 96, 88 + }, + { + 55, -1356, 3199, -1718, 1183, -421, -795, -1260, -863, -758, + 1325, 1194, 1310, 617, -401, -369, -953, 1014, -508, -23, + -23, -1263, -1179, 1835, 515, -1360, -399, 901, 1339, -268, + -800, 464, -374, -353, 415, -122, -251, 771, 192, 58, + -61, -362, -260, 348, -40, -585, -432, 78, 746, 57, + -202, 70, -392, 292, 159, -291, 373, 264, 104, 31, + -444, 97, 142, -127, -106, -389, -280, -137, 176, -87, + 140, 180, 416, 205, 234, 144, -65, -183, -118, -318, + -139, 30, -39, -9, 8, 1, -141, -42, 80, 85, + -52, 42, -31, 81, 95, 153 + }, + { + -133, -2394, 3159, 1332, -1201, 588, -658, -1479, -1232, 65, + 89, -129, 1520, 2727, 179, 552, -2451, -679, -107, 723, + -514, -1424, -1068, 2401, 362, 849, -1138, -481, -46, -363, + 150, 1966, 196, -610, -736, -345, 272, 397, -9, -286, + -1143, 836, 455, -646, -478, 214, 496, 46, 279, 233, + 229, -6, 392, -60, -223, -483, -642, -317, 49, -59, + -236, -37, 143, 431, 384, 189, -176, -46, 133, 325, + 81, 355, -45, -40, -236, -176, -400, -305, -183, -11, + -176, 172, 355, 220, 151, -86, -282, -89, 43, 162, + 155, 184, 76, -27, -90, 32 + }, + { + 42, -1260, 3410, -2273, 1634, -751, -969, -1019, -1012, 133, + -196, 679, 3096, 962, 634, -997, -2307, -368, 1015, 564, + -1345, -1503, 68, 895, 696, 871, -556, -387, 111, -157, + -199, 1284, 636, -978, -837, 372, 346, -234, -102, -641, + -344, 534, 299, 43, -94, -69, 365, -241, -14, 476, + 483, 37, 153, 9, -436, -762, -373, -135, 86, -386, + -88, 256, 346, 108, 208, 203, -35, -104, 234, 117, + 292, 270, -78, -12, -374, -209, -177, -261, -162, -122, + -77, 169, 157, 225, 96, 22, -163, -139, 41, 194, + -12, 98, 163, -85, 10, -113 + }, + { + -136, -1977, 2726, 1304, -1203, 685, -819, -1123, -1018, -811, + -33, 731, 2312, 1621, -1265, 648, -1201, 966, 335, -1570, + -889, -599, -472, -917, 2207, 2259, -556, -2322, 701, -486, + 571, 997, 709, -218, -842, -44, 69, -113, -578, 79, + -596, -322, 443, 487, -101, -209, -58, 862, 345, -237, + -101, 656, 725, -175, -561, -484, -599, -950, -351, 416, + -182, -152, 297, 345, 445, 592, 476, -350, -330, 429, + 373, 147, -108, -176, -277, -145, -604, -595, -163, 73, + 74, 316, 239, 298, 85, -61, -242, -137, 230, 389, + 148, 218, -3, -237, -224, -97 + }, + { + 31, -1445, 3598, -2423, 1830, -656, -1163, -1214, -782, 7, + -303, 2001, 2310, 309, -322, -293, -806, 1057, -1017, -1072, + -793, 341, -945, -696, 2619, 352, 208, -1814, 436, 951, + 883, -556, -442, 861, -512, -317, 255, -156, -696, -947, + 78, 256, 105, 716, -182, -121, 347, 418, 207, 193, + -86, 306, 555, 277, -801, -580, -840, -1027, -289, 126, + 149, 391, 378, 140, 125, 693, 204, -176, 112, 126, + 451, 131, 8, -450, -530, -76, -390, -268, -204, -58, + 200, 236, 187, 157, 68, -90, -119, -6, 70, 336, + 182, -24, 56, -84, -117, -100 + }, + { + 72, -2945, 3762, 914, -342, -2162, 90, 242, 525, -1252, + -558, 1179, 270, -643, 400, 891, -107, -389, 1275, -306, + 949, 76, -804, -944, -1725, -849, 282, 18, 749, 664, + 341, 590, -68, -500, 583, 17, -125, 212, 748, 54, + -402, -1002, -803, -300, 603, 237, 1137, -17, 132, -1110, + -864, 118, -31, 397, 449, 559, 108, -438, -80, -264, + -179, 481, 615, 205, 14, -327, -297, -169, -270, -298, + -182, -262, -145, -4, 483, 386, 299, 154, 263, 292, + 19, -231, -136, -102, -35, -188, -265, -186, -336, 32, + 131, 23, 184, 105, 79, -80 + }, + { + 98, -1618, 3273, -450, -603, -2944, 2243, -33, -177, -713, + -112, 1616, -210, -702, 1125, -836, 340, -228, 981, -842, + 462, -575, -669, -491, -1223, 1146, 314, 826, -90, 1406, + -1493, 538, -350, 263, 604, -234, -147, -7, -241, -404, + -503, -491, -149, 300, 641, 624, 779, -224, -620, 126, + -1116, -552, 667, 577, 201, 413, -62, 21, -480, -94, + -101, 86, 145, 190, -411, -296, -99, 90, 14, 208, + 35, 54, -157, 36, 265, 144, 110, 47, 73, 11, + -78, -228, -321, -185, 100, -95, 64, 14, -90, 170, + 169, 60, 144, 44, -78, -77 + }, + { + 14, -2865, 3975, 810, -846, -1463, -312, 1227, -769, -351, + -2752, 2209, 638, 483, 2221, 294, -1557, -959, 422, -1381, + 459, -38, 54, 916, -1232, 891, 455, -370, -822, -442, + 829, 327, 497, 290, -832, -1030, 138, -22, 175, -315, + 331, 883, 79, -64, 653, 271, 10, 2, 92, 35, + -1039, -777, -136, -382, -421, -430, 246, 348, 253, 1169, + 442, 83, -462, -77, 174, -132, -407, 463, 494, -21, + -195, 47, 126, -248, -595, -225, -417, -261, -70, 172, + 94, 81, 153, 361, 212, 351, 401, 213, -40, -88, + -93, -319, -408, -271, -293, -132 + }, + { + -242, -582, 2657, -609, -1021, -1829, 1837, 94, -612, -726, + -1792, 2479, -212, 2021, 818, -651, -1308, 127, -474, -896, + 557, -67, 533, -306, -607, 565, 759, 111, -917, -141, + 337, 460, 339, 175, -648, -1212, -777, 452, 214, -471, + 1068, 875, 957, -928, 566, 680, -347, -279, 110, -144, + -592, -962, -622, -259, -454, -103, 747, 197, 570, 562, + 119, 75, -160, 19, 129, -132, 86, 639, 1, -255, + -5, -163, -58, -256, -333, -206, -475, -280, -63, 156, + 176, 283, 321, 336, 212, 239, 181, -28, 18, 4, + -107, -146, -334, -333, -265, -145 + }, + { + 92, -2665, 3771, 399, -214, -1979, 286, 464, -441, -642, + -952, 677, 702, 1489, -616, -106, 69, -241, -447, 668, + 355, 601, -747, -553, -308, 278, -631, -650, 210, 303, + -344, 674, 56, 72, -272, 1413, -567, 974, -221, 484, + -737, -1144, -560, 200, 12, 107, 966, 580, 109, -270, + -1109, -160, -339, -377, 360, 360, 201, 79, 118, 360, + -55, -80, 372, 264, -121, -233, -274, -68, -363, -10, + 4, 49, -165, 56, 30, -58, -72, 0, 297, 192, + 170, 123, 4, 93, -161, 33, -162, -244, -222, 73, + -9, 23, -47, 77, -56, 86 + }, + { + -204, -439, 2223, -423, -699, -1860, 1768, -506, -703, 367, + -1069, 449, 1995, -324, -413, 1047, -613, -799, 341, 136, + 14, 98, 80, -666, -728, 349, 220, 126, 32, -11, + -479, 214, 176, -144, -537, 681, 298, 155, 557, 520, + -328, -820, -434, 371, -608, 270, 269, 620, -257, -266, + -785, -170, 10, -84, 354, 387, 401, -83, 99, -371, + 4, 9, 73, 210, 143, -178, 105, 12, -302, -120, + -45, -10, -84, -20, 29, 39, -184, -93, 278, 219, + 32, 123, 28, 122, -87, -30, -94, -245, -87, -108, + 89, -84, 40, -55, 77, -32 + } + }, + { + { + 164, -468, 3606, 1538, 525, 382, -426, 147, -37, 445, + 49, -626, 137, -414, 48, -467, -901, 611, 165, -283, + 198, 786, -72, -64, -1187, -367, -743, 87, -495, 748, + 89, 180, -21, -126, -101, -299, 246, -2, -98, -144, + -398, -82, -288, 150, 143, -182, -171, -87, 246, -509, + 35, 96, -92, 11, -155, 175, 365, 5, -234, 19, + 285, 293, 107, -209, 73, -5, 13, -155, 201, 49, + 328, 188, 113, 79, 116, -63, -54, -22, 114, 38, + 189, -3, 77, 101, -81, -91, -44, -114, -140, -4, + -16, 55, 45, 46, 74, -21 + }, + { + -349, -7437, -1289, 1161, 2219, -505, -715, -600, 468, 122, + 147, -30, 42, 89, 311, 1298, -555, 452, -489, -411, + 158, -188, -190, -195, 284, 288, -222, 168, 351, 241, + 288, 234, -558, -119, 71, 248, 195, 189, 102, -64, + 113, 175, -133, -49, -156, -486, 10, 57, -40, 30, + -175, 127, 101, -171, -340, 158, 240, 190, -22, 34, + -178, 68, -205, -116, -12, -45, 27, -142, 117, 178, + -74, -108, -8, -56, 203, 78, 94, 80, -52, -274, + -87, 7, -47, -137, -10, -28, -47, 81, 88, -110, + -37, -53, -98, 54, 37, 71 + }, + { + -128, -4203, 1862, 1116, 2157, 85, -733, 283, 670, 82, + 690, 58, 268, 24, 111, -500, -389, 85, 86, 218, + -296, -431, -385, 192, -127, 160, -930, -20, -262, -49, + -318, 378, 484, -83, -385, -288, 14, 8, 187, 196, + 214, -190, 11, 130, 170, 58, -73, -208, 306, 304, + -294, -116, 119, -275, 172, -132, -142, 283, 235, -118, + -90, 166, 82, 76, -170, -229, 107, -95, 164, -37, + -13, 130, -42, -8, 36, -51, 60, 11, 27, 84, + 39, 127, 19, 46, -99, -67, -116, -65, 85, -62, + -127, 76, 40, 38, -89, -122 + }, + { + -7, -1357, 2257, 844, -439, -260, -408, 75, -412, -354, + 954, -98, 741, 250, -24, -1123, -272, 1008, -299, -654, + -133, -27, 734, 804, 184, -238, 285, 207, -239, -34, + -447, 554, 440, -338, 106, 349, 325, -30, -149, -210, + 291, 145, 190, 216, -580, -47, -41, 16, -97, -36, + 181, -333, -179, 148, 46, 170, 122, 10, -114, 126, + 213, 11, -147, -130, 52, 156, 128, 161, -93, -139, + 46, 14, 142, 191, -28, 50, -53, 116, 28, -18, + -18, 74, 32, 8, 39, 14, -60, 13, 147, 100, + 5, 6, 23, 186, 46, 13 + }, + { + -81, -6580, -1705, -854, 2416, 170, -216, -444, -488, -1524, + 610, 77, 376, 283, -945, -319, -128, 1381, 29, 529, + 201, -814, -1265, 418, 165, -161, 179, -130, 173, 135, + -8, -13, -364, -217, -3, 170, 122, 266, -208, 30, + -195, -845, -642, 202, -150, 46, 410, 46, 300, -43, + 38, 528, 21, 387, 87, -269, -55, -481, -222, 35, + -140, 424, 298, -173, -234, -230, 128, -63, 137, -28, + 46, -210, -64, -51, 100, 137, 95, 79, 20, 43, + 191, 158, 13, 64, 81, -29, -154, -55, -92, -61, + -72, -24, -73, -31, -29, 73 + }, + { + 173, 1192, 4421, 499, -1174, -411, -196, -252, -205, 195, + -229, -406, -59, 555, -803, 682, -999, 114, -10, -659, + -1013, -270, -232, 1680, -1100, -61, -293, 457, -228, -376, + -317, 600, -1140, -370, 24, -286, -95, 346, -111, 248, + -395, 529, 58, -14, 274, 111, 199, 110, 146, 48, + -35, -264, 88, -5, 168, 230, -305, -569, -303, -54, + -154, 161, 240, 90, 228, 194, -167, -35, -14, 190, + 284, 335, 28, 51, -209, -16, -69, 49, 111, 139, + -29, 63, 55, -75, 33, 88, 2, -1, -66, -16, + 7, 11, -81, 0, -28, -3 + }, + { + -7, -7102, -1998, -1825, 2166, -73, 69, -206, -298, 174, + 117, 233, 910, -376, 450, -66, -788, 10, 734, -183, + -1176, -343, -353, -106, 244, 104, -640, -514, -14, 284, + -298, 429, 108, -17, 310, 500, 214, -281, 222, 149, + 154, 268, 197, 363, -8, -557, -301, -240, 298, 306, + 193, -25, 301, 521, 180, 35, 125, -27, 475, 33, + 36, 267, 303, -117, -162, -1, 78, -40, 162, -62, + -74, -161, -236, 96, -4, 16, -217, -248, 40, 136, + 106, 134, 19, 91, -101, 21, 55, -78, -8, 44, + -83, -10, -21, -190, -44, -28 + }, + { + 148, 1747, 4572, 433, -800, 37, -577, -141, 167, -250, + -123, -204, 448, -219, -1983, 497, -2068, -253, 441, 228, + 188, -158, -107, -917, 884, 1055, 357, -1217, 881, -349, + -141, -90, -249, -373, -429, 328, 541, 438, -117, -85, + -423, 279, 254, -206, -92, 195, -38, 319, -52, -14, + 233, 72, 217, 128, -141, 0, 115, -135, -154, 90, + -13, -164, -26, 100, 9, 75, 321, 114, -115, 151, + 260, 38, -117, 58, 129, 142, -266, -159, 77, 31, + -125, 117, 76, 105, -43, -52, -128, -37, 39, 67, + -59, 78, -52, -57, -28, 1 + }, + { + 18, -7153, -1992, -1917, 2264, 258, 332, -130, 64, 145, + -233, 495, 337, 179, 69, -422, -237, 470, -906, -615, + -62, 2, -1022, -113, 1273, -1002, 224, -638, 565, 496, + 695, -547, -380, 656, -266, -176, 130, 58, -565, -973, + 87, 121, -175, 380, -561, -360, 352, 309, -171, 30, + 214, 98, -188, 61, -202, 131, -42, -365, -71, -257, + -164, 84, -141, 21, 4, 316, 190, -76, 204, 4, + 11, -60, 77, 6, -163, 60, -168, -18, -96, -95, + -11, -163, -168, -15, -43, -114, -6, 61, 35, 139, + -16, -63, 54, 8, 2, -42 + }, + { + -115, -3285, 2504, 706, 621, -351, 370, -1153, 768, 27, + 189, 251, -719, 379, 657, 972, 121, -594, 1228, -29, + 716, 376, 324, 116, -499, -371, 66, -449, -401, -447, + -142, 57, -477, -424, -401, -168, 454, 235, -16, 239, + 356, -280, 242, 82, -20, -254, 65, -721, -40, -789, + -268, -27, -543, 105, 70, -53, -22, -454, 361, 24, + -147, 158, 8, -404, -415, -197, 81, 163, 102, -194, + -187, -177, -4, 84, 187, -35, -116, -139, -4, 53, + -76, -136, 21, 55, 76, -134, -297, -24, -18, 38, + 52, 34, 160, 46, 135, 1 + }, + { + -204, -5972, -420, 117, 1333, -357, 3331, -1281, -398, 816, + 46, 670, -82, -358, 409, -539, 737, 949, 1724, -802, + 621, 302, 57, -1, -596, 968, 211, 614, -235, 925, + -1254, 359, -347, -225, -281, -241, 150, 275, -63, 11, + 122, -113, -60, -108, -181, 78, 203, -110, -7, -13, + -590, 106, 571, 46, -275, 216, -382, 150, -123, -175, + -21, 180, -34, 26, -46, 40, -256, -14, -91, -23, + -17, -17, -130, 66, 52, 67, -7, -37, 126, 15, + -6, 53, -104, -132, 115, 94, 189, 22, 7, 100, + 35, -143, -16, 111, -12, -1 + }, + { + -12, -2236, 2939, 817, 348, -588, -1119, -2, -549, -54, + -1574, 1595, 706, 770, 856, -570, -1430, -167, 839, -357, + 939, 463, 405, 720, -1041, -38, -54, 664, -87, -386, + 146, -730, -796, -207, 129, -301, 673, 229, -65, -502, + 86, 252, 144, 698, 385, -194, -48, -22, -151, -138, + -256, -110, -13, 36, -135, 79, 151, -234, -80, 359, + -83, 229, -359, -331, -15, -90, -223, 377, 199, 29, + 51, 54, 79, 148, -142, 10, -72, -72, 44, 149, + -89, 31, 30, 101, 24, 127, -61, -118, -60, 11, + 119, 35, -34, 12, -122, -19 + }, + { + 732, -3246, -1634, -609, 1080, 715, 2001, 564, -85, 223, + -1072, 1466, -743, 57, -1047, -607, -1229, 500, 36, -414, + 745, 203, 424, -253, -795, -279, -92, -5, -75, 401, + -97, -781, -930, -367, 24, 41, 192, 582, 257, 29, + 539, -545, 163, -1015, 188, 274, -186, -40, 489, 294, + -164, -464, -300, 304, -361, -192, 304, -242, 53, 53, + 13, 159, 68, 35, 133, -73, -301, -71, -245, 104, + 237, 2, 169, -32, -5, 87, -193, -16, 65, 148, + 84, 81, 120, 41, 60, 163, -61, -142, -4, -45, + -107, -75, -27, 9, 40, 107 + }, + { + -169, -3903, 2008, 10, 371, -492, 210, -137, 808, 132, + -488, -87, -977, 706, 345, 363, -531, 111, -179, 181, + -56, 496, -242, 1135, 407, 362, 168, 79, 386, 255, + -1049, -191, -152, 368, -558, 877, -110, 775, -558, 527, + 257, 18, 137, 436, -30, -299, 261, 384, 443, 421, + -140, 459, 75, -68, 181, 169, 103, -6, 163, 232, + -64, -178, 46, 91, 122, 170, -16, -5, -205, -66, + -55, 78, -72, -30, -142, 57, 20, -26, 24, -73, + 169, 259, 59, 97, -59, 93, -109, -183, -79, 184, + 16, 76, 25, 98, 64, 74 + }, + { + 596, -3241, -1664, -572, 1427, 1185, 1934, -873, -1239, 282, + -416, 615, 1934, 46, 1280, 1839, -132, 132, 911, -301, + -637, 264, 316, -519, -19, -178, -263, -31, -134, 77, + -44, 249, -183, -627, -1327, -52, -162, -492, 30, 165, + -26, 170, 192, 286, -233, 43, -515, 63, -166, -154, + -360, 322, 81, -198, -47, 19, 203, -164, 142, -278, + -28, -131, -153, 128, 22, -306, 66, 167, -30, -69, + 38, 160, -124, 96, 192, 189, 22, -120, 62, -9, + 20, 59, -105, -43, -103, 85, 78, 32, 153, -58, + 23, -118, 98, -19, 57, 78 + } + }, + { + { + -66, 3956, -573, 1218, 1350, -14, 38, -48, 323, 326, + -66, -442, 109, -723, -426, -59, -584, -306, 235, -202, + 844, 1271, -491, -926, -306, -940, -68, -256, 77, -679, + 405, -41, 278, 177, -651, -89, 396, -159, 48, -474, + -340, 290, -170, 180, -252, -100, 252, 93, -454, 5, + 3, -5, -40, -6, -349, 32, 498, -170, -104, 218, + -144, 420, 144, -200, 83, -5, 31, 63, 129, 188, + 414, -14, 69, 156, 62, -275, -117, 87, 98, 46, + 191, 3, 41, 185, -41, -107, 23, -82, 15, -93, + -89, 44, -5, 90, 79, -40 + }, + { + 344, -5840, -4741, 4381, -19, -504, -899, 377, 404, -96, + 40, -343, 95, 108, 714, 368, 88, -471, 685, -971, + -1, 411, -282, 195, 445, -51, 221, -261, 236, 641, + 143, 133, -277, -73, -173, -61, 354, 180, -274, 318, + 30, 416, -19, -208, 142, -549, -62, 72, -255, 337, + -272, -13, 257, -364, -58, -145, 171, 194, -157, 24, + -179, 40, -118, 92, -91, 20, 148, -92, 110, 241, + -44, -148, -124, -99, 45, 36, 76, 33, -1, -190, + -73, -90, 11, -7, 36, -63, -77, 61, 135, -108, + -93, -47, -52, -58, 57, 6 + }, + { + 21, 647, -3418, 3232, 628, -558, 27, 119, 1011, 431, + -135, 215, 236, 98, 43, -367, 77, -537, 98, 351, + -610, -483, -287, 304, 41, 118, -1088, 306, -66, -582, + -230, 181, 353, 310, -390, -275, 110, -61, 315, -119, + -42, 88, 72, 127, -139, 333, -166, 9, 402, 244, + 62, -413, -50, -111, -88, 21, 122, 102, -77, -196, + 64, 147, 38, 150, -174, -74, 19, 260, 62, 33, + 75, -112, -11, -16, -202, -20, -21, 60, 80, 17, + 88, 195, 87, -100, -49, 10, -31, -75, 24, -22, + -143, 9, 19, 159, -64, -117 + }, + { + -49, 1375, -413, 190, 355, -268, -175, -86, 266, 647, + -700, 257, 260, 247, -403, 105, -270, -169, -504, 23, + -333, 328, 992, 1003, -363, -244, 376, 126, -321, 70, + -207, 250, 519, -339, 208, 89, 248, 399, -192, -306, + 308, 166, 117, 280, -777, 60, -49, 145, -304, 314, + -320, -453, 191, 154, -81, 229, -59, 172, -181, 310, + 82, 92, -191, -10, 87, -144, 317, -14, 88, 85, + -97, -121, 278, 49, 22, -3, 68, -14, -41, 58, + -28, 85, 27, 1, 50, 56, -101, 179, 53, 86, + -13, 3, 77, 52, 106, -66 + }, + { + -24, -10755, 845, 1695, 279, 220, -682, 255, -551, -1697, + 801, -474, 433, -23, -760, -67, 761, -541, 863, 232, + 68, 137, -968, -148, -55, 233, 466, -240, -248, 325, + -188, -155, 25, -212, -94, 232, 184, 117, -121, -59, + -263, -783, -650, 55, -186, 243, 883, -96, -246, 195, + -172, 670, 391, 8, 98, -84, -309, -518, -41, 3, + -115, 480, 130, -210, -89, -3, -42, -116, 76, -19, + 28, -76, -110, -4, 80, -2, 89, 308, -95, 140, + 135, 119, 90, -30, 69, 22, -92, -53, -111, -118, + -65, 31, -91, -104, -10, 84 + }, + { + 68, 3297, 2101, -1017, 407, -428, -349, 71, 249, 115, + -698, -136, -18, -779, 126, 373, -456, 7, 135, -952, + -806, 4, -68, 1270, -1319, 320, -182, 469, -305, -539, + -48, 158, -1060, -87, -224, 21, -150, 45, 23, 572, + -287, 199, 30, 224, 530, -79, -171, 324, 192, 88, + -69, -280, -109, 284, 148, 245, -419, -491, -409, 79, + -101, 61, 290, -14, 228, 176, 109, -190, -81, 48, + 583, -3, 5, -25, 33, 45, -13, 1, 231, 135, + -57, 30, 132, -95, -28, -23, 143, 27, -84, -18, + -93, 28, -184, -4, 105, -41 + }, + { + -198, -11615, 1135, 1766, -1171, 100, 283, -496, 404, -517, + 901, 252, -106, 70, -104, -665, 625, -302, 120, 67, + -957, -26, -561, 126, 212, -468, -29, -530, 53, 302, + -362, -36, 255, 288, 325, 291, 111, -184, 429, 209, + 312, -210, 488, 222, -138, -251, -502, 1, 438, -102, + -19, 262, 408, 316, 461, 207, 185, 1, 272, 111, + 166, -96, 299, 101, -417, -5, 160, 8, -2, 3, + -39, -314, -102, -15, 50, -23, -90, -157, -31, 136, + 147, 72, 12, 2, -30, -25, 137, -39, -86, 66, + -77, 0, -110, -119, -106, 77 + }, + { + 127, 2474, 3364, -813, 334, 77, -139, -34, 238, -146, + 78, -701, 248, -683, -1382, 528, -1979, -966, 285, 958, + -32, 105, 255, -824, 470, 325, 540, -394, 426, 190, + -332, -708, -540, -124, -225, 298, 393, 649, -47, -168, + -110, 197, -53, -251, 178, 66, -21, -8, 319, -126, + 356, 68, -51, 212, 41, -203, 179, 108, -4, -312, + 133, 4, -121, 140, -116, -46, 200, 252, 142, 10, + 301, -14, -141, -52, 190, 149, -106, -99, 150, -30, + -136, 44, 53, -31, -7, 17, -74, -8, -122, 68, + -10, 42, -92, 51, -41, -3 + }, + { + -219, -10840, 449, 1929, -895, -248, 520, -80, 799, -6, + -90, -899, 552, -28, -108, -347, 608, -450, -44, -949, + -166, -301, -416, 28, 404, -419, -397, 364, 198, 297, + 140, 40, 155, 114, -151, -118, -9, 284, -545, -921, + -132, 166, 84, 55, -303, -431, 142, 187, -329, 227, + 290, 43, -314, -256, 293, 67, -8, -69, -15, -258, + -278, 35, -192, 19, 49, 119, 166, -67, 52, 128, + -210, 16, -51, 319, -192, -59, -81, 18, 2, -23, + -138, -216, -113, 18, -109, -132, 117, -6, 87, -11, + -81, 15, 0, 127, -35, -101 + }, + { + 24, -417, -176, 528, -90, 46, 1299, -885, -33, 147, + 560, -186, -514, 716, -223, 474, 869, 675, 407, -502, + 745, 229, 701, 61, -146, -176, -417, -399, 13, -639, + -133, -174, -991, 216, -980, 186, 633, -48, -594, 654, + 95, 81, -160, 685, -527, 170, -678, -324, -159, -789, + 354, -412, -692, 467, 174, -435, -182, -238, 325, -76, + 209, 56, -145, -601, -407, 187, 96, 30, 314, -355, + -220, -115, 59, 325, -181, -99, -94, -76, -60, -69, + -77, 8, -6, 98, -87, -64, -185, 38, 95, -60, + -5, 22, 166, 22, 91, 46 + }, + { + 177, -7935, 260, 24, 637, 1980, 1391, -1479, 64, 1294, + 332, -374, 511, 467, -837, 770, 673, 1410, 875, -50, + 58, -235, 567, -334, -42, 1017, 215, 202, 358, -837, + 224, 35, -407, -221, -845, 175, 125, 330, -75, 36, + 443, -83, 362, -353, -734, -146, -17, -6, 566, -640, + -93, 303, 263, 73, -325, 82, -254, -14, 35, -523, + 337, 224, 75, -281, 88, 205, -451, 98, -89, -234, + 260, -203, -116, 0, -130, 160, 11, 69, -6, 53, + 49, 46, -137, 23, 28, 69, 122, 38, 220, -34, + -52, -34, -68, 74, -60, 25 + }, + { + -17, 1501, -1041, 910, 399, -663, -227, -634, -209, -409, + 564, -486, 670, 1530, -829, -162, -1139, 758, 103, 145, + 396, 689, 1548, 169, -675, -576, -256, 892, 487, -394, + -219, -1001, -1056, -317, 552, -239, 485, 107, 164, -194, + -351, 177, 377, 717, 336, -328, -44, -82, -139, -225, + -229, 268, -309, 414, -240, 206, 169, -344, 183, -364, + 89, 331, -328, -329, -201, -100, 129, 158, 98, 147, + -15, 244, -123, 92, 77, -21, 113, -133, 54, 210, + -253, -4, 129, 34, 18, 113, -151, -109, -143, 67, + 93, 137, -21, 75, -128, -79 + }, + { + -1100, -3384, 109, -257, 875, 2265, -378, 556, -90, -181, + 40, 1055, -616, -338, -982, -379, -1016, 92, 23, 227, + 658, 447, -331, -353, -537, -35, -221, -277, -176, 13, + 422, -1260, -781, -187, -324, 698, 407, 236, 73, 238, + 333, -566, -162, -417, 37, -367, 365, 6, 38, 512, + -183, 82, -266, 276, -434, 19, -122, 82, -206, -157, + -31, 190, 228, 73, 8, 148, -366, -273, -304, 257, + 24, 226, 91, -50, 173, -73, 110, 7, -2, 142, + -54, 43, 60, 27, 155, 203, -230, -41, 7, -101, + -46, -84, 30, 51, -25, 87 + }, + { + 98, -1963, -740, 271, -297, -252, 1104, -397, 395, 949, + -299, -341, -482, -992, 1953, 850, -1569, -75, -21, 233, + -399, 654, 663, 910, 216, 486, -445, 714, 885, -85, + -1232, -250, -161, -26, 212, -39, 735, 183, -390, 173, + 628, 423, 312, 317, 160, -531, -40, 320, 245, 562, + 516, 75, 47, 395, -233, 11, 227, -35, 185, 160, + -80, -86, 85, -117, 115, -32, 385, -186, 6, 37, + -144, -79, 52, 20, -331, 140, 30, 109, -76, -171, + 144, 351, -1, 22, 102, 16, -95, -140, -49, 164, + -42, 124, 114, 40, 29, 72 + }, + { + -871, -4441, 492, -203, 877, 2710, 348, -543, -1490, -97, + 277, 161, 1772, 206, 2432, 998, -627, 332, 1583, 81, + -515, -422, 260, -682, 548, -13, 330, -927, -123, -41, + 439, 530, -707, -858, -830, -168, -163, -784, -165, -49, + 96, 258, 372, -317, 726, -286, -468, -352, 91, -186, + -25, 147, 139, -101, -290, -121, 86, 6, 225, -117, + -277, 179, -409, 72, -199, -131, 68, 86, 31, 71, + -42, 357, -228, -25, 324, 123, 142, -142, -21, -123, + 163, -19, -116, -125, 84, 103, 29, 86, 160, -82, + 53, -92, 23, 82, 20, 17 + } + }, + { + { + -93, 3216, -1355, -1367, -928, 89, 226, -47, 13, -154, + 492, -273, 47, 266, -339, 55, -111, -666, 456, 282, + 536, 406, 3, 298, 553, -1026, -184, -242, 252, -1118, + -89, -375, -422, 229, 59, 187, 186, -168, 295, -280, + -287, 543, 183, 44, -184, 84, 495, 122, -452, 495, + 236, -54, -43, -100, -489, -156, 290, -84, 112, 111, + -360, 58, -142, -231, -32, -249, -71, 87, 126, -1, + 50, -113, 56, 93, 56, -159, -46, 53, -10, -57, + -11, -100, -76, 55, 0, 7, 91, 65, 126, 25, + 33, 60, -46, 54, 67, 41 + }, + { + -338, -1067, 527, 4221, 29, -349, -555, 236, -101, -36, + 5, -136, 101, -466, 381, 439, -354, -332, 1369, -633, + 22, 534, 203, 299, 152, -11, 724, 344, -87, -105, + -160, 136, -124, 224, 34, -92, 212, 328, -155, 99, + 45, 354, 69, -48, 443, -389, 47, 127, -169, 200, + -246, -245, -72, -335, 213, -29, 31, 71, -211, -110, + -295, -78, -164, 296, 315, 177, 240, 116, 3, 86, + 18, -38, -103, -201, -58, -23, 3, -73, 55, 22, + 35, -39, 67, -79, -7, 59, -40, 7, 46, -66, + 3, 33, 54, -28, 6, -88 + }, + { + 79, 5048, -802, 360, -1362, -101, 242, -391, 377, 138, + -119, 54, 11, -337, -23, 190, 282, -560, -312, 161, + -100, 174, -234, 25, 123, 552, -400, 546, -227, -771, + -243, -213, 4, 57, -75, -6, 221, 21, 312, -253, + -157, 247, 299, -33, -443, 237, 68, 122, 4, 72, + 442, -268, -123, -32, -48, -9, -27, 10, 177, 35, + -132, 18, 31, 259, -39, 104, -90, 88, -115, -133, + 11, -150, 57, 61, -249, -17, -42, -78, 109, 142, + 90, 146, 34, -134, 16, 98, 27, -61, 7, 33, + -53, 39, -18, 105, -50, -33 + }, + { + 42, 3020, 529, -375, 26, -21, 23, -28, 153, 749, + -603, -123, -111, -292, -954, 23, -713, -347, -230, -171, + -333, 71, 419, 783, -85, 137, 124, 204, 18, -173, + -220, 388, 481, -335, 63, -752, -451, 265, -93, -294, + 368, -139, -504, 179, -688, 285, -48, -101, -219, 137, + -392, -450, 146, 324, -260, 109, 105, 258, -172, 36, + -146, -36, -62, 116, 208, -175, 269, -20, -72, 44, + -52, -131, 145, -69, 48, 94, -66, -269, -163, -4, + -130, -53, -30, 13, -6, 36, -38, 184, -67, -11, + -29, -60, -115, -132, 21, -84 + }, + { + 136, -11392, 373, 2312, 110, 126, -671, 503, 141, -1048, + 1254, -865, -29, 13, -97, -220, 159, -754, 642, -36, + -458, -178, -64, 426, -13, 10, 316, 303, 286, 545, + -156, 113, 128, 169, 80, 201, 105, 86, -69, 86, + 259, -90, -445, -17, 18, 252, 497, -513, -458, 193, + -460, 245, 278, -22, -64, 7, 21, -26, 263, 92, + -189, 111, -277, -199, 189, 174, -113, -68, 39, -51, + 94, 22, 85, 25, 70, -13, -124, 57, -148, 121, + -7, 49, 18, -189, 4, -65, -25, 30, -32, 12, + -3, 176, 2, -43, 2, 23 + }, + { + -173, -1061, -1959, -884, 668, -115, -285, 171, 335, 193, + -213, 504, 411, 53, 841, 168, -650, 113, -67, 62, + 194, 108, 161, 1029, -864, 1327, -373, 168, 134, 266, + 811, 530, -521, 361, -141, 75, -5, -391, -204, 408, + -211, 49, -23, 265, 176, -210, -89, 161, -12, 202, + 188, 74, 244, 171, -77, 84, -246, -61, -210, 64, + 134, -4, 32, -54, 116, 10, 52, -108, 198, 12, + 223, -244, -221, -42, 59, 22, 91, -13, 144, 17, + -128, 45, 72, -39, -8, -122, 85, 2, -52, -2, + -42, 0, -199, -17, 68, -9 + }, + { + 381, -11685, 488, 3323, -93, -197, 14, -668, 864, -322, + 145, -117, 145, 94, -269, -128, 997, -638, -382, 670, + 53, 70, -580, 684, 570, -200, 526, 15, 241, 251, + -215, -141, 126, 25, 227, -50, -68, -323, 77, -14, + 141, -195, 372, 127, -125, 74, -242, 13, 305, 12, + -90, -180, 343, 168, 167, -123, -248, -496, -20, -19, + 61, -358, -21, 251, -235, -102, 41, -50, -35, 17, + 53, -20, -42, -140, 103, 115, 40, 46, -53, -85, + -17, 6, -87, 69, 93, 5, 89, 28, -46, 4, + -30, 74, 51, 4, -81, 127 + }, + { + -167, -2717, -1719, -548, 580, 262, -103, 17, 139, -18, + 435, -118, 113, -140, 261, 875, -1721, -595, 835, 1018, + 26, 352, 123, -897, 445, -743, 40, -225, 521, -33, + -564, 96, -386, -157, -85, -451, -306, 529, -320, -60, + 166, -14, -311, -371, 108, -83, -145, 174, 567, -268, + 320, -44, -404, 151, 211, -110, 241, 113, 11, -353, + 24, 82, -108, 7, 8, 71, -6, 23, -55, -190, + 15, 64, 155, -28, 163, 215, -20, -140, 104, 39, + -42, -11, 55, -64, 45, 98, -113, 25, -60, 55, + 10, 67, -68, 1, -76, 7 + }, + { + 382, -10658, -27, 3366, 13, -723, -246, -525, 371, -462, + -374, -765, 618, -174, -437, -952, 377, 31, -96, -656, + 242, 59, 252, -166, -41, -78, -303, 494, -1, -80, + 108, 313, 418, 197, -17, -49, -103, 497, -150, -420, + 213, 262, -34, -119, -283, -566, -201, 518, 32, 171, + 107, -103, -39, 20, 215, 128, -36, -63, -74, -58, + -70, -269, -383, 104, 117, 6, -88, -224, -151, -134, + -225, 249, -84, 184, -140, 57, 74, 61, -51, 5, + 43, 53, 159, 142, -32, -83, 114, -17, 4, -123, + -31, 40, -47, 88, -7, -18 + }, + { + 25, 3081, 1675, -805, -907, -446, 1428, -137, -167, -294, + 585, 293, -446, 383, -443, -165, 912, 508, -287, -1071, + 606, -2, 484, -368, -113, -271, -406, 91, 639, -342, + -245, -88, -731, 412, -1149, -255, 525, 129, -551, -14, + -114, 244, -245, 852, -951, -74, -349, 64, 302, -304, + 355, -299, -454, 458, 414, 182, 85, 58, 456, 168, + 467, -14, -22, -115, -60, 268, -7, 21, 302, -206, + -72, -139, 81, 339, -207, -86, -13, 164, 172, 86, + 92, -37, -154, 48, -155, -64, -107, 82, 82, -57, + 32, 35, 120, -30, 36, -4 + }, + { + -172, -8374, -590, -185, 607, 162, -327, -255, 911, 596, + -305, -75, 770, 1140, 462, 1093, 87, 533, 675, 550, + 167, -285, 208, -515, -17, 590, -366, -295, 189, -1012, + -25, 168, -175, -112, -836, 389, 176, -144, 59, -86, + 104, 285, 451, -313, -549, -174, -59, -497, 185, -393, + 174, 11, -410, -110, 63, 249, -176, 51, 240, -394, + 352, 36, 183, -197, -133, 223, -113, 239, -8, -86, + 232, -289, -211, -275, -225, 112, -77, 162, -67, 6, + 45, -128, -165, 29, -30, -30, -14, 39, 179, -60, + -96, 15, -49, -37, -170, -47 + }, + { + 3, 3594, -121, 86, 41, -180, 257, -655, -127, -348, + 469, -578, 370, 844, -480, 1674, -278, 218, -295, 229, + 245, 80, 818, -335, -393, -1, 100, 62, -79, -576, + 106, 156, 286, 128, -43, -334, 794, -142, -124, 154, + -63, -65, -256, 340, -1, -345, 189, -58, 101, -343, + -544, 147, -357, 293, -351, 240, 349, -82, 383, -192, + 162, 232, -246, -133, 93, -47, -101, -130, 32, 76, + -275, 56, -155, 78, 96, -67, 8, -84, 53, 188, + -151, -84, -34, 39, 62, 132, -40, -4, -39, 86, + 10, 114, -40, 112, -22, -9 + }, + { + 1148, -2721, -2093, -1115, 447, 634, -2245, -97, -329, 236, + -332, 285, 16, 1184, 714, -135, -662, -73, -176, 58, + 124, 276, -56, -4, -464, -22, -499, -162, -113, -517, + 106, -843, -68, -44, -448, 261, 44, -16, -143, 302, + 406, -328, 86, 19, 45, -355, 365, 167, -1, 256, + 17, 190, -68, 303, -551, 17, -344, 99, 138, -130, + -180, 96, 285, 316, -29, 64, -362, -246, -366, 105, + 31, 349, 21, 24, 303, 34, 100, -242, -272, -68, + -78, 26, -56, -88, -14, 103, -159, 89, 141, 44, + -66, -113, -79, -38, -82, 20 + }, + { + -54, 868, 853, 42, -178, 188, 1043, -399, 104, 574, + 102, -168, -687, -1724, 1938, 1600, -288, 720, 503, 360, + -1420, 121, 410, 158, 330, 59, -852, 600, 784, 575, + -600, -270, 102, 74, -271, -368, 680, 39, -220, -175, + 19, 48, -25, -142, 177, -184, -111, -146, -132, 124, + 168, -114, -21, 507, -35, 51, 112, -60, -22, -230, + -281, -282, -213, -185, 34, -148, 199, -188, 66, 104, + 32, -100, -49, 148, -217, 51, 38, 219, 93, -58, + -19, 186, 58, 6, 46, 186, 51, -171, -43, 131, + -120, 51, -43, -78, -76, 70 + }, + { + 906, -4029, -728, -568, -295, 216, -1135, 356, -420, 258, + -298, -547, 499, 36, 2058, -37, -33, 592, 667, 116, + 121, -495, 369, 138, 777, -162, 453, -288, 476, -166, + -571, -44, -134, 214, 58, -59, 61, -530, -477, -281, + 102, 129, 489, -144, 627, -72, 283, -87, 90, -104, + -102, 87, 98, -137, -70, 32, -59, -436, -58, 314, + -61, 210, -233, 26, 42, -40, -223, -1, 96, 138, + -79, 278, -192, -204, 52, 44, 104, -152, 148, 37, + 10, -86, -122, -75, 79, 3, 47, 59, 70, -136, + 57, 49, 187, 146, 13, -57 + } + }, + { + { + 136, -935, 2099, -1920, -1530, 355, 33, 270, 92, -476, + 607, -177, -182, 363, -685, 73, 371, -257, 547, 356, + 684, -604, 424, 929, 718, -1651, -86, -128, 445, -381, + -939, -295, -354, -3, 377, 209, -182, 197, -106, -39, + 140, 58, 724, -535, 94, 302, -6, 79, 41, 325, + 17, 84, 54, -404, 13, -133, -186, 138, 223, -188, + -2, -230, -43, -191, -203, -20, -124, 192, -57, -32, + -130, 56, 55, -14, -11, 86, -42, -17, -100, -4, + -75, 12, -79, -3, -48, 57, -2, 146, 7, 87, + 124, 51, -30, -13, 35, 10 + }, + { + 403, 2372, -646, -5, 2317, -270, 56, -518, -399, 482, + -471, 234, -83, -33, -216, 240, -497, 237, 596, -250, + 34, 529, 425, 344, -493, 116, 735, 753, -154, -388, + -256, 238, 32, -4, 253, 125, 7, 342, 35, -184, + 340, -249, 429, -167, 301, -336, 45, 234, 76, -299, + 210, -501, -218, -202, 378, -70, -108, 207, -106, -313, + 73, -183, -144, 326, 268, 4, 141, 285, 63, -69, + 98, -66, -97, -75, -126, -70, 42, -59, -44, 324, + -62, -95, 50, -115, 106, 29, -68, 52, -80, -78, + 87, 66, 101, -38, -21, -175 + }, + { + -69, 6264, -1098, -2375, 997, 191, 9, -294, -103, -60, + 290, -502, 122, -487, -77, 659, -15, 12, -815, -148, + 116, 516, -419, -264, 923, -205, 32, 92, 201, -637, + -359, -187, 332, -502, -80, 170, 213, 354, 119, -368, + 103, 117, 499, -287, -487, 305, 162, 48, -240, 200, + 409, -267, -125, 174, -277, -56, -247, 241, 205, 186, + -211, 39, -36, 366, -91, 65, 51, -184, -134, -117, + -59, -145, 130, 65, -207, 24, -40, 52, -36, 51, + 145, 52, -33, -166, 74, 119, -23, -39, 19, 25, + 45, -10, -27, 14, -19, 9 + }, + { + 22, 2797, 833, -612, -162, 133, 38, -75, -149, 324, + 594, -732, 92, -750, -861, -160, -538, -613, -617, 250, + -647, 18, 246, 397, 371, 524, -250, 75, 330, -592, + 284, 357, 262, -59, 5, -865, -566, 44, 109, 137, + -171, 26, -751, 152, -532, 61, 193, -521, 481, 66, + -829, -178, 194, 306, -461, 46, 416, -143, 258, -54, + -191, -232, 110, 93, 144, -93, 111, 100, -199, 95, + -16, -29, -5, 26, -167, 174, 18, -321, -79, -155, + -106, -95, 19, -16, -91, 79, 0, 101, -51, -43, + -37, 0, -185, -157, 76, -64 + }, + { + -163, -9427, -431, 2433, 40, 77, -321, 95, 259, -487, + 442, -232, -344, -20, 231, 128, -72, -278, 189, -391, + -125, -728, 802, 131, -15, -128, 111, 371, 474, 517, + 42, 405, -275, 452, 7, 153, 67, -98, 268, 41, + -101, 297, -340, 20, 10, 120, -29, -122, -267, 14, + -124, -397, 267, -33, 68, 151, -103, 147, 183, 135, + -61, -103, -401, -59, 182, 273, -254, 16, 51, -23, + 142, 36, 100, -164, 165, -6, 0, -213, -113, 43, + -7, 140, -35, -238, 60, -135, -18, 93, -45, 39, + -38, 264, 2, -20, 18, -76 + }, + { + -6, -2208, -2089, 279, -192, 55, -140, 39, 128, 204, + 22, 227, 664, 398, 336, 812, -1217, 156, -832, 453, + 148, 201, 326, 732, 188, 796, -401, -3, 621, 418, + 442, 363, 209, -190, 243, -94, 198, -418, 168, -445, + 19, 11, 231, 124, 114, -317, 141, -193, 185, 234, + 180, 12, 505, -152, 1, -102, -118, -61, 196, -133, + 154, -124, -47, 27, 149, 80, 23, -87, 47, 175, + -111, -24, -259, 67, -46, -24, 55, -36, 127, 113, + -203, -25, 168, -79, -14, -53, 23, -9, -68, -10, + -9, -37, -107, -43, 95, -46 + }, + { + -445, -8944, -253, 3551, 19, -505, -124, -209, 145, -74, + -670, 456, 109, 624, -653, -18, 346, 10, -921, 527, + 695, -261, -557, 1169, 462, 194, 104, 268, 463, -247, + 5, -364, 371, 46, -61, -119, 123, -76, -255, 18, + -179, 402, -46, 193, -138, -60, -34, -68, 98, 228, + -76, -419, 429, 54, 151, -413, -165, -247, -192, -261, + -77, 32, -63, 135, -112, -229, 155, -49, -195, 189, + -55, 201, -28, -138, -86, 148, 107, 145, -102, -84, + -122, -5, -155, 185, 64, 71, 12, 72, -9, -108, + 31, 35, 132, 31, -98, 70 + }, + { + -115, -1833, -4036, 1077, -237, 279, -129, 74, -96, 83, + 538, 367, -339, 249, 1331, -723, -890, -392, 162, 591, + 485, 208, 222, -634, 311, -717, -259, 459, -56, -354, + -449, 325, -242, -28, -327, -523, -334, 228, -38, 164, + 23, -231, -88, -392, 173, -160, -59, 128, 180, 126, + -44, 299, -545, 182, 362, -1, 5, 18, -199, -5, + -223, 63, 45, -51, 107, 8, 195, -84, -190, -167, + -17, 28, 164, 23, 197, 119, -77, -132, 34, -10, + 183, -87, 34, -39, 72, 68, -166, 52, 84, 5, + 84, -60, 47, 3, -152, -39 + }, + { + -409, -8753, 108, 3551, -510, -509, -563, -35, -291, -87, + -1163, 208, 442, -86, -517, -378, -379, 119, -193, 156, + -471, 300, 331, -303, 23, 147, -81, 10, 205, -391, + 262, 559, -35, 198, -55, 273, -211, 438, -8, 38, + -70, 205, -1, -134, -52, -614, -107, 415, -11, 312, + 13, -150, 62, 298, -121, 124, -97, -109, -207, 99, + 66, -433, -180, 99, 87, 5, -123, -200, -211, -190, + -22, 278, 7, -73, -64, -55, 135, -2, 23, -111, + 133, 161, 213, -23, 58, 22, 9, 23, -17, -40, + -78, 11, 62, 29, -72, 95 + }, + { + 33, 4707, 37, -925, -727, 95, 969, 374, -473, -419, + -22, 311, 808, -728, 163, 192, 186, -70, -14, -706, + 380, 99, 557, -479, -111, -769, -113, 696, -44, -190, + -137, -159, 338, -754, -299, -269, 64, 34, 420, -737, + -39, 431, -303, 274, -685, -66, -64, 63, 316, 132, + -277, -346, 15, 397, 273, 366, -64, 204, 236, 383, + 141, 36, 64, 37, -21, 189, -58, 157, 73, -6, + -1, -102, -2, 311, -160, -34, -42, 132, 244, 100, + 174, -110, -129, 57, -124, -75, 12, 84, -131, 35, + -34, 100, 73, -83, 83, -16 + }, + { + 313, -5700, -2804, -70, -2, 752, -1453, -343, 876, -137, + 687, 71, 616, 533, 1890, 185, -242, 535, 520, 677, + -19, 31, -130, -301, 221, -253, -215, 393, -388, -287, + -488, 444, -366, 31, -281, -295, 564, -241, -18, -91, + -285, 530, 46, -96, -89, -254, 131, -789, -134, -58, + 83, -88, -462, 151, -2, 153, -92, 114, 11, -82, + 373, -41, 47, 7, -216, -72, 406, 215, -148, -11, + 91, -194, -160, -290, -124, 74, -76, 144, -78, 107, + -182, -199, -44, 17, 15, -23, -45, 86, 26, -75, + 54, -98, 9, -66, -136, -40 + }, + { + 38, 2949, 565, -118, 82, -22, -163, -172, -381, -265, + -514, 613, -56, 414, 542, 1130, 248, -528, -36, 105, + 720, -646, 747, -609, -557, 708, 59, -418, -116, -362, + -110, 286, 660, 395, -467, -186, 266, 4, 286, -10, + 278, -415, -139, 183, -197, -123, 150, -39, 220, -274, + -208, -359, -206, -145, 225, -95, 124, 74, 365, 142, + 6, 52, -71, -73, 209, -233, -188, -19, -133, 133, + -106, -10, -135, -96, 243, 15, -202, 31, 65, -47, + 111, -122, -152, -15, 123, 95, 58, -5, 85, 29, + -46, 132, -90, -28, 103, 79 + }, + { + -980, -2913, 214, -791, 267, 347, -1901, -1022, -76, 116, + 181, -365, 7, 1460, 739, -762, 850, -630, 362, 478, + -610, 181, 225, -525, -69, -149, -359, 140, 161, -971, + -193, 39, -294, 289, -724, 120, -89, -415, 214, 51, + 281, 75, 364, 208, -548, -141, 240, 435, -187, -65, + 489, -264, 209, -84, -362, 18, -376, -42, 364, 28, + -7, -9, 33, 369, -56, -117, -162, -168, -482, 190, + -36, 287, 53, -21, 329, -20, 119, -371, -317, 47, + -96, 48, -63, -11, -114, 34, -20, 136, 131, 60, + -153, -55, -218, -3, -79, 50 + }, + { + 109, 3304, -1482, 128, 271, 71, 327, 327, 194, -35, + 350, -260, -245, 115, 599, -639, 740, 1274, 533, 73, + -900, -402, 428, 237, 115, -592, -215, 447, 453, 764, + -561, -193, 125, 210, -196, -549, 368, 196, 56, -76, + -378, 27, 197, -565, 14, -102, -100, -39, 32, 25, + -404, 159, 70, 116, 152, 429, -336, 163, -138, -149, + -312, -415, -189, 124, -43, -113, -134, 14, -41, 173, + 149, -279, -43, 104, -96, 35, 71, 124, 80, 117, + 64, -82, 84, 68, -22, 305, -68, -123, 92, -124, + 33, 83, -206, 26, -135, -6 + }, + { + -783, -4466, 1928, -781, -1077, 188, -690, -479, 247, 317, + -670, 99, -905, 1104, 1550, -176, 366, 888, -467, 502, + -88, -98, -115, 781, 436, 187, -290, 355, 146, 247, + -889, -417, 295, 303, 560, -828, 329, -42, -206, -442, + -197, 200, 155, 19, 480, -64, 435, 151, -54, 420, + -121, -326, 62, -117, 118, 83, -91, -191, -226, 355, + -10, 138, 62, -306, 273, -84, -123, -302, 27, 136, + 0, 133, -56, -10, -251, 113, -47, -45, 175, 124, + -139, 68, -197, -12, 61, -14, 77, 54, -49, -158, + 76, 118, 266, 18, 53, -84 + } + }, + { + { + -40, -3963, 468, -18, -234, 204, -170, 299, 385, -119, + 344, -181, -364, 23, -569, 848, 1226, 64, 136, -124, + 791, -907, -129, 523, 320, -1428, 26, 158, 521, 483, + -3, 66, -386, -358, 184, 35, 124, 507, -217, -7, + 208, -280, 553, -479, 157, 149, -232, 204, 203, 144, + -105, -57, -24, -264, 182, -48, -313, -76, 115, -33, + 233, -141, 133, 128, -21, 219, -20, 123, -123, 30, + -56, 0, 20, -39, 9, 140, -26, -40, -81, 46, + -83, 136, 38, 40, -49, -74, -114, 66, -118, 25, + 172, 44, -8, 54, -22, 11 + }, + { + -405, 5836, 2683, -4113, -1705, -198, 82, -1171, -599, 687, + 256, 502, -535, 20, 103, 226, -372, -451, -557, -633, + -403, 31, 77, 522, -651, -125, 537, 305, 62, 307, + -29, -30, 193, 316, 409, 325, 38, 116, 35, -104, + 59, -444, 214, -464, 80, -140, 109, 96, 22, -286, + 160, -434, 0, -44, 382, -144, -87, 187, 65, 105, + 290, -10, -20, 143, 13, -207, -137, 65, -27, -96, + 259, 111, 95, 13, -81, -41, 15, -146, -148, 202, + 6, -16, 23, -64, 101, -74, -140, 101, -54, -23, + 36, -14, 72, -63, -2, -69 + }, + { + 55, 4923, -1689, -2729, 1373, 379, 345, -92, -313, -210, + 155, -826, -401, -115, 186, 440, 0, 376, -558, -524, + 87, 374, -601, -400, 838, -110, 279, 128, -199, -560, + 264, 431, 472, -650, -257, 198, -373, 237, 495, -321, + 203, 325, 642, -127, -598, -45, -149, -190, -136, 192, + -174, -531, -151, 52, -256, 174, -79, 215, 55, 301, + 2, 122, -129, 203, -104, -102, 8, -122, -159, -18, + -50, -171, 127, -74, -165, 60, -161, -21, -183, -133, + 11, -43, -6, -87, -50, -39, -68, -84, -9, -58, + 56, 42, -34, 13, -17, 12 + }, + { + -17, -198, -1306, 70, 255, 52, -93, 103, -133, -226, + 29, -1088, 113, -710, -457, 7, -1024, -781, -860, -458, + -957, -53, -35, 23, 482, -1, -728, 399, 766, -238, + 279, 108, 220, 334, 125, -117, -197, -325, 45, -86, + -324, 252, -737, 82, -343, -15, -8, -556, 577, 275, + -408, 186, 50, 363, -239, -56, 221, -246, 290, 4, + -48, -45, 72, -51, 161, -186, -80, 162, 23, 149, + -55, -57, -98, 40, -256, 28, 92, -107, 44, -170, + -144, -129, -16, 32, -12, 32, -88, 59, -22, -40, + -16, 53, 11, -9, 189, 39 + }, + { + 184, -5743, 1853, 1948, -255, -1, 103, 34, -40, -336, + 774, 740, 273, 339, 43, 253, 924, -147, -413, -103, + 457, -102, 824, -559, -316, 61, 231, 169, 387, 558, + 470, 549, -103, 853, 130, -143, -265, -558, 55, -239, + -638, -224, -388, 28, -162, -18, -146, 171, 164, -139, + -204, -179, 278, -89, 180, 177, -76, -66, -145, 69, + 47, -164, -119, 161, 120, 263, -80, 86, -21, -168, + 20, -79, -93, -207, 94, -130, 46, -71, -69, 37, + 48, 41, -99, -112, 119, -85, -12, 82, -102, -33, + -29, 213, -18, -23, 7, -49 + }, + { + 127, 47, 177, 507, -418, 50, -58, -126, -399, -63, + -294, -151, 709, 62, 63, 977, -1181, -513, -1127, 8, + -368, -68, 218, 32, -610, 498, 106, -68, -439, 16, + 73, -103, 228, -220, 241, -104, 167, -449, 226, -396, + -20, -244, 235, 131, 153, -1, 211, -273, 152, 352, + 305, -102, 374, -336, -36, -79, -137, -55, 162, -364, + 185, 158, 116, 93, 101, 20, 10, -185, -88, 59, + -89, 119, -86, 231, 45, 29, 56, -86, 32, -5, + -123, 43, 47, -122, 38, -129, -100, 4, 21, 53, + -100, -110, -9, 9, -3, -65 + }, + { + 530, -5840, 746, 3102, -13, -242, -30, -687, -746, 56, + -110, 573, -707, 77, -502, -33, -360, 288, -912, -155, + 455, -127, -326, 698, -158, -141, 37, 242, 294, -181, + 495, 266, 511, 257, -270, -156, 284, -43, -169, 248, + -29, 563, -307, -157, -230, -53, 46, -176, -152, 133, + 74, -311, 136, -276, -175, -335, 189, 22, 37, -59, + 109, 188, -43, -50, -61, -65, 228, -36, -263, 241, + -53, 53, 58, -3, -55, 142, 141, 90, -91, -31, + -141, -81, -97, 161, -133, 82, 8, -39, 12, -34, + -11, -71, 128, 44, -107, 84 + }, + { + 199, 2587, -505, 861, -528, 22, -300, 73, 10, -32, + 92, -99, -261, 574, 914, -855, -420, -202, -556, -645, + 126, 95, 88, -121, 446, -839, 294, 431, -779, -542, + -771, 192, 204, 338, -113, -121, 53, 437, 234, 24, + -160, -92, 140, -147, 323, -22, 91, 305, 35, 226, + 88, 263, -537, 287, 146, -160, 31, 27, -142, 292, + -231, -134, -1, -20, 133, -151, 88, 16, -96, -37, + 65, -39, 91, -131, -28, 55, -15, -31, 131, -22, + 88, -218, -48, -28, -22, 24, -62, 38, 65, 37, + 104, -30, 34, -73, -186, -98 + }, + { + 460, -6516, 549, 3088, -298, 178, -190, 341, 79, 282, + -324, 715, -73, -52, 442, 523, 11, 223, 57, 276, + -156, 14, -42, -150, -259, 222, 57, -367, -231, -935, + 3, 300, -268, 124, -40, 327, 83, 539, 125, 384, + 67, 235, -54, 176, 353, -256, -47, 256, -91, 339, + 228, -53, 173, 211, -191, 15, -37, 20, 19, 35, + -56, -168, -54, -3, -257, -209, 154, 17, -77, -31, + 133, 228, -45, -211, -77, -89, 29, 10, 36, -169, + 34, 166, 189, -149, -53, -4, 58, 98, 56, 29, + -50, 27, 110, 92, -66, 84 + }, + { + -39, 2472, -1683, -329, 184, 235, 627, 828, -123, -450, + -429, -89, 288, -799, 460, 212, 174, -90, 881, 806, + 134, -118, 157, -612, 89, -500, 29, 440, -211, 274, + 77, 20, 834, -109, 323, -364, 84, 317, 715, -731, + -116, 108, -620, -186, -366, 340, 217, -29, 116, 126, + -349, -82, 282, 191, -405, -249, -427, -184, -39, 6, + -360, -55, 87, -163, -271, -11, 42, 265, 227, 231, + 17, -56, -109, 84, -102, 76, -71, 40, 148, 23, + 88, -136, -231, 1, -9, 77, 96, 37, -106, 64, + -60, 5, -52, -80, 167, -23 + }, + { + -525, -2466, 1272, 143, -592, 595, -1509, -2131, 359, 943, + 910, -906, -1078, -1009, 1430, 252, -173, 113, -117, 283, + 88, 234, -288, -277, 381, -18, 70, 674, 348, 538, + -386, -46, -644, 328, 133, -485, 309, -192, -140, 99, + -198, 460, -229, -172, 248, 171, 668, -459, 64, 399, + 286, 48, -207, 257, -83, 94, -121, 431, -96, -355, + 200, 20, 172, 142, -145, -149, 203, 176, -67, 7, + -12, -170, 118, 127, 43, 24, -147, 123, -78, 98, + -117, -168, -128, -49, 40, -28, -52, 44, -34, -111, + 116, -57, 52, 17, 77, 35 + }, + { + -10, 399, -1079, -187, 163, 147, -507, -18, -56, -84, + -921, 352, -610, -563, 70, 136, -232, -38, 984, 352, + 188, -1386, 280, -651, -564, 31, -408, -1024, -580, 440, + 252, 84, 377, 502, 172, 212, -255, -523, 199, -245, + 440, 39, 196, 243, 52, -36, -47, 183, 487, -120, + 314, -161, -27, -163, 258, -124, -51, -21, 88, 67, + 38, -96, -136, -47, 148, -5, -63, -85, -224, 63, + 11, 104, 82, 3, 98, 99, -53, -16, 46, -54, + 4, -230, -181, -112, -14, -40, 70, 59, 170, -17, + -139, 134, -38, -53, 57, 17 + }, + { + 927, -3605, -1787, -51, 241, 648, -1025, -414, 98, 326, + 373, -342, -163, 660, -102, -1339, 1308, 149, 1062, 774, + -714, 144, 30, -93, 570, 50, 22, 205, 362, -462, + 308, 640, -316, -112, -737, 325, -175, -455, 221, -304, + 288, 131, 47, -152, -502, -183, -111, -126, -618, -139, + 568, -2, 438, -65, -155, 81, -329, 8, -38, -343, + 12, -82, -300, 99, -203, -196, -33, 81, -333, 76, + -178, 145, 78, -30, -23, -315, 163, -198, -145, 98, + -93, -60, -88, 102, 85, 33, -90, 30, -44, 14, + -140, -85, -126, 154, 77, 109 + }, + { + -123, 3448, -986, -143, 37, 167, 141, 7, 431, 76, + 344, -190, 584, -290, -1468, -1121, -169, 124, 113, 815, + 232, -136, 292, 623, 74, -1001, -248, -194, 712, 1108, + -722, -522, -94, -34, -217, -336, -25, -49, 280, 329, + -482, -149, 119, -546, -51, -301, 8, 257, 124, -181, + -476, 385, 87, 205, 85, 389, -380, 193, -143, -38, + 295, 136, -89, 290, 89, -36, -89, 63, -31, -20, + 68, -218, -136, -5, 27, 215, 86, 30, -89, 18, + 169, 10, 94, -46, -177, 130, -50, 26, 183, -120, + 49, 133, -85, 39, 0, 3 + }, + { + 745, -4014, 72, -1132, -914, 286, -497, -449, 531, 605, + 214, 358, -904, 769, 501, -309, 446, 635, -1135, -111, + -85, -149, -692, 900, 421, 95, -528, 198, 125, 705, + -560, -910, -437, -230, 711, -529, 178, -79, 482, 199, + -132, 450, 158, -85, 367, -296, -91, 165, 266, 712, + 105, -306, -17, -198, 156, 133, 20, 180, 9, 402, + -102, -42, 3, -292, 249, -162, -183, -325, -32, -54, + -151, 23, 84, 228, -107, 70, -200, 89, 360, 131, + -275, 112, 12, -57, -82, -74, 70, 138, -32, -242, + 39, 100, 186, -83, -15, 1 + } + }, + { + { + -44, -2971, -659, 1637, -838, -97, -41, 404, 326, 362, + -180, -135, -372, -669, -182, 993, 293, 287, -149, 504, + 710, -648, -561, 291, -161, -570, -196, 335, 227, 534, + 435, -367, 108, -732, -56, 153, 679, 146, -75, -46, + -23, -242, 238, 140, -12, -235, 112, 93, -33, 28, + 23, 193, -214, 43, -196, -63, -58, -158, 36, 117, + 9, 158, 114, -33, 266, 131, 15, 94, -91, 37, + 38, -91, 28, 63, -149, 108, 19, 14, -36, -50, + 80, 71, 13, 99, -90, -15, -134, -49, -7, 4, + 91, 21, 9, 117, 0, 9 + }, + { + 311, 9143, -1773, -3891, -1830, -163, -619, -733, 289, -48, + 663, 370, -481, -140, 328, 16, 351, -918, -865, 38, + -486, 94, 12, -189, -154, 20, 205, -38, 84, 740, + -237, 28, 610, 164, 397, 359, -71, -231, 222, 314, + -230, -235, -1, -321, -51, -78, 143, 193, -157, -162, + -153, -79, -9, 89, 37, -172, 234, -79, -62, 425, + 194, -30, 141, -166, 82, -109, -114, -82, -12, -91, + 279, 115, 80, -43, -59, 94, -69, -143, 19, -78, + 18, 56, -53, 57, -25, -57, -16, 45, 0, -52, + -32, 26, -54, 19, -14, -4 + }, + { + -151, -239, 2407, -1466, 361, 373, 510, -250, -472, 588, + -690, -168, -269, -112, 483, -85, 452, -355, -14, -95, + -127, -314, -406, 274, 200, 156, 191, 138, -140, -108, + 230, 189, 33, -218, -130, 291, -454, -31, 222, 320, + -104, 222, 553, 48, -391, -222, -328, 56, -64, 287, + -503, -274, -138, -168, 0, 69, 35, -26, -51, 322, + 121, 143, -101, -93, 60, -189, 15, 37, -111, -5, + -105, -1, -45, -138, -66, -78, -166, -37, -132, -84, + 8, -22, -46, -24, 9, -98, -86, -135, 15, 3, + 1, -28, -14, 86, 18, -58 + }, + { + -73, -2179, 212, 448, -72, -15, -36, 119, 123, -649, + 72, -755, -449, -326, 85, -853, -478, -558, -892, -465, + -803, -382, 316, 122, 32, -374, -47, 437, 239, 126, + 109, 170, 94, 549, 18, 134, 231, -473, -162, -424, + -192, 303, -425, -124, 74, -198, -245, -79, 66, 262, + -22, 53, -155, 292, 137, -44, -95, -1, 73, 149, + 49, -21, -27, 13, 73, -129, -78, 166, 133, -28, + 32, -75, -56, 30, -243, -98, 83, -23, 25, 0, + -264, -116, 35, -26, 9, 61, -54, -55, 19, -12, + 64, -40, 64, 111, 102, 28 + }, + { + -327, -3580, 399, 1803, 124, 63, -72, 122, -424, 543, + 375, 622, 358, 325, 166, 402, 895, -259, 614, -398, + -102, 260, 280, -540, -80, 123, 453, -21, 37, 708, + 686, -187, 576, 571, 214, -134, -66, -478, -67, -317, + -620, -605, -293, -148, -7, 119, -227, 253, 284, -154, + -207, -85, 193, -70, 335, -118, 65, -147, -276, 75, + -37, -87, 179, 16, 217, -92, 147, 158, -129, -73, + -23, -122, -195, 2, -110, -48, 46, 30, 6, -36, + 67, 11, -81, -16, 102, -4, -49, -36, -58, -82, + 46, 23, -11, 113, -76, -18 + }, + { + -4, 813, 522, 208, -221, -112, 39, -88, -93, -293, + -341, -276, 381, -626, 1181, 67, -160, -997, -405, -412, + -432, 285, 138, -319, -415, 93, 576, -287, -618, 140, + -363, 18, -169, -225, 317, -125, 20, -201, -152, 71, + -189, -157, 158, 173, 106, 315, -7, -65, 22, 294, + 245, 108, 218, -369, -12, -94, 9, -39, 13, -114, + 88, 73, 186, 24, 65, 14, 6, -110, -51, -222, + 134, 35, 8, 169, 136, 29, -22, 42, 17, -120, + 56, -51, -36, 13, -63, -99, -54, -77, 98, -1, + -100, -57, 17, -49, -76, -18 + }, + { + -754, -2328, -736, 2636, 73, -6, 201, -740, -1174, 145, + 153, 291, 155, -565, -754, 4, -691, 517, -184, -768, + 249, 460, 167, -442, 1, -21, -88, 66, 54, 70, + 260, 506, 229, 623, -321, 197, -157, 90, -54, 386, + 280, 122, 113, -515, -130, -45, -79, 82, -111, 125, + -162, -110, 79, -388, -120, -4, 121, -31, 135, -27, + 145, 151, 88, -111, -129, -41, 131, -23, -24, 133, + -43, -196, 13, 117, 133, -16, 222, -165, 34, 4, + -37, -122, -55, 27, -70, 46, -46, 17, -62, 52, + -75, -29, 82, -27, -19, 82 + }, + { + 76, 1842, 1581, -243, 255, -294, -231, -50, 203, 7, + -132, 95, 220, -115, 277, -509, -234, -237, -805, -540, + 95, -72, 398, -268, 76, -317, 247, -9, -250, -187, + -890, 168, 95, 385, -140, 9, 370, -24, 609, -60, + -408, 185, 172, 174, -75, 475, 71, 115, 120, -12, + 21, 294, -345, 226, -36, -202, 246, -110, 18, 209, + -43, -86, -38, 78, -34, -90, -164, 181, -59, 67, + 31, -16, 104, -186, -47, -1, -1, 50, 89, -23, + -65, -79, -54, 49, -148, -54, 31, -10, 67, 34, + 74, -10, -22, -71, -73, -145 + }, + { + -699, -3783, -607, 2388, 104, 415, -262, 199, 701, 126, + 923, -421, 62, -293, 1083, -163, -361, 611, 246, 353, + 171, -283, -256, 17, -115, 31, -36, -89, -791, -712, + -76, 190, -89, 227, 246, 174, -54, 350, 327, -35, + 263, 272, -125, 371, 340, -105, -13, -38, 81, 73, + 385, -39, 166, -106, 212, -211, 141, 20, 60, -10, + -211, -4, -41, 6, -304, -242, 173, 124, -47, -6, + 204, -35, -34, -31, -138, 46, -31, -53, 36, -36, + -79, 114, 38, -49, -25, -32, 41, 113, -9, 16, + -6, -18, 130, 131, -14, -36 + }, + { + -100, 200, -413, -57, 836, 478, -573, 366, 657, -293, + -581, 92, -265, 344, -196, 277, 500, -386, 824, 1704, + -900, 300, 125, -208, -350, -166, 118, 14, 41, -128, + 372, 393, 85, 208, 20, -159, -39, 172, 454, -229, + 18, -338, 34, -647, 30, 189, 221, -246, -3, -72, + -1, 23, 174, 38, -106, -552, -321, -346, 8, -140, + -579, 112, 65, -236, -262, -148, 145, 358, -24, 311, + -25, -10, -95, -27, 61, 101, -133, 147, -41, -105, + 24, -91, -116, 52, -15, 64, 113, -29, 78, -31, + -103, 67, -97, -39, 75, 25 + }, + { + 661, -2532, 126, 269, 187, -602, -6, -1681, -336, 909, + 322, -264, -1369, -1032, 435, 484, -325, 120, 132, -199, + 644, -50, -147, -424, 23, 305, 502, 406, -52, 564, + 198, -579, -311, 333, -51, -520, 167, -7, -44, 2, + 296, -135, -3, 34, -11, 206, 282, 101, 165, 366, + 87, 257, -136, 322, -252, 121, -220, 495, -52, -276, + -34, 358, -32, 112, -132, 17, -119, 148, 88, -58, + -4, -43, 38, 140, 117, -8, -43, -61, 29, 10, + -9, -200, -100, -79, 13, -30, 16, -14, -18, -118, + 73, -56, 129, 65, 61, 75 + }, + { + -92, -1230, -56, -333, 235, 124, -217, -121, 80, -220, + 67, -567, -1, -1771, 527, -349, -297, 16, 1140, 621, + -123, -733, -213, -373, -364, -560, -260, -356, -1080, 543, + 1061, -415, -74, 714, 179, 221, -195, -195, -133, -248, + 313, 113, 583, -194, 164, -313, 134, 562, 45, -263, + 754, -345, 103, -113, 61, 145, -113, -13, -57, 282, + -109, -38, -63, 69, -206, 55, -68, 46, -222, -4, + 67, 116, 17, -44, 67, 192, 85, 58, -131, -129, + 86, -217, -133, -164, 19, -69, 108, -24, 166, -20, + -51, -8, 128, -23, -116, 42 + }, + { + -1020, -1733, -1209, -608, 629, -430, 111, 333, -236, 2, + -152, 259, 723, -264, -886, -753, 1203, 291, 1299, 424, + -316, -83, -171, 225, 553, -344, 44, 237, 107, 257, + 330, 114, -491, -187, -254, 670, -633, -179, 124, -133, + 49, -124, 94, -296, -10, -305, -125, -270, -420, 28, + 409, 120, 73, -8, 91, -76, -200, -1, -173, -440, + 72, -77, -187, -197, -318, 44, 92, -17, -114, -82, + -10, -165, 167, -47, -170, -155, 133, -225, 1, -85, + -49, -91, 60, 48, 88, -40, -18, 20, -100, 17, + -65, -104, 17, 96, 88, 25 + }, + { + 13, 2081, 259, -505, -15, 162, 395, -5, 341, 264, + 90, -112, 508, -647, -511, -309, -1274, -329, 437, -211, + 1127, 276, -20, 533, 256, -895, -143, -426, 683, 268, + 212, -302, -137, -384, -49, -313, 83, -110, -46, 330, + -195, -129, -170, -238, -85, -346, -87, 425, -56, -39, + -143, 327, -157, 396, 158, 120, -330, 284, -135, 52, + 55, 236, 153, 247, -45, -15, -2, 153, -69, -79, + 51, -189, -145, -52, 45, 232, 123, 20, -72, 40, + 103, 63, 20, -154, -47, -78, 88, -4, 171, -75, + 33, 72, 110, -62, 13, 39 + }, + { + -850, -1814, -620, -587, -325, -714, 7, -303, 504, 132, + 605, -594, 418, 1378, -1091, -140, 415, 427, -643, -35, + 76, 132, -544, 26, 466, 140, -551, 158, -11, 164, + -85, -242, -373, -441, 65, 132, 19, -23, 380, 163, + -228, 581, -66, 151, -165, -55, 80, 47, 202, 224, + 318, -193, -162, 7, -106, 45, 217, 338, 84, 136, + -23, -197, -194, 150, 34, -29, -86, -312, -162, -109, + -171, 111, 52, 115, -65, 44, -157, 286, 184, -60, + 41, 33, 71, -78, -197, 26, 82, 22, 77, -111, + -39, 106, 116, -95, -82, 2 + } + }, + { + { + 8, -461, 878, 2135, -680, -139, 54, -74, 40, 183, + -266, -598, -604, -256, 66, 362, -748, -307, -639, -167, + 290, -529, -1337, -389, 276, -21, -10, -113, -210, -12, + 310, -264, 233, -473, -35, 111, 486, -26, -146, -205, + -67, -255, 220, 127, -46, -377, -44, 58, 59, 231, + 142, 335, -126, -24, -274, 130, 90, -283, -53, 34, + -196, 53, 177, 8, 40, -118, 14, 156, 131, 81, + 94, -165, -224, 119, -94, 53, 136, 134, -68, 11, + 50, -59, 23, 120, -16, 92, -28, -14, 1, 56, + 120, 75, 84, 104, -17, -36 + }, + { + -250, 9633, -578, -3479, -1065, 275, 514, 800, 377, -1020, + 78, 1189, 383, 166, -6, -17, 1012, -385, -40, 767, + -112, 146, -364, -586, -247, -155, 497, -12, -518, 627, + -295, 50, 582, -18, -26, -53, 221, 434, 608, 330, + -261, -231, 173, -112, -36, -162, 79, 270, 233, -88, + -64, 214, -113, -219, -125, -85, 81, -279, -286, 22, + -21, -124, 112, -89, 155, -1, 6, -181, -92, -74, + 208, 65, -35, -147, -88, 183, -37, -6, 139, -125, + -78, -16, -33, 49, -45, -18, 35, 78, 49, -64, + -43, -5, -97, 30, 10, 33 + }, + { + 274, -3968, -984, -106, 622, -151, 466, 45, -172, 702, + 179, 419, -115, 282, 786, 410, 717, -591, 127, 714, + -2, -151, 210, 601, 352, 130, -189, 190, 349, 32, + 0, -13, -14, -331, -113, 432, -149, -122, 60, 337, + -97, -5, 318, 156, -176, 353, 183, 95, -196, 222, + -35, 213, 133, -31, 183, 158, -74, -132, -215, 64, + 11, 86, -181, -131, 155, -130, 70, 150, -98, -38, + 5, 68, -61, -19, -20, -168, -149, 52, 121, 171, + 34, -66, -18, 19, 154, 11, -44, -88, -34, 20, + -57, -114, -30, 114, 28, -124 + }, + { + 104, -2253, -136, 552, 199, -47, -71, -40, 100, -649, + -90, -463, -235, 77, 844, -162, 443, 235, 135, 40, + -532, -484, 335, 148, -364, -335, -250, -146, 128, -126, + 132, 490, -1, 427, 80, -61, 424, -173, 22, -161, + -83, 460, -74, 83, 371, 53, 39, -42, -284, -101, + -110, -102, -276, 122, 65, -54, -13, 124, -36, 212, + 59, 69, 95, -46, 130, -93, -233, -15, -91, -80, + 201, 80, -3, 40, -168, -62, 40, -106, -83, 110, + -130, -16, -8, -57, 67, 47, -73, -18, 9, -4, + 81, -110, 19, 27, -18, -19 + }, + { + 586, -2071, 426, 1382, -245, -178, -80, 489, -458, 571, + 424, 480, 101, 157, 208, -383, 280, -11, 1344, -137, + -113, 202, 397, 69, 128, 47, -46, -57, 284, 196, + 268, -202, 420, 160, -4, -260, 91, 295, 63, -189, + -155, -329, -29, 234, 383, 212, -290, 197, 140, 6, + -25, -184, 48, -83, 190, -265, -140, -116, -62, 229, + -117, -43, 97, -155, 205, -25, 146, 84, -139, -30, + -40, -31, 26, 120, -58, -97, 19, 125, 23, -9, + 47, -10, -18, 43, 72, -4, -60, -112, 32, -3, + -7, -70, -83, 67, -95, 18 + }, + { + -95, 198, 164, 221, -93, -59, 177, 19, -12, -253, + -249, -167, 139, -326, 2297, 887, 1054, -124, 100, -14, + -45, 585, -136, -331, -25, 284, 821, 171, 141, 70, + -683, -400, -417, -241, -10, -212, -53, -264, -88, 300, + -196, -296, 136, 142, 59, 310, 149, 211, -58, 227, + 90, -1, 275, -261, -171, -131, 147, -73, -66, -115, + 78, 61, 111, 37, 159, -6, -92, -44, 21, -250, + 99, -71, 6, 175, 152, 51, -55, -89, -115, -158, + 74, -24, 6, 122, -26, -51, 31, -19, 115, 13, + -19, -80, -71, -38, -56, -72 + }, + { + 993, 61, -711, 2577, 80, 235, -28, -91, -77, -432, + -240, 430, 411, -319, -682, 369, 571, 642, 251, -63, + 387, 342, 108, -611, 243, 99, -354, -138, 187, 1, + 464, 681, -393, 291, -51, 667, -139, 96, 76, 84, + 57, -1, 205, -250, 368, -13, -32, 260, -29, 340, + 114, 55, 61, -209, 104, 46, 250, 41, 184, 21, + -57, -70, 132, -23, -227, -161, -122, -2, 267, 216, + 44, -145, -41, 20, 138, 9, 129, -207, 71, 9, + -51, -37, -107, -117, -88, 70, -5, 49, -84, 49, + -109, 15, 73, -37, 65, 52 + }, + { + -215, -1423, -533, -598, 298, -36, 33, 195, 192, -219, + -99, 512, -114, -1525, -62, 422, 757, 363, -434, -181, + -308, -512, 270, -499, 10, -376, 83, -166, 292, 394, + -228, 507, -174, 341, 107, 86, 522, -173, -159, -394, + 15, 373, 138, 183, -48, 391, 1, -73, 35, -84, + 80, 294, -232, 129, -178, -160, 236, -158, 150, 344, + 113, 64, 94, 172, -121, 5, -114, 148, -45, 149, + 163, 49, 107, -183, -197, -48, 15, 54, -15, -165, + -80, 13, 47, 34, -171, -23, -5, -88, 18, -3, + 8, -76, -50, -16, -1, -99 + }, + { + 1048, -1462, -301, 2652, -284, 158, -261, 101, 546, -568, + 638, -241, -387, -520, 985, 99, -469, 71, 54, -53, + -205, -576, -326, 174, 237, 265, -229, 160, -414, -151, + -180, -249, -47, 113, 273, 321, -59, -135, -13, -120, + -29, -50, -213, 188, 229, -125, -43, -25, 112, -197, + 161, -2, 137, -249, 275, -82, 18, -122, -117, 102, + -192, 36, 30, 130, 4, 24, 66, -5, -64, -47, + 121, -4, 6, 97, -21, 88, -32, -81, -18, 54, + -42, -19, -3, 2, 2, -23, -30, -20, -133, -21, + -27, -35, -3, 71, 40, -47 + }, + { + 238, -456, -534, 48, 402, -589, -1377, -155, 461, 101, + -94, 531, -19, 986, 325, -68, 123, -395, -365, 640, + -835, 179, 232, -665, -571, 148, -190, -243, 203, -261, + 376, 465, -233, -368, -395, -15, -103, -81, 395, -38, + -43, -330, 362, -114, 239, -19, 53, -293, 121, -15, + 2, 94, -129, 3, 251, -409, -71, -87, 118, 118, + -336, 199, 82, -221, -179, 93, 27, 29, -334, 54, + -47, 25, -44, 125, 27, 3, 0, 161, -104, -110, + -34, -18, 4, 28, -74, 55, 24, -98, 135, 7, + -122, 43, -88, -59, 22, 10 + }, + { + -699, -3559, -153, -257, 428, 48, 847, -290, 446, 689, + -31, -3, -336, -392, -273, -110, -639, -386, -217, -644, + 324, -112, 62, -535, -299, 206, 41, -18, -361, -311, + -352, -637, -232, -267, 31, 489, 791, 79, 342, -24, + -238, -450, 185, 167, -30, 218, -8, -209, 151, 128, + -478, -53, -239, 353, -40, 348, -200, 231, -6, -140, + -222, 230, 114, 128, -226, 7, -77, 92, -54, -103, + 74, 42, 4, -28, 82, -40, -31, -17, 18, -52, + 146, -61, -56, -60, -16, -82, -51, -96, -50, -48, + 36, -62, 142, 16, 56, 67 + }, + { + 145, -1644, -557, -255, 96, 80, 247, -159, -19, 29, + 809, -216, 420, -1690, 135, -328, -139, -29, 437, 102, + 239, 162, 112, 15, -121, -382, 677, 861, -64, 415, + 875, -111, 141, 733, 129, 36, -325, 333, 24, -167, + 314, 47, 478, -394, 73, -427, -104, 422, -7, -539, + 551, 54, 555, 38, -21, 229, 128, 261, 61, 183, + -61, 33, -216, 91, -143, 86, 22, 85, -201, 11, + -191, -117, -101, -6, 91, 24, 47, 68, -15, 60, + -16, -124, 90, -32, 61, -113, 76, 3, 116, -107, + -61, 17, 179, 17, -105, 66 + }, + { + 893, 2053, -435, -406, 489, -1544, -262, -198, -734, -340, + -448, 527, 485, -986, 171, -163, 496, -90, 1022, -42, + -503, -154, 197, 301, -9, -525, -227, -418, -214, 105, + -272, -323, -384, -1, 42, 617, -392, 421, -361, -349, + 32, -498, 101, 380, 618, 72, 228, 193, 29, 77, + 303, -94, -290, -211, 7, -46, 13, -69, -218, -239, + 120, 3, -182, -321, -228, 80, -48, 82, 27, -157, + 77, -141, -4, -177, -174, -2, 246, 17, 117, -139, + 22, 59, 21, -103, 49, 5, 55, 78, 14, 84, + -9, -37, -37, -4, 5, -21 + }, + { + 100, 1751, 219, -25, 445, 170, 71, -636, -309, 293, + 314, -267, -159, 1878, 4801, 1315, -1355, -726, 362, -641, + 768, 685, 163, -314, -179, -888, 15, -100, 439, -264, + 276, -386, -12, -181, 285, -20, 413, 36, -618, 129, + 91, -411, -423, -38, -9, -375, -68, 365, -364, -136, + -41, 120, -232, 284, 207, 56, -410, 183, -108, 123, + -252, 40, 126, -69, -207, -27, 16, 150, -157, -70, + 42, 27, 9, -105, -17, 134, 109, 4, -40, -37, + -61, 14, -16, -123, 53, -31, 74, -99, 43, -50, + 8, 0, 18, -171, -70, 15 + }, + { + 876, 1025, -97, -224, -137, -457, 378, 67, 200, -951, + -927, -1222, 386, -387, -2899, -404, 1124, 993, 339, 969, + 389, 164, 44, 221, 876, 404, -516, 541, 231, 277, + 1011, 573, -587, -214, 191, 14, -328, -104, -274, -182, + -266, 176, -355, -94, -396, -132, 134, -71, -71, -328, + -55, -376, -173, -10, -300, 38, 278, 164, -30, -191, + -170, -282, -162, 289, -38, 16, -23, -153, -99, -19, + -102, 101, 17, -56, -110, 151, -43, 259, -91, -211, + 94, 1, 66, -57, -170, 46, 137, 5, 119, 34, + -22, 18, -11, -114, -38, 11 + } + }, + { + { + 70, 1908, -528, 505, 81, -157, 109, -263, -396, 191, + 419, -1207, 104, -287, -214, 135, -544, -58, -60, -614, + -172, -341, -783, -431, 477, -306, 199, -848, 238, -197, + -234, 72, 95, 87, -12, -373, 278, 199, -274, -360, + 153, -86, 221, -132, 50, -403, -118, 228, -173, 374, + 276, 153, 90, -137, -295, 73, -28, -166, 162, -59, + -108, -46, 15, 95, -77, -156, 145, -117, 334, 104, + 0, -137, -197, 114, -97, -25, 138, 193, 31, -40, + 27, -25, 90, -22, 1, 83, 3, 62, -67, 130, + 88, 53, 134, 0, -1, 38 + }, + { + 240, 7780, 1111, -5306, 1023, 19, 634, 1101, -106, -540, + -19, 1563, -13, -65, -158, 68, 394, 177, 791, 152, + -353, 147, -360, -296, -74, -315, 212, 358, -506, 255, + -31, 160, 126, -114, 53, 146, 157, 463, 541, 93, + -62, -360, -132, 55, 254, -292, 113, -11, 642, -379, + -116, 198, -112, -113, -78, -10, -176, -186, -74, -202, + 60, -283, -80, 95, 33, 197, 33, -78, -240, 107, + -86, 49, -80, 29, -110, 147, 6, 58, 37, 27, + -113, -85, 50, -86, 71, -27, 85, -21, 24, -52, + -16, -17, 7, 96, -37, -44 + }, + { + -257, -4951, 525, 2083, -1838, 495, -34, -393, 672, 53, + 273, 658, -102, 577, 595, 544, 716, -486, 45, 1619, + -808, -188, 646, 255, 246, 202, -407, 597, 327, -47, + -164, 88, 202, -548, 190, -104, 595, -485, 157, 151, + 291, -249, -149, 464, -181, 318, 337, -36, -19, -124, + 383, 208, 220, 2, 61, 144, -34, -59, -128, 1, + 21, 47, -242, -40, 167, -57, 1, -13, 138, -180, + 13, 72, -22, 45, 58, -148, -82, -130, 230, 202, + -2, -185, 7, 54, 145, 71, -131, 15, -129, 135, + -125, -82, -29, 84, 21, -67 + }, + { + -8, -1743, -226, 441, 126, -39, -25, -315, 134, -57, + -517, -619, 23, -445, 1016, 450, -282, 227, 1065, -403, + -435, -199, -397, 201, -70, -435, -443, -334, 439, -16, + 413, 328, -41, 388, 166, -194, 151, -254, 363, 34, + -107, 34, 281, 157, 154, 142, 164, -129, -93, -261, + -103, -213, 41, -33, -56, -93, 74, 135, -125, 190, + 91, 118, 70, -10, -2, 39, -289, 55, -207, 48, + 154, -27, -16, 36, -88, 66, -201, -6, -97, 47, + 40, 64, -263, 37, -18, 23, -17, 8, -68, 50, + 54, -32, -43, -9, -65, 61 + }, + { + -802, -616, 676, 1806, -488, -231, 7, 207, -77, 300, + 520, 835, 284, -310, 228, -428, 69, -90, 1155, -166, + 296, -280, 567, 640, -288, 283, -329, 325, 119, -226, + 7, 337, 166, 154, 16, -156, -44, 445, 47, -306, + 106, 211, -68, 318, 290, 166, -394, 235, -80, 291, + -252, -59, -158, 191, -144, -30, -336, 29, -149, 232, + -20, -33, -54, 28, -25, 124, 133, -84, 21, -31, + -171, 97, 38, -9, 110, -82, 60, 7, 22, 42, + -98, 40, 96, -19, -89, 53, -14, -61, 4, 53, + -94, -52, -92, 66, -70, 80 + }, + { + -9, 244, -442, -70, 324, -8, 5, -7, -56, -147, + 162, -246, -242, -682, 2757, 1154, 847, 55, 1, 254, + -83, 655, -392, -102, 493, 60, 629, 78, 485, -524, + 298, -575, -121, 29, -157, -236, -113, -188, 77, 168, + -203, -139, -209, -88, 136, 269, 348, 113, 39, 37, + 123, 5, 177, -50, -285, -172, 243, -35, -195, 47, + -1, -24, -33, 180, 40, 82, -59, -27, -54, -54, + 6, -83, -32, 106, 127, -22, 166, -169, -227, -51, + -110, 50, 32, 177, 28, -20, -64, -57, 83, 32, + 72, -89, -103, -27, 18, -76 + }, + { + -1016, 2298, -16, 2707, -100, 130, -347, -152, 1014, -842, + 172, 183, 188, -81, -641, 245, 1913, -373, 313, 333, + 285, -33, 187, -629, 661, 386, -135, -507, 35, -126, + 466, 615, 18, -100, 217, 476, -194, 264, 211, -116, + -36, -102, -35, -266, 625, -157, 138, 223, -172, 435, + 108, 40, 25, -144, 199, -65, 193, -3, 153, 122, + -76, 20, -53, 81, -208, -146, -129, 6, 348, 147, + -48, 11, 67, -48, 50, 135, -121, 26, -70, 107, + -120, 21, -205, -49, -27, 70, 0, 23, -83, 21, + -20, 13, 5, 13, 84, -51 + }, + { + -23, -2337, -814, -59, -271, 343, 131, 221, -62, -144, + -244, 529, -266, -814, 162, 61, 1296, -410, -708, 122, + -215, -225, -90, -660, 78, -267, 289, -457, -20, 244, + 444, 424, -190, 184, 375, -112, 296, -218, -534, -71, + 187, -62, 391, -61, 161, 168, 14, 41, -101, -28, + 266, 163, 42, -128, -52, -79, -26, -106, 175, 407, + 68, 152, -38, 216, -199, 200, -111, -28, 25, 110, + 59, 119, -38, 34, -164, -150, 9, 76, -20, -99, + -35, -27, -40, 38, -15, -110, -82, 27, 9, 16, + -7, -99, -82, -1, 41, -104 + }, + { + -1273, 1178, 560, 3198, -746, -79, 202, -357, 228, -101, + -991, 1298, -913, 135, -566, -412, 1005, -281, -191, -374, + -404, -455, -118, 279, -6, 720, -487, 31, -297, -10, + -69, -151, -210, -143, 111, 290, 106, -201, 78, -42, + -75, -15, -220, 50, -25, 42, 85, -187, 311, -69, + -138, 150, -122, 103, -65, 205, -413, 90, -365, 415, + -75, -157, -45, 40, 105, 117, -7, 40, -37, 32, + -26, 143, 15, -33, 90, -65, 32, -42, -53, 28, + 13, -57, 40, 48, -34, -8, -4, -96, -131, 53, + -120, 1, -89, 110, 55, -43 + }, + { + -226, -864, 992, -251, -133, -1333, -46, -350, 34, 633, + -445, -106, 900, 388, 885, -217, -262, -181, -515, -101, + 116, -368, 226, -994, -740, 276, -378, 196, 353, -18, + 152, 337, -155, -422, -388, 85, 5, 49, 192, 291, + -288, -80, 170, 3, 202, 236, -149, -184, -298, 345, + -14, 48, -66, -185, 150, -260, 20, 258, -177, 235, + 19, 88, -36, -50, -158, 181, -120, -197, -59, -77, + 14, -104, 87, 170, -99, 14, -1, 16, 153, -127, + -13, -5, -51, 51, -123, 124, -49, -11, 13, 73, + -35, -8, -116, 66, -62, -43 + }, + { + 705, -4176, -1818, -761, 1285, 1335, 128, 229, -143, 113, + -389, 253, 715, -397, 110, -760, -313, -1010, 129, -98, + -148, 46, -18, -945, 109, -185, 370, -55, -526, -544, + -253, -447, -169, -467, 362, 194, 709, -61, 536, -21, + -262, -511, 464, -46, 142, 212, -192, -128, 25, 21, + -464, -246, -189, 217, 63, 231, 39, -130, 137, 18, + -5, -143, 134, 72, -85, -54, -30, 78, -25, -130, + 133, -4, -58, -90, 123, -31, -6, -6, 95, -93, + 65, 11, -108, 57, -14, -83, -122, -45, -156, 71, + -46, 82, 53, -32, 59, -2 + }, + { + -78, -1429, -296, -185, -422, 338, 257, -179, 65, -96, + 641, 233, -513, -543, 177, -110, 66, 428, -239, -11, + 22, 510, -303, 130, 370, -620, 785, 883, 1185, -426, + -67, 571, 416, 422, -377, 378, -281, 543, -178, 48, + 22, 185, 58, 74, 36, -63, -212, -182, 103, -135, + 269, 194, 278, 25, -33, 309, 254, 127, 181, 96, + -51, 120, -282, 16, 27, 25, -32, -38, 44, -4, + -242, -257, -157, 209, -31, -7, 51, 19, -80, 199, + -92, 0, 10, 16, 126, -125, 142, 28, -37, -57, + -2, 26, 42, 21, 9, 20 + }, + { + -309, 4193, -324, -1006, -586, -473, -399, -187, -704, -789, + 365, 83, 851, -1057, 550, -146, 146, -80, 498, -292, + 192, -360, 26, 612, -238, 90, -457, -856, -198, 69, + -62, -573, 72, -155, 254, 416, -688, 745, -307, -262, + -62, -498, -6, 488, 651, 370, 185, 87, 82, -29, + 311, -179, -202, -113, -219, 63, -17, -1, -81, -225, + -10, 105, -257, -420, 163, 14, -268, 142, -195, 4, + 37, -57, 17, -195, -123, 77, 23, 165, 18, -107, + 99, 79, -81, -91, 36, 117, 46, 44, -26, 166, + -30, 19, -146, 59, -42, 20 + }, + { + -119, 1781, 212, 341, 438, 56, 50, -713, -338, 108, + 536, 101, -653, -238, 8182, 1292, -831, -1185, 539, 20, + -356, 793, 755, -493, -689, -880, 231, 75, 11, -76, + 157, -388, -81, -478, 719, 19, 187, 108, -452, -141, + 301, -676, -85, -79, -251, -23, 75, -172, -7, -260, + -129, 100, -226, 82, 187, -185, -59, 56, -137, 241, + -372, -300, 431, -214, -183, 7, -131, 295, -317, 128, + 10, 22, -18, -87, -38, 67, 106, -122, 116, 20, + -59, -49, -124, 118, -103, 30, -25, 19, -106, 88, + 16, -47, -121, -65, -144, -6 + }, + { + -610, 3193, 142, -597, -661, 380, 193, 215, 84, -702, + -1416, -773, -286, -1057, -2988, 146, 1973, 315, 1296, 299, + 819, -374, 618, 318, 633, 468, -205, 450, 495, 369, + 539, 677, -196, -114, 104, -77, -520, 137, -327, -602, + 145, -90, 137, -393, -165, -263, 232, -85, -315, -182, + -39, -445, 182, -398, -121, 83, 373, -142, -100, -131, + -291, -221, -6, 155, -75, 55, -65, 86, -86, -267, + -44, 93, 129, -65, -88, 162, -54, 127, -48, -192, + 109, 30, 41, -70, -26, -1, 62, 24, 16, 2, + 35, 20, -33, -85, 55, -5 + } + }, + { + { + -50, 3018, 745, -1586, -899, 321, 60, 85, -212, 284, + 719, -391, 885, -120, -642, 447, 776, 1195, 520, -939, + 306, 558, -52, -39, 86, -518, 254, -955, -32, -164, + -157, 139, 140, -139, -343, -595, 62, -137, -618, -224, + 447, 261, 153, -401, 325, -196, -238, 64, -264, 195, + 11, -66, 26, 46, -110, -77, -112, -64, 6, -374, + -96, 73, 121, 137, -124, -142, 150, -5, 353, 36, + -195, -13, 63, -18, -86, -9, 44, 80, 120, 73, + -7, -12, 60, -44, 13, 10, -70, 63, -88, 53, + 11, -24, 51, -21, -32, -2 + }, + { + -158, 5983, -86, -3447, 2984, 463, 277, -198, -255, -338, + -1126, 445, -264, -243, 161, -356, -654, -290, 463, -204, + -156, 235, -357, -164, 271, 257, 468, 472, -734, -193, + -448, -6, 276, -104, -275, -169, -100, 122, -9, -298, + -189, -475, -143, 9, 172, -300, -50, -254, 145, -522, + -122, 151, 39, 16, 27, 26, -85, 35, 17, -330, + 42, -269, -48, 197, -156, -37, -110, 148, -55, 46, + -275, 11, -14, 122, -184, 30, 109, 45, -16, 137, + -7, -23, 75, -147, 120, 0, 54, -62, -117, -33, + 103, 64, 110, 107, -42, -60 + }, + { + 71, -5166, 254, 3997, -575, 471, 124, -116, 528, -65, + 815, 1209, -246, 382, 633, 22, 439, -27, 111, 1186, + -487, 305, 477, 184, 112, 17, -302, 536, 51, 64, + -429, -230, 696, 107, 278, -166, 450, -574, 157, -295, + 219, -130, -262, 734, -83, -281, -89, -115, -75, -104, + 288, 76, 105, 13, -100, -101, 8, 164, 150, 112, + 131, 214, 1, 58, 98, 34, 94, -127, 182, -259, + -134, 13, 39, 55, 15, -149, -49, -133, 37, -57, + -89, -180, -31, 7, 49, -16, -104, 72, -68, 158, + -81, 7, 2, 85, 37, 3 + }, + { + -98, -1664, -110, -59, -228, -54, -147, -81, 181, 38, + -107, -712, 5, -496, 166, -156, -970, 2, 1109, -506, + -65, -161, -938, 171, -264, -548, -75, -288, 249, 29, + 374, 535, -120, 258, 106, -143, 187, 71, 647, 219, + -232, -2, 354, 140, -274, -296, 12, -69, 256, -279, + -120, 128, 176, -102, -33, 16, 38, 103, -119, 34, + -50, -38, 23, 106, -47, 164, -71, 172, -103, 76, + -24, -144, -30, -75, -134, 33, -103, 149, -19, 105, + 75, 72, -105, 69, -158, -23, -9, 26, -50, 33, + -3, 35, -19, -67, -63, 120 + }, + { + 782, 1007, 575, 2478, -164, 191, 41, -138, 153, 586, + 107, 471, 556, -255, 266, -311, -182, -517, 772, -382, + -99, 61, 289, -561, -475, 268, 76, 1442, 435, -414, + -120, 327, 28, 246, 393, 11, -345, -109, 128, 58, + 323, 406, -10, -19, 69, 250, -312, 187, -312, 215, + -89, 19, -439, -113, -274, 110, -91, 182, -72, 171, + 101, -39, -88, 73, -18, 43, -46, -260, -9, 67, + -141, -38, -85, 100, 277, -14, -2, -89, -69, 13, + -138, 26, 67, -58, -228, 58, 55, -21, 38, 113, + -63, 0, -15, 91, -25, 98 + }, + { + 96, 931, -193, -212, 221, -74, 72, 33, 100, 347, + 138, -667, -552, -1425, 2039, 408, 102, -358, -174, -16, + -646, 308, 719, 667, 68, 4, 400, -390, 484, -186, + 709, 141, 350, 214, -67, -50, 249, -135, -139, -293, + -187, 201, -197, -127, 24, -12, 238, 28, -121, -125, + 63, -67, 40, 12, -70, -250, -17, -72, -13, 181, + -85, -144, -147, 137, -41, 101, 42, 49, -25, 47, + 64, 114, -71, -143, 21, -82, 258, -20, -102, -85, + -183, 166, 5, 98, 4, -101, -79, -6, 19, -74, + 58, -12, 16, 37, 40, -18 + }, + { + 683, 4093, 37, 3279, -85, 262, -64, -561, 585, 153, + -106, -575, 869, 767, -3, 740, 2066, -591, 86, 0, + 116, 126, 615, 149, 389, 41, -186, -290, 171, -201, + 275, 416, -190, -486, -58, 84, -407, 228, 292, -110, + 120, -1, -171, -302, 231, -389, -180, -236, -339, 75, + -93, 33, 53, -1, 287, -57, 136, 81, 129, -31, + 16, 158, -101, 160, 43, 68, -74, -135, 187, 172, + 44, 143, 146, -31, 26, 64, -36, 216, -97, 20, + -190, 134, -60, 0, 11, 71, 73, 75, -160, -33, + 92, 29, -15, -5, 59, -99 + }, + { + 203, -144, 502, 901, 229, 166, 232, 123, -318, -17, + -309, 59, -118, 122, 924, 265, 620, -676, -431, 464, + -1, -58, -121, -417, -103, -939, -98, -485, -149, -16, + -392, -330, -97, 243, 351, -337, -121, -567, -455, 165, + -67, 54, 489, 10, 157, -27, 51, 164, 25, 95, + 124, 209, 146, -130, 210, 56, 0, -22, -46, 69, + -171, 173, -198, 198, -204, 110, -4, -164, -62, -30, + -169, 10, -151, 19, -44, -89, 64, 267, 93, 5, + 89, -76, -141, 39, 42, -28, -6, 111, 19, 43, + 61, -35, -26, 6, 89, -123 + }, + { + 1177, 4020, 665, 4348, -340, -8, -72, -1126, -291, 84, + -1642, 515, -767, 45, -1594, -725, 1306, -809, -573, -395, + -541, -634, -109, 202, -133, 656, -211, 418, -26, -71, + -160, -620, -838, -327, -315, -148, 73, 29, 362, 279, + -145, 14, -258, 93, 20, 144, 282, -284, 70, -1, + -185, -48, -230, 18, -211, 167, -438, 189, -109, 452, + -148, -242, -191, -205, -269, -52, 162, 132, 123, 209, + -55, 43, -27, -180, 86, -159, -153, 42, 97, -7, + 62, 43, 154, 24, -161, -28, 34, -59, -99, 28, + -63, 56, -125, 60, 38, -39 + }, + { + 132, -1504, 223, -146, -292, -6, 1292, -1042, -953, 975, + -34, -444, 10, -872, 346, 73, -6, -493, 181, 498, + 301, -161, -2, -741, -788, 209, -90, 12, 284, 361, + -51, 399, 585, 46, -557, 20, 360, -34, 161, 1011, + 273, 64, 143, -419, -233, 232, -129, 100, -354, 139, + 171, 91, -19, -381, -137, -419, 0, 374, -216, 210, + 66, 32, -142, -177, -52, 203, -121, -89, 189, 71, + -12, -145, 50, 65, 60, 64, -107, 129, 371, 61, + -53, -55, -15, 133, -75, 56, -50, 20, -25, 91, + 0, -17, -52, 125, -56, -18 + }, + { + -683, -5403, -1093, -319, 899, 394, -45, 339, 430, -228, + -277, 403, 1395, 731, 538, -909, 228, -339, 483, -9, + -161, 161, 323, -345, 568, -697, 239, 187, 169, 313, + 549, 249, -257, -578, 22, -840, -31, -60, 521, 216, + 297, -126, 375, -84, -49, -137, -351, -266, -130, -124, + -6, 144, -211, -92, -66, 295, 47, -204, 96, 3, + 211, -66, -73, -130, -168, -99, 48, 115, -14, -85, + 95, -57, -164, -23, 265, 15, -33, -1, 129, -53, + -22, -94, -180, -6, 22, 136, -47, -72, -108, 87, + -57, 91, 38, -77, -25, -62 + }, + { + -23, -1538, -146, 144, -577, -245, -250, -42, -16, -22, + 184, -95, 419, 995, 445, -154, 543, 834, -629, -388, + -322, 194, -340, 349, 1045, -38, 245, -419, 358, -549, + -558, 52, -131, 270, -484, -195, -236, 962, -70, -68, + -77, 74, 71, 242, 69, 440, 167, -444, -275, -126, + 115, -255, -98, -101, 108, 216, -174, -263, -47, -13, + 49, 86, -289, 99, 150, 175, -77, -123, 201, -33, + -184, -74, -133, 286, -39, -5, 80, -75, -168, 148, + -151, 56, -16, -112, 101, -160, 112, 89, -9, -11, + 32, 0, -33, -67, -50, 5 + }, + { + -504, 2962, -798, 199, -236, 651, 502, 321, 100, -809, + 121, -385, -336, -1382, 827, -582, -176, 299, -258, 146, + 1101, -215, 302, 157, -139, 836, -257, -270, 459, 34, + 95, -101, 696, 136, -186, 17, -384, 782, 64, 258, + 264, -323, -52, -69, 57, -75, -131, -96, -287, -318, + -31, -126, 272, 127, -112, 358, 61, -60, -153, -164, + -77, -44, -14, -144, 119, 76, -193, -99, -342, -79, + -76, -108, -7, -63, -22, 132, 87, 161, 10, -76, + 102, 75, -28, 33, 68, 98, -46, -56, -162, 111, + -15, 90, -107, 37, -64, 51 + }, + { + 123, 1395, -441, 119, -88, 57, 572, 111, 300, 12, + 300, 35, -483, -1746, 4931, 853, 580, -124, 951, 906, + -789, -216, 288, -862, -915, -264, 212, -676, -99, -234, + 47, 107, 90, -337, 430, -303, 277, 226, -241, -116, + 178, -327, -3, -156, -136, 78, 269, -100, -56, -126, + 32, 175, -550, -644, -109, -105, -13, 93, -137, 169, + 29, -218, 142, -3, 137, 13, -328, 143, -221, 250, + 3, -171, -121, -35, -125, -23, 0, -138, 80, -11, + 85, 29, -46, 191, -164, 13, -32, 122, 34, 34, + -17, -26, -93, 31, -129, 14 + }, + { + 70, 3723, -473, -1499, -735, 1472, 862, 395, 49, -119, + -855, -250, 34, 1081, -86, 555, 1651, 156, 899, 264, + 713, -793, 778, 235, -196, 166, -26, 742, 694, -453, + -361, -105, -347, -59, 266, 82, 64, 326, -389, -228, + 561, 266, 526, -438, -78, -204, 112, 36, 178, 27, + 23, -355, 124, -219, 102, 217, 385, -76, -175, -221, + -176, -37, 98, 61, -31, 43, -118, -44, -41, -134, + 12, -15, 129, 263, 56, 43, -234, 65, 74, -186, + 18, -17, 35, -26, 22, 11, -49, -15, -2, -85, + 78, 18, -43, 21, 155, 43 + } + }, + { + { + -60, 3164, 643, -2435, 381, 91, -182, 386, -171, 334, + 523, 173, 127, 263, -573, 656, 1057, 1043, 342, -810, + 498, 105, 380, 541, -709, 211, -788, -101, -226, 85, + -391, -370, 312, 97, -726, -319, 266, 20, -674, -115, + -26, 271, 432, -414, 182, -127, -152, 228, -216, -121, + 117, 87, -243, -67, 296, -54, -306, -47, -219, -332, + 142, 0, 79, 10, 33, 147, -155, 226, -27, 116, + -115, 27, 178, -69, -83, -17, 67, -82, 88, 141, + 8, 162, -97, -27, 51, -79, -100, -26, 48, 38, + -51, 6, -12, 95, -73, -38 + }, + { + -2, 7719, -1187, 190, -1434, 1026, 775, -1249, 230, 138, + -629, -1218, 431, -429, 244, -329, -617, -178, -400, 204, + 469, -500, -117, -132, 311, 310, 93, 450, -132, -600, + -283, 70, 105, 42, -237, -13, 11, -109, -164, -228, + -254, -610, -91, 2, -1, 258, -505, -131, -269, 82, + -288, -27, 142, -86, 52, -1, 2, 313, -337, -154, + -109, -13, -26, 27, -148, 52, -329, 197, 110, -95, + -277, 69, 63, -79, 19, -151, 151, 125, 16, -10, + 61, 13, -12, -65, 100, 33, 29, 9, -170, -10, + 83, -1, 178, -18, 0, 38 + }, + { + 165, -6245, 1029, 3117, 70, 298, 411, 591, 66, 122, + 24, 1539, 516, 86, 735, -68, 102, 87, 767, 253, + -185, 692, -103, 414, -14, 8, 102, 76, -118, 142, + -54, -200, 856, -3, -165, 671, -453, -417, 344, -326, + -253, 227, -289, 421, 101, -364, -84, -60, -262, 280, + -31, 217, 211, -198, -281, -323, 222, 216, 104, 226, + 153, -21, 219, -38, 6, -91, 365, -144, 74, -178, + -75, -156, 21, 8, -65, -36, -161, 49, -51, -208, + -78, -26, -74, 42, 5, -104, 4, 12, 95, 13, + -11, 14, 9, 99, -51, -7 + }, + { + 117, -1715, -337, -334, 58, -90, -295, 230, 142, -7, + -24, -807, -68, 153, -602, 285, -977, 65, 557, -169, + 128, -72, -1153, 194, -295, -728, 329, -338, -390, 513, + 534, 418, -268, 475, -492, 815, 1, 210, -77, 638, + -660, 327, 211, 121, -178, -284, -12, -11, 323, -199, + -296, 177, 64, -36, 49, 58, 6, 63, 7, 152, + -15, -128, -149, 220, -203, 114, 36, 18, 177, 79, + -33, -223, 24, -135, -33, -49, 91, 41, 5, 92, + 72, -29, 61, 89, -198, 4, -41, 60, -30, 2, + 3, 83, -33, -91, 15, 55 + }, + { + -419, 2494, 3, 2938, 227, 57, 330, -156, 256, 621, + 107, 93, 397, -124, -103, 81, -259, -351, 379, -21, + -663, 669, -279, -991, -365, 585, -79, 1150, 634, -91, + 211, -301, 260, -78, 636, -62, -2, -414, -106, 321, + 365, 179, 78, 112, -274, 174, 199, -40, -482, 249, + 212, -191, -445, -323, 147, -77, 103, 120, 9, -66, + 121, 35, 118, 84, -178, -7, 33, -259, -111, 81, + -35, -50, -160, 120, 174, 204, -153, -27, -153, 73, + -135, 65, 1, 6, -174, 13, 12, 113, -23, 102, + -23, -89, 20, 51, 79, 33 + }, + { + 1, 490, 656, 67, -237, -33, 21, 126, 203, 127, + 249, -815, -529, -1093, 1954, 325, 222, -862, -168, -527, + -304, 230, 814, 845, -101, 140, -151, -189, -317, 472, + 264, 329, 69, 99, 163, 50, 256, 68, -136, -319, + -63, 10, -305, 93, 141, -192, 78, 33, -139, 50, + -58, 54, -135, 204, -62, -131, -366, -70, 132, 215, + -250, 45, -155, -30, 51, 8, 108, 70, -20, 110, + 19, 111, 17, -46, -101, -24, 183, -44, 5, -150, + -90, 83, -51, 118, -6, -90, -26, -56, -27, -91, + 48, 40, 28, 61, 14, 6 + }, + { + 34, 4915, -292, 3853, -281, -102, 320, 87, -561, 823, + -137, -684, 1089, 69, 980, 726, 1004, -468, 144, 539, + -571, 671, 105, 1360, -409, -164, -386, -273, 99, -88, + 58, 359, -340, -334, -184, -357, 159, 99, 46, 136, + 133, 83, -172, -7, -123, -444, -272, -32, -251, 41, + -242, -276, 494, 48, -6, 106, 142, 66, 157, -114, + 87, 313, -165, 103, 169, -108, 79, -39, -60, 128, + 130, 54, 90, 33, 90, 17, 20, 151, -99, -31, + -33, 33, 114, -94, 72, -30, 141, 13, -136, -25, + 67, -27, 49, 32, -32, -52 + }, + { + -26, 2071, -366, 502, 606, -79, 292, 129, -420, -270, + 442, -182, -326, 491, 1173, 525, -565, -611, 21, 999, + -140, 212, -762, -21, 224, -1185, -506, -254, -599, 782, + -1200, -533, 522, -50, 743, -169, -985, -108, 220, 91, + -352, 305, 136, 462, -275, -79, 162, 196, 165, 383, + -490, 338, 108, -106, 173, 167, -163, 52, -39, 20, + -14, -137, -29, 259, -233, -2, 60, -68, -134, -89, + -157, 29, -203, 4, -56, -68, 71, 233, 147, 37, + 94, -36, -134, 47, -2, -63, 58, 90, 48, -20, + 25, 96, -19, -62, 117, -97 + }, + { + -637, 6839, -137, 4761, -278, -575, -30, -752, -135, 120, + -858, -357, 523, -897, -944, -143, 332, -584, -494, -561, + -556, -206, -269, -273, 210, 155, 238, 254, 110, -201, + -188, -410, -862, -52, -821, -99, 183, 506, -229, 281, + 7, -267, -187, 299, -141, 324, 75, -255, -168, 104, + 110, -357, -273, 24, 88, -219, -131, -36, 218, 72, + 20, -120, -69, -308, -370, -218, 256, 101, 228, 48, + 25, 39, -14, -348, 148, -74, -281, 33, 163, 6, + 15, 105, 179, -71, -133, -36, -2, 14, -89, -18, + 33, -45, -29, -35, 47, -4 + }, + { + -94, -2157, 38, 361, -377, 772, 457, -966, -719, 730, + 135, -347, -53, -295, -307, -354, 428, -121, 133, 616, + 299, 131, -638, -227, -265, -312, 66, -75, 28, 862, + -507, 237, 1016, 149, -819, 86, 485, -34, -104, 969, + 772, -162, 12, -480, -51, 135, 109, -117, -29, -284, + 174, 93, -172, -179, -59, -584, 36, -33, 96, -28, + 59, 3, -117, -185, 137, -51, -65, 29, 149, 45, + -48, -46, 152, -1, -8, 129, -145, 68, 247, 293, + -87, -53, -40, 150, -101, -31, 70, -16, -46, 39, + 36, -111, 102, 19, 25, -51 + }, + { + 572, -8434, 693, -127, 682, -1866, 2675, -132, 179, -1, + -41, -233, 1469, 296, 787, -847, 852, 52, 225, -399, + -12, -193, 381, 173, 262, -374, 380, -409, 531, 817, + 5, 366, 83, -616, -441, -155, -476, 121, 276, 46, + 519, 315, -117, 7, 157, -331, -290, -395, 153, -340, + 168, 82, 33, -285, 64, 149, -44, -48, 16, -177, + 296, 81, -176, -229, -93, 64, -90, 142, -22, -8, + -47, -5, -133, 44, 110, 74, -65, 27, 93, 53, + -165, 2, -90, -133, 17, 147, -87, -73, -6, -28, + 63, 20, 37, 42, -111, -30 + }, + { + 65, -2110, 23, 254, -274, -67, -745, 224, -67, 180, + -1012, 396, 361, 836, 1051, -479, 545, 927, -1192, -264, + -130, -6, -181, 84, 1122, 24, 653, -125, -615, -298, + -481, -345, -673, 618, -35, -368, -14, 324, 147, -166, + -157, -51, 288, 274, -44, 360, 26, -363, -91, 18, + -142, -206, -186, -20, 83, 353, -424, -1, -86, -159, + 30, 20, -35, 113, -41, 121, 17, -115, 143, -66, + -49, -12, -106, 178, 59, 46, -75, -61, -72, -20, + -143, 203, -43, -158, 58, -81, 46, 96, 41, -78, + 40, 49, -39, -105, -43, 93 + }, + { + 1134, 156, -612, 772, -318, 1564, -377, 782, -116, 303, + -1163, 584, -1279, -842, 2, -352, -21, 718, -379, 264, + 618, -35, 512, 174, 122, 468, -275, -114, 214, 77, + 422, -710, 800, 145, -229, 53, 304, -45, 380, 108, + 490, -10, -150, -275, -203, 76, -117, 11, -589, -76, + -282, -110, 286, 240, -184, 282, -41, -143, -47, -100, + -184, -82, 41, 33, -137, 113, 122, -298, -327, -120, + -172, 3, 4, -62, -26, 83, 162, 123, -95, 19, + 141, 83, -34, 83, 33, 13, -24, -12, -168, 84, + -6, 28, -66, 47, -44, 30 + }, + { + -189, 1681, -337, -23, -386, 352, 677, 165, 415, 138, + 23, -195, 270, 3283, -2250, -23, 854, 1004, 285, 767, + -397, -460, -179, -596, -1069, -235, -215, -389, -268, 220, + 61, 556, 2, -98, -241, 9, 171, 257, -177, 122, + -69, 62, -25, -240, 109, 102, -242, 87, -207, 266, + 74, -9, -349, -587, -447, 139, -106, -63, 216, -96, + 200, -40, -258, 243, 295, 12, -273, -32, 184, -17, + -44, -100, -209, 54, -189, -13, -84, 104, -115, -19, + 119, -23, 87, 73, -43, -42, -44, 71, 130, 28, + -102, 66, -87, 35, -1, -84 + }, + { + 582, 2792, -194, -1869, 154, 1217, 809, 267, -325, 328, + -222, -62, -1040, 233, 2792, 447, 253, 1019, -75, 611, + 67, 8, 313, 135, -497, 436, 686, 180, 166, -746, + 180, -713, 84, -110, 301, -450, 461, 35, 203, -132, + 408, -12, 807, -118, -224, -196, -313, 143, 182, 172, + -208, -107, -319, 342, -38, 236, 217, 50, -137, -244, + -152, 16, 246, 49, -306, 50, -3, -133, -55, 57, + 50, 35, 27, 237, 36, -50, -105, 20, -2, -120, + 87, -38, -53, 0, 29, 31, -95, -20, 94, -191, + 97, 79, -31, 51, 61, 54 + } + }, + { + { + 120, 2314, -277, -550, 1588, -32, -394, -198, -555, 243, + 7, -479, -121, 592, 14, 590, -232, -421, 110, -110, + 1009, 33, -242, 523, -712, 190, -697, 426, 7, 128, + -597, -627, 201, 71, -227, -193, -36, 409, 42, 93, + -185, 403, 558, -251, 175, 123, 408, 430, -170, -150, + 173, 195, -181, -42, 345, 88, -336, -30, -6, 94, + 197, -150, 7, -88, -50, 29, -195, 206, -46, 69, + -87, 119, 209, 2, -81, -53, -26, -131, 13, 132, + 4, 197, -90, 53, -19, -116, -42, -22, 87, 73, + -7, 48, -38, 39, -44, 31 + }, + { + 125, 11619, 1219, 3285, 596, 436, 962, -4, 820, 609, + -241, -2205, -174, -302, 714, 279, -624, -525, -258, 120, + 132, -152, 190, -269, 101, 153, -69, 215, 473, 37, + 13, 115, 246, 534, 49, -246, -339, -134, 119, 201, + 22, -309, 331, 40, -175, 158, -289, 136, 165, 453, + -172, -46, -77, -404, -208, 127, 79, 169, -310, 72, + -257, -29, 119, -52, -22, 253, -258, 71, 72, 79, + -126, 21, 102, -47, 111, -220, 29, 64, -58, 13, + 20, -95, -11, 34, 81, 116, 88, 31, -82, -49, + 54, 0, 104, -23, 86, 38 + }, + { + -339, -6861, 753, 37, -1856, 416, 481, 492, -171, -251, + 52, 2095, 591, -22, 843, -66, -38, 158, 949, -506, + -562, 715, -192, 412, -556, -428, 34, 163, 214, 224, + 201, -176, 539, -241, 174, 740, -924, -465, 312, -306, + -518, 27, -175, 242, -33, -74, 173, -166, -488, 326, + 154, 102, -25, -282, -85, -278, 74, 115, -26, 246, + 88, -289, 35, -229, -125, -263, 316, -135, 21, -18, + -42, -211, -136, -176, -127, 4, -64, 151, -82, -142, + 151, 108, 25, 77, -18, -32, 95, -6, 81, -5, + 64, 80, -29, 19, 4, 47 + }, + { + -106, -768, 831, -442, -94, 45, -47, 378, 88, -95, + 310, 124, 442, 127, -941, 616, -20, 435, 524, 12, + -10, -35, -732, 252, -507, -624, 757, 288, -116, 547, + 335, -147, -313, 394, -306, 1087, 342, 44, -808, 526, + -385, 297, -123, -65, 38, -233, -6, 4, 235, 34, + 83, 124, -82, 76, -94, -229, -69, 79, -40, 199, + 252, 85, -97, 132, -311, 100, 149, 31, 193, 73, + 90, 138, 191, -259, -66, -13, 131, 17, -76, 109, + 162, 16, 36, 86, -59, 83, -1, 174, 23, 15, + 33, -34, -41, 51, 84, -35 + }, + { + -239, 2057, -113, 2918, -227, 42, 615, -55, -233, -560, + -1413, -548, 508, 108, 623, 866, 237, -784, -1031, -737, + -1095, 390, -422, -937, -115, 765, -545, 128, 124, 440, + 396, -494, 149, -388, 575, 154, 196, -525, -642, -5, + -63, -81, -63, 319, -123, 61, 629, 257, -384, 156, + 39, -351, -279, 81, 389, 69, 47, 0, 48, -171, + 34, 257, 296, -54, -328, 114, 57, 13, 61, 117, + 68, 73, -78, 11, 21, 189, -109, 16, -167, 13, + -103, 51, -8, 78, 4, 82, -77, -19, -105, 65, + 19, -6, 74, 39, 24, -39 + }, + { + -84, -977, 21, 435, -179, -114, -28, -85, -84, -159, + 251, -467, -84, 58, 2875, 155, -250, -511, -481, -711, + 452, 505, -230, 20, -61, 143, -642, -258, 230, 418, + -637, -757, -451, 12, 275, 410, 101, -165, 12, 61, + -373, -337, 34, 134, 191, -224, -106, 101, -113, 236, + -35, -17, -97, 367, 12, 17, -150, -11, 117, 279, + -111, 144, -88, -282, -74, 40, 84, -37, 50, 257, + 9, -48, -3, 69, -38, 44, 71, -209, 46, 32, + -2, -32, -196, 71, 7, -90, 65, -52, -110, -115, + 47, 90, -6, -54, -66, -18 + }, + { + -1033, 3799, 251, 3784, -473, -128, 802, 950, -454, -5, + -47, -73, 1037, -152, 767, -46, 24, -1040, -157, 157, + -504, 1050, -143, 372, -701, 36, -590, -590, -76, 160, + -453, -314, -287, 103, 277, -267, 172, 237, 141, -3, + 30, 371, -10, 44, 101, -229, 45, 92, -411, 145, + 63, -273, 486, -71, -166, 157, 150, 59, 165, -178, + -4, 92, -256, 33, -128, -209, 218, 141, -28, 56, + 67, -50, -69, -6, 89, -70, -61, 43, -11, -37, + -84, 15, 128, -13, 149, -144, 14, -13, -52, 76, + 46, 24, 90, -15, 10, 6 + }, + { + -166, 1069, -766, -237, 34, -106, 175, 16, -392, -12, + 747, 122, 6, 508, 1076, 27, -777, -173, 369, 1070, + -362, -154, -655, 415, 569, -1078, -933, -3, 80, 299, + -1219, 350, 876, -59, 581, 220, -485, 579, 432, 94, + 57, 216, -339, 168, -349, 62, 292, 131, 236, 286, + -535, 194, -248, -296, -24, 30, -170, 50, 142, 212, + 111, -86, -127, 250, -47, 155, 46, -70, -9, 15, + -171, 6, -257, -53, -21, -50, -56, 74, 128, 57, + 139, 72, -67, -36, -83, -50, -11, -26, 72, -3, + 36, 17, -50, -36, 88, -54 + }, + { + -381, 7997, 507, 3949, -715, -151, 673, 466, 778, -249, + -311, 419, 1111, 423, 343, -195, 507, 445, -150, -54, + 202, -74, -565, -391, 495, 149, 180, 212, 91, -292, + -66, 340, -50, 335, -423, 215, -13, 324, -533, -282, + -253, -155, -111, 105, -117, -42, -365, -86, -373, -590, + -203, -351, -205, -134, 23, -98, 95, 108, 367, -21, + -127, -34, 8, -309, -222, -224, 69, -115, 6, -146, + -19, 53, 11, -345, 68, -23, -188, 40, 102, 110, + 126, -4, 124, 37, -82, 51, 33, -47, -123, -36, + 61, 28, 54, -84, 16, 57 + }, + { + 97, -3357, -1747, -45, -349, -337, -475, 25, 255, 1073, + 478, 629, 955, 199, -481, -250, 265, -420, -10, 382, + 501, 593, -440, -132, 442, -130, 300, 23, 67, 612, + -802, 478, 622, -395, -465, 39, -316, -620, -320, 290, + 342, -190, 155, 18, 131, -26, 28, -142, 368, -211, + -227, -320, -273, 78, 114, -293, 19, -132, 143, -147, + -72, -102, 58, -84, 20, 34, 3, 19, 2, -25, + 7, 31, 157, -113, -151, 68, -89, 56, 52, 213, + -76, 74, 38, 30, -200, -128, 39, -37, -131, -103, + 6, -126, 7, 0, 43, -51 + }, + { + -365, -8529, 2759, -86, -333, -3021, 1970, -9, 386, 611, + 118, -421, 428, -1128, 282, -451, 1186, 1090, 638, -609, + 50, -110, 255, -116, 37, -229, -98, -662, 91, 500, + -80, -40, 184, -473, -237, 444, -233, -90, 267, 118, + 278, 218, -35, 158, 116, -255, -50, -479, 167, -111, + 172, -255, -129, -79, 216, -101, -206, -231, -51, -130, + 71, -108, -171, -48, 64, 221, 40, 7, -14, 89, + -55, 6, 12, 6, -37, 21, -150, -29, 80, 179, + -82, 3, 10, -81, 0, 36, -105, -78, 25, 35, + 1, -132, 1, 126, -26, -31 + }, + { + -81, -2390, 295, 746, 272, 182, -592, 373, -115, 107, + -882, 114, -687, -465, 1086, -939, -272, 341, -1513, 15, + 348, 43, -688, -551, 366, 231, 933, -196, -265, 79, + -236, -162, -498, 820, 65, -336, -494, -913, -582, 38, + 526, 76, -370, -116, -79, -25, -95, -131, 55, 159, + -138, -161, -39, -3, 88, 297, -269, 484, 350, -15, + -242, 79, 83, 117, -88, 55, 155, 26, -13, -73, + -34, -38, -136, 10, 64, 159, -152, -61, -3, -83, + -143, 117, 8, -119, 0, 40, -42, 47, 62, -41, + 63, 13, 10, -15, 12, 84 + }, + { + -1285, -2680, -314, 819, -352, 783, -1178, 719, 698, 507, + -2008, 801, -32, -142, -278, 423, 680, 213, -674, -241, + -287, 7, 93, 365, 297, -595, -717, -466, -802, -179, + 713, -1208, 224, 421, 168, 261, 409, -308, -229, -370, + 661, 555, 13, -73, -79, 353, 228, 266, -490, -209, + -286, -303, -89, -131, -573, -284, -314, 40, -21, 25, + 100, 88, 206, 55, -202, 197, 329, -173, -328, -115, + -114, 150, -38, -167, -55, 42, 166, 15, -64, 111, + 114, 147, 46, -15, -97, -18, 19, 38, -192, 38, + 6, 45, -1, 5, -126, -94 + }, + { + 253, 2619, -224, -108, -99, 418, 406, -86, 180, 183, + -332, -173, 475, 1248, -4090, -272, -78, 834, -775, -584, + -44, -21, -225, -372, -746, -85, -405, 185, -385, 163, + 376, 803, 142, -104, -19, 743, 364, 89, 57, 99, + -278, -120, -244, 118, 177, 67, -143, 178, -149, 289, + -9, -142, 287, 37, -291, 288, -110, 144, 229, -319, + 30, -57, -46, 460, 212, 89, 95, 166, 297, -113, + 19, 226, -37, -22, -307, 110, 60, 51, -260, -66, + 39, -3, 76, -57, 34, 137, 125, -32, 109, 136, + -209, 71, 26, 98, 88, -77 + }, + { + -1134, 1232, 1420, -1197, 121, 367, 131, 214, -540, 232, + 491, 3, -1050, 354, 2677, 229, -274, -183, -1226, -59, + -487, 507, 607, -169, -621, 433, 73, -644, -370, -718, + 29, -736, 482, 225, 203, -424, 231, -16, 347, -406, + 57, -268, 503, -132, -366, -301, -486, -295, -416, -131, + 19, 93, -501, 480, -28, -172, -59, 166, -51, -358, + -98, 216, 273, 106, -49, 123, -46, -5, 23, 92, + -66, -46, -94, 49, -39, -108, -114, 82, -30, -134, + 137, 20, -95, -28, 17, 21, -19, 1, 100, -76, + 132, 93, 26, 33, 32, 46 + } + }, + { + { + -73, 481, 1007, 1726, -841, 155, -342, -156, -384, 154, + -295, -608, -159, 510, 799, 125, -1499, -344, 828, -124, + 639, -43, 83, 435, -642, 363, -1095, 716, -179, 35, + -114, -808, 251, -10, -125, -131, -244, -36, 466, 78, + -195, 536, 292, 46, -153, 83, 922, 198, -413, -39, + 133, 452, -285, 281, 370, -51, -304, 113, -119, 161, + 30, 78, -20, -234, -31, -79, -50, 77, 110, 152, + -59, 121, -133, 251, -131, 18, -61, 70, -175, 127, + 58, 101, 66, 44, -145, -76, 34, 6, 46, 75, + 68, 18, -4, -63, 8, 62 + }, + { + -211, 15223, 133, 4329, -687, 378, 529, 551, 540, -118, + 212, -1576, -589, -91, -31, 654, -15, -561, 121, -134, + -128, -106, 259, 4, -26, -468, 84, 245, 782, -105, + 51, 435, -212, 509, 358, -299, -105, -82, 81, 29, + 133, -55, 503, -349, -28, -361, -16, 309, 356, 128, + -48, -17, -19, -596, 1, 350, -313, -5, -112, 24, + -65, -76, 111, -34, 147, 58, 33, -100, 17, 115, + -119, 3, 99, 38, 55, -11, -50, -62, -113, 14, + 117, -83, -49, 39, 62, 115, 122, -63, 0, -31, + 52, 98, 63, -49, 57, -16 + }, + { + 425, -5849, -1185, -2370, 923, -220, 646, 46, 213, -667, + 113, 1599, 580, 206, 127, 593, -221, 514, -214, 375, + -480, 78, 105, 348, -253, -436, -469, -87, 715, -257, + 529, 231, 107, -341, 601, -240, -120, -436, -193, 1, + -400, -173, 123, 40, 121, 95, 75, -142, -419, -15, + 643, -147, -39, -227, 31, 45, -64, -36, -45, 310, + 72, -320, -122, -206, -136, -71, 147, -142, -115, 72, + -46, -223, -193, 34, -75, 42, 6, -7, -4, -151, + 128, 110, 123, 0, -9, 14, 76, -45, 124, 45, + 90, -11, -31, -64, 114, 70 + }, + { + 134, 213, -114, -239, -135, -78, 198, 164, 145, 237, + -238, 458, 291, 383, -1022, -522, 841, 1332, 437, -355, + -68, 190, -429, -796, 255, 486, 72, -132, 87, 222, + 442, -717, 503, -327, -124, 533, 1043, -61, -158, -98, + 312, -101, -468, -102, 115, -36, 1, -27, 343, -45, + 66, -230, 200, 288, -271, -92, -159, -82, 119, 97, + 203, 66, 63, 72, -78, -14, 162, -137, 223, 152, + -40, 215, 73, -32, -165, 115, -6, -41, 31, 33, + 105, -14, 53, 25, 25, 19, 114, 162, -41, 35, + 138, -44, -71, 46, 56, -96 + }, + { + 994, -259, -269, 2753, 414, -58, 149, 218, -587, -236, + -1700, -629, 1285, -296, 1044, 575, 10, -915, -951, -1174, + -343, -231, -936, 116, -408, 599, -705, -57, 322, 665, + 4, -23, -146, -355, 123, 635, -650, 617, -803, -166, + -227, -26, -100, 271, 260, -280, 526, 236, -252, 96, + -90, -341, 54, 70, 227, 96, -93, 87, 11, 128, + -456, 266, 266, 112, -345, 373, -274, 157, 140, 63, + -88, 110, 123, -20, 46, -48, -64, -63, 36, -123, + 26, 14, 101, -159, 184, 98, -47, -129, -124, 73, + 13, -51, 88, 92, -70, -5 + }, + { + -6, -1557, 104, 378, -30, -114, -61, -78, 2, -175, + -68, -227, 181, 653, 1617, 145, 50, -264, -377, -229, + 586, 252, -407, -54, -293, 72, -235, -918, 784, 196, + -340, -220, -665, -184, 136, 655, -242, -309, 244, 19, + -483, -244, 73, 227, -52, 170, -267, 81, -115, 89, + 86, 7, 187, 208, -177, -120, 153, 2, 279, 28, + 76, -21, -57, -290, -23, -17, 80, -206, 281, 68, + -80, 99, 29, 88, 1, -54, 107, -149, 65, -47, + -6, -28, -195, 52, -15, -63, -11, -16, 9, -79, + -33, 51, 41, -121, -28, -25 + }, + { + 1994, -865, 444, 3147, 492, -191, 423, 612, 529, -581, + 794, -135, 843, 246, 470, -354, -730, -1009, 187, 292, + 35, 57, 397, -580, 187, 258, -357, -854, 122, -202, + -200, -355, 78, 69, 265, -182, 45, 211, 42, -72, + 240, 103, 141, 254, -35, -344, 665, -190, -472, 50, + 171, -263, 297, -53, -21, 40, 182, -30, 167, -65, + -113, 65, -410, 257, -261, -22, -77, 256, 11, 4, + 91, -36, -72, -68, -5, -37, 23, -6, -24, 26, + -25, -55, 28, 109, 19, -129, -25, 5, 28, 165, + -27, 61, 24, 11, -7, 55 + }, + { + 49, -922, 298, -340, -245, 97, -64, 62, -328, 114, + 481, 293, 707, 550, 6, -537, -151, -295, -46, 1059, + -161, -609, -207, 16, 543, -1202, -799, 311, 767, -393, + -1102, 939, 49, 252, 417, 22, -591, 1049, 102, 14, + 528, -366, 340, -395, -133, 117, 257, 48, 158, 353, + -269, -130, -162, -236, -69, -19, -216, 166, 67, 288, + 69, -1, -64, 152, 190, 134, 41, -83, 22, -9, + -358, 31, -49, -161, 26, 21, -54, -27, 105, 94, + -5, 75, 57, -153, -19, 10, -34, -101, 47, 14, + 47, -99, 37, 77, -49, -30 + }, + { + 1739, 6214, -809, 3658, 965, -614, 481, 466, 1339, -629, + 714, -192, -123, 853, 814, -178, 591, 147, -243, 283, + 410, 122, -519, -282, 816, 161, -210, 43, 73, -102, + 423, 226, -109, 309, -47, 38, -193, 242, -17, -706, + -589, 86, 267, -66, -451, -47, -175, -238, -111, -666, + -342, -240, 172, -494, -208, 5, 34, 166, 139, -51, + 58, -23, 154, -284, -333, 6, -235, -98, -27, -190, + 165, 23, 29, -229, -144, -1, 3, -109, 72, 193, + 255, -61, -28, 253, -150, 42, -40, -94, -20, -61, + 26, 46, 53, -62, -9, 73 + }, + { + -37, -3271, -1460, -344, 199, -1033, -595, -138, 669, 673, + -151, 1496, 720, 767, -625, -384, -501, 338, 328, -465, + 1255, -136, 306, -627, 862, -139, -93, 111, 485, 281, + -775, 207, 1016, -707, -300, 294, -1087, -142, 78, -407, + 101, 95, -98, 239, 296, -62, -78, -37, 574, -286, + -413, -364, -267, 634, -278, 130, -36, -35, -108, -77, + 18, -98, -53, 183, -148, 127, -147, 31, -87, 128, + 48, -20, -91, 125, -202, -78, 139, 52, 38, 120, + 2, -37, 17, 25, -145, -84, -15, -53, -160, -166, + 33, -36, -30, -86, 49, 37 + }, + { + 124, -8813, 2357, -116, -1029, 557, -968, 497, 120, 148, + -189, 704, -539, -433, -84, -384, 565, 1699, -327, 67, + 186, 505, -271, -83, -661, 301, -250, -377, -650, 316, + 527, -628, 230, -361, -127, 389, 114, -357, 301, 379, + 26, -33, 159, 266, -180, -136, 4, -286, -25, -83, + -124, -236, -21, -207, 263, -101, -180, -268, -17, 136, + -285, -208, 96, -3, 52, 184, 122, -224, 106, 43, + 120, -123, 194, -157, 52, 54, -142, -48, -1, 132, + 11, 0, -27, -6, 50, -83, 9, -75, -80, 82, + 3, -122, 77, -26, 35, -55 + }, + { + 136, -1753, -203, 125, 839, 167, -282, -3, 87, -313, + 40, -537, -479, -1216, 1055, -484, 148, 197, -1604, -432, + 684, -275, -840, 282, -40, -84, 1470, -348, -158, 441, + -625, 94, -414, 766, -65, -558, -116, -636, -868, 11, + 785, 50, -240, -378, 4, -221, -466, 316, -127, 119, + -26, -44, 96, -169, 36, -53, 102, 533, 359, 158, + -337, 218, -101, 349, -145, -17, 212, -98, -62, 68, + -54, -153, -118, -44, 134, 70, -161, -56, 29, -64, + -52, 0, -32, 35, -176, 70, -28, 85, -44, 107, + 35, -77, 2, 4, 55, 32 + }, + { + 771, -5500, -317, 1619, -1251, -1071, 339, 170, 714, 508, + -1531, 429, -45, 754, -351, 35, 1110, -558, 86, -27, + -1069, -80, -201, 557, 112, -379, -598, -357, -1083, 226, + 181, -594, -19, 421, 445, 48, 89, 112, -500, -118, + 74, 596, 310, -2, 27, 163, 275, 142, -145, -23, + -550, -194, -137, -488, -322, -392, -428, 136, 26, 215, + 4, 210, 135, -60, -31, 247, 34, -29, -190, -43, + -115, 132, -60, -261, 57, 13, 82, 12, -27, 78, + 133, 97, 174, -57, -141, -86, 168, -22, -178, 19, + 128, 8, 13, -155, -66, -100 + }, + { + -248, 3276, 0, -150, 200, 514, -372, 154, -249, 383, + -360, -244, 662, -2137, 815, -688, -322, 391, -475, -544, + -620, -145, 522, -433, -903, 408, -594, 780, -1181, 141, + 446, 588, 422, 424, -422, 742, 378, 106, 26, -765, + 116, 63, -396, 237, 272, 87, 91, 169, -145, 257, + -100, -552, 502, -4, 71, 335, -232, 37, 6, 41, + -90, -85, 189, 282, -16, 259, 115, 254, 166, 102, + -115, 278, 37, -97, -182, 2, 81, -16, -130, -50, + -67, 58, 40, 0, -32, 36, 214, 30, -82, 168, + -129, 20, 6, 66, 117, -67 + }, + { + 1288, -1946, 1648, -1098, -567, -338, 635, 341, 293, -619, + 1099, -854, -381, 1706, 218, -624, 615, -941, -81, -293, + -874, 906, 499, 366, -606, 298, -464, -795, -616, 513, + -445, -216, 89, 623, -477, -92, 155, 663, 189, -491, + -336, -398, 31, 377, -524, -356, -425, -485, -345, -20, + 272, 24, -222, 198, 269, -275, -350, 5, -41, -243, + 84, -19, 239, 38, 229, -16, -208, 180, 6, 80, + -229, -131, -12, 12, -20, -107, -167, 124, -87, -9, + 131, -7, -48, -7, 23, -2, 73, 1, -53, 57, + 147, 2, 100, -60, 134, -20 + } + }, + { + { + 9, -2547, -1549, 1588, -1008, -56, -429, 211, 6, -29, + -448, -343, -320, -925, -489, -376, -1136, 161, 710, -328, + 875, 378, -207, 179, -282, 392, -971, 405, -298, 67, + 305, 222, 586, -321, -81, -58, -383, -193, 354, -22, + -260, 168, 104, 65, -152, -78, 568, -135, -479, -65, + 199, 425, -165, 619, 254, -128, -118, 54, -242, 175, + 5, 271, 238, 73, 151, -32, -105, -45, 173, 316, + 144, 189, -192, 300, 17, 191, -26, 134, -12, 140, + -17, 26, 88, 60, -64, 25, 87, -2, -1, -30, + 61, 57, 23, -105, -58, 7 + }, + { + 368, 18065, 1810, 4073, -782, -469, -516, -380, -291, -1000, + -363, 112, 420, -634, -582, -41, 170, 275, 628, 294, + 113, -196, 328, 471, 157, -269, -137, -191, 287, -207, + -5, 142, -591, 54, 223, -327, -28, -15, -9, -95, + 233, -166, 399, -185, -110, -575, -58, 137, 78, -172, + -208, -92, 183, -196, 188, 208, -499, -53, -17, 220, + 162, -119, 233, 333, 86, -114, 143, 35, 187, 156, + -123, -61, 64, 63, -3, 47, 50, 41, -69, -29, + 132, -115, -108, 27, -40, 9, 59, -48, 87, 37, + 49, 79, 51, -47, 60, -49 + }, + { + -451, -2816, 1875, -2722, 1030, 40, 339, -334, 227, -474, + -599, 349, -388, -450, 253, 759, -636, 634, -419, 108, + -628, -323, -287, -41, 18, 163, -296, 61, 204, -1009, + 479, 592, 101, -634, 255, -226, 843, 484, 318, -67, + -379, 247, 269, -13, 206, -112, -298, 27, -16, 74, + 617, -305, -65, 3, 219, 253, 45, 26, -14, 204, + 26, -234, -43, -8, 6, 28, 53, -143, -174, -212, + 81, 7, -24, 272, 89, 223, 77, -164, -110, -185, + 1, -27, 143, -12, -10, 43, 10, -44, 116, 19, + 20, -121, -5, -3, 105, 81 + }, + { + -157, 702, 528, 51, 8, -70, 198, -137, -30, 179, + -327, 262, -26, 37, -1128, -561, 827, 517, -272, 222, + 657, -89, -227, -140, 569, 1047, 440, 30, 34, -661, + -62, -173, 598, 47, 124, 74, 1009, 165, 384, -62, + 393, -161, -568, -231, 147, 348, 20, -193, 191, -225, + 131, -102, 63, -101, -179, 6, -344, -220, 218, 168, + 114, 82, 107, 45, 94, 172, 82, -266, -60, -18, + -56, 127, -57, -40, -29, 123, -55, 22, -16, -102, + -13, -61, 61, 102, 36, -99, 28, 117, -11, 16, + 93, -33, -34, -4, -7, -37 + }, + { + -1580, -4274, -206, 2244, -437, -145, -285, 42, -569, -616, + -155, 996, 800, -691, -1, -194, 133, -899, -672, -925, + -196, -388, -720, 235, -523, 705, -428, 487, 652, 12, + -542, 189, -396, -204, 200, 70, -894, 658, -584, 185, + 149, 325, -247, -125, 8, -464, 99, -65, -13, 51, + -174, -211, 170, 12, 93, -25, -164, 46, 22, -51, + -641, 50, 83, 382, -255, 231, -269, 62, 12, -76, + -178, 106, 144, -18, -14, -16, 167, 18, 54, -132, + -59, 5, 188, -231, 30, 87, 20, -168, -105, 74, + -27, -64, 97, 49, -62, 53 + }, + { + 87, -500, 550, 123, -48, 17, 22, 2, 119, -314, + -424, -249, 324, -271, 201, -429, 283, 541, 509, 464, + 427, -211, -56, 451, -732, -408, 490, -771, 286, 99, + 607, 512, -627, -105, -243, 69, -384, -382, 123, -226, + -425, 248, 492, 605, 193, 275, -327, 71, -406, -33, + 347, 68, 119, -158, -142, -41, 216, 51, 195, -84, + 82, -82, -41, -181, 160, -26, -75, -251, 299, 25, + -108, 159, -40, 63, 94, -21, 171, -2, 153, -65, + -48, 16, -149, -5, 8, 37, 32, -11, 69, -23, + -98, -6, 99, 4, 26, -38 + }, + { + -2446, -8548, -661, 2607, 296, -87, -220, 688, 929, -367, + 1723, 76, 387, 364, 127, 13, -104, -492, -136, -105, + 284, -422, 473, 157, 946, 189, 78, 0, 582, -62, + 228, 149, 406, -35, 434, 205, -80, -81, -83, -98, + 117, -84, 94, 255, 341, -214, 194, -614, -366, -93, + 74, -208, -24, -357, -83, 24, 76, -240, 66, 12, + -104, 409, -203, 247, 25, 282, -174, 27, -27, 15, + -56, -43, 39, 1, -11, -20, -18, -69, -85, 91, + -13, -137, 23, 95, -61, -82, -3, 19, -40, 138, + 21, 18, -53, 37, 54, 72 + }, + { + 122, -963, -29, -63, -128, 83, -130, 122, -220, -78, + -132, -89, 268, -228, -1112, -602, 519, -498, -1243, 66, + -658, -838, 695, 283, 295, -578, -314, -432, -222, -426, + -442, 553, -500, 45, 53, 278, -701, 278, -532, 15, + 804, -497, 388, -264, -82, 35, 383, 360, -162, 354, + 189, 207, 55, -154, 64, 6, -142, 335, -305, -215, + -8, 264, -10, 37, 273, 174, 99, -170, -145, 61, + -199, 179, 186, -72, 97, 7, -84, -75, 33, 33, + -61, -52, 38, -55, 60, 117, -31, -155, 14, 35, + -34, -89, 61, -6, -139, -85 + }, + { + -3108, 2090, 1423, 4045, 1158, -304, 1032, -497, -77, 27, + 900, -464, -433, -127, 48, -377, 114, -559, 53, 301, + 488, 622, -254, -264, 544, 252, -213, -182, 5, 164, + 708, 63, -616, 289, 606, 713, -412, -437, 378, -214, + -343, 605, 425, -248, -367, 11, 81, 56, -8, -461, + -50, -197, 139, -443, -82, -85, -325, -19, 20, 76, + 221, -81, 99, -65, -113, 142, -163, -38, 27, -167, + 127, -10, 86, -23, 31, 92, 142, -75, 39, 173, + 180, -108, -15, 56, -210, -41, -132, -20, 112, -14, + -48, -40, -19, -4, 10, 10 + }, + { + -85, -3192, -790, -33, 67, -847, -241, -222, 342, 167, + -887, 626, 277, 768, -709, -310, -619, 151, 298, -1362, + 7, -421, 772, -171, 288, -236, 286, 392, 403, -103, + -486, 49, 556, -230, 84, 575, -615, 65, 4, -401, + 333, 196, -87, 320, -128, -328, -94, 237, 835, -72, + -109, 211, 151, 453, -546, 205, -109, -67, 67, 165, + 198, -105, -249, 331, -172, 24, 38, 125, -131, -42, + -77, 10, -204, 86, -79, -120, 72, -51, 17, 85, + 102, 20, -14, -4, -87, 62, -20, -97, -122, -116, + 3, -22, -39, -100, 42, -3 + }, + { + 128, -10465, 309, -278, -246, 1633, -1980, 76, 369, -366, + -480, 442, -634, 46, -112, -505, 191, 1680, -345, 172, + -81, 383, 250, -155, -908, 421, 5, -293, -1063, -412, + 268, -312, 148, -340, 560, 657, 2, -383, -205, 253, + 273, -197, 258, 164, -618, -245, -3, -159, 45, -364, + -196, -128, -55, -124, 343, -112, -243, 23, 52, 154, + -53, 95, 234, -8, 17, 159, 200, -147, 139, -4, + 12, -91, 331, -94, 95, 81, -38, 44, 3, 195, + 68, 29, -14, 55, 45, -12, 134, -3, -106, 16, + 26, -94, 46, -164, 43, 5 + }, + { + -206, -1458, 319, -59, 262, -145, 9, -46, 134, 13, + 556, -181, -424, -66, 1711, -121, 696, 664, -744, -695, + 73, 741, 668, 635, 107, -843, 625, -95, -238, 228, + 41, 773, -353, 656, -245, -680, 505, 189, -478, -13, + 417, -356, -300, 56, 271, -30, -363, 305, -7, 255, + -100, -209, -73, -304, 41, -96, 144, 115, -96, 174, + -39, 411, 61, 182, -400, -156, 103, -162, -22, 55, + -104, -17, 171, 99, 35, -22, -61, -48, 59, -10, + -61, -87, -185, 33, -128, -23, -130, 56, -143, -65, + -36, -55, 27, 26, 107, 73 + }, + { + 398, -6654, -1044, 917, -2037, -1588, -13, -266, -252, 393, + -618, -72, -57, 769, -464, 411, 1165, 429, 807, 143, + -424, 299, 251, -44, -474, 147, 40, 759, -213, 379, + 490, -57, -62, 469, 242, -228, 327, 230, -299, 113, + -23, 239, -47, -252, -3, -230, 189, 427, 4, 156, + -299, -222, -218, -116, 200, -114, -449, 47, 73, 328, + 100, 227, 194, 229, 53, -92, -344, -25, -160, -93, + -92, 9, -20, -26, 141, -89, -118, -6, 53, -23, + 91, -9, 43, -44, -26, -93, 83, 5, 12, 6, + 81, 23, 39, -128, 18, 107 + }, + { + 250, 2772, -993, -347, 163, 130, -634, 366, -25, 555, + 94, -88, 223, 393, 4924, -1142, -350, 286, -908, 53, + -854, -345, 1154, 24, -393, 1086, -230, 516, -1052, -230, + -518, -520, -25, 314, -348, 618, -196, -386, 203, -688, + 141, 290, -180, 281, 63, 190, 329, -352, -310, -62, + -97, -218, 363, 127, 256, 335, -337, 114, 81, -9, + -46, -47, 89, -14, -173, 84, -63, 264, 106, 136, + -148, 64, -54, 116, 62, 5, -59, -49, 9, 89, + -22, -55, -11, 27, -72, -5, 91, -85, -183, 131, + -23, 73, -112, -37, 108, -57 + }, + { + -785, -6346, -430, -1301, -210, -309, 729, 745, 893, -1217, + 623, 673, 473, -1318, -3442, 5, 1673, -120, 1672, -15, + -1193, 815, 907, 677, -720, -364, -559, 473, 119, 872, + -127, -268, 2, 1058, 245, 286, 24, 293, 680, 107, + -224, -450, -247, 666, -190, 57, 289, 55, 68, 358, + 349, 140, 42, 4, 147, -232, -372, -282, -95, -67, + -21, -283, -11, -93, 52, -230, -158, -48, -249, 80, + -108, -216, -38, 85, 116, 57, -106, 112, 0, 18, + 110, 71, 74, 38, 86, 33, 98, 10, -102, -104, + 7, -51, 98, -16, 105, -54 + } + }, + { + { + -7, -4581, 77, 612, 27, -276, -150, 76, -185, 291, + -679, -1049, 857, -462, -832, -919, -258, -174, 1117, -35, + -296, 328, -73, 362, -167, 12, -118, -540, 211, 205, + 358, 228, 362, -317, -269, -106, 2, -368, 541, -248, + -156, -33, 101, 6, -222, 162, 648, -408, -240, -289, + 172, 166, -20, 629, 206, -11, 138, -324, -45, 41, + -47, 389, 181, 223, 61, 92, -72, -102, 11, 384, + 163, 160, 35, 91, 129, 106, -7, 44, 99, 89, + -28, 41, 69, -23, 63, -15, 116, -48, -48, -93, + 56, 84, 78, -101, -62, -22 + }, + { + -567, 19273, 1822, 2321, 474, -451, -908, -447, -539, -169, + -1628, 547, 655, -923, -264, -171, 932, 444, 336, 331, + 187, -332, 17, 844, 227, -87, -737, 425, -436, 340, + -105, -463, 113, -562, 32, -85, 315, -146, 12, -103, + 141, 123, -345, 174, -366, 20, -201, -212, 241, -208, + -189, -63, 122, 27, -137, -77, -178, -99, 87, -2, + 289, -213, 257, 451, -2, -67, 175, -9, 215, 27, + -74, -60, 18, 100, 27, -48, 57, 17, -12, -27, + 92, 27, -236, 37, 0, 0, -44, 51, 41, 67, + 40, 5, 64, 1, 2, -14 + }, + { + 435, 1792, -2456, -1276, 237, 394, -473, -170, -238, 646, + -335, -341, -518, -258, 526, -6, -305, 1121, -720, 201, + -212, -402, -757, 439, 203, -239, -83, 61, -282, -421, + 363, 226, -188, 113, -108, -291, 1125, 554, 539, -359, + -324, 321, -18, -77, 376, -135, -620, 478, -30, 131, + 208, -147, 23, 86, -54, 332, 120, 89, -17, 17, + -17, -117, -7, 82, -80, 221, -40, -375, 22, -268, + 84, -75, 103, 209, 209, 96, -29, 43, -133, -184, + -24, 55, -35, 35, 11, -23, -24, 91, 29, -29, + -18, -76, 5, 38, 61, 47 + }, + { + 122, 1192, -140, 66, -57, 31, 116, -145, -151, 252, + -261, -52, 100, 117, 158, -1169, 428, 448, 206, -875, + 1012, 330, -646, 76, 125, 1128, 710, -72, -4, 239, + -1305, 964, -281, 513, 472, -130, 743, 30, 759, -54, + 353, -435, -47, -207, -180, 347, -187, -47, -192, 25, + 87, -112, 14, -225, 112, -240, -89, -341, 263, 194, + 5, 192, -2, 8, 104, 268, -29, -119, -226, 24, + 100, -130, -75, 62, 11, 27, -13, -18, 51, -114, + 94, -68, 1, 89, -20, -48, 12, 43, 50, -3, + 30, 27, 12, -51, -53, 60 + }, + { + 1768, -8523, -1228, 1584, 742, -21, -392, -840, 405, -1313, + 354, 1385, 729, -175, -951, 530, -376, -1201, 435, -985, + -50, -679, -300, 244, -581, 608, -95, 549, 396, -66, + -496, -185, -311, -84, 71, -181, 510, -762, 53, 268, + 312, 76, -206, -225, -251, -100, -174, -125, 453, -272, + -311, -89, 236, 48, -108, -258, 317, -195, -1, -200, + -272, 5, 77, 79, 55, -39, -78, -16, 36, -101, + -92, 38, 41, 46, -42, 45, 149, 18, 118, -231, + -41, 171, 24, -73, -46, 16, 66, -89, -69, -39, + 45, -48, 43, 78, 10, -21 + }, + { + 5, 794, -125, -143, -15, 26, 71, 151, -37, -287, + -292, -367, 380, -323, -237, -200, 923, -521, 1672, 3, + -178, -38, 337, 578, -1400, -117, 757, -683, 365, -116, + 39, 791, -684, 328, -181, -271, -375, -332, -111, -76, + -50, 330, 123, 732, 131, 152, -209, -88, -557, 227, + 517, -102, 32, -370, 179, -173, 313, -44, 156, -29, + 72, 13, -79, -14, -6, 206, -155, -279, 72, 150, + -88, 78, 1, 80, 232, -44, 51, 66, 248, -162, + -70, 26, -11, -143, -10, 106, 42, -35, 46, 32, + -99, -29, 59, 123, -5, -51 + }, + { + 2072, -15444, -869, 2589, 335, 263, -327, 853, 237, 398, + 916, 185, -224, 524, 401, 406, -727, 276, 170, -1178, + 1012, -520, 102, 873, 1076, -262, 77, 291, 350, 297, + 206, -135, 634, -10, 336, 73, 349, -242, -314, 223, + -194, 31, 62, 127, 435, 29, -367, -443, -139, -507, + -71, 158, -44, -457, 45, 274, -143, -335, -3, 108, + -46, 442, 12, -24, 238, 216, -110, -88, -15, -19, + -149, 37, 48, -46, 17, 67, -168, 20, -115, 100, + -1, -123, -11, 139, -146, -36, 3, 30, 28, 30, + 37, 3, -32, 23, 52, 34 + }, + { + -44, 311, -747, 209, -154, -76, -53, -76, -27, 99, + -528, 326, -402, -450, -738, -871, 253, -78, -508, -116, + -827, -302, 1071, 639, -590, 189, 34, -1059, -945, 242, + 236, -478, -61, -94, 124, 544, -687, -764, 47, 218, + 47, -10, 454, -95, -130, 195, -245, 851, -244, 175, + 609, 189, -213, -59, -191, 95, 109, 260, -296, -206, + -55, 174, -86, 101, 152, 173, 88, -232, -7, -61, + 7, 27, 251, -141, 142, 13, -38, -64, 50, -60, + -34, 19, -70, 66, -39, 144, 39, -56, -95, 58, + -110, 43, -62, -15, -113, -90 + }, + { + 4108, -3702, -2557, 4647, 812, 533, 970, -345, -1182, -119, + 840, 183, -26, -304, -301, -177, 474, -1780, -162, 654, + 104, 707, 50, -131, -129, 492, -54, -49, -376, 274, + 456, 110, -817, 442, 651, 407, 393, -684, -153, 394, + -169, 584, 360, -273, -513, 87, 462, -18, -252, -153, + 75, -170, -52, -294, -29, -31, -454, -155, 54, 138, + 211, 160, -206, -3, 56, -45, -51, 34, 52, -72, + 3, -32, 64, -1, 113, 41, 158, -11, 129, 6, + 156, -73, 82, -220, -28, -157, -84, 80, 116, -90, + -28, 5, -51, -22, -52, 17 + }, + { + 186, -3965, -697, 743, -245, -1227, 99, 137, -213, 266, + -467, 471, -34, 481, -530, -63, -230, -753, -320, -121, + -654, -63, 362, 281, -275, -24, 515, 627, -325, 274, + -129, -102, 281, 72, -251, 204, -31, -52, -451, 274, + 615, -247, 32, 302, -588, -6, -136, 573, 397, -27, + 43, 177, 309, 54, -209, -43, -150, -113, 107, 231, + -26, 71, -273, 157, 18, -100, -58, 97, -89, 14, + -36, -27, -101, -74, 73, -147, 7, -77, 201, -20, + 48, -6, 28, 17, -126, 32, 33, -54, -88, -73, + -16, -29, -34, -67, -46, 35 + }, + { + -436, -12395, 2396, -235, -159, -78, -124, -102, 289, -467, + 446, -1255, 169, 6, -189, -397, 558, 905, -423, 816, + -121, -177, 353, 81, -500, 133, -290, 38, -787, -624, + 270, -668, -239, 210, 550, 517, 111, -120, -368, 27, + 112, 218, 223, 65, -503, -188, -33, -262, -73, -360, + 39, -108, 72, -114, 73, 260, -459, 302, 2, 62, + 36, 212, 138, 117, 38, -55, 207, 152, -50, 140, + -165, -94, 183, 148, -4, 73, -42, 147, 55, 172, + -55, -6, 9, 87, 36, 120, 15, -1, -45, -17, + 54, -55, -12, -173, 42, -52 + }, + { + 226, -831, -568, -59, -389, 78, 155, -101, 49, 266, + 655, -275, -1172, 892, 1546, 321, 961, -275, -281, 639, + -827, 138, 1999, -518, 486, -72, -671, 331, -415, 718, + 270, 480, -229, 848, -385, -518, 311, -15, 266, -268, + -103, -213, -76, 177, 26, 170, -294, 127, 202, -57, + 93, -244, -293, -362, 176, -3, 44, -77, -101, 24, + 272, 205, 296, -49, -252, -289, 100, -112, 20, 5, + -69, 83, 198, 94, -98, -56, 177, -98, -62, -10, + -61, 82, -187, -125, 10, -98, -95, 6, -65, -95, + -38, -131, 126, 27, 11, 4 + }, + { + -1737, -3947, -635, 234, -1366, -720, -1038, 223, -82, -308, + 241, -324, -339, 344, -834, 1204, 1053, 1087, 941, -397, + 240, -343, 447, 23, -626, 107, -146, 823, 898, -381, + 196, 588, -18, 165, 50, -114, 373, 298, -97, 9, + 163, -43, 167, -681, 127, -74, 167, 119, 171, 73, + -286, -307, 14, -33, 83, 70, -347, -31, 40, 193, + 199, 300, 146, 258, -45, -124, -441, -74, -4, -156, + -15, 29, -49, 102, -85, -155, 21, -61, 139, -179, + 126, -32, 5, 4, -50, 0, 34, -117, 162, 5, + -10, 32, 101, -112, 8, 158 + }, + { + -331, 2173, 32, -577, -181, -224, 451, -125, 426, 327, + 351, 262, -24, 2290, 2509, -1798, -32, -95, -781, -59, + -468, -1027, 1152, 456, 101, 168, 676, -604, 205, -401, + -570, -855, 68, 205, -70, -72, -313, 241, 258, -318, + -495, 415, 258, -199, 297, -4, 112, -589, 255, -181, + -33, 141, -187, 413, 27, 382, -297, 0, 11, 145, + -2, -140, 115, -31, -236, 1, -41, 118, 153, 148, + -116, -82, -144, 184, 248, -64, -26, 47, -37, -78, + -10, -72, 79, 36, -32, 91, -188, 77, -41, -149, + 93, 59, -9, -96, 44, -67 + }, + { + -275, -7067, -1223, -1136, 299, -77, -180, 752, 557, 224, + -921, 960, 1088, -881, -4222, 931, 1922, -439, 1742, 3, + -52, -59, 802, 318, -474, -305, -780, 373, 362, 347, + 178, -548, 583, 420, 648, 534, -105, -107, 1116, 96, + -841, 599, -353, 552, 305, -82, 138, 78, 254, 557, + 246, 3, 223, -115, 6, -163, -89, -163, -188, -75, + -177, -217, 156, -277, 87, -259, -38, -452, 59, -153, + 17, -219, 104, -47, 58, 272, -68, -8, 120, -75, + 198, 69, 112, -43, 104, 14, 98, 19, -156, -83, + -17, -67, 24, 66, -43, 88 + } + }, + { + { + 28, -3633, 908, 0, -153, -92, 20, 96, 603, 949, + -688, -1466, 1161, 67, -983, -697, 611, -593, 134, 691, + 366, -229, -573, 379, -426, -278, -83, -555, -236, -449, + 368, 190, 150, -178, -330, 114, 776, 496, 778, -129, + -53, -186, 257, 229, -189, -72, 368, -57, 12, -408, + 82, -147, -146, 253, -73, 166, 433, -146, -120, -235, + -57, 92, -59, 205, 10, -92, -206, -131, -293, 190, + 250, 120, -45, -5, -40, -9, -82, -44, 53, -71, + -79, 46, -83, -142, 36, 2, 130, -70, -56, -74, + -14, -40, 43, 3, 68, 27 + }, + { + 710, 16616, -1870, 206, -336, 307, -455, 452, -21, -496, + -993, 1302, 593, 178, 682, 550, 1185, 63, 550, 927, + 537, -502, -640, 419, 436, 410, -652, 181, -914, 172, + 31, -220, 502, -217, 249, 45, 429, 44, 156, 247, + -150, -46, -303, 42, -453, 266, 85, 23, 515, -267, + -150, 94, 76, 239, -107, -281, -159, -257, -45, 87, + 233, -141, 131, -31, -92, -26, 19, -200, 7, -58, + 58, -6, -44, -33, 34, -68, -21, 49, 51, -26, + 26, 14, -217, 11, 25, 39, -26, 53, -45, -44, + -46, -47, 8, 9, 51, 49 + }, + { + -375, 6106, 1524, -460, 379, 192, -499, -9, 275, 791, + -1371, -269, 391, 135, 869, -1, -67, 1041, -884, 992, + 724, -79, -476, 1178, 1162, 191, 179, 111, -135, -124, + 167, -318, -310, 168, -320, -276, 705, -42, 340, -289, + -460, 8, -154, -142, 175, 71, -472, 217, -114, 11, + 102, 51, 171, -12, -308, 172, 42, 17, 9, 211, + -29, -157, -49, 7, -162, 150, -185, -289, 246, -195, + 8, -141, 54, -2, 42, 20, 13, 207, -22, -42, + 42, 33, -118, 43, 63, -55, -34, 102, -44, -97, + -42, -47, 3, 18, 22, -27 + }, + { + -76, 1524, 157, 174, 86, -58, 23, 34, -121, 322, + -57, 47, 356, 239, 1038, -345, -4, -826, -66, -463, + 946, 341, -671, 298, 440, 1090, 269, -385, 114, 1425, + -273, 853, -685, 139, -68, -903, 642, 517, 330, -387, + 328, -223, -160, -419, -280, 108, -274, -56, -608, -169, + 64, -238, 23, 47, 230, -224, 71, -163, 214, 53, + -28, 142, -73, 20, -88, -6, -27, 90, -106, -57, + 41, -156, -47, 10, 8, 45, -64, -47, 87, 2, + 201, -65, -64, 33, -74, -10, 6, -13, -22, 3, + 53, 19, 49, -90, -91, 8 + }, + { + -1420, -12212, 136, 562, -647, 77, 89, -657, 1089, -1249, + -185, 877, 862, 486, -1479, 36, 283, -935, 719, 338, + 452, -14, 524, 231, -601, -66, -569, 867, 676, -180, + -442, -291, -66, -164, -279, 246, 1337, -791, 23, 73, + -112, -383, -197, 0, -121, 295, 77, 4, 542, -317, + -9, -187, -299, -178, 30, -37, 481, -126, 143, -102, + -97, 190, 71, 156, 192, -78, -28, -39, 134, 18, + -76, 22, -2, 94, -31, -55, 85, 135, 271, -98, + 28, 97, 14, 83, 0, 12, 75, -1, 77, 13, + 44, -44, 10, 75, 30, -53 + }, + { + -103, 438, -221, -122, 16, -17, -23, 30, 39, 191, + 312, -129, 474, 967, 116, -371, 772, -1127, 213, -822, + 277, 345, 360, 796, -267, 365, 292, -983, -313, -503, + 70, 749, -408, 412, -200, -345, -516, -475, 94, 262, + 75, 46, -251, 425, -3, 66, 57, 253, -576, 92, + 134, -463, -18, 94, 427, -236, 182, 101, 200, -51, + 71, 220, 267, 138, 40, 214, -99, -113, -115, 45, + -127, -66, 11, 112, 88, -159, -46, -50, 195, -94, + 7, 11, 57, -61, -47, 11, 71, 8, -24, 14, + -72, -13, 6, 62, -20, -4 + }, + { + -890, -19856, -325, 2138, -931, 15, -629, -367, -776, -264, + -545, -376, -57, 578, 745, 134, -633, 631, 201, -594, + 1596, 358, 388, 86, 236, -128, -100, -344, -317, 579, + 417, -255, 623, -197, -403, -392, 433, -186, -303, 85, + -266, 79, -10, -136, 183, -44, -313, 1, -93, -575, + -4, 311, 387, 57, 206, 206, -34, 85, 39, -27, + -4, 406, 168, -63, 85, 38, -188, -76, 95, -48, + -280, -43, 55, -68, 10, 92, -251, -70, -163, 46, + -22, -11, 56, 106, -43, 32, -15, -71, -35, 2, + -7, -41, -39, 18, 55, 38 + }, + { + -94, 197, -597, 83, -163, -57, -107, 10, 264, 298, + -187, 440, -705, 51, 394, 354, 917, -7, 144, 595, + 122, 94, 1164, 1247, -370, 606, 1044, -1082, -763, 1086, + -50, -788, 229, 97, 654, 715, -793, -779, 203, -336, + -690, 162, 484, 94, 83, 144, -727, 455, 162, 352, + 273, -94, -46, 67, -340, 15, -104, -33, -109, -81, + -136, -31, -420, -36, -39, 24, 135, -70, -79, -41, + 153, -129, 104, -109, 95, 40, -8, -42, 166, 61, + 55, -2, -156, 80, -17, 131, 34, -16, -89, -61, + -104, 90, -73, 84, 26, -4 + }, + { + -4444, -10827, 1292, 3251, -1425, -414, 534, 35, -1088, -357, + 217, 620, 985, 833, 623, -275, -366, -1717, -100, 466, + -416, 456, -213, -417, -613, 26, -328, 275, -115, -141, + -180, -8, -487, 291, 274, 237, 550, -37, 116, 460, + -287, 130, 319, -5, 55, 321, 127, -110, -22, 232, + 56, -264, 121, -95, -68, 279, -25, -40, 251, 104, + 3, 29, -240, 227, 265, 3, 36, 127, 238, 20, + -104, -4, 37, -95, 75, 56, 136, -84, 70, -117, + 60, -65, 63, -228, 93, -6, -26, 28, 36, -65, + 31, 13, -59, 5, -41, -17 + }, + { + -239, -3791, -108, 411, -498, -1185, -248, -217, -462, 449, + 420, 1044, 85, -190, -1195, 335, 191, -710, -513, -212, + -265, 635, 232, -186, 155, 179, 137, 135, -282, 228, + -267, -308, -46, 69, -569, -7, 69, -262, -459, 738, + 988, -43, 116, -34, -628, 367, -120, 167, -130, -634, + -79, 50, -194, -259, -25, 59, -207, -305, -254, -187, + -96, 363, -143, -61, -142, -59, -78, -105, -54, 63, + -183, -74, 38, 12, 119, -80, 29, -162, 147, 96, + 125, 40, -5, -1, -103, -10, 78, 8, 69, -25, + -31, 5, 31, -41, -103, 8 + }, + { + 796, -13128, 1019, 488, 1608, -650, -499, 69, 668, 104, + 905, -1083, 689, -40, -220, -242, -49, 113, -1156, -437, + -1002, -503, 455, 132, -406, 190, -19, 498, -299, -454, + -21, -331, 240, -74, 36, 349, 42, 16, 42, 183, + -138, -50, 247, 198, 69, 26, -92, -276, -109, -5, + 295, 34, 133, -187, 183, 521, -155, 434, -180, -28, + 91, 233, -39, 82, 269, -55, 103, 252, 3, 152, + -154, -233, -54, 29, -132, 21, -48, 211, 45, 132, + -89, -48, -32, -30, -96, 64, -33, -31, -32, -18, + 72, 15, 64, -31, 95, -46 + }, + { + -200, 453, 847, -161, -743, -116, 217, -260, 11, 157, + 452, -157, -231, 1080, 619, 942, 1933, -180, -530, 723, + 177, 623, 939, -1577, 131, 353, -1108, 123, 551, 1169, + 117, 191, -233, 596, -221, 164, 51, -637, 82, -198, + -100, -46, 35, 140, -83, 13, -39, 42, -367, -388, + 295, 20, -65, -156, 35, -196, -124, 106, -86, -144, + 228, 136, 32, -75, 137, -243, -55, -103, -121, 90, + 128, 148, 192, -79, -198, 51, 256, -65, -50, 62, + 97, 229, -156, -55, 109, -14, 22, -21, -41, -44, + 41, -54, -14, -98, -10, -118 + }, + { + 2385, 2058, 57, 238, -847, 837, 434, 1402, 393, -386, + -199, 440, 328, 493, -826, 1706, 1001, 40, 530, -820, + -302, -1025, 2, -44, -800, -220, -479, 189, 523, -223, + 480, 317, -300, -361, -308, -157, 128, 326, -121, -335, + 471, -2, -36, -661, 323, 424, 131, -132, 89, 344, + -74, -302, 335, -200, -119, 176, -393, 36, 114, 50, + 39, 265, 68, 92, -55, 16, -303, -13, -75, -218, + 51, -6, -113, -40, -193, -95, 121, -9, -20, -220, + 112, -44, -15, -102, -114, -36, 26, 9, 170, -86, + -17, -4, 112, -80, 37, 131 + }, + { + 425, 2416, -288, -236, -179, -259, 235, -471, 356, 538, + 118, -146, -557, -3619, -4051, -1206, -68, -69, 435, -153, + -1201, -924, 928, 206, 914, 599, 496, -101, 872, -76, + -42, 55, 742, 70, -79, -445, -26, 581, 280, 254, + -636, 134, 241, -384, -119, -382, 37, -513, 405, -49, + -60, 226, -122, 120, -215, 281, -242, 31, -145, 56, + -149, -258, -97, -153, -261, 211, 121, -256, -176, 49, + -128, -81, -136, 16, 218, -3, 121, 49, -191, -88, + -63, 9, 190, 15, -4, 192, -53, 160, 14, -123, + 39, -34, 35, -39, 19, -10 + }, + { + 1347, -4341, -800, -848, 460, 379, 242, 564, 63, 243, + -1316, 541, 1201, 1718, -1175, 744, 705, -802, 1297, 264, + 33, -767, 140, -175, -324, 203, -348, -279, -341, 376, + 168, -883, 346, -123, 224, 314, -309, -144, 623, 83, + -436, 924, -162, 463, 265, 151, 232, -158, 42, 306, + -160, -159, 265, 196, 50, -140, 480, 140, -210, -53, + -176, -200, 337, -195, 50, -41, 312, -71, 176, -337, + 36, 8, 84, -122, 23, 337, 46, -29, 143, 6, + 309, 60, 5, -95, 42, -63, -58, -81, -122, -94, + -117, -65, -34, -63, -111, 110 + } + }, + { + { + 0, -823, -932, -780, 77, 226, -105, -168, 462, 147, + 358, -681, 142, -175, -12, -984, -316, 571, -710, 1184, + 434, -345, -570, -226, 310, -853, -478, -155, -619, 203, + -359, 603, -664, 267, 248, 620, 49, 460, 955, -175, + -88, -254, 213, 435, 8, -119, -166, 96, 120, -132, + 64, -372, 282, -67, 216, -124, 499, -99, -20, -272, + 12, -127, 22, -87, 79, -196, -239, -91, -66, 175, + -1, 67, -71, 70, -71, 48, -90, 47, -42, -79, + -34, 25, -67, -58, -57, -37, 150, -64, -59, -40, + -2, -15, -41, 43, 117, -1 + }, + { + -850, 12808, 2074, -502, 775, -159, -400, 1029, -446, -750, + -126, 1313, 163, 418, 12, 1003, 1662, -443, 748, 1004, + 155, -567, -668, 453, 471, 42, -429, 407, -540, -258, + -188, 369, 314, -225, 259, -115, 199, 680, 77, 502, + -321, 98, 45, -484, -57, -115, 32, 89, 531, -94, + 203, 237, -133, 271, -154, -311, -3, -372, -70, 294, + 118, 91, -65, -317, 176, -78, -113, -26, -11, -217, + 165, -5, -135, -19, 111, 8, -156, 109, 32, 66, + 26, -171, -5, -16, 21, 3, 55, -8, -75, -108, + -12, -13, 17, 28, 31, 27 + }, + { + 265, 8214, -465, -354, -359, 281, -277, 351, -73, 491, + -1229, -1051, 938, 994, 86, 74, 117, -252, -529, 1149, + 436, 192, 306, 557, 1133, 310, 393, 107, 398, -469, + 5, -300, -549, -121, -13, 150, 163, -37, 255, -22, + -216, -612, -83, 24, -120, 323, -43, -311, 217, -31, + 174, 232, -149, -13, -80, -8, 110, -61, 159, 81, + -80, -97, -97, -40, 67, -70, -335, -71, 60, 31, + -90, 22, 10, -46, 29, 17, 62, 142, 9, 85, + 11, -13, -51, 29, -33, -7, 23, 53, -88, -48, + -49, -58, 74, -25, -13, -34 + }, + { + 63, 1683, -76, 347, -89, 47, -103, 143, -204, 165, + 363, -186, 364, 316, 235, 1096, -796, -937, 5, 191, + -146, -357, 192, -98, 769, 705, -147, 223, -512, 1271, + 953, -113, -122, -240, 0, -539, 177, 745, 135, -316, + 232, -176, -436, -137, -471, 94, 88, -40, -844, 43, + 118, -373, 127, -24, 66, -72, 13, 165, 18, -13, + 47, 58, -90, 128, -175, -55, 71, -109, 59, -66, + -174, -3, -68, 3, 40, 63, -133, 20, 45, 89, + 104, 100, -185, 7, -97, 41, 32, -49, -29, 58, + 68, -24, 14, -41, -126, 11 + }, + { + 542, -15866, 709, -234, 285, -99, -22, -281, 784, -1456, + 474, 510, 973, 169, -1169, -181, 257, -1154, 1094, 486, + -204, 467, 468, 90, -321, -279, -467, 892, 266, -136, + 189, -985, 400, -547, -97, 179, 167, 728, -680, 220, + -54, -464, -109, -246, 164, 110, 409, -149, 623, -208, + 22, -110, -538, 75, -96, 147, 75, 197, 144, -150, + -91, 213, 160, 39, 287, -84, -261, 75, 147, 69, + -8, -47, 56, 48, -33, 0, 42, 85, 265, -53, + 88, 2, 57, 67, -16, 69, 30, -15, 120, 40, + -32, -13, 0, 25, 67, -13 + }, + { + 32, -179, -96, -125, 129, 33, -78, 96, 65, 136, + 214, 264, 11, 695, -577, 828, 5, -287, -247, -147, + -51, 571, 259, -275, -71, 657, -369, -980, 285, -474, + 413, 314, 138, 79, -83, -422, -436, -271, 335, -182, + 298, -359, -168, 408, -74, -13, 115, 124, -253, 105, + -168, -160, -209, 457, 152, -195, 19, 350, -46, 300, + -59, 172, 409, -44, 134, 119, -92, -35, -125, 70, + -233, -104, 5, 154, -106, 6, -27, -154, 71, 18, + 73, 4, 18, 18, -29, -99, 29, 51, -30, 4, + -50, 5, 29, -12, -11, -21 + }, + { + -821, -22012, 1341, 1152, -143, -120, 23, -849, -620, -691, + -53, -139, 321, -923, 703, 574, -306, 1088, -919, 324, + 426, 1161, 382, -147, -134, 251, -457, -52, -476, 314, + 656, -50, -78, 355, -744, -433, 669, -315, -84, -406, + 202, 22, -88, -79, 84, -189, -502, 585, -525, -106, + 161, -22, 529, 186, 213, 13, 55, 191, -73, -25, + 65, 117, 372, -75, -37, -30, -51, -29, 139, -81, + -253, -114, 102, -15, -179, 22, -21, -126, -228, 135, + -115, 65, 118, -74, 129, 27, 69, -145, -17, -1, + -54, 50, -100, -46, 112, 16 + }, + { + 30, -613, -83, -247, 53, 16, -69, 99, 69, 186, + 86, -26, -291, 192, 200, 1134, 808, -839, 1604, -1048, + 985, 474, -219, 351, 521, 352, 850, -158, 378, -530, + -404, -364, 364, 803, 68, 300, -441, -155, -424, -410, + -306, -12, 299, 149, -136, 247, -296, -347, 628, 410, + -26, -139, 92, 42, -307, 172, 33, -354, 58, -56, + -261, 108, -467, -52, -76, 163, -215, 185, -17, -81, + 159, -66, -9, -39, -129, 120, 8, -15, 71, 126, + 7, -44, 30, -92, 111, 3, 48, -56, 70, -160, + -54, 20, -18, 34, 80, 56 + }, + { + 3949, -18577, -1246, 1904, -542, -358, 114, -5, -342, 16, + -745, 1240, 625, 1513, -63, 294, -1296, -406, -523, -48, + 87, 148, -336, -209, -439, -85, -402, 209, 124, -15, + -344, -69, -291, 522, -40, 99, 211, 724, 206, -251, + -187, 136, 329, -193, 143, 161, 185, 16, 32, 258, + -125, -368, 155, 111, -353, 358, 153, 66, 111, 134, + -74, -113, 210, -59, 216, 116, -18, 172, 161, 101, + -137, 20, 27, -44, -44, 24, 215, -78, 8, -95, + 24, 0, -64, 21, -34, 120, -12, -37, -86, 44, + 53, -49, -23, -66, 11, 52 + }, + { + 274, -2778, -1415, 52, -502, -463, -573, -273, -321, 454, + 606, 557, 345, -708, -962, 491, -682, 161, 820, -2304, + 715, 778, 418, -506, 628, -171, 309, 88, -278, -357, + -257, 197, -154, -131, -266, -280, 182, -152, -155, 210, + 837, 61, 273, -151, -202, 42, 83, -214, 141, -690, + 19, -22, -500, -127, -154, 203, -158, -24, -518, -181, + -18, 242, -49, -122, -157, 47, -30, -334, 132, -8, + -57, -240, -12, 102, 43, -78, 110, -10, 1, 46, + 10, 116, 106, -56, -62, -109, 128, -11, 102, -44, + 40, -86, 127, -107, -80, -4 + }, + { + -1108, -14135, 3471, 836, 1769, -178, -158, -141, 683, -56, + 257, -12, 465, -314, -177, 315, -289, -384, -1005, -88, + -1522, -59, 51, 322, -534, 318, -352, 170, 156, 292, + -306, -202, 248, -259, -48, 107, 418, -12, 401, 25, + -238, -245, 158, -107, 221, 320, -130, -424, -189, 552, + -186, -32, 348, -230, 180, 148, 324, 277, -140, -171, + 176, 50, 174, 14, 223, -97, 29, 164, 156, 148, + -180, -220, -31, -13, -142, 94, -42, 183, -5, -17, + 14, 31, -136, -3, -113, 21, -25, -3, -52, 11, + 20, 57, -4, 51, 76, 28 + }, + { + 171, 1849, -288, -382, -360, -284, 172, 26, -299, 271, + 495, -378, 865, 101, 748, 150, 2361, -599, 226, -457, + 230, 1604, -967, 261, -969, 800, -874, -57, 640, 1181, + 92, -487, 839, -140, -310, 562, -516, 230, -316, 8, + 56, 83, 105, -108, 178, -610, 357, 23, -319, -103, + -13, 47, 7, -5, -317, -374, -42, 318, -85, 135, + -10, 60, -31, -53, -31, 33, -226, 51, -155, 46, + 70, 127, 154, -171, 78, 145, -31, 150, -85, -83, + 260, 123, -92, 114, -64, 98, -33, -41, 62, -61, + 38, -8, -116, -51, 17, -150 + }, + { + -1767, 8513, 1, -409, -878, 1569, 258, 1327, -895, 536, + -62, 724, -159, -99, 473, 1178, 948, -56, 24, -458, + -676, -465, -565, -358, -332, -184, 230, 78, -565, -354, + 787, 310, -306, -248, 155, -457, -239, 47, 150, -323, + 469, -314, -223, -241, -39, 817, -170, -222, 142, 314, + 184, -432, 133, 107, -162, -117, -25, 110, 28, 65, + -67, 345, 76, -35, -52, 38, -214, 1, 56, -268, + -7, -22, -106, -21, -172, 28, -8, -6, -184, 14, + -59, 112, -33, -148, -37, -99, 50, 124, 86, -160, + 113, -62, 29, -11, 49, 63 + }, + { + -442, 2680, 446, 434, -610, 138, -350, 215, -190, -207, + 89, 197, -401, -2479, -6037, 209, -1506, 779, 625, -2242, + 811, -556, 271, 620, 110, 1140, 95, 533, 431, 564, + -482, 218, 582, 287, -102, -1064, 699, 516, -54, 359, + -335, -289, 301, -161, -414, -209, -57, -220, -94, 198, + 72, -104, 98, -203, 39, 169, -155, 194, -336, 50, + -209, -128, -256, -223, -59, 9, 255, -156, -215, -3, + -280, -51, 236, -159, 95, 124, 20, 54, -88, -9, + -135, 74, 87, -110, 117, 126, -4, 195, -6, -48, + -63, -69, 33, 66, -37, 88 + }, + { + -1826, -321, 295, -81, -922, 425, 373, 1043, -129, -147, + -613, 579, -24, 353, 1764, 823, -34, -289, 32, 932, + -317, -633, 324, -207, -660, 419, -376, -168, -64, 165, + -393, -242, -202, -103, 635, 358, -993, 574, -63, 287, + -456, 209, 270, 177, 213, 188, 457, -123, -67, -101, + 39, -196, 3, 553, -221, -272, 659, 153, -108, -173, + -286, 12, 244, -16, 64, 6, 187, 227, -193, -48, + 12, 88, -201, -76, 89, 191, 264, -129, 63, 187, + 89, 194, -76, -41, 42, -118, -58, -49, -101, -46, + -178, -12, -146, -57, -6, 50 + } + }, + { + { + -64, 1962, 1011, -1395, -612, 122, 70, -196, 170, 235, + 440, -329, -140, -915, -833, -1726, -1146, -160, -1130, 531, + -320, 294, 344, -270, -397, -1144, -633, -319, -533, 297, + -955, 92, -529, 417, 176, 751, 100, 193, 414, -313, + -76, -221, -15, -123, -95, 328, 6, 199, 235, 206, + 356, 73, 513, 7, 478, -130, 175, -227, 167, -143, + 103, 86, 108, -215, -39, -116, -146, -65, 139, 157, + -193, -101, -84, 226, 3, 108, -12, 70, 87, 8, + -83, 111, 102, 17, 1, 11, 128, -15, 1, -26, + 16, -50, -52, 85, 120, -57 + }, + { + 1066, 9142, -2167, -241, 357, -21, -451, 13, -1275, -218, + 493, 813, -401, -331, 154, -423, -144, -229, 425, 398, + -179, -771, -779, 504, 232, -225, -68, 642, -131, -265, + -316, 603, 76, -721, 784, 520, 82, 314, -412, 359, + -226, 392, 145, -367, 407, -98, 178, 127, 328, 181, + 425, 516, 205, 451, 88, -134, 280, -18, 72, 312, + 165, 241, 3, -341, 134, -44, -163, -29, 164, -79, + 112, -26, 9, 148, 33, 43, -81, 46, 39, 105, + 46, -144, 82, 47, 26, -59, 83, 64, -47, -75, + 96, 52, 37, 126, 42, -84 + }, + { + -129, 7248, -1415, -522, -273, 282, -293, 332, -451, -544, + -1423, -1305, 83, -35, -412, 294, -89, -560, -507, 169, + -485, -417, -178, 144, 1032, 369, 143, 86, 401, -826, + -369, -125, -49, -262, -456, 52, 21, -375, 325, 367, + 95, -224, 255, 196, 78, 313, 160, 49, 432, 87, + 199, 111, -212, 120, 12, -218, 170, 78, 86, -116, + 22, -32, -55, -88, 230, 25, -252, 101, 150, 278, + 56, 39, 29, 89, 54, -89, -58, 42, 88, 120, + -23, -62, -38, -1, -66, 37, -25, -45, -35, 27, + 23, 20, 75, -48, -21, -43 + }, + { + -44, 1458, -103, 481, -34, 49, -23, 124, -274, 9, + 115, -513, 545, -210, -2018, 41, -661, -582, -157, -301, + -889, -888, -120, -68, 665, -141, -546, 252, -647, 704, + 559, -68, 56, -381, -159, -94, 444, -232, -174, 8, + 131, -72, -431, -76, -161, 380, 341, 128, -229, 312, + 1, -453, 44, -94, -13, -99, -10, 233, 59, -127, + -142, 84, 31, 236, -113, -135, 36, -30, 80, -129, + -236, 81, -10, -30, -29, 29, -15, 123, -6, 58, + 24, 140, -90, 32, -80, 2, 19, 8, 6, 94, + 47, -60, 23, 38, -42, 27 + }, + { + 676, -17845, -607, -428, -160, -6, -124, -55, 949, -1017, + 16, -336, 704, 160, -423, -317, 374, -897, 295, -549, + -627, 369, 231, -255, -529, -174, -932, 78, -297, 48, + 923, -523, 280, -641, 185, 321, -1420, -422, -570, -123, + -484, -482, -28, -7, 105, 208, 403, -403, 464, 119, + 317, 129, -128, 327, 144, 75, -339, 171, 76, -3, + 0, 40, -10, -80, 326, 49, -388, -24, 137, 11, + 5, -61, -87, -41, -99, -116, -35, -46, 167, 36, + 111, -26, 94, 23, -102, -65, -42, -16, 36, -44, + -72, 0, -9, -100, 24, -6 + }, + { + 73, 285, 108, 39, 223, 8, -16, 107, 107, 63, + 117, -36, -842, -1023, -3338, -14, 345, 101, -296, 544, + 770, -123, -742, -820, -637, -492, -610, -862, 710, -261, + -358, -509, -145, 696, 753, 230, 332, -37, 60, -617, + 207, -402, -405, 153, -153, -113, -94, 42, 140, 244, + -153, 110, -15, 386, 148, -140, 21, 394, -103, 258, + -203, -20, 268, -218, -37, -54, -149, 89, 10, -186, + -328, 37, -126, -61, -120, 120, 105, -161, -28, 11, + 31, -9, 2, 37, -60, -134, 29, 57, -36, 40, + 14, 1, -3, -35, 4, -24 + }, + { + 2632, -20846, -1480, 557, -73, 232, 462, 136, 101, -440, + -251, 11, 591, -1651, -7, 376, -77, 1164, -1269, 112, + 363, 373, -229, 36, 142, 569, -164, 3, -393, -8, + 10, 61, -43, 139, -724, -74, 701, -437, 79, -378, + 340, 44, -21, -145, 151, 183, -596, 415, -161, 198, + 202, -107, 432, 192, 106, -31, 158, 344, 133, 35, + 17, -204, 234, 46, -139, 72, 183, 136, 90, 20, + -110, -109, 161, 28, -159, 57, 122, 12, -162, 178, + -160, 9, 152, 14, 89, -40, 119, -70, -1, 6, + 10, 98, -56, -59, 63, 44 + }, + { + 86, 24, 310, -69, 96, 74, 54, -257, -254, 340, + -242, -22, 0, 607, -182, -160, -643, -2238, 784, -2096, + 110, -1, -217, -425, -181, -378, 281, 251, 366, -2001, + -865, 315, 83, 865, -45, -44, -91, 441, -249, 131, + 245, -330, 132, 17, 14, 536, 117, -288, 125, 12, + -116, 169, 154, 160, -79, 200, 80, -433, 59, 135, + -181, 226, -204, 53, -59, 98, -279, 144, -101, -14, + 245, -46, -52, -65, -176, 52, -50, -51, 58, 140, + -57, -119, 98, -77, 106, -78, -16, -122, 73, -34, + 42, -22, 2, 20, 4, 42 + }, + { + -2651, -24219, 1613, 2086, 36, -78, 410, 122, 419, 562, + -1212, -338, -544, 1018, -597, -45, -306, 681, -309, 26, + -280, -506, -192, 643, 447, 394, -204, 218, 289, -165, + -361, 385, -202, 402, -226, -198, -248, 449, 32, -707, + -543, -49, 49, -189, -53, -166, 453, 332, -249, -272, + -172, -287, 191, 202, -327, 238, 168, 223, 86, -10, + -117, -74, 240, -119, 61, -43, -15, 110, 47, 105, + -31, 104, -8, -112, -21, -59, 71, -10, 65, -4, + 80, 0, -20, 140, -80, 29, -56, -102, -53, 128, + 58, -48, -29, -100, -13, 120 + }, + { + -292, -922, 631, -192, -915, 275, 263, 263, 163, 369, + -70, -252, -163, -1476, -1287, 152, -1188, 850, 2941, -897, + 61, -547, -377, -575, 1085, -99, -67, -428, -414, -450, + -681, 117, 731, 461, 3, -200, 58, 795, 69, -761, + 252, -180, -16, -53, 389, 221, 204, -47, 318, -56, + 494, -91, -398, 7, -375, 295, 150, 11, -531, 157, + 209, 85, -64, -28, -75, 123, -61, -359, 254, 84, + 127, -202, -142, 82, 51, -60, 148, 28, -72, -73, + -19, 81, 127, -49, -46, -98, 82, -23, -8, -82, + 86, -32, 163, -90, 23, 80 + }, + { + 1291, -15042, -123, 662, 319, 752, 1116, 197, 221, -896, + -283, 764, 1153, 675, 367, 231, -282, -34, -690, 457, + -1038, -238, -296, 85, -381, 514, -841, -13, 314, 590, + 129, 162, 238, -494, -57, 180, 568, 60, 194, 161, + 205, -390, -295, -535, 27, 178, -282, -219, -182, 358, + -576, -479, 47, -61, 297, 77, 226, 127, 168, -128, + -252, -345, 122, 11, -13, -232, -127, -88, 146, 176, + -79, -58, 52, 130, 116, 98, -19, 35, -218, -55, + 66, 36, -175, 53, -46, 45, 27, -5, -76, 68, + 57, 64, -18, 36, 91, 35 + }, + { + -138, 2849, 686, 34, 583, 233, -25, -81, -265, 366, + 584, -506, 1330, -399, -130, -1000, 1218, -414, 586, -1051, + -212, 450, -878, 1924, -957, 105, -220, 520, 214, 973, + -295, -801, 1595, -215, -655, 516, -600, 854, 557, 863, + 619, -232, -15, 424, 391, -579, 261, 74, 307, 145, + -233, -42, 108, 61, -456, -234, 28, 83, -132, -12, + -218, -53, -28, 26, -188, -66, -200, 1, -70, 44, + -21, -3, 64, -93, 237, 206, -193, 122, -8, -75, + 224, 111, -31, 162, -81, 83, -30, 1, 120, -22, + 20, -12, -71, 45, 27, -72 + }, + { + 75, 11115, 80, 99, -739, 1490, -1004, -895, -2207, -251, + -638, 413, -287, 23, 166, 355, 487, -252, -667, -45, + 345, -527, -993, 118, 594, 576, 630, -17, -802, -314, + 230, -199, -5, -76, 66, -103, -370, -497, -136, -638, + 49, -120, 204, 82, -417, 67, -229, -404, -228, 50, + 343, -307, 117, 396, -173, -16, 196, 349, -30, 67, + 176, 299, 6, 87, 137, 64, -159, 134, 305, 45, + 115, 8, 37, 100, -75, -2, -122, -99, -209, 203, + 58, 39, 27, -86, 33, -3, 54, 28, 48, -130, + 120, -55, 15, 20, 14, -12 + }, + { + 417, 2177, -725, 658, -161, 287, -667, -13, -600, -611, + -345, 87, 76, 1519, -1579, 440, -952, 336, -94, -935, + 2078, 362, 82, -438, -964, 596, 891, 1846, 144, -219, + -969, -107, -143, -303, -527, -734, 789, 150, -146, -118, + -494, -428, -101, 15, 56, 104, 88, -66, -309, -233, + -146, -130, -39, -122, 155, 21, -372, 133, -110, 53, + -50, 66, -39, -55, -4, -42, 108, -28, -6, 92, + -81, 251, 437, -161, -41, 183, -8, 9, 18, 96, + -158, -50, -6, -193, 3, 44, 26, 98, -140, -40, + 63, 79, 37, 48, -25, 30 + }, + { + 1469, 4589, 229, -166, -837, -201, -83, 1332, 322, -488, + 737, 1383, -508, 637, 1731, 691, 636, -30, -567, -26, + -1016, -654, 187, -164, -203, -256, -618, 104, 248, 513, + -474, 244, -1, -172, -401, -496, -861, 500, -640, -148, + -446, -317, -276, -183, -26, 116, 0, -459, 194, 129, + 11, -112, -3, 387, -151, -297, 274, -90, -85, -72, + -43, 83, 182, -31, 91, 0, -38, 111, -123, 106, + -148, 46, -2, -6, 40, -82, -21, -99, 46, -36, + -123, 167, -59, -24, 30, -92, -25, 84, 39, 17, + -75, 69, -48, -59, -7, -13 + } + }, + { + { + 101, 2667, -69, -347, -945, 31, 58, 132, -276, 1007, + -284, 467, -1123, -64, -1996, -691, -1246, -897, 83, -82, + -320, -250, 265, -713, -89, -403, -1044, -616, -819, 197, + 47, -283, -452, 405, -182, 691, 31, 655, -233, -146, + -373, 98, 205, -461, -280, 526, 300, 146, -66, 285, + 197, 132, 441, 234, 334, 145, -158, -113, 103, -97, + 155, 243, -75, -26, -53, -46, 3, -146, 107, 165, + -146, -114, 12, 289, -19, -22, 139, 14, 117, -32, + -14, 31, 102, 74, 59, -45, 34, -13, 40, -12, + 9, -43, -9, 68, 89, -37 + }, + { + -1190, 7551, 692, 842, -315, 2, -47, -903, -646, 56, + 690, -351, -42, -610, 115, -1430, 266, 451, 36, 125, + -348, -710, -609, 756, 12, 500, -116, 87, 185, -117, + -381, 138, 154, -625, 560, 594, -18, 420, -3, -174, + -206, 34, -47, 271, -153, 191, 76, 435, -17, 293, + 317, 296, 420, 428, 229, -205, 59, 157, 169, 416, + -116, 220, 136, -27, -149, 79, -203, 49, 124, -40, + 82, 6, 103, 41, 19, -6, 115, 22, -38, 52, + 26, 31, -7, -1, 26, 35, 46, 54, -24, 3, + 33, 52, 33, 128, 40, -96 + }, + { + 16, 4683, 423, 393, -819, 6, -186, 161, -238, -702, + -995, -999, -283, -7, -283, -214, 89, -307, 176, -966, + 295, -703, 320, -407, 171, 414, -57, 306, -127, -647, + -907, 495, -191, 116, -523, 41, -94, 32, 191, 391, + 43, -51, 508, -296, 158, 567, -17, 198, 398, -30, + 284, -82, -208, 140, 135, -279, 235, -121, 75, -137, + 265, -269, 187, -146, 179, 52, -58, 9, 163, 201, + 148, 17, 19, 81, 52, -107, -77, -41, 109, 44, + -60, -17, 47, 38, -77, -12, 0, -53, -20, 0, + 20, 49, 22, -54, 11, -18 + }, + { + -19, 1240, -54, 288, 250, -28, 88, -170, -125, -10, + -9, 39, 223, -493, -1926, -757, -333, 561, -413, -859, + -875, -3, -910, -132, 789, -1, -445, -511, 326, 185, + 83, -410, 64, 713, -581, -329, 880, -590, 315, -268, + 75, 1, -370, -55, 15, 212, 91, -117, 592, -71, + 13, -194, -211, -22, -47, -71, -71, 258, -48, 86, + -154, -11, 220, 121, -147, 103, -16, -105, -40, 24, + -47, -132, -14, 60, -74, -40, 22, 176, 21, 11, + -25, 116, -9, 12, -25, -50, -1, -30, 79, 90, + -22, 21, -47, 38, 24, -23 + }, + { + -1880, -17189, 940, 75, -221, -44, -174, 346, 168, -167, + -93, -142, 460, 26, -370, -1025, 308, 378, -144, -764, + -495, 557, -528, 76, -318, -521, -585, -183, -542, 349, + 551, 75, -263, -320, 215, 264, -1022, -1004, -587, 66, + -329, -279, -260, 40, 10, 61, 415, -342, 245, 450, + 120, -41, 147, 342, 175, -92, -200, 162, -166, 149, + 32, -26, -53, -3, 105, 81, -227, -41, 131, 14, + -37, -121, -177, -22, -190, -35, -27, -19, 101, 62, + 23, 40, 41, 29, -28, -134, -1, 13, -78, -72, + 16, -51, 37, -107, 17, -62 + }, + { + -37, 1053, -133, 80, -16, 15, 54, -83, 261, 257, + -367, -114, -419, -1815, -4016, 754, 57, 7, 390, 672, + -207, -981, -10, -668, -821, -792, -116, -949, 597, -164, + -662, -86, -709, 810, 870, 245, 98, 32, -59, -30, + -260, -368, -256, -310, 242, -235, 0, 223, 102, -218, + 120, 46, 173, -7, 276, 121, -112, 386, 4, 142, + -298, 5, 130, -90, -114, -155, 158, -112, 52, -36, + -169, -33, -218, -223, -7, 10, 196, -48, -97, 151, + -27, -29, -3, 8, -104, -6, -44, 84, -25, 11, + -1, 6, -12, -45, 69, -49 + }, + { + -4003, -15747, 952, 1080, -101, 112, 247, -317, 604, 643, + -312, -261, -213, -803, -769, 310, 525, 403, -496, -57, + 345, 50, -531, 435, 265, 231, -69, 210, 58, -489, + -50, 360, -160, 10, -275, -221, 189, -434, 327, -54, + 125, -165, 354, -315, 315, 33, -289, -167, 174, 302, + 131, 480, -361, 148, 353, -124, 215, 260, 106, 51, + 24, 51, 23, 228, -154, 108, 23, 152, -57, 69, + 87, -71, -32, -38, 75, -1, 49, 98, -101, 75, + -73, -12, 77, 71, 61, -14, 77, 11, -18, -6, + 4, 25, 11, 27, 9, 101 + }, + { + -25, 1078, -432, 154, 3, 129, 82, 91, -476, 141, + -388, 167, 433, 114, -375, -590, -842, -982, -594, -1349, + 297, -806, 520, -699, -101, 200, -40, 799, -756, -1750, + -701, 472, -262, 851, 241, -210, -130, 681, -464, 382, + 546, -642, 374, -266, 218, 151, 232, 111, -359, 90, + -62, 479, -142, 234, 264, 100, -144, -178, -109, 57, + -64, -75, -29, 132, 45, -143, -75, 83, -102, -8, + 198, 8, -93, -23, -26, -113, 8, -12, 39, 130, + -98, -127, 124, -60, 36, -59, 1, -85, 23, 16, + 47, -57, 7, -20, 51, 6 + }, + { + 842, -26388, -569, 2301, 404, -402, 576, 137, 448, 158, + 612, -1969, -479, 474, 525, -1310, 620, 552, -148, -150, + 78, -861, -131, 672, 485, 68, 112, 61, 111, 101, + -41, -103, -305, 604, -219, -316, 77, 192, -419, -340, + -717, -158, -89, 109, -144, -136, 388, 298, -308, -10, + -70, -455, 276, -143, 284, -28, 188, 240, 47, -5, + -139, -57, 36, 8, 48, 55, 0, -44, 94, 45, + 111, 35, -152, -32, 67, -24, 3, 97, -44, 21, + 49, 20, 10, 125, -45, -86, -43, -83, -29, 85, + 48, -37, -51, -39, -41, 105 + }, + { + 269, 1465, -1260, -611, -694, -252, 707, 697, -230, 571, + -726, -142, -689, -1521, -760, 9, -277, 375, 843, 901, + 224, -598, -374, -358, 268, 137, -236, -737, -400, -246, + -71, -285, 668, 979, -354, 21, -457, 1310, 75, -679, + -37, 88, -511, 330, 122, 438, 96, 141, 127, 202, + 323, -62, -95, -292, -148, -3, 93, 81, -228, -7, + 385, 87, -262, 111, -61, -10, -186, -224, 282, -5, + 313, -188, -233, 24, 143, 103, 24, -21, -41, -127, + 86, -65, 92, 77, -31, -71, 6, 8, -80, -23, + 58, 33, 102, -66, 43, 61 + }, + { + -1386, -14812, 1681, 1357, -1125, 1656, -146, 860, -531, -388, + -399, 612, 1008, 2113, -789, 331, -681, 98, -555, 307, + -210, -304, -442, -645, 254, -30, -346, -104, 47, 682, + 372, 39, 64, -171, 190, 282, -48, 184, -343, 462, + 262, -262, -497, -291, -155, 132, -141, 12, 185, -331, + -542, -413, -165, 483, 68, 253, -109, -27, 361, -176, + -195, -352, 118, 48, -131, -74, -183, -190, 210, -61, + 26, 173, -1, 47, 255, -34, 21, -64, -211, 41, + 58, -14, -139, 17, 48, 47, 21, -22, -46, 30, + 47, 40, 62, 36, 24, 13 + }, + { + 74, 3486, -569, 508, 638, 451, -49, -319, -149, 171, + 130, 102, 34, -1217, 2798, -736, -457, -100, 1546, -956, + -250, -146, 240, 566, -383, -721, 532, 814, 229, 363, + 318, -184, 927, -411, -287, 150, -186, 431, 963, 503, + 547, -45, 34, 485, 79, 304, -36, -184, 189, 152, + -132, 208, -361, 12, -227, -15, 137, -250, 251, -197, + -218, -209, 92, -23, -169, -259, 188, -82, 25, -124, + 55, -96, -84, 254, 148, 11, -92, 141, 78, -34, + 36, 153, 5, 52, -8, -28, -19, 52, 46, 67, + -40, -37, 6, 78, -76, 36 + }, + { + 1921, 10200, -1992, 1744, -1128, -410, -328, -754, -1385, -1189, + -553, -703, 253, 64, -89, 1069, -407, 424, -703, -328, + 944, -1222, -583, 661, 810, 242, 286, 425, -12, -388, + -311, 109, -753, 516, 139, -120, -108, -980, -258, -81, + -95, -385, 507, -301, -121, -270, 237, -137, -549, -109, + 58, 27, -216, 623, -257, 275, 138, 400, 24, -184, + 299, 138, 42, 103, 242, 77, -74, 107, 130, 115, + 189, -25, 135, 29, 39, -112, -124, -160, -16, 26, + 259, -146, 97, -85, -114, 210, -7, -83, 84, -20, + 15, 30, -32, 81, -2, -56 + }, + { + -428, 927, 1023, 249, 318, 408, -794, -376, 112, -767, + -53, -24, 165, -1497, 2636, -257, 664, -548, -1165, 1476, + 248, 724, -155, -831, -811, 291, 978, 1537, -338, -239, + -300, -668, -336, -23, -931, 277, 105, 163, -251, -272, + -375, -206, 55, -238, -4, 381, -242, 9, -299, -67, + -391, 206, -300, 80, 98, -12, -395, -216, 210, -162, + 244, -9, 40, -19, 122, 33, -227, -96, 207, 97, + 132, 232, 225, -31, -135, 184, 22, -64, 4, 62, + -93, 7, 39, -108, -89, -53, 88, 42, -79, -36, + 87, 19, 24, 55, 18, -18 + }, + { + -434, 7700, -530, 178, -947, -1214, 847, 622, 405, 125, + 928, 1045, 217, 804, 593, -25, 1303, -413, 175, -148, + -716, -268, -126, -412, 420, -1455, 113, -200, 17, 1248, + -323, 215, -402, -332, -234, -501, -199, -840, 365, -676, + -540, 287, -796, 280, -174, -11, -153, -217, 632, -11, + -8, -214, -117, 121, 208, -108, -85, -15, 113, -68, + -151, 162, 9, 117, 49, -86, -112, 57, 95, -60, + -46, -13, 65, 24, -11, 2, -175, -23, -25, 36, + -121, 30, 53, -127, -2, 52, 35, -20, 119, -65, + 48, 10, -5, -41, -66, -44 + } + }, + { + { + -84, 1646, -715, 935, 375, 48, 230, 452, -90, 603, + -583, 855, -1176, 42, -1630, 791, 162, -53, 456, -931, + -825, -840, -224, -1654, -553, 356, -597, -318, -682, -696, + -639, -148, -35, 471, -339, 579, 128, 575, -420, 116, + -171, -44, 134, -134, 158, 343, -48, 190, -47, 113, + 9, -116, 166, -12, 49, 19, -271, -57, 296, 120, + 261, 145, -37, 308, 229, 45, -20, -44, -4, 132, + 54, 31, 84, 176, -80, 64, 120, -105, 81, 31, + 34, -97, -29, -11, 73, -38, 1, 25, 69, 10, + -8, -73, -21, 24, 36, -28 + }, + { + 1024, 6519, -1818, -163, -902, 123, -185, -225, 137, -525, + -707, -959, 369, -461, 522, -410, 521, 104, -21, 69, + 262, 545, -149, 182, -460, 605, -138, 184, 470, 214, + -418, -142, -58, -353, 225, -122, -138, 121, -169, -328, + -513, -426, -129, 323, -572, -31, 7, 390, -315, -14, + 180, -23, -55, 118, -131, -340, 12, -12, -44, 137, + -184, 169, 45, -15, -100, 133, -85, 243, 120, -18, + 33, 39, 192, 36, 125, 72, 162, 9, -82, -91, + -69, 151, 26, -77, 10, 94, 21, 17, -47, 21, + 51, 43, -5, 45, 22, -32 + }, + { + 56, 1510, -1355, 2016, 240, -161, -400, -29, -15, 240, + 887, 327, -180, 864, 713, -84, 271, 731, 975, -687, + 667, -875, 402, -240, -379, -21, -537, -422, -404, -387, + -431, 790, -402, 114, -405, -121, -3, 243, -124, 451, + 162, -44, 300, -492, 164, 461, -37, 51, 20, -205, + 298, 4, -265, -158, -138, -310, 16, -164, 195, -136, + 255, -230, 285, -47, 25, -10, -37, 28, 246, 46, + -84, -67, -41, -44, -20, -113, -62, -43, -59, -98, + -48, -23, -21, -1, -51, 11, 75, 0, -37, 12, + 4, -19, -23, -20, 67, 55 + }, + { + 72, 1628, 169, -154, 2, -21, 35, -143, 82, -157, + -283, -90, 362, -289, -822, 1805, 1244, 41, 95, 173, + 493, 971, -617, 139, -36, 475, 519, -1298, -32, -553, + -341, 50, -323, 748, -6, -593, 423, -564, -93, -410, + -9, 197, 160, 425, 292, -426, -595, -251, 304, -268, + 176, -81, -194, -86, -31, 187, 107, 75, 32, 413, + 177, -2, -93, -21, -61, 189, 39, 55, 15, -16, + 173, -8, -88, 51, 84, 51, -56, 35, -52, -47, + -108, 5, 20, 52, -8, -19, -39, -94, 2, -4, + -30, 32, -60, 25, 1, -67 + }, + { + 2713, -14874, -1733, 1078, 358, 112, -31, 503, 51, -316, + -677, -276, 429, -263, -334, -374, 1074, 600, -49, -134, + -21, 39, -1259, 287, -14, -54, 170, -476, -947, 580, + 607, -77, -570, -80, 172, -33, 332, 491, 515, 515, + -145, -167, -682, -406, 160, -52, -119, -197, 302, -42, + -344, -115, 159, 239, 95, -258, -159, 120, -259, 127, + 18, -101, -197, -71, -11, 140, 80, 73, 55, -28, + -4, -82, -122, 32, -285, -12, -38, -68, 16, -26, + -1, -16, -8, 99, -27, -103, 79, 40, -70, -33, + 72, -8, 102, -57, 39, -49 + }, + { + -40, 386, -520, 134, -71, -9, 5, -123, -2, -237, + -524, 250, 113, -400, -2801, -993, -1394, 240, 34, 463, + 218, -567, 398, -544, -591, -151, -184, -1338, -781, -1211, + -159, 635, -727, -216, -82, -38, -137, 189, 141, 95, + -224, -29, 46, -390, 36, -238, 60, 334, 51, -363, + 49, -6, 28, -236, 355, 84, -375, 150, -86, 241, + -137, -16, 61, -44, -84, -126, 203, 56, 183, 99, + 100, 134, -160, -83, 59, -193, 42, 35, 22, 159, + -61, 4, 26, -12, -16, 55, -36, 89, -59, -11, + 48, 47, -45, -36, 82, -44 + }, + { + 4439, -9391, -2902, 2443, 675, -1, -82, -970, 24, 303, + -155, -68, -501, -385, -328, 713, 445, 396, 343, 130, + 85, -411, -582, 147, -65, 37, -19, 421, 355, 32, + 27, -128, -339, 206, -168, -303, -81, -862, -52, -57, + 147, -8, 683, 107, 738, 291, 8, -108, 62, 100, + -75, 443, -472, 45, 368, -209, 96, -91, -91, -18, + 61, 284, 37, 139, 12, 109, -328, -95, -103, 178, + 170, -24, -72, -106, 122, 2, 16, 182, 0, 65, + -23, 6, -8, -54, -11, -48, 24, 7, 0, 72, + -11, -15, 45, 17, -40, 4 + }, + { + -79, 377, -938, 127, 32, 41, 48, 103, -430, 99, + -227, 298, 89, -879, -1017, 438, 996, 147, -742, -8, + 2059, 366, 1503, -70, -79, 605, 429, 789, -872, -104, + 530, 391, -21, 1220, 517, 15, 56, 440, 8, 410, + 199, -577, 324, -18, 296, -144, -20, 368, 7, 82, + -81, 80, -339, -13, -77, 162, -118, 27, -81, -114, + -43, -183, -75, 141, -34, -191, 76, 25, -114, 50, + 157, -61, -77, 18, -35, -80, 41, 36, 69, 87, + 20, -56, 100, 66, -16, -95, 69, -29, 49, -25, + -10, -71, -42, -28, 21, -38 + }, + { + 986, -24795, 124, 3221, 821, -625, 66, -105, 496, -182, + 1354, -293, 759, 969, 1520, -954, -24, -325, -185, -393, + -120, -510, 0, 369, -63, -212, -215, -375, -29, 67, + -480, -396, -75, 226, -599, -97, 344, -189, -583, 92, + -264, -64, -70, -54, -116, -63, 14, 74, -23, 680, + 448, -296, 194, -253, 302, 59, 116, 107, 239, 157, + -148, -56, -125, -51, 95, 30, -31, -16, 189, 100, + 163, 66, -141, 15, 112, -55, -77, 64, -40, -38, + -47, 28, 9, 47, -38, -13, 22, -100, -87, 47, + 48, -31, -12, 10, -74, 91 + }, + { + -224, 3283, 512, -288, -140, -438, 404, 369, -231, 634, + -907, -331, -104, -637, -587, 297, 81, -454, -1114, 745, + 783, -698, -566, -757, -654, -225, 153, -177, -8, 533, + 439, -260, -206, 535, -497, -43, -584, 681, -135, -381, + -108, -78, -279, 406, -356, 251, 16, 214, 285, -40, + -191, -258, 79, -144, 23, -72, -112, -94, -324, -65, + 331, 61, -248, -12, -145, 139, 42, -201, 49, 21, + 370, -1, -66, 124, 168, -9, -32, 16, 89, 8, + 184, -76, -2, 13, -38, -20, 38, 54, -2, -12, + -17, -2, 22, -107, 0, 12 + }, + { + 1468, -14981, -1515, 407, -2152, -889, -2773, 905, 590, -74, + -538, 334, -337, 326, -1680, 247, -591, 57, -451, 96, + 83, -139, -629, -579, 63, -524, -24, 15, -313, -95, + -6, 27, 265, 27, -153, 154, -133, 241, -108, 299, + -54, -287, -122, 71, -129, 179, -120, 130, 269, -28, + 78, -95, -61, 388, -127, 228, -107, -4, 290, -89, + 102, -50, 162, -12, -108, 22, -89, -200, 60, -208, + -64, 115, -42, -40, 112, -189, -97, 16, -66, 121, + 58, 2, 2, 9, 25, 74, -48, -12, -28, -28, + 24, -18, 41, 59, -17, -33 + }, + { + 5, 3396, -830, 277, 80, 356, 244, -401, 88, -19, + -297, -30, 195, -200, 3399, -527, 111, 367, 2046, 818, + 1199, 364, -398, -289, -297, 335, 1569, 1250, 926, -49, + 513, -52, -36, -127, 177, -12, -122, -100, 293, -35, + -202, -202, 55, 383, 65, 437, 57, -187, -100, -88, + -9, 330, -349, 71, 57, 326, 161, -172, 376, 10, + -10, -157, 322, 62, -106, -231, 292, -14, 47, -115, + 100, -37, -98, 260, -55, -179, -51, 85, 6, -18, + -11, 29, -82, 39, 22, -60, -97, 17, 2, -13, + -42, 6, 48, 87, -63, 58 + }, + { + -3350, 5846, 307, 1215, -1376, -1738, -1262, 510, -266, -1044, + -26, -723, 221, 481, 132, 1075, 301, 1227, -513, -1015, + 443, -959, 315, 1236, 561, 99, 310, 108, 141, -48, + -311, 34, -400, 575, -319, -60, 406, -385, 256, -155, + -245, 14, 793, -107, 615, 142, 379, 47, -368, 98, + 42, 18, -256, 403, -499, 118, -57, 315, 113, -249, + 179, -47, -37, 171, 266, 94, -73, -23, -139, -64, + 179, 22, 97, -83, -40, -110, 78, -42, -39, -177, + 78, -180, 2, -114, -95, 164, 30, -34, 98, 21, + -15, 59, -85, 27, 27, -8 + }, + { + 459, 44, -564, -226, -24, 570, -207, -197, 748, 266, + 494, 548, 370, -2607, 1959, 65, 695, -1380, -810, 1184, + -1495, -922, -895, -838, -1021, -894, -551, -136, -251, 104, + 182, -20, -123, 282, -329, 523, -123, -43, -68, 80, + -92, 32, -94, -332, -186, 560, -315, -325, -105, 208, + -324, 147, -297, 167, -166, -318, -209, 52, 226, -67, + 388, -169, -68, 16, 49, -40, -130, -34, 236, 90, + 61, -36, -8, 100, -68, 60, 27, -37, -54, 88, + -20, 2, 65, 60, 77, -3, 59, 8, -11, -38, + -4, -38, 20, 49, 12, 29 + }, + { + -880, 8750, -238, -866, -548, -1377, 188, 378, 530, 633, + 602, 509, 345, 20, -76, 315, 871, -441, 297, 94, + 230, 74, -409, -1338, -63, -1195, 367, -53, -297, 1185, + 188, 68, -265, 26, 282, -252, 73, -1281, 284, -139, + -312, 638, -28, 901, 94, 46, 94, 153, 919, 37, + -175, -124, -106, 56, 189, 60, 131, 221, 283, 82, + -198, 68, 0, 102, -67, -154, -142, -226, 58, 88, + 34, -3, 57, 87, 25, 40, -36, 91, 6, -4, + -207, -37, 105, -92, 95, 52, -38, 17, 102, -123, + 4, 10, 88, -10, -67, 78 + } + }, + { + { + 36, -5, 564, 743, 618, -42, 182, 259, 27, 788, + -260, -61, -225, 182, -1989, 703, 654, 203, -507, -1156, + 361, -1187, -226, -1291, -302, -570, -331, -225, -315, -1032, + -452, 80, -344, 761, 5, 473, -71, -177, 149, 179, + -56, -181, 104, 92, 319, -209, 99, 384, 163, 144, + -220, -221, 127, 6, 191, -135, -195, 42, 121, 138, + 227, 230, -30, 234, 175, -32, 78, -51, -55, 87, + 97, 122, -2, 140, -43, 98, 73, -96, 41, 1, + 32, -63, 0, 35, -47, -44, 42, 43, 19, 59, + -36, -6, -44, 15, -4, 28 + }, + { + -727, 827, 4321, -1853, 659, 176, -532, 352, 47, -844, + -595, -317, -24, -263, -101, 667, 214, 252, -100, -335, + 699, 767, -447, 34, -135, 353, 68, 487, 212, 275, + -527, -80, -472, 130, 227, -428, -124, 109, -340, -474, + -66, -591, 60, 92, -416, -195, -32, 167, 194, -77, + 92, -48, -327, 49, -57, -76, -123, -65, -112, -34, + -67, -4, 18, -3, 77, 14, 75, 176, -19, 180, + 38, -20, 185, 18, 144, 57, 94, -23, -57, -30, + -57, 162, -43, -55, 60, 47, 50, -32, -28, 17, + 2, 69, 44, -22, 13, -1 + }, + { + -104, -1462, 899, 1558, 744, -253, -179, -55, 139, 405, + 652, 483, -75, 873, 732, 218, 537, 493, 415, 547, + -221, 216, -36, -204, -91, -486, -581, -564, 74, -239, + -357, 294, -329, -112, 100, -126, -288, 427, -501, 640, + 214, -116, -82, -269, 323, 126, 19, 193, -73, -68, + 36, 100, -77, -204, -364, -112, -85, 37, -31, 58, + -22, 163, -50, 37, 14, 77, -31, -8, 228, -17, + -110, -27, -41, -66, -176, 24, -17, -21, -99, -46, + -37, -52, -39, -41, 32, -42, 58, 65, -45, -5, + -9, 13, -62, 11, 40, 57 + }, + { + -74, 1649, 441, -391, 36, 51, -90, 46, -40, -291, + 66, -283, 201, 727, 844, -410, 1984, 309, 239, 106, + 248, 911, -469, 79, -481, 443, 1054, -745, -959, -91, + 135, -519, -672, 504, 241, -29, 271, -275, -733, -207, + -15, 283, 241, 410, 247, -367, -624, -172, -5, -49, + -117, -19, 12, -143, -135, 182, 120, 163, 199, 164, + 292, -21, -178, -78, 56, 85, 139, -3, 38, -2, + 128, 7, -2, -52, 142, 37, -51, -43, -87, -7, + -68, -45, 37, 35, 0, -59, 35, -77, -55, -49, + 17, 3, -8, -20, -23, -58 + }, + { + -2958, -10502, 918, 1719, 69, 172, -119, 574, -36, -505, + -304, -998, 852, -35, -871, 385, 407, 88, 1066, -50, + 137, -869, -761, 380, -59, 509, 306, -216, -1298, 195, + 35, 130, -21, -309, -142, 238, 1031, 251, 677, -253, + 351, -161, -439, -551, 228, 212, -459, -108, 324, -356, + -290, 8, -129, 364, -61, -103, -32, -215, 55, 131, + -234, 101, -233, -64, -20, 169, 46, 77, 40, 81, + -146, 2, -118, 15, -89, -77, -53, -20, -39, -27, + -54, 35, -33, 98, -41, -98, 112, 16, 26, -14, + -15, -2, 61, 43, 3, 9 + }, + { + 6, -421, -257, -27, 208, 6, -34, -221, 14, -457, + -36, 60, 162, 517, -1949, -1683, -1540, -76, 517, 65, + 260, -214, -18, -999, -294, 1454, -1268, -1023, -408, -1330, + -343, -141, 61, -237, -848, 442, 141, 58, -126, 124, + 99, -81, -257, -371, -194, 54, -68, 214, -208, 95, + 214, 7, -215, -31, 211, -87, -183, -4, -10, 251, + -23, -2, -73, -27, 44, -58, 2, 152, 147, 116, + 87, 73, -56, -38, 68, -117, -37, 5, 41, 70, + 25, -116, 64, -10, -17, 83, 19, 38, -65, 27, + 29, -20, -8, 6, 14, 0 + }, + { + -3781, -3563, 1738, 3682, -435, -262, -259, -362, -320, -561, + 212, -210, -148, -134, 414, -217, 461, 629, 77, 365, + 69, -481, -104, -371, -28, 6, 241, -61, 368, 344, + 103, -307, -449, 491, -221, -507, -362, -809, 94, 150, + -137, 453, 159, 632, 563, -50, 257, -110, 153, 8, + -71, 253, 2, -82, 235, -116, 55, -92, -64, -130, + 35, 249, 134, -19, 31, -2, -217, -190, 52, 127, + 90, 39, -64, -71, 19, 35, 35, 100, 12, 38, + -20, 53, -63, -58, 29, -100, 1, 48, -1, 80, + -25, 23, 24, -21, -12, -68 + }, + { + 24, -933, -41, -106, 123, 60, -11, -34, -245, -2, + 83, 100, -590, 106, -905, -199, 1463, 155, -815, 872, + 1105, 1226, 645, 225, 549, 609, 831, -154, -760, 825, + 135, -107, 648, 1015, 929, -279, 392, -71, 595, 262, + -421, 0, -374, 87, 351, 128, 7, -148, 520, -135, + -66, -224, -24, 16, -191, -10, -28, -93, -22, 37, + -78, -241, 25, -27, -61, -128, 223, -128, -115, 138, + 41, -12, -59, 34, -76, 9, 50, 46, -2, 107, + 49, 4, 43, 21, 38, -86, -6, 65, 26, -1, + -62, -54, -43, 5, 18, 10 + }, + { + -2360, -19894, -73, 4638, -593, -378, -379, -175, 909, -468, + 362, 1450, 661, 869, 1033, 171, -866, -214, -91, -182, + -562, -279, 161, 116, -145, -4, -52, -491, -118, -104, + -311, -724, 365, -467, -149, 168, 56, -401, 136, 96, + -101, -569, 81, -165, 55, 240, -165, -78, 78, 536, + 413, 78, 73, 11, -121, 144, 87, 43, 235, 192, + -112, -103, -129, 51, 49, -36, 1, 31, 42, 196, + 149, 41, -66, 48, 22, -52, -19, -65, -20, 35, + -23, -52, 10, 41, -40, 32, -7, -55, -62, 8, + -1, 3, -18, 52, -68, 30 + }, + { + 187, 3573, -322, -13, 168, -385, 144, -13, 96, 231, + -84, -507, -801, 927, -497, -470, 486, -431, -1632, 333, + 982, -406, -436, -820, -553, -70, -76, 252, -107, 825, + -50, 50, -789, 241, -245, -109, -40, 123, -81, -466, + -131, 231, -56, -136, 23, 166, 18, 39, 287, -162, + -271, -198, 39, -101, 85, 29, -100, -129, -275, -121, + 56, 214, -291, -1, -51, 86, 61, 17, -197, 84, + 127, 206, 61, 168, -18, 11, 76, -89, 86, 82, + 88, 5, -22, -94, -35, 62, 65, 17, 15, 4, + -30, 12, -49, -36, -36, 15 + }, + { + -1521, -12839, -150, -767, -213, -2122, -1961, 292, 755, -147, + -168, 427, -660, -356, -854, 63, -439, -678, -186, -740, + 563, -18, -383, -549, -96, -456, 395, -351, -433, 46, + -197, 13, 244, -128, 103, 38, 273, -368, 300, 235, + -316, -69, 72, 218, -107, -74, 78, 146, -71, 274, + 159, -178, -32, 138, -92, 315, -59, 130, 74, 111, + 85, -11, 18, -151, 90, -76, 33, -177, -64, -72, + -40, 27, -26, -48, 18, -77, -208, 57, -46, 119, + 30, 4, 59, -11, -8, 61, -84, 35, -38, -12, + -8, 4, 20, 50, -5, -60 + }, + { + -65, 2472, 412, -166, -232, 253, 612, -143, 14, -70, + -525, -46, -432, 1079, 1761, 1518, -590, -24, 2208, 1163, + -168, 2100, -497, -597, -507, 1028, 1517, 501, 1628, -232, + 85, 206, -297, 295, 66, -21, 63, -24, -401, 84, + -225, -259, 229, 160, -87, 502, 156, -84, -312, -301, + 356, 81, -81, 1, 45, 311, -94, 279, 89, 21, + 204, -143, 80, 86, 110, -95, 171, 31, -81, 84, + -81, -96, 50, 36, 9, -42, 6, -55, -65, -5, + 89, -64, -117, 68, 30, -59, -74, 51, -29, 30, + 15, -4, 35, -8, 59, -12 + }, + { + 3536, -1382, 162, -139, -426, -1878, -1012, -10, -351, -145, + -496, -649, -107, 848, 970, -121, 966, 231, -202, -610, + -465, -271, 587, 1195, 237, -46, 328, -263, 592, -179, + 162, -386, 125, -150, -8, 89, 62, -46, 221, -91, + -308, 212, 598, 54, 396, 436, -90, -123, -41, 322, + -70, 15, 243, -22, -170, -153, -107, -25, 309, -74, + 125, -94, -62, 203, 128, -54, 95, 25, -134, -196, + 140, 195, -81, -10, -11, -80, 34, 29, -132, -99, + -73, -5, -92, -109, -65, 37, 81, 74, 11, -17, + 10, 76, -59, -23, 28, -22 + }, + { + -447, -258, 377, -177, 119, -70, 322, -62, 501, 733, + 360, 622, 139, -777, 316, -635, 418, -938, -263, -1054, + -428, -1727, -224, -968, -284, -1291, -734, -400, 341, 140, + 218, 221, 82, 67, 148, -65, 333, -354, 91, 312, + -267, 191, -577, -189, 79, 547, -250, -557, 34, 82, + -49, -99, -91, -202, -19, -337, -16, 156, -29, 157, + 188, -141, -243, 34, 94, -153, 147, 20, -1, 94, + -50, -37, 47, 210, -34, -160, 128, 76, -30, 47, + -60, 33, 26, 83, 45, 53, 48, 31, 55, -67, + -92, -27, 5, 37, 18, 19 + }, + { + 1937, 6113, -111, -696, -803, -961, -490, 410, 588, 352, + -34, 959, 201, 123, -602, 754, -324, -403, 361, 684, + 566, -240, -567, -813, -298, -1076, 311, 66, 255, 368, + 347, 109, -16, -373, 349, -373, 15, -533, -329, 4, + 7, 378, 665, 412, 30, 75, 212, 374, 446, 244, + -311, -38, -109, 207, 68, 10, 129, 236, 195, 188, + -34, -44, -82, 75, -17, -89, -73, -159, -103, 86, + 63, -52, 97, 84, -5, 116, 34, -16, -10, -56, + -60, -22, 38, -10, 33, 78, -70, 26, 29, -18, + -116, 32, 98, 21, -54, 94 + } + }, + { + { + 12, -807, 164, -297, -280, 18, -47, 29, -28, 795, + 23, 211, 594, 465, -1337, 34, -862, 57, -73, 222, + 1297, -643, 517, -1157, -312, -264, 592, 468, 520, 50, + 45, 267, -600, 320, -113, 362, -345, -455, 205, 263, + 210, -145, -186, 102, 480, -233, -89, 331, 124, 154, + 157, -45, 93, 37, 115, -111, 20, 18, -29, 32, + 18, 120, -110, -14, 48, 12, 96, 39, 73, 13, + -35, 58, -65, 135, 14, 84, 34, -41, 31, -36, + 25, -32, 32, 32, 9, 9, 33, 37, -15, 20, + -46, 16, -31, 26, -7, 38 + }, + { + 598, -5062, -1223, -1842, 273, -149, -193, -74, -370, 153, + -87, -290, 246, 6, -268, 594, -306, -64, -70, -463, + 383, 490, -235, -285, -573, 54, -108, 439, -11, 101, + -102, 212, -315, 77, 71, -344, -333, -59, -188, -188, + 248, -262, 249, 171, 3, -1, -99, -197, 16, -175, + -23, 38, -147, 154, -8, 52, 82, 8, -125, 15, + 12, -51, -50, 57, 133, -29, 64, 188, -9, 108, + -14, -55, 82, -37, 46, -52, 7, -46, 3, 76, + -42, 34, -67, -38, 43, -1, 49, -54, -64, 9, + 4, 42, 32, -60, -14, -1 + }, + { + 124, -2376, -586, -448, -198, 72, 65, 25, 13, -448, + 144, 785, -680, 8, 650, 73, 135, -36, -484, 346, + -167, 345, 411, 367, 324, 21, -44, -306, 41, -139, + -38, 50, -527, -164, 205, 70, -248, 355, -531, 206, + -19, 83, 129, -81, 226, 39, 27, 134, -73, -6, + 17, 55, -18, -83, -101, 120, -4, 232, 54, 23, + -138, 177, -124, 6, -36, 53, -27, -86, 75, -31, + -48, -32, -22, 54, -65, 14, -13, 102, 3, 53, + 31, 11, 19, -57, 31, -25, -25, 10, -37, -10, + 19, 50, -54, -25, -11, 29 + }, + { + 75, 1066, -227, -302, 80, 19, -100, 98, 23, -171, + 91, -390, -46, 431, 1983, 46, 515, -808, -276, 165, + -117, 885, -29, -83, -173, 250, 652, -17, -444, 284, + 134, -671, -409, 251, -63, 337, 540, -136, -331, 223, + 331, 317, -158, -4, 258, 21, -128, 12, -150, 128, + -105, -47, 102, -10, -75, 87, -117, 110, 106, -200, + 134, 34, -130, -104, 114, 16, 56, 25, 34, -79, + -43, -70, -26, -67, 65, -11, -30, -16, -62, 9, + -26, 19, -11, -15, 44, -36, 37, -26, -8, -17, + 13, -24, 35, 9, -20, -39 + }, + { + 2556, -4273, 489, 2229, -113, 192, -251, 50, -371, -344, + 627, -599, 738, 27, -546, 527, 19, -486, 922, 204, + -119, -443, 21, -90, -352, 292, -159, 617, -448, 61, + -57, -104, 13, -25, -124, -118, 236, -298, 570, -292, + 404, 21, 52, -196, 33, 143, -303, -77, 197, -364, + -97, 75, -312, 90, -205, 80, 40, -288, 35, 209, + -110, 154, -173, -60, -48, 133, -79, -25, -17, 62, + -115, 59, -93, 28, 4, -11, 55, 63, -17, 4, + -38, 15, -37, 56, -24, -54, 44, -40, 36, 17, + -2, -8, 4, 17, 7, 21 + }, + { + 57, -631, -445, -94, 100, 46, -31, -117, 172, -167, + 357, 158, -113, 45, -273, 236, -1000, 134, 309, -364, + 644, -62, -156, -690, -280, 1786, -228, -280, 436, -527, + -3, 9, 213, 161, -442, 148, -190, 117, -38, 75, + 312, -104, -366, -194, -151, 135, -108, 43, -177, 268, + 276, -10, -135, 132, 151, 0, -85, -37, -81, 69, + -106, -89, -95, 29, 199, -26, -101, 60, -59, -18, + 40, 41, 7, 67, 137, -67, -41, 4, 38, -40, + -5, -109, 18, 0, -22, 26, -14, 3, -82, 14, + 4, -30, 9, -5, -2, 7 + }, + { + 2312, 1755, -315, 3450, -404, 34, 416, 163, -521, -742, + 358, 69, 604, 292, 614, -74, 304, 280, 3, 233, + -627, -619, 100, -490, -62, 68, 347, -100, 76, 18, + -58, -38, -305, 299, -60, -185, -168, -308, 304, -93, + -401, 237, -118, 72, -108, -219, 285, -176, 73, 66, + -185, 140, 390, -23, 27, -58, 201, 68, -52, -88, + -31, -13, 18, -44, -48, -14, -30, -6, 47, 8, + 18, -4, 7, 1, -40, -40, -59, -2, -37, -12, + -49, 46, -36, 19, 44, -52, 18, -7, -47, 21, + -56, 42, 32, -31, -8, -63 + }, + { + 69, -464, 475, -191, -104, 18, -46, 93, -98, -19, + -2, -158, -433, -27, -237, -480, -548, -324, -174, 991, + 39, 135, -100, -124, 775, 644, 142, -34, -396, 624, + 206, -446, 432, 11, 154, -436, 344, -320, 307, -31, + -605, 152, -280, 8, -173, -51, 59, -281, 434, -199, + -21, -210, 101, 72, -129, 6, -31, -181, -45, 118, + 66, -38, 78, -59, -30, -157, 94, -69, -29, 98, + 12, 6, -54, 50, -31, 35, 40, 39, -39, 58, + 33, -38, -38, -54, 71, -39, 11, 58, 21, 58, + 0, 15, -7, -6, 9, 19 + }, + { + 2982, -12032, 294, 3808, -1028, 62, -49, -145, 629, -223, + -77, 334, -619, 62, 471, 423, -585, 394, 356, 77, + -165, -182, 94, 147, -271, 142, 258, -456, -162, 36, + 107, -368, 422, -355, -86, -15, -12, -59, 595, 25, + 177, -82, 289, -37, 26, 211, 30, 52, -70, 76, + 158, 127, 46, -46, -212, 54, -69, -74, 115, 62, + -128, -41, 2, 59, -54, -54, -17, 35, 19, 108, + -13, -9, 12, -11, -18, -14, 2, -68, -30, 85, + 51, -65, -40, 35, 0, 27, 7, 43, -30, -8, + 18, 33, -64, 36, -16, -12 + }, + { + -135, 2828, 151, 430, -7, -631, -398, -199, -48, 96, + 144, -342, -60, 1098, -385, -287, 136, 146, -340, 516, + 464, -104, 590, 184, 317, 110, 88, 1046, 28, 354, + -267, 253, -596, 124, -240, 58, -24, -65, 29, -279, + -177, 253, 41, -231, 72, 148, 131, -77, -45, -313, + -93, -30, 76, -40, 175, 108, -71, -125, -50, 67, + -108, 174, -104, 37, -98, 30, 21, 73, -74, 64, + -51, 50, -45, 101, -93, 4, 139, -93, -26, 6, + 10, -13, -8, -21, 72, 17, -17, -39, 0, 5, + -42, 20, 1, 35, -23, -5 + }, + { + 1481, -9476, -402, -16, 779, 224, -191, -479, 411, -100, + 27, 434, -339, 204, -441, 314, -45, -563, -106, -198, + 315, -167, 150, -319, 133, 114, 299, -351, 43, 302, + 33, 186, 152, -131, 159, -172, 300, -130, 244, 9, + -64, 55, -74, 75, -33, 41, 27, 39, -93, 249, + -67, -282, -109, -42, -1, 259, -111, 62, -4, 56, + -1, -18, -48, -218, 61, 32, 208, -116, -49, 66, + -19, 37, 84, -27, -47, -13, -94, 91, -68, 70, + 39, -27, 7, 41, -22, 25, -82, 50, 9, 21, + -4, 32, -4, 9, -7, -51 + }, + { + 112, 1555, -279, -115, -91, 318, 476, -79, 81, 23, + -302, -101, -149, 1317, -268, 115, -674, -24, 1401, 235, + -425, 1852, 204, 243, -682, 353, 217, -496, 1153, -120, + 10, 34, -441, 167, -154, -17, 180, 4, -408, 260, + -34, -45, 300, -154, -316, 83, 57, 165, -34, -103, + 263, 34, 42, -106, -150, 62, -193, 216, -25, -55, + 147, 6, -57, -159, 147, 25, 42, 15, -88, 55, + -30, -82, 25, -2, 67, 32, 72, -49, -85, 1, + 98, -41, -107, 66, 93, 45, -19, 18, -27, 65, + 67, 16, -1, -32, 41, -42 + }, + { + -2266, -8972, 77, -479, 350, 726, 977, -57, -617, 498, + 286, 22, 274, 624, 191, -426, 381, -669, 123, 139, + -292, -591, -88, 418, -293, 302, 358, -660, 647, -38, + 189, -425, 222, -326, -46, 95, -18, 107, 290, 24, + -158, -56, 208, -109, 44, 227, -276, 3, 143, 196, + -130, -70, 161, 44, 75, -136, -102, -108, 202, -32, + 129, -88, -180, 19, -6, -140, 98, 84, 5, -68, + 58, 143, -18, -8, 8, -24, 35, 87, -4, 3, + -102, 44, -40, -26, -1, -44, -6, 31, -34, -54, + -27, 36, -43, -17, 32, -21 + }, + { + 405, -551, -794, -55, 133, -363, 73, -360, -351, -87, + -298, 370, 913, -1326, -629, 243, 821, -260, 144, -779, + 467, -550, 877, -278, 495, -267, -215, 137, 352, -494, + 136, 317, 77, 375, 294, -343, 380, -247, -125, 82, + -124, 348, -327, 44, -3, 145, -193, -100, 222, 52, + -33, -81, 84, -239, 175, -136, 56, 152, -179, 22, + 50, -88, -186, 10, 35, -149, 242, 70, -148, -12, + -7, -3, 53, 198, 9, -92, 114, 67, 18, 55, + -58, 17, -76, 13, -8, 38, 37, -20, 14, -53, + -56, 2, -46, -16, -8, 4 + }, + { + -2215, 1450, 654, -35, 1068, 622, -339, 1, 3, -440, + -572, 353, -759, -439, -823, 78, -792, -14, 321, 358, + 174, -546, -84, 264, 272, -456, 545, -58, 111, -149, + -158, 64, 83, -337, 348, -274, 136, 163, -55, 14, + 202, 188, 19, 11, -81, -189, -47, 118, 191, 32, + -361, 81, 57, 178, -46, -90, 62, 37, -63, 215, + 142, -60, -129, -29, -1, 102, 31, -75, -52, 145, + 40, -95, 39, 47, -50, 53, 23, -76, -41, 8, + 19, 13, -38, -27, 22, -2, -94, 56, 4, 10, + -60, 26, 19, 17, 8, 66 + } + }, + { + { + -35, -442, -192, -465, -118, 10, -98, 20, 122, 184, + 613, 475, 208, -27, -774, -314, -757, 19, 83, -62, + 994, 187, 287, 148, -878, -10, 110, 166, 674, 648, + -22, -201, 257, -115, -53, 26, -43, -346, -72, 260, + 19, 47, -119, 58, 201, 64, -55, 138, 44, 187, + 170, 39, 33, 125, -5, 7, 74, -20, -68, 61, + -4, 111, -61, -7, -59, 75, 81, 39, 150, -13, + -31, -7, 14, 14, 70, 58, 28, -2, -4, -8, + 21, 24, 22, 13, 24, 24, -2, 47, -19, -5, + -24, -13, 1, 42, -16, 10 + }, + { + -578, -5623, -731, -665, -396, -102, 105, -453, -350, 113, + -136, 113, 26, -207, 96, 177, -336, 107, -201, -374, + 483, -136, 277, -319, -734, 52, -106, 213, 67, -203, + 257, -122, 203, -220, -220, 41, -175, -206, 4, -82, + -14, 40, 128, 41, 239, -65, -95, -80, -105, -121, + -75, -7, 191, -42, 33, 40, 45, 113, -72, -38, + 75, 12, -133, 134, 87, 39, 32, 111, 48, 34, + 12, -42, -4, -8, 9, -55, 5, -29, 44, -3, + 17, -21, -43, 0, 7, 15, 11, -30, -47, -9, + 24, 21, 30, -34, -23, -6 + }, + { + -76, -1149, -1219, -1349, 114, 101, 212, 54, -110, -258, + 14, 304, -104, -273, -81, 133, -108, -132, -91, -117, + 358, 118, 371, 318, 266, 127, 28, -20, -242, -179, + 69, -46, -317, -282, 251, 106, -55, -219, -25, 25, + 9, 48, 114, 49, 127, 124, -169, 53, 110, 81, + -59, -17, -9, -27, -65, 47, 79, 145, 87, -12, + -41, 37, -1, 27, -83, 2, 21, 21, -59, 24, + 8, -51, -37, 55, -7, -9, -33, 47, 62, 48, + 25, 32, -23, -18, 28, 5, -46, -28, -9, -15, + 28, 26, -22, -13, -16, 1 + }, + { + -123, 562, 208, -81, -18, -12, -81, 56, -11, -75, + 40, -208, 14, 458, 1780, 427, -926, 323, -704, -441, + 433, 453, 188, -76, -37, -92, 369, 199, -76, 433, + -485, -666, 180, 196, -14, 304, 377, -26, -49, 131, + 265, 260, 38, -161, 50, 136, 77, 31, -116, 167, + -181, 19, -13, 93, -44, 10, -75, 72, 6, -166, + 10, 79, -96, -43, 68, 39, 33, 29, 16, -19, + -133, -90, -45, 4, -2, -14, -5, -5, -50, 2, + 19, -4, -2, 11, 6, 1, 0, 12, 0, -16, + -8, 7, 14, 34, -23, 6 + }, + { + -1606, 2294, -711, 2312, 344, -5, -217, -118, -99, -344, + 260, 263, 139, 15, -11, 212, -48, -273, 453, 204, + -214, -103, -85, -287, -4, 174, -333, 469, -12, -116, + 89, -151, 57, -58, 18, 41, -422, 45, 100, 6, + 261, 43, 52, 31, -210, -26, -67, -56, -174, -75, + -9, -64, -13, -173, -98, 44, -2, -65, -19, 17, + 51, -32, 34, -55, -42, -20, 21, -90, 20, -37, + -75, 22, -33, 32, -16, 10, 44, 56, -5, 18, + -35, -9, 21, 1, -26, -40, 6, -13, 11, 5, + 8, -5, 8, -28, 11, 21 + }, + { + -14, -499, -206, -46, -94, 54, 29, -39, -11, 205, + 175, 9, 27, 67, 17, -480, 205, -210, 315, -459, + 198, 254, -283, -8, -144, 402, 662, -135, 62, -240, + 184, 190, 91, 345, -177, -301, -39, 17, 253, 12, + 68, -107, -226, -133, -37, 62, 26, -143, 56, 112, + 230, -54, 30, 85, -17, 48, 56, -95, -46, -71, + -88, -69, -103, 82, 150, -19, -49, -44, -61, -13, + 1, 58, 69, 24, 106, 23, -43, 12, 40, -83, + -29, -41, -39, 12, 5, -11, -1, -28, -32, -13, + -1, -25, -23, 26, -4, 2 + }, + { + -555, 4871, 304, 2911, -236, 144, 158, 254, -292, 15, + 1, 30, 621, 201, 290, -77, 332, 346, 118, 92, + -573, -529, 16, -376, 71, -19, 180, 167, -28, -220, + -50, 61, -107, -46, 186, -105, -267, -6, -25, -59, + -63, 38, 4, -241, -73, -199, -7, 112, -123, 84, + -228, 294, 157, 85, 21, 30, 103, 36, 56, -61, + 1, -27, -98, 43, -65, -38, 25, 83, -25, -44, + 55, -24, 22, 39, -50, -47, -54, -31, -7, -27, + -17, 3, -10, 54, -25, 15, 14, -47, -24, 1, + -15, 1, 10, -7, -29, -11 + }, + { + -21, 260, 53, 2, -81, -26, 8, -16, 29, -76, + -26, -147, -19, -151, 220, -655, -931, -594, -59, 969, + 488, -584, -230, -15, 458, 447, 198, -222, 37, 153, + 313, -255, -283, 174, -54, -170, -36, -201, 130, -34, + -221, -103, -106, 26, -416, -21, 70, 35, 37, -201, + 59, -72, 137, 8, -45, -47, 12, -101, -77, 82, + 82, -20, 45, -60, 28, -104, -45, 37, 11, -30, + 60, -4, -2, -34, 44, 11, 46, -23, -10, 39, + -17, 18, -36, -38, 22, -15, 15, 35, 2, 48, + 19, 17, 1, -31, 42, -14 + }, + { + -2760, -3460, 55, 2671, -41, -35, 54, -39, 114, 328, + -297, -398, -376, -102, 383, 147, 31, 209, 131, 296, + -32, -202, -57, 72, -167, 243, 151, -243, -307, 47, + 14, 64, -163, 41, -187, -91, 46, 166, 488, 36, + 49, 140, 146, 85, -66, 147, 207, -113, 85, -116, + -28, 202, -61, 38, -139, -111, -16, -34, 86, -54, + -59, -9, 73, 0, -66, -14, -47, 21, 38, 27, + -25, -45, 90, -33, 9, -9, -39, -7, 0, 50, + 18, -27, -47, 21, 37, 1, -6, 25, 0, 2, + -16, 24, -16, 6, 12, -5 + }, + { + 39, 1721, 564, 518, -84, -251, -425, -365, 117, -245, + 136, -154, 35, 494, -18, 162, 133, -167, 756, -110, + 353, 166, 115, 530, 451, 325, -218, 631, 434, 238, + -250, -28, 70, -98, -296, 137, -189, 290, -160, -207, + 147, 18, -143, -182, 156, 54, 158, -43, -205, -149, + 73, -47, 90, -42, 87, 28, 29, -116, -43, 44, + 31, -8, 0, -23, -5, -7, 42, 31, 36, 0, + 7, -77, 14, 31, -59, 37, 27, 2, -46, -30, + -11, -33, 21, -2, 77, -6, -37, -13, -23, -36, + 10, 1, 17, 35, -6, -16 + }, + { + -1369, -5830, -194, 349, 552, 425, 399, -346, -175, -125, + 157, 338, -9, 171, -250, 299, -20, -111, -287, 121, + -269, -52, 138, -50, -165, 539, -240, 199, 203, 110, + 286, 105, 94, -84, 2, 21, 187, 105, -78, 6, + 109, -25, 39, -27, -6, -60, 78, -21, 68, 105, + -160, -137, -192, -36, 134, 42, 26, -29, -21, 98, + -101, 28, -105, -60, -92, 73, 90, 8, -100, 117, + 47, -4, 80, 14, -36, -54, 29, 43, -54, -3, + 44, 5, -7, 23, 4, 12, -42, 17, 26, 16, + 3, 19, 11, -3, -17, 0 + }, + { + -160, 806, 337, -137, 312, 380, 35, 243, 50, -42, + -38, -315, 124, -15, 431, 26, -712, 346, 485, 298, + 522, -249, 892, 321, 7, 221, -504, -27, 504, -162, + -46, 201, -183, -242, -114, -53, 222, 62, -111, 29, + 121, 80, 52, -96, -209, 47, 154, 11, 52, 199, + -30, -15, 113, -197, -51, -66, -27, 1, -32, -40, + 79, 19, -15, -113, 1, 89, -16, -37, 17, 26, + -17, -77, 55, -7, 66, 9, 71, -30, -31, 44, + 0, -46, 8, 14, 87, 12, 5, -7, -18, 58, + 58, 32, 6, -5, -3, -13 + }, + { + 45, -11706, -1521, 287, 410, 1674, 809, -374, -607, 633, + 366, -57, 336, 115, 87, -103, -311, -171, -114, 351, + -215, -493, -262, 228, 169, 220, 17, -342, 62, 328, + 33, -241, 6, -57, -116, -44, -65, 268, 172, 170, + -44, -199, -25, 147, -266, 77, -3, -73, 119, 85, + 46, -150, 32, 111, 9, 0, -83, -65, 25, 19, + 94, -43, -91, -174, -12, -31, 60, 36, 19, 126, + 3, 3, 114, 14, -16, 16, 32, 33, 11, 18, + -58, 1, 5, -5, 5, -55, 7, -18, -15, -61, + -8, -11, 1, -3, 17, -14 + }, + { + -377, -563, -86, 115, -12, -256, -160, -17, -639, -230, + -388, 293, 697, -81, -981, -32, 497, 222, -32, -500, + 245, 246, 504, -167, 305, 106, 89, 305, 11, -185, + -224, 499, 3, 80, 261, -44, -32, 171, -115, -157, + 70, -91, 16, 72, 71, -121, 23, -6, 95, 35, + 80, -106, -2, -150, 154, 40, -10, 93, -146, -2, + 8, -27, -36, -91, 21, 4, 14, 64, -7, -89, + -11, 53, 107, 90, 18, 24, 53, 22, 23, 16, + -7, 0, -48, -13, -34, 5, 39, -22, 15, -40, + -34, 18, -53, -15, -3, -12 + }, + { + 1529, -3391, -416, 512, 791, 516, 456, -315, 133, -716, + 212, -580, -463, -301, -840, -198, -266, -228, 223, 120, + -114, -198, -231, 519, 86, 212, 25, -23, 135, -93, + -126, -168, 90, -5, -120, 22, 2, 386, -24, -204, + 194, 127, 12, 50, -168, -177, -112, -37, 231, -66, + -94, 4, 88, 3, 66, -20, -38, -4, -30, 107, + 166, 37, -146, -74, -13, 116, 22, -24, -51, 136, + 25, -33, -3, 57, -39, -18, 11, -71, -10, -51, + 35, 44, -58, -5, -23, -17, -63, 51, 26, -6, + -14, -3, -20, 26, 30, 6 + } + }, + { + { + 26, 189, 91, 378, 462, -47, -69, -77, -112, -69, + 249, -125, -112, 248, -107, 562, -62, 562, 193, -595, + 633, 121, 66, 438, -600, 224, -155, -528, -4, 554, + 153, -62, 461, -216, 9, -24, 8, -97, -74, 110, + -94, 77, -78, -90, -35, 97, 47, 69, -33, 32, + 11, -38, 1, 116, -74, 74, 76, 1, 9, 61, + 9, 163, 1, 88, 60, 85, 28, 1, 70, 9, + 21, -6, 19, -48, -9, 17, 23, -32, 0, 7, + -10, 1, -13, 5, 18, -6, -48, -1, -20, -13, + -25, 8, 8, 19, -19, 6 + }, + { + 377, -4059, -555, 565, 200, 86, 185, -239, -5, -132, + -425, 75, -42, -34, 15, -79, -209, 218, 145, 138, + 561, -283, 381, -59, -778, -149, -43, -20, -129, -217, + 90, -385, 456, -3, -172, 177, 143, 188, 264, 4, + -137, 84, 105, -32, 218, 145, 61, 35, -20, -40, + 53, -51, 106, -137, 22, 68, -17, 68, -15, -25, + 5, 53, -92, 42, 6, 56, 9, -2, -32, -34, + -29, -44, 0, -13, 16, -15, 58, -38, 16, -41, + 12, 12, -11, 9, -17, 20, 7, 15, -8, 6, + 5, -12, 9, -1, 2, -18 + }, + { + -40, 189, 383, -11, 390, -62, 121, 122, 112, 98, + 152, 47, -134, -158, 56, 118, 11, 294, 269, -372, + 81, -360, 45, 90, 7, -43, -145, -191, -141, -25, + -74, -181, 87, -86, 206, 68, -247, -269, 293, 62, + -242, -78, 11, -134, -36, 42, -192, -26, -28, 47, + -11, 35, 6, -23, -65, -13, -18, -12, 24, 4, + -27, -2, 8, 35, -34, 11, 68, 67, -57, -19, + 9, -51, -67, 19, -12, -7, -69, -28, -1, -13, + -4, 49, -2, 0, 34, 3, -20, 5, 6, -20, + 2, -8, -10, 6, -17, -11 + }, + { + 171, 430, -161, 40, 71, -19, -29, 44, -49, -161, + 93, 154, 181, 110, 1217, 350, -548, 407, -492, 152, + 573, 193, 87, 126, -135, -283, 359, 153, -3, 362, + -257, 47, 426, 166, -51, 120, 61, -203, 92, 34, + -10, 48, -8, -152, 76, 111, 65, 86, -92, 122, + -22, 83, -134, 88, -30, -75, -94, 4, -11, -5, + 30, 77, -3, -7, 41, 29, 12, -31, -30, 43, + -53, -48, -17, 24, 10, -16, -2, 18, -2, 27, + 26, -19, 5, 16, -6, 3, 9, 28, -3, -13, + -5, 16, 8, 34, -14, 11 + }, + { + 412, 5271, -571, 2161, -93, 27, -50, 20, 86, -316, + -123, -38, -89, 87, -79, 26, -290, -188, 263, -143, + -181, 65, -107, -107, -21, -72, -310, 409, 83, 7, + 110, -98, 203, 155, 123, 63, -303, 3, 78, 164, + 111, -160, -215, -74, -201, -129, -108, -63, -218, 48, + 110, 12, 128, -32, 46, 52, 101, 59, -83, -27, + 129, -94, 25, -25, -21, -24, 84, -26, 47, -75, + -67, 26, 1, 18, -73, -11, 25, 31, -14, 14, + -45, -11, 14, -17, -14, -40, -12, -17, -27, -9, + 33, 8, 16, -22, -16, -2 + }, + { + -58, -511, 4, 72, -69, 3, -2, -19, -2, 166, + -95, -44, 85, -265, 207, 156, 828, 504, 355, -532, + 21, 307, 263, 249, -507, 189, 758, -2, 47, -498, + 160, 358, 80, 611, 129, -277, -132, -123, 130, -78, + -28, 18, -17, 13, 14, -73, 19, -59, 60, -45, + 20, -152, 6, -15, -57, 8, 29, -62, -17, -52, + 26, 61, -6, 77, 59, -13, 36, 37, 20, 57, + 12, 57, 91, -9, 12, 32, 8, -1, 21, -56, + -21, -13, -12, 17, 3, -22, -5, -6, 6, -18, + 3, -19, -33, 23, -6, 15 + }, + { + -936, 4666, 25, 2599, -222, 73, -75, 392, -49, 344, + -32, -291, -27, -368, 106, 44, 56, -29, 281, 299, + -23, -281, 133, 76, 189, -247, -208, 44, -14, -160, + -128, 67, 100, -133, 77, -39, -158, -50, -102, 145, + -23, -76, 148, -258, -47, -233, -203, 59, -77, 152, + -244, 93, -32, 151, 74, 29, -17, -51, 55, -40, + 42, 48, -57, 99, -20, -38, 28, 62, -36, -55, + 35, 20, 14, 51, 34, 8, 3, -13, -15, 14, + 48, 2, -16, 5, -53, 20, 18, -37, -11, 13, + 15, -4, -4, -2, -28, -5 + }, + { + -58, 74, -131, 108, 68, 3, 14, 71, 190, 0, + 185, 53, 15, -458, 342, 578, 746, 347, 98, 474, + 78, -452, -143, -430, -174, 240, -7, -244, 166, -49, + 228, -188, -635, 27, -50, 62, 177, -74, -69, -116, + -30, 129, 154, 111, -375, -3, 32, 88, 42, -61, + 213, -43, 67, -105, -14, -50, -50, 56, 43, 64, + 31, -111, -50, -41, 94, -71, -51, 8, -54, -56, + 93, -33, -49, -56, 67, 6, 0, -67, -19, 12, + -29, 26, 0, 2, 1, -20, -8, 3, -17, -5, + -9, 5, -12, -36, 38, -24 + }, + { + 1816, 3272, -4, 2333, 76, -4, 102, 101, 60, 88, + -305, -348, -1, -98, 33, -192, 45, 55, -245, 122, + 41, -37, -43, -79, -213, 29, 66, -47, -256, 89, + -83, -32, -358, 153, 14, 89, 141, -60, 35, -192, + 83, 310, 49, 26, -115, 39, 101, -238, -31, -255, + -208, 88, -175, 90, 90, -85, 9, 11, 55, -29, + -29, 19, 17, -46, -16, -12, -49, 20, 0, -38, + 2, -10, 77, -10, 29, 33, -8, 34, 9, 41, + -11, -31, 0, 15, 8, -26, -27, 14, -15, -4, + -10, 15, -4, 0, -12, -11 + }, + { + 63, 1171, -413, 69, 227, -131, -182, -55, 119, -294, + 57, 59, 64, -2, -129, 223, 306, -250, 777, -98, + 105, 84, -245, 196, 224, 283, -77, 173, 148, 196, + -103, 129, 282, -29, -378, 121, -197, 289, -186, -74, + 186, -230, -205, -95, 3, 33, 41, -80, -15, 69, + 133, -105, 62, -49, -37, 25, 48, -122, 26, 42, + 83, -38, 42, 57, 21, -35, -18, -59, 7, -9, + 34, -62, -10, -6, -28, 19, -37, 45, 5, -7, + 23, -8, 9, -12, 16, -27, 4, 11, -5, -16, + 2, -30, -8, 18, 5, 1 + }, + { + 1288, -3534, -1099, 626, 339, -424, -1, -110, -272, -133, + 6, 380, 36, 23, -145, 334, 113, 76, -353, 74, + -438, -119, 198, 169, -159, 506, -156, 412, 432, -17, + 53, 29, 127, -71, -14, 46, 38, 86, -190, -126, + 41, 19, 139, 118, -4, -100, 70, -66, 27, 12, + -80, 84, -43, -69, -15, -47, 62, 7, -35, 56, + -86, 74, -15, 12, -106, 27, -52, 20, -57, 28, + 0, -14, 42, 28, -21, -54, 49, 21, -58, -9, + 18, 13, 12, 1, 11, 17, -15, -5, 9, 7, + 0, -2, 7, 0, -22, 15 + }, + { + 188, 224, -523, -149, 424, 308, 69, 380, 7, -157, + 97, -67, 42, -866, 273, 126, -384, 178, -351, -68, + 93, -1162, 342, -203, -252, 220, 43, 196, 21, -622, + -243, 203, 199, 96, 81, -168, 26, 163, 29, -71, + 78, 22, -72, -104, -93, 148, 147, -76, 31, 243, + 20, 56, 60, -129, 57, -16, 14, -71, -14, -28, + -53, -35, 55, -30, -38, 29, 23, -32, 60, 30, + -20, -37, 16, -41, 35, -15, 53, 4, 51, 63, + -7, -5, 35, -15, 25, -41, -17, -19, -39, 1, + -6, 3, 16, 19, -18, -6 + }, + { + 2066, -9116, -1300, 783, 829, 567, -756, -279, -355, 471, + 472, 162, -20, -417, 59, 43, -199, 25, -474, 63, + -22, -257, -179, 206, 48, -389, 18, 134, 49, 175, + 52, -101, -143, -67, -110, -120, -208, 55, 59, 162, + 86, -68, 16, 301, 48, 302, 1, -144, -88, -123, + -119, -137, 124, 127, -38, -37, -104, -23, -5, -74, + 29, 8, 13, -89, 6, -8, 2, -7, 63, 139, + 17, 2, 96, -1, -29, -36, -39, 1, -13, -3, + -15, 6, 13, 12, 53, 2, 31, -4, 23, -8, + 27, 16, -2, -6, 15, -5 + }, + { + 355, -427, -578, 59, -31, -43, 97, 321, -77, 206, + -219, -77, 209, -562, -380, 741, 219, 170, -46, -105, + 448, 86, -99, -629, -145, -56, 228, 667, 290, 261, + -437, 50, -141, -4, 187, 122, 192, 295, -188, -90, + 58, -99, 58, -103, -17, -63, 108, 89, 38, -38, + 117, -66, -17, -52, 110, 96, -66, 66, 33, 10, + -71, 8, 84, -30, -14, -15, -94, 21, 81, -65, + -2, 4, 42, 26, -1, 11, 16, -5, -2, 5, + -7, 29, 11, 31, -18, -19, 47, -14, 35, 18, + 7, 44, -10, 11, 31, 9 + }, + { + -217, -6692, -1015, 593, 268, -533, 41, -416, 16, 37, + 617, -535, 136, 178, -289, 239, 201, -437, -418, -454, + 172, 99, -415, 79, 127, 462, 88, 26, 120, 71, + 95, -102, 29, 141, 47, 131, -83, 56, 9, -121, + -131, -190, -161, -13, -59, 37, 96, 58, 135, 41, + 152, 76, -67, -142, 46, 23, -39, -71, -70, 46, + 11, 70, -69, -42, 11, 63, 2, 38, 34, 107, + -12, 18, 5, 24, -24, -4, -15, -37, 34, -37, + 8, -27, -53, -1, -41, -14, -55, 27, 13, -16, + 15, -4, -38, 3, -8, -18 + } + }, + { + { + -22, 835, -384, 1032, -93, 13, -103, -92, -41, -4, + -187, -300, 73, 227, 188, 894, 299, 205, 200, -331, + -29, 188, 0, 375, -70, 48, -683, -251, -114, 319, + 64, 51, 275, -75, 67, -71, 78, 32, -108, 48, + 121, -196, -111, -31, 87, 35, 68, 49, -69, 1, + 39, -65, -28, -7, -29, 79, 39, 39, 50, 88, + 19, 49, 88, 74, 76, 59, 4, -6, -5, 24, + 61, -2, -1, -5, -41, 15, 18, -11, -46, 24, + -12, -8, -42, 15, 2, -15, -33, -18, -1, -19, + -13, 1, 12, -9, 6, 1 + }, + { + -42, -3322, 5, 412, 155, 101, -72, 180, 48, -196, + -623, 300, -128, 179, -17, -267, 78, 180, 292, 210, + 523, 23, -169, 73, -437, -215, 41, -161, -185, 127, + -285, -249, 219, 146, -50, 91, 153, 233, 139, 90, + -47, -5, 108, 23, 38, 128, 94, 66, 89, 15, + 65, -158, 15, -34, -88, 76, 7, -14, 28, 4, + -63, 43, -59, -19, 57, 19, 42, -64, -7, -52, + -41, -40, 27, -21, 49, -24, 46, -35, 12, -15, + -36, 34, -17, 9, 3, 19, -7, 17, 0, 15, + -24, -7, 0, 3, 8, -22 + }, + { + 143, -79, 718, 2046, -1193, -34, 20, 131, 195, 140, + 114, 32, 23, 116, 311, -333, 283, 180, 387, -47, + -148, -691, 225, 78, -142, -30, 26, -280, -66, -19, + -196, -310, 315, 23, -11, 82, -289, -63, 73, 211, + -228, -110, -94, -184, -36, 45, -74, -60, -60, -38, + 84, 99, -18, -94, -92, 1, -17, 7, -18, 45, + -51, -42, 43, -28, 46, 11, 54, -21, 36, -25, + -39, -6, -27, -16, -27, -20, -39, -35, -26, 11, + -4, 5, 11, 2, 29, -22, 18, 6, -4, -3, + 15, -33, -1, 4, -13, 5 + }, + { + -162, 383, 280, 29, 30, -41, 44, -82, 35, -116, + 15, 127, 373, 337, 281, 264, 1096, -865, 494, 294, + 115, 331, -110, 224, -275, 196, 249, 13, -211, 235, + 77, 35, 303, 245, -81, 94, -137, -28, -24, -71, + -56, 18, -43, 138, 23, 59, -4, 36, -32, -23, + 129, -10, -55, 86, -40, -93, -52, -4, -53, 52, + 61, 1, 28, 22, 53, -16, -10, -50, -19, 8, + 30, -34, 24, -8, 39, -10, -49, 13, 25, 15, + 26, -24, -3, 27, -28, 5, 10, 29, -33, -3, + 18, 5, 12, 2, -3, 4 + }, + { + 566, 4496, -460, 2030, 201, 53, 143, -232, -32, -284, + -10, -136, -279, 253, -509, 283, -303, 60, -41, -64, + -234, -3, -14, -20, 57, -158, -145, -49, 135, 13, + 171, 6, -16, 399, -7, -32, 144, -145, 157, 43, + 40, -136, -235, -114, -87, -76, -66, -114, -203, -50, + 144, 94, -36, 113, 54, 26, 129, 0, -3, 2, + 90, -96, 27, -5, -77, 28, 96, -6, 66, -69, + -46, 11, 30, 3, -65, -5, -6, -7, -7, -9, + -28, 1, 1, -14, -8, -18, -15, -18, -31, 19, + 12, 14, 11, 8, -20, -20 + }, + { + 31, -542, -119, 58, -68, 19, 15, -62, 40, 103, + -168, 1, -32, 441, -215, 255, 403, 871, 13, -135, + 60, 69, 226, -49, 143, 103, -323, 857, 110, -546, + 157, 38, 155, 456, 54, 46, -203, -106, -40, 50, + -129, -29, 167, 13, 2, -110, -68, 62, 8, 20, + -131, -49, -24, -87, 24, -21, -33, -15, -38, -5, + -2, 99, 65, 28, -4, 53, 42, 76, 13, 65, + 75, 38, 20, 38, -45, 39, 18, -20, -8, -10, + 8, -16, -20, 0, 22, -27, 20, -16, 5, -13, + -15, -1, -18, 3, 8, -9 + }, + { + 1667, 1766, -132, 2618, -379, 18, 42, 28, 20, 149, + 120, -218, -379, -284, -118, 168, 114, -51, 162, 233, + 244, -123, -182, 197, 64, -211, -138, -79, -109, -31, + -154, 122, 72, -54, -36, 36, -72, -210, -56, 141, + -102, -81, 68, -36, -127, 32, -223, -87, 5, 9, + 16, -129, -48, 139, 63, 35, 10, -74, 24, -8, + 52, 25, 18, 15, -8, -9, 35, -18, -39, -16, + 2, 71, 1, 14, 94, -8, -19, -6, 26, -6, + 39, 27, -28, -45, 10, -1, 20, -37, -7, 18, + 17, 5, -8, -2, -16, -19 + }, + { + 9, -37, -289, 64, 18, 63, -38, -25, 332, -25, + 197, -29, 138, -160, 83, 548, 717, 486, 287, -69, + 123, 3, 1, -423, -201, 340, -199, -234, -217, 550, + -255, 126, -210, -158, -67, 115, 152, 165, -80, -231, + -33, 180, 175, -36, -150, -120, 60, 49, 85, -12, + 153, -44, -21, -27, -75, -37, -24, 34, 51, 53, + -35, -66, -52, 16, 69, -81, -9, -57, -49, 12, + 72, -76, -56, 10, 1, 16, -13, -63, -19, 25, + 2, 6, 24, 2, -10, -10, -13, 6, 1, -11, + -14, -7, -17, -35, 21, 3 + }, + { + -507, 6669, 116, 2421, -222, -58, -45, 178, 128, -147, + -334, -28, 53, -45, 116, 4, -238, 36, -290, 212, + 161, -24, -145, -33, -96, -1, -75, -26, -65, -30, + -153, -211, -69, -8, 164, 72, 17, 77, -155, -43, + -18, 239, 63, -28, 3, 35, -56, -185, -59, -185, + -82, -38, -34, 40, -22, 67, 14, 93, -128, 44, + -38, 69, -73, -33, 39, -48, -2, 9, -30, 12, + -8, 38, 19, 13, 12, 31, 37, 23, 12, 10, + -36, 4, 7, 12, -16, -13, -23, 11, -21, 9, + -7, -7, 3, 1, -17, 0 + }, + { + -113, 1225, -172, -244, 278, -291, 158, 122, -40, -258, + 36, 159, 203, -38, 98, -165, 255, -163, 526, -73, + 129, -184, -152, 89, 189, -137, 203, 98, -113, 212, + 219, -22, 334, -169, -359, 218, -78, 57, -115, -9, + 58, -118, -181, -36, -157, 75, -41, -49, 55, 129, + -4, -77, -8, -56, 18, 36, -18, -24, 2, 28, + 73, -37, 32, 51, 6, 18, -41, -65, -11, -23, + 36, 21, -66, 24, -26, 24, -25, 28, 11, 25, + 21, 6, -12, -2, -38, 20, -2, 1, -5, 19, + -17, -2, -31, -11, 15, -1 + }, + { + -1273, -1805, 216, 382, 161, -297, -479, 4, -300, 127, + -57, 294, -165, 198, 7, -138, 383, -74, -169, -349, + -286, -68, 45, 206, -114, 304, 211, 137, 284, -19, + -74, 136, 45, -58, 288, -74, -200, 196, -161, -65, + -159, 119, 180, 82, 51, -117, 100, -73, 6, 54, + -62, -9, 53, -43, -161, 60, 23, 65, -32, -113, + 34, 36, 42, -12, -12, -20, -80, 2, 1, -34, + 2, 9, -27, 32, -18, -38, 48, -55, 20, -9, + -1, 18, 36, -1, -2, -21, 16, -7, -16, -9, + 18, -16, 17, 16, -17, -7 + }, + { + -163, -331, 437, -321, 332, 9, 432, 286, 7, -187, + 98, -19, -38, -736, 442, -268, -11, 114, -781, 406, + -613, -182, -459, 49, 102, -301, 179, 620, 24, -677, + -70, 134, -9, 172, 209, -7, 6, 42, -181, -132, + 175, 18, -174, -149, 85, 142, -23, -79, 151, 21, + 66, 80, -3, 29, -82, 90, -6, 8, 17, -29, + -128, 33, -19, 46, 13, -76, 37, 53, 9, 43, + -76, 1, -25, -8, 13, 4, -7, 26, 76, 1, + 38, 17, 5, 0, -16, -16, -31, -1, -29, -21, + -14, 1, 6, 22, -28, 8 + }, + { + -3109, -3346, 907, 291, 1230, -949, -446, 397, -231, -208, + 387, 419, 63, -351, 23, -225, 183, 164, -685, 173, + -306, -141, 84, -104, 114, -509, 97, 194, 142, -41, + -3, 5, -211, -119, 51, -95, -105, -17, -102, 86, + 80, 66, 190, 173, 149, 386, -29, -75, -88, -111, + -277, 53, 1, -4, 20, -94, -65, 43, 1, -14, + -112, 37, 1, 24, -32, 7, -2, 54, 22, 37, + 56, 20, 19, 33, -61, -17, -41, 26, -38, -33, + -11, 19, -15, 31, 23, 27, 17, 27, -1, 5, + 16, 41, -9, -12, 4, 7 + }, + { + -307, -749, 495, 66, -78, 1, 286, 45, 478, 132, + -129, -99, -80, -914, 823, 345, 12, -2, 237, 208, + -156, 185, -323, -342, -558, 364, -504, 972, 362, 330, + -291, -367, 60, 239, -58, 148, 305, 138, -1, 75, + -141, -32, -46, -91, -121, 80, 66, 110, -31, -44, + 74, -5, 5, -24, 37, 23, -43, 99, 6, 73, + -100, 0, 30, -47, -30, -11, -25, -28, 75, -29, + 28, -72, 27, 32, -15, 11, 23, -9, -11, 45, + -12, 22, 13, 36, -6, 18, 14, 8, 32, 28, + -4, 16, 14, 18, 19, 16 + }, + { + -1067, -6009, 217, -411, 131, -104, -328, -3, -384, 363, + 279, -542, 551, -362, 572, 243, -257, -336, -306, -341, + 148, 82, -69, -297, 182, 177, 412, -120, 109, 136, + 155, -202, 154, 401, 1, 17, 31, -123, -30, -7, + -340, -50, -100, -142, 102, 82, 72, 113, 6, 102, + 73, 158, -231, 22, -97, 102, -80, 20, -100, 15, + -73, 135, -54, -34, 45, 6, 33, 72, -14, 72, + -20, 70, 2, -18, 18, -4, -22, -6, 12, -28, + 13, -22, -32, -7, -16, -48, -12, -16, 6, -9, + 18, -11, -15, -21, -22, -1 + } + }, + { + { + 59, 1397, -37, 170, -842, -44, -44, 62, 32, -77, + -394, -292, 257, 32, 162, 768, -10, -41, 57, -276, + -459, 85, -83, 66, -66, -212, -502, -45, -62, 275, + -27, -38, 125, -9, 94, -97, 35, 91, -86, -135, + 145, -97, -140, 138, 261, -102, -40, -12, -129, -9, + -3, -46, -45, -87, -11, 36, 30, 49, 29, 59, + 11, -3, 30, -5, 18, 23, -38, -73, -35, 8, + 35, -5, 3, 20, -20, -1, 8, 10, -46, -5, + -30, 5, -29, 26, 17, 5, 2, 4, -5, -27, + 2, -7, -10, -25, -4, -2 + }, + { + -107, -2930, 565, -1002, -786, -45, -20, 330, -42, 133, + -313, 130, 59, 565, 240, -407, -306, -89, 277, 170, + 438, 262, -84, 34, -155, 205, 317, -181, -278, 258, + -110, -157, -61, 43, -121, 41, -24, 82, -48, -13, + -85, -83, 110, -36, -2, 42, 26, 3, -28, -8, + 44, -183, 24, 51, -60, -1, 6, 56, 20, 43, + -23, 14, -61, -48, 48, -12, 41, -24, 65, 12, + -8, -52, 24, 1, 41, -39, 17, -54, -4, 6, + -38, 14, -16, 10, 14, 15, -20, -21, -30, 8, + -22, 5, 2, -5, 16, -10 + }, + { + -161, -365, 524, 2133, -759, 30, 92, 124, 100, -91, + -252, 167, 75, 55, 367, -417, 160, -117, 45, -215, + -176, -481, 66, -169, 62, 133, 302, 47, -36, 28, + -185, -165, 263, -89, -96, 9, -263, 143, -21, 174, + -113, -10, 15, -107, -77, 34, 43, 58, 26, 1, + 83, 55, -44, -55, -60, 72, 45, 41, -64, 50, + -37, 9, 99, -15, 64, -14, 13, -6, 83, 8, + -39, 18, -2, 8, -11, -6, 3, -12, -7, 23, + 11, 16, 1, -37, 10, -23, 1, 3, 6, 4, + 30, -7, 21, 7, -7, 5 + }, + { + 122, -263, -492, 97, 24, -52, 43, 10, 129, -115, + 17, 18, 103, 421, -92, -100, 938, -575, 817, 5, + 73, 78, -212, 156, -250, 308, 295, -2, -380, 314, + 226, -190, 20, 41, -210, -115, -270, -70, -167, -18, + 24, 23, -37, 207, 30, 23, -85, 89, 37, 38, + 96, 3, -13, 20, -58, -13, 28, 45, -61, -23, + -12, -59, 29, 56, 55, -60, 21, -9, -42, -5, + 46, -23, 31, -10, 25, 16, -17, -9, -14, -7, + 12, -18, -22, 9, -41, -8, 20, 34, -22, -2, + 12, -12, -2, -13, -7, 2 + }, + { + -965, 995, -1082, 1502, -496, 1, 31, -498, -247, -489, + -209, -480, -307, 410, -469, 528, -115, -227, -315, -12, + -248, -207, 165, 139, -23, -212, -300, -249, 7, -128, + 94, -19, -228, 89, -219, 3, 287, -124, 178, -83, + -149, -208, -28, 128, 42, -1, 106, 21, -113, -101, + 26, 51, -50, 130, 27, -27, 0, -41, 39, 4, + 35, -80, 20, 27, -9, 79, 50, -32, 62, -27, + -4, -4, -29, 0, -31, 20, -22, -16, -4, -8, + -21, -12, 18, 18, 8, 5, -9, -3, -6, 12, + -16, 6, 8, 18, -3, -4 + }, + { + 34, 159, 297, 2, -126, -6, -11, -31, 32, 29, + -40, 50, -48, 297, -339, -86, -698, 300, 132, -49, + 138, -144, 28, -17, 140, -38, -582, 771, 51, -543, + 244, -309, -241, 77, -49, 366, 168, 145, 16, -38, + -16, 68, 157, -10, -105, -98, -33, 17, -108, 39, + 13, 62, 19, -46, -3, -45, -46, -21, -46, 22, + -1, 101, 64, 22, -7, 13, -7, 33, 1, 21, + 22, 16, -15, 31, -57, 12, -10, -29, -6, -5, + 42, 10, -19, -4, 21, -28, 21, -14, 4, -7, + -26, 2, -7, -4, 12, -7 + }, + { + -1358, -2024, 233, 2885, 124, 60, -181, -167, 25, -302, + -37, -143, -1, 58, 43, 93, 13, -22, -94, -64, + -70, -56, -192, -198, -337, -162, 10, -215, -190, 31, + -93, 56, 79, 178, 74, 131, -65, -111, -100, -53, + -10, -67, 15, 149, -20, 161, -32, -64, -55, -34, + -67, -194, -88, -6, -7, 69, 55, -89, 35, -26, + 21, 19, -6, -37, -3, 29, 43, -16, -13, 2, + -12, 55, 3, -6, 30, -29, -9, -11, 14, -2, + 18, 30, 9, -3, 35, -10, 18, 2, 1, -1, + 13, 9, 1, 6, 17, 15 + }, + { + 59, 352, -107, -106, -174, 41, -71, -144, 156, -129, + 162, 28, 210, -128, -3, -485, -1092, -54, 631, -322, + -72, 367, 26, -212, -18, -169, -550, -218, 109, 679, + -347, 425, 398, 219, 81, -8, 120, -4, -119, -11, + -52, 38, 73, -93, -103, -70, 13, -25, 160, -32, + 14, -60, 15, -1, -35, -24, -26, -52, 2, 92, + 35, 44, 3, 3, 54, -51, 29, -35, -24, -5, + 21, -36, 6, 38, -11, 2, -14, -43, -8, 59, + 28, -1, 32, 3, 3, 15, 26, 27, 9, 8, + -8, -17, -6, -33, 2, 2 + }, + { + -702, 5451, -606, 2940, 266, -48, -112, -159, -144, -117, + -226, -28, -120, 397, 411, 288, -128, -35, -298, 279, + 241, 57, -37, 145, 40, 85, 41, 115, -31, -154, + -141, -135, 12, -52, 87, -134, 28, 196, -30, 62, + 3, 99, 41, -41, 123, 114, -22, -47, 189, -73, + -39, 78, 15, 33, -62, 119, 0, 36, -114, 134, + -25, 11, -21, 47, 13, -41, 33, 34, 19, 32, + -26, 42, 16, 6, 11, 12, 20, -2, 2, -3, + -48, -11, 6, 5, -29, 26, -9, -13, -26, 28, + 7, -17, -18, -6, -7, 18 + }, + { + 109, 1345, -6, -306, -132, 100, 508, 126, 254, -144, + -132, -196, 58, -114, -39, 16, -38, -94, 510, -387, + -211, -719, -417, 87, 2, -401, 236, -7, -349, 176, + 239, -38, 184, -260, -140, 157, -48, 142, -6, -26, + 161, 139, 73, 31, -169, 50, -8, -55, -31, 87, + -18, -85, 6, -28, 13, 27, -41, 62, 16, -42, + -4, -35, -21, 34, -19, 19, -7, -38, 15, -6, + 42, 43, -46, 61, 7, 50, 5, 19, 2, 7, + -20, 21, 18, 4, -15, 34, -9, -9, -16, 20, + -15, 2, -21, -12, 16, -10 + }, + { + 1254, -625, -1791, -311, -208, 89, -382, -235, -302, -80, + -249, 114, -214, 143, 135, -289, -110, -97, 297, 62, + 241, 169, -267, -85, -194, 174, 46, -303, -38, -169, + -133, 84, -81, -168, 368, 30, -207, 140, 1, 57, + -154, 83, 64, -15, 84, -30, 169, -77, -3, 109, + -94, -90, 10, -65, -142, 56, -84, -14, -36, -31, + 80, -35, -10, -55, 29, -8, -28, 27, 31, -14, + -7, 22, -37, 23, -1, -45, 20, -67, 40, 16, + 13, 12, 23, -2, -14, -29, 7, 9, -16, -11, + 13, -11, 15, 21, 5, -8 + }, + { + 108, -1111, -168, -239, -34, -157, 297, -64, -54, 83, + 9, -178, 69, -293, 365, -149, 136, 331, -273, 562, + -330, 409, -349, 309, 78, -162, -1, 143, -128, -308, + -44, -9, -130, 91, 145, -40, 72, -7, -131, -104, + 105, 59, -147, -149, 35, -118, -188, -202, 69, -37, + 39, 19, 55, 117, -137, -13, -45, 79, 65, 35, + -65, 86, -58, -58, -6, -27, -14, 32, -39, -4, + -68, 15, -53, -36, 37, 42, -2, 2, 12, -49, + 36, -2, -12, 5, -17, 11, -27, 8, -1, -20, + -23, 8, -3, 14, -20, 14 + }, + { + 2776, 3762, 54, -304, 997, -904, -47, 499, -446, -555, + -92, 433, 260, -261, 103, -136, 247, 178, -700, -23, + -416, 48, 351, -6, 260, -104, 285, 139, 74, -53, + 97, 51, -66, -59, 86, -49, -61, 182, -49, -163, + 36, 33, -4, 122, -90, 101, -53, -36, 12, 70, + -144, 107, 63, 19, -44, -49, 8, 53, -4, 28, + -65, 25, 16, 71, -28, 1, -11, 46, -28, -48, + 8, -20, -35, 5, -49, 26, 21, 41, -58, -44, + -55, 18, -31, 6, -2, -9, -11, 17, -10, -1, + 6, 43, 6, -10, 6, -1 + }, + { + 250, -1000, -254, 148, 14, 155, 395, -52, 472, -116, + -228, -81, 46, -142, 1779, 522, -141, -467, -114, 204, + 71, 308, 94, 162, -511, 389, -559, 441, -101, 221, + 57, -34, 126, 238, -185, -88, 194, 147, 146, 116, + -159, 16, 22, -36, 33, 137, -129, 6, 13, -35, + 49, -18, -12, -142, -55, -9, -85, 56, -52, 22, + -66, 10, -53, -52, 44, 21, 26, -6, 19, -28, + 39, -63, 2, 21, 17, 38, 26, -3, -18, 29, + -7, 27, -17, 29, 3, 33, 9, 3, 4, 0, + -18, 6, -6, 1, 15, 6 + }, + { + 1769, -2355, 146, -871, 89, 367, 14, 388, -325, 128, + 119, -21, 402, -554, 761, 194, -465, 13, 128, -20, + -38, -122, 116, -104, 171, -169, 276, -209, 153, 235, + 50, 7, 295, 257, -139, -94, -7, -112, -37, 214, + -32, -22, -21, -96, -40, -67, 4, 16, -145, -33, + -24, 151, -222, 21, -177, 42, -131, 36, -87, -23, + -93, 80, -11, 11, 58, -24, -10, 27, -95, 40, + -16, 53, 13, -9, 23, 13, -6, 3, 35, -14, + 36, 52, -2, 0, 33, -18, 3, -10, -11, -1, + 8, -20, -3, -8, -10, -1 + } + }, + { + { + -101, 1431, 109, -862, -98, 115, 30, -148, 319, -288, + -316, -200, 196, 35, 230, 310, -510, 453, -160, -304, + -413, -93, 27, -167, 104, -291, -86, -132, 13, 88, + 226, -240, 183, -19, -110, 189, -146, 185, 43, -177, + 169, -7, -317, 227, 263, -52, -113, -55, -65, -5, + -118, 33, 11, -55, 53, -3, -1, 45, 24, -7, + 49, -15, 48, -46, 44, 28, -41, -58, -24, 21, + -20, -2, 29, -1, 7, -23, 7, 20, -9, -35, + -15, -10, 20, 6, 7, 9, 13, 1, -13, -18, + -14, -10, -11, -5, -9, -4 + }, + { + 77, -2412, -348, -1667, -232, -182, 192, 161, -159, 224, + 293, -617, 449, 261, 352, -641, -138, 28, -143, 177, + 202, 575, -33, -168, 109, 51, 148, 93, -187, -60, + -190, 255, -45, -60, -228, 95, -157, 110, -121, 32, + -73, -66, 98, -60, -4, 100, -50, -23, -75, 64, + -47, -89, -39, 37, 87, -57, 7, 109, 44, 3, + 31, -8, -19, -37, 35, -3, -10, 21, 67, 30, + -30, -34, -7, 33, 10, -6, -43, -15, -5, 3, + -16, -7, -8, 5, 23, -2, -25, -9, -28, -8, + -6, 5, 0, -8, 10, 0 + }, + { + 106, 823, -1298, -478, 1698, -18, 210, 100, 68, -36, + -346, 163, -58, -161, 11, 35, -156, -4, 110, -312, + -224, -573, -54, -21, -66, 373, 223, 223, -214, 50, + -135, 141, -241, 199, -115, -36, -206, 143, -116, 167, + 14, -1, -12, -23, -110, 33, 60, 8, 43, 133, + 13, -16, -125, 79, -7, 69, 3, 74, -106, -12, + 5, 38, 88, 7, 8, 42, -14, 29, 6, 54, + -7, -1, 23, 9, 32, -26, -2, -30, 16, -6, + 23, 1, 20, -20, -18, 4, -7, -5, 9, 0, + 19, 14, 22, 1, -13, 1 + }, + { + -102, -1323, 355, 209, 26, 17, -2, -5, 199, -50, + -131, 90, -90, 423, -380, 411, -283, -44, 783, 55, + 199, -90, -84, 158, -222, 223, 187, -16, -218, 304, + 111, -396, 60, 91, -135, -172, -160, -193, -76, 68, + 40, -38, -49, 230, -13, 9, -51, 85, 97, 139, + -3, 48, -12, -17, -51, 61, -11, 9, -41, -44, + -31, -24, 29, 56, 41, -53, 18, 5, -34, 26, + -24, -7, 5, 10, 18, 0, 15, -17, -23, 4, + 1, 2, -21, -3, -19, -9, 19, 18, 1, 1, + 8, -16, -1, -4, -4, 0 + }, + { + 728, -3454, 110, 882, 358, 72, -158, -258, -355, -204, + -422, -705, 110, 334, -379, -273, 369, -348, 1, 96, + -463, -231, 301, -193, -145, -9, -118, -263, 52, -239, + 63, 44, -283, 72, -13, -97, 195, -210, 51, -55, + -120, -96, 30, 128, 43, -16, 52, -30, 22, -63, + -60, 4, 8, 63, 56, -11, -88, -18, 2, 77, + -57, -64, 38, 48, 9, 46, 10, 14, -39, 9, + 29, 1, -101, 20, -38, 38, -23, 0, 10, -7, + -22, -9, -8, 32, -5, 6, -13, 12, 8, -20, + -15, 16, -1, -4, -3, 12 + }, + { + -16, 1071, -190, -91, -107, -12, 1, -51, 78, -129, + 352, -168, -167, 266, -132, -635, -643, 248, 458, -775, + 689, 45, 7, -23, -228, 132, 131, 74, -9, -216, + -98, -324, -80, -231, 162, 436, 256, 88, 7, 20, + 45, 118, 76, -58, -45, -111, -41, -10, -41, -59, + 50, 128, -22, -7, 16, -63, -47, -52, -41, -1, + 3, 89, 38, 26, -15, 10, 12, -9, 56, -43, + -8, 45, -21, -3, -9, -18, -31, 6, -5, 16, + 6, 8, -13, -8, 8, -21, 14, 3, -16, -8, + -10, -6, -12, -5, 12, 15 + }, + { + 182, -4481, 607, 2848, 22, 27, 87, -380, 118, -175, + -64, -107, 156, 78, 18, 70, -85, 178, -155, -27, + -449, -16, -15, -111, -578, -78, 8, -153, 7, -200, + 67, 85, -86, 202, 37, 193, -171, 170, -82, -211, + 130, -117, -130, 159, 24, 147, 10, -123, -24, 38, + -120, -138, -69, -26, -33, 64, 107, -86, -5, -13, + 28, 44, -58, -37, -16, 67, 25, 6, -27, 0, + -4, -12, 30, 29, -33, 15, -26, 26, -24, 20, + 13, 17, 11, 21, -4, 9, 3, 17, 3, -5, + 14, 5, 0, 18, 13, 21 + }, + { + -1, 473, 190, -267, -158, 12, -44, 21, -122, 28, + -118, 265, 206, 177, -414, -676, -1240, -160, 648, -134, + 27, 191, -72, 65, -267, -151, -166, -533, 483, -38, + 63, 149, 446, 239, 196, -285, 68, 13, -37, 164, + -233, -24, 123, -120, -124, 34, 70, 23, 14, -84, + 63, 18, -43, 33, 59, -79, 41, -92, -22, 100, + 16, 37, 69, 1, 32, -67, 12, -11, 27, -40, + 9, 8, 8, 17, 23, -36, -23, 0, -1, 31, + 39, -6, 12, 0, 16, 1, 39, 22, -7, 10, + 4, -5, -2, -19, -23, 9 + }, + { + 1430, 431, 880, 2996, 69, 50, 49, -334, -366, 258, + -377, 168, -266, 24, 260, 486, -92, 20, -74, 158, + 158, -113, 160, 85, 166, -53, 197, 39, -24, -236, + -104, -74, 60, 7, -45, -149, 181, 36, -24, 120, + 67, 65, 16, -23, 98, 101, -24, 126, 167, -173, + 45, 29, -10, 56, -16, 95, -24, 4, -5, 47, + 45, -53, 54, 37, -50, -4, 11, 64, 29, 24, + -8, 12, 17, 11, 39, 2, -10, -2, 15, -13, + -32, -13, -18, 2, -25, 25, -5, -20, -2, 15, + 6, -14, -7, -14, 3, 30 + }, + { + -95, 529, 354, 450, -190, -292, 723, 44, 219, -9, + -143, 123, -390, 273, -658, 325, -114, 61, -311, 248, + -101, -659, -342, 207, -98, -426, 44, 150, -145, -112, + 274, -68, 147, -5, 80, -137, 101, 1, 77, -110, + 149, 133, 86, -38, 2, -6, 25, 8, -110, 75, + 69, -12, -49, -74, 31, -41, 29, 31, -2, -7, + -52, 19, -9, 5, -21, 10, 17, -43, -3, 44, + 7, 5, 1, 21, 38, 26, 4, 26, 18, -16, + -21, -2, 29, 3, 16, 9, 10, -10, -12, -3, + 6, -1, -20, -3, 12, -8 + }, + { + -1187, -287, 186, -461, -82, 443, -105, -534, -42, -364, + 226, -455, 212, -33, 228, -293, 95, -313, 356, 395, + 300, -115, -120, -209, -4, 83, 11, -121, -148, -138, + -29, 29, -224, -46, 235, -64, -99, 141, 11, 89, + -23, -88, 56, -25, 87, 6, 73, -34, 65, -10, + 53, -130, -91, -26, -60, 39, -121, -48, -18, 20, + 50, -35, -13, -41, -29, 3, -6, 20, 50, -14, + -12, -1, 17, 0, 8, -30, 11, -23, 27, 15, + 19, 5, 2, -1, -12, -13, 13, 29, -26, 12, + -13, -2, 9, 15, 8, 2 + }, + { + -66, -1733, 198, 229, -450, 281, -191, 31, -5, 162, + -109, -17, -275, 516, -302, 175, -55, 293, 355, -138, + 141, -98, 237, 54, 45, 102, -496, 230, -153, -236, + -88, -84, -119, 138, 175, -167, 435, -224, -61, -8, + 149, -119, -150, -54, -54, -194, -187, -61, 84, -61, + 102, -52, 39, 3, -65, -86, 32, 53, 6, 62, + -23, 17, -36, -63, -26, 19, -24, -17, -19, -20, + -26, -12, -29, -12, 18, 68, 2, -8, -13, -43, + 26, -16, 0, -3, -17, 13, -15, 2, -9, 0, + -11, 3, -2, 18, -14, 8 + }, + { + -1411, 9364, -1115, 414, 884, -855, 385, 72, -733, -443, + -196, 531, 171, -264, -196, 272, -25, 214, -521, -129, + -153, 116, 155, 39, 8, 302, 225, -53, 259, 28, + -20, 75, 110, -67, -29, -90, -37, 237, -115, 12, + -21, 35, 7, 78, -315, 1, 70, 28, 16, -21, + -6, 26, 47, 46, -109, 78, 3, 52, 2, 26, + -22, -34, 22, 31, 5, -7, 12, 50, -39, -22, + -17, -41, 12, -40, 22, -23, 56, -15, -3, -50, + -52, 15, 0, -30, 9, -11, -13, -8, 1, -32, + 21, 25, 9, 8, 21, 3 + }, + { + -217, -1561, 510, 463, 35, -79, 234, 109, 270, -371, + -114, 18, -75, 887, 823, -29, 165, -290, -34, -190, + 373, 461, 190, 201, -205, -12, 215, -498, 39, 182, + 11, 206, -41, 169, -175, -136, 201, 5, 192, -3, + 161, -126, 55, -60, 110, 163, -156, -79, 69, 8, + -88, 55, -1, -166, -10, -4, -14, 12, -69, -26, + 3, 5, -67, -52, 87, 40, -12, 12, -32, -8, + 25, 31, -58, 4, 47, 46, 8, -15, -25, 40, + 0, 6, -4, 7, -1, 27, 0, 20, -8, -17, + 3, 3, -6, 1, 10, -1 + }, + { + -1670, 1749, 73, -659, 343, 425, 286, 349, -249, 22, + -96, 391, -179, -43, -53, 304, -321, 269, -251, 227, + -105, -425, 55, 383, -258, -136, 203, 201, -131, 308, + -239, 177, 325, -67, -120, -99, 135, -156, 29, 174, + 102, 50, -95, -82, -135, -44, -140, 6, -106, -16, + -5, -27, -35, -92, -126, 20, -65, -42, -30, 2, + 12, -74, 31, -3, 25, -8, -18, -7, -59, -13, + 61, -6, -7, 21, 42, 10, -16, 0, 29, -14, + 37, 39, 2, -2, 47, -12, -7, -6, 4, -1, + -16, -3, -17, -6, 6, -1 + } + }, + { + { + 68, 529, -703, -546, 322, 171, 164, 99, 369, -156, + 203, -268, -469, -467, -278, -397, -875, 59, -433, -124, + -56, 44, 424, 38, -99, -168, 52, -132, 194, 239, + -99, -534, 31, -248, -175, 379, 208, 515, 169, -137, + 46, 58, -178, 42, 174, 48, -150, -52, -40, -8, + 47, 163, 56, 28, 49, 19, 0, 105, 71, -76, + 5, -56, 11, -45, 40, 65, 24, -12, -48, -7, + 25, 7, 15, 16, 7, -51, -20, -1, -7, -9, + 1, -3, 13, -2, 9, -2, -6, -13, -6, -18, + -24, -2, 13, 25, 1, 1 + }, + { + -217, -2646, -569, -1088, 443, 8, 85, -19, -84, 271, + 244, -856, 158, -76, 328, -425, -49, -269, -541, -57, + -131, 111, -137, -126, -75, -109, 71, 162, 4, -62, + 36, 552, 86, -152, -210, 303, 4, 107, -12, 105, + -88, -271, -40, -56, -62, 72, -43, 90, -17, 109, + 29, -2, -49, -51, 132, -28, 39, 174, 95, 0, + -7, -5, 16, -13, -4, 9, -14, -26, 33, 9, + -43, -8, -15, -1, 7, 3, -41, 35, 26, 6, + -7, -14, -2, -11, 7, 8, -22, 20, -14, -20, + -5, 6, 1, -2, 5, -1 + }, + { + -8, 3273, 432, -2977, -42, -109, 4, 37, 112, 174, + -327, -174, -317, -41, 365, 369, 155, -7, 43, -186, + 25, -773, -441, 66, 95, 281, -95, 168, -168, 26, + 24, 180, -321, 237, -87, -6, -9, 48, -275, 41, + 0, -2, 3, 35, -102, 39, -28, -83, 42, 158, + -25, 58, -22, 122, -48, -34, -42, 31, -134, 3, + 9, -34, 20, -74, -98, 31, -1, 18, -23, 45, + -3, -14, 38, 48, 35, -37, 2, -30, 9, -23, + 11, 5, 37, 6, -5, 32, 11, -7, 13, 0, + 15, -3, -1, 3, -9, -3 + }, + { + 84, -2022, -387, 21, 18, 48, -53, -42, 164, -167, + -127, 227, -381, -75, -889, -302, -470, 277, 437, 215, + 284, -216, 81, 418, -53, 81, 87, 64, 27, -17, + -368, -314, 305, 206, -29, -31, 221, -69, 37, 91, + -21, -90, -203, 96, 25, 88, -3, 54, 126, 118, + -18, 110, -8, -40, -46, 88, 1, 2, 3, -10, + -2, 2, -9, 30, 44, 22, 33, 20, 33, 36, + -35, 10, 8, 3, 6, 0, 33, 0, 14, 38, + 17, 18, 1, 25, 9, -12, -3, 6, 6, 13, + 8, -15, 5, 9, 2, -7 + }, + { + -27, -6931, -1110, 479, -299, -14, -99, 95, -90, 252, + -71, -298, 217, -218, -781, -485, 203, -427, 511, 719, + -322, -98, 109, -500, -212, 77, 277, -46, 187, -232, + -156, -86, -68, 188, 5, -9, 318, -253, -4, 74, + 33, -25, 26, 200, 12, -152, -48, 0, 1, 9, + -124, -115, -14, -53, 11, -24, -30, 16, -50, 33, + -36, -63, 49, 82, 26, 22, 10, 2, -102, -61, + 20, 18, -55, 31, -59, 35, -33, -19, -2, 7, + -33, -51, -34, 20, -9, 4, -35, 7, 5, -16, + 12, 8, -28, -21, 0, 12 + }, + { + -38, 1036, -90, -68, -41, 9, 18, -16, 82, -155, + 375, -126, -43, 611, 248, -172, -305, -79, 226, -1119, + 631, 429, -31, -405, -137, 190, -80, -162, 16, 66, + -64, -155, 169, 92, 338, 359, 178, -7, 81, 162, + 81, -33, -49, -37, 17, -71, -14, 22, 57, -26, + 0, 23, -41, 26, 32, -26, 7, -87, -46, 0, + -13, 35, -48, 7, -1, 27, 36, -10, 56, -69, + -55, 23, 1, -22, -52, -41, -13, -2, -21, 2, + -24, 2, 1, -17, -4, -11, 25, 12, -20, -13, + 0, -5, -32, -4, 21, 33 + }, + { + 1275, -4252, -682, 2501, -110, 59, 168, -341, 191, 285, + 407, 375, 272, -10, -78, 136, -69, 67, -117, -48, + -358, 129, 142, 132, -137, 136, 46, 128, 214, -192, + 18, 20, -255, 75, -6, 106, -29, 238, -99, -73, + 277, -99, -204, 41, -9, 69, 79, -23, 54, 37, + -138, 32, 19, 72, 11, 27, 55, -87, 0, 0, + 39, 24, -83, -53, -59, 17, -18, 2, -45, -15, + -9, -35, 4, 7, -10, 34, -43, 13, -13, 42, + 14, -19, -2, 14, -33, -4, -4, 8, 16, 8, + 5, -12, -7, 7, -14, -3 + }, + { + -70, -301, -6, -10, -49, 23, 10, 99, -131, 78, + 35, 391, 177, 188, -376, -108, -333, 373, 217, 175, + 706, 10, -263, 299, -152, 78, 204, -9, 531, -490, + -98, -262, 116, -40, -19, -241, -90, -98, 67, 217, + -192, 27, 210, -95, -70, 197, 157, 80, 128, -16, + 8, -25, 20, 146, 123, -27, 91, -96, -88, -25, + -64, 23, 40, -37, 36, -69, 13, 21, 14, -34, + 55, 29, 4, -12, 20, -47, -20, 26, 24, -13, + 12, -11, 3, 10, -2, -16, -12, -13, -11, 0, + 4, -2, -9, -9, -20, -7 + }, + { + -1479, -6725, -1443, 2446, -250, -74, -102, -282, -446, 48, + -666, 332, 201, -294, -602, 40, 158, 218, 156, 32, + -146, -221, 163, 51, 60, -159, 163, -6, 15, -89, + 58, -74, -170, 14, -9, -65, 331, -55, -191, 159, + 138, 92, -84, -6, 8, -96, -28, 216, 171, -162, + -58, -103, -59, 45, -41, -17, -13, 50, 49, 57, + 67, 14, 50, -18, -65, -14, -4, 52, -8, 6, + 24, -14, -5, 20, -7, -33, 0, 9, 2, 8, + 0, -5, -21, 16, 1, 18, -11, -21, 16, 13, + 2, 5, 14, 1, 8, 26 + }, + { + 80, -780, -1346, 137, 274, -396, 470, 160, 216, 107, + 144, 472, -109, 508, -775, 406, 363, -330, -1089, 238, + 475, 345, 9, 84, -228, -285, -287, -164, 48, 195, + 520, -94, 165, 159, -13, -347, -26, -179, -4, -104, + 55, -81, 84, 171, 41, -2, 24, 3, -40, 183, + 96, 67, -29, -142, 8, -36, 84, 57, 54, 51, + -16, 30, 2, 8, -22, -11, -2, -87, -21, 38, + -18, -13, -11, -41, -18, -17, -18, 24, -4, 10, + 19, -21, -2, -17, 12, -21, 3, 1, 0, -11, + 9, 12, -9, 5, 10, -8 + }, + { + 1135, -1302, -2861, 118, 11, 209, 720, 27, 331, -50, + 438, -459, 47, 168, 666, -42, 298, -337, 221, -22, + 60, -95, 14, 37, 93, 4, 83, 199, 158, 50, + 26, -20, -212, 25, 53, -120, 3, 88, -93, -72, + -144, -62, 113, 70, 108, -50, -13, -62, 68, -133, + 42, -6, -77, 43, 56, 63, -52, -30, 46, 31, + 7, -25, 14, 18, -77, -13, -28, -19, 43, 19, + 27, 12, 19, 3, 31, -13, 21, 10, 41, 17, + 9, -15, -12, 0, 15, 9, 21, 27, -15, 21, + -16, -7, 1, -3, -4, 0 + }, + { + 41, -2421, -562, 873, 200, 424, -278, -80, -101, 173, + 54, 228, -162, 359, -365, 571, 29, 229, 254, -248, + 407, -452, 240, -77, 135, 177, -398, 47, -276, -249, + -111, 64, -53, 26, -64, -367, 311, -163, 218, -42, + -78, -155, -12, 13, -8, -13, -52, 9, 96, -111, + 72, -96, -39, -28, -18, -94, -28, 27, 40, 68, + -22, 12, -16, -31, -5, 35, -9, -33, 6, -42, + 30, 85, 9, 18, 9, 43, 2, -17, 2, -13, + 3, -19, 15, -10, -7, 17, -13, -8, -19, 3, + 4, 27, 6, 8, -18, 7 + }, + { + -300, 10283, -2436, -25, 720, -762, 42, -395, -551, -162, + -437, 95, -61, -256, -221, 462, -168, -7, -375, -108, + 139, 326, 58, -144, -304, 101, -114, -21, 402, 10, + -18, 160, 280, -21, -258, -29, 135, 152, 34, 128, + -57, 67, 5, 84, -175, 33, 58, 50, 34, 12, + -29, -121, -81, -116, -151, 119, 2, 71, -25, -1, + -36, -75, -38, -32, 7, 59, 38, 17, -17, 54, + 40, -10, 48, -51, 35, -21, 33, -37, 28, -24, + -8, 21, 7, -27, -6, 14, 28, -11, 10, -33, + 8, 2, -10, 12, 22, 7 + }, + { + 190, -1636, 43, 269, -212, -250, 78, -90, -46, -232, + 109, 185, -135, -999, -1020, 189, 325, 180, 519, 47, + 365, 88, -266, 158, -273, -388, 68, -701, -10, -30, + 42, 54, -275, 186, -101, -95, 80, -164, 123, -8, + 318, 6, 115, 51, 136, 89, -95, -10, 50, -2, + -89, 64, 5, -54, 75, 46, -14, -7, -1, 55, + 56, 1, -31, -23, 26, 44, -27, -31, -12, -3, + 18, 47, -35, 38, 51, 6, -33, -60, -45, 22, + -25, -2, 15, -8, -20, 12, -16, 4, 4, -17, + 0, 0, -9, 1, 8, -5 + }, + { + 896, 4713, -440, -600, 319, 250, -63, 91, -200, -80, + -212, 378, -40, -625, -1404, 191, 222, 141, -648, -159, + -290, -311, -91, 81, -203, 263, 119, -107, -459, 240, + -275, -169, 25, -64, -134, -155, 177, -203, 35, 150, + -5, 75, -69, -75, -187, -133, -210, 44, -67, 66, + 109, -42, -55, -97, -48, 80, 34, -6, -18, 33, + 53, -51, 44, -42, -44, 19, 25, 9, -8, -26, + 39, -36, -64, -6, 31, 1, -19, -8, 42, -10, + -20, -24, -6, -16, 21, -31, -39, -26, 9, 14, + 0, 8, -2, -1, 2, 1 + } + }, + { + { + 32, -1586, 926, -11, 25, 30, 271, 160, 286, -24, + 175, -478, -482, -131, -358, -470, -536, -465, -116, -175, + 417, -46, 260, 155, -649, 171, -108, -195, 137, 298, + -279, -263, -65, -355, 86, 320, 116, 534, 161, 29, + 70, -45, 24, -76, 57, 59, -129, -152, 65, 86, + 96, 58, 31, 77, -29, 77, 14, 36, 85, -12, + -30, -94, -10, 49, 9, 30, 4, 10, -28, -16, + 29, 13, 19, 34, -51, -24, -32, 17, -19, -10, + -9, 21, -11, 2, -19, 3, -4, -23, 15, -8, + -24, -8, 13, 29, 12, 7 + }, + { + 580, -6312, 1663, -105, -220, 116, -84, -6, 45, 215, + -134, -223, -145, 36, -162, -280, -88, -221, -338, -328, + 78, -229, 135, -35, -182, -62, -53, 367, -45, -105, + 92, 426, 281, -383, 145, 37, 133, 27, 65, 156, + 1, -384, -114, 30, -18, -36, 101, 93, -1, -1, + 121, 20, -75, -90, 101, -16, 110, 37, 87, 42, + -65, 42, 18, -32, 17, -12, 4, -36, -22, -2, + -6, 22, -16, -57, 28, 22, -39, 38, 2, 26, + 2, -23, -7, -4, -2, 1, 4, 15, -10, -19, + -9, 8, 0, 1, 7, -3 + }, + { + -139, 5456, -453, -1878, -1159, -74, 57, -53, 104, -146, + 175, -431, 30, 159, -45, 276, 251, 188, 71, -67, + 90, -442, -459, 201, 81, -105, -75, 32, 29, -94, + 231, -110, -77, -116, 79, -176, 249, -81, -171, -104, + -47, 62, 20, 3, -128, 95, -52, 1, 53, 56, + -34, 30, 82, 71, -20, -73, -9, -55, -45, 28, + -31, -9, -46, -63, -89, 7, -12, -9, 6, 17, + 10, -1, 32, 52, -11, -6, -11, -31, -7, 13, + -5, 11, 32, 17, 7, 17, 14, 3, 9, -8, + 15, -9, -4, -2, 17, -8 + }, + { + -32, -2434, 190, -169, 78, 21, -49, 1, 67, -67, + -125, 333, -287, -577, -859, -275, -97, 379, 145, 374, + 23, -195, 504, 49, 115, -135, 268, 26, 132, -197, + -340, -34, 92, 182, 39, -237, 382, -100, 189, -49, + 47, -98, -96, -13, 58, 43, 135, -92, 160, 29, + -7, 86, 53, -68, -18, 96, -7, 11, -33, -13, + 11, 50, -57, 40, 34, 35, 8, 9, 59, 1, + -5, 17, 4, 21, 1, 23, 5, 19, 28, 21, + 25, 13, -9, 36, 9, -9, -8, 3, 0, 13, + 4, -4, -2, 4, -2, -8 + }, + { + -931, -9139, 1208, 113, 229, -176, -2, 166, -13, 399, + -104, -109, 26, 78, -1100, -189, -259, -156, 590, 466, + -30, -205, 227, -511, -303, -108, 437, -204, 344, -236, + -186, -111, 224, 91, -111, 52, -90, 203, 26, -55, + 52, 72, 13, 104, 44, -39, -127, 77, -72, 118, + -128, -166, -56, -90, 64, 32, -14, 22, -25, -35, + 15, -47, 64, 62, 3, 9, 33, 25, -90, -69, + 37, -36, 38, -2, -35, -24, -12, -16, -28, 21, + -31, -63, -30, 3, 8, -8, -25, 9, -10, 1, + 33, -12, -22, -16, 5, 2 + }, + { + 19, 188, 450, -160, 39, 35, -4, 22, 73, -9, + 175, -141, -173, 466, 402, 148, 9, -205, 100, -726, + 271, 324, 156, -841, -238, 710, -197, -122, 130, -48, + -277, 234, 84, 187, 330, 208, 83, -171, 170, 274, + -43, -65, -5, -26, 70, -2, -49, -21, 85, 21, + -51, 39, -104, 58, 30, -106, 40, -17, -71, -57, + 87, 13, -43, -24, 58, -5, 38, 7, 21, -45, + -30, -7, 19, -45, -42, -48, 12, -23, -15, 17, + -30, -21, 25, -23, -3, 4, 15, 13, -9, -30, + 16, 2, -40, -11, 25, 18 + }, + { + -2405, -1720, 1280, 1854, 139, 212, -118, -18, -312, 483, + 515, 515, 160, -255, 268, -18, -121, -36, 6, -184, + -50, 93, -15, -128, 429, 134, 110, 202, -114, 137, + -76, -159, -96, -15, 49, -52, 256, -162, 106, 50, + 96, 27, -295, 9, 153, -21, 7, 70, 37, 8, + -35, 5, 113, 49, 4, 4, -8, -10, -48, -10, + -8, -42, -16, -14, -56, -5, -14, -40, -20, -20, + -32, -32, 39, -41, 24, 22, -20, -7, 22, -6, + 16, 5, 2, -19, -20, 2, 0, 7, 24, -8, + 10, -15, -3, -13, -1, -16 + }, + { + 8, -875, 66, 208, -24, -59, 15, 31, 64, -39, + 163, 489, 27, 246, -652, 358, -93, 210, 69, 730, + 220, -28, -208, 271, -23, -83, -114, 604, 263, -339, + 54, -148, -86, -69, -228, 199, -139, -72, 153, 47, + -78, -59, 178, 15, -39, 129, 68, 106, 177, 38, + 19, -80, 52, 94, 55, 59, 71, -120, -72, -5, + -45, -72, -26, 49, 1, -6, -18, 9, 3, -38, + 73, 20, 27, -30, 22, -47, -30, 12, 38, -3, + 0, 2, 5, 30, -26, -5, -33, -3, 3, -14, + -15, -3, -10, -3, -6, -11 + }, + { + 847, -13058, 860, 1399, 475, -11, -443, -165, -334, -46, + -569, 361, 53, -42, -221, -352, 363, -17, 18, 53, + -103, -105, 68, 166, -57, -92, 78, -10, 0, 3, + 174, -192, -100, -168, 48, 184, 112, -42, -219, 146, + 219, 111, -171, 51, -38, -194, 23, 143, 48, -17, + -173, -68, 28, 16, -37, -137, 71, 78, 5, 65, + 50, 63, -30, -16, -13, -10, 1, 14, -15, 9, + 36, -28, -30, 25, -26, -20, 26, 0, -23, 20, + 21, -4, -19, 4, 30, 21, -8, -21, 1, 12, + -6, 11, 19, 24, -1, 0 + }, + { + -49, -2162, 375, -471, 533, -63, -194, 183, 102, 205, + 462, 447, -56, 171, -244, -115, 550, -484, -892, -65, + 450, 1014, -222, 155, -287, -674, -110, 129, -201, 383, + 261, -24, 70, 154, -137, -314, -135, -23, 71, -114, + 78, -128, -62, 253, 139, 39, -186, 8, 109, 160, + 13, 101, -99, -35, -39, -18, 74, 98, 88, -22, + 44, 18, -22, -19, -9, 17, -43, -45, -30, 0, + -2, 4, -31, -24, -40, -30, -26, 43, -4, 10, + 25, -19, -17, -14, -13, -28, 12, 3, 13, 10, + -18, -4, -3, 12, 9, -13 + }, + { + -1156, -2916, 737, 528, 198, -483, 698, 256, 81, 495, + 61, -79, -168, -113, 737, 206, 93, -163, -59, -104, + 45, 24, 64, -76, 178, -199, 142, 100, 279, 87, + -118, 28, -92, -56, 2, 22, 63, -20, -32, -144, + -141, -64, 175, 74, -45, 115, 12, -40, -84, -30, + -13, 48, -16, -12, 45, -33, 106, -48, 52, -11, + -68, 59, 19, 41, -95, -52, 6, -14, 17, 41, + 20, -4, 23, 11, 12, 8, -17, 42, 33, 13, + 5, -2, -11, -7, 4, 16, 14, 13, 3, -6, + 0, -5, 0, -3, -10, -12 + }, + { + -5, -1990, -466, 557, 503, -82, -47, -216, 98, -121, + 204, 497, 194, -544, -31, 545, 271, 36, -18, -8, + 143, -240, 310, -253, 315, -363, -52, 46, -178, 17, + -332, 157, -68, 42, -193, -129, 20, 7, 249, -116, + -296, 50, -29, -103, -32, 109, -28, 73, -70, -40, + -6, -31, -23, -90, 82, -146, -39, -1, 132, 30, + -14, 11, -39, -38, 47, -5, 17, -24, -22, -3, + 18, 113, -25, 35, 5, 23, 0, 0, 16, -16, + 2, -39, 40, -12, 0, 25, -28, -10, -13, 4, + 8, 10, 4, 2, -2, -5 + }, + { + 1606, 6822, -988, -308, 349, 7, -832, -101, -546, -185, + 125, -281, -2, -85, -182, 149, -190, 291, -284, -121, + -41, 475, 63, -277, -453, -15, 84, 73, 157, 59, + 181, -80, 281, 124, -418, 187, 74, -229, 256, 4, + 32, 99, 238, -157, -69, -16, 69, 70, 53, -8, + -131, -61, -161, -148, -16, -19, 9, 93, -10, 23, + -50, -47, -53, 3, -23, 43, 37, -5, 5, 60, + 33, -25, 83, -32, -7, 21, 13, -43, 24, -18, + -5, 16, 0, -23, -8, 18, 27, 2, 12, -6, + -21, 6, 6, 5, 10, 14 + }, + { + -143, -1336, 298, 56, -162, -43, -22, -40, -380, 141, + 16, -8, 167, -1542, -266, 581, 75, 174, 703, -406, + 473, 141, -346, -160, -230, -142, -283, -412, -62, -274, + 333, -115, -202, 134, -225, 17, 120, -169, 163, 71, + 139, -2, 88, 150, 47, 2, 10, 30, 83, -50, + -57, 22, -41, 49, 56, 16, -44, 47, -20, 41, + 93, -40, 2, -7, -18, 42, -23, -48, 8, 21, + -4, 24, -8, 44, 32, -19, -23, -66, -15, -3, + -22, -17, 33, -15, -3, 12, -16, -3, 5, -7, + -14, 1, 1, 1, -4, 5 + }, + { + 163, 5215, -68, -296, 124, 88, 66, 108, -267, 268, + -176, -285, 443, -515, -1489, -52, 755, -7, -419, -553, + -203, -51, -152, -78, -156, 489, -19, -330, -240, 71, + 61, -289, -241, -72, -144, 29, -22, -43, 96, -9, + 49, 135, -143, -124, -164, -107, -63, -41, -59, 53, + 44, 80, -11, -140, 43, 2, 19, 52, 25, -2, + 24, -38, -11, 15, -51, 50, 10, 12, 20, -22, + 17, -33, -36, -30, 10, -12, -3, -1, 19, 19, + -22, -51, 10, -17, -20, -23, -43, -21, 7, 23, + 8, 2, 8, -14, -4, -9 + } + }, + { + { + -88, -3732, -250, 324, 18, -56, 213, -61, -18, 156, + 245, -212, -157, -283, -158, 445, 89, -140, 792, 333, + 83, 7, 153, 278, -333, -277, -508, -242, -156, -433, + -371, 243, 247, -62, 25, 35, -45, 273, 62, 37, + 40, -116, -44, -117, -6, 24, -36, -61, 195, 101, + 54, 28, 9, 38, -45, 33, -51, -64, 48, -18, + -74, -38, 34, 12, 9, 4, -47, 13, 10, 3, + 18, -5, -13, 11, -42, 35, 6, 55, -1, 11, + -3, -5, -17, 14, -18, -1, 0, -27, 14, 15, + 15, 9, 2, 5, -2, 11 + }, + { + -798, -10995, 335, 789, 221, -25, -131, -19, -252, -296, + -588, -223, 87, -91, -631, -349, -267, -54, 173, -112, + 89, -248, 255, 63, -228, -60, 96, 355, -29, 83, + 40, -11, 133, -49, 179, -94, 212, 80, 120, 213, + -17, -194, -9, -21, -6, -111, 58, 28, -7, -5, + 148, 122, 52, -136, -15, -15, 82, -88, -19, 38, + -76, 2, -6, -40, -11, -59, 25, -21, -32, -9, + 16, 35, 12, -33, 4, 38, -16, 5, -11, 33, + -8, -17, -3, -3, 12, -6, -1, -2, -7, 6, + 4, 16, 8, -4, 1, -5 + }, + { + 305, 8097, 1502, 177, 345, 125, 122, -78, -174, -359, + 141, -369, -134, 60, 38, 178, 327, 161, 129, 223, + 261, -4, 232, 492, -205, -144, -108, -196, -89, -215, + 45, -67, 30, -277, 34, -136, 198, -50, 5, -190, + -115, 66, 54, 104, -46, 92, -23, 82, 40, 30, + -52, 37, 102, -38, -96, -15, 85, -46, 29, 122, + -9, -8, -34, 39, 16, -13, -49, -33, 19, 2, + -8, 23, 28, 9, -51, -2, 4, -1, -1, 9, + -9, 7, 20, -3, 2, 4, 2, -7, -6, -12, + 11, -16, -6, -2, 23, -6 + }, + { + -29, -2333, 292, -222, 14, 14, -8, 4, -15, -106, + -104, 435, -145, 182, -234, -468, -157, -119, -453, 95, + -336, -554, 378, -140, 226, 7, 248, -2, 58, -331, + -20, 221, -57, 202, 22, -302, 190, -120, 175, -131, + 106, -20, -34, 7, 87, 88, 151, -169, 2, -103, + -67, 28, 46, -44, -32, 72, -15, 33, -14, -40, + -53, 3, -79, -2, -9, -4, -28, 15, 35, -25, + 11, 3, -9, 28, 1, 15, -3, 15, 8, -3, + 17, -2, -51, 16, 13, -6, -14, -8, -12, 3, + 7, 1, -2, 1, 1, -9 + }, + { + 1898, -8226, -716, 154, 54, -85, -17, 162, -100, 182, + 357, 532, 99, 199, -753, -12, -267, -429, 41, 140, + -16, -139, 285, -258, 9, -58, 37, -502, -17, -251, + 32, -126, 81, -115, -285, 19, -518, 44, 206, -177, + -141, 153, 23, 24, 245, 193, 58, 269, 8, 57, + -18, -7, -2, -1, 88, 41, 31, 72, 23, -18, + -1, -34, 63, 31, -30, 45, 46, 58, 5, -2, + 50, -25, 40, -27, -26, -34, -22, -28, -26, 8, + -30, -6, 7, -13, -6, -3, -10, 6, 2, 5, + 23, 4, -10, -6, 11, 0 + }, + { + 34, -555, -64, 45, 51, 24, -5, 64, 115, -163, + -37, -194, -356, 223, 277, 20, 67, 189, 380, -868, + -85, 123, -112, -940, -300, 698, -94, -67, -73, -243, + -147, 350, 103, -41, -11, 57, 82, -217, -26, 104, + 20, -35, -13, -13, 111, 34, -38, 18, 108, 51, + -116, -27, -138, 3, 1, -50, 53, 25, 26, 6, + 86, 22, 5, -20, 47, -42, 16, -7, -21, -43, + 30, 0, 3, -14, 15, 26, 44, -7, -18, 28, + 5, -20, 25, -6, 20, -1, -6, 11, 20, 0, + 10, 5, -15, -10, 5, -5 + }, + { + 2887, 2772, -830, 914, -442, 10, -85, 34, -391, 207, + 75, -226, -378, -279, 501, -52, -40, 105, 75, -33, + -52, 15, -121, -194, 520, 117, 8, 33, -179, 197, + -1, -80, 84, 129, 108, -110, 98, -396, -41, 37, + 138, 122, -282, -36, 94, 52, 18, -9, 23, 71, + -3, -111, 110, -22, -56, -37, -43, 7, -42, -29, + -6, -9, -14, 6, -26, 8, 40, -41, 1, -6, + -37, -10, 44, -52, 22, 37, -1, -25, 16, -32, + -22, 9, 22, 11, 22, 12, -2, -3, -5, -23, + 14, -12, -2, -21, -5, -9 + }, + { + 75, -233, 108, 37, 19, 3, 5, 13, 170, -33, + 1, 151, -100, 383, -773, 187, -60, -89, -90, 773, + -305, -477, -229, 0, 182, -118, -364, 376, -54, -45, + 331, 234, 47, -84, -41, 353, -80, -54, 122, 3, + -57, -116, 17, 73, -4, -40, -51, -76, 69, 92, + -6, -74, 44, -17, -9, -38, -21, -144, -65, 45, + 4, 16, 4, 49, 7, 2, -41, -26, -4, -92, + 35, 8, -7, -12, 33, -19, 0, 23, 52, 44, + 29, -2, 4, 27, -18, 1, -28, 14, 21, -5, + -7, -4, 2, 22, 17, 1 + }, + { + 246, -15429, -28, 617, -179, -218, -404, -44, -164, 182, + -481, 13, -259, 134, 299, -67, 24, -67, 108, 168, + 250, 93, -9, 81, -55, -30, 14, 4, 53, -26, + 142, -245, -16, -127, 106, -97, -135, 141, -44, 83, + 233, 27, -99, 146, 5, -203, -23, 25, -55, 4, + -70, -1, 15, 6, -9, -75, 59, -47, -113, 18, + 8, 60, -26, 14, 32, -22, -38, -13, -28, -19, + 29, 9, -36, 10, 3, -12, 13, -1, -17, 16, + 31, 4, -13, -4, 31, 28, -7, 10, 2, 3, + -1, 14, 6, 15, -11, -9 + }, + { + 4, -2710, 506, -351, 215, -42, -201, 117, -73, -64, + 256, 293, -104, 245, -130, -576, 80, -224, -80, 143, + -108, 635, -242, 153, 179, -296, -10, -68, -523, 268, + 30, -230, -128, -95, -221, 3, 175, 54, 146, -45, + 121, -74, -79, 143, 66, 0, -220, -34, 27, -2, + -98, 84, -47, 93, -8, -22, 34, 28, 15, -130, + 8, 46, -20, -6, -17, 7, -28, 31, 0, -36, + -9, 4, -49, -31, -72, -15, -22, 19, -33, -31, + 23, 1, -1, -6, -18, -16, 5, -2, 9, -2, + -25, 1, 8, 2, -6, -3 + }, + { + 1189, -2894, -1521, 30, 638, -228, -15, 154, -249, 277, + -272, -156, -68, -90, 233, -133, 18, -137, -210, -329, + 6, 153, 38, -211, 139, -319, 131, -105, 57, -3, + -81, 24, -67, -37, 67, 177, 57, -61, -1, -80, + -33, 11, 148, 5, -72, 201, 86, -64, -168, 9, + 27, 60, 27, -50, -48, -148, 45, -5, 4, -67, + -39, 87, 3, 28, -14, -31, 0, -15, 7, 37, + 4, -19, 2, -21, -12, 20, -10, 14, -4, -1, + 11, 12, 2, 2, -5, -5, -25, -5, 4, -11, + -4, -6, -4, 1, -2, -14 + }, + { + -41, -1046, 360, 213, 290, -148, 125, -227, -11, -163, + 78, 257, -577, -1695, -203, 319, 101, 87, 36, 81, + 87, -209, 361, -231, -69, -263, 297, 289, 178, 202, + -374, 237, -7, 96, -194, -94, -274, -180, 104, -96, + -195, 118, -55, -142, 3, 107, -84, 83, -127, -84, + 14, -10, 10, -22, 52, -181, 28, -35, 41, -25, + -23, 15, 3, -4, 39, -11, -18, -29, -23, 39, + -13, 48, -6, 41, -3, 20, -8, -10, 21, -2, + 26, -19, 36, -6, -11, 7, -19, 1, -15, -3, + -4, -9, -7, -2, 4, 3 + }, + { + -1994, 2314, 194, 77, 760, 665, -884, -232, -300, 103, + 676, 209, 43, 191, 436, 49, 22, 420, -96, 48, + -255, 31, -180, -113, -315, -109, 56, 109, 214, -87, + -22, -148, 206, 165, -170, 273, -244, -369, 203, -86, + 24, 40, 214, -318, -225, -114, 21, -6, -42, -15, + -77, 18, -118, -113, 47, 21, 75, 91, 16, 120, + -16, -33, -3, 31, -51, 9, -18, -50, -28, -17, + 13, 7, 113, 3, 3, 32, 30, -25, -11, 12, + 16, 2, -21, 2, 14, -6, 5, 0, 1, 11, + -7, 4, 10, 4, -2, -3 + }, + { + 94, -1094, 50, 10, 85, 74, 51, 132, -181, 282, + 194, 161, 190, 1047, 3458, 667, -363, -63, 470, -521, + 179, 95, -240, -294, 32, 245, -63, -142, -70, -333, + 337, 150, -73, 87, -306, -53, 119, -243, 195, 153, + -52, -57, 99, 52, -93, -65, 58, -15, 27, -8, + -31, 40, 13, 9, 12, -50, -35, 69, -69, -3, + 29, -64, 50, 34, -53, -19, -18, -44, 11, 19, + -45, 15, 4, 2, -8, 2, 6, -10, 22, -7, + -1, -19, 19, -4, -2, 8, -8, 6, 1, 1, + -8, 4, 0, 5, 0, -10 + }, + { + -1019, 3576, 471, -19, 2, 76, 178, 462, -90, 370, + 76, 61, 573, 765, 385, 270, 708, -335, -136, -25, + 163, 179, 6, -49, -113, 407, 76, -352, -205, -14, + 42, -59, -27, 176, -8, 25, -232, -108, 32, -12, + 117, 159, -128, -187, -38, 11, 89, 49, -27, 12, + -10, 125, 91, -32, 134, -41, -80, 60, -8, -71, + -45, -96, -19, 50, -37, 23, -10, 11, 41, -29, + -18, -22, -5, -17, 8, 4, 26, 2, 12, 6, + -5, -26, 19, -23, -37, 0, -4, -3, -13, 12, + 9, -1, 11, 0, 4, -22 + } + }, + { + { + 42, -3965, -22, 313, -179, 5, 120, 57, -174, 193, + -15, 14, 25, -23, -455, 736, -31, 39, 113, 695, + -59, 47, 60, 52, 456, -586, -485, -170, -143, -811, + 102, 118, -18, 188, 54, -68, -90, 59, 280, -101, + 60, -50, -202, 44, 5, -93, 18, 9, 128, 55, + 46, 1, 31, -20, 55, -40, -25, -81, 16, -69, + -7, -5, 39, 13, -35, 39, -36, -10, 29, 19, + -8, -3, -3, -10, -9, 24, 15, 48, 3, -1, + 20, -15, 12, -11, 1, 2, 10, -20, -8, 12, + 20, 7, 4, -1, -7, 14 + }, + { + 729, -12376, 100, 641, 58, -207, 51, -5, -269, -506, + -423, -306, 254, -292, -475, -223, -666, -150, 484, -136, + -118, 270, -190, 194, -164, -132, 352, 77, -39, 42, + 50, 0, -114, 307, -125, 130, 73, 218, 159, 40, + -107, 25, -93, 27, 98, -143, -50, 38, 7, 60, + 137, 10, 85, -52, -79, 34, 37, -31, -73, 64, + -40, -26, -14, -8, -10, -96, 16, 9, -6, -36, + 5, 11, 25, -12, -19, 18, 36, -24, -16, 25, + 17, -23, -5, 5, 18, -12, -8, -3, -13, 19, + -12, 19, 8, 3, -6, -5 + }, + { + -389, 8115, 1740, 925, 253, -121, 52, 67, -212, -201, + -58, -217, -277, 20, -180, 443, 239, -293, 45, 353, + 225, 83, 114, 547, -189, -149, 38, -215, -450, -65, + 15, 84, -107, -51, -132, 71, 49, -27, 204, -242, + -57, -14, -49, 304, -78, -1, 109, 40, 3, 18, + -12, 30, -15, -13, 15, -25, 8, -18, 41, 101, + 5, -24, 36, 23, 51, -33, -45, -34, 19, -11, + 34, 1, 44, 1, -40, -12, 2, 2, -10, 10, + -4, 16, -9, 0, 10, -9, -9, 8, -8, -2, + 2, -14, 6, -5, 0, 9 + }, + { + 55, -1747, -303, -139, -17, -16, 1, 83, -147, 64, + -86, 166, 64, -67, 279, -545, 88, -440, -732, 127, + -268, -606, 23, 54, 135, 175, 54, 142, -214, -225, + 40, 122, 51, 175, -131, 36, -128, 39, -94, 17, + 92, 28, -14, 18, 26, 127, 66, -86, -42, -88, + 5, -22, 10, -38, -29, 96, -47, 27, 17, -59, + -30, -58, -49, 13, -21, 14, -17, -13, 21, -20, + 10, -20, 1, 20, -5, -2, 4, 14, 11, -15, + 12, 0, -29, -8, 8, 13, -29, -11, -1, 4, + 8, -3, 1, 6, 4, -2 + }, + { + -2528, -3208, -401, 364, 212, -49, -64, 39, 45, 55, + 312, 481, 221, 78, -129, -302, -375, -61, -101, -134, + -117, 244, -33, -50, -26, -40, -141, -147, -425, -103, + 97, -152, -35, -151, -234, 63, -574, -70, 179, -91, + -129, 96, 3, 54, 266, 188, 87, 141, 145, -60, + 85, 33, 21, 20, 19, 90, 6, 78, -7, -23, + 4, -15, -10, 69, -29, 17, 48, 13, 53, 3, + 27, 47, -27, -46, -7, 12, -51, -15, -22, -4, + -21, 15, -9, 8, -20, 6, 2, -28, 14, 12, + -4, 8, 3, 2, -3, 8 + }, + { + -30, -442, -93, 109, 15, 12, 3, 58, 86, -25, + -105, -285, -73, -78, 270, -272, 227, 226, 171, -1105, + 154, 20, -303, -396, -263, 52, 108, 8, -85, -315, + -49, 185, -16, 31, 75, 54, 64, -80, -164, 16, + 149, -45, -80, 50, 60, 46, 12, -22, 65, 67, + -107, -59, -15, -62, -52, -7, 17, 71, -5, 48, + 64, 26, -2, -21, 43, -21, 30, -52, -36, 2, + -17, 41, -3, -1, -1, 54, 13, 13, -20, 32, + 18, -11, 4, 3, 11, 12, -18, 3, 29, 5, + -6, 0, 4, -8, 0, -10 + }, + { + -2635, 8998, 363, 379, 46, -171, -12, 40, -65, -177, + -34, -474, -295, -131, 409, -22, 133, -2, 155, -52, + -25, -127, -126, -147, 197, 312, 92, 8, 29, -113, + 60, -159, 182, 57, 60, 30, -118, -109, -202, -40, + 162, 92, -70, -189, 41, 78, -24, 69, 18, 109, + -14, -86, 41, -104, -30, 6, -28, -13, -4, -49, + 13, -3, -29, -5, 3, -25, 57, -30, 5, -9, + -15, -16, 12, 11, -5, 11, 17, -10, 5, -38, + -4, 10, -1, 40, 26, 2, -5, 2, -15, -12, + 5, -4, -8, -12, -13, 9 + }, + { + -25, 802, -342, -113, 24, -2, -13, 71, 99, -32, + 0, -86, 94, 155, 200, -823, 324, -185, -48, 202, + 18, -586, 189, 111, -258, -255, -301, 213, -207, 242, + 77, 235, 47, 41, -58, 130, 30, 17, 92, 125, + -93, -143, 24, 8, -47, 43, -43, -70, -60, 140, + -11, 1, 24, -87, 49, -89, -33, -95, -54, -6, + 10, 50, 47, 21, 30, -5, -53, -22, 30, -118, + -2, 45, -9, -18, 16, -2, 20, 24, 17, 68, + 20, -20, 38, -8, -8, 8, -19, 5, 18, 4, + 7, -3, 12, 9, 9, 3 + }, + { + -1384, -14299, 906, 288, -3, -213, -171, -90, -93, 52, + -99, -373, -321, -223, 468, 124, -123, 188, 96, 27, + 286, 144, 21, 139, -4, -105, 32, -3, 61, -64, + 201, -291, 10, -132, 118, -245, 29, 71, -29, 72, + 366, -280, 101, 34, 65, -97, 38, -133, 58, -65, + -33, 35, -87, -35, 88, -15, 36, -104, -59, 3, + 7, 31, -20, 27, 4, 1, 0, -12, -2, -11, + -19, 15, -23, -5, -1, 9, 1, 21, -2, 13, + 4, 7, -9, -2, 17, 21, -14, 27, 2, 9, + 0, 24, -2, -6, 0, -11 + }, + { + 31, -2334, 117, 57, -259, 162, -74, -131, 33, -91, + 124, 13, 236, -260, -48, -368, -189, 124, 165, 177, + -324, 356, 163, -98, 40, 175, -239, -242, -188, -158, + 328, -227, -226, -162, -184, 87, 79, -5, 214, 26, + -31, 70, 27, 77, -38, 54, -89, -119, 17, -133, + 19, 15, -6, 65, 17, -46, -5, 51, -73, -101, + -3, 67, -12, -17, -13, 13, -39, 73, -20, -33, + -8, 18, -46, -31, -53, -7, -25, -18, -6, -49, + 0, 15, 6, 5, -22, 8, -9, 5, 1, -8, + -6, -12, 10, -5, 6, -1 + }, + { + -1138, -2618, 732, -286, 516, 637, -623, -130, -181, 56, + -29, -251, -145, 154, -52, 22, -303, 167, -147, -452, + 135, 86, 90, -414, 386, -233, -8, -153, -59, -50, + 35, 56, 26, -61, 52, 130, 135, 13, -200, 78, + 33, 98, -45, -3, 21, 88, 50, -33, -89, -72, + 38, 39, 67, -35, -139, -35, -58, 3, 7, -25, + -1, 24, 19, -22, 27, -18, -23, 11, -3, 30, + 11, -18, -16, 12, -11, 3, 26, -4, -33, 7, + 13, 3, 19, -5, -17, 3, -17, -6, 13, -24, + -3, -9, 0, 2, 1, -10 + }, + { + 70, -311, -216, -16, 138, 22, 55, -117, -73, -161, + -4, 22, -197, -1345, -484, -104, -53, 118, 297, -31, + 39, -288, 482, -49, -510, 140, 80, 348, -66, 173, + 113, -249, 106, 95, -297, 48, -258, 18, -106, -95, + 9, 60, -47, -71, -81, 13, -18, -32, 30, -87, + -29, -44, 25, 58, -4, -115, 18, -53, -39, -12, + 24, -18, 20, -27, -26, 26, -7, -26, -22, 39, + -10, -9, 22, 25, 38, 19, -8, -13, 14, 4, + 6, 12, 7, -12, -18, 2, -1, -19, -2, 9, + -6, -15, 0, 2, 0, 10 + }, + { + 1489, -2173, -689, 748, 501, 57, 331, -447, -138, 48, + 546, 260, 518, -459, 583, 85, -38, 54, 173, -212, + 125, -266, -164, -246, 32, -56, 139, 59, -110, 53, + -53, 196, -18, 136, 0, -79, -75, -169, -136, 88, + 83, -45, 53, -153, -293, -155, -7, 76, -48, -123, + -19, -24, -10, -4, 9, 50, -13, 140, 32, 40, + 37, -55, -6, 62, -28, -4, -62, -43, -25, -16, + 40, -11, 61, 57, -16, 29, 6, 18, -13, 8, + 7, -1, -17, 8, 16, 14, -21, 4, -11, 6, + 6, 4, 12, 2, -2, 1 + }, + { + -68, -626, -130, -58, -3, 121, 120, 97, 2, 26, + 125, 204, 280, 764, 4523, -347, 205, -395, 220, 116, + -199, 228, -200, -304, 130, 243, 199, -179, -409, 218, + -109, 242, -33, -46, -163, 113, 24, -259, 33, 236, + -113, 0, 126, -40, 22, -55, -35, -12, 85, -19, + -18, -36, 54, 19, 29, -57, -44, 13, -32, -23, + 24, 9, -6, 11, 3, -42, -40, -12, 6, -3, + -37, 0, 7, 0, -1, 3, 12, 10, 11, -1, + 8, -12, 4, -7, -4, 7, -9, 4, 3, -5, + 9, 4, 5, -4, 3, -10 + }, + { + 1329, 219, 478, -59, 46, 172, 104, 533, -124, 356, + 100, 415, -102, -423, 2582, 82, 450, -345, 33, 15, + 175, 90, 71, 76, -45, 80, 181, -451, 86, -100, + -200, 99, -36, 277, 60, 88, -282, -78, -48, -14, + 244, -16, -3, -179, 99, -34, -51, 22, 40, -16, + 51, 65, 60, 42, 104, -36, -102, 9, 10, -59, + -45, -53, -35, 1, 28, -47, -10, -18, 59, -25, + -7, -11, -26, 5, -3, 13, 34, -5, 25, -24, + 2, -19, 26, -20, -31, -2, 11, -6, -6, 0, + 8, 3, 10, 8, -1, -7 + } + }, + { + { + 15, -1350, 1646, 237, -159, -18, 48, 57, -176, -43, + -52, 59, 228, 445, -612, 191, -484, -242, -298, 56, + -471, -230, -48, 261, 550, -197, -147, -262, -279, -585, + 306, -184, -113, 102, -60, -212, -81, 21, 212, -94, + 64, -19, -174, 61, -17, -51, 73, -40, 31, 4, + -56, -10, 39, -60, -18, -32, 37, -15, -12, -109, + 21, 2, 40, 2, -76, 33, -26, -6, 50, 37, + 9, 5, 8, -6, 18, 17, 5, 19, -11, -11, + 19, 0, 17, -11, 19, 11, 17, -14, -12, 6, + -8, -11, -1, -5, -14, 4 + }, + { + -690, -7884, 4175, 214, -81, -8, 201, 147, 30, -168, + -1, -409, -46, -262, -31, 44, -180, -258, -194, -17, + -70, 373, -97, 160, -172, -195, 321, -80, -68, -46, + -36, -24, -125, 153, -226, 107, 22, 246, 95, 97, + 44, 103, -95, 171, 205, -37, -72, -17, 72, 45, + -61, -88, 93, -11, -42, 35, 73, -28, -116, 18, + -40, 0, 23, 50, -10, -89, -8, 18, -5, -60, + 13, -22, -7, 0, -7, 15, 30, -21, -17, 3, + 33, -9, -1, 11, 19, 4, -6, -5, -15, 8, + -25, 9, 3, 7, -11, 1 + }, + { + 366, 3490, -3415, 16, 64, -338, -90, 93, 27, 114, + -72, -316, -529, 61, 154, 291, -97, -181, -336, -403, + -272, -565, -133, 370, -99, -20, -4, -205, -353, 171, + 242, 301, -177, 145, 102, 100, -5, 55, 327, -98, + 71, -21, -81, 246, -106, -68, 8, -51, -7, 89, + -17, -74, -86, -65, 21, 23, -99, -67, 0, -4, + 1, 14, 34, -46, 18, 16, -15, -3, 45, -6, + 45, 0, 44, 10, -35, -28, -8, -11, -12, 12, + -2, 5, -22, 6, 22, -4, -5, 6, 5, 20, + 0, -12, 10, -1, -3, 7 + }, + { + -62, -684, 514, -164, 4, -16, -48, 49, -105, 72, + -132, 80, 62, -85, 852, 235, 75, -631, -979, -131, + -71, -621, -396, -340, -214, 229, 34, 206, -74, -90, + 15, -188, -96, 54, -202, 129, -36, 140, -178, -15, + 51, 69, -29, -9, 17, 18, -27, 27, 91, -21, + 121, 0, -81, -40, -64, 76, -15, -16, 4, 4, + 19, -29, -13, 24, 2, 30, 0, -29, 1, -19, + -3, -29, 0, 0, -20, -26, -5, 11, -1, -27, + -18, -7, 14, 3, 7, 14, -20, 3, 3, 4, + 6, 0, 5, 12, 5, -2 + }, + { + 2539, 2371, -1543, 562, 191, 33, -49, -103, -121, 188, + -89, -62, 174, 240, 636, 110, 299, 249, -525, -421, + -213, 102, -228, 30, 72, 78, -111, 95, -161, 44, + 176, -178, -227, -247, -22, 207, -111, 109, 115, -21, + 38, 98, -155, -37, 51, -11, -56, -44, 60, -57, + 67, 13, 69, 35, 14, 38, -19, -8, -90, -10, + 21, -35, -44, 52, -46, -17, 34, -33, 9, -28, + -10, 25, -38, -37, 3, 33, -17, 30, -1, 6, + -12, 42, 8, 21, -21, -8, 5, -12, 5, 3, + -9, 0, -1, 0, -9, 14 + }, + { + -7, -311, -60, 67, 53, 21, 30, 88, 2, -56, + -49, -76, 57, -250, 241, -244, -28, -148, -150, -1814, + -57, 354, -425, -186, 77, -385, -57, 211, -82, -355, + -63, 67, -98, -71, 145, 77, 99, 37, -197, -29, + 156, 14, -42, 28, -48, -8, -30, -102, 27, 65, + -18, 56, 82, -82, -40, 20, -22, 15, -31, 62, + 24, -29, -4, -19, 15, 16, 42, -34, 18, 26, + -20, 36, -23, 3, 9, 12, -30, 19, 3, 22, + -18, 4, 7, -10, -4, 2, -18, 7, 21, -3, + -2, 0, 10, 6, -1, -19 + }, + { + 1678, 16095, 939, 704, 410, -123, 18, -12, 28, 10, + 276, -208, -137, 50, 200, -336, 51, -132, 42, -93, + 29, -11, -109, -208, -133, 38, -41, 95, 179, -163, + 81, -142, 50, -130, -112, -138, -123, 96, -101, 9, + 98, 21, -37, -60, 60, -39, 28, 92, 43, 105, + -14, -7, 27, -103, -50, 24, -20, -11, 8, -59, + 46, 52, -23, -21, 3, -50, 14, -2, 26, -13, + 14, 0, -4, 13, 0, 7, 16, 5, 16, -2, + 27, -13, -27, 20, 6, -4, -9, 22, 14, -5, + 1, 14, 11, 7, -2, 14 + }, + { + -64, 667, -106, -26, 31, -17, -70, -63, -55, -75, + -71, -124, 182, 259, 1441, 246, 755, 186, 253, 80, + 450, 135, 502, -159, -787, -38, -341, -26, -300, -82, + -196, 11, -133, -6, -31, -91, -96, 50, 35, 105, + -2, -116, 90, 102, -38, 20, -43, 25, -57, 89, + 25, 41, 13, -74, 62, -138, -37, -20, -21, -55, + -7, 86, 65, -23, 26, 35, -44, -24, 73, -58, + 5, 3, -23, -10, 14, 2, 13, -11, -29, 22, + -8, -19, 39, -23, -8, 24, -14, -7, -1, -4, + 12, -9, 3, -3, -6, -10 + }, + { + 2173, -11246, -633, 314, 187, 19, 53, 81, -65, 52, + 139, -228, -37, -246, -42, -168, -229, 166, 371, -37, + -47, 18, 188, 172, -145, -81, 36, -63, -34, -261, + 304, -144, -91, -74, 70, -210, 138, 4, -37, 179, + 223, -340, 233, -20, 12, -41, 37, -51, 154, -82, + -73, -24, -128, 11, 159, -3, 38, -54, 34, 38, + 10, 29, 32, 52, 10, 31, 9, 0, 34, 4, + -31, 23, -1, 7, 20, 25, -1, 43, -1, -6, + -1, 10, -21, -18, -8, 7, -13, 17, 2, 1, + -4, 19, -8, -12, 3, 0 + }, + { + -56, -1510, 665, 215, -325, -52, -44, 67, 91, -171, + -221, -164, 4, -488, -171, -673, 80, 237, 243, 760, + -211, 223, -21, -260, 68, 129, -247, -182, 64, -200, + 372, -3, -4, -63, -178, 5, -77, -98, 16, -88, + -64, 66, 69, 78, -19, 90, -67, -79, 26, -178, + 46, 15, -95, 9, 20, -121, -118, -18, -62, -53, + 24, 73, 2, -10, 10, 25, -28, 51, -24, 5, + -14, 24, -5, 16, 15, 37, -14, -14, 28, -8, + -9, 4, 15, 26, -3, 18, 5, 5, 9, -10, + 6, -8, 6, -2, 8, -4 + }, + { + 1016, -3184, -1605, -318, -226, 399, -338, -367, -361, 146, + 185, -270, -300, 109, -291, -85, -615, 104, 374, -188, + 328, 107, 130, -391, 274, -184, 64, 31, -104, -173, + 6, 151, 253, 110, 75, 116, 71, 8, -147, 134, + 106, 120, -97, -49, -15, 0, -14, 36, 18, -133, + -23, 20, 32, 3, -30, 32, -26, 6, 20, 6, + 25, 19, -3, -43, 12, 5, -19, 43, 0, -16, + -7, 9, -1, 13, -20, -21, 12, -10, -33, 1, + 0, -13, 10, -20, -11, 13, 5, 3, 18, -20, + -5, -9, 10, 10, 2, -7 + }, + { + -70, 198, -3, -322, -168, -61, 53, -45, -50, -90, + -22, -111, 690, 89, -192, -209, -300, 38, 389, -26, + -19, -404, 127, -415, -666, 287, 41, 6, -212, -4, + 108, -230, 98, 44, -174, 176, -35, 148, -48, -140, + 11, 135, 52, -18, -136, -14, 10, 20, 146, -55, + -34, -1, 9, -35, 9, 6, 114, 9, -36, -18, + 25, -19, 13, -55, -53, 29, 15, -13, -14, 4, + -22, -13, -13, -9, 38, 16, 2, -11, 9, 7, + -5, 11, -7, -22, -11, 1, 11, 3, 7, 5, + -3, -1, 7, 2, -7, 4 + }, + { + -588, -4379, -1026, -5, 254, -68, 320, -613, 99, -120, + 100, 39, -481, -1134, 507, -407, -457, -97, 386, -103, + 263, -162, 175, -14, 79, -124, -91, -91, -183, 24, + -110, 201, -130, 110, 72, -153, 70, 1, -139, 8, + -5, -51, 122, 175, -109, 21, 102, 45, -87, -62, + 63, -44, 61, 97, -20, 6, -58, 120, 21, -105, + -42, -15, 14, 70, -1, 44, -8, -29, -51, -36, + 12, -51, 0, 17, -15, 4, 3, 23, -29, -21, + 8, 17, -17, -5, 13, 37, 1, 18, 6, -4, + 1, 2, 10, 13, 0, 5 + }, + { + 51, -365, -42, 123, -14, 75, 167, -91, -146, -29, + 49, 171, -106, -2708, 985, -542, -311, -444, 247, 475, + 48, 145, -233, 128, 240, -39, 283, -254, -450, 319, + -108, 47, -239, -127, 1, 299, 151, -44, 1, 140, + -53, -11, -15, -86, 95, -15, -13, -36, 75, -12, + -26, -67, -14, 1, 21, 12, -11, 25, 8, -12, + 54, 8, -11, 10, 5, -39, -52, 5, 1, -37, + -27, -8, -4, 7, -3, 4, 5, -11, 20, 17, + 19, 17, 13, -10, -11, 2, -1, 7, 22, -4, + 8, 4, 10, -2, 5, 2 + }, + { + -1070, -3122, -62, -282, 156, -276, -355, 365, -32, 340, + 20, 45, -452, -124, 2712, -628, -343, -518, 71, -24, + -8, -108, -92, 48, 76, 142, 158, -571, -38, -36, + -216, 158, -56, 81, 39, 220, -26, 69, 57, -60, + 156, 112, 100, -145, 57, 47, 20, -46, -42, -16, + 21, -40, -41, -52, 21, -49, -51, -2, -13, -16, + 37, -29, -69, -41, 21, -40, 0, -21, 76, -5, + 26, 27, -26, -7, -1, 11, 21, -18, 27, -14, + 4, -24, 28, -2, -20, -10, 7, -5, 9, 5, + 8, -4, -3, -3, -2, 7 + } + }, + { + { + 19, 2760, -1746, 52, 245, -138, -9, 1, -2, -111, + -118, 1, 447, 279, -731, -72, -20, -195, -634, -357, + 118, -506, -24, 428, 238, 210, -235, -425, -114, -512, + 278, -277, -224, -178, 20, -66, -43, 135, 97, 34, + -26, -41, -19, -16, -123, 23, 74, 13, -121, 50, + -12, -30, -1, -2, -96, 22, -18, 59, -36, -65, + 52, -44, 35, 6, -63, -2, 15, -4, 25, 39, + 9, -6, 7, 26, -2, 7, 27, -25, -6, 0, + 1, 16, 3, -15, 15, 3, 12, -11, 9, 7, + -20, -13, -11, -1, -3, 3 + }, + { + 881, -1141, -2930, 463, 8, 178, 96, -15, 281, -50, + 17, -406, -39, -35, -416, -98, 577, 144, -950, 227, + -187, 70, 223, 26, 12, -260, 153, 57, -79, -55, + 24, -25, -10, -157, 120, -31, 55, 159, 148, 18, + 43, 178, -18, 122, 131, -24, 13, -42, 71, -15, + -94, -5, 4, 7, 40, -39, 30, -48, -34, 0, + -20, -1, -3, 22, -22, -25, 3, -25, -1, -34, + 0, -40, -3, 2, 10, 13, 20, -11, -12, -14, + 32, -8, 17, 2, 8, 11, 0, -3, 0, -8, + -10, -10, -6, 10, -2, 4 + }, + { + -348, -3000, 2045, 211, -261, -379, -175, -29, 107, 166, + -254, -60, -547, 145, 557, -140, 24, 89, -483, -568, + -357, -408, -8, 84, 54, -107, -11, -365, 48, 255, + 127, 53, -3, 22, 218, 254, -201, 52, 284, -50, + 133, -105, 87, 144, -41, -163, 10, -85, 70, 93, + -51, -91, -93, -76, 66, 29, -158, -33, -41, -31, + 40, 5, 13, -45, -27, 66, -48, 20, 32, 3, + 54, -1, 2, 33, -22, -41, 4, -19, -25, 17, + 16, -17, -5, 6, 22, -5, 0, -2, 15, 11, + 4, -6, -1, -4, 4, 2 + }, + { + 82, 333, -360, -95, -18, 4, -68, -32, 0, 28, + -39, -14, 97, -156, 706, 389, 139, -742, -812, 70, + -138, -474, -433, -286, -255, 154, 130, 121, -81, -101, + 16, -255, -1, -52, -18, 54, -50, 175, -130, -7, + -20, 57, -99, 49, 93, 3, -116, 42, 120, 31, + 62, 6, -74, -22, -37, 8, 9, -20, -37, 66, + 4, 6, 3, 2, 11, 2, 30, -16, -11, -15, + 6, -48, 21, 0, -26, -4, -18, 0, -8, -9, + -20, -15, 25, 2, 13, 0, -4, 7, -12, 9, + -2, 3, 4, 3, 5, -3 + }, + { + -1966, 6688, -406, 370, 431, -50, 43, -103, -172, 314, + -217, -113, 72, 220, 954, -10, 0, 265, -150, -710, + 35, -141, -104, 4, 327, -230, 22, -244, 355, -36, + 54, -29, -259, -164, -49, 28, 577, -256, 100, -50, + 120, 62, -145, -8, -20, -38, -126, 10, -44, -19, + 60, 38, 63, 18, 42, 9, -4, -94, -23, 20, + -31, 1, -51, -10, 22, -38, 25, -3, -2, -35, + -34, 20, -15, -19, -7, 13, 23, 27, -15, 11, + -7, 18, 20, 8, -7, -8, -7, 8, -6, 6, + -7, 10, -7, 11, -14, 11 + }, + { + 8, -267, -229, 117, 68, 16, 16, 30, -58, 48, + -102, -22, -127, -159, 530, -73, -65, -355, -160, -1662, + -200, 329, -131, -502, 265, -449, -218, 180, -195, 96, + -190, -125, 27, -63, 221, -7, 32, 21, -77, 42, + 92, -106, 30, -40, -42, -7, 16, -54, -44, 36, + 37, 80, 29, -46, 21, -75, 27, 9, -15, 16, + 22, -34, -29, 47, -22, 51, 1, 20, 15, 24, + -9, 18, -15, -1, 3, 4, -41, -4, 28, 1, + -16, 9, 16, -9, -16, -7, 6, -6, 23, -12, + 13, -3, 8, 8, -7, -11 + }, + { + -263, 21044, -688, 1072, 133, -75, 3, -28, -147, 223, + 260, 19, -204, 0, 215, -490, 41, -31, -83, 13, + 46, 48, -115, -185, -124, -84, -124, 128, 98, 9, + 146, -118, -82, -223, -116, -139, -135, 115, -32, 14, + -9, 64, 4, -12, 76, -174, 134, 13, 110, 51, + -84, 79, -28, 12, -63, 32, -27, -32, 40, -48, + 33, 23, -12, -9, -8, -51, 8, -5, 34, -14, + -13, 26, 1, -5, 21, 4, 8, 20, -7, 5, + 30, -15, -21, -2, 6, 2, 0, 6, 13, 13, + -5, 18, 8, 10, 5, -1 + }, + { + 35, -430, 552, 43, 34, -18, -64, -61, -93, -17, + -43, 31, 128, 153, 1924, 705, 186, 149, 441, -414, + 491, 711, 8, 161, -659, -41, -108, -202, -118, -377, + 57, -77, -255, 116, -4, -91, -167, -8, 113, 54, + 47, -55, 41, 51, 28, 16, -8, 0, -29, 46, + 47, -31, 91, -16, -31, -57, -94, 13, -29, -48, + 76, 12, 41, -28, 6, 23, -4, 11, -11, 28, + -7, -55, 1, -6, 4, 11, 21, -38, -8, 4, + -31, 14, -1, 6, -3, 5, 5, -9, -16, -4, + 11, -5, -6, -2, -9, -13 + }, + { + -2471, -7960, 1403, 734, -124, 36, 0, 64, 18, -33, + 25, 131, 44, -165, -363, -92, 124, -126, 169, 42, + -60, -31, 242, 19, -41, -90, -16, -64, -88, -99, + 144, -28, -211, 36, -63, 92, 5, 10, -2, 154, + 5, -70, 69, 55, -60, -9, 3, 2, 31, -3, + -39, -82, -60, 8, 113, 11, 12, 7, 60, 12, + 33, -9, 43, 37, 23, 45, -22, -1, 20, 8, + 1, 4, 6, 4, 16, -11, 32, 31, -4, 1, + 0, 8, -26, -7, -8, 6, 7, -5, -1, 1, + -1, 6, -1, -7, -4, 3 + }, + { + 84, -133, -459, -35, -25, -19, -389, 193, 86, -123, + -355, -166, 33, -546, -359, -346, 374, -50, 250, 680, + 111, -79, 294, -375, 46, -143, -17, -206, 230, -14, + -44, 87, 125, -103, -174, 45, -36, -187, -23, -42, + -70, 7, 49, 112, 77, 9, -45, -58, 10, -112, + -30, 4, -57, 13, -34, -47, -106, -57, -53, -4, + 20, 33, 34, -32, 45, 15, -16, 11, -28, 25, + -18, 0, 23, 21, 22, 23, 4, -12, 19, 33, + -16, -9, 18, 13, 9, -5, 13, 13, 11, -5, + 1, -6, -3, 7, -3, 1 + }, + { + -923, -4397, 1127, -64, -211, -359, -93, 55, -398, 146, + 365, -363, -162, 48, -508, 120, -426, 113, 190, -114, + 255, 75, 21, -133, -105, 74, -48, 215, -28, -190, + -178, -56, 468, 236, -20, 107, 187, 13, -137, 125, + 82, -28, -59, -5, -70, -1, 20, -19, 38, -110, + -42, 20, 56, -36, 22, -7, 62, -54, 49, -18, + 22, 31, -12, 4, -29, 13, -12, 34, 4, -18, + -11, 5, 6, 12, -22, -11, -14, -7, -3, -20, + 6, -19, -6, -9, 7, 1, 6, 12, -5, -9, + -12, 4, 10, 4, 0, -5 + }, + { + 60, 660, -685, -256, 9, -56, -25, 95, -134, -44, + -43, -216, -181, 1434, -165, 129, -344, -49, 135, 349, + -661, 169, -65, -319, -289, -178, 320, -243, -2, -147, + 47, -97, 190, -25, -25, 45, -33, 46, 26, -138, + -30, 78, 75, 14, -115, -24, -29, 106, 106, -17, + -42, 25, -4, -77, 15, 24, 74, 56, 44, 4, + 24, -71, -2, -28, -43, 9, 28, -11, 2, -19, + 2, -14, -37, 5, 23, -1, 10, -13, 8, 7, + 0, -10, -7, -10, 1, 0, 4, 9, 11, 4, + -3, 1, 7, -6, 1, -3 + }, + { + -192, -4875, -699, -517, 629, -186, -290, -248, 22, 3, + -332, 220, -427, -1242, 418, -434, -77, -111, 143, -8, + -29, 119, 198, 108, -52, -189, -159, -74, -111, -52, + 66, 0, -170, 31, 112, -180, 176, -23, -80, -87, + 20, 144, 62, 84, 40, 109, 84, -46, -8, 1, + 33, -62, -16, 76, -5, -22, -6, 79, -17, -87, + -79, 30, 10, 59, 16, 61, -21, -33, -46, -27, + 0, -17, -38, -20, 19, -5, -10, 32, -39, -10, + 2, 6, -18, 6, 8, 24, 21, 14, 17, 0, + -3, -1, 6, 6, 5, 0 + }, + { + -26, -77, -48, 4, -29, 26, 108, -87, -152, 1, + -10, 56, -144, 301, -2649, -849, -247, -115, -28, 489, + 199, -140, -184, 344, -44, -9, -49, -84, -91, 90, + -5, -250, -57, -176, 13, 407, 54, -23, 82, -82, + 162, 24, -148, 31, 38, -85, 31, -39, 146, -28, + -75, -49, -26, 36, -65, 79, -3, -16, 37, -6, + 20, 0, 16, -41, 25, -36, -41, 11, 26, -33, + -44, -16, 12, -24, 5, 2, 8, -3, 17, 21, + 11, 23, -5, 4, -14, -8, 14, 6, 21, -2, + 5, 7, 4, 2, 2, 0 + }, + { + 481, -4704, -597, -391, 207, -196, -469, 164, 97, 330, + 110, -350, -88, 1054, 1232, -552, -600, -434, 20, -52, + 70, -269, -146, 18, -45, 222, 35, -136, -457, 135, + -84, 97, 38, -155, 174, 13, 130, 135, -56, 37, + 44, 210, 3, -36, 4, -11, 25, 50, -92, -18, + -13, 37, -63, -81, 42, -46, 5, -64, -34, 49, + -4, -5, -34, -30, -21, -50, 44, 15, 4, 24, + 19, 4, 17, -26, -4, 22, 2, 8, 4, 0, + -21, -1, 1, 12, -10, -12, -4, -8, 9, 6, + 3, 2, 2, -11, -7, 8 + } + }, + { + { + -96, 4276, -758, -467, 55, -21, 24, 20, -2, 0, + -14, -244, 160, -247, -958, 88, 290, 216, -402, -748, + 84, -167, 81, 200, -18, -11, -191, 21, 202, -317, + 233, -37, -56, -302, 59, -7, 30, -18, -130, 113, + -37, -108, 9, 13, -85, -18, -23, 24, -61, 56, + 1, -31, -17, 31, -64, 17, -34, -7, -11, 44, + 53, -72, 22, 14, -25, 1, 12, 18, 24, 4, + -17, -1, 8, 22, -6, -8, 18, 3, 2, -15, + -11, 11, -1, -17, -2, -4, 12, -5, 15, 6, + -5, -2, -11, 1, 6, 6 + }, + { + -1037, 1962, 957, 83, -52, 191, -105, -192, 220, -12, + 350, 216, 88, -94, -386, -135, 446, 167, -732, 421, + -92, -99, 33, 62, 229, -181, -42, 20, 2, 63, + 22, 14, 103, -106, 239, -66, 10, 65, 61, -12, + 2, 45, -35, 109, 22, -145, -26, -69, 75, -14, + -27, 119, 32, 0, 35, -70, -3, -53, 19, 41, + 10, -21, -30, 10, -5, 15, 9, -34, 14, -15, + 19, -22, -2, -6, 2, 9, 25, 2, -3, 1, + 19, -17, 17, 0, 5, -8, 12, 8, 15, -3, + -9, -5, 0, 2, -4, 7 + }, + { + 399, -7450, -1106, 1005, -69, -90, -42, -91, 6, -19, + -269, 283, -36, 352, 377, -39, 253, 278, 37, 21, + -49, -199, 11, -89, 11, -39, 193, -93, 298, 154, + -25, -98, -75, -137, -25, 78, -138, -59, 62, -35, + 213, -49, 15, 45, 17, -43, 66, -91, 67, 47, + -40, -10, 55, -60, -46, 7, -85, 15, 14, -10, + -17, 4, 29, -11, -10, 66, -42, 7, -3, -36, + 28, 21, 11, 25, -12, -11, 27, 0, -22, 18, + 23, -17, 8, 2, -4, -14, 7, -5, 12, 3, + -3, -6, -1, -10, 1, -1 + }, + { + -100, 768, 198, 27, 28, 24, -34, -7, 1, -33, + -89, 62, 220, -559, 122, 215, 225, -104, -206, 83, + -120, -22, 27, -35, -197, -75, -40, 92, 6, -98, + 164, -73, -16, -83, 81, 22, -111, 165, -44, 30, + 25, 58, -85, 43, 103, 36, -92, 10, 57, -20, + -47, -3, 38, 44, 4, -13, -22, 30, -31, 18, + -6, -8, -13, 22, -7, -47, 17, 24, -4, -31, + 7, -26, 22, -4, -1, 20, -4, 7, -7, 14, + -3, -16, 10, -7, 8, -4, 4, 7, -15, 1, + -7, 3, -3, -5, 0, -2 + }, + { + 1126, 7281, -2742, 19, -136, -8, 33, -29, -162, 89, + -25, -89, -162, 227, 894, -179, 28, -233, -403, -247, + 14, -102, 108, -206, 140, -334, 121, -188, 233, -59, + 55, 43, 45, -30, -93, -149, 438, -167, 116, -135, + 69, -3, -132, 1, 17, -25, -144, 25, 29, 76, + 39, -9, 33, -20, 29, 39, -11, -84, 16, 43, + -66, -7, -18, 3, 31, -22, 15, 6, 26, -8, + -31, -1, -3, 12, -3, -3, 19, 0, -12, 26, + -1, -1, 5, -8, -5, 4, 2, 17, -8, 13, + -11, 9, -5, 10, -12, 7 + }, + { + 6, 21, -123, -39, -11, -9, 34, -15, -104, 87, + -96, 28, -159, -372, 556, 259, 81, -243, 260, -1526, + -559, 68, -170, -661, 314, -83, -505, 19, 197, 271, + -127, -23, 277, -82, 64, -39, -73, -13, 59, 98, + 62, -105, 86, 31, -18, -26, 37, -10, -50, 31, + 3, 10, -9, -21, 41, -89, 4, 1, -2, 39, + 12, -1, 7, 29, -24, 43, -19, 6, 6, 7, + -27, -7, -22, 1, 8, 43, -14, -20, 3, -16, + -3, -2, 7, 1, -6, 4, 21, -11, 16, -12, + 12, 4, 15, 1, -11, -7 + }, + { + -1098, 20686, 25, 756, -13, -33, -30, -5, -96, 168, + 101, -2, -164, 5, 109, -558, 113, -98, -205, 50, + 87, 119, -92, -149, 64, -49, -188, 39, 49, 60, + 80, -33, 85, -213, -155, -46, -63, 68, -57, -54, + -28, 89, -62, -47, 84, -123, 144, 13, -8, -90, + -87, 9, 4, 74, 29, 106, -63, -58, 37, -43, + 36, 16, -27, 10, 28, -2, 5, -33, 34, -19, + -20, 27, -9, -29, 18, 7, 9, 18, 4, 5, + 2, -8, -2, -10, -2, 12, 8, -3, 3, 6, + -13, 4, -3, 4, 0, 1 + }, + { + 44, -560, 259, 7, 43, -10, -33, -13, 2, -2, + -65, 53, 119, -58, 1363, 138, -373, -4, 334, -307, + 305, 434, -210, 48, -224, 291, 107, 206, 119, -350, + 173, 28, -165, 136, 47, -2, -116, 23, 53, -36, + 14, -8, -34, -45, -30, -39, 42, -27, 55, 90, + 14, -26, 76, 39, 23, 33, -7, -5, -39, -30, + 77, -11, 1, -27, -40, -4, 22, 12, -36, 26, + -18, -45, 4, -6, -6, -22, 12, -20, -3, 10, + -32, 20, -9, 3, 12, 4, -4, -1, 3, -4, + 2, -4, -5, -1, -5, -8 + }, + { + 2345, -5788, -1929, 1034, -46, -57, -225, -44, 110, -14, + -9, 249, 114, 86, -179, 101, 210, -305, -150, -36, + 40, -43, 100, -116, -85, -45, 9, -67, 38, 13, + 49, 80, -12, 88, -50, 153, -46, 49, 28, 55, + -122, -119, -31, -3, -74, 43, 27, -44, -37, 33, + 9, -68, -13, -10, 42, -29, -2, -4, -11, -45, + 4, -26, -4, -16, -20, 22, -5, -8, 10, 10, + -10, -12, -12, -22, 4, -20, 29, 4, -17, -3, + 0, 5, -20, 3, -7, 10, 13, -9, -1, 7, + -4, 3, 4, 5, -5, -4 + }, + { + -105, 983, 502, -343, 59, 135, -597, -17, 6, -16, + -102, -145, 158, -29, -201, -230, 619, 130, 236, 139, + -108, 5, 269, -383, 151, -1, 124, -253, 152, 36, + -156, -7, 142, -24, -31, 41, 130, 24, 52, 43, + 60, 125, 62, 21, 14, -14, 23, -35, 65, -36, + -49, 17, 5, 72, -15, 58, -4, 7, 7, 45, + 20, -6, 15, -11, 16, -20, -18, 10, -24, 9, + -7, 2, -14, 9, -1, 2, 19, -8, -5, 23, + -3, -12, 14, 2, -8, -18, -2, 0, 1, 5, + 2, -6, -4, 9, -3, -2 + }, + { + 882, -4888, -514, 590, -44, -73, 16, 77, -243, 55, + 291, -70, 55, 65, -333, 139, -38, 301, -52, -137, + 136, 125, 92, 80, -22, 133, -75, 55, -56, -29, + -130, -279, 263, 99, -76, 94, 160, 49, -95, 78, + 4, -70, -17, 50, -13, -20, -29, -94, -15, -49, + -3, -4, 42, -62, 19, -11, 89, -9, 29, -29, + 1, 11, 6, 37, -21, 10, -9, 21, 4, -23, + -8, -2, -4, 8, 1, 19, -13, -7, 9, -11, + 14, -4, -8, -6, 4, 2, 1, 8, -12, 1, + -4, -3, -3, -1, 4, 1 + }, + { + -48, 915, -70, -27, 85, 23, 46, 123, -46, -28, + 25, -67, -166, 1680, 105, 267, -221, 141, 13, 3, + -342, 777, 113, -49, -341, -159, 413, -248, 282, 133, + 112, 7, -30, -91, -30, -82, -63, 27, 61, 95, + -8, -96, 6, 27, -47, 41, -9, 116, 52, 16, + 6, 9, 20, -23, 46, 10, 8, 18, 25, -35, + 26, -47, 5, -9, -40, -1, -5, -8, -14, -15, + 39, 10, -29, 0, 8, -8, 5, -16, -4, -2, + 8, -18, -5, 8, 12, 8, -3, -1, 1, 0, + -2, -2, 0, -13, 1, -9 + }, + { + 616, -3739, -186, -435, 389, -148, -125, -13, 88, 172, + -84, 238, 117, -559, 393, -246, 157, -245, -174, 118, + 9, -15, 11, 93, -18, -16, 37, -22, -47, -91, + 162, -4, -250, -26, 113, -97, 83, -53, 102, -21, + 66, 72, -70, -83, 15, 164, 35, -138, 7, -42, + 7, 31, -62, 6, -27, -19, 20, 36, -6, -36, + -70, 34, -20, 38, -20, 11, 10, -10, -28, -2, + -3, 1, -23, -12, 27, 6, -28, 17, -19, 3, + -16, -2, -22, 9, 5, 6, 1, -4, 5, -8, + -3, 5, 11, -6, 2, 2 + }, + { + 10, -120, -217, -87, -17, -69, 16, -48, -104, -2, + -125, 9, -227, 957, -1208, -68, -64, 91, -100, 71, + 74, -64, -126, 344, -159, -104, -227, 187, 164, -80, + -81, -169, 138, -102, -186, 160, 5, 55, 100, -91, + 112, -30, -105, 75, 43, -21, 115, -112, 44, -67, + -31, -54, -53, 24, -72, 42, -9, 10, -7, -15, + 26, -49, 21, -10, 23, -4, 2, 11, 28, -13, + -36, -5, 35, -27, -13, -5, 3, 13, 10, -3, + -11, 2, -15, 3, -5, 10, 14, -11, 2, -2, + 5, 2, -6, 3, 3, -3 + }, + { + 122, -4377, 71, -386, 348, 439, -90, 74, -33, 48, + 142, -90, 226, -522, -524, 266, 220, 25, -85, -142, + 74, -97, -34, -70, -166, 200, 9, 171, -193, 133, + -32, 42, 21, -185, 64, -136, -32, 11, -127, 14, + -45, 131, -46, -69, 47, 44, 56, 92, -8, 10, + 19, 83, -10, -25, 43, -18, 32, 3, 45, 20, + -73, -17, 0, 14, 19, -20, 35, -3, -30, 12, + -15, -21, 22, 0, 7, 5, -3, 17, 1, -3, + -11, 12, -14, 4, -2, -9, 1, 6, 3, 5, + 5, 4, 5, -10, 0, 6 + } + }, + { + { + 86, 2265, 646, -304, -104, 65, 28, 91, -4, -114, + -3, -99, -122, -228, -481, -65, 119, 156, -168, -350, + -141, -159, 77, 39, 141, -319, -32, 122, 171, -242, + 146, 146, -47, -110, -85, -9, -10, -199, -15, 52, + -17, -87, 0, 10, -96, -26, -39, 43, -7, -1, + 47, -15, -12, -1, 4, -32, -10, -32, -15, 50, + -6, -1, 22, -12, 0, 13, 14, 29, 2, 4, + -18, 1, 12, 2, -1, -1, 8, 21, 6, -20, + -7, 9, 4, -10, 2, -7, 2, 6, 9, 1, + 4, -4, -2, 2, 2, -1 + }, + { + 906, 1421, -754, 364, -92, 49, -51, -114, -42, 221, + 75, 331, 67, -101, -167, -148, 20, -110, 7, 93, + 0, -18, -48, 171, 62, -31, -19, -34, -54, 93, + 2, 71, 34, 75, 70, -6, 25, 81, -52, 13, + 15, -28, -13, 62, -4, -117, -44, 14, -4, -16, + 50, 70, 21, 33, 15, -38, -36, -10, 18, 10, + 28, 4, -30, -15, 0, 2, 6, 3, 6, 8, + -5, 0, -2, -3, -16, 14, 18, 8, 8, 3, + 1, -2, 11, 4, 5, -10, 3, 8, 11, 6, + -8, -2, 0, -2, 1, 2 + }, + { + -396, -7660, -313, 496, 709, 71, -5, -83, -42, -174, + -130, 98, 188, 311, 81, 298, 64, 68, 251, 166, + -181, 27, 37, -134, -8, 13, 225, 140, 95, -43, + 0, -98, -66, -130, -13, -47, 55, -47, -62, 15, + 134, 34, -5, 27, 27, 9, -6, 43, 44, -9, + -37, -6, 42, 1, -59, -17, 3, 24, -24, 1, + -47, 28, 4, 30, 19, 17, -14, -4, -17, 4, + 14, 12, 19, 11, 5, -4, 4, 3, 3, 1, + 8, 0, 13, -3, -17, -6, -1, -3, 6, 0, + -4, 1, -4, -1, -3, -1 + }, + { + 82, 586, 90, 87, 30, 4, 24, -23, -24, 8, + -63, -45, 106, -202, -67, -163, 286, -17, -249, 144, + -112, 88, 119, -142, 60, -171, -40, 27, -37, -46, + 46, 32, -7, -14, 20, -19, 3, 24, 51, 16, + 27, 24, 39, 5, 85, 28, -37, -21, -8, 23, + -72, -14, 80, 11, 20, 2, -15, -3, -5, 6, + -29, -11, -11, 8, -3, -21, -4, 25, -3, -13, + -22, -6, 4, -13, 16, 12, 7, 2, -1, 9, + -4, -4, 0, -1, 4, -1, 2, -1, -5, -3, + -3, 0, 1, -2, -3, 5 + }, + { + -321, 5742, 217, -445, 10, -11, 24, 32, -91, -14, + 113, -107, -133, 97, 529, 140, -304, -370, -52, -129, + -9, -10, 29, -93, -102, -174, 39, 60, -35, 36, + 40, -39, 93, -28, -26, -119, 59, 76, 15, -64, + -32, -42, -30, -75, 79, -9, -63, -22, 0, 66, + 69, 33, -10, 16, 25, 34, -30, -52, 12, 24, + -43, -13, -8, 9, 10, 21, -25, 11, 22, -3, + -19, -13, 3, 5, 2, -1, 13, -3, 1, 14, + 8, 0, -3, -10, 3, 1, 6, 6, -9, 10, + -5, 7, -3, 2, -6, 2 + }, + { + 11, 72, -51, -62, 9, -13, 25, -14, -45, -16, + -23, -62, -142, -228, 227, 187, 337, -268, -18, -1435, + -61, -207, -56, -477, 10, 78, -194, -168, 161, 102, + -72, 119, 65, 0, 15, -24, -33, 49, 62, 53, + 7, -3, 25, 23, 10, 0, -17, 26, 11, 13, + -29, -14, -15, -26, 21, -54, 7, -12, 3, 32, + 23, 1, -1, 33, 2, -2, -10, 10, -3, -22, + -15, -1, -15, 2, 2, 30, 10, -3, -24, -6, + -1, 2, 1, -4, 3, 3, 9, 1, 8, 3, + -2, 8, 7, 1, -2, 0 + }, + { + 1894, 14301, 1681, 462, 182, 4, -27, -20, 39, 35, + 52, -45, -128, -100, 46, -105, -159, -55, -102, -41, + 35, 5, -27, -27, -22, -3, -47, -7, 1, 4, + 75, -72, 34, -29, -167, 29, -5, -17, -86, -69, + 2, 14, 35, -77, -41, 81, 40, -46, -7, -72, + -40, -38, -6, 70, 42, 30, 20, -41, -6, 15, + 17, 0, -26, 14, 12, 24, 11, -23, 6, 0, + -10, 3, -6, -7, 10, 11, 9, 3, 9, 1, + 4, -1, -1, -5, -5, 14, 3, 1, -1, -3, + -1, -2, -6, 2, 2, 2 + }, + { + -32, 74, -225, 121, 42, -23, -9, -37, 36, -5, + -62, 78, 24, 137, 585, 34, -118, -217, 179, 276, + 15, 83, -187, -47, -125, 92, 333, 321, -110, -172, + 169, 114, -82, 14, 18, -25, 39, -16, 46, -22, + -43, -31, -19, -55, -38, -15, 10, 8, 66, 59, + -36, 55, 38, 26, 21, 54, 28, -16, -27, -12, + 32, 7, -22, -5, -24, -19, 6, -4, -19, 13, + -10, -17, -21, 4, -10, -18, 5, 4, -6, -3, + -8, 4, 1, -8, 9, 1, 2, 0, 7, 0, + -4, 0, -3, 0, -3, -4 + }, + { + -1878, -2222, -73, 652, 11, -6, -187, -88, 5, 91, + 78, 43, 91, -203, 160, 137, -19, -107, -147, -23, + 25, 51, -76, 32, -53, -79, -7, -21, -20, 109, + 26, 29, 78, 38, -39, 92, -42, 43, 30, -37, + -170, 107, -46, -77, -42, 9, 73, -44, -73, 6, + 42, -28, 22, -33, -1, -2, -30, 11, -38, -29, + -39, 6, -14, -8, -29, -18, 10, 14, 5, 5, + -17, -16, -2, -25, -1, 2, 13, -4, -9, -12, + 7, -7, -7, -2, -9, 3, 6, 6, 1, 6, + 2, 1, 4, -2, 4, 0 + }, + { + 99, 1011, 191, -75, -61, -53, -262, -73, 17, -43, + 35, -174, 46, 111, -351, 123, 80, 263, 353, 71, + -116, 55, 12, -41, 134, 12, -17, -115, 41, -70, + 95, -134, 100, 10, 21, 54, 100, 39, 114, 49, + 61, 109, 111, -38, -1, -13, 8, 13, 5, 9, + -24, 12, 33, 60, -16, 32, 34, 6, 23, 31, + 3, 15, -5, 2, -18, -21, -8, 2, 6, -3, + 10, -14, -13, 2, -1, 2, 11, -7, -7, 2, + 0, -1, 9, -3, -4, -3, -8, -4, -4, 5, + 2, -2, -1, 3, 1, 0 + }, + { + -809, -3158, 198, -36, 183, -93, 148, 26, -44, -38, + 56, 165, 45, 7, -48, -91, 334, 121, -124, 61, + 47, 49, 112, 49, 64, 48, 14, -38, 10, -110, + -83, -124, 71, 86, 18, 86, 50, 15, -36, 102, + -3, -11, -41, 31, -39, -37, -13, -51, -38, -33, + 8, -7, 10, -40, -1, -6, 17, 57, 10, 0, + -1, -7, 13, 15, -5, -2, 1, -2, 12, -16, + 1, -13, 2, 14, 7, 13, -12, 0, 5, -2, + 4, 9, -13, 4, -4, 4, 2, 1, -4, 3, + -4, -1, -5, -4, 6, 2 + }, + { + 29, 708, 116, -36, 109, 21, 37, 53, -1, 6, + -11, 51, 462, 600, 246, 4, 43, 138, -23, -170, + -42, 485, 116, -8, -90, -133, 78, 145, 156, 241, + 45, -25, -87, -44, -57, -49, -26, 1, 21, 104, + 23, -63, -28, 30, 17, -23, -2, 102, -30, 60, + 39, 0, 18, 14, 18, 10, 4, -10, -10, -4, + -31, 4, -4, -13, -34, -8, -14, -19, -11, 6, + 26, 6, -9, 10, -10, 5, -2, -8, -7, -5, + 2, -7, -2, 5, 4, 4, -2, 1, -1, -4, + 2, 0, -6, -4, -4, -5 + }, + { + -676, -2212, -318, 134, -29, 125, 220, -19, -22, 138, + 118, -53, -212, 287, 329, -116, 9, -155, -193, 90, + 73, -43, -25, -20, 41, 33, 79, 2, -69, -50, + 170, -105, -64, -52, 71, 19, -56, -25, 118, 71, + 7, 8, -6, -141, -63, 86, -2, -59, -27, -32, + -3, -6, -4, 9, 33, -28, -9, 11, 1, 5, + -36, -14, 16, -1, -8, -6, -1, -4, -8, 5, + -12, 1, -9, 7, 14, 6, -21, -5, 7, 7, + -20, 0, -17, 4, 8, 3, -8, -5, -5, -6, + 2, -3, 9, -1, 5, 7 + }, + { + -16, -106, -220, -164, 78, -34, -78, 36, -54, -19, + -111, -99, -162, -750, 1838, -182, -197, 91, -143, -131, + 17, 67, 150, 41, -4, -217, -93, 199, 154, -112, + -85, -35, 6, -47, -99, 6, 56, 32, 77, 0, + -19, -22, 13, 55, -19, 11, 62, -19, -22, -50, + -31, -11, -31, -42, -13, -16, -14, 37, -30, -9, + 18, -16, -10, 4, 22, 7, 5, 14, -1, 1, + -13, 5, 1, 2, -12, 3, -8, 11, -1, -2, + 0, -8, -11, 0, 2, 2, 2, -4, -3, -4, + 6, 5, -2, 1, 5, -5 + }, + { + -491, -2949, -424, -77, 219, 394, 258, 86, -155, -60, + 91, 278, 76, 86, -1180, 137, 440, 27, -94, -56, + -5, -24, -53, -63, -27, 39, 11, 183, 7, -68, + 1, 92, 26, -152, -34, -98, -47, -57, -15, -59, + -17, 57, -28, -53, 31, 30, 44, 51, 45, -7, + 50, 22, 34, 31, 16, -2, 12, 30, 34, -13, + -37, -19, -14, 11, 21, 0, 0, -2, -17, -4, + -12, -17, 7, 19, 11, -11, 17, 8, -8, 4, + -6, 8, -12, 0, -3, -1, 0, 8, 3, 5, + 9, 2, -2, -4, 6, 1 + } + }, + { + { + 19, 387, -460, -46, 54, -8, -34, 20, 7, -91, + 14, -4, -37, 1, -64, 37, -74, 57, 1, -18, + 81, 126, 105, -5, 210, -222, -68, 23, 70, -226, + 203, 77, -111, -71, -51, 44, 75, -98, 47, 13, + 0, -17, -10, 22, -16, 28, -38, 31, 0, -32, + 15, -24, 0, 9, 23, -12, 4, -21, -15, -1, + -31, 21, 26, -3, 5, 11, -2, 13, -9, 10, + -3, -2, 9, -10, -4, 2, 0, 8, 11, -4, + 3, 3, 0, -2, 14, 1, -2, 0, 2, -1, + 2, 0, 2, 4, 0, -4 + }, + { + -664, 981, 354, 198, -182, -72, 41, -17, -114, 48, + -174, 118, 63, -15, 64, -69, -174, 107, 356, -71, + -57, 40, -141, 80, 35, 33, 20, -64, -56, 49, + -25, 76, 12, 24, 8, 52, -79, -5, -64, 21, + -38, -41, 0, 52, 23, 12, -12, 11, -14, -2, + 36, -12, -10, -12, 1, -2, -18, 19, -4, -17, + 2, 18, -4, 3, 8, -13, -5, 13, 5, 4, + -5, 18, -5, -3, 1, 3, 6, 6, 7, -7, + -7, 3, 1, -3, 0, -4, -3, 4, -3, 5, + -5, 0, 0, -1, -3, -2 + }, + { + 215, -4929, 953, -518, 96, 15, 2, -14, -27, -1, + 25, 13, 39, 127, -186, 33, -209, -55, 180, 133, + -106, 69, 77, -58, 128, 41, 133, 70, -91, -152, + 51, 75, 62, -2, -23, -79, 56, -62, -23, -8, + 30, 2, -14, -1, 6, 51, -11, 21, 5, 20, + 9, -3, 3, 20, -7, 2, 5, 14, -20, 14, + -40, 12, -15, 10, -3, 14, 2, -3, -12, 2, + -2, -9, 5, 3, 9, -10, -3, 8, 12, -4, + 5, 5, 4, 4, -6, -5, -4, -3, 5, 3, + -6, 4, -2, 2, -2, 0 + }, + { + -47, 321, -16, 12, -4, -17, 17, 12, -16, 6, + -10, -40, 108, -199, -136, -202, 3, 67, -107, 70, + 7, -15, 81, -53, 50, -122, -16, 87, 54, 28, + -17, 44, 41, 28, 33, -7, 22, -53, 12, 41, + 28, 0, 48, -3, 7, -3, 9, -22, -21, 56, + -18, -24, 39, -26, -13, 0, -6, -13, 6, 11, + -21, -2, -10, -10, -5, 1, -9, 1, -9, 6, + -4, -11, 1, -1, 13, -6, 1, 1, 5, 5, + -1, 1, 4, 2, 4, 0, -3, -3, 0, 0, + -2, -2, 1, 3, -2, 5 + }, + { + -312, 4613, -137, -287, -23, 9, 16, 84, 28, -2, + -47, -128, 10, -12, 161, 41, 115, 28, -26, -66, + 48, 44, 3, -56, -102, -30, 39, 66, -90, -24, + 38, -50, 13, 0, 69, -87, -34, -6, 12, 25, + -27, -53, 5, -11, 74, -4, 27, 8, -20, 26, + 26, -19, -23, 39, 14, -1, -8, 5, 6, -3, + -9, 7, -5, 13, -5, 11, -22, -8, -4, -9, + -2, -3, -4, -11, -4, 2, -3, 5, 1, 1, + 5, 1, -9, -1, 3, -5, 2, 2, -6, 6, + -5, 3, -3, 2, -4, 3 + }, + { + -23, 121, 218, 13, -19, -21, 6, -4, -32, 5, + 36, -15, -30, -106, 30, -124, 302, -123, 213, -1088, + 193, -102, 176, -39, 102, 33, 53, -24, -14, -55, + -47, 49, -119, -40, 32, 19, 37, 44, 9, -11, + -28, 2, -58, -22, -9, 21, 8, 26, -2, -6, + -15, -17, 10, -19, -2, -8, 27, -23, 6, 8, + 6, -7, -13, 16, -12, -2, -4, -2, -6, -5, + -6, 14, 3, 1, -10, 9, 2, 5, -9, 6, + -7, 2, -2, -2, 1, -3, 1, -2, 0, 4, + -4, -2, -3, 1, -1, 0 + }, + { + -1965, 6268, -470, 152, 14, 18, -16, 29, 65, -13, + 5, -29, -80, -73, -6, 30, -46, 22, 53, -3, + 30, 11, 14, 18, -18, 23, -5, 17, -4, -71, + 11, -105, -5, 36, -22, 139, -1, -42, -44, 4, + 4, -47, 67, -34, -38, 75, 3, -69, 20, -3, + 3, -21, -38, 29, 0, -28, 11, -17, 0, 17, + 5, 6, -15, 2, -3, 4, 7, 1, -1, 7, + 11, -1, -11, 6, 10, 3, -4, -5, 2, -4, + 9, -1, 1, 4, -2, 2, -3, 5, 0, -2, + -1, -1, -4, 3, -2, 0 + }, + { + -28, 283, -73, 33, 33, -17, 32, -7, -2, 20, + -25, 29, -85, -59, 113, -182, -70, -219, 68, 158, + -91, -97, -71, 56, -52, 122, 41, 48, -78, -93, + 107, 53, -111, 8, 11, -44, 65, 9, 25, -19, + -37, -22, 29, -17, -17, 5, -4, 39, 24, 9, + -34, 48, -3, -14, -12, 9, 2, 2, 14, -5, + 13, -1, -2, 12, 3, -10, -12, -4, 3, 0, + -1, 11, -7, 7, -8, -9, 1, 5, -3, 0, + 5, -4, 1, -12, -1, -2, -1, 4, 0, -3, + 1, -1, -2, 0, -1, 2 + }, + { + 1160, 1514, -466, 348, -49, 45, -38, 19, -40, 28, + 18, -112, -8, -314, 214, -24, -26, 121, -58, -24, + 48, 57, -122, 90, 37, -33, 49, 58, -34, 56, + -23, -4, 45, 36, -50, 44, -42, -2, 7, 34, + -158, 77, -9, -47, -21, -59, 37, 51, -2, -33, + 2, -28, 34, -17, 26, 38, -21, 2, -13, 10, + -23, 11, -15, 1, -10, -19, 8, 19, 0, -6, + -7, 3, 9, -13, 7, 14, 1, 0, 4, 1, + 3, -4, 2, 3, -5, -5, -2, 7, 1, 3, + 2, -1, 1, -8, 7, 0 + }, + { + -74, 603, -152, 53, 29, 52, 184, 48, 1, -15, + 152, -44, 52, 32, -413, 163, -127, 43, 143, 59, + -30, 128, -91, -90, 29, -4, -23, -61, 9, -110, + 179, -142, 27, -6, 1, 17, -4, -33, 82, -9, + -4, 6, 45, -28, -20, 13, 2, 41, -6, -26, + -10, 9, -2, 17, -14, 2, 17, -16, -9, 7, + -5, 1, -12, -3, -1, -3, -2, -1, 2, 8, + 16, -6, 0, -7, -1, 5, 3, -5, -2, -4, + 2, 0, 5, -1, 3, 3, -3, -1, -1, 0, + 2, -2, 0, 0, 2, 2 + }, + { + 652, -1319, -6, -218, 41, -210, 146, 58, 54, 0, + -15, 91, 13, -3, 99, 81, 442, 139, -69, 29, + -4, -14, 39, -52, 59, -2, 56, -58, -50, -26, + 43, -1, 0, -8, 27, 56, -32, 39, 0, 56, + -3, 58, -31, 43, -2, 9, 16, -2, 26, -24, + 8, -25, 0, 8, 7, -15, -23, 20, 13, 6, + 0, 8, 6, -2, 2, 6, 4, 2, 12, -1, + 8, -11, -3, 9, 1, 0, -5, 5, 0, 1, + -2, 6, -4, 0, 1, 0, 2, 0, 0, 2, + -3, 2, -1, -2, -1, 0 + }, + { + -5, 446, -122, -113, 51, 47, -15, -10, 6, 45, + 8, 77, -20, -317, 174, -44, -57, -12, 2, -90, + -114, -18, 19, 65, 61, -17, -46, 80, 18, 76, + 36, -69, -3, 22, -16, -23, 14, -11, -5, 39, + 23, -19, -27, 33, 15, -33, -30, 22, -58, 13, + 8, 4, 13, 14, -2, 2, 9, -15, -32, 4, + -39, 16, 19, 12, -26, -7, 10, -13, -5, -9, + -5, -9, -5, 13, -12, 6, 6, 2, 2, 2, + -3, 0, 1, -2, -4, 0, -2, -3, 2, -4, + -2, -1, 0, 4, -3, 0 + }, + { + 450, -196, 64, 333, -209, 39, 282, -58, 12, -19, + 4, -62, 47, 667, 180, -150, 11, -10, -44, 12, + 109, -52, -55, -34, 32, -67, -32, -19, 41, 29, + 92, -69, 78, -13, -25, -22, 18, 5, 30, 18, + -48, 3, 26, -70, -67, 24, -20, -8, -15, -9, + 23, 3, 13, 11, 37, 5, -13, 5, 1, 4, + 4, -2, 25, -8, 10, 10, -6, 2, 4, 11, + -1, 5, 1, 8, -6, -1, -6, -8, 5, 6, + 1, 9, -8, -2, -2, 6, -3, -5, -1, 0, + 5, 0, 4, 2, 0, 3 + }, + { + 18, 142, 18, -83, 92, 1, -32, -10, -30, 23, + -27, 85, -120, -429, 2537, -85, -147, -6, -79, -142, + -222, -108, 110, 10, 54, -146, 55, 4, 18, -16, + 5, 67, 43, 0, 26, 2, 58, 1, -15, 30, + -23, -3, 29, 5, -29, 15, 19, 13, -10, -6, + -7, 20, -3, -31, 24, 22, -20, 20, -25, -1, + 18, -5, -9, -6, 4, 1, -21, -4, -2, 2, + 2, 13, -8, 21, 1, 1, -3, 2, -4, -2, + 3, 3, -2, -1, 3, -4, -3, -6, 6, -3, + 4, 4, 0, -2, 3, -2 + }, + { + 530, -1158, 88, 324, 47, -44, 165, 131, -57, -22, + -25, 282, -100, 304, -678, -53, 172, -17, 47, 43, + -12, 1, 35, -12, 3, 37, -64, 49, -44, -110, + -16, 24, 4, -66, 37, -1, 14, -35, 26, -11, + 2, -2, -22, -42, -3, 12, -19, -23, 35, -6, + 30, -32, -9, 20, 17, 3, -5, 17, 27, -15, + -3, 13, -6, -2, 6, -7, -6, -3, -11, -1, + -1, -4, 2, 6, 10, -6, 7, -4, -5, 5, + -6, 6, -5, -1, -4, 1, 3, 0, 4, -2, + 4, 0, -4, -1, 4, 0 + } + }, + { + { + -97, -577, 278, 115, 29, -56, -38, -26, 22, -56, + -43, 31, 17, 29, 12, 68, -119, 37, 74, -11, + 104, 21, 48, 128, 2, 11, -76, -23, -82, -66, + 80, 68, -129, -34, -10, -6, 15, 22, 75, -12, + 9, -5, -4, -3, 29, 7, 7, 10, -23, -4, + 11, -22, -15, -2, -5, 17, 0, 4, 2, -33, + -7, 6, 6, 15, 0, 5, -3, 1, -8, -1, + 7, 2, 2, -6, -5, 7, 1, 0, -2, 3, + 3, 0, -3, 1, 5, 3, 0, -1, 2, 4, + 1, -1, 3, 3, 0, 0 + }, + { + 571, 396, -482, -26, 74, -39, 32, 12, 12, -95, + -58, 17, 13, 18, 78, -74, -37, 205, 153, -8, + -58, 18, -58, 24, 20, -13, 25, -35, -33, -17, + 50, 34, -7, 31, -30, 84, -57, -67, 20, 20, + -50, 5, -9, 6, 31, 21, 28, -7, 16, -6, + 22, -27, -24, -13, -2, -5, -5, 14, -21, -11, + -6, 4, 8, 3, 1, 0, -3, -1, 4, -1, + 0, 11, -1, -14, 12, 6, 0, 11, -1, -6, + -1, -1, -4, -2, -1, 3, -3, -1, 0, -2, + -2, -3, 0, -1, -1, -1 + }, + { + 40, -3172, -14, -739, -80, 47, -34, -1, -12, 85, + 28, 96, -62, 72, -46, -56, -203, 27, 98, -38, + 81, -53, 35, 3, 144, 71, 42, 26, -106, -54, + 61, 84, 46, 32, -27, -50, 55, -90, -29, -3, + 37, -37, -14, -9, -22, 52, 27, -11, -16, 30, + 8, 14, -23, 16, 24, -7, -25, 1, 9, -4, + -19, -11, 3, -11, -13, 10, 2, 1, -7, -2, + -8, -12, 5, 5, 2, -7, -1, 7, 8, 3, + 4, 2, -1, 4, 3, -4, 0, 1, 2, 3, + -4, 1, 0, -1, -2, 2 + }, + { + 30, 237, -5, -46, -3, 2, 2, 2, 4, 4, + 1, 5, 16, -135, -326, 186, -53, -122, 109, 49, + 2, 28, 50, -9, -102, -27, 18, 55, 24, 41, + 4, 52, 32, 11, 31, 20, 13, -62, -19, 42, + 24, 23, 3, 5, -1, -14, 15, -25, -1, 12, + 33, -18, -3, -6, -24, -1, 3, -12, -2, 20, + -8, 5, -1, -20, -10, 10, -3, -15, -5, 4, + 5, 1, -3, 3, 4, -2, -3, -2, 3, 3, + 2, 3, 1, 4, 3, 4, -3, -4, 0, -3, + 2, -1, -1, 0, 0, -1 + }, + { + 692, 2822, 193, -131, -3, -5, 11, 64, 61, -4, + -118, -108, 22, -34, 180, 36, -67, 255, 59, -8, + 28, 58, -72, 6, -30, -34, 57, -45, -29, -24, + 29, 13, -9, -27, 14, -32, 34, -8, 25, 28, + 8, -50, -29, 58, 11, 7, 28, -16, 2, 20, + -17, -12, -9, 34, -12, -13, 11, 18, -8, -3, + 6, 5, -19, 14, -6, -4, 6, -12, -12, -13, + 4, 0, 4, -9, -7, 4, -8, 7, -1, -3, + 0, 1, -8, 2, 3, -3, -2, 4, -4, 0, + 0, 0, 0, 2, -2, 1 + }, + { + -3, 184, 76, 16, -10, 1, -22, -6, -23, 15, + 11, 6, 22, -26, 84, -15, 10, 65, -79, -890, + 177, 25, 41, 201, 30, 32, 66, -63, 14, -100, + 38, -22, -76, -65, 40, 4, 37, 14, 23, -12, + -29, 1, -66, -19, -25, 11, 0, 25, 18, -29, + 11, -35, 18, -3, -6, 4, -7, 2, -5, 2, + 12, -11, 1, 6, -14, 0, 4, -1, 0, 6, + -1, 2, 7, -4, -6, 1, -4, -2, 1, 1, + -5, 1, -1, -1, 3, -2, -3, -2, -2, -2, + 5, -1, -7, -1, -1, -1 + }, + { + 1513, 428, 2, 227, 1, -5, 16, 22, 3, -14, + 28, -4, -44, -21, -70, 28, -19, 24, 50, 24, + 32, 36, 33, 10, -33, 24, -28, 20, 14, -44, + -24, -75, -19, 10, 16, 46, 53, -72, -8, 22, + 4, -31, 4, 20, 0, 14, 18, -41, 26, 9, + -2, -16, -11, 7, -2, -36, -6, -1, -3, -1, + 5, 5, -5, 1, 1, -12, -7, 12, -1, 9, + 3, 12, -10, -3, 10, 3, -2, -7, 1, 1, + 5, -1, -3, 0, 3, -4, -1, 5, 4, 0, + -3, -1, 2, 3, 0, -2 + }, + { + 21, 17, 52, -26, 30, 8, 10, 24, -31, -5, + 12, 21, -49, -46, -166, 19, 21, 77, -49, 57, + -75, -25, 69, -12, -28, 85, 52, -77, -112, 67, + -50, 32, -51, -17, 29, -11, -23, 60, 10, -26, + -26, -17, 14, 22, -13, 15, -22, 42, 30, 0, + -11, 3, 9, -11, -16, -19, -20, 22, 20, -2, + 5, -8, 20, -7, 4, -1, -7, -1, 8, -6, + 1, 2, 0, 11, -8, -7, 0, -2, -4, -2, + 5, 2, 0, -3, -8, 0, -2, 0, -1, -4, + 1, -1, -3, 0, 0, 2 + }, + { + -410, 3334, 34, 127, 75, -28, 13, 14, -3, -10, + -40, 1, -15, -143, 56, -24, 23, 56, -24, -42, + 22, 33, -5, 28, 33, -14, 10, 110, -53, -10, + -6, 35, -31, 18, -24, 12, 46, 27, -69, 9, + -65, 16, -36, -12, 0, -45, -41, 57, 40, -6, + -31, -31, 19, 8, 13, 28, 3, -1, 6, 7, + -13, 0, -3, -11, 6, 1, 3, 2, 3, -2, + -2, 2, 1, -1, 8, 8, 1, -1, 4, 6, + -2, 0, 4, 5, 1, -3, -3, 2, -2, 2, + 2, 0, 0, -4, 1, 1 + }, + { + 49, 284, -265, 98, 178, -26, 251, 66, 9, 51, + 51, 27, 21, 44, -319, 25, -58, 60, -104, 186, + 54, 96, -66, -75, -53, -10, -46, 11, -10, -57, + 59, 22, -49, -4, 1, 21, -69, -18, 10, 0, + 16, -28, -15, 21, -14, 15, 1, 16, 9, -10, + -22, 17, -9, -19, 18, 1, -7, -9, -15, -3, + 4, -12, 7, -5, 4, 11, -4, -6, -6, 4, + 11, -1, 5, -3, -1, 1, 6, -3, 6, -1, + 6, 1, 0, -1, 0, -3, 2, 1, 1, -1, + 1, -1, -1, 0, 0, 1 + }, + { + -471, -217, 244, 59, -98, -24, -248, 81, 52, 70, + 40, -2, 24, -21, 72, 247, 182, 95, 132, -43, + -47, 8, 8, -51, 12, -2, 23, 11, -54, -22, + 38, 52, -23, -63, 75, 8, -2, 42, 46, -24, + 9, 29, 23, 38, 9, 12, 3, 6, 23, -16, + 2, -6, -15, 4, 17, -10, -3, -5, 14, 13, + -4, 8, -1, 5, 5, 6, 6, 8, 0, 1, + 9, -4, -6, -2, -3, -6, -5, 6, 4, -3, + 1, 1, 0, -4, 2, -1, -2, 1, 2, 1, + -3, 0, 2, 2, -3, -2 + }, + { + -13, 342, -23, -170, 17, 61, -6, -15, 8, -16, + 5, 61, -87, -146, 148, -61, 28, -177, 54, -55, + -99, -123, 34, 33, -28, 95, 37, 19, 36, -33, + 24, -41, 22, 9, 1, -25, 18, -4, 2, -11, + 8, 2, 6, 17, -24, 9, -13, -21, -16, -16, + -20, 20, 6, 12, 0, 0, 9, 5, -13, 0, + -19, 8, 9, 10, 0, -11, 5, 2, -6, -7, + -17, -8, -5, -1, -2, -1, 3, 1, 2, 5, + -3, 1, 4, -1, -2, -1, 1, -1, -1, -2, + -3, -1, 3, 0, -1, 0 + }, + { + -124, 907, 167, -70, -140, 5, 109, 2, 23, -55, + -10, -48, 161, 498, 52, -49, -45, 56, 0, -48, + 48, -11, -13, -22, -39, -102, 18, -97, 29, 73, + 34, -31, 52, 22, -7, -51, 35, 19, -3, 20, + -50, 6, -12, 14, -7, 9, 7, -5, -10, 23, + 13, -23, 18, 11, 6, 19, -17, 0, 5, -4, + -1, 2, 14, 1, 14, 13, 0, 9, 0, 8, + 1, 6, 1, -9, -3, -3, 1, -7, -4, -1, + 9, 6, 0, -7, -7, 4, 2, 3, 0, 3, + 3, 5, -3, 2, -1, -1 + }, + { + -2, 150, 95, 30, -13, 41, -1, -45, -40, 38, + 5, 33, -41, 725, 443, 35, -5, -94, 130, -169, + -319, -70, 42, 89, -48, -91, 68, -31, -13, -70, + 108, 16, 30, 35, 55, 41, 36, -14, 3, 11, + -2, 22, -8, -29, 8, 19, 3, 15, -12, 4, + -3, 0, -9, 11, 7, 13, 3, -3, -2, 5, + 1, -12, 2, -3, -6, 0, -19, -13, 5, -3, + 2, 10, -2, 12, 7, -1, 3, -5, -1, 0, + -1, 3, 2, 3, 2, 0, -5, 0, 5, 3, + -3, 0, 2, 0, -2, 0 + }, + { + -325, 36, 104, 351, 16, -83, -21, 69, 57, 98, + -75, 101, -70, -168, 223, -131, -169, -19, 41, 98, + -9, -4, 26, -9, -24, 79, -72, -54, -58, -63, + 0, 4, -39, 22, -8, 36, 33, 3, -3, -17, + -11, 3, -14, 6, -14, 10, -35, -12, -2, 6, + 16, -24, -1, -7, 8, -4, 5, 18, 8, -3, + 9, 15, 4, -2, -7, -5, -2, 0, -1, -3, + 1, 2, 3, 0, -9, 13, -2, 0, -1, -1, + 1, -1, -2, -1, 0, -1, 0, -6, 6, 1, + -2, 3, -3, -2, 0, 0 + } + }, + { + { + 81, -904, -239, 67, -6, -51, -22, -36, 5, 26, + 20, 56, 70, -7, 91, 153, -90, -21, 27, -60, + 174, -2, -25, 131, -9, 137, 30, -20, -48, -38, + -101, -37, -121, 15, 55, 33, 4, -8, -14, -16, + 25, 0, 17, 2, 41, 14, 10, -3, -20, 19, + 10, -15, -12, -1, -24, 4, 0, -1, 14, -6, + 11, -1, -11, 2, -9, 0, -9, 0, 0, -11, + 3, 3, 1, 9, 2, 10, -1, 0, -6, 1, + 0, 1, -3, -1, -3, -1, 2, -4, -1, 2, + 3, -3, 1, -1, -2, 2 + }, + { + -558, -1230, -291, -84, 2, 20, -17, -8, 68, -34, + -7, 37, -15, -18, 25, -57, 47, 29, -91, 52, + -48, 7, -15, 8, 32, -11, 22, 28, 25, 14, + 72, -9, -73, 3, 23, 56, -19, -16, 28, 2, + -24, 14, -5, 5, 30, -19, 33, -15, 24, -15, + 12, 4, -19, -13, 4, -7, -14, -10, -3, 3, + 0, -12, -1, -2, -2, 11, 0, -11, 3, -7, + -1, 2, 0, -12, 1, 5, -10, 4, -2, 3, + 5, -7, -2, 0, -5, -4, 6, -3, 2, -3, + 3, 0, 1, -3, 1, -1 + }, + { + -162, -2819, 463, -319, 11, 21, 3, -13, -28, 11, + -39, 29, -67, 193, 141, 9, -24, 110, 22, 8, + 130, -85, -8, -66, 87, 3, -35, -7, -47, -27, + 45, 41, 27, -15, -21, -16, 48, -50, -21, -4, + 38, -43, 1, -2, -33, -4, 28, 9, -2, 11, + -15, 3, -16, 11, 6, -2, -11, -5, 22, 10, + -1, 7, 2, -14, -8, 8, -2, 5, 2, -1, + -5, -6, -1, 2, -1, -3, 0, 0, -1, 2, + -2, -4, 0, -7, 3, 4, 2, 3, 1, 0, + 0, -2, -1, -2, 0, 3 + }, + { + -28, 192, 50, -8, -13, 4, -6, 7, 16, -20, + -10, -31, 5, 43, -299, 121, 62, 34, 242, 49, + -37, 15, -35, -39, -67, 22, 96, 31, -17, 14, + -31, 21, 8, -14, 37, 23, -14, -5, 19, 2, + -1, 7, -29, -2, 2, -7, 11, -15, 14, -11, + 14, -5, -4, 5, 2, 0, 5, 9, -12, 16, + -5, 11, 9, -1, -3, 2, 0, -3, 1, -6, + 1, 9, -1, 0, -3, 3, 2, 0, -2, -1, + -3, 0, -5, 3, -2, 2, 3, 0, 1, -2, + 4, 2, -1, -3, 0, -2 + }, + { + -735, 759, 188, -32, -25, -18, -33, 13, 17, -6, + 28, -5, 55, -30, 55, -4, 39, 328, 11, 2, + 84, 62, -46, -13, 43, -48, 27, -44, 28, -16, + 36, 15, -3, -24, -6, -33, 65, 38, 24, -18, + 23, 4, -25, 7, -1, 7, -8, -6, 2, 0, + 3, 3, -30, 17, -38, -32, -10, 13, -6, 3, + 2, 8, -10, 3, -11, 5, 7, -6, 4, -8, + 1, -3, 7, 3, -1, -3, -2, 1, 3, 3, + -2, -2, -2, -1, 2, -2, -1, 6, -4, 2, + -1, 3, 0, 0, 1, 1 + }, + { + 20, 250, -47, -27, -1, 11, -13, 3, 0, 3, + -24, 12, -3, -25, 192, 74, -140, 35, 148, -767, + -30, -51, -45, 44, 30, 32, -29, -75, 47, -6, + 92, -5, -2, -6, 39, -41, -9, -44, -3, -13, + -2, 9, -13, 16, -35, 1, -13, 0, -3, -25, + 31, -16, 0, 5, 6, -11, -16, 2, -11, -5, + 5, -5, 12, 4, -8, 4, 5, 8, 5, 5, + 8, -2, -2, 0, 3, 1, -1, 0, 3, -1, + 0, -2, -1, -2, 6, 0, 0, -1, 0, -3, + 3, 2, 0, -2, -1, -2 + }, + { + -848, -2815, 60, 214, -11, -1, 24, -13, -42, -21, + 36, 4, 44, 64, -9, 6, -20, 6, -28, 18, + 14, 12, 2, -12, -17, 19, 0, 22, 12, -5, + 13, -6, 7, 8, -1, -49, -1, -51, 36, 21, + -8, -26, -23, 29, 9, -7, 5, -14, 33, -10, + 13, -8, -2, -7, 11, -4, 4, 3, 4, 6, + -8, -14, 4, 11, 6, -9, -10, 1, 2, 8, + -10, 14, 2, -12, -1, 4, 4, -5, 5, 5, + -4, -2, -1, -1, 1, 4, 0, -1, 1, 1, + -1, -4, 3, 2, 2, -3 + }, + { + 20, -87, -56, 4, -4, 11, 1, 23, -8, -9, + -1, 1, 0, -108, -406, -115, -60, 145, -56, -16, + -107, 75, 61, 9, -82, -106, -4, -82, -126, 56, + -70, 32, 18, 9, 7, -2, -27, 42, 2, -19, + 6, -11, -22, 12, 12, 14, -31, -9, 19, 7, + -9, -10, 7, -3, -12, -1, -8, 8, -12, -1, + 11, -9, 7, -6, 2, 7, 11, 0, -2, -2, + 1, -3, -1, 10, -4, 1, 9, -1, -4, 1, + -2, 0, 0, 4, 1, 1, 0, -3, 0, 0, + -4, 1, -1, 1, -2, -2 + }, + { + -94, 3447, -105, 89, 33, -44, -19, -32, 44, 2, + -68, 32, -1, 28, 31, 46, 59, 28, 1, -5, + 20, -15, 31, 9, -23, -6, -35, 30, -65, 20, + 33, 6, -54, 27, -10, 21, 31, 53, -49, -59, + -86, -10, -30, 30, 19, 4, -12, 12, 22, 14, + -13, -23, 7, -3, -28, -2, 16, 5, 0, 14, + -1, 3, 5, -17, 0, 8, -3, -14, 4, 7, + 0, -2, 4, -1, 2, -3, 6, -5, 2, 2, + 4, 0, 0, 1, -3, 3, 4, 0, -5, -2, + -2, 0, 0, 3, -1, 0 + }, + { + -32, 91, -34, 97, 24, -39, 103, 52, -8, -7, + -11, -16, 17, 116, -55, 164, -7, 159, -27, 28, + -48, 84, 45, -16, -40, -9, 6, 44, 4, -10, + -24, 74, -18, -39, -4, 62, -31, -24, -8, 0, + 14, -15, -14, 21, 41, -2, -22, 3, 18, 6, + -38, 6, 3, -20, 0, 18, -4, -1, -10, -6, + -2, -7, 15, 3, 1, 12, -1, -4, 2, -6, + 3, -3, -1, 8, 1, -4, 7, -2, 4, 2, + 6, -1, 0, -2, 2, -4, 0, 2, 0, 1, + -1, 0, -4, 0, 1, -1 + }, + { + 341, 499, 19, 162, 35, -21, -463, -1, -1, 104, + 34, 12, 8, -14, 26, 103, -73, -92, 66, -8, + -41, 51, -26, -53, -48, -44, 8, 25, -2, 24, + -15, 6, 31, -38, 22, -40, 52, -1, 5, -27, + -11, -25, 1, 3, 5, 40, 9, -18, 2, 12, + 13, 0, -8, -10, 8, -14, 4, -5, -2, 15, + -6, -5, -6, 3, 3, -2, 7, 5, -2, -8, + 5, -2, -2, -1, -6, 0, -7, 0, 4, -8, + 2, 2, -3, 3, 0, 3, -3, 2, -2, 1, + 0, 0, -1, 1, 2, -1 + }, + { + 19, 271, -69, -128, 50, -24, 4, 7, -4, -27, + -20, -2, 106, 182, -5, -16, 154, -96, 67, 30, + 78, 94, -33, -29, -135, 12, 67, -28, 36, -17, + -42, 39, -5, 14, 23, -20, -5, 6, -7, -1, + 5, 17, 29, 18, -22, 25, 5, 15, 6, 13, + -3, 8, 9, 8, -4, -15, -22, -4, 15, 16, + 3, 8, -10, -1, 9, -4, -9, 9, -3, 1, + -5, 4, 1, -3, 1, 0, -3, -4, 1, 0, + 2, -3, 1, 4, 2, 2, 2, 2, 0, 1, + 0, 1, 0, -3, 2, -1 + }, + { + -67, 654, -21, -170, -29, 10, -65, 24, 58, 9, + 6, -53, -130, -77, -64, -45, 6, 76, -30, -2, + -18, 17, -7, 11, 10, -7, 99, -59, 48, 58, + 20, -69, 31, 38, 27, -23, 33, 25, 1, -14, + -48, 5, 5, 38, 29, 19, 19, -24, 4, 27, + 6, -22, 0, 15, -1, 6, -18, -16, -6, 7, + -2, 6, 0, 2, -2, 0, 0, 6, 0, 2, + -4, 9, 6, -9, -3, -2, 1, 9, -2, 1, + -6, -3, 3, 3, -5, -4, -1, 4, -3, 0, + 2, 4, 0, -2, -1, -2 + }, + { + -9, 48, 20, 53, -26, 15, 4, -6, -29, 4, + -8, 66, 20, 24, -841, 32, 117, -131, 151, 90, + -19, 12, 31, 45, -73, -26, -33, 15, 21, -73, + 82, -69, 16, 34, -31, -6, 17, -21, 21, -21, + 15, 47, -15, -16, 6, 4, 12, -1, -8, 1, + 3, -11, -11, 6, 4, 5, -4, -1, 15, 14, + 1, -19, 4, 0, -2, -2, 5, 1, 0, -1, + -8, 1, 5, 0, 0, -4, -1, 6, 2, 5, + 0, -6, -2, 4, -3, 2, 0, 4, -1, 6, + -1, -2, -2, 3, -1, -4 + }, + { + 70, 502, -104, 84, 48, 24, -83, 35, 51, 105, + -19, -10, -49, -95, 331, -51, -113, 47, -25, 34, + -40, -6, 39, -14, -60, 46, -79, -11, -8, 1, + 23, 20, -44, 39, -1, -16, 1, 14, -27, -13, + 1, 23, -12, 13, 18, 16, 4, 24, -22, -7, + 17, -10, -9, -19, 8, -16, 9, 17, -5, 1, + 5, 1, 0, 3, 1, 4, 2, 4, -1, 1, + -2, 3, 10, 2, -13, 6, -4, 4, 3, 3, + 3, 4, 0, 2, 3, -1, -1, -2, -3, 2, + -2, 1, 3, 1, 0, -1 + } + }, + { + { + -29, -1018, -7, 1, -30, -30, 2, -27, 0, 1, + 53, 18, 73, 2, 108, -10, 28, 0, 74, -28, + 115, -23, 3, 83, 52, 104, 26, -10, -18, -35, + -99, -56, -34, 16, 29, 43, -59, 37, -82, 6, + 20, -12, 14, 28, 32, -1, 8, -11, -14, 16, + 11, -6, -7, -1, -11, -9, -4, 3, 0, 7, + 6, 9, -6, -10, -7, 0, -2, 0, 9, -10, + -5, 4, 5, 6, 13, 0, 1, 1, 0, 0, + 1, 3, 2, 1, -5, -1, 1, -3, 0, -2, + 3, -1, -2, 0, -2, 1 + }, + { + 448, -2877, -31, -189, -15, 19, -25, -11, -40, 50, + 7, 34, -16, -13, -47, -7, 18, -49, -59, -5, + 5, -29, -14, 39, 35, 16, -11, 41, 49, 10, + 44, -4, -53, -31, 34, 7, 42, -17, 12, -19, + 16, -13, 7, -1, 20, -11, -3, -12, 1, 2, + -7, 23, 0, 2, -5, -9, -13, -12, 12, 8, + 4, -10, -7, 3, -2, 5, 1, -9, 1, 5, + -6, -3, 0, -3, -7, -1, -3, 0, -4, 7, + 4, -7, -1, 2, -3, -8, 3, 0, 0, 1, + 0, 2, 1, -1, -1, 0 + }, + { + 133, -2061, -596, 89, -56, 34, 21, -13, -25, -44, + -29, -37, 24, 91, 148, -47, 155, -7, 65, 10, + 83, -1, 17, -50, -8, 25, 10, -7, -33, -47, + 35, 45, 2, 4, -42, -28, 42, -32, -17, 22, + -28, 56, -24, 7, 8, -34, 6, 10, 31, -9, + -14, -8, 0, 0, -9, 4, 10, 1, 17, 10, + 6, 15, -12, 0, 2, 4, -7, 9, 7, -6, + -1, 1, 0, 2, 0, -2, -1, -1, -4, 0, + -3, -3, 2, -5, -2, 5, 0, 0, 1, -2, + -1, 0, 0, -2, 1, 1 + }, + { + 20, 192, -46, 35, -8, -5, 4, 10, 3, -14, + -16, -32, -20, -55, -64, -82, 81, 113, 115, 63, + -3, -17, -37, -19, -35, 45, 47, -23, 24, -3, + -48, 44, 2, -5, -8, 36, 1, 22, 11, 12, + 3, 0, -12, -22, -1, 10, -4, -4, 21, -1, + -9, -3, 6, 7, 1, 9, -3, 8, 4, -1, + -12, 5, 9, 4, 2, -4, -1, 6, -1, -5, + -7, 5, -1, -2, -1, 0, 8, 2, -1, -2, + -4, 0, -3, 0, 0, -2, 3, 2, 2, 0, + 1, 2, 1, -2, 0, 1 + }, + { + 479, -760, -131, -5, 26, -22, -43, -6, 14, -18, + 69, 83, -7, 1, 32, -29, -6, 260, 61, 35, + 61, -3, 11, -11, 7, 2, -14, 0, -26, 2, + 23, 8, 5, 9, -6, -13, -42, 37, 16, -19, + 5, 7, 5, -32, 2, 16, -7, 4, 12, -8, + 12, 5, -14, -11, -23, -17, -29, -4, 10, -2, + 5, 6, -6, -3, -4, 8, -1, -9, 9, 0, + -2, -4, -3, 6, -1, -8, 4, -1, 3, 4, + 1, -2, 1, -4, 2, -3, 2, 3, -4, 1, + -1, 1, 2, -2, 1, 1 + }, + { + 3, 147, 90, -32, 8, -5, 5, -12, 15, -1, + -11, -8, 8, 65, -38, -12, -10, 2, 33, -519, + -60, -89, -20, -71, 62, -8, -13, -57, -2, 107, + 74, -34, 6, 27, 18, -45, -18, -9, -26, -14, + 8, 9, 18, -2, -10, -3, -18, -7, -4, -18, + 8, 4, -7, 10, -6, -14, -5, -2, 0, -13, + 0, 3, -1, 2, 4, 2, 5, 0, 5, -2, + 10, 3, -4, -2, 1, 7, 4, 7, -3, -3, + 3, 0, -4, -2, 4, 1, 2, -3, 1, 3, + -2, -1, 4, -2, -1, 1 + }, + { + 224, -3772, -228, 120, 3, 32, 10, -18, -15, -31, + 39, 10, 31, 12, 23, 11, 29, -22, -14, -9, + -5, -15, -6, -18, 17, 0, -3, 18, -5, 29, + 30, 6, 23, -22, 3, -29, -13, -52, 58, -1, + -7, 5, -42, 16, 3, 4, -6, -6, 5, -10, + 1, -6, 5, -9, 8, 5, 9, 11, 2, 5, + -6, -7, 0, 6, 2, 3, 5, -5, -4, 3, + -2, -1, 8, -3, -5, -1, 7, -1, 2, 4, + -5, -2, 4, 0, -2, 5, 4, -2, -3, -2, + 2, -2, -2, 1, 2, -1 + }, + { + -9, 22, -32, 28, -12, 5, 6, -8, 15, -1, + -20, -33, 29, -66, -524, -132, -105, 20, -23, 21, + -114, 18, 28, 7, -6, -204, -17, -23, -84, -29, + -3, 27, 2, 5, 0, 7, -3, 15, -10, 22, + -8, -16, -17, 1, -1, 6, -4, -22, -14, 11, + 7, -9, 1, 6, 1, -4, 9, 5, -17, 9, + 3, 3, -3, 0, 0, -3, 5, 5, -5, 2, + 0, -2, -3, 3, 4, 2, 8, 3, -1, 3, + -5, -2, 0, 1, 3, 0, 2, -2, -1, 3, + -3, 0, 1, 0, -2, -2 + }, + { + 253, 2574, 150, 48, 5, 17, -22, -36, 22, 34, + -13, -22, -74, 41, 63, 41, 59, 5, 4, 16, + 22, -4, 17, 24, -28, -21, 21, -5, -46, -9, + 27, 3, -26, 21, 14, 20, 7, -8, 1, -56, + -64, -30, -11, 32, 5, 9, 15, 1, 20, -10, + 2, -1, -8, -7, -22, -13, 12, 3, 7, 5, + 8, -7, 1, -7, -10, 0, 2, -13, -1, 10, + 2, -6, -2, 2, 6, -6, 3, 1, -3, 2, + 2, -1, -2, 1, -5, 0, 5, 3, 0, -5, + -4, 2, -1, 4, 0, 0 + }, + { + 20, 47, 104, 48, -64, 86, 5, 22, -22, -24, + -29, 2, 9, 44, 40, 110, 36, 29, 169, 14, + -65, 2, 52, 41, 14, -21, 28, 26, -18, 19, + -58, 22, 36, -39, 33, 27, 6, -3, 2, -10, + 18, 15, -1, -1, 35, -6, -13, 7, -6, 14, + -13, -9, 21, -13, -18, 6, 13, -3, -3, 2, + -11, 4, 4, 1, -1, -5, 8, 2, 11, -2, + -4, -3, -7, 7, 1, -1, 2, -1, -1, 0, + 2, 0, 1, 0, 3, 0, -3, 1, -1, 1, + 0, 1, -3, 0, 2, 1 + }, + { + -248, 1055, 342, 72, 5, -130, -155, -90, 18, 69, + 6, 24, 1, 42, 24, -13, -81, -32, 31, 30, + -22, 31, -18, -29, -49, -17, -12, -10, 18, 31, + -3, -6, 2, -11, -7, -28, 30, 10, -8, -9, + -11, -3, -13, -23, 3, 25, 11, 2, -13, 10, + 22, -4, -10, -5, -12, -9, -3, 5, -6, 4, + 0, -6, -6, 2, 3, -5, 5, -2, 1, -6, + 3, 1, -1, 0, 0, 4, -3, -4, -1, 0, + 0, 2, -3, 3, -1, 3, 3, 1, -1, 0, + 1, -1, -2, 1, 2, 1 + }, + { + -21, 127, 78, -46, 21, -36, 3, -2, -2, -25, + -27, 4, 95, 180, -73, 115, -4, 6, 46, 25, + 112, 76, 2, 17, -67, -69, -17, -18, 40, 36, + -53, 36, -11, 14, -15, 4, -20, 10, 10, 16, + 11, 7, 22, 21, 0, 14, 3, 16, 6, 28, + 12, -8, 5, 11, -5, -14, -25, -13, -2, 10, + 7, 6, -7, -9, 4, 2, -12, 0, -3, 0, + 7, 1, -1, 4, 2, 4, -3, -3, 0, -2, + 1, -1, -2, 3, 1, 1, 2, 1, 0, 1, + 1, 2, -1, -1, 1, 0 + }, + { + 57, 118, -10, 50, -34, 59, 11, 55, 11, 4, + 35, -2, -18, -282, -129, 25, -7, 6, -19, 79, + -18, -7, -11, -7, 47, 61, 76, -26, 60, 54, + 0, -33, 7, 31, 20, 34, -22, 24, 13, -17, + -27, -11, 13, 11, -11, 7, 1, -13, -6, 6, + 12, 4, -5, 21, 6, 5, -4, -16, -16, 12, + 2, 2, -4, 7, -5, -10, 1, 3, 4, -1, + -3, 5, 7, 1, 1, 0, -5, 10, 4, 3, + -4, -8, -1, 4, 1, -4, -3, -4, -3, -2, + 2, 1, 3, 0, 1, 0 + }, + { + -1, 68, -93, 22, 22, -15, -4, 15, 5, -40, + -15, 52, 49, -397, 144, -234, 117, -33, 19, 136, + 74, 15, 85, 31, -100, 70, -72, 10, 5, 42, + -47, -15, -14, 27, -68, -24, 10, -13, 31, -22, + 5, 32, 7, -5, -5, 12, 5, -7, -3, -7, + 10, 0, -8, -9, 12, -10, 0, 4, 10, 8, + -2, 1, -7, 1, 7, -2, 7, 5, -1, -1, + -4, 0, 8, -7, -2, 3, -2, 5, 2, 1, + 4, -4, -7, 2, -3, -2, 0, 3, -3, 2, + 3, 2, -2, 3, 0, -3 + }, + { + 90, 456, 35, -123, 51, 88, -17, 46, 53, 25, + 75, -43, -10, 143, -33, -39, 33, 69, -61, 24, + -46, 20, 16, 26, -39, -31, -35, 26, -23, 24, + 3, 25, -21, 7, 26, -24, -30, 9, -26, 9, + 16, -4, -7, 3, 32, 11, 9, 6, 4, -19, + 6, 11, -3, -10, 0, -5, -4, 3, 4, 10, + -3, -5, -4, 8, 4, -1, 4, -6, 0, 1, + -1, -2, 6, 6, 2, -4, -6, 6, 1, 1, + 4, 7, 1, 1, 2, 2, 0, 0, 0, -2, + 3, 0, 2, 3, 1, -1 + } + }, + { + { + 11, -830, 194, 41, -15, -1, 20, -1, 39, -11, + 27, -56, 23, -14, 16, -97, -4, 22, 20, -39, + 93, -33, -1, 56, 35, 40, 26, 58, 43, 21, + 10, 19, 22, -22, -34, -34, -52, 60, -65, 13, + -3, -21, 1, 17, -5, 2, 9, -11, 4, 9, + -10, -11, -2, -11, 3, 4, 0, 7, -5, 2, + -6, 5, 6, 2, -1, 5, 3, 0, 3, -3, + -2, -2, 6, -2, 7, -7, 2, 0, 2, 4, + 1, 0, 1, 2, 2, 1, 0, -1, 1, -1, + -3, 1, -2, 3, 1, -2 + }, + { + -308, -2734, 757, -164, -58, -33, 2, 24, -81, 40, + 6, -5, 18, -7, -67, -11, -38, -5, 63, -21, + 4, -11, -20, 17, 5, 21, -8, 15, 17, -23, + 1, -1, -9, 8, 0, -31, 14, 3, 14, -36, + 11, 12, 24, -16, -6, 10, -24, 2, -7, -11, + -24, -9, 1, 6, -4, 5, -5, 4, 6, 2, + 1, 1, -3, 9, 6, 4, -6, -9, -4, 6, + -4, 2, -1, 2, -1, -7, 2, 2, -2, 1, + 1, 1, -1, 1, 2, 2, -4, 4, -2, 1, + -1, 1, -1, 2, -2, 1 + }, + { + -106, -704, 497, 126, 128, 12, -4, 9, 8, 20, + -15, -40, -7, -8, 142, -10, 62, -94, 85, -35, + 66, 31, 46, -29, -42, -2, 19, 47, 13, -9, + 18, 28, 7, 30, -34, -24, 41, -23, 20, 50, + -52, 57, -13, 18, 11, -24, -9, -6, 10, 2, + -3, -19, 0, -6, -8, 4, -5, -1, 9, 4, + -6, 4, -5, 7, -7, -4, -12, 4, 5, -3, + 1, -1, 2, 0, 4, -1, -1, 0, 1, -2, + -3, -2, -1, 2, -3, -1, 1, -2, -1, 1, + -3, 1, 0, 1, -1, -2 + }, + { + -10, 245, -2, 17, 14, -3, -2, -3, 1, 9, + 16, -1, -24, -36, 177, -61, -138, 13, 50, 1, + 26, -6, -32, 26, -26, -22, -68, -46, 5, -7, + -73, 35, 22, 25, -18, 18, 46, 14, -12, 23, + -4, -5, 1, -9, 0, 1, -5, -11, 10, 7, + 0, -13, 4, 3, -8, 14, -8, -10, 10, 5, + -11, -4, 5, -5, -1, 2, 0, 5, -2, 2, + -3, -4, -2, -2, 4, -4, 1, 1, 4, 0, + -1, -1, 2, -1, 2, -1, -2, 0, 2, 0, + -2, -2, 1, 1, 0, 1 + }, + { + -125, -1318, 55, -81, -16, 9, -19, -28, 23, 1, + 0, 58, -15, 33, 23, -46, 33, 194, -23, 0, + 4, -13, 29, 28, -29, 37, -8, 19, -46, -5, + -9, -18, -26, 14, 4, 0, -61, -44, -11, 8, + 0, -6, 6, -15, -9, -9, -5, 4, 4, -11, + -9, -7, 17, -3, -4, 3, 3, -5, -5, -11, + 3, 4, -4, 6, 4, 1, -2, -8, 5, 0, + 1, 0, -9, -4, 0, 0, 1, 5, 0, -3, + 0, 2, 0, 3, 0, -5, 1, 0, -1, -1, + 0, 1, 1, -1, -2, -1 + }, + { + -17, -142, 28, 5, 5, -11, -4, -12, 8, -2, + 15, 7, 29, 8, -95, 29, 52, -9, 110, -327, + 11, -45, 65, 4, 11, -41, 20, -49, -53, 77, + 86, -6, -13, 1, 27, -15, -2, 12, -14, 1, + -14, 32, 26, 5, 8, -6, -8, -3, -2, -19, + -9, -2, -10, -8, -16, -3, 8, 2, 10, -2, + 1, -2, -4, 3, -2, -1, 1, -8, 3, -4, + 1, 5, 3, 0, -4, 0, -1, 9, -3, 2, + 0, 5, 2, -1, -3, 0, 2, -3, 1, 4, + -1, -4, 0, 2, 2, 3 + }, + { + 177, -3007, 378, 96, -29, 26, 2, 21, 29, -34, + 8, 0, 0, -20, 0, 24, 21, -17, 51, -19, + -19, -21, 0, -5, 16, -1, -11, 28, -13, 9, + 17, -8, 21, -21, -1, -1, 7, -54, 24, -16, + 12, 36, -16, 1, 9, 11, 4, -3, -5, -8, + -10, -8, -9, 0, 3, -1, 2, 2, -4, 1, + 0, 3, -1, -1, -8, -1, 2, 1, -5, 0, + 9, -5, -6, 3, 2, -5, 1, 1, -2, -2, + 3, -1, 2, 4, 0, -3, 2, 0, -1, -2, + 0, 1, -2, 0, 0, 0 + }, + { + -21, 33, 60, -7, 6, 3, 0, -16, -1, 10, + 15, 3, 50, -2, -353, 1, -33, -35, 3, 74, + -65, -20, 70, 80, 46, -81, 41, 16, -31, -28, + 26, 4, -21, 4, -7, 0, 7, 11, -26, 34, + -8, -4, 9, 3, -19, 3, -1, 15, -25, -15, + 7, -5, -11, -8, 11, 4, -3, 1, -2, 1, + -7, -6, 1, 4, 3, -11, -7, 4, 6, 2, + -1, 1, -4, -3, 3, 0, 1, 3, 1, 0, + 3, 2, -1, -4, -3, 0, -1, 2, -1, 1, + 1, -1, 1, 2, 0, 1 + }, + { + -199, 1788, -80, -38, -16, 11, 16, 27, -32, 14, + 75, -7, -40, -58, 40, -46, 3, -13, -4, -7, + -11, -3, -31, 14, 17, -20, 28, 6, -19, -7, + -10, 19, 2, 28, 8, -5, -19, -24, 11, -22, + -14, 26, -1, 1, 0, -11, 8, 11, 5, -38, + -6, 7, -7, 8, 18, 0, -5, -10, 10, -6, + 1, -1, 0, 3, 0, -8, 1, 2, 1, 2, + 3, 0, 0, 4, 3, -1, -5, 3, -3, 3, + -4, 2, 0, 0, -2, -2, -1, 3, 2, -1, + 1, 2, -1, -2, 2, 0 + }, + { + -17, 166, 43, 9, -28, -11, 31, 37, -33, -11, + -17, 25, -46, -73, -34, 126, 36, -116, 35, 38, + -46, -4, -16, 15, 40, 15, 19, 29, -24, -18, + 2, -27, 13, -28, -3, -5, 5, 3, 22, -8, + 17, 16, 7, -5, -11, 10, 1, 15, -18, -4, + 8, 1, 13, -3, -1, -12, 6, -6, -2, 5, + -4, 4, 3, -6, -2, -13, -1, -2, 9, 8, + -4, 1, -2, -3, -1, 3, -1, -3, 0, -1, + 0, -2, 1, 0, -1, 3, 0, 0, -1, -2, + 2, 0, -1, -1, 1, 3 + }, + { + 140, 1358, 140, 122, -50, 92, 328, -52, -17, -27, + -13, -2, -4, -12, 17, 27, -45, -46, -24, -21, + 5, -10, 9, -13, -18, 4, -12, -24, -21, 16, + 0, -2, -2, -18, -10, 6, -16, 0, 1, -7, + -7, 17, -17, -14, -2, -4, 1, 10, -1, -4, + 15, -1, -5, 12, 2, -3, -18, -2, 4, 6, + 0, 1, 1, -2, -3, 0, 0, -3, -2, -2, + 3, -2, -3, 1, 3, 1, 4, 3, -4, 6, + -4, 0, 1, -4, 0, -2, 5, 0, 1, -1, + -2, 0, 1, 0, -3, 2 + }, + { + 21, -20, -68, 5, 12, 8, -3, -22, 3, 5, + 8, 22, -164, -80, 21, 28, -86, -17, 4, -25, + 48, -106, -13, 13, 14, -28, -45, -15, -3, 33, + 24, -10, -4, 8, -14, -1, -34, -22, 40, 0, + 4, 5, -12, 4, -1, -7, -3, 9, 5, 2, + 5, -7, -13, 6, -3, 10, 2, -1, -11, 1, + -10, 2, 4, -1, -8, -6, 7, -2, 0, -3, + 6, 2, -6, 2, -2, -1, 3, 4, 1, 1, + -4, 3, 1, -1, -1, 0, 1, -2, -2, 0, + 0, 1, 1, 1, -1, 0 + }, + { + 9, 66, -114, 141, -83, 56, 134, 38, 30, -37, + 2, 8, 57, -126, -113, 51, -47, 0, 4, 1, + 28, 0, 14, 21, 45, 5, 36, -28, 45, 39, + -21, -24, -1, 17, -16, 18, -6, 16, -16, 26, + 7, 9, 5, 3, -27, -10, -13, 11, -23, -10, + 11, 14, 3, 2, 4, 9, 4, 6, -3, 2, + 5, -4, 2, 4, -2, -4, 0, 0, -6, 0, + 4, -1, 1, 5, 3, -1, -3, -1, 4, 1, + 6, -5, -4, -2, 2, 6, 0, -5, 1, -2, + 0, -1, -1, 3, 0, 0 + }, + { + 8, 192, -32, -55, -13, -13, -9, -7, 34, -1, + -9, 46, -28, -112, 1082, -45, -27, -81, -52, 77, + 47, 26, 56, 6, -64, 35, 5, 30, 18, 94, + -33, 27, -28, -6, 0, -3, 1, -15, -1, -12, + -13, 10, 5, -11, -7, 6, -22, -5, -3, -2, + -8, 10, 4, -8, 9, -12, -6, 0, 0, -3, + -3, 17, -6, -3, 5, 9, -3, -5, 2, 1, + 5, 2, 0, -3, -1, 2, 3, -6, -2, -7, + 0, 5, -5, 1, 2, -2, -3, -2, 1, -3, + -1, 3, 2, 0, 0, 2 + }, + { + -127, 262, 127, -74, -14, -20, 33, 2, -15, 8, + 7, 19, 53, 12, -259, 7, 96, 44, -21, 29, + -47, -12, -17, 11, 18, -26, -31, 52, 5, 43, + -14, 3, 5, -14, 12, -7, -20, -15, -15, 17, + 17, 7, 9, 4, 11, 10, -2, -7, 13, -10, + -1, -3, 3, 13, 9, 12, -1, -6, 7, 7, + -1, 0, -11, -3, 2, 0, 1, -8, 2, -3, + 5, -3, -8, -1, 8, 2, -4, 3, -1, -1, + -1, -1, -1, 0, 0, 1, 0, -4, 6, -4, + 3, 1, -1, 1, 0, 1 + } + }, + { + { + -11, -364, -146, 59, 25, -3, 9, 19, 6, 14, + 1, -6, -26, -28, -22, -1, 11, -32, -29, -27, + 60, -27, 4, 33, 35, 51, 31, 40, 28, 30, + 11, 56, -8, -47, -4, -81, -11, 12, 2, 23, + -4, -5, -2, 10, -7, 11, 2, 0, 8, -14, + -3, -19, -5, -9, -5, 9, 8, 10, 1, -1, + -4, -6, 8, 8, 0, 0, -1, -1, -3, -1, + 0, 0, 5, 0, -2, -5, 3, 1, -1, 2, + -1, 0, -2, 0, 2, 2, 0, -1, 0, 3, + -4, -1, 1, 2, 1, 0 + }, + { + 288, -1342, -952, -69, -9, -28, 1, 31, -4, -8, + -11, -14, 23, 52, -64, -10, -6, 13, 47, -34, + 2, -7, -8, 5, 6, -3, -4, 30, -16, 11, + -19, 14, -20, 31, -35, 4, -36, 26, 18, -26, + 3, 21, 10, -4, -14, 11, -1, -9, 11, -18, + -5, -27, -14, -4, -1, 2, 0, 5, -4, -4, + -4, 3, 2, 3, 8, 4, -1, -9, -5, -4, + -1, 4, -1, 0, 3, -2, -1, 3, 1, -4, + 0, 2, -1, -1, 1, 5, -1, 0, -1, -1, + 0, -1, 0, 1, 0, 1 + }, + { + 143, 377, -331, -12, 22, 6, -13, 2, 22, 36, + -5, -21, -13, 3, 154, 12, -68, 43, 33, -28, + 30, 33, -4, 17, -5, -16, 2, 17, 32, 12, + 11, 19, 13, 15, 2, -1, 24, -20, 14, 24, + -13, 19, 7, -11, 5, -4, -11, -11, -21, 4, + 14, -10, -1, -9, 1, -3, -14, -3, 2, 1, + 0, -7, -1, -4, -9, -8, -7, -1, 6, -1, + -4, -1, 3, -2, 1, 1, 1, 1, 3, -3, + 1, -1, -4, 1, 3, -2, 1, 1, -1, 2, + -1, -1, -2, 1, -1, -2 + }, + { + 11, 285, -2, -19, 8, 5, -7, -6, -4, 15, + 20, 14, -11, 42, 206, -71, -137, 12, 11, 22, + 42, 7, 7, -13, -16, 12, -91, -76, -11, 10, + -87, 19, 45, 15, -1, 36, 28, 3, -11, 5, + -6, -7, 4, -2, 7, -16, -8, 8, -11, 0, + 7, -5, -4, 8, -11, -1, 4, -9, 5, 7, + 0, -4, 4, -8, -4, 7, 0, 0, -1, 3, + 3, -3, 2, -1, 4, -1, -4, -2, 3, 0, + 2, -1, 1, 0, 0, 2, -1, -1, -1, -1, + -1, -2, -2, 1, -1, -1 + }, + { + -127, -1122, -1, -85, 18, -5, 3, -21, 9, 26, + -29, -14, 20, 55, -27, 24, 15, 179, 24, -4, + -16, -9, 29, 13, 16, 5, 11, 6, -3, -24, + -35, -21, -23, 11, 12, -16, -15, -29, -11, 22, + 1, -9, -4, -4, -7, -24, -7, 4, -4, 0, + -14, -10, 4, -2, 5, -3, 12, 3, -11, 2, + 1, -2, -5, 4, 3, -5, -1, 2, 0, 0, + -2, 3, 0, -6, -2, 5, -5, 5, 0, -4, + -2, 2, -3, 4, 0, -2, 0, -2, 2, 1, + 1, 0, 1, 0, -1, -1 + }, + { + -10, -237, 16, 24, 1, -2, -14, -6, -4, 4, + 10, 22, 36, 67, -36, 7, -15, 2, 22, -202, + -39, 46, 25, 64, 23, -53, 43, -57, -70, 71, + 52, 23, -2, -3, 2, 7, 7, -6, -7, 2, + -3, 19, 10, 5, 0, -6, 3, 0, -14, -6, + -11, -7, -5, -8, -13, -2, 8, 1, 8, 3, + 1, 1, -4, 2, -5, 0, 1, -5, 4, 6, + -2, 0, 4, 0, -5, -5, -2, 0, 0, 4, + -3, 4, 3, 1, -3, -1, 0, 0, -1, 1, + 2, -1, -3, 1, 2, 2 + }, + { + -266, -1493, -276, 57, 9, -6, 3, 17, 12, 1, + -21, 18, 2, -30, 0, 29, -2, -19, 38, 6, + 12, -9, -4, 6, -14, 5, 1, 5, 17, -8, + 17, -20, -9, 12, -20, -4, 10, -34, -6, 13, + -1, 14, 21, -5, 9, -1, 22, 8, -10, 2, + -8, -10, -9, 6, 0, -4, -8, 1, -5, -3, + 3, 2, -3, -3, -7, -6, -7, 4, -1, -1, + 10, 1, -9, 1, 3, -2, -1, 1, -3, -3, + 3, 2, -1, 0, 3, -3, -2, 0, 0, 1, + -1, 2, 1, 0, -1, 0 + }, + { + 3, -71, 32, -4, 3, 4, 1, -3, -18, 3, + 29, 29, 29, 34, -125, -65, -35, 63, 18, -3, + 49, 4, 55, 32, -6, 74, 35, -47, 22, 16, + 18, -20, -13, -12, 14, 2, 2, -2, -25, 25, + -12, 17, 6, 8, -18, 5, -4, 14, -6, -12, + -9, -5, -7, -7, -2, 6, -5, -9, 8, 5, + -10, -8, -1, 3, 3, -3, -6, -1, 7, 1, + 1, -2, -1, -4, -1, 1, -2, -1, 2, -1, + 4, 3, 1, -3, -4, -1, -2, 0, 0, -1, + 1, -1, 0, 2, 1, 1 + }, + { + 90, 1331, 40, -120, -12, -1, 25, 32, -18, -17, + 50, 27, 8, -94, 60, -41, -22, 4, -2, -23, + -36, 1, -27, -5, 16, 18, -10, 0, 23, -15, + -5, -6, 4, 18, 1, -14, 27, -30, -8, -9, + 11, 1, -1, -10, 4, 0, -13, 4, 10, -30, + -13, 7, 2, 6, 18, 6, -9, -5, 7, 6, + 0, 0, 1, 2, 6, -1, -5, 2, 1, -1, + 5, 6, 0, 3, -1, 3, -4, -1, -2, 1, + -2, 3, 3, 0, 2, 0, -2, 0, 0, 0, + 2, 1, 1, -2, 0, 2 + }, + { + 22, 282, -99, -28, -5, -56, 37, 43, -13, -1, + -33, 37, -7, -41, -41, -4, 84, -81, -100, 40, + 32, 0, -30, -17, 23, 30, -3, 5, 8, -6, + 1, 2, -17, -25, 0, -21, -23, -9, 13, -10, + 6, 3, 9, 12, -12, 3, 5, 3, -1, -9, + 2, -2, -5, -1, 10, -2, -2, 0, -6, -3, + 3, 4, 3, -2, 0, -4, -2, -7, -5, 9, + 0, 1, 3, -2, 0, 1, 0, 1, 2, 3, + 2, -1, -2, 0, -3, 0, 3, 0, 1, -2, + 1, 0, -1, 0, -2, 1 + }, + { + -21, 1558, -23, 148, 23, 75, 247, 17, -14, -22, + -6, -6, -1, -27, -39, 24, 12, -68, -6, -29, + 5, -24, -6, -9, -17, -12, -6, -7, -25, -3, + -10, 9, -1, -6, -5, 5, -4, -18, -4, -5, + -7, 7, -5, -7, 12, -2, -4, 2, 6, 6, + 2, -1, -2, 12, 6, 3, -9, -6, 1, 6, + 0, 6, 0, 0, -2, -3, 1, -1, -3, 0, + 1, -2, -3, -3, -1, -2, 1, 6, -1, 3, + -3, -3, 3, -4, 0, -2, 0, 1, 1, -1, + -2, 0, 2, 0, -3, 0 + }, + { + -20, -101, 33, -4, -2, 10, 3, -9, -12, 15, + 9, 5, -99, -140, 91, -51, -48, -47, -9, 30, + -16, -92, -67, 18, -1, 28, -62, 1, -49, 44, + 35, -13, 11, 22, -21, -13, -15, -9, 6, -9, + -4, 13, -12, -14, -5, -11, 11, -10, 14, -9, + -8, 2, -5, 0, -1, 6, 11, 14, 0, -1, + -7, -4, 5, 4, -3, -5, 8, 0, 3, -1, + -3, -1, -4, -5, -1, -3, 1, 5, 2, 1, + -1, 1, 2, 1, -1, 1, 2, -1, -1, -1, + -1, 1, 0, 1, -2, 0 + }, + { + -1, 182, 14, -54, -9, -55, 98, 49, 55, -22, + -51, 5, -62, 31, -29, 22, -16, -29, 9, -38, + 16, 15, 20, 38, 8, -4, -11, -2, 16, 16, + -15, -20, 4, 11, -1, -12, 8, 10, -16, 12, + 12, 15, 16, 9, 7, -3, 0, 6, -10, -8, + 11, -1, 15, -13, -7, 4, 1, 14, 4, -7, + 5, 0, 5, -5, 0, 4, 1, 2, -6, -2, + 4, 1, -2, -2, 1, 1, 0, -3, 0, -3, + 4, 2, -3, -6, -1, 5, 5, 1, 0, 0, + 0, -1, -3, 0, -1, -2 + }, + { + 6, 180, 65, -62, -23, -5, -2, -19, 9, 33, + 22, 17, -16, 398, 156, 169, -125, -57, -8, -5, + 35, -4, 19, 11, -5, -68, -14, 52, 8, 83, + 10, 20, -27, -15, 48, 13, -10, 5, -26, 4, + -8, -5, 0, -10, -8, 1, -16, -5, -6, 0, + -3, -9, 6, 0, 1, -4, -4, -2, 3, -3, + -5, 5, 2, -4, 0, 7, -1, -9, 2, 0, + 6, 1, -4, 1, 1, -1, 2, -4, -5, -4, + -4, 4, 1, -1, 3, 0, -1, -2, 2, -2, + -3, 0, 3, 0, -1, 2 + }, + { + 81, -30, 12, 139, -55, -71, 13, -31, -3, 18, + -51, 55, 13, -69, -105, -18, 65, -8, 7, 12, + 3, -22, -26, -12, 17, 2, -8, -17, 32, 4, + 15, -29, 10, -1, 8, 17, -3, -29, 0, 3, + -7, 19, 22, 8, -11, 9, 1, 0, 5, -10, + -3, -2, -3, 7, 9, 9, 8, -3, 6, 6, + -2, 6, -5, -5, -2, 3, -1, -3, 4, -2, + 1, 4, -8, -7, 1, 4, 2, 0, -3, 3, + -1, -5, -1, 0, 0, 0, 0, -5, 1, 1, + 1, 2, 0, -1, -2, 2 + } + }, + { + { + -12, -9, 4, -13, 20, -10, 1, 17, -15, 5, + -18, 29, -53, -11, 21, -21, 74, -28, -37, -41, + 57, -6, 7, 8, -18, 16, -1, -17, 25, 48, + -58, 44, -35, -31, 39, -42, 12, -19, -19, 4, + 2, 9, -4, -2, 1, 12, -6, 8, 12, -12, + 9, -24, -8, 4, -13, 3, 11, 2, 7, 11, + 8, -5, -2, 5, 4, -1, -7, -1, 3, -2, + 0, 0, -3, 5, -2, -2, 2, 3, -1, -1, + -2, 3, 0, -1, -4, -1, 2, 1, -2, 1, + 2, -2, 1, -1, 0, 1 + }, + { + -328, -785, 58, -95, 64, 15, -37, 16, 54, -1, + -6, 25, -18, 51, -13, 19, 57, -4, -35, -16, + -4, -25, 15, 15, -8, -15, 0, 43, 1, 23, + -15, 21, -35, 6, -7, 12, -41, 7, 4, -9, + 15, 12, -1, 7, 2, -11, 18, -20, 17, -11, + 11, 4, -9, -9, 1, -2, 5, -6, -6, -2, + 2, -3, 0, -4, -2, 1, 10, -2, 1, -7, + -2, 1, 2, -2, -4, 6, -4, 1, 3, 3, + 1, -1, 2, -1, -1, -3, 5, -3, 1, -1, + -1, 0, 2, -1, 0, -1 + }, + { + -156, 656, 302, 88, -68, -23, 1, -19, 4, -3, + -3, -7, -3, -18, 92, 11, -41, 72, -28, -47, + 3, 22, -2, 34, 25, -3, -9, -21, 11, 18, + 8, -12, -4, 1, 9, -2, 6, -9, 5, -7, + 5, -10, 15, 1, -5, -13, 8, 4, -7, -12, + 3, 5, 7, -11, 4, 9, -3, -9, -3, -1, + 10, -3, -6, -3, 2, -3, -2, 0, 8, 3, + -3, 1, 3, -1, -3, 1, 0, 0, 0, 1, + 4, -1, 0, -5, 2, 1, -2, 1, 0, 1, + 2, -2, 0, -1, 0, 0 + }, + { + -13, 269, 34, -9, -15, 1, 2, 5, -2, -2, + 1, 16, 17, -9, 105, 98, 83, 52, 7, 25, + -30, 14, 49, -13, 30, 61, -11, -76, -74, 49, + 21, -6, 8, 15, 12, 27, -22, 22, 11, -19, + -10, -2, -1, 4, 17, -2, -4, 8, -3, -4, + -1, 10, -3, 1, -11, -12, 4, 7, -7, -3, + 7, 5, 0, -4, -3, 3, 1, 1, 0, -3, + -2, 3, 7, 0, -2, 5, 1, -2, -1, -2, + 0, 2, -2, -1, -4, 1, 2, 1, 0, -2, + 1, 2, -2, -1, 1, -1 + }, + { + 206, -495, 231, -3, 20, -18, -4, -16, 10, 42, + 13, -58, 6, 55, -26, 52, -30, 113, 36, 14, + -5, -16, 11, -31, 57, -26, 3, -14, 23, 7, + -6, -1, 6, -5, -3, -2, -1, 8, 1, -12, + -1, -5, 9, -4, -1, -9, -3, 9, -2, 1, + 8, 6, -20, -6, -2, -4, -6, 3, 0, 12, + -5, -3, 3, -4, -5, -1, -3, 5, 4, 1, + -3, -2, 4, 6, 3, 1, 0, -2, 0, 1, + -3, 0, 0, -3, -1, 1, 1, -1, 1, 2, + -1, 0, 0, -1, 1, 1 + }, + { + 24, -89, -21, 14, -3, 5, 3, 4, 1, -6, + -15, 5, -26, -67, 32, 108, -97, -27, 72, -107, + -46, 13, -40, -16, 7, 6, 49, -47, -5, 20, + -35, -9, 14, 9, -14, 12, 5, -26, -6, 0, + 16, -9, 5, 9, -12, -5, -4, 6, 1, 9, + 5, 0, -5, 8, 9, -4, -2, -1, 4, 0, + 0, 5, -1, -1, -1, -3, 0, -1, 1, 4, + 3, -1, -2, 0, 2, -1, 1, -5, -2, 0, + 0, -1, -1, 1, 2, -1, -1, 1, -1, -2, + 0, 2, 1, -2, -1, -1 + }, + { + 108, -348, 159, 15, 0, -18, 6, -19, -24, 19, + 5, 7, -1, 2, 18, -43, -14, -12, -24, 17, + 26, 20, -5, -9, -14, 0, 17, -13, 2, -22, + 16, -7, -18, 11, -24, -14, 15, -14, 7, 11, + -14, -12, 11, 5, 1, -7, 6, 15, 0, 3, + 8, -9, 6, -1, 2, 2, -9, 5, 1, -3, + 0, 0, -1, 2, 2, 3, -5, -3, 3, 1, + -2, 6, 3, -3, -2, 0, 3, -2, -1, 0, + -5, 2, 0, -6, -1, 3, -1, -1, 0, 3, + 1, -1, 1, 0, 0, 0 + }, + { + 22, -18, -64, -2, -13, 2, 1, -2, 2, -6, + -4, -2, 4, 19, 72, 161, -14, 101, -10, -45, + 6, 0, -19, 1, -4, 67, 65, -35, 25, 25, + -4, -12, 19, -16, 11, 17, 0, -9, -31, -5, + -17, 16, -10, 1, 0, 8, 6, -13, 5, 20, + -7, -7, 5, 12, -6, 3, -1, -14, 0, 15, + -5, -2, -5, 0, 0, 4, 6, -1, -2, -2, + -1, -4, 1, 2, -3, -2, 2, -1, -2, 0, + -2, 2, 1, 1, 3, -1, 1, -2, 1, 1, + -2, 0, 0, 1, 0, 0 + }, + { + 3, 1136, 59, -92, -15, -8, -8, -21, 36, -11, + -43, 16, 20, -40, 24, 46, 6, 3, 16, -4, + -29, -20, 5, 4, -6, 37, -25, -8, 36, -17, + 13, -18, -4, 8, 3, 1, 42, -8, 17, -6, + 15, -13, -9, -15, -17, 11, -21, -30, 20, 1, + -3, 8, 11, 7, -3, -3, 3, 5, -7, 5, + 9, -4, -1, -6, -3, 11, 4, -3, 0, 1, + 1, 6, 3, -2, -3, -4, 6, -2, -3, 0, + 2, -1, 1, 1, 2, 2, 2, 0, -3, -1, + -1, 0, 0, 2, -2, 1 + }, + { + -22, 265, -33, -71, 39, 28, -15, 19, -3, 12, + -45, 12, 43, 30, -18, -83, 54, 5, -60, -79, + 24, 30, 5, -22, -14, 10, 10, -13, -17, 19, + -23, 33, -11, -15, 9, -12, -14, -21, 5, -7, + -8, -8, -5, 6, 16, -9, 0, -8, 12, 10, + -2, -6, -4, -9, -3, 16, 0, 5, -3, -6, + 1, 2, -2, 4, -2, 4, 7, -4, -4, -4, + 0, 0, 0, 7, -1, -3, 2, 3, -1, 1, + 3, 1, -1, 0, 0, -3, 0, 1, 1, 2, + -2, 1, -1, 1, -1, -1 + }, + { + -65, 1314, -247, 17, 17, -77, -108, 14, 17, 18, + 12, 22, -2, -11, -42, -15, -19, -36, 17, 9, + -5, 0, -12, 11, -20, -11, 7, -3, -3, 11, + -14, 2, 17, 15, 3, -30, 24, -21, -7, 12, + -24, -21, 7, -4, 17, 6, 2, -2, -8, 8, + -3, 2, -1, -5, 0, 5, 5, 9, -7, 0, + -2, 6, 0, 2, 4, -9, 3, 0, 3, 0, + 1, 0, 3, 0, -5, 0, -4, -1, 1, -1, + 1, -1, 0, 4, -1, 2, -4, 1, -3, 0, + 1, 0, -1, 1, 1, -2 + }, + { + 18, -115, 7, -24, 4, -27, 12, 9, -11, 15, + 0, -20, 84, 124, 60, -56, -4, -10, 3, 4, + -48, 92, -11, 38, -72, 14, 2, 40, -39, 39, + -35, 15, -2, 41, -2, 4, -6, 13, -25, 1, + -15, 3, 7, -15, -10, -7, 6, -1, 10, -1, + -2, 0, 7, 0, -3, -7, -4, 10, 12, 1, + 5, -7, -5, -1, 6, 3, -5, 5, 0, 3, + -1, -3, 2, -2, 1, 1, -2, -2, 0, -1, + 4, -1, -1, 3, 0, 0, 1, 2, 1, 0, + 1, 1, -2, -1, 1, 0 + }, + { + -39, 68, 174, -79, 27, -62, -69, -19, 1, 37, + -1, -8, -18, 62, 33, 16, 16, -6, -8, -7, + -30, 29, -7, 15, -8, 6, -27, -2, 0, -12, + 9, -16, 3, 26, 31, -11, -9, 0, 8, -9, + -15, -3, 20, 4, 19, 3, 11, -15, 19, 6, + 6, -5, 7, -4, -6, -8, -4, 4, 0, 4, + -2, -2, 2, -2, -5, 0, 0, 5, 5, -3, + -5, 5, 2, -4, -1, 2, -1, 3, -2, 0, + -5, 3, 2, -1, -1, -5, 1, 4, -1, 1, + 2, 0, 1, -2, 1, -1 + }, + { + -16, 85, 51, -12, 0, 10, 9, 9, -6, 8, + 23, -8, 44, -41, -931, 25, -39, -24, 54, -34, + -27, -46, -8, 3, -25, -33, -74, 29, -29, 37, + -3, 2, 5, 20, 10, 20, 4, 3, -6, 6, + 14, -7, -16, 0, 1, -1, 4, -6, 2, -4, + 11, -16, -2, -6, 3, -1, -1, 3, 2, 2, + 3, -9, 1, -1, 2, -4, 10, 3, -1, -3, + -1, -2, 3, -1, 2, 0, -5, 5, -2, 4, + -1, -3, 0, 0, -1, 2, 3, 3, -2, 3, + 0, -2, -1, 2, 0, -2 + }, + { + 0, -211, -58, 118, 1, 55, -5, -26, 20, 30, + -18, -4, -17, 48, 117, -15, 10, 12, -16, 8, + 45, 10, 8, 5, -23, 9, -10, -78, -8, -30, + 18, -21, -4, -2, -23, -9, 12, -1, -16, -10, + -9, 3, -1, 5, 7, 0, 3, 9, -2, -10, + 4, 5, -3, -9, -1, -6, 4, 4, 0, 4, + -1, 2, -1, 3, -2, 3, 5, 3, 4, 1, + -4, 4, 4, 0, -5, -2, 0, 1, -3, 1, + 1, 1, -2, 0, 1, -1, 0, 2, -4, 2, + -1, -1, 2, 0, 0, 0 + } + }, + { + { + 39, 15, -32, -74, -7, 2, 2, 4, -3, 8, + -9, 15, -10, -65, 9, 2, 60, 5, -3, -13, + 2, 14, 7, -9, 1, -18, 2, 5, 22, 32, + -58, 32, 0, -27, 9, -2, 9, -43, -33, -20, + 22, 1, -2, -2, -1, 9, 2, -2, 8, -9, + 9, -14, -9, 3, -5, -1, 2, 2, 3, 10, + 6, 3, 4, -3, 6, 0, -4, 0, 6, 0, + -1, -1, -1, 2, 3, -1, 1, 2, 3, -1, + -1, 3, 4, 0, -3, 0, 1, 0, -1, -2, + 2, -1, -1, -1, -1, 0 + }, + { + 281, -1214, -238, -96, -6, 18, -20, -37, 26, 27, + 8, 22, 0, -13, 17, 25, 16, -8, -26, -6, + -12, -41, 12, 22, -7, -5, 3, 29, 20, 23, + 10, 6, -35, -15, -3, 15, -13, -10, -12, -3, + 6, 6, 10, 6, 6, -14, 4, -4, -7, 1, + 2, 10, 9, -8, 4, -5, 5, -3, 1, 2, + 2, -3, 1, -1, -2, -4, 7, 1, 5, 0, + -3, -3, 3, -1, -5, 1, 1, -1, 1, 5, + 0, -1, 1, 2, -1, -5, 3, -2, 1, 0, + -1, 1, 1, -1, 0, -1 + }, + { + 108, 446, 77, 189, -16, -10, -1, -9, -12, -24, + -16, -1, 7, 22, -1, -5, 10, 28, -48, -13, + 2, 24, 14, 23, 8, 10, 1, 4, -21, 10, + -2, -9, 0, -8, -1, -3, 1, 6, 8, -17, + 5, -6, 27, 5, -2, -10, -6, 15, 14, -6, + -11, 3, 6, -7, 1, 11, 7, -3, -5, -3, + 8, 6, -5, 1, 5, 2, -1, 6, 1, 5, + 0, 2, 1, 1, -1, 0, -1, -2, -1, 3, + 0, 1, 2, -5, -2, 1, -2, -1, 1, 0, + 2, 0, 0, -1, 0, 1 + }, + { + 2, 246, 1, 6, -4, -6, 3, -1, 8, 2, + -8, 5, 3, 64, 42, -6, 110, 87, -6, 3, + -53, 34, 10, 39, 40, -9, 13, -17, -48, -7, + 30, 22, -15, 15, 13, 17, 0, 0, 19, -8, + -6, 0, 6, -5, 12, 10, 2, 1, 7, -7, + -7, 14, 2, -4, -1, -9, -4, 12, -7, -7, + -1, 6, 0, -1, -2, 1, -1, 2, 3, -5, + -5, 0, 5, 2, -4, 3, 3, 2, -2, -2, + -1, 2, -2, -1, -3, -2, 2, 1, 2, -1, + 0, 1, 1, 0, 1, 1 + }, + { + -132, 131, 10, 51, -2, -8, -5, -14, 9, -2, + 61, -12, -4, -16, 28, 8, 12, 43, 35, 24, + -16, 5, 14, -30, 17, -2, -10, 13, 4, -1, + 13, 3, 8, -10, -3, -6, -15, -11, 10, -24, + -25, 0, 23, -2, -19, 11, 10, 3, -1, 2, + 13, 12, -12, -8, -13, 4, -16, 0, 5, 4, + -2, -3, 6, -2, -5, 0, -1, 2, 2, 1, + -1, -3, -1, 4, 5, -1, 3, -3, 0, 4, + -2, 0, 1, -4, -3, 1, 0, 1, -1, 1, + -1, -1, 0, -1, 1, 1 + }, + { + 4, 44, -14, -18, 1, -3, 11, 2, 11, -7, + -9, -12, -25, -56, -7, -5, 15, -50, 67, -30, + -65, -41, -10, -52, -25, 12, -9, -6, -10, 7, + -35, -17, 19, 30, -21, -2, 9, -15, -10, -6, + 23, -9, 6, 9, -4, -2, -2, -10, 12, 4, + 11, 3, -7, 1, 14, 1, -4, -1, 1, 0, + -3, 1, 4, -4, 2, -2, -2, 0, -3, -3, + 3, 3, -3, -1, 4, 2, 4, -1, -1, -3, + 2, -1, -2, -1, 1, 0, 0, 0, 0, -1, + -3, 1, 3, -1, -1, -1 + }, + { + 122, 77, -152, -55, 17, 3, -3, -9, -9, 6, + 13, -10, -3, 0, 1, -33, 3, 5, -23, -2, + 7, 9, -15, -4, -1, -15, 27, 3, -20, -19, + 2, 7, 13, -14, 0, -6, -3, -6, 6, 2, + -7, 0, -1, 7, -16, 4, -10, 6, 5, -4, + 3, -2, 5, -11, 5, 6, 0, 3, 6, 0, + 0, 2, 0, 2, 3, 5, 4, -3, 1, 0, + -3, 1, 6, 0, -3, -1, 4, -2, 0, -1, + -4, -1, 2, -1, -4, 3, 2, 0, -1, 0, + 2, -1, -1, 0, 0, 1 + }, + { + 0, 88, -44, -4, -12, -4, -4, 1, 10, -4, + -18, -15, -35, 148, 114, -24, -41, 22, -15, 18, + -69, -22, -31, 5, 32, -2, 25, 22, -14, 17, + -4, 3, 18, 2, 1, 3, 0, -9, -21, -13, + -2, 5, -11, -12, 11, 1, 2, -16, 1, 16, + 0, -2, 7, 12, 7, 1, 2, -8, -5, 6, + 4, -2, -1, -1, -2, 3, 5, 1, -3, -4, + -2, -2, 1, 2, 0, -1, 0, 3, -2, 1, + -3, -1, 0, 1, 4, 0, 2, -1, 0, 2, + -2, 0, 1, 0, 0, -1 + }, + { + -24, 1422, -178, -65, -11, -1, -6, -33, 30, 14, + -33, -15, -8, -48, 11, 73, 29, 8, 5, 0, + -7, -8, -24, 19, -6, 15, 8, -5, 17, 0, + 6, -18, -8, 1, 9, 25, 9, 0, 19, 6, + -1, -14, -1, -13, -20, 11, 2, -34, -2, 16, + 3, 9, 8, 8, -11, -3, 4, 5, -4, -3, + 6, 1, -3, -5, -5, 1, 7, -2, 1, 4, + -2, 1, 3, -3, -1, -4, 3, -2, 1, -3, + 2, -1, -2, 1, -2, 1, 3, 1, 0, 0, + -2, -1, 0, 3, -1, 1 + }, + { + 11, 199, 10, -37, -7, 75, -17, -18, -3, 7, + -14, -32, 5, 46, -30, -11, -9, 41, 16, -68, + -5, 6, -4, 0, -8, 7, 13, -16, -27, 25, + -31, 16, 4, 1, 3, 5, -4, -2, 5, -5, + -7, -2, 0, -5, 16, -4, -3, -6, 4, 9, + 8, -1, 1, -3, -11, 11, 2, 4, 0, -1, + -3, -2, -3, 3, -4, 1, 6, 3, 4, -6, + 1, -1, -4, 5, -1, -2, 0, 0, -2, -2, + 0, 0, 0, 1, 2, -1, -2, 0, 0, 2, + -1, 0, 0, 0, 1, -1 + }, + { + 109, 886, -8, -92, 39, -35, -130, -18, 12, 8, + 10, 13, 15, -9, -12, -43, -29, -4, 3, 29, + -6, 19, 0, -14, 6, -1, -7, -9, 13, 1, + 16, -1, 14, 0, 8, -22, 3, 0, -21, 10, + -4, -16, -5, -4, -1, 8, 6, 0, -6, 0, + 0, 3, 2, -7, -5, -1, 4, 8, -2, -3, + 0, 1, 1, 0, 2, -4, 0, 0, 2, 0, + 0, 1, 4, 4, 0, 0, -1, -4, 0, -2, + 2, 2, -2, 5, -1, 4, -2, 0, -2, 0, + 1, 0, -2, -1, 3, 0 + }, + { + -16, -93, 7, -11, 5, -13, -5, 10, 0, 4, + -11, -15, 37, 227, 26, -62, -7, 9, 42, -26, + -42, 113, 25, 32, -38, -36, -2, 39, -6, 30, + -37, 12, -10, 7, 20, 2, 5, 11, -15, 12, + -6, -7, 3, 2, -2, -7, -7, 3, 9, 8, + 5, -2, 1, 2, -2, -6, -9, -3, 0, 1, + 3, -3, -5, -4, 0, 5, -7, 3, 0, 2, + 2, -1, 2, 2, 2, 3, 0, -3, -2, -1, + 2, -1, -2, 0, 1, -1, -1, 1, 1, 0, + 0, 1, 0, -1, 1, 1 + }, + { + 36, -122, 72, 29, 25, 68, -89, -42, 3, 33, + 27, -12, 17, -3, 33, 11, 2, 13, -35, 25, + -5, 13, -5, -2, -6, 30, -6, -1, 6, -8, + 1, 5, 4, 18, 23, 12, -8, -19, 18, -5, + -15, -11, -2, 8, -5, -10, 10, -19, 9, 7, + 6, 1, 5, 5, 2, -2, 4, -3, -8, 6, + -1, -1, -2, 0, -4, -5, 2, 1, 5, 3, + -6, 2, 4, 4, -1, 0, -3, 5, 1, 3, + -4, -2, 1, 4, 1, -4, -3, 0, -2, 0, + 1, 0, 3, 0, 1, 1 + }, + { + 7, 24, -44, 51, 0, 6, 8, 18, 15, -18, + 1, -2, 8, -213, -524, -120, 48, -21, 47, -8, + -39, 5, -24, 6, -22, -3, -33, 25, -55, 3, + -4, 7, 25, 14, -21, 9, -2, -3, 10, -6, + 9, 2, -8, 2, 2, 1, -1, 1, 3, -3, + 7, -2, -4, -10, 1, -2, 0, 2, -1, 2, + 6, -1, -3, 3, 4, -3, 7, 9, -2, -1, + -4, -4, 5, -1, 0, 3, -4, 4, 0, 1, + 3, -4, -3, 0, -3, 0, 2, 3, -2, 1, + 3, 0, -2, 1, 2, -3 + }, + { + -61, -156, 7, 11, 19, 135, -21, -14, 20, 8, + 52, -38, -9, 46, 82, 21, 20, 39, 2, -3, + 27, -6, 17, 43, -23, -18, -25, -67, -3, -23, + 9, -1, -5, -17, -23, -23, -2, 11, -10, -21, + 5, 0, 0, -1, 12, -4, -5, 11, 0, -1, + 8, 2, 5, -8, -3, -10, 2, 5, 3, -1, + 0, -2, -1, 2, -1, 1, 3, 1, 0, 4, + -2, -3, 6, 6, -2, -3, -3, 0, 1, -2, + 1, 4, 1, -1, 0, 1, 0, 5, -2, -1, + 0, 0, 0, 1, 1, 0 + } + }, + { + { + -35, -100, 17, -47, -12, 9, -2, -15, 5, 1, + 4, -2, 36, 28, -6, -49, -12, 9, 49, -8, + -62, -15, 21, 7, 26, -17, -20, 11, -14, -8, + -24, -13, 17, -4, -15, -11, 26, -4, -19, -26, + 8, 4, 5, -6, -14, 10, 4, -14, 1, -19, + 5, 0, -3, -4, 2, 0, -5, 8, -7, -5, + -1, -2, 5, -2, 2, -1, 3, -3, -2, 4, + 2, -2, 4, -1, 3, 0, 1, -3, 3, 1, + 0, 0, 1, 1, 3, 3, -1, -2, 1, 0, + -3, 2, -1, 1, 1, -1 + }, + { + -174, -1431, 54, -5, -8, -3, 17, -31, -22, 6, + 5, -13, 9, -36, 14, 26, -36, 11, 34, -6, + 4, -11, 2, 6, 2, 25, 15, 9, 2, 7, + -4, 2, -6, -5, -32, 16, 20, 14, -2, -8, + -23, -7, 11, 9, -1, 3, -9, 16, -17, -3, + 2, -6, 15, 0, 6, 2, -2, 8, 4, 4, + 2, 4, 2, 3, 3, -5, -2, -3, 3, 7, + 0, -1, -3, -1, 1, -7, 4, 0, -2, -1, + -1, 2, -1, 1, 2, 2, -5, 2, 0, 1, + 0, 0, -1, 1, -1, 0 + }, + { + -76, 145, -117, 56, 69, 21, -18, 3, -4, 16, + -5, 4, 12, -39, -77, -13, -15, -24, -37, -3, + 18, 4, 0, -9, -27, 16, 28, 33, -36, -9, + 8, 6, 5, 16, -6, -14, 2, 3, 25, 4, + -6, 6, 16, 5, 12, 15, -9, 8, 9, 13, + 2, 0, 3, 1, 1, 0, 2, 7, 1, -1, + -5, 0, 2, 2, -1, 3, -2, 6, -5, 2, + 3, 1, 0, -1, 2, -1, -1, 0, 1, 0, + -2, 0, 0, 1, -1, -1, 1, -2, -1, 0, + -2, 2, -1, 1, -1, -1 + }, + { + 9, 258, -25, -14, 14, -4, -9, -13, 3, 5, + -4, 10, -6, 31, 78, -100, -81, 9, -28, 19, + 9, 8, -30, 66, -1, -39, -23, 21, 10, -27, + 12, 27, -23, 7, -20, -15, 27, -15, 5, 13, + -5, 9, 18, -1, 4, -8, 5, 2, 4, 5, + 9, 1, -1, -2, 3, 9, -1, 0, 3, 0, + -6, -1, 4, 0, 0, 3, -2, -1, 2, 4, + 2, -6, -1, 1, 1, -2, -1, 1, 1, 2, + 1, -2, 1, -1, 1, 0, -3, -2, 2, 2, + 0, -2, 1, 2, -1, 1 + }, + { + -48, 310, -63, 40, -6, 6, 13, -15, 13, -20, + 26, 57, -20, -48, 43, -48, 5, 3, -15, 13, + -17, 21, 6, -5, -31, 15, -6, 58, 19, 5, + 2, -4, -16, 7, 17, 2, 3, -40, 1, 8, + -14, -1, 5, 2, -17, 2, 15, 5, -1, -3, + -3, 3, 9, 5, -7, 2, 2, 2, -3, -9, + 4, -3, 0, 3, 1, -2, 3, -1, -4, -1, + 3, 1, -2, -4, 0, 0, -3, 2, -2, 1, + -1, 1, -1, 3, -2, -1, 0, 0, 0, -2, + 1, -1, 0, 0, -1, 0 + }, + { + -21, 22, 124, -14, -1, -7, 0, 0, 10, 6, + 13, -3, 15, -26, -58, -17, 143, -13, 17, 39, + 39, -34, -13, 11, -46, -49, -19, -5, -76, -23, + -15, -11, -2, 14, -1, 0, 8, 11, 5, -2, + -9, 12, 6, -1, 15, 8, 3, -15, 3, -5, + 4, 7, 4, -8, 2, 4, -2, -2, -1, 1, + -3, -6, 3, -1, -2, 0, 1, -1, 0, -4, + -5, 4, 2, -1, 0, 0, 1, 4, 4, 0, + -2, 3, 0, -1, -2, 1, 0, -1, 0, 2, + 0, -2, -1, 2, 0, 0 + }, + { + -263, -183, 53, -65, -26, 16, -2, 24, 19, -9, + -8, -8, -22, 29, 24, -17, -3, 8, 30, -19, + -15, -22, -12, 10, -1, -16, 1, 17, -20, -17, + -4, 5, 33, -14, 15, 11, -11, -12, -2, -2, + -6, 21, 16, -7, -15, 2, -3, -6, 0, 8, + -12, 4, -1, -10, -1, 1, 2, 0, 3, 2, + 4, 2, -3, 1, -3, -3, 3, 5, -3, -4, + 4, -5, -7, 4, 1, -2, 0, 1, 0, -2, + 4, -3, 0, 5, 0, -4, 1, 2, 0, -1, + -2, 2, -1, 1, -1, 0 + }, + { + -22, 21, 50, 10, 15, -3, -6, 4, -1, 7, + 2, -2, -31, 35, 90, 10, -31, -26, -34, 92, + 6, -27, -5, -8, -21, -56, -27, 14, -12, 2, + 8, 14, -14, -2, 4, -19, -5, 0, -5, 13, + 4, 0, 4, -3, -4, -11, -8, 15, -12, -9, + 8, -2, -3, -3, 10, 0, 3, 6, 2, -9, + 0, -4, 6, -1, 2, -2, -5, 0, 3, -1, + 1, 2, 0, -1, 2, 2, -4, 3, 2, 0, + 2, -1, -1, -1, -1, 1, 0, 1, -1, -1, + 2, 0, 0, 0, 0, 0 + }, + { + -93, 1958, 209, -71, 14, 9, 8, -2, -23, 6, + 43, -19, 6, -66, 55, -3, -3, 10, -15, -15, + -8, 18, -49, 13, 16, -18, 8, 12, 3, -7, + -7, 1, -9, -11, -15, 1, -7, -5, 9, 21, + -13, 5, 23, -1, -3, -12, 5, 3, -1, 0, + -7, 9, -3, 1, 3, 3, -3, -4, 5, -2, + -1, 3, -2, 3, 4, -10, -1, 4, 1, 1, + 0, 0, -2, 0, 2, 3, -5, -1, 1, -1, + -1, 0, -3, 1, -1, -2, -2, 0, 1, 1, + 1, -1, 0, -1, 1, 1 + }, + { + -3, 169, -30, 36, -23, -11, 27, 1, -7, 9, + 11, 16, -24, 6, -61, 38, -7, -31, 8, 52, + 1, -58, -54, 12, 22, 26, -10, -6, -6, 7, + 9, -7, -7, 10, 0, -4, -10, 7, 14, -4, + -7, -7, 9, 2, -15, 9, -3, 1, -5, -12, + 13, 10, 5, 10, 5, -6, -4, 0, -1, 4, + 3, 0, 2, -1, 1, -4, -4, 1, 3, 4, + 0, 0, 0, -3, 0, 1, -1, -2, -1, -1, + -2, -2, -1, 1, 1, 2, 0, -2, -1, -1, + 2, -1, 0, 0, 0, 1 + }, + { + -139, 564, 90, -53, -14, -7, 96, 8, -9, -17, + 4, -14, 5, -4, 26, -33, -15, 3, 10, 18, + 10, -14, 25, -24, 19, 5, -7, 2, -9, -14, + 29, 13, 2, -21, -2, 9, -25, 6, -9, 4, + 14, 19, -3, -1, -13, -5, -5, -3, 8, -5, + 2, 0, 4, 9, -5, -5, -7, -7, 7, 0, + 1, 1, 2, -2, -3, 3, -2, -1, -3, 1, + -1, 0, -2, 1, 4, -1, 4, 2, -3, 1, + -1, 0, 2, -3, 1, -2, 2, 0, 2, 0, + -1, 1, 0, -1, -1, 2 + }, + { + 11, -99, -71, -15, -12, 15, -9, 5, 1, -4, + -6, 2, -44, 55, 6, -35, 3, -10, 55, -6, + -45, -23, 24, -14, 40, 28, -38, 14, -4, -12, + 24, 6, 5, -18, 14, -10, 8, -6, 17, 11, + 9, 0, -11, 11, 6, -7, -1, -10, 1, -2, + 2, 3, -9, 4, 3, 4, -1, -2, -14, -3, + -7, 0, 1, 1, -6, -3, 6, -3, 1, -1, + 0, 2, -1, 2, 1, 0, 3, 2, -2, 1, + -2, 2, 2, -2, 0, -1, 0, -2, -1, 0, + -1, 0, 1, 1, -1, 0 + }, + { + -6, -194, -120, 84, -7, 107, 80, -4, 24, -28, + -1, -1, -1, -27, -16, 26, -51, 4, -5, -12, + 41, 4, 6, -3, -1, 17, -2, -19, 4, 18, + -7, 15, 7, -3, -22, 2, 13, -11, 1, 15, + 4, -7, -7, 24, -15, -7, 3, 0, -14, -7, + -1, -3, 5, 0, 11, 5, 9, 6, -3, -8, + 0, -1, 0, -2, 1, 1, 2, -2, -3, 4, + 1, -2, -1, 5, 0, 0, -1, -2, 2, 0, + 5, -3, -1, 0, 1, 4, 0, -3, 0, 0, + -1, -1, -1, 2, 0, 2 + }, + { + 0, 19, -106, 16, -1, 1, 6, 6, 23, -13, + -13, 6, -58, 16, 250, 50, 60, -13, 6, -7, + -10, 47, -1, 44, 49, 12, 27, 5, -48, 7, + -35, 6, 26, 3, 1, -1, -1, -3, -3, 10, + -13, 0, 8, -6, -1, 7, -18, 5, 2, 7, + -8, 10, 12, -1, 0, 0, -2, -1, 2, -3, + -4, 10, -2, -2, 1, 6, -6, -1, 1, 1, + 3, -2, -1, 2, -1, 2, 4, -4, -1, -3, + 0, 2, -1, 0, 1, -2, -2, -3, 2, -3, + 0, 2, 2, -2, 1, 2 + }, + { + 53, 52, 33, -16, -36, -19, -39, -11, 7, -21, + 40, 14, -4, -48, -103, -22, 40, 2, 4, -10, + 1, -12, -1, 15, 7, -2, -15, -20, 24, -1, + 6, 1, 15, -2, -5, -19, -12, -8, 13, -14, + 6, 11, 12, 3, -2, 7, -8, -7, -3, 0, + 4, 1, 8, 7, 2, 1, 4, -4, 5, -2, + 2, 3, -3, -3, 1, -2, -5, 0, 1, 1, + 2, -3, -5, 1, 4, 2, -1, -2, 1, 0, + -2, -2, 3, -1, -1, 1, 1, -1, 4, -1, + 0, 1, -2, 0, -1, 0 + } + }, + { + { + 9, -21, -104, 34, -24, -4, 4, -16, -1, -2, + 5, -5, 39, 32, 11, -27, -19, -11, 14, -8, + -39, -37, 19, 4, 19, 7, -33, 14, -15, -39, + -2, -17, -19, 24, -11, -10, 15, 21, -7, -14, + -1, -3, 9, -8, -5, 5, 3, -3, -7, -12, + -3, 1, -2, -7, -4, 0, 0, 8, 3, -10, + -3, -8, 0, 3, 0, -3, 1, -3, -7, 2, + 4, 1, 1, -1, 1, 0, 0, -2, -2, 1, + 1, -2, -2, -1, 3, 2, 0, -2, 1, 2, + -2, 1, 0, 0, 1, 0 + }, + { + 117, -1058, -329, -44, -9, -26, 14, 15, 3, -21, + 0, -16, 1, -3, -34, 35, 7, 3, 30, -6, + 8, 29, -24, -1, 13, 16, 0, 28, -4, -2, + -14, -14, 12, 11, -28, -4, 21, 19, 9, -16, + -7, -16, 9, 12, -11, 12, -6, 14, -5, 6, + -2, -16, 3, 5, -2, 3, -2, 7, 3, 1, + -4, 8, 2, 1, 3, 0, -4, -4, -4, 5, + 2, 0, -2, -4, 5, -3, 1, 2, 0, -4, + -1, 1, -1, 0, 1, 5, -4, 1, 0, 0, + 0, 0, -2, 1, -1, 1 + }, + { + 90, -178, 8, -69, 60, 19, -18, -2, -2, 38, + 0, 6, 6, 2, -83, -29, -18, -14, -10, -22, + 17, -15, -1, -19, -11, 5, 28, 15, -19, -8, + 24, 11, -10, 23, 3, -16, -8, 6, 20, 6, + -11, 3, 11, -4, 5, 25, 4, 2, -6, 6, + 6, 5, 6, 1, 0, 0, -8, 6, 2, 1, + -7, -5, 2, -3, -3, 0, 1, -1, 0, -1, + 0, 0, 0, -3, 1, 1, 1, 0, 3, 0, + -1, 0, -3, 1, 2, -1, 2, 0, -2, 1, + -2, 0, -1, 0, -1, -1 + }, + { + -8, 249, 34, -24, 7, 4, -13, -10, -5, 2, + 4, 9, -4, -22, 149, 7, -142, 5, -53, 29, + 39, -42, 9, 30, -33, 20, -37, -10, 31, -25, + 8, 11, -16, -4, -6, -11, 3, 4, -4, -2, + 5, 8, 11, 5, 0, -7, -2, 2, 3, 6, + 16, -4, -5, 3, 0, 5, 5, -3, 3, 4, + -2, -2, 5, 1, -1, 2, 0, -2, -1, 6, + 5, -2, -2, 1, 2, 0, -3, -2, 1, 3, + 2, -2, 0, 0, 1, 2, -3, -1, 0, 1, + 0, -2, -1, 2, -1, 0 + }, + { + 249, 159, -249, 39, -9, 7, 11, -2, 2, 18, + -21, 28, -10, -16, 19, -34, 15, -6, 0, 0, + -6, 11, -15, 21, -19, 8, 6, 69, 3, 7, + 0, -13, -23, 16, 5, 14, 6, 2, -3, 4, + 13, -8, -5, 1, -11, -4, 5, 6, -1, 1, + -9, -4, 3, 9, 2, -4, 11, 0, -3, -7, + 2, 0, -4, 2, 2, -5, 3, 3, -3, -1, + -1, 5, 2, -2, -3, 2, -5, 1, -1, -2, + 0, 0, -2, 2, 1, -2, 0, -1, 1, 0, + 2, 0, 0, 1, -1, -1 + }, + { + -2, -47, 84, 22, -2, 0, -7, 3, 1, 8, + 12, 2, 25, 31, -42, 37, 38, 40, -27, 71, + 33, -10, -40, 61, -49, -32, -31, -8, -16, -63, + -13, -9, 4, -13, 20, 10, -12, 14, 9, 4, + -18, 13, 9, -4, 5, 9, 0, -2, -5, -2, + -3, 8, 5, -1, -8, 1, -2, 4, 0, 1, + 2, -6, 0, 2, -3, -2, 4, 0, 3, 0, + -4, 0, 1, 2, -2, -3, -3, 2, 2, 3, + -3, 2, 2, 1, -2, 0, 0, 0, -1, 1, + 2, -2, -3, 0, 1, 1 + }, + { + 238, -754, 9, -87, -9, 3, -3, 28, 7, -9, + -16, 7, -5, 14, 14, -3, 3, -15, 40, 3, + -14, -15, -8, 9, -11, -6, -7, 7, -17, 4, + -5, -5, 22, 4, -6, 9, -2, -4, -22, 1, + 1, 16, 15, -5, 1, -6, 2, 3, -3, 10, + -8, 2, -3, -4, -2, -4, 0, 2, -4, 0, + 2, 2, -1, 0, -3, -6, -4, 5, -1, -3, + 4, 0, -8, 0, 1, -1, -1, 1, 0, -2, + 4, -1, -2, 1, 3, -3, -2, 2, 1, 1, + -2, 2, 1, 1, 0, -1 + }, + { + -2, -72, 19, 29, 8, 2, -6, 4, -5, 0, + 16, 8, 5, 44, 83, 11, 12, 16, -26, 37, + 86, 17, -25, 36, -39, -70, -11, -4, -7, 3, + 23, -8, -4, -13, 10, -10, -11, -5, 4, 5, + 7, 5, 1, 7, -5, -10, -12, 17, 2, -11, + 0, -1, -7, -3, -1, 1, -2, 5, 6, -6, + -3, -2, 2, 1, 3, -1, -4, -4, 3, 2, + 1, 2, -1, 0, 0, 1, -1, -2, 2, -1, + 3, 1, 1, 0, -2, 2, -2, 0, 0, -2, + 1, 0, -1, 1, 0, 0 + }, + { + 315, 1933, -96, -51, -22, 3, -15, 28, -18, -21, + 33, 12, 20, 16, 20, -43, -26, 11, -12, -7, + -20, 13, -23, -14, 12, -14, 1, -4, -4, 5, + -1, -8, 3, -23, -13, -12, -2, 29, -38, 29, + -12, 18, 8, 5, -3, -8, -6, 7, 10, -8, + -9, -3, -2, 4, 10, 2, -2, -4, 5, 2, + 1, 0, -2, 4, 6, -3, -6, 2, -1, 0, + 0, 3, -3, 2, -1, 3, -3, -1, -1, -1, + -1, 2, 0, 1, 1, -1, -2, -2, 0, 0, + 2, 0, 0, -2, 1, 0 + }, + { + 7, 147, -27, 27, 4, -51, 7, 26, 7, 4, + 11, 43, -15, 6, -68, 8, 21, -30, -42, 50, + 4, -40, -29, -3, 12, 11, -10, -3, 12, 9, + 2, -7, -8, 8, -12, -2, -21, -4, 8, -9, + -6, -11, 3, 14, -16, 4, 2, -3, 0, -8, + -2, 10, 1, 8, 15, -9, -2, 0, -2, 1, + 5, 3, 5, 1, 2, 1, -5, -3, -4, 4, + 0, 1, 4, -3, 0, 0, 0, -1, 1, 2, + 1, -2, -1, -1, -1, 1, 2, -1, 0, -2, + 2, -1, 0, 0, -1, 1 + }, + { + 156, 296, -111, 41, -9, 5, 52, 39, 14, -22, + 5, -6, -5, -7, -12, 12, -16, -13, 2, 1, + 11, -14, 12, -5, 10, -2, -13, 13, -5, -15, + 7, -2, 15, -14, -17, 21, -10, -10, 7, 3, + 0, 14, 7, 2, -3, -6, -7, -4, 5, 2, + 2, -3, 3, 8, 4, -2, -5, -10, 4, 3, + 2, 0, 5, 0, -4, 3, -1, -1, -4, 1, + 1, -1, -3, -2, 1, -2, 2, 3, -2, 1, + -1, -2, 3, -3, 0, -3, 1, 0, 1, 0, + -1, 0, 1, 0, -2, 1 + }, + { + -3, -131, -20, -30, -16, 10, 1, -6, 5, -1, + -7, 5, -11, -27, -7, 1, -11, -2, 4, 4, + 32, -102, 13, -49, 38, 46, 5, -24, 0, -2, + 22, 9, 24, -9, -6, 3, 1, -11, 19, 1, + 2, 6, -5, -1, 1, 1, 0, -11, -3, -11, + -4, 10, -5, 4, -1, 6, 5, 4, -4, -1, + -4, -2, -1, 3, -2, -4, 8, -2, 2, -2, + -2, 2, -3, 0, -1, -1, 1, 3, 0, 2, + -2, 1, 3, 0, 0, 0, 1, -1, -1, -1, + -1, 0, 1, 1, -1, -1 + }, + { + -24, -147, -6, 5, -16, -12, 130, 6, 32, -22, + -41, -2, -24, 33, -26, 32, -48, -5, 8, -31, + 26, 6, 12, 4, 4, -13, -11, -16, -17, 14, + 2, 6, -1, -2, -19, -12, 17, 3, -3, 11, + 1, 2, 9, 15, 8, 12, -6, 7, -8, -12, + 3, -8, 4, -3, 1, 3, 3, 8, 4, -8, + -2, -1, 0, -2, 1, 6, 0, 1, -4, -1, + 5, 0, -4, -1, 0, -2, 1, -3, -1, -3, + 5, 1, -1, -2, -1, 4, 3, 1, 1, 0, + -1, 0, -3, 0, -1, -1 + }, + { + 10, 37, -49, -25, -1, 1, 0, 10, 5, 6, + -5, 1, -52, 120, 75, 97, 1, 25, 7, -31, + -14, 21, 14, 32, 39, 11, 13, -10, -7, 8, + -32, 14, 14, 10, 15, 3, 13, -4, -10, 18, + -11, -10, 5, -6, -3, 3, -11, -5, 3, 11, + -8, 3, 10, 8, -1, 1, -1, -3, 5, -2, + -7, 3, -1, -2, -2, 5, -4, -6, 1, 0, + 3, 1, -3, 1, 1, -2, 5, -4, -2, -2, + -3, 2, 2, -1, 3, -1, -1, -3, 2, -1, + -2, 0, 2, -1, -1, 2 + }, + { + 1, 110, 111, -41, -24, -140, 3, 2, -2, -8, + -6, -1, 16, -56, -105, -26, 35, -47, 19, -4, + -3, 3, -10, -18, 18, 10, -5, 25, -35, 15, + 12, -6, 8, 20, -4, -2, -20, -6, 6, 3, + -8, 12, 11, 7, -5, 7, 4, -10, -10, 0, + 2, -5, 1, 6, 3, 4, 7, -2, 4, 1, + 0, 4, 1, -4, -1, 0, -5, 3, 2, -3, + 4, 0, -6, -5, 1, 3, 2, -1, -1, 2, + -1, -5, 1, 2, -1, 0, 0, -4, 3, 1, + 0, 1, 0, -1, -2, 0 + } + }, + { + { + 1, 251, 47, 48, 11, -11, 6, 6, -5, 13, + -3, 4, 6, -8, 37, -18, 36, -20, -8, -5, + 22, -4, -9, -25, -24, -19, -27, 1, -11, -6, + 14, 25, -48, 24, 16, 4, 0, 7, 11, 8, + 8, -14, 2, -3, 11, 0, -10, 4, 1, 6, + 6, -3, -3, 4, -8, -8, 3, -3, 10, 3, + 5, -2, -6, 3, 5, -1, -4, 0, -1, -4, + 0, 3, -3, 3, 1, 0, -1, 3, -1, -3, + 1, 2, 1, -1, -3, -2, 2, 0, -1, 0, + 3, -1, 1, -2, -1, 1 + }, + { + -100, -713, 352, 66, 30, 5, -4, 14, 27, -30, + -9, -1, -22, 28, -46, -19, 35, -15, -33, -3, + -8, 25, 11, 13, 0, -9, -26, 25, -3, -16, + -17, -19, -12, 6, 1, -14, -9, 3, 11, -2, + 22, -11, -5, 7, -2, -12, 2, -3, 1, 12, + 8, 1, -7, -3, -7, -7, 3, -1, 4, 0, + -2, 0, -1, -2, -1, 3, 2, 0, -4, -3, + 1, -3, 4, -2, -1, 6, -3, -1, 1, 2, + 1, -2, 2, 1, -2, -2, 5, -2, 1, -1, + 0, 1, 1, -2, 0, -1 + }, + { + -89, -405, 120, -54, -91, -12, -4, -14, -4, 6, + -8, 6, -1, 36, -57, -29, 11, 25, 22, -3, + -1, 0, -3, -5, 21, -12, -14, -24, -17, 0, + 28, 1, -23, -20, -6, -6, -14, -1, -1, -12, + -4, -14, 8, -5, -8, 1, 9, 8, -2, -18, + -9, 12, 12, -3, -1, 5, -6, -8, -4, 4, + 3, -1, -5, -6, 4, -1, 1, -4, 4, 2, + -1, 0, 0, -2, -3, 0, 1, 0, 0, 3, + 1, 1, 1, -3, 1, 1, -1, 1, 0, 1, + 2, -1, 0, -2, 0, 1 + }, + { + 6, 204, 37, 13, -10, 3, -1, -1, -9, -6, + -4, 1, 25, -16, 26, 49, 3, 5, -80, 44, + 16, -48, -12, -16, -7, 35, 7, -10, 15, -35, + -17, -15, 1, -4, 5, 21, -34, 5, 11, -26, + 8, 5, -4, -3, -1, 13, -3, 0, 11, -2, + 1, 6, -5, 0, 3, -5, 1, 8, -4, -2, + 1, 2, -1, 2, -2, -3, 0, 0, -2, -2, + -1, 6, 3, 0, -2, 5, 0, -1, -2, 0, + 1, 2, -2, 0, -1, 1, 2, 1, 0, -1, + 0, 2, -1, -1, 0, -1 + }, + { + -354, -454, 4, 79, -8, -15, -12, 12, -7, 18, + 1, -22, 10, 13, 9, 17, -7, -25, 15, 6, + 17, -14, -21, -1, 16, -9, 12, 39, -16, -17, + 5, -3, 2, 1, -22, 3, -11, 40, 11, -20, + 22, -1, 1, -8, 2, 9, -12, -2, 5, 0, + 2, 7, -15, 2, -1, -2, -3, -2, 6, 8, + 1, 0, -1, -6, -4, -1, -2, 5, 2, -1, + -4, -1, 1, 6, -1, 0, 0, -4, 2, 1, + 0, -1, 1, -4, 1, 0, 0, -1, -1, 2, + 0, 0, 0, 0, 2, 0 + }, + { + 15, 15, -42, -7, 2, 5, 5, 0, -3, -3, + -12, 0, -3, -12, 34, 68, -91, 26, -16, 30, + -29, 12, 22, 66, -6, 43, 3, 0, 40, 5, + 19, -21, 13, -11, 9, 13, -5, -7, -11, 3, + 11, -8, 6, 2, -4, 1, -13, 3, 0, 7, + 3, 3, -3, 8, 2, -2, -2, 8, -1, -1, + 4, -1, -1, 4, 2, -4, -1, -2, 2, 2, + 4, 0, -3, 1, 0, -1, -1, -3, -3, -1, + 2, -2, -1, 0, 2, -1, -1, 1, 0, -1, + 0, 2, 1, -2, -1, -1 + }, + { + -51, -1167, 32, -71, 32, -4, 3, -2, -27, 2, + -1, 3, 13, 18, 26, -12, 23, -21, -20, 19, + 8, 17, -8, -3, -21, -6, 6, -6, -3, 4, + 10, 4, 6, 9, -11, 7, 3, 8, -11, 3, + -5, -10, -3, 8, 3, -2, -7, 11, 3, -1, + 5, -3, 6, 2, 5, -2, -1, 8, 0, -1, + -3, -2, 0, 0, 1, 0, -3, -4, 2, 1, + -4, 5, 3, -4, -3, 1, 2, -2, 1, 1, + -3, 2, 1, -4, 0, 4, -2, -1, 0, 2, + 0, -2, 1, -1, 1, -1 + }, + { + 20, -28, -118, 19, -6, 0, 2, -1, 1, -10, + -3, 5, 27, -44, 12, 92, 27, 63, -8, -41, + 35, 62, -49, 32, 9, -13, 19, -26, -33, -2, + 13, -10, 19, -17, 8, 19, 0, -14, 7, -7, + 4, 11, -9, 2, 7, -1, 4, -8, 10, 14, + 0, 0, -2, 5, -12, -2, -1, -4, 2, 8, + 0, 5, -5, 1, -1, 2, 8, -2, -3, 0, + 0, -3, -1, 4, -1, 0, 3, -2, -1, 0, + -3, 0, 1, 1, 1, -1, 0, -3, 1, 0, + -2, 1, -1, 0, 1, 0 + }, + { + -505, 1211, 260, -24, 16, 5, -27, 4, 32, -14, + -47, 6, 2, 45, -22, 18, -16, -2, -9, 6, + -6, -3, 0, -22, -17, 5, -16, -23, 2, 6, + 19, -21, 7, -23, -2, -20, -15, 38, -41, -5, + -5, 19, -5, 12, -3, 9, -3, -13, 8, 0, + -4, -18, -6, 1, -6, -2, 4, -2, -8, 0, + 3, -4, -2, -2, -4, 9, 4, -3, 0, 1, + -3, 3, 2, 1, -1, -4, 3, -1, 0, -2, + 0, 0, 1, 1, 0, 2, 2, -1, 0, -2, + 0, 1, 0, 1, -2, 0 + }, + { + -11, 58, 14, 12, 25, 29, -34, 2, 13, 2, + -17, 7, 23, 46, -34, -27, 24, 42, -11, -41, + -8, 2, 32, 4, -14, -9, 12, -1, -11, 16, + -34, 13, 3, 2, -11, 15, 1, -11, -13, -13, + -3, -3, -6, 4, 14, -11, 3, -10, 3, 5, + -9, 2, -4, -8, -3, 6, 3, 1, -1, -2, + 0, 1, -2, 3, -2, 7, 5, 0, -1, -6, + -1, -1, 1, 3, -1, -3, 1, 1, 0, 1, + 2, 2, 1, -1, 0, -2, 0, 1, 0, 1, + -1, 0, -1, 0, 0, -1 + }, + { + -145, 49, -5, 30, -1, 66, -95, -11, 26, 0, + -2, 1, 2, 8, -49, 19, -4, -11, -9, 3, + -3, 23, -7, 5, -11, -2, -6, 1, 11, -1, + -14, -34, 17, 5, -17, -15, 16, -12, 5, 20, + -7, -17, 6, -1, 9, 4, -3, 0, -11, 3, + 0, -1, 2, -8, 5, 0, 5, 3, -7, 0, + 1, -1, 2, 3, 4, -3, 0, 0, 0, -1, + 2, 1, 2, 0, -4, 1, -3, -2, 1, -2, + 2, -1, -2, 3, -2, 2, -2, 0, -2, 1, + 1, -1, -1, 1, 1, -1 + }, + { + 1, -155, 7, -18, 9, -22, 0, 8, 2, -8, + -12, -10, 34, 36, -99, -23, 42, 6, -61, -20, + 29, 12, 28, -20, -25, -8, 35, -21, -18, 29, + -29, 32, 7, 5, -11, 0, -7, 7, -16, 0, + -6, 5, 16, -5, -8, 7, 2, 2, -1, -3, + -5, 4, 6, 1, -6, -2, 0, 6, 10, 1, + 7, -2, -5, 0, 7, 6, -2, 4, 0, 1, + 0, -1, 0, 0, -2, 1, -3, -2, 1, 0, + 2, -1, 0, 2, 1, 0, 1, 1, 1, 0, + 1, 1, -2, -1, 2, 0 + }, + { + 65, -53, 176, -27, -5, -82, -48, -12, 14, 32, + -19, -26, 24, 76, -19, 4, 6, 11, -4, 10, + -32, 8, -2, 2, 0, -2, -7, 6, -14, -11, + 3, -12, -11, -3, 13, -4, -10, 6, 16, -16, + -18, -4, 12, -7, 11, 8, 1, -12, 12, 1, + 14, -1, -5, 0, -7, -5, -4, -2, 0, 7, + -2, 2, 1, 2, -5, 0, -2, 4, 4, -5, + -3, 4, 2, -2, -1, -1, 1, 3, -2, -1, + -4, 2, 2, 1, -2, -4, 0, 3, 0, 0, + 1, 1, 0, -2, 1, -1 + }, + { + -19, 58, 64, -3, 2, -4, -11, 15, -25, -21, + 11, 1, 23, 91, -327, 44, 0, -9, 16, -28, + -13, -12, 10, 18, -2, 35, -37, 13, 20, 0, + -3, 23, 0, 14, -4, 10, 16, 0, 3, 2, + 10, -5, 0, 3, -1, -5, 6, -8, 2, -3, + 7, -7, -9, 0, 0, -3, 0, 1, 3, 1, + 5, -8, -3, 0, -2, -6, 5, 0, -2, 0, + -3, 0, 2, -2, 1, -2, -3, 4, -1, 3, + 1, -4, 1, 0, -1, 1, 2, 3, -2, 3, + 1, -2, -1, 1, 0, -2 + }, + { + -28, -16, 132, 23, 16, -6, 30, 19, -9, -19, + -3, -55, 7, 64, 106, 2, -6, -19, 20, -22, + 3, 18, 1, -11, -16, -1, 15, 81, 3, 1, + 10, 4, -2, 14, -10, 8, -8, 14, -4, 17, + 0, 4, 2, 0, 0, -12, 11, 8, -7, -6, + 0, -1, -3, -7, 5, -9, -1, 2, 0, 6, + -2, -2, 4, 1, 0, 1, 0, 4, -2, -3, + -1, 0, 4, 0, -4, -3, 1, 2, -3, 1, + 3, 0, -2, 1, 1, 0, -1, 1, -4, 1, + 0, -1, 2, 0, 0, -1 + } + }, + { + { + 7, 444, -78, -11, 16, -3, -3, 15, 0, 13, + 1, 18, -10, 9, -26, -11, 40, 4, 15, -20, + 33, 5, -16, -17, -43, -32, -11, -5, 5, 0, + 21, 9, -3, -5, 19, 3, -10, 8, -16, 16, + 3, -3, -6, 0, 10, 1, -14, 2, 1, 10, + 9, 1, -4, 6, -1, -9, 2, -9, 5, 8, + 2, 7, -2, -2, 3, 3, -2, 0, 3, -3, + -3, 1, -2, 3, 2, 0, -1, 3, 1, -2, + 0, 3, 3, 1, -2, -1, 1, 0, -1, -2, + 3, -1, 0, -1, -2, 0 + }, + { + 57, -684, 202, -5, -14, 15, -9, -2, -3, 12, + -18, 0, -14, -17, 7, -30, 6, -12, -34, -19, + 5, 10, 18, 18, -5, -9, -16, 7, -1, -17, + -2, -21, -9, -3, 5, -3, -14, -7, -1, 7, + 14, 2, -13, 1, 6, -11, -3, -11, -1, 2, + 11, 9, 1, -3, -5, -9, 2, 1, 5, 1, + 5, -4, 1, 1, -5, 0, 3, 1, 1, -2, + -1, -3, 2, 2, -5, 4, -2, -2, 1, 2, + 2, -2, 2, 1, 0, -4, 3, -1, 1, 0, + 0, 1, 1, -1, 0, -1 + }, + { + 49, -44, -389, 0, -44, -17, 11, -17, 4, -21, + -15, 10, -8, 3, -24, -15, 3, 9, 39, 4, + -10, 2, 1, 2, 14, -11, -9, -19, -11, -8, + 7, -9, -8, -21, -20, -6, 1, -8, -3, -17, + 3, -1, 2, 4, -4, -11, 9, 4, 8, -9, + -9, 2, 4, 2, 1, 0, 2, -3, -4, 1, + 3, 2, 0, -3, 4, 1, -1, 1, 2, 4, + 0, 0, 0, -1, -1, -1, -2, 1, -2, 1, + 1, 1, 2, -2, -2, 1, -1, 0, 1, -1, + 2, 0, 1, -1, -1, 1 + }, + { + -15, 131, 81, 32, -7, -3, 2, 1, -4, -1, + -7, -17, 13, 11, -111, 66, 76, 0, -101, 29, + -27, -22, 4, -29, 19, -20, 57, 17, -21, -27, + -10, -20, 1, -9, 14, 14, -23, 0, 13, -18, + 6, 8, -5, 1, -10, 17, 6, -2, 11, 2, + -7, 3, 2, -4, 5, -4, -3, 10, -3, -7, + -2, 3, -1, 1, -1, -1, -1, 1, 0, -3, + -3, 2, 2, 0, -2, 1, 2, 1, -2, -1, + -1, 2, -2, 0, -1, -1, 1, 1, 1, -1, + 0, 2, 1, -1, 1, 1 + }, + { + 305, -1192, -137, 84, 12, -4, -26, 11, -9, -7, + 31, -7, 12, 18, 4, 9, -13, -24, 7, 0, + 11, -9, 0, -21, 6, -9, 10, -28, 49, -28, + 9, -3, 11, -11, -14, 0, -12, 10, 8, -11, + 11, -8, 4, -5, 3, 10, -8, -2, 7, -1, + 5, 10, -7, -4, -4, 1, -7, -6, 6, 7, + 4, -1, 3, -6, -6, 1, -3, 2, 3, 0, + -2, -3, -3, 4, 2, -2, 4, -2, 1, 3, + 1, 0, 1, -4, -2, 1, 0, 0, -2, 0, + 0, 0, -1, -1, 1, 1 + }, + { + 7, 71, -35, -26, 1, 1, 6, 3, 2, 1, + -17, -9, -9, -44, 18, 33, -17, -11, 23, 28, + -68, 1, 21, 11, 29, 12, 34, -2, 14, 59, + 10, -12, -4, 5, 1, 13, -1, -7, -6, -11, + 20, -6, 3, 2, -1, 0, -11, -1, 1, 4, + 10, 0, -1, 2, 6, 2, -2, 6, -1, -3, + 2, 3, 2, 0, 2, -3, -3, -3, -1, -1, + 3, 2, -3, 0, 2, 2, 2, -1, -3, -2, + 2, -1, -2, 0, 2, 0, 0, 0, 0, -1, + -2, 1, 3, -1, 0, -1 + }, + { + -220, -1097, 139, -23, -25, 1, 19, -17, -20, 10, + 4, -8, 14, 22, 8, 10, 5, 12, -26, -4, + 9, 9, -13, -5, -8, -7, -1, 2, 4, -6, + 4, 23, 3, -6, 5, -2, 17, 13, -12, 0, + -1, -13, -10, 12, -5, -3, -8, 2, 12, -9, + 7, -1, 1, 1, 2, 5, -1, 9, 3, -1, + 0, -2, -1, -1, 2, 4, 2, -4, -1, 1, + -4, 2, 5, -1, -3, 0, 2, -1, 0, 2, + -3, 1, 1, -1, -3, 3, 1, -2, -1, 0, + 2, -2, -1, -1, 0, 0 + }, + { + 5, 46, -80, -5, -9, -3, 1, 0, 6, -8, + -13, -9, 9, -34, 11, 17, 29, 7, 2, -24, + -2, 0, -28, 18, 5, 28, 3, -6, -40, -15, + 1, -1, 17, -5, -6, 28, 3, -10, 1, 2, + -8, 7, -7, -5, 6, 4, 10, -8, -1, 14, + 5, 0, 4, 3, -4, -1, 2, -5, -3, 8, + 3, 5, 0, -1, 0, -1, 6, 1, -1, -3, + 0, -2, -1, 3, 0, 0, 2, 2, -1, 1, + -3, -2, -1, 1, 2, -1, 1, -1, 0, 2, + -2, 0, 1, -1, 0, 0 + }, + { + 564, 133, -75, -26, 0, -1, 4, -25, 21, 14, + -42, -12, -28, 41, -35, 20, 30, -15, -16, 20, + 8, -4, -19, -10, -18, 13, -8, -16, 3, -1, + 6, -8, 0, -8, -5, -16, -19, 8, 6, -22, + -8, 7, 9, 1, 4, 8, -3, -10, 0, 0, + 1, -9, -11, -3, -6, -6, 3, -2, -8, 1, + -1, -2, -2, -4, -9, 6, 7, -3, 1, 2, + -1, -1, 3, 0, 0, -4, 2, 1, 0, 0, + 0, -2, 0, -1, -2, 1, 2, 1, 1, -1, + -1, 0, 0, 2, -1, 0 + }, + { + 8, -77, 120, 7, 7, 44, -3, -21, 4, -4, + -12, -7, 21, 44, -8, -9, -16, 34, 44, -46, + -24, -8, 14, 30, -1, -16, 22, 0, -18, 8, + -36, 0, 16, 1, 2, 3, 19, -4, -9, -8, + 1, 1, -3, -5, 18, -10, 1, -5, -5, 5, + 3, -2, 1, -6, -11, 3, 4, -1, 2, 1, + -1, -1, -4, 0, -3, 3, 6, 4, 4, -6, + -1, -1, -2, 2, -1, -1, -1, 0, -1, -2, + 0, 2, 1, 0, 1, 0, -2, 1, -1, 2, + -1, 0, 0, 1, 1, -1 + }, + { + 110, -60, -117, -61, 22, -5, -22, -32, 8, 17, + -5, -4, 3, 15, -25, 9, -15, 5, -12, 12, + -11, 25, -1, -1, -6, 7, -2, -4, 3, 10, + -9, -20, -1, 13, -10, -25, 9, -4, 0, 8, + 11, -11, -4, -3, 4, 2, -3, 1, -4, 0, + -1, -2, 1, -9, 2, 0, 1, 6, -3, -3, + -2, 0, -1, 2, 5, -2, -1, -2, 1, 1, + -1, 1, 3, 3, -1, 1, -2, -4, 1, -2, + 1, 1, -3, 4, -1, 3, -1, 0, -1, 0, + 1, -1, -2, 0, 2, 0 + }, + { + -3, -128, 5, -26, 11, -17, -8, 0, 11, -14, + -6, -14, -3, 41, -32, -28, -14, 21, -31, 2, + -21, 77, 2, 24, -28, -18, 1, 3, -12, 10, + -8, 13, -12, 13, -12, -5, -5, 15, -12, 7, + -4, -4, 18, -1, -4, 8, -5, 8, 0, 5, + 0, -4, 5, -2, 0, -4, -3, -1, 5, -1, + 6, 1, -5, -3, 2, 9, -3, 2, 1, 2, + 1, 0, 2, 1, 1, 1, -1, -3, 0, -1, + 2, -1, -2, 1, 1, 0, -1, 1, 1, 1, + 1, 1, -1, -1, 1, 0 + }, + { + -90, 283, 5, -5, -7, -15, -93, 1, 4, 26, + 11, -8, 11, 55, -6, -17, 19, 12, -3, 26, + -11, -5, -8, -4, -6, 28, -5, 8, 8, -9, + -9, -7, -9, -3, 18, 6, -14, -2, 15, -9, + -13, -10, -1, -10, -5, -5, -4, -11, 4, 7, + 11, 5, -5, 7, -3, -2, 0, -5, -4, 8, + 2, -3, 0, 4, -5, -4, -2, 1, 4, 0, + -5, 1, 5, 1, 0, 0, -1, 4, 0, 2, + -4, -1, 1, 3, 1, -4, -2, 0, -1, 0, + 1, 0, 2, 0, 1, 1 + }, + { + 12, 19, 34, 4, -4, -4, -8, 16, -25, -19, + 4, 1, 47, -129, 71, -113, 29, 21, -1, -25, + 3, 0, 10, 32, -14, 34, -9, 1, 36, -14, + 5, 1, 2, 8, -14, 9, 4, -4, 10, 0, + 6, 4, 3, 9, 2, -7, 6, -6, 2, -5, + 8, -3, -8, -7, 0, -2, -2, 2, 0, 1, + 7, -3, -4, 1, 2, -6, 3, 5, -2, -1, + -2, 0, 3, -1, 0, 2, -4, 3, 1, 2, + 2, -3, -1, 0, -2, 0, 1, 3, -2, 1, + 2, 0, -2, 1, 1, -2 + }, + { + -3, -72, 65, 29, 46, 121, -13, 20, -8, -23, + -21, -16, 1, -3, 218, 15, -30, 27, 7, -12, + -7, 19, 6, 9, -15, -16, 1, 84, 16, 2, + 2, 5, 1, -1, -4, 1, -2, 3, -3, 14, + 15, 2, -6, -3, 10, -9, -5, 6, 4, -6, + -1, 2, 2, -4, 0, -8, -8, 1, 0, 5, + -1, -4, 1, 1, 1, -1, 2, 1, -3, 0, + -4, -1, 4, 4, -3, -3, -1, 2, -2, -1, + 1, 3, 0, -1, 1, 0, -1, 3, -3, -1, + 0, -1, 1, 1, 1, 0 + } + }, + { + { + -8, 374, -61, -15, -4, 8, -11, -11, 9, 5, + 8, -12, 2, -4, -119, -25, -20, 4, 36, -8, + -2, -10, 9, 8, -23, 10, 18, 17, 20, -7, + 17, -33, 37, -4, -12, -19, -7, 30, -18, 4, + -8, 7, -1, -8, -2, 12, -1, -1, -3, 1, + 6, 7, 1, -2, 7, 3, -1, -1, -4, -2, + -4, 4, 6, -1, -1, 3, 4, -1, -2, 4, + 0, -1, 1, -2, 1, 1, 1, -2, 0, 1, + -1, -1, -1, 2, 2, 1, -1, -1, 0, 0, + -2, 1, -1, 1, 0, -1 + }, + { + -3, -864, 32, 25, -26, -13, 23, -2, -30, 19, + -7, -7, 14, 3, 72, 28, -11, 8, 38, -13, + 1, -12, -15, -4, -12, 6, -7, -7, -7, -8, + 7, -7, 16, 3, -13, 6, 0, 7, 11, -4, + -18, -3, -1, 5, -2, 9, -15, 4, -9, -7, + 7, -8, 5, 2, 1, 2, -6, 6, 3, 0, + 2, 1, 2, 6, 0, -2, -3, 0, 1, 5, + 1, 0, -3, 1, 1, -5, 2, 1, -1, -3, + 1, 2, -2, 0, 2, 3, -5, 2, -1, 1, + 0, -1, 0, 1, -1, 0 + }, + { + -28, 604, 45, -26, 75, 15, 4, -3, 3, -5, + -24, 4, -3, 9, 2, 2, -2, -18, 40, 18, + 21, 3, 14, -6, -18, -9, 10, 6, 3, -12, + -8, -10, 1, 16, -3, -3, 11, -10, 0, -4, + -4, 9, -2, 6, 12, 7, -8, -14, -1, 9, + 6, -6, -7, 3, 2, -6, -2, 7, 1, -1, + -6, -2, 8, 1, -2, 3, -1, 3, -2, 1, + 3, 0, 0, 0, 2, -1, -1, 0, 0, -1, + -2, 0, 1, 4, -1, -1, 1, -1, 0, 0, + -2, 0, 0, 2, 0, 0 + }, + { + 21, 69, -48, 1, 9, -3, -4, 4, 5, 3, + -2, -4, 2, -16, -207, -78, -47, -14, -76, -18, + 13, 12, 19, 1, 7, -40, -15, 30, 10, -12, + -9, -12, 15, -4, -2, -24, 10, 0, -2, 5, + 1, 5, 3, 12, -13, -4, 11, -1, -1, 4, + 4, -8, 2, -3, 1, 6, 1, 1, 7, 0, + -4, -1, 2, -5, -3, 3, 1, 0, 0, 4, + 3, -4, -3, -1, 3, -3, -1, 1, 3, 1, + -1, -1, 2, -1, 2, 0, -3, -1, 1, 1, + -1, -2, 1, 1, 0, 1 + }, + { + -145, -1558, 27, 55, -11, 3, -12, 15, 6, -16, + -9, 26, -3, -31, -4, -14, 21, -11, -5, 1, + -7, -1, 12, 3, -32, 9, 8, -65, 11, -22, + -2, -6, -2, 3, 6, 12, 25, -21, -13, 9, + 3, -12, -4, 6, -7, -8, 4, -3, -4, 4, + 0, -1, 10, 0, -2, -2, 9, -2, -2, -6, + 6, 0, 2, 2, 0, -1, 2, -1, -1, 1, + 1, 2, -2, -4, 1, 1, -1, 4, -1, 1, + 1, 1, -1, 3, -2, -1, 1, 1, 1, -2, + 1, 0, 0, 0, -2, 0 + }, + { + -16, -8, 65, -1, 1, -4, -4, 5, -1, 6, + 2, -4, 22, -6, -25, 7, 68, -32, -19, 78, + -6, -5, -29, 10, 20, -56, 21, 11, -36, 31, + 13, 7, -8, 1, -1, 2, -9, 10, 13, -7, + -7, 10, 2, -6, 4, 5, 7, 2, 0, -6, + 1, 1, 5, -4, 0, 6, -2, 0, 3, 0, + 2, 0, 4, 2, -2, 1, 0, -3, 0, -1, + -6, 1, 2, 0, -2, 1, 0, 2, 2, 1, + -3, 3, 0, 0, -2, 0, 1, 0, 0, 1, + 1, -2, -1, 1, 1, 1 + }, + { + 443, -473, -132, 28, -5, 12, 14, 9, 12, 6, + -4, 3, 2, 10, -18, 39, -4, 12, 27, -15, + -5, -14, -15, -3, 7, 3, -10, 34, 14, -9, + -12, 11, 3, -17, 11, -2, 12, 17, -1, 1, + -1, 0, -1, 3, 1, -3, 6, -7, 2, -3, + -4, 5, -9, 0, -6, -3, -4, 2, 0, 2, + 3, 0, 0, -1, -1, -1, 2, 5, -3, -1, + 5, -3, -5, 4, 2, -1, -2, 2, -1, -2, + 3, -1, -1, 3, 0, -4, 1, 1, 1, -2, + -1, 2, -1, 1, -1, 0 + }, + { + -19, 0, 59, 4, 9, -1, 0, 4, -8, 2, + 4, -7, -21, -22, 47, -78, -20, -42, -10, 1, + -16, -59, 11, 16, -16, 54, 4, 10, -9, -5, + 6, -11, -6, 7, -10, 6, 4, 3, 0, 5, + -8, -2, 3, 6, -7, -4, -2, 15, -12, -11, + 5, 0, 4, -4, 4, 0, -1, 5, 6, -4, + 1, -2, 6, -2, 3, -3, -4, 0, 4, -3, + 1, 1, -1, -1, 0, 2, -2, 2, 2, 0, + 3, -1, -2, -1, -2, 1, 0, 2, -1, -1, + 2, -1, 1, 0, 0, 0 + }, + { + -493, -1061, -10, -36, 33, 2, 30, 11, -30, 6, + 38, -3, -24, -26, -2, -3, 43, -2, -17, 21, + 4, 13, -35, 4, 8, 4, 8, 15, 4, -6, + -16, 10, 8, 9, -6, -3, -7, -18, 1, -3, + -11, 7, 16, -11, 0, -11, -6, 8, -2, -4, + 1, 11, -4, -5, 6, 0, -1, -3, 5, 2, + -4, 4, -1, 2, 1, -6, -3, 1, 0, 0, + 2, -4, -2, 0, -1, 4, -5, 1, 0, 2, + -2, 1, 0, 0, 0, -2, -2, 0, 1, 1, + 1, -1, 0, -2, 2, 0 + }, + { + -9, -161, 4, 21, -20, -24, 53, -6, -26, -23, + 1, 21, -26, -19, -24, 20, -38, -22, 25, 51, + -3, -14, -25, -9, 8, 4, -2, -9, 2, 13, + 12, -20, -6, 4, 6, -16, 2, 4, 10, -1, + 2, -1, 7, -3, -9, 8, 2, 7, -9, -12, + 9, 5, 1, 6, 5, -13, -2, -4, -2, 3, + 3, 0, 2, -4, 0, -5, -4, 2, 2, 5, + -1, 1, 1, -3, 1, 3, -1, -1, 0, -1, + -2, -2, 0, 0, 0, 2, 0, -1, 0, -1, + 2, -1, 1, 0, 0, 1 + }, + { + -73, -102, 106, -23, -8, -73, 117, -10, -34, -18, + 1, -11, -2, -1, 3, 16, -18, 7, 4, 3, + 8, -16, 8, -7, 7, 9, 2, 0, -17, 6, + 9, 14, -3, -1, -3, 7, -19, 1, 0, -19, + 11, 16, -5, 4, -1, -8, -2, 0, 9, -3, + -2, -4, 1, 4, 2, 1, -7, -7, 7, 0, + -3, 1, 1, -2, -2, 3, -2, -1, -1, 3, + -1, 0, -2, 0, 3, -1, 3, 1, -2, 1, + -2, 0, 2, -3, 1, -2, 3, -1, 2, 0, + -1, 1, 1, -1, -1, 1 + }, + { + 1, -76, 2, -12, 3, 19, -5, -19, 2, -16, + 4, 7, -61, -39, 61, 20, -32, -2, -5, 25, + -1, 29, 8, -3, 22, 13, -34, -8, -1, -24, + 50, -18, -2, 4, -3, 2, -1, -12, 7, 1, + 0, -5, -5, 0, 0, -2, -4, -3, 1, 4, + 2, 2, -8, -5, 4, 2, 1, -2, -6, -2, + -5, 3, 1, 1, -8, -4, 6, -3, 3, -1, + -2, 2, -1, 1, 1, -2, 2, 2, 0, 1, + -2, 1, 1, -2, 0, 1, -1, -1, -1, 0, + 0, -1, 1, 1, -1, 0 + }, + { + 28, 526, -140, 53, -16, 27, 53, 27, 10, -24, + 10, 33, -26, 36, -7, 2, -16, 2, 14, -17, + 42, -3, 9, -10, -13, 23, 14, 5, 5, 5, + -18, 4, 5, 5, -4, -1, 1, -8, -11, 14, + 13, 3, -6, 6, -13, -3, -11, 4, -11, 3, + 1, 1, -1, -2, 2, 5, 4, 3, -2, -8, + 3, -2, 0, -1, 0, -1, -2, -4, -4, 3, + 3, -4, -2, 3, 3, 2, 0, -2, 2, 0, + 5, -2, -2, -1, 1, 4, 0, -3, -1, -1, + -1, -1, -2, 2, 0, 1 + }, + { + -8, -12, -37, -14, 1, 0, 6, 5, -6, 6, + -12, 1, -38, -135, 519, -19, 40, 32, -23, -6, + 33, 29, -29, -5, 1, 7, 45, -18, 25, -1, + -7, -7, -6, -16, 9, 2, -3, -5, -8, 7, + -14, 2, 4, 3, 5, 2, -9, -1, 1, 1, + -6, 7, 4, -3, -1, 0, -4, -1, 0, -3, + -3, 9, 0, 1, 2, 6, -5, 1, 3, 0, + 3, 1, -2, 1, 0, 2, 3, -5, 1, -2, + -1, 4, -1, -1, 1, -2, -2, -2, 3, -2, + -1, 2, 2, -1, 0, 2 + }, + { + 50, -2, -25, -43, -17, 45, -2, 6, 13, 13, + -40, 23, 20, -63, 111, 1, -14, -11, -4, 22, + -3, -1, -6, 5, 10, -7, -22, 27, -12, 13, + -8, 2, 15, -9, -3, 4, 7, -13, 3, 1, + 5, 11, 4, 1, 4, 6, -13, -12, 2, 2, + -1, -2, 5, 4, -5, -1, -5, -3, 3, 0, + 0, 2, -1, -5, 1, -1, -1, 0, -1, 1, + 1, 1, -5, 0, 4, 3, -1, -1, 0, 1, + -1, -1, 1, -1, -1, 0, 0, -1, 4, -2, + 0, 0, -1, 0, 0, 0 + } + }, + { + { + -5, 130, 117, 1, 5, 4, -7, -11, 0, 8, + -4, -22, 1, 26, -140, -8, -45, 6, 9, 20, + 6, -34, -2, 31, -24, 32, 20, 10, 15, -22, + 4, -15, 22, 5, -33, -9, 7, 24, -3, 1, + -6, 2, 3, -3, -5, 3, 9, 1, -4, -2, + 4, 6, 1, -2, 1, 5, 0, 5, -2, -6, + -2, -3, 5, 2, -1, 0, 2, 0, -4, 3, + 3, 0, 0, -3, -1, 2, 1, -2, -1, 1, + -1, -2, -3, 0, 2, 1, -1, 0, 0, 1, + -2, 1, 0, 0, 1, 0 + }, + { + -15, -1039, 210, 70, -26, -13, 30, 2, -1, 3, + -9, -13, 16, 19, 61, 49, -5, 5, 45, -5, + 6, -18, -8, -23, 3, -3, -2, -3, -8, -14, + -6, 10, 8, 10, -17, 8, 10, 8, 10, -4, + -14, -11, 5, 6, -5, 9, -9, 4, 1, -4, + -1, -9, -4, 1, -2, 7, -6, 2, 2, 0, + -2, 3, 2, 3, 1, -1, -2, -1, -2, 4, + 1, 2, -4, -1, 4, -5, 1, 2, -1, -3, + -1, 1, -1, -1, 0, 5, -4, 1, 0, 0, + 0, 0, -1, 1, -1, 1 + }, + { + 45, 1030, -190, -91, 17, 25, -12, 5, -2, 10, + -13, 0, 20, -15, 12, 10, 4, 4, 13, 4, + 32, -4, 7, -1, -35, -4, 4, 14, 8, -2, + -12, -4, 4, 9, 4, -3, 8, 1, -8, 0, + -2, -4, 3, -1, 5, 11, -7, -9, -8, 4, + 9, 0, -5, 1, 1, -5, -5, 2, 1, 0, + -5, -5, 3, 2, -5, 1, -1, 1, 0, -1, + 1, 0, 1, 0, 1, -1, 1, 0, 1, 0, + -1, -1, -1, 3, 1, -2, 2, 0, -1, 1, + -2, 0, -1, 1, 0, 0 + }, + { + -15, 45, 15, -17, 9, 5, -6, -2, 7, 2, + 0, 4, 2, -37, -251, 17, -48, -87, -30, 10, + 9, 12, 27, -10, 8, 6, -67, 30, 5, -19, + 9, -7, 6, -1, -7, -25, 12, 2, -13, 9, + -3, 1, 10, 4, 2, -13, 0, 2, -5, 3, + 7, -5, -2, 0, -5, 6, 5, -2, 5, 5, + 0, -2, 3, -4, -4, 3, 1, -1, -2, 4, + 5, -2, -3, 0, 3, -2, -2, -1, 2, 2, + 0, -3, 2, 0, 1, 2, -2, -1, -1, 1, + 0, -2, -1, 1, -1, 0 + }, + { + -52, -1609, -35, 32, 23, -5, 9, 5, 10, 0, + -24, 10, 8, -57, 9, -16, 28, -17, 8, -1, + -1, -3, 0, 13, -22, 6, 9, -50, -18, -6, + -17, -7, -5, 9, 4, 18, 31, -8, -20, 16, + 4, -4, -9, 8, -2, -18, 3, 4, -7, -2, + -1, -7, 8, 4, -3, -3, 12, 2, -3, -5, + 3, 1, 1, 1, 3, -3, 2, 0, 0, 0, + 2, 3, 2, -3, -1, 2, -3, 3, 0, -1, + 0, 0, -1, 2, 0, -1, 1, 1, 2, -1, + 1, 0, 0, 1, -1, -1 + }, + { + -8, -25, 28, 15, -1, 0, -6, 1, -2, -1, + 9, 5, 21, -1, 41, -8, 28, 3, -18, 105, + -37, 3, -72, 80, 4, -42, -6, 22, -7, -28, + 3, 23, 1, -4, -2, -1, -7, 7, 16, 8, + -23, 9, 3, -6, 3, 2, 9, 5, 0, -6, + -6, 5, 3, 0, -1, 2, 1, -1, 4, 0, + 3, 0, 3, 3, -1, 1, 1, -1, 2, 0, + -4, -3, 2, 1, -2, -2, -2, 0, 2, 2, + -3, 2, 1, 1, -2, 0, 1, 0, -1, 0, + 2, -1, -2, 1, 0, 1 + }, + { + -508, 530, 118, 50, -19, 7, -1, 28, -5, 1, + -3, 17, -2, 10, -19, 25, 1, 4, 28, 2, + -2, -14, -7, -5, 10, -1, -6, 29, 15, -2, + -1, -4, -8, -7, -4, 5, 12, 10, 0, -2, + -1, -2, 15, -7, 9, -3, 7, 1, -1, 1, + -5, 2, -6, -2, -3, -5, -6, -3, -2, 0, + 2, 0, 0, 0, -2, -3, -3, 4, 0, -1, + 5, -1, -6, 1, 3, 0, -3, 1, 0, -1, + 3, 0, -2, 1, 2, -4, -1, 1, 2, 0, + -2, 2, 1, 1, 0, -1 + }, + { + -8, -40, 40, 8, 6, 4, -3, 3, -8, 0, + 13, 8, -8, -64, 39, -47, 9, 12, -6, 25, + -24, -17, 48, -21, -7, 27, 9, -18, 15, 5, + 11, -7, -11, 0, 3, -14, 5, 2, 3, 0, + -2, 1, 3, 4, -2, -4, -4, 12, -3, -12, + 0, -1, -1, -3, -3, 3, -6, 6, 9, -6, + 0, -2, 3, -2, 3, 3, -5, -1, 2, 1, + 0, 1, 1, -1, -1, 1, -2, -1, 2, -2, + 3, 2, 0, -1, -2, 1, -1, 1, 0, -2, + 2, 0, -1, 0, 0, 0 + }, + { + 321, -2068, -46, -5, -13, -2, 15, 25, -25, -13, + 38, 11, 9, -10, 10, -24, -2, 22, 1, 4, + -12, 15, -32, 5, 8, 5, 3, 20, -7, 2, + -15, 13, 7, 6, -1, -5, -2, -14, -5, 13, + -5, -1, 9, -6, -4, -12, -11, 10, 0, 3, + -6, 3, 3, -2, 4, 6, -3, -1, 5, 4, + 0, 1, 1, 2, 6, -4, -7, 0, -1, -1, + 2, 0, -3, 0, -1, 3, -4, 0, 0, 1, + -1, 1, 0, 0, 1, -1, -2, 0, 0, 1, + 2, -1, 1, -2, 1, 0 + }, + { + 18, -134, -69, 15, -8, -41, 26, 17, -26, -18, + -3, 28, -15, -12, -40, 3, -2, -33, -39, 63, + 9, 0, -12, -21, 4, -1, -20, -4, 12, 12, + 33, -12, -15, -3, -2, -13, -10, -2, 6, -1, + -4, -5, 6, 5, -14, 8, 1, 8, -4, -9, + 1, 3, -3, 7, 10, -9, -4, -2, -3, 1, + 4, 1, 4, -2, 0, -1, -3, -2, -4, 5, + 1, 0, 4, -3, 1, 2, 0, 0, 1, 1, + -1, -2, -1, -1, -1, 1, 1, -1, 0, -1, + 1, -1, 0, 0, -1, 1 + }, + { + 41, -169, 50, 29, -24, -31, 38, 33, -40, -13, + 10, -7, -3, -15, 7, 20, -25, 2, 7, -1, + -4, -15, 4, -4, 2, 3, 2, 1, -10, -4, + 8, 12, 6, -8, -8, 16, -14, -3, 1, -14, + -3, 13, 4, 8, 1, -6, 0, -1, 8, -5, + 0, -3, -2, 7, 3, 2, -2, -8, 4, 3, + 0, -1, 2, 1, -4, 2, 0, 0, -2, 2, + 0, 0, -3, -2, 1, -1, 2, 2, -2, 1, + -1, -1, 3, -4, 1, -2, 0, 0, 1, 0, + -2, 1, 1, 0, -2, 0 + }, + { + 5, -32, -38, -5, -7, 17, 0, -12, -9, -11, + -3, 19, -48, -17, 63, -12, -13, -18, -6, 4, + 27, 0, -7, -24, 9, 46, -18, -37, 16, -26, + 35, -4, 9, 9, -3, 5, -10, -17, 7, -4, + -3, 2, -9, -6, 1, -7, 0, -3, 0, -2, + -2, 6, -8, -4, 3, 3, 3, 3, -1, 0, + -5, 2, 2, 2, -3, -7, 6, -1, 2, 0, + -3, 1, -2, -1, -1, -2, 0, 3, 1, 1, + -1, 1, 1, 0, 0, 1, 0, -1, -1, 0, + -1, -1, 0, 1, -1, -1 + }, + { + 109, 508, -132, -8, -5, -4, 59, 22, 28, -31, + -4, 25, 21, 3, -16, 12, -13, -2, 13, -30, + 31, -1, 6, -2, 4, -11, 2, 8, -13, 10, + -7, 1, -1, 10, -7, -4, 5, -5, -15, 7, + 15, 13, -2, 14, -3, 7, -6, 8, -7, -1, + -2, -2, 3, -6, -2, 2, 0, 5, 2, -7, + 0, 0, 1, -4, 1, 3, 0, -3, -4, -1, + 4, -1, -4, 0, 2, 2, 2, -3, 0, -2, + 4, 0, -2, -2, -1, 3, 3, -1, 1, 0, + -1, -1, -3, 0, -1, 0 + }, + { + 16, -1, -63, 0, -6, 2, 7, -6, -2, 8, + -2, -3, -22, 56, 159, 104, -17, 3, -9, 3, + 22, 16, -24, -26, -6, 11, 37, -26, 1, 23, + -5, -2, -14, -7, 22, -8, 3, 1, -11, 8, + -11, -2, 0, -1, 0, 6, -7, -2, 0, 5, + -10, 4, 6, 1, -1, -1, -2, -1, 0, -1, + -6, 4, 2, 1, -1, 6, -3, -3, 2, 0, + 3, 2, -3, 2, 0, -1, 4, -4, 0, -1, + -3, 4, 1, -1, 2, 0, -1, -3, 3, -1, + -2, 1, 2, -1, -1, 2 + }, + { + -73, 136, 30, -57, -21, -56, 28, 2, 12, 20, + -13, -12, 7, 56, -33, -12, -8, -29, -20, 21, + 3, -7, -4, -6, 10, 8, -20, 3, -5, 4, + 6, -8, 11, 2, 3, 2, 0, -6, 6, -6, + 1, 11, 8, 3, -5, 13, -3, -12, -6, -3, + 0, 0, 2, 3, -4, 1, 0, -4, 3, -1, + 1, 5, -1, -4, -2, 3, -1, 1, 1, 0, + 2, 2, -5, -5, 2, 3, 1, -1, 0, 1, + 1, -2, 1, 0, -1, 0, 0, -2, 3, 0, + -1, 1, -1, -1, -1, 0 + } + }, + { + { + 12, -53, -62, -10, 6, -5, -4, 5, -15, 12, + -15, 3, -14, -39, -111, 45, 46, 35, -51, -34, + 70, 16, -3, 18, -25, 24, 1, -19, 6, 2, + -9, 9, -21, -3, -25, 2, 5, 7, 7, 9, + 2, -9, -1, 6, 6, -8, -3, 1, 0, 2, + 1, -5, -6, 5, -7, -4, 2, -2, 4, 1, + 3, 0, -3, 2, 2, -1, -3, 1, 2, -3, + -1, 3, -1, 2, -2, 2, 0, 3, -1, -3, + -1, 2, 0, -1, -3, -2, 2, 1, -1, 0, + 3, -1, 1, -1, -1, 1 + }, + { + 18, -1248, 81, 53, 7, 10, -10, -10, 31, 2, + -12, 5, -7, 6, 18, 13, 20, -22, -17, 3, + 9, -14, 10, -1, 15, -10, -15, -2, 5, -10, + -7, 7, -24, -4, 10, 12, 2, -4, 0, 3, + 9, -7, -2, 2, 2, -9, 5, -9, 15, 10, + -1, 5, -9, -5, -3, 4, 2, -6, 4, 1, + 2, -2, 0, -3, -4, 1, 2, 3, -2, -3, + 0, -1, 1, -1, -2, 4, -2, 0, 1, 2, + 0, -2, 2, 0, -2, -2, 4, -2, 1, -1, + 0, 1, 0, -1, 1, 0 + }, + { + -45, 1001, 74, 40, -54, -3, -7, -11, -1, -1, + -7, -2, -6, 6, 32, -6, 10, -20, -45, -26, + -20, -3, 3, 7, -5, 6, -1, -2, -3, -1, + 6, 12, 2, -16, 4, -2, -6, 7, -12, -10, + 14, -12, 4, 1, -11, -9, 13, 13, 1, -15, + -9, 6, 3, 0, 1, 2, 2, -4, -2, 2, + 6, 1, -3, -1, -1, 0, 0, -1, 4, 0, + -2, 0, 1, 0, -1, 0, 0, -1, -1, 2, + 1, 0, 1, -3, 0, 1, -1, 2, 0, 0, + 2, 0, 1, -1, 0, 0 + }, + { + 11, -27, -31, 3, -13, 3, 0, -1, -1, -6, + -5, -11, 12, -3, -276, 59, 63, -17, 8, 36, + 15, -1, -39, -65, 21, 5, -34, 32, -4, -22, + 16, -12, -1, -5, 5, 11, -20, 7, 3, -8, + 7, 1, 0, -1, 11, 3, -7, 4, 3, -4, + -6, 5, -4, -1, 2, -1, 1, 5, -2, 2, + 3, 2, 0, 3, -1, -2, -2, 0, -2, -3, + -3, 4, 2, 2, -2, 3, 2, 0, -2, 0, + 0, 1, -2, 0, -2, 1, 2, 2, -1, -1, + 1, 1, -1, -1, 1, -1 + }, + { + 235, -1388, -110, 9, -19, -4, 9, 2, -7, 15, + 32, -27, 1, -34, -2, -4, -2, -41, 6, -9, + 8, -14, -14, -28, 20, -1, -8, -45, -5, -11, + -8, -7, 5, 2, -7, -5, -7, 24, -7, -9, + 9, 4, 0, -8, 4, 2, -3, 8, -1, -2, + 12, -3, -8, 7, 1, 4, -3, -1, 0, 3, + 0, -1, 3, -3, -1, 0, -3, -2, 3, -1, + -3, -3, 2, 5, 1, 0, 2, -4, 0, 1, + 0, -1, 0, -3, 1, 1, 0, 0, -1, 1, + -1, 0, 0, 0, 1, 1 + }, + { + 16, 49, -68, 9, 1, 4, 3, -1, 0, -7, + -3, 1, -15, -9, 160, -14, -82, 57, -39, 90, + -3, 5, -54, 41, -14, 18, -6, 0, 30, -29, + -14, 18, 21, 8, -6, 6, 8, -7, 6, 9, + 6, -8, 2, 5, 0, -2, -4, 3, 0, 1, + 1, 3, -7, 4, 5, -3, -1, 1, 0, -3, + 3, 2, -2, -1, 3, -2, 0, 0, 1, 2, + 6, -2, -3, 1, 2, 0, 1, -3, -2, -1, + 2, -3, -1, 1, 2, 0, 0, 1, 0, -2, + -1, 2, 2, -1, -1, -1 + }, + { + 398, 1528, -51, 24, 13, -9, -7, -8, -40, 5, + 6, 6, -3, 1, -6, 5, 4, -8, -23, 16, + 14, 13, -2, -1, 12, -5, -4, 0, 17, 5, + 14, 1, -14, 13, -9, -10, -8, 3, 10, -4, + 1, -8, 3, -4, 2, -2, -5, 9, 7, -9, + -1, -9, 3, -4, 2, 0, -6, 0, 1, -2, + -3, -1, 0, 0, 2, 3, -2, -5, 3, 2, + -3, 2, 4, -3, -2, 1, 1, -2, 0, 1, + -3, 2, 0, -3, -1, 4, -1, -2, 0, 1, + 1, -2, 1, 0, 0, 0 + }, + { + 19, 47, -60, 3, -10, 3, 1, 0, 1, -11, + -3, 3, 14, -69, -42, 5, 57, 50, -4, 26, + 14, 51, 8, -57, -21, -37, 18, -10, 14, 14, + -2, -9, 9, -8, 1, -3, -4, -11, 2, -11, + 1, 10, -4, -5, 8, 0, 4, -18, 7, 11, + -8, -3, 1, 6, -11, 0, -2, -4, 1, 7, + 1, 3, -4, -3, -2, 4, 3, -1, -2, 3, + 0, 0, 3, 3, -2, -1, 2, -2, -2, -2, + -3, 1, 1, 0, 2, 0, 1, -2, 1, 1, + -2, 1, 0, 0, 0, 0 + }, + { + -65, -2658, 29, 51, 9, -9, -14, -10, 28, -1, + -33, 3, 9, 53, -6, 33, -27, -8, 11, 4, + -11, -12, -21, 3, -8, 12, -9, 4, 3, 21, + 19, -8, -5, -1, 3, 2, 7, 21, 17, -5, + 9, -4, -7, 1, -5, 20, 7, -4, -4, 2, + -5, -10, 5, 2, -5, 3, 5, 4, -5, 2, + 4, -2, 4, -2, -4, 7, 2, -4, 0, 0, + -1, 2, 2, -1, -1, -4, 3, 0, 1, -2, + 1, -1, 0, 0, 0, 2, 2, 0, -1, -2, + -1, 0, 0, 2, -1, 1 + }, + { + -21, -55, 59, -30, 18, 19, -41, 3, 5, 9, + -14, -14, -3, 17, -10, -4, 33, 33, -35, -57, + -24, 35, 45, -1, -10, -15, 3, 5, -6, 17, + 0, 21, 4, -11, 1, 5, 10, -5, -15, -6, + -5, -2, -2, -3, 8, -9, 0, -3, 4, 10, + -6, -3, -3, -6, -4, 8, 2, 2, 1, -2, + -4, -2, -1, 4, -3, 4, 5, 0, -2, -6, + 2, -2, 0, 3, -1, -2, 1, 1, 0, 0, + 2, 2, 1, -1, 0, -1, -1, 1, 0, 1, + -1, 1, 0, 0, 0, -1 + }, + { + -2, -173, 127, 88, 25, 76, -87, 14, -5, 8, + 5, 11, 7, -13, -17, 26, -18, -7, -10, 17, + -15, 25, -12, 1, -17, -5, 1, -2, 10, -3, + -1, -15, 1, 6, 5, -6, 14, -9, -8, 12, + -11, -21, 5, 1, 8, 4, 2, 1, -6, 0, + 2, -2, -2, -5, 0, -1, 5, 7, -6, 1, + 3, -2, -3, 2, 2, -4, 1, 1, 2, -1, + 1, 1, 2, 0, -4, 1, -2, -2, 2, -1, + 2, 0, -1, 3, -2, 2, -3, 1, -2, 1, + 1, -1, -1, 1, 2, -1 + }, + { + -6, -25, 19, -3, 3, -15, 5, 8, -1, 1, + -6, 1, 35, 3, -1, 58, 29, 20, -15, -24, + -38, 12, -7, 10, -41, 8, 15, -38, 0, 1, + -41, 14, -3, 21, -3, 1, -15, 7, -9, 1, + -10, 3, 8, -8, -2, -2, -1, 7, -1, 1, + -6, 1, 4, -3, -5, -8, -5, -1, 8, 3, + 7, -1, -3, -3, 4, 4, -4, 4, 0, 3, + 0, -1, 1, 0, -1, 1, -3, -2, 1, -2, + 2, -1, -2, 1, 0, 0, 0, 1, 1, 0, + 1, 1, -1, -1, 1, 0 + }, + { + -209, 72, 70, -34, 25, 5, -37, -9, 2, 11, + -1, -12, 11, -39, -18, -9, 21, -1, -12, 2, + -26, 7, -3, 4, 12, -5, -15, 15, -7, 7, + 11, -6, -10, 7, 8, -1, -7, 0, 10, -13, + -5, 6, 3, 3, 5, 5, 4, 0, 13, 3, + 1, 1, 5, 4, -8, -4, -5, -1, 0, 6, + -1, 2, 1, 0, -3, 0, 1, 1, 4, -3, + -3, 4, 2, -2, -2, 0, 1, 2, -2, 0, + -5, 1, 2, 1, -1, -4, 0, 2, 0, 0, + 1, 1, 1, -2, 0, -1 + }, + { + -20, -5, 25, 23, -2, -1, -7, 7, -6, -6, + 10, -23, 34, 26, -462, -52, -18, -45, -2, 19, + 14, -17, -2, -10, -28, 26, -14, -13, -16, -2, + -5, -4, -12, 17, -5, -8, 12, 0, -1, -1, + 12, 0, -7, -1, -9, -6, 11, -1, 4, 3, + 5, -5, -3, 0, 2, -3, -1, 2, 0, 2, + 4, -8, -3, 1, -1, -3, 5, 0, -4, 0, + -3, -1, 2, -1, 1, -1, -4, 4, -1, 3, + 0, -3, 1, 0, -1, 1, 2, 2, -2, 2, + 1, -2, -2, 1, 0, -2 + }, + { + 69, 229, 10, -27, 20, -27, -24, 11, -12, -2, + 48, -14, -14, -4, -68, 20, -10, -7, -13, -4, + -5, 2, 7, -3, -29, 6, 23, 24, -7, -11, + 6, -5, 2, 8, -1, -7, -6, 17, 3, 4, + 5, -2, -2, 1, 2, 0, 6, 9, 0, -5, + 9, 10, -1, -8, 1, -5, 0, 4, -2, 1, + 0, -2, -1, 2, -1, 2, 2, 0, -2, 0, + -1, 1, 3, 0, -3, -2, 1, 2, 0, -1, + 2, 1, -2, 0, 1, 0, -1, 2, -4, 0, + 0, -1, 1, 0, 0, -1 + } + } +}; + +const Word16 rightBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]= { -278,1694,2518,1214,519,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, + { + { + -124, 1167, -1129, 1325, -957, 588, 392, 273, -659, -205, + 139, -356, 62, 608, 535, -979, 402, -177, 643, -378, + 154, -168, 648, -612, 243, -662, 354, -203, 109, 40, + -122, 423, -273, -124, -9, 46, 424, -799, 257, -351, + 406, 569, -476, -146, -60, -34, 23, 358, -116, 111, + -182, 79, -65, 117, -53, -71, -159, 121, -34, 304, + -86, -112, 37, 53, 10, 2, 89, -39, -126, -176, + 103, -53, 11, 57, -101, 127, -120, 93, 18, 28, + 22, 10, 16, 28, -106, 9, -67, 101, -71, -95, + 77, -2, 17, -67, 20, 0 + }, + { + 497, -1537, 782, 1853, -610, 597, -206, 191, -577, 28, + 180, -823, 578, 158, 441, -431, -397, -88, 821, -674, + 268, -1, -202, -229, 521, -154, -374, 79, 283, -451, + 848, -548, 61, 22, -98, 627, -77, -251, -278, -174, + 587, -162, -184, -152, 393, -298, 129, 49, 84, -35, + 30, -58, -185, 191, -235, 106, -36, 99, -90, -15, + 163, 66, -247, 269, 28, 2, 98, -121, -96, 10, + -125, -10, 43, 27, -46, 71, 21, 30, 156, -84, + 34, 53, -20, 22, -52, -90, 123, -76, -42, -23, + 21, 66, -25, 9, 12, -13 + }, + { + 141, -105, -123, 1827, -814, 799, -53, -523, 77, 208, + -266, -674, 414, 295, -325, 110, 411, -406, 342, -3, + -347, 369, 200, -67, 75, -71, -403, -570, -209, 103, + 709, -33, -277, 244, 136, -188, 209, 98, 203, -302, + -268, 365, 228, -239, -42, -86, 82, 161, -8, -143, + -234, 94, -85, 23, 1, 72, 94, -274, 4, 102, + 275, 33, 11, -183, 254, -132, 94, -88, 114, -157, + -135, -101, 39, -83, 35, -78, 63, -16, 153, 82, + 67, 5, 21, -79, 7, 60, -141, -89, -48, 128, + 11, -35, 9, 8, 7, -46 + }, + { + 18, 493, -1037, 1262, -1082, 416, 350, -62, 28, -48, + -184, -359, -106, 1008, -998, 898, 164, -663, -20, 68, + 2, 301, 70, -553, 495, 453, -655, -477, 459, -448, + 672, -513, 157, 45, -208, 54, 1, -134, 293, -165, + 81, 222, -174, -109, 5, 236, -350, 70, 209, -51, + -290, 195, 116, -214, 103, -55, 63, -144, -20, 213, + 8, -122, -94, 213, 122, -109, -131, 178, -91, -103, + 55, -65, 90, -20, 14, 48, -37, -32, 68, -8, + -25, -2, 5, 40, -60, 44, 31, 6, -70, 63, + -27, 1, -40, 1, 29, 5 + }, + { + 1018, -3308, 1115, 1439, -498, 364, -66, 11, -112, -742, + 331, -543, 568, -63, 112, 138, 220, -231, -114, 204, + -384, 443, -400, -575, 1000, 0, -383, -443, 504, 517, + -58, -683, 836, -641, 243, 257, -154, -276, 399, -105, + 195, -195, 154, -174, 63, 190, -143, -128, -8, 137, + 44, -102, 116, -118, 6, 139, -398, 191, -1, 205, + -54, -40, -10, 51, -95, 296, -127, -90, -13, 9, + -158, -63, -5, 81, 60, 41, 46, -12, 56, 127, + -124, 12, -54, 75, -81, 22, 33, -3, -84, 118, + -62, 45, -11, -32, -19, 32 + }, + { + -149, 1477, -2001, 1415, -1082, 365, 598, -219, 14, -410, + 328, -460, -528, 204, -26, 835, -25, -383, -247, -292, + 844, 52, -597, -435, 310, -157, 1135, -872, 338, -273, + -289, -428, 554, 256, -37, -580, 189, -73, -135, 349, + -71, -613, 457, 144, -78, -329, 262, -228, 105, -97, + 120, -37, 2, 94, 150, 197, -208, -143, -20, 73, + -60, 52, -185, -88, 171, -76, 92, 23, -149, 55, + 2, 6, 70, -102, -67, 160, -14, 1, -90, 40, + -32, -142, 6, 41, 117, 74, -52, -48, -52, 23, + 9, -48, 90, 0, -15, -20 + }, + { + 1183, -3910, 1474, 1237, -40, 69, 259, -195, 12, -598, + 623, -924, -108, 726, 201, 593, -481, -362, -261, 25, + 713, -310, -828, 286, 175, -239, 543, -520, 402, -37, + -172, -384, 531, 456, -315, -361, 279, -269, 367, -86, + -26, -338, 215, 194, -268, -143, 128, 86, 52, -160, + 54, -112, 251, 40, -17, 187, -205, 32, 163, -130, + -3, 11, -134, 44, -28, 60, 115, -122, 53, -137, + 43, 15, 96, 14, 117, -147, -7, 76, -6, -21, + -65, -54, -14, 66, -125, 236, -119, 42, -107, -12, + 84, -100, 63, -9, 26, 21 + }, + { + -136, 1487, -2362, 1506, -857, 73, 536, 44, 109, -395, + 69, -612, -192, 605, 129, 34, -155, -357, 638, 310, + -504, -3, -60, -60, -942, 850, 700, -432, -355, 106, + -291, 241, -345, 680, -524, 281, -300, 311, -325, 32, + 136, 37, -529, 131, 309, -60, -215, -223, 252, 304, + -266, -332, 499, 75, 113, -22, 27, 13, -384, 77, + 98, -225, 32, -19, -31, -42, 191, 136, -295, 11, + 102, 52, 150, 44, -10, -74, 143, -62, -107, -22, + -42, -27, 23, -27, 71, -7, 66, -34, -160, -6, + 61, -17, 135, 17, -12, -45 + }, + { + 1143, -3821, 1672, 1170, -33, 598, -174, -75, -273, 0, + 209, -743, -148, 1383, -1130, 667, -402, -257, 679, -190, + 169, -918, 934, -712, -684, 641, 318, 145, -775, 233, + -39, 30, -167, 26, 403, -395, 59, 200, 57, -139, + -168, -133, -26, 41, 66, 97, 22, -65, -85, 67, + 144, -335, 96, 224, 46, 157, -76, -1, -266, 0, + 78, -141, 78, 230, -221, 58, 193, -32, 38, -180, + 56, 81, 11, 146, -128, -3, 38, -70, -63, -13, + -30, -95, 75, 26, 54, 22, 6, -24, -24, -32, + 23, 69, -48, 88, -7, -7 + }, + { + 168, -50, -499, 1006, 173, 227, -1282, 343, 843, -290, + -117, -741, 760, 291, -695, 145, -616, 330, 279, 123, + -403, 598, -65, 74, 229, -751, 427, -600, -87, 185, + 286, -120, 416, -329, -102, 397, 16, -36, -324, 500, + -15, 129, -16, -701, 105, -102, -220, 311, 70, 196, + -324, -1, -171, 107, -134, 286, 78, -90, 247, -331, + 53, -316, 231, -133, 125, 61, 61, -65, 128, -139, + 52, -109, 37, -122, -68, -13, 9, 44, -7, 13, + 45, 15, -3, -20, 25, -73, -24, 82, -22, -119, + 65, -49, -23, -4, 82, -69 + }, + { + 732, -2488, 1151, 957, 104, -148, -686, -472, 999, -221, + -373, -29, 406, -202, -43, 81, -69, 711, -400, 317, + 154, 464, -783, 718, -857, 38, 219, -15, 2, 155, + -65, -32, 159, -442, 244, 2, 106, -220, 226, -204, + 205, -169, 60, -81, 9, 0, -231, 426, -153, -26, + 313, -366, -93, -68, 235, -6, -11, 315, -108, -80, + -57, -19, -5, 175, 116, -102, -40, -35, 11, -56, + 100, -17, 115, -141, -28, 39, -90, 120, -9, -36, + 73, 132, -111, -29, -6, 79, -136, 17, -15, -16, + 2, -68, 96, 50, -21, 14 + }, + { + 36, 389, -590, 927, 14, -77, -1292, 1023, -170, 274, + 210, -844, 855, -775, 67, 119, 319, -569, 257, 19, + -490, 51, -428, 736, 22, -495, 494, 231, -169, -147, + -149, 308, -342, 403, 287, -350, 143, -323, -2, 108, + -93, -465, 735, -220, -330, 400, -118, 122, -193, 295, + 297, -510, 151, -52, 72, -5, -324, 145, 4, -238, + 229, 223, -109, -24, 54, -42, 19, -189, 65, 232, + -71, -109, 176, 158, -100, -39, 90, -94, 34, -118, + 116, -86, -33, -2, 65, -49, -33, 166, 60, -26, + 83, 23, 5, -20, 27, -99 + }, + { + 1116, -3619, 1580, 827, 402, -82, -652, 785, -631, 931, + -1536, -6, 422, -1070, 1011, 51, 2, -151, 125, -332, + -10, 255, -190, 260, -462, -29, 89, 455, 146, -531, + -175, 27, -199, 422, 245, -126, 0, -354, 398, -133, + -477, 60, 472, -68, -216, 243, -54, 188, -136, 26, + 54, -84, 18, 98, -280, 152, -345, 367, -235, 242, + -81, 79, -68, -7, 45, -50, -122, 0, 261, 114, + -178, 98, -23, 52, 17, -38, -45, 63, -141, 81, + -125, 5, -77, -32, 76, 21, -12, 81, -45, 45, + -9, 69, 64, 7, 5, -55 + }, + { + 267, -490, -151, 689, 141, -43, -1598, 1362, -267, -325, + 393, -1060, 359, 314, 642, -736, 827, -124, -323, -517, + 485, -497, 875, 128, -711, 419, 337, -659, 120, 196, + -457, 243, 143, 207, -819, 592, -120, -88, 39, 68, + 311, -162, -47, -203, 196, -115, -117, 291, 13, 66, + 55, 11, -84, -89, -25, -20, -69, 57, -77, -38, + 108, -178, 61, 103, 160, -74, -141, 126, -100, 18, + 40, 27, 3, -86, 85, 35, -60, -19, -16, 61, + 9, 17, 18, 8, 15, 16, -13, 29, -29, -54, + -1, -28, 3, 33, 38, -112 + }, + { + 1031, -3355, 1597, 84, 1027, -431, -696, 742, -603, 411, + -440, -62, -598, 942, -263, 108, 161, -324, -418, 29, + 194, 508, -455, 470, -441, -549, 599, 127, -190, 190, + -380, 208, 9, 137, -534, 304, 21, 143, -282, 249, + 120, 275, -504, 52, 95, -224, -13, 132, 156, -10, + 110, -131, -128, 75, -180, 97, -120, 74, 13, 149, + -153, 37, 1, 10, 23, -139, 88, -1, 22, -196, + 196, -177, 159, -67, -52, 56, -6, -103, 2, -48, + 69, -59, 21, -52, 65, -5, 75, -21, -18, -65, + 9, 33, 23, -91, 86, -19 + } + }, + { + { + -16, 4166, 999, 467, -1178, 774, 534, 508, -530, 36, + 81, -229, 697, 975, 373, -1372, 926, 150, 312, -773, + 432, 405, 1216, -1104, -249, -936, 477, 95, 639, 137, + -697, -48, -633, -47, -153, -233, 326, -1110, 103, -746, + 219, 641, -367, 74, -205, -278, 133, 806, -38, 105, + 50, 138, -21, 186, -12, -38, -317, -61, -84, 536, + -33, -313, -166, 8, -26, -102, -6, -29, -102, -164, + 304, 21, 5, 105, -77, 65, -278, 16, -19, 11, + -21, -57, -31, -67, -190, -27, -127, 97, 35, 42, + 133, -11, -30, -106, -6, -59 + }, + { + -257, 724, 4165, 3960, 59, 91, -498, 522, -72, 260, + 270, -932, 544, 237, 1107, -799, -978, -409, 372, -803, + -134, -444, -396, -195, 951, -96, -232, 241, 107, -436, + 1231, -640, 243, 620, 289, 778, -171, -393, -756, -546, + 542, -331, -185, -133, 399, -125, 441, 117, 64, -93, + 114, -74, -314, 144, -88, 334, -112, -31, -255, -186, + 82, 6, -329, 498, 153, 17, 108, -98, -47, 16, + -110, 128, 129, 147, 6, 8, -30, -50, 67, -89, + 151, 47, -125, 20, 75, -27, 160, -79, -100, -18, + 57, 77, 34, 47, -43, -113 + }, + { + 22, 3632, 3323, 3010, 185, 419, -264, -256, 177, 589, + -253, -1158, 154, 157, -394, 144, 971, 2, 558, 84, + -458, 142, 87, -229, -65, -547, -998, -865, -264, 206, + 897, 183, -438, 195, 431, 192, 649, 459, 580, -182, + -498, 273, 336, -228, -178, -293, -97, 117, 75, -201, + -226, 287, -202, 13, -36, -53, 400, 111, 31, -96, + 342, 155, 25, -307, 157, -146, 55, -70, 208, -164, + -18, -98, -18, -82, -24, -139, 54, 21, 343, 195, + 136, 62, 65, -120, -118, -29, -193, -42, -58, 98, + 53, -34, -90, -66, -6, 20 + }, + { + 32, 2649, 216, 96, -2083, 271, 347, -161, 168, 1216, + 416, -499, -203, 619, -1757, 1175, 1409, -512, -1055, -338, + 41, 507, 630, -266, 521, 323, -919, -929, 93, -838, + 938, -373, -254, -186, -257, -109, -267, -242, 448, 119, + 264, 224, -109, -258, -124, 290, -495, 87, 233, 114, + -359, -109, 187, -99, 144, -5, -36, -329, -64, 360, + 70, -121, -19, 424, 372, -96, -233, -18, -281, 49, + 264, -11, 183, -11, 17, 28, -20, 23, 39, -48, + -8, 22, 7, 41, -73, 40, 45, 98, 11, 66, + -59, -22, 18, 30, -6, -10 + }, + { + -879, -5959, 1231, 3531, 1053, 128, -445, -145, -442, -625, + 594, -910, 534, -604, -242, 288, 1281, -112, -941, -369, + -1467, 47, 447, 57, 879, -3, 65, 61, 870, 572, + -68, -947, 858, -426, 521, 464, 36, -250, 486, 48, + 58, -377, 385, -109, -115, 213, 25, 187, 108, -18, + 40, -198, 237, -38, -236, 151, -486, 58, 48, 252, + 61, 108, -157, -108, -132, 510, 31, -99, -124, -155, + -346, -132, 89, 199, 254, 81, 16, 82, 216, 295, + -34, 4, -100, 94, -169, -64, 78, 86, -11, 164, + -44, 95, 31, -8, -6, 70 + }, + { + -104, 3286, -954, -304, -2365, 444, 556, -297, 329, -167, + 256, -591, -356, -369, -774, 399, -320, -288, -532, -703, + 668, 43, -97, -832, -285, -328, 1280, -826, 181, -600, + -350, -1055, 5, 351, -219, -790, 262, -316, -349, 309, + 170, -534, 273, 133, 120, -153, 220, -454, 95, -22, + 170, 109, 17, 114, 342, 224, -416, -247, -56, 46, + -45, 73, -290, -165, 93, -241, 139, 251, -89, 4, + 3, -91, -178, -406, -271, 197, 19, 30, -88, 22, + -50, -157, 3, 135, 205, 52, -112, -29, -6, 97, + 35, -114, 47, -72, -25, 2 + }, + { + -990, -7249, 1255, 3975, 2120, -128, 328, -258, 162, -746, + 781, -167, 30, 672, 266, -188, -976, -103, -608, -985, + 216, -463, -952, 459, 217, -655, 307, -300, 813, 102, + -1, -386, 301, 621, -39, -464, -50, -520, 499, 5, + 204, -345, 160, 48, -692, -346, 173, 302, 421, -111, + -306, -254, 465, -38, -188, 307, -11, 426, 418, -147, + 194, 84, -309, -56, -51, 14, 88, -69, 53, -250, + 80, -18, 156, 116, 124, -267, -85, 209, 124, 1, + -33, -81, -47, 10, -224, 238, -177, 64, -101, -44, + 103, -62, 27, -46, 70, 55 + }, + { + -135, 2585, -1956, -70, -1986, -232, 547, 475, 371, -185, + 475, -342, -359, 9, 322, 240, 107, 462, 502, -59, + -833, -276, -266, 565, -362, 466, -141, -330, 49, -14, + 226, 257, -981, 328, -624, 402, -357, 54, -508, 7, + 296, 286, -739, -106, 387, -5, -191, -313, 53, 426, + -126, -223, 683, 86, 227, 67, -134, -123, -309, 19, + -114, -309, 134, 37, 55, -47, 52, -64, -204, 322, + 317, 233, 308, 124, -30, -248, 35, 51, 37, 21, + 17, 30, -7, -160, -70, -114, 73, 59, -172, -108, + 49, -9, 101, 41, 58, -9 + }, + { + -966, -6741, 1868, 4241, 2669, 686, -387, -122, 35, 574, + 991, -554, -705, 901, -2015, 103, -132, -475, 429, 178, + 220, -1682, 648, -330, -1086, 139, 204, 230, -394, 238, + -747, -601, 227, 172, 173, -424, 60, 17, -149, 78, + 14, -396, 39, 18, 29, 568, 409, -138, -412, -13, + 172, -356, 124, 8, -110, 172, -335, -26, -128, 183, + 256, -89, 226, 462, -8, 182, 116, -9, 24, -265, + 56, 15, -123, 79, -71, -45, -129, -188, -139, 74, + -25, -180, 79, 81, 48, 23, 80, 51, 53, -3, + -66, 31, -57, 108, 35, -28 + }, + { + -21, 2693, 1598, 643, -572, -399, -1486, 1088, 1536, -412, + 143, -1010, 769, 836, -908, -789, -1734, 894, 1087, 312, + -373, 322, -343, -268, 158, -619, 479, -944, -7, 473, + 852, 30, 349, -323, 72, 915, 617, 257, -425, 513, + -167, -22, -155, -1136, -257, -160, -540, 52, -128, -69, + -138, 93, -194, 422, 230, 504, -112, -115, 292, -667, + -25, -324, 112, -461, -102, 85, 268, 19, 108, -171, + -32, -174, 102, 16, -51, -194, -103, 60, 23, -89, + -153, -63, 36, -32, -122, -308, -53, 196, 101, -11, + 91, -72, -70, -76, -1, -219 + }, + { + -555, -2973, 2803, 1768, -86, 721, 31, -1755, 928, -368, + 41, 46, 71, 299, 101, 303, 1067, 2150, 85, 735, + 919, 274, -1225, 395, -823, 398, 415, 130, 335, -335, + -456, 454, 164, -445, 147, -40, 99, -300, 189, -296, + 358, 113, 552, 463, 239, -91, -749, 45, -123, -157, + 258, 2, 88, -77, 438, -8, 6, 462, -209, -229, + -131, 38, 162, 219, 133, -35, 12, -7, 56, -68, + 103, 1, 129, -137, -114, -113, -172, 196, 2, -75, + 86, 129, -149, 43, 102, 80, -231, -112, 15, 41, + -75, -73, 197, 61, -83, 3 + }, + { + 1, 3344, 1430, 77, -936, -945, -1605, 1216, -307, 105, + 1468, 405, 568, -885, -504, -1562, -667, -419, 157, -190, + -888, -687, -372, 1020, 438, 85, 599, 79, -73, 565, + 389, 297, -463, 123, 16, -195, 119, -1047, -439, 131, + -28, -841, 767, -110, -520, 414, -145, 42, -345, 88, + 214, -480, 226, -79, 210, 238, -287, 254, 323, -267, + -20, 94, -230, 116, 32, -307, 135, 11, -3, 179, + -33, 30, 334, 92, -157, 8, 204, 78, 202, -41, + 150, -109, 11, 79, 142, 6, -32, 228, 125, 7, + 95, -11, 29, -25, 18, -168 + }, + { + -796, -7314, 1223, 2074, 1719, 1344, 276, 94, -1420, -154, + -2108, 45, 91, -1420, 510, -354, 302, 17, -320, -189, + 553, 686, -165, -450, -839, 198, 431, 686, 43, -998, + -796, -285, -306, 637, 297, -39, 610, -90, 342, -78, + -682, -72, 318, 31, 332, 168, -238, 484, -264, -478, + -411, -208, 423, 234, -330, 510, -298, 537, -30, 182, + -224, -24, -132, 6, -25, -113, 6, 95, 306, 280, + -211, 19, -91, -60, -42, -219, -199, 177, -58, 138, + -187, -131, -271, -211, 78, 74, -33, 123, 31, 38, + -6, 137, 138, 102, 53, -123 + }, + { + -96, 1734, 1547, -16, -788, -1114, -2359, 1344, -852, -1006, + 452, -1190, 843, 699, 788, -190, 1282, -411, -915, -1139, + 88, -813, 1205, 883, -679, 338, 66, -923, 417, 234, + -616, 385, 174, -225, -936, 731, -267, -212, -244, -72, + -60, -125, 397, 158, 509, 312, 112, 311, -141, -238, + 216, 292, -170, 65, 104, -245, -351, -90, -180, -245, + -69, -174, 283, 219, 146, -286, -307, 104, -82, 253, + 256, 51, 17, -10, 120, 57, -39, 96, 85, 108, + 52, 42, 12, -65, 17, 22, -153, -9, 73, -61, + -91, -90, 20, 91, 48, -145 + }, + { + -774, -7011, 902, 734, 1701, 216, -399, 94, -714, -6, + -962, 279, -1312, 591, 187, 20, -722, -1116, -1078, -86, + 722, 910, -1002, -133, -885, -632, 1202, 502, -411, -177, + -405, 704, 171, -233, -528, 835, 216, 337, -187, 147, + -68, 209, -622, -431, -171, -131, -5, -42, -142, -190, + 296, 76, -239, 158, -121, -11, -506, -133, 69, 316, + -56, 158, 200, 42, -241, -397, 85, -140, -192, -310, + 198, -249, 153, -97, -89, -13, -111, -97, 8, -217, + -32, -158, -75, -151, 57, 110, 126, 8, -14, -103, + 7, 79, 33, -146, 98, -93 + } + }, + { + { + 142, 1767, 2301, -1429, 1325, 218, 562, -2, -163, -14, + 645, -699, 1033, 973, -808, 36, -249, 67, 420, -600, + -317, 831, 1415, -571, -305, -559, -139, 248, 428, -72, + -257, -689, -465, 383, -105, -345, -192, -409, -135, -585, + -61, 409, -109, 29, -110, -238, 280, 125, 437, 0, + 28, -63, 188, 16, -50, -77, -243, 61, -37, 162, + 35, -313, -17, 112, -210, -112, 27, -65, -35, -215, + 248, 216, -10, 5, 106, -20, -179, -161, 26, -95, + -21, -1, -106, -7, 7, -129, -61, 76, 37, 98, + 46, -11, -7, -72, -27, 34 + }, + { + 46, 6639, -1391, 1379, 1320, 414, -301, -52, 410, 303, + -151, -34, -84, 79, 1051, -636, -649, -130, -73, -140, + -910, -176, -194, -359, 748, -75, 50, 99, -459, 273, + 505, 106, 266, 424, 258, 325, -209, 50, -711, -407, + 180, -211, 56, 55, 181, 94, 32, 79, 116, -120, + 221, -267, -45, 56, -9, 184, -191, -48, -118, -153, + -107, 103, -202, 383, 183, -96, 45, 2, -264, 187, + 22, 179, -52, 84, 42, -37, -75, -14, 67, -74, + 189, -84, -19, -158, 186, 103, -13, -57, -51, 76, + -58, 92, 32, 47, -86, -56 + }, + { + -122, 6320, 1077, -338, 2785, 338, -338, -468, 297, 605, + -136, -656, -287, -104, 204, 65, 587, 386, 112, 132, + 343, -539, 9, -476, 109, -29, -943, -1088, -193, 659, + 60, -38, -44, 345, 519, -22, 384, 454, 471, -102, + -244, 253, 13, -30, -308, -182, 199, -186, -195, 150, + 94, 126, -201, 145, -79, -30, 138, 179, 338, -242, + 132, 176, 18, -130, 133, -105, -135, 101, 7, 25, + -3, -44, -58, 13, -99, -28, -43, 96, 386, 112, + 82, 103, 41, 1, -168, -51, -108, -46, -40, 107, + 36, -30, -123, -19, 21, 57 + }, + { + -24, 2541, 645, -895, -611, -117, 84, -51, -123, 1153, + 369, -346, 33, -44, -658, 639, 686, 594, -1447, -245, + 235, -448, 494, 249, 561, -113, -546, -411, -346, -560, + 366, -9, -351, 161, -565, -119, -385, 176, 71, 325, + 262, -101, 61, 97, -64, -84, -469, 236, -40, 190, + 221, -593, 88, 273, -196, 123, -124, -98, -243, 244, + 137, 32, 135, 174, 363, -191, -34, -171, -197, 126, + 233, -53, 92, 73, 125, -94, 10, 27, 93, -59, + -39, 11, 84, -16, -69, 54, 31, -2, 62, 33, + 26, -103, 29, -8, 22, 29 + }, + { + 791, -3762, -2313, 2670, 1217, 867, -691, 421, -325, -101, + -602, -634, 263, -207, 58, -755, 1451, -101, -684, -726, + -1045, 252, 525, 77, 469, -227, 508, 391, 380, 290, + -118, -236, 96, 294, -109, 386, -83, 130, 131, 433, + 22, -98, -193, -12, 97, -277, 116, 276, 320, -135, + -109, -148, 235, 16, -216, 224, -50, -168, -131, 147, + -12, -30, 52, -46, -7, 101, 259, -169, -154, -123, + -177, -124, 243, -64, 300, 37, -73, 223, 213, 100, + -23, 83, -73, 67, -125, -40, 134, -19, 158, 17, + 5, 59, 66, 14, -63, 41 + }, + { + 177, -1356, 3437, -995, -1178, 41, 47, 49, -90, 285, + 142, -500, -355, 87, -1055, -150, 366, -679, -239, -13, + -407, -313, 0, -1148, 692, -490, 50, -117, 204, -276, + -615, -569, -7, 111, -526, -95, -160, -397, 117, 155, + 228, -482, 369, -138, 101, 364, -185, -242, -118, 441, + -31, 359, -325, 123, 198, 244, -59, -146, -405, 129, + 12, -231, -176, -16, -258, 97, 102, 379, -69, -311, + 49, 11, -211, -156, -295, 102, 58, -108, -85, 11, + 88, -223, 7, 272, -27, 85, -106, 66, 12, 40, + 59, -117, 66, -199, 35, 69 + }, + { + 877, -4916, -2898, 4421, 1474, 302, 157, -121, 420, -649, + -415, 852, 222, -42, 904, -567, -867, -218, -510, -304, + -320, -638, -492, 7, -147, 118, -9, 96, 98, 451, + -47, -271, -92, 438, 165, -519, 134, -473, 311, 82, + 172, -174, 12, -120, -119, -195, -114, 182, 116, 250, + -603, -94, 223, -125, 59, 175, -14, 407, 427, 1, + 150, -187, -47, 188, -119, -187, 18, 73, -27, -152, + 150, 40, -27, 198, 87, -216, 0, 129, 13, -50, + 104, -87, -21, -25, -67, -28, -37, 110, -127, 17, + 50, 6, 86, -98, 70, -19 + }, + { + 157, -2462, 3122, -777, -1114, -469, 306, 392, 186, 226, + 248, 279, -948, 1010, 5, 277, 492, 545, -334, -443, + -241, -314, -178, 466, -297, -355, 589, -577, 851, -706, + 1066, -9, -853, 42, -141, -681, 379, -299, 69, 61, + 248, -106, -59, -241, 96, 147, -188, 70, -317, 142, + 121, -106, 336, 234, 232, 116, -75, -240, 55, -282, + -19, -238, 57, -102, 326, -331, 18, -39, 61, 174, + 217, 582, 62, 6, -41, -1, -19, -48, 58, 73, + -20, 21, 7, -169, -42, -67, -10, 45, -122, -105, + 39, 57, -31, 74, 97, -34 + }, + { + 863, -4347, -2619, 4792, 1993, 597, -447, 273, -123, 1041, + 479, -416, -287, -240, -452, -1222, 841, -309, 10, 711, + -465, -755, 42, -976, 57, -139, 172, -136, -143, 62, + -390, -363, 288, 63, 53, -355, 72, -10, 225, 77, + -99, -536, 148, 43, 318, 185, 99, 456, -710, 14, + -84, 72, 176, -223, -98, 65, -234, -46, -121, 302, + -5, -106, 290, 240, 67, 88, 69, 121, -186, -112, + 99, -26, -195, 153, 73, -75, -214, -156, -168, 152, + -89, 20, -113, 98, -6, 17, 13, 93, -71, 120, + 8, -136, 16, 29, 140, -90 + }, + { + -56, 4396, -289, 435, -41, -1353, 71, 1043, 512, 4, + 137, -307, -184, 985, -1009, -617, -649, -106, 1222, 32, + -38, -165, 52, -182, 312, -479, 178, -644, 530, -193, + 819, 92, 302, -104, -283, 594, 660, 383, -283, 86, + 283, -272, -135, -575, -669, 219, -179, -307, 158, -249, + -63, 222, -380, 62, 734, 284, -188, 14, -167, -176, + -273, -148, 189, -171, -406, -85, 214, 88, -16, 216, + -268, -48, -76, 91, 119, -229, -26, 16, -72, -30, + -131, -147, 44, -8, -128, -132, -51, 110, 121, 43, + 60, -113, -17, -81, -49, -111 + }, + { + 417, -283, -123, 1401, -384, -636, 2908, -1168, -535, -1106, + 931, 50, -95, 677, 236, 8, 910, 1090, 1498, 453, + 822, -311, -341, -119, -386, -35, 253, 264, 701, -452, + -348, 519, 144, -122, -107, 157, -489, 200, 296, -375, + 386, 367, 193, 921, -23, -109, -444, -340, 112, 215, + -272, -55, -91, 498, 197, -106, 91, 177, -19, -394, + -178, -28, 442, -120, 72, 145, -3, -60, 164, -124, + -58, 187, -111, -73, -68, -236, -11, 132, -108, 114, + -6, -32, 84, -156, 200, -110, -29, -114, 19, 69, + -84, 116, -34, 90, -97, 24 + }, + { + -1, 3661, 431, 10, -320, -432, -1120, 384, -1, 118, + 499, 936, -580, -272, 431, -908, -1638, -233, 33, -126, + -1065, -644, -307, 1256, 471, 291, 66, -616, 889, 562, + 952, -33, -72, -797, -137, 216, -273, -1204, 48, 31, + -185, -603, -39, 189, -242, 504, -231, -56, -115, -278, + 130, -89, 49, -108, 221, 234, -96, 201, 47, 151, + -398, 148, 17, -1, -20, -311, -112, 99, 64, -80, + 62, 128, 301, -105, 4, 2, 185, 142, -5, 172, + 94, -137, 12, 132, 12, 81, 94, 85, 118, -81, + 64, 26, 75, -57, -2, -113 + }, + { + 488, -7718, -130, 1652, 1350, 289, 2238, -789, -354, -943, + -1962, 717, -179, -213, -125, -604, 484, -549, -42, -273, + 706, 459, 690, -765, -577, -120, 318, 876, -497, -560, + -758, 356, -483, 234, 219, -305, 807, -117, 272, -171, + -287, -83, 118, 260, 189, 70, -227, 455, -412, -356, + -76, -284, 483, -32, 45, 122, -139, 358, 124, -148, + -32, -122, 83, -64, -137, 174, -19, 202, -58, 46, + 75, -198, -4, -45, -179, -18, -336, 154, -119, 65, + 9, -265, -152, -238, -2, 109, 142, -28, 174, -8, + -1, 139, 15, 113, -17, -88 + }, + { + -15, 3947, -460, -86, -453, -1195, -1600, 486, -1131, -142, + 125, -436, 475, -140, 463, 1510, 157, -578, -652, -664, + -1125, 557, -636, 1538, -11, -235, -98, -721, 393, 853, + -329, -386, 303, -859, -279, 354, -459, 241, -283, -370, + -157, 147, 215, 488, 617, 321, -208, 125, -36, -131, + 334, 91, 36, 164, -37, -294, -195, -136, -243, -207, + 196, -339, 250, 189, 32, -211, -230, 196, -128, 255, + 314, -89, 23, 235, -87, -34, 72, 94, 94, 11, + -131, 216, 9, -118, 32, 123, -115, -95, 84, -117, + -66, -64, -3, 74, 13, -48 + }, + { + 509, -7123, -959, 1295, -179, -387, 2147, 48, -496, -771, + -927, -203, -1062, 449, -810, 977, -178, -1808, -872, 879, + 395, -37, -230, -574, -979, 15, 920, 472, -446, -631, + -67, 747, 745, -329, -112, 89, 506, -54, 15, 54, + -42, -306, 28, -762, -392, 426, -127, -412, -186, -205, + 241, 94, -182, 203, -8, -217, -404, -275, 269, 445, + -281, 325, 183, -54, -37, -477, -75, 58, -285, -116, + -177, 32, 35, -248, 31, -20, 3, -85, 48, -260, + -139, -1, -97, -100, -94, 170, 116, -30, 79, -99, + 30, 54, -12, -92, 13, -66 + } + }, + { + { + -117, -2678, -1101, -1583, 1565, -377, -160, -218, 300, 287, + 575, -745, 380, -255, -1468, -97, -1355, -508, 283, -168, + -112, -137, 375, -155, 301, -63, -61, 41, 18, 375, + 515, -582, -108, 607, -15, -31, -135, 2, -30, -539, + 21, 213, -20, 145, 32, 134, 137, -766, 210, 84, + -278, -392, 56, -330, -121, 342, -53, -52, -45, -243, + -39, -97, -16, 129, -220, -52, 197, 201, 250, -64, + 62, 132, 96, -11, 3, -45, 103, -35, 7, -146, + -24, 70, 60, 155, 138, 16, 73, 70, -4, 31, + 33, 17, 119, 55, -22, 4 + }, + { + 43, 8481, -762, -2195, -1640, 52, 235, 360, 579, 441, + -13, 177, -235, 69, 986, -698, -485, 327, -337, -288, + -267, 293, 448, 52, 206, -200, 49, -59, -259, 223, + -160, -45, 201, -7, -308, -58, -99, 302, -39, 81, + 205, -105, -5, 174, -151, -237, -259, -257, 129, -132, + 69, -26, 15, -44, -13, -2, -224, -142, 7, -138, + -158, 243, 14, 325, 32, -198, -143, -42, -137, 277, + 10, 75, -253, -46, -4, -131, -194, -115, -26, -50, + 233, -109, 1, -219, 185, 89, 4, 65, 9, 14, + -135, 56, 14, 63, -35, -13 + }, + { + 58, 3559, -2658, -3645, 388, 61, 25, -50, 360, -20, + 108, -109, -333, -330, 75, -223, -46, 117, -17, -222, + 192, -753, -56, -405, 559, 406, -123, -487, -453, 526, + -223, -165, 146, 53, -93, -457, -144, 237, 204, -114, + 233, 320, -107, -57, -149, 106, 399, 42, -7, 353, + 217, 166, 167, 459, 240, 13, -142, -62, 274, -320, + -26, 25, 54, -7, 127, -32, 26, 181, -103, 142, + 51, 46, 25, 6, -18, 103, -38, 138, 290, -69, + -13, 39, -85, -42, -101, 53, 3, 52, 26, 50, + 80, 82, -4, 8, -44, 80 + }, + { + -43, 857, -204, -438, 257, -165, -135, -43, -508, -214, + -236, 397, 288, -246, -163, -34, -280, 1032, -1090, -126, + 176, -740, 32, -373, -290, -220, 381, 228, -296, -562, + 34, 322, -265, 267, -281, 96, -150, 168, -379, 391, + 354, -423, 191, 114, -11, 31, -390, 148, -10, 423, + 359, -445, 257, 256, -371, 6, -131, -33, -292, 191, + 138, 58, 53, -15, 43, -184, 144, -176, -83, -22, + 22, -17, 95, 26, 80, -205, -37, 26, 142, -37, + -55, 6, 89, 5, -89, -40, 13, -58, -46, -36, + -6, -98, -4, -76, -32, -30 + }, + { + -871, 95, 1557, 523, -512, 534, -228, 945, -235, 925, + -199, -763, 155, -598, -156, -760, 875, 109, 546, -106, + -251, 334, 407, 134, 214, -166, 419, -85, -318, -385, + -155, 234, -49, 198, -527, -103, -378, -22, -152, 339, + -200, -250, -100, 261, 379, -103, -245, -225, 444, -51, + 296, 233, -152, -239, -233, 284, 94, -102, -176, -79, + -40, -36, -18, -26, -5, -220, 67, -141, -60, 67, + 163, 84, 299, -190, 47, -94, 21, 144, -30, -112, + -154, 66, -52, 70, 0, -6, 87, -84, 119, -29, + 35, 24, 25, 68, 17, 6 + }, + { + 35, -2810, 2488, -165, 449, -73, -142, 258, -136, 137, + 166, 98, -194, 438, -639, -513, 388, -281, -259, -442, + -1287, -853, 147, -1406, 1039, -18, -605, -84, 406, 856, + 198, -359, -42, 68, -471, 356, -147, -66, 764, 95, + 3, -273, 446, -59, 84, 364, -83, 21, -97, 510, + -201, 234, -336, -84, -176, -118, -101, 19, -196, 422, + 177, -153, -108, 25, -256, 212, 50, 347, 25, -225, + -15, -121, -8, 245, -51, 40, -72, -186, -106, -71, + 189, -134, -81, 117, -230, 29, 12, 93, -3, -70, + -18, -138, 64, -111, 65, 50 + }, + { + -977, -881, 1830, 2162, -646, 291, 38, 338, 1076, -261, + -759, 214, -11, -348, 809, -178, -536, -179, 12, -84, + -494, -319, 67, 219, -176, 672, 354, 137, 146, 336, + -34, -184, -471, -69, -11, -491, 145, -153, 427, -27, + 26, -2, 160, -120, 295, 66, -224, 84, -174, 167, + -351, 50, 19, -245, 2, -56, -295, 288, 423, -38, + -191, -280, 308, 275, -69, -84, -25, 67, 12, -21, + 92, 42, 14, 223, 107, -161, 3, 31, -1, 32, + 180, -47, 11, -7, -7, -4, 10, 125, 2, 63, + -9, 3, 73, -104, 92, -56 + }, + { + 123, -2134, 3552, -301, 326, -291, -193, 24, -171, 94, + 34, 815, -276, 1057, 372, -24, -304, 991, -453, -988, + -255, -193, -513, 574, -108, -542, 671, -289, 1274, -1018, + 795, 135, -276, 375, 159, -639, 689, -378, 14, 279, + 314, -109, 289, 125, 200, 241, 259, 521, -598, -233, + 25, -428, 8, 41, 8, 268, 253, -172, 18, -294, + 85, -243, -40, -140, 262, -349, 95, 114, 116, 36, + -31, 295, -252, -99, 108, 109, -128, -79, -30, -154, + -145, 36, 16, -97, 49, -62, -114, -29, 1, 44, + 58, 1, -142, 49, 86, -35 + }, + { + -959, -1273, 1176, 2462, -965, -236, -414, 662, -2, 397, + -295, -158, 186, -247, 388, -232, 1340, -456, -584, 711, + 41, -254, 115, -733, 549, -99, 258, 15, -60, 234, + 190, 216, 390, -280, -172, -169, 418, -89, 66, 339, + 454, -357, 90, -85, 83, -12, 186, 615, -557, 162, + -193, 48, 94, -149, -10, -86, -234, -75, -326, -91, + -270, -310, 37, 31, -70, 36, -56, 40, -147, -86, + 143, 74, -28, 188, 100, 20, -91, -38, -105, 114, + -86, 150, -87, -64, -189, 44, -1, 13, -145, 92, + 56, -155, 40, -15, 25, -81 + }, + { + -4, 3647, -1540, -722, -107, -156, 1014, 184, -214, -10, + 27, -776, -433, 1000, -318, 1169, 864, -779, -75, -499, + 45, -366, 199, 61, 615, -329, 257, 156, 702, -991, + 32, -445, 446, -39, -793, 506, 199, -394, -254, 107, + 264, -195, 539, -32, -516, 476, 132, -48, 233, 93, + 180, -139, -271, 26, 297, -28, -214, 195, -150, 128, + -156, -206, 16, -38, -165, -71, -16, 70, -189, 27, + -203, 152, 60, 53, 126, -30, 108, 18, -141, -42, + -76, -156, 72, 112, 58, 157, 164, 253, 123, 47, + 79, -20, 92, -18, 11, -12 + }, + { + -442, 3286, 2321, 597, -453, -796, 2617, -670, -251, -1955, + 66, 103, 232, 598, 567, 114, -147, -361, 659, -434, + -112, -538, -23, 1, 402, -283, -644, 102, 461, -381, + 148, 237, 107, 43, 245, 552, -281, 578, 621, 17, + 366, 142, -525, 172, -29, 479, 133, -78, 47, 44, + -404, -351, -404, 317, -16, -368, -196, -106, -415, -330, + 79, -105, 108, -487, -32, -132, -89, 115, 118, -99, + -243, -39, -126, -12, 102, -68, 91, 95, -162, 211, + -128, -299, 33, -125, 143, -56, 168, 97, 17, -30, + -25, 153, -164, 26, -79, 99 + }, + { + -33, 1153, -1597, -35, 169, 532, -355, 147, -17, -182, + -826, 232, -353, -110, 1171, 387, -802, 486, -195, -12, + -382, 388, -312, 140, -495, 13, 18, -653, 815, 433, + 696, -239, 190, -418, -15, 401, -288, -1044, 474, 240, + 311, -70, -50, 319, -364, 235, -251, -26, -83, -366, + 444, 256, 122, -243, 95, 366, -238, -150, -254, 224, + -227, -129, -130, 49, 105, -212, -321, -38, -98, -407, + 22, 107, 119, -255, -38, 52, 54, 34, 17, 20, + -77, 10, 74, 21, -122, -16, -5, -68, 62, -68, + 42, 3, 45, -121, -78, 39 + }, + { + -364, -8311, -536, 462, 699, -911, 1913, -188, 208, -178, + -664, 1120, -227, 135, -967, -1486, 365, -214, 534, 550, + 999, 131, 774, -316, -151, -167, -285, 555, -182, 440, + -382, 511, -138, 51, 360, -188, 440, -439, -2, -155, + -334, -395, 38, 403, 116, -88, -140, 328, 94, 121, + 380, -37, 328, -397, -143, -120, -275, -68, -319, -232, + 348, 264, 293, -86, -195, 44, -171, 101, -221, -46, + 166, -173, -76, -15, -214, 94, -283, -4, -215, 9, + 79, -92, 88, 9, 45, -93, 62, 29, 220, 34, + -13, 88, -48, 7, -35, 7 + }, + { + -14, 4351, -574, -546, 26, 366, -803, 16, -351, 286, + -125, -352, 11, 913, 2543, 694, -1357, -238, 465, -21, + -826, 1259, -1218, 1055, -137, -833, -221, 143, 263, -115, + -681, -463, 178, -698, 181, 471, -485, 97, -25, 8, + 92, 273, 234, 491, 134, -119, -390, -92, 146, 158, + 202, -212, 220, 82, -272, 46, 95, -22, -77, 9, + 366, -414, -25, 101, 109, 146, -54, 127, -107, 82, + 171, -124, 26, 128, -173, 10, 83, 22, -131, -38, + 21, 186, -165, -181, 16, 137, -100, -104, 161, -109, + -52, 45, -62, -32, 7, -59 + }, + { + -395, -6808, -631, 665, -802, -986, 2106, 194, -216, -224, + -642, 143, -805, 263, -1070, 305, 422, -298, -149, 523, + -298, -481, 343, -1, -285, 339, 206, -69, -243, -681, + -59, 192, 423, 70, 466, -196, -153, -202, 651, 497, + 158, -191, 89, -624, -470, -39, -372, -427, -153, -137, + 373, 155, -370, -81, -17, -130, -184, -12, 476, 321, + -299, 270, 156, 165, 209, -128, 226, 334, -168, -78, + -174, 51, -59, 14, 214, -50, -21, -16, 131, -219, + -106, 86, -19, 4, -64, 100, 108, 25, 39, -92, + 60, 49, 89, -24, -14, 2 + } + }, + { + { + -15, -4120, -232, 769, -762, -267, -373, 11, 524, 286, + -8, 304, -316, -384, -867, -412, -1163, -687, -560, 69, + 550, -588, -39, -294, 975, 14, -204, -133, -26, 1090, + 168, -188, -311, 463, -283, 82, 144, 37, -169, -32, + -130, -190, 295, 173, 41, -7, 110, -292, -208, 32, + -261, -329, 149, -288, -27, 60, 53, -209, 91, -163, + -115, -111, 170, -44, -210, 147, -29, 257, 259, 88, + -66, -11, 175, 22, 41, -100, 187, -30, 65, -149, + -16, 171, 25, 148, 74, 28, 159, -52, 30, 8, + 69, -28, 173, -13, 5, 15 + }, + { + -182, 8281, 344, -5029, 1114, -1, 334, -22, 483, 354, + 673, -691, 46, 363, 191, -324, -212, -525, 79, -550, + 156, -41, 738, 599, -551, 147, -258, 0, 492, -75, + -331, -403, 536, -272, -158, -125, 105, -135, 367, -47, + 88, 110, -232, 169, -119, -31, -543, -68, 105, -61, + -63, 168, -42, -193, 16, -193, -95, -162, 239, -242, + -84, 168, 26, 59, 64, -45, -239, -9, 51, 185, + 28, 52, -113, -108, -49, -173, -132, -146, -57, 23, + 265, -168, 54, -159, 97, -43, 145, 19, 101, -54, + -141, 43, 41, 10, 57, -24 + }, + { + 21, -473, -70, -2572, -1204, 37, 536, -192, 283, -574, + 723, -745, 351, -131, -531, -83, 37, 265, -230, -347, + -56, -425, -10, -686, 694, 108, 277, -526, -252, 372, + 105, -344, 31, -40, -249, -320, -388, 603, 22, -40, + 377, -134, 215, 108, -253, 92, 170, 186, 359, -166, + 435, 191, 366, 150, 579, -85, -98, -286, 99, -11, + -45, -83, -48, 118, 115, -147, 238, 85, -38, 173, + -98, 136, -61, 16, 135, -72, -39, 120, 104, -45, + -29, 48, 67, -158, -144, 107, 52, -3, 28, -11, + 157, 26, 10, 6, -13, 19 + }, + { + 47, -2168, 1877, 327, -192, -232, -72, 70, -467, -698, + -200, 939, -4, 75, 205, -369, -624, 1093, -1057, -172, + -31, -441, -644, -45, -180, -670, 749, 299, -192, -277, + -484, 31, 266, -30, 133, 444, -572, 103, -66, 12, + 402, -198, 91, 15, 144, -264, 39, -129, 121, 477, + 364, -390, -52, 239, -200, -266, -56, -28, -135, 128, + 236, 28, -189, 46, 26, -215, 107, -45, 96, -286, + 86, -46, 83, 95, -69, -176, 98, 68, -34, 17, + -15, -81, 10, 127, -136, -86, 16, -10, -63, -16, + -53, 6, 28, -205, 55, -120 + }, + { + 1020, 2668, -2683, -356, 226, 375, 469, -172, 486, 277, + 476, -306, -334, -602, -587, 223, 575, -644, 1147, 533, + 89, 10, -115, 161, 186, 218, -194, -43, -442, -300, + 298, -13, 71, -11, -397, -252, -156, -76, -46, 108, + -76, -137, 182, -53, 198, -22, -105, -49, 179, -177, + 627, 142, -387, -90, -178, 227, -45, -64, -157, 85, + -91, -14, 186, -289, -63, -10, -98, -120, -41, -34, + 219, 137, 104, 27, -170, -54, 219, 34, -102, -99, + -110, -99, 216, -67, 44, 65, -40, 13, -3, 32, + -14, -5, 78, 23, 103, -16 + }, + { + -152, 629, -1149, 246, 650, -180, -30, -45, -59, 455, + -265, 354, -199, -140, -385, 286, -322, 27, -350, -724, + -1166, -672, -450, -616, 391, 480, -175, -304, -179, 1530, + -296, 220, -47, -258, -275, 242, -254, 304, 326, 143, + -293, -100, 230, -39, 347, 197, -136, 83, -113, 307, + -90, -78, -13, -100, -162, -111, -126, 0, -106, 286, + 311, -36, -142, -61, -184, 196, 89, 151, 31, -90, + -5, -73, 48, 66, 75, -24, -98, -225, -44, -49, + 253, -197, -63, 56, -84, -184, 158, 42, 41, -102, + -128, 13, 30, -79, -24, 120 + }, + { + 1106, 629, -1040, 113, 1078, 101, 192, 247, 789, 132, + -73, -1143, 30, 510, 495, -374, -341, 222, -461, -158, + -412, 222, -92, -303, 617, 363, 741, -368, 638, 64, + 447, -589, -327, -195, -261, -10, -128, 48, 288, -146, + 84, -23, 1, 300, 152, 182, -125, -256, -13, 86, + 208, -327, -161, 5, -120, 278, -236, 213, 186, 88, + -385, -86, 146, 197, 209, -101, -76, 112, -93, 172, + -108, 117, 155, 15, 50, -74, 22, -11, 78, 53, + 44, 27, 42, -140, 15, 153, -98, 103, 143, 1, + -83, -13, 44, 13, -9, -17 + }, + { + -184, 2842, -1597, 54, 436, -9, -298, 39, -258, -71, + -181, 640, 786, 239, 25, 1192, -874, 332, -1088, -519, + -62, -343, -207, 729, -665, 261, 188, -392, 577, 100, + -166, 342, 121, 132, 68, -77, -41, -174, -273, 320, + 233, 31, 211, 182, 205, 70, 527, 97, -264, -53, + -265, -304, 160, -340, 49, 251, 249, -32, -61, -93, + -292, -21, -172, 89, -40, -151, 45, 233, 50, 27, + -98, 27, -92, -112, 34, 241, -123, -5, -161, -168, + -180, 19, -4, 20, -60, 47, -98, -152, 53, 57, + 18, 18, -110, 60, 51, -40 + }, + { + 1097, -222, -1239, 406, 709, -389, -117, 116, 289, -25, + 323, -521, -402, 972, -262, 1130, -358, -20, -614, 307, + 413, -686, 444, -384, -102, 513, -389, 340, -124, 110, + 55, 211, 228, -249, 35, -80, 469, -379, 533, -78, + 334, -190, 27, 33, 130, 59, -59, 314, -144, 25, + -27, 43, -84, -180, 111, -132, -23, -110, -191, -452, + -15, -101, -311, 17, -176, 247, 35, -79, 3, -71, + -25, 22, 132, 32, 208, -152, 112, -75, 29, -53, + -8, 64, 5, -107, -125, 77, -17, -16, -6, -4, + 7, -77, -26, 79, -100, 26 + }, + { + 28, -189, 1874, -748, -230, -377, 1407, -361, 214, -402, + -158, -931, 81, 515, 339, 314, 1323, -706, 314, -731, + -363, -218, 43, 649, 553, -134, -91, 247, 583, -419, + -702, 92, 223, 366, -712, -97, 239, -560, 4, -188, + 152, -127, 486, -10, 299, -350, 361, -342, 368, 47, + 283, -169, -272, -170, -74, 388, -174, 120, -201, 224, + -193, 76, -283, 61, -182, 63, -150, 13, 51, -225, + -77, 113, -129, 91, 139, 68, -5, -63, -20, -118, + -24, -25, -127, 221, 119, 184, 42, 260, 129, 76, + -6, -28, 123, 62, -12, -9 + }, + { + 516, 6635, -1517, -227, -174, 579, 20, -370, 516, -1288, + -831, 21, 79, 350, 761, 439, -316, -809, 381, -198, + 35, -351, -125, 141, 150, -117, -713, 188, 410, -385, + 107, -257, 476, 50, 555, -378, 455, 261, 554, 233, + -34, 127, -437, 121, 150, 319, 286, -182, 10, -106, + -454, -163, -285, -132, 31, -261, -152, -157, -555, -91, + -141, 192, -88, -219, -100, -337, -121, 263, 57, -86, + -198, -3, 58, -38, -111, 50, 21, 126, -152, 220, + -70, -185, -238, 124, -113, 117, 28, 144, -18, 28, + -17, 85, -175, 106, -9, -66 + }, + { + 15, -1951, 1040, -571, 629, 44, 143, 117, 11, -231, + -898, -13, -334, 312, 46, 748, 126, 581, -697, -289, + -148, 567, -235, 602, -1050, -158, 217, -242, 817, 229, + -14, 303, -285, 357, 344, -152, -562, -82, 195, 241, + 619, 104, -95, 260, 64, -336, -177, 240, -91, -6, + 411, 92, 134, -397, 183, 14, 58, -396, -222, 153, + 52, -346, 105, -32, 116, 54, -504, -78, -161, -281, + 40, 45, 176, -358, -109, 251, -56, -51, 188, -130, + -116, 158, 44, -105, -128, 11, 36, -46, -3, -2, + 6, 71, -30, -13, -133, 41 + }, + { + 271, -8292, 139, -918, -55, 847, 425, 376, -560, 471, + -464, 444, -658, 113, -873, -1157, 113, -119, 424, 623, + 902, 141, 228, 642, -572, 264, -595, -87, 522, 407, + -57, 224, -312, 11, 385, -103, 178, -166, -340, -251, + 122, -648, 103, 378, 397, -547, 24, -58, 644, -39, + 445, 256, -46, -265, 43, -439, 125, -523, -385, 44, + 334, 163, 106, 128, -66, -128, 55, 96, -240, -98, + 65, -15, -31, -45, -293, 196, -22, 66, -309, 14, + -105, 23, 34, 208, -10, -166, 4, 21, 113, 224, + -6, 47, 39, -30, -9, -37 + }, + { + 9, 2577, 733, -821, 42, 192, -569, -254, 442, -198, + 121, -303, 466, -178, 3830, -119, -1357, -128, 866, 492, + -403, 236, -400, 520, -485, 78, -732, 65, 490, -707, + -353, -378, 36, -327, 597, -214, -331, 86, 274, 41, + -24, 250, 332, 446, -186, -20, -245, -238, 52, 82, + 285, -207, 148, -18, -300, 336, 22, 6, -55, 294, + 272, -349, -321, 192, 69, 253, -58, 21, -48, -69, + 239, 44, -159, 65, -37, -28, -53, 56, -131, 29, + 175, 13, -130, -127, -69, 51, 127, -106, 7, -8, + -138, 109, -41, -79, 104, -296 + }, + { + 358, -6136, -1534, 398, -594, 14, 444, 620, -639, 154, + -148, -662, -386, -1022, 306, 234, 31, 139, 317, -278, + 584, -920, 827, -143, 103, 263, 19, -266, 112, -314, + -322, -431, 167, 321, 752, -352, -336, 225, 803, 329, + -54, 118, -302, -313, -224, -510, -323, 111, -272, 152, + 166, 140, -359, -196, -14, -219, 20, 150, 220, 122, + -52, 179, 135, 210, 74, 165, 260, 313, -298, -19, + -153, 90, 66, 144, 61, -170, -2, 71, -2, -139, + -134, 235, -32, -116, 36, -33, 140, 73, -28, -23, + 25, -28, 114, 77, 18, 64 + } + }, + { + { + 91, -1140, 2240, 1794, -603, 80, -180, 197, 292, 182, + 33, 318, 162, 83, -224, 126, -1041, -1107, -1087, -156, + 467, -635, 435, -167, 43, -354, 396, 184, 74, 629, + 75, 150, -167, 439, -402, -39, 467, 151, -88, 445, + 57, -25, 29, -44, 361, -118, 244, 322, -230, -307, + -381, -157, 150, -23, 158, -332, -161, -78, 189, 27, + -100, -106, 309, -131, -97, 274, -76, 96, 34, 49, + -51, -112, 123, 97, 84, -136, 73, -54, 175, 2, + 68, 248, -15, 57, -47, -4, 159, -102, 6, 91, + 54, -162, 10, -124, -4, 66 + }, + { + 430, 7517, -397, -3756, 2956, 378, -215, -1120, 87, 106, + 591, -876, -43, 102, -345, -412, -283, -602, 54, -557, + 595, 86, 614, 150, -785, 707, -10, -373, 218, -275, + -314, -492, 566, 47, 228, 273, 300, -495, -225, -289, + 8, 162, -252, 6, 26, 145, -146, 260, 55, -132, + -265, -143, -82, -7, 35, -371, 64, -40, 60, -135, + 77, 79, 19, -17, -128, 20, -35, 53, -9, 106, + -42, -28, -45, -108, -20, -14, 60, -13, 174, 57, + 76, -153, 86, -85, 10, -235, 160, 32, 43, -7, + -73, 38, -31, -65, 51, 13 + }, + { + 9, -5329, -2768, 936, 557, -117, 408, -492, -143, -506, + 369, -1196, 901, 480, 27, 226, 45, -91, -414, 162, + 427, -308, -266, -298, 369, -718, 89, -487, -301, 498, + 941, 79, -465, -417, 316, 273, 88, 814, -326, -153, + 445, -154, 15, -270, -17, 248, -326, -116, 385, -214, + 69, -21, 344, -170, 424, -13, 91, -218, -106, -33, + -18, -24, 10, 12, -129, -242, 74, -140, -31, 137, + -235, 128, -23, -126, 92, -146, -108, -49, -83, -15, + -12, 27, 53, -124, -38, 87, -50, -115, -71, -30, + 110, -95, -74, -16, -4, 21 + }, + { + 21, -3490, 844, 860, -108, -159, 98, 221, -13, -230, + -325, 841, -81, 128, 587, -245, -1027, 633, -640, -5, + 199, 218, -306, 269, 90, -1075, 258, 596, -33, -210, + -107, -194, 182, -183, -35, 362, -173, 542, 315, -306, + 101, -313, -80, 7, 200, 58, -15, -17, 252, -238, + 66, -70, -80, -163, -216, 112, 38, -42, 19, -23, + 108, 45, -225, 95, 48, -264, 190, 91, 265, -142, + 106, -57, 93, 51, -16, -17, -31, -81, -92, 38, + 66, -70, -11, 133, -113, -87, 57, 20, -139, -14, + -16, 33, 34, -70, 163, -126 + }, + { + -1060, 2394, -408, -839, -576, 112, 265, -875, -335, -76, + 959, -203, -251, -346, -341, 757, 605, -948, 1335, 1299, + 336, 18, -497, -611, -46, 217, -307, 331, 23, -46, + 372, -496, -45, -46, -312, 33, 243, 315, 324, 147, + 214, 103, 309, -221, -158, -15, 58, 13, 10, -215, + 441, 170, -138, 80, 38, 50, -210, 96, 36, 117, + -234, -157, 221, -82, 137, 14, -272, -89, -99, -111, + 87, -49, -135, 66, -103, -82, 202, -29, 47, 131, + -4, -130, 154, 15, 78, 103, 78, 57, -60, 49, + 41, -55, -112, -40, 95, 20 + }, + { + 5, 1532, -1391, -114, 51, -130, 33, -169, 127, 634, + -125, 612, -326, -667, -384, -234, -1254, -330, -300, -37, + -194, 106, -20, -208, 295, 550, 158, -231, -634, 775, + -733, 166, -40, -317, -289, -61, -519, 100, -222, -239, + -429, -116, 169, -221, 71, -46, -95, 36, -23, 34, + -379, -53, 136, -119, -10, -25, -117, 160, -49, 285, + 546, 148, -26, 58, -107, 11, -117, 5, 121, 2, + -13, -50, 77, -70, -58, -29, -117, -106, 132, -58, + 206, -74, -51, 50, 45, -166, 150, -40, 5, -99, + -158, 41, 117, 18, -106, 25 + }, + { + -1036, 137, 1826, -425, -63, -88, 234, 135, 183, -160, + 636, -1063, 319, 1215, 414, -35, -229, -165, -260, 449, + -227, 181, 592, 152, 386, 14, 734, -288, 428, -235, + 396, -704, -145, -191, -227, 342, -150, -275, 90, -137, + 404, 137, 13, 503, -23, 123, 57, -100, 379, 355, + 256, -241, 19, 52, -193, 516, 97, 96, -27, 60, + -162, 66, 32, 62, 223, 107, 33, 29, 71, 345, + -71, 69, -56, -194, 126, 59, 33, -102, -58, -76, + -22, 52, 135, -96, 18, 228, -165, 18, 62, -54, + -68, 41, 47, -52, -26, 64 + }, + { + -98, 1677, -3497, -190, -109, 135, -126, 82, -400, -128, + -332, 1, 739, 484, -390, 575, -786, 18, -974, -103, + -125, -418, -374, 454, -1246, 98, 100, -1191, -408, 175, + -86, 409, 19, -38, -235, 2, -124, -302, -749, -3, + -156, -312, -212, 114, 145, -139, 550, 92, 164, 244, + -266, -485, 276, -116, -146, -94, 15, -104, -33, -46, + -362, 192, 62, 258, 5, 42, 34, -21, -133, 96, + -69, -38, 44, -25, 30, 156, -148, 94, -107, -72, + -173, -59, 33, 83, 3, 19, -83, -103, -1, -12, + -50, -9, -68, -41, -6, 41 + }, + { + -1080, -575, 1779, -606, -330, -45, 31, -305, -228, -179, + 1412, 281, -411, 1318, -293, 615, -1771, -652, -841, -256, + 232, -613, 457, -359, -231, 469, -634, 292, -563, -308, + -266, -309, -213, -139, 471, 168, 350, -620, 253, -518, + -220, -306, -70, 68, 45, 95, 170, 204, -37, 138, + -67, 16, -1, -238, 102, -46, 42, 1, 81, -249, + 93, 24, -151, 109, -198, 213, -24, -117, 117, 70, + 139, -35, -114, -111, 144, -75, 255, -26, 26, 29, + 132, 75, -54, -99, 52, 153, 33, 13, 30, -86, + -22, 9, -34, 71, -42, 88 + }, + { + 73, -3104, 5, -290, 366, 103, 1230, -1194, -246, -456, + 107, -479, -42, 247, 268, -696, 642, -441, 593, -32, + -106, -4, -171, 582, 649, -37, 398, 223, 483, 219, + -188, 792, 223, 302, -290, -110, 289, -381, -408, -589, + 334, -242, 319, 25, 516, -224, 255, -335, 181, -575, + -100, 44, 32, -130, -218, 504, 50, 345, 35, 117, + -257, 129, -296, -32, -9, 167, -177, 48, 46, -323, + -165, -75, -210, -133, -114, 73, -2, 47, 101, -158, + -189, -200, -239, 149, 37, 75, -132, 55, 47, 64, + -38, -13, 83, 136, 33, -104 + }, + { + -502, 6019, -1396, -607, 283, 229, -1505, 879, 2657, 148, + -1035, -369, 235, 602, 496, -443, -466, -834, 10, -250, + 321, 0, -176, 135, -264, -308, -192, 386, -185, -935, + -79, -275, 479, 200, 556, -487, 56, -623, 12, -313, + -122, 202, -459, 277, 142, -1, -464, -528, 248, -47, + -301, -22, 75, -9, 133, -119, -3, 0, -423, 239, + 6, 351, 160, -35, -10, -65, -19, -73, -165, 11, + -105, 117, 179, -82, -144, 50, 53, 166, -161, 153, + -53, -10, -180, 148, -210, -4, -102, 47, -104, 35, + -107, -38, -109, 162, 41, -77 + }, + { + 51, -3050, 642, -402, 252, -659, -127, 244, 146, 48, + 274, 680, -47, 315, -490, 229, -81, 472, -612, -71, + -394, 536, 5, 590, -167, 355, 359, 177, 897, -108, + 138, 942, 75, 534, 374, -304, -270, 788, 513, 335, + 604, 112, 358, 376, 90, -334, 44, 735, 106, 20, + 370, -100, 70, -311, 43, -262, 134, -197, -196, 6, + 192, -218, 288, 264, 223, 68, -318, -64, 74, 40, + 79, 42, 192, -229, -168, 57, -31, 105, 266, -249, + -199, 105, 44, -43, -26, 76, 125, 86, 4, -33, + 119, 120, -40, 163, -31, -63 + }, + { + -71, -6845, 2016, -601, -685, -743, -1556, 401, -242, 447, + -1342, -487, -462, 558, -763, -600, 204, -358, 172, -632, + 144, 85, -364, 477, -666, 69, -788, -443, -52, -17, + 314, -25, -675, -373, 269, 186, 104, -51, -169, 176, + 503, -492, 75, -87, 228, -176, 159, -344, 378, 146, + 345, 107, -137, -398, 176, -252, 320, -152, -114, 151, + 188, -98, 42, 174, -162, -158, 262, 244, 133, 291, + 294, 224, -2, 86, -192, 317, 168, 122, -118, 60, + -248, -64, -68, 225, 9, -170, -45, 0, -43, 69, + -61, 64, 192, 159, 74, -32 + }, + { + 122, -151, -976, -181, -121, -327, -697, 131, 750, -143, + 135, -406, 507, -1213, 1698, -359, 54, 243, 406, -138, + -775, 130, 14, 87, -1038, 503, 56, 246, 410, -1469, + -798, 270, 790, 35, 489, -155, 73, 136, 160, -247, + -416, 82, -173, -54, -335, 38, 42, -117, -230, -239, + 392, 202, 118, -44, -79, 179, -209, 87, -46, 300, + 65, -359, -184, 276, -57, 66, -128, 27, 22, -39, + 151, 38, -159, 8, 40, 2, -126, 12, -18, 220, + 256, 69, 14, -71, -10, -58, 4, -74, -74, -45, + -100, -6, -57, 2, 125, -231 + }, + { + -281, -4271, 550, 129, 535, 188, -1157, 195, -523, -7, + -316, -1010, -156, 331, 1231, 224, 57, -507, 49, -108, + 1084, -41, 1772, 589, -44, -418, -81, -98, 209, -603, + -1220, -885, 285, 571, 211, -489, 189, 556, 649, 98, + 39, 361, -318, 160, -34, -533, 163, 712, 144, 52, + -440, -15, -214, -53, 38, -262, -59, 121, 124, -15, + -134, 20, -242, 23, 11, 84, 236, 422, -61, 76, + -52, 147, 105, -6, -116, -272, -115, 118, -36, -265, + -142, 286, -23, -32, 83, -14, 170, -19, -132, 81, + 185, 69, 92, 52, 47, 27 + } + }, + { + { + -37, 2247, -193, 1595, 64, 16, -193, -113, 402, -234, + 683, -319, 678, 220, -619, -462, -532, -986, -809, -516, + 548, 97, -384, 596, -33, -37, -18, -16, 287, 4, + 554, -146, 312, -67, -163, -109, 91, 418, -75, 361, + -22, 139, -140, 16, 418, -119, 58, 382, -107, -471, + -261, -3, -16, 122, 141, -247, -363, -80, 115, 74, + -27, -32, 290, -183, -56, 198, 23, 69, -51, -11, + 143, -181, 25, 244, -75, -63, 16, -79, 127, 135, + -105, 254, -13, 110, -42, 34, 34, -40, -10, 84, + -4, -26, -108, -93, -6, 15 + }, + { + -639, 4918, 2878, -1221, -36, 386, 98, -1318, -316, -345, + 238, 453, -134, -256, -724, 84, -91, -390, -36, -122, + 102, -50, 323, -45, -175, 132, 349, -698, -73, 31, + -328, -95, 37, 295, -30, 632, 401, -294, -599, -135, + 135, -28, 156, -299, 122, -2, -57, 283, 202, -233, + -72, -331, -215, -42, 131, -196, -106, 121, -332, -15, + 238, 57, 27, -53, -200, 80, -11, 2, 63, -102, + 26, -82, -21, -100, 28, -7, 113, 87, 36, 39, + -28, -25, 20, -55, -27, -103, 34, 83, -24, 5, + -47, -33, -10, -34, 79, -29 + }, + { + -44, -7356, -617, 2340, -589, 323, 239, 97, -933, 367, + 0, -985, 564, 177, 348, 210, 14, 44, -323, 445, + 261, 66, -620, -18, -146, -458, -323, -120, 71, 170, + 637, 219, -175, -484, 390, 325, 312, 295, -241, -7, + 265, -122, -101, -39, 130, 249, -489, -173, -26, 187, + 66, 1, 45, -16, 68, 87, -11, 57, -372, 52, + -18, 116, 21, -59, -142, -93, -70, -156, -32, 69, + -66, -101, 104, -67, -48, -59, 14, -81, -68, -31, + -51, 80, -59, -31, 38, -1, 3, -128, -140, 40, + 2, -35, -88, -25, 10, 6 + }, + { + -23, -1897, -724, 967, -11, -53, 106, 6, 216, 25, + 105, 495, -118, 239, 109, 188, -512, -254, 42, -160, + 311, -444, 300, -328, 179, -275, -537, 248, 415, -604, + 610, -354, -35, 22, 95, -53, 520, 164, 370, -104, + -377, 172, -349, 122, -3, 228, -110, -72, 13, -194, + 98, -53, -111, -206, 34, 77, 156, -183, 55, 10, + -64, 196, -196, 18, 132, -159, 33, 109, 145, 189, + 61, 17, -14, 97, 33, -5, -54, -186, 18, 111, + 33, -9, -73, 62, -60, -108, 64, 16, -146, -28, + -10, 15, 11, -36, 129, -56 + }, + { + 909, -350, -890, -531, 113, -122, 168, -501, -726, 0, + 213, -62, -140, 98, -248, 52, 842, -13, 703, 922, + 351, -130, -305, -224, -337, -42, -296, 819, -193, -266, + 361, -452, -258, -112, 161, -105, 589, 235, 133, 556, + 25, 149, 99, -106, -281, 48, 9, -43, -54, 347, + -3, -78, 162, -41, 191, -75, -2, 118, 86, -155, + -109, -85, -126, 100, 131, 1, -241, -48, -32, -21, + -42, 10, -67, -106, 47, -152, 156, -10, 58, 158, + -61, 29, 19, 123, -65, 187, 31, 104, 15, -18, + -14, -28, -145, -7, 71, -13 + }, + { + 104, 256, 127, -455, -200, 98, -7, -154, 221, 317, + 225, 199, -296, -395, -723, -124, -555, -720, -345, -200, + 151, -150, 117, 149, -9, 159, 283, -25, -212, -695, + -24, -215, 270, -320, -204, 20, -315, 8, -231, -108, + -319, -119, 136, -275, -16, -244, 383, -225, 10, -100, + -322, 55, 172, -3, -111, 61, -157, 136, 121, 146, + 466, 147, 4, 109, -10, -145, 12, 52, 67, 18, + -82, 11, 55, -133, -16, -51, -111, 0, 101, 36, + 46, -11, -15, 18, 52, 8, 24, -74, -80, -12, + -53, -68, 101, 59, -110, -61 + }, + { + 725, -1884, 643, -194, 647, -138, 145, 875, -677, -512, + 351, 44, 258, 1387, -113, 339, -211, -647, 704, -224, + -72, -84, 831, 249, -109, 166, 303, 417, -32, -307, + 237, -752, -307, 283, -20, 320, -365, 27, -267, 29, + 351, 328, 184, 403, -90, -174, 208, 61, 287, 315, + 230, -196, 80, 95, -147, 193, 310, -112, 77, -116, + -20, 82, 159, 1, 158, 13, 18, 152, 90, 185, + 189, -97, -115, -135, 161, -5, 40, -15, -80, -128, + 84, 70, -30, -25, 72, 86, -22, -33, -4, -26, + -24, 83, -36, 26, -34, -29 + }, + { + 209, -2111, -232, -494, -106, 41, 59, -173, -330, -171, + 81, -162, 19, 205, 1031, -327, 245, -191, -477, -476, + -828, 119, -342, 41, -869, -179, -374, -465, -330, 123, + 19, -40, -84, 205, -77, -181, -82, -370, -646, 274, + -159, -501, -250, 177, -151, 49, 373, 56, 345, 37, + -133, -254, 126, -115, 4, -105, -182, 6, -93, -39, + -114, 98, 190, 86, 43, 224, -74, -103, -61, 83, + 29, -149, 132, -32, 10, 99, -96, 40, -115, 37, + -32, -56, 13, -30, 122, -35, -118, -71, -16, -46, + -8, -6, -36, -28, -14, 46 + }, + { + 872, -2306, 318, -581, 86, 265, -56, -365, -443, 103, + 1272, 375, 160, 455, 458, -152, -1917, -388, -590, -351, + -23, -26, -48, -95, -1, -33, -92, 221, -358, -321, + -981, 51, -235, -94, 287, 395, -92, -557, 153, -133, + -677, 70, -97, -37, 144, 107, 176, 73, -37, 44, + 68, 7, 7, -149, 187, -198, 74, -149, 194, -86, + 97, -24, -46, 33, 51, -132, -188, 36, 89, -21, + 164, 41, -128, 36, -15, 6, 110, 64, -51, 171, + -29, 47, -8, -67, 134, 1, 67, -9, 39, -50, + -10, -44, -103, 97, 61, 9 + }, + { + -138, -2908, 9, -592, 318, 29, 639, -757, -207, 120, + -63, -316, -337, 470, -174, -483, 233, 63, -873, 1326, + -113, 104, 18, 262, 586, -11, -65, 453, 297, 342, + 135, 616, 238, -78, 290, -11, -154, -196, -216, -203, + 19, -3, 257, 283, -159, 192, 211, -15, -5, -632, + -23, -33, -118, 263, -28, 153, 283, 43, 275, -44, + -62, -186, 38, -110, 162, -57, -232, 54, -100, -82, + -13, -164, -137, -94, -253, 135, 32, -82, 161, -86, + -266, -46, -262, 1, -3, 20, -110, 60, 30, 74, + -67, 86, 42, 51, 66, -48 + }, + { + 449, 4476, -972, -388, -202, 861, -383, 1603, 731, 606, + -573, 10, 884, -349, -113, 128, -401, -615, -326, -183, + 265, 288, 294, -317, -390, -374, -304, 817, -565, -777, + 29, 327, -76, 35, 935, -122, -621, -480, -47, -605, + 25, 169, -205, 249, -43, -17, -662, -173, 151, -248, + 41, 16, 128, 77, 146, -116, -167, -112, 80, 17, + -54, 339, 194, -29, -21, 81, -35, -270, -104, 74, + -72, 175, -77, -36, -84, 36, 88, 74, -101, 77, + 62, -41, -84, -69, -52, -88, -76, -10, -2, -23, + -135, -60, -8, 40, 89, -78 + }, + { + -51, -2053, 34, -134, -402, -344, 86, -273, 456, -55, + 745, 408, 610, -515, -293, 76, -46, -154, -432, 452, + 242, 120, 183, -30, 492, 230, 493, 228, 477, -488, + 756, 582, 270, 331, 263, -394, 279, 689, 253, 348, + 139, 184, 386, 179, 219, -185, -3, 535, 275, -268, + 361, 274, -159, -155, -168, -135, 42, -29, -256, -56, + 318, -175, 270, 222, 237, -106, 63, -261, 194, -12, + 6, 130, 17, -33, -221, -144, 203, 50, 321, -358, + -76, 167, -56, -62, -8, 3, 126, 120, -41, 10, + 147, 51, 34, 90, 38, -72 + }, + { + -189, -3580, -645, 392, -1794, -982, -1321, -201, 436, -461, + -990, -401, -771, 1109, 378, -1228, -155, 55, -314, -142, + -104, 263, -131, -549, -78, -116, -554, -448, -130, -496, + 290, 187, -343, -317, -150, 261, 551, -508, -277, 688, + -17, -168, 82, -8, -144, 285, 5, 57, -180, 53, + 197, 55, -19, -144, -19, 121, 61, -176, 353, 5, + -57, 55, 33, 59, -120, -116, 171, 352, 118, 181, + 413, 16, 55, 88, 49, 139, 177, 136, -130, -10, + -130, -86, -185, 140, -28, 7, -117, 70, -44, -78, + 47, 50, 52, 164, 50, 29 + }, + { + -236, -1027, 100, 80, -326, -622, -312, 45, 358, 250, + -12, -260, 203, 948, -2610, 1020, 313, -45, -171, -240, + -781, 379, -506, -19, 6, 104, 251, 30, -355, -675, + -338, -1, 919, -153, 370, -127, 248, -24, -305, 242, + -521, -62, -199, 21, -394, 28, -80, 70, -392, 335, + -178, 432, -25, -52, 163, 12, -211, 112, 109, 91, + -141, -127, -209, 206, 83, -97, -91, 6, 111, -42, + 137, 146, -213, -15, -47, -43, 14, -35, 24, 133, + 197, 165, 61, -13, 38, -163, -54, -93, -6, -52, + -40, -75, -22, 54, 4, -52 + }, + { + 120, -3127, -66, 120, 450, -321, -789, -402, -360, -183, + -501, 102, -1086, 584, 1581, -383, 310, -638, 296, 31, + 203, 1006, 891, 437, 160, -398, 28, -94, -356, -243, + -442, -1342, 470, 480, -220, -256, 317, 396, 181, 539, + -301, 191, -88, 280, -268, -126, 27, 620, 10, -166, + -198, -16, -59, 62, -244, 86, -364, 300, -82, 15, + 89, -141, -120, -250, 49, 153, 191, 324, 105, 96, + -163, 42, 34, -72, -47, -130, -158, -80, -81, 13, + -159, 139, 45, 122, -6, 63, 81, -30, 21, 74, + 49, 75, 85, 132, -10, 22 + } + }, + { + { + -35, 3519, 277, -602, -441, 292, -114, -277, -144, -926, + 227, -816, 202, 38, -520, -433, -361, -287, 31, 283, + 364, -358, -309, 1237, 390, 437, 139, -195, 77, -122, + 45, -711, -109, -172, 422, 84, -514, -85, -236, 57, + -351, 122, -10, -36, 97, -319, -138, 82, 41, -264, + 29, 43, -68, 91, 44, -86, -403, -257, 34, 93, + 292, 289, 230, -175, -60, 75, 105, 57, -148, -55, + 121, -118, 40, 198, -57, -26, -71, -215, 29, 97, + -207, 161, 57, 150, -21, -19, -41, 25, 28, 103, + 26, 44, -9, -32, -61, 23 + }, + { + 762, 1296, -2086, -1147, -735, -214, -64, -797, -206, -413, + 996, 1640, 215, -19, -456, 406, -49, -354, 736, 538, + -206, -616, -333, -146, 347, 256, 271, -1047, 22, 237, + -136, 739, -21, -167, -355, 472, 583, 324, -111, 16, + 69, 121, 159, -501, 41, 28, 77, 54, 65, -24, + 145, -266, -279, -85, 193, 1, -154, -79, -219, 159, + 200, -13, -70, -238, -358, -86, 31, 86, 102, -13, + 125, -225, -210, -181, 87, 3, -27, 52, -87, -63, + 1, -18, -6, -88, 11, 6, 58, 33, -103, -24, + -61, -103, -1, 53, 127, -9 + }, + { + -75, -5098, 1594, 3403, 154, 467, 161, -209, -698, 563, + -281, -1070, -102, -53, 283, -55, -224, 66, 239, 937, + 507, 198, -202, 317, -274, -386, -301, 82, 126, -251, + -192, 57, 210, -243, 412, 42, -67, 184, -29, 60, + 387, 180, -129, -281, -117, 74, -346, -222, -157, 126, + -42, 31, 11, 94, -58, -88, -111, 204, -105, 161, + 35, 92, -68, 2, -44, 49, -6, -196, -117, 93, + 64, -107, 85, -16, -25, 108, 244, 87, 16, 26, + -32, 51, -93, 58, 64, -35, 60, -5, -14, 44, + -25, 35, 57, 25, -38, 29 + }, + { + -86, -287, 324, 516, -27, -9, 65, -86, -116, 331, + 329, 35, -139, -72, -617, 191, -46, -375, 108, -116, + 99, -413, 463, -886, -175, -34, -641, -378, -71, -512, + 1112, 71, 57, 273, 101, 91, 381, -372, -56, -85, + -102, 109, -520, 204, -253, -4, -189, -91, -44, -70, + 236, -44, 102, 217, 180, 0, 115, -94, 2, -78, + -171, 314, 1, 66, 77, -166, 21, 32, 24, 291, + 136, 25, -101, -19, 18, 162, 54, -148, 111, 45, + 5, 238, 7, -29, -41, -151, -23, 6, -97, -29, + -34, 4, 54, -44, 79, -18 + }, + { + -593, -2307, -106, -229, 66, -103, 222, -47, -239, 298, + -465, -45, 281, 622, -209, -347, 614, 317, -146, -705, + 59, 55, -269, 235, 187, 201, 246, 944, -316, -661, + -250, -532, -242, -282, -180, -482, 217, -44, -355, 35, + -488, 75, 234, 344, 169, 2, 0, 101, -61, 333, + -165, -166, 122, 28, 223, -12, 204, 77, 19, -301, + -146, 17, -146, 158, 67, -123, -33, -12, 61, 146, + -19, 57, 113, -141, -23, -134, 175, -9, -12, 84, + -82, 15, -2, 142, -137, 49, -80, 116, 105, -20, + -35, -36, -83, -42, -18, 1 + }, + { + 6, -144, 849, -354, -220, 243, -5, -244, -150, -234, + 2, 350, -272, 79, -396, -149, -27, -414, 39, -258, + 77, -84, -26, -360, -2, 226, -216, -319, -123, -1264, + -185, -199, 207, 144, 287, 553, 64, 191, 375, 502, + 402, 487, 462, -292, -91, -216, 364, -170, 141, 157, + -175, 152, -72, -84, -30, 138, 18, 223, 120, 21, + 260, -5, -31, 75, -54, -179, 83, 123, -35, 36, + 115, 64, 67, -12, -10, -107, -15, 79, 14, -6, + 20, -101, -57, -35, -6, 124, 64, -58, -147, -88, + -35, -81, 18, -29, -72, 6 + }, + { + -228, -4063, 524, 47, 6, -332, -577, 103, -506, -74, + 482, 1155, 179, 177, -384, 531, 310, -148, 578, -108, + 221, -302, 175, -324, -462, 152, 463, 867, -207, -423, + 179, -877, -390, 448, 206, 352, -384, 420, 73, 346, + 316, 185, -211, -165, -287, -372, 37, 25, 36, -42, + -10, -169, -40, 1, -89, -49, 74, -303, -73, -217, + 56, 117, 180, -120, 9, -96, -35, 220, 155, 63, + 21, -151, 32, 74, 150, 6, -1, -76, -20, -109, + 121, 55, -117, -36, 100, 65, 70, -28, -34, 32, + 35, 156, -41, 39, 23, -75 + }, + { + 51, -2154, 1510, 366, 5, -242, 158, -20, -116, -66, + 257, -269, -819, 107, 1801, 54, 821, 155, -564, -648, + -855, 592, -235, -69, -598, -110, 203, 449, 79, -499, + -52, 171, 151, 421, 169, 214, 241, -132, -161, 448, + 329, -21, -98, 68, -269, -13, -53, -145, 14, -204, + 164, -2, 112, 66, 92, 118, -100, -123, 10, 51, + 100, 172, 104, -90, -118, 171, 3, -48, 28, 89, + -6, -165, -84, -191, 89, 134, -57, 13, -133, 139, + 152, 85, 29, -149, 107, 36, -120, -28, 53, 25, + 15, 3, -61, -54, -58, 10 + }, + { + -492, -4388, 720, -53, -418, 33, -74, 312, -52, 149, + 39, -309, 464, 621, 601, -828, -1101, 912, 259, -64, + -316, -7, 55, 233, 315, -89, 163, 58, -368, -47, + -644, 381, 299, 53, -152, -190, -316, -322, 257, 81, + -273, 300, 120, 113, -171, -239, -15, -101, -145, 118, + 118, 21, -34, -105, 226, -272, 37, -295, 112, -125, + 130, 91, -20, -189, -99, -145, -201, -26, 19, 2, + 90, 28, 32, 113, 1, -60, -66, 75, -46, 85, + -122, -11, -69, -124, 41, -103, 31, -64, -23, 14, + 18, -89, -126, 11, -19, -46 + }, + { + 30, -2291, 150, -346, -17, -1160, -307, -149, 211, 448, + 171, -471, -626, 526, -165, 216, 179, 108, -634, 536, + -431, 399, -309, -667, -276, -539, -949, -110, -67, 210, + 220, 85, -324, -522, 125, 114, -70, 255, 304, 137, + 71, 154, 242, 179, -84, 524, 509, 285, 106, -334, + 318, 15, -102, 262, -272, -377, 79, -71, 200, -199, + 112, 152, 135, 14, 347, 106, -20, -17, -67, 205, + 139, 5, 90, 243, -75, 74, 41, -220, -55, -20, + -126, 136, -109, -44, -110, 12, -119, 60, -14, -37, + -37, 130, -27, 34, 111, -39 + }, + { + -494, 4175, 428, -49, -657, 1940, 1408, 2275, 179, 101, + -467, -298, 724, -120, 5, 421, 26, -87, -188, 355, + 553, 426, 487, -326, -111, -92, -176, 864, -109, -290, + 51, 224, -197, -13, 817, 286, -373, -309, -18, -500, + -16, 79, -32, 154, -115, 298, -262, 277, 395, -124, + 247, 66, 75, 88, 50, -202, -257, -150, -157, -140, + 75, 188, -178, -360, -146, 157, 27, -194, -63, 107, + -55, 79, -228, -14, -117, -129, -41, -35, -102, 76, + -34, -143, -15, -17, 139, 46, 2, 26, 34, 14, + -36, 96, 76, -46, 84, -66 + }, + { + -59, -1043, 480, 11, -319, -134, 267, -501, 364, -101, + 11, -205, -310, -1278, 39, 61, 100, 382, 162, 521, + 307, 38, -4, -591, -3, -131, -82, -543, 740, 592, + 312, -363, 314, 35, -465, -530, 469, 307, -428, -35, + -351, -234, -386, -489, 134, 112, 226, -68, -491, -327, + 305, 291, -87, -256, -174, -139, 58, 73, -36, 39, + 190, -251, 211, -22, 68, -108, 78, -311, 94, -93, + 18, 49, -155, 48, -96, -168, 114, -180, 94, -318, + -79, 103, -107, -72, -32, -19, 144, 119, -82, -96, + 94, 84, -4, -102, 56, 55 + }, + { + 490, -2041, -398, 764, -2470, -1161, -613, -595, 85, -706, + -170, 478, -546, 1618, 1203, -254, 847, 650, -79, -127, + -285, 504, 52, -659, 400, 396, 308, 98, -225, -758, + 50, 220, -53, -130, -119, 90, 302, -563, -317, 604, + -268, -125, 82, -151, -351, 258, 347, 236, -188, 84, + 74, -27, 145, 198, 135, 82, -115, -251, 386, 75, + -45, 43, -16, -139, 23, 200, 53, 106, -270, -217, + 108, -210, 73, 76, 129, 171, -13, -42, -182, -52, + 37, 26, -185, -14, -131, 36, -24, 62, -54, -120, + 8, -19, -100, 26, -4, 87 + }, + { + 222, -859, -280, 124, 78, -63, 41, -245, -110, 71, + -247, -17, 323, 793, -4174, -22, 94, 232, -226, 239, + -468, 118, -825, 410, 431, -67, -4, 256, -97, 28, + 300, -214, 384, -695, -110, -80, 172, -482, -369, 398, + -427, -78, -44, 492, -176, 208, 335, 137, -310, 710, + -137, 264, -38, 255, 204, -268, -135, 235, 60, 64, + -30, -86, -262, 58, -34, -110, -8, 5, 67, 30, + 104, 165, -48, 100, -7, 8, 19, -85, -95, 16, + 98, 112, -21, 16, 127, -69, -40, -34, 32, -15, + 149, 33, -33, 0, 41, 28 + }, + { + 173, -2770, -28, -47, -167, -208, 157, -95, -329, -221, + -145, 1159, -561, -1128, -743, -767, 515, -712, 288, -41, + -923, -64, -254, -172, -99, -601, 179, 199, -567, 189, + 403, -1204, 372, 604, 9, -229, -5, -338, -335, 149, + -687, -148, -187, 289, -91, 424, -2, 248, -346, -359, + -85, 61, 291, 248, -101, 454, -143, 245, -270, -27, + -13, -195, 108, -169, -112, -117, -181, 90, 255, 93, + -288, -96, -46, -62, 103, 73, 42, -24, -166, 134, + -22, 142, 81, 123, 91, 260, 100, 57, 67, -45, + -72, -18, -28, 70, 5, 116 + } + }, + { + { + 2, 2721, 847, -2459, 1160, -311, -3, 69, -664, -612, + -30, 46, -584, -168, -590, 51, -371, 137, -254, 518, + 435, -427, -111, 391, 342, 748, 181, -155, -325, 543, + -383, -371, -516, 7, 463, -167, -486, -140, 268, -146, + -234, -100, -183, 301, -51, -278, -268, -116, 166, -298, + 73, 77, 134, 136, -226, -73, -38, -310, -211, 141, + 336, 310, 39, -90, -11, 21, 176, 12, -138, -50, + -21, 225, -137, 54, 174, -178, -67, -137, 122, -77, + -51, 54, 146, 90, 10, -24, -14, 39, -27, 42, + 48, 15, 14, 72, -73, 49 + }, + { + -926, -598, 1542, 1237, -2883, -334, -794, 85, 113, -243, + 385, 1608, 457, 273, -29, -324, -111, 56, 463, 441, + 338, -752, -131, -252, 607, 33, -7, -648, 51, -33, + 103, 635, 94, -295, -333, 259, 483, 285, 82, 390, + 62, 272, -264, -419, -12, 42, 211, -228, -66, 453, + -152, -94, -180, -75, 53, -13, -96, -119, 4, -45, + 285, -160, 46, -368, -244, -214, 251, 81, 61, -50, + 77, -161, -144, -120, -109, 80, -69, -67, 43, 6, + -5, -26, -35, -111, 80, -65, 101, -44, -21, 25, + -63, -95, -39, 47, 101, -12 + }, + { + 305, -2611, -701, 3281, 89, 156, 247, -401, -476, 324, + -342, -796, -507, 115, -23, -260, 350, 22, -104, 948, + 1003, -313, 18, 195, -287, -129, -189, -148, 160, -98, + -642, 164, 511, 113, -284, 82, 45, 131, -13, 47, + 566, 37, -23, -122, -320, -397, 174, -200, -2, -89, + -33, -36, 184, 273, -168, -81, -34, 160, 63, -52, + 187, 45, -4, -129, 27, 98, -141, -60, -23, -31, + 64, 14, -7, -17, 9, 182, 145, -1, -46, 77, + 97, -17, -79, -9, 32, 50, 81, -43, 76, -55, + 89, -25, 49, -1, 54, -22 + }, + { + 169, 405, -274, -241, 480, -40, 41, 104, -442, 624, + 377, -427, 91, -572, -856, 546, -50, -188, -133, 229, + -9, -355, 127, -598, -287, 109, -526, -683, -559, 103, + 231, 732, -388, 487, 61, 306, 272, -170, -419, 33, + -47, -231, -268, 52, -371, 103, -103, 88, -40, -22, + 275, -19, -2, 196, 186, 19, -185, 225, -243, -27, + -16, 194, 182, 83, -106, 117, -118, -20, 20, 79, + 81, 206, -204, 8, -10, 127, 105, -29, -3, 35, + -50, 300, 70, -176, 7, -85, -34, -56, -5, -103, + -5, 46, 7, -26, 25, 28 + }, + { + 166, -3656, 8, -346, 570, -53, -267, 204, 95, 83, + -858, 773, 448, 402, 96, -283, 133, 49, 51, -631, + 50, 333, -756, 409, 674, -319, 1202, -109, -131, -583, + -305, -379, -318, -134, -256, -312, -384, 144, -235, -240, + -534, 193, -10, 264, 483, -46, 92, -41, -4, 134, + 158, -151, -143, 93, 119, 287, 15, 116, -136, -236, + -41, -99, 62, 73, 82, -298, 126, -3, 120, 94, + -28, -30, 160, -74, -130, -64, 96, 23, 1, 7, + -10, -83, 77, 34, -34, 28, -98, 80, 101, 8, + -11, -18, -69, -82, -25, -3 + }, + { + -95, 341, 163, 48, -92, 74, 85, -263, 32, -254, + -314, 512, -186, -879, -569, 200, 566, 141, -24, -100, + -560, 248, 474, -1096, 209, 338, -522, 30, -36, -823, + -260, 32, -398, 189, 242, 575, 37, 82, 332, 387, + 895, 412, 187, -140, -249, 4, 75, 116, -37, 204, + -26, 104, -163, 167, -7, -76, 169, 211, 134, -20, + 86, -46, 66, -98, -6, -75, 86, 59, -14, -18, + 164, 143, -211, 96, 29, -101, 140, 70, 17, -150, + 84, -113, -189, 21, -8, 105, 121, -61, -192, -95, + -19, 13, -36, -112, 25, 31 + }, + { + -408, -4300, 267, -229, 603, -199, -434, -939, 477, 510, + -610, 1434, 518, -346, -206, -52, 256, 618, -135, 186, + 312, -118, 124, -538, -282, 411, 629, 640, -293, -176, + -449, -239, -297, 236, 87, 167, -130, 376, 206, 303, + 393, -141, -1, -444, -415, 151, -510, 182, -25, -243, + 274, -271, 51, -52, -47, -159, -34, -120, -292, -73, + 92, -7, 188, -18, 75, -99, -103, 95, 135, 141, + -50, -51, -33, 136, -26, 103, 109, -151, -54, -50, + 74, 122, -142, 5, 0, 62, 109, 7, -82, 90, + 47, 19, -6, 17, 56, -83 + }, + { + -213, 705, -22, 589, -427, -210, 249, -185, 304, -44, + -281, -141, 121, -133, 887, 428, 187, 775, -837, -537, + -425, 264, -56, -64, -551, 24, 377, 687, -333, -753, + -172, 319, 353, 76, 172, 441, 207, -154, 260, 56, + 206, 387, -361, 328, -384, 121, -252, 32, -122, -160, + -16, 244, 58, 91, 204, -127, 211, -382, -59, -94, + 375, 143, -209, 243, -274, 147, 23, -100, 148, -157, + 24, -53, -133, -103, 177, -73, 14, -41, -85, 139, + 57, 70, 5, -54, 77, 43, -134, 1, -30, 131, + -40, 47, -43, -96, 1, -81 + }, + { + -94, -5380, 317, 270, 451, -332, -237, 326, 190, 455, + -1022, -1, 904, 429, -14, -179, -532, 572, 628, 109, + -358, -131, 91, 49, 160, -91, 481, -177, -157, -380, + -16, -220, 649, -102, -198, -545, 90, -78, 305, -351, + 190, 235, -51, 151, -252, -179, 51, -328, -27, 104, + 31, 123, -65, -206, 194, 22, -63, -111, -110, -210, + 189, 98, -34, -196, -199, 59, -127, -62, 88, 54, + -103, 72, 163, -24, 83, -96, -34, 116, -44, -38, + 17, -135, 25, -147, -36, 0, -57, 23, -72, 1, + 77, -137, -88, -68, 2, -53 + }, + { + 137, -2211, -54, -7, -232, 80, -1512, -312, 215, 811, + -196, -588, -998, 567, 42, 989, -539, 362, 229, -838, + 277, -47, -184, -228, -1092, -260, -988, -572, 78, -58, + 11, 96, -176, -311, -371, 121, -10, -20, 466, 191, + 98, 155, 166, -243, 273, 349, 524, 557, -426, 164, + 223, -88, 234, -244, 22, -351, -60, -47, -105, 72, + -45, 258, 6, 180, 257, 57, 155, -65, 53, 76, + 35, 103, -13, 295, 174, -176, 138, -178, -144, 5, + -123, 178, -93, 30, -150, -52, 0, 1, -39, -30, + 18, 56, 2, 5, 75, 41 + }, + { + 658, 4026, -630, -60, -1328, 1746, 1064, 2587, -122, -243, + 331, -805, 489, 393, -469, 665, 20, 315, -618, 805, + 141, 703, 52, 259, -651, -90, 271, 438, 320, -49, + 122, -282, -290, 318, -149, 151, 260, -77, -216, 30, + -74, -194, -44, 98, -281, 498, 7, 312, 18, 368, + 221, -19, -243, 68, -10, 5, -298, -79, -265, -61, + 97, 21, -313, -155, -185, 122, -45, -97, 69, -14, + -20, -21, -124, 16, -115, -139, -82, -81, -24, 66, + -97, -88, 13, -19, 183, 134, -55, 19, 47, -85, + 48, 63, 78, -39, 71, -26 + }, + { + 166, -427, -218, -75, -327, -292, 479, -273, -23, 268, + -707, -186, 392, -1878, -143, 73, 381, -72, 559, -85, + 432, -116, 156, -435, -154, -271, -1080, -133, 986, 1064, + -444, -46, -125, 400, -646, -201, 648, -60, -343, 6, + -345, -351, -395, -386, 49, 402, 73, -453, -481, 128, + -147, 205, 45, -183, -145, -322, 194, -62, 212, 51, + 134, -231, 259, -96, 47, -41, -172, -64, -13, -169, + 232, -109, -207, 26, -78, 7, -79, -111, -108, -113, + -113, 22, -78, -89, 17, -27, 105, 114, -25, 3, + -68, 87, -15, -40, -13, 128 + }, + { + -834, -1140, 975, 103, -2438, 139, -1121, -133, -305, -891, + 307, -393, 458, 1284, 568, -341, 1275, 107, -32, 949, + -792, 576, -339, -443, 1105, 336, 520, 344, -584, -463, + 231, 132, -179, -156, -513, 466, 20, -432, 222, 9, + -139, 26, -210, -417, -31, -44, 623, 176, 107, -13, + -6, 403, -19, 167, 214, -40, -134, -82, 131, 243, + -247, 186, 155, -277, -94, 379, -121, 26, -120, -317, + -3, -190, 159, 145, 44, 86, -44, -99, 6, -165, + 55, 15, 32, -161, -89, -55, 60, -11, -67, 2, + 21, 4, -112, -60, 64, 38 + }, + { + -181, -1112, 450, -295, 84, 312, 144, 93, -647, -161, + -270, 463, -89, -2120, -119, 623, 579, -351, -81, 337, + -618, -110, 19, 410, 636, 88, -1042, 484, 26, -174, + 621, 37, -131, -287, -799, 351, -13, -466, 91, -330, + 285, -47, -187, 618, -99, 306, 307, -63, -96, 566, + -122, 245, -197, 264, 336, -224, -22, 84, -56, 185, + 265, -502, -126, 200, -185, 1, -122, 80, 76, 76, + -24, 137, 135, 36, -85, 75, -64, 78, -173, 77, + 102, 34, -35, 35, 24, 85, -84, 59, -58, -50, + 201, 23, 77, -77, 44, 9 + }, + { + -619, -2218, 346, -302, -103, 94, 58, 87, -363, 388, + -84, 746, -220, 66, -2752, -1298, -75, 56, -73, 255, + -1031, -115, -280, -578, -406, 70, -135, 467, -578, -226, + 218, -364, 297, 256, 259, -7, -30, -803, -99, 163, + -871, 72, -363, 375, 108, 429, -177, 323, -214, -412, + 226, -145, 268, 226, -53, 131, 96, 256, -260, 162, + -94, -147, -94, 65, -35, -336, -11, -141, 427, -134, + -135, -301, 208, 59, -43, 17, 82, 40, 4, -86, + 60, 97, 164, 61, 112, 177, 35, 165, -8, -14, + -86, -64, 44, 47, 3, 56 + } + }, + { + { + 95, 1068, -420, -2243, 848, -395, -185, 3, -211, 63, + -244, 573, -215, -379, -152, 572, 48, 534, -512, 260, + 521, -858, -408, 192, -31, 656, 9, -129, 85, 850, + -29, -8, -640, -220, 0, -236, 220, 194, 623, 444, + 172, -232, -468, 283, -105, -318, -132, -83, 220, -138, + -18, 121, 175, -62, -140, 237, 310, 27, -248, -131, + 52, 99, -79, -238, -154, 160, 244, 82, -124, -311, + -178, 216, -124, -21, 200, -51, 154, 9, 94, -154, + 20, 107, 147, 18, 4, 18, -14, -63, -107, 35, + -12, -19, -17, 84, 30, 52 + }, + { + 1155, 938, 1094, 5799, 961, -300, -404, 192, -402, -410, + 144, 511, -235, 540, -1, -755, -384, 318, 83, -450, + 933, -50, 29, 41, 623, 35, -81, -642, 195, -52, + -115, 382, 40, -384, -303, 177, 501, 405, 134, 332, + -28, 214, -270, -258, -114, 118, 329, -148, -340, 135, + 37, 3, -202, -138, -92, -81, -79, 105, 123, -176, + 110, -107, 344, -101, 59, -43, 201, -78, 36, -60, + -38, -17, 86, -65, -154, 76, -82, -77, 216, 87, + -36, 57, -5, -48, 117, -80, 72, -32, 58, 141, + 62, -11, -24, -53, -86, -49 + }, + { + -467, -1317, 593, 470, -2027, -189, -372, 45, 85, 441, + -10, -1058, -556, 657, -216, -138, 337, -227, 10, 62, + 174, -141, 137, -195, -386, -56, 336, 61, -142, -262, + -401, 615, 738, 367, -322, 112, 41, 52, 109, 79, + 231, -253, 365, -71, -533, -312, 202, -98, 135, 89, + 137, 55, 404, 460, -10, -103, -68, 108, 89, 53, + 231, -36, -35, -44, -15, -49, -132, 119, 64, -165, + 67, 67, -112, -102, -111, -20, -15, -55, -9, 25, + -46, -84, 7, -33, -30, -62, -15, -116, 102, -34, + 63, -38, 27, 11, 7, -169 + }, + { + -132, 615, 119, -613, 119, -119, -45, 164, -418, 253, + -44, -500, -113, -279, -367, 226, 10, 514, -349, -271, + 306, -5, 385, -2, -190, 413, 59, -9, -452, -193, + -354, 320, -549, 290, -393, 106, 365, 176, -261, -200, + -271, -264, -300, -256, -503, 172, 137, 291, 196, 122, + 315, -88, -186, -172, -84, 19, -101, 188, -99, 366, + 329, 252, 180, 77, -59, 100, -176, -154, -158, -51, + -37, 139, -251, -81, -32, 71, 156, 98, -4, 68, + -132, 1, -45, -89, 76, 18, 18, -37, 25, -43, + -20, 40, 19, -36, 20, -9 + }, + { + 297, -3218, 545, -1077, -252, 47, -243, 153, 472, 333, + 179, 1745, 486, 232, 277, -239, -177, -244, 355, -113, + 366, 618, -741, -147, 370, -622, 801, -832, -472, -143, + 347, 66, -118, -84, -268, -304, -435, 86, -213, -225, + -156, 213, -81, 240, 360, -259, 176, -33, -212, -173, + 171, -72, -152, -75, -66, 213, -144, 170, 64, 54, + -21, -151, 131, 92, 203, -177, 69, -2, 25, -157, + -155, -91, 66, 4, -167, -90, 48, -60, -61, -70, + -14, -68, 41, -64, 38, 96, -141, 57, 126, 63, + 51, 40, -38, -90, -22, 43 + }, + { + -7, -107, -863, 336, 88, -66, 110, -207, 356, 19, + -496, 205, -240, 317, 317, -158, 621, 429, 68, 96, + -150, 592, 518, -486, 575, 768, -217, 343, -64, -533, + -181, -54, -473, -370, -428, -48, -440, -129, 102, 4, + 430, 159, -154, 4, 105, 192, 5, -94, -226, 130, + -15, 158, 54, 309, 117, 129, 145, -85, 54, -49, + -88, -108, 99, -180, 10, -53, -79, -104, -7, 7, + 25, -10, -235, 181, 130, 49, 144, -66, 58, -127, + 138, -29, -173, 22, -89, -10, 130, -7, -120, -51, + -18, 4, -16, -38, 75, 57 + }, + { + 1035, -2749, 427, -710, -313, -251, -499, -592, 561, 64, + -803, 894, 387, -477, -97, 670, -301, -363, -479, 195, + 658, 57, 24, 76, 1030, 496, 251, 314, 74, 231, + -140, 142, -144, 115, -180, -417, -269, 282, -295, -313, + 51, -415, -92, 15, -134, 148, -517, -24, 155, 137, + 393, -341, 10, 155, 40, -130, 8, 11, -273, -91, + 4, -100, 173, 20, 159, 83, -22, 189, 129, -31, + -140, -20, -169, -34, -119, 17, 123, -99, -81, -154, + 5, 126, -72, 123, 0, 45, 56, -16, -66, 111, + -23, -106, -84, 15, 28, -82 + }, + { + 4, 2304, 140, 185, -498, 38, 247, -244, 240, -242, + -275, 308, 521, 19, 463, 475, -329, -218, -526, 340, + 139, 423, 61, 110, -280, 495, 221, 197, -631, -645, + -207, -131, -135, -235, -205, 324, -302, -686, 217, 184, + 151, 520, -370, 481, -111, 54, -328, 64, 68, 205, + 27, -59, -143, -44, 105, -228, 191, -378, -39, -309, + 144, -147, -347, 332, -237, 139, -107, -33, 166, -258, + -18, -19, -2, 21, 83, -150, 58, -50, -189, -9, + -103, -88, 22, 50, 41, 22, -59, 49, -68, 83, + -142, -12, 85, 15, 3, -69 + }, + { + 867, -4377, 824, -469, -348, -284, -1013, -357, -315, -271, + -208, 468, 780, 443, -432, 1553, 380, -216, 377, 135, + -419, -77, 516, -89, -79, -328, 146, -173, -236, -281, + 111, -365, 563, 140, 164, -336, 345, 281, 436, -527, + 143, -1, -323, 146, -143, -60, 53, -327, -100, -160, + 85, 190, -64, -182, 359, 173, 20, 61, -55, -356, + -147, 87, 157, 210, 108, 333, 61, 16, 188, 49, + -130, 113, 119, -61, 56, -54, 90, 113, -78, -15, + 66, -68, 175, -102, -9, 102, -106, -26, -3, 9, + 118, -53, -19, -37, -55, -55 + }, + { + -199, -2206, 405, 21, -29, 1116, -736, -649, 350, 346, + -959, -421, -986, 467, 96, 164, -1503, 194, 811, -623, + 143, -237, -600, -167, -260, 431, -538, -418, -36, -421, + -246, -201, -573, -316, -433, -78, -206, -185, 425, -229, + -213, 108, -131, -646, 209, -98, 42, 375, -232, 380, + -54, -215, 99, -278, 263, 85, 286, -98, -277, 86, + -241, 29, -264, -32, 281, 45, -8, 11, 105, -127, + -217, 8, -33, 173, 166, -196, 206, 8, -166, -83, + -41, 224, -30, 85, -85, -43, 21, 13, -26, -57, + -50, -102, -8, -9, -42, 34 + }, + { + -858, 2378, -1109, 74, -1371, -765, -1333, 1593, -7, -102, + 549, -444, -115, -240, -909, 298, 243, 1038, -194, 520, + -205, 163, -878, 274, -638, -99, 538, 19, -66, 215, + -66, -740, -354, 316, -586, 41, 769, 390, 177, -11, + -248, 82, 102, -35, -250, 430, -104, 168, -65, 335, + 39, -187, -217, 111, 93, 192, -237, 104, -24, -9, + -80, -31, -92, 90, -132, 152, 37, -12, 78, 31, + 9, -70, 40, 193, -33, -134, -50, 41, 5, 38, + -92, -38, 122, 76, 103, 22, -172, -82, 42, -118, + -13, 23, 30, 13, 87, -6 + }, + { + -175, -457, 199, -270, -215, -68, 519, 17, 42, 494, + -877, -761, 435, -1446, -204, -134, 657, -582, -87, -739, + -223, -831, -111, -63, -154, -281, -624, 800, 979, 234, + -331, 203, -489, 51, -406, 131, 723, 68, -132, 463, + 69, -249, -82, 80, 128, 171, -367, -583, -192, 574, + -191, -87, 10, -61, 89, -299, 128, 10, 343, -46, + 121, -248, 276, 203, 184, -86, -221, 12, -34, -266, + 131, -85, 28, 103, -46, 190, -105, -142, -23, -37, + -174, 47, 2, 9, 69, -3, 104, 79, 29, 91, + -109, 43, -8, 4, -34, 132 + }, + { + 977, 698, 653, 568, -779, 1854, -288, 523, -455, -458, + 729, -304, 65, 181, -121, -1104, 475, -498, 98, 1296, + -673, 229, -93, 206, 1092, 202, 294, 655, 138, 214, + 457, 87, -141, -206, -496, 225, 263, 48, 23, -43, + -80, 261, 235, 54, 155, -195, 313, 109, 182, 221, + 127, 420, -60, -19, 298, 82, -16, -97, -152, 327, + -130, 121, 39, -111, 11, 112, -177, 64, 109, -35, + 19, -105, 108, 96, 39, 101, 17, -51, 11, -170, + 65, 25, 111, -29, 84, -66, -12, -33, 65, 206, + 101, 76, -28, -6, 75, 54 + }, + { + 217, -1149, 199, -158, -71, 201, -23, 288, -203, 26, + -155, 107, 54, 3024, 6539, -65, -491, -154, 491, -11, + -247, 335, 141, -320, 79, -51, -1465, -287, -440, -602, + 394, 134, 59, 494, -334, 147, -77, -531, 103, -352, + 230, 15, 66, 544, 47, 645, 205, -261, -316, 213, + -65, 158, -316, 204, 295, -128, 67, -130, -224, 171, + 127, -221, 49, 45, -181, 114, -27, 62, 128, 228, + -94, 18, 44, -48, 8, 150, -165, 123, 11, 146, + 100, -36, -7, 29, 3, 188, -37, 18, -103, -142, + 6, -77, 64, -135, 20, -7 + }, + { + 1010, -515, -410, -575, 964, 877, -153, 49, -457, 397, + -62, 959, 216, -386, -2673, 91, -394, -496, -344, 3, + -1070, -87, -53, -890, -589, -162, -35, 942, -526, -782, + -119, -201, 101, 138, 331, -134, -136, -686, -58, 772, + -49, 381, -610, 372, 351, 482, -172, 297, 26, 34, + 296, -256, 6, 75, 69, 167, 80, 78, -264, 213, + 78, 110, 94, 322, 89, -386, -1, -250, 60, -259, + 183, -3, 419, 72, -145, -194, 13, 110, -106, -194, + 76, 19, 19, -108, -11, -11, -88, 44, -81, 6, + -84, -92, 42, 71, -14, -98 + } + }, + { + { + -111, -854, 909, 691, -1490, 107, -418, -273, 199, 60, + -376, 604, 94, -199, -14, 42, -150, 214, 819, -231, + 108, -639, -494, 891, -314, 821, -12, -107, 241, 323, + 186, -60, -643, 71, 97, -676, 504, 562, 322, 194, + 126, -172, -288, 219, -208, 63, -367, 49, 69, -159, + -59, 103, 260, -373, 211, 298, 115, 172, 30, -209, + -299, 91, -54, -123, -259, 221, 77, 12, -59, -280, + 49, -48, 30, -76, 150, -97, 189, 16, 46, -161, + 79, 70, 130, 62, -84, 130, -97, -68, -111, 57, + -17, 9, -68, 54, 110, 28 + }, + { + -1321, 3816, 1196, 6881, 291, -657, 742, 13, -938, 314, + -544, -41, -107, 514, -174, -552, -417, 294, 55, -726, + 824, 683, -459, 265, 34, 375, -722, 0, 276, 70, + -504, 100, 172, -241, -190, 21, 360, 605, 244, 259, + 3, 145, -227, -69, -300, 413, 61, -107, -27, -306, + 219, -254, -38, -215, -158, 188, -192, 145, 203, -162, + -249, 294, 69, 45, 119, 126, -78, -77, 34, 151, + -243, -28, 120, -83, -26, -150, 81, -90, 223, 52, + -91, 103, 26, 13, -75, 147, -133, 201, -50, 75, + 41, 28, -56, 93, -182, -19 + }, + { + 465, -14, -1741, -2160, 467, -307, -836, 604, 58, 609, + -447, -607, -730, 993, -485, 406, -77, 201, -323, -400, + 682, -501, 383, -456, -180, 198, 326, 45, -201, -169, + 0, 258, 529, 552, 75, -194, 299, 123, -186, 268, + -231, 29, 83, -279, -150, 56, -205, 59, -101, 192, + 1, 148, 362, 510, 78, -213, -114, 122, -59, 283, + 22, 91, -41, 10, -41, -201, 62, 33, 128, -77, + -53, 53, -218, -64, -26, -77, 40, -88, 8, 101, + -113, -145, 52, -107, 22, -42, -93, -96, -1, 69, + 65, -14, -74, 38, 27, -165 + }, + { + 58, 1450, -635, -635, 41, -19, -63, -209, -13, 30, + 312, -240, -657, -213, 166, -37, -12, -173, 188, -113, + 263, 531, 278, -67, -155, 588, 259, 413, -627, -468, + -451, 361, -215, 193, -450, -245, 338, 54, -110, 212, + -417, -233, -354, -214, -153, -196, 278, 37, 332, 378, + 115, -376, -74, -95, -267, 51, 206, -98, 118, 342, + 489, 141, 90, -4, 154, -16, -36, -217, -185, 63, + 85, 64, -279, -77, 56, 4, 162, 43, 13, 98, + -31, -128, -137, 113, 18, -22, -27, 80, -99, 33, + -79, 40, 119, -1, -62, -51 + }, + { + -678, -1988, -27, -1516, 618, -58, 135, -264, 453, -343, + 1356, 837, 855, 149, 568, -297, 226, -1011, 251, 644, + -33, 451, -91, -291, -107, -461, -143, -916, 137, 290, + -70, 279, -186, -108, -234, -73, -210, -477, 295, -460, + 198, 73, 86, 357, -40, -5, 250, -51, -114, -485, + 269, -31, 207, -304, -123, 148, -231, 194, 108, 77, + 61, -177, 0, 4, 302, -40, 31, 143, -241, -60, + -140, -53, -93, -66, -71, 70, -29, -66, -125, -41, + -15, -72, 29, 44, -8, 12, -80, 79, 59, 112, + 121, 31, -129, -42, -48, 26 + }, + { + 91, -1290, 106, 122, 85, -74, 47, -285, 355, -19, + 203, -85, 50, 190, 82, -288, 862, 669, -632, 601, + 43, 202, -411, 1009, 152, 742, -171, 631, -638, -581, + -420, 52, 173, -453, -378, -214, -512, 139, 65, 331, + -536, 709, -336, -89, 314, -63, 211, -146, -101, 73, + -142, 153, 182, 305, 203, 241, -11, -229, -12, 124, + -55, -34, 14, -260, 135, -85, -114, -156, 134, 17, + -125, -139, 96, 79, 167, 12, 11, 43, 133, 14, + -91, 4, -100, 9, -1, -25, 105, -131, 17, -48, + -13, -14, -54, 38, 34, 74 + }, + { + -1364, 596, -737, -663, 553, -329, -225, -119, -311, -519, + 589, -117, -24, 301, -389, 613, -129, -314, -648, 112, + 985, -347, -82, 82, 1678, 33, 568, -229, 456, 118, + -541, 525, 186, 67, -140, -643, -121, 14, -303, -486, + -63, 27, -466, 302, 159, -188, -252, -84, 42, 437, + 175, -314, -139, 197, 88, -17, -132, 124, -209, 34, + -174, 36, 165, -59, 134, 253, 23, 111, 45, -82, + -53, -27, -171, 3, -144, -7, -31, 76, -29, -235, + 57, 21, 53, 122, -24, -31, 18, 64, -3, 10, + -50, 4, -134, 17, 50, -112 + }, + { + 187, 739, 795, -514, 188, 131, -69, 129, 66, -254, + -313, 653, -60, 319, 268, 295, 732, -566, -571, 156, + 429, 401, 497, -457, 183, 461, -569, 333, -810, -253, + 575, -846, -270, -483, 110, 588, -611, -520, -239, 480, + 119, -72, -57, 415, 130, -101, -241, 7, 39, 284, + 305, -526, 7, 10, -126, 56, -8, -255, 40, -316, + 87, -255, -207, 204, 31, 25, -135, 162, 56, -72, + -108, -39, 14, 94, -25, -111, -70, -30, -35, -80, + 9, -96, 25, -16, 76, 14, -76, 43, 22, -36, + -66, -113, 153, -14, 30, 24 + }, + { + -1638, -1293, -331, -1131, 1473, -205, -817, -578, -830, -466, + 1050, 73, 537, 881, -717, 749, 1057, -187, -162, 386, + -531, -133, 363, -76, -147, -77, -63, -106, -157, -134, + 135, 393, -79, 274, 180, -192, -155, 414, 173, 8, + 4, 3, -477, 129, 57, -441, 354, -105, -465, -136, + 327, 95, -6, -91, 301, 153, -15, -22, -65, -315, + -146, 163, 31, 523, 107, 37, 28, 0, 131, 22, + 11, 119, 122, 18, -84, 124, 44, -25, -153, 167, + -100, 27, 126, 59, 10, 62, -88, -59, 35, -30, + 85, 19, -40, -92, -13, -25 + }, + { + 188, -2086, 15, -9, 243, -226, 1225, -281, -556, -97, + -712, -107, -705, -84, 396, -383, -1441, -77, 451, -69, + -8, 246, -737, 85, -11, 148, -92, -556, -105, -311, + 79, -537, -924, 592, -282, -643, -170, 50, 173, -548, + 318, -31, 104, -380, -278, 70, 39, 180, 259, 66, + -325, 92, -76, -56, 266, 254, -66, 189, -255, -31, + -179, -16, -24, -255, 183, 193, -152, 60, -96, 25, + -149, -57, -43, 29, 166, -94, 145, -87, -105, -13, + 135, 122, -61, -23, 77, -141, 111, -44, 5, -110, + 46, -181, -11, 58, -115, 61 + }, + { + 1069, 2094, -2637, -1005, -278, -1714, -246, 826, 639, 433, + -340, -45, -507, -320, 322, -67, 122, 1189, -148, 217, + -225, -97, -629, -18, -54, -361, 231, 488, -948, 660, + -395, -291, 88, 125, -345, 91, 275, 204, 325, -80, + -283, 423, -17, 77, -143, 433, -126, -95, 150, 220, + -149, -274, 191, 124, -148, 71, 60, -80, 225, -108, + -159, 12, 131, 133, -200, 172, 14, -87, 150, -38, + 14, 3, 110, -48, 10, -19, -25, 49, -4, 84, + -150, 47, 127, 27, -7, -50, -26, -125, 27, -113, + -99, 5, 57, 106, 22, -19 + }, + { + 136, -137, -7, -475, -16, 37, 336, -4, 106, 315, + -388, -968, -554, -291, 99, -736, 499, -30, 368, -834, + -610, -760, -298, -737, 381, -140, -335, 1283, 808, -116, + 240, -62, -447, -443, 72, 195, -243, 233, 507, 313, + 209, -499, -128, 604, -121, 76, -256, -332, -131, 253, + -129, -18, -99, 20, 7, -175, 134, 31, 305, -171, + 24, 137, -27, 264, 214, -150, 148, -180, -101, 21, + -75, 55, -11, -41, 108, 173, -137, 32, -120, -6, + -131, -41, 179, -105, 155, -21, -58, 164, 11, 102, + -100, 37, 51, -14, -57, 39 + }, + { + -528, 3941, -736, 731, 253, 417, 124, 830, -223, -357, + 309, 396, 721, -1263, 461, -307, -689, -379, 569, 91, + 344, -61, -451, 1279, -378, 396, 655, 239, 34, 589, + 442, -375, 78, 119, -326, 109, 67, 214, -297, 245, + 132, 281, 12, 529, -286, 441, -285, 475, -232, 387, + 271, -97, 167, -13, 177, 55, 235, -33, -297, 434, + -58, -24, 5, -67, 33, -80, 114, 1, 99, 61, + -29, 19, -87, 150, -83, 120, -4, 1, 102, -244, + 25, 70, 72, -38, 148, -36, -49, 75, 31, 139, + 90, 156, 6, -5, 17, 31 + }, + { + -262, -632, 105, 275, -44, -231, 278, -22, 366, -179, + 159, -4, -26, 2141, 6800, -579, -147, -269, 208, 175, + 683, -580, 344, -167, -146, -853, -563, -605, -847, -345, + -143, 93, 259, 359, 471, -342, -366, 13, 102, -572, + 26, -61, 344, 224, -107, 759, -7, 16, -201, -169, + 268, -12, 354, -270, 21, -29, -5, -14, -451, 222, + -114, 177, 20, -195, -179, 299, 3, -65, 152, 104, + 232, -115, 3, -131, 159, 65, -136, -51, 147, 99, + 30, 74, -70, 60, 142, 73, -42, -145, 91, -162, + -98, 24, -41, -94, 8, -53 + }, + { + -972, 2437, 118, -415, 282, -257, 443, 131, -77, 425, + 319, 485, 213, -1458, -1068, 422, -922, -702, -101, -245, + -330, -149, -425, -533, -182, -677, 171, 502, -35, -515, + -421, 226, 5, -38, 280, -96, -707, 141, 39, 256, + 597, -118, -329, 489, 252, 290, -89, -44, -40, 316, + 205, -189, -197, 177, 6, 95, 261, 58, -126, 18, + 191, 85, -41, 429, 57, -307, -69, -51, -183, -146, + 118, 156, 138, 9, 28, -192, -11, 18, -113, -150, + 48, 4, -72, -56, -38, -36, 18, -134, 38, -19, + -137, 1, 19, -11, -4, -65 + } + }, + { + { + 19, -2571, -459, 2582, -53, -222, -472, -252, 469, 523, + -244, 198, 71, -158, 605, 585, -352, -405, 755, 283, + 428, -479, -145, 1155, -231, 826, 140, 206, 201, -277, + 134, 566, -34, 341, 322, -392, 413, 75, -457, -274, + -68, 126, -284, 80, -154, 11, -238, 11, -172, -271, + -197, -307, 11, -231, 323, 67, -62, 252, 292, -10, + -302, 124, 87, 7, -246, -28, -117, -2, 38, -24, + 319, 110, 19, -205, 35, -153, 58, 20, 125, -178, + 10, -51, 12, 121, -122, 46, -104, 50, -23, 38, + 13, 54, -56, -13, 22, 29 + }, + { + 1401, 4500, -1826, 4592, -1250, -420, 480, -318, -492, -226, + -1604, 95, -205, -59, -494, -921, -36, 666, 552, -118, + 261, 330, -492, 243, -77, 40, -1007, -103, -101, -24, + -559, 123, 85, -261, -300, -98, 289, 797, 378, 318, + -99, 421, 510, 296, -170, 76, -299, -13, 380, -292, + 83, -147, 123, -113, 109, 479, -8, -146, -82, -145, + -290, 377, 38, -17, 97, 100, -63, 158, 0, 19, + -263, -37, -14, -106, 2, -45, 306, -93, -45, -149, + -216, 42, 55, 15, -108, 158, -187, 115, -176, 13, + -21, 75, 29, 169, -110, -53 + }, + { + -349, 2779, 1000, -3756, 645, 941, -207, 729, -37, 796, + 372, 176, -1117, 933, -441, -56, -220, 707, -614, -979, + 1193, -224, 271, -121, 407, 924, 502, -71, -367, -74, + -48, 295, 209, 193, 644, -378, -177, 310, -490, -405, + -264, -19, -206, -241, -66, 265, -106, -28, -78, 166, + -240, -62, -124, 89, -73, 46, 259, 170, -134, 203, + -135, 145, 1, -45, -83, -12, 171, -122, -23, -81, + -72, -96, -251, -47, 77, 64, 159, -3, -39, 131, + -65, -113, 93, -63, 39, 7, -33, -35, -27, 74, + 109, 37, -57, -20, 14, -16 + }, + { + -38, 2268, 23, -424, 334, -21, -10, -175, 75, 236, + 507, -75, -338, -341, 487, -322, -719, -2, 1041, 450, + 190, 348, 881, 26, -324, 1533, 1399, 677, -219, 66, + -47, 198, -7, 287, -527, -631, -559, -376, 362, 680, + 47, 484, -107, -8, -57, -238, 64, -119, 109, 185, + -3, -597, -282, 87, -30, 183, 427, -21, 152, 166, + 113, -163, -42, -88, 277, 224, 125, -29, -28, 253, + 158, 90, -284, 20, 241, 93, 183, -81, 41, 205, + 13, -98, -121, 34, -126, -95, -38, 115, -163, 3, + -59, 84, 184, 86, -24, -46 + }, + { + 824, 146, 528, -2034, -290, 23, -65, -767, -271, -896, + 785, -455, 159, 206, 827, -8, 185, -1013, 25, 201, + 152, 680, -294, -160, 611, -308, -339, -465, 84, 185, + -270, 309, -9, 321, -143, -245, -236, -395, 1071, 383, + 505, 91, 77, 286, -15, 450, 247, -209, 153, -183, + 50, -165, 496, 170, 53, 56, -193, 124, -42, 73, + 220, -240, -243, -298, 202, 156, 84, 141, -64, 189, + -13, -70, -68, 77, 176, 85, -204, -234, -160, -40, + -2, 74, 74, 26, -31, 97, 51, 138, 60, 69, + 52, 25, -103, 4, -39, -30 + }, + { + 1, -1178, 783, -168, -122, -49, -3, -273, 224, 54, + 279, -187, 320, 1172, 376, -1497, 16, 77, -792, 751, + 242, 29, -541, 882, -545, 71, -544, 365, -725, -702, + -587, 378, 1108, 439, 188, 350, -120, 161, 64, 311, + -534, 809, -57, 26, 114, -205, 438, 37, 110, 185, + -268, 54, 191, 303, 30, -54, -135, -59, 204, 205, + 32, 76, -5, -82, 304, -9, 25, -73, 216, -72, + -257, -183, 197, 106, 181, 17, -81, 81, 261, 94, + -70, 37, 30, 112, -13, -20, -7, -223, 84, 107, + 116, -6, -51, 13, -36, 40 + }, + { + 1146, 3935, 82, -976, -452, 179, 371, -422, -1055, -453, + 795, 158, 81, 522, 99, 488, -841, -1080, -771, -263, + 743, -442, -295, -753, 100, -564, 472, -57, 346, -204, + -663, 424, 178, 527, 310, -189, 114, 46, -286, -377, + 65, 193, -505, 418, 128, -353, 74, 256, 152, 321, + -127, -96, -122, -145, 196, 190, -46, 226, 5, 213, + 135, 125, 93, -5, 95, 309, 51, -68, -2, -39, + 1, 38, -43, 94, -189, -136, -93, 88, 7, -126, + 156, 119, 42, 71, -71, -148, -47, -57, -16, 102, + 38, 128, -64, 12, 31, -88 + }, + { + -41, -1543, -85, -231, 301, -8, -268, -254, -151, 125, + -213, 275, 58, 1227, 384, -695, 300, -236, -379, -538, + -271, 166, 448, -392, -413, -765, -986, 495, 250, 429, + 1217, 106, 265, -319, 402, 104, -565, -87, -232, 300, + -120, -491, 62, 276, -1, 261, 97, -77, -174, -37, + 412, -287, -186, 86, -19, 12, -42, -124, 152, -122, + 179, -109, 25, 166, 153, 204, -19, 253, 264, 171, + -27, -108, -82, 93, -36, 17, 117, 161, 128, 88, + 116, -109, 38, -58, 48, 47, 4, 99, 53, -71, + -31, -160, 7, 11, 90, 35 + }, + { + 2140, 3337, -465, -2170, -11, 599, -143, -507, -199, -39, + 1496, 691, -412, -565, -1103, 116, 667, -420, -821, -16, + -461, -178, 122, 402, 624, 473, 182, -85, -162, -37, + 450, 677, -31, 281, 274, 62, -539, 58, 117, 379, + -97, -105, -300, 318, 27, -619, 286, -99, -502, 106, + 374, 44, 408, 285, 123, -204, -61, 6, -81, -383, + -270, 48, -126, 336, -12, -68, -85, -225, -141, -155, + 52, 111, 24, 152, 7, -43, -32, 1, -192, 130, + -132, 115, 25, -14, 89, 82, -48, -97, 5, -22, + 11, -31, -51, -46, 53, -6 + }, + { + -229, -1374, 1113, 137, 407, -160, 1386, -2, -481, -205, + -1078, -36, -579, -529, 74, -145, -1237, -456, 192, -59, + 266, 543, -155, 658, 244, 625, 387, -270, 312, -24, + 476, 110, -581, 784, 223, -45, -156, 26, 607, 42, + 274, -240, 253, -178, -258, 297, 169, 235, 368, -55, + -273, -42, -256, 31, 190, 199, 82, 532, 29, -15, + -102, 74, 170, -106, 104, 138, -182, -79, -306, 72, + 93, 90, -157, -160, 119, -120, 79, 46, 149, 100, + 146, 71, -141, -179, 57, -18, 140, -72, 25, -68, + 35, -73, 88, 72, -146, 64 + }, + { + -1330, 2441, 654, -731, 14, 1333, 2852, 903, 700, 319, + -585, 639, 167, 401, 1159, 558, 334, 609, -966, -389, + -185, 724, 383, 218, 270, -331, -27, 744, -481, 438, + -142, 404, -30, 143, 230, -75, -380, -44, 88, 166, + -22, 186, -190, 97, -254, 198, -224, 110, 304, 75, + -173, -313, 316, 219, -311, -223, 28, -71, 220, 58, + 4, -154, 25, 142, -20, 233, -17, -194, 18, -175, + -9, 73, 53, -108, 44, 55, 99, 126, 35, -12, + -216, 4, -15, -93, -22, -71, 25, -13, 51, -93, + -118, 7, 106, 63, -37, -53 + }, + { + -131, 971, 1383, -411, -108, 61, 546, 78, 86, 13, + 221, -171, -382, 544, -484, -1365, 722, 232, 644, -51, + 80, -294, -614, -672, 371, -85, -315, 427, 88, 140, + 535, -142, -22, -343, -399, -253, -605, 158, 612, 233, + 95, -336, 269, 907, -25, 175, -236, -73, -48, -333, + -441, 127, 76, 176, 80, -366, -115, -78, 58, -220, + 116, 275, -120, 36, 251, 112, 384, -49, -20, 109, + 79, 205, 27, -39, 77, 25, -167, 103, -101, 2, + 58, 38, 110, -86, 143, -147, -137, 95, -145, 65, + 36, 52, 1, -71, -55, -87 + }, + { + -506, 4615, -398, 869, 418, -1199, -887, 790, -8, -482, + 494, 1076, 732, -589, 1716, 787, -12, -148, 327, 490, + 758, -14, -937, 297, -1336, -353, 174, -137, -382, 616, + -96, -394, 769, 385, -53, 399, -194, -59, -126, 624, + 216, -335, -432, 446, -211, 577, -337, 45, -623, 433, + 214, -196, 371, -78, -108, -34, 129, -17, -222, 376, + -33, 9, 44, -236, -109, -1, 8, -294, -36, 154, + 178, 150, -79, 105, -100, 118, -49, -36, 122, -126, + 42, -38, 1, 7, 129, -19, 5, 99, -10, 21, + 51, 182, 64, -20, -53, 25 + }, + { + 236, -786, -424, 640, 533, 377, 553, -227, 292, -287, + 91, 34, -114, -2568, -745, -1488, 474, -916, -663, 362, + 229, -1258, -550, -528, -195, -539, 48, -10, -661, -273, + -580, -450, -225, 360, 990, -79, -380, 329, 270, -889, + -571, -483, 30, -123, -468, 301, -199, 254, 287, 212, + 475, -72, 263, -555, -31, 63, 49, 152, -707, -87, + -118, 161, 172, -31, -277, 50, 56, 10, -12, -59, + 331, -126, 52, -116, 146, 88, -119, -140, 43, 73, + -72, 63, -22, 87, 174, -45, -152, -108, 205, -202, + -69, 53, -110, -69, -77, -91 + }, + { + 350, 4702, 404, 13, 265, -1392, -175, -292, 61, 501, + 631, -161, -222, 797, 1899, 561, -1037, -804, -14, 147, + 220, 531, -137, -75, 870, 255, 323, -74, -620, -46, + 246, 757, 645, 158, -165, -393, -515, 729, 555, 238, + 507, -304, -327, -146, -200, -78, -361, -601, -537, -95, + 27, -145, 96, 375, 45, 320, 310, -20, -224, -85, + 313, 183, -176, 87, 29, -1, -36, 38, 84, 100, + -67, -103, -169, -128, 9, -150, -48, -90, -203, -66, + 87, -56, -84, 54, 9, 9, 85, -24, 34, -7, + 31, 55, 4, -33, -17, 27 + } + }, + { + { + 63, -3937, 270, 1797, 906, -476, -160, 139, 57, 89, + 722, -463, -505, -450, 1332, 702, 470, -1109, 144, 1109, + 293, -344, -402, 977, 311, 192, 571, -227, 435, -330, + 706, 550, -353, 627, 282, -125, -97, 4, -604, 82, + -501, 27, 76, 16, -178, -551, -25, 339, -90, -368, + -265, -380, 74, -273, 123, 259, 104, -50, 281, 17, + -182, 163, 104, 59, -203, -119, -136, 49, 3, 144, + 221, 81, -4, -20, -23, 3, -174, 213, -31, -86, + -88, 19, 9, 133, -24, -26, -104, 74, -23, -27, + 75, 17, 16, -4, -47, 39 + }, + { + -1500, 2693, 2378, 1665, 733, -576, 509, -648, 350, -936, + 202, 211, -1056, -548, -396, -988, 800, 223, 555, 346, + -3, -224, 90, -18, 182, -101, -916, -331, -146, 166, + -348, 85, -232, -42, -266, 32, 266, 637, 221, 478, + -43, 267, 669, 182, -13, -200, -72, -261, 350, 47, + 30, -94, 360, -26, -11, 171, 247, -257, -55, -62, + -172, 63, 84, 76, -184, 240, 22, 241, -80, -18, + -116, -140, -62, -41, -18, 120, 121, 79, -249, -157, + -129, -14, 90, -88, -80, 57, -38, 36, -105, -44, + -56, 70, 70, 107, -22, -74 + }, + { + 201, 6007, -1553, -2737, 98, 476, 409, 166, 455, 220, + -244, 401, -270, 256, 236, -573, -248, 677, -547, -289, + 561, 252, -116, 142, 1110, 646, 190, -101, -706, 33, + 55, 263, 65, -56, 616, -26, -31, 23, -301, -648, + 72, -174, -404, -94, -69, 37, 62, 161, 66, -324, + -46, -137, 31, -59, -65, 54, 314, 84, -19, -98, + 205, 65, 9, 9, -143, -13, 110, 118, -351, 12, + 161, -259, -172, -106, 24, 209, -67, 46, 53, 62, + -182, 56, 72, -38, 75, -23, -34, 21, -45, 78, + 42, 79, 59, -104, -51, 87 + }, + { + 26, 2079, 173, 24, 8, -29, -70, -138, 156, 196, + 503, -513, 150, -262, 799, -495, -1088, -394, 1959, 868, + -538, 296, 1638, -597, -154, 1078, 1382, 444, -297, -25, + 874, -373, 3, 306, -668, -748, -330, -188, 365, 267, + 503, 395, 53, 3, -20, 54, -365, 42, -154, 305, + -59, -347, -573, 120, 429, -77, 268, 105, 68, 34, + -58, -18, -120, 23, 216, 143, 50, 92, -138, 319, + 101, 53, -185, 137, 186, -55, 245, -84, 0, 113, + 4, 62, -117, 44, -220, -52, -89, 116, -77, -61, + -29, 154, 105, 36, 30, 33 + }, + { + -589, 3081, -622, -2625, 597, -35, -240, -261, -751, -282, + 1135, -2101, -98, 843, -401, 1258, 35, -206, -34, -38, + -92, 757, -223, -145, 381, 122, -270, -62, -464, -137, + 474, 165, -93, 551, -620, -245, 180, -8, 611, 635, + 235, 291, -306, 391, 51, 545, -267, 348, 79, -24, + 68, -72, 138, 298, 122, -23, -44, 90, -31, -41, + 284, -426, -13, 12, -243, 258, 145, -81, 130, 156, + 78, -101, 8, 53, 150, 113, -123, -325, -73, -48, + -143, 171, 81, -58, -41, 199, 59, 136, 80, -38, + 40, 22, -70, -23, 88, -98 + }, + { + -80, 248, -296, -88, 104, -115, -77, -60, 117, -96, + 297, -38, 237, -68, 607, -704, 263, -103, -387, 600, + -598, 490, -207, 539, -775, 35, 52, -424, -818, 260, + -343, 66, 759, 373, 13, 544, 426, -175, 101, -24, + 431, 121, 231, -71, 123, -157, 350, 114, -65, 215, + -129, 25, 30, 215, 260, -319, -14, -19, 105, 279, + 20, 120, 54, 30, 207, -218, 303, -92, 75, -168, + -31, -217, 103, 106, 179, 6, 4, 88, 156, 120, + -25, 68, 8, 50, 11, 0, -91, -124, 67, 82, + 48, 15, 27, -4, -59, 22 + }, + { + -323, 6029, -257, -1637, 923, -263, 177, -156, -865, -12, + 894, -613, 532, -156, 648, 567, -555, -1294, -1215, 345, + -289, 24, -378, -305, -928, -55, 591, 105, -289, -12, + -206, 23, -100, 476, 369, 222, -384, 354, -285, -30, + -159, 161, -271, 264, 216, -455, 18, 548, 284, -223, + 64, -205, -35, -183, 186, 77, 202, -36, 256, 92, + 185, 333, -158, 70, 255, 84, -18, -79, 129, -113, + -23, 108, 53, -10, -183, -57, -127, 28, -12, 80, + -2, 166, -2, -19, 57, -128, -84, -100, -66, 163, + 55, 53, -6, 76, -44, -14 + }, + { + -143, -1100, -131, 164, 6, -161, -162, -165, -217, -131, + -116, -54, 382, 845, 469, 285, -1006, -296, -1012, -100, + -177, 166, 264, -605, 251, -676, -680, -542, 864, 671, + 864, -389, 1039, -690, 621, 170, -471, -457, 67, 199, + -29, -626, 370, 159, -50, 172, 281, -252, -227, 181, + 169, 161, -218, -32, 61, -201, 68, -145, -179, 116, + 282, 55, -127, 54, 253, 63, 273, 18, 298, 310, + -74, -93, -70, -38, -30, 49, 138, 100, 106, 152, + 43, -87, 148, -87, 44, -22, 63, 59, 65, -76, + -38, 1, -137, 21, 125, -19 + }, + { + -2145, 9601, -1490, -2023, 630, 466, 457, -1426, 1217, 524, + -38, 1463, -1005, -989, -144, -52, -132, 672, -926, -726, + 141, -150, -32, 243, 333, 830, 3, 85, -109, 18, + 191, 540, 5, 369, 280, 101, -1005, 578, 247, 207, + -162, -118, -378, 530, -68, -554, 255, -109, -262, 233, + 112, -33, 487, 353, 4, -299, 3, -57, -121, -169, + -306, -66, 150, 166, -48, -90, -68, -244, -134, -169, + -9, 81, 120, 161, -59, -73, -40, -87, -105, -7, + -80, 233, -98, -24, 220, -91, 65, -63, 7, -32, + -85, -16, -5, 68, -81, -7 + }, + { + 311, 17, -266, -224, 584, 583, -89, 108, -550, -225, + -925, -645, 194, -310, 1, -80, -758, -392, -127, -869, + 859, 457, 603, 123, -123, 1100, -3, 67, -211, 334, + 775, -776, 405, 947, -221, 505, -179, -207, 314, 246, + 222, -201, 172, -290, -213, 294, 167, 184, 309, 10, + 123, -232, -412, -132, 344, 132, 63, 447, 138, -31, + -18, -24, 84, 221, -210, 298, -86, -262, -232, -105, + 242, 131, -258, 59, -28, -69, -19, 47, 171, 148, + 203, -37, -113, -102, 72, 20, -44, 67, 26, -79, + -78, 77, 18, 43, -89, -2 + }, + { + 1619, -558, -204, 792, -24, 1415, 1697, 1510, 338, -105, + 157, 164, 464, 726, 582, 696, -452, 897, -879, -88, + -449, 1276, 561, 11, 365, -10, 127, 199, 230, -503, + 723, 504, -635, 344, 247, -449, -138, 35, -526, 664, + -103, -148, 135, -289, 156, -24, -9, 207, 167, -193, + 136, -324, 180, 40, -208, -235, 169, -54, -147, 236, + 160, -220, -146, 30, 134, 60, 73, -113, -61, -194, + 58, 87, -12, -68, 63, 42, 207, -50, 75, -31, + -64, -68, -76, -78, -71, 97, -22, 67, -96, -33, + -3, -11, 71, -3, 98, -104 + }, + { + 135, 1770, 266, -328, -251, 453, 585, -295, 459, -222, + 435, 92, -259, 222, -1716, 215, -395, 1214, 54, -649, + 557, 637, -1503, -30, -593, -322, -23, 583, -888, 833, + 494, -309, -157, -276, 26, -446, 181, -171, 303, -130, + -49, 80, 564, 600, -18, 282, -168, -206, 100, -481, + -313, 117, 119, 87, -90, -190, -215, -363, 113, 161, + 20, 85, -2, -166, 356, 128, 205, 139, -17, 32, + 170, 269, -22, -62, -11, 14, -27, -56, 1, -71, + 76, -40, 106, 59, -16, -160, -71, 29, -132, -1, + 194, 12, -47, -27, -34, -90 + }, + { + 1527, 2030, -463, 186, 1148, -1329, -708, -105, -178, 1296, + -188, 535, 556, 95, 1205, 310, 225, 1015, -709, 1543, + 209, 243, -1029, -844, -53, -90, -214, 104, -705, 472, + -161, -34, 125, 557, -264, 645, -219, -131, 413, 25, + 163, -621, 91, 115, 107, -190, 414, -228, -219, 381, + 106, -252, 279, 264, -319, -48, -143, -97, -6, 61, + 36, -40, 141, -73, -362, 3, 9, -73, -242, 176, + 108, 50, 261, 12, -81, -35, -78, 158, -83, 14, + -40, -21, -46, 254, -18, -65, 40, 192, -57, -117, + 148, 74, 161, -9, -11, 41 + }, + { + -210, -1786, 967, 295, 405, 217, 653, -7, -218, 48, + 56, -213, -341, 115, -4597, -507, 436, -815, -641, 929, + -870, -296, -1221, 271, -711, 187, -843, 789, -681, -402, + -1046, 31, -382, 749, 377, 89, -384, 368, 586, -710, + -595, -476, -35, -304, -391, 416, -343, 28, 544, 66, + 889, -279, -42, -144, -144, 51, 193, 38, -546, -262, + 145, -73, -28, 90, -6, -255, 230, -91, -29, 56, + 129, -66, 201, -13, 30, -45, -52, 57, 29, 10, + -127, -57, 73, 83, 111, -83, -129, -16, 116, -101, + 8, -56, -132, 14, -93, -18 + }, + { + 583, 3588, 1073, 691, -412, -1090, -398, -339, 257, -635, + 1581, 64, -1272, -310, 3867, 92, -957, 292, -403, -110, + 197, 425, 198, 278, 690, 341, 950, 3, -1365, 305, + 300, 387, 360, 676, -295, -570, -305, 286, 1240, 172, + 165, -606, 109, -364, 165, -104, -145, -938, -402, -464, + 28, 137, 111, 32, 263, 469, 106, -119, 182, -167, + 126, 59, -14, 98, -151, 387, -62, -169, 157, 369, + -222, -167, -228, 68, -136, 58, -193, -99, -101, -104, + 2, 97, -95, 72, -35, 50, 15, 123, -38, -113, + 139, 48, 16, 9, -92, 97 + } + }, + { + { + -56, -3683, 467, -79, -376, -154, 327, 491, -365, -801, + 15, -1175, -853, -77, 1709, 598, 918, -214, 285, 1663, + 384, -1167, -827, 115, 19, -395, 451, -148, 204, 410, + 1177, 731, -309, 221, 157, -113, -17, 159, -301, 196, + -392, 37, -99, -352, -524, -495, 164, 157, -68, 14, + -12, -481, 41, -257, -221, 106, 263, -151, 46, 158, + -69, 113, 38, 100, -100, -63, 80, 212, 26, 90, + -16, -143, 58, 162, 49, 144, -145, 211, -37, 39, + -9, 81, 25, 69, 22, 121, 12, 112, -14, -62, + -4, -35, 49, 78, 46, 85 + }, + { + 1608, -213, -2050, -656, -340, 150, 853, -130, 469, -350, + 1536, 129, -867, -493, -92, -607, 703, 394, 972, 331, + 103, -263, 296, -82, 336, 155, -457, 45, 84, 298, + 317, -11, -93, 213, -601, -321, 80, 188, -84, 289, + -165, 257, 203, -428, -170, 86, 566, -65, 72, 75, + 277, 221, 472, 217, 40, -411, -45, -53, 223, 90, + -233, -118, -81, -22, -257, 216, 80, 255, -13, 5, + -71, -27, -21, -5, 33, 76, -56, -31, -237, -11, + -55, -48, 93, -76, -37, 49, -48, -3, -28, -2, + -11, 32, -62, 43, 9, -59 + }, + { + -57, 8822, 941, -54, 1292, 52, 137, -611, -357, -815, + 168, 1009, -153, 262, 596, -752, -339, 530, -116, 243, + 247, 442, 159, 202, 914, -98, -228, -58, -820, 107, + 514, -98, -673, -425, 336, -23, 109, 43, 164, -297, + 365, 172, -222, -166, -253, -234, -132, 189, 356, 48, + 79, -273, 218, 84, 137, -51, 156, 90, 272, -82, + -45, -123, 16, 45, -34, 116, 111, 115, -377, 31, + 181, -223, -25, -60, 29, 137, -310, -88, 61, 156, + 2, 230, 132, -50, 89, -14, -45, 66, 13, 6, + -89, -1, 103, -13, 2, 30 + }, + { + 34, 1809, 166, 255, -92, 66, 124, -9, 86, -166, + 221, -495, 118, -281, 1352, 1105, 92, -278, 1963, 918, + -796, -213, 1068, -488, -306, -458, -616, -542, -593, 26, + 535, -723, -212, -194, -230, 281, 440, -410, -169, -20, + 392, -146, 46, 516, 401, 214, -301, 143, -297, 132, + 84, -16, -296, -94, 251, -331, -55, 123, 52, -44, + -133, -39, -92, -75, -55, -43, -168, 30, -206, 18, + -12, 16, -250, 4, 82, -215, 53, -130, -120, -8, + -4, 191, 58, 79, -187, 39, -16, 63, -57, 35, + -58, 29, 2, -19, 8, 73 + }, + { + -97, 5743, 1232, -3128, -352, 7, -57, -507, -987, -785, + 819, -1609, -321, 338, -741, 1370, -40, -448, 315, 571, + 79, 550, -142, 327, 657, 565, 531, 1001, -161, -279, + 613, 62, -378, 388, -532, -289, 682, 84, -177, 349, + 102, 307, -289, 435, -175, 367, -270, 268, 89, 179, + 50, -154, 19, 350, 197, -156, -14, 178, -40, -345, + 321, 75, 435, 58, -398, 127, -63, -94, 65, -31, + 114, 69, 18, -40, -18, 112, 47, -141, -12, -74, + -205, 140, 10, -81, 56, 103, -141, 28, 117, -52, + -52, 66, 19, -40, 139, 11 + }, + { + -11, 1373, 140, -118, 9, -144, -4, 93, 113, -324, + 92, 87, 83, -549, -132, -484, 772, 156, -43, 1291, + -513, 568, 67, 481, -909, 58, -104, -202, 199, 1430, + 58, -814, -478, -139, 13, 347, 213, 30, 127, -316, + 704, 452, 489, -28, 145, -306, 113, -254, -535, 117, + 48, 143, 42, -70, 116, -212, 148, 44, -93, 65, + -27, 119, 55, 63, 197, -225, 377, -11, 6, -283, + 68, -197, -107, -96, 30, 97, 70, 7, 49, 23, + -34, -23, -17, 43, -54, -29, -18, -55, -19, -59, + 5, 61, 4, 1, 1, 26 + }, + { + -997, 7242, 2081, -1828, -88, -596, 215, 533, 30, 653, + 885, -1065, 283, -936, -132, 132, -327, -521, -169, 507, + -733, 38, -578, -237, -269, 28, 138, -15, -221, 216, + 41, -171, -473, -62, -21, 32, -268, 584, -10, 342, + -18, 150, -9, 165, 66, -96, 77, 69, 280, -183, + -18, -247, 137, -125, 139, 165, 321, -129, 26, -175, + 127, 181, -229, 84, 123, -105, -72, 44, 143, -134, + -115, 72, 39, -50, -125, 35, -109, -34, 8, 111, + -121, 107, -20, -62, 43, -64, -37, -58, 35, 168, + -47, -11, 36, 141, -3, 19 + }, + { + 49, 449, 460, 243, 64, -53, 59, -26, -258, -59, + -106, -138, 76, -491, -380, 384, -2045, -1564, -779, 574, + -567, 65, 746, 16, 414, 113, 399, -511, 274, -449, + 261, -401, 758, -460, 506, 20, -8, -298, -359, 204, + -67, -523, 316, 68, 97, 243, 206, -239, 80, 132, + -58, 464, 20, -149, -76, -525, 106, -65, -253, 190, + 387, 42, -155, 111, 124, -91, 114, -303, 74, 130, + -40, 87, -30, -62, -43, -60, 28, 36, 22, -45, + -129, -127, 128, -65, 42, -115, -43, 75, 114, -16, + 29, 136, -18, -44, 2, -61 + }, + { + 1505, 16569, 1348, -1446, -466, 391, 1410, -446, 1697, 135, + -1152, 819, -74, 443, 490, 234, 201, 1100, -526, -782, + 57, -751, -581, 87, -263, 33, -196, 446, -59, -12, + -307, -308, -274, 228, 117, -154, -765, 1046, -61, -354, + 135, 503, -214, 334, -10, -445, 224, 212, -6, 174, + 28, 115, 279, 141, 261, 88, 196, 51, -117, -71, + -159, 73, 242, 2, 0, 32, -23, -7, 32, -28, + 28, -23, -46, -21, -77, -44, -102, -55, 96, 62, + -123, 140, -6, -70, 127, -111, 41, 64, 124, 16, + -35, 79, 103, 131, -118, -36 + }, + { + -333, -40, 75, -129, 301, -58, -919, 100, 120, -49, + 66, 243, 685, -396, 19, 653, 350, 263, -742, -882, + 1118, 231, 182, -230, -443, 406, -153, 415, -190, -186, + 827, -148, 718, 622, -147, 191, -414, -161, -91, 38, + 331, -251, -42, -430, -409, -164, -184, 241, -37, -286, + 346, -14, -89, -215, 176, 165, -168, 158, 31, 115, + 90, -150, 67, 190, -232, 407, -59, -290, -181, -224, + 116, 125, -87, 171, -70, 28, -3, -5, 216, 160, + 74, -139, -72, -10, 36, -59, -190, 7, 14, -38, + -12, 71, -35, 50, -36, -56 + }, + { + -1839, -3264, 814, 644, -217, -1843, -1401, 1078, -81, -510, + 457, -467, -633, -127, -549, 54, -289, 503, -1488, 401, + 183, 1247, -95, -312, 681, 782, 183, -342, 485, 0, + 752, 165, -1207, -288, 91, -627, -153, 308, -186, 540, + -642, -269, 362, -448, 111, 100, 163, 107, -157, -461, + 164, -333, -48, -26, -62, -294, 193, -46, -151, 218, + 134, -72, -159, 86, 224, -66, -98, 26, 114, -37, + 108, 57, -63, -104, 141, -36, 125, -26, 200, 127, + 17, -75, -111, -28, -14, 227, 16, 23, -50, 102, + 101, 79, 94, -17, 130, -117 + }, + { + -84, 2172, 569, -151, -454, -111, 149, -354, 344, -227, + 478, 57, -408, -9, -1508, 626, -456, -356, -1441, -322, + 825, -90, -1802, 15, -1197, -270, -262, -195, -1265, 78, + 228, -471, -18, 298, 308, 76, 593, -670, 206, 311, + 74, -142, 440, 425, -39, 169, 166, -83, 335, 142, + 28, 164, 7, -141, -165, -49, 66, -347, -37, 21, + -56, -55, -42, -213, 92, -49, -108, -31, 19, 8, + 8, 163, -12, -71, -106, -78, -50, -11, 5, -212, + -110, -162, 99, 71, -67, -56, 13, 33, -56, 95, + 186, -16, -34, 139, 53, -111 + }, + { + -1838, -2394, 593, -425, 599, 895, 830, -68, -246, 893, + -636, 310, 132, -834, -612, -488, -490, 845, -609, 957, + -62, 686, -531, -523, 641, 307, -173, 50, -244, 887, + -542, -388, 14, 431, -623, 448, -88, -107, 371, -19, + 322, -343, 283, 130, 214, -246, 678, -137, -52, 126, + -326, -325, -70, 122, -260, -277, -118, 161, 26, -133, + -88, 50, 176, 75, -255, -103, -138, -100, -298, 153, + 22, 73, 305, 169, 46, -115, -68, 161, -120, 71, + -82, -35, -109, 154, -75, 6, 106, 91, -105, -3, + 123, -57, 75, 22, 101, 55 + }, + { + 256, -2904, -420, -156, -352, -1049, -118, 166, -168, -1, + -326, 105, 79, 3311, 486, 729, 1241, -9, -97, 314, + -734, 1055, -622, 374, 148, 460, -1091, 633, -423, 627, + -136, 832, -166, 349, 8, -54, -796, 12, 718, 156, + 326, -204, 154, 19, -182, 619, -523, -533, 250, -120, + 627, 33, 146, 39, 140, -27, 143, 150, -319, -84, + 208, -92, -33, 170, 195, -176, 63, -206, -109, -55, + -29, -89, 59, -100, 3, -7, 72, 206, 223, 89, + -143, -118, -1, -29, 54, 100, -27, -84, 170, -19, + -52, -67, -20, 164, -52, -42 + }, + { + -1360, 1429, 901, 329, 404, 516, -11, -941, -952, -1186, + 964, -861, -1627, -1622, 1884, 39, -189, 1213, -93, -640, + 763, 1384, 500, -118, 242, 341, 829, 64, -795, 155, + -847, -461, 84, 393, -397, -124, 72, -41, 632, -282, + -374, -562, 678, -94, 402, 481, 258, -458, 153, -18, + 224, 196, 114, 10, -83, 40, 22, 77, 498, 22, + 14, 60, 252, 289, -38, 500, 200, -192, -18, 245, + -206, -50, 48, 247, -195, 58, -42, 81, 23, -5, + -3, 117, -6, 89, -38, 5, -45, 89, -65, -84, + 155, 58, 2, 28, -82, 40 + } + }, + { + { + 22, -858, -1461, -932, -78, 136, 244, 148, 115, -1192, + -279, -1227, -298, 128, 977, 1083, 229, -609, 960, 1440, + 134, -1207, 0, -428, 55, 83, -21, 82, -465, 824, + 1132, -39, 622, -464, 259, -7, 648, -514, -59, 295, + -218, -187, -52, -467, -337, -548, 298, 273, -316, 94, + -152, -302, -93, -394, 108, 196, 88, 171, -367, 304, + -40, -182, 229, 59, -64, -34, 172, 72, -203, 229, + -30, -172, 79, 80, -2, 195, -53, 105, -31, 6, + 140, -33, 43, 65, 81, 75, 54, 101, 2, -23, + -145, 14, 102, 106, 54, 25 + }, + { + -1617, -5434, 4489, -1772, 1814, 193, 508, 252, 98, -225, + 1856, -1662, 591, -223, -646, -579, 182, 603, 1096, 73, + 552, -367, 10, -204, 804, 58, -363, -289, 435, 83, + 691, -390, 458, -255, -256, -616, 94, -130, 191, -30, + -253, 566, -55, -197, -207, 404, 232, 92, -216, 80, + 373, 278, 264, 462, -171, -277, -103, -57, 184, 7, + -220, 101, -436, -25, 101, 40, 18, 146, 0, 174, + -89, 0, -105, -42, 134, -8, -50, -83, -106, -74, + -10, 64, -26, -54, 43, -5, -3, -52, 4, -22, + 24, 0, -66, 74, -26, 4 + }, + { + -83, 9510, 360, 1343, -233, 418, -15, -420, -221, -1212, + 565, 1196, -435, 197, 462, -323, 49, -181, 313, 499, + 8, 118, 362, 90, 664, -364, 19, -457, 75, -162, + 253, -60, -239, -597, 79, -51, -183, 126, 485, 184, + 73, 111, 3, -406, -212, 154, -441, 40, 326, 34, + 264, -87, 233, -102, 240, -131, 189, 25, 419, 20, + -170, -71, -28, -20, 35, 145, 101, 150, -281, -47, + -55, -37, -97, -97, 112, 19, -92, -91, 101, 96, + 48, 153, 101, 50, 36, -56, 8, -5, 56, -15, + -24, -38, 8, 46, 14, -36 + }, + { + -96, 1472, 405, 487, -223, 86, 125, 212, -212, 68, + -192, 52, -437, 165, 1463, 698, 289, -26, 1948, 361, + -148, 76, 41, 230, -707, -778, -941, -71, -372, 290, + -425, -662, 49, -749, 90, 29, 1051, -617, -239, 90, + 401, -81, -147, 531, 316, -106, 246, -63, -132, -166, + 296, -180, 146, -165, -103, -82, -85, 6, -101, 70, + -36, -43, 16, -80, -229, -17, 61, 8, -218, -122, + 29, -43, -102, -176, 87, -130, -54, -82, -70, -45, + 29, 84, 140, -37, 4, -27, 5, -12, -16, 68, + -57, 15, 4, -37, 50, -79 + }, + { + 1145, 7118, -1605, -3496, 281, 207, 186, -980, -2, -1361, + -522, -723, 358, 130, -730, 729, 1043, -1303, 560, 993, + -534, 902, -771, 698, 138, 204, 905, 863, 90, 14, + 534, -119, -64, -322, -259, 222, 19, 161, -93, -234, + 385, 173, 388, -28, 6, 118, -152, 126, -68, 514, + 9, -392, 69, 302, 388, -296, 95, -9, 180, -257, + 165, 49, 304, 141, -285, 125, -151, -100, 87, -113, + 64, 57, -10, 67, -133, 49, 77, 36, -43, -15, + -246, 6, 98, 2, -13, 3, -61, 47, 39, -30, + -37, 36, -26, 27, 53, 60 + }, + { + 98, 714, 450, -53, -154, -65, -44, 55, 317, -62, + -94, -159, 7, 362, -1604, 450, -151, 467, -819, 2330, + -350, 578, -95, 1023, -547, -789, -6, -217, 51, 1384, + -140, -358, -537, -251, 169, 201, 34, 147, 228, -156, + 231, 443, 236, 74, 350, -237, 323, -492, -453, -351, + 232, 153, 377, -136, -43, -135, 34, 161, -244, 15, + 75, 158, 101, -10, 46, -13, 362, -53, -230, 44, + -100, -143, -104, -163, -11, 146, 99, -74, 99, 56, + -56, -69, 106, -41, -67, -69, 91, -85, -53, -11, + 13, 12, -56, 53, 66, 39 + }, + { + 2563, 6528, -1925, -1984, 231, -89, -276, 185, 1110, -132, + 61, 516, -243, -406, -728, -22, 370, -790, 935, -332, + -332, -236, -552, -980, 881, 106, -229, -381, 206, 233, + -7, -151, -281, -438, 19, -136, 213, 365, 116, 47, + 189, -17, 186, -197, 325, 134, 304, -176, 166, -102, + -13, -269, 292, 8, -137, 175, 467, 14, -385, 17, + -18, -30, 91, -82, -9, -42, -6, 118, 32, -49, + -94, -15, 17, -62, -6, -75, -68, -1, -29, -15, + 36, 33, -81, 4, 48, -77, -60, -21, 84, 95, + -31, 16, 103, 26, 35, 12 + }, + { + 106, 593, 191, 7, 146, 53, -23, 147, -293, -44, + 4, -158, -144, -113, -579, -111, -1580, -1339, -351, 784, + -676, -184, 576, 505, -263, 759, 393, -680, 456, -487, + -603, 545, -509, 509, 47, 12, 275, -139, -476, -311, + 144, -47, -197, 429, -42, 84, -94, 34, 369, -263, + 36, 433, 312, -307, -178, -480, -51, 85, 169, -97, + 287, -114, 112, 41, -25, 35, 197, -293, -59, 151, + -13, -64, 179, -20, -105, -15, -3, 14, 49, -123, + -88, -159, 81, 12, -45, -73, -29, 106, 14, 35, + 117, -6, 96, -17, -49, -63 + }, + { + -206, 21702, -1509, -2390, 1091, 2, 1520, 649, 776, -427, + -665, 338, 796, 817, 567, -492, 1336, 439, -355, -929, + -254, -452, -359, -29, -463, -74, 2, 693, -406, -118, + -307, 94, -257, -420, 229, -231, 211, 601, -278, -81, + -158, 331, 452, 229, 52, -628, -31, 559, 170, 76, + -207, 434, 70, 179, 67, 505, -58, -1, -89, -267, + 47, 35, 306, 94, -113, 127, -138, 70, 75, -68, + 24, 21, -157, -3, -74, -33, -128, 21, 50, 28, + 11, 64, 26, 50, 24, -18, -59, 46, 135, 69, + -2, 74, 103, 111, -136, -7 + }, + { + 277, 1087, -1445, -537, 810, -559, -610, -202, 328, -72, + 604, 29, 548, -502, 687, 500, 391, -107, -583, 97, + 75, 398, -625, 300, 90, -407, -199, 613, 551, -536, + 757, -184, 1048, 58, 238, -144, -107, -110, 30, -202, + 135, 118, -429, -128, -65, -231, -546, 135, -126, 125, + 186, -10, -112, 161, 116, 50, -36, -30, -16, 83, + 338, -112, 7, -128, 133, 199, -91, -210, -4, -286, + 54, 102, 92, -12, 40, -3, -35, -36, 222, 191, + -40, -112, -78, 129, -71, -117, -99, -18, 60, -128, + 95, -10, 21, 2, -53, -11 + }, + { + 1955, -5706, -2129, 1078, 9, -3048, -737, 396, 181, -16, + 63, -156, -653, -712, -442, -373, -572, 599, -1334, 326, + 568, 662, -277, 161, 519, 531, 497, -333, 279, 19, + 481, 288, -925, -847, -74, -310, -10, 367, 208, 71, + -637, -31, 209, -51, 229, -416, 564, -260, -98, -340, + 42, -317, -40, -92, 74, -223, 122, -234, 98, 136, + -1, 9, -159, 351, 105, -91, -155, 196, -54, 193, + 120, -143, -71, 2, 73, 27, 54, 51, 113, 183, + 3, -28, -97, -55, 43, 136, 65, 3, 32, 43, + 125, 95, 97, 5, -20, -34 + }, + { + -6, 2959, -338, 153, -519, -117, -245, -25, 170, -413, + 674, 197, 181, -1742, 60, 531, -459, -296, -1828, 702, + 94, -1395, -1031, -241, -465, -190, -523, -186, -404, -1155, + 560, -482, 32, 70, 917, -88, -96, -414, 504, 69, + 320, -183, 330, 66, 273, -6, 315, -388, 314, 425, + 370, -42, 166, -306, -154, -92, -18, -20, -287, -64, + 0, -108, -136, 315, -54, -316, -23, -97, -38, 203, + -150, -9, 23, -83, -56, -14, -87, 76, -26, -137, + -216, -13, -45, 161, -162, 100, -43, -64, 86, 81, + 101, -4, -154, 251, -23, -65 + }, + { + 1164, -6114, 695, -191, 479, 1343, 705, -370, 157, -578, + 119, 669, -398, -695, -1351, -189, -1359, 671, 480, 198, + 159, 50, 252, -85, 222, 46, -189, -128, 586, 461, + -665, -335, 240, -78, 145, 53, -92, 404, -172, 322, + 297, -151, 366, 156, 80, 82, 134, 35, -78, 237, + -437, -59, -237, -361, 256, -282, -159, 279, -214, -39, + -179, 209, -9, 221, 1, -47, -212, -159, -239, 249, + -163, 181, 103, 142, 167, -105, 6, -2, -114, 132, + -203, 35, -67, -11, 30, -4, 93, 71, -148, 141, + 0, 1, 44, 52, 52, -34 + }, + { + -304, -2864, 244, -161, -545, -1005, -542, 337, 24, 97, + -746, 524, 239, -1071, 7546, 435, 335, 66, 1670, -2005, + 304, 696, -878, 533, 873, -709, -91, 209, -381, 839, + 450, 497, -350, -17, 411, -557, -154, -557, 678, 582, + -137, 110, -23, 108, -154, 454, -144, -372, -132, 26, + 138, 452, -109, -2, 174, 33, 212, -81, -48, -29, + 115, -13, -20, 180, 72, 112, -402, -121, -26, 104, + -99, -61, -176, -111, 107, 5, 169, -43, 355, 80, + -97, -7, -104, -29, -16, 196, -5, -119, 152, 19, + -154, -53, 104, 32, -7, -23 + }, + { + 1620, -974, -482, 597, -58, 1048, -611, -1032, -692, -200, + -442, -1082, -415, 753, -1747, -923, 884, 800, -197, 261, + 326, 882, 353, 514, 191, 365, 394, -978, 570, -243, + -715, -722, -12, -365, 71, 228, 263, -302, 42, 536, + -400, -509, 259, 64, 321, 636, -94, 109, -21, 119, + 123, 448, -90, 357, -281, 65, 54, 28, 362, 167, + -44, -40, 388, 42, 278, 306, 290, -25, -232, -80, + 194, -101, 35, 70, -166, 29, 38, 80, 11, 33, + -24, -13, 133, 7, 23, -21, -73, 126, -1, -55, + 64, 91, -71, -19, 26, -36 + } + }, + { + { + -39, 2476, 1000, -1107, -108, 211, 91, -190, 229, -1831, + -1263, 77, 681, -1258, -444, 641, -340, -644, 1493, 776, + 394, 61, 1049, -204, -27, 591, -343, -104, -670, 280, + 377, -614, 291, -997, 436, 858, 1175, -345, -52, 156, + -19, -64, 54, -237, 491, 336, 203, -264, -529, 151, + 91, -200, 74, -106, 264, 198, -240, 84, -275, 296, + 129, -117, 122, -101, -247, -193, -152, -187, -145, 360, + -8, -291, -94, -138, -209, 28, -96, 73, -34, -112, + 140, -29, -21, 102, 128, 22, -61, -30, -42, 8, + -98, 52, 57, 17, 0, -37 + }, + { + 1549, -9924, -2064, -2284, 1176, -292, -105, -84, -93, -750, + 1173, -1184, 643, -84, -755, -1019, 110, 291, 520, -134, + -30, -690, 0, -97, 312, -436, -455, -375, 445, 224, + 225, -291, 446, -152, 229, -741, -472, -526, 280, 112, + -111, 605, 233, 369, 79, 376, -341, -225, -526, -418, + 273, 368, 171, 266, -247, -106, -28, -120, -5, 1, + -160, 331, -211, -113, 31, -34, -230, 29, 85, 137, + -119, -3, -124, -160, 1, -10, 18, -11, -2, 7, + 57, -2, -12, 120, 124, 51, 89, 33, -3, -47, + -26, -20, -15, 103, -46, 3 + }, + { + 213, 7209, -1734, 1378, -62, 127, -27, 568, 681, -799, + 489, 1061, -758, 825, 1235, 239, 758, -612, -482, 123, + -732, -657, 607, 542, -110, -758, 110, -137, 514, 221, + 97, 28, 134, -753, -238, 318, -46, -44, 356, 100, + 406, 311, -107, -230, -111, 21, -158, 65, -30, 109, + 330, 185, 279, -286, 199, 13, 188, -62, 331, 102, + -195, 3, 35, -4, 189, 130, -166, 137, -163, -89, + -129, 43, 96, 4, 65, 14, 141, 42, 2, 39, + 28, 1, 34, 113, -3, -109, 61, 24, 4, -16, + 37, -38, -17, 69, 5, -56 + }, + { + 108, 1025, -271, 361, -192, 82, 12, 35, -175, 38, + -237, 434, -352, -316, 13, -30, 734, -167, 1062, 406, + 673, -598, -520, 558, -221, -473, -824, 99, -101, -556, + -926, -487, -184, -591, -199, 130, 928, -704, -16, 97, + 152, -286, -494, 114, 53, -414, 75, -79, -68, -152, + 203, -117, 399, 7, -286, -70, 18, 148, 60, 75, + 170, 159, 82, 42, -76, 119, 258, 68, -123, 74, + 14, -70, -10, -161, 115, -18, 0, -11, 37, 57, + 25, -26, 128, -65, 5, -38, 34, -22, -32, 83, + -16, 43, 5, -58, 57, -120 + }, + { + -2282, 4851, 555, -3059, 256, 183, -85, -368, 304, -1538, + 14, 341, 747, -261, -742, 248, 349, -1495, 283, 503, + -836, 496, -872, -250, -495, -503, 412, 795, -186, -328, + 325, -140, -102, -402, -37, 158, -1561, -569, 283, -485, + 358, 151, 709, -194, -36, 77, -248, 165, -139, 379, + 106, -173, 211, 210, 380, -119, 104, -169, 296, -181, + 111, -95, 68, 169, -97, 86, -204, -95, -2, -205, + 35, 6, -51, 66, -161, 47, 128, 110, -69, -3, + -72, 17, 31, -18, -92, -21, -5, 23, -6, 2, + -14, -10, -47, -14, -59, 39 + }, + { + -11, -252, 43, -86, -169, -6, -25, 36, 373, 106, + -197, -318, 95, -112, -2392, 409, -1111, -25, -932, 2155, + -67, 449, 149, 709, -1040, -932, -757, -1054, -736, 36, + -206, 209, 363, 519, 25, -31, -291, 158, 604, 89, + -47, -41, -40, 12, 214, -226, 329, -448, -72, 5, + 1, -11, 412, 32, -34, -140, -56, -17, -374, -66, + 137, 126, 36, -114, 8, -104, 80, -69, -112, 151, + 4, -3, 40, -25, -73, -9, 71, -47, 2, -77, + 7, 22, 152, -4, 76, 61, 83, -114, -3, 10, + -4, 7, -6, 59, 29, 12 + }, + { + -3932, 1242, 1086, -2129, -487, -72, -129, 79, 431, -633, + -77, 1817, 935, 508, -977, -493, 991, 290, 1065, 288, + 176, -585, 162, -440, 821, -249, -411, -477, 525, 87, + -187, 411, -22, -517, 209, 67, 194, 33, 89, -180, + 149, 170, 222, -36, 515, -66, -32, -170, -17, 16, + 504, 139, 300, 50, 99, 90, 269, 128, -303, 19, + -21, -138, 63, -123, -39, -90, -34, 109, 3, -33, + 5, 44, -2, -18, 41, -281, -150, 24, -58, -79, + -3, 14, 8, -49, -77, -34, 55, 75, 107, 82, + 13, 63, 108, -52, 1, -27 + }, + { + -37, -401, -152, -188, 3, 110, 17, 378, 166, -45, + 75, -222, -471, 430, -747, 236, 188, 489, 1025, 1092, + -119, 1289, 928, -854, -1426, 87, -672, -790, 1763, 465, + -688, 304, -645, 1018, 445, -447, -75, 556, 160, -381, + 260, 415, -160, 158, -206, -374, -74, 20, -21, -229, + -39, -92, -22, -338, -135, -88, 183, 266, 410, -66, + 167, -157, 220, 111, 22, 109, 132, -248, 106, 314, + 75, 46, 284, 113, 15, -29, -14, 105, 124, -90, + -18, -167, 84, 49, 12, -21, -90, -9, 9, 63, + 102, -88, 60, -25, -63, 19 + }, + { + -1529, 22738, 1343, -2709, -343, -216, 567, -781, -186, 23, + 33, 307, 989, 761, 419, -560, 948, 23, 769, -435, + -84, 231, -53, 215, 50, 144, -50, 404, -518, 150, + 253, 316, -24, 45, 382, -96, 33, 265, 218, 223, + -245, 314, 394, 35, 48, -449, -208, 168, -26, 189, + -116, 309, -142, -55, -128, 148, -301, 91, 24, -238, + 40, -214, 194, 223, -270, -48, -155, 44, -20, -149, + 42, 55, -170, 85, 29, -28, -109, 76, 13, 27, + -34, -12, -75, 44, 54, 23, 58, 96, 40, 12, + 37, 6, -15, 30, -91, 83 + }, + { + -204, 2628, 445, -941, -62, -155, 578, 107, 284, 94, + 684, -315, -365, -1255, 272, 37, -560, -361, 352, -46, + -1028, 206, -552, 807, 550, -291, -52, 606, 818, -611, + 154, -66, 968, -386, 362, 86, 223, 285, 493, 402, + -13, -7, -65, 332, 552, 375, -165, 179, -161, 362, + 359, 116, 1, 198, 58, -89, -115, 70, 228, 135, + 420, -43, 4, -158, 83, 41, 5, 30, 221, -85, + 134, 103, 59, -78, -14, -74, -68, 10, 222, 52, + -163, -183, -70, 75, -48, -26, -20, -40, 45, -85, + 146, -1, 14, -20, -30, 10 + }, + { + -2031, -7220, 138, 131, 77, -1180, 967, 776, 219, 465, + -293, 306, 268, -639, -686, -272, -311, 154, -1337, 266, + -161, 311, -144, -152, 277, -136, -17, -744, -516, 129, + 523, 716, 50, -121, 445, -60, -146, 312, 505, 453, + -117, 229, 89, -268, -98, -684, 403, -394, 6, -6, + 188, -192, 209, 265, 366, -360, -22, -85, 123, -46, + -98, 81, 16, 468, 48, 32, -46, 70, -122, 147, + -35, -99, 32, 44, 12, 30, 120, 59, 32, 25, + -139, 36, 32, -20, 21, 19, -9, -9, 73, 30, + 21, -14, -35, -59, -74, -6 + }, + { + 75, 3452, -99, 113, -131, 227, -257, 38, 349, -267, + 392, -128, 1137, -563, 892, 702, -613, -87, -692, 1035, + -581, -715, -639, -479, 138, -236, -128, 524, 429, -866, + 182, -515, 15, -609, 27, -573, -797, -265, 586, -247, + 31, -288, 372, -17, 111, -250, 40, -358, 98, 353, + 475, -94, 213, -109, -26, -294, -261, -70, -311, 108, + 285, -18, -169, 285, -260, -355, 90, -82, 57, 219, + -224, -105, -133, -239, 62, 238, -11, 106, 131, 47, + -37, 22, -152, 242, -71, 109, -57, -127, 33, 9, + -16, -18, -162, 123, -76, 14 + }, + { + 299, -7420, 853, -336, -88, 442, 82, -585, -530, -1672, + 472, 1056, -240, -1074, -829, 872, -1609, 177, -27, -410, + -325, -284, 710, -301, -439, -127, 352, 869, 616, -82, + -579, -101, 379, 75, 997, 725, 267, 342, -343, 813, + 773, 49, -46, -36, 24, 157, -161, -139, -188, 169, + -302, 261, -92, -422, 534, -128, -32, 561, 6, 282, + 10, 210, -43, 218, 25, -24, -51, 107, -78, 314, + -158, -11, -167, -82, 68, 47, 80, -69, -191, 121, + -202, -5, -50, -100, 60, 26, 15, 126, -45, 77, + 1, 85, -12, -33, 71, -22 + }, + { + 261, -2852, -333, 370, 287, -23, 36, 648, 798, 159, + -1010, 352, 43, -1787, 6171, 406, 671, -68, 2109, -2186, + -134, 1271, -419, 572, 954, -634, 344, 16, -897, 392, + 294, 173, -607, -429, 335, -572, 117, -444, -8, -315, + -297, 288, -211, 196, -181, 197, 7, 47, -106, -274, + 68, 305, -182, -175, -29, -174, 30, 92, 192, -20, + 30, 114, 56, -126, -16, 174, -456, 8, 196, 176, + -122, -186, -184, 46, 81, -85, 19, -357, 103, 52, + 26, 231, -17, -99, -42, 94, -80, -129, 64, 87, + -35, -81, -41, -68, 0, 59 + }, + { + -1186, -4560, -702, 1230, 32, 86, -548, -245, 36, -42, + 245, 295, 326, -1018, -3404, -8, 399, 100, -485, -511, + -721, 18, -45, 340, -209, -470, -121, -1001, 1241, 102, + -482, -331, 47, -983, 131, 557, 429, 98, 14, 464, + 304, -471, -198, -115, -221, 75, -317, 454, 451, 111, + -132, 498, -152, 317, -348, -55, -132, -265, 87, 97, + -200, -143, 106, -255, 244, 74, 82, 60, -259, -249, + 302, 97, -106, -226, -111, -85, -68, 116, -66, 85, + 25, -159, 42, -4, 59, 21, -54, 105, 65, 55, + 51, 92, -107, -99, 78, 7 + } + }, + { + { + 80, 3967, -441, -680, -92, 39, 236, -518, -67, -1140, + -1096, 496, 230, -1232, -56, -6, -114, -717, 1477, -200, + 1374, 1009, 526, -486, -152, 1092, -500, 16, -454, -271, + -291, 342, -17, -638, 162, 989, 641, -266, 276, 234, + 62, -215, -71, -88, 855, 278, 88, -298, -181, -53, + 83, -38, -364, 275, 134, -14, -201, 159, 41, -5, + 129, 90, -110, -141, -178, -12, -341, -137, -74, 74, + 88, -197, -64, -169, -118, -71, -48, -15, 152, -196, + 71, 81, -25, 50, 148, -60, -55, 11, -72, -42, + -25, -1, 59, -39, -16, -28 + }, + { + -1482, -11991, 2126, -1563, 224, 324, -704, -196, 182, 450, + -995, 339, -149, 169, -128, -2531, 967, 699, -776, 839, + -351, 25, -828, 342, -576, 391, -411, -139, 257, 200, + -171, 207, -290, 346, 297, -752, -787, -459, 287, 510, + 110, 443, 21, 754, 27, -71, -155, -668, -125, -249, + -87, 468, 35, 175, 7, -20, -31, -161, -331, 7, + 89, 116, 40, -158, -2, -24, -168, -33, 283, -107, + -80, 23, -6, -197, -174, 196, -124, 50, 35, -1, + 79, 9, 6, 105, 42, 46, 143, 58, -16, -15, + -30, -82, 45, 63, -64, -8 + }, + { + -306, 2912, 2290, 1086, -63, 278, -210, 941, -114, 415, + 714, -92, -723, 899, 1457, 492, 161, 81, -857, -646, + -235, -261, 118, 922, -562, 15, -506, 676, -36, 573, + -520, 529, -141, -839, -241, 228, -100, -49, 489, 90, + 548, 238, -310, 75, -290, -244, 471, -170, -114, 185, + 3, 456, 51, -18, -133, 153, 233, 45, -85, 214, + 24, -14, -39, 18, 278, 3, 36, -126, -51, -51, + -169, 21, 93, 94, -106, 106, 33, 151, -29, -1, + 11, -25, 42, 69, 48, -57, -21, 88, 65, -59, + 80, -68, -15, 56, -17, -8 + }, + { + -110, 452, 282, 115, 54, 15, 39, -93, -105, -192, + -24, 62, 453, -949, -715, 698, 768, -178, 495, 138, + 735, -706, 13, -250, -356, -299, 325, -598, -223, -1067, + -245, -139, -882, -48, -213, 493, -562, -492, 788, -7, + -234, 345, -696, 255, -365, -127, -293, 194, -61, -272, + -50, 222, 15, 158, -252, 25, -83, 169, 83, -67, + 205, 209, -22, 165, -28, 35, 316, 86, -122, 116, + 9, 21, -147, -56, 10, 60, 77, -137, 77, 51, + -11, 111, 61, -64, 15, -107, 99, -40, -37, 32, + 8, 61, 39, -13, 4, -88 + }, + { + 3159, -315, -1243, -2137, -81, 163, -444, 151, -234, -440, + -1265, 947, 350, 624, -103, -738, 198, -1036, -322, 98, + 149, -580, 292, -1120, 420, -587, -206, 174, 281, -96, + 409, -282, -174, -244, 65, -326, -1956, 169, 343, -1069, + 988, -218, 935, -518, 144, -105, -172, 15, 54, 437, + 39, 228, 74, 49, 341, -223, 116, -26, 176, 130, + -134, -109, 48, 70, 202, -15, -170, -111, -58, -68, + 108, -98, -54, 62, -77, -53, 134, -65, 86, 30, + -57, 33, -6, -42, -66, -51, 100, -11, -40, 24, + 18, -11, -65, -54, 28, -25 + }, + { + -95, 69, -114, 68, -251, 31, -1, 10, 179, 71, + 68, -602, 184, -746, -1907, 386, -806, -221, -396, 1667, + -49, -482, 503, 424, -1039, -1026, -114, -1253, -499, -889, + -419, 556, 676, 767, -117, 350, -347, -278, 249, 296, + 248, -274, -204, 40, 52, 26, -188, 137, 126, -72, + -92, 153, -132, 109, 22, -73, -147, -164, -147, -50, + 66, -49, 66, -66, -3, -82, 13, 106, -192, -34, + 330, -66, -70, 36, 28, -106, 45, -73, -27, -94, + 57, 67, 93, 55, 65, 108, -8, -74, 31, 33, + -12, -67, 63, 12, 34, -19 + }, + { + 4578, -7185, -1711, -1560, -38, -318, 354, 357, -974, 291, + -417, 2360, 267, 705, -1026, 16, 310, 1099, 152, 713, + -169, -730, 779, -45, 261, -209, -101, -606, 715, -643, + 54, 711, -241, -75, 355, 72, -186, 241, 122, -192, + 139, 151, 185, 75, 364, 239, -689, 335, -87, -106, + 273, 312, 293, -83, 205, 224, 29, 190, -71, -150, + -28, -309, 355, -197, 77, -14, 80, -125, 36, 100, + -18, -13, 44, -30, 12, -261, -39, -58, -52, -124, + -10, -60, 89, -78, -168, 42, 127, 84, 34, 74, + 69, 24, 88, -130, 30, -11 + }, + { + -88, 66, -223, -208, -114, 81, 130, -89, 793, -153, + -179, 157, -604, 943, -1527, 371, 200, 1095, 974, 506, + 258, 1714, 367, -1109, -837, -681, -358, 297, 1076, 309, + 494, -467, -508, 969, 166, 193, 6, 398, 252, -125, + -44, 52, 204, -34, 64, -458, 113, -371, -421, 28, + 91, -70, -375, 73, -351, 184, 191, 230, 314, 145, + -117, 150, 62, -59, 64, 89, 32, -147, 203, 236, + 39, 141, 160, 141, 34, -19, 3, 120, 40, 30, + -37, -70, 53, -6, 12, -48, 8, -83, 88, 101, + -27, -49, 35, -83, -39, 80 + }, + { + 3264, 19950, -2355, -1350, -536, 2, -234, -465, -52, -251, + 145, -27, 741, 321, 633, 255, 879, -542, 763, -386, + -223, 503, 312, 221, 138, 39, -99, -110, -100, -204, + 773, 264, -373, 189, 349, -60, -248, 326, 533, 116, + -11, -87, 269, 256, -377, -120, 23, -162, -266, 219, + 502, -195, -51, -83, -194, -130, -62, 92, -109, -38, + 19, -148, -47, 188, -322, -11, 35, -166, 12, -4, + 37, -27, -102, 22, 82, -207, 40, 138, -17, 50, + -119, 9, -54, 20, -23, 71, 98, 77, 54, -63, + 53, 8, -32, -43, -30, 99 + }, + { + 137, 4167, -578, -749, -327, 705, -273, 642, -379, 190, + -40, -149, -323, -739, -353, -501, -301, -205, 1206, -1204, + -1731, 160, 175, 930, 199, -97, -1, 434, 497, -225, + -613, 654, 382, -120, 357, -26, 168, 773, -387, 539, + 46, 189, 44, 546, 538, -28, 431, -181, 262, 376, + 55, 55, 422, -188, -35, 36, -97, -36, 427, 107, + -5, 135, 170, -115, 130, -128, 177, -33, 145, 3, + 258, 2, -42, -83, -32, -49, -19, 31, 118, -22, + -74, -211, 26, -69, 128, -108, 18, -48, -29, 55, + 37, 37, -16, 44, -20, -40 + }, + { + 2096, -9807, -1869, -111, -832, 2403, -83, 566, -251, 657, + -331, 697, -515, 746, -1145, -43, -68, -115, -788, 208, + -241, -368, 436, -351, 457, -488, -399, -238, -728, 319, + 489, 550, 20, 305, 261, 86, -30, 168, 260, 587, + 323, -236, 66, -401, -125, -574, 390, -191, -189, 213, + -1, -94, 137, 485, -6, -26, -257, 176, 210, -354, + -122, 78, 165, 226, 17, 228, -143, -12, 1, 122, + -49, 18, -86, 210, -110, 7, 137, -71, 124, -34, + -79, 25, 48, 6, -25, -8, 16, -16, 71, 26, + -40, -22, -71, -41, -42, -22 + }, + { + -119, 3057, 536, 87, 259, -225, -54, 176, 109, -106, + 124, -194, 1182, -1167, 732, 169, -22, 529, -223, 491, + -892, -272, 684, -421, -826, 57, 264, -232, -225, 317, + -644, 315, -13, -670, -225, -522, -671, 220, 6, 97, + -530, -192, 488, 199, -269, 135, -462, 380, -43, -93, + 342, 54, 291, -240, 72, -265, -516, -146, -99, 43, + 317, -37, 45, 33, -299, -95, -69, -21, 180, -92, + -52, -164, -88, -172, 122, 87, 1, 138, 157, 19, + -11, 59, -28, 81, 56, 14, -11, -84, -7, -23, + -14, -22, -9, -53, -28, 60 + }, + { + -2003, -5072, 1412, -396, 291, -972, -495, -272, 242, -1709, + 820, 135, 190, -939, -1085, 204, -21, -358, -1, 378, + -418, -484, 308, -94, -479, -44, 114, 885, 699, -244, + -771, 544, 561, -447, 1394, 805, 58, 172, 44, 419, + 773, 599, -422, 162, -834, 420, 13, -126, -119, 26, + 237, -65, -21, -199, 161, 97, -10, 382, 29, 477, + -67, 12, 161, 184, -79, 50, 64, 29, 145, 85, + -93, -56, -99, -64, -12, 44, 55, -54, -77, 63, + -215, -6, 46, -54, 29, -20, -5, 5, 163, -49, + 61, 54, 19, -35, 16, 45 + }, + { + -177, -3527, 519, 442, 484, 60, 527, 33, 1016, -144, + -625, 291, 425, 3123, -1824, 1338, 561, -241, 1268, 132, + -1034, 1020, -572, 805, 57, 183, 872, -234, -856, 125, + 446, -276, -664, 46, 93, 12, -752, 155, -55, -740, + 348, -384, 24, 553, -149, -152, 86, 73, -276, -291, + 365, -88, 23, -82, -241, -39, -5, 214, 170, -197, + 241, -68, 244, -341, 58, -118, -56, 40, 88, 49, + 72, -285, -60, 8, -53, 71, -173, -70, -106, 66, + -43, 146, 60, -43, -69, 41, -92, -90, 86, 71, + 95, -94, -170, -27, 10, -9 + }, + { + 105, -6115, -947, 1316, 115, -1157, -300, 378, 22, -340, + 1418, -908, 717, -1663, -2444, 367, -17, -115, -951, -244, + -369, -110, -321, 742, -174, -1011, 387, -695, 693, -158, + 342, -135, -201, -977, -450, 1188, 542, -203, 36, 717, + 196, -581, -35, -449, 237, -445, -97, 379, 677, -42, + 10, 432, -323, 143, -25, -235, -403, 161, -85, 264, + -246, -268, -56, -126, 214, -38, -82, 104, 13, -196, + -52, 386, -149, -293, -102, -233, 99, 153, -187, 2, + 129, -76, 57, -16, 23, 57, -12, 161, -15, 138, + 4, 88, -60, -130, 61, -12 + } + }, + { + { + -74, 2854, -1268, 39, 498, 41, 232, -283, 213, -37, + 110, 573, 89, -454, 528, 238, 943, -713, 834, -53, + 1524, 719, -273, -1187, -536, 933, 88, 293, -411, -709, + -23, 1338, 592, 261, 290, 313, -143, -152, 295, -39, + -160, -245, 249, 36, 426, -276, 152, 303, 141, -72, + -134, -103, -504, 106, -150, -96, -86, 145, 40, -177, + 18, 50, -174, -157, -94, 3, -120, 154, -1, -108, + -35, -62, 136, 83, 144, 40, -23, 103, 233, -135, + 69, 109, -71, -30, 123, -4, -57, -80, -139, -73, + -41, -69, 62, 4, -30, -22 + }, + { + 1314, -11871, -866, -911, 556, 22, -343, -6, -17, 1253, + 297, 1179, -389, 514, 619, -2332, 211, 326, -481, 590, + -747, -377, -857, 348, -771, 775, 648, 386, 50, 181, + 261, 372, -777, 432, 394, -507, -345, -354, 514, 693, + 71, 134, -756, 264, -215, -347, 78, -303, 251, 56, + -136, -64, -346, -32, -109, 129, -84, -270, -187, 150, + 79, -262, -177, 29, 209, 16, 81, 120, 214, -132, + 15, 109, 208, 12, -160, 108, -142, 159, 58, -33, + -19, 37, 51, -17, -106, -19, 130, -1, -26, 110, + 82, -55, 41, 21, -90, -20 + }, + { + 335, -1371, -1242, 1533, 180, 188, -338, 447, -480, 280, + 174, 54, 243, 594, 750, -43, -381, 405, -14, -97, + 120, 639, 978, 1670, -246, -161, -925, 404, -822, -178, + -955, -210, -672, -770, -124, 178, -243, -71, 560, -132, + 54, 59, -10, 218, -360, -309, 455, -63, 22, -7, + -210, -10, -272, -82, -230, 170, 232, -12, -371, -37, + 77, -53, -63, 9, 125, -230, 138, 77, 36, -88, + -159, 22, 15, 35, -182, 13, -99, 20, -128, -99, + -142, -129, 18, 68, 148, 69, 3, 82, 112, -16, + 65, -18, 9, -21, -46, 9 + }, + { + 144, -48, -386, -265, -226, -37, 34, -208, -255, -255, + -188, 224, 1096, -1085, -129, 691, -902, -383, 792, -311, + -83, -527, 468, -653, -680, -190, 289, -1095, 18, -223, + 189, -679, -1579, 4, -127, 18, -880, -575, 769, 123, + -186, 491, -387, 387, -252, 155, -412, -227, -113, 45, + -272, 194, -75, 97, -55, 72, -159, -1, -90, -262, + 48, -62, -95, 160, -137, 18, 255, 79, -224, -47, + 160, 156, -138, 52, 29, -49, 11, -138, 56, 34, + -27, 51, 17, -41, 52, -27, 76, -57, -11, 58, + -23, 43, 41, -50, -1, -41 + }, + { + -3498, -6243, 1845, -850, 294, -69, -477, 484, -646, -169, + -465, 1395, 276, 599, 259, -442, -557, -692, 287, -92, + 552, -264, 617, -759, 1023, -62, -191, -109, 242, 239, + 67, -485, 6, -106, 274, -180, -633, 810, 53, -1283, + 567, -412, 729, -274, 429, -107, -236, 180, 29, 205, + 111, 131, -89, 1, 158, -334, 216, 164, 47, 122, + 0, 40, 133, 179, 192, -180, -39, 147, 117, 91, + 225, -61, -16, -26, -135, -81, 61, -43, 129, 48, + -55, -4, -2, -107, -11, 57, 133, 52, -11, -25, + 14, 44, -31, 3, 106, -49 + }, + { + 44, 588, 67, 399, -64, -9, 28, -129, -136, 71, + 300, -600, 116, -903, -1452, 1226, 252, 292, 158, 1929, + -327, -1560, -932, -411, -741, -621, 86, -346, 228, -198, + 93, 472, 354, 419, -227, 441, -252, -521, -420, 147, + 494, -376, -118, -228, -387, -76, -249, 366, 247, -251, + -351, -58, -366, -75, -330, -221, 68, -90, 89, 57, + -140, -133, -140, -239, -20, -216, 18, 175, -285, -149, + 500, 123, -52, -39, -75, -172, -110, -94, 20, -27, + 128, 76, 16, 7, -46, 56, 44, -36, 45, 40, + -30, -94, 6, -61, -23, -26 + }, + { + -4196, -15430, 2353, -85, 533, -61, 44, -352, -1389, 958, + 357, 1837, -904, 551, 70, -1, -228, 237, -973, 876, + -55, -618, 445, -242, 149, -284, -25, -505, 738, -420, + -165, 369, -23, -31, 324, 604, -484, -306, 55, 232, + 366, -69, 76, 81, 139, -115, -563, 327, -419, -162, + 61, 447, 377, -299, -46, 120, -34, 113, -16, -153, + 47, -83, 452, -95, 388, 178, 167, -102, 17, -30, + -53, 195, 115, -185, 39, 12, 53, -130, 37, -76, + -98, -23, 2, -127, -122, 63, 44, -11, 18, 36, + -4, -122, -54, -58, 114, 69 + }, + { + 25, 843, 143, 34, -109, -4, 115, -61, 1121, -37, + -213, 391, 84, 1266, -872, 791, -1195, 414, 229, 114, + 624, 554, -479, -798, -24, 483, 806, 873, 289, -235, + 958, 66, 97, 521, -424, 412, -63, 142, 54, -37, + -41, 92, 408, 16, 258, -403, -207, -322, -405, -255, + -192, -23, -241, 43, -26, 474, -5, 20, 106, -25, + -163, -43, -315, -184, -29, -87, -70, -110, 51, 99, + -147, -88, -50, -50, 89, 80, -19, 128, 59, 53, + -42, -8, 70, -26, -53, -80, 13, -43, 69, 27, + -17, -7, 44, -62, -8, 99 + }, + { + -4543, 14150, 2560, 29, -706, 70, -414, -225, 236, -711, + 439, 431, -70, -955, -359, -332, -85, -812, 442, -375, + 20, 486, 381, 88, -140, -347, -431, -135, -284, -618, + 644, 187, -539, -14, 104, 73, -62, 417, 71, -213, + 96, -278, -390, -77, -286, 166, 163, -366, -384, 133, + 369, -217, 84, -220, -64, 223, 104, 228, -49, 12, + 39, 3, -231, 2, -207, 160, 295, -28, 46, -17, + 14, -17, -178, -137, -2, -146, 121, 145, -7, 1, + -96, 7, 1, 9, -7, 62, -36, -20, 83, -65, + -53, -58, -61, -63, 8, 31 + }, + { + -53, 5072, 932, 260, 68, 709, -1034, 426, -243, -97, + -708, -459, -628, -1301, -331, -476, 317, 878, -376, -2578, + -1171, 117, 253, 972, 58, -268, -251, -581, -475, -616, + -571, 608, -130, -289, -14, -167, -173, 143, -973, 520, + 45, 168, 19, 107, 176, -282, 367, -50, 162, 78, + -159, -315, 404, -292, 17, 149, -307, -427, 313, 273, + -56, 176, 247, 50, 368, 21, -29, -186, 145, -118, + 89, -61, 0, -60, -128, 70, 174, 24, 15, -50, + 56, -115, -65, -178, 160, -4, 60, -69, -98, -11, + -53, 21, -49, 5, 41, -30 + }, + { + -2072, -10289, 2599, 149, -752, 2104, -567, 251, -1030, -303, + -192, 428, -1064, 1394, 152, 501, 3, -246, -431, -8, + -120, 241, 846, -462, 107, -515, -287, 382, -417, 7, + 91, 190, -381, 68, 489, 743, 301, -80, -415, -179, + -230, -531, -23, -405, 210, -481, 272, 196, 477, 448, + -281, -107, -160, 228, 113, 343, -2, 9, -113, -418, + -134, 13, -23, -89, -209, 110, -77, 62, 8, -102, + -224, 130, 85, 224, -97, -25, 80, -172, 0, -1, + 13, -33, -25, -30, -26, 29, -12, -60, 10, 19, + -74, -83, -36, 65, 13, -77 + }, + { + 167, 2114, -619, -94, 215, -82, 158, 236, 124, -54, + -557, -624, -52, -3446, -799, 860, 649, -117, -100, 642, + 300, 32, 1592, 278, -1098, -79, -317, -527, -400, 56, + -954, 1178, 864, -517, 299, -7, 173, 566, -181, 72, + -775, -237, 583, 267, -562, 429, 187, 564, -200, -533, + -68, -29, 122, -676, -202, -78, -189, -31, 94, 173, + 180, -58, 17, -199, -273, -54, -75, 114, 274, -62, + 90, -67, -111, -93, 175, -132, -149, 47, 83, 155, + 81, -12, 58, 34, 1, -29, -28, 25, -16, -22, + 62, -14, 60, 14, -30, 57 + }, + { + 3132, 1218, 331, -524, 1306, -1302, -1197, -10, 1275, 265, + 944, -877, -358, -347, -725, 344, 454, -708, -215, 629, + -190, -720, -124, 184, 247, 282, -558, -352, 554, 824, + 31, 705, 304, -859, 825, 553, 82, 286, -207, -89, + 630, 589, -342, 133, -835, 133, -53, 352, 568, 266, + -1, -336, 48, -428, -261, 78, 73, 238, -79, 381, + -122, -150, -39, 9, -207, -38, 113, 193, 73, -67, + -56, 26, 77, 25, 11, 70, 28, -76, 53, 181, + -73, 126, 89, 80, 18, -34, 68, -64, 48, -49, + 95, -3, 65, 42, 73, 31 + }, + { + 146, -4562, -549, -184, 106, 97, 389, -430, 367, 7, + 10, 467, -102, 331, -5765, 418, 409, 531, 423, 1483, + 81, 592, -303, 462, -174, 844, 1052, 60, -731, -689, + 196, 125, -514, 124, -216, 665, -65, 249, 134, -713, + 282, -341, 301, 618, -69, -33, -194, -189, -201, -132, + 316, -170, 163, 176, 0, 146, 177, 76, -158, -312, + 37, -292, 139, -243, 181, 98, 157, -149, -144, -135, + 198, 156, 117, -42, -7, 65, -132, 69, -138, -83, + -240, 29, 69, 139, 96, 24, -28, -48, 41, 98, + 188, -6, -109, -18, 9, -57 + }, + { + 1227, -4610, -1047, 910, 300, -913, 139, 458, -813, -540, + 1661, -1302, 680, 349, -26, -137, -1519, -1098, -1257, -140, + -79, 615, 70, 644, 554, -410, 847, -103, 157, -233, + 769, 645, 291, -410, -593, 635, 635, -164, -38, 514, + -207, -70, 402, -199, 564, -315, -233, 62, 675, 47, + 95, 301, -354, -245, -279, 110, -196, 52, -129, 268, + -125, -65, -82, -129, 102, -101, -168, -52, 214, -1, + -144, 325, -22, 5, 22, -97, 125, 110, -176, -81, + 224, 54, 40, -26, -84, -38, 100, 179, -107, 58, + 19, 139, 24, -19, 97, -90 + } + }, + { + { + 14, 449, 426, 1173, -399, -41, 211, -62, -161, -283, + 1470, -66, -142, 740, 712, 164, 505, -16, -403, 134, + 1363, 101, 16, -1338, 493, 391, 189, 136, -573, -1094, + 470, 1261, 331, 203, 311, 27, 41, -202, 355, 122, + -313, -345, 311, 384, -189, -553, 175, 573, -51, 68, + -160, -229, -330, -120, -124, 126, 5, 127, -1, -136, + -163, -74, 152, -187, 7, -226, 98, 155, -248, 105, + -116, 32, -46, 95, 266, 61, -90, 188, 66, 132, + -105, 43, -46, 14, 127, -25, -25, -72, -144, -32, + -81, -31, 13, -23, 24, 25 + }, + { + -929, -10733, -254, -852, 872, -307, 152, 492, -405, 202, + 746, 1346, 20, 184, 435, -977, -1222, 179, 452, -347, + 297, -565, -918, -805, 260, 287, 852, 422, 254, 171, + 365, -92, -138, 191, -528, 199, -161, -351, 743, 200, + 153, -175, -289, -313, -132, -299, 37, -184, 83, 157, + 37, -366, -225, -81, -51, 324, -272, -171, -152, 104, + 191, -447, -72, 56, 212, -42, 237, 30, -9, 33, + -41, 226, 42, 132, -48, -27, -93, 142, -14, -40, + -3, 121, -21, -66, -54, 8, 11, 65, -17, 137, + 25, 4, -26, 1, 22, 7 + }, + { + -304, -3801, 1036, 1645, -75, -87, -87, -130, 178, 390, + 553, -803, 451, 641, 78, -72, -190, 813, -319, 477, + -1, 500, 1535, 680, 143, -82, -716, -192, -135, -256, + -523, -987, -681, -253, -233, -111, 113, -289, 210, 202, + -71, -57, 78, 120, -450, -90, 203, -227, 216, -102, + 58, -256, -171, -280, 110, -17, -13, 178, -262, -228, + 131, -133, 100, -156, -78, -20, 100, 75, -14, -168, + -6, 61, -51, -2, -32, -78, -48, -118, -144, -6, + -95, -154, -7, 74, 155, 62, 43, 20, 85, 49, + -44, 14, 51, -39, -20, -4 + }, + { + -163, -39, -153, -486, -20, -7, -46, -34, -222, -495, + -23, 195, 788, -430, 1224, 567, -2673, 507, 1054, 206, + -367, -486, 375, -954, -1129, 1052, -925, -671, 141, -766, + 1136, -983, -1455, -81, 272, -1274, 171, -227, 100, 395, + -267, 521, -112, 164, -196, -226, 144, -367, -320, 418, + -165, 54, -41, -39, 108, 41, -270, -212, 205, -232, + 108, -396, 41, 140, -19, -53, 210, 104, -239, -84, + 316, -51, -50, 81, 76, -109, -124, -32, 37, 11, + -12, 3, 82, -40, 65, 27, -44, 23, -73, 83, + 18, 19, 7, -10, -45, 15 + }, + { + 3164, -11926, -941, 50, -94, -228, -97, -35, -239, -234, + -10, 1042, -190, 992, 317, -156, -994, -809, 590, 372, + -78, -125, 103, 475, 69, 718, -279, -229, 434, 99, + -219, -386, 151, 155, -429, -61, 1298, 6, -319, -860, + -18, 17, -144, 311, 269, -397, 129, 348, -349, 118, + 219, 192, -297, 29, 89, -139, 225, 62, 9, 87, + 67, 33, 192, 106, 33, 60, 61, -72, 135, 146, + 251, -69, 99, -204, -72, 3, -106, 64, 19, 86, + -11, -98, 76, -96, 39, 87, 15, 68, 31, 3, + -16, 40, -18, 14, 71, -23 + }, + { + 49, -94, 761, 31, 107, -32, 39, -125, -372, 206, + 242, 38, -234, 910, -1512, -1308, 2025, -146, 68, 1758, + 176, -959, -1164, -596, -659, -174, -293, -92, -563, 1335, + 358, 93, -351, -291, 441, 137, 124, -109, -469, 5, + 451, 35, -172, -518, -367, -49, -247, 247, 5, -273, + -268, -87, -308, -210, -168, -296, 11, -75, 144, 161, + -129, -239, -75, -171, -52, -195, 32, 101, -226, 43, + 309, 113, 4, -25, -269, -146, -79, 69, -108, 23, + 103, 136, -112, 101, -52, -50, 52, 11, 11, 31, + 12, -76, -70, -3, -75, 36 + }, + { + 2888, -21460, -1041, 1182, 135, 65, -215, -730, -387, 220, + 1399, 168, 1, 221, 174, -72, -865, 578, -571, -1, + -200, 163, -44, -461, 233, -156, -2, -159, 176, 162, + -543, 84, 286, 79, 215, 342, -385, -405, -294, 619, + 81, 47, 74, 53, 108, -190, -51, -247, -439, 22, + -140, 553, 139, 3, -182, 130, -65, -30, 238, -173, + 121, 32, 123, 184, 433, -59, 117, 53, 24, -12, + -56, 244, -10, -81, -21, 83, 0, 18, -49, -39, + -71, -51, -90, -109, 14, 9, -29, 30, 28, 63, + -136, -11, -114, 26, 32, 81 + }, + { + 83, 163, 457, 94, -174, 30, 91, 277, 568, 35, + 140, -6, 408, -13, 955, 529, -632, -412, -5, 861, + 52, -238, -300, -549, -288, 997, 676, 980, 289, 811, + -735, 244, 44, 152, -284, 751, -513, 268, 191, -391, + 391, 93, 205, 185, -285, -44, -337, 148, -527, -210, + -352, -231, 238, -458, 453, 329, 19, 154, -296, 77, + -24, -205, -297, -120, -143, 27, -172, -46, -7, -73, + -113, -58, -20, -112, 72, 91, -45, 121, -22, 52, + 129, -137, 95, 22, -186, 88, -87, 25, 2, -29, + 58, 0, -4, -6, -42, 89 + }, + { + 5051, 6132, -2335, 1077, -238, -10, -777, 329, -227, -361, + 667, 800, -1027, -634, -148, -481, -1017, -20, 230, -514, + 668, 25, 34, -295, -25, -181, -529, 72, -282, -219, + -54, 561, -615, -213, 26, 483, -253, 341, 52, 221, + -75, -287, -545, -281, 99, -91, -66, 44, -34, 23, + 37, -73, -89, -24, -27, 313, -83, 324, 88, 28, + 9, 60, -286, -15, -47, 147, 166, 139, -42, -29, + 18, 38, -126, -157, -76, -60, 92, 89, 58, -123, + 50, -6, -16, 4, 99, 32, -55, -65, 40, -33, + -34, -55, -6, -91, -9, -24 + }, + { + -34, 5015, 763, 739, 73, -298, -661, 97, 344, -471, + -234, -378, 205, -1676, -45, -531, 330, 250, -1225, -1135, + -546, -299, 687, -45, 241, -47, 277, -820, -368, -669, + -121, -86, -651, 419, -290, 102, -668, -299, 150, 137, + -303, 301, 248, -357, -126, 166, 45, 280, -3, -186, + -92, 16, 205, -161, -15, -55, -204, -201, 112, 210, + -75, 310, 195, -27, 382, 181, -66, -328, 50, 2, + -78, 159, -110, -6, -198, 84, 235, 82, -6, -42, + 17, -93, -113, -66, 73, 11, 16, -23, -48, -129, + -16, -22, -9, 13, 2, -20 + }, + { + 1892, -10929, -1035, -478, 850, -1076, 832, 498, -372, -1210, + 303, -597, -879, 797, 1608, 156, 433, -560, 61, -786, + 415, 42, 511, 0, -800, 137, -56, 122, -490, -279, + 467, -177, 112, -351, 194, 964, 222, 228, -616, -457, + -271, -144, 48, -428, 114, -182, 29, 374, 393, 671, + -205, -190, -360, -69, 245, 269, 280, -259, -91, -80, + -6, -140, -141, -122, -67, -8, 21, -66, -60, -76, + -168, 69, 178, -12, 34, 20, 36, 15, -121, -41, + 29, 10, -2, -172, 71, -32, -23, 26, -82, -2, + -49, -114, 38, 32, 4, -53 + }, + { + -209, 888, 329, 111, -462, 688, -204, 550, -58, -266, + -439, -427, -579, -3060, -1394, 1175, 1527, -1722, 837, 814, + 370, -877, 1363, 367, -123, -275, -969, -298, -130, -850, + 736, -344, 1020, 482, -122, 36, 583, -374, 330, -307, + -235, 144, -18, 280, -253, 186, 633, 146, -143, -304, + -200, 53, -59, -433, -217, -182, -98, 36, 87, 341, + -108, 63, -63, -317, -10, -229, -3, 109, 207, -17, + 140, -116, -129, -90, -24, 31, -80, -66, 124, 125, + 4, -2, 119, 0, -2, -36, -73, 56, -55, 7, + 127, -28, 41, 23, 26, -21 + }, + { + -2936, 10050, -560, 249, 1497, -1264, -208, 981, 7, 1391, + 67, -874, -643, -157, -567, 148, 641, -558, -189, -399, + 389, -312, -413, -368, 487, 311, -564, -671, 823, 808, + 210, 643, 163, -652, 182, 845, 318, 412, -455, -271, + 595, 351, -176, 205, -254, -433, 210, 267, 558, -12, + -53, -387, -53, -428, -78, -63, 106, 128, 146, 30, + -57, -99, -13, -109, -81, -18, 16, 129, 9, 9, + -84, 116, 2, 57, 64, 121, 71, -153, 64, -75, + 151, 132, 20, 201, -107, -63, 170, -117, 35, -21, + 40, 18, -1, 100, 88, 25 + }, + { + -148, -4890, -79, -436, 14, 485, 63, -281, 100, 298, + -122, 733, -165, -1701, -2710, 268, -676, 1653, 291, 78, + 560, 298, 437, 359, -618, 540, -163, 412, 583, -1074, + 583, -107, -365, 227, -65, -43, 260, 215, 195, -222, + 70, -342, 372, 196, -153, 421, -458, -24, -96, -1, + -79, 4, 216, 89, -96, 360, 293, -142, -338, 41, + -294, -112, 4, -85, -6, 247, 148, -212, -176, -122, + 81, 82, 226, 86, -45, -81, 50, -10, -68, -26, + -195, -83, 124, 201, 67, -51, -4, 6, 106, 24, + 110, 28, -23, -38, 9, 19 + }, + { + -2137, -4, -1101, 1399, 695, -908, -181, 271, -577, 163, + -350, -30, 285, 99, 1518, -1117, -1206, -820, -1554, 297, + 165, 263, 286, -113, 1156, 281, -221, 583, -1020, 990, + 122, 850, 383, 68, -439, 251, 377, -285, 303, 389, + -731, 486, 203, 70, 88, -17, -48, -124, 373, 147, + 350, 61, -264, -363, -115, 147, -84, -100, -29, 157, + -166, 77, -133, -31, -69, 86, -199, -147, 337, -5, + -55, 67, 29, 172, -141, 118, 109, -23, -88, -82, + 94, 128, 45, -17, -44, -185, 227, 44, -56, 38, + 30, 93, 78, -7, 81, -46 + } + }, + { + { + 49, -1197, -611, 874, -463, 147, 198, -156, -51, -392, + 1410, -346, -240, 729, 547, -231, -94, 591, -553, -1326, + -316, -315, -6, -586, 1706, 185, -518, -408, -594, -1017, + 17, 220, -242, -246, 387, 385, 313, -559, -345, -42, + -279, -323, -16, 160, -116, -669, -325, 122, -144, 405, + 27, -144, -200, -173, 37, 209, 2, 252, 66, -105, + -154, -102, 362, 60, 65, -279, 44, 105, -237, 87, + -156, 51, -49, -85, 39, 37, -139, 57, -88, 49, + -218, -50, -3, 116, 120, -85, -3, 6, -66, 5, + -67, 22, 71, 24, 24, 13 + }, + { + 510, -12402, -3356, -2205, -330, -440, -85, 59, -585, -738, + -588, 815, 149, -257, -119, -346, -729, 142, 409, -672, + 278, -246, -594, -1019, 384, -151, 185, 401, 341, 68, + 186, -143, -225, -57, -453, 206, 2, -273, 168, -670, + -257, -56, 195, -347, -133, -116, -83, -506, -180, 318, + 333, -104, 13, -174, -281, 442, 77, 99, 69, -20, + 76, -303, -173, -169, 62, -163, 134, -12, -240, 2, + 5, 194, -102, 80, -13, -23, -119, -61, -170, -83, + 11, 133, -79, -35, 74, 63, -43, 37, -25, 119, + -25, -10, 4, 51, 39, 35 + }, + { + 246, -4749, -596, 163, -1085, -317, -147, -36, 285, 522, + 809, -959, -8, 370, -610, -181, 295, 899, -803, 704, + 64, 259, 1354, -104, 366, 328, -466, -279, 189, 396, + 623, -424, -331, 60, -41, 230, 371, -293, -11, 125, + -69, 86, -266, -234, -63, -97, -367, -465, 25, -6, + 115, -454, -74, -95, 80, -205, -156, 209, -137, -243, + -73, -161, 137, -330, -157, -1, 83, 142, 54, -138, + 9, 82, 12, 60, -50, -127, 90, -5, -55, 83, + 36, -53, -25, -38, 33, -11, -43, -74, 25, 37, + -73, -12, 15, -8, 21, -29 + }, + { + 126, -172, -432, -256, 103, 13, -79, 104, 9, -418, + 47, 141, 254, 131, 3344, 1700, -2322, 1181, 1693, 1118, + 728, -136, 270, -131, -644, 619, -1294, 245, 779, -773, + 1425, -52, -408, -296, -353, -712, 1054, 262, 125, 276, + -191, 293, -39, 341, -124, -257, 520, 145, -77, 498, + -53, -105, 92, 97, 110, 3, -222, -126, 421, 28, + 194, -259, 112, 43, 66, -39, 134, 91, -127, 18, + 235, -171, 57, 122, 88, -61, -46, 17, -26, -48, + 19, -10, 56, -26, 44, -23, -74, 98, -14, 36, + -19, -13, 20, 34, -61, 4 + }, + { + -2200, -15256, 2024, 184, -1, 13, 224, 59, 73, -55, + 129, 493, -744, 337, -44, 210, -385, -1453, 39, 366, + 6, -358, -533, 380, -548, 677, 520, 738, 1105, 441, + -709, -972, 103, 379, -570, -111, 1530, 296, 264, -615, + -384, -176, -240, 376, 207, -162, 315, 359, -299, -177, + -123, 86, -237, -98, -112, -189, 231, -152, -76, 121, + -77, -176, 34, 8, 22, 84, 29, -142, -11, 1, + 84, -186, 80, -239, 38, 197, -42, 138, 7, 56, + 0, -84, 140, -45, -26, 7, -51, -9, 41, 110, + 5, -11, -92, -38, 18, -10 + }, + { + -19, -1016, 310, -355, -82, -2, 17, -24, -339, -92, + 150, 228, -424, 1149, 286, -418, 1969, 22, -90, 1409, + 185, 131, -89, -478, -443, 644, 99, 250, 50, 1850, + 930, -381, -781, -39, 275, -263, 624, 823, 113, -34, + 364, 431, 95, -305, -220, -42, -131, -201, -673, -421, + 40, 239, 4, 60, 100, -402, -73, -84, -55, 55, + -50, 75, 108, -87, 49, 59, 109, 30, -94, 67, + 47, -133, -55, 101, -162, 55, 152, 179, -4, 10, + -5, 66, -170, 33, -96, -95, 54, 10, -27, 63, + 69, -70, -107, 62, -47, 13 + }, + { + -1057, -23857, 1278, 1772, 45, -14, -567, -434, 508, -635, + 99, -893, -346, -127, 471, 204, -1111, 232, -602, -677, + -576, -7, 27, -267, 265, -138, 145, -166, -389, 46, + -370, -10, 86, 7, -31, 57, -663, -623, -612, 202, + -166, 186, 5, -16, 363, -216, -98, -297, -193, 164, + -194, 152, -100, 388, -63, 145, 121, -14, 345, 40, + 212, 8, 52, 68, 146, -325, -32, 75, 60, 137, + -86, 84, -38, 90, 51, 29, 68, 101, -55, -15, + 1, 16, -33, -30, 55, -29, -87, -13, 27, 54, + -95, 130, -19, 20, -30, -36 + }, + { + -24, -1125, -290, 4, -162, 34, -40, -169, -115, -151, + 196, -104, -565, -860, 1526, 370, -168, -87, 39, 1328, + -277, -395, -143, -742, -108, 761, 411, 326, -670, 1049, + -906, -343, -517, -96, -444, 559, -279, 265, 338, 35, + 300, 47, 38, -340, -646, 119, 137, 424, -327, 63, + -158, -326, 227, -263, 486, 55, -215, 87, -331, 121, + 88, -97, 9, 11, -267, 1, -31, 2, -86, -54, + -114, -124, 5, -95, -43, 48, -16, 123, -31, -3, + 95, -85, 130, 9, -153, 156, -82, 12, 6, -36, + 42, -57, -28, 29, -25, 93 + }, + { + -4646, -2126, 1704, 1389, -276, 223, -453, 200, -411, -78, + -454, -126, 66, 574, -299, -535, -160, 180, 120, -290, + 458, -453, 63, -326, -125, 85, -35, 605, 293, 52, + -262, 567, -297, -443, -444, 704, -131, -149, -4, 736, + 451, 230, -238, -213, 157, 114, 281, 352, 270, 76, + -368, 33, 150, 335, 264, 191, -186, 214, 47, -87, + -11, 143, -117, 167, 85, 7, -44, 170, -59, -98, + 13, 20, -25, 90, 61, -28, 83, 5, -13, -50, + 163, 46, -4, 3, 46, 2, -57, -82, 84, 68, + -11, -75, 19, -41, 54, -1 + }, + { + 89, 3266, -1382, -369, -281, -81, 341, 23, 377, -355, + 267, 578, 574, -962, 1784, 422, 510, 450, 53, 590, + -181, -252, 684, -188, 545, 400, 954, -71, 598, 258, + 329, -104, -423, 25, -693, -13, -230, 194, 145, -109, + -471, 146, 445, -246, -143, 482, 7, 236, -190, -256, + -67, 98, 86, -49, 46, -77, 70, 66, 167, 291, + -132, -53, -91, -283, 161, 72, -118, -90, 198, 65, + -214, -43, 41, 273, -58, 31, 164, 64, -1, 29, + 3, -67, 16, -50, -104, -83, 36, 11, 11, -74, + 56, 28, -12, -8, 28, 18 + }, + { + -1617, -9993, 2853, -1760, 322, -1606, 919, 1211, -148, -1062, + 609, -34, -170, -357, 959, 440, 741, -260, 174, -1078, + -507, -713, -119, 188, -541, 209, 194, 284, -317, -143, + 401, -218, 102, -674, -240, 399, -11, 274, -471, -178, + -259, -46, 358, 100, 560, 67, 3, 382, 45, 290, + -108, 110, -7, -121, -88, -117, 108, -50, 152, 130, + 285, 92, 34, -154, -22, -21, -63, -74, -68, -49, + 26, 64, 26, -65, 17, 22, 104, 61, -62, 17, + -34, -45, 49, -119, 74, -95, -61, 34, -73, 6, + -16, -66, 36, -49, -69, -36 + }, + { + 213, -656, -969, 436, -680, 301, -822, 425, 223, -35, + -34, -102, -203, -779, -1014, 88, 1801, -1056, 647, 209, + -514, -2028, 651, -27, 190, 531, -46, 217, 72, -622, + 686, -1286, 157, 229, -103, -22, 369, -130, 575, -365, + -23, 226, -218, 161, -224, -111, 293, -15, 46, -157, + -8, 29, -37, 37, 123, 7, -158, 81, -15, -63, + -260, 160, -134, -409, 20, -11, 204, 24, 55, 38, + 151, -209, -27, -105, -255, 75, 167, 14, -20, -39, + -52, -58, -16, -76, -100, -124, -148, 3, -84, -34, + 111, 9, 65, -25, 16, 25 + }, + { + 1331, 15500, 281, 1194, 1767, 901, 1909, 1476, -650, 1327, + 570, 56, 0, -115, 339, 464, 54, -745, -986, -789, + -223, -617, 480, -56, 116, 70, -611, -772, 265, 127, + 55, 450, 512, -224, -181, 680, 81, 304, -232, -137, + 391, 354, -2, 340, 202, -307, -72, -749, -421, -447, + -242, -507, 270, -42, 269, 255, 148, -112, -273, -114, + 78, -57, 51, 35, -18, -228, -230, -50, -73, 50, + -172, 24, -144, -85, 39, 128, 75, -164, -8, -166, + 54, 1, -51, 64, -63, -84, 23, -90, 50, -112, + -55, -44, -50, 66, -10, -41 + }, + { + 109, -4356, 30, -366, 49, -97, -560, -20, 206, 429, + 306, 1033, -483, 670, 2906, 1494, -1275, 710, 787, -1335, + -1196, -775, -821, -595, -949, -201, -1023, -347, 231, -505, + 778, -176, 107, 232, 86, -187, 79, -4, 109, 112, + 286, -120, 23, -428, -128, 547, -194, 364, 129, -26, + -116, 161, 150, -87, -420, 21, 199, 41, -157, 293, + -123, -39, 6, -151, -180, 9, 25, 52, 53, -114, + -132, -252, 7, 36, 45, -74, -44, -41, 129, 154, + -26, 22, 81, 107, -7, -56, 3, -1, 145, 51, + 55, 20, 46, -10, 18, 55 + }, + { + 2114, 5334, -1250, 2221, 1397, 376, 793, 449, 87, 533, + -765, 98, 377, 222, 1353, -444, -358, -611, -1350, 135, + -46, -6, -246, -399, 774, 205, -387, 267, -159, 1281, + -494, 457, 399, 408, -350, -326, -437, -268, 338, -150, + -490, 311, 184, 315, -394, -63, 21, 129, 68, -377, + 187, 52, 27, 63, 100, 169, -13, -132, -163, -61, + -89, 242, -71, -103, -154, 91, -59, 48, 318, -105, + -101, -88, -100, 81, -163, 117, 102, -29, -63, -161, + -71, 108, -10, 41, 69, -170, 163, 0, -75, 12, + -7, -33, -29, -72, 76, 9 + } + }, + { + { + -79, -1418, -27, -714, 691, 109, -128, 107, -249, 189, + 334, 476, 158, 261, 688, -1657, 287, 742, 81, -941, + -1664, 498, -438, 60, 1200, 222, -223, -1005, -5, -758, + -374, -380, -435, -124, 418, 417, 312, -274, -545, -66, + -58, -425, -133, 88, -26, -382, -488, -31, -89, 470, + 275, -425, -49, -210, 122, 261, 34, -28, 126, -137, + -126, 112, 182, 69, 149, -134, -38, 50, -116, -83, + -23, 3, -31, -42, -71, -37, -8, -3, -116, -12, + -136, -42, -20, 136, 109, -109, -27, 3, -18, -31, + 11, 21, 41, 31, 10, 22 + }, + { + -325, -13941, -302, -2132, -1498, 166, -5, -1005, 577, -466, + -1292, 412, 392, -381, -688, -95, -558, 438, -61, -292, + -564, 387, -369, -766, 126, -154, -48, 328, 239, 453, + 119, -257, -43, -576, 153, -90, -163, 77, -2, -524, + -255, -76, 18, -75, -10, -215, -378, -513, 22, 122, + 287, 156, 50, -225, -147, 277, 204, 0, 142, -44, + -86, -109, -172, -126, -136, -15, -51, 55, -189, -49, + 113, 48, -83, 69, -71, 26, -66, -62, -133, -37, + -97, 72, 24, -31, 47, 35, 25, 2, 12, 48, + -42, -17, 51, 39, 55, 23 + }, + { + -179, -3315, -1135, -1520, 249, -141, -304, 197, 22, 113, + 908, -162, -1008, 656, -377, -363, 485, 138, -505, 781, + 27, 427, 990, -47, 361, 430, -198, -403, 71, 622, + 279, -266, 229, -295, 130, 307, 105, 4, -199, -302, + 482, 122, -246, -381, -90, 20, -450, -290, -93, 108, + -106, -214, -28, 10, 76, -362, -48, 30, -109, -202, + -179, -17, -53, -151, -189, 79, -9, 59, 32, 79, + -17, 12, 92, 70, -68, -169, 155, 14, -21, 45, + 17, 24, -58, -72, 0, -27, -101, 21, -17, 6, + -23, -13, -20, -12, 4, -15 + }, + { + -87, -954, 357, 108, -137, 49, -47, 64, 76, -203, + -74, 157, -325, 623, 3470, 44, -539, 854, 1945, 842, + 405, 782, -141, 39, 228, -1077, 25, 831, -55, -67, + 372, 634, -389, -650, -440, 312, 272, 736, 245, -121, + 17, -190, 72, 262, 241, 23, 348, -100, 204, 304, + -20, -89, 138, 139, -20, -135, -151, 133, 75, 164, + 158, 77, 15, -70, 141, -159, 224, 5, 27, 9, + 89, -61, 95, 23, 27, 35, 35, -2, -18, -83, + 58, -32, -44, 54, 45, -87, 1, 69, 28, -22, + -42, 4, 53, -19, 10, -40 + }, + { + 874, -14352, -1815, -587, 606, 239, -41, -156, 599, 137, + 571, -896, -8, -22, 317, -593, 51, -1355, 108, 242, + -42, 574, -1086, -439, 63, 7, 909, 1758, 194, 121, + -483, -750, 218, 215, -604, 21, 470, 612, 568, -435, + -237, -174, 277, -212, -53, 326, 299, -88, 5, -98, + -97, -205, -112, -192, 49, -8, -21, -152, -31, 148, + -75, -190, 19, -83, 46, 25, -10, -50, -71, 74, + -14, -92, -77, -85, 73, 98, 83, 20, 46, 29, + -1, -41, 69, -12, 59, -107, -58, 16, 50, 102, + 15, -64, -78, -1, -27, 14 + }, + { + -45, -706, 71, -497, -12, 10, 15, 48, -179, -49, + -71, 25, -243, 783, 2460, -727, 365, 95, -54, 877, + 476, -143, 669, -453, -686, 658, 928, -242, 922, 534, + 697, -470, -404, 365, -107, -646, 812, 685, 317, 1, + 407, 169, 345, -218, -227, -139, -117, -314, -435, -404, + 39, 223, 178, -27, 33, -61, -308, 29, -261, 61, + 32, 135, 88, -35, 86, 20, 84, -90, -26, 125, + -73, -82, 21, 16, -45, 68, 140, 120, 40, -48, + 100, -66, -77, -27, -95, -51, 17, 23, -3, 34, + 39, -14, -76, -1, 11, -23 + }, + { + -763, -20046, -2481, 972, 1416, -224, -39, -722, 374, -465, + -291, -684, -9, -600, 500, -178, -793, -238, 75, -1105, + -109, -20, -26, -131, 50, -163, 168, -277, -360, -100, + -24, 333, -487, 96, 262, -96, -484, -447, -853, -147, + -168, 192, -56, -172, 421, 202, -322, -200, 18, 50, + -188, 45, 227, -130, 296, 82, 216, 8, 184, 222, + -71, 57, 150, 49, -49, -64, -20, -24, -83, 143, + -7, 20, 63, 65, 29, -31, 54, 90, -9, -27, + 51, -24, 56, -24, 0, 3, -106, -21, 11, -4, + 37, 71, 28, -9, -15, -44 + }, + { + -75, -475, -645, -343, 29, -22, -49, 20, -397, -35, + -104, 2, -392, -764, 2105, -1653, 507, 992, -73, 39, + -360, 426, -97, -418, 156, -35, 159, 1364, -1393, 1045, + -797, -199, -879, -615, 671, 98, 170, -122, 337, 265, + 406, 82, -58, -632, -556, 257, 197, 157, -157, 157, + -128, -193, -65, 89, 229, -41, -84, -65, -115, 21, + 162, -66, -17, -12, -134, -164, 22, 135, -167, -61, + -76, -51, -59, 11, -84, -1, 7, 113, -62, 37, + 27, -11, 58, -1, 38, 22, -13, -59, 48, 10, + 11, -44, -60, -8, 18, 59 + }, + { + 3398, -7995, -2923, 252, 1834, -73, 32, -639, -253, 474, + -1226, -636, 518, 437, -6, 159, 153, 148, -206, 282, + 168, -551, -1, -122, -197, 290, 260, 342, 346, 162, + 136, -45, -125, -207, -491, 208, 191, -133, 11, 505, + 888, 20, -139, -70, -158, 259, 440, 212, -18, 55, + -100, 111, 121, 316, 342, -122, 45, -20, 62, -46, + 142, -10, 50, 7, 126, -13, -29, 72, -54, -113, + 12, 81, 11, 37, 168, -14, 45, -9, -53, 71, + 78, 43, -33, 39, 23, -55, 60, -39, -7, 60, + 21, -74, -44, 52, 28, -59 + }, + { + -129, 1140, 783, -1267, 143, -317, 752, -57, -33, 178, + 266, 664, 216, -862, 2115, -173, 850, 629, 841, -406, + -54, 728, 345, 55, 244, 110, 1087, 130, 37, 485, + 553, -98, -108, -526, -195, -264, -182, 222, 382, -261, + -468, 220, 204, -22, -166, 416, 83, 26, -218, 114, + -51, 61, -107, 141, -100, -37, 91, 218, 269, -78, + -138, 62, -118, -294, 10, -51, -11, 116, 128, -113, + -85, -109, 112, 188, 106, 18, 115, 1, 13, 47, + -23, 14, 21, 28, -181, -113, 43, 18, 46, -39, + 29, 46, 15, -12, -11, 27 + }, + { + 1351, -7842, -1623, -1090, -456, 1111, -1237, 336, 382, -289, + -36, 1, 738, -376, 177, 601, 646, -102, -9, -501, + -1478, 172, -300, -114, 11, -121, -125, 489, -145, -204, + 279, -176, -97, -223, -336, -164, 281, 174, -618, 147, + 58, -267, 121, 365, 440, 129, -95, 352, 6, 28, + 72, 283, -114, -12, -133, -223, 67, 26, 196, 39, + 397, 56, 119, -167, 42, -23, -35, -147, -2, -80, + 19, 93, -19, -47, 9, 137, 23, 10, -17, -16, + -14, -69, 49, 10, -76, 4, -55, 7, -12, -43, + -7, -18, -52, -25, -51, -19 + }, + { + -187, -1715, 437, 123, -342, -258, -393, 310, 207, 225, + 95, -320, -203, -671, -1817, 1407, 727, -127, -608, 899, + -987, -805, 582, -254, -210, -107, 356, 314, 156, 514, + -424, -497, -364, 204, -196, 279, -248, 461, 155, -34, + -76, 217, -400, 84, -77, -311, 412, 72, 134, -303, + 0, 93, -29, 62, 63, -1, -27, -113, 105, -321, + 44, 90, -363, -130, 6, 9, 101, 156, -103, 130, + 117, -194, -66, -73, -168, 43, 165, 14, -32, -99, + -13, 9, -147, -52, -62, -93, -170, -74, -22, -53, + 73, 8, 55, -24, 0, 55 + }, + { + 923, 14532, 1728, 1039, 1823, 2086, 976, 602, 185, 621, + 954, 118, -104, -699, 477, 1039, -1065, 405, -799, -404, + -831, -600, 3, 6, 311, 422, -832, -8, -130, -74, + 179, 339, 334, 12, 104, 265, 186, 14, 29, 201, + 230, -179, 389, 40, 286, -225, -7, -607, -782, -484, + -86, -372, 104, 337, 259, 133, 190, -318, -157, -113, + 95, 4, -42, 27, -25, -175, -199, -75, 0, -65, + -227, 44, -94, -113, 87, 52, 24, -9, -19, -167, + -2, -41, 32, -28, -39, -128, -50, -3, 32, -95, + -96, -9, -7, -1, -21, -26 + }, + { + -40, -3829, -124, -192, 8, -330, -292, -202, 199, 180, + 559, 490, 854, -632, 5056, -160, 427, -478, 1090, -1317, + -898, -1004, -938, -958, -328, -650, -1056, -215, -900, 276, + 460, -350, 592, 25, 9, -201, 247, -145, -26, 229, + 350, 24, -9, -613, -143, 116, 663, 174, -99, -10, + -11, 249, 16, -216, -128, -212, 55, 4, 65, -4, + 163, 58, -58, -222, -105, -29, -43, 95, -4, 25, + -138, -320, -56, 33, 139, -71, -128, 21, 137, 74, + 100, -6, 32, 73, -30, -3, -47, 32, 120, 109, + 31, 5, -13, 24, 12, 47 + }, + { + -1179, 8528, 345, 1930, 1596, 38, 271, 84, 483, 241, + -394, 216, 204, 867, 163, -124, 406, -587, -1255, -153, + -34, 184, 127, -218, 270, 27, -347, -355, 677, 239, + 350, 156, 557, 43, 45, -489, -283, -6, 2, -460, + 95, -468, 99, 629, -329, -104, -97, 134, -47, -99, + 136, 77, -4, 23, 169, 71, -16, -214, -88, 19, + 12, 80, 27, -216, 68, -22, 8, 134, 87, -94, + -54, -93, -118, 6, -35, 39, 92, -28, -16, -66, + -142, 49, -57, 132, -44, 13, 50, 4, -38, 69, + -24, -112, -61, 29, 3, -11 + } + }, + { + { + 71, -395, 605, -932, 479, -12, -129, 150, 19, 22, + -450, 731, 396, -789, 182, -1417, 228, 418, 5, 13, + -1716, 49, -679, 80, 1315, 670, 435, -804, 209, -221, + 45, -440, -198, 390, 391, 75, -8, 361, 137, 129, + -14, -315, 71, 315, 107, -51, 127, 245, -148, 193, + 126, -292, 148, -104, -46, 25, 16, -73, 114, -34, + 76, 109, 6, 69, 162, -53, -30, 24, -8, -41, + 45, 15, 38, 20, -99, -39, -43, 9, -70, -20, + -53, 49, 10, 38, 18, -83, -3, -8, -3, -39, + 37, -1, 2, 23, 13, 8 + }, + { + 281, -9500, 3283, -320, -163, 235, 112, -677, 916, 30, + -1054, 297, 274, -319, -260, 170, -358, 479, -197, 212, + -164, 329, -99, -93, 231, 153, 106, 149, -130, 77, + -17, -226, 115, -228, 92, -376, -19, 187, 94, 141, + 100, 46, 116, -26, 31, -125, -250, -163, 179, -11, + 77, -5, 142, 60, -61, 72, -21, -174, 79, -42, + -51, 49, 24, 27, -63, 99, 77, 112, -44, -12, + 56, 66, -20, 36, -87, 59, -29, 16, 31, 39, + -98, 2, -11, -5, 13, -9, 25, -51, 5, 18, + -35, -8, 8, -10, 30, -3 + }, + { + 88, -641, 1150, -1028, 371, -14, -134, 284, -209, -97, + 878, -165, -607, 1413, -94, -751, -288, -821, -832, 165, + -370, 320, 448, -205, -57, 0, -225, 28, 70, 200, + 23, -166, 384, -115, 152, 85, 165, 56, -162, -217, + 414, 152, -106, -84, 71, 115, -48, -105, -84, 154, + 16, -7, 30, 16, 134, -217, 41, -67, -181, -145, + -35, -14, -136, 64, -38, 29, -149, 14, -1, 43, + -7, 2, 83, 18, -33, -81, 113, -29, -52, 19, + -12, 47, -60, -83, -5, -11, -43, 40, -44, -2, + 8, -29, -38, 3, 26, 18 + }, + { + 93, -1434, -153, 265, -23, 13, -10, -1, -52, -77, + -69, 153, 52, 492, 1796, -551, 55, -20, 1406, -34, + -120, 626, -363, 178, 576, -598, 124, -23, -314, 268, + -326, -130, -305, -144, 13, 682, -521, 65, 265, -9, + 65, -331, 0, 323, 169, -181, 85, -131, 212, 149, + -74, -10, 14, 3, 9, -70, 7, 271, -119, 26, + 52, -38, -91, -45, 139, -206, 119, -64, 32, -38, + 23, -56, 11, -37, -28, -15, 38, -27, -18, -82, + 45, -11, -65, 44, 10, -69, 24, 5, 13, -25, + -46, 2, 26, -64, 7, -20 + }, + { + 377, -10058, 2282, -1243, -212, 53, -242, -341, 209, 204, + 107, -772, 490, -528, 504, -113, 423, -73, 505, -299, + -233, 692, -580, -405, 445, 78, 453, 684, -628, 160, + -25, -114, 360, 154, -294, 174, -211, 279, 491, -266, + 187, -157, 300, -163, 102, 86, 5, 11, 21, -131, + 138, -170, 65, -11, 82, 51, -159, -30, 247, 158, + -67, -154, 15, 42, 158, -7, -48, 53, -2, 34, + -35, -43, -35, 62, 70, 55, 87, -66, 12, 4, + 12, -25, 49, -11, 51, -55, -4, 14, 26, 42, + 2, -14, 6, 27, -22, 2 + }, + { + 4, -259, 154, -59, 171, -49, -11, 182, -75, 65, + 51, -89, -321, 89, 2558, -673, 39, 491, -225, 357, + -39, -729, 301, -258, 608, 440, -206, -396, 200, -956, + 108, -231, 100, 314, -127, -641, 117, -146, -31, 83, + 131, -522, 59, -79, 5, -2, 74, 70, 162, 127, + 23, -19, 149, 119, 17, -39, -172, 176, -109, 66, + -78, 27, 28, 18, 65, -107, 85, -79, -98, 39, + -74, -72, -2, 8, -61, -8, 52, 21, 9, -77, + 43, -58, 3, -20, -18, 15, 6, -2, -2, 31, + 0, 25, -14, -16, 21, -19 + }, + { + 2009, -11751, 1805, 126, -41, -127, 175, -1052, -171, 291, + 448, -90, 333, -384, 215, -473, -642, -284, 262, -617, + 28, 160, 184, -60, 79, -75, 127, -140, -12, -142, + -86, 214, -395, 64, 35, 50, -133, 238, -299, -320, + -132, 320, 48, -124, 176, 307, -181, 83, 283, -71, + -129, 170, 186, -398, 182, 14, 134, -198, -73, 88, + -95, 61, 61, -60, -37, 33, -1, -22, -79, 44, + -60, -12, 32, -2, -17, -60, -2, -14, -19, -14, + 23, -49, 39, -12, -34, 39, -22, -24, -13, -19, + 47, 22, -37, -46, -23, -13 + }, + { + 25, 574, -165, -331, 90, -12, 28, 68, -281, 16, + -273, -31, 334, -136, 2097, -876, 743, 513, -264, -238, + 21, 1017, 66, 185, 609, -313, -479, 968, -1247, 1097, + -578, 500, -143, -421, 568, 116, 225, -387, 33, -268, + 253, 151, 8, -200, -189, 167, -176, 81, -96, -54, + -227, -111, -15, 5, -1, -135, -62, -18, 43, 2, + 27, -52, -63, -45, -71, -51, 51, 89, -5, 73, + -48, -17, -3, 82, -44, 29, -5, 34, -104, 13, + -83, -38, 42, 51, 79, -20, 49, -30, 43, -16, + -26, -25, -52, -32, -8, -6 + }, + { + -1657, -10157, 1913, -636, 176, 138, 293, -164, -69, 364, + -571, -611, 10, 179, 133, 285, 360, 574, -241, 194, + 226, 8, 393, -41, -161, 444, 73, 13, 305, 131, + -6, -91, 15, 3, -182, -53, -58, 131, 137, 59, + 552, -96, -4, 34, -105, 166, 190, -89, -115, 210, + 27, -24, -100, 8, 145, -211, 25, -48, 32, -148, + 23, -62, 68, -36, 55, 57, 84, 44, 23, -39, + -51, -10, -26, -30, 113, -25, 18, -9, 31, 96, + -56, -25, -4, 18, 16, -9, 119, -17, -45, 22, + 16, -80, -36, 58, 6, -15 + }, + { + 181, -364, -251, -813, 66, -361, 699, -106, -51, 111, + -402, -11, 307, -1151, 686, -454, 973, 391, 1276, -5, + -19, 843, 148, -126, 38, -110, 698, -525, -713, -32, + 103, -367, -5, -277, -104, -188, -322, -51, 9, -236, + -23, 362, -80, -66, -83, 121, -172, -76, -246, 97, + 4, 78, -72, 118, -61, -65, -103, 70, 166, -225, + -123, 43, -108, -199, -54, -57, 33, 63, 79, -88, + 61, -61, 51, 64, 56, 62, 44, -49, 72, 76, + 4, 22, 18, 100, -44, -36, 23, -2, 50, -56, + -22, 20, 1, -13, -27, -2 + }, + { + -1105, -6650, 2155, 117, -176, 1340, -1496, 374, 567, -196, + -11, -240, 598, -204, -145, 252, 53, -33, 515, 571, + -659, 543, -220, -98, 131, -184, -555, 121, 135, -189, + 120, -123, -150, 27, -288, -304, 207, 125, -375, 154, + 100, -334, -28, 88, 80, -12, -187, 135, -74, 0, + -90, 205, -73, 75, 117, -55, 65, 71, 55, -133, + 176, -90, 27, -76, 150, -9, -87, -157, 63, -75, + 47, 131, -5, -19, 1, 62, 8, 35, 53, 42, + -15, -40, 71, 53, -59, 54, -18, 34, 5, -21, + 10, -5, -47, 16, -11, 35 + }, + { + 157, -2119, -167, 7, 17, 148, -152, 100, 76, 174, + 216, -59, 368, -675, -2090, 866, -48, 666, -705, 143, + 260, 277, -337, -903, -186, 488, 349, 338, 157, 245, + -468, 62, 131, 287, -322, 191, -304, 215, -37, 146, + -200, 340, -211, -97, 58, -92, 356, 46, 99, -12, + 172, -62, -123, -70, 16, -56, 36, -89, 54, -221, + 113, 18, -225, 128, 87, -22, -45, -2, -153, 46, + 42, -105, 37, 52, -41, -23, -17, -99, 0, 5, + 22, -52, -72, 88, 22, -23, -63, -26, 13, -38, + 3, -49, 25, -6, -7, 35 + }, + { + -2736, 8427, 290, -555, 279, 778, -10, -79, 323, 550, + 519, 14, 245, -453, -188, 796, -960, 652, -24, 359, + -441, -127, 256, -8, 415, 1117, -228, 650, -52, -380, + -79, 8, -10, -60, 295, 17, -117, -24, 199, 99, + 247, -21, 308, -145, 269, -395, 76, 41, -134, -88, + 248, 133, 155, 138, -100, -164, 144, -89, 13, -83, + 30, -102, 16, 28, -175, -82, -10, -41, -58, -27, + -45, 34, -86, -36, 46, -13, 85, 78, 23, -91, + 21, -20, 38, 18, 27, -69, -2, 6, 18, -32, + 0, 5, -9, 19, -6, -7 + }, + { + 2, -3434, 296, 109, 147, -83, 97, -75, 282, -184, + 87, -58, 255, -1327, 4020, -658, 586, -899, 796, -321, + -146, -309, -47, -519, 32, -273, -66, 471, -850, 78, + 274, -287, 714, 36, -295, -34, 142, -340, 214, 210, + 358, -172, -153, -218, 91, -165, 355, 85, -141, -86, + 11, 140, -123, -118, 57, -160, 115, -16, 33, -95, + 84, -62, 58, -1, -20, 89, 43, -78, -82, 93, + -29, -123, 116, 2, 15, 27, 29, 49, 39, -66, + 24, -41, -5, 46, -41, 18, -63, -21, 3, 18, + 13, -14, -45, 22, -11, -5 + }, + { + -180, 8554, -790, 440, -9, -1544, -460, -91, 159, 7, + 274, 182, -475, 365, 35, 69, 566, 360, -320, 157, + -180, -11, 430, 31, -29, 150, 277, -425, 364, -298, + 404, -51, 66, 58, 211, -238, 139, 127, 171, -267, + 198, -542, -80, 536, -42, 93, 65, 119, -87, -207, + 14, 94, -61, -126, -47, 21, 46, -117, 103, 106, + -102, -37, 97, -34, 160, -21, -23, 69, 84, -30, + -22, 56, 57, 59, 37, 8, -3, -17, 51, 14, + -100, 45, -49, 125, -34, 7, 21, 46, -21, 77, + 39, -11, -14, 33, 0, -34 + } + }, + { + { + -41, 494, -105, 235, -364, 68, 7, -126, 79, -93, + -282, 319, 535, -158, -234, -549, -52, 212, -626, 129, + -909, -393, -497, 759, 602, 794, 135, -505, -124, 326, + 124, -243, -175, 435, 292, -115, 80, 463, 131, 30, + 78, -83, 36, 119, 31, 189, 176, 177, 8, -100, + 97, -21, 56, -64, -86, -23, -19, 66, -15, -10, + 138, 42, -7, 96, 86, -99, 60, -55, 28, 25, + 1, 24, 13, 11, -53, -6, -34, 6, -7, -74, + -1, 39, 23, -6, -29, -3, -22, -15, 18, -26, + 38, -15, -23, 10, 41, -4 + }, + { + -85, -3631, -682, 750, -265, 25, -101, 307, 28, -31, + -164, -229, 242, -71, -280, 247, -145, 174, 251, -13, + -106, 300, -32, 412, -310, 300, 195, -114, 90, -116, + 6, -122, 212, -111, -90, -301, 195, 10, 40, 228, + 62, 152, -145, 91, -44, 65, -298, 125, 29, 81, + -13, -123, 53, 166, 46, -61, -135, -27, 19, -52, + -35, 97, -12, -52, 93, 72, 112, 7, 88, -22, + 69, 30, 63, -46, 19, 14, -19, -7, 77, 7, + -19, -35, 10, -46, -1, -6, 33, -22, -2, -21, + -11, -7, 0, 18, -11, -2 + }, + { + 8, 1191, -131, 300, -394, -55, -37, 143, -60, 50, + 114, -120, 314, 622, 217, -532, -552, -656, -585, -369, + -123, 220, 29, 186, -181, -36, -246, 277, 133, -49, + -177, 122, 227, -202, 138, -44, 181, 118, -97, -201, + 188, 100, 4, -19, -15, 118, 168, -242, 31, 61, + 112, 21, 48, 45, 3, -101, -72, -95, -71, -67, + -28, -54, -137, 126, -36, -51, -80, -13, -33, 9, + 41, 1, 27, -1, 7, 8, -36, -19, -40, 13, + 7, 36, -44, -65, -10, -4, 13, -1, -34, -15, + -18, -1, -13, -9, 12, 17 + }, + { + -95, -1438, 147, 159, -34, 22, 19, -83, -95, -70, + 87, 66, 69, 196, 550, 413, 466, -244, 1071, -21, + -567, 417, 29, 340, -203, 107, -121, -163, -215, 194, + 146, -533, -699, 126, 119, 223, -400, 184, 108, -59, + -97, -105, 73, 198, 117, -121, 15, 5, 47, 85, + 74, -94, -65, 43, -10, -19, 89, 73, 60, -24, + -92, 17, -62, -56, -4, -45, -2, -49, 35, -2, + -8, 5, -85, -13, -39, 6, -12, -9, -31, -43, + -9, 9, -37, 14, -3, -6, 13, -21, 4, -16, + -27, -13, -10, -26, -6, -6 + }, + { + -1169, -5397, 25, -1437, 389, 53, -134, -93, -103, 117, + -499, -23, 296, -209, 72, 162, 154, 527, 18, -92, + 210, -55, 28, -209, 92, 376, 346, -103, -144, -23, + -20, 243, 122, 25, -5, 62, 48, 13, 304, -72, + 61, 71, 17, 146, 120, -138, 64, 61, 25, -122, + 71, -102, 64, 45, 0, -60, -10, 9, 128, 138, + -48, -71, 22, 105, 83, -31, 6, 67, -2, 34, + -22, -24, -4, 58, 47, 46, 33, -25, 20, -10, + 7, -11, 2, 16, 47, -37, 12, -1, 20, 14, + 18, -2, 34, 8, -16, 18 + }, + { + 64, 63, -258, 208, -11, -28, 30, 120, -65, 6, + 84, 13, -181, 158, 1953, -342, 271, 242, -170, 304, + -230, -194, -15, -385, 532, 537, -729, 79, -226, -724, + -89, -116, 152, 162, -56, -271, -287, -307, -114, 173, + 48, -340, -132, -48, -88, 1, 142, 115, 120, 125, + 22, 54, 42, 126, -14, -58, 21, 84, 11, 31, + -25, -63, -12, -60, 48, -26, 49, -36, -62, -83, + -36, -29, -8, -60, -30, 49, -16, -31, 21, 0, + -36, 8, -13, -29, 1, 9, 12, 26, -9, 3, + 12, 10, 7, -35, 24, 5 + }, + { + -2274, -2902, -834, 361, 311, -46, -130, -224, -648, 524, + 74, 308, -179, 241, -50, -381, -768, -12, 17, 13, + 147, -151, 314, -186, -95, -29, -103, 139, 74, -99, + -171, 18, -34, -259, 68, 131, 34, 18, -73, -148, + -245, 221, 144, -53, 127, 38, 81, 107, 221, -74, + -95, -18, 223, -215, 41, -24, 24, -89, -67, -23, + 12, 53, -8, -10, -12, 12, -14, -31, 44, -118, + 0, 14, -26, 4, -18, 12, -28, -85, 1, 39, + -60, -4, -15, -27, 15, 2, 18, -10, -31, 5, + 21, -24, -24, -23, -16, -10 + }, + { + 62, 321, 40, -79, -57, 12, 37, 20, -133, -40, + -95, -63, 300, 343, 1078, 996, 288, -371, -332, -656, + 766, 775, -132, 260, 131, 313, -287, 433, -477, -71, + 385, 101, 56, -91, 159, 252, 93, -347, -162, -48, + 88, 162, -111, 55, -19, -68, -293, 68, 38, -76, + -278, -82, -49, -21, 47, -230, 49, 16, -13, -54, + -8, -45, -87, -18, -36, 6, -16, 4, 37, 59, + -23, -8, -2, 51, -11, 9, -12, 7, -85, -16, + -69, -4, 29, 51, 24, 11, -11, 33, 1, -24, + 1, -21, -12, -49, -24, -10 + }, + { + -46, -9410, -796, -210, 316, 246, 83, 84, -3, -220, + 203, -406, -123, -470, 236, 402, 212, 398, -260, 250, + 136, 443, -30, 65, -56, 92, 312, 65, 91, 114, + -110, 22, -88, 174, -132, -44, -246, 71, 144, 158, + 361, -125, 29, 42, 24, 27, 109, -81, -7, 52, + 68, -46, -77, 128, -38, -116, -1, -37, -5, -17, + -91, -9, -20, 30, 44, 59, 98, -7, 12, -4, + 19, -93, -6, -20, 14, 39, -13, 9, 24, 67, + -58, 1, 25, -46, 39, 32, 53, 5, -28, 5, + -5, -46, -4, 0, 5, 28 + }, + { + -212, -851, -135, 263, -99, -200, 300, -75, 6, -41, + -349, 50, -268, -321, -106, 144, 656, 447, 614, 300, + 163, 759, -242, 165, -161, 476, -168, -554, -342, -208, + 115, -269, -171, 35, -322, -118, -335, -161, -41, -116, + -14, 220, 116, -232, -16, -74, -156, -6, -6, -147, + 34, -86, 135, -97, 0, 92, -190, 86, -28, -144, + -35, -49, -10, -127, -111, -16, -1, 3, 46, -35, + 55, 4, -3, 39, 54, 14, 67, 21, 48, 37, + 58, 2, -2, 48, -14, 52, -9, -7, 20, -35, + -46, 0, -2, -2, -4, -19 + }, + { + 822, -6596, -32, 206, 211, -174, -1, 23, 308, -189, + -64, 90, -50, 110, 192, -226, 280, -35, 554, 329, + -7, 121, -76, 44, -316, -28, -358, -50, 74, -208, + -31, -17, -54, -90, -154, -120, 75, 9, 20, -127, + 40, -206, 39, 12, -29, -13, -94, 0, -53, 111, + 45, 58, -85, -47, 118, 83, 111, 30, -27, 8, + -31, -10, -12, -13, 51, -57, -80, 29, -71, -80, + 93, 41, 48, -5, 31, -4, 2, 38, 53, 27, + -18, 30, 7, 44, -5, 35, 3, -12, 15, -3, + -8, -19, -9, 19, 14, 20 + }, + { + -113, -2154, 171, -121, -8, 23, 177, -29, 58, 152, + 221, 122, -76, -1226, -699, 421, -5, -107, -358, -100, + 535, 126, -476, -721, 55, 731, 263, -274, 423, -21, + -144, 234, 570, -124, -35, -261, 198, 44, -50, 53, + -100, 109, 75, -125, 10, 7, 249, 63, 61, 122, + 131, -116, -58, -22, -101, -48, 39, -66, 66, -92, + -22, -9, -2, 51, 28, 0, -57, -76, -16, -55, + 38, -46, -19, 31, 36, -57, -77, -38, -4, -8, + 50, -76, 1, 18, 27, 15, -8, -16, -16, -31, + -19, -13, 7, 24, -11, 16 + }, + { + 3341, 357, -206, -718, 99, -726, 794, 526, 146, 480, + 203, 260, -387, 448, -251, 219, -236, 95, 41, 405, + 54, -10, -176, 249, 220, 706, 621, 163, -182, -153, + 104, -144, -168, 3, 166, -117, -101, 5, 203, 23, + 304, 23, 114, 99, 103, -265, -38, 212, -46, 161, + 103, 362, 20, -22, -135, -102, 8, 51, -28, -39, + -26, -21, 23, -34, -203, -32, -69, 66, -88, -69, + 71, -44, -55, 37, 8, -48, 88, 84, 5, 16, + -19, 19, -5, 50, 19, -38, 16, -1, 12, 4, + 4, -17, -14, 20, 2, -3 + }, + { + 12, -2899, -93, -13, 188, -10, 150, 94, 154, -117, + -94, -497, 302, -113, 1999, -289, 142, 33, -23, 484, + -244, -411, 232, -322, 5, -197, 435, -281, 239, -256, + -144, 176, 319, 100, -201, 123, -1, -299, 296, 248, + 127, -48, -261, -60, 140, -68, 79, 12, -98, -63, + 108, -62, 33, -103, 8, 40, -69, 120, 5, -151, + 45, -22, 83, 5, -31, 79, 25, -61, -51, 29, + -24, -16, 49, 24, 24, -14, 103, 43, 2, -34, + -31, 5, -5, 24, -26, -9, 3, -54, 8, 19, + -20, -8, -20, -7, 1, -42 + }, + { + 1358, 4953, 1016, -628, -543, -1274, 138, -346, 264, 206, + -25, 300, -499, 384, -51, 286, 63, 92, -213, 339, + 218, -268, 306, -119, 338, -78, 477, -210, -41, -118, + 310, -23, -228, 340, 50, -21, 12, 108, 309, -77, + -337, -109, 28, 214, 328, 38, 176, -156, -65, 110, + -129, 3, -128, -42, -99, 59, 1, -53, 135, -5, + -93, 115, 22, 84, 10, -7, 48, 63, 18, -46, + 56, 63, 69, 53, 72, -12, -13, 39, 6, 5, + -70, 12, 62, 1, 32, -10, 7, 2, 18, 55, + 40, 16, 5, 10, -9, -17 + } + }, + { + { + 21, 700, -5, 771, -128, 49, 23, -192, 137, 150, + -149, -295, 147, -156, 132, 217, 282, 482, -716, 583, + 14, -172, -237, 469, 144, 761, -72, -156, 222, 326, + 21, -14, -199, -85, -35, -300, -34, 227, 58, -9, + 207, 74, -92, -71, -121, 129, 85, 44, -15, -160, + 33, 73, 94, -86, -66, 14, -77, 33, -30, -4, + 99, -53, -42, 71, 16, -109, 62, -52, -11, -15, + -42, 2, -38, 4, 29, 55, -11, 19, 30, -31, + 24, 22, 16, 12, -8, 17, -4, -6, 19, -8, + 20, -11, -19, -11, 23, -4 + }, + { + -215, -955, 439, 497, -39, 90, -187, 191, -286, -125, + 157, -81, 251, 56, -154, 162, -164, 297, 367, 183, + 8, 332, -143, -184, -281, 443, 177, -203, 79, 76, + 47, -40, 275, -324, -44, -39, 247, -55, -163, -145, + -39, 235, -128, 111, -17, 32, -271, 65, -93, 151, + 115, -71, -34, 59, 74, -57, -68, 38, 2, 32, + 15, 49, -36, -3, 122, 24, 54, -49, 58, -8, + 10, -28, 34, -36, 56, 6, -19, -45, 42, -3, + 40, -16, 11, -37, 34, 21, 11, -7, 15, 12, + 7, -2, -14, 14, -21, -11 + }, + { + -37, 1036, -204, 1654, 420, -3, -94, -74, -85, -9, + -139, -255, -26, 170, 371, 38, 2, 70, -177, 97, + 272, -7, -258, 57, -216, -71, -128, 240, 196, -58, + -233, -66, -31, -105, 186, -334, -30, 174, 60, -208, + 38, 110, 1, -75, -25, 0, 107, -136, 81, 16, + 78, 30, 68, 2, -8, -38, -47, 26, 87, 21, + 8, 8, -76, 40, -97, 5, 10, -47, -100, -26, + 1, -37, 34, 49, 52, 33, -23, 29, -4, 31, + 37, 13, -45, 2, 10, -33, 11, -7, -35, -3, + -5, 20, 5, -2, 4, 17 + }, + { + 39, -1343, 23, 69, -32, -7, 13, -80, -166, 3, + 137, -64, -82, 229, -361, -870, 48, -210, 249, 499, + -241, 82, -131, 63, -502, 551, 175, 5, 31, -83, + 8, -222, -429, 65, -101, -54, -219, 184, 61, -43, + -132, -118, -117, 14, 142, -92, 116, -44, -63, 3, + 29, -116, -34, 94, -2, 41, 84, -18, 52, -6, + -48, 25, -30, -8, 30, 37, 8, -93, -5, -20, + -47, 13, -20, 54, 12, 31, -35, -19, 4, 20, + -12, 8, 2, 21, 10, 21, 6, -29, -25, -14, + 5, -1, 12, 0, -8, 0 + }, + { + 1343, -2142, 229, -1335, -116, 94, 169, 161, -283, -174, + -166, 393, 456, -75, -186, -220, -326, 359, -65, -83, + 115, -279, 188, -10, -157, 86, 226, -190, -205, -124, + -213, 122, -99, -81, 74, 26, 241, 77, 154, -103, + -141, -54, -94, 111, 18, -127, 187, 74, 18, -93, + -13, -52, 26, -65, -35, -68, 50, -91, -67, 58, + -26, -32, 20, 50, 11, -38, 5, 33, -17, 10, + 33, 26, 28, 9, 20, 56, 23, -6, -14, -49, + -22, 0, -3, -11, 3, -24, 23, -13, -1, 4, + 18, -9, 4, -10, -8, 19 + }, + { + -27, 149, 146, 151, -89, -8, 5, 85, 4, 47, + 38, 91, -140, 33, 1060, -531, 479, 127, -393, 235, + 275, 266, 24, -688, 145, 683, -1117, -266, -184, 154, + 587, -100, -21, -108, -190, 29, 36, 31, -59, 2, + 36, -188, -119, -15, -23, 47, 47, -72, -32, 62, + -35, 7, 19, -3, -51, 8, 37, 21, -4, 29, + -6, -92, -8, -56, -55, -65, 42, 8, 26, -39, + 26, 79, 35, -43, -15, 21, -35, -10, -2, 8, + -1, 58, 26, -8, -15, -6, 20, 38, -3, 4, + 8, -20, 18, -1, 29, 12 + }, + { + 1557, 3669, 651, 639, -299, 95, 154, 432, -447, 218, + -221, 514, -45, 321, -64, -247, -304, 272, 78, -173, + -71, -94, 209, -347, -120, -115, -90, 171, 9, -55, + -172, 57, 133, -179, 19, -22, 69, 29, 65, 161, + -156, 88, -89, -187, 7, -102, 287, -13, 61, -112, + -45, 30, 119, -106, -36, -125, -30, 17, 15, 1, + 116, 49, 34, 74, -31, 8, 53, 19, 27, -107, + 25, -7, -41, 8, -4, 56, -12, -62, 19, 68, + -31, 13, -15, -40, 12, -13, 9, 2, -7, 10, + -5, -7, 8, 2, 8, -3 + }, + { + -15, -58, 251, 183, 29, 47, 11, 31, -92, 108, + 112, -190, -137, 160, 692, 598, -41, -518, -58, -792, + -246, -173, -422, 200, 13, 464, -134, 399, -189, -350, + 43, -480, 97, 179, -208, -99, -162, -271, 99, 36, + -8, 66, -91, -27, -75, 51, -184, 171, 4, 13, + -122, -24, -73, -99, 110, -158, 107, 85, 18, -58, + -110, -127, -48, 46, 7, -3, -35, -64, -57, 46, + 20, -19, -40, 33, -5, -27, -65, -12, -29, 8, + -12, 12, -5, 3, -37, 2, -34, 16, -18, -9, + 33, 1, 14, -6, -17, -8 + }, + { + 1231, -6344, 899, 443, -323, 6, -136, 19, -47, -371, + 195, -236, 91, -442, -181, -243, -267, -204, -444, 98, + -79, 259, -283, -53, 58, 60, 186, -96, 31, 167, + -142, 47, -119, 218, -84, 231, -160, 3, -18, 83, + 226, -176, -63, -76, 56, -49, -100, -91, -10, -185, + 91, 19, -33, 218, -110, -66, 44, 88, 76, -26, + -100, 40, -37, -26, -31, -66, -15, -18, -47, -27, + 66, -24, 17, -24, -18, -1, -26, 32, 23, 38, + -63, 20, 46, -35, 21, -24, -25, -22, -12, 27, + 14, -16, 5, -22, -1, 23 + }, + { + 176, -684, -465, 263, -233, -473, -12, 84, 86, -66, + -51, 227, 91, 240, 459, 461, 93, 106, -61, 103, + 98, 282, -220, 510, 20, 352, -300, -207, 34, -351, + 47, -27, -155, 105, -130, 136, 92, 99, 18, 135, + -6, -20, 192, -74, 87, -12, -135, -4, 94, -73, + 54, -70, 164, -146, 7, 84, -209, 44, -33, 8, + 80, -26, 67, -53, -78, 0, -40, -41, 20, -2, + 3, 17, 21, -8, 6, -22, 51, 17, -12, -9, + 37, -4, -29, 5, -41, 39, -3, -24, -14, -17, + -8, 21, 37, 9, 4, 2 + }, + { + -524, -7480, 454, -47, -236, -921, 552, -121, -128, -213, + 313, 215, -340, -23, 678, -147, 310, 14, 449, 47, + -124, -58, -188, -35, -256, 115, -105, 227, -100, -274, + -30, 53, 20, -99, 284, 294, 14, -41, 125, -92, + 81, -6, 185, 17, -46, 65, -23, -8, 62, 139, + 32, -11, -111, -38, 42, 3, 71, -19, 78, 25, + -135, -36, -41, -36, 46, 3, -8, 36, -61, -48, + 22, -35, -3, -71, -21, -18, 22, -28, -26, 25, + -20, 22, -17, 16, 19, -13, -3, 5, 12, -22, + -25, -16, 1, 4, 4, 10 + }, + { + 37, -2104, -27, -38, 23, -198, -37, -153, -102, -80, + 4, 38, -177, -246, 651, 152, -168, -218, -276, -256, + -384, -506, -260, -666, 387, 464, -495, -516, 226, -128, + 383, 357, 354, -272, -23, -58, 520, 175, 42, -26, + -48, 26, -12, -98, 106, 133, 125, -105, 168, 129, + 15, -70, -59, 11, -77, -59, 64, -4, 121, -6, + -59, 0, -4, -40, 35, -8, -58, -34, 77, -45, + -7, -37, -47, 2, 58, 4, -16, -6, 25, -24, + 11, -28, 41, -15, -24, -18, -8, -16, -4, -8, + -5, 0, -4, 5, -31, -4 + }, + { + -2550, -8022, -5, 445, 685, -1348, 233, 507, 433, 493, + -248, 104, -478, 705, -52, -151, -310, -138, -144, 297, + 152, 159, 122, 231, -450, -60, 231, -246, -70, 32, + -54, -318, -186, -216, -121, -180, 140, 192, -50, -241, + -23, -249, 109, 106, 74, -72, -70, 205, 94, 232, + -40, 279, 25, -192, -175, -73, -70, 80, 9, 45, + 12, -47, -55, -29, -57, 42, -47, 129, 20, -19, + 50, -16, -49, 0, 0, -43, 37, 2, -4, 27, + 5, 37, -31, 35, 13, -6, 43, -2, 6, -6, + -11, -31, -36, 14, -11, -6 + }, + { + -42, -2876, -175, -25, 60, -24, 100, -88, 54, 82, + 136, -77, 218, -649, 1052, -317, -231, -54, -190, 804, + 279, -184, 232, -52, 381, 14, 522, -439, 549, -67, + 95, 109, -209, 40, 7, 22, 101, -325, 68, 182, + 30, 98, -69, -13, 133, -75, -3, 54, 31, -12, + 10, -118, 147, 25, 118, 51, -84, 115, 2, -56, + 102, 90, 92, -22, -67, -4, 7, 23, -34, 7, + 42, 34, -5, -14, -3, -52, 52, -45, -25, -4, + 17, 48, 7, 21, -22, 23, 30, -39, 35, 9, + -12, 5, -8, 8, 9, -29 + }, + { + -1891, 40, 1149, -63, -363, -325, 935, -60, 522, 374, + -346, 103, -315, 159, -258, 341, -403, -338, -301, 415, + 169, -467, 208, 18, 369, -300, 132, -154, -37, -124, + 45, -136, -305, 288, 121, 43, 3, 98, 195, 43, + -303, 47, 143, -29, 133, 128, 210, -126, -24, 161, + -53, -12, -132, 60, -38, 19, -22, -24, 116, -31, + -88, 89, -32, 57, -20, -32, 22, 51, 28, -64, + -14, -11, 1, -33, 28, 7, -22, 25, -21, -9, + -44, -20, 44, -18, 40, -25, 14, -4, -13, 0, + -2, -1, 7, 3, -23, -1 + } + }, + { + { + -32, 567, 12, -61, 535, 0, 98, -81, -44, 194, + -125, -152, -258, -254, 169, 170, 362, 153, 310, -54, + 56, 106, -288, 256, 160, 604, 61, -171, 150, 68, + -18, -11, -149, -134, -189, -151, 72, -17, -48, -40, + 300, 158, -197, -97, -128, 67, 71, -61, 51, -66, + -9, 99, -31, 1, -21, -3, -46, -13, -33, 45, + 8, -25, -4, 50, -42, 35, -34, 14, -34, -4, + -43, 13, -38, 0, 18, 13, 28, 12, 21, -17, + 31, 19, -3, 45, 1, 13, -11, 10, -12, 17, + -7, -12, -7, -3, -7, 6 + }, + { + 320, 146, -1126, -610, 529, -5, 8, -193, -87, 174, + -283, 55, 186, 40, -43, -112, -174, 297, 202, 103, + 59, 409, 10, -369, 264, 53, 9, -151, 133, 183, + 41, -225, 84, -158, 22, 10, 19, -10, -111, -187, + 8, 71, 96, -28, 101, -159, -6, -202, -46, 154, + 120, 40, -3, -28, 19, -88, 112, -36, 4, 95, + -25, 52, -27, 6, 37, 46, 7, 27, 7, 34, + -20, -53, -8, -6, 24, 0, 13, -50, 7, 16, + 25, -6, 10, -23, 44, 14, -5, 5, 13, 27, + -2, 0, -12, 14, -7, -3 + }, + { + -36, 731, -152, 1186, 555, 28, -97, -102, -38, 18, + -186, 259, -537, 294, 10, 271, 6, 83, -103, 375, + 499, -175, -565, 117, 15, -323, 409, -102, 212, -75, + -48, -115, -210, 19, 118, -177, 93, -23, -53, -21, + 116, 80, 35, -154, 5, -31, 41, 5, 1, 2, + -1, 51, 108, -13, -17, -25, -18, 28, 72, 49, + -26, 23, -20, -65, -44, -26, 59, -43, -66, -39, + -10, -23, 20, 71, 27, 46, 14, 15, 11, 4, + 53, -13, -31, 11, 2, -25, -16, 8, -24, -10, + 10, 22, -4, 11, 1, -5 + }, + { + 37, -1672, 178, 86, -21, 26, -43, 53, -191, 106, + 7, -153, -289, 456, -790, -378, -398, 879, -1195, 1076, + -113, 44, 28, -105, -38, 120, 370, 160, 63, -164, + -50, -148, -234, 13, -87, -176, 272, -140, 173, -61, + -67, -143, -75, -112, 158, -81, 153, -21, -33, -29, + -52, 33, -72, 77, 56, 91, -5, 4, 0, -9, + -16, 40, -9, 9, 19, 69, 34, -69, -53, 23, + -47, -29, 29, 22, 23, 63, -37, -30, 1, 22, + -3, 16, -9, 30, -1, 14, -14, 2, -16, -33, + 5, 3, 15, 11, -2, 3 + }, + { + -933, 285, 68, -1551, 462, 99, 268, 26, 91, -463, + 327, 72, 389, 66, -97, -288, -339, -116, -10, 263, + -163, -198, 228, -157, -202, 51, 19, 48, -151, -203, + -142, 33, -265, -37, 157, 168, 79, 105, 39, -85, + -155, 16, 48, -44, -103, 66, 192, -8, 8, -115, + -132, 104, -28, -92, -17, -56, 33, -42, -94, -27, + 67, -37, -16, 48, -3, -63, 5, -2, 15, 15, + 24, -24, 49, 1, 46, 12, 20, 21, -44, -4, + -43, 2, 18, -15, -23, -3, -5, 15, -31, 6, + 2, -1, -11, 3, -6, 0 + }, + { + -44, 646, -27, -79, 14, -46, 46, 69, -56, 114, + -3, 79, -173, 128, 550, -288, -230, 350, 191, -109, + 89, 274, 139, -181, -332, 337, -544, -320, -17, 586, + 231, -143, -150, -43, -70, 154, 101, 139, -86, -107, + 124, -169, -42, -17, 35, 129, -78, -120, -54, 114, + 10, -49, 57, -84, -16, 51, 3, -5, -26, 10, + -51, -41, -27, 3, -105, -33, -4, 11, 54, -37, + 30, 76, 32, 7, -9, -7, 2, 20, -7, -15, + 50, 22, 25, -21, 0, -9, 17, 21, 14, 2, + -1, -6, -2, 20, 13, 8 + }, + { + -281, 6161, -281, 1019, 334, 10, 28, 644, -276, -50, + 80, 366, 230, -21, -92, -387, 122, 72, 0, -207, + 31, 120, -200, -205, 54, -95, -33, -56, 89, -8, + -214, 48, 157, 1, -73, 1, 35, 75, -78, 182, + 86, -158, -44, -119, -65, -57, 286, -204, 66, -123, + 51, 84, -118, 21, -40, -35, -59, 77, 28, -3, + 103, 58, 52, 64, -6, -13, 49, 60, -29, -29, + -28, -23, -16, 1, 3, 61, -12, -24, 10, 35, + -1, 27, 14, -30, -24, -21, 25, 12, -35, 0, + 1, 12, 17, -5, 29, -23 + }, + { + -57, 181, 195, 65, 90, 40, -10, -79, -12, 102, + 126, -200, -172, 179, 643, -661, 62, 257, -170, -665, + -262, -255, -289, 356, -305, 6, 525, 191, -79, -380, + -60, -261, -19, 128, -227, -193, -239, -170, 327, 87, + -152, -80, 77, -51, -65, -69, -45, 164, -37, -38, + -54, 79, -140, -18, 37, -35, 10, 67, 1, -1, + -71, -120, -33, -7, 57, -3, -39, -36, -70, -16, + 39, 53, -63, -7, -2, -29, -29, -16, -14, -3, + 6, -2, 5, -21, -19, 8, -27, -12, -19, 22, + -2, 18, 14, -4, -17, -5 + }, + { + -1635, -2675, 184, 1055, 184, -152, -36, -249, 33, 78, + -28, -443, 261, -87, -633, -118, -191, -576, 26, -241, + 226, -69, -62, -87, 80, 69, 134, 16, -65, 166, + -22, 23, -224, 191, -156, 249, -30, 1, -40, 152, + -92, -9, -49, -40, 11, -111, 29, -101, 85, -311, + 90, 11, -27, 114, -62, -28, -16, 116, 103, -57, + -91, 15, 35, -52, -88, -30, -98, 23, -51, -38, + 35, 6, 11, 3, 2, -33, 0, 27, 26, 19, + -16, 11, 13, -12, 12, -18, -56, -19, 10, 24, + 5, -8, -6, -2, 2, 13 + }, + { + -92, -667, 50, -510, 121, 5, -621, 367, 46, -123, + -68, 40, 352, 130, 869, 250, -223, 316, -268, 121, + 115, -35, 120, 320, 65, 269, -178, -131, 68, -170, + -185, 122, -211, 292, -52, -55, 377, 154, 65, 67, + 117, -95, 235, -124, 90, -70, 49, -108, 46, -8, + 99, -8, 117, -115, -13, -73, -4, 13, -68, 17, + 68, -2, -26, 27, -88, 16, -30, 15, -24, 20, + -30, 33, 6, -1, -3, -12, 6, 5, -9, -16, + 2, 36, -31, -2, -29, -5, 9, -8, -29, 3, + 4, 31, 42, -12, 17, -5 + }, + { + 317, -7813, -215, -452, -266, 3, 252, -198, -144, -277, + 309, 82, -10, -148, 713, -280, 205, 606, 80, 130, + -94, -310, -336, 96, -212, 45, -41, 201, -42, -56, + -18, 35, 59, -122, 401, 270, -161, 64, 116, -67, + 113, -54, 99, 48, 70, 33, -4, -45, 113, 27, + 53, 9, -70, 39, -60, -56, -3, 37, 140, -14, + -126, -46, -12, -17, 44, -1, 61, -81, 23, -53, + -7, -22, -57, -15, -36, -35, 29, -28, -24, 2, + -12, -7, 6, 4, 33, -35, 3, 24, 1, -29, + -11, -10, -15, 4, 6, -5 + }, + { + 43, -2141, 147, -181, -108, -94, -243, -145, 280, -152, + -145, 35, -47, 242, 448, 21, -254, -6, -84, -415, + -336, -745, -232, -377, 135, 233, -865, -232, 305, 283, + -184, 477, -221, 43, -194, 278, 168, 453, 134, -262, + 77, 160, -149, 65, -89, 151, 66, -139, 201, 66, + 21, -18, 32, -23, -52, -93, 64, 23, 68, 7, + -26, -22, -49, -81, 89, -25, -57, 23, 1, 32, + 13, -54, -55, 16, 18, 32, 32, -34, 11, -8, + -18, 20, 17, -22, -15, -28, -33, -2, -4, -30, + 9, 4, -12, -4, -17, -5 + }, + { + 743, -12246, -324, 26, 1035, -385, -163, 209, 554, -120, + -121, 101, 29, 205, 114, -236, -317, 162, -291, 67, + 304, 105, 215, -101, -144, -222, -106, -194, -29, 139, + -191, -229, -18, -295, -151, -16, 23, 228, -239, -218, + 79, -429, 123, 117, -148, 67, 134, -28, 214, 130, + 0, 22, 103, -169, -97, 24, -133, 16, -19, 126, + -1, -60, -37, -54, 18, -9, -32, 59, 48, 27, + 2, -12, -12, -14, 26, -2, -2, -46, 43, -7, + 12, 4, -7, 4, 14, 15, 11, 14, 19, -32, + -39, -2, -20, -12, -12, -2 + }, + { + 77, -2759, -602, 197, -40, 189, -324, 40, -2, 194, + 112, 142, 77, 10, 43, 36, -301, -224, 87, 617, + 120, 55, 246, 134, -35, 326, -43, -262, 311, 376, + 390, -270, -211, -72, 210, -242, 175, -66, -1, 9, + 134, 128, 51, -67, 98, -198, 78, 102, 117, -74, + 8, -83, 128, -29, 114, 25, -53, 89, 10, 34, + 147, 47, 67, -1, -32, -63, 14, 19, 1, 12, + 29, 14, -49, 20, -13, -19, -24, -25, -46, -1, + 72, 14, 4, 22, -17, 10, -2, 4, 14, 11, + 11, 4, -14, 10, 7, -9 + }, + { + 1575, -4075, 99, 95, -71, 246, 602, 182, 436, -49, + 170, 85, -362, 136, -476, 374, -184, -25, -345, 134, + -294, 176, -224, 332, -73, -253, -66, -27, 174, -128, + -40, -87, -321, 110, 212, 41, 4, 167, 22, 170, + -135, -125, 234, -144, -57, 208, 69, -54, 44, -10, + 94, -6, -33, -11, -18, -17, -28, 79, -43, -11, + -23, 22, 65, -57, 3, -46, 22, 29, 17, -22, + -39, -24, -6, -57, 27, 15, -2, -10, 10, -50, + -3, -2, -19, 9, 40, -9, 2, -7, -7, 0, + -25, 7, 2, -5, -25, 5 + } + }, + { + { + 39, -105, -607, -1104, -242, -5, 240, 54, -208, 77, + -258, 25, -195, -181, 374, -113, -127, -118, 522, -96, + 49, 161, -519, -464, -548, -127, -90, -72, 202, -321, + -504, -96, -222, -96, -199, -83, 3, -266, -190, 1, + 218, 105, -90, 79, -39, -16, 65, -72, 94, 118, + -11, -61, -89, 76, 79, 103, 45, 6, -27, 16, + -30, 1, -13, 20, -3, 100, -58, 47, 26, 55, + -7, 4, -2, 9, -24, -22, 8, -8, 36, 9, + 35, 20, -3, 60, -19, -18, -21, 7, -38, 3, + 1, -15, -8, -5, -11, 13 + }, + { + -254, 916, 155, -1128, 194, -51, 33, -141, 91, 185, + -218, 232, 127, 136, -285, -462, -210, 248, -5, -88, + -258, 52, 194, -101, 403, 194, -171, -159, 356, 164, + -165, -298, 155, 73, 277, 46, -152, -55, -86, -79, + -14, 12, 142, -35, 137, -113, 132, -166, -28, 83, + -39, 44, 35, -128, -30, -57, 147, -75, -27, 22, + -71, 6, -24, 26, -15, 34, -19, 35, 3, -10, + -23, -28, 9, -3, -12, 9, 24, -31, 17, 4, + 5, -4, 20, -11, 23, -21, -12, -9, 10, 16, + -1, 19, 3, 13, -2, 4 + }, + { + 159, 1686, -1, -1966, -1562, 122, 143, 203, 111, 161, + 131, 674, -241, 518, -484, -150, -168, -193, -101, 292, + 249, -98, -266, 277, 165, -274, 418, -196, 113, -37, + 91, 234, -19, -72, 180, -2, 202, 5, -45, -48, + 122, 119, 74, -92, 86, -6, 96, 94, 6, 4, + 33, 6, -25, -72, 44, 86, 57, -23, -7, -4, + -81, 33, -32, -47, 19, -13, 59, 6, -15, -55, + -7, -6, 19, 32, -16, 46, 22, 11, 17, -15, + 18, -20, -34, 7, 7, -8, -5, 35, 2, 7, + 2, -1, -3, 0, -13, -16 + }, + { + -72, -2201, -167, 31, -84, 68, 39, 177, -87, 190, + 106, -29, -116, 428, -557, 514, -267, 429, -1210, 689, + -102, 190, 256, 165, 313, 133, 264, -98, 78, 89, + -32, 74, -54, -97, 19, 43, 216, -267, 147, -42, + 95, -69, 36, -34, 137, -98, 52, -11, 9, 22, + -21, 81, -64, 38, 16, 84, 9, 21, -53, -2, + -7, 51, 38, 61, 1, 16, 19, -32, -16, 46, + -26, -17, 12, -26, -13, 35, -13, -15, -20, -12, + -21, 1, -21, -3, -39, 11, 6, 2, -9, -16, + 0, 1, 3, -5, 4, 1 + }, + { + 78, 592, -407, -1968, -363, -13, -23, -98, 358, -8, + 429, -309, 276, 108, 402, -79, -616, -244, 137, 328, + -84, 12, 128, -298, -323, -186, -66, 243, -43, -80, + -51, 3, -93, 13, 163, 320, -92, -14, -19, -232, + -191, 5, 229, -60, -104, 143, 86, -197, 0, 73, + -8, 93, -28, -26, 22, 22, 24, 5, -17, 40, + 60, -55, 14, 22, 19, -21, -46, -24, -13, -46, + 22, -25, 28, -31, 5, -35, -17, -4, -12, 35, + -23, 24, 28, -25, -18, -16, -22, 20, -10, 18, + -14, 2, 3, 5, -14, -10 + }, + { + 24, 1072, 32, -112, 39, -4, 35, 34, -92, -9, + -26, 137, -131, -266, 303, -380, -832, 54, -36, -448, + -320, 64, 312, 298, -248, 88, 666, 668, -32, 486, + 74, -258, 119, 107, -161, 89, 18, 70, -148, -97, + 194, -18, 162, 21, 32, 148, -32, 5, 64, 145, + -20, -45, 50, -50, 50, 65, -28, -40, -27, -13, + -36, 7, -26, 29, -60, -26, -18, -15, 38, -15, + 12, 14, -9, -18, -3, 21, -13, -3, -3, -2, + 63, -32, -5, -16, 7, -10, -2, -10, 2, -21, + -5, 13, -1, 8, -14, -3 + }, + { + -994, 4394, -72, 885, -347, -34, -69, 516, -156, 225, + 207, 100, 86, -130, 70, -169, 59, -68, 38, 55, + 142, 14, -173, 82, 176, -20, -12, -185, 118, 49, + -5, 185, 137, 69, -70, -48, -119, 53, 7, 176, + 85, -106, 47, -137, -75, -68, 98, -236, 71, -136, + 102, 107, -20, 104, 58, 80, -28, 102, 35, -38, + 26, 11, 12, 7, 12, 20, 27, 11, -23, 31, + -3, -17, -28, -2, -36, -2, -4, 18, 29, 21, + -3, 20, 26, -8, -25, -10, 6, -13, -39, -4, + 0, -11, 1, -11, 28, -11 + }, + { + 3, 211, -80, -88, -5, -19, -41, 53, 72, 18, + 14, -162, 29, 166, 424, -1267, 11, 552, -225, -254, + 381, 49, -187, 388, -255, -236, 494, 463, 184, -212, + -26, 189, -19, 17, 21, 100, -147, -169, 273, 180, + -12, -16, 7, -141, -8, 16, 38, 185, -36, -118, + -95, 110, -57, -4, -12, -4, -22, -9, -3, 39, + 10, -42, -31, 27, 47, -20, -5, -12, -17, 23, + 2, 52, -12, 13, 9, 0, -12, 4, 23, 11, + -10, 15, 17, -19, 9, 13, -10, -11, -17, 4, + -44, 8, 1, 12, 15, 9 + }, + { + 1222, 79, -48, 863, -524, -210, 69, -243, 36, 79, + 86, -11, 648, 150, -489, 212, 86, -252, 463, 39, + 233, -177, 129, -2, 17, 77, 51, -7, -154, 27, + -109, -138, -176, 302, -175, 132, 77, 17, -108, 3, + -115, 31, -82, -18, -41, -112, 28, -76, 114, -302, + 100, -42, -100, -32, -36, 29, -7, -6, 52, -17, + -51, 7, 32, -16, -67, 41, -32, 17, -12, -22, + 10, 13, 9, -5, 34, 19, 37, 6, 8, 5, + -6, 20, 7, -24, 0, -1, -24, 1, 18, 3, + -19, -15, -2, 17, 5, 11 + }, + { + 22, -1403, -675, -339, 637, 450, -577, 182, -245, -242, + -139, 110, 373, -128, 423, -208, -453, 186, -621, -694, + -195, -223, 173, 199, -201, 159, -134, -136, 222, 231, + -284, 18, -322, 60, 157, 74, 353, 136, 8, 83, + 124, -147, 118, -280, 22, -60, 68, -79, 107, 16, + 33, 13, 110, -93, 27, -65, 66, 44, -74, -71, + -60, -56, -23, 66, -64, 41, -8, 57, -16, -12, + -22, -41, -35, -3, -8, -22, -38, -25, 1, 1, + -10, 35, -33, 3, -12, -24, -5, 14, 7, 19, + -1, 19, 17, -8, 12, -23 + }, + { + -242, -8793, -110, -202, -295, 677, -111, -245, 135, -146, + 244, -70, 152, 57, 126, -471, 48, 471, -214, 125, + 243, -100, -211, 156, -41, 149, -157, 238, 159, 71, + 144, 56, -43, -18, 123, -234, -233, -39, -51, -78, + 175, -76, -98, -69, -19, -8, -46, -125, 28, -146, + 16, 124, -31, 26, -10, 11, -27, 26, 34, -25, + -35, -11, 24, 15, 44, -36, 46, -54, 72, -20, + 15, -21, -41, 21, -65, -43, -6, -20, 30, 3, + 4, -3, 3, -8, -5, -23, 1, 13, 5, 7, + 17, 1, -10, 0, 2, -10 + }, + { + -84, -1922, 598, 85, 20, 47, -90, -212, 325, 21, + -156, 52, -47, 110, 75, -89, -111, 76, 132, -76, + -63, -306, 94, -56, -415, -113, -579, -274, -34, 205, + -457, 139, -505, 113, -175, 269, 100, 439, 51, -60, + 301, 263, -131, 126, -138, -64, -140, -74, 193, -12, + 89, 65, 128, -90, -58, -93, 43, 35, 26, -46, + 57, -5, -92, -46, 93, 16, -3, 49, -46, 24, + 72, -12, -28, 61, 19, 11, 31, -21, 2, -13, + -9, -1, -9, -15, 7, -22, -19, 17, -2, -25, + 32, 17, -7, -1, 6, 23 + }, + { + 1244, -10998, -10, -296, 560, -222, 77, -222, -170, -580, + -246, -68, -217, -247, -178, -152, -152, 94, -199, 153, + 205, 214, 111, -195, 28, -114, 39, -7, -89, 173, + -45, -51, 133, 11, 73, 78, -109, 31, -261, -155, + 235, -246, 243, 102, -225, -101, -12, -90, 151, -62, + -72, -39, 24, -131, -89, -3, -80, -26, -63, 100, + 26, 3, 19, -32, 6, -5, -12, 38, 42, 39, + -11, -11, 36, -10, 44, 29, 18, -41, 17, -18, + 9, 0, 22, 17, 1, 6, -6, 3, 8, -29, + -20, 3, -23, -20, -3, 4 + }, + { + -82, -2578, -248, 218, 147, 440, -381, 53, -56, -218, + -186, 7, -174, 591, 1064, -193, -420, -124, 292, 204, + -412, -146, 207, 2, -16, 474, 230, 216, -81, 204, + 230, -113, 306, 82, 147, -52, 262, 31, -16, -144, + 178, 180, 71, -51, 82, -180, 151, 52, -8, -65, + 26, -168, -16, -101, 65, -38, -3, 140, 38, 5, + 80, -52, -10, 10, 39, -13, 35, 24, -20, -14, + -20, 13, 23, 13, -25, -6, -46, -7, -29, -19, + 39, -36, -25, -1, -33, -7, -30, 9, -5, -10, + 15, -2, -19, 20, 10, -12 + }, + { + -577, -6896, -559, -454, 130, -155, 83, 59, 264, 34, + 371, 253, -392, 185, -45, 104, -42, 483, -167, 6, + -81, 436, -324, 332, -108, -318, -214, -1, 509, -60, + -82, 8, -26, -116, -191, -100, -69, 15, -53, 46, + -67, -61, 205, -88, -51, 70, 4, -79, 27, -28, + 107, -132, -106, -48, -40, -31, -37, 65, -67, 78, + 121, 55, 36, -24, 42, -27, 26, -33, 11, 12, + -11, 15, -4, -34, 26, 9, 20, 27, 34, -35, + 40, 10, -42, 5, 17, -4, 16, 13, 9, 33, + -16, 0, 1, -7, -14, 9 + } + }, + { + { + 14, -1217, 456, -678, -751, -29, 232, 68, -313, 397, + -194, -300, -339, 244, 52, 78, 45, -384, 567, 233, + -123, -34, -210, -682, -331, -388, 91, -222, 148, -563, + -326, -87, -267, 61, -269, 54, -186, -190, -88, 24, + 5, 315, -118, -48, 137, -4, 47, 88, -92, 177, + 50, -167, -9, 40, 14, 115, 45, 69, -68, -12, + 24, -36, -13, -7, 37, 77, 2, 15, -9, 51, + 48, -65, 40, 31, -27, -22, -9, 10, 30, 38, + -3, 28, -12, 38, -24, -12, -14, -2, -22, -1, + 5, -14, -11, -14, -2, 13 + }, + { + 349, 1110, -252, 4, -653, -98, -213, 249, -24, 72, + 86, 146, -153, 242, 77, -299, -423, 42, 135, -270, + -261, -94, 349, 189, -35, 385, -244, 168, 263, -4, + -16, -339, 168, 217, 150, 137, -282, 1, -101, 16, + -12, -102, 144, -16, 26, -26, 136, 24, -12, 7, + -19, 18, -70, -92, 9, -43, 43, -56, -6, -50, + -27, -35, 38, -24, -9, 65, -18, 3, 15, -24, + 14, 2, -2, -14, 7, 22, 1, 23, -22, 26, + -27, 16, 6, -20, 10, -12, 0, -7, 3, -4, + 20, 5, 14, -8, 3, 6 + }, + { + -267, 3140, -692, -3295, -275, -151, 175, 280, 133, 307, + -29, 430, 156, 596, -444, -184, -343, -514, 358, 145, + 166, -285, 32, 226, 49, -222, 84, 203, -85, 87, + 133, 117, 55, -22, 40, 194, 53, -87, 0, -33, + 127, -25, 174, -14, -3, 4, 97, 41, 59, -35, + 124, 60, -114, -49, 1, 102, 57, -11, -9, 0, + -89, -18, -22, -2, 6, 27, 2, 6, -7, -41, + -1, -3, 32, -2, -5, 49, 18, -1, -6, -1, + -13, -6, -19, 1, 8, 15, -11, 30, 6, 12, + -12, -15, 5, 5, -18, -1 + }, + { + 85, -2040, -501, -47, 22, 38, 61, 60, 16, 134, + 168, -25, 3, 163, -292, 147, 702, -982, -81, 211, + -115, 298, 175, 408, 75, 67, 98, 84, -81, -64, + 230, 119, -168, -151, 194, 63, 6, -265, 53, -129, + 156, -75, -38, 67, 122, -30, -78, -7, -4, 5, + 72, 42, -38, 29, -2, 57, 34, 43, -29, -45, + 24, -33, 50, 39, 38, 20, -64, 45, -25, -22, + 27, 3, -40, -27, -7, 14, -1, -13, -7, -39, + -4, -6, -15, -15, -23, -8, 8, 1, -3, 0, + -9, 6, -7, -6, 0, -11 + }, + { + 944, -767, -381, -2310, -80, -68, 22, 58, 34, 483, + 54, -74, -339, 124, 758, -337, -354, -241, 490, -48, + 129, -14, -295, 208, -369, -122, -24, -65, -66, 44, + -248, 167, 36, -78, 186, 230, -5, -89, 5, -164, + -83, -111, 156, -26, 3, 16, 52, -93, -58, 146, + -29, 63, -74, 1, 14, 84, 17, 3, -7, 70, + 40, -38, 10, 33, 6, -3, -49, 16, -22, -51, + 32, 20, 14, -38, -9, -35, -31, -20, 24, 19, + -6, 6, 16, -30, 19, -26, -23, 13, 13, 15, + -16, 0, 10, 14, -12, -12 + }, + { + 32, 538, 281, 93, -49, 7, 22, -15, -52, -99, + 113, 147, -125, -168, 55, 25, -1033, -278, 30, -340, + -249, 123, -51, 468, 84, -410, 797, 688, 313, 252, + -86, 1, 97, 70, -360, 149, -41, 73, -191, 96, + -14, -47, 232, 49, 31, 98, -10, 88, 90, 64, + -96, 22, 79, -28, 63, 59, -25, -58, 56, -91, + -28, -29, -1, 38, -25, -23, -28, -4, 7, 17, + -17, 17, -4, -28, -21, 48, -38, -32, -3, 24, + 29, -11, -6, -15, 15, -15, -1, -13, 3, -23, + -2, 16, -3, -3, -22, 12 + }, + { + 1813, -721, 283, 516, 423, 14, 125, 48, 89, 107, + 289, -34, -7, -39, 5, 190, -268, -25, 70, 215, + 118, -111, -40, 144, 118, -152, -29, -2, -19, -50, + 141, 63, 47, 78, -103, -9, 5, -92, 104, 168, + -29, 40, -51, -150, -52, 5, 67, -125, -12, -130, + 179, 26, 28, 82, 24, 36, 45, 88, -3, -14, + -28, 6, 16, -23, 14, 10, 30, 14, -2, 21, + -13, -7, -50, -2, -22, -19, -8, 17, 43, -1, + -19, 15, 25, -5, -18, 3, -19, -15, -2, -14, + -16, -5, -11, -2, 3, 13 + }, + { + 64, -402, 303, -108, -42, -57, 20, 28, 76, 0, + -62, -184, 297, 219, 234, -268, 77, -447, -477, 768, + -4, -66, 125, 212, -165, 111, 132, 391, -348, 246, + -248, 281, 2, -66, 181, 176, -256, 93, 8, 194, + 66, -8, -100, 5, 36, 6, -52, 86, 155, -232, + -63, 48, 72, -69, -27, 7, 3, -55, -12, -26, + 97, -7, -95, 50, 45, -12, 11, -37, -2, 43, + -22, 27, 5, 17, 9, 36, -19, 2, -12, -8, + 16, 12, 19, -5, 12, -7, -25, 26, -5, -18, + -25, -2, -2, 22, -5, 9 + }, + { + -189, 1300, 100, -163, 564, -236, 160, -57, -112, -197, + 142, 454, 370, -388, -98, 447, 57, 206, 100, -42, + 172, 21, 35, -2, -14, 99, -58, 59, -2, -58, + -88, -283, -23, 241, -105, 51, 107, -36, -16, -121, + -13, -22, 4, 11, -122, -4, -7, -73, 63, -81, + -90, -46, -40, -85, -8, 17, 64, -65, 42, -31, + 27, 6, -39, 10, 6, 18, 7, -28, 7, 16, + 3, -11, 25, -31, -5, 71, 40, -16, 8, 20, + -5, 3, 11, -8, -18, 2, 10, 0, 11, -30, + 9, -15, -2, 12, -4, 13 + }, + { + 18, -2190, -454, 477, 494, -60, -49, 20, -259, -28, + -170, 314, 290, 16, -148, -92, -113, -398, -421, -725, + 130, -35, -226, -66, 239, 44, -698, 374, 71, 254, + -234, -162, -141, -26, 64, 210, 37, 46, 157, 4, + -4, 23, 51, -192, -129, 66, -41, -18, 96, -22, + -22, 126, -21, -28, 35, 0, 7, -6, -5, -81, + -83, -33, -5, 38, -47, 45, -6, 15, -10, -51, + 9, -41, -34, -31, -7, -4, -22, -35, 9, 54, + -22, 5, -27, 9, -4, -33, 7, 9, 18, 2, + 19, 5, -2, -1, -1, -8 + }, + { + 221, -9732, 99, 149, -758, 799, -302, -10, 6, -96, + 134, -55, -89, 496, -496, 28, -124, 136, -199, -123, + 620, -53, 67, 2, -111, 59, 2, 139, 154, 60, + 25, 9, 18, -45, -204, -24, -152, -213, 41, -105, + 116, -12, -179, 39, -150, -21, -45, -17, -76, -115, + 101, 94, -57, 72, -23, 54, 11, 2, -18, -43, + -2, -21, 48, 34, -16, 8, -49, 22, 30, 31, + -5, -31, -22, 4, -36, -37, -38, 1, 17, 7, + 11, -2, 12, 1, -20, -11, -19, 12, 11, 16, + 5, 2, -9, 8, 8, -7 + }, + { + 89, -1436, 97, 476, -200, 20, -19, -133, 20, 198, + -186, 169, -50, -242, -31, 295, -361, 360, -320, 491, + -121, -167, 69, -88, -242, -137, -269, -566, 260, -216, + -86, -183, -207, -138, 34, 139, 169, 434, -44, 99, + 158, 352, 4, -49, -32, -56, -174, 1, 48, -6, + 131, 15, 167, -101, -8, -98, -13, 74, -1, 20, + 43, -5, -51, 15, 4, 43, -27, 63, -46, 5, + 78, -5, -4, 22, 4, 1, 14, -8, 33, -26, + -4, -6, -19, 11, -1, -3, 3, 2, 3, -4, + 25, 9, -19, 14, 16, 10 + }, + { + -2493, -5758, -139, -161, -21, 549, -492, 179, -15, -649, + -693, -1, -107, 9, -477, 20, -439, 159, 238, -133, + 315, -135, 245, -143, 138, -213, 34, 271, -238, 207, + 51, 113, -35, 164, -19, 242, -225, -59, -52, -209, + 52, 60, 79, 261, -123, -221, -88, 88, 55, 17, + -128, -30, -33, -146, 9, -170, 14, -69, 9, 34, + 27, 3, 0, 3, 4, 13, -28, 49, 53, 15, + 15, -15, 16, 2, 42, -5, 26, 13, 0, 3, + -7, -11, 39, 8, -20, 32, -10, -8, 2, -13, + -11, -26, -2, -19, 4, 5 + }, + { + 73, -2186, -545, -2, 378, 181, -44, -87, 49, -27, + -288, -69, -263, -615, 2186, -153, -92, 84, 268, -170, + -513, -113, 306, 237, -105, 368, 332, 419, -231, 120, + 156, 11, 383, 229, 0, 57, -10, 121, -1, -8, + 195, 82, -7, 80, -143, 51, 101, -52, -92, 70, + -63, -112, -42, -7, -47, -11, 8, 91, 80, -19, + -18, -46, 22, -26, -22, 105, -9, 10, -19, -29, + -18, 42, 55, -30, -30, -20, 9, -8, -16, -24, + -10, -19, -18, -27, -8, -14, -16, -2, 3, -17, + 2, -18, 3, 8, 1, -12 + }, + { + -597, -6716, -386, -791, -50, -454, -163, 428, 33, 89, + 439, -1, -57, -286, 522, 33, 45, 59, 284, -252, + 446, 134, -234, 38, 266, -370, -219, 41, 306, 25, + 36, -200, 270, -57, -315, -155, 23, -167, 36, -97, + -46, 149, 104, 13, 10, -83, 95, -43, -46, 45, + -15, -149, -28, -40, -71, -38, 30, -55, 24, 70, + 120, 59, -6, 3, 29, 41, -8, -12, 16, -38, + 30, 21, -2, 18, -15, 47, 13, 27, 31, -18, + 13, 24, -1, -18, 11, 1, 12, 6, 8, 39, + -8, 11, 5, -14, -5, -4 + } + }, + { + { + -98, -2466, -112, 441, 57, 29, 32, 100, -112, 522, + -22, -324, -318, 476, 421, 301, 308, -190, 99, -23, + 66, 513, 374, -42, -163, -443, 68, -297, -94, -539, + -102, 111, -62, -30, -89, 242, -73, -126, -215, -37, + -10, 252, 26, 200, 159, -65, -9, 44, -220, 97, + 166, -32, 0, -16, -42, 14, 12, 87, -123, -40, + 40, -38, -33, 1, 55, -9, -36, -52, -41, 49, + 43, -66, 46, 42, -1, -5, 0, -2, 1, 18, + -46, 6, -10, 23, -27, -10, -17, -7, -2, 14, + 13, -3, -11, -14, 5, 18 + }, + { + -626, -364, -589, 1147, 192, -6, -146, 148, -236, 41, + -127, 280, 301, 313, 154, -124, -352, -122, 159, -206, + -249, -295, -61, 58, -181, 344, -96, 159, 147, -48, + 149, -181, 97, -37, -36, 185, -242, -33, -170, -116, + -97, -56, 24, -161, 23, 10, 135, 168, 78, 25, + -24, -15, -69, -5, 60, -61, 59, -11, -56, -94, + -37, -30, 36, -13, 32, 64, -15, 8, 21, -46, + 15, 41, 28, -10, 3, -12, -7, 30, -44, -9, + -25, 27, -9, -19, 18, -17, -2, 10, -3, -4, + 15, -7, -1, -8, 3, 5 + }, + { + 346, 3330, -1213, -886, 1798, -127, 114, 133, 4, -59, + -394, 178, 86, 907, -47, -149, -491, -563, 221, -216, + -170, -258, 510, 305, 273, -26, -147, 87, -139, 63, + 102, -1, 34, -19, -208, -50, -137, -137, 31, 1, + -64, -170, 119, -45, -28, -22, -31, -22, 171, 36, + 91, 7, -122, -36, -33, 88, 35, -14, 42, 90, + -44, 42, 38, 0, 9, 31, -27, -25, -7, -29, + 4, 22, 37, 5, -11, 23, 1, -22, -40, -9, + -10, 1, -10, 2, 22, 24, -18, 6, -5, 7, + -24, -21, 2, 2, -3, 26 + }, + { + -118, -1340, 253, -21, 34, -35, -64, 4, -69, -26, + 312, 84, 79, -60, -782, -275, 586, -488, 420, 119, + -432, 4, 160, 271, -278, -75, -249, 13, -73, -186, + 149, 184, 28, -210, -79, -245, -184, -319, -22, -195, + 9, -143, 53, 116, 34, -91, -41, 21, -13, -30, + 47, -30, -44, 19, 5, 72, 36, 41, 1, -70, + -16, -59, 39, -3, 17, 30, -46, 37, -39, -38, + -2, -11, -53, -13, -2, 3, -16, -3, 40, 3, + 7, -12, 2, 11, 0, 2, 6, 2, 3, 20, + -7, 4, 9, 5, -6, -10 + }, + { + -1702, -4309, 86, -1926, -127, -230, -151, -138, -303, 250, + -138, 30, -436, -275, 374, -61, -65, -134, 768, -373, + -102, 122, -230, 406, -130, -116, -270, -372, -201, -3, + -273, 96, 142, 46, 72, 156, -243, -246, 144, -61, + -24, -60, 119, 54, -62, -94, 104, 4, -96, 76, + -20, 87, -64, -46, -79, 36, 62, 6, -1, 4, + -25, 23, 77, 50, 14, 11, -27, 21, -6, 8, + 55, -9, 7, -22, 25, -2, -39, 16, 25, -8, + -1, 8, 20, -15, 22, -16, -10, 23, 4, 4, + 10, 3, -6, 19, 0, 2 + }, + { + -12, -499, -237, 65, -89, 15, -2, 42, 19, 129, + 268, 22, 32, -242, -735, -161, -235, 243, -201, 118, + 519, -32, -509, 80, -104, -659, 57, 264, 181, 262, + -117, 186, 165, 168, 12, 319, -163, -19, -178, 120, + -146, -168, 32, -53, -13, 90, 106, 68, -25, -16, + -51, 81, 112, 25, 58, 14, -43, -12, 120, -84, + -2, -6, 1, 29, 3, 46, 1, 20, -15, -8, + 0, 29, 15, -23, -33, 38, -35, -16, 7, 42, + 8, 6, 8, -1, 9, -5, 20, -9, 13, -6, + 5, 5, -3, 14, -3, 12 + }, + { + -1849, -7295, -529, -274, -646, 30, -89, -170, -19, -417, + -63, -70, 99, 58, 93, 302, -176, -53, -36, -121, + -78, -13, -145, -369, -216, -152, 56, 258, -44, -88, + 168, -129, -67, 15, -148, -82, 45, -187, -89, 252, + -29, -47, -41, -84, 41, 58, -15, -147, -8, -173, + 45, 10, 79, 116, 14, 21, 3, 63, 57, 46, + -7, -103, -81, -21, 20, 9, 11, 3, -8, -4, + -29, -25, -55, 4, -4, -25, -25, 9, 29, -10, + -41, 1, 19, -2, -15, -4, -5, 15, 38, 10, + -12, 10, 3, -4, -9, 14 + }, + { + -3, -734, 210, -58, 145, 42, 18, -60, -7, 36, + 98, 18, 261, -66, 28, 370, 531, -295, -451, 944, + -309, -403, -29, 62, -243, -56, -650, -258, -647, -64, + -328, 172, -106, -259, -240, -138, -169, 195, 36, 39, + 16, 88, -136, 25, 114, 74, -152, -36, 127, -170, + 35, 60, 133, -23, -52, -13, 37, -28, 60, 0, + 143, 40, -127, -12, -8, -13, 43, -38, -23, 25, + -11, -10, 8, 39, 8, 41, 1, 6, -26, -12, + 13, -18, 12, 0, -1, -5, -22, 42, 9, 3, + -3, -19, -19, 1, -25, -3 + }, + { + -1071, 800, 811, -1220, -684, -236, 43, -246, -180, -416, + 84, 381, -214, -653, 286, 484, 82, 295, -223, -315, + -133, -30, -89, -29, 2, 67, 6, 69, 26, 3, + 100, 62, 177, 212, -149, 219, 249, -86, 79, 92, + 117, 75, 167, 170, 25, 30, 94, 47, -38, -84, + -100, -71, 45, 25, 27, -16, -16, -55, 72, -5, + 24, 21, -60, -26, -2, -5, 32, -2, -10, 34, + 31, -25, 1, -47, -65, 13, 4, -21, -8, -3, + -12, -1, 13, -3, -8, 4, 11, 11, 16, -21, + 10, -17, -9, 4, 14, 6 + }, + { + -55, -2397, -115, 934, 243, 245, 683, 45, -184, 107, + 295, 483, 372, -106, -220, 384, -146, -573, 53, 109, + 158, 124, 23, 209, 441, -2, -758, 505, 255, 402, + -170, -164, -24, -65, -196, 0, -332, -223, 133, 1, + 7, 57, 76, -173, -100, 201, -47, -101, 71, -3, + -39, 101, -90, 24, 61, 0, -50, -37, 36, 9, + 33, 52, 10, -26, -89, 9, -73, -29, 20, -14, + 10, -2, -1, -14, 20, 24, 11, -4, 12, 74, + -14, 1, -17, 9, 0, -22, 4, -10, 7, 12, + 38, -14, -21, -3, 3, 7 + }, + { + -188, -10937, -443, 697, -128, 393, -198, -11, -269, -123, + 58, 38, 61, 353, -658, 124, -155, -100, -133, -362, + 366, -121, 208, 70, -138, 1, -82, -173, -198, -156, + -188, -221, 9, -60, -248, 63, 12, -93, 73, -137, + 60, 149, -15, 133, -203, -67, -9, 99, 19, -5, + 105, 3, -3, 119, -27, -24, -5, 48, 49, 16, + -25, -53, 42, 11, -36, -12, -77, 35, -8, 9, + -17, -37, -25, 14, 15, 10, -10, 10, 9, 0, + -2, 1, 23, 1, -10, -15, -2, 0, 5, 1, + -22, 10, 5, 10, 1, -9 + }, + { + -95, -426, 1188, 656, -118, 18, -249, -245, -169, 9, + -307, 154, 213, 282, 407, 601, -68, 651, -330, 635, + -134, -160, 307, 103, 391, 110, -181, -436, 115, -260, + 356, -79, 7, -137, -157, 37, 15, 207, 135, 169, + -30, 162, 89, 25, 27, -9, -4, 136, 1, -2, + 99, -74, 158, -36, 35, 22, 42, 47, -4, 42, + 16, 42, 4, 3, -50, -13, -62, 39, -42, -18, + 41, -4, -17, -22, -3, -10, -13, 6, 58, 8, + 15, -5, -12, 7, 1, 19, 11, -11, 3, 11, + 24, 5, -21, 3, 7, 1 + }, + { + 2547, -156, -829, 907, -344, 283, -59, 296, 250, -89, + 14, 580, -8, 452, 20, 77, -766, -226, 212, -59, + 340, -187, 364, -20, 78, -241, 56, 504, -114, 67, + 252, 314, -41, 102, 18, 354, 53, 67, -64, -162, + -52, 86, 66, 277, 40, -20, -86, 76, 13, 67, + -129, -33, -74, -166, 151, -52, 1, -76, -9, -37, + -53, 4, 11, 30, 48, 30, -61, -9, -12, 13, + 21, -35, -40, -7, 32, -18, 21, -3, -3, 7, + 12, -16, -5, -15, -27, 28, -19, -26, -9, 6, + 7, -36, 7, 17, 16, 12 + }, + { + -81, -1268, 482, -17, 122, 227, 381, 148, 110, 139, + 1, -166, -353, -874, 1125, -165, 348, 431, 270, -178, + -222, 38, 303, 259, -221, 239, 123, 337, 118, 50, + 118, -67, 144, 16, -261, -74, -170, 41, 108, 107, + 50, -115, -150, -1, -143, -48, -115, -76, -7, 98, + -22, 20, -46, 2, -20, -18, -48, -35, 7, -68, + -86, -23, 32, -27, -46, 73, -69, -11, -2, -3, + 19, 17, 18, 6, 3, -23, 11, -26, 12, -4, + -21, 8, -3, -25, 11, -1, -7, -11, -1, -24, + -12, -21, 9, 2, -14, -14 + }, + { + 1382, -3893, -314, -526, 189, -464, -153, 220, -128, 153, + 506, -31, -266, -411, 485, 13, -344, -320, 490, 49, + 194, -46, -46, -74, 404, 56, -5, -218, 128, 74, + 155, 154, 342, -180, -429, -177, -98, -221, 230, -13, + -59, 214, 52, -8, -13, -93, 176, 16, -76, 49, + -108, -142, 76, 66, 43, 14, -3, -94, 44, 42, + 24, 36, -35, -57, 2, 53, 2, 3, 12, -13, + 54, 7, 27, 82, 13, 38, -12, 14, 7, -22, + 10, 17, 23, 2, 4, -36, -16, -18, 2, 22, + -2, 25, 12, -5, -8, -17 + } + }, + { + { + 113, -2843, -219, 659, 155, -35, -59, -28, 266, 399, + -61, 152, -411, 94, 772, 479, -26, 171, 56, -735, + 240, 671, 11, 660, -518, -281, -121, -58, -573, -211, + 281, -21, 7, -226, -199, 219, 23, -270, 2, -76, + 50, 175, 71, 160, 81, 123, -43, -79, -114, -60, + 184, 36, 3, -44, 28, -50, 16, 0, -25, -39, + 8, 53, -110, 24, 52, -60, 12, -55, 0, 5, + 10, -23, 25, 23, 52, -9, -14, -7, 8, 3, + -53, -10, 24, 14, -14, -22, -5, -14, 15, 10, + 11, -14, -17, -5, 7, 12 + }, + { + 724, -1647, -1121, 1341, -112, 108, -90, -48, -287, 77, + -72, 351, 414, -77, 291, 96, -317, 12, -216, -9, + -554, 46, -239, -12, -35, 102, 0, 35, 234, 19, + -208, -121, 365, -123, -214, 101, -4, -219, 5, -260, + 43, 120, -273, -108, 28, 19, 18, 112, 90, -4, + 34, 70, -30, -100, 72, -44, 26, -11, -16, -35, + -36, -21, 33, 3, 22, 39, 11, -5, 23, -25, + 13, 1, 54, -23, -32, 15, -17, -13, -11, -44, + 22, 21, -27, 4, 16, -16, -9, 20, 4, 11, + -18, -3, -4, -1, 3, 8 + }, + { + -378, 2255, 286, 1545, 146, -201, 152, -72, 58, -85, + -213, 207, -297, 885, -47, -263, -95, -419, 15, -259, + -12, 43, 435, -300, 460, 211, -246, 73, 8, -131, + -3, 264, -148, -10, -151, -149, -269, 161, -46, -64, + -61, -79, 12, -15, 30, -157, 24, -16, 111, 126, + -39, 26, -113, -52, 45, 94, -4, 8, 66, 26, + 11, 23, 81, 23, -23, -11, 6, -39, -9, -38, + 21, 17, -8, 36, 14, 16, -1, 0, -69, -2, + -9, -4, -6, 10, 13, 4, 1, -20, 13, -11, + -8, -11, -1, 2, 4, 14 + }, + { + 147, -437, -594, -27, 15, -33, -55, -60, 6, -16, + 237, 106, 128, 439, -1181, -291, -242, 269, -10, 365, + -336, 43, -14, 202, -30, -149, -259, 167, -35, -130, + 309, -217, 116, -17, -205, -249, -223, -62, -181, -86, + -35, -64, 50, 19, 13, -104, 63, -63, 0, 7, + 18, -78, 68, -1, -29, 56, 55, 20, 38, -77, + -53, 20, -10, -37, 43, 13, 26, 1, -53, 40, + -57, -30, -22, 4, -17, 0, -7, 5, 21, 28, + -2, -1, -5, 26, 6, 4, -6, 6, 0, 13, + 5, 5, 9, 9, -4, -3 + }, + { + 1856, -8140, -831, -1439, -131, -209, -261, -121, -353, 15, + 363, -208, -504, 288, -28, -142, 66, -492, 395, -51, + 130, -173, 264, 133, 70, -531, -244, -169, -193, 107, + -178, -141, 25, 205, 23, 169, -533, 22, 75, -109, + -16, 105, -137, 157, -41, -4, 65, 13, -121, 28, + 119, 29, -42, -62, -138, 48, 84, -35, 48, -64, + 6, 23, 29, 28, 53, 1, -19, 31, 9, 0, + -4, 17, -31, 17, 20, 5, -9, 19, 5, -18, + 38, 26, -29, -2, -2, 12, -3, 8, 3, -19, + 32, 5, -13, 9, -7, 7 + }, + { + -41, -1010, 430, -143, -82, 10, -1, 61, 40, 66, + 331, 48, -182, -247, -626, -211, 187, 225, -50, -81, + 233, 71, -203, 158, -790, -59, -203, 109, -30, 601, + -224, 204, -54, 60, 146, 316, 19, -25, -204, 80, + -17, -97, -93, -31, 40, 39, 164, -34, -34, -14, + 3, 83, 67, 25, 94, 12, -109, 84, 33, -80, + -45, 64, 15, -25, 0, 54, 17, 24, -22, 29, + 2, -25, 55, -1, 8, -20, -17, 19, -20, 45, + 4, 9, 2, 14, -12, -3, 16, 6, 25, -3, + -13, 14, 6, -5, -4, 10 + }, + { + 966, -12601, -192, -600, 69, 53, 61, -199, -23, -629, + -171, -156, 419, 44, 94, 3, 301, -251, 104, -266, + -183, 30, -170, -373, -388, -140, 118, 268, 99, -3, + 102, -52, -102, -59, -90, -152, 16, -102, -52, 135, + 18, 32, -109, -72, -57, 181, -213, -53, -36, -26, + -96, 42, 85, 63, 66, -5, 51, 57, 80, 29, + 38, -91, -104, 35, -44, 35, 10, -13, 2, -31, + -2, -60, -39, 13, -7, -14, -26, 1, 12, -11, + -24, 13, 13, 12, -16, -25, 19, -1, 35, 15, + 9, 8, 12, -15, 0, 4 + }, + { + -74, 67, -397, 180, 143, 47, -66, -16, -9, 20, + -97, 112, 142, 227, -212, 540, -114, 56, -260, 512, + -561, 314, -471, 123, 147, -519, -551, -730, -72, -166, + -211, -41, -287, -30, -294, -393, 28, -17, 109, 37, + 124, -121, -34, 126, -103, 21, 4, -131, 51, 12, + 22, 103, -9, 15, 12, -79, 119, 31, 31, 28, + 91, 28, -105, -37, -6, 1, 13, -16, 6, -49, + 33, -46, 50, 38, 13, 38, -11, 0, -14, 6, + -2, -27, 1, 12, -2, 2, -3, 16, -2, 25, + -5, -23, -6, -7, -20, -8 + }, + { + 2132, -452, -2197, -1273, -204, 15, 103, -366, -156, -110, + -124, -135, -73, -326, 294, -46, 64, 354, -281, -89, + -164, -171, -214, 58, 168, -38, 42, 109, -14, 11, + 132, 292, 110, 117, -118, 47, 332, 145, -67, 35, + 166, 139, 239, 45, 126, -44, 98, 5, -29, 31, + -73, -113, 1, 71, 30, -33, -134, 17, 36, 5, + -1, 50, -45, -7, -44, -57, 17, 37, -18, 21, + 58, -10, -43, -4, -29, -60, -8, 16, -19, -16, + 4, 0, -1, -21, 8, -13, 25, 19, -20, 18, + -8, -12, -14, 12, 16, 10 + }, + { + 91, -1732, -87, 74, 282, 470, 678, -169, 0, -123, + 462, 346, 306, 210, -211, 157, -189, 183, 65, -13, + -581, 599, 116, 542, 502, -235, -346, 4, 413, 69, + -60, 90, -83, -4, -62, 58, -441, -208, 27, 69, + -24, 29, -33, -127, 30, 160, 33, -115, -72, 49, + 34, 100, -36, 72, -98, 38, -140, 32, 28, 41, + 60, 47, 10, -40, -75, -34, -16, -11, -11, 4, + -3, 7, 18, -12, 30, 35, -34, 24, -4, 48, + 6, 0, 4, -4, -5, -1, -23, 8, -15, 29, + 32, -4, -16, -19, 13, 29 + }, + { + 187, -10087, -1264, -131, 1107, -820, 727, -313, -351, -15, + -8, 281, 185, -299, -463, 376, -90, -55, -196, -136, + -45, 71, 70, 71, -79, 33, -56, -311, -183, -106, + -111, -276, 133, -231, -8, -51, -97, 165, -90, 38, + 18, 61, 22, 70, -111, -18, -35, 104, 22, 70, + -14, 12, 51, 45, -27, -96, 35, 55, 2, 75, + -17, -50, -1, 38, 14, -76, -33, -10, -18, 0, + -18, -7, -47, 18, 27, 29, -4, -13, 7, 10, + -4, 14, 12, 2, -4, -32, 12, 6, 15, -14, + -12, 9, -3, 11, -7, 4 + }, + { + 105, 924, -262, 282, 284, 87, -214, -302, -133, -85, + -387, 114, 37, 1130, 389, -36, 444, 330, 164, 200, + -117, -124, 325, 78, 389, 324, -445, -87, -84, -229, + 360, -82, -67, -112, -102, -144, -94, 167, 281, 186, + 11, -37, 156, 76, 37, -78, 73, 99, -32, 90, + 15, -9, 22, 91, -48, 163, -10, -69, 14, 45, + 27, 50, 67, -77, -55, -26, -25, 14, -18, -1, + -56, 37, 12, -54, 1, 8, 15, 0, 51, 13, + 18, -7, -17, 10, -23, 19, 20, -23, -6, 7, + 13, 5, 2, -14, 8, 2 + }, + { + -1631, 5203, -221, 122, 209, -14, -117, 510, 71, -12, + 343, 428, -184, 951, -251, 23, -328, -400, 233, -96, + -9, -91, 495, 172, -320, -173, 67, 361, 111, -242, + 358, 158, 122, 155, 239, -49, 165, 204, -263, 71, + -153, 48, 76, 194, 72, -1, -83, -30, 32, 139, + -116, -6, -138, -3, 10, 108, -118, -60, 0, -2, + -73, 48, -33, 18, 33, 23, -72, 4, -56, 18, + 37, -28, -50, 23, 2, -12, 32, -39, 10, 41, + -23, -23, -7, 2, -34, -4, -7, -23, -3, 9, + -15, -23, 8, 19, 4, 21 + }, + { + 93, -740, -164, 290, 41, 61, 434, 202, 190, -92, + 207, -379, -190, 1206, -1998, 106, 615, 277, 69, 193, + -428, 596, -59, 339, -73, 82, 210, 129, 124, -112, + 163, 70, -164, -14, -166, -217, 0, -83, 159, -9, + 8, -23, -154, -117, -21, -53, -74, -153, 148, 54, + -18, 84, -82, -53, 11, -1, -9, -99, -1, -89, + -42, 63, 17, -51, -39, 20, -20, -16, 17, -25, + 29, 8, -25, -1, 37, 22, -23, 3, -39, 11, + 12, -17, 2, -3, -20, 7, -2, -11, -5, -8, + -19, -3, -7, 8, -16, -10 + }, + { + -1476, 19, -116, -422, -121, -104, 53, 70, 10, 75, + 458, 2, -250, 690, -1137, 28, -610, 162, 517, 173, + -269, -37, -49, 40, 141, 34, 303, -306, 76, 6, + 249, 298, 44, -163, -330, -208, -171, -35, 58, 95, + -58, 234, -32, 64, -49, 2, 49, 2, -62, -56, + -96, -3, 67, 55, 50, -44, -15, -36, -15, 51, + -11, 45, -18, -57, -26, 31, 10, 15, 5, -10, + 39, 29, 22, 38, 39, 19, -13, -5, -4, -7, + 32, -15, 21, 1, 7, -7, -29, -26, -11, 8, + 11, 11, 11, 9, -19, -14 + } + }, + { + { + -33, -1152, 1021, 304, 23, 45, -11, -24, 179, 167, + -322, 86, -299, -28, 538, 211, -35, 560, 171, -1123, + -120, 138, -487, -3, -642, 117, -27, 232, -149, 71, + 379, 206, -63, -250, -84, 237, 136, -188, 35, 8, + 22, 35, -29, 76, 122, 139, -40, 69, 125, -87, + 71, -29, -32, -85, 15, -38, -22, -28, -14, -79, + -32, 102, -67, 29, 42, -35, 47, 29, 38, -1, + 2, -6, 27, 1, 48, 8, 8, 6, -1, -6, + -29, 4, 24, 8, -18, -11, 5, 7, 21, -9, + 2, -11, -2, 2, -1, 11 + }, + { + -538, 1463, 2499, 752, -367, 76, -144, -15, -72, 92, + -284, 241, 280, -246, 154, 322, 10, -91, -338, 252, + -392, 413, -7, -142, -53, 136, 128, -15, 24, -94, + -267, -178, 101, -190, -116, 17, 104, -123, 299, -64, + -77, 35, -200, -24, 28, 0, -86, -103, -11, 10, + 87, 108, -81, -116, 63, -29, 11, -66, 47, 8, + 38, 38, 38, 4, 4, 37, 24, 2, 42, 13, + 16, -53, 10, -27, -30, -1, -32, 2, 10, -27, + 10, 13, -10, 19, 14, -10, 4, 9, 5, 16, + -15, -3, -10, -7, -3, 0 + }, + { + 311, -532, -2205, 1680, -34, -146, 43, -227, -9, 140, + -9, 243, -194, 765, -103, -31, 464, -204, -305, -256, + 57, 143, 439, -559, 201, 102, -95, 145, -25, -221, + -96, 107, -313, 27, -63, -15, -110, 145, -71, -2, + 172, 61, -45, -93, 66, -149, 112, 91, 53, -22, + -140, 80, -66, -94, 79, 134, -31, -51, 24, -25, + -13, -38, 20, 31, 2, -11, 13, -5, 6, -52, + 3, 0, -27, 1, -8, 18, -3, 25, -31, 7, + 0, 19, -5, -15, -5, -15, -18, -21, 20, -2, + 10, -5, 6, 8, -14, -18 + }, + { + -132, 618, 436, 0, 52, -36, -18, 10, 21, -53, + 286, -43, -67, 467, -873, 48, -92, 487, -163, 422, + -194, 415, 47, 98, 346, 200, 133, 278, -45, -141, + 280, -292, 208, 141, -96, 201, 110, 126, -71, -77, + 34, -47, 51, 37, 52, -23, 10, -84, 13, -63, + 23, -38, 9, -61, -33, 14, -26, -27, 5, -37, + 5, 38, -40, -7, 37, -5, 55, 34, -35, 39, + -36, 1, 21, 19, -22, 3, 5, -9, -18, 4, + -10, -3, 4, 33, -19, -5, 1, -1, -9, 1, + 0, 2, -5, -3, -4, -1 + }, + { + -1401, -10126, 1540, -720, 116, -62, -65, -41, -100, 149, + 243, -236, -361, 128, -18, 137, -40, -574, 367, -20, + 61, -93, 328, -82, 328, -275, -111, 231, 23, 143, + -4, -99, -59, 69, -3, 127, -342, 291, -56, -192, + 119, 127, -206, 109, 11, 66, 54, -44, -137, 1, + 53, 49, 35, 77, -47, 37, 65, -10, 75, -17, + 22, 27, 7, -56, 19, 1, -50, -37, -45, -8, + -44, 23, -1, 13, 1, 28, 41, 15, 16, -10, + 27, 34, -30, -6, -1, 21, 18, 4, -14, -12, + 15, -21, -19, 16, 4, 6 + }, + { + 28, -552, 540, -145, 0, 16, 12, 36, -108, -46, + 221, -52, 66, 317, 38, 60, 147, 393, -263, -427, + 249, -7, -402, 387, 60, 422, -252, -68, -294, 377, + -176, 91, -392, -137, 16, 170, -10, 16, -41, 75, + 53, -4, -31, 20, 43, -61, 71, 36, 26, -25, + -11, -19, -17, 33, 31, -23, -131, 21, -34, -51, + -39, 40, -4, -28, -22, 21, 26, 26, -42, 38, + 24, -48, 35, 24, 38, -14, 0, 3, -33, 2, + -8, 17, -5, 8, -4, -2, 20, 7, 12, -3, + -17, 1, 0, -1, -8, 4 + }, + { + 585, -13584, 61, -362, 0, 207, 186, -63, 468, 96, + -83, -543, 25, -88, -82, -380, 368, -180, 132, -90, + 105, 158, -82, 67, -173, -179, 164, 228, 336, 229, + 107, 13, 12, 29, -98, -86, -10, 9, 147, 18, + -95, -142, -39, 134, -148, 81, -268, 13, 72, 46, + -37, 116, 71, -96, -1, 4, 65, 28, 36, 23, + 72, -1, -31, 51, -29, 48, -23, -46, -7, -31, + 11, -3, -17, 5, 22, -13, -38, -2, 7, -13, + -9, 25, 10, 2, 1, -3, 19, -17, -6, 2, + 16, -9, 4, -14, 5, 2 + }, + { + 16, 915, 58, 198, 14, -12, -64, 59, 58, -12, + -63, 20, 92, 111, 46, 403, -509, 398, 93, -36, + -908, 382, -265, 480, 490, -403, -64, -231, -51, 42, + -4, -120, -393, 61, -38, -354, -167, -145, 18, -26, + 80, -89, 72, 18, -261, -75, 64, -83, 15, -17, + -56, 66, -38, -6, -16, -103, 52, -31, 51, 7, + -8, -5, -67, 0, 1, -7, -3, 23, 23, -27, + 46, -57, 48, 31, -17, -6, -5, 25, -8, -3, + -24, -27, 8, 6, -5, 0, 5, -1, -25, 12, + -6, 5, 26, 11, -9, -8 + }, + { + -2724, -2934, 1349, -597, -20, -3, 218, -119, 263, 120, + -62, -39, 142, -229, -200, -329, -127, 318, 11, 53, + -134, -166, -46, 43, 136, 56, -1, 53, -97, 67, + 93, 60, 22, 132, -70, -118, 258, 191, -34, 14, + 79, -59, 10, -171, -117, -82, 184, -33, -68, 39, + 11, -37, -27, -67, -97, -16, -57, -12, 2, 19, + -4, 26, -54, -24, -87, -78, 9, 45, 14, 47, + 53, -9, -20, 27, -16, -67, -4, 14, -1, 18, + 7, -26, -12, -6, 22, -20, 7, 10, -26, 15, + 2, 15, 10, 17, 0, 10 + }, + { + -105, -224, 1107, -305, 130, 79, 311, -277, -101, -222, + 119, -283, -116, 61, -640, -25, -22, 352, 522, 88, + -475, 369, -85, 526, -55, -208, 161, -312, 169, 8, + -138, 263, 84, -41, -22, 204, -220, -189, -216, -28, + -133, -148, 23, 27, 13, -85, 80, 72, -25, 29, + 24, 24, -59, 52, -160, 67, -65, 68, -33, -46, + 19, -19, -14, 12, -11, 6, 41, 32, -8, -26, + -7, -6, 24, 5, 44, 46, -18, 26, -29, 26, + -7, -2, 7, 0, -10, 9, -17, 18, -18, 4, + 12, 10, -5, -22, -1, 15 + }, + { + -269, -9071, 329, -82, 803, -480, 908, -524, -147, -62, + -293, 131, 100, -142, -286, 342, -154, 205, 48, 127, + -10, 26, -149, -35, -42, 221, 224, -117, -32, -103, + 7, -153, 172, -37, 130, -119, -131, 232, -99, 79, + 68, 77, 3, -41, 61, 112, -129, -53, -66, 21, + -84, -42, -43, -6, -79, -77, 39, -21, -100, 21, + 58, -4, -41, 4, 2, -41, 5, -11, -3, -9, + -13, 26, -41, 3, 9, 17, 5, 7, 10, 6, + 1, 2, 1, 16, -1, -20, 9, 12, 15, -5, + 1, 3, -12, 7, -9, 5 + }, + { + -92, 1375, 98, 3, -30, -43, -61, -64, 133, 90, + -220, -149, -443, 1020, 722, -200, 47, -134, -41, -153, + -273, -104, 148, -127, 31, 202, -111, 127, -72, -401, + 208, 84, -186, -124, -156, -210, -166, 184, 101, -91, + 90, 50, 81, 94, 103, -111, -4, -4, -128, 99, + -4, -54, -93, 68, -58, 160, 52, -49, 18, -16, + 48, 44, 52, -42, -19, -28, -26, 27, 15, 29, + -25, 27, -2, -32, 10, 25, 22, -3, 30, -2, + 8, 4, -6, -5, -30, -12, 5, -24, -21, -7, + 3, -3, 3, -13, 4, 2 + }, + { + 333, 7162, -979, -190, 141, -1046, -1050, 412, 146, 290, + 302, -31, -120, 1241, -276, 274, 495, -4, 57, -272, + -171, -166, 29, -312, -399, 22, 103, 297, -83, -556, + 8, 102, 250, 33, 220, -244, -212, 245, -169, 6, + -17, 133, -89, -129, 1, 83, -22, -46, 78, 131, + -113, -14, -99, 159, 47, 155, -65, -43, 21, 20, + -73, 46, -47, -25, 2, 36, -70, -8, -50, 11, + 37, 51, -7, -3, 3, -15, 0, -57, 25, 42, + -31, -32, -8, 20, -22, -2, 7, -1, 4, -5, + -12, 3, 18, 0, -17, -1 + }, + { + -78, -288, 407, 289, -147, -210, 34, -127, 132, -129, + 6, -446, -290, 1582, -1581, -640, 107, 190, -304, 318, + -200, 354, -330, 216, -177, -19, -75, -65, -126, -22, + 241, -183, -208, -28, -78, 150, 224, 22, 137, -208, + -62, 11, -29, -77, 34, 79, 90, -101, 147, 23, + 44, 69, -102, 2, 80, 51, 80, -52, 3, -3, + 10, 64, 48, -54, -23, 8, 3, 8, 35, -32, + 14, -6, -35, -21, 20, 20, -43, 40, -21, 11, + 24, -14, 6, -4, -22, 12, 7, 7, -10, 0, + 3, 11, -6, 16, -8, -7 + }, + { + 945, 3276, -94, -186, -16, -8, 228, -5, -46, -139, + 138, 65, -222, -360, -2433, 63, -441, 77, 221, -15, + -272, 8, -65, 86, 102, -113, -76, -468, 173, -8, + -1, -66, -211, -113, -20, 97, 50, 162, -10, 15, + -18, -4, -284, 58, 108, 170, -9, -117, -82, -66, + -27, 56, -76, -33, 24, -93, 25, -6, -84, 33, + -44, 28, 75, 14, 20, 51, -8, -1, -20, -31, + 11, 14, -3, -8, -4, -20, -18, -1, 10, -18, + 7, -32, -6, -28, 8, 13, -9, -3, -10, 2, + -8, -11, 3, 14, -8, 5 + } + }, + { + { + -34, 2022, -1059, 35, 51, 76, -46, 134, -60, -27, + 18, -301, 100, 281, -177, -20, 319, 399, -77, -833, + 133, -402, -116, -487, -221, 494, -129, 37, 156, 339, + -305, 429, -148, -101, -119, 142, 44, -159, 142, 84, + 32, -1, 46, -19, 153, 47, 51, 13, 178, -84, + 16, 5, -56, -69, -49, 53, -31, -33, -52, -29, + -41, 29, -29, 34, -5, 38, -1, 83, -9, 24, + 1, 16, 1, 33, 21, -2, 21, 6, 6, -19, + 7, 8, 0, 5, -20, -2, 11, 10, -4, 5, + -15, 9, -7, 3, -4, 10 + }, + { + 414, 7944, -3010, 300, 299, -6, -200, 206, 0, 172, + -220, -133, -58, 483, -41, 68, 243, -670, 166, 246, + -281, 309, -55, -13, -61, 96, -16, 108, 41, -241, + -89, -130, -51, -190, 137, -223, 194, -115, 256, 219, + -118, -162, -15, -1, -37, 79, -164, -23, 14, -77, + 43, 138, -99, 7, -60, 24, -22, -78, 31, -14, + 102, -5, 65, -20, 27, 24, 3, 47, -20, 54, + -4, -54, 14, -14, -21, -16, -32, 44, -25, 4, + -4, 7, -2, 11, -8, 23, -6, 1, 10, 0, + 7, -9, -7, -12, -2, 0 + }, + { + -158, -6057, 2340, 1078, 234, 166, -175, -9, -8, 120, + 28, 125, 127, 375, -22, -172, 443, 208, -822, 62, + -139, 215, 206, -297, 405, -319, 236, -23, 36, -310, + 67, -190, -207, 109, -172, -57, 117, -75, 3, 102, + 72, 5, -94, -63, 112, -113, 104, 88, 37, -47, + -56, 8, 33, -152, 149, 65, -51, 3, -77, -12, + 47, -48, -52, 42, 30, 20, -19, 13, -18, -42, + -7, -2, -14, -4, 2, 4, -3, 14, 1, -9, + 2, 11, 0, -20, 4, -12, -17, -12, 21, -1, + 1, 3, -1, 2, -17, -19 + }, + { + 95, 1524, -395, 14, -16, -5, -28, 40, 22, -26, + 139, -31, 147, -114, 101, -106, -90, 481, -318, 189, + 306, 61, -48, 19, 379, 280, 128, 283, -6, 26, + -136, -186, 158, 21, 188, 168, 150, 51, -66, -43, + -7, 65, -73, 79, -10, 9, 14, 26, -76, -47, + 37, -61, -23, -9, -103, 53, -42, -41, -4, 15, + -5, 18, -47, 16, 2, -10, 46, 1, 20, -21, + 18, 18, -7, 7, 3, -13, 14, -28, -12, -11, + -12, 25, 6, -3, -11, 8, 15, -16, -13, -4, + 4, 1, -14, -7, -4, 1 + }, + { + 595, -11040, 413, -800, 99, 25, -46, -118, 15, 324, + -510, 152, -111, 53, 364, 5, 131, -868, 373, 32, + 26, -175, 359, -39, 255, -27, -103, 336, -157, 176, + -140, 88, -166, 161, 32, -106, 280, -116, -108, -9, + 83, -69, -51, -31, 2, 155, -50, -40, -12, 18, + -40, 68, 38, 90, -12, 20, 48, 19, 79, 53, + -16, 32, -16, -35, -5, 5, -63, -26, -31, -6, + -53, 38, 41, 11, -25, 32, 48, 2, 19, -2, + 14, 18, -21, -5, 7, 5, 35, -11, -21, 13, + -17, -7, -8, 12, 9, 7 + }, + { + 20, -6, -157, 97, 13, 6, 27, -45, -140, 56, + 151, 93, -85, 114, 407, 150, -196, 440, -9, -345, + 120, -23, -313, 603, 65, 104, 70, -10, -273, 102, + -43, -117, -206, -243, 99, -38, 173, -83, 2, -21, + 134, 15, 4, -66, -20, 25, -49, 134, -1, 39, + -10, -33, -43, 14, 31, -73, -91, -14, -11, -22, + -62, 46, -9, -33, -10, 18, 2, 61, -40, 14, + 11, -34, 13, 48, 1, -24, 32, -31, -5, -44, + 20, 15, -15, 12, 0, -1, 19, 1, -8, 11, + -13, 4, -7, 1, -17, -1 + }, + { + -2182, -9845, 55, 231, -65, 174, 64, 75, 378, 230, + 107, -446, -107, -311, -193, -155, 141, -158, 167, 45, + 291, 35, 30, -6, -195, 9, 127, 211, 295, 178, + 205, -45, 13, 19, -105, -17, 82, -3, 157, -158, + -113, -94, 113, 116, -232, 34, -129, -24, 46, 36, + 100, 12, 68, -94, -23, 8, 49, 11, 6, 19, + 48, 31, -10, 6, 29, -16, -28, 9, -44, 4, + -3, 7, -21, -7, 12, -7, -19, -6, 16, -10, + -21, 5, 10, -24, 30, 10, -3, 7, -22, -5, + 8, -2, -8, 0, -3, 0 + }, + { + 71, 477, 351, 22, -11, 1, -50, -4, 141, -44, + 16, 9, 154, -156, 1007, -190, -21, 114, 268, -615, + 87, -286, -52, 64, 681, 24, -422, 224, -341, 111, + -109, 88, -365, 88, -101, -195, -142, -162, -176, 114, + 65, -68, 86, -65, -159, -116, 57, 4, -48, -73, + 29, -47, 14, -3, -56, -38, 29, -51, 35, -60, + 16, -20, -53, 7, 20, 30, -47, 36, 40, 8, + -35, -21, 50, 7, -18, -7, -11, 6, -16, 2, + -10, 2, -11, 8, 11, -8, 1, -15, -6, -9, + 1, 8, 26, 5, 5, -11 + }, + { + 2749, -7208, -1158, -54, 146, -94, 99, 40, 194, 30, + 165, -13, 324, -474, -407, -10, -246, 368, 147, -243, + -55, -34, 133, -160, 122, 205, -215, 134, -172, 53, + 258, -161, 84, 31, -41, 1, 72, 121, 97, -112, + -3, 150, -167, -216, -16, -41, 51, 46, -78, 5, + 6, -10, -10, -120, -116, 2, 14, -2, -32, 19, + -12, 28, -22, -62, -43, -18, -19, 33, 36, 28, + 17, 34, -20, 8, -22, -34, -19, 14, -17, 32, + 4, -17, -12, 1, -3, 25, -14, 3, -7, -7, + 13, 11, 26, 13, -2, 8 + }, + { + 95, 1089, -146, -85, 59, -25, 191, -136, -191, -95, + -263, -42, -334, 258, -746, -286, 431, -197, 632, -154, + -59, -16, 17, 522, -318, 11, 201, -205, -14, -143, + 149, 168, 118, -140, 44, -106, 23, -237, -283, 39, + -141, -102, -55, 39, 59, -144, 132, 54, 41, -41, + 42, -89, -11, -4, -17, -17, 7, 39, 21, -96, + -15, -48, 34, 3, 15, 25, 30, -13, 44, -60, + -2, -3, 34, 21, 27, 15, 11, 5, 6, 5, + -23, 20, -15, 25, -24, 12, -22, 8, 3, -10, + 12, -3, -7, -8, -10, -6 + }, + { + 371, -8944, 13, -460, -5, 639, 74, -393, 176, -344, + 8, -61, -151, 86, -266, 304, -345, 507, 216, -48, + 53, -115, 80, -224, -14, 245, 159, 6, -82, -29, + -60, -11, -21, 131, -67, -68, -61, 250, 15, -16, + 66, 53, 23, -60, 105, 8, -1, -45, -80, -63, + -72, -47, -65, 70, -56, -57, 34, -81, -69, 5, + 18, 1, -31, 6, -12, -2, -18, 11, -34, -13, + 20, 20, -34, -11, -3, 2, -1, 36, 7, -4, + 8, -2, 0, 18, -8, 5, -8, 6, 12, 11, + -3, -5, 1, 2, 2, -5 + }, + { + 53, 1421, -97, -139, -114, 32, 94, -7, 167, -9, + -104, -257, 625, -373, 530, -186, 123, -413, 60, -337, + 240, -510, 41, 49, 79, 4, 8, 30, 164, -456, + 198, 77, -193, 53, -82, -153, -20, -36, 51, -109, + 105, 100, 60, 42, 45, -37, -31, -35, -51, 28, + 0, -22, -113, -24, 106, 35, 66, -17, 12, -20, + 77, 20, 14, 9, 6, -51, -1, 22, 3, 11, + 24, 4, -32, 3, 13, 18, 19, 0, 13, 7, + 9, -4, 4, 1, -16, -21, 13, -14, -30, -8, + 10, -7, -11, 6, -6, 4 + }, + { + 785, 6296, -887, -337, 2, -584, -977, 271, 215, -114, + 227, -233, 61, 1287, -500, 350, 488, 264, 64, -245, + -206, -25, -50, -468, -130, -119, 75, 204, -143, -289, + -169, 154, 116, 157, 65, -175, -127, 59, -71, -229, + 147, 63, 99, -63, -97, 106, -135, 53, 97, 127, + -109, -27, -6, 60, -18, 93, -42, 17, 28, -52, + 46, -2, -57, -15, -7, 48, -9, -42, -36, -21, + 22, 64, -13, 16, 1, -22, 9, -39, 19, 0, + 7, -12, -23, 7, -15, 13, 5, 15, -9, -7, + 6, 0, 15, -5, -12, -6 + }, + { + 52, -62, 237, 198, -263, -53, -188, -108, 55, -36, + -278, -211, -337, -1816, 2898, -840, -66, 327, -381, 409, + -131, 83, -17, 166, -522, 130, -33, -11, -179, 46, + 110, -221, 8, -10, -40, 126, 327, 72, -173, -44, + -49, -66, -35, 78, -7, 126, 32, -78, 58, 79, + 75, -60, -37, 41, 86, 86, 33, 29, -54, 44, + -13, -6, 71, -44, -1, 3, 23, -20, -10, 21, + 8, -33, 13, -37, 3, -2, -17, 29, 15, -2, + 9, 0, -8, 3, -14, 16, 3, 3, -8, -4, + 1, 1, 10, 5, 0, -2 + }, + { + -103, 4586, -132, 233, -282, -232, 179, 24, -28, -228, + 159, -317, 230, -1241, -1537, -217, 209, 145, -65, -121, + -70, 107, -139, 198, -54, -82, -182, -194, -5, -4, + -75, -131, -289, -74, 106, 209, 112, 69, -17, -186, + 85, -14, -154, 1, 91, 269, -107, -133, -63, -21, + -91, 42, -81, -34, -25, 46, 12, -32, -62, 56, + -22, -14, 62, 54, 53, 36, -17, -7, -8, -16, + 12, 17, -17, -3, -29, -23, 2, -3, 27, -6, + -5, -33, -7, -14, -2, -10, 14, -7, -6, -3, + -10, -14, 9, 4, 15, -5 + } + }, + { + { + 4, 4684, 884, -286, -182, 97, -155, -117, -237, -9, + 6, -396, 291, 74, -420, -214, -69, 303, 1, -562, + 328, -49, 397, 86, 73, 492, 167, 140, 65, 520, + -145, 405, -81, -146, -427, -178, -39, -76, 133, 37, + 14, -50, 120, 43, 3, -67, 28, -11, 72, -178, + -21, 22, -56, -55, -46, 44, -64, -35, -55, -1, + -5, 19, 0, 5, -15, 33, -16, 89, -13, 33, + 15, 12, -20, 28, 23, -5, 34, -5, -19, -3, + 17, 3, -3, 9, 2, 9, -7, -14, 1, 25, + -9, 14, -14, -9, -3, 6 + }, + { + -532, 13761, 1649, -500, 3, -31, -154, 53, -366, 83, + -105, -277, -293, 406, -190, -533, -23, -106, 784, 286, + -136, -51, -317, -2, -155, 155, -96, -46, 60, -125, + 107, 66, 149, -128, 169, -36, 300, -77, 85, 92, + -168, -143, 215, 182, -82, 65, -12, 195, 98, -103, + -55, 68, -92, 12, -18, 82, -75, -145, 2, -24, + 69, 4, 61, -56, -44, -22, 2, 31, -67, 58, + 21, -34, 5, -5, 19, 12, -20, 32, -19, 17, + -24, -10, -3, 11, -16, 15, -17, 0, 12, -2, + 21, 9, -11, -21, -6, 7 + }, + { + 33, -10467, -1089, 597, 187, 293, -21, 40, -89, -63, + -286, -190, 20, 109, 65, -127, -74, 227, -518, 86, + -589, -188, 291, -192, 207, -349, 82, -330, 59, 7, + 209, -399, -280, 53, -272, -13, 109, -179, -122, -57, + -92, -164, -9, 48, 123, 8, -11, -55, 48, 74, + 54, 14, 26, -158, 113, 23, -36, 93, -12, -26, + 36, 15, -33, 24, 17, 10, -24, 27, -7, -3, + 44, 42, 4, -20, 14, 25, 8, 6, 3, -12, + -9, -9, -1, 7, 14, 0, 7, -11, 10, -12, + -21, 3, -4, -7, -8, -10 + }, + { + -76, 1982, 16, -23, 46, 8, -16, -42, -26, -49, + 135, 81, -18, -118, 357, -255, -378, -181, -509, 84, + 20, -194, -96, -74, 151, 128, -107, 161, -170, -21, + -233, -278, -15, -180, 81, 15, 49, -61, -92, 109, + 21, 16, -177, 12, -26, 14, 21, 31, -91, 26, + 97, -84, -2, 31, -32, 75, -54, -42, -40, -15, + -45, -28, 1, 19, -24, -30, -1, -8, 22, -15, + 33, 7, -31, 3, 14, -6, 23, -13, -5, -5, + -7, 23, 5, -4, 10, 7, 10, 1, 1, 8, + 7, -2, -3, 0, -12, -1 + }, + { + 307, -11854, 374, -646, -40, -38, -27, -45, 10, 307, + -496, 326, 35, 77, 277, -116, 158, -1186, 244, -98, + -11, -256, 30, -100, 179, 74, -118, -82, -388, 244, + -286, 80, -147, 135, 88, -180, 503, 88, -109, -13, + 26, -160, -32, 86, -6, 26, -86, 45, 9, -46, + -123, 21, 18, 44, 14, 12, 21, -62, -6, 48, + -36, 17, 21, -22, -31, 45, -26, 18, 15, 23, + -19, 12, 4, 1, -12, -2, 10, 20, 26, -4, + 13, 6, -18, -5, -6, -6, 12, -18, -8, 6, + -26, 4, -1, 10, 6, 7 + }, + { + -23, 53, -97, 97, 3, -5, 3, -108, -201, -32, + -9, 1, -385, -234, 68, 0, -130, 267, -408, -133, + 812, 57, -198, 815, 121, -18, 100, 212, -400, 69, + 274, 54, -86, -124, 223, -57, 104, -144, 62, 109, + 143, -27, -23, -144, -135, -31, -102, 106, -1, -40, + -52, 27, -44, -44, 56, -33, -9, 32, 66, 43, + -77, 1, -60, -31, 6, 17, -45, 35, -7, -7, + 2, -7, 15, 39, -6, -22, 16, -37, 7, -33, + -3, 12, -8, 16, -4, -19, 0, -3, -21, 1, + -8, 0, -17, -3, -21, 1 + }, + { + 3215, -3749, -895, 471, -172, 2, -15, 0, 54, -32, + 125, -152, 215, -32, -144, -50, 38, -168, 226, 19, + 254, -40, 57, 100, 93, 74, -39, 6, -118, -113, + 145, 73, 72, -96, -113, -16, 95, -128, 56, -45, + -23, -94, 53, 171, -76, 64, -7, -59, -73, -30, + -47, -130, -42, -111, 18, -47, -21, -18, -18, 35, + 69, -9, -30, 2, 5, -41, -18, 50, -22, 11, + -8, -17, -27, 3, 18, 16, 7, 16, 12, -17, + -22, -19, 1, -21, 12, -14, -4, 18, -28, -18, + 0, 6, -10, -3, -5, -6 + }, + { + -30, -637, -356, -89, -18, -6, -29, 0, 75, -23, + 139, 199, 314, 90, 1129, 307, 739, -135, 154, -540, + -208, -649, -380, -801, 321, 147, -239, 340, -366, 45, + -170, 170, -273, 77, -37, -16, 43, -69, -195, 45, + -12, 5, 117, -62, -64, 1, 81, 90, 38, -82, + 1, -114, -23, 49, -17, -11, 40, -61, 23, -63, + 116, 68, -4, 12, 22, 1, -68, 54, 20, -1, + 12, -23, 2, -12, -15, 5, 7, 4, 13, 30, + 4, 24, -19, -16, 19, -11, -7, 21, 10, -12, + 8, 0, 18, 0, 6, -3 + }, + { + -2203, -11568, 1076, 277, 206, -157, 61, 31, 7, -95, + 94, -44, 370, -240, -149, 36, 2, 521, -33, -371, + 8, 64, 105, -320, -36, 181, -215, 117, -184, 60, + 189, -250, 16, -86, -133, 54, 42, -69, 114, 21, + -231, 115, 14, -108, 106, -21, -34, 93, -76, -108, + -35, -3, 32, 47, -45, 8, 3, 5, 42, 63, + 23, 58, 12, 0, 32, 40, -20, 11, -5, -33, + -1, 38, -16, 21, 0, -9, -27, -2, -38, 23, + 7, -8, -11, 4, -4, 23, -10, 14, 4, -3, + 17, -1, 2, -3, -6, 4 + }, + { + -84, 2048, 508, -151, 48, 20, 282, 46, -47, 82, + -147, 89, -420, 91, -910, -239, 562, -560, 222, -310, + 84, -9, -302, 455, -65, -35, -91, 19, 170, 182, + 248, -173, -12, -126, 39, -84, 191, 18, -53, 127, + 32, 37, -68, -48, 73, -39, 57, 47, 50, -65, + 92, -108, 19, 67, 17, -48, 51, 32, 7, -25, + 64, -42, 16, -31, 5, 3, 9, -42, 20, -26, + 24, -13, 4, 7, 2, -6, 1, 9, 7, 11, + -4, 24, -16, 12, -24, 18, -25, 2, 7, -6, + 14, -6, 0, 5, -6, -2 + }, + { + -379, -9253, 514, -560, -180, -59, -799, -431, 293, -189, + 72, -117, -75, 267, -248, 121, -78, 778, 232, 3, + 316, -89, 49, -119, -81, -104, -11, -38, 25, 194, + 25, -67, -186, 36, -12, 73, -6, 255, 192, 151, + 165, 106, 14, 10, 46, -74, 39, 16, -37, 6, + 37, 13, -9, 86, 17, -7, 58, -45, -7, 6, + -29, -16, -26, 7, -8, -3, -18, 15, -59, -10, + 10, -7, -29, -8, 1, 10, -3, 11, 0, 6, + 0, -2, -17, -14, 7, 17, -1, 13, 4, 0, + -8, 3, 23, 5, -1, -3 + }, + { + -14, 1220, -257, -273, -140, 129, 82, -65, 62, -48, + 41, -214, -134, -1695, 15, -150, 392, -78, 49, -230, + 245, -756, -80, -201, 572, 452, 18, -7, 333, -241, + 160, -58, 66, 225, 223, 205, 179, -54, 25, -38, + 92, 3, -73, -70, 62, 48, -20, -2, -21, -4, + 42, 60, -23, -19, 56, -62, -23, -85, -6, 36, + 96, 8, -16, -8, 35, -26, 7, 5, 9, 17, + 30, 18, -23, 30, 27, -2, 6, 8, 15, 7, + 10, -11, -12, -4, 3, -2, 8, -13, -15, 1, + 9, -2, -6, 11, 0, 8 + }, + { + -1338, 3026, -620, 432, 204, 361, -323, 160, 143, -287, + -57, -536, -478, 818, -615, -268, 89, 430, 255, -14, + -81, -19, 208, -60, 205, -49, -11, -1, -6, 88, + 129, 131, -78, 7, -191, -156, -58, -12, -40, -204, + 20, 33, 233, -23, -82, 169, -119, 11, -29, 143, + 21, 66, 12, -68, -107, 22, 0, 80, -46, -120, + 37, -13, -15, 10, -8, 72, 10, -37, -22, 2, + 2, 37, -8, -1, -10, -10, 11, -32, -4, -8, + 37, -3, -35, 6, 3, 14, -9, 10, -15, 2, + 18, -1, 2, -7, -3, 0 + }, + { + -40, -1, 360, 183, -149, 131, -141, -183, 28, 59, + -171, -98, -574, 224, 5998, -530, -3, 588, 17, 248, + -18, 12, -3, 424, -338, 143, -114, -184, 124, 261, + 98, -171, -13, -17, 24, 64, 96, -74, -167, -47, + -165, 24, -9, 147, 3, 31, -128, -108, 28, 66, + 32, -52, 64, 70, 23, 22, 32, 42, -62, 62, + -53, -58, 54, -59, -42, -21, -13, -29, -14, 38, + 31, -12, 35, -33, -20, -17, -4, 12, 27, 2, + 10, 27, -4, 3, 4, 2, -20, -5, -2, -13, + -8, 0, 15, -3, 2, 2 + }, + { + -660, 4296, 88, 239, -270, -308, 148, -116, -142, -190, + 61, -483, 311, 813, 1106, 124, 464, 46, 76, 103, + 210, 175, -170, 94, -81, -114, -411, -52, 71, -146, + -14, 72, -8, 73, 54, 3, -109, 34, 14, -103, + 162, 105, -41, 57, 94, 144, -175, -92, -8, 34, + -109, 9, 0, 49, 6, 102, 84, 27, -57, 31, + -10, -29, 45, 80, 46, -6, -13, 60, 28, -22, + 21, -13, -28, 32, 2, 24, 18, 9, 34, 3, + -6, -15, 15, -15, 5, -1, 24, -8, 7, -1, + -11, -11, 5, -7, 11, -17 + } + }, + { + { + 52, 4083, 861, -258, 59, 11, -219, -90, -182, 152, + -256, -329, 189, -158, 156, -296, -116, 393, -227, -447, + 455, 179, 58, 104, 359, 196, 548, 107, 13, 290, + -98, 513, -227, -154, -305, -237, 22, -279, 151, 74, + -64, 75, 13, 136, -77, -89, -53, 86, -76, -116, + -10, 9, -49, 12, -34, -18, -67, -59, 43, -44, + -20, 17, 24, 13, 5, -22, 25, 32, 5, 23, + 33, 8, -19, 10, 31, -20, 44, -2, -20, 0, + 6, -7, 24, -1, 15, 1, -7, -14, 5, 11, + 19, -6, -7, -10, -2, -7 + }, + { + 605, 13545, 16, -206, -4, -88, -81, -125, -261, -1, + 233, -346, -289, 125, 54, -808, -161, 436, 551, -8, + 53, -422, -158, 42, 43, -115, -130, 65, 16, 0, + -41, 228, 55, -37, 5, 127, 89, 34, 34, -17, + -121, -39, 224, 50, 23, 38, 43, 141, 57, -13, + -25, -5, -44, -11, 21, 35, -52, -46, -55, 11, + 3, 34, 23, -19, -48, -30, -40, 36, -28, 29, + 13, -10, -34, 15, 0, 2, 26, -12, 6, -10, + -14, -2, -12, 17, -4, -4, 3, -1, 8, 1, + 13, 9, -11, -20, 1, 3 + }, + { + 12, -10486, -674, -226, 614, 139, 27, -78, -49, -141, + -155, -52, -210, -290, -5, 386, -439, 339, -95, -83, + -605, -283, -79, 74, -16, 23, -97, -128, -200, 7, + 115, -262, -158, -189, -296, 143, 45, -301, 9, -64, + -113, -119, -127, 177, 121, 89, -190, -8, -1, 157, + 63, 38, -19, -142, 4, 92, 32, 43, 50, -82, + 6, 66, 11, -5, -9, 20, 6, -19, -4, 9, + 57, 53, -7, 2, 38, 13, 9, 7, -19, -8, + -5, -10, 5, 3, -3, 21, 3, -18, 2, -17, + -8, 3, -3, -11, -3, -4 + }, + { + 62, 1642, 129, 17, 3, 8, -8, -35, -75, 10, + 69, 166, -152, -348, 316, -207, -121, 223, -823, -212, + 129, -38, -194, -25, -242, 105, -140, 351, -191, -59, + -163, -131, -281, 42, -121, -4, -29, -6, -13, 84, + -17, -9, -96, -86, 0, 59, 40, -63, -31, 52, + 20, 28, 20, -17, 24, -17, -3, 3, -95, -24, + -15, -57, 43, -17, -26, -10, -1, 23, -20, 36, + -1, 4, -49, 35, -1, 3, 12, 5, -3, 15, + -19, 8, -2, 7, 14, 4, 2, 8, 10, -2, + 11, -5, 7, 2, -10, 6 + }, + { + -1132, -11318, 1360, -1127, 235, 40, -156, 193, -230, 21, + 243, -176, 117, -16, -2, 67, 221, -1388, 733, -350, + -324, 152, -321, -162, 148, 98, 38, -380, -267, 193, + -231, 159, -37, -44, 4, -156, 294, 223, -92, 20, + -98, -55, 22, 34, -26, 0, -14, 19, 46, -135, + -135, 40, 36, -42, 74, 5, 37, -69, -44, 7, + -16, 20, 19, -24, -26, 24, -2, 8, 34, 17, + -6, -27, 11, -12, -4, -9, -6, 36, 27, -4, + 13, -17, 10, -8, -3, -4, -3, -10, -10, -3, + -21, 8, -6, 9, 0, 4 + }, + { + 0, 269, -266, -51, 45, 5, 2, -132, -65, -28, + -88, 8, -364, -485, 1, -1, 89, 81, 217, -374, + 176, 130, 334, 326, 140, 159, -407, 614, -356, 89, + 175, 118, -36, -234, 244, -7, 6, 34, 94, -18, + 157, 12, -47, -96, -144, -70, 11, -35, 12, -65, + -26, -3, 54, -80, 70, -47, 9, 24, 67, 10, + -50, 38, -107, -22, 9, 10, -30, -2, 28, -25, + -3, 15, 33, 5, 11, 14, -25, -8, -17, 2, + -12, -10, 14, 10, -11, -5, -18, -12, -8, 1, + -7, -6, -11, -8, -3, -5 + }, + { + -3451, 912, 1876, 205, 346, -38, -11, 102, -108, -229, + 43, 238, 90, -6, -204, 248, -158, -62, 162, -9, + 92, 53, 51, 78, 149, -109, 23, -88, -69, -166, + 63, 296, -22, -136, -11, -8, -30, -92, -16, -6, + 27, -81, -14, 107, 65, -14, -7, -61, -176, 78, + -111, -127, -20, -103, 77, -126, -17, -7, 13, 29, + 65, -30, -5, 7, -11, -28, -31, 44, -19, 17, + -10, -44, -12, 16, 13, 11, 15, 23, 6, -23, + -15, 8, -16, -4, -17, -1, 0, 2, -14, -16, + -3, 5, 0, -6, -7, 5 + }, + { + -55, -655, -392, 20, -5, 9, -1, 26, -20, 25, + 97, 181, 145, -77, 482, 717, 848, -31, -129, 13, + -900, -203, -418, -497, 272, -375, 94, 62, -134, -227, + -81, -42, 1, -171, 120, -112, 120, -155, -90, 6, + 23, 66, -72, 47, -115, 128, 46, 62, 46, -92, + 24, -94, -48, 115, -22, 48, -17, -40, 21, -57, + 102, 39, 75, -20, 6, -10, 0, -4, 30, -27, + 52, -13, -30, -12, -4, -22, 51, 2, 19, 25, + 12, 5, -17, -6, 10, -10, -3, 37, -4, -5, + 8, 3, 4, 5, 7, 0 + }, + { + 1224, -14621, -2, 189, 224, -53, 39, 46, -65, -26, + 42, -38, 149, 59, -185, -39, 138, 136, -81, -45, + -32, -36, -63, -74, 26, 38, -14, -39, 60, -155, + 98, 103, -145, -119, -114, 59, -16, -8, -33, 97, + -202, 43, 23, 58, 52, 8, -56, 66, -76, -42, + -85, 43, -26, 60, -27, 20, -20, 11, 32, 56, + 39, 42, -14, 48, 5, 43, 7, -20, 0, -34, + 8, 2, 9, 10, 22, -24, -27, -8, 2, -10, + 11, 1, -5, -8, -6, -2, 4, 7, 14, 3, + 3, 3, -3, -3, -6, -5 + }, + { + 68, 2295, -202, 170, 49, 165, 71, 32, 70, 219, + -2, -216, -17, -43, -788, -12, -78, -228, -306, -38, + 212, -29, -194, 340, 103, 81, -307, 133, 71, 327, + 11, -42, -67, 128, -118, -69, 315, -19, 50, 77, + 93, -24, -59, -77, 58, 137, 12, -18, 86, -62, + 61, -48, 40, 22, 32, -28, 35, 1, 12, 2, + 15, -25, 32, -39, -30, 2, 10, -18, 3, 3, + 27, -23, -24, 26, -21, 19, -3, 4, -15, 27, + 7, -7, 12, -14, 2, 4, -12, -3, 7, 13, + 2, 6, -2, 6, -2, 6 + }, + { + 286, -8492, -308, -647, -167, -101, -992, -49, -175, -125, + 111, 121, -132, 163, 42, -267, 590, -26, 466, -6, + 213, 57, 67, 13, -154, -152, -125, -54, 186, 269, + -103, -249, -133, -1, 155, -4, 78, 293, 69, 180, + 187, 187, -11, 92, -61, -88, 31, 23, 52, 17, + 20, -31, 92, 8, 58, -47, 45, -25, 23, -2, + -39, -4, 11, -15, -4, -1, -27, -2, -37, 0, + -7, -22, -22, 12, 21, -1, 9, -16, 8, 1, + -7, 8, -25, -15, 12, 8, 9, 9, 11, -3, + -10, -2, 19, 2, 4, 7 + }, + { + -10, 940, 149, -453, -66, 116, -104, 42, 17, -97, + 121, -184, -792, -700, -290, -7, 182, 217, -303, 112, + 273, -915, 174, -254, 468, 394, -187, 177, 194, -32, + 117, -209, 32, 332, 112, 251, 184, -42, 145, 42, + -135, -41, 21, -16, 75, 24, -55, -39, 28, 26, + 31, 3, 78, -11, 5, -82, -61, -65, -22, 42, + 106, 0, 10, -32, 1, -12, 10, 11, -12, 39, + 18, 19, -11, 11, 21, 10, 19, 4, 5, 10, + 7, -7, -9, -14, 2, -2, -14, -13, -4, 6, + 1, 3, 3, 0, 4, 8 + }, + { + 1210, -312, -390, -20, -44, 773, 96, -68, -94, -66, + -142, -468, 380, -657, -140, -129, -227, 240, 161, 333, + -206, -80, 173, 222, 86, 151, -138, -45, 91, -15, + 290, -26, -30, -99, -143, -42, -140, 94, -80, -68, + -110, -71, 217, 8, 45, -3, -27, -20, -8, -3, + 173, 49, -84, -15, -60, 70, -62, 65, -36, -54, + -22, -23, -34, 46, -29, 75, 34, -51, 2, -1, + -13, 18, -5, -3, -23, 20, -43, 18, -10, -8, + 17, -2, -20, -9, 9, 3, -17, 4, -3, 0, + 16, -2, -3, -8, 9, -2 + }, + { + 30, -20, 192, 156, -30, 18, 13, -78, 34, -74, + -62, -46, -487, 2123, 3380, 141, 89, 140, 159, -188, + 489, -117, 93, 151, 28, -41, -44, -26, 7, 119, + 157, -20, -84, -123, -110, -3, 147, -85, -143, 1, + -265, 194, -50, 98, 22, 21, -195, -88, 33, 109, + 23, -36, 77, 35, 9, -23, 65, -8, -26, 43, + -43, -23, 43, -64, -43, 10, -77, -3, 7, 37, + 17, -5, 9, -19, -20, -8, -1, -4, 3, 9, + 24, 31, 5, 0, 13, -16, -29, -8, 10, -12, + -3, 1, 11, -2, 6, 1 + }, + { + 1044, 2819, -461, -20, -135, 239, -383, -73, -171, -185, + 190, -144, -17, -474, 3255, 292, 411, -326, 116, 134, + 227, 160, -156, -65, -45, -153, -286, 260, -196, -112, + -45, 33, 208, -18, -21, -42, -152, 67, 61, 3, + 21, 166, 47, 56, 86, 1, -145, 5, 14, -48, + -30, -58, 108, -17, 44, 100, 34, 80, -61, -57, + 34, 7, 31, 34, 50, -40, -7, 48, 31, -9, + 4, -10, -17, 47, -8, 30, 4, 31, 4, 20, + -7, -9, -1, 4, 9, 2, 16, -5, 5, -9, + -1, -9, 1, -3, 2, -12 + } + }, + { + { + -16, 279, -2305, -192, 161, -71, -117, 86, -1, 155, + -305, -85, -23, -639, 574, 343, 45, 31, -344, 15, + 776, 146, -80, -149, 21, -323, 154, 20, -211, 112, + -165, 218, -246, 214, 213, 73, 175, -325, 54, -1, + -143, 34, -44, 69, -94, -80, -101, 24, -57, -37, + -10, 25, 21, 47, -11, 3, -22, -20, 89, -15, + -47, -3, 22, -13, 3, -8, 22, 28, 7, -20, + 2, 13, 1, -6, 6, -28, 24, -2, -3, -3, + 6, -6, 15, -6, 14, -1, -5, -7, 4, -11, + 16, -11, 6, 8, 5, -6 + }, + { + -403, 9353, -2057, -97, 77, -4, -82, 66, 57, 132, + 335, -200, -208, -161, 233, -130, 77, -284, -169, -140, + -110, -238, 64, 170, 22, -187, -2, 114, -1, -21, + -154, 105, -75, 38, 39, -23, 12, 86, 51, -11, + 35, 22, 73, -63, -88, -80, -48, 44, 43, 5, + 47, 65, -44, -30, -6, 4, 10, 20, 12, 13, + -51, 0, 25, 2, -48, -25, -63, 23, -15, 4, + -5, -12, -14, 19, -19, -1, 13, -34, 18, 7, + -4, 3, 0, 20, -1, -3, 19, -7, -2, -9, + 1, 8, 1, -12, 6, 3 + }, + { + -88, -6334, 2304, -1145, -454, -161, 69, -14, 51, -123, + 8, 17, -226, -93, -219, 347, -225, 176, -172, 60, + -304, -19, -30, 97, -33, 122, -33, 147, 40, -109, + -61, -172, -132, -192, -191, 50, -36, -27, 132, -13, + -10, -46, -62, 93, -35, 49, -159, 67, 61, 61, + -65, 7, -38, -98, 13, 42, 34, 62, 60, -64, + -2, 33, -20, -31, 15, 4, -17, -20, -25, 3, + 46, 19, -6, -1, 14, 14, 6, -10, -7, 18, + -8, -11, 14, -5, -19, 11, -2, -11, 7, -20, + -2, 2, -3, -5, 7, 3 + }, + { + -23, 882, -319, 8, -34, -18, 21, 37, -51, 10, + 42, 136, -307, -245, 507, -192, -202, 295, -623, -114, + 22, 114, 30, 30, -112, 277, 109, 415, -158, 101, + -30, -40, -163, 179, -70, -32, -42, 41, -11, 58, + -46, -54, -4, 40, 52, 46, 35, 10, 2, -19, + -46, 43, 10, -46, 3, -44, 27, 47, -67, 13, + 12, -37, 31, -24, -31, 12, 28, 22, -33, 43, + -14, 21, -7, 23, -18, 5, 14, 6, -9, 11, + -29, 4, -9, 3, 1, -6, 1, -2, 1, -12, + 5, -2, 4, 3, -2, 8 + }, + { + 1664, -9607, -161, -697, 167, -71, -272, 109, -200, 15, + 331, -205, 179, 116, -452, -385, 84, -1577, 357, -314, + -168, 280, -268, -136, 59, -86, 60, -78, 9, 205, + -47, 118, -69, -94, -1, -1, -57, 17, -7, 33, + -22, -60, 18, -13, -76, -7, 42, 39, 13, -138, + -115, 24, -1, -77, 63, -25, -13, -36, 1, -20, + -25, 16, 10, -9, -32, 9, -2, -16, 1, -23, + -13, -34, 1, -1, 0, -1, -6, -1, 15, -3, + 6, -10, 12, -14, 6, 9, 8, -1, -11, -4, + -12, 15, -4, 3, -2, 3 + }, + { + -7, 292, -307, -95, 0, 13, 36, -73, 73, 7, + -127, 16, -262, -59, 255, -166, -73, 79, -241, -977, + 138, 92, 85, 155, 61, 50, -128, 878, -96, 42, + -144, 102, -33, -283, 97, -154, -53, 41, 97, -60, + 44, -38, 42, -18, -57, -3, 18, -88, 66, 49, + 39, -14, 44, -72, 28, -62, 6, -18, 8, -28, + -47, 58, -64, -7, 22, 9, -32, -2, 34, -26, + -3, 5, 14, 3, 28, 1, -42, 14, -15, -5, + -3, -15, 7, -4, -8, 12, -19, -8, 1, 2, + -2, 4, -1, -17, -2, 6 + }, + { + 2995, 2725, -3353, -315, -27, -62, 29, 52, -20, -56, + -78, 33, -38, -7, -397, 301, 124, -92, 129, 30, + 13, -96, -177, 28, 69, -219, 142, 93, 116, -62, + -9, 145, -191, -157, 112, 38, 43, 56, 4, -13, + 54, -106, -77, 77, -30, -6, 42, -34, -151, 57, + -19, 10, 62, -67, 103, -138, -51, 35, 12, -2, + 60, -40, -7, 13, -18, -14, -36, 13, -35, -6, + 2, -24, -12, 12, 10, 5, 16, 7, -3, -10, + -6, 25, 4, 10, -9, 17, 1, -5, -2, -6, + 6, 6, 7, 1, 1, 17 + }, + { + 36, 230, 10, -7, -5, 3, 17, 11, -35, -28, + -16, 101, 53, 103, -232, -711, 31, 94, -250, 394, + -14, 331, -105, -193, 204, -618, -102, 17, -205, -221, + 47, -109, 199, -25, 73, -213, 116, -17, 47, 52, + 17, 14, -127, 45, -105, 117, -7, -27, 78, -16, + 17, -17, -11, 69, -68, 7, -14, -10, 44, 14, + 66, -34, 25, -54, 7, 14, 24, -39, -6, -51, + 26, 5, -5, -6, -1, -25, 39, -6, 20, -1, + -7, 11, -1, 15, 11, -15, -3, 16, -14, 5, + -2, -5, -4, -2, 5, 2 + }, + { + -166, -13643, 2421, 233, -105, -2, 124, 121, 15, 11, + 80, -31, 10, -14, -207, 85, -105, -237, -15, 187, + 28, -50, -22, 35, 136, 113, 67, -26, 94, -136, + 123, 130, -54, 20, -28, 7, -58, 38, -112, -75, + -344, -19, 72, 62, -19, 21, -46, 17, -66, -6, + -92, 27, 2, 92, -11, -5, -29, -4, -19, 11, + -8, -8, -25, 34, -12, 24, -9, -20, 21, -20, + 1, -17, 2, 5, 22, -11, 17, 1, 14, -16, + 3, -8, -5, -4, -6, -10, -9, -9, 6, -6, + -6, 6, -3, 0, -8, 2 + }, + { + -34, 1546, -821, 97, 131, -108, -311, 45, 31, 132, + 26, -39, 170, 52, -351, 402, -116, -226, -269, -253, + -3, 52, -300, 99, 152, 146, -279, 16, -53, 19, + -120, 175, 9, 115, -23, 46, 230, -99, 13, 28, + 80, -46, -30, -44, 26, 60, -45, -63, 19, -81, + 70, -19, 52, -21, -3, -18, 0, -11, 28, 3, + -25, -22, 34, -1, -18, -17, 20, -14, -7, -8, + 19, -21, -23, 28, -13, 28, -10, 1, -11, 16, + -7, -1, 26, -16, 0, 5, 7, 10, 6, 13, + -7, 10, 6, 8, -1, 6 + }, + { + -188, -6017, 2471, -254, -122, 98, -707, 12, -133, 106, + -46, 4, -32, -50, 141, -130, 577, -258, 120, 3, + 234, 53, -2, 25, -33, -78, -94, -57, 133, 131, + -199, -57, 77, -61, 169, 47, 50, 32, -145, 101, + 32, 71, 7, 97, -48, -66, -29, 9, 46, 3, + 31, -3, 63, -45, 44, -39, 7, -34, 14, 11, + 37, 39, 34, 5, 13, 12, -6, 8, -23, 2, + 2, -1, -1, 21, 14, -10, -9, -27, 5, 1, + -4, 3, -16, 6, 7, -1, -2, -8, -5, -4, + -4, -5, 5, -2, 3, 2 + }, + { + 28, 363, -182, -166, 124, 72, -104, 29, -22, -58, + 88, -18, 470, 715, -288, -233, -81, 308, -276, -132, + 405, -389, 62, -631, -120, 192, -403, 22, 173, 32, + 50, -177, -99, 111, -103, 53, 119, 23, 110, -22, + -189, -13, 108, -1, 59, 23, -24, 0, -42, -64, + -27, -38, 54, -9, 17, -41, -6, -28, -18, 8, + 49, -34, 29, -49, 3, 13, -11, -9, -42, 27, + 1, -11, -3, 19, 4, -1, 4, -15, -1, -2, + -6, -7, 9, 1, 5, -10, -17, -1, 4, 0, + -5, 6, 2, -5, 4, 4 + }, + { + -643, -2331, -173, -384, -430, 57, -161, -11, -8, -10, + 88, -336, -128, -1081, 87, 113, -99, -10, 16, 281, + -254, -86, 66, 63, -145, 76, -164, -30, 5, -165, + 115, -263, -61, 48, -22, 98, -68, 83, -27, 70, + 26, -106, 111, 28, 123, -37, -81, -37, 38, -50, + 130, -51, -114, 60, -3, 129, -64, -2, -67, -1, + 24, 13, -18, 45, -60, 27, -7, -52, 17, 8, + -21, 1, -1, 15, -14, 12, -35, 21, -12, 1, + -6, -6, 8, 10, 3, -8, -18, 9, 3, -5, + 13, 1, -4, -18, 3, -6 + }, + { + -5, -156, 7, 65, -51, 33, 61, -10, 138, 9, + 159, 114, -257, -170, -1136, -442, 327, -75, 75, -310, + 121, -302, 184, 19, -92, -72, -74, 26, -156, -116, + 24, 79, -52, -187, -29, 22, 63, -18, -52, 107, + -138, 105, -59, 107, -22, 18, -127, -33, 38, 17, + 8, -29, 68, 2, 21, -27, 5, -31, -23, 40, + -17, -10, 36, -43, -13, 6, -40, 34, -11, -22, + 0, 21, 0, -21, 14, 26, 7, 6, -21, -11, + 13, 1, -3, 1, 12, 2, -17, 0, 10, -2, + 6, -8, 0, 3, 6, -1 + }, + { + -969, 724, -13, 0, 90, 131, -416, 169, -11, -151, + 117, -53, 14, -656, 2672, -146, 170, -267, 89, 17, + 66, 97, -47, -71, 73, 67, -101, 230, -109, 45, + -49, 22, 144, 20, 33, -7, -10, 77, 87, 110, + 1, 58, -65, 52, 79, -30, -64, 45, -1, -65, + 22, -90, 3, -53, 21, 8, -27, 82, -26, -75, + 19, 24, 19, -11, 5, -27, -1, -16, 13, -1, + -13, 16, 1, 27, -21, 0, -11, 29, -19, 4, + 11, 2, -10, 4, 1, 1, 7, -8, -7, -9, + 9, -2, 1, -1, 6, -4 + } + }, + { + { + -87, -2148, -385, -22, -191, -61, -6, 17, 168, -49, + -144, -9, -187, -126, 370, -3, 295, -257, 184, 17, + 628, -101, -147, -211, 57, -213, -121, -25, 4, -62, + -76, -55, 49, 198, 278, 104, 87, -131, -68, -25, + -11, -54, -31, 33, -33, -114, -66, -7, -5, -39, + -13, 21, 52, 6, -8, 10, -2, 16, 37, -25, + 2, -34, 0, 3, -8, -2, 9, 36, 5, -14, + -2, -4, 17, -4, -4, -8, -5, 11, 12, -3, + -2, -5, 6, -5, 0, 4, -6, -1, -5, 0, + 6, -4, 1, 8, 6, 2 + }, + { + 156, 6269, -226, -154, 94, -11, 74, 40, 127, 33, + 164, -49, 7, -124, 151, 29, 21, -92, -548, -98, + -64, -70, 5, 124, 49, -83, 13, 97, -20, -111, + -42, -39, -48, 27, 143, -133, -10, 108, 97, 39, + 25, 69, -49, -40, -44, -40, -114, 28, 46, 22, + 2, 59, -34, -44, 36, -13, 21, -13, 27, -15, + -30, 5, 12, -3, -28, -32, -17, -19, 0, -12, + 8, -12, 3, 8, -9, -19, 1, -8, 19, 4, + 1, 1, 3, 9, -3, 12, 10, -13, -1, 2, + 1, 3, -3, -4, -2, 2 + }, + { + 276, -1002, -2251, -1349, -356, -22, 49, 6, -1, 88, + -99, -88, -114, -15, -191, 112, 161, -77, -94, 100, + -88, 32, -81, 93, -26, -84, 33, 149, 113, -71, + -55, -79, -162, -172, -121, -18, -62, 138, 25, -39, + 14, 26, -16, -18, -17, 5, -36, 26, 52, 29, + -37, -17, -57, 2, -1, 19, 4, 41, 38, -3, + -15, -35, -25, -8, 5, 12, -25, -10, -16, -18, + 28, 2, 8, 0, 9, 8, 7, -11, 5, 8, + 0, -7, 2, 1, -5, -7, -1, -1, -2, -5, + -5, -3, -4, -2, 6, -1 + }, + { + -22, 299, 123, -46, -16, -2, 31, 54, -65, 39, + 69, -55, -54, -145, 257, -95, -118, 308, -511, -50, + -40, -15, 276, -56, 90, 164, 239, 132, 71, 12, + -23, -33, -52, 65, 34, -33, -47, 27, 11, 0, + -26, -72, 50, 22, 44, 96, 0, 14, 1, -29, + -24, -4, -24, -13, -26, -10, 27, 19, -31, 10, + 20, -17, -9, -8, -16, 1, 12, 9, 2, 12, + 12, 4, 31, -13, -13, 7, 8, -1, -7, -8, + 0, -14, -4, -3, -7, 3, 3, -5, -6, -8, + 0, 0, -5, 2, 0, 1 + }, + { + -1693, -4648, -489, -441, -163, -65, -186, 44, -81, 47, + 21, 123, 17, -200, -395, 52, -189, -908, -337, -7, + -142, 76, -80, -36, 45, -74, -128, 132, 39, 66, + 144, -33, -2, -16, -27, 3, -113, 32, 56, -2, + 16, -22, 3, -74, -42, 28, 40, -14, -54, -90, + -53, -45, 15, -18, 2, -3, 1, 15, -35, 5, + -1, -1, -6, -17, -14, 3, -7, -16, -7, -13, + -15, -21, 1, 2, -4, -5, 0, -5, 2, 1, + 3, -2, 3, -6, 7, 8, 6, 5, -5, -5, + -5, 9, 4, 3, 3, -3 + }, + { + 16, 148, -135, -139, -17, 26, -5, 11, 14, 9, + -66, -21, -100, 78, -16, -14, 26, 162, -54, -667, + -464, 124, 96, 52, 13, 28, 347, 211, 89, 51, + -144, -55, 8, -109, -112, -39, -100, -38, 51, 2, + 33, -74, 64, -21, -6, 10, -28, -34, 38, 90, + 36, -26, 27, -35, -29, 5, -51, 3, -26, -48, + 14, -4, -13, -17, 29, -8, -10, -4, 23, 6, + -12, 1, -6, 8, 5, -8, -16, -3, -1, -21, + 1, -17, 7, -3, -4, -1, -3, -10, 2, 2, + -2, 6, -1, -14, -3, 4 + }, + { + -2062, 3316, 1403, -369, 93, -4, 26, -5, -24, 82, + -74, 28, -96, -71, -228, 208, 89, -45, 59, 59, + -1, -62, -159, 48, -30, -69, 68, 55, 151, -15, + 61, -49, -114, -26, 51, -20, 15, 128, 46, -55, + -42, -64, 27, 19, -72, -10, 39, 9, -52, 2, + 21, 18, 16, -22, 21, -68, -17, 13, -14, -13, + 13, 19, -19, -10, -2, -23, -8, -22, -17, -6, + -8, 2, -5, -17, 5, 8, 13, -3, 2, -8, + 2, 19, 9, 1, 4, 8, 2, -8, 2, 3, + 0, 1, 6, 3, 7, 10 + }, + { + 35, 399, -118, -34, 14, 28, 36, -33, -3, -4, + -42, 27, 72, -83, -326, -306, -303, 213, -289, 273, + 352, 264, 87, 43, -83, -421, -361, 259, -90, -187, + -49, 38, 128, 54, -25, -39, -31, 40, 9, 87, + 6, -12, -70, 1, -13, -2, -11, -38, 52, 44, + -13, -24, 35, -9, -40, -18, -3, 13, 38, 24, + 1, -3, -15, -15, -1, 16, -1, -11, -33, -23, + 9, 9, 1, -14, -1, -6, -3, 11, 4, 1, + -14, 7, 16, 11, 5, -12, 4, -5, -6, 5, + -8, -2, -2, -3, 5, 4 + }, + { + -585, -9086, -958, 246, 83, 82, 89, 85, 27, -62, + 45, 109, 52, 5, -207, 7, -4, -165, -47, 135, + 0, -45, 47, 60, 118, 107, 5, 41, -47, -8, + 38, 66, 25, 62, -26, -46, -40, 53, -73, -124, + -278, -57, 76, 20, -46, -24, 13, 19, -65, -39, + -28, -5, 45, 12, 17, 8, -21, -12, -7, 18, + -32, -21, -5, 13, 13, 7, -14, -12, 12, 2, + 7, -12, -2, -4, 1, 1, 24, 5, 12, -8, + -9, 1, -4, 2, -6, -5, -11, -9, -5, -9, + 0, 3, 3, 1, -9, 3 + }, + { + -8, 527, 6, 80, 18, -22, -378, -73, 27, 73, + 57, 37, 77, -10, 40, -39, -105, -180, -243, -245, + 134, -144, -53, -161, 120, 56, 46, -224, -4, -111, + -26, 122, 27, 31, 34, 82, 27, -27, -37, 3, + 34, -62, 25, 22, -2, -26, -37, -3, -61, 0, + -18, 3, 3, -1, 14, 15, -17, -2, -2, 4, + -32, 0, 16, 30, 1, -4, -3, -17, -16, -12, + 5, -4, -7, 0, 6, 10, 4, 6, -7, 10, + 0, 4, 6, 3, -5, -1, 11, 10, 5, 2, + -2, 8, 2, 6, 0, 0 + }, + { + 134, -3698, 79, 48, -9, -200, -195, -173, 98, -98, + -35, -67, 54, -102, 165, -20, 175, -31, 29, 18, + 199, 36, -28, 23, -17, -34, 13, -110, 192, 8, + -128, -35, -20, 52, 61, 47, 103, -38, -69, -22, + 45, 19, 39, 48, 33, -26, -60, 15, -2, 14, + -11, 22, 20, 1, -18, 23, -35, -13, -5, 20, + 52, 38, 2, 41, 7, 3, 13, -7, 6, -6, + 0, 7, -2, 8, -2, 1, -20, -12, -1, 3, + -2, -1, -1, 5, -1, -6, -6, -8, -11, 4, + -1, -6, 0, 2, -1, -1 + }, + { + -43, -58, 154, -3, 34, 21, 4, 25, -2, 13, + -47, 30, 93, 840, 186, -200, -102, 41, -7, -97, + -64, -3, -49, -333, -323, -51, -202, -26, 80, 54, + 34, 22, -34, -44, -29, -41, 84, 13, 13, -51, + -39, 5, 33, 20, 29, 16, -30, 11, -38, -84, + -15, -21, 19, -23, 6, -14, 23, -1, 10, 12, + 2, -14, 10, -1, -4, 4, -14, -11, -31, -3, + -3, 1, 5, 6, 1, -3, -10, -6, -3, -6, + -4, -8, 10, 8, 1, -2, -9, 6, 4, -6, + -2, 2, 0, 2, 3, 0 + }, + { + 93, -2139, -778, -727, -257, -403, -174, 73, 55, -134, + 106, -170, -277, -875, -56, 266, 84, -60, 16, -68, + -37, -51, -20, 15, -117, -61, -87, 70, -96, -165, + -89, -39, -100, -25, 2, 101, -15, -28, -19, 43, + 95, 21, 36, 79, 25, -23, -10, -4, 46, -26, + 54, -74, -61, 4, 32, 68, -32, -23, -29, 32, + 4, 4, -7, 10, -21, -8, -16, 3, -11, -6, + 3, -1, 5, -11, -2, 8, -2, -9, -8, 9, + -13, 5, 11, 2, -7, -3, 5, 1, 10, -2, + 8, 0, -7, -12, -10, -5 + }, + { + -13, 56, -109, -20, -75, 62, 2, 13, 126, 32, + 212, 55, 14, -631, -2020, 300, -42, 25, 21, -159, + -274, -117, 109, -48, 36, -43, -199, -99, 19, -68, + -35, 80, -44, -89, -41, -8, 80, -51, 43, 52, + 15, -44, 0, 37, 28, -34, -21, -13, 3, 18, + -16, -4, 23, 14, 38, -15, -36, -5, -12, 18, + -22, -3, -1, -17, -9, -3, 7, 2, -6, -24, + -1, 19, 2, -5, 5, 18, 15, 9, -12, -9, + -4, -6, -3, 3, 5, 11, -1, -3, 2, 4, + -2, -10, 1, 5, 2, 0 + }, + { + 590, -866, -120, -320, -99, -128, -10, 103, 28, -139, + -73, -24, -61, 567, 631, 71, 92, 114, -35, -57, + 87, 76, 61, -136, 48, 68, 11, 34, 26, 42, + -55, -35, 143, 70, 45, -4, 68, 35, 43, 136, + -87, 9, 4, 27, 39, -3, -3, 1, 7, -61, + 2, -57, -62, -10, 6, -24, 0, 30, 6, -18, + 0, 17, 16, -9, -6, 4, 0, -26, 2, 10, + -15, 28, -1, -2, -5, -15, -3, 23, -5, -2, + 14, 5, -10, 0, -4, 2, -1, -10, -12, -1, + 6, 5, 5, -1, -1, 2 + } + }, + { + { + 126, -2138, -46, 360, -106, 17, 37, -42, 65, -40, + 18, -3, 18, 68, 116, -191, 214, -200, 350, 96, + 454, -181, 23, -16, 89, -134, -26, 46, -20, -44, + 33, -136, 78, 110, 174, 8, -47, -77, 19, 2, + 27, -19, 6, 4, 6, -42, 3, 20, -3, -15, + 10, 24, 44, -25, -29, 6, -9, 14, 14, -22, + 25, -16, 0, -3, -4, 0, 6, 17, -8, 3, + -2, -10, 8, -10, -1, 4, -2, 9, 2, -5, + 0, -8, -2, 1, 0, 1, -6, -1, -5, 3, + -3, -1, -3, 0, 2, 2 + }, + { + -137, 4799, -623, -165, -152, -44, 64, -34, 18, -136, + 56, 39, 58, -61, 42, -74, 7, 177, -196, -19, + 59, 0, -1, 110, 33, -9, -19, 8, -4, -75, + 26, -16, -45, -21, 77, -171, -2, 20, 11, 28, + -27, 67, 48, 29, -27, 16, -67, 43, 2, 1, + -27, -4, -35, -8, 45, -19, 4, -11, 11, -15, + 6, 8, -6, 3, 3, -8, 16, -12, 0, 0, + 21, -1, -1, 4, 7, -19, 3, 3, 4, -8, + 3, 6, -6, -6, -5, 16, 3, -6, 3, 4, + 2, 2, -4, 0, -4, 3 + }, + { + -448, 1600, 393, -645, 209, 22, -22, -29, -31, 115, + -71, 35, 152, 49, -126, 37, 135, 43, 12, 34, + -100, 88, -131, 36, -15, -97, 42, -2, 14, 7, + 113, 32, 3, 21, 11, 44, 7, 108, -4, -1, + 12, 34, 13, -17, 7, 19, 5, 13, 9, 24, + 5, 8, -19, 20, -1, 8, -34, -6, 10, 3, + -11, -28, -9, 18, 6, 12, -26, 5, 1, -15, + 8, -11, 7, 0, 1, -2, 11, -6, 2, -2, + 1, -7, -7, -1, 0, -8, 3, 4, 1, 0, + -6, -1, -2, 2, 3, -4 + }, + { + 35, 180, -10, -60, -5, -2, 2, 13, -63, 27, + 48, 9, 53, -195, 33, -31, 55, 163, -304, 136, + -53, -96, 238, 12, 90, 37, 86, -21, 19, -83, + -46, 35, 8, 21, 31, -32, 29, 21, -27, -21, + -17, -23, 44, -14, -22, 16, -27, 0, 1, -15, + -13, -3, -15, -3, -13, 13, 11, -9, -3, 0, + 2, -10, 2, 6, -4, -1, 3, -2, 1, -1, + 8, -4, 23, -10, 1, -1, -3, -2, 1, -9, + 5, -9, 4, -5, -4, 5, 1, -4, -2, 1, + 1, -1, -3, 3, -2, -1 + }, + { + 1240, -214, -274, -209, 28, 54, -5, 76, -34, 20, + -214, 125, -16, -126, -109, 210, -21, -474, -200, 164, + -7, 30, -11, 56, 56, 77, -7, 108, -61, -25, + 39, -26, 78, 76, -47, -12, 11, -20, 2, -13, + 9, -10, -5, 8, 14, -10, 26, -19, -20, 25, + -6, -56, 55, 36, -14, -14, 15, 32, -27, 8, + 6, 6, -10, -10, -1, -4, -8, 8, -2, -4, + 2, 1, 7, -4, 0, 2, 3, 5, 0, -2, + -1, -7, -1, 3, 2, 1, 5, 3, 5, 1, + -5, 3, -1, 1, -1, -3 + }, + { + 8, 131, 65, -42, -6, 14, -26, -13, -29, 33, + -17, 2, -30, 181, -82, 128, 87, 134, -180, -313, + -10, 40, -88, 5, 72, -133, 149, -141, -69, 3, + -34, -36, 41, 40, -37, 28, -48, -55, 15, -10, + 15, -52, 50, -24, 25, 26, -25, -29, -11, 30, + 2, -22, 12, -17, -17, 38, -32, 4, -3, -25, + 16, -24, 15, -3, 16, -5, 2, 1, 10, 8, + -5, 5, -9, 0, -13, -3, -1, -5, 9, -12, + 1, -4, 8, 0, -1, 2, 10, -4, 2, -2, + -3, 2, 0, -3, 0, 2 + }, + { + 905, 4651, -225, -135, 42, -31, -2, 31, -10, 42, + -63, 19, -71, 65, -95, 76, -35, -16, 45, 17, + -7, -26, -53, 48, -3, -7, -4, -46, 20, -31, + 27, -81, 23, 28, 33, -56, -54, 29, 5, -38, + -35, 36, 55, -29, -14, 2, 0, 17, 8, 15, + 14, -21, 10, 9, -3, -23, 11, -1, -3, -13, + -16, 10, -12, -6, 6, -14, 7, -2, 6, 3, + -4, 3, -3, -10, 2, -6, 0, -1, 4, 0, + 6, 2, -2, -3, 7, -7, -3, 1, 6, 3, + -5, 1, 1, 2, 2, 3 + }, + { + -27, 11, -81, 51, 0, 15, 19, -28, 20, 1, + -32, -43, -15, 17, -115, -98, -204, 229, -52, 116, + 90, -29, 111, 105, 53, 70, -129, 300, -47, 43, + 56, -37, 1, 53, -39, 66, -17, 19, -46, 32, + -12, 13, -24, 10, 17, -21, -3, 6, 21, -9, + 4, -20, 17, -23, 12, 10, -17, -1, 11, -4, + -13, -8, 7, 16, 0, 4, -17, 8, 3, 9, + 1, -7, -4, -12, 2, 9, -10, 3, -3, 2, + -7, 0, 3, -2, 2, -8, 3, -2, -4, 0, + -3, -1, 2, 0, 2, 4 + }, + { + 890, -5181, 45, 2, -119, -13, -43, 27, -50, -93, + 19, 103, 1, 98, 34, -5, 162, 26, -65, 26, + -47, -55, 49, 42, 16, 39, -24, 60, 9, 53, + -48, 28, 32, -16, -59, -33, -66, 85, 28, -22, + -73, 102, 17, -22, 1, 30, 40, 17, -46, 4, + 18, 22, 34, -17, 23, 12, -9, 10, 24, 31, + -21, -1, -5, 2, 5, 1, 0, 3, 0, 4, + 21, 5, -8, -11, 2, 9, 4, -7, 2, 3, + -6, 1, -3, 3, -2, 8, -3, -3, -1, -1, + 5, 0, 1, 0, -2, 0 + }, + { + 33, 107, -264, -93, -141, 17, -117, -14, -29, 78, + 60, 11, -21, -156, 113, -54, -91, -66, -155, -164, + 214, -146, -45, -128, 82, -31, 64, -115, 69, -54, + -28, -39, -22, -41, 15, 23, -75, 12, -2, -53, + 18, -3, 27, -7, -27, -32, -16, 23, -75, -17, + -22, 17, 12, 19, 32, 29, -15, -6, -7, 12, + -8, 2, -2, 12, 6, 1, -9, -8, 6, 11, + 0, 4, 6, -5, 2, -1, 0, 4, -2, 11, + -2, 3, -3, 5, -2, -3, 3, 0, 0, -6, + -2, -2, -4, 3, -3, -2 + }, + { + -68, -2982, 95, -152, 93, -1, 437, -52, 75, -165, + 32, -73, -19, -81, 112, 14, 2, -213, 10, -8, + 114, -39, -22, 19, 0, 7, 56, -126, 105, -12, + -10, 113, 32, 6, -25, 12, 21, -24, 57, -35, + 9, 7, 29, 53, 54, 32, -24, 20, -8, 9, + -18, 11, 18, 12, -30, 24, -8, -2, -2, 4, + 10, 5, -26, 13, -13, 0, 11, -1, 1, -8, + -5, 2, 2, -1, -6, 3, -9, 6, -4, 2, + -1, 1, 5, -1, -1, -7, -1, -3, -4, 7, + 0, 0, 2, 1, -3, 2 + }, + { + 46, -207, -15, 116, 10, 3, 52, 27, 13, -1, + -93, -33, -317, 226, 231, -27, 6, -31, 54, -11, + -72, -33, -22, -26, -83, 22, 36, 80, 108, -5, + 64, 50, 58, -48, -10, -60, 17, -59, 17, -15, + 16, -8, -12, 9, -9, 2, 19, 20, 7, 2, + 21, -8, -1, -35, 9, -12, 23, 8, 17, 1, + -13, 12, 6, 1, -10, 5, -1, -1, -2, 5, + 1, 6, 4, -4, 0, 5, -5, 4, -2, -5, + -3, -8, 7, 3, 0, 6, -2, 6, 0, -6, + 0, -1, -1, 5, 0, -1 + }, + { + 166, -1095, 369, -89, -18, -152, -4, 68, 61, -203, + 67, -6, 244, -44, -51, 76, 74, -41, 82, -54, + 78, -2, 24, 70, -65, -71, 3, 99, -71, -48, + -86, 32, -43, -60, -42, 72, 6, -38, -43, -21, + 80, 53, -51, -19, -1, -2, -22, 8, 27, -8, + 33, -38, 5, -7, 3, 10, 1, 30, 5, 21, + -2, 4, -20, -10, -1, -4, -14, 19, -12, -4, + 14, -2, -3, -15, -1, 6, 8, -5, -4, 5, + -1, 6, -2, -2, -4, 6, 5, -6, 3, -4, + 2, -3, -4, -2, -3, 1 + }, + { + 8, 76, -162, 22, -21, 36, 7, -16, 78, -4, + 107, -32, -113, 880, 300, 143, -336, -8, 13, -36, + -213, -26, 65, -39, 30, -24, -2, 38, 163, 2, + -48, 37, -36, -36, 26, 8, 72, -77, 28, 27, + 14, -25, 21, -4, 13, 25, 26, 12, -7, 19, + -14, 4, -2, 11, 48, -14, -24, 12, -17, 19, + -37, -7, -3, 0, 4, 9, 13, -6, 0, -6, + 2, 5, 4, 3, -13, -1, 19, 3, 5, 1, + -9, 0, -4, 1, 2, 6, -1, -6, 4, 0, + -4, -6, 5, 2, -3, 0 + }, + { + -152, -1551, 229, -174, -160, -66, 152, -82, -73, -24, + 9, -39, -65, -100, -567, 149, 188, 7, -80, -56, + 56, 13, 41, -99, 86, 26, -35, -64, -76, 24, + -25, -64, 11, 18, 14, -54, 19, -16, -14, 45, + -107, -4, -13, 10, 36, 40, 10, -26, -7, -24, + 1, -28, 8, 57, 7, -11, 5, -5, -5, -10, + 2, 4, 5, 4, 1, 3, -1, -19, -4, 9, + -11, 18, -14, -3, 0, -4, 0, 7, 4, 1, + 1, 2, -3, 1, -5, 2, 1, -9, 0, 4, + 0, 1, 3, -2, -2, 0 + } + }, + { + { + -57, -1468, -14, 104, 58, 33, -21, -21, -5, 64, + -28, -39, 87, 9, 28, -84, -75, 60, 212, 199, + 181, 30, 71, 100, 37, 21, -41, 9, 17, -72, + -45, 12, 129, -25, 80, -22, -22, -121, 23, 5, + 26, 13, -5, -24, 18, -1, -18, -1, 0, -27, + 31, 41, 2, -3, -16, -4, -15, 1, 3, 6, + 1, 6, 6, -7, 1, 6, 2, 4, -1, 11, + -6, -8, 0, -7, -1, 1, 2, 2, 3, -2, + -5, -3, 1, 9, 4, -4, -5, -5, 1, -2, + -3, 2, -3, -2, -1, -1 + }, + { + 235, 3096, 469, -453, -126, -39, -4, -60, -63, -43, + -69, 70, 24, -20, 18, -129, -64, -30, 234, -55, + 33, 6, -35, 32, 74, 11, -29, -30, -3, -20, + -12, 6, -7, -35, -34, -57, 57, -50, -58, -1, + 12, 32, 90, 11, 3, -9, -4, 3, -23, -1, + -12, -14, -3, 10, 22, -3, -15, 19, -5, -8, + 18, 2, 1, -2, 4, -6, 0, 7, -2, 7, + 13, -3, 2, 0, -5, -7, 2, 4, -6, -4, + 5, 3, -5, -6, 5, 5, -2, 4, 0, 5, + 2, -4, 2, -2, 0, 2 + }, + { + 429, 1507, -379, 168, -99, 38, -26, -16, -31, -1, + -45, 33, 134, -5, 34, -24, 78, -26, 41, 49, + -147, 1, -56, -40, -10, -18, 47, 5, -7, -12, + 83, 21, 103, 14, 81, -33, 79, 45, -10, -9, + -12, 48, 15, 3, 22, -22, 28, 1, 14, 34, + 7, -6, 14, -7, -3, 15, -16, -11, 11, -5, + -3, -1, 2, 10, 3, 6, -4, 1, 1, 2, + 2, -9, -1, 10, 4, -1, 1, -1, -3, -7, + 0, -1, -6, -1, 1, -4, -1, 0, -1, 1, + -4, -2, 2, 3, -1, -1 + }, + { + -26, 173, 41, -23, 1, -21, -9, -2, -20, -1, + 43, -18, 66, 65, -336, -67, 148, -13, -159, 18, + 32, -124, 109, 138, 50, -4, -13, -4, 17, -115, + -50, 66, 32, 14, -26, -16, 70, 2, -38, -36, + 0, 20, 12, -13, -39, -8, 11, -12, -11, 2, + 1, -14, 1, 9, 5, -1, 7, -19, 8, -4, + -13, 2, 11, 2, -1, 3, 2, 3, -1, 4, + -8, -4, 1, 6, 2, -3, 1, 4, 2, -3, + -3, 0, 4, -4, 1, 1, -1, 1, 3, 2, + -2, 1, 4, 3, -2, 2 + }, + { + -589, 2053, 107, -224, 39, 21, 37, 4, 18, -30, + -14, -14, -27, -153, -37, 197, -46, -372, -91, 76, + 25, 17, 6, 7, 45, 40, 86, 44, -78, -43, + -39, 25, 57, 92, -35, -21, 6, -76, 6, 3, + 0, 10, -56, 39, 5, -10, 24, 15, -33, 48, + -3, -11, 23, 29, -14, 2, 13, -8, -18, 6, + 0, 9, -8, -11, 1, -3, -5, 10, -5, 1, + 2, -3, -6, 1, 3, 1, 5, 10, 0, -3, + 0, -2, 2, 1, -6, 2, 1, 3, 4, -2, + 1, -4, -5, 0, -4, -1 + }, + { + -24, 88, 149, 13, -18, -5, -15, -1, -30, 3, + 0, -8, -6, 32, -80, 85, 54, 93, 169, -378, + -73, -58, -38, -28, 53, -167, 116, -172, -42, -14, + 41, -1, 20, 51, 0, 1, -5, -25, 22, -16, + 16, 12, 2, -12, 12, 16, -18, -45, 2, -3, + 13, -2, -25, 7, 0, 18, -8, -10, 2, -9, + -7, 1, 3, 1, 8, 2, 0, 3, 1, -1, + 3, 5, 4, 1, -14, -2, 13, 3, 5, -4, + -6, 8, -1, -2, 1, 3, 7, -1, 0, -2, + -2, -3, 2, 4, 0, -3 + }, + { + 138, 4984, 173, -17, 34, -5, -9, 39, 7, -78, + -17, 21, 43, -11, 11, -45, -29, 30, 6, -35, + -42, -21, 32, -9, 9, -5, 5, -61, -39, -34, + 9, -5, 6, 38, -23, -57, 19, -14, -51, 9, + -18, 65, -15, -21, 19, -16, 8, -7, 7, 12, + 6, -30, -19, 22, 7, 6, -4, -4, 18, 1, + -24, 3, 3, -11, -2, -3, 9, 6, 2, 3, + -3, -11, 8, 0, 0, -5, 0, 6, -4, 7, + 6, -5, 3, 1, -4, -7, -2, 6, 4, 0, + -1, 3, -1, -1, 1, 1 + }, + { + -23, -152, 148, -21, 28, 0, -2, 10, -6, 12, + -38, -48, -20, -26, -55, -135, 21, -55, 129, 19, + -13, -97, 74, 50, -37, 144, 40, 144, -8, 68, + -16, -9, -14, -3, -34, 72, -5, -7, 9, 21, + -2, -15, 0, 1, 7, -12, 15, 14, -21, 2, + 26, -20, -8, 8, 37, 8, -15, -5, -12, 5, + -2, 0, 21, 20, -2, -4, -14, 7, 13, 12, + -1, -6, -15, -2, 10, 4, -3, 5, 1, 1, + 1, -9, 0, -6, 1, -3, 2, 1, -1, -1, + 3, -2, -1, 1, -1, 2 + }, + { + -879, -2336, -271, -131, -22, 0, -46, -40, -86, 28, + 2, -47, 48, 30, 53, 26, 139, 71, -23, -63, + -48, -21, 18, 21, 28, 18, -25, 64, 84, 37, + -48, 22, 18, -33, -74, 4, -66, 74, 18, 38, + -5, 87, 5, 2, 14, 50, 11, -25, 7, -1, + 39, 11, -6, 25, -3, 11, 1, 11, 36, 10, + -1, 8, -9, 4, -13, -9, 4, 17, -9, 10, + 8, 6, -3, -6, 4, 8, -12, 7, -6, 5, + 2, -6, -5, -4, 0, 2, -1, 2, 4, 4, + 1, -2, -2, 0, 1, -1 + }, + { + -38, -4, 128, -460, -29, -13, 121, -31, -19, 43, + 102, -46, -57, -3, 131, -158, -103, -68, -111, -35, + 28, -16, -21, -15, 43, -14, -29, 35, 23, -13, + -40, -61, -30, -13, -4, 24, -37, 34, 16, -23, + -6, 52, 0, -23, -4, -26, 7, -12, -39, -24, + 10, 7, 32, 16, 9, -1, 4, 1, -4, 12, + 10, 0, -11, -8, -1, -8, -2, 8, 17, 12, + 1, 8, -3, 4, -5, -5, -3, 0, 1, 2, + -5, 2, 2, 2, 3, 1, -3, -1, -3, -2, + 2, -4, -1, 1, 0, 3 + }, + { + -58, -2547, -519, 47, 100, 79, 421, -126, -11, -80, + 17, -20, -59, 45, -73, -12, -23, -98, 67, 41, + 8, -34, 22, 18, -8, 0, 32, -39, 21, 9, + 18, 128, 45, -46, -40, 52, -53, 1, 75, 12, + 27, 10, 20, 42, 40, 28, -3, 17, 30, -11, + 4, 6, 33, -10, -12, -13, -5, 4, 15, 5, + -15, 1, -11, -17, 0, 1, 1, 2, -6, -4, + -5, 0, 2, 4, 1, 4, 2, -6, -3, 0, + -3, 7, 1, -2, 0, 0, 2, 0, 2, 0, + 2, 3, -2, -1, 0, 3 + }, + { + -35, -220, 106, 109, -61, 30, 42, -13, 29, -23, + -76, -90, -29, -237, 133, 139, 40, 9, 25, 90, + -95, -186, -35, 84, 82, -54, 67, 36, 100, 33, + 111, -23, 6, 15, -19, -20, -40, -10, 24, 0, + 18, -26, -24, 32, -9, 12, 19, 12, 17, 35, + 7, -11, -4, -9, 9, -11, -7, 2, 8, -13, + 0, 9, -2, -4, -14, 8, 3, 1, 8, 1, + 11, 6, -3, -1, 3, 6, 8, 3, -5, -4, + -3, -2, -3, -3, 1, 1, -2, -1, 0, -2, + -1, 0, 1, 1, -2, 2 + }, + { + -192, -690, 321, 330, -125, 32, 90, 66, -50, -76, + -12, 80, -120, 359, 117, -76, 13, 25, 28, 40, + 74, 21, 38, 64, -25, -23, 15, 34, -39, -20, + -22, 8, -13, -59, -17, 36, 30, -44, -31, 29, + 15, 3, -14, -47, -27, -23, -3, -21, -13, 3, + 16, 7, 8, 6, 9, 8, 20, 18, 6, 1, + 17, -16, -12, -10, 1, 2, -13, -1, -1, 9, + 2, -10, 3, -8, 0, 3, 6, 2, -4, 1, + 2, 1, -1, -1, 1, 5, -10, -4, -5, -4, + -4, -2, 2, 1, 3, 3 + }, + { + -4, -61, -19, 1, 11, 22, 51, -1, 43, -14, + 47, -8, -166, 163, 1771, -4, -277, -76, 22, 175, + -182, -78, -93, 114, 45, -60, 63, 85, 104, 39, + -87, -10, -25, -26, 13, -17, 40, -47, 16, -7, + 14, 19, 21, -10, -7, 20, 15, 27, 16, 2, + -5, 26, -7, -2, 21, -11, -13, 10, 2, -14, + 2, 3, -11, -1, 7, 9, 1, -2, 2, 10, + -8, -5, 2, 6, -8, 0, 10, -3, 7, 2, + 1, 6, -4, -4, 0, -1, -4, -4, 5, -4, + 2, 1, 2, -1, 1, 0 + }, + { + -156, -1281, -288, 150, -89, 109, 51, -102, -56, 23, + 38, -17, 37, -230, -384, 214, 126, -72, -62, 26, + -30, 21, -29, 36, 34, -34, -7, -32, -35, -37, + -46, 18, -47, 22, -53, -39, -25, -6, 29, -30, + -5, -10, -18, 0, 16, 32, 1, -29, -12, 12, + -24, 3, 32, 58, -1, 17, -15, -16, -8, -3, + -1, -6, -3, 0, 11, -14, -7, 0, -7, -2, + 3, -8, -14, 10, 2, 2, 0, -4, 12, -1, + -8, 6, 5, -3, 1, 2, 1, -4, 4, 1, + -3, 0, 1, -4, 0, 1 + } + }, + { + { + -26, -838, 256, -101, 16, -4, -33, 14, -20, 26, + -111, -51, -80, -150, 130, -126, -167, 59, 15, 85, + 88, -9, 11, 7, -33, 52, 7, -22, -23, -74, + -50, -18, 1, -62, 17, -28, 10, -113, 36, -8, + 8, -6, -16, -9, 37, 12, -19, -4, 6, -23, + 2, 7, -14, 16, -1, -3, -14, -7, 15, 11, + 1, 15, 5, -7, 2, -1, -13, -2, -3, 0, + -8, -2, 2, -4, 4, -2, -2, -1, 1, -3, + -2, 3, 5, 7, 2, -6, -3, -3, 4, -3, + 3, 2, 2, -1, -3, 0 + }, + { + -229, 1872, 225, -212, 45, 26, 2, -10, 27, 47, + -6, 71, -18, -33, 29, -81, 73, -28, 190, -74, + -16, -2, -39, 8, 46, -2, -5, -10, 36, 49, + -14, -16, 31, 16, -15, -38, 28, -22, -30, -8, + 46, 23, 25, -4, 11, -16, 16, -24, -29, 5, + -2, -1, 11, 9, 8, -12, -3, 17, -3, 5, + 13, -3, 12, 1, 2, -2, -5, 15, 0, -6, + 6, -8, -1, 0, -7, 3, 2, 1, -3, 1, + 1, -3, 2, 1, 2, -4, 3, 2, -1, 3, + -1, -4, 4, -3, 3, -1 + }, + { + -263, 1735, 642, 433, -20, -6, -10, -7, -13, -25, + 2, 3, 53, 22, -30, -150, -11, -26, -12, 24, + -171, -40, -28, 23, 31, -19, 31, -3, -39, -15, + 43, 8, 51, -47, 71, -18, 24, -24, -6, -4, + -30, 15, 27, 12, 34, 4, 38, -4, 9, 5, + -27, -1, 29, -6, -16, 6, 6, 0, 9, -17, + 12, 23, -2, -11, 0, 2, -1, -5, -2, 2, + -3, -6, 1, 8, 0, -3, -2, 3, -2, -7, + 0, 3, -1, -2, 3, 2, -2, 0, -1, -1, + 1, -1, 3, 0, -1, 2 + }, + { + 24, 166, 0, 2, 0, -15, 4, 22, -2, -19, + 5, -44, 32, -8, -293, -7, 49, 97, -103, -94, + 50, -58, -7, 23, 1, 11, 57, -24, -11, -47, + -8, 61, 0, 26, -45, -24, -10, 5, 17, -20, + 19, 13, 8, 1, -19, 10, -4, -20, 5, 5, + -4, 3, 5, 5, 11, -20, 3, -5, 10, 4, + -7, 8, -2, -6, 0, 1, -1, 7, -4, 4, + -11, -3, -4, 4, -5, -2, 7, 3, -4, -1, + -3, 2, 3, 1, 0, -2, -2, 3, 4, 0, + -1, 2, 2, 0, -1, 3 + }, + { + 36, 2616, -13, -224, 56, -15, -16, -19, -6, -10, + 117, -40, 46, -11, -15, 103, 35, -265, -52, 60, + 38, -11, -83, -68, 22, -19, 50, 14, -45, 0, + -20, -27, -16, 42, -4, 42, -1, -28, 25, -5, + 7, 14, -23, 25, -16, -7, 4, 15, -15, 36, + 8, 7, 1, -8, -24, 17, 5, -25, -15, 8, + -3, 6, 4, -9, -4, 0, -11, -1, -9, -1, + 1, -7, -7, 9, 4, -3, 2, 0, -1, -3, + -1, -2, 2, -3, -6, 3, 0, 0, -2, -2, + 4, -2, -3, 1, 1, 2 + }, + { + -1, -46, -127, -36, -6, -1, 5, 14, -15, -14, + -6, 7, -15, 115, 123, -82, -159, 12, -104, -437, + 162, -10, 91, -66, 5, -107, 82, -67, 44, 37, + 74, 0, -14, 43, 4, -20, 10, 1, 31, -21, + 43, 11, 12, 12, 2, 14, 3, -16, 15, 3, + 11, -13, -13, 23, 9, 0, -7, -5, 7, 4, + -8, 18, -2, -18, -2, 1, 3, 1, -3, -3, + 10, 5, 6, 7, 0, -2, 8, 4, 0, -3, + -2, 4, -5, -2, 3, 0, 0, -2, 0, -1, + -1, -2, 3, 1, -1, -4 + }, + { + -753, 3793, 118, -68, -7, -2, -1, -20, -39, -57, + -14, 13, 73, -64, -26, -75, -5, 27, -24, -15, + -12, 9, 18, -21, 2, -11, 24, -63, -44, -38, + 33, 55, 8, 9, -43, -31, 13, 2, -15, 33, + -5, 32, -17, 7, 21, 0, -5, 13, 7, -12, + -1, -21, -4, 17, 20, 10, -7, 1, 22, 2, + -22, 4, 12, -5, -7, -1, 9, 5, 0, 0, + -2, -9, 7, 2, 5, -1, 0, 5, -1, 4, + -3, -4, 7, 0, -9, 2, 1, 3, -1, -2, + 1, 1, 3, -1, 0, 2 + }, + { + 14, -11, 34, -51, 26, -4, 7, 5, -26, 6, + -29, -23, -3, -93, -76, -68, 115, -31, 53, -37, + 12, 57, 28, -19, -67, 80, -7, -26, -21, 62, + -22, 41, 18, -23, -34, 28, 13, -4, 6, 15, + 4, -11, 9, 7, 3, -10, 19, 5, -32, -9, + 11, -6, -20, 7, 19, -9, -11, -5, -14, 29, + 13, 13, 18, 10, 1, 6, 1, 2, 0, -1, + 5, 4, -4, 2, 3, 0, 5, 3, -1, 1, + -2, -7, 2, -1, 4, -2, 4, -1, 1, 2, + 2, 3, -1, 0, -1, 1 + }, + { + 704, -556, -276, 34, -44, -8, -13, -34, -9, 63, + -25, -75, 16, 14, 21, 13, 7, -43, -23, -15, + -17, -35, 18, 13, 6, 6, 11, 41, 67, 26, + -41, -26, -13, -1, -27, 52, -2, 32, -92, -7, + 18, 44, -19, 28, -17, 14, -9, -47, 10, -8, + 12, -10, -13, 16, -11, 2, -8, -9, 9, -3, + 15, 19, -10, 7, -5, 7, 11, 14, -5, -1, + -8, 3, 1, -5, 6, -1, -8, 14, 1, 0, + 3, -7, -4, -6, 0, -1, 0, 3, 4, 1, + -4, -2, -2, 3, 0, 0 + }, + { + 34, 77, 261, -210, 103, 107, 163, -40, -11, -12, + 9, -74, 67, 16, 133, -94, -84, -17, -96, -63, + -16, 57, -12, 10, 40, 7, -8, 31, -29, 31, + 4, -17, -22, 17, 34, 49, -10, 38, 11, 2, + -14, 17, -9, -8, 24, -30, 15, -10, -15, -8, + 23, 0, 10, -14, -16, -18, -5, -1, -2, 4, + 0, 9, -1, -2, -2, -8, 4, 13, 9, -2, + 2, -1, -10, 6, -5, 0, -6, -2, -1, -2, + -4, 1, 3, -1, 3, -1, -2, 2, -1, 3, + 1, 0, 1, 2, 1, 2 + }, + { + 193, -1851, 92, 220, 61, -145, -98, -159, 20, 10, + 6, 4, -32, 50, -39, -66, -94, -85, 47, 11, + -14, -1, -15, 10, 10, 8, 36, -20, 26, 16, + -19, 41, -16, -31, -13, 14, -43, -25, 7, 21, + 19, -23, 7, 5, 8, 1, -26, 9, 30, -14, + 9, 0, 17, -15, -3, -25, -2, 17, 11, -5, + -20, 3, 0, -6, 13, 2, 0, -4, -6, -1, + -1, 1, 5, 6, -3, 1, 4, -8, -2, -1, + 3, 6, -3, 5, -1, 3, 0, 2, 2, -2, + 2, 1, -4, 0, 2, 1 + }, + { + 23, -299, -85, 50, -1, -6, -5, -23, 18, -13, + -36, -49, 90, -151, -106, 95, 35, 10, -35, 29, + -9, -96, -17, 27, 70, 17, 7, -63, 0, 5, + 12, -49, -32, 65, -19, -1, -14, 28, 13, -1, + 8, -12, 4, 19, -15, 16, 7, 6, -3, 17, + -2, -6, 14, 0, 6, -7, -9, 0, 17, -11, + 15, 4, -4, -6, -7, 17, 4, 6, 1, -3, + 10, 3, -4, -2, -2, 1, 3, -5, -3, -4, + -2, 1, -4, -5, 1, -3, -3, 0, 2, 0, + -1, 2, 1, -2, -2, 2 + }, + { + 144, -508, -90, 44, -86, 112, -28, 14, -35, 16, + -29, 36, -46, 299, 63, -61, 55, -14, -77, 63, + 18, -19, -7, 37, -13, 73, -10, 2, 25, -1, + -18, 7, 50, -4, 10, 35, 34, -21, 5, 19, + -31, -17, 23, -9, -5, -17, 12, -31, 2, -14, + -4, 4, 7, 21, -3, -2, -6, -2, -1, 4, + 10, -13, -1, -3, -4, 2, -6, -4, 9, 9, + -8, -4, 9, -5, 1, 3, 3, 6, 0, 2, + -5, 1, 5, 0, -3, -3, -11, 1, -3, 0, + -1, 0, 4, -2, 3, 0 + }, + { + 17, -46, 37, -16, -13, -17, -3, -25, 14, -70, + 16, -19, -85, -391, 592, -150, -99, 0, 83, 172, + -66, 40, -54, 85, 13, 19, 85, 24, -85, 31, + -18, 14, 20, -10, -24, -34, 3, -33, 24, -22, + 36, 9, -15, -16, -13, -12, -3, -4, 3, -15, + -2, 17, -11, -5, 10, -13, -1, 16, 15, -8, + 16, 1, -5, -3, 4, -6, -6, 3, 3, 7, + -6, 3, 3, 5, -2, 5, 0, 2, -2, 0, + 5, 0, 1, -2, -4, -1, -1, 3, 2, -3, + 4, -1, -2, 0, 2, -2 + }, + { + 254, -463, 9, 300, -17, 64, -68, -36, 26, 21, + 86, 13, -12, 92, 199, 130, -28, -16, -25, -5, + -83, 55, -15, 42, 23, -45, 52, 78, 9, -37, + -22, 29, -46, 13, -42, 23, 19, 15, 40, 9, + 71, 12, -20, 13, 16, -1, 13, 11, 11, 21, + -20, -3, 9, 15, -15, 7, -10, -8, -20, -3, + 0, -13, -6, -1, 11, -13, -1, 4, -2, 0, + 3, -3, -3, 5, -2, 1, -2, -2, 6, -6, + -3, 6, 2, -1, 3, 3, 1, 1, 0, -1, + 0, 0, 1, -1, 1, 0 + } + }, + { + { + 44, -254, -388, -74, 8, -25, -3, 10, -9, -57, + -93, -47, -117, -78, 86, -88, 10, -77, -43, 99, + 60, -43, -81, -69, -43, 42, 77, -20, -25, -55, + -53, -15, -124, 30, -9, 15, 3, -58, 54, -37, + 14, -38, 13, -19, 32, 16, 5, 19, 8, -17, + -22, 7, -9, 4, -4, -5, 1, -4, 30, -4, + 2, 1, 1, 1, -1, -10, -9, 0, -7, -6, + -8, -1, 3, 1, 1, 3, 0, 1, -4, -2, + -2, 4, -1, -1, -2, -2, 3, -2, 0, 1, + 4, -1, 1, 1, 0, 2 + }, + { + 174, 2447, -605, -19, 41, 3, 30, 74, 54, 43, + 41, 12, 9, -23, 15, 47, 98, 44, -18, -1, + -33, 22, -12, -24, 23, 8, 19, 12, 27, 18, + 9, -1, 37, 35, -16, -57, 15, 12, 13, 22, + 44, 14, -27, -6, 8, -7, 16, -9, -7, -11, + 1, 5, -5, -3, 5, -4, 1, -14, 5, 5, + -1, -3, 9, 0, 8, 3, 5, 4, -8, -1, + 0, -2, 5, -3, -3, 7, -5, 2, 7, -1, + -1, -2, 2, 0, -3, 0, 4, -3, 1, 0, + 1, -1, 0, -1, 1, -1 + }, + { + 145, 2505, -203, 229, -166, -5, 10, -7, 9, 1, + 26, 22, -30, 59, -33, -83, -99, 21, -11, -48, + -20, -39, -13, 17, -3, -38, 22, 32, 7, -22, + -51, 53, -17, -4, 53, -3, -8, 13, -26, 5, + -24, -3, 47, -11, 10, 40, 38, -7, -2, -16, + -12, 14, 18, -16, 15, -18, 2, -6, 1, 0, + 6, 6, -2, -11, -8, 0, -8, -6, 0, -5, + -8, -2, -1, -2, 4, -3, -1, 0, 5, -2, + -1, -1, 0, -3, 0, 5, -1, 2, 1, 2, + 0, -2, 0, -1, 0, 1 + }, + { + -29, 188, 38, -1, -16, 7, 3, 15, 9, -11, + -3, -14, 18, -79, 7, -88, -31, 93, -17, -89, + 56, 32, -29, 19, -31, 4, 140, -50, -45, 73, + -27, -4, -1, 30, -29, -4, -41, 16, 10, -10, + 18, -6, 18, 12, 3, 7, -31, -8, 0, -11, + 4, 9, -11, 0, 2, -20, 6, 6, -3, 15, + 4, -7, -4, -1, -4, -4, 0, 5, -7, -2, + 1, 4, 2, -8, 0, -3, 0, -1, -8, 1, + 1, -1, -1, 1, -2, 2, 0, -1, -1, -1, + 2, 0, -3, -2, 1, -2 + }, + { + 300, 2061, 83, -155, 7, -5, -39, -35, 24, 14, + 28, -33, 79, 19, -4, 49, -93, -165, 30, 27, + 50, -5, -52, -35, 23, -16, -4, 26, 14, 1, + -3, -30, -19, -6, 22, 72, -21, 38, 5, -6, + 33, -3, 22, -23, 6, -13, -8, -2, 2, 11, + 7, 10, -6, -13, 4, 2, -4, -18, 10, -4, + -1, 13, 4, -8, -4, -8, -3, -4, -6, -6, + 0, 0, 4, 9, -2, -2, -4, -8, 2, -4, + -1, -2, 0, -5, 3, 2, -3, 2, 0, 0, + 2, 1, 1, 2, 3, 1 + }, + { + 16, -281, -33, -22, 3, 6, 4, -1, -14, -17, + 12, 6, 4, 119, 366, -187, -136, -42, -27, -291, + -89, 46, 46, -114, 42, 47, -48, 80, -38, 27, + 39, 34, -17, -14, 11, -8, -19, -5, 17, 5, + 4, 12, 24, 22, -14, 6, 11, 12, 17, 9, + -10, -13, -4, 23, 6, -9, -4, -2, 5, 4, + -7, 14, -5, -13, -6, -5, 6, 4, -1, 3, + 9, -1, 6, 4, 2, -5, -2, -3, -1, 2, + -1, -3, 1, -2, 3, 0, -1, 0, -3, -1, + 3, 1, -1, -2, -3, -1 + }, + { + 844, 2099, -319, -34, 5, -10, 8, -37, -39, 7, + -32, 7, 18, -38, -49, -63, 31, -32, 5, 17, + 37, 13, -24, 17, -14, 7, -9, -48, -9, -11, + 35, 22, 10, -13, -34, 5, -17, 16, -12, 24, + 18, -5, 11, 18, 2, 6, 13, 33, -11, 1, + 5, -6, 18, -2, 15, -1, -13, 9, -2, -6, + -6, 1, 3, -1, -2, -1, -8, 7, 4, -8, + 3, 5, -4, -2, 1, 2, -1, 0, 3, -2, + -2, 0, 1, -4, 1, 2, -1, 0, 1, 1, + -2, 0, 1, 2, 3, 3 + }, + { + 20, 45, -158, 15, 1, 10, 10, 0, -8, -18, + 9, -10, 36, 19, 5, -110, -32, 57, 10, -27, + 123, 66, 30, 51, -5, 36, -62, -1, -37, 26, + 12, 50, 50, -46, 12, -3, 8, -3, -10, 7, + 9, 6, -14, 19, 6, -7, -5, -6, 5, -21, + -10, -5, -7, -7, -3, -14, -22, -3, 10, 13, + 13, 7, 7, 6, 4, 15, 3, -5, -3, -5, + 5, 5, 3, -1, -5, 0, 2, -2, -3, -3, + -1, 0, 1, 4, 2, -2, 2, -1, 0, 0, + -1, 4, 0, 1, 1, 0 + }, + { + -437, 380, 317, 62, -63, -30, 6, 5, 20, -17, + 14, 39, 40, -60, 10, 35, -89, -9, -7, 3, + -22, -16, 15, 9, 26, -19, 15, 33, 56, -26, + -12, -28, -6, -11, 25, -19, 56, 30, -91, -37, + 43, -36, -22, 2, -2, -11, -23, -36, 13, 13, + -13, -13, 10, -4, -4, -6, -4, -11, -10, 7, + 24, 7, 0, 5, 11, 17, 8, 2, -2, -7, + -1, 5, -3, -10, -2, 3, 7, 3, 5, -2, + 1, -1, -1, -1, 3, 0, -2, 1, 1, -1, + -3, -1, 1, 1, -2, 1 + }, + { + -26, 273, -80, 199, 31, 9, 54, 35, 12, -17, + -72, 10, 54, 37, 35, -37, -42, -61, -141, -73, + 63, 29, -34, -13, -3, 21, 22, -26, -36, 39, + 7, -9, 13, -27, 29, 62, -3, -23, 3, -15, + -3, -23, -4, 2, 11, -19, -3, -11, 8, -10, + 6, -20, 1, -13, -3, -3, -12, 2, -7, -9, + -3, 3, 14, 9, 2, 5, -3, 4, -6, -8, + 6, -3, -3, -2, -2, 2, -1, 1, -1, 1, + 1, 2, -1, -3, 0, -2, 1, 3, 0, 0, + -3, 2, 0, 0, -1, -2 + }, + { + -263, -1307, 437, 108, 9, 99, -535, 18, -46, 44, + 1, -9, -1, -74, 84, -83, -103, -89, -34, 39, + 21, -4, 0, -15, 13, 13, 4, 9, 14, 4, + -39, 2, 5, -17, 3, -23, -6, -33, 0, -4, + -34, -19, 23, -5, 5, -10, -1, -14, 6, 1, + 2, 11, -14, -3, 12, -15, 12, 1, -6, -2, + -4, 0, 0, 5, 10, 0, 3, -2, -1, -2, + 0, 4, 7, -5, -5, -4, -1, -3, 2, -2, + 6, -1, 1, 4, -2, -1, -4, 1, -1, 3, + 1, -1, -1, 2, 1, -2 + }, + { + -14, -346, 30, -22, 22, -18, 8, 4, 5, -3, + -32, -35, -105, 202, -184, 67, 68, -61, -85, -19, + 54, 42, -48, -24, -19, 78, 19, -87, -14, -3, + -59, 24, -16, 61, -17, -4, -10, 18, -18, -10, + 7, 14, 0, -3, -3, -2, 20, 9, -22, -6, + 7, -2, 10, -7, 6, 8, 1, 19, 12, 4, + 9, -5, 6, -2, 9, 7, 4, 3, -2, 0, + 2, 0, -3, -4, -5, -4, -4, -7, 0, 0, + -1, -1, 1, 0, 1, -1, 3, 3, 1, 0, + -1, 0, 0, 0, 1, -2 + }, + { + -76, -54, -175, -199, 10, -46, -173, 45, 49, 19, + -50, -3, 148, 62, 5, 31, 65, -38, -67, -17, + 17, -8, -15, 3, -24, 36, 10, -4, -28, 10, + 4, -8, 17, 28, 16, 22, 3, -4, 23, -3, + -12, 10, -12, 44, 4, 7, 6, 9, 8, -17, + -7, -3, -17, 11, -12, -6, -4, -3, 7, 4, + -6, -1, 6, -10, -2, -3, 5, 1, 7, -1, + -2, 6, 2, -1, -4, 6, 2, -1, 4, -2, + -2, 5, 4, 1, -8, -5, 2, 5, 0, 2, + 1, 2, -1, -3, -2, -4 + }, + { + -27, 76, 3, -46, 2, -28, -37, -7, -14, -31, + -26, -39, 43, -49, -527, 17, -10, 39, 44, 48, + 19, 12, -16, 47, 17, 56, 28, 4, -126, 38, + 33, 46, -2, 20, -11, -17, -14, 4, -3, 15, + 20, -29, -5, -3, -17, -11, 10, -20, -7, -20, + 1, -5, -1, 3, 6, -1, 8, 6, 3, 17, + -2, -13, 3, -2, -4, -1, 1, -3, 0, 1, + -3, 12, 2, 1, -1, 4, 1, 10, -4, -3, + -1, -4, 3, 0, 0, 4, 2, 1, -3, 2, + -3, -4, -2, 3, 0, -2 + }, + { + -165, 283, 56, 71, 36, -95, -67, -29, 31, 50, + -12, 66, -73, 23, 377, 12, -150, 111, -85, -22, + -18, 35, 18, 4, 28, -2, 79, 41, -2, -25, + -20, 0, -10, -35, 31, 35, 56, 5, 17, 30, + 33, 11, -5, 17, 13, 6, 40, 11, 7, 1, + -13, -4, -11, -8, -10, -6, 0, -5, -15, 2, + -4, -3, -2, 8, 4, 2, 1, -1, -3, 3, + 0, 4, 8, -9, -3, -2, 3, 1, -1, -3, + 5, -1, 0, 2, 0, 0, 2, -2, -5, 3, + 1, 2, 1, 1, 1, -2 + } + }, + { + { + -28, 303, 183, 17, -35, -14, 10, 5, 4, -40, + 15, 28, 68, 47, -58, -47, 161, -39, -29, 81, + -4, -114, -4, -26, -32, 8, 14, -12, 1, -37, + -22, 18, -47, 66, -2, -11, 7, -58, -7, -40, + 16, -19, 50, -13, 19, 13, 12, 19, 17, -6, + -27, 6, -8, -13, 0, 5, 3, 2, 10, -14, + 0, -11, 4, 7, 2, -3, 3, 5, -8, 4, + 0, -1, 3, 4, -2, 2, 1, 0, -1, 2, + -4, -2, -4, -2, -1, 3, 4, -1, 0, 3, + 0, -1, -1, 3, 2, 2 + }, + { + -225, 3725, 555, -49, 55, -23, 46, 44, -20, -2, + 2, -38, 13, 23, 56, 102, 60, 36, -21, 6, + -14, 15, -7, -26, 2, 11, 16, 11, -15, -13, + 43, 18, 34, 36, 0, -35, 33, 14, 17, 13, + 13, -1, -16, -9, 5, 0, 5, 17, -2, -20, + 10, 6, -8, -3, 7, 1, -8, -13, 4, -6, + -8, -4, 3, -3, 9, -5, -2, -5, -3, 7, + -1, 1, 1, -2, 5, 0, -4, 2, 4, -2, + -2, 0, 0, -3, -2, 5, -1, -1, -1, -1, + 3, 1, -1, 1, -1, 0 + }, + { + -131, 2709, 26, 62, -121, 23, 1, 4, 20, 1, + -36, -15, -30, 60, -1, -16, -89, 15, 11, -1, + 68, -20, -24, -42, -7, -25, 35, 24, 26, -2, + -56, -2, -38, -17, -7, 4, 5, 28, 2, 3, + -25, 9, 35, -17, -11, 32, 20, -16, -10, -18, + 4, 8, 7, -10, 33, -16, -8, 8, 9, 1, + -8, -8, 3, 0, -8, -1, -8, 3, -2, -7, + -4, 2, 1, -2, 4, -3, 2, -2, 5, -2, + -4, -4, 0, 1, 0, 3, 0, 1, 0, 2, + -2, 0, -1, 0, 1, -1 + }, + { + 25, 178, -44, -6, -1, 11, -4, -2, 2, -2, + 16, 1, 16, 50, 298, 16, -25, 62, 29, -62, + 28, 9, 34, 66, 9, 56, 115, -13, 9, 69, + -42, -26, -20, 2, -9, 18, 22, 7, -12, -3, + -4, -19, 6, 18, 5, -5, -25, 13, 2, -15, + -1, -15, -11, -4, -1, -4, 1, -4, 0, 5, + -3, -10, -2, -3, -2, -1, -1, -3, -6, 0, + 7, 3, 2, -6, 9, -1, -3, 0, -2, 2, + 3, -2, 0, -2, -1, 2, -1, -1, -3, 1, + 2, -2, -3, 0, -1, -2 + }, + { + -412, 972, -116, -140, 18, 0, 3, 5, 40, -22, + -67, -17, 28, -8, -38, 7, 12, -54, -6, 21, + 18, -11, 33, 36, 1, 3, -21, 13, 44, 29, + -8, -17, -21, -14, -3, 28, -22, 10, -13, 4, + 22, -17, 12, -19, 12, -22, -8, -9, -16, -5, + -5, 6, 6, -7, 4, -5, 3, -6, 11, -2, + 11, 13, -1, 1, 3, -6, -2, 3, 1, -2, + 3, 2, 6, 0, -5, 2, -3, -3, 1, -3, + 3, 0, 1, 0, 1, 0, 0, 2, 2, 1, + 1, 1, 1, 1, -1, -1 + }, + { + 8, -256, 124, 8, 5, 1, -10, -3, -9, 3, + 26, 8, 1, 49, 284, -100, 3, 7, -64, -126, + 17, -1, -15, -78, 71, 28, -84, 60, -53, -2, + -27, -18, 1, -1, 13, 1, -2, 5, 25, 14, + -7, 29, 8, -8, -21, 1, 12, 17, -7, -5, + -8, -1, -1, 9, -8, 1, 9, 6, 2, 1, + -4, -1, 0, -2, -2, -3, -1, 2, 1, 5, + 3, -2, 4, -1, -4, -4, -1, -5, 1, 6, + -2, -1, 2, -3, 1, 0, 0, 0, 0, 0, + 3, -1, -2, 0, 0, 2 + }, + { + -574, 846, 321, 24, -33, 3, -2, -1, -5, 36, + 7, 4, -11, -2, -12, -2, 37, -24, 27, -9, + 27, 3, -21, 19, -5, -3, -13, -12, 11, 18, + 6, -28, -6, -10, -2, 25, -17, 18, 1, 11, + 19, -7, 18, 24, -2, -14, 16, 19, -15, 13, + 9, -4, 12, -4, -4, -6, -3, 5, -10, -1, + 7, 7, 2, -3, -3, -5, -9, 8, 5, -5, + 5, 5, -9, -2, -1, 1, -1, -1, 2, -3, + 2, 0, -2, -3, 6, -3, -1, 1, 2, 1, + -4, 2, -1, 2, 1, 0 + }, + { + -5, -46, -56, 47, 4, 5, -5, 9, 15, 0, + 30, -1, 13, -8, 266, 165, -56, -37, -3, -67, + 60, 22, 40, -3, -138, -2, -72, -13, -66, 20, + 12, 19, 14, -31, 11, -1, 3, -5, -34, -6, + -11, 7, -10, 10, 1, -13, -15, 1, 14, -14, + -10, -19, 7, -11, 0, -5, -8, 12, 13, -8, + 0, 0, 5, 2, 0, 9, -2, -2, 0, -3, + -2, -1, 3, -2, -5, 2, -4, -5, -1, -1, + 6, 1, -2, 1, 0, 0, -1, 2, 0, -3, + 0, 1, 1, 2, 0, 0 + }, + { + 178, 604, -221, 41, -40, -13, 19, 44, -6, -35, + 52, 49, 2, -109, -12, 5, -33, 49, 11, 2, + -12, 16, 2, -16, 3, -23, 4, -11, 15, 0, + 33, 17, 17, -18, 5, -51, 4, 20, -29, -6, + 43, -22, -20, -18, 1, -9, 2, 13, 3, -9, + -12, 4, 24, 1, -3, 0, -4, -6, -7, 3, + 6, -4, 1, 5, 12, 3, -9, -4, -5, -5, + 2, 4, -3, -6, -7, 7, 5, -5, 2, 0, + -1, 4, 3, 4, 4, 3, -3, -2, -1, 1, + 3, 0, 1, 0, 0, 1 + }, + { + 17, 314, -130, 258, -17, -81, 25, 3, -8, 12, + -28, 35, -30, 15, 80, 22, -55, -62, -58, -3, + 104, 0, -47, -24, -3, 25, 31, -35, -32, 19, + 17, -14, 18, -27, 27, 40, -21, -18, 16, -22, + 1, -24, 7, 13, 6, 4, 0, 1, 10, -15, + -2, -13, -7, -5, 14, 3, -9, 4, -4, -4, + 2, -1, 7, -2, 2, 7, -7, 1, -4, -5, + 2, 2, 4, -3, -1, 2, 1, 1, 0, 2, + 0, 0, -4, -3, -1, 0, 2, 0, -2, -3, + -1, -1, -1, 1, 0, -1 + }, + { + 268, -715, 120, -200, -129, 191, -230, 118, -24, 18, + 7, -16, 1, -50, 109, -99, -82, -14, -16, 20, + 59, -2, 19, -30, 5, 9, -10, -7, -4, -11, + -39, 18, 6, -20, 8, 7, 13, -8, 6, -57, + -36, 12, 15, -5, -1, -5, 12, -23, -5, 14, + 4, 1, -10, 10, 12, -7, 16, -7, 2, 3, + 0, 3, 2, 3, 0, 1, 3, 0, -1, 3, + 1, -1, 3, -6, 1, -3, 0, 1, 2, -1, + 0, -3, 2, -2, 0, -3, -1, -1, -1, 3, + -2, 0, 3, 0, -2, 0 + }, + { + 8, -316, 37, -4, 9, -5, 18, 0, 2, 1, + 5, -17, -96, 259, -37, 32, -8, -65, -17, 47, + 57, 42, -12, 0, 19, 97, 56, -48, 3, -50, + -12, 37, 11, 18, -19, -19, -21, 20, 3, -15, + 15, 15, -14, -7, 4, -8, 17, 0, -23, -9, + 5, -8, 1, -7, 8, 6, 2, 19, 0, 1, + -8, -5, 4, 2, 2, -6, 5, -5, 1, 4, + -1, -5, -5, -3, -3, -2, -2, 0, 2, 2, + 0, 0, 3, 2, 0, 2, 3, 0, -1, 1, + 0, -1, -1, 2, 2, -3 + }, + { + 5, 199, 6, -81, -1, -59, -103, 60, 41, 1, + -14, 10, -22, -160, -21, 50, 48, 9, -10, -53, + 38, 7, 4, 2, -49, -17, 11, 9, -4, 11, + -16, -2, 11, 8, -12, 8, 1, -14, 1, -13, + 1, 25, -35, 24, -12, 7, -15, 15, 0, 0, + -6, -6, -14, -4, -4, -7, 5, 8, 13, -5, + -8, 6, 13, -9, 2, -1, 6, 1, -5, 0, + 7, 4, -5, 1, -3, 4, 2, -4, 2, -2, + 2, 2, -2, 0, -3, 2, 5, 3, 0, 1, + 0, 0, -4, -1, -3, -3 + }, + { + 16, 76, -101, -41, 23, 2, -10, 6, -6, 9, + 6, -2, 6, 400, 111, 25, 7, 74, 52, -40, + -14, 24, -1, 13, 54, 52, -18, 9, -14, 41, + -11, 18, -27, 2, 11, 4, -8, 3, -15, 13, + 1, -37, -1, 15, 4, 6, 8, 0, 4, -2, + 5, 0, 6, 6, 2, -3, 7, 0, -7, 14, + -14, -9, 2, 1, -3, 10, 4, -3, 1, 2, + 1, 8, -4, -1, -2, 0, 4, 1, 0, -3, + -3, -1, 2, 2, 2, 2, 0, -2, 1, 1, + -5, -1, 1, 0, -2, 0 + }, + { + 9, 497, -126, -148, -20, -67, 39, -10, 16, 14, + -137, 50, -15, -129, 17, -37, -78, 80, -80, 21, + 6, 23, 11, -20, 31, -5, 31, -16, -5, 16, + -21, -15, -7, -26, 29, 7, 41, -15, 10, 25, + -12, 2, 18, 23, -1, 0, 9, -23, -17, 1, + -11, 0, -2, 7, -7, -2, 3, -2, 2, 8, + -4, 2, 2, 10, 2, 7, -1, -2, -5, 2, + 0, -1, 3, -7, 3, -1, 4, 0, -2, 1, + 3, -5, 2, 2, -2, -3, 0, -3, -1, 2, + -1, 1, -1, -1, 1, -1 + } + }, + { + { + 33, 542, 45, 19, -20, -5, -9, 1, 5, -20, + 65, 15, 119, 63, -206, 44, 61, 36, 57, -24, + -19, 11, 28, 1, -16, -12, -28, 9, 18, -12, + -19, 13, 66, -10, -9, -11, -12, -68, -59, -36, + 25, 16, 5, 9, 16, 14, -3, 12, -5, 6, + -1, -1, -3, -8, 5, 1, -11, 2, -11, 2, + 1, -2, 9, 8, 2, 5, 5, -4, 5, 9, + 0, -6, 1, 2, 1, 0, -3, 1, 3, 2, + -5, -3, 2, 4, 3, 0, 0, 0, 1, 0, + 0, 0, -2, 2, 0, -2 + }, + { + 318, 3726, -26, -43, -70, -5, 19, -36, -53, -13, + -10, -26, -16, 69, 68, -4, 8, 9, 71, -7, + -2, -16, -25, -14, -3, 38, -40, -2, -10, 5, + 29, 60, 5, -11, 13, 4, 31, -30, 14, -17, + -9, 5, 23, 0, 2, 1, -3, 1, -18, 2, + 3, 6, 8, 0, 7, -3, -4, 1, -3, -1, + 0, 2, -4, 1, -4, -6, -1, -3, 7, 4, + -1, -2, -5, 2, 1, -4, 2, -3, -2, -2, + 3, 1, -4, -1, 4, -2, -2, 4, -2, -1, + 0, 1, 2, 1, -1, 0 + }, + { + 113, 2012, 140, 123, 99, -1, 14, -1, 7, -22, + -42, -44, -22, -98, 83, 25, -57, -19, 1, 31, + 0, -14, 7, -66, 15, 17, 28, -15, 13, 2, + -23, -36, 18, -3, -52, 7, 7, 39, -11, 1, + -20, 15, 29, 6, 7, 11, -20, 4, -1, -3, + 3, -6, -2, 9, 5, 5, -2, 14, 4, -2, + -4, 4, 13, 0, 0, -1, -1, -3, 0, 3, + 0, -2, 3, 3, 3, -2, 3, -1, -2, -3, + -4, -1, 2, 2, -3, 0, -1, -3, 1, -2, + 0, 2, 1, 1, 1, -2 + }, + { + -19, 107, 28, 13, 15, -6, 2, -8, -4, -3, + 18, 11, -18, 27, 294, 91, -73, -24, 15, -8, + -22, 4, 61, 33, 64, 55, 28, 36, 1, 65, + -61, -61, 35, -19, -19, -14, 86, -16, 0, 0, + -7, 5, -9, 11, -19, 6, -4, 3, 10, 3, + -14, -21, 1, -5, 7, 6, -9, -7, 4, -4, + -5, -7, -1, -3, 3, 5, -1, -6, 4, 3, + -5, -5, 0, 4, 3, 2, 2, 3, 5, -1, + 1, 1, 1, -1, 1, -2, -2, 2, 1, 2, + 0, 0, 3, 2, -1, 1 + }, + { + 311, -55, -134, -86, -7, 9, 24, 8, 13, -47, + -37, 25, -36, 9, -38, -14, -16, -26, 27, -1, + 3, -5, 28, 22, -26, 19, 13, -8, 37, 21, + -26, 8, -37, 7, -2, 10, -49, -36, -8, 18, + -14, -6, 2, 9, -20, -3, 4, -16, -6, -8, + 6, 5, 14, -5, -8, 0, -2, -8, -9, 2, + 11, 9, -1, 2, 3, 0, -2, -1, 1, 7, + 1, -4, -3, -3, 0, 1, 2, 2, 0, 1, + 2, 4, 1, 1, -3, -2, 3, 0, -2, 0, + 1, -1, 0, -2, -3, 0 + }, + { + -21, -5, 54, -15, 2, -5, -2, -1, -5, 14, + 2, -5, -4, -34, 142, -23, 48, -41, 49, -14, + -60, -69, -10, 20, -34, 16, -44, 25, -67, -67, + 39, -23, 14, 21, 39, -4, 16, 34, 19, -7, + 10, 28, -3, -6, 2, 4, 0, 10, -18, -11, + 1, 12, -8, -1, -1, 3, 5, 7, -1, 1, + -4, -3, 1, 0, -1, -1, -2, -5, 0, -1, + 3, 7, 3, 0, -2, 0, 4, 3, 5, 0, + 0, 1, 0, -3, -1, 1, 0, 0, 1, 2, + -1, -3, 1, 2, 1, 0 + }, + { + 202, 284, -36, -15, 3, 11, -3, 14, 14, -11, + 21, -8, 6, 32, -50, 23, 31, 13, 0, -40, + -12, 10, -4, -7, 5, -29, 6, -1, -14, 2, + -4, 3, -15, 12, 14, 10, 10, -8, -13, 21, + 8, 9, 9, 0, 20, -24, 7, -9, 11, 5, + -4, -1, -11, 1, -3, 3, 8, 0, 7, 5, + 11, 2, 6, -4, -4, -2, 5, 2, 1, 0, + 1, -5, 0, 5, -2, -2, 1, 2, -1, 1, + 2, -3, 1, 2, -1, -3, 4, 3, -1, -3, + 0, 3, -1, 0, -1, 0 + }, + { + -22, -18, 74, 14, 10, -7, -6, 11, 13, 7, + -3, -13, -44, 65, 390, 42, -55, -133, 13, -17, + -82, -12, 20, -44, -127, -29, -28, -28, -51, -14, + 2, -5, -19, -1, -17, 12, 2, 7, -27, -4, + -11, -1, 8, -7, -6, -8, 14, -5, -13, 2, + 0, -17, 2, 1, 8, 2, 13, 15, -8, -3, + 3, 8, 8, 1, 3, -4, -1, 2, 3, -1, + 0, -2, -2, 1, -1, 1, -1, 1, 1, 3, + 3, -3, -3, -2, 1, 2, 1, 3, -2, 0, + 2, -2, 1, 0, 1, 0 + }, + { + -76, 281, 224, -1, -14, 10, 5, 14, -29, 28, + 11, -17, -26, -98, -24, -3, 48, 25, 14, -8, + 0, 12, -15, -11, -18, -4, 9, -1, -1, 27, + 39, 35, -9, -17, -20, -7, -29, -7, 38, 22, + -3, 24, -19, -12, -5, 6, 14, 26, -5, -20, + -2, 12, 2, 18, -5, 0, -7, -1, -4, 0, + -3, -3, 4, 2, -1, -8, -4, -1, -9, 0, + -1, 0, -1, 2, 1, 2, -1, -1, 0, 1, + -3, 2, 0, 2, -2, 0, 1, 1, 2, 4, + 1, 0, -2, 1, 3, -1 + }, + { + -13, 201, 85, 115, -28, 8, 38, -17, -8, 34, + 2, -7, -67, 42, 37, 26, -55, -21, 24, 39, + 35, -25, 8, -6, 29, 18, 4, 7, -9, 6, + 14, -44, 34, 17, -4, 24, 7, 18, 28, -15, + -2, -1, 14, -2, 10, 29, -6, 10, -10, -1, + 8, 4, -6, 5, -10, -11, 2, 5, 3, 8, + 2, -4, -4, -10, -2, -6, 0, 6, 7, 3, + 0, 3, 0, -3, 2, -2, -1, -1, -3, -1, + -4, 0, -1, 0, 1, 2, 0, -1, -2, -1, + 1, -1, 1, 1, 2, 2 + }, + { + -254, -283, -1, -97, -38, -43, 265, -21, -28, 4, + 12, -14, -1, 58, -14, -80, 2, 12, -22, 24, + 5, 16, 35, -11, 6, -9, 2, -31, -3, -9, + 10, 12, -5, -15, 8, 3, 1, 19, -5, -41, + 7, 27, -11, 1, -28, 6, 6, 0, 0, -2, + 17, -2, 11, 1, -1, -4, -3, 8, 9, -2, + -1, 6, 0, -5, 2, 2, -2, 1, -2, 2, + -1, -1, 1, 5, 3, 4, 0, -1, -2, 1, + -4, 1, -1, -2, 2, 0, 2, 1, 2, -1, + -1, 1, 1, -2, -1, 2 + }, + { + -2, -232, -23, 17, -3, 15, -13, -12, 9, -6, + 15, -30, 85, -31, 67, -15, -19, 3, 35, 30, + 16, 25, 9, 35, 100, 43, 6, 9, -59, -11, + 45, -30, 17, -19, 16, -24, -18, 14, 32, 0, + -1, -2, -1, 6, 8, -4, -1, -7, -5, 11, + 4, -10, -5, 6, 7, -2, -5, -7, -8, -4, + -6, 2, -1, -5, -9, -1, 5, -6, 5, 4, + 1, -1, -2, -1, -1, 5, 3, 1, 2, -1, + 0, 2, -3, -2, -1, -1, -1, -2, -1, 1, + 0, 1, 1, 0, 0, 1 + }, + { + 13, 25, 145, 61, -52, 20, 54, -7, 0, 42, + 31, 20, -40, -145, 1, -33, 16, 58, -17, 3, + 41, -6, 9, -1, -17, -15, 23, 19, 19, 21, + 10, -3, 1, -2, -14, 18, 15, -19, 4, -4, + -9, -14, -11, -22, -14, -17, -14, -9, -9, -9, + 0, 3, 3, 8, 9, -4, 12, 4, 3, -10, + 6, 1, 8, -1, 3, -3, -5, -1, -3, 5, + 3, -6, 0, 4, 0, 3, -3, 1, 1, 3, + 3, -4, -4, 0, 2, 2, -5, 0, 0, -3, + -1, -2, 0, 2, 0, 2 + }, + { + -5, -22, -34, 2, 1, 23, 4, 8, -8, 15, + -3, 17, -37, 45, 927, 10, 40, 8, 40, -68, + 61, 2, 26, 41, 73, 31, -15, -20, 81, -16, + -13, -15, -10, -30, 4, 1, -10, -18, 4, -5, + -23, 6, 0, 16, 3, 3, -3, 17, 13, -2, + 12, 12, 3, -7, 2, -6, -1, -1, -2, 3, + -2, 8, -5, 0, 1, 5, -1, 8, 1, 4, + 4, -5, -4, 2, -2, 1, 1, -5, 3, -2, + 2, 5, -2, 0, -2, -3, -5, 1, 3, -2, + 0, 4, 0, -2, 1, 1 + }, + { + 82, 227, -135, -47, -21, 108, 30, -2, 0, -21, + -60, 26, 29, 14, -210, -15, 49, -25, 11, 35, + -21, -5, -3, 9, 18, 2, -39, -15, 18, 15, + -5, -1, -16, -12, -26, 18, 0, -2, 15, 14, + 1, -1, 19, 16, -5, -5, -30, -15, -3, 10, + -15, 8, 18, 6, 1, 4, -10, 1, -2, 5, + 2, -5, 0, -2, 1, 0, 0, -1, -5, -1, + 1, -8, -4, 5, 6, 0, -2, 0, 0, -1, + -2, 0, 3, 0, 0, 0, 0, 1, 3, -4, + -2, -1, -2, 0, 1, 1 + } + }, + { + { + -43, 384, -29, 1, 24, 2, -7, -1, -4, -5, + 29, -12, 11, 9, -156, 27, -18, 19, 46, -14, + 30, 63, 8, -26, -22, -21, -23, 13, 29, -19, + -26, 10, 21, -20, -23, 2, 33, -38, -8, -6, + 24, 10, -19, 10, 13, 6, -9, 19, -11, 11, + 11, 1, 11, 8, 4, 2, -9, -7, -2, 10, + -3, 2, 3, 2, 1, 3, -2, -3, 9, -1, + -2, -1, 3, 0, -1, 0, 0, 2, 3, 0, + 0, 2, 3, 1, 1, -2, 0, -1, 1, -3, + 2, -1, 0, 0, -2, -2 + }, + { + -300, 2449, -192, 113, -6, 0, 1, -29, -7, 10, + 8, 7, -16, 10, -1, -61, -7, -20, 44, 8, + 10, -4, -3, -2, -13, 10, -49, -14, -14, 1, + -3, 36, -15, -19, 3, -1, 18, -30, -3, -22, + 3, -7, 3, -1, -1, -10, -7, -15, -8, 16, + 1, 2, 5, -8, -3, -13, 3, 3, -1, 9, + 2, -4, -3, 2, -7, 2, 1, -1, 4, -6, + 0, -3, -3, 1, -5, 2, 3, -3, 0, 0, + 3, -2, -2, 1, 2, -6, 3, 3, 0, 0, + -2, 0, 2, -1, 0, -1 + }, + { + -42, 1108, -255, 115, 17, -21, 10, -20, -6, -31, + -9, -14, -1, -29, 122, -3, -2, 4, -31, 14, + -8, 2, 30, -18, 38, 30, 11, -22, -4, 11, + 9, -1, 38, 3, -36, 19, -6, 24, -8, -2, + 0, 6, 9, 7, -4, -9, -16, 10, 7, 6, + 0, -2, 0, 4, -4, 10, 5, 3, -3, -3, + 4, 5, 8, -3, 1, -3, 6, 1, 4, 4, + 1, -1, 1, 0, 1, -2, 0, -1, -5, 0, + 0, 2, 2, 0, -2, -1, -3, -2, 2, -3, + 2, 1, 2, 0, 0, -1 + }, + { + 25, 33, -45, 17, 2, -6, 10, -4, -5, -2, + 12, 4, -19, 23, 144, -23, -68, 2, 5, 9, + -18, 25, 10, -27, 49, -43, -76, 3, 29, 86, + -47, -33, 50, -14, -16, -11, 44, -12, 8, -12, + 7, 19, -4, 7, -21, 15, 5, -1, 12, 5, + -16, -1, 4, -8, 10, 2, -5, 3, -1, -2, + 2, 1, -1, 0, 5, 3, -1, -2, 4, 1, + -10, -1, 2, 4, -2, 4, 5, 2, 1, -3, + 0, 2, 0, 0, 1, -1, 0, 2, 1, 0, + -1, 1, 2, 1, 0, 1 + }, + { + -73, -447, 97, -26, 20, -5, 1, 9, 25, -21, + 30, 8, -2, 17, -51, -9, 9, -13, 4, -28, + -6, 5, -12, -8, 8, 4, 33, 12, 27, 11, + -7, 28, -1, 28, -1, 6, -52, 14, 21, 17, + -18, -5, -2, 3, -20, 11, 20, -2, 6, -1, + 17, -1, 4, 0, -5, 1, -6, -6, -7, 2, + -2, 1, 0, -3, 0, 1, -1, 1, 0, 2, + -4, -6, -2, 5, 1, -1, 5, -1, 1, 1, + 2, 4, 0, -2, -2, 0, 1, -1, -3, -1, + 0, -1, -1, -2, 0, 0 + }, + { + -8, 139, 28, -36, 2, -2, 10, 4, -3, -1, + -11, -5, -11, -43, 207, -15, -19, -3, 66, -10, + 34, -15, 71, 79, -29, 78, -12, -4, -8, -41, + 22, -18, 5, 16, 33, -14, 4, 14, 0, -15, + 21, 9, -4, 5, 7, 2, -5, 5, -8, 0, + 5, 6, -10, -3, -1, -3, -2, 4, -2, 0, + -3, 3, -4, -4, -2, -1, 3, -2, 4, -2, + 5, 3, -4, -1, 3, 1, 3, 3, 2, -3, + 3, 0, 0, -1, 1, 1, 0, 0, 1, 1, + -3, 0, 3, 0, 0, -1 + }, + { + 66, 405, 162, -65, 10, 8, 1, -10, 3, -14, + 2, -26, 9, 22, -83, -39, 1, 1, -12, -15, + -8, 14, -6, -9, 3, -20, 22, -1, -5, -1, + 3, 17, -6, 17, 8, 19, 8, 4, -4, 7, + -2, 10, 3, -3, 24, -4, 2, -10, 16, -4, + -12, 2, -5, -2, 7, 4, 4, 1, 8, 2, + 2, -5, 5, -1, 1, 3, 5, -4, 0, 3, + -1, -6, 4, 3, -2, 2, 3, 1, 0, 2, + -1, -1, 2, 1, -4, 2, 3, 0, -1, -1, + 3, -1, 0, -1, 0, 1 + }, + { + 1, 82, 17, -9, -2, -7, -5, -1, 3, -5, + -22, -2, -27, 41, 355, -32, -4, -38, 11, 31, + -59, 15, 3, 2, 0, 41, 8, -22, -13, -25, + -16, -13, -9, 15, 14, 16, -3, -5, 4, 10, + -4, 6, 8, -10, 0, 10, 20, -24, -16, 12, + -2, -3, 2, 7, 6, 4, 9, 2, -8, 5, + 0, 8, 3, 1, 0, -6, 4, 4, 1, -3, + 2, 0, -2, 3, 1, 1, 5, 3, 0, 1, + -3, -3, -1, 0, 1, 0, 2, 0, -1, 3, + -1, -1, 0, -1, 1, 0 + }, + { + 163, 167, -70, -3, 15, 15, -23, -29, -10, 35, + -46, -53, -5, -1, 2, -19, 9, -11, 12, -6, + 4, 6, 9, 4, -17, -10, -2, 11, -10, 2, + 22, -2, -21, -11, -20, 28, 4, 6, 25, 0, + -10, 16, -15, 0, -12, 8, 3, 10, -6, -15, + 16, 4, -15, 14, -6, -5, -4, 1, -3, 2, + -4, -5, 1, -3, -3, 3, 5, 0, -2, 4, + -3, -1, 0, 3, 4, -4, -1, 0, 1, 1, + -2, -1, -1, -1, -4, -1, 4, 2, 1, 2, + -2, 0, -2, 2, 1, -1 + }, + { + 19, 87, -23, 14, -7, 65, 18, -29, -17, 1, + -4, -7, -57, -15, -62, 0, -38, 25, 50, 2, + 3, 12, 59, 24, 22, -11, -25, -12, -17, 6, + -2, -30, 15, 18, -22, 2, 16, 21, 14, -8, + 5, 0, 3, -15, 7, 11, -4, 5, -10, 10, + 8, 2, 0, -3, -15, -5, 5, 4, 4, 6, + 0, -3, -7, -5, -4, -4, 6, 5, 7, -3, + 1, 0, -2, 1, 2, -1, -2, -2, -4, -1, + -2, 1, 2, 1, 1, 0, -1, 0, -1, 2, + 1, 1, 1, 0, 2, 1 + }, + { + 233, -37, -219, 82, 32, -32, 191, -74, -16, 15, + -1, -12, -1, 37, -57, -35, 39, 18, -14, 14, + -57, 10, 23, -9, -1, -11, 2, -33, 17, 1, + 10, -3, -4, -1, 1, -8, 9, 11, 5, 8, + 19, 9, -19, 4, -18, -1, -6, 6, 4, -11, + 8, -5, 9, -10, -2, -5, -7, 12, -1, -3, + 3, 4, -4, -5, 2, -1, -2, 0, 1, -1, + -2, 1, 1, 6, -1, 4, 0, -4, 0, 1, + -3, 3, -2, 2, 0, 3, 0, 0, 0, -2, + 1, -1, -1, -1, 1, 0 + }, + { + -3, -147, 20, -10, -5, 0, -16, -10, 19, 0, + -10, -38, 74, -131, -35, -30, 8, 50, 18, -29, + 5, 35, 10, 0, 20, -23, -39, 16, -39, 56, + 13, -24, 3, -13, -3, -11, -1, 17, 12, 2, + -9, -4, 7, 3, 2, 5, -4, -4, 0, 9, + -3, -7, 3, 1, -3, -4, -4, -13, -6, -5, + 4, 0, 0, -5, -3, 6, 1, 0, 5, 2, + 2, 2, 3, 3, 0, 4, 2, -2, 1, -2, + 0, 2, -3, -2, 0, -2, -1, 0, 0, 1, + 1, 1, 1, -2, -1, 2 + }, + { + 20, -68, 54, -30, -35, 113, 65, -37, -18, 70, + 29, 2, 40, -32, 58, -32, 3, 47, -25, 34, + 10, -18, 2, 23, 20, 10, -4, 19, 18, 0, + 1, -10, 16, 12, -5, 11, 20, 2, 21, 0, + -13, -15, 10, -31, -4, -12, 6, -11, 0, -15, + 6, 6, 2, 17, 2, -2, 10, -5, -4, -2, + 3, -6, 2, -4, -2, -4, -3, 1, 2, 2, + -3, -4, 4, 2, 0, 0, -4, 5, 1, 2, + -2, -4, -1, 2, 2, -1, -6, 0, 0, -1, + 0, 0, 4, 1, 1, 2 + }, + { + 13, -48, -26, 12, 6, 13, 0, 16, -5, 4, + -2, 5, -34, -358, 364, -38, 10, -38, 44, 3, + 80, 2, 30, -7, -4, -6, 5, 10, 45, -52, + -30, 8, 32, 10, 2, 11, -3, -10, 21, -8, + -11, 17, -3, 4, -4, -10, -7, 5, 10, -6, + 10, 5, -5, -6, 5, -11, -1, 1, -1, -3, + 8, 5, -6, 3, 5, -4, -2, 8, 0, 5, + 2, -5, -3, 2, 1, 1, -4, 0, 0, 0, + 4, 1, -1, 0, -3, -1, -3, 3, 0, 0, + 3, 2, -2, -1, 1, -2 + }, + { + -71, -55, -42, 113, 24, 122, -21, 8, 8, -5, + 65, 34, -10, 47, -96, 33, 49, -38, 38, 45, + -19, -4, -14, 13, 2, 3, -34, 2, 11, -14, + 0, 13, -1, -5, -37, 18, -16, -3, 12, 2, + 9, -12, -3, 9, 3, -13, -23, 9, 8, 6, + 1, 9, 7, -7, 1, -1, -13, 8, -4, 0, + -1, -10, -2, -4, -2, -4, 1, -1, -2, -1, + 2, -5, 0, 5, 1, -3, -3, 0, 0, -2, + 0, 2, 0, 0, 2, 3, 1, 3, 0, -2, + 0, -1, 0, 1, 0, 0 + } + }, + { + { + 22, 174, -23, 15, 16, -4, 3, -5, -12, 3, + -19, 15, -50, 37, -81, -16, -2, 21, -14, 3, + 56, -19, -35, -60, -11, -20, 6, -7, 3, 1, + -25, -29, 2, 15, -6, 12, 17, 20, 24, -1, + -2, 5, -8, 10, -2, 3, 12, 23, 6, 6, + 4, 3, 5, 6, -11, 3, 4, -2, 9, 4, + -4, -10, -6, 4, -1, 1, -5, 1, 0, -9, + 2, 2, 4, 0, 0, 0, 2, 3, -1, -1, + 4, 0, -3, -4, -4, 1, 2, -1, 0, 1, + 2, -2, 1, -1, 1, 2 + }, + { + 211, 1661, 11, 89, 41, 0, -6, 45, 25, 10, + 19, 4, -2, -3, -22, -4, 44, -8, -31, 39, + 4, 28, -10, 0, -9, -19, -17, -9, -10, -8, + 2, 7, 3, 13, -6, -16, 5, -6, 17, 1, + -4, -15, -25, 14, -17, -4, 1, -3, 11, 5, + 6, -6, -13, -11, -9, -9, -4, -3, 1, 7, + -9, -9, 1, -1, 4, 7, 1, -1, -7, -4, + 0, 0, 2, -2, -1, 4, -3, 2, 5, 1, + -2, -2, 1, -2, -3, -1, 4, -2, 1, 0, + 0, 0, 0, -1, 0, -1 + }, + { + -6, 535, 217, -35, -65, -3, -12, -17, -8, 3, + 17, -2, 17, 36, 78, 6, 4, -3, 16, -17, + 5, 22, 1, 28, 20, 2, -10, 13, -2, 17, + 12, 10, -2, -3, 16, 5, 1, -3, 8, 4, + 15, -25, 4, 4, -18, 8, 11, -7, -2, -4, + 8, 7, 4, 0, -5, 6, 2, -11, 3, -1, + 0, -1, -8, -1, -2, -6, 1, 1, 3, -1, + 1, -1, 0, -5, 1, -1, -1, 0, -2, 4, + 1, 1, 0, -2, 2, 0, -1, 1, 1, 1, + 2, -2, 0, -1, 0, 0 + }, + { + -31, 3, 64, -11, -9, 11, 5, 0, -10, 5, + 0, 13, 13, -22, 91, 4, 1, 17, 61, 3, + 8, 14, -14, -1, -14, 1, -34, -20, 18, 51, + 2, -38, 16, -14, 13, 6, -15, 21, -2, -12, + 11, -1, 6, 7, 2, 5, -2, 1, 1, -6, + -8, 9, -8, -1, 2, -6, 3, 7, -4, 4, + 5, -1, 0, 5, -5, -4, 1, 1, -3, -3, + 2, 4, 2, 0, 0, 3, 1, -4, -4, 0, + -1, 0, -1, 1, -1, 2, 1, -1, -2, -1, + 1, 0, -3, -1, 0, -1 + }, + { + -140, -244, 116, -21, 2, -7, -7, 7, 17, 9, + 31, -23, 7, 17, -33, -13, -23, 4, 13, 7, + 9, -16, -17, 18, 32, -6, 4, 50, 28, 13, + 15, 11, 19, 11, -5, 11, 11, 42, 8, 13, + 7, -11, -14, 8, 8, -12, 2, 12, -1, -1, + 15, -13, 3, 5, -1, -3, -2, 5, 3, 2, + -4, -1, 0, -3, 1, -1, -4, 6, -1, -3, + -2, 1, 8, 4, -4, 1, 0, -3, 2, 0, + 0, 0, -1, -1, 3, 1, -1, -1, 0, 0, + 0, 1, 0, 1, 1, 0 + }, + { + 25, 65, -86, 24, 6, 5, 4, -4, 0, -11, + 2, 10, 6, 76, 222, -18, -15, -24, 4, 46, + 19, 15, 49, 44, 56, 74, -4, -7, 4, 8, + -38, -2, -12, 1, 4, -9, -1, -16, -3, -3, + 5, -1, 5, 7, 5, -11, 6, 8, 3, 9, + -5, -3, 2, -6, -4, -10, 3, -1, 2, 2, + 0, 3, -6, -2, -4, -2, 3, 5, 4, 4, + 3, -6, -5, 0, 2, -2, -4, -3, -3, 1, + 3, -2, 2, 3, 2, -1, 0, 1, 0, -1, + 1, 3, -1, -2, -1, 0 + }, + { + -127, 890, -13, -44, -1, -3, -3, -27, 1, 17, + -14, -15, -6, 19, -71, -63, -9, -27, -3, 36, + 19, 7, -3, -2, -1, 4, -13, 14, 17, 13, + 1, -3, -2, 8, 3, 10, 1, 30, -1, -11, + -5, 9, 8, 17, 3, 13, 7, 10, 9, -2, + -1, 8, 6, -8, 5, -4, -4, 0, -5, -4, + -5, -2, 3, 3, 3, 0, -7, -2, 4, -1, + 1, 5, -2, -7, 1, 4, 0, 0, 3, -2, + -3, 2, -1, -2, 2, 2, -3, -1, 1, 2, + 0, -2, 2, 1, 3, 1 + }, + { + 22, 16, -67, 5, -12, 7, -2, -5, -2, -10, + -4, 21, 12, -62, 374, -9, 55, 24, -2, 41, + 49, 29, -25, 42, 52, 44, 13, -8, 5, -29, + 20, 6, -4, 19, 25, 10, -1, -7, 8, -12, + 1, 7, 3, 2, 5, 9, -7, -16, 5, 4, + -14, 0, 1, -3, -6, 4, 1, -12, 6, 5, + -2, 2, -8, 4, -3, 5, 4, -3, 0, -1, + -1, 1, 1, 1, -3, 1, 1, -2, -1, -2, + -3, 3, 3, 2, -1, -1, 0, -2, 1, -1, + -1, 1, -1, 0, 1, 0 + }, + { + -309, 670, 75, 53, -39, -9, -36, 2, 17, -26, + -29, 17, 49, 24, -21, -28, -39, 3, 9, 18, + -6, 10, 23, -16, -2, -24, -4, 4, -17, -1, + 4, -21, -7, -6, -13, 6, 36, 33, -32, -20, + 7, -6, -11, -1, -20, -8, 2, -6, -3, 4, + -1, -5, -3, -3, 3, -1, 2, -9, 1, 4, + -2, -2, 0, -3, 10, 12, 0, -3, 3, -2, + 0, 1, -1, -1, -2, 0, 4, -3, 1, 0, + 0, -1, 3, 0, 2, 2, 2, -1, -1, -2, + 0, 0, 1, 1, -2, 1 + }, + { + -23, 58, 46, -10, 32, -18, -16, 4, -3, -33, + -6, 19, -11, -29, -74, -37, -13, 44, -28, -50, + 28, 38, 55, -19, -10, -22, 1, -33, -24, 5, + -4, 10, -20, -7, -4, -2, 0, -23, -6, 1, + -7, -8, -12, 2, -1, -13, 1, 2, 3, 1, + -10, -4, -2, -12, 7, 8, 1, 2, -1, -4, + -2, 2, 0, 7, 1, 3, 1, -3, -7, -6, + 2, -1, 2, 2, -1, 1, 2, 0, -1, 2, + 2, 1, -1, -1, -1, -2, 1, 1, 1, 0, + -1, 1, -1, 0, -2, -1 + }, + { + -184, 311, 157, -16, 29, 27, -100, 19, 32, 0, + -17, -1, -5, -10, -25, -2, -5, -19, -9, -12, + -25, 5, 0, -16, -6, -1, 1, -14, 6, -6, + -19, -14, 9, 14, -15, 7, 16, -9, 11, 8, + -19, -12, 2, -5, 8, -6, -12, -2, -6, 3, + -7, -4, -5, -5, 6, 6, 5, -3, -9, 3, + 4, -2, 1, 6, -2, -2, -1, 2, 2, -2, + 0, 3, -1, -3, -2, -1, -3, 2, 1, 0, + 1, -2, 1, 2, -3, 1, -3, -1, -2, 1, + 0, -1, 0, 2, 0, -2 + }, + { + 8, -98, -25, -15, -11, -15, 21, 5, -6, 10, + -21, -5, -41, -90, 18, 55, -21, -27, -20, -20, + 31, 56, -22, -40, -24, -5, -24, 0, 6, 1, + 1, 28, -10, 20, -30, 5, 12, -7, -15, -1, + 2, 4, 5, -14, -1, 5, 6, -7, -6, -4, + -12, 5, 2, -8, -6, -1, 6, 8, 6, 2, + 4, -6, 0, 6, 8, -1, -2, 4, 2, 1, + -1, 1, 1, -1, 0, -4, -5, 0, 0, 0, + 1, -1, 3, 2, 1, 1, 3, 3, 1, 0, + 0, -1, -1, 1, 0, -1 + }, + { + -15, 73, -39, -110, -2, 42, -65, 14, 3, 59, + -15, -2, 23, 18, 35, 32, 29, -2, 5, -23, + -26, 7, -9, 26, 18, 4, -17, -2, -1, -10, + -14, -7, 7, 7, 14, -4, 7, 20, 3, -8, + 11, -1, 15, -7, 17, 9, 10, 9, 9, -10, + 0, -5, -6, 7, -16, -4, 1, 0, 7, 0, + -6, -3, 1, -6, -5, -1, 3, 6, 1, -7, + 2, 4, -1, -3, 0, 0, 1, 1, 0, -2, + -3, 3, 2, 0, -4, -1, 3, 3, 1, 3, + 1, 1, 0, -2, -1, -3 + }, + { + -21, 10, 18, -7, 4, -16, 0, 4, -10, 12, + 4, -5, 18, -14, -469, 25, -33, -16, 19, 66, + -3, 9, 19, -39, -12, -18, -25, 37, -30, -29, + -3, 31, 43, 27, 3, 28, 10, 6, 13, 1, + 4, -5, -8, -5, -2, -2, 2, -15, -3, 0, + -3, -5, -3, 7, 2, -2, 2, 1, -3, 0, + -3, -10, 3, 2, 2, -3, 6, -2, 0, 2, + 1, 3, -1, -3, 2, -2, 1, 5, -1, 1, + -4, -3, 3, 1, 1, 3, 2, -1, -2, 3, + -1, -3, -1, 1, -2, -1 + }, + { + 18, -158, 58, 69, 26, -86, 28, 14, -16, 15, + 88, -37, -19, -46, 73, -32, -14, 11, 9, 1, + 52, 14, -19, -17, 18, 26, 20, 2, -39, -19, + 1, 2, 4, 12, -8, 12, 2, 3, 0, -7, + -3, -21, 3, 9, 9, -3, 12, 1, 4, -13, + 18, -3, -14, -6, -6, -8, -1, 4, 1, 3, + -5, -1, 1, 6, -3, -1, 3, 0, -1, 1, + 1, 5, 2, -3, -7, 0, 2, 0, -2, 0, + 3, 0, -2, 2, 1, 0, 1, -3, -2, 3, + -1, 2, 2, 1, -1, -1 + } + }, + { + { + 12, 188, 10, 53, 5, -9, -1, -7, -3, -7, + -10, 9, -6, 80, -79, 30, 38, 9, -26, -21, + 27, -53, 4, -18, 9, -8, 11, -6, 8, 12, + -5, -30, -1, 17, 10, 16, 6, 24, 21, 2, + -3, -3, -2, -7, -8, 1, 3, 12, 4, 0, + -3, -3, 2, -3, -9, 5, 4, 4, 2, 1, + -2, -13, -1, 4, -5, -3, -1, 1, -4, -3, + 3, 0, 2, -1, 0, 1, 1, 1, -2, 0, + 3, -2, -4, -3, -2, 3, 1, 0, 1, 2, + -1, 0, 0, 0, 2, 1 + }, + { + -183, 1604, 342, 118, 48, -15, -24, 33, -7, -13, + 8, -8, 12, 19, -10, 8, 24, -7, -40, 8, + -15, 37, -4, -12, -6, 5, 5, 3, -1, -5, + 9, -14, -3, 17, 9, -7, 9, 4, 17, -3, + -11, -1, -8, 13, -23, 7, 5, 7, 1, -1, + 10, -11, -15, -2, 2, -1, -9, -4, -1, 0, + -9, -2, 2, 0, 7, 3, 0, -2, -6, 2, + 0, 2, 1, -1, 5, 0, -2, 2, 3, 0, + -2, 0, 0, -3, -1, 3, -1, -1, 0, 0, + 1, 0, -2, 1, 0, 0 + }, + { + -5, 302, -38, -138, -64, 5, -11, 12, 15, 17, + 2, -9, 6, 6, 43, 3, -3, -1, 35, 13, + 24, 0, -13, 5, -15, -21, -4, 16, 9, 21, + -1, -3, -7, 5, 25, 3, 3, -4, 11, 4, + 0, -21, 5, -8, -13, 15, 12, -6, -2, -1, + 11, -1, -7, -2, -1, -4, -8, -5, 9, 3, + -6, -5, -6, 3, 0, -2, -1, 1, 0, -3, + 0, -1, 0, -5, 1, -1, 2, 0, 1, 3, + -1, -1, -2, -1, 2, -1, 1, 0, 0, 3, + 0, -2, -1, 0, 1, 0 + }, + { + 24, -29, -47, -25, 4, 9, -5, 3, 1, 5, + 2, 12, -1, -82, 17, 26, 95, 35, 98, 17, + 9, -31, -1, 28, -63, 31, 17, -7, -21, 3, + 19, -26, 1, -24, 18, 4, -13, 10, -7, -8, + 2, -4, 1, 7, 3, -8, -1, 1, -10, -1, + 8, 1, -6, 6, 1, 1, 6, 0, -1, 3, + 1, -5, -1, 1, -5, -4, 0, 0, -2, -1, + 7, 2, -1, -4, 3, -1, -4, -4, -1, 1, + 0, -2, -1, 0, 0, 1, 0, -1, -2, 1, + 1, -2, -3, 0, -1, -1 + }, + { + 207, 461, 241, -20, -12, 3, 7, 3, 10, 11, + -1, -15, -23, 21, -2, -14, 3, 22, 5, 16, + 6, -20, -5, 26, 4, 0, 3, 46, 9, -6, + 1, 1, -4, -7, -19, 5, 18, 7, -5, 8, + 14, 6, -6, 13, 13, -18, -7, 4, -11, -5, + 7, -14, 6, 0, -2, 1, 8, 7, 0, -1, + -4, -3, -3, -2, 1, -3, -5, 1, -5, 1, + 1, 2, 7, -3, -4, 1, -4, 0, 0, -1, + -1, 0, -1, 1, 2, 1, 0, 0, 2, 1, + 0, 1, 1, 2, -1, -1 + }, + { + 2, -19, -70, 15, 5, 2, -5, -5, 4, 0, + 13, 8, 0, 53, 109, -10, 52, -42, -16, 69, + 20, 7, -19, -27, 11, -4, -53, -34, 8, 63, + -24, 7, -3, -18, -10, 10, -1, -22, 8, 5, + -14, 2, 3, 1, 3, -11, 3, 7, 3, 9, + -6, -1, 6, 1, -1, -9, 3, -4, 3, 3, + 1, 1, 1, 2, -2, -1, -1, 4, 2, 3, + -1, -3, -1, 1, -2, -2, -3, -3, -2, 1, + 0, -1, 2, 2, 0, -1, 0, 0, -1, 0, + 2, 1, -3, -1, -1, 1 + }, + { + -7, 1142, 25, -7, 0, -2, -5, -2, 12, 12, + -6, 5, -1, 46, -50, -26, 10, -16, 12, 28, + 18, -11, 0, -5, -4, 10, -25, 6, -12, 12, + 2, -10, -1, 0, 5, -6, -7, 25, 3, -13, + -5, 18, 1, -2, -5, 6, 13, 5, 0, 0, + 1, 7, 1, -4, -3, -11, -3, 2, -7, -4, + -3, -3, 0, 1, -2, -3, -4, 4, 2, -3, + 3, 4, -4, -3, 2, 2, -3, 1, 1, -2, + 0, 1, -1, -1, 4, -2, -2, 0, 2, 1, + -2, 0, 0, 0, 1, 0 + }, + { + 1, -85, -17, 26, -4, 7, -2, -2, -1, 0, + 12, 10, 27, -55, 326, -20, 39, -20, -2, 1, + 10, -8, -18, 44, 43, 40, -9, 14, 27, -4, + 31, 11, -16, 14, -1, -2, 1, 0, -2, -12, + 0, 1, -6, 2, 0, -4, -11, 4, 12, 0, + -12, -7, 4, -10, -7, 0, -5, -8, 6, -7, + -5, -1, -5, 4, 0, 6, -3, -6, -2, 1, + -3, 0, 2, -1, -2, 1, -3, 0, 0, -1, + 2, 2, 1, 0, -2, 0, -2, 0, 1, -2, + 1, 0, 0, 1, 0, 0 + }, + { + 384, 1335, -258, 63, 3, -4, -22, 32, 3, -33, + 17, 46, 13, 24, 57, -15, -17, 9, -16, 10, + 8, 19, 19, 9, 18, -14, 8, 10, -27, -10, + -6, -7, 9, -1, -2, -7, 4, 19, -17, -12, + 3, 4, -4, -7, -10, -15, 0, 5, 4, 1, + -11, -1, 0, -9, 3, 5, 1, -6, 7, 5, + 0, 2, 2, 0, 10, 2, -6, -1, 0, -3, + 2, 0, -5, -1, -5, 3, 2, -3, 1, 1, + -1, -1, 3, 2, 3, 2, -1, -2, -1, 0, + 2, 0, 2, -1, -1, 1 + }, + { + 14, 22, -30, 31, 22, -52, 0, 6, 11, -13, + 11, 46, 5, -9, -22, 11, -15, -16, -37, 4, + 24, -34, 16, -17, 18, 0, 17, -4, 11, 15, + 14, -2, -29, -10, 3, -7, -16, -25, -3, -8, + -11, -2, -2, 6, -12, -9, -6, 3, 2, -7, + -9, -5, -4, 0, 18, 2, -6, 0, -4, -1, + 1, 1, 5, 4, 3, 3, -5, -5, -5, 0, + 0, 2, 5, -1, -2, 1, 3, 1, 1, 3, + 0, 0, -3, 0, -2, -1, 2, -1, 1, -2, + 0, -1, -1, 0, -2, -1 + }, + { + 111, 633, 19, -146, -10, 26, -67, 33, 20, -11, + -7, 6, -4, -2, 13, 5, -10, -7, 4, -26, + 3, -10, -12, -23, 11, 9, 7, -8, -8, 4, + -6, -6, -2, -5, -20, 8, 3, -9, 17, -11, + -25, -1, 7, -4, 5, -3, -6, -3, -7, 9, + -4, 0, -4, -1, 2, 7, 7, -11, -3, 3, + 1, -3, 3, 6, -5, 1, 0, 2, -1, 0, + 1, 2, -2, -4, 0, -1, -2, 4, -2, 1, + 1, -2, 2, -1, -2, -2, -1, -1, -1, 2, + -1, 0, 1, 1, -2, -1 + }, + { + -12, -98, 8, 19, -3, -1, 29, -6, -33, -1, + -6, 8, -6, -11, 33, 45, -42, -76, -22, -38, + 20, 54, -38, -38, 0, -8, -8, -14, -9, -47, + 20, 17, -6, 17, -24, 0, 10, -21, -6, 1, + 9, 2, -3, -9, 3, 4, 12, -4, -1, -7, + -7, 6, -2, -3, 0, 0, 10, 12, 0, 3, + -1, 0, 3, 9, 5, -7, 2, -1, 0, 0, + -2, 2, -1, -2, 1, -4, -4, 1, -1, 3, + 1, -1, 3, 2, 0, 2, 2, 1, -1, 0, + 0, -1, -1, 2, 0, -2 + }, + { + -51, 104, 13, -21, 10, -72, -97, 53, 9, -1, + -33, 3, -13, -11, 7, 14, 5, -16, 9, -40, + 6, 17, -9, -1, -7, -11, -6, -2, -4, -7, + -12, 3, -8, -19, -2, -13, -7, 3, -8, -6, + 22, 10, 19, 7, 8, 17, -2, 8, 5, 0, + -6, -6, -5, -3, -6, -2, 3, 3, 7, -4, + -2, 2, 1, -6, 2, 4, 3, 4, -3, -6, + 7, 4, -5, -3, 1, 0, 1, -3, -1, -2, + 2, 4, 0, -1, -2, 3, 4, 1, 0, 2, + 0, 0, -2, -1, -1, -2 + }, + { + 10, 69, 13, 3, -6, -12, -2, -8, -14, 21, + 6, -5, 18, 115, -223, 97, -86, 3, 0, -9, + -41, -13, 7, -15, -12, -42, -30, 0, -17, 20, + 13, 16, 5, -3, 3, 8, 3, 3, 0, 10, + 0, -9, -7, -1, 6, 6, 3, -8, -9, 0, + -10, 0, 2, 5, 0, 3, 2, 1, -5, 2, + -10, -7, 1, -2, -1, 3, 5, -4, 0, 1, + -1, 5, 1, -2, 1, -3, 4, -1, 1, 0, + -7, 1, 2, 1, 3, 3, 2, -3, 0, 1, + -3, -2, 2, 1, -2, 1 + }, + { + 17, -113, 68, -30, -43, -149, 14, 16, -5, 23, + 7, -67, 11, -34, 28, -43, -3, 5, -23, -6, + 51, 4, -1, -24, 22, 22, 13, 32, -14, -5, + -1, -9, 0, 10, 8, 13, 11, 3, -6, -4, + 3, -3, 11, -5, -2, 12, 20, -6, -3, -4, + 18, -2, -8, 5, -9, -2, 5, -3, 4, 5, + -1, 5, 1, 7, 0, 1, 3, 4, -1, 0, + -1, 4, 0, -4, -4, 3, 2, -1, -1, 2, + 0, -1, 0, 1, 0, -2, 1, -5, 0, 2, + -1, 2, 1, 0, 0, 0 + } + }, + { + { + -20, 359, 5, 37, -15, -2, -12, 7, -5, 2, + 1, -8, 63, -8, -45, 28, 17, 6, 49, -37, + 10, -6, 47, 27, -1, 1, -6, -8, 21, 32, + 4, -16, 14, -21, 3, 5, 5, 5, -8, -16, + 6, -3, 3, -16, 5, -6, -5, -7, 3, -3, + 1, 2, -1, 1, 7, -5, -5, -6, -2, 2, + 4, 0, 6, 0, -3, 2, 0, -1, 0, 5, + -1, -2, -1, -1, 1, 1, -2, 0, 2, 2, + -2, -1, 2, 3, 2, 0, -1, 1, 1, -1, + -2, 2, 0, 1, -1, -1 + }, + { + 209, 1491, 54, 2, -15, -1, -23, -61, -42, 0, + -2, -10, 24, 19, -29, -40, -15, -9, 22, -26, + -23, 23, -8, -19, 0, 22, -25, -3, 9, 5, + 20, -9, -13, -8, 10, 11, 4, 6, -12, -17, + -10, 9, 10, 1, 0, -1, -3, -1, -20, 9, + 4, -6, 3, 10, 2, 0, -4, 3, -2, -3, + 5, 2, 2, 3, 0, -4, -2, 2, 1, 3, + -1, -2, -2, 2, 0, -3, 2, -2, -2, 0, + 3, 0, -2, 0, 4, -1, -3, 2, -1, 1, + -1, 0, 1, 1, 0, 0 + }, + { + 7, 287, -137, -66, 81, -5, 12, 18, 5, -10, + -24, -9, -32, 3, 20, 15, -17, 18, 19, 5, + 8, -18, -3, -9, -22, -2, 8, 18, 0, 1, + -6, 5, 15, -1, 12, 1, -1, -3, 17, -2, + -16, 4, 2, 2, 6, -10, -11, 14, 9, 13, + -3, -11, -8, 3, -3, -5, -1, 7, 7, 0, + -4, 4, 5, 1, 3, 3, 1, 2, 0, 3, + 1, -2, 2, 0, 0, -1, 3, -1, 0, -2, + 0, -1, 2, 1, -3, -1, 0, -2, 0, 0, + 0, 1, 1, 2, 0, 0 + }, + { + -16, -102, 6, 8, 8, -3, -3, 0, 5, 4, + 3, -3, -28, -62, -77, 104, 32, 29, 62, 8, + 15, -67, 8, 24, -18, -10, 6, 32, -24, -41, + -7, 36, 2, -27, -9, 8, 7, -14, 10, -2, + -6, 3, 0, -2, -7, 0, 4, -1, -2, 8, + 5, -6, 8, 3, 8, 7, -4, -2, 5, -5, + -4, -3, 0, -2, 3, 0, 0, -3, 5, 2, + -2, -6, -3, 2, 2, -4, 2, 4, 2, 0, + 0, 0, 1, 0, 1, -2, -1, 1, 2, 1, + 0, -1, 2, 1, -1, 1 + }, + { + -130, 1210, -80, -16, 16, 0, 26, 2, -13, -8, + 0, 31, -22, -8, 13, -5, 6, 12, -9, 13, + -13, -12, 27, -27, -16, 14, 16, -7, 7, -8, + 6, 10, -19, -7, -12, -3, -24, -32, 10, 6, + -3, 7, 5, 16, -12, -4, 0, 1, -2, -6, + 2, 9, 3, -6, -3, 6, 5, -8, -5, -4, + 0, -6, -2, 0, 1, -4, -3, -7, -2, 5, + 1, -6, -4, -4, 3, 0, 1, 5, -4, 0, + 2, 1, 1, 1, -4, 1, 1, 0, -1, -1, + 0, -1, 0, -1, -2, 0 + }, + { + -18, 17, 22, -7, -4, -3, -3, -3, 12, 7, + 5, -5, -7, -17, -35, -1, 81, -12, 15, 50, + 35, 23, -23, -21, -58, -53, -33, -42, -5, 75, + -18, -6, -4, 1, 7, 13, 12, -8, 16, -4, + -4, 5, -4, 7, 4, -1, 0, -4, -4, -1, + 2, 8, -3, 4, 2, 4, -5, -5, 1, 1, + 1, -3, 6, 1, 1, 1, -5, 0, 2, -2, + -2, 7, 1, -1, 0, 2, 4, 2, 2, -2, + 0, 3, -2, -1, -1, 1, 0, 0, 0, 1, + 0, -3, 0, 2, 0, 0 + }, + { + 219, 833, 11, 25, -29, 6, -3, 25, 5, -8, + -2, 15, -1, 26, -25, 15, -3, 10, 6, -16, + -5, -7, -1, -12, -4, -4, -11, 16, -34, -12, + 7, -7, 13, 5, 16, -9, 3, 3, 1, 0, + -3, 10, -4, -12, 7, -5, -3, -12, 3, -2, + -1, -5, -3, 5, -12, 2, 3, 3, 5, 4, + 0, -1, -1, -2, -4, 2, 5, 3, -4, 0, + 0, -6, 3, 7, 1, -3, 0, 2, 0, 1, + 2, -1, 2, 2, -3, -3, 3, 2, 0, -2, + 0, 2, -2, -1, -1, 0 + }, + { + -21, -20, 73, 11, 7, -6, 0, -9, 6, 9, + -3, -12, -24, -8, 214, 53, -40, -45, 2, -65, + -37, -11, -9, -12, 54, -4, -36, 27, 6, 8, + -4, -7, -14, 10, -23, 12, -2, 9, -4, 2, + -2, -2, 0, -10, -6, 0, 8, 2, -11, 5, + 6, -9, -1, -2, 7, 1, 2, 7, -8, -10, + 1, 2, 5, 1, 1, -3, -3, 0, -2, 0, + -3, -1, -1, 0, 3, 1, -1, 5, 3, 2, + 3, -3, -2, -3, -1, 2, 1, 2, -1, 1, + 2, -2, 1, 0, 0, 0 + }, + { + -362, 1871, 53, 89, 12, 6, 14, -14, -23, 28, + 7, -19, -51, 9, 78, -1, 40, -16, -9, -3, + 27, 11, 0, 24, 6, 5, 13, 13, -20, -1, + 3, 15, -5, -6, 2, -13, -17, -9, 35, 7, + 6, 3, 3, 4, -4, -10, 18, 3, -7, -3, + -2, 0, -4, -3, 6, -1, -6, 5, 5, -4, + 1, 4, 3, 1, -5, -8, 0, 2, -4, 0, + 0, -4, -2, 2, 2, -3, -4, 2, 1, 0, + -3, 1, -3, 1, -3, -1, 0, 1, 2, 2, + 0, 0, -1, -1, 2, 0 + }, + { + -6, -50, 65, 7, -13, 37, 22, -28, 9, 16, + 16, 0, -14, 9, 41, 1, -11, -51, 64, 52, + -24, -40, -3, 16, 45, 10, 9, 27, 7, 19, + 16, -36, 3, 8, -4, 2, -4, 10, 4, 3, + -3, 8, -1, -4, -3, 10, -4, 0, -11, -1, + 10, 2, -1, 10, -3, -9, -3, 2, 2, 7, + 1, -2, -3, -4, -1, -5, -1, 5, 8, 5, + -3, 3, 0, -2, 1, -2, -2, -1, 0, -2, + -3, -1, 1, 0, 0, 2, 0, -1, 0, -1, + 1, 0, 1, 0, 1, 2 + }, + { + -47, 812, -64, -130, -7, 75, 52, -33, -24, 8, + -1, 3, 19, 29, -7, 14, 8, 16, -3, -17, + 10, -26, 8, -13, 14, 15, -6, -16, -1, 13, + 17, 3, -13, -15, 1, -14, -4, 15, -6, -3, + 17, 7, -6, 0, -15, -2, 2, 6, -4, 0, + 6, 6, 2, 1, -7, -5, -2, -2, 8, -5, + 0, 1, -1, -1, -1, 1, -1, 0, -3, 1, + 1, -1, 1, 4, 3, 2, 3, -2, -3, 0, + -2, 2, -1, -1, 2, -1, 3, 0, 1, -2, + 0, 1, -1, -2, 0, 2 + }, + { + 12, -86, 0, 18, -4, 7, -12, -14, -26, 0, + 8, -11, -6, 33, -24, 17, -34, -50, 25, -14, + -32, 18, 2, 20, 18, -43, -2, -24, -29, 0, + 25, -34, -2, -12, 6, -15, 2, -1, 14, 10, + 4, -10, -1, 11, 5, 5, 1, -3, 10, 0, + 4, -6, -1, 4, 6, -3, 0, -12, -9, -6, + 1, 9, 1, -3, -7, 0, 4, -5, 0, 1, + 1, 2, 1, 2, 2, 3, 3, 1, -1, 0, + -1, 1, -3, -3, -1, 0, -2, -2, 0, 0, + 0, 1, 1, -1, 0, 1 + }, + { + 78, -153, 80, 62, 16, -82, 79, 1, -13, -8, + 24, -1, 1, -60, -5, -11, -18, 8, -4, 5, + 26, 10, 1, -8, -16, 13, 19, 8, 8, -3, + 3, 5, -7, -26, 3, -10, 7, -11, -8, 19, + 3, -5, -5, 1, -16, 0, -2, -14, -6, 0, + -2, 3, 0, 6, 15, 5, 2, 4, -8, -2, + 6, -1, -2, -2, 4, 1, -3, -3, -1, 5, + -1, -2, -1, 3, 1, 0, -3, -1, 1, 2, + 3, -3, -2, 1, 4, 2, -4, -2, -1, -2, + -1, 0, 1, 2, 0, 2 + }, + { + 1, 106, -55, 17, -8, 10, -5, -6, 10, 6, + 11, -2, -31, 64, 330, -59, -66, 8, -2, -7, + -13, -20, -4, 26, -10, -15, -6, -10, 21, 13, + 4, -35, -27, 4, 4, -27, 2, -3, -9, 5, + -1, 9, 1, 1, 6, -1, 0, 6, -5, -2, + 5, 4, 1, -3, -3, 1, -2, -2, -2, 2, + 2, 6, -5, -4, 1, 4, -4, 5, 3, 1, + -1, -3, 0, 2, -1, 2, -1, -5, 2, -2, + 3, 4, -2, 0, -1, -3, -2, 1, 1, -2, + 2, 3, 1, -1, 2, 1 + }, + { + -24, -103, 36, -50, -28, 65, -46, 5, 6, 21, + -36, 18, 13, 63, -127, 10, 25, 3, -12, 19, + -17, -9, 6, 14, 9, -9, -10, 55, 8, -16, + 3, 6, -10, -5, 8, 2, -7, -2, 5, 7, + 1, 18, -3, -12, -7, 9, -6, 1, 4, 9, + 5, 10, 9, 7, 0, -2, -2, -5, 4, 1, + 2, 1, -4, -2, 0, -1, -2, 3, -1, 1, + -1, -3, -3, 5, 4, -1, -2, -2, 1, -1, + -3, 0, 2, 0, 1, 1, 0, 1, 2, -3, + 0, -1, -1, 0, 1, 1 + } + }, + { + { + 6, 358, -16, 8, -19, 5, -11, 10, -4, 10, + -13, 6, 23, -38, 6, -5, -11, 15, 79, -26, + 26, 39, 27, 11, -5, -5, 6, -5, 6, 20, + 6, -4, 16, -12, -13, 1, 1, -16, -18, -18, + 3, -5, 2, -5, 16, -7, -8, -8, -3, -4, + 0, -2, -3, 3, 2, -6, -1, -8, 1, 2, + 3, 5, 4, 1, 0, 2, -3, -1, 3, 3, + -2, -1, -1, 1, 1, -1, -2, 1, 1, 0, + -1, 1, 3, 2, 1, -2, -2, 0, 0, -2, + 1, 0, 0, 0, -2, -1 + }, + { + -201, 955, 178, 5, -32, 12, -14, -57, -12, 23, + 17, -1, 14, -13, -40, -31, -4, -8, 25, -26, + -24, 10, -3, -2, 4, 7, -22, 7, -3, -4, + 4, 1, -2, -5, 7, 22, 10, 6, -19, -11, + 4, 9, 9, -5, 0, -8, 4, -8, -13, 15, + -8, 1, 12, 5, -3, -1, 6, 6, -3, -3, + 7, -1, 2, 4, -5, -3, -1, 4, 2, 0, + -2, -3, 0, 0, -4, 0, 2, -3, -1, 0, + 2, -1, 0, 2, 3, -4, 0, 2, 0, 0, + -1, 0, 1, -1, 0, 0 + }, + { + 29, 660, 228, 22, 72, -16, 8, -3, -3, -15, + -3, 18, -17, -25, -16, 47, 18, 18, 7, 1, + 3, -10, -10, -4, -3, 13, -2, -2, -12, 16, + 4, -4, 5, -9, -3, -6, 0, 2, 2, -19, + -7, 17, 5, 7, 7, -20, -13, 15, -2, 4, + 0, 6, -1, 0, -1, 2, 4, 1, 3, 0, + 2, 6, 5, 1, 3, -1, 0, -1, 1, 3, + 0, -3, 1, 1, 0, 1, 1, 0, 0, -3, + 0, 1, 2, -1, -3, 0, -2, -1, 1, -1, + 1, 1, 1, 0, 0, 1 + }, + { + 18, -162, -48, 13, -3, -7, -1, -2, -2, 1, + 2, -7, -28, -34, -150, -18, -38, 17, 10, 7, + -14, -59, 8, -4, 2, -60, -30, 47, -13, -29, + -2, 42, 7, -20, -16, 5, -7, -6, 10, -9, + 1, 0, -4, -7, -4, 8, -3, 3, 8, 4, + -3, -2, 3, -1, 7, -2, -5, 3, 0, -5, + -1, 2, 0, -1, 3, 0, 1, -3, 3, 0, + -5, -3, -1, 2, -1, -1, 5, 3, -1, -2, + -1, 1, 0, 1, 0, -2, 0, 2, 3, -1, + 0, 2, 3, 1, 0, 1 + }, + { + -31, 1480, 16, -32, -14, -4, 20, 2, -17, -16, + 16, 13, -6, 14, 34, 22, -1, 7, 13, 9, + -12, -1, 27, -34, 10, 8, 12, -72, -42, 10, + 22, 8, -1, 4, 0, 5, -23, 0, 6, 2, + 1, 2, -1, -3, -14, 11, 1, 1, 8, -1, + 7, 7, -4, -4, -1, 6, -1, -7, -3, -4, + -1, -5, 1, -2, -1, -2, 1, -4, 0, 2, + -1, -5, -3, 0, 2, -2, 2, 2, -2, 1, + 1, 2, 2, 0, -3, 1, 0, -1, -2, -1, + 0, -2, 0, -2, 0, 1 + }, + { + -5, 81, 10, -10, -5, -3, 3, -5, 8, 0, + -2, -1, -16, -53, -4, -25, 12, 25, 63, 31, + 10, 31, 23, -21, -83, -20, 2, -21, -34, 20, + -30, 0, -2, 5, 8, -8, 10, -3, 10, -4, + 12, 3, 0, 9, 3, -2, -2, 0, 0, -3, + 3, 4, -6, 2, 0, 3, -4, -1, -2, -3, + -3, -2, 6, 0, -1, 0, -2, 0, 1, -3, + 1, 5, -2, -1, 3, 2, 4, 2, 1, -3, + 1, 0, -4, -2, 0, 1, 0, 0, 0, 0, + -2, -1, 2, 1, 0, -1 + }, + { + -366, -26, -17, 58, 41, 4, 4, 6, -20, -8, + -6, 2, -2, 10, -19, 16, -9, 6, 8, -12, + -4, 8, 2, -2, 0, 11, 11, 6, -21, -7, + 12, 7, 9, -8, 6, -12, -6, 2, 0, 4, + -4, -2, -7, -6, 6, -9, -16, -11, 6, -4, + 1, -1, 1, 4, -3, 9, 4, 0, 4, 2, + -2, 0, 1, -1, -2, 4, 4, -2, -5, 1, + -2, -6, 6, 4, -1, -2, 1, 0, 0, 2, + 0, 0, 3, 1, -4, 0, 2, 0, -1, -1, + 2, 1, -1, 0, -1, 0 + }, + { + -4, 57, 47, 19, -3, -8, 3, -10, 5, 2, + -15, -10, -27, -49, 59, -69, -57, -11, -11, -35, + 3, 9, -13, -27, 0, -36, -15, 8, -1, 19, + -17, -13, -5, 6, -8, 16, -4, 11, 11, 12, + 4, -6, 1, -11, -11, 2, 16, -5, -10, 13, + 7, 0, -1, 5, 5, 3, 7, 8, -9, -2, + 4, 4, 3, 1, 0, -3, 1, 1, -1, 1, + 1, 1, 0, 2, 2, 0, 1, 4, 1, 0, + -1, -3, -1, -2, 1, 1, 2, 0, -1, 3, + 0, -1, 0, -1, 0, -1 + }, + { + 246, 2394, -49, 134, 31, 6, 20, -24, -17, 29, + -26, -40, -34, 13, 40, -12, 20, -22, 7, 0, + 20, -8, -8, 5, -13, 5, 6, 17, 5, 15, + 1, 0, -14, -1, 8, -5, 10, -15, 25, 21, + 19, 0, -3, 8, -4, 8, 13, -12, -8, -3, + 2, -2, -2, 2, 4, -4, -6, 0, -3, -5, + 3, 2, 2, -1, -9, -1, 6, 0, -1, 1, + -2, -2, 1, 2, 3, -6, -3, 3, 0, -2, + -1, 1, -3, 0, -4, -1, 2, 2, 1, 0, + -1, 0, -2, 1, 1, -1 + }, + { + 5, -96, 35, -37, -18, 49, -14, -30, 0, -2, + -5, -23, 7, 15, 54, 37, 44, 9, 70, 5, + -39, 1, 2, -3, 22, -4, -3, 11, 6, 17, + 1, -14, 20, 13, -6, 7, 2, 14, -8, 8, + 5, 8, -4, -4, 9, 9, 4, 0, -7, 8, + 16, 3, 0, 3, -11, -2, 3, 2, 4, 6, + -1, -1, -5, -3, -4, -4, 3, 5, 6, -1, + -2, 1, -3, -1, 1, -2, -3, -2, -1, -3, + -2, 0, 2, 0, 1, 0, -1, 0, 0, 1, + 0, 1, 1, 0, 2, 1 + }, + { + 1, 841, 14, 23, 32, 17, -58, -59, -33, 14, + 7, 10, 24, 12, -24, 32, 22, 24, 6, 14, + -2, -17, 4, -9, -2, -5, -12, -7, 9, 0, + 0, -4, -6, -9, 14, -13, 4, 11, -10, 9, + 14, -4, -8, 1, -10, 0, 0, 6, -3, -1, + 7, 7, -1, -4, -5, -8, -4, 5, 5, -5, + 1, 2, -3, -4, 1, -1, -1, -1, -1, 0, + 1, 0, 2, 5, 1, 2, 1, -4, 0, 1, + -1, 2, -2, 2, 1, 2, 1, 0, 1, -1, + 1, 0, -2, -1, 1, 1 + }, + { + -7, -28, 64, 12, -1, -9, -24, -7, -10, 4, + 0, -11, -9, -46, -102, 58, 7, -30, 15, 21, + -9, 19, -2, 6, -3, -31, 1, -8, 7, 47, + 4, -18, -13, -9, 14, -11, -2, 8, 10, 11, + 0, -5, 8, 6, -4, 2, -7, -2, 11, 4, + 7, -8, -1, -2, 0, -5, -5, -17, -4, -4, + 6, 3, -1, -7, -5, 5, 1, -2, -1, 1, + 2, 0, 2, 2, -1, 3, 2, -1, 0, -1, + 0, 2, -4, -3, 0, -1, -2, -1, 1, 0, + 0, 1, 1, -1, 0, 1 + }, + { + -8, -244, 174, 29, 20, 12, 91, -46, -21, 8, + 20, 0, 42, -62, -13, -11, -13, 17, -11, 35, + 12, 7, -3, 7, 3, 27, 4, -4, 5, 0, + 8, -4, 2, -8, 17, -3, 13, 3, 1, 9, + -8, -6, -2, -8, -12, -6, 1, -17, -2, -5, + 2, 0, -1, 13, 8, 3, -1, 0, -7, 6, + 7, -3, -2, 0, -1, -1, -3, -2, 1, 4, + -5, -2, 3, 3, -1, -1, -1, 2, 0, 2, + -1, -3, 1, 2, 2, -1, -6, -1, -1, -1, + 0, 0, 3, 2, 1, 2 + }, + { + 4, 80, -45, 37, -2, 6, -1, 1, -5, -13, + 19, 0, -1, -70, 138, -42, -39, -14, 5, 27, + 16, -11, -8, 22, 3, 9, -5, 3, 3, -8, + 16, -11, -18, 10, -7, -14, 1, -10, -7, -7, + 0, 10, 3, -1, 3, -7, 2, 8, 3, 0, + 13, -1, -5, -3, -3, -3, -2, -1, 0, 0, + 9, 2, -6, -2, 1, -2, -5, 6, 2, 0, + -1, -3, 0, 2, 0, 4, -4, -1, 0, 0, + 5, 0, -1, 0, -2, -2, -1, 3, 0, 0, + 3, 2, -2, -1, 2, -1 + }, + { + 9, -42, 4, -91, 9, 159, -16, 7, -8, 5, + -23, 19, -8, 21, -137, 23, 7, -6, -1, 3, + -33, -7, 5, 22, -6, -10, 4, 35, -9, -14, + 12, 14, -15, -15, -5, 7, -3, 4, 2, 1, + -4, 10, -18, -12, -3, 2, -9, 4, 7, 4, + -2, 5, 5, 3, 7, -1, 0, 1, 0, -4, + -1, -1, -4, -3, 0, -3, -1, 0, 0, 3, + -1, -3, 2, 6, 1, -3, -2, 0, 2, -1, + -1, 0, 1, -1, 2, 2, -1, 3, -1, -2, + 1, -2, -1, 0, 0, 0 + } + }, + { + { + -3, 118, 106, -10, 7, 3, -5, -4, 0, -7, + -11, 3, -34, -2, 94, -63, 16, -9, 20, 18, + 29, 5, -32, -18, 9, 12, 0, -3, 7, -24, + -15, 16, -15, 25, -3, 6, -11, 15, 8, -4, + -6, -5, -1, 6, 5, 0, 4, 6, -5, -2, + -9, -2, 1, -7, -7, 2, 3, 3, 4, 2, + -4, -3, -5, 2, 1, -4, -3, 2, -2, -5, + 1, 2, -1, 2, 0, 0, 1, 1, -2, -2, + 1, -1, -2, -4, -2, 1, 2, -1, -1, 2, + 1, -1, 0, 0, 1, 2 + }, + { + 167, 316, 222, 147, 14, 3, -9, 31, 36, 4, + 34, 1, -5, 1, -38, 28, 22, -4, -10, -21, + -11, -4, 24, -4, 7, -11, 5, 19, -5, -5, + -14, 1, -3, 30, 3, -1, 8, 16, 9, 3, + 10, -3, -7, -4, -8, -2, 11, 2, 10, 0, + -5, 1, -5, -3, -2, -1, -3, -2, -1, -1, + -4, -4, 2, 2, 2, 4, 2, -2, -4, -3, + 1, 1, 3, -2, 0, 4, -3, 1, 3, 1, + -3, -1, 2, -1, -3, 2, 2, -2, 1, 0, + 0, 1, -1, -1, 0, -1 + }, + { + -46, 1139, 113, -57, -91, -2, -7, -20, -1, 13, + 27, 13, 34, 31, -41, 34, 26, -12, 31, 13, + 9, 18, -23, 6, 1, -10, -17, 3, 14, 9, + 11, -6, -19, 5, 6, -9, -1, -1, -12, 1, + 0, -5, 2, 2, -12, 1, 7, -1, -12, -9, + 12, 14, 4, -5, 4, 3, -4, -9, 2, 4, + 4, -10, -1, 0, 0, -5, -3, -3, -1, -2, + -1, -2, -1, -2, -1, 3, 0, 1, 3, 1, + 0, 1, -1, -2, 3, 0, 0, 2, 0, 1, + 0, -1, -1, -1, 0, -1 + }, + { + -19, -202, 56, -11, -7, 5, 4, 0, -13, -1, + 5, 1, -9, -25, -149, -21, -13, 92, -44, -2, + 21, -26, -15, -25, 0, -54, -10, 12, 12, 20, + -13, 10, -5, -12, 5, -7, -13, 7, -7, -10, + -1, -11, 3, 3, 4, 0, -7, 2, 0, -6, + 5, 4, -8, -1, -1, -7, 5, 4, -4, 3, + 3, -1, -1, 3, -5, -3, 1, 0, -6, -3, + 4, 6, 0, -2, -1, 3, -1, -3, -3, -1, + 1, 0, -2, 0, -1, 2, 1, -1, -1, -1, + 1, 0, -2, -1, 0, -1 + }, + { + 222, 1403, -129, -87, -3, 1, 1, 9, -4, 5, + -11, -21, 17, 11, 42, 36, -13, 16, 24, 8, + 3, 6, -2, 17, 35, -16, -4, -77, -4, 29, + 8, 5, 12, 1, -2, 7, 32, 30, -10, -2, + 21, 4, -11, -11, 6, 3, -8, -3, 6, 11, + -4, -11, -4, 4, 3, -3, 3, 7, 2, -3, + -3, 2, 0, -3, -2, 0, -4, 3, 1, -3, + -1, 5, 5, 2, -3, -1, -1, -3, 2, -1, + -2, 1, 0, 0, 3, 0, -1, 0, 0, 1, + 0, 2, 0, 1, 2, -1 + }, + { + 15, -12, -20, 13, 0, 2, 0, -7, -6, -2, + 9, 6, 6, 21, 77, -29, -46, 45, 7, 74, + 1, 35, -30, -9, 11, 7, -8, 0, -21, -24, + -14, 6, 2, -22, -14, -4, -5, -7, -4, 10, + 1, -4, 13, 0, -6, 2, 3, 7, 5, -2, + -2, -6, 5, 1, -7, -4, -3, 4, 1, -3, + 0, -1, 1, 1, 0, -2, 4, 0, 1, 3, + 0, -3, -3, 0, 1, -2, -3, -4, -1, 0, + 1, -4, 0, 1, 1, -1, 1, 0, -1, -1, + 0, 3, -1, -2, 0, 0 + }, + { + 357, -1135, 68, 118, 11, -10, -2, -10, -12, 5, + -6, -13, 0, -18, 12, -14, -15, -12, 17, 30, + 17, 16, -6, 10, 10, 14, 2, -13, 15, 5, + 5, -3, 2, -8, -14, -13, -10, 32, -2, -14, + -3, -9, 1, 12, -6, 1, -5, 2, -1, 6, + 4, 7, 8, -3, 2, -1, -4, -4, -4, -6, + -5, 1, 1, 1, 2, -2, -6, -3, 3, -2, + -2, 6, -1, -6, 0, 3, -3, -1, 2, -2, + -1, 2, -1, -2, 2, 2, -4, -1, 1, 2, + 0, -1, 1, 0, 1, 0 + }, + { + 20, 17, -61, 18, -5, 6, 0, -6, 0, -6, + -2, 12, 6, -19, -45, -70, 17, 48, -32, 11, + 56, 39, -10, 21, -11, 10, 2, 2, 10, 6, + -3, 14, 9, -1, 6, 11, 0, 7, -3, 6, + 9, -10, 6, -4, -3, -3, -8, -2, 19, 0, + -5, 6, 1, -2, -10, 1, -1, -4, 3, 2, + -1, -3, -3, 1, 2, 5, 0, -2, -1, 2, + 0, 2, 1, 1, -3, 1, -1, -3, -1, -2, + -2, 3, 1, 1, 0, -1, 0, -1, 2, -1, + -2, 1, 0, 0, 0, 0 + }, + { + -18, 2561, 205, 132, -7, -5, -2, 10, 10, -31, + -11, 18, 31, 9, 39, -17, -51, 11, 6, 7, + -6, 6, 23, -36, -6, -4, -4, 13, 0, 9, + -12, -15, 3, 13, -5, 16, 6, 9, -21, 13, + 14, -16, 0, -6, 0, 16, -16, -11, 7, 5, + -7, 1, -3, -4, -1, 3, 1, -7, -8, 3, + 5, 0, 0, 1, 5, 7, 2, -4, 2, -1, + -2, 3, 0, -3, -2, 0, 2, -2, -1, -1, + 2, -1, 2, 2, 1, 2, 0, -2, -1, -2, + 0, 1, 1, 0, -2, 0 + }, + { + -5, -57, -26, -6, 27, -38, -45, 12, -10, -17, + -20, 12, 23, 18, 41, -9, 77, 48, -46, -43, + 24, 33, -37, -40, 7, -14, 3, -22, 25, 4, + 2, 16, -13, 4, -2, -4, -9, -16, -15, -1, + -3, -4, -11, 6, 8, -11, 6, 2, 7, 0, + -7, -1, -1, -6, 10, 11, 2, -2, -1, -5, + 1, 3, 3, 5, -1, 4, 0, -4, -6, -5, + 1, -1, 2, 2, -2, 1, 2, 0, 0, 2, + 1, 1, 0, -1, -1, -2, 1, 1, 0, 0, + -1, 1, -1, 0, -1, -1 + }, + { + 37, 743, 170, 32, 13, -83, -148, 10, -1, 2, + 9, 15, -6, -21, 7, 28, 1, 4, 0, 17, + -8, -8, -11, -4, -24, -4, -3, 2, 11, -19, + -21, -9, -3, 14, -4, 3, 14, -16, 5, -3, + -25, -6, 3, 5, 8, 1, -2, -14, 0, 4, + 0, -1, -6, -5, 7, 4, 4, -3, -6, 3, + 2, -1, 0, 2, 0, -1, 2, 1, 0, 0, + 2, 1, 0, -3, -3, -1, -3, 1, 2, 0, + 2, -2, 1, 1, -2, 0, -3, -1, 0, 1, + 0, -1, 0, 2, 0, -1 + }, + { + 6, 50, -5, 5, -14, -11, 5, -5, -3, 4, + -16, 11, -30, -77, -4, 56, -2, -43, -44, 18, + 52, 29, -45, -30, -60, 32, 8, 4, 32, -1, + -15, 29, 4, 10, 2, 0, -3, -16, -6, 2, + 6, 8, 2, -7, -11, 1, 5, -3, 4, -4, + -3, 2, -2, -8, -7, -3, 1, 6, 10, 3, + 3, -4, 1, 2, 6, -2, -1, 2, -3, 1, + -1, -1, 0, -1, -2, -3, -5, 0, 1, 1, + 1, -1, 2, 1, 1, 2, 3, 2, 1, 0, + 0, -1, -1, 0, 0, -1 + }, + { + -86, -75, 156, -36, 5, 28, -68, -26, 15, 21, + -30, 2, -12, 36, -17, 20, 8, -13, 4, -6, + -10, 14, -7, 8, 14, 4, -10, -24, -16, 0, + -1, -10, 3, 5, 5, -6, 0, 13, 1, -9, + 6, 13, 5, 7, 11, 13, 0, 5, 9, -11, + -1, -6, -7, -1, -7, -6, -1, -1, 8, 4, + 0, 1, -3, 0, -5, 1, 4, 3, 1, -5, + 1, 3, 0, -3, -1, -1, 3, 0, -1, -2, + -2, 3, 2, 0, -4, -2, 4, 2, 1, 2, + 1, 1, -1, -2, -1, -3 + }, + { + -9, 60, 46, 20, -5, -11, -4, -1, -12, -8, + 4, 6, 45, -89, -303, 102, -36, -30, 38, 17, + -25, -7, -32, -7, 11, -3, -8, -2, -28, 10, + 22, 28, 8, 4, 2, 12, 6, -1, -8, -1, + 9, -16, -5, 6, -3, 5, 3, -5, -4, 3, + 2, -10, -1, 6, 0, -1, 2, -2, 0, 2, + -4, -9, 1, 0, -3, -1, 2, -3, -2, -2, + -1, 5, 0, -2, 2, -1, 1, 5, -2, 1, + -3, -4, 3, 1, 1, 3, 3, -1, -1, 3, + -1, -3, -1, 1, -2, -1 + }, + { + 23, -53, 17, -44, 2, -15, 22, 13, 7, 3, + -18, -36, -25, -89, 22, -19, -17, -20, 5, -12, + 6, 5, 9, -14, -4, 32, 0, -19, 11, -7, + 11, 6, -16, 5, 1, 26, 11, 0, -14, -10, + -8, -5, -8, 3, 0, 3, 16, 0, 0, -5, + 0, -6, -10, -2, 5, 0, 9, 2, -4, 0, + -3, 3, 3, 4, 0, 0, 2, -2, 3, 1, + 0, 4, 4, -3, -6, -1, 2, 2, 1, 0, + 3, -2, -2, 1, 0, 0, 0, -2, -3, 2, + 0, 0, 1, 0, -1, -1 + } + }, + { + { + 13, -191, -140, -1, -2, -2, -5, -1, 11, -7, + 2, -16, -22, -6, 75, -16, 22, -53, -46, 16, + 36, -27, -23, -21, 19, 27, 3, 11, 10, -24, + -29, 0, -2, 29, -1, 0, 4, 32, 7, 4, + -8, -2, 0, 2, 0, -6, 0, 6, -1, 1, + -10, -2, 3, -7, -2, 6, 2, 8, 1, -3, + -4, -6, -4, 2, -1, -3, 0, 0, -5, -2, + 3, 2, -1, 1, -1, 1, 1, -1, -3, 0, + 1, -2, -3, -3, -1, 2, 2, -1, 0, 3, + -1, -1, 0, 0, 2, 1 + }, + { + -165, -89, 38, 26, 6, 0, 7, 46, 18, -14, + 20, -3, 0, 34, -8, 42, 8, -13, -13, -16, + 6, -9, 15, -15, 2, -5, 14, 22, 1, 2, + -10, 0, 0, 18, -10, -17, 7, 26, 15, -2, + 0, -6, -1, 2, -6, 6, 5, 12, 10, -1, + 1, -5, -9, -1, 1, 1, -8, -3, -1, 0, + -4, -1, 3, -1, 4, 2, 1, -3, -3, 2, + 1, 0, 2, -2, 4, 1, -3, 2, 2, 0, + -2, 0, 1, -2, -2, 4, -1, -1, 1, 0, + 1, 0, -1, 0, 0, 0 + }, + { + 23, 1081, -53, -9, -44, 7, -11, -5, 10, 9, + 13, 1, 42, 45, -61, -5, -5, 0, 50, 7, + 12, 24, -7, 9, -9, -24, -16, 5, 23, 5, + 7, -11, -7, 16, 3, -14, -6, -2, 0, 19, + 3, -11, -1, 0, -9, 11, 0, -12, -7, -3, + 10, 2, 2, -2, 4, -1, -4, -2, 2, 1, + -3, -9, -1, -3, 0, -2, -3, 0, -1, -2, + 1, -1, -1, -1, 0, 1, 0, -1, 3, 2, + 0, 0, -1, -1, 3, 0, 1, 2, 0, 1, + -2, -1, -1, 0, 1, -1 + }, + { + 9, -187, 28, -25, -3, 7, 3, 1, -10, 0, + 4, 12, 3, -54, -105, 45, 17, 41, -71, 16, + 25, -39, -16, -8, 3, 20, 50, 17, 3, 11, + -18, 11, 3, 0, 21, -10, 11, 16, -11, 2, + 3, -12, 9, 7, 5, 3, -1, -2, -9, -6, + 8, -1, -2, 5, -2, -2, 7, -2, -3, 1, + 2, -2, -1, 0, -4, -2, 1, -1, -4, -1, + 5, 3, -1, -3, 1, 1, -4, -3, 0, 0, + 1, -1, -1, -1, 0, 2, 1, -2, -2, 0, + 1, -1, -3, 0, -1, -2 + }, + { + -380, 771, 34, -92, -24, 1, 5, 11, -4, 13, + -25, -4, 10, -8, 9, 10, -18, 4, 3, 3, + 2, 2, 0, 28, 18, -8, -6, -13, 49, 17, + -3, 3, 5, -1, -2, 14, 43, 0, -20, -1, + 7, -6, -6, 2, 13, -4, -7, 2, 6, 10, + -13, -12, 3, 4, 0, -7, 2, 2, 1, -1, + -1, 1, -2, -2, 0, 1, -3, 2, -1, -3, + 0, 7, 6, -1, -2, 1, -2, -1, 2, -1, + -2, 0, -1, 1, 2, 0, 0, 0, 2, 1, + 0, 1, 0, 1, 0, 0 + }, + { + 8, -46, 16, 15, 3, 2, -1, -4, -5, 0, + 10, 11, 14, 32, 43, -27, -16, 1, 0, 127, + -5, 6, -74, 4, 49, 17, -1, 10, 30, 22, + -9, -2, 4, -17, -6, 6, -9, 0, -1, 12, + -5, -1, 5, -7, -4, 5, 3, 3, 0, 2, + -4, -4, 7, 0, -5, -2, 1, 6, 3, 1, + 4, -3, 0, -1, -1, 0, 2, 1, 2, 3, + -2, -2, 0, 1, -1, -2, -4, -4, 0, 2, + -1, -1, 2, 2, 0, -1, 2, 0, -1, 0, + 1, 1, -3, -2, 0, 1 + }, + { + -185, -1984, -35, 91, -26, -7, -12, -3, 13, 2, + -3, 2, 3, -10, 23, -10, -24, -9, 12, 17, + 12, -5, -11, 8, 9, -1, -11, 1, 8, 1, + 7, -6, -2, -5, -12, -7, 6, 24, -9, -15, + -4, -5, 6, 13, -10, 5, 11, 4, -6, 6, + 2, 1, 2, -4, -4, -5, -1, -1, -5, -5, + -2, 1, 0, 1, 1, -4, -4, 1, 3, -1, + 1, 5, -4, -5, 1, 3, -2, 0, 1, -3, + 1, 1, -3, -1, 5, -1, -3, 1, 2, 1, + -2, 0, 1, 0, 1, -1 + }, + { + 6, -43, -29, 18, -3, 6, -3, -8, -5, 0, + 10, 15, 14, 4, -41, -47, 6, -1, -13, 48, + 43, 7, 29, 62, 23, 67, -1, -5, -3, -2, + -1, 24, 15, 2, 7, 6, -12, 3, -17, -6, + 7, -3, 11, 2, 1, -2, -9, 7, 18, -7, + -5, 2, 3, -9, -9, 1, -5, -2, 7, -4, + -5, -6, -4, -3, 0, 5, -2, -1, 0, 3, + 0, 0, 1, -1, -3, 2, -3, -3, 0, -2, + 0, 2, 1, 2, -1, 0, -2, 0, 1, -2, + -1, 1, 0, 1, 0, 0 + }, + { + -274, 2150, 44, 85, -8, -10, -6, 20, 1, -35, + 19, 36, 32, -3, 50, 5, -45, 8, 12, 15, + -13, 1, 14, -22, 11, -7, -4, 13, -11, -7, + -19, -5, 11, 2, -10, 16, -13, -1, -33, 4, + 16, 0, 5, -10, 9, 5, -16, 5, 7, 6, + -5, 5, -2, -2, -1, 5, 2, -4, -1, 3, + 2, 1, -1, 3, 10, 4, -3, -2, 1, -1, + 1, 2, -1, -3, -3, 4, 1, -3, -1, 1, + 2, 0, 2, 2, 1, 2, -1, -3, -1, -1, + 1, 1, 2, -1, -1, 1 + }, + { + 1, 62, 35, 25, 24, -48, -7, 15, -8, -4, + 1, 17, -8, -3, 17, -39, 33, 4, -80, -33, + 30, 7, -40, -25, 23, -1, 5, -28, 20, -19, + -1, 16, -13, 7, 0, -5, -9, -15, -1, -4, + -8, -5, -6, 7, -3, -10, -1, 0, 5, -6, + -9, -2, -4, 1, 15, 5, -3, -4, -3, -4, + 2, 2, 5, 3, 2, 4, -2, -4, -6, 0, + 1, 1, 3, 0, -2, 2, 3, 0, 1, 3, + 1, 0, -1, -1, -1, -1, 2, 0, 1, -1, + -1, 0, -1, 0, -1, -1 + }, + { + -65, 511, 37, -49, -9, -22, -29, 33, -2, -12, + 3, 6, -14, -17, 41, 21, -23, 1, 6, 9, + 9, -8, -4, 1, -10, 9, 7, 0, 1, -10, + -8, 8, 9, 13, -11, 7, 3, -16, 10, -14, + -22, 4, 5, 6, 3, -3, 2, -11, 4, 4, + -6, -3, -1, 1, 7, 4, 5, -6, -2, 3, + 1, -1, 1, 3, -1, -1, 1, 1, -1, 0, + 0, 0, -2, -4, -1, -1, -2, 4, 0, 0, + 1, -2, 2, -1, -1, -2, -1, -1, 0, 1, + -1, 0, 1, 1, -1, -1 + }, + { + -10, 73, 11, 7, -7, 1, 11, -3, -8, -5, + -12, 6, -17, 28, 159, 47, -16, -36, -23, 7, + 20, 25, -46, -17, -35, 31, 2, -9, 11, -37, + -4, 12, 18, 7, -1, 8, 1, -21, -4, -6, + 7, 9, -7, -7, 0, 3, 8, -4, 3, -8, + -3, 4, -5, -3, -2, 0, 6, 12, 6, 2, + -5, -5, 1, 6, 6, -5, 1, 0, -1, 0, + -2, 0, -1, -1, -1, -3, -4, 1, 1, 2, + 0, -2, 3, 2, 0, 2, 2, 1, 0, 0, + 0, -2, -1, 1, 1, -1 + }, + { + 129, 160, 44, -19, -14, -9, -62, 4, 18, -4, + -27, 5, 0, 98, -9, 21, 6, -9, 11, -26, + 6, 10, -10, -15, 6, -9, -13, -28, -25, -10, + -8, 0, 1, -5, -12, -9, -2, 5, -5, -11, + 5, 9, -4, 7, 4, 8, -9, 13, 8, -3, + -6, -8, -6, -11, -3, -4, 2, 2, 7, -2, + -1, 3, -1, -1, -3, 2, 4, 4, -1, -4, + 4, 2, -4, -3, 1, 0, 3, -2, -2, -2, + 1, 3, 0, -1, -3, 1, 5, 1, 0, 2, + 1, 0, -2, -1, -1, -2 + }, + { + 2, 92, 31, -2, -4, -4, 7, -7, -4, 8, + -9, 1, 28, 135, -54, 120, 13, -4, 14, -4, + -22, -2, -15, 7, 8, -10, 0, 0, -20, -2, + 4, 15, 1, -3, 15, 7, -5, -6, -6, 6, + 1, -16, -3, 7, -6, 7, -1, -3, -6, 2, + -7, -6, 6, 6, 0, 2, 2, 0, -1, 2, + -9, -6, 2, -1, -4, 3, 3, -4, -2, -1, + -1, 4, -1, -1, 1, -3, 3, 1, 1, 0, + -5, -1, 2, 0, 2, 3, 2, -2, 0, 1, + -3, -2, 1, 1, -2, 1 + }, + { + -43, -173, 3, -8, 0, -107, 4, 11, 9, 7, + -4, 4, -8, 27, 160, -28, -1, 8, 22, -2, + 20, -2, -1, -24, 9, 38, 2, -44, -1, 4, + 2, 5, -7, 8, 8, 18, -1, -10, -9, -6, + -10, -4, 4, 7, -7, 2, 15, -2, -3, -5, + -3, -8, -8, 0, -1, 0, 9, -1, 0, 1, + -2, 5, 2, 5, -1, 0, 2, -1, 0, -1, + 1, 2, -1, -4, -3, 2, 2, 0, 0, 1, + 1, -2, 0, 1, 0, -2, 0, -3, -1, 2, + 0, 1, 1, -1, -1, -1 + } + }, + { + { + -17, -310, 30, -14, -9, 0, -10, 12, 4, 12, + 6, -8, 20, -27, 26, 18, -26, -22, -56, 15, + 40, 9, 35, -1, 25, -21, 9, 3, 25, 16, + -24, -7, 26, -2, -8, -2, 5, 8, -23, 0, + -4, 4, -3, -2, 0, -3, -15, -7, 1, -8, + 4, 2, -1, 3, 11, -3, -2, -1, -7, -1, + 3, 3, 6, -1, -3, 5, 0, -2, 1, 5, + -1, 0, -1, -3, 0, 0, -1, -2, 2, 1, + -1, 0, 2, 4, 2, 0, -1, 1, 1, -2, + -2, 1, 0, 0, -1, -1 + }, + { + 178, -368, -222, -2, -13, -6, 3, -21, -36, 16, + -4, 2, 2, -3, 22, -9, -21, -16, 25, -15, + 4, -13, -8, -7, 0, 12, -9, -2, 23, 3, + -1, -4, -6, -16, -3, 0, 8, 6, -7, -13, + -1, 9, 8, -2, 10, 4, -7, 0, -8, 4, + 1, 2, 5, 8, 2, 1, -4, 4, -2, 1, + 6, 4, 0, 1, 0, -8, -2, 4, 3, 4, + -1, -3, -2, 1, -1, -4, 1, -2, -3, 0, + 3, 0, -2, 1, 3, -2, -2, 2, -1, 1, + 0, 0, 1, 1, 0, 0 + }, + { + -17, 582, 202, 98, 58, -6, 4, 17, 8, -15, + -19, -8, -16, 29, -47, -14, -15, 7, 36, -3, + 6, 9, 11, 7, -10, 1, -1, -5, -2, 1, + 8, -6, 16, 7, -16, -14, -6, 8, 11, 2, + 2, 3, -2, 9, 6, -4, -15, -6, 12, 6, + -6, -8, -1, 5, -1, -1, 6, 9, 0, -5, + -2, 6, 3, -2, 2, 4, 0, 2, -1, 3, + 2, -1, 1, 2, 2, -2, 1, -1, -1, -2, + 1, 0, 2, 2, -2, 0, 0, -1, 0, -1, + -1, 1, 0, 1, 0, 0 + }, + { + 0, -195, -3, 6, 6, -6, 0, -1, 1, 5, + 2, -11, -6, 25, -96, -54, 29, 6, -103, 24, + -8, -69, -11, 36, -16, 46, 16, 54, -18, -19, + -11, 29, 12, 5, -1, 6, 22, -2, 8, 7, + 1, -3, 6, 1, -3, 2, 13, -6, -2, 6, + 0, -5, 10, 4, 5, 3, -6, -3, 4, -5, + -5, 2, 0, -1, 3, 1, 0, -1, 4, 1, + -3, -6, 0, 1, 0, -2, 1, 4, 3, 0, + -2, 0, 1, 0, 1, -2, -1, 1, 1, 1, + -1, 1, 2, 1, 0, 1 + }, + { + 422, -260, -80, -102, 17, 12, -1, 1, -7, -3, + 5, 16, -4, 18, -35, -8, 17, -24, -17, 0, + -4, 9, 8, -6, -9, 7, -6, 51, 3, -7, + 3, -1, -8, 14, -7, 1, 0, -30, 1, -5, + -14, -5, 5, 4, 2, 1, 5, 7, 3, 5, + -10, 7, 7, -4, -4, -2, -3, -11, -5, -2, + 4, -7, 2, 1, -2, 0, -1, -5, -1, 2, + 0, -2, -4, -2, 3, 1, 2, 3, -2, 1, + 2, 0, 2, 1, -3, 0, 1, 0, -1, -1, + 0, -1, -1, -1, -1, 1 + }, + { + -17, 35, 74, -18, -1, -4, 2, 4, 6, 6, + -4, -6, 2, -30, -79, -15, 97, -51, -10, 179, + 3, -31, -33, -34, 14, -10, 3, 3, 34, 31, + 8, -12, 2, 16, 6, 14, -4, 12, 6, 0, + 10, 2, -7, 3, 4, 4, -3, -8, -5, 4, + -1, 5, -4, -3, 5, 3, 2, -1, 1, 3, + 0, -3, 2, 0, 1, 3, -3, -2, 0, -2, + -1, 5, 2, -1, 1, 2, 3, 3, 2, -1, + -1, 3, -1, -2, -1, 1, 1, -1, 1, 1, + -1, -3, 1, 2, 1, 0 + }, + { + -87, -2225, -8, 54, -6, 4, -5, 13, 22, -26, + 9, 5, -1, 16, -2, 9, -12, 19, -6, -24, + -8, -12, 2, -7, 0, -18, -7, 15, -10, -7, + 4, 10, 5, 4, -6, -5, 5, 5, -1, -1, + 5, -5, -8, -1, 0, 2, -4, -8, 0, -3, + -7, -1, -6, -2, -5, 4, 5, 1, 7, 1, + 5, -1, 1, -1, -2, 2, 6, 1, -3, 2, + 0, -5, 1, 5, -1, -1, 1, 1, -2, 2, + 2, -2, 1, 2, -2, -2, 3, 1, 0, -1, + 0, 2, -1, -1, -1, 0 + }, + { + -19, 29, 60, -1, 7, -8, -3, -6, -3, 8, + -2, -13, 5, 15, -70, 24, -81, -59, 12, 43, + -38, -9, 12, 32, 9, 25, 29, -8, -11, -18, + -6, -1, 9, 6, -4, -4, -3, 6, -9, 4, + -3, 4, 6, -4, -3, 3, 11, 7, -7, -1, + 7, 1, -2, 2, 5, 2, 2, 5, -4, -6, + -1, 1, 2, -4, -2, -5, -1, 4, 3, -1, + 1, -1, -2, 0, 2, 1, 0, 4, 2, 1, + 0, -4, -1, -1, 1, 1, 0, 2, -2, 1, + 1, -1, 1, 0, 0, 0 + }, + { + 500, 1210, -174, 75, 16, 9, 8, -5, -21, 25, + 4, -22, -28, 11, 26, 26, 5, 0, 6, 9, + 13, -6, -15, 19, -3, -6, 21, -3, 6, -10, + -2, -3, 8, -13, 4, 10, -30, -13, 8, 5, + 20, 5, 12, 2, 12, 0, 8, 5, -14, 1, + 10, 4, -4, 6, -1, -3, -3, 4, 2, -7, + 1, 3, 2, 1, -3, -6, 2, 1, -2, 1, + 1, -3, 0, 2, 2, -1, -2, 1, 1, 0, + 0, 0, -1, -1, -2, -2, -1, 1, 2, 2, + 0, 0, -1, 0, 2, 0 + }, + { + -1, 179, -41, 34, -20, 26, 39, -18, 8, 11, + 6, -29, -35, 24, 20, 12, -30, -31, 20, 13, + -15, -32, -8, 24, 28, 17, -2, 4, -15, -8, + 1, -1, 8, 19, 0, -1, 11, 11, 13, 1, + 1, 2, 5, -7, -2, 11, -6, -1, -3, -5, + 12, 3, -1, 7, -5, -9, -1, -1, 2, 4, + 0, -1, -2, -5, -2, -5, 2, 5, 7, 4, + -1, 1, -1, -2, 2, -1, -1, -1, -1, -2, + -2, -1, 1, 1, 1, 2, 0, -1, -1, 0, + 1, 0, 1, 0, 2, 1 + }, + { + 69, 260, -43, -46, -3, 82, 73, -23, -35, -13, + 4, -1, 5, 18, 29, 4, 12, 6, 20, 6, + 12, -8, 9, 4, 10, 6, 3, -2, -12, 14, + 24, 5, 3, 3, 9, -16, -9, 6, -7, -1, + 12, 11, -7, -3, -9, -4, 2, 8, 7, -4, + 0, 2, 8, -1, -7, -4, -3, 3, 8, -4, + 1, 0, -1, -3, 1, 1, -3, -1, -2, 0, + -1, -1, 0, 4, 3, 2, 3, -1, -2, -1, + -2, 2, -1, -1, 1, 0, 3, 1, 0, -1, + 0, 1, 0, -2, 0, 2 + }, + { + 9, 53, 11, 0, 7, 8, -16, -9, 0, -9, + 0, -21, 36, -30, 224, -42, -5, 22, 29, -9, + -76, 23, 27, 26, 8, -27, -1, -20, -24, 2, + 2, -21, -6, -2, 8, 4, 1, 6, 9, -3, + 3, -8, 0, 12, 6, 3, -5, -1, 6, 1, + 7, -4, -2, 4, 0, 2, -4, -9, -8, -2, + -6, 3, 0, -3, -6, 3, 1, -3, 2, -1, + 3, 1, 1, 2, 1, 3, 3, 0, -1, -1, + -1, 1, -3, -2, -1, -1, -2, -2, 0, 0, + 0, 1, 1, -1, 0, 1 + }, + { + -121, 423, 43, 56, -5, 7, 50, -19, -8, -17, + 27, -3, 8, 63, 11, -26, -12, 17, 7, 6, + 34, -5, 1, -28, 1, 2, 1, -5, 2, -10, + -4, 8, -7, -15, -14, 13, 6, -10, 0, 2, + -6, -15, -9, -7, -18, -16, -6, -5, -11, 7, + -9, 8, 0, 2, 11, 7, 2, 2, -8, -2, + 6, 0, -1, 1, 2, -2, -1, -2, 0, 4, + -1, -5, 0, 3, 0, 1, -2, 1, 1, 2, + 2, -3, -2, 1, 4, 1, -4, -2, -1, -1, + 0, -1, 1, 2, 1, 3 + }, + { + 4, 118, -41, -3, 10, 6, 9, 2, 15, -6, + -3, -12, -15, 162, 310, 50, 34, 14, -9, 0, + 7, 6, 25, 32, -13, -5, 30, -6, 10, -14, + -11, -16, -11, -9, -1, -8, -16, -17, -1, 1, + -9, 9, 4, 0, 0, -4, 2, 7, 3, -1, + -3, 8, 3, -4, -2, 0, -4, 1, 0, -3, + 6, 5, -3, -4, 3, 1, -4, 4, 2, 1, + -3, -4, 0, 2, -1, 1, -1, -4, 2, -1, + 2, 3, -2, -1, -1, -3, -2, 1, 1, -1, + 1, 3, 0, -1, 2, 0 + }, + { + 11, -359, 35, 1, 8, -5, 20, -6, 7, 0, + 36, 39, -8, 31, 135, 49, 8, 24, 23, -1, + -14, -12, -5, 9, 11, 2, -12, -30, 22, 0, + -1, 9, 3, -10, 3, -12, -5, -10, 9, -2, + -1, 2, 8, -10, -6, -3, -8, 3, 5, 4, + -6, 0, 8, 6, 1, 1, -2, -4, 0, 0, + 1, -1, -3, -1, -4, -3, -2, 0, -2, 0, + 0, -5, -3, 5, 4, 0, -3, -1, 1, -2, + -3, 2, 2, 0, 0, 1, -1, 2, 2, -2, + 0, -1, -1, 0, 0, 2 + } + }, + { + { + 7, -242, 59, -10, 9, 2, -5, 14, 0, 10, + -18, 4, 18, -57, 45, 48, -18, 5, -45, 14, + 18, 8, 27, -25, 7, -31, -15, -17, 35, 33, + -6, 6, 17, -20, -7, 15, 4, -13, -28, 0, + -7, -2, -7, 1, 1, 0, -12, -6, 2, -4, + 10, 3, -2, 6, 6, -7, -1, -4, -3, 2, + 5, 7, 4, -2, -2, 5, -2, -1, 3, 1, + -2, 0, -1, -2, 1, 0, -1, -1, 2, 0, + -1, 1, 3, 3, 1, -2, -1, 0, 0, -2, + 0, 1, 0, 0, -2, -1 + }, + { + -171, -441, 225, -33, -35, 12, -11, -40, -26, 14, + -9, 8, -3, -7, 26, -43, -24, 8, 50, 8, + 13, 0, -6, -7, -7, -3, -15, 0, 21, 2, + -7, -18, -19, -16, 4, 8, -11, -17, -20, -12, + 2, 11, 7, -5, 10, -3, -6, -4, -3, 6, + -1, 8, 7, 6, 2, 1, -1, 7, -1, -1, + 3, 0, 0, -1, -4, -5, 0, 5, 2, 1, + -2, -3, -1, 1, -4, -2, 2, -2, -2, 0, + 2, 0, -1, 1, 2, -4, 0, 1, -1, 0, + -1, 0, 1, 0, 0, -1 + }, + { + 44, -56, -287, 90, 39, -12, 2, 17, 5, -24, + -15, 2, -32, 29, -16, 7, 2, -4, 5, -12, + 8, 15, 11, 5, 2, 30, 6, -16, -28, -7, + 16, 7, 5, -13, -17, -2, 2, 1, -6, -6, + 7, 2, -5, 6, 1, -7, -5, 2, 7, -4, + -10, -4, -1, 5, -3, 2, 8, 5, 0, -2, + 4, 10, 5, -2, 2, 3, 1, 2, -1, 2, + 1, -1, 1, 2, 1, -2, 0, 0, -1, -2, + 0, 0, 2, 0, -2, 1, 0, -1, 0, -1, + 1, 2, 1, 0, -1, 0 + }, + { + 1, -211, -10, 18, 3, -8, 0, 2, 4, 0, + -6, -14, -5, -19, -34, 40, -45, -36, -90, 29, + -28, -64, -27, 47, -9, -26, -22, 48, -54, -3, + 15, 36, 14, -1, -9, 15, 12, -5, 14, 6, + 7, 2, 3, -3, -5, 1, 11, -6, 2, 5, + -3, -1, 6, 1, 8, 1, -7, 2, 3, -4, + -5, 3, -1, 1, 5, 1, 0, 0, 5, 1, + -5, -4, 2, 2, -1, -1, 3, 3, 0, -1, + -2, 2, 1, 0, 0, -3, 0, 1, 1, 0, + -1, 1, 2, 0, 0, 1 + }, + { + -321, -1217, 5, -80, 15, 11, -1, 0, -5, 1, + 21, -4, -11, 42, -13, -4, 0, -37, -5, 1, + -3, 8, 3, -17, 3, -2, -6, 76, -1, -15, + 4, -7, -4, 13, -8, -2, -11, -12, 13, 2, + -7, 1, 10, 1, -2, 7, 10, 5, -1, 7, + 0, 8, 4, -5, -2, 3, -3, -7, -2, 0, + 4, -5, 5, 0, -2, -2, -1, -3, 3, 1, + -3, -4, -4, 1, 3, 0, 2, 0, -1, 2, + 1, -1, 1, -1, -2, 1, 1, 0, -2, -1, + 0, 0, 0, -1, 0, 1 + }, + { + -8, 39, 25, -17, -3, -3, 5, 4, 5, 1, + -9, -10, -4, 4, -20, 4, 108, -36, 27, 176, + -7, -15, 34, -9, -22, -3, 20, 12, -8, -19, + 13, 3, 5, 19, 4, 9, -4, 9, 4, -6, + 14, -3, -4, 9, 6, 1, -4, -6, -3, 6, + 5, 2, -11, -2, 5, 0, -1, -4, -1, 3, + 1, 0, 1, 1, 2, 3, -2, -1, 0, -1, + 2, 4, 1, 0, 2, 2, 3, 3, 0, -2, + 0, 1, -1, -2, 0, 1, 0, -1, 1, 0, + -2, -1, 2, 1, 0, -1 + }, + { + 353, -1771, -114, 22, 1, 11, 9, 4, 12, -12, + 13, -3, 2, 3, -24, 4, -3, 20, -10, -17, + -15, -8, 7, -1, -9, -18, 13, 21, -12, -9, + 7, 5, 0, 10, 2, 3, -4, 3, 6, 8, + 12, 1, -2, -1, 3, 1, -10, -5, -1, -11, + -5, 3, -2, 0, 2, 7, 4, 2, 8, 2, + 6, 0, 2, -1, 0, 4, 6, 0, -2, 3, + -2, -4, 4, 4, -2, -2, 0, 0, -2, 2, + -1, -1, 3, 2, -4, 1, 2, -1, -1, -1, + 1, 0, -1, -1, -1, 0 + }, + { + -9, 47, 9, -8, 2, -7, 2, -2, -2, 5, + -8, -15, -17, 20, -49, 76, 19, 1, -1, 3, + -34, 41, -35, -38, -7, -26, 28, -10, -5, -13, + -9, -6, 6, 2, -3, -3, 3, 8, 0, 3, + -3, 3, 0, -1, 0, 5, 12, -3, -9, 4, + 6, 5, -4, 3, 5, 3, 4, 7, -4, 0, + 2, 5, 3, -1, 0, -6, 1, 5, 2, -3, + 2, 0, -2, 0, 2, 0, 2, 3, 0, 1, + 0, -3, -1, 0, 1, 0, 2, 1, -1, 2, + 0, 0, 0, -1, 0, 0 + }, + { + -573, 29, 115, 66, -3, 9, 10, -15, -9, 31, + -20, -37, -17, 22, 10, 34, 20, 11, 12, 7, + 20, -19, -12, 35, -4, 1, 16, -19, 9, 2, + 3, -6, 10, -5, 2, 0, -16, 2, 17, -1, + 22, 4, 14, 7, 10, 5, 6, -8, -19, -5, + 8, 2, -4, 6, 0, -5, -4, 2, 0, -7, + -1, 2, 2, -3, -6, -3, 3, 0, 0, 1, + 0, -3, 1, 2, 4, -4, 0, 3, 0, -2, + 0, -1, -2, -2, -2, -2, 1, 2, 2, 1, + -1, 0, -1, 1, 1, 0 + }, + { + 9, 290, 31, -5, -22, 42, 13, -24, 10, 13, + 5, -26, 2, 46, 37, 43, -19, -16, 48, 15, + -6, 0, -3, 9, 6, 16, 5, 4, -16, 16, + 0, -1, 2, 13, -2, 5, 17, 10, 5, 5, + 8, 8, 4, -9, 5, 11, 1, -2, -3, 1, + 14, 1, -1, 0, -13, -6, 2, 0, 4, 2, + -3, 0, -4, -5, -4, -4, 4, 5, 6, 2, + -1, -1, -3, -1, 2, -1, -2, -1, -1, -2, + -1, 0, 1, 1, 2, 1, -1, 0, 0, 1, + 1, 1, 1, 0, 2, 1 + }, + { + -55, 69, -48, -28, 0, 43, 15, -22, -17, 13, + 2, -3, 8, 17, 15, -13, 23, 19, 19, 8, + 0, 5, 7, 9, 11, 1, -10, -7, -6, 15, + 19, -10, -5, -2, 10, -26, -7, 5, -10, 14, + 12, 3, -8, -4, -8, -3, 1, 9, 2, -7, + 1, 1, 6, -3, -6, -2, -1, 7, 4, -4, + 0, -1, -1, -3, 1, 0, -1, -1, 0, 0, + -1, 0, 1, 5, 2, 2, 2, -3, -1, 0, + -1, 2, -2, 1, 1, 2, 2, 1, 0, -1, + 1, 0, -1, -1, 1, 1 + }, + { + -2, 40, 15, -9, 8, 1, -19, -4, 10, 4, + 9, -15, 29, -132, 98, -50, 12, 48, 32, 1, + -47, 17, 24, 23, 5, -25, -20, -21, -21, 28, + -7, -15, -16, -4, 0, -8, -1, 20, 8, 0, + -4, -9, 5, 11, 0, -1, -8, 1, 6, 3, + 5, -6, 1, 4, 1, 3, -3, -12, -5, -2, + 0, 2, -1, -5, -5, 6, 0, 0, 2, -1, + 3, 0, 2, 2, 0, 3, 3, -1, 0, -1, + 0, 1, -3, -2, -1, -2, -2, -1, 0, 0, + 0, 1, 1, -1, 0, 1 + }, + { + 66, 678, 68, 40, 4, 12, 43, -26, -13, -3, + 28, -13, -7, 2, 1, -27, -15, 9, -4, 19, + 11, -17, -1, -11, 5, 3, 3, 5, 13, -1, + -3, 3, -3, -8, -10, 11, 4, -2, 7, 6, + -3, -19, -1, -9, -15, -12, 4, -6, -8, 6, + -4, 11, 2, 8, 5, 6, -2, 0, -9, 4, + 6, -3, -3, 2, 2, -3, -3, -3, 2, 3, + -4, -3, 3, 3, -1, 0, -3, 1, 1, 2, + -1, -4, -1, 1, 2, -1, -5, -2, 0, -1, + 0, 0, 3, 1, 1, 2 + }, + { + 2, 107, -30, 9, 5, 1, 7, 9, 8, -13, + 3, -17, -4, 23, 34, -46, 17, 2, 10, 25, + 9, -5, 26, 30, 4, 20, 7, 1, 28, -5, + 4, -4, 8, 1, -23, -5, -10, -19, 3, -2, + -6, 9, 1, -8, -3, -6, 4, 5, 6, -3, + 1, 5, -3, -6, -4, -5, -5, 0, 0, -4, + 10, 3, -3, -3, 5, -2, -4, 6, 1, 1, + -3, -3, 1, 2, 0, 2, -3, -2, 0, 0, + 4, 1, -2, -1, -2, -3, -2, 2, 0, -1, + 3, 2, -1, -1, 2, -1 + }, + { + 60, -352, -26, -29, 31, 50, 21, -13, -9, -8, + 29, 13, -12, -27, 39, 33, -17, -6, 1, -12, + -24, 2, 1, 16, 0, -3, 0, -8, 22, -6, + 2, 14, 5, -12, -7, -13, 10, 6, 12, 6, + 4, 3, 4, -8, 5, -3, -10, 8, 9, 8, + 1, 1, 5, 1, 2, -1, -2, 0, -1, 0, + 0, -6, -5, -2, -2, -1, -2, -2, -1, 1, + -1, -5, 0, 6, 2, -1, -3, 0, 1, -2, + -1, 2, 1, -1, 0, 2, 0, 3, 0, -2, + 0, -2, 0, 1, 0, 1 + } + } +}; + +const Word16 FASTCONV_factor_Q_reverberationTimes_fx = 15; +const Word16 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] = { -13,-146,1965,2096,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, + 13763, 6773, 6672, 6798, 7119, 7739, 7542, 7501, 7478, 7202, 7405, 7215, 7275, 7311, 7326, 7454, 7468, 7322, 7206, 7163, 7223, 7152, 6988, 6892, 6797, 6513, 6431, 6387, 6237, 6046, 5909, 5773, 5784, 5819, 6016, 6420, 6660, 6829, 7034, 7209, 7305, 7550, 7665, 7656, 7744, 7780, 7918, 7901, 7827, 7942, 8102, 8059, 8145, 8041, 7994, 7999, 7832, 7923, 7695, 8292, +}; + + +const Word16 FASTCONV_factor_Q_reverberationEneCorrections_fx = 15; +const Word16 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX] = { -41,30,104,1304,1210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}, -}, + 19, 7, 8, 7, 8, 50, 38, 36, 41, 43, 76, 80, 88, 89, 86, 84, 90, 89, 85, 83, 112, 58, 32, 23, 20, 18, 17, 19, 20, 18, 41, 40, 31, 20, 9, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -/* Binaural rendering data set based on BRIRs */ -/* Tables derived from Mozart IIS BRIRs.*/ -const Word32 FASTCONV_BRIR_latency_s_fx = 937500; +#ifdef DEBUGGING +/* Generated on 09-Sep-2025 with Matlab version 23.2.0.2668659 (R2023b) Update 9 by marcemerit on MACA64 */ +#endif + -const Word32 leftBRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX] /* Q29 */= +const Word16 hrtfShCoeffs_factorQ_fx = 14; +const Word16 hrtfShCoeffsRe_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]= { { { - 955630, -56401512, 71553080, -7202124, 14854681, -289910, -25734370, -24148454, -9604084, 7688529, - 3944928, 16365973, 24145770, 3041911, -18577344, 10116259, 1116692, 18020072, -8924405, -17782776, - 2440078, -3891777, -11002096, -6689949, -1865090, -3699041, 1784022, 14807973, -2104534, 9245454, - 3911105, -4662724, -8611409, 6744173, 8320963, 872415, -13594645, -4185446, 14039174, 11704860, - 9465571, -18884972, -12775917, -2767570, 3891777, 3892851, 1280437, -3608310, -660351, -7697119, - -4881767, -1100049, 6172405, 3729105, -2437931, 4495757, 11756399, 6304475, 1001264, 3349001, - -1078037, -3046743, -1759326, -3722663, -3763465, -4314295, -9758166, -10887205, -4013110, 4864588, - 3716757, 4247723, 7022272, 863825, 7347616, 4841502, 3462818, 1126355, 208306, -2952253, - -451508, -1532230, -2476049, -4361003, -3837017, -731218, -1354525, -2653753, -1578937, 2069101, - 2981244, 1188095, -620086, -981937, -645856, 2829847, - }, - { - -1311576, -44833016, 52809308, 20124070, -7298223, 7428683, -20112794, -26019448, -15743739, 7221451, - 3786014, 9812927, 23059680, 8296266, -4772246, -9333501, -3495030, 22775674, 6451578, -15588047, - -3861713, -3238405, -14569603, 4369056, -18870476, 1163399, -4538707, 4942434, 7320772, 16517907, - 7077033, -9692131, -2573222, 6464463, 15781320, -7569880, -9329743, -1761474, 1338956, 8577587, - 4078608, -13250511, -4842576, 1410897, -4496831, -6114423, 10885595, 2915746, -3623879, -9056475, - -1188632, 920734, -630286, 769336, 3739843, 3173444, 8007967, 3762391, 6295885, 2049236, - 2841121, -3790309, -4130685, 468151, -3692061, -9145059, -7194070, -9555228, -2115808, -1827509, - 1188632, 5782100, 3993783, 4580046, 6547141, 7119445, 4317516, 6382859, -9127, -4071629, - -1392106, -4250944, -3717831, -4915590, -4575751, -470836, -1989107, -2849711, -287763, 2491618, - 2900177, 2003065, -734439, 3603478, -714575, -537, - }, - { - 846645, -51560008, 65578780, -3467649, 11985643, -14496, -34191696, -10616085, 6696928, -16768626, - 3975529, 12719009, 17405892, 421981, 7388955, 8446590, -11999602, 5041218, 5821828, -4824322, - 4554813, 7254737, -16798690, -12226161, -17508434, -12820477, -18455474, 12651900, 17714592, 31745178, - -1173063, 2865280, 8354249, -6429566, -4991289, -2551211, 3945464, -6769942, -3623879, -2477123, - 17372068, -1060320, -9668508, -6466610, 227633, 5158793, 355945, -9684614, -14144938, -3158412, - 2430415, 4786204, 4989142, 4218195, 7206955, -497142, -4730907, 8289287, 16455630, 9026948, - -95026, -4500052, -7610145, -1175747, -2637110, -12382391, -5749888, -10532870, -6753836, -8295193, - -1273458, 5917391, 7514582, 8136279, 8282308, 6990596, 10880226, 4264366, 3420405, -731755, - -3424700, -5625871, -5663452, -2662343, -3533148, -6499360, -3908957, 668404, 4457639, 2295123, - -1757715, 917512, -1787243, -1447404, -3212636, -1024887, - }, - { - -3221, -14889041, 41400264, -24458766, 17313014, -4783520, -15139760, -12379169, -14835891, -15014132, - 22133578, 12795781, 29772714, 780073, -1830193, -7704635, -15730318, 7419019, 479426, 2147484, - 6044630, -15578920, -20714628, 21677236, 10593000, -19315542, -18246094, 18170396, 14378477, -641561, - -7690676, 4871567, 3986267, -6784438, -1041530, 6685117, 1952063, -1824824, 2739652, -4158065, - 3786014, 2329483, -10746008, 3197066, -2314451, -6073621, -227096, 6054294, 3076270, -6460168, - 2093797, 4477504, -7090991, 421444, 3288334, -1559610, 5998996, 1897839, 899796, 1254667, - -2653216, -1816234, 543313, -1127429, -1208496, -3417183, -1496259, -2777770, -1161252, -2347737, - 3996467, 3113851, 4970888, 3305514, 434329, 954557, -2626373, 940598, -2228014, -49929, - -1999307, -625992, 574452, -1304596, 1120450, -1971390, -1712618, -198105, 354872, 1163936, - -645856, -1143535, 1695975, 1965484, 1514513, 1279900, - }, - { - -83215, -37740416, 48824116, 17595944, -16422881, 11187853, -15471009, -16932908, -20108500, -14439143, - 20119774, 12538620, 27537720, 1609539, -1927904, -1859184, -14825153, 7864622, 14259291, -16841104, - 2458869, -14470282, -9630927, 11508365, 10256382, -27176942, 4635881, 15280420, 11556146, 3828963, - -15209016, 304943, 2483565, -3546569, 2515777, -1784022, -4479114, 17565342, -913217, -1464584, - 460635, -5113696, -7748121, 4641249, 942745, -1860258, -14445049, 2402497, 9538585, 4505421, - -926639, -2628520, -1157494, 3940096, -2921115, 1206886, -111132, 4532264, 3532611, -2791192, - -3420942, -2048699, 3889630, 3206193, -3846680, -3086471, -6444062, -245350, -1256278, -1326608, - 247497, 4518306, 4786741, 3178813, 3710315, -198642, 2398202, -1359894, 564788, -6035503, - -1075352, -654983, 771484, -1928977, -659278, -391916, -413391, -2914672, 226023, 1316408, - 229781, -285078, -147103, 1852742, 3003256, 2175938, - }, - { - 429497, -18229988, 51657184, -36218924, 24843702, -6630893, -25108378, -11571179, -11758547, 6728603, - -10676215, 15838229, 37663640, 20347408, 4346507, 2557116, -40708236, -12735652, 8860518, 13119514, - -22288732, -19586662, 4494684, 21735756, -1844689, 17537962, -7939784, -13899588, -1504849, 1108102, - -1074816, 20643224, 9296994, -2589329, -23380728, 2994129, 3588445, 5702643, -377420, -6110128, - -19216758, 12066711, 5181341, -503585, -7817378, 3932043, 3316789, 1403917, 3202972, 7062537, - 688269, 1873143, 3183108, 1159104, -3831111, -8195335, -12437688, -2912525, 756451, 1042066, - -3373697, 324807, -927176, 6636798, 3493419, 4437238, -3259880, 1663763, 2587181, 5145908, - 2611340, 5506148, -2988224, -1916092, -2033667, -3062312, -4067334, -4774930, -4763119, -2268280, - -1965484, 3067144, 4863514, 4336843, 3530463, -683974, -5199595, -2287070, 1170916, 1711545, - 2158221, 2997350, 2338073, -262530, -448287, -668941, - }, - { - -1526861, -33169496, 43344808, 21916682, -18523120, 12035035, -13185550, -20113868, -16994112, -9774272, - 5463736, 755377, 28490128, 36409512, 6133750, -6323266, -24343874, -16369194, 4869419, 15558519, - -10058813, -26201448, -10751377, 19796578, 17725866, 1058173, -11373073, 4848481, 3506841, -11630235, - 690416, 24461986, 4437775, -12823699, -14641544, 2276333, 2867965, 4917738, -603980, -12462384, - -5184026, 11302743, 4664335, -10024991, -815507, 6053757, 1127429, 366683, -1631551, 3871913, - 10836202, -1217623, 7317551, -2661269, -6754910, -8462696, -3441880, -6065568, 546535, -7093139, - -736050, -612033, 8959839, 4692789, 5025649, 719407, -38118, -3905199, 2468533, 2549063, - 3538516, 4129611, 681826, 526670, -5638219, -4138738, -446140, -4017942, -3112778, -2551748, - -449361, 1946694, 3329137, 1299228, 1998234, -455267, -2357400, -1557463, 437550, 3346853, - 1443109, 2259153, 788663, -2113661, -382789, -316754, - }, - { - 750009, -24122146, 57381300, -35054988, 20176682, -5215164, -15900506, -12277164, -19737522, -1633161, - -4049617, 36446020, 29082834, 4054986, -6757594, -2123325, -16394427, 26415122, -11003706, -23857470, - -13677860, -4743255, -7586523, -6018860, 37881612, 16131360, -12305618, -16450798, 5511517, 1006633, - 5833103, 6218039, 2221035, 11902965, -6686191, -13548474, 2235531, 1147293, -7121056, -7100655, - -5648419, -7016366, 4626217, 15558519, -5508833, -541703, 132607, 14230837, -674847, 2589865, - 1608465, 7885023, 5064840, 289910, -8781598, -9659381, -10472741, -14414984, -2544231, 1030255, - -1374390, 5420786, 2848637, 1905892, 4624069, 10380936, 6924561, -4703526, 132607, 4153770, - 5338645, 3786551, -556735, -7385733, -4364224, -3168075, -7790534, -7292318, -1952063, -1578401, - 1205275, 3726958, 5583995, 4036196, 1322313, -370441, -1847373, -2174327, 1073205, 4316442, - 3537979, 3555696, 641024, -2540473, -2753074, -1714229, - }, - { - -1874216, -29564408, 40481676, 19535122, -17163226, 17681844, -19085760, -21491480, -17167522, -4613869, - -2410014, 11465952, 29816200, 23623930, -7425999, 9899363, -14923938, -2356327, 3783866, -13794898, - -18100066, -3794604, -10102300, -13139379, 35639640, 26870390, -9924059, -32071594, 8880919, 3996467, - 19249506, 3389803, -80531, 4794794, -18520972, -2269890, 7998840, -6386617, -5887327, -9145596, - -1483374, 4617090, -599148, 6725382, 22012, 477278, 1571421, 2169495, 9607305, 1828046, - -7843147, 13845901, 9213779, -2003602, -7400766, -10539313, -8092256, -17858474, -3020973, 2206003, - -2686502, 4949950, 4315906, 6871411, 6625524, 4543539, 4168266, -3417183, -1662689, 3568044, - 6945499, 1603633, 1685238, -4859219, -7092065, -3569118, -3990562, -7015292, -2710124, 1207423, - 2381023, 3413962, -9127, 4974109, 352187, -2240899, -2711735, -326954, 3468186, 7126425, - 1637993, 1350230, 1037235, -3871913, -4494147, 10737, - }, - { - 1593433, -34591668, 53500796, 3851512, -4761508, -40943924, 20738250, -3905736, -347355, -7060390, - -15420543, 23711440, 4525822, -11809013, 9135932, -4775467, 15676094, -107374, 6274947, -3478924, - 18503256, -14930380, -4929012, -3094524, -33978024, 1962800, -1926293, 9983651, 33286, 16101832, - -16172162, 6118181, 2520072, -1665911, 13992467, 5567888, -4168803, 739808, 11567958, 9804337, - -6375342, -18939196, -12025908, -11606075, 11212012, -2457258, 15775415, 4415764, -2222646, -12043088, - -5688148, -2718714, 2859375, 4567698, 2790655, 5479842, 1500017, -1793686, -2020782, -4501126, - 3966939, 5257040, 4871030, 2639258, 1095754, -3595961, -7502771, -1962800, -6242198, -2481954, - -3056406, -1401770, -1094680, 2836289, 4232691, 3797288, 5218922, 3291556, 3126736, 165893, - 1950452, -2179159, -3988414, 1372779, -190589, -3409667, -1212791, -3323768, -4752382, -676457, - 1213328, -1684164, 2152316, 1478006, 927713, -963683, - }, - { - 849330, -40848896, 61627412, 4379256, -12181064, -35042100, 6587406, 8983461, 9312026, -20839182, - -4743792, 25668336, 2234457, -5073967, -1600949, 10459319, 185220, -7437810, 13970992, -10514080, - 15386183, -9263708, -25761214, 358630, -23902030, 6389838, 11165841, 9736691, 12190191, 14259291, - -1418950, -238371, -5638755, -8369818, 6783364, -3712462, -2825552, 941135, -2219424, -9336185, - 158914, -8436390, -1947231, 8473434, 12742631, 5592585, 14663555, -4271882, -12898324, -5235029, - -19659140, -2596308, 7956427, 13619878, 8919036, 6744710, -5397700, 2310156, -12255689, -849867, - -6550899, 8961449, 3752728, 2012729, -4468914, -8303783, -725313, 590558, 746251, 1833414, - 111132, 913217, -3850438, 985158, 5361730, 5450314, 1447941, -2041720, 2993592, -551366, - 578747, -4333085, -5713380, -2801393, -599148, -2465311, -1998770, 2749316, 119722, 3831648, - 3362423, 2167348, 2656437, -754841, -2534031, -912681, - }, - { - -3398393, -11048803, 41757284, -7365332, -16236050, -30749818, 31039728, -4917738, -5291937, -3270081, - -28123982, 23676544, 1997697, 29744260, 16588774, -10045392, -18864570, 2202245, -12756053, -10382010, - 6517613, 5865852, -4013647, 9783399, -17023102, 21246666, -3074660, 12327630, -27824946, -957241, - 7638063, 8919036, -299037, 4124242, -7197292, -12458090, -6103686, -2087891, 14046154, -6683506, - -2073932, 16040629, 9929428, -4022237, 10180146, 3019362, 1205812, -3857418, -3636227, 86973, - -11580306, -8217346, -6092948, -5848672, -3990025, -8492761, 2646774, 7793755, 7849590, 16182900, - 4663798, -1902134, -3831648, -1664300, -577673, -1951526, 468688, 7399692, 3216931, -386547, - 571768, -2568927, 1585380, -3343632, -6716255, -4909685, -6404333, -3952444, -1707786, 2229088, - 362388, 2727304, 2890513, 6395743, 2614025, 4796405, 5669357, 3487514, -2095944, 576063, - -2179696, -5226975, -5710696, -4687957, -4366371, -1383516, - }, - { - 29528, -44947908, 61915712, 12115566, -12628814, -20714628, -6650757, 19307488, -13297219, -1597191, - -44937704, 32720672, 11861626, 6560563, 32029718, 4384088, -17361868, -21849572, 9412958, -19053548, - 9121437, -1537598, 5192079, 945430, -12446278, 6073084, 8098161, 302258, -4421132, -11719355, - 10740639, 8796630, 12267500, -589484, -17199196, -15394773, -7385197, 3603478, -1011465, -1729798, - 13524852, 15502684, 5885179, -9271761, 7295002, 3152506, 4947266, 2002529, -1640678, -151398, - -10290205, -12147241, -14680198, -4065187, -3605088, -4036733, 9809705, 2471754, 6360847, 8842801, - 4236449, 2621004, -3433290, 884226, 2703682, -3403225, 892279, 5160403, 6687264, -4771172, - -1549410, 726923, -1240172, -3084860, -9038222, -4702453, -4214437, -4740034, -378494, 1117228, - 3194382, 3299609, 4878546, 2765422, 5793374, 4018479, 3326452, 1392643, 455267, -763967, - -2488397, -1197222, -5405217, -5071820, -4126390, -3290482, - }, - { - -2760053, -14543833, 43907452, -5901285, -7776039, -38376068, 32312650, -13619878, -1338956, 1401233, - -22995254, 16763257, 22550188, 7672422, -13998372, 12149926, -7812546, -13275207, 1649804, 12042551, - -3478924, 13375065, -11092827, -5349382, -1777580, 1404454, -7504919, -7371775, 3707631, -451508, - -7431904, 1879585, 3214246, 3359738, -2794413, 20146618, -2887292, 5125507, 10362682, 4229469, - -4213363, -17395154, -14405857, 8089571, -9727564, 3231963, 11468100, 4889821, -397284, 3156264, - -12018392, -2040110, -10309532, -8879308, 6991670, 8815957, 5019206, 3175055, 333397, 2032593, - -4130685, 1874216, 4569845, 6032819, -1329292, -3257733, -4106526, -6415608, -2876018, 1657857, - -106300, 4438849, -1909650, -804233, -1865626, -286689, -1013075, -1095217, 4155381, 4021700, - 1359894, 2034204, 1367410, -533113, -1873680, 522375, -2135673, -1770063, -1871532, -2578054, - 445603, -1636919, -27380, 708133, 33823, 284005, - }, - { - 1373853, -38042672, 56327424, 1605781, -472983, -27903328, 2189360, 6993818, -18913962, 11134166, - -17874044, 8638253, 10264435, 18843096, -15911780, 16057272, -3711926, -7901129, -5448703, 840203, - 13704167, 6318434, -12747463, -9862319, -13860933, 3795141, 2682744, 3577171, 3865471, 1516660, - -9586904, 13465259, -2474975, -10101763, -1691680, 13561896, -151934, 5605469, 4309463, 4927401, - -8294119, -8853538, -7393250, -279173, 3113315, 945967, 9955197, 3187940, 4620848, -8117488, - -16232292, -2612951, 4219269, -4006131, 4005594, 4014721, 3100430, 3945464, 1385127, -4629438, - -903554, 2616709, 1367410, 723702, 3362423, -3689377, 3052111, 1139777, -8177618, 196495, - -340376, -777926, -2470143, 80531, 991064, -806380, -2093797, 520228, 4050691, 2697776, - 2427194, 162135, -255014, 2372970, 1640141, -1500554, -2754148, -4945118, -3174518, 1598802, - -158914, 828929, 1123134, -500364, -751619, 294205, - }, - }, - { - { - -3608846, -103232224, -7816304, 22453552, 30351998, -5068599, -5549098, 1506997, -5217849, -359167, - 4461934, 3011846, 1022202, 3081102, 667867, 15144592, -5418638, 7482370, -7442642, -4961761, - 5898601, 858457, -6945499, 1809255, 13787382, 11055783, 330176, 11804181, 1428077, 8237211, - 4001836, 638340, -8912594, 4115653, 3964792, 5600101, 625455, -2366527, 6468221, 4332012, - 11641509, 2997887, 2764348, -4411469, 341987, 5669357, 3309272, -2096481, 297427, -2401424, - 758062, 124554, 2091649, 779000, -2553358, -3812857, 329102, -1327682, -3158412, 618475, - -2338073, -1026497, 916976, -1852742, 1625645, 653909, -960462, -1508070, -1023276, 3594351, - -966368, -1376537, 3215857, -1653562, 413391, 278636, 3443490, 334471, 1876901, 516470, - 456877, 654446, 695785, 30065, -652835, 1331977, 68183, -554588, 25770, 1450088, - 2750390, 1630477, -969589, -1425929, -1313723, 2123861, - }, - { - 2412161, -5752572, 53693532, 23626078, 6101001, 3279208, -9045201, -1270774, 469762, 8352638, - 3594888, -4044786, 4073777, 2970507, 311385, -16589848, -15625628, 6380174, -3463354, -7988103, - 3226057, -6164352, -12742094, 17654464, -7660074, -5208722, -7278896, 6918119, 4780836, 2203855, - 2295660, -1457605, 7328288, -4587562, 7152731, -6226629, -4775467, 3340948, -4161287, -4369056, - -967978, -1444183, 4031901, 3473555, -2749853, -3055332, 7412040, -628676, -2860985, -756451, - 6953552, 401579, -3544959, -1493575, -3676492, -3024731, 4941897, -1450625, 1922535, 514322, - 5224291, 376883, -2319282, -1053341, -144955, -3727495, -2296734, -3489124, 208843, -3084324, - -1426466, 2228551, -1041530, -1101122, 1356136, 644245, -3024194, 1533840, 1090385, 158914, - 792421, -2693481, 829466, 1578401, -579821, -52613, -966905, 751082, 1000191, -1114544, - -420370, 1970853, -809064, 2061584, -1107565, 290984, - }, - { - -1280974, -55959664, 35691180, 19917374, 28632400, 94489, -12852153, -3586298, 2353105, 15569, - 13412109, -1483374, 1015760, -3226057, 3391414, -3170223, -7722351, 12865038, 12896176, 2004676, - -784368, 3453691, -7835631, -825171, -2155000, 5752035, -5617817, 3215320, -7728794, 6078453, - -9371619, 923418, 2565169, -2400887, -3504157, -6050535, -1368484, -3797288, 3176128, -5833640, - 8746164, -2472828, -4480725, -1622424, 1515587, 1688996, -5327907, -1743757, 2561411, 2560874, - 2510409, 2752537, 976568, -973347, 7300371, 1187559, -6031745, 1124208, 3889630, 1371705, - -175020, 419296, -636729, 5130876, 4334159, -4732517, -173409, -1327145, 2886218, -3702799, - -3788161, -1008780, 1260573, 3202435, 2545842, -1496796, 2226941, -30065, 2617783, -444529, - -1396401, -1016834, -689342, -257698, 285078, 377957, 67646, -436476, 1125281, 748935, - -1943473, 155693, -1414655, 117575, 618475, 1708860, - }, - { - 952409, -80412528, -21235928, -17369384, 28725278, 4229469, -633508, 4485557, -4653597, -29805462, - -121870, -535260, 10148471, -5505075, -11087995, -8692477, 2212982, 11460583, -1889786, -3393561, - 2461553, -10461467, -10151155, 11399917, 4350265, -6658273, -9059697, 716723, -2457258, 1728188, - -3469797, -1705639, 3383897, -4119948, -3297998, 6304475, 5325760, 2892661, 4305705, -4735739, - -484794, -3512210, -8844948, 5364414, 2762738, 3695283, 2447595, 2234457, 3473555, -155156, - 6830072, 9108015, -867047, 3804267, 4305168, -2059974, 971736, 214748, 343597, 39192, - -3382824, 344134, 4984847, 580894, 564251, -3164854, -1694365, -622233, 3389266, 326418, - 3908957, 574452, 1131724, 648540, -1051193, 1800665, -17717, 2429341, -1606855, 1079647, - 845572, 1224603, 449361, -1131724, 814970, -1110786, 1224066, 1028645, -1724429, -1891933, - -1699733, -1691143, -196495, -357556, 158377, 1564442, - }, - { - 398358, -17474074, 38814156, 13526999, -12416214, -2067490, -3679713, -862752, -7592429, -2185065, - 21000780, -145492, 13270912, 5106716, -8755828, -14613089, -9073655, 1485522, 2933463, -12185896, - -3099893, -9373229, 10138807, 4716411, -3070902, -14459007, 11177116, 5273683, 7058779, 4327717, - -9452686, 734976, 3411278, -6149857, -4815195, -869731, 4038880, 10506027, -6701760, -2192581, - 5222144, 4726075, 1091995, -528281, -5803038, 3283503, -9820980, -2783139, 1427540, 2941516, - 3887482, 543850, 4137664, 7333657, -113817, -934692, -4135517, 1575179, 645319, 812286, - 3167539, -1389422, 1125818, 2633889, -405874, 2649995, -1934883, 1466195, -1291711, -3158949, - -2770791, -884763, -1438814, -1924145, 1796907, -384400, 2800856, -481036, 2009508, -2243047, - -489626, -635118, 1427540, -2147, 394600, -902480, 1029182, -1564979, -497679, 1222992, - 462783, 642635, -530428, -392453, 500901, 68183, - }, - { - 955630, -110530448, -32946158, -21823802, 40638444, 4989142, -5651640, 5108327, -7684234, 4206921, - 4596689, 6036040, -12902619, -6771016, -2412698, 2203855, -11133629, 7967701, 9437654, 2867965, - -13264470, -4049617, -12266963, -961536, -7042673, 10784663, -6791954, -15152108, -2068564, 6988449, - -3672734, 7232188, -3449933, 3567507, -6725919, 9970767, 9443022, 597000, -3349001, -3728569, - -12716861, 9658308, 1828582, 1523640, -1343251, 2868501, -3893388, -4117800, 424665, 4472672, - -4081830, -368293, 7478612, 5977521, 1452773, 1789928, 2285996, 4026532, 1463510, -1265942, - -4681515, 3081102, -1369021, 4303557, 1200980, -1339493, -3838627, 2719251, 1122597, 1344862, - 160524, 28991, -4490389, 781147, -324270, -584116, 840203, -1279363, -2629594, 261456, - -114354, 18790, -105764, -318901, 499827, -6979, -2842195, 831076, 812823, -526134, - 758599, 1946694, 1960116, -156766, 475131, 1781875, - }, - { - 2129767, 15836618, 60158532, 10005126, -14842870, -1238561, -5565204, -1147293, -878858, -3143379, - 6581501, 3985193, 8755291, 3813931, -14707042, -8743480, -13142600, -15482283, -4939750, 6463389, - -1216550, -5111548, -6667400, 5066988, -6051609, -13630616, 1966021, 14614163, -6454799, -8797167, - -2161979, 8516383, -5114769, -3762928, 2614025, 4486094, -4921496, -576599, 1013612, -2888903, - -224949, 3601330, -3576634, -9708774, 1582159, 6767795, 4714264, 1410360, -6336151, -1443646, - 6234145, -2426120, 7276749, 1488743, 363998, -115427, 1169305, -6497749, 2225330, -3146064, - -439697, -2156611, 1025423, -1451699, 4110821, 1692217, 2428804, -2771328, -1611, 2053531, - 775242, 1799591, 1985886, 3544422, -579821, 2254858, 2692408, -363462, 541703, -2326799, - -111669, 2452426, 1621350, -216359, 803696, -1451699, -1671279, -1619740, -1224066, 273804, - -1092532, 131533, 259846, -919123, -448824, 597000, - }, - { - -485331, -113216408, -30855582, -19718732, 30333744, -2593087, -2568927, -1943473, -8646843, 5921686, - 131533, 11369315, -2492155, 7175280, -11780558, -9247601, -10125922, 12890271, -8807367, -6951405, - -5269388, -8079371, 4155918, 3914326, 9517111, -2924336, -7107097, -10012643, 287763, -3171297, - 3751654, -882616, -1438277, 4760971, -4773320, -2667712, 1594507, 2123325, -5879810, -7968238, - -6306086, -7832947, -5340255, 2979097, -8580808, 1196148, 685047, 6550362, -9331353, 0, - 3220152, -2218351, -5305895, -801548, -5117991, -2455111, 1791538, 1368484, 4099010, -1621887, - -1116692, 2785286, -3098819, -932008, -492311, 504659, 2691871, -1851131, -482647, -1763084, - 791348, 3633006, 861141, -1556389, 1386201, -661962, 230854, 690416, 750009, 1259499, - 949725, -861141, -634581, -817118, -542240, 629213, 316754, 310848, 672699, 1017370, - 327491, 1838246, 1989107, 780073, 60666, -483721, - }, - { - 2094870, 25104620, 65843996, 9574556, -13515188, 1946694, -14127221, -3082176, -1728188, -1318555, - 157840, 3252901, 3789235, 5878737, -6725382, -1892470, -14003741, -8594766, 6660958, 7762617, - -2854543, 8069170, 3131568, -26506390, -1184874, 6294275, 3324305, -12418361, 10960757, 3600256, - 3589519, 1232119, -2177549, -1875290, -5760088, 332323, 8134668, -659814, -2993055, -3530463, - -1300838, 1289027, -295816, 1957431, -3899830, 3555696, 5394479, 279710, 1972464, -1059246, - -5532992, 7728794, 240518, -504122, 473520, -3379066, 2658585, -1239098, 1132798, 955630, - -2047626, 1286880, -3072512, 208843, 912144, -1613834, 1692754, 154619, 1129040, 344134, - 1941862, -3163780, -184147, 1832340, 1668058, 2367601, -3221, -1956358, 855772, 249108, - 435402, 478889, -2753074, 2719251, -1070521, 549219, 2039036, 1250372, 772020, 2095944, - -1063004, 806917, 1325534, -1868311, -587874, 2816962, - }, - { - -3263638, -94205272, -3779034, 4383551, 24987046, 4616553, 45722076, -16037408, -1414655, 2871186, - -7677254, 15254650, 3180960, -12287901, -14781667, -11457899, 8864812, 3423089, 2820720, -13726715, - 12467216, -9880035, 4190278, 17049410, -3636227, 6756521, -4368519, 9407589, 1548336, 17828946, - -8489540, 4153770, 8993125, 8058970, 4044249, -3546032, -4835060, 69256, 370441, -1218697, - -10812043, -16675747, -4291746, -8531416, 2841658, 331786, 10377178, -2595234, -600759, -2967286, - 5894843, 149787, 8717710, 2946348, -8047158, -1001801, -967978, -1201517, 2507187, 181462, - 5743445, 5478768, 3320010, 450435, -602369, 981937, -3692598, -2219424, -2064269, 824634, - -409096, 2080375, 2808909, 470299, 693100, -738734, 480499, 429497, 1414655, -1028645, - 438624, 1852742, 627602, 3433826, 3024731, 1548873, 1783485, 1993939, -695248, 970663, - 1431298, -1937567, -661425, -1043677, 1513439, 1635846, - }, - { - -1304596, -43919260, 44362180, 4839355, 748935, -7063611, 12983149, -17871358, 6551436, 280784, - -2444373, 11738682, 20938, 7121056, 2958696, 2675228, -1970316, -11294690, 12103755, 896038, - 21547850, -3113315, -5194763, 18633178, -6969122, 5951214, 3994857, 2076080, -8838506, -5643587, - -9209484, -2832531, -6557878, -3186329, 13431436, 3382287, -7245610, -4873178, -3807489, -594316, - 10167798, -6660421, -4045322, 4366371, 12227235, 779000, 3129958, -5634997, -6073621, 1481764, - -5748277, 179315, -1297080, 4764193, 3081639, 762357, -10152766, 2643552, -4519380, 3145527, - -4590783, 3320010, -1587527, 309775, -2617783, -4082367, 1216550, 4020626, 2005213, 884763, - -2051921, -2290291, -2777233, 1588064, -1257352, -693637, -876710, -4562866, 1669669, 780610, - 967978, -1428614, 703301, 1538135, 415538, -2833605, -3796214, 1183800, -1520955, 323733, - 1447404, 792421, 2884071, 923418, -320512, 849867, - }, - { - 10470057, -51960516, -23640036, -14092861, 12464532, 8300025, 23744726, -7282654, 7803419, 15278272, - -36216236, -8474507, 2005750, 7727720, -19069118, -992137, 9869835, 23678154, 4810900, -497142, - 11349451, 9425306, -5792837, 9421011, -13159780, 13979582, -8884677, 11370389, -8437463, 11059541, - -3805878, -6633040, -6331856, 13300977, 5643050, -3421478, 7133941, -371515, 3093450, -8210904, - -4999879, 4933307, 4554813, -8357470, 701153, 1920924, 4473209, -3684545, -2863133, 4970888, - 1325534, 74088, -1527398, 443455, 3381750, 34360, 1807108, -626528, 1298154, 7126425, - -159988, -5899675, -4446902, 1396938, 2831994, 693100, -2563022, 1972464, 406948, 164283, - 1173600, -2821794, 671626, -1520418, -1697586, -1013075, -1515050, -212601, -1009854, 1401233, - -241592, 2456721, 969052, 1566589, -2265595, -145492, 641024, 834297, -762894, 1591285, - -1413581, -1607392, -31139, 592706, -797790, 770410, - }, - { - 77309, -32812476, 46692200, 12045773, 5170067, -11101954, -21934398, -9675488, -14898168, 9487046, - -16544751, 18429704, -6990060, 12071542, 15193447, -3026341, -6673306, -8230231, 6424734, -6864969, - 9753871, -3529390, 12613782, -3230889, -3999152, 11515881, 10923712, 16062104, 6564858, -9119826, - 463320, -10068477, -229244, -10175851, -8902930, -3481608, -610422, 5247377, -5215701, -9019968, - -1610076, 8303246, 7896298, -828929, 4471061, 3604551, 5678484, 3043521, 389768, 725313, - 1233193, 1495722, -10142565, -4060892, -2551211, -1545651, 599148, -5753109, -304943, 2065342, - -1120987, 308701, -1837709, 2193655, 4184372, -583042, 2738579, -969052, -15569, -3516505, - 523449, -669478, -10201, 2818036, -4332549, -4156455, -1438814, -1984275, -395674, -928250, - 1796907, 1537598, 711891, -3792993, -1609002, -2175938, -1064615, -867047, -301185, -632434, - -1578401, 2728378, -613643, -936840, 918586, 437550, - }, - { - 8372502, -59508920, -21007222, -10066330, 21373368, 4319664, 28239946, -10634339, 30606474, 25651692, - -13760538, 15524696, 1267015, 4730907, 8428336, 23728084, 726923, -3373697, 3645890, 4316979, - -8088497, 6185290, -8622147, 5866389, 2389613, -7499013, -5548561, 3797825, 6227703, 1354525, - -4554276, -1582159, -6886443, -1650878, -9174050, 9041980, -6833293, 3572339, 7062000, -7361037, - -6268505, -4708895, -4014721, 8443906, -1185948, 3361886, -15032, 339302, 1267015, 3125663, - -2495376, 9060234, -3109020, -8138963, -2886218, 3447785, 4442607, 1665374, -285615, -658741, - -3150896, 1282585, 126702, 482647, -5046587, -2418604, 459025, 2187749, 4265977, 1268626, - -629750, 6334540, -1290101, 921271, -1443646, -1814624, -503585, -1933272, 622770, -887985, - -2561948, -1293859, -1552631, -4182761, -2559264, 1872606, -1008244, 730681, 384400, -1610613, - 213675, -1551020, -632434, 1200443, 927713, -287226, - }, - { - -2407866, -59391880, 27748174, -278636, 9949292, -9721658, -4369056, -9340480, -14596983, 15402290, - -5167383, 3488050, -8710194, 18867792, 18862422, 13421773, -16690780, -4814122, -5119064, -5949604, - 12754979, 15676631, -7359427, 5538361, -1888175, 2858838, 3172370, 1533303, 2752537, 913217, - -23975582, 5137318, 611496, 3141769, 3770981, 5995775, 4731980, 2910914, -7021198, 330712, - -2050847, 294205, 932008, -1668058, 1144072, 332860, 3322157, -4852240, 3135863, 2798171, - -3762391, 2465848, 6757594, -224949, 5913633, 4366908, 2710124, 6220724, 5842766, 181999, - -948114, -2986613, -315680, 2483028, 6344741, -2269890, 775778, 1420560, -3023120, 1044751, - -439160, 471910, 1524713, 738198, 195958, -3796214, -5374615, 918586, 2571612, -47245, - 2205466, 1269163, -1514513, 2489471, 3140158, 2640868, 3201361, -284005, -2253247, 1406065, - -174483, -70867, 563714, 111669, -555661, 1799591, - }, - }, - { - { - 6043019, -64106680, -70795560, 69796440, -4854924, -8654896, 48855, 7141457, -9306657, -4489315, - 3810173, 2935073, -6767258, 7310035, 10820633, 2839510, 1719061, -774168, 3064996, -44560, - -2487323, 1902671, -6157910, 7858180, 17987324, 7971460, -4834523, 12410308, 7736847, -726386, - 3311957, 9917079, -5487895, -3129958, 7228430, 2113124, 1827509, -1424855, 2461553, 5774047, - 6043556, 10124849, 2005750, -1198833, 165893, 4068945, 830002, -404264, -2221035, 2538863, - 4090420, -660888, -657130, -2649458, 677531, -4536023, -4317516, -808528, -1492501, -2125472, - -2452963, 1731946, 1036698, -3786551, 3583613, -1129576, 1057099, 2189897, -917512, 3117610, - -889595, -3753265, 2110440, 533650, -2965675, 2774549, 1460826, -371515, 1029182, -67646, - -44560, 2303176, 1882269, 1563905, -365072, 1437740, 365609, -1625645, 1003949, 2059437, - 1287953, 1652489, -1361505, -1446867, -78920, 737661, - }, - { - -825707, 57592292, -3376918, 17819282, 11344082, -1757179, -5005248, 8939974, -115964, 6402186, - 4958540, -7959112, -4693326, 5594732, 718870, -17723720, -758599, -6763500, -8768713, 729608, - 6565395, -543313, -11820287, 4440996, 7493108, -13039521, 758599, 3424163, 10334228, -13929116, - 6255620, -9290551, 19190988, -10530723, -109522, 797253, -6204081, 1204738, -2641405, -2754148, - -2234457, 3625489, -3183108, 12203076, -3811784, -471910, 2471217, -1829119, -663572, 3871913, - 3146064, -661962, -506806, 196495, -4462471, -6027987, 4858682, -3416647, -537945, 3772055, - 2447058, 1280974, -2297808, -481036, -1796907, 1364189, -669478, -1149441, -1443646, -3357054, - -140123, -1262184, -468688, -2331630, -155156, -925565, -1554778, -652298, 352724, 2183454, - -57445, -2463701, 2887829, 1765768, -218506, 220117, 329102, 1591285, 443992, -2396055, - -977105, 1652489, 506269, 107911, 932008, -241055, - }, - { - -46171, 19914690, -42325828, 44809392, 13641353, -7347079, -1909113, -3744675, -10588168, 18205292, - -451508, -391916, 579284, -772020, -6265821, -5505075, 10188736, 4351339, 12099460, 6803765, - -367757, -8901857, 290447, -556735, 7306813, -1165547, -9127879, 4189204, -8742943, -57445, - 345208, -5793374, 2067490, 4901632, -13394929, -3638911, 3013993, -7365332, 2857764, -2527588, - 237297, 4389994, 312996, -268972, -7610682, 839666, -1571958, -2833605, 7699803, 2855617, - 3915400, -5616744, 3824669, 2375654, 2799245, 255014, -2192044, 750009, -143345, -140660, - -111669, 2486249, 1446330, 5308043, 2725694, 1006096, -2287607, 2057289, 1274532, -2216203, - -1680943, -2455648, -1782411, 3464428, 1005022, -3627100, 2006824, -523986, 1997697, 690953, - -1156420, -1107028, 1838783, -1882806, 1266479, 2899640, -943282, -185220, -70867, 1502702, - -2643016, -1220308, 1071058, -820339, 1829119, 1391033, - }, - { - -3240553, -138196480, 21638582, 15132780, 93416, 257698, 2153389, 6693170, -527744, -13149579, - -18536006, 5398774, -9016210, 2876554, -4941897, -17526150, 13278965, -2603824, 8862128, -10551661, - -793495, -3103114, -2103997, 5532992, 1026497, -2782065, 646393, -6059662, -3284039, -1673964, - -574989, -5737540, -1957431, 478352, 625992, 998043, 2784213, 6206765, 5434744, -3370476, - 1595580, -10020159, 798864, 86973, 6475200, 4000225, 2434173, 281857, -1123134, 3989488, - 9838696, 5201743, -465467, 3144990, 3256122, 832150, -1445257, -2656974, 3899830, 1217623, - -4595078, 348429, 4885526, -1164473, 3299609, -2920041, -1319629, -2956548, 4422206, 1916092, - 2520609, 1669669, 277562, -643171, 378494, 1731409, 1341640, 926102, -850404, 33823, - 1830193, 1064615, -468151, 581968, -901406, 290447, 1409286, 139050, -792421, -2236067, - -1218697, -2063732, 469225, -682900, -1683627, 2077690, - }, - { - -635655, 28030030, -4787278, 275952, 2809446, -3928285, 2180770, 959388, -4092567, 7539278, - 4516695, 2870112, 6573985, 5997385, -5480379, -5060009, -8486319, -9501541, -5504001, -3234110, - -5799280, -3948149, 14774687, 1249299, -12250857, -4397510, 2717104, 2151779, 10481331, -1338956, - 6920803, -9919764, 9705552, -14175003, 1381369, -3617973, 10951630, 1991254, -3288871, -2028835, - 3107409, 6665253, 5602248, -5981279, -5427765, 2438468, -6322729, -2621004, 2780455, 144418, - -119185, 599685, 10971494, 4103305, 941135, -839666, -5658620, 72478, 634581, 3029026, - 2640331, -1249299, 451508, 1375463, 3263638, -2381023, 145492, 866510, 252329, -921271, - -3776887, -3224447, -1943473, -1416266, -244813, 1593433, 995359, 1723893, 697932, 181999, - -2101850, -10201, 127238, 307090, 360777, 922344, -667867, 49929, -710817, 1384590, - -231391, 962073, -985158, -265751, -4832, -576599, - }, - { - -5352066, -178341008, 18553184, 36218924, -9794673, 3006477, 1192390, 6875169, -1848447, -2981244, - 9152038, 1577327, -21088826, -14695767, 2327872, -9474698, -1450088, 17266306, 5862631, 907849, - -8510478, 609349, -13677323, -3146064, -1947768, 954020, -5451387, -7602092, -2932389, -390305, - 2736431, 4852776, -1911797, -3580929, 3652870, 324807, 13499082, -3600793, 222265, -6336151, - -645319, -4564477, 7472170, -1990717, 1088774, 2469606, -2935073, -482110, 1149978, 1436667, - -6501507, 1053878, 8319889, 2819646, 2171643, 1250372, 7151658, 3038689, 1942936, -1793149, - -2361695, 952409, -472983, 4170413, 213138, -3434900, 464930, -1746978, 2704219, -1803349, - 2143189, -4041564, -1073205, 750009, -1751273, -84289, 1692754, -1024887, -1114007, -1117765, - 1991791, 25770, -485331, -2016487, -611496, 698469, -2740189, 3419868, -798327, -162672, - 282931, 1008244, 1990181, -191126, 748935, 2534031, - }, - { - 505732, 43532176, 31410706, -14201846, 9379672, -2557653, -5898064, 2621004, 5476084, -2522220, - -1848447, 6633040, 7226283, -6944425, -7693360, -8854612, -17990008, -7288560, -8233989, 5216238, - 5412733, -938450, -9285182, 14983530, -18221936, -11333345, 7590281, 2913599, -5219459, -6527277, - -5544266, 12575664, -6220724, -4394826, 8633421, 2891050, -3405372, -3515968, -1630477, 5967320, - -1745904, -2461553, -2923262, -2750390, 1257889, 1235877, 7416335, 1130650, -8098698, 1614908, - 1065689, 4435091, 674847, 3321084, 805843, 1072668, 1128503, -5778342, 124554, -1205275, - 1373316, -1698660, -4395362, 976031, 1460289, 2221035, 2492692, 1068373, -1417876, 3992709, - -676457, -1443646, 3129421, 3114388, -489089, 5249524, -995896, 255014, 2528125, -1417876, - -15032, 1646046, 2120103, -882079, 708670, -2216740, -1103807, -1293322, 171262, -553514, - -1584306, -696858, -925565, 518617, -553514, 1559073, - }, - { - -2411624, -167409232, 1087701, 38270844, -11051488, -12924093, -3639985, 1688996, 2785823, 4868883, - -2125472, -4271882, 6618008, 6861211, -16528108, -9155797, 7074348, -2963528, 4593468, -4566624, - -9003862, -5295695, 6873559, 2376728, -3350075, -3825742, 237297, -7787313, -5430450, -610422, - 256087, -4984847, 5137318, 2801393, -5122822, -1644436, -3279745, 6568616, -4901632, -5980742, - -12277164, -1778653, -2174864, -6626061, -4545686, 63888, 4526896, 857920, -7904888, -3583077, - 3097745, -5880347, 2828236, -6864969, -1809792, 423591, -513249, 7728257, 4194573, -1740536, - -2687576, -842887, -1541356, -4541391, 2321967, -1257352, -1217623, 1648194, -636192, -3056406, - -1535988, 2197950, 1372779, 1498407, 1115618, 1771674, 666257, 841814, 985695, 2144263, - -326954, -1330903, -1225139, -512175, -214212, -246961, 1031329, 892279, -62814, 133144, - 399969, 1117228, 2509872, 250182, 865973, 549756, - }, - { - 1627793, 35930084, 47619376, -9475772, 7186017, -2797098, -6171868, -1315334, -475668, -2955474, - 4623533, -4149475, 3521873, -2818036, 4665945, -15448460, -1651952, -10280004, 8085813, 7682086, - 2370285, 8300561, 7623567, -22017612, -12101070, -1569274, 1308354, 1483374, 6548215, 1268089, - -1660005, -4760435, 4703526, -12725451, 7685307, 5514738, 3722126, -555125, -3779034, 19327, - -4287988, 247497, -1198833, -686658, 849330, 3546032, 2308545, 402116, 2086817, -3921842, - -1630477, 3525631, 13422, 811749, 370441, -2228014, 1649804, 5740761, -894964, -388695, - 1563905, -1543504, -4543002, 354335, 260919, -1373316, 1770600, 1277216, 121870, 597000, - 494458, -2889976, -1910187, 3060701, 1519882, 4342749, 835371, -642098, 1275605, -2236604, - 1229971, 24696, -2103460, 1319092, -341987, 478889, 2007897, 2135673, -381178, 419833, - -486405, 574989, 486405, -1516660, 675921, 3187403, - }, - { - 2649458, -117022288, 5672578, 722628, 16624745, 26971858, 35260072, -23047332, 40265, -4355634, - 5094368, 4824322, 364535, 1290638, -19675246, -449361, -6027987, 10659035, -4140885, -6568079, - 2503966, -5331128, -1334661, 9524627, 18268106, 3739306, -6830609, 12685723, 13334263, -2775623, - 1849520, -2918967, 6903623, 17296370, -9009768, -5241471, -383326, 4668630, -8388608, 208843, - -16546362, -11379516, -5926518, 1612223, -4636417, 3444027, 2872796, 176094, -110059, -2214593, - 11409044, -2215130, 9559523, 884226, -10035191, -2222646, -2725157, -1582159, 8973260, 890132, - 1737314, 7091528, 1159641, 1532767, -2957085, 2980707, -1054415, -2731062, 785979, -2646237, - 1627256, -517007, 5611912, -1991254, 1990717, -1289564, -1893544, 2035278, -139050, 928250, - -1969779, 4495757, -1903744, 5511517, 3248069, 2123861, 876710, 3474629, -720481, 1621887, - 1130650, -1597728, -1267015, -1081795, 1891933, 1469416, - }, - { - 182536, 1384590, 536334, 3888019, -8990977, 3884798, 21963390, -15024332, -12039330, 17225504, - -672699, -12273406, 7572564, 8241506, 6691559, -13831405, 1008244, 14966350, -7894150, 6423124, - 18478024, -4495757, 7373922, 8949101, 2152852, 722628, 4794794, -3577708, -1184337, -3071975, - -17761838, 517007, -15247134, 3128347, 10332618, 9731859, -7978439, -9262634, -3629247, 4366371, - 7357816, -6112812, -5490579, 5298916, 8902393, 2204392, 571768, -8278550, -1268089, -3875134, - 3921842, 119185, -5471789, 4508105, 694174, -27917, -6150930, -4989679, 1360431, 818728, - 2901251, -4488241, -891206, 494995, -6315750, 4013647, 586263, 2291365, 1706713, 710280, - -2251637, -4131222, -512175, 3955128, -4677220, -2513630, -210990, -1127966, -1204202, 674310, - 413391, -467615, 3891240, 1979980, -2574833, -897648, -1830193, -289910, 516470, -871342, - -689879, 1407676, 2547989, 493921, 173946, 312459, - }, - { - -16466905, -55472724, 5712307, -12472048, 10007811, 38982732, -14485851, -4619774, 6554120, -933082, - -9547712, -12702366, 9294846, -4795331, -32320702, 10569378, 23639500, 15422154, 7853348, 5675263, - 8748312, 2717641, -5953899, 4359392, 6645925, -4410932, -1462973, 4880157, -2610266, 8136816, - -1250909, -8701067, -1774358, 11791833, 2426657, 6451041, 7108708, -1437203, -266825, -7942469, - -3551938, 1716376, 816581, -2465848, -4601521, 2347737, 5405753, -2994129, 5369, -88047, - 2142652, 2645163, 197032, 1718524, 2122251, 1135482, 7301445, -3087008, 1117765, 2182917, - -1225676, -7949985, -1134408, 2759517, 1044751, 2592550, -3839164, 1092532, -1248225, 1034013, - 207769, -643171, -2353642, -588411, 2490544, -2876554, -325881, 268972, -588411, 500364, - 3110630, 1382443, -1810329, 1032940, -2059437, -1452236, 228707, 100932, 998580, 426812, - -1676111, 141734, 1461363, 190589, 755377, -43487, - }, - { - -156766, 24595668, -14724222, 12851079, 7106024, -12699145, -10214506, -16578037, -7326678, -667331, - 3235184, 5109938, -13132936, 22534620, -5306432, -5339181, -3058017, 21334714, -15519327, -3597572, - 7798587, -6481106, 26596048, -10619844, 4167192, 5345087, 2281702, 22631256, 9607305, -5025112, - -5209796, -19196894, 203474, -6746857, -7268159, 1022202, -4719632, 3328600, -3515968, -834834, - -9080635, 5892695, 907849, 10632728, -472446, 6615324, 2253247, 4923107, 891743, -1423782, - -1484985, 3832722, -3567507, -4375498, -5739687, 1516660, -4820027, -4005057, -641024, -562104, - -2397129, 1466195, -722628, 3201898, 3542811, 436476, 1953136, -923418, -4478041, -595390, - 648003, -160524, -2597382, 4352950, -1946694, -4983236, -112206, -3718368, 1302986, -179315, - 792958, 775242, 561030, -2534031, -3493419, -3835406, -2223719, -685047, -511101, 1373316, - -1378685, 2743410, -644782, -328565, 1341104, 310311, - }, - { - -12941273, -73660296, 5891085, -8218420, 13671955, 35088272, -5046050, 1278827, 23912230, 16773995, - -1375463, 13080323, -9847823, 9853192, 23427436, 21769578, -2120640, -7126425, 15808701, -1105417, - 605054, -14010720, -2161442, 9725953, 998043, -758599, -286152, 5637682, -4108136, -2298344, - 2172717, 1886028, -10172630, 542240, -8941585, -1626719, 3118683, 3325379, 1633698, -8078297, - -8130910, -4361003, 2872260, 1948305, 5151814, 2556579, -1871532, 2545842, 5425618, -6132677, - 6739341, 2157684, 996969, -942745, -6080063, -347892, 6453189, -2352032, 4364224, -1345399, - -2491081, 554588, -4417374, 460098, -3364033, -3292629, 3840238, 3949223, 5763846, -1936493, - -1975685, 5970542, -820876, 503585, -26307, -2046552, -557272, -1280437, -127775, -1521492, - -2777770, -552977, -1430761, -5114233, -2028298, 538482, 1045288, 742493, -981400, -869731, - -348966, 2163590, -2102387, 695785, 772557, 187368, - }, - { - 1104344, -27430882, -17577154, 7247758, -3838090, -5990943, 9140227, -7703024, -5720360, -1101122, - 4491462, -1957431, -977642, -10303090, 62797252, -11200738, -3979287, -5840619, -4023311, 1027034, - -4477504, 30012694, -6815040, 7525320, -3961034, 5836324, -4818417, 5458367, 7078643, -1068910, - -24263344, 5137318, -4430259, 6424198, 11887933, -4487167, 14073534, -8446053, -8886824, 1415192, - 1388885, 496069, 7432978, -308164, 107374, -1630477, 930934, -1133871, -3574487, 6906308, - -1468879, -1639067, 3863323, 5312338, 3329674, 4348655, 4718559, 2205466, 4739497, 5924371, - -1498944, -8489540, 1382443, 2840047, 3922916, 1879585, -234076, -3624953, 3945464, -781684, - -3200825, 1690607, 4231080, -2085744, 1639604, -2040646, -8680666, -901406, 2103460, 3542274, - -1572495, 4539781, -1886564, 746251, 3160559, 3520263, 1782411, 2885144, -2004676, 950262, - 376347, 90194, -1473174, 1695975, -668941, 1016834, - }, - }, - { - { - -5580237, -1123134, 7883950, 48636208, -21001316, -867583, 6155225, 232465, -9314173, 2343979, - 4431333, 3946538, -5533529, -2787971, 4573604, -66035, -8470749, 2303713, 19322520, -6112812, - -4037269, 4604742, -1548873, 10656888, 7014219, -128312, -7050726, 4125853, -754304, 431107, - 1658394, 4385162, -3128347, -3947075, 6504191, -2436857, -5587216, -2301029, 2148558, 3805341, - 2150705, 3471944, -2257542, -991601, -4100083, 37581, 1479079, 302258, -383863, 3630858, - 4558034, -2697776, -2077690, 443455, 1258425, -3556770, -1695975, 1806571, 93952, -779537, - -421981, 2001455, 632971, -1328219, 3563749, -162672, -1124745, -368293, -1499481, 1243393, - 397821, -2436320, 1891396, 685584, -1901060, 2094333, -3306588, -2651606, 1686848, -453656, - -1207960, -542777, 699543, 1655710, 1296006, 927176, -460098, -1505386, 393526, 243739, - -1568200, -657130, -1347546, 302795, 536871, -804770, - }, - { - -1407676, 45065480, -16638166, -13638132, -14268955, 1729798, -2289218, 3485366, -1409823, 9403831, - 642098, -7870528, -5976984, -714575, 4294431, -34897, 14617921, 1475321, -416075, 8972187, - 14626511, 10851772, -1653562, 2135673, 11511049, -3296924, -6132140, -10415833, 8432631, -13402445, - 942745, -15581604, 8850317, -16712255, -5666673, 2260764, 466004, 3407520, -2226404, -328565, - -3226057, 6648610, -1369021, 9892383, 2058363, 2047089, -2659122, -979253, -1908039, 1639604, - 2302103, -674847, 1468879, 863288, 664109, -2403034, 2020245, -2061047, 2803540, 2454574, - -1800128, -476741, -2643552, 2379949, -72478, 2086817, 843424, -5369, 371515, -1012002, - 1051730, 476741, -599685, -2442226, -917512, -1502702, 544387, 1414118, -1122060, -1906966, - 570157, 1341104, 2003065, 584116, 784905, 340913, 1012539, 1464047, 377420, -1002875, - -271657, -219043, -1077500, -1119376, 823560, 489626, - }, - { - 1024350, 75613440, -12023224, -2294050, -18450642, -2206003, 5165772, 5546951, -8269423, 10694469, - -4769025, -4914517, -7421167, -159451, -3281892, 2527588, 11564736, -2209224, 387621, 1400159, - 5056250, -1786170, -1893007, -7520488, 5860483, -7716983, -11616276, 2348810, -9831180, -3965866, - 999117, -3866008, -4960151, -230318, -10477036, -822486, 7496866, -1520955, 3123515, 322123, - 46708, 3628711, 2538863, -2538326, -10142565, -273267, 4025995, 774168, 4123706, 960462, - 2433099, -5641977, 3785477, 1902134, 171262, -1351304, -416612, 1284732, 1633698, 2658048, - -317828, 3137474, 2010582, 3302830, 909996, 398358, -1127966, 3819837, 1038308, -1360431, - 1227824, -657667, -2498597, 2517388, 796716, -1400696, 2476049, -1620276, 1357210, 2407866, - -1956358, -1055488, 1745904, -2281165, -593779, 1007707, -1349157, -384936, -204548, 1799591, - -577673, 284542, 1415192, -645856, 1034550, -41876, - }, - { - 5288179, -154425552, -1940252, 30995168, 4930623, -4924180, 3680250, 3307125, 2174327, 4851166, - -9786083, 1971390, -8790724, 4435091, -202937, -12971875, 6714108, -1589675, 11576011, -12164421, - 1092532, 1425392, 4815195, 10146323, -454193, 3590056, 9750650, 5530844, 5268851, 1116155, - 1038845, -4502737, 578210, 3614752, -1596117, -5927592, -2521683, 3858491, 6651831, -1280974, - 7834557, -3913789, 5009543, -2179159, 2666638, -1760937, -3463891, -2749853, -1530619, -110595, - 1866700, 523986, -3147674, -1494112, -2531346, -690416, 1240709, -2180770, 2441689, 2314987, - 638876, -4244502, -1739999, -2880313, 3089155, 115964, 2008971, -1287953, 1067299, -716186, - 1564442, 1971390, 2849711, 464930, -73551, 864899, 19327, -1907502, -1480153, -237297, - 314606, 46708, -595927, 542240, -996969, 585726, 1600949, 332323, 1133335, 454193, - 347892, -1345935, 723165, -183073, -2300492, 918586, - }, - { - 259309, 47843788, 8533563, -4469987, 1637993, -2551748, 1142461, 4971425, -1661616, 4014184, - -5127654, -4642860, 585726, 3207267, -4494147, -541166, -4427575, -8473434, 4470524, 4404489, - 3558381, -4349728, 4052839, 2083059, -6237903, 3508988, 2386391, -4023848, 3112241, -11778411, - 3625489, -4329327, 14307610, -6175626, 3527779, -10550587, -166430, -3970161, -105227, 457414, - -2501282, 5916318, 4483946, -7068443, -7503845, 3256122, 192737, -419833, -503048, -3452617, - -224412, -3893388, 371515, -1729798, 1073742, 3083250, -809064, 3013993, 396211, -89121, - -402653, -3914326, -2748242, -1774895, 1861868, -4206921, -310311, 1564442, 3705483, 2771328, - -1928440, 1500554, 1695438, -336618, 671626, 227096, -2369748, 265214, -1065152, -878321, - -2135136, 1818382, 473520, -781684, -950262, 964757, -789200, 584116, 328565, 102005, - -1407676, 1375463, -325344, -108985, -950262, -1387811, - }, - { - 8839580, -168851264, 14162655, 63670204, 1480690, -7216619, 2728378, 15695421, 1055488, -5820218, - -1726577, 4419522, 230318, -7284802, -3466576, -9909563, -10934987, -3102577, 3849901, 14871324, - 4512937, 7500624, -3944391, 6177237, -2879239, -2192044, 2976412, 1762010, 620086, 3482682, - -99321, -4755066, -6258841, -5257577, 1077500, -3065533, 7869991, -3888019, 639950, -5231807, - 4981625, -1946157, 6698002, 757525, 1555852, -2583423, 727460, 7850664, 5712844, 5958194, - -3278134, -1608465, -621160, -5947993, 1282585, -50466, -2952253, -5415954, -201327, 1688996, - 1085553, -169114, -1540820, 4373888, 358630, -4434554, 1387274, -2173254, 2420751, 217970, - -214212, -5638219, -1154273, -593779, -1684701, -2148021, -100395, -831613, 46171, 619012, - 1909650, 2020782, 3022583, -1393717, -144418, 627602, -3042984, 1238024, -2393371, 415001, - 9127, 215822, 944356, -841814, -63888, 1245541, - }, - { - -2001992, -9344775, -17547088, -10288057, 7628399, -2590402, -2787971, -1685238, 484794, 2377265, - 2032593, 3523484, 6793565, -10364830, -5282273, 785979, -4330401, 10135049, 7559680, 15401216, - 10908143, 5261872, 469225, 22019224, -10349797, -4401805, 6665789, -728534, -2379412, 3100967, - 4056060, 7071127, -6314676, 605054, 1719598, -438087, -597537, -3310883, -912681, 2948495, - -6094559, 594316, 252866, 5225365, 4839355, -3306588, 1779727, 797253, -3073049, 6994891, - 2163590, 1103807, -5753109, -2741800, -2667712, -347355, 2716567, -2072322, 1677185, 778463, - 2467996, -2629057, -6250788, 404264, 835371, 854162, 1949915, 2138357, -467615, 4386772, - -1285269, -4734665, -454193, 513249, -322659, 3924526, -3111167, -709207, 1312113, 193810, - 2136746, 1083942, -261456, -1561221, -366683, -2267206, 2099702, 1142998, 607738, 525597, - 442382, -635655, -293132, 1541893, 217970, 1362578, - }, - { - 5106716, -155342528, 14409615, 58158688, -1643362, -9759776, -913217, 4684736, 8438000, 5291937, - -9948218, -3788698, 10312216, 3459596, 2989834, 12700218, 3854733, -5487358, 14439143, 5193153, - 488016, -2331094, 3548717, -4881231, -3352222, -824097, 4048007, -3395172, -3500935, 2660195, - -2985539, -5784247, 6077379, -511101, -6487548, -973347, -6470368, 1245541, -3672734, 983548, - -3408594, 1880659, 129386, -849330, 1821066, 381715, 2285460, -455267, -3420405, -2026151, - 3216931, -4788889, 7963406, -1951526, -2549063, 244276, 162135, 5970542, 474594, -2602750, - -873489, -78920, 328028, -4378719, -1762010, -3267933, -2188823, -707596, 202400, -2525978, - -2103460, 208306, -404264, 372588, 303332, 203474, -427349, 1059783, 548145, 2509335, - -310848, 586263, 179315, 88584, 845572, 590021, 1721745, -258772, -442919, 216359, - 437013, 213675, 417149, -1348083, -1035624, 471910, - }, - { - -2297808, -35518844, -18936510, -8089571, 8660802, 639413, -2272575, 2049773, 2415919, -1067836, - 4008815, -9450539, 3056406, 803696, 6163278, -6401112, 4874788, -6835978, 1421634, 9620190, - 4207994, 2905546, 5750961, -17559974, 3876745, -3215857, -2073932, -670552, 508954, -8988830, - -3765613, 4239133, 4256313, -11220065, 3508988, -3722126, -249108, 2643016, -643171, -2528125, - -6578816, -4272419, -536871, 1058173, 1624035, 3558381, -1182190, -1347009, 2280628, -2004139, - 387621, 1248225, -605590, -497679, 301721, -3926137, -2487323, 4259534, -132607, -380105, - 2608119, -495532, -2457258, 1178432, 920197, 198642, 2409477, 299574, -2700998, 149250, - 1042066, -391916, 228707, 241055, -1583769, 2323041, -16106, 528818, 2499671, -1853278, - 1640678, 2740726, 792958, 506269, -1229434, -471910, -679679, 1118839, 356482, -329639, - -1109712, 466541, -763967, -918586, 387621, 743029, - }, - { - -2330020, -108627776, 11405286, -1995549, 7025493, -6475200, 5696201, -14897094, -957778, -12432320, - -8301098, -2168959, 1474784, 16939352, 2749316, 2895345, -3278134, 1933272, -12819404, -6365679, - 280784, -2782065, -5810554, 2294586, 6771553, 375273, -6433324, 4459250, 3579855, -16373489, - -445066, 1047435, -5345624, -822486, -11328513, -2175938, 3423089, -1680943, -14807973, 4946192, - -3959423, -1916629, 217433, 11978664, -6214281, -3885335, -682900, -2953327, -5162551, -5465883, - 4439386, -5515275, 3818763, -1687922, -3292629, -2147484, -1723893, -121333, 6345278, 878321, - 1976759, 5166846, -562641, 2050847, -775778, -37581, -1808181, 1009854, 2740189, -379568, - 1422171, -1505923, 2224793, -4267050, 2039573, -1081795, -1305133, 5099200, 2309082, 1480690, - -1024887, 3269544, -5826660, 3719442, 2655364, 628139, -886911, 242129, -2440078, -565862, - -645856, 415538, 1403917, -847182, -453119, -1448478, - }, - { - 302258, 47582868, 23283554, -12269111, -14366129, -4854924, 17277042, -4396436, -12868796, -1030255, - -6917045, -4640176, 13140452, 5979132, -16908212, -21921514, 7231115, 17324824, -8587250, -1075352, - 11536282, -4189204, -3089692, -7046431, -3489124, -4295504, -7356205, -3184718, 8293045, 1656784, - -11090679, 1262720, -18966038, 5645198, -1963337, -1423245, -445066, -3059091, -452582, -1538672, - 2447595, -799938, -1722819, 4176319, 3595961, -1593433, 2641405, -6226092, -2531883, -3528853, - 5328981, 1063541, -4232154, 3222299, -1398012, 2815351, -3147674, -6886980, -1328756, -2213519, - 1913408, -2738042, 1871532, 3023120, -1963337, 4701916, 831613, -1129040, -3053722, -524523, - 826244, 522912, 544924, 2741800, -4196720, 339839, 2789045, 4919885, 838592, -355409, - 542240, -1273995, 1268089, 3359201, 2311229, 2423435, -1389959, 252866, 2317135, 1752884, - 165356, 414464, -475131, -1311576, 253403, 201327, - }, - { - 18649284, -36027260, -11380590, -9975598, 1591285, 5653251, -33064268, -3752728, 4507568, 3874061, - 10314364, -579284, 14125611, 7300371, -11055246, 15545634, 6929393, -2354716, 5433671, 1941325, - -2395518, -2779381, 526670, 11882564, 10935524, 215285, -755377, -2811593, -1532230, 5479842, - 4201015, 3362423, 3534758, 3596498, -5523328, 5702643, 2815888, 1853815, 4413616, -1924145, - -3320010, 903554, -1924682, -6294275, -4056597, 2754148, 2451353, -1439351, 4583804, 1304596, - -4224101, -4461398, -577673, 1519345, 6253473, 3927748, 3773129, -4190814, 3455838, 3300146, - -270583, -3652333, 1715839, 3564823, 280784, 4089883, -2332704, 2788508, 2589865, -122943, - -812823, 1668058, -2729989, -979789, 2674691, -1325534, 889595, 1626182, 766115, -156766, - 2146410, -193274, -4174708, -925029, -1283122, 641561, 604517, -1373853, 1182190, 151934, - -1202054, 1028645, 177167, 323733, 2636573, -1350230, - }, - { - -309775, 51508468, -3123515, 5962489, 3328063, -3793530, 1098975, -6655052, 573915, -2846490, - 2707977, -1261647, -4935455, 31899796, -20039780, -18744848, -5115306, 19807316, -11359115, 2491081, - 9315247, -10278930, 15655156, -17559436, 2446521, 1119376, -11853036, 76773, 511638, -637803, - -239981, -8305930, 9068823, 12053289, 6619082, 7365332, -6483790, -7821136, -13160854, -395674, - -2099702, 681826, -4830228, 10033580, -4409858, 676994, -3682935, 557809, 601832, 564788, - -3002719, 1931662, -1295470, -949725, -1151051, 3071439, -1891396, -2813204, -3325379, 319975, - -3618510, -178778, -1579474, -1580011, 694711, 2325188, 1326071, -1032403, -3264175, -960999, - -36507, 1146219, -3951907, 3787624, -20401, -4559645, 1302986, -1277216, 1662689, 84289, - 2462627, 2556579, 1114544, 189515, -220654, -558883, -1510218, 1215476, 767189, 1522029, - -964757, -526134, -3875134, -1654636, 955093, -271120, - }, - { - 14489072, -62824636, -12155831, -12476343, 1893007, -251256, -27172110, -644782, 1166621, 1511292, - -5588826, 14911053, -12731357, -268972, 10906533, 5854041, 8814347, 5618891, 9686762, -8505646, - 1978906, -11049877, 706522, 10814728, 4934381, 1847373, -2423972, 9083319, 1831804, -298500, - -1088237, 4459250, 1887101, 11442330, -5356361, -7654706, 633508, 846645, -1037772, -5337034, - -6135361, 2532420, 1549410, -663572, 6736656, 5049808, 6556268, 3513820, 944893, -5537824, - 11789148, 3036542, 4166655, 5380521, 2564632, 2645163, 6045167, -5341866, 4174171, 800475, - -4409321, -1874216, -2309619, 573378, -1212791, -635118, 1628866, -565325, 1708323, -1709397, - -2449742, 5796595, -1939178, -945430, 386547, 50466, 952946, -995359, 1075889, 811212, - -1879585, -964220, 864362, -889058, -297963, 547608, -80531, -1082332, 81068, 746787, - -273804, 2827699, -728534, 1381906, 331249, -822486, - }, - { - -343061, 16943110, 9826348, 6995428, -3531000, 2289755, 13439490, -4114579, 4097399, 3203509, - 6150930, -4856535, -789200, -19245748, 47896400, 418759, 25931938, 12869870, 8022999, 9087614, - -18212808, 14219563, -7045357, 3505767, -7062537, 10437307, 1217623, 10853919, -2304250, -3385508, - -18143552, 1496259, -5369, 8312909, 7293928, -1672353, 10641318, -11121818, -3334505, 818191, - -5049271, -2239289, 11081552, 6257231, 3525631, 564251, 826781, -1131724, -3150896, -210453, - -4556424, -1314260, -3555696, 867583, -344134, -663036, 134755, -4023848, 862752, 1507534, - -1188632, -6374805, -3353833, -1533840, 1921461, 2355790, 2309082, -1506997, 3866008, -1630477, - -4528506, 1836099, 2595771, -3771518, -2231236, -1093069, -5104032, -2398202, -1697049, 2609730, - -1612223, 4832912, 274878, -304406, -97711, 1267015, -1044214, 1794223, -539555, 574989, - -255014, 184684, -1313186, 2856690, 568546, 2210835, - }, - }, - { - { - 3358665, 41445360, 745177, -14806900, 21341692, 6475737, 1285806, -4821101, -8631811, 2261837, - 5295158, 1830730, -1499481, -2285996, -4004520, 8824010, -11261941, 5379984, 4575751, -13863081, - 10123238, 1299765, 6484327, 9695889, 3599183, -6009196, -3377455, -2344515, -3105261, 2927557, - 10606422, -1738925, -5442261, 54224, 4498978, 2369211, -11208791, 2577517, 689342, 311922, - 741956, 692027, -1195075, 1307818, -3664144, -4475356, 2946885, -2401424, 6097780, -919123, - 2073396, 1946694, -2732136, 605590, 1012002, -1221918, -1872606, 3379066, -740345, 1654099, - -305480, 2408940, -192200, 401579, -257161, 2079838, -5246303, -1930588, -101469, 733366, - 1993939, -1833414, 204011, 1420560, 1020055, 626528, -3180423, -1483374, 668404, -2022393, - 171799, -2330557, 2637647, 111669, 1286880, -402116, -221728, -961536, 357556, -740345, - -1020055, -1511292, -900333, 495532, 432718, -1614371, - }, - { - 1781875, -12859669, 29088202, -25977572, -11693585, 335544, 2014877, -203474, -2689723, 7455527, - -1044214, -4296041, 4210679, -12995497, 4689031, 5512591, 4221953, 2529199, 15090368, 6987375, - 4556424, 13790603, 4830765, 670015, -326418, 5251135, -6210523, -8384313, 2348273, -3877819, - -7975755, -9563818, -3572339, -6389838, -2215130, 3293166, -2608656, 1761474, -530428, 997506, - -6016176, 4922033, 6538014, 169651, 5858873, 3132105, -1699196, -3306051, -1235340, 226023, - -2102923, 3777961, 1365263, 3325915, 252866, -952946, -1694902, 1647657, 2781528, -229244, - -865436, 2194728, -3999688, 1248762, 1213328, -1015223, 1942399, 1312113, -1190780, 486942, - 2371359, -376347, -1821603, -385473, -833224, -1462973, 28991, 2687576, 170188, -3925063, - 1657321, 2888903, -194884, -27917, 334471, -344134, 1554241, 1129576, 799938, -802085, - -450435, -667867, -568009, -169651, -1104880, 120259, - }, - { - -661962, 83619256, -11442330, -39215200, 12374338, -2245731, 5437966, 4395362, -5590437, 2358474, - -3707631, -9755481, -2259153, -1910187, -2192044, 7823283, 5782637, 7824357, -5817533, -1625108, - 2508798, 7205882, -12069395, -5310727, 2818572, -9854266, -5144834, -4101157, -230854, -2003065, - -6898255, 1593970, -4415227, -9203578, -2980707, 789200, 8840653, -319975, -390842, 1340030, - 2404108, 476741, 1786170, -3179887, -2521146, -2801393, 3641596, -1959579, -434865, 3288334, - 905164, 1074, -1868848, 3711389, -486942, -1325534, 3460133, -1649268, 2464774, 3300682, - 947040, 4097399, 446677, -947040, 4537096, -1741072, 856309, 3041374, -1756105, -752693, - 1498407, 2514703, -5114769, 2151779, -1237488, 2868501, 663036, 1494649, -1036161, 3693672, - -2651606, 674847, -525060, -1481227, -1336809, -239981, -558883, -1030255, 768262, 493384, - 1080184, 708670, -416075, 1174137, -740345, 582505, - }, - { - -6277632, -132227544, -3623342, 43730284, -3595961, -4878546, -528281, -1273995, -747324, 13734769, - -6146635, -6441377, 861141, -2933463, -1654099, 1483374, -1406065, 2815351, 5409512, -1446330, - -4392678, -449898, 6030134, 12524662, -6014565, 6160057, 7909719, 10733123, 7369627, 1862405, - -2864743, 5260798, -4515621, -2373506, -1093606, -8824010, 7289633, -881542, 4981625, 1772748, - 3576634, 4964982, 549756, 1235340, -1211718, -10474351, 3634616, -3547106, 1407676, 198642, - -2080375, -200790, -2150705, -3382824, -4295504, 979253, -962610, -75162, 1465121, -957778, - 6794102, -4409858, -6713571, 164283, -445066, 2622078, 3819837, -1750736, -1231045, -138513, - -1071058, 3371549, 3896609, -507880, 980326, 312459, -852551, -1712081, -1676648, 801011, - -826781, 631360, 372588, -1519882, -429497, 967978, -533650, 548682, 1482301, 2884071, - -904091, -605590, 1157494, -1069447, -998580, 215285, - }, - { - 281320, 37402724, 17882634, -5386963, -2141578, -184684, -398895, 4208531, -877784, 2753074, - -2965675, -5557151, -4142496, -2632278, -6444599, 204548, 7814156, -12488154, 5116380, 8832063, - 2147484, 639950, -4929012, -5658083, 9268539, 809601, -2844879, -1946157, 608812, -15928960, - 2517388, 7178501, 3460133, 4494147, 4310537, -13616120, -3213173, -5859409, -1966558, 10151155, - -9613211, 7141994, -636729, -3694209, -6050535, 3098819, 1915019, -3277060, 617938, -1176821, - -3033858, -5024575, -799401, -1758789, -226560, 5490579, -599685, 1476932, 2626373, -1494649, - -1520418, -3845070, -2419140, -97711, -296353, -4083977, -2837900, 3992709, 2108829, 1756105, - -478889, 2459943, 2598992, -245350, 993748, -341450, -1922535, -5906, -1726577, -1278290, - -610959, 1636919, -1457068, 1150514, -1528472, 322123, -340376, 309238, 280247, 338229, - -504659, 342524, 372052, -430570, 337692, -1771137, - }, - { - -9718437, -123653720, 2782065, 62712964, 2007360, -3588982, -3010235, 11143830, 1813550, 1425392, - -7137699, 3391414, 9423158, -3211562, -10256919, -1899986, -13490492, -10776073, 2793876, 23838142, - 2441689, 612033, 3800509, 7888781, 5633924, -6734509, 917512, 5302674, 3630858, -2567854, - 3818226, -5125507, -9994389, -2036888, -4412542, 2073396, 190589, 1117765, 423591, -3291019, - 4343823, -233539, 540092, 3143379, -636192, 2847027, 1948305, 7809325, 5302137, 4073240, - 2355790, -3570729, -5655935, -3391414, 1685238, -922881, -5982353, -6103149, -2663954, 4260071, - 1814087, 1076426, -525597, 819802, 1192927, -3176128, 501974, 137439, 722628, 2192044, - -1453846, -4071092, -2729452, -139050, 147640, -3119220, -2188286, -746787, 310311, 1064615, - 1262184, 1610613, 2465848, 813896, 267899, 470836, -1350230, -2534568, -268435, -102005, - 673773, 453656, -1197759, 309238, -894964, 716186, - }, - { - 406948, -25714506, -17838610, 2356327, -4298726, 1993939, -2018635, -1209033, -4104915, -559420, - 8071854, -3611531, 5528160, -4341138, -5879274, -8618389, 1861332, 16190953, 11252814, 12919262, - 5783174, 9134322, 12697534, 3146601, 6912750, -5226975, -460635, -4016331, 10463077, 5080410, - -1604170, 1770063, -97711, 7358353, -9583146, 3317862, -3071439, -1280974, 5978595, -6382859, - -6076305, -542240, 5733245, 5687074, -2338073, 1562294, 184684, -2348810, 2907693, 6700149, - 142808, -3448859, -2204929, -417686, -5598490, -1405528, 3135326, 1633161, -1772748, 1368484, - 1803349, -3841312, -1887101, -1364189, 1983738, -113817, 3008625, 684510, 1622961, 765578, - 1422708, -3639448, -2616172, -1168231, 2055142, 516470, -1247688, 41339, -830539, 394063, - 1898912, 2815351, -2776696, -282931, -2481417, 151934, 1570347, 943819, 971200, 591632, - 788127, -650688, 563714, -140660, 1045825, 397284, - }, - { - -5845988, -124948648, 13674102, 46074800, 5691369, 1279900, -10353019, 4950487, 10102300, 4163971, - -10801843, -4137664, 12138651, -187368, 14730664, 9879499, -13614509, 11825656, 7239168, 9444633, - -3990562, 868657, -3526168, -3116536, -2388539, 2592550, 3252901, -327491, -584116, -3163780, - -3475702, -46708, 5021354, -2316061, -6335614, 1085016, -615254, -8928700, 1035624, -944893, - 816581, -4377646, 303332, 4358855, 4935455, -960999, -3474092, -1349694, 2670933, -2913062, - 247497, 1296006, 1656247, 1625645, -346819, 547608, 419296, 509491, -760746, -653909, - 1478543, -3309272, 246961, 1187559, -4696010, -858993, -2000918, -3679176, 1410897, -2343979, - -782221, -1985349, 1214402, 179315, -785979, -275952, 130460, 1415192, -249108, 1071594, - 314069, 1540820, 887448, 882079, 270583, -928787, 3042448, -612033, -368830, -628139, - 1133335, 645319, 365609, -1844152, -2250563, 602906, - }, - { - -1359894, -25210384, -42520176, 4947803, 354335, 2462627, -2866891, 2709051, 664646, 713501, - 3054796, -7429220, -5867999, 7212324, 4478577, 16079821, -13908178, -4055523, 2767570, 6654515, - 5213554, -4742181, -660351, -9738301, 15287399, -9989020, -2332704, 2536715, -2364380, -12172474, - -723165, 3830037, -2783676, 1081795, -6444062, 2073932, -2891050, -4217121, 3897146, -4520453, - -1495722, -8157217, 1650878, 2138357, 2477123, 840203, 1801739, 445603, -971736, 1376000, - 417686, -2535641, 2913599, -1282585, 833224, -5254356, -330712, -745714, -818728, 1372779, - 1917166, -659814, 2273648, -2656974, 1727114, 3369939, 45634, 535797, -4300336, 644782, - 974421, 533650, 1132261, -564251, -2344515, 611496, -641561, 1020592, 1484985, 605054, - 1797444, 1627793, 1173600, 776852, 574989, -2104534, -587337, 1289564, 1105417, -313533, - -1695975, 1059783, -1708860, -292058, 869194, 155693, - }, - { - 4374961, -53333832, -38752952, -2828236, 279710, 2722473, -18733036, -8246337, -5542119, -4410395, - -12113955, 4227322, 3421478, 9465034, 10684268, -14937896, 7587597, -4813048, -1433982, 595927, - -10933913, 6358699, -3090766, 2796561, 2108829, -9240085, -232465, 1953136, -4070555, -11829951, - -2882997, 5856725, -8445516, -4087198, -8203925, -2934537, 5326297, -8544301, -2644089, 797790, - -3448322, -1872606, 2124935, 7900056, -1407676, -2237141, -2710124, -3904125, -7985418, -881005, - -1045288, 1890323, -2124935, -10426570, 7574712, -3653944, 1241782, -2232846, 5876052, 1642825, - 32212, 6680822, -3215857, 2946348, 156766, -3737695, 2126546, 4091493, -2724620, 2732136, - 1565516, -3042448, 543850, -753767, 132070, 809064, -1074816, 1885491, 2840584, 3132642, - 1809792, -1709934, -3771518, 3592740, 2216203, -397284, 2010045, -4702453, -899796, -807454, - -1235877, 197032, 2843805, -250719, -1729798, -1565516, - }, - { - 445066, 62946504, 7030862, -14821395, -2178622, -6072010, 4540318, 2470680, -7496866, -5434744, - -4169876, 1740536, 7380365, 499827, -25276956, 1893007, 2101313, 4820564, -2781528, -396211, - 33286, 10134512, -14282914, -9805947, 1688459, -10482941, -5600638, 1674500, 6419903, -4490925, - -4780299, -4594542, -9065602, 484258, -6647536, -4644471, 3798899, -1668058, 1658394, -355945, - -6344741, 2681133, 5378910, 1705102, -3199751, 4172561, 1826972, -6934225, -1445257, -2661269, - 5464809, -2170569, -2902861, 313533, 3066070, -711354, -1686312, -3674882, -1104880, -4061965, - -886911, 1703491, 4235375, -1860795, 2300492, 363462, 685584, -1101122, -573378, -2816962, - 571768, 1941325, -664646, 450435, -1545651, 4115653, 1695975, 2764885, 1865090, 717260, - -1036698, -347892, -994822, 2728378, 3450469, 4406100, -1543504, 55298, 946503, 1773822, - 1232119, -504659, -1023813, -877784, 903017, -1407676, - }, - { - -17597018, -31893354, 20425790, 3861713, -2332167, -18909130, -12247636, -2574296, -4063576, 5870147, - 22516902, -5696737, 7556458, 3741454, 17390860, 9228274, -1547799, -5116917, 8491687, 3401614, - -11300596, -2262374, 11927124, 3631932, 7057168, 8889509, -3491272, -7230578, 2117419, 1258962, - 1974074, 12311524, 3582003, -122407, -10569378, 12351252, -959388, 2923262, 2582349, -1016834, - -4014721, -2192581, 1846299, -6163815, -5785858, 7499013, -5199595, 2732673, 4913443, 405874, - -4888210, -2782602, 359167, -2734284, 8242579, 19327, 1711008, -3069291, 5508833, 4158602, - -1420024, 674310, 3947612, 762894, -2427194, 5461051, -2464774, 4869956, 3126199, -3587372, - 1498407, 1842541, -1599875, 345208, -840740, -348429, 2664490, 1560684, -1477469, 600759, - 2597918, -2987150, -190589, -2831994, -129386, 755914, 1319629, -117575, 1279900, -1326608, - -550830, 578210, 479426, -363998, 2026688, -1153736, - }, - { - 855772, 35038880, 10974178, 6101538, -3037079, -618475, 2011655, 2450816, -1271310, -5852967, - 999654, -661962, 8049306, 13871134, -9575630, -13502840, -4079682, 10421738, -11244224, -3278134, - 18411988, 444529, -4735202, -12050604, 4459250, 3207804, -13155485, -11399917, 250719, 11018739, - -12589623, 6671158, 2704756, 17748416, 8076149, 1149978, -6285148, -10488847, -3259880, 1342177, - 12348, -6941204, 759136, -1589675, 3062849, -189515, -4426501, 775242, -1925756, 2468533, - -6817724, 1068373, 556198, 670015, 3130494, -4607426, 5406827, -5494874, -1087701, 1926293, - -3706020, -4322348, -1549410, 1707250, -1894618, -16643, 4642860, -2203855, -2168959, 389768, - -1559073, 662499, -411780, 813359, -609349, -4738960, 4476430, -1052804, 175557, 988916, - 802622, 3680250, -295279, 3148748, 280784, -733903, -2146947, 3966402, -1098975, -233002, - 1668595, -1661616, -3492882, -3816079, 885837, -594853, - }, - { - -13685913, -59331752, 22281216, -5616207, -10701985, -8348880, -14110578, -6646999, -8588861, -30602, - -8908836, 12920872, -6344741, -7691213, 10653666, 335007, 13135621, 4803921, 4440460, -3177739, - 1166621, -6994891, -8177618, 16373489, 2903398, 1805497, 3715147, 2171643, -248571, 1190780, - -1853815, 5412196, 3685082, 7421704, 5298916, -5840082, -4784594, 906238, -914828, -4389457, - -4236449, 6613176, 2022930, -5393942, 4714801, 5366025, 9015673, 5763846, -6790344, 5377836, - 5564667, -197032, 6764574, -937377, 9164386, 4321274, 2927020, -935766, 673773, 288837, - -3320547, -5019743, -503585, -729608, 2336999, -1317481, -49929, -945967, -1431298, 2068564, - -1430224, 1021129, -1285269, 1989644, -1504849, 2090039, -2204929, 2127620, 416612, 2056216, - -1496259, -1352915, -784905, 2218351, -591632, -475668, 958851, -2059974, 504122, 545461, - 43487, 229781, 1893007, 1335198, -33823, -1895154, - }, - { - 1270774, 48639968, -17685602, 9039832, 4757213, -2509335, 3039763, 8082592, 2617783, 4611721, - 4147328, -4211216, -5896453, 24463596, -7516730, 18651970, 15097347, 21662204, 460098, -1141924, - -449361, -2019172, 264677, 5668820, -11071352, 11163157, 5770826, 3868155, 4418448, -3258807, - -19270982, 3101503, -317291, 10475962, -511638, 5130339, 2458332, -11278584, 1351841, 2876018, - -7458211, -767725, 10244034, 3440269, 5239860, 5632313, -5450851, 2345052, 1809792, -3336116, - -6158446, 734976, -6674916, -2161979, 271120, -234613, 2387465, -5321465, 719944, -3459596, - 1790465, -3963718, -5577015, -601295, 1373316, 4290673, 295279, 3024731, -2392297, 1627256, - -4376572, 233002, 734976, 922881, -5485210, -618475, -581968, -4218195, -2233383, 1448478, - 846645, 1335198, 1620276, 872952, -535797, -701153, -355409, 23622, 224949, 622233, - -1304060, 951872, 852551, 695785, 1152662, 1522029, - }, - }, - { - { - -2916820, 107800992, 51271172, -41676752, -863288, 295816, 259309, -10057203, -9799505, 801548, - 3963181, 6990596, 1890859, -1534377, -8939438, 8262980, -16124381, 2141041, 3326452, -13269301, - 5778879, -2894271, 490700, 8286603, 4214974, -9178882, -6331856, -3675418, 1148904, 8873939, - 7419556, -3870303, 1420024, 7847979, 2291365, 4649302, -1557463, 5777805, -4410395, -2996277, - -315143, 1551557, -163746, -80531, -2922725, -1722282, 4816269, -2956548, 6185827, -2241973, - 241592, 4507568, 1210107, 3012920, 1472100, -429497, 424128, 2470680, -3373697, 964220, - -3456912, 908386, -1835025, -3027415, -614717, 3437585, -1902134, -387621, 599685, 1093606, - 1395864, -807991, -1025960, -28454, 1546188, 428423, -1643362, -685047, 117575, -962073, - 859530, -2616172, 1591822, 74625, 478352, -625992, 310311, -760746, -355409, -1974611, - -234076, -905701, -813359, -412854, -558883, 37044, - }, - { - -417149, -55297168, 4265440, -1946157, 9483288, -3519189, -3835943, -510564, -2210835, -1890323, - -5158256, -6119792, 5136244, -9782325, 6226092, -501437, -6021008, -8810052, 2694018, 2948495, - 3330747, 4233227, -6412923, 301721, 2244121, 6182606, -1023276, -109522, 1705639, -2660195, - -2542084, -857383, -24696, -4052839, 2727304, 5502927, -3172907, 5804112, 402653, -1631014, - -3599720, 2397129, 4156455, -6383395, 2741800, 1219234, -1262720, -1834488, -4595615, -3893925, - -2981244, 4370129, 2982855, 5159867, -1071058, -3678103, -2963528, 2410551, 2743410, -2665564, - -2411624, 4693863, -2807835, -676457, -134755, -3050501, 424128, 1161789, 1561221, 2191507, - 1646583, -999117, -1099512, 980326, 1194001, -330712, -902480, 895501, 346819, -2863670, - 561567, -3221, -2397666, -165893, 1181116, 638340, 1369021, 728534, -98247, -892816, - -750546, -350577, 394600, -144418, -697932, 533113, - }, - { - 648003, 54657216, -27606440, -40739376, 18991272, -1089848, 3633542, 5311801, -4984847, -4727686, - -1892470, -8044474, -2066953, -5657009, -6869264, 4503810, 11351062, 17301202, -9540196, -6916508, - -6527814, 2381023, -8207683, -5522791, 7130720, 7325067, 6957310, -973884, 2392297, 2304787, - -3133716, 6038187, -3781719, -6695317, -657130, -391379, 4519380, -1592359, -150324, -450972, - 1602560, -2699387, 4414690, 2186675, -1751273, -6021544, 133681, -4032974, -719944, -581968, - -1878511, 5655935, 493921, 1133871, 3951370, 905701, 2178622, -1865626, 3504693, 5109401, - 972810, 1942399, -265214, -53687, 4567161, -971200, -1214939, -965294, -2806224, -1388885, - -2007897, 1112933, -3477313, 1636919, -3244848, -342524, -2107755, 3517578, -795106, 1512902, - -2178085, 2859375, -26844, -981937, -308164, -967978, -1413581, -988916, 1260036, 78920, - 1355062, 1197759, -284005, 1534377, -454730, 907312, - }, - { - 7413651, -82941728, 16804596, 38582764, -2313914, -1641751, 1611, -2000918, -5486821, 6384469, - -6876243, -1597728, 2760590, -4417374, -3115999, 4031901, 5014911, 1037772, 149787, 4866198, - 126702, 158914, 3280281, 1449552, -7846369, 6039798, 4525285, 8338679, 8209293, 5305359, - 35433, 6193343, -4176319, -625992, -1493038, -7136625, 9097814, -2729452, -2259153, -5530844, - -1590212, 2921115, 146566, 3508988, 290984, -5814312, 7856032, 2020245, 2763812, 2072322, - 1181653, 190052, -1346472, -1526861, -3692598, -649614, -2695092, 1205275, 181999, -5730023, - 3610457, -1368484, -3360275, 1462973, -3131568, -44560, 2189897, -1001801, 279710, 288837, - -1963874, 704375, 795643, -676457, 566936, 1479079, 378494, 607201, -124017, 989453, - -1402844, -389231, -1072131, -1803349, 336081, 609885, -2006287, -1715839, -710280, 1396938, - -121870, 390305, 911607, -1212791, -760209, 598074, - }, - { - 40802, -8419210, -18143552, 1045288, 491774, -1368484, -876173, 4902705, -1624035, -2025077, - -4102768, -2706366, 4101694, 915902, -10259066, -2000918, 6811282, -13655312, -2214593, -1561758, - 92879, 1228361, -12552579, -13429826, 9272834, -3264175, -5994164, 2377265, 5516886, -6438156, - 7018514, 4679904, 983548, 6442, 169651, -11913166, 382252, -1176821, -1561221, 3468186, - -6924024, 7405061, -3667365, 212064, -834834, 1059246, -419296, -2136209, 1083942, -301185, - 132607, 1398549, 448824, -5575405, -4825933, 2805151, 290984, -629213, 1644436, -3555159, - -2748779, -3307125, -910533, 2092723, 654446, -483721, -1089311, 337155, -3053185, -271120, - -985158, 670015, 1824824, -1838246, -1510218, -1373316, 249108, 3030636, 1112933, 1745904, - 1273458, 967441, -2461016, 3448859, -696322, -1475858, -477278, 257161, 731755, 1338956, - 1110786, 1138703, 773094, -892816, 1391033, 620623, - }, - { - 10924786, -80743240, -856309, 46406048, -262530, -9127, -6504728, 2474438, 6848862, 6036577, - 636729, 7953206, 7963406, 9017821, 2553358, 1860258, -10566156, -5950141, -1877438, 9928354, - -3773666, -5415954, 3926674, 4413079, 3757023, 4097399, 4053912, 1759863, -676994, -6704444, - 6274411, 3902515, -3695283, 46708, 2035815, 7681012, 984084, -216359, 2572686, -2089502, - 664646, 750009, -366683, 238371, 617938, 3306588, 3760781, 6473590, 1186485, 3126199, - -537408, -5107253, -1721745, 2653216, 2087891, -848256, -1600949, -2144799, -3100430, 995896, - 1955821, 2899640, 2213519, 554588, 67109, -2588792, 318364, 502511, -367757, 1175747, - -313533, 762894, 1657321, 71404, 439160, -1242319, -772020, 129386, -150324, 501974, - -1160715, -1200980, 1099512, 436476, 820339, 2080375, -91268, -1891396, -433792, -1764158, - 453656, 1399623, -471910, 961536, -666794, -165893, - }, - { - 1117228, -7979513, 2522757, 6463389, -4166655, 2902861, 317828, 3281355, -1847373, -3355443, - 2007897, -7158637, 5235029, 2393371, -4151623, -6818261, 1948841, 71941, -2581275, 4398047, - -5218922, -5002027, 2493766, -166967, 11471858, -6186364, 1303523, -970126, 2413235, 4592931, - 506806, 2625836, 2361695, 13086765, 2121714, 620623, -5582384, -19327, 3470334, -5708549, - -1371705, -2142652, -3153043, -1842004, -5475547, 3146601, 452582, -2094870, 1199907, 1050656, - 144418, -3614215, 192737, 2146410, -1875290, -767725, 2044404, 2522757, -4008815, 1146756, - 3089692, -1972464, 1328756, -857383, -332323, -3407520, 547608, -1652489, -502511, -2784750, - 675921, -168577, -111132, -113280, 1514513, 214748, 834297, 449361, 183073, 137976, - 639413, 2804077, -2492155, 779537, -2494302, -775778, -191663, 549756, 285078, -685584, - -767189, -998580, 669478, -1155346, -801011, -112206, - }, - { - 6838125, -97974112, 13422847, 31324270, -151398, 4628364, -10538239, -241055, -293132, -4109747, - 819265, 2764348, -492848, -7592966, 2426657, -1503775, -21356188, 4702453, -1339493, 6247030, - -6971269, -7504382, -1354525, 4429185, -3284576, 195421, 694174, 4822712, 5385889, -545461, - -1455457, 3641059, 5181878, 581968, -150861, 3527779, 3484292, -4232154, 1371168, -6597070, - -4271345, -7020124, -2552821, -582505, 338229, -3813931, -5771899, -4321811, 1053878, 150324, - -593242, -1209033, -2456185, 412317, -652298, -912144, -2064269, -757525, 948114, -1024887, - 4997732, -259846, 1011465, 3656628, -2966212, 2047626, -521839, -1630477, 2749853, -2937758, - 2050847, -177167, 1134945, 1803886, -236223, -1240172, 1381369, 3051574, -1852205, -1982664, - -663036, 1669669, 1241782, 655519, 550293, -1187559, 1561758, -550830, 622233, -759136, - 897111, 565862, 412317, -818728, -1085553, 119722, - }, - { - 2578591, 30327300, -948114, 6719477, 1137630, 1310502, -2878165, 3393561, 4062502, 1701344, - -1297080, -10256919, -4294968, 7585986, 451508, 8010114, -19254876, -6041409, -1242856, 5138392, - 7309498, -4284230, 3907347, -5696737, 11937325, -16265041, -4146254, 5996311, -6695317, -9436043, - 2841121, 4962835, -5579700, -840203, -6098317, 1629403, -5035849, -1678259, 2570538, -5961952, - 4147328, -3143916, 6242735, -1117765, -966368, 5560909, 5346698, 5675263, 1517734, 1234803, - 388695, -830539, 4746476, -1278290, 941135, -5071283, -1182727, -126702, -194884, 2152852, - 771484, -1531156, 2374043, -3584150, 1138166, 2281165, -1621350, -62277, -4251481, -283468, - 129386, -417686, 119185, 933619, -30065, 901406, -457414, 2226941, 1707250, 346282, - 646929, 581968, 117038, 421981, 1352915, -816581, 199716, 1352915, 1411434, 602369, - -1448478, 1577327, 324807, 153008, 1381369, 1086090, - }, - { - -7584912, -12648679, 3073049, -1243930, -9298604, -10339060, -11609297, 9945534, 9017821, 5571110, - -6490770, 2536715, -6051072, -14862734, -9389335, -10009958, 12486007, -1872069, 18069464, 10988137, - -4108136, 11247982, -3773666, 4939750, -2414309, -6083821, 4271345, -5019206, -4434017, -3178813, - -2978560, 3195993, -6234682, 3653944, 2811056, -4249334, 4596689, -3113315, 551366, -1333587, - -5287642, 4153234, 2071785, -3815542, 1211181, 2077690, -4686883, -591095, -2179159, 2811056, - 394063, 710817, 1818919, -3591667, 9257265, -79457, 4646081, -4043712, 2681670, -1339493, - -5025112, 4270808, -3006477, -137976, -1738388, 122943, 4481262, 3849365, -1705102, 861141, - -198642, -1918777, 2389076, 1960653, 1074816, 1306207, -801011, -589484, 1140314, 2976949, - 1118302, -1593970, -2514703, 991064, -91268, -2044941, 3020973, -2697776, 1281511, 620623, - -878321, 661962, 2449742, 359704, -242666, -1115618, - }, - { - -302258, 32506996, -13065827, -2285460, 12066711, -6499896, -3013457, 21219822, 14478872, 6271189, - 652298, 873489, 3286187, 2135673, -14936823, 4901095, -803159, -8014409, -2915746, -2366527, - -16565152, 3376381, -126165, -2498060, -4734128, -3529390, 641561, -4320200, 3789235, -5444945, - -4886599, 343061, -3894999, 5207648, -831076, -7034620, -1273995, -3095061, 1473174, 5452461, - -6482180, -3937411, 2866354, -2423972, -5934571, 7991861, 5844377, -4831838, 2586644, 3101503, - 5418638, -3748433, -1325534, -4376035, -1694902, -3168612, 2159295, -1394254, -937377, -1890323, - 1496796, -158914, -1171989, -5230197, 674847, -446140, 675384, 640487, -482647, -1541893, - 2782065, -538482, -3750580, 548682, -852551, 1092532, -1271310, -965294, 419833, 178241, - -1221381, 118648, -2356863, -1243393, 330712, 2110977, -2456185, -96637, -935766, -76773, - 1883880, -1092532, -1034013, -196495, -414464, -2630131, - }, - { - 16723529, -31288836, -13479218, 11572789, 5316633, 4074313, 6750615, -4735739, -4016868, 10848551, - 12616466, -17177722, -181999, 1014149, 17685064, -1554778, 2251100, -5112085, 6383932, 15850040, - -5012227, -939524, 10437307, -2018098, -3088082, 4724464, 1840930, -1249836, -1068910, 142808, - 3190624, 7675644, -405874, 304943, -5610301, 12074227, -7218230, -1159104, -3607236, -6702834, - -1359357, -806380, 36507, -5017596, -4481262, 6784975, -4188667, -3991635, -1729798, -652835, - -265214, 2581812, -1714766, -2571075, 8711267, -4366908, -1439351, -2618856, 4904853, 1876364, - 1845225, 4298189, 6097780, 1404454, -5717139, 2791729, -3073049, 526670, -1014686, -1717987, - 4616553, 1086627, -1291711, 3427384, 168577, -448824, 1506997, -3047816, -2291902, 869194, - 2083596, -1453310, 2966212, 108985, 2703145, 1012539, 1949915, 1096290, 112743, -1490354, - 800475, 696858, 784368, 186294, 527207, -1010928, - }, - { - -371515, -622233, -18211736, -190589, 930934, 7208029, 5252745, -1466195, -1127429, -1192390, - 1065689, 544387, 767189, 2914135, 673236, 1974074, -5026723, -958851, -6666863, -1692217, - 26963804, 1431835, -5077188, 6187974, 9123584, 6742562, -7267622, -12684112, -1831267, 12684649, - -2985539, 4452808, -8733816, 9414568, 5660767, 4151623, -1852205, -1983201, 5003637, 5413270, - -1673427, -9217537, -1985349, -7318625, 2039036, -1127429, 1007170, 4072703, -5497558, 3573950, - -3061775, 882616, -1193464, -2871186, 1862405, -1173063, 6984691, -3118683, 1171452, 1404454, - -2524904, -1541356, 1311039, 4105452, 798327, -340376, 3685619, -2570001, -260919, 660888, - -1010391, 1562294, 2246805, -1251983, -1342177, -2595771, 5171678, -1301375, -1391033, -106300, - -1875827, -1943473, 88584, 2838974, -2666101, -961536, 868657, 6038187, -1009854, -1967095, - -246961, -977105, -462246, -2026688, 853088, 828929, - }, - { - 13450227, -46428596, -188979, -1386738, -2246268, 9640591, 1516660, -3279745, -9610526, -5715528, - -9709310, 18945638, 503048, -9895605, 3765076, -1855426, 12399571, -11753715, -6653441, 1882269, - 3761318, -2935610, -12145094, 3760244, 2984466, 6655052, 6208375, -1925756, -3332358, 281320, - -11012296, -7298223, -1417876, 3233574, 8476118, 656056, -115964, 978716, -1277753, 2302103, - 4050154, 5832029, 925029, 18254, 3665755, -1491964, 2864743, 2344515, -5237176, 9452686, - 4940286, -4660577, -2536715, -7424925, 5173825, 2670396, -751619, -3874597, 335544, -2360085, - -3161633, -2529199, -1431298, -3066607, 1323387, -2759517, -509491, 113817, -214748, 4817343, - -1253594, -1127966, -410706, 3055869, -2049236, 2062658, -1285269, 3190624, -568009, 1242319, - -2480344, -1029718, -258235, 1658931, -1837709, -2366527, 1613834, 202400, -261456, -1015760, - -1731946, -1183800, 930397, 433255, 980863, 21475, - }, - { - -1522029, 44431436, -13776108, 5807333, 6426882, 1796370, -1517197, 1987496, -3917547, -1555852, - 162135, 3995393, 1242856, 5611912, -52787296, 5076652, -4063039, 5655935, -4281009, 1450625, - 8773008, -2193655, 3360275, 7594576, -4335233, 9825275, -929324, -2563022, 11356430, 8853538, - -8375186, 3609383, -1927904, 8450885, -8054138, 4631049, 5641440, -4829691, -493921, 4130685, - 1598265, 3277597, 1633698, -7661685, 544387, 6220187, -8312909, 114354, 4201015, 552440, - -1916092, 5661304, -3359738, 47245, 980863, -2141041, 5447629, -1519882, 3577708, -1719061, - 3965329, 1176284, 560493, 5073967, 1457068, 2333778, -1422708, 3823595, 681289, 3896072, - -2076080, 737661, 1204738, 4250407, -1797981, 1617055, 895501, -2791729, -1189706, -334471, - -236223, -344671, 403190, 2025614, 2244121, -1083942, -379031, -207769, -2643016, -2488397, - -1268089, 1513439, 1431298, 1014149, 107911, -1216550, - }, - }, - { - { - 3725347, 151852864, -7415798, -49403936, 12467753, -8353175, 5320391, -7014756, -5769215, -10161893, - 497142, 8489540, 7516730, 888521, -9994389, 4800700, -5044976, -813896, -8276939, 11805254, - -6483790, -9843528, -1766842, 5170067, 6560563, -5349382, -7494718, 2854543, 510027, 12013024, - -2450816, 3411278, 264141, 3609383, 2486249, 5745593, 4810364, -1075352, -2426657, -4806606, - -2875481, 5694590, 1839320, -2442763, -1569811, 647466, 3173981, 934155, 43487, -778463, - 210990, 4693326, 407485, 950262, 807991, 697932, 1245541, -1692217, -643171, -597537, - -3481071, -180926, -28454, -2942053, -855772, 1936493, 1174674, 297963, 773094, 780073, - 635655, 280784, -622233, -1538135, 558883, -257161, -70330, 169651, -265751, -814433, - -637803, -149250, -349503, 1784022, -568546, -141734, 272194, -463320, -125091, -1665911, - -376347, -803696, -53150, -621697, -1924145, 1284732, - }, - { - -512712, -41254772, -11320460, 14525043, 3586835, -3112778, -327491, 988916, -2554969, -5945846, - -7625715, -2208150, 3393561, -7066832, 3883724, -220117, -1915019, -7182796, -4933307, 8498130, - 1420024, -8375723, -1597728, -1921998, 8535711, 1818382, 3792456, -484794, -1976759, -1048509, - 1526324, -985158, -1156957, -489626, -797790, 7478612, -2606508, 3359201, 1609539, -7165616, - 3842922, 1933272, 111132, -2538326, 1017370, -1127429, -4046396, -1681480, -1858110, -2511482, - -44560, 1125281, 1787243, 1961726, -455803, -3485366, -539018, 1195612, -996432, -367757, - 1065152, 1401770, -1467805, -3038689, 450435, -457951, -25233, 585726, 2215130, -514859, - 2402497, -1688459, 348429, 77309, 667331, 190589, -648540, -34360, -118112, -919123, - -74088, -1347009, -2807835, 709743, 1309428, 1302986, -59593, 1866163, -986769, 168577, - -543850, -972273, 649077, -1636919, 67109, 382252, - }, - { - -2159295, -18403398, 28989418, -19910932, 5834713, 1030255, 4808216, -3478924, -1743220, 3124052, - -7895224, -7151658, 4152697, -8655433, 2988224, -9228811, 11862700, 13424994, -2065879, -3796751, - -7421704, -4645544, -1328219, -2727304, 298500, 10648298, 7728257, 5251135, -2880313, 3993246, - 251792, 3020973, -9394167, 2266669, -2241436, 588411, -2381023, -5020817, 7373385, 148176, - 3776887, -6551436, 6682969, -1352915, 1336272, -1724966, -7092065, -2619930, 3189550, -2542621, - 1607928, 1918777, 4070019, -2086280, 3565360, 4533338, -1313186, -276489, 1046898, 3791919, - 466541, 1577327, 904091, 1305670, 1131187, 2926483, -2818572, -1365263, -1502165, -1694902, - -2004676, -753767, 220654, -2225867, -2757906, 761283, -2612414, 1992865, -47245, -683437, - -405338, 1579474, 1699733, -1504312, -784905, 39728, -589484, -1029182, 1030792, -29528, - -320512, 1746978, 321049, 410706, 899796, 922881, - }, - { - -9699110, -43346956, 12327630, 29901026, -2193118, 2097555, -6758668, 1082332, -6198712, 3780645, - -9800042, 7177964, 1542967, -5090073, -4747013, 543850, 18644990, -4753992, 2013266, 3596498, - 115427, -3992709, 7990250, -3722663, 1304596, -2355790, 3640522, 11347840, 694174, 7516193, - 6547678, -649614, -4653597, 1726577, -1739462, -712428, 2976412, 1120450, -5463736, -1934346, - -802085, -4103841, 3742527, 341450, -2937758, 2971044, 3587372, 4392141, 512712, 3403762, - 1830730, 2537789, -2173790, -975494, -2762738, -107374, -2593624, 841814, -3294777, -710280, - -2713346, 1772748, 716723, -2250026, -2588792, 1062468, -797253, 921271, -557272, -782758, - 202937, 599148, -381178, 625455, -1738388, 2943126, -1319092, 2425583, -344134, 602906, - -673773, -475131, -1508070, -1034013, 251256, 569083, -1847373, -1684701, -1114544, 219043, - -671089, 1260573, 1008244, -2350958, -164819, 872415, - }, - { - -982474, -34000036, 1091995, 2455111, -2472828, -1199370, 1427540, 4465156, -1706713, -4683662, - 817118, -7792145, 2736431, -1154273, 6053220, -14380087, 3892314, -6036577, -12287901, 538482, - -391379, -1067836, -10605348, 2258616, -4136054, -2109366, -2491081, 4244502, 623844, 4275640, - 2946885, 496606, 4115653, -4474282, -3634079, -4340602, 3567507, -2740726, -3275986, -2007897, - 2676302, -2931852, 675921, -1411434, 867583, 1865626, -2353105, -2647847, 341987, 837519, - 1687922, 3711389, 2286533, -8127689, -2848637, -455803, 2418067, -3716221, 2266132, -4297652, - -1058710, -119722, -3210488, 1922535, -153545, -457951, 2697776, -2328409, -3071439, 231928, - -1002875, -1126355, 265214, -558883, -639413, -1674500, 432718, 2049773, 1466731, 2241436, - 3157875, -1039919, -1334124, 2590939, 523449, -2716030, 396748, -340376, 654446, 881542, - 2510409, 369904, 1457605, -1374390, 671089, 848793, - }, - { - -14061186, -30544734, -20122458, 45425184, -3114388, 3477313, -414464, 338766, 5948530, -2033130, - 5565741, 11616276, 7416335, -915902, 9391483, -4252018, -3406983, -389768, -2805688, 3321620, - -5235029, -4723391, 2145336, 4337917, 5547487, 6075768, -1098438, -231928, 387084, -5293547, - 4904316, 3539053, 1367410, -4727149, 8500277, 1051193, 3684545, -1226213, 4322885, -2327336, - -91805, -295816, -293132, 3128884, 823560, 3070365, 4311611, 1140851, 3401077, 1275068, - -1779190, -949188, 17180, 4168266, -2544231, 1289564, 121333, -854162, -4050691, -702227, - 3240016, 2682744, 627065, 2553358, -1301375, -2037962, -373662, 242666, 1240172, -1927904, - 375810, 1508070, 1644436, -278099, 1184874, -296890, 418222, -585726, -243203, 1588601, - -1355599, -2290291, 499827, 474057, 774168, 1949378, 358093, -1023276, -942745, -2190970, - 1115618, 512175, 354335, 892279, -316754, -441845, - }, - { - -380641, 1848447, 7288023, -934692, 850404, 1234266, 1894618, 1247688, 906238, 173946, - -2402497, -1598265, -1866700, 11895986, -14882062, 2221035, 1673964, -4900558, -567473, -9171366, - -2360085, 384400, -1584843, 3907883, 2429878, 605590, -484258, 5739150, -2485176, 702227, - 1563905, -459025, 8448201, 7982734, 8090108, -4973572, -2068564, -2967823, -193810, -2968896, - 3313567, -1896765, -6641630, -2633352, -6290517, 2733210, 1326071, -266825, 485331, -3746822, - -1154273, 889058, -2221035, 877247, 839666, 756988, 2647847, 558883, -1571421, -540629, - 1028645, -417686, -609349, 917512, -805843, -370978, -1551557, -2737505, -1508070, -187905, - -2608119, 1817308, 465467, 322123, 797253, -508954, 1251446, 913754, 1611687, -1964948, - 1130113, 893353, -31675, -1105417, -15032, -1506460, -1083406, 660888, -224949, -132070, - -2641405, 832150, -337155, -535797, -1623498, 490700, - }, - { - -10873247, -67457832, -4970888, 28981902, 6393596, 4166118, -3425773, -5793911, -2839510, -901943, - 9901510, -4018479, -2541010, -2675228, -1176284, -14544370, -11366631, 1395328, -4580046, 2097555, - 558883, -9413495, 2472828, 1997160, -4510253, -770947, -1660005, 6158446, 7195681, 2147484, - 1059783, -939524, -2532420, 2259153, 6536940, 3788161, 3369402, -2624225, -1961726, -5594195, - -4602058, -3329137, -3845606, -1563905, -3667902, -2695092, -1549410, -3485366, -3157338, -1467805, - 1280974, -4508105, 437550, -1164473, -1881196, 165356, -1347546, -2257005, 2543695, -1934346, - 4095251, 2805151, -416075, 372588, 1806034, 1417876, -2378875, 2034741, 1321776, -3709778, - 143881, 190589, 2527588, 1832340, -1148367, -1813013, 3855270, 2410014, -2049236, -2200634, - 307627, 1246077, -981937, 1042066, 667331, 685584, -1129576, 461709, 814433, -749472, - -386010, 680215, 893353, -804770, 513785, -664646, - }, - { - 817118, 23875724, 17569638, 3994857, 3549791, -377957, -2434710, 3758097, 6791954, -2390149, - -2426120, -4881231, 976031, 971200, -4012036, -3008088, -7033546, -1286880, -2465311, 820876, - 8701067, 989453, 2229088, 3812857, -6551973, -11631845, -3499325, 2607582, -3479461, -8833674, - 238371, 6682432, -6730214, -3112241, 2141578, -245887, -6582038, -311922, -2616709, 3571802, - -3157338, -2376728, 8212515, -4392678, -2659122, 8089034, 1596117, 9381819, 2231773, -1575179, - 973884, 3266860, 839666, -554051, -531502, -1722282, -482647, 64425, -1373853, 3550327, - 341987, -964757, -1684164, -969052, 2323041, 68183, -927713, -33286, -2906082, -1665374, - 690416, -791348, -324807, 2644626, 259309, 1677185, -584116, 2590402, 860067, -277562, - 522375, 173946, -383326, 896574, -17180, -150861, 1098975, 929860, 1349694, 28991, - -1286880, 217433, 2225330, 455803, 1025960, 224949, - }, - { - 9667971, -18764712, -6197638, 4876936, -12139188, -9232569, 12132209, -3087545, 11878269, -5073430, - -528281, 8045011, -10391673, -16935056, -18538152, 7585986, -969589, -6731288, 20167018, 3446175, - 13596256, 3345780, 4817343, 2099165, -374199, -1537061, -1925219, -3046743, -9737228, 6982006, - -4258997, -3709241, 2462627, 4022237, 2223719, -7334731, 2564632, -777926, 2574296, -67109, - -6949257, 2580202, 4938676, -8790187, 1738388, 563714, -867047, 1245541, -2380486, 1825361, - 652835, 5572183, 613643, -624918, 3414499, 774705, 3350075, -1481227, -1128503, -690953, - -570694, 2118493, -2350421, -4496831, 28991, 1966021, 3867618, 1063541, 1316408, 562104, - -2123325, -208843, 2449205, 4295, 2344515, 787590, 1778117, -2719788, -169114, 2570001, - 981400, -1410360, -1101659, 239444, -736050, -1302449, 1753420, 602369, -94489, 845572, - -440234, 908922, -474057, 925029, 1188095, -1644436, - }, - { - -1637993, 2137820, 5357972, 6243272, 6973953, 319975, -6897181, 20410758, 10465225, 8145943, - 5669894, -2741800, 2665027, -1170379, -3305514, 521839, -2101313, -14817100, 4027069, -11528766, - -4465692, -3935264, -738198, 9000641, -7534983, 1776506, 2984466, -5590974, -4722854, -3365644, - 4524211, -4244502, -2000381, 1283658, 472983, -5109938, -3839164, 607738, 1902134, 6216965, - -4775467, -4907000, 747324, -3121368, -82141, 6257231, -2040110, 877247, 5515275, 1059246, - 3848828, -2976412, 163209, -2975339, -943282, -4672925, 479963, -2096481, 5688684, -3956202, - 2235531, -4596689, -3307125, 912144, -5364951, 863825, 241055, -10201, 1956358, -977642, - 1706713, -1169842, -4663261, 507880, 209380, -1499481, 1494649, -2200634, -3151969, 1487132, - -402653, -1359357, 1031866, -1336272, -838592, -759136, 50466, -1190780, -385473, -1573569, - 1706713, -1249299, -394600, -774705, -451508, -1133871, - }, - { - -15919833, 992674, 1547799, 1680406, -8126615, 16358457, 3307662, -484794, 3165928, -1546188, - 2954938, 112743, 2836289, -10004589, -425202, 2374043, 8454106, 4763119, 3965866, 13692893, - -2634426, -957778, 1162862, 2907693, -5425081, -146566, 1723893, 3597572, 1267015, -676457, - 2863133, 2413235, -2197413, -923418, 8318278, 3701725, -3963718, -5705327, -1755031, -4176856, - 2674154, -5996311, -2869575, -2975339, 813359, -5042829, 5612449, -8195335, -4351876, 1376537, - 739271, 811749, -2172180, 2631741, 5672578, -3507378, -1185411, -847719, 1356673, -2018098, - 4031901, 3944391, 4721243, 2586107, -3535832, 720481, 1047972, -2710124, -1045288, -1730872, - 3405909, 1380295, -395137, 812286, 559420, 514322, 1386201, -4216584, -387621, 222801, - 1879585, -728534, 2907156, -268972, 1908576, 637266, 913217, 2208150, 118648, -475668, - -347355, 736587, 309775, 1409823, -621160, 623307, - }, - { - -947040, -22508312, -1984812, -7035157, 10076530, 2004139, 3407520, -3323768, -1658394, 1941325, - 3457986, 4128001, 4079682, -14492830, 10942503, -2011655, -3076807, -3806952, -1657857, 1299765, - 13284334, -734976, -2891587, 13502840, 3085934, 4108673, -5308580, -236760, -470299, 5714454, - 9725953, -10741176, -4421132, 5005248, 2932926, 208306, 6545530, 485868, 5223217, -64425, - -8565775, -7934415, 1509144, -4062502, 151934, -4038880, 5218386, 3460133, -4344897, -2885681, - 3862786, 2131378, -787053, -2872260, -3623342, 6534256, 287763, -603980, 471910, 1510218, - 734976, -4223564, 3946001, 1515050, 2870649, -1697586, 2223183, 1170379, -1238561, -2157147, - 1053341, 1487669, 2616709, -1429687, -607201, -2336462, 2542621, -1468342, 163746, -1820529, - -3758, -3446711, -955630, 2767033, -1339493, -2666638, 2419677, 3715147, -493921, -770410, - -1016297, -468688, -748398, -416612, -84289, 1731946, - }, - { - -14136885, -11653320, -10477036, 14267881, -2300492, 6045704, 12283606, -9763534, 397284, -3045669, - -2020245, -546535, 8810052, 4972499, -2390149, -1667521, 8759586, -14609868, -5739150, 886911, - 2811056, -654983, -2170032, -6958384, 6459631, 4831838, 7731478, -8744553, -1447404, -5120675, - -12234751, -7009387, 7424388, -1732482, 195958, -1900523, 4368519, 2771328, -712428, 2424509, - 2617783, -1804960, 6034966, 4464082, 1393717, 648540, 1032940, 2506650, 2069637, 1928977, - 1891933, 180926, -8631811, -3074123, 1931125, 693100, -1812476, -1183800, 1203665, -6425808, - -1036698, -2280628, -699006, -1683090, -3138011, 169114, -723702, 1727114, 1023276, 4312684, - -410706, -1240709, -919123, 2585034, -1411434, -1053341, 2037962, 2558727, -1702418, 1127429, - -1714766, 5906, 195421, -1103270, -1818382, -953483, 710280, 1371705, -1421634, -483184, - -1976222, -528818, -312459, 332323, 390842, 2775623, - }, - { - -322659, 22283900, 4957466, -2974265, 9268003, -1408212, 6158983, -2139431, -6279779, 4522601, - -12085501, 10910291, 3661460, -2728915, -29188060, -11814918, -2316598, 463856, 2931852, -5390184, - 7779260, -3100430, 7244536, 1365263, 9326521, -1031329, 3772592, -3944928, 13762149, 3832185, - -3536906, 3674345, -1183800, 928250, 3877282, -250719, -1461900, 5011153, -2258079, 2040646, - 2030446, 5214091, -2274722, -3924526, -492311, -1225139, -4039417, 1120987, 1478543, 939524, - 2143726, 2566780, -2598455, 744640, 2434710, -820876, 4732517, 1306207, 1245541, 513249, - 20938, 3825742, 2702608, 3546032, 2071248, 853625, 59593, 2051921, 936840, 3210488, - -1572495, 1676111, 2806224, 1025960, -242129, 1010928, 1108638, -1894618, -1043140, -835908, - 817654, -1701344, 686121, 734439, 3496104, -1876901, 1803349, -1242856, -3440269, -2703145, - 649077, 1700807, 1158567, 1013075, 323196, -2011118, - }, - }, - { - { - -2363843, 127644280, -21640730, -59046672, 10511932, -6772627, 3824669, -6783901, -4228932, -3855270, - 13273060, 12599287, 8771934, 4127464, -7676181, 4419522, 6990060, 7339026, -1647657, 7989176, - -6266894, -6469295, -7913477, -4484483, -71404, -999654, -2435783, 416075, -6673843, 2706366, - -7052873, 5308580, -1869385, -3087008, -6337224, -3440806, 3998078, 156766, -1036698, -2649458, - 1814624, 7135552, 4225174, 527207, -1001801, -1678795, 738734, 3874061, -983548, -2113124, - 1318555, 2762738, -4824859, -4663798, -3289945, -1120987, -1657857, -5303748, -2643016, -1986959, - -3458523, -1601486, 1080721, -393526, -277562, 1595580, 3151969, 1544578, 148713, -247497, - -535797, -1027034, -898722, -1236951, -379031, 52613, 608812, 129923, 140660, -230318, - 191663, -536334, -1933272, 1688459, 169651, -373125, -130460, 41339, 776315, -541703, - 686658, 372588, 96637, -527207, -1570884, 411780, - }, - { - -92879, -9542344, 10978473, 28873454, 9984725, 1800665, 627602, -45634, 674847, 1899449, - -317291, -4271882, -1260036, -5971079, 3044595, 3290482, 1813550, 2361158, 5918465, 10356240, - 1438814, -3610994, 7155416, -1807108, 8241506, 1392643, -682900, -5034776, -5912560, -2263985, - 5842230, 10453414, 74088, -4477504, -8081518, 3952981, -6660421, -4058744, 3008625, -2230699, - 8382166, -949725, -3958886, -706522, 1051193, -2363843, -2639794, 4109210, -688805, -1132261, - 1561221, -1765768, -2749316, -2132988, 2078227, -1147293, 1650341, 1090922, -2014877, 755914, - 293132, 466541, -536334, -3113851, -107911, 466004, 969052, -221728, 517544, -2289755, - 1019518, -713501, 337692, -1973538, -1799591, -1287953, -1323924, 201863, -210453, -495532, - 1086627, 28991, -1116692, 1030792, 322123, -617938, -1461900, 763967, -1167157, 209380, - 714575, 452582, 657130, -1159104, 833761, 82678, - }, - { - 3495567, -60686816, -8715562, 671089, 15889768, -4807679, 1144072, -2735894, 1602560, 7284265, - 600222, -747861, 5192616, 43487, 6510097, -7209103, 13816373, 13723494, 3911105, -898185, - -6806987, -7066832, 447750, 764504, 309238, 1337882, -1404454, 4671851, -2059974, 5734855, - 3761855, 2818036, -9149891, 2120103, -3883187, 608275, -3307125, -9549860, 6410239, -252866, - 2656974, -4794257, 9060770, -432181, 762894, 1377074, -4653597, -2067490, 3090229, 2072859, - 5734318, -2234457, 1027571, -1535451, -329102, 260919, -4037806, -18254, -650688, 508417, - -3104725, -1396938, 823560, 1698123, -154619, 1966558, -2765422, -95026, 1038845, 1836099, - -107374, -1459215, 1142461, -954557, -664646, 1278290, -3314104, -1390496, -1187022, -1008780, - -2168959, -479963, 1246614, -1212255, -164819, 494995, -1037235, -1461900, 329639, -458488, - -1072668, 1226213, -175020, 282931, 2222646, 1360431, - }, - { - 11849278, -7276749, 9550934, 22057342, -2717104, -1436130, -5410048, 6349036, -4189741, 1388885, - -10057740, 11446625, 5627481, 6884833, 721018, -4493073, 17662516, 3361886, 2762201, -7875897, - 88584, -3911642, 3730716, -819802, 5916318, -157303, -2951180, 5776194, -737124, -1650878, - 3920232, 1165547, 828929, 2007360, 527744, 3848828, 3493956, 7029788, 460098, -1187022, - -4457103, -6463926, 1795296, -5662378, -3490198, 6451041, 595390, 1057636, 784905, -1246614, - -1185948, 2843268, -2011118, 1003412, 3109556, 4823785, -311922, -603980, -952409, 2623151, - -4664872, 34897, 1044751, -2032593, -3690451, -1249836, -731755, 1950452, 544387, -3221, - 1538135, 1235877, -411243, 1149441, -1117765, 1460826, -2962991, 1970316, 269509, -484794, - -416075, 319438, -1074279, 1172526, 715112, 322659, -701153, -255014, -572841, -407485, - -978179, 759672, 787053, -1931125, 235149, 1436667, - }, - { - 1080184, -35730908, -223338, 6977711, 2303713, -1213865, -415001, -3817152, -7734163, -7190312, - 1675037, -8407398, -638876, 6767258, 21582210, -15021111, 4726075, 6820945, -10211822, -1090385, - -260382, 3137474, -4406637, 9102109, -3456912, 4738423, 3822521, 2702071, -2939368, -1619740, - -3540127, -845572, 3419331, -3176128, -468688, -1490891, 2408940, 3233574, -1599875, -4706211, - 1345399, -2982855, -2280628, -5311801, -1590212, 2107755, 1107565, 281320, -634045, -1298691, - 1261110, 4930086, 4553739, -5302137, 425739, 2336462, 3904125, -3457449, 3758097, -1042603, - 1582159, 1883343, -2687039, -2686502, -2890513, -916976, 2996814, -963683, -1307818, -1443646, - -2806761, -850940, 1677185, 2086817, 1935420, -1031329, -675384, 810138, 1143535, 2082522, - 2057289, -1176284, -483721, 1512365, 466004, -3011309, -339302, -205622, 677531, 81068, - 1132261, -1374390, 987843, -617402, -413391, -56371, - }, - { - 15705622, 14900315, -10428717, 48681308, -9069360, 2302639, -1160715, 695248, 600222, -11821361, - -2857764, 9804337, 3742527, -5326833, 4227322, -8363912, 4869419, 5135707, -8988293, -4384625, - -6612639, -2242510, 3724274, 4469987, 5040681, -332323, -6576669, 2974802, 1819456, -6065568, - -1554241, 1148904, 2688113, -7599408, 11335492, -836982, 572304, 916976, 166967, -4323959, - -438624, -609349, 2214593, 2519535, -32749, 3031173, 5872294, 1715303, 1005022, -619549, - 37044, 793495, -1905355, 1804423, -4709432, 926639, -1152662, -1362042, -2836289, -2796561, - -1461363, 1591285, -928787, 862215, -977642, -106837, 71941, -1544578, 1403917, -2052994, - -976568, 418759, -1020592, -1346472, 1069984, 684510, 3080029, 775242, 1605244, 2263985, - 767189, 337692, 686658, -788127, -434865, 73551, 551366, 487479, -449898, -1334124, - 257161, -326418, 572304, 849867, 665183, 835908, - }, - { - -567473, 6839199, 6897181, -5145908, 286689, 824634, 744103, 122943, 235149, -791885, - -307627, -3696356, -2601677, 21616570, -7307350, 6205691, 5497558, 1443646, 1802276, 202937, - 10230612, 4265440, -7683697, -887448, -5829345, -2185065, 6237903, 10902774, -559956, -4815195, - -6721087, -5666136, 7228967, 128312, 1377074, -3337727, 1100049, -4847945, -1705102, -117038, - 2560338, 1781875, -418759, 2223719, -4548371, -506269, -2227478, -3991098, -1022739, -2625836, - 586263, 4454418, -3442953, -886911, -781147, -2130304, -481036, -1808181, -1431835, -1201517, - 118112, -1506460, -3031173, 147640, -105227, 1292248, -1513976, -2155000, -664646, 2712809, - -2195802, 1389422, 1103807, -73551, -226560, -1017907, 207769, -2333778, -44023, -1650878, - 731755, 421981, 970126, -795106, 881542, -921807, -595390, 1018444, 127775, 581968, - -1408212, 1101659, -754304, 897648, -774168, -112206, - }, - { - 16920560, -35576288, 4833986, 40130564, -2227478, -5578626, -3039763, 290447, 151934, 749472, - -8053, 774168, 13193603, 4603131, 7262253, -13267691, -6658273, 1752347, -1488206, -1399623, - 3671660, 212601, 1573032, -5971079, -4217658, 1567663, 1950452, 5745056, 7007239, 3346853, - -1370095, -6444599, -7325604, -2930778, 7188165, 3793530, -89121, -1727114, -406948, -1232656, - -233539, -618475, 304406, 2910377, -2963528, -1735167, 1106491, -447213, -487479, -2298881, - 1771674, -3369402, 4225711, -1270774, -1695438, 941672, -214212, -1529008, 1208496, -2989297, - 1744294, 1200443, -2353105, -2854006, 1334661, -390305, -354872, 2852932, -187368, -2210835, - -1642288, -2361158, -397821, -660888, 267362, 1002338, 3182034, 415001, -1270774, -1348620, - -208306, 778463, -2538326, -1251983, -718870, 1023813, -913754, 489089, -60130, -1162862, - -369367, -199179, -424128, -1235877, 957241, 335544, - }, - { - -2582886, -15503758, -7168301, -3925063, -1329829, -1907502, -3394098, 1573569, 599685, -3716757, - 3592740, -238908, 2079301, 10083509, -399969, 1332514, 9493488, 12712029, 1715839, 415538, - 7949448, 3782793, 2243584, 5107253, -4691715, -10545755, -8753143, -2187749, 1260036, -3486440, - 3302293, 6077379, -9277666, -6352794, 849867, 580894, -5005785, 1983201, -1320703, 4365298, - -2310693, -6678674, 1367947, -5760088, -7143605, 3032247, 671089, 5393405, -1672890, -1340030, - 2450279, 1707786, -180926, -2295660, -1643899, 2790118, 2435247, -645856, -3522410, 2115272, - 834297, -2144263, -1812476, 2429341, 3882114, 496069, 260382, 1387811, -1316408, -749472, - -109522, -1591822, 989453, 2660195, -674847, 1173063, -1151588, 1530082, -1227287, -2353105, - -448824, -444529, -211527, 540629, -2252710, -2227478, -799401, -531502, 213138, -1216550, - -1950452, -303332, 1171452, -806380, -659814, -737124, - }, - { - -10428717, -26589068, 13351443, 8613557, -3744675, 12291123, 29135984, -9050033, 2892661, -10228465, - -3468723, 924492, -6022618, -2827162, -11477763, 3081102, -4326643, -9174050, 3833795, -252329, - 14821395, -2640868, 4318590, -3242700, -2109366, -7495792, -8016557, -2288144, -2065879, 11141682, - -6309844, -3004867, -693637, -155693, 2264522, -898185, 6342593, 2451353, 5911486, 7031935, - -6427956, -6015102, 2541547, -7376070, -4218195, -6879464, 1278290, 5222680, -601295, -345208, - 2250026, 10400263, -753230, -2605972, 1152125, 256087, 3044595, 1855426, 821413, -336618, - 7516, -5906, -3789772, -2680060, 1321776, -762894, 363998, -2178622, -1145146, -1277753, - -2430415, 614180, 1296543, -1677722, 628676, -1008780, 491237, -2501819, -398895, 1824824, - 401043, -504659, -888521, 606664, -721555, -3837017, 135828, 1808718, -1103807, -695248, - -255551, 964757, -1664837, -676457, 835908, -1366337, - }, - { - 3234647, -8856223, -9630927, 900869, -3187940, -3311420, 2543158, 6711424, -14931454, -7878581, - -2641942, -4695473, 6927246, 3047816, -6795712, -855772, 2101850, -9521942, 2541547, -2340220, - 16653199, 8618389, -603443, 8659191, 1587527, 8318278, 4560182, -2858301, -2219961, -3567507, - 6636262, -2015413, -2697776, -598611, 3106872, 2545305, 6877854, 5313412, -2013266, 882616, - -2580739, -3458523, -1323387, -623844, 3221762, 3727495, -4430796, 5602785, -1611, -8385924, - 1727114, 2280628, 4080219, 1894081, 4818954, 2590402, 4147865, -1410360, 6460705, -2893734, - 1967095, -4613332, -1458678, 1412507, -5425081, 1695975, -3167002, -4505421, 570694, -459025, - 867583, 368293, -2857227, 616865, -104153, -1865626, 1133871, -440771, -3220689, 575526, - -83215, -1819992, 1444720, -433255, -1454920, -988379, 622233, -1471026, -636192, -1797981, - 1517197, -751619, 147103, -181462, 221191, 799938, - }, - { - 10313827, 45134200, -3615826, -3078418, -13245142, -17444010, -14390288, 4370666, 5020817, -8417062, - -3542811, 3066070, 520765, -27486716, -14261439, 297427, 960462, 254477, -7300371, 1238561, - -8610873, -1550483, -956167, -613107, -8581882, -10888816, -8488466, -434865, 3996467, -2047626, - 2217277, 3036005, 3303367, 2872260, 6597607, 4304094, 3783866, -387621, -3114388, -6376416, - 5389647, -8383240, -2211908, 967441, 1742146, -3687230, 10251013, -4529580, 8053, 985695, - -8893267, -3381213, 1223529, 3728569, 1724966, -5388574, 340913, -774705, -1881196, -3026878, - -208843, -265214, 1233729, 384400, -909459, 3555696, 1708860, -3989488, -460098, -2953327, - 665720, 688805, -2383707, -2281165, -2159832, 746251, 2170569, -3430068, 1362578, 1256278, - 352724, -3599720, -621160, -768799, 67646, -1270774, -120796, 774705, -6442, 191126, - -276489, 292595, -335544, 1315871, -935229, 1057099, - }, - { - 1440962, -23886460, -7018514, -7219840, 11009075, -3327526, -899259, 693637, 1684164, -1395328, - -2050310, 6978785, -951335, -31817118, 5048734, 3508988, 7477001, 1909650, -5216238, -2922188, - 341987, -5157719, -9738838, 501974, -1309428, -8735963, -11126650, 4463545, 2194728, 8526047, - 14522895, -9008694, -194347, 367220, 2055679, 1045288, 1169305, -3502009, -1998234, -10319733, - -6506876, -1953136, 3820374, -1817308, -92879, -5748814, -725313, -3055332, -2638184, -1795833, - 3788698, 1727114, 751082, 1880659, 187905, 4529043, -1859721, -2051921, -1675037, 3838627, - 3467112, -2572686, 2796561, -340913, 4000762, -599685, -1039382, -54224, -321586, -2396055, - -2988224, -300111, 1442035, -617938, 802085, -1449015, 1594507, -1429150, -720481, -1569811, - 1766842, -556735, 442919, 2761127, -1578401, -2199560, 1652489, 1267015, -385473, 888521, - 1465121, 1039919, -1268626, 174483, -675384, 627065, - }, - { - 12159589, 32499480, 1376000, 17656074, 1067299, 1076963, 7223062, 3196530, 13938779, -5342403, - -2302103, -9853729, 5685463, -1279900, -15586973, 6254546, 9647033, -13940390, 251792, -2951180, - -6196564, -3261491, 3308199, -2683281, 9754408, -1134408, 3105798, -2720325, -2649995, -10558103, - -5209796, -2171106, 4188667, -1123671, -540092, -5026186, -2127620, -4817343, -3808026, 27917, - -3546569, -3141232, 6562173, 5615670, 1591822, -49929, 1067299, -75699, -4741644, -5369246, - 1591285, 4976257, -2671470, -1293859, -3133179, -207232, 654446, -941135, 4015795, -2366527, - 4352413, 479963, 1327145, 2701535, -1508070, 2442763, 1216013, 1612760, -802085, 1316408, - -1357210, -892279, -1097901, 1081258, -340913, 816581, 3056406, 1689533, -345208, 2711735, - -1918240, -1117765, -797790, -738734, -668941, 222265, -221728, 552977, -1110786, 294742, - -1205812, -1046898, -791885, 748935, -1047972, 1379758, - }, - { - 2301566, 17746804, 270046, -4286378, 570157, -6452652, 10662256, -2595771, -8275328, 2201171, - -8444443, 12979928, 1660005, 23677080, 37985228, -2976949, -1038308, -5433134, -3001645, -1617592, - -1719061, -7850664, 3245922, 3707094, 14679124, -8590, 9740449, -2249489, -1874753, -607201, - 1610076, 2705830, 2789045, 3360812, 12666395, -5108864, -5597953, 9736154, -2993055, -22012, - -760209, 3474629, -121870, -852014, 1897302, -3686693, -2141041, -948114, -6866579, -2595234, - 1450625, -4827007, -5427228, 2119566, 1318555, 200790, 3294240, 1967632, 3231963, 1216013, - -3223910, 586800, 387621, -142808, 3221, -517544, -3364570, -1748052, -1509681, 2254321, - -797790, 1101659, -2851858, -3587908, 292595, 1401770, 2184528, 126702, -627602, -1983201, - 836445, 1271847, 1541893, -1734093, 532576, -1685775, 1459752, -2219961, -1514513, 111669, - 1262184, 985158, 527744, -100395, 624918, -841814, - }, - }, - { - { - -870268, 87214680, 15567109, -48448840, 2786897, 2233920, -4189204, -6790880, -3788698, -1385127, - 7592429, 12568685, 13850733, -4987531, 2647311, -2080375, 7320235, 6718940, 9084930, -5076115, - 801548, -6430640, -8850854, -3103651, -4985384, 1605244, 4351339, -7723425, -4629438, 308701, - -1280974, 258235, -4463008, -3364033, -6131066, -3409667, 3067144, 1755568, 404801, -6130529, - 4379256, -1149978, 6132140, 1403917, 5159867, -2292439, -1942936, 3270081, 610422, -319438, - -3017215, 4580583, -3528853, -7297150, -2218351, 361314, -4133906, -4089883, -3714610, -3565360, - 49392, -1131187, -1378685, -394600, -1270774, 1626182, 3754875, -915902, 105227, 230854, - 46708, -1723893, -906775, 228170, -1925756, -70867, 1057636, 1090385, -1214402, 220654, - 638876, -671626, -846645, 348429, 161061, 683974, -1631551, -960462, 2385854, -923955, - 946503, 701153, -65498, 59593, -872952, -1127429, - }, - { - 997506, 21963390, -10499048, 25032680, 6158446, 641561, 3398930, -2733210, -690953, 1734630, - -3623879, 360777, 4052839, -4181151, 1211718, -2880849, -2653753, 5898064, 16948478, 2601140, - 4029753, 6423661, 4546760, -5639829, 2418604, 5481452, -6163815, -476205, -3715147, 994285, - -1964948, 13140452, -1143535, -5405217, -6599754, 1690607, 1848983, -6585259, -1928440, 4632659, - 3821447, -1562294, -4608500, 4111358, -4196720, -301185, -1981591, 5853504, -2027225, -2020245, - 603443, -1820529, 1078037, -6409702, 4649839, -680752, 3437048, 716723, -3919695, 3360812, - 504122, 311385, -3549791, -1146219, 535797, -147103, 669478, 180926, -2686502, 492848, - 185757, -79994, 376347, -1171989, -2917357, -833224, -1123671, -778463, 1893007, -1020055, - -75699, 1106491, 476205, -890669, -530428, -342524, -769336, -1387274, 595927, -231391, - 1089311, 351114, 513249, 386010, 279173, -1582696, - }, - { - -2472828, -68286224, 8141111, 25946972, -13168907, -628676, -6312528, -1481227, 6426345, -3213709, - -1552094, 13375065, -230318, 10672457, -312996, -4733054, 14894410, 4020090, 12874701, -3211562, - -7817914, -6598144, 4863514, -2508798, 2181844, 1743220, -4810364, -1135482, 2220498, 7457674, - -3359738, 8197482, -8105677, -2738579, -2542621, -4181151, 3062849, -6965900, 584116, 2757906, - -1222992, 2035278, 3532074, 1847373, 161061, -142271, -1192390, -439697, -1052267, 2608656, - 791885, 1339493, -2139968, 1468879, -2302103, -543313, -1349694, -1891396, 1411434, -2700461, - -565862, -2002529, 3252901, -559956, 103079, 675384, -1505923, 436476, 6442, 2595234, - -28454, -597000, 1480690, -1969243, 620623, 935766, -798864, -2806224, -1404454, 600759, - -2832531, -942745, 748935, 91805, -592706, -634581, -1233729, -1217623, -386547, 1030255, - -756451, 210990, 367220, -937377, 2419677, 403727, - }, - { - -11299522, 22217866, 11862700, 25817048, -7056632, -3822521, -1523640, 1634235, 3711926, -5565741, - -8653285, 15908559, -321049, 4167192, 9921374, -7815230, 14669998, -1150514, -1815697, -6599218, - 2876554, 3364570, -2408940, 3731790, 1397475, -1531156, 1820529, 1410360, 6037651, -7736310, - 3950296, -2039573, 10740103, -467615, -2225330, 6282464, 1639604, 3402151, 2762738, 1496259, - -6483790, -4500052, -1610076, -5107790, 1545651, 1605781, 2163053, -1140851, 2155537, -3956202, - -1451699, 203474, 1187559, -1398549, 3246995, 5111548, 4522064, -4895726, 2605972, 877784, - -911070, -3059627, 235149, -1102733, -3134253, -2058900, 1035624, 925565, 2710661, -2003065, - 2482491, 323733, 700080, 1219771, 274341, -261456, -3061238, 860604, 1133335, -1395864, - 1079647, -128849, -2017561, 1835562, 1025960, 1075889, -257161, -790274, -368293, -734976, - -437550, 392990, 594853, -379031, -1231045, 2542084, - }, - { - 164283, -29047938, -2076617, 6350646, 3074660, -493921, -1585380, -11111080, -2611877, -4547834, - -423054, -9606768, -1356136, 6962142, 21621402, -9988483, -5881958, 17926120, -9825811, -4981089, - 3073586, 5024575, -4832375, 5177583, 6992207, -1555315, -5550172, 7999914, -2641405, -8575439, - 947040, 5381594, -7765301, 4935455, -270583, 3547643, -5760625, 8186745, -2089502, -163746, - -4173635, 2965138, -7766375, -5895380, -74088, 3252901, 3426310, -1458141, -1487669, 488016, - 1323924, 3473018, 216896, 1282585, -1144072, 3866008, 3249143, -1887638, 1026497, 847719, - 1270774, 988916, 249108, -5973763, -1597191, -2902861, 5149129, -3267396, 1673964, -2389613, - -2657511, -11811, 1545115, 2847563, 870805, 52076, -1271847, 1087701, 1634772, 289910, - 1460289, -319438, -1008244, 860067, 376883, -1115618, -1997697, -19864, 1613834, -413391, - 123480, -1069984, 599148, 630286, -1479079, 541703, - }, - { - -11760694, 50627464, -2930242, 41247792, -547608, -2482491, -376347, 4585952, -11037529, -1178432, - -9999758, 11664057, 1268089, -4060892, -104690, -3750043, 4385162, -2780455, -6140730, -5308580, - -4024384, 1469953, 4722317, 4285841, 2275796, -92342, -4048544, 3714073, -4937602, 1420560, - -3659312, -1073742, 6758131, -8953396, 6605660, 3415036, -3786551, 3787088, -3940096, -1167694, - 2051921, -2689723, 3400540, 2223183, -1344325, 3999152, 6310381, 1663226, -1792612, -497679, - 1833414, -1358820, -2100776, -844498, -476741, -151934, -2568927, -1637993, -3117610, -707596, - -3864397, 2158221, 884226, -1806034, -484258, -492311, 1584306, -12885, -653909, -206158, - -2907156, 766115, -2105071, -858457, 619012, -200253, 4697084, 271657, 2108829, 813359, - 1461900, 1351841, 427349, -750546, 105227, -1248762, 654983, 1802813, -925565, -923955, - 489089, -706522, 676994, 784368, 808528, 975494, - }, - { - 1611, 15441481, -9411884, -3137474, 811212, 1340030, -912681, 788663, -925565, -3685082, - 6175089, -10560788, 5749888, 3707094, 714575, 7466264, -5816997, 16810502, 61740, 6502044, - 11133629, 1921461, -5773510, -944356, -9088688, 2732673, 5425618, 2435783, 3030636, -4301947, - -1407676, -5487358, 2763275, 1734630, -3277597, -3735011, 754841, -3580392, 985158, -768262, - -4318590, 6912213, 3366718, -1000727, 222801, -2709051, -5137318, -1314797, -1708323, 521302, - -268972, 3320547, -3478387, -1365800, -3192235, -2144799, 1717450, -2205466, -1341104, -3685082, - 2182380, -1475858, -2458332, -1034550, -67109, 2513630, -2647311, 682900, -2726767, 3308199, - -407485, 85362, 1991791, -1954210, -656056, -363998, -915902, -1950989, -38655, -994822, - 2124935, -1722819, 1953136, 63351, -821413, 217970, 340376, 259846, 563714, -129386, - 149250, 224412, -446677, 245887, -387084, 228707, - }, - { - -20530480, 12527883, 7493108, 41967200, -850404, -1520418, -12817793, 7834021, 1539209, -1264331, - -16048682, 7550553, 23056996, -4939750, 11444477, -6802692, -1741609, -2070711, 3985730, 1224066, - 565862, 1732482, -855772, -9330816, 630823, -4235375, 10358924, 4253628, -1447941, 7836705, - -1082332, -8680666, 1640678, -5938866, 3264712, 2678986, -3406983, -222801, 935766, 848256, - 99321, -2515240, 3235721, 2311229, -1393717, -4686346, 1704028, -1094680, 3306588, -3930432, - 1603633, -1384590, 4399121, -1080184, -776852, 1692217, 2392297, -5213017, 1529008, -1054951, - 569083, -2321430, 413927, -4514548, 959388, -1525250, 4025458, 966905, -3457986, 1220308, - -1198296, -2193655, -3498251, 68183, 1379758, 1285269, 818191, 304406, -616865, -450435, - -570694, 621160, -2605972, -1334124, -849867, 26844, 1115618, -744640, -563178, 452045, - -712965, -267362, -705985, -2001992, 861141, 724239, - }, - { - -259309, -26332982, -8648990, -8605504, 1113470, -326418, -2428267, 2629594, -7893076, 405338, - 3260954, 4277251, 1778653, 3894999, 7548942, 22163104, -1257889, 2442763, 5741835, 7384660, - 3046206, 4021163, 226023, 2628520, -1911797, -1002338, -9119289, -6129455, 5694053, -1620276, - -3062849, 6393596, -2398202, -2828773, -5854041, -6062883, 2203855, 2151779, -2457795, 2773475, - -5650030, -2939368, 231391, -2377265, -4580046, -5153961, 5786395, 2630668, -1684701, -369904, - 3854196, -337692, 85362, -4049617, -2375654, 3959423, 1110786, -2000918, -1765232, 4400194, - -799401, -2595771, -750009, 2737505, 3276523, -1099512, -39192, 4516158, -2294586, -2313377, - -1137630, -957241, 3296388, 461172, -1220308, 440234, 663036, -925029, -658204, -1957968, - -809064, 32749, -732829, 202400, -1942399, -1255741, -1515587, -360777, -609885, -1307818, - -2035815, 1221918, -955630, -176094, -1737851, 143345, - }, - { - 11231339, -40130564, -3810173, 9766219, 15793132, 7310571, 8593156, -3550327, -1366873, -4594542, - -5636071, -15223512, -1787243, 5492190, 3384434, -8644695, -6547141, 3336653, -4945655, -2439542, - 9739375, -2703682, 6597607, -3347927, -8968429, -3189550, -10143639, 177704, 3175055, 1301375, - -2110977, 3257196, -5734855, 111132, -628676, 7780334, -230854, 4462471, 7180112, 3222299, - 1219234, -8096014, -5545340, 1995012, -3232500, -12000139, 663036, 1779727, 2170032, 4998268, - -2442226, 10676752, -927713, -3349001, -569083, 2048699, 2337536, 1918777, 14496, 1343251, - -2058363, 3206193, -2430952, -2710124, 1711008, -1424319, -1750199, -1231582, -2067490, -1512902, - -2840584, 2267206, -2927557, -159988, 1118839, 1568200, -2865280, -1320166, 960462, 1433445, - 2079301, -2196876, -2851322, 2924336, -675921, -3736622, 1821066, -686658, -1585380, -709207, - -228707, 44023, -69793, -1174674, -191126, 558883, - }, - { - -2763275, -17200808, 12770548, -4380330, -5608154, -11532524, 14397804, 3408057, -18065170, -10989748, - -3586298, -1693828, 1944010, 6658810, -10513006, 6642167, 1816771, -1122060, -5252745, 2132451, - 9644886, 6372658, 6446746, 4683662, 8855686, 4240207, -1991254, -1148904, 1938641, -226023, - -2251637, 6018323, -1401770, -12250857, 3608310, 5218922, 7991324, 7545721, -9127, -3752191, - 1411971, -5055714, -5588290, 6005975, -2268817, 4029216, -3952444, 6742562, -711354, -3956202, - -2509872, 3661997, 2642479, 5705864, 2962454, 6778532, 54224, 1574642, 2885681, -597000, - 1807108, -5181341, -970663, 979789, -1937567, 219043, -1675037, -5461588, -806917, 1773822, - -1711008, 1924145, -1319092, -819802, -440771, 1249836, -1094143, 1053878, -2780991, -1216550, - 517007, 919660, -2277407, -120259, 44023, 61740, -902480, -290984, -1874216, -310848, - 63351, -311922, 83215, -658204, 38118, 639413, - }, - { - 2195802, 62867584, -13495861, 7122130, -5264556, -49113488, 218506, 613107, 6105833, -3226594, - -19768660, 14983530, 3469797, -26698054, -18896782, 4270271, -11725261, 257698, 3224984, -9191230, - -9457518, -3828963, 249645, 1311039, -1697049, -9670119, -6042482, -10955925, 7071664, 257698, - -4730370, 4494684, 8049306, 3278134, 3017215, 5991480, -199179, -2357400, -805306, -3519189, - -459025, -1302449, -57982, 558346, -2603824, 4270808, 4705674, -3777424, 3857418, -1333051, - -8205535, -6277095, 1377611, 4716411, -785979, -4602058, -448287, 3746822, -4611185, 345745, - -3533684, -406411, 1091995, 477815, -801011, 3795141, -1821066, -3088618, 1287953, -649077, - -1015760, 220654, -1717987, -2076080, -4976257, 2210298, 1089848, -748398, -705448, 2677375, - -1687922, -3241090, -1663763, 56908, 89657, -941672, -200790, 102005, -370978, 943282, - -632434, 456340, -23085, -814433, 383863, 474594, - }, - { - -303332, -22381612, 38655, -5877663, -1008780, 4791036, -6616397, 7948911, -2207613, 3528316, - -7271380, 7093139, -12714177, -25643102, 13115220, 7004018, 4345970, 287763, -6347962, 6899865, - -10169946, -11647951, 2036351, -5116380, -8388608, -2736431, -8813273, -5987722, 15868294, 323196, - 14584098, -4556961, 2345589, 430570, 949188, 1805497, 1756642, -4374424, -7973607, -7482907, - -3656628, 974958, -1730335, 961536, -2122788, -2783139, -2090575, -6240588, 4035122, -1865626, - 1231582, -2774549, 2967823, 1962800, 4947266, -3503083, 2443837, -639413, -2285460, 7215008, - -358630, -3849901, 2578591, 1722819, -658204, 1257889, -666257, -2497524, -102542, 2442226, - -5587753, 394600, -621697, 1491964, 54761, 849867, -1219771, -413927, -3257196, 2317672, - 286152, 1217623, 257161, 2790118, -2300492, 760746, 248571, 1084479, 482110, 191126, - 2292439, 344134, -2113661, -368293, -250182, 868657, - }, - { - -4783520, 53465364, 9924596, 10215580, 1756105, -1898912, -2229625, 13473849, 8095477, -6375342, - -1115618, -17853642, 3265249, 8977555, -20145544, -3783329, 5137855, -28991, 200790, -6193880, - -11556146, 722091, 3279745, -1398549, 7509214, 5108864, -3165391, 5439039, -47782, -14692546, - -5881958, 1270237, -889058, 5042292, -8590, -3063386, -10184978, -5759015, -3138011, -850940, - -5982353, 5718749, 1566589, 7365332, -2266132, 1451699, 3856881, -2364916, -7588671, -3590593, - -71941, 3069291, 4313758, -3120294, -1816234, -4246112, 3910031, -1421097, 3997541, 585189, - 2645700, 321049, 603443, 3318399, 986769, 2562485, -1350767, 1352378, -148713, 972810, - -2674691, 529355, 287226, -2313914, 508954, 2108829, 3240016, -828392, 1214402, 2239826, - -697395, -2844879, -2684892, 1749662, 55298, 1175747, -1792075, 792958, -61740, 811749, - -565325, -1874753, -1611150, 1145146, -644782, -583579, - }, - { - -2646237, 21931176, -44023, -1585380, -3630858, -1787243, 6892886, -3412352, -3628174, -6932614, - 7099044, 3216394, 4334696, -23105314, 84049824, 7576323, -6302865, 7916699, -17535814, 1960653, - -8795556, -3354906, -7590818, 14457934, 2218351, 9772124, 3937948, 7126425, -4895189, 456877, - 144955, -3373697, 8230231, -1431298, 14392972, -9288941, 4883915, 5978595, -2850785, -1425929, - 1383516, -314606, 4543002, -3129421, 2345589, -1289564, -1599339, 2322504, -9366787, -6290517, - 4320200, -6965900, -5795522, 3333968, -617402, 310311, 395137, 3482145, 3848828, 1939178, - -3044595, 748398, -3474092, -384936, -661962, -96637, -4080756, -20938, -1946157, 1513976, - 1082869, -1168768, -1981054, -2783676, -748935, 2119566, 1319092, -358093, -129386, -982474, - 1037235, -118648, -1004486, 132607, -1409823, -554588, 577136, -1556926, -1915019, 2698313, - -135828, -195958, 1173600, 63888, 81604, 234076, - }, - }, - { - { - 3034931, 82389280, 2923262, -7816304, 29253560, 287226, -3659312, -4083440, -3837553, -2675765, - 5233418, 7412577, 2135136, -6324340, 1398549, -5138392, -4886599, -755914, 6649683, -4905927, - 5509370, -1412507, -219043, 8103530, 2694555, -488016, 3537979, -4178466, 2906619, 1286880, - -2733210, -4153770, -4907537, -2794950, -7850664, -3262565, 65498, 3757023, 2544231, -5247377, - 2057289, -6932614, 5818607, 5440113, 8352101, 811749, -1757715, 1512902, 3084860, 3312494, - -198642, 3736085, 1277753, -991064, -1273458, -899796, -3684008, -417686, -1819456, -1133335, - -1835025, -3110630, -2943126, -2665564, -4291746, -4015258, 1112933, -2287607, -1147293, -1018444, - -715649, 289373, -442382, -945967, -2254858, -922881, -22549, 1488743, 332323, 2224793, - 1838783, 790274, -637803, 558883, -485331, 825707, -503585, -723702, 2548526, -381178, - 745177, 276489, 258772, 683974, -473520, -1459215, - }, - { - -677531, 41180148, 8926553, -11986180, -20994338, 2313377, 2544231, -5867462, -2924873, 1495186, - 3322157, 3391951, 659278, -5562520, -1231582, -5632313, -5294621, -3425237, 1964411, -9676024, - 9940165, 7993471, -1693291, 1615982, 9942849, 6776922, -7890929, 2843805, -462246, 1394254, - -5941551, 12402255, 2293513, -3043521, 1755568, 5284958, 4938139, -1613297, -1367947, 1928977, - 1444720, 1687922, -3508988, -147640, -9890236, -979789, 1819456, 4396973, -4914517, -2537252, - 2918430, -8590, 7445863, -438087, 3317862, -2314451, 2560338, -10201, -6832756, 882616, - 4130148, 2654827, -2416993, -2236067, -2142652, 297427, -93952, 763430, -3228205, -71941, - 232465, -681826, 598074, 876173, -1194538, 291521, -740345, -942745, 3962107, 532576, - -1256815, -195421, 329639, -1817308, -915902, -37581, -663572, -544387, 1498944, -1454383, - -653909, -88584, 883153, 814970, -86973, -1832340, - }, - { - -496606, -78569448, -1372779, 53767084, 5677410, -2093260, -8383240, -7268696, 564251, -6489696, - 4276714, 19036368, 1409823, 6726993, -6624987, -3224447, 14682346, 3838627, 14650133, -1054951, - -5369246, -7124814, -205622, -4010963, 6999723, 1472637, -8220031, -1469416, 3820910, 3246995, - -9982578, 11899744, -338766, -2243584, -4743792, -1209570, 5765994, -11042898, -6545530, 2330557, - -45097, -185220, -3600256, -1963874, -3067144, 290984, 2387465, -4735739, -8227010, -1604170, - -4359929, 231928, 416075, 980326, -2896956, 379568, 630823, 1510755, 6577743, -1318018, - 2777233, 4249334, 4715874, -1555852, 1131724, -926639, -1483911, 2451890, -420370, 813359, - -1470489, 122407, 2729452, -696322, 472446, 951872, 1793686, 1205275, 1195612, 2207613, - -1002875, -140123, -1088237, -705985, 277562, 563714, -143345, -781684, 372588, 1883343, - 178241, -943819, 176094, -815507, 2044404, 715649, - }, - { - 6525129, 41894184, 5248450, 36357436, 177167, -3074123, 2104534, 399969, 1785633, -6139119, - -12028056, 3590593, -3463891, 1363652, -3046206, -18587008, 3356517, -13723494, -7256347, -4747550, - 7754027, 4895189, -2706366, 494995, 5262409, -1445257, -2328409, -5889474, 5671505, 596464, - 387621, -5052492, 11672647, -2784213, -303332, 5458367, -3040300, -3142842, -3676492, 3437585, - -723165, -2709051, -2733747, -2242510, 2169495, -2306934, 2195802, 1288490, -426276, -4742718, - -916439, -1595580, 2297271, -1061394, 1271310, 2001455, 3491272, -626528, -123480, -1673964, - 4391067, 1432909, 1393180, -44560, 1881733, 827855, 2161979, -1125818, 1639604, -412854, - 608812, -1679332, -57445, -978716, -801011, 1149441, -644245, 217970, -401579, -641024, - 2725157, 761283, -1952600, 351114, 133144, 28991, 263067, 430570, 191126, 900333, - 925029, 927713, 827318, 1025423, -419833, 1118302, - }, - { - -1551020, -25347286, 326418, -1586454, -2001992, 12885, -1668058, -7806103, 1669132, 1567663, - 5110474, -8040179, -4084514, -1090385, 21724482, 1680943, -11515344, 7809861, -4374424, -11843909, - -8508330, 5148592, -10133438, -4880157, 1115618, -13124346, -3673808, 16049756, 677531, -7983808, - 4042101, 9744207, -8410620, 7187091, 3837553, 2498597, -6717329, 4728759, 4430259, 9075803, - -6559489, -2026688, -3351685, 71941, 1240709, 2726231, 4917201, 1907502, 2550674, 3016141, - -1526861, -1500017, -762357, 6011344, -383863, 1859184, 2043868, -609885, 1479079, 2100239, - 2061047, -983548, 2008434, -31139, 3045132, -1755031, 1768990, -6184216, 563178, -741419, - -1218697, -2006287, 264141, 1256278, -1510218, -651761, -1931662, -79457, 2486249, 196495, - -253403, -1074279, -1274532, 932545, 55835, -275952, -934155, -330712, 1501091, 9664, - -144955, 398895, 1752347, 933619, -927176, 744103, - }, - { - 2048699, 64054604, 1413044, 42819752, -110059, -3811247, -615791, 11398306, -11469173, -608275, - -15646029, 2909304, 881005, 2884071, 4573604, -7962870, 1496796, 146566, -232465, -4389994, - -3907347, 7057168, 8119636, -1823751, 1643362, 1644436, -2056753, 2916820, -5619965, 4071629, - 1542967, -30602, 5443871, -3444027, 4232154, 2613488, -5992016, 265214, -388158, 3313031, - 5433671, 332860, 1992328, -1447941, -4148939, 2364916, 3113315, 1533840, 868657, 2250026, - 2004139, -6530498, -4217121, -2078227, -635118, 148176, 1414118, 807991, -2024003, 2440615, - -849867, 739271, 1958505, 679142, -1723356, -2201708, 3267396, 2307471, 20401, 1080721, - -680215, 2649458, -1810329, -2044404, 153545, -488553, 2516314, 505732, 2437394, 290447, - -151934, -711891, -1205812, -723702, 279710, -1452773, 661962, 1919314, -463320, -342524, - 1923072, -588411, 1087701, 1379221, -304406, 58519, - }, - { - 552977, 17011828, -6918656, -3478924, -1281511, 1642825, -924492, 1714229, -346282, -3060701, - 4316979, -11050414, -601832, -6454262, -5847061, -2508798, -15429133, 13615046, 4356708, 6468221, - 3235184, -6555731, -3616899, -3325379, -9951439, 2496987, 6688338, -1789928, 3565360, 2135673, - -5007395, -4667019, -8126078, -6044630, 664646, -3134253, 918586, -3364033, 3926674, 2009508, - -978716, 5784247, 347892, -3404835, -2014340, 351650, 1881733, 5276904, -332323, -2157684, - -3558917, -758599, -1428614, 1509681, -121870, -2040110, 4096862, 1454920, -3049427, -3231963, - 3725347, 452582, -783295, -1512365, -1838783, 828929, 341450, 2623151, -2168959, 2063195, - -1285806, 1119913, 1634235, -2326799, 1339493, 688269, 938450, 1156957, 2472291, 544387, - 3024731, -323733, 1211181, -852014, 127238, 1549946, 799401, -1666984, -1621350, -565862, - -553514, -320512, -931471, -220654, -197569, 586800, - }, - { - 17542258, 61333208, 10848014, 30108258, -22590992, 2408940, -28755880, -3603478, 2084133, -5695127, - -7450695, 4494147, 13788993, -5696201, 10823854, 2342905, 256087, -7027640, 4604205, 8555038, - 245350, -1297617, 5105643, -3562675, -5266704, -7017977, 3185255, 2335389, -1172526, 5365488, - -3305514, -7618198, 8262980, -4321811, 1779190, 3308199, -4279398, -2486786, 2607045, -367220, - -3223910, -3905736, 3173981, 3001645, -3750043, -7110855, -1086627, -2568391, 5289789, -5030481, - -480499, 1217623, 3959960, 4215511, 2911451, 586800, 4852240, -3689377, 2646774, 1675574, - 1851131, -2208687, 2859911, -3411278, -41339, -2271501, 337692, -547071, -3229279, 490163, - 1762547, 1033477, -1394791, 1398012, 2136746, 765578, -1671279, -1918240, -792958, 1454920, - -214212, 179315, -423054, 735513, -426812, -477815, -244813, -1686848, 308164, 2404645, - 857383, -836982, -803696, -1272384, 365609, -1249299, - }, - { - 2316598, -1928977, 3804267, -2222109, 6912213, 676457, -206158, 3682935, -5472862, 1806034, - -2091112, -2014877, -8714489, -112206, 15744813, 24502252, 10756209, 9182640, 3821447, 9595494, - 3808562, 5792301, 2306398, 2750927, 2565169, 12703440, 1124208, -821949, 9445707, 2392297, - 2132451, 11214696, -4243965, -8830453, -10566156, -10969346, 2554432, 8153459, -1251983, 3726958, - 3748970, 1880659, -3214246, 2248416, 2350421, -6860674, 82678, 95026, -93952, 2210835, - 3383361, -1846836, -1476395, -1525250, -2224793, -896574, -593242, -1195612, 1788317, 5209796, - -2097018, -1397475, -1193464, -2174327, -2811056, -4424890, -3189550, 2352568, -1971927, -2049236, - -1894081, -479426, 3041374, -1044214, -438624, 332323, 688269, -1508070, -736587, -1234803, - 122407, -20401, -291521, 903017, -1084479, 66035, -391916, 1219234, 1336272, 445066, - -1143535, 1203665, -1804960, 427886, -694711, 1245004, - }, - { - -12380243, -65915936, -1963874, 2170569, 11618423, -11657615, -10644540, 1628330, -1531693, -6036040, - -2596845, -9243843, 2997350, 8368744, 6898255, -4610111, -1251983, 5682779, -11808476, -14755897, - 4021163, -234076, 4996121, 5623186, -7037304, 2016487, -4682588, 2405719, 4559108, -814433, - 2975339, 2822867, -6215892, 839666, -2021856, 4830228, -5259725, 733366, 337155, 652298, - 8668318, -1309965, -2270964, 5205501, 766115, -5701569, 649614, -1242319, 6389301, 7134478, - -5993090, 3550327, -2375117, -1424319, -1896228, -641561, 1628866, 585726, -377957, 1925219, - -5714454, 2627983, -1249836, 1717987, 4089346, 1948841, 305480, -1660542, -2065342, 271657, - -63351, 3469260, -1918777, 1050656, -53687, 1282048, -1941862, -67109, 411243, 1343251, - 2948495, -1490891, -1169842, 3789772, 2024540, 286152, 3759170, -649614, -685584, -850940, - 99321, 258772, 435939, 408022, 308164, 1337882, - }, - { - 1465658, -24387898, 14615237, 335544, -2288681, 272730, 15400142, 5828808, -7358353, -1796370, - 7315940, -1345399, -7843147, 1520418, -7669201, 9350144, 5291937, 9634685, 1872069, 6500970, - -1562294, -1840930, 12934294, 5035313, 3810710, 2068564, -6825240, -2535641, 6219650, -6531572, - -11352672, 3199751, -1422171, -8706972, 4667019, 5710696, 5641977, 1174674, -6031208, -8730058, - 1649804, -3380676, -5638755, 7052873, -3338263, 5222144, -4008815, 112206, 1534377, 3618510, - 286152, 579821, -1113470, 3226594, -504659, 1157494, -3165928, 809601, 1316944, 16106, - 5275294, 895501, 564251, 2859911, 2499671, -180926, -624918, -441845, 904628, 435402, - -1593970, 3294240, -587337, -1545115, -589484, 305480, -1290638, 1353452, -1889249, 1101659, - 958851, 506269, -2132451, -863288, -750546, 187368, -1479616, -502511, -1212255, 433792, - -223875, -879931, -1476932, -1783485, 34360, -183610, - }, - { - -15560667, 36120140, -9958955, 6309844, -6789807, -38044284, 14199162, -5011690, 1857037, 12360916, - -16395501, 10892574, 3064459, -13527536, -7842611, 14670535, -9453760, -6875706, 2184528, -5664525, - 660351, 3212636, 7090991, 5206574, 4679367, -688805, 4992363, -7541963, 5626407, -644245, - -5440650, 7770133, 513785, -2178085, -4004520, -3425237, -8106214, -3732327, 2651606, -1665374, - 1693828, 4445291, 1783485, -237834, -4226248, 53150, -1748589, -3695283, 6820945, 4355097, - 1239098, -5244155, -2521146, 5031018, -2166274, -3664681, 1919314, 3457986, -4662187, 5465346, - -1559073, -1748589, -1766305, 331249, 460098, 895501, -6340446, -2622078, 4281009, 2962991, - 41339, -848256, 1510218, 1102733, -4864588, 1241246, -1886564, -1039919, -391379, 1235340, - -2328946, -645319, 724239, -967978, 918586, 1269163, -1094680, -1214939, -88047, 808528, - -514859, 1492501, -118112, -2844342, -276489, 226560, - }, - { - -1260573, -20422570, 5372467, -3667365, -4539781, 2282775, -9561134, 942208, 648003, 9058086, - -6875706, 6162741, 8573828, -6135898, 2816425, 1933272, -6180995, -6553047, -6231998, 12065100, - -6851010, -10011032, 13194140, 4359392, 2472828, 10411001, -2477659, -6762426, 15797427, -3921842, - 4607963, -1693828, 9401683, 1790465, -214212, 4686346, 1574106, -401043, -6469832, -428423, - -614180, -78920, 1660542, 4566087, -495532, -2109903, -1037235, -5587753, -1777043, -3677566, - 1502702, -4386236, 1956358, 1097901, 6184216, -1133871, 5449240, -2080912, -2632278, 1655710, - -3627100, -900333, 1107565, -1549410, -3988414, -409633, 104690, -606664, 813359, 2034204, - -2967286, 1129576, -1770600, 352187, 60130, 2384244, -425202, -64961, -1450088, 3427384, - -461709, 904091, 356482, 2382096, -3427384, -348429, -1113470, -214748, 51003, -760209, - 223875, -735513, -1632625, 368293, 312459, 1051730, - }, - { - -5970005, 36843840, -16521665, -1808181, -2466385, -4424890, -3818763, 4080219, -8294656, -5633924, - 7170985, 6419903, 10078678, 9131637, -14598057, -15296526, -545461, -5856725, -9419400, -5840619, - -10817949, -1233193, 1901597, 3256122, 10506027, -4925791, -3876745, 17686676, 7617662, -4509179, - 3499325, -619549, -7641284, 4183298, 5774047, 516470, -10079751, -2093797, 642635, 3399467, - -1453310, 6950868, -1950989, 7619272, -1642288, -1728724, -1181116, -2915209, -1135482, 2761127, - -5361730, -4689568, 7234336, -851477, 1829119, 265751, 3933116, -2385854, 1349694, 1748589, - 1187022, -2511482, 469225, 682900, -1389422, 530428, -4223564, -1203665, -710280, -146566, - -3076807, -772557, 511101, -949725, -521302, -331249, 1524177, -512712, -901943, -442919, - -587337, -2683818, -2238215, 3514894, 1318018, 1844689, -1811403, 1167694, 35433, 373662, - 325344, -1489280, -1858110, 147640, -675384, -246961, - }, - { - 2535105, 15714212, -16253230, -6390375, 1688459, -2909304, 1631014, -1177358, 958851, -2308545, - 5034776, -5628018, 2665027, -37454800, 31453656, -3528853, -4276177, 16106664, -24432458, -22029424, - -19118510, -668941, -10004589, 5687074, 233539, 3989488, -12054899, 7275675, 5637682, 5935108, - 184147, 1813550, 10424422, -1379221, 3979824, -8384850, 16776142, 4093641, -2413772, -455803, - -6624987, -4513474, 7034620, -4050691, 928787, 3287798, 2591476, 8671539, -526670, -7340099, - -1903744, -5699422, -3603478, 3754875, 1129040, -1264868, -2180770, 755914, 3360275, 3055869, - -2830920, -1605244, -1416266, 4160750, -1065152, 2593087, -3396246, -430034, -316754, 1898376, - 1200980, -1187559, 2069101, -48318, -1594507, 38118, 251792, 347355, 183073, -1281511, - 185757, -2027761, -2339684, 416075, -1264868, -787053, 127238, 671626, -665720, 1917166, - -1378148, -756451, 238371, 784905, 52613, -56908, - }, - }, - { - { - -4759361, 131479152, -26678190, 34133716, -11597485, 2794950, -2996277, 2653753, -5050345, 7352447, - -10465762, 10237055, -1646046, -950262, -4553739, 883690, -5589900, -450972, -3383897, -254477, - 7552700, -1522566, 6227703, 1896228, 7995082, -3245922, 3495030, 956167, 4426501, -2374580, - -4751845, -4737349, -6329171, 2946348, -7367480, 266288, -3648038, 4294968, -2505040, -2414845, - 1960653, -2310693, 5969468, 4794794, 817654, 4913980, 239444, -151934, 3010235, 2952253, - 2202245, -61740, 2782602, -1009854, 658741, -161598, -688805, -854162, -2310693, 1033477, - -5853504, -665183, -3406983, -2708514, -3512210, -4017942, -144955, -2259153, 217970, -1010928, - -1515587, 77309, -1029718, -801548, -2612951, 50466, -1746441, 1626719, 673773, 2702071, - 1219771, 1100585, -543313, 1011465, -1069447, 858457, 170725, -324270, 1435056, 1058710, - 380105, -41339, 400506, 179315, -1008244, -377957, - }, - { - -593779, 47003584, 2055679, -40236864, 6259378, 2479270, -1389422, 77846, -1706713, -3628174, - 1347009, 3103651, 2534031, -3025805, -1319629, -9074729, -1171452, -929324, -7213935, -5964099, - 17179332, -1427540, -3738769, 14106820, 4651987, -566936, -8252780, 3211562, 7370164, -6563784, - 457414, 5832029, 3404299, 2826089, 6853157, 5181341, 660351, 90731, -2554969, 498753, - 1279900, 2393908, -6190659, -4855461, -499827, -3110630, 6482717, -5418101, -2126546, -3554622, - 2463701, 1826435, 6292664, 279710, 3564823, -2425046, 68183, -85362, -3693672, -3191698, - 4693863, 2564096, -501974, -3855807, -2760053, 4012036, -3780108, 1177895, -76773, -2601140, - -180926, -1157494, 1861332, 932545, -935766, -726386, 744103, -1181653, 1865090, 1751810, - -362388, -389768, -747324, -1765232, 106837, -430034, -90731, 887448, -2147, -622233, - -1932735, 306553, 353798, 44560, -328565, -846645, - }, - { - 3326989, -88806504, 1459215, 45683420, 13360570, -2618856, -4001836, -6660958, -923955, -6760279, - -4303021, 29256244, 360240, -1334124, 5716602, -12021077, 13571023, 2728378, 20247012, 8590, - -8624294, -8203925, -1935957, -2124935, 4692252, 5318244, -2390686, -371515, -807454, -5068599, - -1276142, 13377213, 96637, -1755031, -6889665, 5258114, -5814312, -4514548, -9170829, 1732482, - 397284, -2196876, -1311576, -1359357, -4473209, -1614371, 3318936, -6783901, -4318590, -2775623, - -3293166, -2802466, 4986994, -2778844, -206158, -4596152, 3555696, 1656247, 5142687, 1183800, - 4356171, 5837935, 2205466, -708133, 1977833, -503585, -1915555, 2660732, 469225, -374199, - -1884954, 952946, 714575, 535797, -1350230, 3508452, 283468, 786516, 936303, 1124745, - -330176, 1451162, -2127620, 323196, 1883880, -623844, 567473, -851477, 2506114, -276489, - 772020, -1210107, 373662, 162135, 1058173, 1025960, - }, - { - 1775432, 49378164, 2850785, 45544908, -7512972, -2193118, 1663763, 2423972, 2527052, -10917270, - -6402723, -2754148, 5535139, -4002373, -14220100, -5980205, -1869385, -15057618, -8616778, 4670240, - 3944928, -4252018, 1666984, 2439542, 1880659, -1418413, 8463770, -12906914, 1751810, 6445136, - -3497177, -830002, 6260989, 1302449, 1406602, 619012, -668941, -4778688, -550830, -823560, - 1868311, -3022583, -4583804, 3943317, -1918240, 861141, -2535105, 3184718, -718333, 174483, - -2769180, -2338073, 521839, 2350958, -1635846, 2744484, 1675037, 5548561, -6616934, -333934, - 4175782, 731218, -430570, 1562294, 3779034, 1631551, -593242, 1105954, -502511, 144955, - -299574, -331249, -1112933, -2730526, -83752, 817654, 177704, 1916629, -2258616, 308701, - 2816962, -665720, 52613, -1368484, 500364, -727460, 1241246, 1563905, -734439, 154619, - 1051730, 1825898, -963683, 1328219, 668941, -236223, - }, - { - 2034204, -19025094, -10309532, -7266011, 2719788, 359167, -3712462, -1292785, -414464, 3876208, - -649077, -3802120, -545461, -1889786, 30527554, -6555731, 4393215, -23632520, 4425427, -4236985, - -13437342, -6803765, -1409823, -2852932, -396748, -13429289, 5510443, 10292889, 568546, -1433445, - 6661495, 2873870, -5512054, 4770635, 2376728, -4092030, 4205310, -7223598, 6556268, 7274064, - -122943, -7051800, -138513, 1308354, -2213519, 3547106, 7571491, 1129040, 2914135, 2966212, - -4570382, 3701188, -1722819, 4362613, 102542, -642098, 1965484, 1413044, 1275068, 2064806, - 1184337, 471373, 211527, 2481417, 624918, 371515, -1182190, -4258997, 872415, -2330557, - 1335198, -799938, -2335925, -391916, -677531, -764504, -1091459, -1251446, 868657, 2333778, - -811212, -1496259, -199716, -834834, 670552, -941135, 762894, 732829, -357019, 502511, - 79994, 907312, 1969243, -103616, -4295, -274341, - }, - { - 10661183, 49352396, -2836826, 44430364, 5128191, -1362042, -417686, -1566053, 6930467, -3789772, - -1654636, -5631239, -7717520, 10700911, 1761474, -15520401, 1222455, 13699872, -198642, -8287140, - -5394479, 5559835, 4888747, 4757750, 3093987, -2247342, 1312113, -8553427, 2513093, 4686346, - 3483755, 4778151, 269509, 1330366, 98247, 2661269, -337155, -8649527, 2441689, 7029788, - 1948305, 2532957, 966905, -3586298, -1902671, 5155572, 1379758, 1745367, 1255204, 55298, - 1243930, -5721434, -2738042, -3390877, 1088774, -1388348, 3114388, -205085, 450972, 590558, - 2955474, -2723009, 1299765, 2871186, -2602213, -766652, 2084670, 2689187, -368830, 343597, - -1103807, 2714956, -717796, -383863, -922881, 1144609, 220654, 2202781, 1432372, 67109, - -322123, -351114, -1313186, -1163399, -532576, 89121, -251256, 936303, 500901, -838592, - 2262374, 162135, 1002875, 858457, -452045, -469225, - }, - { - 58519, -1496259, 13545253, -1839857, -1397475, -1924682, 44560, 1773822, 246961, 2919504, - -6418829, -4237522, 1814087, -9456981, -4961761, -10382547, -14219563, 14048838, 5398237, 7668127, - 2675228, -15925739, -2644089, -14939507, 4326106, -1549410, 7281044, 9835475, -7240241, 8091719, - -8855686, -3712999, -7750806, -4043175, 4512400, -8071318, -2370285, 678068, 2903398, 2863133, - 2577517, -2213519, -4511327, 5458367, -3830574, -1899986, 6007586, 1320703, 1635846, -940598, - -1903207, -4651987, 2847027, 987843, 1002875, -2674154, 2456721, 2199023, -4106526, 233002, - 724776, 4177393, 505196, -2118493, -1345935, -1094143, 2072322, -1013612, 3229816, -1165547, - -781684, 1970853, -2126009, -217970, 2478733, -298500, 2895882, 867583, 1542430, 151398, - 3365107, 1278827, -1101659, 250719, 1410897, 560493, -267362, -505732, -1561221, 195421, - -2335389, -59056, -1228898, 692027, -689342, 1218160, - }, - { - -6482717, 103470592, -12831752, 13959181, -2494302, 4186519, -17912698, -11582990, -3798362, -12546673, - 18860812, 851477, -6660421, 10098542, -2267206, -3376918, 2100776, 7228430, 1717450, 4654134, - 267362, -5956583, 2477123, 5201206, -12931073, 4875862, -678605, 1200980, 2064806, -751082, - -4703526, -3277597, 4975183, -2582886, 2408940, 49929, 1436130, -5395016, 3581466, -496069, - -3911642, -4326106, -914291, 4825933, -6779606, -429497, -3663607, -1633161, -1242856, -1704028, - 517007, 3397319, -1748052, 5046050, 5218386, -1014149, 4475356, 529892, 1422708, 1770063, - 1746441, 157840, -911070, 901406, -718333, -2780991, -242129, -1270237, -1299765, -3025268, - 3071439, 1425392, -387084, 780610, 1257889, 728534, -432718, -2342368, -73014, 386547, - 1534377, -350040, 290984, -448824, -143881, -220654, -1651415, -822486, 881005, 2092186, - 1065152, -2649458, 471910, -260919, 1012002, -1239098, - }, - { - -142271, 21223580, -6332930, 5667210, 1903207, -1664837, 1933272, -177167, 279173, -435939, - 797790, -3534221, -9808095, -2352568, 17333414, 12769475, 16013249, 6484864, 2510409, 14542759, - 3110630, 368293, 6849399, -1037235, 6019397, 9819906, 7231651, 53150, 3311420, -5559835, - 4559108, 15551540, -4808753, -9354976, -2688113, -16522202, 2926483, 5808407, -1704028, 1857037, - 7737921, 6240588, -6062883, 2458332, -3823595, 3824669, -5173288, -2100239, 440234, 5546414, - 2352568, -549756, -5028333, 2678449, -2485176, -891743, -198642, -594853, 4495220, -1518808, - -98247, 1471026, -2584497, -3299072, -3258807, -5259188, -2459406, -403727, -1754494, 376347, - -1439888, -1782948, 3584150, -1599339, 1540820, 1056025, -228707, -1446867, 561567, -1297080, - -102542, 975494, -994822, -6979, 159451, 638876, -727997, 1958505, 1186485, -1026497, - -227096, 834297, -1166621, -177167, 308701, 729608, - }, - { - 12808129, -96911640, 137439, -3785477, -331249, -9513353, -10602664, 27614492, -6117107, -21078088, - -1169842, 149787, 5624797, 5138392, -1883343, 2735357, 2397129, -6292127, -11603928, -4532264, - 3206730, -4358318, 879395, 16087874, -6837588, 588947, -2331630, -548682, 8334384, -4618701, - 5843303, -1290101, -5507222, -1742146, 4350802, -1771137, -1196148, -2266132, 1725503, -974958, - 4296578, -692027, -1971390, 3710315, 1189169, -2997350, 993211, 654983, 5338108, 827318, - 2858838, -6413997, 1082869, 3251290, -397821, -6978248, 3562139, 3120294, -4522601, 3596498, - -7341173, 5083631, -681826, 2478733, -1186485, 7529078, 112743, -155156, -3342022, 425739, - 757525, 2611877, 1047435, 323196, -2363843, 977105, 232465, -408559, -210990, -143881, - 3453691, 159451, -273804, 1920387, 2168422, 2510409, 2102387, -794569, 556198, -1479079, - 378494, 1117765, -121333, 290984, 792421, -215822, - }, - { - -1029182, -36887328, 21726092, 2032056, -415538, 23702850, -10733123, 508954, 11304354, -1118839, - 4613869, 1564442, -20398410, -1712618, 9046275, 3474629, 4770635, 13164612, 6169721, 3023120, - -7298223, 1803349, 6561637, 7522635, 9719511, -4702989, -6119255, 970126, 3359738, -5191542, - -6944425, -75162, -2409477, -4878546, 11240466, -1305670, 6074158, -505732, -4693863, -5071820, - 1034013, -3280818, -4097936, 1213328, 1829119, -1545115, 2626373, -6697465, 2571075, 5520644, - 1096290, -2692945, 811212, 1100049, 911070, -4384088, 3082713, 193274, -1799054, 733366, - 368830, 5013838, 2200634, 2324651, 2589865, -1855963, -1947231, 3251290, -64961, -618475, - 637266, 731218, -427886, -1807644, -386010, -535260, -415001, 168041, -2194728, 2222646, - 818191, -241592, -21475, -1615982, -126165, -294742, -2039573, -1755568, 392990, 735513, - -1210644, 733903, -3249680, -72478, -420907, -187905, - }, - { - 20421496, -36117992, 27560806, -3325379, -18095234, 9335111, -17328046, -5388574, 79457, 24402394, - -12008729, 1707786, -8382703, 7281044, -9695352, 5719286, 9954660, -16107738, 359704, -7123204, - 13419625, -3359738, 10420128, 3733400, 831076, 3995393, 4505958, -3568044, -908922, 12539157, - -10594074, -1867774, 4648765, 1833414, -9443022, -1989107, -7711614, -594316, 866510, -5347235, - 3599720, 6929930, -838592, -1540820, -1279900, -3541738, -7155953, -307090, 6728603, 1012002, - 5786395, 683437, -8910983, 3821447, -1158567, 6979, 447213, 3446711, -1728188, 1390496, - 1059246, -649614, -5133560, 467615, 3812857, 381715, -6176163, -1132261, 1982664, 2995203, - 1504849, -1530082, 315143, 991064, -2201708, -900869, -201327, -748935, -1942936, 1347546, - -1442572, -164819, 2703682, -2183991, 503048, 2812130, -2597918, -1769527, 1063004, 203474, - 921807, -397284, 414464, -1823751, -1395328, 193274, - }, - { - 1894081, -27148488, 10708964, -6549825, -2856690, -187368, -9230958, -1266479, 709207, 7682623, - 4284230, -1570884, -8945880, 14079440, -11211475, 6474663, -5543192, -8912057, -5499706, 10568841, - 1331440, 461709, -6710350, 10302553, 6502581, 9275519, 5895380, -7142531, 9873593, 6207302, - -6998649, 5859946, -806380, 2811056, 688805, 3929358, 3830037, 5124433, -9729712, -482647, - 591632, 724239, 913754, 2502892, 1222992, -3112241, -3947612, 1639604, -7498476, -2489471, - -897648, -46171, 1174137, 1086627, 3289945, 823560, 2057826, -1592896, -998580, -1449015, - -287226, -877784, -2976949, 786516, -264677, -4033511, 1318018, 1323924, 1788854, -3071975, - -227633, 207232, 928787, -2237141, 564251, 1286880, 130460, -247497, 500901, 2083596, - 63888, -1192390, 1683627, 374199, -2982318, -1296006, -138513, -1642825, -45634, 43487, - -2223719, 549756, -549756, 720481, 1236414, -1395864, - }, - { - 15196668, 7199439, -19578072, -4466229, 1941862, 7711614, -9517648, 1324461, -13415330, 6562710, - -1062468, 5977521, 12163884, -5436355, 13100187, -5552319, -9740986, -7044820, -2610803, -2175938, - -7186017, -6946573, -710280, 7924215, -2214056, -4765803, 6818261, 5978058, 8701604, 7890392, - 284005, -6492917, -7930657, 6290517, 12663174, -11487964, -5894843, 5110474, 2586644, -2884608, - 6096706, 1626182, 2455648, 770410, 4663261, 1045825, -5041218, -8486855, 4545686, 731218, - -521839, -9370545, 2805688, 1826972, 3092377, 4581120, -3371013, 2706903, -3775276, 3118146, - -730144, -457414, 392990, -403190, 856846, -2455648, -2101850, -1999844, 1509144, -1540820, - -2299955, -2622615, 657667, 2021856, -1173063, -1472100, -650688, 68719, -835908, -594316, - 480499, -1982664, -1252520, -98247, 2308545, 1624571, -846109, 653372, -253940, 1221381, - -1186485, -336618, -1167694, -661425, 126702, 585726, - }, - { - -3483219, 12208445, -6128382, -11111080, 8310762, -1604707, -2711735, 1655710, -2769180, 3579318, - -6337761, 712965, 296890, 12571906, -50443856, 13675176, -6359773, 8789651, -21750252, -22841172, - -8391829, -10327786, -2711735, 6979, 3234647, 3289945, -12995497, 7042673, 5153961, 11940546, - -5722507, 8650064, 5320928, 3964792, -4063039, -7634305, 14930917, 4468914, -3971234, -616328, - -5555004, -1529008, 857920, -1693828, 1750199, 1989644, 80531, 9249749, 98247, -1715839, - -9074192, -3594888, 3003793, 1537598, -362925, -3933653, 1842541, 775778, 810675, 2552821, - -620623, -4918812, 855235, 5094368, -110059, 2127083, -2543158, 352187, -2574833, 898722, - 1752884, -458488, 3052111, 759672, -1817308, -1412507, -207232, 960462, -337692, -920197, - 874563, -2242510, -1848983, 122407, -371515, 30602, -1973538, 2484639, -801011, 122407, - -307627, -424665, -114890, 1715839, -1278290, -615254, - }, - }, - { - { - 8476118, 194603360, 18064096, 67243080, 9599789, 8686571, 561030, 3219615, -7808788, 6730751, - -6866042, 16627429, 5761699, 5461051, -2617246, 3245385, 6285148, 4706748, -4914517, -4014721, - 4510253, 1301912, 9800042, -209917, 9234717, -6313602, 3430605, 8946417, 7012071, -11133629, - -8965207, -1865090, -5369246, 6415071, -2419677, 2234457, -9662066, -1611687, -1372242, -2342368, - 7231651, 6444062, 2768643, -4987531, -4657355, 5884105, 840740, 631897, 2797098, 488553, - 653372, 200253, 1566589, -2318209, 3256659, 2872796, 1573032, 2400887, 665720, 629213, - -6664179, 1989644, -426276, 452582, -687195, -1602560, 1177358, -820339, -746787, -1495722, - -3209414, -2847027, -1347546, -1121523, -2116882, 432181, -3304977, 285078, -432181, 185757, - -818728, 474594, -303869, 651761, -463320, 886374, 142808, 112206, 56371, -66035, - -138513, -122943, 736587, -19864, -423591, 946503, - }, - { - 1418950, 33784748, -10628433, -22093312, 20374252, 1516124, -3325379, 5361193, -491774, -3902515, - -285078, 1960116, 4491999, 3833258, 315143, 2838437, 12889734, -4117263, -3748433, -239981, - 4476430, -6922951, 6176163, 15568183, 4237522, 590021, -8464307, -3612068, 1647120, 788127, - 7592966, 4512400, -4405026, 2394444, 11387032, -889058, -5878200, -1733556, -3585761, 3241627, - 209917, -1617055, -4226785, -2391223, -1636919, -4677757, 7910793, -2108829, 1146219, -5993627, - -470299, -574989, -727460, -5367636, 4481262, -3586298, -1876901, 119185, -1341640, -5559835, - -748935, 887448, 745177, -1146219, -111669, 4881231, -2967823, 1739462, 3105261, -1520418, - -2306934, -2553358, 1661616, -275415, -2564096, -413391, 963683, -2918967, -343597, 455803, - -823560, -421981, 340913, -595927, 801548, -798864, 551366, 3186329, -788663, -1239635, - -1003949, 117575, -121870, -1076963, -696858, -435939, - }, - { - -5030481, -80250392, 15880642, 2712809, -17063368, 410169, 3005940, -1869385, 5893232, -798864, - -1931125, 32806570, -12492986, -9113384, 3787088, -15680926, 11302743, -1240709, 13240847, -3073049, - 279710, -1435593, -1699733, -7357816, -1051730, 5757941, 1791001, 5860483, 2588792, -1433445, - -1716913, 3413962, -1861868, -5002563, -2209224, 9410273, -8631274, -605590, -8062728, 2371359, - 3674882, -2387465, -956704, 2862596, -3015604, -1280437, 5472325, -454730, 3710315, 3614215, - 1680943, -2446521, 4989679, -4421132, -17180, -4066260, 2768107, -306016, 3034395, 569620, - 3316789, 1586990, -2016487, 2113124, 5271536, -762894, -3082713, 2299418, 924492, 693637, - -1427003, -1168231, -994822, 2371359, 163746, 2051384, -2241436, -741419, -451508, -570157, - -1336272, 1526861, 336618, 1382980, 1535988, -253403, 453119, -1519882, 833761, -2239289, - 472983, -471373, 34897, 190052, 796180, 1101122, - }, - { - -10524280, 24904368, -8654359, 53585624, 4032438, -2851858, 1184874, 2516314, 7224135, 505196, - -14880988, -10585484, 7522099, -2057826, -6056978, 13614509, 12313134, 1621350, 12329240, 8151848, - 3372623, 4846871, 2159832, 1865090, 9361418, -3243774, -2453500, -12987444, -813896, 325881, - -1777580, 2710124, 693100, -1247688, 8360154, 5111548, 1940252, 1769527, 8311299, 4981089, - 5222680, 777926, -3839164, 1144609, -1657857, 343597, -7454990, -1698660, -2536715, 650151, - -2359011, -194884, 132070, 3561602, -229781, 1926830, 876173, 3486977, -6928856, -1015760, - 508954, -1070521, -3273302, -1894618, 681826, 2540473, -2713883, 33286, 134218, -64425, - -1451162, 713501, 533650, -2661806, 742493, 261456, -1504312, 1915555, -996969, 1054415, - 180926, -2289218, 957241, -1373316, -104690, -1460826, -364535, 459562, -824097, -948114, - 43487, 1709934, -1385127, -1213865, -1395328, -741956, - }, - { - -1954747, -3105261, 8837432, -8919573, 1020592, 1003949, -1895691, 2419677, -359167, 2240362, - 2112587, 5065377, 940061, -6100464, 45679124, -2369748, 341450, -31918586, -8032126, -536334, - -4545149, -1347009, 1376000, 2252710, 4238059, -6550362, 14773614, 9419400, 7092065, 11047193, - 7221451, -1886564, -4643934, 1496259, -5077188, -9548786, 4249334, -7161858, 3370476, -649614, - -3295314, -6529424, 153008, 1967095, -5140002, -782221, 5622112, -1528472, -2027761, -603443, - -2938295, 6755984, -1000727, 2405719, -692564, -308164, 428423, 3875134, 4961224, 2014877, - 477278, 1504849, -750009, -1202591, -2484102, 387621, -1313186, -4393752, 475668, -1796907, - 3483755, 2820720, -1277216, -839666, 241592, 293668, 699543, -1371705, -1512365, -543850, - -1697586, -1431835, 319438, -89657, 1564979, -1161252, 290447, 955093, -358630, 600759, - 745177, 231391, 464393, -223338, 937377, -446677, - }, - { - -22309134, 10002442, 8775155, 47809964, -1345399, 216359, 10704132, 8706972, 17191144, -5887864, - -2855080, -566936, -9655086, 364535, 3076807, -4218195, 2539400, 9695352, -2370285, -7415798, - -4006668, 372052, -3303367, -1586454, 1837709, 3253438, 1772211, -6190122, 10351408, 7252589, - 2530273, 4753992, 77309, -837519, -4138738, 938450, 6691022, -3998078, -966905, 946503, - -4034048, -819265, 2397666, 105227, 2818572, 8676908, 352187, 2887829, 4382478, -2552284, - 33823, -326418, 282931, -4569845, -1095217, -285078, 4110821, 580357, -493384, 277562, - 1557463, -4115653, -904628, -226560, -1704028, -1490354, -3127810, -296353, -1685775, -194347, - -1442035, 1537061, -278636, 1098438, -179315, 1206349, -1530082, 366683, 1091995, 619549, - 565325, 925029, 66572, -413927, -1154273, -263067, -549219, 140660, 1054415, -73551, - 1108102, -772557, 752156, 354335, -493384, -505732, - }, - { - -357019, -17834852, 2681670, -184147, 442382, -3127273, 1037235, 5417565, 4081830, 2157147, - -6560026, 2084133, 6187974, -662499, 5850819, -7697655, -16232292, 4032974, -6474127, -1242856, - 6056441, -14778982, -9631464, -8848706, 20140176, 2799782, 1775969, 8270497, -280784, 8185134, - -8087424, 2470680, 1184337, 2943126, 7365869, -624381, -1198296, 1971390, 4552666, 1592359, - -2600603, -2520072, -4698158, 4784057, -1966558, -1772211, 907312, 1536525, 2534568, 1039919, - 4416300, -4612795, 1991254, 4855461, 3788698, -2409477, -692564, 2336999, -2224793, 1143535, - 1431835, 3976603, 1435593, 2050847, 2422362, 386010, 1621887, -1242319, 4673998, -397821, - -472983, -129386, -4243428, -1950452, 604517, -1622424, 1068910, -1223529, 482647, 13422, - 1144609, -494995, -1120450, 386547, -326418, -204011, -66035, 633508, 387084, 545998, - -1552094, 1490354, -1464047, 751619, -564251, 460098, - }, - { - -11401528, 101722008, 5282273, -809601, -19916300, 9881109, -11502996, -8265128, 985695, -7133404, - 28235116, 8227547, -4060355, 11402064, -1175747, 7478075, 8450885, 7001334, 2092186, 1930051, - -2968896, -14352170, -1919314, 11909407, -3956739, 7511898, 2520609, 1648194, 1365263, 2133525, - -3634616, -4418448, -337692, -3426310, 6491843, -3939559, 2527588, -5263483, 2852932, 2768643, - 1028108, 999654, -1095217, 1954747, -5522791, 370978, -802622, 265214, -6846715, -1310502, - 2619393, 4028143, -3928285, -691490, 3257196, -2010045, 2578054, -883690, 305480, 3352759, - 5903970, 2308545, -3766150, 1407139, 1652489, -2309082, -1619740, -1450625, -829466, -3188476, - 472983, -275952, -571768, -1432909, 33286, 2100239, 635118, -3408057, 148713, 782221, - 828392, -529355, 1582159, 639413, -768262, -1650341, -2110977, 365609, 1708323, 288837, - -154619, -1167694, 2256469, 1144072, 1298154, -1646583, - }, - { - -1877975, 8194798, -10692321, 6910603, 152471, -2831994, 2433099, 3773129, 4540854, -3111704, - 5309654, 2062121, -7677254, -11201275, -6204617, -6395743, -2072859, 4185446, 7074885, 5781563, - -234613, 7313793, -214212, -8319352, 4956929, -4559108, -4468914, -1724966, 697932, -17217450, - 4621922, 2341831, -17166448, -321586, 10298258, -8907762, 3178276, 3001645, 1970316, 2216203, - 750009, 1560147, -9856413, 1154809, -3942780, 1806034, -4595078, -1287417, 649077, 4985920, - 2894808, 1764695, -4358855, 3254512, -1610613, 2569464, 3005403, -1054951, 2625836, -2655901, - 2240362, 829466, -2695092, -978716, 696322, -1441498, -862752, 819265, -2630668, 299574, - 263604, -981937, 3471407, -1609539, 3467112, 3011309, 1397475, 820876, 1613297, 603980, - 220117, 375273, -635655, -672162, -41876, 229244, -2328946, 606664, 622770, -838056, - -235686, 181999, -292058, 1245541, 1516660, 489089, - }, - { - -11956652, -121959352, 11861089, -1336809, -18861886, 3637301, 22212498, 38017976, -7088307, -35902704, - 2492692, 7970923, 3224984, 10474888, -3735011, -1093069, -2267743, -9335648, -8858370, -848793, - 6797860, 3212636, 5525476, 14457934, -7743826, -9620727, -6358699, -8865349, -382252, -8270497, - 2211908, -5026723, -4581657, -6959458, -1566053, -6791954, -1568200, -3293166, -86436, -2146410, - -3127810, -7109782, -3936875, 3666828, 3605088, -2436857, 2064269, 2034741, 1613834, -7657390, - 1100049, -4447439, 533113, -623307, 1326608, -405338, 6811282, 390305, -4045322, 7815767, - -5117991, 1771137, -1916629, -39728, -2313377, 8292508, 1503239, 2905546, -1576790, 2481417, - 2058900, 3278134, 1560147, -2515240, -5008469, -379031, -23622, -1261647, -1468342, -1517197, - 2160369, 1719061, -997506, -2224793, -76236, 418759, 137976, 81068, -433255, -2582886, - 282931, -65498, -360240, 244276, 765578, -924492, - }, - { - 847719, -46340548, 8791261, 1652489, -6819335, 12008192, -18903762, 3096135, 10448045, -5999533, - 2470680, 11982422, -10452877, -9270687, 4012036, -1240172, -2056216, 10746545, 3693135, 12097849, - 5053029, 3010235, -561567, -3412352, 4312147, -2695629, 359167, 11551315, 5987185, -4973036, - 4680441, -1794760, 2258616, 2078764, 11352135, -4016868, 1818919, 3713536, 4895726, 1529545, - 4435628, 3058017, 749472, -2958159, -3849901, -6561637, 1877975, -2350421, 4978404, -1590212, - -5056787, -4239670, 1273458, 27917, 301185, -512175, 3902515, -3084860, -1959579, 147640, - -2681670, 421444, -809601, -352724, -936840, -2684355, -3277060, 617402, -2989297, -1595044, - 3275450, 1296543, -588947, -1517734, -2451890, -696858, 3038689, 2298881, -2429878, 1848983, - -519691, -1886564, 149250, -235686, 274878, 346282, 489626, 861141, 2503429, 1842004, - -911070, 1141924, -2465311, 750009, -641561, 263067, - }, - { - -12399571, -78685408, 33871724, 960999, -14150307, 39568996, 4675609, -1727651, 288837, 13629542, - -4085051, 11996917, 3623342, 11388106, -13812078, 8150238, 11549704, -16408923, 13217762, -5237713, - 9005473, -4906464, 5117991, -4173635, -10814728, 3826816, 8817031, 3109020, 248571, 9196062, - -6580427, -4503810, 1203665, 5143224, -5873368, 448824, 579284, 4450660, -5479842, -7814693, - 2563022, -652835, -5051956, -1239635, 1857037, -1247151, -5264020, -4749160, 630286, -1459215, - 5305895, 2434173, -9790378, 2917357, 1913945, 4048007, 476205, 2121177, -439697, 990527, - 3745212, 4370129, -1037235, 1140851, 2085207, 851477, -1210107, 2183454, 2092186, 773631, - 1052267, -3319473, -2026688, 1043677, -1352915, -738198, 1818919, 2027225, -1527935, 1228898, - -466541, 1249299, 3347927, -1427540, 39192, 2052458, -1054415, 497142, 598611, -558883, - 1217623, -1188632, 423054, -504659, -1355599, -1526324, - }, - { - -1897302, -27089432, 12502113, -4090956, 4747013, 4247186, -10210748, -6327561, -4800700, 7215545, - 4252018, -7449621, -20556788, 412854, -19190450, 1096290, -3848291, -8880382, -18999324, 10204842, - 10267656, 3163244, -28395640, 3305514, 10238665, 13154948, 12004434, -9179956, 9104794, 5740761, - -7386270, 5624797, -9380209, -2270964, -2142115, 6208375, 6762426, 3264175, -4509716, 243203, - 441308, -2838974, -3474092, -2205466, -1449015, -3753802, -5031018, 594853, -6649146, 433255, - -337692, -2430952, -5852430, -3451006, 2327336, -2029372, -340913, 3083250, 1380295, -591632, - 2906619, 3658775, -707596, 1511292, 3119757, -3553549, -2245194, -278099, -2636573, -3983045, - 2698850, 774705, 2569464, -1524177, -1138703, -1194001, -2257542, -175557, 115427, -1189169, - 1150514, 59593, 284542, -2136746, -3849901, -2345589, -1745904, -2653216, -951872, -608275, - -2575370, -345745, -368293, 1920387, 879395, -1298691, - }, - { - -18613314, -27649926, 1033477, 13717052, 11893838, 17867600, 2510409, 8087424, -7928510, 8708583, - 9764071, 1613834, 7098507, 11096048, 44883480, 12585865, -2103997, 4563403, 13369159, 6842957, - 10786273, -1651415, -12841415, -3620121, -2256469, -1440962, -526670, -7000260, -1491964, 10104447, - -5094368, -13732084, -1695438, 9018894, 12818867, -8293045, -3109556, 1248225, 5164162, 1442035, - 3641059, -6194417, -5480915, -2330020, 6240051, 1992328, 275952, -3825205, 5275294, -4320737, - 1989107, -5976984, -2101313, 935766, 1268089, 4824859, -4766340, -2061584, -4085051, 2353642, - -1496259, 945967, 2450816, 3068754, 3651259, 989453, 1921998, 542777, 2470143, -1078037, - -2035815, -4959614, -281857, 2227478, -1163399, -1320166, -1418950, -37581, 834834, 1678795, - 1610076, -1272921, -406411, -2764348, 253940, 709207, -1407676, -492848, -497142, 1776506, - -1612760, 186294, 179315, 346819, 840740, 877784, - }, - { - 4708895, 23797340, -3089692, -12123619, 9571871, 7803956, 835371, -2913062, -3909494, 6273337, - -7321846, 5497558, 5768141, 13948443, -42402600, 1592359, -18298172, 8404714, -430034, 1526861, - 9905805, 1655710, -497679, 748398, -1105417, 7897908, 1647657, 11628624, -7631620, -6527814, - -14144938, 3274376, 5462662, 1523640, -1731409, -4299263, 5421860, -3176665, -7710003, -3070902, - -12941273, -6821482, 194347, 670015, 467615, -2653753, 1778653, 4052302, -5192616, -213138, - -7547332, 795106, 2771865, 935766, 1959042, -4435091, -193274, -1225139, -2078227, -2214056, - -1478006, -1963337, 1333587, 5184563, -1960116, -1549946, -758599, 802085, -5310727, 117575, - 1632088, -783832, 510027, 158377, -1215476, -2365990, -1492501, 405338, -812286, -946503, - 1698123, 1130650, 930397, -287226, -1416802, 1758789, -271120, 2303713, -2107755, -1181653, - -45097, -291521, -927176, 932008, -921807, -1013075, - }, - }, - { - { - -12286828, 243094608, 22276384, 71637368, -2269353, 5711233, 8790724, -2702608, -12295954, 11641509, - 4535486, 15149960, 3449396, 2161979, 2353642, 280784, 11001559, -3729642, 8767639, -6497749, - 470836, 381715, 11356967, -3487514, 3923453, -7051800, 5061082, 7869454, 8254391, -13240310, - -4872104, -878321, -4052839, 4874788, 1236414, -3131568, -6145562, -5062693, 3203509, -5520644, - 4285304, 13052942, -2410014, -9096741, -1815697, 4184909, -1340567, 1071058, 6789807, -2698850, - 1217623, 3685619, -4250407, -3659849, 4983236, 926102, 2627983, 2636036, 47245, 379568, - -3350075, -1331977, 228707, 2250563, -603443, 791885, -2884071, 1387274, -1736241, 679142, - -3966939, -3667365, -1150514, -1451162, -2030446, -352724, -1968169, -353261, 657130, -2133525, - 1282048, -909459, 794032, -163746, -590021, 631360, -518080, 861141, 850404, -180389, - -925565, -208843, 988916, 289373, 683437, -540092, - }, - { - -1225139, 8748312, 11252814, 9914395, -9714142, 4459250, -1871532, 6366752, -2358474, -6927782, - -13539884, 21649320, -5298916, 5288716, 5472862, -989990, 11865921, 1138166, -417686, -7522099, - 9078487, -13966697, 11605539, 16601122, 1031866, 9067213, -13356811, -7631620, -4869419, 14993731, - 1952600, 9185861, -10131828, 834834, 11834782, -3926137, -4147328, -4177393, -2046015, 7885560, - -1202591, -2110440, -1460826, -5311264, 1916629, -1799054, -786516, 1866163, 1418950, -4471598, - -1249299, -3615826, -1716913, -3240553, 3482145, -5290863, -1424319, -984621, 1599875, -3405372, - -3320010, 804770, 548145, 382789, 2350421, -320512, 2333778, 376883, 2886755, -2262911, - -1719598, -1110249, 222801, -996432, -1939178, -1460289, 885837, -468151, -1744831, 300111, - -745714, -197032, 727460, -1740536, 875636, -1140314, 1378685, 2019708, 93416, -1008244, - -322123, -137439, -709207, -517007, -1001264, -743029, - }, - { - 5963562, -52277804, -17857400, -31862752, 7567733, 1285269, -31139, 1263794, 7606387, -5446556, - 11997991, 18823768, -17133698, 8206072, -13333189, 165356, 3120294, -5074504, 2674154, -1144072, - 9087077, 4439386, -6288369, -1338419, -1961726, 1721208, -107911, 7425462, -1271847, 4214974, - 1465121, -7973070, 640487, -7912404, 6961605, 3668439, -8667244, 786516, -4940286, -26307, - 7227356, -5684926, -38118, 3079492, -537408, -4453881, 6477348, 6236293, 4335770, -520765, - 6005975, -71404, -2889439, 324270, 747324, -1283658, -184684, -2981244, 1769527, 3512210, - 92879, -601295, -692027, 1534914, 2521683, 3078418, -2666101, -1107565, 3538516, -226023, - -645856, -1300838, -909459, 2437931, 2563022, -333397, -1490891, -1074816, 374199, -321049, - -1875827, 1475858, 624918, 74088, 277025, 1516124, -819802, -695785, -1387274, -1499481, - -406948, 322659, -559956, 516470, 947040, 1299228, - }, - { - 14835891, -23852100, 6388227, 59194312, -2726231, -5168993, -3782256, 5514201, -1133335, 12024298, - -18859202, -9157407, 5613523, -1935957, -322659, 13562433, 16943110, 8137890, 8100309, 4488778, - 3184718, 11653320, 2565706, 3991635, 1655173, 6965900, -10446434, 1061394, -626528, -11804718, - 5861557, 3222836, 877784, -70867, 7000797, 2239289, 3384971, 3325379, 6599754, 10528039, - 4368519, -643171, -1712081, -7385197, 2364380, -3597572, -6128382, 990527, -1780801, -3765076, - -1569274, 1451162, -1061394, 1104344, 1339493, 4408247, 2136746, -2177012, -3593814, 2181844, - -3193308, -670015, -1976222, -3316252, -16106, 3719442, -1161252, -1646583, -1171989, 985158, - -1337882, 2056216, 586263, -1775969, -251256, -260919, -1402307, 287763, 472446, 1427003, - -899259, -2091649, -1194538, 792958, -625992, -859530, -504122, -150861, 220654, -1129576, - 241592, 1319629, -23085, -2592550, -1882269, -987306, - }, - { - 1956358, 9238475, 176094, -5532992, -1894081, -362925, -693637, 4300336, -528818, -1040993, - -1955821, 11254962, -1004486, 5469641, 50214072, -15700253, -17136920, -6129455, -13700946, -5395016, - 6746857, -8076686, -4426501, 6299644, 8489540, 1349157, 8142185, 6112276, 8506720, 6394670, - 7384123, -5441187, 6203544, -5747203, -7004555, 2199023, -4627291, 271120, -1649268, -1268626, - -1450625, -3549791, 1465121, 234076, -9023189, 2121714, 4684199, -2277943, -940598, -2559801, - 696322, 1154809, -1093069, 2821257, -736587, 3097745, 1960653, 2510409, 5115843, -872952, - 4687957, 898185, -2882460, -717796, -1405528, -1387274, -1253594, -2646774, 591095, -606127, - 663572, 5068599, -894427, -2079301, 1678795, 1699733, -723165, -413927, 729608, -3349538, - 51540, -1774895, -626528, -96637, 660888, -675384, 1445793, -338229, -171262, 864899, - 660888, -64961, -42950, -687195, 1126892, 904091, - }, - { - 26694832, -73495480, 9372692, 55951076, -796180, 1387274, 11327976, 12079596, 15538655, 1687922, - -6221260, -10446971, 12444131, -19675782, 2758980, -106300, -8577050, 9609452, -4022237, 117038, - 1678795, -4784594, -5235029, -4235375, 4166655, 1146219, 1161789, 1200443, 8238821, 5854578, - -3019362, 2109366, 5543192, -3243237, -900333, -1274532, 2450279, -1607392, -3345243, 1062468, - 1039382, -2785286, -3343095, 5361730, 2759517, 5625334, 3468186, 2885681, 3446711, -4040491, - 1288490, 2493766, -872952, -2740726, -3544959, 1806571, 1109175, 2199023, -1046898, -1082332, - 1115081, -2055142, -4110821, 399969, 613643, -2365990, -5262946, -1014686, -669478, 1081795, - -2702071, 2365453, 842350, -980326, -259309, 84289, 885300, -1024887, -6979, -16106, - 1787243, 817654, 1662152, -981937, -1056562, -981400, 124017, 59056, 252329, 1571958, - -138513, -350577, 647466, -355409, 518617, -599148, - }, - { - -431107, -15459735, -4312684, 965831, -216359, -1633698, 155693, 4610111, 3782793, 2490007, - -6444062, -386010, 8353712, -10695542, 23883240, -13880261, 3295851, -10094247, -6626061, -5619428, - 312996, 577673, -5921150, -3723200, 9306657, 541166, 2458869, 889058, 10692321, 5265630, - -1542967, 1689533, 1302449, 11526082, -4207994, 8588324, -4138201, 9684614, -6548215, 6022081, - -6227166, -3907347, 2596308, 4503810, -3674882, 401043, -3950296, 2682744, 4282620, 2700461, - 2405182, 1256815, -2002529, 3218541, 3074123, -396211, 350577, -1889249, 198642, 3699041, - 383326, 2571612, 1420024, 2165201, 336618, 2778844, 1018444, -37581, 1474248, 911607, - 912144, -2841658, -1859184, -1525250, -2443837, -335007, 1088774, -2003602, -330712, 1777580, - -166430, -2356863, 16643, 1656784, -2070711, 557809, 743029, -739808, 254477, 255014, - 639413, 184684, -820339, 208843, -729608, -489089, - }, - { - 32830730, 54412404, -15163919, -10379325, 10639171, 3928821, -10354092, -7808251, 3264712, 6865505, - 7832947, 19141596, 7012071, -1882806, -1378685, 14698452, 5178657, 12106976, 2547989, 365072, - -6733972, -14541686, 251792, -3052648, 16437377, -226023, 6383932, -141197, -7569880, 10104984, - 453656, -5441187, 2432562, -7533910, 9171903, -11704323, 4927938, -4387309, -832687, 6240051, - 2553895, 561567, 2850785, -4114579, 6773701, -4624606, -1845762, 3917010, -10782515, -538482, - 3221226, -55298, -881005, -1931662, 1377074, -304943, 1335198, -905701, 2024003, 3547643, - 3814468, 1823214, -3570729, 1692754, 806380, -2266669, 873489, -3115999, -2554969, -153545, - -340376, -1073205, -532576, -1457605, 167504, -926639, 2492692, -2712809, 551366, 1272384, - -1472100, 1515050, 979253, -489626, 78920, -1379221, -2270427, 1165010, 2017561, -922881, - -993748, 1097901, 1574106, 1163399, -719407, 983011, - }, - { - 268435, -9968619, -71941, -411243, 1979980, 357019, 1975148, 1201517, 5258114, 3933653, - -54761, -114354, -3645890, 4680978, -23212150, -5748814, -12399034, 14256070, 14768782, -8115341, - -4867809, 11835319, 1705639, -11833172, 10728828, -7803956, -3863860, -9466645, 11057930, -24232742, - 210453, -6657200, -6973417, 5808407, -890669, 2783676, 1934346, -8596914, 11468100, -2202245, - 4613869, -3296924, -8390755, 1986959, 2283312, -3313567, -3200825, -4667556, 5775121, 1956358, - 1656247, 1423245, -2073396, 2612414, -1229971, 4387846, 1142461, -1028645, 2542084, -1853815, - 1493575, -1540820, 890669, -1606855, -352724, 2367064, -2048699, 2006824, -2404645, 533113, - -308164, -1105417, 2195265, 636729, 741956, 2621004, 1278827, 1736241, 1224603, 739271, - 1496796, -1529545, 807454, -167504, -937914, -1137093, -675384, -60666, -545998, 375810, - -856309, -1127429, 1228898, 379568, 809064, 1307818, - }, - { - 10399190, -119824752, -15640123, -17009144, -3307125, 17260400, 20033874, 12022150, -15301895, -10618770, - -4661114, 18826452, -183073, -12275017, 18910204, -3531537, -8630737, -5228049, -9012452, -3733400, - 4090420, 7155416, 10303090, 1088237, 1214402, -16286516, -2341294, -6925098, -6630356, -6851547, - 5699959, -9545565, -11093364, -1669132, -3987340, -4697084, 886374, -4307316, -365072, -3155190, - -5341329, -6461779, 687732, 1358283, 7124814, -5443334, 1607928, -141734, 1482838, -3639448, - -467615, -3478924, -25770, -6679748, 4893579, 4049617, 4438849, -2178085, 84289, 1861332, - 2551748, -2322504, 309238, -3872450, 4720169, 702764, 841277, 4480725, -790811, 4155381, - 1706713, 293132, 2853469, -4974109, -2345589, -1808181, -592706, 141197, -1460289, 96100, - 783832, 1442572, -793495, -3614215, -340913, 797790, -1256815, -169114, -123480, -2350958, - 504659, -773094, -1067299, 750009, 545998, -1774358, - }, - { - 381715, -41173704, 602369, 1157494, -9052717, 583579, -2975876, 2668785, 4269198, -19327, - -9525164, 7721815, 15067282, -14302241, -1246614, 2238215, -12611098, 11536282, 9257265, 10823318, - -1552631, 3326452, -2206003, -1931662, 8135742, 927713, 3208878, 1173063, 12447352, -7706782, - 7699266, -5347771, 455803, 4340065, 5095442, -4764730, 4228396, 4410932, 6642704, 795106, - 1358820, 7656316, 2413772, -4286378, -4849018, -6391985, 2079838, 4235912, -2433636, -4166655, - 857383, -6599218, 937377, -865436, 633508, 4156992, 1669669, -2660195, -2093260, -699543, - -1589138, -1745904, -535260, -1341104, 1313723, -1201517, -3598109, -426276, -4327180, 456340, - 1445257, 862752, -1525250, 1277753, -3204046, 113817, 2226941, 3278671, -1392643, -14496, - 207232, -1577864, -772557, 170188, -486942, 502511, 2064269, 1977833, 1628866, 636729, - -664646, 349503, 143881, -580357, -369367, 590558, - }, - { - -5402532, -83963928, 29687350, 10274099, -1751273, 24533390, -9398462, 7947837, 5985037, -14525043, - 17785460, 2549600, 16422881, 1872606, 5368709, -13511430, 708670, -1655173, 13293998, -1828582, - 8778913, -4029216, -3502546, -84826, -9370008, 1910187, 4269198, 2471754, 1307281, 49392, - 2669859, -3311420, 1644973, 1997697, -5518496, 462783, -2102923, 3478387, -2565706, -5082557, - -1147293, -2097555, -817654, -6602439, 2703682, 317828, -1067836, -3888019, 96637, -251792, - -237834, 3182571, -4764730, -1003412, 5522254, -492848, 554051, 3095061, 537945, 766115, - 4248260, 3469797, 711891, -22012, 2453500, -938987, 5148055, -259846, 3296388, 16106, - -406948, -2134062, -1763621, -1283658, -970126, 1471563, 390305, 3885335, -313533, 232465, - -948651, 1374926, 14496, 1788317, -47245, -158914, 730681, 1804423, -621160, -396211, - 75699, 718333, -1397475, -355945, -1267552, -454193, - }, - { - 2254858, -9759776, -12107513, 53687, 8423505, 3029563, -15261093, 2015950, -4544076, 2966749, - 1226750, -5387500, 1926830, -29800094, -15705085, 13205951, -18249316, 214212, -26754962, 18060338, - -2302103, 10747619, -31875636, 5159867, 5844377, 12887586, 6287296, 1350767, 9002251, -5619965, - 2694018, -7885023, 6908455, -9497783, 7056095, 1996086, 5883569, -2275259, 4098473, -7074348, - 4624069, -6992744, 3581466, -6339372, -4591857, -3519726, -2143726, -2784213, -649077, 1935957, - -1592896, -1858647, -9103720, -1576253, 1694365, -518617, -1592359, 2664490, -851477, 5363878, - -170725, 4588636, 915902, -417149, 3059091, 62814, -5366562, -2674154, -2672007, -2590939, - 2274185, 2829847, 1194001, 252866, -2552284, -1185948, -3360275, 550830, -1683627, -498216, - 1544041, 1197222, -499290, -1167157, -2624762, -2007360, -1458678, -1694902, -3227668, -1180042, - -535260, -1057099, -392453, 731755, 1340030, -629213, - }, - { - 13605920, -71223976, 13483513, 21029234, 2124935, -7399155, 25887916, 3711926, -7108171, 15701864, - 10603737, -4537096, -1207423, 8856759, 48279192, 18666464, 1446330, 3859028, 9882183, -751619, - 7040525, 3256122, -5182415, -10670309, -4052839, 7363185, -6419903, -5516349, -1545651, 2136209, - -150324, -7874286, -131533, 6335077, 1575179, 542240, 932545, -1817308, 2700998, 4911832, - 1493575, -8537321, -8630200, -3368865, 2144263, -2244657, 7552163, 4778151, -3657165, -5757404, - 2925947, -1033477, -4274030, 884226, -1137093, 3266860, -334471, -4282620, -3347927, 1202054, - 2413235, -520228, 2993055, 5287642, 3633006, 1870458, 319975, 788663, 1621887, -678605, - -1911261, -2405182, -1130113, -1305133, 1008780, -1030255, -704375, -2377265, 1975685, 1913945, - 417149, 988916, -1438814, -3308736, 358630, -217970, -463320, -882616, 576599, 867047, - -663572, -664109, 956704, 618475, 73014, -142271, - }, - { - -5015985, 26367878, 12400107, -2582349, -11040750, 17599166, -267899, -2355790, -1393180, 3795677, - -4988068, 1913945, 9277129, -42544336, 51074676, -16134045, -9004936, -10297184, 11141682, 13266617, - -5645198, 11823508, -4527970, 3169686, 4654134, 2962454, 11386495, 1968169, -8261907, -20877836, - -3287798, -1405528, 7586523, -3700114, 11252814, -1162326, -2344515, -3658239, -8685498, -1364726, - -14185203, -9758166, 6709276, -1277753, 3015067, -9591736, 8705899, 4552129, -12679817, 1554241, - -2645163, 16106, -1416266, 1235340, -804233, -970663, -170188, -1999844, -517007, -1632625, - -2013266, 674310, 36507, 620086, -3339337, -564788, -656056, 744103, -3897146, 179315, - -1455457, 2258616, -673773, -2309619, -430034, -2156074, -1403381, -433255, -2029909, 3927211, - 179315, 1527935, 736050, -296353, -1825361, 2169495, 574989, -1573032, 297427, -1096290, - -1147293, -452045, 1055488, -1673964, 410169, -660888, - }, - }, - { - { - 13093208, 247990336, -14329622, 47121696, -12508555, -248034, 5756867, 7487202, -8693551, 23965380, - 15388868, 7457674, -6705518, -7152731, 6803765, 796716, 1611, -17305496, 3553549, 93952, - 3665755, 946503, 4393752, -5639829, 1272921, -8451959, -3954054, -1934883, 11125039, -7316477, - 1573569, 8552354, -1289564, -3158949, -2373506, -3847217, 1284732, 762894, 6447820, -2627983, - -4450660, -11274, -6177774, -9505836, -1268089, 984084, -5062693, -4278861, 5624260, 2428267, - 2508798, 1368484, -6164889, -4903242, 2815351, -3513283, 2408403, 2741263, -2690260, 1866700, - 861678, -3173981, -2500208, 203474, -760746, 2498060, -2843805, 1673427, -1289564, 2412161, - -2414845, -2655364, -54224, -1384590, -4501126, -970663, 881542, -154082, 478889, 425739, - 3117610, -1109175, -631360, -2090039, -1504849, -71941, 298500, 781684, 1205812, 1402307, - 197569, -349503, -698469, -17180, 634581, -943282, - }, - { - 632434, -25645250, -15093052, 22436910, -2009508, 1265405, -4132296, 221191, -8254927, -1738925, - -4194573, 20889648, -15071040, 1120450, 7966628, -9292162, 187905, -2259153, 2885681, -15147276, - 7221988, -1167157, 3820910, -8740258, -9352291, 11959873, -17853642, -5690295, -1604707, 19136764, - 1522566, 8120173, -8070781, -2401961, 4555350, -5006322, -3236258, 23085, -12348, 4205310, - 2477123, 6159520, 4001836, -3135863, 5352066, -1865090, -8369281, 1076963, 1758252, -882079, - 1269163, -3497714, -1728724, -2528662, -150861, -6257768, 3245922, 369367, 1370095, 303332, - -844498, 77309, -27380, 1686848, 2399813, -1729261, 5192616, 925029, 925565, -213675, - 1500554, -911070, 808528, 667867, 887985, -441308, -530428, -374736, -1884417, 690953, - -1824824, -903554, 901406, -2929168, 227633, 48855, 1081795, -156229, 79457, 688805, - -28991, -497142, -132607, 1285806, 447750, -788663, - }, - { - -6194954, -6754910, 25224342, -38967164, -41876, 1012002, 499827, -5455146, -2211908, -2696166, - 16600049, 16423955, -16568910, 5691369, -11766063, 10462003, 5990943, -4439923, -1610076, -6937983, - -1539209, -3987340, -5699959, 4893042, 6072547, 394600, 806380, 11245835, 1308354, 6697465, - 2547453, -4967130, 5741835, -6786585, -1032940, 2745021, -6325413, 2619393, -4172024, -5803575, - 3294240, -12739947, -5108327, 3490735, 5640366, 5660230, 13194676, 8914205, 5276904, -6241661, - 3067681, 4846334, -5101885, -536871, 4567698, 173409, -1570347, -4744328, -1081258, 1794760, - 419833, 440234, -1815697, -3799972, -2595771, 3929358, -190589, -1206886, 1898912, -22012, - 1715839, 894964, 645319, 751082, 876173, 763967, 2820183, 796716, 905701, 702227, - -1414118, 1047972, -482110, -948651, -1184874, 439697, -1117765, -597000, -1583232, -602369, - -734976, -785979, -694174, 18790, -149787, 1238024, - }, - { - -10217727, -84373560, -15809775, 60349124, 3094524, -3694746, -4118337, -3364570, -5223754, 13458817, - -18177912, -6790880, 4218195, 273267, -1287953, 65498, 15774341, 5617817, -3068217, -317828, - -807454, 4796942, 12593918, 16902844, 7000260, 9777493, -10915123, 9549860, 13838385, -6573985, - 4345433, 10796474, 6292664, -1336809, 2725694, 4391604, 4735202, 435939, -634045, 3800509, - -4056060, -9666898, -3530463, -6601902, 1260573, -3091840, -2588792, 3062849, -341987, -5677410, - -689879, 3907347, 1640141, 2514703, -142808, 938987, 2978023, 1328756, -2383170, 3485366, - 1071058, -328565, -1121523, -58519, 2945811, 3795677, 2219424, 1629940, -1891933, 1512902, - 2236604, 1168231, -906238, -231391, 72478, -902480, -2880313, 798864, 1591285, 1149978, - 135828, -77846, -691490, 452045, -1096827, -1275605, -900869, -432718, 1055488, 657667, - 118112, 189515, 736587, -310311, -60130, -372052, - }, - { - -1894618, 19062676, 9038222, -554051, 1471563, -89121, 121870, 715649, -1014686, -1605244, - -1781875, 11710765, 1669669, -5938329, 19071802, -21467858, -10719165, 24029806, 6826851, -10961293, - 2018635, -13154411, -14154602, -3848291, 6580427, 12205223, 12084427, 4066260, 6383932, -6295885, - -1847910, 1047435, 18502182, 6576132, -2377265, 4017942, -1201517, 2891587, 3040300, 2833068, - 215822, 625992, 1919314, -741419, -2453500, 2234994, 2093260, 478889, 1406065, -577136, - 2330020, -2473901, -2782065, 4810364, 510564, 1257889, 4210679, 3694746, 1866700, -586800, - 7431367, 3137474, -2008971, -1003949, -1480690, 427349, 4312147, -399969, 1241246, 336618, - -1875290, 5628555, 1309965, -2137820, 1877438, 1377074, -1148904, 1801202, 2783676, -2851322, - 2691334, -355945, -2287607, -705448, 99321, -1619740, 615791, -739808, -815507, -358630, - -473520, -233539, 426812, 53150, 1365263, 542240, - }, - { - -17211544, -175136960, -10822781, 54636280, -12811887, -181462, 8150238, -4380330, 472983, 1893007, - -4462471, -14125074, 1812476, -26986890, -612033, -4462471, -14723685, 1916629, -10359461, -8225936, - -399432, 4758287, -4751845, -2370285, 11801496, -2701535, -6049462, -5921150, 2674154, 5818607, - -1403917, -2506650, 5486284, -433255, -297427, -3215857, -568546, -4183835, -5949604, 2439542, - 9075803, 3736085, -631360, 838592, -4710506, 558883, 290984, -1491427, -1210107, -3724274, - 2203318, 2972654, 1424319, -275415, 46708, 2116882, -536871, 1290101, 437013, -1596654, - -607201, 1002875, -1991254, 169114, 325881, -1457605, -1983738, 292595, -574989, 880468, - -2939905, 2014877, 767725, -2150168, -864899, 252329, 3075197, 246424, -732829, -912681, - 799401, -503048, 956704, -253940, 574452, -873489, 235686, 777389, 272194, -208306, - -948651, 517544, 658204, -1003412, 421981, -389768, - }, - { - 611496, -3565897, 1760400, 1285269, -1180042, -825707, 1308354, 3402688, -2778307, 539018, - -820876, -575526, 6736656, 3569118, 43670692, -14335527, 6380174, 2834142, 9215389, -2715493, - -4594542, 5005248, 3341485, -11531450, 3195993, 7719130, -6642167, -9328132, 18321256, 22509924, - 15532212, 1841467, -6041945, 13012677, -1846299, 8042327, -5568425, 10594074, -6714108, 5643050, - 697395, -940061, -2241973, -30065, -1277216, 2894271, -4787815, -2858838, 2348810, 2790655, - -1296543, 2953864, -5428302, -3544959, 1911261, 1313186, 1602560, -4123706, -2908230, 4043712, - 1646046, 923955, -2009508, 853625, 322123, 340913, -218506, 1172526, 162135, -692027, - 253940, -1933272, 188442, -226023, -1825898, -949188, 206695, -749472, -168041, 331249, - -232465, -388158, 1324461, 2081449, -1738388, 5369, -432718, -2529736, -562104, -1066763, - -955093, -762894, -1563368, -161061, -189515, -1188632, - }, - { - -53006340, -19168976, 28958816, -14985678, 4884452, 5558225, -19814832, 3686693, 18390514, 10092636, - -893890, -2031520, -11176042, -9918690, 598611, 15738908, -5143224, 7079180, -2934000, 5919002, - -3967476, -13948980, 8258685, 6127845, 20199768, 539555, 2571612, -5309654, -2004676, 11963095, - 2232846, -1299765, 2891587, -5265630, 8107825, -18614926, -3312494, -9119289, -2404645, 2772938, - 1529008, -266288, 7135552, -1196685, 10082436, -563178, -2568391, 2135673, -5387500, 2293513, - -459562, -322659, -2614025, -7794829, -141734, 2704756, 588411, -399969, 3029563, -101469, - -253940, 965831, 671089, 3995393, -1277753, -4119948, 1278290, -2085744, 306553, 3280818, - 1413044, -1959042, -674310, 1126892, 1960116, -2549600, 3033321, 284005, -746251, 1636383, - -670015, -616328, -828392, -1143535, -641561, 947040, 299574, 281320, 2174327, 175557, - -887985, -47782, 357556, 278099, -1180579, 1307818, - }, - { - 1472637, -2182917, 5501316, -3651796, -1304060, 893890, -772557, 84289, 7055021, 1825361, - -6862284, 2534568, 3128884, 8920110, -11034308, 14583025, 2574833, 10912975, 7173133, -18072148, - -15073725, -2565169, -4227322, -12928925, 12731894, -12142946, -5526013, -7474854, 15675020, -6912750, - 1283122, -1714766, 2675228, 4903779, -3251290, 3609920, -533650, -5033165, 12925167, -8430484, - 2391223, -2664490, -5168993, 5377299, 6925098, -2973728, -1955284, -871878, 6152541, -4144644, - -3339337, 2756295, 3314104, 5596343, -3361886, 1564979, 654446, 1476932, 2594697, 547071, - 100395, -3709241, 877784, -1712618, 489626, 2307471, -2639794, 3481071, -47782, 651761, - 104690, -547071, -974958, -989990, 679142, 190589, -1233193, 879931, 1165547, -957778, - 129386, -823023, 1261647, -1593970, -790811, 675384, 1059783, 616328, -1074816, -198642, - -798864, -1197759, 338229, 107911, -506269, 59593, - }, - { - -8538395, -155623840, -25984552, -10683194, -2404645, -6655052, -11654931, 2405719, -3359201, 8395587, - 2214593, 17519172, 471910, -15809238, 17854716, -14057428, -16770774, 4904853, 3176665, 552977, - -1160178, 5805185, 4504884, -7257421, -1170916, -11196980, -2061047, -6218039, -3614752, -8003135, - 2515240, -2990908, -7357816, 3110093, 1203665, -5523865, -172336, -908922, 3835406, 3481608, - 1200980, 332323, 4299263, -1886028, 9767829, 619012, -1172526, -2573759, 4873714, -824097, - -168577, 162135, 2551211, -7384123, 1702418, 107911, 1381906, -4246649, -667331, 2234457, - 4412005, -2987687, 767725, -1978906, 3437585, -1679332, 940598, 666794, -1058710, 5709086, - 218506, -1906966, 2576444, -3156264, 646929, 602906, 620086, 346282, -215822, 73551, - -2021319, -1306744, -626528, -1661079, 1202591, 478352, -739808, 380641, 477815, -559956, - 587874, -612033, -1083406, -80531, 994822, -142271, - }, - { - -2179159, -46759308, 1395864, 4749697, -680752, 9454297, 10138807, 5230197, -4687957, 2239826, - 119185, 6575058, 17727478, -12177843, 5531381, 16129750, -4788889, 10719165, -2224256, -9562208, - -8726300, 631360, -6217502, -3018825, -1723356, -5741835, 1838783, -5689758, 5950677, -9258339, - 5723581, -6947110, -7494181, -6269042, -3120831, -5541045, 1778117, -870805, -628676, -3277597, - -1831804, 7077569, 5354214, -3508988, -2668249, 868657, 4530117, 1301375, -4579509, -1646583, - 4974646, -3910568, -1543504, -3803731, 2049773, 3884261, 2485712, 446140, -1626719, 579821, - 1599339, -748935, -1229971, 648540, 5028870, 2224256, 29528, 3008088, -1828046, -93416, - -277025, 283468, -2080912, 1226213, -408022, 1002338, 772020, 2081985, -879395, -7516, - -890669, -977105, -1006633, -770947, -1111860, 755914, 2637110, 583579, -554588, -468688, - 227096, 1132261, -187905, -102005, 1193464, -37044, - }, - { - 24579024, -44977436, 13734769, -6491843, 3104188, 10145786, -17700098, 11157788, -4995047, -17995376, - 17139066, -13494250, 3195993, -3788698, 5976447, -14878840, 10863583, 5488968, 10072772, -3674882, - 3003256, 1901060, 9775346, 9417253, -7393786, -2727841, -3211562, -5196911, -4366371, -5080410, - -4168266, -1341104, 741419, -3195993, -3349538, -891206, -12868259, -8805757, 432181, 3114925, - 404801, -1660005, 8437463, 5142687, 4410395, 1340030, -350040, -496606, 7410429, 3837553, - -4075924, 2352032, 449898, -1028645, -264677, -4682588, 1064615, 2827162, -998580, -744640, - 4409321, 2588792, 1764695, 1025423, 1962263, -1009317, 5746130, 379031, 2326799, -719407, - -1020592, 53687, 1435593, -878858, -253403, 1530619, 365072, 2321430, -2026151, 803159, - 67646, 1760400, -1401770, 1691143, 407485, -1571421, -368830, 972273, -837519, 582505, - 1367947, 1969779, -1449552, 481573, 64961, 88047, - }, - { - -2829847, 5697274, 268435, 879395, 9245991, 2916283, -11586748, 3141232, -5107790, -943282, - 3053185, 3527242, -3427921, -28154048, -6476274, 15554761, -17401596, 7750806, -15829639, 7129646, - -24429238, -4116726, -9404905, 12804908, 6435472, 13829795, 848256, -326954, 5309654, 139586, - 11577084, -6272263, 17121888, -5769215, 8315057, 1386738, 6434935, -3641059, 4687957, 2008434, - 10781442, -5038534, 2980707, -4218732, 1283122, 2224256, -767189, -1884417, 1808718, 3831648, - -874563, 2068027, -2196339, -2650532, -2366527, 1221381, 1404991, 3036542, 1067299, 3772055, - -8779450, 402116, 3595961, -1736241, -704375, 57982, -3107946, -1536525, 3957276, 1187559, - -705985, 23622, -1115618, 1062468, 1103270, 2162516, -2284386, 1311576, -1393180, -221191, - 1341640, 670552, -741956, -263067, 124017, 887985, 13959, 906238, -1646583, 456877, - 1119376, -1475858, 139586, -906238, 82141, 621697, - }, - { - -195421, -83017960, 17576080, 7143605, -4573604, -27953794, 184147, -2931852, -8295193, 9160628, - 3034395, 6714645, -3609920, -9557376, 23105314, -3069291, -19823958, -7444252, 1670205, -4908611, - -8458401, -635118, -1812476, -4793184, 8510478, 8304856, 1268626, 9835475, 2134599, 9127, - 2443837, -413391, -5748277, -2597382, -6287296, 1243393, 1857037, -7545721, -4532801, -3015067, - 1111860, -5073967, -4081830, -6768332, -8160438, -4845260, 2973191, 2105608, -10009421, -3600256, - 5292474, -2401961, -1635309, 2362769, -1840930, -1655173, -3004867, 106837, 1819992, 3364570, - 2294586, -2612951, 3201898, 3943317, 1730335, -193810, -894427, 896038, -320512, 2064806, - 1476395, -435402, -898722, -2347737, 1880122, -59056, 1514513, 600222, 770410, -683437, - -1470489, 923955, -1770063, -3046206, 729608, 195421, 864899, 157303, -202400, 198105, - -1105954, -1172526, 77309, -890132, -1086627, -944356, - }, - { - 5043902, 22341884, -2940442, 3421478, -7916162, 13878113, 269509, -265214, 6885370, 7990787, - -6858526, -2784750, 8979166, -1460289, 101766568, -7903814, -10151155, -20432234, 11698417, 17050484, - -9814000, 6488622, -3508452, 2680060, -1721745, -7187628, -847182, -4534412, -5307506, -20568598, - -599148, -4043175, -490700, -8683887, 8303783, -2398739, 248571, 3691525, -2634426, -1765232, - -10485089, -2529199, 13010530, -1203665, 6306086, -2430952, 10793790, 5396090, -14443438, 1114007, - 954020, -928787, -3688303, -642098, -3353296, 1293859, 4613869, 1488743, 5080947, 7083475, - 925029, 372588, -51003, -4438312, -3604551, -2645700, -5131949, 619549, -1119913, 1259499, - -3379603, 1455457, -84826, -3462818, -983548, -2341831, -2182380, -15032, 1370632, 5155572, - -2428267, 726923, 1574106, -916976, -2480881, 1517734, 413927, -2680597, -352187, 18790, - 136902, -1617592, -1001264, -576063, 2339147, 266825, - }, - }, - { - { - -13769128, 196635952, 36422396, 9848897, 18006650, 3500398, -1553168, 19172734, -12794171, 18114562, - 16393353, -4264903, 2319819, -15243913, 2095944, 6289443, -14147085, -2522220, -2693481, 11176579, - -2163053, 3524558, 486405, -44023, -1412507, -7329899, -8835285, -248034, 3322157, 519154, - 2282775, 4100620, 2666638, -4046396, -7466264, -1742146, 4634270, 2171643, 3813931, -383326, - -2745558, -7925289, 735513, -9407052, -127238, -7624641, 1584306, -2413235, 1639604, 7530152, - -4453344, 936840, -1288490, -5150740, 1205812, -2017561, 2626373, 883690, -274341, -374736, - -661425, 132070, -467078, -4471061, -81604, 1350230, -1057636, 562104, -695248, 1758789, - -2550674, -1415192, -1376537, -1408749, -1110786, -2986076, 3075734, -1593970, 406411, 2419140, - 1991254, -818728, -723165, -1386738, -1730335, -479426, 561030, 93952, 1773285, 1570884, - 406948, -894964, -920734, 641561, -1039382, 418759, - }, - { - -291521, -54251880, 8797704, 17539036, 2263448, -4014721, 884763, -9541807, -2673617, -7744900, - 16505559, 8160438, -10204842, 12255689, -8969502, 4387309, -9801115, -8026757, 1259499, -9499931, - 4816269, 2115808, -17127256, -1558536, -308701, -3135863, -19266686, -2304787, 6131066, 21977348, - -3906273, 8064875, -305480, -3161633, -2197950, -2962454, -8754217, 7552700, 428423, -1641751, - 2536178, 8477729, 2005213, 1894618, 1824287, 892816, -9805410, -1323387, -3133716, 5479842, - 3894462, -4710506, -2673617, 106837, -7296613, 1899449, 2534568, -1078574, -751619, -664109, - 5712307, -3262565, -1433445, -278099, 4662187, 1663763, 1586990, 385473, 1329829, 642635, - 1563905, -1334124, 2450816, -223338, 241055, 929324, -2294050, 1497333, -940061, 382252, - -1530619, -885300, -90194, -819265, -2114198, 1221381, 400506, -470299, -513249, 433255, - -323733, 411780, -351650, 1459215, 365609, -300648, - }, - { - 5318244, 53810036, -34609920, -25679610, -10337986, 7973607, -665183, -7299834, -11309186, 2153926, - 29959008, 3973919, -4756140, -6768869, -2224793, 8082055, -7885560, 6260989, 2457258, -3385508, - -8878771, -6837051, -3016678, 12351252, 3810710, -4263292, 6701760, 4832912, 9171903, 2105608, - 189515, -196495, 1980517, 2780991, -8178692, 3234110, -4664872, 7332583, -6080063, -10009958, - -1325534, -5405753, -5925445, -3202435, 9756555, 11476153, 10937134, 2526515, 8357470, -4002910, - -2651606, 5247913, -4190814, -1953673, 5247377, 3133716, -3681861, -4949950, -3158412, 3090766, - 1970316, 745177, -1868848, -3648575, -2001455, 2168959, 1582159, 649614, -949188, 1645509, - 360777, 299574, 2213519, 573915, 345208, -157303, 3756486, 1320703, 1140314, 508417, - 426812, 987843, -1120450, -1139777, -1288490, 490163, -341450, -1029182, -1115618, 71941, - 395674, -2423435, 135828, -175557, 800475, 436476, - }, - { - -4359392, -121904056, 11380590, 60248728, -4923107, -6578816, 4004520, -6027987, -3533148, -3166465, - -6504191, -1285269, -3149285, -1435593, 10484015, -9064528, 10041097, 6199249, -1253594, -7524783, - 6577206, 376347, 10139344, 12509629, 8931921, 7896834, -2379412, 477815, 13018046, -5202816, - 5849209, 11771432, 3146601, 4878546, -716723, 4593468, -1692217, 3564286, -2979634, -1855963, - -2915746, -5586142, -6429029, -3894462, -2924336, 1015760, -1329829, 3636764, -3047279, 1734630, - 1195075, -3907347, 4454418, 4076998, -1686848, -429497, 2593624, 2165737, 2337536, 25233, - 1085016, -593242, 2112587, -1078574, 1777580, 2736431, 3371549, 1789928, -1282585, 865973, - 1155883, 2071785, -2209761, 87510, 1397475, -1226750, -2089502, 779000, 1228898, 840740, - 604517, 972273, -961536, -1341640, -789200, 290984, -892279, -63888, 123480, 143345, - 432718, 1611, 486942, 863825, 89121, 132607, - }, - { - 1445793, 29196114, -4625143, 3432216, -1917703, 854162, 2680060, -3973382, -527744, 865973, - -1960116, 9968619, 1856500, 8137890, -6434935, -9081171, -12799003, 14935212, 23262616, -17159468, - -6870337, -7706245, -6681896, -4082367, 584652, 17616882, -1743757, 9414031, 6211597, -363462, - 2174327, 5556614, 5288716, 1881196, 2870112, -2277407, 9157944, -2440078, 7683697, -2162516, - 825707, -1866700, 902480, 1065152, 1159104, -392990, 951335, 2386391, 2178085, 2466385, - -3290482, -1395864, -452045, 6573448, 3358128, -6929393, 7521025, 1540283, -1791001, 6460705, - 3467112, 2885144, 720481, -1756105, 746251, 1239635, 25770, -2147, 2633352, 27917, - 391916, 2233383, 1353452, 1035087, -2239289, 468151, 1214939, 1046898, 1649804, -549756, - 1337882, -554588, -705985, -1178432, -412854, -625455, 184147, -474057, -1629403, 148176, - -1813013, 1167694, 442382, 480499, 1066763, -475131, - }, - { - -7209640, -227025536, 5749888, 43080668, 5859409, 846109, 10384694, -4577899, -10197326, -10619844, - -492848, 5835250, -13459354, -16373489, -5198521, -9615895, -6048925, -8117488, -8701604, -6944425, - -5920076, 8046621, -3361349, 2082522, 8040716, -6804839, 3464965, -11027865, 1284195, 2979097, - -1311039, -193274, 8679055, -4573067, 4859756, -576063, -5323612, -2370822, -4952634, -1445257, - 7606924, 9728638, -158377, -1035624, -1200980, -2945811, 3030100, -7800198, 854162, -57445, - 1752347, -1585917, 1823751, -2334315, 3995393, 2766496, -2981781, 1063004, 3609920, -5401458, - 347355, 3855270, -3476239, -499290, 486405, -1633161, 779000, -53150, -855772, -657667, - 1600412, -1121523, 886374, -1837709, 419833, 477815, 1467268, 2246805, -2378875, 53687, - 392453, 99321, -172872, 736050, -988379, -188979, 474594, 61740, 1360431, -1831267, - 479426, 798864, -524523, 207769, 208843, -442919, - }, - { - 535797, 1475858, 1185411, 756988, -1085553, 412317, 537945, 3262028, -4522601, 399432, - 287763, 5405217, -1983201, 6356015, 42092828, 1069984, -149787, 3787624, 6905234, 103079, - 93416, 2505577, 15927349, -21104396, -3868155, 5483063, -2092723, 2632815, 3553549, 35596688, - 15630997, -13994077, 5425081, 862215, 7320772, 3228205, -2705830, 2118493, -3073586, 2423972, - 4580046, -2150705, -51003, -6263673, 327491, 552977, 811212, -4651987, -34360, 1273458, - -3762928, 4068408, -2138357, -7959112, 2729452, 1812476, -1975148, -12348, -4826470, 5465346, - 342524, 1453310, -490163, -21475, -863825, 408022, 1168768, -975494, 163746, 377420, - -3181497, 703301, -150861, 804233, -295279, -2392834, -1221918, 2165201, 100932, -1257352, - 708670, 1159641, 1250909, 327491, -727460, -62277, -435939, -2782602, -1088237, -882079, - -1064078, -179852, -1819456, -512175, -488553, -864362, - }, - { - 66209068, -113018304, -40916004, -28011240, 22887344, -6161668, -11080479, 8719857, 17756468, 3612604, - 3286724, -57982, -16219407, -4537633, -7732552, 15251966, -3534758, 4515085, 2024003, -1333587, - -6490233, -5860483, 10155450, 10370199, 11385421, 2467996, -1380832, -3413425, 5651640, 702764, - -274878, 8347269, -736587, 139050, -2612414, -14115410, -4895189, -14915885, 6739341, -2850785, - 5244692, -970126, 3080565, 2749316, 4322348, 7495792, -7100118, -1509144, 539555, -1479079, - -2680060, 2675228, -3029563, -3876745, -1986959, 3037616, 730681, -774168, 641024, 2124398, - 282931, -3463891, 5998996, 1481764, -494458, -1816771, -2393908, -955093, 3327526, 2018635, - 705448, -1431835, -143345, -111132, 2162516, 916976, 67646, 1941325, -1589138, 383326, - 1592359, -1374926, -2230699, -713501, -698469, 2012192, 368830, -551366, 1431298, 229781, - 9127, -643171, 556735, -269509, 39728, -735513, - }, - { - -172872, 6419366, 2062658, -927713, -2382633, 621697, -127775, -795106, 5830418, 2334852, - -9109626, 3584687, 11858405, -16996260, 11986180, 16547435, 7573101, 7627862, -9304510, -16779364, - 4401805, -19386946, 10883447, -26280904, -522375, 1719598, -7252053, 1576253, 852551, 8004209, - -4695473, -918586, 2775086, 7045357, -5421860, 3617973, 1047435, -18254, 8090645, -5326297, - -1512365, -1420024, 919660, 2074469, 2062658, 2796561, -4793721, 2163590, 4318590, -1642288, - -6210523, 5059472, 1823214, 7046431, -4443681, 259846, -347892, 3224984, 780073, 3018825, - -2367064, 973347, -1952600, -1561758, 1912334, -3146601, 125628, 1410360, 2172717, 1012539, - -2660732, 1007707, -977105, -1061394, 280247, 1104880, -425739, -1193464, 2413235, -1666447, - -212064, -84826, 8053, -419833, -1431298, 1204738, 1347546, -98784, 32749, -69793, - -418222, -1365800, -398358, -58519, 204011, -554051, - }, - { - 6034429, -183298464, -16548509, -18661096, 12693239, -20075750, -20339892, -978179, 15035607, 11163157, - 1582159, 3277060, 4116189, -8250096, -4541928, -4284230, -11502459, 7900056, 4514548, -475668, - 3235721, 7555921, -8875013, -621697, -4996121, -237834, -9481677, -4812511, 283468, -3185255, - -9964324, 5455682, -8230231, 5558225, 2013266, -3195993, -6356015, 2892124, 6366216, 4000762, - 801011, 1903207, 3674345, -2188823, 2295123, 9418326, -6162205, 394600, 2599529, 3405372, - -1356673, -2295123, 535797, -90194, -886374, -2573759, 893353, -1201517, -1474784, 1561221, - 2234457, 62277, -660888, 725850, 2143726, -238908, -393526, -451508, 558883, 586263, - 1484448, 679679, 978179, 365072, 1075352, 952946, -986769, -1001801, 1599875, 326418, - -1693828, -897111, -18254, -2641405, 289373, 1734093, 1058710, -1367410, 23622, 1410360, - -1233729, 1169842, -356482, -612033, 130460, 1705102, - }, - { - 3244311, -51527260, 5285494, -1501628, 1703491, 12477954, 12247636, -3728032, 4497368, -2309619, - 5215164, 1205275, 11962558, 6572374, 4078608, 2798708, 12981539, 1966021, -4101694, -12062416, - 1314797, -8220031, -2749316, -1858647, -7730941, -7395397, 3661460, -4081293, -2018098, 3818763, - -1250372, -5089536, -11664594, -7496866, -3599183, 4832, -79994, -3331821, -6907918, 678605, - -1794223, 7165616, 2436857, -1427540, -1155883, 1290638, 1781338, -3235184, 1232119, -1291711, - 1854352, -2574296, -2163590, -4140349, 2893734, 1415192, 3890704, -106837, 256624, -1224066, - 2099702, 1595044, -3788698, 3636227, 2922725, 2625299, 3242700, 1727114, -159988, -1721745, - -1649804, -706522, -417686, -91268, 1975685, 29528, -176094, 1793686, 1496259, -1853815, - -747324, -1920387, 336618, 264141, -2193118, 923418, 2141578, 168577, -727460, -658741, - 1056562, 64961, -404264, 916976, 999117, -762357, - }, - { - -33943128, 34809100, 12674985, -91805, 8810589, -25323664, -1498407, 20256676, -8578660, -8828842, - -1438814, -5890548, 4398047, -1074279, -3876208, -9098351, 16223702, 2417530, 1066763, 2621541, - 1316408, -866510, 13135621, 5538361, 4449586, -4753455, -2404108, -6651294, -5700496, -482110, - -8011725, 2100776, -2478196, -7667054, -2114735, -7358353, -1253057, -15748034, 1814624, 6262599, - -3075734, 6544457, 6354404, 4141959, -927176, 8523363, -3483219, -1302449, 9104257, 6715182, - -2509335, -2491618, 3871376, -549219, -5941551, 630286, -1039919, 301721, 1959579, 766652, - 1889786, -1038308, 3523484, -1134408, 4286378, 1110249, 724239, 2852395, 1207423, -276489, - -2726231, 1924682, 2452426, -726386, 1308891, -505196, 779000, -508954, 726386, -369367, - -388158, 2119030, 219043, 1042066, -1115618, -949188, 321586, -1119913, 777926, -299037, - 1304060, 1859184, -1098438, 2320356, -1456531, 788127, - }, - { - 2672544, 18538690, -9710384, -703301, 66035, 2727304, -1550483, -5309654, 4277788, -2820720, - 3192235, 3745212, -10980621, -12957916, -13561359, 15741055, -18073222, -2886218, 939524, 6162741, - -11533598, -42729556, 35651988, -14095009, 18509698, 20328618, 1328219, -15959025, 11761231, -785979, - 6980396, 10134512, -517544, 4727149, -1030255, 6122476, 4816806, -1375463, 5263483, 4649302, - 6305012, 3009162, -2271501, 344134, -4295, 3905199, -405338, -965831, 1728724, 1676111, - 42950, 724776, 113817, 39192, -5995238, 5087389, -782758, 1146219, 2510945, 680752, - -5676873, -3646427, 3688840, -548145, -1801202, -141197, -74088, -5376762, 7099044, -979253, - 930934, -1479616, -1040993, 1904281, 533113, 2000918, 589484, -906775, 356482, 1254131, - -2077154, -644245, 860604, 761820, 353798, 710280, -9664, 2472828, -2175938, 40802, - 891743, -1435056, 49929, -579821, 631897, 1218160, - }, - { - -16553878, -53583476, 7245073, -675384, -284005, -18553184, -12674985, -6730751, 3430605, 9609989, - -16399259, 26590680, -14363444, 24746528, -16980690, -5392869, -11584064, -6550362, -8940511, -8410620, - -8609262, -585189, 4591320, -656593, 6979, 10014790, 5082020, 7977365, -719407, -1165547, - 3541738, 3653407, -638340, -7129646, -5739150, -3452080, -2596308, -1508607, -2067490, -8089571, - 3103114, -9673877, 3332895, -6087043, -11171210, 3719442, -3505230, 2265059, -8688182, 463320, - -1353989, -3329674, -11274, 1182727, -1305133, 268435, -3413962, -597000, -396748, 6978785, - 1324461, -71404, 1795833, 606127, 2375654, 1121523, -3302293, 1899449, -207232, 4080219, - 107374, -896038, -20938, 988916, 629213, -2000381, 306553, 2105071, 549756, -1005022, - -896574, 1083942, -1649804, -1341104, -819802, 1231582, 533650, 814970, -997506, 344671, - -1464584, 286152, -1604170, -608275, -119722, -621160, - }, - { - -5789079, 8327942, 14537391, 8180302, -2202781, 156229, 3061238, 4554276, 4604205, 7499550, - 341450, -2785823, -810675, 42536284, 40102108, 2036351, -7952669, -13320841, 10224707, 7952669, - -8876624, 5741835, -3962644, -2811593, 2879239, -12072616, -13320304, -5390184, -375810, 3321620, - -10667088, -4301947, -6932077, -4151086, 5435818, -9655086, 2514703, 7906498, -1963337, -7901666, - -1811939, 1859184, 6787659, -3277060, 1260036, 11541114, 3974992, -979253, -2455111, -2327872, - -1088774, 963683, -4001836, -2463164, 212064, 2936147, 4956393, 1983738, 4165582, 5427228, - 2257005, -1653562, 2333778, -4664335, -2201708, -6019934, -2199560, -2270964, 2152316, 13422, - -2733747, 4832, -874026, -1655710, -2629594, -701690, -1496259, -321586, 370441, 1997697, - 1853278, -3363496, 2814277, 102005, -517544, -1288490, 998043, -974958, -300111, -61203, - -1017907, -1234803, -1514513, 741956, 1760400, 445066, - }, - }, - { - { - 18800146, 128838280, -28095528, -9265855, -1516660, 2304787, -5511517, 21519396, -12749074, -14813879, - -20008106, -23408108, 97174, -17536888, 562104, 7720204, -5631776, 7994545, 1207960, 16235513, - 1595580, -4737886, -6890738, -3832185, -2251100, 200790, -4445828, -5938329, -7249368, -7319161, - -9514426, -5937793, 2687039, 949188, -2058363, 4726075, 2553895, -3328063, -1032403, 4194573, - 2195802, -2998424, 9257802, -5623723, -2058363, -9437654, 2519535, 2425583, 845035, 4255776, - -5407901, 3301756, -959388, -2085744, 3112241, -2670396, 4410932, 6591164, 4688494, 296353, - 1828582, 2684, -2158221, -3391414, -8590, 1221381, 576063, 1047435, 518617, 759672, - -725313, 597000, -1665911, -937914, 2428267, -8053, 3154117, -2666638, -643708, 1063541, - 180389, -836982, 842887, 677531, 315143, -681289, 417149, 294742, -501974, -654983, - 941135, -90731, -233539, 1271847, -1051730, 387621, - }, - { - 195958, -53364968, 7775502, 8241506, -1676648, -2250563, 3762391, -5182952, 3417720, -1155883, - 13245679, -459025, -5708012, 4532801, -25607668, 18701362, -7954817, -13532368, 15378667, 4869956, - -2747169, -8803609, -21038360, -2873333, -13593035, -7151658, -3444564, 6186901, 8317204, 12640089, - -1931125, 11712913, 3959423, -626528, -9644886, -6446746, -9922985, 3141232, -3620121, -175557, - 3135863, 969052, -7708930, -1280437, -490163, 3643206, -7855495, -1648731, -3365644, 4399657, - 6904160, -3018288, -1742683, 1326071, -5415417, 1892470, 980863, -742493, -2260764, -2441152, - 5424007, -3584150, -1306207, 779537, 3682398, 3154117, 1588064, -2718714, -352187, -243739, - -369904, -1978369, 2263985, 1344325, 2070711, 2623151, -785442, 1203665, -741956, 925029, - -782221, -48318, 45097, -277562, -2021856, 49929, 185220, -182536, -2275796, -2297808, - -998043, 1185948, -345208, 301185, -1431835, -386010, - }, - { - -3594888, 104227584, 11853573, -13211856, -2382096, 3315178, -4282620, -6209986, -4179003, 9678172, - 16780974, -3220689, 11020886, -5833103, -8844948, 6351720, -3361349, 16797618, 4297115, 9594420, - 3074660, -8991514, -4512400, 10351945, 4276714, -4154844, 1178969, -119722, 7878044, 645319, - 6113886, 1525250, -1855963, 8277476, -2244121, 313533, -8676908, 8797704, 474594, 278636, - 4377109, -1839857, -5775121, -4582193, 3890167, 4747013, 2497524, -2864206, 9161165, -523449, - -2857227, 2700998, -1946157, -4182225, -206695, 1957968, -2773475, -482110, 905164, 3523484, - 2058363, 2364380, 584116, 761283, 328028, 613643, 724776, 929324, -1348083, 1372779, - -360777, 638876, 764504, -1781338, -1016834, -41339, 2841658, 903554, 3327526, 2185602, - 965831, 1367947, -839666, 419833, 527207, 571768, 227633, -394063, 1442035, 1317481, - 1339493, -129386, 840740, -427886, 580357, 336618, - }, - { - 25246354, -110589504, -16451335, 50345068, -3833795, -4308926, 3391414, -2374580, -6153078, -7752416, - 4429185, 9330816, 5491116, 4621385, 7682086, -12663174, -5279589, -9316321, -527744, -4279935, - 3017752, -10934987, -712428, 3763465, -1633698, 3012920, -1801202, -12659953, -1358820, -6417755, - 2040110, -960462, -6921340, 3151432, -465467, 4367982, -185757, 1804960, -4735739, -4497905, - 5945846, 5012227, -2324651, 3751117, 2318746, 1738925, -2900177, 3491809, -5524402, 570157, - 1294933, -3567507, 5048734, 4773856, -1616518, -130460, 3740380, 3295314, 258235, -3717831, - -818728, -1005022, 755377, -2288144, -1395328, -1445257, -1075352, 832150, -1092532, -1825898, - -1801739, 1257889, -512712, 1341640, 1292248, -576599, -33823, 56371, -1866163, -964220, - 570694, 973347, -241055, -400506, 305480, 1191853, -1245541, -347355, 440234, -723702, - -1180042, -606664, 743029, 1169305, 158377, 894427, - }, - { - -789737, 29633664, -2384244, 6039798, -9664, 493384, 1146219, -3580929, -67646, -768799, - -4667556, 5470715, -3536906, 7765838, 921271, 12005507, 6649146, -22953378, -10405095, -10475425, - -5083094, 1530619, 3198140, 8695698, 2138894, 21084532, 12699145, 9349607, -6458557, -7956427, - -6536404, -4105989, -5730023, -7761543, 305480, -11853573, 4253092, -2501282, 713501, -9140764, - -2663954, -4262755, -701690, 5323612, -1457068, -3288334, -1755568, -1530619, 3979824, 5726802, - -3732864, 1015223, 822486, 5416491, 2599529, -9710384, 4111894, -1002875, -3715147, 3941169, - -398358, 292058, 1062468, -907312, -1410897, 168577, 1154273, 1872606, 722628, -2558190, - 545461, 553514, -75699, 193810, -3328063, -1123134, 75162, 399969, -797253, -2089502, - 637803, -41876, 1791538, 234613, -1109175, -532576, 543850, 905701, -332860, 1362042, - -1228361, 584652, 19864, 664646, 484794, -1167694, - }, - { - 39355860, -200421424, -12813498, 27834072, -10924786, 2597918, 6113886, -11077794, -4987531, -9768903, - -3986804, 7424925, -10992969, -1774895, -9526774, -7053947, -140660, -11054172, -473520, -7176891, - -16604344, 10257993, 5199058, 3810710, 4430796, -2852395, 2703145, -8360154, 9836012, 9909563, - 7062000, 3818226, 1937567, -10087804, 4282620, 935766, 1970853, 2610803, -519691, -1868311, - 476741, 9301289, 5468567, -1066226, -3499862, -2320893, 6374269, -3444564, 2189897, 1854352, - -675384, -7463043, -34897, -2271501, -329639, 1213865, -3309809, 1466195, 3709241, -4678830, - 2482491, 3016141, -5457293, -3550864, 364535, 497142, 856309, 459025, -647466, -2425583, - 1530619, -137976, 2561948, 887985, 1445257, 718333, 167504, 2823404, -1226750, 404264, - 135828, 915902, 585189, 1417876, -1352915, -782758, -430034, -634045, 1346472, -1329292, - 891206, 179852, -1363652, 1023813, 901406, -386010, - }, - { - -1102196, -1828582, 1755031, 1189706, 912144, 537408, -491237, 2193655, -3559454, 1401233, - 404801, 6967511, -2851858, -1506460, 31026844, 14299557, -929324, -659278, 17039746, 10718628, - 2816962, -229781, 22076668, -25213606, -15607911, 9268539, 3219078, 2796561, -10453950, 17248052, - 3874597, -19881404, 4801774, -1028645, 5240397, -2464238, -6985765, -2183454, -9058623, -4548371, - 2752000, -1326071, 912144, -6577206, -1032940, -3041911, 2274185, -6578280, -3882651, -897111, - -6671695, 3737695, 30065, -9023189, 707596, 3040837, -2248416, 599148, -2698313, 5628018, - -219580, 4588636, 3406446, 323196, -167504, 452582, -1658394, -2233920, 926102, 488553, - -2986613, 752693, -472983, 648540, -1163936, -2480881, -1087701, 3102040, 1963874, 405338, - 1806034, 321586, -775778, -351650, 32749, -78383, 821413, 222801, 437550, 732829, - 1341104, 899259, -1591822, 468688, -13422, -368293, - }, - { - -67063768, -234838080, 15887621, -44022340, -9317932, -7390565, -4059281, -1245541, 2422362, -4158602, - 3637837, 6412386, 5180268, 275415, -10895258, 16621523, -5623723, 4709432, 6695317, -12870943, - -1943473, 7195144, 17542794, 10315975, -3345243, -5912023, -7604777, -4813585, 8217883, -3219078, - -6179921, 5440650, -362925, -1791538, -9771051, -18422188, -816044, -7217156, 4857071, -3936338, - 2713346, -4061965, 2267206, 4988605, -1074, 4040491, -3370476, -234613, 257698, -3890704, - -5369783, 3520800, 4996658, 4014721, 3009698, 3584687, -3411278, -502511, 1079111, 756451, - 974421, -2870649, 5079336, -847182, 105764, 1201517, -476741, 543313, 2185602, 494995, - 408022, -1743757, 449361, -949188, -253940, 977642, -511101, 1782948, -28454, 138513, - 434865, -1384053, -1395328, -539018, -928787, 1875290, 531502, -192200, 82678, -1083942, - 224949, -892816, 1086627, 524523, 33286, -966368, - }, - { - -1260573, -4533875, -6289443, 1877975, 792958, -177167, 754304, -3042448, -1769527, 4075924, - -4132832, 2935610, 7059316, -33916284, -2821257, 3481071, -7368554, 2241436, -10808285, -13567265, - 10636487, -12505871, 965294, -40527848, -7016366, 752156, -959925, 6537477, 7786239, 6948720, - 1117228, 8156680, -3187403, 4765266, -3200825, 4791036, 7373385, 1130650, 6610492, -1574106, - -5717675, -2375654, 1578937, 1443109, -4510790, -455803, -6674916, 2400350, 3205656, -884226, - -1810329, 4461398, -6133750, 2378875, -2950106, -576599, -2014340, 2330020, 609885, 1363652, - -3730179, 3551401, -1500017, -1223529, 1957968, -1944547, 1465121, -1019518, 277562, 1198833, - -1083406, 2277407, 429497, -389231, -188442, 2308008, 805306, -1567663, 1627256, -3246995, - -484258, 1841467, -357019, -544924, 460098, 1296543, -215822, -1110786, 47245, -215822, - -122407, -37581, 730681, -525597, -76236, 156229, - }, - { - -2866891, -205321456, 158377, -6618545, 7387344, 905164, 3336653, 309238, 11183558, 829466, - -11415486, -10600516, 379568, 2369748, -4563403, 1803886, 3318936, 10183367, -2288681, -5807333, - 6965900, 6948184, -6636798, 2183454, -603443, 8079907, 6305549, 4438849, 496069, 6049462, - -10196252, 1896765, -6904697, 2853469, -1919850, 666794, -3046206, -899259, 934155, -1802813, - -7525857, 468151, 7738458, 1200980, -1211181, 7580618, -7763154, -1840394, 1085553, 4176856, - -850940, -5043366, -2260764, 6188511, 2548526, -2161979, 2112587, -1567126, 625455, 2968359, - 1921461, 2573759, -362388, 14496, 2398739, 3863860, 1838246, -1044751, -1438814, -2017024, - 1180579, 1728188, 1861868, 1704565, 667331, 135828, -3323768, -1198296, 1550483, 910533, - 935229, 1219771, 1122060, -1920387, -1096290, 90194, 1409286, -319438, 61740, 558883, - -998580, 1640678, -161598, -932008, -303869, 1457605, - }, - { - -3539053, -40709312, 18480708, 5542656, 6258304, 1332514, 2137820, -3523484, 12531641, -5461051, - -1213328, -11516418, -4352950, 6458557, 8059506, -13038984, 16291348, 1872069, -13773423, 4996121, - 26044144, -5647882, 869731, 4869956, -8702677, -7091528, 4040491, -4671851, -5135707, 11862163, - 4908611, -3574487, -5086315, -2509872, 90194, 2610266, 1904818, -2453500, -9273371, -4380330, - -2887829, 8075613, -2043868, -1477469, -1202591, -5499169, -3112241, -7329899, -2322504, -4290673, - 273804, -1618666, -1838783, -2530273, 3734474, -486942, 2350958, -3002182, -2156611, 616328, - 1881196, 729608, -1961726, 2895882, 143345, 2556043, 2217814, -1723356, -533650, -3648038, - -2807298, -186294, -1582159, -2148021, 495532, -782221, -787053, 1631014, 2008434, -657130, - 871342, -1129040, 1549946, 1897839, -457951, 1358283, 967978, -398358, -365072, -1085553, - 396748, -796716, -1288490, 1326608, 459025, -878321, - }, - { - 24195698, 117742768, 7436199, -2589329, -1682554, -22870164, 15735686, 13683766, -4247186, 91805, - 5681705, 2287070, 8422968, 5487895, -6789270, -2771865, 12936441, 6018323, 820339, -15308874, - -4495757, -3056406, 7625715, 1840394, 11101954, 4956393, -2280628, -8387535, 3181497, 4191351, - -10162966, 4054986, 3321084, -4065187, -2604361, 428423, 12595528, -1353989, 11797201, 3551401, - -1506997, 11945378, -1312113, -7582765, -4753992, 5545877, 1620813, 1348620, 3172907, 1380832, - -3077881, -3209951, -2119566, -1354525, -4391604, -777389, -1995012, -1886028, 129386, -831076, - -2076080, -2808372, 3751654, -1693291, 1263257, 243203, -2547453, -438624, -382789, -1832877, - -2808372, 2280628, 2185602, 106300, 1550483, -613643, 1704565, 124017, 1822677, 144418, - -322659, 1034013, -1199370, -581431, -1975685, -1545115, -725850, -2239289, 1317481, -260382, - -202937, 1597728, -766115, 2731599, -347892, 1855426, - }, - { - -1582696, 34277596, 8591545, 3966939, 248571, 1719061, 519154, -7832947, 1206349, -2524367, - 1093606, 4658966, 4754529, 16542067, -27866822, -5801964, 4564477, 15491947, 11225434, 11055246, - 6095096, -25496536, 30033096, -9438728, 20872468, -5528160, 672699, -5627481, 5596880, -9248138, - -2320356, 5108327, -10266046, 1283658, -4854924, 5540508, 1813013, 559420, 9549323, -1914482, - -1238024, 903554, 4591320, 5425618, -2716030, 5249524, 884763, -4443681, -944356, 4244502, - 3571802, 1133871, -3258807, -679142, -6959458, 3273839, -3796214, 65498, 2400350, 2654290, - -1051730, -2415382, 1638530, -1941325, -1044214, 1225139, 1064615, -3852049, 3949223, -3156801, - 2519535, 596464, 687195, 2260764, -350577, -1188095, -478352, -119722, 1176284, 536871, - -2815888, -957241, 2350421, 1249836, -1123671, 288300, -773631, 1613297, -1143535, 47245, - 380105, -453656, -810675, -394600, 290984, 280247, - }, - { - 27209692, 3580392, 5492190, 2942053, -4166118, -7065221, 1424855, -7863012, -3846143, 7491497, - -16534013, 12626130, -11625403, 29782914, -27410482, 1949378, 16456167, 7056095, -9717364, -3262565, - 1091459, 1648194, -4093641, -10008348, -6641093, 7249905, 4551592, 1830193, -7276749, -5342940, - 3337190, 2603824, -118112, -6335614, -4642323, -2572686, 3135863, 4811974, 4532264, -5466420, - -1107565, -6723772, 10295573, 3502009, -3012920, 8999030, -4051228, 1512902, -912144, -425739, - -7332583, -375273, 2257542, 531502, -243739, 2945274, -297427, -1692217, -2061584, 4392141, - -472983, 2510945, 191663, -3967476, 1341640, 2290291, -1243930, 2246268, -275415, 2927020, - -2047089, -1286880, 868120, 3779571, 2661269, -1569811, -185220, 2064269, 1981591, 99321, - -260382, 2788508, 1591285, 583042, 306553, 3026341, 245887, -1799054, -881542, 1246077, - -1073205, 1341640, -20401, -556735, -434329, -163746, - }, - { - 6671695, -607201, -7884486, 7286412, 1248225, -2866354, 1480153, 7138236, 612570, 5743982, - -2641942, -8129836, -2476586, -1902671, -29395294, 2403034, 18314278, -172872, 2246805, 6918119, - -11329587, -10241350, -11308112, -1260573, 4363687, -3791383, -1772211, 11014981, 5312338, 10438381, - -13952738, -11494406, -2158758, 2662343, 4229469, -13552232, -5753646, 383326, -5496485, -3523484, - 4985920, -2217814, -5305895, -3631932, -4177930, 2615635, -1756642, -2481417, -196495, -301185, - 1154273, -470836, -4854924, 1318018, 3064459, 1681480, 3069291, -585189, -3319473, -3682935, - -1031866, -1569811, 2256469, -4392141, 61740, -879395, 2841658, -2681670, -1656247, -1664300, - -642635, -2983929, -2844879, -830539, -3781182, 1108102, 512712, -403190, -2041183, 337155, - 2969433, -3779034, 2131915, 453119, -284542, -925029, 1826435, 713501, 433792, -452045, - -725313, 108448, -722091, 485868, 693100, 1018981, - }, - }, - { - { - -24676198, 87957176, 59894928, -17207786, 1128503, 2042794, 8681740, 816581, -5628555, -21022254, - -10173167, -32556388, 4937065, -19888920, 1692217, 8370355, -1425392, 7827041, 8140037, 1049583, - 7224135, -1975685, -6249178, -4052302, -9435506, -4483409, 7220377, -6549825, -15841987, -3133716, - -16365973, -3278671, 479963, 1732482, 1113470, 13417478, -7068443, -1147830, -1445793, 3955128, - 3919695, -253940, 4627291, -2199560, -6135898, -2088965, -3565897, 9423695, -2246268, 1563905, - -6043556, 3725347, -1064615, -1076963, 5517423, -2643016, 2048163, 4669703, 12664785, -4988605, - 3429532, -594853, -5464809, 603980, 303869, 1367410, 2151779, -1946694, 866510, -1626719, - 2307471, 16643, -125091, -1478006, 2687039, 585726, 580894, -1253594, 987843, -1072668, - 207769, -291521, 1006633, 1124208, -52613, -837519, 160524, 2396055, -1569274, -769336, - 15032, -1291175, 1316944, 822486, -59593, -732292, - }, - { - -9664, -23517094, -9799505, -4247186, 3219615, 1100049, -374199, 5675263, -4379256, 4082367, - 9725417, -5232881, -8624831, 10551661, -25918518, 7779797, -1208496, -1039919, -7329362, 27508728, - -3184718, -26907970, -992674, -10340671, -17249126, 1228361, 5494337, -9891310, 20205136, -463320, - 5020280, 9820980, -306553, 4505421, -11371463, -8316668, -3427921, -4695473, -3840775, 5603859, - 1642825, -3206730, -4514011, -2702608, -92879, 3187940, -4152160, -2010582, -1750736, -251256, - 4793184, 2248416, 576063, -4235375, 536871, -2316598, -850404, 2792803, -5376226, -143881, - 4288525, -2211371, -550293, 1582159, 3041374, 84826, 554588, -761283, 918049, 474057, - -1362578, -1200443, -1691680, 2511482, 1063004, 3003793, 881542, 796716, -775778, -1562831, - 739808, 445066, 194347, -1233729, -462246, -382252, 72478, -250182, -2268280, -1773822, - -1027034, 573915, 1345935, -447750, -1660542, -700080, - }, - { - 1937567, 118941600, 1022202, -11644193, -2388002, -3162170, -4014184, 536334, -3371013, 7323456, - 12834436, -5648956, -4379256, 10695542, -809601, 7010461, -13675713, 30925912, -11683385, 13911936, - 10363219, -9400610, 267362, 3360812, 2500745, 38118, 1036698, -7255274, 4231080, 6758131, - 6273337, 4751308, -7063074, -858457, 5906117, -835371, -4812511, 2538326, -591095, 13474923, - -4450123, -1878511, -1416266, 1816234, 485331, 1515587, -392453, 1293859, -812286, 8290361, - -1829119, -4386772, 2762201, -350577, -5343476, 1000727, -5931887, 2561948, 777389, 3029026, - 3153580, -52076, 1632088, 226023, 2995740, -804770, -1961726, 3546032, -611496, 3327526, - -2159295, -70330, -224949, -1904281, 988916, 829466, 751082, 949188, 4085588, 1883343, - 126702, 657130, -90194, 283468, 1509144, -1191853, 1063541, -24696, 2038499, 288300, - 156766, 1952600, -1085016, 1218697, -209380, 489626, - }, - { - -45678588, -44128640, 10628433, 34409132, 5835787, -745177, -9157944, 4833986, -1280437, 3360812, - -930934, 2972654, 4811437, 16109349, -1538135, -7986492, -729071, -5498632, -12572443, -4151086, - 9803263, -7451232, -11421392, 1995012, 7063611, -11684459, 2168959, -8459475, -7659001, -2239826, - -19864, -3331284, -8910447, -1887101, 8116415, 1930051, 2029909, -5294621, 1896228, 3794604, - 4788352, 6055367, -4977867, 2121714, 3272765, 7055021, -4117263, -2962454, 975494, -5338645, - 2333241, -2461016, 1357747, 5925981, -1385664, 2544768, 3243237, 947577, 568009, -1440425, - -3762391, 1258425, -4756140, 2083596, -2605972, -2375654, -118648, -253940, -1401233, -509491, - -4126390, -41876, 2034204, 943819, 824634, -1446867, 889595, -845572, -398358, -1324997, - -912144, 857920, 463320, -157303, 453119, 360777, -791348, -709207, 1722282, -1591285, - -550293, -203474, -618475, 676994, -603443, 1580548, - }, - { - 121870, 25420300, 1691680, 5995775, -364535, 111669, -416075, -1786706, 351650, -2005750, - -1787243, 9404368, -278636, -5587753, -4998805, 3760781, 13658533, 17971754, -42398308, -26657788, - 3672734, 11683385, 514859, 10097468, 6771553, 9503689, 24984898, -7558606, 5621576, -9732396, - -9992778, 824097, -12952011, -12065100, 2221572, -11084774, 3156264, -2987687, -4629438, -1999307, - -9615358, 1486596, -5813775, 4935455, -5266167, 10907069, -10669773, -3705483, 7247221, 1216013, - -2863670, 1777580, 2712809, 328028, -121333, -2015950, 565862, 1734630, -1257889, 2145336, - -4387309, -20401, 68719, -612570, 224412, -972273, 2238752, 2439542, -2091649, 523449, - 737661, -615254, 200790, -244813, -4756677, 752693, 1411434, -957241, -955630, -1073742, - -34360, -680752, 631897, 119722, -999117, 1804423, 239444, -237834, 173409, 237834, - 756988, 53687, -967978, 384936, 392990, -343597, - }, - { - -68103152, -103333152, 26877906, 5235565, 5888400, 1177895, -698469, 2565706, -9797894, 239444, - -10370735, 2648384, -6649683, 7663833, -10942503, -4999879, -7522635, -9658845, 552440, -7288560, - -4909685, 4958540, 1955284, 6874095, -1522029, 7583302, -8255464, -1814624, 10980621, 8808441, - 1576253, 1520955, 3655017, -8460549, -571231, 5134097, 8938364, 939524, -5752035, 367757, - 684510, 1108638, 8660265, -1329829, -4568235, 1884954, 2906619, 1648731, -2882460, 6937446, - -2401961, -3877282, -3066070, -156766, -5478231, 3074123, -3311420, 1598802, 433792, 8053, - 2488397, -628676, -2800319, -4964982, 244276, 3170223, -1686848, -619012, -62277, -814970, - -665183, 2660195, -536334, 2683281, 657130, -1074, 864899, 1378685, -437013, 791885, - -792958, 3318399, -1098438, 2301566, -1554241, -241055, -794569, 396211, -208306, -401579, - 112206, -457414, -1066226, 1049046, 641024, -492311, - }, - { - 91805, 323196, -1634235, -3000572, 2670933, 810675, 367220, -1403381, 45097, 1648194, - -2555506, 8738648, -2459406, 3803194, 11221676, 12912282, -5128191, -1125281, 9967545, 20077898, - 7207492, -4011500, 22267258, -27726698, -15967078, 15502148, -11545409, 5075578, -3041374, 3511136, - -1130113, -4571993, 11759620, -4125853, -9877351, 2978560, -5006322, -4857071, -7310571, 2741263, - -4869956, -26844, 3061775, -6756521, 928250, -1699196, -681289, -6283001, -117038, -2574296, - -1888175, 872415, -1534914, -3388729, -3083787, 3076807, 143345, -2981244, 263604, 2386391, - 3142842, 2035815, 2165201, 1444183, 2543158, 714038, -3726958, -587874, 529892, 724239, - -2255395, 214748, -1213865, 783295, -1433982, -2057289, -506269, 2139968, 1549946, 2006287, - 230854, -1479079, 604517, -601832, 858457, -218506, -122407, 2587181, -41876, -12348, - 2218351, -29528, -319975, 1035087, -147640, 470299, - }, - { - 52943524, -362089888, -18888730, -23886460, -21437256, -9076877, 3303367, -6510634, 7955353, -4357245, - -3146064, 6332930, 17403744, -14969572, 18952616, 1975685, 1386201, -4789426, -3047279, -5697274, - -3037616, 14843407, 19837380, 8062728, -12540768, -639950, -5699959, -6095096, 10864120, -1609539, - -8745090, -2309082, 2808372, -743029, -6656126, -14833206, -11566347, 2153926, 23085, 1724966, - -477278, -2684892, 3992172, 7072738, 815507, -1724429, -34360, -4838818, 1081258, -1049046, - -4039954, 3961034, 57445, 2108829, 10656351, -487479, -829466, -13959, -2855617, 2023467, - 198642, -346819, 2340757, -242666, -1338956, 1988033, 1153736, 367757, 1149978, 885837, - -1591822, 190052, -1487132, 823560, -843424, -355409, 1642825, -441308, 1502702, -864362, - -659278, -92879, -847182, -378494, -1408749, 820876, 2354179, 325881, -1551557, -1369021, - 1233729, -346282, 194347, 1454920, -719944, -688269, - }, - { - 50466, -12770548, -4178466, 3020973, 2096481, -134218, -1579474, 2911451, -8005282, 1589138, - 4154307, -408559, 671089, -3395709, -50422380, -3570729, -10361072, 10911364, -13589277, -5448166, - 1279363, -7765301, -930934, -15683073, -2754685, -15364172, 5741835, -1023813, 15346992, 5271536, - -8259759, 5707475, -1979980, 9997073, -1933809, 4044786, 3596498, 5391795, 4078072, -4209605, - -5484137, 1163936, -4799089, 7800735, -9197136, 171799, -5095442, 5495411, 2340757, -6219113, - 2185065, 4171487, -6553583, 3057480, -1289027, -2043868, -3209951, 2433636, 437550, -1060857, - -1905892, -50466, -519691, 3198140, 380105, -78920, 272730, -2233920, 75162, 1076426, - 1020055, -1920924, 3878892, 1210644, -2123861, 1865626, -298500, 379568, -2114198, -760209, - -219043, 1190243, 11274, -1032940, 2425046, -382252, 86436, -1488206, -301185, -613107, - 499827, 251256, 653372, 29528, -1268626, 979253, - }, - { - -127238, -237073600, 17135308, 1104344, 4847408, 18209050, -14892262, 9631464, 8661875, 8426726, - -15902116, -8023536, 6475200, 9812927, -4529580, -1083406, 18443126, 2520609, -4597763, -12343199, - 11593727, -3429532, -1261110, -3094524, 8792335, -6979, 8512088, 3593814, -4726075, 9528922, - -9444633, 3551938, -8005282, -1985886, 4080756, -943282, 4433480, 600759, -8386461, -1519882, - -3004867, -4305168, 7846369, 2659122, -3460670, 3972845, -1793149, -2596308, -1209033, 3308736, - -1978369, -153008, -3335579, 4369593, 3761855, -1495186, 163209, 510027, 542777, 4377646, - 3963181, 1779190, -2717104, -1504849, 4273493, 3576097, 461172, 2402497, -5869610, 1644973, - -275952, -183610, 3322694, 1640678, 2026688, -1704565, -5267778, 2632278, -823023, 558883, - 1697586, 3055869, -974421, -1850057, -1137093, -437013, 649614, 1416266, -554051, -1845225, - 1847910, -710817, 857383, -1767916, 432181, -652298, - }, - { - 3761855, -19571630, -11625940, 7412040, 12511777, -10275172, 4866735, 591095, 8740258, -8619999, - -234076, -16996796, 6030134, 2057289, 1672890, -12448963, 18246632, -139586, 264141, 5509906, - 7240241, 7505992, 1636383, -5213017, 3127273, -6462852, -3152506, 2626373, -2816425, 5003637, - 8334921, -6836514, 4473746, -1508070, 4912369, -4172561, -4223027, -130997, -5417028, -4991826, - -558883, 9082245, -2946885, -2295123, -1809255, -3881577, -5221070, -2753611, -3684008, -5932424, - -4379256, -1868311, 2434173, 250182, 1295470, 2148021, -1564442, -2426657, -388158, -255551, - 376347, -2471754, 3263102, -1650341, 631897, 3069828, 449898, -2949032, 1380832, -3410741, - -2464774, 194347, -2116345, -1465121, -863288, 417149, -455803, 306553, 2656437, -1868311, - 1501091, 224412, 77309, 2003065, 1381369, 419296, 863288, -670015, 650151, -1511292, - -498753, -822486, -191126, 569083, -514859, 1020592, - }, - { - 4200478, 154511456, -5863704, 6663642, -3105261, -10195179, 6263673, -4336843, 12731357, 12300249, - -525060, 8251169, 3666292, -3261491, -11432666, 9002251, 9448391, 4329327, 580357, -26884348, - 5429376, 958315, 1322313, -9157407, 19803020, 9683541, -6958921, -5206037, 2361695, -3412889, - 5363878, 4893042, -5244692, 1096827, -112743, -1056025, 8400419, 9625559, 2525978, 3054796, - 1837172, 8289824, 2344515, -11411728, 1028645, 314606, 6521371, -66572, 2287607, -345208, - -3285113, -3358665, -5733782, -151398, -652835, -3058554, -3561065, 1169842, -2884608, 615254, - -5628018, 1805497, 923418, 2653753, -2084133, 350577, -1687922, -1267552, 3789235, -4908074, - -3199751, 3541738, -687195, 1067299, -148176, 44560, 1648731, 19327, 1635309, 2003065, - 410706, -2078764, -599148, 244813, -2295123, -1246077, -1575179, -1216550, 796716, 716186, - -175020, 546535, 572304, 719944, 1326071, 273267, - }, - { - 293132, 51174536, -6075231, 5828271, -190052, -658741, -43487, -3668976, -3458523, 587337, - -500901, 2353642, 390305, 18515068, -25938382, -2484639, 14432164, 29425358, -5506148, 18283138, - 7357279, 8016557, -11180337, 3256122, 16699907, -18255758, 6921877, -3296924, -10763725, 17308718, - -11931419, 180389, -8641474, -326954, -3308199, -4304094, 8275865, 1699196, 14672682, -6724308, - 3233037, -5156645, 4142496, 713501, 246961, 5427228, 298500, -4890894, 594316, 8229694, - 2429341, -2943126, -4577899, 453119, -2145336, 2437394, -5121212, 3499325, -1627256, 2484102, - 2647311, 3103114, -4065724, -350577, -1403381, 1633161, -2865280, 2255932, -741419, -1945083, - 284542, 3266323, -37581, 1635846, 1525250, -1699196, -685047, -318364, 2558190, -2313914, - -1654099, -438087, 1826972, 559956, -52076, -216896, 590021, -810675, -69256, 299574, - -581431, 198642, -2959769, 1110249, -392990, -372588, - }, - { - -24217710, 80835576, 1757179, 1268089, -6035503, -4544613, 3256659, -6782290, -2739116, -1848983, - 3550864, -14289893, 2249489, 18786724, -15723338, -8109972, 29116658, 1845225, 3954591, -6534793, - 6766184, 1120450, -11564736, -6247030, -6127308, 9279277, -2062121, -5318244, 6890202, -13018583, - 2952253, -3073049, 1241782, 529355, 2714956, -6975027, -6162205, 11824582, 1745904, 4357781, - -3439732, -3124052, -1051193, 5848135, -309775, 7157563, 4068945, -7052873, 1388885, -2083596, - -6220187, 2821257, 1454383, -360240, 1875290, 1921461, 1956358, -121333, -5697811, 909459, - 3256659, 1744294, -465467, -3285650, 1511829, -319438, 3021510, -1640678, 2158221, 3776350, - -3403762, -1353452, -1438814, 2079301, 3712999, -656593, 2300492, 1190243, 894964, 1537598, - 925029, 891206, 2468533, 284005, 1338419, 301721, 1391569, -2381023, -337692, 1139777, - 647466, -605054, 1383516, -1296543, -348429, 359167, - }, - { - -6748468, -6373732, 9902584, 999654, 3952444, -2023467, 313533, 8749922, 991601, 3427921, - -2316598, -2672007, 398358, -10638634, -16207596, -11509439, 8579734, 13316009, 3617973, 13791677, - -23560580, -7784628, -17144972, 8673150, 1045288, -3540127, -1090922, 27213450, -10038412, 10609106, - -4664872, -15226733, 10965588, -8319352, 11950210, -10788958, -12664248, -3613141, -1077500, 7775502, - -12626130, 8308614, -9538585, -1498407, -6460168, -5360656, -615254, -349503, 4238596, -4015795, - -573378, -341987, -2647847, 3489661, 864362, 1347546, -2394981, 813359, -3705483, -3424163, - 1575716, -3805341, -2636573, -676457, 1525787, -198642, 2503429, -1360968, -3644280, -485868, - -602906, -4632659, -3207267, -28991, -1414118, 684510, 62277, -5906, -2725694, 2050310, - -814970, -910533, 639950, 797253, -1363115, 60666, 2119566, -489626, 934692, -11274, - -215285, -263604, -478889, -471373, 285078, 1722282, - }, - }, - { - { - 23896662, 80966576, -463320, -9268003, -523986, 257161, 6608344, -13535053, -5509370, -317828, - 3854733, -29631516, 3037079, -9165460, 7212861, -1562831, -5337034, 6140730, 4172024, -5422396, - 1563905, 1399086, -6669011, -16080358, -18839874, -6502581, 8579197, 2252710, -4609574, 1263794, - -11442867, 1713692, 3602941, 5325223, -1555852, 14011794, -4201015, 625455, 5184563, 904628, - 1204738, 337692, 1848447, -337155, -1900523, 997506, -4920959, 8178692, -1411434, 5621576, - -4072166, 379031, -723165, -3550864, 1418413, -2158758, -5895380, -7582228, 8526584, -3337190, - 2231773, -1091459, -3573413, 3452080, -23085, -1455994, 2972117, -2425046, -175557, -2574833, - 1976222, 1551557, 816581, -2082522, 996969, -144418, 600222, -1147830, 1137093, -938450, - 1185411, 1481764, 1227824, 1473174, -715649, -1312113, 574452, 2267743, -1149441, 478352, - -1080721, -1903744, 2043868, -238371, 65498, -633508, - }, - { - -501437, 15582141, 24834574, -11506754, -5811091, -190052, -796180, 9675488, -8579734, -5780489, - 664646, -10025527, -5405753, 26356604, -11957189, -5851893, -12786118, 1925756, -5503464, 13358422, - -3722663, -6371584, 8438537, -18352932, -10297721, 14784351, 12107513, -16888348, 6264747, -5992016, - 5669357, 10431402, 2415382, 3308736, -7733626, 632971, 8229158, 1812476, -6726456, -917512, - 2104534, 904628, 4475356, -731755, -1531156, 1779727, -512175, 362925, -374736, -419296, - -369904, 3013993, 8157754, 351650, 2016487, -3712462, -3838090, 464393, -5847061, 382252, - 5947456, 1080721, 1067836, 1464584, 2608119, -2113124, 1555315, 2974802, 1088774, -1387811, - -1214939, -1510755, -4948339, 232465, -1666447, 842887, 341450, -207232, -1217623, -1976759, - 1257352, 812286, 729071, -689342, 479963, -176094, 365072, 1181653, -212064, 515933, - -52076, 1350230, 1843615, 665183, -775778, -1205812, - }, - { - -736587, 90216864, -19402514, -6063420, 5615670, 1988570, -4541928, 5238250, -4060892, 4184909, - 10873783, -7164006, -4126390, 10475425, 6586869, 12183748, -14324253, 25603910, -23288386, 5119601, - 10487773, -11251204, -929324, -1902134, 3885872, 7169374, 2960843, -2126009, -446677, -783295, - -3741454, -5373541, -11150272, 572304, 2609193, -2829847, -977642, 3680787, -3360275, 8932458, - -9828496, -5419712, 4344897, 8141111, -2419677, -2598992, -928250, 3045669, -3970697, 10177462, - 1280974, -4466766, 3801583, -183073, -7046431, -1458678, -6819871, 3375308, 488016, 1392643, - 57982, -3380676, -541166, -1544578, 2128693, -59056, -1613297, 3303904, -366146, 2414309, - -3243774, 406948, 2724083, 283468, 1549946, -1059783, -1835562, -707059, 1502702, 117038, - -1510218, -285078, 462783, -839666, -105227, -912681, 1794223, -886911, 557272, 110595, - -1160178, 719944, -626528, 1657857, -948651, 299574, - }, - { - 58298812, 57195004, -24242942, 22104586, 4252018, 566399, -10430328, 12438225, 3631932, 12026982, - -5409512, -4827543, 6816113, 15484431, 2130841, 7094212, 10860362, 6495065, -5741835, -13617731, - 8646843, 2237141, -6779606, -3503620, 762357, -16370268, 1348620, -4668630, -3172907, 1763621, - -308701, 2042794, -3165928, -4011500, 8691940, 2698313, 6838125, 2368675, 8298951, 9451076, - 1379221, 2277407, -3903589, -1858647, -3280818, 8404714, 1149978, -1420560, -40802, -8917426, - 2758443, -3091840, -2147, 6865505, -1032403, -914291, 1362042, 1465658, 721018, 554051, - -1047435, 3284039, -4413079, 3155190, -493384, -1040993, 541166, -2369211, -2733210, 1447404, - -2418067, -1006633, 407485, 1123671, 748398, -2259690, -13959, -1811403, -109522, -30602, - -22012, 866510, 766652, 631897, 830002, 50466, -122407, -1484448, 417149, -1260573, - 135291, -180389, -1513439, -580357, -748398, 1489280, - }, - { - 683974, 24720222, 585189, 1209033, -3644280, -1540820, -9127, 3592740, 2436320, -967441, - -1310502, 3871376, -8846559, -10707353, -23123568, -36668820, -10760504, 48382808, 1902134, -7703561, - 2146410, -7965017, -9834401, 12262132, 9776419, -10833518, 6796249, -8307004, 8303783, -12857521, - -6138045, -1368484, -14644765, -7788923, 9879499, -9259949, -2062658, 2822867, -2770791, 2659122, - -6430103, 1374390, -2747169, 1012002, -10760504, 12597676, -6111202, -3999688, 3281355, 998043, - -1634235, -2488934, 1323924, 834834, 60666, -415538, 2469606, 3120831, -3632469, 2188823, - -3940096, -1612223, 1465121, 2024540, 1046898, -434329, 3634079, 2438468, -1594507, 1617592, - -2553358, -2490007, 1935957, 1304060, -3731790, 863825, 3235184, 388158, 159451, 255551, - 892279, -969052, -1872606, 353798, -139586, 1941325, 692564, -383326, 564788, 8053, - 870805, -307627, -1563905, -94489, 144418, 236760, - }, - { - 83838832, 31754840, -32850594, -3351685, 6442, -4241817, 6406481, 12093017, -20223390, 2241436, - -2004139, 12839805, 3910031, -4016331, -10750303, -2874407, -8952322, -683974, 11702175, 3905199, - 9809168, 5111011, -2811593, 8508330, -6250251, 6140193, -3358665, -3427384, 32212, 2325188, - -10041097, -10135586, 2294050, -8237748, -2616709, 4155918, 4424890, 1712081, -3144990, 1866163, - 2254321, -4101694, 3171833, -3001109, -4410395, 1461900, 1387274, 1461363, -5082020, 3670050, - -2848637, 1453310, 2505040, 961536, -5403069, 2782065, -2474438, 2495376, 78383, -812286, - 77846, -424665, 2457795, -301185, 532039, 1469953, -3448322, -2611340, 115964, 1641751, - -324270, 2374043, -1042066, 2609193, -408559, -1502165, -850940, -1270237, -223875, 1882806, - -1260573, 2479270, -2928094, 525597, 329639, 1191317, -972810, 568009, 572304, 782221, - -526670, -521839, -885837, -660888, -257698, -275415, - }, - { - 727997, 13659070, 7491497, -5888400, -1707250, -98247, -186294, -1604170, 699543, -4648229, - -7931194, 2825015, -10428717, -14629732, -5576478, -13342316, -36774048, -14545980, 1462973, 5684389, - 8253854, -1259499, 18698676, -26176752, -25363392, -307090, -23026930, -1276679, -2611340, 20869246, - 19149648, 6643778, 7991324, 3504693, -1689533, 7868917, 1112397, 534187, -2672007, 8749922, - -942208, 106300, 3841312, -4471061, 3651259, 155693, 2530273, -1469953, 2760053, 1909650, - 2657511, 3757023, 3718905, 2745021, -1096827, 2086280, -361314, 1064078, 3212099, -1836099, - -1243393, -3544959, 693637, 2690797, 796716, -77309, -1677722, 2804077, 3264712, 419833, - -4563403, -384400, -1685775, 814970, 1758789, -954020, -370978, 1026497, 102005, 501437, - -1804960, -1854352, 1897839, 238908, 653909, 120796, 355945, 2559801, 721018, 616328, - 666257, -607201, 881542, 1861868, 615254, 189515, - }, - { - -26340498, -444684256, 10086731, 6280853, -7044283, -2522220, -3153580, -9565429, 5073430, -2310156, - 7713225, -2059974, 5916318, 398895, 23066122, -6604049, -508954, -13381507, -8979703, 3237869, - -1374390, 9335648, 8740258, 566399, -12775917, 3256122, 2848100, -5221607, 3212099, 933619, - -4087735, -4741107, 1294933, 3200825, 1132798, -639950, 2624762, 10934450, 4404489, -386547, - 84289, 3255048, 4640176, 1255204, 1367947, 1382443, 4944581, -2044941, 752156, 871342, - -4876936, 4284767, -5110474, -4995584, 6219650, -4217121, 170725, 2065342, -1356136, 1401233, - -2379412, -3657165, -264141, -758599, -1359894, 2068027, 2884071, 410169, 120796, 1617592, - -2406792, -345745, -1625645, 2576981, 476205, -956704, 1672890, -644782, 1306207, -405874, - -1342177, 289373, 563178, 1084479, 290984, 951335, 2783676, 1327145, -1182190, -1237488, - 972273, 434329, 862215, 658204, -1788317, -542240, - }, - { - 1207423, 4853313, 5844914, 1469953, 4444218, -372588, -2459406, 3647501, -7957501, 1455994, - 233539, -3120831, 4624606, -9471477, -79541720, -28169616, -22041772, 9912785, -15952582, 12003360, - 10321880, -13095892, 1079647, 13442711, 22067006, -20137492, 5638219, 5275831, 4275640, 8200167, - -8804146, 1817308, -3661460, 2940442, 812286, 2317672, -6732361, -735513, -1174674, -3049427, - 528281, 3744138, -2841121, 8637179, -4919885, 7065758, -1217623, 3976066, 1059246, -2381559, - 4107599, 2648921, -5028870, 4758824, 1305670, 94489, -1859184, 2912525, -1142998, -4492536, - -5269925, 62277, 1014149, 2008971, -317291, 1953673, 397821, -1357747, -635655, -906238, - -142808, -2419140, 3560528, 613107, -2938831, 37044, -841814, -750546, -3575024, 773094, - 673236, -76236, 179852, -332323, 1767379, -2120640, 352724, 171262, -212601, -1101659, - -64961, -464930, -73014, -407485, -1482838, 1397475, - }, - { - 2336462, -282472480, -23712514, 9703942, -6271189, 25596932, 13389561, 22093312, 15164456, 18771154, - -8800388, 4212826, 18342194, 20233590, 4869419, 1282048, 21221970, 1704028, -1862942, -4147328, - 9889162, -223875, 6128919, -12242267, -5869610, -2378875, -3459059, -9098351, -11938935, 4311074, - -2061584, 7602092, -8888972, -1119913, 9425843, 181999, 4887136, 4671314, -8219494, -206695, - 8777303, 42413, 1532230, -2488934, -4261682, -3484829, 272194, -183610, -215822, 5043902, - 3072512, 6490770, -2646774, -4765266, -1466195, 1085016, 1352915, 2573759, 1479079, -100395, - 139586, -284542, -2841658, 1847373, 2386928, -1413581, -472983, 2792266, -3410741, 2637647, - -1079111, -463856, 2451353, 222801, -67109, -1372779, -2910377, 1927904, -1451162, 1383516, - 153545, 402116, -2705293, -1574106, -9127, 421981, 1589138, 1182190, -2219961, -3613141, - 1009317, -1777580, -972810, -2077690, 537945, -1000727, - }, - { - -3811784, 15006079, 13211319, -6893960, 3616899, -9544491, 10963978, 255551, -1944010, -13596793, - 4925791, 365609, 21508122, -578747, 9706089, -6295349, 2131915, -12528420, 10736881, 663572, - -12584254, 12414603, 12708271, -779000, 5480379, 1209033, -1901597, -583042, -7044820, -1950452, - 9361418, 1490891, 11833709, -1949915, -3710852, -6893960, -3745748, -1317481, -646929, -1228898, - 2583423, 16979616, 3112241, -601832, -3537443, -8404714, -7529078, 725850, 3781182, -555661, - -1582159, -1032403, 2707977, -421981, 936303, 3481608, -1267552, 192737, 2915209, -1331440, - -504122, -4547834, 171799, -4394826, -300111, 1890859, -1890859, -3654480, 3016678, 442382, - 81068, 915902, 615254, 1000727, -358630, 726386, -1630477, -1096827, 1078574, -2582349, - 2254858, 190589, -921807, 88047, 704375, -1385664, -1261647, -968515, 1745367, -314069, - 509491, 19864, -261993, -816044, -210990, 2185065, - }, - { - -37507412, 105477416, -7289097, -8720931, 17165910, 22918482, -874026, -2289218, 11272679, 1158567, - 2110440, 13123273, 2934000, -2060511, -16151225, 895501, 1339493, -2131915, 12867722, -23638964, - -6228240, 1324461, 8967355, -2187212, 18356154, 7523709, -7676181, -4979478, 6942815, -3820374, - -27917, -351650, -7985955, 2871186, -131533, 1337346, -3171833, -3521873, -3578782, 4649839, - 4879620, 6654515, 578210, -1935420, 7851737, 904091, 7467338, -3248069, 1056562, -921271, - -5722507, -2598455, -3543885, -2991982, 715112, 342524, -2915746, 3400004, -368293, 3030636, - -1680943, 2556579, -1307818, 3482145, -984084, -12348, 1351841, 1250372, 3073586, -2803003, - -378494, 2902324, -3452617, -2061047, -2048699, 229244, 1944010, 154619, 670015, 697395, - 126702, -1512902, 460098, 1861868, -1382980, -1029718, -848256, -224949, 571768, 688269, - -195958, 762894, 614180, -521302, 685584, -848793, - }, - { - 661425, 59564216, -5017596, 3427384, -120259, -6980933, -3511673, -1238024, -82678, 2699387, - 442919, 1024350, -11712376, 39505108, 13794361, 24220394, 13164075, 11959336, -12539157, 14471892, - -12950937, 10150081, 11264089, 3235721, 693637, -11558294, 9956808, -1465658, -4830228, 27070106, - -10604274, -3848291, 815507, 6296422, 264677, -1236951, 12269111, -3553012, 11398306, -2354716, - 4369593, -6463926, -293132, -3721589, -1902671, -2247342, -1451699, -4510253, 2686502, 9018894, - 2595771, 4489852, 2388539, 2666101, 1355599, 5487895, 1269163, 7049652, -1717450, 2503429, - 820339, 6906845, -694711, -2043331, -1546188, 1808181, -1692754, -4832, -3855807, -2328946, - -4063039, 3307125, -768262, -1107565, 2990908, 1138703, 306553, -534723, 1216550, -2387465, - -648003, -760209, 479963, -573378, 811749, 963683, -141734, -2957622, -979253, 1265942, - -650151, 87510, -1480690, 893353, -1196685, -156229, - }, - { - 7981660, 132276936, 7296613, -8116415, -14487998, 144955, 525060, -8977555, 4934918, -3832185, - -8246874, -31431644, -14924474, 11186242, 4321274, -10148471, 19498078, 1475858, -4802311, -10710575, - 12265890, 9183714, 1631551, 7774428, 6305549, 10859825, -3171833, 165356, 25703768, -9456444, - -5878737, -10200547, -1085016, 1142461, 260382, -12554189, -16683800, 7142531, 6502581, 13473849, - -606664, -1682017, -4898947, 1547262, -6449967, 965294, 6367289, -6704444, -2532420, -681289, - -2767570, 3264175, 3138011, 1478006, -1012539, 343061, 2347200, 1306744, -5953899, -1516660, - 2178085, -233539, -128312, -1488743, 2740189, -1156420, 2269890, -1759326, -201327, -1816771, - -2797098, -1002875, -3672197, 1052804, 1796370, -1477469, 2321430, -847182, -1701881, 855235, - 1664300, 379031, 57445, -1868848, 73014, -1970316, 556735, -1808718, 573378, 2705830, - 1734630, -1355062, 622770, -1080721, -19327, 1125281, - }, - { - 6345278, -21509734, -15453292, -726923, -3018288, -7050726, -816581, 11176042, 2983929, -4022774, - 185757, 2015950, -2005750, 30765924, 41871636, -6926709, -14569603, -599148, 958315, -21094196, - -30575336, 24942486, 407485, 10233833, 921807, 497142, -187368, 18041010, -11150809, 13028783, - 19628000, 6900939, 13267154, -11366094, 6185290, -4100083, 974421, -7485591, -6013491, 14772003, - -7129109, 11894375, -5181341, -3891240, -9031779, -6753299, -2362769, -5060545, -2567854, -5145908, - 602906, 3959960, 4031901, 674310, -7980586, -2633352, -3940633, 1942399, 2665027, 5054640, - 4095788, -1872606, -2843268, 220117, 3658775, -435402, -60130, -2857227, -994822, 1520955, - 398895, -1058173, 338229, 1129040, 99858, 319975, 196495, 582505, -1955284, 1913945, - -3442953, -1466195, -219580, -803159, -1115618, 193810, 336618, -1753957, 1365800, -150861, - -434865, 157840, 121333, 518080, 647466, 399969, - }, - }, - { - { - -17324288, 56052008, 12095702, 4318590, 6069863, -201327, -5438503, -10343892, -6130529, -6373732, - 7749195, -11916387, -10055055, 4184909, 8159901, -8177618, -10258529, 3770445, -1098438, 7880191, - -12135430, 6328635, -9965935, -10165114, -12592844, -3105798, -1432909, 37044, 7791071, -2324651, - -4396436, -3300146, 2195265, 11328513, 734976, 4927401, 1440962, -3810173, 6929393, 2666638, - -2815351, 5336497, 128312, -4922033, 2303176, -1588064, -3852586, 3586298, 1453846, 6081674, - -1643362, -2825552, 1020055, -2339684, -900869, -3292093, -6164352, -6451578, 4210142, -2425583, - -785442, 1295470, 309775, 1281511, -313533, -3138011, 1079111, -562641, 1321239, -1660542, - -493921, 3180423, -1664300, -1071058, -514859, 550293, 211527, 239444, -977642, 245350, - -380641, 3441343, 1207960, 656056, -907312, 215285, 853088, 168041, -703301, 1101659, - -1002338, -1754494, 1793149, -758599, 527207, -910533, - }, - { - 1228898, 34475704, 9248138, -16758962, 1941862, -1372242, 1067836, 3345243, 1199907, -13589813, - -3801046, -7341710, -3453154, 11908871, 6648073, -7826504, -12831215, -8491150, 22434224, -13544716, - 231928, 10585484, -4570382, -6248641, -8933532, 1614371, 8693014, -10276246, 1528472, -5837935, - 9386651, 1148904, 12039867, -2421825, 2309619, 622233, 5942088, 6343130, -7463580, -2863133, - 6495065, -1452773, 5857262, -7255274, -1703491, 3492882, 7754564, -1290101, -2980707, 241592, - 401579, 2257542, 7801271, 2820720, 809601, -816581, -4918275, -5941551, -1505923, 968515, - 5305359, 2773475, 379568, 1153736, 2663417, -2600603, 1711545, 4161287, 1166621, -1751810, - -2277943, -1542430, -2974802, -2022930, -813896, -854699, -699006, -76773, -226560, -1068910, - 1582159, -301721, 528818, 491237, -245350, 329639, 114890, 1373316, -579284, 1288490, - -173409, 1248762, 846109, 1209570, 210990, -995359, - }, - { - -350577, 37980396, 16942036, 11448772, -9852655, 2651606, -946503, 4486630, -856309, -7214472, - 19141058, 1015223, -11608760, 4727686, 13351980, 4757750, 6481106, 8024610, -15163919, -2884071, - 4574677, -10604811, 9277129, -3749507, -4944044, 10181757, 1764158, 6805913, -11003706, 597000, - 5771363, -15730855, -9232032, 6260452, -8739722, 3942243, -3790309, 4434554, 100395, 233539, - -7592966, -5462662, 2563022, 8689793, -1770063, -2316598, -1917703, 6418292, -5193153, 2423435, - 2262374, 2603287, -1597191, -1448478, -2330020, -4141422, -4398047, 2633352, 363998, 3640522, - -2627446, -2900714, -1746978, -1196685, 2338073, 410169, 530428, -722628, 971200, 1206349, - -1181116, -1471026, 3050501, 425202, -166430, 138513, -906775, -1241246, 883690, 147103, - -1110786, -309775, 827855, -781684, -1674500, 1071594, 1277753, 445066, -2364380, 882079, - -564788, -238371, 777389, -17717, 203474, -225486, - }, - { - -57569740, 161161136, 25106232, 2588255, 10419591, 3792456, -3514894, 1799591, 4682588, 21961242, - -4878009, -10611790, 8475581, 3145527, 12140262, -237297, 16168941, 11412265, -7714298, -4307316, - -3259880, -4878009, 3579318, -6918119, -482110, -4782446, -15777562, 1318018, -2896956, 4344360, - 2944737, 6042482, -865973, -219580, 1501091, 6155762, -325881, 6721624, 1398012, 16020228, - 3302293, -4361003, -1002338, -7560216, 525060, 2545305, 9488120, -2439005, 1498407, -5936182, - -2480344, 406411, -137976, 2890513, 242666, -2147484, 921807, 4308926, -872952, 140123, - -573378, 3226057, -878858, -514859, 2754148, -2451353, 1883880, -2469069, -2313914, 2103997, - -418222, 364535, -1702418, -507343, 493384, -383326, -603980, -858457, -471373, 248034, - -626528, 390305, 1451162, 731755, 241592, -278099, 514322, -1815697, -946503, -96637, - 728534, -738734, -949188, -1052267, -278099, 1341640, - }, - { - -1517197, 24329380, 1747515, -4476967, 2338073, -1446330, -220117, -201327, 3684545, -2695629, - 5235565, -3624953, -2210835, -19344532, -27577986, -22477174, -10798622, 6065568, 32533304, 2389076, - 6184216, -15871515, -16125992, 16403554, 410169, -13634374, 15105937, -4901632, 13273596, -21458194, - 3007551, -2895882, -23934242, 8011188, 6737193, -7334194, -2616172, -463856, 1967632, -884763, - -500901, 649614, -682363, -5985037, -3009698, 19327, 1732482, -4314295, 1745367, 1356673, - 267362, -1563368, -1553168, 2592013, -1037772, 2984466, 2332167, -368830, -5063767, 1641751, - -412317, -1891933, 2599529, 3489124, -514322, 893353, 2656974, 1989107, -252329, 1158567, - -3385508, -1822677, 1401233, -116501, -1166621, -3758, 2086817, 1067836, 1619740, 1112933, - -1738388, 29528, -1682554, -169114, 887448, 1883880, 868657, -549219, 184684, 256624, - 590558, -217970, -478352, -854162, -493384, 94489, - }, - { - -80380312, 185176976, 12917651, 10482941, -2392834, -3777961, 4196720, 6613176, -15551003, -3732864, - 8893267, -8194798, 20619064, -17981418, -2069101, 1650341, -15814606, 1476395, 7675107, 13024488, - 10334228, 6100464, -4952634, 4663261, -1222992, 3841312, -1020055, -1077500, -6142340, -4766340, - -5558225, -13212393, -711354, 3474092, -5454609, 5160403, -3278671, 1409286, 1707786, 4137127, - 1053878, -3168075, -176631, -1785096, -5778342, 584652, 2604361, 387621, -6628745, 1862405, - 2571612, 79994, 5491653, -2114198, 1735167, -1979443, 1111860, 357556, -1492501, -686121, - 290447, -1279363, 2892661, 3289945, 850404, -2480344, -429497, -1060857, -1541893, 1095217, - 920734, -162672, 2839510, -505196, 110059, -890669, 91805, 130460, -1540283, 1014149, - -1013612, 1188095, -1321239, -1694902, 1762547, 643171, 143881, -473520, 1275068, -607738, - -1156420, 1341104, -485868, -921271, -957778, 885300, - }, - { - -179315, 16481400, 6658810, -369904, -3853123, 52613, 525060, -2555506, 2982855, -10464688, - -3416647, -5111548, -3197066, -15870978, 10407243, -10088878, -46981036, -5934034, 8942659, -10550587, - -3502546, 16521665, 1970316, -27482422, -13063143, -9928354, -4163971, -14239964, -2030446, 26383984, - 21106006, 7015292, -141734, 3600793, -200790, 7961796, 520228, 3984119, 620623, 5441724, - 855772, 1080721, -4923643, 922881, 6360847, 559956, 699543, -882079, 3854733, 3373697, - 2565706, 2082522, 4152697, 2216740, 106837, 860604, 319438, 910533, 6772090, -983548, - -2217814, -4388383, -2694555, 3117610, 27917, 443455, -1322313, 2564096, 3602404, 172872, - -5186710, -2455648, 949188, 355945, 2063732, 1074, 896038, -1205812, -76773, -60666, - -388158, -847182, 703301, 1584306, -1355062, -216359, 3004330, -604517, 918586, 2403571, - -960999, 225486, 609885, 818191, 1332514, -531502, - }, - { - -5526549, -455288000, -10961830, 5365488, 469225, 5386426, -15369540, 1637993, 145492, -2521683, - 6848326, 22012, -9635759, 11234024, 9285719, 5750961, -13300440, 5060009, -15069430, 3224447, - 2514703, 3686693, 6695317, -1343788, -7131257, -3876745, 5602248, -329102, -5334350, -2427194, - 3707631, -1512365, 1695438, 3622268, 2910377, 7836705, -751619, 8611946, 2296197, 299037, - -3347927, 5425618, 3906810, -140123, 1680943, 4746476, 7661148, -5229660, -3618510, 5976984, - -6971806, 4253092, -4795868, -3238405, 2344515, -4406637, 1117228, 489626, 2276870, -401579, - -1991254, -5332202, 1284732, -1573032, -1319092, 3664681, 2595771, 794032, -862215, 2803540, - -3868692, -501974, -399432, 2448668, 943282, 1611, -214212, 549756, 463320, -92879, - -1425392, -729608, 1030792, 1066226, 1961726, 1711008, 380641, 1000191, 37044, -601295, - 780073, 37044, 731755, -327491, -1184874, -660351, - }, - { - -45097, 14008036, 960462, 1760400, 5891622, -1309965, -531502, -2426120, -1785633, 1186485, - -3452080, 1274532, 1938641, -18181670, -72552200, -21399138, -14194330, 6803228, -18963354, 20048908, - 9846749, -15232638, -11144903, 27202176, 307090, -3878892, 4237522, 7381975, -1860795, 18491444, - -17242684, 3989488, 4511327, -2622615, -2560338, 6970195, -3928285, -5327907, 162672, -1129576, - -3405909, 5958194, -430034, -1394791, 6413460, 2842732, 1124208, 1104880, 1918777, 4014184, - -20401, 1316408, -1777580, 1880659, 1588064, 2487860, -4453881, 4097936, -2263985, -281320, - -7467338, 1083406, -1313723, 4413616, -124554, 649077, 274341, -1580011, -26307, -3016141, - 344134, -134755, 251256, 1656247, -743029, -3004867, 1268089, -1960116, -1769527, 984084, - 939524, -1386201, -612033, 499290, -292595, -30065, 630823, 452582, -1238561, 259846, - -1123134, -407485, 566399, -1707250, -318364, 1337882, - }, - { - -4174708, -295596288, -14305999, 20425254, -11135240, 2222646, 19961934, 21861384, 23863912, 13227426, - -1001264, 4084514, 17186848, 8201240, 1243393, 19878182, 15861851, 9575093, 3878892, 1227287, - -9169218, 844498, 3592203, -9352828, -10604274, 13081397, -14694694, -14629195, -13321915, 6182069, - 2459943, 3091303, -5228586, 2706366, 5139465, 3321620, 13002477, -4814122, -7247221, -7527467, - 17809082, -571768, 4188130, -9969156, 5635534, -6333466, -800475, 780073, 112206, 1256815, - 10077604, 2508798, -3042448, -5281199, -1670742, 1193464, -578747, 5026723, 1107565, 1186485, - -213675, -5818607, -991064, 3160559, -469762, -1716913, 3171297, 275415, -2150705, 1690607, - 2112050, -1474784, -620086, 2013803, -1697586, -228707, -1155883, -1040456, -542777, 2313914, - 184147, -1117228, -1263257, -653909, -882616, -1264331, 1301375, 969052, -1645509, -171799, - -2024003, -787053, -1923072, -417149, -1504312, 943819, - }, - { - 3233574, 38340100, -7834557, -4478577, -6242735, 5730023, 2806761, -964220, -3849901, 1285806, - -2718714, 8073465, 7461969, -845572, 20523502, -6398965, 10097468, -22820772, 7559143, 4299799, - -11896523, 6198712, 19189378, -4578972, 9887015, 899259, -2710124, -6658273, -3358128, 5565204, - -583579, 2639258, 12963822, -739271, -14231374, -75162, -623844, -3875671, 7095286, 756988, - -1037235, 9604621, 4053376, -712965, -1075352, -4628364, -6950868, -3326989, 3821447, 3362423, - -2770254, 536871, 4171487, -2861522, -472446, -11811, 3935264, -624381, 5405753, -3808026, - -1437740, 1630477, -3310883, -3621194, -1719061, -1973001, 184147, 792958, 610959, 608812, - 679142, -250719, 2473901, 1249836, -389768, 357556, -701153, -934692, -251792, -968515, - 1537598, -1028108, 202937, -1345935, 1185948, -2618856, -488016, -996969, 2149094, -89657, - -482647, 891743, -725313, -1371168, 1067299, 1538135, - }, - { - 56414932, -4102768, -17590576, -20058572, 20212116, 44369160, -22744000, 6284611, 7622493, 603443, - 11537356, 995896, -4124242, -6770479, -8813273, 1712081, 6451041, -10615012, 10223633, -9370008, - -11456288, 3558917, 12150999, 5238250, -5034776, 8333847, -2132451, 2572686, 2492155, -3016678, - -721018, -1154273, -2401961, -2685428, -3853123, 17904108, -12378633, -8043937, -4474819, 7780334, - -1075352, 14395120, -8504572, 3133716, 6689949, 3098282, 1306744, 2353642, -1139240, -1429687, - -1283658, -3280818, -6720013, -1200980, 1313186, -2762738, 3904125, 1034550, 2462090, 272730, - 2748242, 162672, -1185948, 756451, 885300, 2025077, -346282, 2209224, -625455, 1497870, - 138513, 535797, -307090, -2689187, -2355790, 1064615, 960462, 451508, 615791, -1390496, - 280784, 176631, 712965, 1119913, -1537598, -337692, -1413581, 421981, -379568, -56908, - 815507, -401579, 1218160, -809064, 486942, 75162, - }, - { - -1409823, 50133004, 1138166, -2322504, 8616241, -13030931, 2786897, -1040993, -569620, -2821794, - 1387811, 2237141, -13123273, 23868208, 3273839, 45230300, 3412889, 15409806, -3565897, 4364224, - -19926500, 6277095, 37979324, 2891050, -20794084, 18295486, 11141682, -15384036, -1954747, 13925895, - -541703, -2753611, 12618077, -4473746, 5556077, 3240553, 1621887, 4065724, 4182225, 7309498, - -3129421, -129923, -6866042, 1920924, -3406983, -7924752, 4414153, -3595961, 5687611, 448287, - 3795141, 7416872, 5974300, -3896072, 5879274, 3834869, 6517613, 2192581, 375810, 1409823, - -2146410, 6187974, -752693, -3862249, 1311039, -333397, 2201171, -2442763, -2942053, -2621004, - -4570919, 4223027, -2128693, 329102, 2010045, 12885, 1435056, -1264868, -237297, -664109, - 1005559, -588947, -1012002, -284005, 45634, 1764158, -1624571, -1304060, -570157, -377957, - -265751, -396211, -93952, -126165, -55298, -425202, - }, - { - 13532905, 125903744, -1050120, -10870562, -4846871, 3501472, -219043, -9416716, 2963528, -4645007, - -13954349, -31478352, -14143864, -10257993, 30579094, 4049617, -3926674, 1445793, -10356777, 1126892, - 7894687, 5289252, 9024800, 3963718, 17291538, -8538395, 10099616, 4687957, 19019188, -2019708, - -11676942, -8969502, -106837, 127238, -1695975, -4821101, -11820824, -1946157, 4502200, 7997229, - 11221676, -4231617, -6999186, 3689377, -10331007, 1968706, -1305133, -7128035, -4730907, 2173254, - 2124398, 4901095, -392990, -1100585, 1954747, 22549, 237297, 1748052, -5085778, 2011655, - 1088774, -2332167, -165356, 313533, 3809099, -633508, -757525, 766652, -1297080, -5954972, - 1206886, -2627446, -2817499, 972273, -275415, -248034, 1307281, -461709, -777926, 791348, - 373662, 622233, -1049046, -1848447, -744640, -1286880, 11274, -439697, 747324, 1700270, - 768262, 133144, 24159, -1184337, 577136, 576063, - }, - { - -6078990, -28567974, 3081102, -2595234, -2485176, -5553930, -7347079, 3721052, 5689758, 1557999, - 834834, 1059783, -12494597, 1388885, 60332480, 27766426, -11427297, -9888625, 3419868, -44259636, - -7432978, 27830314, -4121558, -4296041, -1358820, -2082522, -1400696, 3102040, 18892488, -6591164, - 21298206, 17507898, 1517197, -4384088, 6538551, -6015102, 2704756, -841277, -4677757, 3341485, - 2789045, -414464, 6396817, -13489955, -5447629, 58519, -5015448, -1379758, -9785546, 1639604, - 1908039, 2195802, 5738077, -806917, -7543573, -2830384, -6657200, 3504157, 5450314, 3628174, - 3860639, 717260, -2892124, -707596, 1133871, -15032, 2827699, -7970923, 2986076, 2165201, - -886911, 696858, 1950452, -861678, -190589, 1863479, -8053, -3280818, 1001801, 906238, - -2521683, -1557463, 104153, -1767916, 1152662, -542240, -122943, -134218, -243203, -38118, - 173409, -77846, -16106, 1341104, 423591, -312459, - }, - }, - { - { - 12887049, -72975792, -120718112, -22524956, -4416837, 22549, -2949032, -4109210, -4001299, -17400524, - -4450660, -7093139, -10411001, 5583995, 12326556, -4440460, -13365938, -2685428, -8637716, -17717, - -16056198, 8545374, -5465883, 612033, 6642167, 9731322, 2165201, -5140539, 9374303, 1723893, - -6667937, -4219806, 2068027, 5226975, -2314451, 5211943, 3074660, -2282775, 6460168, 6833293, - -1395864, 2920578, -736587, -3078955, -2192581, -6285685, -824634, 1305670, -663036, 2188286, - -7093676, -4348118, 1864016, -530428, 3505767, 517544, -4029753, -5508296, 1088774, -6366752, - -3735011, 3166465, 2861522, -1073742, -3941169, -5909338, -449361, -852551, 874563, 547608, - -354872, 1381906, -1833951, -449898, -761283, -230318, -951335, -100395, -1440962, 324807, - -1520418, 617938, 157840, 1900523, -486942, -433255, 471910, 183610, -646929, 758599, - -74625, -932545, 1005559, -823023, 481573, -775242, - }, - { - -1583232, 22929756, -3338800, -6072547, 14109504, -2315524, -3069291, -4051228, 1609002, -13014825, - -1565516, -6819871, 355409, 16518981, 15650324, 13440563, 1970853, -11413339, 18708878, -11174968, - 6369437, 17743584, -7722888, 2460480, -8755828, -14777372, -1235877, -10014253, 10121090, 3515431, - 8574902, -4121021, 16444356, -3636227, 698469, -5133560, -1634235, 11142219, 2438468, 113280, - 4245039, -2871186, 4949950, -4766877, 678605, 675921, 5896990, 3814468, 1129576, -621697, - 1174137, 672162, 2959769, 735513, 4967667, 5769215, -2296197, -5964099, -2270964, -190589, - 1739462, 1832340, 1292248, -7516, 1651952, -3076270, -1251983, 863825, -243203, -2509872, - -1101122, 2208687, 1614371, -1854889, -1521492, -719407, -529355, -35970, 584652, -104153, - 831613, -348429, 373125, 582505, -472446, -475668, -453656, 1114544, -1161789, 665720, - 40265, 374199, -1037772, 256087, 823560, -92342, - }, - { - 1445793, -9406515, -14003741, 25727928, -838592, 3862249, 3030100, -1719061, -7057705, -1203128, - 16152298, 6793565, -6359773, -10921565, 8607651, 8906688, -129386, 2507724, 1035087, -1714229, - 6547678, -7406671, 11376295, -852551, -17726940, 5582921, 5238787, 3171833, -12887049, -3831648, - 4448513, -10146323, -4530654, 7492571, -3995930, 6949257, -2486249, 935229, -4466766, -1534377, - 925565, 28454, -2953327, 2663417, -2018098, -2093797, -5388574, 3249143, -3625489, -881542, - -2541010, 1118302, -3215320, -634045, 1791538, -517007, -2187749, 2051921, 1216013, 3685619, - -1681480, -2609730, -1342714, -940061, 88584, -1287417, 784905, 328028, 1092532, 719944, - 415001, -2449205, 548682, -242129, -181462, 461172, -150324, -1474248, 153008, 1833414, - 1745904, 863825, -174483, -430034, -518080, 1350767, -82141, 539555, -1445257, 1602023, - -383326, -1297617, 731218, 509491, 819802, -581431, - }, - { - 42465416, 233372416, -26936424, -14180371, 243203, 6526203, 5468030, 52613, -7582228, 12502650, - 5865852, -11312407, -4605816, 98247, 14243185, -8321499, 9579388, 15876883, -7718056, -4854924, - -5122822, -11389716, 5753109, -3765613, 584116, 13720810, -2822331, 6899865, -1287953, 2385318, - 4531191, 5237176, 1432909, 1329829, -4032438, 5961952, -5106179, -53687, -4052302, 4174171, - -914291, -2254858, -354872, -1552094, 3142842, -4086662, 9354439, -1134945, 3907347, -536871, - -2779381, 3162707, 727460, 176094, -2028298, -4973036, -47782, 1421634, -2320893, 656593, - -1861868, 3935801, 469762, -1832340, 2774012, -1583769, 1734630, -834834, 410706, 3078418, - 1272921, 3015067, -62277, -1154809, 332323, 900333, 563714, 578747, -198642, 387621, - -140123, -552440, -540629, 294205, 379031, 412854, 760209, -1407139, -783832, -324270, - 138513, -657667, 223875, -549756, -322123, 915365, - }, - { - 1934883, 25403120, 416612, -7817914, 1266479, 845035, -1192390, -3255585, 2939368, -1072668, - 4835597, -6521371, -2776160, -15808701, -24520506, -6202470, 16996260, -24087250, 11104638, 15093052, - 1025960, -6691559, -10634339, 283468, 3919158, 2323041, 21239688, -3917547, 10529112, -14497125, - 4643934, 4220342, -5655398, 10245644, -3094524, -6691022, -2705293, -4527970, 3045669, -2056753, - 3622268, 2239826, -5383205, -7596187, 2437931, 2827162, 1887101, -6254010, 2925410, 1693291, - -271120, 77846, -2174864, 1648731, -75162, 3198140, 752156, -273267, -3129421, 3057480, - -235149, -1363652, 2521146, 2514703, -3134253, -1052804, 1817308, 1805497, 307627, 700617, - -2172717, -1286880, 454730, 112206, -949725, -1738388, -385473, 286152, 281320, 762894, - -802085, 1414118, -790274, 434865, 624381, 812286, 528818, -153008, -588947, -700617, - 310848, 739808, 843961, -783295, -885300, -434329, - }, - { - 56828324, 296987328, -36104032, 41038948, 16384763, 3805341, -7573638, -5905043, -4612258, -9688372, - -3040837, -9927817, 23047868, -24350318, -8237748, 11729556, 3498251, 7102266, -637803, -5603322, - -7534447, 4939750, -1962263, 2389076, -6832756, 3679713, 2903398, 5808944, 2137820, -5535139, - -2537252, -861678, 1949378, 1173600, -1620813, 6448894, -8459475, -5832566, 774705, 3603478, - 3038689, 5910949, -717796, -3992172, -2560338, 8689793, 6174016, -1309965, -3553012, 1165547, - 3655017, 1731409, 5987722, -1932735, 2095944, 996969, -58519, -2660195, -3270081, -2091649, - -823023, -2590402, 3520800, 2040646, 1159641, 998580, 2418604, 1471026, -1523103, 73014, - 1182727, -1055488, 3435437, 1235340, 1796907, 503585, 156766, -23622, 91268, 1597191, - -1224603, 1088774, -1428614, -2207613, 503585, -372052, 377957, -468688, 1745904, -228170, - -578747, 2248416, 156229, -8053, -358093, 396748, - }, - { - -319975, 5053566, -1145683, 6100464, 1882269, 550293, -212601, -2705830, 6053757, -1173063, - 4747013, 804233, 2586107, 9740986, 48348984, 42000484, 2048163, 10278394, 7437810, -15433428, - -4773856, 12999255, 22180284, -11921219, -12042015, -7844758, -2651069, -5324149, 11723650, 10171556, - -3951907, -4772783, 2092186, 6089190, -6307697, -489626, -2694555, -148176, -2262911, 85362, - -9127, 1649804, -5985574, 1906429, 3164317, -4338991, 1615445, 2297808, 1356673, -1290638, - -1963874, -2492692, -69256, 2376728, 476205, -256087, 970663, 2523830, 6380174, -755377, - -85899, -847719, -1025423, 2082522, -1467805, -659278, -3029563, -635655, 878858, 1648194, - -2484639, -1480153, 937377, -502511, 869731, -259309, 1633698, -1722819, -287226, -860604, - 209380, 1068910, 287226, 1068910, -1258962, -1318555, 1925219, -1501628, 765041, 2798171, - -840203, 627065, -257161, -762894, 851477, -853625, - }, - { - 34224448, -402438432, -7570417, -22028888, -19703700, 5527623, -5826660, 8591545, -61740, -6102612, - -9154723, -6177774, -10000294, 19183472, 4323959, -11729556, -6727530, 23877334, -6138045, -2099165, - -1807644, -5223217, -3293703, -2913599, 2178622, -1806571, 294742, 82141, 2091112, 4459787, - 5788006, -3410204, 3309809, 5833640, 3410741, 10162966, -5930276, 3627100, 799938, -839129, - -860067, 4131222, -94489, -2556579, 2130304, 6555194, 5267241, -2323577, -857383, 956167, - -9337259, 6821482, -205085, -3312494, -2862596, -7892540, 824097, 1513976, 4935455, 5355824, - 3868692, -3219615, 129923, -2956011, -1469416, 962073, -1813550, 724776, 1368484, 2333241, - -3142842, 1709397, -1295470, 503585, 1193464, 47245, -471373, -485868, -121333, 1249836, - -879931, -1008244, 871342, 287226, 1309428, 935766, -1360431, 373662, 910533, -363462, - -109522, -1392643, -839129, -860067, -437550, 334471, - }, - { - -1137093, 462783, -8287140, -2235531, 1086090, -740345, 459025, -1924145, 120259, 1263794, - -3584150, 1203128, 5587753, 15146739, -37127308, -396211, 10944114, 18895708, -24641302, 280247, - 1470489, -12248173, -2707440, 7558069, -32755568, -6077916, -8310225, -4700842, -3739306, 17119202, - -5486821, 12056510, 7006166, -5074504, -6833830, 10493142, 4480188, -5016522, 2172717, 6068252, - -5756330, 165356, 2693481, -3382824, 3251290, -56371, -100395, 3242700, 4970351, 4227322, - -1236951, 3627637, -1786706, 2305861, 3511673, 3609383, -4796405, 843961, -2695629, 4584878, - -2345589, 4206921, -2775086, 2019708, 549756, -354335, 1031329, 811212, 1537598, -2696166, - 1149978, 1689533, -1148904, 1178969, 404801, -1752347, 2196339, -1937567, -624918, 558346, - -439160, 981400, 1321776, -780610, -1527935, 627602, 689879, -33286, -366146, 1364726, - -1781875, -472983, 1328756, -744103, 518617, 186294, - }, - { - 6179384, -260080128, 16902844, 2930778, -25273198, -19360638, -956167, 5343476, 6026376, -5240397, - -7749732, -5337034, -5131412, -6189585, 6012954, 30380988, 16909286, 2078764, 7035694, 7521562, - -15337328, -5142150, 4922570, -2011118, -10555956, 9986336, -10830297, -6861747, -15781857, -311385, - 6419366, 4436701, -3690988, 11741904, -2639794, -5277978, 10274636, -5359046, -2792803, -2887829, - 14363444, -5373004, 8511015, -3735011, 7022809, -10089952, -1501091, 2948495, 1658394, 259846, - 2610266, -2414309, -2161442, -4977330, -953483, 1085553, -4151086, 2922725, 1976222, 1619740, - 94489, -5564667, -151934, 2299418, -68183, 96637, 193810, -922344, -1628330, 16106, - 1340567, -1727114, -358093, 2541010, -1914482, 136365, -1531156, -1813013, -937914, 1458678, - -581431, -443992, -582505, -1523640, -2023467, -2115272, 563178, 1275605, -98784, 1481227, - -1303523, 745177, -617402, 223338, -702227, 1675037, - }, - { - -2336999, 53791244, 11376295, 1581622, -2857227, -792421, -8495445, -1511292, 7205345, 10373957, - -10849087, -939524, 10756209, 9453760, 27791122, 3073049, 22469658, -4916127, -6529424, -8811662, - 5076115, -1225139, 9375914, -1387274, 13390097, -1704565, -5021354, -11088532, 1833951, 9859634, - -1343788, -4101157, 821413, 666257, -13331578, 1192927, 5225365, -4783520, 2953864, -869194, - -681289, 2278480, -5094905, -6187974, -1097364, 3484829, -5249524, -5806259, 7252053, 9571335, - 727460, -1987496, 4759361, 1249299, 78920, -3374234, 1964948, -1728188, 3299072, -1072131, - 2795487, 662499, -5278515, -1313186, -1194538, -391379, 1976759, 603980, 507880, 1692754, - 1242856, -175020, 3450469, 1504849, -816581, 1132798, 1353452, -67109, 690416, -1239098, - -358093, 654446, 783832, -2170032, 834834, -2360622, 729608, -38655, 1904818, -448287, - -1088237, 499827, 150324, -197569, 333934, -147103, - }, - { - -49341120, -131461968, -3267396, -17966386, -495532, 16640314, -19399830, 16634945, 3510062, -105764, - 12338367, -7996156, -5884105, 11437498, 2845953, -1704565, 6706055, -9339406, 9233106, -1625645, - -8377871, 3005940, 12578885, 1108638, -17377974, -1910724, -324270, 2188823, 2715493, 4135517, - -966368, -3087545, 6031208, 578210, 903554, 28849832, -5540508, -6279779, -2765959, 1961190, - -6408628, 7262253, -12457016, 2743947, -915365, -689342, -1702418, -5763846, -758599, 6059662, - 2162516, 182536, -4881767, 2705293, 5626944, -2885681, 4045322, 2254321, 4929549, -1467805, - -2108829, -1175747, -263604, -316754, 941135, 2285996, -2899640, 1099512, 640487, 3153043, - 1168231, -260919, 583579, -646929, -821413, 959388, 645319, 339839, 248571, -1416266, - 825171, 109522, 217433, 748398, -2192044, -385473, -2073396, -705985, -1226213, -1228361, - 488553, -1367947, 601832, -44023, 560493, 300648, - }, - { - 2156611, 31230318, -13121662, -4676146, 12425340, -10836739, -1781338, 207232, 3951370, -5222144, - -1136556, 2668249, -17069274, 2239826, -55645596, -18772766, -12924630, 7191386, 8335995, 14542759, - 1036161, 24956444, 27050778, -2611340, -22478786, 12212740, 12130598, -3595961, 6365679, 5581310, - -1750736, 3370476, 24910274, -3215320, -3612068, 4835060, 2136209, 3585224, -6026913, 950262, - -5883032, 4629975, -163746, 6466074, -2666638, -7313793, 5720897, -3486440, 270046, -6256694, - 1403381, 3008625, 1233729, -7544647, -922881, -2017024, 4567698, 98784, -997506, 1773285, - -3084860, -962073, -3024194, -1380832, 1587527, 101469, 5676336, -725313, -2262911, -2106682, - -4778151, 2296734, -1401233, -99858, -1221381, -1731946, 1421097, -1976759, -58519, 401043, - 1102733, -675921, 560493, 591632, -1530619, 775242, -2144799, -396211, 162672, 157303, - 350577, 40265, 519154, 22012, 841277, 95563, - }, - { - -30063698, 70062728, 8879845, -14611479, -1807108, 11261941, 3138547, -7429757, -2687039, -4919348, - 6934762, -9578314, -7231651, -13587666, 14804215, -2133525, 5976984, 18575196, -7612830, -231928, - 1897839, -4161287, 7786239, 6298033, 13129178, -15008763, 7854959, -303869, 6116034, -707059, - 2983392, 1096290, 5015448, 2258079, -1409823, 2868501, -5794985, -2815351, -1855426, -8850317, - 11432129, -4130685, -11684995, 3504693, -3136400, 6582575, -5502927, -10231149, -6154688, 2179696, - 6127308, 3905736, -8274792, -7927436, 2314987, 2692945, 2291902, 3870839, -2339684, 1963874, - -1873680, -2810519, 835908, 1849520, 3542811, -1330366, -1939178, 1771137, 523449, -1247151, - 3425773, -1783485, -978179, 62277, -1442572, -537945, 1916629, 567473, -344134, 227633, - -1246077, -912144, -823560, -536871, 168041, 826781, 1996623, -66035, 62814, 726386, - 377420, 1025960, 188442, -962610, 661962, -264141, - }, - { - 5633924, -39715024, -13023415, -1726577, -3303904, -6797860, -16530792, -5440650, -1376000, 5852967, - 6934225, -7082401, -12375411, -8485782, 32995550, 8604430, -16927540, -5215701, 5491116, -34569656, - -11136850, 16818018, -15632070, -16857746, -12417287, -12846247, -12278775, -12688407, 29454348, -2206003, - 2040646, 6191732, -3841312, -3102040, 8945880, -5839545, 3522947, 10058277, -2191507, -5244155, - -52613, -11584601, 948651, -7284265, 2237141, 1379221, -1428077, 6123013, -3203509, 5248987, - 4232154, 2383707, 3639448, -2387465, -4099010, 1515050, -6008659, -267899, 1635846, -771484, - -2078227, -1056562, -672162, -1176821, -920734, -1270237, 3625489, -4740034, 5792301, 1505923, - -2616172, 911607, 2264522, -601832, -1957968, 442919, -503048, -4187593, 1139240, 1748589, - 202937, 332323, 995359, -1129040, 2121714, -379568, 413927, 1186485, 684510, 614180, - 394063, -41339, -53150, 1059783, 89121, 399432, - }, - }, - { - { - -12553116, -208790704, 37478420, -35157528, -2566780, 4525822, 1018444, -11977590, 1142461, -12719546, - -24044838, -3308736, 5371931, 9185861, 5245766, -15751256, 4249870, -8460012, -5345624, -10068477, - 2266669, -2770254, -3156264, 2170032, 11659762, 6471979, 10496900, -9503152, -6102612, 7821136, - -7749195, 3539053, 4782446, -2360085, 377957, 1831267, 2358474, 4297652, 1867774, 4138201, - -434329, -377957, 597000, 189515, -8164733, -2668249, -949725, -352724, 329639, -1654099, - -4514011, -1934346, -135291, 1853278, 1707786, 1356136, -2738579, -1474784, -2084133, -3949223, - -2286533, 159988, 1869921, 53150, -4645007, -2580202, -2647847, -1724966, 1250909, 334471, - -32749, 364535, -328565, -1038308, -187905, 951872, -1397475, -760209, -11274, -807991, - -658204, -896574, -266288, 1183264, 814970, -558346, 314069, 583579, -574452, 221728, - -201863, -35970, 191126, -45097, -4832, 201327, - }, - { - 992674, 60130, 4272956, 11812234, 967441, 17180, -3464428, -7515656, 1147830, -12773770, - -8590, 2947958, 2136746, 7835631, 16975858, 23482734, -3140158, -9346923, -2245194, 15893526, - -7598871, 16557636, 3745212, -12214350, -22549, -10188199, 588411, -9775882, 6742562, 3367254, - 4811437, 2048699, 10407243, 1025960, -3326452, -4878546, 27380, 6125160, 3583077, 3668976, - 1221918, 1882269, -2923799, 855772, -1970316, 1567663, 2722473, 4440460, 1571421, -2973191, - 3671123, 2841121, 1775969, -2258079, 5867999, 4815732, -515933, -2119030, -2720325, -1539746, - -1013612, 1447941, 3028489, 93416, -1199907, -200790, -261993, -1444720, -370978, -3749507, - 1763621, -40265, 345745, 66035, -80531, -1536525, 284542, -10201, 44023, 462783, - -187905, 104690, 1100585, 827318, -746251, -1333587, -294205, 498753, -207769, -766652, - 397821, 309775, -584116, -569620, 540092, 410706, - }, - { - -2066953, -36008468, 8871792, 13043279, 11221676, 2458869, 1584306, -782758, -4199405, 2643552, - 7844758, 6976638, -8412767, -398895, 8961449, 11682848, 753230, -11358578, 6432251, 2913599, - 4699768, -2667175, 606664, 2769717, -4514548, -13597330, 7848516, -1118839, -3441343, -6227703, - -1291175, -6280853, 813896, -1622961, 6500970, 5003100, 2472828, -5938866, -1930051, -1268089, - 3703336, 2098092, -2799245, -2265059, -991064, 403190, -2356327, -2926483, -2182917, 330176, - -1116692, -2601140, -1658394, 515933, 1668058, -656056, 1894618, -1668595, 1748052, 2966212, - -526670, -1904818, -2085207, -1461900, 1277753, -736587, -679679, 10201, 1216013, 402653, - -113817, 217970, -1437203, 457414, 120796, -1015223, -1273458, 1292785, 465467, 1950452, - 664109, 294205, -424665, 126165, 903554, -217433, 95563, 185757, 590021, -262530, - -180926, -1093069, 19864, 1305670, 662499, 112206, - }, - { - -18137110, 238458736, 37935836, -10608032, -15128485, 3278134, 7624641, 2725694, -3204583, -3420405, - 16661789, -12981002, -3139621, -7056095, 8841727, -3320547, -262530, 26811334, -9481140, 50466, - -5055177, -3572876, -8240969, 553514, 2277407, 9861245, 1504849, 8004746, -1002338, 1917703, - 2886218, 1602560, 3036005, 375810, -115427, 633508, -2517925, -5685463, 3804267, -1924682, - -513249, 2780991, -2822331, -2643016, 3098282, -3943854, 2390686, 3563212, 3217468, 4452808, - -1904818, -603980, -1884954, 2736968, -317291, -4185446, -667867, -3693672, 1005022, -387084, - 1415729, 451508, -3230352, 1080184, 1613834, 1517197, 310848, -2162516, 1210107, 2715493, - -151398, 3054259, 1101122, -1651952, 459025, 979789, 1298154, -79994, -383326, 122407, - -154082, -579284, -987306, 491237, 579821, 566399, -75699, -364535, -655519, 349503, - -178241, -918049, 501437, -12348, -199716, 134218, - }, - { - -1939715, 14103062, 14862734, -5101885, -1774358, 1216550, 471910, -1917166, -13422, -2299955, - 4905390, -10352482, -4846871, -16275779, -22820234, -10222022, 34934728, 6817724, -27783606, 13979582, - 6400575, -8792872, -6382859, -3236258, 2557653, 9911174, 18026514, -3134789, 1963337, 2908230, - -5005785, 1751810, 1429150, 2275259, -6517613, -2418067, -3448859, 243739, 1395328, -4841502, - -317291, 4594542, -4040491, -5248450, 2214593, -1352378, 261456, 146566, 160524, 2378338, - -2167885, -1306744, -1066226, -648003, 1262184, 2939905, -278099, 467615, -2049236, 4488241, - -3514357, 762894, 2421288, -771484, -1713692, -1677185, 2252710, 1636383, -1036698, 804233, - -900869, -880468, 536334, -221728, -1840930, 818728, -2362769, 386547, -1463510, 1192927, - -107374, 663572, -157840, -18790, 767725, 913217, -53687, 523449, -348429, -671626, - 255014, 271120, 513785, -41339, -867583, -558883, - }, - { - -20638928, 313888544, 33945276, 63683628, -2433636, 6238977, 5430986, -27605366, 3327526, -154619, - -16006269, -2063195, 12692165, -14079977, -9160092, 9247065, 3303367, 7692287, 1298691, -3335579, - -13038984, 6139119, -4476967, 1131187, -5304822, 6702297, 4244502, 2563559, 9019968, -8266202, - -8442832, 1144609, 838056, 93416, 2063732, 2251100, -1618129, -5284958, -2858838, 5972152, - 4235912, 8352638, -3925063, -158914, -207769, 2938831, 6817187, -1343788, 1047435, 345745, - 2202245, 1552094, 3572876, 2816962, -4305705, 3790309, -3308736, -1400159, -3908420, -561030, - -1671279, -764504, 2316061, -901406, 1202054, 3089155, 1489280, 1323924, -271657, -694174, - 215285, 562641, -194884, 3826279, 829466, 856846, 427349, 93952, 997506, 541166, - 10201, -299037, -1327682, -470299, -410706, 174483, -365072, -172872, 1444183, 439697, - -624918, 1464584, 485868, -26307, 221191, 118648, - }, - { - -267362, -2938295, 2433099, 5599564, 1013075, 331249, -249108, -69256, 2433636, 2778307, - 5539971, -1070521, 5878200, 18644990, 44527000, 30292942, 16497506, 12485470, 3539053, -899796, - -8040179, 10143639, 30536680, -35633196, 317291, -11863237, 7123204, 2320893, 9482751, -5876052, - 284542, -8633421, 8697846, 7759396, -11179263, -1231045, 1562294, -4678830, -573915, -1284195, - 404264, 755377, -3485366, 2337536, 1480690, -1351841, 452582, 4007205, -2849174, -2685428, - -504659, -1551020, -4019553, 2394444, 552440, 994285, -373125, 2699924, 3647501, 561567, - -880468, 1078037, -538482, 1440962, -371515, 438624, -2920041, -16643, -625455, -287763, - -740882, -844498, 802622, -1867774, 1081795, 191663, 1662689, -1746441, -987843, -253403, - 223875, 1627793, 476741, -361314, -597000, -548145, 284542, -503585, 1569274, 877784, - 162135, 526134, -36507, -697395, -30065, -282931, - }, - { - -53262428, -318823488, 26640072, -50450832, 6956774, 341450, 4694936, 453119, 597000, -2645700, - -20073066, -8389145, 13949517, 8729521, 3677566, -16403554, 12004434, -813359, 4405026, 1235877, - -2559801, -4029216, -4473209, -6855305, 4245039, 250719, 537, -6291054, 4189204, 4284767, - 5006858, 34897, 2798708, 4412542, 2264522, 4380330, -682900, -506269, 484258, 1051730, - 119185, 102005, 488016, 2951180, 500901, 2029909, 5645735, 1953136, 61203, -1913945, - -3580392, -392453, 1165547, -1856500, -2623151, -4111358, -4152697, 1311039, 3389803, 6891275, - 3637301, -1298154, 249108, -3047816, 633508, 318901, -3147674, 1540283, 846109, 23085, - -410169, -409096, 102005, -965294, 1190243, -271657, 425202, -1708860, 562104, 1698123, - -387084, 50466, -59593, 15569, 1198833, 145492, -839129, 689879, -448824, -200790, - -611496, -498753, -938987, -933619, 395674, 479963, - }, - { - 78383, -9289477, -3238942, 879395, -5153424, 1065689, 56371, -630823, -1594507, -104153, - 1306207, -774705, -777926, -3412352, -15834471, 9164386, 6551436, 23215372, -18973554, 16385300, - -31343598, 1532767, 8267812, -28958816, -17588428, -3714073, -4929549, -3235184, 1040993, -3617436, - 8562017, 10196252, 446140, -1183264, 2572686, -722628, 8745090, -2822331, 6885370, 395674, - -5532455, -1256278, 4768488, -4307316, -2057826, 1862942, 369367, 5131412, 4083977, 3561602, - -2565169, 2755222, 1651415, 2490007, 1555315, 3734474, -1851131, -3708168, 184147, 1633161, - 430034, 1658394, -1214939, 1360968, 1895154, -1676111, 2530273, 973347, 187905, -752693, - -211527, 2299955, -108448, 294205, 311385, 532039, 261993, -1426466, 67646, -281857, - -1372779, 1714229, 1339493, -91805, -2012729, 658741, -554588, 840740, -227633, 235149, - -165356, -596464, 497679, 479426, 127775, -255551, - }, - { - -7980586, -249264336, 52805548, -15015206, -17092360, -1814087, -13305809, -12097312, 11537893, -7460358, - -6231461, -12534325, -18434000, -2377265, 22049826, 15079630, 23779624, -2823941, 2849174, 7491497, - -4051228, -11018202, 3722126, 834834, -2239289, -2426120, -8109972, -1212255, -13462038, -5590437, - 4647155, 7015292, 122407, 7855495, -10496363, -672162, 2595234, 2220498, -844498, 3467649, - 1222992, -2610266, 8494372, 2120640, -2341294, -7044283, 2439005, 745714, -423054, 5049808, - -4479651, -438624, -1511829, -3188476, 312459, -2661806, 146566, 902480, 1857037, 1229971, - 120796, -4795868, 1584843, 108448, -308701, 1810866, -1158567, 1177358, -2374043, -632434, - 499827, -1104344, -911607, 2369748, -513249, -1208496, -102005, -1734630, -804770, 814433, - -408559, 5906, -1465658, -323196, -3013993, -897111, -1034550, 825171, 563178, -124017, - 51540, 48318, 303332, 891206, 155156, 174483, - }, - { - 1620276, 49974092, 11053635, 434865, -2048163, -5582384, -10679436, 520765, 14244259, -1292785, - -2987150, -6667937, 6893423, 16716013, 18031884, 5829345, 14718316, 7707856, -12977244, -9614821, - 15118285, 634581, 3736622, 839129, 8303246, -11441256, 2101313, -4894652, 7452305, -1024350, - 4543002, -6966974, -909996, 2507187, -8843875, -6340446, 6544457, 1249836, 659814, -3924526, - 3353296, -3751117, -3971771, -5801427, 393526, 3278134, -5395553, -2964064, 2705830, 6231998, - 3406983, 1382980, 1116155, 4359392, -4005057, -2025077, 3937948, -865973, 1061394, 1707786, - 1304060, -1518271, -2728378, 255551, -1851131, 160524, 434865, -194347, 836445, 1264868, - 1653026, 1025960, 469225, 1719598, -768262, 2033130, 599685, 670015, 689879, -420907, - -1685238, 1912334, -263604, -867047, -336618, -76236, -424665, 1178432, -3758, 73014, - -544924, 1264331, -721018, 25770, 259846, -950798, - }, - { - 19436338, -190676688, -32729798, -12509629, -1629940, -17169668, 9876814, 5900748, -3410204, 13279502, - 7647726, -6849936, -6490770, 7043747, 4177393, 1002875, 7800198, -9762998, 2429878, 1166621, - 1582159, -2265595, 3837017, 2435247, -6430640, -7379291, 3072512, -4532801, 1401770, 6769406, - 1018981, -1625108, 5947993, -995896, 11143830, 10188199, 2825552, -6395743, 4323422, -5606006, - 1577864, -12885, -6067715, -3175592, -1601486, -7336341, 3022583, 448824, -2288681, 1228361, - -1500554, 2529199, -1335198, 2290291, 4802311, -2793876, 2776696, 4020626, 771484, 3197066, - -1533303, -1670742, -930934, -652835, 507343, 655519, -714038, 140660, 1319092, 802085, - 1439351, 342524, 1646583, 88584, 239981, -43487, 664646, 846645, -1009317, -1082332, - 157303, 1040456, 413927, -955630, -1122597, -1082332, -919660, -2048163, -1147830, 422517, - -1246077, -950262, 474594, 369367, -113280, -179852, - }, - { - -2773475, -119185, 22829898, -2851322, 3524558, -1863479, -6980933, 2429878, -2440615, -4775467, - 1229971, 2108829, 2611340, -16394427, -54278188, -42805792, 13769128, -9395241, 4555350, 15298674, - 18110804, 26306674, -11258720, -3767760, 562104, -137976, 7948911, 6091874, 11312407, 5949604, - -13362717, 17655000, 10186589, 284542, -3332358, -1899449, 9336722, 2020782, -9921911, -2313377, - 1302986, 5306969, 4134980, 2410014, -4268124, 264141, -645856, -2613488, -3444564, -349503, - 298500, -2539936, -2018635, -2840584, -2264522, -1819456, -231391, 1120987, 944893, -1187022, - 438624, -1358283, -1861332, -2217277, 140123, 1567663, 1411971, 1597191, -3221, -5359583, - -46171, -890132, 413927, -1318018, -1043140, -640487, -1062468, -1014149, -20938, 490163, - 250182, -130997, 1352915, 568009, -1292248, -505196, -770410, -103079, -854699, 1006096, - 317291, 791885, -49392, 168577, 661425, -362388, - }, - { - 33940444, -1020592, -4149475, -18380850, 32749, -7799124, 21164526, -3828963, 619549, -4628901, - 6287832, -8831527, -3453691, 4025995, 2190433, -1844689, 12519830, 7827578, -2436320, 8499203, - -3052111, -3955665, -168041, 12954158, -2408403, -4294968, 1963337, 3558381, 692564, -5267241, - 7896298, 4090956, 1508607, 1793149, 3747359, 182536, -4906464, -3189550, 1183800, -5440650, - 8891119, -12525198, -5839545, 2461016, -1056562, 4510253, -1672353, -9050033, -1310502, 965294, - 6027450, -2525978, -5516886, -5208185, 325881, 1483911, 2072322, 1666984, 1663763, 1228898, - -4560182, -526670, -434865, 2495376, 1422708, 346282, -1323924, 2005750, -1256278, 1689533, - 1925756, -1827509, 950262, -1421634, -1527398, -787053, 2918430, 295816, 1503775, -875100, - -1845225, -1250909, 1120450, -190589, -158377, 953483, 1120987, 208306, -179852, 162672, - 1153199, 941135, 41876, -202937, 148176, -63351, - }, - { - -4719096, -47445968, 8315594, -245350, -11748346, -2573759, -12437152, -8614094, -3421478, 6671158, - 6999723, -11558831, -9269076, 20308752, 2969433, -11450920, 3754338, -6514392, -4649839, -6924024, - -29699162, 4494147, -9678172, -6643241, -13293461, -19243064, -12670154, -9706626, 20855824, 16567836, - -6794639, -1872606, -1795833, -782221, 6532646, 2168422, 212064, 4407174, 1838783, -6902550, - -4732517, -8468602, -777389, -6982543, 3713536, -3372623, 6377490, 3453691, 1164473, 852551, - 6255083, 3578782, 845572, 880468, -3342558, -542777, -4471598, -3001645, 1255741, -2992519, - -2312840, 704912, -364535, -2218888, -1782411, -51540, 111669, 1038845, 883690, 2816962, - -1233193, 914291, 2684, 1079111, -1874216, 312459, -1455457, -2536178, 255551, 1080721, - 507343, 380641, 2149094, 158377, 643708, -1400696, 1087164, 103616, 891206, 912681, - 591632, 22549, 580894, -17717, 513785, 1069447, - }, - }, - { - { - 10545218, -155981936, 75513576, -12360916, 7130720, -615254, -1094680, -10591926, 10537165, -290447, - -12252468, 9058623, 6774237, -10770704, -146029, -5066451, 13489419, 1794223, 7774965, -4999879, - 549756, -5023501, -1622961, -1340030, -1210644, -1345399, 10766409, -8472360, -8091719, 10752451, - -5057324, -1461363, 2914672, -129386, 1559610, 33823, -731755, 3469797, 1778653, -1559073, - -2860985, 1647657, -1856500, -1971927, -4929012, -983548, -1350230, 892816, 143345, -1544578, - 15032, 1231582, -506806, 938450, -582505, 2478733, 1242319, 2447058, -725850, -975494, - 1899986, 13422, -485331, 1405528, -1696512, -141734, -15569, -1232656, -377420, -1117765, - -391379, 169114, 1869921, 1399623, 592169, 819802, -1640678, -982474, 230318, 30065, - 956704, -968515, -1087701, 115427, 348966, 253940, 643171, 1300301, 164283, 13422, - -38118, 490700, 384400, -118648, 27380, 183610, - }, - { - 118112, -8247948, -1217623, 2380486, -6412923, 2253247, -1270774, -2952253, 5929203, -250182, - 7636452, -373125, -885837, 4700305, 6040335, 9159018, -4822175, -4017942, -17577690, 6930467, - -10742250, 3524021, 4057670, 4046396, 11113228, -10601590, 8508867, -3698504, 4184372, -4656282, - 3524021, 2871186, 737124, -3107409, -3214783, 1840394, 2748779, 3921842, 2054068, 2955474, - -2464774, 671089, 110595, 1723893, -3646964, 1846299, 232465, 978716, -332323, -1761474, - 3010235, 1328756, 2041720, -2216203, 2904472, -692564, -330176, 85899, -1937030, 913754, - -594316, -56908, 62814, -667331, -818191, 1239098, 1720134, -2294050, -35433, -2388002, - 1796907, -521839, -598611, -659278, 91805, -884763, 445066, 345745, -152471, -686121, - 166967, 865436, 916976, 367757, -382789, -522375, -322659, -327491, -315143, -580894, - 805306, 150324, -156766, -98784, -91268, 51540, - }, - { - 1779190, -26209502, 4473746, -10884521, 2263448, 1927904, -983011, 1106491, -3179350, -3317862, - 4395899, 4737886, -8992588, 1243930, 5902896, 14096620, -3022046, -8313446, 4771709, -7257958, - 3906273, 1268626, 2215130, 3238942, 806917, -11484206, 8938364, -921807, 2339684, 426812, - -474594, -2604361, 6519224, -4199941, 947577, 2167885, 6061810, -3045132, 2852932, 3305514, - 2080375, -504659, -520228, -506269, 1688996, 4025995, -147103, 909459, 691490, 729071, - 1376000, -658204, 351650, 966368, 756451, -468688, 1589138, -2851858, -783295, 483184, - 515933, 22549, -793495, -634045, 641561, -579284, -226560, -875636, -295816, 710817, - 574989, 503585, -1509681, 271120, 28991, 311922, -26307, 1555315, -245350, -272194, - -1152125, 297427, -470299, -457414, 801548, -581431, -51003, -176094, 617938, -555661, - 4295, -839666, -411243, 352724, -413391, 614717, - }, - { - -6052146, 169877232, -38933880, 5683316, 4571456, -2968896, 6049462, 3247532, -2388539, -11405823, - 8222178, -6263673, 4543539, -5217312, -2469606, -7353521, -4263829, 13553843, -15525770, 510027, - -1523103, 1537598, -4188130, 2819109, -5933498, 725313, 167504, 7170985, 92342, -2926483, - 304943, -115964, -705985, 876710, 1808718, 351650, 46708, -2701535, 5139465, -4174708, - -970126, 3760781, -883153, -3870839, 846109, -964220, 973347, 648003, -1939715, 2433099, - -2412161, -3286187, -648003, 2945274, 641024, -1647657, 75162, -2774012, 1568737, -2036888, - 1209570, -423591, -3175592, 2510945, 588411, 608275, -56908, -3701188, -1015223, 399969, - -2339147, 588411, 723702, -1300838, 80531, -133681, 269509, -166967, 236223, 777926, - 492311, 356482, -534187, -104153, -203474, 198642, 552977, 250182, -303332, 785979, - 213675, -712428, 589484, 469762, 86436, 348966, - }, - { - 2062121, -2738579, -2964601, -588947, 801011, 421444, 1178432, 274878, 1450625, 242666, - 4327717, -8029442, 5872294, -1685238, -15338402, -21323976, 13375065, 23079544, -22565222, -2388539, - 4212289, 676457, 7994545, -1006633, -3786014, -19138374, 1106491, 1111860, -1066763, 325881, - -10872710, -4373888, -2590939, -2298881, -5054640, 237297, -2072859, 4980552, 3450469, -5707475, - -1091995, 4915053, -1798518, 49929, 1529545, -3836480, 69256, 674310, -3077881, 1870995, - 511638, -259846, -1548873, -1648194, 1898376, 2617783, -149787, 1761474, -3465502, 750546, - -4343823, -89121, 443455, -2041183, -819265, -1455994, -391916, 182536, -418222, 2959769, - 46171, -928787, 602369, 377420, -274878, 1819456, -2068564, 742493, -1095217, 461172, - -629750, 394063, -334471, -113280, 314069, 539555, -286689, 368293, 217970, -461709, - 129386, 245887, 51540, -293132, -241055, 204548, - }, - { - -14027363, 241383072, -22168474, 64337536, -7602092, 499827, 9688372, -19005768, 2698313, 6689412, - -5450851, -6900402, 6554120, -621160, -3900367, 8476655, 345208, 1954747, -1454383, 2480344, - -1755031, 6737730, -2854006, 5959804, -4253092, 406411, -2582349, -4378183, 7570954, -451508, - -2669859, 2731062, -377420, -4387309, -2617783, -767189, 2463701, 1513439, -56371, 4812511, - 1135482, 3542811, -2814277, 87510, -2302103, 3227668, 4699231, -5747740, -877784, 1254131, - -271120, -630286, 1843078, 2352568, -4375498, 4032438, -828929, 1417876, -3083250, -2218351, - -2385318, -1034013, -1037772, -2501819, 916439, 1028108, -158914, 891206, 251792, -634045, - -1046898, 625992, -2142652, 1775969, -550830, 596464, 644782, -469762, 347892, -464930, - -537945, 202937, 302258, 682900, 173946, 831076, -83752, -223338, 281857, 384936, - -689342, 494458, 188979, -548145, 80531, 299574, - }, - { - 673773, -9727564, -6582038, -518080, -3019362, 559420, -971736, -89121, 1438814, -152471, - 303869, -2594697, 3325379, 9143985, 25715580, -12046846, -12725988, 4318590, 6919729, 5946919, - -12863964, 904091, 27895812, -29766270, 3418794, 698469, 12881144, -2660732, 504659, -10305237, - 6282464, -6336688, 8821863, 14749455, -1773285, 3549791, 2414309, -481036, 5010616, 1221918, - 930397, 1644436, -538482, 2679523, 41339, 1544578, 987843, 2970507, -2259153, -2598455, - -774705, -1821066, -4105989, 1156957, -1145146, -580894, -921271, -1418950, 644245, 1162862, - -2663417, -192737, -379031, 1632625, 1170379, 1745367, -1431298, 625992, -227633, -343061, - -131533, 837519, 1192390, -1886564, 1573032, 644782, 1665374, -515933, -158914, 461172, - -13422, 369904, -183073, -82141, 19327, -534723, -253940, 4832, 457414, -862215, - 206158, 310848, 89121, 121333, 178241, -93416, - }, - { - 58703076, -180826720, 27219892, -45544908, -555661, 2329483, 1808718, -7089381, -2234457, 3465502, - -8495445, -2462627, 15103252, -1678259, 8413304, -10249403, 532039, -14148696, 2245731, 5559835, - 1724966, -83752, -1697586, -7232188, 2368138, 530965, 1036161, -4961224, 2964601, 1081258, - 816044, -3090229, -2263448, 113280, -1875827, 402116, -3397856, -2850785, 717796, 2483565, - -1542967, -4020626, 1415192, 1672353, 620086, 776315, -27917, 763967, 3099356, 1223529, - 3301756, -742493, -1561221, 608812, 2543695, 1492501, -325344, 268435, -411243, 4441533, - 359704, -1309428, 2464238, -1246077, 807991, 1024350, -981400, 226560, -1190243, 175020, - -391916, -795643, 1373316, -2684, 843424, -649614, 823023, -1141924, 793495, 1028645, - -192200, 964220, -46708, -637803, -631360, -848256, 405338, 672699, -595390, 466004, - -501437, 229244, 6442, 146566, 442382, -152471, - }, - { - 1020592, 257698, 1773822, 2080912, -2103997, 951872, -599685, -408559, -2249489, 819802, - -246424, -4691715, -2069101, 18110804, 7217693, -8534637, -20876762, 13515725, -16580184, 23155242, - -12582107, 11601780, 7538742, -20091320, 121333, 1729261, 7181186, -290447, -2885681, -6752763, - -1577864, 2713883, -1831267, -5128191, 2295660, -3460133, -517544, -5671505, 3939559, -2374043, - -1284195, -1014149, 5892159, 2537789, 1439351, 3117610, 27380, 2391223, 989453, 1057099, - -2003602, 2108292, 611496, 815507, -548145, 1654099, -622770, -2026151, -126165, -2172180, - -1178969, 800475, -910533, 782758, 1106491, -1032940, 2073396, -545998, 104690, 157303, - -1709934, 166967, -1606855, -184147, 1246077, 1256278, 39192, -884226, -15032, 427886, - -1076963, -6442, 170725, 674847, -1488206, 671626, -731755, 239444, -560493, -163209, - 608275, 38655, -537, 173409, 2684, -113280, - }, - { - 8958765, -195767296, 67240400, -7154342, 8884677, 9517648, -13260175, -5625334, 14176613, -2603824, - -3127273, -4548371, -6240051, 1917166, 10834592, -6686727, 11885248, -2804077, -2725157, -920734, - 2221572, -6174016, 6827925, -4430796, -7225746, 1949915, 1791001, 4027069, -7392176, -32749, - 1068373, 1906966, -1865090, 6559489, -7351911, -2552821, -916976, 1998770, -2285996, 4475356, - -2721399, -6097780, 4213900, -2171106, -755377, 1807644, 4171487, -1382443, -554051, 3634616, - -2991445, 4042638, 140660, -1612223, 1758252, 521302, 1732482, -672699, 1669669, 782758, - 2770791, -1029182, 906238, -1496796, -591632, 310848, -1357210, 1728188, -2368675, -700080, - -420370, -723702, -297963, 1423245, 374199, -197569, 1041530, -356482, -1032403, -170188, - -710817, 668941, -1115081, 455267, -1212791, 395674, -1013075, 574989, 41339, -861141, - 267362, -232465, 717260, 862215, -57982, -204011, - }, - { - -825707, 29634738, -2203855, -1780264, -2728915, -2745021, -7344394, -4093104, 5614596, -4243965, - 7079717, -3462281, 2830920, 3955128, -6732361, -11547556, -3694209, 9098351, 1511292, -6825240, - 8223252, 2508798, -1201517, -7135015, 4277788, -7104950, 8741869, 335544, 1575716, -10945187, - 8063801, -1751273, 1389959, 2756832, -2961917, -6163815, 2893734, 2836826, -401579, -2342368, - -1024887, -4115653, 1732482, -5291937, 2167885, 3076270, -3088618, 803159, -1289027, 367757, - 228170, 192737, -2484639, 1917166, -1701881, -719407, 1941325, -1026497, -1140314, 405338, - 2798171, 151934, -1248225, 680752, 1181653, 1801739, -1903207, -2276333, -306016, -527207, - -607738, -671089, -1028645, 1052804, -1282585, 1159104, 120259, 992674, 1145146, 763967, - -1041530, 1789391, -268435, -759136, -368293, 404264, -361851, 618475, -808528, 366146, - -159988, 1094680, -357556, 252329, 226023, -688269, - }, - { - 18522584, -172627088, -22141630, -13656385, -2644626, -28275918, 1275605, -1071058, -7378217, 5551782, - 3700651, -2148021, -4745939, 430034, 2282238, 3147674, 10217190, -4602058, -3977140, -6963753, - 5181341, -397284, -1308891, -2221035, 2992519, 171262, 5469104, -1683627, -157840, 3165928, - 1496796, 3843996, 5666136, -6176163, 1675574, 84826, 1513439, -2951180, 5760625, -4544076, - 1993939, -1221918, -2792266, -4393752, 3253975, -3394635, 1602023, 1112397, -1337882, -2809982, - -2787434, 2224256, -382789, 833761, 2954938, -2698850, 973347, 2253247, -1983201, 1378685, - -244276, 834297, 281857, 503048, -133144, 387084, -819802, -2139431, 951335, -625455, - -459025, -229781, 2015950, 747861, 493921, -810675, -144418, 300648, -576063, -284005, - -75162, 1046898, 67109, 294205, 386010, -1018981, 363462, -730144, -903554, 1137630, - 258772, -105227, -32212, 109522, -92342, -365609, - }, - { - 3003793, -17754858, 7194070, 841277, 2689187, -366683, -6491306, 1316944, -3365644, -4626754, - 1636383, 4082903, 2466385, -3495567, -14703284, -22910430, 17204566, -10458245, -10801306, 8185671, - -6252936, -2637647, -19475530, -1203665, 1651415, -12699681, -1286343, -894964, 5278515, 10455024, - -4576825, 17380658, -159451, -1553704, -4392678, -11862700, 1883880, -3419331, -8168491, -356482, - 3940096, 2994666, 1578401, 3200288, -127775, 3693672, -1040993, -3109020, -2146947, 1741072, - 314069, -3905199, -4109210, -466004, 1465658, -53150, -1480690, 395674, 593779, -1516124, - 1989107, 1407139, 1716376, -81604, -1274532, -458488, 221191, 1832877, 1445793, -2386928, - 2087354, -323196, 1449015, -782758, -97174, 303332, 193274, 33286, -1086090, -239981, - 310848, -711891, -327491, -603443, -456877, 342524, -127775, 15569, -891743, 613643, - -99321, 850940, -32212, -521302, -93952, 147640, - }, - { - -23082764, -66606888, -3415036, -20896626, 7028714, -6418292, 24336896, 3877819, 7654169, -5840619, - 14256070, 3636227, -2383170, 4810900, -670552, -6598681, 3079492, 6498286, 1653026, 8814884, - -3542811, -334471, -228170, 8611946, -4499515, 3423626, 3242164, 2349884, 2149631, -8660265, - -921807, -224949, 537408, 1079647, 3138547, -309238, -4010426, -2068564, 4428112, -977642, - 2731599, -11372537, -597537, 3010772, -1044214, 3211562, 2184528, -967441, 1795296, -678068, - 1984275, -1562831, 563714, -3070902, 455803, 14496, -1229434, 49929, -64425, 1330366, - -2546916, 243739, -1242319, -683974, -1259499, 85899, -1142461, 666794, -452582, 507343, - -76236, 476741, 1874216, -1886564, -361314, -380105, 1610613, -1341104, 954557, 76236, - 101469, -341450, 1027034, 417149, 523986, -521839, -698469, -272730, 163209, -106837, - 47245, 25770, 257161, 258235, -177704, -143881, - }, - { - 3925063, -53127136, -2230162, 6480032, -5963562, 8702677, -292058, -4111358, -2412161, 516470, - 3493419, -6514929, 3246995, 11770895, -8290361, -8186208, -2521683, -5560372, 2027761, 17484274, - -16039555, 1664837, -4755066, 1808181, 5808407, 1535451, 4104378, -8534100, 2027761, 10913512, - -6314676, -3595961, 1458678, -1774358, 2295660, 3842385, -1249836, 779000, 5387500, -2527588, - 608275, 1518271, 6473053, -1827509, 310311, -5048197, 6417218, 710817, 1359894, -1019518, - 3793530, 2932389, -2128693, 591632, -1658931, 1274532, -1252520, -1883880, 525060, -2246268, - 31139, 236223, -172872, 1110786, 724776, -796180, -1784022, 1685775, -1410360, 1230508, - -897648, 1222455, -208843, 1319092, -1106491, 209380, -36507, -438624, -363998, 184684, - 10737, -1061394, -278099, -835908, 78383, -1001801, 1066763, -462246, 277562, 249108, - -206158, -702227, 459025, -767189, -90731, 1020592, - }, - }, - { - { - -4719632, -54504208, -7231651, 11147051, -3543885, -832687, -4064113, -3365107, 3572339, -2936684, - 3223910, 7509751, -4373351, -5545877, -5827197, 1436130, 8383240, 7939247, 4271882, 1058710, - -1705639, 1261647, -4570919, -1220308, -5250598, -699543, 4854924, -2978023, -3193308, 2765959, - 2918430, -3417183, 1056025, 1591822, 1090385, 790811, -306016, -180926, 3913789, -804233, - -5130876, 1535988, -2900714, -3507378, -1264868, 711354, -2985002, -16643, -36507, -1467805, - 1458141, 1114544, 365609, -201863, 711891, 564251, 1903744, 1268626, 243203, -351114, - 1850594, 345208, -23085, -200790, 519154, -47245, 741956, -832687, -1301375, -976568, - 251792, 240518, 1534914, 1292785, -70330, 544387, -549756, -521302, 9664, 234613, - 686121, -858457, -927176, 22549, 325344, 153008, 859530, 746251, 725850, 286152, - 50466, 133681, 383863, -26307, 0, -67646, - }, - { - -541166, -1816234, -4041564, -8417599, 2040646, -713501, -421981, 3804804, -806380, 1739462, - 6346351, 1294933, -1249299, 2898029, 7191386, -5485210, 8028905, 782758, -14107357, -13073344, - 2183991, -3726421, 6904697, 4307316, 6602976, -1238024, 3299072, 2219424, -570694, 375273, - -2830920, 4995584, -2605435, -5668283, -779000, 3651259, 2501819, 6217502, 366683, -514859, - 228170, 17180, 2197950, -1281511, -3182034, 3762928, -1707250, 74625, 6979, -306553, - 692027, 1183264, 1995549, -113280, 1252520, -2113661, 250182, 149787, -702764, -783832, - 624918, 563714, -1216013, 80531, -505196, 442919, 1633698, -957241, -985695, 119722, - 192737, -395137, -635655, -827855, -295816, 47245, 130997, 355409, -652835, -1288490, - 1155346, 653372, 412317, -83752, 412854, -440234, -269509, -55835, -358093, 29528, - 81604, -229244, 578747, 41876, -140123, -242666, - }, - { - -721018, 2912525, -14428406, -14440217, 1418950, 2802466, 173409, -2711735, -384936, -1721208, - -1767379, 675384, 1669132, 295816, 6560026, 2171643, 3212636, -6141267, 195421, -2340220, - -622770, -3451006, 9528385, -1543504, 5240934, -4940286, 2728915, 3227131, 1032403, -3014530, - 2674691, 291521, 666257, -2684355, -2337536, 3987340, 5779952, -1664300, 4160213, 3330210, - -514859, -1537598, -423591, 1060857, 1454383, 2052994, 1270774, 1594507, -336618, 945430, - 2210298, 233002, -434865, 1631014, -164819, 1454383, -923955, -2318746, 260919, -958315, - -176631, 1102733, -793495, -80531, -244813, 604517, -613107, -94489, -522912, 224949, - 303332, -785979, -288300, -42413, 271120, 448287, 348429, 847719, -96637, -1352378, - 214212, -92879, -113280, -520228, -146029, -437013, 245350, -259846, 50466, -2147, - -361851, -530428, -280247, 21475, -409633, 301721, - }, - { - 21398064, 89652608, -632971, 6181532, -4305705, -1184337, 2010582, 1195612, 1136019, -8061117, - -1800665, 1510755, 14496, -1264868, -2757369, -6081137, -4612258, 911607, -8025147, 3095598, - -2809982, -1423782, 2087354, 2630668, -5723044, -517544, 469762, 2279017, 2470143, 616865, - -3968013, -834297, -1789928, 1810329, 1750199, 946503, 1138703, -1341640, 2993592, -5317170, - 421981, 3174518, -1198833, -1276142, 39192, 2364916, -2529736, -183073, -3000572, 350577, - 2089502, -3218541, -1222455, 860067, 905164, -1606318, -266288, -996432, 1250372, -1333587, - 1100049, -1619203, 434329, 624918, 420907, 156766, -266288, -2639794, -741956, -672699, - -628139, -1115081, -386547, -33286, -452045, -132070, 154082, -130997, 264677, 555125, - 876710, 57445, -103616, -353798, 449361, -96637, 185757, 397284, -301721, 304943, - 348429, 40265, 102542, 229781, 396211, 297963, - }, - { - -2391223, -9405442, 2617246, 2188286, -385473, -351114, 73551, 2367601, 1730872, -833224, - 1852205, -4312684, 1670742, 1757179, -10053445, -8272644, -8366060, 3413962, 13392782, -11006927, - 2802466, 2121714, 6640557, -3815005, 5638755, -25224342, -8308078, 3063386, 8771934, -12637404, - -1676648, -6623377, -4054986, -670015, -3292093, 448824, 831613, 2696166, 644782, 41339, - -667867, 726386, 1344325, 1646583, 578747, -2633352, -993748, 668404, -2565169, 1487132, - 1187559, -1104880, -1288490, -517544, 1212255, 1254667, 1225139, 684510, -278099, -2619930, - -3268470, -391916, 142808, -1331440, -177704, -1542430, -347892, -721018, 1079647, 2240362, - -972810, -464930, 1212255, -354872, 587874, 612033, 15569, -850404, -3758, -35433, - 31139, 191126, -307090, 15569, -226023, -22549, 490700, -308164, 581431, -73551, - 155693, 237297, -408022, -353798, 75162, 32212, - }, - { - 34433828, 129117992, 2196876, 46272368, 9802189, -1598802, 1686312, -891743, -4465156, 4125316, - 1846299, -6135898, -2637647, 10324565, 2109903, -267362, 957241, -2669859, 3345780, -2011655, - 3787088, -283468, 3107409, 2222109, -355409, -1233729, -3307125, -3548180, 2087354, 2331094, - 1323387, -399969, -2354716, -3074123, -3001645, -1717450, 2397129, 5210332, -1854352, 366146, - 2627446, -243739, 713501, -1039382, 1417876, 1178432, -394063, -1547262, -3905736, 26307, - 1834488, -821949, 3251290, 410706, -365609, 482647, 2501282, 89657, -2175938, -3358665, - -1925219, -545998, -2418067, -165893, -677531, 676994, -33286, 194347, 1328219, -405338, - -932008, -3758, -864362, 169114, -384936, 300111, 1045825, -833224, -499290, -187368, - 282931, -375273, 537945, 300111, 881005, 398895, -286689, 548145, -245887, -271657, - -97711, 206158, 242129, -249645, -396748, 94489, - }, - { - -2147, -11709155, -2625299, -3059627, -1653562, -617938, 80531, 1649268, -681826, 104153, - -1361505, -95563, -58519, 7188165, 19662898, -21005612, -7402913, -4054449, 4715874, 1522566, - -4901095, 2702071, 7854422, -5509370, -2138894, 4231080, -3988414, 985158, 717260, 2831457, - -3009162, -1488206, 8621073, 14118094, 2681670, 3063922, 994285, 1820529, 4566624, -22549, - 1639604, -34360, 2046552, 3590593, -578747, 1946694, 940061, 2145336, -2088965, -2664490, - -2148021, 275952, -1553168, -2201171, 1474784, -1961726, -832687, -1950989, 155693, 394600, - -1005022, -678068, -598074, 200790, 1687922, 672699, -261993, -410706, 151934, 303332, - -170725, 1240172, -3758, -9127, 866510, 978179, 535260, 1063004, -365609, 25233, - 213138, 308701, -379031, -415001, 275952, 89121, -987306, 286689, -71404, -504659, - -269509, 289910, 421444, 186294, 153545, -164819, - }, - { - -49496276, -17406428, -7807177, -27318676, 4700842, 1552631, -3574487, 1706713, -2345052, -3145527, - -233539, 609349, 5300527, 1338419, 2149631, -3568581, -3162170, -7191386, -3656091, 7324530, - -2855080, -2800319, 1739462, -1268626, -3016141, 2654290, -3317862, -484258, 2967286, -623844, - 80531, -346819, -1929514, -341987, -3696356, -1617055, -2305861, -739271, 1693291, -589484, - -479963, -2886218, 786516, -677531, 2129767, 228170, 1180042, 802622, 1437203, 956704, - 3467649, -568546, -607201, 178241, 3024731, 1934346, 1124208, 119185, 251792, 856846, - 928787, -68719, 506269, 1549410, 171262, 201327, -117575, -826781, -886911, -226023, - 11274, -161598, 289910, 727460, -67109, -132607, 1085553, -56908, 340376, 306016, - 539018, 532576, -242129, -275415, -541703, -794032, 529892, 267362, 96637, 44560, - -207232, 46708, 244813, 625455, 41876, -108448, - }, - { - -100395, 3683471, 4094178, 446677, 640487, -194347, -409096, -257698, -1210644, 775778, - -2160906, -3865471, 1427003, 6704444, 12224551, -19028316, -3263102, -2209224, -1532767, 13022341, - 9172440, 269509, -1123671, -2944200, -1321239, 7677791, 9577240, -3675955, -8608725, 6500433, - -5144297, -4976794, -3845606, -95026, -1108102, -4328254, -4182225, -2284923, 1162862, -2078227, - 2126546, -1450088, 1372242, 3719979, 3726421, 4054449, 787053, 377420, 214748, -21475, - 2039036, -1461363, 1165547, 551366, 270046, -139586, -744103, 595390, -172872, -2206540, - -1571421, 81604, -451508, 238908, 210453, 361851, -53687, -197569, -104153, 306016, - -1370632, -159451, -1534377, -337692, 1646046, 734439, -107374, -284005, -161598, 573915, - -335544, -449898, -337692, 1014149, -979789, 62277, 66035, -199716, -593242, -338229, - 301185, 176094, -96637, 167504, 53150, -57982, - }, - { - -9454834, -123983896, 3035468, 8761196, 15422154, -2979097, 2018635, 243739, 2976412, 2339684, - -2236067, 2943663, -3072512, 4142496, -1743220, -2825015, 3244311, 3651796, -2272038, 1486596, - -530428, -3645354, 3458523, -2346126, -9645960, 2346126, 3380139, 482647, 1378148, -2309082, - 198105, 1469416, 40802, -1034550, -759136, -1664837, -2171643, 4132832, -2632278, 326418, - -2770254, 268435, -2095944, -4890357, 4057134, 3168612, 925029, 373125, 1080721, 12885, - 1614908, 1564979, 336618, -1193464, 911607, 1683627, 981937, 439697, -71941, 725850, - 1488743, 1099512, 37581, -730681, 26307, -1495186, 339839, 930934, -1614371, -1088237, - -447750, -373125, -45634, 397284, 1194001, -377957, 425202, 338766, -738198, 247497, - -491774, -733366, -690416, 216896, 264677, 90194, 26844, -267362, -228707, -914828, - 605054, -455803, 676994, 621160, -190589, 115964, - }, - { - -372052, 15610059, 5768141, -3589519, -1801739, -2414845, -1689533, -3866544, -270583, 1460826, - 2316598, 4400731, 1583769, 1284195, -16748225, -5922223, -6023692, 7953206, 2538326, 3819837, - -9591736, 6687801, -1801739, -1160178, -1655173, -3739306, 2443300, 6384469, -940061, 348966, - -4379793, 498753, 2403034, -1596654, -2115272, -987843, 1059246, 3609383, -2486786, -358093, - -4340065, -1373853, 2225867, -1787243, 2265595, -882079, -67109, 1995549, -1535988, -258235, - -2028835, 498753, -1155883, -73551, -354872, -2025077, -49929, 1046898, -418222, 236223, - 1437203, -12348, 1156420, -859530, 1584843, 577136, -1750199, -1111860, -351114, -1175210, - -372052, -749472, -72478, -226023, -741956, 414464, 355945, 761283, 486405, 973347, - 203474, 259309, 120259, -637803, -272730, -132070, 336618, -82678, -339302, -293132, - 557809, 434329, 191663, -19327, 159451, -109522, - }, - { - -46248208, -95826624, -9324374, -12163347, -5207648, 2036888, -19378892, -9594420, 5795522, -1315871, - 5898601, -3126736, -5172215, -2949032, 4067871, 2156074, 5507222, -3886946, -2540473, 2866354, - -2019172, 3465502, -1548873, 371515, 2477123, 2924873, 1983738, -1591285, -1687922, -521839, - 3140158, 3784403, 1953136, -1934883, -1022202, -3577708, 761283, 3503083, -976568, 1658394, - -2223719, -2225867, -2345052, 866510, 1624571, -1737314, 825707, 2164127, -380641, -3688840, - -34360, -1064615, 2483028, -1431835, 509491, 1353452, 326954, 1501628, -1129576, -910533, - 1699733, 424128, 47245, 829466, 744103, 27380, -1491427, -1672353, 753767, -885300, - 559956, -881542, 1216550, 180389, 1086627, -571768, -468151, -238908, -293668, 223875, - -18254, 758062, -106300, 805306, 174483, -483721, 197569, -635118, 20401, 467078, - 661962, 123480, 70330, -157840, -57445, -102542, - }, - { - -2677375, -23368380, 9707700, 7227356, -172336, -2443300, -2304250, -652835, -3376918, -1962263, - 908922, 1538135, -2058363, 4107599, -13646185, 969589, 2896419, -5916855, -5646809, -2133525, - -15342160, -8909373, -2961917, -1724966, -1248225, -10853382, -5781026, 2347200, 6140730, 2441152, - 7453916, 11846594, -1414655, -5905580, 1794760, -10581726, -1748589, -6026376, -4439923, -707596, - 5221070, 2680597, -2462627, 2570001, 1903744, -1091459, 991601, -2561948, -606127, 2024540, - 276489, -2187749, -3326989, -2150705, 2727304, 289373, -796180, 1750199, -1181653, -795106, - 1453310, 1439351, 2636573, -262530, -1651952, -1101122, 1118839, 593242, 1892470, -217970, - 1045825, 250182, 1341104, -1198833, 914291, -64425, 212601, 114890, -445066, -233002, - 496069, -966905, -1171452, -470299, -336081, -149250, 368830, -431107, -212064, 410169, - -181999, 65498, 402116, -171799, -374199, 319975, - }, - { - 2539936, -101021392, -5902359, -8655970, 570157, 10860362, 53150, 12964359, -205622, -312996, - 3846680, 11054709, -3070902, 4689031, -1730872, -3009698, -4135517, 835371, 6580427, 5697274, - -1855963, 949188, 2648921, 3543348, -1976759, 2428267, 2030446, 5952825, 1264868, -3110093, - -4741644, -2905009, 1222992, 39728, 394063, 2024003, -3671123, -505732, -502511, 1572495, - -1564979, -3589519, -1327145, 2661806, 2403034, -145492, -821949, 4003447, -895501, 685584, - 1916629, -134755, -533113, -684510, 76236, -603980, -2857764, 302795, -1292248, 1683090, - 209917, -972273, -464930, -1784022, -1792612, -293132, -784905, -265751, 737124, -406411, - 312459, 1254667, 56371, -1235877, 111132, -783295, 987306, 54224, -153008, 532039, - -161061, 114890, 206695, 515933, 427349, -1210644, -539018, 215285, -177167, 139586, - 37581, -268972, 110059, 163209, 198105, -215285, - }, - { - -3549254, -45527728, -2059437, 3244311, 1067299, 3301756, 4111358, -1401770, -732829, -1936493, - -1516124, 5906, 8227547, 15365246, -9771587, -10363756, -10142565, -5963562, 4039954, 11848204, - -628139, -7889318, 5078799, -3973382, 11980811, 2505577, 8685498, -7372312, 1487132, -86973, - 803696, 901943, -2761127, -619549, 4760971, 1681480, -1960653, 3428995, 666257, 1160715, - 2091112, 5370320, 5619428, -1571958, -4287451, 1021129, 1795296, 1100585, 302795, -823023, - 1753420, 4181151, -2043868, 54761, -1073742, 321586, -677531, 3758, 805843, -1383516, - 570157, 995359, -507880, 264677, 979789, -74625, -1739999, 1133871, -497679, -432181, - 913217, -76773, 946503, 482110, -196495, -304943, -440771, 399969, -733366, -768262, - 405338, -522912, -1088237, -701153, -267899, -199716, 608275, 64425, -387084, -41876, - -105227, -285615, -359704, -381715, -91805, 384400, - }, - }, - { - { - -296890, -28368796, -19063750, 6348499, -3533148, -1118839, -215285, 2534031, -214748, -4662187, - 5350456, 3365644, -4503810, -204548, 779537, 3435974, -2412161, 1964948, -1828046, -1516124, - -3050501, 2159832, -241055, 5494337, 560493, -1196685, -1603633, -1957431, 959388, 1251446, - 3680250, -1353989, 1188095, 849330, 1344325, 434865, 2537252, 2450816, 3462281, -463320, - -4409321, 628676, -3398930, -2076080, -371515, 705985, -2398739, -24696, -196495, -1066763, - 1628330, 55835, 12885, -193274, 1150514, -497142, 1388885, 964220, 792958, 898185, - 1072668, 643708, 970663, -755377, 691490, -374736, 1186485, 518617, -166430, 629213, - 861678, -75699, 140660, 56908, -877247, -312996, -118112, 26307, -148713, 40265, - 77309, -155693, 257161, 125091, 55298, 5369, 224412, -90194, 472983, 286152, - 296353, -14496, -11811, -286152, -15569, 9127, - }, - { - 23622, 6746320, -1289027, -5175436, 5161477, -470299, 1264331, 2928094, -2116345, -638340, - 2830920, -2803540, -3184182, -242129, 5774047, -1691143, 10282689, 3621731, -585726, -6721624, - 5859409, -687195, 2336462, -4565550, 475668, 1447404, 1904818, -2531883, -2660195, 3111167, - -1767916, 2711735, -4966056, -3461744, 2588255, 3102040, 1878511, 2780455, -1615445, -257161, - 337692, -2221572, -77846, -742493, -1736777, 1754494, -3040300, -963683, -1799591, -706522, - 675921, -884763, 195421, -574452, -1611, -1964411, 466004, -219043, 22012, -657130, - 712428, 437013, -1103270, 956167, 621160, -9127, 318901, 31139, -100395, 92879, - -265751, -216896, 213675, -9127, 71404, 818728, -56908, 369904, 1611, -880468, - 536334, 92342, 464393, 95026, 436476, -237834, -308701, 49392, -417686, 136365, - 88047, -235149, 483184, -126165, -135828, -52613, - }, - { - -527207, 19980188, 4352413, 6295885, 7241315, 651761, -668941, -2118493, 2313377, 339302, - -621160, 1821603, 1986422, 179315, 967441, -8134131, 2350421, -6237367, 3685082, -517544, - -914291, -8712878, 8290361, 1436130, 8142185, -522912, 962073, 2617246, 1068910, -616865, - 4812511, 523449, -2208150, -4449049, -4095251, 1966021, 3133179, -1652489, 1675574, -96100, - -1341104, -592169, 281857, 630286, -712428, -969589, 1367947, 1469416, -1495186, -778463, - -422517, -353261, -526670, 198105, -73014, 2323577, -1640678, -521302, 2429878, 417149, - -1036161, -316217, -1227824, 445066, -663572, 508417, 162672, 540629, -761283, -1292785, - -521302, -603980, 419833, 186294, 20401, -53150, 113280, 446140, -249645, -1031866, - 509491, -200253, 156766, -157840, -47782, 537, 495532, -315680, -106300, 264141, - -156766, -63351, -84289, -42950, -424665, -36507, - }, - { - -23567022, 18550500, -17559974, -788127, 5498632, -1318018, -1999844, -1063541, 4946729, 555125, - 1455994, -777926, -1306207, 2333241, 7557532, 1609002, -3379066, -2422899, -7905424, 3519189, - -317291, 180926, 4118337, 2831994, -5536750, 2375117, -1850057, -2325188, 1240172, -541166, - -3360275, 1130650, -2154463, 1429687, 1575179, 2678449, 1738388, -1437203, 456877, -3551401, - 863825, 1144072, 748398, -2181307, -244276, 4637491, -2294050, -246424, -2192044, -666257, - 1212791, -1268089, -166430, -706522, -398358, -1194538, 1230508, -469762, 404264, -718870, - 1685238, -920734, 916439, 229244, 973884, -147640, 363462, -969589, 254477, 907312, - 1378148, -486942, -706522, -93416, -544387, -448287, -1611, -8590, -435939, -442919, - 376347, 159451, 263604, -513785, 176094, 73014, 6979, 275952, -377957, -30065, - 82141, 293132, -141197, -416075, 105227, -96100, - }, - { - 2338073, -13304735, -4548371, 2257005, -161061, -488553, -289373, 1289027, 407485, 28991, - 3804267, -847182, -115427, 1526324, -2951716, 9635222, 5100274, -11251741, 8284992, -10091026, - 5455146, 5692979, 9485972, 29528, 8626979, -9330816, 1772748, 2187749, 8278013, -13067438, - 5304285, 744640, -1046898, 2709051, 1965484, 3086471, -522375, -1251446, 225486, 3303367, - 2757369, 318364, 978716, 1706176, 1627793, -895501, 151934, 841814, -1503239, 1547799, - 1898912, -22012, -781684, -7516, 570157, -266288, 1307281, -928787, -1180042, -737124, - -528818, 85362, 464393, -499827, -172872, -746251, -111669, -1304596, 308164, 488553, - -1147293, -563178, 848793, -579284, 557272, 215285, 523986, -621160, 77846, 246961, - 272194, 444529, 314606, 255014, -136902, -417149, 284005, -651224, 272730, 135828, - 372052, 352724, -27380, 211527, 92879, -292595, - }, - { - -35866736, 17620640, -7864622, 36538896, 3591667, -1979980, 1707250, 7601555, 2759517, 2679523, - 884763, -2852395, -3311957, 5437966, -1879585, -4026532, 867047, -4745402, 2705830, -2195265, - -1377074, -5628555, 4200478, 460098, -1338419, -11274, -286689, -855235, 1267015, 1422171, - -549756, -959925, -2220498, -2408940, -3584150, -2764348, 15569, 2062658, -3239479, -649614, - 1784022, -1283658, 703301, 1414655, 2752537, -583579, -2602213, 26307, -2589865, -516470, - 3216394, -816581, 657130, -318901, 1753957, -745714, 389768, -149787, -391379, -828929, - 1850057, 1024887, -2517388, 540092, -750546, 544924, 156229, 336081, 1472100, 378494, - 27380, 184147, 92342, -283468, -403727, 80531, 55298, -942745, -197569, 209917, - 463856, -438624, 567473, -392453, -20401, -98247, -161061, 380641, 168577, -576063, - -683437, 4295, 84289, 164819, -235149, -246961, - }, - { - -538482, -13049721, -1442572, -1087164, -36507, 126165, 386547, 1388885, -1479616, -192200, - -1178969, -974421, -4108136, -697932, 6841346, -13548474, 4413616, -2214593, 1030255, -2621541, - -4341675, -5112622, 5747740, 11594801, 7635915, 6250788, -12972412, -2763275, 2148558, 8601746, - 3820910, 2542621, 7231115, 5603322, 786516, 528281, -1065689, 438087, 2470680, -3215320, - -1676648, -1716913, 123480, 2500208, -1811939, 929324, -22549, 1758789, 58519, -301185, - -1296543, -583579, -20938, -362925, 2805688, -1989107, -2403034, -1453310, 988916, -330176, - -1097364, -175557, -1377611, -1539746, 17717, -56908, 163746, -550293, -504659, 369904, - -83215, 671626, -101469, 713501, 690416, 161598, -501974, 743029, -442919, -430570, - 162135, -33286, -377420, -168041, 187368, 30065, -525060, 389768, 44023, 326418, - -349503, 85362, 248034, 122943, 292058, -175020, - }, - { - 29112362, 95771864, -3612604, -25240986, -613643, 3562675, -741956, 1618129, -3895535, -4253628, - 3934190, 1531156, -1117228, -1169842, 1035624, 2191507, 1364189, 3564823, -2561948, 3168075, - -2743947, -3212099, 3059627, 17717, -3811247, 3139621, 827855, 4373351, 2098629, -3899294, - 1710471, 3093987, 602906, -102005, -464930, 549219, -978716, 1261647, -1104344, -4010963, - 664109, -2543695, -1333051, -1111323, 1115618, 350040, 1848983, 719407, 579284, 292058, - 1356673, 1277216, 1699196, -363998, 1180042, 947040, 1901060, 314069, -510564, -1345399, - 1161252, -1104344, -1364189, 1019518, -847182, -316754, 377420, -526670, -445066, -547608, - -1074, 27380, -220654, 957778, 367757, 494458, 901943, 114890, 44023, 54761, - 422517, 267899, -150324, -226560, 97174, -100932, 99858, -49392, 311922, -221191, - -329639, -173409, 113280, 178241, -384400, 89121, - }, - { - -839129, -3177202, 425202, -668404, -200790, -344134, 666794, 490700, -539555, 206158, - -1349694, -268972, 925029, -1379221, 10502806, -14554034, 9887015, 7209640, 2179696, 9076340, - 8746164, -5857262, 1839320, 3786551, -7014219, 8608188, 12501039, -62277, -4976257, 9199820, - -2389076, -4468914, -1023813, 2563022, -3875671, -4665945, -4311074, -2995740, 1094143, -3042448, - -109522, -82141, 4295, -1432372, -270583, 1745367, 1131724, 1625645, 452045, -360777, - 729071, -853625, 802085, -216896, 1078037, 124554, -126165, 1422708, -948114, -1728188, - -297427, 1084479, 230318, 626528, 412317, 508417, -82141, 395137, 376883, 748398, - -504122, 318901, -1199370, -56371, 1532230, -110595, 154082, -90194, -391379, 499290, - -9127, 91268, -502511, 1036698, -796180, 18790, 58519, -252866, -130997, -406411, - -271657, 65498, -91805, -53150, -129923, -38118, - }, - { - 10341208, -113788720, -23324894, 6403260, 12664785, -5187247, 8298414, 2255932, -712428, 154082, - -931471, 3226594, 2763275, 8548596, -1318555, 483721, -1524177, 5191542, -3670050, -454193, - -728534, -3997541, 987306, 1190243, -4645007, 6410776, -758062, -4698158, 4394289, 4329864, - 860604, -3833258, -3293166, -2264522, 4416837, 817118, -2206003, 4303557, -329639, 1382443, - -2728378, -249645, -1224066, -3615289, 2784750, -75699, -2659122, -588411, 812286, -3064459, - -344134, -687195, -213138, -806380, 78383, 38118, -754304, -784905, -774168, 173946, - -410706, 289910, -404801, -697932, 411780, -544387, 466541, -297427, -840740, 452045, - 688805, -199716, -299037, 382789, 651224, -406948, -259309, 354872, -143881, 870805, - 177167, -240518, -368830, -361851, 2684, -337692, 106300, -60130, -288837, -737124, - 409633, -423054, 176094, -62277, -215822, 399432, - }, - { - 1435056, 8686571, -466541, 3702799, 1879048, 2084133, 4070019, -3061238, -2706903, -85899, - -344671, 9364639, 1201517, -1233729, -12890271, 1687385, 473520, 1924682, 1443109, 12584254, - -7384123, 2940979, -540092, -1597728, 1554241, 3298535, -132607, 2614561, -4079682, 2472291, - -3247532, 1108638, -163209, -315143, -913217, 393526, -209380, 1590749, 741956, 3798362, - -1274532, 2645700, 2975339, -572304, 2221572, -726386, -703838, 886374, -1167694, -686658, - -1854352, 874563, 256624, -44023, -17180, -1964411, -1252520, 496069, -436476, -1199907, - 357019, -511101, 74088, -1404454, 515933, 8590, -973884, -573378, 222801, -537, - 1014149, 347355, 670552, -199716, -193274, 251792, -261456, -248571, -940598, 440234, - 201327, -125628, 381178, -201863, -20938, -541166, 154619, 37581, 425739, 2147, - 318901, 292595, 280247, -71941, -27380, -97174, - }, - { - 50413252, 35258996, 702227, -7250442, -6380174, 29391534, 5249524, -4972499, 2742337, -7398618, - 7158637, 299574, -1242856, -2199560, -4487704, -3618510, 7365869, 2858301, -1229971, 4539244, - -667331, 3035468, 333934, 1690070, -346282, -1438814, 1449015, -1046361, -1875827, -2151242, - -17180, 462246, 632434, 2084670, 2680060, -1481227, -312459, 4767951, -1348620, 2536715, - -2702608, -1379221, 1228898, 4188667, 732829, -829466, 1095754, 3206730, 890132, -556198, - 1948841, -287763, 923418, -3132642, -60130, 1745367, -789737, 740345, 977642, -536871, - 740345, 645319, 580357, -411780, 274341, -206158, -510564, -312459, 123480, -1290638, - 1287953, -664109, 574452, -248571, 749472, -674310, -836445, -471373, -221191, 286689, - -64425, 258772, -19864, 591632, 336081, 161598, 62277, -314606, 65498, -569620, - 269509, -37581, 152471, 64961, -2147, 45634, - }, - { - 1793686, -28652264, -1344862, 5824513, -1291711, -4742718, 702227, 3080029, 160524, 602369, - -384936, -843424, -2978560, 8870181, -13907641, 2818036, 6579353, 1820529, 1702418, -2950106, - -1313723, 1944010, 4516158, -3038689, -8684424, -3687230, -3251827, -6707665, -5639292, -5921686, - 3175592, 5375689, -4371203, -5535139, 5264556, -4173635, 119722, -3060164, 302795, 1495722, - 2303713, -1558536, -6741488, -763430, -1313186, -1458678, 1190243, -2699924, 236760, -178241, - -263604, 652835, -150324, 221728, 2309082, -555125, -277025, 1379221, -1157494, 540092, - -82141, -1003949, 868657, -194347, 34360, -778463, 1220308, 978179, 2269890, 34897, - 651761, 391379, 943819, -1242319, 288837, -753230, 418222, 356482, 198105, 76236, - 550293, -290984, -751082, -317828, -479426, -598074, 83752, -86436, 253403, 35433, - -528818, 2147, 552977, 412854, 66572, 89121, - }, - { - 17248588, -83963928, -3230352, -716723, 360777, 16364899, -7184407, 3784403, -4637491, -2284386, - -4023848, 4317516, -1746978, -882616, -10179609, 2697240, -985695, -629213, 2407329, 541703, - -5435281, -4695473, -349503, -2046552, -3602404, 1484985, -339839, 1246077, 2991982, 3386045, - -340913, -3088082, -565325, -581431, -537945, -1054415, -1890323, 3034395, -990527, -966905, - 1594507, 1142998, -2927020, 434329, -223338, -449898, 1617055, 4720169, -220117, 1240709, - 1219771, 681826, 633508, 985158, 1613297, 542777, -2605972, 1649804, -942745, 1007707, - 1264868, -258235, -313533, -645319, -451508, 409096, -339839, -222801, 369367, -969052, - 453656, 715112, -105764, 518080, 1018981, -557272, 505732, -62814, 6442, 657130, - -62277, 237297, -115427, -260919, 222801, -621160, -484258, 196495, -255551, 263604, - 268972, -127238, -14496, 403727, 449361, -30602, - }, - { - 2876554, -37217504, -4278861, 1187022, -275952, -11811, 3360812, 1114544, 2131915, 328028, - 1214402, 4806069, 4843650, 8324184, 551903, 1869921, -5279589, -3790846, 1684164, 34360, - 3656628, 705448, 5233418, -11482058, 5147519, 1293322, 7626252, -7131793, 6372121, 1478543, - 5534066, 5004174, -1085553, 1053878, 4035659, -86436, -330712, 2122788, -2896956, 1200443, - 1977833, 966905, 1585917, -1585380, -2835752, 1511829, -751082, -525060, -675384, -783295, - -261993, 2717104, -1507534, 1119376, 1012539, 734976, -1352378, 840203, 2253784, -200253, - -57445, -256624, -1242856, -481036, 224412, -241592, -914828, 1040993, -79994, -698469, - 763430, -390305, 613107, -530965, -1051193, -741419, -736587, -107374, -676457, -439697, - 571231, -303869, -343597, 69793, 566399, -537, 242666, 282394, -413391, -115964, - 76236, -45097, -543313, -234613, -14496, -78383, - }, - }, - { - { - 2433099, -13093208, -18281528, -13930190, 6962679, -1974611, 1298691, 1913408, 1882269, -416612, - 1573569, -5011690, -1278827, 3055869, -153008, 3550327, -2765959, 274341, -1898376, -6189048, - 1571958, -1040993, 2762738, 964220, 4214974, -248034, -3554622, 846645, 2025077, -110595, - 2459943, 1949378, -1664300, -656056, 2054605, 928250, 4438849, 2153926, 492848, 1144609, - -2043868, -350577, -2395518, -2598455, 264141, -200790, -2527588, 825171, -363998, -1023276, - 393526, -294205, 572304, 896574, -717796, -315680, 1066226, 501437, 2484639, 733366, - 216359, 1112397, 351650, -211527, 34897, -541703, 564788, 1003412, -231391, 1302986, - 380641, -186294, 698469, -767189, -747861, -353261, 118648, -296890, 78383, 34897, - -375273, -112743, 608275, -15569, 249108, 174483, -316217, 93952, 273804, 133144, - 319975, -74625, -195958, 26844, -270583, 172336, - }, - { - 100395, 10466298, -6157910, 12530567, -9897215, 996969, 2131915, -1363652, 2730526, -2241973, - 2459943, -2522220, -2775086, 2978560, -3827353, 9302362, 5542656, -2238752, 680752, 4875862, - 1286343, 4556961, -3002719, -6236293, -4850629, 4717485, 1714229, -819802, -1689533, 2364916, - 1286343, -4615479, 2839510, -6015102, 750009, 4780836, -20401, -484794, 1101122, 192737, - 621160, -2557116, -927176, 1567663, -2301029, -2356863, -41339, -119185, -2304787, -1497870, - 32749, -460098, 132070, -266288, -1252520, -105227, 760209, -416612, 373125, -1240709, - 640487, -629213, -384936, 1711008, 491774, -94489, 35970, 158914, -295279, -34360, - -466004, 317291, 604517, 128849, -178778, 692027, -91805, 22012, 176631, 264677, - -680752, 748398, 92342, 351114, 90194, -39192, -104153, -536871, -148713, -125091, - 344134, 70867, 123480, -341450, -221191, -15569, - }, - { - 1192927, 13865765, 6801081, 33137284, -10918344, 1063541, -138513, -734439, -221191, 1330366, - 1392106, 2335389, 267362, 3993783, -992674, -7793755, -870805, -2093797, 2357400, -3160022, - 2285996, -9189619, 5714454, 3167539, 3445638, 5458367, -1785096, -836982, 1555315, 4904316, - 418759, 3093987, -1813013, -5914170, -1130650, 2036888, -396748, 122943, -839666, -159988, - 273267, 2258616, 473520, -1319629, -347355, -2223183, 1151051, 421981, -274878, -73551, - -1517734, 558346, -359167, 200253, -361851, 1420560, -1249836, 988916, 1026497, 1162862, - -1042066, -731755, -1591285, 1067836, -828392, 106837, 262530, 638340, -161598, -1596117, - -349503, 36507, -134218, 289373, -13959, -200790, 349503, -132070, -286152, 102005, - -116501, -282394, 11274, 333934, 43487, -27380, -129923, -212601, 268435, 73014, - -150324, 501974, -149250, -250719, 6442, -459025, - }, - { - 13217225, -31369904, -2071248, -4114579, -4758287, -128849, -934155, 387084, 1484985, 905164, - 6890738, -3654480, 2062658, 1163936, 7343321, 832687, -1792612, -3406446, -1105954, -518617, - 1676111, -2725694, 4348655, 592706, -2649995, 2048163, -2572149, -1852205, -1321776, -779537, - 325881, -338766, -280247, -12348, 2180770, 1397475, 1537598, -337155, -1695438, 126702, - 1194001, -340376, 970126, -3251827, 1362042, 3499325, -1575179, -1814087, 102005, -1931125, - -297963, 706522, 624381, -1624035, -1363115, 656056, 170188, -950262, 153008, 102005, - 47245, 475668, -347892, 1205275, 165893, -501974, 425202, 130460, 367757, 1093069, - 1011465, -12348, -278636, -378494, -354335, -466541, -383863, 110595, -108448, -174483, - -163746, -74088, 230854, -176094, -161061, 401043, -98784, 18790, -172872, 139586, - -270583, 259846, -92879, -396748, -98247, 2147, - }, - { - -1617055, -20333448, 7088844, 2279554, -467615, 4832, 115427, -1213328, 839666, 1075889, - -812823, 5463199, -3894999, -606127, 2640331, 4931160, 8203925, 4698158, -7626252, -4474282, - 783832, 4643934, 9880035, 3623879, -1584306, 9575093, 2136209, -2289218, 3919158, -4519380, - -74625, 2197413, -1244467, 821413, 5752035, 454730, -1145146, -2330020, 363462, 3776350, - 719944, 2083059, 1294396, 443992, 954557, -1175210, 914291, 722091, 271120, 597537, - 1600412, -248034, -270046, -797253, 310848, 296890, 915365, -868657, -1340567, -632971, - 1002338, -1264331, 97174, 358630, -448824, -983011, -550293, -256087, -682900, -36507, - -48855, -736050, 442382, 188442, 374736, 106300, -55835, -396748, -39192, -225486, - 493384, 197032, 941135, 207769, 171262, -324270, -491774, -124017, 189515, -148713, - 421444, 516470, 219580, 8053, 69256, -253940, - }, - { - 21093122, -66791036, -3159485, 40919228, 1719598, -1477469, 4646618, -110595, 5756330, 4628901, - -2662343, -653909, 647466, -9127, -3674882, -2079838, 740345, -3004330, 2344515, -4582730, - -3011846, -1304596, 2070174, -855235, -884763, -1653026, 2692945, 1369021, 2283849, -1632088, - -1135482, -216896, -3615826, 277025, -2414845, -1666984, -2442763, 631897, -1979443, -836982, - 523449, 148713, -212064, 3876208, 687195, 366146, -727460, -1602560, -1687922, 753230, - -62277, 3208878, -1719061, 2397129, -705985, -507343, -1493575, -541703, 5369, 350040, - 1411971, 830002, -799401, -623307, -85899, 615254, -190052, 489626, 391916, 1353452, - 10201, -751082, 256087, 263067, -98784, 99321, -232465, -428960, 39192, -199179, - 565325, -68719, 363998, -65498, -467078, -139586, -148176, -3758, 370441, -314069, - -597000, -12348, -92342, 231391, 21475, -314069, - }, - { - 118112, -5201743, -10254234, -228170, 1155346, -260382, -111132, 1227824, -1379758, -2014877, - 2683281, -2288681, -5570573, 5759551, -1181653, 7024956, -10023380, 8039105, 5225902, -14727980, - 1173063, -6474663, 6207302, 12396349, 9160628, -5778342, -9507447, 4742718, 4258460, 2978560, - 9176734, -1483374, 6291590, 3802657, 3240553, -4518306, 1159641, 1714766, -678068, -4430796, - -2270427, 180926, 53687, 168041, 469225, 63888, -284542, 611496, 1316944, -918586, - -517544, -1050120, 824634, -227096, 321586, -111132, -2800856, 239981, -171262, -432718, - -206158, -178241, -1273458, -612570, -950262, -303869, -438087, 423591, -1020592, 413927, - 417686, -183073, 283468, 691490, -87510, 139586, -114354, -365609, -134755, -663572, - 576063, -202400, -71404, -386010, 183610, -129386, -143881, 287763, 296353, 269509, - 23622, 137439, 52613, 266288, 16643, -79994, - }, - { - -5393405, 131886632, 8508330, -35214972, 6905771, 2022930, 3821984, -3484292, -1846836, -2554969, - -318364, 4953708, -583579, -576063, -2376728, 3484829, 1673964, 2855080, 5907728, -1822140, - -911607, -3582540, 10737, -1548873, 560493, 1557463, 2326262, 4905390, 2663954, -3131031, - 113280, 820876, 3859028, -2512019, 1930588, 1379758, -67646, -507343, -2363306, -2867965, - 115964, -1427540, -1508070, -796180, -260382, 252329, 877247, 1635846, 1245004, -209917, - 763967, 703838, 3405909, -456340, 556198, 685584, 866510, -182536, -206695, -1991254, - 1588064, -382252, -727997, -818191, -302258, -454730, -309238, 66035, -659278, -487479, - 354335, 22549, -537, 335007, -5369, 907849, 259309, 263067, 412317, 205085, - -264141, 208306, 17180, -463856, 408022, 188442, -184684, -108985, 332323, -83215, - -458488, -347355, 289910, -361851, -388695, 448824, - }, - { - 1611, -2850785, -5083631, -659278, 99321, -387084, 552440, 1280437, -383326, -885837, - 388695, -833224, 1549946, 1140314, 6048388, -2754685, -1194001, 9899900, 5356361, 1731409, - 3521873, -2888366, 2298344, -672162, -3583613, 3863860, 10512469, -1709934, -636729, 1813013, - -1409286, 1962800, -520765, 246424, -3792993, -2596308, -4348655, 12348, 307090, -1218697, - -2443837, 253940, 740345, -2670933, -810675, -653909, 1985349, 2770254, 164283, -501974, - -857920, 1566053, -894427, 867583, 386010, -117575, 890669, 722091, -1636919, -408022, - -54761, 134218, 1034550, 719944, 231928, 121333, 783832, 265214, 452582, -94489, - 793495, -17717, -650688, 535260, 609885, -251256, 92342, 85362, -239444, 341450, - -367757, 903554, -332860, 24696, -209380, 28454, -109522, -428423, 169651, -380105, - -253403, -156766, 120796, -193810, -25770, -122407, - }, - { - -11510512, -100749736, -2134062, 2820183, 3777424, -4875325, 5105643, 1567126, -3702262, -425202, - 3115999, -1700807, 2542621, 4090956, 2281165, 4155918, 557272, -3089692, -1819992, 1638530, - -4532264, -993748, -2902861, 1845762, 1560684, 879395, 1439351, -1246614, 1436130, 954020, - 2907693, -3056943, -3089155, -518617, 1184874, -592706, 498753, 2513093, 2222109, 120259, - -2289218, -1071594, -479426, -1767379, 1320166, 360240, -2501819, -267899, -577136, -2289218, - -2178085, 145492, -1329829, 593242, -651761, -299574, -690953, -1939178, 1322313, -8053, - -1517734, -60130, -824634, -393526, 863288, -76773, -109522, -814970, 160524, 1128503, - -527744, 267362, -530428, 587337, -195421, -268435, 81068, -161598, 337692, 110059, - 492311, 445066, -674847, -566399, -264677, -216359, -451508, 94489, -477278, -166967, - -53687, 140123, -309775, -33286, 148713, 172336, - }, - { - -1678795, 8750459, 679679, 10854993, -890132, 540092, 4806069, -2341294, -1592896, -1912334, - 3221, 7515656, 1806571, -1037235, -8373039, -2552821, 6217502, -1415192, 6495065, 3164317, - 8597988, -3225521, -79457, -2412698, -3212636, 7192997, -1471026, 1909650, -1997697, 2560338, - 112206, -2063195, -4294968, 1465658, 1289027, -310848, 679679, 1227824, 1450088, 2261837, - 727997, 3743064, -1090385, 2212982, -1051730, 1544578, -235686, -887985, 42950, -2704756, - 621697, 656056, 1012539, -1251983, 720481, -647466, -1277216, -230854, 244276, -914291, - -692027, -802085, -139050, -703838, -20938, -685047, -336618, -290984, -521839, 35433, - 959925, 1034550, 628676, -112206, -467078, 544387, -458488, -282394, -527207, 28454, - 63888, -119185, 339839, 30602, 149787, -629750, -134755, 519691, 269509, 551903, - 76773, 279173, 130460, 127775, -381715, -77309, - }, - { - -29445222, 140576432, 5521718, -2935073, -12776991, 22927072, 17396228, -3273839, 2069637, -3869229, - 1259499, 1798518, 1960653, 1375463, -5435818, 163746, -1654099, 3011309, 539018, 176631, - 9049496, -1502702, 1233193, -1441498, -2173790, -3011846, 5463199, -1876364, -1362042, -3078955, - 125628, 495532, 85362, 3809636, 391379, 3679713, -2008434, 2610266, 3374771, -1052804, - -1486059, 869731, 274878, 2433099, 698469, 1614371, -919123, 2810519, 1079111, 1163936, - -594316, 413391, 34897, -2647847, 376883, 493921, -878321, 489626, 1066763, 1343251, - -1311576, 1425929, 394063, -963683, -12885, -83215, -379568, 164283, -198105, -538482, - 424128, -301185, 417686, 180926, -39728, -215285, -643708, -205622, -88584, 70330, - 278099, -454193, 389231, 8590, 310848, 6442, -161061, -100395, -183610, -382789, - 233002, -164283, 85899, 156229, 30065, 64425, - }, - { - -653909, -32959042, 7090991, 4155918, -406948, -3388192, -1625645, 1594507, 3088082, -813896, - 3358665, -2336999, -1324997, -5229123, -6539625, 289373, 4128537, 2975339, 1228898, -2555506, - 13326210, 1243393, -4786741, -4775467, -14400488, 9422621, -7961259, -6666326, -5141613, -2627446, - -1132261, 3255048, -2309619, -2979097, 110059, 2602213, -3980898, -1023276, 1804960, 583042, - -1547262, -2721399, -2542621, -2184528, -78920, -551903, -2065342, 139050, -756451, -1068910, - 51003, 1078574, -483721, 1512902, 281320, -454730, -367757, -255551, -734439, 2507724, - -1532767, 113280, -1044751, 675384, 168577, -68719, 48855, 2450816, 392990, 962610, - 240518, 654446, 125091, -351650, -496069, -637266, 380105, -143881, 368293, 258235, - -103616, 532039, -212601, -309775, -382252, -909459, -89657, 427886, 20401, -94489, - -297963, 263604, 29528, 286152, 479963, -236223, - }, - { - -26346404, -25414396, -132607, -2088428, -4167729, 8647917, 890669, 1539209, -4334159, -2390149, - -2934000, -547608, 3630858, 3761855, -15872052, 2292976, 1685238, -200253, -2016487, -3067681, - -874026, -3009162, -2043331, -3699578, -695248, -3200825, 4002373, -2667712, 2437394, 3670587, - 2743947, -3764539, 427349, -1281511, 683974, -4478041, -181999, 2517925, -719407, 162672, - 717796, 933619, -2694018, -513785, -1804960, 2408940, 2277407, 1462436, 2589329, -452045, - 1551020, -13422, 1068373, 1043677, 627602, 1737851, -1559073, 301185, -235686, 1421097, - 175020, -23622, 200253, -948114, 258235, 748398, 121870, -671089, 548682, -831076, - 952409, -104690, 300111, 466004, 914828, 255551, -67646, -26307, 381178, 557809, - 8590, 168577, -200253, -255014, 343597, -77309, -118648, -569083, 110595, 345745, - 204011, 140123, -93416, 441308, 180926, 121870, - }, - { - -1608465, -34250216, 1440962, -1984275, -828392, -38655, 627602, 2823404, -1206349, 4095251, - 1137630, 3387656, 5115306, -3696356, 20219096, -5206574, -1100049, -4203163, -1392643, -1983738, - 3144453, 445066, 3260417, -5733782, -4121558, 4154844, 3047816, -4095788, 5030481, 6405944, - 3804267, 2231236, 3018288, -1444720, 4020090, 1083942, 752156, -1795296, -604517, -347355, - 4494147, -3244311, -909996, -387084, 741419, -645856, -161061, -1115081, -1259499, 740345, - 738734, -143881, -736050, 922344, 1708323, 990527, -1430224, 17717, 814433, -307090, - 371515, -663036, -753230, -632434, -461709, 224412, -147640, 678605, -751619, 10201, - -319975, 562104, -563178, -924492, -1145146, -442919, -180926, -466004, -662499, -476205, - 468151, -165893, 94489, 617402, 98247, 66035, 17180, 267899, 25770, -40802, - -56908, -147640, -314606, -318364, 106300, -239981, - }, - }, - { - { - -5139465, 15106474, 27575838, -24948392, -253940, 351114, -462783, 849330, 7381975, -218506, - -5063230, -5754720, 157840, -3034931, -5279589, 2017024, -2396055, 192200, -168041, -6970732, - 2812130, 655519, 3298535, -1606855, 1914482, 1168231, -2112587, 1944010, 4105989, 306016, - -862215, 1979443, -671089, -868120, 2732673, -978179, 1345935, 349503, -1646583, 775242, - -154619, 859530, -918586, -386547, 554051, -985695, -713501, 2042794, 122407, 786516, - 505732, -1796907, -817654, 213675, -1642288, -1434519, -323196, -297427, 1652489, 72478, - -253403, -126702, -73014, 443992, -9664, -550830, -351114, 266825, -854162, 745714, - 163746, -220117, 1031866, -289910, -278636, 147640, 557272, -395674, 55835, -113280, - -62814, -165356, 390842, 83215, 69256, 147103, -78920, 202400, 11274, -73551, - 184147, 185220, -159988, -15569, -300648, 26307, - }, - { - 1030255, 16428787, 76236, 17314624, -9386651, -729071, 668941, -1291175, 3673808, -1542967, - 1807644, -2404645, -3704946, 748398, -7461969, 4020626, -1952600, -4945118, -4058744, 6029597, - -1024887, 1384590, -360777, -574452, -4999879, 3342022, 660888, -490700, -316217, 1648194, - 801548, -2576444, 6357626, -5444945, -1828582, 2743947, -437550, -951335, 2353105, 890132, - 953483, -150861, 377957, 2617246, -2565169, -3220152, 440234, -654446, -1561221, -388695, - 1227287, 1187559, 1343788, -285615, -908386, 15032, 476205, -2147, 356482, -537945, - 192200, -775778, 307090, 1129576, 82141, 164819, 172872, -270046, -384400, -11811, - -985695, -588947, 358093, 100395, -462246, -31675, -638876, -90194, 150324, 297963, - -926639, 488016, -44023, 120259, 62277, 69793, 49929, -614717, -537, -288837, - 284005, -5369, 30602, 48318, -39728, 134755, - }, - { - -545461, 13346074, 1617055, 21673478, -11505681, 4618701, 2719251, 1489817, -1639067, -1384053, - 804233, 2728378, 1464047, 507880, -1322850, 315143, 4355634, 2252710, -2437394, -6857989, - 6114960, -2967823, 1930588, -1621887, -1254131, 2786897, -2937758, -1252520, -54224, 3937948, - -3129958, -733903, 533113, -2000381, 452045, 1384590, -462783, -1074816, -1027034, 1157494, - 1911797, 3803731, 831613, -782221, 1921998, 657130, 1953673, 739271, 353798, -454730, - -734976, 743029, -666794, 1322313, -38118, 14496, -1842541, 520228, -16643, 1459215, - -240518, 264141, -421444, 1778653, -670552, -621160, -323733, 248034, -323196, -999117, - 573915, 715649, 174483, 481573, -30602, -183610, 363462, 258235, -9664, 305480, - -346282, -185757, -208843, -119185, 16643, 78920, -251256, -97174, 311922, -170188, - -117038, 529355, -44023, -96637, 99858, -416075, - }, - { - 4689031, -24580634, 4743792, 2150705, 9389335, -355409, -1230508, 2621004, 2435247, 438624, - 2918967, -7910793, 7076496, 4429722, 5448166, -1540283, -3633006, -5050345, 532039, 1261110, - 1670742, -3237332, 1945083, 1136019, -2328946, -382789, -68719, -821949, -1103807, -91805, - 2816425, 1821603, 909459, -1258962, 2165737, 2529199, 2827699, 79994, 428423, -121333, - 341987, -18254, -1264868, -3097208, 2046552, 1469416, -2474975, -1336809, 2275259, -462783, - -319438, 191663, 548682, -926102, 137439, 1071058, -266825, -1162326, -178241, 55835, - -813359, -390305, -819265, 1712618, 146029, -182536, 309238, 391379, 468151, 762894, - 130460, -202937, 576063, 363462, -264141, -195421, -146566, -324270, 58519, 469762, - 103616, -86973, 41876, -186294, -197569, 129386, -230854, -163209, -236223, 392453, - -352187, -125091, -227633, -169114, -153008, -180389, - }, - { - 674847, -27861452, 135291, 1843078, -1269163, 281320, -1141388, -2806761, 646929, -184684, - -1235340, 3869229, -8090645, -776315, 4104378, -1772211, -6305012, 10393821, -6468758, -7540352, - -3721589, -2891050, -177167, 988379, -1014686, 9942849, -970663, -4294431, -1105954, -3390340, - -2427194, -3115999, -3229816, 353798, 1467268, -5534066, -4460324, -428960, -951335, 943282, - -366683, 900869, 91268, -948114, -1083406, -1874753, -673773, -414464, 136365, 259309, - 1423245, -577136, -54761, -1396938, -301721, -83752, 861678, -1074, -1052804, -165893, - 687195, -1541356, 122407, -91268, 627065, -558346, -639413, -441845, -1040456, 201327, - 284542, 273804, 557272, 221191, 193810, 51003, -411780, -214212, 78920, -254477, - 312996, -373662, 314606, 60130, 192200, 22012, -393526, -26844, 95026, -215285, - 556198, 400506, 123480, 168577, 175557, 194884, - }, - { - 2645700, -86882896, 6856379, 39015484, -6385006, -2887292, -101469, -9063455, 761283, 4443144, - -2548526, -1714766, 340376, -3543885, -4971425, 743566, 4137664, -1065689, 1655173, -1708323, - 2205466, 2932389, 2254858, -2721936, -2410551, -1633161, 2708514, -1198296, 519691, 1343788, - 2229625, 1064078, -3501472, 1306207, 409096, 247497, -2184528, -941135, 297427, 1456531, - -2001455, -1201517, -432181, 2040646, -153008, 626528, 1236414, 869194, 724776, 2078227, - -3182571, 438087, -1973001, 2337536, -1938104, 696322, -986232, -220654, 357556, 221728, - 275415, 140123, -267362, -48855, 443455, 972273, -222265, 66035, 13422, 568546, - -137439, -303332, -418759, 469762, -57982, 290447, -24159, -293668, 325881, -275415, - 102005, -395674, 236223, 299574, -100932, 111132, -114354, 50466, 231928, 79994, - -257698, 45634, -55835, 142808, 159988, -28991, - }, - { - 166430, 7435126, -1184874, -949188, -90731, 43487, -173946, 345745, -2340220, -2008971, - 2146410, -1780264, -3195993, 3468186, -612570, 12266427, -10743324, 1922535, -975494, -13695040, - 7791608, 852551, 14510010, 5236639, -6467147, -12329777, -4930623, 4522601, -517007, -1399086, - 5291937, -4354560, 2136209, -676994, 3295314, -900869, 140660, -1560147, -1819992, -1651415, - -512175, -1516124, -1202054, 997506, 1230508, 1354525, 289910, -987306, -412854, -901943, - 1007707, -522912, 625992, -237297, -31139, 1405528, -654983, 1037772, 732829, 381715, - 98247, -141197, -33823, 894427, -1021129, -885300, 136365, 2013266, -814433, -632971, - -485868, -324270, 417149, 6442, -98784, 345745, 147103, 3221, 46708, -532576, - 386010, -463856, -18790, -208843, 314606, 61203, -20401, 292595, 82141, -129923, - 180389, 216359, 12348, 112743, -214748, -78920, - }, - { - -13350369, 98702640, 91805, -40874668, -3871376, -1868311, 511638, -2742874, -508954, -2062658, - -3251290, 5175973, 4061965, -3651259, -1757715, 1418950, -861678, -2362232, 4215511, 852551, - 621160, -1729798, -615254, -3230352, -2978023, -60130, 626528, 1847910, 1832340, -2352568, - -2436857, -1971390, 2824478, -2537789, 2772938, -1122597, -1419487, -711354, -2884608, -2479270, - -470299, 212601, -890132, -1719061, 83752, -643171, -1086627, -1726040, 328028, -72478, - 469225, -1687385, 759136, -796180, 719944, 727997, -331786, -1552094, -89657, -1422171, - 1215476, 60666, 289910, -206695, 74625, -339302, -367220, -111132, -138513, 462246, - 554588, -87510, -20938, 199179, -399432, 195421, -1611, 53150, 305480, 82141, - -477278, -2147, -82678, -237297, 353261, 5369, 413927, 206695, -164819, -213675, - -358630, -133144, 322659, -140660, -105227, 266825, - }, - { - 733366, 2719251, -1591822, 2209224, 907312, 60130, -585726, 1283658, 1175747, -1076426, - -1036161, 390305, 903017, 962073, -2583960, 3111167, -5157719, -5007932, -151398, -3905199, - -2936684, -1864016, -3487514, -9117679, -2398739, -4907537, -2196876, -3720516, 1396938, -1560147, - -5419175, 313533, 83215, 977105, -1001801, 2929705, 1453846, 3124052, 339839, -153545, - -1138166, 2150168, 2347200, -1498407, -128312, -874563, 1566053, 192200, -302795, 284542, - -1324997, 1196148, -577136, 505196, 563714, 1083406, 332860, 238908, -82141, 1080184, - 471373, -488553, 495532, -527744, -416612, -307627, 31139, -544924, -251792, -485331, - 471910, -266288, 226023, 1362042, 336081, -375810, -287763, -231391, -2147, 665720, - -392990, 572304, -520228, -9664, -143345, 49929, 144955, -339302, 135828, -16106, - 55298, -269509, 44023, -143345, 92342, -76236, - }, - { - 11827803, -96535296, -20988968, 989453, 254477, -11179263, -7928510, -2356863, -5925445, -346819, - 2814814, -731218, -1264868, -3297998, 1497333, 3189550, -2639258, -3499325, 872952, -5478768, - -7735236, 947040, -405874, -1399086, -269509, -944356, 2429341, 1104344, 2122788, -379031, - 3874597, -7516, -705448, 2296734, 1255204, -2724620, 1438814, 969052, 522375, 3123515, - -1232656, 110059, 3111167, -1313186, 1170916, 2419677, -1633698, -77309, -636192, -970663, - -3170223, 293668, 1018981, 2352032, -1323924, 183073, 1295470, -608275, 2490007, -246961, - -1787780, 417149, -363462, -933619, 137976, -623844, 153545, 97174, 354335, 1199370, - -614180, 464393, -31139, 135828, -490163, -556735, 298500, -65498, 146566, -722628, - -408559, 223338, -615791, -504659, -447213, 48318, -583579, -161061, -82141, 347892, - 201327, 140123, -119722, 270583, 237834, 18790, - }, - { - 1295470, 9687836, 766115, 8556649, -2920578, -1117765, 2793339, -2615098, 2071785, -1250372, - 1118302, 1869921, 507880, 1511292, -6197101, -6299644, -969589, -2433099, 11858942, 4347044, - 9072582, -4400731, -426812, 2539936, 122407, 4776541, -4101157, -1795833, -4170950, -843424, - -418759, -2828773, -3306051, 2740189, 1145146, -1890859, 832687, 344134, -2071248, 246424, - -1483911, 1046361, -2597382, 2547453, -1457068, 313533, 609349, 1323387, 1165010, -1757179, - 2572686, 393526, 185757, -777389, 1737851, 497142, 368830, 586800, -310848, -1546188, - -723702, -653909, 904091, -256624, -34360, -1014149, -282931, 62814, -636192, -375273, - 21475, 97711, -245350, -6442, -245350, 541166, -364535, 7516, -35970, -180389, - -360777, -362388, -259309, -301185, 317291, 214748, -2684, 214748, -192200, 537408, - -46708, 46171, 37581, 206695, -196495, -72478, - }, - { - -4894115, 175148768, 3061775, 3670587, -12068321, -531502, 1335735, -249108, 7013682, 3117610, - 2210298, 2537252, 197569, 2286533, 2978560, 4155381, -3777424, 832150, -89657, -5787469, - 4853313, -1439888, 2167885, -107374, 2467459, -1643362, 2935073, -5008469, 426276, 513249, - 3699578, 1121523, -2117956, 4892505, 1138166, 3038689, -3311420, 815507, 2792266, -3287798, - 1041530, 1153736, -1131724, 2229625, 1891933, 1297617, -2491618, 810675, 695785, 186294, - -2342368, -369904, 29528, -3315178, -627602, -1386201, -1148367, 163209, 104690, 1686848, - -715649, 1232119, 237297, -407485, -743029, -366683, 19327, 141734, 530428, -69793, - 84826, -118648, 164819, -107911, 201863, 229781, -315143, 169114, -241055, -355945, - 162135, -261993, 24696, -414464, 201863, -386547, -58519, -9664, -214212, 12885, - 404264, -38118, -25770, 6442, -30065, 144955, - }, - { - -242666, -32731408, 7166690, -952946, -1351304, -1174137, -1301375, -130997, 1494112, -699543, - 2703682, -2508261, -1399086, -8818105, -10660109, -10005663, -1038308, -2540473, -2679523, 236223, - 4255239, -7432978, -4526359, 9804873, 2614025, 10907069, -7055021, 4437775, 1136019, 3812857, - 2065342, 3331821, -785442, -2825552, -1309428, 2495376, -1555315, 1080721, 1340030, -2299418, - -1519882, -1731409, 1266479, 1550483, 1255741, 102542, -1284195, 1488743, 89121, -88584, - 498216, 1353452, -920197, -416612, -278636, 655519, -275415, -700617, -355409, 3032784, - -709207, 1475321, -185220, 471373, -378494, -204011, -1449552, 1370632, -159988, 590558, - -520228, -51003, 145492, 338766, 136365, -319975, 181999, -161598, 284542, -91268, - -539018, 622233, -67646, 91805, 170725, -443455, 204548, 181462, -11274, 232465, - -80531, 178778, -359167, -134755, 340376, -269509, - }, - { - 21289080, 38065760, -4314295, -17584670, -15117748, 598074, -2598992, 5572183, 1451162, 299574, - -98247, -573915, 980863, 11597485, -6549289, -1665374, -4481799, 499290, -486405, -4410395, - 4282620, 1569274, -1816771, -2764885, -900333, -5718749, 1788317, -4066797, 1139240, 3274913, - 3775276, -1190243, 4067871, 1163399, 1574106, -4321274, -2303176, -1128503, -1891933, 2230699, - -205085, 3293703, 416612, -2800856, -3272765, 2024540, -258772, -1570347, 1460289, -1759326, - -1656247, -1141388, 1607392, -353261, -580894, 158914, -1642288, 605054, -314069, 1005022, - -591632, -95026, 528818, -467078, 1214402, 955093, 368293, -766115, 129386, -588947, - 1189706, -524523, 656056, 366683, 432718, 114354, 93416, -493921, 139050, 795643, - 282394, 114890, -2147, -200790, 42413, -10201, 125091, -489089, 442919, 368830, - -12348, -33823, -16106, 71404, -268435, 10737, - }, - { - 672699, -37949796, -3228742, 229781, 21475, -1939715, -34897, 2882460, -1648194, 1449015, - -2736968, -3117610, -2243584, -4252018, 22085258, -9454834, -1562831, -2636036, -5626407, -8775692, - -7827578, -8613020, -399432, -525060, -4206384, 1150514, 1070521, 3326989, 6201933, 2008434, - 903554, -297963, 4995047, -864899, 1246077, -516470, -899796, -2928094, 1034013, -1818919, - 1401770, -1637456, 639413, 750009, 714575, -1884954, 1217086, 16643, -352724, 404264, - -371515, -621697, -174483, 383863, -519154, -668941, -724776, -1213865, -515396, 913754, - 990527, -387084, 224949, 403727, 265214, 1546188, 258772, 255551, -1619740, -587337, - -626528, 637266, -332323, -182536, -133681, -112743, 212601, 205085, -566399, -430570, - 252329, -219580, -281857, 124017, -440771, -4832, -67109, -105764, 47782, 8590, - -253403, -99321, 142808, -52613, 281857, -151398, - }, - }, - { - { - 9375377, -7703024, 16856672, -14875619, -5719823, -686121, 255014, 1161789, 2615635, 4749160, - -6598681, -1774358, -4641786, -159988, -8370355, -2561411, 3111704, 279710, -1805497, -2431488, - 970126, 5516349, -1290101, -76773, 1330366, -676994, 552977, 226023, 4924717, -188979, - -49392, -2841121, 1923072, -224412, 516470, 2719251, -2309082, 3040837, -1146219, -2869038, - 263604, -163209, -1061931, 867047, 682363, -1246077, 536334, -404801, 217433, 2093797, - 552977, -1554241, -632434, 67109, -1415729, -1387274, -1461900, -542777, 1255741, 277562, - 410706, -712965, -367757, 599685, 1033477, -439160, -592169, 301185, -994285, 63351, - -46171, 95026, 326954, 607738, -216896, 120796, 272194, -86436, -299037, 214748, - 546535, -265214, 58519, 100395, -13959, 12348, 156766, 102542, 211527, 81068, - 104153, 144955, -80531, -138513, -190589, 21475, - }, - { - -2068564, 25906706, -1523103, -2641942, 6611029, -146566, 969589, 1722819, -266825, -6360310, - 4524748, -507880, -2398202, -1669669, -3029563, -1884417, -7660611, 2985539, -6250788, 6257768, - -3623342, -957778, -275415, 2283312, -5822365, 589484, -798327, 6213744, 179315, -44023, - -535797, 1923072, -415538, 2008971, -3077344, 865436, 3527242, -1170916, -1025960, 1848983, - -137439, 957778, 713501, 1261110, -2287070, -2895882, 1372242, -1872606, 619549, -667867, - 685584, 1256278, 2512019, -569083, -691490, -545998, -260382, 324270, 310311, -285078, - 106300, -913217, 1350767, -407485, -4832, 241592, 264141, -187905, -459562, 403727, - -1262184, -818728, 41339, 51540, -540629, 199179, -652298, -27380, 154082, -290984, - -351114, 30602, 235686, -349503, 239981, 157303, -180926, -463320, 13959, 16643, - 86436, -5906, -120259, 463320, -41339, -69256, - }, - { - -1524713, 32131724, -19266686, -13800267, 22395570, 2877628, 2496450, 1633698, 310311, -2213519, - 3179887, -2803003, 3905199, -5662378, -3330747, 8582955, -2453500, 4308389, -4951024, -549219, - 2363843, 14496, -1751810, -52076, -1431835, 676994, 299574, -3269544, -1312113, 1169305, - 65498, -2908230, 2456185, -2336999, -476741, -1454920, 1726577, -1229971, 177167, 1861332, - 2152852, 1186485, -495532, 1610613, 1359357, 1815161, 1638530, 884763, 124554, -614717, - 498753, -403727, -142271, 1417876, -406411, -390842, -1237488, -30602, -790811, 133681, - 297427, 1598802, -16643, 1548336, -241055, -1707250, 165893, 493921, -1296543, 556735, - -11811, 752693, 121333, 77309, 51003, 437013, -374199, 467078, 265214, -24696, - -161061, -99321, -167504, -235686, -304406, 262530, -122943, 111669, -127238, -148713, - 242129, -127238, 204548, 37044, -108985, -244276, - }, - { - -21989158, 18165564, 11307575, 11535745, -6531572, -744640, 533113, 650151, 3168612, 798864, - -427349, -6203544, 4311611, 5879274, 363998, 881542, -873489, -6237903, 1475321, -125091, - 117575, -1285806, 2961917, 104153, -2523830, 942208, -159988, -3616363, 1261110, -2170032, - 5556614, -197569, 11811, 1063541, 865436, 3431142, 3122441, -1122597, 1431298, 932545, - -1414118, -1049046, -2198487, -799401, 687732, 1522029, -1458141, -500901, 1612223, -192737, - 312996, -1869385, -30065, 977642, 424128, 498753, -251256, 74088, -932545, 270583, - -853088, 346282, -629750, 921807, 139586, 756988, -126702, 202937, 159451, 331249, - 87510, 246424, 20401, 518617, -216896, 274878, -356482, -476205, 282394, 242129, - 110595, 199179, 61203, -214748, -149787, -6979, -166430, -295816, -222801, 241592, - -132607, -68719, -415538, 50466, -90731, -155693, - }, - { - 89657, -32839320, 898185, 331786, 574989, -625992, 146029, -1479616, 202937, -2692408, - 1890323, 2869575, -5768141, 4179003, 4295, 1219771, -11086384, -945430, -10419054, 919660, - -9620190, -5420786, -1247151, 4929012, -4663798, 8167417, -4290136, 3306051, -4555887, 352187, - -4051228, -8378408, -1954210, -1885491, -2567854, 0, -4084514, -1147830, 540092, -379568, - -651224, 1266479, -365609, -166430, -2089502, -1420024, 577136, -825171, -467615, -83752, - 1020592, 11811, -602906, -1149441, 460098, -970663, 880468, 632434, -864362, -580357, - 324807, -705985, -133144, -403727, 1278827, -496606, 57982, -883690, -908386, 324807, - -90194, 940598, -336081, 311385, -155156, 11811, -234613, -128849, 287763, 368293, - -249645, -60130, -327491, 290984, 135291, -214212, 248571, -74088, -278099, 180389, - 285615, 610422, -100395, 215822, 169114, 420370, - }, - { - -24588150, -30686468, -15333033, 33062122, 4126390, -2505577, -2434173, -7467338, -1217086, -1536525, - 3199751, -1762010, -4032974, -3626563, -2725694, 3496640, 2600066, 1550483, -812286, -337692, - 5477694, -810138, 1186485, -1636383, -2653753, -1033477, 1006096, -1811403, -782221, 1901597, - 3424163, 139586, -542777, -2215666, 1197222, 1567663, -1771674, -602369, 1421097, -831613, - -2267743, -103616, 1021129, 82678, 601295, -1189169, 838056, 1923609, 1545651, 275415, - -1654099, -542240, -1664837, 568009, 914291, -394600, -204011, 166430, -241592, 532039, - -364535, -668404, 270583, 763967, 460635, -295816, 5906, 290447, 555125, 120796, - 364535, -348429, -561567, 451508, -389768, 224412, 326954, 249645, -78383, -272730, - 88047, -480499, -107374, 381715, 96637, -11274, 133681, 6979, -49392, 314606, - -191663, -47245, -96100, 83215, 214748, 30602, - }, - { - 333397, 11041287, -38655, -1515587, -935229, -472983, 219580, 203474, -1713155, 212064, - -2196876, -1257889, 432718, -3504693, 2625299, -2577517, -1343788, 1663226, -1735704, -7738994, - 2887829, 1029182, 9149891, 5737003, -9614821, -4866198, -6813429, 1283658, 1621350, 18254, - 3433826, -2793339, 845572, -1625645, -947577, 5030481, -2520609, -1408212, -3046743, 253403, - 882616, -2730526, -993748, 1791538, 535797, 1917703, 147640, -1094680, -433255, -431644, - 174483, 17180, 339839, 661962, 563178, 45634, 1218697, 45634, 496069, 997506, - -405338, 82678, -209917, 488553, -758062, -124554, 486942, 891743, 279173, -593779, - -1132798, -258772, 556735, 92879, 185757, 255551, 42950, 301185, -324270, 607201, - -404801, -359704, 1611, 132607, 86973, 129923, 146566, 67109, 37581, -299574, - -5369, 96100, 201327, 68183, -250182, -78383, - }, - { - 22140556, 14825690, 13077102, -33357938, -1233729, -2556043, -212601, -760746, -486942, -409633, - -1973538, -1476395, 5114769, -1133871, -4269198, 2320893, -3229816, -748935, -1918240, 1043140, - -668404, 2293513, -5038534, 696322, -6657736, 2077154, 958315, -2203318, 1977296, 216359, - -1477469, -2161979, -230854, -1103807, -482647, -1766305, -2645163, 229781, -2747705, -3065533, - -974958, 1150514, 637266, -2244121, 589484, -1789928, 436476, -4735739, 832150, 995896, - 506806, -1655710, -1265405, -15569, 956167, 961536, 271120, -1733556, -281857, -379031, - -571231, 615791, 1007170, 241055, -251256, -306016, 167504, -99321, -531502, 1341640, - 267362, 38655, 321586, 92342, -170188, -576599, 338229, 556735, -164283, -104153, - -184147, -42950, -128312, 24159, 85899, -23085, 635655, 130460, -463856, 10201, - -198105, -61740, 118112, 105227, -2684, 10737, - }, - { - 137976, 5055714, 2508798, 1202591, -668404, 569620, -1245004, 1267015, 944893, -1004486, - -3265249, 4456566, -2154463, 5396090, -4009352, 3016678, -4246112, -7683160, -2826625, -4261682, - -1643362, 2605972, -10161356, -5275831, -1242856, 52613, -4417911, -657130, 37581, -4587025, - -2850248, -415538, -1278827, 1203128, -1073205, 379568, 2188823, 3137474, -1229971, -1224066, - -31675, 4516158, 1383516, -1416802, -211527, 1418950, 1243393, -1776506, 429497, 200253, - 409633, 140123, 40802, 663572, 255551, 752156, -359167, 770410, 774705, 557272, - -287763, -138513, 518080, -187905, -887985, -340913, 16643, -541703, -653909, -670015, - 354872, -780610, 1168768, 765041, 399432, 204548, -722628, -272194, 551903, 366146, - 162135, -74088, -457951, -19864, -76773, -44023, 130997, 96637, -339302, 379031, - 34897, -330712, -187368, -215285, 369367, 234076, - }, - { - -10801843, -112000936, 16863652, -4826470, 2937758, 2287607, -26201448, 1947231, -3799972, 4235912, - -4310000, 1815697, -162135, 725850, -604517, -1921461, -790274, -3505230, 2290828, -5895380, - -4190814, -1665911, 440234, -2286533, -956167, 175557, 4331475, -2098092, 3207267, -2001455, - 4189741, -1719598, 2547989, 2483565, 1511829, -248571, 975494, 55835, 1643899, -273267, - 370441, 1897302, 2504503, -1199370, -496606, 3140695, -1378148, 1082332, -1446330, -202937, - -860067, -1511829, 2317135, 2363843, -2120640, 491774, 1444183, 1327682, 617402, 285615, - -1396401, -820876, 1372242, -1897839, -367757, -161598, 81068, -406411, 262530, 1093069, - 253403, 16643, 186294, 54224, 82678, -664646, 246424, -9664, 2147, -472446, - -542240, -294205, -459025, -78920, -228707, -210453, -93416, -181999, -6442, 398895, - 178241, -54761, 6442, 278099, 173946, 144955, - }, - { - -865436, -1763621, 14794015, -1753420, 2761664, 1395864, -1047972, -4207458, 3653944, -2103460, - 3583077, -2616172, 3155727, -2064806, -1585380, -5811628, -9473624, 1351841, 6634651, 10201621, - 4537096, -4706211, 2624762, 587874, 4897874, -5577015, 3925063, -2944200, -3870303, -4206384, - 457414, -2816425, -1670742, 2471754, -649077, 970126, -1570884, 299037, -2100776, 95563, - -3009698, -534187, 945430, 341450, -201327, -158377, -18254, 704375, 1378685, -830539, - 2171106, 352724, 286152, -127775, 785442, -452582, 1222992, 1091995, -763430, -955630, - -14496, -954020, 854699, -1165010, 152471, -576599, -447213, 334471, -409096, -6979, - -180926, -424128, -115964, 126702, -379568, -66572, -13422, -147103, 51003, 102542, - -812823, -246961, -133144, -282931, 194347, 156229, -18254, -127775, -113280, 169114, - 170188, 328565, -103079, -25233, 196495, -105764, - }, - { - 34209416, 127855272, -10086731, 3004867, -9673877, 1051730, -2407329, 971200, 5604933, 7978439, - 1350767, 412317, -952946, -2846490, 10204305, 558883, 2120640, -637803, -2425046, 4482335, - -3934190, 602906, 1225676, 3139621, 1082869, 896038, -875100, -3371549, 119185, 889595, - 3759707, 627602, -830002, 763967, 5060545, 2908767, -4058744, -235149, -506806, -438624, - -90731, 2078227, 975494, 2434173, 2978560, -1273458, 125628, -883690, 1234803, -1662689, - -1286880, -2194728, 1826435, -3008088, -659278, -1714229, 340913, -741956, -318901, 768262, - 1337882, 714038, 570694, -180926, -215822, -1293322, 190052, -65498, 584652, 373662, - -271120, 129386, 268972, -484794, 81068, 657667, -178241, -183610, -75162, -563178, - -4295, 116501, -377420, -6442, 177167, -396211, 107374, -20938, -5369, 10737, - 110059, 409096, -1611, -119185, -111132, 355945, - }, - { - 680752, -25341918, 1859721, -8660802, 1239098, -328028, -32212, -4860293, 2334852, 2028298, - -1407676, -1183264, 1483911, -11480448, -9680856, -1160178, -9487583, -2658048, 226560, -1173063, - -3111167, -3064459, -737661, 9604084, 6669548, 1877438, -555125, 4609574, 2174327, 3108483, - 6204617, -171799, 1839857, -2404108, -923418, -870805, 446677, 818728, 1558536, -2393371, - 242129, -2386391, 955630, 3411815, 545461, 846645, -1354525, -507343, 2313914, -72478, - 1400159, 299037, 501974, -1837172, 60666, 590558, 833761, -711354, 151934, 1563905, - -14496, 1112397, 1282585, -1104344, -274341, -145492, -827318, 628676, 258772, -456877, - 439697, -516470, 467615, 414464, 510027, -34897, -244276, 562104, -237297, -135828, - -212064, 244813, -249108, -370978, 523449, -240518, 201327, -43487, 18254, 168577, - 24696, 24696, -31139, -118648, -228170, 31675, - }, - { - -6262063, 69701952, 3873524, -21772800, -4933844, -1402844, -6950331, 4643397, 1662152, 5085242, - -5530844, -46171, 2926483, -4408784, 17994302, -3002182, -5904507, -2310693, -3311420, 1669132, - 2680060, -608812, 1648194, -2024540, -3637301, -765041, -2888903, -1478006, 138513, 3009698, - -164283, 1882269, 4010426, 1939178, 538482, -645319, -2645700, -3690988, -2132451, 3054796, - -2280628, 3659312, 1685238, -1865626, -2330557, 395674, -1731946, -137439, 114890, -780073, - -2275796, -522375, 1222992, -1036698, -608812, 83752, -675921, -363462, -190589, 55835, - 435402, -911070, 549219, -45097, 861141, 248034, 351650, -238908, 172872, -395674, - 348429, 112743, 964757, -222801, 372588, -140123, 215285, -676457, 261456, 477278, - 507880, -121333, -236760, 44560, -284542, -136365, -99321, 248034, 363462, 206695, - -85899, -397821, 204011, -144955, -261456, 38118, - }, - { - -668404, -39142184, -93416, 2997350, -2992519, -1340030, 2244657, -1296543, 2519535, -1051730, - -4541391, -1984812, -3428458, 13954349, -12496744, -3573950, 639950, -2145873, -7113540, -3900904, - -6962679, -11757473, 905701, 1199370, -4511863, 243739, 335007, 5844914, 4541928, -2238215, - 2321430, 666794, 3082176, 557272, 1602023, -583579, -3403225, -578747, 919123, -744640, - -2617783, 2303713, 694174, 577673, -1650341, -1328756, 2154463, -897648, 633508, 133681, - -38118, 149250, -903554, 965294, -1080184, -1101122, -122943, -1357210, -362388, 715649, - 1689533, 353798, 549219, -170188, 353798, 1448478, 218506, -338229, -665183, -329102, - -480499, -294742, 296890, -11274, 417686, -259309, 160524, 157303, -172872, -452582, - 64425, -192200, -602906, -16643, -129386, -177167, 13422, -19864, -118648, -263604, - -266288, 27917, 300111, 9127, 136365, 157840, - }, - }, - { - { - -11457362, -89982248, -50322520, -3307125, 5466420, -202400, -659278, 650688, -275952, 5541582, - -2870112, 3014530, -5375689, -3140695, -9424232, -1068373, 8347269, 3494493, 4612258, 7119445, - 2115272, 3343095, -834834, -692564, 1211181, 1735704, -444529, -2883534, 492848, -2900177, - -80531, -408022, 5795522, 674847, -1411971, 794032, -4493610, 2771865, -2511482, -5195300, - -2951716, 700617, -906238, -1839857, -50466, -1648731, -996432, -2506650, -905164, 416612, - -791348, -1807108, 1443646, 1927367, -483721, 263604, -118648, 194347, 744640, -157303, - 1365263, 105764, -105764, 440771, 1443646, 316754, -394600, -90194, -413927, 695785, - -115964, -684510, -638340, 753767, 402116, -54224, 126702, 204548, -147103, 352187, - 400506, -315143, -234076, -25770, -227096, -230854, 194347, -10737, 373125, 252329, - 52076, 31675, 49929, -41876, -49929, 271120, - }, - { - 1274532, 17466022, -12073153, -12280385, 1887101, 25233, 1374390, 236760, -3502009, -6259915, - 5396090, -679679, -2915209, -641561, 801548, 6442988, -1450625, 2901787, -4469987, 2781528, - -2581812, -5058935, -2627446, 1437740, -8278550, 782221, -2469606, 6609418, 1393717, -1196148, - 1329829, 5088463, 495532, 3963181, -1277216, 2687039, 3384971, -2805151, -3462818, 1448478, - 513249, 1037235, 774705, 91805, -1468879, -19864, 2332704, -1619740, 559956, -1085553, - -13422, -678605, 1521492, -507343, 23085, -717796, -1035087, 20938, 557272, 539018, - 869194, -872952, 628139, -1130113, -181999, -1144609, -1831804, -667331, -6979, 551366, - -702764, -198642, 95026, 96100, -688805, 443992, 226023, 328565, -390842, -448287, - -48318, -137976, -11274, -489089, -221728, -139586, -384400, -337155, -48855, 67109, - 86436, 17180, -155156, 392990, 45634, 38655, - }, - { - 4035122, 68698536, -2807835, -45866492, 2555506, 3117610, 872415, 2020782, 5072357, -3652333, - -12271258, -11909944, 2696166, -10669773, -4133369, 5922760, -8255464, 820339, -3022046, 671089, - -3033858, -4341675, -2427730, -284005, 5278515, -1213328, -2827699, -3221762, -3148211, -1251983, - 583042, -5007395, 1652489, 824097, 1035087, -2195265, 1070521, -471373, 271657, 2356863, - 1040456, -3143916, -55298, 2875481, -14496, -1023813, -70867, 496069, 173409, 81068, - 1966558, 593242, -950798, -943282, -1513439, 738198, -816581, -1068373, -2048163, -672699, - -41339, 1569274, 512175, 1204738, -282394, -1247688, 198105, 983548, -865973, 437550, - -147640, -332323, -810138, -282394, 117038, 389231, -919660, -133681, 331249, 139586, - 131533, 226023, 78920, -19864, -352187, 158377, -84289, 221191, -96637, -231391, - 124017, -413927, -30065, -130997, -118112, -133681, - }, - { - 30370250, 87747792, -2608119, 15194521, 7772280, -2020245, 903554, -2233920, -599148, 38655, - 2149631, -5949604, -4736812, 543850, 2318746, 2511482, 3248606, -4550518, -616865, -1239635, - -1071594, 727460, 4638028, 1239635, -2170569, 2125472, -2081985, -4017405, 2703682, -2032593, - 2044404, -3248606, -2863133, 431644, -99858, 1012539, 1527935, -1302449, 418759, -572304, - -673773, -552440, -1567126, 380105, -169651, 353261, -82678, 1576790, 789737, -1184874, - 422517, -364535, 441308, 1480690, 11811, -424665, -183073, 772020, 71941, 911070, - -646393, 625992, -1611, 33286, -416612, 1039919, 104690, -234076, -639413, -154619, - -42413, 141197, -400506, 413391, 23622, 108448, -408022, 41339, 511101, -79994, - -424128, -77309, 98247, -166967, 2147, 37044, -83215, -80531, -220654, 73551, - -140660, 26844, -335007, 239444, 184684, -28991, - }, - { - -756988, -38426000, -4110821, -1714229, -498753, -1226750, 78383, -1580548, 1207423, 666794, - 4022237, 5120138, -129923, 2962991, -2629594, 10431939, -8878234, -22157200, -13646185, 6704444, - -10561861, -1384053, 75699, 4707284, -257698, 6330245, -3720516, 5810554, -2062658, 2739652, - -1285806, -8800925, -4044249, -3121368, -3319473, 1975685, -1106491, 12885, 3028489, 1923609, - 104153, -536334, -1102196, 1085553, -130460, 235149, 527744, -2699924, -1678259, 448824, - 1644973, 488553, -548682, 99858, 987306, -999654, 401043, -420907, -972810, -594853, - 923955, 236760, 179315, 29528, 829466, -398895, 607201, -163209, -396211, -9664, - -389768, 205085, -589484, -91805, -555661, -180926, -89657, -90194, 463856, 184147, - -503585, 315143, -244276, 76236, 151398, -376347, 519691, 228170, -85899, 199179, - -130460, 431107, -178778, 83752, -70867, -48855, - }, - { - 33094334, 78980152, 8528194, 19462108, -9596568, -702764, 239444, -3903052, -5034239, -11853573, - -3686156, -3477313, -2987687, 132607, -606127, 5776194, 3339874, 402116, -960462, -3045132, - 998043, -317291, 919660, -3637837, -2829847, -2489471, -592706, 42413, -618475, -1189169, - 380641, 921271, 3688840, 261456, 308701, 784368, -941135, -135291, 3013457, 1406065, - -831613, 801011, 971200, -964757, -136365, -412317, 933619, 1007707, 1480153, 58519, - -828392, -908922, -2108292, -1516124, 1546725, -102542, -48855, -647466, -1038308, 485331, - 285078, -478352, 1114544, 1833414, 92342, -779000, 37581, 231391, 1262184, 455803, - 465467, 693637, 270046, -93952, -17180, 199716, -301185, -13959, 139586, 334471, - 442919, -297427, -253403, -60130, 43487, -121333, -200253, -285615, -266825, -69256, - -108448, -41339, 22549, 226023, 89657, -48318, - }, - { - -487479, 8890582, 2421288, 1271847, -17717, -1229434, -155156, 1478543, 486942, 155156, - -3503620, -657130, 1904818, -5176510, -1353989, -2457258, 7314866, 3360275, 2692408, -6060736, - -1544041, -5486284, -6744710, 3246995, -2820720, 4034048, -5756867, -1848447, 1309965, 1858647, - 1444183, -6858526, 818728, -1909113, -889595, 3535832, -5074504, -1362578, -2348810, -265214, - 153008, -586263, 869194, 1400696, -1771674, 274878, -114890, -680215, -860604, 267362, - 1497333, 745714, -147640, 570694, 1648731, 91805, 1769527, 151398, -948651, -239981, - -256624, 767725, -489089, 18790, -798327, 292058, 159451, 95026, 418222, 190052, - -486405, -293668, 533650, 700617, 212601, 34897, -286152, 194347, -30602, 938450, - -723702, -549219, 380641, 458488, 173409, 206158, 304406, 18790, 96100, 136902, - -81068, -222801, -62814, 87510, -206695, -124554, - }, - { - -19469086, -99778536, -31398358, -21603686, 7414724, -751082, 6367826, 6271726, 5450851, 2470680, - -1014686, -3386045, 2764885, -4587562, -9627169, -21475, -5789616, 1243393, -6659884, -1384053, - -3616899, -2697776, -7051800, -1001264, -7810398, 1136019, -137976, -3866544, 142808, 526670, - 3060164, -427886, -2623688, -4857071, -3138547, -4631586, -6334540, -308164, -2558727, -2861522, - -289373, -157303, 939524, -31675, 1588601, 1611, 1851131, -3173444, 1967095, 773094, - -510564, -944356, -1461900, -870805, 44560, 1029718, 923955, -403190, 1481764, 702764, - 69256, 548682, 536334, 550293, 372588, 556735, 336618, 453656, 387621, 1119376, - -210990, 241055, -25233, -184684, 527744, 6442, 40265, 223875, -10201, 73014, - -78383, -202937, -458488, -76236, 376347, -62814, -28991, 74625, -133681, 206695, - 87510, -42950, -33823, 170188, -18790, -192200, - }, - { - -723702, -3084324, -1292248, 86973, -1674500, 1291711, -580357, -1162862, -1822677, 1673964, - 1167694, 7584376, -3095061, -1491964, -7067906, 3449933, 11922829, 4072166, 2637110, 2552284, - -95026, 3811247, -4955319, 753230, 2008434, 12839805, 4925254, -1576253, -3634616, -2767570, - -3808026, -2165737, -445603, -3566434, -2288681, -634581, -1950452, -494458, -1126892, -861141, - -1154809, 3462818, -793495, -1268089, -2684, 1085553, 1457068, -146566, 1113470, 1307818, - 1706713, 1611, 379568, 1305133, -600759, 164283, -523986, -447213, -635118, 479963, - 222265, -96100, 543850, 845572, -84826, -252866, -77309, 162672, 88047, -505196, - 928250, 29528, 1117765, 463320, 35433, 140660, -226023, -27917, 541166, 176631, - 259846, -191663, -341987, 89657, -171262, -94489, 188979, 258235, -482110, 130460, - -111132, -279710, -346819, -219580, 279173, 118648, - }, - { - 9314710, -134149544, -13415867, 9664213, 11344619, -8732742, -25824028, 4995584, 5719823, 6718940, - -5823439, 6706592, 7098507, 1764695, -1531693, -666794, -3732864, -2096481, 3955128, -1810329, - -3420942, -1804960, 1853815, -4087198, -6698002, -324807, 4221416, -2234994, 3412889, -2747169, - 4931696, -1447404, 492311, 1495722, 3403762, 4240207, 4994510, 1765768, 808528, -3323768, - -97174, 3249680, 1517734, -636192, 1690607, 2852932, -2049236, -346282, -2178085, 1698660, - 2159832, -2309619, 540092, 1206349, -2523293, -175557, 312459, 829466, 53687, 779537, - -1226750, -1545651, 1263257, -1409286, -1348083, -1029182, 613107, -726386, -150324, 911070, - 121333, 137439, 336618, 135291, 423054, 130460, 191663, 14496, 559956, 212601, - 145492, -205085, -297963, 355409, 263067, 126165, 117575, -246961, 6979, 175557, - -82678, 159988, 99321, 67646, 151398, 352187, - }, - { - 467078, -19673634, -10503343, -8313446, 5987185, -2104534, -5446019, -4232691, 2940442, -2997887, - 2980171, -1416266, -515933, -2080912, 289373, -5065377, -3883724, -295279, -3049427, 5727339, - 2276870, -6158446, 4631586, -4415227, -229781, -8771934, 1432909, -1057099, 1160715, -853088, - 166430, -641024, -1576790, -1309428, -1654636, 2525978, -1810329, -469762, -2973728, 801548, - -530965, 306553, 1295470, -776852, -467615, -356482, -867047, -1038845, 96637, -1293322, - 668404, -171799, 23085, -11274, -84289, -1476932, 271120, 415538, -747861, -324270, - 838592, -1000727, -309238, -1918240, -752156, -134218, 190052, 523986, -82141, 568546, - 439697, -66572, 61203, 40802, -423054, -178778, 262530, -227633, -450972, 191126, - -328565, 62277, 288837, -23085, 121333, -55298, 155156, -86973, -57445, 38655, - -5906, 223338, -20938, -16643, 79994, -180389, - }, - { - -44754632, 23427436, -9914395, -4918275, -11890617, 4257923, 1794223, 488553, 45097, 9686225, - 7372848, 752156, 3299072, 2030983, 12763569, 1392106, 8750459, 3440269, -5027259, 3121904, - -4397510, 1180579, 674310, 3008088, 1729798, 6030671, -1785096, -1095754, 466004, -310311, - 2286533, -2860985, 100395, -382252, 2873870, 2870649, -1036161, 1322313, -923418, 1714766, - -906775, 2253784, 4633196, 4456029, 1091459, -506269, 2502355, -634045, 1192927, -852014, - -797253, -1216013, 2408940, -1683090, 1093069, 310311, -64961, -955093, 479963, -130997, - 1695975, 310311, 338229, 18790, 750009, -565325, 570694, -15569, 332860, 850404, - 118112, 74088, 292058, -384936, -209380, 497679, 63888, -38655, 122943, -332323, - 170188, 105764, -143881, 267362, 384400, -175020, 27917, -121333, 141197, 153545, - 19327, 306553, 62277, -171262, -273804, 374199, - }, - { - -910533, -17472464, 3337190, -14734422, -2136209, -1879048, 3076807, -3770981, -2636036, -185757, - -6701760, -3228205, 2362769, -4666482, -1238024, 5216775, -6852621, 1619740, 5054103, -4444755, - -3682935, 4682588, 5953899, 4503273, 4310537, 3898220, 4460324, 2956548, 2378338, -1071058, - 5111011, 603443, 2216740, -1880659, -1165010, 40265, -67109, -1567126, 1823214, 1342177, - 697395, -3033858, 348966, 3895535, -925029, -1904281, -1920924, -1532230, 1704028, 1188632, - 3592203, 215822, 78920, -2390149, -1135482, 57982, 1175210, -450972, 70330, 547608, - -613643, 172336, 281320, -1194001, 469225, 220117, -13959, 494995, 203474, -492311, - 491774, -323733, 1062468, 393526, 755377, 27380, -617402, 168041, -304406, -132070, - -270583, -94489, -509491, -531502, 361851, -126702, 195958, -229781, -253940, -191663, - -162135, -58519, 50466, 52613, -209917, -69793, - }, - { - -10340134, 66593468, 7887171, -5986111, 13765370, 4304094, -6426882, 5126044, 3957812, 5549635, - -6374805, 1607392, 4056060, 1180042, 34241628, -1335198, -5602248, 521839, 487479, 4147865, - 3368865, -4577362, 1768453, 2147, -5681705, -1245004, -990527, -1838783, -2269890, 519154, - -4076461, 1055488, 3605088, 2967823, 1967095, 1279363, -16106, -2116882, -1269700, 2217814, - -2521683, -172872, -178778, 1267552, -190589, -473520, -875636, 2174327, 497142, 268435, - -454193, -300648, -1340030, -2601677, -277562, 537, -740882, 452045, 1056025, -3758, - 527207, -539018, 335544, 289910, 1124208, 69256, -78383, -200790, 198642, -548145, - 351650, 686658, 399432, -831076, -170725, -253940, 83215, -363998, 101469, -59056, - -65498, -189515, 234613, 59056, -146029, 30602, -301185, 222265, 79457, 117575, - -12348, -306016, 28991, -235686, -226023, -66572, - }, - { - 804233, -27578522, 5862631, 2668785, 615254, -822486, 1931125, -1147830, 1862942, -908386, - -2296734, 3985193, -3088618, 1852205, -25380572, 4345433, 5291400, -1577864, -2435783, 1702418, - 875100, -8303246, 2215666, 1709397, -3111704, 2690260, -1822677, 1577327, -523986, -9877888, - 362388, 3136937, 1474248, -2675765, -432718, -1309428, -2446521, 257698, 594853, 513249, - -1884417, 589484, -1670742, -195421, -2177012, -1016834, 1852205, -1995549, 894427, 1257352, - 46708, 275415, -1571421, 199179, -1394791, -603443, 581431, -231391, 743029, -127775, - 541166, 64425, 237297, -648540, 375810, 545998, -863825, -1071594, -159451, 521839, - 584652, -465467, -349503, -447750, 235686, -123480, 125628, 430570, 367757, -216359, - 302795, -81068, -326418, 227633, 328565, 94489, 506269, 334471, -203474, -187368, - -135828, 14496, 41339, -110595, -100395, 144418, - }, - }, - { - { - 10678362, -82407000, -70637176, 13256417, -10868415, -70867, 3263102, 1279900, -4611185, 4893042, - -1235877, -4083440, 3999152, -4863514, -7488813, 5181878, 700080, 1792612, 8396661, 5357972, - 1539746, 3725347, 897648, -1701881, 872415, 1435056, 860067, -1911261, -3454764, 437013, - -2718714, 3403225, 4726075, 335007, -2908767, 3060164, -4036733, 3983582, -5940477, -1567126, - -2886755, 415538, -1080184, -1822677, 1081258, -1877975, -2692408, -2143726, -490700, -1410897, - -877247, -1474784, 1564979, 1187022, 1408212, 5369, -234076, 1221381, 556735, -86436, - 779537, 763967, -179852, 124017, 259846, 885300, 597000, -968515, 182536, 376883, - 143881, -697932, -760209, 150861, 832150, 155156, 93952, -292595, 235686, 322123, - -82678, -293132, -89657, 267899, -113817, -216896, -107374, 73551, 228170, 299574, - 240518, -125091, -41339, 304943, -217433, 309775, - }, - { - 607201, -14942191, 12894566, -7234336, -4172561, -452582, 270583, -776315, -4630512, -1126892, - 3053185, -885837, -1666984, -3645354, -1805497, 6988449, 3428995, -1385664, 7041599, -4951561, - 1874216, -12540231, -372052, 591632, -4119411, -1785096, 673773, -261456, 5635534, 1159104, - -2349347, 5075041, 1658394, 2501282, 2554432, 1043140, 1198833, -1438277, -3350611, 2754148, - 1300301, -1579474, 751082, -410169, 701153, 1482301, -323733, 450972, -216359, -2448131, - 226023, -297963, -58519, -386547, 467078, -332323, 100395, -1169842, 1313186, -172336, - 479963, 69256, -680215, -735513, -365609, -516470, -1683090, -1090922, 471373, -158914, - -379031, 230318, 195421, 135291, -548682, 158914, 584116, -6442, -670015, 304406, - -220654, 30602, -329639, 9664, -644782, -226560, -266288, -239981, 79457, 47782, - 63888, -15032, -68719, 81068, 24159, 108448, - }, - { - -5484137, 91242288, -3514894, -31868658, -13865228, 2713346, 4460324, -898185, 1938104, 628676, - -16474958, -4394826, -2646774, -9923522, -2942590, -2731599, 2179159, -9104257, -273804, -424128, - 1497333, -7628399, 1701344, -2649995, 6013491, -139586, -2038499, -6250788, -383326, -2207613, - -227096, -2263985, 1342714, -2301566, 1714229, 1514513, -2711735, 1110786, -1320703, 1697049, - 3573413, -4762045, 3000035, -29528, 1137630, -2740726, 710817, 468688, 914291, -176094, - 1342714, 722091, -424665, -1341104, -1693291, 545998, -108985, -1358820, -1175210, -655519, - 95563, -507880, 1626719, 262530, 57982, -337692, -161061, 467615, 616328, -503585, - 27380, -598074, -885837, 23085, 204548, -315143, -518617, -424665, 113280, 299037, - 535797, -146566, 445066, 31675, -96100, -286689, -60666, 77846, 297963, -244276, - -189515, -5369, -200253, -136902, -133144, -77846, - }, - { - -25880936, 150172992, 17743584, 10232223, 1393180, -2275259, 2236067, -4235375, 213675, -1581622, - 4039417, -2678449, -10755135, 2916283, 9874667, -3321620, 1292248, -4446902, -3328063, 3293166, - -3376381, 2165737, 1435056, 3876745, -5165772, 2127620, 612570, -3213173, 1355062, 617402, - -898722, 1503775, -5157719, -287226, 1284195, -3470871, 721018, -230318, 1225139, -1759326, - 632434, -724239, 1380295, -2413235, 819802, 643171, 449361, 899796, -1600949, 862752, - -839666, 874026, -933619, 2401961, -687732, 897111, -387621, -756988, 1420560, 21475, - -295279, -414464, 898722, -557809, -50466, 418222, 566936, -222265, -665183, -290984, - 170188, -185220, 121870, -467078, 548145, 102542, -369367, 613643, -193810, 162135, - -434865, -323196, 48318, 62814, -102005, -13422, 42950, -277562, 284542, -286689, - -108448, -6442, -165893, 176631, 86436, 27380, - }, - { - 1340567, -34415572, -7325604, -1839857, -633508, 92879, -1353452, -2936684, 2356327, 223875, - 2996277, 9156870, 789200, -2522757, -11902965, 12811887, -5652177, -19478750, -2701535, 10397042, - -6567005, -4011500, 6652905, -1206349, 2858838, 3449396, 7029251, -3292629, 1081795, -1720671, - 2913062, -4442607, -6128382, -1199907, -3011846, -944356, 4625680, -3534221, -424665, 4054986, - 754841, -340913, -439160, -409096, 1253594, 1281511, -1452236, -603443, -1888712, 154082, - -324270, 2036351, -508417, 486405, -475668, -122407, 96637, -905164, 31675, -1607928, - 282931, 1540283, -468151, 617402, 473520, -290447, -288300, -64425, 558883, -903017, - 453119, -380641, -237297, -279173, -481036, 42950, -89121, -299037, 580894, -127238, - 43487, -360777, 179852, -93416, 219580, -477815, 484258, 315680, -102005, 315680, - -217433, 180389, 40265, -167504, 18790, -280784, - }, - { - -22552336, 187826432, -13705241, 4410932, 1460826, 909996, -426276, -1532767, -3920232, -4791036, - -13197898, -226023, -7643431, 1741609, 1634235, 2767570, 5537287, 1584843, -3103651, -385473, - 724776, -3751654, -914828, -4581657, 715649, -3407520, -925029, 2365453, -800475, -1084479, - 483184, -351650, 6227703, 2313377, -3127273, 206695, -2303713, 860067, 4635344, 483721, - 919123, 378494, 161061, -466541, -1451162, 2237141, 287226, 492848, 2529736, -354335, - -28454, -2269353, 416075, -2683281, 1573032, -348966, -1068373, -1388348, -1329292, 762894, - 1690607, -724776, 1191853, 1159641, 504122, -794032, -1074, 382252, 1015223, 563178, - 755914, 107911, 650151, 289910, -74625, -268435, -535260, -131533, 505732, 335007, - 431644, 198105, -270583, 119185, -217433, -120259, -287763, -396748, -212064, -299037, - 94489, -201863, 103616, 346819, 69793, -158914, - }, - { - -249645, 5381057, 2724620, 1905892, 457414, -722091, -732292, 1257352, -132070, -242666, - -814970, -2501282, -1263257, 2079838, -8595840, 3339874, 9873593, 3382287, 7757785, -7641284, - -660888, -5801964, -7888245, 1454383, -962073, 3148211, -3061775, -1883880, 2513630, 1039382, - -1733556, -4748623, 3418794, -5926518, 1259499, 867583, -4258997, -1801739, -2185602, -587337, - -822486, 1566589, 590558, 443992, -919123, -992137, -1356673, 251256, -1083942, 298500, - 1214402, 915365, 1469416, -325344, 892279, 734976, 1233729, -804770, -660351, 265751, - -876173, 975494, -245350, -81604, -596464, 1272384, -1009854, -108448, 192737, 558883, - 554588, -373662, -157840, 444529, 451508, 98784, -586263, 178778, 172336, 326418, - -135828, -519691, 198105, 255014, 323733, 277025, 213675, 119722, -2147, 356482, - -30065, -310848, -67109, 205085, -274878, -156766, - }, - { - 6436546, -193885568, 15567109, -14799920, 53150, 294205, 6822019, 2194728, 9789304, 4210679, - -1834488, 1068373, -1451162, -2752537, -8307004, -1276679, -3802120, 2313914, -7672959, -4602058, - -1455457, -1962263, -5907191, -3803194, -3182571, -1792075, 1996623, -3266860, 545998, -1679332, - 4414153, -1632088, -1643362, -4147328, -3293166, -5450851, -6134824, 471910, -1654099, -3389266, - 1719061, -1353989, 1734630, -280247, 845572, 1313723, -380641, -515396, 1611687, -1320703, - -377957, -365609, -1848447, 1198296, -1000191, 1518808, -17717, 503048, 1608465, -307090, - 854699, 1010928, -19864, 25770, 136902, 1519345, -238371, 574452, 656593, 781147, - -534187, 25233, 164283, -389231, 179852, 491237, -5369, 10737, -27917, 143345, - -16106, -134218, -765041, 75162, 627602, -134218, -98784, 96100, -56371, -82141, - 216896, -10737, -16106, -7516, -4832, -20938, - }, - { - -253403, -3357054, -3848828, -1131187, -1321776, 1738925, 457414, -332860, -4181151, -492311, - 4256850, 4043175, 5416491, -7912941, -6552510, 8363375, 12545599, 1466195, 2698850, 548682, - -2865280, 5906654, -4679904, 4226248, 2090039, 9247065, 10152766, -5874442, -6751152, -970663, - -1158567, -4932233, 1397475, -3870303, -118112, -1014686, -3006477, -2350958, 321586, 1403917, - -2694555, 234076, 475668, 427886, -1118839, 2288681, 309775, 1918777, -1504849, 2263985, - 843961, 767189, 736050, 1270774, -2238752, 446677, 1118839, -2156611, 12885, 553514, - 533113, -95563, 171262, 432718, -257161, 373662, 209380, 266288, 97711, -317828, - 573915, 590558, 843961, 105227, -74625, 198105, -120259, 168041, 112206, 283468, - 276489, -379568, -16106, 311385, -277562, -223875, 49392, 209917, -357019, -91268, - -62814, -258235, -268972, -13959, -48855, 83215, - }, - { - -8198556, -175519744, 42853572, 16414291, 10428717, -34012920, -4621922, 2957085, 9659918, -2034741, - -729071, 10153840, 7241315, -579821, 954557, -7614977, -1397475, 2209224, -5555004, 3566434, - 336618, -2977486, -3084860, -1909113, -8178155, 792958, 2642479, 1981054, -1674500, 315680, - 5763309, -1607392, 563178, 1904818, 852014, 6044093, 2656437, 3980361, -1763084, -490163, - -1185948, 2372970, 1195612, -434865, 3653944, -1267015, 542240, -1781875, -1136019, 872415, - 1613834, -525060, -1479079, 151398, 352187, -569620, -838056, 296890, 675384, -1064615, - 48318, -758599, -980863, 139586, -1124745, -1436667, 317291, -235149, -779000, 874563, - 278636, 391916, 248571, 212064, -528818, 376883, 193274, 64425, 723702, -62277, - 737124, -97174, 60130, -284542, 74625, -11274, 323196, -67646, 12348, -20938, - -17180, 220654, 93416, -191126, 140123, 253403, - }, - { - 25233, -31807990, -8301635, 1920924, 388158, -3040837, -5826123, -834297, 2117419, -1289027, - -2429878, 505732, 1614371, -3863860, 3699041, -7153268, 8167417, -6503654, -2633352, -9227737, - 10278930, 104690, -1560684, -5430986, 998043, -4583267, -3739306, 1443109, -1572495, 5173288, - -1858647, -3117610, 475668, -3822521, 89657, 803159, 550293, -78920, -2742337, 350040, - 2258616, 606127, 691490, -784905, -1001264, 158377, -1010391, -1214939, -1448478, 157303, - -1202054, 1364726, -268435, -601295, -889058, 823023, -1392106, -125628, -590021, 122943, - 295816, -399969, -710817, -649077, -1370632, -178241, 217433, 461172, -545461, 387621, - 1002338, 83752, 323196, -229244, -216896, -249108, 4832, 340913, -651224, 134218, - 46708, -9127, 164283, 113280, 82141, -14496, 190052, 181999, 13959, 31675, - -172336, 35433, 35970, 19327, -4295, -219580, - }, - { - 34730180, -79009144, -5535676, -11675332, -6516539, -884226, 5929739, -1417339, -3059091, 8499740, - 5860483, 294205, 4603668, 4017942, 16944720, 352187, 7781944, 106300, 1029718, -3273839, - -3802120, 4287988, 1359894, -358630, 257698, 6681359, -2852932, 1741609, 1398012, -1744294, - -163746, -2145873, 92879, 457414, 987843, 2830384, 3066070, 1276679, -1525787, 2467459, - -1259499, 2316598, 2696166, 3570192, 1482301, 577673, 1963874, -397284, 592706, -1062468, - -388158, 594316, 18254, -628676, 937914, 1823751, -1445793, -156229, 233539, -402653, - 492848, 485868, 102542, -80531, 1288490, 207232, 337692, -184684, 529892, 698469, - 260919, 361314, -496606, -431644, 681289, 434329, -193274, -275415, 46708, -203474, - 260382, 312459, 124017, -66035, 32749, 177704, -37581, 35433, -151398, 293668, - 118112, 1074, -70867, 74625, -47245, 115427, - }, - { - 1159641, 667867, -16474421, -7212861, -6463926, 1184337, 92879, -2553358, -4346507, 1154273, - -5539434, -4479651, -11860552, 3446175, 9896142, -1093606, -2202781, 1993402, 5373541, -928787, - -4057670, 14152991, 14865419, -15859704, 6089190, 1071594, 7822209, -442382, 4493073, -1578937, - -618475, 2965138, -1892470, 696322, 870268, -2648384, 1198833, -136902, -143881, 607738, - 1261647, -599148, -1090385, 1258425, 26307, -613107, -1840930, -2521683, 1195075, 2165737, - 2876554, 699543, -1235877, -871878, -1962263, -1206349, -336081, 689879, 467078, -507880, - 1035087, -610422, -646393, -308701, 475668, 1074, -73551, 394600, 324270, -588947, - 943282, -200790, 599148, 176094, 446140, -130997, -176631, 45097, 164819, -557272, - -73551, -547071, -347892, -2684, 184684, 33286, 15032, -90194, -368293, -382252, - -55835, 130460, -72478, 93416, -29528, -245887, - }, - { - 20453708, 33825016, -1324997, -2171106, 12276090, 1389959, -1304060, -1074279, 13384729, -958315, - -299037, -2612414, 7853885, 358093, 35216584, -6354941, -848256, 1446867, 4910758, -1027571, - 2466922, -4048544, -404801, 2488397, -5109938, -3187403, 415001, -5783711, 822486, -541703, - -2901251, 408022, 2408403, 1971927, 2594160, 349503, 102005, -638340, -247497, 323733, - -433792, -4048007, 1196685, 2057289, -212601, -939524, -1093069, 3188476, 211527, -344134, - 1239635, -431107, -3158949, -1488743, -387621, -138513, 36507, 440234, 826781, -306016, - 603443, 636729, -68183, 294205, 740882, 146566, 133144, -133144, -185220, -106300, - -319438, 1305133, -475668, 274341, -645319, -15032, -214748, 339839, -53687, 156229, - -63351, -214212, 322659, -68183, 48318, -76773, -169651, 162672, -18254, 140660, - -85899, -166967, -119722, 58519, -143881, -234613, - }, - { - -343597, -13043279, -3202972, 774168, 2907156, 545998, 886374, -2157147, -2605435, 2184528, - -1877975, 4594542, -1111323, -19004694, 9286793, 5093831, 6998113, -2578054, 1885491, 2197413, - 1548336, -4642323, -6527277, 3940096, -5362804, 7090991, -2902324, -5412733, 66035, -3336116, - -2440078, 3758097, 1829119, -4046933, 536334, -2714956, 209380, -1742683, -1850057, 278636, - 610959, -2587181, -1614908, -85362, -97711, -1830193, 1590212, -4832, -612033, 1169305, - 563178, 374199, -1280437, -489089, -1515050, -171262, -7516, -742493, 1335735, 199716, - -338229, -1226750, 403190, -201327, 384936, -186294, -763967, -650151, -257698, -355409, - 1015760, -30602, -1237488, -257698, -152471, 79994, -5906, 462246, 288300, 70330, - 444529, -45634, -40802, 10201, 173946, 417686, 472983, 386547, -79994, -179852, - -3758, 23622, -113280, 129923, -311922, 27380, - }, - }, - { - { - -10850161, 43330852, 71965936, 23055384, -3146601, 2725157, 4556424, 5232344, -4334159, 144955, - -3103651, -6871948, 5566278, -4351339, -1681480, 9705015, -3206193, 4517769, 6449431, -781147, - -4753992, -672699, -1150514, -3322694, 3851512, 1075352, 1576790, 1643899, -1894081, 3476239, - -3278671, 2684892, 5780489, 2914135, 1797444, 4130685, -2447058, 8837432, -1852205, 2073932, - 120796, -469762, -1428077, 178241, 2620467, -84826, -979789, 372588, -250182, -1283122, - 87510, -1213328, -206158, -130460, 2130304, 562104, 226023, 1166084, 653909, -102542, - -8053, 35970, -370441, -698469, -1204738, 464930, 501974, -517007, -9664, -479426, - 335544, 85362, -200790, 96100, 780610, 27917, 104153, -258772, 184684, 175557, - -106837, -71941, 263604, 498753, 18790, 259846, 228707, -3221, -69793, 107911, - 59593, 77846, 104153, 190052, -185757, 202400, - }, - { - -1197222, -58245664, -12547747, 4491999, 144418, 497142, 654983, 796180, 1694902, 2399276, - 527744, -341987, -1701344, -5792301, -5104032, -3451543, -415001, 482647, 3277597, -5071283, - 4931160, -16137266, 461709, 4516695, 5785321, 4744865, -5651640, -10816875, -807454, -828929, - -3169149, 2971044, 1212255, -273804, 1728188, 3347390, 4599910, 1910187, -216359, 2254858, - -773631, -596464, 3143916, -651224, -853625, 1534914, 324807, -180926, -905164, -1242856, - 453656, -280247, 48855, -629750, 690953, -526134, 932008, -773631, -150324, -1163399, - -176094, -192200, -393526, 88584, 64961, 607738, 276489, 92342, 332323, -51003, - 68183, 5369, 126165, 366146, -32749, 230854, -34897, -133681, -93952, 565862, - 16106, 216896, -186294, 317291, -202937, -55298, 12885, 235149, 432718, -11274, - 196495, 75699, -159451, -121870, -67109, 62277, - }, - { - 5260261, 77239616, -17600776, -2052994, 1856500, -103079, 4591320, -1382443, -715112, 5131949, - -12995497, -1889249, 5007395, -57982, -3777424, -9599789, 2642479, -7370701, -713501, -2887829, - 756988, -7189239, 5989332, 1826435, 529355, 973884, 7643968, -999117, 1151588, -1982127, - 2279554, -853625, 3329674, 228707, 1122597, 1239098, -2097555, -1050120, -4322348, 882079, - 4560182, -2126009, 3858491, -1485522, 2069101, -221728, 1668595, 561030, 1845762, -233539, - -303332, 1221918, 804770, -268435, -842887, -128849, -399969, -294205, 809601, -18254, - -364535, -847719, 1330903, -545998, 431644, -177704, -588411, 67109, 252866, -753767, - 217433, 388695, -76236, -311385, -268435, -562641, -64425, 62277, 49392, -23622, - 274341, -122943, 192200, -72478, 128312, -488016, -198642, 134755, 611496, 59593, - -106837, 153545, -62814, -180389, -205622, 94489, - }, - { - 11020886, 172255568, -13164612, 4463545, 2902324, -476205, 3601330, -3919695, -1771137, -4053376, - 3181497, 40265, -2314987, 2772402, 4520453, -2731062, 977105, -6947110, -6085432, 1840930, - -3660386, 1362578, -3772055, -133681, -4097936, 1477469, 1109175, -2392297, 2185602, 2185065, - 1260573, 4387846, -1682554, 193274, -232465, -4695473, 1726040, -489626, 1441498, -1037772, - 910533, -358630, 2388539, -1049046, 1897302, 775242, -146029, 136365, -1490891, 1464584, - -712965, -330712, -2199023, 1599875, -1250372, 704912, 279173, -2046552, 513785, -246961, - -954557, -409096, 841277, -150324, 211527, 2147, 369367, -214748, -519154, -440234, - -268972, -816044, 215285, -481036, 229781, 3758, -30065, 546535, -86436, 641024, - -26307, -1611, 169651, 236760, -5906, 122407, 89121, -259309, 441845, -162672, - -119185, -49392, 49929, 88584, -91805, -7516, - }, - { - -1598265, -15299210, 11188927, -1220845, -377420, 185757, -370978, -2290291, 1059246, -1642825, - -1023813, 3769371, -275952, 1025423, -27054536, 3308199, 16851842, 29704530, 17030082, 5013301, - -4728759, -5870147, 7335268, -1094680, 352724, -2152316, 5857262, -4935991, 3678640, -2672007, - 2481954, 2072859, 1612223, 4882841, 1351304, 1178432, 3988414, -5793374, -2573222, 3297998, - -162672, 370441, 777926, 390305, 1993939, 245887, -1401233, 1700807, -804233, 2040646, - -800475, -1267015, -1988570, 18790, -1090922, -222265, -585726, -1101659, 1343251, 167504, - -917512, 71404, -1078574, -663572, 163746, -33823, -620623, 22549, 999654, -534187, - 324807, -388695, -121333, 267899, -8053, 88047, -216359, -118112, 638876, -149250, - 64961, -564788, 491774, 122943, 73551, -460635, 188979, -70330, -90194, 232465, - -108985, 92879, -3758, -202400, -89121, -108448, - }, - { - -2043331, 232085536, 2161979, -1461363, -5226439, 1054415, 4224101, 2700461, 378494, 3911105, - -11658152, -343597, -4025458, 3134253, -254477, 1577327, 483721, -1064078, 37044, 1412507, - 5517959, 345745, -581968, -5284421, 112743, -1181116, 1252520, 3390877, 1273995, 732292, - 743029, -2560874, 3459059, 1841467, -3120294, 819802, 23085, 1619203, 2138357, -390842, - 2373506, -288837, -2849174, -59056, -1014149, 130997, 477815, 1025423, 2805688, 1730872, - 1512365, -2114735, 1049583, -1160715, -149250, -1192927, -426812, -486942, -231928, 450435, - 1144609, -753230, 415538, -544387, -274878, 10737, 596464, -382252, -133144, -93416, - 152471, -619549, 134218, 484794, -39728, -16643, -475668, 37581, 810138, -349503, - -445066, 233002, 18254, 523449, 38655, 170725, -164283, -14496, 217970, -112743, - 197569, -117038, -158377, -42413, 39192, -9664, - }, - { - 632971, 2719788, -2438468, 636192, 236760, -270583, -250182, 754304, -1686848, 767725, - 3245385, 212064, -2077154, 1946694, -5646809, 4333085, 3063386, -1737314, 3962644, -4715337, - 8384313, -2027761, -15794742, -3623879, 1567663, 465467, 5278515, 2894808, 2009508, 2161442, - 1866700, 2139968, 1967095, -4933307, 4808753, 577673, -3534758, -2013266, -1993402, 763430, - -1425929, 899796, 92879, -610422, -65498, -783295, -2646237, -783832, -1762010, -152471, - 133681, -427886, 1676648, -982474, -368830, -120259, 683974, -1364726, -50466, 1031866, - -892816, 1183800, -110595, 103616, -441308, 1061394, -289373, 885837, -72478, -194347, - 744103, 214748, -381715, -141197, 321049, 411780, -278636, 270583, 64425, -143345, - 153545, 5906, -33286, -275952, -74625, 57982, 57982, 134218, -41876, 56908, - -42413, -105227, -2684, 27917, -321586, -149250, - }, - { - 12297028, -221074848, -5077725, -8498130, 1843615, -1071058, 1302986, -3351685, 4253092, 1612760, - 2496450, 2771328, -1627793, 16091095, 11641509, 483184, -1872606, 1418413, -1966021, 2772938, - 4073777, 591095, -4599373, -2371359, -316217, -1423782, 2420751, -1148367, 3681861, 920197, - 483184, -2072859, 2131378, 448287, 107911, -3233037, -3776887, 2543695, 1635846, -1286343, - 1030792, -2051921, 3691525, 1195612, 69256, -2387465, -1491964, -1548336, -180389, 292595, - 1116155, -841277, -2056216, 1979443, -476741, 1555315, 441845, 50466, 56908, -1217623, - 246961, 284005, -204011, -697395, -1061931, 821949, -172872, 366683, 27917, 348429, - -550293, -418222, 20938, -68183, 165356, 236223, 20401, -35970, -115427, 310311, - 195421, 114890, -459562, 13959, 309775, 41339, -27917, 79457, 88584, -128312, - 238371, 88047, -289910, -146029, 74625, -52076, - }, - { - 789737, 4584878, 878858, 77846, -767189, 1338419, 868120, 316217, -3563212, 186294, - 2590402, -1511829, 3037079, 1148367, -5814849, -2365990, -5905580, -10677289, 4029216, -3834869, - -9121974, 5301064, -3488587, 4928475, -3139621, -6962679, 3541201, -3332895, -4682588, -4111358, - 3098819, -1621887, -673236, 1977296, 4316442, -230854, -674847, 1334124, 2120103, 3892314, - -1171452, -2669322, -1770600, 1376000, 43487, 2246268, 1232119, 932008, -3250753, 1868311, - 138513, 13959, 432718, 1564979, -1873680, 548145, 1056562, -1944010, 57445, 353798, - -217970, -1228898, -180389, -309775, -1169842, 55298, 99321, 97711, -278099, -810675, - 214212, -419833, -100395, -243739, -442919, -113280, -265751, -14496, -563178, 79457, - 217433, -118112, 161598, 219580, -277562, -25770, -18790, 107911, -333397, -67109, - 185757, 2147, 38655, 207232, -118648, -3221, - }, - { - 7019587, -170832864, 20489678, -7201587, 2559264, -15582678, 8477729, -2146947, 3388192, -6056978, - -3223373, 5728950, 3584150, -2624225, 2295123, -7573101, -4074850, -2965675, -9578851, 1391569, - 2032056, -2934000, -5662378, -1392106, -2439005, -1023813, -146566, 2041183, -1932198, 1460826, - 6311992, 3278671, -539018, -171799, -468688, 467615, -1640678, 2218351, -2234994, 5028870, - -640487, -1105417, 877247, -223338, 3592740, -1665374, -29528, -1233729, 78383, 339302, - 59593, -244813, -475668, 517007, 964220, -466541, -1568200, -484794, 881005, -1973001, - 398895, -680752, -1656784, 1127966, 44023, -1043140, -61203, 302795, -824097, 184684, - -610959, 374736, 365609, -408022, -860067, 66572, -20938, -104153, 512175, -171262, - 667867, -49929, 93416, -311922, 34897, -104690, 268435, 128849, 3758, -118112, - 19327, -39192, 246424, -114354, -38118, 70330, - }, - { - -408559, -29588030, -4781909, 3346853, -539555, -1806034, -1728724, 2130841, 3067681, -536871, - -1734630, 2014340, 6478422, 2742337, 7457137, -6163278, 6613713, -8233989, 601295, -11298985, - 8853538, -828929, -148176, -1396938, 2069637, 4911295, -1048509, 370978, -926102, 785442, - -3675955, -3816615, 2190433, -2136209, -586263, -1154809, 1383516, 3005403, 714038, 1664837, - 1889786, 1120450, 1389422, 235149, -19864, 475668, -739808, -215285, -955630, 889058, - -1799591, 842350, -334471, -592706, -776315, 1764158, -1155883, -1123134, -774168, -375273, - 587874, 254477, -628676, 591095, 131533, 25770, 158914, 310311, -726923, -110059, - 472983, -140123, -167504, -252866, -1074, -86973, -172336, 355945, -273267, 110059, - 73551, 224949, -17717, -78383, 1074, 106837, 178778, 165893, -133681, 16106, - -300111, -175020, -141734, -103079, 3221, -293668, - }, - { - -12972412, -116163296, 24059334, -4421669, -4230543, -4604205, 1163399, -5431523, -3866008, 2731599, - -3985193, -4887673, 7293928, 6577743, 12254079, -5306432, 3692598, -3221, 4398047, -4163971, - -3338263, 4111358, -3149822, -2838974, -1493575, 2483028, -1567126, 205622, -907849, -1056025, - 2364916, 901943, -886374, 1142998, -176631, -2951716, 11811, 1279900, -229244, 2001992, - -491237, 1157494, -3696893, -1482301, 724239, -141197, 612570, -2207613, 472446, -205622, - 449898, 318901, 24696, 258235, 1611, 402116, -2061047, 131533, 459562, -629213, - -1708323, -787590, 26307, -500364, 753767, 268972, 481573, 140660, 755914, 705985, - 165356, 26307, -491237, -228707, 436476, 339839, 126702, -78920, -256087, 128312, - 565325, 527744, 218506, -229781, -257698, -23622, -148176, -15569, 51003, 549756, - 208843, 8053, -10737, 172872, -81068, 16106, - }, - { - -1256815, 12212203, -90731, 2044941, -6136972, -192737, -609885, 585726, 612033, 3595425, - -1040456, -2428804, 11162083, 27715424, 1677185, -5077188, 1465121, 6810208, 8001524, 3037079, - -5755793, 13196824, 22079354, -17084306, -2694018, -2624762, 7335268, -4242354, -4508642, -3456912, - -764504, 1892470, -3339874, -914291, 2364380, -3817152, 1520418, 578747, -2944737, -563714, - 772020, 796180, 1729798, 437550, -929324, -646393, -1709397, -418222, 1083406, 102005, - 998043, 1039382, -794569, -681826, -1338419, -1156420, -1175747, 664646, 745714, -643708, - 861678, -95026, 155156, -514859, 48318, 179315, -182536, 23085, -166430, -268435, - 737124, -519691, 77846, 167504, 369367, -99321, 83215, -197032, 170188, -400506, - -86436, -34897, 95563, 136902, 177704, -5906, 207769, 23622, -331249, -326418, - 84826, 303332, -17717, 130997, 154082, 49392, - }, - { - -19899658, -20944944, -2029909, -5191542, -320512, -652835, 1826435, -4829154, 13422847, -760209, - 5203890, -282931, 5238250, -23447838, 7386270, 437550, 6856916, 1568200, 1876901, -2572686, - 3028489, -2432562, -1112933, 330176, -3831111, -161598, 1133871, -6882685, 1185948, 504659, - 738734, 602906, 2372433, 2349884, -124554, -1137630, 936303, 172336, -431644, -840740, - -613107, -3394635, -1930588, -2260764, -1372242, 141734, -233002, 1342177, -1956895, -4295, - 938450, -921807, -1687385, 726386, 1007170, -810675, -600759, -31675, -463856, -966368, - 30065, 725850, 132607, -652835, 92879, 288300, 267362, -108448, 303332, 137976, - -293132, 1120987, -419296, 708133, -476741, 257698, -130997, 206695, 105227, 547608, - 230318, -183610, -88047, -267899, 50466, -200790, 18254, 187905, 27380, 244276, - 32212, 537, 68719, 195421, -104153, -324807, - }, - { - -154619, -3784940, 2997887, -1513976, 870268, -808528, -449361, -1411971, -2303713, 2188286, - -3004330, 3479997, 3901978, 19107236, 67623720, 14482630, 3991635, -1166084, 6111202, 8119636, - 1717450, -5507222, -8331700, 388158, -5757404, 6944425, -3231426, -4250944, 1148904, -63888, - -2708514, 1828582, 3324305, 6442, 2099702, -1755568, 1095754, -4208531, -2982855, -311922, - 755377, -1204202, 746787, 1690607, 1075889, -1998234, 1586454, 108448, -506806, 818191, - -651224, -861678, -810138, 1024350, 284005, 712428, 500364, -1464584, 490700, 300111, - -405874, -1455457, 569083, -222265, -574452, -1283658, -971200, 191126, -42950, -644245, - 146566, 366683, -901943, -453119, -139586, 143345, -20401, 408022, 126165, -39192, - 328565, -88584, -197569, -69793, -212064, 173409, 154082, 114890, 126702, 140660, - 246424, 17717, -149787, 272730, -158377, 9664, - }, - }, - { - { - 12665322, 122841432, -2311766, 15420543, 4258997, 2945811, 2921652, 1799054, 2412161, -2011118, - -3883724, -1632088, -1228898, 1182190, -1756105, 9621264, -4031901, 4530117, -4190814, 6212134, - -3851512, -1489280, -5171141, 11274, 1757715, 2951716, -540092, 1032940, -135291, 5567352, - -2732136, -555125, 5350993, 1975148, 7121056, -381715, 1542967, 3902515, 1886564, 1136019, - 1012002, -2268817, -1761474, 1810866, 2059974, 1220845, -93416, -420907, -636729, 84826, - -141197, -147103, 383863, -504659, 921271, 517007, 1387811, 153545, 768799, -224949, - -162135, 345745, -872952, -829466, -643171, -85899, 227096, -17717, -497142, 18790, - -489089, 743029, -197569, 49392, 672162, 562641, 242129, -427349, -361851, 353798, - 96637, 354872, 68183, 98247, 314606, 145492, 387621, 112206, -43487, -1074, - -300648, 168041, 244813, -152471, 207232, -8053, - }, - { - 82678, -67210336, -4274566, 6007586, -40802, -608812, 3649112, -493921, 2777770, 3394098, - -207769, -2204392, -1662152, -6425808, 2516314, -12489765, -1618129, 5665062, -5324686, 1895691, - 6357626, -13217762, -3684545, 1925219, 7413651, -104153, -1717450, -9017284, -4935991, 811212, - 1208496, -636729, -757525, 924492, 354872, 5113159, 3869766, 1124208, 2424509, -1109175, - -49929, 3378529, 1197222, 30602, -3966402, 3228205, 175557, -432181, -1875827, -419296, - 1165547, -738198, 943282, -1607928, 1540283, -1142998, 952946, 491774, -1845762, -750009, - -93952, 33286, -7516, -194347, -26844, 1001801, 605590, 163209, -455803, 413391, - -306553, 300648, 28454, -32749, 403727, 399969, -266825, -314606, 424665, -19864, - 411780, -105764, 102005, 189515, 91805, -283468, -23622, 518617, 268435, 193810, - -60130, -28454, 14496, 59593, -83215, -33823, - }, - { - -4304631, 7198365, 37008124, 12514998, 293132, -2531346, 2273112, 1529008, -1594507, -1852742, - -3091303, -2389613, 3221762, 2344515, -2678986, -13329431, 6955700, -9175124, -2357937, 4273493, - -5203890, -4329327, 3847754, 4750771, -319438, 238908, 6323266, 1220845, 1247688, 1297617, - 84826, 1101122, -1726040, 2228551, 3058554, -1880659, -460098, -2808372, -1350767, -433792, - 1549410, 1123671, -254477, 874026, -931471, 4004520, 447750, 713501, 999654, 476205, - -91268, 333934, 1054951, -282931, 316754, -1052804, -606664, 991601, 597537, -705448, - -70867, 559956, -306553, -697395, 694174, -44023, -530428, -149787, 141197, -337155, - -115427, 834297, 360777, -495532, -488553, -681289, 278099, -4295, -120259, 194884, - 353261, -290984, 14496, 61740, 71404, -468688, -12885, 189515, 308164, 258772, - -34897, 142808, -213675, -272194, -82141, 30065, - }, - { - 7585449, 166463808, -3743601, 4883378, -4075387, 1865090, 915365, -478352, -4571993, -3271691, - -464393, 2226404, 2749316, 4437775, -1957431, -983548, 1946157, -13889924, 0, -2414309, - -157303, 1226750, -3342558, -2921115, 261993, -2647311, 883153, -2178085, 2041183, 802622, - 3120831, 4349192, -743566, -1091459, -1700270, -2823404, 1660005, 34360, 1003949, 438624, - 1192390, -869731, 168577, 482110, 1785096, -423591, 2189897, -687732, -656056, 848793, - -311922, -1112933, -1554778, 914828, 177167, -405874, -302258, -1147830, 177704, -470299, - -501437, -91805, 1038845, -133144, -68183, 376347, -297963, 347892, -213138, -566399, - -371515, -688269, 99321, -734439, -6979, 269509, 231391, 181999, 150324, 314069, - 363462, 25233, 257161, -67646, 89657, 236760, -56371, 47782, -9127, 70867, - 85899, -224412, 11811, 17717, 55298, 28454, - }, - { - 1583232, 5313949, -8252243, 514322, -339839, 83752, -1059783, -1077500, 168041, -434329, - 967441, 1474248, -4224101, -1712618, -20041928, 2158758, 11668889, 42315628, 10392747, -2308008, - 2590402, -18095234, 11122892, -723702, -1611687, -4365835, -408559, -47245, 2393371, -958315, - 1758789, 3037079, 1892470, 4340065, 2247879, 1689533, 311385, -3860639, -1469416, 1420024, - -662499, 480499, 1369558, -41339, 2078227, -668404, 908386, 643171, -1542430, 2666638, - -784905, -1852205, -1918777, -379568, -304943, -577673, -1501628, 137976, 1243393, 635118, - -1480690, -466541, -359167, -845035, 210453, 679679, -651761, 244813, -186831, 353798, - -265751, 395137, -365609, 24159, -330712, 260919, 97174, 57982, 339302, -26844, - 193810, -492848, 223338, 229781, 34360, -73014, -9664, -157840, 71404, 3758, - -13959, 50466, 141197, -223338, -243739, 192737, - }, - { - 29030758, 198603040, -9038759, 130997, -2969970, 1112397, 479963, 5521181, 1319092, 194884, - -3228742, -5095979, 1175747, 3176128, -191126, 208843, 135828, -481036, -359704, 686658, - 6897181, 2740189, -2711735, -2677375, -1443109, -158377, 1760937, -1446330, 257698, 1992328, - 4793721, -1618129, 743029, 2147, -1178969, 973884, -494458, 923955, 1838783, 1666447, - -35433, -288300, -3344706, -1490891, 1060320, -794569, 1905892, -504122, 1744831, 2199560, - 134218, -845572, 293668, 646393, -1592359, -699006, 815507, -193274, 900333, -564788, - -140660, -98247, 603980, -845035, -263067, 338229, 162672, 38655, -700080, -245887, - 184147, -311922, 23622, 311385, -482647, 99858, -58519, 299574, 251256, -416612, - -598611, 41339, 309775, 355945, 190589, 90194, -59056, 61203, 215822, 172872, - -7516, -98784, -127775, -109522, 6442, -54224, - }, - { - -45634, -2187212, 3583613, -1320166, 325881, 304406, -1058710, 856846, -977642, 97174, - 2142115, -1108102, 7585449, -7585449, 729608, 4500589, -6553047, 212601, 1983201, 329102, - 5433134, 14496, -15708843, -4618701, -2878702, 1436667, 2336462, 7780334, 989990, 1217086, - 1649804, 6777996, -4836133, -482110, 2164127, 3100430, -2610803, -824634, -949188, -991064, - 754841, -788663, -225486, -583579, -343597, -635655, -1792612, -1015760, -1443646, -787053, - -30602, -503585, 1854889, -737124, -84826, 317291, -514322, -395674, 1011465, 416612, - -496069, 300648, -313533, -347892, 513785, -353798, 314606, 637803, 230318, 38655, - 222801, 204548, 245350, -6979, -114354, 391379, -236223, 326418, 91268, 68183, - -110595, 324270, -157303, -139586, -247497, -91268, 199716, 15569, -144418, -81604, - -75699, -38118, -133681, -1611, -171799, -130460, - }, - { - -29072634, -188097552, 10158671, -2690797, -2010045, -665720, -2194728, 1166084, -3829500, 4422743, - 3828963, 903017, 1820529, 6413460, 20597052, -849330, 353261, 1868848, -2222646, 6750615, - 1873143, -1817308, -1868848, 1613297, -2869575, -1662152, 450435, 4100083, 926639, 2476586, - -2470680, 3644280, -3646427, 773631, 3446711, -7904351, 2742337, -1579474, 877784, 3134789, - -1192390, -1000191, 2790118, 1349157, 1787780, -4031901, -2249489, 638876, -1137093, 687732, - 216896, -1382443, -1604170, 1151051, 1824824, 533113, 311385, -329102, -94489, -1183264, - -316754, -76236, 239444, -338229, -913217, 384936, 271657, 258772, 55298, -206695, - -173409, -251792, 24159, 183073, 215285, -180389, 162672, 192737, 13959, 134218, - 288837, -118112, -279710, -177167, -9664, 443455, -167504, 208843, 6442, 40265, - -97174, 255014, -199179, -149787, 98247, -128312, - }, - { - 294205, 3294777, 5073430, -778463, 941672, 436476, 113817, -1265942, 274341, 418759, - -248034, 520765, 1199907, -818728, -4220879, -1252520, -13355738, -2902324, -2989834, -4527970, - -4009352, 2435783, 4524211, -7345468, 5388574, -9432285, -6536940, 6209449, -6303402, -5706401, - 4567698, -928787, -1248225, 2291902, 2836289, 2694555, -1660005, 2102923, 1089848, 2772938, - 99321, -2834142, -999654, 1025423, 1629403, 846645, 1626182, -741956, -547071, 290984, - -273267, 40265, 307090, 739271, -373125, 376883, 192200, -163746, -1421634, -161598, - 79994, -378494, -402653, -608275, -1343251, 96100, -83215, 193274, 183610, -1479616, - 158914, -982474, -103079, 34360, -613107, -116501, -428960, 148713, -511638, 139050, - 74625, -48318, 89121, 95026, -374199, 88584, 66035, 141197, -264141, 1611, - 133681, 148176, 39728, 270046, -98784, -29528, - }, - { - -5132486, -143588272, -3620121, -2132988, -4246649, 108448, -796180, 3668439, -5950141, -103079, - -1439888, 1327145, 3870839, 77309, -5575405, 329639, -7143605, -7255811, 4522064, -10872710, - 2016487, 169651, -4169876, -3042984, 3119220, -3765613, -1421097, 1098975, -3033321, 3352222, - 5198521, 5716065, -2262911, -1857573, 2384244, -4692252, 553514, 2319819, -43487, 4779762, - -1192390, -658741, 632971, -783295, 829466, 567473, 1064078, -1239635, -895501, 953483, - -231391, -69793, 913754, 1647657, -721555, -736050, -819802, -5369, -32749, -1282585, - -41339, -695248, -845035, -46171, 418759, 130997, -637803, 102542, -253940, -322123, - -427886, 680215, -83752, -694174, -350040, 192737, -90731, -234076, 88584, 208843, - 193274, 282931, -204011, 76236, -140660, -73551, 453656, 201863, 44023, 104690, - -197569, -179852, 83752, 233002, -115964, 29528, - }, - { - 566399, -19683836, -10023917, 3635690, -2079838, -898722, 133144, 1669132, 1935957, 69256, - -358630, 1569811, 6424198, 1733019, 7010997, -3263638, -1527398, -1034013, -673236, -4006668, - 3833258, -155156, 1560147, 947040, -2609730, 5955509, 3184182, -1471026, -742493, -4293894, - -2692408, -1231582, 1003412, -268435, -2764885, 736050, 478889, 2600066, 782758, 2743410, - -1790465, 1981054, 2055142, -249645, 1599339, -387621, 13959, -735513, -252329, 153545, - -971736, 287763, 448287, -662499, -255014, -5906, -340913, -730681, -132607, -893890, - 401043, 66572, 26844, 77309, 841814, -288837, 290984, 281320, -514322, -14496, - -242666, -68183, -574989, 120796, 56908, -26844, -330176, 279173, 48318, -42950, - -39728, 179852, 193810, -152471, -123480, 188442, -27917, 118112, -173946, -157303, - -91805, -202937, -133681, -146566, 82141, -229781, - }, - { - -8072928, -102590664, 5985574, -205622, -2001992, -1486596, -4872641, -2679523, 81068, -373662, - -5971079, -5853504, 12355010, 3107946, 3058017, 2550137, -1392106, 2137820, 2112587, -279173, - -3151432, -403190, 232465, -2189360, -3023657, -1091995, 55298, 281857, -1738388, 1400159, - -435402, 5110474, -3740380, 2500745, -870805, -4696010, -4295, -730681, 793495, 374736, - 1949378, 1432372, -3410741, -4264903, 1564442, -420907, -295816, -1748052, 1181653, -1396401, - 171262, 714575, 86973, 1337346, -54224, -853088, -991064, -356482, -317291, -272194, - -685047, -1394791, -261993, 363998, 49392, 377420, 469225, 240518, 568009, 499827, - 113817, 320512, -602906, -34897, -90731, 742493, 96100, -156766, -137976, 292595, - 330176, 380641, 317291, 19864, -518617, -128312, -41339, 141734, 209380, 223875, - 321049, 99858, 177704, 70330, -111669, -37581, - }, - { - 989990, 14798847, -449361, 1512365, -4565550, -2445984, -1186485, 1479079, 2334852, 2956548, - 750009, -3446175, 1358820, 47720844, -6256694, 2852395, -2968359, 7278359, 2677912, 648540, - 8739185, 1580011, 17411260, -10598369, -3328600, -1510755, 5384815, -521302, -10089415, 231928, - 369367, 1206349, -2529199, -2495913, 3244311, -4852776, 1060857, 2410014, -5796059, 2475512, - -362925, 1899449, 2223183, -550830, -388695, 526134, -2241973, 1061931, -1636919, 1643899, - 1315334, 251256, 1427540, -2109366, -724776, -899259, 13959, -682363, 1567126, -1194001, - 670552, 251256, 525597, -724776, -311922, 442382, 108448, 227633, -226023, -207232, - 128312, -169114, -32749, 266825, 170725, 168041, 557272, -154082, -255551, 10737, - -273804, -24159, -7516, 3758, 118648, 57982, 36507, -33286, -20401, -345208, - 202937, 149250, 173409, 45097, 156229, 210453, - }, - { - 10201084, -62707596, -3063922, -3342558, -2973728, 3179350, -4083977, 1401233, 7015292, 675384, - 5289789, 2066953, -4656819, 6473590, -24710020, -2007360, 7817914, 2823404, -1825361, 1966558, - 1064615, -1785096, 3081639, -3935801, 2684, -1287953, 458488, -2413772, -3208341, 3038153, - 1181116, 745714, 1304060, 3350611, -2852932, -534723, -403190, 2065342, -868120, -1500017, - -581431, -1171989, -4733054, -1443646, -206695, -921271, 153545, -981937, -506806, 521839, - 388158, -1024350, 175020, 1052804, -704912, -830002, -377420, -355409, -629750, -1218697, - -146029, 553514, 79994, -450435, -111132, 24159, 190052, 178778, 170188, 93952, - 44023, 246424, -30065, 774705, -239981, 530965, -275415, -4832, -34360, 322123, - 262530, 118648, -486942, 12885, -131533, -300648, 105764, 105227, 119185, 148176, - -24159, 96100, -63351, 216896, -13422, -78383, - }, - { - -2147, -1624571, -811749, -1480690, 1999307, -51003, -1453310, 46171, -1348620, -1682554, - 1341104, -918049, 6513855, 20312510, 58092116, 15263240, 1043140, 304943, 7298760, 7639136, - -130997, -6557878, -3679713, -1084479, -2955474, 2021856, -2451353, -718333, 2357400, 145492, - -2656974, 54761, 1499481, 2862059, 1078037, -2098092, 1457068, -3941169, -1008244, 500364, - -2111513, 2630668, 664109, 1002875, 1640141, -1198296, 757525, -615791, -115964, 446677, - 286689, -1943473, 77309, 785442, 323733, 227096, 1603097, -1421097, -85362, 672699, - 482110, -1021129, -539018, 351114, -899259, -675384, -632971, 54761, -264141, -134218, - -154619, -171262, 42413, -301185, -26307, -169651, -155156, 301185, 227633, 66035, - -54224, -67109, -300111, -85362, -156229, -135828, 226560, 77309, 99321, 198642, - 201863, -6979, -70867, 23085, 140660, -81604, - }, - }, - { - { - -12409234, 136878464, -1792612, 214212, 920734, 389768, -2427194, -3382824, -1498944, -1737851, - 2833605, 3481071, -2416993, 3302830, -8351564, 6831146, -2477659, -4326106, -4923107, 9341554, - -4306242, -1073205, -1976759, 432718, -3792456, 1453310, -1945620, -472983, 727997, 4678293, - -2057826, 407485, 2210298, -3368328, 4225711, -2778307, 171262, 2023467, 721018, -2828773, - -2324651, -1728188, -2760053, 325881, 2716567, 1701344, 902480, 466004, 818728, 1482838, - 706522, 93952, 867047, -569083, 881005, 640487, 249108, -1202054, 1285269, 271657, - -105227, 1304596, 61203, -801548, -23085, 57445, 143345, 374199, -104153, 139586, - -840740, 729071, -438087, 179315, 707596, 550830, 529892, -5369, -426812, 197569, - -154619, -90194, -238371, 53150, 301721, -170725, 144418, -101469, -131533, -70330, - -299574, 10201, 126702, -198642, 203474, -88584, - }, - { - 548145, -24512452, 23887534, 4824322, 2234994, 9127, 3286187, -1618129, 475131, -653909, - -230318, 639413, 727997, 1167157, 13371307, -9417253, -796180, -1249299, -10913512, 6092948, - 6673306, -7321846, -955093, -2144263, 472983, -2208687, 831076, -3343095, -929860, 210990, - -794032, 552977, 1605244, 2648384, -1621887, 897648, 772020, 375810, 407485, -3633542, - -732829, 3405909, 734976, 943282, -2446521, 2164127, -1606318, -756988, -1333051, 228707, - 1181116, -1575179, 642098, -1198833, 1376537, -1298154, 241055, -24696, -884763, 301721, - -452045, -581431, 126702, -251792, -22012, 562104, -213675, -181462, -171799, 818728, - -385473, 182536, -242129, -187905, 273804, 212064, -166430, -357019, 111132, -143881, - 543850, -235686, 176631, 289373, -64961, -359704, -548145, -180926, -221728, 66035, - -22549, 118648, 40265, 139050, -20938, -52076, - }, - { - 3965329, -81712288, -38707320, 9801115, 2644089, -1120987, 1742683, 2268817, -613107, -934692, - 975494, -4560182, 1074816, 2698850, 1294933, -7573101, 5509370, -9882720, -1221381, 5226975, - -1889249, 755377, 5433134, 3543885, -5596343, -3205656, 4268661, -2268817, -1627256, -28454, - -2458869, -1221918, -3455301, -1833414, -22012, -259846, 1545115, -1042066, -1134945, -1728724, - 567473, -1232656, -4788889, 672162, -71404, 4108136, -1033477, -589484, -181999, 184147, - 525060, -18254, 282394, -434329, 665183, -4832, 258772, 618475, -384400, -1015760, - 95563, 1071594, -379031, -755377, 340913, -613643, -246961, 146029, -182536, 132070, - 64961, 470836, -31139, -510027, -15032, 97711, 147103, -194884, 222801, -24696, - 312459, -47782, 211527, 135291, 180926, -94489, 54761, 44560, -122943, 146566, - 3758, 66035, -123480, -104690, 134218, 69793, - }, - { - -23098334, 136796320, 749472, 3469260, -821413, -599685, -2773475, 216359, -700617, -424128, - -1105417, 1459752, 3341485, -233002, -8397735, 2607582, 2544768, -16109885, 2243047, -2281702, - 988916, 1663226, -1546725, -2878165, 1721745, -1179505, -1394791, -4520453, -733366, -3694209, - -599148, 3862786, 750546, 1014686, -827855, -1516660, 1832877, 1115618, 75162, -275952, - 1098438, -1656247, -224949, 1032403, -470836, -2966749, 2314987, 674310, 106300, 525060, - -271120, 332323, -233002, 1469953, 1270774, -589484, -546535, -67109, 241592, 274341, - 303332, -286689, 580357, -172872, 370978, 406411, -493384, 595927, 47782, -25770, - 500901, -66572, -2684, -395137, 173946, 188979, -112743, -352187, -140660, -51540, - 293668, -219580, 537, -237297, 3221, 89657, -117575, 103616, -236223, 45097, - 210990, -147640, -153545, -73014, 91805, 39192, - }, - { - -1628866, 19983946, 3625489, 523986, 272194, -185220, -306016, -194884, 173946, 969052, - 637803, -2180770, -6807523, 5324686, -8659728, -2266132, -13176960, -11665668, -10547366, 1682554, - 4866735, -19505058, 1811939, -3120831, 2543158, -2048699, 29528, 2873333, 1262720, -3051038, - -2159832, 84826, -3054796, 2157684, 4286378, 482647, -1494112, -3906273, -2848637, -1569274, - -3113315, -1915555, 224949, 171262, 2204929, -77846, 1637456, -716186, -2668785, 1682017, - -993211, -294205, -576599, 648003, 814970, 395137, -711354, -481573, 777389, 908922, - -830539, 11274, 576599, -286689, 588947, 1032403, -973347, -212064, -641561, -38655, - -218506, 786516, -512712, -259846, -222265, -100395, -242129, 119185, 353798, -242666, - -51540, -204548, 298500, 133681, 194347, 278636, 284005, -31675, -37044, -10737, - 72478, -33286, 145492, 63888, -215822, 86973, - }, - { - -48019880, 126092720, 14288819, 6507949, 1784559, 80531, -2452426, 4335233, 2022393, 1138703, - 3703873, 610422, 5317170, 1537061, 482647, -852014, -2510409, -1170379, -649077, -259309, - 3257733, 2833605, -547608, -1162326, -955630, 267362, -9664, -2618320, 494995, 2083596, - 5134097, -1737314, 990527, -770947, -230854, 2163590, 295816, -18254, -1251983, -991064, - -4552666, -1364189, -2386391, -2947421, 370441, -644245, 1801739, -1656784, -1489817, -467078, - 541703, -219043, -858993, 1015223, 869194, 1063541, 1883343, 401043, 1129040, -853088, - -403190, 32212, 664646, -490700, 448287, 419296, 102005, 387084, -569620, -178241, - 77309, -184684, 227096, -417686, -578747, 106300, -246961, 245350, 178778, -265751, - -517544, -67109, 97711, 29528, -47245, -177167, 10201, 63351, 96637, 97711, - 15032, -19864, -128849, -41339, 21475, -115964, - }, - { - -314606, -10023380, 112206, -412317, -22012, 65498, -887448, 1465121, 71941, 73551, - 1214402, 1069447, 7251516, -5895917, 9294846, 2664490, -11596949, -1537598, 8857296, 5845988, - 1038845, -3514894, -23215372, -3959960, -415001, -871342, -4403415, 4742181, -123480, 325344, - 190589, 6178311, -4135517, -1387274, 1779727, 4310537, -630823, 991064, 929324, 276489, - 1692754, -362388, -678605, -1264868, -1337882, 456877, 142271, -1006096, -980863, 358093, - 321586, -925565, 1366873, 309238, 1454383, 783295, -210453, 102005, 756988, -468688, - -908922, 1074, -645856, -715649, -76773, -958315, 111669, 447750, 231928, -176631, - -419296, -176631, 606127, 132607, -459562, 376883, -105227, 303332, -163209, 124554, - -225486, 231391, 103079, 234613, -49929, 35970, 207232, -220654, -74088, 61740, - -10201, 183073, -127775, 12348, 36507, 17717, - }, - { - 37951940, -137174272, -25514790, -804233, 5257577, 357019, -882079, 724776, -7711077, 1845225, - 623844, -147640, 367220, 1878511, 14519137, -2965138, 1402307, 4303021, -1347009, 5794448, - 1761474, -654983, -1304060, 2662343, -126702, -1970316, -173946, 5272073, 22549, 796180, - -2778844, 4993973, -4929549, -189515, 1758252, -9149891, 4167192, -1096290, 590021, 2530810, - -987843, -242666, 1585380, 1024887, 2461553, -365072, -404801, 1509144, -91268, 479426, - -296353, -273267, -1589138, 475131, 1225139, -307090, 42413, -704375, 1275605, -189515, - -740345, -546535, 278636, 912144, -70330, 603980, 892816, 510564, 63888, -57982, - 221728, 301721, 38655, -12348, 326954, -30602, 36507, 4295, -3758, -142808, - -168577, -161061, 151934, -101469, -187905, 228707, -394063, 31139, -33823, 4295, - -207232, 194884, -10201, -27917, 237834, 67646, - }, - { - -872415, -7146289, -1878511, -1699733, 1435593, 88584, 443455, 670552, 2208687, 1008780, - 893890, 1742683, -864899, -379031, -7853348, 775242, 3619584, 3083787, -4136591, 2327336, - 3638911, 1637456, 5385352, -12444668, -2238752, -2253247, -5198521, 3956202, -581431, 136902, - 4397510, -513785, 1297617, -896574, -2866354, 1167157, -2730526, -217970, -1458678, 1906966, - -351114, -1140314, 346282, -799938, -122407, -1352915, -357556, -224949, 805843, 268435, - -1095754, -915902, 188979, 326418, 220654, 34360, -756988, -269509, -506269, 642635, - -259309, 275415, 401579, 240518, -752156, -22012, -124554, 634045, 1223529, -907312, - 251792, -520228, -53687, 9664, -391379, 239444, 70330, 134218, -318901, 199179, - -62277, -84289, -41876, 75162, 84289, 104153, -190589, 262530, 13422, 60666, - -85362, 83752, -53687, 198642, 17180, 118112, - }, - { - 3200288, -133982040, -11696807, -93952, -303869, -1631014, -5581847, 6419366, -3779571, 3823595, - -1292785, -1612223, 3389803, 2391223, -4975720, 3098282, -2417530, -3184718, 8775692, -8036958, - 2097555, -370441, -1196148, 212601, 2277407, -3941169, -1806034, 282931, -3096135, 2706903, - -695248, -1019518, -1941862, -190052, 4974109, -1382443, 1811939, 181462, -1470489, 3314104, - -726923, 69793, 1825898, 348966, 189515, 491774, 653909, -1036698, 126165, 943282, - -217433, -393526, 223875, 337155, -1145683, 35433, -692027, 458488, 424665, -275415, - 262530, -457414, -719407, -41339, 398358, 144955, 152471, 210990, -19327, 227633, - -228170, 353798, -243739, -284542, 48855, 184684, -255551, -67646, 1611, 165893, - -42950, -42950, -141197, 529355, 68183, -85899, 142808, -6979, 24159, 176631, - -248571, -48855, -85899, 32212, -132607, 104690, - }, - { - -803159, 569083, 8353712, 2413235, -3148748, -603443, -347355, 509491, 909996, -292058, - -86436, -1247151, 1343251, -2079301, 966368, -6359773, -5276904, 1713155, 33286, 3605088, - 7512435, 261993, 7066832, 2783676, -4122632, 1767916, 1185948, 467615, 542777, -2287070, - -157303, 1064078, 2797634, -141197, -1953136, 2930778, -672162, -572304, -1837709, 789200, - -2782602, 1495186, 507880, -855772, 2382633, -821413, -286152, -922881, -831613, -338229, - 299037, 1300301, 667331, -289373, -231928, -1006096, 177167, 73551, 756451, -667331, - -232465, -74625, 390305, 59593, 753230, 51003, 143881, 104153, 198642, 267899, - -801548, -512175, -568009, 363998, 61203, -5369, -99858, 366683, 15032, -3221, - -41876, 81604, 6979, -236760, -24159, 104153, -75162, 144418, -122943, -49929, - 237297, 104153, 96100, -70330, 47782, -63351, - }, - { - 19447612, -64608120, 5835250, 2017561, -551903, 6837588, 546535, 1840930, 1209570, 445066, - -441308, -3240016, 5102958, -11952894, -2905009, 6768332, -738198, 228170, 1354525, 2378338, - -3488050, -514322, 609885, -1337346, -1204738, -709743, -2190970, 918586, -948651, 70330, - -3098282, 3243774, -3122978, 493384, -725850, -1870458, 241592, 750009, 542240, -1476932, - 1672353, 628676, -2089502, -2313914, 459025, -797790, 405338, -291521, 1234803, -1614908, - -382252, 1154273, 476741, 1310502, 281320, 234613, 586800, -337692, -76773, 998580, - 591632, -831076, 91805, 246424, -359704, -17180, 463320, 84289, 202937, 361851, - -260382, 204548, -498216, -133681, -164283, 636729, -71941, -20401, 97711, 171799, - -75699, -63351, 183610, 111669, -336081, 43487, 70867, 283468, 86973, -204011, - 228707, 100932, 169114, 22549, -157303, -127775, - }, - { - -530428, 12821551, 960462, 2789581, -408559, 1465658, -939524, 1313186, 854699, -1037772, - -3743064, -3206193, -4458713, 35022236, -8247948, 7736310, -2794950, 865436, -1609002, -2252174, - 6433861, -8771934, -1000727, -11754789, 6888054, 3299072, 1635309, -1392106, -6154688, 3059091, - 4195110, 3280281, 1495186, 107374, 5259188, -1333587, -545461, 3361349, -3510599, 2618320, - -1500017, -389768, 860604, 1328219, 1490891, 1394791, -1175747, 2937221, -959388, 965831, - 1066226, 215285, 2404108, -2046552, -794569, 8590, 1701344, -717260, 1620813, -339839, - 591095, 427349, 861141, -686121, 180389, 535260, 354335, 149787, -24696, 194884, - 504659, 527207, 231928, -159451, -28991, 260382, 742493, 24159, 154082, 462246, - -17180, -257161, -380105, -201863, -38655, 331249, -39728, -59593, 82141, -277562, - 60666, -379031, 128849, 95026, -98784, 146566, - }, - { - 2579128, -73901888, 3930432, 5585605, 2425046, 5025112, -5243082, -1736241, 106300, -766652, - -2010045, -5747740, -7722888, 8047158, -31071404, -496606, 8052527, 1809255, -2180233, 2630668, - 2258079, -644782, 3324305, -2633352, 3775813, -244813, 644245, 1170916, -4110821, 399969, - 312996, 681826, 1043677, 875636, -2241436, 2284386, -2492692, -755377, -187368, -136902, - 1700270, 1915555, -3185255, -816581, -268435, -147103, -462783, -1920387, 999117, 1592896, - 486405, -1442572, 366683, 1607928, 15032, 271120, 617938, -863288, -603443, -529355, - 329639, 190589, -501437, -393526, -260919, -169651, 98247, 398358, 165356, 64961, - -137439, 277562, -87510, 440771, -129386, 617402, -476205, -94489, -178778, -64961, - 276489, 345745, -193274, 267899, 38655, -41339, -62814, -91805, -87510, -22012, - -314606, -33823, -107911, 144418, -76236, -43487, - }, - { - 407485, -2374043, -1466731, -1632088, 701690, 1162326, 912681, -409633, -1234803, -462783, - 3457986, -4346507, -4344897, -37352792, -26722750, 3187403, -2510409, -6507949, 5018133, 7984344, - 3504157, -4678830, -1188632, -2864206, -1330903, 6337224, 3221226, 775778, -897111, -3479997, - -1669132, 1699733, -1615982, -860067, 1016297, -2485712, 2480344, 2876554, 3346317, 870268, - -2545305, 2039036, 834834, 541703, 840740, -24696, 349503, -1688996, -1555852, -94489, - 1789928, -593242, 170725, 384400, 134218, 26307, 2063195, -796180, -493384, 338229, - 619549, -1440425, -828929, 478889, -534723, 964757, 424128, -830002, -54224, 279710, - 80531, -83752, 539018, -98784, -292058, 28454, -429497, -209917, 186294, -190589, - -151398, 56908, -310848, -303869, -60130, -159988, 150324, 85362, -25770, 25770, - 163746, 24696, -62814, 20401, 215822, -87510, - }, - }, - { - { - 9602473, 175600272, -76570144, 2070174, 4548371, -687195, -1898376, -3208341, -5107253, -1168768, - 1358820, 6780143, -1411434, 1438277, -3906273, 350577, 874026, -5732171, 1672890, 1844152, - -2731599, -2896419, 428960, 2002529, -2328946, -2594697, -1192927, -3418257, 5247377, 788127, - 110595, 2467996, -1957431, -150861, -114354, -1063541, 436476, 908922, 751082, -3211025, - -1783485, -1380832, -2421288, -610959, 1910724, 753230, 947040, -212064, 1122597, 2256469, - 1133871, -1544041, 790274, 649077, 1187022, -334471, 92879, -290984, 563178, 583042, - 682900, -6442, 957241, -707059, -26307, 154619, 106300, 198642, 63888, 239981, - -85899, -69256, -313533, 460098, 556735, 411780, 308701, 120259, -95563, -68183, - -489089, -155693, -29528, 5906, 238371, -235686, -81068, -81604, -153008, 22012, - -183073, -105764, 79457, 10201, 63888, -1611, - }, - { - 627602, 35140348, -22903450, 1286880, 2106145, 2102387, 663572, 2091649, -1065152, -3355443, - 68719, 1762547, -58519, -2410551, 14756434, 3811247, -5121749, -1512902, -10866267, 2095407, - -238908, 3872987, -2414845, -2858301, -854162, -2803003, 1600949, -1956895, -1059246, 652835, - -296353, 3264712, -723165, 1195612, 12885, -1257352, 288837, 1417876, -1364189, -1737314, - 452582, 818728, -1460826, 924492, 1345935, -542240, -10201, -872952, -845572, 518080, - 357556, -1257889, -936303, -79457, -347355, 341450, -82678, -277025, 415001, -111669, - -641024, -889058, 269509, -302258, 360240, -173409, -76773, -345208, -99858, 597000, - -377957, 162135, -112206, 47782, 66035, 191126, -103079, 1074, -108448, -211527, - 244276, 102542, -68719, 280784, -106837, -162135, -585189, -308164, -254477, -236760, - 282931, 45097, 184684, -11274, -150861, 99321, - }, - { - -4199405, -132250096, 14464913, 9352828, -2280091, -678068, -1588064, 1531156, 897111, 651761, - 289373, -1808718, -2810519, 5015448, -3041911, -2904472, -4680441, -4495757, 911070, 2329483, - -410706, -300111, 7619272, 1198296, -4769025, -3833795, 604517, -672162, 2285996, -1166084, - -2403571, -1360431, -4019553, -331786, -4868346, 4514011, -1061931, -132070, -696322, -1722819, - -1427540, 284005, -3284576, -199179, 1336809, 378494, -683437, 689342, -1066226, 285615, - 1125281, -198642, -679679, 92342, 559956, 191663, -46708, 494995, -137439, -849330, - 274878, 890669, -328565, -909459, 373125, -838592, -56908, 479963, -20938, 61203, - -53150, -39728, -285615, 168577, -112743, 52613, -8590, -228170, 388158, -175020, - 325881, 236760, -50466, 304406, 220654, -55835, -25233, -37581, -168041, 170725, - 81068, -115427, -30602, 26844, 148713, 108448, - }, - { - 30729418, 88684096, -11206643, 3570729, -5124970, -811749, -2885144, -346282, -199179, 341987, - -1080184, 2186675, -5906, 175557, -10087804, 4702453, 3304977, -13804562, 856309, -3681861, - 705985, -1751810, 2771328, -1410897, -446677, 317828, -2056753, -1713692, -2392297, -1981591, - -3052111, 2075006, 1582159, 1919314, -1500017, -551903, -221728, 2518462, -195958, -1103807, - 593779, -503585, 218506, 360777, -1025423, -1760400, 225486, 1751810, -288300, 577136, - 170725, 105764, 220654, 1683627, 765578, 139050, -943282, 86973, 201863, 1111323, - -675384, 354335, -176094, 102542, 63888, 154082, 14496, 369904, 23085, -93952, - 571768, 3221, -60130, 277025, 207769, -225486, -198642, -421981, -6442, -141734, - -109522, -166967, 89657, 18790, -207769, -51003, 40265, -40265, -128849, 150324, - 38118, -61203, -166967, -15569, -62277, 79994, - }, - { - 1646046, 21906480, -751619, 1210107, -364535, -38655, 168577, -261456, 378494, -700080, - 1530082, -1037772, -4337917, -909459, 2218351, -7183870, -159451, -37058588, -5529234, 10773925, - -6609418, -6386080, -6345814, -3955665, 4012573, 867047, 1526861, 1950989, 1560684, -1982127, - -3130494, -708670, -833224, 852014, 1560684, -535797, -253403, -2566780, -2643016, -2945274, - -2071785, -1500017, -1292248, 2011118, 1430761, 151934, 852551, -1296006, -635655, -628676, - -483721, 825707, -953483, -42950, 2037962, 12885, 78383, -1624035, 785979, 305480, - 346282, 229244, 370441, 526134, 89121, 300648, -731755, -149787, -235686, -824097, - 309238, 465467, -299574, -249108, 121870, -619012, -100395, 126165, -52076, -122943, - -108985, 32212, 370441, 39192, -8053, 390842, 217433, 102542, -45097, 116501, - -4295, 66035, -138513, 213138, -129386, -3758, - }, - { - 53814328, 51080584, -33344516, 8837969, 3195456, -636192, 938987, 139586, 2566243, 2495376, - 656593, 637266, 7882876, -2741800, 3233037, -2334315, -3692061, 1688996, -1524177, 1239635, - -877784, 3568581, 497142, -1294396, 390842, 566936, -376883, -761820, -838592, 143345, - 6010807, -226560, -1700270, 256087, 1673427, 1171452, 1451699, -1447404, -921271, -1007707, - -4870493, -291521, -1866163, -3283503, -1367947, 539555, -131533, 293132, -1368484, -1857573, - 1217086, 104690, -623844, -412317, 1350767, 1408212, 900869, 1308891, 345745, -273267, - -311385, -71941, 675384, -284005, 706522, 35433, 280784, 91805, 33823, -75699, - -45634, -77309, 83752, -601295, -286689, 189515, -354872, 99321, 129386, 160524, - -324270, -184684, -188979, 190589, -73551, -239444, -132607, 109522, 34360, 60666, - -22549, 27917, -1611, -127775, 126165, -233002, - }, - { - -181462, -9439801, -3185255, 2140504, -728534, -157303, -763430, 1298691, 794569, 550830, - 415001, 2258079, 4909148, -7160248, 13274670, 2753074, -5790690, -2379949, 1978369, 10901164, - 307090, -3029563, -19486266, -6674379, -241592, 1651952, -2826089, 985695, -841814, -365609, - 105227, 1679332, 316217, -2079838, 291521, 3165928, 1190243, -144418, 2266669, 529892, - -899259, 779000, 1204738, -2572149, -593779, 65498, -157840, -939524, -279173, 100932, - -8590, -191126, 1182190, 418759, 1047972, 175557, 256624, 854162, -494458, -547608, - 41339, -390842, -601295, 5906, -618475, -1111323, 163209, 324270, 235686, -57982, - -330712, -344671, 311922, 452045, -238371, -37044, -63888, -39192, -53150, 211527, - -32212, -100395, 204011, 103079, 16643, 105227, 91805, -67109, 86436, 297963, - -56908, 79994, -86436, -7516, 91268, -62814, - }, - { - -38442640, -105970264, 32438278, -207232, 3629784, 395674, 2578054, -2223719, -4495220, -102005, - -478352, 2915209, -1842541, 4916127, 6295349, 1371168, -22549, 4493073, 48855, 1167694, - 2430415, -699006, 1142998, -367220, -274341, -914828, 1532767, 3583077, 391916, -711891, - -685584, 1850594, -1909650, -1464584, 2056216, -4102231, -1269163, -986232, 369367, 1241246, - -598611, -107911, 1265405, 2152852, 819265, 1957431, -1574106, 2377801, 948651, 417686, - -1334124, -228707, -981937, 503585, 668404, -368830, 476205, -803696, 598074, 348966, - -398895, -238908, -368293, 788663, 1057636, 333397, 16643, 1003949, -146566, 312996, - -222265, 442382, 257161, -347355, 318901, 309238, -7516, -335007, 164819, -122943, - 8053, -330712, 116501, -62814, 229781, -177167, -83215, -214748, 4295, -42950, - -107374, -28991, 78383, -7516, 54224, 265751, - }, - { - -275952, -6934225, -7456600, 1637456, -520228, 474594, -293132, 1675574, 1217086, 539018, - 2512019, 792421, -949725, -4638565, -5193689, 5677410, 9450002, -12348, -5574868, 300648, - 5178657, 5412196, -4245039, 2688113, -9956808, 2689723, -2110977, -4736812, 4507032, 1031329, - 2529736, -565325, 424665, -445066, -935229, -865436, -2674154, 672699, -668404, 226023, - -1604170, -532039, 689879, 166430, -2334315, -942208, -270046, -1020055, 1747515, -1132261, - 725850, -665183, -869731, 683437, 625455, -729608, 57982, -859530, -317828, -126702, - 57445, 843961, -121333, 859530, -592706, -101469, 333934, 417149, 733903, 181462, - 42413, -339839, -48855, -88584, 156229, -84826, 182536, 59593, 47245, -28454, - -177167, 121870, 27380, -140660, 299037, -124017, 47782, -94489, 300111, -17717, - -266825, 86973, -20938, 232465, 6979, 12885, - }, - { - -2483028, -121585152, -11395085, 372588, 3907347, -5592048, -1047435, 926102, 1275605, 505732, - 351650, -1275068, 602906, 4030827, 798327, -1604707, 3176665, -3172370, -1862405, 2341831, - 11811, -2618320, 2253247, 2327872, -1717987, -2117419, -1875290, -219043, -1755568, 949188, - -2625299, -1721745, -331249, 1321776, 2463164, 1661079, 1238024, -2534031, 1432909, 1174137, - 1235877, -1301912, 2485176, 420370, 961536, 205622, -969052, -570694, 399969, 232465, - -959925, -434329, 17180, -409096, 199179, -293132, -359167, 294742, 382789, 126165, - -244813, -648003, 86973, -5906, -193810, 81068, 585726, 60130, 143881, 161598, - 185220, -432718, -143881, 239981, -100395, 229244, -384936, 143345, -122943, -45097, - 53687, 40265, 42950, 204548, 28991, 60130, -81068, 76773, 25770, -63351, - -83752, -20938, -7516, -140123, 1611, 1611, - }, - { - 1204202, 15008226, 1495186, -5535676, 212064, -2586644, -825707, 3350611, -1896765, -1131724, - 392990, -2180770, 2684, -3368328, -486942, -1867774, -8206609, 8533026, -3117073, 545461, - 13707388, -4927401, 4233764, 1691143, 2047626, 1643899, -2208150, 5216775, -4336843, 1089848, - -3252364, 3102577, 5055714, -3139084, 11274, 759136, 631897, -1535988, -2262374, -459025, - -399432, 1192390, -68183, -336081, 908386, -716723, 652835, -1393180, -1132798, -542240, - 1056562, 535260, 747861, -12348, 451508, -1427540, 81068, 335544, 556198, -88584, - -515396, -212601, 270583, 401579, 127775, 411780, 51003, -346819, 235149, -150324, - -253940, -293132, -464930, 346282, -236760, 107911, 12885, 369367, 43487, 42413, - -126165, 96637, -218506, -19864, 95026, 107911, 69256, 88584, -98247, 57445, - 109522, 209917, 60666, 155693, -209917, 7516, - }, - { - -19209242, -16858820, 11042361, -4396973, 1447404, 6880001, 4268661, 1024350, -1315871, 870268, - 3095061, -1898376, -40802, -5365488, -6162741, 3365107, 786516, -645856, 1886564, 2460480, - -2072322, -228170, -613643, -1440425, 34360, -1105954, -1159641, -2315524, 301721, -2106145, - 449898, -988916, 983548, -2442226, -2403571, 627065, 1637993, 1030255, 530428, -1596654, - 1899986, 1601486, -3308199, -1594507, 184684, -347355, 281320, 1851131, -2267206, 19864, - -470836, 1319629, 319438, 1289027, 297963, 501437, 872415, -132070, -362388, 599685, - 456340, 16643, 112743, 76773, -428960, 223338, 3758, 286152, 196495, 170725, - -215285, 246961, -524523, -192200, -34897, 179852, 148713, 125091, 103079, 8053, - 104690, -206695, 260919, 12885, -105764, -76236, 26307, 191126, 199716, -277025, - 81604, -56371, 176094, -16643, 32212, -94489, - }, - { - 183073, 11292543, -1156957, 4100620, 635655, 2029372, -2343979, 2317135, 348966, -2225330, - -3142842, -2067490, 14861124, 3660923, 2205466, -3194382, -2582349, -157303, -3416110, 178778, - -7427072, 2776696, -7543037, -947577, 2922188, 3685082, 816581, -4793184, -1976222, -2778307, - 6291054, 4552666, 1053878, 1334661, 1871532, 1930588, -1409286, 2287070, 297963, 470299, - -955093, -332860, -541166, 1074816, 1233729, 2204392, -390842, 165356, 319438, -404801, - 1481764, 964220, 1868848, -1529008, -532039, -305480, 1207960, 16643, 206695, 899259, - 53687, 792958, 322659, -460635, 321049, 526670, 564788, -498216, 293668, 24696, - 854699, 665720, 355409, -553514, -32749, 403727, 499827, -279173, 420907, 193810, - 249645, -273267, -357019, 59056, -155156, 448824, -537, -97711, -137976, -144418, - 177167, -448287, -177704, 170188, 43487, -125628, - }, - { - -11824045, -60889216, 8794482, 9618579, 1644973, 3204583, -724239, -1845762, -2171643, -149787, - -4009889, -4252555, -5035849, -6415608, -16318728, 3029563, 3403762, 1063541, 391916, 2384781, - 1495186, 2194192, 590558, 1096290, 755914, 236223, 81068, 1012002, -2992519, -1278827, - 1625108, -1431835, 2030446, -932008, 1160178, 571768, -2404108, -259309, -1711545, 866510, - 3214246, -494458, -2139968, -109522, -186294, 329639, -1835562, -172872, 1157494, 300648, - 997506, -443992, -599148, 854699, 887985, 201327, 985695, -855235, 103616, -461709, - -150324, 297427, -712428, 139586, -399432, -290984, 499290, 723702, 20938, -333934, - -69256, 537, 176094, 404264, 213138, 209380, -340376, -31139, -19327, -237834, - 172336, 319975, -30602, 135828, 329102, 144955, -281320, -39192, -238908, -84289, - -30065, -87510, -51540, 56371, 22012, -213138, - }, - { - -448824, -1575716, -698469, -1313186, -1611, -121870, 587874, -197032, 1044214, 1571421, - -539555, -2971044, -9021042, -2940979, -82478408, 11960947, -574452, -3256659, 2024540, -2080375, - 12291660, -3726958, -6963753, -4832375, 6506339, 2909304, 2885681, 1222992, -583042, -4268124, - -635118, -1644973, 1314260, 222801, 639413, -3965866, 1285269, 5449240, 1148367, 1090385, - -113817, -724239, 1291175, -66035, -79994, 533650, -730144, -594853, -695248, -220654, - 1195612, -400506, -531502, 295279, 96100, 565862, 1569274, -703301, -337155, -403727, - -98784, -1000191, -383326, -275952, -137976, 505196, 542777, -846645, -17717, 309775, - 132070, 166967, 82678, 20938, -262530, -41876, -286689, -403727, 146029, -179852, - -123480, 224949, -215822, -412317, 45634, -81604, -15569, 278099, -59056, 10737, - 104690, 70867, -537, -36507, 144418, -122943, - }, - }, - { - { - -8045548, 170596640, -38579544, 9034464, -1607928, -612570, -245887, -1997160, -2284386, 2559264, - 1545115, 2965138, -1723356, -1080721, -2207613, 2128693, 1925756, -132070, 3574487, -2034204, - -894964, -1962800, -104153, 1997160, -497679, -1033477, 1678259, -2915209, 3680250, 1154809, - 2354179, 3212636, -1869921, -331786, -389768, 740345, 394600, 589484, 425202, -3344706, - -1175210, 375810, -1111323, -639413, 247497, -1132261, -88584, -579284, 164283, 304406, - 141734, -1034550, 172336, -259309, 557272, -565325, 519691, 177704, 189515, 186294, - 572304, -472983, 468688, -277025, 214748, 265751, 57982, -128849, 17717, 284005, - 239444, 18790, -166967, 33823, 109522, 22549, -18254, -31139, 244276, 209917, - -241055, -159988, 142808, 178241, 162135, -58519, -140123, 25770, -120796, 3221, - -52613, 34360, 105227, 78920, 96100, 54224, - }, - { - -1981591, 50608672, -10912438, -3982509, -4468377, 126165, -1392643, 1177358, -1332514, -841814, - 1018981, 553514, -1780801, -4276177, 7454990, 4820564, -1770600, -898185, -9470403, -419296, - -3712999, 2700998, -1098438, -1529545, 3406446, 956704, -593779, -3269544, -1513439, -223875, - -1940788, 3655017, 2868501, 1124208, 1671279, -2454037, -2339147, 941672, -779000, 207769, - 845572, 525060, -1501091, 574452, 2194192, -1066763, 249108, -116501, -161598, -140123, - -234613, -300648, 20938, 483721, -533113, 509491, -526134, -496606, 449361, -15032, - 180926, -96637, 352187, -397284, 262530, 38118, 226560, -264677, -182536, 100395, - -233539, 314069, -162135, 133681, 148176, 48318, -141197, 231928, 90731, -187368, - -46708, 113817, -55298, 151934, -46171, 123480, -127238, -25770, -63888, -270583, - 271120, -38118, 93952, -122943, -188979, 126165, - }, - { - 3461744, -110886928, 25243670, 11279658, -4230543, -137439, 70330, -377957, 187368, -180926, - -177704, 1294933, -3966939, 3197066, -2645700, 1249836, 926639, -731755, -4566087, -1139777, - -1183264, -1756105, 2770791, -1755031, -1413581, -2618856, -660888, -486942, 2659122, -2428267, - -1917166, 2622078, 180926, 1411971, -5468030, 4181151, 952946, 1342714, -915902, -261993, - -545998, 2618320, -312996, -555125, 449898, -486942, 46171, 464393, -1272384, -7516, - 773094, 67109, -449361, 1015223, 813359, 90731, 69793, 0, -245887, -564251, - -386010, 290447, 417149, -301185, 687732, -241592, 19864, 250719, 226560, -35970, - -259309, -206695, -107374, 496069, -172336, -268972, 39728, 33823, 314606, -258235, - 19327, -25233, -169651, 125628, 168041, -200253, -84289, -74625, -107911, 156229, - -59056, -38655, 112206, -43487, 22549, 170725, - }, - { - -28643136, 40293236, 12128988, 3809099, -236223, 90194, -1802813, 175020, -989990, 142271, - -1682017, 1421634, -212601, 612033, -10683194, 871878, 1508070, -11012296, 2537789, -2387465, - 857920, -1027034, 3687766, -64425, -490700, 1431835, 531502, 892279, -300648, 0, - -1793149, 181999, -1106491, 473520, -842350, -1265942, -1464584, 1757715, -1209570, -639413, - 1337882, 147103, 34360, -1130650, 104153, 279710, -330712, 642098, -832687, 215822, - 74088, 302258, -243203, 512712, 504659, 1036698, -427349, 198642, -163746, 557272, - -572841, 463320, -579284, 111132, -190589, 85899, 102542, -49929, 63888, -23622, - 426812, -216359, -115964, -28454, -46171, -236223, -170725, -106837, 214748, -26307, - -190589, -164819, 112743, 177167, -120259, -81068, 41339, -73014, -47782, 104690, - -15032, -19327, 23085, 26844, -117038, 95026, - }, - { - -1214402, 15358266, -1526324, 1439888, -1044751, -147103, 177167, -403190, 537408, -515933, - 1149441, -536871, -1861868, -668941, 9405442, -198105, 2499671, -6021544, 15421080, 6287296, - -3752728, 3663070, -336081, -1458141, 2648384, -1036161, 168577, -329639, 1538135, 1450625, - 832150, 60130, -1494112, -1423245, 2073932, 312459, 478889, -1178432, -531502, 825171, - 796180, 710280, -734976, -2147, -385473, 302258, 148176, -557809, 634045, 97174, - -26844, -19327, -794032, -681289, 605054, -577136, 284542, -1160178, 681826, 272194, - 944893, 209917, -574989, 66572, 63888, 191663, -410706, 113280, 258772, -570694, - 98784, 336081, -125091, -96100, 527207, -8053, 103616, 114354, 213138, 51540, - 20401, -29528, 179315, -19864, -150324, 98247, -73551, 68183, -60130, 200253, - 23622, 1074, -190052, 259846, 27917, -40265, - }, - { - -45934140, -2149094, 32672890, 3327526, -1082869, 562104, 755377, -3623879, 1423782, 2110977, - -2434710, -1773822, 3531000, -4890357, 2668249, 702227, -2297808, 193810, -792421, 2180770, - -1371705, 1887638, -67646, -922344, 1191317, 1253594, 561567, 1110786, 668941, -963146, - 4166118, 276489, -652298, 910533, 957241, -442382, 647466, -1835562, -337692, 145492, - -1713692, 1619740, 137439, 750546, -692564, -7516, -1365263, 263067, 956704, -1339493, - 857920, 326954, -103616, -339839, 292058, 716723, -25770, 451508, -176094, 291521, - -278636, -321586, 754841, -285615, 450435, -46708, 441308, 53150, 234076, -88584, - -122943, -97174, -5906, 134755, 150324, 314069, -206695, 11811, -10737, 382252, - 24696, 14496, -136365, 303869, 12885, -18254, 25233, 10737, -215285, 91268, - 57445, -5369, 19864, -134218, 163209, -87510, - }, - { - 398358, -2341294, -489089, 2003602, -451508, 287763, -387084, 1056025, -21475, -163209, - -209917, -677531, 2035815, -6436546, 9509594, 5966247, 4422743, 792958, -943819, 7246684, - -290447, -942208, -13385266, -3872450, 790811, 1644436, -1206349, 678605, -1513976, -2063732, - -2277943, -1137093, 2923799, 1044214, -431644, -634045, -369904, -329102, 1382443, 1079111, - -647466, -333397, 1229434, -289373, 1431298, -22012, -134218, -468688, 299037, -263604, - -317291, 47245, 537945, -66035, 188979, 201327, 596464, -83752, -443455, -9127, - 332323, 19864, -309238, 221191, 121870, -452045, -149250, 91268, -175020, -96100, - 133144, -368830, -219580, 317828, 159988, 181999, 122407, -106837, -306016, 133681, - 139050, -261456, 127775, 8053, -69793, 41339, 23622, 87510, 77309, 208306, - -81068, -20938, -38655, -62277, 37581, -20938, - }, - { - 33119030, -70817568, -13683229, -3478924, 343061, 86973, 2279017, -845035, -21475, 909996, - -374736, 2952253, -1403917, 394600, -1798518, 276489, -2194728, 41339, 345745, 1068373, - 128312, -2401961, 525597, -1191317, 969589, 259846, 1108102, 1660542, -597000, 564788, - 403190, -774705, -986769, -1948841, 338229, 411780, 601832, -312996, -1243393, -178241, - 1185411, 811212, 793495, -145492, -672162, 1451162, -973347, 1899449, -70867, 417149, - -789737, -526134, -95026, 828929, -150861, 607738, 1173063, -523449, -108448, 221728, - 304943, 4295, -413391, -169114, 299037, 230318, -426812, 525597, -130460, 421981, - -594316, -425202, 95563, 74625, 317828, 250182, 251256, -146029, 494995, 54761, - 126165, -62814, 195958, 41876, 196495, -209917, 63888, -130460, 40265, -1611, - 88584, 112206, 2147, -93416, -46708, 124017, - }, - { - 971736, 6599754, 986769, 2087354, -1763084, 140660, -510027, 1364189, -337155, -384400, - 2376728, 140123, 2425046, 2468533, -2449205, 4296578, 2380486, -163746, 1682017, -2738579, - -1613297, 3098819, -2959233, 7564511, -9423695, 1976759, 1967095, -4565550, 2032056, -1746978, - 1374390, 599148, 1585917, 1392643, 19327, 106300, -876173, 597537, -1017370, 874563, - -337155, -489089, 308701, 1442035, -418759, -5369, 204011, -1548336, 1414655, -933082, - 613643, -146029, -805306, 30602, -173946, -751082, 195421, -816581, 635655, 85362, - 160524, 628676, -630286, 381178, -242129, -22012, 79457, -68719, -191126, 261456, - 352187, -88047, 302795, -35433, 97174, -151934, 2147, 151934, 117038, 73551, - -41876, 27917, -41876, -237297, 170725, -190052, 84826, -122407, 216359, 9127, - -44560, 21475, -141197, 99321, -79994, 81068, - }, - { - 2952253, -80271328, 21221970, -857920, 3464965, -4030290, -1212791, -1969243, -390842, -1242319, - 1842541, -226023, -3031173, 20401, 3508452, -2928631, 5968394, 2124398, -1837709, 5635534, - 2831457, -3059091, 1106491, 2134062, -1991791, 89657, 1511829, 654446, -2104534, 952409, - -2349347, -2048163, 235149, 29528, -1826972, 1239098, 1572495, -2572686, 1484985, 831076, - 1301912, -1240709, 1637993, 682363, 979789, -680215, -970126, 331786, -89121, 17180, - -582505, -240518, 111669, -650688, 531502, 370978, -68183, -294205, -108985, -419833, - 167504, -279173, -55835, 176094, -315680, 76236, 500364, -186831, 1611, -53687, - 135828, -284005, 51540, 188442, -96637, 94489, -275952, 83215, -61203, -33823, - -39728, -5369, 17180, -38655, -15032, 69256, -75162, 121333, 15032, -53687, - 119185, -51003, 84826, -53687, 119185, 8590, - }, - { - -1288490, 14818174, 4721780, -4306242, 1233729, -1952063, -924492, 4001836, -184147, -647466, - 914828, -1062468, -3641596, -2924873, 3177202, -2006824, -4603131, 8339216, -1937030, -5767068, - 6449967, -6452652, 2198487, 1037235, 2223183, 630823, -4472672, 4814659, -2072859, 4435091, - 227633, 493921, 1574642, -2332167, 786516, -697395, -1327682, -1533303, -469225, 442919, - -26307, -321586, -275952, 463320, 216896, 251792, 815507, -1212255, 341987, 558346, - 981937, -246961, 156229, -323196, 936840, -104153, 320512, -98784, -193274, -273267, - -20938, -81068, -135828, 308164, -44023, -155693, -26844, -119185, -46708, -62814, - 290447, 75699, -210990, 385473, -224949, 129923, -125091, 146566, 8590, 23622, - -8590, 133681, -303332, -26844, 34897, 135291, -537, 82678, -127775, 22549, - -34897, 115964, 11811, 116501, -137439, 60666, - }, - { - 11497627, 12676059, 302795, -4154844, 1493038, -3768834, -2102923, 333934, -1975148, 2145336, - 1420024, -1082332, 3960497, -1061931, -6146635, -813359, -2141578, -1891396, 1570884, 172872, - -467078, 165356, -2134599, -1491427, 133681, -1023813, 884226, -1519882, 591632, -2665027, - -132607, -3333968, 838056, -795106, -739808, 551366, 838592, 793495, 663036, -1955821, - 469225, 781147, -1158567, -146029, 653909, 408559, -177704, 939524, -2062658, 1540283, - 139050, 459025, -1003949, 271120, -353798, 23622, 788127, 179852, -379031, 402116, - -159988, -242129, 102005, 35970, -526134, 325881, 154619, 53150, 1074, 224949, - -303869, 210453, -293668, 117038, 115964, -2147, 68183, 209380, -24696, -24696, - 325881, -65498, 108448, 16106, 69256, -116501, 22549, -132607, 94489, -24159, - 56371, -91268, 87510, -41339, 92342, 5369, - }, - { - 33823, 6331319, -7087233, 2043331, -732292, 1249836, -2697240, 1438814, 115427, -734976, - -1973001, -651761, -6290517, -19853486, 8371965, -9520869, -5015448, 190052, -4184372, 612570, - -5857262, 6535867, -3767223, 2960843, -3357591, -3346317, 812823, -2952790, -1301912, -2437931, - 1296543, 817654, 82678, 1138166, -522912, -302258, -2377265, 217970, 651761, -1357747, - -1713155, 961536, -599685, -381178, -721555, -120796, -651224, 153545, 965294, -863825, - 116501, -281857, 619549, -956704, 388695, -556735, -195421, -270583, -190589, 653372, - -35433, 737124, -256624, -239981, 170188, -17180, 163746, -240518, 387084, -363462, - 417149, 88047, 280247, -100395, 240518, 89657, 26307, -368293, 207769, -186294, - 167504, 2147, -124554, 122943, -211527, 255014, 136902, -108985, -126165, -53150, - 176631, -92879, -129386, 20938, 178241, -135828, - }, - { - 14137959, -30617748, -918049, 746251, -5572720, 4269198, 6763500, -623307, -89657, -142808, - -384400, 1185948, -786516, 6640020, 1781338, -3757560, -3551401, 2093797, 499290, -67109, - 1188095, 1999307, -1662689, 268972, -386547, -103616, -706522, 383863, -1033477, -1926293, - 1226750, -1616518, 1260573, -615254, 2000918, 489626, -1864553, 476205, -1425392, -88047, - 405338, -1661079, -1548336, -330712, -894427, 6442, -923418, 409096, 629750, -196495, - 692564, -266825, -442382, 738198, 433255, -154082, 615791, -574452, 398895, 40802, - 44023, 359167, -117575, 264141, -326954, -235149, 467615, 181462, -181999, 6979, - 36507, -128849, 204011, -117575, -91268, 162672, -39728, 20938, -29528, -162672, - -70330, 64425, -134755, -56371, 33286, -75699, 90194, 214212, -222265, 27917, - 100395, -195958, 15032, 43487, 96100, -150861, - }, - { - 373662, -4010963, -2139431, -409633, -559420, -495532, 75699, 205085, 1044214, 561567, - -1841467, -2228551, -4751845, 28738700, -51363512, 4473209, -2385854, -2816425, -2391223, -6880001, - 3936875, -7474854, -3116536, -58519, 2811056, -236760, 903554, -1468879, -678605, -1637456, - 268435, -1732482, 1529008, 25233, 1465658, -1839320, 976031, 1659468, -1137093, -8590, - 608812, -952409, 535260, -419296, -9127, 62277, -546535, -133681, -742493, 217970, - 1035087, -610422, 124017, -704912, -1447404, -323196, 711891, -410706, 53687, -492311, - -167504, -514322, -113280, -368830, -224412, -307627, 165893, -212601, -7516, 304943, - 111132, 450435, -159988, 10737, -64425, -6979, 116501, -123480, 97711, -125628, - -233539, 28454, -45634, -44023, -64961, -44023, -33286, 60666, -21475, 84289, - -60666, -32749, 41876, -33823, 81068, -139050, - }, - }, - { - { - 8143258, 81192064, 40925132, -4341675, 1081258, -93416, -260919, -1383516, 1123671, 191663, - 1206349, 1614908, 271657, -2321430, -77846, 2550137, -67109, 3339337, -1942936, -1223529, - 957778, -632971, -644782, 245350, 283468, 84289, 1741609, -1013075, 1013075, 1181653, - 3625489, 1133335, -181999, 162135, -429497, 1895154, -856309, 1286880, 4832, -2046015, - -722091, -233539, -17717, -81068, -514322, -186294, -173946, -1599339, -3221, 9127, - 6979, -26307, -245350, -79994, -46171, -286689, 301721, 387621, -308701, 163209, - 321049, -90731, -83215, -44560, -16643, 240518, 75699, 25233, -30602, 48318, - 344671, -112206, 225486, 16643, -193810, -107374, 72478, 113280, 83215, 103079, - 102005, -4832, 85362, 129923, 107374, 35433, -17180, -32749, -29528, -60666, - 64961, 25233, 68719, 105227, 51540, 62814, - }, - { - 1477469, 26302916, 6548752, -4999342, -2914135, -820339, -846645, -118648, 165893, 221728, - 477815, -923418, -1136019, -243203, 2250026, 3333968, -4005057, -1319092, -5454072, -2443300, - -2088428, -908386, 373662, -530428, 4638565, 1105417, -1407139, -3746822, -1257889, -1183264, - -110595, 2034741, 3059627, 1086627, 1780264, -1229434, -556735, -740345, 13422, 618475, - -943282, 1182190, 90194, 139586, 1052267, -587874, 48855, -290447, 176094, -259846, - -117575, 174483, 414464, 91268, -102542, -88584, -484258, -228170, 75699, 127775, - 52076, 409096, 98247, -161061, 47782, 229781, 289373, 113817, -245887, -127238, - 88047, -102542, -82141, 30602, 185220, 37581, -124554, 51003, 148713, 8590, - -26844, 27380, 11274, -39192, 91268, 116501, 36507, -6442, -34360, -3221, - -10737, 42950, 35433, -75699, -66572, 10737, - }, - { - -785442, -57276612, -17016124, 6589554, 4851703, 314606, 325881, -91805, 35433, 126165, - -2030983, -45634, 1838246, -64961, -2860985, 1811403, 180389, -311922, -3804267, -2481417, - -2500745, 3430068, -745714, -927713, -1020055, -1192927, -1219234, 295816, 361314, -423054, - -586263, 868657, 2766496, -806380, -1307281, 667867, 1291711, 1342714, -1167694, 213138, - 405338, 1424855, 1317481, -562104, -263604, -26844, 217970, 347355, -348429, -1611, - -667867, 494995, 156229, 1142461, 1014149, -157303, -108448, -109522, -335544, -289910, - -352724, 192737, 123480, 193810, 173946, 321049, -181999, 170725, 224412, 15032, - -398358, -163746, 216359, 290984, -118648, -159988, 2147, 140123, -25233, 61740, - -166430, -144955, -61203, -8053, 55835, -78920, -56908, -96100, 24696, 60130, - -49392, -16106, 60130, -33286, -3758, 110059, - }, - { - 18640158, -3452080, -2207076, 2463164, -858993, -830539, -788127, -53150, -233002, -844498, - -765041, -150324, -1105954, -509491, -5353140, -1149978, 815507, -5891622, -2700461, -970126, - 616328, 820876, 938450, 1032403, 318364, -24159, 673236, 425202, 435939, 617402, - -46708, -995896, -1018981, -343597, -265214, -940598, -1007170, 301721, -247497, -92879, - 333397, -315680, -375273, -146029, -253403, 785442, 1611, 274341, -359167, -346282, - 217970, -186831, 181999, 194884, 480499, 804770, 106837, 85899, -12348, -19327, - -155156, 71941, -124017, 134755, -152471, 112743, 218506, -215822, 91805, 150324, - -75162, -122407, -146566, -45634, -313533, -60130, -84826, 67109, 81604, 109522, - -68183, -21475, -17717, 49392, -11274, -56371, -15032, -84289, 8590, 55298, - -1611, -8053, 45634, 12348, -16106, 19327, - }, - { - 449898, 8844948, 1218160, 379031, -120259, 138513, -174483, -33823, 208306, 19864, - 120796, -658741, -514859, 919123, 4969814, 380641, -2647311, 10695005, 13036836, 2688650, - -537945, 151934, 2236604, 1932735, -93952, -496606, -1498944, -67646, 448824, 1255741, - 2930778, -963146, -892816, -1374390, 1219771, 839666, -248034, 1000191, -442382, 184684, - 417686, 947040, 238371, -352187, -856309, 98247, -275952, 522912, 454730, 469762, - -124554, -447750, -512712, -263067, -433792, -196495, 27917, -545461, 206695, 622770, - 609349, -167504, -340913, -115427, 137976, 47245, 189515, -54224, 64961, -161598, - -29528, 172872, -17180, 55298, 229781, 214212, 179315, 127775, 156766, 187905, - 104690, 10201, -157303, 6442, -20401, -43487, -17180, -20938, 82678, 94489, - 30602, -537, -76773, 51003, 87510, 54224, - }, - { - 27994060, -45991584, -9912248, -99858, 437013, 343597, 177704, -1432909, -590558, 838056, - -704375, -332860, -2635499, 363998, 352724, -678605, -612033, -88047, 858457, 867047, - 926639, 466541, -120796, -861141, 1005022, 636729, 1491427, 192200, 504122, 588411, - 1984275, -770410, 1245004, 812286, 1103807, -762357, -677531, -756988, 71404, 39192, - 256087, -580894, -52076, 777389, 264141, -437550, -689342, -124554, 822486, 157840, - -471373, 404801, 378494, -33823, -84826, 36507, 395674, 406411, 230854, -260382, - -81604, 71404, 280784, -67109, 59593, 189515, 257161, 185757, 0, -147103, - -44023, 46708, -190589, 264141, 100932, 122407, 127775, 6979, 19327, 210453, - 44560, -33286, -41876, 27917, 174483, 110059, 33286, -14496, -135828, -17717, - 54761, 63888, -5906, -66035, 1074, 108448, - }, - { - 244276, 3697967, -1068373, -1191853, 17180, 267899, 246961, 19864, 117038, -356482, - -76773, -50466, -1475321, 6009733, -278636, 3772592, 3430068, 534187, 3598646, 1432372, - -1396401, -1834488, -4007205, -8935143, -332323, 1647657, -245887, -1204202, -937377, -1466195, - -171262, -1119913, 1446330, 1311576, 392990, -1020592, -726386, 445066, 366683, 748935, - 572841, -481573, 151398, 292058, 1356673, 200253, 159988, -146566, -197569, -469225, - -187368, 369904, 134218, 109522, 114890, 188979, 463856, -272194, -119722, 214748, - -61203, 4832, 6979, 130997, -10201, -147103, -234076, 237297, -131533, -20401, - -246961, -103616, -176094, 83752, 273804, 239981, 265214, -16643, -210990, -120259, - 57982, 76773, -19864, -4295, -72478, 51003, -18254, 54761, 38118, -69793, - -11811, -90731, -3221, -4832, -18790, 12885, - }, - { - -23595476, -11735998, -3514357, -2415382, -1688996, 31139, 348429, 46708, 590558, 632434, - 1377611, 193810, -335007, -805306, -821413, 129923, -2433636, -1762010, 1415192, 315143, - -47245, -774168, -100395, 357556, -895501, 832687, 1193464, 86973, -233002, 1414655, - -255551, -1076963, -1030255, -1366873, 110595, 2230162, 264677, 357019, -1497333, -1126892, - 373125, 1254131, 1011465, -84826, -423591, -409633, 201863, 996969, -318901, 461172, - 16643, -861678, -18254, 174483, 122407, 851477, 529892, 274341, -227633, -298500, - 490700, -181462, 4832, -225486, 172336, -149787, -63888, 61740, 114890, 82678, - -246961, -428960, 12885, 223338, 144418, 187905, 331249, 144955, 278636, 87510, - 151398, 89657, -27917, 125628, 19864, -47245, 27380, -46708, -39728, 174483, - 75162, 56371, 26307, -75699, -27917, -18254, - }, - { - 137976, 8718247, 4467303, 735513, -221191, -265214, 201327, 291521, -259846, -158914, - 1369021, 61203, 2001455, -205622, 2176475, 2944200, 1256278, -1633698, 2932389, -4238596, - -496606, 1133335, -712965, 3884798, -3405372, -1651415, 185220, -15032, -1439888, -1691143, - 383326, 1527935, 1498944, 849330, 407485, 359704, -69256, -240518, 572304, -146029, - 144955, 353261, -246424, 676457, 843961, 442919, -82678, -519691, 34360, 22012, - -76236, 133681, -537408, -575526, -213138, -225486, -10737, -32749, 395674, -4832, - 122943, -99321, 118112, -255551, 37044, -351650, -173409, -69793, -117038, 310848, - 119185, -197569, 158914, -54761, 47782, 26307, -120796, 154619, 76773, 60130, - -33286, -24696, -127238, -106300, -46708, -537, 53150, 34360, 86436, -2147, - 81604, -22549, -84826, 4295, -9664, 93952, - }, - { - -3395172, -48153564, 1472637, 1220845, 1776506, 4276714, -6838125, -2346663, -1072131, -368293, - 258772, 364535, -1101122, -2421825, 2826089, 48855, 5724655, -101469, -637803, 3766150, - 1874753, 922344, -368830, 660888, -1089848, 180926, 1331440, -175557, -291521, 211527, - -807454, -1340567, -1757179, -725313, -746251, -14496, 493921, 155693, 307090, 737661, - 448287, 379568, 264677, 548145, 615254, 148713, -689879, 41876, -354335, 384936, - 134218, -196495, 12348, -20401, 162135, 423054, -79994, -302795, -264141, -205622, - -36507, -56371, -234076, 42413, -80531, 104153, 88584, 228170, -237834, 11811, - 38118, -30065, 54761, -64961, 73551, -114354, 41339, -89121, -67109, 2147, - -205085, 20938, 77309, -129386, 99321, 78920, 55298, 90731, 44023, 21475, - 58519, -31139, 537, 79457, 49392, 77846, - }, - { - 819802, 10079751, 2531346, -317291, -952946, 421981, 554051, 887448, 390842, 726923, - 540092, -516470, -1626719, -3650185, 4536023, -4079682, 1554241, 1313186, 1109712, -3053185, - -1212255, -1509144, 192737, 581431, 1687385, 456877, -594316, -5906, 1271310, 425739, - 1316944, 1368484, -330712, -1222992, -942745, 36507, -1430224, -282394, -370441, 619012, - -252329, -352187, 371515, 273267, -69256, 590021, 307627, -548145, 934692, 750546, - 464930, 151934, -177167, 126702, 166430, 77309, 51540, 14496, -275415, 198105, - -155156, -161061, 11274, 88047, 153008, -178778, -152471, 223875, -108985, 52613, - 78383, -147640, 133144, 92342, -88047, 98247, -39728, -99858, 5906, 34360, - 51003, 27380, -100395, -148176, -5906, 47782, -13959, 27380, -62277, -92879, - 11274, -12885, 10737, 34897, 65498, 40265, - }, - { - -2569464, 24303072, 1796907, -346282, 1984812, -4080219, -4157528, -883153, 642635, 1851668, - -1059246, -734976, 1329829, 1719061, -1842541, -4432943, -1633161, -455803, 57982, -967441, - 246961, -121333, -1440425, -293668, -433255, -269509, 58519, -763967, -680752, 118648, - -2337536, -2010045, -425739, -286689, 374736, -229244, 350577, 468151, -358630, -1159104, - 296890, -556735, -209917, 897648, 655519, 73014, 19864, -496069, -71404, 2147, - 1001264, -181999, -400506, -84289, -117038, -146029, 77309, 377957, -95563, -17717, - -324270, -114890, -32212, 64425, -298500, 67646, 263067, -70867, 27380, 130460, - 44023, -119185, 61740, 24696, 105764, 96100, 38655, 131533, -148713, 52076, - 168577, 156766, 28991, 82678, 6442, -32749, -85362, -108448, 11811, 124017, - 90194, 34897, 1074, -5369, 44023, 77846, - }, - { - -251792, 404801, -1811403, 934155, 70330, -10737, -486405, -435939, 510564, 215822, - -562641, -1129576, -4487167, -17009144, -537408, -3092377, -4024921, -1614908, -2123861, -1100585, - -679679, 355945, 4343286, -507343, -3688303, -4629975, 609885, -2679523, -1533840, 94489, - -152471, 273267, -857383, 1432372, -302795, -1523103, -933082, -615254, 260382, -793495, - -1093069, -217433, -143345, -1046898, -463856, -402116, 41876, 148176, 284542, -79994, - -759672, -114890, 204548, -165893, 472446, -247497, -682363, 31139, -36507, 121870, - 63351, 73014, 142271, 41339, 30602, -41876, -85899, -132607, 302258, 16106, - 104153, 87510, 32749, 170188, 177167, 84289, -81068, 11811, -97711, -27380, - -71404, 17180, 16106, -15569, -118112, 89121, 117038, 17180, -57982, -30065, - -11274, 84289, 9127, -51540, 115964, 2684, - }, - { - -10199474, 104690, 840203, -4031901, -2747169, 1216550, 5759551, 603980, 1017907, 39192, - 1430761, 108985, 1132798, -2813204, 11311870, -2057289, -3926674, 643708, 246961, -940061, - 1163399, 1733019, -1057099, -934155, 14496, 723165, -221728, -107911, -1314260, -362925, - -781147, -33286, 66035, 746787, 294205, 103616, -276489, -321586, -937377, -114890, - -657130, -865436, -1277216, -1188632, -747324, -590558, -411780, 343597, 416075, 236223, - -11811, -274878, 648003, 130997, 353798, -329639, -318901, 212064, 6442, 217433, - 23085, -95563, 376347, -170188, -92879, -173946, 207769, 61203, -6442, 73551, - -111669, -70867, 96637, -16106, -110059, -61740, 166430, 27380, -169651, -68183, - -110595, -86973, -100395, -97174, -57445, -155156, 172872, 104153, -25770, -1611, - 90731, -134218, -51003, 18254, 5906, -19327, - }, - { - -569620, -5401458, -706522, -452582, -349503, -9127, -548145, 118112, 876173, -424665, - -1838246, -1308891, -520228, -9583146, 8574902, -4240744, -3882114, -2800319, -1614371, -1713155, - -5196374, -5840082, -1582696, 1574642, 1510755, -1186485, -503585, -396748, 320512, -522375, - -1298691, 321049, 517544, 349503, 457414, -146566, 1086090, 99321, -450972, -363462, - 171799, 622770, 215285, -908386, 268435, -293132, -194347, -691490, -63351, 481573, - -17180, 31139, 51540, -645856, -995359, -473520, 23085, 15032, 128312, 59056, - -246424, -224949, 115964, -392453, 31675, -564251, -237834, 316217, -13959, 150324, - 33286, 452582, 77309, 78920, 22549, -108448, 34897, 94489, 99858, -47245, - -264677, -155156, -88584, 47782, -72478, -91805, 13422, -22549, 10201, 5906, - -10737, -68183, 13422, 5906, -4295, -28991, - }, - }, - { - { - -6244883, 19388556, 14042396, -5833640, 1089848, 311385, -158914, -830002, 847719, -1510755, - 83215, 1292248, 624381, -709207, -1017907, 1737851, -769336, 783832, -3694746, 1117228, - 414464, -336081, -1168231, -610959, 708133, 312459, 1191853, -240518, -284542, -646929, - 1949915, -467615, 742493, 1467268, 733366, 1261647, -1306744, 1262720, 718870, -405338, - 411243, -109522, 305480, 447750, -580357, 182536, 541166, -1363652, 241592, 431107, - 385473, 291521, -233539, -72478, -33286, 12885, -91805, -131533, -282394, -6979, - 234076, 21475, -189515, -145492, -250719, -12348, -68183, 38655, 24696, 1611, - 178778, -40265, 271657, 175557, -46708, -121333, 87510, 250719, -84826, 33823, - 70867, -6979, 25233, 64425, 38118, -99321, 133681, -49929, -23622, -52076, - 68183, -32749, 9127, -12885, -3221, 44023, - }, - { - 313533, 10649371, -52613, -2095407, 1498944, 75699, -416075, -920197, 676994, -51003, - -437013, -719407, 554588, -805306, -913754, -204011, -5460514, 550293, 987843, 1504849, - 563178, -796716, -326954, -1609539, 2042794, 669478, -792421, -1769527, 675921, -511101, - -462783, -445603, 931471, -5906, 492311, 206695, 1850057, 814433, 709743, 760209, - -1091995, 1341104, 504659, -322123, -117575, -139050, 227096, -374199, -47782, -356482, - 18254, 23622, 345745, 178778, 143345, -419296, -326418, 120796, -61740, -183610, - 89121, 352724, 86436, 47245, -33823, 3758, -90731, 211527, -47245, -8053, - 69256, -90731, -40802, 11274, 96637, 22012, -96100, -21475, 76236, 10737, - 47245, -51003, 7516, 12348, 69793, 37581, 2147, 12348, -68183, 122407, - -79457, -20401, -5369, 4832, 41876, -4295, - }, - { - -2523830, -28018220, 2684, -5265630, -550293, 268972, 70867, -199716, -261993, 390842, - 195421, 453656, 2108292, -1774358, -2561948, 792958, -784905, 2153926, -865436, -75699, - -1546725, 2935610, -387621, -132070, 659814, 879931, -186294, 741419, -876173, -216896, - 249645, -175020, 1895154, -779537, 104153, -1100049, -157840, 579821, -582505, 413927, - -401043, -420370, 457414, -170725, 85899, 677531, 85899, 173946, -291521, 5906, - -945967, 434329, 195421, 233539, 79457, -227633, -34897, 118112, -143345, 42950, - 46708, 57982, -296353, 205085, -120259, 235686, -280247, -120259, -104153, 214748, - -127238, -70330, 128849, -11811, -20938, 164283, 10201, -2684, -144955, 130460, - -20938, -93416, 90194, -34360, -47245, -10737, 0, 24696, 20938, 35970, - 5369, -19864, -12348, -16106, -4832, -10737, - }, - { - -5659157, -32762548, -3720516, 1093069, 1104344, -213675, 25233, -228707, -225486, -303332, - 261456, 256624, -443992, 1417876, -1261110, -337692, 294742, -2656974, 314069, 176094, - 442382, 215822, 57982, 389768, 504659, 15032, -988916, -486405, 387084, 524523, - 525597, -524523, -523449, -119722, 120796, 442382, -511101, 134218, -431644, 65498, - 423591, -441308, -168577, 505732, -358093, 106837, 284542, 185757, -207769, 58519, - 359167, -308164, 72478, 56908, -197032, 85362, 39728, 335544, 187905, -33823, - 86436, 42413, 121333, 105764, 31139, 143345, 31139, -24159, -40265, 55835, - 56371, 179852, -157303, 25233, -135291, 86973, -19327, 18790, -537, 52613, - 15032, 73014, 8590, -52613, 28991, -12348, -48318, 2684, -47245, -13422, - 18254, 18254, -15569, -8053, 31139, 13422, - }, - { - 10737, 6659884, -1217086, -882616, 398895, 57982, -296890, 130997, -206158, 190589, - 150324, -154619, -260919, -2669322, -550293, 559956, -2489471, 78920, 1657321, -1457068, - 484794, 19864, 967441, 1232119, -46708, 361851, -1848983, -21475, -413927, -148176, - 1339493, -1038845, -22012, -531502, 148713, -543313, -1641751, 847719, -148176, -494995, - 74625, 363462, 16643, 61203, -535260, 274878, 48855, 63351, -162672, -18790, - -52076, 41339, -289373, 201863, -317828, -215285, 129923, -53687, -117038, -7516, - -47245, -365072, -152471, -54761, 200253, -9664, 221191, 69793, 55298, 23622, - 80531, 98247, -1074, 14496, -108985, -139586, 46171, -10201, -1074, 141197, - 38655, 114890, -160524, -97174, 66572, -13959, 47782, 3221, 23085, -32212, - -2684, 53150, 6979, -22549, -53687, 59593, - }, - { - -7111392, -72378792, 3397319, -983548, -479963, 332323, -115427, 692564, -920734, -959388, - 1044214, 623307, -2509335, 1633161, 228707, -312459, -195958, -459562, 895501, -449898, - 289373, -128849, 251792, -354872, 217970, -199179, 245887, -544387, -615254, -856846, - 523986, -1232656, 1057099, -962073, -132607, -687195, -657130, -63888, 375810, 331249, - 44023, -1141924, -224949, 501974, 409633, -336618, 42950, 26307, -78383, -58519, - -330176, -4295, 154082, 54224, 364535, -119722, 358093, 98784, -22549, -265751, - -17180, 30065, 126165, -81604, -47782, 18790, 27917, 102005, -74088, -136365, - 4832, 133144, -52076, 9664, -24696, -31139, 59056, 34897, -65498, 63888, - -8053, 3758, -5906, -198642, 86973, 45634, 41339, -39728, 66035, -1074, - 31139, 19864, -39192, -9664, -47782, 63888, - }, - { - -597537, 3061238, 1689533, -733366, 241055, 9127, -16643, -278099, 235686, -17180, - -151398, 182536, -1217086, 5190468, -2143726, 1772211, -572841, -1420560, 639950, -2231236, - -773631, -14496, -718333, -3686156, 1071058, 415001, -1042066, 576063, 144955, -916439, - 1086090, 166430, -265214, -937377, 339839, -90194, -576063, 229244, -102542, -190052, - 794032, -351650, -254477, 169651, 144955, -391379, 306553, -103616, -235686, -432181, - -345745, 102542, -208843, 1611, 198105, -34897, 75162, 140660, 75699, 172336, - -134218, 151934, 120796, 23622, 9664, -28991, -126702, 195421, -30065, 39728, - -308164, 37044, -59056, -74625, 28991, 9664, 103079, 46171, -76236, -95026, - -78383, 67646, -48318, 55835, -70867, -5369, -12885, -40802, 16643, -53687, - -13422, -13959, -6979, 31139, -5369, 2684, - }, - { - 11368778, 35348656, -8437463, -1424855, -299574, -178241, -214748, -343597, -233002, 75162, - 1324997, 78920, -376883, -1016297, -287763, 1082332, -548682, 230854, 204548, -482647, - 926102, 61740, -216896, 1063541, -214748, 334471, 55298, -188442, -299574, 491774, - -681826, 18254, 119722, 69793, 179315, 832687, -578747, -232465, -921807, -454193, - -374736, 260382, -100932, -15032, 139586, -304406, -354335, 680215, -383863, 118112, - 153545, -107374, -71941, -279710, -53687, 125628, 10201, 200790, 172872, -119185, - 279173, -247497, -37581, -244276, 319975, -23622, -5369, -74625, 56371, -98784, - -63351, -184684, -68183, 60666, 56908, 9127, -4832, 92342, 32749, -103616, - 136365, 73551, -95563, 39192, -11274, 10201, -35433, 5906, -78383, 104690, - 4832, -13422, 44023, 7516, 46171, -50466, - }, - { - -962073, 192200, 760746, -1061394, 291521, -150324, 110059, -246424, 321049, -14496, - -381715, -903554, 901406, 421981, 4299799, 237834, 1822677, -1030255, -209380, -3039763, - 2989834, -293132, -2518462, 812823, -1266479, -642635, -2143726, 436476, -476741, 253940, - 605590, -1267552, -185757, -533650, 18790, 750546, 90194, -244813, 485868, -319975, - 341987, 614180, -563714, -280784, -124554, -117038, -230318, -82141, -307090, -112743, - 66035, 47782, -264677, -85362, 410706, 142271, -171799, -38118, -15569, -237297, - -33823, 51003, 261993, -326954, 11811, -159451, -91805, -136902, 14496, 105764, - -77309, -175557, -26307, -247497, 23622, 78920, -97711, -10201, 1611, -34897, - 5906, 37044, -154082, 11274, -57982, 28454, 37044, 108448, 62814, -55298, - 20401, 35970, -34897, -14496, 8590, 39728, - }, - { - 3330747, -26655104, 3765076, -3930432, -1661616, 3132642, -6720550, 599685, -469762, -636192, - 746251, 185220, 427886, -1155346, -175020, -8053, 2682744, -1602023, 656056, 1559073, - -628139, 601295, -1127429, -148713, -833224, 75162, 354872, -862752, 84826, 301185, - -428960, -637803, -1285806, -324807, 11274, -357019, -70330, -4832, 386010, 112743, - 85362, 203474, -164819, -30602, -39728, 648540, 3758, 286689, -266288, 157840, - 292058, -90194, 77309, 299574, -150861, 27917, -14496, 133681, -116501, 166967, - -171262, -1611, -136902, -40802, 66572, -28991, -126165, 138513, -272194, 86973, - 99321, 23085, -88584, -98784, 118648, -79994, -34360, -81604, -132070, 144955, - -107911, -6979, 59593, -50466, 3221, -30065, 42950, 41876, -10201, 48318, - -51003, 11811, -25233, 43487, -47782, 59056, - }, - { - -310311, 4945118, -3381750, -1435593, -250182, 745177, -99858, -960462, 28454, 213138, - -283468, 882616, 166430, -961536, 4293894, -2981781, 5280126, -523986, -759136, 582505, - -1269700, -1072668, 671626, 1073205, 282931, -176094, 1296006, -984084, 648540, -856846, - 17717, 718333, -290984, 237834, -517007, 894964, -457951, 692564, 12885, 895501, - -188979, -246424, 803696, 136902, -185757, -160524, -166430, -223338, 625992, -48855, - 71941, 344671, -10201, 63351, -16643, -37044, -193274, -65498, -67109, 231391, - -206695, -53150, 28454, -99858, 68719, 130997, -81604, 233002, 82141, 107374, - -27917, -238371, 1074, -74625, -54224, 13422, 47782, -5906, -31139, 111132, - 25770, -40265, 106300, -75699, -75162, -31139, -32749, -51003, 57445, -88047, - 31675, -10737, -25770, 20401, 50466, 39192, - }, - { - -3144990, 18596672, -2466385, 1425392, 1596117, 75162, -1115081, 41876, 672162, -247497, - -797253, -439160, 774705, 2666101, 1551557, -2493229, 45097, 907312, -347355, 209917, - 280247, 376883, 123480, 544387, -757525, 636192, -14496, 334471, -607201, 1082869, - -1120987, 195421, 48318, -574452, 732292, -179315, 21475, 97711, -471373, -351650, - 179852, 56371, 27380, 434329, 424128, -225486, -150861, -491237, 503048, -277562, - 463320, -90731, 103616, 188442, -106300, -190052, -24696, 101469, -95563, -309775, - -267362, 18254, -22549, -5906, -25770, -35970, 37581, -49392, 78383, 25233, - 113280, -114890, 175557, -22549, -52613, 106837, -22549, 47782, -83215, -23622, - -18254, 58519, 16106, 26307, -105227, 72478, -62277, -2147, 5906, -18254, - 63351, -4295, 4295, 33823, -13959, 31139, - }, - { - 407485, -307090, -702227, 1560147, -556198, -463320, 864899, -1096290, -170725, 805306, - 395674, 111669, 7565585, 246424, -842350, 2477659, 9127, 646393, 535797, 297963, - 5619965, -3062312, 694711, 136365, -359704, -1257352, 1643899, -1251983, -409633, 25233, - 994285, 113817, -926639, 281320, -698469, -506806, -44023, 137439, -408022, -43487, - -287763, -62277, -342524, -487479, 264141, -163746, 120796, -82678, -137976, 489089, - -431644, -207232, 331249, -277025, 250719, 198642, -113280, -41876, -14496, -302258, - -281857, -92879, 333397, -20938, 38118, -178778, 75162, 72478, -1611, -78920, - -7516, 53687, -89657, -26307, 1074, 43487, -3221, 101469, -33823, 134218, - -3758, -17180, -83752, -10737, -102005, 23622, -33286, 107374, 71404, 13422, - -25233, 40265, 92342, 13422, -9127, 2147, - }, - { - 3282429, 18373334, -135291, -3684545, 372588, 314606, 793495, -2017024, -619549, 482647, - 952409, -252329, 2451890, -4229469, 5591511, 885837, -214212, -278099, 446677, 507343, - 332323, 518080, 514859, -1294933, -215285, 313533, -762894, -534187, -1241782, 1009854, - -854162, 809601, -151934, 1021665, -822486, -150324, 448287, -278099, -394600, -190589, - -327491, 661425, 96100, -361314, 370978, -69793, -316754, -131533, 123480, 86973, - 341450, -116501, 249645, -249108, 263067, -180926, -367757, 186294, 63888, -108448, - 5906, -12348, 235686, -204011, 84289, -133681, -60666, 118112, 5906, 10737, - -156229, 32749, 64961, 63888, -207232, -192737, 31675, 55298, -63888, 25770, - -36507, 10201, 47245, -18254, -57445, -86973, 45097, 20938, 71941, -37044, - 6979, 18790, -35970, -18790, -1074, 67109, - }, - { - 718333, -3234647, -525597, -142808, 272194, 64961, 192737, 207232, 426276, 41876, - -42950, 345745, -386010, -11653857, 16106664, -1057636, -1157494, -629213, 507343, 2878165, - -135291, -1357747, 1570347, 348429, 189515, -672699, -699543, -258235, 540092, 169651, - -246424, 1088237, 366146, 727460, 988916, -734976, 737661, 691490, -207769, 46171, - 111669, 566936, 187368, -624381, -236760, -45634, -156229, -625992, 295816, 96100, - -433255, 85899, 142271, 23622, -96100, -143345, 129386, 158377, -229781, -9127, - 243739, 110059, 189515, -106837, 212064, -129386, 82678, 26307, 71941, 106300, - -35433, 106300, 55298, 92879, -9127, 20938, -94489, -68183, -9127, 10737, - -19864, -84289, -24696, 1074, 58519, -54761, 56908, 32212, 12348, -25770, - 26844, -17717, 2147, 1611, 11811, 1074, - }, - }, - { - { - 2762738, 31606664, -20196010, -3455838, 2815351, 386010, -489089, -379568, -504122, -1047435, - -406411, 1388885, 57982, 972810, -2305861, 607738, 843961, -1564979, -1183800, 303332, - 76236, -43487, -951872, -1139240, 1044214, 742493, 542240, -399969, -394063, -796180, - 678605, -167504, 1189169, 732829, 940598, 620086, -804770, 619012, 649614, 260382, - 91268, -314069, 406948, 4295, -4295, 67646, 106837, -365072, -184147, 365072, - 178778, 209917, -4832, -20938, -45097, 315680, -234613, -241055, 122407, -132607, - 3221, 199179, -14496, -171262, -161598, 12885, -238371, 56371, 25233, 149250, - -2147, 103079, 56908, 165893, 88047, 77846, 32212, 134755, -21475, -40802, - -49929, -68183, 35433, 42413, 24159, -70867, 57445, -45097, -71404, -38118, - 22012, -29528, 0, 10737, -3758, 19864, - }, - { - -1293322, 5884105, 3535295, 208306, 575526, 151398, -332323, -918049, 289910, -88047, - -1184874, -513249, 510027, 466541, -1610076, -1806571, -1097364, -418759, 4915053, 166967, - -242129, -1013075, 146566, -1121523, -495532, 421444, 433792, -1532767, 317828, 46171, - 163746, 384400, -956167, 1079647, -656056, 462783, 1226213, 900333, 499827, 605590, - -259846, 606127, 302258, -168577, -420907, 490163, -151934, -157303, -188979, -389231, - 14496, -63351, -63351, 142271, -18254, 73014, -291521, -23085, 42950, -188979, - 0, 124554, 75699, 173409, -93952, -67646, -157840, -26307, 18254, -6442, - 107911, -36507, 63888, 18254, -35970, 0, 71404, -55298, -12348, 3221, - 59056, -17180, 13422, 42950, 2684, -40802, 7516, -39192, -57445, 12348, - 24696, -33823, -45634, -22549, 41339, 19327, - }, - { - 4143570, -27677306, -4313221, -8581345, -564251, 270583, -503048, -383326, 235686, -217970, - 836982, 506269, 754304, -168577, -2730526, -149787, -1706713, 2100776, 1039919, -23622, - 320512, 490700, -8590, 171262, -30065, 882079, 51003, 457414, -809601, -201863, - 277562, 346282, 280784, -1073742, 798864, -818191, -942745, -445066, 644782, -73014, - 36507, -660888, -123480, -434329, 348429, 464930, -194884, -47782, 69793, -215285, - -204548, -24696, 55835, 131533, -340376, -119722, 82678, 210990, -94489, 100395, - 151934, -57982, -139586, -25770, -41876, -129923, -95026, -2684, -143345, 79994, - 19864, -46171, -19327, -74088, 130460, 279173, -89657, -79457, -49392, 90731, - 41339, -64961, 34897, 12348, 10737, -8590, -62277, 78920, 24159, 17180, - 23085, 3221, -37044, 2147, 47245, -68183, - }, - { - -4763656, -31879394, -3071439, -738734, -205085, -12348, -55298, -708133, 57445, 453119, - 259309, 61203, -155156, 243739, 768799, 32212, -207769, -2377265, 512712, 383326, - 480499, 74625, 70330, 102005, 29528, 339302, -1012002, 62277, 8590, -305480, - 203474, -388695, -98247, -176631, 121333, 836982, -565862, -86973, 28454, -40265, - 371515, -322659, 140660, 176631, -16643, -218506, 303332, 64425, -10737, -165893, - 236223, -37581, 2684, -23085, -187905, -24159, 66572, 258772, 157840, 126165, - 29528, -91268, 134218, -41339, 74088, 59056, -44023, 61740, 51540, -87510, - 126165, 278636, 3758, -32749, 8590, 39192, -537, -61203, -13959, -33823, - -35970, 17717, -4832, -37044, 32749, 39192, -33823, -6442, -20938, -35970, - 9664, 20938, -8053, -18254, 15569, 2147, - }, - { - -16643, 6328098, -479963, -619549, 112206, 66572, -38655, -70867, -498753, 663572, - 179852, -764504, 372052, -337692, -5974837, 2770791, 394063, -6579890, -2215666, 65498, - 1136556, 994285, -665720, -531502, 1331977, 594316, 951872, -492311, -710817, 89121, - -34897, -315680, -386547, -11274, -838056, -460635, -891743, 106837, 23622, -433792, - -455803, 217433, -175020, -32212, -172336, -64425, 420907, -127238, -50466, -202400, - -140660, 42413, 51540, 55835, -294742, -13422, 73014, 9664, -47245, -140660, - -394600, 32749, -77846, 81604, -55835, -52613, 20401, 108448, 158377, -61203, - 155156, 81604, -52613, 15032, -74088, -128312, -63888, -53150, -54224, -45097, - -3221, 95563, 11811, -79457, 16643, 34360, 30602, 26844, 38655, -61740, - -23622, 19864, 57982, -1611, -72478, -16106, - }, - { - -9006010, -64548528, -1328219, -623844, 391916, 346819, -246961, 501437, 97711, -1062468, - 405338, 384400, 74088, 197569, -343597, 791348, -620086, -545461, 640487, -650688, - -501437, -129923, 497679, 16106, -68719, -296890, -493921, 335007, -937914, 67646, - -737124, -340913, 298500, -1182190, -136902, -106300, -127775, -223875, 15032, 126165, - -694174, -751619, 105227, 489626, 336081, -125628, -17717, 105764, -231928, -514859, - 177167, 66572, -276489, 181462, 429497, -12885, -5369, -14496, -162135, -167504, - 63888, 81604, 5369, -108985, -18790, 44023, 21475, 75162, -8053, -54761, - 3758, 12348, 69793, -81604, 2684, 31139, -39192, -27917, 14496, -11811, - 62277, 48855, 7516, -91805, -25233, -73551, 59593, -105227, 90731, 31139, - 10201, 25233, -47782, 4832, -1074, -20401, - }, - { - 36507, 1826972, 357019, 280247, 245350, 48318, -238371, -115427, -15569, 204548, - -41339, 497679, 339839, 211527, 2626909, 2257005, -2423435, -422517, -989990, -1381369, - -578210, 90194, -1749125, 70867, 1052804, -301185, -1570884, 997506, 343061, -168041, - 117038, 129923, 161598, -1366873, -587874, 251792, -696858, 38118, 153008, -494995, - 307090, -23085, -97711, -6442, 41876, -292595, 15032, -45634, -301721, -233002, - -158377, -102542, -260382, -72478, 101469, 113817, -222265, 217970, 219043, 40265, - 45634, 77846, 163746, -46171, 34360, 2684, -93952, -89657, 72478, 52613, - -62277, -132070, 53150, -110059, -115964, -31675, -14496, -83215, -55298, -9664, - -44560, -41339, -18254, 24159, -12348, -23085, 24696, -23622, 37581, 37044, - 18254, 68719, -19864, 5906, 13422, 537, - }, - { - -457414, 49272400, -777926, -3153043, 76773, -377420, 116501, -272194, -135828, 115427, - 55835, 270583, 574989, -177167, -628676, 755377, 28454, 1613297, -119722, -808528, - 213675, 460098, 186831, 192200, 1015760, 54761, -472983, 342524, -649614, -359167, - -97711, 584652, 112743, 324807, 298500, -753230, -51540, -579821, -566936, 185757, - -572841, 49392, -254477, 279710, 297963, 8053, -644782, 499290, -1074, -9127, - -84826, 358093, 136902, -272730, -107374, -179852, -104690, 86973, 280247, 97711, - -3221, 17717, -294742, 45634, 137439, 137439, -34897, -5906, 144955, -200790, - -67646, -17717, -76236, -192737, 6979, 98247, -53687, -7516, -46171, -16643, - 51003, -8590, 12885, 20401, 20938, 2147, -77846, -22549, -45634, -15032, - 22549, -22549, 25770, 45634, -16643, 2684, - }, - { - 20401, -7200513, 926102, 39192, 102005, 78383, 171799, -110059, 169114, -59056, - -318901, -9664, 462783, 909459, 3348464, -400506, 3477313, -942208, -1270237, -1138166, - 1481764, 308164, -215822, -2186675, -1562831, 172336, -719407, -2177012, 1615982, -22012, - 1024350, -1091995, -464930, -554051, -150324, 168577, -234613, -306016, 452045, 174483, - 66035, 242129, -179315, -493384, -720481, -283468, -281320, 54761, -234076, -215822, - 171799, -118648, 186831, -120796, 421981, 154619, -243739, -113817, -353798, -119722, - 93952, 248571, 6442, 71941, -37581, 37044, -34360, -61740, 122943, 12885, - -125091, 37044, -89657, -99858, -90731, 68183, 53687, -88047, -33286, -35970, - -30602, 81604, -63351, 32212, -6442, -9127, -85362, 85362, 27380, -7516, - -16643, 18254, 11811, -16643, -5369, -5369, - }, - { - -3499325, -15612206, 4034048, -4231080, -1446867, -3527779, 394063, 139050, -865436, -90194, - 488016, -645319, 212601, 478352, -398895, 113817, 1089848, -339302, 92342, 1058710, - -62814, 56908, -583042, -613643, -312459, -24159, -397821, -471910, 125628, -138513, - -375273, -881542, -142808, -546535, 72478, -116501, 246961, -410706, 381178, -270583, - -46708, 373125, -250182, 43487, 13959, 195958, 184147, 228170, -6979, -132607, - 29528, -23085, -149250, 48855, 296890, -118112, -123480, 154619, -132070, 85899, - 50466, -56908, 48855, -142271, -71404, 3758, -33286, -63351, -18254, 13959, - 100395, -37044, -100395, -3758, -23085, 0, -120259, -51003, -24696, 35433, - 56371, 13959, -50466, -5369, -57982, -69256, -36507, 0, -38118, 8590, - -42950, 15032, 32749, -37581, -18790, 2147, - }, - { - 221191, 2254858, 559956, -2760590, -981937, 98784, -1398549, -142271, 69256, -493921, - -83752, 145492, -660351, 1007707, 1376000, -306016, 2563022, -55835, 391916, 270583, - -1002338, 492311, 391916, 209917, 471373, -383863, 904091, -246424, -176631, 103616, - -497142, 389768, -85362, 567473, 155693, 173409, 544387, 220117, 220654, 174483, - 36507, 289373, 428423, -25233, -106837, -350577, -220117, 32749, -70867, -122943, - 27917, 153008, 329639, 226023, -89121, -184147, -162135, -138513, 27917, 68183, - -171799, -21475, 44023, -34360, -111669, 136902, 60130, -20401, 104690, 65498, - -41339, -61203, -51003, -105764, 537, -31675, 126165, 108448, 12885, 52076, - -22549, -40265, 63888, 41339, -47245, -13422, 30065, -46708, 57982, 39192, - -6442, -3758, -15569, 55298, -19864, 15032, - }, - { - 4573067, 6027987, -703838, 694711, 351114, 936303, 1305670, 641024, 171262, -667867, - -1177358, 973884, 1775432, -496069, 2836826, -1302986, -228707, 955630, 85899, 42950, - 104690, 446140, 279710, 497679, -766652, 656593, 25770, 60666, -144955, 136902, - -97711, 160524, 36507, -81604, 493921, -50466, 494995, 108448, -42413, -59593, - -381178, 443992, 559420, -37581, -413927, 154619, -183073, -106837, 83752, 85362, - 10737, 11811, 260919, -66035, 187905, -187368, 1074, -19327, -8590, -262530, - -143345, 25233, 69793, -194347, 51003, -51003, -6979, 78920, 87510, -49392, - 56908, -5369, 51003, -43487, -62277, 73014, -33286, 34360, 12348, -11811, - -30602, -35433, -5369, -55835, -57982, 69256, -36507, 35433, 3758, -78383, - 6979, -31675, -27917, 26844, 3221, 3221, - }, - { - -358630, -239981, 40802, 1968706, -1153199, 215822, 522912, -318901, -361851, 359704, - 381178, 681289, -14496, 9622337, -1554241, 1302986, 1253594, 770947, 638876, -226560, - 3878892, 1440425, -3642669, 395674, 503048, -718333, 715112, -676457, 381178, -1099512, - 1618666, 159451, -426276, -164283, -758599, 486942, -222265, 108448, -167504, -132607, - -20938, -134755, -709743, 103079, -219043, 335544, -69256, -524523, -314606, 503048, - 76773, -63888, -171262, 205085, -145492, -85362, 200253, -56371, -240518, -57982, - -253940, -3221, 13959, -37581, 128312, 35970, -58519, 219580, -163209, -104153, - 81604, 28991, -3758, -46171, -166430, -43487, -17180, 93416, 146029, 40265, - 57982, 18790, -82141, -5906, -54224, 48855, -71941, 61740, 84289, 31139, - 21475, 9664, -2147, 66035, -59593, -56908, - }, - { - 2691871, 17367238, -80531, 1228898, 1036698, -100395, -1117228, -334471, -1280974, 658741, - 354335, -1151051, 1949915, 3525095, -5078262, 1298154, 2956011, -830002, 613643, 998580, - 557272, 98784, 392453, -293132, -1204738, 25233, -705985, -728534, -1023276, 129386, - 270583, 447750, 65498, 552440, -459025, 143345, 242129, -106837, -169114, 86436, - -305480, 624918, -171262, 128849, 515933, 178778, -203474, -51540, 459562, -197569, - 420907, 181999, -401579, -234613, 248571, 137976, 4295, -216359, 163746, -98784, - 29528, 204548, 6979, -97174, 215822, -19864, 537, 100932, -6442, -46171, - -17717, -73014, 65498, -10201, -138513, -92879, -39728, -21475, 100932, 31139, - -2147, 13422, 114354, 52076, -59056, 29528, 10201, -64425, 13422, 8590, - -4832, 52613, -5906, 8590, -9664, 28454, - }, - { - -507880, -2043331, 1220308, -538482, 137976, -74625, 251256, 624381, 101469, 218506, - 790811, 600759, -1782411, 3768834, -8878234, 2639794, 596464, -242666, 1553704, 2334852, - 207232, 1459215, 574989, -1541356, 1123671, 24696, -654446, 172336, -144418, -227633, - 181462, 476205, 466541, 537945, 795106, -506806, 88047, 915365, 461709, -93416, - 42413, 84826, -529355, 175557, -42950, -311385, -297963, -200253, 164819, -203474, - -100932, -2147, -177167, 17180, 294742, 11811, -106300, 184684, -316754, -232465, - 2684, 166967, -70867, 114890, -1074, 72478, 225486, -176631, 119722, 25770, - 72478, -60130, -84826, -9127, -39728, 63351, -90731, -165356, -60130, 2147, - 76773, 2684, 26844, 2147, 32212, -9664, 27917, 45634, 41339, 13422, - 20401, 20401, -4295, -17180, -17717, 42950, - }, - }, - { - { - -2608119, 72520520, 9321690, -7005629, 1081258, 746251, -486405, -338766, -280784, -259309, - -471373, 660351, 68719, 429497, -2131378, -164819, 693637, -620623, 1451162, -35433, - -448287, -329102, -289910, -893890, 677531, -250719, 209380, -399969, -369367, -530428, - 826781, -61203, -124554, -338766, 251792, 863288, -505732, 178241, -201327, -77309, - 228170, -236223, 386547, -159451, -26844, -340913, -373125, 392453, 191663, -66572, - -287763, 39192, -38118, -161598, -275952, 120796, -104153, -27380, 392990, 25233, - -168041, 37581, -18254, 23622, -78920, 156229, -99321, -42413, -19864, 91268, - 31139, 48855, -83215, 9664, 28991, 155156, 5906, 11811, 159451, 0, - -26844, -92879, 5369, 6979, -19864, 35433, -8590, 31139, -27917, 6979, - 17180, 12348, 0, 33823, -5906, 1074, - }, - { - 889595, -1014686, -5995238, 772020, -256087, 417149, -325344, -200790, 228170, 321586, - -738734, -199179, 600759, 841814, -1986422, -1291711, 2204929, 128312, 2717104, 614180, - -5369, -1547262, 968515, -177704, -1448478, -271657, 989453, -1223529, 584116, -39192, - 304943, 649077, -1677722, 821949, -117038, 216896, 37581, -459562, -549756, 383326, - 37581, 89121, 18254, -120259, 38655, 449361, -166430, -51003, -51540, -405874, - -113817, -27380, -252329, -85362, -270046, 480499, -57445, -245350, -156229, -100932, - -142808, -126702, -155693, 66035, -112743, -74625, -10737, -173409, -47245, -56908, - 98784, -123480, 48318, 30065, -108985, -121333, 96637, -3758, 76236, -17717, - -88047, 49392, 84289, -14496, -42950, -37044, 38655, -5906, 50466, -95026, - 42950, 26844, 0, -48855, -12348, -2684, - }, - { - -3537443, -23163832, 11367168, -4335770, -1406602, -814433, -549756, -1318555, -667867, 266825, - 507343, -679679, -1322850, -343061, -1726577, 1138166, -1797444, 766652, 1486596, 1435593, - 178241, -27917, -644245, -1293859, -304406, 884226, -702764, -129923, -417686, 99858, - 614717, 131533, -1166084, -1556926, 138513, -439697, -1034013, -318364, 797253, -377420, - 3221, 73551, -44023, -970126, 213138, -480499, -570157, -8053, 231391, 106300, - 308701, 102542, -222265, -35970, -350577, -226560, 204548, 401579, 181462, 162135, - 97174, -130460, 15569, -63351, 182536, -88584, 25233, 201327, 34360, -149787, - -56908, 131533, -26844, -78920, 81068, 80531, -28454, 45634, -49929, 81604, - 14496, 21475, 18790, 12885, 105764, -20401, -88584, 12348, 25770, 15032, - -11811, -5906, -3758, 17717, 46708, -30602, - }, - { - 9378598, -12838731, -3021510, -690416, 67109, -33286, 146029, -354872, -264141, 154619, - 121870, -552440, 73014, -20938, -676457, -57982, -93952, -2923799, 197569, 494995, - 373125, 93416, 27917, -153545, -557809, -34897, -53687, 595927, -151934, -784368, - 326954, -99858, 72478, -117038, 192200, 825171, -140660, -104690, 519154, 26844, - 237297, 212064, 710280, 9664, -111669, -155693, 61203, -46708, 15569, -237297, - 8053, -101469, 98247, -226560, -190589, -88584, -132607, 31675, -14496, 8053, - -134218, -183073, -121870, 1074, -17717, -31139, -17717, -60666, 138513, -96100, - 5369, 41876, 150324, 79457, 75162, 41339, -29528, -41339, -1611, -5369, - -55835, -25233, -41339, 64425, 30065, 48855, 39728, -47782, 62277, 24696, - -9127, -18254, -3758, -11811, -29528, -11274, - }, - { - 56908, 6751689, 681826, 22012, -216359, -5369, -148176, 199179, 10201, 125091, - 168041, -108448, 1001264, -1131724, -7858180, 2492692, 263067, -1453846, 100395, 1027034, - 1781338, 2230699, -331249, -861141, 693637, -937914, 2040110, 559956, -51003, 59593, - 562104, 930934, 440771, 13959, -322123, 331786, 323196, 117038, -289373, -206158, - -553514, 324270, -370441, -85362, 221728, -102542, 155693, -22012, 90731, 174483, - -109522, -85362, 70867, -292058, -136365, 184147, 155693, -139586, -67646, 61740, - -90194, 196495, -194347, 2684, -44560, -83215, -100395, -92342, 76236, -72478, - -38118, 29528, 11274, -11274, 78920, 69793, -158914, -52613, -11274, -153008, - -70867, -57445, 37581, 40265, -61203, 43487, -17180, -9664, 44023, -51540, - 8053, 10737, -22012, -1074, 26307, -3758, - }, - { - 15960635, -34335044, -1597728, -242666, -452582, 199179, 389768, -393526, 1085016, 623844, - -949188, -160524, 949188, -70330, -1013075, 672699, -303869, -264141, -207769, -697932, - 224412, -90731, 316217, 476741, 409096, -13422, -424128, 601295, 60666, 521302, - -614717, -84289, 507880, -398358, -27380, 88584, 498753, 64961, -7516, 8053, - -288300, -239444, 152471, 113280, -89657, 26844, -166430, 13422, -19864, -257161, - 332860, 324270, -27380, 104153, -119722, -146566, -253940, -71941, -162135, -37044, - 46171, -4832, -73014, -216359, -23622, 74625, 32749, 47245, 120796, 82678, - -13959, -38118, 15569, 15032, 38118, 92879, -66572, -44023, 54224, 17180, - -8590, -24696, -2147, 40265, -24159, -92879, 7516, -48318, -38118, 28454, - -2147, 15032, -19864, -25233, 55298, -19327, - }, - { - 363462, 3356517, -427349, 457414, 2684, -45097, -199716, 44023, -337692, -20401, - 45097, -146566, -763430, -1691680, 2377265, 2565169, -2777233, -1318018, -333934, 770947, - 932008, 1261647, -1075352, -106837, 1202054, 650688, -89121, 414464, 530428, -274341, - -309238, -329102, -329102, -868120, -825707, -205085, -284005, 116501, -34360, -139586, - 176631, -115427, 195421, -124017, 399432, -83215, -141734, 67109, -112206, -6979, - 196495, 84826, 34360, -142271, -202400, 150324, -140660, -189515, -110059, -24696, - 47245, 55298, 204548, -115964, -61203, 59593, 82141, -10201, -51003, -33286, - 212064, 8590, 55835, -1074, 2684, -7516, -18790, -142271, -73014, -12885, - 34360, -61203, 0, -25770, 30602, 23622, -7516, 13959, 12348, 2147, - 27917, 61740, 18254, -31139, 20401, 10737, - }, - { - -4854387, 42746736, 5855114, -46171, 996432, -287226, -102005, 84826, 315680, 148176, - -777926, -928250, 795106, 1488743, 288300, 1187022, 82141, 260919, 788127, 97174, - -316754, 560493, 260382, -685047, 473520, -11811, -25770, 677531, -405874, -8590, - 319438, 609349, 461709, 213138, 394600, -489626, -134218, 198642, 280784, 469762, - -108448, 347355, 18254, -108985, -89657, 103079, -146566, 456340, 165356, -306016, - -351650, 120796, 284005, 119722, -41876, 130460, -24159, -103616, -3758, 16643, - -27380, 159988, -202400, 29528, -114354, 63888, 26844, 62814, 90731, -67109, - 11811, 31139, 105764, -69256, -84826, 5906, 77309, -52613, -12348, 98247, - -17180, -42950, 74088, 57982, 34360, -6979, 19327, -17180, -30602, -64961, - 29528, 45634, 1074, 22549, -27917, 32749, - }, - { - 829466, -4415764, -751619, 717260, -289910, 145492, 169114, 124017, 56908, 46171, - 197569, -45634, -267362, -2527052, 1957431, 645856, -34897, -1868311, 343597, -1112933, - 233002, 1225139, 535260, -297963, 272730, 1525787, 1125281, -2416993, 2108829, -11811, - 543850, -238371, -62277, -14496, 39728, -714038, -445603, -56908, 319438, 458488, - 137439, 3221, 170188, 163746, -366683, -208843, -6442, 135291, -90731, -96100, - 325881, 537, 408559, -40265, 133144, -90194, -100932, -98784, -278099, -41339, - 26844, 23622, -6442, 210453, 44023, 217970, 129386, 39192, -2147, -60666, - -138513, -48855, -16106, 146029, -77309, 26844, 72478, 25233, -67109, 6442, - -92342, 15032, 53687, 48318, 38118, 2147, -85362, -17717, -537, -7516, - -1611, -23085, 25233, 24159, -24696, 2147, - }, - { - 4216584, -9441412, 5290326, 1663226, 772557, -1609539, 3759170, -644245, -475131, 105764, - 360777, -732292, -848793, 677531, 1181653, -1297080, 872952, 7516, -368293, 1054951, - 191126, -344671, 350577, 314606, 445603, 166430, -173946, 277025, 271657, 11811, - 110059, 90731, 953483, 295279, 294742, -35433, 477815, -548682, -288837, -109522, - -106837, -3758, -514322, 112206, 173409, -132070, -94489, 171262, 141734, -31139, - -177167, 115964, -33823, -330712, 258772, -44023, -190052, 2684, -24159, -98247, - 245887, -93952, -42413, -92879, -135291, 76773, -23622, -28991, 141734, 26844, - 88584, -23085, -40265, -42413, -59593, -64425, -33823, -87510, 89657, -14496, - 42950, 71404, 17180, 2147, 42413, -1074, -68719, -6979, -12885, -54761, - 4832, -51003, 67646, -17717, 15569, -46708, - }, - { - -301185, 290984, 2492692, -273804, -202937, -174483, -1971927, -223875, -384400, -157303, - 454193, -1028108, -1131724, 33286, 353798, -1478543, -820876, -1466731, 467615, -1742683, - 366146, 1202591, 84289, -602906, 140123, -694174, -402116, -249108, -377957, 422517, - -260382, 149250, -377420, -172336, 103079, -437013, 129386, -331249, -49392, -24696, - 88584, 197569, -77846, -115427, -84826, -347892, -173946, 167504, -219043, 11274, - -69256, -272730, 5369, 58519, -59056, -87510, -31675, -69793, -51540, 146566, - -24159, -142271, 34360, 113817, -42950, -48855, 106300, -76773, -67109, -17180, - -25233, 73014, -9664, -47782, -11274, -12348, 34897, 27380, 93952, -34360, - -53687, 41339, -41339, -1074, 41339, 44560, -12348, 19864, 4832, 76773, - -3221, 11274, 9127, 15032, -33286, -44023, - }, - { - -3181497, -4219806, -1379758, -2261837, -5369, -1151588, 2084133, 1389422, 22012, -35970, - -2287070, 743566, 294205, -2092723, 2724083, 229781, 724776, 209380, 208843, -679679, - 619012, 515396, -214748, 283468, -548145, -329102, -353798, -858993, 64961, -454193, - 496069, 139586, 91805, 286689, -127775, -551903, 461709, 366683, 362925, -183610, - 10201, 191126, 236760, -348966, -401043, 163746, -139586, 98247, -336618, -41876, - 130997, 47782, 159451, -386010, 232465, -121333, 86973, -67646, -201863, 11811, - -80531, 34360, 101469, -75699, -30602, 25770, -10737, -7516, 117575, 15569, - -70330, 62277, -13959, -57445, -48318, -17180, -51540, 56908, 26844, 6442, - -9127, 22549, -47245, -97174, -16643, -46171, 56371, 45097, 11811, 12348, - -18254, 1611, -38118, -6442, 12885, -6979, - }, - { - 182536, -1655710, -1264331, 2681133, -1596654, 472446, -101469, 200790, 67109, 45097, - -736587, -116501, -4413079, 2167348, -2117956, -2330020, -2191507, -775242, 632971, 152471, - -1698660, 587337, -3935801, -1306207, 95026, 974958, 161061, -593242, 822486, -700617, - 418759, 92879, 340376, 3221, -336081, 490163, 87510, 253940, 568546, -266288, - 62814, 304406, -432718, 112743, -220654, 53687, -312459, -500901, -142271, 528818, - 378494, 51003, -513249, 207769, -23085, -178778, -178241, 53687, -136365, 57982, - -37581, 283468, -241592, -158914, -10201, 180926, -205085, 63351, -77309, -54761, - 147103, 9127, 52076, -17180, -25770, 7516, -45634, 77846, 66035, -86973, - 11811, 53150, -31139, 15032, -40802, 23622, 5369, -41876, 537, 51540, - 38118, 53150, -56908, -3221, 16106, -68719, - }, - { - -5033165, 3708704, 483721, 4627291, 64425, 51540, -384936, 465467, -174483, -199179, - 467615, -1253594, 1268626, 1433982, -8435853, -594316, 2326262, -602369, 1420024, 373125, - 92342, 468688, 141734, 975494, -697395, -8053, -745714, 274341, 49929, -863825, - 120796, -244813, -277562, -96637, -24159, 290984, 11274, 139050, -152471, 244813, - -348429, 592706, -19864, 71941, 279173, 287763, 17717, 464930, 458488, -561030, - -52076, 416075, -175557, -299574, 156766, 193274, 178241, -224949, -25770, 34897, - 52076, 221191, 45097, -79457, 153008, -33823, 241592, 77846, 21475, -35970, - 97711, -122943, 3221, -71404, -15032, 9664, 51003, -131533, 21475, 41339, - 31675, -83752, 11274, 63888, -24696, -8590, 78920, -44560, -40265, 27917, - 5906, -26844, 32212, 27380, 9664, -16106, - }, - { - 312996, -2630668, 130460, -61203, 362925, -171262, -169114, 708133, -98247, 208843, - 1144609, 420907, -769873, 8815420, -12646531, 258235, 1708323, 861678, 1027034, 1858110, - 179852, 2321967, 1013612, -789200, 1068373, 203474, -576599, -310311, -317291, 191126, - -274878, -875100, 26844, -330712, 238371, 375810, -103079, -208843, 264677, -359167, - 162135, 173409, -392990, 141197, 475668, -217433, 85899, 117038, 96100, -195421, - 95563, 12348, -116501, -213138, -44023, 69256, -89121, 16106, -73551, -84826, - -199716, 73014, -117038, -78383, -130460, -80531, -15569, 28991, -38655, -82141, - -30065, 36507, -158914, -71941, -45634, -61203, 91268, -11811, -53687, -26307, - -18790, -8053, 2147, 68719, -26307, 26844, 2147, -39728, 5906, 67109, - -2147, -5369, 50466, 537, -33286, 24159, - }, - }, - { - { - 6017786, 73981352, 5279589, -3736085, -273267, -518617, -59593, 281320, -464393, -178778, - 644245, -133144, 472983, -1730335, -1255741, 963146, -89657, 965831, 858993, -318901, - -628139, -685047, 275415, -146566, -419833, 260919, 47782, -374199, -236760, 290984, - 265214, 787053, -651224, -176094, 17180, 660888, 416612, -126702, -108448, 6442, - 126165, -27380, 102005, -248034, -76773, 49929, -488553, -73014, 648003, -121333, - -194884, -1074, -114890, -187905, -294742, -73014, -45097, -70330, 118648, 252329, - -106837, -134755, -47245, -2147, 21475, 34360, 75162, -42950, -70867, 61203, - 77846, -46171, -20938, -53687, -38655, 94489, 42413, 57982, 104153, 108985, - 13959, -6442, 5369, -1611, -37581, 40265, -3221, 84289, 23085, 32212, - -22012, 22012, 22549, -6979, 537, 6442, - }, - { - -339302, -9844065, 1868311, 665720, -537945, -261456, 97174, 566399, 35433, 12885, - 554051, -746251, -249108, 263067, -634045, -576599, 1443646, -494995, -348966, 1078037, - 681289, -1094680, 468688, -18790, 91268, 611496, -1025960, -45634, 300111, -759672, - 96637, 811212, -561030, 74088, 605054, 544387, -340376, -339839, -530965, -155693, - 5369, 51540, 270046, 245887, 42950, 12348, -25770, -13422, -30065, -336081, - -5369, -110059, 19864, -53150, -241592, 104690, 90731, -144955, -344671, -35433, - -89657, 27917, -200790, -78920, -102542, 32212, 105227, 11811, -143345, -51540, - 96637, -145492, -66572, 15032, -28991, -75162, -59593, -13959, 86973, -8590, - -47245, 22012, 48855, -20401, -12348, -2684, 63888, 23085, 86973, -55835, - -20938, 31675, 24696, -2684, 8590, -36507, - }, - { - 2445447, -4502200, -7992398, -1730335, -2272038, -710817, 18790, -1435593, -1129040, 628139, - 185757, -415538, -1586990, -2165737, 1005022, 629213, 471910, -368293, 1486596, 399969, - 217433, -559420, -426276, -1090385, -507343, 289373, 425202, 57982, -309238, -39728, - 303332, 417149, -886374, -667331, -937914, -671089, -178241, -82141, -244813, 114354, - 47782, 299037, -265214, -362388, 34897, -804233, -179852, -33823, 420907, -64961, - 76236, 500901, -201863, -76773, -200253, -157303, 238908, 190052, 94489, 167504, - 15569, 137976, -139586, -3221, 235149, 83752, 34360, 20401, 127775, -115964, - -105227, 159988, 53150, -33286, -14496, -23622, 55298, -2684, 26307, 22012, - -58519, 92342, 44560, -48318, 60666, 12885, -41339, 17717, -39728, 36507, - -21475, -22549, 18254, 4295, -5906, 30065, - }, - { - -8229158, 5852967, 1449015, 471373, -1460289, 590558, -203474, 250182, -404264, -469225, - -318364, -417149, 1294396, -569620, -1473174, -551366, 179315, -3041374, -16106, 341987, - 415538, 185757, -60130, -125628, -482647, -430570, 407485, 816044, -721555, -120259, - 547071, -93416, 228707, -46171, 16643, 414464, 272730, -71404, 398895, 20938, - 239444, 348429, 420907, -203474, -9127, 321586, -33286, -110595, 180389, -423054, - 129386, -89121, -31675, -95563, -43487, -271657, -142808, -33286, 137976, -187368, - -88047, -56908, -84289, 37581, 31139, -85362, 16643, -32749, 68183, -2147, - -45097, -95563, 77309, 91268, 8590, 27380, -16643, 18254, 19864, 26307, - 38655, -33286, -2147, 56908, -16643, 55835, 20938, -3221, 31139, 38655, - 13959, -38118, -9664, 3758, -12348, -11274, - }, - { - -324270, 7033009, 592169, -12885, -140660, 5906, -163209, 78383, 259846, 227633, - -4832, 536334, 173409, -219580, -7587597, -1060320, 535260, 3545496, 2910377, 355409, - 406411, 1442572, 602369, -695785, 838592, -1724966, 509491, 714038, 238371, 104153, - 1551020, 467615, 183073, 493384, 104690, 116501, 466004, 200253, -264141, 62277, - -353261, 75162, -22012, -265214, 123480, 106300, -339839, 312459, 302795, 185757, - 26307, -210990, -102005, -180926, 40265, -151934, 61740, -57982, -56908, 38118, - 8053, 98247, -241055, 40802, -17717, 37044, -81604, -84826, 22549, 18254, - -96637, -47782, 75699, -30065, 10201, 133144, -77309, -52076, 39728, -84826, - -37581, -69256, -25233, 19864, -26844, 5906, -22012, 13422, 10737, -6442, - 4832, 19327, -34897, -28454, 28991, 28991, - }, - { - -14146549, -2924336, 5970005, -1063541, -434865, 135291, 481573, -499290, 777926, 765578, - -408559, -294205, -206695, -40265, -180926, 136365, 366683, -296353, -274341, -255014, - 251792, 99858, 4832, 463320, 495532, 183610, -121870, -348966, 197569, 13959, - 370978, -117038, 242129, 184147, 30065, 241592, 87510, 477278, -249108, 140660, - -27917, 155156, -456877, 109522, -74088, 20401, -193274, -380641, 280784, -22549, - 149787, 1074, 462246, 119722, -403727, -233002, 73014, 18254, 19327, -120259, - -136365, 1074, 27917, -125628, -93416, -61203, 126702, 66035, 75162, 55835, - -35970, 10737, -24696, 30602, 20938, 69256, 3221, -32212, 76773, -28454, - -76236, -73551, -17180, 19327, -4295, 5906, -27380, 18254, -67109, -10737, - 35970, -5369, 13422, -27380, 19864, 11811, - }, - { - 34897, 2876554, 1468879, -77846, -14496, 86973, 121333, -111669, -518617, -179315, - 24159, 40802, -1399623, -619549, -849330, 1441498, -1418950, -1086627, -1051193, 1609539, - 803696, 441308, 139586, -99321, -304943, 140123, 1402307, 59056, -524523, 494995, - 262530, -89121, -810675, -30602, -622233, -114354, -287226, 172336, -347892, 349503, - 244813, -201863, 360240, -129923, 121870, 112206, 202937, -92879, -232465, 62277, - 137439, 9664, 113280, -60130, -137439, 134755, 3758, -223875, -211527, 220117, - -71941, -63888, 64425, 25770, -68183, 33286, 159988, 154619, -180389, -76773, - 74088, 129386, 39192, 62277, 74088, 46708, -9664, -35433, -69793, -19327, - 11274, 15032, -49392, -26307, 26307, 12885, 8053, -11811, -30065, -49392, - -6442, -31675, 39728, -15569, 9127, 8590, - }, - { - 4593468, 31177704, 2406256, 3064996, -388158, 49392, -999654, 497142, 209917, -153008, - -190589, -692027, -476205, 770947, 1781338, 738734, -252866, -799938, 594316, 959925, - -39728, 28991, 491237, -386547, -315143, 258772, 113280, 4832, 239444, 227096, - 459562, 172872, 608812, 226023, -46708, 401043, 50466, 169114, 82141, 218506, - 289373, 368830, -89121, -465467, -67109, -34897, 119722, 132070, 166967, -106300, - -240518, -153008, 133144, 195421, -25233, 231928, 69793, 23622, -84826, 28991, - -147640, 115427, -2684, -107911, -151934, 537, 55298, 104690, -4832, 66572, - 11811, -66035, 119722, 100395, -37581, -62814, 64425, 93416, -24159, 82141, - 11811, 8590, 32749, 64425, -16106, 20938, 60130, -19327, -16643, -10201, - -1074, 73551, 5369, 1074, 6442, 1074, - }, - { - -95563, 2930242, -2324114, -71404, -35433, -78920, 103616, -5906, 260382, -4295, - 552440, -723702, -312996, -2321967, 1778117, -605054, -599685, -1174674, 1362578, -1317481, - -922881, 1454383, 540629, -110595, 1075889, 1249836, 777389, -816581, 170725, 685584, - -157840, 1106491, -201327, -2684, -282931, -956704, 294742, 172336, -65498, 170188, - 294742, 176631, 288300, 140123, 111132, 217970, -121333, -197569, 107374, -71404, - 79994, 184147, 79994, 168577, 9664, -68719, -84289, 29528, -100395, -40802, - 17717, -58519, -69793, 13959, 71404, 116501, 8053, 44560, -85899, -106837, - -107374, -159988, -52613, 180389, -9127, -57982, 32749, 110595, -59056, -19327, - -10737, -67646, 48855, -31675, 44560, -8590, 41876, -1611, -12348, -34897, - 37044, -27380, -4832, 27380, -3758, 27380, - }, - { - -4587562, 4080219, -431107, 3313567, 571768, 2532957, 1611, -1055488, 119722, 505732, - 332323, -419296, -602906, 38655, 1646583, -2739116, 1825361, 316754, -862752, 875100, - 211527, -289373, 325881, 660888, 367757, -51003, 185220, 474057, -48318, 219580, - 403190, 272194, 401043, 736587, 654983, -529355, 320512, -58519, -424128, 48855, - 102542, -296890, -152471, -337155, 82141, 319975, -68719, -158914, 232465, -10201, - 24696, 68183, 197032, -130997, -58519, 88047, -89657, -96100, -18790, -104690, - -3221, 86436, -89657, 11274, -149250, -3758, 25770, 40802, 93416, 70867, - 5906, 28454, -8053, -60130, -48855, -88584, 62277, -63351, 41339, 11274, - -60130, 54224, 52613, 24696, 81604, 37044, 20938, -8053, 25233, -15032, - 17717, -51003, -2684, 20401, 14496, -9127, - }, - { - 196495, -522912, 947577, 1172526, 432181, -125628, -1321239, -215285, -905164, 625455, - 432718, -529892, -996969, 366146, -132607, -1435593, -1457068, -2383170, 2357937, -2603287, - 466541, 205085, -127238, 45634, 561030, -935229, -516470, -490700, -54224, -477278, - -293132, 325881, -668941, 27917, 165356, -595927, -347892, -118648, -162672, -13959, - 83215, 288300, -178241, -191126, -110059, -181999, -155156, 120259, -55298, 492848, - -296353, -166967, -246961, -180926, 137976, -74088, -100932, 69793, -67646, 113817, - 104153, -46708, -15032, 27380, 99321, -100395, 69256, 64961, -53150, -37044, - 15032, -10201, -72478, -12885, 18254, -25233, -50466, -63351, 99321, -41339, - -55298, 70330, 1074, -78383, 8590, 41876, -39192, 6979, -30065, 6442, - 34360, -5906, -1611, -15032, 16106, -22549, - }, - { - 1226213, -7696045, -3108483, -3291019, 309238, -570694, 1278290, 574989, 25770, -10201, - -2040110, -229781, 17717, -580357, 473520, 1253057, 301185, 149250, 259846, -531502, - 506269, 519691, 15032, -64961, 81068, -694711, -378494, -500364, -374199, -420370, - 811212, -119722, -181462, 177704, -114354, -599148, -248571, 146029, 492848, -170188, - 466541, -177704, -425739, -10201, 45097, 13959, -100395, -205085, -71404, -153545, - 259846, 113280, -108448, -163746, -34897, -6979, -5369, 23085, -298500, -9664, - 38655, -98247, 3758, 119722, -54761, 46708, -6442, -46708, -12348, 137439, - -53150, -4832, 15569, -42950, 10737, -34897, -9127, 12348, -26307, -17180, - 23622, 95563, -4295, -90731, 17717, -83752, 73551, 18254, 8590, 59056, - 2147, 26844, 27380, -13959, 9127, -11274, - }, - { - -74088, -3474629, 557272, 1138166, -160524, 78383, -115964, 78383, -102005, 295816, - -108448, 537408, 2619930, -8672613, -2776160, -596464, -3041374, -1264331, 303332, 949188, - -2685965, -629213, -947577, -1338419, 70330, 842350, -381715, -206158, 606664, -141197, - -237834, -35970, 184147, -41876, 634581, -146566, -167504, 473520, 232465, -62277, - 236223, 249645, -217970, -79994, -15032, -200790, -388695, -128849, 211527, 36507, - 350040, 140660, -76773, -111669, 247497, -170725, -158377, -97174, -47782, 31675, - 0, 219043, -226023, -27917, -67646, 20401, -73551, -91268, -14496, 74625, - -8590, 16106, 26307, -30602, 168041, 17717, 29528, 84826, -54761, -72478, - -17717, 12885, -29528, -45634, -13959, -14496, 53687, -35433, -75162, 77846, - 12348, 49392, 43487, -29528, 11274, 8590, - }, - { - 3691525, -8641474, 525597, 1921998, -88584, -857383, 795106, 1027571, 153008, -380641, - -395137, 928787, 388695, -2401961, -2532420, -268435, -1149441, -253403, 1202591, 151934, - -223875, 676457, 706522, 803159, 269509, -570157, -761820, 689342, 113280, -555125, - -144418, -492311, -143881, -397821, -22012, 93416, 196495, -187905, -63888, -1074, - 292595, 85899, 425202, -61203, -100395, -4832, 71404, 395137, 189515, -196495, - -258772, 113280, 195958, -97711, -34360, 171799, -107911, -28991, -236760, 260382, - -34360, 21475, 47782, -20938, -84289, 48855, 83215, 60666, 93952, -38655, - 34360, -83752, 5906, -30065, -9664, -17717, 21475, -58519, -81604, -42413, - 31139, -54761, -64425, 3758, -8590, -67109, 52076, 66572, -38655, 10201, - -2147, -40802, -4832, 8053, 35433, -10737, - }, - { - -447750, -2280628, -329102, 572304, 8590, -193810, -154082, 49929, 930934, -471910, - 770947, 194347, -179852, -3228742, 4725001, 1737314, -603443, 1595580, 28454, 1217623, - 486405, 433792, 1261110, 700617, 692564, -932008, -484258, -417149, 280784, 463320, - -339302, -193810, -379031, -802622, 254477, 433792, 153008, -504122, -89657, 16106, - 390842, 147103, 510027, -260382, 184147, -159988, 347355, 40802, 16643, -187368, - 193810, 89121, 124017, -372588, -207769, -68183, 17180, 76236, 78383, 286689, - -83215, -57445, 12348, -64961, -41876, -137976, -179852, 104153, -22549, -68183, - -132070, 72478, 67109, -51540, 15569, -47245, 51540, 48855, 5369, -61203, - -97711, -63888, -17180, 17717, -26844, 49929, 6979, -49929, 3221, 33286, - -11274, -24159, 18254, 46708, -4832, -22012, - }, - }, - { - { - -7271917, 33774548, -8458938, -1249299, 1243393, -663036, -159988, 990527, -67646, -595927, - 665183, -310311, 369367, 328028, 207232, 1326608, 121333, 1265405, -1289027, -370441, - 540629, -68183, 586263, 318901, -459025, 388695, -105227, 318364, 11274, 150324, - -49929, 625992, -460635, -73014, 196495, 392990, 246961, -475131, -164283, -74088, - 139586, 230854, 3758, -664109, -310311, 261456, 34897, -264677, 493384, 183610, - 65498, -15032, -45634, 112743, 59593, 48855, -41876, -84826, -164283, 99858, - 69793, -64425, -38118, -181462, -26844, 28454, 120796, 60130, -128849, -44023, - 537, -71404, 1611, 61203, -16106, -55298, -92879, 58519, -75162, 69256, - 4832, 112206, 33286, -39728, -13422, -58519, 42413, 6442, 2684, 13422, - -22549, -13959, 32212, -26307, -2147, 6979, - }, - { - 411243, -14034343, 320512, 1056562, 142808, 206158, 737661, -86973, 65498, 241592, - 1394254, -320512, 90194, 832687, 741956, -495532, 401043, -346819, -493921, -292595, - 748398, -1181116, -150324, 569083, 1194538, 891743, -1300838, 1067299, 392453, -536334, - 162135, 129923, -158914, 223875, 292595, 742493, 107374, 223338, 158914, -182536, - -284542, 329639, 536871, 259309, -497679, -99858, 43487, 8053, 41876, 150324, - 331249, -213138, 13959, 149250, 193810, -105764, 22012, -47245, -151398, 45634, - -47245, 14496, -76236, 25770, -61203, 193274, 88047, 171799, 6442, 22012, - 82141, 3758, -63888, -78383, -13422, 83752, -51003, -43487, 22549, -47245, - 64425, -19327, -66035, -18254, -28454, -11811, 57982, 12885, -3758, 40265, - -53687, -37581, 13959, 38655, 33823, -38655, - }, - { - -2348273, 15447924, 8396661, -392453, 1043140, -121870, 375810, -387621, -85899, 324270, - -412317, -176631, 609349, -1184337, 1821603, 857383, 932008, -195421, 2697240, -181462, - -361314, -408022, 127775, -24159, -41876, -245887, 271120, 665720, 39192, -173946, - 485331, 1014686, 142808, 334471, -432718, -856309, 221191, 41339, -33286, 319438, - 193274, 268435, -119722, 25233, 103616, -281320, -167504, -178241, 238908, -3221, - -347355, 310311, -99321, -47782, 172872, 12885, 16643, -19327, 36507, 165893, - -117038, 189515, -150324, 156766, 13422, 70330, 21475, -145492, -21475, 75699, - 30602, -12885, 28991, 40265, -18790, 1074, -10201, -71404, 64961, 32749, - -3221, 48318, 41876, -61203, -26844, 50466, 20401, 72478, -85899, 47782, - 30065, -28991, -19864, -17717, -27917, -9127, - }, - { - 3809636, 12603582, -8112657, 468151, -322659, 294205, -242666, 67109, -201863, -217970, - -60130, -150861, 1300301, -460098, -565862, -557272, 554051, -1906966, 69793, -66035, - 314069, -236760, -104153, 185220, 86436, 132070, -177167, 802622, -789737, 238371, - 938987, -71941, 392990, -16106, -328028, 197032, -358093, -27380, 147640, 17717, - 444529, 118112, 156229, 19327, 4295, 200253, -80531, -214212, 380105, -358093, - 118112, 64425, 6442, 239981, 78920, -172336, 85899, 48318, 162135, -191126, - -37044, 100395, 156766, -24696, 74088, -38655, -27917, 60130, -2684, 27917, - 16106, -20938, -136902, -60130, -35970, 35433, 19864, 38118, 0, -537, - 72478, 31675, 58519, -20401, -35433, 15032, -55298, 58519, -19327, 0, - 25233, 2147, -16643, -15032, 34897, 15569, - }, - { - 459562, 6847252, -828929, -342524, 177167, -8590, -248571, 183610, 23085, -205085, - -219580, 233002, -485868, 1568200, -4687957, -1133871, -942745, -238371, 2911988, -337692, - -743566, 56908, 1163936, 166430, -348966, -2465848, -952946, -129386, 306553, 651761, - 1173063, -211527, -165356, 224412, -392453, -582505, -180926, 220654, -545998, 90731, - 110059, 10201, 252866, 16643, 110595, 26307, -297963, 117038, 157303, -68719, - 124554, -68183, -190589, 186294, 180389, -271657, -32212, 129386, -111132, -165893, - 32749, 40265, -315680, 10737, -71404, 64961, -11811, 15569, 4832, -3758, - 44023, -32212, 51003, 11811, -42413, -46171, -43487, -14496, 32749, 37581, - 8053, 56371, -16106, -69793, 24696, -56908, 13959, 31675, -42950, -22012, - -27917, 19864, 3221, -23085, -37581, 18790, - }, - { - 7437273, 10664941, -7522635, 484258, 165356, -159451, -583042, -45097, -10737, -737124, - 658204, 196495, -328565, 245887, -89657, 81068, 462246, -437550, 240518, -264141, - 12885, 213675, 104690, 290447, -223338, 18254, -210453, -645856, -646393, -302258, - 785979, 144955, 7516, -47245, 352724, 59593, -721018, 110059, -341450, 177704, - -80531, 506269, -462783, -145492, -9664, 44023, 69793, -201327, 65498, -54224, - 467615, -226023, 164819, 85362, 97174, -253940, 197569, 105227, 73014, -114354, - -173409, -41876, 104690, 63351, 24159, -115427, 60130, 71404, -59593, -93952, - -70867, 41339, 75699, -22549, -6979, -74625, -18254, -9664, 47782, -30065, - -32749, 2684, 4832, -105227, -32212, 22012, 27380, -19864, 42950, -55835, - 20938, 12348, 14496, 15569, -5906, 10201, - }, - { - -283468, -787590, 905701, -232465, -69256, 35433, -215285, -184684, -30065, -45097, - -11811, 191663, -237834, 1632625, -2080912, -1705102, -1489817, 130997, -485331, 2204392, - -62277, -412854, -242666, -484794, -657667, -325881, 609885, 640487, -1450088, 839129, - 900869, 786516, 70330, -267362, -211527, 267362, -615791, -55835, -329102, 70867, - 421444, -110059, 63351, -126702, -323196, -216896, 128312, -73551, -215285, 141734, - 36507, -129923, 77846, 188442, 122407, 87510, -44560, 209380, -46171, 179852, - -34360, -63888, -141197, -68719, -66572, -32212, 18790, 168577, -25233, 5906, - -134755, 17180, 14496, -22012, -44560, 69256, 22549, 17180, 9127, 53687, - -35433, 33286, -43487, 43487, 3221, -12885, 61203, -54224, -22012, -7516, - -22012, -49929, -3221, 8053, -12885, -25233, - }, - { - -2457795, 27229556, 1571421, 2682744, -382789, -60130, -748935, -77309, -355945, -193810, - 368830, 395674, -928787, -879395, 59593, -716186, -854699, -398895, -563178, 272730, - 467078, -187905, -55835, -45634, -24159, -34360, 51540, -159451, 496606, 36507, - 38118, -99321, 33286, 261993, -19864, 363998, 275415, -134218, -382252, 171799, - 37581, 60130, -95563, 174483, -346282, -27380, 146029, -34360, -178241, -60666, - -26307, 328028, 268435, -82141, -83752, 141734, 126702, 76236, 159451, 182536, - -175557, -18790, 50466, 163746, 52076, -15569, -26307, 27380, 90194, 4295, - -11274, -10737, 13959, 52613, 103079, -1074, -135828, 127775, 4832, -3758, - 15032, 38118, -9664, 1074, -31675, 16643, -20938, 35433, 8590, 32749, - -9127, 0, -28454, -12885, 26844, -30602, - }, - { - -649077, 2926483, 1521492, 50466, 265214, -126702, -262530, -652298, 250182, -8053, - 355945, -484258, 335007, -1925219, 2929168, 905701, 1646583, 143345, 1633161, -666257, - 167504, 151934, -96100, -773094, 1001264, 954557, -942745, 256087, -590558, 68183, - 759136, 801011, -661962, -70867, -380641, -395137, 237834, -437013, 80531, -106837, - -209380, 258772, -98247, -288300, 13959, 272194, -207769, -138513, 198642, 63888, - -53687, -79994, -232465, -20401, -52613, -1074, -165893, 162135, -36507, -55298, - 63351, 34360, -84826, -80531, -155156, -70867, -25233, -23085, -17717, -6979, - 43487, -12885, -103616, -8053, 36507, 2147, 11811, 16106, -45097, -82678, - 53687, -27380, -72478, -78383, 4295, -24696, 15569, 44023, 17180, -20401, - 6979, -3758, -16643, -10201, -1074, -537, - }, - { - 3943854, 10637023, -12178917, -3655017, -780073, 715649, -3334505, 45634, -173946, 25233, - 571231, 69256, 165893, 489089, 525597, -1846836, 844498, -295279, -254477, 214212, - -557809, -213675, -197569, -38118, -19327, 61740, 421981, 114354, -241592, -34897, - -180926, -139586, -132607, -178241, 520765, -162672, 152471, -43487, 142808, 30065, - 205622, -344134, -20938, -128849, -110595, 341450, 211527, -233539, -219580, -233002, - 261993, -207232, 124554, 365072, -168577, -73551, 58519, 122943, 33823, 135828, - -216896, 114354, -12348, 30602, -59593, -111132, 15569, 35433, -38655, 22549, - 1074, 55835, -42950, 49392, 16643, -2684, 64961, 55835, -25770, 61740, - -83752, -19864, -5906, 32749, -16643, 9664, 75699, 1611, 1074, 40802, - 1611, 37581, -40265, -12348, -31139, 25233, - }, - { - -77846, 1359894, -151934, -432718, 235149, 191663, -171262, 321586, -979789, -60666, - 15032, 898722, -121870, 321049, 137439, 614180, 27380, -2237678, 1926830, -190052, - -136365, -964757, -350040, -43487, 556198, -1063004, 357556, -699543, -104153, -60130, - -142808, 329639, -392453, 176631, -285615, 258772, -8053, 294205, 27917, -1074, - -76236, -183073, -46171, 93416, -98784, -15032, 100932, 60130, 83752, 447213, - -307090, 88047, -87510, -190589, 115427, -21475, -55835, 106837, 20401, 50466, - 44560, 116501, -9127, -60130, 6442, 6442, -31139, 91268, 111132, -46171, - 31675, -69793, -108448, 8590, 104690, -4295, 9127, -55835, -53150, 22549, - -26307, 18254, 103616, -28454, -23622, -20938, -18790, -22549, 28991, -63351, - 3758, -12348, -30065, 3758, 19327, 41876, - }, - { - -118648, -7268696, 111669, -1060320, 99858, 1409823, 492311, -225486, 79994, -51003, - -426276, -726923, 595927, 398358, -687195, 263604, -381178, 565325, 92342, 34360, - -443455, -220117, -76236, 195958, 200253, 69256, -501437, -172336, -476205, 28991, - 343597, -200790, -97711, -304943, 120259, -423054, -505732, -88584, 220117, -54761, - 166967, -211527, -413927, 302795, 198642, 158914, -90731, -197032, 251256, -105227, - 2147, -50466, -198105, 18254, -97711, 39728, -54761, 73551, -19864, -141197, - 63351, -102542, -64425, 75699, 64961, -10201, -31139, 6442, -105227, 5906, - 19864, -79994, 26844, 0, 22549, 32212, 44560, 14496, 3758, -14496, - -11274, 8053, 55835, 17717, 45634, 51540, 25770, 2684, 6979, -11811, - 17180, -12348, 62814, 31139, -8053, -2147, - }, - { - 54761, -4461398, -159988, 275415, 207769, -165356, 494458, -439160, -428960, 299574, - -221191, 861141, 1459215, -7247758, -2325188, 1292785, -413927, -125628, 1024887, 880468, - 998580, 114890, 1155346, 728534, 786516, 246424, -476205, -607738, 633508, 240518, - 1051730, -189515, -84289, -328565, 676994, 187905, -529355, 159451, -361851, 398895, - 289910, 85899, 69793, -14496, -41876, 188442, -301185, -16643, 78920, -311922, - 175020, -6442, 216896, -82678, 108448, -13422, 228707, -182536, 31139, 71404, - -103079, -41876, 20401, 122943, 36507, -63888, 67646, -38655, -67109, 80531, - -71404, 32212, 25233, -91268, 21475, -12885, 53687, 49929, -69793, -4295, - 41339, -18254, -24696, -4295, -9664, 3221, -30602, 51003, -57445, 31675, - -4832, -61203, 45097, 42950, -49929, 34897, - }, - { - -880468, -11464341, 375273, -3198677, -617938, 161061, 449898, 397284, -203474, 222265, - 86436, 1345399, -230318, 785442, 2605972, -265214, -2400887, -93416, 12348, -292058, - -475668, 3758, 916976, -16106, 1051730, 267899, -357019, 1066226, 71941, 182536, - -445603, -392453, 57445, -166430, -718870, -293132, 417149, -155693, 6979, -233002, - 736050, -146029, 321586, -23622, 9664, 166430, -163746, -188979, 37044, -10201, - 101469, -75699, 179315, 149787, 23622, -5369, -357556, -58519, -64961, 143881, - -199716, -63888, -21475, -47245, -197569, -537, -213138, -20401, 48318, -49929, - -13959, 22012, -35433, 46708, -19864, -79457, -93952, 53150, -8053, -80531, - 15032, 28454, 1611, -40802, -7516, 12348, -57982, 62814, 31139, -6442, - -22012, 25770, -38118, -12885, 1074, 22549, - }, - { - 554588, -741956, -649077, 245350, -152471, -99858, -44023, -1238561, 40265, -856846, - 284542, 997506, -410169, -2774012, 11453604, 1282048, -2213519, -534187, -180389, 386010, - -1578937, -1176821, 513249, -1016834, -486405, -603443, 668404, 256087, 561030, 388695, - -3758, 788663, -150861, -487479, 311385, -439697, 297427, 18790, -199179, 61203, - 166430, 455803, 745714, -392453, -268435, 44560, 175557, -209917, 36507, -113817, - 33823, 66035, 215822, -118112, 60666, 37581, 84289, 142271, 26844, 317291, - 168577, 31675, -118648, -44560, 106837, 24696, -38118, -120796, 162672, 90194, - 16106, -24159, 152471, 63351, -6442, 68183, -81068, -65498, 45097, -8590, - -22549, -54761, 9127, -111669, 15569, 24159, 13959, 13422, 8053, -36507, - -8053, -9127, -35433, 44560, 26844, -25770, - }, - }, - { - { - 4486630, 12626667, -9462350, -610422, 223875, -348429, -15569, 646393, -241055, -619549, - 77309, 34360, 156766, 826244, 1034550, 792421, 224412, 434865, -526670, -657667, - 79994, 510564, 540092, -21475, 12885, 589484, -332860, 366683, -156229, -36507, - -189515, 154082, -101469, 232465, -154619, 340913, -240518, -141197, -579284, 277562, - 20401, 12885, 71404, -454193, -296890, -30065, 129386, -78920, 238908, 120796, - 99321, 40802, 56371, 122943, 170188, 81068, -62814, 78920, -105227, -87510, - 81604, 61740, 26307, -163209, -67109, 73014, 32749, 537, -27917, -27380, - -42950, -28454, -36507, 40265, 45097, -19864, -82678, 11274, -57445, -31675, - -12885, 34897, 13959, -24696, 14496, -53687, -11811, -25233, -9127, -28991, - 13959, -25770, 9664, 3758, 1074, 5369, - }, - { - -511638, -10001905, -389768, -94489, 219043, -126702, 1073742, -303869, 40265, 273804, - 593779, 489089, 28991, 359704, 936840, -572841, 1004486, 386010, 373125, -443455, - -359167, -900333, 44560, 1046361, 754304, 119722, -689342, 1010928, 510027, -106837, - 244813, -330176, 204011, -117575, 239444, 191663, 470836, 172336, 538482, -238908, - -78920, 172872, 326954, -46171, -311922, -56371, 50466, 81068, -34897, 238371, - 167504, -97174, -186831, 85362, 270046, -57982, -40802, 6442, 114890, -66035, - -130460, -93416, 13959, 144418, -69793, 164283, 17717, 2147, 112206, 22012, - -1611, 87510, 20401, -74625, -12348, 46708, 33823, -6442, -49392, -32212, - 69793, -2684, -52613, -36507, -32212, -22549, -24696, 11811, -39192, 15569, - -9127, -26844, -28991, 12885, 19327, -11811, - }, - { - 2681133, 26009248, -4133906, -420370, -250719, -76236, 119722, -163746, 407485, -97711, - -439160, -255551, 833224, -296890, 1058710, 569083, 394600, 423054, 1596654, 534187, - 126702, -129923, -208306, 399969, -573378, -292595, 140660, 479426, 20401, -360240, - 930934, 834297, 223875, 46708, -51003, -346819, 0, -270046, 243203, 395674, - 340376, -40802, -45097, 129923, -231928, -102542, -278636, -22549, -110059, 161061, - -195421, -102005, 15569, -18790, 8590, 63888, -25233, 19864, 71404, 113817, - -39192, 40802, -180926, 222265, 3221, -68183, -15032, -85899, -78383, 93416, - 79994, -52076, -30065, 41339, 39728, 75699, -52076, -80531, 18254, 47782, - 75162, -3758, 31675, 29528, -51003, 537, 27917, 46708, -15569, 6979, - 24159, 9127, -21475, -25770, -2147, -21475, - }, - { - 469225, 6001680, 693100, -132607, -166430, -112743, -59593, -361314, -148176, -125091, - 610959, 245887, 302795, -181999, 767725, -600222, -368293, -513249, -153008, -166430, - 37044, -55298, -308164, 156229, 142271, 437013, -210453, 366146, -310848, 166967, - 57982, 245887, 159988, -176094, 267899, -421981, -36507, 112206, -91805, 127775, - 421981, 96637, -59593, 155693, 253940, -66572, -128849, 38655, 33286, -20938, - -180389, 165356, 69793, 121333, 42950, 12348, 20938, 148176, -51540, 6979, - -41339, 123480, 54761, -29528, -32212, 11274, -29528, 60130, -9664, -17717, - 52076, 100932, -98784, -81068, 15569, 30065, -5906, 7516, 18254, -9664, - -12348, 22012, 11274, -30065, -2147, 10201, -47245, 33823, 15569, -15569, - 11274, 18254, -24696, -16643, 19327, 20938, - }, - { - -359167, 5031018, 1789391, -492311, 142808, -27917, -153545, 168041, -129386, -178241, - -216359, 46171, -282931, 1363115, -3849901, -707596, -861141, -1815161, -935766, 796180, - -99321, -241055, 680215, 282931, -1002875, -1326071, 81604, -370978, 229781, 1078574, - 194884, -303332, -529892, 278636, -584652, -641024, -449361, 114354, -82141, -294742, - 159988, -278099, 115427, 217970, 67109, -39728, 77309, -82678, 111669, -174483, - 54761, 111669, -180926, 250182, 12348, -20938, -157840, 86973, -8053, -184147, - -3221, -39728, -126702, -142808, -121333, 5906, 15569, 73551, 27380, -89121, - 91805, 78383, -24696, 11274, -16643, -96637, -22549, -56371, -53687, -1074, - -537, 74625, 43487, -70330, 16643, -34360, 8590, 35433, -25770, -47782, - -34897, 5369, 6442, 4832, -46171, -11274, - }, - { - -878858, 8626979, 1539746, 1165547, 423054, -23622, -748398, 321049, -57982, -1062468, - 224412, 392990, 247497, -256087, 853625, 193810, -351650, -621697, 129386, -141197, - -398895, -132070, 18790, 588947, -54761, -86436, -619549, 3758, -467615, -451508, - 91805, 584652, -173946, -35970, 469225, -149787, -906775, 132607, -17717, 27917, - -307627, 85362, -10737, -86436, 24696, 74088, 57982, 174483, -62277, -46708, - 289910, 15032, -63351, 9127, 246424, -79994, -107374, 17717, -18790, -22549, - 1074, -117038, 27917, 106837, 57445, -71941, -28454, 48855, -24159, -56908, - -26307, 4832, 78383, -2147, -4832, -75699, -91268, 8053, 11274, 8590, - 16106, 40802, 27380, -59056, -77846, -19864, 21475, -56371, 38655, 1611, - -7516, 9127, 6979, 29528, 9127, -4832, - }, - { - -163209, -2688650, 787053, 176094, 45097, -45097, -224949, -118648, -60666, 81068, - 170188, -81604, 139586, 305480, -559420, -1072668, -61740, -344671, 426276, 1489817, - -134755, -306553, -1515050, 462783, -170725, -101469, 236223, -438087, -454193, 454193, - 799401, 515933, 345208, -385473, -645319, 267362, -249645, -370441, -206695, -129923, - 256087, 60130, 121333, -136902, -540092, -234613, -184147, -92342, 70330, 45634, - -15569, -26307, -81604, 163209, 207769, 12885, -62814, 251792, 18790, 60130, - 19864, -15569, -75699, -111132, -71404, 30602, -89121, 17180, 92879, 99321, - -132070, -41339, 20938, -53150, -118112, -25233, 22549, -17717, -12348, 60666, - 0, -20938, -27917, 49392, 10737, -15032, 36507, -9127, 15032, 28991, - 27380, 15032, -15032, -15032, 0, -27380, - }, - { - 1059783, 30806726, -3474092, 300111, 403727, -223338, -274878, -346819, -316754, 20401, - -31139, 355409, 20938, -604517, -1440962, -584116, -284005, 338766, -415538, -460098, - 522375, 83215, -614180, 49929, 224949, -105227, -25770, -168577, 466004, -88047, - 32749, 174483, 30602, -47245, 323196, 3758, 83752, -86436, -697932, 375273, - -123480, -22012, -181999, 484258, -204548, 235686, -280247, 153008, -38655, -180389, - -204548, 484258, 394063, -23622, -19327, -74625, 48855, 55298, 182536, 174483, - 16643, -70867, -46171, 192737, 132607, 42950, -68183, 29528, 95563, -19864, - -5906, 1611, -25770, -57445, 41876, 78920, -133681, -24159, 16643, -10737, - -9127, 42413, 26307, -32749, -9127, 17717, -56371, 28991, -537, 26307, - -9127, -21475, -24159, -36507, 4832, -3758, - }, - { - 59593, -144955, 1149441, 86436, 0, 34897, -488553, -233002, -15569, 49929, - 242129, -2684, -11274, 299037, 638876, 500901, 4199941, 428960, 1422708, -328028, - -666794, 509491, -13959, -391916, -133681, 507880, -660888, -403190, -153545, 194347, - 996969, 282931, -620086, -442919, 54224, -196495, -396748, -238371, 64961, 39192, - -651761, 112206, -37581, -246961, -289910, -89657, -65498, 9664, 137976, 54761, - -92879, -196495, -154619, -111669, 53150, 11811, -108448, -13959, -52613, -68719, - 38655, 70867, -4295, 47782, -125628, -77309, 132607, -64425, 63351, -30065, - 73551, 59593, -16643, -65498, -2684, 5369, 60130, -45097, -20401, -70867, - -3221, 50466, -42950, -44560, -54761, 3758, -51540, -9664, 37581, 14496, - -35433, -2684, -6979, -26844, 9127, -16106, - }, - { - -2909840, 9758703, -1966558, -4818954, 38118, -2003065, -2139968, 910533, -441308, -311922, - 132607, 194347, 30065, 624918, 153545, -40802, -23622, -212064, -415001, 104690, - -464393, -307090, -286689, 88584, -273804, 81604, 408022, -201863, -24696, -3221, - -402653, -251256, -170188, -499290, 270583, 419833, -63888, -149787, 282394, 6979, - -77846, -233002, -57445, 96637, -10201, -30602, 146029, -35970, -321586, -291521, - 112743, -165356, -169114, 208306, 56908, 24696, 12348, 69256, 69793, 186294, - -110059, 80531, -5906, -55835, 13422, -82678, -11274, 5906, -37581, -28454, - 38655, 4832, -47245, 50466, 25770, 40265, -9664, 48855, 18790, 37581, - 4832, -18254, -45634, 25233, -65498, -41339, 13422, 7516, -25770, 18254, - -18254, 48318, -3221, -34360, -33823, 3221, - }, - { - 171799, 3932580, -1699733, -913217, -277562, -179315, -825707, 507343, -86436, -535260, - -512175, 741419, 104690, -363998, 438624, 891206, -598611, 184147, -852014, 1598265, - -33823, -693100, -93952, -578210, -63351, -364535, -48855, -382252, 5906, 333397, - -38655, 38655, 40802, 60666, -380105, 530965, 185757, 359704, -147640, -4295, - -41339, 33823, -75162, 61203, -95563, -61740, 80531, -2147, 197569, -99858, - -121333, 83752, 82678, -88584, 133144, 4832, -11274, -27380, 39728, 49392, - -31139, 77846, 34360, -36507, -70330, 41876, -25233, -7516, 78383, -8053, - 43487, -46171, -63888, -12885, 56371, 41876, 38655, 36507, -62277, -13422, - 4295, 5369, 59593, 39192, 1611, -21475, 26307, 537, 37044, -15569, - -15569, 6979, -18254, 12885, -11274, 17717, - }, - { - -268435, -8311836, 978179, 1015760, -825171, 1750199, 1179505, -244813, 42413, -392453, - 172872, -48318, 107374, 610422, -435939, 87510, -328565, 306016, -45097, 84289, - -296353, -601295, 281857, -259309, 107911, 371515, -400506, -443992, -194884, -45634, - 46171, 8590, 248571, -463320, -108985, 181999, -133144, 53150, 0, 13422, - -111132, -110059, -74625, 164283, 100932, -28991, 98784, -44560, 224949, 3221, - -242129, -164283, -35970, -29528, 2684, 54224, -76773, 75162, 92342, -158914, - 12885, 0, -6979, -55298, 78920, -5906, 8053, -12885, -2684, -104690, - 8590, -43487, -1074, -12885, -10201, 26844, 44560, 47245, 50466, -5906, - -22549, -50466, 9127, 55298, 10201, 71404, 15569, 10201, 7516, -51540, - -2147, -34897, 19327, 31139, 9127, -9127, - }, - { - -7516, -3833258, -685584, 47782, 526134, -31675, 251256, -38655, -307627, -370441, - 68719, 252329, -1734093, -893353, -2418604, -28991, 1383516, -91805, 567473, 430570, - 1964948, 474594, 395137, 609349, 1341104, -26844, -448287, -570157, 1076963, -62814, - 838592, -177704, -425202, 421981, 428960, 330176, -436476, 537, -189515, 145492, - 320512, -279173, 219043, -47782, 130460, 192737, -186294, -136365, -86973, 43487, - -113280, -108985, 182536, 2147, -95563, -15569, 183610, -79994, 10737, 52076, - 67646, -176631, 11811, 71404, 84289, 17180, 29528, 23085, -34897, -9664, - -35970, 45097, 13959, -66572, -74088, -55835, -537, 12885, -4295, 12348, - 43487, 10201, 8590, 40265, -1074, 16106, -49392, 26844, 17180, -23622, - 9664, -45097, -24159, 33823, -30065, -10737, - }, - { - -1085553, -7220914, -1210644, -4057134, 455803, 1141924, -236760, -111669, -483721, 255551, - -29528, 834297, -298500, 792958, 2843268, 264141, -1220308, -197569, -374736, -190052, - 22549, -331786, 438087, 460635, 501437, 666257, 75162, 289910, -202937, 240518, - -370978, 295279, -241055, -219043, -516470, -141197, 263604, -106300, 56908, -237834, - 425202, 70330, 146029, 94489, 143881, 176094, 13422, -338766, 183073, 94489, - 25233, 89121, -5369, 118648, 27380, 39728, -134755, -197032, 102542, 33286, - -134218, 27380, -77309, 11811, -75162, -537, -155156, -68719, -32212, 20938, - -48318, 39728, -35433, -23622, -6442, -21475, -93416, 37581, 41339, 1074, - -9127, 17717, 80531, -2147, -10201, 64425, -26307, -32749, 18254, -1074, - -14496, 48855, -7516, 1611, -10737, 15569, - }, - { - -351650, -455267, 1176821, 23085, -284005, -88047, 100395, -877247, -650688, -420907, - 147103, 685584, 357556, 3613141, -461709, 745714, 485331, -1184337, 479426, -946503, - -416612, -401043, -44023, -1923609, -498216, 68719, 777926, 466004, -410169, 525060, - 731755, 318364, -226023, 46171, 288300, -781147, 210990, 370441, -316754, 249645, - 62814, 216359, 232465, -215285, -112743, 45097, -54224, 18790, -84826, -119722, - 40802, 106300, -26307, -63351, 156766, 46708, 63888, 27380, 63351, 75699, - 60130, 83215, -205085, -45634, 32749, 78920, 63888, -79994, 75162, 44023, - 114890, -46708, 1074, 59056, -60130, 63888, -54224, -109522, -537, 4832, - 35970, 8053, 59593, -89121, 1611, 0, -6979, 40265, 14496, -26844, - 16106, 5369, -8590, -8590, 6979, 8053, - }, - }, - { - { - -2527052, 31641560, 12085501, 359167, -410169, -59056, 336618, -136365, -464393, -28454, - -280784, -121870, 386010, 465467, 469225, -465467, -288837, 38655, 225486, -1018444, - -92879, 48318, 328028, 59593, 172336, 278099, -139050, 507880, 302795, 118112, - -359704, -74625, -503048, 164283, -235149, 398895, -367220, 207232, -609349, -4832, - -66572, -27380, 96100, -110059, 27380, -25770, -30602, 3221, 177167, 1074, - -6442, -49392, -16106, 69793, 42950, 30602, -22012, 111132, 18254, 52613, - 6979, 48855, 51003, 81068, 2147, 106300, 54224, -120259, 25233, 1074, - 7516, 54761, -12885, -43487, 11811, 101469, 5906, -97174, 55835, -33286, - -28991, -50466, -11811, -1074, -4295, 55835, -61740, 12348, 1074, -28991, - -19864, -3221, -14496, 15032, 11811, 9664, - }, - { - 93952, -4209605, 2421288, 22549, -680215, -455267, 472983, -278636, -350040, -333934, - -712965, -25770, -472983, -115964, -484258, -1275605, 1469953, -521839, -839666, 179852, - -317291, -477815, 192200, 434865, 458488, 163746, 100932, 367757, 85899, 460098, - 675921, -173946, -157303, -600759, 260919, -368830, 231391, -14496, 234076, -51540, - 272194, 6979, 220117, -146029, 134218, 15032, 19327, -71404, -64961, 56908, - -7516, 112206, -189515, -45097, -56371, 137439, 61740, 0, 39192, 31675, - -34897, -31139, -50466, 93952, -71404, -10737, 47782, -108448, 17717, -47245, - 10201, -20938, 35970, 45097, 15569, -81068, 10737, 25770, 34897, -6979, - -20401, 39728, 34897, -19864, 13422, -11274, -37581, 12348, 24696, -66035, - 25233, 20938, -8053, -30065, -31675, -6979, - }, - { - -2240899, 21569326, -501974, 1886028, -126165, 246961, 170188, -190052, 207769, 73551, - -44023, -401579, -110595, -259846, -96637, -251792, -758599, -266825, -218506, -4295, - 92879, -17717, -601295, 365072, -259309, -322123, -150324, -6979, 56371, -161598, - 497679, 549219, -177704, -315680, -83215, 357556, 289910, -179852, -4832, 121870, - 159988, -56908, 143345, 20938, -98784, -105227, -253940, 12885, -136902, 93952, - 64425, -152471, -160524, 56371, -144418, -35433, 12348, -52076, 9664, 68183, - 9664, -108448, -145492, 74088, 72478, -57982, -49392, -71404, -4295, -27380, - 32749, 48855, -72478, 3758, 16643, -22012, 39728, 45634, -46708, 11274, - 62814, -9664, -31139, 65498, 30065, -37044, -15569, -31139, 23622, -1611, - -20938, 16643, 18254, -9127, 13959, 11274, - }, - { - -1988570, -5050345, -3690451, -248571, 381178, 5906, -51540, -12348, -120796, -217433, - 431644, 196495, -408559, -719944, 877784, 367220, -83215, -614717, -41339, -32212, - -31139, 116501, -236760, 169651, -165893, 144955, 301185, 220117, 13959, -275952, - -393526, 312996, 191663, -100395, 507343, -537945, 149787, -264141, -53150, -73014, - -35433, 99858, 68719, -17717, 147103, 54761, -40802, 85899, -16643, 306016, - -177704, -68719, 90731, -161061, -99858, 40802, 7516, 75699, -226560, 74088, - 22549, 73551, -96100, 94489, -90731, -28454, 39728, -101469, 43487, 2684, - -14496, -537, 64961, 28991, 51540, 46708, -22549, -26844, 17180, 21475, - -61740, -32212, -58519, 29528, 9664, -1611, 4832, -38655, 47782, 18254, - -5906, -13422, -2147, 4832, -21475, -4295, - }, - { - 387084, 2006287, -143881, 299037, -195421, 10737, 265751, 267362, -195421, -155156, - 2147, 53150, -175020, 56908, -4442070, 379568, -171262, 626528, -3739306, -433255, - 142271, 1025423, -69793, -850940, -586263, -762357, 1154809, -549756, -176631, 290447, - -340913, -284005, -226023, 318901, -377957, -482647, -387084, 121870, 330176, -176631, - -117575, -84826, 107374, 32212, 67109, 32212, -7516, -51540, 24159, -245887, - -141197, 35433, 45097, 62814, -52613, 156766, -52076, -26307, 40265, 2684, - 94489, 21475, -10201, 4295, -44023, -46171, -6442, 56908, 69793, -70867, - -28454, 82678, -6979, -11811, 17717, 2684, -21475, -7516, -16106, -68183, - -10201, -41876, 41339, 48855, -23085, 22549, -18254, -3758, 16106, -22012, - -16106, -6979, -22549, 13422, 21475, -10737, - }, - { - -1786170, -3008088, -4202089, 775778, -68719, -52076, 312459, -249108, -537, 322659, - -515396, -135291, 202400, -467615, 299037, -325344, -103616, -566399, -401579, 203474, - 142271, -467078, -517544, 251792, 23085, 53687, -341987, 162135, 382252, 42413, - -626528, 31139, 107374, 133681, 168577, -111669, -540629, 328028, 108448, 204011, - -2147, 73014, 156229, -233539, -48855, 279173, 190589, 399432, 184684, -22012, - -66572, 156229, 20401, 40265, 10201, 131533, -86973, -88584, -87510, 68183, - 71941, -18790, -45634, -82678, 23622, 12885, 3758, 10737, 68719, 46708, - 15569, -16643, -55298, 56908, -1074, 44560, -39192, -20401, -26307, 6442, - -2684, -4832, 31675, 85899, -13422, -6979, -10737, 3221, -58519, 60666, - -537, -20938, -17180, -13422, 47245, -1611, - }, - { - 397284, -1392106, -964220, 173946, 82141, 25233, -91805, 158377, -103616, -29528, - 113817, -262530, -438624, -1287953, -565325, 872952, 2694555, 230854, -712965, 240518, - 250182, 46708, -1650878, -624918, -525060, 66035, 636192, -1014149, -257161, -78920, - -7516, -427886, 162672, 322659, -723165, -8053, -141734, -255014, 139586, 363462, - -143345, -190589, 370441, -124017, -195958, -24159, -196495, -95563, 116501, 33286, - 53150, 22549, -59056, -65498, -19327, -35433, -70330, -32212, -77309, -10737, - 26844, 16643, 81604, -48318, -27380, 107911, 24159, -25770, -93952, 8053, - 30602, 24696, -49929, -25233, -24696, -36507, 39192, -38118, -40265, -5369, - 54224, -22549, 3758, 13422, 10737, 3221, -16643, 22012, 3221, -12348, - 38655, 36507, 36507, -40265, 22012, 15032, - }, - { - -556735, 31577136, 1684164, -880468, -411780, -115427, -208843, -5369, 47245, 337692, - -219043, -337692, 691490, 522375, -697395, 200790, 630823, 239981, 439160, -28991, - -121333, 253940, -302795, -312459, -47245, 72478, 190589, -268435, -290447, -133144, - 6979, 46171, 362925, -202400, 362388, 94489, -199716, 261993, -348966, 67109, - -104153, -85899, -117038, 372052, -46708, 85899, -282931, 48318, 34360, -166967, - -333397, -114890, -12348, 44560, -6442, -8590, -12348, -115427, -97711, 69793, - 105227, 47245, -41876, 41339, -34897, 40802, -74625, 30065, -1074, 15032, - 27917, -46708, 33823, -39728, -104153, 25770, 59593, -135828, -49929, 48855, - -53687, -17717, 5369, -22012, 1074, 9664, -6979, 9664, 5906, -7516, - -25233, 23085, 11274, -18254, -22549, -6979, - }, - { - 511638, -308701, -2519535, 219043, -384936, 69256, 86973, 526670, -103079, -67109, - 53150, 64425, 176631, 1145683, 380105, -1004486, 1973538, -345208, 660351, -880468, - -1067836, 987306, -394600, 94489, -685584, -410706, 482647, -1345399, 151398, -366146, - -205085, 307627, -442382, -171799, 129386, -620086, -324807, 243739, -59056, 357019, - -234076, -126702, -32749, -51540, -221728, -248571, -48318, -1074, -9664, -142271, - -44560, -55835, 89121, 20938, -38118, -23622, 128849, -73014, -118112, -143345, - -24696, -26307, -3221, 46708, 13959, 36507, 162135, -537, 13959, -102005, - -10201, -10201, 46708, 88584, -14496, -46171, 42950, 0, -9127, 24159, - -42413, -537, 33823, 22549, -537, 32749, -20401, -72478, -3221, 11274, - -18790, -35433, 19327, 9664, -9664, -1074, - }, - { - 2253247, 15704011, 5106716, -701690, 969052, 73551, 611496, 375273, -71941, -229244, - -287763, 125091, -460098, -30065, 889058, -84826, 662499, 204011, -1008780, 123480, - 428960, -206158, 7516, 370441, 187905, -71404, -172872, -322123, -83215, 146029, - -30602, -125091, 256087, -264141, -188979, 137439, -257161, -54224, -100395, -38118, - -256624, -59593, -20938, 148176, 223338, -197569, -264677, 12348, 27380, -105764, - -109522, 106837, -32212, -159988, 157840, 218506, -537, -157840, 35433, 29528, - 120259, 99858, -4832, 25770, 6979, 36507, -19864, -19864, 32212, -77309, - -29528, -25770, 24159, -17180, 22012, -12348, -537, -47782, 66035, -60666, - 17717, 61203, 6442, -18790, 12348, 1074, -41339, -1611, -9664, -46171, - 0, -29528, 33823, -3758, 12885, -30065, - }, - { - -266288, 4753992, 618475, -664109, -109522, -59056, -376347, 665720, -119722, -340913, - -838056, -282394, 33286, -726386, 354872, -782221, -1557463, 1353452, -1460826, -911607, - 219580, -196495, 547608, -70867, 194884, 405338, -384400, -171799, -35433, 242666, - 35970, 79994, 113280, -63888, 63888, -83215, -140660, 327491, -91268, 223875, - -30602, 234613, 100932, -1074, -26844, 106300, -11811, 16643, 31675, -171262, - 37581, 25233, 8053, -95563, 137439, 41876, 90731, -30602, -34897, 61740, - -38655, -162135, 12348, 76236, 25770, -68183, 31139, 3758, -37044, -32212, - 16643, -3758, -11811, 12348, -27380, -1074, -21475, 48318, 78920, -42413, - 4295, 53687, -48318, -16643, 44560, 35433, 15569, 40802, -30065, 45097, - 1074, 6442, 18254, 4295, -1611, -41876, - }, - { - 786516, -7619809, 398358, 383863, -20938, -71404, 523449, -324807, 134218, 208843, - -227633, 635655, -81604, -183610, -521839, 22012, -309775, -197569, 127238, -153545, - 507880, -364535, 339839, -316754, 276489, -205622, 19864, -456340, 376883, -370441, - -133681, -192200, 105764, -83215, -519691, 24696, 33286, 27917, 159988, -103079, - 103079, 44560, 172872, -100932, -139586, -123480, 173409, 24159, 164283, 100395, - -108448, -223338, 107374, -45097, 65498, -33823, -74625, 28991, -68183, 76236, - 31139, -8590, 41876, -12885, -79457, -18790, 11274, -67646, 109522, 15569, - -37044, 35433, 5369, 6442, -16106, -35970, -8053, 3221, 31139, 21475, - -13422, -9127, -52613, 0, 0, -46708, 46708, -2147, 9127, 15032, - -18790, -1611, -33286, -22012, 25233, -11274, - }, - { - -89657, -1916629, 542240, -247497, -213138, 106837, -325881, 32212, -315143, -333934, - -2684, -657667, 1868848, 4929549, -319975, -1297617, 706522, -237834, -216359, 102005, - -469225, 1258962, -82141, -1100049, 171262, 160524, 548682, 364535, 755377, -215822, - -828392, 23085, -164283, 263067, 59056, 60130, 233002, -169114, 135828, -267899, - 86436, -153545, 317828, -227096, 271657, 274878, 76236, -46171, -95026, 70867, - -117038, -63351, -112206, 17180, -33286, -125091, -173946, 9127, -44023, -56371, - 155693, 118112, -51003, -61203, -46708, 185757, -51540, -12885, 39728, -47245, - -14496, 30602, 57445, -18254, -1074, -30602, -62277, -30602, 35433, -1074, - -40265, 34360, 56371, 13959, 14496, 13959, 33823, -42413, 2684, -3221, - 34360, 57445, -52076, -53687, 39728, -16106, - }, - { - 1469416, -1959042, 1707786, -1010391, 654983, 892279, -94489, 44023, 223875, -295816, - -494995, 172336, 93952, 60666, 537408, -508417, 267362, 16106, -168577, -349503, - 296353, 310311, -309775, 380105, -539555, 198642, 120796, 348429, -16643, -308701, - 198105, 329639, -230854, -18254, 62814, -187368, -42950, -57445, 157303, 220654, - -68183, -171262, -103616, -141197, 6979, 89657, 117575, -64961, 177167, 153545, - -282931, 97711, -165893, -170725, -122943, 71941, 147640, 41339, 56908, 11274, - -116501, 91268, -16106, 41876, 68183, -537, 84826, -19864, -48318, -10201, - 36507, 0, 11811, -83752, -9664, 10201, 22012, -33286, -12348, 39728, - 15032, -38118, 11274, 31139, 10737, 14496, 74088, -33286, -42950, 8053, - 1611, -19864, 15569, 2147, 17717, -19327, - }, - { - 191663, -1103270, 758062, 289373, -95026, -66572, 7516, -99858, -449898, -114354, - 99321, -299574, 128312, 2761664, -5304285, 1107028, 1757715, -23622, 682900, 234076, - 1504312, 769336, -187368, -451508, 659278, 147640, 657130, 440771, -834834, 708670, - 520765, -146566, -48855, -33823, 197032, -234613, 104690, -222801, 74625, 577673, - 75162, -308164, -132607, -157303, 353798, 10737, -43487, 97711, -23622, -113280, - 66572, 70867, -115427, -206158, 5369, 20938, 46171, -95563, 149787, 6442, - -264677, -38655, -48318, 32749, -51540, 3221, -58519, 146029, -70867, -17180, - 63888, 44023, -83215, 9127, -3758, -47245, 59593, -10737, -12885, -18254, - 4295, 39192, 41339, 61740, -38118, -1611, -8053, -16106, -1611, 30602, - 15569, -24159, 32749, -2147, -15032, 19327, - }, - }, - { - { - 3958886, 46572476, 524523, 559420, -817654, 5906, 119722, -582505, -76236, 254477, - -99858, -14496, 370978, 727997, -822486, -115964, -304943, -158377, 30065, -207232, - 215822, -450972, 108448, 28454, 185757, 97711, 69793, 126702, 548145, 311922, - 158914, -347892, -301721, -39192, 156766, 50466, 81068, 120796, -312996, -266288, - -71941, -46708, -7516, 88047, 216359, -39192, -202400, 83215, 24696, 122407, - 75162, -54224, 21475, 45634, -105227, 13959, 56371, -41339, -63888, 160524, - -49392, -12885, -11274, 112743, 39192, 71941, 68183, -74625, 4295, -37044, - 56371, 37581, 19864, -41339, -36507, 16106, 47782, -63351, 47782, 23085, - 23085, -11811, -24159, 17717, -27917, 51003, 3758, 3221, 16643, 5369, - -36507, 11274, -1074, -1074, -1611, 6442, - }, - { - 406948, -1582696, 28454, -625455, -229244, -254477, 27917, -44023, -165356, -206158, - -876173, -268972, -623844, -241055, -1017370, -586263, -140660, 304943, -1256278, -121333, - -222801, -96637, 104153, -186831, 1004486, 521302, 300111, 132607, -96100, 151934, - 419296, 130997, -259309, -482110, 142808, -139586, 89657, 68183, -17180, 41876, - 150324, 113280, 309775, 68183, 86436, -47245, 23085, -296353, 96100, 27380, - 0, 159451, 39192, -30602, -169114, 60130, 31139, 61740, -82678, 26844, - 41876, 87510, -57445, -54761, 13959, -42413, 88047, 16106, -66035, -35433, - 45097, -91805, 4832, 24696, 34360, -87510, -70330, -9664, 70867, 38655, - -30602, 11811, 34360, 5906, 12885, 31139, -5369, 3221, 57982, -41876, - 4832, 14496, 20938, -2147, -32749, -13422, - }, - { - 1209570, 13038447, 3415036, 3160022, -656593, 382789, 532576, -135828, -382252, 35970, - -154619, 59056, -698469, 223338, -277025, -306553, 12348, -896574, -243739, -147640, - -231391, -243203, -578210, -128849, 399969, -175020, -46708, -196495, 139050, 143881, - 515933, -144418, -119185, -10737, -178241, 511638, 162672, 55835, -287226, -103616, - 101469, -43487, 128312, -2684, 16106, -51003, -130460, 32212, -27917, -39728, - 26307, -31139, -165356, 148176, -52613, -102005, -69256, -13959, -73551, 63888, - 45097, -47782, -19864, -55298, 49929, 16106, -22012, -59056, 21475, -42413, - -30065, 60666, -33823, 34360, -31139, -99858, 52076, 97711, -22012, -35433, - 8590, 35433, -11274, 4832, 20938, -6979, -11811, -30065, 18790, -4832, - -20401, -19327, 24696, 7516, -8053, 14496, - }, - { - 264677, -16058883, 3007014, -42950, 217433, 92879, 128849, 213675, -190589, -151934, - -190052, 70867, -286152, 306016, -584116, 335544, 268972, -798864, -271120, 133144, - -131533, -123480, 270583, 8590, -255014, -24696, 523986, 315143, -38655, -287763, - -166430, 328565, 193274, 8053, 307627, -384400, 121333, -209380, 25233, -85899, - -234613, 101469, 62277, -61740, -32212, 191663, 194884, 10737, -17717, 244813, - 53687, -239981, 70867, -183610, -21475, 26307, -75162, -11274, -143881, 6979, - 73551, 60130, -23085, 105227, -12348, 6442, 29528, -124554, -1074, 63351, - -11811, -86436, 12885, 46708, 22549, 8590, 18790, 9664, 9664, 52613, - -14496, -24159, -27917, 21475, -2684, -17717, 28454, -25770, 2147, 23085, - 11274, -12348, -9127, 12885, -8053, -5369, - }, - { - -607738, -96637, 1919314, 523986, -202937, 4295, 315143, 150324, 8590, 7516, - 0, -94489, 227096, 41339, -4158602, -529355, -492311, 1304596, -304943, -1358820, - 239444, 642098, -557809, -505732, -624381, 39192, -687732, -394063, 38655, 100932, - -237297, 41876, -174483, 99858, -273804, 119722, -472983, -163746, 414464, 184147, - -237834, 13422, 301185, -65498, -58519, 42950, -10201, -27380, -53687, -537, - -9127, -301185, 153008, -31675, -81604, 85899, 59056, 18790, -24696, 56908, - 115964, 37044, -41876, 28454, 28991, -13959, 25233, -20401, 63351, 47245, - -89121, -1074, 35433, -17180, 5906, 17717, -23085, 28454, 33823, -9127, - 5906, -56371, 4295, 31139, -19327, 16643, -21475, -4832, 5906, 2147, - -5906, -3221, -9127, -15569, 37581, 9127, - }, - { - 32749, -14112189, 2840584, 372588, -464393, -6442, 450972, -315143, -193810, 756451, - -187905, -310311, -183610, -293668, 250719, -675921, -151398, -299574, -142271, 26307, - 437013, -148713, -483721, -184147, 149787, 83215, -4832, -234076, 268972, -21475, - -222265, -171799, 323196, 199716, -223875, -51003, 74088, -6442, 140660, 340376, - 449361, -161061, -120259, -174483, 73014, 193810, 135291, 182536, 209380, 159988, - -197032, 5906, 173409, 185220, -83215, 74625, 119185, -65498, -66035, 47782, - -27380, 29528, -5369, -42950, -25770, -6442, 27917, -8590, 76236, 47245, - 2147, 1074, -53687, 18790, -8590, 55298, 35970, -15569, -40265, -32212, - -5906, -39192, -19327, 69256, 24159, 28454, 537, 45634, -52076, 12348, - 1074, -8590, -8053, -9664, 8053, 11811, - }, - { - 60666, 247497, -881542, -153008, 24696, 38655, -275952, 213675, 82678, -83215, - -67109, -327491, -455267, -2421825, -755377, 2772402, 963146, 181462, -402653, 29528, - -96100, 642635, -1200980, -1978906, -414464, 321049, -169114, 93952, -583042, 120259, - 178241, -133681, -364535, 303332, -136902, -178778, -244813, -34897, 286152, 394600, - -186294, 9664, 189515, -273804, -4295, 125091, -99858, -39728, -21475, 1074, - 92342, -13959, 31675, -60666, -63351, -40802, 26844, -129386, -56908, -72478, - 73551, -32749, 29528, 15569, -40265, 34360, 98784, 43487, -113280, -67109, - 13959, 62277, -22549, -5906, 41876, 18254, 37044, 21475, -6979, -33286, - 38655, -4295, 35970, -32212, 18790, 10201, -28454, -5369, -26307, -42950, - -12885, 9664, 36507, -18254, 6979, 27380, - }, - { - 1203128, 32046362, -1016297, -1136019, -66572, -31139, -499827, -181999, 410706, 124017, - 273267, -442382, 228707, 56908, 413927, 227096, 573378, -235686, 203474, 599148, - -288837, 44023, 27917, -284542, -158377, 84826, 237297, -188979, -701153, -25770, - 65498, -186831, 649077, -282394, 153008, 514322, -222265, 112206, 370978, -315680, - 59056, -360240, 157840, -61203, 31675, 63351, -231928, -171799, 18254, 22012, - -229244, -284542, -245350, 13959, 114890, 76236, 42413, -85362, -180389, -1611, - 52613, 25770, 33823, -2147, -47782, -27917, -52613, 44560, -20401, 16106, - 20401, -45097, 56908, 19864, -40265, -59593, 97174, -33823, -58519, 30602, - -41876, -3758, -30602, -537, -17180, 1611, 48318, 16106, 537, 2684, - -7516, 21475, 18254, 6979, -25233, -22012, - }, - { - 41876, 1112933, -1054951, -390305, -181462, -47245, 119185, 466004, 293668, -206158, - -221728, 85899, 418759, 999117, 1195075, -2893734, 1239098, -150324, -3758, -555661, - -597000, 414464, 788663, -585726, 22012, -1000727, -164283, -796716, 609885, -754304, - -351114, -537, -50466, 85362, -266288, -333397, -12885, 82678, -15569, -31139, - 443455, -176094, -83215, 45634, -106300, 57982, -35970, -26307, -100395, -144955, - -85362, 92342, 14496, 28454, -63351, 9664, 140123, -38655, 2684, -105227, - -41339, -118112, -12348, -48855, -18790, -4832, 40802, -23622, 19864, -92879, - -46708, -84826, -32212, 128312, 26844, -44023, -13422, 55835, -4832, 20938, - -10737, -60130, 9127, 18790, 21475, 17717, 51003, -13422, -34897, -11811, - 11811, -33286, 1611, 21475, -11811, 15032, - }, - { - -1676648, 19016504, 5695127, 1406065, 235149, 1154809, 1192390, -424128, 324270, 74625, - -157303, 41339, -75162, -578747, 390842, 186294, 721018, 135291, -688269, -129923, - 513785, -153545, 230318, 174483, 370441, -99858, -222265, -62277, -172336, -4832, - 138513, 257698, 96100, 188442, -63351, -267362, -246961, 67646, -337692, 16106, - -92342, 101469, -214748, 80531, 159451, 48318, -268972, -74088, 28991, 71941, - -69793, 146029, 115427, -103079, 63888, 142808, 122943, -187905, 35433, -95026, - 120796, 114890, 5369, 59593, -36507, 71941, -18254, -9664, 25233, -43487, - -62814, 11274, 50466, -10737, 13959, -28454, 40265, -45097, 11274, -37044, - -30065, 30602, 35433, -8590, 56908, 60666, -3221, 2147, 9127, -24696, - 22012, -60130, 10201, 12885, 26307, -9664, - }, - { - 150324, 3391951, 1465121, -550830, -226023, -1074, 218506, 277562, 161598, -35970, - -490163, -118648, -489089, -1026497, -186831, -290447, -789737, -323733, -370441, -1443109, - -293668, 39728, 804770, 74088, 454193, 178241, -220654, 263604, -313533, -217970, - -160524, 20401, 146566, -117575, 180926, -167504, -335544, 132607, 39728, 241055, - -13959, 8590, 321586, -38655, 22012, 128849, 6442, 119722, 28991, 2684, - 96100, -2684, -105764, -136365, -15032, 150861, -2684, 33286, 5906, 7516, - 35970, -107911, -33286, 60666, 60666, -40265, -1074, 78383, -47782, -2147, - -1611, -36507, -23085, 14496, -24159, -22549, -68183, -1074, 58519, -17180, - -2147, 64961, -19327, -53150, 2147, 30602, -8590, 8590, -40802, 5906, - 17717, 11274, 8590, -6979, 18790, -30602, - }, - { - -1552094, -5116917, -70867, 154082, 643171, -1378685, 696322, 118112, -147103, 638876, - -767189, 201327, 108448, -394600, -483721, -369367, 144955, -366683, 42950, 89657, - 169651, 144955, 19864, -83215, 246424, -204011, 110595, -427349, 183073, -34360, - -221191, -198105, -390305, 170725, -192200, -546535, -105764, -198642, 168577, -9664, - 44560, 171799, 110595, -59056, -153008, -41876, -37581, 186294, 19864, 5369, - 132607, -92342, -44023, 2147, -62814, -15569, -74625, 5906, -121870, 95563, - 51540, 9127, -20401, 37581, -82141, -537, -22012, -59593, 30065, 88047, - 1611, 10201, 11811, 10201, 20938, -11274, -36507, -15569, -15569, -2147, - -537, 42950, -15569, -14496, 5369, -51003, 28454, -2147, 15569, 35433, - 0, 28454, -10737, -19864, 10201, -1074, - }, - { - 161061, -579284, -430034, -861141, 187368, -31675, -271120, -169114, -396748, 57445, - 45634, -222265, 555661, 4752382, 682363, -428960, -454193, -113280, -593242, 813359, - -1629940, 89657, 985158, -1067836, 192737, 198105, 238371, 986769, 183073, 469225, - -1062468, -313533, 53150, 117575, -65498, -300648, 308164, 109522, 273804, -164819, - -251792, 164283, 177167, -118648, 324807, 103079, 178241, 25233, 54761, -111669, - -79457, 42413, -67646, 27380, -58519, -12885, -205622, -1611, 63888, -136365, - -3758, 187905, 35970, -23622, -121333, 112743, -12885, -41339, 57445, -2684, - -17180, -4295, 13959, 18254, 41876, 15569, -10737, -2147, 8053, -8053, - -46708, -17717, 30602, -13959, 12348, 3221, 39728, -32212, -8053, 16643, - -2147, 63888, 8053, -46708, 22549, 27380, - }, - { - -813896, 2183454, -1584306, 1194538, -99321, -1147293, 1359894, 545998, 458488, -361314, - 576063, -607201, 515933, -49392, -628676, -402116, 156229, -297427, -46171, -493921, - 140123, 584652, -239444, 204548, -350577, 45097, 108985, 371515, 185757, -173409, - 365609, -224949, -92342, -171799, 166430, -171262, -163746, 79457, -34360, 170188, - -164819, 9664, 4295, -188979, -161061, 17717, -119185, 30065, 81604, 53150, - -180926, -53687, -68183, -92879, -183610, 32212, 61740, 124017, -63888, 2684, - 13959, -46171, 64961, -67646, 59593, -71941, 78383, -17717, -2684, -27380, - 52076, -2147, 9127, -32212, -35433, -26307, 37044, -31139, -62814, 0, - 7516, -27380, -50466, -10201, 20401, -46708, 62814, 38655, -25770, -10201, - 537, -48318, 0, -4832, 17180, -2147, - }, - { - -322659, -864899, 99321, 147103, 265751, -8590, -330176, 797790, -952409, -249645, - 169114, -264141, 430570, -434865, 1543504, 1484448, 303869, 237834, -384936, 923418, - 1197222, 758062, -284542, 624381, 796716, -128312, -180389, 213675, 482110, 208843, - 449361, 54761, 49392, -168041, -100932, 44023, 84289, -317291, 251792, 328028, - 330712, -179852, 97711, -156229, 113280, 100932, 20938, 10737, 34897, -107911, - 74088, 39728, 13422, -157840, -178241, -4832, 32749, 51540, 57445, 236760, - -116501, -99321, 11274, 70330, -3758, -33823, -118648, 120796, -9127, 20938, - -56371, 90731, 42950, 6979, 31675, -44023, 23622, 71404, 2684, -5906, - -40802, 2147, -41876, 70330, -11811, -6442, 5906, -29528, -12348, 15569, - -2684, -31675, 27380, 19864, -2147, 4832, - }, - }, - { - { - -5036386, 39122320, 2305861, -1589138, 910533, -33286, -503585, -264141, 99858, -125091, - 508954, 517007, -269509, 181462, -1171989, 723702, 136902, -111132, -184147, 892279, - 782758, -71404, -201863, -183610, 91805, 74088, -335007, -123480, 56371, -36507, - 427349, -196495, 136365, 55298, 336081, -317828, 65498, 118648, 219043, 233539, - 167504, -61740, -30602, 43487, 65498, 9127, -64961, 9664, -6442, 136365, - 154082, -47782, -35970, 13422, -93952, 66035, 73551, -90731, -204548, 6442, - 49929, 21475, -39192, -48318, -5906, -32212, -19864, 46171, 26844, -5369, - 28454, -32212, 15032, 55298, -1074, -95026, -16106, 26844, -46171, 46708, - 10737, 39728, 11811, 11274, 17717, -45634, 59056, -38118, 537, 17717, - 4832, -8590, 17717, -9127, -11811, -8053, - }, - { - -445066, -1631551, 1545651, -1260036, 181999, 90731, 221191, -266825, 285078, 15569, - -247497, -60666, -407485, 641024, 599148, 89657, -894964, 794569, 357556, -38118, - -39728, 130997, -311922, -748398, 251792, 410706, 42413, 289910, -49392, -585726, - -164819, -212601, -209917, -128849, -227096, 130997, 40802, -1611, 91268, 156766, - -70867, -67109, 171799, 136902, -176631, 33823, 31139, -178241, 110595, 51540, - 151398, 19327, 81604, 69256, 130997, -157840, -194884, 39728, -26307, -54224, - 20401, 91268, 9127, -62277, 14496, 54761, -43487, 95563, -11811, -41339, - 11811, 1611, -26844, -82678, 12885, 50466, -48855, -54761, -6442, 38118, - 53150, -28991, -37044, 21475, -19327, 30602, 25233, -2684, -5369, 53150, - -9127, -32212, -3758, 34360, 24159, 2147, - }, - { - -616865, 10325638, 2598455, 2634426, 1049583, 408559, 315680, 289373, 90731, -180389, - -10201, 647466, -479426, -219580, 204548, -142271, 474057, -389231, 920734, -121870, - 155693, -99321, -282394, -200253, 212064, -171262, 300111, 225486, 237834, 152471, - 374199, -918049, -254477, 119722, -156229, -132070, 30065, 27917, -210990, -128312, - -63888, -374736, -190052, -20401, -192737, 106837, -104690, -15569, 17717, -66572, - -256624, 2684, 126702, 134218, 42413, 76236, -30065, 66035, -68183, 34360, - -77309, 66035, 87510, 73551, -93416, 14496, 47782, -3758, -35970, 27917, - -537, -59593, -35433, 81068, -16643, -33286, -32212, -12348, 35433, -24696, - -18790, 4295, 40265, -21475, -62277, 28991, 27380, 25233, -26844, -2684, - 17717, -17717, -5906, 2684, -20938, -20401, - }, - { - 3104725, -14253386, 956704, -1333051, -282394, 115427, 193810, 79994, -54761, 306016, - -181462, -244276, -348966, 543850, -211527, 53150, 260919, -181462, 23622, -45097, - -164819, -270046, 410706, 139050, -81604, 37044, -218506, 506269, -337155, -113817, - 153545, 181462, 62277, 106300, 35433, -70330, 164283, -10737, -112206, -9664, - -33286, -19864, -112206, 86973, -241055, -143881, 235686, -51540, 27380, -13959, - 95563, 30065, -67109, -12348, -13422, 11274, -34360, 13422, 95563, -49392, - -55298, 37044, 52076, -41876, 62814, 52076, -2684, 67109, -66035, 55835, - 70330, 23085, -110059, -19327, -6442, -48318, 6979, 25770, 4295, 18254, - 29528, 31675, 48855, -22549, -4832, -2147, -20401, 33823, -47245, -23622, - 18254, 27380, -15569, 0, 20401, 4295, - }, - { - 626528, -960462, -975494, -90731, 232465, 25770, -39728, 139586, 175020, 127238, - 87510, -84826, -169114, 165893, -2360085, 585726, -802622, -398895, 3400004, -376347, - 493384, -485331, -394063, 612570, -622770, 512175, -1323924, -338766, -317291, 277025, - 609349, 586263, -282394, 179315, -11811, 341450, -689879, -146029, 28991, -107911, - -59593, -164819, 191126, -69256, -210453, 13422, 78920, -31139, 133144, -23622, - 152471, -167504, -42950, 108985, -3221, -10737, -60130, 125091, 62277, -29528, - 30065, 48855, -51003, -56908, 2147, 29528, 20938, 59593, 26307, 5906, - 48318, -33823, -38118, -5906, -10201, -28991, 18790, -17717, -6979, 59056, - 18254, 43487, -14496, -81068, 33286, -18254, 13422, 12348, -27380, 11274, - -21475, 5369, 36507, -23085, -28991, 2147, - }, - { - 3723200, -12448963, -691490, 269509, -347892, 12885, -285615, 452045, -282394, -461709, - 486405, -24159, -272730, -120796, 533113, 63351, 250182, 20401, 537945, -149787, - -19864, 131533, 161598, -94489, -206158, -80531, -204548, -84826, 33286, -100395, - 374736, 185220, 177167, -127238, -230318, 61740, 342524, 137439, -32212, 176094, - 206158, -232465, -163746, 103079, 42413, -117575, -111132, -110595, -28454, 92879, - 75699, -210990, 4832, 17717, 120259, -120796, 59593, 81068, 99321, 9127, - -132607, -23085, 41876, 89121, 58519, -42950, -13959, 38655, 19864, 8053, - -6979, -11811, 33823, -42950, 1074, -20401, 56908, 31675, -12348, -24696, - 25233, -4832, -30065, -66035, -22549, 18254, 19864, -9127, 52613, -32212, - -3758, 6979, -2684, 20938, -32212, 537, - }, - { - -320512, -671089, 834834, -34360, 52613, -88584, -285078, 103616, 178241, 4832, - -127238, -6442, 301721, 1566053, 1070521, 1328219, -464393, 76773, -703301, -871342, - -278636, 441308, -915902, -398358, 297427, 663572, -525060, 1149441, -84289, 392990, - -68719, 186831, -326418, -427886, 128312, 335544, -211527, -129923, -88584, -155156, - 76236, 161598, -89121, -162672, -212064, 57445, 106837, 41876, -30065, 24696, - -73014, -103079, 44560, 45634, 2684, -45097, -10737, 43487, -51540, -78383, - 64425, -28991, -81604, -20938, -59056, -17717, -34360, 44023, 37581, 9664, - -138513, 1074, 52076, 5369, 9664, 44560, -8590, 38118, 37044, 7516, - 3758, 12348, 15569, -24696, -10201, -537, 31139, -34360, -14496, 3758, - -35970, -24159, -12885, 24159, -4832, -4832, - }, - { - -3728569, 30757334, 26844, -966905, 231391, -52076, 148713, -144418, 217433, -186294, - 446677, 349503, -313533, -414464, 931471, 277562, 60130, -26844, -785442, 127775, - 294205, -301185, -294205, 77309, 46708, -81068, 318901, 124554, -242129, -93952, - 25233, -330712, 100932, -462783, -269509, 364535, 264677, 241592, 466541, -105764, - 86436, -204548, 190589, -9127, -257698, 63888, -27380, 37581, -124017, 156229, - 67646, 147640, -78383, -170188, 24159, -44023, 64425, 11811, -12885, 13959, - -86436, -80531, 9127, 37581, 44023, -38118, -28454, 15569, 5906, -36507, - -1611, 13959, -11274, -22012, 89657, -18254, -74625, 72478, 1074, -8590, - 25233, 40802, -40802, -537, -11811, -5906, -20401, 28991, -8590, 11811, - 4832, -18790, -5369, 13422, 11811, -6442, - }, - { - -467078, -743029, 1437740, -213675, 231391, -16106, -23622, -268972, 273804, 118112, - -100932, 1611, -85362, -383326, 1722282, -893890, 1763084, -1034550, -214212, 78920, - -185220, -209380, 1693291, -134218, 1120987, -260919, -757525, 336081, 194884, -476205, - 528281, -376347, 59593, 2684, -576063, 192737, 237297, -137976, 260382, -261993, - 158914, 18790, -111132, 62814, 56908, 194884, -155156, -21475, -85362, 31139, - 9127, 83215, -135291, -12885, 76773, 76236, -93416, 35970, 113280, -49392, - 95563, -13422, -44023, -1074, -44560, -70867, -73014, -153545, 52076, 11274, - 23085, -26307, -84826, -41339, 15569, -6442, -10737, 32212, 46171, -8590, - 54224, -7516, -67646, -16106, -12885, -26844, 24696, 60130, 6979, -11811, - -11274, 2147, -12348, -3221, -2684, -7516, - }, - { - 653372, 17278116, -3023120, -164819, -13422, 1109712, 139050, -486405, -30065, 54761, - 17180, -304406, 301185, -175020, -981937, -70867, 121333, 34360, 154619, 71404, - -34897, 8590, -48855, -210990, 48318, 302258, 105764, -270046, -121333, 37044, - 61740, 290447, -289373, 85362, 446677, 61203, 2147, 121870, 84289, -168041, - -163746, -5369, -121870, -92342, -327491, 217433, 97174, -124554, -145492, 6979, - 164283, -33286, 35433, 221191, -49929, -108985, 194884, 63351, -19327, 6442, - -69256, 48855, -52613, -8590, 23085, -7516, 22012, 15569, -76236, 2147, - 4295, 39192, -32749, 22012, 2684, 21475, -5369, 36507, -39728, 48318, - -32749, -30602, -22012, 20938, -20938, 23622, 38118, 7516, -6979, 29528, - 537, 12885, -13422, -12348, -12885, 27917, - }, - { - -32212, 2171643, -442919, -588411, -257698, -26307, 163746, -396748, -248571, 149250, - 260382, 633508, -593242, -605590, -805843, 289373, 227633, -941135, -274341, 944893, - -407485, -745177, 475668, 140123, 494458, -51540, 303332, 214212, -159988, 537, - -157303, -83752, -81068, -34897, -133681, 221728, -163209, 30065, -70330, -27380, - -104153, -210453, 177704, 25233, 87510, -17180, -6442, 37044, 42950, 57445, - 35970, 52613, 14496, -53150, -101469, 52076, -133681, 10737, 126165, 15569, - -11274, 84826, -17717, -34897, -63888, 73551, -60666, 15569, 39728, 17717, - 32749, -30065, -41339, -17717, 31139, 10737, -1074, -14496, -92879, 22549, - -1074, -12348, 58519, 9664, -37044, -28991, 1611, -32212, 24159, -49929, - -8590, 11811, -12348, 9127, 3758, 29528, - }, - { - 1720671, -99321, -1112933, -1159641, -351114, -642635, -391916, -204548, -120259, 329639, - 155693, -310311, -129386, 72478, -181462, -282394, 265214, 0, -350040, 324807, - -419833, 206695, 212064, 135291, -244813, -94489, -289910, 112206, 98784, 369367, - -203474, -39192, -241055, -120796, 267362, -127238, 26844, -92879, -41876, -41876, - -245887, 157840, -133144, -68719, -69793, 97174, -66572, 52613, -110059, -165356, - 74088, 98247, -144418, 112206, -167504, 64425, 34897, 50466, 38118, -92342, - 71404, 73551, -78920, -4295, 89657, 30065, -44560, 5369, -46171, -31139, - 75162, -34360, -5369, 3221, 27917, 27917, -13959, 2684, -28454, -52613, - -18790, -2684, 31139, 15569, -6442, 46171, -25770, 0, 20401, -24696, - 18254, -1611, 38655, 15569, -22549, -1074, - }, - { - -181462, 161598, 1474248, -490163, 373125, -134755, 521302, -314069, -392990, 99321, - -124017, 319438, -2029909, 715112, -1147830, 847182, -412317, 93416, -93416, 485331, - 410706, -938987, 1546188, 246961, 204011, -194347, 28991, 462246, -112743, 348429, - 388158, 4295, 187368, -193274, 62277, 9127, -366146, 186831, -131533, -80531, - -297427, 171262, 195421, 17180, -4295, -142808, 24696, 83215, 159988, -107374, - -13422, 43487, 137976, -14496, -92342, 77309, 118648, -35433, 76773, -24159, - -102005, -123480, 41876, 20401, 14496, -16106, 33286, -24159, -24696, 48318, - -4295, -6979, -38655, 17180, -26307, 26844, 81604, 56371, 18790, 7516, - 32212, -35433, -29528, -12885, -10201, 6979, -38655, 27917, 3758, 14496, - -17180, -34897, 28991, 44023, -44023, 28454, - }, - { - -108985, 3949223, -1646583, 602369, -330176, -1881196, 136365, 79457, -28454, 170188, - 221728, -559420, 773631, 48318, 336081, 665720, -152471, -122943, -143345, -365609, - -120259, -31675, 31139, -302795, -137976, -375810, -426276, 256624, 537, 419833, - 256087, -44560, 162672, -121870, -76773, -34897, -125628, -86436, -55298, -41876, - 142271, 53687, 150861, -26844, -40802, -2147, -341987, -306553, -77309, -158377, - 157303, -57982, -6979, 149787, -55298, 30065, -77309, -44023, -51003, -14496, - 105227, -116501, 19864, -32212, -6979, -41339, -62277, 29528, 8053, 22549, - -27917, 30065, -10737, 56371, -7516, -26844, -42950, 49929, 8053, -28454, - -30065, 28991, -4832, -63888, -9127, -20401, -49929, 32749, 46708, -9664, - -19864, 15032, -16643, -2147, -14496, 27917, - }, - { - 396211, -573915, -1636383, -415001, 143345, -69793, -54761, 662499, -655519, 130460, - 77309, 42950, -494995, -828929, 7073811, 2587181, -421444, 323733, -792421, 82141, - 290984, -31675, 125628, 300648, 387621, -152471, -474594, -344134, 501437, -230854, - 100932, 324270, 103079, -204548, 2684, -326954, -95026, 44560, 132070, 247497, - 118112, -46708, 340376, -12348, -321049, -17717, -143881, -149250, -8590, -537, - 30602, -30602, 83752, 33823, -31675, -49929, -28991, 186294, -147640, 133681, - 154082, 26307, -60666, 537, -11274, 38118, 57445, -130997, 52613, 25770, - -54761, -54224, 57445, 28991, -3221, 118112, -53687, 23085, 27917, 19864, - 21475, -23622, -44023, -61740, 32212, -18790, 537, 16643, 5369, -30065, - 6442, -3221, -22549, 8053, 18254, -2684, - }, - }, - { - { - 3361349, 28029494, -5697274, 1323387, 664646, -139050, -528818, 57982, -184147, -285615, - 346819, 355945, 55298, -392453, -1611, 145492, 876710, -391379, 6442, 444529, - 708670, 278099, -198105, -139050, 25770, 53150, -92879, -444529, 135291, -318901, - 122407, 110595, 155693, -56908, 148713, -114890, -63351, -218506, 334471, 246961, - 255014, 57982, -230318, 40265, -25233, -91805, 23085, 57982, -26844, 49929, - 156229, 49392, -63351, -24159, -22549, 136365, 26307, -6442, -73551, -84826, - 65498, 6442, 75699, -76236, -23622, -32212, -30602, 28454, 35433, 22549, - 26307, -56908, -13959, 64425, 23085, -30602, -51003, 20401, -28454, -13422, - -19864, 12885, 18254, -21475, 52076, -51540, 537, -22012, -11811, -11274, - 10737, -6442, 13959, -4295, -1074, -7516, - }, - { - 207232, -1056562, -54761, -196495, 6979, 116501, 285615, -357556, 10201, 12885, - 43487, 56908, -280784, -30065, 1730872, 491774, -236760, 81604, 690953, 265214, - 47782, -301721, 83215, -354335, -548145, 209917, 267362, -214748, 31139, -263067, - -316217, -48855, -91805, -69256, -288837, 104690, 8053, -357556, 91268, 441308, - -100932, -163746, -169651, 279710, -191126, 69256, 4832, -68719, 83752, 61203, - 165893, -89657, -4295, 1074, 161598, -80531, -86973, -49392, 38655, -27917, - -53687, -12885, 44023, 2684, 24696, 66572, -92342, 8053, 1611, -14496, - -20938, 65498, -21475, -36507, -30602, 57445, 26307, -20401, -44560, 0, - 53150, -10201, -37581, 16106, -8053, -22012, 12885, -1074, -42413, 43487, - 5369, -20401, -19864, 7516, 22012, 14496, - }, - { - 573378, 8791798, 2680060, 1093606, 1284732, 400506, 138513, 318901, 417686, -166430, - -259846, 359167, 215822, -427886, 107911, 328565, 185220, -151398, 508417, 874026, - -191126, 140660, 182536, -134218, -158914, -470299, 529892, -135291, 262530, 397284, - -71404, -461709, -606664, 94489, 55298, -136365, -73014, -137976, 157840, -279710, - -46171, -493921, -98784, -216896, -32212, -59056, -35433, -63351, 4832, -139586, - -172336, -28454, 136902, -5906, 89657, 55298, 30065, 54761, -3758, -8590, - -25770, -16643, 31139, 136902, -88584, -31675, 8590, -1611, -20401, 18790, - 32749, -70867, -23085, 29528, 28454, 41339, -51540, -74088, 35433, 18254, - -13422, -9664, 29528, 24159, -66572, 5369, 19327, 16643, -9127, -5369, - 24159, 11811, -21475, -537, -6979, -24159, - }, - { - -5862631, -3359201, 1529008, -2110440, 231928, 192737, -108985, 88047, -3758, 321586, - 218506, -108448, -503048, 314606, 153545, 25233, 93952, -38118, 279710, -9127, - -61740, -216359, 80531, 231391, 537, 393526, -303332, 416612, -584652, -81068, - 227096, 16643, -114890, 248034, -86436, 188979, -77846, -19864, -62277, -141197, - 34360, 55835, -155693, 172336, -108448, -327491, 7516, 77309, 20401, 0, - -48855, 161598, -127775, 109522, -93416, 1611, 24696, -15032, 100932, 33823, - -58519, 16643, -9664, -98247, 2147, 32212, 16643, 90194, -27917, 537, - 76236, 88047, -47782, -44023, -5369, -16643, -22012, 16106, -13959, -5906, - -11274, 25233, 44560, -23085, -15569, 18254, -33286, 27917, -11811, -34897, - 2147, 24696, 4295, -18790, 19327, 1611, - }, - { - -367220, -1901597, 804770, -175557, 131533, 95026, 125091, -3221, 8590, 259846, - -1611, -57982, -66572, -955093, 81068, 1148367, -1213865, -1089848, 1370095, 527207, - 71941, -717260, -220654, 365072, 84289, -73014, -330176, 384936, -288300, -55835, - 551903, 222801, -114890, 84289, -242666, 75699, -501437, 37581, -248034, -127775, - -77846, 26307, -247497, -56371, 16106, -64961, 136365, 4295, -60130, 49929, - -26307, 119185, -75699, 63888, 63888, 35970, -64425, 103079, 106300, -40265, - -53687, 59593, -2147, -116501, -74088, -10201, 27380, 74088, 8053, -42950, - 104690, 25770, -82141, 17180, -17717, -28991, 4832, -61203, -54224, 22549, - 5369, 66035, 27380, -84826, 9664, -11811, 18790, 15569, -14496, 537, - -22549, -6979, 29528, 2147, -39192, -19864, - }, - { - -6454799, -319438, 623307, 1052804, -348429, 16106, -237834, -45634, 226560, -654446, - 115964, 63888, 33286, 42950, 139050, 658741, 138513, 146029, 263067, 28991, - -406948, -67646, 294205, 73014, -226560, -279173, -35433, -54761, 44023, -107374, - 388158, 425202, 79457, -224949, -213675, 102542, 206695, 178778, -8053, -20401, - -239444, 3758, 64961, 174483, -148713, -240518, -39728, 65498, -28991, -31139, - 123480, -144955, -85362, -118112, 124554, -45634, -19864, 34897, 47782, 15569, - -66035, -51003, 30065, 73551, 20401, 30065, -30602, 49392, -4832, -5906, - 12885, -8053, 55835, -55298, 22549, -14496, -4832, 11274, 18790, 10201, - 16643, 45097, 2684, -75162, -33823, -23085, 6442, -40265, 54761, -6979, - -11811, 1074, -2684, 24696, -8590, -20938, - }, - { - -64961, -1471026, 255551, 434329, 99858, -27380, -154082, -48855, 90731, 115427, - -90194, 88047, 274341, 1305133, 1926830, 852551, 317828, -135828, -537, -534723, - -173409, -239981, -1216013, 1224603, -61740, 346282, 28454, 564788, 272194, 27917, - -85362, 186294, -46708, -392453, -127775, 333934, -294742, -137976, -201327, -388695, - 148713, 99858, -60666, -49929, -216896, -83215, 44560, 19327, -53150, 45634, - -64961, -10201, -63351, 41876, 44023, -61203, -97711, 103616, -21475, -53687, - 32749, 42413, -85899, -46708, -27917, -20401, -71404, -10201, 41876, 61740, - -90194, -33286, 42950, -16106, -32212, -22549, -14496, -13422, 14496, 41876, - -2684, 8053, -18254, 8053, -19864, -2147, 30602, 2684, 2684, 39192, - 5906, 537, -26844, 26307, 5906, -21475, - }, - { - 7013682, 19668802, -2019172, -236223, -361851, 5906, 141197, 199716, -107911, -61203, - -14496, 541703, -149250, 4295, 269509, 368293, -147103, 425202, -464930, -365609, - 219043, 30602, -391916, 22549, 141734, -67646, 169114, 51003, -110595, -6979, - 74088, -124554, -304943, -214212, -377957, 42413, 390842, 304406, 117575, 190052, - -111669, 36507, -17717, 24696, -28991, 21475, -10201, 143881, 33823, -71941, - 61203, 276489, 113280, -125628, -55298, -90731, -34897, -18790, 48318, 81604, - -110595, -27380, 0, -4832, 98247, -10201, -12348, -24696, 20938, -23622, - -5369, 32212, -44560, -69793, 43487, 26307, -100395, 4295, 24696, -17180, - 24159, 27917, -5369, -7516, -5369, -3221, -49929, 1074, 10201, -15569, - 11274, -20938, -22012, -3758, 9127, 9127, - }, - { - -112743, -1967095, 731218, -338766, 114354, 47245, -137976, -233539, 175020, 113280, - 110059, 117575, -47782, 591632, -182536, 2274722, 475668, -419296, -983548, 168577, - 188979, 59593, 435402, 926102, 223338, 654983, -804770, 277562, -378494, 100395, - 555125, -212601, -223875, -2147, -493921, 111669, 290447, -111132, 133681, 23085, - -355409, -28454, 62814, -114890, -58519, 3758, -167504, 79457, 26844, -82141, - 49929, -16643, -57982, -64961, 134218, 59056, -161061, 46708, 12348, 57445, - 46708, 48318, -25233, 60666, -3221, 24159, -66572, -69256, -9127, 41876, - 100395, 4295, -33823, -76236, -45097, 15032, 1611, 31139, 50466, -15032, - 12885, 49929, -19864, -30602, -13959, -25770, -44560, 34360, 29528, -4295, - -34360, 13959, -6442, -13959, -4295, -16106, - }, - { - 392453, 14866492, -1662689, -853088, -135291, -100932, 30602, 272730, -367220, -89657, - -56908, -450435, 95026, 554588, -1203665, -139050, 165893, -12348, 191126, 192200, - -152471, 45097, -173946, -98784, -157840, 34897, 311922, -253403, -140123, 49392, - -16643, 26307, -226560, -75699, 293668, 239981, 198105, -39192, 274878, -242666, - -98784, -223875, 23622, -102005, -170725, -154619, 213138, -64425, -186831, -147103, - 110059, -113817, -115427, 244813, 80531, -134755, 73551, 142808, -53687, 71404, - -23085, -17717, -49929, -41876, 67109, -39192, -12348, 35970, -70330, -22549, - 37044, 10737, -56908, 18254, 0, 33286, -34360, 34360, -13959, 46708, - 9127, -17180, -26844, -2147, -51540, -30065, 3221, -1611, -20401, 9127, - -17180, 43487, -5369, -12348, -26307, 4832, - }, - { - 108985, 1155346, -1316944, 213138, 119722, 90731, -560493, -322123, -326954, 15032, - 357019, -5369, 49392, 90731, -1548336, -15569, 242666, -110595, -574452, 1391569, - -190052, -314606, -242666, -18254, 219043, 160524, 163746, 35970, 4295, 346819, - 123480, -146029, -128849, 45634, -98784, 200790, 117575, -16106, -94489, -106300, - 62814, -105764, -103616, 30065, 73551, -44023, -4295, 5369, 25770, -57982, - -34360, 18254, 62814, 100932, -29528, -35970, -63351, -48855, 103616, 51540, - -51540, 30602, 23085, -8590, -127775, 64425, -13959, -65498, 22012, 24696, - 20938, 17180, -12348, -35433, 21475, 19327, 58519, 20401, -74625, -12348, - 13422, -28454, 42413, 37044, -2684, -29528, 17717, -12348, 48855, -21475, - -20938, 3221, -1611, 19327, -13959, 18790, - }, - { - -740882, 2389076, -198642, 10201, -1388348, 340913, -651224, -35433, 72478, -439160, - 711891, 34360, -352187, 397821, 105227, -361851, 69793, 215285, -417149, 122407, - -316754, 22549, 259846, 63888, -374736, 83752, -333397, 222801, 60130, 105764, - 46171, -78383, 44023, -195958, 91805, 358093, -85899, 127238, 72478, -180389, - -190052, 74088, -44560, -141197, 5906, 45097, -5906, 60666, -75162, -191126, - -62277, 90194, -66035, 71404, -118648, 74625, 93952, 17180, 102542, -66035, - -6442, 82678, 0, -63351, 62814, 38655, -3221, 24696, -9664, -81604, - 41876, -16643, -26307, -1611, 2684, 12885, 0, 13959, 10201, -42413, - -5906, -32749, -12885, 18254, -15032, 52613, -5369, -537, 15569, -49392, - 9664, -30602, 11811, 15569, -11274, 0, - }, - { - 174483, 646393, 784368, -37044, 71941, -35970, 436476, -75699, -324807, -134755, - -121333, -2684, 395137, -937914, -2786897, 672699, 1059246, -64961, 56908, -55298, - 1272921, -417686, -258235, 483721, 960999, -105227, -251256, 557809, 60666, -212601, - 931471, 436476, -63888, -84289, -15032, 295279, -461172, -103616, -128849, -76236, - -85899, 49929, 162135, 129386, -126702, -138513, -91805, -6979, 108985, -31139, - 26844, -48318, 112743, -50466, -66035, 10737, 70867, 59593, -35433, 102005, - -19327, -207769, -35433, -4832, 59593, 13422, 4295, 17717, -27380, 8590, - 12348, 13422, -30065, 2147, -37581, -40265, 52076, 40802, 24696, 18254, - 54761, 15569, -30602, 30065, -11811, 6442, -51540, 17180, 32749, 1074, - 2684, -49929, -18254, 48855, -32212, -13422, - }, - { - 681289, 3221226, -1899449, 1138166, 81604, 322123, -1985349, 122407, -242666, 332323, - -625455, 113817, 117575, -197032, 1468342, 591095, 76773, 419296, -264677, -22012, - -139050, -342524, -97174, -236223, -158377, -367220, -303869, 191126, -463856, 574452, - 76773, 81068, 258235, 191126, -322123, 58519, 145492, -188979, -69256, -155693, - 186294, 32212, 82678, 40802, 104690, 14496, -109522, -330712, -41876, -236223, - 178241, 16643, -60666, 96637, 69793, 34897, 6442, -84289, 20401, -8590, - 68183, -47782, -59593, 48855, 4832, 15569, -49392, 20401, -15032, 20401, - -37581, 41876, -28454, 38118, 12348, 13959, -48318, 27917, 66572, -2147, - -17717, 25770, 45097, -24159, -29528, 40265, -49392, -22549, 28454, 0, - -11811, 38118, -8590, 12348, -14496, 14496, - }, - { - -192200, -193810, -503585, -297427, -282931, 5369, 10201, -118112, -227633, 326418, - 2147, 293132, -52613, 1623498, 1188095, 2830384, 138513, 3758, -996432, 238371, - 517544, -848793, 490163, 564251, -302258, -183610, -482647, -40265, 239981, -79457, - -56371, 339302, 97711, -408559, 41339, -42950, -407485, 259846, -112743, 239444, - 44023, -41876, -41339, 62814, -202400, -143881, -134218, 9664, -57445, -73014, - -36507, 0, -31139, 53687, 54224, 11274, -25770, 68719, -114890, -127775, - 134218, 30602, -59593, -104690, -19864, 30065, 152471, -105764, -17180, 15569, - -7516, -77309, -27380, -9664, -18254, 95563, -9127, -14496, 2684, 10201, - 63351, 1611, 16106, -68719, 537, -6979, -4295, 20938, 12348, -12885, - 4295, 22012, -17180, -18790, 9127, 15032, - }, - }, - { - { - -1995549, 25309168, -5073967, 1267552, 169114, -6979, 155156, 134218, -37044, 15032, - -274341, -362388, 89657, -41339, 1313186, -600222, 132070, -404264, 250182, -332860, - 129923, -54761, -75699, -188979, 130460, 29528, 283468, -364535, 143345, -381178, - -68719, 315143, 41876, -76773, -176094, 86973, -95563, -362925, -81604, -28991, - 302258, 318901, -81604, 28991, -46171, -168577, -84826, 222801, 127238, 99858, - 26307, 16643, -28454, -9664, -15032, 11274, -58519, 56908, 74625, 42413, - -31675, -66035, 16643, 33823, 25233, 42413, 62277, -45097, 20401, -2684, - 41339, -2147, -2147, -7516, -13422, 88047, 18790, -53687, 89121, -23622, - -13422, -30065, -12348, -34897, 3221, 43487, -60666, 32749, 7516, -15032, - -8590, 12348, -14496, 6442, 15569, 2684, - }, - { - -127238, 1480690, 957778, 352187, -84826, -70330, 48855, -74088, -273267, 193810, - 70867, 244813, -336618, -251256, 1438277, 93416, 307627, -512175, -1245004, -88584, - -176631, -471373, 865973, 105227, -836982, -576063, 270583, -568009, 143345, 198105, - 191663, 724239, -117038, -241592, 121333, -13959, 130997, -476741, -160524, 329102, - 125091, 89121, -218506, -105764, -82678, 27380, -1611, -12885, 184147, -55298, - -77846, -18254, -35433, -115964, -170188, 69256, 145492, 15032, 32749, 86973, - -75699, -91268, -25233, 26844, 62814, 18790, 54761, -49929, -62277, 4832, - 15032, -36507, 4295, 58519, 5906, -32212, 31139, 26307, 18790, -22012, - -44560, 29528, 36507, -2684, 23622, -18790, -19327, -3758, 14496, -52076, - 20401, 35970, 7516, -26307, -28454, 537, - }, - { - -365072, 7806103, 3410741, -268972, -1649268, -426812, -375810, -70867, 61740, 172872, - 40265, 27917, 44560, 81068, -334471, 415538, 132607, -86436, -701153, 853088, - 120796, 879931, 228707, 54761, 119185, -271657, 217433, -550830, 368830, 120259, - -296890, 415538, -341987, 19864, -51540, 193274, -100395, -178241, 107374, -266288, - 10737, -142808, 325881, -189515, 173946, -167504, 126702, 37581, 18790, -155156, - 3758, 44560, -20401, -5369, -15569, -76773, 75162, -68183, -71941, 5906, - 63888, -111132, -16106, -14496, 73014, -41876, -73551, -15569, 58519, -23085, - 24696, 42950, -13959, -25770, -11274, 1074, 33286, -15569, -28454, 22012, - 1074, 12348, -30065, 47782, 20938, -19327, -11274, -34897, 24696, -17717, - -11811, 11811, 9664, 1074, 14496, 22012, - }, - { - 6416145, 10945724, -792958, -2652142, -174483, 54224, -499290, 139586, -198105, 10201, - 376347, 116501, -532576, -250182, -388695, 41339, 118112, -372588, 9664, 225486, - 23085, -12348, -130460, -31675, 24159, 312996, 323196, 409096, -15569, -59593, - -190052, 31675, -171799, -98247, -185220, 62277, 129923, -357556, -45634, -271657, - -94489, 155693, -129386, 36507, 120259, -55835, -177704, 59056, 0, 173409, - -66572, 49929, 15032, 57982, -39728, -6979, 42413, 30602, -53687, 55298, - 12348, 21475, -85362, 28991, -100395, -59056, 34897, -81068, 49929, -19327, - -30602, -15569, 68183, 12885, 15569, 31675, -30602, -6442, -15569, 15032, - -36507, -15032, -36507, 6979, -16106, 13959, 4295, -36507, 38655, 11811, - -5906, -20938, 16643, 4295, -11274, -17180, - }, - { - 228170, -4134980, -769873, 279173, -260919, 42950, 175020, -34897, 38655, 258235, - 6442, 103079, 219043, -74088, 1950452, 1478543, 115964, 642635, -3660923, -381178, - -105764, -164819, -205085, -593242, 263604, 295816, 1599339, 431107, -756988, -776315, - -226023, -126702, 141197, 49392, -41876, -123480, -141197, 327491, -36507, 219043, - -139586, 198642, -169651, -83752, 177704, 64961, 58519, 176094, -103079, -34897, - -186294, 115427, 162135, -74625, -35970, 32212, -20401, -6979, 47245, 59056, - -35433, 21475, 34897, -23085, 25233, -66035, -44023, -10201, 9127, -17180, - -39192, 20938, -34897, 4832, -15032, 33823, -11811, 6442, 5369, -54224, - -10201, -33286, 36507, 33286, -52076, 18254, -18790, -8590, 26844, 537, - 1611, -6979, -23085, -1611, 26307, -7516, - }, - { - 6360847, 15802795, 107911, 2433099, 941135, 28454, 440234, -794569, 481036, 631360, - -518617, -317828, 60130, 263604, 394063, 419833, -37044, 251792, -87510, 307627, - -19327, -448824, -203474, -55298, 42413, -211527, 163746, 36507, 334471, -108985, - -157840, 69793, 258235, 77309, -206695, 158377, -18254, -88047, -52076, -129923, - -259309, -151398, 97174, -34360, -209380, -128849, -116501, 65498, 17180, -31139, - -81604, 170725, 85899, -85899, -133144, 123480, 65498, -80531, -107374, 24159, - 23085, 37581, -10201, -73551, -78383, 67646, 1611, -14496, 26844, 10737, - -8053, -10737, -7516, 20401, -8053, 40265, -24696, -43487, -2147, 17717, - -19864, 13959, 24696, 39728, 537, -23622, -25233, 10201, -48318, 25233, - -5906, -5906, -8590, -13959, 31139, -6979, - }, - { - 252329, 417149, -508417, 205085, -38655, 27380, 70330, 162135, -67646, 114890, - 62277, -5906, -246424, 410706, 1437740, -1653562, -570157, 422517, 568546, -136902, - 306016, -424665, -1247688, 1047972, 32749, 335544, 401043, -341450, 253403, -122943, - -38655, 301721, 103079, 242129, -245887, 32212, -144418, 130997, -67646, -107911, - -125091, -226023, 153545, -26307, 128849, -30602, -153545, -12348, -12885, 11811, - 42413, 37044, -97711, -74088, -4832, -4295, -2147, -46708, 20938, 20938, - 20401, -11274, 28991, 57982, -2684, 3221, 15569, -29528, -58519, 9127, - 66035, 46171, -16643, -23085, 9127, -56371, 13422, -23085, -26844, -19864, - 33823, -4832, -9664, 8053, 3221, 1074, -29528, 38118, -10737, -9127, - 24696, 31675, 15569, -18254, 5369, 2147, - }, - { - -8404177, 340376, 2654290, 338766, -265214, 29528, -293668, 441308, 16643, 55835, - -435402, -412317, 345745, 516470, -156766, 284542, -319438, -70330, 708670, 101469, - -355409, 477815, 210990, -75699, -114890, 190589, -25770, -52613, -277025, 102005, - 268972, -12885, 56908, 83752, -98784, -104690, -195421, 38655, -184147, -70867, - -95563, 97711, -13422, -198105, 235149, -208843, -273804, -16106, 160524, -103616, - -32749, -129923, 37581, 199716, -38118, 17180, -23085, -33286, -47782, 30602, - -31675, 91268, 57445, -73014, -7516, 35970, 18790, 3758, -13422, 33286, - 38118, -3221, 11811, -5369, -78383, -31675, 82678, -90194, -35970, 19327, - -37044, -15569, 16106, -6442, -6442, 15569, 18790, -24696, 10737, -26844, - 2147, 11811, -9127, -3221, -17717, 0, - }, - { - 454193, -96637, -1671279, -207232, -218506, 51540, 54224, 69256, -158377, -124554, - 2147, -5369, -400506, -285078, -824097, 1985886, -2044404, -217433, 329102, 216896, - -402653, 624918, -969052, 656593, -540092, 508954, 747861, -442382, 196495, 390842, - -331786, 193274, -347892, 414464, 260382, -113817, 247497, 97711, -223875, 208306, - -227096, -269509, 168577, -43487, -204548, -178241, -18790, -17717, -13422, -165893, - -3758, -37044, 106837, -49392, -42950, 30065, 96637, 34360, -64961, 42950, - -60666, -4832, 43487, -22012, 26307, 127238, 40265, 85362, 0, -15032, - 23085, -15569, 68719, 89121, -57445, -13422, 8053, 42413, -22549, -3221, - -57982, 2147, 64425, 13422, 24159, 10201, -13959, -36507, -18254, 8590, - 2684, -11811, 2147, 5906, 1074, 8053, - }, - { - -763967, 10313827, -874026, -59593, 173946, -647466, 238908, 185220, -85899, 100932, - -238371, -274878, -284005, -18254, 126165, 93416, 261456, -172336, -328565, 135291, - 366146, -132070, -79457, 81068, 96100, -67646, 117038, -172336, -168577, -39192, - 158914, -2684, -30065, 66572, -78383, 24159, 133144, -61740, -20401, -42413, - 18790, -59056, -114354, -26307, 205622, -260382, 6442, -31675, -19864, -106300, - -162672, -24159, -89657, -150861, 76236, 15032, -18254, -34360, -21475, -69256, - 127775, -18790, -34360, -7516, -15569, 38118, -38118, 21475, 33823, -43487, - -9127, -18254, 22549, -42950, 4832, -1074, 22549, -47245, 48318, -27917, - 6442, 40265, 31139, -35433, 20401, -5906, -52076, -15569, -1074, -43487, - 3758, -21475, 18254, 16106, 19327, -18790, - }, - { - -201863, -142808, -1137093, 53687, -27380, -112206, -1083942, -135291, 78383, 81604, - -28991, -600222, 679142, 308701, -495532, 6979, -263604, 641561, -193810, -656593, - -216896, 451508, -417686, -762357, -555125, 626528, -254477, -369367, -377957, 49929, - 282931, 150324, 95563, 51003, 233539, -299037, 47245, 85899, 35433, 76236, - 108448, 121333, -110059, -82678, -33286, 10737, -12885, 76773, 27380, -71404, - -55835, -148176, -77846, 97711, 124554, 5369, 27380, -17180, -13422, 24159, - 28454, -87510, 5369, 70330, 25233, -17180, 74088, -5906, -61740, 4832, - -34897, 26844, 31675, 2684, -34897, -23085, -4832, 12885, 69256, -37044, - 10737, 23085, -44023, -26844, 25233, 10737, 0, 13422, -18790, 43487, - 1074, -11274, 15569, 1074, 4832, -35433, - }, - { - -772020, 1961726, 507343, 602906, -301185, 158377, 645319, 216359, -179852, -224412, - -3221, 508417, -179315, 388695, 379031, -106300, 181999, 21475, -9664, -340913, - 190052, -141197, -109522, -169651, 74625, 96637, -6979, -226023, 146029, -456340, - 113817, -6442, -21475, 67109, -341450, 88584, -212601, 169114, 491237, -35433, - 6979, -76236, 67109, -133144, 159988, -74088, 11274, 206695, -7516, -30602, - 71941, -33286, 115964, -16643, -40265, -19864, 34897, 15032, -8053, 95563, - -46708, 0, 66035, 22012, -103079, -9127, 20401, -10737, 75699, 13959, - -70867, 28454, 5369, -2147, -18254, -33286, -5906, -1611, 19864, 18790, - 24696, 15032, -64425, -3758, 4832, -50466, 40802, -537, 17180, 12348, - -10737, 5369, -33286, -25233, 14496, -3758, - }, - { - -140123, 762894, 433792, 207232, 150861, 139586, -241592, 241055, 133144, 253940, - -27380, -505196, 1036161, 409633, 452045, -128312, 609349, 375273, -296890, 592169, - -621697, 997506, 614180, -154082, 435939, -86436, -188442, 871878, -191126, 437013, - 194884, 326954, -199716, 87510, -52613, 117575, 163746, -314069, 193274, -100395, - 46171, 45634, 59593, -16106, 136902, 27380, -61740, -97174, 85899, 33823, - -9664, -45097, -91268, 18254, 113280, 28991, -204011, 81068, -146029, -21475, - 119185, 85362, -118648, -96637, -71941, 128849, -64961, -38118, 60666, -23622, - -10201, 16643, 3758, -12885, 48318, -30065, -24159, -25770, -10201, -11811, - -17180, 42950, 9664, 20938, 5369, -5906, 32749, -42413, 11811, -12348, - 14496, 45097, -41876, -34897, 36507, -17180, - }, - { - -564251, 1533840, -1431835, 1286880, -90731, 1714229, -800475, 366683, 285615, -134755, - -273267, 127775, -558346, -101469, 948651, -520228, 156229, 350040, 188442, -80531, - -81068, 161061, -292595, 303869, -184684, 137976, -52613, 339839, -139050, -142271, - 62277, -169651, -79994, 169651, -72478, -78920, 77846, 20938, -70330, -7516, - -34897, 113280, 19864, -40802, 52613, 60666, 261456, 82141, 11811, -27917, - -71404, 103079, 13959, -52076, -22012, 16106, 115964, 38118, -19327, 21475, - 6442, 5906, -48855, -2147, 81068, 19327, 90194, -5906, 12348, -18254, - 24696, -5906, -5906, -34360, 3221, 23085, 57445, -42950, -20401, 24696, - 35433, -10737, 15032, 44023, -3221, 10737, 53687, -25233, -40802, 9127, - 21475, -13422, 11811, 12348, 15032, -18790, - }, - { - 54224, 108985, 755914, 423591, -169114, -81068, -241592, -159988, -248571, -56908, - -171799, 79994, 416612, 3907883, -4510253, -1826972, 35970, 37581, -1030255, -29528, - 326954, -842350, 90194, 766652, -592169, 202937, -27917, -116501, -53687, -113280, - 64961, 182536, 224412, -187368, -156229, 277025, -264141, -184147, -124554, 134755, - 153008, -42950, -345208, -186831, 222801, -64961, -44560, 237297, 81604, -148713, - -63888, 7516, -62277, -74625, 20938, 139050, -537, -85899, 81604, -66572, - -146029, -81068, 53687, -47245, -3758, -89657, -537, 180926, -96637, 14496, - -1074, 60666, -37044, -49929, 10737, -70867, 56371, 26307, -23085, -33286, - -20938, 29528, 26307, 68719, -44023, 9664, 10201, -25770, -3221, 32749, - -4295, 2147, 27380, -11811, -22549, 10737, - }, - }, - { - { - 2965138, 14825690, 2505577, 1581085, -605590, -73014, 354335, -175020, 53687, 248034, - -88047, -294742, -38655, 79457, 651761, -96100, -565325, -95026, -114890, -91805, - -45097, 92879, -253940, -74088, 102005, 59593, 213138, -134218, 61740, 145492, - -206158, 280247, -143345, 1611, -242666, 186831, -136365, -220654, -55298, -119722, - 108448, 341450, 78383, -15032, -48855, 10737, -113280, 169651, 62277, 156766, - 18254, 72478, 26844, -52076, -57982, -48318, -68183, 12885, -15569, 113280, - -31675, -93416, -60130, 86436, 48855, 24159, 62814, -10737, -2147, 12348, - -25233, 43487, 15569, -25233, -30602, 44023, 47245, -32749, 63351, 35433, - 9664, 13959, -31139, -9127, -33823, 49392, -12348, 25770, 18254, 8053, - -10201, 14496, -11274, -5369, 10737, 4295, - }, - { - 188442, 3919158, -1459215, 561567, -162135, 37581, -391916, 250719, -89121, 17717, - 116501, 181462, -577673, 318364, 1016834, -241592, -325881, 60130, -2008971, -590558, - 223875, -688805, 738198, 517544, -519691, -624918, 435402, -512175, 65498, -73551, - 369367, 792421, -215285, -13422, 75162, -29528, 139586, -195958, -171262, -17717, - 246424, 250182, -47245, -172336, -93416, -41339, 60666, -4832, 2684, 72478, - -110595, 33286, 41339, -41339, -235149, -48318, 147103, 32212, 9664, 5369, - 6979, -2684, -35433, 6442, 43487, -19864, 119722, 7516, -50466, -8590, - 23622, -70330, -11274, 22549, 39192, -38655, -24696, 23622, 20938, 10201, - -43487, 15569, 35970, -7516, 29528, 16106, -11811, 4832, 40265, -38655, - -537, 26844, 20938, -8053, -16106, -11811, - }, - { - -103616, 10422812, 401043, -819802, -762894, -540092, -211527, -120796, -106837, -21475, - 282931, -63351, 116501, 476741, -399432, -50466, 263604, -11274, -762357, 388158, - 210990, 603443, 59056, 117575, 151398, -11811, 150861, -158914, 209917, -181462, - -31675, 234076, 537, -61740, 11274, 147640, -29528, -134218, -19864, -153008, - -172336, 90194, 144418, -5369, 149250, -4295, 104690, 78920, 19327, -46171, - -96637, 82141, -5369, 31675, -40265, -76773, 24696, -49929, -61740, -32212, - 37581, -19327, 2147, -62277, 41339, 35433, -69256, 23085, 35433, -16643, - -20401, 54761, 34897, -16106, -38118, -51003, 29528, 44023, -31139, -8053, - -2684, 15569, -16106, -1611, 45097, -10201, -14496, -20938, -1074, -8590, - -13422, -8590, 15569, 5906, 2147, 28991, - }, - { - -4252018, 25422448, -1135482, -2385318, 12348, -5369, -265751, 66572, -69793, 154082, - -241592, 25233, 31139, -838056, -160524, -460635, 239444, -484794, -158914, 186294, - 58519, 12885, 38118, -89657, -2147, 47782, 452582, 272194, 203474, 32212, - -125628, 24696, 6442, -199716, -258235, 145492, 158377, -258235, -23622, -373125, - -43487, -100932, 129386, -58519, 61203, 31139, -87510, 89657, -74625, 169114, - 70867, -82141, 91805, 23085, -40802, -15032, 4832, 64961, -51540, -15032, - 33823, 56371, -59593, 97711, -60666, -59593, 22549, -78920, 17180, 2684, - -23085, -70330, 17180, 41339, -6442, 21475, 4295, -14496, 1074, 18254, - 6442, -13959, -33286, 10737, -17717, -5906, 22549, -26307, 7516, 23622, - 5369, -19327, 2147, 13422, -12348, -8053, - }, - { - -312459, -5055177, 368830, 108448, -153008, 7516, 157840, 180926, -157303, 194347, - 170188, -75699, 274878, -517544, 3732864, -612570, 594316, 688805, -1137093, -1339493, - -349503, -233002, 93952, -888521, 682363, -118112, 648003, 164819, -124554, -878858, - -254477, -24696, 57445, 112743, 78920, -34897, -77309, 223338, 17180, 347892, - -32749, 48318, 2684, -44023, 161598, 76773, 70330, 84826, -46708, -68183, - -12348, -42413, 157303, -91268, -44023, -22012, 7516, 32212, -53150, 38118, - 49929, 2684, 3221, 29528, 71404, -36507, -10201, -30065, 8053, 19327, - -79457, -33823, 21475, -11811, -30602, 42413, 3221, 35433, 41876, -27380, - 13422, -48855, -25770, 66035, -34897, 6442, -18254, -18790, 22012, 9664, - 7516, 2684, -26844, -12348, 31139, 6979, - }, - { - -3065533, 30309048, -665720, 2697240, 14496, 28991, 324807, -354872, 123480, 849330, - -309775, -355409, -117575, -125091, 766115, 177704, 125628, 207232, -119722, 233539, - 206695, -17717, -640487, -183610, 222265, -68183, 50466, 37581, 40802, 183610, - -163209, -149787, 184684, 339839, -158377, 110059, 38655, -241592, 34897, -73551, - -210453, -9664, -13422, -206695, -229781, 52076, -198105, -35970, 7516, 99321, - -164283, 95563, 169114, -21475, -79994, 47782, 146029, -25233, -51003, -24696, - -34897, 91805, 7516, -45634, -94489, 7516, 29528, -10201, 30065, -13959, - -13422, 17180, -34360, 35433, -14496, 15569, 8053, -17180, -17180, -9127, - -19864, -33286, 5369, 39192, 9664, 12885, -16106, 31139, -42950, -537, - 8053, -8590, 2684, -26307, 15032, 8590, - }, - { - 137439, 1209570, 194884, -412317, -53150, 45634, 122407, 218506, -67109, -40802, - 17180, 44560, -404264, -353798, 1185948, -1716376, -617402, -144955, 405338, 317828, - 126165, 42950, -2012192, 311922, 402116, 369904, 702764, -222265, -61740, 272730, - -223338, 120796, 137439, 341450, -537, -170725, -64961, 235149, 8590, 116501, - -124554, -235686, 98247, -55835, 176631, 62277, -74625, 3221, -45634, -33823, - 4832, 60130, -51003, -59593, -27917, 28991, 77846, -106837, 19327, 49392, - -11811, -75699, 52076, 30065, 13959, 15569, -10201, 37581, -57445, -35970, - 45097, 64961, 1074, -22012, 57982, 6442, 17717, 12348, -5369, -30602, - 18790, 2684, 11274, -13422, 11274, 2147, -32212, 1611, -12885, -37581, - -9664, 7516, 26307, -22012, -8590, 16106, - }, - { - 6863895, -18351858, 137439, 296353, -56908, -8590, -325881, 115427, 59593, 146029, - -237834, -475668, -1611, 428423, 350040, -73014, 14496, -491774, 425739, 497679, - -235686, 205622, 336081, 54224, -146566, 115964, -82678, 102005, -474057, 119722, - 347892, -61740, 141734, 38655, -34897, 31675, -190052, -163209, -13959, -133681, - -114890, 63351, 24159, -259846, 48318, -220654, -224949, -56908, -32212, 74625, - -4295, -224949, -119185, 162135, -7516, 88047, 84826, -6442, -68719, -45634, - -41876, 72478, 42413, -25233, -34360, 16106, 19327, 17717, -24159, 34360, - 33286, -5906, 24696, 66572, -56371, -55835, 88047, -38118, -26844, -2147, - -4832, -37581, -537, -1074, -8590, 11811, 39192, -6979, 1074, -3758, - 1074, 6979, 10201, 3758, -8053, -10201, - }, - { - 146029, 1570884, -1810866, 213138, -183073, -59593, 67646, 131533, -106300, -133144, - -52076, -304406, -253940, 285615, -2074469, -900333, 478889, -939524, 368293, -111669, - -252866, 492848, -869194, 944356, -402116, 371515, 308164, 76773, 159451, 133681, - -428960, 82141, 83752, 35970, 380641, -86436, 230318, 132070, -149250, 104153, - -6442, -219580, 42413, 159451, -95563, -42950, 33286, -133681, -60130, -134755, - -63351, 3221, 79457, -9664, -19864, 37044, 133681, 64961, -3221, 8590, - -56908, -82141, 35970, -91268, 18790, 55298, 23622, 57982, 13959, -18254, - -35970, -30065, 39192, 94489, -5906, -22012, 6979, 32749, -20401, -6979, - -32749, -41339, 38118, 22549, 22549, 20401, 25770, -8590, -37044, 1611, - 28991, -13959, -2684, 6442, -1074, 23622, - }, - { - 695785, 5738613, 2564096, -289910, -197032, 404264, -35970, -270046, 64961, 165893, - -146566, 22012, -137976, -525060, 616328, -308701, 124554, 12885, -122943, -33823, - 525597, -270583, 24696, -149250, 352724, 4832, -51540, -66572, -63351, -181462, - 265751, 176094, -39728, 95026, 111132, -139586, -30065, 51540, -180926, 61740, - 55835, 89121, -113280, -92342, 112743, -62814, -107374, -537, 114354, -42413, - -180389, 71941, 42413, -157840, -20938, 32212, 537, -68719, 5369, -89121, - 38655, 2684, 12885, 16106, -41876, 32212, -2147, 2147, 56908, -14496, - -33823, -14496, 53150, -52613, 15032, -13422, 46708, -45634, 19864, -34360, - -8590, 19327, 37044, -12348, 45634, 37581, -20401, -5906, 6979, -21475, - 12885, -35433, 0, 20401, 27917, 1611, - }, - { - 155693, -1011465, -509491, -384400, 322659, -113280, -359704, -330712, 211527, -16106, - 27917, -108448, 319438, 41339, 82141, -146566, -439697, 234076, 173409, -865973, - -589484, 394063, -689342, -125091, -567473, 356482, -164283, -267362, -595390, -14496, - 42950, 166430, 127238, 36507, 295279, -358093, -59593, -33823, 105227, 71404, - 91268, 8053, 16643, -39728, -41339, 62277, 24159, 4832, 113817, 24696, - 5369, -136902, -108448, -46708, 75162, 23085, 28454, 39192, -36507, 16106, - 54761, -57982, -13422, 40265, 117038, -34897, 42950, 62814, -21475, -20938, - -27917, -4832, 13959, 12885, -35433, -34360, -43487, -30065, 63351, -5906, - 4832, 26844, -35970, -48855, -7516, 20401, -18790, 1074, -48318, 25770, - 10201, -9664, 8590, -3221, 17717, -22549, - }, - { - 1660542, -3008625, 2036888, -138513, 245350, 275952, 202400, 281857, -393526, 231928, - -300648, -74088, 351114, 183610, 232465, -114890, 3758, -120259, 249108, -366683, - 384400, -18790, -401579, -11274, 215285, 13959, -33286, -196495, 42413, -239981, - -116501, 98247, -122943, 34360, -201863, -179852, -276489, 12885, 310311, -15569, - 144955, -52076, -107374, -32212, 122407, 37581, -15569, 89657, 54761, -3758, - 184684, -24696, 107374, -39192, -38118, -70867, 10737, 53150, -79457, 65498, - 43487, -24159, 7516, 48318, -64961, -33823, 13959, -31675, 24696, 56371, - -41876, 13422, 27380, 2147, 7516, -26307, -25233, -15569, -3221, 28991, - 11811, 39192, -35433, -4295, 19327, -63888, 25233, 4295, 6442, 44560, - -2684, 26844, -15032, -22549, 5906, 3758, - }, - { - 88047, 1545115, -596464, 175557, 26307, 191663, -343597, -32212, 292595, 388695, - 38118, -365609, -96100, 1335198, 853088, 857383, 164283, 170188, -345208, 781147, - -1128503, 565862, 1339493, 193810, -476741, 214212, -95563, 942208, -124554, 718333, - -249108, 70330, -145492, 86973, -15032, -141197, 114354, -83752, 148713, 2684, - 32212, 124554, -4832, -19864, 180926, 16106, 10737, 18254, 45634, 24159, - -30602, 62277, -35970, -37044, 154082, 103616, -161598, -537, -69793, -77309, - 13422, 108985, -26307, -83752, -83752, 62814, -18790, -60130, 44023, 27380, - -23085, -11274, 11274, -11811, 62814, 35970, -9664, -22549, -24696, -17180, - -33286, 1074, 8053, -13422, 5369, -19327, 56371, -34360, -17180, 3221, - 0, 46708, 8590, -45634, 25233, 19864, - }, - { - 53687, 640487, -737124, -239981, -1611, 503048, 805306, -128312, 652835, 29528, - -49929, -158377, -365072, 964220, -668404, -581431, -93416, -320512, 337692, -115427, - -94489, 283468, -128849, 386010, -139050, 71941, 10201, 304943, 200253, -268435, - 60130, -202937, -142808, -92879, 89657, -226023, -65498, 88047, -79457, 46708, - -92879, 79994, 114354, -63888, -25233, 36507, 114890, 134218, 20938, 49392, - -115964, -35433, 141734, -23085, -84826, -26844, 52076, 54224, -16643, -3221, - -4832, 28454, -14496, -73551, 49392, -20938, 76773, 0, 30602, -38118, - 46171, -8053, 5906, -23085, -3758, -5369, 63888, -24159, -68183, -11811, - 31139, -6442, -21475, 12348, 5369, -26307, 46171, 22549, -28991, -1611, - 21475, -32212, 1611, -3758, 19327, -8590, - }, - { - -180926, 63888, 661425, 398895, 14496, -93416, -317291, 95026, -303869, -87510, - -77846, -111669, 160524, -144418, 530965, -906775, -623307, 5906, -386547, -412317, - 216896, -62277, -537945, 755914, -10201, -214748, 647466, -661962, -261993, 84826, - 6442, 228707, 253403, -13959, -196495, 155693, 33823, -265751, -154619, 21475, - 101469, 121333, -195421, -74088, 84826, 69793, -39728, 233002, 85899, -76236, - -73014, -44560, 44023, -43487, -36507, 35970, 40802, -68183, 117575, 117575, - -84826, -117038, 93416, 6442, 38118, -90194, -85899, 146566, -38118, 19864, - -18790, 72478, 33286, -11274, 46171, -74625, 28991, 46708, 7516, -20938, - -61203, 4832, -20938, 60666, -7516, 2147, 10737, -25770, -6979, 17180, - 0, -17717, 20938, 11274, -11274, -8053, - }, - }, - { - { - -3539590, -1454383, 1249299, 2408403, 357556, -194884, -104153, -29528, -10201, -302795, - 179852, 394600, -77309, -622233, -784905, 578210, -193274, 50466, -42413, 784368, - -192200, 39728, -18790, 37044, -87510, 40265, -282394, -274878, -48855, 346819, - 13422, 44023, -221728, -131533, -13959, -137439, -75699, -222801, 6979, 33286, - -129386, 30602, 65498, -40265, -108448, 102542, 49929, 11274, -115427, 54224, - 35970, -7516, -19864, 2147, -63351, -38655, -63888, -35433, -109522, -22012, - 85899, 16643, -5906, -19864, 24696, -38118, -10201, 99321, -31139, 9664, - -53150, -7516, 6442, 40265, 18790, -43487, -20401, 31139, -63351, 38655, - 537, 52613, 4832, 16643, -1611, -57982, 53687, -17180, 9127, 21475, - 16643, -8590, 19327, -8590, -6442, -3758, - }, - { - -149250, 4440460, -423054, -142808, 310848, 178778, -336618, 119722, 215822, -183610, - 73014, 34897, -308164, -379031, 180389, 1119913, 266288, 1093606, -105227, -592706, - -106837, -833761, -357019, -23622, 442919, 491774, 562104, 102542, 309775, -155156, - 146029, 174483, -252329, 467615, 93416, 214748, -42413, -16643, 131533, -64961, - -121870, 78920, 114890, 99321, -205622, 21475, 47782, -24159, -155156, 99321, - 15569, -60666, 28454, 64961, 90194, -181462, -5906, -23622, -14496, -135291, - 6442, 70867, 73551, -25770, -40265, -16106, -27917, 90731, 39192, -24696, - -12348, 48318, -16643, -76773, 8590, 71941, -26844, -18790, -48855, 28454, - 37581, -24159, -33286, 11274, -8053, 7516, 25770, 19327, -12885, 48855, - -16643, -30602, -11811, 17717, 27917, -2147, - }, - { - 254477, 11651173, -591095, -1414655, 882616, 51540, 99321, 25770, -41876, -330712, - 210990, 176094, 19864, -99321, -302795, -516470, 402116, -68183, 467615, 128849, - -416075, -230854, -34360, -178241, -172336, -103616, 279173, 229781, 77309, -116501, - 361851, -308701, 177167, 378494, 309238, -259846, 10737, -8590, 128849, 19864, - 27380, -35433, -199179, 127775, -18790, 119722, -10201, -19327, 89121, 109522, - -254477, 30602, 44560, -100395, -12348, 77846, 37044, 72478, 18790, 10737, - -68719, 61740, 41339, 53687, -92879, 60130, 19327, 40802, -37044, 44560, - 537, -51540, 23085, 34360, -8053, 24696, -40265, -12348, 49392, -20938, - -23622, -11811, 38118, -14496, -24159, 10737, 9664, 38118, -28991, 4832, - 18790, -14496, -16643, 6442, -16106, -12885, - }, - { - 32749, 32927366, -282394, -2457258, 111132, 141734, 152471, -48318, 118112, 447213, - -562104, -387084, 162135, -466004, 317291, -747324, 31139, -35970, 51003, -104153, - -144418, -238371, 235686, 170725, 91268, 247497, -374199, 10737, -86973, 177167, - 317828, 114890, 60130, 154619, -88584, 353261, -56371, 24159, -138513, -221191, - 298500, -286689, 44560, 111669, -69793, -87510, 178778, 161061, 12348, 23622, - 26307, 34360, -20401, 88047, -7516, 38655, -23622, 13422, 61740, -104690, - -53150, 74625, 64425, 3758, 38118, 9127, -40265, 62814, -61203, 23622, - 62277, 29528, -92342, -3758, -7516, -5369, 25233, 7516, -9664, -28454, - 29528, 14496, 38655, -15032, -8590, 8590, -16106, 39192, -38118, -26307, - 5369, 19327, -6979, -6979, 15032, 10737, - }, - { - 257698, -4125316, -170188, -406411, 242666, -30065, -156229, 88047, -181999, 83215, - 52076, -11811, 383863, -499827, 4559645, -33286, -1282585, -2118493, 3093450, -405338, - -192200, -680752, 420907, 42413, 111669, -722091, -1163399, -405874, 998580, 95026, - -268435, 271120, -186831, 172336, -263604, 11811, -75162, 13959, -32749, 142271, - -44023, -111132, 115427, 38118, -47245, -103616, -33823, -78920, 49929, -185757, - 84289, -31139, -84826, 47782, 0, 3221, -31675, 70867, -17717, -64425, - 37581, 44560, -43487, -56908, 27380, 53150, 54761, 35970, -8590, 6979, - 88584, 2684, 13959, 24159, -22549, -37581, 15032, -14496, -2147, 37581, - 15032, 46708, -27917, -33286, 39192, -24159, 8590, 11811, -16106, 5906, - -13959, 5369, 23085, -1074, -25233, -3221, - }, - { - -2416993, 34308736, 918586, 2543158, -642098, 2147, -207232, 519154, -246961, -396748, - 471910, 220654, -156229, -532039, 406411, 130460, -44023, -146029, -26307, -68183, - -61203, 543850, -71404, -189515, -79994, -4832, 3221, 216896, -464393, 0, - 156766, 120796, 64961, 144418, -45097, -75162, 9664, -188979, -25233, 15569, - -110059, 353798, -172336, -114890, 1074, 127238, -2684, -107374, -192737, 6979, - 41876, -166967, 41339, -33286, 169114, -94489, 56371, 60666, 79994, -23085, - -96100, -10201, 0, 63888, 31139, -19864, -12885, 41876, 10201, -11811, - -6979, 2147, 15569, -20401, 18254, -66035, 20938, 39192, -5369, -13959, - 32212, -537, -18790, -56371, -11274, 10201, 26307, -4295, 59593, -40265, - 6442, 3221, 13959, 8053, -29528, -4295, - }, - { - -288837, -4832, 1939715, -95026, 3221, -46708, -53150, -28991, -24159, -5906, - -71941, 154619, 85362, -272194, 1178432, -30602, -128312, -119185, -79994, -347892, - -351650, 45097, -2529199, -116501, 45634, 605054, -360240, 93416, -282394, 221728, - -248571, 158914, 214748, -234613, 262530, 174483, -53150, 232465, 116501, -34360, - 209917, 38655, -125628, -16643, -81604, 11274, 108448, 75162, -41339, 46171, - -78920, -26307, -40265, 23622, -4295, -23622, -9664, 60130, -4295, -20401, - -25770, -29528, -30065, -42413, 0, -13422, -127238, 59593, 74625, 22549, - -87510, -23622, 49929, -18254, 16106, 42950, -19864, 24159, 36507, 24696, - -17717, 8053, 0, -4295, -8053, 3221, 31139, -31139, 6979, 7516, - -30065, -28454, -22012, 14496, -13959, -3221, - }, - { - -3602404, -30939870, -1835025, -336081, 107911, 125628, 363462, -115964, -59056, 12348, - 9127, 449898, -434865, -105764, 762357, -79994, 219580, 207769, -556735, -73014, - 202400, -200253, -22012, 400506, 87510, -277025, -192737, 97174, -442919, -276489, - 88047, -141734, -41876, 16643, -211527, -13422, -98247, -318901, 177704, 53150, - -148176, -3758, -16643, -140660, -216896, 118112, 17717, 69256, -339839, 32749, - 47782, 97711, -42950, -127775, -30602, -3758, 105227, 58519, 32212, 31139, - -37044, -62814, -40802, 63888, 46708, -40265, -12348, -15032, 13422, -18254, - -24159, 33286, -40802, 1074, 82141, 23622, -69256, 57982, 28991, -45097, - 45097, 0, -14496, 0, 9664, 4832, -20938, 16643, -1611, 24159, - 14496, -26307, 3758, 4832, 17717, -2147, - }, - { - -431107, 299574, 884226, 116501, 142808, -27380, -60130, -178241, 102542, 20938, - 77846, -93416, 83752, -598611, -1467805, -1195612, 322123, -1343251, -365609, -39728, - -69256, -614180, -601295, 525597, -282931, 557272, -226023, 1066763, -13959, 28991, - 29528, -472446, 310848, -161598, -19327, 58519, 41876, -259846, 154082, 41876, - 20401, 183073, -28991, 57982, -61740, 72478, -37581, -14496, 56371, 61203, - -12348, -40802, -93416, 8053, 113817, 41339, -69256, 44023, 53150, 41339, - 28454, -38655, 1611, 22549, -25233, -31139, -26307, -36507, 52613, 22549, - -1611, 8590, -49929, -58519, 52076, 53687, 22012, -16106, 27380, -27380, - 38655, 5369, -62277, -26844, -3758, -9664, -8590, 49929, -1074, -5369, - -2684, 13422, -4295, -6442, -2147, -3758, - }, - { - -830002, 2627446, -114354, -570157, -66572, 907312, -256624, -215285, -409633, -213675, - 164819, 59593, 346282, -31139, -55298, -119185, -307090, -8053, 256624, -70330, - -18254, -246961, -40802, -273804, 15032, 39192, 34360, -230318, 37581, -59593, - 124017, 197569, -291521, -48855, 446140, -5906, -127238, -65498, 114354, -130460, - 30065, 122943, 112743, -44560, -175020, 118648, 200253, 12885, 4295, -4832, - 106300, 10201, 56371, 194347, -34897, -92879, 59593, 71941, -39192, 46708, - -134755, -15569, 41339, -10737, 19864, -35970, 32749, 12348, -33823, 26307, - 15569, 3221, -19864, 9127, 1611, 22549, -8053, 36507, -50466, 34360, - 2147, -40265, -24696, 24159, -30602, 9664, 31139, 9664, -5369, 36507, - -2147, 32212, -24696, -11274, -16643, 22012, - }, - { - -128849, -79994, 787053, 232465, 15032, 192200, 279173, -437013, -88047, -297427, - 127775, 366683, -287763, -332323, -563178, 327491, 63351, -354335, 2147, 1053341, - -764504, -351650, -303869, 565862, -240518, -38655, 249108, -197569, -423591, -35970, - -494458, -165356, -79994, 74625, 1611, 19327, -63351, -222801, 18254, -85362, - 145492, -140123, -49929, 60130, 24159, -96637, 537, -81604, 80531, 27380, - 78920, 68183, 28991, -50466, -52613, 10201, -35433, -5369, 11811, -26844, - -23622, 105764, 2147, -67646, -24159, 52076, -40802, 12348, 73014, 2684, - 15032, -23085, -23085, -17717, 22012, 8053, 8053, -26307, -67109, 27917, - -2147, -27380, 52076, 18790, -33823, -10737, 9127, -20938, 17180, -30602, - -9664, 1611, -16643, 6442, -2684, 36507, - }, - { - -1240172, -8070244, -10737, -844498, -273804, 763967, -497142, 57982, -266825, 133144, - 409633, -544387, 235686, -137976, -217970, -359167, -10201, 238908, -537, 60130, - -133681, 141734, -200790, 162672, -97174, 164819, -253940, 326418, -180926, 260382, - -147103, 76773, -14496, -132607, 297963, 44023, -128849, -84289, -186294, -153008, - -36507, -69793, -337155, 47782, -9127, 100395, -68719, -61740, 69256, -39192, - 68183, 103079, -22549, 63888, -41339, 15569, 5369, 68183, 40802, -123480, - 56908, 33286, -57982, -46171, 117575, 5369, -28991, -1074, -62814, -42413, - 78920, -16643, -2147, -2147, 18254, 18254, -5369, 8053, -8590, -18254, - -20938, -6979, 25770, 13422, -2147, 25770, -33286, -537, -5369, -16106, - 15569, -6979, 32749, 19327, -18790, 3758, - }, - { - -61740, 1658931, -281857, -295816, 132070, -66572, 190589, -296890, -77846, -39192, - -341450, 317828, -669478, 1064615, 200790, 1852742, 24159, 41876, 64425, 249108, - 360240, -274341, 1701881, 623844, -552440, 181999, -9664, 508954, -243739, -497142, - -144418, -139050, -84826, -6442, -130460, 5369, -245887, 343061, -95026, 111132, - 93952, 66035, -61740, 83752, -56908, -10201, 11274, 69256, 74088, -63888, - -58519, 48855, 165356, -75162, 10201, 130460, 137976, -62277, 20938, 17717, - -102542, -107911, 95563, 14496, 26307, -67646, 88047, 20938, -68183, 49929, - 10737, -12885, -20938, -10737, -31675, 23622, 51003, 30065, -2147, 6979, - 30602, -28454, -37044, -19864, -23622, -10737, -12348, 37044, -6979, 8053, - -8590, -43487, 29528, 32749, -47245, 17180, - }, - { - 82141, 2718714, 805843, -1102733, -184684, -933082, -13959, -90194, 112206, 422517, - -336618, -223338, 246424, -405338, -1631551, 603443, -540629, -404264, 117575, -136902, - -161598, -146029, 234613, -238371, -56371, 41339, -118112, -158377, -163746, 315680, - -180926, -104690, 53687, -154619, -93416, -115427, 22549, -132607, -31675, -154619, - 57445, -37044, 96637, 47782, 52076, 31139, -167504, -162135, 25233, -61203, - 162672, -139050, 42950, 76773, -8053, -9664, -69256, -55835, 119185, -21475, - 32749, 32749, 32749, -2684, -32749, -23622, -83215, -2147, 20938, 30602, - -23622, 27917, -6442, 42413, -6442, -19864, -26307, 59593, 12885, -39728, - -27380, 15032, 7516, -45097, -13422, 4832, -59056, 15569, 38118, -2147, - 2147, 24696, -20401, -14496, -18790, 19864, - }, - { - 245350, 623844, -661425, -146566, 165356, 46171, -103079, 68183, -105227, 298500, - -84826, -152471, -404801, -2553895, 4179003, 2784213, -471373, -130460, 68719, 88047, - 668941, 138513, -2147, 552440, -279710, -362925, 527744, -633508, 86973, -220117, - -258772, 197032, 125091, 151934, 40802, -354872, 192737, 264141, -249108, 16643, - -160524, -9127, 151398, 303332, -248571, 160524, -4295, 14496, -40802, 37044, - -4295, -11274, 96100, 92879, -12885, -73014, -31139, 537, -60666, 20938, - 135828, -15032, -15569, -3758, 96637, 18790, 18254, -145492, 42413, 40802, - 4295, -61740, 57982, 38655, 17180, 72478, -49929, -12885, 25233, 32749, - 15032, -11274, -19327, -56908, 53687, -7516, 4832, 17180, 5906, -27917, - 8053, -3758, -23622, 8053, 24159, -4832, - }, - }, - { - { - 2046552, -6139119, -3609383, 1780264, 945967, -40802, -221728, 53150, -100395, -584116, - 148713, 423591, -27917, -331786, -1061394, 420907, 347355, -249645, 354335, 720481, - -139586, -57982, 177167, -52613, -88047, 11274, -161598, -527207, 263067, -7516, - -106300, -83215, -132070, -104690, 137976, -309775, -42413, -365609, -42413, 164819, - 34897, -84826, -42950, -133144, 44023, -111669, 185757, 39728, -123480, -114890, - 78383, -107911, 19327, 91805, -78383, 14496, -35970, -37581, -38118, -70867, - 90194, 40802, 34360, -44023, -8590, -17180, -26844, 69256, -3758, 1611, - -15569, -31139, -14496, 47245, 36507, -3758, -53150, 27380, -54761, -6442, - -9127, 3221, 11274, 9664, 24696, -64425, 23085, -13422, -5906, 2147, - 20401, -8590, 14496, 5369, -4295, -4832, - }, - { - 18790, 2990908, 652298, -227633, 368830, 102005, -50466, -85899, 126165, 93952, - 30602, -179852, -474594, 947040, -964220, 1574106, 395137, 337692, 602369, 238371, - -242129, -626528, -541703, -240518, 296890, 487479, 190052, 602369, 225486, 17180, - -281857, 35970, 228170, 252329, 190589, 254477, -181462, -42413, 120259, -17180, - -136902, -13959, 10201, 70867, -72478, -22012, -22012, 33823, -100932, 53150, - -5906, -17180, -95563, 54761, 147640, -56908, -66035, -57445, 2147, -112743, - -30065, 23622, 69256, 6979, -37581, 4832, -74088, 35433, 32212, -4832, - -17180, 55835, 16643, -39728, -16643, 61740, 18254, 5369, -60130, 3221, - 27917, 5906, -42413, 11811, -23085, -10201, 10201, 15569, -37581, 37581, - 1074, -26844, -26844, 10201, 20938, 5369, - }, - { - -41876, 9500468, 1522566, -1263794, 358093, 279710, 34360, -84289, 139586, -143881, - 74088, 216359, -45634, -90731, 47782, -806380, 100932, -41876, 1028108, -519154, - 391379, -783832, 157303, 111669, -495532, -264141, 200790, 217433, 41339, 72478, - 382789, -417149, 100932, 277562, 419296, -163746, -86973, 16643, 117575, -10737, - 170188, -157840, -86436, -3221, -56371, 95563, -28991, -44560, 32212, 105227, - -127775, -60666, -44023, -50466, -45634, 105764, -13959, 87510, 65498, 30065, - -59056, 24696, 12885, 90731, -73014, -33286, 47782, 20401, -22012, 44023, - 18790, -48855, -24159, 24696, 33823, 61740, -40265, -62277, 64425, 1611, - -8590, -26844, 23622, 17180, -30602, 3221, -1074, 33286, -15569, 5369, - 20401, -2147, -14496, -1074, -1074, -22549, - }, - { - 4438849, 28569586, -960999, -2702071, 30602, 0, 240518, -90194, -96100, 373125, - -61740, -307627, -74088, -59056, -332323, 41339, -193810, 212064, 292058, -230318, - -184147, -40802, 54761, 157303, 139050, 295816, -381715, -141734, 10201, 88584, - 191126, 166430, 24159, 103616, 20401, 161598, -56371, 178241, -260919, -127775, - 312459, -121333, -55298, 136902, -49392, -128312, 141734, 76773, 55835, 10737, - -108985, 156766, -46171, 59593, 31139, 42413, 73551, -85362, 53150, -30065, - -51540, 22549, 67646, -92342, 36507, 9664, -40265, 79994, -40265, -2684, - 26844, 93416, -34897, -28454, 9127, -537, 10737, -2147, -23622, -27380, - 1611, -8053, 42413, -16106, 6442, 17180, -23622, 22549, -13959, -28991, - -8590, 19864, 2684, -12348, 13422, 4295, - }, - { - 17717, -3473555, -287226, -243203, 168577, 8590, -185220, 11811, -133144, -93416, - 93416, 140660, 9664, 734976, 3055869, 973347, -1679869, -1649804, 789737, 312996, - 44023, -276489, -259309, 1136556, -732829, -515933, -681826, -786516, 814970, 800475, - -344134, 476205, -215285, -40802, -187368, 17717, -56908, -208843, -39192, -85899, - 13959, -64425, 35433, -24159, 42950, -141734, -62814, -94489, 56371, -156229, - -25233, 107911, -149250, 105227, -27380, 70867, -37044, 32749, 73551, -95563, - -19327, 41339, -37044, -62814, -23085, 39192, 20938, 57445, 2684, -23622, - 121333, 45097, 1074, 21475, -3221, -54224, 537, -18254, -37581, 13422, - -7516, 48855, 20938, -53150, 26844, -10737, 9127, 22549, -18790, -2147, - -17717, -1611, 25770, 8053, -32749, -9127, - }, - { - 7599945, 23500450, -847719, 1565516, 10737, 60666, -242666, 320512, -57445, -618475, - 369367, 214212, 136902, 179315, -681826, 269509, -28454, -231391, 47782, -164283, - -134218, 183073, 299574, -71941, -219043, 177167, -202400, 313533, -376347, -100395, - 156766, 290984, 4295, -47782, -52076, 104153, -100395, -25770, -191126, 10201, - 6979, 120259, -22549, -137439, 187368, -47245, 212064, -153008, -153008, -92342, - 149787, -98247, -103616, -82141, 150861, -20938, -62814, 17180, 40802, -9127, - 6979, -69256, -33823, 52613, 63888, -7516, 3221, 25770, 10737, -3221, - 1074, -12348, 31675, -30602, 27917, -61203, -7516, 22012, 14496, -2147, - 25233, 47245, -1074, -45097, -30065, -11274, 15569, -22012, 53150, -15569, - -2684, 3758, 3221, 23622, -20401, -13959, - }, - { - -113817, -331249, 1200443, 226560, 10737, -35433, -130460, -73014, -25770, 124017, - -68719, 68183, 79457, 4832, 1956895, 559420, -213138, 149250, -11274, -736587, - -166967, -301185, -2736968, 608275, -136365, 1017370, -804233, -219043, 158914, 282394, - -380641, 85899, 292058, -256087, 79994, 17717, 135291, -537, 166967, -71941, - 107374, 50466, -50466, -27917, -132070, -79457, 170725, -20401, 2147, 44560, - -6979, -76236, -56371, 27380, 41876, -44560, -78383, 95563, -34360, -22549, - -24159, 12348, -48318, -26307, 1074, -34897, -87510, -20938, 72478, 46708, - -25770, -65498, 13422, 9664, -46708, 14496, -21475, -14496, 23085, 38118, - -9127, -2147, -4832, 4295, -15569, -6442, 40265, -9664, 19864, 33286, - -537, -12885, -25233, 10201, 2684, -14496, - }, - { - -327491, -35970888, -976568, -616865, 170188, -34360, 753767, -166430, -110059, 3221, - -5369, 350040, -64425, -27380, 428960, -91268, 41339, 686121, -449898, -473520, - 229244, 64425, -377420, 236223, 144955, -207232, -92879, -160524, -173409, -146566, - -119722, -150861, -162672, -51003, -156766, -191126, -17717, -235686, 25233, 180389, - -96637, -24159, -101469, -537, -223338, 255551, 25770, 82678, -178778, -34360, - -55835, 199179, 105764, -127775, -38118, -45097, 1611, 41876, 51003, 28454, - 46708, -46708, -68183, 29528, 80531, -5369, -13422, -45097, 22549, -17180, - -27917, 30065, -37044, -60130, 49392, 69793, -92879, 24696, 27917, -23622, - 4295, 28454, -11274, 10201, 18254, 537, -41876, 5906, 3221, 10201, - 9664, -22012, -2147, -6442, 11811, 9664, - }, - { - -170725, -905164, 633508, 70867, 125091, 24696, -24159, -226560, 101469, 72478, - 145492, -27917, -40265, -1506460, -205622, 606127, -861678, -292058, -460098, -439697, - 112206, -447750, 135828, -753230, -28991, 790811, -42950, 596464, -67646, 34897, - 80531, -199716, 208306, -105227, -232465, 74625, -6979, -203474, 205622, 1611, - -95563, 122943, 45097, -161598, 10201, -77846, -63351, 108448, -1611, 48855, - 59056, -32212, -97174, -25770, 140660, 57445, -97174, -20938, -31675, 60130, - 63351, 81604, -27380, 23622, 20401, -17180, 13422, -31139, 32749, 52613, - 42413, 28454, -27917, -71941, 20938, 56371, 37581, -21475, 23085, -20938, - 12348, 46171, -40802, -28454, -10201, -25770, -32749, 16106, 24159, -4295, - -18790, 15569, 1074, -4832, -3221, -22012, - }, - { - 1017907, -2684355, 436476, 630286, -157303, -111132, 361314, -144418, -504659, -336618, - 123480, -108985, 272730, 402116, -372588, 47782, -388695, 25233, 127775, 73551, - -222265, -219580, -131533, -19864, -101469, -19864, -128312, -40265, 34897, -118648, - -61203, 107911, -285078, -215285, 358630, 210990, 18790, -67109, 91268, -94489, - -75699, 11274, 103079, 99321, -171262, 33286, 206158, -9127, -48855, -11274, - 53150, -3758, -44560, 112743, 66572, -70867, 63888, 63351, -38118, 75162, - -60130, -57982, 26307, -35433, 53150, -33823, -537, 11274, -41339, 20401, - 26844, 8590, -57445, 23622, -3758, 24696, -39192, 54761, -33286, 38118, - 18254, -21475, -44560, 7516, -42950, -37581, 12885, 7516, -14496, 18790, - -11274, 39728, -2684, -17717, -23085, 4295, - }, - { - 200790, 1949915, -560493, -124554, -69256, -15032, 166430, -345208, -249645, -207232, - -119722, 298500, -157303, -44023, -808528, -117575, 606127, -256087, 13422, 1025960, - -104153, -600222, -1074, 82141, -12348, -344671, 151398, -166967, -52613, 2684, - -401043, -155156, -286152, 54761, -115427, 223338, -51540, -121333, 40265, -124554, - 99858, -29528, -85899, -28454, -10737, -120796, -9664, -16643, -33286, 3221, - 15569, 75162, 93952, 31675, -46171, 12348, -29528, -36507, 11274, -18790, - -55835, 62814, 30602, -54761, -64961, 39728, -26307, -35970, 34360, 15032, - 21475, 19864, -17180, -30602, 16643, 27380, 39728, 9664, -57982, 4832, - -4832, -26844, 38118, 45097, -6979, -20938, 24159, -4295, 40265, -17717, - -15569, 0, -10737, 12348, -16106, 25233, - }, - { - -415538, -10173167, -2684, -172872, -358093, 154619, 185220, -129386, 20938, -179315, - 426276, -25233, 153008, -278099, -155156, -77309, 15032, 172336, -121333, 112206, - -281857, 30065, 47782, 17717, -164283, 185220, -181999, 186831, -96100, 250719, - 93416, -67109, 4295, -17180, 172336, 222265, 129923, -13959, -173409, -139050, - -165356, -88584, -166430, -56908, -67646, -16106, 55835, -10737, 39728, -15569, - -66572, 95026, -57982, 86973, 6979, 54761, 11811, 26307, 120796, -156229, - 27380, 32212, -20401, -62277, 92342, 10737, -8590, 11811, -44560, -67109, - 58519, 5906, -20938, -10201, -537, 17717, 1611, 23622, 14496, -27380, - -7516, -41339, 15032, 1611, -12348, 39192, -22012, -2684, -5369, -38655, - -1074, -22012, 16106, 21475, -10201, -3221, - }, - { - 54224, 1249836, 245350, -234613, 26307, -73014, 228170, -52076, -155156, -370978, - -213138, 130460, 829466, -797253, 15032, 1801739, 449898, -405874, 205085, 70330, - 1779727, -633508, 854699, 364535, 322659, -292595, 289373, 170725, -48318, -568009, - -181462, -81604, -78920, 37581, -149787, 118112, -197032, 241055, -117575, 76236, - 34360, 8590, -28454, 89657, -89657, 11274, 50466, -56908, 45097, -46708, - -44023, -13422, 102005, -17717, -23085, 6442, 150324, -32749, 4295, 77846, - -55298, -134218, 16643, 47245, 57982, -56908, 59056, 68719, -69793, -4832, - 32749, -6442, -10737, -5369, -48855, -31139, 34897, 22549, 18790, 12348, - 33286, 5369, -30602, 6979, -19327, 3758, -39192, 34897, 10737, 1074, - 3221, -48318, -8590, 36507, -35433, -16106, - }, - { - 482110, 3390340, -150324, -2147, -15569, -739808, -671626, 20938, -146566, 282394, - -364535, -108448, 186294, -564788, -925565, 236760, 15032, -169114, -35433, -81604, - 27380, -331249, 300111, -323733, -75162, -178778, -130997, -301721, -149250, 170188, - -113280, 31139, 106300, -57982, -2684, -132070, 19864, -162135, -48855, -67646, - 24696, -112743, 76773, 127775, 68719, 76773, -132070, -128312, -15032, -39192, - 116501, -10737, -84289, 26307, 108448, 16643, -30602, -69793, 87510, 18254, - 53150, -2147, 35970, 55298, -25770, 3221, -72478, -11811, 3221, 46171, - -32212, 15569, 1611, 28454, 4832, 537, -34897, 51540, 54224, -4295, - -33286, 12885, 32212, -24696, -9664, 32749, -48855, -26844, 24696, 13959, - -2147, 36507, -6442, -6442, -14496, 9664, - }, - { - -83752, 1682017, -935766, -201327, 127775, -40802, 205622, 85899, -210990, 111132, - 47782, 235149, -1140851, 2448668, -2413235, 2309082, 429497, 387084, -48318, 137976, - 1018444, 35433, -101469, 136365, -140123, -172872, 198642, -60130, -319438, 35970, - -454730, -41876, 344134, -50466, 115964, -217970, -65498, 126702, 146566, -172336, - -155693, -178778, 130460, 208843, -105764, 4832, 68719, 9127, -74625, 17717, - 25233, 15032, 7516, 46171, 57982, -17180, -95026, 22012, -118112, -95026, - 55298, 66572, -86973, -17717, 34897, 40802, 94489, -153008, 8590, 10201, - 31139, -73014, -8053, 28454, -22012, 81068, -26844, -35970, 3221, 17717, - 59593, 537, 27917, -52613, 15032, 0, 3758, 22012, 10201, -13422, - 537, 16643, -21475, -4295, 9664, 6979, - }, - }, - { - { - -1145146, 7047505, 5786395, 97174, -794569, 171262, 230854, 100395, 192200, -178241, - -369367, -115964, 140123, 438624, 130997, -52613, 391379, -272730, 324807, -358630, - 19864, 159451, 320512, 5906, -101469, -159988, 137976, -553514, 293132, -67646, - -76773, 125628, -9127, 132070, 35970, 82141, 127775, -209380, -137976, 70330, - 86973, 23085, -115964, -114890, 220117, -271657, -44560, 57445, -79994, -76236, - -2684, -109522, -30602, 12348, -20401, 15569, -47782, 18790, 80531, 27380, - -50466, -40802, -4295, 34897, -8053, 31139, 29528, -41876, 0, -9127, - 25770, 28454, 4832, -18790, -30602, 64961, 9664, -34360, 52613, -23085, - -8590, -49929, -14496, 1611, -13422, 38118, -36507, 20938, -8053, -13959, - -11811, 7516, -13422, 16106, 9664, 2147, - }, - { - 53150, 1136019, -690953, 325881, -400506, 26844, 48855, -32212, -294205, 285615, - -4832, -65498, -583042, 394063, -2593624, 601295, 626528, -419833, -379568, 666257, - -227096, -430034, 273267, 136365, -91805, -366683, -386547, 50466, 153008, 220654, - 22549, 414464, -51003, -199179, 271120, -3221, -62814, -141734, -39728, -31139, - 40265, -1074, -143881, -71404, 96637, -127775, -112743, -58519, 97174, 73551, - -84289, 201327, -30065, -44023, -183073, 121870, 59593, -54761, -1611, 41876, - -27917, -35433, 20401, 45634, 28454, -3758, 50466, -67646, -54224, 11274, - 15569, -46708, 46171, 51003, -8590, -57445, 17717, 60130, 17717, -12348, - -63351, 44560, 32749, -537, 11274, -11274, -28454, 2684, 8053, -52076, - 14496, 25770, 7516, -8590, -24159, -3758, - }, - { - 35433, 3639448, -1124745, 472983, -488016, 8053, -47782, -248571, 47782, 229244, - 151398, 23622, -108448, 592169, 202400, -229244, 135828, -134755, 66035, -498753, - 256087, -509491, -6979, 226023, -107374, 53150, -44023, -170188, 118648, -164283, - 113280, 124017, 101469, 15569, 96100, 267899, -35970, -58519, 53687, -82678, - 51540, -19327, 211527, -165356, -26844, -99858, -23622, -57445, -66035, -30602, - 83215, 59056, -119185, 10737, -90194, -65498, -16643, -38655, 11811, 38655, - 32212, -35970, -16106, -67646, 42950, -51540, -19327, 6442, 51540, -33286, - -3758, 64961, -24696, -26307, 2147, 4295, 57982, 9127, -24159, 1074, - 23085, 0, -37044, 28454, 38118, -12348, -19864, -22012, 17180, -6442, - -13959, 6442, 20401, -10737, 14496, 24159, - }, - { - -7080254, 14835354, 1129576, -2214056, 297427, -78920, -155693, -42413, -258772, -88047, - 113817, 361851, 122407, -194347, -788127, 363462, 87510, 8590, 226023, 20938, - -15569, 318364, -88047, -118648, 131533, 106837, 184684, -136902, 246961, -106300, - -192200, 89657, -74088, -79457, 107911, -255551, -102005, -116501, -30065, -1611, - 34360, -103616, -78383, 10737, 115427, 39192, -176631, -84826, -109522, 118648, - -106300, 38118, 60666, -37044, 70330, 6442, 18790, -95563, -47245, 79457, - 82678, -18254, -71941, -13422, -28454, -16106, 31675, -39728, 47245, -22549, - -60130, -16106, 83215, 14496, -9127, 17180, -10201, -7516, -10201, 16106, - -3221, -24696, -26307, 537, -6979, 9127, 20401, -37044, 36507, 17180, - -11811, -19327, 9664, 6979, -9664, -16643, - }, - { - -149787, -3486977, 539018, 268972, -192737, 57445, 40265, 40265, -5369, -147103, - 0, -68719, 177167, -845572, 160524, 639950, -240518, 1553704, -3066070, -318364, - -103079, 246961, -501437, 1001801, -174483, -250182, 1108102, -198105, 443455, 534187, - -442382, 302258, 413391, 38655, 537, -130460, -102542, -88584, -18254, 14496, - 73014, 193810, 0, -166967, 161598, -24696, -31139, 100932, 107374, 85362, - -123480, 69793, 110059, 26307, -91805, 74088, 48318, -49929, 48318, 537, - -57982, -36507, 3758, -8590, 0, -15032, -37581, -24696, 11811, 9127, - -39728, 22012, 15569, -10737, 13422, 41876, -10201, 19327, 8053, -37044, - -19864, -52613, 20938, 29528, -47782, 25233, -10737, -4295, 16106, -4832, - 1611, -4832, -27380, -1611, 28991, 6442, - }, - { - -9774809, 1189169, 1531156, 1238024, 4832, 20938, 37581, -693100, 280247, 440771, - -438624, -348429, 62814, 374736, -732292, -22012, 98784, 126165, -102542, 122943, - 220654, -292058, 95026, 163746, -8590, 19864, -202400, 63351, -78383, 107374, - -33823, 66035, 11274, -36507, -169114, 282394, -34360, -62814, -90731, 161598, - 149250, -186831, 27380, 46708, 333397, -169114, 159451, -12348, 22549, -77846, - -69793, 135291, 39728, -16643, -114354, 61740, -59593, -83215, -71404, 8590, - 92342, 21475, -35970, -51003, -61203, 3758, 48855, -46708, 15032, 26844, - 18790, -8590, -41876, 9664, -3758, 18254, -24159, -40802, 5906, 11811, - -40265, -4832, 17717, 60666, 5369, 537, -24159, 17180, -47245, 27380, - -1611, -6979, -8053, -12348, 20938, -537, - }, - { - 260382, 718870, -732829, 3758, 8590, 71941, 10201, -5906, -226023, 102005, - 45634, 66572, -61203, -304943, 2093260, 1314260, 962073, 1074, 74088, -532039, - 162135, 214748, -1695975, 773094, -69256, 345208, -598611, -623844, 271120, 63351, - -194884, 38655, -124554, 199179, -54224, -270046, 199716, -54224, 112206, 162135, - -115427, -136902, 155156, -93952, 148713, 9664, -54761, -100395, 42413, -33823, - 121870, 1074, -24159, -27917, 31139, -4832, -15032, -68719, -16106, -15032, - -63351, -19327, 40802, 6979, 2684, 8590, 48855, -39728, -60130, -52613, - 102542, 30065, -46708, 14496, -5906, -27380, 9127, -37044, -32212, -21475, - 19327, -5369, 9127, 3221, 1611, -13422, -23085, 17717, 1074, -5369, - 22012, 20938, 24159, -18790, 17717, 4832, - }, - { - 4620311, -32770064, -661962, -207232, 214212, -133681, 232465, 142271, -50466, 179852, - -13422, -384936, 420907, -30602, -386010, 30602, -233002, -93416, 468688, 246961, - -176631, 212064, -341450, -317291, -119722, 131533, -64961, -44560, -108448, -21475, - -213138, -227096, 29528, 56908, 158914, -10201, -265751, -118648, 7516, 54761, - 37581, 128312, 20938, -117575, 129923, 163746, -26844, 81604, 198105, 35970, - -109522, -104690, 26307, 160524, 34360, 4832, -90731, -2684, -34897, -39728, - 62814, 84289, 44023, -55835, -22549, 18254, 3758, -2684, -12348, 30065, - 20401, -11274, 24696, 3221, -78383, -1611, 70867, -54761, -24159, 23085, - -45634, -4295, 1074, 12348, 12885, 14496, 18790, -18790, 8590, -13959, - -16106, 9664, 9127, -10737, -15032, 1611, - }, - { - 397284, 507880, -1720671, 204548, -200790, -3758, 140660, 255014, 81068, -37044, - 76773, -30602, 274341, 1242319, 1877438, 2159295, -366146, 55298, 139050, -439160, - -609349, 28454, 455267, -84826, -567473, -131533, 562641, -332323, -199179, 66035, - -180389, 245350, -104153, 102542, 70330, -279710, -59056, 69256, -141197, 108448, - 2684, -147103, 236223, -20401, 59056, -191663, -15032, 76773, -47245, -99321, - 60130, 31139, 89657, -67646, -30602, -16106, 106300, 10201, -161061, -38118, - -33286, 42413, 1611, -63888, 36507, 58519, 77846, 37044, -19864, -14496, - -537, 15032, 41339, 49929, -29528, -15569, 3758, 5906, -30065, 9664, - -47245, -6442, 51003, 24159, 20401, 11274, -537, -51003, -7516, 2147, - 1611, -16643, 6442, 13422, 6442, 12885, - }, - { - -701690, -8054675, -903017, 548145, 227633, -973347, 318364, 9664, 193274, 189515, - 24159, -102005, -299037, -200253, -41339, -583579, -105764, 186831, -256624, 17717, - 274878, -213138, 26844, 183610, 127775, -185757, -196495, 275952, -99858, -316754, - -130997, -146566, -82678, -35433, -148713, -99858, 175557, 64961, -172872, 183073, - -118112, -68719, -86973, 102005, 212064, -85362, -152471, 6442, 137439, 29528, - -173409, 54761, -90731, -239981, 117038, 76773, -17717, -39728, 45097, -68183, - 128312, 1074, 1611, -44560, -10201, 49929, -26307, 1074, 37044, -18254, - -19327, -12348, 13959, -18790, 19327, -19864, 1611, -30602, 32212, -22549, - 6442, 23622, 16106, -22549, 28991, -13422, -32749, -8590, 4832, -34360, - 2684, -24159, 24159, 13422, 19327, -19864, - }, - { - -173409, 4221416, 1459752, -702227, 120796, -195958, -204548, -136365, -32212, 118112, - -62277, -348429, 336618, 54224, -530428, -437550, 511638, 751082, 583579, -1006633, - 52076, 401043, 340376, -151398, -176094, -52613, -344671, -270583, -226023, 10737, - 150324, 76236, -315143, -192200, 5906, -238908, -130460, 15569, 127775, 64425, - -8053, 120259, -10201, -113280, -43487, 15032, -2147, 116501, 24696, 29528, - -55835, -117038, -19864, 44560, 57982, 17717, 53687, 23622, -42950, 24159, - 41876, -106300, 3221, 31675, 51540, -71941, 47245, -7516, -84826, 537, - -24696, 25233, 26307, 15032, -33286, -20401, -9664, 9664, 70330, -30065, - -1074, 33823, -40802, -18790, 24159, 7516, -11811, 18790, -19327, 33286, - 6442, -7516, 12885, -1611, 1074, -36507, - }, - { - 2574296, -7587060, -884226, 25770, 383326, -1162862, 451508, 216359, 68719, -193274, - -359704, 476741, 158914, -108985, 236223, 410706, 461709, -106300, -5906, -331786, - 222265, 71404, 92342, -115964, 130460, 9127, 96637, -348966, 66035, -170725, - 127238, -113280, -166430, 376883, -123480, -113817, 13959, 166430, 257161, -19864, - 28454, -7516, 190052, -90194, 10201, -129386, 78383, 44560, -61740, -75699, - -537, -41876, 40802, -56908, 42413, 35970, -3758, -17180, 17180, 20938, - -13422, -38655, 51003, 32749, -72478, -19327, 28454, -10201, 37581, 19864, - -68719, 28454, -1074, -14496, -5906, -18790, -6442, 10737, 10201, 4295, - 14496, -2684, -36507, -16643, 4832, -51540, 31139, -2147, -4832, 14496, - -27917, 2147, -30602, -23085, 11274, 3221, - }, - { - -10201, 1111860, 398895, 448287, -88584, 117575, -281320, 209380, 62277, -155693, - 335007, -104690, -169651, -691490, 1420560, -191126, 1041530, -368830, -343597, 44560, - 133144, 841277, 326418, -461172, 680215, -168041, -133144, 337692, 91268, 396211, - -269509, 270046, 38655, 158377, -73014, -76773, 238908, -38655, 63351, -132607, - -129923, -116501, -2147, 13959, 86973, 14496, 55298, -199716, -39728, 83215, - 32212, 537, -88584, 16643, 42950, -55835, -157840, 28991, -18254, -5906, - 57445, 115427, -80531, -53150, -48855, 77309, -26844, -1074, 30602, -25770, - 8053, -25233, 15032, 12348, 52613, -17717, -30602, -45097, -3221, 5369, - -27380, 30065, 11811, 17717, 19864, -1611, 21475, -34897, 4832, -4832, - 11274, 42950, -28454, -42413, 42950, -11274, - }, - { - -1234266, 1752347, 988379, 932545, -103616, 18790, -243203, 222801, 202400, -342524, - 233002, 137439, -427886, 405874, 274341, -455803, 162135, -207769, 71404, -116501, - 168577, 109522, 42413, 212064, 25770, 127775, -21475, -319975, -166430, -298500, - 250719, -77846, -36507, 187368, 358630, -139586, -26307, 27917, 44023, 257698, - -147640, -154619, -227633, -192200, -99321, 66035, 83752, 112206, -58519, 92879, - -169114, 115427, -13959, -82141, 39728, -3758, 91268, 30602, -71404, 23622, - -6979, -1611, -5369, -38655, 22549, 3221, 85899, -24696, 2147, -11274, - 51540, -20938, 22012, -47245, -2147, 23085, 53150, -39192, -23085, 27917, - 16106, -18790, 4832, 39192, 6979, 0, 59056, -24159, -42950, 14496, - 8053, -23085, 20938, 5906, 19864, -21475, - }, - { - 17180, 2062121, 301721, 114890, 50466, -30065, -46171, 1611, -185220, 171262, - 187905, -37581, 234076, 3027952, -8257075, -61740, 688269, 709743, -482110, -154082, - 864362, 63351, -469225, 453656, 618475, 268435, -2147, 293668, -130460, 506269, - -184147, -376347, 193810, -307627, -273804, 341450, -75162, -503048, 365609, -24159, - 96637, -90731, -138513, -220117, 210990, -95026, 45097, 173409, -25770, -13959, - 46708, 23622, -18790, -125628, 5906, 111669, 5906, -37044, 37044, -28454, - -147640, 13959, -13959, -27380, -9664, -46171, -10201, 154082, -53687, -23085, - -10201, 42413, -39192, -20401, 0, -69256, 63351, 28454, -13959, -43487, - -27917, 2684, 26844, 66572, -48318, 11274, 10737, -23085, -8590, 29528, - -7516, 3221, 24159, 1074, -27380, 3221, + 15263, 9658, 3901, -1419, -6208, 15042, 14882, 14661, 14205, 13703, + 13419, 13246, 13095, 12861, 12512, 12433, 12733, 13082, 13229, 13103, + 12857, 12674, 12536, 12387, 12245, 12155, 12223, 12430, 12578, 12570, + 12441, 12235, 11999, 11775, 11585, 11430, 11326, 11310, 11366, 11425, + 11438, 11422, 11439, 11535, 11703, 11912, 12128, 12307, 12428, 12507, + 12561, 7803, 353, 233, 186, 159, 141, 129, 120, 114 + }, + { + 2513, 7073, 3664, -4933, -11833, 9126, 9259, 9002, 9550, 10692, + 11891, 12599, 12894, 13033, 13106, 13144, 13281, 13431, 13430, 13295, + 13275, 13495, 13891, 14466, 15013, 15124, 14699, 13966, 13231, 12756, + 12530, 12358, 12160, 11994, 11874, 11774, 11759, 11938, 12322, 12777, + 13151, 13383, 13513, 13614, 13703, 13762, 13803, 13837, 13861, 13868, + 13855, 8509, 224, 69, 10, -29, -57, -78, -94, -104 + }, + { + 1910, 491, -1490, -1813, -1940, 2696, 2572, 2313, 2118, 1835, + 2422, 3344, 4703, 6559, 8165, 8526, 7404, 5240, 2687, 530, + -697, -985, -668, -226, 2, -88, -459, -928, -1248, -1176, + -592, 364, 1309, 1921, 2178, 2251, 2242, 2154, 2001, 1848, + 1751, 1671, 1489, 1132, 618, -26, -757, -1460, -2044, -2506, + -2833, -1911, -67, -26, -9, 1, 8, 13, 16, 19 + }, + { + 1353, 750, -1645, -2697, -3639, 3522, 4738, 6009, 7652, 8787, + 8843, 8533, 7931, 6997, 6500, 6177, 5537, 4673, 3558, 2163, + 759, -365, -1150, -1512, -1268, -292, 1348, 3287, 5013, 6292, + 7162, 7819, 8446, 9054, 9451, 9439, 9056, 8541, 8112, 7871, + 7803, 7835, 7892, 7902, 7801, 7534, 7098, 6592, 6121, 5726, + 5439, 3221, 145, 100, 82, 72, 65, 60, 57, 54 + }, + { + 58, -757, -2772, -4035, -4237, 2025, 3174, 4549, 5874, 6766, + 6152, 5491, 5139, 4788, 4746, 4907, 4987, 4705, 3868, 2360, + 538, -1153, -2450, -3071, -2950, -2364, -1675, -1022, -390, 245, + 847, 1473, 2246, 3044, 3446, 3217, 2621, 2164, 2162, 2602, + 3255, 3889, 4377, 4729, 5015, 5258, 5411, 5446, 5387, 5256, + 5093, 3070, 90, 31, 7, -8, -19, -27, -33, -36 + }, + { + -228, 336, -2902, -2521, -2020, 594, 199, -975, -1945, -2169, + -1372, -472, 171, 1207, 2476, 2937, 2002, -89, -2808, -5241, + -6657, -7056, -6750, -5825, -4122, -1874, 116, 1230, 1486, 1330, + 1220, 1327, 1482, 1383, 985, 499, 99, -182, -337, -314, + -61, 338, 681, 804, 661, 271, -292, -881, -1389, -1801, + -2102, -1437, -88, -60, -49, -42, -37, -33, -30, -28 }, + { + -181, 1119, 2819, 3685, 3342, -2321, -2915, -2842, -2539, -2909, + -3164, -3288, -3378, -3520, -3097, -1559, 673, 2638, 3664, 3564, + 2365, 324, -2103, -4328, -5612, -5607, -4829, -4103, -4010, -4659, + -5684, -6647, -7403, -8060, -8598, -8843, -8709, -8308, -7828, -7398, + -7046, -6717, -6318, -5790, -5143, -4430, -3747, -3200, -2822, -2575, + -2419, -1452, -44, -12, -2, 5, 10, 14, 17, 18 + }, + { + 209, -2006, -2657, -802, -195, -103, -969, -1234, -646, -224, + 745, 1313, 1695, 2071, 2354, 2370, 2478, 3046, 3906, 4811, + 5329, 5087, 4068, 2061, -1075, -4579, -7300, -8666, -8732, -7879, + -6591, -5213, -3825, -2395, -1031, 57, 774, 1237, 1633, 2037, + 2394, 2634, 2747, 2795, 2872, 3044, 3288, 3524, 3706, 3826, + 3873, 2400, 105, 58, 38, 26, 17, 11, 6, 3 + }, + { + 482, 4180, 6357, 5317, 2944, 2790, 3262, 4049, 3526, 1759, + 137, -746, -1203, -1670, -2390, -3083, -3581, -3767, -3721, -3505, + -3244, -3067, -2919, -3003, -3503, -3982, -3623, -2224, -366, 1255, + 2487, 3508, 4414, 5157, 5640, 5817, 5677, 5266, 4687, 4058, + 3484, 3034, 2731, 2550, 2441, 2349, 2225, 2058, 1877, 1711, + 1601, 884, 72, 82, 84, 86, 88, 90, 92, 93 + }, + { + -674, -4040, -7432, -9477, -7969, 1394, 1274, 1722, 1589, 743, + 341, 266, 540, 698, 553, 269, -125, -491, -812, -1180, + -1506, -1515, -1122, -773, -964, -1613, -2162, -2151, -1584, -741, + 264, 1455, 2772, 3973, 4717, 4876, 4665, 4453, 4497, 4789, + 5165, 5472, 5666, 5811, 5979, 6177, 6330, 6366, 6296, 6136, + 5908, 3542, 61, -24, -57, -79, -96, -108, -117, -123 + }, + { + -26, 564, -1623, -937, 98, 143, 47, -389, 38, 772, + 1169, 1016, 926, 1244, 1570, 1831, 2133, 2600, 3153, 3747, + 4305, 4671, 4517, 3351, 1238, -1012, -2726, -3794, -4328, -4496, + -4473, -4379, -4176, -3806, -3363, -3028, -2910, -2899, -2744, -2281, + -1518, -605, 262, 937, 1394, 1728, 2069, 2457, 2851, 3225, + 3538, 2357, 107, 60, 41, 29, 21, 15, 11, 8 + }, + { + -465, -2595, -6347, -3430, -2269, 409, 1246, 1127, 1424, 371, + -769, -1617, -2586, -3551, -3776, -2915, -930, 1629, 3769, 4802, + 4500, 3094, 888, -1969, -4832, -6458, -6195, -4599, -2801, -1519, + -816, -597, -860, -1539, -2336, -2878, -3023, -2911, -2795, -2845, + -3058, -3281, -3325, -3089, -2606, -1980, -1341, -825, -474, -263, + -175, -77, -25, -41, -48, -53, -57, -61, -64, -65 + }, + { + -205, -402, 438, 1643, 494, -312, -32, 875, 1028, 701, + 615, 704, 535, -104, -1146, -2140, -2372, -1571, 321, 2713, + 4715, 5885, 6068, 5128, 3396, 1694, 561, 43, 10, 282, + 726, 1148, 1259, 824, -237, -1692, -3114, -4191, -4873, -5275, + -5531, -5700, -5773, -5723, -5552, -5275, -4867, -4362, -3849, -3371, + -2971, -1637, -72, -50, -39, -32, -28, -25, -23, -21 + }, + { + -586, -464, 925, 2364, 1444, -872, -1456, -1291, -1373, -1161, + -722, -1056, -1376, -1142, -1081, -1077, -470, 674, 1657, 2449, + 2920, 3103, 3447, 4242, 5373, 6064, 5466, 3614, 1238, -1080, + -3079, -4664, -5731, -6181, -5974, -5236, -4293, -3465, -2895, -2547, + -2266, -1879, -1316, -667, -122, 183, 243, 175, 85, 28, + 23, 17, -14, -7, -4, -1, 1, 2, 4, 4 + }, + { + 109, -472, -1815, 888, 814, -1342, -518, 44, 1291, 1664, + 1231, 745, 899, 1175, 1133, 992, 1153, 1784, 2823, 3915, + 4658, 5034, 5246, 5053, 3756, 1133, -2033, -4708, -6379, -7011, + -6834, -6123, -4961, -3219, -1003, 1201, 2935, 4076, 4750, 5072, + 5039, 4653, 3991, 3192, 2420, 1815, 1416, 1187, 1070, 1014, + 978, 563, 30, 21, 18, 16, 14, 12, 11, 9 + }, + { + 1, 233, -516, -205, 276, -374, -1326, -2166, -2162, -2251, + -1547, -697, -540, -757, -795, -979, -1389, -1455, -1000, -232, + 662, 1631, 2560, 3166, 3165, 2712, 2425, 2692, 3255, 3766, + 4170, 4506, 4702, 4810, 5123, 5773, 6496, 6847, 6579, 5791, + 4780, 3827, 3102, 2583, 2097, 1494, 771, 60, -529, -963, + -1226, -873, -37, -13, 0, 8, 13, 17, 20, 21 + } }, -}; - -const Word32 leftBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX] /* Q29 */= -{ { { - 5312338, -15328201, 16282758, 29370596, -15591268, 12818330, 1811403, 182536, -9895068, 2481417, - 491237, -11926587, 5715528, 5282810, 6278706, -12351789, 2285460, -4657892, 11144366, -3479461, - 4906464, -3717831, 3595961, -5890011, 6990596, -3155727, -4663261, -1210644, 6162205, -3131031, - 4348655, -2241436, 2251100, -799401, -1116155, 9625559, -1194538, -4785131, -2711735, 572304, - 6594923, 6273874, -7301982, -2674691, 1289027, 1906966, -487479, 1509144, -726386, 770410, - 226023, -288300, -2494302, 4155381, -2242510, -2687576, 521839, 1523103, 280247, 1378148, - -532576, 742493, -259846, 596464, 257161, -393526, 1384053, -1336272, -2343442, -372588, - -831076, 597000, 5369, 1152662, -3325915, 3321620, 296353, -28991, 1579474, -716723, - -1385664, 824097, -137976, 889058, -1136556, 190052, -27917, 1329829, -2356863, 166967, - 546535, 307090, 70867, 149250, -1052804, 570694, - }, - { - -1878511, 17737678, -17321604, 19983410, -14324253, 7502234, 2997887, 3507378, -8614631, -1859184, - 1334661, -6471979, 993748, 1572495, 8171176, -13944148, 4880694, -3664144, 10201084, -4412542, - 730681, -2709588, 8744553, -5805722, 1595580, -5035849, 3263638, -2362232, 540629, -3300682, - 6315750, 2110440, -6184216, -4188667, 5704254, -1165010, 4133369, -6009733, -1692217, -3385508, - 5913633, 5572183, -5843840, -2107755, 4840965, -2926483, -1759326, 2276333, -584652, 3922916, - -2763812, -1257889, -41876, 1346472, -2653753, 3075734, -2070711, 2164127, -2144799, 1511829, - 1400696, 883153, -2318746, -430034, 2891050, -3351685, 4524748, -2738042, 1201517, -2592550, - 1482838, -2003602, 494458, -41339, 85899, -975494, 364535, 1664837, 1857037, -461709, - 230318, -395674, 814433, 67109, -1385664, -938450, 1464584, 335007, -806917, -1799054, - 1691680, -73014, 67646, -622770, 793495, 709207, - }, - { - 1511829, 1513976, -4419522, 27764280, -14358076, 13790603, 3252364, -9540733, 794032, 5572183, - -6106370, -10015327, 8767102, 3111167, -2601677, -3448859, 7910256, -4816269, 2439542, -885300, - -1461900, 4851166, -1792075, 1909113, -579284, 5089000, -9176198, -9768366, -688805, -1454383, - 9844602, -1716913, -1995549, 9068823, -1946157, -3422015, 2071785, 4333085, -2915209, -3728569, - -13959, 2765959, 3430068, -293668, -28454, -5693516, 4027069, 4806069, -1596654, -4428112, - 1627256, -1127429, -3068217, 1995549, 1992865, 16106, -1770600, -3318399, -153545, 3567507, - 1425929, 1480153, -384936, -407485, 2409477, -1116155, 1678259, 139050, 826244, -3308199, - -1213865, -1698123, 1036161, -883690, 1144072, -2500745, 1324461, 1468342, 670552, 235686, - 1043140, 724239, -1097364, -133144, 239981, 1453846, -2284386, -932545, -658204, 2100776, - 11811, -593779, 243739, 1205275, -233002, -308164, - }, - { - 14759118, -47656956, 15619185, 18750216, -6482717, 6076842, -2073396, 3107946, -3583077, -8136279, - 5846524, -5396627, 5415417, 3515431, -757525, 9468255, -2396592, -4336307, -2494302, 4351876, - -3119220, 7886097, -6424198, -7972533, 10735808, 5888400, -7277285, -6745783, 6926709, 6168110, - -3765613, -1012539, 4037806, -4781909, 1706176, 630286, 2334852, -3817152, 2831457, -2628520, - 685584, 682363, 853088, -1152662, 1496796, 1825898, -3122978, 358093, 3617973, -2821257, - 649077, 2146410, 584652, -2779918, 1059246, -1236951, -1378148, 2666638, -2761664, 2726767, - -300648, 172872, -129386, -22012, 34360, 664109, -46171, 652835, -871878, -1017370, - -888521, -346819, 330712, 368830, -168041, 1155883, 159988, -90194, 309775, 184147, - 350577, -603980, -401579, 405874, -298500, 578747, 475668, -1049046, -585726, 303332, - 681826, -453656, -831076, 666257, 137439, 340913, - }, - { - -235686, 11187316, -20111722, 23366770, -21138218, 8778913, 6176700, -1894618, 927176, -2820183, - -3235721, -7745974, 5153961, 7634841, -10519986, 10456098, 8409009, -14551886, 10614475, -1965484, - -3012383, 6664179, -2268817, -12690018, 16714939, -3394098, -7367480, -9629317, 10082973, -6877854, - 10856604, -9347459, 6423124, -5399311, -974421, 3379066, -2268817, -4389994, 7019051, -2147484, - 2791729, 865973, -1511829, -3963181, 2746095, 5527623, -6184753, -1511292, -1290638, 6837051, - -1390496, -1603097, 1284195, 691490, 1523103, -1762010, 821413, -711891, -444529, 3688840, - -1002875, -2233383, 92342, 1019518, 1869385, 1480690, -2762201, 734976, -2713883, 2064806, - -1337882, 135291, -1392106, 1134945, 481036, -286689, 561030, -596464, 1449015, 423054, - -1340030, 628139, -649077, 1489817, -2268817, 967978, 784905, -872415, -373662, 521302, - -136365, 692027, -1122597, -38655, -172872, 428960, - }, - { - 19509352, -64412700, 23457500, 21772800, -2419677, 2259153, 3331821, -3532611, -4037806, 1436667, - 5179194, -17941690, -4281546, 16269873, -9058086, 14944339, -3533148, -10220948, -1289564, -2030446, - 15389942, -11142756, -10510859, 4478577, 5759551, -5384815, 12187507, -11731166, 9569187, -7611756, - -1301912, -5772436, 8174397, 8390755, -2353642, -2870649, -582505, -3890704, 5292474, 463320, - 1320166, -7281044, 2638721, 3129421, -1117765, -3943854, -228707, 807991, 28454, 1709934, - -1439351, -63888, 2142652, 401579, 752693, 1597728, -635655, -3596498, 497142, -411780, - 688269, 2191507, -5393405, 3028489, -1174674, 90731, 2779918, -830539, -1854352, 920734, - -1211718, 120259, 1400696, 1611687, -2023467, 1606855, -110595, -204548, -257161, 272730, - -1467268, -1513976, 706522, 87510, 536334, 1636383, -404264, -173409, -1279900, 243203, - 35970, -163746, 515396, 511101, -33823, 1058173, - }, - { - -1795833, 20707112, -32792076, 23744726, -18837726, 7560216, 6619619, -1218697, -2314451, -2202781, - -556735, -3958886, -12127914, 5669357, 3277060, 12116640, 62277, -9705015, -2224256, -2025614, - 10918344, 76236, -12405476, -7141457, 6460168, -2634426, 15206332, -15780784, 4519380, 1002338, - -9215926, -4342212, 11005854, 613107, -744103, -6572911, 1298154, 1505386, 2160369, -143881, - -920734, -3894462, 4447976, -434865, 1169842, -1978906, 2633889, -1066226, 268435, -2422899, - 1462973, -549756, 3957812, -616865, 2720325, -884226, -37581, -2654827, 3102040, -2392834, - 158914, -987306, -2294586, 1512365, 1766842, -1382980, 2263985, -2747705, 431107, 519154, - -271120, 505196, 587337, 449361, 1513439, -989990, -251792, -56371, -712965, -1046898, - 572304, -1304060, -386010, 1265405, -1028645, 2281702, -1120987, 100932, -1631014, 972810, - -12885, -137976, 1039919, -540092, -463320, 731755, - }, - { - 16981764, -56895432, 24611774, 21936546, -5342940, 7660074, -2584497, -2967286, 2484639, -5905580, - 1956358, -16724066, 7751342, 14867029, -12740484, 7344394, -7058242, -4048007, 13473312, 1557463, - -4805532, -4983236, 12642236, -12135430, -9858024, 14453102, 2812130, -1634772, -7023346, 5540508, - -4072166, 250182, -526134, -2897492, 10938745, -3962107, -4967130, 3672734, -421444, 1986422, - -1153736, -2592550, -2722473, 4157528, 947040, -353261, -2173790, 667331, 1450088, 1864553, - -881005, -6741488, 4555887, 4300873, -1057099, 2744484, 181999, -53687, -4269198, 1094680, - 2002529, -4604205, 2578591, 229781, -4285841, 1513976, 2944200, 382252, -1535988, -819265, - 1133871, 173409, 216359, 2851858, -2499134, -28991, 4573604, -3896609, 262530, -426812, - -1157494, -1235340, -180389, 484794, 1307281, 831613, 513249, -397284, -1567126, -351114, - 404801, 401579, 1215476, 453119, -745714, 415001, - }, - { - -1898912, 22643068, -38548944, 24912420, -17003238, 4400194, 9096204, 234613, -3450469, -3834869, - 1771137, -10518912, -3963718, 12140799, -550293, -2965138, 2650532, -8160438, 11890617, -548145, - -4634807, 3637837, 1883343, -11204496, 126702, 4858682, 16890496, -12792560, 1769527, -4717485, - -3195993, 11159399, -11986180, 10284836, -4656282, -2163053, 2572149, 3319473, -1615445, 2324114, - -4486094, 1670742, 1240172, -3856344, 2228551, 1751810, 1069447, -5204427, 759136, 4014721, - -1615445, -5482526, 4042101, 3636764, 1723356, -2246268, 3710852, -1366337, -4788889, 1828582, - -1134945, -581968, -762357, -503585, 766115, -510027, 2339147, 2078764, -2164127, -1748589, - 1334661, -159988, 2298881, 1909650, -998580, -1019518, 928787, 876710, -1318555, -897648, - -462783, -170725, 436476, -336081, 753230, 1717987, -747324, -1275605, -1265405, -448287, - 1691143, -322123, 566936, 796716, -415001, -1191317, - }, - { - 11045045, -32876364, 8340290, 18104360, 3212099, 104153, -14018773, -575526, 11572789, -3147674, - -4546760, -7494181, 12850542, -10114648, -1496259, 5943698, -2239826, 7892540, -8507256, 4433480, - -1641214, 12130598, -9672266, 10990284, -9851581, -3774740, 3331821, -4731444, 5446019, 3574487, - 3012383, -7050726, 7794292, -6359773, 57445, 1829656, 71941, -1643362, -2571075, 2026151, - 5374615, -2528662, 4089883, -10426570, 1915555, 2698313, -8253317, 6000070, 1835562, 3655554, - -4281009, 830002, 207232, -2386391, 1966021, 487479, 822486, -890669, 2156611, -792958, - -744640, -1085553, 725313, -119185, 1049583, 1367410, -440771, -945430, 2914135, -1796370, - 243203, -572304, -81604, -2814277, 1590749, -1954747, 1560147, -646929, 1949915, -1267552, - 1114544, 1047972, -198642, -2451890, 2932926, -1191317, 93416, 584116, -635118, -1181116, - 538482, -92342, -998580, 431644, 909996, 844498, - }, - { - 1951526, -1252520, -4450660, 17591650, -3061775, 5971615, -19012746, 4438849, 15155329, -4493610, - -1342177, -2172180, 4929012, 1711008, -6664716, 6905771, -10448582, 2665027, 5218386, 1537061, - -8198019, 11589969, -5337034, 3729642, -3327526, -9520869, 3167539, -1369021, -9149354, 10700374, - 2361158, 1968706, 1963874, -3059627, 964220, 1821603, -1794760, 4209068, -2830384, 6850473, - -3741454, 2296197, -4121558, -1649268, 1862942, -1991791, 336618, 8039642, -4155381, 4155918, - -1076426, -5590437, -2149094, 1104344, 1330366, 219043, 832150, 3549254, -1814087, -1007707, - -1184874, -1226750, 308164, 1119376, 2521146, -4012573, 1813550, -699006, -248571, -637266, - 798327, -874563, 1723893, -2705293, -93416, 949725, -143345, -324807, 1677185, -877247, - 52613, 1293859, -403727, 368293, -659278, -456340, -1469953, 1380295, -2007897, 1666984, - -294205, -61740, 1183264, 321049, 226560, -384400, - }, - { - 16724066, -54424216, 24016384, 16218333, 2622615, -229244, -6679211, 10845866, -2998961, 9867150, - -29236916, 9869298, 8449811, -15844134, 12715251, 3453154, -523986, 2774549, -205085, -4210142, - 2449205, 2014340, -3876745, 2466922, -905701, -826781, -2839510, 6432251, 7812009, -13349295, - -910533, 1897839, 856846, 5768678, -2393908, 651224, 3175592, -8968429, 1388348, 5872294, - -7933879, 1311576, 3837553, -3561065, 1435056, 3999688, -2183991, 2351495, -1664300, 3901978, - 57982, -2732136, 38118, 252329, 676994, -1644436, -5184026, 3423089, -1054415, 238371, - 3646427, -732829, 863288, -879395, 911607, -338766, -2291902, 691490, 768799, 116501, - 194884, -969589, 623844, -92342, 918586, -228170, 537408, -2114198, -1280437, -439160, - -796716, 1575716, -1374926, -634581, 849867, -1003949, 252329, 1002338, 1103270, -932545, - 1130650, 507343, 540092, -635655, -231391, -486942, - }, - { - 448287, 6634651, -9032853, 15345381, -2375654, 1223529, -19807852, 11365557, 2129230, 5767068, - 2703682, -26346940, 23375360, -14102525, 4283156, 3120831, 4329864, -9807021, 5224291, 5291937, - -14072997, 4913980, -9549323, 9849971, 787053, -3354370, -170188, 5004174, -2477123, 2615635, - -7850664, 4985920, -4202089, 4719096, 6729677, -7505456, 2442763, -7187091, 3899830, -5713917, - 1315334, -271657, 5739687, -4461934, -100395, 2415919, -2565706, 3275450, 180926, 644245, - 4545686, -4531191, -175020, -348966, 599685, -2886755, -2801393, 1971390, -2143726, 1848447, - -2724620, 3562139, -918049, 301721, -636192, 2759517, -2583423, -2193118, 3487514, 1781875, - -2218351, 187368, 1857573, 212601, -249108, -1234803, 2329483, -2800856, -848256, -776315, - 1190780, -1357210, -404264, -535260, 454730, 149250, 34360, 652298, -919660, 1036161, - 156766, 1289027, -439160, 186831, 399432, -1067836, - }, - { - 16133508, -50945292, 22196928, 6430640, 8043400, -3537443, -11391864, 12313671, 920197, -6473053, - -4886062, -5131949, -10255308, 13766444, -3438658, -466004, 7041599, -5843303, -7774428, 1607928, - 1829119, -209380, -28991, 3231963, -8385924, -570694, 7070053, 923955, -3607236, 2573222, - -3866008, -164819, -3471407, 7772280, -7465727, 2116345, -3626026, 5818607, -3962107, 1343251, - 6237367, 2172180, -9084930, 847182, 3152506, -7275675, 1183800, 1473711, 2120103, 1200980, - 3020973, -1214939, -876173, -3531537, -1597191, 3324305, -1464047, 1251446, -1532230, 1237488, - 2059437, -3098282, 1225139, -2407329, 3711389, -1664300, 1575716, 532039, -406411, -1537598, - 853088, -668941, -57982, 989453, -2013803, 1045825, -754304, -674847, -1480690, 153008, - 6979, -359167, 1414118, -320512, 1423245, -1261647, 406411, 1002875, -241592, -1040456, - -416612, -256624, 1267015, -649077, 394600, -1297080, - }, - { - 3932043, -8747238, 1968169, 7729868, 2339147, -1849520, -22146998, 18181670, -3309809, 3830037, - -809064, -12105365, 399969, 9071508, 5670431, -18088792, 12317429, -708670, -4087198, -1396938, - 2544768, -1189706, 5521181, 6648073, -9254581, 2428804, -771484, -5743982, 3870839, 2408403, - -8186208, 10273562, -1151588, 5949067, -11838004, 6634651, 569620, -566399, -3616899, 5836324, - -1320703, 4142496, -3505767, -443455, 3020973, -170725, -2520609, 3269007, 2726767, 4345970, - -634045, -3609383, -460098, 457414, -831076, -218506, -190052, 3064996, -1687385, 2042257, - -1031866, -1002875, 890669, 1019518, 823023, -854699, -76773, 2980171, -1726040, 729608, - -856846, -3758, 1760400, -1726577, 615791, 61740, 1741609, -1194001, -2136209, 990527, - 1548336, -1329829, 896574, 156766, -466004, 2329483, -551903, -305480, -814970, 44023, - -388695, 617938, 274341, -285078, 633508, 244276, - }, - }, - { - { - -4482872, 28839632, 76304392, 61546344, 2663417, 13988172, 4247186, 4619774, -6138045, 3905199, - -2973191, -18294950, -830539, -1454920, 11599096, -15888695, -936840, -6803228, 7468412, 1937030, - 11842299, -9400610, 2805151, -2087354, 14620069, -1771674, -5182952, -4300873, 6912213, -2089502, - -1600412, -4452271, 10584947, 9364639, 3853123, 12952548, -18254, 654983, 1224066, 2383707, - 5071820, 2677375, -8999567, -2144263, 6462852, 5727876, -1794223, -110595, -2606508, 529892, - 3830574, 4368519, 864362, 3654480, -3748433, -321049, 1378148, -193274, 1062468, 2030983, - -1656784, 1757179, 1085016, 966905, -401579, -3160022, -1963874, -1500554, -76773, 1246077, - -704912, 2110440, -654983, 849330, -2720862, 4781909, 1413581, 707059, 1231045, -3215320, - -4275103, -1117765, -706522, 1465121, 221191, 1032940, 338229, 1593970, -2112587, 1344325, - 1056562, -468151, -699006, -231928, -463856, 849867, - }, - { - -338766, 61415348, 15611669, 9440338, -21532818, 2443300, -3299609, 6394133, -1631551, 307090, - -1473174, -7240778, -2691871, -6294812, 319975, -22467510, 12042551, 175557, 1326608, -9340480, - 821413, -2894271, 19238770, -8172249, -6328635, -7420630, 5719286, 5753646, 7582228, -3056943, - 1290101, -3332358, -10959146, -5172751, 1697049, -8074539, 4212289, -11470247, -8075076, -5384815, - 6061810, 7973070, -6896107, -4566087, 5655935, 743566, -389231, -1331440, -2468533, 8692477, - -1590749, -5043366, -759136, 4623533, 1286343, 7335268, -1056025, 2297808, -3507378, 518080, - 374736, -2478196, -3925600, -1590212, -111132, -5529234, 6795175, 883153, 4900021, -1301912, - 5432060, -793495, -160524, 929324, 382789, -2499134, 846645, 2493229, 51003, -935766, - 28991, -1445793, 963146, -52076, -2120103, -1299228, 2304250, 2145873, 57445, -1854352, - 1767379, -1159104, 46171, -558346, 955630, 1686848, - }, - { - 380641, 59243704, 48001092, 42336568, 635118, 15008226, 8574902, 350040, 1510755, 9108015, - -5251135, -17617418, 7868380, 5167920, -5149129, -14354318, 11403675, 3655554, 2236604, -534723, - 3555159, 225486, -10012106, 1254667, 2330557, 4824322, -14513768, -18128520, -5068062, -6743099, - 10276783, 2444910, -1569811, 13202193, 840203, -2855617, 5487895, 8312373, -3521873, -1575179, - -1035087, -974421, 8238821, 8363912, 4868883, -8895414, 2909840, 6211060, 206695, -1698660, - 4402342, -2556579, -6953552, 3302830, 2627983, -4975720, -1792612, 743029, 1102733, 1414655, - -483184, 1181653, 1640141, 1957431, 326418, -931471, 5162014, 2567854, 1180042, -4600984, - 1174137, 1159641, 2928094, -685047, 165356, -4046933, -180926, 226560, -6979, -1546725, - 463320, 938987, -701153, 355945, 33286, 2727304, -1365800, 242129, -51003, 2112587, - 132070, -1199907, -243739, 2097555, 344134, 249108, - }, - { - -12965433, -93600224, 11103564, 47905528, 15134928, 2648384, -5536750, -22549, -9589588, 3934727, - 24285892, 3155727, 6387153, -3045132, 2965675, 17890150, 6890738, -1830730, -7762617, 6073084, - -8128763, 4532264, 4820027, 1049046, 9186398, 6004365, 2037425, 3870303, 12895102, 10055592, - -1724966, 2524904, 1289027, -10789495, 4014721, 2691871, -1365263, -6886443, -407485, -3709778, - 2429878, -2164127, 3537979, 3473555, 3887482, 5180268, 536334, 4088272, 3243237, -3252364, - 5898601, 3380139, -591632, -2377265, -1393717, -1538135, -1088774, 329102, -4570919, 3502546, - -89121, 1686848, 418759, -1439888, -623307, 1275068, 1467805, 1001264, -2708514, -1158567, - -1006096, -955093, 210453, -1321239, -690416, 1775432, 1180579, 592706, 853088, 995896, - 483721, -460635, -1238561, 347892, -469762, 507880, 1168768, -2232309, -1656247, -28454, - 741419, 98247, 235149, 1672890, 643708, -8590, - }, - { - 280784, 46764676, 59056, 2466385, -39307540, 6648610, 5394479, -1607928, 3771518, 11492796, - 1255204, -11431055, 4279935, -217433, -16392280, 19051402, 26164940, -5289789, 7523172, -8365523, - -4125316, 8746701, 7299834, -12686260, 12147778, -3869229, -9096204, -22466974, 720481, -20535312, - 10363756, -5583995, 4239670, -11470784, -5002563, 3631932, 1839857, -4620311, 5309654, 1415192, - 5276368, 911607, -806917, -4153234, 4014721, 5682779, -7584376, 3403225, 3831648, 12488691, - -1707250, -3879429, 4882841, 4713190, 3608310, 537945, 3716757, 701153, -1301375, 5381594, - -37044, -1482301, 2265059, 1849520, 4023848, 2126009, -4087735, 126702, -4682588, 2435783, - 915365, 996432, -3210488, 1045825, -541166, -1728188, -162672, -1001264, 1537061, 1014686, - 418759, 2005750, -1242856, 329102, -3324305, 1411971, 823560, -1049046, 831076, 1343788, - 468151, 1033477, -1182190, 387084, 115427, 602906, - }, - { - -15682536, -120856088, 18982144, 65122980, 29969744, -4514011, 4304631, -2905009, -2981781, 5942624, - 7777649, -19528680, -11659762, 9244917, -18276696, 2150705, -17572322, -10454487, -1418413, -12364674, - 9629317, -14058502, -9901510, 5478231, 10171556, -4277251, 6251862, -11213086, 19978578, -10095858, - -3325915, -3831648, 12777528, 10835129, 1889249, 2812667, -3924526, -9249212, 2401961, -2114198, - 8253854, -2933463, -1868311, -275952, -5413270, -7293392, -2016487, 3751117, 6029597, 3490735, - -3102577, 1628866, 4018479, -528281, -1092532, -1621887, -1995012, -2887829, 580357, -1323387, - 2394444, 4003447, -4621922, 5526549, -2177012, -1012002, 5303748, 1527398, -2064806, -296890, - -3376918, -2279017, 690416, 3534221, -2705830, 1056025, -699543, -1232656, 280784, 677531, - -1766305, -343061, 1240172, -12348, -449361, -435939, -936303, 1309428, -125628, 1339493, - 1347546, 510564, 43487, 308701, 717796, 1654099, - }, - { - -1073742, 45053672, -20771536, -2367601, -40050032, 6734509, 3884798, -2544231, 412854, 4087198, - -797790, -8554501, -17715130, -6356015, -4284767, 12298102, -5752035, -13150653, -2108292, -9127879, - 3032784, -3943854, -12318503, -6820945, 3287798, -2856153, 24058796, -22105660, -8840116, -5879274, - -15313706, -13260712, 5637145, -2702608, -1101659, -7940321, 664109, 2047089, -544387, -1126355, - 4842039, -4241280, -345208, 2389076, 8027294, -620623, 1736777, -2494839, 375273, 1052804, - 760209, 393526, 6613176, -2077154, 3469260, 461172, -493921, -2445984, 3239479, -5060009, - 460098, 354335, -2422362, 1714229, 1547799, -3830037, -89121, -3066607, 3737159, 3277060, - 1703491, 1487132, 948114, 30602, 1064615, -251256, -1708860, -2900714, -2763275, -1126355, - 1777580, -1459215, -1368484, 1408749, -1676111, 1819456, -1701344, -333397, -742493, 2377265, - 490163, -148713, -66035, -1893007, -774705, 718870, - }, - { - -14235132, -96278136, 29791504, 61176976, 29850022, 8715562, -7289633, -10312753, 4875862, -1081258, - 5609228, -21945136, 478352, 13081397, -19822884, 1300838, -3351685, 1022202, 13382581, 10632728, - 1532230, 376347, 22500796, -5738613, -11087995, 5625871, -671626, 2239289, -4132296, 6255620, - -5669894, -4024384, -727997, -2639258, 12090870, -1688459, -5740224, 1754494, -394600, 5862631, - -1082869, -2287607, 4660577, 7233799, 263067, 3247532, 1813550, 1385664, 795643, 4743792, - -3438658, -12179454, 5492190, 4766877, -1584843, 7055021, 2633352, 2602213, -1100049, 4789963, - 6404870, -5018670, 911607, -626528, -4942971, 3653944, 1817845, -677531, -46708, 255551, - 1910724, -2081985, -3576097, 2308545, -1946694, 647466, 7444789, -2734284, 1634772, 295816, - -1387811, -1977296, -792958, 688269, 2603287, 1785633, 656593, 297427, -813896, -399969, - 424665, 510564, 805843, -182536, -1189706, 1107565, - }, - { - -1804960, 38754564, -34475704, -1616518, -35203700, -1082869, 6202470, 4700305, -1883343, -3794604, - 3324305, -11288785, -5713917, 5170604, -5426155, -7887708, -1584306, -3618510, 19141596, -557809, - -3837553, 8811125, -649077, -1149978, 17872432, 4751845, 10720238, -11770358, 12353400, -4874788, - -2738579, 4350265, -21752936, 2378338, -11214696, 4840965, 8922795, 3805341, -1577327, 4395899, - -2051384, 2887829, 1789391, -6944962, 2721399, 5892159, 1193464, -6276558, 671626, 2050847, - 37044, -4748623, 1183264, 3518652, 1192927, -2850785, 3253438, -1150514, -3163780, 1406602, - -354335, 197032, -1329292, 30602, 319975, 309775, 4044249, 3678640, -200790, 477278, - 2210835, 585726, 3679713, 1701344, -1103807, -1379758, 1023276, 2826625, 785979, -817654, - -673236, -1232656, 646929, -629213, 7516, 2447595, -734439, -1162326, -1117228, -2100776, - 533650, -677531, -1184874, -1031866, -501974, -1263794, - }, - { - -8017094, -33328946, 36980744, 30870614, 2998961, 8695161, -8949101, -12361990, 10516764, -14118631, - -5706938, -7732552, 1393180, -17019882, -1250909, 16457241, 4964446, 7500087, -9989557, 13060996, - 3111704, 12058121, -6903623, 675384, -17580912, 763430, 6641093, 1042603, 18919868, 10800232, - 5258651, -811749, 7103876, -4774930, 414464, -4293357, -2723009, -125091, 202937, -838592, - -1599875, -7156490, 4340065, -10692321, 3725347, 4792647, -11287174, -134218, 28454, 5703717, - -908922, 5946382, 4151623, -3286187, 2279554, 1153199, -400506, -2699924, 3298535, 4216048, - 2527588, -1635846, -290447, -1331977, -170188, -1029182, 536871, 1767379, 6802155, 71941, - 715112, -650151, -1535451, -3638374, 1435056, -1784022, 2102923, -773094, 1133335, -1924145, - 1792612, 260382, -442382, -2620467, 2421288, -2069101, -576063, -826781, -1248762, -806917, - 324807, -42950, -1040456, 671626, 1667521, 1499481, - }, - { - -76236, 41194640, 25232932, 8623221, -13406740, 3605088, -19074486, 12307766, 23641648, -2561411, - 16917876, 1474248, -3274913, -4441533, -12097312, 2539936, -25176024, 8136279, 14166413, 4678830, - -10611790, -5369, -2301029, 4459787, -6022081, -8602283, 2014340, -4147328, -10136660, 20033874, - 10279467, 6615860, 4266513, 2448668, 2941516, 3891777, 3601330, 9716827, -1259499, 14377940, - -109522, 2210298, -1076963, 2889976, 715649, -4151086, -575526, 4191888, -4647155, 2948495, - -1389959, -1564979, 729071, 2151779, -248571, -4089883, 475668, 3623879, -4355097, -1691143, - 1056025, 1756105, -1474784, -862215, -1854352, -5026186, 5641440, -41876, -609885, -1426466, - 185220, -2848100, 1329829, -1693291, 769336, 340913, -2182917, 684510, 3028489, -1981591, - -2194192, -212064, 966905, 2456185, -2156611, -3216931, -492311, 3476239, -484258, 4480725, - 30602, -86436, 1064615, -428423, -234076, -1477469, - }, - { - -12283606, -108481208, 18961206, 30659088, 18592914, 24953224, 12961674, 12153147, -1122060, -10529649, - -44325136, 23794118, 22448184, -16109885, 6549825, 2846490, 8701604, 11500849, -577136, 3860102, - 14048838, 3277060, -3991635, -2239289, 2108829, 3988414, -5944235, 6244346, 7047505, -15465640, - -6221260, -270046, 5229660, 9252970, -6354941, 3124052, 10443750, -6169721, 979789, 3491809, - -5611375, 4240744, -1282048, -4011500, 6161131, 5425081, -2965138, 3177202, 2896956, 4756677, - -4505958, -4464619, 1335198, 2634426, 1171989, -3677566, -4165582, 8637716, 5283347, 1621887, - 164819, -3773666, 1604170, 1686848, 1656784, -1206886, -2067490, 1015760, -2073932, -3073586, - -2502355, -3204046, -1879048, -3780645, 162135, -545461, -390842, -3445638, -2629057, -1956895, - -634045, 3060701, -1768990, -2345052, -2684, -949188, -824097, -195958, 1339493, -1414655, - -197569, 317291, 1796370, 336618, 383863, -227096, - }, - { - -234076, 51933132, 22157736, 1258425, -19265612, -13864154, -26694832, 14337138, 6314676, 5217312, - 9405442, -21334714, 24902758, -14698452, -8342437, -16292422, -7948911, -4663261, 12680891, 3289945, - -21385716, -1300301, -12458626, 11163157, 11587285, 4145180, -1193464, 1584306, -4843650, 7894150, - -3425237, 3404299, -10512469, -2093260, 4326643, -9272834, 8053, -15973520, -2813204, -1435056, - 10333154, 832150, 694711, -8048232, 1406065, 4195646, -1684701, 4351876, 2384244, 987306, - 1792075, -12242804, -2067490, 2863133, 910533, -4092030, -6351720, -1696512, -2117956, 230318, - -7234336, 1212255, -1950989, 2463164, 388158, 3913252, -2064269, -2189897, 1911261, 489089, - -1423782, 341987, 1843615, -2069637, -2760053, -662499, 3266323, -3560528, -1687922, 57982, - 2425583, -2571075, -2617246, -544387, 1459215, -597537, -1723893, -826244, -2896419, 185220, - 970126, 1669669, -1212791, 909996, 652835, -1866163, - }, - { - -12437688, -101058968, 16285979, 14797236, 11887933, 6774774, -2981244, 13169980, 4867809, -29398514, - -20458002, -10951093, -29929480, 2319819, -4666482, 1996623, 1404454, -13603772, -13431436, -217433, - 5256503, -3365644, -10587094, -1216550, -18570902, -5313949, 15609522, 12817793, -3008088, -6585259, - -10653666, 169651, -3228205, 7223062, -6831683, 180926, -6358699, 13513578, -4157528, -2139431, - 5931350, 514859, -8674760, 1316944, 840203, -6660958, -356482, 1036698, 5916855, 2724083, - 5456756, -2820720, -7478612, -1961190, 4338454, 5472862, -3350611, -1492501, -2315524, 1696512, - 4231617, -587337, 647466, -7263864, 1504312, -2387465, 2186675, 3498788, 3119757, -534187, - 1767379, -2804077, -4112968, -689342, -4396973, 559956, -2306934, -1152125, -1725503, -1683090, - -1320703, -151934, 1996086, -140660, 3212636, -1423245, 15569, 2496450, -366683, -2014877, - -1088237, 584652, 4094178, 726386, 449898, -613107, - }, - { - -1429150, 24830280, 28164784, -2260227, -13288092, -22554484, -35943508, 17277042, 7279970, 6673306, - -8926553, -17107392, 1483374, 6848326, 996969, -23703388, 6081674, -967441, -6298033, 1754494, - 2851858, -7979513, 7490423, 13524852, -5607617, 7391639, -1644973, -11587822, 3638374, 1588064, - -3359201, 22934052, 1499481, 8313446, -6750078, 12313671, 3071975, -13959, -8020852, 2738579, - -3053722, 8050380, 1410360, 7711077, 10707353, 6447283, -18254, 8635569, 8305393, 5628018, - 4697621, 1108102, -2324114, 707059, 1533840, -55835, 1773285, 5250598, -4274566, 1873680, - 2234994, -87510, 1506460, 3875671, 514859, -791348, 2969970, 1196148, -2230162, 3009162, - -896038, -575526, 2197413, -1544578, 626528, 1871532, 4715337, -386010, -3965866, 1641751, - 2743947, -1465658, 2727304, 1484448, -629213, 2389613, -2054068, -1454383, 762894, 1407676, - 401043, 2132451, 1078574, -272730, 1748589, 683437, - }, - }, - { - { - 1350230, 101808976, -14503031, 20640002, 38388956, 12414066, 3110630, -132070, 8665097, -9302899, - -5192616, -7151658, -5890548, -9973988, 11929272, -10640781, -1409286, 5288716, 3876208, -9809705, - 12771622, -10890963, 6227166, -8224326, 8856759, 7098507, -3207804, -6770479, 3061775, 2683818, - -13397614, 9386651, 6941204, 4152697, 5705864, 6131603, 3962107, 1660005, 1465658, 703301, - 1941325, -1884417, 642098, -2574296, 2711198, 5628555, 979789, -2807298, -928787, -475668, - 2331630, 2162516, 6589554, -221728, -2528662, 3412889, -868120, -995896, 1779190, 588411, - -59593, -4832, 3609920, 1054951, -2784750, 1117765, -5929739, 1483911, -2362232, 1050120, - 2660732, 32749, -1707786, 545461, 387621, 485868, 1354525, 3369402, 119185, -2764348, - -3995393, -2607045, 611496, 1688996, 1485522, -978179, 2374043, -580894, -748935, -120259, - 646393, 570157, 733366, -570157, -904628, 261993, - }, - { - 2139431, 24499030, 34134252, -14110041, 15166066, -4140349, -3494493, -2616172, 8981850, -5733245, - 181999, -811212, -6829535, -3704946, -323196, -3251290, -4506495, 277025, -6826851, -1053878, - -4836670, 6191732, 7336341, -5652714, -453119, -7844758, -4707821, 6591701, 12649752, -1325534, - -947040, -9066139, -7432978, -212601, -5103495, 1842004, -1959579, -9605157, -8122857, -1093069, - 616328, 4956929, -9150965, 113280, 6405944, -4599373, 1889786, 1764695, -4656819, 6950868, - -2405182, -2514167, -590558, 2139431, 9385577, -1644436, 464393, 2459943, -1975685, -3486977, - 955093, -1982664, -124017, -1864016, -1862405, -1942936, 2244657, 3169686, 4432943, -885837, - 3564286, 1575716, -1285269, 1076426, -1267015, -8053, 497142, 375273, -1987496, -97174, - 2209761, -1545115, -2115272, 2785286, -1951526, -790274, 700617, 1376537, 760746, 1005022, - -2310156, -791348, -287763, 437013, 1354525, 1196148, - }, - { - -1371168, 87235080, 24251532, -7520488, 44567800, 10901164, 7180649, 6446746, -3707094, 37044, - 4475356, -15188615, 2549063, 3910568, -1651952, -13008382, 1065152, 3648038, 3191698, 5153961, - 6858526, -419833, -8805220, -2768107, 5825587, -1646046, -3725347, -19935090, -4122632, -7320772, - 13351980, -6465000, 3471407, 8316131, 4174171, -5480379, 6118718, 7073275, -5342940, 3314104, - -7477538, 5173825, 4643397, 7694434, 5461051, -4087198, 5034239, -1258425, -569083, 1374926, - 3420405, -773631, -5208722, -743566, 2907156, -3623879, 1275068, -1553704, 3694209, -1672353, - -624918, 1235877, 733366, 366683, 402653, 2527588, 2806761, 2540473, 137976, -540629, - 587337, 1420560, 1105954, -1855963, 1771674, -2632278, -2283312, -1093069, 996969, -439160, - -84289, 1119376, -834297, 1290638, -2077690, 3460133, -397284, 670552, -814970, 2243584, - 556198, -1041530, -777389, 1018444, -288300, -176094, - }, - { - 11821897, -78383688, -28942174, 46219752, 9999221, 10705206, -7208029, -3323768, -214748, 14944339, - 6511171, 6327561, 4110284, -4823785, 10437307, 5242545, 1524177, 8439611, -7818451, 5395016, - -3463354, 1546188, 6178848, 1749662, 8053064, 5829881, 4090956, 8550206, 7067906, 8606041, - 327491, 1888175, 678605, -7045357, -3573950, 289910, -5995775, 620086, -4891431, 2485712, - 1802813, -1282048, 3261491, -2349347, 8904004, -222801, 3123515, 5117454, 947577, -2877628, - 2595771, 6874632, -1478006, -996432, -3786551, 3162170, 348966, -3814468, -3665755, 5555004, - -379031, -2767033, 3399467, -2861522, 2160906, -30065, 2618856, -1161789, -4940823, 1819992, - -2208150, -4295, 813359, -1816234, -810138, 1631551, 279173, 1218160, 1365800, -234076, - -148176, 398358, -221728, -200253, -105227, -50466, 674847, -2103460, 291521, -976568, - 1381369, -1315334, 1334661, 1192390, -165356, -617938, - }, - { - 107374, 36960340, 11705933, -12811351, -12065100, -6012954, 3106872, 3806952, -1700270, 7338489, - 265214, -1822677, -335007, -913754, -4269198, 9899363, 15385110, 6476811, 2752537, -11055783, - 6451578, -11934640, 16368120, -2494839, 3060164, 507880, -11430519, -16602196, -6743636, -11443403, - 1605781, 1036161, -1394254, -2983392, -9650255, 2203318, -3805878, 7031935, 321586, 1736777, - 450972, 3256659, 683974, 2163053, -1735167, 5569499, 133681, -1672353, 2836289, 10039486, - 1690607, -6934225, 139050, 9701257, 2374043, 5229660, 2464774, -991064, -906775, 2847027, - 2289755, 234613, 612570, 2197413, 4554276, 1458678, -2057826, -2404108, 1477469, -1699733, - 2632278, 377420, -3134789, -56908, -1044751, -3063386, 188442, 77846, 1121523, 1746978, - 687732, 2007897, -2011655, -844498, -1543504, 1273458, -138513, 556198, -74625, -84289, - 2116345, 452582, -44023, -616865, 201863, 1199370, - }, - { - 13508746, -84147536, -46176804, 66787816, 16287590, 8158291, 2383170, -468151, -4221953, 4474282, - -2812667, 5634997, -6355478, -10631118, -11267847, -2405182, -23652922, -9392557, 3101503, -4213900, - 878858, -10414759, 26844, -4022237, 2190970, 5938329, 3187403, -5530308, 11096048, -3546569, - -9026411, 3281892, 11498164, 4975720, 2323041, -1208496, -3332895, 320512, -2797098, 2090039, - 3712462, -260919, -5642514, 3022583, -11645804, -3961571, 3715684, 355409, 5976447, 3573413, - -987306, -1199907, -710280, 1448478, 3053722, -5400922, -4062502, 1899986, 221191, 1806571, - 387621, -108448, 1325534, 1883880, -378494, 514322, 3189550, -576063, 972810, -1228898, - -3365644, 1655710, -2341294, 2084670, 346282, -2018098, 924492, -1105954, 478889, -481036, - -2985002, 3497714, -1187559, 85899, -372052, -974421, -132070, -1006633, 2269890, 1122060, - 482110, 1018444, -166430, 667867, 8053, 952946, - }, - { - 2144263, -16780974, 43761960, -16339666, -24133422, 2939368, 61740, -6042482, 6257231, 5476620, - -7132330, -7807177, -9937481, -7109782, 1080184, 5784247, -8806830, -8913131, -8566312, -9787694, - -111132, -3526168, -5306432, -2607582, 6219113, 775778, 2490544, -6765111, -10643466, 1606318, - -21692270, -13439490, 8473434, -4961761, -6497749, -28991, 1839857, -3976066, 3049427, -3952981, - 6593312, -3862786, -2553895, 8752606, -2688113, 939524, -872952, 4664872, -2874944, 2224256, - -2673080, 2078227, -127775, 2823404, 2855617, -453119, 1908039, -582505, -216359, -3678640, - -572841, 332860, -1794223, 656056, -1515050, -1231045, -1873680, 1088237, 1698660, 3030636, - 1770600, 2107218, -609349, 2384781, -522375, -472446, -365609, -2587181, -2693481, 1581085, - -1247151, -1108102, -808528, 1906429, -1635309, 1075352, 353798, -2370285, 172336, 2139968, - 594853, -566399, 115964, -1868311, -649614, -945430, - }, - { - 12784507, -53531936, -40072580, 52984328, 32631014, 12775380, -7900593, -8029978, -530428, 5971079, - -2979634, -9334038, -8841190, 9659918, 2616709, -8793409, -11470247, 14088030, 6094022, 15019501, - 5060545, -1128503, 11796665, -4159676, 4960687, -8951249, 7947300, -1654636, 3588982, -2864743, - -3389266, -2624762, -3920768, 5633387, 5632313, 1276679, -6702297, 2651069, 2885144, 7963406, - -1069984, -3563212, 2997350, 7789460, -1224066, 3552475, -804233, 4442607, 2098629, -104153, - -3325915, -5966247, 5182952, -141197, -1171452, 6665789, 1396401, 1286880, 1540820, 7273527, - 3854196, -354872, -1570884, -1945083, -3438121, 4467840, -823560, 1148904, 1196148, -558883, - 625992, -3113851, -1329292, -964220, 1086627, -265214, 5676873, -1078037, 1594507, 368830, - -303332, -415001, -1586454, 1609539, 1964411, 1137630, -774705, 1030792, 566399, -907849, - -155156, -279173, 821949, 887448, -1612223, 2079838, - }, - { - 2202245, -34957812, 45122388, -17801028, -18653042, -2827699, 1369021, 3699578, -851477, -4525285, - 285078, -5654862, -955630, -7394860, 470299, 30065, 3165391, -6931541, 3722126, 13673565, - -7522635, 6733435, 3442953, 8527658, 11105175, -4286914, 11633993, -14003204, 16528645, -10672457, - 14852534, -11569568, -11571716, -2837900, -13138842, 2400350, 13378286, 3238405, -1629403, 1817845, - 71404, -562641, 2861522, -7428146, 4557497, 844498, -936840, 1250909, -451508, 2828236, - -2673080, -2454574, -376347, 1974611, 2112587, -2263985, -877784, 1792612, -1765232, -880468, - 1351841, 329639, -1158567, 25770, -928787, 1810866, 2419140, 2538326, 1446867, 1846299, - 1444720, 3364033, 17717, -363462, 767189, -1837172, 2703682, 1142998, 1474248, -1870995, - 294205, 293132, -757525, -2326799, 2114735, 22549, -1239635, 806917, -619549, -1901060, - 373125, -1191853, -407485, -681826, -2740726, -777389, - }, - { - 5463736, 9644886, -1623498, 14336064, -173409, -9395241, 33851320, -8151848, -9658845, -13521631, - -7347079, -539018, -7357279, 3088618, -2887292, 4953708, 2748779, -6827388, 10210211, 2907156, - 11083163, -2913062, 787590, -11202348, -7574712, 12650289, -9507447, 8224863, 11565810, 14604499, - 4287988, 5790690, -12254615, 8529268, 6352257, -8014409, 543850, -8160438, 9974525, 1026497, - 4296041, -13653164, 1034550, -6663642, -1874216, 40802, -11274, -6082211, 1501628, -1353989, - 2263448, 5548024, 2313914, 4830228, -783832, -3238405, 3506304, -6524056, 1074, 8836895, - -1473174, -11811, 1206886, -279710, 1129040, -5133560, 4862977, 1628866, 5391258, -457951, - 797253, -589484, -4196720, 1315871, -1002875, 1436130, 121333, 196495, -1744294, -556735, - 1747515, -1093606, -1785633, -906775, 867583, -759672, -430034, -645319, -402116, -1809255, - 1395328, 1140851, -1797981, 387084, -592169, 1496259, - }, - { - -835908, 61262876, -199716, 7210713, -414464, -18003966, 2005750, 15685221, 1853278, -2771865, - 26856968, -4040491, -5506148, -7779797, -14706505, 6749004, -19047106, 4587025, 10968810, -8410083, - 8985608, -10787347, 4433480, -5550709, 7552163, -9563282, -1400696, 5009543, -1999844, 16655883, - 10021769, 634045, 3859028, 4193499, -12739410, 18403398, 5436355, 6062883, -1100049, 3398930, - 8423505, 3415036, -3666828, 1708323, -1724966, -1625645, 6785512, -2695629, 33286, -2239289, - -1197222, 2750390, -465467, -2123861, 325344, 1900523, -1298154, -755914, -3007551, -1523640, - 2035278, 2823941, -1621887, 1918240, -5284958, -2640868, 3733400, -2551748, 1551557, 569083, - 1518271, -2697776, -2536715, -113817, 1879585, -1132798, 238371, 1509144, -2206540, 719407, - -2047089, -1596654, 381178, 3694746, -1403917, -3260954, 584116, 1751273, 2203855, 2380486, - -502511, -431644, -866510, 2134062, -1288490, -451508, - }, - { - 7954817, -112769200, -3224447, 17062294, 14304389, 10513543, 39204460, -1023813, 2731599, -17031156, - -9236864, 1308891, 11835319, 7146289, -4396436, -5325223, 1048509, 14023605, 7536057, 4301947, - 10089415, 6337761, 2711198, -4815195, -1844689, 10682657, -8210904, 5396090, 551366, -10919954, - 882079, -4870493, 2998961, -2066953, 6226092, -4311611, 12582107, 1506460, 3907347, 796180, - -5621576, 1707786, -5477694, 5159867, 568009, -282394, 2510409, 2572149, 5086315, 500901, - -5995775, -1516124, 4528506, -949188, 5509370, -7361574, -730681, 6375879, 4123706, 1612223, - 2674691, -2733210, -1395328, 2644089, -617938, 1332514, -2695629, -113817, -795106, -6318434, - -205622, -2717104, -3583077, -2618856, -319975, -102542, -2660732, -530965, -2587718, -3780108, - 1271847, 1236414, -1433982, -976031, 81068, -702764, -2681133, 290984, 1489817, -894964, - 615254, -1195075, 790811, 2582886, -627602, -469225, - }, - { - 400506, 53145924, 7208029, 1581622, -10533944, -6047314, -19955492, 9653476, -567473, 2969433, - -115427, -5567352, 13405130, -11519102, -16944182, -4189741, -16699907, 6330245, 16094853, -14053133, - -8687108, -7253663, 1785096, 3517578, 11510512, 1319629, -2140504, -8766028, 12569222, 3157875, - 9519795, -8788577, -4156455, -313533, -5044976, -2000918, -10289668, -12353937, -5875516, 8272644, - 5676873, -4294431, 2228551, -4441533, -3191698, 3674345, 1796370, 2335925, 4808216, 1931662, - -1809792, -8101919, -423054, -577673, 2727841, -6466074, -1986422, -5640366, -2844342, 1735704, - -6535867, 994822, -4570382, 217970, 4600984, 1177895, -2214593, 3054796, -2568927, -1440425, - 867047, 383863, -2193655, 1246614, -1466195, -1204738, 880468, -421444, -3913252, 1591822, - 392990, -1637993, -1489280, 1702418, 1027571, 33823, -3997004, 503048, -3527779, 280784, - -543850, 581431, 1189706, 370978, -814970, -1134945, - }, - { - 8718247, -101567920, -13317620, 19938312, -2522757, -3420405, 29215978, -3986267, -6157910, -7323993, - -21974126, -4101157, -29250874, -4400194, -17530446, 12973486, 7735236, -15547245, -16100222, 9371619, - 2967286, 3524558, -18174154, -7199439, -7531225, -6273874, 9487583, 13829795, -197032, -10174778, - -11576011, 6439230, 235149, -2513093, -4321811, -2790118, 3385508, 1167157, 5785321, -166967, - 1188632, 870268, -9851581, 6624987, -7915625, 3528853, -4657355, 865973, 4130148, 4777078, - 2434710, -3204046, -3031173, 1227287, 2005750, -1599875, -18790, -2878702, 2342905, 1193464, - 1120987, 2742874, -528281, -7572564, 3362423, -3841312, -324270, 1786170, 4203163, 2866891, - -1627793, -737661, -5124970, 216896, -3536369, 1343251, -2825552, -1438814, -285078, -459025, - -1544578, 58519, 2863670, -307090, 882079, -953483, -346282, 1998770, 1391569, -2075543, - -1176284, 1903207, 1999307, 1712618, -5906, 833224, - }, - { - -66572, 59507308, -5701569, -1591285, -9918690, -18682570, -26866632, 8261907, 8293045, -1403917, - -8035884, -6191196, -331786, -15650324, -6248641, 21561810, -9753871, 409633, -3970161, -2223719, - -15722265, 6124624, 6285685, 3211562, 9119289, -3394635, 6429029, -12000675, -1895154, 17012902, - -814970, 3433826, 13093745, -8638790, 8982387, 5414343, 1847373, 9097278, -9422085, -4827543, - 322123, 3083250, 4221416, 10280541, 4091493, 9816148, -1069984, 9671729, 5169530, 2360085, - 11086384, -1168768, -3899294, 2764885, -1153736, 1236414, 2067490, 2463164, -635118, -520765, - 8153996, -923418, -3007014, 2733747, -170188, 1730335, 4325569, -2319819, 374199, 215285, - 1772748, -2497524, -313533, 452045, -662499, 7015829, 1093069, -2463164, -3858491, 3209951, - 315680, 1696512, 2038499, -1422708, 1010391, 397821, -1054951, 582505, 921807, -415001, - 2753074, 77846, 2090575, 83752, 746787, 146566, - }, - }, - { - { - 2621541, 113498808, -31434866, -45505180, -16387448, 6688338, 3369402, -4683662, 12765180, -5724118, - 930397, -1476395, -4806606, -8799851, 9031779, -7468412, 7291244, 19567872, -3917010, -32796370, - 491237, -13707925, 9641665, -2094333, 2220498, 1131187, 1602023, -3764539, -4490925, -2379412, - -11190000, 10875931, -1557999, -2514167, -881005, -2956011, 2382096, 2754148, 3806415, -1253057, - -4177930, -7395397, 1065689, -737661, 2037962, 3148748, -2143189, -5009006, 843424, -162672, - -3789772, -3703873, 5046050, -2299955, -4171487, 2234994, -611496, -2267743, -519154, -430570, - 1684164, 1608465, 3216931, 4407710, 846645, 3524558, -4042101, 409096, -3424163, -476741, - 449898, -526670, -2302103, -1613834, 1278290, -994822, -819265, 4289062, 1660005, -811212, - -1037235, -607738, 1823214, 1926293, 1185411, -1828046, 323733, -1036161, 625992, -525597, - 66572, 546535, 1247688, 539555, -132607, 1611, - }, - { - -1574642, -38419556, -16041703, -23359790, 16935056, -5950677, -2490544, -2133525, 10171556, -5297842, - -2197413, 2837900, 5893769, 7166690, 1061394, 4904316, -8822400, -13167833, -4155381, 15103252, - -1505923, -5152350, -317291, 5026723, 1220308, -12664785, -8968965, 4405563, 3487514, -3999688, - -1649268, -4856535, -6089190, -3703873, 2800319, 9583683, 3085397, -3077344, -4300873, 1257352, - -3180960, -1427003, -6024229, 1448478, -359704, -7058779, 2560338, 1883343, -5288179, 4413616, - -4747550, -1792612, -159451, -1305133, 5406827, -3842385, -92879, 1137093, 572304, -5162551, - -181999, 107911, 4027606, 749472, -667867, -498753, -1462436, 1136019, 2175401, -2019708, - 2212982, 1238561, -2394981, 235686, -1273995, 159988, -1089311, -2345052, -2744484, 348429, - 2782602, 981400, -346282, 3507378, -511638, -587874, -1227824, -821413, -409096, 1250909, - -2571612, -917512, -685047, 929860, 522912, -2015950, - }, - { - 406948, 39811124, -34553012, -52451752, 12463458, -1156420, 3573413, 3375308, -3341485, -2985539, - 3117610, -13634374, -2527052, -3322157, 861141, -2068027, -1971927, -1149978, 4515085, 7140920, - 3287261, 3136400, -2901251, -55298, 4417911, -9427453, 5202279, -8643622, 2279554, -19864, - 8392366, -11465415, 1377611, -3937411, -3296388, -578747, 3959960, 4012573, -2816425, 5145908, - -4526359, 5224291, -2881923, -3270618, 5122286, 7378217, 8213588, -2738579, -2155000, -1031329, - 1344862, 4261145, 471910, -2305324, 754841, -3601867, 4407174, 296353, 2933463, -4627828, - -1478006, 1248225, 354872, -3053185, -2939905, -23622, 249108, 1726040, -1289027, 64961, - 860067, 1560147, 1988033, -2296734, -1241782, -1754494, -728534, -928250, 1578937, -1161789, - -717260, 2229088, -786516, 1035087, -1765232, 1563905, -648003, 1566589, -454193, 603443, - -281857, 517544, -1029182, -397284, -707596, -508417, - }, - { - -12721156, -33964064, 22435298, 25370908, -7486665, 10660109, -2889976, -5004711, -4467303, 3434363, - -4645544, -1379221, -2693481, -8016557, -5274757, -3295314, 2064806, 11108933, -3775813, 8571681, - 6442451, 1727114, 5454072, -55835, 1417876, 801548, 1207960, 2960306, -998043, 983548, - -3322157, 2165201, 6255620, -6219650, -12300249, -7816841, -5189394, 5821292, -5305359, 4221416, - 1190780, -122407, 6912213, -1614371, 7672422, -8070244, -2417530, 1053341, -38655, 1876364, - 1349157, 1947231, -1446867, 1430761, -3104188, 4240207, 606127, -2665564, -2156611, 1415729, - -1833414, -1134945, 4334159, -2160369, 1989107, -2079301, 2626373, 730681, -2085207, 2668785, - -2012192, -881542, 616328, -1846299, -481573, 842350, -2165737, -935229, -171799, -925565, - -670015, 376347, 1244467, 682900, -91805, 106300, -451508, -2560338, 550293, -651761, - 1484448, -1321239, 1741609, -441845, 5369, 477278, - }, - { - -605590, 6204617, -4849018, -5094368, 5698885, -4067871, 1330903, 1460826, -5894306, 2098092, - 965294, 8140037, -175557, -11078331, -14306536, -12010876, -7604777, 5963025, -1312649, -8316668, - 9156870, -13172128, 15275588, -5739150, -660351, 8750459, 2626909, 436476, -1001264, -6367289, - -3598646, 2814814, -1480153, 559420, -107374, 6784438, 278636, 6887517, -4459250, 594853, - 3029563, 3481071, -2937221, -655519, -2316598, 4286378, 2764348, -909996, -2670933, 3671660, - 1385127, -6049462, -4122095, 3578245, -1165010, 3563212, 987306, -1145146, -2078764, 769336, - 1059783, 726386, 1800665, 3347927, 2718178, 418759, 125091, -1105954, 3867081, -4342749, - -170725, 485868, -2164127, -376347, 244813, -1749662, 1806571, 1020592, -249108, -353798, - 178778, 1667521, -2588255, -663572, -461172, 744103, -1251983, 807991, -884226, -1585917, - 1655173, 54761, -561030, -768799, 180926, 1096827, - }, - { - -15248208, -26445188, 22428856, 26043072, -25992606, 4932233, 6174553, -2090039, -10772852, -734439, - -2867965, 9695889, -4001299, -8716636, -8768713, -4660577, -10529649, 2314987, 4793184, -2622078, - 576599, -8031589, 4223564, -6481643, 3256659, 12109123, 2824478, -4013110, 9810779, 3571265, - -2547989, 5206037, 2511482, -1919850, -804770, -1014686, -4077535, -339839, -3436511, 1378685, - 2270964, 2121177, -6576132, -1098438, -11463268, -790811, 9170829, 142808, 2626909, -1761474, - -1988033, 2655364, -2572686, 66035, 4693326, -2753074, -2219961, 2950106, -848256, 442382, - -1404991, -848793, 4829691, 195421, -3617973, -473520, 1078574, -1269163, 3044058, 257698, - -1342177, 3785477, -2199560, -250182, 1520418, -68719, 1760937, -1583769, 137439, 3221, - -1978369, 3607773, -3469260, -1125818, 909996, -794569, 1407676, -786516, 1056025, 1352378, - 700080, 1917703, -729608, -486405, -756451, -1044214, - }, - { - -2147, -35017404, 36735392, -3869766, -384936, 3086471, -726923, -1313186, 6488622, 1973538, - -5395016, 1757179, -6242198, -8502962, -1395864, -9424769, -16602196, -4109747, -175020, -5425618, - -7765301, -4880157, 13979045, 2767570, -780610, 6174553, -635655, -3804267, 905164, 21727166, - -1020592, -7306276, 4184909, 3874061, -1649804, 350040, 1460289, -5719823, 7865159, -2510945, - 2801929, -5425081, -3040300, 9860171, -7601555, -1443646, -1991254, 1526861, -3666828, 5043366, - -4714801, -4472672, -7270843, 1663763, 1564979, -1967095, 584652, -458488, 484794, -1779190, - -2386928, -3936338, -1628866, 759136, -2464774, 802085, 397284, 2029909, 1350767, 1185411, - -706522, 3729105, 1531156, 1839857, 289910, -29528, 172872, 1997160, 492311, 1932735, - -1236414, -287763, -713501, 797790, -2956548, 148713, 1522566, -2134599, -425202, 503585, - -583042, -549219, 1074816, -1156957, -433792, -1489280, - }, - { - -14815490, -6765111, 15340013, 7113003, -15660525, 5867462, 2510945, 1824287, 2137820, 6442988, - 2942590, 5505611, -5577552, 5041218, 16214575, 4728759, -13905493, 12805445, 2044941, 6997039, - 1258962, -1371168, 3985730, -7941395, 8144869, -10189273, 7130183, -1144609, 10267656, -2070711, - -4248260, 3020973, 135828, 1122597, -2606508, 1508607, 1465658, 4806606, -1386201, 3904662, - 351650, -1390496, -4378719, 1435593, -412854, 5486284, -2137820, -1829119, -495532, 792421, - -2031520, 284005, 3235184, -6710350, -1334661, 6606734, 3646427, 2877628, -2270964, 2798171, - 2882997, 1209570, -3159485, -770947, 846645, 4876936, -2684, 2699387, 310848, -907312, - 1938641, -2168422, -2684, -710817, 1045288, -2187212, 3166465, -157840, 2275796, 526670, - 500901, 2059437, 150324, 2588255, 1316944, -169114, -1580548, 1029718, 1656784, -599685, - -521302, -634045, 401579, 994285, -1111860, 1047435, - }, - { - 1521492, -29921426, 57892400, -3823595, 4829154, 289373, -2518462, 2601140, -440771, -2652679, - -405338, 2678986, 3729642, -13237089, -1590749, 10116795, 15131707, -3444564, 4303021, 16420197, - -4938139, 4911832, -9990094, -1352915, 7212861, -11523397, 8697309, -10999411, 14300094, -10240813, - 17987860, -8375186, -9826885, -865973, -5915244, -328565, 9190156, -3456912, -9340480, -3035468, - -230318, -1564979, 1873680, -6243809, 4909148, -4153234, -3417183, 5306969, -1537061, 57445, - -83752, -815507, -3352222, -1695975, -343597, -2519535, 2131915, 3803731, -2680597, -2083059, - -383326, -1601486, 390305, 1454383, -1794223, 1746441, 870805, -717260, 542777, 1547799, - -736587, 1344325, -1083406, -591632, 2217277, -1491427, 167504, -1362578, -1056562, -2176475, - 2472828, 411243, -1808718, -2735357, 1881733, -343061, -529892, 2223183, 1017907, -137976, - 981400, -231928, -281320, 139050, -736587, 680752, - }, - { - -5399848, 67294624, 38191388, -4364761, -11905112, -9943923, 38082940, -12244415, -16401406, -15743203, - -3623879, 4402342, -31675, 10858214, -2249489, -8533026, -14431090, -21933862, 2013803, -3498251, - 5434208, -13805636, 8515846, 3681324, 6725919, 14063870, -13575318, 6561100, -7408819, -709743, - 377957, 4167192, -11267310, 8470212, 4387309, -3891240, 4804995, -13273060, 11228118, 6115497, - 6897718, -8450348, 3341485, -4854387, -4828617, 1064078, 6032282, -4575751, -1194001, -2728378, - 209917, 4434017, 3983582, -2289755, -6901476, -4456566, 3382287, -4101157, -2068027, 3686693, - -1582159, 806380, 142271, -1482301, 1189169, -6222871, 2924336, 1812476, 2225330, -2689187, - 1743220, 1298154, -3236795, 3183645, 529892, 1578937, 1825898, -19327, -4953708, -2410014, - 1750199, -2406792, -1977296, 2266669, 264141, -55835, 2049773, 401579, 195958, -908922, - 1207960, 887448, -1675037, 306553, -1659468, 311385, - }, - { - 16106, 45294188, -25884158, -11874511, 2122251, -3728032, 10402948, -2375654, -14257144, -11429445, - 12062416, -2938295, -408022, -14549202, -25694104, 13003013, 5658083, -1787243, -4296041, -11151883, - 8858907, -8471823, 10732586, -10767483, 13273060, -1092532, 611496, 14879377, 6707665, -579821, - -614180, -8597451, 773631, 8534637, -20201916, 6182606, -5966247, -686658, -2357400, -638340, - 1766305, -2602750, 781684, 6628745, -1023276, 572841, 5399311, -5864778, 3261491, 15032, - 387621, 1189169, -1667521, -5322538, -1010391, 1862405, -4998805, -1291711, 2884071, 3258807, - 1196685, 1857573, 3610994, 5112085, -309775, 1729261, 690953, -4667019, 2634963, 3167539, - 1228361, -2492692, -1833414, -2471754, -1487669, 939524, 3808026, 1122060, -4497905, 1551557, - -583042, -1327682, -391916, 1140314, -1101122, -1236414, 2448131, 2516314, 1485522, -430034, - -1735704, -1120987, -2542084, 1240709, -695785, 868657, - }, - { - -5981279, -122469384, -15280957, -4373888, 4240744, -22921166, 7501698, -4306242, 5464809, -8653822, - 7187091, 86973, -1068373, -5546951, -5930276, 6184216, -1427003, 5547487, 10522670, 4370129, - 2201171, 710817, 10867341, 3451543, -5850283, 8195335, -4898410, -922344, -1369021, -2121714, - 1364189, -7789997, 2055142, -7390028, 4891968, -7590281, 8567386, 5362267, 4108673, -374736, - -1238024, -334471, -9820443, 4788889, -1284732, -1735167, -1174674, -2344515, 3608846, -2321967, - -3664681, 2080375, 7920457, 1590749, 5989869, -6182606, -3461744, -1729798, -982474, -2631741, - -1202591, -2334315, 1623498, 1360968, -3780645, -755377, -3402688, 845572, 1119913, -4679367, - 276489, -2056216, -1291175, 1771674, -773094, -1620813, -1334661, 3188476, 694711, -1581085, - 1869385, -1610076, -979789, 1377074, 310311, -273267, -2492155, 526134, 2278480, -143345, - 1165010, -1072668, -113817, 2649458, -1306207, -1302986, - }, - { - -711354, 11768210, -26962730, 3099893, -4589173, 3704409, -11918534, 6234682, -2515240, -1276142, - -3597035, -3591667, 16842178, -6260989, -20696374, 11966853, 4162360, 13009993, 6578816, -10657961, - -1136556, 5782100, 10777684, -10356240, 4016868, -3474629, -1966558, -9227200, 5201206, -1455457, - 6202470, -8998493, 7369627, 834834, -3155190, -2014877, -12749074, -10718628, -2173790, 12706661, - 5183489, -4399121, 5035849, -2157684, -6685117, 3046206, 2558727, 13959, 1482301, -560493, - -3053185, -5667746, -1522029, -1724429, 7188702, -1883880, 544387, -2370285, -46708, 4910758, - -575526, 3371549, -6363531, -410706, 2991445, -2420751, -4293894, 2324651, -4118337, -928787, - 1430224, -1667521, -2306398, 3110630, -2388539, -1568737, 644245, 2927020, -580357, 2815888, - -26307, 41339, 288300, 1560147, 2037962, 2114198, -1491964, 2598455, -1896765, -1243393, - -2068564, 103616, 1629940, 687195, -1300838, -1263257, - }, - { - -7057705, -98912560, -7292855, 17723720, 576599, -12536473, 27945742, 3669513, 693100, 9635759, - -482110, 9611063, -19826642, 6027450, -17463338, 7249905, 2900714, -7573638, -7394860, 9040369, - 831076, 8076686, -7082401, 413927, 3097208, -5094905, 3782256, 6586333, -5204964, -10479720, - -9171366, 6244883, 1017370, -7456600, -4235912, 5571110, 8884140, -4570919, 3908420, -1500554, - -874563, 4735739, -390842, 12471511, -8298414, 5907728, -3475166, 1149441, -1231582, 4787278, - 2754685, -4831302, -388695, -207232, -3337727, -2811056, -1132798, -574989, 6021008, -2701535, - -1240172, 1406602, -1071058, -5858336, 3502546, -1664300, 25770, -871342, 803696, 321586, - 1034013, 1327682, -5879810, 1969779, -722091, 2922188, -1732482, -579284, 1712618, 967441, - 664109, 1906429, 1389959, -1584306, 972273, 207232, 388158, 1216550, 1904281, -123480, - 930934, 742493, -800475, 2106145, 401579, 736587, - }, - { - -566936, 59870772, -9744207, -4672925, 1207960, 6823630, -14387604, -2469606, 2194192, -2018098, - -1635309, 2293513, -2105071, 9245991, 24234352, 31976032, -941135, 4031364, 2335925, -11554536, - -16294032, 7067906, -6280316, -3967476, 10872173, -5866389, 9251360, -3257733, -2207076, 12955769, - -882079, -2971044, 10286984, -9250823, 7822209, 2211908, -6311992, -1955821, -7598871, -5028333, - -2248952, -201327, -535260, -454193, -6214818, 4459787, -5403069, 2103460, 1175747, -234613, - 9334038, 920734, -1214939, 1886028, -5210869, 294742, 1358283, 2558190, 3479461, -2998961, - 2916283, -1817308, -2038499, 821413, -1664837, 1474784, 2210298, -561567, 947577, -4396436, - 2081449, -1598265, -4174708, -1887101, -2048699, 1468342, -1960653, 622770, -604517, 1536525, - -979789, 1251983, -1337882, -1673964, 1236951, -1463510, -815507, 216359, -928250, -1120450, - 1739462, -1858110, 2843805, 886374, -532039, 6442, - }, - }, - { - { - -4447439, 113771536, -5532992, -60713120, -17794050, 7514582, 4105989, -1789391, 12902619, -7812009, - 4068408, -2722473, -2980171, -3130494, -1172526, 1700807, 3547643, 15830176, -4363150, -25338696, - -4204236, -8628589, 868120, 3672734, 977642, 1898376, 387084, -3926137, 348429, -9430138, - -1302449, 7704635, 3935264, -7623567, -3826816, 4247723, 4526359, -3432216, 2280091, 1218160, - -5971079, -3723737, -1061931, 1899449, 3367791, -402116, -3239479, -2647311, 501974, -1964948, - -2334852, -533113, 870805, -2252174, -3011309, -95026, -247497, -3764002, -993211, 889058, - -1002875, 3621194, -59056, 5521181, 2354179, 2091649, 555125, -4520453, -792958, -2668249, - 378494, 13422, -2964064, -464930, 33286, -20401, 1145683, 493384, 2201708, 772557, - -1034550, -413927, 462246, 2339147, -326954, 819802, -1484985, 461172, -823560, 815507, - 858993, -114890, 895501, -100395, 947577, 260919, - }, - { - -321049, -58269284, -2615635, 4285304, -16777216, -3316789, -2861522, 6474127, -1345399, -2967823, - 4656282, -2612951, 11964705, 4319127, -372588, -4106526, -1711545, -15078556, 1385127, 12167105, - 3425237, -9564355, 855235, 7600482, -979789, -5950141, -3435437, 719944, -6458020, 4146254, - -3660923, 492848, -11848741, -714575, 809601, 6990596, 3272765, 1919314, -5513128, 3514894, - -6622840, -4938139, 458488, -2640868, 467615, -3486440, 5149129, -2105608, -5234492, 1669132, - -2256469, -1021665, 209917, -348429, 655519, -1561221, 1330366, -1528472, 929860, -5149666, - 577673, 3337727, 838592, 889595, -1610076, 299037, -1093606, 1455994, 2235531, -2157684, - 471373, 1660542, -1285806, -84826, -581431, -690953, -2711735, -2021319, 823560, -501974, - -76236, 1926293, 1859721, 1010928, 1168231, -928250, -1548873, -957241, 595927, 482110, - -1014149, -387621, -419296, 69256, 278099, -2779381, - }, - { - 434865, -18435610, 814970, -32908576, -14950781, -1683090, 4221416, 5127654, -5701569, -4948876, - 10050760, -16388521, 547071, -8587250, -513785, 2188823, -2264522, -225486, -224412, 11427834, - -5909338, 12023761, -1110786, -3568581, 5506685, -4572530, -5835787, -1327145, 1429687, 3522947, - -944893, -1797981, -3416647, -1050120, -6990060, -817654, 3033321, 1906429, 207769, 921271, - 1345399, 470299, 2107755, -3473018, -934155, 9595494, 5219459, -454730, -2680597, -3293166, - 3125663, 7156490, -3880503, 1298154, 697395, -3974992, 3411278, 1122597, 695785, -3437585, - -1341640, -807991, 3571802, -5004174, -1316944, -227633, -1805497, 1387274, 1697049, -1794760, - -881005, 3854196, 1153199, -2039036, -2889439, -2970507, 2114198, 702764, -1210644, -454193, - 1161252, 535797, -103616, 1008244, -942745, -1352915, 1235877, 670552, 125628, -212064, - 413391, -63351, -43487, -927713, -98247, -564251, - }, - { - 14150307, -601295, -35464620, 12750684, 11872900, 4233227, 804233, -5663988, -6039798, -4016331, - 3974992, -6980396, -3850438, -1330366, -10261751, -4011500, 5059472, -1176284, 6059662, 11157251, - 5220533, 573915, -5892695, 3842922, 5577015, -3959423, -1130650, 1918240, 1521492, -1204738, - 857920, 608812, 8041790, -8097624, -6659347, -10162429, -2610266, 103079, -407485, 798327, - 3406446, 1173600, 5645735, 3068754, 4077535, -5709086, -3875134, 759136, -3869229, 5947456, - 469762, -232465, 2264522, 653372, -1164473, -53150, 901943, -1372779, -527744, -5350993, - 3502546, 1289564, 2400887, -1840394, -1130113, -492311, 2484639, 2146410, 738734, -1228361, - -869194, -3163780, 2009508, -54224, -1203128, 1067299, -1857037, -26307, -1887638, -941672, - -603980, 28991, 1263257, 2233383, -1418950, 417686, -1660005, -1198296, -857383, 687195, - 2168959, -2046015, 1882269, -607201, 234076, 430570, - }, - { - 377957, -37719476, 26203058, 5384815, -1317481, -1020592, -1674500, 1828046, -2656974, -1479616, - 5915781, 7947837, -1440425, -13236552, -14278082, -9495099, -12782896, 10207527, -18708878, 5349919, - 2806224, -403190, -4801237, 3441880, 344671, 1411434, 6026376, 4544076, -29528, -206695, - -10455024, 682900, 1413044, -2123861, 10220412, 3294240, 3627637, 4845260, -8847096, 149787, - 9908490, -5480915, 1407676, 1561221, -3441880, -1997160, 4968204, 245887, -3602404, 1494649, - 1921461, -2852932, -5711770, 1442035, -2957085, 4878546, -1111323, -490700, -1656784, 328565, - 952409, 1648194, 1647120, 1702418, 2782065, 1751810, -2502355, -2162516, 2216203, -345745, - -1579474, -1050656, 688805, -2540473, 1505386, 256087, 2478733, -81604, 297427, -1557999, - 85899, -447750, -905701, 898722, -2174327, 750546, -1309965, 751619, -1287953, -485868, - -11274, 183073, -715649, -150324, 732292, 928250, - }, - { - 16756278, -13580687, -23517630, -182536, 5786932, 227633, 543850, -3297461, 3172370, -11024107, - 5956046, -8491687, 4951024, -15569, -9165997, -8260296, -3357054, 477278, -10648298, 1017370, - 7958038, -9028021, 5323612, -14014478, 17925046, 9034464, -1679869, 164283, 2183991, 6382322, - 2150705, 9700721, -4851166, 140660, -976568, -2918967, -4165045, -2874944, 1213328, -1781338, - -453656, 3527779, -7623030, -3234110, -4168803, -3445638, 8080981, -4203699, 2894271, -324270, - -2149631, 5171678, -204548, 26844, -1852742, 3659849, 209380, 937377, -4525285, -886911, - -188442, 1204738, 3143916, -3059091, 1629403, -2452963, 477278, -1231045, 1879048, 870268, - 1979443, 2984466, -2438468, -2550137, 2558727, 1473711, 652835, -1477469, -836445, -444529, - -374199, 726923, -1475858, -953483, 986232, 360777, 1305133, 358630, -1214402, 1021129, - 748935, 2113124, -767725, -102005, -1292785, -1089311, - }, - { - -1590212, 885837, -8295730, 6650220, 2043331, 850404, -655519, 4871030, -1709934, -909996, - -3861176, 3751117, -5291937, -487479, -4490925, -10744398, -19495394, -11842299, 6150393, -3023657, - -11901354, -3735548, 12377559, 5985574, -367757, 2123861, 3497714, -6662031, 2189360, 21437792, - 3733400, 468151, -5976447, 11664057, 1284732, -6521908, 7371238, -7363722, 5150203, 3969624, - -1269163, -4959077, -4234301, 6886443, -2115808, -1866163, -2512019, 2842732, -6702834, 5286568, - -1347009, -5797669, -3546569, -1478006, 2305324, -5590974, 1632088, -436476, -836982, 1254131, - -2576444, -2546916, -1670205, -2900714, -1423782, -168041, 2477123, 1236414, 453656, 725850, - 2660195, 2663954, 1771137, -1080184, 741419, 1580548, 233002, 814433, 3669513, -2319282, - 81604, -95563, 1607928, -1250909, -1887101, -664646, -209917, 331249, -1939715, 737124, - -1061394, 275415, 79994, -852014, -1130113, 191663, - }, - { - 17732310, -3774740, -17266842, -17226576, 5059472, 2291902, 6064494, -3115462, 3809636, 2706903, - 19835232, -4755603, -4160213, 5726802, 8138963, 16050830, -12292196, 1095217, 3811784, 7461432, - -1303523, 365072, 5296769, -5280663, -19327, -5444945, 4511863, 1374926, 6425271, 1062468, - -3474629, 2346663, -1335198, 959925, -3988414, -2314451, 9091909, 2024540, -3550864, 79457, - 826781, 1366337, -6388227, -2752000, 3310883, 2335925, 2472291, -4788889, 2593624, 230854, - -4058207, 2852932, -2719251, -53150, -1823214, 4435091, 2148021, 5298916, -1827509, 45634, - 3994857, -1447404, -543313, -875100, 2596845, 3274376, 1059246, 1818919, -568009, 1171452, - 1680943, -3910031, -62277, 1968169, -1382980, -967978, 879395, 1828046, -228707, 1115081, - 456877, 2566780, 388158, 1658931, 1584306, -1093069, 25233, 963146, 1363652, -935229, - 14496, -1132261, 1191853, 906775, -199179, -1051730, - }, - { - -2460480, 35443680, -16487843, 11696807, 3757560, 2581275, -2606508, 89121, 962610, -366683, - -3183108, 6367826, -245887, -9795747, -4449049, 8980777, 13253732, -246961, 2921115, 7504382, - 3477850, 3656628, -3908957, -7264401, 4639102, -7631083, 4791036, -2660732, 3183108, 4862440, - -3378529, 1146756, -7029788, -3098819, -1450625, 149250, 3740380, -105227, -12957916, 624381, - 2386928, -3802657, -575526, -6501507, 4009352, -3147137, -1156420, 2502355, -1544578, -1549410, - 1263257, -1162862, -1814624, -3428458, 1765232, -3206193, 2386391, 2585570, -1727114, -2215666, - -2074469, 76773, 1290638, -1088774, -589484, 301721, 1388348, 328028, -22549, -1092532, - 169651, -450972, -71404, 1225139, 664109, -906775, -41339, -1785633, -1432909, -981937, - 851477, 714038, -1898376, -421444, 832150, 221191, -966368, 1408212, 1071594, 2222109, - -1077500, 1442035, -954557, -394600, 352724, 1389422, - }, - { - 5996311, 103329400, -9637907, -1889786, -16936666, 2253784, 20498268, -3635153, -14235132, -8203388, - -12679280, -1724966, 5503464, -776315, 10312216, -7864085, -17727478, -12895102, -2854006, -11382200, - 5054640, -12913893, 6316823, 6615324, 7354058, 15023796, -10510859, -53150, 1092532, -6367289, - -1450088, -1316944, 1181653, 5425618, 2793876, -8154533, 5555004, -5319317, 155156, 6795712, - 4068408, 1390496, -9747428, 270046, 1627793, -3362423, 3732327, 3746822, -2372433, -3554622, - -1502702, 1968169, 11440719, -8047158, -5397164, -396211, -2761127, -2935610, -316217, -1839857, - -498753, 2900177, 639950, -3745748, 2073932, -2630131, -2579128, 3401614, 842887, -3585761, - 4052302, -505732, 556198, 637266, 744640, 695248, 1638530, -1186485, -3475702, -1487132, - -313533, 1446867, -3846680, 587337, 969589, 747861, 3546032, 616328, 421981, -969052, - 1052804, -877247, -114354, 152471, 256624, -1711008, - }, - { - 192200, -8720394, 21160766, -8390755, -3484829, -3893388, 14208289, 557272, -15083388, -5320391, - -3999152, 2858838, -3448322, -3105798, -15653008, -3299609, 10594611, -8747775, 4611721, -14246407, - -6089727, 11297911, 10760504, -18407692, 11040750, 5599027, -2785286, 4563940, 16215649, -12250320, - 5469104, -5096516, -1299765, 1327145, -6731825, -10560788, -1443109, -4437775, -180926, 3003793, - -4578972, -5488968, 5706938, 1030792, 3594351, 3409667, 3033321, -3889630, 2707440, 26844, - -1844152, 3040300, -2415919, -7856569, 2012729, 555661, -285615, -5549635, 5533529, 3823595, - 157840, -2398739, 5334887, 3806415, 3947075, -73014, -172872, -1844689, 584116, 5364951, - -2327872, -1533840, -987306, -1046898, -3868692, 208306, 3073586, 682900, -841277, -1216013, - 2391760, -2356863, -1418413, -1269163, 955093, 39192, 3530463, 1239098, -322659, 187905, - -369367, -1787243, 82141, -1702955, -32749, 914828, - }, - { - 3674882, -133233640, -8039105, 439160, -6259915, 229244, -22420266, -2069637, 1413581, -4095788, - -6376416, 10768557, -9536975, -523449, -12122545, 2345589, 13429826, -8663486, 16879222, 6834367, - 1354525, -3082176, 4878546, 5114769, -2585570, 4462471, 4799089, -6926709, -4638565, 5628555, - -4463545, -5627481, 2906619, -3031173, 348966, -7737384, 5326833, 5951751, -592706, 3689914, - 3681324, -4698158, -4297652, 2398739, -3336116, 502511, -2995740, -6505802, 3826816, -2273648, - 4027606, -1451162, 2316598, 5080947, -1642288, -1233193, -1236951, -2799245, -4781909, -809064, - -249645, -3611531, 1847910, -980863, -3986267, -452045, -1659468, -1846299, 3491809, 411243, - -3706020, -1379758, 1603097, 1887638, -2751464, -484258, -2254321, 2670396, 2738042, -2201708, - 1481764, 60666, -98247, 1990181, -1343251, -1677185, 210453, -885837, 1137630, 2505577, - -217970, -763430, 387084, 461172, -806380, 1082332, - }, - { - 277025, -29930554, 2793339, 1950989, 2611877, 729071, -7844758, -803696, 2961917, -2813204, - -6990060, 6089190, -5477694, 11725261, -3766686, 11141145, -8104604, 17885318, 2161979, -7133941, - 2615635, -4377109, 16305843, -5195300, -13871671, 9650792, -7062000, -3227668, -6295349, 4500589, - 6602976, -14532022, 8404714, -6230924, 10819559, -7797513, -3367254, -8079907, -1364726, 6496675, - 2895345, -962610, -2322504, -156766, -2498060, 1515050, 3745748, -2645163, 926102, 1370632, - -6861747, -3790309, -1471026, -318364, 5450851, 1108102, 132607, 2051384, -2072322, 3188476, - 3624416, 2567854, -6553583, 1556926, -1218697, -1963874, -4509716, 3515968, -2085744, -227633, - -1245004, -244276, -1056025, -403190, 2378875, -2357400, -1323924, 3133716, -538482, 3734474, - -3419868, 2236604, 2758980, -2653216, 4327717, 2336999, 338229, -587337, 729071, -3216931, - 88047, 1028645, 2483565, -1964948, -881542, -645319, - }, - { - 5792301, -94302984, -16056735, 8788040, 4922570, 3534758, 5674726, 9230422, -5931350, 10967736, - 3221226, 3929895, -8549669, -4570382, -7835631, 5257040, -2086817, -8377871, 7244536, 332860, - 2911451, 5760088, -8286603, -784368, 12763569, -5713917, 3399467, 1173063, -2520609, -7431367, - -9339406, -1086627, 2095944, -3794604, 3798899, 3140158, 2371896, -4612258, 5186710, 2003602, - -3113315, -3900367, 7606387, 7424925, -9467719, 3594888, -1156957, 4009352, 1194538, 2552821, - 571231, -2784750, -1262720, -576063, -5920076, 2552284, -3919695, 3542274, 3993783, -3067681, - 3336653, -2843805, -2937758, -1819456, 346819, -1310502, 1423245, -1940788, 878321, -600222, - 752693, 716723, -2079838, -1346472, 2623688, 18790, -137439, -1735167, 1249299, 477278, - 1832340, 2098629, -16643, -460635, 286689, -542777, 2966749, 140660, 115964, 928250, - 623844, 35433, -912144, 1696512, 1707786, -4295, - }, - { - 609885, 28419262, 12946105, -13696651, 10355166, 2823404, -11425150, -1960653, -2604361, 684510, - 4566624, 2401961, -6613176, 37044, 52470004, 6118718, 8699993, 3512747, 14582488, -11875048, - -7833484, -2546916, -2581275, -1161789, 5452461, -6648610, 2692408, 1440962, 5359046, 10067403, - -159451, -9663676, 8880382, -8766565, 7358890, 1144609, 1187022, -10369662, -6684580, 337155, - -1721745, -7124814, -3053722, -2480344, -357556, 1519345, -2684892, -1372779, 2483028, 3721589, - 3959423, 2145873, 208843, -971736, -6205691, -46708, 4157528, 1612223, 4348118, -2499134, - 1540283, -1076426, 450972, -2404108, -3018288, 3042448, -515933, 4668630, -754304, -2360622, - 673236, -3805341, -1154273, -648540, -471373, -3209414, -477815, 1361505, -619012, -1920924, - 462246, -418222, -1540283, 1005022, -183073, -1843078, 71941, -524523, -2170032, 237297, - 240518, -1077500, 2039573, 783832, -404801, -725850, - }, - }, - { - { - 5102421, 100581688, -6474127, -33172180, 5548024, 5698885, -16643, -900869, 16603270, 1442035, - 1475321, -11895449, -4654671, -674310, 124017, -1311039, -2187212, 12134893, -5849209, -3991635, - 18676128, -4326643, -3064996, -3009698, -8426189, -5453535, -2108829, 314069, 11295227, 3540127, - 5141076, 5095979, 10310069, -2027225, -2440078, 7029251, 8540006, -1802276, 413391, 5149666, - -1078574, -1181653, -2622078, -1147830, 645856, 1871532, 748935, 2815888, 1401770, -3117610, - 1350230, -136902, -2343442, -2310693, -4664335, -3251290, -519154, -4756140, -2362769, 8053, - -2940442, 1471563, -4270808, 2682207, 1242856, -1392643, -536871, -3454764, 823560, -2309082, - -1215476, -28454, 254477, 1804423, -911607, -1393717, -656593, -1038845, 1174137, 740882, - -1778653, -547071, 106837, 707059, -1283122, 660888, -1259499, 779000, -1105417, 1287417, - 1428077, -818728, 532039, 213138, 900869, 488016, - }, - { - 1148904, -16487843, 33478196, 21979496, -17253420, -4578972, 628676, 10343355, -2134599, -3041374, - -1639067, -8003672, 6112812, -764504, 1083406, -8255464, 6033356, 4358855, 12207371, 7541426, - 6963753, -8637179, -3566970, 400506, -2524367, -1301912, 1634235, 3272765, -7417946, 4176319, - 1850594, 6358699, -11087995, 1322850, 544924, 690416, 1065689, 6471979, -4457103, 2660732, - -3638374, 2959769, 3400004, 306016, 7068980, -700080, 2582349, -6433324, -6089727, 3040300, - 3467112, 3336116, 1115618, -1539746, -4439386, -2379412, 3036005, -106300, -1040993, -5822365, - 3937411, 3695283, -2622078, 163746, -2595771, 1155346, 2329483, 1947768, 2655901, -2297271, - -1418950, -361851, -643708, 949188, -178241, -337155, 306553, 1589138, 2058363, 1078037, - 1222455, 839129, 795643, -377420, 389768, -115427, 256624, -366683, 391379, 861141, - 2222646, 1819992, 445066, -632971, -28991, -1792075, - }, - { - 155156, -80633176, -37771552, 12735115, 5561446, -3390340, 6076305, -1910187, -10265509, -2882460, - 7128035, -15818365, 6347425, -3243774, 7439420, 10686416, 550293, -11688753, -15070503, 5114233, - -6964290, 7363722, -4342212, 1502165, 5316096, -6543383, -10757282, -1348083, 1280974, 89657, - -166430, 369367, -8217883, -256624, -1749125, 797790, -2379949, -7377143, -4731444, -879395, - 3918084, 1963337, 4566087, -5567352, -7159174, 4758287, 1375463, -672699, 603980, -1935420, - 2763275, 4238059, -4187593, 3967476, 545998, -2667175, 2900177, 763430, 2339147, -2215666, - -2056216, -2253784, 3163244, -1154273, -815507, -2048699, -1456531, 230854, 1141924, -2241973, - -2235531, 769873, 969052, -345208, -2894271, -2070711, 4002373, 2054068, -740345, -533650, - 1298154, 756451, -789737, 1179505, -478352, -1999307, 1058173, 1633161, 1453846, 861141, - 933619, -847719, 631360, -76773, 289910, -405874, - }, - { - -13597866, 1911261, 5051419, 8906688, -1347009, 1999844, 1669132, -6715182, -6038187, -9734007, - 1156420, -3524021, 1724966, 3754875, -6107444, -2013266, 3646427, -3398930, 1527398, 5496485, - -513785, -1671279, -8347269, 507343, 8316668, 2201171, -4683662, 2574833, 537, -2476049, - 6379637, 1129040, 3907883, -4239133, 2309619, 3658239, 5527623, -1639604, -325881, 60666, - 8801462, 3610457, 3820374, 2371896, -643171, -723702, 269509, 1286880, -3795141, 2775623, - -973347, -91805, 2573222, 1233729, 473520, -913754, 892279, 1472100, -1066226, -5200132, - 3433826, -1695438, 3131568, -92879, -1273995, 2972117, 2477659, 2305861, 1554241, -2708514, - 22549, -773094, 2226404, 1702955, 4832, 965294, -1287417, 587337, -1374926, -792958, - -381715, -96637, -28454, 1968706, -945967, 536334, -1078574, 665183, 146566, 415538, - 879931, -1990717, 1074279, -1261647, 527207, 430034, - }, - { - 249108, -50768124, 15869367, 9508521, -5370857, -149787, 1129576, 2837900, 1129040, 528281, - 5337034, 5206037, -217433, -9468255, -5123896, 6338298, -12598213, -395674, -15163919, 2538863, - -4545149, -5969468, -17506286, 7640747, 6457484, -7179575, -1093606, 3242164, -1997160, 4332549, - 455267, 267362, 1008780, -4255239, 1506997, -1188632, 7795903, 5661304, -4671314, -1714766, - 10501195, -6038187, -3552475, 543850, -2218888, -1420024, 1142461, -1501091, -4235912, -549219, - 1961190, 2250026, -2595771, 1629403, -441845, 4182225, -3341485, 271120, -2677375, -2768643, - -1922535, 847182, 1242856, -1111860, -321049, -539018, -1850594, -1472637, -249645, 1410360, - 1170916, 900869, 268435, -2974265, 2176475, 1239635, 3215857, -955630, -472446, -1813550, - -70330, -779000, 238908, 1585917, -3516505, 498753, -584116, 681826, -1220308, -658741, - -1204738, -180926, -719407, 280784, -53687, -488016, - }, - { - -13888314, -24870008, 16313896, -3171297, -4729833, -3624953, 974421, 6293201, 10038412, -12192875, - 6275484, -12235825, 7698192, 4958540, -7422777, -5400385, -3257196, 729071, -6223408, 1671816, - 4509716, -6756521, 6783364, -11433740, 15615964, 4059818, -675384, -1794223, -5322538, 2508798, - 2276870, 3726421, -5791764, 5281736, 3288871, -3463891, -6571300, -5992553, -1467805, -3260417, - -2241973, 1755031, -6425808, 505196, 3184718, -1583769, 5401995, -8298414, -1656247, -2485712, - -5986111, 2556579, 3692061, 3690451, -3136937, 2416456, -249645, 685047, -2865280, -468151, - 1262720, 1745367, -374199, -2899640, 3104725, -1676648, 1252520, -1260036, 1277216, -103616, - -112206, 1143535, -1568737, -2185602, 572841, 860604, 985695, -429497, -493921, 1074, - 137976, -17717, -1139777, -1283658, 591095, -421981, -286689, 223338, -1682017, -93952, - 168577, 839666, -1080184, 585189, -586263, -705448, - }, - { - 503048, 14470819, -14491220, 1902134, -3888556, 396211, -376883, 2246805, -8101919, 801548, - -1031329, 6090801, 2097018, 4677220, -2553358, 1826972, -2959769, -6753299, 8738111, -2020782, - -16493748, -7885560, 1072668, 3482682, -5295158, -1587527, 9215389, -3429532, 1117765, 8084202, - -1832340, 4373888, -1410360, 9597104, 941135, -7003481, 7238631, -3805341, -409633, -1809792, - 59593, 2069637, -346282, 3741454, -529892, 608275, -3155727, 5027796, -1235877, 4903779, - -2494839, -3413962, 907312, -4851703, -1586990, -4687957, 3072512, -798327, 905164, 4710506, - -1938104, -1805497, -1413581, -2762738, -459562, 1053341, 3582003, 209917, -313533, 864362, - 2073932, 34360, 1082869, -809601, 856309, 507880, -1567126, -1166621, 3675418, -2253784, - 1214939, -1670205, 344134, -1346472, -968515, 1238561, 149250, 1134408, -2190970, 308701, - -1681480, -148176, -339302, -873489, -1088237, 919123, - }, - { - -17801028, -19022410, 20524574, -24596204, -6451041, -3655554, 7316477, -1882806, -347355, -4284230, - 21369072, 1342714, -1073742, 6717329, 355945, 4625143, -9514963, 3404299, -2136746, -3722126, - -6752226, 1414118, 10147397, -2402497, -239981, -476205, 2385318, -3991635, -1358820, 345208, - 2393908, 4866198, -6778532, -6564858, -2764348, -1955821, 5075041, 216896, -4693326, -3456912, - -1204738, 3610994, 1341104, 1747515, 1899986, -1289027, 4949950, 3224447, 7191386, 1870995, - -3103651, 1746441, -1594507, 4308389, -679142, 1602023, 200790, 4165045, -2822331, -127238, - 1726040, -3264175, 2531346, -1404454, 485868, 3407520, 714575, 2216203, 695248, 1563905, - 1282048, -3937948, 567473, 2814814, -1579474, -1049583, 31139, -81068, -2817499, -118112, - 166430, 1743220, -1657857, -1044214, 244276, 364535, 1207960, -484258, -33286, -469762, - 792421, -1569811, 193274, -92342, 710280, -355945, - }, - { - -1096290, 22863722, -48716740, 4384625, -3584687, 499827, 177167, 1532230, 1651415, 1170916, - -6517613, 920734, 9878962, 4406637, -5288716, -11453067, -5768678, 2181307, 5257577, 1313186, - -3141232, 1765768, 559420, -71941, 4474819, -10464688, 10659035, -3121368, -4470524, 5187784, - -6066105, -424128, -5192079, -129386, 3468723, 4292820, 1616518, 5120675, -8376260, 4873714, - 3524558, -3835943, 1183264, -7276212, 3273839, 19864, -2238215, -3571802, -2619930, -1080721, - -1363652, 133144, 963683, -3163780, 1169305, -3365107, 2312840, 344671, -1580011, 359167, - -1574642, 949725, -137439, -2671470, 929860, -1345399, -362388, -1034550, -925029, -1097364, - -581431, -780073, 983548, 1224603, 663572, 116501, 1744294, 615254, -455803, -645319, - -151934, -8590, -1011465, 484258, -661962, -478889, -454193, 896038, -102005, 1141388, - -1005559, 1418413, -1461900, 824634, 1548873, 307090, - }, - { - -5032628, 81429360, -20787642, 3922916, -6858526, 4976257, 8598525, 7422241, 161598, -4347044, - -15068356, -3493419, 3203509, -9446244, 5099737, 7793218, 1844689, -4328254, -6578816, -24332064, - -3557307, -9578851, 193810, 3588982, -4310537, 11113765, -2524367, -135828, 3911105, -5563057, - 2818036, -2515777, 3937411, 6885907, 1785096, -5778879, 2079301, -8104604, -5666136, -2416456, - -1225139, 5008469, -7890929, 1080184, 2760053, -5337034, 1213865, 7301445, 2434173, 1880122, - 56908, 810138, 10597832, -969052, 3030100, 802085, -4175782, -2244657, -616865, -7714298, - 92879, 3246995, 575526, -3629784, 556198, 573378, -1924682, -774705, -1093069, -1598265, - 3069291, -699543, 1687922, -2254321, -1624035, -1457068, 1530082, 2042257, 813359, -287226, - -1769527, 1338419, -2413772, 850940, -795106, 397821, 2537789, 291521, 2062121, -456877, - 1497870, 484794, -414464, -1417876, 466004, -1306744, - }, - { - 1156957, -43517684, 893353, 4450660, 466004, -1569274, 16324097, 4517769, -6480569, -2479270, - -4575751, 8884677, 2028835, 972810, -3024194, 5317170, 5295695, -10602127, 9815074, -9654013, - -8583492, 7092602, -3675955, -19690814, 4559645, 1528472, -2940979, -1874216, 5000416, -17920214, - 9718437, 1792612, 1897839, 1314260, -4889821, -11631845, -3109020, -7304129, 312996, 1238024, - -6604586, -2837363, 3246995, -5465883, 5683316, 5131949, -2604361, -6198175, 2296197, 2535105, - -2068564, -49392, -943819, -1857573, 6516003, 2853469, 1580011, -6512244, 4607963, 4001299, - 1346472, -4275103, -1235340, -424665, 4198331, -3058017, -1541356, -1836635, -959925, 5011690, - -1381906, -1058173, 504122, 25770, -2874407, -406948, 992674, 1934346, 379031, -3118683, - 1616518, -2135136, -78920, 1332514, 3623879, -588411, 1457068, 993211, -71404, 2048699, - 732292, -1308354, 1742683, -1690070, -1139777, 1054415, - }, - { - 1550483, -109188272, 31849866, 18242874, -12984760, -1420024, -25272124, -5055714, 1263794, -4468377, - -31805844, 1097364, 92879, 7098507, -15065672, -15729244, 590021, -12715251, 15930571, 119185, - -2605972, 1316408, -5277441, -4705137, -3377455, -594853, -288837, -3151969, 886374, 8599598, - -19327, -2109366, 800475, -7707856, 3270618, -2217277, -2377801, -4485557, -10581726, 4260071, - 8576513, 1449552, 191663, 139586, 3085397, 3093987, -5712844, -4888747, 1433445, -4946729, - 4113505, -3766686, -5789616, 3412889, -3871376, -1569811, 1372779, 2566243, -640487, -2365990, - -1464047, -2996814, -1094680, -5310190, -964220, 1573032, 170725, 1050656, 4141422, 4417911, - -286152, -1112933, 3329674, 2367064, -3332895, 1671816, -2071248, -404264, 2922188, -400506, - 651224, 1284732, 1867774, 2255395, -1264868, -1110249, 528281, -1795296, -327491, 2388002, - 419833, -470836, -57982, -1063004, -1424319, 1169305, - }, - { - 622770, -40018356, 4548371, 7705708, 4317516, 1925219, -7655779, -3393024, 639950, -1640678, - -1190780, 9278203, 27917, 19854560, 6977711, 15425375, -8681203, 8526584, 565862, 12577275, - 4416837, -24685862, -928250, -584652, -14148159, -1656784, -13337484, 2905546, 5440650, 6295885, - 8122857, -8783745, 8159901, -2514703, 11002632, -11721503, 261993, 3699578, 4800700, 406411, - -6247567, -7678865, -7706782, -109522, 752156, -2220498, 785979, -3374771, 1524713, -146029, - -6211060, 607738, 2044941, 3048890, 2248416, 984084, 940598, 1394254, -9127, 1599875, - 2587718, 4639639, -772020, 3955665, -2429878, -302258, -4963909, 2377265, 2215666, 627065, - -1518808, 2749853, 971200, -791885, 3248606, 1577864, -629750, -1442572, -2122788, 2552821, - -3331821, 2614025, 2025614, -5359583, 1939715, 2550137, 2684355, -861141, -314069, -830539, - 2467459, 606127, 868120, -1469953, 548682, 459025, - }, - { - -2891050, -73767672, 8530342, -1334661, 7761543, -1818382, -14103062, 191126, -15084999, 1098438, - 7183870, 188979, -12625056, 6621229, 15818365, 16352551, -2568927, -7223598, 10033580, -3577171, - -2968896, 454193, 4080219, 10826539, 13789529, 114890, 7041599, -923418, -104690, -2198487, - -9113384, -3722663, 6910603, 8361228, 2233920, -9775346, -8102993, -6281390, 3533684, 2263448, - -889058, -10124849, -4752382, 576599, -9022116, 412317, -303869, 1895154, 7364259, 9175124, - -168577, -2595234, -2187749, 721555, 159451, 4734665, -6269042, 2879239, 3566970, -3260954, - 2790655, -4010963, -1768990, 1209033, -1436667, -3304441, 1018981, -2486249, 1280974, -918049, - -103079, 2127620, 1749125, -1337882, 1665911, -2381559, -1168768, -1646046, -802085, -3230889, - -1411434, 1334661, 1255204, -124554, -1165547, -510564, 2694555, -845035, -810675, -189515, - -59593, 1001801, 256087, 357019, -165356, 376347, - }, - { - 1332514, -11084774, -9531606, -9211631, 1397475, -5880347, -9990094, 1558536, -2726231, 4925791, - 4209068, -5294621, -4738960, -15302968, 29761440, -6257231, 4917201, 48318, 18655190, 3665755, - -737661, -5844377, 1335198, -3659312, 561567, -4941360, -5519570, -2310693, 4160213, -1927367, - -4993437, -4586488, 9265318, -10412074, 763430, 1469953, 241055, -9664213, 908922, 6208912, - -664646, -4880694, -5247377, -874563, 5772973, -3537443, -5702106, 714575, 2798708, 1151588, - 504659, -308164, -1001801, 134218, -3781182, 2666638, 4106526, 1460289, 3511673, -1933809, - 869731, -2129767, 3768297, 237834, -1846299, 1251983, -803696, 5226975, -54224, -1369021, - -111669, -2019172, 3377992, 1864553, 392453, -2191507, -759672, 603980, -107374, -1287953, - 2231236, -188979, -1148904, 607738, -1746441, -2209761, -42413, -1118839, -2720325, -540092, - 16643, 353261, 1474784, 344134, 733903, 267362, - }, - }, - { - { - -7822746, 32813550, 46029700, -7864085, -2717641, 1533303, 1664837, 8675834, 5188858, 9671193, - -9982041, -13928579, -2262374, 5174362, -6620155, 2854543, 830539, 1957431, -4044786, 1515587, - 21647172, -4437775, -8504035, -7288560, -3242700, -1156420, -5743982, 1673964, 2353642, 7092602, - 8527658, 4541928, 5396090, 954557, -3393561, 6400575, 8513162, 2591476, 1824287, 4890894, - -1630477, -3748970, 294742, -3201898, -1475321, 1419487, 2946885, 4051765, -1947768, 1554241, - -1391569, -1962263, -126702, -3036542, -2924873, -2014340, -1968169, -2464774, -1682017, -649614, - -2153389, -102005, -343597, -154619, -954020, -1909650, 446140, -2421288, -506269, -1807108, - -374736, -536871, 1999844, 861141, -1037235, -375810, -2169495, -37044, 952409, -181999, - -912144, -2015413, 412317, 84826, 238908, -1151051, 1011465, -1192927, 619012, 439160, - 711891, -557809, -438624, 1221918, 297963, -562641, - }, - { - -324807, 29778618, -83215, 17859548, -985158, -4305705, -1830193, 8796093, 1282048, 1859184, - -7615514, -12974022, 7749732, -2441689, -134755, -363998, 1525250, 12015171, 3147674, 3302293, - 8050380, -872952, -1873143, -7603166, -3334505, -2498597, 4898410, 1192927, -947040, 1034550, - 7121056, 2921115, -9069897, 3385508, -6929930, 5011153, -5910412, 11187853, -2859375, 2979097, - -3687766, 2253784, 2741263, 4175782, 4533875, 1567663, 1438277, -6222871, -3212636, 2386928, - 1272384, 1612223, -28454, 425202, -1995012, -2089502, -88047, 439160, -1302986, -3061775, - 1779190, 3344706, -193810, -2697240, -59593, 364535, 2049773, 893890, 2091112, -2311766, - 66035, -4295, -911070, -3221, 404801, -161061, 1564442, 1876364, 732292, 2797634, - 758599, 1063004, 59593, -838056, -868120, 75162, 1031866, -408022, 864899, 229244, - 3455838, 579821, 423591, 380641, -991064, -807991, - }, - { - -360240, -96124592, -16568373, 30740692, -7712151, 1877975, 3961034, -2155537, -7600482, 2619930, - 116501, -11914776, 1753957, 2980171, 6040872, 5077725, -4041027, -6332393, -8392366, -2124398, - -1776506, 53687, -948651, 4194036, -4914517, -5665599, -3463354, 380105, -2903398, 1391033, - 2042257, -3244848, -946503, -9084930, 2418067, -1644973, -4843650, -7767985, -5255430, -2450279, - 6058588, 1356136, 3051038, -4389994, -1570884, 2265595, -187905, -2250026, 1863479, 1877975, - -506806, -2854006, 3799436, -153008, -1091995, -22549, 4173098, 532576, -381178, 147640, - -3070902, -324807, -286152, 2391760, -3396782, 304406, -431644, 416075, -420370, -3221, - -3167002, -307627, 1036698, 746787, -2895345, -421444, 893890, 810138, 1668058, -483721, - 604517, -8053, 821949, 1344325, -129386, -1037235, 447213, 1221918, 855235, 1227824, - 514859, -683974, 704375, 173946, 149787, -542240, - }, - { - 9865540, -23895050, -9671729, 14856292, 4041027, 1804960, 2886218, -7041599, -6985228, -5145908, - -1372779, -3755949, 6000070, 1362578, -8003672, -3244848, -1189169, 12727062, -13566728, 6054830, - -409096, -3745748, -2523830, 5229123, 2282775, 5999533, -14513231, 10620380, -2859375, -299574, - 7414724, 5397700, -2436857, -455803, 4025995, 2778844, 3700651, 2969970, -3061775, 176094, - 6562173, 6170258, -470299, 2941516, -112206, 1437203, -4385699, 5556077, -2335389, -977105, - -69256, 2127620, 959925, 3208341, -608812, -891743, 640487, 1503239, -1202054, -1386738, - -1986959, 1534377, 540629, 2783139, -3623879, 3540127, 1472637, 2429878, 229781, -362925, - -1899449, 1616518, -524523, 3947075, -610422, 554051, -194347, 143881, -612570, -1082332, - 954557, -326418, 312459, 232465, -1132798, 1044214, 870268, 154082, -447750, 270583, - -355945, -1120987, 750009, 187368, -721555, -464393, - }, - { - 21475, -26081188, -7648800, 10261751, -3219615, -606664, 858993, -960999, 6048925, 1205275, - 7512972, -1009317, -1362578, -2315524, -319975, -1053878, -1708860, -9013526, -3342022, -10061498, - -5005248, -2414845, -9890773, 75162, 3357054, 5005248, -8775692, -806917, -52076, -752693, - 3625489, 425739, 492848, 484258, -3051574, -1532767, 6179384, 5686000, -2525441, -488553, - 3852586, -183610, -4565014, 210453, -3405372, 2557116, 1732482, -2399813, -4567161, -302795, - -11811, 4322348, 321049, 2204392, -624381, 315680, -222265, -433255, -420370, -1982664, - -3007014, 1202591, -1074, -3413962, 1894081, -3172370, -623307, 2110440, -2908230, 666257, - 2225867, 1184337, -984084, 70867, 503048, 808528, 1073742, -828929, 290984, -1364189, - -763967, 2163590, -1036161, -668941, 124554, -1188095, 743566, -1020055, -552977, -1233729, - -771484, -434329, 727997, 156766, -1351304, -351650, - }, - { - 7074885, -41459320, 1162862, -8944806, 7617662, -2441689, -1950989, 9853192, 2162516, -3127810, - -741956, -5920613, 5914170, 6416145, -9841381, 3687766, 278099, -6387690, -6796249, 4144107, - -397284, 222265, -3279745, 800475, 2214056, 1471026, 5509370, -1675037, -1411434, -3027415, - 1261110, 1623498, -363462, 1673964, 3207804, -6881075, -830002, -5129802, -5363341, 1117765, - -4516158, 2949032, -6074695, 225486, 3263638, -523449, 2081449, -3848828, -3458523, -1224066, - -1470489, -1571421, 1986959, 3172370, -231391, 818191, -413927, 1647657, -627065, -4455492, - 2183454, 1861332, -1580011, 1114007, 1387811, 1126892, -2301566, 224949, 1411434, -403727, - -503048, -964757, -741956, 220117, -1500554, 1688996, -622770, 1021665, -1427540, -17180, - 1304060, -1029182, -2050310, -735513, -542777, -590021, 762357, -536334, 94489, -1085553, - -892279, 979789, -1114544, 646393, 168577, 148713, - }, - { - 728534, 10603737, -4658966, -3241090, -3905736, 269509, -361851, -271120, -4843113, 619012, - 3323768, -45634, 4629975, 9514963, -8142185, 2073396, -55835, -851477, -99858, 4440996, - -17660368, -5249524, -9477382, 9596568, -6637335, 5644661, 5990943, -2354716, 3281892, -3588445, - -2131378, 4008815, 1784022, 1488743, 6805913, 410706, 67646, -1510755, -529892, -2552821, - -3015067, 5365488, 1830193, 2350958, -3893388, 461709, -1972464, 904091, 5405217, 431107, - -853088, -1448478, -1406602, -3616363, -4060355, -3764002, 1566053, 1798518, 2470680, 909459, - -878858, -183610, -2862596, -380105, -978179, 2401424, 1774358, 1218697, 347355, 538482, - 424128, 258235, 571231, 946503, -383326, 59056, -1563905, -2355790, 3423626, -736587, - 394063, -623307, -904628, -128312, -270046, 299037, 408022, -50466, -368830, -120796, - -905701, -1179505, -172336, 629750, -2175401, -84826, - }, - { - 14043469, -49450104, 966368, -24424406, -242129, -1602560, 11302206, -4893579, -1518808, 1386201, - 3729642, 10741176, -1367410, 7151658, -2329483, 743029, -1906429, -527744, -1605781, -10543071, - 8057359, -1613834, 2636036, 1714766, 2811593, 230854, -3299609, -2278480, -1959042, -1224066, - 6774774, 1384590, -4859756, -6283001, 913754, -1622961, 2457795, 1613297, -1853815, -1738388, - -204011, -69793, 5444408, 2095407, 819265, 1859184, 247497, 8107288, 2844879, 1591285, - -45634, 82141, 529355, 1554241, 2005750, -1405528, 3966939, -492311, -1516660, 1176821, - -1750199, 1449015, -220654, 1070521, -1404991, 2630668, 2864743, -603980, 3686693, 905701, - -1681480, -528818, -1280437, 1817845, 1956358, -1965484, -2692408, 844498, -144955, -1547262, - -46708, 515933, -963146, -2015950, 680215, 799938, 425739, -162135, -1021129, 928787, - -390842, -1434519, 596464, -52613, 243203, 373125, - }, - { - 2600066, -24688546, -2888903, -11773579, 892279, -1401233, 2968359, -2785286, 3848291, 618475, - 2003065, -6084358, 9132174, 10608569, -10836739, -2632278, -1631551, -4118874, 1160715, -349503, - -1717450, -574989, 1985886, 4254165, 3338800, -4616016, 1698660, -2257542, 2397129, 821413, - -4960151, -5151277, -1444720, 599685, 3176128, 5456219, 162135, 4206921, -4576288, 5404143, - 1866163, -8180302, 1218697, -296353, -4019016, 2681133, -5350993, -3425237, 1010928, 2137283, - -5462125, 1467268, 1374926, -1433982, -776852, 1137630, -2524904, 231928, -3963181, 1756105, - 1153736, -177704, -294205, -1595580, -1057636, 726386, -1583769, 280784, 550293, -1416266, - -2078227, 450972, 428960, 259309, 1090922, 39192, 1398012, 652298, 23622, 5369, - -427349, -322659, 332860, -876173, -534723, -577136, -284542, 505196, 384936, 427886, - 321586, -913754, -207232, 581968, 1480690, -143345, - }, - { - 3362960, 64331632, -13942538, -632971, 4907537, 13532368, -3297461, 7592966, -906775, -202937, - -11457362, -2955474, 5107790, -6808597, -6408091, 6215355, 9080098, -10977936, -11789685, -5494874, - -20429548, 2731062, -5917391, 5015985, -2364380, 941672, 4654134, 638340, 5612986, -9623948, - 4242354, -409633, -766652, 6497212, 3531000, 158377, -4602595, -4692789, -4251481, 702227, - -7755637, 1964411, 136902, -103079, -1908039, 903017, 1046361, 3926674, 135828, 960462, - 4929012, -2289755, 7658464, 1731409, 3062849, -1903744, 259846, -1533303, -3503083, -5101348, - -630286, 340376, 4191888, -1162862, -3661997, 1103270, -1264331, -989990, -1096290, 1690070, - 1637993, -678068, 37581, -2503429, -2414309, 199179, 1515050, 2059974, 103616, -303332, - 159988, 1906966, -2694018, 529355, -736587, -890132, 2029372, 1736777, -49929, 1064615, - 771484, 615791, -1382980, -1003412, 202400, -345208, - }, - { - -1763621, -41950556, -4382478, 7681549, -31675, 7792682, -1699733, -4684199, 7807177, -4396436, - 3249143, 2929168, 4639639, 1258962, -1197759, 5848672, 3866008, -2881386, -1140851, 5888937, - -6772627, -3908420, -16702054, -67109, -1969779, -191126, -434865, 2083596, -6456947, -4473746, - 2637110, 4232154, 1804423, 299574, -4619774, -5294621, -6563784, -10343355, -992674, -86973, - 1275068, -3529390, -1085016, -1699196, 2344515, -1909113, 2925947, -6441377, -2682744, 2991445, - 3112241, -113817, -1791538, 3062312, 4380330, 3525631, 627602, -5601174, 3739306, 1973538, - 2938831, -186831, -4187593, -2040646, 2937221, -4133906, -1465121, -1197759, 59593, 1699196, - 274341, 1707786, -853088, -1278290, -1044751, -918586, 738198, 3618510, -1796907, -1139777, - -1034013, -534723, 1159104, 914828, 2050847, 1025423, 440234, 978179, 1581622, 621697, - 1218697, -432181, 827855, -478889, -1398012, 637803, - }, - { - -8335995, -61356828, -1616518, 22414360, -10470057, -20642150, 1272921, -7585986, -4046396, -5644661, - -23641110, -5862094, 5100811, 3769908, -7879655, -14891725, -11184095, -4216584, 156229, 10488847, - -3582540, 6965363, -14012331, -2145336, -5164698, -1157494, -2533494, 3190624, 894964, 2888903, - 943819, -773631, 1973538, -9369471, -1854889, 8360691, -1477469, -7227893, -10922639, 5128728, - 5971615, -365072, 6896644, -3911105, 4355634, -1306744, 81068, -1488206, -1052804, -5971615, - -536871, 1629403, -5955509, -2991982, -140660, 1711008, 163209, 326418, 2339147, -2463164, - -4514011, -811212, -3337727, -265214, 1874216, -1474784, 1232119, 1341104, 3310346, 863288, - 2008971, 270583, 1742683, 1279900, -1453310, 992674, -363462, -109522, 1326071, -359704, - 814970, 472446, 1768453, 1801739, -2162516, 1445257, -1949915, 100395, 373662, 1147293, - 510564, -1001264, 455267, -1243393, -1080184, 1032940, - }, - { - -512712, -22282828, -4718559, 5805722, -1380832, -213675, 681289, -1995012, -1315871, -7170985, - 6183143, 3039226, 8676908, 5789079, 11381126, 11756399, 1056025, -504659, 766652, 8482024, - -59593, -2430415, -21456046, 3493956, -2934000, -16281147, 4925791, -9588514, 10283225, 3445638, - 6254546, 5076115, -5096516, 1044751, 7000260, -7886097, -2547989, 9192841, -1195075, 3569655, - -57982, -11403675, -7013145, -1783485, 169114, -4740034, -2596845, 219580, 3768834, -3890167, - -1364189, 514322, 2779918, 3911105, -1461900, -2230162, 3911642, -2141041, 2690260, 447750, - 5651640, -482110, 923955, 2218351, 1603097, -3576634, -1952063, 800475, 3103114, -2819109, - -2684, 2061047, 1482838, 1345935, 2094870, 1260573, 227096, -1834488, -1676111, 276489, - -132607, 1763084, -1923609, -1501628, 655519, 2134599, -292058, 886911, 1172526, 376347, - 2324114, 221728, -310848, -64961, -1646583, 432718, - }, - { - -1578401, -52490944, -6982543, -5386963, 13710072, -16787954, -3154117, 1180579, -11063299, -8315594, - 13000329, -11800960, -517544, -3320547, 29111826, 10363219, -8269960, 9918690, -558883, -2257005, - -4532264, 4162897, 7711614, 9403831, 1920924, 3682398, 13752485, 839666, -1909113, 3587372, - -3442953, -12090870, 4706748, 11215233, -546535, -8645232, -8489003, -3673271, 2444910, -1850594, - 186294, -6127845, -7999914, -2995740, -1239098, -6014565, 2490007, -122407, 7796440, 6600828, - 3220152, -409096, 724239, -4364224, 2357937, 4036196, -4463545, 1817845, 1921998, 2206003, - -1934883, -2375654, -1748052, 1813550, -4237522, 129386, -2843805, -942745, -1928440, 1296543, - 1554241, 959925, 2409477, -1036161, 1322313, -3159485, -1473711, -529892, 68719, -3303367, - -1040993, -112743, 1086627, 372588, -940061, -18790, -467615, 675921, -271657, 204548, - 75162, 590558, 1003949, -249645, -1410360, 1264331, - }, - { - -2947421, -20555714, -126165, -3592203, -9251360, -3547106, -2436857, -1923609, 649077, 1105417, - 4378183, -10665478, 1513976, 10252087, -23853712, 940061, 1238561, -2771328, 17415556, 6975027, - -4545686, -962610, -5928129, 766115, -3948686, -3343095, 790274, -9439264, 296890, 8421357, - -8094940, -177704, 700617, -3867081, -2554969, -3571802, 3053185, -2750927, -1927904, 5318244, - -3201898, -104690, -4607963, 2526515, 1476395, -3529926, -2939368, -3069291, 3826279, 950798, - -1493575, -69793, 3176665, -4505421, 1452773, 1657857, 1044214, 3628174, 905701, -12348, - -1619203, 150861, 2677912, -1542967, 2086817, -2447595, 1395328, 605054, 1923609, -529892, - 1022202, -2558727, 840203, 4911832, 43487, -1211718, 1607392, -643708, -585726, -1152662, - 3916473, 198642, -1594507, -2259690, -148713, -719407, -1852742, 842350, -1127966, -2001992, - -1184874, 694174, 659278, 455267, 2042794, 704375, - }, - }, - { - { - 11903502, -27575300, -40581536, 10498511, 16882980, 3590593, 7062537, 6158446, 3342022, 12780212, - -4609574, -12839268, -3788698, -2285460, -7905424, 5793911, -2917894, -1555852, -459025, -1444720, - 7572564, -4872104, -2090039, -1833951, -1851668, 309775, 806380, 2729989, -2217814, 1025960, - 4319664, 3165391, -2743947, -3454764, -3702799, 3636227, 6476274, 3625489, 3260417, 3688840, - -377420, -4152697, -1541356, -5845451, -2237678, 3401077, 3695283, 2206003, -2638184, 4895726, - -781147, -4271882, 1790465, -1379221, 192737, 2472828, 737661, 511638, 1268626, -834297, - -1574106, 3533148, 2953864, -545998, -1263794, -245887, 2289218, -1032940, -386547, -839129, - 1624571, -245887, 524523, 295816, 229244, -198105, -1387811, 1163399, 745177, -1077500, - -486405, -2474975, 1278827, 730144, -66572, -631360, 1304060, -2470680, -463320, -1396401, - -973347, -1002338, -991601, 205622, -26307, -614717, - }, - { - -479426, 46526844, 4541391, -96637, 5354751, 737661, -4168803, 3745212, 2020245, 1358283, - -10236518, -15261093, 4737349, 3836480, 7976291, 2208150, -8702677, -1652489, -5237176, 2383707, - 4479651, 6721087, 9500468, 1702418, 19327, -10191957, -4899484, -3967476, 2303176, 4907000, - 7205882, -337692, -9803263, 1420024, -6257231, 4559108, -7727183, 14828911, -1860258, 5545877, - 122407, -2905009, -2699387, 2542084, 1000191, -1731946, 3349001, -883690, 85899, 2801929, - -2645700, -2297808, -527744, 104690, -2133525, -2047626, 239444, -198642, -415001, 394063, - 1785633, 1509681, -833761, -3307125, 2013803, 972273, 347355, -1046361, -989453, -1992865, - 1123134, -155693, -662499, 31675, 432718, -134218, 1037235, 158377, -1583232, 1930051, - -510027, -425202, 302795, 745714, -1141924, -915365, 690953, -876710, -200253, -731218, - 1212255, -844498, -387621, 1084479, 384936, -616865, - }, - { - -1685775, -57585312, 25708600, 50136764, 3684008, 1404991, 1036698, -2262374, -66035, 1484985, - -8183524, -10512469, 2541010, 2587181, 4607426, 3424700, 600759, -3999152, -8176007, -2271501, - -4207994, -2294586, 529355, 7032472, -3371549, 428960, 8384850, 3773129, -3342558, 2640331, - 641024, -5626407, 1962263, -8450885, -995896, -4751845, -9911174, -1989644, 1701881, -3198140, - 82678, -577136, 3430068, -3305514, 4323959, 1512902, -1321239, 33286, 5309654, 3947612, - -2965675, -5745056, 3192235, -3887482, -1342177, -1801739, 2935610, 962073, -1176284, -1663226, - -3016678, 841814, -1517197, 2279017, -2211371, 844498, 89657, 1848447, -248571, 1585380, - -1509144, 1171989, 878858, 235149, -1002338, 83752, -739271, -39728, 938987, -959925, - 364535, 215822, 316217, 1694365, 2142115, 535260, -239981, 475131, -222265, 35970, - 1093069, 337155, 954020, 397284, -96637, -1897302, - }, - { - -3286187, -39884140, -2860985, 10580652, -6397891, -1299228, 2820183, -3825742, -365072, 774168, - -2068027, 1676111, 2807835, -7833484, -11958263, 5261335, 94489, 8000451, -21594558, -1247151, - -3385508, 829466, 5645735, 6257768, -2083059, -1613834, -10603201, 10341208, -3520800, -632434, - -309775, -780610, -4239670, 2339684, 2855617, -1222455, 671626, -866510, -6827925, -1076963, - -1108102, 2106145, -4315906, -2350421, 3013993, 4839355, -3304977, 5731097, -2425583, -587874, - 388695, -150324, -1684701, 2013266, -1804423, -2248416, 551903, 1251446, -30602, 2552821, - -1006096, 3071975, -2255932, 1235877, -3535832, 1113470, -1195612, -787590, -281320, 1614371, - -1581622, 978179, -1851668, 2674154, 604517, 1653562, 184147, 559956, -257698, -317291, - 1828582, -114890, -69256, -500364, -1001801, 1372779, 2490544, 1018981, 384936, -125091, - -605590, -677531, -346282, -19327, -626528, -1432372, - }, - { - -1328219, -2840047, 6382859, 3623342, -354335, 1009854, 709743, -6229313, 306553, 2047626, - 4636417, -4278325, 1364726, 4758287, -2311766, -5758478, 4723927, -4306779, -2210298, -9514426, - -966368, 2272575, 1731946, 3749507, 2822331, 15910706, -4560719, -4592394, -4901632, -5742908, - 1051193, 4377646, -1292248, -252866, -2575907, -117038, 3710315, 2847027, -475131, 1212791, - 79457, 4085051, 886374, 754304, -1267552, 4683125, 4578972, 1402844, -2547989, 469762, - 677531, 4399657, -1938104, 1297080, 2396055, 2608656, 1364189, 1772211, 2036351, -397284, - -653909, -71941, 619012, -1934346, 1438814, -3216931, -573915, 1018981, -1976759, -217970, - 443455, 1981054, 570694, 993748, -945967, -1141924, 621160, 1021665, 2536715, 128849, - -1431298, 1186485, -702227, -1007707, -233539, -466004, 1705639, -781147, 752156, 52613, - 140660, -34897, 734439, -236760, -659814, 557272, - }, - { - 1639604, -54639500, 9613211, -12458626, -7666517, -144955, -1395864, 5731097, -7643968, -974958, - 4937065, 6264210, 843961, 1690607, -11634530, 3180423, 6851010, -6364605, -8781061, -640487, - -6073084, 3691525, -1291711, 1254131, -6309307, -8185134, 5082020, 934692, -2940442, -4382478, - 1988570, 842350, 459025, 2938831, 2552821, -7102266, 4185983, 1225139, -3505767, 3087008, - -638876, 5107253, -2528125, 942745, 2583423, 2991445, 5066451, 1851131, -140660, -39192, - -783295, -3849901, -1732482, -1096290, -412317, 2465848, -369904, 1978906, 1194001, -1621887, - 2201708, 504659, 862215, 1833414, -1525787, 1223529, -2313914, 1553168, 1957431, -760746, - 144418, -1731946, -2393371, 565325, -1554778, 169651, -1605244, 971736, -1035087, -1337346, - -1012539, -849867, -1666984, -257698, -506269, -881542, 4295, -830002, 803696, 168041, - -300648, 1061931, -380105, 474594, 317828, 798327, - }, - { - -141734, 9942312, 4864588, -4436701, -302258, 848256, -2475512, -744103, -1335735, 588411, - 411243, -2714419, 7219840, 500364, -22362820, -2351495, -8684424, -4173098, -5495948, 5651103, - -7471096, 663572, -7019587, 8530879, -4705674, 9494025, 6427419, -5491653, -3511673, -10071698, - -2978023, 7457674, 2303713, 1081795, 6258841, 2408940, -2200634, -1997697, 3770445, 1532767, - -4532801, -1661616, -418222, -61740, -4146791, 3581466, -3558917, -2676838, 1835562, -1309428, - 2257005, 8590, -2147484, -422517, -3285113, -3707094, 803159, -258772, 521302, -1238561, - -2157684, -126702, -663572, 1853278, -1009854, 2006287, 41876, 1428614, 1816234, -559420, - 265214, 2442763, 587337, 1728188, -1341104, -624381, -1216550, -2900177, 1356673, -698469, - 1284732, -135291, -1822140, 805843, -107374, -1401770, 281320, -500901, 621697, 70330, - 316217, 254477, 561567, 1246614, -1764158, 206695, - }, - { - -7342247, -70134128, 11629161, -27398134, -8466454, -2693481, 5298379, 846109, 3694746, 3833258, - -12177306, -1851131, -7537668, -1324461, -13202729, -9805947, 2304787, 4025458, 4946729, 1095217, - 14787572, 765578, -1346472, -2479807, 4931696, -329102, -1103270, 6759742, -508954, -6426882, - 1333051, 568546, 4660040, 8442295, 9065602, -1390496, -2115808, 352187, 1562294, 2114735, - 3518115, 728534, 6243272, 362925, -1180579, 1843078, -3858491, 2962454, -2358474, -864899, - 283468, 1107565, 1214939, -1833414, 783832, -470836, 4925791, 372588, 67109, 3308199, - 887985, 2204392, -2384781, 901406, -2116345, -903017, 2407866, 802085, 1315871, -331786, - 247497, 2828236, -412854, -413927, 2322504, -125091, -1969779, -397284, 782758, -2684, - 1021129, 206158, -370978, -1004486, 392453, -998043, -1149441, 323196, -1203128, 824097, - -420370, -1185948, 314606, -311922, -510027, -35433, - }, - { - 543850, -25732760, 21643950, -5605469, 1653562, -3012383, 4016868, -382789, 1154809, -3284039, - 2934000, -3222836, 11210402, 8445516, -7250442, 21668646, 21807696, -6104759, -7494181, 3326989, - 2328409, -368830, 1421634, -398895, -5710696, -5581310, 3006477, 1385664, 4711043, 3401614, - 817654, -10564009, -5193153, 6239514, 6466074, -2147, -977105, 6653441, -2237141, 3818226, - -4857071, -11131481, 1081258, 1085553, -459025, 2389613, -4106526, 756988, 863825, 4063576, - -2033130, 3266860, 955630, -1313186, -2024540, 1721208, -3934727, -1572495, -3102577, 2856153, - 1574642, -73551, 1492501, 1671816, 339839, 1111860, -1524177, 1891933, 3228742, 977642, - -2348273, 285078, 347892, -510564, -23622, -1129576, 781684, 425739, -843424, 1206886, - 1091995, 582505, 1244467, -1740536, -789200, 797253, 1737314, 1756642, 569083, -960999, - 226023, -183610, 449361, -366146, 182536, -239981, - }, - { - -3347927, 65460672, 889058, -3595425, 12862353, 28169080, 3013993, 318364, -1927904, 4851703, - 4083440, -4600447, -10643466, -11858942, -4326106, 1450625, -599685, -8107288, 3009162, 10293963, - -12280922, -417686, -6337224, 1108102, -5701569, -5744519, -275952, -658204, 6660421, -9689446, - -1726040, 836982, -1293322, 4825933, 2370285, 4711579, 1873680, 1320703, 4715337, 4782446, - -6223408, 5751498, -617938, -2575370, 620623, 4932770, 302795, -5122286, -7305203, -2500208, - 6221797, -6131066, -922881, -1151051, -905164, -4111358, 1929514, -2109903, -3676492, -3212099, - -970126, -2040110, 5277978, 4755066, -752156, 2597918, 265214, 2684, 919660, 1635846, - 630823, -70867, -1447404, -3136937, -1710471, 1665911, 770947, -680215, 11811, 966905, - 962073, 2272038, -1811939, 728534, -1236951, -645319, 2617246, 905164, -1919850, -148713, - -113280, -1147293, -1934346, -322659, -1171989, -264141, - }, - { - 75162, -33103998, -3556233, 5266704, 307090, 2804077, -6458020, -10438918, 3191698, -686121, - 3327526, -3729642, 770410, -8291435, -3232500, 5766531, 5794448, 7115687, 3520263, 10765336, - 685047, -9668508, -13188771, 6132140, 1510218, 3842922, -5058935, -767189, -6544994, 1343251, - 1113470, -1508070, 4881767, 1064615, -8239358, -2625299, -5114233, -10566693, -412317, 737661, - 6321118, 1330903, 340376, 177167, 723165, -8565239, 230854, -5005248, -4362613, 3969087, - 6360847, 771484, -843961, 3245922, 2398739, 2993055, 2185602, -1458141, 2837900, -552977, - 3826816, 899796, -2098629, -3528853, 731218, -2433636, -263604, 1356673, 113817, -40265, - 396748, 260919, -1260573, 462246, -721555, 96100, 1376537, 1677722, -1063004, 972273, - -2366527, 1069984, 1694365, -1882269, -12348, 1736777, 294205, 730681, 1728724, 433255, - 909996, -1187559, 126702, 389231, -834297, -346819, - }, - { - 13602161, -23221814, -15723338, 6030671, -1836099, -12025372, 16864190, 2043331, 2075543, 6869800, - -4334696, -3861176, 929860, 9333501, 11285563, -591095, -9701794, -7926899, -1993939, 11537356, - -6281927, 5538361, -14507863, -4318590, -5523328, 4177930, 5907728, 6338835, -2157147, 113280, - 2530810, -6150393, -1810329, -4137127, 248571, 7643431, 529892, -1733019, -7289633, 3682935, - -1312113, -6823630, 9075266, -1290638, 1579474, -121333, 6283001, 48318, 4333085, -5253282, - -1693291, 4577899, -631897, -2854006, -1653562, 344671, -10201, -1627256, 4418448, 1780264, - -1139777, 1572495, -820339, 3274913, 3677566, -637266, -1682017, -1968706, -311922, -1358283, - 3097745, -184684, -219580, 161061, -617402, 549219, -1595580, 999654, 2136209, -636192, - -344671, -1315871, -336081, 308701, -1330903, 1893007, -1443646, 1046898, 56371, -236760, - 329102, -867047, 552977, -583579, -855772, 752693, - }, - { - -977642, -7379291, 724239, 7360500, -5172751, -4066797, 3636227, 952409, 623307, -6697465, - 8419210, -525597, -14398341, -23568096, -245350, 1180042, -111132, -5003637, -4760971, 3986804, - 66572, 4477504, -11779485, 6697465, -2033667, -19145354, 10819023, -9828496, 7376070, 1879048, - -4056597, 2821257, -1626182, -983548, 2680060, -5822365, -2573222, 5892159, -6851010, 1678259, - 3485366, -709743, -487479, -3534221, -3633006, -5875516, -1263794, -2173790, 4087735, 3893388, - 5130876, 470299, -619549, 257698, -868657, -4263292, -2833605, -5320391, 3942243, 1147293, - 4393215, -3396246, -2078227, -413391, 1249299, -4792647, -567473, -1703491, -3058554, -5134634, - 1699733, 1156957, -743566, 912681, 1238024, 1478543, 798864, -1428077, -1972464, -527207, - 129923, 551366, -739808, -154619, -2021319, 1212255, 27380, 830002, 1774358, 1128503, - 1538672, -494458, -256087, 222801, -1658931, 934692, - }, - { - 6847789, -39060580, -2265595, -1185411, 7127498, -8777839, 8950712, 6043019, 1006633, -2696703, - 14857902, -8029442, -6982006, -17626546, 14269492, 1456531, -22113176, 2433636, 3964792, 3809636, - -1954210, 8088497, 5186173, 5675263, -5356898, -1329829, 14651744, 3346853, 3325379, 8649527, - 5556077, -6826851, 1909113, 4133369, 2493766, 1652489, 2353642, -2602750, 1233193, -5211406, - -3176665, 1459215, 1047972, 338766, 162135, -3544422, 3949759, -1158031, 855235, 1206349, - 368830, -789200, 2435247, -1260036, 2798171, 1207423, -5417565, 708670, -1301912, 2319819, - -2558727, -1636919, -1898912, -1794223, -3534758, 2833068, -2980707, -1317481, -1628866, 1779190, - 527744, -106837, 3270081, -187368, 726386, -368293, 1738388, -523449, 697395, -1189706, - -23085, -256624, -1148367, -1445257, -1236414, 346282, -1423782, 38118, -23622, 1610076, - 1302449, 1222455, 1230508, -210990, -236223, 1265405, - }, - { - 2430952, -16182363, -2393908, 2455648, -5535139, 5146445, 7780334, -5629629, 2040646, -5802501, - 5234492, 357019, 3952444, -10752451, -66944580, -6637335, -915902, -5729487, 5157182, -2056216, - -5251135, 5641440, -6691559, 2369211, -4531191, -7701950, 4490389, -3243774, 6776922, 16134582, - 1214402, 908386, -3276523, -2619393, -6385543, -10168335, 4181688, 1023276, -4071629, -1290638, - -4083977, 4174171, -3049427, 1901060, -2586107, -2743947, 1164473, -1538135, 1240172, -1531693, - -1332514, -102005, 5887327, -504122, 3243237, 1037772, -1742683, 458488, 554588, -383863, - 208306, 2949032, 2250026, -3884798, 738198, -4912369, -1814624, -1382443, 2399813, -365609, - 1990717, -927713, -1488743, 4279398, 2388539, 2246268, 3321084, -697932, 246424, 697932, - 5060009, 1740536, -2106682, -3077344, -272730, -392453, -1578401, 1141388, 423591, 11811, - 442919, -12348, -621697, 171799, 494995, -379031, - }, - }, - { - { - -14176613, -31330176, 6281390, 33364916, -18781356, 11200201, 9088151, 1411434, 6992744, 2699924, - 3623342, -17961554, 4734128, -956704, -5596880, 2595234, -9220758, 6133750, -954557, 3688840, - -2902324, 3703336, -1082869, 976568, -5753109, -2162516, 6038187, 2735894, 65498, -4062502, - 5899138, 763967, 812823, -7955353, 3816079, -3532611, 5951751, 5081483, 5337571, -830539, - -1311576, -3828427, -252329, -2887292, -553514, 3508452, -213675, 2337536, 369367, 3309272, - -268972, -5679021, 7583302, -4278325, -814433, 362388, 4982699, 522912, 289373, -552440, - -3617973, 4133906, 1908039, 758599, -2304250, -1159641, 3824669, -963146, 221191, -798864, - 2321430, 1168231, -1832877, 221191, 1233193, -2249489, 768262, 484258, 1461900, -2251637, - 772557, -1575179, 220117, 901943, -1231045, 1461363, 82678, -2109366, -1364726, -715112, - -1909113, 99321, -475668, 95026, -364535, -904091, - }, - { - -76236, 40592808, 7234336, -33953864, 25744570, 390842, -1620276, -352187, 3239479, -1647657, - -3332895, -15741055, -256624, 9169755, 4973572, 4152697, -11733851, -10312753, -5422933, 8334921, - 6838125, 2403571, 13309030, 6605123, 1153736, -8136816, -7315403, -5324149, 1547262, 4813585, - -2944737, 3167539, -5784784, -106300, -1724966, -3002182, 4643934, 5813238, 2077690, -1294933, - 4514548, -514322, -3766686, -1729261, -98784, 1943473, 475131, 1899986, -132070, 2652142, - -3396246, -2965138, 3685619, -3933653, -4045859, -17717, -71404, 1044751, -2129230, 1942399, - 2238752, -119722, 1784559, -5488432, 1506997, 1169305, 5369, -197569, -2818572, -95563, - -121870, -882079, -59593, 1894081, -850940, 634045, -1146756, -83752, -596464, 355409, - -1620813, 839129, 348966, 426812, -301721, -682900, -219043, 312996, -1170379, -734439, - 107911, -264141, 184684, 146566, 1028645, -825707, - }, - { - 4715337, -28390270, 385473, 45222784, 3368865, 3191161, -454730, -4473209, 3012920, -729608, - -8556649, -14885283, 10762114, -7124277, 11569031, 659814, -5772973, 777389, -6529424, 9924059, - -6067715, -5248450, -4441533, 8618926, -4040491, 536334, 8320963, 5312338, -2507724, 813896, - -4843650, 6082748, -731218, -3018825, -3617973, -3279208, -7014756, -4494684, 4371740, -1982664, - -850940, -5376762, 3148748, -45634, 3642669, 2684355, 544387, -2753611, 5036386, 2301029, - -2637647, -1104880, 863288, -4463545, 1023276, -1924145, -262530, 2171643, -2055679, -3619584, - 297963, -132607, -2520609, 1778117, -377420, -320512, 1924145, 824634, -666257, 906238, - 380641, 1542430, 456877, 606127, -2047089, 322659, 1551557, 329639, -1379758, -410169, - 7516, -1032403, -361314, 1730335, 2468533, 1099512, -427349, -174483, -538482, 499290, - 784368, 83215, 1837709, -527744, -63888, -813359, - }, - { - -4638028, -45992656, -3160559, 15367393, -3071439, 895501, -2962991, -1117228, 790274, 7672422, - -15479062, 3373160, 4660040, -6694244, -12832289, 8698919, -3406983, 5727876, -12986907, -3067681, - -3376918, -153008, 2347200, 176094, 6756521, -17661442, 5232881, -4486094, 5921686, -1243393, - -8790187, 1465658, -4213900, 4508642, 4032974, -6422050, 3092913, -4620848, -1519882, 3985730, - -3974455, -2070711, -3732327, -1678259, 139050, 1078574, 4329864, -504659, -1785633, 3067144, - 144955, -2181844, 609349, -1659468, -1212255, -3938485, 3211025, 2515777, -3344706, 5763309, - 783832, 2250026, -4305705, 1967095, -386547, -2722473, -826781, -4100083, 4111894, -267899, - -1960653, 1273995, -636192, -207769, 1959579, 2621004, -407485, -1710471, 1708860, -159451, - 1179505, 399969, -338766, -1430224, 305480, 312459, 3777424, 410706, 1530082, -478352, - -830539, -715649, -133144, -168041, -905701, -2159295, - }, - { - 2220498, 10094247, -3958349, -7131257, 7822746, -511101, 3473018, -3472481, -3594888, 2842732, - 2292439, -4376572, -3320010, -4497368, 8360691, 155693, -8967355, 9084393, -6963216, -9499931, - 2719788, 4773320, -6334003, 9329743, 36507, 14473503, 445603, -5306969, -2458869, -4057670, - -2732136, 9714142, -5068062, 1653562, -862215, 1163936, 539555, 945430, 5348308, -862752, - -3889630, 6497212, 6398965, -4642323, -1104344, 501974, 4928475, 4094715, -1565516, -855772, - -704912, 859530, 4389457, -130460, 1729261, 1132261, 2392834, 3129958, -469762, 1060857, - -236223, -2030983, 4622996, -140660, -917512, -4480188, -658204, -158914, -387621, 2176475, - -3172370, 1466731, 1289564, -212601, 315680, 261456, -793495, 1695438, 2119030, -1006096, - 743566, -346819, 237834, -1216550, -255014, 1193464, -287226, -913217, 1463510, -153545, - 468688, 547608, -695248, 503048, -30065, -111669, - }, - { - -11018739, -43763032, 5666136, -19487340, 7070053, -4642323, 6161131, 311922, -11370389, 6557878, - -11196980, 18765248, -4500589, 3124589, -7126962, -2633352, 1580011, 1582696, -4502737, -5908802, - -4369593, 466004, -4784594, -3338263, 5685463, -9621264, 6549825, -3006477, -1896765, -4728222, - 4001299, -5210332, 7650948, 2109366, -4833986, 2951716, -463320, 3495567, 429497, -1080184, - 3602404, -461709, -107374, 1580548, 108985, 3360812, 3009698, 7796440, -653909, 909459, - -3804267, -1606318, -1226750, -3007551, -530428, 3649112, 1273995, 344134, 0, 2506114, - -2313914, -639950, 3327526, 700080, -2644089, 285615, -221728, 1591285, 1366337, 568546, - -133144, -1962263, -2332704, -1280437, 454730, -2499671, -478352, 1352378, -798864, -715112, - -2217277, 27380, -718870, 884226, -1580011, 399969, -1296006, 490163, 386547, 741956, - -415001, 19327, 1156420, -543313, 154082, 851477, - }, - { - -553514, 4940823, 6537477, -4185983, 1893544, -559420, -2290291, -277025, 105764, -894427, - -1739999, 1530082, -5751498, 4132832, -20637318, 317291, -19445464, -1735704, -2643016, -3051038, - 166967, 4940823, 1762547, -6755984, 476205, 773631, 3914863, -5341866, 4333622, -12623446, - 4443144, 5429913, -8221105, 12293807, 3754875, 4115653, -3329674, -1709934, 3637837, 2490544, - -1749125, -6736656, 1143535, -3524558, 1843615, 3092377, -2083596, -1562294, -5426155, 1175210, - 263604, 1271847, 158377, -10737, -1423782, -5039071, 2080912, -2449742, -660888, -440234, - -3340411, 449361, 60130, 818191, -1515587, 2077154, 1990181, -791885, 1045825, -539018, - 825707, 2726231, -209917, 1582159, -392990, -1344862, 9664, -1335198, -471910, -1310502, - -42950, 1156420, -2614561, 1397475, 173409, -1220845, -472446, -1489817, 1472637, 500901, - 158377, 608812, 398358, 566399, -403190, -113817, - }, - { - -1983738, -77126336, 8180302, -40745280, 10353019, 5181341, -16032576, 19491098, -2023467, 5674726, - -8295193, -13903346, -774705, -6145025, -3801046, -6444062, -8793409, 248571, 9475235, 7672422, - 4003447, 4573604, 2374043, -6548215, 1661079, -2999498, -2352568, 12348031, -3219615, 324270, - -3396782, 3938485, 5080410, 5564667, 6425808, 70330, -499290, -1339493, 3221762, 208306, - 4663798, 1768990, 1750736, 460098, -862752, -463856, -1203665, -964757, -241055, -4684736, - 2439542, 162672, -209917, 2215666, -4270271, 1990181, 4475356, 469762, 1755568, 1439888, - 1721745, 957241, 239444, -2774012, 781684, -3016678, 99858, 5385889, -1388885, 591095, - 2199560, 1697049, 366146, -1899449, 1067836, -933619, 153008, -876710, 2252710, -107911, - -300111, 1564442, 852014, -1036161, -909459, -1179505, -1321239, 963683, -955630, 749472, - -429497, -886374, 113817, -285078, -1792612, 310311, - }, - { - -2484102, 7605850, 193810, 3508988, -2397666, -1105417, 2437931, 457951, 2410014, -6532109, - -1673427, 3328063, 4879083, 7029788, -6161131, 20529406, 31012886, -11119133, -4918812, -973884, - 7381975, 3523484, -2202245, -594853, -5191542, 1566053, -3925600, 6677601, -932008, 4637491, - -3658775, -7344931, -2136746, 4208531, 8371428, -2487860, -518617, 6427419, -3730716, 2904472, - -3162707, -11049340, -733903, 6818261, -2852932, -4619774, -824634, 3339874, 161061, 106837, - 1249836, 3309272, 470299, 2625299, -6326487, 84289, 164819, -1534914, 21475, -1328219, - 2955474, 979789, 843961, -1015760, 2823404, 1891933, -3050501, 3574487, 2758443, 849330, - -2056753, 31675, -2250563, 2195802, -1109712, -282931, 485868, 502511, -486942, 2204392, - 81068, 824634, 1504849, -1568737, 213675, 651761, 2129230, 1036698, 1722819, -805306, - -649077, -463856, 986232, 74088, -733903, 401579, - }, - { - 5454072, 61184492, -3600793, -8434242, 19455664, 2442763, 18079128, -6028524, 11199127, 1373853, - 10875394, -9604084, -13768591, -9595494, 3622805, -6586869, -1613297, -8396661, 3797288, -1948841, - 8604967, -9587441, -1207960, 2954938, -6669011, 646929, -6337224, -1070521, -3033321, 1489817, - -4278325, -3292093, 6497749, -3839701, 3536369, 1432909, 5248987, 447213, 2693481, 9423695, - 1535451, 4146254, -2680060, -3671123, 3622268, 3902515, -7140383, -4100083, -3103651, -5468567, - 967441, -2923799, 613107, -1869921, -2790655, -2493229, -989990, -1313723, -525597, -3863323, - -2256469, -763430, 4649839, 5264556, -1046361, 2227478, 408559, 507880, 2319819, 510027, - -787590, -1145683, 365072, -3954591, -860604, 794569, 2717104, -2381559, -1196148, 1622424, - 712965, 2974265, -1550483, -751619, 1759326, -708670, 726923, 1349157, -1057636, -1427003, - 526134, -2899103, 709743, -876710, -1430761, -382252, - }, - { - 2101850, -31751082, -212064, -2961380, 6027450, -563714, -5209259, -1407139, -289373, 1754494, - 938987, -8141111, 1513439, -13408888, 5577552, -5500243, 13643500, 6707129, 6984691, 2505040, - -7082938, -1020592, -4072166, -5630702, 5326297, 6355478, -8652748, 625992, -4684199, -6420976, - 5497558, -5814312, 12879533, -5452461, -8504035, -3806952, -7308424, -4085051, 126702, 1734630, - 8603893, 1140314, -3758, -476741, -1718524, -1315871, -7255811, -1683090, 309238, 3656628, - 2079838, -1654099, 1102733, 900869, 1876901, 1549946, 2791192, 2509335, 1316944, 1571958, - 3300146, 209380, -3109020, 849330, -1352378, -1593970, 1453310, 1958505, -2533494, 252866, - 896574, -166430, -986769, 612570, -1364189, 256624, 2297271, -290447, 1137093, -154082, - -2651069, 1901597, 872415, -1997697, -288300, 2265595, 127775, 1102196, 266825, 359167, - -97711, -127238, -555125, 53150, 520765, -2066416, - }, - { - -14987288, 11746199, -10723460, 246424, 8489003, 8176007, -2226404, -6972880, 12134893, 10021769, - -720481, -8846559, 10802916, 8885750, 6786585, -2645700, -6037114, -5447629, 597537, 8417062, - -620086, -5796059, -8053064, -3731790, 1393180, 1990181, 10422275, -3879966, -236223, -977642, - 10002442, -13386339, -7290170, 6429029, -3506841, 3513283, 3561065, 1980517, -2383170, -1850594, - -2442763, -3369402, 3194382, 1506460, 893890, -2350421, 9376987, -2343979, 4823249, -1344325, - 2200097, -4993973, 3750580, -4230006, -226023, -955630, -79457, -3520263, 6344204, 2260764, - -1592896, 790811, -1014149, 4814122, -985158, 1347546, -441308, -558883, -2057826, -107911, - 398895, 878321, 2393908, -2268280, 522375, -2774549, -869194, 3671123, -1193464, -381715, - 1004486, -327491, -2080912, -875100, 1583232, -439160, -391379, 572304, 50466, -686121, - 528281, 432181, -1494649, 483184, -207769, -434865, - }, - { - 2285996, 823560, -8149701, 8230231, -10390063, 2527588, -3637837, 1259499, 4609037, -4348655, - 4359392, 1951526, 2905546, -50143208, -8590, -6129992, 5513665, -4020626, -2830384, 879395, - 2692945, -2818572, 264677, -2015950, -2116345, -11454141, 3522947, -7023882, -2964064, 367220, - -2543158, 6442988, 2237141, -8507256, 4098473, -5824513, 639950, 4902705, -4893579, 3447248, - -6739341, 5996311, 782758, -5158256, -2664490, -3658775, -820876, -3430068, -61203, 9091372, - 366146, 853625, -1746441, 180389, 304406, -341987, -6460705, -2430952, 2019172, -2575907, - 8994735, -3139084, -5216238, -1491964, 1058710, -2898566, -353798, -909996, -6052146, 96637, - 1294933, -2441689, -213675, 473520, 1316408, 1338956, -83752, 181999, -1379758, -2384244, - 1389422, -848256, 44560, -70330, -1007170, -715649, 622770, 365609, 2099702, 446677, - 706522, 642098, 966368, -841277, -440234, 584116, - }, - { - -11993159, -24495272, -821413, 10468446, -8760660, 13032541, 4957466, -4459250, 9505299, 11292543, - 3678640, 4860829, -33260764, 7684234, -11418171, -831613, -10864120, -10072235, 6047851, 8505109, - -1789928, 3823595, 2164664, 5195837, -3789772, -8615168, 19498614, 1422171, 7664906, 8462696, - 5265093, -9960566, 3298535, -3921305, 13238700, 680752, 5215164, -5589363, 1870458, -4901632, - -5552856, -1854889, 2723009, 5542656, -3893925, 2522757, 2100776, 5653251, -2835215, -382252, - -7226820, 5109938, 744103, 1032940, 1137093, -165893, -5138392, -180389, -2677375, 2750390, - -4420595, 263067, -1860258, -5084705, 17180, 1159641, -2037962, -1297080, -287763, 992674, - 1166621, -1389422, 2746632, 442919, -355409, -140660, 2624762, -319975, -2143726, 1236951, - 1308354, 219580, -1978369, -1760937, -1826435, 633508, -1535451, 599685, -1184874, 2266132, - 2121714, 170188, 726386, -1367947, 2015950, -544387, - }, - { - -1376000, -20265804, 5302674, 908922, 2927557, -1390496, 9946607, -1628330, 3579318, -6460705, - -2835215, 3903589, 7397008, -36441188, -36921688, 5586679, -3204583, 5665062, -7352984, -8783208, - 5048197, 6243809, -13347148, 1147830, -382789, -11161009, 1722819, 7707319, 5389647, 9121974, - 8684424, -380105, -3951907, -2400350, -7707319, 2469606, -8307004, -955630, 4568235, -9409736, - -5488968, 7987029, -730681, -1202591, -4301947, 3840775, -1609539, 2911451, 511101, -7299297, - 2482491, 1838246, 199179, 2784750, 2250563, -1999844, -1013612, -1535988, 3665755, -122943, - 2464238, 473520, 4662187, -4683662, -1026497, 1239635, -6615324, 2676838, -675384, 211527, - 214748, 1837172, 719407, 422517, 2692945, 928250, 3864397, 269509, 867047, 897111, - 2087891, 2419140, -1780801, -1422171, -1064615, -276489, -903554, 1847910, -1182727, -12348, - 743566, 149250, -1665911, 2485176, -1746441, 1402307, - }, - }, - { - { - 15158550, 7257958, 25109990, 67189392, -5123896, -1721208, -2311766, -3549791, 5548561, 10082436, - 20861194, -6715718, 7956427, 3886409, -540092, 5371394, -554051, 13078175, -2579665, 1803886, - -2598455, 6945499, 6474127, 7722888, -5093831, -2456721, 3056406, 2446521, 4209605, -4665945, - 3360812, -3518115, 2101850, -6054830, 7543573, 1075352, 6154152, 3928821, 118112, -2124935, - 1641751, 1307281, 6066105, 3434900, 726386, -2479807, -2206540, 2092723, -1064078, -1607392, - 1102733, -4766877, 1666984, -7732552, -3048353, -4439923, 3537979, 705985, -984084, -478352, - -3640522, 1465121, -1653026, -177704, -1762547, 383863, 2826625, -3303904, 324270, -340376, - 1501628, 1176821, -1940788, -222265, 913754, -1382443, 1416802, -1137630, 542240, -1559073, - 1222455, -934692, -165356, 402116, -1595580, 572841, -886374, -53150, -863288, 495532, - 559420, 1404454, 484794, -17180, -746251, -653372, - }, - { - 1238024, 19815368, -8079907, -47639240, 2799782, -3001109, -1993939, -1690070, 3484292, -131533, - 615791, -12440373, -4183298, 643171, -608275, 870805, -11174968, -3000572, 153545, 4540854, - 9470403, 376883, 8827232, 10171556, 8934606, -5294621, -5786932, -6946573, -963146, 475131, - -5834713, 1622961, -12722767, 1039382, 5179194, 1538135, 7662222, 1127966, 2973191, -1551557, - 2600066, 621697, -1951526, -7269232, -1513976, 10348187, 6382859, 2129230, -4945118, 2137283, - -2279554, -1810329, 2814814, -3503620, -2250026, 1032403, 193274, -1939178, -1814624, 3301219, - 1028108, -2804077, 924492, -3799972, 804233, 386010, 32749, -958315, -1526324, 788663, - -1861332, -1646583, -319438, 877784, -967978, 585726, -2204929, 1928440, 208306, -2189360, - -1590212, 2135673, 343597, -814433, 177704, -230318, 562641, 1973538, -750546, 93952, - 1437740, 756451, 569620, -1237488, -377420, -483721, - }, - { - -6091874, -9818832, 17046188, 9210020, -25745108, -2051921, -2015950, 401043, 4851703, -1614371, - -1986959, -16512002, 4389457, -13244069, 5419712, 8421894, -1472100, 1055488, -4250407, 10580115, - -2678449, -2677912, -8273181, 2484102, -3918084, -5113159, 2673617, 9757092, 1743220, -5945846, - -6316823, 12007118, 2332167, 6188511, 5799280, 6507949, 204011, -4262218, 8891119, 778463, - 59593, -7479149, 1996623, 725850, 1059246, 1818382, -861678, -4607426, 2534568, 1461363, - -625992, 2638184, 1034550, -1866700, 3325379, -1712618, -4170950, 1217623, -3987877, -4189741, - 2854543, 2016487, -1107028, 1549410, -761820, -1858647, 2400350, 863825, -312996, 274341, - -419296, 2374580, 434865, 431644, -2052458, 455803, 2924873, 1002875, -2046015, -2140504, - -2136746, -1834488, -1870458, -688805, 1059783, 30602, -1467268, -167504, 1123134, 1580011, - 303869, -206158, 1536525, 848793, 1676648, 233539, - }, - { - 11021960, -24312736, 6377490, 17143362, -9356049, 1654099, -3321084, -979253, -1868848, -105764, - -12103755, 7555921, 7482907, 6757058, -10215043, 10612864, -4896263, 1778653, -7192460, 1315871, - 518617, -11157251, -16297253, -8298414, 216359, -25596932, 4510253, -3431142, 5529234, -643171, - -6852084, 5621039, -577673, 3412352, 10085120, -4075924, 3053185, -1717987, 4952098, 6056441, - -4187593, -2452963, -3811784, 1443109, -803159, -1872069, 2684892, -4810364, -3113315, 5130339, - 3263102, 439697, 431644, -1635309, 733903, -3212636, 1218160, 2770791, -1931125, 4199941, - 1539209, 1031329, -6169721, -308701, 1341640, -1611, 512175, -1298691, 4671851, -1982664, - -1837172, 1922535, 18790, -1875290, 69793, -157303, -1810329, -1527935, 1232656, -481573, - 97174, -1260036, -386547, -357556, -103616, -1519345, 1506997, 467615, 2235531, 458488, - 426276, 509491, -75699, -918049, 787053, -303332, - }, - { - -1772748, 17264694, 5051419, -11188927, 1399086, -2854006, 687195, -329102, 518080, 2491081, - -3508988, -9499931, -2230699, 4861366, 16233366, -3406446, -3064459, 5598490, -7985418, 2201708, - 13045426, 483184, -18945638, 8797167, -5986111, 7601019, 11410654, 4566624, 157303, 4238059, - 4973572, 7265474, -3681324, 6914898, -134755, -1642288, 47782, -331249, -1537598, -9207336, - -6980933, 2324651, 3102040, -4138201, -2542084, -3777961, 176631, 1839320, 1060320, 88047, - -1352378, 78383, 6552510, -723702, -489089, -1057636, -1762547, 1932735, -559420, 787590, - -896574, -1846299, 3595961, -335007, -812286, -3452080, -3025805, -1946157, 779000, 2659122, - -2639258, 2902861, 2633889, -994285, 49929, 1462436, 58519, 1341104, -296890, -2456721, - 1351304, -285615, 2048699, -188979, -1730872, -562104, -908386, 713501, 1702418, -832687, - -105227, 635655, -578210, 208843, -184147, -560493, - }, - { - 17949206, -11323681, 5850283, -22002044, -3098282, -3295851, 8574365, -9967545, -18662706, 4677220, - -1931125, 25185152, -5189394, 9540196, -1216013, -5901285, -9671193, -1101122, 1829119, -963683, - 1569811, 551903, -9258339, -4220342, 18742700, -1739462, 7435662, -6027450, -4276177, -3617436, - 3910568, -2383170, 6686191, 2908230, -609349, 3507378, -623844, 1435056, -2631741, -2129230, - 2171643, -1090922, 864899, -681826, -879931, 2695092, 288300, 6214281, -663036, 463856, - -5485210, -1561221, 1482838, -1693291, -23085, 3330747, -247497, -3803731, -2138357, 2149631, - -2991445, -302795, -650688, -2037425, -2254858, 1334124, 2368675, 1340030, 525060, 774705, - 133144, -1986422, -1829656, 35433, 2465311, -374199, 1152662, 2135673, 1084479, 490700, - -845572, 1241782, 1330903, 2385318, -763967, 2276870, 828929, 718870, -639413, 1031866, - -367757, 227633, 2662880, -251256, -243203, 405338, - }, - { - -38655, -12328704, -14940044, -578210, 4776004, -227633, -996969, -363462, -4064113, -1100049, - -4538707, -2276333, -6715182, 7999914, -8104604, 3160022, -18256296, 1626719, -2069637, 3446175, - 4235912, 2156074, -321049, -15379204, -8911520, -6349036, -3988414, -4388920, 9690520, -10842645, - 6167036, 4294431, -8260296, 13516262, 4584878, 3253975, -3915400, -1451162, 2645700, -477815, - 3777424, -4051228, -6174553, -6692096, 4758824, 1933272, 102542, -768262, -9738838, 1280437, - 757525, 1268626, 3738769, 2881923, 1023276, -2074469, 2391760, -5369246, -3963181, 1008244, - -2290291, -822486, 737661, 1693291, 51540, 1358283, 950798, -3325379, 190589, 346282, - -110595, 1693828, -3088082, -1494649, 524523, -652835, 1351841, 978716, -126165, -2708514, - -1962263, 486405, -2180770, 9127, 1052267, 826244, -903554, -1535988, 1628866, 1368484, - 705985, -108985, -806380, 525060, 583579, 1091459, - }, - { - 13654775, -57584776, 12052752, -60455960, -1927367, 4744865, -10195179, 31941672, -3223910, 1282048, - 10296110, 11549167, 7885023, -1690607, 6532646, -7053947, -20633022, -3423626, 12062416, 2301566, - -6152541, -910533, -122943, -12560095, -5272609, 107374, 5224828, 10411001, 565325, 5196374, - -8078297, 4212289, 839666, -2253247, 2540473, -4155381, -463856, 43487, 2225330, -2981781, - 1749125, -164283, -3144453, -5182952, -5625871, 426276, 4105989, 726386, -577136, -5603859, - 3857418, 1913945, -145492, 870268, -5684926, 751619, -430034, -552440, 4253092, 877247, - 10737, -1380295, 397821, -2161442, 4115653, -1641751, 547071, 3549791, -1498407, 1595044, - 725850, -589484, 309775, -668941, -259846, -2612951, -825707, -781684, 2375654, -490700, - -770947, 2393908, 2050310, -239444, -1193464, -249108, -728534, 1167694, -111132, 865436, - -226023, -1017907, -1069984, -101469, -1002875, 1054415, - }, - { - -31675, 24305756, -1226750, 10347650, 3347927, 88047, 3656091, -2525441, 93416, -3563749, - -94489, 633508, -247497, 9320616, 1644436, 3679176, 12865575, -8740795, 272730, -2484102, - 9105868, -831076, -8723615, -2905546, 403190, 6474127, -1913945, 14878304, -3008625, -3632469, - -8046621, -10194642, -2245731, 3145527, 7331509, 3686693, 3803194, 1422708, -7901129, -2779918, - -5303211, -4927938, 1144072, 6460168, -7941395, -3740380, 4463545, 512175, -3435974, -1226750, - 142808, -18254, -1606318, 3564286, -2302639, 3000035, 3003793, 2132988, 5993627, -1651952, - -1442035, 206695, 1724429, -1054415, 1703491, 548682, -1192927, 899796, -3406446, -327491, - 237834, 2216203, -1781338, 1925756, 201327, 1713155, 711354, -165356, -207232, 2156074, - -257161, 890669, 2285460, -583579, 842350, 1131724, 1991791, 1487669, 2249489, -755377, - -676994, -340376, 395674, 23085, -1052804, -525597, - }, - { - -8323110, 57692148, 9366787, -6742562, -1939178, -22450868, -2923262, -9657234, 14960445, -2063195, - 4517769, -9224516, 7218230, 2514167, 4249334, -4492536, 5999533, -5928129, -9986873, -3502546, - 18051748, -4744865, -2793876, -1001264, -6379100, 5345087, -3380676, 901943, -1675037, 6265821, - -1025960, -4755066, 5573794, -9394167, 1539209, -1544041, 3563749, 1477469, 722091, 9190693, - 1220845, 336081, -1490354, -3287261, -2906082, -1066763, -5775658, 2559264, 3122978, -8130373, - -1554241, -2172717, -2797634, -777389, 3760781, 1973001, -3511136, -1051193, 2815888, -5360119, - -3387119, -764504, 1475321, 3764002, -1610076, -756451, -1152662, 337692, 1857573, -418222, - -375810, -2224256, 659278, -1468879, -197569, -2196339, 999654, -472983, 243203, 1225676, - -1932198, 1167157, 144418, 383326, 1359894, 697395, 956704, -362388, -624381, -404801, - 1342177, -1194538, 2851322, 252329, 169651, -474057, - }, - { - -2737505, -27110908, 7237557, -13045963, 247497, 12487617, 10483478, -5051956, -4602058, 7958575, - 4155918, -5644661, -1028645, -18586470, 4573604, -3843996, 9114457, 1125281, 9745818, 6258304, - -13668197, 4764730, -2274722, -15468862, 456877, 528281, -11887933, 1307281, -7568806, -11965242, - 7318625, -4096862, 7280507, -5255966, 3661460, 860067, -2910377, -345745, -586800, 3355980, - 7282654, -620623, 4065187, 215822, -100395, 3821984, -4286378, 4677220, -996432, -1857573, - -2012729, -3292629, 319975, -1546725, -565325, -2036888, 292058, 6121402, 2496450, 1199370, - -1971390, -4723391, -382252, 4710506, 1192927, 324270, 686658, 2203318, -368293, 1801739, - 2721399, 667867, -1287953, 116501, -883153, 645319, 1935420, -2054605, 361314, -285078, - -2145336, 244276, 388158, -192737, 1060320, 2183991, -143881, -483721, -1827509, -283468, - -1049046, -122943, -267899, 5906, 1753957, -344671, - }, - { - 10001905, 36636072, -352724, 15062450, 2649458, 38445328, 11372000, -13792214, 7075959, 263604, - 8158827, 4585952, -3846143, -9316321, 11477763, -197569, -2412698, 11200738, 2218351, -2072859, - 2507187, 521302, 1007707, 3007014, 4424890, 3361349, 6626598, -4234838, 1255204, -1329829, - 16481937, -8955007, -6549289, 8825621, -3768297, -729608, 1377611, 3142306, -133681, -943819, - -501974, -664646, 1344325, 161598, 2987687, -619549, 549756, -7335804, 4044249, -2422362, - -575526, -6455336, 6705518, -3478387, -4624069, -1603633, 707596, -4988068, 4555350, 1001264, - -3595961, 597537, -3241627, -1486596, -4309463, 548682, 491774, 4643934, 1292248, -154082, - -1456531, 456877, 3006477, -4625680, 93416, -1663226, -1223529, 3053185, -1857573, -1663226, - 184147, 1420560, -489626, 277025, 2218351, -549756, 204011, -339839, -592169, -518080, - 1060857, 963146, -2445984, 337692, 528281, -702227, - }, - { - -2110440, 4366908, 1120450, 9067213, -3918084, 1862405, -8178155, 1174674, 7552163, -4424353, - 3624416, 6484864, 2595234, -42248520, 5055714, -12723841, 1535451, -6637335, 2103460, 1610076, - -3548717, 1265405, 5029407, -6788196, -2815351, -8782671, -3511673, -667331, -4802847, -5123359, - 923955, 2519535, 1290101, -13095892, 3604551, -5225365, -3142306, 3081639, -3148211, 1331977, - -9448928, 6584722, 2477659, -3602941, -1485522, -292595, -2625299, -3583077, -1709934, 4684199, - -6426882, -2502892, 694711, 4908611, 1826972, 2151779, -2752000, -2560874, 488553, -5521181, - 5403606, -1264868, -5127117, -4413616, 711354, -970126, -444529, 1562294, 340376, 4254165, - 1074, -2518998, 417149, -527207, -449361, -625455, -1806034, 21475, 617938, -432718, - 1658931, -1039919, 239444, -1869385, -1337882, -255014, 1014149, 52613, 500364, -443992, - 278636, -257698, 2193655, 1217086, 1868311, 1021665, - }, - { - 14015552, 10865730, 6696391, 13216151, -10849087, 19385872, 2268817, -8617852, -2388539, 10161893, - -3119220, -1930051, -32075890, -5764383, -34561600, 5162014, 588947, -13713294, -59593, 6634114, - 2163053, -607738, -4043175, 4851703, -4704600, -22917408, 10916733, -7318088, -7369627, 1656784, - 4333085, -8288750, 3748970, -4698158, 11409044, -7990787, -3546032, -3684545, 8202314, -2567317, - -1374926, -1620813, 3971771, 6440304, -5200132, 6953015, 4611185, 4130685, -3796214, -2503429, - -5798206, 6651294, -4419522, -4491462, -1096290, 2764348, -4867272, -631360, -1793149, -336618, - -5492727, -635118, -433255, -3733400, 1065689, -247497, -2236604, 164819, -201863, -868120, - -396748, -1774358, 811212, -571768, 1058173, 576063, 694711, -2329483, -3078418, 111669, - -204011, 856846, 1730872, -33286, -2229088, -746787, -1477469, 913217, -2144263, 529892, - -428960, -1859184, 643708, -1147293, 1571421, -297427, - }, - { - 1595580, -28702192, -3502546, 3435974, 8061117, -1089848, 6362457, 625455, 7611219, 1673427, - -3250753, -1692217, 3338800, 15223512, 32712618, 3306588, 7539278, 3788161, -17336636, -8023536, - 10633802, 1919850, -10595147, 2602750, -357556, -8461086, -189515, 5037460, -5824513, -2971044, - 4634807, 7022272, 3448322, 4072166, -1945083, 8206609, -7136625, -8411693, 2389076, -8177618, - -5776194, 11500849, 969052, -659278, 1247151, 7975755, -252329, 704912, -1825898, -3452080, - 3810173, -1895691, 683437, 6730751, -271657, -5523865, -143881, 1388348, 3860102, -1819456, - 3153043, -266288, 5228586, -2419677, 138513, 5308580, -3060701, 5810554, 42413, -110059, - -2753611, 494458, 1618666, -1198296, 1326071, -1278290, 969052, -1024887, -598074, -401579, - 279710, 593242, 511101, 1169842, 468688, 2127620, 252866, 340913, -1315334, -151934, - -446140, 1095754, -679142, 3096672, -1513976, 1386201, - }, - }, - { - { - -17311940, 31659278, 31516470, 60117196, 13035763, -8324721, -4337917, 3634616, -3938485, 14585709, - 11527692, 4550518, 4603668, 5090610, -390842, 3515431, 10096931, 1634235, 955630, -303869, - 1216550, 8342974, 1192390, 8428873, -2742874, -2824478, 370441, 6118181, -1759863, 308701, - 2481417, -3012920, -1198833, 453656, 2704756, 5032091, -2021319, 8012262, -346819, -1425392, - 3085397, 54224, 2302639, 3224984, 3597572, -4568772, 1963874, -3125126, 1201517, -4258997, - 1240709, -571768, -2610803, -5909338, -1810866, -4785131, 1489817, 1077500, -987306, -2312303, - 1013612, -297427, -3081102, -361314, -1115081, 521302, -174483, -2099165, -1870995, 2108292, - -1207960, 1461900, -472446, 3221, 267362, -1114544, -522375, -1204738, -665183, -710280, - 147640, 1038308, -935766, 41876, 69793, -1555315, 39192, -698469, -777389, 1185948, - 1378148, 786516, 630286, -105764, 624381, -375273, - }, - { - -1476932, -8652212, 15042586, -10937671, -26320634, -2330557, 1006096, 2033130, 126165, 4651987, - -8885214, -8848170, 2773475, -7013682, -2450816, 6291590, -15721191, -3295314, 13423920, -14033806, - 5652714, 13516262, -1979980, 5434208, 10459856, -1976759, 2152316, -14061723, 3920232, 1140851, - -7000260, -2736431, -8302709, 3592740, 1961190, 577136, 10599979, 168041, 404264, 1957431, - -1744294, 4003983, 2269353, -8145406, -2480881, 10464151, 5350993, 3848291, -3884261, -1585380, - -1211181, -1388885, -2880849, 1524713, 563714, -135828, -1119376, -1060320, 739271, -2084133, - 253940, -474057, 649614, 330176, -1801202, -309238, 376347, -1481764, 2216203, -1975685, - -2357400, -612033, -347892, -848256, 821413, -6979, -2029372, 1461363, -54224, -1692754, - 454730, 848793, 1939178, -1823214, 195958, -890669, 1605781, 1148904, -1339493, 2544231, - 505732, 460098, 462246, -1100585, 80531, -1042066, - }, - { - 5236102, 22016002, -26234198, -32693292, 12039867, 113817, -2266132, -833224, 5849209, -2956011, - -9029095, -6640557, -11692512, 5401458, -3299609, 8458401, -2135673, -1932735, -3480534, 9152038, - 4153770, -4226248, -4847945, -7569343, 1636383, -1880122, 3654480, 5417028, 2936147, -6336151, - -6478422, 4153770, 11911555, -1589675, 13964012, -1964411, 8506183, -3105798, 702227, 103616, - 2460480, -4858145, 252866, 3897683, -1506460, 1556389, -4072166, 3522947, -2873870, 2882460, - -2641405, 3675418, -2813204, 2872260, 1614371, -440234, -5010080, -701690, -3821447, -834834, - 290447, -142271, 2350958, 3289945, -3411815, -583042, 1695975, -590558, 509491, 1794223, - -1502165, 767725, 996969, 1186485, -2570538, 518617, 2073932, 928250, -2203855, -479426, - -2610266, -641024, -489089, -2931852, 732292, 267899, -952409, -530428, 781147, 1993939, - 559956, 13959, 96100, 1195075, 781147, 1085553, - }, - { - -12320114, 2381559, -1311576, 23119272, 2717104, -1265942, -1954747, -6347962, 7186017, -6062347, - -9580998, 8434242, 568009, 13670881, -1595580, 3202972, -7230041, 10101763, -8240432, -11128797, - 5470715, -8837969, -21729850, -2044941, -5303211, -20758114, 1103807, 5516349, -1613834, 365609, - 3487514, -1527398, -646393, 6848862, 8577050, -1136019, 1691143, 2824478, 1691680, 2186138, - 686658, 1310502, -6149320, 2269890, -1199907, -282394, -3089155, -2608656, 683974, 4225174, - 659278, 3303367, -3730716, 2276333, -3655017, -397821, 862752, 2475512, 2821257, -3147137, - 4233227, -1469953, -2084670, -4413079, 1971390, 2740726, -1690070, 4174171, 29528, -852014, - -1347009, 2499671, -105764, -672699, -571768, -2491618, -1032940, 117038, 293668, -1165547, - -1640678, 1511292, -1634235, -529892, -577673, -868657, -1298691, 2195265, 1307281, 525597, - 251256, 1305670, 63351, -1385127, 1423245, 553514, - }, - { - 727997, 29198262, -7778723, -7572564, -2850785, 76773, -940598, 239444, 1013075, 623307, - -347355, -7744363, -3750580, -4515085, 28505162, -5509370, 10442139, -9213242, 3369939, 6642704, - 7027640, -1355062, -16538845, 3651259, -3439195, 7580618, 5319854, 6063957, 8413841, 1731409, - 1256815, 4301947, 694174, 4223027, -3885872, 1791538, 338229, -1141924, -7878581, -9262097, - 1815161, -1921998, -740345, 688805, -5760088, -5817533, 3450469, -2036888, 3279745, 1130113, - 1604707, -840203, 3489124, -1500554, 899796, -3324842, -688805, 2144799, 24159, -388695, - -1375463, 2722473, -1605244, -540629, 38118, -1004486, -3547106, -767725, -233539, 1700270, - -445603, 3134253, 343061, 320512, -1197222, 2119566, 1007170, -1360968, -1277216, -964220, - 2155000, 396748, 1624571, -478889, -1186485, -2039036, -437013, 1595580, 266825, -4832, - -141197, -547608, 265751, 1015223, -856309, -777389, - }, - { - -16760573, 42374684, -16533477, -16273631, 4741644, 1865626, 4293894, -14353244, -6912750, -5557688, - 20135344, 7796440, -843424, 7360500, 8686571, -1955821, -21963926, -2434710, 7480223, 2060511, - -133144, -5221070, -3712999, -2691334, 14215805, 6359236, -1224066, 227633, -6637335, -1353989, - 198642, 1280437, 3298535, 1583232, 1216550, 3064996, 4586488, -2859911, -8581882, -1200980, - 688269, 3375844, 1126892, -1846836, 125628, -2258616, 1289027, 4668630, 1960653, -4173635, - 1083942, -798864, -114890, -2316598, 2167348, -490163, 114354, -3730716, -1279363, -292058, - -1554241, 2344515, -5429376, -353261, 1323924, -1589138, 1717987, 1657321, 187905, 1945083, - -1221918, -2415382, 1887101, -584652, 1915019, -848256, 1064615, 1399623, 2377265, 179852, - 518080, 899796, 2102387, 1219234, -276489, 1802276, 485331, 422517, 602906, -493921, - -100395, 932545, 1512365, 527207, 466541, -81604, - }, - { - 457951, -23007602, -6371047, 3019362, 503048, 403190, -190589, -1125818, -4474282, -1854352, - 3445638, -8091719, -1072668, 5151277, -2022930, -2511482, -14728517, -948651, -4525822, 9806484, - 9001715, -2549600, -3458523, 142808, -15162845, -8506183, -10856604, 4557497, 5625871, -6614787, - 5517423, -1323924, 3045669, 671626, 9266929, 407485, -5195300, 160524, 1122597, -5760625, - 5762773, -968515, -10613401, -2760590, 5710696, -4751845, -22549, 552977, -8291435, 3985193, - 541703, -2113124, 5558762, 1512902, 1427003, -1777043, -911070, 1063004, -6017249, 422517, - -2191507, -673236, 2771865, 2617783, -313533, 18254, -433255, -1149978, -443455, 680215, - -69256, -504122, -682900, -3208878, 1042603, -1720134, 1610076, 781684, 547071, -2695629, - -1448478, 293132, -559956, -1431298, 299037, 2473364, -1144072, 935766, 187905, 771484, - 1697586, -314606, -1925756, 1570347, -361851, 1020592, - }, - { - -25283936, -10525354, 7628936, -64885144, 9825275, -1654099, 10150618, 11121281, 1380832, -3477313, - 11931956, 9807558, 13209709, -1541356, 8712878, -3524021, -21680994, 999654, 8328479, -94489, - 1306207, -6506876, 1941862, -5437966, -9133248, -426812, 8836358, 2836826, 4339528, 2637647, - -1073742, 343061, -3346853, 4387309, -3776350, -1228361, 938987, -1296006, 1087701, -1420560, - 3984656, -3401077, -5490042, -3564286, -437550, -1015760, 6089727, -2087354, 914828, -2036888, - 243739, 2987150, -1873143, -2247879, -104153, -1838246, -823023, -418759, 4027069, 1562831, - 2021856, -3185255, 1318018, -501974, 4166655, -2182380, 1714229, 1719061, 822486, -671626, - -1739999, 1773285, -773631, -741419, 230854, -1030792, -2787971, 679679, -39192, 498216, - -1203128, 2596845, 1895154, 301185, -2238752, 1074279, -600759, 551903, -619549, -131533, - 1280437, -160524, -1890859, -85362, -720481, 1103270, - }, - { - 2108292, 6694781, 10003516, 3684008, 4218195, 1942399, 1674500, 741419, -4469451, -2560338, - 8524436, -2994129, 1783485, -6296422, 13254269, -6487011, 1873143, 4587562, 810138, -4300873, - 14851997, -10989211, -6589554, -44023, 510027, 481036, 10771241, 8626979, -653372, -2979634, - -7495792, -19225348, 11820287, 4247186, 4939750, 1343251, 1303523, -3140158, -1357210, -9529996, - -7593502, 6030671, -3153043, 5238250, -7281044, -26844, 4779762, -3663607, -2939905, -1356673, - 992674, 802085, -2180770, 865973, 1217623, 3304441, 1586454, 1321239, 3819300, 2477659, - -2343442, -881005, 2437394, 894964, 1146219, -1496259, 288300, -1233729, -3920768, 544924, - 1601486, 227096, -941135, 1555315, 1571958, 284542, 2294586, -1524177, 1156420, 707596, - -1065689, 1633161, 1227824, 102005, 1310502, 686658, 383326, 2001992, 1706713, 699543, - -1582696, 130997, -27380, 322123, -1594507, -1387811, - }, - { - 11324755, 58631672, -5798743, -3145527, -25812754, 17995912, -28595892, 5419712, 5350993, -4872104, - 8108362, -19915226, 20345260, -782221, -4058744, 8621073, 1120450, 6986301, -14928769, -1901597, - 3084324, 6665253, -15753403, 4689568, -5989869, 4548907, -2544231, -1358820, 3491809, 3874597, - -882079, 5734318, -1590749, -10349261, 2152852, -1847910, 5550709, -1216013, 4638028, 2621004, - 1009854, -281320, -1902671, -697932, -1066763, -4297115, -2433099, 1631551, -1955284, -3476239, - 1390496, -1562294, -5501853, -405874, 6946573, 2175938, -6154152, -87510, 3198677, -3284039, - -4802311, -1605781, 3412352, -1254131, 1312649, -1585917, 767189, 798327, 333397, -539018, - 128849, -1624035, -482647, 155156, -788663, -1488743, -1254131, 750009, 1038308, -1194538, - -405338, 1795296, -1283122, 483721, 1074279, 108985, 2661806, -696322, -727997, 1197222, - -926102, 1211718, 1979443, -443992, 1284195, -1214402, - }, - { - 2624762, -24327232, -3974455, -6465000, -6210523, 7276212, 15752866, -4883915, -5426155, 8246874, - 2217277, 5299990, -11919608, -12159052, -3111167, 1752347, 980863, 562641, 6791417, 17925582, - -13093208, -3203509, -7555921, -13192529, 2746095, 3076807, -4840965, -498216, -12921946, 5038534, - -2406792, -2758443, 7963943, -10792179, 8111046, -2493766, -429497, 4800163, 477278, 1337346, - 1212255, 5369246, -383326, -1278290, 700080, 2505040, -604517, 6693170, -4750234, -6686191, - 1330903, -472983, -2303176, -1089848, -336081, 1188095, -4042101, 7203197, 2225867, 36507, - -3696893, -4767414, 1339493, 2112587, 1828046, 4210142, -1641214, 1025423, 750009, 2687039, - 2832531, -435939, 1398549, -2167885, 265214, 774705, 1896765, -2446521, 422517, -2421825, - -70330, -821413, 1815697, 181462, 980326, 1399623, 1291711, -1509681, -1110786, -660888, - -860067, -310311, 508417, -338766, 161061, 1161789, - }, - { - 2808372, 51627656, -6118181, 27131308, -793495, 47436840, 515933, -7399692, -6838662, -2762201, - 17871358, 1547799, -884226, -14618458, 10907606, 3749507, -7006166, 13836774, 6513318, -17229798, - 8128763, 2496987, 2615098, 648540, 3957276, 9391483, -144955, 3322157, -7869991, 4327180, - 11086921, -8531416, -205085, 5934571, -89657, -492848, 3662533, -6131603, 2070174, 2988760, - -5199595, 1266479, 3697967, 1836099, 425739, 3306588, -7080254, -5601174, 76236, 1487132, - -3692598, 698469, 71941, -1793686, -2603287, 246424, -5750961, 1603097, 1065689, -492311, - -665720, 438624, -2070174, -7261716, -1801739, 1697586, 1968706, 2064806, -185757, 871878, - 287226, -545998, 1768453, -1770063, -1705639, -1237488, 807991, 173946, -733903, -913217, - 940061, 379568, 113280, 962073, -293668, 1287953, 1447404, -1420024, -1724429, 811749, - 610422, -208843, 559956, -747861, -247497, -1973538, - }, - { - 1126892, 9105868, -581431, 3757023, 2448668, -85899, -5122822, -4808753, 5269925, -1702955, - 2319819, 4346507, -6235219, -8682276, -11824045, -7185481, 3123515, -7219303, -4037269, 4661114, - -1970316, 6274947, -2611877, -3030100, -2820183, -3978750, -5544803, -7143605, 6757058, -11755325, - 14488535, -10931229, -565325, -3873524, -5082020, 4669167, -10474888, 6987375, 2178085, -5872831, - -3903052, -132070, 8053, 1999844, -3020973, 2405719, -6503118, -176094, -1505386, 729608, - -5734318, -1609539, -1757715, 5952288, 1468879, -286689, 2367601, -438087, -4969814, -1344325, - 1065152, 686121, -4131759, -4001299, 1413044, -1915555, -579284, 646393, 1585917, 6220724, - -3599720, -509491, 1189706, -647466, -1930588, -127238, -1752884, 1091995, -2011118, 531502, - 2554969, -1821066, -505732, -1058173, 849330, -1661616, 1274532, 851477, -489089, -182536, - 546535, -1060857, 2913599, 153008, 2158221, 1126355, - }, - { - -8752070, 59652800, 252329, 5832566, -2598455, 11953431, -9568650, 9645423, -16184511, 5725192, - 4180614, -19100256, -8881455, -11815992, -28290950, 2837363, 2141578, -1163936, -5606543, 5418101, - 9948755, -14921253, -1432372, -229244, 3337190, -21568788, 14496, -10358924, -4221953, 4174171, - -6887517, 7889855, -3305514, -5610301, 7033546, -1174137, -10478646, -3558381, 11415486, -5482526, - 2464238, -2041720, 3977677, 2296734, -177167, 3190087, 7482907, -1055488, -1313186, -6432251, - 5949604, -3267933, -4275640, -3110093, -3118146, 4173098, -4554813, -594316, 1961726, -6152541, - -282931, -2502892, -308701, -1328219, 933082, 381715, -1442572, -765578, -1429687, 1046898, - -1398549, -1942399, 1507534, -1849520, 2180233, 45634, -380105, -1206349, -1780801, -759136, - -967978, 1271310, 1954747, -2428804, -273267, -1527935, 112743, -1226213, 100395, -765578, - -527744, -264677, -487479, 478889, -362925, 269509, - }, - { - -2165201, -22868554, -3056943, 4328790, 3193308, 2916283, -83215, 2455111, 7866770, 1901060, - 656593, -5251672, 3326989, 18950470, 27439472, -7806103, 16437377, 770947, -235149, -10673531, - 10408316, -16283295, -1026497, -9227200, -1412507, 5433671, -2290828, -1684164, -10137733, -741956, - 1099512, 3437585, 7694434, 230318, 9061307, -802085, -6318434, 878858, -2131915, -1301912, - -3563212, 4863514, 1312113, 2480344, 1292248, 6694781, -2638184, -1482838, 4940286, -818728, - 3055332, -1673427, -3650722, 8782671, -233539, -4606353, -1243393, 2591476, 214212, -301185, - 5762236, 599685, -875100, 1789928, -2402497, 3963718, 3765076, -603443, 2476049, -1703491, - -1006633, -2148558, 1618666, 1350230, -385473, -841277, -1058173, -526670, -1196685, -919123, - 2464238, 82678, 1545115, -870805, 2224256, 1792612, 1003412, -1590749, -590021, 262530, - -142808, 204548, 92342, 2181844, 72478, -156766, - }, - }, - { - { - 19127100, 11673184, -30871688, 34294240, -252329, -6068789, 310311, 5751498, -6817187, 4677220, - -1269163, 6859600, -2560874, -1524177, -3189013, 490163, 4987531, -8022999, 1418950, 8728447, - 7446400, 5904507, -3562675, 5117991, -4954245, -5714991, -718870, 3612068, -9087077, -4481799, - 3338263, -704912, -934692, 3103114, 1504849, 3710315, -3049427, 8687645, 121333, 834834, - 1261110, -1720671, 1054951, -1654099, 3874597, -2913062, 16106, -4087198, 3610457, -1383516, - 590558, 2545842, 293668, -3070902, 1706713, -3642669, -870805, -1593970, -1365263, -3685619, - 1465658, -189515, -3619584, -930934, -1017907, 1029182, -1580548, -2962454, -2659122, 1171989, - -1944010, 1047972, -398895, -1928440, -737661, -1888175, -1644436, -753767, -381715, -832150, - -1188095, 187905, -1068910, 584652, 988916, -1127966, -17180, -1071058, 485868, 1190243, - 330176, -340376, 42413, 273804, 2099702, 862215, - }, - { - 581968, -34977140, -2430952, 31884226, 7192997, -2274185, 3556770, 5989869, 1910187, 6586333, - -14783814, -9724880, 3350611, -7676717, -6487548, 6550899, -13124346, -6586333, 10317585, -15592342, - -364535, 4844723, -13797046, -5647345, 5290863, -4318590, 7005092, -5710696, 2947421, 2341831, - -2684, 619549, -1076963, 7030862, -1841467, -6254546, 2980707, -2862059, -2099702, 4310537, - 222265, 3315715, 4115116, -2603287, -1878511, 7755637, 1748589, -362925, -2935073, -181999, - 1746978, -517007, -6251862, 2951180, 1611150, -2226941, -1717450, -3676492, -1475858, -2056753, - 1348083, -348429, 35970, 1345935, 1273995, -222265, 274341, 1263794, 2561411, -2274722, - -1626719, 1360431, 1134408, -2516851, 114354, -388158, -3031173, 357019, 1118839, 63888, - 1426466, 1191853, 1980517, -768262, 734976, -1143535, 1302449, -208306, -2042794, 2220498, - -336081, 438624, 170188, -576063, 56371, -1344862, - }, - { - -3468186, 63171452, 10226317, -54509040, 3635690, 2797634, -3880503, -3972845, 3965329, -2635499, - 7591892, 62814, -24955908, 15143518, -6049462, 6491306, -499290, -4305705, -17812304, -13229036, - -4337380, 1529545, 3477313, 2058363, 13654238, 4726075, 6952479, 1216550, -2114198, -5364414, - -893353, -2825552, -2202781, -16270410, 9561134, -6988986, 10737, -6622303, -3603478, 907312, - 2170032, -1293859, 3549791, 3534758, -318901, 3136937, -6898255, 2375654, -856309, 2473364, - -3459596, 5003100, -4308389, -127775, 727997, 3811247, 1917703, 871342, -2332704, 1080721, - -108448, -4763119, -1262720, 2209224, -4678293, -2061584, 2061584, -845572, -972273, 1702955, - -2250026, -470299, -34360, 403727, -879395, 586800, -1357210, -685584, -762357, 1748052, - 513249, 2390149, 2177549, -1199370, -179852, 198105, 282931, 195421, -231391, -143345, - -512712, -883153, -724776, -129386, -35970, 1020592, - }, - { - 6516539, 22121766, 9213779, 28926604, -4960687, 2586107, 644245, -6332930, 4784594, -13033078, - -9605694, 11041824, -5580773, 1424855, -1675574, 6237903, -5812165, 14153528, -941135, -10452340, - 4225174, 1033477, -2355253, 9103183, -3056943, -14242648, 4530117, 12603045, 8931921, 700617, - 7384660, 3113315, -1350767, 7654169, 8003135, -2452426, -2079301, 2109903, -3199214, -1632625, - 1044751, 5292474, -287226, 2887829, -2255932, -1483911, -6063420, 1881733, 3301219, 2019172, - -1772748, 3402688, -2455111, 1060857, -6286222, 1421097, 2731062, -1690607, -413391, -809064, - 2732673, -3471944, 1833951, -593779, 1824287, 1358283, -994285, 3962107, -2744484, -461172, - -1297617, 1575179, 9664, 1505923, 1233193, -2517388, 739808, 1040993, -728534, -444529, - -1858110, 1400696, -3047816, -2568391, -1427540, -931471, -1119376, 650688, -191663, 54224, - 198105, 726386, 639413, -40802, 753230, -547608, - }, - { - -38655, 35416836, -3127810, 906238, 5534602, 441845, -717796, 2222646, 4565550, 2204392, - 1835562, -4132296, -2191507, 7282654, 37847788, -3484292, 12357695, -3159485, 8160438, 695785, - 2026688, 3661997, -7648800, 3955665, -2655901, 14367202, 8808978, 1982127, 4459787, -5278515, - -6185290, -4634270, -1327145, -941135, -15478525, 1361505, 390842, -167504, -2930778, -8814884, - 205622, -325881, 2251637, 4359392, -2709588, -1762547, 4610111, -4958003, 1523103, 638340, - 3900904, -2292976, -2130304, -4714801, -1493575, -2392297, 3643206, 2985002, -480499, -2052458, - -1553704, 2862059, -4334696, -1879048, 1739462, 1934883, -2758443, 91268, 803696, 1126892, - 259846, 507880, -2909304, -683437, -2860448, 200253, -497679, -2221035, 278636, 640487, - 1968706, 366146, 824634, -276489, -998043, -2376191, 633508, 1081795, -809064, 325881, - 638340, -55298, 607738, 401579, -1346472, -293132, - }, - { - 4380867, 73555072, -6576669, -23722714, -12002286, 869194, 3182034, -8382703, 3964792, -895501, - 23096724, 56371, 4590247, 15479062, 7734699, 2770791, -10985453, -7008850, -4917201, 460635, - 8048232, 2442226, 2022393, -489089, 1103807, -2612414, -7861401, 6635188, 5814849, 2953327, - -3315715, -3834869, -2583960, -3095598, 885837, 4267050, 1246077, -6549289, -7589744, -1342714, - -278099, 4151623, -2404108, -6395743, 1791538, -4628901, -2206003, 2440078, 486405, -4217658, - 3292629, 595927, -464393, -251792, 4105989, -661962, 1240172, -1292785, 1625108, -308164, - -1947231, 3403762, -3540664, -382789, 1560147, -839666, -194347, -1361505, -1605781, 978179, - -442919, -270583, 3652870, 875636, 1222992, -1271310, 474594, 1114007, 646929, -1800128, - -697932, -544387, 258235, 425739, -846109, -2147, -695248, 62814, -180389, -864362, - 117038, 574989, 421981, -251792, 817118, 840203, - }, - { - 203474, -10271951, 10502806, 1672353, -1657321, 918049, 1834488, -664646, -2903935, -935766, - 5253282, -4446365, -1407676, -4274030, -15199889, -10362682, 7630010, 16842714, -5834176, 3888019, - -7456600, -10053445, 5845988, 26336740, 7368017, -5862631, -9360344, 2744484, 3045669, -5982890, - -127238, -4556961, 3213173, -318364, 3651259, -3296924, -1692754, 5629092, 1268626, -10368051, - -724239, -6957847, -7390565, 1864553, 1918777, -6515466, -2434173, -382252, -4071092, 4195646, - -1759326, -2673617, 5421860, -278099, -2130304, -2258616, 1223529, 2669322, -3839164, 4912906, - 2451890, 1596117, 3428458, 3914326, -1396401, -600759, 576599, 2164127, -557809, -2194192, - -486405, -1676111, -97711, 435939, 1200443, -2514167, 1538672, 217970, 1250372, 548682, - 1561221, 437550, -185757, -394600, -103616, 1751810, 157840, 1965484, -552977, -1502165, - 1795296, 938450, -630286, 2432562, -973884, -348429, - }, - { - 32181654, 63592360, -3870839, -72375032, 5761162, -8029442, 1500017, 3553549, -5407901, 2251100, - 4049617, -11272142, 16727824, 7095286, 8106214, 2356863, -4720706, 9621800, 14053133, 8148627, - 5179731, 674847, 13095892, -484258, -5568962, 4265977, 2005213, -1316408, -2085744, -6883222, - -1058173, 3423089, 784368, 11578695, -2215130, -1605244, -1748589, -1045825, 2112050, -2847027, - 3645890, -1891933, 341450, -1623498, 5252745, 4449049, 6008123, -423591, 4600984, 1289564, - 534723, -1355599, -5938866, -37581, 2595234, -1321239, -91805, -1416802, 4066797, 3901441, - 4051765, -2313914, 2035278, 524523, 899259, -2517388, 2572149, 1560147, 444529, -929860, - -1232119, 1806571, -155693, 602369, 1831267, -1100049, -4392678, -203474, 378494, 1765768, - -1955284, 676994, 958315, -616865, -2404108, 1479079, -721018, 1052804, 332860, -798864, - -442919, 484258, 176631, 555661, -1357747, -389231, - }, - { - -238371, -15433428, 2872796, -4152697, -4721780, -1336272, 792958, 1173063, -6529424, 64425, - 12902082, -6025839, -256624, -769873, 20507932, -5670968, -7286949, 515396, 5925445, -3588445, - 5298379, -12409234, -1108638, 8697846, 1326071, -5268315, 13338021, 4811974, 2731599, 6251862, - 2638721, -24142012, 4104915, 5790153, -2288681, -6046777, 5301601, -4769561, -4044249, -7220914, - -3259343, 3518115, -5116380, 5692443, -929860, 4743255, 3775276, -1994476, 1154809, 2066953, - 1273458, 175557, -1156957, -690416, -73551, 4362613, -730681, -990527, -79457, 2691871, - -878321, -2461016, 1182727, 2018098, -242129, -2027225, 2076080, 365609, -916976, 3282429, - 1459215, 721555, -1602560, 1111323, 1966558, -2938295, -46708, -2182917, 183610, -942745, - -1036161, 751082, -651761, 103616, 1712618, -1181653, -709743, 1480153, -485868, 188979, - -553514, -797253, -519154, 462783, -2276870, -1272384, - }, - { - -15086609, 72861976, 43891344, -3354370, -19514184, 51233592, 14260902, 13674102, -28341416, -9874130, - 21878564, -8699993, 23564338, -11438572, -17554068, 6754373, 1728188, 9379672, -2882997, 2542084, - -8355322, 2177549, -11584601, 452582, -11810086, 3489124, -2291365, 7246684, 5875516, 3568044, - 6949257, 10433549, -5005248, -4950487, 3414499, -2515777, 8135205, 1796907, 6225555, -1140851, - -6160057, -4936528, 506806, 4926865, 2473901, 233539, 1488743, -879931, -6782290, -1007707, - 7410966, 1847910, -3012383, -2905546, 946503, 2818572, -856846, -2328409, 4034048, -1147293, - -3266860, 1114544, 3817689, -1693291, 4791036, 2157147, -1068373, -1962263, 547608, 1726040, - 2136746, 11811, -2022393, -1399086, -137439, 615254, -2698313, -1173063, 326418, -133144, - 1890323, 1726040, -476741, 1735704, 762357, -683974, 2173254, -1348083, -1238561, 1753957, - -70330, 1164473, 293132, -1101122, 816044, -1650341, - }, - { - -3325915, -5735929, 13203266, -8463770, -4737886, -11758547, -2097018, -2365990, -7552700, 6784975, - 1888175, -8814347, -13788456, 5544266, 9149891, 2092186, -3321084, -7883950, -6104759, 12023224, - -8370355, -10235444, -12786655, -7198902, 5576478, 10813654, 13027710, 10971494, -8664560, 14363981, - 2422899, -1923609, 6240051, -7222525, 5076115, -7339562, -491774, 2947421, -1137093, -573378, - -2589865, 2343979, -2508261, -2218888, -726386, 937914, -672162, 6390375, -2434173, -8750459, - 2098629, 3171297, -1127429, -935229, -895501, 3220152, -4112968, 1904818, -613643, -1069447, - -1504312, -2078764, -366146, -1642825, -1453310, 3433290, 407485, 1807644, -390842, 2846490, - 2299955, -2761127, -919660, -2661269, 1276679, 690953, 1571958, -3497714, 918586, -1272384, - -270583, -154619, 2058900, 122407, 68183, -143881, 969052, 736587, 2027225, -508954, - -1065152, -2036888, -467078, 483721, -1093606, 275415, - }, - { - -18874234, 44227964, -3861176, 12754979, 15445239, 37826852, -9736154, -4093641, 397284, -8963060, - 4036196, -5177583, 3308736, -7539815, 17624398, 15014669, -22082574, -3470871, 6119255, -13861470, - 14975477, 8631274, 4588636, -8352638, 2279017, 10916733, -3059627, 338766, -7067906, -4647692, - -767725, -1570347, 5952825, 2773475, -655519, -220654, 1540283, -8207146, 1588064, 7864085, - -1398549, -345745, 5530844, -339302, -7585986, -5122822, -7178501, 1101659, 2219961, 750009, - -2980707, -1328219, 36507, 1538135, 1633698, 2867965, -5558225, 758599, -878321, 938450, - 1582696, -816044, -1089311, -3715147, -892816, -1175747, 725313, 1531156, -1467268, 693100, - 64425, -1327145, 1815161, -833761, -1720134, 537408, 2209761, -737661, 2665564, 3099893, - 2377801, 1286880, -1227824, -451508, 180926, 383326, 457951, 577136, 165356, 1734093, - -287763, -938987, 1265942, -1505386, -1150514, -1427540, - }, - { - -591632, 27997282, 7424925, -5256503, 1422708, -3107409, -5856725, -5637682, 5863167, 169651, - -3944391, -6545530, 7937100, 22490060, -5130876, 899796, 556198, -9468255, -3127273, 6342593, - -5410048, 3562675, 4058744, 10136123, 8414378, 40802, -8066486, -3230352, 23533200, -9019431, - 9713069, -15373835, -4191351, 2102923, -744640, 12991739, -7379291, 1067836, 3291019, -23085, - -3267933, -6679211, -1974611, 5632313, -4345970, -3401077, -6397891, 281320, -1269163, 4410932, - -150861, 4032438, -2160906, 3899294, 593779, 358093, 5440113, 469762, -5784784, -621697, - 1567126, 2366527, -119722, -112743, 1507534, -360240, 3050501, 25233, -3048890, 985695, - -4101694, 1039382, 1575179, 1317481, 502511, 190052, -1862942, 1003412, -4095251, -1149441, - 643171, -2606508, -1045288, -600759, 2560338, 163209, 2149631, 2733747, 1036161, -741419, - -177167, -792958, 2411624, -1479616, -23085, 955630, - }, - { - -3911642, 74225624, 842350, 11839077, 3970161, -10313827, -15995532, 14695231, -11477763, 11666742, - 17424146, -2024540, 6116571, 3003793, -12850542, -5611375, 10729902, 22621056, 6170258, 106837, - -579284, -19861540, 2174327, 3451006, 3439195, -14160507, 2755759, -8979166, -1130113, -5528160, - -19163070, 7596187, 3686693, 388695, -6354404, -7865696, -2995203, 2916283, 10249939, -2375117, - 6003291, -1229971, 889058, -2434173, -3849365, -8791261, -4589173, -1145683, 2659659, -4023848, - 3291019, -4555350, 2819109, 439160, -3688840, -1522029, -4255776, 2043331, 2949569, -4974646, - 1079111, 1171452, 3034395, 1556926, 2961917, 2733747, 1698660, 375273, -502511, 1486596, - -839666, 838592, 5572183, -1178969, 1401770, 500364, 1679332, 327491, -704912, -399432, - -2472828, -453119, 845572, -1938641, 1217623, -1865090, 74088, -1056025, 1767379, -71941, - 56371, 1624035, 493921, 2062658, 359167, 485331, - }, - { - 1656247, -25487410, -9934796, 14742475, 5921686, -1115081, -2742337, -1559610, 7475391, -3354906, - 2627983, -1100049, -1352378, -32716914, -37142876, -14634027, 13240847, 2342905, 2918430, -3411278, - 6861211, -19553376, 678605, -12270722, 1207423, 9381282, 4010963, 1039919, -11629698, -4138738, - -6039798, -3569655, -2925410, -9548786, 7026567, 7851200, 6425808, 5459441, 178778, 1548336, - 627602, 6357626, 1314260, 4202626, 986769, 2716030, -2341831, -1483911, 3834869, -1494649, - 4696547, 5708549, -1408212, 4562866, -2094333, -899796, 1893544, 2385318, 888521, 702764, - 3688303, 2319282, 1207960, 1124745, -6634114, -2338073, 2220498, -4094178, 2284386, 898185, - -3221, -1778653, 1110249, 395137, -2049773, -1140851, -438087, -703301, -2543695, -1285806, - 3903052, 1261110, 948651, -2174864, 2483565, 1568737, 1621887, -1405528, -600759, 1681480, - -128849, -1224603, 710817, 1846299, -1003949, -144418, - }, - }, - { - { - -17922898, -48811768, 40914396, 7658464, 20284056, -3288334, 7634841, 6793028, -6800544, 4177930, - -12203613, 7945690, -849867, 893890, 850940, -6278706, -491774, -10128070, 9611063, 6929393, - 9797357, -3849365, 2189897, 3351685, -1379758, -2063195, -8559870, 639950, 1933809, -4072166, - 2137820, 3376381, -8239358, 3303367, 6590091, -149250, 6248104, -2746632, 5385352, -484258, - -7560216, 2869575, 6861211, -1263794, -454730, -270583, -3376918, -1841467, 2563559, 5669894, - -3828427, 3426310, 2271501, -656056, -2632815, -949188, 636192, -3030100, -862752, 763967, - -887448, -4828617, 1200443, -2489471, 1717987, -584652, -1471026, -2604898, -1319629, 358093, - 169114, -1224066, 62277, -3749507, -1428077, -265214, -1583769, -1729798, 183073, 31675, - -2241973, 284005, -1590212, 1859721, -177167, 33823, 485868, -2467459, 1826972, 753767, - 352187, -1176284, -382252, 1568737, 799938, 1412507, - }, - { - 398895, -50371912, 4351339, 35530652, 8644695, -2182917, 2714956, 3412889, 4051765, 9238475, - -22604412, -5197984, -5162551, 5028870, -3781719, -5731634, -219580, -3669513, 4454418, -12249784, - 3700114, 2586644, -25677462, -8829916, 16107201, 1578937, -1276142, 1908576, -10952703, 3087545, - 1451699, 1651952, 6993818, -4965519, 306016, 2507724, -4327717, 841277, -5055177, 1333587, - 6892349, -127238, 3375844, -1846299, 2399276, -2296197, 3857954, -317828, -1863479, 790811, - 688805, 136365, -4758287, 1417876, -1617055, 375273, 592706, -7109245, 72478, -786516, - -1122060, 237834, 171799, -93416, -941135, 1967632, 1338956, -334471, 1482301, 1638530, - -1826972, -833761, 1770600, -738198, 46708, -3118146, -1665911, -883690, 824097, 1396401, - -269509, 2622078, 117575, 790274, 443992, -207232, -1308354, -191663, 857383, 688269, - -1421097, 980326, -108985, 358093, -634045, -1442572, - }, - { - 1568737, 97345432, -13851806, -38049652, -11704323, -15569, 1778653, -10835666, 5322002, -3031173, - -2354716, 10647761, -13232257, 9705552, -898185, 2973728, -6304475, -1122597, -21660594, -7543573, - -15393700, 10615549, 341987, 9339406, 9007620, 1962800, 9303973, -2695629, 639413, -3726958, - 2518462, -2469606, -7058779, -11790759, -2617783, 5099200, -8852464, 408022, -4344897, -972273, - -173946, -105764, 5855651, -815507, 3957812, -577136, -5141076, -521302, 2938295, -2113124, - 2912525, 2651606, -3394098, -671626, 801011, 1675574, 5542656, -1474248, -2212982, -244276, - 1782948, -4373888, -1712081, -3389803, -416075, -192200, 1170916, -1421634, -1141388, 2051384, - -772557, -1189706, -1367947, -1782411, 1855426, 1057636, -735513, -2790655, 1218160, 367757, - 1574106, 1138703, 2609730, 0, -885300, -186294, 2148021, -388158, 492311, -1740536, - -340913, -908922, 11274, -1341104, -48318, 1611687, - }, - { - 5318780, 21294984, -2908230, 24933896, 16194711, -142808, -1119913, -5555540, 5359583, -10623602, - -436476, -3577171, -360240, -4006131, -6556805, -237297, 10067403, -1958505, 6516539, -928250, - -4416837, 1673964, 16700443, -3767223, 689342, -9963250, 10787347, 4887136, 14727980, -6762963, - 2408940, 8730595, -3306051, 6798933, 3084860, 5634460, -7124814, 1520955, -6474663, 1297617, - -1883343, 7269232, 4651450, -132607, -4793721, 2015413, -7808788, 3165928, 1682554, -713501, - 3589519, -1287953, 221728, -1829656, -5152350, -89121, 4058207, -478352, -3774740, 4298189, - -641561, -3065533, 3036542, 2821257, -2368138, -126702, 3865471, -354335, -2796561, 1432909, - -1006633, -2725694, 4056597, -171799, 796716, -1218160, 564251, 1264331, -1749125, -74088, - 685584, -31675, -2454574, -3012920, -1083942, -1437203, 558883, -835371, 1231045, -821949, - -724776, 373662, 1922535, 1209033, -529355, -1032940, - }, - { - -421444, 31644782, 2076080, 7392713, 571231, 1188095, -243739, 876710, 6556805, -435939, - 1864016, -5512054, 4799089, -10408316, 32890322, 27511414, 6949794, 5899675, -10787347, 1810329, - 3302293, 2691334, -4044249, -785979, 6157910, 15213848, -992674, 109522, 4479114, -11978664, - 4850092, 35433, 405338, -3947075, -14046154, -117575, 177704, -1757179, 1240709, -5428302, - -2019708, 2659659, -3290482, 7524783, 517007, -6837588, 2475512, 1256278, -2747705, 2621004, - 1028108, -3474629, -2000381, -4377646, -161598, -3124052, 5933498, -1326071, -427886, -1421097, - 111669, 967978, -2405182, -1187022, 848793, 3402688, 440234, -5037460, 2598992, -1087164, - -974421, 1452236, -2212982, -1796370, -1211181, -2297808, 338229, -974421, 79994, 1328219, - 1968169, -1489817, -130997, 380105, -1281511, -1589675, 433792, 811212, -1086090, 128849, - 806380, 18254, 1026497, -685584, -768799, -387084, - }, - { - 15926276, 51602420, -3301756, -41211820, 8722542, -4752382, -376347, -9687299, 17190070, 2457258, - 13626321, -5860483, 12317429, 13314399, 3207804, 1108102, -3855807, -7742216, -6186364, -4198868, - 13327284, 5506148, -5055714, 8139500, -7185481, -5068599, -5275831, 6968585, 3324842, 7747048, - -5158793, -6700149, 856309, -858993, -1903744, 5409512, -652298, -6102075, -3009698, -2188286, - 1651415, -514859, -816044, -11839077, 4660040, -5050345, 1513439, -1069447, 1114544, 1217086, - -1378685, 3502009, -821413, 2212445, -472983, 387621, 316754, 1155883, 3007551, -1799591, - -1618666, 4117263, -2944737, -1479616, 532576, 2139431, -2029372, -2375654, -1442572, -249645, - -357556, 1441498, 1233193, 2821257, -1186485, 1094143, -181999, 1175747, -893353, -1403917, - -1696512, -172336, -253940, 1821603, -835908, -1389959, -525597, 31675, -1325534, -861678, - 1019518, 469225, -277562, -163209, 1152662, 701153, - }, - { - -377957, 6656126, -570694, 91805, -534723, 1269163, -412854, -1899986, -2480344, 5179194, - 117038, -5881421, 128312, -5507222, -22090090, -4547297, 13220446, 14396730, -2314451, -8690329, - -10775536, -2207076, 9816148, 6285148, 21678310, -9965398, -12106439, 6315750, -2206540, 1492501, - 4808753, -8807367, -461172, 4791036, -2209761, 1311576, -426812, 6840809, -1763084, -3136937, - -191663, -12137578, -5427765, 4345970, 227633, -3889093, -3843459, -4833449, 3993783, -2276333, - 300648, 1225139, -1373316, 2249489, -2174327, 1245541, -645856, 8053, -1394254, 4545149, - 2760590, 996969, 2545842, 5019743, -1651415, -2346663, 3282966, 1879048, -2164664, -841277, - -217970, -565325, -672699, 1107028, 218506, -2032593, 956704, 883153, -329102, 901943, - 2758980, 912681, -1319092, 1035624, 93416, -721555, 1835562, 1019518, -110595, -2262374, - 1587527, 1063541, 1116155, 1064615, 194884, -1904281, - }, - { - -29520920, 172526144, -16822850, -67843304, -612570, -6914361, -3679176, 6975564, -12579959, 2711735, - -8429947, -8415988, 18662170, 10708427, 7861401, -11396159, 10066866, 2762738, 16483011, 19743964, - -643708, 7028714, 4495220, 399969, -7995619, 11785390, -11155104, 10470057, -5965710, -9832254, - 1247688, 920197, 4343286, 8963597, -1405528, -2172180, -2979097, 1888175, -4242891, 459562, - 408022, 1686848, 3610457, -3844533, 5048734, 6953015, 1114007, 3618510, 6769406, -4287988, - -427886, -247497, -6951942, 673236, 4310000, -1596117, -641561, 2324651, -1008780, 2763812, - 4222490, 2374580, 333934, 296353, -2292976, 1879585, 1033477, 2272575, -280784, -739271, - -26307, -362925, 2020245, 883153, -274341, -2424509, 927713, -2274185, -669478, 2710124, - -1907502, -703838, 1423245, -1009317, -1001801, 2592013, -1632625, -949725, 1822677, -410169, - -1015760, -1030255, 1742146, -206158, 316754, -872952, - }, - { - -1660005, -5536750, -3141232, -7601555, -1559610, -2469606, -1204202, 1952600, -5657009, 2226941, - 6211597, 1694365, -2158221, 8636642, 5944235, 9813463, -14955076, -6381248, 9368397, -664646, - -5612986, -2769180, 7068443, 7958038, -3039226, -7044283, 19133542, -6298033, 16243029, 3271155, - -5973226, -4893042, -10113037, 694174, 2111513, -10334228, 5807870, -1711008, -10573673, -3864934, - 2595771, -976568, -155693, -901943, 3955128, 3256659, 4625680, -1935957, -2545305, 1900523, - 4504884, 859530, 1507534, -2916820, -91268, 1766305, 2265059, -1065152, -1507534, 3924526, - -3128347, 1266479, 486405, 2400887, -989453, -115964, -242666, 2507724, -5906, 2595771, - 1288490, -898722, -2071785, 2562485, -397284, -2978023, -182536, -539018, -911070, -988916, - 714575, 1171452, -2106145, 659278, 2400887, -1752347, 258235, -157303, -556735, -122943, - 1316408, -2028835, -435402, -58519, -2858301, 591632, - }, - { - 19713364, 58990304, 32221918, -13069049, -5414343, 16208133, 29895120, 17799418, -17570174, -1387811, - -38118, 8681740, 11990475, -8321499, -13669807, -4556961, 11411728, 2044404, 7410429, -6131066, - -7952669, -614717, -4152160, -1427003, -1443109, 1939178, -3182034, 8316131, 2842732, 1198833, - 8251169, 12778065, -9841918, 2344515, -2312303, -517544, 6093485, 3437585, 3146601, 2921115, - -7170448, -945430, -4278861, 2223183, 5556614, 3038689, -2796561, -519154, -3551401, -1225676, - 6886980, 2946348, -2697240, -3559454, -4308389, 1343251, 2966212, -942208, 1789391, -82678, - -1241782, 399969, 3131031, -200253, 395137, 5722507, -2416993, -3118683, 3770981, -548682, - 230854, 1258962, -90194, -424665, -418222, -114890, -1626182, -2308545, -52613, -813896, - 1820529, 1423782, 2917894, 1242319, -753230, -846645, 2720325, -1467268, -74625, 536334, - 78920, 645856, -450972, -861141, 1394791, -1844689, - }, - { - 4272956, 1826972, -612033, -1063004, -3903052, -14203994, -2729452, -9089225, -5561446, 12307229, - -2868501, -19778862, 1758789, 1130113, 18000744, -2808372, -3022583, -12982612, -6328098, -1384053, - 10560251, -18323942, -5172215, -6522445, 490163, 12384538, 12629888, 3689377, 1919314, 8423505, - 6067178, 587337, -1013612, -2597382, 653372, -4502200, -2498597, 513249, -976031, 2051384, - -3516505, 479963, 2074469, -2662880, 3843459, -2017024, -2050310, 467078, 2464774, -3863860, - 1416802, 1480153, -3286724, 224949, -1279363, -1289564, 2695092, -940598, -1305133, 245350, - -2116882, -380105, -1634772, -1200980, -898185, 2205466, 908386, 3098282, -747861, 325881, - 952409, -1496259, -2785823, -301185, 1480690, -2064806, 163209, -1964411, 2379949, -1520418, - 158914, 1469416, -1160178, 1509144, -1057099, 106300, -682900, 982474, 1979443, 221191, - -105764, -2152316, -1344862, 1498944, -1371168, -743029, - }, - { - 27001386, -23561654, -8497056, 12603582, 37156300, 2367601, 13393319, -13517873, 9955197, 130460, - -11165841, -10355703, 7596724, 5139465, 16690780, 7738458, -3675418, -21801790, 6060736, -6639483, - 14820858, 8514773, 4898410, -8810589, 5000416, -1491964, 3709241, -3332895, -86436, -5801427, - -3139621, 6777459, -1931662, 7321846, 291521, -4569309, -4660577, -517007, 3610457, 2711198, - -686658, -2878702, 12171937, -7087233, -8344048, -7835094, 435939, -2306398, 3605088, -5280126, - 746251, 435402, 1208496, -2337536, 883690, 2087891, -868657, -3455301, 70867, 380641, - 3259880, -2294586, 1282585, -3191161, -1871532, -586263, 108985, 489626, -1422171, 1645509, - 211527, 856846, -476205, -306016, -755377, -462246, 2056216, -1979443, 4622459, 3700114, - 1136556, 175020, -1016834, 488553, 568546, -1182727, 684510, 849867, 1829119, 1094680, - -750546, -169651, 142271, -61740, -1312113, -1174137, - }, - { - 369367, 40541808, -5799280, -1153199, -5980742, 1942936, -4285841, -6754373, 670015, 1266479, - 1635846, -3088618, 1436667, 37143416, -21920976, 12386686, -3530463, 251792, -13879724, -6087043, - 3866008, 688269, 12385075, -5033702, 6726993, -4202626, 6855842, -1320703, 9465034, 13624173, - -15788837, 221728, -4722854, -2398739, 2338610, 2870649, 6657200, -8189429, 7460895, 1284195, - -4473746, -6015102, -239981, 4168266, 536871, -8211978, -4081830, 220654, -1937567, 5119601, - -621160, 9033927, -2569464, -2047626, 1216550, 5122286, 1361505, 1074279, -2717641, -2374043, - 323733, 5069135, 564251, -409633, 391379, 3717294, 3321084, -394600, -1100049, -5673115, - -2901787, 1468879, 294205, 3901978, 1433445, -898722, -1894081, 555661, -4216048, -801011, - -1422171, -1446330, -1067836, 811749, 2382096, 296353, 1461363, 3179350, 857920, -212601, - -1681480, 106837, 971736, -2766496, 1236951, 819802, - }, - { - 17496624, 51660404, -12904229, 5289789, 20058034, -31362924, 6268505, 4468914, 2243047, 1233193, - 21031918, 9259949, -3111167, -15018964, 10395431, -10577968, 22697828, 11752641, 18256832, -8007967, - -10642392, -2289755, -3352222, 11173357, -6918656, -10633802, 10370199, -9840307, -1749662, -13008382, - -3925063, -2441689, -1644436, 6672232, -10173167, 344134, -5509370, 5042829, 666794, 4046396, - 6479495, 1690607, -595390, -8472360, -3124589, -6601902, -10840497, 5272073, -1462973, 6732361, - -8194798, 2027761, 1650341, -290984, -4099010, -5447629, 2132988, 3694746, -3954054, -2827699, - -6979, 1681480, 3291556, -872415, 5140002, 1698660, 5920076, -3435437, 2946885, 1820529, - 265214, 1014149, 2603287, 678068, 2550674, -75162, 3469797, -1983738, -2277407, 37044, - -1552094, 639950, -433792, -188442, -719944, -884226, 269509, -1105954, 508954, 1158567, - 170725, 1311039, 353261, 1132798, 1515050, 343061, - }, - { - -761820, -39068096, 1888175, 20786032, -2838437, 132070, 1415729, -1423245, 6974490, -7182259, - 3440269, -454730, 534187, -14348949, -66022236, 4495220, 310311, 979253, 3915400, 834834, - -6103686, -5213017, 2832531, -12834436, 1449015, 4178466, 3549254, 4202626, -5554467, -3209951, - -6424734, -10044318, -3864397, -7978976, 4442607, 8453033, 8055211, 6149857, 1486059, -1955821, - 5450314, 1040993, -54761, 2527588, 2624225, -1583232, -1420560, 4031364, -1556389, 2724083, - 1400696, 3811247, 2952790, -1334124, -1482838, 2901787, 1138166, 1835562, 2647311, 4103841, - -3389803, 5289789, -72478, 723165, 76773, -8130373, 1658931, -660351, 587337, 1069447, - -1515587, 1139240, 642635, -333934, -338766, -2157684, 243203, -365609, -1064615, -4286914, - 2867428, 3413962, -1351841, -265214, 1168768, 1239635, 1084479, -313533, -39728, 2312840, - -492848, -2641942, 1062468, 2405182, -1775969, 706522, - }, - }, - { - { - 16249472, -134402944, -42671572, -33271502, -20793548, -1506460, 8770323, 3401614, -2864206, 8311299, - -9752797, 3587372, -1257889, 8520141, 2009508, -11514270, -11996381, -12722767, 11769284, 3686693, - 6241125, -3910031, 5632313, 7292855, 5206574, 2676838, -6100464, 3029026, 1694365, -6947647, - 7935489, 5227512, -4959614, 3840775, 5111011, -4668630, 5569499, -4420058, 5802501, -508954, - -2932926, 4121021, 2786360, 1535988, 4745939, -77846, -3180423, 5613523, 5784247, 7140383, - -959925, -1165010, 103079, 5637682, -903017, 1801202, 7313256, -1149441, 176631, 3036005, - -3228742, -5164698, 6003828, 897648, 2729452, -1266479, -30065, -174483, -241055, -1120450, - -2076617, -2520609, -1152125, -4974109, -459562, 2190970, -13959, -816044, 442919, 1759863, - -992674, 983011, -865973, 2135673, 350577, 1151588, 1334124, -1669132, 1241782, 703301, - 1003412, -871878, -210453, 1176284, -1199370, 49392, - }, - { - -742493, -49639620, 2505577, 14337675, -7592429, -4543539, -1827509, -6411313, -8631811, 283468, - -9212705, 4908611, -5167920, 22510460, 12623983, 8179765, 13934485, 6331856, 5763309, -5328981, - 10313290, 4184909, -18249852, -15202574, 15294915, 1313723, -14090714, -2485176, -11684459, 3096672, - -1819456, -3870839, 3021510, -1613297, 411243, -317828, -5314485, 858993, -339302, -375273, - 497679, -7032472, -2941516, -796180, 4738960, -5986111, 3537979, 1728724, -6084895, -1722282, - 250719, 628139, -1292248, 1087701, -5468030, 503585, 6296959, -3795141, 614717, -2341831, - -113280, 1933809, -416612, -3089155, -4585952, 2978023, 1238561, -3520263, -981400, 1734630, - -1222992, -680752, 2254858, 540629, -894427, -3868155, -2298344, -2235531, 765578, 695248, - -1911261, 2572149, -1283122, 957778, 1225139, 235149, -1017907, -613107, 15569, -931471, - -1932198, 470836, -32212, 202937, -558346, -67646, - }, - { - 634581, 120387936, 7793755, -5623723, 2185602, -3267396, 4303021, -7961796, 2873870, -6223945, - 595927, 12086038, -2762201, 7085086, 3391951, 13285944, -9684078, -3532074, -9214315, 7907572, - -11439645, 3443490, -3809636, 9103183, 4060355, -5661841, 5193689, -3288871, 3019362, 2487860, - 1156420, -1512902, -3038153, -2670396, 1329292, 2958159, -4975183, 10426033, 3538516, 3307125, - -6008659, -7160784, 8212515, -1720134, 536871, 4270808, 3689377, 1010391, -310848, -1268626, - 7288560, -573378, -4148402, 1417876, 512175, -662499, 3575560, -1238561, -1743220, -3082713, - 1369558, -2830920, -1654099, -3849901, 2066953, -395674, -972810, 448824, 32749, 969589, - 114890, -1738925, -1581622, -838592, 2705293, 1573032, 482110, -1403381, 1764158, -1473174, - 1160178, 346819, 1333587, 415001, -431107, -940598, 1293859, -423591, 867047, -893353, - 1371168, 299037, 799401, -205085, 1359894, 2150705, - }, - { - -19335942, -9638443, 12137041, 20390358, -1625645, -5126581, -393526, -1123134, 11478837, -9889699, - -4105452, -441845, 2448668, -8178692, -5327907, 6604586, 8589398, -10649908, 11745125, 5706938, - -1305670, 8080444, 20111722, -9400073, 1958505, -9896678, 6873559, 876710, 2838437, -12863964, - -1367410, 5334350, -5519570, 5368709, 4073777, 9252970, -8234526, -1233729, -3882114, 1094680, - -8451959, 900333, 2556043, -345208, -7982734, -2492155, -4133906, 1167157, -4483946, -485331, - 10656351, 660351, -907849, -1445257, -2181844, -609349, 657667, -3506841, -2368138, 7139310, - -646393, -1995012, 2818036, 4771709, -1210644, -1717450, 2233920, -1149441, -1238561, 2617246, - -743029, -3921842, 2257542, -2700461, 244813, -612033, 879395, 1398012, -1036698, 762357, - 1294396, 687195, 814433, -824634, -754304, -694711, 2180770, 1038308, 2239826, -1023276, - -677531, 305480, 897111, 478889, 26307, 393526, - }, - { - 1083406, 27699318, 471373, 8534637, -1181653, 1175210, 2109366, 447750, 1962263, -2615098, - 6147709, -2649458, 4903779, -1956895, 18233210, 6892349, -2754685, -10388452, -7729868, 9918153, - 4383551, -1096290, 4519916, 14379551, 15080704, 16525424, -11065446, -14896557, -4568235, -7689065, - 19394462, 22049826, 12404939, -4872641, -7836705, 805306, 1348620, 2557653, 7480760, 1422171, - 236760, 1541356, -7033546, 1092532, -468688, -4798016, -1521492, 1222455, -1592896, 1973001, - -1716913, -6173479, 159988, 1611, 3031173, -1187559, 2662343, -4459250, -4288525, -481573, - 1462973, -3139621, -1251446, 388158, 1141388, 6081674, 841814, -7903277, -223875, -2296197, - 784368, 1996623, -3290482, 471373, 2056753, -3772592, 553514, 811749, -1910187, -75699, - 1497870, -3740380, -470836, 438087, -1451162, -253940, 810675, 136902, -1033477, -453656, - -1030792, -1040993, 90194, -547071, -273804, -1443646, - }, - { - -37085968, -3175592, 26751204, -49744848, -5713917, 381178, 3424163, 758062, 19264002, -18629958, - -12644384, -10681584, 10582799, 6469832, 5913096, 1042066, 4372814, 551366, -6529424, -6455336, - 12527883, 3568581, -8284992, 13803488, 337692, -5063230, -710817, 13127031, 3751654, 3027952, - -8577587, -7648800, 470836, -154082, -2962991, 7205345, 801548, -2681670, 5364414, 688805, - -1675574, -5217312, 720481, -9205726, 8171176, 1372779, 4813048, -1410897, -948651, 4630512, - 1344862, 4310537, -1165547, -693637, -2689187, 2294050, -102542, -556198, 543850, -1575716, - -3024194, 1446867, -2433099, -1007170, -1199907, 217433, -899796, -121870, -1242319, -1336809, - 1226213, 3098819, -1845762, 95563, -818728, 2579128, -457951, -376883, -1760937, -674310, - -1065689, 496069, 27380, 1345935, -1142461, -1438277, 9664, -236223, -1577327, -1204738, - 683974, 324270, -462246, -329639, 574452, -64425, - }, - { - -608275, 10902238, -3114388, -1108102, -2225330, 437013, 338766, -2323577, -4221953, 1062468, - -4439923, -1677185, -46708, 4671314, -16626355, -3988951, 7506529, 2445447, -9139690, -19271518, - -9068823, 2660732, 4190814, -7638600, 15633144, -16717086, -18333604, 10743324, 4198868, 3293166, - 11108933, -6312528, 3776887, 6075231, -4214974, 3198677, 3554086, 4799089, -4491999, 3614215, - 2990908, -5092758, 1839857, 4953171, 1074, -1436130, -504659, 389768, 7070053, -4108136, - -39192, 807991, -2530273, 5314485, 781684, 2245194, -4145180, -3234647, 691490, 3062312, - -655519, -2206540, -1619740, 2479807, -1923609, -3077881, 2535641, 915365, -2372970, 561030, - -764504, -1604707, -853625, -707059, 831076, 314606, -38118, 81068, -34360, -499827, - 435402, 535260, 456877, 1042603, -657667, -712965, 818728, 37581, 239981, -1768453, - 650688, -163746, 961536, 583042, -37581, -1360431, - }, - { - 14976014, 281923264, 21198348, -61312804, 3754875, -18498424, -16544751, 10606422, -9171366, -2318746, - -10026601, -4465692, 10733660, 3813931, 12820477, -12083354, 6553583, -1261647, 3656091, 9573482, - -12599287, 4013110, 5969468, 2042794, -8953933, 5364951, -13979045, 11010686, 3438658, -3187403, - -6216965, -1959042, 733903, 4506495, -6046777, -5592585, 906238, -1959042, -4255239, 3176128, - -703301, 7000260, 5124970, -1385664, 998580, 3030100, 2177012, 346282, 3795677, -2960306, - -1358820, 1610076, -3512210, 3596498, 6866042, -574989, 362388, 4835597, -3791919, -1629940, - 2299955, -258235, -855772, -623307, -3439195, 3582540, 623844, 139050, 877247, 2188823, - 381715, -1562831, 2276333, -40802, -2391223, -100932, 4891431, -1482301, 56908, 1310502, - -1997160, 520765, 1163399, -905701, 276489, 2858838, -549756, 111669, 832150, -1535988, - -741956, -768262, 1816234, -941672, 1039382, -1190243, - }, - { - 235686, 6306086, -2129767, -3323231, 3268470, 215285, 268435, 4363687, -1561758, -1597191, - -1024350, 2782065, 112206, -1106491, -5801427, 16695075, -933619, 3685082, -4267050, -16916802, - 2094333, 7296076, 4729296, 10850698, -3558381, -9814537, 14923938, 1022739, 12310987, -6218576, - 588947, 89121, -11913166, -5306969, 210990, -8686034, 169651, 1562294, -6075768, -4252018, - 2053531, -5383205, 2647847, 1675037, -2879776, -3856881, 3376381, 1239635, -2741263, -446677, - 6194417, 1316944, 4346507, 353798, 1884417, 1636383, 3304441, 855235, -457414, 2157147, - -2645700, 4333622, 2591476, 3428995, 3008625, 1056562, -1184874, 2229625, -1072131, 2155000, - -102542, -2067490, -1820529, 2463701, -868120, -1555852, 1342714, 1291711, -933082, -308701, - 1781338, 1707786, -2070711, 431644, 2591476, -1139777, 334471, -1257352, -555661, 415538, - 2148021, 168041, 333934, -207769, -1424319, 1364189, - }, - { - -24207510, 23035520, 38223060, -13353590, 1102733, -4734665, 993748, -2524367, -8170102, 13988172, - 6904160, 7348152, -1865090, 5819681, -3546032, -17569638, 8893267, 3689914, 7053947, 331249, - 7875360, 14031121, 3934190, 2495376, 1500017, 6081674, 688805, -1865626, -3077881, 1036698, - -2586107, -1294933, -7098507, 3445638, -5219996, 737661, 1211181, -1665911, 1867237, 5891622, - 1772748, 10703059, 248034, 2269890, 786516, -3497714, -5481452, 3403225, 702764, -1797981, - 2701535, 1029182, -3369939, -969589, -1534914, 1074, -988379, -944893, 4449049, 1206349, - -2430952, -1780801, 600222, 353798, 550830, 4443144, -2282238, -3533148, 3677566, -3573950, - -6105296, -1057636, -802085, -1118302, 1805497, 1184874, 445603, -1606855, -459025, -450435, - 1209570, 1705102, 3045132, 921271, -941135, -1494649, 3073049, -112206, -491237, -754841, - -682363, -911607, 533650, 724776, 1748589, -794032, - }, - { - -4021163, 9318468, 17048872, 2770254, -3815542, -8587787, 15032, -9277129, -9339406, 1503239, - -10606959, -14578193, -2614561, -620086, 23564874, -7195681, 4466766, -6135898, -4974646, -1437740, - 12598213, -8606578, 6589017, -3118146, -6412386, -2063732, -2844342, -4600447, -1533840, 1083942, - 4882841, -1552631, -339302, -2042257, -1417339, -1744294, 936303, -1277216, -5487895, -552977, - -90731, 1250372, 113817, -2635499, 6245420, 2227478, -2241973, -5473399, 2641942, 4020626, - 284542, -3043521, -3631932, 836982, -675921, -3199214, 1895691, -2439542, 574452, 2804077, - -2866354, -148713, -597537, 1336809, -418759, -1162326, -345208, 2308545, -1541356, -363998, - -459562, -2970507, -2939905, 8053, 911070, -1166084, 724239, -1640141, 3307662, -84826, - -22549, 437550, -2661806, 1398549, -342524, 920197, -1497333, -1102733, -420907, -231928, - 1171452, -769873, -1096290, 1728188, -789737, -731755, - }, - { - -18009872, -86291800, -6187438, 9612674, 35537096, -11175505, -1783485, -10249939, 13727252, 16193637, - -5522791, -12617003, 15835544, 7472170, 7289633, 3082176, 15012521, -10553272, 51003, -10239202, - 8406325, -3635153, -763967, -14561013, 1320703, -937914, 5115843, 1433445, 7259032, 466541, - 3956739, 13673565, -427349, 4071092, -2409477, -9762998, -8972724, 2885144, -3316252, -6950331, - -5372467, -4746476, 7467338, -8156143, -6565932, -5039071, 2948495, -4770098, 488553, -6590091, - 3442953, -675921, -1246614, -731218, -4380330, -299574, 2479270, -4852776, -862752, 2279554, - 4953708, -3192235, 257161, -4342212, -2566243, 1319629, -177167, -387084, -317828, 1260036, - -492311, 1278827, 318364, 644782, 1944010, 413927, 1518271, -4006131, 912144, 739271, - -1614371, -1867774, -856309, 1738925, -147103, -2111513, 1272921, 381178, 1118302, 664109, - -402116, -691490, -894964, 1512365, 347355, -816581, - }, - { - 477815, 40863928, -107911, 9925133, -7327751, -9084393, -5891085, -3297461, 756451, 7288023, - 7448547, 2427194, -13605920, 14792941, -17041894, 20251308, 537408, -1203128, -16160888, -4596152, - 9256728, -11792370, 2690260, -5161477, -8950712, -4821101, 15220290, -4359392, -12011413, 6461779, - -20528334, 8842801, 35970, -7094212, 1675574, -7294465, 2731062, -9826885, 3344169, -463856, - -4012036, 204548, 4400731, 551366, 4582730, -2236604, -858993, 2520072, 1409286, 4903242, - -3898220, 3312494, -4852776, -124017, 3510062, 7422241, 2422899, 3701188, 1957431, -2134062, - -53150, 6704444, -749472, -570694, 1052804, 2603824, 2399276, 1350767, 408559, -4201015, - -1581085, -135828, -2333241, 842887, -1134408, -2985539, -1102733, 1549946, -2380486, 1984275, - -564788, -2486249, -2146947, -1117228, 1099512, -179315, 171262, 1625108, 483721, 591632, - -1694902, -634045, -367220, -2666101, 1319092, 672699, - }, - { - -23490250, 6266894, 2109903, -8274792, 5084705, -16029892, 15811385, -10472204, 6534256, 7429757, - 6218039, 355409, -2602213, 8752606, 32084480, -16360067, 13501230, 678068, 11709155, -16069620, - -14100915, -2319819, -6964290, 15744276, 1251983, -7045894, 14754286, -7060926, -1191853, -8281771, - -258235, -7718593, -174483, 12542915, 282931, 8591545, -10551124, -4535486, -4117263, 895501, - 1418413, -5279589, -2631204, -6894497, -967441, 1637456, -3020973, 5878200, -2502892, 12242267, - -5702643, 1090922, -1971927, -1538672, -3928821, -3039763, 2700998, 2313377, -5864778, -2942053, - -1212791, 1447404, 3438121, -2990908, 1566053, -1193464, 4680978, -4078072, 2787434, 1639067, - -41339, -375810, 78383, 2410551, 4364224, -738198, 1234266, -3605625, -3306588, -1011465, - -525060, 1444183, -1217086, 1606855, 764504, -187905, -164819, -1034013, -117038, 102005, - -823560, 992674, -468688, -966368, 1432372, 1376000, - }, - { - 635118, -53541600, -13065291, 10757282, -235149, 372052, -6870874, -1023813, 5964099, -8774081, - 696322, 11097659, 7633231, 43961136, -2016487, 289910, -4671851, 2466922, 15648713, -104690, - -9882183, 1400159, 9990094, -5608691, 143881, -1761474, -8461622, -13051869, -20360830, -2785286, - 8078297, 881005, 2838437, -2936684, 461172, -5663988, -4621922, -4006668, -3861713, -8370892, - -1944010, 3724811, 1448478, -3083250, -5521181, -1896765, 4044249, -4367982, -5900748, 7043210, - -3881040, -2958696, 784905, -2890513, -2965138, 4730907, 1681480, 2163590, 3253438, 2809446, - -5385352, 3978214, -1458678, 1483911, 6099928, -3858491, 2145336, 853088, 69256, 1865626, - -558346, 2465311, -136365, -1239098, 1234803, -730681, 2783676, 2707977, 2492155, -5165235, - -1060857, 936303, -3459059, -1282048, 1188095, 841277, -1374390, -485331, 796180, 2367064, - -608812, -2443837, -108448, 1951526, -1343788, 1052267, - }, - }, - { - { - -17692580, -206925088, 32919850, -45740328, -11418171, 320512, -2026688, 15496242, -9665824, -9490804, - 9565966, 5631239, 1747515, 9643812, -7803956, -3632469, -6476274, -10691247, 3304441, 5489505, - -659814, -1630477, 9275519, 5454072, 10946798, 2462627, -7133404, 1053878, -77309, -4651450, - 3765613, -1065689, 9804873, -1765768, 4468377, -7039452, 2379412, -4618164, 7960185, 455803, - 2334852, 2900714, 2050310, 328565, 4403415, -3440269, 1660542, 3001109, 4560182, 2909840, - 6117644, -5486821, 1199370, 4172561, -1973001, 2775086, 5515812, 1840394, -1052804, 4152160, - -3089692, -2330557, 3777961, 2854543, -1782411, 1541356, -408022, 1242319, -1322850, -1891396, - 1074, -3549791, -2362769, -1943473, 153545, 440234, -1072668, 296890, -919660, 1554241, - -100395, 2509872, -527744, 2078764, 283468, -61203, 628139, -360777, -528818, 1986959, - 2144263, -819802, -43487, 156766, -510027, -847182, - }, - { - 680215, -21925808, -16470126, -3693672, 3083250, -2617246, -1660005, -6003291, -6178311, -11220602, - -8580808, 13554380, 550830, 5966784, 22297860, 20668456, -3823058, 20895552, 3580929, -11202885, - 10977400, 1096290, -4592931, -12448963, -6060736, 17024176, -9762998, -12310450, -15766288, 4109210, - 4486094, -5433134, 4781909, -1902134, 1271310, -57445, -4413616, -5360119, 2587181, 751082, - -5203890, -7888781, -1349157, 845035, 2376191, 4203163, -2194192, 2714956, -7655779, -2165201, - 1555315, -477278, 2659659, -1615982, -2209224, -3521336, 4716948, 3758, 600222, -4556961, - 2312840, 1191853, 157303, -3843996, -4312684, 4581120, -2119030, -2588255, -528818, 683437, - -548682, 1717987, -680215, 2679523, -3181497, -1079647, -3054796, -1303523, 1004486, -289373, - -663572, 770410, -573378, 1335735, -116501, -521302, 879395, -887448, -983548, -1460826, - 561567, -1214939, 308701, -449361, -2684, 1108638, - }, - { - -2831457, 116383952, 13092671, 14573361, -14215268, -2259690, 3026341, 2893734, -819265, -12826383, - -7131793, 25279104, 5352066, -12676596, 10368051, 11079942, 40265, -14966887, 3425773, 8077223, - -4725001, -4844723, -652298, -35970, 10209674, -6540162, -268972, 1653562, -1434519, 7127498, - 3102040, -7542500, 4187593, 1242319, -782758, -2994129, 3250753, 7696582, 7947300, 799938, - -3813931, -6436009, 2955474, -1741072, -4394826, 5666673, 4413079, 6227166, -1411434, 3510062, - 3738232, -918049, -114354, -2864206, 1764695, 1862942, 3114925, -374199, -3080565, -6012954, - 1765768, -739808, -799938, -1562294, -2498597, -340376, -1323924, 119722, 996432, -568009, - 1969243, -2206540, -1875290, 8590, 2080912, 1538135, -614717, 906238, 1390496, -857383, - 636729, 663036, 671089, 1272384, -1032940, -237297, -27917, 512712, 972273, -799401, - 1832340, 858457, -884226, 226560, 1601486, 1165547, - }, - { - 30003030, -65086472, -11195906, 14396730, 15551540, -5099737, -2200634, 3320010, -1076963, 4082367, - -1866163, -2234994, -763430, -9482214, -247497, 6007049, -8418673, 7465190, 13606456, -2014877, - -1838783, 9875204, 8924942, -6229313, -154082, 5827197, -5123896, 661425, -1646046, 1212791, - -11345693, 3211562, 638876, 4861903, 816044, 10026601, -5004711, -2840584, -2857227, 443455, - 1874753, -4768488, 2938831, -1896765, -7058242, -7397008, 3012920, -4403415, -2976949, 1447404, - 6937983, 3384971, -4581657, 260919, 272730, -1438814, -18254, -2964601, -1551020, 5178120, - 695248, 486942, 316754, 2197413, -646393, -1069447, 8053, 3183108, -1268626, 560493, - -143345, -1320166, 830002, -2835215, 43487, 1176821, 55835, -1501091, 201327, 1666447, - 908386, 380641, 2203318, -447213, -759136, -353798, 799401, 1646583, 1568737, -653372, - -389768, 1057636, 443992, -196495, 664109, 415538, - }, - { - -1758252, 17311940, 10597832, 6629819, -281320, 329102, 1722282, 3710852, -2922725, 734976, - -49392, 668941, 4730907, 11339787, 12662100, 3882114, -15046881, -40876816, 49386220, -5621039, - 3174518, -3851512, 8326331, 12075837, 2889439, 16113107, -2037962, -19450296, -9309878, 7317551, - 10088878, 21343840, 13612362, -1439888, -588411, -9022116, 8071318, 2135136, 1976222, 6941204, - 929324, -2020782, -3413425, -675384, -7838852, 3578245, -3234110, -1234803, 3515968, 624918, - -2656974, -2914135, -4248260, 2675765, 1387811, 702227, -3886946, 47245, -4635881, -259846, - 1614371, -2820720, 2472828, -1820529, 296353, 5127117, 112743, -3797288, -4650913, 198105, - 926639, 441308, -718870, 1245004, 1854352, -4697084, 1870995, -102542, -1317481, -318901, - 1114007, -1528472, 637266, -1968169, -991064, 142271, 750009, 694174, -910533, -445603, - -2290291, -836445, -329102, -291521, -896038, -159988, - }, - { - 51679192, -91778080, -15012521, -45780056, 6099391, -518617, -695248, 12016782, 15976741, -23019414, - -9361418, -10017474, 20411832, -2139431, 3205656, 11410117, -3933653, 3198140, 2583423, -11906186, - 4369593, 6853694, -1487132, 243739, 7436736, 185220, -75162, 12012487, -377420, 3349538, - -5046050, -10733123, -3994857, 5300527, -5500780, 7109782, 2572149, 2115272, 3853123, -5991480, - -4839892, 1022739, -779000, -4092567, 3306588, 3721052, 4635344, 134755, -3780645, 4795868, - 554051, 3449396, 2164127, -2684355, -3926137, 4326106, -1163936, -1032940, -1584843, 1179505, - -3457986, -714038, -4832, -2100239, 64425, -1224066, 97174, 543313, -1788854, -1450625, - 2318746, 1388348, 695248, -2485712, 911070, 220117, -347355, 639413, -1549410, -888521, - -908386, 1105954, 430034, 103079, -116501, -1797981, 421444, -1265942, 409633, -1166084, - 215822, -539555, 346282, -141734, 147103, -236760, - }, - { - 923955, 4648229, -820339, 93952, -2256469, -1013075, -547071, -1071058, -2172180, -2600603, - -3311957, -721018, 1319629, -12724377, 3943317, 7352447, -7849590, 2858301, -5440113, -20282446, - -396211, -4473209, 13396003, -5925981, -833761, -3627637, -14118631, -1800665, 275415, 1198296, - 16590385, -1567126, 4083977, 6010270, -3637837, 1743757, 4960151, 2134062, -7282654, 4149475, - 2228551, 748935, 1948841, 3297461, -3270081, -260382, 3312494, -1771137, 4647692, -1686312, - -1093069, 2243047, 746251, 751082, 1682554, 1711008, -3349001, -597000, -568546, -1767379, - -225486, 670015, -3083250, -523449, 40802, -1794760, 49929, 1793149, -1774895, 1134408, - -662499, -2376728, 134755, -2015950, 1589138, 1241782, -1615445, 35433, 937914, -591632, - -239981, -1407676, 1488206, 1184874, -600759, 194884, 1147830, -250182, -308701, -36507, - -531502, -601832, 370441, 446140, -662499, -224949, - }, - { - 9676024, 340333760, -14088566, -59960964, -2997350, -6263136, -19224274, -5865315, -4803921, 6126771, - -10706280, 9492951, 8674223, -8672613, 7403987, 2794413, -6344741, 16454557, -10996727, 1416266, - 3117073, -9992778, 5422396, -4047470, -1017907, 1028645, -1405528, 3803194, 2320356, 4170950, - -7247221, 295279, 546535, -64425, -163746, -1327145, 4016331, -9296994, -7159174, 6091874, - -3542811, 10652593, -1311039, 6871948, -5868536, 10066866, 3546569, -1171989, -232465, 964757, - -2922725, 3777961, 4124779, -2126009, 3718368, -745714, 604517, 6634651, -5407364, -1179505, - 2520609, -1976759, -1108102, -673773, 1969779, 1031329, 1380295, -2474975, 254477, 3422015, - 428960, -629750, 1814624, -2942053, -744103, 1378685, 2010045, 1385127, 507880, -1399623, - -422517, 2094333, 304943, -692027, 457951, 318901, 1073742, 746787, -1007170, -357556, - -471373, -471373, 1006633, -711354, 752693, -282931, - }, - { - 1344862, -2071248, 712428, 4077535, -1245541, 1429687, 1947768, -2023467, 2055679, 3816079, - -5759015, 1706176, 74625, -1335198, -741956, -3475702, 7609072, 8104067, -736587, -16832514, - 5160940, -392990, -4314832, 18061412, -8687108, 8508330, -1020055, 8843875, 3601867, -6059662, - 11926587, -11404749, -11207180, -1835562, -2579128, -2189897, -920197, -8025684, 6504728, -3950833, - -4713190, 278099, -1909113, 2581812, -5895917, -533650, -393526, 621160, 74625, 3459596, - 1050656, -1765768, 1642288, 5042292, 5992016, -2234457, 4515621, -1407139, 4025995, -3097208, - 3388192, 1981591, 2064269, 2114735, 3824132, 2469069, -2146947, -135291, -176094, 2476586, - 516470, -2092723, -930934, 1468879, -1750736, 1756642, 16643, 875636, -404264, -448824, - 2129767, 373125, -1249299, 1363652, 870805, -944356, -277562, -270583, -258235, 662499, - 993211, 2021319, -920734, -639950, 615791, 296353, - }, - { - 27893666, 9901510, -12355010, -15246060, -3383361, 20134270, -23162222, -17951352, -999117, 8984535, - 10124849, 1255741, 3282429, 11354283, -5308580, -724776, -2721399, 5796059, -188442, 7736847, - 6628209, 15340549, 7095286, -1339493, 5906654, 5043902, 6189585, -13401909, 615254, 4663798, - -12470974, -2880849, -385473, -7470559, -76236, 6068252, -6550362, -3212099, 3113851, 3218541, - 7322919, 9874130, 1776506, 3705483, -5373004, -1477469, -3275450, 2961917, -234076, 2071785, - -313533, -1982127, -914291, 2552821, -3071975, 2466385, -5189394, 1949915, 2752537, -1694902, - 194347, 226023, -1023276, -395137, 1417339, 3854733, -2764348, -1078574, 198642, -3703336, - -2653216, -4273493, 344134, -1531693, 2027225, 1655173, -427349, 476741, -1568200, 1713155, - 113280, 1670742, 2954401, 194884, -2434710, -266825, 2462090, 431107, -306553, -1596117, - 137439, -1350230, 1370632, 519154, 547071, 464393, - }, - { - 2768107, 28269474, -11360725, 9171366, -15050639, -4155918, -3295851, 1008780, -8811662, -7816841, - -13055090, -9705552, -12399571, 16680579, 4218195, -9622337, 16922708, -14694157, 9272298, 10649371, - -1378148, -7373385, 15269682, -10810433, -1012002, -7633768, -6306086, -5995238, 1424855, 2634963, - -865436, 4883378, -978716, -3950833, -1576253, 2332167, -818728, -1231582, -5970542, -5549635, - 1195075, -144955, -639950, 5175973, -2334315, 2688113, 351114, -4589173, 2080912, 3784403, - 318901, -3439195, -2545305, 499290, -2433636, -2217814, 2239289, -3077344, 3149285, 1949915, - -3479997, 941135, -943282, -1123134, -464930, -47782, -948114, 828392, 1252520, -1735167, - 825171, -2955474, -1859721, -1207423, 372052, 433255, 13959, -48318, 1957968, 2065879, - -1061931, -415538, -1545115, 664646, 785979, -1056025, -491237, -163209, -663572, -462246, - 584652, -184147, -319975, 818728, -817118, 559420, - }, - { - -5958731, -114272976, 1268089, 18770618, 11177116, 18241262, -26461830, -2754685, 15844671, 5589363, - 10351945, -16762720, 20071456, 1701881, 7719667, -3838090, 3667365, 14262513, -14732812, -6789807, - 4483946, -6644852, -3206730, -8589398, -1642288, 6544457, -3140158, 8726300, 5177583, -3354370, - 5650567, 11756399, 5772436, -2872796, -2123325, -142271, -13094282, 7743289, -14960445, -6775848, - -3634616, -2670396, -8047695, 5067525, -9410810, 245887, 2797098, -6884296, -6646462, 3246995, - 2019708, -1302449, -5629629, 7023882, -7882339, 879931, 168577, -3919158, 362388, 590558, - 2877628, -1879585, 175020, -5850283, -629213, 1082869, -1604707, 67646, 1837172, 2281165, - -938987, -432718, 1577327, 719944, 1428614, 1145146, -69793, -1589675, -1331977, -318364, - -1107028, -2178085, -716186, 1806034, 11811, -1313723, 610422, -116501, 1074279, -881542, - -3758, 448287, -1459752, 1889249, 609349, 106300, - }, - { - -1916092, 39021388, 6309307, 7858180, -7107634, -6480032, -4048544, -3626026, -165893, 7113540, - 1156957, 10481331, 583579, 513249, -32851668, 27756764, 4531728, -7089381, -12221329, -6062347, - 22972706, -9966472, -14174466, 8919036, -30491584, 4105989, 23388782, -7538742, -21617644, 198642, - -5301601, 2588255, 2201708, -5173825, -77309, -8664023, -5974300, 2544768, -5061082, -3005403, - -167504, 4904316, 7372312, -5449240, 671089, 3781182, -92879, -1501091, 4209605, 1460826, - 2210298, -3532611, -3297998, 2427194, 1371705, 4254702, 3493419, 2278480, 2339147, 756988, - 552977, 1809255, -227633, 491237, 2864743, 416075, 2920578, -1502702, -977642, 472983, - -1420560, -1003412, -1962263, -1788854, -1857573, -2968359, 2091649, -902480, 139586, 1241246, - 354872, -3216931, -838056, -2731062, 613643, 728534, -1054951, 2374043, 601832, -761820, - 163209, -319438, -2683281, 177167, -1364189, 1453846, - }, - { - 17675938, -58137216, 16204375, -8858907, -4533875, 11468636, -7528004, -9554692, -4126390, 18014704, - -8215199, -2582349, 8331163, 7668664, 29197724, 51540, 7172059, -7503308, 5811091, -4400731, - -12339441, -6418829, -6524056, 10254234, 1334661, -1449015, 9248138, -7286949, -230318, -4300336, - -2319282, -6891812, 4389457, 4495220, 8798241, 5187247, -6628745, -12918188, 4936528, -8485245, - 5496485, -3026878, -4772783, -1344862, -5669894, -485331, 380641, 6919729, 1582696, 102005, - 2131915, 2869038, -8844411, 1300838, -4861366, 2845953, -1209033, 325881, -3807489, -4719632, - 554588, 2711735, -2063195, 990527, -708670, 1360968, -92879, -998043, -1346472, 1946157, - 1826972, 371515, -970663, 2479807, 1984275, 782758, -2740189, -767189, -2052994, -1429687, - -465467, 1804423, -287226, 1101659, -62814, 1051193, -2731599, 797790, 208306, -889058, - -96100, 805306, -105764, -1683090, 1198296, 1166084, - }, - { - -659814, -62466540, -5071820, 6435472, 34897, -1324997, -8792872, 4088809, -7599945, 7316477, - -8198019, 16245714, 1949915, 1258425, 58140436, 15911243, -5500243, -10489384, 3667365, 14327474, - -6796249, -7382512, 13047574, -9170292, 6726456, -2241436, -9146670, -19206020, -18109730, -7332046, - 9210557, -875636, 9921374, -6981470, -951335, -3757560, -11581379, -2901251, -4017942, 1485522, - -6681359, -7129109, 7606924, -1132261, -9924059, -2078764, 4459787, -3283503, -2733747, 6481643, - -5709086, -3607773, -145492, 84289, -4438849, 2497524, 1836099, 2141578, -689879, 1407676, - 1942936, 1697049, -1945620, 2399813, 3890704, 2842195, -2790655, 143345, -1291175, 3755949, - 857920, -1795296, 2950643, -2973191, 1321776, 1446867, 1088774, 1749662, 570694, -1652489, - -118112, -2882460, -958851, -1035087, 1469416, -559420, -572304, -32749, 33823, 1318018, - 362388, -541166, -1213865, -348966, -425202, 1215476, - }, - }, - { - { - 18675054, -221013104, -25792890, -38145752, -2182917, -5805185, -3124052, 9785009, -18712098, -13724568, - 1191853, 7927973, -2439005, 4224637, -5386963, 1771674, 6018323, -469225, 3871376, -938987, - -12177843, -4718022, 4866198, 1894081, 9751723, -224949, -2782065, 6203544, -1460289, -5004711, - -939524, -5104569, 6039798, -10030896, -529892, -1316408, 2106682, -3266860, 6882148, -1219771, - 2536715, 2897492, -334471, -5352603, 441308, -4105452, 5386426, -38118, 2994129, -3911642, - 372052, -8178155, -4087735, -1134945, -1716913, 2200634, 2028835, 299037, 51003, 5560372, - -561567, -332323, -297427, 508954, -2229625, 3498788, 959388, 2071785, -1766842, -2471217, - 656056, -1312113, -145492, 2092186, 1533840, 464930, -2598455, -1125818, 287763, 1721745, - -706522, 1920387, -475131, 1390496, -388695, -772557, 315680, 446140, 738198, 2319282, - 1531693, -1028108, -261993, -457414, 232465, -229781, - }, - { - -694174, 21036750, 18170396, -12390981, -645856, 1338956, 1326071, 1967095, 3636764, 283468, - -1467805, 8026757, -2552821, -12999255, 6024766, 6251862, -26390426, 20681878, -2629057, -19720880, - 11256572, -2146947, 103616, 475131, -7822746, 16372415, 3690451, -645856, -3258807, 5856725, - 5136781, -2693481, -839129, -5834713, 441308, 373125, -628676, -5419175, -4451197, 2012729, - -1598802, -6138045, -628139, 410169, 418759, 2906619, -2934000, 6059662, 287763, 2537789, - -2600066, -1527398, 6256694, -746251, 1166621, -1430761, 540092, -860067, 1045288, -1519345, - 2682744, -638340, 3838090, 3105261, 1054951, 3435437, -5292474, -3261491, 369904, 1436130, - 1381906, 3663607, -485331, 1235877, -2578054, 324270, -780073, 845035, 1423245, -507880, - -899259, -11274, -662499, -204011, -738198, 138513, 1607928, -1167157, -1014686, -268972, - 2096481, -1171989, 379568, 223875, 30065, 1636383, - }, - { - 4133369, 72959144, -30057792, 18019536, 4332549, 4287988, 124554, 9475235, 8948564, 4684199, - -8419210, 13319767, -12557411, -26976152, 8641474, 10551661, 6056441, -6025839, 2927020, 5097590, - -3782256, 82678, 12216498, 5608154, 9807021, -1984812, 8732742, 5452998, -7622493, 530428, - 3373160, -2586107, 13195750, -1854352, -6810745, -4118874, 6350109, 2960306, -4153770, 1316408, - 1400159, -4780299, 2017024, 5175973, 4881767, 8403104, 1860795, 8106751, -1592896, 275952, - 2514167, -1538672, -1129040, -311385, 5348308, 638876, -322123, -1733556, -1384590, -5115843, - 206158, -1898376, -1346472, -1157494, -3094524, -399969, -3365644, -2827162, 497679, 856309, - 3208878, -86436, -2095407, -2365990, -442382, 1454920, -571768, 814970, 1502165, -104153, - 590558, 497679, -332323, 1117228, 3221, 870268, -801548, 698469, 2117419, -271657, - 201327, -74625, -1491427, -811749, 483721, -136365, - }, - { - -31609348, -143212464, 7333120, 3861176, -8851928, -1521492, -1649804, -4000225, -5223754, 16268262, - 11922829, 7581691, -1682554, -2443837, 2114198, 1772211, -7835094, 18070002, 5854578, -10700374, - -2135136, 6514929, 3314104, -8019241, -472983, 6806987, -11605002, 2406256, 1097901, 7856569, - -2950106, 2490007, -1826435, 282394, -5197984, 6156836, -2052458, -4442607, -7689602, 3367791, - 10532334, -1427540, 2950106, -2163590, -2037962, -1422171, 8220568, -2431488, -1343251, 4035122, - 362925, 2885144, -1423245, -1188632, -1972464, 1091995, 3064459, -1487669, -3323231, 2370822, - 503585, 330712, -2603824, -1829656, -150861, -306016, -498753, 3305514, -980326, 1687922, - 1712081, -273804, 973347, 74088, -82678, 11811, -398895, -1495186, 1128503, 2907156, - 676994, -613107, 987843, -156766, 161598, -930397, -1242319, 20938, 652298, -193274, - 579284, 2154463, 870268, -822486, -360240, -705985, - }, - { - 2136209, 4173098, -6441914, 982474, -1569274, -384936, -1532230, 1034550, -3867618, -355409, - 1376000, 6965363, 12991202, 14155138, -7827578, -16985522, -12717935, -5956046, 62711892, -21528524, - -14130979, -10009421, 9439264, 2126546, -9514963, 4443144, 1741609, -12852153, -10612327, 8200167, - -29528, 7423314, 7722888, 1756642, 673773, -8762270, 12096775, -214748, -6928319, 2807835, - 131533, 463320, 1640141, -3423626, -11681774, 9979893, 4351876, -273804, 4973572, -696322, - -4194573, 378494, -1066763, 1080184, -8589935, -1758252, -1071594, 199716, 2283849, 5342940, - 1443109, -1853815, 744103, -4575751, -1447941, 2384244, 432181, 647466, -3376918, 629750, - 2623688, 2281165, 1053878, 434865, 109522, -2678986, 3620121, 390305, -91805, 1670742, - 3323768, 832150, 1356136, -2793876, -1130113, 916439, 2050847, 1123134, -352724, -700617, - -1524177, 531502, 251256, -389768, -1596654, -73014, - }, - { - -52590264, -215328192, 10482941, -38849052, -3071975, 1840394, -6744173, -3871376, 11414412, -4081830, - 14878304, -6305549, 6550362, -4711043, 8521752, 17582522, -1821603, 5932424, 8465917, -11428908, - 6547678, 11201812, 1341640, -3659312, 360240, 2967823, -2930778, 4157528, 2312303, 3843459, - -5742372, -9517111, -9685688, 2362232, -5222680, 1726040, 6058052, 7102802, 906775, -5308580, - -718870, 954557, -6058588, -7927973, -4247186, -696858, -679679, -3447785, -4995584, -827318, - -2739116, 2978560, 3629784, -1245004, -1441498, 830539, -1311576, 1117228, -4444218, 359704, - 1663226, -1312113, -723165, -55298, 644782, -805843, 1032940, 181999, -1091459, -106837, - 1864553, 506806, 1707250, -2334852, 392990, -1537061, -671089, 399969, -1381906, 8053, - -807991, 1134408, 134218, -476205, 381178, -755914, 1246077, 652298, 2122251, -580357, - 204548, -1535451, -304406, -79457, -388158, -1070521, - }, - { - 250182, 4085051, 3535295, -800475, -2113124, -752156, 229781, -894427, -1048509, 1062468, - 3574487, 1627256, 5146445, 4870493, 17460652, -7124277, -9704479, 12003897, 3183108, -9324911, - 13421773, 3897146, 11062762, -8928163, 10964515, 15832860, -15569, -5781563, 8263517, 4895726, - -8853001, -9119289, 14143327, 13939853, -4656819, -9592809, -4621922, -5580773, -11744051, 3775813, - -690953, -2600066, -3633542, -1828582, -3855807, -30602, 1702955, -6481106, 4163971, -479963, - 2370285, 4971425, -2643552, -1040993, 3726958, -139050, -548682, 2513630, -812823, -3154117, - -754841, 3430068, -3136400, -3025268, 424128, 1029182, -438087, 2648921, -782221, -685047, - 186294, 397821, 1172526, -776852, 508417, 418222, 698469, 1270774, 668404, 421444, - 489089, -2506650, 62814, 54761, -220117, 955093, 600222, -398358, 388158, -119185, - -1293322, -2283849, -1155883, 65498, -1278290, 302795, - }, - { - -38931196, 320280544, 13930190, -37283000, 13684303, -4806606, -13490492, -2501819, -1827509, 16269873, - -5143760, 1175210, 1006096, -18486612, 6975564, 13904957, -6804302, 20959440, -19942070, -10200010, - 4232154, -7469485, 6993818, -1545651, -543850, 736587, 2669322, 4899484, 4719632, 10489921, - 4758824, 5448703, -1606855, 2219424, 3685082, 12876849, 9434433, -5702643, -3252901, 5049271, - -2394981, 6721624, -1333051, 9724880, 906775, 10156524, 2160906, -2374043, -3821984, 421444, - 1488206, 7358890, 2228551, -8010651, -148176, -2142115, -493921, 7501161, -2845953, -401579, - 391379, 993748, 2065879, 135828, 3094524, -692027, 926102, -1494649, 710280, 1462436, - -1724429, -308164, 1746441, -2384781, 1847910, 790274, 335544, 1756105, 609885, -871878, - -764504, 921271, 159988, 82678, 254477, -1294933, -153545, 846109, -1268626, -448287, - -125091, 551903, 607201, -1228898, 222801, 241055, - }, - { - -109522, -9240622, 425739, 4273493, -3015604, 344134, -157303, -2309619, 4074850, 1893544, - -4717485, 7315403, -8042327, 4077535, 16545288, -25364466, -12058121, -5282810, -5315559, -5592585, - -5764920, -18629420, -21920976, 22311818, 14197551, 16943646, 4605816, 6772627, 2544768, 894427, - 11285563, -15819438, -9841381, 2994129, 2191507, 3313567, 1074279, -4835597, 11206107, -3549791, - -4010426, 3252364, -1901597, 163209, -4075387, -1391569, -3110093, 3672197, 3556233, 2100239, - -2838974, -4129074, -758599, 4233227, 5643587, -593779, 3582003, -2081449, 2744484, -5216238, - 3804267, -829466, -3776350, 13959, 2879239, 2620467, -741419, -1093606, -809064, 851477, - 895501, -562641, -1918240, 1885491, 905701, 2664490, -1996623, -35970, -1241246, -2152316, - 1349694, -827318, -1529545, 346819, 22549, -646929, -4295, 625455, -279173, -361314, - -547608, 1381369, -653372, 140660, 1356136, 240518, - }, - { - -31049930, -18639084, 23391466, -12547210, -365072, 33593088, -20351702, -22393422, -11901891, -11824045, - -2281165, -3001109, 5120675, 11646878, 659278, 12847321, 11255499, 15543487, 5237176, 13456669, - 4501126, 1220308, -7642895, -11207717, 3952981, 2357400, -467078, -13123273, -2221035, -2877091, - -13455596, -1566053, -2147484, -7815230, -1484448, 3215857, -2656974, 6090264, 4727686, -2208687, - 3089692, 5777805, -2454037, 2168959, -3704946, -1296006, -1813013, 5434744, 1020592, 1340567, - -2972654, -3036542, 2146947, 4810900, -2160906, 4325569, -4625143, -188979, 892279, -1395864, - 4694936, 4147865, 1537061, 32212, -330712, 2665564, -1611150, 628139, 338766, -889058, - 3155190, -2576981, -3758, -1350230, 2277407, 1546725, -1563905, 2052458, 533650, 847182, - -991064, 848256, 1400696, -248571, -961536, 297427, 292058, -933619, 638876, -1119913, - 1325534, -280247, 489089, 76773, 351114, -79994, - }, - { - -1669669, 50149648, -5162014, -2964064, -13649406, -632971, -8462159, 2399813, -7279433, -6405944, - -4765266, -5407901, -11809013, 10965588, -12478491, -18402324, 14316200, -16036334, 21553220, 23855858, - -1074279, -14155675, 14709726, -15105400, -246961, 2534568, -2848637, -5386963, 6623914, 7766912, - -7734163, -1294396, -2731062, 552440, 6926172, 9476845, -3783866, -6781217, -6006512, -4116726, - 4973572, 1813013, -5188321, 2183991, -9636833, -55835, 4039954, 1403917, 4907000, 3010772, - 800475, -4853850, -2086280, 4601521, 3047279, 1515587, 1973001, -3850975, 3439732, 2209761, - -1816234, -1110249, -924492, -1322313, -1648194, -363998, -3262565, -2010582, 843424, -1096827, - 3362423, 105227, 722091, 143345, 1119913, 588947, 1895154, 1331440, -255551, 1313186, - -1656247, 229244, 857920, -126702, 1183800, 212601, 856846, 1189706, 1001264, 571231, - 209380, -1176284, 78383, 1177895, -1258962, 887448, - }, - { - 31930398, -66307316, -12788265, 6236293, -1290638, 23147726, -6098854, -9720585, -7276212, 4899484, - 28950228, -2897492, 18523120, -13373454, -9185324, -7646653, -3126736, 14202383, -17326972, -15285789, - 1631014, 3006477, 4942434, -8513162, -8845485, -1171989, -12368969, 3433826, -1046898, -17940616, - -2528662, 10702522, 1998234, -5898064, 2787434, 12444131, -9546639, 11789685, -5964099, -4609037, - -523449, -3152506, -13849122, 8155069, -2996814, 3014530, 475668, -2572686, -3681861, 2254321, - -288837, 1493038, -5684389, 4821101, -2828236, 3787624, -889595, -592169, 1274532, -1940252, - -2015950, -2634426, 650151, -2801929, 2166811, -71404, -1478543, -85899, 2134599, 3337727, - 1037772, 875100, 294742, -104690, 119185, 186294, -369904, -1166621, -2056753, -693637, - 1688996, -684510, -1586990, 388158, -660351, -147103, -119185, -927713, 545998, -1348083, - 1095754, 877784, -654983, 1389422, -307627, 386547, - }, - { - 2965675, 33890512, -4742718, 3618510, -4580046, -718870, -2237141, -1093606, -857383, 911070, - -3712999, 3441343, -3194382, -8256001, -49162880, 5552319, -14766098, -3160559, -2610803, -8912594, - 9959492, 28527172, 11459510, 11398843, -13839995, -1094680, 8870718, -6327561, -16910360, -749472, - 8724152, 206695, 472446, -731218, -687732, -7931194, -14559402, 3610457, -1737851, -1096290, - 4364224, 4228396, 3236258, -11907797, -5997385, 216896, -3382824, -4209605, 4980552, 1160715, - 5388574, -4005594, -6319508, -3071439, -2270964, 530965, -520228, 17717, -544387, -3532611, - -3301756, 2550137, -507343, -1541356, 2447595, -2372433, -2189897, -3033321, 180389, 387084, - -448287, -942745, -1088237, -1447941, -515396, -637803, 3365644, -48855, 1604707, 636729, - 368293, -282394, 1426466, -2231236, 618475, 550293, -703301, 1743220, 180926, 496606, - 696858, 147103, -2363306, 271120, -2110977, 187905, - }, - { - -1917166, -88507464, 8805220, -12334072, -9641128, 11782169, -11601780, -5266167, -5451924, 1053878, - -9811316, -1577327, 10462540, -3745748, 3291556, -1500554, 133681, -16258599, 1693291, 14855755, - 8161512, 6079526, -5812165, 3696356, 4061965, 2631204, 972810, -12366821, -2925410, -3700114, - -2704756, -8653822, -5277441, -6497749, 8115878, 9060234, 1812476, -6162741, 8542153, -7287486, - 9472014, 9749576, 2340757, -4290136, -4370666, 734976, 644245, 3515431, -4254165, -7579007, - -330712, 4830765, -5421860, 1091459, -3671660, 4173635, -2558727, 2888903, 2536178, -2706903, - -911607, 2154463, -4464082, 1678795, -106300, -1491427, -2826089, -1362578, -3724811, 1537061, - 2707977, 1619740, -229244, -1532230, -4957466, -2197950, -1547262, 2924336, 737124, 267899, - 1614371, 1976759, -1122597, 430034, 613107, 723165, -3788698, 836445, 1430224, -759672, - 304943, 1016834, -142271, -1133871, 115964, 212064, - }, - { - -200253, -60617020, -1290638, 335007, -8877697, 700617, -3828427, 2190970, -11440182, 5806796, - -11120744, 11458973, 5280126, -10382010, 35960152, 12839805, -17391396, -18294950, -2216740, 12156368, - 5529234, -6488085, 3358128, -11425150, 4653597, -7078106, -5819144, -9510131, -6871411, -11828877, - -3651796, -8958228, 8049843, -6500433, -2440078, 3155190, -2998424, -3273839, -401579, 14587320, - -391916, -9868224, 6458557, 893353, -3213173, -2899103, -4560719, -5411659, 2474975, 9044664, - -2059974, -2091112, 1063004, 4533338, 653372, 4159676, -350040, -2665027, -3741990, -103079, - 3519189, 1973001, -6304475, -2857764, -529355, 2139431, -3566970, -1246614, -817654, 2842195, - 630286, -3936875, 737124, -4136591, 1475858, 2762201, -198105, -849330, 97174, 1891933, - 142271, -2185602, 1681480, -1371168, 787053, -631897, 545998, 236760, -651761, -4295, - 1595044, 1280974, 10201, -391916, -1094143, 130460, - }, - }, - { - { - -13242458, -207497920, 3590056, -21601002, -9122511, -5292474, -773631, -4591320, 5003100, -11305428, - -11086921, 7880191, -6223945, 6066642, -17283486, 7461432, 4180614, 466004, -1367410, 366146, - -8043937, 2196876, -2340220, 483721, 10695542, -4183298, 4056060, 6589017, -1929514, -1880122, - -571768, -4956393, -4409858, -5085778, -7696582, 10373957, -1426466, 3357054, -1116692, -3716757, - 6913824, -2279017, 4444218, -3080029, -941135, -2651606, 758599, -1556926, 3774203, -765041, - -4575214, -6520297, 417149, -9348533, 4711579, 1252520, -5549635, -494995, 5604933, 5340255, - -3424700, 4880694, -3209951, 1229434, -4294968, 4589710, 1337346, 687732, -865436, -1176821, - -785979, 1684164, -469762, 1553704, 70867, 979253, -1503239, -1251983, 1085016, 134755, - 640487, -425739, 244813, 1309965, -1067299, 358630, -469225, 590021, 2208150, 1247688, - -392990, 999654, -1854352, -279173, 1120987, -308701, - }, - { - 900869, 47197932, -1457605, -15532212, 482110, 2033667, 425739, 6658810, -53687, 4571456, - 2190970, 5576478, -2120640, -2993055, -7274601, -12045773, -9423695, 8939974, -12223477, -8912594, - 14841796, 8570607, -18358838, 10149008, 5302137, -1803349, 7364259, -7362648, -3758, 8623221, - -2281702, 4627291, -5391795, -1625645, 1377074, 2755759, -4306779, -1227287, -11828340, 1591285, - 1776506, 364535, -91805, -3373697, -3311957, 42950, 3738769, 1094680, 4591857, -1260036, - -3942780, 4532801, 4023311, 365072, 315143, 638340, -2056753, 916976, -1290101, -722091, - 1709934, 1781338, 1813550, 2105071, 4003983, -312996, -1058710, -2947958, -763430, 1815697, - 4543539, -328028, 1214402, -1005022, -1342714, 374736, 271120, 277025, 1848983, -968515, - -153545, -966368, 673236, -1075889, -75162, -683974, 1595044, -469225, 178241, -584652, - 357556, -573915, -454730, 1725503, -411780, 594853, - }, - { - -4362613, 7737921, 33356864, 13084081, 8577587, 2229088, -3024194, 13907104, -3250217, 12771085, - -12191802, 19109384, -24196236, -10499048, 236223, 7968238, -3663607, 7690139, -2374043, 2774012, - 1222455, 1986959, 8338142, 8004209, 10376641, -994822, 10572062, 4214437, -9847286, -3748970, - 1870458, 10920491, 6518150, 1103270, -12130598, 5516349, 94489, 813359, -8751533, 5004174, - 1289027, 716186, 473520, 1836099, 5896990, 7592966, 2308545, 5064840, -368830, 2927557, - -2194192, 1245004, -1443109, 571231, 3549791, 822486, -604517, -3856881, -2130304, -3178813, - -574452, -1765232, -860604, -2524367, -1234266, 210453, -3582003, -2079838, -1094143, 1830193, - 2226404, 1367410, -1570884, -2656437, -2346126, -664109, 1007170, -7516, -263604, 2496987, - -699006, 2010045, -522912, 199716, 488016, 1344862, -913754, 387621, 1662152, 317828, - -1216013, 170188, 16106, -1525787, -277025, 158377, - }, - { - 20981452, -224266544, 5721970, -3499325, 694711, 2457258, -532576, -1529008, -11282342, 21398064, - 2421825, 16393890, -8257612, 4202089, 5787469, 5966247, -10694469, 28957206, -12021613, -6306623, - 5267778, 6187438, -6208375, -5249524, 18254, 6155762, -5025649, -1634235, 1920924, -37581, - 122407, 6631430, -4689568, -4510790, -1253057, -1058173, 6837588, -7864085, -5894843, -3105261, - 8588861, 4780299, 3578782, -8223252, -620086, 5684926, 3365107, 2125472, -2809446, 6389838, - -2348810, 310848, 261456, -62277, -3620121, -272730, 2513630, 367220, -845035, 1253057, - 273267, -1377074, -1130650, -2101850, 758062, -1001264, -694711, 699006, 1391033, 2229625, - 681289, -863288, 477815, 2233920, -1158031, 423591, -962073, 214212, 1241246, 2809446, - -198105, -420907, 159451, 453656, -180389, -579284, -228170, -1964948, 625992, 706522, - 363998, 1478006, 180389, -73014, -715649, -1550483, - }, - { - -2320893, -2156074, 521302, -3463891, 2750390, -1713155, 1361505, -927176, -5338645, 2364380, - -4990752, 9163850, 10444824, 21918292, -28890634, -14254996, -5244155, 43761960, 14244259, -10610180, - -33496986, -108448, 5864241, -1882269, -3910568, -18842022, 10029286, 88047, -7346542, 9223442, - -4104378, 3288334, 7972533, -3512210, 5590437, -10336376, 9800578, 2582349, -9076340, 6487548, - -5892695, 4396436, 1834488, -7838316, -4821101, 7526930, 6923488, -3570192, -303332, 4311074, - -5591511, -874563, 1960653, -2071785, -5373004, -4556961, 2886755, -2199560, 3316252, 5637145, - -1144072, 71941, -1206886, -2663954, -1538672, 454193, -117575, 775778, 10737, -566936, - 457951, 3661997, 1516124, 709743, -1819456, -1166621, 2717104, -428423, 2047089, 1595044, - 2925947, -184147, 285078, -132070, -2321430, 744640, 2270964, 690416, 214748, -1669669, - 363462, -262530, 1053341, -1293322, -448824, -485868, - }, - { - 35219268, -342133344, 6471442, -23888072, -7276212, 252329, 3870839, -12655121, 2618856, 13871134, - 4903779, 8469139, -18522046, 4460861, 12859669, 7380902, 7881265, 2177012, 425739, -4904853, - 5791764, -1991254, 9446781, -3976066, -4424890, 8010651, 2670396, -9473087, 4192425, 2513093, - -7141457, -2320356, -6860674, -1974074, -1663226, -3417720, 6321118, 10252087, -2187212, -1745904, - 118112, -5055177, -3805878, -3038689, -5753109, -5582921, -1398549, -2900177, -3512747, -7292318, - 3995930, 997506, 2723546, -2886218, 1941862, -3332895, 2254321, -781684, -1282585, -2985539, - 2656974, 770410, 958315, -2324114, -715112, -506806, 1246077, -1030255, 1703491, -719944, - 58519, -75162, 1014686, 144955, -1950989, -272730, -2203855, 1458141, 372588, -736050, - -1482838, 598074, -577673, 795643, 1226750, -886374, 422517, 1649268, 1598802, 127775, - -1679869, 282931, -1615982, -591095, 322659, -965831, - }, - { - -1020592, 11063299, -1050656, -2797098, -655519, 311385, -341987, 1196685, -1569811, 9127, - 3709778, -313533, 4370666, -121870, 14919106, -8999567, 6606197, 4638565, -395137, -245887, - 20131586, -8830453, 23631446, -6664179, 5587216, 2767033, 19508816, -11144366, 7286949, 8883603, - -9939091, -7380902, 6573985, 22706418, -10787884, -5699422, -7314866, -5840619, -7893613, 998580, - -1348083, -5340255, -730681, -6441377, -101469, -2165201, 5089000, -8079371, 2110440, 1005022, - 2991982, 1663226, 2288144, -2324114, 1347009, -2788508, 3431142, 3242164, -5761699, -653372, - -35970, 2593624, 568546, -3779571, -1211181, 4025995, 331249, 965294, -731755, -1139777, - 370441, 1968706, -2212982, 2975339, 121333, -1293322, 1554778, -240518, 1059246, -68719, - 1491964, -712965, -634045, -857383, 915365, -120259, 144955, -142808, 961536, -1740536, - -1271310, -501974, -1247688, -682900, -537945, -515933, - }, - { - 65725348, 244537184, -30870614, -9565966, -9591199, -3473018, -16566763, 1446867, -5075041, 19393388, - -2748242, -15190762, 6304475, -1722282, -21406654, 25824564, -2290828, 4764730, -1484448, -8256538, - -9438191, -4175782, -1372779, 15452755, -1454920, 4199941, -76236, 5906, 2152316, 16110959, - 681826, 4858145, -3368328, 11161546, 1820529, 22609782, -3528316, -1114544, -2639794, -1872069, - 6941741, -3238942, 1208496, 1387811, 12978854, 1341640, 7617125, -4796405, -3434900, -1154809, - 2001455, 4004520, -3532074, -4145717, -2935073, 2458869, 810138, 4019553, -787053, -106300, - -1366873, 1760400, 850404, 3187940, -177167, -747324, 1287417, -672699, 943282, 706522, - -734439, 35970, 144955, 213138, 1253057, -278099, 900869, 658741, 1233193, 241055, - -1081258, 617938, -649614, 900869, -959388, -1668595, 471373, 400506, -436476, -767189, - -694174, 1908576, -1136556, -151398, 18254, 395674, - }, - { - -1214939, 6245420, -12308303, 2327872, -1230508, -139050, -699543, 1288490, 475131, 335544, - -4249870, 6754373, -205622, 8003135, 13360570, -31027918, -9121437, -13093745, -1457605, 4408247, - -22788022, -6797860, -15325517, 19893214, 13671418, -3600793, 21068962, -7208029, -3806415, 24169928, - -8294656, -4085051, -14148159, 5749351, 6681359, -6847789, 5328444, 542777, 5861020, 4644471, - -2778844, -1196685, 1908576, -6341519, 5162014, -2754148, -3566434, -58519, 5849746, 4046396, - -7144141, 1434519, -843961, 3045132, 2594160, 3891240, -1137630, -849867, -190052, -1394791, - 2095407, -390842, -4359392, -1973538, 5099200, 914291, 1395864, -935229, -1584843, 169651, - -11274, 651224, -3275986, 2456185, 1557999, 832687, -1060857, -708133, -663572, -690416, - -1095754, -221728, -209380, -903554, -1086627, -78920, 1631014, 700617, -1161252, -504122, - -264141, -293668, 441308, 854162, 160524, 539018, - }, - { - 33704220, -48572324, -9854802, -14758581, -3067681, 33494840, -12033425, -30499636, -7411503, -11634530, - 2108292, -7310035, 4600984, 7909719, 2882997, 301185, 18788334, 7982197, 26458072, 4712116, - 3595425, -355409, -6887517, -18191334, 2125472, 4445291, -10009421, 4154844, -13203266, -2854006, - -2130304, -6727530, -2823404, -6640557, -44023, -5451387, 5636071, 12763569, -1030792, 639950, - -86436, -1256815, -4918275, 5916855, -6539625, 2003602, 4427575, -1672890, 3557844, -2251100, - 1377074, -1029182, -510027, -2355790, 5237713, 1191317, -1265942, -1733556, -572304, -3301219, - 8993662, 3292629, 4180614, -787590, -4151086, 2808372, 556735, 2294050, 1042603, -3230352, - 4360466, -1207423, -1258425, -412854, 1669132, 3891777, -1345935, -1750736, 3009162, -1489817, - -541166, 801548, 2102923, 649614, 63888, -231928, -1187022, -1074816, 547608, -434865, - 1421097, -226560, 18790, 1079111, -641561, -373125, - }, - { - 831613, 67124968, -25729538, -6118718, -3697430, 2225867, -7204808, -3910031, -5814312, 1008244, - 4870493, -5915781, -8413304, -8335995, 5947993, -25702694, -455267, 3290482, 20353314, -2312303, - 12701292, -8071318, 6505802, -10504416, -1487132, 8474507, -7481296, -31675, -2444910, 5687611, - 1251983, -3847754, -4405563, 2385854, 2714956, 12071006, -6584185, -4320200, -3194382, -1014149, - 1082332, 3000035, -3933116, 28991, -8546985, 1180579, 3359201, 5993090, 3966402, 1272921, - 1539746, -7132330, 499290, 1518271, 4906464, 1295470, 954020, 94489, 439160, 123480, - 1125818, -3981972, 1688459, -1825361, -610959, -2462627, -2035278, -916439, 1253594, 907849, - 321586, 245887, 2106682, -946503, 1129040, -366146, 1387274, 1022202, -258772, 1387274, - -849867, 65498, 702764, -976031, 1764695, -540629, 1537061, 1503239, 1498407, 1052804, - -223875, -1251446, -369367, 28454, 384400, -221728, - }, - { - -44815300, 35121560, -7034620, -5817533, 27322972, -2649458, 8117488, -7605850, -19021874, 13753559, - 23621784, 9168681, 6905234, -1554241, -23758148, -1231045, -8205535, 11172821, -98247, -19603304, - -7226820, 10147934, 2525441, -3686693, -16153372, -149787, -7001334, -2226404, -1289027, -17227650, - -6526740, 8777303, 2184528, -162135, -1703491, 9632538, -8041253, 9154186, 154082, 46171, - -3731253, -6609418, -180389, 4255239, -6955700, 3633006, -2594160, -982474, 1755568, -1393717, - 1234803, 4549444, -3948149, -4482872, 6618545, -1161252, -2261300, 2765959, -1393717, 989453, - -4145180, -3032247, -1788854, 2921115, -845572, 249645, 1600949, -2945274, 1650341, 5492190, - -569083, -227633, 55298, 794569, 136902, -235149, -261456, -1088774, -1756642, -61203, - 2180770, 398358, -1389422, -29528, -294205, -39728, -141734, -1359357, -142271, -503585, - 590558, 816044, -241592, 331249, -388695, 294742, - }, - { - -3142306, 21552682, 6951942, 2147, -2430415, -680752, -1367410, 1796370, -1242856, -2343979, - -2376191, -2900714, -15671799, 15908559, -46628848, -13945222, -34882112, 4195646, 6118718, -5648419, - -5651103, 35231616, 17963164, -9941776, 13555991, -2495913, -1096290, 4170413, -11716134, -5254893, - 5113159, 1095754, 3434900, -1028108, -4850629, -2593087, -13580687, -7237020, 6362994, 2800856, - 3119757, 2737505, -3618510, -6058052, -5296769, -7447474, 3979287, -6321655, 4519916, -2041183, - 7260642, 528818, -5532992, -5330592, -3240016, 973347, 344671, -1574106, -1074816, -3008625, - -4057134, 6156836, -2448131, -1342177, 404264, -2105608, -1335735, -5449240, 3579318, -2302103, - -1623498, 1264331, -2508798, -820339, 2873870, -35433, 1175210, 245887, 994285, 1713692, - -740345, 540629, 321049, -275952, 1091995, -610959, 515933, 124554, 1564442, 1214939, - -892279, 1435056, -1266479, -2241436, -469762, -560493, - }, - { - -17501454, -72622528, -15569, -8776766, -145492, 4526359, -10065256, 4858145, -2284386, -12658342, - -1260573, 2401961, -7369090, 8641474, -7170985, -10547366, -760209, -4049081, -8036958, 20722680, - 4007205, 13272523, -1430761, 1739462, -3939022, 5154498, -8107825, 1041530, -3142306, -8312373, - -3856881, -7022272, -6445672, -5630702, 4749160, 6499360, 1636919, 3066070, 4547834, -705448, - 3490735, 14102525, -1265405, -1105954, -4763119, 1402844, 5550172, -2378875, -5354751, -4006668, - -4270808, -971200, 4400731, -4699768, -2560874, 3442953, -1916092, 5648956, -781684, -2097555, - -574452, 1439351, -603443, -274878, -19864, -1596654, -1420024, -840740, -4107063, 1697049, - 5663988, -1291711, 940598, -3721589, -4617627, -1387811, -894964, 1546725, 1276142, 1493575, - 2209224, 51540, -68719, 150861, 1054951, -1388885, 110595, -323196, 1067299, -219043, - 377957, -325344, 501974, 317291, -1176284, 855235, - }, - { - 1476395, -66013112, 6626598, -5247913, -6360310, 3528316, -1199370, -3107409, -5660230, -4112968, - 9485435, -4904853, 10261214, 20977158, -28804736, 11342472, -22920092, 5243082, -8235600, -1093606, - 31958314, 1331977, -10805601, -7295002, 249645, -3464965, -15490873, -7934952, 6828998, -9570261, - 2409477, -17223892, -169114, -4887136, -3647501, 16705812, -5828271, -11695196, 7002944, 11843372, - 87510, -4633733, 3015067, -425202, -294742, -3786014, -6508486, -5556077, 5873368, 4161287, - 2328946, 663036, 1635309, -2744484, 6085969, 3215320, 1131187, -4725001, 2787971, -3004330, - 1430761, 3445638, -5831492, -1729798, -2799245, -1022202, -1570347, 1139777, -339302, 363462, - 1391569, -660351, -3068754, -1515587, -169114, 773631, 1850057, -1195075, -696322, 869194, - -61203, 309238, -809601, -44023, 579284, -1480690, 498216, 1051730, 297963, -1170379, - 2567317, 511638, 977642, -748935, -994822, -1741609, - }, - }, - { - { - 4159676, -204280448, 4672388, -15679315, 2480344, 4366908, -2863670, -19111530, 3983582, -15636365, - -28038620, -835908, -1225139, 10691247, -6197638, 3918084, -3007551, -3441880, -9283035, 3155190, - 730681, 314069, -10719165, -4348118, 11413876, 6288906, 5566278, -3025268, 358630, 333397, - 6800544, 5371394, -2638721, 317291, 6547678, 14573361, -3090229, 4929012, -3070902, -5121749, - 2764348, -2551748, 7350837, -2336462, -1485522, -1206349, -705985, -4810364, -1247688, -2437394, - -3499325, 331249, 3160559, -4466229, 5511517, -3563212, -8091719, 1972464, 3226594, -1009854, - -5713380, 1597191, -1714229, 4200478, -3182034, 3999152, -1144609, -1952063, 1387811, 2720325, - 1219234, 2182380, -1359357, -128849, -1195075, 596464, -318901, -44560, 906775, -1348620, - -689879, -1816234, 345745, 147640, -2764348, 1400159, 1480153, -114890, -228170, -509491, - -1893544, 1600949, -1122597, -628139, 328565, -304406, - }, - { - -1053878, 44601088, -4260608, -12858595, -438087, 766115, 2212445, 3089155, -2828773, 11462194, - 777926, -511638, 8216273, -4215511, -19691352, -9861245, -4439386, -180926, -1370095, 3732327, - 1291175, 7664906, -18482854, 10198937, 19765976, 1722819, -8529805, -7978439, 149787, -463856, - -8561480, -88047, -12207908, -7400766, -1688459, 8252780, 1112397, 3451006, -6473053, 4864588, - 5870147, 6368900, 1860258, -6231998, -9167071, -7671349, 3887482, 3059091, 3262565, -1940788, - -1206349, 5342403, 762357, -985695, 1010391, 1489817, 841814, -2038499, -4063039, 2051921, - 840740, 468151, -67109, -255014, 1016834, -1690607, 2907156, 583042, 563178, 2395518, - 3922379, -2465311, 1854352, 188979, -104690, 456877, -1782948, -2546379, -304406, -784368, - 982474, -298500, 102542, -815507, 598074, -823560, 1308354, -374199, 223338, -938450, - -151398, -251792, -1604170, -229781, -1544041, 141197, - }, - { - 4194573, -50203336, -14827838, 17610976, 5249524, -6622303, -8243653, 4373351, -6741488, 12555263, - -20534238, 18509698, -8944806, 3202435, 1044751, -3488050, 2238215, 18584860, -1981591, 10881300, - -6554120, -7652558, 6286759, 6082748, 5369246, -5760088, -2419140, 45097, -6415071, -4420595, - 3684008, 11444477, 1477469, 10144176, -7696582, 5069672, -2408403, -382252, -2995203, 5188858, - -4326106, 1641751, 699543, -4105989, -2676838, 1525787, -782221, 2373506, 2299418, 225486, - -10579578, 1889249, -312996, -4162360, -851477, -1808718, -912144, -536334, -910533, 90731, - 323733, -1249299, 70330, -1759863, 1278290, 1767379, 2043331, 1365263, -2030983, -763967, - -235686, 1913945, -1023813, -1975148, -3101503, -3329137, 892279, 95026, -745177, 839129, - -1735167, 794032, -1090922, -10201, -486942, 589484, -336081, 683437, 948651, -1352378, - -1614371, 392453, 1469416, -774168, -825171, 360240, - }, - { - -142808, -285146624, -11870753, -4354023, -4968741, 244813, 6603512, 5128191, -13024488, 16627429, - -1181653, 18153754, 4234301, 8924405, 27917, 8595303, -9009231, 18148922, -13833016, 14397267, - 15028627, -1703491, -6968048, -304406, -1182727, 7086696, -4033511, -13038984, -7982197, -10524280, - -6206228, 3958349, -2515777, 3767223, 6161668, -1176821, 3591667, -7451769, -3403225, -8349417, - 4937602, 2336462, 2850248, -7121056, -2284923, 1161252, -3864934, 2061584, -2675228, 7546795, - 583579, -285615, 3473555, -597000, -6288906, -1681480, 828392, 33286, 1288490, 269509, - -39728, -2124935, 188979, 430570, -224412, -816044, -934155, -1163399, 1667521, 1232119, - 675384, 1986959, 2704219, 1758252, -2264522, 580894, 449898, 1329292, 1485522, 1984275, - -74625, -923955, -198642, 954557, 53150, -630823, -131533, -1677185, -588411, -813896, - -256087, 29528, -468151, 284542, 280247, -439697, - }, - { - 2345052, -6350646, -7417946, -7786239, -807991, 6442, 2819646, -1510218, -8237211, -2115808, - -8521215, -1126892, -7356205, 7380365, -31958852, 11725261, 19945292, 9608916, -37808060, -7554848, - -13863618, 10077604, 278099, 1752884, -3348464, -27060978, -1820529, 2692408, -3221, 6362457, - 33286, 3168075, -2521683, -5890548, 9399536, -5934034, 10450192, 2939905, -3092377, 7194607, - -4041027, 7358890, 5420249, -1771674, 5508833, 1571421, -6900402, -2360622, -1898912, -58519, - -5216238, 1294933, 3052111, -1739462, -1486596, -624918, 6884833, -3732327, -1727114, -1988570, - -6356015, 238371, -15032, -227096, -1116692, 1208496, -130460, -2093797, 153008, -941672, - -2306398, 2124935, 817118, -2303713, -1721745, 1171452, 1089848, -2676302, 1558536, 1224066, - 642098, -3636764, -592706, 586800, -1933272, 582505, 557272, -180926, 297427, -682900, - 1168231, -672699, 1253057, -56908, 283468, -887448, - }, - { - -2568927, -415679296, 178778, -2191507, 3945464, 2915746, 8815420, -14105209, -4867272, 8479876, - -650688, 5052492, -31191664, -6456410, -137976, -74625, 1355062, -7783018, -14550812, -11700028, - 8091719, -5369246, 8843338, -4138738, -2063732, 9642202, 3895535, -2693481, 5339181, -5415954, - -9662603, 2825552, -8624831, -2596308, 6370510, -1219771, -2788508, -1301375, -2190433, 4953171, - 4793721, -2158221, -581968, 121333, 592169, -3379603, -3136937, -3968550, -2469069, -8717173, - 1639604, -486942, 939524, -5297306, 4117263, -533113, 2699387, 1427003, -536871, -3132642, - 812286, 187905, -446140, -3084324, 2014340, -1269163, -1108638, 248034, 2987687, -998580, - -805306, -1729261, -15569, 432181, -3964255, -499827, -1699196, 3038153, 2910914, -515396, - -1384590, -824634, -1307281, 1515050, 785979, -689879, 380105, 1396401, 157840, -1009317, - -3030636, -295816, -1242856, -61203, 90194, -433792, - }, - { - 273267, 9292162, -9973451, -2614561, 2156611, 1380832, 498216, 2954401, -374199, -3545496, - -929324, -8359617, -7481833, 461709, 14978698, 2091649, 9401683, 9472014, 12508019, 9116605, - 8541616, -12194486, 10969346, -36964100, -1292248, -12681428, 17644262, 4243428, 7529078, 6453189, - -3863323, 1333051, -652298, 6034429, -14783814, -1703491, -7050726, -2520072, 1209570, 4609574, - -1370632, -2134599, -2055679, -8172249, 2996814, 234076, 6991670, -6698539, 1962263, 585189, - 4109210, 1427540, 3299072, -1972464, 135828, -3264175, 1029718, 1398549, -4640176, 4451734, - 3927211, 4095251, 2824478, -3104725, -2510409, 1515587, 543850, 1052267, -180389, -1380832, - -303869, 305480, -4028143, 2616172, -1324461, -1573569, 2476049, -594316, -628676, -2436857, - 1036161, 1818382, 899259, -266825, 748935, -1787243, 667331, -62814, -243739, -1497333, - -281320, 1056025, 478889, -325344, -340376, -1031866, - }, - { - -83508120, 128919888, 40486508, -7271380, -8318278, 7296613, -7252589, 9024800, -4449049, 9877888, - -3549254, -10101763, 7482907, 6578280, -34029024, 8856223, -7266548, -4118874, 9624485, 2921652, - -2278480, 6634651, -1216550, 9629317, -642098, 6499896, -6150393, 1983201, -2363306, -1665911, - -14564234, 2215130, -1264331, 8464307, -4037269, 17711372, 144955, 6361384, -4431333, -4487704, - 3469260, -8003135, -3776887, -7033009, 4644471, -5382668, 5011690, -3146064, -4574677, -7197292, - -362925, -617938, -8573292, 2091112, -1126355, 1433982, 1502702, 694711, -1300301, -34360, - -4398584, -1911797, -2307471, -208306, -2713346, -401043, 2116345, 1486059, 1535451, 124017, - 299574, -852014, -327491, 1702955, -431644, 116501, 1212791, -950262, 867047, -175557, - -1440962, -179852, -1863479, -267362, -418759, 811212, 806917, -1552631, -1308354, 86973, - -72478, 1481764, -839129, -554051, -691490, 413391, - }, - { - 25233, 14208826, -11945378, 353798, -498753, -178241, 1764158, -935766, -3259880, 1926830, - -5093295, 6801081, 130460, -21326660, -8309688, -3848828, 12550431, -8422968, -3842385, 15887084, - -11544335, 12163884, -3104725, 286689, -14032732, -24796994, 15184320, -8447127, -5165772, 17160542, - -12605192, 2545842, -8015483, 6597070, 4103305, -7489349, 8018704, 4872104, 4265440, 7865696, - 1675574, 141197, 6417218, -7721815, 5714454, 1725503, 452582, 145492, -348966, 4981089, - 1270774, 3255048, 1374926, 3487514, -2818572, 924492, -1408749, -1559610, -1887101, -248571, - 3016678, 1982127, -2333241, -1212791, 5209259, 779000, 2115808, 390842, -1206349, -1156420, - -1997697, 1138703, -2584497, -719407, -220117, 139050, -1395328, -733366, 892816, 2581275, - 1170916, 1966021, -504122, -807454, -1686848, -683974, 1977296, 467078, -1027571, -292595, - 112743, -354872, 591632, 50466, -540092, 783295, - }, - { - -34957812, -56202332, 53233436, -8817568, 3682935, 12478491, -16765942, -21170430, 2323577, -10609643, - 2443837, 2173254, 6077379, -4502200, -13859859, -10776610, 6986838, -5224291, 27814208, 10773389, - 7670275, -2823404, -6134287, -18114562, -1406602, 5290863, -3654480, 4709969, -13117904, -153008, - 4398047, -8643622, -1430761, 998580, -1348083, -5803575, 11655467, 10538239, -5928666, -818191, - -7512435, -4732517, -5766531, 564251, -7751342, 5015448, 5890548, -2140504, 4684199, -4410932, - 1474248, 1249836, -3397856, -5478768, 4739497, -433792, -55835, 65498, 1367947, -1404454, - 8270497, -948114, 1212791, -395674, -5451387, -1629403, -744103, 1486596, 855772, -2910914, - 3281355, 2352032, 435939, -1726040, -1069984, 815507, -63351, -1744294, 1135482, -1260036, - 166430, 455267, 1118302, 2805688, 2651069, 607738, -1820529, -3152506, -1919314, 586263, - 1995012, -1213865, -698469, 1243393, -335007, -915365, - }, - { - 294742, 69712688, -15089294, 7228967, 598611, 7469485, 5660230, -1086627, -3172370, 8687645, - 15515032, 12686260, 2404645, -17260400, 7589207, -19594714, -292595, -2316061, -2225330, -22798760, - 10365904, -4530117, 926639, -10532870, -4384625, 1704565, -9261023, -4528506, -7786776, 3918621, - 3286187, -6249178, -4714801, -1698123, -9024263, 991064, -6558415, 838592, 5875516, 12484396, - 11698954, 2034204, -8622147, -979789, -3828963, 5393942, 5147519, 9921911, 2309082, -1030255, - 5906, -3573413, 4182761, -471910, 742493, -5174362, -2047626, 1888175, 178241, -223875, - -1163399, -2435247, 6280316, 2399276, 3620121, -2554969, -3934190, 1809792, 2930778, -450435, - -1909113, -1487132, 239981, -2042257, -104153, -1963874, -859530, 884763, -564788, 1057636, - 1430761, -317828, -809064, -1165010, 193274, -1913945, 62277, 597537, 306553, 557272, - 45634, -802622, -383326, -1075889, 664646, -621697, - }, - { - 35743792, 152235648, 10940355, 5041755, 31583578, 518080, 17546016, 6628745, -6171868, 13311714, - 16922708, 9911174, 1128503, -6587406, -24393266, 8146479, -4392141, 7298223, -5210869, -14796162, - 985695, 11917997, 912681, 8414915, -11283416, -13311177, -13848048, 433792, 4434017, -9778567, - -5228049, 3287798, 3490198, 5277978, -5904507, 6090264, -4875325, 7590281, 959388, 3881577, - -1202054, -2112050, 3810710, 1182190, -8111583, 4179540, -5716065, -2218351, 6609955, -4303557, - -190589, 4835597, -3709778, -6025302, 2654827, -7569880, -2929705, 3042448, -2060511, 491774, - -1245541, 1516660, -49392, 2171643, -3578245, 797253, 3187403, -1371705, -2010582, 970663, - -316217, -1452236, -687732, 2284386, 1797981, 1933809, 1529545, 692027, 1160178, 516470, - 68719, 562104, 1380295, 437013, -409096, 367220, 748935, 390842, 848256, -558346, - 58519, 186294, -1052267, -435939, -1040456, -24696, - }, - { - 2856153, -5564667, -19971598, -3857954, -7587597, -4822175, -654446, 6896107, 2317135, -3707631, - -5534066, -8472360, -10800769, 12058121, -57964880, -8793409, -28494424, 768262, 10697153, -4406100, - -19770808, -2196339, -6994354, -12526809, 8657580, 2742874, 16209743, 14516989, -212064, -12141873, - -15833397, 904628, 7972533, -3712999, -3263638, 8624831, -6312528, -10776073, 2206540, -1129576, - -857383, 208306, -3361886, -1986959, 527744, -7104413, 3141769, -3158949, 9330280, -2066416, - 1398549, 763967, 343061, -1720671, -190052, 4694936, 4917201, 2311229, 1951526, 2627446, - -1330366, 4757750, -4308926, -2272038, -859530, -973347, 263604, -4045322, 2813204, -2933463, - -433255, 3117073, -1976759, 1409286, 4166118, -933082, -1041530, -759136, -1683090, -1044214, - -418222, 2543158, 1567663, -4295, 1337346, -620623, -141734, -350577, 2997887, 1390496, - -1844689, 957778, -280247, -1490891, 391379, 90194, - }, - { - 31779000, -20089172, -17475686, -19908784, 3492345, 5433671, -4152160, 12577275, 7116224, -7215545, - -4381404, -6709813, -13089987, -7445326, -23091354, 7933879, 16148003, -10478110, -21122650, 9960566, - -1326608, 5492727, -1093069, 2407866, -5827734, -2792266, -13588740, 12539157, -1429150, -8840653, - 178778, -7042136, -2794950, -5404143, -5339718, -1665911, 9510668, 13353053, -177167, -3904662, - -1912334, 8206609, 1296006, 6085432, 2011655, 5045513, -705448, -9663676, -6539625, -4215511, - -4634807, -382789, 5029944, -4599373, -1307818, 3911105, -2278480, -39192, -4832375, 1309965, - 2745558, 2093797, 1075889, 1234266, 2928631, 2978560, 3993246, 3384434, 1404454, 622233, - 2223183, -2353642, 1839857, 98784, -1998234, 601832, -72478, -1627793, 330176, 2457258, - 1999307, 17717, 417149, 457414, 765041, -813896, 1121523, -785979, 1924682, 388695, - -1331440, -1682554, 237834, 257161, -335544, 697932, - }, - { - -2272575, -65906812, 16539919, 2197413, 2085207, 9387725, 8210904, -581968, -6828998, -2018635, - 13695577, -8292508, 4766340, -6110665, -86388976, -18185966, 4191888, 36209796, 3357054, -11021423, - 41260140, 28205050, 6873022, 6546067, -4264366, -2872260, -8985608, -7301445, 13414257, 1249836, - 1484985, -13299366, -4207994, -5056787, -1525787, 12252468, -4209605, -8092256, 11424613, 3757023, - -3917547, -3657165, -3826816, -3209951, -4309463, -344134, 1085016, 210453, 2434173, 166967, - 5863167, 4019553, 2141041, -5136781, 5717139, 3247532, 1945083, -1713692, 6942815, -1509681, - -2256469, 3771518, 693100, 4096325, -1570884, -2217277, 137439, 2480881, -792421, -920734, - 339839, 1694365, 344671, 298500, -1297080, -384936, 2441689, -1859721, -1573032, -1660005, - -2127620, 971200, -1348083, -498216, 498216, -330712, 207232, 1549410, 1278827, -1786170, - 1402307, -317828, 917512, 402116, 284542, -984084, - }, - }, - { - { - 255551, -253332736, 31951336, -18279380, 7977902, -760746, 5468030, -18949396, -1925219, -24830280, - -6965363, -15489263, -319438, 2225867, 11463805, -2207076, -7515119, -3291019, -9934259, 2529736, - 3790309, 1900523, -9399536, 4299799, 1935420, 7301982, 437550, -3431679, 4795331, -2927020, - 5717139, 2865280, -228170, -1580548, 15843597, 4649839, 3779034, 424665, -1949378, 1635846, - -4653597, 1083942, 3848291, 3642669, -9058086, 5621039, -5342403, -4980552, -3143916, -3212099, - -1282585, 3623342, -2300492, 3244311, 1346472, -3256122, -3740380, -1440425, 150861, -2025077, - -1715839, -588411, -363998, 852014, 1721745, 5906, 557809, -3394635, 2330020, 3626563, - -942745, 1293859, 1202054, -1751810, -1117765, -392990, 707059, 578747, -137976, -435939, - -2456185, -1766842, 1841467, -350040, -1938641, 638340, 1319092, 917512, -1436130, -425202, - 86436, -645319, -630286, 469225, -834297, 299037, - }, - { - 732292, 14085345, 9034464, 9953587, -12839268, 945967, 520228, 454193, 3465502, 7355132, - -1398549, -1464047, 5980205, -7125888, -12657805, 5527086, -3680787, -14316737, 763967, 12763032, - -4708895, -1346472, -1482301, 14087493, -4557497, 8922258, -11200201, 5682779, -5806259, -1095217, - -16239271, 1664300, -9787157, -4084514, 34897, 551903, 4552666, 7553774, -190052, -1839857, - 4716948, 7168838, 2024003, -2659659, -9171903, -11171747, 5400922, 6735046, -566399, -4075387, - 2488934, -1886564, 2354179, 128849, 5055714, -989990, 3591667, -4504884, -2197950, -873489, - -1058173, 3213173, -1482301, -25233, -65498, -477815, 458488, 2244121, 2496450, 2852932, - 1726577, 1312113, -712965, -1256815, 865973, 38655, -2147484, -1931662, -809601, -932008, - 54761, 1096290, -1591822, 1192927, -243203, -44023, 26307, 529892, -589484, -200790, - -597000, -1057099, -804770, -731755, -242129, -348966, - }, - { - -3968550, -72685880, 5727876, 18524194, -1443109, -5513665, -3346317, -10009421, 8302172, -1639604, - -16464757, 23248658, -8789114, -6228777, 9729712, -1923609, 777926, 26014080, 3693135, -1547262, - 5161477, -11498701, 6601902, 1820529, -3591130, 7948374, -15557445, 3827353, -4006668, -3883187, - 6184753, 12496207, -8366597, 10518375, -2783676, 1143535, -1189169, -2951716, 1955284, 4113505, - 743029, -4957466, -3555696, -91268, -2183991, -565862, -2146410, 4147328, 1855963, -4575751, - -5385889, 983011, -1047435, -273804, -3282429, 271120, -5017596, 2056216, -2641405, 1799054, - 1968706, -1214402, 719407, -3186866, 821949, 2109366, 3695283, 1246077, -2492692, 55835, - 397284, -1667521, 462783, -1096827, -1190243, -3104188, 873489, -2430415, 1367410, -54761, - 712965, -2863670, 149250, 169114, -194884, -1405528, 237297, 1957968, -4295, -902480, - -1449015, 78920, 886374, 44560, -672699, -1611, - }, - { - -24011014, -297949920, 14456323, -1330366, 601832, 1937030, 4675609, -2405182, -7532299, 10035728, - 16310675, -1171989, 8807367, 11227581, -6130529, 3849365, -5027259, 10659035, -1931125, 17275432, - 7092065, -253403, 1879585, -5900748, 2707977, 12366285, -12702903, -9134859, -14411763, -9237938, - -4587562, -2045478, 6210523, -877784, 5570036, 4857071, -6160057, -1530082, -6479495, -7374459, - 11003169, 887985, 3060164, -27380, -10554882, -3118146, 116501, -2241436, 4706211, 1752347, - 2874407, 1786170, -1628330, -951872, -1631014, -2215130, 1159641, -3062849, 5666136, -1848983, - -387621, 1105417, -1269700, -673236, 376883, -167504, -553514, 1549410, -663572, 199179, - 2051384, 1997697, 3325915, -1333587, 659278, -664646, 1840930, 699006, 1294933, 675384, - 769336, -2414309, 465467, 1025960, 59056, -57445, -842350, 83215, -1698660, -1137630, - -71404, 426812, -230318, -315680, 106837, -33823, - }, - { - -1942936, -11636140, 141197, -5860483, -1708860, 1808181, -1228898, -19864, -5451387, -3310346, - -7794829, 587337, -5952825, 4614406, -21454436, 13727252, 3736085, -34569120, 1838246, -13916231, - -3066070, 25710212, -27212376, 4749160, 5669894, -22595286, -8713952, 2386391, 5039071, 9265855, - -4161287, 16474421, -6441914, -15182709, 8622147, 6987375, -2007897, 4444218, 4437238, 1561758, - 4039417, -685584, 6163815, 4562329, 6179921, -2631204, -8922258, -136902, -314069, -4032438, - 1135482, -144418, 381715, -1200443, 1053341, -896038, 4113505, 938987, -3214783, -5717675, - -2695629, -2297808, -219580, 609349, -858457, 836445, -563178, -709207, 226023, -1331440, - 947577, -1847910, 863825, -1241246, -817118, -828929, 819265, -1430761, 249108, 1454383, - 576063, -3231963, -482110, -816581, -1856500, 505732, 441845, 296353, -705985, 603980, - 361314, 740345, -62277, 560493, -8590, -818728, - }, - { - -33925408, -403652288, 14730127, 14885820, 2021856, 2798708, -8160438, 16813724, -10386305, -5212480, - 1198833, -653909, -16575353, -5371394, -9218074, 11537356, -6678138, -16066936, -17269526, -10104984, - 8326868, 3994320, 4672925, -5676336, 2381559, 7007239, 3947075, 7573101, 1187022, -5491116, - -1631014, -1514513, -16330003, 814433, 3826816, -1735167, -4954782, -3854196, 1321239, 301721, - 9236864, 387084, -2634426, 3350075, 3238405, -1851131, -7819525, 1399086, -3513283, -7296076, - 2098629, -2034204, 137976, -1699733, 2315524, 3004867, -2993592, 3694746, -2371359, -39192, - -2273112, 800475, -1177358, -2711198, 4031364, -530965, -1828046, 1874753, -559956, 759672, - -1551020, -1258425, -330712, 10737, -2377265, -957241, -1510218, 2552821, 3142842, -1330903, - 19864, -1089848, -233002, 306553, -676457, 806917, 789737, 126702, -5369, -512175, - -2264522, -1167694, -366683, 375810, -1057636, -210453, - }, - { - 403727, -7232725, 2440078, 3295851, -849867, 22012, 1530082, 1177358, 3091840, 370441, - -7463043, -2830384, -12872017, 15784005, -5145908, 41683196, -13467944, -2005750, 6011881, 20799452, - -6711960, -6444599, 24607478, -36175972, -10950556, -11318313, -1361505, 23193360, -6624450, -15146739, - 9676024, 9443559, 1728724, -4493073, -11585674, -1225139, -4798016, -1393717, 1019518, 1531156, - 1846836, -230854, -2262911, -6798933, -1486059, 3629784, 5674189, -2719788, -1591285, 945430, - 3226594, 1664300, 2092186, 2295660, -3342022, 185220, -525597, -1959579, -1212255, 5396627, - 5094368, 2543158, -39192, -3228742, 138513, -1040993, 1658931, -2386391, 2952790, 1590212, - -122407, -3361886, -2013803, -510564, -1174137, 454730, 1093606, -251792, -796180, -2758443, - 1748052, 649077, 430570, 1064615, 341987, -2676838, 1183800, -243739, -485868, -403190, - 430034, 468688, -31139, -202400, 452582, -1121523, - }, - { - 87199112, -9591736, -33244658, -24223078, 3947612, 4665945, 7199976, -3171833, 2867428, -1501628, - -6772627, 7827578, -6520834, 11599633, -30072288, 3178276, 6187974, -2563559, -741956, 704375, - 2675228, 2516314, 6153078, 7695508, 5834713, -4203699, -2305324, 6485401, -1286880, -8636642, - -14166413, -90194, 2987150, 751619, 2026151, 7817378, 134218, 11039140, -7778723, 4603131, - -4951561, -4773856, -7427609, -697395, -1949915, -3223910, -141734, 7389491, -10038412, -4515085, - 627602, -919123, -4392141, -1423782, -173409, 2167885, 1721745, -2605972, 380105, -127775, - -1907502, -5216775, -3019899, -672699, -3286187, -1129576, 1988033, 3911105, 770947, -400506, - 2651069, -1991254, -2755222, 2435783, -1190780, 1236414, 485331, -1479616, 905701, 252866, - -1414655, -471910, -1662152, -1263794, -40265, 1474248, 27380, -266288, -647466, -869731, - 302258, -140123, 213675, 43487, -535797, 66035, - }, - { - 1183264, -2422899, 4301947, -6109591, 4612795, 348966, 2400887, -921807, -2557653, -911607, - -427886, 1615982, 5315022, 12734041, -45384920, 10688563, -11400991, 5316096, -18301392, 6847789, - 17497696, 180926, 10259066, -33027224, -2698313, -11970611, -13539348, 8705899, -3449933, 6516539, - 709743, -9158481, 2611877, -1774358, 1290638, 3493419, 3820374, 2625299, 6595459, 9840844, - -5847598, 4529043, 5387500, -4718022, 507343, 1580011, 2595234, 169651, -588947, 780073, - 7587060, 52076, 1646046, 2717104, -1662152, -363998, 169114, -3468186, 1580011, 1675037, - 991601, -137439, -3097208, 576599, 4446902, -253403, 3655017, 89121, -255551, -2363306, - -446140, -1471563, -1032403, -464930, 22549, 61203, -910533, 216359, 845035, 1189706, - 1855426, 3884261, -2740726, -367757, -860604, -126165, 96100, 360777, 877247, -1130113, - -180926, 638876, 141197, 444529, -1057099, -280784, - }, - { - 34180960, -23936390, -67143224, 2261300, 16079821, -20580410, -819265, -21876952, 1319092, 646929, - 7576859, -2688650, -3724274, 115427, -11378442, -9981504, -3033321, 5686537, 22112640, 8456791, - 8100309, -2732673, -916976, -9245991, -8470212, 3034395, 12579959, -5619428, -10359461, -5669357, - 7709467, -13278428, 7032472, -2126009, -9042517, 1587527, 8019241, 8975408, -583042, -5689221, - -10901701, -440771, 185757, -2221035, -4872641, 446677, 5573794, -243203, 2021856, -5871221, - -971200, 5427765, -1329829, -4799089, 3373160, -2399276, -2069101, 2368675, 1234803, 1694365, - 5486284, -413927, -1799054, -2280628, -49392, -5660767, -2091112, 4156992, -1702418, -894427, - 842350, 3605088, -312996, -1490354, -197569, -755914, -184684, 548145, -2274722, 584652, - -146029, 2823941, -970126, 3546032, 1779190, 556198, -2139431, -1270237, -1991254, 792421, - 430034, -88047, -1015223, 243203, 386010, -1442035, - }, - { - -1453846, 50971600, 6870337, 8400956, -1006633, -2891587, 11889543, -1322313, 6065568, 1557999, - 4557497, 15377057, 5500780, -17725330, 1326071, -6257231, -132070, 4894652, -37461240, 9659918, - -5656472, -10166724, 4852240, -2076617, -5858336, -4341675, -5164162, -7882339, 573378, -7555385, - 7305740, -13325136, 271120, 4825933, -9715753, -4336843, -3806952, -2840047, 6940131, 12808666, - 8462159, -2026688, -1994476, -1724966, 2042794, 8705362, -1865090, 9715753, -1413581, 2894808, - -6191732, -341450, 4827543, 1188632, -3410204, -6762426, -842350, 1364189, -585726, 5589363, - -5404680, -295279, 5547487, 4548907, 622770, 392990, -5225902, 1845762, 1306744, 788663, - -3160559, 320512, -1848447, -564251, -1580011, 343597, -1387811, -89121, 879395, -1465121, - 2204392, 984621, -3131031, 828929, -1387274, 238371, -962073, -324807, -533113, 969589, - -536334, 186294, 875100, -2015950, -588947, -106300, - }, - { - -6385543, 223364608, 16920560, 4106526, -6701223, 21663278, 21103858, 3599720, -1229971, 11440719, - 9619116, 11285027, 6550899, -897648, -25004226, -1683090, 4487167, 2741263, -10003516, 2000918, - -10369662, 9871445, -5766531, 10866267, -12479027, -6933151, -10382010, -1683090, 2072859, -111669, - -8526047, 4277788, 5806259, -447750, -2769717, 3486440, 1698123, 3564823, -4977330, 1762547, - -2615635, 1484448, 8732742, -5553393, -6398965, 5396090, -8930848, -600222, 10649371, -3699041, - -1378148, 2117956, -3846680, -2573759, -3349538, -6966437, -2144263, 307627, 122407, -4223564, - 2336999, 3613141, 504122, -1394791, -1504312, 359167, 183073, 2302639, -1704565, -1323387, - -343597, -2029909, 1728188, 1774358, 1625108, 810675, 2331094, 833224, 2453500, 325344, - -506269, -812823, 2648384, 639413, -23085, 767189, -209380, 1288490, -301721, -127238, - 501974, -1371168, 41876, -573915, -791348, -124554, - }, - { - -2505040, -31853624, 4572530, -5710159, -185220, -8258685, -488553, 8747775, 1792612, -7384660, - -4875325, -5426155, -6828998, -9303973, -54526220, -5751498, -1402307, -4414690, 18172544, -16198469, - 9627169, -32904282, -13173202, 10599442, -12875775, 4108136, 22661322, 16667157, -11780022, -6588480, - -9914932, -4290136, 12691091, -15430207, 5291400, 1431298, -2618856, -8183524, -4697084, 1851131, - -1294933, 3702262, -3330747, 171799, -630286, -2212445, -853625, 548145, 1637456, 2642479, - -747324, -1880659, 4420058, -674310, -1320166, 5129265, 5393942, 3066607, 2471217, 4975720, - -2413772, -35970, 3425773, -2759517, -3740917, 1569811, -599685, -1277216, 518617, -411780, - -3473018, 2368138, 428423, -9664, 1069447, 1459215, -1465121, -975494, -1172526, -1933809, - 14496, 1698660, 2252174, -1063004, 409633, 421444, -74625, 732292, 1265942, 892816, - -832687, 39192, -172872, -755377, 814970, -570157, - }, - { - -32857574, 51849384, 9971303, -29685740, 14685567, -16546898, 8372502, 2255395, 3115999, 5837935, - 9724880, -21233782, -12805982, -26264262, -14595373, 17220672, 19696720, -7701950, -17534204, -2129230, - 250182, 496606, 4958540, -3486977, -630823, -7019587, -7158637, 1414655, -701153, 7835631, - -1879048, -10085657, -2603287, -7237557, -3788161, 4442607, 479426, 8541079, -8987756, -2956548, - 11711302, -1358283, 1902671, 7253663, 6654515, -3579318, 595927, -6810208, -7431367, -3956739, - -1306207, -1679332, 121333, 62814, 1656784, 578747, 659814, -2755759, -2463701, -1065152, - 4165582, 1488206, 1955821, -409096, 2747169, 3578245, 4594542, 3091840, 4814122, 597537, - -2590939, 1852742, -1845225, 558346, 115427, -453119, 297427, -1759863, 306016, 1976222, - 763430, 765578, 1615982, 976568, -373662, 906238, -105764, -916976, 758062, -30065, - -554588, -994285, 79457, -117038, -35433, -588411, - }, - { - 2828773, -60342680, 8106751, 1165010, 10065793, 1924682, 6001143, -1709934, -6163815, 6942815, - 3252364, -2673617, 6887517, -51484848, -41808824, -29317446, 36089536, 16250546, 19699404, 5735392, - 2419140, 29333552, 11184632, 12569222, -8125542, 2330557, -13766444, -8669928, 13731010, -8257612, - -1380832, 736050, -1722819, -2888366, 2411087, 1495186, 817118, 4151086, -3260417, 4172024, - -3999688, -5509906, 620086, 2360085, -11685532, -785979, 2512556, 4823249, -3077881, -1032403, - 2679523, 3644280, 8053, 2967823, 4938139, 2503966, -1256278, -1736777, 3786551, -152471, - -2339147, 5394479, 2942590, 1230508, -257161, -2018098, 2796561, 1593433, -3200825, -1819992, - 1276679, 1089848, 1331977, 386010, -2266132, 622233, 2192581, -1406065, -1626182, -1541893, - -344134, -1565516, -769873, -110059, 96100, 379568, -12885, 1196685, 363462, -466541, - -370441, 526670, -286689, 714575, 162135, 1055488, - }, - }, - { - { - 792958, -284313952, -28560996, -21189758, 2056216, -11126650, 4334696, -11194832, -4807679, -16561931, - 1730335, -26154204, -8393440, 5810017, 15590194, -12287901, -7234336, 1774895, -9058086, -8847096, - 733366, 7218767, -8415452, 5952825, 1577327, 7538742, 1230508, 4493073, 1843615, -16193100, - -7904888, 1532230, 10358924, 1117765, 9562208, -2103460, -1114544, 4544613, 6174016, 2665564, - -5027796, -2471217, -5897527, 1437740, -10503879, 2711735, -2325725, -4488778, -4240744, -7028714, - -4842039, 2310156, -3690988, 2384781, -285615, -3837017, -2426657, 454730, -1167694, -1544041, - 4719632, 1512365, -2479807, -2975339, -1178432, 340376, 2602213, -2933463, 199716, 703301, - -2201708, -774705, 419296, -1434519, -1027034, -933082, 677531, 611496, 608275, 1527398, - -52613, 292595, 2019172, -805306, -1423245, 590021, 687195, 760209, -594316, 726386, - 494995, -89657, 39192, 784905, -351114, 1180579, - }, - { - 232465, -12226698, -14989436, 16798690, -1582696, -1255741, -1874216, -1540283, -5210869, -6477348, - -11713986, -3779034, 13887240, -515933, -4524211, 14596446, -711891, -4822712, -9508521, 1821066, - -118112, -5910412, 2792266, 7754564, -28309204, 11344082, 1745904, 18329846, 3102040, 4005057, - -9719511, 6560026, -826781, -423054, 4909148, -929860, 7789997, 7248831, -1751810, -1879585, - 146566, 5478768, 2580739, 377957, 1685775, -2959769, 3551401, 34360, -4199405, -5761162, - -33286, -3182034, 2691871, -500901, 3129421, -6693707, -474594, -1582696, 4770635, 1948305, - -1670742, 665720, -1984275, 1613834, -1145146, -761820, 879931, 2268280, 1018444, -165356, - 1079647, 2215666, -4031901, -3830037, 969052, 888521, -265751, 398358, -62277, -55298, - 239981, 288300, -1155883, 2077154, 338766, 513249, -10201, -20938, -512175, 825707, - -580357, -1200443, 177167, 216359, -193810, -471373, - }, - { - 3318399, -62000536, -1871532, -4825933, -14368276, -2672544, -2571612, -12885976, 6971269, 6245956, - -7932268, 9031242, -17302276, -2172180, 21641266, 8713952, 6715718, 20880520, -5318244, 2746632, - 13945222, -1404454, 7365332, -10248866, 3549791, 20732344, -15293305, -2652679, -3973919, 2789045, - -4247723, -2318209, -9446781, 619549, -6516003, 1689533, 1543504, -1053878, 184684, 1441498, - 648003, -2617246, 827855, 2382096, -2692945, -927176, 1735167, 4709432, -2631204, -2781528, - -46708, 575526, -2390149, 1495186, -1878511, 1222992, -981937, 5280126, -1374926, 1052804, - 745177, 259846, 2734284, -1859184, -537, 1932735, 2982855, 514859, -989453, 857920, - -927713, -1749662, 2457795, 740345, 2415919, -862752, -1192390, -2986613, 3197603, 1250909, - 1993402, -2717104, -552977, -347355, 827318, -679679, -316754, 873489, 479426, 732829, - -1381906, -285078, -326418, -471910, -406948, 176094, - }, - { - 43122544, -260294352, -16658568, 22654342, 10446971, -1852742, -4373888, -7585449, -379031, 4228932, - 1635309, -9078487, 3157875, 2069101, -23130546, -9551470, -13471702, -5260798, -9748502, 9482214, - 725313, 9391483, 11624329, -6220724, 5187247, 10611254, -9436043, 4160213, -3675955, 5047661, - 4490925, -3795141, 4589710, -3322157, 4462471, 4464082, -6631430, 2029909, -1316408, -1005559, - 8518531, 251256, 4596152, 4430259, -7002944, -1129576, -2379412, -8704288, 2080375, -1145683, - 5706938, 5598490, -3208341, -972273, 2300492, 3622268, 5885716, -3580392, 3374771, -1496796, - 3555696, 4796942, -2963528, -1847910, -12348, 1763621, 2268280, 2856153, 299574, 792958, - 1531693, 306553, 678068, -1707786, 1649268, -699543, 1780264, 149250, 373662, -658741, - -133681, -2244657, -93952, -244813, -619549, 108448, -1625108, -107911, -693100, 99858, - 598074, 857920, 301185, 45097, 1264868, 666257, - }, - { - 1201517, -20895552, -9480603, 413391, 3850438, 845035, -1572495, 6214818, 1694365, 1647657, - -5300527, 187905, -12548284, -8405251, -26530550, -2383170, -12070469, -7741142, 42171212, -6841883, - -4582730, 19470698, -24819006, 4162897, 955093, -6267968, 5491653, -117038, -2261837, 7773891, - 4509716, 14681272, 2368138, -5362804, 578747, 3579318, -1688459, 8250632, 8011725, 2874944, - 5786395, -6144488, 2980707, 7782481, 8709120, 1101122, -5979668, 4201015, 7762617, 967441, - 5315559, -633508, -625992, -601295, 1250909, -2246268, -328565, -870268, -965294, -900333, - 856309, 73014, 2295123, -562104, -1285806, 1704028, 1549946, 1802276, 877247, -1585380, - 1094680, -930397, 1861332, 216896, -570694, -584116, 2181307, -228170, -712965, -641561, - 909996, -1129576, -49392, -758062, -1216550, 162672, -519154, -68183, -581431, 1128503, - 601295, 729608, -1149441, -114890, 345745, -40265, - }, - { - 60972428, -328603648, -20302848, 23801636, -2189897, 269509, -3550864, 24013700, -9729175, 1777580, - 4490925, 10050223, -1846299, -3881040, 5020280, 16212428, -8369818, -7485055, -3456912, 2612951, - 12461848, 5697811, 3704409, -7652021, -1034550, 5743445, 5013301, 11218991, 4718559, 2880849, - 1532767, -4565014, -18330920, -5741835, -3019899, -6932614, -6649146, 570694, 1386201, -4824859, - 6431177, 3295314, -1153736, 4233764, 11039677, 6591164, -7838852, 1030792, 2888366, 2645163, - 5235029, 1047435, 1027571, 1121523, 3401614, 1808718, -5815386, 446677, -3925600, 1459215, - -1371168, 3060701, 2794413, -777389, 2473364, -390305, -373662, 768799, -1314260, 2102923, - -608275, 763430, 4832, -730144, -1089848, -601832, -1687922, 676457, 1893007, -1240172, - 1489817, 172336, -1381369, -81604, -329102, 892816, 433792, -249645, 356482, 312459, - 272730, -6979, -543313, 389231, -423054, 96637, - }, - { - 105764, -13833016, 6254010, 6109054, -801548, -841277, -479963, 2581275, 4049617, 2498597, - -657667, 4996121, -4799626, 29331942, -3927211, 10153840, -30853434, -1158031, -8428873, 11485816, - 5841693, 9225053, 25732222, -31772558, -8469139, -9717900, -15861851, 17813376, -2511482, -19593104, - -2299418, 1699733, 2434710, -3003793, -6395207, 533113, -2620467, 236223, -2068564, -2274722, - 310848, -1642825, -631360, -722091, -3125663, 2065879, 6268505, 1770063, -21475, -1717450, - -9127, 1318555, 1360968, 592169, -3629247, 2283312, 799938, 2147, -1266479, -1516660, - -1061931, -1517197, -637803, -2596845, 216359, -1561221, 2381559, 593779, 4740034, -53687, - -1207960, -1382443, 129386, -943819, -1174674, 506269, 119185, -578747, 179315, -1960116, - 1118302, -693637, 572841, 457414, -488553, -712965, 1460826, -801011, 1228361, 159988, - -316754, -410706, -623844, 272730, 148713, -1196685, - }, - { - -74568688, -150067232, 11241540, -49376016, 108448, 3248606, 9047349, -678068, 1865090, -625992, - -6866042, 3891777, -4230543, 23800024, -17091822, 2161442, 19248970, 5978058, -12069932, 2347737, - 8045011, 4075924, 7468948, 5838471, 5901822, -2021319, 4910222, 6393596, -955093, -5229660, - -9627706, 1653026, 6600291, 622770, 1566053, -1687922, -6258841, 10192494, -8148627, 5885716, - -3323231, 317291, -5878737, 4365298, 4217121, -421981, -4614406, 8953933, -620086, 3073586, - 7878581, 5224828, -2262911, -944356, -213675, 3746822, 3856881, -3591667, -306016, -2139431, - -3747359, -3958349, -1647120, -397821, 566399, 971736, 969589, 2480881, 1121523, -2551211, - 932008, -866510, -3115462, 1083942, -2464774, -627065, -1353452, -1842541, -175557, -665183, - -804770, 1706176, 427886, -217970, 250182, 666257, -84826, 1260036, -4832, -1397475, - -858993, -1133335, 308701, 349503, 109522, 1513976, - }, - { - -56371, -12335683, 7082401, 2109903, 6939594, -666257, 1661079, 567473, 1233729, -506806, - 1228361, 3709241, 3125663, -9775346, -69837240, 4440996, -20075214, -1356136, -18289582, 23190140, - 16389595, -15643882, 15648713, -37316824, -12759274, -5110474, -13981729, 11773042, 6958921, -2039573, - -1730872, -4355634, -1889249, -10038949, 6614250, 7226283, -5134097, -471373, 9954124, 7806640, - -7605314, 5883569, 4399657, -1421097, -3360812, -5574868, -1195075, 343061, 143345, -3138547, - 2568927, -6017786, -2233920, 3458523, 130997, -1917166, 1599875, -952409, 2709588, 207769, - -429497, -1884417, -3855807, -6979, 674847, -2437931, 1318018, -863288, -105227, -1525787, - 1408749, -1748589, 659814, 1375463, 311385, 2093260, 949188, 297427, 1764695, 530965, - -27380, 2284923, -2678986, 358630, 717796, 709207, -1196685, -396748, 1772211, -1167694, - -368830, 1780801, -183073, 485331, 284542, -435402, - }, - { - -32006634, -12793634, -3519189, -4419522, 9408663, -147640, 30983894, -5019206, -1591822, -41876, - 10553272, -1096290, -13629005, -7096897, 448287, 2352032, -9337259, -2557653, 1924682, -10849624, - 1605244, 6005975, 4279398, -4151623, 7972533, 7622493, 6167036, -6438156, 2816962, 3151432, - 5507759, -11657078, 12233677, 1546725, -13200582, 768799, -5295695, -5514738, 3139084, 7940858, - -4122632, 865973, 3363496, 2355790, -1695975, -6258304, 4279935, -630286, -459025, -3343095, - -868120, 537, -1686312, -1064615, 4924180, -3518115, -2675228, 3604551, -476741, -1084479, - -1065689, -3677029, -783295, -1872606, 320512, -4655745, -1815161, 2360622, -1386738, 948651, - -1029182, 751082, -533113, -1789928, -127775, -809064, -491237, 1980517, -537945, 1946694, - 20938, 2772402, -1996086, 1959579, 476741, 1923609, 888521, 608812, -960999, -183073, - -1413581, -242129, -1571421, -273804, 1349157, -109522, - }, - { - 2048163, 27309012, -14113799, 1403917, -5037460, -10131291, 1450625, -3283503, 7462506, -8294119, - -9301289, 6106907, -127775, -12284680, -3899830, -6279779, -4474282, -142808, -32311576, 14776835, - -5633387, -5252745, 8413841, 6581501, -113817, -12083890, -11208254, -4127464, 11574400, -4211216, - 2645700, -9942312, 2066953, 740882, -4119411, 1059783, -5888400, -5907191, 1654099, -381178, - 302258, -3598109, -4151623, -628676, 2916283, 4059818, -6933151, 7190312, -2310693, -2722473, - -10595684, 1239098, 3281355, -340913, -4095251, -6293201, -877784, 1247688, -250719, 6897181, - -1751273, -2070711, 697932, 3231963, 781147, 3099356, -3182034, 447213, -331249, 922881, - -1461363, 3426310, -183073, -1175747, -1412507, 1972464, -868657, -600222, -155693, -2236067, - 877247, 518080, -3205656, 1222455, -1357747, 1009854, 343597, 289910, -695785, -852551, - -666794, 1226213, 1647120, -1076426, -311922, -315680, - }, - { - -30332670, 205869600, 20309826, 3735011, -9598178, -2123861, 4093104, 7165616, -10263361, 3983582, - 4771709, 1940788, 8942659, 4509179, -19239842, -3548717, -2474975, 703838, -12972949, -1278827, - -4876399, 13399761, -12412992, -2503966, -2861522, 11778948, 2930778, 2312303, -1404991, -519691, - -5882495, 4947803, 2007897, -5880884, 8588861, 1915555, -13972602, -2724620, -7569343, -1843615, - -1785096, -384936, 3968550, 1581085, -4151623, -1010391, -13537200, 1114007, 12681965, -2032056, - -6485938, -5727339, -3564286, 2697240, -3731790, -4760435, -1061394, -2356327, -3173444, -7056095, - 3759707, 4511327, 966368, -1183800, 55298, -1888175, -2931852, 3332895, -153545, -2159832, - -2077154, -2212445, 1357747, 926102, 2217814, 1603097, 2430952, 1224066, 1949915, -96100, - -59593, -1324997, 2595234, -73551, -887448, 712428, -494995, 816581, -1299765, 780610, - 745714, -1675037, 688805, 119185, -410706, -1073742, - }, - { - 1986959, -50778324, -10514617, 6194954, 5182415, -5625334, 5488968, 6705518, -2743410, -10136123, - -280784, -2252710, 10242960, 7875897, -24151138, 17336098, 19470698, 5849209, 15049565, -17251274, - 26014616, 5522254, -10153303, -14526116, -24947854, 2960306, -876710, -242666, -2909840, 7987566, - 1225676, 726923, 7041062, -24385750, 2153926, -6128919, -3620658, -2558727, -5084168, -2142115, - -1204738, 7744900, 5081483, 5521718, -1683090, 5354751, 3459059, -82141, -1498407, 2950106, - 5299990, -1784559, -643171, -673773, 1020055, 3492345, 1341640, -2764885, 77309, 2334852, - -3427921, -351114, 5658620, 1227824, -1507534, 2444373, -1817845, -4646618, -795643, -667867, - -2356327, 2069637, -1018444, -1571421, -2251637, 1667521, -1151588, -2054605, -663036, -1328756, - -1357210, -1650878, 364535, -2062121, -49392, -712965, -1349157, 896038, -504659, -336618, - -482110, 213675, 342524, 361851, 1036698, -517544, - }, - { - 18741626, 120687504, 10581726, -19832548, 17694192, -28229210, -10350334, -11126113, -2381559, 7979513, - 11653320, -24515136, -1968169, -1571958, 10725607, 15402826, 24035174, -292595, -11339787, 8179229, - 7781944, 4811974, 6375879, -1475321, -3794604, -7384123, -2679523, -3809636, -3444027, 1379758, - -4849018, -5448166, -916976, -11702175, -4866198, -1183800, -11576547, -2662343, -11819750, 485868, - 12254079, -10860362, -2994666, 1227287, 1415192, -9179956, -4081830, -1560147, 3491809, 7427072, - 8150774, -1352915, -4144107, 5694590, 7570417, 549756, 1227824, -3500935, 252329, 961536, - 912681, -94489, 950262, -1179505, -867583, -1548336, 1334124, 1090922, 1533840, -26844, - -2008434, 1415192, -1649804, 802622, -118112, -887448, -105227, -870268, 1606855, 1523103, - -956704, -574989, 1032403, 1709934, 358093, 1504312, -811212, -1287417, 398358, -1071594, - -109522, 201863, -199179, -64961, 311385, -355409, - }, - { - -3604551, -56316148, 14999100, 1649268, 5236639, -8167954, 1291175, 2178085, -2909840, 6117644, - -4933307, -7812546, 9263171, -4950487, 32597192, -22196390, 20557860, 4929549, 6273337, 5159330, - -3007014, -1915019, -17855790, 8738111, 77309, 5427765, -13429289, -7359964, 2134599, -14059039, - 8489540, 6290517, -159451, 2348273, 3246459, 501437, 11355894, 9439264, -7541426, 5257040, - -3202972, -4450123, 2767033, 1182190, -10062035, -4031364, -856846, 1927367, -3481608, -575526, - -2578054, 163746, -2161979, 3000572, 5281199, 1304596, -1884417, -869194, -653909, -2013803, - -2982855, 2652142, 1415192, -71404, -1129576, -1206349, -759136, -1309428, -2021856, -4499515, - 509491, 896574, -166967, -888521, -609349, 1890323, 194884, -658741, 1506997, -96637, - -118112, -1986959, -45097, 1947768, 2046552, 326418, -289910, -340376, -1528472, -1285806, - -1360968, 57982, -433792, 12348, -284005, 1519882, - }, - }, - { - { - -456877, -149100320, -129279592, 1933809, -26450020, -2972654, -1858647, 2414845, -10599979, -1469416, - -11051488, -16430397, -21800180, -752693, 24366424, -13361106, -6267968, 205085, -2709588, -15932181, - -2928094, 6587943, -742493, -4588099, 1128503, 7617662, 4910222, 10635950, -7598871, -5376762, - -13665512, 33286, 9452149, 7374459, -1132798, 1735704, -2089502, 5965710, 4580583, 607201, - 1989107, -4350802, -7880728, 926102, -2644626, -6394670, 2252174, -6212670, -3026878, -5604933, - -1376537, -5436892, 683437, -3106335, 641561, -620623, -764504, -1218697, -1565516, 1560684, - 2000918, -619549, -2179159, 31139, -2377265, 1096827, 1260573, -2087354, -1369558, -389231, - -1130650, -798327, 1127429, -1396401, -1428614, -1001801, 1076426, -61203, 1337346, 1562831, - 880468, 210990, 551366, -1068373, 343597, 404801, -509491, 1293859, -300111, 794032, - 488016, 51540, 20938, 289373, 534187, 554588, - }, - { - -1223529, -15771120, -8932458, 950798, 10409390, -856846, -2067490, -150324, -2844342, -6533719, - -17442936, -4635344, 9496710, -5539434, -1410360, 9360881, 7134478, 1601486, -20300700, 5757941, - -4789426, -6015639, 11200738, 9096204, -28865938, 6854231, 12324409, 7055021, 4451197, -2090575, - 8245801, -9033927, 9374840, -1666984, 9942849, -2163053, 2598992, 3322694, 1870458, -1919314, - -668404, 5216775, 5068062, -2418604, 3288334, -1069447, 454193, -3307125, -183073, -3066070, - -5464272, -336618, 2623151, -45634, -2742874, -2333241, 940061, -986232, 5326833, 887448, - -1774358, -1922535, -594316, 3289408, -1294933, 667867, -316217, 1388885, 2344515, -1570884, - 771484, 1204738, -3156264, -2985539, 950262, 115964, 223338, 992137, -141197, -47245, - 927176, -1215476, 141197, 1190780, 1316408, 685047, -1097901, 63351, 219043, 765578, - -792958, -867583, 531502, 175557, -825171, 482647, - }, - { - -2067490, -24927990, -23626616, -20511690, -443455, -3700651, -1726040, -3206730, -1944547, 817118, - 6829535, -7290707, -4489315, -5478768, 12643310, 15889232, 7216619, 21902722, -18066244, 10536092, - 10936597, 6292127, 358093, -4379793, 10761041, 8236137, -5363341, -4372277, 2862596, -815507, - -6702834, -2943126, -4330401, -10660109, -4898410, 1781338, 4784594, 427886, -845035, -1054415, - -1611150, 2020782, 2882997, -1181116, 1770600, -2574833, 3435974, 3794067, -4601521, -2479807, - 2952790, -1552094, -1190243, -2536178, 2109366, -1287417, 3062849, 562641, -117038, 755914, - 2293513, 91268, 2161442, -1788854, -667867, 2863133, 1290638, -1040456, 824634, 1018981, - -934155, -888521, 1657321, 250182, 2123861, 1208496, -3209414, -1407676, 1261110, 1129576, - 1774358, 5369, -1520418, -128849, 469762, 140660, -466541, 248571, 554588, 755914, - -327491, -890669, -1079647, -1068373, 447750, 644245, - }, - { - -50762220, -185044368, 24664386, 49833968, -12402255, -542777, -4167192, -5697274, 4534412, -6724308, - 2881923, 2598455, -4683125, -6798933, -21949430, -3077344, -22525492, -6447820, 1122060, 124017, - 4207994, 8283918, 9492951, -6330245, 424128, 6292664, -1135482, 3680787, 1926293, 2812130, - 9658308, -5663988, 3296388, -424665, 1257889, 1363652, 937914, -622233, -3810710, 5095442, - 628139, 4105452, 4647692, -1950452, 799401, -336618, -5794985, -5495948, -2281702, 3801583, - 2375654, 6813429, -1582696, -2508261, 4958003, 3893388, 2477123, 913217, -2568927, 1089848, - 3251827, 3978214, -1045825, -2148021, -1510755, 2855617, 2917357, 1419487, -335007, 1754494, - 503585, 330712, 605054, -271657, 143345, -413391, 1402844, 1062468, -139586, -309775, - -871342, -253940, -1613297, -935766, -610422, 479963, -693100, -884763, -223875, 157840, - 657130, 467615, 370441, 523986, 580894, 716723, - }, - { - -643708, -34526704, 4282083, 5663452, -26844, -366683, 1162862, 3773129, 4313221, 390305, - -3694209, 2664490, -7097434, -9627706, -20715164, -28564216, -16499654, 39346196, 6025302, 3100967, - 2647847, 9729175, -8587787, -10107669, -4247186, -11308112, 22636626, -7455527, 1057099, 4963372, - 6125697, 6803765, 2711735, 4138201, -1125281, -818191, 2289218, 6367289, 5040144, 3794604, - 3458523, -3655554, 5873368, 4899484, 2546916, 3630858, 496606, 959925, 5243618, 5554467, - 4842576, -1199370, -1076426, -529892, -378494, -2501282, 322123, -1491964, -1647657, 1671279, - 3120831, -2811593, 3402688, -956167, 1872069, -1810866, 1061931, 3621731, 392990, 769336, - -941672, 315143, 456340, 2131915, -1137093, -155693, 1463510, 751082, -1002338, -1158031, - 683974, 468688, -503585, -677531, -875636, -224412, -267899, -39192, 215822, 243739, - 692564, 564788, -818191, -45634, 536334, 119722, - }, - { - -70165272, -201386192, 14257681, 5180268, 12611635, -306016, 13483513, 7443179, -8581882, 11998528, - 3136400, -6408091, 11938398, 195958, 2983929, 7167764, -5494874, -2240362, 1153199, 13470628, - 2931852, 2949032, 3240016, -2391760, -6222871, 1159641, 8331163, 4211753, 10266046, 9009768, - -2413235, -7791608, -11868068, -7998303, -6481643, -4539244, -1723356, 1938641, -3161096, -4823249, - 1256278, 4395362, 5000953, -1199907, 8923331, 5559835, -5489505, 581431, 3862249, 4052302, - -120259, 4793184, -1750736, 6739341, 134755, 1366873, -1610076, -615791, -3174518, -361314, - 1014149, 560493, 1531156, 3025805, -1596654, -616328, 1884417, -755377, 701153, 432181, - -56908, 1405528, -1889249, -26844, -345208, -107911, -1100049, 394063, -151934, 332860, - 745177, 1535988, -1466731, -734439, 31675, 813359, -12885, -343597, 75162, 1328756, - -187368, 152471, 24159, -169651, 476741, 62277, - }, - { - -484258, -12397960, 6337224, 1298691, 3925600, -844498, -1124745, 3361349, 1862405, 576599, - 3629247, 4002910, -74625, 5081483, 5597953, -15367930, 1452236, -1591822, 769873, -607738, - 7234873, 6254546, 20937966, -4378183, -17690434, 730681, -20944944, 4101694, -5190468, 1740536, - -7757248, -6087580, -1217623, 6231998, 112206, -7284802, 1075889, 1174674, -3262028, -3322694, - -102542, -1637993, -1422708, -1389422, -565325, 3979824, -132070, 5702106, 1435593, -1680943, - -1603097, 1796907, 949725, -2770791, -323733, 1074279, 1857573, -3379603, 3031710, -3180960, - -2213519, -654983, -934692, -1273995, -174483, -46708, 1688459, 1219771, 3314641, -1062468, - 118112, -836445, 184684, -1138703, -169114, -827855, 791885, 261993, -226023, -851477, - -496606, -825171, 1460826, 206695, -519691, -117038, 746251, -620623, -22012, 870805, - -57982, -1120987, 318901, 255551, -637803, -208306, - }, - { - 48508972, -232052256, -38760468, -50966228, -10098005, 3468186, -1574106, 3856881, 3599720, 7152195, - -2062121, -11774116, -3141769, 7592966, 15353434, -9999221, 7988639, 13290239, -9242770, 6672232, - 5880347, 4608500, 4502200, 4561792, 2369748, 1414118, 8082592, -471373, -3253438, -4795331, - -1909113, -259846, 3648575, 3273302, 1108102, -1298691, -4128537, 3342022, -1056025, 1881196, - -3642132, 1089848, -1245004, -624918, 7982197, -3158412, -2856690, 8277476, 2934000, 5835250, - 6728067, -373125, 1739462, 72478, 624381, 3406446, 1096827, -4874788, -927713, -2633889, - -2638721, 448287, -1577864, -753230, 525597, 2509335, 741956, -1119376, 2485176, -1185411, - -1031329, 244813, -1044214, -1658931, -1027571, -1658394, -1327682, -521839, -2039036, -514322, - 523449, 955630, 376883, 55298, -417686, 1400696, 119722, 227096, 1051193, -1181116, - -1316944, -260382, -178778, 390842, -484258, 1189706, - }, - { - -1098438, -361851, -5362804, 10003516, 1128503, 116501, 605590, 1711008, 1222992, 911607, - -1218160, 4608500, -1447404, -2557653, -53888416, -30093226, -16087874, 4174171, -11090142, 25682830, - 11785390, -17898202, 3735548, -5840619, -24065776, -10558103, 2210298, -6536404, 13484050, -7183870, - -3882114, 3710315, -4080756, -9477919, 11218455, -2723009, -2729452, 3737159, 3780645, 8569533, - -408559, -437013, 4951024, 1195612, -6127845, -4684736, -3281892, -785979, 518080, -405874, - -665720, -4830765, -2820183, 1744831, 162672, 335544, 2457795, -120796, -132607, -471373, - 919660, -2798708, -1411971, -2187749, 157840, -807454, -1298154, -522375, 1433445, -1739462, - -217970, -1211181, 854699, 1571958, 1112933, 817118, 1968169, 164819, 1066763, 896038, - -544924, -1001264, 525597, 683974, 532576, 383863, -1050656, 52076, 971200, -627602, - 632971, 209380, -9127, 276489, 967441, -201863, - }, - { - 29383482, -13627931, -57869316, 13467407, -3045132, 6312528, 26089778, 2859375, -8737574, 8589935, - 2915746, 6930467, -13535589, -18662706, -6647536, 1844689, -657667, 4976257, -12890807, -49392, - 3932580, 2507724, 1265405, -3790309, 13616120, 9154186, -449361, -2602750, 5743982, 1074279, - -8443369, 4327180, 2038499, 7209103, -8310762, -5551245, -6161131, -4599373, 3958349, 6034966, - -1345399, 145492, 1684164, 1787243, 5487358, -5440113, -3901441, 1573032, -1977833, -1794760, - 4062502, -4676683, 351114, 508954, 404264, -17717, -4489852, 2358474, -246961, -1491964, - 518080, -3998615, -2592013, 185220, -1758252, -2291902, 159988, -574989, 1641214, -938450, - 352187, -147640, -1000191, -1850057, 1634772, -1058173, 463856, 355945, 239444, 843961, - 1790465, 1313723, -500364, 982474, 1000727, 799401, 933082, 541166, -338766, -199179, - -1684164, -96100, -1663226, -55835, 521302, 1022202, - }, - { - -2288144, -4282083, 15157476, -2231236, -2317135, -1479616, -9292162, -4700305, 809064, 2885144, - -2747705, -9282498, -4348655, -9808632, -5506685, -1726040, -9074729, 6612102, -9569187, -7473780, - -2135136, -443455, 571231, 6936372, 4868883, -5403606, -14007499, -1828046, -1182190, 7699803, - 1204202, -5560909, -869194, -1636919, 5734318, -10703059, -1540283, -5418638, 1698660, -1990181, - -6629819, 4691715, -6172405, -1180042, 1884954, -950798, 2093260, -2391760, -2280091, -4134980, - -3652870, -427886, -818191, 1724966, 281857, -7824357, -1175210, 556198, 351114, 3684545, - 3163244, -1697586, -960999, 1685238, 2622078, -449361, -722091, -402116, -649077, -154082, - 373125, 2268817, 547608, -388695, -944893, 398358, 440234, -591095, -749472, 146566, - -1619740, 156766, -720481, -394600, -505732, 457414, 343061, -110595, 278099, -818728, - -861678, 1004486, 1321776, -399969, -243739, 140660, - }, - { - 55097988, 108452216, -1363115, 1680943, -5108864, -6706055, 1983201, 2656974, -8121783, -2072322, - 12831752, 4656282, 3497177, -5441187, -2385318, -9740449, 1115081, -3083250, -15083925, -148713, - 6323266, -1425929, -2902861, -8517994, 15104326, -1792075, 13739064, -3883724, -1705639, -6256694, - 3489124, 450972, -1997697, -5841156, 4828080, 4078072, -8931921, -3320547, -7466801, 91268, - -4799626, 4510790, -2639258, 2451890, 2738579, -9737765, -10524817, 5218922, 3561065, 498216, - -4027069, -7246684, -1488743, -1400696, -1162862, -2282775, -3776350, -1425392, -4034585, -3163780, - 3897146, 2308545, 625992, -294205, -760209, -392990, -3221762, 931471, 959925, -2172717, - -1765232, -493384, 529892, 1078574, 1340567, 1532767, 1738388, 1668595, 1986959, -759136, - 121333, -357019, 1123671, 1282585, -1152125, 169114, 592169, -289910, -1621887, 1439351, - 384400, -1404991, 10201, 620623, -522912, -827855, - }, - { - -1118302, -54681912, -2930242, 5501316, 3476239, 1396401, 3069291, -175557, 908922, -10009421, - 1114007, -2946348, 8560944, 24438900, 9742596, -22241488, 17591650, 3648575, -1700807, 4481799, - -11746736, 31153008, -4295, -18853296, -18865644, -3197066, -7745437, -7796977, 7270306, 11577621, - 4221416, -8473970, 4887136, -6869264, -5637145, -8505646, -2582886, 2914135, -213138, -7314330, - 386547, 2418067, 9625559, 5399848, 2039036, 1713155, 3410204, 363462, -791348, -214212, - 6868190, -799401, -884226, 96637, 646393, 875100, -1305133, -1871532, 1010391, -944356, - -592169, 444529, 4518843, 814970, -1198296, -192737, -549756, -4274566, 867047, -1024350, - -2077154, 37044, -467615, -1235340, -1858647, 813359, -82141, -2690260, -1480153, -201327, - -1511829, -1949378, -1202591, -19327, 115964, -1328219, -929860, 475668, -1209570, -651761, - 13959, 388158, 280247, 180926, 751619, 330712, - }, - { - 3792456, 139589120, -2181844, 11089606, -7197292, -15275051, -13290239, -6674916, 1625108, -4611185, - 17920752, -21294984, -394063, -4701916, 21357262, 757525, 15707769, 7739531, -6256694, 6787659, - 9456444, 7969312, -2680060, 1312649, 820876, -4112431, -7174743, -5208185, 3568044, -8910447, - -4033511, -974421, -3249680, -9941776, -3095061, -3358128, -4655208, -11167989, -1143535, -4660040, - 4555350, 1952600, -7235410, -3877819, -842887, -5500780, -772557, 511638, 118112, 5292474, - 6220724, 5994701, -2167348, 2238215, 5850819, -607738, 524523, -690416, -553514, 3892851, - -1065152, 404801, -1884417, -611496, -603443, -304406, -1088774, 970663, 1315334, -3104188, - 2679523, 533650, -1117228, 580894, -166430, -2321967, -1232656, 1186485, 1578401, 2014340, - -321586, -1444720, 103616, 1968169, 513785, -372052, -191663, -34897, 32749, -1715303, - -5369, 818728, 85899, -5906, -332860, 827855, - }, - { - 4147328, -45686104, -1513439, 6462315, -98784, 251792, -4647155, 623844, -2794950, -1889249, - 1045825, -561030, -2761127, -5839545, 56588880, -11303817, 412854, 8435316, 851477, 17311402, - -12173548, -12080132, -11346230, 2633352, 12323335, -3521336, -8390755, -19005768, -8841727, 5926518, - 3455301, 6983080, 1269163, -2641405, 2062121, 7502234, 6717329, 7153805, 2007360, 475131, - 3507915, -6420976, 5517959, -5456219, -6176700, -3478387, -4663261, 508954, 1203665, -3630321, - -2429341, -2147, -766115, 5347771, 2717641, 2263985, -1220308, -2240899, -2663954, 896574, - -2450816, -954020, 3482145, -141197, -2326262, -2231236, -883690, -2724620, -1718524, -2327872, - 530428, -30065, -656056, -90731, 693637, 998580, 1167157, -1146756, 297427, 437550, - -244276, -2327336, 656056, 2039573, 2382096, 134755, -471910, -475668, -1866163, -1017370, - -1090922, -74625, 77846, -733903, 155156, 595390, - }, - }, - { - { - -3329674, 22081500, 33061584, 26717918, -10223633, 4555887, -2651069, 8275328, -966905, -2687576, - -5443871, 5267778, -16864190, -9838696, 8787503, -15717433, -6306086, -4460861, -1523103, -11558294, - -2080375, 5959267, 5208185, -2492155, -1453846, 3766150, -3481071, 2221572, 1523103, 5469641, - -7268159, 4955319, 4052302, 3135326, -2340220, 4628364, 1508070, 2679523, -2449205, -2156611, - 5495948, -560493, -4818417, 729608, 1091995, -2161442, 5472862, -1738388, 694174, -1702418, - 1465658, -4418448, 2579665, -3435437, 1800665, 850940, -225486, -1792612, -1766842, 1253057, - -1145146, -2018635, -1138166, 710280, -2524904, 1361505, 1063541, -622233, -200790, -421444, - 197032, 806917, 1538672, -882616, -982474, -1226750, 525597, 288837, 1580011, 1156957, - 427349, -805843, -176631, -693100, 584116, 508954, -809064, 625455, -876173, 397284, - 188442, 244813, -373662, -89121, 488553, -214748, - }, - { - 1282048, -1080721, 881542, -9238475, 1960653, -1234803, -3681324, 3453154, 718333, -461709, - -9619653, -6301791, 6459631, -3197066, -2847563, -9538585, -3765613, 7569880, -708133, 10533944, - -5438503, -1017907, 2260227, 11388106, -18003430, 6116571, 6445136, -2075006, 3258807, 296890, - 14260902, -9550397, 6586333, -6307160, 4498978, -3701725, -2333241, -2076617, 658741, -3115462, - -2640331, 2066416, 2514167, -5065377, 424665, -1291711, -397284, -4093641, 763430, 1527398, - -2838974, -427349, -280784, -1104880, -2175401, -728534, 1647120, -1997160, 3395709, 174483, - -1667521, -1100585, -748398, 2137283, -658204, 1045288, -1481764, -431107, 809064, -577673, - 1761474, 158914, -83215, 79457, 1216550, 53687, 983548, 1328219, 537, -477815, - 806380, -391379, 317828, -775242, -56908, 190052, -950798, 533650, 540629, 1191853, - 59593, -497679, 215285, 297963, -487479, 695248, - }, - { - 746251, 14342506, 12866111, -5818607, 7135015, -2639794, 2712272, 1483374, -4364761, 2312303, - 7230041, -15700253, 868657, 3888556, 7779260, 2032593, -11328513, 15787763, -16611860, 8089034, - 4383014, 529892, 424128, -897111, 2735357, 4765803, 3978214, -25770, 7020661, -1088774, - -5000953, 5087389, 374736, -8146479, -2318209, 1426466, 816581, -635118, 1475321, 840740, - -1021665, 2049236, 2487323, -2055142, 3110093, -3300682, 77309, 366683, -4331475, -2357937, - 1482838, -1463510, -182536, -2615635, 2339684, -1782411, 1414655, -2578591, 181462, -103079, - -146566, -2333241, 571768, -1216550, -352724, 1145146, -81604, -1016834, 1603633, 1020055, - -98784, -1095217, -192737, -1305670, 60666, 798327, -930397, -192737, -702764, -1042603, - 678605, 1342177, -354872, 990527, 367757, -141734, -554588, -303869, -338229, -111669, - -294742, -556735, 70867, -571231, 466541, 326418, - }, - { - 44230648, -75366472, 11722039, 55511916, -11158862, 5391795, 3321620, -3178276, 2611340, -2654827, - 2078227, 1673427, -2552821, -890132, -6139656, 10430328, -5657546, -8472360, -6542309, 1291175, - 2035278, -2603287, 628676, -6317897, -75162, 5010616, 2542621, 3323231, -608812, 1077500, - 10127533, -5066988, 1195075, -1381906, -823023, -1311039, 1514513, 1116155, -2950106, 834834, - -4238596, 1088774, -548145, -3209414, 6499896, 5778342, 423054, -1309428, -2842732, 797253, - -2604361, 6102612, 2532420, -1672890, 352187, -787590, -1546188, 554588, -2860985, 1185411, - 1326071, -402116, 703301, 1787780, -1867237, 258772, -1283658, -1502165, 680215, 957778, - -248034, 342524, -610422, -509491, 48855, -651224, 572841, 456340, -148713, 93416, - -360240, 278099, -1373853, -431644, 99321, 1340030, 180389, -752693, 172872, -24159, - -667867, -215822, 129923, -72478, -433792, 106300, - }, - { - 346282, -33032594, 5680094, 4760971, -968515, -354335, -52076, -777389, 1359894, -126702, - -8327942, -398895, -6270653, -11456288, -9690520, 4254165, 3039226, 5230734, -27686970, 12087112, - 3773129, 7905424, -1248225, -10048613, -2782602, -5142150, 19121732, -14727443, -285615, -2718714, - -2572149, 404264, -2083059, 3237869, 13959, -1473174, 2204392, 3701725, -3986804, -1620813, - 4174708, -3394635, 844498, 591632, -1534914, 2283849, 2232309, -2109903, 833761, 3388729, - 1113470, -2079838, -699006, 558346, 613107, -2569464, 300648, -2689187, 339839, 2987687, - 1794223, -2341294, 2047626, -1621887, 2316598, -1502702, 122943, 1416802, 685047, 1882269, - -2157147, 570694, 543313, 1669132, 154619, 138513, 946503, 1137630, -232465, -446140, - 571231, 816581, 200253, 1031866, 66572, -293132, -300648, -13422, 22549, -18790, - 816044, 688805, -367757, -159988, 311922, -206158, - }, - { - 59356448, -50589348, 6092411, -19987704, -18952080, -2337536, -1641214, -7757785, -3314104, 3877282, - -6661495, -8196945, 4980552, -4531191, 7392713, 7828652, -840203, 2018098, 613107, 7304129, - -3641059, -4022774, -802085, -1349694, -5851893, -553514, 2079301, -1421634, 3586835, -45634, - -256087, 2663417, -1868848, -1764158, -556735, 1675574, 1537061, 3638374, 1672353, -2730526, - -4245575, -4801237, -794032, -6220187, 2502355, 3418257, -7157026, -2529199, 1376000, -1287953, - -5286568, 2265059, -2452963, 3646427, -861141, 2291902, 888521, 1652489, -1290638, 380641, - 780610, -1227287, -1450088, 1717987, -1795296, -1473174, 1064078, -1644436, 39728, -380641, - -34360, 783832, -1431835, 1023276, -440234, 654446, -670015, 441308, -1014686, -489626, - -153008, 1524713, -572841, 121870, 560493, 684510, -542777, 159988, 66572, 249108, - -533113, 597000, 4295, 109522, 940061, -140123, - }, - { - -204548, -8548059, 3265786, -3238405, 2388002, -106837, -913754, 3666292, 128312, -772020, - 2244121, 4584878, 2098092, 3739306, 895501, -17919678, 20906828, 11191611, 3254512, -13166222, - 605054, 10733660, 5044439, 89121, 8930311, 15984258, -15193984, -5463199, -8176007, 15351287, - -889595, -6474663, 1686312, 4533338, 1259499, -1862942, 3085934, 3330747, 430570, -2409477, - -142808, -3045132, -680752, 1253057, 2924336, 5123359, -888521, 3823058, -141734, -644782, - -2365990, -460635, 2911451, -528818, 377420, 193274, 1551557, -2446521, 3514894, -3003256, - -346282, 2405182, 1909650, 1207960, 757525, -46708, 547608, -701690, 27917, -1742146, - 1432909, 789200, -128312, -83215, 1306207, -870268, 181999, -234076, 507880, -185220, - -144418, -244813, 1104880, -428960, -682900, -117575, 423054, -635118, -681826, 112206, - 91805, -559420, 703838, 457414, -237297, 205085, - }, - { - -17097192, -219883536, 32938642, -40616432, 6738804, -272730, -12703440, 250182, 5908265, 5013838, - -1737851, -3440269, 189515, -2020245, 10272488, -14455786, -1022202, 9548249, 3009698, 8906688, - -3068754, -4495220, -6569153, 271120, 835908, -235149, -463320, -6631967, -3174518, -1397475, - -503585, -2560874, 1446330, 2947958, 632434, -2414309, -6292664, 801548, 16643, 374199, - -4085051, 2746632, 2968896, -2940442, 5069135, -2751464, -1006096, 6249178, 915365, 569083, - -294205, -5673652, 23085, 1653562, -133681, 971200, 215285, -2166811, 1989107, -864899, - -2734821, 2724620, 191126, 122407, 1771674, 2348810, 483721, -1733019, 1612223, -398895, - -563178, 1524177, 807991, -1009317, -1156957, -1911797, -836982, 200253, -664646, -468151, - -96637, -120259, -979253, -394063, -651761, 1056562, 25770, -716186, 813896, -445066, - -565325, 382252, -411780, 332860, -605590, 616328, - }, - { - 113817, 5618891, -9957345, 4087735, -3136400, -38118, -368293, 190052, 721555, 1598265, - -3655554, 2160369, 2023467, 10523744, -30219926, -22947474, -156766, 4662187, -9680856, 13535589, - 380105, -707596, -2446521, 2507187, -1961190, 5479305, 14374182, -9866614, 5894306, -2820183, - 5479842, 9189619, -5886790, -6774774, 8807904, -8179765, -3988951, 3074123, -2106682, 2282775, - 3043521, 1535451, 1637993, -3158412, -2717641, -81068, 609349, 268435, -1078574, -2017024, - 627065, 199716, -1938104, -71404, -957241, -460098, -593779, -1340030, -695248, 376347, - 3318399, 158914, 1377611, -566936, 112206, 294205, -863825, -1572495, 176094, -3114925, - -1004486, -1321776, -261456, 922344, -45097, -1300301, -149787, -1209033, 156766, 106837, - -545461, -435402, 1478006, 377957, 421981, 1027034, 73014, 632434, 393526, -114354, - 635118, -725313, -272194, -89121, 560493, -106837, - }, - { - -26319022, 17317308, 31625992, 4482872, -2986613, -9915469, 6155225, 11644193, -2144263, -829466, - -5683853, 8774081, 3573413, -1245541, -4757213, -2559264, -1822140, -1148367, -10130217, 6626598, - 3241090, 780610, 543313, -8611409, 7417409, 887985, -7729868, -4597763, 3369939, 4127464, - -8507793, 4648765, 150861, 4532264, -7368554, -1334124, 504659, -161598, 2632815, 1263794, - -6327561, 807991, -196495, -5180268, 3518115, -1081258, -4549444, 552977, 1326071, -1053878, - 4787815, -2285996, -764504, -677531, -617938, 1141924, -2800319, 2055679, 361314, -1459215, - 171262, -2690260, -825171, 909459, 175557, 341450, 1553704, -442919, 2557653, 5906, - 778463, 291521, 1147293, -627065, 1505386, -427886, 126165, -1300301, 244813, 463856, - 1432372, 294205, -1031866, -315143, 108448, 42950, 558883, 610959, -725313, -20401, - -809601, 523449, -559956, 156229, -288837, 433792, - }, - { - 2607045, -17992692, 2072859, -1772748, -281857, 1584306, -6863358, 1691143, 566936, 8014409, - 4147865, -5310727, 4771709, -1148904, -2603824, 261993, -3652870, 11077258, 57982, -1173063, - 3075734, -2588792, -8709120, 1642825, 5446019, 171799, -8768713, -5524402, -7512972, 12463995, - 10051297, -4517769, 188979, -6318434, -8590, -9395241, 4689031, -1293322, 2497524, -1279363, - -7494718, 3840775, -6760816, -924492, 3869229, -4168266, 818191, -1003412, 1474248, 1224066, - 670552, -1449552, -1348083, 1691680, 2521683, -3049964, -498216, -1156957, -532039, 2094870, - 2343979, -2974265, -311922, 1999844, 2158221, -2454037, -1516124, 356482, 265751, -442382, - -606127, 413391, 928250, 372588, -632434, -346282, 30065, 27380, -141734, 412854, - -709207, 810138, -947577, -556735, -121333, -96637, 241592, 112743, 646393, 67109, - -236760, 254477, 124554, -31675, -13422, 198105, - }, - { - -53388056, -58040040, -20283520, 3034395, 3397319, 11293617, 13772350, -6634651, -5182415, 4563403, - 8346195, 1040993, 1953136, -4516695, 6074158, 2361158, 1955821, -9575093, -12076911, 6949794, - 9607305, -2226941, 5142150, -245350, 17921288, -2061584, 14539538, -4398584, 2206540, -6574521, - 2273112, -826244, -5133023, -4565014, 2282775, -818191, -7857643, 3199751, -1829119, 2901251, - -3263638, 1169842, -7542500, -438087, 2737505, -5959804, -3444027, 2581275, -2415919, -154082, - 1982664, -1933809, 65498, -539018, -1571958, -1191853, 62277, 1448478, -420370, 228170, - 1585917, -305480, -892816, -99858, -421981, 1427003, -1873143, 46708, 1032940, -506269, - 591095, 1525787, 195421, -1191853, -1164473, -437550, 91805, -409633, 242666, -789200, - 922881, 201327, -172336, 662499, -1300301, -378494, 394600, -748935, -700617, 1460826, - -26844, -541703, 223338, 454193, -244813, 223875, - }, - { - -20401, -38917772, 4840965, -1904818, -1070521, -3664144, 3758, -2829847, 578210, -4299799, - 5040144, -6221797, -6414534, 7474854, 571231, -17511656, 9210020, -12648142, -1191853, 6541772, - -31474058, 970663, -8521752, -7154342, -5397164, -506269, -8639864, -7829726, 9962714, 2339147, - 3940096, -1382443, 5140002, 983011, -812823, 3004867, 6777996, 1962263, 5140539, -818728, - 1988570, -414464, 5192079, 500901, 1095754, -2941516, -3863323, -2673617, -178778, -1789928, - 2959769, -1070521, 1512902, 685584, -1358283, -1373316, -1833414, 106300, 921271, -1429150, - 954020, 387621, 1142461, -629213, -1248762, -568009, 736587, -2345052, -21475, -563714, - -65498, 60130, -234613, -289373, -9127, 663036, -148176, -2072322, -638876, 1215476, - -123480, -164819, -418222, 591095, 809601, -706522, -448824, -5369, -635655, 208843, - 386010, 266288, -703301, -638876, 337692, 114890, - }, - { - -23136988, 90272696, -16360067, 21669184, 6598681, 14099841, 6781217, -1029182, 2862059, -10659035, - 11769821, -18603114, 4021700, -5791764, 10466835, -8368207, 5268851, -2823941, -8334384, -1566053, - -3767223, 4556424, -570157, 1600949, 563178, 813896, -5782637, -2094870, 2514167, -7166690, - 3561602, 1670205, 622770, -987843, -246961, -2524367, 3837017, -202937, 3586298, -6813966, - -5284958, -379031, 193810, -1328219, 3390877, 4297652, 1847910, 434329, -1127966, 352187, - -89657, 5145908, -466541, -47782, 3776350, -1345935, 740345, 286152, -2532957, 1101659, - -1577864, 1512365, -542777, 1111860, 509491, 193274, -918049, -16106, 461709, -2409477, - 3499325, 1120987, -717260, -290984, 20938, -1038308, -1282585, 639950, 885300, 1259499, - 440771, -464930, -219043, 641561, -277025, -1506460, 54224, 470299, 295816, -814970, - 330712, 511638, 173409, 26844, -331249, 903554, - }, - { - -4112968, -31117038, 17310866, 171262, -1391569, 4224637, -7339562, 2650532, 2055142, 676994, - 613107, -1919850, 5576478, -3015067, 43873092, -7209103, -4605279, 1903744, -5838471, 2605435, - -8295730, -948114, -8676908, 410169, 5814312, -4643397, -1895691, -4354023, 6976101, 5864778, - -6525666, 2545305, -1365263, -4393215, 1848983, 6107444, -1507534, 1242856, 1450088, -3016141, - 5124433, -819802, 6827925, -2998424, -117575, 2871723, -186294, 60666, 2496450, -1218160, - -19327, -1126892, -1651415, 1698660, -1086090, -82678, -2210835, -389231, -994822, 1351304, - -1451162, -1062468, 3346853, 122943, -2243047, -2159295, 1145146, 81068, 853625, -66035, - 750009, 649077, -340913, 80531, 469225, 431107, 794032, -831613, 237834, -782221, - -1085016, -1034013, 818191, 795643, 457414, -301185, 109522, 307090, -272194, 2147, - -496069, 481036, 473520, -515396, 468688, -232465, - }, - }, - { - { - 5377836, 48751100, 34792992, 10805601, 2505040, 2987150, 1786170, -559420, 449898, -476205, - -6336688, 4396973, -3812857, -7764227, -2832531, -14814416, -6546067, -3252364, -3818763, -624918, - -3053185, 4361003, 5227512, 1546188, -3623342, -1688996, -2564096, 2193118, 1269163, 2120640, - 958851, 4743792, 329639, 1294396, 1992865, 1218160, 5979132, -1728188, -3039763, 1308891, - 3311420, -1452773, 1918777, -1206349, -1081258, 2459943, 1169305, 641561, 136365, 216896, - -980326, -1308354, 217970, -370978, 757525, -531502, 768799, -2100239, 500901, -423054, - -2761127, -121870, -740345, 198105, -742493, -205622, 858993, 112206, 261993, -379568, - -138513, 636192, 17717, 694174, -1109175, -258235, 310848, 397821, 708133, 704375, - 235149, 165893, -958851, -584116, 280247, 302795, -667867, 309238, -565862, 324807, - 119185, 164283, -408022, 282394, 133681, -125628, - }, - { - -501437, 8760660, -2758980, -1373853, -5772436, 838592, -3162707, -17180, 806380, -1876364, - -4039417, -2530273, 1338956, -2927557, 398358, -10442139, -1324997, 7857106, 13013751, -1327145, - -4704063, 1736777, -4068945, 2472291, 481036, 1422708, -2059437, -315680, 3830574, 4628901, - 5319317, -2172180, -122943, 4840965, -9486509, 1685238, -5237713, -3331821, 2628520, -1593433, - -2160369, 262530, -785979, 1474784, -4239133, -1257889, -753767, -1206349, -530428, 1565516, - -1468879, -1985349, -424128, -1849520, -260382, -8590, 674847, -454730, 1403917, -374736, - -1351841, -238371, -339302, 149787, 544387, -1042603, 98784, 308701, -662499, 246424, - 1168768, -382252, 1744831, 540629, 514322, 268972, 406411, 1404991, 96637, -686121, - -479426, 866510, 194347, -964757, 27380, -292058, -214212, 487479, 288837, 653372, - 274341, -24696, -213675, 179852, -5906, 374736, - }, - { - -76773, 25235618, 6281927, 10774999, -3597572, -982474, 3197066, 2844879, -2427730, 783832, - -238371, -8713952, 1003949, 5432060, 430034, 2187749, -3550327, 1708860, 1519882, -1541356, - 4464082, -6980396, 2965675, 2114735, -343597, 1059246, 2421825, 3031173, 4247723, 108448, - -3018288, 4125853, -1511829, -1044751, -4220342, -953483, 1113470, 352187, -230318, 1992865, - 1070521, 1287953, 840740, -810138, -611496, -500901, -527744, -2784213, -1347546, -2622615, - -572841, 444529, -271120, -1967095, 1969779, -1483374, 911607, -1196685, -307090, -209917, - -1553168, -1070521, -409096, -460635, -392990, 158914, 351114, -307627, 891743, -28454, - 1205812, -382789, -1126355, -997506, -425739, -309775, 733366, -334471, -548682, -831076, - -302258, 1000191, 521302, 757525, 187905, -199716, -429497, -532039, -264141, -418222, - -78383, -247497, -95026, 78920, -88584, 281320, - }, - { - -25823490, 33841656, -1362042, 44868988, 1385127, -697395, 3772592, 1875827, 2610266, 1196685, - -2570538, 182536, 2280628, -743029, 6709813, 2266669, -1466731, -7707319, -4423280, 810138, - 4509716, -5673115, -4570382, 416612, -191126, 4002910, -1205812, 3763465, -668404, 1301375, - 6422587, -1685238, -1258962, -798327, -28991, 144955, -252866, 82678, 224949, -61203, - -6543383, 2256469, -325344, -2733210, 5694590, 4271345, 1895691, 683974, -2456721, -2176475, - -553514, 4494147, 1229971, 224412, -985158, -484258, -1271310, -1931125, -387084, 1072131, - 106300, -1017907, 172872, 1930588, -569620, -1112933, -610422, -1575179, 593242, 326418, - 88047, -77309, -324807, -592169, -141197, -523449, 343597, -175557, -187368, -150324, - 462246, -77309, -555125, -568009, 377957, 917512, -28991, 213138, -248571, -170188, - -733366, 90731, -591632, 130997, -588411, -95026, - }, - { - 225486, -26521960, 566399, 1942399, 593779, -78920, -32212, -2573759, -56371, -24159, - -4964446, -4255239, -7269769, -6478958, -2842195, 12473659, 1756105, -28486908, -8972724, 8203925, - 6142877, 98784, 3246459, -5877126, 161598, 9762461, -7034620, -5526549, -1535451, 2233920, - -3610457, 203474, -4216048, 917512, 1628866, -917512, -1761474, 3423626, -3276523, 386547, - -247497, -771484, -1463510, 797790, 229781, 1859721, -1022202, 311922, -1058710, 1764158, - -22012, 537945, -1302449, 625992, -1114544, -479963, 130460, -2316061, 2436857, 2681670, - -852551, -750009, -23085, 208843, 486942, 738198, -1336272, 151934, 245887, 1216550, - 331786, -667867, 755914, 600759, 1105417, 352724, 1112397, 237297, -27917, 86973, - -235149, 639413, 518080, 945967, 124554, -213675, -157840, -268435, 216359, 260382, - 362388, 386010, 471910, -24159, -369367, -6979, - }, - { - -32417876, 72615552, -6223945, -24308978, -1711008, -2783676, -4107063, -4212826, -2435247, -7139847, - -1521492, -3336653, -6069863, -816044, 5962489, 5433134, 3809099, -1611687, 3900367, 854699, - -5725729, -2421825, -220654, -3665755, 722628, -1432372, 530428, -1569811, 1066226, -2073396, - -146029, 5738613, -1128503, -92342, -447750, 2502355, -1025423, 2491081, 3379066, -1876364, - -4514011, -4744865, -2135136, -1898912, -2061047, 320512, -1410897, -163209, -2476586, -3687766, - -1985886, -2999498, 361851, 1902671, 1437740, -564788, 2202245, 2070711, 658204, 184684, - -57445, -2528662, -727997, -486942, -787053, -673773, -442382, -591095, -467615, 312459, - 17180, -268435, -538482, -177704, 344671, -338229, -30602, 770947, -867047, -449898, - -477278, 908922, 63351, 134218, 258235, 859530, -329639, -67109, 584652, -796180, - -155693, 173946, 219043, 732292, 141734, -18254, - }, - { - 708133, -1872606, -3120831, -2298344, 120796, 389768, -508417, 1702418, 520765, 567473, - -14496, 4403952, -1463510, -2756832, 296890, 15276125, 6726993, 4153234, 4671851, -2384781, - -4978404, 2163053, 8642011, 3712462, 9918690, 6453725, -11737609, -3496640, -6372121, 11605539, - 1603633, -4531191, -5712844, 1586990, 5884642, 111669, 2698313, 535260, 3475702, -2416993, - -909459, -1901060, -465467, 1702418, 3067144, 3811784, -180926, 3555159, 526134, 726923, - -3272228, -856309, 3239479, 412317, -293132, 213138, -380105, 938987, -327491, -707059, - 831613, 2202781, 832687, 1476395, 545461, 1270237, -121870, -1101122, -1305670, 186294, - 398895, 592706, 88047, 248571, 105227, -293668, -118112, 234613, 186831, -164819, - -346819, 339302, 845035, -566399, -522375, 22549, 227633, -768799, -183073, -31675, - -401579, 254477, 199179, 500901, 221191, 60666, - }, - { - -10277857, -173792624, -2592550, -27268748, -6432251, -32749, -8149164, -1258962, 4635344, 3337727, - -1768990, -2228551, 3668439, -2233920, 5919539, -6998649, -947577, 3039226, 2741263, 6476274, - -804233, -4759898, -6213744, -2062658, -1094143, 2277943, -3664681, -5603859, -4528506, 1612223, - -1237488, -1511292, -751082, 1953673, 1729798, -5069672, -467615, -3163244, -1157494, 1098438, - 175020, -832687, 2612951, -321586, -1010928, 85362, 1189169, 1726577, 2512556, -1590212, - -2412161, -831613, -2552821, 2020245, -1246614, 1946157, -1006096, 562641, -663036, 448287, - -898722, 300648, 1159641, 585189, 1038308, 2612951, 384936, -400506, 155156, -272730, - 582505, 25770, 949188, -381715, -1363115, -1447941, -580894, -320512, -196495, -115964, - -528281, -70330, -810138, -646393, 115964, 147103, -369904, -156229, -71941, 67646, - 56371, -108448, -302258, -114354, 5369, 272194, - }, - { - 913754, -2190433, -727997, -3288334, -294742, -60130, 448287, -692564, 617402, -126702, - 1101659, -98784, -2039573, -282931, -7299834, -11164231, 637803, -2783676, -5182415, 334471, - 1359894, 8482024, 1223529, -3688303, 376347, 8298951, 7449621, 5667746, -7252589, 2069101, - 7653632, 2653216, -598611, -3813931, -320512, -1632088, -3543885, -1046361, -141734, -1252520, - 4862977, 2168422, -2527052, -3609920, -614180, 870268, 2454037, -197569, -872415, -2094870, - 545461, 2530273, -2789045, 265751, -782221, -499827, -1109712, -1321239, -724239, 2081985, - 1510755, 1336272, 827318, 23085, 304943, -195421, -149787, -970663, -1552094, -1320166, - -1773285, -300111, -411243, -481573, -679142, -708670, -26844, -1244467, -120796, -84289, - 150861, 155156, 558346, 838592, 117038, 717260, 328565, 874563, 71941, 52076, - 66572, -231391, -410169, 89121, -104690, 561567, - }, - { - 22490060, -22122840, 18592376, -2646237, 7431367, -8760123, -4279398, 7227893, 3762928, -3513820, - -2871186, 3696356, 10360535, -1478006, -101469, -8127152, -1291175, 241055, -9119826, 8165807, - 3322157, -1221918, -789737, 507880, -1183264, -3490735, -9186398, 1917703, 1192927, 4094715, - -9319542, 3540127, -118112, 2881923, -1897839, -3672197, 1004486, 1311039, 2201171, -1551020, - -4744328, 31139, 452045, -4897337, -3697967, 2468533, -2988760, 1850594, 9664, 710817, - 566936, 1864553, -806380, -1213328, -747324, 92342, 156766, 23622, 937377, -820339, - -835371, -719944, -482110, -234613, 1390496, 652835, -461172, 1204738, 2106682, 504659, - 220654, -26307, 1141388, -213138, 655519, 59056, -626528, 6442, -484258, 843961, - 432181, 716186, -1268089, -399432, -197569, 4295, 452582, 276489, -578210, -258772, - -352724, 61203, -168577, 66572, 217433, -471373, - }, - { - -2617783, -17875654, 5194226, 3005403, -2216203, 1137630, -3418257, -7516, -73014, 4578435, - 2276333, 3543885, -1202054, 6907381, 1484448, -3783866, -2654290, 846109, 8712878, 2285996, - -2421288, 187368, -3776887, -3660386, 8119636, -6030134, -5106716, -8747775, -677531, 6414534, - 13352516, -6240588, 1028108, -3967476, -5340792, -4729833, -14496, 2952253, 3799972, -2808372, - -1535451, -2240899, -3407520, -1098438, 1399086, -1246614, -1839857, 1910724, 454730, 2206540, - 174483, -1262720, 457951, 158914, 1458678, -534723, -1923609, -510564, -541703, 1077500, - 928787, -1664837, 783832, 1553704, 607738, -501437, -1040993, -387621, 930934, -688805, - -595927, -467078, 595390, 483721, -108985, -1272384, 91268, -264677, 355945, 69793, - 375273, 57982, -379568, -238908, -175020, -434865, 4832, 464930, 375810, 47245, - -81604, 307090, -229781, 191663, 38118, 195958, - }, - { - 25705380, -167028592, -10723460, -5082020, 432181, 24049670, 2992519, -9969156, -4275103, 5320391, - 5779416, 3912178, 90731, -4083977, 318364, 9594420, 2080912, -6533719, -11865384, 7988639, - 164819, 4868346, 2572149, 8615168, 3263638, 4864051, 7197292, 1420560, 1875827, -4683125, - -537408, -2276870, -1229971, 333934, -2575907, -5026723, -2558727, 1451162, -368293, 3146601, - -2374043, -49392, -3303904, -5471252, 137976, -1468342, -656593, -1290101, -338766, 147640, - 332323, 630823, -2160369, 1285269, -2931852, -64425, -951335, 2873870, 605054, 816044, - -1050656, 1469416, -1832877, -398895, -405338, 1441498, 920197, -1607392, 0, 110059, - 1534914, 134218, 96637, -1229434, -813896, -329639, -339302, -282931, -430570, 24696, - -48855, 513249, -37044, -105764, 115964, -744640, 63888, -384936, -442919, -9664, - 505196, -76773, 204548, 18254, 156766, 202400, - }, - { - 1182190, -28792388, -5260261, -1964411, 1189169, -3131031, 1661079, -3649649, 1065152, -2608656, - -878321, -552440, -4361540, 2195265, -12719546, -1788317, -2747705, -3991635, -2758980, -1844152, - -4032438, -25479356, -3023657, -10887742, 1724429, -2985539, -6535330, -11075647, 6345814, 966905, - -1073205, 4968741, 6431714, 3665218, 783295, 6375879, 4555887, 1964411, 3485903, -1522566, - 337692, 521839, 3015067, -1584306, 2152316, -660351, -6066105, -843961, -927176, -2097555, - 1756642, 763967, 2204929, -688269, -2474975, -258772, -1099512, 402116, 592169, -416612, - -707596, 1012002, -541166, 1052267, -541703, -1410360, -390305, -120796, -865436, -471373, - 562104, -240518, 330176, 64961, 66035, 67109, -309238, -923418, -366146, 165893, - 566399, 886911, -541703, 563178, 140660, -157303, -318901, -164283, -179315, -126165, - 640487, -173946, -581968, -236223, -212601, -256624, - }, - { - 30147450, 9507447, 4332549, 5346698, 6761353, 15018427, 531502, 7474317, -357556, -2086817, - -8511015, -1843078, 28991, -3477850, 4471061, 3926137, -5272609, -3924526, -7749732, -1329292, - -7097434, 2092186, 350577, 876710, 2112587, 180926, -8224863, 3318399, 134755, 705448, - 2131915, -551366, 208843, 3546569, -3005403, -392990, 4716948, 1421634, -851477, -4800163, - -1268089, -4704063, -718333, 466004, 1816771, 7657390, 1989644, -2345589, 2037962, -3251290, - 421981, 3983582, 1075889, -350040, 1193464, 710280, 367757, 102005, -3425237, -385473, - 1132798, -74088, 977105, 1643362, -370441, 397284, -307627, -588947, -447213, 161598, - 827855, 997506, 682900, -70330, -862752, -101469, -1479079, 408559, 628139, 661962, - 794569, -271657, 137976, -583579, 596464, -1021129, -111132, 141197, -102005, 148176, - 97711, 37044, 405874, -23085, 39728, 424128, - }, - { - 4124242, -16398185, -3321620, -643708, -1534914, 2910914, -3152506, 3821447, -132070, 1409286, - 1098438, -2595234, -1618666, 10986526, 19986630, 5677947, -2479270, -3089155, -8071854, -6127845, - 6808597, -3799436, -5922760, -2427730, -2379949, 802085, -898722, 3808562, 2777233, 2066953, - -2076080, -2194192, 1013075, -5000953, 639413, 4482872, -1336272, -3120831, 3693135, -3009162, - 668404, 2268280, 2975339, 3270618, -578747, 792421, 1650341, 727997, 1521492, -1032403, - -647466, 294205, 22549, -252329, -788663, -1591285, -891206, -339839, 517007, -593242, - -1706713, 586263, 1334124, 443455, -1527398, -396211, 622233, 1027034, 267362, 723702, - -210453, 918049, -183073, 391379, 24159, 303869, 418759, -217433, 289373, -1398549, - -1321776, 404801, 366683, 275415, -282931, -407485, 97711, 443992, 311922, 67109, - -26844, 423591, 63351, 99858, -5369, -335544, - }, - }, - { - { - -3609383, 34920768, 11556683, -11941083, -2731062, 642635, -87510, -2455111, -3156264, 4763656, - 5834713, 5297306, 432718, -754841, 5123896, -5342940, 3164854, 2964601, -1893007, 3419868, - 1367947, 3466576, 2862596, 1585380, -5430986, -2309619, -3552475, 1160178, 1023276, 1068910, - 315143, 4511863, 620623, 63351, 246424, -2506650, 5114769, 436476, -847719, 113280, - 1582159, -424665, 3804267, 690953, -678605, 3193845, 301721, 752693, -73551, 1165010, - -521302, -758599, -44023, 2374043, 923955, -1279900, 1073742, -1891396, 615254, 463320, - -522375, 1827509, 86436, 208843, 216896, -401043, 161061, -389768, 234076, 501974, - -339839, -221191, -318901, 768262, -676457, -40265, -218506, -188979, -418222, 74625, - -138513, 467078, -75162, -138513, 122943, 312459, -202400, 393526, -205085, 410706, - 104690, -22012, -463320, 255014, -91268, -110595, - }, - { - 185757, 7402913, -1664300, 13563507, 2627446, 810138, -1508607, -2177549, -1199907, 690953, - -375273, 662499, 2850785, 2799245, 5797669, 922881, 4201015, -1498407, -196495, -3570729, - 386547, 6265821, -1184874, -1903744, -3296924, -4543539, -8312373, -1126892, 5134634, 2542084, - 1446867, -1134945, -2433636, 8993662, -6907918, 4103841, -1141388, -2552284, 887985, -826781, - -1969779, -371515, -893353, 3798362, -1348083, -1079647, -1567663, 1271847, 113280, 1438814, - -993211, -2843805, -790274, -975494, 507343, -1302449, 517007, -417149, 635118, -533650, - -318901, -93416, -633508, -243739, 404264, -914291, -103079, 229781, -668941, -387621, - -65498, -288300, 1443646, 79994, 444529, -42413, -478889, 192737, -976031, -151934, - -31139, 679679, 105764, -363998, 73014, -293132, 378494, 97174, -509491, 133681, - -27380, 190052, 151398, 62814, -17180, -11811, - }, - { - 437013, 10944114, -10727218, 18161270, 4123706, 148176, 811212, 2392834, 15032, -1138703, - 644245, -305480, -438624, 2330020, -806380, 5568425, -477815, -913754, 5896990, -4496294, - 1052804, -7692287, 2128693, -3963718, -5680094, -2735357, 162672, -2399813, -5021354, -280247, - -2735357, -776315, -1876364, 1517734, -5906, 1899986, -388158, -1080721, -987306, -862215, - -444529, 376347, 703301, 1073742, -383863, 513785, -905164, -3797288, -1219234, -1150514, - -284542, 811749, 2068564, 483184, 2521683, -1317481, 690416, 1926830, 1114544, -785979, - -1130650, 46708, -81604, -147103, -1034013, -452045, -46708, -630823, -20938, 73014, - 1553704, 562104, 476205, 140660, 237297, -190589, 965831, -345208, -360240, 119185, - -2147, -24159, -76773, 233539, 260919, 196495, -208843, -505196, -123480, -381715, - -179852, -7516, 39728, 169114, -256087, 134218, - }, - { - 3108483, 73293616, -9967545, 39740796, 1315334, -2231773, 2757369, 5162551, 2766496, 723165, - -2039573, 2715493, 7995619, 4358318, 5859409, -5320391, 280784, -509491, 5754183, 7012608, - 6012418, 750009, 1727114, 2588255, 629750, 6223945, -3583077, 3405909, -1954747, -2100776, - 3133179, -698469, 607201, 1859184, 1787243, 1140314, -3277597, 37581, -676994, 1310502, - 317291, 3846680, -359167, -1210644, 3184718, -784905, 32212, 1789391, 199179, -571231, - -1836635, 897111, -184147, 1658931, -308164, 1197759, 498753, -1779190, 558883, 506269, - -875100, -1025423, -79994, 942745, -42950, -1104880, -452582, -397284, 903554, 326954, - -74088, -154082, 118112, -459025, -23622, -251792, -141197, -1044214, -176631, 359704, - 754304, -144955, -161598, -206158, 214748, 123480, -266825, 389231, -312459, 166967, - -216359, 387084, -622233, 280784, -199716, 245350, - }, - { - -1228361, -23799488, -32212, -1626182, 489626, 40802, 580357, -1162326, -861678, 2020245, - -1629403, -2071248, 437550, 1138703, 2277407, 8457327, -7048578, -14706505, 9532680, 5148592, - 5452461, -5779416, -476205, -2223183, -3898757, 6177774, -1505923, 4380867, -2278480, 5180805, - 4134443, 1712618, -1588601, -1433982, -483721, 2684, -3117610, 2276333, -2087354, 2110977, - -1759326, -1532230, -421444, 1860795, -823560, -268435, -2099165, 1000727, -7516, 1997160, - -230318, 836445, -850940, 1188095, -754304, 766652, 919123, -1179505, 1855426, 512175, - -838056, 969052, -914828, -105227, 302258, 1092532, -1072668, 317828, 185220, -323733, - 833224, -149250, 77846, -195421, 969052, -107374, 235149, -566399, 20401, 108985, - -730144, -46171, -176094, 115427, 223338, 511101, 156229, -57982, 526670, 361851, - -34360, -19327, 687732, 313533, -435939, 251792, - }, - { - 88584, 110776872, -4670240, -12641699, -2009508, -88047, 767725, 3171297, -1850594, -7400766, - 95563, 1046898, -360240, 315143, -222265, 2490544, 630286, -2303176, 4838818, -1304060, - -5330055, 2735357, 3817152, -4459250, 2490007, -1169305, -923955, 992674, 3628711, -1064615, - -2749316, 462783, -5628018, -504659, -195958, 3628711, -752693, -959925, 928250, 132070, - -1322313, -799938, 405338, 2230699, -1174674, -331786, 2296197, 2592550, -2139431, -599148, - -650151, -2867965, 2003065, 2154463, 2948495, -648540, 454730, 27917, -689879, 259846, - 73014, -2842732, 541166, 874026, 1030255, 916439, -348966, 341987, -796180, -255014, - 102542, -848256, -853088, -1062468, 2147, -591095, -550830, 656056, 137976, 118112, - -558346, 584652, 69793, -87510, -93952, 470836, -102005, -248571, 166967, -986232, - 216359, 219580, 51003, 349503, -339302, 12348, - }, - { - -163746, 5514201, 6781754, -52076, 488016, 551366, -863825, -751082, -62814, 177167, - -2403034, 1756642, -2532957, 2192581, -173409, 18673444, -670552, -4046396, 9589588, 8798777, - -3223373, 1566053, 6115497, -6439767, -1529008, -8835821, -18865106, 491237, -3264175, 3205119, - -818191, 2467996, -4649839, -4806069, 2563559, -1787780, -1551020, -528818, 2708514, -3785477, - -1384053, -487479, 2099165, 143345, -1413044, 1633161, -1227824, 1389422, -1143535, 1353452, - -1867237, -69793, 2279017, 1523640, -1013075, -1300301, -619012, 2965138, 236760, -945967, - 581968, 964220, -644245, 1133871, 601295, 725313, -570694, -738198, -352724, 807991, - 68183, 104690, 30065, 442919, -133144, -419833, 113280, -70330, -732829, -310848, - -424665, -353261, 358093, -140660, -97174, -152471, 393526, -257698, 209917, 64961, - -265214, 390842, -220654, 279710, 70867, -67646, - }, - { - 27063126, -113911656, -7978976, -24446954, 3600256, 2485176, 268435, 212601, -344134, 3752191, - 2162516, 3436511, 4894652, 74625, 4247723, -4568772, 25770, -3600256, -2257005, 3425237, - 811749, 666794, -2496987, -5462662, -1618129, 2091649, -1224066, 677531, -915365, 3367791, - 1884954, -200790, -1262720, -395674, 1108102, -2668249, 5144834, -446140, -1986959, 1945083, - 1317481, -1767916, 1644973, 1554778, -1566589, 39192, -632971, -1775432, 1357210, -62814, - 38655, 2274185, -944893, 2018635, -280784, 2327336, -805843, 421444, -1027034, 1169305, - -676457, -1163399, 1618129, 625992, -434329, 1177895, -392453, -289910, 27917, -656593, - 506806, -417149, 976568, 478352, -127238, 134755, -272194, -269509, 463856, 787590, - 25770, 92879, -472446, -372052, 3221, -28454, -189515, 41876, -394063, 139586, - 445066, 10737, 44023, -107374, -180389, 144418, - }, - { - -50466, -2486249, 8074539, -3128347, 299574, -68719, 54224, -969052, 470836, -969052, - 2318209, 839666, -1795833, 4095788, 2617783, 8967355, 8237748, -924492, 331786, 1279363, - -3551401, 1757715, 1432372, -6793565, 1635846, 8530342, -1402844, 4934918, -4039417, -249645, - -2626373, -3821447, 6473590, -736050, -3489124, 1995012, -1710471, -836445, 1887101, -1482838, - 2886218, 1716376, -1648731, -352724, 1433445, 471910, 296353, -184147, 1127966, -600222, - -164283, 2021856, -1675037, 1542967, 795643, -710817, -501437, 117038, -730144, 1079647, - 345745, -547608, -881542, -161061, -73014, -1140851, -171799, -376883, -437013, -103616, - -774168, 410706, 14496, 450972, 4832, -399969, 107374, -884226, 449898, -135828, - 130460, 62814, 126702, 7516, -868120, 311385, -371515, 354335, -8053, -20938, - 8590, 203474, -207769, 69793, -343061, 384936, - }, - { - -18632642, -61074972, 29118804, 5755256, 12265890, -2658585, -2936684, -2008971, -1449015, -2486786, - 2219424, 1500017, 6320045, -2346663, -325881, -3715147, 3324305, 2864743, -10526428, 5204964, - -1023276, -1194538, -220117, -1703491, -544387, -246424, -5781026, 6656663, 3722126, 1697049, - -9592273, 1124208, -1605244, 4041027, 53150, -4383551, -74088, -834297, 1523640, -1331440, - -4283156, 1198833, 241055, -2272575, -2892124, 1173063, -152471, 3548717, -1039919, 257698, - 249108, 3297998, 1056562, 936303, 780073, 415001, 501974, -609349, 970126, 872952, - 461172, 200253, -897648, -935229, 1083942, 47782, -665720, -6979, 287763, 1165010, - 141197, -687732, 507880, -301721, -348966, -692564, -329639, 605054, -753767, 170725, - -992674, 441845, -862752, 81604, -273804, 186831, 282394, 66035, -537945, 275415, - -62277, 213675, 28454, -334471, 266825, -216359, - }, - { - 1794760, -13486734, -1861868, -1177895, -3136937, 367220, -3067681, -779000, -881542, -1992865, - -179315, 3118146, -5082557, 677531, 484258, -128312, -759136, -2087891, 7832410, 204548, - -3315715, 6501507, 4941360, 1456531, 4721243, -9697499, -1713155, -5332739, 1837172, 929324, - 7818451, -3018288, 2411087, -3445101, -3576097, 549219, 902480, 1299228, 2964601, -2402497, - 1555315, 1423245, -384400, 374199, -234076, -985158, -152471, 1917166, -1969243, -222265, - -1214939, 439160, 1418413, -770947, -1049046, 176094, -78383, 399432, -271120, 1821066, - 1265942, -157303, 746787, 461172, 125628, 242666, -455267, 159451, 1142998, -326954, - -256087, -542240, 143345, 224949, 498753, -590021, 146566, -707596, 77309, -113280, - 146029, -187905, -135291, 259846, 199716, -143881, -292595, -99321, -115964, -170725, - 107374, 441845, -156766, 178778, -209380, 6979, - }, - { - 12531104, -178495088, -3811247, -8516920, -7511898, 4082367, -15109695, -4589710, -2055679, 3178813, - 1416266, -4577899, -2173790, 435939, -594853, 10741176, 2434710, -3271691, -9508521, 2019172, - -4110284, 7950522, 533113, 4736812, -7588134, -1792075, -747861, 533650, 4020626, -874563, - 215822, -2437931, 878321, 974958, -4376035, -4165582, 995896, -1381906, -4104378, 955093, - -3225521, 1248225, 2421288, -2287070, -920197, 1416266, 2754148, -527207, 467615, 1590749, - -161061, 641561, -2743947, 1893007, -782221, 897111, -1388885, 1517197, -913754, 129386, - -839129, 1852205, -1307818, -469762, -629213, 155156, 434329, -896038, -566399, -324807, - 940598, -1276142, -54761, -303869, -117038, -609349, 14496, 279710, 205622, 613107, - 173409, 340913, 215285, 161061, 427349, -379568, -328565, -278099, -499290, -505732, - 446677, -111669, 344134, -48318, 205085, 192200, - }, - { - -2037962, -18428094, 6043556, -851477, 2298344, 1411971, 6655589, -2732136, 424128, -1949378, - 472983, 5127117, 2592013, -8402030, -18642842, 14948634, 5240397, 811212, 1048509, -623307, - 17716740, -973347, 10557030, -7089381, -5629092, -4143033, 1938104, -7945690, 810675, 2155537, - 1869385, 98247, -1776506, 3426310, -231391, 2639258, 1211181, -1197222, 1279900, 420907, - -56908, -5086315, -382789, -2140504, 1089848, 3423089, -2998424, 1059246, 1121523, -1491964, - 1311576, 260919, 1817845, 1488206, -235149, 438087, 820876, -418759, -772557, 525060, - -1480690, 251256, -702227, 296353, 32212, -454193, 375810, 1125818, -658741, -607738, - 880468, 176631, 302795, -57982, -125091, 204548, 703301, 114354, -112743, -309775, - 46708, 133681, -275415, 545998, -124017, 337692, -161598, 256087, 226023, -444529, - 267899, -17717, -41876, 63888, -429497, -209380, - }, - { - -22597970, -60014116, 7789997, -4670240, 3304977, -1389959, -12239046, 3955665, -5107790, 1899986, - -5844377, -614180, 745177, -1072668, 6886980, 9700721, -2831457, 3705483, -5657009, -3854196, - -9651328, 555661, -455803, -1524177, 1964411, 2197950, -3828427, 6748468, 1741609, 3632469, - 1191853, 437013, 1494112, 2398202, -2371359, -1611687, 769336, -2099702, -2746632, -844498, - 3860639, -4452271, -1865090, -177704, -2152852, 1817845, 436476, -3393561, 1440425, -2234457, - 556735, 1260036, -634045, 117038, -108985, -999654, 964757, 692564, -1928977, 594853, - 879931, -937377, 110059, 498216, -1231582, -85899, -454193, -333934, -506806, 628139, - -293668, 178241, 494458, 185757, -982474, 610959, -616328, 107911, 401043, -317291, - -171262, -382252, -52076, -1123134, 399432, -302795, 328565, 120259, -13422, 437550, - 121333, 75162, 493921, 68719, -135291, -55298, - }, - { - -4505421, -13131326, 6445136, 777389, -2637110, 2481417, -1865090, 1186485, -4008815, -1279900, - -30602, -944893, -1774358, -2281165, -4391604, -445066, 1545115, -1458678, -5289252, -8430484, - 2373506, -3808026, -4240207, 724239, 75162, 1889786, -2507187, 885837, -3419868, -3997004, - -183610, -3197066, 2036351, -2655364, -2521146, -2433636, 165356, -2951716, 778463, -2098629, - 870268, 1381369, -1264868, -314606, -1414118, 855235, 1335198, -333397, -963146, -1195612, - 1431835, 1160178, -401043, 342524, -317291, -656056, 832687, 1187559, 93952, -1654636, - -986232, 648003, -117038, 801011, -125091, 827318, 932545, 569620, -830539, 698469, - -128312, 513249, -61203, -610959, -1091459, -386010, 30602, -223338, 447213, -103616, - -549756, -136902, -268972, 32749, -36507, -210990, -537, -26844, 218506, 396211, - 180926, 160524, -290447, 213675, 34360, -156229, - }, - }, - { - { - 2041183, 48557828, -26601416, -11613055, 334471, -947577, -3712999, 2849174, -3810710, 2974265, - 9363029, 5349919, -2367601, -2047089, 8084202, -2626373, 2899640, 3483755, 3020436, -2805688, - 4344360, 861678, 3207804, -3678640, 675921, -2105608, -2029909, 972273, 965831, -446140, - 106300, 5608154, -1230508, 1690607, -3420405, -1198296, 1867237, 2555506, 1745904, 1926293, - -662499, 1842004, 969589, 1859721, -1934883, 3204046, 1187022, -829466, 462246, 1131187, - -1731946, -30065, -90731, 2570001, 601295, -832150, -135291, -875100, -690953, 1469416, - 585189, 1315871, 879395, -614180, 567473, 135291, -675384, 629213, -510027, 666257, - -325344, -230318, -107911, 755377, -468151, -132070, -359704, -362388, -363998, -132607, - 437550, -49392, 431644, 537, -226023, 450435, 157840, -231928, 388158, 272730, - 204011, 74088, -372588, 192737, -243203, 84826, - }, - { - -883153, 4781373, 1394791, 9955197, 3882114, -1677722, -108985, -114354, -761820, 227633, - -3056943, 5175436, -2084133, 5798206, 1662689, 3915937, 1629940, 2410014, -10355703, -220117, - 1926830, 3865471, 6629819, -2873870, -8810589, -5232881, -6658273, 2135136, 2656974, 930397, - 849867, 2611877, -960462, 2236067, -1361505, 4832, 2798708, 76773, -1022202, -1510755, - 157840, -591632, -271657, 2291365, 824634, -1636383, -1825361, 405874, 1549410, -228170, - -976568, -2388002, -562641, 45097, 341987, -2234457, 283468, -98247, 778463, -360777, - -445066, 334471, -1237488, -252329, 498216, -285078, -623844, 389768, -229781, -638876, - -593242, 221191, 467615, -168577, 375810, -471910, 224412, -597000, -394063, 203474, - -79457, -163209, 335007, 58519, 28454, 75699, 399969, -308164, -199179, -396748, - 135828, -132607, 637266, 119722, -35970, -252866, - }, - { - -1785633, 4222490, -10158135, 6128382, 12131135, 2414309, -707059, 1343251, -965294, 199716, - 398895, 5029407, -4352413, 12348, 5452998, 3929895, 2359548, -3063386, 137976, -804770, - 3357054, -5688148, -3687230, -5099737, -1887101, -1433445, 1656247, -2966212, -8067559, 572304, - -3505230, -911070, 3574487, -432718, -1953673, 2044404, -1234803, -35970, -1551020, -779537, - -967978, 950262, 311922, 2026151, 853088, -257161, -2119030, -926102, -2273648, -685047, - 936303, -545998, 1868311, 1860258, 685584, -156766, 1000191, 1142461, 911607, -31675, - -1110786, 823023, -567473, -357019, -989990, -206695, -984084, 82678, -241055, 916439, - 278099, 439697, 1207960, -151934, 438087, 11811, 266825, -34360, -94489, 213675, - 304406, -105764, -423591, -32749, 563714, 171262, -168041, -230854, -500364, 33286, - -375273, 27917, 52613, 27917, -94489, -36507, - }, - { - 14019847, 58200564, -11102490, 43271796, -2717641, 323196, -121870, 5742372, 409096, 876173, - -3900367, 7012608, 5216775, 3077344, 830002, -4639102, 2287607, 299037, 7932805, 3089692, - 4017942, 3117610, 3008088, 4791573, -1283122, 5034776, 1500554, -704912, 200253, -1006096, - 84826, 2107755, -1618666, 1693291, 425739, 1451162, -2331630, 1694365, -1990181, 62814, - 4364761, 1079111, -204548, 2197413, -2257542, 280247, 1607392, 816044, 1595580, -489626, - -1119913, -578210, -154619, 1827509, 196495, 251256, 1031866, -648003, -55298, -238371, - -910533, 165356, 350577, -597537, 917512, -1008244, 5906, 215822, -214212, 448287, - -156229, 369904, 1611, -106837, -492311, 390305, -737661, -863288, 95026, 488016, - 120259, -2684, -157303, 22549, -106837, -278636, 292058, -168041, 10737, 73551, - 28454, 90731, 22549, 86436, -128849, 193810, - }, - { - 2079301, -21859236, -5711233, -1822677, 1905355, -616865, -634045, 1422708, -290447, 227633, - 363462, -2087354, 2688650, 3221226, 3097208, -3395172, -11663521, 19814294, 7752953, -3064459, - 3211562, -10211285, -1611150, 2591476, -2069101, -4394289, 7232188, 318364, 2114735, 4241280, - 5057324, -1911261, 3493956, -4156992, -3977140, 964220, 1690070, -481573, -3442953, 3451543, - -1984275, -1984812, 1702418, 242666, 412317, -1046361, -1946157, 1959042, 529355, 1091995, - 977642, 538482, 273804, -399432, -404264, 287763, 564251, 826781, 442382, 120796, - -239444, 1507534, -1449552, 85362, 1078037, -420907, 308701, 48318, 476741, -911070, - 1158567, -152471, -347892, 83215, 219580, 70330, 161061, -240518, -90194, -119722, - -434865, -399969, -167504, -3221, 512712, 584652, 100932, 92879, 179315, 423054, - -210990, 86973, 674847, 184684, -153545, 533650, - }, - { - 23030152, 74546672, -10910828, -14401562, 10972031, -259309, -159988, 4578972, -4808216, 1606318, - -2266132, 3219078, -715649, 1149978, 1203128, 338229, 1086090, -1641214, 4322348, 494995, - -1693828, 1809255, 537945, -1226213, 1249836, -1338419, -804233, -244276, 3416647, 3371549, - -3555159, -1830730, -4744328, 697395, -1747515, 2475512, -1154273, -310311, 1793686, -1960653, - -1772748, 2183454, -1586454, 1523640, 1542967, 104690, 2437931, 1725503, -1514513, 190052, - -3508988, 1052804, 1937030, 957778, 3602404, 753767, -545461, -5369, -776315, -269509, - -359704, -819802, 967441, 799401, 508417, 873489, -306553, -127238, -574452, -702764, - 1164473, -1109175, -1003412, -648003, -549756, -352187, -455803, 346282, 414464, -182536, - -224412, 271657, -78383, 171262, 65498, 69793, 2684, -73551, -323196, 93416, - 21475, 130460, 37044, -66035, 9664, 186831, - }, - { - -278099, 15457587, 1123671, -1469953, 830539, 341987, -1155346, -568009, 519691, -104153, - -1449552, 1994476, -2209224, -748935, 7295539, 8344048, -5134097, -5248450, 11742977, 11329587, - 213138, -839129, 641561, -12382391, 162135, -4793184, -10723460, -12251931, 3026878, -2521146, - 410706, 4869419, -5667746, -1069984, 4261145, -2288681, -3823058, 629213, 2739116, -1606318, - -2373506, -2192044, 2361695, -91268, -1935957, 1566053, -1014149, -223875, -143881, 1696512, - -1094680, 303869, 188442, 1302986, -572304, 459025, -714575, 1491427, 496606, -585726, - 68719, 190589, 684510, -230854, 272194, 5906, 379568, -158914, -396211, 96637, - 107374, 518080, -234076, 363998, 530965, -594316, 513249, -131533, -713501, -483721, - -216359, -468688, 227096, -59593, 61203, -74625, 58519, -197569, 228707, -17717, - 24159, -154082, -29528, 73014, 95563, -73014, - }, - { - -30361124, -50160924, 8891656, -24643986, -3646427, 1059783, 2766496, 4200478, -3429532, 4199941, - -99858, 6269042, -2255932, 4299263, 1779190, -4679904, 3126736, -7617662, 1476932, 1913945, - 2667175, -6979, -834834, -5427765, -2032593, -400506, 398895, 819265, 2417530, 1940788, - 1880122, 541703, 759672, 81068, -174483, -1795296, 5711233, -1062468, 1463510, -1661616, - 1461900, -649077, -135828, 1006633, 874563, -1295470, -1675574, -1939715, 1439888, 279710, - 1848983, -158377, 1327682, 693637, 685047, 1358283, 178778, 628139, 295279, -496069, - -521302, -399969, 1143535, 761283, -273804, 108985, -526670, 199716, 284005, -1146219, - 26307, 219043, 357556, 759136, 202937, 78383, -329102, 246424, 196495, 885300, - 235149, -145492, 121333, 537, -518617, 25233, 346819, -296890, -206695, 358093, - 293668, -48855, 78920, 272730, -369367, -227096, - }, - { - -779537, 3633006, 5609228, -1062468, -340913, -456877, -1471563, 862752, 709207, -1330903, - 1235877, 1436130, -2510409, 1750736, 1908039, 23482196, -13871671, 4735739, 3748970, 585189, - 23085, -1763621, -3025805, 571231, 498216, -3777424, 3482682, 6725919, -145492, -1164473, - -7013145, -102542, 4967667, 268435, 710280, 1088774, -2264522, -2029372, 1757179, 976031, - -705448, 1645509, -621697, 2108829, -883690, 412317, -1924145, 164283, 2680597, 66035, - -1433445, 795106, 59056, 166967, 2137283, -794032, -1253594, 1717987, 415538, -339302, - -481036, -1580011, -1011465, -497679, 460098, -1644436, -168577, -395137, 576063, -535797, - -154082, 151398, 103079, 205622, 53687, 293132, -520765, -215285, 270583, -175020, - -76236, -250182, 325881, -197569, -571231, 38118, -66572, -165893, 195958, -58519, - -75699, 63351, 16106, -144955, -38655, -85899, - }, - { - 16166794, -75663368, -4833986, 11712376, 369367, 7638063, 3957276, -3501472, -4117800, 279710, - 3879966, 1596117, -4527433, -535260, 641024, -719407, 1118839, 6106907, -9208947, -392990, - 1100585, 250719, -1875827, -4792647, 2783676, -1015223, 670552, 3711926, 3486977, -2131378, - -1894618, -575526, -1426466, 2644089, -1791538, -1910724, -1333587, -3687230, 3425773, 1255204, - -4151623, 1950452, -915365, -2539936, 123480, -1528472, 1976222, 467615, 898722, -66572, - 191663, 2017024, 2034741, 969052, 106300, 1287417, 104153, -207232, -10201, 909996, - 1271310, 82678, -930397, -274878, -616328, 756451, 454730, -482110, -889595, 1484448, - 72478, 141734, -477278, -386010, -26307, -587874, 135291, -25233, -241592, -548682, - -482647, 194884, 61203, -385473, -26307, 573378, -239444, 251256, 115427, -27380, - -131533, 209917, -125091, -262530, -84289, 401579, - }, - { - -565325, -11800960, -4238059, -3092913, 473520, -642635, -1138166, 541166, 32749, -4765266, - 231391, -5013838, 4186519, -1715839, 1707250, -4107599, -826781, -2666101, 5674189, -4965519, - 4567698, 1568737, 9162776, 5204964, -2830920, -7218230, -2602750, -624381, 1861332, 881542, - 579284, 4674535, -1388885, -2736431, -1812476, 1595580, 914291, -1596654, 1277753, 993748, - -602906, 1784559, 617402, 2030983, -2911988, 575526, 1374926, 262530, -1530619, -292058, - -2289218, 414464, 618475, 397284, -1464047, 517007, -42413, 90731, 146566, 1624035, - 1529545, 860067, 216896, -406948, -26844, 449898, 138513, 248034, 123480, -160524, - -331249, -129923, 201863, 754841, 69256, -157840, 180926, -622770, -231928, -236223, - 70330, -506269, 303332, 6442, 534723, 135828, -745177, -301185, -158377, -162672, - -55835, 321049, 253940, 140660, -108985, -125091, - }, - { - -41438920, -102870912, -1599875, -3454228, -13900125, -20557860, 1620276, 2389613, -4454955, 4615479, - -4291746, -1140314, -6516003, 8514236, -2434710, 4621922, -2020245, 1311576, -6504191, -5993090, - 3091303, 7430294, 382252, 1831267, -3010235, -5539434, -2185065, 2594697, 2990908, -727460, - -988916, -3035468, 389768, -67109, -4248260, 682900, -1619740, -2616172, -3332358, -212601, - 242666, -3542274, 3505230, 170188, 93952, 628139, 993748, 691490, 1676648, 1212791, - 137439, -641561, -925029, 478352, -303869, 609885, -284542, -595927, -959388, -146566, - 491237, -372052, 976031, -404264, -398895, 111669, -819265, -30602, -385473, -326954, - 25770, -785442, -586263, 500364, 149250, -682363, 324270, 55835, 227096, 373662, - 710280, 187368, -117575, 321049, 232465, -46171, -285615, -365072, -324807, -223338, - -537, 0, 333397, 73551, 115427, 132070, - }, - { - 2279017, -9187472, -7915625, 1919850, 4379793, 2848637, 3525631, -3595425, 15569, -577673, - 1122597, 4904316, 2432562, -3099893, -12596065, 6878927, 8323110, -1005022, 5849209, -1294933, - 3580929, 22694608, 7111929, 4767951, -13020730, -7758322, 5490042, -1567663, -7082938, 5442261, - -1233729, 307627, -1316944, 1435593, 163746, 1457068, 669478, -819802, -2123325, 2213519, - 928250, -3852586, -947577, -1409823, -974421, 3268470, 540629, -511101, 482647, -318901, - 621160, 1299765, -260919, 841814, 1930051, 306016, 264677, -447750, -989990, 53150, - -481036, -501437, 336618, -710280, 361314, -476205, -301721, 341987, 625992, -605054, - 245350, 479963, 366683, 207769, -155693, 296890, 464393, 340376, -23622, -527744, - 66035, -445066, 502511, 263067, -91805, 341450, -570157, 353798, 156766, -52613, - -318901, 81068, 192737, 43487, -228170, -111132, - }, - { - 5168457, -91169272, -1447941, -5808407, 4752382, -9473087, -3357054, 1246077, -2378338, -900333, - -329102, -4816806, -1407139, 10168335, -847182, 4330401, -1601486, 11104638, -10451266, -1116155, - -4003983, -2093797, -1665911, 1560147, -1685238, 251256, 1873680, 2158221, 3113851, 2267206, - 1355062, 1610613, 1040993, -1255204, 836982, -1082869, -2587718, -2351495, -856309, 1134945, - 343597, 1793686, -4064650, -2116882, -599685, -3034395, -881542, -248034, -36507, 341987, - -415001, 1518271, -1471026, 1238024, -506806, -989453, 2189897, -484258, -22012, -128849, - 619549, -178241, -406948, -56908, -998580, -998043, 53150, -651224, -245350, 572304, - -412854, -66572, 885300, -461172, -504659, 265751, 306016, -242666, 252866, -125091, - -403190, -95563, -309775, -935229, 18790, 272194, 27380, 155693, 78920, -28991, - 380641, 292058, 128312, -91268, 158377, -119722, - }, - { - 4455492, -13472776, -4573067, 4975720, -3467649, -920734, 1322850, -1971927, -1785633, -3260954, - -442382, -2581275, -1387274, 97711, -1087164, -2630131, 3272765, -4756140, -4637491, -8268349, - 1269163, -6696391, 1814624, 2149094, 106837, -2488934, 814970, 1261647, -9740449, -2146947, - 1224066, -1780801, 2448668, -3542811, -2808372, -2134062, 3176665, -2006287, -543313, -2527588, - 3027952, 1101659, -413391, -2189897, -797790, 261993, 758062, -353261, -1695438, -1185948, - 653909, 2374043, -747861, -414464, -555661, 1380295, 1600412, -972810, 959925, -901406, - -1117765, 994285, -32212, 558346, -311385, 1364726, -877247, 526670, -373125, 216359, - 622233, -281320, 703301, -844498, -390842, -1153199, 186294, -125628, 111669, 256087, - -388158, -312996, -755377, 84826, 424128, 46171, -267362, 27917, 41339, 308164, - 90731, 183073, -199716, 171799, -353261, 139050, - }, - }, - { - { - -2159295, 38489348, -16426639, 7100655, 11072963, 1425392, -624381, 9301825, -522375, -1335735, - 2273648, 3131031, -3781719, -2706366, 7845832, -2125472, -1555852, 1353989, 2401961, -5013301, - 2763812, -446140, 3121368, -5218386, 5476620, -143881, 765041, 4032974, 1869385, 656593, - 1369558, 2487323, -6018860, 365072, -4792647, -594316, 824097, 875100, 2915209, 2305324, - 170188, 1628330, -2949032, 1647120, -845572, 1481764, 1656247, -54761, -226560, 771484, - -1422708, 893890, 1584306, 843961, 573915, 1129040, 654983, 63888, -738198, 837519, - -6442, 257161, 193274, -531502, 538482, 1009317, 318364, 1133335, 273804, 715112, - -784368, 114354, -359167, -31139, -244813, 543313, -123480, -463856, -107911, -410169, - 420907, -121870, 323733, -85362, -273267, 377957, -12348, -273267, 233002, 89121, - 138513, 206695, -175557, 188979, -25233, 301721, - }, - { - 1231582, 2248952, -1872069, -10039486, -12232604, -8053, 2323041, 4379793, 2173790, -794569, - -6690486, 361314, -1801739, 4320737, -639413, 1018444, -8431558, -1523103, -4587025, 5548561, - 890669, -1711008, 1932198, -3274913, -3559454, -739808, -6887517, -396748, 20401, 19864, - -111132, 3224447, -3362423, -3378529, 3979287, 321586, 2079301, 3551938, 1146219, -365072, - 1700270, -124554, -8053, -1593433, -1684164, -1242856, -1556926, -1494649, 1140314, 1119376, - 275952, -212064, 934155, 206695, 701153, -281857, 1125281, -125628, 855235, 268435, - -605590, -100932, -532576, 17180, -599148, -818191, -598611, 248571, 31675, -324807, - -337155, -139050, -148176, -940061, -186294, -693637, 474057, -259846, 315680, 13422, - -229781, -301721, 154619, -217970, -146029, -140660, -284005, -454730, 105227, -301721, - 241592, -232465, 302795, -137976, -99321, -161061, - }, - { - 3555696, 13049721, -9837623, -28749974, -12380780, 2432025, -1803886, 530965, -1983738, 2073396, - 4654134, 9543417, 156229, 747861, 2398739, 278099, 1120450, -5406827, -6046777, 1897302, - 6561637, 980863, 819265, 1068373, 4840428, -1866700, 3688840, 2519535, -1418413, 872952, - -3103651, 3292629, 5390721, 1433445, -614180, 742493, -3081102, 277562, -166430, 1448478, - 720481, 1835025, -622770, 181999, 376883, -186831, 56908, 1093606, -923418, 19327, - 1910187, -1478543, -118112, 574989, 63351, -994285, -1611, -268435, -20938, -681289, - -2174864, 0, -289373, -62814, -391379, 248571, -1103807, 95026, -1125818, 392453, - -66035, -262530, 629750, -772020, -288300, -152471, 79994, -240518, -190589, -108448, - 120796, 163746, -353798, -70330, 204548, -184147, -237834, 147640, -344671, -9127, - -48318, 9127, -170725, 24696, 27380, 36507, - }, - { - -18684182, -1570347, -15871515, 51452096, -1888712, -599685, -199179, 3473018, -2405182, 1174137, - -5624260, 3619047, 1222992, -1366337, -4194036, -6736120, 1180042, -1899986, 5785858, -1091995, - -1195075, -119185, 1213865, 148713, -4311611, 2393908, 2403571, -1481764, 481573, -1603633, - -951872, 1418413, -3955128, 863825, 28454, 1318555, -504659, 1285806, -1823751, 497679, - 3252901, -1553168, -2385318, 1648731, -1326608, 30602, 1001264, 1596117, 1527398, 726923, - 1211181, -35970, -1901597, -619549, -363462, -1015223, 81604, 527207, 91268, -237834, - -426812, 767725, 1664837, -344671, 194884, -317291, 685584, -97174, -273804, -163746, - -1113470, 24696, 133681, -113280, -721018, 664646, -60130, 63351, 344671, 62814, - -613107, -159451, -212601, 75699, 84826, -134218, 447213, -442919, 156229, -13422, - -243739, -54761, 122407, 220654, -113280, 158914, - }, - { - -2352568, -15167140, 7211250, -2017024, -355945, -918586, -557272, 3604551, 2712272, -661425, - 884763, -1779190, 2477659, 8150774, 8257075, 1036161, 1890859, 24653650, -3891240, -6796786, - 3213173, -8179229, -3433826, 1411434, -513785, -10663330, 445603, -3059091, 2047089, 2007897, - 4018479, -4581120, 3034395, -2693481, -7705172, -3405372, 3477850, 545461, -2736968, 2292976, - -2817499, -1647657, 934155, -1675037, -433255, -1290101, -787590, 2177012, 991064, 1509144, - 101469, -657667, 59593, -1090922, -341450, -275952, -537408, -692027, -209917, 941135, - -452045, 771484, -346282, 45634, 212601, -1265942, 607738, -2684, 836982, -233002, - 438624, 347892, 68719, -220117, -289373, -439697, -318364, -156766, -222801, -26844, - 113817, -184684, -20938, 49929, 64961, -80531, -98784, 266825, -133144, 151934, - 3758, -42950, 185757, -3758, 13422, 459025, - }, - { - -27074400, 6662031, 4483409, -22800370, -4152160, 1922535, -273267, 2104534, 52076, 4125316, - -3308736, 4256850, 14496, -1544041, 142271, 1307281, 2800319, -212601, 3759707, 2003602, - 4821638, 2427194, -3299609, -1745904, 660351, 7516, 703301, -2288144, 1336809, 2690260, - -1661079, 454730, 344671, 2568927, -3779571, 493384, -799401, 1651415, 3578782, -2413235, - -4083977, 1123671, -777389, 780610, 1743757, -133144, -1211181, -1113470, -91805, 235149, - -2930778, 2982318, 1351841, -784368, 1554241, 1434519, 62277, 875636, 312996, 499290, - 800475, -209380, 288837, 5369, -385473, -280247, -1128503, -543850, -49392, -831076, - 994285, -377957, -562641, 67646, -434865, -288837, -624918, 459025, 609885, 118648, - -114890, 294205, 52613, 279710, 246961, -57445, 23622, 371515, -291521, 472446, - 266825, 374199, 108448, -115427, 178241, 316754, - }, - { - -120796, 12208445, -4772246, -904091, 1025423, 56371, -456340, -187368, -732292, 1791538, - 303869, 619012, 433255, -2132988, 1508607, -10282689, -11894375, -3088082, 1862942, 4054986, - 5664525, -718333, -425739, -15285789, -2310693, 1177895, 4825396, -5650030, 5002563, 3651796, - 1100585, 5792301, 2884071, 5176510, 3463354, -3219078, -326954, 957778, 993211, -944893, - -83215, -1970853, 1574106, -71941, -130997, 2071785, -1211181, -575526, -163746, 2071248, - -513249, -492848, -1251983, 358093, 501974, 483184, -956704, -88584, -804770, -611496, - -315143, -509491, 693100, -1334124, -1126892, 11811, 1673427, -108448, -936303, 251792, - 402116, 787053, -231928, 97711, 670015, -415538, 363998, -143345, -651761, -126165, - 275415, -93416, 380641, 64425, 266288, -217970, 32749, -73014, 91805, -73014, - 23085, -290447, 83215, -54761, -32749, 42413, - }, - { - 20410222, -252866, -9818295, -16699907, 7064148, -143345, -220117, 3417720, -3714610, 2280628, - -659278, 1563905, -10678899, -1425392, 4545149, -2670396, 5120138, -2464774, 5408975, -1553704, - -4069482, -1165547, 37044, -3602941, -105764, 1137093, 1761474, 261456, -1382980, 696322, - 3373160, 3367791, 1578937, 1615445, 882079, -4348655, 1756642, -3716757, 664109, -3432216, - -83752, -1721745, -83752, 1069447, 2930778, -1036161, -794569, -994285, -173409, -1927904, - 246424, -2016487, -166430, -335007, 241592, 364535, -346819, 1136019, 366683, -543850, - -180389, -854699, 331249, 368293, -481036, -352187, -586263, 357019, 267899, -617402, - 239981, 227633, 367220, 779000, 130997, -102005, -336618, 435402, -47782, 6979, - -122943, -74625, 382252, 689879, 44560, 270583, 750546, -106837, 16106, 133144, - 122943, 321049, 141197, 193810, -113817, -124017, - }, - { - -69793, 3898220, 1468342, 2686502, 944356, -70867, -725313, 1282585, 381178, -1875827, - -1785096, 156229, -3679176, 1791001, 1909650, 20429548, -11330661, 5407364, 2857227, -2985002, - -4738423, -2479270, -6112276, -544387, 286152, -5259188, 2648921, 3188476, 4018479, 41339, - -5124433, 7793218, 2768107, 720481, 5663988, 431644, -1481764, -158377, -362925, -1250372, - -2098092, 723165, -1264868, 694174, -2227478, 416075, -462246, -846645, 308164, -960999, - -1126355, 1116155, 722628, 115427, 1652489, -229244, -1250372, 675921, 345745, 18254, - -892279, -1043140, -162135, -388695, 1037235, -773631, 568009, 353261, 746251, -772557, - -271657, -790811, -133144, -78920, -1071594, -140123, -534187, -284005, 144955, -205622, - -173946, -299574, 387084, 86973, -221191, 195958, -142808, -514859, -129386, -200253, - -8053, -168577, -108985, -326418, -92342, 47245, - }, - { - -15434502, -99636264, 9715753, 9466108, -16417512, 5508296, 13651017, 292058, -284005, 3023657, - 718333, -3272765, -9545028, -2410014, 4059818, -2951716, -4246649, 5135707, -7996692, -3675418, - 3391414, 4163434, -1564442, -5161477, 4053912, 2646774, 3538516, 2984466, 590021, -1331440, - 128312, -2572686, -1496796, 2839510, -1935957, 1108102, 3138011, -2550137, 2991982, 1251983, - -2659122, 2931852, -1238561, -575526, 2748242, -4131222, -2070711, -1526324, 704375, -1006096, - -152471, 506806, 556198, -748935, -922881, 1503775, -341987, 1234803, 832150, -584652, - 1277753, 585189, -318364, 976568, -991064, 1462973, 1298691, -407485, -633508, -45097, - -470836, 731218, -338766, -237834, 529355, 368830, 586263, -191126, 150861, -288837, - 391916, 120259, 175020, -121870, 452582, 255551, -630823, 391916, 496069, 115427, - 54224, 49392, -38655, 142808, -57445, 228170, - }, - { - -268972, -17964238, -3283503, 592706, -650151, 4038343, 1846299, 1205275, 1414655, -1279900, - 2865817, -7381975, 2857227, -4800700, 151934, 835908, 415001, -2565706, 1358820, -10673531, - 463856, -5458904, 2184528, -1376537, -1899986, -4802311, -2645163, 2234994, 2079838, 82678, - -2447058, 2376191, -1497333, 456877, 50466, 763430, 1362042, -2740189, 1258425, 2863133, - -1447941, -279173, -435939, 2138894, -2229088, 1674500, 1111323, -1029718, -2301566, 353798, - -1180579, -1401770, -971736, 1294933, -216896, -641024, -442382, -162672, -992674, 254477, - 1180042, 881005, 251256, -770947, -341987, -359704, 263067, -82141, -455803, 183610, - 230318, 199179, 322123, 803159, 108985, -227633, -68183, -259846, 155693, 145492, - 59056, -473520, 200790, -127238, 551366, 140123, -426276, -261993, -171799, -179852, - -513785, 57982, 161598, -141734, -92879, -35433, - }, - { - 48309792, 18202072, -2199560, -3094524, -6160057, -11316702, 6806450, 4530117, -2076080, 6186364, - -2675228, 1640678, -7078643, 2922188, -7052873, -3462281, -6424198, 138513, -5806796, 526670, - 7879655, 2559264, -781684, 1837709, 3134789, -3044595, -2266132, -833224, 68183, -1979980, - -1381369, -3885872, 455267, -394063, -3062312, 3251827, -59593, 1443646, -2715493, -1255204, - 766652, -4146791, 3530463, 965831, 1647657, -716723, 202400, 1468342, 570694, -1264868, - -674310, -1246077, -2536178, -817118, -17717, -377957, -2147, 335544, -572304, -401043, - 142271, -898722, 1197759, 555661, 560493, 903017, -487479, 234076, 252329, 156229, - 43487, 87510, 15569, 490163, 15032, -556198, 456340, 73014, -68719, 76773, - 246424, 13959, -485868, 25233, -136365, -273267, 197032, -106300, 255551, 429497, - -155693, -207769, 136902, -4295, 68183, 194884, - }, - { - -1935420, 5818607, 8629663, -143881, 925565, -183610, 2051384, -4853313, -1087164, 709743, - -382252, 220654, 688269, 6852621, -3415036, 3337727, 2847563, -5644124, 3708704, -532039, - -9532680, 12902619, 8738111, 12591233, 605590, -5496485, 1161252, 3452080, -4563940, 3150896, - -2589865, -1018981, -2919504, 875100, 1702418, -569083, -1543504, -168577, -1601486, 12348, - 155693, -883153, 1706176, 446677, -1333587, 1133871, 1713692, -1145146, -456877, 591632, - 487479, 32749, -1606318, -167504, 1298691, -337155, -905701, 233002, 931471, -35433, - 54761, 379031, 480499, -516470, -548145, -769873, -22549, 261993, 608275, -963146, - -739271, 221191, -217433, 96100, 76236, 51540, -102542, 107374, 264677, -376347, - 359704, -14496, 484794, 234076, -226560, 405874, -193810, 127238, 51540, 112206, - -214748, 307627, 271120, 373662, 154082, -53150, - }, - { - 13105556, -79381736, -5752035, -2001455, 12525198, 1953673, 7574175, 4507568, -2132988, -1304596, - 2360085, -4185983, -2619393, -536334, -19114752, 89121, 1540820, 13775034, -8808978, 4490389, - 2974802, -986232, -860604, 3408057, -2842732, 2095407, 3702799, -1159104, 1991791, -1716913, - -2799782, -477815, 458488, -947040, 791348, 797790, 2893197, 2490007, 2617783, 1788854, - -2329483, 1933272, -3537979, -1338419, 2245731, -284542, -372588, 1291711, -353261, -53687, - -1227824, 2065342, -742493, 553514, -49929, -706522, 3052111, 1202054, 921807, -214212, - 79994, 252329, -435402, 470836, 357556, -980326, -336618, -490700, 134218, 767189, - 307090, -495532, 937914, -120796, 48318, 153008, 328565, -271120, 390305, 482647, - 199179, 425739, -60666, -302258, 108985, -227633, -313533, 144418, 373662, -102005, - 126165, -96100, -138513, -209917, 154619, 7516, - }, - { - -3517041, -10901164, 6266894, 7977902, -569083, -416612, 3537979, -1554778, 579284, -962610, - 550830, -2917894, -1366337, 14271103, 11526618, -11614665, -1957431, -3600793, -1456531, -1765232, - 9024263, 1129040, 8028905, 3748970, 4120484, -807454, 674310, 4281546, -4494684, 1218697, - 1976222, -651224, 193274, -2986613, 1960653, 2851322, 3615289, -506269, 2798171, -303332, - 2263448, -752693, 749472, -1157494, -603443, -868657, -900869, -1228898, -599685, -809601, - -293132, 1505923, -629213, -313533, -49392, 1844689, 1414118, -955093, 1596654, -310848, - -1525787, 685584, 1068373, 917512, -538482, -155693, -2193655, -47782, -403727, 778463, - 982474, -440234, 91805, -535260, 510027, -550293, 696322, -228707, -335007, 263604, - -176094, -2147, -301721, 289910, 290984, 251792, -205622, -12885, -124017, -120259, - -439697, 1074, -75162, 338766, -279173, 366146, - }, - }, - { - { - 531502, 1617055, 35664336, 16703128, -488016, 1822140, -25770, 7082401, 900869, 1034550, - -170725, 3299609, -7241315, 5544803, -1134945, 1948841, -2319819, -1695975, 3642132, -1989644, - -4715337, 631897, 4864051, -5144297, 6684580, -864362, 869194, 642635, 1797981, 3013457, - 2360622, 318364, -3856344, -2618856, -2451890, -1708860, 1808181, -307627, 3799436, 2684, - 1754494, 2272038, -3500398, 187368, 1906429, 540629, 672162, 876710, -455803, -602369, - 1016834, 872415, 2153389, -890669, 1476932, 2081449, -283468, -135828, -914828, 830539, - 82678, -246424, -154619, 68719, 320512, 1015223, 82678, 992137, 1088237, -85899, - -486405, -96637, -306553, -3221, 46708, -10201, 314069, -439697, -78383, -706522, - 348966, -257698, -47245, 11274, -24159, 200253, -114354, -122943, -40802, -107374, - 159988, 305480, 78920, 31139, 247497, 1074, - }, - { - 33286, -11009612, 13259638, -18561238, -6276558, -82678, 2829847, 1475858, 5370320, -2451890, - -4685810, -1544041, 1588064, 3192235, -2747169, 3177202, -11493869, -3236258, 842350, 5770289, - 544387, -4776004, -94489, -4367982, 1124745, -2605435, -7826504, -193274, -2925410, 3280818, - 969052, -1074279, -1448478, -3185255, 3607773, 141197, -89121, 3685619, 1406065, 729608, - 2063732, -224949, -909459, -2298881, -69256, -1144072, -2007360, -348966, -27917, 1512902, - -492311, 181462, 1302986, 113280, 1360431, -457951, 1665374, -491237, 767189, 831076, - -944893, -411243, -548145, 335007, -1071058, -1341640, 129386, 270583, -110059, 104690, - 407485, -1056025, -24696, -326418, -578210, -147103, 446140, -492311, 184684, -57445, - -130997, -338766, 170725, -477278, -165356, -241055, -214212, -187368, -297963, -30602, - 120259, 102005, -232465, -126702, -2684, -120796, - }, - { - -4608500, 24676734, -4981089, -41104448, -3507915, -1417876, 475668, 2486249, 10201, -1453846, - 976031, 12557411, 3460670, 2483565, 59056, -4109210, -22012, -1148367, -4321811, 543850, - -302258, 9057549, -3971771, 8624831, 1494112, -4869419, 7245610, 1755031, 1008780, -581968, - 373125, 1682017, 5093831, 3842922, -1758789, -1235877, -1027034, -607201, -24159, 995359, - -46708, 1604707, 1774895, -2575907, 65498, -836982, 1358283, 185220, 1063541, 59056, - 1149978, -1177895, -1014149, -217970, 923955, -332323, -933619, -661962, -466004, -380105, - -1879585, -491237, -650688, -32749, 889058, -428960, -1224066, 645856, -1235877, 35970, - -77846, -358630, 26307, -308701, -310311, -256624, 142271, -511101, 195958, -542240, - 105227, 32212, -171262, 284542, -406948, -100932, -255551, 164819, -181999, -249645, - 110595, -115964, -46708, 67646, 252329, -35970, - }, - { - 10260677, -75571024, 9964324, 49963892, 151398, -809601, 2272038, -1727114, -788127, 1910187, - 1133871, -1766842, -3591667, -170725, -124017, -1996086, 2274185, -4070555, 1919314, -1163399, - 1379221, -2991445, -1313186, 469762, -1736241, -1730872, 2044941, 720481, -1742146, -2552821, - -2204392, 2276870, -2556043, 936303, -390305, 645856, 1422171, -91268, -252866, 642098, - 2362769, -2151779, -287226, -651224, -1494112, 885837, 2128693, 736587, -308164, 1314260, - 1611150, 579284, -2751464, -940061, -1066763, -668941, 399432, 311385, 445066, -318901, - 22012, 35970, 1050656, -280784, -37044, 395137, 20401, -279710, 83215, -641024, - -695785, 90194, 53687, -47782, -406948, 166430, 490163, 270583, 16106, -363462, - -301721, -214212, 43487, 115964, 191663, -59593, 362925, -211527, -61203, -29528, - -301185, 26307, 35970, 135828, -57982, 35433, - }, - { - 2264522, -7090454, -1612760, -2602750, -697932, -345745, 1255204, 796716, 3612604, -291521, - -3782256, 2911451, 3417720, 1636919, 10415296, 6692633, 8980240, -3439732, -1095217, -3466039, - 525597, -1178432, -10660646, 5378910, -3944928, -7456600, 316217, -1453846, 2480881, 1887638, - 1648731, -954020, -1584843, -1674500, -4395899, -3595425, 1627256, 890132, -1338419, -1563368, - -1788854, -1444720, 588411, -1056025, -162672, -1702955, -390305, 156229, 2384781, 608275, - -556198, -613643, 744640, -972810, -179852, -590021, -839129, -577136, 699006, -10201, - -175020, -437013, 695248, -652835, -367757, 197032, -2147, 274878, -241055, 618475, - -705985, 964757, 166967, -347892, -67109, -215285, -506806, -166967, -517544, -90194, - 413927, 74625, -280247, 250719, -69256, -153545, -134218, 382252, -137439, -272730, - 57982, 137976, 34360, 85362, 23085, 117038, - }, - { - 12874164, -48668420, 3062849, -34368328, 8013335, 1542967, 2579128, -2698850, 1464047, -1647657, - 3238405, 1075889, 5546414, -6296959, -481036, -486942, 2054605, 1229434, 4387309, -2842732, - 8270497, 1813013, -3840775, -226023, -198642, -972810, 628139, 34897, -751619, -2012729, - 1415192, 2553358, 2344515, 401579, -2792803, 637266, -10737, -167504, 3399467, -606664, - -4010426, -1032403, -362925, 1016297, 447213, 1193464, -3233037, -1468879, 1093069, -603443, - -423591, 1485522, -177704, -578210, 859530, 2008434, 75162, 233002, 568546, 135291, - 1129040, -229244, -95026, -893353, -23085, -62814, -1356136, -596464, 288300, -705985, - 526670, 806917, -1438277, 390842, 122407, -783832, -385473, 366683, 598611, 197569, - -103616, 435939, -54761, 283468, 403190, -195958, 23085, 363462, -245887, 453119, - 224412, 181462, 165356, -132607, 239444, 228170, - }, - { - 268972, 3305514, 99858, 466004, -623844, 247497, -448824, 1166621, -1174674, 358093, - 1724966, 191663, 591095, -3972845, -1801739, -8285529, -6525666, -6518687, 8712341, -7350837, - 8788040, -6818798, -4124242, 427349, -1050120, 1774895, 92879, -879395, 2090575, 4810364, - 2007360, 2035815, 8507256, 2896419, 479963, -2588792, 3893925, -387621, 373125, -2741263, - 1193464, 256087, -648540, -1083942, 1449552, 931471, 506269, -870268, -200790, 1528472, - -103079, -1559073, -992137, 847719, 609885, -365072, 157840, -1124745, -1372779, 146566, - 369367, -760746, 20938, -762357, -825707, -55835, 748935, -346282, -164283, 519154, - 531502, -245350, 250182, -155156, -99321, 387621, -313533, -8590, -319438, -158377, - 32212, 523449, 128849, -70330, 149250, -140123, 126702, -31675, 149787, 92342, - -160524, -130460, 4832, 179852, -34897, 41876, - }, - { - -1351841, 10548440, 9773735, 1086090, -11592654, 1822677, 436476, 303332, -1734630, 860067, - -943819, -1729798, -2857227, -5357435, 6485401, -3413425, 4641786, 938987, 3143916, -795643, - -8910447, 1780801, -819802, -2315524, 287763, -743566, 1559073, 378494, -2235531, 3448322, - 1970853, 2301566, -416075, 2304250, 1234266, -3267396, -957778, -2032056, -537, -1800128, - -2498597, -1850594, 2275259, 814433, 842350, 70867, 483184, -197032, -2182917, -2155000, - -1015223, -272730, -1971390, -104690, -332860, 271657, 12885, 1364726, -238371, -62814, - -739808, -838056, 51540, 384400, -213138, -210990, -616865, 768262, -654983, -221728, - 617938, 104153, 16643, 913754, 34897, -251256, -473520, 252329, 540629, -627602, - -2147, -135291, 318901, 156766, 713501, -186294, 521839, 438624, 66035, -72478, - 199716, 117575, 66572, 154619, -140123, 107911, - }, - { - 724239, -2837363, 3900367, 2134599, 1699733, 483184, 82678, -914828, 1828582, 836982, - -4394826, -981937, -3740380, 3333968, 4794794, 7212324, 13259638, -4568235, 4555350, -6131066, - -7456600, 2794950, -2726767, -6954089, 1343251, -299037, 341450, -48318, 4214437, 964757, - -3081639, 9212168, -2270964, 1930588, 6793565, -2292439, -158914, 265214, 862215, -2936147, - -1223529, -2160906, 677531, 585726, -2816425, -569620, 2098092, -362925, -1396938, -951335, - 83215, 101469, 1644973, -153545, 435402, 184147, -348966, -1237488, 388158, 1131187, - -611496, -503585, 419833, 301185, 449898, -573378, 817118, 818728, -83752, -824097, - 180926, -1297617, -202400, -440771, -1044214, 156766, -222801, -571231, -345745, 100932, - -71941, 200790, 236760, -112743, 169114, -90194, -86973, -368830, -298500, -172872, - 244276, -234076, -231928, -202937, -468151, 358630, - }, - { - 15352361, -111282064, -17894982, 13058848, -17673254, 8094403, 4129074, -722628, 5136244, -4427575, - 770410, -4270808, -2331094, -5963025, 9315247, -5643050, -3657702, 2047626, -3751117, -2812130, - 1745367, 4248797, -1558536, -3597572, 595927, 2072859, 3098819, 3033858, -883690, -1028645, - 1592896, -3652870, -2069101, 2202245, 200253, 2450816, 3350611, -1275068, 1362578, -794032, - 1364189, -783832, -1611, 2142652, -494995, -2221572, -2672544, -1305133, 848793, 353798, - -1140851, -625455, -720481, -369904, 386547, 279710, -129923, 1361505, 1281511, 648003, - 74088, 296353, 495532, 762357, -906775, 1542430, 606127, -238908, -207232, -1065689, - 80531, 747861, -273267, 193274, 678068, 366146, -217433, 323196, 177167, -4295, - 459562, -157840, 231391, 97174, 258772, -251792, -507880, 267899, 234613, -81604, - 440234, 44560, 121333, 19327, 184684, -207232, - }, - { - 636729, -26593900, -2566780, 10107669, -3217468, 1274532, 5654862, -267362, 92342, 1095754, - 783832, -3071439, -3178813, 3765613, -5287642, 6243272, -991064, -3640522, -6426882, -2027225, - -4402879, 1577864, -3395709, -8074539, 2525978, -2314987, -3092913, 4460861, 623307, -2839510, - 2267206, -1190780, -2954401, -63888, 1431835, -1094143, 939524, -281320, 355409, 2579665, - -663036, -1505923, -421981, 453656, 991064, 194347, 489626, -1464584, -717796, -1086090, - -545998, -1454920, 1074, 673236, -403727, -541703, -762894, -177167, -311385, -183073, - 484258, -358093, 881542, -276489, -256624, -136902, -341987, -311385, 7516, -149787, - 202937, 325344, 63888, 833761, -129923, 176631, -494995, 162135, -16106, 505732, - 115964, -287226, -198105, 60130, 156229, 80531, -15032, -306553, -209917, -73014, - -496606, 93416, 82141, -253940, -34897, 45097, - }, - { - -32785096, 121550792, 2334852, 1401233, -6349036, -2335925, 4742181, -1527398, 155156, 5704791, - -56908, 134755, 302795, -9639517, -3201361, -3424700, -996969, -5075578, -5093831, 4709432, - 5543729, -2769717, 2894271, 122407, 5021354, -1407676, -2942590, 1487669, -4793184, 1316408, - -4345970, -489089, 186294, -3354906, -2253784, 3193845, 2707977, 217970, -358630, -1408749, - -1919314, -699543, 2304250, -2747705, 2992519, 1226213, 490700, -328028, 1312113, -1595580, - -657667, -1141924, -2175401, -140123, -1010391, -479426, -1184337, 2109903, -1267552, -66035, - -533650, -704912, 1308354, 219580, 1062468, 523449, 341987, -639413, 640487, 231391, - -5906, 309775, 459562, -137976, -708133, 621697, 118648, 275415, -296890, 284542, - -665720, 235686, -300111, -63888, -295816, -220654, 169651, -42413, 509491, 86436, - -230318, 10737, -84289, -20401, 67109, 248571, - }, - { - 1425392, 15989090, 1384053, -1640141, 1082332, -2541547, 6292127, -7186554, -1468342, 1525250, - -1450625, 2655364, 507343, 6288906, -4672388, 1803886, -2607045, -1424855, -2801929, 1378148, - -2192044, -215285, 7162932, 6976638, 8079907, -956167, -1723356, -609885, 2412698, -5357972, - 2451890, -2556579, 1067836, -2107218, 2494839, -647466, -2232309, -1856500, 3141769, -1767379, - -1921998, 1737851, -286689, 487479, -1089311, 681826, 2256469, -2231236, -261993, 1737851, - -688805, -840203, 713501, -459562, 261993, -219043, -697395, 389768, 591095, -367757, - 1017370, 9127, 77846, 797253, -1228898, 103616, -628676, 249645, 67109, -290984, - -1174674, 779537, -697932, 50466, 348966, -384400, -426276, 31675, 510564, -11274, - 91805, 645856, 46708, 193810, -150324, 493384, -133681, 27917, 62277, 98784, - 76773, 218506, 54224, 462246, 194347, -122943, - }, - { - -23034984, -25968446, -2390686, 9948755, -3230352, 7421167, 5327370, 2046015, -2951716, 2062658, - 38118, -2769180, -4971962, -1640141, -21887154, 5111548, 4727149, 5931350, -2136746, 1969779, - 2047089, -1660542, 3395709, 479963, -279173, 2513093, 3278134, -2887829, -338766, -1320703, - -984084, -754304, -617938, 3012383, -1338956, 3626563, 2825552, 3658775, 216896, 616865, - -1699196, -2739652, 851477, 1712618, -252866, 1721745, 1200980, -987843, 532576, -374199, - -627065, 302795, -321049, 243739, 99858, -42413, 2219961, 1500554, 499290, -849330, - 686121, 83215, -76773, 672699, 204548, -393526, -362388, -128849, 278636, 187905, - 466004, -595927, 169114, 246961, 568009, 177704, -40802, -27917, -234076, 658741, - 358093, 919660, -6442, -90194, 201327, -481036, -181462, -189515, 303332, 293132, - 81604, -238908, -229781, 42413, -2684, -99321, - }, - { - 2583960, 1676111, -8455717, 5048197, 4051228, -3513820, 4596689, -1079111, -364535, 1313186, - 1673427, -2551748, -2770791, 5223754, 15599321, -7032472, -6507413, 1944547, -452045, 2098092, - 7010997, 4237522, 5266167, 1894618, 3498251, -916976, 307627, 1959579, -1707250, 1817308, - 1673964, 138513, -2098629, -74088, 2728378, 5960341, -604517, 1403917, 2173254, 1082332, - -780073, -1109712, -420370, 1641751, -1198296, -872952, -1797981, -567473, 584116, -1169305, - -13959, 493384, -123480, -80531, 947577, 1318018, 596464, 257698, 79994, -1287953, - 22012, 152471, 1064615, 566936, 11274, -1569274, -31139, -286689, 117038, 699006, - 187368, -219580, -466541, 21475, 45097, 112743, 242129, 136902, -350040, -229781, - -88584, 314069, 114354, 54761, -155156, 244813, 11274, -243739, 282931, -140123, - -491774, -119185, -17180, 239444, 26844, 382789, - }, - }, - { - { - 3406446, 38968240, 51804820, 24119462, 5182952, -656593, -692027, 4836133, -1748589, -1626719, - -2886755, -100932, -7752953, 6526740, 739808, 9727027, 4618701, -3660386, -1573032, -1803886, - -6295349, -780610, 3095061, -976568, 4595615, -4861366, -1762010, -1468879, -1309965, -130460, - 319438, 2419677, 1171452, -1798518, -932008, -3857954, 2917357, 307627, -518617, -1949915, - 1889249, 2081985, -1692754, 644782, 2280628, 1600949, 770410, 420370, 26844, -523986, - -53150, 114354, 1262184, -1518808, 266825, 1548336, -648003, 267899, -699006, 729608, - 172872, -263604, 344134, 142808, -664646, -848793, -537945, 542240, 504659, 5906, - -496069, -154082, 119722, 23622, -489626, -595390, 330176, -437550, -169651, -480499, - -84826, -609885, -229244, -89121, 121333, 250719, -52076, -126165, -94489, -223338, - 179852, 248034, -15569, 18790, 336618, -83215, - }, - { - -1750199, -36481452, 1746978, -26307, 9622874, 3110630, 1508070, -2682744, 451508, -489626, - 944893, -745177, 1247151, 1095754, -4082367, 920734, -10572062, -3315178, 294742, 4813048, - -3482682, -6197638, -1251446, -8152385, 405874, -3009698, -6751152, 1133335, -4952634, 5485210, - 1795296, -2334315, -774168, -1711008, 2581812, 2362232, -3014530, -1039919, 899796, 1060320, - 1513976, 528818, -1280974, -2195802, 1102733, 3211025, 372052, 914828, 784905, 838056, - -907312, 25233, 182536, -1289564, 873489, -1615982, 1631551, -205622, 497142, 767725, - -836982, 352724, 23622, -185757, -927713, -1100585, 682900, 762357, 306016, 146566, - 254477, -224412, 639413, 131533, 192737, 416075, 230854, -576063, -685047, -251792, - 224412, -48318, 8590, -217433, 78920, -255551, -12348, 43487, -203474, 300648, - 188979, -22549, -84826, 64425, 78383, -34897, - }, - { - 3940096, 11895449, -19366008, -4907000, 23634668, -1352915, 2108292, 4317516, -944893, -7617662, - -6273337, 13735305, 3078418, -717796, 1377611, -5188858, 112743, 2921115, -4293894, -2591476, - -5658083, 7845295, -1299765, 9401683, -332860, -1606855, 7437273, 988916, 1138166, 2704219, - 697932, -287226, 4920422, 1161252, -4379793, -1031866, 547608, -1877438, -189515, -532039, - -2623688, -448824, 1692754, -2273112, -842350, -1363652, 294205, -887448, 1160715, -58519, - 322123, -1391033, -811212, -489089, 644245, -259846, -944356, 92342, 66035, 765578, - -35970, 45097, -1235877, -842887, -952946, -681289, -149250, 324270, -903554, 872952, - 150861, -409096, -224949, 221728, 488016, -324270, -63351, -379568, 124554, -890669, - -105227, -258772, -130460, 406411, -165356, 196495, -80531, 205085, -136365, -45634, - 26844, -154619, 5906, -5906, 125091, -103079, - }, - { - 6696928, -118189984, -15247671, 39666172, -5995775, -54761, 1668595, -2787434, 486405, 3661997, - 1125281, -1079111, -353798, 1567663, 7610682, 4858682, 2009508, -5402532, -998043, -2587718, - 2472828, -1140851, -1765768, -253940, -828392, -4111358, -3172907, 2442226, -942745, 151398, - -992674, 2838974, 2871186, 3888019, 1648731, 1612223, -1843615, -2102923, 33286, -554588, - 1082332, -1651952, 1906429, 1022202, -1111323, 183610, 1920387, 913754, -2239826, -1108102, - -184147, -30602, -1965484, -374199, -960462, 782221, 1242856, -590021, 916976, -518617, - -78383, -594316, -454193, -685047, 102005, 280247, -607201, -32749, 261993, -37044, - 175557, 476741, 173946, -31139, -395674, -37044, 492311, 603443, 287763, -350040, - 357019, 341450, 272730, 117575, 301721, -181462, 23622, -33823, 6442, 60666, - -187905, 155156, -37044, 94489, -97711, -41339, - }, - { - -2039036, 5528160, 8828305, -2388002, 905701, 732829, 1125281, -2093260, 973884, -471373, - -2801393, 2653753, 4561256, -5225902, -3310346, -7174743, -15617575, -30425012, -10102837, -4033511, - 1619203, 7850664, -2675765, 7639136, -1611150, -282931, 4816269, 4490389, 2168422, -588411, - -2267743, 3013457, 3244848, 2188286, 3528853, 389768, 1269163, 4226248, -72478, -3387656, - -1569811, -810675, 1159104, 114354, -190052, -16106, -74088, -601295, 3026878, 809064, - -1866700, -1822677, 1057099, 676457, 246424, -377957, -110595, -88584, 1163936, -511638, - -1433982, -1285269, 59056, -427886, 205622, 1083406, -47782, -370441, -815507, 283468, - -610959, 532576, -81068, -132607, -115427, 66572, -32749, 304406, -88584, 56908, - 659278, 626528, -246424, 127238, -176094, 35970, 31675, 259846, 24696, -24159, - 274878, 125628, -10737, 88584, -215285, -118648, - }, - { - 10983842, -66147328, -2395518, -35261144, -1954210, -1267552, -903017, -5244155, -165356, -752693, - 8661338, 1838783, 5462662, -8405788, 970663, -558883, -2885144, 395137, 3697967, -3068754, - 8640937, 1537061, -4680441, -4551055, -1274532, -680215, -210990, -106300, -2284386, -3757560, - 930397, 1120450, 440234, 1762010, 375273, 562104, -2236604, -3106872, 806917, -277025, - -1206349, 100395, -1015223, 335007, -2626909, 930934, -776852, 69793, 444529, -1040993, - -588947, -1322850, -1024350, 755377, 744640, 1059246, -577673, -868657, -869194, -1342177, - -298500, -281857, 628676, -856309, 159451, 729071, -621697, 222801, 652835, -454730, - 556198, 877247, -762357, 821949, 887985, -515933, -417686, -99321, -110059, -289910, - -285615, 272194, 64425, 237834, 287763, -93416, 47782, 243739, -139050, -65498, - -227096, -277025, -51003, -111132, -5369, -164283, - }, - { - 393526, -2859375, -1063541, 876710, -1538672, 339839, 161061, 535260, -1737851, -1822140, - -399969, -1138703, -4046396, -5398237, -672699, -2013266, -2537789, -7529078, 6371047, -4027606, - 8855149, -5880884, 4016331, 10728828, 1146756, 860067, -2085207, 2247879, 1553704, 1595580, - -2400887, -2557116, 5041755, -1862942, -840740, -3801583, 930397, -2005213, -136902, -2689187, - 441308, 1433982, 532039, -1239635, 115427, -298500, -521302, -1219234, -746787, 634581, - -1104344, -1554241, 206158, 2089502, 431107, 200253, 1216013, -739808, -855235, 394063, - 814433, -984084, -656056, -387621, -73551, 564251, 309238, -692027, -480499, -153008, - 185757, 12885, 660351, -516470, -661425, 371515, -381715, 150861, 249108, -102542, - -413927, 632434, 202400, -215822, 30065, 176094, 388158, 32749, 156766, 54761, - -171799, -115964, -172872, 134218, -74088, 94489, - }, - { - -19211926, -12928388, 4869956, 13179107, 502511, 3748970, 1979980, -2804614, -3598109, 1236414, - 1404991, 5417028, 6812892, -2794950, 3680250, -4216048, 2706903, 791348, -988916, -2658585, - -9343164, -796716, -865973, -1743220, 1598265, 413391, 107911, 2162516, 1695438, 2530810, - -1592896, -887448, -3169686, 84826, 903554, -3310346, -24696, 124017, -129923, 1347009, - 119185, 1060320, 3248069, 965831, -1216550, 976031, 648540, 321049, 1152125, -876710, - -2076617, -56908, -2181307, -380641, 37581, 514859, -824097, 367220, -48855, 271120, - -674847, -346819, 135828, 9664, -183073, 300648, 18254, 869731, -100932, 81068, - 268435, -255014, -439697, 529892, -118112, -311922, -380641, 124554, 436476, -632434, - -13959, -314606, -213138, -479426, 380641, -600759, 57445, 359704, -17717, -185220, - -95563, -321049, -90194, 98784, -201327, 187905, - }, - { - 192200, -4382478, 6538551, -911607, 496606, 660351, 715112, 53150, 3489124, 1445793, - -2794413, -1964948, -1475321, 4034048, -1147830, 5122822, 16685948, 475668, 5508296, -5958731, - -2286533, 2789581, -153008, -2711735, 6213207, 5258114, 484258, 738198, -542240, -482110, - 539018, 3551401, -3484292, 606664, 3575024, -559420, 1641751, -1202054, 67646, -2232309, - 688805, -3170760, -1964411, 1335198, -580357, 1420024, 2697240, 828929, 824634, -110059, - 28991, -1158567, 1539209, -223875, -612033, -992674, -339302, -1042603, 493921, 1691143, - 316217, 697932, 1296543, 34360, -679142, -879931, 548682, 309775, -192200, 338229, - 872415, -616328, 558883, -500364, -596464, 324270, 112743, -66572, -34897, 78920, - 178241, 35970, -193810, -133144, 401043, 70330, 52076, -64961, 105227, 72478, - 91805, -104153, -42950, 249108, -251256, 136365, - }, - { - -15091441, -115461072, -4157528, 12757127, -5172215, -5959804, -15000173, -1353452, 3578782, -9673877, - 105764, 3761855, 7828652, -195421, 10997801, -5594732, -4866198, 3597035, -1228361, -3202972, - 1080184, 5676336, -668404, -3341485, -1341104, -601832, -670552, 667867, -610959, -1248762, - 3566434, -2312303, -368293, 4192962, 1667521, 2739116, 1937567, -1238561, 792421, -1191853, - 2709588, 194347, 252329, 1927367, -111669, -1237488, -1065689, 128312, 642098, 1755031, - -1828046, 464393, 1112933, -822486, 410706, 1740536, 922344, 1010391, 891206, -23622, - -1276142, 812286, 509491, -392990, -99858, 1097364, -158914, -130460, 331249, -657667, - 66572, 865973, 102005, 658741, 287763, -410706, -757525, 442919, -62277, -208306, - -15032, -261456, 390305, 377957, -306016, -481036, -398895, 267899, 204548, 91268, - 466004, 372588, 295279, -119722, 95026, -408559, - }, - { - -893353, -24312736, -5242545, 8710194, -2534568, -5354751, 1300838, -619012, 308164, 495532, - 1131187, -2049236, -3215857, 4843650, -7823283, 4344897, 4472672, 5608154, 1753420, 2120640, - -11692512, 3025805, 1175210, -7908109, 2819646, 1200980, -1165010, 2153926, -2571075, -3925600, - 2738042, -3359201, -3263102, -2136209, -1421097, -3012383, -1272921, -462246, -1295470, -514859, - -630823, 371515, 519154, 35970, 1090922, -421444, 234613, -183610, -348966, -1265405, - -207769, -264677, 944356, -200790, -2011655, -223875, -699006, -1238024, -1011465, -446140, - -769873, -1758252, 144418, 31675, 578210, 679142, -155693, -326954, 180926, -382252, - -285078, -145492, -339302, 316754, -153545, 503048, -571768, -88047, -141197, 227096, - 260919, 247497, -16106, 111669, -96100, -19864, 118112, -69793, 224412, 204011, - -111132, 125628, -95563, -155156, -122407, 33286, - }, - { - 4955319, 164296464, -5665599, 2938295, 273267, 9342091, 3566434, -896038, 1948841, 2456721, - -4453881, -2912525, 954557, -8555575, -1643899, 1401770, 5181878, -4707821, -2673617, 2782602, - -1931662, -4006131, 4100620, 725850, 1363115, -927176, -4659503, 2643552, -1484448, 6007049, - -3578782, -1349157, -53150, -3064996, -3219615, -2231236, 1531156, 970663, 1233193, -292058, - 93952, 1520418, 1203665, -4707821, -71404, 1290638, 390305, -1038308, 1570884, -1758789, - -1007170, 1175210, -450972, 110059, -836982, 157840, -804770, 2645700, -588411, -67109, - -936840, -1001264, -349503, -1465121, 62814, 44023, 856309, -539018, 380105, -197032, - -174483, 201327, 146029, -827855, -377957, 1336272, 252866, 120796, -662499, 49392, - -949725, -36507, 76773, 272730, -399969, -249108, -42950, 68719, 352187, -302795, - -49929, 106300, -214212, -175557, 268972, 323196, - }, - { - -1056025, 25661892, 6757058, -2187749, 5553930, 1228898, 9061844, -4456029, 732829, -569083, - -1368484, 4926328, -8971650, -20480552, -13416404, 1961726, -1729798, 3423089, -5629092, -608275, - 5779952, 4328790, 11512660, 3555159, 1939715, 393526, -2635499, -4397510, 1866163, -1073742, - 4400731, -4029216, -1700270, -5990943, 1276679, -1224603, -2602213, -1253594, 3437585, -2493229, - -2949569, 2374580, 968515, -2150705, -3946001, 224949, 2529199, 337692, 622770, 1998770, - 458488, -250719, 1673427, 583042, 1662689, 448824, -836445, -1070521, 58519, -954557, - 209380, -10737, -522375, 885300, 123480, 348429, -547071, -237834, -836982, 87510, - -532039, 1269700, -91805, -278099, -650151, -1137093, -440771, 144955, 627065, 237834, - 280784, 278099, -848256, -20401, -219580, 423054, -77846, 46708, 28454, -62814, - 24159, -27380, -84289, 368830, 26844, -2147, - }, - { - 20223390, 42061688, 4088272, 8222178, -5834713, -1497333, -4471598, -1424855, -4422206, 1872606, - -1122060, 2005213, -4230543, 9324374, -2557116, 4417374, 1393717, 3891240, 3286187, 6221797, - -1078037, -2152852, 3679176, -1461900, 3608846, 5508296, 2270427, -1446330, 2648384, 3554622, - 3282966, 4092567, 1553704, 1600949, -3804267, 1137093, -2076617, -1290638, -1722819, -796180, - -416612, -3106335, 519691, 2777233, 174483, 1413581, 742493, -2169495, 229781, -540092, - 181999, 375273, -1047435, 329102, 198105, -1223529, 492311, 530428, -77309, -1277753, - 233539, 422517, 661425, 931471, 13959, -472983, -513249, 74625, -147640, -357556, - -196495, -966368, -899796, -504122, 294205, -155156, -610959, 51540, 537, 185220, - -114890, 770947, 178778, -5369, 408559, -94489, 26307, -37044, 311385, 253403, - -52076, -161598, -238371, -88047, -31139, -31675, - }, - { - -2408940, 13359496, 2259153, -1200443, 576063, -2255395, 5751498, -482110, -2885681, -3529390, - -245887, -1456531, -3375844, -14772540, -13414257, -3621731, -2210298, 1931125, 2232846, 4102231, - 634581, 4616553, 4027069, -4592394, 196495, 310848, 1720671, -340913, -8418673, -770410, - 4319127, 2502355, 609885, 1457605, 1217086, 1605244, -1564442, 2671470, 20938, -1733019, - -2122788, -1576790, -1797981, 558883, -2289218, 797253, -755377, 623844, 2525978, -922881, - -31139, 936303, 1856500, 1872069, 842350, 607201, -338229, -221728, -462246, -434329, - 1656247, -249108, -976031, -455803, 741419, -640487, 1051193, 159988, 712428, 162672, - -616328, -321049, -361851, 198642, -70867, 122407, -127775, -86973, -420370, -11811, - 186294, 177704, 356482, -62814, -499290, 44023, 183610, -194884, 417686, 121333, - -19864, 162672, 1074, 259846, 269509, 275952, - }, - }, - { - { - -5731634, 173194016, -66737888, 23475218, 7413114, -4203163, 898722, 4907000, -7759932, 3169149, - -861678, -3298535, -2282238, 2469606, 6833830, 869731, 7153268, 1298154, -9888088, 964220, - -5922223, 4726075, -2376191, 5148592, -675384, -5061619, 2130304, -1347546, -1529545, -970126, - -1000191, 621160, 3004330, 197569, -1036698, -3965329, 3389803, 1879585, -1142461, -924492, - 45097, -853088, 1916629, -846645, 1869385, 2345589, 1576253, -396211, -1335198, 1352378, - -1502165, -242666, -1458141, 1506997, -574452, 936303, -680215, 111669, -6979, 632971, - -144955, 683974, 672699, -1159104, 13959, -1117765, 277562, 738734, -972273, 417149, - 164283, -219043, 56371, -499290, -506269, -610959, 700080, -361851, -441308, -135291, - -139050, -112743, -289373, -161061, 108985, 406411, -201327, -252329, 145492, -26844, - 160524, 273267, -210453, 49392, 257698, -130460, - }, - { - 1758789, -50797652, 5105643, 12222940, 3994320, 2979097, -1425929, 2616172, -2215666, -2966212, - 1557463, 3741454, -2524904, 1134408, -4138201, -6380711, -1343251, -4379256, -4866198, 4955319, - -26307, -3364033, -2016487, -6521371, 2118493, -8704825, -6908455, 1510218, -3876208, 6266358, - -1402844, 859530, -1918240, 88047, 1225676, 3637837, -1059783, -20401, -1866163, -228170, - 27380, 3388729, -1802276, -663036, 139050, 3201898, 1379758, -372052, 2622078, -282394, - -1821066, 410706, -438624, -213675, -682363, -850404, 904628, -183610, 37581, 522375, - -166430, 471373, 724239, -658204, -620623, -61203, 718870, 104153, -253403, 693637, - -513785, 156766, 282394, 225486, 403727, 13422, -323733, 498216, -1081258, 41876, - 68719, -17717, -114890, 317828, 8053, -165893, 3221, -54224, -205085, 279710, - 226023, -220117, 99321, 72478, 205085, -199179, - }, - { - -1764158, -32673964, 22291954, 21601002, -2776160, -133144, 3629784, 1468342, 120796, 469762, - -7156490, 8207146, 3329137, 459025, -6583648, 193810, -273267, 7078643, -10987600, -333934, - -2956011, 4308926, 2921115, 2217277, -4592394, 13677323, 234076, 3316252, -4862977, 6021544, - 275952, -1292785, 5879274, -3064996, -3622268, 1673964, -113280, -2659659, -278099, -1401233, - -739808, 319975, -1829119, 84826, 304943, -1527935, -843424, -633508, 1233193, -1330903, - 62814, 438087, -954557, 454730, -593779, -545461, -245887, 934155, 107374, -508417, - 304943, 136902, -1270774, -845035, -802622, -970663, 367757, -957778, 137439, 745177, - -48318, 270583, -302795, -214748, 773631, -137439, -96100, -284005, -396211, -734976, - 295816, -265751, -234613, 354335, 215285, 59593, 89657, -36507, 44560, 225486, - -276489, 23085, 61203, -187368, 44023, 9664, - }, - { - -25255482, -121609312, 21619792, 26099442, 3593814, 2276333, -1959579, 564251, -754841, 1961190, - -897648, 4000225, 1233729, -7826504, 11485816, 6084358, 1023813, -1651415, -5793911, 79994, - -697395, 1490354, -2669322, 2624225, -50466, -4189204, -2138357, 1592896, -1157494, 2013803, - -873489, 3593277, 5086852, 172336, 2159295, 1368484, -2450279, -2512019, 61740, -313533, - 173409, -176094, 1867237, 724776, -1449015, 322123, 382252, 2147484, -1853278, -554051, - -1210644, -796180, -1148367, -397284, -476741, 1573569, 1260573, -1817845, 1534377, -903554, - 198642, -144955, -1226750, 408022, -528281, -28991, -133681, 373125, -64425, 332860, - 211527, 175020, 366683, -85362, -635118, 405874, 244813, 235149, 700080, -153545, - 601832, 244813, 169114, 70867, 105227, -59593, -130997, 89121, -122407, 186831, - -97711, 293132, -126165, -105227, 88047, 6979, - }, - { - 1569811, 26112328, -13079249, 87510, 524523, 354872, 2379949, -3201898, -900869, -959388, - -2221572, 1968169, 8937290, 186294, -23082228, 2452426, -16400333, -9677635, -26918708, -365609, - 4919348, 1658394, 954020, 6082748, -3404835, 2736431, 4684199, 5936719, 2702071, -5120138, - 3051574, 4212289, 4042638, 122943, 4132296, 23085, 1207960, 3396782, -604517, -2218888, - -605590, 57445, 803696, 632434, -1432909, 462783, 1452773, 576599, 925565, 1311039, - -2906619, -1286880, 1436130, 608275, 52613, -299037, -334471, 335544, 1271847, -528818, - -2859375, 228170, -1128503, -190589, 856846, 786516, -34897, -55298, -538482, -391379, - -188979, 93416, -5369, 427886, -799401, -89657, 342524, 213138, 48318, 475668, - 250719, 855772, -332323, -78383, -126702, 268435, -231391, 301721, 149250, 125091, - 306553, -96100, 296890, -99321, -165893, 173409, - }, - { - -34601332, -39729520, 15455440, -23793046, -3147674, -2797634, 1563368, -6058588, 1581085, 3035468, - 3628711, 2893197, 1059783, -7662222, 1596117, -2032593, -4911832, 6915971, 1823751, -1541356, - 7877507, 185757, -844498, -7119982, 216896, -832687, -1282585, -1052267, -2046015, -2949569, - -260919, -1631551, -36507, 4326643, 1075352, 254477, -1316944, -5688684, -1449015, 1735167, - 1151051, -1093069, -1032940, 1588601, -4635881, -34360, 1802813, -204011, -674310, 1709934, - -1183800, -2141578, 191126, 867583, -627065, 1604170, -146566, -303332, -1753420, -1874216, - -289373, -67109, -66035, 6442, 508954, 931471, -573378, -323733, 525597, -127238, - 574989, 93952, 536871, 312459, 992674, -350577, -279710, -321049, -280247, -842887, - 289910, 13959, 121870, 146566, 256624, 161061, 46708, 267362, -85899, -427886, - 90194, -419833, -285078, -83215, 168041, -159451, - }, - { - -659278, -5666673, 3428458, 216896, -588947, 336618, 128312, -1149441, -448824, -655519, - -891743, -2214593, -7548942, 1819456, -3032247, -5430986, -5417565, -2115272, 678605, 11006927, - -406948, 1991791, -3009698, 16986596, -5243618, 2277407, 2191507, -5616207, 4638565, -295279, - 629750, -1234266, -3071439, 3812857, -4649302, -947040, -667331, -2187212, 288300, -1851131, - -1504312, 1730335, -503048, 382252, -373125, -560493, -1351841, -336081, -904628, -335544, - -2359011, 136902, 459025, 1221918, 242129, 588947, 1734630, -583042, 600222, -424128, - 711891, -744640, -565862, -82141, -330176, 675921, 616865, -691490, -783295, -530428, - 554588, 339302, 37581, -90731, -216359, 324270, -184684, 68183, 35433, 15032, - 275952, 3758, -162135, 39192, -61203, 417686, 139586, 289373, -25233, -111132, - 2684, -68183, -408022, 87510, 46708, -106837, - }, - { - 34171832, -46002856, -20896626, 10390600, -658204, 2024003, -2156074, -515933, -5099200, 4606353, - 6158446, -173946, 6816650, 13089450, -14545444, 3055332, -3565360, 3295314, -1516660, -3311420, - -4741107, -3583077, -443455, -578747, 867047, -2467459, 1936493, 635118, 5294084, -2402497, - -1286880, 2065879, -220654, -1598802, -28991, -244813, -3757023, 2332704, -1762010, 1116155, - -1209033, 3374234, 1370632, 1245004, -1996623, 1940788, 1144609, -1906429, 2961917, 1305670, - -2419140, -51003, -2232309, -594853, -615791, 1234803, -8053, -1057099, 446140, 557272, - -1227824, 211527, 361314, -125628, -469762, 326954, 724239, -41876, 426812, 263604, - 251256, -476741, 205622, 137976, 59593, -523449, 69256, 51003, 60666, 36507, - -55835, -61740, -242666, -770410, -22012, -39728, -333397, 427886, 17180, -219043, - -90194, -445066, -24696, 166430, -91805, 26307, - }, - { - -740345, 3739306, 1888175, -780073, -677531, -133681, 1685775, 1003412, 2843805, -1021129, - -3207267, -3532611, 4220342, 10417980, -14072997, 7174743, 1753420, 13414793, 4046933, -5883569, - 2955474, -3625489, 4346507, 314606, -3129958, 6097243, 5536750, 5658620, -1964948, -4303021, - 8006356, -9041443, 4138738, 920734, -1656784, 1806571, 2683818, -2244121, -1563368, 166967, - -630286, -3655017, -1254667, 1648194, -325881, 1702955, 1703491, 131533, 2352032, -176631, - -157840, -1280437, 1163399, 554051, -256624, -2072859, 322659, 331249, -168577, 477278, - 330176, 823023, 999654, -192737, -865973, -406948, -33286, 135828, 406948, 632971, - 186831, -434329, 478352, -5369, 181462, -233539, 441845, -456877, 353261, -202937, - 603980, -248034, -361314, -31675, 485868, -13959, -112206, 269509, 103616, 18254, - 11811, 86436, -33286, 84289, 537, -67646, - }, - { - 15060840, -88888104, -62315144, 5779952, 20624970, 1444183, -28020366, -4794257, 19327, -3133179, - -2437394, 1992328, 8738648, 4880694, 6060199, -3456912, -3545496, -1367410, 1930051, -1361505, - -198642, 3004867, 309238, 118648, -671089, -6436009, 2069637, -1865626, 3767760, -6048925, - 4641786, 1792612, -2629057, 5151277, -173946, 704912, 125091, 1270237, 1529545, 2841121, - -3311957, 2520072, 1180579, 136365, 25770, -464393, -595390, 2251637, -1870458, 758599, - -828929, 1527935, 781684, -236760, 655519, 1129040, 1045825, 536871, 1054415, -731755, - 445066, -623844, 1364189, -741956, 668941, -374736, 354872, 13422, -357019, -191663, - 19864, 887448, 260919, 565862, 186294, -722628, -150861, -1074, -154619, 57982, - -516470, 308701, 252329, 421444, -477278, -214212, -206695, 408559, -117575, 659814, - -40265, 540092, 186294, -177167, -69793, 8053, - }, - { - 1016297, -7062000, -16575353, -1481764, 2877091, -3246995, -236223, -3861176, 1836635, -408559, - 2110440, -4559108, 2281702, -723702, -2714419, 1089311, 1107565, 9306657, 4792110, -3142306, - -9241159, 2022393, 6382859, -3385508, -342524, 5741835, -7420093, 5553393, -6274411, -892816, - 332323, -951872, -1744831, -2937758, -3375844, -1672890, -1228361, 45097, -1118302, -3132105, - 243739, 193810, 1551020, 169114, 359167, -657667, 1085553, -224412, -338229, -853088, - -1440962, 875636, 370978, 19327, -2185602, 592169, -1527398, -845035, -518617, -1168231, - 418759, -1716376, -361851, 679679, 118648, 236223, -195958, 125091, 76773, -865973, - 143881, -489089, -9127, 53150, 225486, -17717, -269509, -355409, 199179, -307090, - 432181, 94489, 186831, 12885, -89121, 52076, -23085, 15569, 356482, -21475, - 146029, -55835, -68719, -10737, -56371, 19864, - }, - { - 20788716, 150155280, -8466991, 635655, 888521, 5658083, -2111513, 5981279, -1583232, -1266479, - -1818919, -2646774, -152471, -5979668, -4303021, 5484673, 4763119, -138513, 1364189, -1607928, - -1722282, -2732673, 288300, 6250251, -5869610, 2545842, -2134599, -1813550, 2356863, 4224637, - -1063004, -2017561, -2302639, -1486596, -2880313, -4377646, 2838437, 311385, 1555315, -1509681, - 2414309, -1286343, -1018981, 816581, -1589138, 1409823, -431107, 123480, 1305133, 23622, - -1701881, -118112, 1417339, -938987, -1098438, 1088774, 298500, 947577, -173409, -960999, - -1141388, 416075, -1442035, -1154273, -48318, -134218, 518617, 73014, -513249, 251792, - -244813, 26307, 549219, -1138703, -12885, 753767, 985158, -528818, -249108, -119185, - -649614, -78920, 121870, 185220, -271657, -90194, -418222, 414464, -28454, -234076, - 61740, 55835, 59593, -176094, 144418, 253403, - }, - { - 685584, 28858422, 4849018, -32749, -734976, 4680978, 3457986, 1983201, -1542430, -1937030, - 4405563, -1702955, 4471598, -46134928, -3054259, 2786360, 1182727, -892279, -2383707, -1996086, - -664646, 11853036, 16156593, 2292439, -6379637, 6045704, -5812165, -406411, -3608310, 9409200, - -1777043, -501437, -3612068, -4176319, 1646583, -4039417, -27917, -1738388, 666257, -1232656, - -1515587, 1676648, 850404, -3821984, -1503239, 134218, 2509872, 1249836, -1393717, -270046, - 2927557, 1394254, 1209570, 958315, 1993939, -624918, -321586, -1652489, -33823, -830539, - -715112, 947577, -129386, -525060, 1140314, -576063, 303869, -1599875, 559420, -516470, - 117575, 308164, 242666, -176094, -933619, -359704, -402653, 25770, 805843, 102542, - 382789, -121333, -768262, -347892, -139050, 166430, 116501, 22012, -3758, -138513, - -192737, -59593, 217433, 135828, 16106, 331249, - }, - { - -7481296, 76884744, 10439992, -2356863, -5539971, 6956774, -11840688, -3287798, -1374390, 3808562, - 734976, 621697, -2776160, -12652437, 31122406, 5059472, -5135707, 1957431, 3642132, 7524783, - -1524177, 2148558, -2197413, 2838437, 4391067, 5021891, -1170379, 3438121, 75699, 5613523, - 2658585, 1858110, 2943126, -1400159, -1210644, 794032, -2284923, -3066607, -884226, -1263257, - 2103460, -2247879, -2257542, 1513439, 2506114, 20938, -1087164, -2003602, 420907, 1243930, - -913754, 1750736, -485868, 1121523, -1001264, -1516660, 139050, -53150, 10737, -144955, - -844498, 1029718, 282394, 74088, 309238, -235149, -574989, 340376, -281320, -554051, - -484794, -814970, -443455, -574989, -176631, -231391, -429497, 105764, 227633, -237834, - 127238, 180389, 43487, 238371, 256624, 54224, 41339, 38655, 224412, 104690, - 92342, -70867, -300648, -164283, 28454, -49392, - }, - { - 2362232, 13932337, -3485903, -3018288, -795106, 986769, 3811784, 1068373, -2475512, -5032628, - -3204046, 413927, -1458678, 2729452, -40387188, -1683627, -660888, 4127464, -1613297, 7686381, - -3092377, 8005819, -4894652, 32749, 402116, -1500554, 3842385, -3310346, -6073621, -140123, - 1135482, 1714766, 4099546, 1799591, -1642825, 486405, 541166, 1170916, -1214939, -1342177, - -944893, -988916, -653372, -2534031, -679142, 41876, -554051, 1248225, 1285269, -612033, - -95026, 1973538, 2061047, 2533494, 207769, -221191, -31675, -926102, -606127, 800475, - 1375463, 77309, -1264331, -802622, 270046, 350577, 1005559, -26844, 1007707, -1023813, - -57982, 316754, -266288, -246424, 325881, -155156, -390842, -229244, -62277, 84826, - 343061, -112743, 257161, -193810, -122943, -291521, 143345, 173946, 282931, 44560, - 259309, -155693, 226023, 181462, 227096, -62277, - }, - }, - { - { - 5740761, 224000800, -45141716, 6156836, -9006546, -3108483, -406411, -950798, -7930120, 7232725, - -1203665, 1331440, 782221, -1609002, 9502078, 1482301, 4178466, 7600482, -7004555, -2921115, - -2052994, 8249559, -4151086, 2443837, 934692, -1596654, 5219459, -954020, 331786, 349503, - 1585917, 2350958, -390305, -2038499, 1299765, -1590749, 4615479, 892279, -3540664, 188442, - 217970, -1424319, 418759, -122943, 498216, -404264, 1166621, 53687, -2022393, 847719, - -2418604, -550830, -360777, 2880849, -289910, -472446, -256087, 1437740, 815507, 747861, - -67109, 885300, 544387, -932545, 1243393, 254477, 317291, 309775, -1085553, 399432, - 446140, -200790, 170188, -87510, -236760, 36507, 1289564, 193274, 41876, -117038, - -58519, 399432, 437550, -1611, -107911, 495532, -159451, 11274, 577136, 245887, - -48855, -17717, -301185, -226023, 70330, -67109, - }, - { - -226560, -29983704, 17002702, 6843494, -2934537, -540092, -2326262, 3915937, -1472637, -946503, - 2327872, 2005750, -6077916, 329639, -2496450, -4908611, 2156074, -1787780, -4284230, 5173288, - 3189013, 5955509, 11121281, -587337, 3953518, -9265318, -8363375, 3507378, -2872260, 1129576, - 1017907, 6367826, -1851131, -1039382, 105764, 3047816, -478889, -1423782, -3076807, -1392643, - -2142115, 4890357, 477278, -268972, -979789, -210453, -690953, -1774358, 923955, -1166621, - -1854352, 379568, -533113, -357556, -1549946, -340913, 299574, -201863, 66572, -173409, - -431644, 235686, 814970, 103079, 203474, 550293, 756451, 157303, -599148, -34360, - -1245541, -493384, -122943, -348429, -233539, -246424, -277562, 769873, -89657, 460635, - -156229, -119185, 53150, 256624, 25770, -48855, -191126, 155156, 53687, 133144, - 194347, -350040, -37581, 26307, 142271, -140660, - }, - { - -466541, -99884296, -28919088, 20478940, -3298535, 2298881, 1554778, -1778117, 1610076, -732292, - -9458592, 7583302, 1367947, -1431835, -5924371, 1968706, -2558190, 5136244, -9268003, 5131412, - 375810, 3036005, 899259, -3236258, -5553393, 13244605, -6419903, -1614371, -5704254, 6161668, - 1751810, 2248416, 4804458, -4114042, 1233729, 3926137, -39192, -1403917, 2001992, 3755412, - -23622, 848256, -408559, 590021, 281857, -2039573, 5906, -324807, 44560, -2170032, - 821413, 599148, -1743757, -387084, -794569, -586800, -990527, 310848, 255014, -812823, - -79994, 926639, -423054, -1073742, -475668, -1076963, 433792, -1089311, -202400, 140660, - -297963, 189515, -96100, -24159, 645319, -146029, 194884, 175557, -374736, -300111, - 804233, 149250, -278636, 100932, 148176, -92342, 180389, 177167, 85899, 187905, - -34897, 340913, 230854, -232465, 62814, 55835, - }, - { - 38179040, -66944044, -3221762, 19674172, -1335735, 1703491, -2964064, 1283122, -1652489, -1187559, - -4427038, -393526, 2789581, -4546760, 8196945, 2132451, -1156420, -2640868, -2210835, 1242319, - -1747515, 3082176, -767725, 3251290, 3040837, 1189169, -703301, 1072668, 558346, 802622, - 37581, 2152852, 1552094, -2432025, -2771328, -1179505, -1395328, -2828236, -1150514, -1124208, - 526134, 682900, 326418, -1495722, -1660542, -467615, -624381, 1824824, -293668, 1407676, - -741956, -444529, 346282, 199716, -572841, 924492, -365609, -1817845, 1184337, -1331977, - -42950, 690416, -93416, 1125818, -479963, -147640, -176631, -226023, 99858, 666257, - -6442, 35433, 639413, 204011, -612033, 181462, 41339, 48318, 596464, -123480, - 68183, -53687, 9664, -110059, -149250, 33823, -35970, 136902, -12885, 107374, - 41339, 289373, -31139, -31139, 78920, 159451, - }, - { - -925565, 38784092, -1083942, 1078574, 305480, -45634, 1400159, -2044941, -261993, -185757, - 1974074, 2687576, 5650567, -5155035, -19506668, 20885352, 3217468, 21991306, -938987, 7310571, - 4761508, 2908230, 1481227, 5789079, -639413, 1674500, -1593970, -3034931, -858993, -6620155, - 4555350, 1601486, 3932043, 16643, 1224066, -528818, -1911797, -2207613, 1310502, 491774, - -326418, 602369, 974958, 592169, -1268089, -1064615, 1688996, 666257, -382789, 966905, - -2200634, -492848, 897111, -479963, -799938, -444529, -1651952, -752156, 520765, -421981, - -1915555, 391916, -1458678, -108448, 180389, -610959, -134218, 775242, -182536, -549219, - -281320, -14496, 299574, 524523, -959925, -460635, 130460, 490700, -85899, -146029, - -391916, 490163, -179852, -22549, -290447, 421444, -106300, 71404, 179852, 103079, - 111132, -235686, 197569, -44023, 26307, 286152, - }, - { - 49469972, 27491548, -14863808, -10915659, 1762547, -92342, 2036351, -7274601, 1412507, -2312303, - -4507568, -1108102, -1308354, -2004676, 3601330, -938987, -2513093, 6685117, 1151588, -638876, - 3938485, -2166811, 861141, -2129230, 4141422, 1080721, 1851668, -1142998, -3655017, -3673808, - -1560147, 1321239, 3138547, 969589, -67646, 1171989, 492848, -3787088, -2052994, 1281511, - 1301912, -1520418, -1010391, 1250372, -2595234, 1398549, 3003256, 849867, -70867, 1971390, - -1885491, -1293322, 723165, 745177, -1266479, 395674, -113817, 566399, 278099, 301721, - -37044, -495532, -237297, -74625, -44560, 564251, -343597, -600222, 263604, -515396, - -159451, -277025, 651224, -90731, 309775, -487479, 52613, 481573, 72478, -932545, - 325344, -214748, 129923, 200253, 157303, 56908, -74625, 246961, -177704, -62814, - 446140, -187905, -56371, 81068, 306553, -2684, - }, - { - -37044, -7300908, -583579, -813896, -854162, 56371, 80531, -1908576, -457414, 559956, - -1781338, -3666828, -3459059, 6711960, -1334661, -151934, -834297, 3046206, -980863, 8741332, - -636729, -1501091, -4069482, 18478560, -5972689, 2352032, 2881386, -6488622, 6305012, 1273995, - 1525250, 665183, -6150393, 4597226, -2503966, -3168612, -1132798, 30065, 3510599, 494458, - -939524, 1016297, -1630477, 182536, 69256, -710817, -1523103, 220117, 2147, 581431, - -2013266, 750546, -281320, -303332, 94489, 501437, 731755, -1118302, 2348273, 516470, - 1810329, 935229, 460098, 219043, 180389, 735513, 490163, -586263, -1034550, -260382, - 809601, 187368, -11274, 831076, 726923, 227633, -129386, -31675, -387084, -18790, - 375810, -22549, -106300, 234613, 53150, 138513, -289373, 159988, -130460, -190589, - 35970, 90731, -264677, -191126, -91805, -27380, - }, - { - -40378600, -90514288, 20464982, 9139154, 642098, -331786, -4663798, 2465311, -2725157, 1118302, - 3147674, -5601174, 4070019, 10812043, -22694608, -450972, -5120675, 2187212, 1391569, 3528316, - 362925, -4928475, -2405719, 1662152, 1686312, -2125472, 577136, -984621, 4817880, -3157338, - -90731, 4831302, 2695629, -2422362, -1942399, -808528, -1695438, 3198140, -5098663, -1272384, - -1280974, 2630131, 64961, -566936, -955093, 1352378, -23085, -1153199, 4124242, 2384244, - -1086090, -1057099, -1020592, 974958, -147640, 2479807, 388695, -394600, 170188, -144418, - -794569, 81068, -87510, -315680, -147103, 524523, 377957, -232465, 475131, 49929, - -136365, -217433, 454193, 197569, 187368, -390842, 199716, -81604, 183073, 535260, - 264677, 205622, 202937, -193810, -149250, 49392, -206158, 192737, 27380, -10201, - 70867, -355409, 39192, 205622, -78920, -265214, - }, - { - -288837, 2590402, -4934381, -1149441, -634045, -398895, 7516, -3046206, -942745, -254477, - -2471754, -2385318, 2352032, 4191351, -17324824, 6519761, -11471858, 6225555, 4439386, -8470749, - 2355790, -4530654, 5054103, 936840, -6328635, 6489159, 1493575, -35970, 983011, -3459059, - 4915053, -8608188, 4758287, -138513, -2922188, -697932, 3117073, -61203, -102542, -28991, - -2064269, -2373506, -6979, 991601, 82678, 1133335, -12348, -2253247, 1739999, 1192390, - -506806, -419296, 1229434, -683974, -241055, -262530, 366146, 923955, 320512, -1496259, - -1675037, 370441, 825171, -429497, -53687, 548682, 264141, 503585, 669478, 497679, - 143881, -524523, 234613, 183610, 376883, -375810, 136365, -620623, 453656, 24159, - 350040, -192200, 230318, 83752, 108448, -248571, -141197, -71941, -226560, 24696, - -22012, 9127, 92879, 129923, 161061, 53150, - }, - { - -15652471, -33052458, 16859358, -918049, 7642358, 4522064, -7353521, 2106145, -1183264, -4274566, - 112206, 154619, -1369558, -2267743, -2776160, -6001143, -154082, -5697274, 3783329, 2795487, - -4713190, -3904662, 35433, 876710, 3066607, -1032403, 4752918, -2729989, 2467459, -5049271, - 2921652, 1518808, -1301375, 2624762, -2810519, -3922379, -3478924, -1198833, 1837172, 5023501, - -4021163, 3090229, 551903, -249108, -1316408, -2910377, -1559073, 2261300, -1952600, -987843, - -1800128, -343597, -79994, 541166, 956167, -472983, 6442, 856309, 346282, -1051193, - 1350767, -1480690, 1506997, -337692, -700080, -192200, 1257352, -280784, -19864, 27380, - -243203, 937914, -91805, -376347, 30065, -7516, 548145, 51003, -188442, 27917, - -386547, 248034, 231928, 222801, -142271, -54761, -207769, 265751, -147640, 621160, - -133681, 202937, -153545, -124554, 205085, 227096, - }, - { - -869194, 10977936, 2646774, 79457, 3045669, -631360, 1405528, -1050120, 1630477, -1707786, - 2296734, -2359548, 3651796, -2985539, -3723737, -687195, -4658966, 3257196, 3323768, 3383361, - 2805688, 4104378, 8742943, 2738579, 2168422, 4823785, -5288716, 9553618, -1956358, 1750199, - -1114544, 3427921, 1848447, -427886, 805306, 1008780, 1802813, 805843, 867047, 128849, - 558346, -1328219, -23622, -884763, 181462, -725313, 1452236, -163209, 587874, 148713, - -887985, 413927, -734976, 1068373, 333397, 1290638, -1327145, 523986, 931471, 137439, - 1661079, -959925, 153545, 737661, -120259, -316754, -113817, 55835, -141197, -587874, - 24159, -744640, -52076, -257161, -73551, -247497, 57982, -248034, 412317, -178778, - 198642, -253940, -28454, 74088, 212064, 209917, 39192, -91268, 160524, -84289, - 53150, -60666, -20401, 59593, 34360, -25770, - }, - { - -33187212, 85803248, -1764158, -4618701, 1343251, 4103305, -4148402, 4315906, 2531346, 3816079, - -386547, 2513630, 6418292, 7199439, -537, 2667175, 4675072, 1170916, 3115462, -2221035, - 5821828, 577673, -1850057, 7851200, -1742683, 850940, -2762738, -2486786, 5906, 1711545, - 172872, -619549, -5369, 2241436, 751619, -2072322, 3014530, -919123, 1074, -2338073, - 1606855, -1457605, 1108102, 4163971, -955630, 898722, -1126892, 103079, 1136019, 338229, - -1126892, -1199907, 404264, -1075889, 193274, 750009, -145492, 401579, -755914, -1316408, - -738734, 1041530, -884763, -72478, 236760, -293132, 228170, 198642, -89657, 92342, - -718333, -211527, 487479, -450435, 129923, -345208, 367220, -621697, 145492, 436476, - 120796, 112743, -266288, 72478, -47245, -112743, -358630, 287763, 91805, 52076, - -136902, -115964, 86973, -100932, -38118, 55835, - }, - { - -125628, 18733036, -535260, 724776, -1314797, 2528662, -3256659, 405874, -785979, -1382443, - 3365107, -1342714, 12600360, -33557116, 3435437, 3084324, 2615098, -353798, -3149285, -9936944, - -3107409, 16138876, 679142, -4328254, -352724, 6805913, -4082903, 3321620, -1891396, 9436580, - -994285, 2272575, 88047, 1059246, 2301566, -4195646, 1611150, -3062849, -1763084, -884763, - -1094680, 923955, 1969779, -1747515, 172336, -546535, 1762010, 1212255, -2489471, -2303713, - 1656784, -43487, -439160, -128849, 1208496, -284542, 857383, -65498, 350577, -387084, - -375810, 936840, -492311, -1183800, 432181, -1126892, 490163, -880468, 1641214, 98784, - -15569, -488553, -41876, 142808, -297427, 57445, -81604, 151934, 468688, -272194, - 171262, -104153, -165893, 1074, -83215, -134755, -263067, -579284, -368293, -67109, - -146566, 44560, 171262, -141197, -17180, 289910, - }, - { - -7602629, 69839928, 642635, -2857227, -864362, 10041634, -6270653, 5708549, 5075578, 412854, - 1668595, 3631395, -1825898, 340376, 45916420, 47782, -9555765, -2456721, -3186866, 2698313, - -2172717, 1181653, -1522566, 3026341, 824097, 2902861, -3760781, 4099546, -333397, 1609002, - 907312, 1499481, 2860448, -553514, 860067, 703838, -1704565, -398895, 2605435, 136365, - 1540283, -333397, -2396055, -1280974, 2231236, 459025, -249645, -865436, -51003, 2316598, - -1473174, 1887101, 1646046, 3644817, 108985, -839129, 698469, 101469, 189515, 680752, - -579284, 194884, -761820, -311922, 803159, 161598, -103079, 506269, 58519, -434329, - 605590, -403190, -352187, -441845, -175557, 301185, 322123, 366146, 228707, -105764, - -68719, -274341, -210990, 122407, 57445, -234076, 134755, -85899, -129923, -253403, - -179315, -74625, -157840, -210990, -4832, 201863, - }, - { - -1702418, 7620883, -2809446, -2696166, -619012, 991064, 1111323, 293132, 2483028, -2131378, - -738198, 1870995, 539018, 23002234, -15164993, -4782446, -6713571, 3544422, -258772, 5595806, - -8212515, 362388, -5704791, 3219615, 4766877, -2265595, -3389803, -2990908, -324807, 3199751, - 2580739, 1034013, -1001801, -708133, -2692945, 14496, -762894, -1935420, -1069984, 625455, - -1074, 254477, 1498407, -2126546, 216359, 1337882, 303332, -92879, 257161, -234613, - 38655, 936840, 400506, 915902, -1022202, -551903, -493921, -724239, 212064, 81068, - -440771, 622770, 376883, -823560, -354335, -263067, 464393, 376883, 857383, -630823, - 795106, 296890, -264677, 129386, 896038, -42950, -99858, -18254, -178241, -40802, - 132607, -484794, -19864, 62814, 255014, -169114, -103079, -37581, -70867, -67646, - 155693, -344134, 221728, -122407, -249645, -200790, - }, - }, - { - { - -7170448, 169747312, 36805184, -10990284, -2754148, -300648, -2362769, -1342177, -2161442, 5435818, - -671089, -770947, 2246268, 922881, -2027225, 12424804, -3206730, 4526896, 3492882, -7642895, - 4697621, 1411971, 2678449, -7466264, 4023311, 1996086, 2547989, -1336809, -108985, 525597, - 4196183, 10737, -3794067, -1664837, 2822331, 679142, 1952600, -377420, -1328219, -694711, - 2007897, 1390496, -3707631, 1811939, -744640, 177704, 514322, 785442, -1698660, -845572, - -814970, -874563, 422517, 826244, 1209570, -1003949, -111669, 1570347, 1850594, -489626, - 565325, 874026, 17717, 148176, 595390, 261456, 227096, -49392, -128849, -317291, - 466541, 51003, -165893, 84826, -358093, 863825, 776315, 645856, -214212, -128312, - -114890, 62814, 695248, -12348, 32212, 101469, -7516, 249645, 259846, 281857, - 22012, -356482, -6979, -195958, -63888, 14496, - }, - { - -479426, 26133802, -21820044, 1069984, -2525441, -1173063, -1103270, 2020782, -272730, 661962, - 3648575, 2147, -2359548, 563178, -6131603, -5369, -404264, -6899328, 10180146, -1830730, - 4326643, 10772315, 4228396, -1459752, 1553704, -1785096, -5107253, 1876901, -3604551, -3688840, - 3097745, 6679211, -1335198, -1369021, -2222646, 422517, 841277, -681826, -2511482, -35433, - -1761474, 3019899, 943282, 1302449, -1927367, -2877628, 146029, 510027, -741419, -1305133, - -781684, -103079, -135828, -927713, -1365263, 500364, -863825, 862752, 711354, -690953, - -1154273, 664646, 121333, 713501, -263604, 584116, 292058, 637803, -411780, -362925, - -980326, -721555, -127775, -77846, -751619, -8053, 392990, -82141, 548145, 88584, - -103079, -37581, 226560, -252866, 184147, -30065, -559956, 188442, 229781, 52076, - 249645, -140660, -312459, 147103, -122407, 110595, - }, - { - 1555315, -145632672, 4447976, 9782325, 4372277, 2695629, -1096290, 376883, 388158, 391379, - -4379256, -790274, 4575751, -2224793, 4992363, -5060009, -3026878, -81604, -4099546, 1797981, - 7191386, -3513820, -2774012, -2258079, -1784022, 4697621, -5454609, -2872260, -370978, 3516505, - 1487669, 6545530, -194347, -2652679, 5395553, 2317135, 902480, -106837, 375273, 3925600, - 256624, -724776, 909459, 1308354, -1351304, -1457068, -319975, 221191, -676457, -556735, - 617938, -598611, -595390, -732292, -629213, 21475, -1553168, -1040993, 828929, -104690, - -544387, 418759, 253940, -998043, -452045, -740882, 306016, -1040993, 38655, -72478, - -305480, -180389, 32749, 495532, 403190, -27380, -350577, 503048, -529892, -227633, - 537408, 336081, -177167, -70867, 295816, -146566, -122407, 155156, 27917, 202400, - 158377, 403727, 188979, -41876, -35433, -63888, - }, - { - -40146132, 27867358, 3850438, 18485540, 689342, -1865626, 631897, 2553358, -527207, -3870303, - -3291556, -2800856, 2261300, -2763275, 8297877, 1622424, -568009, 205622, -2375117, -537945, - -677531, -69256, 934692, 1292785, 3393561, 762357, -300648, -301721, 657130, -2233383, - 2263448, 1449015, 1101122, -1229434, -2217277, -2882997, -1286343, -2306934, -1359894, -849330, - 366683, 512712, 64961, -2181307, -1702955, -290984, 197569, 996432, 118648, 522912, - 323196, 926102, -1159641, 128312, 187368, -444529, -20938, -753767, -797790, 806917, - -1058710, -149250, 634045, 1130113, -491237, -276489, -149787, -271657, 561567, 270046, - 63351, -2684, 436476, 258772, -557809, 73551, -259309, 346819, 41339, 199716, - -223875, -240518, 38118, 135828, -237297, 77846, 102005, 44023, 62277, 46171, - 118648, 97711, -46708, 88584, -60666, 214748, - }, - { - 432181, 37153076, 1115618, 958315, -1151588, 1379758, -80531, -684510, -919660, 1021129, - -967441, 5508833, 1089848, 2939368, -11403675, 5345087, 894964, 8935143, 28469190, 5132486, - 10732050, -3081639, -229781, 7269232, 3127810, -2415382, -922344, -6809671, -1596654, -2975339, - 1402844, 1668058, -223875, 4855461, -461172, -2241436, 1010928, -3270618, 19864, -208843, - 349503, -25770, 952946, -682900, 655519, -978179, 863825, 180926, 85899, -574989, - -82678, 982474, -836445, -690416, -1031866, 723702, -2272038, -1280974, -321049, 333397, - -1145146, -353798, -599685, -539018, -206158, -739271, -53687, 328565, 206158, -451508, - -127775, 169651, 166967, 223875, -224412, -825707, 0, 416075, -300111, -401579, - -32749, 19864, -32749, 28991, -46708, 154619, -57445, 49392, -20938, 236223, - -78383, -204011, 214212, 148713, -68183, 56371, - }, - { - -49280456, 137562976, 2404108, -250719, -5317170, 1708323, -3187940, -1347546, 230854, -850404, - -4097936, -3078418, -4588636, 987306, 1862405, -1489817, 1624035, 1864016, 1605244, -904091, - -1006096, 2444910, 591632, 1299765, 1486596, 1665374, 615791, 1567126, -3951370, -4522064, - -1883880, 4173098, 3606699, -1968706, 2049236, -797790, 1521492, -3615826, -1008244, 922344, - -251792, 1756642, -237297, -1522029, 518617, 331249, 2005213, 20401, 545461, 739271, - 477815, -1111323, -343597, 1091459, -762357, -569620, -605054, 372052, 725850, 788127, - 75699, -682900, -519691, 172336, 17717, -299574, 115427, -285078, -90731, -267899, - -582505, 371515, -135828, 174483, 236223, -503048, 135291, 274341, 329102, -310848, - 51003, -252866, 150861, 104690, 228170, -54224, 197569, -263604, -38118, 202937, - 236760, -11811, -1074, 184684, 117575, 92879, - }, - { - 453119, -9691057, -518080, -1011465, -90194, -24696, -220117, -1593970, -217433, -759672, - -1090385, -3178813, -1770600, 10431939, -8229694, 3679713, 1640678, 3695283, 3635690, -5129802, - 4093641, 1868311, -18790, 9695352, -4130148, 514859, -1061931, 2083596, 2545842, 3335042, - -776852, 2428804, -1374390, -801011, -1311576, -2593087, 1360431, -852551, 3264712, 43487, - 165893, -528281, -406411, 14496, 166967, 702227, -1658394, -467615, 627065, 48855, - -1151051, -676994, -107374, 630286, -409633, 359704, -194884, -550830, 1401770, 873489, - 1801739, 1065152, 941672, -214212, 558883, 443992, -67109, -509491, -784368, 172336, - 434329, 169114, 158377, 420907, 824634, 272194, -82141, -384400, -411780, 289373, - -11811, 296353, 69793, 205622, 3758, -91805, -336618, 191126, -39728, -75162, - 229244, 49392, -176631, -196495, 30065, -117038, - }, - { - 37616936, -153301872, -13430363, 11347840, -1471563, -2718178, -573378, -931471, 348429, -2396055, - -450972, 825707, 703838, -2882460, -9191767, 890132, -3258807, 1751273, 2735357, 354872, - 3160559, -2416993, -4134980, 2486249, 2130304, -3866008, 717260, -1495186, 2878165, -1305670, - 1876901, 2557653, 2855617, -2485712, -876173, 493384, -490163, -243739, -3938485, -2129230, - 1888712, -1327145, -223875, -509491, 1694902, 1751273, -2215130, 954020, 2106682, 654983, - 1228898, -1311576, -1005559, 410706, -115427, 2267743, -2147, 904091, 297963, -1008780, - -282931, -353798, -71941, -2147, -621697, 801011, -89121, -134218, 287226, 315680, - -195958, -201863, -5369, 143345, -129923, 158377, -147103, -150324, 398358, 51540, - 343597, 672162, 32749, -190589, -267899, 152471, 537, -39192, 117575, 18790, - 28991, -75162, 94489, -140660, 115427, -248034, - }, - { - 826781, -6180995, -1809792, 521302, -911070, -224949, 121870, -2433099, -3274376, -253403, - -1461363, -1358820, 503048, 1930051, -15241228, 9824201, -4693326, -4495757, 4042638, -3446175, - -6972880, -1886028, 5260798, -7204271, 3847217, 7235410, -5382131, -302795, 6099928, -5814849, - -1002338, 1284732, -574989, -4162897, 587337, 255551, 1769527, -751082, 1177358, 330712, - -1787780, 270046, -2112587, -693100, 1121523, -905164, 1253594, -272194, -804770, 1527398, - -1431835, 1979443, -632971, -181462, -51003, 171262, 257161, 979253, 814970, -2211371, - -1567663, 1046898, 132607, 290984, 201863, -114890, 717260, 478889, 988916, -294205, - 433792, -187905, -326418, 290984, -99321, 178241, -408022, -323196, 235686, 118648, - -44023, 328028, 164819, 340913, 38118, -629750, 14496, -100395, -166967, -67646, - -49392, 10201, 32212, 154619, 204548, 103616, - }, - { - 15966541, -16408386, -12262132, -4128001, 754841, -5090610, 5727876, -362925, 547608, -4081293, - -2748242, -774705, -2634426, 230318, -3114388, -3375844, 2534031, -7573101, 3279745, 214212, - -3164854, -5560372, 3257733, -2752000, 2740726, 2107218, 2053531, -613107, -1232119, -2384244, - -2959769, 2834679, 4415764, -3487514, 1038845, -4639102, -2592550, -3381213, 2227478, 2353642, - 1118839, 226023, 1276142, -177704, -2267743, -1737851, -1296543, 1515050, -852551, -2542621, - -556735, -1674500, -1021129, 211527, 2570001, -922344, -559956, 937914, 275415, -172872, - 439697, -643171, -57445, 574452, -1392643, 605590, 700617, -341450, 367757, -116501, - -497142, 623844, 73551, -104153, -403727, 179315, 580357, 30602, -170188, -208843, - 2684, 26844, 500901, -172336, 160524, -584652, -154082, 105764, 178778, 165893, - 251792, -97174, -195421, 100932, 213675, 37044, - }, - { - 694711, 25877178, -5408975, -203474, 974421, 1941862, -1801202, 1730872, 216896, 395137, - -894964, -1569274, 1551557, -2639794, -3338800, 2088428, -3823595, 2639258, 492848, 6318971, - 1612223, 8820789, 2267743, 3066070, 1397475, 716186, 2597382, 6882685, 1620276, 2888903, - -821949, 294205, 2716567, 388158, 2757369, -1171989, 2024540, 434865, 1829119, 677531, - 1267552, -2544768, -179315, -73551, 593242, -820339, 1578937, 100395, -61203, 303332, - 252866, -1163936, -212064, 1358820, 610959, 738734, -70330, 79457, 1005559, 190052, - 472446, 217970, 517544, 8053, 312459, -478889, -123480, 54224, 177167, -817654, - -301721, -158377, -62277, -391379, -250719, -33286, -64425, 1611, 268435, 537, - 82141, -366683, -192200, 312459, 264141, -33286, 237297, 13959, -34360, 235686, - -165356, 34360, -70330, -87510, 127775, -30602, - }, - { - 29394756, -7802345, 7896834, -3459059, 427349, 2670933, 504122, 966905, 1229434, 5761699, - 1975148, 1172526, -1730872, 9662603, 8519605, -53687, 1794760, 424128, 3714073, 20938, - 5881958, -425202, 1188632, 3855270, 3641059, -4138738, -701690, -439160, -1679332, -1075352, - 44023, 1073742, 2126546, -54761, 3887482, -1725503, 208306, 1835025, -3578245, 100932, - -992674, 779537, 4917201, -579284, -322123, 870805, -75699, 245350, -71941, -6979, - -1129040, -385473, -1355062, -128849, 957778, 439160, 146566, -586263, 277025, -847182, - -766652, 323196, -507343, -223875, -68719, 180926, 373662, -381715, 673236, -491774, - -359167, 237297, 110059, -234613, -88047, -620623, 217433, -122943, 48855, 49392, - 174483, 48855, -132070, 229244, 37581, -288300, 5906, -170725, 118648, 97174, - -77846, -157303, -142271, 127775, -83215, -28991, - }, - { - -424128, 8762807, 7817914, -209380, 3185792, -2102387, -4048007, 328565, -2298344, 1719061, - 160524, 4522064, -15447387, -667867, 6255620, 4163434, -2178085, -2660195, 1278827, -9460202, - -435939, -775778, -848256, 8059506, 3525631, -4926328, 1617055, 6444599, 2587718, -765578, - -48855, 2964601, 3325379, -470836, 1714766, -1677185, -3056406, 1533840, -3607773, -1633698, - -730144, -202400, 2399276, 833761, -372052, -374199, 1604707, 37044, -2412698, -2237141, - -245887, -56371, 500364, 365072, 40265, 469762, 242666, 192200, 614180, 71941, - -282394, 601832, -685047, -171799, -766652, -510027, -54761, 402116, 957778, 271120, - -275952, -11274, -597537, 184147, 30602, -231391, 99858, 308701, 220654, -178778, - 66035, -87510, 151934, -92342, 33286, -26307, -505732, -272194, -403727, 537, - -338229, 162672, 27380, -206695, 70867, 171262, - }, - { - 17635136, 35580584, -206158, -2691871, 2146947, 1643362, 5252208, -2336999, 8151311, -1297080, - 1249299, 2036351, 4843650, 11268920, 22454090, 2845416, -8453033, -568546, -4259534, -773094, - 981400, -1451162, 49929, 4463008, -304406, -234613, -416075, 3601867, -3779571, 759672, - 1611150, 1765232, 661962, 1234266, 3918084, -1151051, -2617246, 2285996, 3394098, -747861, - 1118839, 799401, -2171643, -2114198, 1056562, 2474438, -1427540, 807454, -111132, 489626, - -663572, 1959579, 1684164, 2367064, 967441, 379568, 127775, -337155, 999654, 261993, - -397821, -718333, -30602, -119185, 607201, 73014, 299574, 53150, 468151, -217433, - 233002, -4295, -886911, -27380, 149250, 368293, 348429, 223338, 15032, 139586, - 57445, -242129, 186294, -253940, 151398, -250182, -27917, -260919, -97174, -231928, - -300648, 34360, -94489, -161598, 35970, 253403, - }, - { - 898185, 470836, 2452426, -4296578, 578747, 1773822, -280784, -1170916, 3555159, -122407, - 1885491, -4118337, 1698123, -22612466, 35378720, 540092, -3949223, 1314260, 3657165, 1234803, - -1080184, -620086, -2087891, -1849520, 3555159, 531502, -4195110, -4226785, 890669, 4552666, - 2292976, 31139, -5616207, 1431835, 1063541, -279710, -1952063, 1031329, -3655554, 839129, - -773094, 108448, 969052, -800475, 1145146, 965831, 142271, -131533, -772020, 1028645, - 1058173, 121333, -931471, 30602, -500364, -737124, 47782, -111132, -319975, -159988, - -678605, 497679, 881542, -655519, -102005, 128849, -589484, 606127, 408559, -147640, - 677531, 71941, 12348, -38655, 497142, 408022, -361314, 146029, -277025, -161061, - 80531, -55835, -137976, 112206, -10201, 16643, -383863, 64425, -108448, 49392, - -59056, 16643, 27917, -150324, -217433, -109522, - }, - }, - { - { - 10453950, 129184024, 11629698, -7159174, -922344, 2124398, -1192927, 2363306, -77846, 1945620, - -3332895, -4104378, 2002529, -368830, -2576981, 11570642, -8709657, 1404454, 9058623, -2619930, - 747861, -3850438, 1581622, -6629282, 5324686, 1401770, -2648384, -4694400, -1018981, -1586454, - -107911, 339839, -4036733, -1060857, 2071248, -3066070, 812823, -885837, -1295470, -1115081, - 2653216, 2766496, -1304060, 4044249, -295279, -253403, -643171, -195958, -1902671, -683974, - 1155346, 317828, -821949, -376883, 1758789, -321049, -877247, 475131, 758062, -1637993, - 920197, 177704, -1161789, 9127, 97711, -341987, -251256, -289910, -26307, -600222, - 479426, 224949, -318901, 771484, 212064, 504659, -162672, 165356, 1611, 235149, - -220117, -270046, 486405, 74088, 19327, -263604, -147640, -124554, -275415, -39192, - 125091, -131533, 107374, 7516, 38118, -64961, - }, - { - -552977, 69077568, 13482439, -390305, -3114388, 573378, -882079, 1204202, 3330210, 1475858, - 1364726, -286689, -747324, 994822, -9814000, 3861713, 6224482, -4876936, 14177687, -1794760, - -9553618, -1369021, 415001, -2696703, 807454, 547608, -3186866, 2426120, -1022202, -2202781, - 1694365, 6742025, 969052, -1030255, -3576634, -1485522, -544924, 657130, -680215, 2048163, - 1694365, 2524904, -1978906, -1036698, -1276679, -1483911, 114354, 1770600, 81068, 1158031, - 1072668, 630823, 341987, -219580, -609885, -541703, -855235, 460098, 1075889, 383863, - -498753, 737661, -215822, 467078, -9664, 165356, -541166, 671089, 208843, 15032, - -272194, -148176, -199179, 265214, -290984, 126165, 175020, -289373, 373125, 9127, - -157303, -187905, 85362, -607738, -249108, -95563, -213675, 208843, 49929, -67109, - 67109, -73551, -154619, 258772, -102005, 158377, - }, - { - -1928977, -127387656, 22408454, 9104257, 5713917, 5805185, 60666, -842350, -1225139, 1040993, - -32749, 1831804, 7007776, 739271, 5732171, -2706903, -6187438, -9320079, -494995, -2703145, - -585189, -6571300, -4293894, -3739306, -5340255, 468151, -7103339, -4734665, 990527, 2987687, - 1204738, 4721243, -686658, 442382, 4294431, 61740, 1131187, -1466731, -1065152, 2135673, - -1612760, -3659849, 537408, 2490544, 828929, 9127, -2100239, 137439, 327491, 471910, - 666257, -190052, 318364, -164283, -32212, 668404, -930934, -1299228, 59056, 79457, - 119185, 668941, 408022, 37044, -18254, -497679, 547071, -217433, 612570, 540092, - 295816, -236760, -474057, 319975, 348966, 537, -654983, 206695, -322659, -296890, - -159451, -4832, 11274, -154619, 70867, -156766, -27917, 30602, -137976, -32212, - -12348, 52076, -267362, -5369, 39728, -54224, - }, - { - 30507152, 110248056, -10401874, 17074642, 482110, -1075889, 2188286, 2380486, 989453, -87510, - 960999, -590021, 1503775, -6440304, 3251290, 117575, -3761855, 4533875, 4622459, -419833, - -399969, -4843650, -3689914, -446140, 745177, -2237141, -3100430, -202937, 778463, -836982, - 4045859, -1043140, -702764, 493921, -192737, -287226, 850940, -777926, 73551, 524523, - -763430, -1045825, 548145, -637266, -1364726, 420370, 484258, -1059783, -784368, -879931, - 167504, 952946, -1400159, 871342, 121333, -612033, 482110, -123480, -432181, 1444183, - -688269, -112743, 255551, 502511, -76236, -214212, -42413, 267362, 181462, -77846, - -175557, -413927, -434329, 84826, 240518, 180389, -413927, 66572, -301185, 133144, - -382789, -412854, 39192, 269509, 23622, -54761, -100932, -10737, -125091, 53150, - 19327, -19864, -67109, 93416, -79457, 537, - }, - { - -63888, 24761024, -6790880, 652835, -1067836, 929324, -345745, 799938, 533650, 893890, - -3680787, 1952600, 1854352, 6257231, -4220879, 1688459, -1979980, -50466, 14314052, 1293859, - 3318399, -3771518, 2916820, 401579, -2279017, -3775813, 1205275, -3320547, -130460, -2684, - 550830, -544924, -1402844, 7555921, -586800, -4854924, -1251983, -2531346, 1412507, -983011, - -729071, 16106, 223338, 11811, 2279554, 225486, 243739, -1307818, 1313723, 59593, - -621697, 1280437, -413927, -135291, -465467, 1469953, -730144, 455267, -82678, -507343, - -966905, 382252, 49392, 434865, 1069984, -249108, -239981, 319975, 384400, 18790, - 461172, 120796, -334471, 340913, 498753, -345745, -107374, 331249, -472983, -491237, - 15569, 79457, 112206, -20401, -55835, -154082, -208843, -105764, -162672, 202937, - -61740, 3758, 200790, -47782, -214212, -31139, - }, - { - 33130304, 246435024, -4412542, -229244, -5056787, 1677722, -610959, 4783520, 546535, 504122, - 398358, -89657, -2048699, -1336809, -512712, -2632278, -2440078, -2372970, 1089848, -236760, - -1578937, 656593, -814433, 750546, 939524, 2216203, 801548, 5026186, 693637, -1283658, - -1846836, 2275259, 658204, -4684199, 2060511, -429497, 2480344, -842350, 1081795, 1020592, - 721018, 4081830, 2027225, 1230508, 1153736, -395137, -858457, -1410897, 550830, -45097, - 899796, -1095754, 67646, 900333, -810675, -634581, -1444720, -339302, 62277, 1611, - 62277, -93416, -243203, 281320, 692027, -181462, 140660, -193810, -89121, 468151, - -1611, 785979, -33286, -119722, 253403, -311922, 267362, 166430, 194347, -35433, - 518080, 230854, 32212, -295816, -37044, -64425, 177704, -398895, 128849, 27917, - -97174, -176094, 56908, 160524, -105227, -51003, - }, - { - 42413, -5131412, 5140002, -110059, 978716, -73014, 426812, -435939, 517544, 849330, - 1368484, 2022930, -2234457, 6086506, -5915781, 2297271, 439697, 6157373, 1104344, -13728863, - -913754, -5017059, 1242856, 11814381, -3425773, 674847, 2323041, 7864622, -752156, 886911, - -448287, 1393180, -1498407, -609885, 292058, -2358474, 1267552, -1241782, 1562831, 220654, - 159988, -1326071, 763967, 860604, 136902, 1457605, -846645, -462783, 802085, 433255, - -879395, -481573, 402653, 1178969, -397284, -622233, -1267552, -174483, 45097, -1457068, - 360777, -142271, -271120, -194347, 531502, -376883, -422517, -137976, -220117, 328565, - -82678, -106300, 46708, -385473, 471910, 348966, -77309, -296890, -221728, 453119, - -57982, 405874, 93416, 1611, -201327, 537, -253940, 5906, 125091, 212601, - 343061, -1074, -134218, 26844, 88584, -115964, - }, - { - -26595512, -220707088, -3674882, 8376260, -1441498, -1916092, 3129958, -2116345, 1786170, -403727, - -1262720, 4057134, 1349694, 1445793, 535260, 3276523, 2849711, 3348464, 2835215, -869194, - 356482, -810675, 99321, 3572339, 565862, -3705483, 4018479, -522912, 1682017, -1015223, - 1971927, -1714229, -251792, 579284, 687195, 6533182, 5625334, 243739, -320512, 333397, - 831613, -2301566, -811212, -227096, 507343, 710280, -1451162, 243203, 99321, 257161, - 1658394, -296890, -74088, 282931, -795106, 654983, -858993, 1085553, 38118, -1252520, - -171262, -231391, -41876, -372052, -329102, 1170379, -535260, -632434, -390842, -233539, - -492311, -543313, -380105, -90731, -276489, 126165, -268435, -188442, 112206, -521302, - 85899, 449898, -265214, -368830, -12885, 114890, 60666, 291521, 109522, 66035, - 230854, 26844, -35970, -89657, 171262, -155693, - }, - { - 306553, -4850092, 3462281, 1083942, 639413, 3758, 180926, -1076426, -1967095, 28991, - -357556, -1935957, -3473555, -4489315, -15425375, 10901701, 1517197, -2374043, -1529545, -6235756, - -9654013, -2618320, -4357245, -12225088, 8617852, 6633040, -2022930, 822486, 2841658, -1740536, - 1608465, 1051730, -2044404, -6259915, 1870995, 1109175, -375810, -815507, 3798362, 1791001, - -1898912, 1161252, -1425392, 305480, 785442, -1718524, 1476395, 229781, -1371168, -499290, - -2120640, 2434173, -747324, -42413, 551903, 455267, 173409, 1070521, 1731946, -841814, - -863825, 685047, -438087, -41339, -107374, -554588, 447750, 2147, -274341, -694174, - 685584, -110059, -346819, -355409, -87510, 624918, -195958, -201863, 238371, 176094, - -163746, 290447, -3221, 147640, 82141, -504122, 267362, 226560, 94489, 132070, - -21475, -36507, -26307, 106300, 127238, 86436, - }, - { - -14836965, -8647380, 19660212, -7245073, -3524558, -8271570, 7370701, -1329829, 310311, -879395, - -1498944, 1867237, 8590, 1322850, 3988951, 3539590, 7303592, 1552631, 30065, -4202626, - 779537, -5251672, 3580392, -665720, 1403381, 226023, 1749662, -1355599, 310311, 488016, - -5363878, -1372779, 2458869, -1852205, 3839164, -473520, 1817308, -3416647, 1591285, 181999, - 1371705, 833224, 1940788, 804770, -437550, 1838246, 600222, 956704, 454730, -565325, - -283468, -1611687, -1254131, -1255204, 1199907, -1083942, -569083, 675921, -163746, 212601, - -131533, -1200443, -431644, 1049583, -841277, 52076, -231928, -458488, 250182, 45097, - -176631, 174483, -619549, 115427, -85899, 65498, 166967, 284005, 33286, -209917, - -203474, -355945, 279173, -252866, -179852, -476741, 30065, 12348, 136365, -124554, - 59056, -6442, -69256, 22549, 68719, -104690, - }, - { - -644782, 30466888, 4340065, 1749125, -1847910, 1093606, -1292248, 3359738, 163746, -1211181, - -1620813, -1386201, -1489280, -972810, -6087043, 1730335, 891743, 4555350, 1467805, 8156680, - 215285, 6533719, -3944928, -6043556, -937914, 3205656, 4817343, 7318625, 2792803, 2596308, - -1693291, -3061775, 2526515, -79457, 2865280, -1649804, -280784, -414464, 573378, -1927367, - 798864, -728534, 709207, 1255204, 900869, -1757715, 584116, 212601, -48318, 11811, - 884763, -409633, -504122, 221191, -154619, 586263, -118112, -307627, 433792, 537, - 461172, 595927, 681289, 116501, 492311, 232465, 478889, 154082, 498753, -684510, - -333397, 229244, 353798, 86436, -98247, 17180, -71941, -102542, -183610, -60130, - 99858, -329102, -343597, 45634, 31139, -195421, 245350, 27917, -156766, 180389, - -220117, -12885, -162672, -107911, 19864, -67646, - }, - { - -15113990, -66559644, 11098732, -5399848, -3524021, 515396, 1328756, 580357, -2193655, 523986, - -1178432, 2388539, -7642895, 1075889, 10203232, -2870112, -3693672, -2117419, 747861, -2327872, - 2835215, 528818, 1635846, 839129, 3692598, -880468, 2816425, 1996086, -2712809, -2684892, - -233539, 991601, 1855426, -1158567, 154619, -3904125, -578747, 1199907, -3965866, 610959, - -455803, 950262, 3422552, -2339684, -112206, 873489, 370978, 1180579, -114354, -1120987, - -488553, 624918, -733903, 903017, 624381, 464930, 368293, 197569, 1389422, -302795, - -1335198, 190052, 229244, -51003, 231928, 577136, 360777, -672162, 697395, -621160, - -15569, 208843, -16106, -16643, 205622, -469762, -107911, 14496, -42950, -255014, - -222265, -98247, 28454, 172336, 145492, 147103, 114354, -230854, 1074, 77309, - 52076, -208306, -236760, -51540, -125628, 67109, - }, - { - 656593, 1295470, 616328, -1554241, 4344897, 271657, 190052, 2404645, -922881, 1427003, - -588411, 8838506, 9496710, 29605210, 7906498, 10219338, 173409, 591095, 3201361, -2254858, - -3789772, -16323023, -9018358, 7908646, 9110163, -2225330, 4196183, 1814087, 2216203, -2973728, - -3054796, 188442, 1045288, -1554241, -1438277, -3304441, -2585034, 1400159, -1826972, 1191853, - 690953, 1358820, 1991254, 445066, -1018444, -271120, 2301566, 288837, -2001455, -1455457, - -1864553, -657667, 355409, -140123, 443455, 1112397, 399969, 294742, 553514, -91268, - -167504, 45097, -492311, 580894, 10201, 82678, 198642, 261993, -357019, -69793, - -117038, 475131, -148713, 201863, -107911, 25770, 267899, 28454, -25770, -349503, - -143345, -231928, -12885, -81068, 178778, 266825, -134218, 383326, -117575, 118648, - -61203, 226560, 37044, -131533, -2684, 60130, - }, - { - -18957986, -11485816, 1751273, -3890167, 775778, -3985193, 1141388, -3676492, 4116189, -3052648, - -1547799, -1618666, 7853348, -8453033, -11828877, 4959077, -1327682, -1452773, -5138392, -346282, - -983548, -1698123, 173946, 4001836, 1228898, -301721, 271120, 1480690, -2971044, 2923262, - 1750736, 1188095, -665720, -1128503, 2809446, -775242, -2731062, 1531156, 311385, -2419140, - 1453846, -450435, -1464047, 88047, 505196, 2290828, -1802813, 887985, 905164, -359167, - -1285269, 702764, 688805, -12348, -554051, 260382, -693637, -875100, 1042603, 517544, - 104153, -744640, -151934, -265751, -68183, -481573, -163209, -63351, 682900, -62277, - -349503, -116501, -914291, 108985, 412317, 197569, -264677, 118112, 55298, 115964, - -52613, -308701, 122943, -488553, -23622, 10737, -35433, -285078, 53687, -170188, - -186831, 300648, 162135, 35970, -16643, 85899, - }, - { - -652835, -2180233, 2952253, -1891396, 2175401, 60666, -2387465, -3970697, 1936493, 3115999, - 2360085, -6061810, -879931, -12576738, 50838992, 934155, -3095061, 4658966, 9188546, -3417183, - -5496485, 2871186, 1712081, -7969312, 1219234, 4101694, -3427921, -3473018, -445603, 1653026, - 1495722, -344671, -5219459, 5248450, 4395899, 1565516, -431644, 3256122, -2698313, -317291, - 170188, 1450625, 1329829, 976031, 132070, -638340, -1154809, -1200443, 258772, 2840584, - 915365, -312996, -810675, -479963, -159988, 310311, 587337, 105227, 184684, 336081, - -680752, -292058, 1000191, -53150, 447213, 602369, -1016297, -398358, 22012, -324270, - 91268, -330712, -105764, -348966, 88047, 485868, -406411, 294205, -220117, -116501, - 106837, 62814, -49929, -104690, -185220, 178241, -222265, 98784, 70867, 137439, - -70867, 72478, 14496, 66035, 10201, -4295, - }, - }, - { - { - -11696270, 94897840, 47954920, -14658723, 1869385, 2012192, 57445, 3111704, 439697, -741419, - -5320391, -3820910, 2544768, -1991791, 4614406, 869731, -75699, 1719598, -290447, 4167729, - -1083406, -3488050, -2918430, 708670, 1648194, 1392106, -3453154, -4146254, -3481608, 1706176, - -3517578, 792421, -1585917, -1074816, 609885, -2480344, -625455, -649614, 830002, -1148904, - 2246805, 1410897, 1155883, 589484, 319438, 253403, 428423, -1306744, -1770600, -709207, - 2282775, 539555, -1932735, 127238, 681289, 904091, -867583, -114354, -559420, -389231, - 737661, -261993, -587874, 255551, -607738, -293132, -421444, 48318, -352724, -106837, - 12348, 432181, -347892, 423591, 421981, 23085, 60130, 84826, 301185, 279710, - -97711, -222801, 271657, -63888, 52613, -102005, -212601, -79457, -322123, 34360, - 48318, 10737, -80531, 100395, 31139, 22549, - }, - { - 1375463, 56866976, 19222664, -2750927, 1486596, -548682, -133681, 899796, 4307316, 2264522, - -2012729, 586800, -150324, -3547106, -8982387, 12090333, 439160, 5176510, 1646583, -2851322, - -7466801, -3776350, 580357, -2365453, 1731409, -2122251, -1316408, 3180423, -3163780, 1446867, - -2436320, 7192997, 1498407, -1711545, -313533, -4032438, 745714, 1165010, 981400, 1165547, - 1127966, 1995012, -1635846, -1455457, -593242, -266825, 382789, 1027034, 289910, 622770, - 1762010, 879395, 493384, -416612, -280784, -1554778, -264141, 277025, 532576, 845572, - 810138, -399432, 184147, -311922, 589484, -140123, -213138, 516470, 89121, -130460, - 492848, -291521, -297963, -3221, 114354, -13959, 26844, -45634, 5906, 68719, - -197569, -44023, -198105, -265751, -199179, 77309, 102542, -144955, 19327, -91268, - -182536, -73014, 129386, 223875, 73014, -44023, - }, - { - 3019899, -51266876, -40070436, 7767985, 7471096, 6862284, -783832, -1577327, 427886, -1656784, - 5637682, 1052267, 911607, 4665408, 4286378, -380641, -2812130, -12514998, -4307316, -389768, - -6726993, -4426501, -6502044, 1977296, -2841658, -4393215, -4276714, -3845070, -933619, 2313377, - 3383361, 1927367, 354872, 1653562, -1101122, 790274, 2591476, -2836826, 535797, -619012, - -2085207, -1209033, -857920, 951872, 1000191, 1349157, -2065879, -419296, 965831, -141734, - 584116, 348966, 309238, -41876, -45097, 693637, -572841, -871878, 26844, -66572, - -403190, 1372242, 512712, 74088, -534187, 567473, -798327, 547071, 309238, 791348, - -3758, 17180, -179315, 51003, 100395, -16106, -321049, -97174, -246961, -111132, - -456340, 122943, 2147, -256624, 161598, -63351, 216896, -244813, -8590, -158377, - -537, -21475, -291521, -140660, 26844, 53150, - }, - { - -14014478, 153095184, 3491272, 15102179, 2624762, -421444, 2079301, -151398, 1714229, 1343788, - -943282, 2042794, -936303, -608812, -3251827, -2928631, 3547643, 5186173, 1774358, -1088237, - -909996, -3713536, -2594697, -852551, -688269, -1032403, -2732673, 721018, -744103, 2397666, - 667331, -2126546, 225486, 1243393, 1379221, -1054415, 559956, -309775, 126702, 2182380, - -2123325, -125628, -1252520, 796180, 357556, -558346, -739271, -923418, -40802, -1451699, - 895501, -293668, -1069984, 356482, 859530, 274878, 164819, -7516, -603980, 933082, - 403190, -218506, 16643, 158377, 199179, 19864, -180926, 515396, -1611, 26307, - -181999, -415538, -661962, -118648, 649614, 30065, -55835, -87510, -322123, 51540, - -204548, -139586, -118648, 192737, 103079, -201863, -77309, -1074, -283468, 91268, - 100932, 57445, -22549, -90731, 108448, -140660, - }, - { - -507880, 8832600, 4540318, -290984, 566399, -277562, 558883, 550293, 1224066, -44023, - -1928977, 1443109, 3699041, 671626, 6542309, -7528004, -842887, 22357990, -22587234, 7638063, - 5349382, -1156957, 191126, -4038880, -4996658, -792421, -850940, 1203128, -421444, 3614752, - -2398202, -62277, -1214939, 4722317, 1231582, -2975339, -1741609, 80531, 1163399, -106837, - -2000381, 200253, -1370095, -210453, 2238752, 1545115, -753230, 765578, -82141, 1129040, - -1096827, 252329, 958315, -1518271, 386010, 688269, 1094680, 267362, -773094, -297427, - -151934, -189515, -120259, 1057636, 828929, 536871, -83752, 213675, 322659, 47782, - -24696, 287763, -238908, 351650, 304406, 210990, -417686, 223338, -33823, -363462, - 52076, -45097, -40802, 51003, -71941, -376883, 118112, -185757, -76773, 179852, - -83215, 245350, 28991, -59593, -173409, 2147, - }, - { - -7902740, 302563264, -6205154, -6868190, 3997004, -952409, 497142, 3797288, 539018, 475668, - 4170413, -2770254, 270583, -1871532, 740882, 367757, -7047505, -1320703, 1396938, -1330903, - 10201, -697932, 1731409, -1079111, 1016297, 1134945, 2130304, 3430605, 791348, -1959042, - 331786, 1602560, -1975148, -1911261, -387621, 1147830, 1629403, 889058, 1254131, 1324461, - 3124589, 1302449, 3539053, 1684701, -2391223, 801548, -2851858, 1265405, -232465, -703838, - 617938, -875100, 1105417, -411780, -358630, -979789, -752693, -540092, 512175, -39728, - -626528, 334471, 218506, 301721, 161061, 322659, 11811, 17180, 70867, 148713, - 574989, 219043, 493384, 22012, -256624, -13422, 215822, -111132, 11274, 472983, - 284005, 257698, -318364, -164283, -102005, 259309, -161061, -253403, 175020, -87510, - -64425, -239444, 212601, -138513, 32749, -90194, - }, - { - -290984, 4507568, -318901, 273267, 883153, -5906, 89121, -110059, 472983, 878858, - 948651, 375273, 2873333, -2754685, 168041, 4456029, 2311229, -2208687, -2442226, -7058242, - 823023, -525060, 6786049, 895501, -2615635, 163746, 3720516, 5069135, -805843, 316754, - -1467805, 1735704, 583042, -1280974, -1465658, -1455457, 1418950, -715649, -164283, 2004676, - -503585, -1926293, 2223719, 1378148, -1400696, 789200, 463856, -367757, 426276, -844498, - 159988, -794569, 288300, 1051193, -486942, 333934, -1596117, 312459, 83215, -1452236, - -135291, -335007, -715112, 150324, 792421, -1051730, -590558, 120259, 93416, 315680, - -227096, -263604, -13959, -15032, 351114, 157303, 116501, -189515, -10201, 333934, - -6979, 110059, 234613, -134218, -91268, -59056, 18790, -169114, 64425, 206158, - 112743, 2684, -50466, -3758, 32212, -63888, - }, - { - 10323491, -241567216, -21978958, 1082332, 2101313, 172336, 1523640, 1598802, -113817, -1326608, - 1037235, 1723356, 1498407, -3561602, 6395743, 4374961, 2058900, 2606508, 2255932, -120259, - -1455994, 1268626, 1723356, 3046206, 103079, -2587718, 1607392, 910533, 1465121, 1478543, - -191126, -2318746, 2012729, -2270964, 3637837, 8071318, 2518462, 1697049, -1198296, 3176665, - -1220845, -1418950, -2199023, 129386, 814433, 550293, -146029, -1989644, 813359, 1579474, - 1159104, 213675, 451508, -1931662, 702227, 184147, -310848, 449361, -611496, 146566, - -759136, -44023, -279710, -824634, 428423, 710817, -680215, -204548, -231391, -547608, - -491774, -646929, 230854, -180389, -196495, -154619, 81068, -12885, -132070, -457951, - 339839, -53687, -134218, -377957, 11274, 92342, 79457, 388158, -70867, 236760, - 114890, 15032, -150861, 190052, -152471, 46708, - }, - { - -939524, 7732552, -2573222, -1304060, 1413581, -164819, -462246, -609885, -508954, -644245, - -622770, -1354525, -782758, -5679021, -12520903, 1089848, -1003949, 10793790, -8775155, -6693170, - -9312563, 62814, -6180995, -4025995, 3554622, 3399467, 3324305, -1004486, -1729261, 2126546, - 1324997, -548682, -1100049, -3899294, -20938, 2614561, -2171643, -390842, 2659659, 2338073, - -476205, -592706, -842350, 2026151, -153008, -928250, 384400, -660888, 450435, -1927367, - -578747, 850940, -368293, -306016, 819265, 454193, 112743, 1698123, 904628, -453656, - -160524, -627602, -201863, -55298, 66572, -931471, 93952, -450972, -242129, 273267, - 239444, 53150, -334471, -514859, 359167, 171799, 19327, 55298, 101469, 163746, - 41876, -271120, 181999, -140123, 122943, -161061, 267899, 181462, 131533, 242666, - -8053, -182536, 37581, -537, 279173, -4295, - }, - { - 12544526, 15264314, -35879620, -5926518, -487479, -1441498, 1064615, -1035624, -1138166, 1810866, - 767189, -184147, -148713, 1188632, 6693707, 1509681, 9255118, 5099200, -3384971, -2901787, - -348966, -2762738, 773094, 1813013, 1683627, 1525787, -482110, -1522029, 1170916, -115964, - -2383170, -1802276, 547071, -1686848, 2415919, 2713883, 212601, -751082, -203474, -549756, - 2877091, 47782, 1483911, 788663, 288300, 2450816, 1917703, -126165, -809601, 1843615, - -1006633, -1011465, -759672, -959388, -408022, 126702, -569083, -154619, -129386, 492848, - -124554, -858993, -429497, 482647, -383863, 4295, -800475, 61740, -15569, 135828, - 348429, -142808, -502511, 49392, 89657, -41339, 157840, 69793, 229781, -227096, - -423591, -205622, 6979, -34897, -295816, -45097, 64425, -16643, 132070, 76773, - -118112, 10201, -15569, -73014, 29528, -36507, - }, - { - 381715, 18848464, 12095702, 860604, -74088, -876710, -625992, 2080912, 1833951, -2920041, - 1153199, -2500208, -4674535, 5275831, -8279623, 3463891, 16106, 874026, 8337069, -3030100, - 4682051, 5085242, -3001109, -3692061, -2459943, 4721243, 3716221, 6715718, 4283156, 1234266, - -2116345, -6796249, 5346698, 1260573, -77309, -762357, -1996623, 1740536, -1222455, -1921461, - -916976, -288837, 2515777, 184684, 277025, -5369, -1200443, 1504849, -127775, -427349, - -60130, 350040, -150324, -513785, 621697, 223875, -672699, -230854, 56371, 521302, - 937377, 2684, 113280, 411243, 231391, 622233, 781684, 271120, 14496, 169114, - -388695, 165356, 6979, 210453, 30602, -115427, -161598, -270046, -155693, 62814, - -76773, -191663, 6442, -338229, -155156, 0, -11811, 157303, -69793, -133144, - -69256, -49392, -150324, 23085, -2684, -58519, - }, - { - -149787, -81451368, 1145146, -377957, -5628018, -4092567, 5211943, 906238, -2178085, -427886, - -2822331, 3039763, -4142496, -1203665, 3542811, -1874216, -2088965, -1290638, -1373853, -248034, - 1531693, 63351, 2486786, 446677, 819265, 2989297, 2382096, 971200, -2507187, -1276679, - -1432909, 566399, 1583769, 96637, -1685775, -4556961, -540629, -1088774, -325344, -1452236, - -168577, 2588255, 2476586, -3030100, 789737, -249108, 102542, 1084479, 1464047, -1489817, - -826244, -85362, 81068, 1067299, 141734, 1114544, 131533, 989990, 240518, -73551, - -806917, 60130, 101469, 234076, 346819, 144955, 146566, -500901, 210990, -43487, - 1611, 97711, 201327, -31139, -57982, -185220, -132607, 100395, -254477, -64961, - -213138, -133144, 45634, 310311, 78383, 236223, -172872, -179315, 172872, -19864, - 31139, -116501, -83215, -139586, -57445, 162672, - }, - { - -617938, -2754685, 716186, 1107565, 2200097, 2640868, 2013266, -654983, 2717104, 530428, - 1975685, 5144834, -1664300, 46750720, 4938139, 8269960, 3968013, 1472100, -316754, 1731946, - -4234301, -16121160, 1215476, -579284, 2126546, 4461934, 6283537, -714575, 871342, -2937221, - -5317707, 1591285, -111669, -1483374, -2990908, -1266479, -2410551, 104690, 622770, 226560, - 2484102, 1465658, -172336, 457414, -2267743, 1491964, 2053531, 365609, -1043677, -1997697, - -1334661, -951335, 964757, 311922, 657667, -19864, 637803, 75162, 346282, -402116, - 40802, -542240, 403190, 570157, -295816, 73551, 628676, 33823, -942745, -98784, - -114890, 341450, 681826, 64961, -406948, 14496, 482110, 92879, -355945, -108448, - -89121, -194347, -315143, -54224, -49392, 150324, 320512, 214212, 209380, -208306, - 176631, 267899, -109522, -15032, 3221, -17180, - }, - { - 12499429, -47209744, -9903121, -136365, -1274532, 2767570, -5485747, -364535, 119722, -965294, - 1204202, -53687, 3371013, 1370632, -25301116, -3587908, 4828080, -704912, -5564667, 1256278, - -2732136, 317828, 239981, 2544231, 1947768, 579821, 563178, 1127966, 1237488, -492848, - 2805688, -293668, -285615, -749472, 512712, 505196, -1386201, -5906, -1452236, -2249489, - 872952, 1768453, -1100049, 173409, -645319, 1194001, -670015, -659814, 783832, -195421, - 80531, -312459, 596464, -680752, -492311, 93416, -1039919, 448287, -18254, 1020055, - -636729, 73551, -421444, -442919, -382252, -618475, -675921, 151398, 667331, 310311, - -841277, -28991, -747324, -170725, 435939, 88584, -52613, -16106, 169114, -170188, - -307090, 63351, -292595, -314069, -261456, 379031, -7516, -128849, -71404, -67109, - -130460, 249645, 106837, 16643, 166430, -39728, - }, - { - 682900, -4238059, 2612951, -747324, 761283, -694174, -1689533, -2666101, -434865, 2372970, - 1481227, -1460289, -1780801, 29315836, -3700651, -3135863, 6933151, -2009508, 7709467, -5711770, - -2899640, 6596533, 3107946, -11116986, -2721399, 5483063, -3306051, -1007707, 242129, 1391033, - -508417, -405338, -2782602, 4728759, 3365644, 2114198, -1522566, 1532767, 403190, -634045, - 1866700, 171262, 1905355, 814433, -267899, -699543, -744640, -1206886, 505732, 2236067, - -88047, 859530, -128849, -1695975, 675921, -422517, 1308354, 528818, -74625, 410706, - 442919, -455267, -14496, 506806, 142271, 147103, -166967, -725313, -72478, -326418, - -166430, -267362, -97174, 64425, -47782, 307090, -192200, -33823, -121333, 258772, - -264141, 69793, 165356, -255551, -172336, 138513, -167504, 48318, 172872, -44560, - -10201, 111132, -24159, 128312, -3758, 3758, - }, - }, - { - { - 10436771, 1122597, -54734528, -8111046, -1735167, -984084, -2094870, 36507, 850940, 1204202, - -3856881, -4147865, 177167, -3046206, 5106716, -675921, 983548, 2410551, -4013110, -739271, - -2250563, -318901, 84826, 2274722, -1115618, 1256815, -49392, 1627256, 231391, 1612760, - -2804614, 55835, -1385127, -66035, 232465, -946503, 60666, -809064, -534723, -1986422, - 1643899, -414464, 579821, 514859, 663572, 1057099, 1939178, 133681, -55298, -432181, - 251256, -171799, -856846, 721018, 53687, 736050, -213138, 293132, -40802, 345745, - 92879, -209917, 79994, 452045, -233002, 63351, -214212, 250182, -62277, 200790, - -93416, 267362, -307090, 296353, 100395, -177704, 88584, 24696, 291521, -88047, - -203474, -45634, 201327, -180389, -96637, 64961, -76773, 52613, -117575, 81068, - -22012, 144418, -114890, 68183, 60666, 40265, - }, - { - -278099, 6653441, -21526912, -4282620, 1410897, -691490, -457951, -737661, 135291, 1104344, - -1689533, -578747, -2051921, 3274376, -1498407, 6219113, -3775813, 645319, -3819300, 811212, - -448824, -1422708, -454730, -75162, 3399467, -2959769, -1897839, 1641214, -3216394, 1272921, - -3121904, 5115843, -1308354, -1807108, 1576253, -2043331, 3849365, 1979443, 272194, 809601, - 51003, 244276, -919660, 639950, 129386, -120259, -13422, -673773, -188442, -287763, - 371515, 452045, 751619, -418759, -190052, -522375, 103079, 167504, -92342, 430034, - 585726, -686121, 64961, -553514, 541166, -115964, -27917, 169651, 110595, -60130, - 565325, -237834, -191663, 32749, 12885, -336081, -13959, 110059, -197569, 0, - -8053, 136365, 100932, 62277, -25233, 52613, 28991, -130997, -11274, 19327, - -39728, -33286, 114890, -13422, 49929, -55298, - }, - { - -5155572, 27065274, 23555748, -7904351, -8467528, 2016487, -1695975, -869194, 1475321, -407485, - 4059818, -4646081, -1914482, 2301029, -440234, 9664, 267899, -9204115, -5073430, 349503, - -7516730, 1118839, -2068564, 2799782, -665183, -733366, -69793, -1035087, -3380676, -2044941, - 2063195, 505732, -790811, -1200443, -2025614, 2227478, 270583, -3451543, -295279, -1709397, - -740882, 554051, -1311576, 520765, 222801, 488553, -1419487, -861678, 439697, 177704, - 287226, -660351, -210453, 270046, -122943, 490163, 537, -291521, -95026, -74088, - -169114, 970663, -331249, -152471, -456877, 308701, -899259, 254477, -246424, 121333, - -484794, 29528, -34360, -223338, -281857, 184147, 236760, 223338, -276489, 92342, - -56908, 141197, -64961, -153008, 59056, -177704, 238908, -276489, 173946, -9664, - -18790, 113280, -16643, -80531, 122943, 77846, - }, - { - -2134599, 142359376, -11998528, 12627204, -124017, -300111, 638340, -1012539, 832687, 915365, - -155693, 3389803, -1909113, -4025995, -3284039, 2389613, 1648194, 5205501, 3885872, -900869, - 1138703, 1627793, 1094680, -436476, 1374390, 1441498, -504122, 679142, -1237488, 1127429, - 104690, -556735, 475668, 113280, 492848, -857383, 1840930, -289910, -617402, 3110093, - -1213865, 171799, -1926830, 481573, 800475, -457414, -360240, -245350, 919660, -140660, - 579284, -946503, -329639, 151398, 410169, -199179, -111669, 513785, -378494, 433255, - 397284, -135291, -178778, 149787, 45097, 90731, -59593, 275952, 6979, 366683, - -90194, -412317, -168577, 18254, 254477, -140660, 56371, 226560, -1074, 114890, - 49929, 280784, 3221, -26307, -51003, -67109, 66572, -73014, -128312, 160524, - 10737, -8590, 36507, -80531, 168577, -81068, - }, - { - 1142998, -559420, -2865817, -198105, -146029, 117575, 1078037, 328028, 862752, 544387, - -637803, -593242, 1715303, 768262, 6021544, -7410429, -4909148, 23011898, -22001506, 1149441, - 1023813, -2033130, -3054796, -1765768, -1137630, 919660, 1407676, 3518652, 438087, 2113661, - -1517197, 1291175, -730144, 2805688, 1043140, -1223529, -143345, 1328219, 3008625, 1806034, - -1224066, -133681, -1226213, -472446, 732292, 293132, -1589138, 645319, -628676, 1092532, - -1020055, -501437, 930397, -650151, 416612, -213675, 822486, 238371, -167504, 461172, - 361851, -421981, -269509, 808528, 136365, -120796, -106300, 329102, 35970, -69256, - -73551, 246424, -178778, 452045, 93952, 290984, -88047, 402116, 228707, -173409, - 97711, 3758, -44560, -31139, -41876, -191126, 162672, -129386, 67646, 209917, - -102542, 126702, 4295, 537, -103616, 26307, - }, - { - -15321759, 269466784, -16434692, -4959614, 4298726, -399969, -259846, 1568737, 1854889, -344134, - 1586990, -604517, 440234, -761820, 3055869, -610422, -5362267, 911070, 1584843, -479963, - 1668058, -545461, 901406, -1024350, 976031, -889058, 90194, 2684, -570157, 669478, - 1205275, -1638530, -1473711, 910533, 475131, 1344325, 263604, -23085, 1459215, 482110, - 2836826, -461172, 492848, -861678, -3619047, 608275, -1926830, 2059974, -685047, -25233, - 956704, -663572, 1276679, -51003, 450435, -333397, -78920, -541166, 389768, -127775, - -666257, 921271, 281320, 13959, -294205, 199716, 92879, -83215, 27380, -322123, - 244276, -175557, 354872, 35970, -217433, -53150, -15569, -105764, 35433, 325881, - -88047, 114890, -55298, 164819, -111669, 247497, -120796, -95026, 76773, -58519, - -59056, -217433, 105227, -174483, 127775, -25770, - }, - { - -293132, 8510478, 2100239, 1056025, 206158, 67646, 763967, 246424, -459025, 45097, - -6979, 318364, 1176821, 3953518, 11051488, 2803003, 822486, -3366718, 4357245, 3786014, - 2375117, -3952981, 5333813, 4446365, -432718, -109522, 2332704, -615254, -3335579, 287226, - -387084, 2996814, 859530, 2147, -596464, -784368, 1003949, 303869, 81604, 705985, - -1102196, -1081795, 1366337, 212601, -1552094, -207769, 72478, -81068, 338229, -1291711, - 499827, 37044, 213138, 389231, -108448, 1103270, -698469, 120796, 499290, -288300, - 155693, -333397, -250719, 355945, 324807, -733903, 166430, 139586, -101469, 321049, - 31139, -46171, 164283, 185757, 99321, -199179, 90194, -87510, 62277, 121870, - -300648, -98784, 212601, -147640, 35970, 30602, 95563, -71404, 15032, -107374, - -183073, -20401, -33286, -49392, 38118, 33823, - }, - { - 4777078, -186416608, 31012886, 3188476, 3581466, 620623, -988916, 1124208, 240518, -31675, - 2352032, -1982664, -300111, -3304977, 2558190, 818728, -815507, -5369, 1386738, 591095, - -3133179, 1044751, 1654636, 2392834, 696322, -988916, 1414655, -313533, -321586, 876173, - -452045, -1533840, 1913408, -2842732, 1160178, 3336653, -670552, 1733556, -125091, 2970507, - -1692754, -449361, -1384053, 213675, 1528472, -146029, 455803, -1090922, 617402, 638876, - 113280, -35433, 1229971, -957778, 807454, 536334, -586800, -253940, -266288, 452045, - -712428, 40802, -21475, -175557, 613643, 207769, -320512, 279710, 63888, -243739, - -160524, 118648, 903017, 216359, -70867, -242666, 256624, 184684, 69256, -174483, - 333397, -101469, 155693, -98247, -26844, 28991, -23085, 90194, -177704, 141197, - 48855, 22549, -163746, 185757, -181999, -51003, - }, - { - -207232, 8127152, -7565048, -2545842, -81068, -61203, 619012, 784905, -70330, -78383, - -486942, 122407, 1910187, -3208878, -9310952, 25233, -5782100, 9809705, -5870147, -215822, - -2207076, 2646237, -487479, -137439, -1124208, 2422899, 1557999, -690416, -668404, 1047435, - -1030255, -1591285, 818191, -1428077, -984084, 153545, -2045478, -847719, -231391, 1264331, - -1042066, -775242, -124017, 552977, -1498407, -577136, -681289, -652298, 1219234, -1065689, - 317291, -83215, 125091, -205085, -359167, -206158, -301185, 1081258, 380641, -358093, - 419833, -758062, -186831, 82141, 460098, -224412, 81604, -363998, 179315, 657667, - 165356, 186831, 59593, -145492, 226560, -195958, 144418, 176631, 41339, 77309, - -6979, -422517, 172872, -93952, 118112, -55298, 187368, -72478, -68183, 24159, - 4295, -182536, 93952, -62277, 180389, -8053, - }, - { - -10336376, 26012470, -6486475, -3463891, 2806224, 2924873, 4871030, 1088774, -491237, 2950106, - 214212, -2973191, -892816, -218506, 1375463, -1043140, 8009577, 2654827, -914828, 90194, - -1709397, -906775, 3083787, 1442035, 1066763, 2152316, -188442, -1797981, 1577327, 1056562, - 1029718, 2190970, 1737314, -2423435, 74088, 1377074, -1861332, 581968, 1458141, -369367, - 544387, -958851, 434865, -765578, -576599, 99321, 450972, -452582, -1563905, 879395, - -774168, 369904, 183073, -346282, -47245, 646929, -201327, -98784, -239444, 293668, - 477815, -102005, 92879, 191663, -434865, 545461, -525597, 80531, 98784, 22012, - 240518, 99321, 86436, 59593, 79457, -167504, 140123, -122407, 249645, -56371, - -194884, 28454, 114890, 30602, -33823, 137976, 63351, -44023, 25770, 107911, - -147103, -47245, -10201, -45634, 43487, -26844, - }, - { - 246961, 5611912, -2697240, -2069637, 1749662, -377420, 1915019, 1202054, -93416, -1722819, - 2483028, -2052458, -2121714, 8898098, -4349192, 2168959, 2457795, 605054, 3144990, -3378529, - 3410741, 2424509, 3126736, 761283, -2096481, 1176284, 742493, 2797634, 517544, 455267, - -2011655, -3707631, 3435974, -1308891, -1860795, -2626909, -2829310, 1225676, -561030, -679142, - -1286880, -410169, 1926293, -770410, -329639, 254477, -1694902, 742493, 350577, 258235, - -360777, 97711, 81068, 303869, 1136019, -173409, -578210, -258235, -396211, 263604, - 943282, -480499, -151398, 305480, -83752, 17180, 393526, 123480, -169651, 440771, - -207769, -202400, -65498, 148713, -186831, -169651, 48318, -3758, 57982, 37044, - -70330, -119722, 105227, -214748, 12885, 43487, -178241, 71941, -7516, 20401, - 107911, 1611, -99321, -10201, 43487, 37044, - }, - { - 9080098, -58520004, 3062849, -1701344, -1791001, -4600984, 3753265, -39192, -700080, 2505040, - -3226057, 3712462, -2844879, -5111011, 927713, 1240709, 1020592, 2197413, 1167157, -1190780, - 60130, -2192581, 107374, 201863, 180926, 2111513, 939524, -446677, -1278290, 766115, - -76773, -125628, 497142, 135291, 91268, -1296006, 1301912, 13959, 957778, -830002, - 567473, -176094, -281320, -1209570, 1997697, -636192, 105764, -28454, 1498944, -129923, - -481036, -550293, 35970, 501437, -249108, 1391033, -85899, 33286, -233539, 411243, - -395674, 56908, 19864, 47782, 73551, -18790, -13959, -325881, 172336, 44560, - -32212, 97174, 214748, 128312, 24159, 30602, 130460, 146029, -142808, 222801, - 2684, -13422, -34360, 106837, -122407, 44560, -129923, -120796, 99858, -98247, - -6979, 50466, 57982, -87510, -33286, 81604, - }, - { - 542240, -7679939, -4013647, 338229, -1650878, 213138, 339839, -663572, 1716376, -297963, - 1277216, 2179696, -11708618, 29821568, -6635188, -4295504, 2689723, 175020, -1453310, 2058363, - 1984275, -3768834, 8977555, -840740, -2471217, 2631204, 1813550, -4074313, -1187022, 553514, - -2456721, 1076426, -1154809, -811749, -1262184, 161061, 38118, 803696, 511101, -492311, - 2444910, 814970, -1603097, 16106, -1996623, 402653, 787590, 518617, -384936, -973884, - -24159, -717796, -415001, -721018, 580894, -563714, -65498, -332860, 409633, -491237, - 380641, -467615, -522375, -187368, -484258, -56371, 213138, -343597, -645319, 63888, - 11811, 37044, 358630, 42950, -91268, -141734, -84826, -63888, -142808, 56371, - -17180, -226560, -129923, 76773, -16106, 46171, 57445, -153545, 221191, -49392, - 86436, 139586, -11811, 70867, 59593, -8053, - }, - { - -2728915, -54953032, 933082, 1498407, 1345399, 7738458, -6627135, -799938, 918049, -200790, - 3778498, 33286, 52613, 784368, -21100638, -2071785, 6031208, 2624762, -1901597, 3103651, - -1520955, 1044214, -1149441, 470836, -308164, 3221, 1030255, 1560684, 1442035, -1212791, - 1480153, -1198296, 631897, 128849, 118112, -424128, -299574, 817118, -357556, 8590, - 137439, 1509144, -423054, 281320, -1049046, -77846, -687195, -282394, 379568, 438624, - 112743, -702227, 1076963, 168041, -231391, 446140, -760746, 566936, -506806, 637266, - -515396, 148176, -491774, -406411, -186294, 38655, -83215, -79994, 156229, 261456, - -370978, 235149, -335007, -290984, 176094, -85899, 33823, -20938, 69793, -8590, - 31139, 133681, -266288, 112743, -142808, 314069, 224412, -53687, -169651, 81604, - -106837, 118112, 89657, 7516, 117038, -112743, - }, - { - -464393, -6464463, 1620276, -840740, -243739, -255551, -102005, -964757, -1478006, -2089502, - -1631014, -1285806, 2172180, -6696391, -46322832, 3498788, 5035313, -4495220, 3658239, 1643362, - 1458678, 898722, 2986076, -4527970, -476741, 2374580, -3849365, -159451, 811212, 2274722, - -729608, 1092532, -665720, 1962800, -1738925, 811749, -401579, -391916, 637803, 197032, - 1299765, -445066, 1088774, -875636, 537, -263604, -260919, -726386, -176094, 1099512, - -1258425, 301721, 92342, -1882269, 797790, 105764, 693637, -536871, -227096, 334471, - 241592, -466004, 89657, 359167, -51540, 79994, -10737, -161061, 456340, -136902, - -71941, -73014, -78920, 169651, -26844, -17717, -224412, -78920, -106837, 169651, - -208843, 85362, 98784, 9664, 4295, 143881, -88584, 11274, 36507, -118112, - -55835, 64961, -31675, 75699, -178778, -57982, - }, - }, - { - { - -10386305, -38035156, -2546916, -6651294, -3600256, -887985, -835908, -2153926, 887985, -499290, - -2794950, -1761474, 156766, -937914, 460098, 142808, 1477469, 150861, 934155, -4735739, - -1108102, 1065689, 440771, 779537, -263604, -280784, 2529736, 1247688, 286152, -406948, - -369904, -249108, -365072, -235149, -519154, 37581, 58519, -1227287, -280784, -238371, - 115964, -695785, 323196, 513785, 338766, 1290101, 1520418, 906238, -50466, -365072, - -537945, -387084, 127238, 442919, 264677, 274341, -9664, 725850, 368830, 102542, - -263067, -32212, 408559, 362925, -261456, 394063, -299037, 186831, 141734, 79994, - 121870, 51540, -104690, 176631, 49392, 19864, 14496, 124017, 86436, -198105, - -184684, -33286, 32749, -79457, -99858, 116501, -1074, -6979, -25233, -42413, - -22012, 66572, -57445, 38118, 74088, 39728, - }, - { - -1562831, -17983028, -4020626, -1478006, -3164854, -359704, -682363, -833224, -552977, -201327, - -45097, -665720, -1308354, 74088, 3042448, 1457605, 1034013, -1293322, 620623, -540092, - 1439351, -1826435, -231928, -869731, 1649804, 125628, -1042603, 162135, -2290828, -992137, - -1385127, 966905, -758599, -450972, 1195612, 1054951, 2120640, 1032403, 196495, 1165010, - -521302, -457414, -97174, 288837, 272730, 187905, -394600, -534187, -343597, -350577, - 61203, 247497, 257698, -149250, -308701, 560493, 183073, -124017, -268435, 301185, - 3758, -479426, 67109, -107911, -122407, 13959, 159988, 28991, 122943, 77309, - 97174, -44560, 62277, 11811, -270046, -114354, 76773, 32749, -87510, -163209, - 68183, 183073, 139050, 4832, -7516, -58519, -29528, 23085, -83215, -19327, - 56908, 30065, -12885, -61203, -42950, 21475, - }, - { - 6691559, 52292300, -5473936, -15159624, -4165582, -119185, -865973, -143881, 573378, 2682744, - -201327, -4393215, -784905, 1069447, 556735, -2812667, -133144, -3419331, -5475010, 81604, - -6421513, 648003, 220654, 1225676, 478352, -1021129, -838592, -851477, -2574296, -1146756, - 66572, 398358, -688805, -248034, -868657, 588411, -934155, -881542, -741419, -1263794, - -862215, 491237, 40802, 81604, -244813, -683437, -335007, -785442, -24696, 438624, - -13422, -661425, -661962, -211527, 249108, 650151, -223875, 180389, -196495, 202400, - -211527, -108985, 19864, -208843, -41876, -251256, -376347, -169114, -62277, -57445, - -229244, -174483, -384936, -41876, -69793, 145492, 311922, 41339, -151398, 146029, - 78920, 37044, -116501, -68719, -31675, -127238, 16643, -44023, 41876, 18790, - 103616, 69793, 104690, 12348, 51003, 34897, - }, - { - 12407624, 89098560, 15500537, 8785892, 1029718, 534187, -344134, -408022, -47245, 1065689, - 1341640, 956167, -907849, -2173254, -1176284, 474594, 2818036, 5554467, 1096290, 8590, - -213675, 2229088, 527744, 802085, 1353452, 1521492, -41339, 396211, -678068, -367757, - 244813, 682363, -486405, -142271, 37581, 366683, 272730, -120796, 281857, 1089848, - 234613, 170188, -1328219, -226023, 171799, -461172, 18254, -134218, 1089311, 398895, - -401579, -420370, -23085, -346282, -168577, 18790, 45634, 349503, 14496, 294205, - 170188, -332860, 117575, -16106, -21475, -144418, 187368, -17180, 108985, 201863, - -19327, -117038, 113280, 81604, -51003, -112206, 11811, 118648, 138513, 7516, - 110595, 114354, 83752, -41876, -45634, 24696, 65498, -76236, 38118, 2147, - -4832, -60130, 51540, 537, 11274, 57982, - }, - { - -1291711, -1812476, 1008780, -23085, -385473, 324270, 985158, 10201, 362388, 284542, - 420907, 392990, -981937, -1118302, 4138738, 640487, 2495376, -6709276, -514859, -674310, - 2381023, -2223719, -4545686, 540629, 1066763, 877247, 1098438, 1328219, 1239098, -592169, - 1003949, 1848983, 615254, -97174, -260382, -537, 221728, 1292785, 2268817, 1027571, - 119185, -1146756, -223338, -206158, 31139, -641561, -913754, -316217, -178778, 126702, - 124017, -251256, 18254, 129923, 37581, -120259, 515396, -125628, -271657, 460098, - 179852, 100395, -45097, 245350, -179852, -413391, 197032, 88047, 150861, -27380, - -200790, 268435, 174483, 55835, 147103, 126165, 154619, 169114, 73551, -60130, - -4832, 47245, 76773, -95026, -44023, -33823, -55835, 29528, 5369, 103079, - 45634, -36507, -3758, 10737, -9127, 19864, - }, - { - 28201292, 164564352, 19489488, -2960306, 1283658, 1060857, 232465, 156766, 1685238, -176631, - -1067836, 803159, 218506, 658204, 530428, -34360, -2258079, -224412, -146566, 542240, - 612570, -367757, 1278827, -347892, 278636, -842887, -159988, -78383, -746251, -25233, - 1425392, -1134945, 114354, -739271, 2059974, 820876, 586263, 11811, 845035, 1029718, - 858457, 15569, -522375, -1724966, -1200980, -559956, 203474, -78383, -91805, 548682, - 78920, 212064, 415001, 28454, 302258, -146566, -194347, -549756, 510564, 162672, - -337155, 377957, 48318, -29528, -209917, 57982, 24696, -14496, 167504, -278099, - -57445, -30065, 47782, -33286, 13959, -149787, -58519, 27917, 87510, 139586, - 11274, 162135, 121870, 105764, -10201, 2684, -1074, 4832, -52613, -12348, - -137976, -77309, 8590, -13422, 45634, -32212, - }, - { - 556198, 5025112, 2357400, 1250372, 1074, 169651, 670015, -20401, -261456, 145492, - -437550, 525597, 28454, 5031554, 9241696, 3591130, 1991254, -322659, 1596654, 7669201, - 2279554, -908922, 3329674, 3437048, -2229088, 1185411, 1836635, -1546188, -1739999, -653372, - 1286880, 744640, 359704, 1125281, -435939, 366146, -116501, 369904, 406411, -455267, - -372588, 125091, 261456, -605054, -547071, -199716, -122943, 199179, 88584, -535260, - 69256, 57445, 219043, -100932, 440234, 147103, 241592, -134218, 159451, 457414, - -40802, 178241, -91805, 314069, -98247, 78383, -90194, -185757, -87510, 398895, - 323196, -86436, -155693, 200790, -121333, -165356, 43487, 30065, -3758, -126702, - -171262, -74088, 96637, -6442, 18790, -41339, 83752, 40802, 19864, -83215, - -42413, 16643, -53150, -49392, 43487, 16106, - }, - { - -12950937, -105440376, -5204427, 3141769, 897111, 203474, -738734, 923955, 139586, 227096, - 594316, -730144, -370978, -1086627, -559420, 1063541, -745177, -544387, 653909, 802085, - -1503775, 432718, 0, 1933272, 950262, 19327, -116501, 651761, -886911, 99858, - -155693, 691490, 381178, -1619203, -505196, -3758, 416612, 1533840, 1268626, 188442, - -851477, -914291, -358630, 801548, 1061931, -324807, -190052, 650151, 62277, -289910, - 472983, -153545, 589484, 493921, -195421, 264677, -221191, -266825, 228170, -186294, - -154619, 22012, -309238, 80531, 513249, -14496, 20938, 47245, 73551, 144955, - 37044, 161598, 491774, 113280, -155693, -63351, 202937, 30602, 132070, 124554, - 62277, 119185, 69256, 42950, 19327, 43487, 10201, -125628, -106837, -5369, - 104690, 26307, -33823, 0, -89657, -100395, - }, - { - 974958, -3587908, -3367791, -319975, -705985, 171799, 542777, 489089, -2684, -590021, - -921271, 1246614, 229244, -955093, -6659347, -3337190, 1968706, 1004486, -621697, 1678259, - -2432562, 957778, 452582, 2388002, -1096290, 644782, -627065, 467078, 819265, -673773, - -2782602, -320512, 115964, 431644, -748935, -1535451, 53150, -1442572, -1022739, 746251, - -1069984, -621697, 172872, -1105954, -1218160, -163209, -589484, -130460, -409096, 512175, - 168041, -134218, 551903, -350040, -629213, -196495, -71404, 2684, 231391, -20938, - 168041, -15569, -264141, 233002, 554051, 340913, -214212, -68183, 104153, 280247, - 427886, 179852, 86973, 55298, -185220, -73014, 120796, 37581, 108448, 41876, - -9127, -92879, 142808, -7516, -57982, 48855, -60130, -148176, -68183, -16106, - 12348, -41876, 17180, -33286, 16643, -5906, - }, - { - 8521752, 11991549, -8935143, -2181307, 229781, 3811247, 4931696, 2001455, -878858, 745714, - 99858, -3234110, 466541, -1340030, -1451162, 1029718, 3168075, 3577708, -671626, 90194, - -1120450, 934155, 1784022, 1736777, 865973, 801011, 385473, -69793, -173409, 1471563, - 1765232, 2500208, 673236, -1330366, -1502702, 388695, -1141388, 937377, 617402, 597537, - -922881, -452045, -92342, -621697, -309775, -540629, -338229, -188442, -795643, -1010928, - 149787, 314606, -345745, -79457, 218506, 428423, 124017, 68719, -78383, 8590, - 374199, 236760, -16106, 41339, -200253, 46708, -61740, 85899, 98784, -58519, - -23622, 282931, 84826, 70867, -25233, -19327, 47245, 4832, 61203, 93952, - -11811, 26844, 46171, -44023, 12885, -24159, -52613, -6979, -60666, 25233, - -46708, -37044, 6979, -2684, -25233, -55835, - }, - { - -727997, -766115, -231928, 3014530, -475668, 90194, 1381906, 671089, 14496, -929860, - 863288, 702764, 1198296, 2377265, -1057099, 2969433, 1067836, -675921, 1220308, 1092532, - 2389613, 547608, 3138547, 597537, -913217, 756988, 402653, 680752, 328565, 436476, - -1548336, -75699, 617402, -149787, -2617246, -2456185, -630823, -379031, -230854, 74088, - -1089311, -105227, 178778, -457414, -28454, -588947, 53687, -209917, -271120, 440234, - -115964, 18254, 141197, 850940, 1002338, -177167, -385473, -140660, -380105, 227633, - 308701, -258772, 88584, 86436, 90194, -134218, 13422, -28454, 12885, 97711, - 69793, -219043, -133681, 78383, -222265, -106837, 148176, 192200, 92342, -55835, - -34897, -40265, -60666, -30065, 72478, -15569, -79994, 15032, 79994, 85362, - 55835, -8590, -45634, -57445, 34897, 8053, - }, - { - -9929428, -23024246, -3331284, -1228361, -2482491, 1537061, -716186, -590558, -284542, 1625645, - 1170379, -37044, -1074279, -1144609, -289910, 1567663, 663036, 1062468, 1250372, -198105, - -701153, -1386201, -724239, 6979, 1180042, 466541, 539555, -357556, -616865, 902480, - 1374926, -827318, -384400, 219043, -18790, 486405, 769336, 1370095, 876710, -129923, - -420907, 179315, -2062121, 796180, 762894, 47782, 454193, 16643, 438624, 26307, - -383863, 42413, -256624, 34360, 162135, 657130, 105227, -187905, 146566, 249108, - -76773, -9127, -22549, 35433, -67646, -57982, -18254, 115427, 66035, -115964, - 57982, 170725, 102005, 26307, -30065, 105764, 86436, 143881, 77309, 4832, - 81604, -9127, -61203, -15032, -48318, -37581, 49392, -127775, -30065, -82678, - -50466, 34897, -18254, 0, -46171, 7516, - }, - { - -442919, -6296422, -1962800, -2394444, -1560147, -159451, -698469, 91805, 401043, 1336272, - 424128, 381715, 7568269, -1747515, -1123671, -4061429, 232465, -288837, -61740, -140123, - 2595234, -3158949, 6418292, 1057636, 1797981, -1678795, -431644, -817118, -2999498, -631897, - -860067, 499290, -583579, -1034550, 846109, 256087, 797790, -460635, 315680, 456340, - 1119913, 282931, -938987, -38655, -836982, -746787, 230854, -233002, 189515, -361851, - -551366, -792958, -685584, -530965, 193274, -172872, -488016, 78920, 31139, -157840, - 578210, -364535, -753767, -553514, -201327, -94489, 88047, -350040, -259846, 34897, - -91268, 184684, -70867, 161061, 94489, -279173, -231928, -166967, 123480, -54761, - 58519, -62277, 10201, 158377, -59056, 10201, -63888, -87510, 91268, 108448, - 28991, 50466, -56908, 47782, 67109, 4832, - }, - { - -4954782, -40358732, -5492190, 2629057, 1809792, 1478543, -1079111, -12348, 859530, 385473, - 2652679, 289373, -241055, -6094022, -7178501, 1079111, -12885, 2139968, 1844689, -528818, - -412317, 886374, 279173, -1255741, -590558, -490163, 1251983, 1189706, 1076426, -1255204, - 537945, -750546, 314606, 1464047, -984084, 647466, 61740, 1117228, 227633, 301185, - -108985, 1318555, -308164, -162672, -196495, -461172, -108448, -683974, 246961, 302258, - 312996, -213138, 250182, 529355, 268435, 495532, -97711, -12348, -290984, -51003, - 214212, -242666, -327491, -5906, -18790, 57982, 139050, -28454, -25770, 97174, - 164819, -114890, -124017, -115427, -31675, 82678, -23085, 9127, 69256, 179852, - 91805, 19327, 10201, 119722, -5369, 108985, 115964, -19864, -100395, -32749, - 19327, 74625, 33823, 41339, 56908, -80531, - }, - { - 237834, -3848828, -1644436, 230854, -1306207, 285615, -172872, -712428, -1265942, -1042066, - -1495186, -600759, 2248416, -15369004, -30295088, -1999844, 2505577, -925029, -876173, 7165079, - 2663954, -1839320, -494995, -2107755, 744103, -352187, -1760937, 118648, 826781, 2647311, - -1423245, 622233, 196495, 93416, -878321, -291521, -482647, -505732, 852014, 787590, - -389231, -119185, 511101, -586263, 14496, 265751, -293668, 92342, -846645, -193810, - -102005, -317828, -257698, -533650, -2684, 202400, -43487, -490700, -86436, -6442, - -73014, -244813, 350577, -19864, 47782, 41876, -51003, 192737, 85899, 49392, - -78383, 11274, -64961, 110059, 6979, -84289, -60666, -185220, -96637, 63888, - 9664, 56371, 66035, 55298, 20938, 37581, -78920, -28454, 43487, -56908, - -54224, 46171, 11274, -70867, -88584, -80531, - }, - }, - { - { - 11484743, 7770133, 20168092, -4594542, 709743, 133144, 5369, -982474, 658741, -327491, - 941135, 776852, 476741, -722628, -504659, 117038, -97711, -1777043, 2758443, -2067490, - -306553, 525597, 211527, -266288, -221728, -355945, 1306207, -505196, -376883, 230854, - 411243, -688805, 370978, 150861, 14496, -554588, 187905, -244276, -146029, 511101, - 399432, -593242, -21475, -321049, -543850, 697395, -13422, 549756, 423591, -261456, - -209917, -231928, 95563, 223875, 97711, 142808, -78383, 452582, 146566, -97711, - -121870, -179315, 88584, 87510, -208843, 493921, -292595, 184147, 118112, 41876, - 15032, -62277, -11811, 33823, -69793, 67109, 78920, 133681, -100932, -74625, - -73551, 19864, 100395, 39192, -41876, 16643, 79994, -1611, -14496, -10737, - -3758, -39192, -10201, 19327, 13959, -37044, - }, - { - 1934346, -16189879, -1743220, 3030636, -363998, 255014, -270583, -61203, 228170, -401579, - 193274, -103616, -1009854, -1615445, 1859721, -2202245, -424665, 434865, 5582921, 1784022, - 835371, -1468879, -489626, -1331977, 275415, 208306, -1200980, 1096827, -862215, -1154809, - -661962, 832687, 391916, 872952, 523449, 767725, 242129, -591632, -99321, 532039, - -602369, 103079, -111669, 484258, 26844, 172336, 41876, 307090, -165356, -83752, - 272194, -31675, 8053, 40265, -13422, 253940, 92342, 42413, -197032, 1611, - -64425, -114354, 182536, 104690, -188442, -53150, 84289, 93416, 64961, -18790, - -43487, 149787, 216359, 148176, -147103, 107374, 125628, -15032, -86436, -166430, - 53687, 68183, -8053, -50466, -34360, -88047, -4295, 52076, -54761, 45634, - 47245, 15569, -80531, -37044, -11811, 46708, - }, - { - -5878737, 38694436, -3030100, -9038759, 2689723, 1060857, -523986, -44560, 5369, 807454, - -1646583, -1556926, -137976, -140123, 2935073, -1807644, 695785, 425739, -343597, 2557653, - -1022739, 2219961, -1295470, -7516, 163209, -1531156, -632971, 434865, -168041, 780610, - -200253, 519691, -170188, 382789, 507880, 324807, 249645, -67109, -417686, -82141, - -217970, 545998, 144955, -91268, -388158, -541166, 157303, -481036, -134218, 251792, - 30065, 97711, -188979, -147103, -1611, 382252, -299037, 230854, -213675, 238908, - -263604, -324270, 312996, 227096, 64425, -251256, -93952, 51003, 99858, 37044, - -21475, -37581, -246961, 153008, 98784, 90194, 18254, -117575, 65498, 165893, - -63351, 20938, -6442, -61740, -57982, -89121, 0, 59056, 30602, -10737, - 86436, 13422, 28454, 52076, 8053, -14496, - }, - { - -14889578, 30404074, -475668, 6350109, -361851, 302795, 177704, -155693, -68183, 1244467, - 1107028, -907849, 382789, -486942, 448287, 501437, -279173, 2474438, -272194, -445603, - -739271, 671089, -316754, 388158, -310311, -356482, -1399623, 872415, -224412, -305480, - -121870, -77309, -405874, 199716, -98247, 242129, -406411, 37044, -15569, 430034, - 333934, 292058, -338229, -293668, -370441, -99321, 628676, -242666, 628676, 38655, - -474594, 125628, 47245, -268435, -157303, 155693, 119185, 130997, 19327, 72478, - -87510, -330712, 194347, -95563, 91268, -95026, 48855, -27917, 15032, 77309, - 77309, 80531, 118112, 32749, -48318, -92879, -4832, 9127, 36507, -95563, - -6442, -55298, 44023, -53687, -48855, -17180, 0, 35970, 49392, -76773, - -16106, -27380, 27380, 3758, -11811, 68719, - }, - { - 937914, -644245, -1037235, 53687, 195958, -83215, 316754, -16643, -37044, 337155, - 639950, 421444, -1766842, -52076, 4318053, -235686, 993748, -10093710, 7726110, 360240, - 2186138, -72478, -1459215, 752156, -704912, -993748, -710280, 82141, 175557, -62814, - 485331, 681826, -338229, -551903, -999654, -864899, -71404, 379031, -90194, -87510, - 758062, -705448, 361314, 213138, -59593, -425739, -600759, -352187, 228707, -75699, - 570694, -1611, -376883, 335007, -69793, -89657, -54224, -232465, -33823, 175557, - -310311, -5369, 13422, 162672, -44560, -141734, 207769, -129386, -4832, 37581, - 73014, 138513, -47245, -202937, -40265, -84289, 82678, -21475, -38655, -26844, - -34897, -24159, -19327, -90194, 86973, 3221, -54224, 54761, -68719, 21475, - 16106, -92342, -3758, 51540, -14496, -1611, - }, - { - -28696288, 53993644, -3640522, -3054259, -397821, 396211, -457414, -192737, 190589, -704375, - -285615, 462246, 764504, 819265, -1127966, 755914, -83215, 83752, -325881, 96100, - -168041, -77846, 1148367, -134755, 376347, -350040, -481036, 343597, -887448, -346819, - 1027571, -98247, 537408, -2145873, 894427, -273804, 963146, 505196, 416075, 25770, - -842887, -152471, -23622, -200790, 757525, 334471, 747861, -326954, -177704, 136902, - -59593, 13422, -259846, -166430, 376883, -54761, 1074, -301721, 315143, 181462, - -208306, 45097, -121870, 33286, 133681, 18790, -53687, 74088, 156766, -27917, - 60130, 55835, -73551, -78920, 135828, -145492, 66572, 80531, 85362, 2147, - -61740, 112206, -27380, 1074, 23085, -63351, 35970, -20938, 24696, 8053, - -70330, -4832, 49392, 64425, 6979, -59593, - }, - { - 87510, 731755, 86436, 50466, -231391, -137439, 181462, -157840, 49929, 1074, - -373662, 306553, 804233, 45634, 1240172, 1839857, -415001, 190589, -1501628, 936303, - -781147, -2582886, -1147830, 1814087, -373125, 455267, -657130, 113817, -1200980, -515396, - 1370095, -343597, 53687, 718870, 254477, 811212, -36507, -90194, 79457, -341450, - 241592, 357556, 49929, -460098, -201327, 279710, 231391, 170188, 199179, 24159, - 274341, -53150, 63351, -109522, 72478, -336618, 142271, -209917, -193810, 318364, - 92342, 459025, -149787, 107374, -102005, 272194, -79994, -103079, -97711, 200253, - 90731, -93952, -69793, 143345, -126702, 30065, 21475, -65498, -41339, 1074, - 14496, 30602, 62814, -9664, -8053, -29528, 83215, 47245, 70330, 16106, - 53150, 20938, -20401, 41876, 23085, -20938, - }, - { - 13999446, -47897476, 2852932, 1740536, -504659, -79994, 58519, -507343, -63351, -42950, - -579284, 312996, 280247, 46708, 925029, 1068373, -328565, 620086, -313533, 471373, - -45634, -270583, -1086090, 644782, 592169, 466004, 40802, 667867, -436476, -424128, - -506269, 493384, -67646, -403190, -28454, -1315871, -401043, 146029, 16106, -60130, - 209917, -339839, -57445, 654983, 251792, -79994, -48318, 480499, -1059246, -866510, - 224949, -89657, 257161, 263604, -257161, 56908, -120259, -11811, 272730, -56908, - 9664, -208843, -387621, 129386, 289373, -255551, 6979, -60666, 39728, 143881, - -1074, 13422, 84289, -83215, -29528, 55298, -17180, -7516, 121333, 56371, - 18254, 62277, -52076, 34897, 35433, -5369, 20938, -23085, -10737, -19327, - 29528, -15032, -29528, -19327, 8590, -39192, - }, - { - 62277, -8417599, -867583, 731218, -104690, 245887, 144955, 44560, 116501, -20938, - -538482, 1156420, 83752, 2975339, 744640, -13959, 3491809, -1774358, -1058173, 3130494, - -732292, -1170916, 925565, 2180770, -588411, -83215, -2584497, 719944, 397821, -718333, - -1831804, 432718, 445603, 613643, 541703, -329639, 512712, -1181116, -576063, 59056, - -498753, 60666, 47245, -549219, -382252, 328028, 161061, 375273, -655519, 554588, - -32212, -386547, 220654, 96100, -40265, -10201, -98784, -322659, 167504, -63888, - 161061, 320512, -163209, 91805, 151934, 124017, -156766, -33286, 5906, -66572, - 56908, -51003, -63351, -66035, -66035, 63351, 79994, -20401, 44560, -45634, - 69256, 60666, 15032, 2684, -14496, 41876, -73014, 5906, -7516, -66035, - 20401, 30065, 0, -8590, -32212, -35970, - }, - { - -6302865, -1666447, 2161442, 102005, -658204, -3422552, -2270964, 1365263, -1679869, -446140, - 969052, -1762010, 1201517, -321586, -566936, 1090385, -1570884, -154082, -208843, -267899, - -1428614, 529892, 420907, -27917, -656056, 60666, 70867, -91268, -566936, 58519, - -772020, 114354, 199716, 276489, -315143, 792958, -457951, 525597, 180926, 24696, - -751082, -133681, 580357, -12885, -221191, -347892, -95026, 156229, -27917, -456877, - 261993, 118648, -371515, 106837, 245350, 111132, 110595, 175557, -49929, -156766, - -309775, 12885, -57445, 196495, -26844, -223338, -25770, 15569, -62814, 122407, - -141197, 21475, -115964, 177167, -53150, -11811, -28454, 125628, 22012, 130460, - 40265, 61740, -70330, -70330, -53687, -77846, 3221, 31139, -82678, -16643, - 16643, 55298, 20401, -27380, -31675, -39192, - }, - { - 647466, -1574106, -927176, 5281736, -337692, -441845, -277025, -184147, 371515, -603980, - 376883, 1461900, -696322, 901406, -2499134, 2083596, 382789, -4476430, -528818, 3076270, - -202400, -1638530, 1430224, -420370, -539555, 391916, 129386, -5906, 195958, 212064, - -339302, -82678, -846109, 87510, -309775, -24696, 745714, 98247, 233002, 341450, - -559420, 62277, -179852, -226560, 197032, -434865, 600759, 78383, -419833, 74088, - 146566, 63351, 11811, 419296, 282931, -130460, -166430, 9664, -39728, -35970, - -366146, 10737, 277025, -49929, 74625, -6979, -131533, -110595, 97711, -78920, - -1074, -63888, -109522, -18790, -61740, 83752, 53150, 79457, -23085, -15032, - -537, -33823, -98247, 45634, 60666, -33823, 35970, 41339, 17717, 2147, - 19864, 11274, -537, -19864, -12348, 16643, - }, - { - 5807870, 3173981, 672699, 325344, -2535105, 2422362, -942208, -227633, 4295, 565862, - 1289564, -811212, 914291, 1416802, -1245541, -1074, -513249, -803159, -35433, 486405, - -415538, -488016, -275952, -491774, 499827, -104153, -71404, 550293, -199716, 245350, - 585726, -117038, -309238, -323196, 456340, 695785, 306553, 427349, -336081, 422517, - -210990, 624918, -715112, 1385664, -15032, -23085, 506806, -84289, -42950, 96100, - 11811, 476741, -152471, 198105, -69793, 119722, -75162, -214212, 143881, -78383, - 19864, 275415, 39192, -66572, 52076, 13422, -11274, 171262, 105227, -243203, - 88584, 73551, -38118, -95026, -35433, 89657, -38118, 50466, -33286, -89121, - 17717, -60666, -32212, -66035, -27917, 58519, 54761, -43487, -1611, -42950, - -537, -26844, -2147, 38655, -38655, -25770, - }, - { - 206695, -3712999, 1144072, -1561758, -769336, 99321, -430034, -112743, -70330, 626528, - -551903, 1848983, 1547262, -14733885, -43487, -295816, 306016, 971736, 919123, -534723, - 619549, -6254546, 2827699, 507880, 3355980, -1468342, -656593, 73014, -775778, -190589, - 434329, 485868, 239444, -572841, 638876, 226560, 493921, -307090, -130997, 135828, - 393526, 193810, -255014, 847719, -72478, -344671, 179315, -419296, 191663, -373662, - -630823, -83215, 123480, 51003, 333934, -88584, -81604, 306016, -37044, -73014, - 392990, -199179, -222801, -125628, 100395, -24159, 159451, 40265, -99321, 157303, - -16106, 146029, -234613, 114354, 73014, -195958, -67646, -84289, 193810, -22549, - 107374, 20938, 34897, 66035, -101469, 79994, -63351, 31675, -35433, 23085, - -5369, -23622, -74625, 86436, -45097, -39192, - }, - { - 7443179, -15265924, -380105, -865436, -194884, -1287953, -977105, -721555, 684510, 846109, - 663572, 222265, 943282, 1459752, 5230734, 2731062, -3015604, 577673, 876173, -1722819, - -223338, 217433, 277025, -869194, 504122, -958315, -13422, -564788, 216359, -692027, - 421981, -1074, 13959, 700617, -1381369, 786516, -493921, 268972, -8053, 425202, - 461709, 695248, -504122, 233002, 239981, -221728, 212601, -353261, 272194, 3221, - 721555, 9664, -179852, 264141, 139050, 191663, 68719, -44023, -158377, -303869, - 271120, -86436, -61203, 135291, -96100, 27380, 153008, -13959, -75162, 44560, - 106837, 52613, -3221, 6979, -80531, 157303, -54224, -9127, 38655, 71404, - -56908, 17717, 100395, 5369, -34360, 26844, -75162, -37581, 8053, -48318, - 18254, 41876, -29528, 10201, -9664, -62277, - }, - { - -353798, -2388539, -370441, 1001801, -607738, 374199, 51003, -34360, 16106, 963146, - -118648, -153545, 625992, 5407364, 7639673, 3959423, 1321239, 613643, 844498, 5159330, - -897648, -1506997, 970126, -1637993, 264141, -175557, -235149, 738198, -44023, 931471, - -1352378, 674847, -263067, 234076, -194884, -823560, -156766, -345745, -318364, 465467, - -819265, -305480, -54761, -51540, 251792, 421444, -256087, 467078, -318364, -181462, - 328028, -69793, -60130, 58519, 19864, 204548, -68719, -179315, -16106, 32212, - 187368, -48318, 63351, -184147, 180389, 192200, 144418, -1074, -21475, 161598, - 121870, 47245, -43487, 69793, -47782, 170725, 11811, -67109, -37044, 73551, - 40802, 23085, 19864, -84289, -58519, -17180, -51540, -55298, 46708, 2147, - -22012, 52613, -18790, -71941, 29528, -9664, - }, - }, - { - { - -9538585, 61473332, 92342, -757525, 1265405, -427349, 162135, 995359, -450972, 339839, - 1058173, 283468, 88584, 239444, -419296, -734439, -101469, -383326, 945967, -386010, - -564788, 53150, -12348, -687732, -415001, -471373, 591632, -136902, -590021, 498753, - -504659, -527207, 287763, 512712, -223338, -245350, -34897, 103616, 130997, 655519, - 32212, -90731, 16106, -500901, -119722, 182536, 234613, 234076, -214212, 51540, - 119185, 73014, -201863, 40802, -140660, 251792, -22549, -49392, -114890, -112743, - 163746, -133681, -106300, -118112, -22012, 121870, 28454, 78920, -52613, -9127, - -3221, -68183, 55298, 11811, -79994, -52076, 66035, 103079, -45634, 103616, - 49392, 51540, 2684, 79994, 4832, -12348, 68719, 26307, 40802, 18790, - -10737, -51003, -5906, -9127, -11274, -12885, - }, - { - -761820, -15353971, 4461934, 2233383, 1597191, -128312, -301721, 515396, 3758, 258772, - -261456, 39192, -1087164, -966368, -321586, -1129576, -548145, -650688, 2459406, 3225521, - -1001264, -804233, -475131, -876173, -2114735, 1409286, -124554, 938987, -934155, -872952, - -571768, 168577, 1385127, 1030255, 299037, 547071, -591095, 321586, -104153, 254477, - -348966, 253940, 273804, 282394, 115427, 178241, 294742, 284542, -28991, 283468, - -66035, 84826, 3221, 396211, -41339, -253940, -46171, -21475, 40265, -38118, - -25233, 170188, 83215, 98784, -11274, -32749, -49929, 289910, 33823, -114354, - 65498, 221191, -15569, 62814, 90731, 131533, -27380, -63888, -45634, -35970, - 11274, -37581, -40265, -14496, -10201, 24696, 30602, -2684, 26307, 24696, - -41339, 11811, -5906, 50466, -1611, -10737, - }, - { - 3216931, 31268972, -9087077, 113280, -452045, 966905, 59593, -425202, -99321, -418759, - -1228361, 229781, -804770, 1033477, 1883880, -179315, -494995, 3221, 3118146, -663036, - 741956, 1113470, -1088774, -522375, 435402, -1131724, -297963, 489626, 257161, 1017907, - -441845, -956167, 1359357, 485868, 31675, 162135, 707059, -225486, -595390, -537408, - 323196, -25770, -61740, 141197, -223338, -132607, 16106, -115964, -38655, 219580, - -384936, 516470, -226023, 183610, 201327, -42950, 46171, 107374, -146566, -179852, - -21475, 28454, 277562, 127238, -78383, 21475, 5369, -19327, 69793, 45634, - 82678, -72478, 9664, 37044, 56908, 1074, -2147, -65498, 128312, 36507, - -17717, 48318, -20401, -92879, -23622, 44560, 2684, -6979, 7516, 46708, - -12348, -27917, -14496, 22549, -27380, 17717, - }, - { - 10899553, -11294690, 1690070, 4962835, 431107, 429497, 419833, -243739, 351650, 784368, - 150861, -992674, 1337882, -763967, 234613, -103079, 843424, 549756, -841277, -513785, - -370978, 161061, 77309, 6979, -714038, -778463, -1030792, 460635, -57982, 639950, - 40265, -671626, 294742, 9664, -166430, 341450, -302258, 96100, -122943, 172872, - 213675, 61740, 151398, -221191, -632971, 413927, 363998, 132607, 197032, -291521, - -77309, 167504, -171262, 15032, 64425, 63351, 203474, -30602, 109522, -141197, - 104690, -28991, 10201, -18790, 199179, -26844, 32212, 71941, -60666, 124017, - 29528, -13422, 13422, 3758, 55298, -91805, 68719, -52076, -13959, 4295, - 33286, -34360, -10201, -61203, -53150, -49929, -13959, 35970, -42413, -31139, - 24696, 22012, -34360, 42950, 11811, 26307, - }, - { - -675384, -200253, -588947, 296890, 327491, -274878, 41876, 879395, -518617, 229244, - 1085553, -188442, -84826, 1844152, 1754494, -2952790, -4243965, 3373697, 803159, 1446330, - -318901, 464930, 1236414, -1447941, -2354716, -622770, 33823, 895501, -1024887, 709743, - 194884, 561030, -929860, 260382, -666257, -357019, -389231, 14496, -314606, 282394, - 125628, 51003, 293668, 629750, -412854, -141197, -299037, -277025, 389231, 290984, - 205085, 71941, -332323, 374199, -48318, -150861, -197032, 65498, 16643, 93416, - -178241, -140123, -89121, 136902, 324270, 106837, 36507, -176094, 20401, 71941, - 89657, 2147, -112206, -139050, -32749, -115427, 81068, 24696, 67646, 22549, - -6979, -20401, -110059, -21475, 27917, 0, 17717, -38118, -13422, 25770, - 9127, -15032, -9127, 23085, -13422, 8053, - }, - { - 19914690, -25227028, 1344862, -2295123, -528818, -239981, 155693, 294742, -848256, 108448, - 1157494, 181999, 668404, -546535, -179315, 311922, 277025, -47245, -213675, 551903, - 264677, 63888, 512712, -137439, -145492, 281320, -789737, 534723, -783832, 13422, - 201327, 99858, -593242, -490163, -806380, 380105, 685047, 705448, -26844, 92879, - -11811, -109522, -472983, 300648, 805306, 629750, 45634, -5906, -184684, 286152, - -351650, -52076, -137976, 54761, 285615, -100932, 188979, 162135, 16106, -47782, - -155693, -69793, 227096, 147103, 111669, -126165, 29528, 160524, 35433, 163746, - 15032, 129923, -44023, -66035, 54224, -98784, 204011, -4295, 6979, -16106, - -53150, 10737, -129386, -35970, 32212, 30065, 26307, 31675, -13422, -30065, - -11811, 40265, 34897, 6979, -22549, -26844, - }, - { - -501974, 962610, 1431298, -653372, -120259, -65498, 135291, 114890, 112743, -285078, - 22549, 31675, 1291711, -2021319, -595927, 755914, -1309428, 466541, -624381, -2512019, - -989990, -1186485, -925029, -591632, 426276, 357556, -1974611, 629213, -971200, -377420, - 534187, -110059, -362925, 1068910, 444529, 642635, -1074, -555661, -143345, 297427, - 360777, -277025, 98247, -348966, -52076, 277562, 431107, 248034, 89121, 99858, - -20938, 74088, 96100, -161061, -107374, -105227, 32749, -136365, -222801, 71404, - 140660, 180926, -189515, -3221, 83215, 128312, -11811, 164819, -19864, -53687, - -73014, 47245, 116501, 37044, -12885, 108985, 27380, 88047, -22012, 35433, - 19327, 63351, 2147, -18254, 10201, 15032, 27917, -22549, 49929, -8053, - -28454, -33823, 13959, 51540, -13422, -27380, - }, - { - -11702175, -10211285, -2412161, 1237488, -464393, 48318, 235686, -950262, -165893, 96100, - -259846, 35433, 11811, 1118302, 559956, 1116155, -61740, 108985, -239444, 231391, - 315143, -518080, -200790, 396211, -318364, 827318, 714038, 196495, 222801, -723165, - 537, -505732, -105227, 275415, 296890, -382789, -20938, 153008, -319438, -41876, - 119185, -52076, 46171, -51003, -28454, 864899, -491774, -466541, -701690, -311922, - 216359, 135828, -90731, -211527, 190052, -78920, 14496, -9664, 193810, -5906, - -34897, -198642, 0, -19864, -109522, 537, -44023, -114354, 99321, 13422, - 58519, 20938, -51003, 44023, 55835, -54224, -8053, 140123, 8053, 20938, - 24696, 28991, -77309, 11274, 18790, -20938, 40802, 82141, -3758, -18254, - -4295, -49392, -6442, 45097, 23622, -24159, - }, - { - -912681, -2956011, 600759, -777389, 306553, 21475, -251256, 415001, 354335, 164283, - -26844, 102005, -133681, -368830, 6123013, -1546725, 714038, 871342, -527207, 1110786, - 414464, -1842541, 1684701, 1213865, 1235340, -2259153, -219580, 114354, -1137093, 108985, - -1068910, 194347, 636192, -73551, 779000, 189515, -110059, -685047, 62814, -644782, - 410169, 91268, -41339, 316217, 49929, 76773, 479963, -15569, 65498, -102542, - -294742, -270583, -19327, 110059, 193810, -103079, 163746, 1611, 154082, -137439, - -56908, 38118, 188979, -188979, -169651, -19864, -134218, -95563, -11811, 2147, - -73551, -181999, -35433, -82141, 157303, 18254, 31675, 44560, -7516, -4832, - -5369, 11274, -95563, -3758, 47245, 40265, 5369, 112206, 19327, -71404, - -2147, 48318, -15032, 27380, -23622, 13959, - }, - { - 3502546, -17054242, 5060545, -271657, -907849, -1371168, -4482872, -460635, -523449, -730681, - 1256278, -98247, 435939, -121333, 260919, 109522, -1774895, 1024350, -468151, -1478006, - -162135, 362388, 471373, -639950, 92879, -571231, 49929, -382789, 366683, -807454, - -253403, -462783, -286689, 937914, 459562, -119185, 247497, -180389, 264141, -294205, - 62814, 37581, 593242, -116501, -154082, 391916, 179852, -88047, 88047, 460098, - 2147, 4832, 180926, -92879, -99858, 195421, 183073, 65498, -75699, -141734, - -438624, -86973, 90194, 146566, 25770, -217433, -46171, -37581, -52076, 149250, - 39192, -128312, -76773, 158377, -33823, 19327, -26844, 61203, 59056, 24159, - -26844, 19327, 9664, -12885, -58519, 61203, 59593, 37581, 16106, -12348, - 20938, 36507, -27917, -41339, -9664, 42413, - }, - { - -354872, -1399086, 2925947, 1683090, 93416, 221728, -1167157, -228707, 60130, 741956, - -34360, 493921, -565862, -998043, 116501, -355409, -759672, -2242510, 475131, 2646237, - -2218351, -505196, 148176, -384936, 181462, 430570, 537408, 120259, 502511, -556735, - -311385, -745714, -417686, -700080, 954557, 564251, -402116, 293132, 60666, -49392, - -144955, -199716, 187368, 399432, -206158, -108985, 333934, -39728, -29528, -88584, - 287226, 34360, 53687, -129386, 20938, 61740, -38655, -120259, 138513, -158914, - -146029, 83752, 9127, -34897, 34897, 166430, -49929, 29528, 114354, -81604, - 9664, -39728, -81604, -45634, 54224, 30602, -98784, -98247, -43487, 52613, - -19327, 5906, -18790, -14496, -57445, -53150, 52613, 46171, -56371, -66035, - 44023, 18254, -26307, 7516, 9127, 11274, - }, - { - -1166084, 14136348, -993748, -341987, 82141, -337155, 122407, -327491, 462783, 287226, - -296890, -1334661, -118648, 1687922, -453119, 438624, -1563905, -1010391, -3758, 323733, - -636729, 287763, -122943, -117575, -630823, 520765, -145492, 1126355, -220117, 89657, - -134755, 328565, -474057, -602369, 467078, 233002, -221728, -387084, -406411, 572841, - 243203, -137976, 733903, 566399, 173946, -127238, 351114, -2684, -122943, 91805, - 345745, 280784, 156766, 138513, 100395, -45634, -47782, -233539, 175020, -272194, - 233002, -26844, 115427, 10737, 156766, -169114, -38118, 8590, 24159, -41876, - 111132, -47245, -36507, 20938, -19864, 57982, -34360, 14496, -95026, -71404, - -37581, 37044, -1611, -9664, -31139, 71404, -32212, 6442, -11811, 0, - 44023, 8053, 61203, -27380, -19864, 19327, - }, - { - 73014, -3241627, 686658, -1169842, 375273, -134218, 346282, -436476, 163746, -680752, - 331786, 2247879, -4679904, -4770098, 219580, 901406, -588411, 2236604, 169651, -183610, - -4159676, 515396, 911070, 323733, 2688113, 485331, -1915019, 983548, -651761, 804770, - -587874, 995359, -301721, -399969, 258772, -390305, 327491, 90194, 48855, 185757, - 255014, 299574, 175020, 327491, -208306, 104153, 377957, 130997, -474594, -189515, - -228707, 134218, 242666, 96100, 372588, 103079, 51003, 146566, -76236, -102542, - -168577, -45634, 139050, 46171, 31675, 73551, -8053, 60130, -38118, 71941, - 42413, -13422, 21475, -41339, 57445, -11811, 71941, -64425, 21475, 99858, - -11274, -56908, 3758, -70330, -73014, 23085, 22549, 74088, -63888, -16106, - -62814, 23622, 63888, 54224, -65498, 12348, - }, - { - -5312875, 3722126, 953483, -4857608, -188979, -1556926, -2535641, 370978, -474594, 1228361, - -214748, 764504, 405338, 1887101, 6515466, 124017, -1445793, 120796, -619549, -654446, - -195421, 212601, 369367, 438087, 599148, -667867, 0, -85362, -334471, -190052, - -197569, 497679, -462246, -595390, 48318, -215822, -372052, -246961, -340376, 388158, - 941672, 240518, 170725, -137976, -17717, -259846, -310311, 116501, -108985, 344671, - 486405, 237297, -92342, -17717, -59593, -79457, 3221, -31675, -23085, -119722, - -27380, -27380, 95026, -162672, -221191, -40802, -34897, 2147, 71941, -17717, - 31675, 38655, -19864, 107911, -98247, -29528, -39192, 50466, -29528, -76773, - -81604, -27917, 5369, -79457, 37044, -73014, -57982, 59056, 33286, -69793, - 27380, 28991, -44023, -22012, -19864, 2147, - }, - { - 474057, -3422552, -259309, 1017370, -191126, 28454, -225486, -34897, 45634, 1188632, - -406411, 885300, -1198833, 9064528, 10408853, 2892124, 809064, -179852, 2455648, 870805, - -626528, 724776, 165893, -1317481, -223338, 959388, -539555, 54761, 75699, -224949, - -245887, 26844, 174483, 73014, 274341, -552977, -66035, -14496, -595390, 69793, - -5906, 227633, -141734, 7516, 158377, 256624, -193810, -108985, 241055, 92342, - 61740, 221191, 258772, 17180, -33286, 227633, -100395, 148713, 56908, 271657, - 331786, -25770, -234076, 22549, 277025, 141734, 4832, -112206, 99858, 112743, - 100932, 23085, 138513, 12348, 12885, 178778, -26844, 22549, 6442, 116501, - -51003, -35433, -92879, -64961, 28991, -92879, 29528, -54224, -32212, 30065, - 8053, 7516, -31139, 4295, 17180, -32749, - }, - }, - { - { - 4958540, 59452012, -26463978, 251792, 4090420, -448287, 105764, 1644436, -207769, 238371, - 341450, 113280, 217433, -445603, -892279, -1126892, 3758, 321586, 197569, 242666, - -529892, -779537, -943819, 196495, -1074, -688805, 485331, -70867, -542240, 762357, - -662499, -486405, 182536, 460635, -217970, -312459, -338229, 344134, -63888, 513785, - 198642, 423591, 405338, -353798, 126165, -54761, 387621, -68719, -420907, 204011, - 84289, 89121, -281857, -97711, -224949, 115964, -181462, -193274, -276489, -126702, - 45097, -108985, -109522, -82141, 61203, 11274, 20401, 18254, -114890, 39728, - 108985, 40265, 35433, -68719, -134755, -83215, 9127, 16106, 30065, 84289, - 46171, 4832, -76236, 21475, -20401, 62814, -52613, -39728, 56371, 59593, - -11811, -6979, -30602, -37581, -20938, 6979, - }, - { - -223338, -16971564, 1843078, 381715, 744103, -468688, -964757, 794032, 39192, 98247, - -551903, 527744, -809601, -1572495, -2070174, 718333, 2201708, -392453, -3027415, -1359894, - -2702071, -616865, 512712, -425202, -1396401, 1496259, -383863, 181462, -580894, -191126, - -726386, -780073, 605590, 481036, 373662, 848793, -16643, 768799, 167504, 113817, - -117038, 232465, -355409, -384400, 366683, 180389, -113817, -116501, 153545, 308164, - -140660, 190589, -1611, 203474, -247497, -173946, -213675, -63351, 103616, 116501, - 60130, 87510, 35970, -37044, 18790, 62277, -33286, 151934, 7516, -5906, - 60666, -6979, -96100, -28991, 93952, 83215, -12885, 50466, 59056, -36507, - -14496, -7516, 15569, -6442, 39192, 67109, -10201, -32212, 35433, -46708, - -61203, 18790, 22549, 34360, -12348, -19864, - }, - { - -986769, 42009612, 5597416, 4808216, -233002, 260382, 219580, -15569, 384936, 615254, - 277025, 899796, -340376, -858993, -208306, 537408, 622770, 1424319, 2177549, -1409286, - -47782, 557272, -1169305, 178778, 1080184, -1022202, -431107, 397821, -198642, 732292, - -186831, -1096290, 670015, 353261, -404264, -220117, 281320, 518080, -289910, -992674, - 283468, 92879, -477278, 129386, 428423, -233002, -68719, 110595, 52613, 32212, - -454730, 425739, -263067, 331786, -18790, -153008, 340376, 104690, -195421, -317828, - -42413, 94489, 11811, -222265, -107374, 100932, 26844, -103616, -132607, -94489, - 23622, 41339, 68719, -55298, -17717, -54224, 113817, -7516, -26307, -21475, - -41339, 36507, -49392, -13959, 38655, 16106, 13959, -44023, -8053, 11811, - -89657, -44023, 19864, -19864, -39192, 26307, - }, - { - -3846143, -35816808, -2084133, 4117263, -271657, 278636, -30602, -248034, 247497, -213138, - -867047, -343061, 1775432, -522912, -176094, 109522, -51540, -581431, 69256, 139050, - -247497, 159988, -35970, -319438, -323733, -208843, 153008, 349503, -354335, 521839, - -117038, -642098, 298500, -135828, 195958, -118112, -328028, 176631, -111669, -63351, - -331249, 92342, 178778, -359167, -532576, 394063, -78383, 43487, 27917, -50466, - 145492, 42413, 77309, 22549, 246961, 2147, 56908, -78920, -92879, -153008, - 234076, 141197, 91268, 72478, 103616, -54761, 0, 14496, -13959, 79994, - -17180, -116501, 12885, 10201, 95026, -35433, 34360, -42413, 19327, 39728, - 56371, 2147, -46171, -3758, -22012, -34897, -3758, -45634, -12348, 32212, - 33286, -2147, -37581, 40265, 5369, -6442, - }, - { - 725313, -717260, -1693291, 521839, 43487, -186294, 236760, 699006, -666794, -19327, - 794032, 273804, 1065689, -679142, 1137630, -1602560, -3658239, 8845485, -3725347, 949725, - -232465, -420907, 219580, -1586454, -1639604, 865436, 1276142, 746787, -949725, 510027, - 132070, 357556, -891743, 309238, 454730, 617402, 116501, -82141, 1074, 723165, - 199179, 418222, -89657, 294742, -409633, 111669, 19864, -147640, 143881, 362388, - -206695, 90731, 49392, 202400, 195421, 129923, 4295, -44560, -93952, 157303, - -47782, -232465, -180926, 128312, 171799, -73551, -69793, -134755, 102542, 27917, - -62277, 21475, 15032, 58519, 63888, -77846, 64425, 89121, 83215, -42413, - -33286, -48318, -46171, 53687, -62277, -2147, 0, -52076, 33286, 38118, - 67109, 44023, -12348, 11811, 26844, 9664, - }, - { - -7559143, -64206540, 1686312, -1435056, 619012, -233002, 339839, -48855, -403190, 443992, - 461709, -365609, -123480, -1311039, 57982, -82141, -151934, 718333, -151398, 875636, - 819802, -728534, -141734, -543313, -407485, 70330, -270046, -17717, -749472, -209380, - -791348, -185757, -484794, 487479, -510027, 568546, 135828, 387084, 104690, 258772, - 477815, 230854, 87510, 67646, -32749, 158914, -111132, 218506, -94489, 651761, - -183073, 79994, 135291, 174483, -103079, -282931, 235686, 58519, -49392, -13959, - -19327, 31139, 139586, 84826, -6979, -111132, 64425, 38655, -30065, 54224, - -8053, 74088, 38118, 18254, 11274, -7516, 141734, -47782, 16643, 52076, - -50466, -22549, -69793, 62277, 33286, 66035, -23085, 45634, -69256, -14496, - 18254, 24696, -30602, -25233, 40265, 11274, - }, - { - 41876, 342524, -1474784, -1023276, -89657, 6442, 393526, 527744, 31139, -129386, - 83215, -255014, 1009317, -843961, -1024887, -3775276, -2522220, 899796, 562104, -1205812, - 140123, -638876, -1338419, -325344, 512175, -764504, -1239098, -271120, -1127966, -620086, - -505732, -523449, -1314797, 809064, -108448, -75162, -47245, -92342, -195958, 448287, - -93416, -832687, 345208, 250719, 209380, -159451, 248571, 162672, -119185, -41339, - -39728, 29528, -81604, -373662, -8053, 24696, -27380, -101469, 11274, 108448, - 56371, 34360, -214212, -39192, 105227, 94489, 183610, 278636, 0, -63888, - -2147, 98784, 36507, 62814, 107911, 75699, -7516, 78920, -5369, 6442, - 19327, 46171, 537, -26307, 21475, -22549, -45097, -40265, 2147, -33823, - -5906, 1611, 537, -23622, -4295, -3221, - }, - { - 8518531, 12212203, -4954782, 770947, 300111, 73014, -209380, 226023, 221728, 177167, - -51540, -687732, -28454, -85899, -1271847, 353261, -740882, -346819, 41876, 86436, - -111669, 23085, 93416, 454193, -841814, 303869, 332323, -521302, -144955, -256087, - 503048, -136902, 409633, 383326, 338766, 195958, 463320, 529355, -91268, -350040, - -66035, 408022, -11811, -702764, -293668, 497142, -329102, -345208, 36507, 341450, - 421981, 34897, -155156, -130460, 356482, 37044, -53150, -106300, 70330, -48855, - 69793, 56908, 295279, -6442, -232465, 62814, -34360, -10201, 57445, -30602, - 141197, 51003, 22549, 57445, -31675, -111132, 76236, 35433, -98784, -4832, - -46171, -4295, 19864, 38655, -15032, 8053, 44023, 6979, -11274, 22012, - 1611, -30602, 8590, 45634, -28454, -33823, - }, - { - 71941, 5179194, 3093987, -685047, 42413, -67646, -373662, 421444, 177704, 24159, - 24159, 286689, -540629, -1110786, 4890357, -4204236, -3034395, 1809792, 851477, 1125281, - 1201517, -938987, 1080721, 408022, 561030, -1925756, 1198833, 395137, -864362, 290447, - -849867, 129386, 1010391, 381178, 437550, -591095, 3221, 745177, 750009, -208306, - 461172, -317291, 137976, 445066, 123480, 199179, 359167, -306016, 241055, -20401, - -205085, -145492, -32749, -229244, -8590, -252866, 224412, 78383, -65498, -110595, - -8053, 26307, 298500, -207769, -10201, 157840, -29528, 27917, 55298, -17717, - -90731, -108448, 67109, 23622, 126165, -128849, -90731, -16106, -28454, 31675, - -46171, -31139, 37581, 43487, 10737, 16106, 32749, 62814, -14496, -11811, - 10737, -6442, -12885, 1074, 6442, 37581, - }, - { - -1112933, -19773492, 5193689, -1859184, 282931, 2699387, -152471, -776852, -15032, 196495, - 616328, -547608, 84289, -6979, -134218, -162135, -484258, 1841467, 187905, -837519, - 170725, 65498, 56908, -207769, 928250, -443455, -181462, -365072, 489089, -852551, - 411780, 9664, -698469, -25770, -32749, -470299, -32212, -253403, 347892, 194347, - 488016, -537, 243739, 103079, 244276, 460635, 215285, -35433, -17717, 417149, - -185220, -79994, 215822, -200253, -230318, 174483, 179852, 55835, -41339, 5369, - -77846, -139586, 49392, 38655, 17717, 34360, 2684, 11274, 66035, 61740, - 85899, -70867, -15569, 20401, -59593, -23622, -8590, -81068, 107374, -54224, - -57982, 24696, 74625, 18790, 34360, 66572, -7516, -3758, 27917, 17180, - 1611, 8590, 2684, -6979, 14496, 47245, - }, - { - 317828, -292595, 803159, -2331630, -91268, 419833, -907312, 246424, -154082, 941672, - -289373, -880468, 232465, 345208, 1407676, -1171452, -937377, -79457, 1196148, -53150, - -517007, 1223529, -115964, -54761, 518617, 930397, 440234, 34360, 794569, -98247, - -105227, -338766, 117575, -599685, 1000727, 394600, -643171, 258772, 27917, -8590, - -258772, 197032, 641561, 201327, -351114, -40265, 39728, -200253, 93416, -39728, - -8590, -183610, -79994, -393526, -18254, 4832, 66035, -67646, 96637, -94489, - 121870, 17180, -17717, 48318, 25233, 34897, 85362, 110059, -7516, -33823, - 69793, 31139, 60666, 39728, 26307, -49392, -84289, -91268, 55835, 12885, - -59056, 22549, -3758, -70867, -45097, -47782, -13959, 37044, -37581, -33823, - 42950, -3221, -16643, 6442, 32212, -28454, - }, - { - -1481227, 13782013, -255551, 964220, 1066226, -1409823, 1415729, 403190, 248034, -686658, - -1057099, 291521, -791348, 1396938, -319975, 168041, -331786, -441308, -179315, -197032, - -117575, 14496, -10201, 214748, -668941, 572304, -307627, 661962, 191126, 124554, - -13422, 403727, -175557, 89121, -187368, -237834, -153545, -507343, -165893, 301185, - 563714, -56371, 258772, -428423, 97174, -430034, -30065, -82678, -111669, 78920, - 170188, -200253, -56371, -218506, 41339, -77309, 78920, -249108, 48318, -165893, - 228707, -236760, -22012, -9127, 45634, -142808, 11274, -14496, -3221, 70867, - 41339, -24159, -10201, 20401, -21475, -5369, -17180, 8053, -63351, -22549, - -8053, 96637, -12348, 51540, 0, 10201, -4295, 13959, 6979, 24159, - 5906, 2147, 25770, -32212, 14496, 44560, - }, - { - -192200, -3782793, 1362578, -1025423, -529355, 406411, 60666, -312459, 585726, -922344, - 576063, 1612760, 3323231, 9587441, 1019518, -774705, -974958, 1404991, -1144072, -284005, - -3802657, 2213519, 1058710, -498216, 1156420, 1346472, -1387811, 1577327, -382252, 1786706, - -1369558, 240518, -881005, -534723, 423591, -156766, 530428, -31675, 145492, -226023, - 91268, 76773, -115427, -72478, -114354, 22012, 54761, 147640, -21475, 257161, - -69256, -61740, 126702, 100395, 317291, 136902, -52613, 81068, -106837, -178778, - 39728, 246961, 39192, -51540, -16643, 37044, -69256, -22012, 9127, 37044, - -28991, -128312, 51540, -112206, 101469, 50466, 110059, -15032, -70330, 53150, - -59056, -88047, 10737, -47782, -13422, -1611, 46708, 14496, -35433, -23622, - -88584, 40265, 37044, -27917, -18790, 45097, - }, - { - 1315334, 13368086, 2196339, -2783139, 362388, -404801, -2776160, 1053878, -346282, 386010, - -1103270, -249645, -522912, -3594351, -243203, 596464, 914828, 185757, -522912, -8053, - -38655, 308701, 177167, 853088, 972273, 122943, 472983, 593779, -352187, -485331, - -169114, 137439, -236223, -377957, 447750, -41876, 54224, -31675, -353798, 24696, - 338229, 341987, 140123, 6979, 286689, -258772, -255551, 417149, -428960, 247497, - 73551, 47782, -181462, -116501, -121870, -148713, -11811, 142808, 39192, 177167, - 87510, 57982, -54224, -186294, -30602, 19327, 33823, -59593, 39192, -86973, - 18254, -131533, -55298, 22012, -83752, -32749, 7516, 4832, -39192, -45097, - -47245, -66572, -54224, -56908, 16643, -41876, 60666, 54761, -18254, -48855, - -14496, -25770, -31139, -39728, 16106, 12885, - }, - { - -256087, -3570729, 1088237, 1098438, 81068, 47245, -180389, -30065, -100932, 977642, - -155156, 479963, -770947, -3524021, -13105019, -1723893, 544387, -267362, 1518808, -1605244, - 376347, 1923609, -952409, -496069, 828392, 359704, -1337882, -367220, 1074, -66035, - -79994, 408559, 613643, -148713, -255014, 25770, -221191, -465467, -392453, -180926, - 777389, 360777, -241055, -34360, 182536, -103079, -197569, -78920, 255014, -45634, - -170188, 270046, 303869, -150861, -65498, 68719, -172336, -22012, 52613, 242129, - 157840, -77846, -107374, 143345, 141197, -27380, -26307, 112743, 125091, -48318, - -61203, -63888, 54224, -25770, 2147, 6442, 26307, 54761, 11274, 19864, - -146029, -35433, -49929, 62277, 33286, -81604, 34360, -30065, -28991, 22549, - -10201, -9127, -4295, 12885, -23622, -42950, - }, - }, - { - { - -3366181, 17725330, 15316927, -652835, 804770, 1091459, -278099, 763430, 446677, -361851, - -842350, 758062, 950262, 706522, -3020973, -721018, 82678, 587337, -970126, 1639067, - -529355, -1046898, -413391, 61203, -307090, -136902, 768262, 34897, -449898, -90194, - -199179, 50466, -355409, 213138, -147640, 115964, -573915, 161598, -260919, 413927, - 645319, 381178, -111132, 178241, 18790, -81604, 524523, -373662, 28991, 95563, - -208306, -11274, 110595, 10737, -29528, -199716, 141734, -134218, -145492, 1074, - -243203, -50466, 57445, 49929, 34897, 74625, -68719, -71404, 5369, 38655, - 224412, -1074, 24159, -126702, -59056, -10737, -45097, 1611, 68719, -83752, - 26307, -59056, -74625, -4295, 18790, 35970, -99321, -30065, 8590, 4832, - 8590, 2147, -25233, -8053, -20938, -11811, - }, - { - 222801, -13282723, -2872796, -776852, -424128, 460635, -1388885, 264677, 6979, 294205, - -325344, 151398, -826781, -602906, -1842004, 920197, 1851131, 306553, -2742874, -1446330, - -875100, -830002, 302795, -297963, 153545, -204011, 494995, -1214402, -241592, 392990, - -1278290, -224949, -383326, 121333, 351650, 598611, 651761, 212601, 559420, -51003, - 197032, -353261, -463320, -260919, 240518, 72478, -102005, -147640, 429497, -124017, - -7516, 68719, -127238, -96100, -62814, 197032, -124017, -25770, 132607, 11811, - -166430, -56908, 90731, -38118, -45634, 67109, 11274, -76236, 75162, 24696, - 3221, -59056, 44023, 5369, 10201, 40265, 87510, 109522, 5369, -118648, - 48318, 18254, 44560, -20401, 24159, -32749, -43487, -1611, -20938, -30065, - 9127, 7516, -2147, -99858, -537, 31139, - }, - { - 423591, 48506824, 4428648, 2609730, -2400350, -218506, 332323, 623844, 43487, 415001, - 249645, 714575, 1418950, -2095407, -1418413, 568009, 258235, 1673427, 460635, -138513, - 794569, -70867, -100395, 608275, -256624, -1510218, -277562, 406948, 351650, -788663, - 562641, 260382, -297963, 340376, -138513, 265751, -819802, 812823, -332860, -288837, - 67646, 465467, -252329, -339839, 450972, -457951, -97174, -228707, 75699, 137976, - -357019, 133144, -183610, 461172, -330176, -140660, 25233, 137976, 33286, -182536, - -162672, 46708, -127238, -259309, -21475, 45097, -88584, -7516, -187368, -31675, - -86973, -13959, 18254, -2684, -103079, 75699, 179852, -20938, -137976, 27380, - -25770, -85362, -4295, 85899, -26307, -28991, -47782, 4832, 0, -20401, - -30602, 18790, 26307, -16106, 10737, -4832, - }, - { - -2281165, -39209832, 190589, 3272765, -987306, 256087, -205085, 229244, -268972, -178778, - -425739, 167504, 209380, 991601, 192200, 596464, 140660, -484794, -351650, 424665, - -186831, 26307, -51003, -130460, 149787, 3758, 212064, 192200, -212064, -551903, - -198105, -185220, -67109, -476205, 388158, -592169, 47245, 46171, 114354, -280784, - -136365, 176094, -17717, -402116, -119722, -176631, -217970, 155156, 200790, 74625, - -52613, 81604, 203474, -68183, 87510, 24696, -125628, -218506, 9127, 90731, - 1074, 33286, 56371, 79994, -139586, 70330, -134218, -46708, 124554, -79457, - -32212, 15569, 125628, -8590, 71941, -15032, -7516, -32212, 26307, -11811, - -19327, 7516, -50466, 48318, -42413, 18790, 4295, -37581, 53687, 13959, - -28454, -537, 1074, -12348, -2147, -5906, - }, - { - -693100, -2204392, 2406256, -244276, -235686, 252866, 196495, -105227, -404801, -199716, - 645856, 246961, 795106, 1494649, 630286, -1580011, 1415192, -486942, -1449015, 1170916, - 312996, 399969, -1084479, -170725, -797790, 1873143, -377957, 394600, 223338, -336081, - -59056, 873489, -421444, -501974, 914291, -49392, 621160, -475668, 466541, 754304, - -537, 378494, -392453, -42413, -212064, -116501, -68183, -161061, -102542, 220117, - -108985, 196495, 186831, 13422, 284542, 170188, 98784, -226560, -98247, 124554, - -30602, -263067, 35433, -40802, -207769, -167504, -80531, -41339, 90194, -15032, - -35970, 89657, 115427, 76773, 70867, -72478, 90731, -1074, -47245, -79994, - -107374, -43487, 80531, 7516, -84826, 10737, -42950, -9127, 53687, 18254, - 32749, 0, 9127, 56371, 5906, -26844, - }, - { - -2494302, -68554120, 2163590, -489089, -664646, 163209, -208843, -402116, 646393, -105227, - -1007170, -68183, -59593, -586263, -854699, 427349, 221728, 410169, 10201, 394600, - 191663, -1002875, -113280, -440771, -44560, 73551, 145492, -511638, -289373, -474594, - -821413, -15569, -1074, 270046, -12885, 292058, -236223, 419833, 351114, 342524, - 37581, 296890, -4295, -125091, -33823, 59593, 289910, 64425, 3221, 382789, - 64961, 42413, -89657, 201863, -190052, -132070, -95563, -204011, 157840, 127775, - 5906, 38655, -137439, 14496, -18790, -19327, -40802, -62277, 61740, -54761, - 46171, -39728, 69256, 52613, -33286, 77846, -5369, -10201, 93952, 70867, - 2147, 37581, 60130, 93952, -18254, 5369, -32212, -11274, -56371, 8053, - -1611, 10737, -46171, 44023, 35433, 22012, - }, - { - 278099, -3185792, -885300, -5906, -102005, 144955, 82141, 892279, -409633, 202400, - -228170, 221191, 594316, 953483, -2839510, -2104534, 1273995, -1042603, 777389, -38655, - -399969, 161598, -1939715, 90731, 1216013, -1906966, 918049, -1580011, -477278, -413391, - -1165547, 303869, -652298, 28454, -629750, -285615, 32749, 322123, -55835, -265214, - -326954, -42950, 110059, 551903, 219043, -417686, 78920, 264141, -163746, 89657, - -53687, -13959, -190052, -237297, -125091, -11274, -98247, 10201, -49929, 195421, - 165893, -19327, 4295, 33286, 33286, 76773, 162135, 64961, 22549, 102005, - 111132, -64425, -75699, 90194, 40802, 42950, -63351, -30602, -16643, -43487, - 25770, 18790, 34897, -26307, -12348, -39192, -21475, 31139, -2684, 30065, - 61203, 49929, -10201, -46171, 24159, 14496, - }, - { - -4775467, 21806086, 5585605, 361314, 478889, 266288, -300648, 341987, 566399, -170188, - -274341, -155693, 55835, -1539746, -1255741, 204548, -341450, -54761, 383326, -257698, - -257698, 340376, -410169, 299574, -49392, -93416, -1611, -743029, -95563, -374736, - 242129, 225486, 686658, 31675, 198105, -287763, 484258, 194347, 88584, -432718, - 76773, 148176, 413927, -566399, -455267, 164283, -113817, 48855, 282931, 172872, - 94489, -153008, 157840, 242129, 48318, 93952, -220117, -79457, 31139, 11274, - 151934, 102005, 183610, -26307, -133144, 39192, -89121, 114890, 7516, 78920, - 126702, 9664, 35970, -38118, -135828, 18790, 1611, -98784, 22549, -80531, - -31675, 24159, 48318, 38118, 28454, 17180, 33286, -56371, -27380, 12885, - -9664, 11274, -10201, -6979, -46171, -13959, - }, - { - 743029, 4154844, 26844, 227633, -281857, 112743, -161598, -30065, -183073, -23085, - 250182, 797253, 205622, -514322, 920734, -1821603, -1890323, 1251983, 1061394, 1224603, - -240518, 253940, 1247688, -241055, -836445, -358093, 988916, 20938, -683974, -564251, - 631360, -476741, 1234803, 853088, -136902, -515396, -117575, 715112, 568009, 10737, - -154619, -346819, 253940, 28454, -96637, 196495, 140660, -105764, -22012, 155156, - -38655, -12348, -8053, -409096, -136365, 125091, -48855, -99858, -217433, -537, - 75162, 222265, 115427, 24696, 224949, 234613, 159451, 48855, 54224, -537, - 2147, 13422, -10201, 19864, -70330, -118648, -95026, -32212, 537, 16106, - -18254, 35970, 138513, 46171, -29528, -16643, -46171, -60130, 5369, 44023, - -19327, -10737, -6979, -33823, -8053, -3758, - }, - { - -243203, -19477140, 622233, 931471, 734439, -561030, 4094178, -883690, -285615, -200253, - -20938, -595390, -557272, 227633, -243739, 137976, -888521, 1813550, -670015, 593779, - -78383, 70330, -639413, 393526, 435939, -133144, 16643, -372052, -246424, -292058, - 324807, 81604, -248571, -1478543, 377957, -175020, -115427, 60666, 271657, 296890, - 124554, -177704, 192200, 428423, -175020, -111669, 217433, 40265, -37044, -130997, - -179315, -91805, -90731, -107374, 2684, 176094, 70330, 102005, 56908, -67109, - 153545, -134755, 11811, -19327, 11811, 25770, 11811, 41339, 55298, -71941, - 42950, 61740, 17717, -77846, -38655, -53150, 12348, -66035, 30602, -6442, - 49392, 27380, 9664, -25770, 56908, -63888, -89121, -21475, -50466, 20401, - 10737, 1611, 44560, 26307, -8053, -27917, - }, - { - -395137, 2467996, -2856153, -171262, -380105, 368293, 248034, -440771, -292595, -333934, - 141197, 55298, 337692, -271657, 2105071, -587874, -552977, -67646, -411780, -163746, - 1119913, 998043, -408022, 82678, 824097, 411243, 418759, -359167, 683437, 847182, - -215822, 39728, 126702, -482110, 542777, 2684, 237834, 243203, 33286, 100395, - -371515, 251256, 706522, -320512, 33823, 97711, -307627, -135291, -125091, -21475, - -144955, -201327, -36507, -59593, 120259, 17180, 17180, -76236, -116501, -4295, - 62814, -106837, 199179, 78920, -17180, -132607, 52076, 18790, -86436, 5369, - 125091, 44560, 135828, -19327, -42950, -41876, 57982, 31139, 91805, -12348, - -45634, -46708, -55298, 29528, 22549, -34360, 12885, -5369, 26307, 33823, - 4832, 4832, 7516, -11274, 9664, -17717, - }, - { - 2195265, 9210557, 1816234, -163209, -652298, -658204, 1123671, 1113470, 348429, 65498, - -363462, 83215, 995359, -689879, 44023, -35970, 412854, 60130, -264141, -411243, - -92879, -507343, 24159, 616865, -143345, 153008, -363998, 138513, 486942, -235149, - 236223, 299574, 333934, 318901, -319975, -66035, 318901, 56371, 278099, -168041, - 293132, 310848, -151398, -595390, 109522, -264677, -18254, -88584, -195421, 61203, - -282394, -103616, -177167, -216359, -44560, -63351, -2147, 33823, 6979, -4832, - -83215, -71941, -41876, -78383, -128849, 97174, 80531, 51540, 17717, -2147, - -4832, 46708, 4295, -26307, -77846, -12348, -4295, -4832, 46708, -17717, - -24696, -6979, 39192, 32212, -24696, -20938, 30602, 1074, 37044, -12348, - -46708, -30602, -52076, 20401, 23085, 13959, - }, - { - 159451, -2771865, -314069, -721555, -526670, -209917, -85362, -22549, 576599, -557809, - 257698, 479426, 4819490, 12750147, -4400731, -137439, -491774, -422517, -1185411, -651761, - 391916, 238908, -406411, -397821, -213675, 562641, 455803, 273804, 309775, 820876, - -1173063, 281857, -746251, -98247, 120796, 892279, -13959, -251256, 391379, -470299, - -124017, 222265, -63351, -514322, 461709, -216896, -347355, -158914, 34360, 167504, - -55835, -348966, 166967, 102005, 67646, 149250, -136365, 215285, -113817, 33286, - 260919, 199716, -152471, -197569, -18254, 80531, -98784, 89121, 22549, -23622, - -74625, -13422, -49392, -63351, 38118, -22012, -89657, 41339, 38118, -14496, - -537, 69256, 54761, 17180, 16643, -10201, -9664, -24696, -37044, 8590, - -11274, -45634, -60130, -6979, 28454, -18790, - }, - { - 1982127, 14843407, -2486786, 1895691, 426276, 711354, -1653562, 959388, -43487, -361851, - -84289, -2419140, -12885, 527744, -5749351, 567473, 2863133, -529892, -491237, 291521, - -17717, -127775, -114354, 650151, 1015760, 398358, 96637, 443992, -676457, -362388, - -145492, -155156, 513785, 329639, -228170, 200253, 551366, 334471, -92342, -99321, - -277025, -39192, 363998, 31675, 707596, 24696, 70867, -51540, 9127, 54761, - -175020, 31675, -52613, -123480, -71404, 77846, 275952, 13422, -35970, 45634, - 202400, 123480, -119185, 77309, 104153, 129923, 62814, -20938, -23085, -18254, - 82678, -195958, -41876, -17717, 10201, 31139, 11274, -55835, 13422, 61203, - 17717, -57982, 14496, 28991, 11274, -5369, 33823, -18254, -59593, 17717, - -57982, -30602, 10737, -24159, 1074, -4832, - }, - { - 39192, -2292976, 144418, 332860, 530428, 103616, -184684, -403727, 551903, 380105, - 349503, 605590, -35433, -4687420, -18485540, -1934346, 1574106, 66572, 1324461, -1481764, - 1938104, 280784, -353261, 162672, 773631, 372052, -828929, -473520, -244276, 79994, - -230318, 671626, 242129, -310848, -631897, 468688, -924492, -532576, 260382, -652298, - 572304, -140660, -250719, 124554, 386547, -321049, 16106, 133681, 36507, -253940, - -157303, 117575, 76236, -57982, -23085, -54761, -289373, -166430, 61740, -177167, - -37044, -9127, 97174, 74625, 8053, -71404, 164283, 198642, 18254, -34360, - -61203, -97711, -81068, -10201, -75162, -15032, 95026, 9664, -8053, -107374, - -24696, 18790, 32212, 52076, -68183, -2684, -42413, -11811, 25770, 1074, - -6442, 11811, 2147, -22549, -26844, 3758, - }, - }, - { - { - 5842766, 4699768, 5328981, 1782948, 363462, 211527, -358093, -222265, -336081, -360240, - -457414, 501437, 475668, 407485, -2301566, 1079647, 297963, -215285, -1027034, 1891933, - -290447, -362925, 583042, -381178, -228707, 270046, 521839, -63351, -403190, -259309, - 287763, 38118, -603980, 501437, 421981, 173946, -598611, 76236, -177704, 329639, - 467078, -56371, -630286, 217970, 326954, 158914, 245350, -71941, 301721, -240518, - -220117, 77846, 373125, 282394, 230854, -72478, 220117, 127238, 188442, 59056, - -133144, 28991, 101469, 61740, 40802, 117575, -114890, -87510, 56908, 27917, - 97174, -110595, 73014, -22549, 25770, -42413, -72478, 59056, 8053, -107911, - 13422, 5369, -30065, -12348, 24159, -29528, 1611, -13959, -37581, -52613, - 13959, 8053, 20401, 23085, 2684, -12348, - }, - { - -69793, -3772055, 5218386, 191663, -660888, 462246, -1384590, -353261, -46171, 419296, - -400506, 22549, 186294, -18790, -1192927, 210453, -770947, -54224, 1206349, 1188632, - -20401, -931471, -64425, -208306, 738734, -398358, 460098, -388695, 102542, 698469, - -505196, -155156, -375810, 325344, -399969, -229244, -167504, -301185, 549219, 217970, - 335544, 37581, 121333, 18254, -73014, 537, 45634, 124017, 209380, -159451, - 58519, -160524, -25233, 95563, 249645, 117038, -205622, -120259, 124017, -62277, - -251792, -96100, 65498, 60130, -16643, 85899, 537, -48318, 72478, 32212, - -25770, -9127, 65498, 11274, -19327, 61203, 27380, 20938, -78920, -97711, - 116501, -537, 10201, -15569, -16106, -12348, 15032, -13959, -54761, 23085, - 30602, -3221, -13959, -85899, 11811, 27917, - }, - { - -491237, 41166188, -1089848, 874563, -337692, 415001, -27380, 388158, 150861, -319975, - -926639, 35970, 814433, -831613, 289373, -312459, -941672, 1066226, -90731, -1333051, - 732292, -57982, 452045, 403190, -599148, -1216550, 150324, 179315, 175557, -967441, - 545998, 0, -788663, 192737, -40265, 420907, -293132, 566936, -181462, 409096, - 267362, 271120, -49929, -36507, 223338, -468688, 139586, 45634, 204548, 197569, - -102005, 82141, -212601, 402653, -190052, 92342, -121333, 99858, 187368, 6979, - -137976, -31675, -25233, 37581, 5906, 16643, -98784, 70867, -38118, 88047, - -40802, -121870, -51540, 74625, -39192, 74625, 19327, -42950, -2684, 20401, - -46171, -91805, 22012, 82141, -30602, -42413, -54761, 27917, -4295, 12348, - -6979, 5369, -21475, 9127, -1074, -32212, - }, - { - 4787278, -29979946, -86436, 2945274, -1125818, 310848, -131533, 226023, -420907, 159988, - 25233, 162135, -643171, 525060, 1040456, 1064615, -368293, 401043, 734439, 547608, - -100932, -124554, 227633, 127238, 99321, 3221, -188979, 14496, -483721, 150861, - 147103, -306016, -128849, -841814, 140123, -631360, -317291, 353261, 227096, -60666, - 367220, 51540, -257698, -484258, -4295, -249645, -127238, 279710, 221191, -155693, - -71404, 64425, -41339, -144955, -222265, 35433, -28454, -229781, 59056, -47245, - -181462, -69793, -43487, -48318, -151934, 53687, -104690, 45634, 46171, -142271, - -5906, 79457, 68719, -54761, 40265, -61203, -19864, -61203, 3758, -4832, - 2684, 33823, 17717, 13422, -47782, 10201, -20401, 35433, 23085, -34897, - -41876, 24696, 2684, -27380, -1074, 8053, - }, - { - 429497, -4204773, -554588, -659814, -56371, 55298, -176631, -271120, -228170, -91268, - 364535, -302258, -18790, 77846, 703301, 579284, 372588, -5051956, 2115272, 689342, - 571231, 1056562, -1277216, 629213, -1187559, 814970, -1178432, 112206, 667331, 593242, - 99321, 830539, -217970, -724776, 17180, -555125, 477815, -555125, 215285, 404264, - -68719, 126702, -472983, 43487, -148713, -303869, -120796, 34897, 33286, 25770, - 216896, 302795, 104690, 185220, 132070, 83215, 105227, -128849, -9664, 91805, - 121870, -138513, 122943, -73551, -280247, -73014, 21475, 80531, 30602, -19864, - 102542, 75699, 63888, -43487, -2684, -126165, 88047, -22549, -86436, -33286, - -19327, 42950, 46708, -62277, -1611, 26307, 3758, 27917, 10201, -7516, - -3221, -23085, 12348, 46171, -30602, -7516, - }, - { - 6715718, -50121196, 5780489, -355945, -1292248, 127775, -448824, 392453, 729071, -529892, - -552977, 251792, 227633, -433792, -514322, 1778653, 464930, -281857, -73014, -235686, - -270046, -415001, 64425, -506806, 88047, 358093, -58519, 66035, 329102, 157303, - -293668, 176631, -204011, -266288, 214212, -163209, -401043, 65498, 93416, 337155, - -168577, 81068, -666257, -32212, 274878, 82141, 89121, -151934, -161598, 137976, - 63351, -287226, -292058, 68183, -63351, 46708, -96637, -221728, 88584, 53150, - -7516, 29528, -168577, 15569, 139050, 55835, -61203, -80531, -20938, -63888, - 66035, 29528, 31675, 9664, 25233, -2147, -33286, 30602, 76773, -12348, - 33286, 83215, 4295, -10737, -40265, -3758, 7516, -30602, 24159, 12348, - -5906, 4832, -5906, 85362, -16643, -6442, - }, - { - 134218, -3762928, 630286, 333934, -49392, -66572, -370978, 535797, -335544, 235149, - -148176, -19864, -23085, -261993, -2735357, 723165, 2506650, -823023, 1304596, 673773, - -792958, 418222, -1043677, 134218, 1236951, -710280, 1653562, -852014, -268435, 436476, - -409096, 925565, -47782, -521302, -296890, -24696, 139586, 473520, 129386, -258772, - 56371, 672162, 159451, 267362, 16643, -169651, 56908, -23622, -55835, 302795, - -216359, -121333, -70330, -33823, -143881, -110059, -56908, 158914, -167504, 84826, - 41339, -28454, 6979, 31675, -6979, 9664, -82141, -183073, -57982, 146029, - 27380, -150324, -46708, 20401, -54224, 44023, -117575, -42413, 38655, 3758, - -7516, -10737, 37581, -4295, -25770, 8053, 10737, 0, 13959, 31675, - 19864, 10737, -6442, 8053, 11811, -10737, - }, - { - 1801202, 21794812, -809064, 78383, -697932, 238371, 273804, -391916, 200253, -270046, - -218506, 685584, 178241, -526670, 93416, -27917, 62277, 507343, 98247, -244276, - 241592, 331249, -684510, 168577, 434329, -275952, -17180, -514859, 120259, -426276, - 100395, 69793, 410169, -129386, 111669, -332323, 395137, -96100, 218506, 5369, - 128849, -397284, 339302, -132070, -382252, 409633, -52076, 90731, -156229, -198105, - -47245, 2684, 14496, -62277, -30065, 120259, -141197, 71941, 185220, -3221, - 105227, -9664, -13422, 3758, 3221, 65498, -32212, 150861, -11274, 23085, - 46708, 1074, -43487, -61203, -16106, 73551, -71941, -34897, 87510, -96100, - -21475, 32212, -12348, -11274, 20938, -35433, 12348, 3758, -29528, 2147, - 19864, 23622, -5369, -1611, -5906, 20401, - }, - { - -93416, -1131187, -424128, 606664, -79457, 140660, -294742, -310311, -137439, 82678, - 54224, 350040, -120796, 847182, 1119913, -1234266, 52613, 173409, -276489, 766652, - -214212, -600222, 283468, 79457, 1002875, 245350, -1069984, 9127, -259846, -414464, - 1418413, -1024350, 355945, -59593, -500364, 417149, 30065, -215822, 409633, -299037, - -305480, -222265, -215285, -208306, -19864, 32212, 78920, 315680, -5906, 198642, - 58519, -44560, -81604, -253403, -24696, 186294, -106300, -129386, -4832, 217970, - 101469, 15569, -96100, 89657, 121333, 82141, 92342, -25233, 15032, 46171, - 68183, 7516, -41339, -42413, -86436, 18790, -19327, -56908, -25233, -3758, - 26844, 44023, 17180, 19327, -30602, -65498, -64961, -22549, 14496, 16643, - -28454, 22549, -10737, -41876, -43487, -17717, - }, - { - 1188095, -24677272, -6532109, 1099512, 706522, -2956011, 1604707, -591632, -246424, -479426, - -75162, -591095, -135828, 291521, -1328756, 455803, -810138, 437550, -825171, 781684, - -720481, 28454, -509491, 114354, -345208, -357019, 254477, -410169, -323733, 113817, - 108985, 227633, 454730, -905701, 710280, 143881, 125628, -48318, 212601, -33286, - -111669, -277025, 367757, 308701, -438624, -218506, 64425, -81604, -59056, -95563, - 50466, 56908, -48855, -28991, -59593, -30065, -6979, 39728, 32749, -61740, - 35433, 8053, 19864, -65498, 8590, -63351, 27917, 47245, -37581, -47245, - -6979, 6979, -23085, 4832, -30602, 15569, 19864, 37044, -54224, 11811, - 76236, 10201, -70330, -34360, -10201, -72478, -42950, 3758, -48855, 18254, - 20401, 11274, 1611, -9127, -20938, -31139, - }, - { - 288300, 4468377, -1628866, 2158758, 31675, -108448, 205085, -1150514, -555661, -333934, - 463856, 813896, -107911, -1045825, 319975, -401579, -588947, -445603, -1320166, 391379, - 462783, -53150, -84289, 349503, 70867, -681826, 337692, -707059, 523449, 507343, - -150861, -147103, -5906, -207232, 60130, -135291, 485868, 133144, -219043, -168577, - -292595, -98784, 214748, -289373, 186294, 137439, -129923, -64961, -107911, -102005, - -117575, 64961, 71941, 139050, 71941, 55835, 15569, -66035, -48855, 13422, - -118112, -44023, 199716, -26307, -34360, 25770, -2684, -20401, 17180, 28991, - 153008, 8053, 73014, 3221, 12348, 35433, 97174, 41876, -3758, -29528, - -3221, -6979, -55835, 71941, 32749, -35433, 38118, -11811, 24159, -10201, - -33286, 5369, 20401, -537, -24696, 11274, - }, - { - -2051384, 2142115, -797253, -1422171, -460098, 865973, 284005, 161061, 127775, 244276, - 617402, 55835, 937914, -1300301, 455803, -39192, 332323, 377420, -400506, -148176, - -208306, -205085, 143881, 397284, -369904, -94489, -503585, 128849, -51540, -266288, - -155156, -210453, 228707, -195421, -263067, 120796, 688805, 594853, 153008, -331249, - -156229, -40802, -85362, -204011, 181999, 24696, 7516, 20401, -83215, 82141, - -291521, 113817, -107374, 95026, -13422, -88584, -69256, 73551, 63888, -44023, - -159988, 88584, 76236, -73014, -43487, 117038, 83752, 76236, 37581, -86436, - 22012, 28454, 6979, -8590, -43487, 38655, -9664, 22012, 61203, -11811, - -25770, -59593, 38118, 12885, 2147, 39192, -6979, -20938, 4832, -46708, - -22012, -21475, -13959, 25770, -8590, -8053, - }, - { - -146029, -705985, 1015223, -919123, -192737, -199179, 104153, -337692, 566399, -231391, - -122943, 202400, -2693481, 1276679, -4266513, 2544768, 338766, 1098975, 268972, -17717, - 1809255, -1707786, -2177549, 167504, -49929, -347892, 163746, -332860, 301185, 169651, - -194347, 297427, -822486, -23622, 97174, 616328, -520765, -73014, 317291, -95563, - -118648, -82141, -242129, -552977, 333397, -286689, -474594, -95026, -72478, 189515, - 77846, -379031, 192737, 51003, -202937, 15032, -61740, 122943, 17180, 178778, - 105227, -53150, -96637, -18790, 57982, 30065, -105227, 110595, -49392, 61740, - 15032, 108448, -97711, -56908, -18790, -32749, -61740, 37581, 44023, -12348, - 45097, 60666, 9127, 3758, 2684, 8590, -46708, 13959, -20401, 60130, - 4295, -79994, -33823, 47782, -19864, -15032, - }, - { - -3231426, 9835475, -624381, 1867774, 159988, 1210107, 408559, 900333, -456340, 221191, - 511101, -1476932, 793495, 1411971, -4882841, 454193, 1716913, -206695, -373125, -377420, - -122943, -227096, -456340, -368830, 421444, -113817, 406411, 487479, -774705, 270583, - -32212, 326954, 856309, 217433, -447213, 510027, 437550, 127238, 28991, 45097, - -288837, -631360, 276489, -70330, 488016, -139586, -85362, -357556, -45634, -202400, - 13959, -107374, -70867, 98784, 98784, 2684, 119722, -148176, 17717, -223338, - 86436, 132070, -17717, 184147, 70867, 127775, 39728, 69793, -36507, 56371, - 81068, -50466, 34897, 19864, -16643, 30602, -5906, 25233, 44560, 48855, - 23085, -15569, 74088, 9127, 31139, -537, -54224, -22549, -9664, 23085, - -32749, 10201, 16106, 16106, -17717, 2147, - }, - { - -142808, -2066416, -601295, -321586, 129386, 29528, -66572, -49929, 781684, 564788, - 459562, 95563, -166967, 5590974, 209380, 715649, 349503, 53150, 1990181, -1350230, - -67109, -567473, 245350, -69256, 39192, 496606, 199716, -343061, -757525, -830002, - -491774, 355409, -653909, -3221, -13422, 54761, -552977, 143345, 299037, -497679, - 55835, -212601, -112206, 159451, 163746, -155693, 54224, 81068, -42950, -173946, - 73551, 18254, -81068, 125091, 75699, -91805, -285615, -137439, -78920, -304943, - -4295, 24159, 23622, 9664, 14496, -17717, 119185, 19327, 12348, 11274, - 3758, -60130, -37044, 20938, -67109, 78383, -28991, -22549, 11811, -29528, - 74088, 45097, 30065, -36507, -24159, 40265, -50466, -18254, 34360, -23085, - -12348, 24696, 12348, -14496, -1611, 12885, - }, - }, - { - { - -6917045, 33987148, -3126736, 2028835, 504122, -552977, 119722, -388695, -25770, -160524, - 468151, -317828, -367220, -460635, -273267, 789200, 315680, -651224, 391916, 630823, - -201327, -287763, 500901, -198642, -300111, 118648, 37044, 125091, -142271, -268972, - 38655, -62814, -4832, 506806, 139586, -242129, 248034, 303869, 31139, -142271, - 227096, -207769, -60666, 64961, 236760, 406411, -184147, -86973, 124554, -78920, - 116501, -55298, 290447, 136902, 126165, 142808, -45634, 56908, 106837, 40802, - 137976, 5369, -25233, -6442, -49392, 19327, 36507, 21475, -11274, -41339, - -31139, 0, 32749, 36507, -38118, -93952, -15032, 2147, 15032, 39728, - 38655, 78383, 7516, -9127, -11811, -30065, 62814, -28454, 24696, -29528, - 5369, 3758, 14496, 5369, 10737, 1611, - }, - { - 408022, 4048007, 62814, 1083406, 412854, -775778, -542240, -78920, 12885, -279710, - -1074, 181462, 172336, -618475, -261456, -927713, -1892470, -377957, 1829656, 641561, - 56908, -839666, -1347009, 110595, 261993, 702227, 45634, 45097, 570694, 367757, - -316754, -107374, 386010, 46171, -377957, -278636, -164283, 57982, 140660, 383326, - -103616, 438624, 436476, 161598, -25233, -66572, 137976, 38118, -537, 78383, - 87510, -135291, 223338, 213675, 100932, -285615, -113817, -122407, -8590, 70330, - -1611, -1074, -84826, 76236, 42413, -45097, 112743, 134218, 4832, -17180, - 72478, -1611, -27380, -12885, 43487, 41876, -78383, -52076, -43487, 47782, - 19327, -35970, 11274, 39728, -26844, 55298, 47245, -51003, 17180, 34897, - -45097, -12885, 27917, 20938, 34897, -30065, - }, - { - -151398, 23111220, 8017630, 3263102, 2166811, -353261, 212601, 195958, -221191, -497679, - -7516, -488553, -427349, 86973, 539555, -340376, 19327, 176631, -376347, -539018, - -31139, 439160, 188979, 77309, -383863, -230854, 248571, -225486, 18254, -295279, - -715649, 1611, 15569, 186294, -307090, 63351, 748398, -382252, 4832, 11274, - 293132, -121870, 348429, 151934, 304406, -35970, -93952, 226560, 173946, 2684, - 150324, -13422, 166967, -32212, 280247, 85899, -68719, 25770, 2684, 26844, - 22012, 33286, 119722, -55298, 23085, 125628, -52076, 1074, 62814, 67646, - -27380, -75699, 22012, 25770, 5369, -15569, -68183, 16106, 46708, -36507, - -28991, -22549, 45634, -13422, 20938, 12885, -2684, -24159, 6442, 12348, - -22549, -54224, -34897, 5369, -45097, -1611, - }, - { - -3411815, -14536854, -3791919, 1699196, 102542, -147103, 144418, 78383, -83752, -146029, - -574452, 237297, -642098, 610422, 756988, 391916, -94489, 720481, 73014, 53150, - 153545, -21475, 512712, -159988, -276489, -164283, -522912, 248034, -45097, 539018, - 290984, -517007, 275952, -570694, -292058, -140660, -569083, 328565, -20938, 136902, - 208306, -127238, -27380, -325881, -250719, 222265, 123480, 15032, 206158, -172336, - -19864, -81068, -112743, -24159, -139586, 140660, -55298, -63351, -40802, -149787, - -114354, 37581, -32749, -41339, 51540, -46708, 56908, 20938, -40265, -3758, - 0, -26307, -79994, -10737, -23085, -11811, -13422, -57445, 5369, 47782, - 76773, 53150, 21475, -41339, -28991, -45097, -537, 7516, -47245, -7516, - 21475, 35433, -18254, -6442, 8053, -3758, - }, - { - -284005, -6557878, 518080, 20401, 71941, -213138, -90194, -170188, 18790, 326954, - 3221, -349503, -2147, 877247, 1344862, -1719598, -3398393, 485868, 1680406, -206695, - 562104, 292595, -441845, 328028, -716723, -859530, -518080, 126702, 47782, 740345, - 746787, 308701, 49392, -190589, -255014, -197032, -68719, 74625, -35433, -27917, - 313533, -144418, 32749, -49392, -44023, -104153, -120259, 131533, 166430, 41876, - 482110, 76236, 142271, 156229, 106837, -35970, 51540, 54224, 108985, -42950, - 190589, -15569, 66572, -59593, 4295, 26307, 53150, 44560, -55835, 74625, - 64961, -52076, 5906, -37044, -91268, -1074, 65498, 13959, 38655, 29528, - 48318, 16106, -58519, -11274, 29528, 6442, 29528, -3221, 14496, 11274, - -16106, 32212, 18790, -30065, -11811, 28454, - }, - { - -5254893, -24915106, -3515431, -558883, -300111, -152471, 293668, 180926, -144955, 497142, - 558346, -53150, -195421, -457951, 37581, 1754494, 374199, -325344, 130997, -102542, - -57982, 211527, -481573, -630286, 154082, 551366, -220117, 121870, 369904, 134755, - -377957, -23622, -311385, -442919, 335007, -184684, 119185, -426276, 28454, 287763, - 240518, 122407, -759136, 68183, 199179, 133681, -204548, -144955, -177167, 38118, - -51540, -278636, -40802, 111669, 136365, 18254, 80531, 16106, -30065, -129923, - -9664, 28991, 3758, 119185, 147640, -37581, -3758, -11811, -77846, 33286, - 42950, 61203, 537, 22012, 31139, 5369, 37044, -4832, -33823, 2684, - 1611, -12885, -91268, -37044, 16643, 10737, 41339, 14496, 30065, -18790, - 1074, 6979, 26844, 16643, -26307, 3221, - }, - { - -352724, -1049583, 956704, -201327, -79457, -115427, -107911, 98784, 106300, -266825, - 116501, 164283, -351650, -1945083, -1576253, 762894, -57982, -399432, -641561, 744640, - 168577, 19327, 811749, -1291711, 263604, 290447, 213675, 494995, -985695, 149787, - 191663, 641561, 193274, -282931, 464930, -257698, 140660, 124554, 189515, -47782, - 326418, 246424, 321049, 100395, -148176, 265751, 70867, -227633, 80531, 4832, - -197569, -39192, -12348, -67646, -36507, -79994, 89121, 120259, -158914, -52076, - -20938, -47245, -86436, -8053, 17717, -105764, -47782, -66572, -2147, -28991, - -106837, -3758, 64961, 39728, -6979, 34360, -17717, 79994, 39192, 11811, - 13959, -537, 14496, -30602, 3221, 47782, -19864, -51540, 1611, -42950, - -68183, -38118, 20938, 31139, -22549, -13959, - }, - { - -1793149, 12440373, 5942624, 168041, 238371, 472983, 198105, -839666, -130460, 53150, - 329639, 178778, -408022, 890669, 439160, -405338, 439160, -375810, -445603, 253403, - 372588, 122943, 159451, -53687, -94489, -155156, 286689, -427886, 22549, -18254, - -74088, -70330, 60130, 295279, 25770, 503048, 188979, 342524, -93952, 99858, - 85362, -330176, 62277, -117575, -147640, 336618, -32212, -437013, -158914, 183610, - -132070, -42950, -296890, -153545, 135828, 66572, 125091, 51540, 189515, 7516, - 20401, -23622, -1611, 11811, 33823, 20401, 25233, 35970, 30602, -19864, - 24696, 27917, -56371, 63351, 106837, -28991, -17717, 60666, -3758, -29528, - -537, -59056, -17180, 0, -17717, -57982, 18254, 80531, -10737, 3221, - 12885, 12885, 40265, 25770, 16106, 537, - }, - { - -569083, -1356136, 3013457, -69256, 235686, -68183, -42413, -485331, 333397, -61203, - -38655, -56908, -351114, 1074279, 1145683, -2127620, -121333, -89121, -541703, 2070711, - -301185, -1376000, -140123, 1567126, 645856, 624918, -989453, 140123, -617938, 111669, - 237834, -96637, 279173, -896574, 126702, 567473, 19864, -403727, 221191, -179315, - 134755, -232465, -294205, 183610, 271120, -99858, 209380, 216359, 114354, 83752, - -3758, -151934, -128312, 3221, -33286, 29528, 10201, 109522, 145492, 107374, - 9127, -191126, -57445, -16106, -77309, -136902, -42413, 2147, 30065, 53150, - -31139, -40802, -92879, 13959, 73551, 18790, -36507, -1074, 9664, -39728, - 20401, -76236, -63888, 20401, -15032, -35970, 38655, 49929, 4295, -34897, - 10737, 17717, -10201, -24696, -24159, 22549, - }, - { - -2325188, -20565378, -4748623, -2065879, 558346, 457951, -3019899, 35433, -396211, 56908, - 71941, 191663, 60666, -803159, -471910, 14496, -299574, 251792, -161061, -282394, - -232465, -181462, -200790, -246961, -62277, -527207, -160524, -13422, 168577, 52076, - -28991, 60130, 446140, 89121, 502511, -41339, 189515, 113280, -113817, -129386, - 274341, 214748, 154082, -286152, 51540, 224949, 23622, 1611, 11274, 212064, - 121333, 162672, 121870, -52076, -281320, -70867, 95026, -130460, 4295, 9664, - -174483, 93952, 64961, -537, -47782, -40265, 10201, -24159, -12885, 55298, - 3758, -52613, -12885, 38655, 9127, 10201, 9127, 41876, -64961, 21475, - -8590, -22549, -17717, 5906, -2684, 43487, 51003, 23085, 33286, 15569, - 16106, 5369, -48318, -28991, 9664, 23085, - }, - { - -154619, 3354370, 1119913, 1173600, 290447, 328028, -456877, -1616518, 133681, 181999, - 287763, 381178, -226560, -565862, -1196148, -467078, 418222, -1279363, -803696, 773094, - -1293322, -96100, 989453, 88047, -253940, -88047, -52613, -206695, 192200, -426276, - -83215, -243739, -94489, 39728, 15569, -78920, -13422, -63351, -192737, -314606, - -261993, -3221, -33286, 136365, 63351, -49929, -25233, -63888, -12348, 147640, - 64961, 103616, -71404, -85899, -195958, 180389, -34360, 11274, 65498, -57982, - -22549, 99321, -33823, -69793, 52076, 161061, -9664, 108448, 88584, 30065, - 75699, 22012, 2147, 24159, 60666, 29528, 2684, -81068, -44023, 9664, - -31139, 22549, 41339, -24159, -41339, -17717, 0, -5369, -25233, -62814, - -22012, 10201, 8053, 9127, -6979, 15569, - }, - { - 1717450, -2412161, -3391951, -1019518, 727460, -291521, -522912, 843424, -184147, 577673, - 95563, -564788, -208306, -442382, 442382, -240518, 418222, -85899, 38655, 79457, - -357556, 340376, 266288, -321049, -342524, -95563, 437013, -86436, -350040, -420370, - -369367, -131533, -178241, -421444, -2684, 116501, -183610, 48318, -59056, 49392, - -11274, -194884, 13422, 48855, 38655, 187368, -214212, 57445, 164283, -31675, - 112743, 60130, 139586, 83215, -112743, 14496, -78920, -59593, 31675, -107374, - -23622, 34360, 11274, 55298, 63351, -51003, 12885, 19864, -11811, 16106, - 72478, -81068, 50466, 16106, 17717, 27917, -32749, 10201, 12348, -6442, - -11811, 21475, 24696, 1074, 47782, 31139, -54224, 16643, -26307, -2147, - 29528, 9664, 49392, -11274, -9664, 6442, - }, - { - 191663, 1886564, -1901060, -615254, 220654, 214212, 204011, -523449, 357019, -20401, - -2147, 374736, 816581, -6958921, 1187559, 1542430, 169651, 1614371, -325881, 850940, - -361314, -715112, -770410, -55298, -134755, 970663, -101469, -1055488, 229781, 386547, - 565325, 208306, -1255741, -284542, 3221, 267362, -446140, 88047, 82141, 289373, - -15032, -121870, -311922, -240518, -155156, 52613, 22012, -5906, -200790, 114354, - 270583, -4832, 89121, -10737, -7516, -11274, 98247, -146566, 83752, -14496, - -145492, 22012, 111132, 53150, 84289, -67646, 15569, -60130, -63888, 110059, - 57982, 22012, 3758, -61740, -25233, 104690, 24159, 35970, 1611, -4295, - -33823, -43487, -68719, -51003, -2684, -11811, 18790, 29528, -6442, 9127, - -34897, -6979, 66035, 22549, -38118, 32749, - }, - { - 2339684, 1752884, 2027225, -1476395, -607201, -110595, 159451, 606127, -149787, 494458, - -820339, 1536525, -83215, -1266479, -305480, 429497, -353261, -338229, -199179, -374736, - -237834, -137439, -524523, -195958, 241592, 313533, 616865, 296353, 103079, 461172, - -95563, 460098, 302258, -260919, -165356, 144418, 6442, -170188, 116501, -44560, - -138513, -238908, 136902, 45634, -128849, -372588, -227096, -294742, -123480, 20938, - 50466, -295279, 10737, 185757, -20938, -122407, -75699, -20401, -70330, -143881, - 48855, -8590, 114354, -17180, -34360, -61740, 69256, 13422, 1074, 42950, - -1074, 77309, 49392, 0, -73014, -39728, 14496, 74625, -15569, -84289, - -2147, -4295, -39192, -26844, 15569, -34360, -44023, 62277, 29528, -28991, - 11811, 8053, -33286, 10201, 1611, 10737, - }, - { - 240518, -3020436, -864899, 205085, -70867, -39192, 153545, 338766, 574452, 243739, - -344134, 24159, -856309, 3864397, 11783780, -1212255, -214748, -357556, 1455457, -636729, - -1561758, -509491, 860604, -76773, -362388, -171799, 523449, -852551, -540629, -1080184, - -97711, 406411, -636729, 290447, 90194, -449898, 413391, 201863, -112743, -128849, - -210453, 249645, 455803, -16106, -261456, 171799, -255551, 39728, 146566, -8053, - 7516, 133681, 176631, 187368, -115427, -76236, -95026, -43487, -160524, 98247, - 202400, 12348, 2147, -44023, 57982, 121333, -179315, -64425, 86973, 74088, - -50466, -1611, 89657, 53687, 34360, 44560, -104153, 38655, 23085, 97174, - -1611, -54761, -39728, -8590, 27380, 6979, 15032, -21475, -31139, -12348, - 0, -22549, 13422, 23085, 9664, -29528, - }, - }, - { - { - 4245575, 51441360, -9879499, 276489, 442919, -186831, 628139, -261456, -21475, 52076, - 172872, -564788, -336618, 338766, 1050120, -179315, 93952, -259846, -335544, -125091, - 386010, 192200, 148176, -27380, -162672, -180389, 26844, 253940, -237297, -289373, - -150861, -46171, 177167, 385473, -70330, -28454, 398358, 347355, 92342, -104153, - -23085, -159451, 68719, -180389, 122943, 141734, -317828, -162135, -90194, -143881, - -3221, -279173, 41876, -84826, -44560, 96637, -25770, -9664, 18790, 137439, - 93952, -39728, -70330, -13422, -18790, 21475, 73014, 21475, -9127, -38118, - 15569, 95026, 15032, 18254, -15032, -13959, 5369, -53687, 68719, 49392, - 29528, 44023, -20401, -6442, -15569, 21475, 12885, -14496, 44023, -6442, - -10201, 10737, -10737, -4295, 13959, 8590, - }, - { - -731755, 5573257, 1144072, -636729, 77309, -177704, 186831, 212064, -8053, -139586, - 279710, 40265, -11811, -205622, -954557, -533113, -514322, -973347, 80531, -224412, - -171799, -222265, -257161, 567473, -148713, 137439, 181462, 296353, 263067, 302795, - -275952, 20938, 406948, 5369, 334471, 48855, 137976, 153545, -358093, -107374, - -266825, 268435, 17180, -229244, 155693, 6979, -3221, -342524, -35433, 76236, - -51540, -97174, 177704, 53687, -211527, -216359, 23622, -58519, -24159, 150324, - 102005, 17180, -83752, -20938, 36507, -6979, 86973, 59056, -56908, -21475, - 102542, -62277, -8590, 20401, 57445, -30602, -74088, -537, 17180, 42413, - -46171, -45634, 12348, 32212, 4295, 44023, 17717, -25770, 33286, -26307, - -49929, 9127, 51540, 40265, 20401, -33823, - }, - { - 1184337, 7301445, -5523865, 3452617, 732829, -671626, 358093, 360240, 11274, -6442, - 448824, -691490, -626528, 253940, 518617, 148713, 794032, 615254, -347892, 444529, - 62277, 365072, -130997, -19864, -96637, 613107, 514859, -387084, -289910, 243739, - -209917, 168577, -70867, -39728, -395137, 515933, 765578, -270583, 337692, -260919, - -48318, -229781, 222801, -201327, 172872, -16106, -88047, 210453, 86436, -118112, - 147103, 50466, 142271, -76773, 287226, 49929, 4832, -65498, -97711, -74088, - 75162, 104153, 191663, -46708, 28454, 76773, -86973, -20401, 62814, 22549, - -6442, 24696, 53150, -35433, -28991, -26307, 8590, 30602, -18790, -9664, - 13959, 13422, 25770, -31675, 27380, 31675, 19864, -58519, 23085, 20401, - -19864, -24696, 3758, -9664, -12885, 27917, - }, - { - -110059, -6858526, -2466385, 1012002, -95026, -337692, -164819, -55835, -130997, -190052, - -694711, 325881, -645856, 777389, 215822, -336618, -386547, 15569, -277025, -185220, - 47245, -305480, 122943, -429497, -360777, -149787, 42413, 236760, 168041, 337155, - 138513, -268435, 333397, -181999, -134218, 33286, -233002, -92342, -86436, 112206, - -137439, -126702, 168577, -62277, -173409, 257161, -8590, -73551, 96100, -69256, - 68719, -69256, 45097, -26844, 23085, 164283, -4832, 17717, -192200, -90194, - 72478, 93416, -10201, 37044, 32212, -1611, 117038, -49929, 1074, 34897, - -21475, -85362, -40265, 33286, -13959, 8590, -22012, 1611, 31675, 27917, - 35970, 9127, -25233, -9664, -537, -32212, 27917, -24696, -19327, 22549, - 18254, -2684, -13959, 15569, 5906, -9664, - }, - { - 341987, -7179038, -571768, 125628, -24696, -77309, 265214, -59056, -140123, 267899, - 121870, -237297, 503585, -285615, 1705639, 450972, -619012, 4452808, -1939178, -64425, - 897648, 369904, -282931, -326954, -410706, 429497, 1198833, 310848, 29528, 312996, - 282394, -370441, 352724, 27917, -255014, 8590, 231391, 128849, -383326, -192737, - 201863, -17717, 210453, -88047, 75699, 28454, 30065, 208306, -118112, -1611, - 296353, -130997, 164819, -62277, -57445, -222265, 25770, 79457, 69256, -15032, - 151934, -70867, 78920, 69793, 166967, 25233, 17717, -48855, -102005, 52076, - -24696, -68719, 1074, 43487, 2684, 82141, 7516, 0, 64425, 4832, - 16106, -37581, -22012, 72478, -24159, -12348, -11274, -51003, 8590, -1074, - -1074, 39192, -6442, -37044, 28991, 24696, - }, - { - 876710, -11529840, -614180, -299574, 560493, 9664, 567473, -507343, -376883, 958851, - 537945, -82141, -24159, 540629, 488016, 639950, -319975, -197032, 237834, 268972, - 115427, -124017, -93416, -180389, 6979, 85362, -34897, 50466, 161598, -126165, - -425739, -537, 107374, 190052, 98784, -387621, 432718, -71941, -65498, 114354, - 383326, 270583, -325881, -11274, -14496, 150324, -95563, 89657, -99321, 110059, - -83752, 37581, 155156, 95563, 58519, 24696, 251792, 102005, -38655, -185757, - -22549, 57982, 21475, 85899, -24159, -69793, 100395, 1611, -41876, 18254, - 2147, -15569, 10201, 44560, -43487, 44560, 37581, -23085, -55835, 15032, - -41876, -32749, -31139, 19864, 32749, 10737, -4295, 35970, -6442, 6442, - -12348, -8590, -5906, -18790, 10201, -1074, - }, - { - -122943, 1073205, 858457, -355409, 29528, 39192, 5906, -205085, -104153, -176631, - 115964, -13959, -188979, -1533303, -1867774, 239444, -811212, -1424855, -1154809, 961536, - 458488, -246961, 1060320, -1118302, -124017, 188442, -660888, -722628, -413927, 219580, - -138513, 241055, 169651, 165356, 472983, -288837, -212064, -96100, 304406, 258772, - -105764, -311385, 223338, -133681, -57982, 297963, 39192, -105764, 77846, -192200, - -76236, 125091, 45097, -85362, 104690, 1074, 88584, -18790, 16643, 20938, - -50466, -15569, -40802, -10737, 84289, -68719, 78920, 3758, -20938, -101469, - -30602, 118648, 27917, 70867, 51003, 26307, 23622, 70330, -1611, -3758, - 37581, -11811, 8590, -24159, 15032, 25770, -43487, -39192, -20401, -47782, - -45634, -4832, 22549, -9664, -2684, 6979, - }, - { - 4327717, 6724308, -4487167, -435939, 186831, 187368, -276489, -244276, -127775, 110059, - 271120, -605590, -303869, 579821, -494995, -372588, 93416, -776315, 25770, 474594, - -174483, -191126, 325344, -28991, -315680, 263604, 404801, -210453, 49392, -75699, - -264141, -183073, -70330, 184147, 32212, 418759, -131533, 29528, -289373, 88584, - 113280, -22012, 30065, -345745, -144955, 110595, -4832, -476205, 537, 267362, - -40802, -84289, -244276, -30602, 143345, 88047, 139586, -41339, 74088, -84826, - -57982, 9127, 79994, -39728, -47782, 2684, -537, -2147, 25770, 7516, - 10201, 15032, 38118, 67646, 6979, -89657, 43487, 15032, -28454, 27380, - -10737, -83215, 6442, 11811, -18254, -23622, 19864, 45097, 6442, 5369, - 537, 20938, 27917, 31675, 537, -22549, - }, - { - 11274, 382789, 1429687, -293132, 22549, -71941, 181462, -198642, 474057, -13959, - -212601, 26307, 119722, 1083942, 1431835, -1227287, -1188632, 207769, -170188, 1016297, - 380641, 321586, 749472, 2193655, -167504, 452582, -85899, -570157, -516470, 459025, - -316217, -131533, -77309, -488016, 199179, -66572, 330176, 203474, 57445, -119185, - 284005, -74625, 30602, 230854, 93416, -260382, 44560, -50466, 92879, -24159, - -50466, -40802, 113817, 58519, -133681, -70330, 73014, 126165, -102542, -32212, - 38655, -74088, 105764, -39728, -14496, -56908, -70867, -19327, -2684, 5369, - -44023, -6442, -19864, 70867, 44560, -39192, -20401, 28991, 31675, -15032, - -24159, -118648, -13422, 15032, -2147, 15569, 52613, 20401, -1074, -23085, - 20401, -1611, 16106, -2684, 15032, 28991, - }, - { - 3174518, -12686260, -3504157, -1912334, 971200, 850940, -2805151, 188979, -272194, 416612, - -12885, 145492, -60666, -520765, -363998, -123480, 566936, 257161, 92342, -108448, - 179315, -122407, 98247, 35970, 375810, -258235, -399432, 111669, 517007, -165356, - -200253, -188979, 79994, 155156, 374736, -303332, 173409, 281320, -239444, -98247, - 275952, 369904, -64961, -319975, 477815, 326418, -24159, 177167, 69793, 223338, - 34897, 45634, 79994, -142271, -201863, 34360, 26307, -132607, 41876, -39728, - -78920, -4295, 2147, 26307, -102542, 38655, -2147, -77846, 12885, -8590, - 9127, -32749, 14496, -2147, 35433, -16106, 19864, -27917, 10201, -23622, - -25770, -2684, 35970, 1611, 36507, 64961, 33286, 3758, 32212, 1074, - -3221, -12885, -24159, -6442, 23622, 26307, - }, - { - 231391, 1081258, -674847, 14496, 143345, 89121, -609349, -1148367, 372588, 494458, - 158914, -195421, -18790, -458488, -1345935, -1715839, 926639, -142808, -308701, -262530, - -1427540, 220117, 1066226, -99858, -163746, 134218, -415001, 201863, 444529, -318364, - 20938, -166967, -162672, -126702, 57982, -222265, -178241, -144955, -116501, -21475, - -239444, 118648, -37581, 27917, -61740, -125091, -75699, 55298, 164819, 224949, - 46171, 6442, -150324, -40802, -80531, 69256, 12885, 52613, 55298, -68183, - 62814, 39728, -61203, 12348, 50466, 23085, 52076, 125091, -56371, -30065, - -13422, -26844, 40802, 44560, 10737, -56908, -37044, -70330, 29528, 6442, - -26307, 20938, 35433, -51003, -11811, 1074, -20938, -8590, -34897, -16106, - 10201, 6979, 3758, 9664, 20938, -16643, - }, - { - -1314260, -4736812, -1553168, -224412, 1086090, -2046552, -1292248, 1116155, 263604, 570694, - -386010, -144955, -111132, 150861, 433255, -61740, 491774, -23622, 322123, 172872, - -98784, 191126, 46171, -491774, -273804, -219043, 667331, -113280, -60666, -294205, - 1074, 75162, -322123, -161061, 130460, 34897, -621160, -351114, -143881, 90731, - 125091, -224412, 100395, 116501, 49392, 35970, -280784, 86973, 228170, -134218, - 188979, -11811, 248571, -79457, -84826, 78920, 23085, -121870, -72478, 17717, - 68719, -95563, -1074, 96637, -16106, -93416, -41876, -13959, -8053, 70867, - 22549, -59056, 49392, -16643, -9664, -8590, -13959, -20938, -15569, -20401, - 537, 59593, -7516, 3221, 12885, -20401, -16643, 17180, -3758, 28454, - 10201, 15032, 15032, -32212, 0, 15032, - }, - { - -197032, 3002182, -231928, -308164, -50466, 176631, -139050, -545998, 225486, -93952, - 239444, 95563, 2053531, -5190468, 1376000, 337692, -502511, 776852, -653372, 831613, - -1082869, 899259, 228170, -889058, -469225, 1096827, -395137, -653372, -203474, 295279, - 121333, 360240, -869731, 126165, -173946, -407485, -462783, -227096, 26307, 311385, - 66035, 74088, -122943, -51540, 124554, 159988, 309775, 148713, -62814, 52076, - 193274, 97711, -37044, -49929, 135828, -38118, -20401, -152471, 58519, -84826, - -82141, 86973, 41339, -23622, 48318, -53687, -7516, -92879, 41876, 40802, - 12885, -13959, 51003, -24159, 27380, 67109, -20401, 3758, -30065, 3758, - -50466, -33286, -49392, -40802, 20938, -23085, 39728, -33286, 8590, 5369, - -34360, 32749, 38118, -33823, 11274, 27917, - }, - { - -396748, -3001109, -291521, -2773475, -198105, -1649804, -2147484, 55298, -121333, -129386, - -148713, 2365990, -651761, -142271, 1245004, -709207, -692564, -219580, -8590, 160524, - 86973, 225486, -179852, 215822, -537, 301185, 552440, 310311, 78920, 135828, - 105227, 64425, -283468, -346282, 3221, -49392, -49392, 20401, 297963, -51003, - -333934, 91805, 51540, -51003, -33823, -164819, -44023, 96100, 54761, 103616, - -133681, -67109, 32749, -26307, -108985, -45097, -5369, 166430, -48855, 21475, - 53687, 12885, 104153, -82678, 16106, -61740, 96100, -37044, 13959, -17717, - 25233, 25233, 23085, -9127, -15569, -33823, 47245, 6979, -55835, -55298, - 21475, -15032, -75162, -5906, -1074, -24159, 34897, 49929, -7516, -23622, - 7516, -16106, -34897, -2684, 26307, 537, - }, - { - -50466, -2775086, 809064, 462783, -134755, 125091, 120796, 445603, 462783, -264677, - -489089, 273267, 187905, 83752, 3994320, -1959579, 767189, -218506, 309775, -544387, - -277025, -213675, 135291, -81068, 6979, -471373, -13959, -1368484, 332860, 244276, - 33286, 339302, -142271, 490163, -139050, -74625, 386547, -291521, 318901, 54761, - -45634, 415001, 304406, -210990, -40802, 133681, -219580, 52613, 194347, 86973, - -37581, 114354, 61740, -11811, -113280, 22012, 47245, 15032, -15032, 93416, - 39192, -35433, 51003, -37044, -1611, 31139, -186831, 66035, 47245, 59056, - -55835, 27917, 97174, 33823, 37044, -58519, -52613, 51540, -7516, 33286, - -50466, -38118, -38118, 44560, 15032, -5906, 30602, 537, -32749, 9664, - -8053, -47245, 20938, 21475, -16643, -31139, - }, - }, - { - { - -2151242, 36612448, 4134443, 2065879, 20938, 386010, 162135, -69256, -122943, -369367, - -463320, -208843, -79457, 838592, 744640, -558346, 76236, 233539, -308701, -616865, - 722091, 234076, -180926, 269509, -189515, 14496, 298500, -68183, -503585, 86973, - 32749, 66572, -17180, -142271, 215285, 241592, 111132, 123480, 52613, 114890, - -40802, -98247, -6442, -223338, 40265, -175557, -33823, -34897, -200253, -270046, - -181462, -132607, -47782, 19327, 55298, -18254, 208843, 94489, 94489, 31139, - -27917, -71941, 78920, 66035, 13959, 18254, 22549, -15569, 56908, 18254, - 63351, 53150, 4295, -7516, 40265, 88047, -44560, -18790, 30065, -60666, - -45634, -25770, -16106, -10201, 24696, 3758, -39192, 4295, -30065, 3221, - -13422, -5369, -2147, 19864, 537, -8053, - }, - { - 501974, 3761855, -302795, -1286880, -344671, 293668, 104690, 36507, -40265, 134218, - 335544, -314069, 75699, 417686, -1530619, 246961, 424128, -329102, 153008, -389231, - 58519, -15032, 339839, -97711, -137439, 246961, -42413, 131533, 99858, -88584, - 375273, -178778, 26307, 2684, 246424, 146566, -19327, -47782, -178778, 64961, - -188442, -258772, -340913, -44023, 175557, -25233, -124017, -103079, -180389, -114354, - -7516, -6979, -91805, -224949, 19864, 90194, 25770, 21475, 49392, 17180, - -79457, -76773, 17180, -42950, -14496, 62814, -40265, -51540, -28454, 39728, - -17180, -15032, 79457, 54224, -6442, -13959, 40265, 28454, -3758, -71941, - -16106, 47782, -12348, -17180, 4832, -22549, -33823, 22549, -30065, -38118, - 30602, 16106, -18254, -17180, -12348, 25233, - }, - { - -1516124, 2767570, 1167694, 1398549, -715649, -311385, 452045, 578747, 298500, 290447, - -40802, -732829, 56908, -90194, -3758, 222265, 503048, 754841, -571768, 1149978, - 650151, -81068, -126165, 44560, -91805, 241055, -197032, 153545, -377420, 6979, - 295816, 538482, -393526, -260919, 222265, 458488, 143881, 360777, 372052, -90194, - -19327, 105764, -117038, -304943, -139050, -23622, -50466, 23622, -15569, 74088, - 37044, 61740, -70867, 12885, 537, 74625, -17717, -75162, -537, -64961, - -2684, 99858, 5369, 2147, 103616, -120259, 17717, -537, -60666, -33286, - 56371, 10201, -41339, -18790, -6979, 49929, 64961, -42413, -35970, 17180, - -9127, -6442, 0, 42950, -1074, -31139, -22549, -10737, 20938, 3221, - 17717, 47782, 6979, -1074, 33286, 0, - }, - { - 3314641, -7538742, -4111358, -441845, 52613, -366146, -172336, -124554, -189515, -31139, - -166430, 97174, -344671, 654983, 603443, -262530, 21475, -308701, -66035, -150861, - 114354, -467078, -449361, -102005, -65498, -243739, 491237, 114354, 141734, -364535, - -193274, 91268, -199716, 100932, -32212, 177167, -125091, -360777, 255551, -162135, - -90194, 87510, -31139, -23622, -86436, -82141, -166430, 51003, 12348, 12885, - 163209, -22012, 32749, -44023, -48855, 82141, -44560, 9127, -121870, -62277, - 20938, -55298, 6979, 40265, -109522, 45097, 24159, -28454, 5369, -52076, - -29528, 59593, 98247, -15032, -5906, -21475, -30065, 32749, 7516, -24159, - -23622, -48855, -1074, 28991, 10737, 18790, -5369, -4295, 49929, -5369, - -32749, -12885, 14496, -4295, -26844, 17180, - }, - { - -236223, -6412923, 240518, 137976, -233539, 178778, -74625, 202937, -367220, 48318, - 121333, 103079, -13422, 558346, 2112050, 1319092, 3040300, -180926, -2518998, 1064615, - 668941, 300648, 186294, -321049, 304943, 1349694, 714038, -127238, 13422, 482110, - 164283, -189515, 69793, -71404, 90194, -347355, 294205, -350040, -394063, 142808, - -52613, -19864, -130997, -20938, 93416, -49929, 16643, 147103, -235686, -102542, - 70330, 38118, 10201, -72478, -12885, -106300, -14496, -10201, 82678, -1611, - -21475, 41876, 99858, 2684, 537, -168041, 21475, -45634, -19864, -15032, - -7516, 46708, 47245, 66035, 113817, 40265, -75699, -30065, -63351, -57982, - -47782, -30065, 96100, 47782, -55298, 5369, -66572, -9664, 15032, -17180, - -7516, -18254, -15032, 30065, 21475, -23085, - }, - { - 3071439, -10159208, -2523293, 268435, 388695, 98247, 9664, -297963, 265214, -92879, - -485868, 225486, 530428, 708133, 249645, 324270, -186831, -69256, -287226, 200253, - -297427, -384936, 318364, -18790, 48318, -265214, 317291, 209917, -19327, -334471, - -292595, 63888, 432718, 281320, -54761, -32212, 22012, 113817, -130997, 87510, - 2147, 126165, 346819, -248034, -223338, 157303, 28991, 258235, 24159, 96637, - 24159, 170725, -137976, -96637, 48855, 5906, 77309, 11274, 10737, -51540, - 46708, -13959, -133144, -22549, -30602, 30602, 15569, -43487, 28454, -16643, - -44023, -53150, 41339, 38655, -43487, 54761, -41339, 5906, 36507, 1611, - -19327, 45634, 98247, 29528, -3758, -42413, -29528, 537, -12348, 41876, - -25770, -17717, -30602, 17180, 39192, -14496, - }, - { - 381715, 268435, -1047435, 289373, 89121, 135828, 126165, -566936, -110595, 110059, - 93952, -127238, -54224, 1817845, -5175973, 835371, 352187, -259309, -1116155, 1196685, - 611496, -162135, 493384, 44023, -267362, -281857, -242666, -1125281, 632971, -1088774, - 13422, 167504, 421981, 126165, -290447, 69793, -146566, -149787, 31139, 224412, - -358630, -33823, 194347, 133681, 24159, -87510, -45634, 32749, -15032, -119185, - 82141, 59593, -17180, -126165, 112743, 8053, -67646, -125091, 224412, -1074, - 30602, 62814, 95026, -5906, 46708, 20938, -15032, -47782, -40802, 41339, - 98784, -17180, -55835, 48855, -6442, -33823, -38655, -22549, -55298, 8053, - 31675, -19864, 3758, 537, 6979, -25770, 2684, 20401, -9664, 23085, - 36507, 42413, -537, -18790, 19327, 18254, - }, - { - -6286222, 13415330, 3370476, -115964, -667331, 74625, -13959, 18790, -139050, -199179, - -258772, -157840, 485868, -388695, -748398, -345745, -499827, 260382, 503048, -119722, - -273804, -134218, 59056, -243203, 206158, 268972, 26844, 220117, -245350, -303332, - -297427, -136902, 75162, -140123, -126702, -121333, -6979, -285615, -179315, 103616, - 162135, 185220, -308164, -66035, -244276, -11811, 245887, -133681, 76236, -70867, - -28991, -263604, 284542, -1074, -23085, 44560, -2147, -13422, -77309, -56908, - 57445, 44023, -39192, -81068, 35433, 44023, 2684, -56371, 45634, 74625, - 7516, -26844, 63888, -73551, -115427, 21475, 10737, -85899, 22012, 9664, - -44023, -11274, 31675, 1074, -1074, 13959, -14496, -33286, 9664, -1074, - 22549, 19864, -6979, 2147, -15569, 3758, - }, - { - 479963, -614180, -1110786, 352724, -327491, 151398, 42950, -377957, 304943, 113817, - -93952, 96637, 383863, 291521, 1725503, 455803, -1828582, 1425392, 850940, -639413, - 9664, 1708323, 1246077, 943819, -294742, 322659, 607738, -1706713, 223875, -67109, - -40802, -20938, -297963, 227096, -151398, -351650, 373125, 305480, -55298, -537, - -216359, 41876, 196495, -52076, -362388, -237834, -73014, -70330, 36507, 125091, - -7516, 95026, 115964, -113817, -128849, -4832, -36507, -50466, -242129, 25770, - 129386, 106837, 103616, 90194, 191126, 19864, 65498, -26307, 2684, -24159, - 31139, 87510, 36507, -51003, -75699, -38655, 8590, -9664, 24159, 10201, - -45097, 24696, 60130, -9127, -24696, 0, -42950, -56908, 15569, 23622, - 537, -11274, 11811, -8053, 5906, -26844, - }, - { - -3145527, -10226317, 3474092, -366146, -495532, -855772, -222801, -163209, 171262, -280784, - -436476, -408022, -166430, 220654, -549756, -264141, 915365, -130460, 267899, -30602, - 365609, -265214, 8590, 121870, 225486, 76236, -309238, 120259, -16643, -61203, - -151398, -190589, -149787, -145492, -60130, 215822, 184147, 2684, 56908, -86973, - -50466, 61740, -42950, 54761, 212601, 16643, -92342, 309238, 6442, -180389, - -93416, -27380, -225486, -125091, 123480, 15569, -7516, 48855, -48318, -3758, - 65498, -96637, -37044, 16106, -31139, 18254, -16643, -25233, -9664, -70330, - -51540, 26844, -28991, -31675, 22549, -11811, 537, -10201, 40802, -28454, - 46171, 18790, -17717, -17180, -5906, -42950, -51003, -8053, -37581, -13422, - -7516, 1074, 35433, 6979, -5369, -29528, - }, - { - -338766, -273267, 457951, 168041, -320512, -362388, -440771, -359704, 130460, 280784, - -118648, -298500, 695248, -667331, -989990, -1145146, 498216, 193274, -448287, -985695, - 515933, -331249, 229781, -223338, 195958, -140660, -438624, 263604, 333934, 488016, - 130997, -232465, -184684, -18254, -271120, -155156, 247497, -143881, 120259, -80531, - 77846, -78383, -51003, -102005, -5369, -158914, -25233, 24159, 119185, 41339, - -165356, -18790, 102005, 139050, 66035, -41339, 105227, -24159, -48318, 1074, - -29528, -44023, 71941, 111669, -66035, -69793, 22549, -57982, -72478, -27380, - 16106, 43487, 39192, -537, -45634, -6979, 16643, 64425, 69256, -32212, - -8053, -42950, -11811, 46708, 45097, 3221, 6442, -6442, 16106, 44560, - -9127, 10737, 7516, -537, 4832, -15032, - }, - { - 737661, -5728413, -1981591, 616328, -224949, -1871532, -81068, 690416, 579284, 325344, - 146566, 468688, 186831, 773631, -55298, 394063, -176631, 404801, -99321, 78920, - 273804, -469762, -125628, -96100, -279710, -104153, 136365, 93416, -84826, -35970, - 276489, 54761, 5906, 118648, -4295, 142271, -32212, 44560, -191126, 8590, - -217433, 85362, -199716, 135291, 59593, -78383, -40802, -74088, 54761, 16643, - -17180, -32749, -17717, -55835, -22549, 53150, 31139, -60130, 13422, 31139, - 1611, -83215, 83215, -49392, -75162, 34360, 23085, 33823, 28991, -37044, - -18254, 56908, -33823, -37581, -57445, -25233, 30065, -20401, 13422, -3221, - -5906, -21475, -26844, 15032, -38118, -23085, 44560, -13422, 28454, -6442, - -40265, -16106, -57445, -7516, 14496, -5906, - }, - { - 127238, 2468533, 1105417, -1041530, -410169, -99321, -290984, 68183, 127775, -457414, - 107911, -238371, -1856500, 1666984, -730144, -1523103, 610422, -10737, -23085, -160524, - 1087701, -335544, -93416, -1801202, -176631, 9127, -201863, -233002, -268972, 175020, - -265214, 412317, -290447, 108985, 130997, -489626, -241055, -413927, 18254, -67109, - 129386, 6979, -3758, -65498, 179315, 81604, 126702, -57982, 216359, 10201, - -90194, -148176, -91805, 92879, 48318, -188442, -27917, -12348, 10737, 111132, - 136902, -48318, -152471, -25770, 10201, -17180, -40802, 39192, 92342, -39192, - -12885, 3758, 17717, 28991, -5906, -77846, -107374, -2147, -3758, -6442, - 44560, 45097, 16106, 36507, 17180, 8053, -13422, -68719, 28454, 16643, - 17717, -16106, -69793, -13422, 28991, -38655, - }, - { - -988379, -1796907, -1228898, -1296006, 99321, -1329829, -1293859, -109522, 49929, -628676, - 724776, 359704, -97174, 770947, -351114, -262530, 250182, 103079, 85899, -71404, - 132607, -56371, 49929, 90731, -228170, 49929, 221728, 374736, -329102, -125091, - 429497, -144418, 92342, 117038, 137439, -223338, 251792, 413391, 275952, -118648, - -510027, 50466, -143881, 128312, 196495, 266825, 228707, 43487, 9127, -21475, - -124554, 188979, -115427, -115427, -33823, 180389, 114890, 39728, -18254, 138513, - 25770, 62814, 77309, 73014, 143881, 104153, 89121, -37581, -12885, 2147, - 12885, -16106, 1611, 7516, 73551, 33286, 10201, -79457, 36507, 60666, - 28454, -7516, 24696, 48318, -23622, 28991, 34360, -52613, -11811, 11274, - -25770, -11274, 17180, -4295, 1074, -5906, - }, - { - -107374, -2041720, 1143535, 67646, 52076, 206158, 178778, 402116, 532576, -519154, - -51003, 69793, 1003412, 374199, -5015985, 14496, 2688113, 615254, -1224603, 144418, - 889595, -136365, -216896, -177704, 170188, -102542, -636729, -763430, 362925, 400506, - -178778, 269509, 455803, -154619, 196495, 213138, -679679, -91805, 466004, -205622, - 112743, 38118, -146029, 136365, 126702, -192737, 227633, 35433, 65498, 26844, - -128312, 6442, -103616, -101469, 40802, -78920, -12348, -63351, -69256, -184147, - -137439, 46171, 37581, -88584, -49392, -67646, 144418, 43487, -45634, -12348, - 45097, -27917, -39728, 2147, -22012, -45634, 50466, -20401, -55298, -61740, - 23622, 48855, 52613, 14496, -38118, 6979, -23085, 10201, 32749, 3221, - -13422, -3758, 537, -16106, -22549, 20938, - }, - }, - { - { - 3149285, 19451370, -8847633, 1924145, 21475, -34360, -397821, -124017, -117038, -434865, - -82678, -74088, 17717, -46708, -643708, -202937, 98247, 357019, 528281, -50466, - 133681, -222265, -61203, 349503, 66035, 52076, 156766, -36507, -303332, 442382, - 282931, 185757, 181462, -64961, 214748, 43487, 134218, 40802, 56908, 251792, - 36507, -34360, -35433, -181462, -89121, -203474, 46708, 62277, -102005, -292595, - -165893, 18254, 73014, 55835, 31675, -110595, 62814, -47782, 40802, -73551, - -6979, -89121, 62814, 54761, 13422, 5369, -35970, 8590, 77309, 20938, - 24159, -47782, -3758, -8590, 5369, 16643, -64961, 32749, -15569, -71404, - -48318, 4295, 31139, 7516, 36507, -41339, -9127, -1611, -31675, 5906, - 2684, -15569, 23085, 24159, -11811, -14496, - }, - { - -49929, 3245385, -890669, -1023813, 266825, 353261, -154619, -231391, 59056, -255551, - 56908, -297427, 162135, 176094, -1206349, 619012, 674847, 219580, 603443, -372588, - 76773, -15569, -148713, -386010, 70330, 510564, 77309, 59593, -278636, -476741, - 290447, -593779, -100932, 250182, 42950, 326954, 64961, -48318, 64425, 242129, - -124554, -262530, -289910, 54761, 62814, -19327, -52613, 252866, -129923, -120259, - 129923, -48318, -113817, -99321, 235149, -9127, 35433, 103079, 23085, -132607, - -140660, -55298, 45097, 11274, -24159, 27380, -78920, -12348, -6442, 30602, - -51540, 50466, 39728, 10737, -22012, 22012, 43487, 12348, -19327, -54224, - 24696, 32749, -44023, -31139, -14496, -25233, -24159, 23085, -40265, 17717, - 41339, -11811, -37581, -24159, -5906, 36507, - }, - { - 1161789, 3470871, -1464047, -1830193, -1532767, -243203, 95563, 181462, 58519, -143881, - -336618, -725313, -28991, -166430, -296353, -212064, -82141, 622770, -254477, 603980, - 633508, -560493, 165893, 591632, -6442, -107374, -212064, 556735, -108985, 57445, - 100395, 77309, -280247, -102542, 397821, 11274, -146566, 139050, 238371, 246961, - 55298, 12885, -137976, -246424, -208843, -15569, -52076, -13959, -22549, 58519, - -121333, 19327, -3758, -69256, -176631, 65498, -85362, -20401, 84289, 2684, - -104153, 12885, -82141, -11274, 6979, -117575, 73551, -9127, -72478, -11811, - 17717, -105227, -32212, 57982, -2684, 59593, 9127, -55298, 27917, 25770, - -24696, -28991, 18254, 39728, -15569, -25770, -24159, 22012, -9664, -10737, - 26307, 45097, -16106, 12885, 14496, -23085, - }, - { - -4136054, -14179835, -763430, -955093, 74625, -166430, 88047, -82678, 91805, 453119, - 144418, -127775, -78383, 462783, 524523, -272194, -166967, -246424, -41876, -247497, - 108448, -124554, -177167, 34897, 98784, -62277, 421981, 139586, -352187, -459562, - 75699, 242666, -267899, 169651, -12885, 409633, 52613, -74625, 359704, -121870, - 150861, 0, -154082, -18790, -26307, -74088, -94489, 13959, 89121, -55298, - 97711, 30602, -108448, 40265, -61203, 57982, -79994, -58519, 3758, -45097, - -46171, -60130, 1074, -10737, -90194, -1074, -66572, 20938, 2147, -29528, - 12885, 90731, 61203, -13422, -6979, -41876, 6979, 22549, -5906, -39192, - -24159, -29528, 40802, 20938, 5369, 6979, -33823, 30602, 32749, -17717, - -22549, 5906, 12885, -9664, -22549, 28454, - }, - { - -101469, -5373004, 813359, -55835, -107911, 114890, -159988, 424128, -204011, 110059, - 70330, 140660, -296353, -463856, 1081795, 1506997, 1576253, -3126199, 940598, 1901060, - 530428, -186831, 76773, -38118, 317828, 651224, -1316408, -597000, 594316, 1259499, - 458488, 309775, 18790, 176094, 120259, -720481, 33823, 20938, -88584, 150324, - -32749, 130460, -17180, -37044, 75699, 49392, -73551, 97711, -119185, -232465, - 30602, 37581, -40802, -5369, 45097, 49392, 40265, 75162, 125091, 6979, - 27380, 85362, 69793, -51540, -54761, -133144, 100932, 67109, -15032, -39728, - 77846, 56908, 41339, 22012, 53687, -18254, -26844, -16643, -83752, -29528, - -12885, 26307, 57445, -29528, -2147, 6442, -36507, 26307, 0, -12348, - -8590, -15032, -2147, 35433, -8590, -20401, - }, - { - -3996467, -17223892, 505196, 1044751, -270583, 68719, -106837, 258772, 111132, -638876, - -470836, 217433, 253403, 119185, -468688, -7516, -115427, 48318, -227633, -171262, - -495532, -82678, 309238, -192200, 5369, -267362, 145492, 395137, -309238, -421981, - -17180, 275415, 170188, -154619, 118112, 161598, -71404, 67646, -39728, 113817, - -504659, -106837, 372588, 69793, 1074, -4832, -147103, 121870, 6979, 68183, - 78920, -23622, -268435, -115427, 1074, -146029, -106837, -1074, 101469, 51540, - 40802, -34360, -99321, 4832, 35433, 5369, -52613, 6979, 30602, -35433, - -63351, -1611, 35433, -4295, 1074, 15569, -41339, 12885, 52076, 14496, - 28454, 61740, 59056, -33823, -18790, -23085, 1074, -27917, 18254, 12348, - -22012, -11811, -8053, 37581, 1611, -22549, - }, - { - 38655, -686658, -555661, 250182, -27917, -13959, 322659, -128312, 135828, 80531, - 537, -51003, 9127, 2050310, -5077725, 336618, -192737, 28991, -1094680, 912144, - 598611, -530428, 139586, 1001801, 603443, -478889, 90731, 19864, 432718, -1301375, - -90731, -15032, 95563, -304943, -44560, 404801, 7516, -64425, -168577, -112743, - -134218, 358630, -22549, 35433, -12348, -78383, 15032, 98784, 1611, -41876, - -42413, -68719, 10737, -33286, 28991, -31675, -57982, -65498, 68719, -18254, - 77846, 40265, 89121, -27380, 15032, 32212, -104690, -24159, 20938, 69793, - 31139, -76236, -33286, -2684, -48318, -6442, -62277, -35433, -40265, 30602, - -3221, -27380, 3221, -9127, -9664, -20938, 25233, 15032, 15569, 40265, - 35433, 15032, -26844, 5906, 8053, 1074, - }, - { - 5768141, 22973244, -2921652, 554588, 12348, 292595, 444529, -173946, 42950, -286689, - -337155, 440234, 200253, -565325, 180389, -134218, -354872, 372588, -22012, -350577, - -6442, -190052, -17180, 25770, 562104, 39728, -169651, -66572, -424665, -192200, - -100395, 31139, -53150, -294742, -74088, -376347, 13422, -109522, -63351, 137976, - 54224, 31139, -161598, 49392, -317291, -20401, 197032, 121870, 32212, -179852, - -27917, -78920, 330712, -88584, -61740, -11274, -48855, -18254, -30065, 23085, - 56908, -33286, -78383, -8590, 82141, 6442, 17180, -38118, -11274, 14496, - -5906, -27917, -19327, -80531, -10737, 74625, -55835, -51540, 70867, -11274, - -3758, 41339, 8053, 537, 25770, 4832, -11274, -17180, -13959, -6979, - 20401, 2684, -12885, -15569, -7516, 26844, - }, - { - 84826, -1757715, 474594, 643171, -118112, 125091, -162135, -564251, 104153, 27380, - 103079, 60666, 228170, 836445, 1620276, 1949378, 987843, 1404991, 670552, -1194001, - -193274, 1381906, -221191, -651761, -98247, 299574, 330712, -353261, 672162, -411243, - 508954, -103079, 141197, 219043, -194884, 17717, 57445, -90194, 87510, -55835, - -306016, 29528, 45097, -122407, -289373, -67646, -18254, 65498, 48855, 183073, - 10737, -14496, -106300, -109522, 30065, 58519, -177704, -123480, -99858, 121870, - 126165, -6442, -41876, 37581, 70330, -6979, 74625, -19327, 36507, -35433, - 60666, 74088, 10201, -103079, -84289, 11811, 3221, -53150, -4832, -1074, - 537, 67646, 23622, -2684, -17717, -10737, -50466, -28454, 33286, 14496, - -19327, 8053, 4295, -6979, -17180, -32749, - }, - { - 2646774, -7114614, 1080184, 972810, -304943, -1134945, 124554, -203474, 71404, -635655, - -311922, -282931, 38655, 496069, 59056, -57982, 8590, -607738, 254477, 171799, - 90731, -191126, 137439, 122943, 53687, -34897, -304943, -12885, -168041, 163209, - 64425, -71404, -64961, -58519, -39728, 165893, -57445, -244813, 126165, -214212, - -66035, -81068, 186294, 177167, -153008, -73551, -108448, 134755, -53150, -155156, - -48318, -31139, -216896, 72478, 233539, 42413, 29528, 47782, -44023, 62277, - 42413, -39192, -37581, 23085, 69256, -31139, -23622, 7516, -39192, 10737, - -23622, 29528, -46708, 13959, -3221, -537, -26844, 49929, -18254, -12348, - 45097, -6442, -56371, 3758, -35970, -54761, -37044, 5906, -41339, 537, - 3221, 24159, 23622, -8590, -8590, -33823, - }, - { - 251256, -823560, -2017561, -702227, -600222, -29528, 502511, 251792, 38655, -184147, - 127775, 81604, 290447, 294742, 493384, -31139, -351650, -938987, -467615, 301185, - 631897, -416612, -157303, -541166, 169651, -439160, -265214, -272730, -205622, 198642, - -44560, -227633, -156229, 41339, -231391, 34360, 406411, -67646, 72478, -234613, - 263067, 20938, -28454, -107374, 20401, -112206, 64961, -43487, -97174, -79457, - -88047, 69256, 99858, 88584, 34897, -30065, 2684, -27917, -10201, 19864, - -80531, 6979, 76236, 34897, -83752, 11811, -61203, -94489, 38655, 17717, - 40802, 21475, -23085, -25233, -15032, 42413, 34897, 52076, -7516, -19864, - 8053, -39728, -20938, 59056, 16106, -4832, 22012, -10737, 32212, 18790, - -20401, 9664, -3758, -6442, -23622, 17717, - }, - { - 135291, -5541582, -1386738, 527207, -295279, 532576, 979789, -82678, 262530, 81068, - 320512, 66035, -14496, 278636, -184684, 316217, -616865, 105764, -358630, -16643, - -35433, -325344, -23622, 26307, -123480, 6979, -226560, 436476, 30065, -24159, - 147103, 95026, 268972, 74088, 51540, 343061, 355945, 274341, -240518, -158377, - -330712, 216359, -359704, 32749, -3758, 104690, 150861, -112743, -95026, 70867, - -149250, -11274, -105227, 75162, -30602, 8053, -16643, 43487, 71404, -36507, - -18254, -17717, 53150, -92342, -13959, 31675, 23622, 57982, 17180, -104690, - 17717, 36507, -50466, -12348, -30065, -4832, 13959, -10737, -3758, -12885, - -12348, -48318, 12348, 9664, -30065, 15032, 14496, -6979, 11274, -38118, - -16106, -13959, -28991, 6979, 537, -10737, - }, - { - -44023, 2213519, 897111, -765041, 231928, -150861, -6979, -54761, 67109, -437013, - -216896, -164819, -39192, 4278325, -846645, -1232119, 1041530, 381178, 693637, -110595, - 1584843, -947040, -1207960, -2219961, -455267, -783295, 75699, -357556, 28991, -286152, - -433255, 357556, 86436, 130460, 258235, -41339, -26307, -99858, -237834, -325881, - 132070, 141197, 100932, 48318, 156766, -5369, -127238, -173409, 99321, -112206, - -141734, -164283, 40802, 80531, -76773, -130460, 71941, -10737, -13959, 158377, - 105764, -135828, -95026, 30065, 42950, -48855, -79457, 59056, -9127, -40265, - -2684, 17717, -36507, 3221, -40802, -31139, -48318, 18790, -4832, -37044, - 53687, 44023, 20401, 40265, -537, 14496, -44560, -16106, 9127, 11274, - 33286, -48855, -56371, 35433, -8053, -33286, - }, - { - 1049583, 871878, -562641, -297427, 139050, 1038845, 1598265, 204011, 36507, 69793, - 46708, -649077, 417686, -81604, -1489817, 357556, 223875, 84289, 36507, -125628, - 388158, -192200, 51003, -234613, -116501, -120259, 85362, 383326, -331786, 193810, - 231928, -243203, 190052, 248571, 148176, -155156, 341987, 389231, 164283, 0, - -135291, -89121, -120259, 152471, 148176, 143345, 100395, -42950, 79457, -64961, - 105227, 58519, -146029, 11811, 54761, 178778, 5906, -102542, 66572, 94489, - 33823, 45097, 63888, 108985, 69256, 53150, 15032, -15032, -16106, 35970, - -54224, -1074, -20401, 1611, 33823, 30065, -16643, -34897, 66572, 32212, - -10737, 10201, 54761, 24159, -11274, 31139, -27380, -50466, 20938, 4295, - -18254, 16106, 18254, -5906, -31139, -8053, - }, - { - -13959, -1668058, 352724, 14496, 193810, 107911, 252329, -557272, -253403, -147640, - 68719, -176094, 641024, 2481417, -1464047, 810675, 1903207, 228707, -904628, 547071, - 498216, -524523, -206695, 322659, 686121, 362925, -453656, -235149, 112743, 144955, - 74088, 293668, 326954, -238908, 180389, 5369, -301185, 496606, 287763, -284005, - -205622, -169651, -127238, 235686, 6442, -239444, 236760, 99321, 46171, 42413, - -47782, -57445, -96100, 37581, 122407, -111132, -8590, -19327, -92342, -175557, - -73014, 52076, -23622, -65498, -21475, -16643, 158377, -98784, -48855, -28991, - 48318, -70330, -61740, -13422, -27917, 39728, 1074, -23622, -19864, -6979, - 71404, 39728, 48855, -41339, -40265, 5369, -29528, 3221, 35970, -11811, - -9127, 13959, -10737, -24696, 2684, 33286, - }, - }, - { - { - -3847754, 16582869, 3030636, 707596, 300648, -287763, -125628, -4295, -320512, -78920, - 379031, -421444, -120259, -203474, -466004, -466004, 439160, 104153, 338229, 470836, - -759672, 395137, -91805, 120259, 172336, -98247, -51003, 42950, 15569, 431107, - 133144, 322659, 278099, 330176, -257161, 99321, 322659, 139050, 144418, 56908, - -49392, 139586, -68183, -177704, -23622, 109522, -157840, -118112, -48318, -126702, - -64961, 82678, 60130, 5906, -136365, -107911, -100395, -119722, -91805, -26844, - 113817, -67109, -90194, -27917, 32212, -35433, 65498, 33823, -14496, -12348, - -26307, -13959, 14496, 2147, -50466, -92879, 9127, 14496, -25233, 51540, - 35433, 64961, 30602, 9127, -10737, -8053, 38118, -4832, 21475, 24696, - -2147, -12885, 20938, -1074, -8590, 6979, - }, - { - -99321, 4264366, -1219234, 1001801, 156229, -187905, -12348, 104690, -1611, -159988, - -303332, 239444, -198642, -922881, 100395, -437013, -16643, 171799, -356482, -113817, - -130460, -49392, -636192, -73551, -88584, 225486, 679679, 296890, -83752, -610422, - 17717, -368293, 294205, 239981, -2684, 277025, 270046, 91805, -99858, -186831, - 148176, 146029, -83215, -46171, 114890, -33823, 131533, 107374, -164819, 63351, - 46171, 21475, 98247, 226023, -62814, -220117, 34897, 18254, -44023, -67109, - 24159, 40265, 14496, -15032, 34360, -50466, 52613, 83752, -4295, -20938, - 3221, 51540, -75162, -33286, 47245, 5906, -61740, -39192, 537, 51540, - 11274, -57445, -14496, -1611, 3221, 34897, 11274, -11274, 20401, 34360, - -31675, -16106, 19864, 37044, 16106, -13422, - }, - { - -983011, 1951526, 91805, -1307818, 1453846, -517544, 205622, -150324, -103079, -228707, - -93952, -527744, -457414, 134755, -209917, 81068, 255014, 243203, -198105, -5369, - 325881, -252329, 233002, 367220, 327491, 155693, 56371, 443992, -218506, 79457, - 114354, -212601, 53687, -51003, -226023, -144418, 400506, -243203, 118112, 161061, - -19327, -152471, -81068, -7516, -38655, 68719, -537, -41339, 175020, -156229, - -59056, 38655, 47782, -71941, 26844, 61740, -85362, -2147, -20938, 28991, - -64961, 74625, -55835, 8053, -69256, 37044, 43487, -71941, 57982, 13959, - -64425, -77309, 67109, 537, 15569, -8053, -91805, 40802, 57445, -11274, - -1611, 5369, 15569, -7516, 12885, 31675, 11811, 1611, -38118, 13422, - -13422, -27380, -9127, 3221, -18790, -5906, - }, - { - 1850057, -23840290, 1169842, -930397, -234076, -25770, 99858, 48318, 193274, 254477, - -34897, -185757, 408022, -314606, 96100, -520228, 192737, -306016, -438624, -112743, - -131533, 263604, 16643, -47782, -28991, -184684, 85362, 251792, 92879, -122943, - 148713, 133144, 50466, -11274, 6442, 360777, 60130, 202400, -2147, 212064, - 48855, -325344, 16643, 49929, 57445, 81604, -5369, 17180, 38655, -76236, - 94489, -8590, -125091, 172872, -33823, 32212, -19327, -48855, -56908, -74625, - -10737, 100932, 17717, -36507, 68719, -76773, 13959, 27380, -10737, 19327, - 59056, -34897, -85899, 33286, -15569, -3221, 21475, -1611, 1074, 24696, - 41876, 18790, 15569, -12885, 2684, -45634, -5369, 15569, -39192, 9127, - 25233, 12348, -2147, 3758, 11274, 2147, - }, - { - 273804, -5436355, -368293, 147103, 176631, -285615, 56908, 510027, 85899, 213138, - 61740, 121333, -104153, 973884, -1280437, 37044, -1068373, -785442, 3089692, 1233729, - -375273, 396748, -292058, -91268, -314606, 155156, -1473174, -432718, 768262, 950262, - 265214, 861678, -202937, 702227, -253403, -186831, 52076, 53150, 99858, 23622, - 19327, 180389, 344671, -114354, 14496, 151934, -96637, 258772, -100395, -51540, - 151398, -123480, 47782, 16643, -44023, 12348, 85899, 143881, 90194, 63351, - 102005, 75162, 22012, 59056, 87510, 14496, 77846, 50466, -32749, 31675, - 17717, -22012, 12885, -19327, -53687, 8053, 79994, 27380, 25233, 22012, - 56371, 14496, -47782, -18254, 33823, -20938, 24696, 537, -22012, 16643, - 9664, 21475, 1611, -13959, -8590, 34360, - }, - { - 1068910, -25136296, 301721, 1481227, -525060, -44560, 309238, 280247, -592706, 278636, - 580357, -95026, -339302, -237297, -241055, -260382, -32749, 286152, 537, -134218, - 13959, 358093, -239981, -367757, 47245, -56908, -70330, 61203, -518080, 13959, - -84289, 100932, -190052, 48318, 144418, -36507, -27917, 69793, -7516, 155156, - -118648, -60130, -100932, 301721, 246424, -255014, -244276, -153545, 8590, 130997, - 56908, -181999, -38118, 97174, -54761, -84289, 24159, 107911, 21475, 30065, - -47245, 0, 79994, 90731, 20401, -73014, -6442, 48318, -17717, -11274, - -13422, 62814, 1611, -23622, 0, -6979, 48318, -1074, -25233, 15569, - 9127, -13422, -78383, -31139, 4832, 40265, 22549, 11274, 15032, -37044, - 18254, -5369, 15032, -12885, -23622, 3221, - }, - { - -264677, 950798, 246424, -454193, -537, -32749, 261993, 158377, 224949, -106300, - -10737, 47782, -92879, -1239098, -2112050, -2356863, 426276, -235686, -866510, 21475, - 331249, 56908, 895501, -551366, 521839, -579284, -90731, 796180, -621160, 36507, - -124017, 162672, -685584, 127775, 482647, 234613, -9127, -2684, -276489, 79457, - 90731, 90194, -69256, -63351, -119722, 139586, 140660, 61740, -22012, -83215, - -172336, -48318, 83752, 54761, -6979, 11274, 75699, 30602, -115964, -26307, - -20938, -31139, 17180, -16106, -49392, -12885, -45097, 104153, 35970, -79457, - -96637, 24696, 73551, -10737, 23622, 33823, 22549, 44560, 16643, 3758, - -4295, -9127, 11811, -22549, -13422, 14496, -9127, -33286, -3221, -34360, - -41339, -40265, -6442, 16106, -21475, 1074, - }, - { - -3492882, 29197188, -24159, 714038, 441845, 300111, 115427, -369904, 42950, -61740, - 238908, -25233, -461709, -191126, 662499, -185220, 106300, -134755, -624918, 31139, - 209917, -126165, 273267, 156766, -30602, -14496, -136365, 184684, -460098, -88047, - 75162, -88584, -91805, 128849, -219043, -82141, -32212, 82141, 137439, 150324, - -33286, -142271, 58519, -220654, -8590, -147103, -8053, -137976, -12885, 139050, - -6979, 54761, -79994, -179315, 37581, 62814, 57445, 55298, -4832, 20401, - -53150, -88047, 35970, 40802, -2147, -6979, -10737, 17717, -41876, -69793, - 12348, 14496, -49929, 94489, 85362, -23085, -12885, 58519, -537, -537, - 33823, 5906, -25770, 5369, 15032, -24696, 26307, 24159, 3221, 5906, - -9127, -4832, 23085, 13422, 10201, 0, - }, - { - -461172, 570157, 2141041, -84289, 162135, -103079, -257698, -265751, 156229, 52613, - -16106, -78920, -343597, 791348, 3123515, -1283122, 2392834, 1218697, -121333, -401579, - 250182, -315143, -1152125, 565862, 337155, 724239, -250719, 727997, 418222, -415538, - 241592, -72478, 343597, -53150, 52613, 67109, -273267, -88047, 130997, -56908, - 216359, -26307, -161061, 120796, 83215, 144955, 12348, -35433, 255014, -48318, - -76773, -158914, -89121, -25770, 77309, 3758, -57445, 2684, 140660, 25233, - -20938, -100395, -105227, -126702, -139586, -46171, -41339, -11811, 46171, -61740, - 7516, 0, -72478, 12885, 45097, 19864, -67646, -23622, -2147, 3221, - 23085, -49392, -59593, 22012, 1611, 14496, 43487, 44023, 13959, -11811, - -6979, 15569, -11274, 19327, -8053, 11274, - }, - { - -2329483, -4128537, 2047626, 1147830, 222265, -290984, -350040, -297427, -219580, 53150, - 187905, 184684, 88584, -321049, 963683, -656056, -733366, 322659, 171262, -165893, - -66035, 154082, 209380, -20938, 137439, -114354, -336081, 70330, 119722, -46708, - 156766, -30602, 140660, 279173, 138513, -123480, -257161, -18790, -10201, -172872, - 277025, 39192, 147640, -49392, -63351, 312459, -38118, -118112, 61203, 197569, - 29528, 9127, 96637, 35970, -26844, 57982, 66572, -41876, 9664, 1074, - -94489, 77309, 30602, -14496, 29528, 8053, -16643, -22012, 4832, 80531, - 3758, -17180, 12348, 28454, 0, 11811, -2147, 15569, -44023, 0, - -42950, -32212, 11811, 24159, 0, 52076, 48855, 24159, 31139, 14496, - 8053, 3758, -37581, -11274, 18790, 18790, - }, - { - -128312, -938987, -991064, -1695438, -75699, 389231, 407485, 232465, -12348, -79457, - 437013, 323733, -343061, 881005, 719944, -252866, -988916, -1030255, 180389, 244813, - -650688, -38118, -22012, -401579, -139050, 190052, -354335, -299574, -335544, -634581, - -85899, -68719, -126702, -107374, 32212, 164283, -133681, -71941, -119185, -237834, - 161061, 26307, 47245, 27380, -134755, 47782, 23622, -68719, 537, 39728, - 153008, 77846, -98247, -121333, -76236, -7516, -39728, 20401, 50466, -14496, - 119185, 36507, -103079, -53150, 77846, 49929, -20401, 60666, 83752, 2684, - 6979, -32749, -32749, 9127, 34897, -9664, -27380, -76236, -38118, 18790, - -26844, 31139, 28454, -33823, -54761, 0, -9664, -16643, -4832, -43487, - 537, -7516, -6442, -537, 5369, 14496, - }, - { - -1060320, -3312494, -2283312, 33823, 388158, 1463510, -267899, -459562, 210453, 95026, - -100932, -580894, -111132, -298500, 351114, -202937, -119185, -263604, -18254, -156766, - -200790, 136902, 151934, -193274, 135828, 19327, -65498, 265214, -51003, 19864, - -38655, 79457, -92879, -98247, 184684, 148176, -111669, -216359, -79457, -61740, - -196495, 10201, -39192, 125091, -125091, 77846, 42950, 19864, 25233, 62277, - -99858, 127238, 30602, 90194, -53687, -49392, -32749, 66572, -62277, -64961, - 39192, 8590, -16643, 40802, 26844, -83752, -11811, -15032, -38655, 10737, - 33823, -30602, 4295, 9127, 29528, 24159, -29528, -28454, -26307, -20401, - -13422, 30065, 40802, -17180, 28454, -3221, -35433, 18790, -17717, -1611, - 36507, 21475, 38655, -8590, -19864, 4832, - }, - { - -20401, 1828582, -101469, 759672, 246961, -70330, 323196, -347355, 17180, -150324, - -187905, 294742, 790811, 2081985, 1822140, -1732482, 1360968, 377420, 572841, 623307, - -845035, 605054, -795106, -1467268, -756988, -199716, -55835, -906238, 595390, 58519, - -261993, -100932, 175557, -37581, -15569, 126165, -44023, -21475, -162135, 32749, - -31675, -31675, 155693, 139586, 118112, 40265, -45634, 83215, -135828, -68183, - 53687, 96100, 113280, -22549, -51003, 108448, -4832, -125628, 18254, -32749, - -82141, -24159, 106300, 54761, -30065, -54224, -16643, -75162, -60130, 23085, - 22549, 1074, -33823, -31675, 18790, 79457, 60666, -4832, -20401, -15032, - -36507, -47245, -32212, -25233, -14496, -2684, 1611, 32212, -38655, -537, - -5906, 537, 59056, 17180, -35970, 39192, - }, - { - -399969, 2516314, -387621, -1212791, -130460, 1803349, 603443, -36507, 58519, 754841, - -297427, -18254, 186831, -836445, -253403, 145492, -656593, 89121, -38655, 19864, - 183610, 149250, 82678, -223875, 480499, -119185, -42950, 421981, 281320, 80531, - 62814, -91805, -171799, -37044, 61740, -12348, 71404, 41339, -37044, 98784, - 301185, -171799, 162672, -64961, -148713, -204548, -50466, -90731, 79457, 135828, - 53687, -170188, 30602, 73551, -19864, -111132, -110595, 32212, 85362, -41339, - 69793, 19327, 28991, -40265, -56371, -82141, -61203, 52613, 14496, -16643, - -53150, 44023, -1611, -3221, -63888, -32212, 18790, 39728, -34360, -60130, - -32212, 6442, -29528, -34897, 4295, -28454, -32749, 60666, 22549, -18790, - 15569, 1611, -30065, -13959, -10201, 4295, - }, - { - 97174, -1235877, -1105954, 477815, -67109, 143881, 62277, -557809, -286152, -444529, - 155156, -106837, -434329, 3006477, 576063, 3223910, -485868, 501974, -85899, -592706, - -544387, 398358, -445066, 421444, 726923, 1057636, -1071058, 222801, -568009, 213138, - 465467, 183073, 166430, 397284, -560493, 59056, 761820, 260382, -226560, 19864, - -13959, 166967, 161598, -72478, -86436, 34897, -173946, 114890, 165356, 57982, - 62814, -5369, 163209, 66035, 28991, -84289, 28454, 64425, 14496, 98247, - 115964, -537, -63351, 59593, -4295, 13422, -104690, -93952, 52076, 22012, - -38655, -22549, 73551, -19327, 45634, 1074, -63351, 18254, 77846, 47782, - 5369, -26307, -47782, -12348, 15032, -5369, 13422, -3758, -32749, -11811, - 1074, -16643, -9127, 17717, 0, -9127, - }, - }, - { - { - 2058363, 12707198, -8399345, 1435593, -59056, -122943, 346819, 184147, -275952, 31675, - 220654, -269509, -36507, 387084, 607201, -529355, 388695, -112743, -209917, -45634, - -953483, 370978, -267899, -537, 85362, -122407, -34360, 300111, 252866, 420370, - 179852, 237297, 28454, 277025, -376347, 147640, 95563, -43487, 112206, -11274, - -120259, -19327, -48318, -82678, 537, 95563, -42413, -33823, -26307, 12348, - -122407, -74625, 3758, -20938, -105227, 9664, -21475, -31675, -41876, 62814, - 65498, -24159, -65498, -15569, 62814, -6442, 97711, -23622, -56371, 3758, - -8053, 24696, 19327, -18254, -40802, -35433, 22549, -18790, 12348, 51003, - 38118, 28991, -18790, -2684, -22012, 28454, 16643, 10201, 23622, 14496, - -11274, 5906, -4832, -14496, 0, 14496, - }, - { - 21475, 4876399, -468688, 1198296, 72478, -122407, 164283, 245887, 52613, 147103, - -148176, 242129, -289373, 149787, 1124745, -532576, -20401, -267362, -930934, -122943, - -344134, 0, -463320, 219580, 198642, -51003, 373125, 148713, 235149, -330712, - 161598, -82141, 136365, 52613, 199179, -50466, -117038, 2684, -21475, -347355, - 51003, 309775, 52613, -141734, 157303, -8053, 35433, -40265, -49929, 46708, - -53687, 97711, 136365, 154619, -207769, -66035, 39192, -100395, -53150, 26844, - 39728, 14496, -33823, -32749, 78383, -45097, 74625, 11274, -35970, 12348, - 26307, -25770, -48318, -7516, 48318, -44023, -70330, -8053, 35433, 38655, - -20938, -33823, 35433, 16106, 13959, 33823, 537, -10201, 32749, -8590, - -36507, 2147, 26307, 23622, 537, -22012, - }, - { - 1131187, 3338800, -233002, -820339, 1054951, -456340, 285078, -178241, -17717, 138513, - 378494, -295816, -190052, 680752, 621160, 935766, 374199, 45097, -2147, 112206, - 105764, 230854, -185757, -54761, 112743, 260919, -54224, 190052, -48855, -83752, - -43487, -104153, 233539, 6442, -479426, 77846, 407485, -200790, 24159, -81068, - -41339, -18254, 69256, -8590, 79994, 71404, 75162, -29528, 113817, -197569, - 158914, 97174, -11811, 24696, 111669, 5369, -46708, -82141, -48855, 41339, - -32212, 98784, 537, -8053, -37044, 11274, -25770, -52613, 97711, -13959, - -49392, -2684, 75162, -55298, 4832, -5369, -40802, 66035, 4832, -24696, - 34360, 38118, -5369, -27380, 12885, 45097, 12885, -22549, -20938, 12348, - -30065, -32212, 18254, -11811, -7516, 13422, - }, - { - 2403034, -24460376, -220117, -581968, 489626, -106837, -16643, 61203, -8590, 86436, - -120796, -47782, 576063, -366146, -99321, -89657, 318901, -405874, -140660, 2684, - -257698, 274878, 128849, -38655, 110595, -168577, 66572, -96100, 212601, 46708, - 47245, -48318, 39728, -81068, -111669, 75699, -149787, -15032, -32212, 268435, - 0, -262530, 178778, 214748, 107911, 216359, 25770, 53150, -9664, -68183, - 27917, -83752, 2684, 108985, -53150, -39192, -33286, 8590, -126165, -51003, - 55835, 89657, -10737, -16643, 59593, -33823, 60666, -22549, 33823, 16106, - 11274, -81604, -58519, 56371, 5369, 29528, 10201, 5369, 6442, 35433, - 33823, 9664, -33286, -25233, 6442, -36507, 11811, -18790, -34360, 23622, - 24159, -3221, -1074, 9664, 2684, -19327, - }, - { - -178778, -4602595, 799401, 271120, 50466, -136365, 195958, 424665, 184684, 39728, - -68183, 86973, -216896, 768799, -1088237, -1061931, -1227287, 1309965, 38118, 410169, - -746251, 336081, -253403, -140660, -137439, 721018, -143881, -367757, -22549, -18254, - -24696, 396211, -256624, 488553, -178778, 309238, 308164, 17180, 19327, -106837, - -54761, 104690, 91805, -246424, 9127, 90731, 25233, 269509, -213675, 77309, - 135291, -52613, 170188, -40265, -26844, -28454, 77846, 93952, 4295, -537, - 11811, -32212, -51540, 79994, 116501, -27380, -5906, -32749, -537, 60130, - -68719, -59593, -537, 6442, -37044, 40265, 51003, 34897, 61740, 4295, - 32212, -28991, -52076, 11811, 8590, -3221, 26307, -13959, -8053, 13959, - 12885, 28454, -11811, -24159, 12885, 24696, - }, - { - 4021163, -21920976, 504122, 1734093, -296890, -24159, 115427, -287763, -249645, 695248, - 344671, -319438, -333397, 74088, 3758, -408559, -21475, 403190, 15569, 97174, - 121870, 120796, -332860, -338229, 47782, 9127, -11274, -276489, -391379, 219043, - -16643, -25233, -255014, 38655, 19327, 20401, 24696, 28991, -18790, 130460, - 135828, -25770, -113817, 83215, -2684, -193274, -61740, -96100, 4832, 121333, - 1074, 38655, 119185, 71404, -28454, 92342, 95563, -8053, -66035, -52076, - -70330, 40265, 76773, 69256, -16106, -44560, 45634, 26307, -5906, -8053, - -537, 31139, -3758, 10737, -5906, 34897, 34360, -23085, -38655, 18254, - -21475, -41876, -62277, 28991, 18254, 31139, 2147, 27380, -26844, -18254, - 30065, 4295, 6442, -32212, 1074, 17180, - }, - { - -114890, 1787243, 40802, -383326, -29528, -51003, 180389, 102542, 108985, -132607, - -49392, 10737, -134755, -915365, -446677, -2218888, 1082869, 13959, -987843, -194884, - 351650, -98247, 660351, -1534914, -273267, -454730, -41876, 546535, -65498, 1061394, - 421444, 191126, -727997, 552977, 361851, -186831, -229244, 56908, -234076, 291521, - -35970, -235686, -17180, -38655, -6442, 118112, 70867, 12348, -11274, -79994, - -112206, -6442, 36507, -9127, 28991, 35970, 120259, 22549, -3758, 51003, - -25233, -58519, 14496, -17180, -68719, -1611, 44023, 55298, -42413, -121870, - -48318, 73551, 15569, -11811, 34360, 1611, 56908, 52613, 0, -15032, - 22549, -8590, 6979, -16106, 3758, 10201, -29528, -36507, -30065, -41876, - -31139, -12885, 17717, -4295, -19327, 5906, - }, - { - 291521, 32250372, -310311, 539018, 311922, 177704, -84289, 155693, -61203, 9127, - 394063, -467078, -121870, 250719, 230318, -351114, 48855, -112743, -190589, 84289, - 38118, 1611, 140123, -278099, -529892, 31675, -237297, 140123, -245887, 195421, - 51003, -13959, 129386, 160524, -101469, 187905, -45634, 105764, -54224, -79994, - -48318, 1611, 41876, -234613, 212064, -323196, -69793, -230854, 35433, 187905, - 11274, -49929, -107911, -60666, 30602, 45097, 50466, 41876, 8053, -15032, - -71941, -3221, 54761, -46708, -67646, 0, -11274, 27917, -2147, -23085, - 20401, 10737, 1074, 114890, 8053, -51540, 58519, 16106, -44023, 18790, - 17180, -19327, -12885, 5906, 1611, -5369, 20401, 0, 14496, 5369, - -18254, -9127, 18790, 18254, -4832, -15032, - }, - { - -134755, 1882269, 358630, -688805, 97711, -88584, -88584, 49929, 183610, -38655, - -94489, -98784, -501437, 168577, 2534568, -5063230, -1031329, 1085553, 106300, -144955, - -46708, -639950, -729071, 1572495, 287763, 1049046, 204011, 310311, 354872, -264677, - -217433, 63888, 297427, 47245, -84289, -183610, -228707, -22012, 537, 75162, - 291521, -109522, -156229, 38655, 141197, 165356, 37044, -133144, 141197, -181462, - -98247, -134218, 28991, -40802, -3758, 2147, 121333, 125091, 95563, -66572, - -60130, -4295, 9664, -119185, -45097, -9664, -71404, 7516, 7516, -67109, - -44560, -25770, -9127, 95563, 52613, -4295, -33286, 26844, -3758, 4295, - -6979, -78920, -28991, 28991, 4832, 24696, 57982, 7516, -22549, -10737, - 8053, 4832, 2684, 23622, 9664, 18254, - }, - { - 1972464, -1752347, -1442572, 936840, 646929, 616865, -10201, -190589, -86973, 354872, - -63351, 145492, -537, -716723, 820339, -511101, -409633, 288300, 101469, -141197, - 181462, 139586, 132070, -125628, 137439, 41876, -333397, 42413, 312459, -106300, - 81068, -191126, 49392, 192200, -84289, -247497, -134755, 151934, -122407, -46171, - 317291, 34897, -65498, -52613, 169651, 297963, -167504, -198642, 93952, 243203, - -4832, 0, 170188, -82141, -158914, 38118, 16643, -104153, 1074, -14496, - -37581, -1611, 15569, -16643, -40265, 47782, -4295, -31675, 30065, 39728, - 25770, 1611, 37581, -10201, 22549, 8590, 14496, -47245, 11274, -19327, - -47245, 537, 42950, 0, 33823, 55298, 28991, 13959, 35970, 6442, - 537, -18254, -22012, 5906, 19327, 24159, - }, - { - 169114, -317828, 639950, -1131187, 119185, 22012, -249645, 297963, 285078, 278099, - 84289, 114890, 22549, 148713, 591632, -149787, -259309, 112206, 606664, -580894, - -469762, 449898, -2147, -336618, 126702, 453656, -741956, -192200, -167504, -434865, - 143345, 143345, -13422, -56908, 74088, -4295, -204548, -12885, -8590, -29528, - -72478, -113280, -5906, 9664, -132070, 61740, 20401, -5369, 90731, 102542, - 96100, -20401, -61740, -40265, -31675, -67109, -5369, 56371, 21475, -49929, - 155156, -39728, -125628, -25770, 103079, -3758, 40265, 74625, -6979, -31675, - -35970, -20938, 22549, 33286, 11811, -53150, -34360, -64425, 18790, 22012, - -10201, 46171, 20938, -62814, -34360, 10201, -18254, -5906, -15032, -26844, - 10737, -12885, -1611, 3221, 26844, -15569, - }, - { - 1219234, 781684, -841814, 543313, 509491, 505196, -586800, -165356, 250719, 162672, - -244813, -325344, 75699, 178778, 427886, 91805, 519691, -357556, 98784, -172336, - 121333, 268435, 151934, -201327, 249108, -34360, 92879, -77846, -141734, -2684, - -26307, -76773, -227096, 84826, 77309, -59593, -272194, -68183, 103079, -25233, - -9127, -1611, 99858, 140123, -137439, -136365, 3758, 79457, 6979, 65498, - 66572, 76236, 93416, -51003, -31675, 27917, 5906, 4832, -106300, -3758, - 71404, -12348, -3221, 76236, -1074, -59593, -6442, -19864, -22549, 67646, - -10201, -26844, 27380, 6442, 25770, 12348, -14496, -28454, -9664, 7516, - 19327, 47782, -3221, -12885, 22549, -26307, -9664, 12348, -12885, 18254, - 23622, 20401, 16106, -16643, -6979, 11811, - }, - { - 70330, 1740536, -199716, 1052804, 206158, 47245, 279710, -260919, 231391, 86436, - 97174, 388695, -305480, -610959, 1143535, -2042257, 1025960, -205622, 186294, 495532, - -1648194, 2137820, 645856, -416075, -116501, 98247, 117575, -596464, 314606, 740345, - -5369, -89657, -8590, 42950, 30602, 98784, -10201, -113280, 25770, 83752, - -63351, -129386, -24696, -41876, 9664, -82141, 41876, 172872, -141734, -93952, - 100932, 151398, 22012, -52076, 54224, 82678, -75162, -64425, 18790, -70867, - -31675, 45634, 32749, -32212, -37581, 15032, 4295, -75162, 23085, 5369, - 9664, -20938, 4295, 6442, 49929, 53687, 46708, -25233, -18254, 18790, - -47782, -54224, -32212, -28454, -4832, -8053, 33823, 8590, -20401, -6979, - -15569, 34897, 55298, -19864, -5369, 38655, - }, - { - 17717, 1621350, -456340, -71404, -289373, 5369, -1173600, 69256, -186831, 141197, - -537, 411243, -411243, 479963, 1781338, -119722, -333397, 187905, -317828, -68183, - 53150, 227633, 58519, 121870, 558346, 35433, 15569, 235149, 222801, -186294, - -53687, 2684, -34360, -96100, 63351, 46171, -112206, -207769, -90731, 61740, - 201327, -35970, 43487, -229781, -153008, -180926, -51540, -45097, 17717, 214748, - -76773, -91268, 81068, -16106, -72478, -101469, -46708, 114354, -16643, -26844, - -9127, -30602, 23622, -73014, -26844, -78920, -15032, 33823, 15569, -69793, - -3221, 11274, 2147, -9127, -49929, -27917, 47245, 9664, -55298, -27380, - 2684, -6442, -55298, -17180, -537, -25770, 23622, 57982, -9127, -6979, - 16106, -19327, -23622, -6442, 20401, 6979, - }, - { - 82141, -1180579, -454193, 509491, -322123, -15569, -66572, -53150, 167504, -321049, - 441845, 279710, -212601, -656593, -5369783, 612033, -1692217, -19864, 47245, -6979, - -434329, 1010928, 369367, -214748, -232465, 815507, -654983, 1065689, -376883, 114890, - 277025, -76236, -158377, 328028, -502511, 330176, 566399, -138513, 13959, 195421, - 39728, 84289, -39728, -300648, 31139, 85899, -215285, 44560, 63351, 16643, - 86436, 35433, 106300, -79457, 10201, -17717, -4832, 5906, 45097, 123480, - 42950, -7516, 11811, 88047, -5906, -10737, -82678, 23622, 42950, 11811, - -69256, 29528, 60130, -40265, 55298, -64961, -2147, 17180, 40802, 2147, - -32212, -23622, -46171, 39192, 11811, 2147, 11811, -11811, -39192, 2684, - 3221, -18254, 4295, 26307, -12885, -20938, - }, - }, - { - { - -691490, 4330938, -881542, -101469, 459562, 315680, 215285, -50466, -27917, -464393, - -351650, 463320, 143345, 136902, 658204, -70330, 64961, 167504, -329102, -823023, - -159988, 140123, 105764, -304943, -3758, 60130, 264677, 185220, 47782, 427886, - 111132, 119722, -150324, -19864, 124017, 49929, 15032, -425739, -41339, 94489, - -119185, 26844, -7516, 3221, -124554, -136365, 46708, 124554, -64425, -113280, - -198642, -91805, 23085, 74088, -7516, 76236, 104153, 133681, 60666, -29528, - -28991, 17180, 46708, 46171, 47782, 28991, -1074, -65498, 4295, 70867, - 37581, -4295, -20938, -26307, 39728, 66035, -46171, -15569, 5369, -52613, - -33823, -52076, 2147, -14496, 7516, 12348, -33823, 10737, -22549, -17717, - -4295, 9127, -1611, 537, 3758, -1074, - }, - { - -48855, 3148748, 612033, -300648, -6979, 291521, 216359, -104690, -38655, 201327, - 70330, 153545, 46708, -353261, 1217086, 1574106, 180389, -103079, 170725, -753230, - -45097, -33286, -403190, 655519, 738734, -663036, -55835, -161061, 177167, 108985, - -198105, -30065, -160524, 148713, 129923, -279173, -209380, -34897, -63351, 5906, - -177704, 68719, -90194, -5906, 56371, -49392, -104153, 15569, 64961, -155156, - 57982, 48855, -88584, -120796, 83215, 215822, -42950, -55835, 26844, 18254, - -154082, -57982, -40802, -12348, 10737, 29528, -26844, -91805, 4832, 11274, - 4295, -40802, 81068, 6442, -18254, -30602, 47782, 44023, 9664, -68719, - -11274, 65498, 10201, -8590, -11274, -26307, -16106, 10201, -25770, -30065, - 37044, 5369, -27380, -45634, -15032, 20938, - }, - { - -1021665, 2455111, 3988951, -685584, -1372779, 19327, -28454, -157303, 361851, 292595, - -129923, -187905, 323733, 467615, 710280, 603980, 146029, -32749, 532576, -112743, - 412317, 365072, -251256, 49929, -537, -290447, -272730, 113280, 150861, 20401, - 74088, 194347, -11274, -204011, 73551, 217433, -63351, 163209, 100932, 14496, - 164819, -88047, 89657, -230318, -112206, -56371, 52076, -13422, -9664, 62277, - 127775, -88584, -89657, 104153, -40265, -42413, -2684, -97711, 83215, -12348, - -49392, -15569, -36507, 17180, 38655, -111669, -47245, 13422, -11274, -54224, - 54224, -14496, -42413, -6442, 19864, 57445, 51540, -21475, -49392, 18254, - 25233, -6979, -4832, 25233, -12885, -17180, -20401, 2147, 16643, -23085, - 5369, 34897, 15569, -5369, 24696, -1074, - }, - { - -6279779, -13621489, 1176284, -355409, -544924, -40265, -122407, -77846, -144418, 55835, - 308164, 206158, 223338, 203474, 187368, 149250, -34360, -184147, 181462, -97174, - 17180, -165893, -15569, 98784, 135291, 133681, -133144, 28454, 537, -303869, - 6979, -137976, -101469, 122943, -102005, -245350, -18790, -101469, 236223, 9664, - -57982, 70867, 81604, 106837, 174483, 36507, -117575, 40265, 2684, -20401, - -84289, 53687, 22549, -67109, 28991, -149787, -44560, -13959, -56371, 38118, - 537, -78383, 1074, -28454, -64425, 15569, -31139, -11274, 55298, -46171, - -51003, 65498, 93416, -6442, 27917, 2147, -10737, 23622, -17180, -17717, - -37044, -34897, -9127, 14496, -1611, 19864, -16643, -3221, 31139, -4832, - -26844, -4295, 12885, -9127, -17717, -5906, - }, - { - 184684, -2092186, -617938, 24159, -165893, 174483, 63351, 136365, 155693, -381178, - 144418, 78383, -26307, -1726577, 1505386, 414464, 858993, -138513, -2199560, 625455, - 84289, 99321, -273267, 85899, 190052, 1050656, 192737, -103616, 250182, -1061394, - 286152, -156766, 122407, -141734, -66035, 561567, -55298, -102542, 40265, -268435, - 44560, 20938, -281320, -245350, 62277, -115427, 141197, 71404, -146566, -53687, - -63351, 139050, 76236, -29528, 40265, 104153, -68719, -7516, 66572, -42413, - -86973, -38655, 7516, -24696, -66572, -100395, -68719, -31675, 73551, -16643, - -14496, 51540, -4832, 57982, 49929, -5906, -42413, -11274, -35433, -55298, - -43487, -4295, 52076, -3758, -18790, 4295, -15032, 5906, 9664, -8053, - -2147, -17717, -4832, 23622, 8590, -38118, - }, - { - -8008504, -6386080, 2169495, 640487, 1018981, 96637, -272730, -455803, 420907, -90194, - -565325, 1074, 81068, 156229, -314069, -102005, 202400, -89657, -14496, 141734, - -237834, -289373, 89121, -144955, -30602, -64425, 128849, -239444, -22549, -134218, - -32749, 159988, 26844, 3221, -81068, -41876, 194884, -28454, 128312, -48318, - 9127, -159988, 94489, 123480, -308164, 82141, 73014, 1074, 43487, -28454, - 104690, 132607, 12885, -197032, 6442, 77309, -91805, -102005, -7516, 13422, - -9664, -27917, -81604, -13422, 25233, 15569, 9127, -38655, 65498, -23085, - -32212, -50466, 26844, 44560, 1074, 38655, -45097, -6979, 28991, 23622, - -6442, 23622, 78383, 55835, -27380, -35970, -11274, -24159, -25233, 37044, - -9127, -537, -13422, 9127, 28991, -3221, - }, - { - 270583, -96100, -555661, 370978, -81068, 73551, -31675, -66035, -26844, 168577, - -112206, -40265, 3221, -646393, 451508, 583042, 282394, -143881, -443455, 179852, - 341987, 511638, -958851, -1117765, -31139, -176631, -70867, 342524, 438624, 671089, - 264677, -82141, 228170, 213675, -311385, -54761, -155693, 13959, -31139, -40265, - -195958, -56908, 45634, 108448, 69256, -130460, -76773, 65498, -30065, 57982, - -35970, 14496, -85899, -81068, 32212, 12885, -34897, 2147, 126165, 62814, - 69793, 56371, 16106, 1074, -11811, 47245, -5906, -100395, -68183, 42950, - 78383, -66572, -60666, -25233, -33823, -52613, -9664, -47782, -38118, 1611, - 19864, -13422, -4295, 10201, -1611, -19327, -2684, 19864, -12885, 32749, - 44560, 36507, 4295, -15569, 15569, -2684, - }, - { - 3827353, 28887414, 1076426, 47245, 30602, -14496, 247497, 366683, -12348, -144955, - -159451, 29528, 411780, -137976, -284005, -24696, -86436, 215285, 450972, -453119, - -126165, 88584, -143881, -486942, -30065, -52613, -210453, -12885, -86973, -79457, - -14496, 274341, 186294, -213675, -30602, -175020, -187368, 144955, -281320, -69793, - 73551, 39728, -16643, -6442, 66572, -191663, -23085, 16643, 17717, -93416, - -53687, -57982, 184684, 115964, -66035, -100395, -30065, -22012, -25770, 53150, - 537, -537, -15569, -113817, -16106, 38118, 13959, -12348, 24696, 55835, - -24696, 4832, 10737, -48318, -84826, 51003, 8053, -85899, 9127, 8053, - -28454, 28454, 16643, 1611, 5906, 23085, -19327, -45097, 7516, -10737, - 2147, 6442, -26307, -15032, -19327, 8590, - }, - { - 450435, 304406, -2209224, -41876, -136902, 86973, 20938, 10737, -172336, -9664, - 130460, 181999, 122407, -230318, 1114007, -4001299, -974958, 1012539, 278099, -322123, - -1046361, 609349, 102542, 578210, -360777, 1326608, 552440, -494458, 414464, -223875, - -54761, 262530, -28991, 359167, -353798, -428960, 155693, -24696, 32749, 162672, - -107374, -188979, -56371, -212064, -115964, -51003, 31675, -2147, -74088, -36507, - -48855, -7516, 50466, -130460, -128849, 89657, 75162, -68719, -32749, -38118, - 97174, 98247, 114354, 45097, 100395, 79994, 31139, 26844, -83215, -9127, - 11811, 47782, 54761, 19327, -67109, -23622, 16643, 2147, 17717, -537, - -25770, 25233, 56371, -1074, 4295, -11274, -45097, -60130, -4295, 16106, - -5906, 2147, 20401, -7516, -537, -24159, - }, - { - -1082869, 1147293, 335007, 969589, -244813, 74088, 371515, 236223, -146029, -162672, - -437550, -307627, -228170, 293132, -14496, -38655, 128849, -469762, -146029, 306553, - 312996, 11811, 32212, -118112, -171262, 128849, 28991, -79457, 60666, -31675, - -163209, -91268, -41876, -411243, -301721, 99858, 108448, 13422, 20401, 33823, - -51540, -89657, -54224, 224949, 76773, -238908, -126165, -2684, 18254, -108985, - -114890, -49929, -110059, -107374, 137439, -26844, -74625, 31139, -20938, 22549, - 83215, -91805, -31139, -31139, 11274, 8053, -21475, 11811, 2147, -47782, - 12885, 28991, 3758, -38118, 4832, -537, -4295, -16643, 33286, -16643, - 35433, 23622, -12885, -28454, -7516, -49392, -48855, -10737, -26307, -16643, - -5906, -1074, 39192, 9664, -16106, -26844, - }, - { - -246961, 1522566, 358630, -1046361, -233539, -176631, -264141, 335544, 5906, 185757, - -451508, 95563, 619549, -222801, 557272, -129386, 353798, 733903, -430034, -253403, - 834834, 340913, -219043, -500901, 171262, -163746, -486405, -10201, -142808, 184147, - 234076, 145492, -67646, 82678, -151934, -85899, 213675, 91805, 140123, 75162, - -70330, -71404, -145492, -59056, -23085, -74088, 47245, 30602, -32212, 16643, - -92342, -56371, 110595, 161598, 61203, -24696, 12885, -31139, -67109, 18790, - -32212, -77309, 46708, 39728, -46708, -50466, 22012, -80531, -62277, -8590, - -22549, 47782, 48318, -6442, -33823, -8053, 27380, 78383, 41876, -26307, - 25770, -13422, -30065, 28454, 44560, 0, 12348, 9664, 12885, 37044, - -4832, -4295, -3221, 537, 4295, -14496, - }, - { - 1074, 3320547, -581431, 1511829, -731755, -449361, 664109, 173946, 330712, -146566, - 198642, 474057, 50466, 476741, 363462, 440234, 285615, -204011, 21475, -248034, - 294742, -98247, -92342, 98247, 537, -44023, 111669, -292058, -27917, 126165, - -18790, 2147, 135828, 354335, -249645, 132070, 246424, 230854, 105764, -31675, - -39728, -12348, 119185, -162672, -70330, -78920, 32212, 26307, -17717, -11811, - -14496, -23622, -42413, -34360, 61740, -29528, 26307, 4295, 42413, 49929, - -64961, 44023, 42413, -49392, -19864, 43487, 37581, 39728, 37581, -32749, - -35970, 22012, -12348, -20401, -26844, -3221, 20938, -7516, 18790, 18790, - 13422, -10201, -48855, 4832, -30065, -5369, 34360, -16643, 11811, -3758, - -32212, -18254, -46708, 1611, 11811, -6979, - }, - { - -93952, 1206349, 1089311, 205085, 93416, -50466, 118112, 141197, 102542, -66035, - 178778, 146566, -925029, 782758, -2240362, -1308891, 709743, 164283, -28454, -390842, - 757525, 963683, -530965, 9127, 254477, -218506, -402116, 359704, -366146, 129923, - 345208, 390305, 56371, 211527, 17180, 321586, -49392, -166967, -141734, -111669, - -50466, -116501, -29528, -117575, 18254, -58519, -114354, -97174, 64425, -78920, - -84289, -109522, -44560, 42413, -21475, -61740, -49929, 121870, -25233, 71941, - 185757, -33823, -169651, -88047, -10201, 51003, -10201, 40802, 28454, -26844, - -13959, -6979, 17717, 23085, -7516, -78920, -46171, -1611, 11811, 4295, - 24696, 52613, 17180, 27380, 17717, 5369, -2684, -35970, 20401, 6979, - 17717, -1074, -63351, -4295, 21475, -37581, - }, - { - -158914, 1936493, -272730, 617938, 289910, -1248225, 163209, -41876, -503585, -188442, - 325344, -245350, -344671, 253940, 2203318, -201863, 568546, 362925, -381715, -15032, - 32749, -10201, -60666, 136902, 177704, 159451, -171799, -198105, -34360, -226023, - 15569, 123480, 253940, 276489, 100395, 56908, 27380, -11274, 211527, -288300, - -47782, -135291, -132070, -31139, 152471, 150324, 163209, 4295, 16106, -48318, - -43487, 124017, -103616, -68719, 52613, 130460, 90731, 17717, -43487, 23622, - -24696, 39728, 29528, 50466, 72478, 75162, 37044, -30602, 2147, -26307, - -6979, -35970, -8053, -18254, 49929, 36507, -537, -45634, 46708, 65498, - 12885, -7516, 44560, 44560, -18254, 32749, 27917, -54224, -12885, 20938, - -17180, -537, 20401, 4295, 3221, -3758, - }, - { - -215285, -759136, 585726, 12348, -49929, -50466, -222801, 443992, 33823, 122943, - 158914, 344134, 846645, -3963718, -4460861, -2588792, 319975, -31675, -92342, 610959, - 467078, 381178, 521302, -504659, -363462, 268972, 71404, 1318555, -392990, 119722, - -341987, -116501, 76236, 27917, -19864, 486405, -465467, -62814, 362388, 1611, - -222265, -178778, -270583, -46171, 83752, -43487, 20401, -44023, 18790, 20938, - -2147, -41339, -198642, -67646, 3758, 92342, -149787, -30065, -73014, -168577, - -92879, 31675, 54761, -17717, -23085, -54224, 130460, 92879, -85899, -26307, - -6442, 4832, -98247, -27380, -45634, -19864, 78383, -44560, -34360, -48855, - 23622, 47782, 48318, 19327, -45634, 9127, -30065, -9127, 24696, 9664, - -8053, 16106, 8053, -18790, -1611, 9664, - }, - }, - { - { - 1556389, 7426536, 3563749, -209380, -343597, 181999, 47245, -76773, 26844, -471910, - -84289, 518617, -10201, -165893, 63888, -23085, -350577, -14496, 32749, -361314, - 255551, 83752, 133681, -362925, -63888, -47782, -13959, -77846, 19327, 346282, - -22012, -132607, -361314, -190589, 280784, -100932, -45634, -359167, -36507, 28991, - -12885, 128849, -82141, -54224, -165893, -112743, 40265, 128312, 30602, -87510, - -110059, -25770, -16643, 132070, 70867, 47245, 92342, 124554, 48855, -68719, - 12885, 15569, 62814, 16643, -16106, -22549, -41339, -44023, 18254, 41876, - 6979, -30065, -12885, -6442, 36507, 25770, -61740, 12348, -19864, -59056, - -35970, -31675, 18790, -15569, 9664, -22549, -12348, 0, -24159, -16106, - 3221, -3758, 14496, 10737, 0, -8590, - }, - { - 173946, 248571, -1688459, -528818, -97174, 99321, -26307, -213675, -19864, 248034, - 361851, 71941, 16106, -161061, 1842541, 2051384, -20938, -419833, 59056, -673236, - 150324, 505196, 241055, 409096, 457414, -344671, -286689, -226560, 252866, 156766, - -220117, -686121, -362925, 299574, -183610, -74088, -46171, 94489, 158914, 187368, - -217970, -138513, -118648, 84826, -38655, 7516, -92879, 93416, 63888, -127775, - 89657, -40265, -141734, -105764, 239444, 204548, 5369, 40802, 47245, -51540, - -130997, 22012, 7516, -14496, -45634, 14496, -49392, -41339, 19327, -19864, - -3221, 6442, 38655, -13959, 2684, 22012, 62814, 15569, -14496, -42413, - 19327, 58519, -15032, -6979, -25233, -27380, 5906, 4832, -44023, 0, - 37044, -13422, -35970, -34897, 0, 26307, - }, - { - 602369, -1411971, -1285806, -823023, -544924, 103616, -27917, -125628, 179315, -26307, - -213675, 54761, 278099, -31675, 204011, 170725, -287763, -297963, 743566, -650151, - 106300, 73551, -244276, 186294, 92342, -260919, -248571, 163209, 84826, 165356, - 262530, 95563, -22012, -124017, 208306, -70867, -179315, 198642, 71941, -19864, - 96100, -227096, 26844, -168577, -190052, -88047, -3221, 10737, 24159, 61203, - 35970, -25770, -82141, 35433, -50466, 60666, 6979, -68719, 82141, -39728, - -75699, -26844, -40802, 35970, 38655, -70867, 11274, 25770, -48855, -15569, - 71941, -52076, -47245, 22012, 19864, 48318, 2147, -49929, -16106, 22549, - -1074, -23622, 19327, 31139, -24696, -26844, -16106, 23085, 5369, -17717, - 24159, 31139, -12348, 6442, 19327, -13959, - }, - { - 7829189, 2540473, -2046015, 175557, 327491, -42950, -90731, -15032, -27380, -193274, - 27917, -22012, -237297, 249108, 93952, -384936, -95563, 69793, 272194, -130460, - 101469, -97174, 104690, 141734, 103616, -10737, -373125, 114354, -214212, -167504, - 127238, -122943, -20401, 195421, -34897, -225486, -162672, -9664, 153008, -101469, - 10201, 55835, 103079, -35433, 6979, -124017, 9664, 29528, 32749, -9127, - -97711, 119722, -62814, -57982, 20938, -51003, 37581, 35970, 53687, 56908, - -1074, -69256, 30065, -24696, -47782, 19327, -47782, 29528, 17180, -24159, - -33286, 60130, 59593, -35433, 11274, -23622, -4832, 8590, -33823, -23085, - -24159, -25233, 17717, 5906, 4832, 34360, -23085, 27917, 15032, -22549, - -25770, 5369, 3221, -14496, -6979, 9127, - }, - { - -384936, -318364, 840203, -214212, 5369, 117575, -143345, -87510, 34897, -331249, - 62814, 157840, -147640, -241592, 2811593, -349503, 504659, -902480, 208843, 335007, - 180389, 435402, 143881, 623307, 114890, 405338, -440771, -256087, -189515, -1421634, - 226560, 51003, 183073, -270583, -226023, 364535, -18790, 90194, 100932, -226023, - -9127, -44560, -176631, -25770, 94489, -91805, 47782, -45634, -43487, -117038, - -19327, 112743, -78920, -10737, 28991, 102005, -122943, -24159, 61203, -26844, - -21475, 13959, -13422, -78383, -73551, -32749, 2684, 10201, 31139, -31139, - 66035, 60130, -5906, 30602, 24696, -38655, -51540, -28454, -44023, -17180, - -16106, 28991, 44023, -31675, 1074, -9664, -11811, 22549, 1611, -16106, - -13959, -24696, 7516, 27917, -17717, -31675, - }, - { - 8542153, 13803488, 87510, -615254, -591632, 54224, -267362, 82141, 231928, -622770, - -491237, 229781, 185757, 527207, 172336, -20938, 8053, -411780, -53687, -64961, - -361314, -199179, 112206, -89657, -91268, -15569, 233539, 3758, 26307, -143345, - -47245, 235149, -11274, -233002, -148713, -71404, 113817, 3221, 207232, -134218, - 30065, 9127, -13959, 153545, -223875, 134218, 45634, -9664, -20938, -92342, - 113817, 38655, -59593, -172872, 35970, -37581, -130997, -29528, 46171, 38655, - 23622, -24696, -94489, -42950, 57445, 19327, -25770, -12348, 58519, -8590, - -23622, -26307, 22012, 19327, 3758, -10201, -33286, 16106, 43487, 12348, - 3758, 37044, 59593, 6442, -30065, -25233, 9664, -30602, 10737, 19327, - -18790, -4832, -5369, 26844, 10737, -10201, - }, - { - 137439, -555125, -11274, 286689, -33823, 26844, -135828, -198642, -17180, 234076, - -33823, -60130, -54761, 28454, 568009, 1404991, 10201, -146029, -17717, 98247, - -74088, -536334, -1114007, 90194, 165893, -306016, -415538, 137439, -294205, -126165, - 37044, 162672, 425739, -90731, -200790, 180389, 32749, 56371, -83215, -128312, - -15032, 200253, 22549, 98247, -45634, -201863, -61203, 91268, -50466, 108985, - -37581, -17180, -89121, -13422, 1074, 8053, -45634, 40802, 16643, -32212, - 58519, 68719, -14496, 2147, 31139, 14496, -57982, -26844, -8053, 72478, - 52613, -89657, -37581, -34897, -42950, -44023, -39728, -54761, -12348, 19327, - -3758, -9664, 9127, 21475, -6442, -8590, 15569, 26307, 15032, 41876, - 34897, 12348, -16106, 2147, 14496, -3221, - }, - { - -7713762, 15267535, 1941325, 73551, -71941, -2147, 452582, -63351, 57445, -176631, - -183073, 526134, 226023, -215822, 245887, 151398, -9127, 219580, 261456, -401579, - 47782, 71941, 18254, -137439, 222801, -206695, 2147, -69793, -183073, 104690, - 145492, 176094, 40802, -350040, -129923, -343061, -250719, 208843, -99858, 23085, - 135291, 537, -101469, 55835, -25233, -50466, 64961, 75162, -117038, -117575, - -44560, 15569, 184684, 26844, -43487, -50466, -6979, -26307, -27917, 41339, - -4295, -17180, -29528, -40265, 25770, 14496, 26307, -16106, 0, 22549, - -34360, -5906, -42950, -70330, -37044, 61203, -61740, -50466, 39192, -9664, - -25770, 27380, -1611, -5906, 16106, 2147, -24159, -20401, -3221, -12885, - 3221, 3221, -21475, -15032, -3758, 23622, - }, - { - 151934, -1246077, -1124745, 505732, -75162, 118112, 17180, -70330, -203474, 104153, - 227633, 117575, 1074, -1759326, -425202, -797790, 430570, -142808, 158914, -447750, - -1020055, 879395, 785979, -143345, -947040, 944356, 56908, -318364, 127238, -373125, - -39192, -70330, 37581, 303332, -234076, -125091, 172336, -117038, 300648, 45097, - -226023, 70867, 48318, -234613, -207769, -56371, 41876, 156229, -75699, 3758, - -19327, 27380, -11274, -67109, -32749, 75162, -18254, -155156, -28454, -8590, - 93416, 70330, 121333, 88047, 51540, 45097, 20938, -5369, -77846, 3221, - 51540, 41339, -9664, -61203, -64425, 9127, 4832, -27380, 8053, -11811, - 6442, 56371, 28991, -8590, 3221, -41339, -62277, -27380, 19327, 13959, - -18254, 9127, 5369, -13422, -8053, -29528, - }, - { - -12348, 1018444, -1868311, -93416, -624381, -727997, 45634, 270046, -208843, -296353, - -240518, -268435, -104690, 550293, -168577, 101469, 213675, -418759, -122943, 338766, - -117575, -270046, -80531, -97711, -143881, 137976, 128312, -140123, -11274, 161598, - -74625, -84289, -36507, -261456, -197032, 202400, 144418, 44023, 248034, 9664, - -45634, -67109, 83752, 202400, -131533, -199716, 117575, 76236, -75162, -184684, - -41876, -17717, -113817, 1611, 130997, -95026, -18254, 70330, -45634, 28991, - 40265, -18790, -26307, -28991, 70867, -33286, -10201, 15569, -52076, -31139, - -15032, 1611, -23622, -2684, -5906, -4832, -30065, 34360, 3221, 19864, - 45634, 3221, -37581, -17180, -35433, -52613, -37044, -1074, -26307, -5369, - 5906, 13959, 23085, -3758, -17717, -25770, - }, - { - 230854, 3344706, 948114, -74088, 6442, -192200, -99321, 244276, -253940, -47245, - -265214, 156766, 317291, -204011, 644782, 352724, 307090, 241592, -519691, 503048, - 824097, 273804, 135828, -75699, 296890, -129386, -185220, -112206, 131533, 479426, - 85899, 41339, -82141, 70867, -363462, -77309, 243739, 44023, 151934, 51003, - 121333, -36507, -24696, 81068, 4295, -113280, 41876, 24696, -123480, -91805, - -82141, 5369, 119185, 122943, 15569, 32749, -19864, -59593, -34897, 47782, - -99858, -22012, 68719, -1074, -83752, -537, -43487, -109522, 1611, 3221, - 2684, 44023, 0, -35433, -20938, 34360, 36507, 67109, -5369, -21475, - 15032, -30602, -26307, 53150, 36507, -6442, 15032, 1611, 23085, 22549, - -12885, 7516, 1611, 1611, -15032, 11274, - }, - { - -1955284, 2288144, -78383, 383326, -1112933, -227096, 520765, -162135, -38655, -143881, - 271657, 147640, -3758, -9127, -112743, 176631, 65498, -30602, -76773, -76773, - 172872, -291521, -128312, 158377, -113280, -66572, -63351, -91805, -137439, 71941, - 15569, 184684, 180926, 147640, -265751, 62277, 362388, 316754, -53687, -8590, - -38118, -37581, 34360, -58519, -1074, 4832, -25233, -16643, -40265, 34360, - -42950, 16643, -119722, 33286, 71941, -20938, 33286, 60130, 82678, 13422, - -81604, 60666, 1074, -76773, 23085, 19864, 17180, 31675, 3758, -88584, - 3221, 15032, -24159, -4832, -21475, 2684, 23085, 13422, 11811, -537, - -10201, -35970, -9664, 13959, -33823, 17717, 16106, -11274, 9127, -18790, - -28454, -25233, -28991, 9664, 8053, -10737, - }, - { - 92879, 363998, 43487, -272730, 47782, -192200, 99321, 156766, 83752, -177167, - 16643, 168577, 109522, 2365990, -2307471, 164819, 534187, -94489, -265214, -628676, - 1793686, 261993, -1520418, -540629, 130997, -339302, -121870, 455267, -485331, -186294, - 508417, 282394, -11811, 41876, -130460, 232465, -128312, 58519, -225486, -66035, - -13422, -93952, 45097, -71941, -30065, 28991, -105764, -35433, 174483, -3221, - -74088, -118648, 1074, 79994, -25770, -63351, -17180, 82678, -35970, 105764, - 107374, -94489, -117038, -16106, 56908, 28991, -27917, 49929, -12885, -3758, - -23085, -1611, -10201, 2147, -35433, -60666, -35970, 10737, 22012, -5906, - 39728, 45634, 15569, 31675, 4295, 18790, -23622, -13422, 11811, 9127, - 19327, -34897, -63888, 22549, -2684, -37581, - }, - { - 500364, 2739116, -1061394, -228170, 326954, -645319, 1085553, -72478, -484258, -195958, - -157303, -541703, 192737, -768262, 835371, -66572, 217970, 428423, -192737, -80531, - 48855, -49392, 90731, -20938, 175020, 32749, -389768, -433792, -18790, 129923, - -42950, 134755, 275415, 253940, 45634, 120796, 98784, -13959, 132070, -352187, - 4832, -320512, -82141, 162135, 264141, 154082, 101469, -37044, 50466, -133681, - 110595, 83752, -108985, -19327, 85362, 164819, 57445, -47782, 16643, -35433, - 28454, 38655, -13959, 79457, 45634, 68719, -8053, -28454, -3758, 30602, - -30065, -17180, -19327, -6442, 49392, 38118, -35970, -27380, 59056, 42950, - -3758, 10737, 62277, 12885, -10737, 35433, -24159, -52613, 15032, 16106, - -14496, 13959, 16106, 3221, -17180, 1074, - }, - { - 109522, -30602, 409096, -192200, 31139, -73014, -70330, 517007, 260382, 271657, - -376347, 67646, 710817, -95563, 3961571, -826244, -1611, -68183, 94489, 898722, - 404264, -139586, 582505, -230854, -344671, 459562, -101469, 744103, -312996, 111132, - -250719, -8053, 54224, -31139, 70867, 237297, -479426, 15032, 127775, -2684, - -326418, -174483, -43487, 212601, -24159, -78383, 104690, -24159, -44023, 3758, - -12348, -20401, -139586, 33286, -8590, 48855, -157840, 4832, -97711, -171799, - -30602, 34360, 4832, -16643, 9664, -25770, 146029, -3221, -67109, -11274, - 5906, -29528, -86436, 8590, -46708, 38118, 32749, -48855, -21475, -25770, - 43487, 38655, 47782, -14496, -34897, 2147, -30065, 537, 40265, 4295, - -6442, 19327, -537, -23085, 15569, 16106, - }, - }, - { - { - -1933272, 23130010, -1709397, -1115618, 722091, -237297, 114890, 219580, -59056, 24159, - 349503, -117038, -193274, 315143, -775242, 303332, -419296, -260919, -201327, 580357, - 149787, -161061, -5906, -220654, -17717, -244276, -65498, -173409, 180926, 313533, - 99321, -247497, 134218, -193810, 22012, -126702, 198642, -8053, -60666, -245887, - -17717, 148713, -77846, -37044, -46708, 41339, -60666, -103079, 192737, 4295, - 56908, 12348, -121870, 105227, 47245, -65498, -25233, -59593, -55298, 3758, - 108985, -6442, -35433, -86436, 1074, -56908, 27380, 25233, -21475, -31139, - -40265, 537, 15032, 2147, -56371, -74088, 42413, -9664, -16643, 49392, - 31139, 57982, 3221, -10737, -22549, -4295, 33823, -14496, 34360, 13422, - -1611, -4295, 10737, -2684, -5906, 9664, - }, - { - -202937, -1863479, 1013612, -128312, 267899, -114890, -234613, 30602, 146566, 74088, - 361851, 260919, -320512, -280247, 1620276, 430570, -467078, 89121, -825707, -541703, - 103616, 671626, 60666, 71941, -264677, 220117, -250182, 491237, 44560, -25770, - -126702, -872415, 162672, 69793, -217433, 355409, 164283, 187368, 137439, -210453, - 11274, -28991, 258772, -11811, -89121, 63351, 537, 39192, -33823, 79457, - 20401, -54761, 98247, 125628, 30065, -121333, 47245, 54224, -33286, -23622, - 49929, 99321, 16643, -35970, 0, -41876, 16643, 94489, -1074, -38118, - 23085, 17717, -86973, -40265, 60130, 18254, -38118, -38655, 8053, 69793, - 4295, -40802, 9664, 17717, -1074, 31675, 23085, -18790, 22549, 22549, - -42413, -12885, 20401, 31675, 15032, -13959, - }, - { - -433792, -6602439, 1647120, 923955, 668404, -182536, 84826, -90194, -260382, -363998, - 253940, 224412, -312459, 387621, 81604, 387084, -372052, -203474, 375810, -590021, - -473520, 168577, -213138, 201327, 304943, 145492, -105227, 271120, -281320, 195421, - 169114, -145492, 136902, -13959, -204011, -23622, 141734, -103079, -3758, -143345, - -168577, -121333, -92879, 91268, -28454, 65498, -61740, 99858, 59056, -25770, - -20938, 184147, -31139, -31139, 84289, 65498, -4832, -41876, -32749, -46171, - 9127, 45097, 8053, -13422, 0, 71941, 10201, -27917, 28454, 38655, - -19327, -28991, 56371, -17180, -9127, -30065, -48855, 10737, 22012, 3758, - -1611, 16643, 11811, -26307, 14496, 28991, 21475, -7516, -20401, 6442, - -2147, -36507, -16643, 1074, -11811, 4832, - }, - { - -6517076, 18342732, 1458678, 502511, -300111, 51540, -27917, 210453, 13959, -390842, - -172336, -151398, -64961, -74625, -526134, -670015, 164819, -95563, -120796, -30065, - -19327, 214748, 210990, -44560, 68719, -367757, -83752, -72478, -137439, 442382, - 54224, -24696, 239444, 21475, -76773, -280247, 23085, 86436, 80531, -67109, - -55835, -157840, 185757, -32749, 18254, -59593, 192737, 6442, -5369, 48318, - -20401, -13959, -82141, 113280, -41876, 56371, 23085, 128312, 4295, -9127, - 13959, 65498, 61740, 16106, 92342, -38655, 35433, 27917, -38655, 59056, - 14496, -93952, -66572, -8053, -11274, 2684, 32212, -7516, -9664, 24696, - 47245, 20938, -10737, -28991, 5906, -13422, 13422, 10201, -48318, 1611, - 23622, 3758, -18254, 9127, 15032, -2684, - }, - { - 426276, 222801, -1253057, 48318, 181999, -122943, -62277, 103616, 86973, -70867, - -39192, -133144, 334471, -688805, 1924682, -762894, -549219, 526670, 2525441, -752156, - -115427, 299037, 336081, 563178, -153008, -413927, -288837, -758599, -595390, -227096, - -337692, 417149, 216359, -111132, 48318, -136902, 380641, 280247, -88047, 57445, - -32749, -62814, 205622, 33823, 14496, 144418, -59593, 17717, 129386, -3221, - 22012, -69793, -17180, 35433, -70330, -12885, -10201, 52613, 8590, 25233, - 52613, 41876, -35970, -35970, 106837, 82141, 47245, 6442, -41339, 32212, - 8053, -32749, -7516, -12348, -49929, 537, 18790, 18790, 64425, 59593, - 33286, 17717, -74088, 6979, 20938, -10737, 22012, -4832, -9127, 3758, - 5369, 10737, 9127, -22549, -13422, 28454, - }, - { - -5558762, 29923574, 771484, -752156, -197032, -111132, 25770, 563178, -671089, 79994, - 545461, -67109, -244276, 350040, 545998, -210453, -117575, -45097, 7516, -219580, - 90731, 210990, -142271, -376883, -128312, 99858, 46171, -66572, -87510, 114354, - -67646, -86973, -264677, -45634, -97711, -48855, 74088, -17717, 136902, -32749, - 162672, 80531, -131533, 197569, -172872, -43487, -51003, -42950, -163746, 42950, - -43487, -49929, 106300, 88047, -33823, -93416, 126165, 102005, 0, -48318, - -25233, 30602, 85899, 13959, -6979, -31675, 8590, 40265, -11274, 41339, - 0, 51003, -20401, -11811, 9127, -22012, 35970, 9664, -12885, -10201, - -20938, -26844, -64425, -30065, 28991, 33286, 15569, 22549, 20401, -35970, - 7516, 7516, 9664, -6979, -17717, 10201, - }, - { - -288837, 469225, 1254131, -155156, -7516, -83215, -33286, -20938, 89121, -41876, - 42950, 71941, -268435, -1004486, 80531, 1235877, -1166621, -63351, -15569, -216359, - -292058, 205085, -478352, -760746, -587874, -445066, 142808, -14496, -1066226, 312996, - 287226, 89657, -271657, 310848, 455803, 116501, -111669, 26307, -74625, 156229, - 252866, -15569, -68183, -72478, -93952, 34897, 18790, 125628, -95026, -6442, - -78920, -11274, 31675, 41339, -29528, 49929, 83752, 76236, -135828, -53687, - -15569, -24159, -61203, -32212, 31139, -44023, 5369, 96637, 14496, -92879, - -46171, 32212, 42413, -9127, 17180, 14496, 27380, 26844, 46708, -10201, - -6442, 12885, 14496, 4832, -6979, 20938, -15569, -23085, 1074, -27917, - -48855, -36507, -537, 15032, -21475, -2147, - }, - { - 9059697, -5171141, -2802466, 593242, 22549, 151934, 18254, -229781, 5369, 150324, - 383863, -15032, -504659, -141734, 1056025, -31139, 59593, -248571, -230854, 399969, - -107374, -20401, 125091, 300648, -171799, -216359, 164283, 28454, -264677, 55835, - 332323, -76773, -94489, 87510, -124554, -34897, -136365, 198105, 24159, 78920, - -8053, -26844, -42413, -95563, -37581, -22549, -35433, -149250, -120796, 74625, - 66035, 13959, -177704, -89121, 60130, 50466, 91805, 57445, 16643, -50466, - -88584, 23622, 10201, 37044, -23622, -40802, 33823, 17717, -42413, -54761, - 12348, -4832, -24696, 70330, 63351, -53150, -6979, 68719, -21475, 2684, - 16106, -30065, -29528, -1074, 3758, -25233, 20938, 27917, -3221, -537, - -12885, -4295, 15569, 18790, 16643, -1074, - }, - { - -411780, 151934, 1739999, -384400, 171262, -118112, -2147, 61740, 62814, 64961, - 25770, -144418, -168041, 11811, -2924873, 1045288, 2147, -1312113, 127238, -26844, - -142808, 5369, 621160, -20401, -463320, -55835, 124017, 506806, -366146, 380641, - -373662, -508417, 395674, -179852, 219580, 86973, -177167, 30065, 179315, 10201, - 158377, 197569, -56908, 95563, 48855, 104153, -14496, 144955, 5369, -33286, - -111132, -22012, -102005, 37581, 75162, -52076, 81604, 40802, 52613, -21475, - -35433, -67109, 56371, -71404, -123480, -36507, -76773, -54224, 40802, -55835, - 25770, -58519, -79457, 2684, 69256, -2684, -24159, 5906, -5906, 3221, - 15032, -51540, -39728, 4295, 10201, -3221, 32212, 48318, 4295, -28454, - 3758, 5906, -10201, 11811, 8590, 13422, - }, - { - 654446, -1031866, -2321430, 253940, 76236, -435402, 32212, 88584, -148713, 91268, - 221728, -6979, 132607, -269509, 118648, -30065, -4832, 207769, 146566, -194347, - -210453, -41876, -128312, -150324, 140123, 45097, 53150, -144955, 159451, 148713, - -98247, 147640, 15569, 239444, -172336, 129386, -57445, 140123, 172872, 2684, - 108985, 201327, 93416, -141734, 53687, 176631, 159988, -28454, -37044, 145492, - 110059, -22549, 179315, 47245, -175020, -76236, 78920, -11811, -27917, -40265, - -48318, 75699, -19327, 18790, 5906, -8053, 28991, -45097, -16106, 53687, - -12348, -24159, 15032, 32212, -7516, -2147, -3221, 10201, -25770, 27380, - -42413, -15032, 20938, 11274, 2684, 59056, 37581, 19327, 38655, 13959, - 12885, -3758, -38655, -8590, 16643, 25770, - }, - { - -254477, 4253092, -99321, 682900, 63351, 142808, 187905, -166967, -89657, 94489, - 370441, -231928, 27380, 205622, 603980, 311385, -274878, -373662, 352187, 488553, - -378494, 220117, 477815, 354335, 54224, 122407, 81068, -246424, 29528, 10201, - -153545, -25770, -41876, -159988, -61740, 63888, -178241, -166430, 13959, -48318, - 98784, 5369, 181462, 108985, -53687, -12885, -31139, -12348, 0, 537, - 102542, 78383, -93416, -101469, -92342, 35433, -36507, 40802, 35433, 17717, - 17717, 44560, -90194, -73014, 37581, 56908, -37581, 49392, 63351, -8590, - -17717, -30065, -25770, 14496, 11811, -5906, -21475, -79457, -34897, 32749, - -22012, 23622, 23085, -28454, -40265, -5369, -20938, 537, -20938, -34360, - 8590, 0, -3221, 4832, 5906, 16106, - }, - { - 3062849, -4083977, -1094143, -689342, 104153, -19327, -375810, -13422, -423591, 100932, - -171262, -716186, 63888, -211527, -314606, -4295, 67646, -20401, 2147, 205622, - -166967, 216896, 32749, -157303, 5906, 45634, -52613, 63351, -168041, -133681, - 6979, 173946, -241055, -61740, -54761, -143345, -81604, -92342, -86436, 154619, - 10201, 63888, -114890, 160524, -61203, 1074, -164283, 25770, 34897, 85362, - 73551, 74625, 35970, 14496, 25233, 14496, -17180, 55835, -9127, -45634, - 44023, 16106, -61203, 55835, 31139, -62277, -44560, -20401, -69256, 15569, - 16106, -26307, 15032, 36507, 32212, 11274, -10737, -9664, -20938, -8590, - -6442, 26307, 48318, -16643, 27380, -5369, -32212, 14496, -12348, 9664, - 18254, 16106, 37581, -10201, -9127, 11811, - }, - { - -104690, 62814, -188979, 174483, 115427, 107374, 96637, -166967, 65498, 137976, - 157303, 66035, -349503, 2686502, -1550483, 2296197, -219580, 9664, -290984, -297963, - 431644, 68183, -568546, 98784, -102542, -81604, -121870, 127775, 160524, 511101, - 95026, -179852, -164283, -188979, -9127, -220654, -26307, 147103, -124017, 204011, - -137439, 47782, 22549, -19864, -105764, 75162, 90194, 179852, -5906, 115427, - 40265, 106837, 93416, -39192, 6979, 133681, -26844, -52613, -7516, -56371, - -145492, 24696, 83752, 41339, 25770, -49929, 8590, -58519, -7516, 25770, - -1611, -24696, -537, -27917, 15032, 76236, 41339, -3221, 4295, 2684, - -33286, -59056, -22012, -26307, -13959, -5369, 6442, 38118, -27380, -6442, - -16106, 1611, 57982, 2147, -22549, 31139, - }, - { - -717260, 3663607, -612570, -1395864, -31139, 325344, 110059, -300648, -73551, 163209, - -222801, -146029, 256087, -178778, -40265, -284005, -566936, 8590, -27380, 52613, - -134755, 157303, 205085, 145492, 540092, -177167, -110595, -317291, 368293, 368293, - -185220, -43487, 44560, -157303, 27917, 131533, -119185, -134218, -185220, -11274, - 118648, -271657, 67109, 39728, -20401, -143345, -148176, -35433, 52076, 83215, - 118648, -147640, 85899, 55835, -66035, -56908, -51540, 4295, 45097, -78920, - 56908, -30602, -31675, -41339, -52613, -60666, -65498, 22549, -8590, 22549, - -23622, 26844, -11274, 1074, -37581, -30065, -16106, 51003, -39192, -56371, - -13959, 13422, -31139, -51003, 6979, -25770, -26844, 62277, 12885, -19864, - 17717, 2684, -21475, -11274, -4832, 16643, - }, - { - -59593, -20401, -381715, -29528, 104690, -73551, 54761, 128849, 587337, -132070, - -472446, 132070, -185220, 548145, 8169028, 379568, -1454383, -404264, 446140, -148713, - -221728, 672162, 61740, 211527, 387084, -20401, 22012, 171799, 22012, 82678, - 147103, -204548, 537, 254477, -193274, -33823, 458488, -55298, -168577, 87510, - -18254, 136902, 146029, -49392, -49929, -22012, -68719, -18254, 68719, 59593, - -25233, 89657, 150861, 35433, -30602, -53150, 55835, -11274, 29528, 132070, - 140660, -54761, -33823, 62277, 55835, 38118, -99321, -48318, 55835, 5906, - -31139, -17180, 70867, 17180, 35970, 17180, -67646, 29528, 38655, 30602, - -24696, -39192, -37044, -5906, 41339, -17180, 17180, 3221, -23622, -4832, - 8590, -18790, -1611, 17717, 10737, -20401, - }, - }, - { - { - 275415, 30352534, -1484448, -2320356, 59593, -168577, 129386, 217970, -73551, 124017, - 272194, -301185, -306016, 151398, -668404, 631897, 39728, 193810, 149250, 793495, - 43487, -84289, -86973, -120259, 135291, -54224, -34897, -75162, 236223, 27380, - 144955, -38655, 448824, 114354, -64425, 44560, 140123, -83752, 30065, -137439, - 15032, 122407, -70867, 115427, 79457, 44560, -7516, -208843, 97174, 105227, - 91805, 33286, -47245, 22549, -35433, -93416, -68719, -60130, -28991, 60130, - 31139, -30602, -5906, -50466, 30065, -18790, 73551, 8053, -37044, -19864, - -21475, 27917, 537, -21475, -56371, -43487, 55298, -23622, 11274, 49929, - 26844, 45097, -9127, -12348, -32212, 33286, 23622, -9127, 40802, 17180, - -7516, 3221, -3221, -8590, -5906, 10201, - }, - { - 146029, -2222646, 777926, 152471, 180926, -214748, -284005, 95563, 64961, -101469, - -128312, -96100, -333934, -1189706, 59593, -514322, -893353, 291521, -440771, -8053, - -54761, 840203, 197569, -42413, -670552, -39192, 117575, 624918, -215822, -259846, - -1611, -539018, 133681, -69256, 5906, 157303, -41876, 119722, 76236, -279173, - 185220, 101469, 245887, -188979, -130997, 6442, 42950, -6979, 1074, 60666, - -67109, -45097, 86973, 106300, -113280, -90731, 1611, -45634, -60666, 56371, - 124017, 97711, 3221, -45097, 34360, -6979, 60666, 54224, -9127, -10737, - 18254, -9664, -46171, -20401, 54761, -11811, -37581, -38118, 5906, 54761, - -16643, -41339, 14496, 9127, 4295, 25233, 8053, -8053, 39728, 1074, - -41876, 5369, 37044, 30602, 537, -20401, - }, - { - 592169, -8673686, -844498, 1351841, 661425, -192737, 33823, -77309, -182536, -92342, - 448824, -11274, -237834, 576599, -237834, 723165, 30065, -14496, 325344, 109522, - -372588, 368830, 135291, 16643, 5906, 187905, -69256, 87510, -515396, 51540, - 52613, -171262, 273267, 114354, -241592, 164283, 196495, -94489, 5369, -147640, - -90731, 23085, -133144, 52076, 110059, 90194, -72478, 77846, 51540, -62814, - 19864, 151398, -74088, -41339, 71941, -4832, 8053, -28454, -24696, -17717, - 61203, 66572, -2147, -49392, 12348, 72478, -14496, -26307, 60130, 8590, - -33823, 10201, 54761, -53687, -23622, -33823, -13422, 32212, -13959, -19864, - 537, 16106, -12885, -35433, 11811, 18790, 17717, -26844, -11811, 11811, - -18254, -38655, 5369, -12885, -11274, 12348, - }, - { - 3030100, 28354838, -987843, 838056, 347355, 235149, 176631, 246424, -537, -332323, - -114890, 34897, -12885, -542777, -512712, 23622, 274341, -333397, -203474, -122407, - -89657, 164283, -66572, -129386, 181999, -233539, 90194, -194347, 0, 354335, - 43487, 10201, 62814, -224949, -208306, -417149, 102005, 44560, 227633, 301721, - -33286, -175557, 234076, -18790, -15569, 7516, 123480, -33286, -16643, 69793, - -30065, -60130, -10201, 104690, -51540, 0, -61203, 88584, -51003, -15032, - 11811, 40265, 31675, 25770, 76773, -44023, 67109, -8590, -30065, 39192, - 17180, -86436, -49392, 1074, -8053, 27917, 16643, -13422, 8590, 40802, - 36507, 18790, -22549, -15569, 15032, -14496, 20401, -17717, -37044, 11274, - 20401, -5369, -11274, 13959, 7516, -8590, - }, - { - -224412, 895501, 79994, 163209, 40802, -127775, 39192, 87510, 68719, 77309, - 73551, -66035, 658741, -78383, 1925756, -1426466, -274341, 1072668, 392990, -452045, - 181999, 231928, 561030, 399432, -615791, -135291, 332323, -367757, 329639, 115427, - -161061, 613107, 200790, -71941, 117575, -264141, 267362, 186294, -69793, 104690, - -537, 53150, 202400, 5369, 55835, 91268, 9664, 159451, 102542, 25770, - -66035, -129923, 60666, -18254, -46708, 38118, 57445, 104690, 9664, 28991, - 45634, 24696, -16106, 17717, 132607, 44023, 9127, -19864, -22012, 41339, - -45097, -25770, -5906, -7516, -32749, 35433, 33823, 37581, 69256, 30065, - 9664, -8053, -53687, 44023, 8053, 7516, 20401, -16643, -1074, 9127, - 15032, 17717, -1074, -25233, 10737, 27380, - }, - { - 460635, 36651104, -215285, -898185, -205085, -93416, 76236, 324807, -464930, 488553, - 489626, -239444, -300111, -129923, 144418, -139050, -126165, 39728, -40802, -60666, - 243203, 103616, -339839, -460635, 33823, 70330, 33286, -238371, -89121, 307627, - 4295, -83215, -127775, 99858, -110595, -90194, -111669, -237297, 42950, 3221, - 38655, -168577, -161598, 272194, -123480, -107911, -111132, -158377, -113280, 115964, - -71404, 56371, 148176, 50466, -100932, -37581, 171799, 51003, -39192, -77309, - -47782, 17717, 108985, 25770, -58519, -12885, 43487, 16643, -14496, 34897, - 4295, 37044, -25770, 3758, -12348, 6979, 42950, -537, -25770, -6442, - -24696, -31139, -54224, -5906, 32749, 30065, -1074, 33286, -11811, -24159, - 15569, 15032, 5906, -25770, -7516, 11811, - }, - { - -105227, 848793, 522912, -378494, 7516, -25233, 114890, 121333, 106837, -43487, - 95026, 111669, -268435, -388695, 671089, 251256, -1174674, 41876, -351114, -214212, - 199716, -16106, 13959, 149250, -365072, -620623, -305480, -208306, -613107, 323733, - 102542, -73551, -524523, 498216, 365609, 35970, -68183, 132607, 45634, 181462, - 19327, -224412, -17180, -76236, 79994, 151934, -22549, 54224, -63888, -17180, - -51003, -9127, 63351, 40265, -28454, -3221, 46708, 5369, -89657, -28991, - -46708, -11811, -28454, -48318, -1611, -40802, 63351, 69793, -37581, -105764, - -13959, 46171, 34360, 20401, 39728, 5369, 38655, 35970, 31675, -30602, - 9127, 10737, -3221, -17717, -8590, 13959, -26307, -17180, -8053, -37044, - -47245, -18254, 13959, 537, -18790, -2147, - }, - { - -7210177, -24259586, 96637, 588411, 174483, 99321, -449361, -183073, -10201, 213675, - 261456, -529892, -381178, 26844, 453119, -477278, 18790, -256087, -25770, 442919, - -412854, -365609, -322659, 69256, -383863, -126702, -60666, -239444, -390842, -67646, - 93952, -116501, 29528, 267899, -92879, -92342, -193274, 332860, 144955, 69793, - -42950, 28454, -46708, -159988, 181462, -3221, -60666, -185220, -40265, 74088, - 45634, -17180, -162135, -4832, 49929, 49392, 80531, 34360, -537, -34360, - -47782, 49392, 11811, 9127, -39728, -33823, 16643, 16643, -20938, -30602, - 23085, 5369, 25233, 88584, 31139, -56371, 51540, 49929, -49392, 13959, - 18254, -27380, 1611, 21475, -3758, -13422, 27917, 19327, 5906, -4832, - -20938, 1074, 18790, 22549, 11811, -16106, - }, - { - -187368, 733903, 847719, -471373, 20938, -120796, 30065, 125628, 61740, -99858, - -184684, -63888, 120259, 735513, -2770791, -927713, -813896, -607738, 475668, 969052, - 1206886, 462783, 173946, -17180, -413927, -358630, -165893, -118648, -478352, 717260, - -353261, -154082, 230854, -280784, 233002, 2684, -119185, 214212, 46171, 83752, - 220117, 52613, -87510, 135291, 83215, 78383, -5369, 25233, 44560, 105227, - 19327, 3221, -55835, 38655, 48855, -86436, 120259, 47245, 41339, -9127, - -59593, -95026, -32749, -133144, -64425, 537, -64961, -24696, 76773, -60666, - -5369, -60666, -27380, 66035, 61740, -38118, -25233, 15569, -11811, 13422, - 4295, -62277, -13422, 13422, 12348, 19864, 50466, 26307, -13959, -27917, - 11274, -9127, -1611, 16106, 16643, 18254, - }, - { - -956704, -955093, 803696, 989990, 241055, 426812, 498753, 152471, 177167, 484794, - 152471, -133681, -34897, -562104, 143881, -43487, 582505, 693637, 341450, -195958, - -88047, 45634, 38118, -54761, 118112, -118112, 45097, -76236, 67109, 25770, - -20938, 132607, -33823, 383326, -127775, 104153, -79994, 1074, -27917, 55298, - 107911, 264141, 5369, -124554, 223338, 176094, 31139, -17717, 29528, 143345, - 110059, -13422, 141197, 1611, -148713, -16643, 61203, -34360, 2684, -49392, - -8053, 51003, -11811, 16106, -49392, 3758, 13422, -41339, 31139, 28454, - -6442, -6979, 32749, 10737, 7516, -4832, 21475, -31675, 0, 3758, - -58519, -5906, 41339, 8590, 28991, 59056, 28991, 10201, 36507, 6442, - 6442, -16643, -28991, 1611, 17717, 22549, - }, - { - 387084, 4021163, -1015760, 168041, 185757, 184684, -107374, -400506, 51540, 260382, - 358630, -320512, 124017, -178241, 357019, 140123, -329102, -286689, 48855, -623307, - -754841, -150861, 98247, 54224, -156229, 169651, -103616, -132070, 47782, -35433, - 13959, 10737, -112743, -79994, 162135, 33823, -252329, -134218, -29528, -70867, - -45097, -20401, 120796, 3758, -49392, 41876, -54224, -13422, 82141, 53687, - 61203, 23622, -134755, -99858, -46708, 11274, 24159, 73014, 10201, -2684, - 65498, 20401, -102005, -40802, 56908, -2684, 25233, 76773, 11274, -11811, - -32212, -33286, -7516, 30602, 7516, -24696, -22012, -71404, -537, 21475, - -15032, 37581, 17717, -54761, -38655, -1611, -24159, 7516, -27380, -20938, - 11274, -10201, -5906, 2147, 18254, -5906, - }, - { - -2334315, -11600707, -489089, -104690, 344671, -211527, -19864, 397821, -169114, 71941, - -290984, -361851, 54224, -100395, -312459, -113817, 137439, -161061, 71404, 155693, - -76773, 274341, 30065, -164283, 169651, 42413, 96100, 106837, 71404, -71941, - -27380, -92342, -346819, 55835, -175020, -149250, -236760, -206158, -51003, 158377, - 51003, -16643, -232465, -3221, -135828, -65498, -105227, 60130, 46708, 59593, - 79994, -17180, 84289, -71941, -6979, -4295, -24696, 24696, -70867, 6979, - 104153, -28454, -54761, 78383, -21475, -47245, -37044, -28454, -35970, 80531, - -4295, -25233, 17180, 36507, 34897, -5369, -11274, -17717, -22549, -537, - 9127, 45634, 24696, -15032, 30602, -23622, -10737, 6979, -11274, 18254, - 15032, 28454, 28454, -14496, -3221, 19864, - }, - { - 125628, -30602, -412317, 429497, 83752, 143881, -37581, -223875, -9127, 105227, - 16106, -317828, -1338419, 1949378, -311922, 1786170, -825707, -171799, 520765, 229244, - -1108102, 59593, -548145, -174483, 97174, 209380, 104690, 195958, 160524, 548145, - -517544, -247497, -227096, -179852, -11811, -250182, 97174, -1074, -116501, 170725, - -71941, 166430, -4295, -30602, -108448, 2147, 62814, 99321, -90731, 66035, - 34360, 134218, 38655, -72478, 32212, 97711, -80531, -22012, 1074, -115427, - -112206, 104690, 66035, -6442, -28991, -39192, 23085, -76773, 40265, 22012, - -3758, -32212, 35433, -9664, 36507, 61740, 26307, -22012, 4295, 18254, - -44560, -58519, -19864, -24159, -2684, -12348, 26844, 18254, -19864, -8053, - -18254, 28991, 60130, -17717, 4295, 32749, - }, - { - 548145, 4978404, -406411, -850404, -34360, 318364, -113280, 116501, 110059, 11274, - 54224, 75162, -84826, -35433, -67109, -479963, -447213, 37044, 97174, 108448, - -181462, 154619, 81068, 236760, 555661, -128849, 20401, -179315, 471910, 321049, - -129386, -163209, 51003, -139586, -95026, -27917, -91268, -102542, -89121, 26844, - -78920, -118112, 39192, -127238, -76236, -188979, -178778, -1611, 38655, 164283, - -19864, -77309, 148176, 32212, -115427, -114354, -28991, 59056, 15569, -3221, - 41339, -35433, -15032, -64961, -23085, -49392, -29528, 20938, 10201, -1074, - 16106, 20401, -4832, -13959, -41339, -29528, 11811, 26307, -63351, -40802, - 8590, 11811, -42950, -32212, 4295, -30602, 7516, 56908, -8590, -11274, - 13959, -10737, -18790, -8053, 13422, 12348, - }, - { - 215822, -802622, -1011465, 169651, 100395, -2147, 71404, -106300, 418222, -227096, - -205622, -28454, -53150, -3725884, 2831457, 1924145, -1016297, -926639, -272194, -119185, - -170188, 453656, 60130, 370978, 382252, 19327, 307627, 344134, 521839, 357556, - 42413, -31139, 118112, 164819, -260919, 99321, 414464, -80531, 31139, -40802, - 171799, 264677, 44560, -258235, 29528, -9664, -127775, -101469, 537, 15032, - -77846, 96100, 155156, -25233, 18254, -28991, 94489, 6442, 112743, 150861, - 74625, -85362, -24159, 64961, 20401, -3221, -122943, 2147, 39192, 12885, - -30602, 20938, 79457, -9664, 30602, -33823, -34360, 32212, 13422, 1611, - -46708, -32749, -33286, 19864, 37581, -3758, 20938, -8590, -38655, -4295, - 2684, -23085, 8053, 20401, -5906, -22549, + 15263, 9658, 3901, -1419, -6208, 15042, 14882, 14661, 14205, 13703, + 13419, 13246, 13095, 12861, 12512, 12433, 12733, 13082, 13229, 13103, + 12857, 12674, 12536, 12387, 12245, 12155, 12223, 12430, 12578, 12570, + 12441, 12235, 11999, 11775, 11585, 11430, 11326, 11310, 11366, 11425, + 11438, 11422, 11439, 11535, 11703, 11912, 12128, 12307, 12428, 12507, + 12561, 7803, 353, 233, 186, 159, 141, 129, 120, 114 }, - }, + { + -2513, -7073, -3664, 4933, 11833, -9126, -9259, -9002, -9550, -10692, + -11891, -12599, -12894, -13033, -13106, -13144, -13281, -13431, -13430, -13295, + -13275, -13495, -13891, -14466, -15013, -15124, -14699, -13966, -13231, -12756, + -12530, -12358, -12160, -11994, -11874, -11774, -11759, -11938, -12322, -12777, + -13151, -13383, -13513, -13614, -13703, -13762, -13803, -13837, -13861, -13868, + -13855, -8509, -224, -69, -10, 29, 57, 78, 94, 104 + }, + { + 1910, 491, -1490, -1813, -1940, 2696, 2572, 2313, 2118, 1835, + 2422, 3344, 4703, 6559, 8165, 8526, 7404, 5240, 2687, 530, + -697, -985, -668, -226, 2, -88, -459, -928, -1248, -1176, + -592, 364, 1309, 1921, 2178, 2251, 2242, 2154, 2001, 1848, + 1751, 1671, 1489, 1132, 618, -26, -757, -1460, -2044, -2506, + -2833, -1911, -67, -26, -9, 1, 8, 13, 16, 19 + }, + { + 1353, 750, -1645, -2697, -3639, 3522, 4738, 6009, 7652, 8787, + 8843, 8533, 7931, 6997, 6500, 6177, 5537, 4673, 3558, 2163, + 759, -365, -1150, -1512, -1268, -292, 1348, 3287, 5013, 6292, + 7162, 7819, 8446, 9054, 9451, 9439, 9056, 8541, 8112, 7871, + 7803, 7835, 7892, 7902, 7801, 7534, 7098, 6592, 6121, 5726, + 5439, 3221, 145, 100, 82, 72, 65, 60, 57, 54 + }, + { + -58, 757, 2772, 4035, 4237, -2025, -3174, -4549, -5874, -6766, + -6152, -5491, -5139, -4788, -4746, -4907, -4987, -4705, -3868, -2360, + -538, 1153, 2450, 3071, 2950, 2364, 1675, 1022, 390, -245, + -847, -1473, -2246, -3044, -3446, -3217, -2621, -2164, -2162, -2602, + -3255, -3889, -4377, -4729, -5015, -5258, -5411, -5446, -5387, -5256, + -5093, -3070, -90, -31, -7, 8, 19, 27, 33, 36 + }, + { + 228, -336, 2902, 2521, 2020, -594, -199, 975, 1945, 2169, + 1372, 472, -171, -1207, -2476, -2937, -2002, 89, 2808, 5241, + 6657, 7056, 6750, 5825, 4122, 1874, -116, -1230, -1486, -1330, + -1220, -1327, -1482, -1383, -985, -499, -99, 182, 337, 314, + 61, -338, -681, -804, -661, -271, 292, 881, 1389, 1801, + 2102, 1437, 88, 60, 49, 42, 37, 33, 30, 28 + }, + { + -181, 1119, 2819, 3685, 3342, -2321, -2915, -2842, -2539, -2909, + -3164, -3288, -3378, -3520, -3097, -1559, 673, 2638, 3664, 3564, + 2365, 324, -2103, -4328, -5612, -5607, -4829, -4103, -4010, -4659, + -5684, -6647, -7403, -8060, -8598, -8843, -8709, -8308, -7828, -7398, + -7046, -6717, -6318, -5790, -5143, -4430, -3747, -3200, -2822, -2575, + -2419, -1452, -44, -12, -2, 5, 10, 14, 17, 18 + }, + { + 209, -2006, -2657, -802, -195, -103, -969, -1234, -646, -224, + 745, 1313, 1695, 2071, 2354, 2370, 2478, 3046, 3906, 4811, + 5329, 5087, 4068, 2061, -1075, -4579, -7300, -8666, -8732, -7879, + -6591, -5213, -3825, -2395, -1031, 57, 774, 1237, 1633, 2037, + 2394, 2634, 2747, 2795, 2872, 3044, 3288, 3524, 3706, 3826, + 3873, 2400, 105, 58, 38, 26, 17, 11, 6, 3 + }, + { + 482, 4180, 6357, 5317, 2944, 2790, 3262, 4049, 3526, 1759, + 137, -746, -1203, -1670, -2390, -3083, -3581, -3767, -3721, -3505, + -3244, -3067, -2919, -3003, -3503, -3982, -3623, -2224, -366, 1255, + 2487, 3508, 4414, 5157, 5640, 5817, 5677, 5266, 4687, 4058, + 3484, 3034, 2731, 2550, 2441, 2349, 2225, 2058, 1877, 1711, + 1601, 884, 72, 82, 84, 86, 88, 90, 92, 93 + }, + { + 674, 4040, 7432, 9477, 7969, -1394, -1274, -1722, -1589, -743, + -341, -266, -540, -698, -553, -269, 125, 491, 812, 1180, + 1506, 1515, 1122, 773, 964, 1613, 2162, 2151, 1584, 741, + -264, -1455, -2772, -3973, -4717, -4876, -4665, -4453, -4497, -4789, + -5165, -5472, -5666, -5811, -5979, -6177, -6330, -6366, -6296, -6136, + -5908, -3542, -61, 24, 57, 79, 96, 108, 117, 123 + }, + { + 26, -564, 1623, 937, -98, -143, -47, 389, -38, -772, + -1169, -1016, -926, -1244, -1570, -1831, -2133, -2600, -3153, -3747, + -4305, -4671, -4517, -3351, -1238, 1012, 2726, 3794, 4328, 4496, + 4473, 4379, 4176, 3806, 3363, 3028, 2910, 2899, 2744, 2281, + 1518, 605, -262, -937, -1394, -1728, -2069, -2457, -2851, -3225, + -3538, -2357, -107, -60, -41, -29, -21, -15, -11, -8 + }, + { + 465, 2595, 6347, 3430, 2269, -409, -1246, -1127, -1424, -371, + 769, 1617, 2586, 3551, 3776, 2915, 930, -1629, -3769, -4802, + -4500, -3094, -888, 1969, 4832, 6458, 6195, 4599, 2801, 1519, + 816, 597, 860, 1539, 2336, 2878, 3023, 2911, 2795, 2845, + 3058, 3281, 3325, 3089, 2606, 1980, 1341, 825, 474, 263, + 175, 77, 25, 41, 48, 53, 57, 61, 64, 65 + }, + { + -205, -402, 438, 1643, 494, -312, -32, 875, 1028, 701, + 615, 704, 535, -104, -1146, -2140, -2372, -1571, 321, 2713, + 4715, 5885, 6068, 5128, 3396, 1694, 561, 43, 10, 282, + 726, 1148, 1259, 824, -237, -1692, -3114, -4191, -4873, -5275, + -5531, -5700, -5773, -5723, -5552, -5275, -4867, -4362, -3849, -3371, + -2971, -1637, -72, -50, -39, -32, -28, -25, -23, -21 + }, + { + -586, -464, 925, 2364, 1444, -872, -1456, -1291, -1373, -1161, + -722, -1056, -1376, -1142, -1081, -1077, -470, 674, 1657, 2449, + 2920, 3103, 3447, 4242, 5373, 6064, 5466, 3614, 1238, -1080, + -3079, -4664, -5731, -6181, -5974, -5236, -4293, -3465, -2895, -2547, + -2266, -1879, -1316, -667, -122, 183, 243, 175, 85, 28, + 23, 17, -14, -7, -4, -1, 1, 2, 4, 4 + }, + { + 109, -472, -1815, 888, 814, -1342, -518, 44, 1291, 1664, + 1231, 745, 899, 1175, 1133, 992, 1153, 1784, 2823, 3915, + 4658, 5034, 5246, 5053, 3756, 1133, -2033, -4708, -6379, -7011, + -6834, -6123, -4961, -3219, -1003, 1201, 2935, 4076, 4750, 5072, + 5039, 4653, 3991, 3192, 2420, 1815, 1416, 1187, 1070, 1014, + 978, 563, 30, 21, 18, 16, 14, 12, 11, 9 + }, + { + 1, 233, -516, -205, 276, -374, -1326, -2166, -2162, -2251, + -1547, -697, -540, -757, -795, -979, -1389, -1455, -1000, -232, + 662, 1631, 2560, 3166, 3165, 2712, 2425, 2692, 3255, 3766, + 4170, 4506, 4702, 4810, 5123, 5773, 6496, 6847, 6579, 5791, + 4780, 3827, 3102, 2583, 2097, 1494, 771, 60, -529, -963, + -1226, -873, -37, -13, 0, 8, 13, 17, 20, 21 + } + } }; -const Word32 rightBRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX] /* Q29 */= +const Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]= { { { - -1409823, -49383532, 60373280, 17657148, -10086194, 10809896, -21563958, -24934970, -21000780, 7203734, - 9224516, 3362423, 27784680, 9658845, -9273371, -7822746, 2589865, 24520506, 1350767, -15502684, - -9993315, -125091, -7628936, -185220, -17885318, -125628, -4449049, 7846369, 1426466, 22142704, - 4288525, 519154, -8935143, 1160178, 9670656, -2841121, -10553808, -2444373, 8581882, 13063143, - 6616934, -15243376, -19841676, 6442, 7655243, 2362769, -785979, -3533148, 3619584, -11263015, - -1623498, 2724620, 678068, 1828046, 709743, 4689031, 9005473, 8693014, 2547453, -1622961, - -906238, -164283, 271657, -5508296, -3926674, -5305359, -6541772, -11915850, -2745558, -546535, - 5127117, 4666482, 4561256, 2406256, 6228240, 5369783, 3754338, 2274185, 1139777, -994285, - 55835, -2911451, -2268280, -4362613, -4982162, -2238752, -825171, -2682744, -4558571, 3070365, - 3326989, 1661616, 187368, 83215, 2015950, 1184337, - }, - { - 2640868, -51209968, 66600448, -8427263, 19280646, -9943386, -19514184, -28194312, -7065758, 5252745, - 4778688, 19797652, 20707648, 2399276, -13477071, 8817568, -4998268, 26811870, -12322798, -12193412, - 1767916, -14763413, -8566849, -2130304, -3816615, -7808251, 300648, 17030620, 5651103, 3369939, - 195958, -2847027, -3904662, 4616016, 13066901, 3541201, -12065637, -3132105, 5776731, 7214472, - 289910, -11136313, -5040144, 3871913, -3246995, -8171176, 5030481, 2472291, -936303, -5090610, - -4539781, -1574106, 1792612, 1438814, 405874, 10526965, 6155225, 5143760, 3433290, 5608691, - -432718, -2986076, -4282083, -2412161, -6130529, -8191040, -8491150, -9539122, -1684701, 814433, - 941135, 5207111, 7240778, 5467494, 9451076, 6065031, 4384625, 3262028, -2108829, -4870493, - -1611687, -2846490, -4686346, -6813429, -3148748, 251792, -1254131, -1297080, 1067299, 949188, - 3482682, 1179505, -561030, 1930051, -286152, -46708, - }, - { - 1272921, -54889144, 70116416, -6897181, 16925392, -1021665, -36054640, -9810242, 1701881, -13785234, - 5661304, 11031087, 20417200, 998043, 5360656, 4662724, -6286222, 5044439, 1260573, -995896, - 3775276, 3366718, -13290776, -12804371, -17464410, -14049375, -20833276, 9896142, 23509040, 30144764, - 4813585, -433255, 7194070, -2523830, -8381092, -3804804, 3205656, -2633352, -6980396, -891206, - 13872744, 1356673, -8372502, -5862631, 1686848, 1702955, 127775, -11855183, -9174587, -4013110, - -1461363, 5991480, 8189966, 2024540, 7959112, -426276, -5205501, 9494025, 17304424, 8923868, - -1685775, -4265977, -6469832, -1288490, -6101538, -10669236, -6327024, -12343199, -6592775, -8380555, - -1020055, 8147016, 6357089, 7927436, 9974525, 8219494, 9265318, 5656472, 2799245, -530428, - -4935455, -5570036, -6389838, -2803003, -3718368, -5420249, -5058935, 739808, 5608154, 1812476, - -2076617, 789737, -777926, -2099165, -2935073, -1791001, - }, - { - 302795, -35748624, 46741056, 14091788, -13078175, 8090645, -13390097, -13390634, -23165980, -17209398, - 21987012, 9961103, 33659120, 2245731, 2648921, -13372381, -20544976, 14322642, 8817568, -3461207, - -833224, -11237245, -10543608, 5988795, 11776263, -15676631, -12724914, 12333535, 6473590, 6332393, - -4284230, 3198677, 6997039, -9420474, 563178, 4193499, 2041720, 179315, 692564, -1603633, - 4122632, -6548215, -6513855, 3765613, -3609920, -2307471, -777926, 5057861, -14496, -5568962, - 7927436, 2255932, -5209796, 43487, -383326, 1794760, 2317672, 323733, 3340948, 75162, - -2856690, -2090039, 3027415, 39728, -4125316, -2095407, 473520, 423054, -6690486, -2167885, - 3740917, 3506841, 2694018, 3041374, 261993, 971200, -2269353, 2956548, 855772, -2236604, - -1044214, 503048, -480499, -1503239, -674310, -152471, -2263448, -3066070, 923955, 1133871, - -491774, 61740, 304406, 4186519, 1574106, 1433982, - }, - { - 894427, -22213570, 52410948, -28141700, 19387482, -6890738, -13024488, -20635708, -14133664, -12416750, - 21714818, 19566798, 21471078, 10114648, -6567542, -6053757, -15620259, 16610249, -8315057, -375273, - -375273, -20699594, -19310172, 30071750, 8432631, -22284438, -6532109, 14757508, 21944062, -4385699, - -13106093, 7596187, -6125160, -5790153, 6795712, -1991254, -4116726, 12633109, 3142306, 947040, - -995896, -5932424, -4259534, 5695664, -659278, -9580461, -7081864, 1276142, 12220793, 941135, - -3306588, 1144609, -6426345, 4789963, 2598992, -4763656, 6116571, 4332012, 1699733, 509491, - -7274064, 1597191, 2325725, -2075543, -1742146, -6379637, -4589710, -2240899, 2876554, -1418413, - 2293513, 2956011, 6820408, 3365107, 3838627, 2365990, -1065689, -3002719, -1931125, -5215701, - -2274722, 495532, -644245, -140123, 135828, 9127, -2310693, -690416, 1311039, 1393180, - -850940, 692027, -501974, 1322313, 1557463, 2510409, - }, - { - -2174327, -39218420, 51765092, 21826486, -19683836, 9637907, -10777684, -24227910, -20179366, 1060320, - 1462973, -2109366, 24901684, 44676788, 2937758, 9046812, -40161704, -11121281, -1750199, 11840151, - -8417599, -23329726, -17503066, 39338144, 5929739, 13909788, -18638010, -7882876, -755377, -5949067, - 2456185, 32213866, 3215857, -10001368, -12062416, -5646809, 4457103, 6508486, -141734, -4693863, - -18727668, 13702019, 7455527, -10590316, -7826504, 3514357, 8119099, 753230, 4570919, 3813931, - 3748970, -91268, 6427956, -976031, -3645890, -7919383, -10511932, -5186710, 798327, -962610, - -3868155, -601295, 2339147, 7064148, 6287832, 3100967, -2883534, -747861, 2184528, 5322538, - 1320166, 5812165, -729071, -662499, -3864934, -2881923, -6546604, -4999879, -3001109, -176631, - -2882460, 2809982, 5816460, 3599720, 2478196, -1408212, -4614943, -1457068, 699006, 2652142, - 2536715, 3017752, 1249299, -441308, -1480153, 519154, - }, - { - 681289, -20648056, 55862492, -37233072, 26775900, -12299713, -15882789, -16690780, -16576426, 2185602, - -3208878, 11117523, 50726248, 15768436, 10390600, -16327318, -37793028, -6031208, 16632798, 9248138, - -22032646, -24631100, 1111860, 14659797, 11395622, 14268418, -9106941, -6336151, 1821603, -2564632, - -3263638, 21037286, 10415833, -16028281, -13706851, 6088116, 5675800, -3831111, -1673427, -10510322, - -5630702, 8755828, 4897874, 696322, -1547799, -1131724, 5972689, -3944391, -223338, 7804493, - 7908109, 609885, 2508798, 143881, -7151121, -12479027, -6106370, -2218888, 1404991, -6316823, - -1436130, 4199941, 5660767, 1766842, 3411278, 3328063, -571768, -1709934, 3825742, 1909650, - 4785668, 4417911, -1284195, -196495, -6131066, -3427384, -2891587, -4278325, -2648384, -1997160, - -1262720, 2762201, 2569464, 3692061, 1576790, 367757, -2669322, -2284923, 666794, 3171297, - -203474, 1603633, 2676302, -1391569, 158377, -1851668, - }, - { - -2231773, -32385664, 44669272, 21364242, -19712290, 11218991, -13425531, -18399640, -16681653, -13292924, - -535797, 11979738, 37871948, 26555782, -20732880, 10612864, -19675782, 15820512, 5489505, -25715580, - -14566918, -9815611, -7732015, -15022185, 36152352, 37011344, -9113921, -38042136, 11484743, -7961796, - 9352828, 16327855, 11623792, -3575024, -13794361, -719407, 1136019, -1843615, -9474161, 1292248, - -9757629, -5267778, 7261179, 7984344, -1647120, -3428458, -945430, 14117558, 5657009, -3885335, - -1653562, 10754061, 11876658, -2871186, -9183714, -7931731, -9817758, -15568720, -5756867, 6821482, - -2978560, -2496987, 4871567, 5652177, 7286949, 9693741, 7801808, -5740761, -5400385, 7022272, - 6113886, 2405719, -1774358, -2884608, -4546223, -2372433, -9902584, -9753334, -2665564, 1197759, - 1218697, 5181878, 3921842, 4881767, 1394791, -1002875, -3957276, -2243584, 3769371, 6373195, - 2428267, 3568044, -52076, -3879966, -3664681, -1582696, - }, - { - 505196, -23672786, 58950572, -39694624, 29988536, -10748156, -19057306, -19891604, -12819404, 121333, - -4966056, 32779190, 37850472, 5066451, -5269388, -4802847, -13202193, 17317308, -16662862, -17555678, - -12997645, 5594732, -15477988, -11404749, 42913704, 5759015, 3413962, -29726542, 7137699, 15580531, - 14463302, -9109089, -7243999, 14100378, -8392903, -5187247, 4181688, -2557116, -11395622, -15515032, - 1283658, 4194573, 1712618, 11727945, -2987150, -1975685, 5687074, 6843494, 3393561, 3169149, - -1404991, 5014375, 9095130, 4537096, -13118441, -9497783, -13768055, -16826072, -4735202, 2071785, - 2434173, 6408628, 6199249, 2297808, 2051921, 11358578, 3344169, -2887829, 1827509, 2063732, - 7382512, 2152852, 133681, -7374459, -8681740, -1252520, -6386617, -4397510, -3347927, -950262, - 3278134, 3867081, 3058554, 2565706, 1114007, -1478543, -1952063, -96637, 1146756, 5506148, - 2982318, -394063, 918049, -1374926, -1918240, -1637456, - }, - { - 1175747, -48246440, 61643520, 14976014, -5596343, -35421668, 1482301, 3964792, 8601209, -20506858, - -9141838, 19321984, 4430796, -10534481, 6553047, 14601278, -1751273, -6371047, 20891794, -5011153, - 15548318, 1244467, -13179107, -15462956, -28265716, -13903883, 4622459, 299037, 12273943, 10872710, - 5585605, 9662066, -1119913, -8187819, 9550397, 272194, -2044404, 3475166, 12263205, 885837, - -6578816, -16409996, -13150116, -4911295, 9878962, 3880503, 18626200, -271120, 2157684, -18178986, - -14155675, 1925756, -509491, 6496675, 7353521, 9165997, 1765232, -7173133, -1304060, -4327717, - -2928094, 7886634, 10071161, 3365107, 231928, -5365488, -4858145, -2771328, -4422206, -4886599, - -2982318, -4285304, -2383707, -73551, 7909719, 6329708, 4896263, 2521683, 4309463, 4782446, - 303869, -3779571, -2232846, -1671279, -571231, -3085934, -4338454, -3039763, -5512054, 524523, - 2144263, 376347, 3010772, 1712618, 1290101, -1316944, - }, - { - 1604170, -26516054, 53627500, -7368017, -9885941, -48229800, 36755256, -537945, -2905546, -11680700, - -1831267, 26469884, -3442953, -11504070, 18430778, -13696651, 5567888, -3740917, 16069083, -13791140, - 7562364, -9415642, -10963441, -8048232, -20043538, 18779744, 5143760, 13532905, -1481764, 23033372, - -24456080, 8807904, -5728413, 4305168, 9899363, -3841848, -2404108, -108985, -3943317, -6619619, - -8248485, -8050916, -2447058, 4922033, 10504953, 10230075, 12763032, -3663607, -10157061, 2063732, - -18285824, -9047885, 10926397, 9452686, 3295314, 6766721, -1013612, 340913, -7857106, -1548336, - -1662689, 1404454, 2378875, 3109556, -6729677, -4853850, -1628330, 1470489, 231391, 3403225, - 578747, 884763, -2574296, 582505, 4343286, 2353105, 1794223, 775778, 1203128, 176631, - -1279900, -3732864, -5260798, -3029563, 1632625, -1564442, 1049046, 232465, -1476932, 2788508, - 2771328, 978716, 2365453, 714038, -1279363, -1267552, - }, - { - 234076, -46947212, 65129420, 13270375, -13859859, -23969138, -5111548, 20105816, -12599287, -5757941, - -45093400, 36184024, 10451266, 7917236, 36391256, 4824322, -25516938, -15707769, 6913287, -22622666, - 7525320, -628139, 889058, 15003931, -20185810, 14603426, 7456063, -6069326, -13461501, -7243463, - 13579613, 5361193, 8141648, 4757750, -13634911, -16875464, 2266669, -365609, 2864206, -5165772, - 5418638, 14464913, 1295470, -1050656, 10700374, 4439923, 159451, 28454, 1509681, 577136, - -17026860, -12734578, -2236067, -6259378, -6900402, -7039989, 4022774, 5695127, 4137664, 19157702, - 7243999, 1366873, -7561827, -1261110, 2851858, -2163590, -6665253, 7592966, 8096014, -349503, - -3201898, 778463, 2057826, -4056060, -9747428, -3681861, -6831683, -4269198, -1149441, 2821257, - 1547262, 1324997, 2502892, 5913096, 3479461, 5750425, 6564321, 3487514, -662499, -1435593, - -1520418, -5232344, -6679211, -4447976, -4803921, -2160369, - }, - { - -3971234, -9535364, 43525200, -9983115, -16724603, -29968134, 30095910, 1534914, -10022843, -11896523, - -29360934, 40623948, -3479461, 33114198, 13394392, -10668162, -21431350, 2080912, -7763154, -14673219, - 9120363, -1094680, 8735427, -5005785, -9941776, 9255118, 12442520, 1821603, -15027017, -2310156, - 5516886, 7544110, 5554467, 2872796, -10613938, -19851876, -12724377, 7407745, 3510062, -7715909, - 17491254, 14340359, 15673946, -15201500, 9279277, 11144366, -5679021, -4577899, 1796370, -2358474, - -9701794, -15756624, -10186589, -4242354, -7437810, -1680406, 12244415, 3235721, 9339406, 9204652, - 1956895, 1222455, -2624762, 317291, 2108292, -2166811, 1403381, 10476499, 11274, -4170950, - -82141, -2672007, -955630, -4200478, -5456219, -3374234, -7783555, -4592931, -1024350, 2547989, - 2882460, 4632122, 5257577, 5501853, 3469797, 3915400, 2960843, -463856, 287226, 66035, - -1749125, -2384244, -5471789, -5461051, -4342749, -2372970, - }, - { - 1509144, -43656196, 61792232, 6542309, -3508988, -32420560, 4681515, 7604777, -7219303, -10520522, - -15596637, 11097659, 11508902, 24399172, -10087804, -1730872, 1122597, -3949759, -7318088, 10950556, - 5814312, 9847286, -12242804, -9059160, -5037997, 4551592, -10337449, -10649908, 3439195, 4971425, - -5629092, 11039140, 912681, 1184874, -4449049, 23153632, -9287867, 15965467, -3614215, 7935489, - -12067784, -18742700, -9169755, 3283503, 198642, 1751810, 15826954, 9500468, 1777580, -4422743, - -18173080, -2618320, -5552319, -6178848, 5890548, 5892159, 3289945, 1288490, 1941325, 5890011, - -904091, -1303523, 6095633, 4331475, -1979980, -3812320, -4486094, -1112397, -5953899, -166430, - 66572, 809064, -2707977, 923955, 486405, -944356, -1183264, 8053, 4858145, 3147137, - 2788508, 2012729, 67646, 1520418, -2632815, 533650, -2655364, -3997541, -3631395, 1191317, - -154619, 382789, -767725, 1257889, -912681, 1401233, - }, - { - -3337727, -7187628, 36425616, -6924024, -11460046, -30481920, 28965796, -8285529, -11516955, 6017249, - -17506824, 7351911, 32678258, -5300527, -6774237, 17162152, -10046465, -13087302, 5586679, 2232846, - 221728, 1602023, 1318018, -10911364, -11923366, 5714454, 3606699, 2070711, 528281, -175557, - -7841000, 3500398, 2882997, -2362232, -8793409, 11165841, 4884452, 2534568, 9129490, 8513162, - -5368172, -13432510, -7108171, 6071473, -9955197, 4425964, 4413079, 10166188, -4207994, -4359929, - -12864501, -2779381, 169114, -1383516, 5806796, 6344204, 6575595, -1352915, 1624571, -6076305, - 68183, 144418, 1194538, 3437585, 2346126, -2916820, 1724966, 195958, -4953171, -1961190, - -731218, -169651, -1379221, -328028, 482110, 643171, -3022583, -1524713, 4546760, 3580929, - 522912, 2019708, 466004, 1999844, -1424319, -497679, -1532767, -4019553, -1430224, -1772748, - 1461900, -1374926, 649614, -899796, 1257352, -528818, - }, - }, - { - { - 2688113, -7674033, 59079424, 25202868, 8602819, 6252936, -6974490, 2416456, -600222, 7293928, - 808528, -10261214, 2238215, -6776385, 792421, -7646653, -14761803, 10013716, 2700998, -4631586, - 3245922, 12875238, -1184337, -1051193, -19454054, -6010270, -12169790, 1423782, -8114267, 12258374, - 1461900, 2948495, -336081, -2065879, -1647657, -4902705, 4028679, -25770, -1609539, -2365990, - -6519224, -1343788, -4721243, 2449205, 2340220, -2987687, -2805688, -1433445, 4034585, -8342974, - 571231, 1575179, -1512902, 179315, -2538326, 2863670, 5976984, 82678, -3827353, 307090, - 4669703, 4804995, 1753420, -3423089, 1193464, -84289, 221191, -2543158, 3298535, 807991, - 5375689, 3079492, 1845225, 1297080, 1897302, -1031866, -883690, -354335, 1872606, 620086, - 3088618, -53150, 1267552, 1650878, -1320166, -1483911, -724239, -1861332, -2289218, -60666, - -265214, 904091, 742493, 754304, 1206886, -336081, - }, - { - -5723581, -121847152, -21115132, 19022410, 36347772, -8276939, -11709691, -9825811, 7669738, 1997160, - 2407866, -489626, 683974, 1451162, 5103495, 21265994, -9092446, 7399692, -8014946, -6728067, - 2591476, -3082713, -3117610, -3195456, 4648765, 4722317, -3642669, 2758980, 5746666, 3941706, - 4723391, 3833258, -9143985, -1946694, 1167157, 4066797, 3187940, 3104188, 1675037, -1040993, - 1854889, 2861522, -2172180, -804770, -2549063, -7968238, 168041, 938987, -660888, 497679, - -2871723, 2074469, 1660005, -2807298, -5571110, 2580739, 3933653, 3105798, -366146, 558346, - -2918967, 1115081, -3364033, -1908576, -200253, -736587, 448287, -2324651, 1912871, 2916820, - -1219234, -1766842, -137976, -909996, 3318936, 1281511, 1547799, 1305670, -850404, -4491999, - -1424855, 118112, -761820, -2252710, -164819, -465467, -773631, 1328756, 1442572, -1796907, - -613107, -874563, -1613297, 886911, 613643, 1170379, - }, - { - -2095944, -68863360, 30504468, 18279380, 35343824, 1394254, -12001749, 4635881, 10972031, 1337882, - 11312944, 947040, 4396436, 392990, 1826435, -8186208, -6371047, 1396938, 1416266, 3576634, - -4856535, -7064685, -6307160, 3148211, -2088965, 2613488, -15234786, -324807, -4292820, -805843, - -5202816, 6192806, 7922604, -1360431, -6306623, -4726612, 234613, 125091, 3058554, 3205119, - 3506304, -3109556, 184147, 2124398, 2791729, 958315, -1188095, -3402688, 5018670, 4973036, - -4814659, -1900523, 1945620, -4504884, 2823941, -2161442, -2319819, 4640712, 3858491, -1939178, - -1482301, 2720325, 1348620, 1239098, -2788508, -3758633, 1757715, -1560147, 2689187, -613643, - -217433, 2125472, -694174, -137439, 592169, -833761, 976568, 175557, 443992, 1373316, - 637803, 2086280, 319438, 758062, -1615982, -1094143, -1898912, -1057636, 1387274, -1022739, - -2087354, 1249299, 663036, 626528, -1462973, -2000381, - }, - { - -112206, -22228604, 36974300, 13831405, -7192460, -4263829, -6691022, 1223529, -6744173, -5806796, - 15625091, -1597728, 12141873, 4092567, -395137, -18397492, -4455492, 16508244, -4903779, -10711648, - -2172717, -434329, 12020540, 13172665, 3016141, -3892851, 4663261, 3383897, -3919158, -565325, - -7323993, 9079024, 7203197, -5530844, 1739999, 5724655, 5326833, -491774, -2434173, -3446175, - 4772783, 2369748, 3118146, 3532611, -9507447, -775778, -665720, 268435, -1584843, -582505, - 2965138, -5456756, -2935610, 2428267, 752693, 2783139, 2003065, 165893, -1866700, 2066953, - 3491272, 186831, -2414845, -2123325, 850940, 2560338, 2095944, 2636036, -1525250, -2274722, - 759136, 223875, 2319282, 3127273, -452582, 815507, -861678, 1906429, 451508, -302795, - -291521, 1209033, 521839, 130460, 637266, 222265, -990527, 209917, 2405719, 1638530, - 75699, 102005, 369904, 3040300, 760746, 213675, - }, - { - -1326071, -107807976, -27940372, -13987635, 39588860, 2778307, -3538516, -7281580, -7989713, -24969330, - 9994389, 1265942, 6152541, 4630512, -15479062, -5221070, -2098629, 22629646, 475668, 8660802, - 3300146, -13336947, -20726976, 6852621, 2711198, -2635499, 2931852, -2123861, 2830920, 2209224, - -135291, -216896, -5966784, -3557307, -46708, 2789045, 1997697, 4361540, -3404835, 488553, - -3192235, -13842143, -10522133, 3310883, -2465848, 748935, 6720550, 748935, 4911832, -709743, - 617938, 8658117, 350577, 6339909, 1431835, -4413079, -900869, -7886634, -3636227, 579284, - -2295123, 6946573, 4881767, -2838437, -3834332, -3765613, 2101850, -1037235, 2243047, -461172, - 760209, -3442416, -1042066, -838056, 1642288, 2238752, 1551557, 1291711, 329639, 708133, - 3131568, 2593624, 220654, 1046361, 1320166, -470836, -2526515, -893353, -1502702, -998043, - -1181653, -387084, -1199370, -508954, -468151, 1197222, - }, - { - 2840584, 19521700, 72428720, 8179229, -19241990, -6729140, -3208341, -4123706, -3352759, 3201361, - -3748433, -6656126, -963146, 9094593, -13149579, 11170136, -16363825, 1872069, -161061, -10790032, - -16603270, -4431870, -3796214, 27523762, -18025440, -997506, -4805532, 7494718, -3742527, -6160594, - -5187784, 9824201, -18676128, -6065031, 385473, -4685810, -1553704, 5662378, -1823751, 4057134, - -6467147, 8670465, 956704, -222801, 4481262, 1813550, 3257733, 1797981, 2385854, 789200, - -571231, -4328254, 1437203, -79457, 2760053, 3762391, -5000416, -9319005, -4965519, -882079, - -2515777, 2632278, 3940096, 1468342, 3735548, 3185792, -2738042, -575526, -228707, 3105261, - 4651987, 5493263, 465467, 834834, -3428995, -267362, -1138703, 798327, 1821603, 2280628, - -483184, 1029718, 898722, -1233729, 539018, 1440962, 24696, -21475, -1075352, -258772, - 115427, 177704, -1333051, -1074, -462783, -54761, - }, - { - -110059, -116359256, -32743220, -29892436, 35485020, -1203128, 1138166, -3376381, -4884452, 2858838, - 1922535, 3825205, 14903000, -6165426, 7366406, -1086090, -12905303, 168041, 12025908, -3001645, - -19264002, -5626407, -5781563, -1730335, 4005594, 1698123, -10488847, -8413841, -227633, 4650913, - -4880694, 7022272, 1766842, -273804, 5072893, 8187282, 3508452, -4601521, 3630858, 2437931, - 2516314, 4398047, 3227668, 5944235, -130460, -9123047, -4925791, -3935264, 4879620, 5014911, - 3167539, -409633, 4933844, 8540006, 2953327, 577673, 2040646, -436476, 7777649, 536871, - 581968, 4367982, 4963372, -1917166, -2658585, -12348, 1276679, -656056, 2651069, -1007707, - -1219771, -2634963, -3870303, 1568737, -68719, 256087, -3550864, -4062502, 649614, 2227478, - 1730872, 2201171, 311385, 1496796, -1662152, 339302, 905164, -1282048, -134755, 717260, - -1354525, -157303, -348966, -3120831, -726386, -453656, - }, - { - 2425583, 28625958, 74911744, 7096360, -13113072, 600222, -9455371, -2309619, 2728915, -4089346, - -2017024, -3335042, 7347616, -3579855, -32488206, 8150238, -33888364, -4146254, 7224672, 3732327, - 3085397, -2595771, -1759863, -15017890, 14488535, 17285632, 5854041, -19937776, 14428943, -5717139, - -2312840, -1478006, -4074850, -6109591, -7028177, 5366562, 8867497, 7182259, -1919850, -1389959, - -6934225, 4573604, 4156992, -3379603, -1505923, 3190087, -624918, 5231807, -855772, -231391, - 3824132, 1187022, 3558917, 2101850, -2315524, -4295, 1880122, -2211908, -2516851, 1466731, - -213138, -2687576, -433255, 1635846, 143345, 1220845, 5265630, 1870995, -1891396, 2481954, - 4265977, 625992, -1919314, 948651, 2109366, 2321967, -4362076, -2598455, 1253594, 509491, - -2052458, 1910187, 1239098, 1713155, -709743, -844498, -2099702, -608275, 641024, 1101122, - -971200, 1282048, -845035, -941135, -453656, 15032, - }, - { - 291521, -117202680, -32640678, -31412854, 37101540, 4227859, 5443871, -2132988, 1046898, 2382633, - -3817152, 8106751, 5514201, 2924873, 1137093, -6921877, -3882651, 7703561, -14851997, -10074383, - -1019518, 36507, -16736414, -1857037, 20851530, -16414291, 3663607, -10456098, 9254044, 8129836, - 11380590, -8959302, -6221260, 10748156, -4366371, -2882997, 2134599, 944356, -9257265, -15941845, - 1418950, 1987496, -2864743, 6227166, -9197136, -5902896, 5765994, 5065377, -2803003, 484258, - 3499325, 1597728, -3085934, 995896, -3309272, 2144799, -693637, -5987722, -1166621, -4209068, - -2681133, 1370095, -2305324, 351650, 58519, 5182952, 3117610, -1252520, 3334505, 64961, - 172872, -978179, 1255204, 98784, -2672544, 987306, -2749853, -287763, -1573032, -1551020, - -179315, -2666101, -2755222, -248571, -700080, -1873143, -100395, 998580, 570157, 2275796, - -255014, -1036698, 885300, 132070, 39728, -690953, - }, - { - -1876901, -53823456, 41023916, 11574400, 10167798, -5745593, 6069863, -18894634, 12590697, 440771, - 3104188, 4104378, -11781095, 6207839, 10764262, 15918223, 1977833, -9730785, 20125680, -471373, - 11725261, 6162741, 5315022, 1906429, -8167954, -6075768, 1087164, -7350300, -6575058, -7321309, - -2320893, 931471, -7814693, -6950331, -6565932, -2757906, 7437273, 3851512, -260919, 3912715, - 5825587, -4586488, 3971234, 1350767, -322123, -4165582, 1059783, -11812771, -648003, -12928388, - -4391067, -434865, -8895414, 1716913, 1145146, -868120, -356482, -7435662, 5916855, 392453, - -2411624, 2589865, 131533, -6613713, -6801081, -3231963, 1323387, 2672007, 1663226, -3183108, - -3061238, -2901787, -68183, 1374926, 3056943, -575526, -1894618, -2269890, -57982, 864362, - -1247688, -2234457, 344671, 904628, 1250909, -2196339, -4865661, -399969, -302795, 622233, - 856309, 562641, 2616709, 759672, 2206540, 8590, - }, - { - -3345243, -97843112, -6881612, 1919850, 21837762, -5849746, 54575612, -20984136, -6523519, 13361643, - 752693, 10982768, -1336272, -5866926, 6695854, -8827232, 12081743, 15543487, 28243704, -13143674, - 10166724, 4944044, 932008, -14496, -9770514, 15855946, 3461207, 10054518, -3845606, 15150497, - -20538534, 5883032, -5692979, -3687766, -4599373, -3944928, 2462090, 4513474, -1031329, 174483, - 1992865, -1857037, -983548, -1773822, -2971044, 1285806, 3325379, -1798518, -106837, -216896, - -9670656, 1739462, 9358197, 759672, -4509716, 3543885, -6254546, 2450279, -2008434, -2867428, - -337155, 2949569, -549756, 419833, -751619, 655519, -4195110, -221728, -1492501, -380105, - -285078, -285078, -2135136, 1074816, 848256, 1095217, -113817, -602906, 2066416, 251792, - -102005, 864362, -1707786, -2166811, 1879585, 1541356, 3093450, 352724, 110595, 1642825, - 565325, -2336462, -256624, 1815161, -188979, -16643, - }, - { - -194347, -36638756, 48154636, 13392782, 5698885, -9632001, -18341658, -34360, -8987219, -876710, - -25784300, 26134876, 11570642, 12614856, 14025753, -9343701, -23434952, -2729989, 13749264, -5842766, - 15379204, 7581154, 6629819, 11803107, -17057462, -630286, -892279, 10880763, -1430224, -6323803, - 2393908, -11952894, -13045426, -3394098, 2113124, -4927938, 11023570, 3745212, -1061394, -8231305, - 1407139, 4132832, 2359011, 11431592, 6308770, -3183645, -787053, -357556, -2481417, -2266669, - -4186519, -1806034, -211527, 585726, -2208150, 1295470, 2469606, -3841312, -1308891, 5882495, - -1364189, 3752191, -5879810, -5424544, -253403, -1474784, -3657165, 6175089, 3255048, 481036, - 841814, 890132, 1291711, 2427730, -2325188, 170188, -1178969, -1187559, 715649, 2447058, - -1466195, 508954, 484258, 1662689, 401043, 2080912, -995359, -1940788, -984084, 181999, - 1942936, 571231, -564788, 195958, -2005213, -309775, - }, - { - 11995307, -53174380, -26763552, -9985799, 17700634, 11715597, 32778654, 9242233, -1393717, 3657702, - -17557290, 24019604, -12178380, 928787, -17156246, -9944997, -20139638, 8185671, 595927, -6781754, - 12210592, 3320547, 6948720, -4150012, -13031468, -4571456, -1506997, -81604, -1220845, 6573985, - -1589675, -12791486, -15239618, -6007049, 398895, 666794, 3139621, 9533754, 4207994, 477815, - 8830453, -8923331, 2670933, -16621523, 3075734, 4488778, -3046743, -647466, 8003672, 4810364, - -2694555, -7594039, -4909148, 4975720, -5912560, -3149822, 4973572, -3958886, 876710, 865973, - 207769, 2612951, 1114544, 579821, 2177012, -1192390, -4927938, -1167157, -4012573, 1702418, - 3877819, 34897, 2764885, -530428, -88047, 1421097, -3170223, -262530, 1072668, 2426120, - 1373316, 1322850, 1971927, 678605, 979789, 2668249, -993748, -2325725, -57982, -734976, - -1758789, -1232119, -436476, 153545, 647466, 1756642, - }, - { - -2769717, -63939180, 32897838, 161598, 6072010, -8055211, 3435974, -2244121, 13243532, 2166811, - -7989176, -1430761, -16013249, 11568494, 5647345, 5945846, -8694088, 1822140, -2937221, 2959769, - -925029, 8119636, -3959423, 18603650, 6665789, 5930276, 2753074, 1301375, 6325950, 4182761, - -17182016, -3129958, -2487323, 6036040, -9148817, 14370424, -1803349, 12700218, -9144522, 8628589, - 4205310, 291521, 2240899, 7143605, -485331, -4903242, 4276177, 6288369, 7260106, 6905771, - -2301029, 7514046, 1222992, -1105954, 2963528, 2771328, 1687922, -106300, 2668249, 3803194, - -1047435, -2923799, 752156, 1486596, 2004676, 2789581, -262530, -77846, -3362423, -1074279, - -903554, 1272921, -1183264, -490700, -2328946, 941672, 334471, -419296, 390842, -1193464, - 2764348, 4239133, 963146, 1587527, -969052, 1516124, -1790465, -2993055, -1287417, 3009162, - 265214, 1247151, 404801, 1598265, 1053878, 1216013, - }, - { - 9769977, -53098144, -27269284, -9379135, 23380192, 19413790, 31679678, -14296336, -20302310, 4613869, - -6808060, 10069014, 31686122, 747324, 20963736, 30127584, -2164127, 2165201, 14933064, -4929012, - -10440529, 4318053, 5173825, -8502962, -308701, -2908767, -4304094, -504659, -2199560, 1261647, - -715649, 4082903, -3003256, -10276783, -21744346, -843961, -2660732, -8066486, 493921, 2695629, - -431107, 2781528, 3142842, 4685810, -3817689, 703838, -8444443, 1032940, -2723546, -2524367, - -5902896, 5281199, 1321776, -3243237, -774705, 318364, 3325379, -2682207, 2326799, -4560719, - -462783, -2148558, -2510945, 2092186, 360777, -5019743, 1083942, 2735357, -489089, -1129576, - 616328, 2615098, -2039573, 1565516, 3150896, 3101503, 362925, -1963337, 1016297, -154082, - 332860, 973884, -1726040, -704375, -1683627, 1392106, 1280437, 523449, 2512556, -945967, - 376883, -1934883, 1600412, -312996, 941135, 1279363, - }, - }, - { - { - -1074279, 64811592, -9386651, 19950124, 22123376, -231928, 629213, -780073, 5285494, 5345087, - -1084479, -7245073, 1781875, -11851962, -6980396, -972273, -9569724, -5005248, 3846680, -3317325, - 13835163, 20823612, -8036958, -15164993, -5007932, -15404437, -1117765, -4191888, 1264331, -11127187, - 6630356, -673236, 4551055, 2903398, -10674067, -1463510, 6487548, -2608656, 781147, -7766912, - -5565204, 4756677, -2791192, 2952790, -4130148, -1642288, 4126927, 1518271, -7433515, 79994, - 44560, -76236, -647466, -93952, -5713917, 531502, 8153996, -2785823, -1705102, 3574487, - -2355253, 6888054, 2362769, -3284576, 1365800, -77309, 500901, 1029718, 2110977, 3074123, - 6784975, -236223, 1129040, 2563559, 1015223, -4500052, -1925219, 1427003, 1602023, 755377, - 3122978, 54224, 674310, 3030100, -674847, -1751810, 381178, -1336272, 251256, -1525787, - -1455457, 727460, -77846, 1475321, 1300838, -656056, - }, - { - 5630166, -95685968, -77680392, 71777496, -311385, -8258149, -14732812, 6178311, 6627135, -1569811, - 658204, -5616207, 1562831, 1768990, 11697343, 6031208, 1445257, -7712688, 11219528, -15909633, - -14496, 6737193, -4626754, 3201361, 7283191, -837519, 3627637, -4278861, 3859565, 10496363, - 2345589, 2172717, -4531191, -1198296, -2835215, -1007170, 5805722, 2943126, -4485020, 5206037, - 485868, 6812892, -314606, -3408594, 2324651, -8997956, -1017370, 1175747, -4174708, 5519033, - -4452808, -206695, 4203699, -5969468, -953483, -2375117, 2794950, 3177739, -2566243, 393526, - -2927020, 656593, -1925219, 1499481, -1490891, 328028, 2423972, -1507534, 1799591, 3942243, - -723702, -2417530, -2027225, -1627256, 730144, 592169, 1237488, 540629, -8590, -3118146, - -1203665, -1481227, 183073, -111669, 597000, -1029718, -1266479, 996969, 2209224, -1762010, - -1518271, -761820, -855772, -956167, 925565, 105764, - }, - { - 336618, 10593000, -56006912, 52958556, 10283762, -9141838, 448824, 1947231, 16557099, 7068443, - -2212445, 3525631, 3864934, 1600949, 704375, -6005975, 1256815, -8791261, 1609002, 5747203, - -10000831, -7915088, -4707821, 4976794, 678068, 1927367, -17828946, 5015985, -1075352, -9535901, - -3770981, 2958159, 5776731, 5077188, -6386080, -4508642, 1799054, -995359, 5159330, -1944547, - -681289, 1436667, 1178969, 2080375, -2271501, 5454072, -2717104, 145492, 6579890, 4000225, - 1012002, -6769406, -827318, -1821066, -1433445, 345745, 1991791, 1675574, -1269163, -3214783, - 1049583, 2409477, 624918, 2455111, -2843805, -1217086, 305480, 4262755, 1010391, 533113, - 1233193, -1837709, -186294, -261456, -3317325, -333397, -347355, 981400, 1309428, 272194, - 1438814, 3198677, 1427540, -1636919, -797790, 163209, -507880, -1232656, 391916, -352187, - -2337536, 154619, 312996, 2597382, -1054951, -1914482, - }, - { - -803159, 22520662, -6762426, 3120294, 5821828, -4398047, -2863670, -1412507, 4361003, 10607495, - -11466489, 4205310, 4266513, 4044249, -6601365, 1724966, -4417911, -2771328, -8264054, 372052, - -5450851, 5379447, 16248398, 16438450, -5944235, -4000225, 6168110, 2060511, -5257040, 1139240, - -3389803, 4101157, 8509404, -5546951, 3404299, 1455994, 4057670, 6534256, -3141769, -5005785, - 5037997, 2716030, 1917166, 4591320, -12731894, 975494, -806380, 2376191, -4983236, 5148055, - -5238250, -7421167, 3133179, 2529736, -1324997, 3745212, -963683, 2813741, -2961917, 5085242, - 1351841, 1505386, -3137474, -170188, 1424319, -2358474, 5195300, -235686, 1439351, 1393180, - -1594507, -1989644, 4560182, 806380, 364535, -49929, 1111860, -222265, -666257, 947577, - -457951, 1384590, 447750, 16106, 819265, 923955, -1653562, 2932389, 862752, 1401233, - -219043, 45097, 1262184, 855772, 1737314, -1089311, - }, - { - -385473, -176216064, 13844827, 27766964, 4578972, 3609383, -11180337, 4177930, -9029095, -27807228, - 13125420, -7774428, 7097971, -372052, -12459163, -1090385, 12474733, -8871792, 14133127, 3794604, - 1110786, 2239289, -15861314, -2422899, -908922, 3815005, 7634841, -3932043, -4057670, 5323075, - -3085934, -2531883, 410706, -3479997, -1540820, 3795677, 3012920, 1920387, -1978906, -971200, - -4316442, -12830678, -10648835, 897111, -3046743, 3978214, 14468671, -1576253, -4023848, 3189550, - -2825015, 10972031, 6398965, 126702, 1607392, -1382980, -5058935, -8486319, -667867, 50466, - -1890323, 7860327, 2123325, -3438658, -1461363, -54224, -682900, -1893544, 1244467, -310848, - 459025, -1247688, -1806571, -73014, 1315871, -32212, 1463510, 5046050, -1560684, 2288681, - 2213519, 1950989, 1482301, -483721, 1133335, 352187, -1505923, -869194, -1811939, -1927904, - -1071594, 503048, -1488743, -1705639, -165356, 1378685, - }, - { - 1111323, 54024248, 34416108, -16654273, 6667937, -7014219, -5723044, 1159104, 4083440, 1891396, - -11433740, -2220498, -294742, -12768938, 2069637, 6112276, -7465727, 118112, 2206003, -15590194, - -13213467, 69256, -1112397, 20812338, -21613350, 5235029, -2983929, 7677791, -4989679, -8834211, - -788663, 2586644, -17373142, -1429687, -3674882, 346819, -2464238, 735513, 383326, 9367861, - -4701379, 3268470, 492848, 3673808, 8675834, -1293859, -2796024, 5309654, 3148748, 1447941, - -1122597, -4584341, -1791538, 4655208, 2426657, 4020626, -6869800, -8038568, -6693170, 1291711, - -1655173, 1001264, 4751308, -227096, 3743064, 2881923, 1781338, -3107409, -1319629, 792421, - 9545565, -51540, 84289, -417149, 545998, 732292, -215822, 9664, 3783866, 2210298, - -936303, 495532, 2167885, -1548336, -465467, -381178, 2336999, 446140, -1378148, -293668, - -1520418, 464393, -3008088, -70867, 1722819, -671089, - }, - { - -3237332, -190296576, 18593450, 28940026, -19192062, 1638530, 4634807, -8120710, 6613713, -8473434, - 14755897, 4121021, -1739999, 1142998, -1711545, -10888816, 10240276, -4949950, 1971390, 1096827, - -15673946, -427349, -9185324, 2061584, 3467112, -7660611, -471373, -8686034, 864899, 4945118, - -5937256, -590558, 4169876, 4715337, 5327907, 4772246, 1819992, -3007551, 7028714, 3431142, - 5104569, -3448322, 7999377, 3630858, -2258079, -4115653, -8226473, 24159, 7171522, -1668595, - -308701, 4291746, 6692096, 5185100, 7554848, 3396246, 3028489, 16106, 4454418, 1820529, - 2724083, -1572495, 4902169, 1648194, -6834367, -83752, 2622615, 122943, -39728, 55835, - -632434, -5151277, -1671816, -250182, 812286, -369904, -1468342, -2578054, -515396, 2233920, - 2406256, 1181116, 200790, 26307, -497142, -403727, 2237678, -643708, -1407139, 1073742, - -1260036, 4295, -1809255, -1957968, -1735167, 1254131, - }, - { - 2084670, 40535364, 55119464, -13316546, 5469104, 1269163, -2270964, -553514, 3891777, -2393371, - 1277216, -11481521, 4065724, -11195906, -22644142, 8650601, -32423782, -15829639, 4663261, 15688442, - -530965, 1724429, 4172561, -13501767, 7699266, 5320928, 8842264, -6453189, 6973953, 3115462, - -5442798, -11606612, -8853538, -2037962, -3692598, 4878546, 6444062, 10634339, -767189, -2748779, - -1807108, 3235721, -869731, -4114042, 2915209, 1075352, -339839, -133144, 5231807, -2058363, - 5833103, 1120987, -828929, 3475702, 674310, -3329137, 2937758, 1769527, -57445, -5104569, - 2171643, 66035, -1977296, 2285996, -1899986, -746251, 3282429, 4128537, 2328409, 163746, - 4939213, -232465, -2306398, -846645, 3110093, 2435247, -1741609, -1622961, 2458869, -490700, - -2228551, 717796, 872952, -503048, -115964, 274878, -1214402, -130997, -1991791, 1117228, - -157840, 691490, -1515050, 828929, -667331, -42413, - }, - { - -3593814, -177594752, 7354595, 31607738, -14659260, -4070555, 8518531, -1302986, 13085692, -96100, - -1469953, -14723685, 9043591, -463856, -1769527, -5677947, 9957882, -7373922, -719944, -15555835, - -2724083, -4927401, -6817187, 459562, 6625524, -6868727, -6496675, 5956583, 3243237, 4859756, - 2294050, 659278, 2537252, 1860258, -2474438, -1937567, -151398, 4659503, -8928700, -15081778, - -2156611, 2716030, 1373853, 907312, -4970888, -7057705, 2319819, 3057480, -5397700, 3724811, - 4749160, 709743, -5152350, -4201552, 4798016, 1100585, -124554, -1124745, -252329, -4219806, - -4546760, 573378, -3142842, 319438, 800475, 1946157, 2717641, -1097364, 849867, 2097018, - -3446711, 267362, -834297, 5230734, -3151969, -963683, -1327682, 295816, 36507, -372588, - -2260227, -3542811, -1852742, 288300, -1784022, -2169495, 1920924, -102542, 1433445, -184684, - -1323924, 250182, 3758, 2076617, -571231, -1647120, - }, - { - 388695, -6835978, -2883534, 8643085, -1477469, 754304, 21290152, -14504641, -537945, 2413772, - 9173513, -3044595, -8417599, 11725798, -3650185, 7761006, 14231911, 11056320, 6665789, -8223789, - 12211129, 3745212, 11484743, 994822, -2390686, -2884608, -6830609, -6543383, 217970, -10462003, - -2184528, -2852932, -16234976, 3535295, -16062104, 3053185, 10365904, -789200, -9737765, 10708427, - 1556926, 1325534, -2617246, 11225971, -8629126, 2785823, -11100343, -5301064, -2604361, -12925167, - 5800890, -6755984, -11341935, 7653632, 2843805, -7129109, -2976949, -3902515, 5323075, -1239635, - 3430605, 916439, -2375117, -9845139, -6665789, 3058017, 1573032, 484258, 5148055, -5814312, - -3610994, -1883880, 965294, 5322002, -2973728, -1625108, -1532230, -1243393, -976031, -1136556, - -1254667, 131533, -96637, 1597728, -1421634, -1047435, -3032247, 628676, 1562831, -977105, - -74625, 363462, 2724620, 366146, 1490354, 745714, - }, - { - 2899103, -130011344, 4263292, 397284, 10437307, 32434520, 22788560, -24237574, 1045825, 21194052, - 5437966, -6129455, 8367133, 7656316, -13720810, 12620225, 11023034, 23104776, 14329622, -824097, - 942745, -3855270, 9284109, -5477694, -681289, 16660178, 3530463, 3310346, 5867999, -13721347, - 3668976, 570157, -6668474, -3614752, -13848585, 2867428, 2042794, 5413270, -1221918, 584116, - 7262253, -1360431, 5936182, -5782100, -12018392, -2392297, -286689, -96100, 9280887, -10492605, - -1516124, 4960687, 4303557, 1188632, -5317170, 1345399, -4164508, -226560, 575526, -8567386, - 5528697, 3667902, 1234266, -4605816, 1433982, 3356517, -7393250, 1612760, -1459752, -3833795, - 4252018, -3327526, -1904281, 4295, -2137283, 2613488, 186831, 1130113, -93952, 864362, - 801011, 758599, -2240362, 383326, 456340, 1136019, 1998770, 622233, 3609920, -555125, - -852551, -560493, -1115081, 1209033, -981937, 413927, - }, - { - -273267, 24588688, -17058536, 14903537, 6541235, -10857677, -3721589, -10392747, -3422015, -6706055, - 9240085, -7969849, 10973641, 25065966, -13582297, -2654827, -18658948, 12423730, 1693291, 2378338, - 6494528, 11288785, 25364466, 2762201, -11065983, -9432822, -4196720, 14616311, 7982197, -6450504, - -3584687, -16396575, -17305496, -5197984, 9043054, -3917547, 7953743, 1754494, 2683818, -3179350, - -5743445, 2904472, 6183679, 11751031, 5498095, -5377299, -718870, -1341640, -2282775, -3680250, - -3758097, 4388920, -5060009, 6781754, -3932043, 3369402, 2774549, -5637145, 3002719, -5970005, - 1464584, 5425081, -5382131, -5396627, -3300146, -1630477, 2115808, 2586107, 1607928, 2413235, - -244813, 3992172, -2009508, 1513976, 1262720, -345208, 1854889, -2176475, 885837, 3433290, - -4149475, -67109, 2117956, 549756, 289373, 1853815, -2471217, -1780801, -2338073, 1100049, - 1531693, 2248416, -339302, 1229434, -2090575, -1292248, - }, - { - -18018998, -55444268, 1780801, -4210142, 14332306, 37106368, -6190659, 9109626, -1481764, -2969970, - 654983, 17292612, -10095858, -5542656, -16081968, -6213207, -16641925, 1509681, 376883, 3719442, - 10778757, 7319698, -5422933, -5787469, -8803072, -569083, -3628174, -4539244, -2885681, 216359, - 6910603, -20651276, -12793634, -3067681, -5316096, 11433740, 6671695, 3861713, 1191853, 3892851, - 5463736, -9273908, -2652142, -6829535, 609885, -6005975, 5982890, 98784, 622233, 8391829, - -2997887, 1347546, -4355097, 4517769, -7104950, 309775, -2005750, 1346472, -3372086, -2571612, - -515396, 3111704, 3729105, 1192927, 126165, 2424509, -6000606, -4466766, -4980015, 4212826, - 386010, 3706557, 1494649, -825707, 2842195, -1199907, 1809792, 115427, -31139, 2321967, - -892279, 708133, 989990, 439160, 2531883, 3326989, -3771518, -674310, 119722, -1656247, - -748935, -1381369, 494458, 838592, -404264, 1418413, - }, - { - 1600412, -32166620, -12130598, 4434017, -4866735, -4128537, 18082350, -6502044, 6463926, 15548318, - -4890894, -5592048, -7899519, -16248398, 31989990, 13929116, -25713432, -1234266, -345745, 3824132, - -6531572, 10713259, 10854993, 14905147, 3543885, 7963943, -7298223, 11702175, 14493904, -1387811, - -20185810, -4101694, -2641942, -433792, 3473018, -633508, 12038793, 2995203, -6385006, 2836826, - 10296110, 6935299, 5112085, 5187784, 2619393, -8699993, -663036, 5247913, 4009889, 9201431, - 8453569, 1221381, 763430, 6467684, -3819837, 187905, 3722126, -581431, 3032784, 2616172, - -1305670, -1414655, 1397475, -1911797, 1882806, -522375, 6310381, -3046206, 92342, 612570, - -2364916, -1289564, 854162, 335007, -5418638, 2285996, 488016, 1789928, -1240709, -2797098, - 2354179, 5748814, -24159, 355945, 1668058, 256087, -1552094, -2298881, -809064, 2687039, - -683974, 2026151, 1874216, 655519, 474057, 1175747, - }, - { - -14275398, -72769096, 8062728, -3331821, 14369887, 44408352, 5703180, -8891119, -24415278, -1595044, - 4536023, 2641942, 29028074, 3379066, 39849780, 16346109, -10277320, 5446556, 25934086, 1324997, - -8442295, -6917582, 4262218, -11175505, 8982387, -209380, 5404143, -15182173, -2011118, -666257, - 7186017, 8676371, -11583527, -14059039, -13606456, -2752000, -2677375, -12838194, -2705830, -803696, - 1567126, 4224637, 6099391, -5185636, 11900818, -4678293, -7665443, -5774047, 1483911, -3052648, - -412854, 2413772, 2275259, -1658931, -4756677, -1983738, 1411971, 102542, 3680787, -1911797, - -4544076, 2930778, -6706592, 1177358, -3267396, -2149094, 1115081, 1408749, 510027, 1155346, - -687195, 5842230, -3730716, -404801, 5313949, 2007360, 2327872, -2323041, -344671, -2015950, - 2663954, -317828, -1898376, -2048163, 1369021, 1680943, 470299, 1408749, 2628520, -1345399, - 876173, -1508607, 376347, 1345399, 325881, 285615, - }, - }, - { - { - -1527398, 52698176, -22193170, -22399866, -15205795, 1461363, 3707094, -772020, 208843, -2526515, - 8063264, -4469451, 768799, 4362076, -5555004, 905164, -1810329, -10914049, 7479149, 4619238, - 8782134, 6646999, 55298, 4881231, 9058086, -16809428, -3018825, -3957812, 4129611, -18316424, - -1465121, -6149320, -6919729, 3755949, 963683, 3060164, 3051038, -2750390, 4839892, -4594542, - -4699231, 8889509, 2992519, 716723, -3022046, 1372242, 8112120, 2001455, -7399692, 8104604, - 3867081, -876710, -711354, -1641751, -8005282, -2557653, 4753455, -1381906, 1835562, 1811403, - -5893769, 951872, -2322504, -3790309, -529892, -4081830, -1163936, 1432909, 2057826, -23085, - 811212, -1853815, 921807, 1526861, 925029, -2600066, -754304, 862752, -166430, -927713, - -183610, -1632088, -1249299, 894427, 3758, 121333, 1484985, 1071058, 2067490, 413927, - 539555, 985695, -747861, 879395, 1095217, 677531, - }, - { - -5530308, -17485886, 8638790, 69162392, 476205, -5715528, -9089225, 3867081, -1654636, -594853, - 86973, -2231236, 1651952, -7636989, 6245956, 7187091, -5796595, -5444945, 22434762, -10364293, - 362388, 8742406, 3332895, 4896800, 2491618, -182536, 11855183, 5643587, -1432372, -1722819, - -2621004, 2221572, -2039036, 3663607, 561030, -1502165, 3467649, 5381057, -2538863, 1614371, - 736050, 5804649, 1132798, -789200, 7251516, -6369437, 776852, 2081985, -2765422, 3282966, - -4032974, -4017405, -1176821, -5488432, 3488587, -467615, 515396, 1161789, -3448859, -1799591, - -4838281, -1280974, -2680597, 4844723, 5167383, 2895345, 3929358, 1908576, 47245, 1415729, - 293132, -615254, -1684701, -3298535, -942745, -375273, 42413, -1193464, 901406, 359167, - 570694, -635118, 1095217, -1289027, -119185, 972273, -661962, 112206, 756451, -1089311, - 48318, 539018, 884226, -457414, 105764, -1438814, - }, - { - 1301912, 82709256, -13147969, 5898601, -22315040, -1650341, 3963181, -6402723, 6171868, 2262911, - -1944010, 888521, 176631, -5514201, -382789, 3112778, 4617627, -9171903, -5108864, 2641942, - -1646046, 2858838, -3834869, 411780, 2007897, 9040369, -6550362, 8945880, -3724274, -12636331, - -3980361, -3495567, 73551, 930397, -1227824, -91268, 3625489, 346819, 5113696, -4147328, - -2575370, 4046933, 4896800, -540629, -7264401, 3890704, 1110786, 2004139, 68183, 1180579, - 7242389, -4389994, -2015950, -526670, -785442, -153545, -448824, 168577, 2899103, 576063, - -2162516, 294205, 506806, 4239133, -645856, 1708860, -1476932, 1440962, -1882269, -2187212, - 183610, -2459943, 940061, 1005022, -4079682, -274878, -682363, -1278827, 1780801, 2331094, - 1477469, 2396592, 549219, -2193655, 257698, 1600412, 449898, -998043, 119185, 533113, - -860604, 639950, -301185, 1716913, -812823, -535260, - }, - { - 695785, 49483392, 8672613, -6139119, 419296, -350040, 369904, -464393, 2513630, 12277164, - -9881109, -2021856, -1815161, -4785131, -15630460, 382252, -11687680, -5691906, -3773129, -2806224, - -5459441, 1160178, 6862821, 12829604, -1389422, 2245731, 2028298, 3337727, 287763, -2828773, - -3600256, 6354941, 7882339, -5493263, 1030255, -12316892, -7381975, 4341675, -1526324, -4817880, - 6032282, -2283312, -8259222, 2937221, -11268384, 4676683, -790274, -1656247, -3586835, 2246805, - -6417755, -7380902, 2386928, 5300527, -4255239, 1786170, 1728188, 4220879, -2819646, 587337, - -2395518, -590558, -1007707, 1905892, 3402688, -2862596, 4408247, -324270, -1174674, 728534, - -847182, -2149631, 2371359, -1134408, 793495, 1544578, -1076426, -4403415, -2668785, -63888, - -2127083, -872952, -484794, 220117, -102005, 586263, -629750, 3010772, -1100585, -183073, - -469762, -979253, -1876364, -2155537, 336618, -1375463, - }, - { - 2222109, -186639952, 6117107, 37877852, 1799054, 2062658, -10998874, 8242042, 2318209, -17170206, - 20549272, -14178224, -470299, 215285, -1586990, -3606699, 2602213, -12360916, 10521596, -585726, - -7507066, -2914672, -1046898, 6986838, -212601, 166430, 5180805, 4958540, 4683662, 8925479, - -2551748, 1843615, 2094333, 2774012, 1314797, 3293703, 1720671, 1413044, -1122597, 1407139, - 4239133, -1479616, -7290707, -279710, 289910, 4136591, 8149164, -8412230, -7507603, 3155727, - -7530152, 4012036, 4549444, -364535, -1052267, 119185, 339302, -431107, 4310537, 1502702, - -3102577, 1815161, -4542465, -3254512, 3096135, 2856153, -1855426, -1122060, 637803, -843424, - 1537598, 360777, 1392643, 410169, 1150514, -220117, -2036888, 928787, -2423435, 1984275, - -107374, 796180, 290447, -3096135, 57982, -1060857, -405338, 492311, -530428, 190589, - -44560, 2889976, 28991, -710817, 34360, 377957, - }, - { - -2834679, -17379586, -32096290, -14485314, 10947335, -1881733, -4675072, 2805151, 5490579, 3156801, - -3484829, 8249559, 6739341, 860604, 13782013, 2753611, -10653666, 1843615, -1105417, 1012539, - 3181497, 1764695, 2635499, 16863116, -14150843, 21749178, -6104759, 2745021, 2196339, 4354023, - 13282186, 8677981, -8537321, 5914707, -2309082, 1231582, -81604, -6409702, -3344706, 6681359, - -3457449, 795106, -370441, 4340065, 2876018, -3445101, -1451162, 2640868, -192200, 3310346, - 3081639, 1214402, 3992172, 2800856, -1268089, 1382980, -4038343, -999117, -3438658, 1042603, - 2189897, -59593, 526134, -887448, 1906429, 162672, 846109, -1764158, 3244311, 188979, - 3652870, -3996467, -3626563, -683437, 965294, 361314, 1483911, -216896, 2359548, 284542, - -2099702, 739808, 1174674, -639413, -137976, -1999844, 1392643, 35433, -857383, -26307, - -682363, -4295, -3262028, -275415, 1117765, -149250, - }, - { - 6238440, -191446016, 7990250, 54451596, -1531156, -3234647, 227096, -10946798, 14160507, -5280663, - 2378875, -1913945, 2379412, 1535451, -4409321, -2091649, 16335371, -10456098, -6252399, 10972031, - 872952, 1149978, -9506373, 11201275, 9343701, -3276523, 8611409, 244813, 3946538, 4109747, - -3528853, -2317135, 2068027, 411780, 3723737, -813896, -1118302, -5299990, 1265942, -230854, - 2308008, -3192771, 6090264, 2074469, -2042794, 1214939, -3960497, 205085, 4992900, 191663, - -1480153, -2945274, 5615133, 2751464, 2738579, -2019172, -4064650, -8123931, -321586, -314069, - 1000191, -5870147, -337155, 4119411, -3850975, -1674500, 671089, -815507, -578210, 271120, - 861678, -324807, -696322, -2294586, 1693828, 1887638, 649077, 760209, -863288, -1398012, - -277562, 97711, -1421097, 1134945, 1520955, 77846, 1463510, 456340, -753230, 59056, - -490700, 1205812, 830539, 73014, -1328219, 2080912, - }, - { - -2734821, -44521632, -28163712, -8975408, 9496710, 4300336, -1694902, 278636, 2275259, -288837, - 7126962, -1938641, 1847373, -2288144, 4277788, 14339822, -28190018, -9751186, 13686987, 16671452, - 431644, 5774047, 2020782, -14693083, 7291244, -12172474, 650688, -3680250, 8543764, -537945, - -9240085, 1571421, -6324876, -2570001, -1394254, -7397008, -5010616, 8666707, -5237713, -988379, - 2717104, -221728, -5091147, -6080063, 1761474, -1353989, -2373506, 2845416, 9285719, -4388383, - 5245766, -721555, -6621229, 2473901, 3459596, -1803886, 3950296, 1852205, 186831, -5781563, - 401043, 1349694, -1771674, 119722, 133144, 1162862, -102542, 372052, -905164, -3118146, - 247497, 1053878, 2531346, -453119, 2677375, 3522410, -326418, -2299955, 1697586, 643708, - -683974, -172872, 894427, -1052267, 743029, 1603633, -1858647, 413391, -981400, 898722, - 170188, 1090922, -1112933, 12885, -1242319, 111132, - }, - { - 6260452, -174626928, -445603, 55148992, 220117, -11848204, -4032974, -8598525, 6080063, -7567733, - -6129455, -12533788, 10126996, -2849711, -7167764, -15605764, 6171331, 506806, -1569811, -10741713, - 3971771, 963146, 4129074, -2725157, -678605, -1285269, -4958003, 8093866, -23085, -1316944, - 1772211, 5122822, 6842420, 3229279, -274341, -798864, -1688996, 8139500, -2451890, -6884296, - 3488587, 4296578, -557809, -1955821, -4641249, -9268539, -3292093, 8486855, 528818, 2798708, - 1755568, -1688996, -635118, 322659, 3526705, 2098629, -595927, -1024887, -1219234, -950798, - -1152125, -4403952, -6274947, 1702418, 1924145, 105764, -1437740, -3662533, -2477123, -2196339, - -3690451, 4076461, -1371705, 3010772, -2299418, 940598, 1210107, 1005022, -833224, 89121, - 701690, 864362, 2610803, 2323041, -525597, -1363115, 1865626, -277025, 61740, -2017024, - -501974, 649077, -765041, 1442035, -111669, -287226, - }, - { - 404264, 50472844, 27436252, -13194140, -14865956, -7306276, 23393614, -2248952, -2737505, -4820564, - 9580998, 4804458, -7299297, 6272800, -7254737, -2710124, 14936823, 8328479, -4701916, -17541720, - 9923522, -25233, 7937100, -6031745, -1852205, -4445291, -6644852, 1493575, 10467372, -5600101, - -4015795, -1440962, -11977590, 6749541, -18832894, -4181151, 8604430, 2107755, -9033390, -222265, - -1874753, 3994857, -4008815, 13961865, -15577310, -1217086, -5717675, 1041530, 4951024, -4975720, - 5808944, -4905927, -7441031, 7503845, 6787659, 2985002, 1391569, 954557, 7466264, 2750390, - 7651484, -222265, -362388, -1890323, -983548, 4390531, -118112, 344134, 4947266, -3371549, - -1179505, -2279017, 1331440, 5559835, -3387656, -1413044, -211527, 2688113, 2825015, 1403381, - 1508070, -598611, -2525441, 779000, -2531883, -1052804, -1757179, 1338956, 1349694, -926102, - 518080, 569620, 1964411, -489089, 586263, -71941, - }, - { - -2816962, -137203808, -9673340, -3029563, 9947144, 2661806, -5363878, -4179003, 14921253, 9758703, - -4997732, -1234266, 12623446, 18671834, 7571491, 17905182, 1418413, 8733279, 11062225, 9005473, - 2730526, -4670777, 3409130, -8443906, -286689, 9672803, -5998459, -4825933, 3098282, -16583942, - -402653, 2760053, -2870649, -1833951, -13702019, 6378027, 2875481, -2359548, 971736, -1405528, - 1707250, 4677220, 7392176, -5123896, -8990440, -2854006, -960462, -8137890, 3034931, -6444599, - 2856153, 173946, -6712497, -1803886, 1035087, 4080219, -2881386, 840203, 3930969, -6453189, - 5763309, 588411, 2996814, -3229279, -2181844, 3656091, -1847910, 3917547, -123480, -1405528, - 3792993, -4726612, -3460670, -4497368, -3686693, 1832340, -1266479, 2658048, -1097901, 96637, - 734976, -2091112, -2698313, 477278, -497142, -493384, -231391, 632434, 2934000, -985695, - -1574106, 249645, -799401, -607738, -2779918, -769873, - }, - { - 51540, 58884540, -1977296, 1416802, 678068, -2942053, 4215511, -10733660, -2086280, -5696201, - 7677254, -9474161, 6056441, 13829258, -7868917, 27427662, -4558034, 3564286, -4826470, 3759170, - 4019016, 1314797, 13401372, -5493263, -6436009, -19327, 1632088, 1013075, -1302449, -9440338, - 1741609, 2559264, 4682051, 2099165, -702227, -5467494, 13002477, -2328946, -2024003, 2527588, - -1030255, -1063004, -4192425, 5578089, -24696, -5646809, 3090229, -943819, 1648194, -5612449, - -8909373, 2406256, -5850283, 4806606, -5756867, 3937948, 5725192, -1343788, 6268505, -3149822, - 2647847, 3799972, -4023848, -2172717, 1519345, -766115, -1662152, -2128693, 526134, 1247151, - -4504347, 914828, -2544231, 1281511, 1577864, -1098975, 125091, -1371168, 867047, 3075197, - -2473364, -1384053, -565325, 637266, 1014149, 2157684, -659814, -57982, -641024, 1407676, - 163209, 1869921, -657667, 1838783, -368293, -148713, - }, - { - 18800682, -44586056, -34293704, -18275086, 7318088, 10382547, -36784248, -1597191, -5382668, 3874597, - -5441187, 4665945, 264141, 19406810, 11696807, -2218351, -10852845, -1200980, -2877628, 942208, - 2034204, 4521527, -911607, -71404, -7601019, -352724, -8174934, -2655364, -1844689, -8474507, - 1729798, -13807246, -1109175, -719407, -7332583, 4283693, 716723, -266288, -2350421, 4950487, - 6658273, -5370320, 1408212, 307627, 736587, -5813238, 5983427, 2729452, -11274, 4192962, - 272730, 3112778, -1109712, 4966593, -9022653, 272194, -5633924, 1628866, 2268280, -2125472, - -2944737, 1567126, 4669167, 5184563, -467078, 1044214, -5924371, -4031901, -5996311, 1724966, - 515933, 5716602, 343597, 392453, 4963372, 556735, 1639067, -3960497, -4451734, -1114007, - -1275068, 418222, -923418, -1449015, -235686, 1683090, -2605435, 1464584, 2317135, 719407, - -1086627, -1853815, -1288490, -620086, -1348620, 335544, - }, - { - -884763, 14228153, 13981192, 694711, -2917894, 3073049, 17096654, -6529961, 1698660, 9405442, - 1671279, -2749316, -11248519, -28245852, 31757526, 26216480, -4725001, 11800423, 8241506, 5906117, - -23258858, 1978369, 6714645, 2591476, 5408438, 964220, -13953812, 9834401, 12847321, 9423158, - -9826348, -4428648, 1679332, 1204202, -4444755, -6033356, 11143830, 645319, -3604015, -2866354, - 314606, 792421, -417686, -2318746, 2895882, -3010772, -1817845, -2390686, -2167885, 2023467, - 2752537, -1868848, -338766, 8308614, -570694, 835908, 1826972, -976031, -362925, -3762928, - -4597226, -4612795, -3490198, -3026341, 562104, -2419677, 3260417, -3077344, 1085553, 1696512, - 520765, -1641751, -795106, 2429341, -3558917, 842887, 616328, 3594351, 1516124, -944356, - -308164, 3048890, 953483, 100395, 754304, 3044058, 828392, -2798171, -699543, 2152316, - -1963337, 828392, -702764, -1277753, -1242856, 1146219, - }, - { - 14837501, -66016332, -11934104, -9308268, -4827543, 3536369, -18589156, 5839008, -6877317, 4231080, - -4889284, -8969502, 8180302, 588411, 33723548, -611496, -535797, 9695889, 10933913, 1907502, - 1990181, -8114804, 6049999, 2266669, 12737799, -2655364, 7419019, -4721780, 7806640, -2719251, - -9361955, -716186, -2188823, 3502546, 946503, -966368, 993211, -8677445, -7822209, -4601521, - 1666447, 2110977, 8016020, -2363843, 10268193, -1176284, 4635344, -1433445, 1475858, -1711545, - -1678795, 1429687, 1599875, -2238752, -1142998, 530965, -973884, -7136625, -944356, 5140539, - -993748, 3442953, -3821984, 421444, 682363, -650688, -3649112, -23085, 1579474, 2255932, - -1291711, 4547834, -3149822, -3343095, 854699, 720481, 1709397, -2493766, 2418604, 609885, - 166967, -1410897, -1992328, -1226750, 1298691, 41339, 776852, 970663, 1151051, -2232846, - 940598, 809601, 3069828, 2399813, 215285, -938987, - }, - }, - { - { - 2229088, -15325517, 34388192, -31453120, -25071872, 5809480, 536334, 4423280, 1504312, -7795903, - 9941776, -2895345, -2981244, 5945309, -11225434, 1198833, 6073621, -4217121, 8955544, 5835250, - 11199127, -9896678, 6941204, 15214385, 11756399, -27055610, -1401233, -2091649, 7284265, -6249715, - -15392089, -4828617, -5803575, -47782, 6178311, 3420405, -2989834, 3221226, -1743757, -637266, - 2298344, 957778, 11854647, -8759049, 1546725, 4949413, -96100, 1287953, 679679, 5322538, - 280784, 1367947, 892816, -6619082, 209917, -2177549, -3054259, 2261837, 3655017, -3082176, - -30065, -3762391, -710280, -3129421, -3319473, -329102, -2024003, 3140695, -934692, -526134, - -2130304, 925565, 893890, -227633, -176631, 1404991, -689342, -278099, -1636919, -73014, - -1233193, 192200, -1290638, -45634, -778463, 941672, -40802, 2386391, 107374, 1417876, - 2037962, 833761, -492848, -208306, 566936, 161061, - }, - { - 6598681, 38855496, -10582263, -84826, 37965900, -4428648, 912144, -8488466, -6535330, 7901129, - -7719667, 3835406, -1365800, -533113, -3544959, 3925600, -8135205, 3882651, 9768366, -4094715, - 552977, 8669928, 6955163, 5629092, -8074539, 1906966, 12050068, 12341589, -2518462, -6359236, - -4201015, 3904662, 517007, -59056, 4143570, 2043868, 111132, 5602785, 573378, -3011309, - 5570036, -4074313, 7031935, -2734284, 4935455, -5508833, 745177, 3839164, 1253057, -4900021, - 3432753, -8207146, -3575024, -3308199, 6190659, -1148367, -1770063, 3391414, -1735167, -5120138, - 1203665, -2993592, -2359548, 5335423, 4385699, 64425, 2302639, 4664872, 1025960, -1131187, - 1600949, -1081795, -1581622, -1222455, -2062121, -1139240, 684510, -971200, -726923, 5310190, - -1013075, -1563905, 817118, -1881733, 1735167, 481036, -1116155, 857920, -1306207, -1283122, - 1417876, 1078574, 1660005, -628139, -351650, -2865817, - }, - { - -1131187, 102627704, -17991082, -38919384, 16342887, 3126736, 147640, -4822712, -1687385, -979789, - 4749697, -8221105, 2005213, -7973070, -1265942, 10797548, -238371, 194884, -13355738, -2420751, - 1898376, 8460549, -6864969, -4329327, 15125264, -3354906, 527744, 1503239, 3292093, -10436234, - -5878200, -3056406, 5441724, -8218420, -1308891, 2778844, 3490198, 5800354, 1948305, -6037651, - 1694365, 1911797, 8171712, -4709969, -7979513, 5000416, 2646774, 792958, -3933116, 3283503, - 6708739, -4370129, -2052994, 2847563, -4540854, -924492, -4049617, 3951907, 3353833, 3046206, - -3453154, 639950, -594853, 5998459, -1491964, 1066763, 834297, -3022583, -2192044, -1909113, - -967441, -2369211, 2137820, 1068910, -3385508, 389768, -649077, 858993, -594316, 834834, - 2378338, 851477, -548145, -2713883, 1216550, 1952600, -378494, -632971, 310848, 411243, - 737124, -157840, -449361, 222265, -312996, 155156, - }, - { - 361851, 45829448, 13651554, -10020159, -2656974, 2175401, 629750, -1228361, -2440078, 5312875, - 9734543, -11996381, 1504849, -12286291, -14108431, -2617246, -8821326, -10051297, -10104984, 4090956, - -10602664, 295816, 4038343, 6499896, 6080063, 8581882, -4094178, 1228361, 5411122, -9692667, - 4647155, 5844377, 4290136, -973884, 78383, -14175540, -9271761, 724239, 1787243, 2252174, - -2795487, 425202, -12300786, 2496987, -8723079, 1002338, 3156801, -8530342, 7882876, 1080184, - -13589277, -2922188, 3172907, 5008469, -7560753, 747324, 6813966, -2340757, 4235375, -883690, - -3127273, -3802120, 1800665, 1524713, 2360622, -1517197, 1814087, 1641751, -3264712, 1557999, - -264141, -479426, -84826, 425739, -2735357, 2856153, 299574, -5252745, -1296543, -2546916, - -1732482, -1552094, 315143, -253940, -1496796, 1287953, 537, 1656784, -842350, -698469, - -610422, -2684, -3034395, -2571075, 1244467, -1053341, - }, - { - -2675228, -154456144, -7058779, 39858372, 658204, 1263794, -5263483, 1557463, 4247186, -7979513, - 7237020, -3804267, -5636608, -323733, 3777424, 2101850, -1178969, -4552129, 3100967, -6403260, - -2042794, -11920682, 13139379, 2140504, -250719, -2095944, 1822677, 6083285, 7767985, 8473970, - 682900, 6633577, -4507032, 7401303, 108448, 2512556, 1105417, -1598265, 4385162, 675921, - -1657321, 4862977, -5569499, 325344, 156766, 1960653, -476741, -2003065, -4373888, 233002, - -2038499, -6496675, 4381404, -540629, 1107565, 2474975, -1688996, 2404645, 3002719, 2214593, - -998043, -1692217, -6576132, -974421, 2979634, 4468377, -4163434, 254477, 830539, -380641, - 2329483, 584652, 1640678, -2688650, 2698850, -91268, -4832, -3482145, -1843078, 711354, - -122407, 2286533, -578747, -3907347, 989990, -2204929, -299574, 1519882, -731755, 645856, - -621160, 4329864, 27380, -330712, 296890, -1241782, - }, - { - -94489, -36177584, -34224984, 4571456, -3150359, 899796, -2302103, 643708, 2096481, 3348464, - 362925, 3726958, 10874320, 6520297, 5504538, 13296145, -19940996, 2552284, -13632226, 7420630, - 2419677, 3297998, 5339181, 11999602, 3083250, 13047037, -6571300, -45634, 10168872, 6849936, - 7243463, 5944235, 3430605, -3114388, 3988414, -1532767, 3241627, -6855842, 2760590, -7293392, - 310311, 181999, 3779571, 2033667, 1873143, -5189931, 2313914, -3155190, 3036005, 3826816, - 2954938, 193274, 8267275, -2488397, 24159, -1664837, -1934883, -994822, 3218541, -2181307, - 2520609, -2025614, -769336, 449898, 2447058, 1303523, 384400, -1418413, 767725, 2864206, - -1826435, -398895, -4245039, 1104344, -761283, -397821, 897111, -587874, 2078227, 1846836, - -3319473, -409633, 2754148, -1296543, -233539, -872415, 381178, -151934, -1107565, -170188, - -155156, -614180, -1748052, -697932, 1552631, -752693, - }, - { - -7284802, -146537312, -4139812, 58178016, 308164, -8280697, -2028298, -3429532, 2379949, -1216013, - -10969883, 7464653, 1781875, 10224170, -10695542, -287226, 5668283, 162135, -15093052, 8626979, - 11384348, -4272419, -9119826, 19160922, 7575786, 3184718, 1701881, 4395899, 7580618, -4050691, - 81604, -5968931, 6078990, 757525, -994822, -1946157, 2021856, -1253057, -4184909, 300648, - -2940442, 6578816, -752156, 3163780, -2255395, -981400, -552977, -1110249, 1599875, 3732327, - -1246614, -6870337, 7025493, 879931, 2478733, -6768332, -2704756, -4041564, -3141769, -4268124, - -1262184, 529892, -1024350, 2208150, -1829656, -3753265, 2532420, -796180, -3189013, 3097745, - -893353, 3293703, -463856, -2260764, -1413044, 2423972, 1753957, 2369211, -1672353, -1374926, - -2006824, -83215, -2533494, 3031710, 1047972, 1163936, 202937, 1182727, -139586, -1775969, - 501974, 571231, 2165201, 515933, -1600949, 1149978, - }, - { - -1887638, -30037390, -66124244, 17649632, -3877819, 4572530, -2120640, 1207960, -1574642, 1365263, - 8817568, 6021008, -5559299, 4074313, 21811454, -11846057, -14584635, -6422587, 2661806, 9684078, - 7950522, 3410741, 3629784, -10385768, 5098663, -11750494, -4250944, 7514046, -919660, -5792301, - -7355669, 5324686, -3967476, -466004, -5365488, -8567386, -5466957, 3731790, -621697, 2678986, - 370441, -3782256, -1440425, -6427419, 2826625, -2626373, -965831, 2095944, 2950643, 2057289, - -725313, 4900558, -8929774, 2988760, 5926518, -17180, 76773, 296353, -3260417, -75162, - -3659849, 1034013, 731218, -833761, 1755568, 136902, 3190087, -1377074, -3106872, -2740726, - -281320, 458488, 2686502, 380641, 3227668, 1944010, -1255204, -2161979, 563178, -167504, - 2996814, -1421097, 563714, -635655, 1177895, 1118302, -2726767, 850404, 1377074, 84289, - 1368484, -989453, 762894, 52076, -2494839, -641561, - }, - { - -6706055, -143407344, 1773285, 58175868, -8348343, -8339216, -9223979, -569620, -4771172, -1418413, - -19058918, 3407520, 7243463, -1410360, -8462696, -6187438, -6215355, 1956358, -3156264, 2563022, - -7708930, 4908611, 5429376, -4969277, 372588, 2404645, -1335198, 161598, 3361349, -6402723, - 4292283, 9152575, -577673, 3241090, -893353, 4472135, -3449396, 7177427, -123480, 623844, - -1139777, 3351148, -13422, -2187749, -855235, -10056129, -1745367, 6801618, -177167, 5111548, - 215822, -2461553, 1013075, 4889821, -1980517, 2025614, -1595580, -1778117, -3389803, 1623498, - 1085553, -7087770, -2949032, 1620813, 1420560, 76236, -2012192, -3283503, -3464965, -3118683, - -360777, 4554813, 111132, -1196148, -1051730, -897648, 2204392, -35433, 371515, -1819992, - 2182380, 2644089, 3485366, -380105, 948114, 355945, 146029, 380105, -279710, -654446, - -1275605, 175020, 1009854, 479426, -1178969, 1554241, - }, - { - 543313, 77125264, 601295, -15147813, -11914239, 1551557, 15881178, 6123550, -7757248, -6866042, - -354335, 5092221, 13231184, -11928198, 2671470, 3147674, 3048890, -1153199, -230318, -11567421, - 6233608, 1620276, 9129490, -7854959, -1816771, -12591770, -1845762, 11397233, -720481, -3115462, - -2237141, -2597382, 5530844, -12351252, -4892505, -4400731, 1047972, 561030, 6874632, -12071542, - -636192, 7067369, -4963372, 4481799, -11230803, -1082869, -1046898, 1025960, 5177583, 2162516, - -4536023, -5673652, 248034, 6498823, 4473209, 5997922, -1054415, 3346853, 3873524, 6275484, - 2316598, 587337, 1054951, 603980, -337692, 3091303, -945967, 2579128, 1200980, -99321, - -22549, -1676111, -25770, 5101885, -2628520, -557272, -688805, 2167348, 4004520, 1642288, - 2851322, -1809792, -2108829, 932545, -2034741, -1229971, 193810, 1373853, -2138894, 565325, - -556735, 1632625, 1196148, -1351841, 1354525, -258772, - }, - { - 5128728, -93384936, -45937896, -1149441, -37044, 12323335, -23810762, -5628018, 14359149, -2238752, - 11249056, 1169305, 10098005, 8727374, 30967788, 3031710, -3962644, 8759049, 8524973, 11097122, - -318901, 508954, -2136746, -4925254, 3622268, -4144107, -3519726, 6431714, -6361921, -4705137, - -7994545, 7271917, -5991480, 501974, -4600447, -4828080, 9235253, -3954054, -288300, -1487132, - -4669703, 8675834, 760209, -1567126, -1460289, -4163434, 2144799, -12934294, -2189360, -957241, - 1360968, -1437203, -7565585, 2474975, -33823, 2509335, -1509144, 1861332, 180389, -1344325, - 6112812, -668941, 769873, 109522, -3546569, -1183800, 6647536, 3517041, -2417530, -181999, - 1491964, -3179887, -2615098, -4753455, -2037962, 1211718, -1246614, 2362232, -1282585, 1746978, - -2983392, -3262565, -727460, 280784, 252866, -380641, -743566, 1405528, 431644, -1231045, - 882616, -1604707, 151398, -1082869, -2223719, -662499, - }, - { - 625455, 48310328, 9256191, -1928977, 1337346, -366683, -2673617, -2811593, -6248104, -4338454, - -8423505, 10036802, -918049, 6790880, 8885214, 18519898, 4054986, -8644695, -594316, 1724429, - 11790222, -10586558, 12234214, -9982041, -9119826, 11607686, 968515, -6853157, -1896228, -5934034, - -1799591, 4685273, 10813654, 6478422, -7649337, -3042448, 4359929, 71941, 4691178, -161598, - 4558034, -6802155, -2277943, 2990371, -3220689, -2022930, 2463701, -639413, 3599720, -4482872, - -3412889, -5885179, -3378529, -2369211, 3679713, -1551557, 2025614, 1213328, 5983427, 2325725, - 105764, 858457, -1155346, -1196148, 3432216, -3812857, -3081102, -317828, -2177549, 2186675, - -1744831, -166430, -2217814, -1573032, 3984656, 238371, -3316252, 505732, 1068910, -765041, - 1811939, -2006287, -2485176, -248571, 2008971, 1562831, 945967, -84826, 1387811, 474057, - -760209, 2170569, -1474784, -460635, 1689533, 1296006, - }, - { - -16055125, -47720844, 3505230, -12955232, 4374961, 5682779, -31148176, -16742856, -1244467, 1901060, - 2971581, -5978595, 118112, 23918672, 12112345, -12479027, 13921600, -10321343, 5930276, 7831873, - -9986873, 2959769, 3678640, -8603356, -1138166, -2445447, -5885716, 2295123, 2639258, -15904801, - -3160559, 644782, -4813585, 4731980, -11856794, 1968169, -1458678, -6800007, 3504693, 833761, - 4599910, 1229434, 5967320, 3412889, -8986682, -2317672, 3929895, 7124814, -3071439, -1066763, - 8016020, -4329864, 3422552, -1370095, -5934571, 293132, -6153615, -692027, 5964636, 465467, - -118648, -143345, 547071, 6040335, -918586, -1915555, -2654290, -2753611, -7895761, 3118146, - -583042, 4703526, 865436, -346819, 5384815, -329102, 1955284, -6084358, -5193153, 778463, - -1569274, 785979, -1028108, -185220, -1872606, 550830, -323733, 2230699, 2153926, 987306, - -2501819, -896574, -3578245, -44560, -1298691, 814433, - }, - { - 1790465, 54135380, -24278376, 2097555, 4439386, 1159641, 5361193, 5349919, 3184182, -576063, - 5731634, -4252018, -4016331, 1878511, 9817758, -10464151, 12131672, 20866024, 8737574, 1200443, - -14742475, -6586333, 7019051, 3886409, 1879048, -9703405, -3529926, 7322919, 7425462, 12523588, - -9199283, -3165928, 2042257, 3442416, -3217468, -8986682, 6036040, 3204046, 917512, -1253057, - -6197638, 444529, 3234110, -9257802, 235149, -1672890, -1640678, -638876, 521839, 416075, - -6627135, 2608656, 1139240, 1905355, 2482491, 7021198, -5504538, 2663417, -2258616, -2446521, - -5114769, -6791954, -3102577, 2029372, -700617, -1851668, -2200097, 231391, -670552, 2830384, - 2439005, -4566087, -697395, 1711008, -1578401, 569620, 1166621, 2037962, 1307818, 1910724, - 1040456, -1339493, 1380832, 1107565, -358093, 4998268, -1118302, -2023467, 1513439, -2030446, - 537945, 1358820, -3381213, 418222, -2208687, -93952, - }, - { - -12835510, -73173360, 31595390, -12801150, -17647484, 3082176, -11307575, -7854422, 4041027, 5192616, - -10983305, 1617055, -14831059, 18084496, 25387014, -2880849, 5995775, 14552423, -7656853, 8231305, - -1437203, -1604707, -1881196, 12800613, 7148973, 3057480, -4752918, 5818070, 2396055, 4053376, - -14559939, -6831146, 4840965, 4958540, 9179419, -13558138, 5390721, -689879, -3376381, -7240241, - -3234647, 3272228, 2545842, 318364, 7863012, -1054415, 7120519, 2469606, -881542, 6884296, - -1977296, -5347771, 1012002, -1912334, 1934346, 1365263, -1488743, -3130494, -3708168, 5819681, - -164819, 2258079, 1013612, -5020280, 4475356, -1373316, -2010045, -4944044, 447750, 2231773, - 3221, 2180770, -911607, -168577, -4113505, 1851131, -765578, -730144, 2864206, 2034204, - -2283312, 1116155, -3223910, -188442, 999117, -234613, 1263794, 885300, -801011, -2587718, - 1246614, 1933809, 4360466, 301721, 875636, -1383516, - }, - }, - { - { - -662499, -64932388, 7669738, -290447, -3830037, 3348464, -2785286, 4898410, 6309307, -1954210, - 5632850, -2968359, -5960341, 376347, -9329743, 13889387, 20087562, 1047435, 2226404, -2035278, - 12962211, -14861124, -2117956, 8574902, 5250061, -23401666, 423054, 2587181, 8535711, 7906498, - -55835, 1084479, -6320045, -5865315, 3019362, 575526, 2036888, 8313983, -3562139, -117038, - 3400004, -4591320, 9065065, -7846905, 2573759, 2435247, -3803731, 3346853, 3331284, 2353642, - -1716913, -934692, -389768, -4317516, 2981244, -781147, -5130339, -1245541, 1882806, -545998, - 3819837, -2314987, 2177012, 2091112, -351114, 3592740, -335007, 2014877, -2019708, 498753, - -912681, 3758, 322659, -634581, 149787, 2302103, -418759, -651761, -1323924, 748935, - -1366873, 2236067, 616865, 651224, -803159, -1212791, -1860258, 1081795, -1930588, 410706, - 2818036, 716186, -133144, 884226, -367757, 184684, - }, - { - -6640557, 95624760, 43958452, -67384280, -27935542, -3250217, 1345935, -19187230, -9822053, 11256572, - 4199941, 8225399, -8769249, 324807, 1684164, 3704409, -6099391, -7397008, -9121974, -10370735, - -6607271, 504659, 1254667, 8549669, -10669773, -2051921, 8790724, 5003100, 1018444, 5028870, - -478352, -491237, 3158949, 5176510, 6694781, 5317170, 625992, 1897839, 579821, -1711545, - 959388, -7274064, 3504693, -7607998, 1307281, -2287070, 1787780, 1564979, 362925, -4677757, - 2623688, -7109782, -2684, -718870, 6264210, -2358474, -1427003, 3060164, 1069447, 1718524, - 4748087, -162135, -335544, 2342905, 213138, -3383897, -2246805, 1059783, -440234, -1573569, - 4251481, 1810866, 1559610, 219043, -1328756, -675384, 240518, -2390149, -2421825, 3313567, - 90194, -269509, 374736, -1041530, 1655173, -1212255, -2301029, 1652489, -883690, -380641, - 594853, -222801, 1174137, -1036161, -37581, -1126355, - }, - { - 908922, 80654656, -27680528, -44707924, 22502408, 6215355, 5657546, -1499481, -5122822, -3442416, - 2539400, -13540421, -6573985, -1889786, 3048353, 7215545, -2147, 6160057, -9139154, -8580271, - 1429687, 6131603, -9849971, -6545530, 13735305, -1809255, 4574140, 2089502, -3266860, -9167071, - 4320200, 7064685, 7739531, -10641318, -4213900, 3243774, -6105296, 3878356, 8114804, -5254356, - 3323231, 5328981, 10524817, -2076080, -9798968, -731755, -2447595, -3113851, -2233383, 3152506, - -2855080, -8694088, -2479270, 856846, -4198868, 2843805, -1298691, 3518115, 894964, 4923643, - 27917, 2005750, -2109366, 3325379, -1708860, -1679332, 137976, -1993939, -2603287, -288837, - -823560, -2808909, 2073396, -1206349, -2708514, 988916, -2638721, -339839, -3005403, -2174327, - 188442, -704375, -102005, -1428614, -817118, -646393, -1111860, -1375463, -144955, -956167, - 914828, 686121, -550830, 218506, -278099, 202400, - }, - { - -286689, -3245385, -21391084, 1152125, 4184372, 852014, -1516660, 1686312, -2183991, -3704946, - 479426, -17824652, 1846836, -11637214, -7487202, 114354, -16777216, -12797929, -14092861, -7500624, - -15687368, -860604, -569083, 378494, 7900056, -14496, -11927661, 6531035, 12551505, -3892851, - 4577362, 1763084, 3606699, 5465883, 2053531, -1912871, -3224447, -5320391, 733366, -1407676, - -5309117, 4134443, -12079059, 1351304, -5622112, -251792, -135828, -9101573, 9460739, 4507568, - -6687801, 3048353, 821413, 5954436, -3912715, -915902, 3614752, -4032438, 4758287, 63351, - -792958, -743029, 1176821, -838592, 2642479, -3047279, -1314260, 2649995, 375810, 2434710, - -908386, -935229, -1609539, 647466, -4196720, 461709, 1503775, -1745367, 714038, -2778844, - -2365453, -2119566, -256624, 522912, -195958, 517007, -1437740, 963146, -364535, -647466, - -255014, 875100, 182536, -154619, 3091303, 642635, - }, - { - 3016678, -94094680, 30355756, 31911608, -4177930, -20401, 1693828, 564251, -659814, -5508833, - 12683575, 12123619, 4476967, 5555540, 710817, 4149475, 15136002, -2412698, -6769406, -1689533, - 7494181, -1678795, 13495324, -9164386, -5170067, 1002875, 3784940, 2766496, 6347962, 9150428, - 7697119, 9001178, -1690607, 13979582, 2131915, -2341831, -4345970, -9140764, 902480, -3908420, - -10445360, -3663070, -6359236, 450972, -2655364, -298500, -2396055, 2799245, 2678986, -2272575, - -3339874, -2935610, 4546760, -1457605, 2947421, 2895882, -1249836, -1088237, -2375654, 1129576, - 774705, -2687576, -1945620, 2640331, 1973538, 4302484, -1306207, 1401233, -339302, -2753074, - 335544, -1292785, -1516660, -3391414, 1542430, -2130841, 761283, -1165547, -1126892, 605054, - 790811, 672162, -1618129, -1830730, 1954747, -1389959, -200790, 1348620, -1674500, -540092, - -471910, 3493956, -288837, -372052, 120796, -798864, - }, - { - 2073396, 774705, 2895882, 8302172, -6855842, 824634, -952409, -2056753, -6541235, -1027571, - -4813048, -2471754, 11614128, 1016834, 1036161, 16001438, -19347754, -8409546, -18457622, 124017, - -6037114, -1119913, 3572876, 529892, -9993852, 8157754, 1741609, -1109712, -7198902, 256624, - 1188095, -1683627, 3739306, -3611531, 3943854, -1704565, 2732673, -7350837, 3710852, -6492917, - -325344, -4000225, 3843459, 2139431, 2509335, -18790, 3452617, -4466766, 2497524, 5767068, - 5005248, -1672353, 6129992, -5499706, -586800, -1289027, -2239289, -908386, 2660732, -5968931, - 3035468, 2588255, 1896765, 1525787, 1648194, 323196, 158914, -3038689, -1435056, 967441, - -1457605, 1944010, -1417339, 3788161, 741956, 479963, 922344, -1406602, 527744, -83215, - -2011118, 698469, 768799, -1994476, 621697, -2113124, -1634772, 69256, 342524, 868657, - -1644973, -1799591, -144955, 149787, -45634, -1057099, - }, - { - 8689793, -95684896, 12219719, 50826108, -216359, -3959960, -494995, -11251741, -12214350, 915902, - -1808181, 9381819, -11586748, 1261110, -8222178, -542240, -5900212, 4714801, -14939507, -2543158, - 7460895, -2074469, -5346161, 11442330, -2584497, -2303713, 608275, 3959423, 4810364, -2958159, - 8109972, 4360466, 8376797, 4217121, -4427038, -2560338, 4650376, -698469, -2774549, 4067334, - -477815, 9228811, -5030481, -2564632, -3776350, -875636, 752693, -2881386, -2498597, 2172180, - 1207423, -5100811, 2222109, -4524748, -2865817, -5486284, 3092913, 368293, 601295, -960462, - 1791001, 3073049, -711891, -813896, -1001801, -1071058, 3732327, -584116, -4312684, 3952981, - -869194, 876173, 956704, -41876, -906238, 2322504, 2311766, 1468342, -1493038, -509491, - -2302639, -1331440, -1582696, 2635499, -2181844, 1335735, 132607, -641024, 204548, -551366, - -179315, -1162326, 2100239, 724239, -1749125, 1372242, - }, - { - 3265786, 42392400, -8279623, 14108968, -8647917, 355409, -4908074, 1193464, 159451, -527744, - 1508070, -1614371, -4278861, 9407589, 14974940, -14009110, -6873022, -3308736, -9102646, -10564546, - 2062658, 1555315, 1433982, -1979980, 7307350, -13751412, 4824859, 7066295, -12757127, -8887361, - -12624519, 3143379, 3335042, 5545340, -1846299, -1975148, 872415, 7164006, 3840238, 389231, - -2623151, -1509681, 2289755, -2404108, 5284958, -354872, 1494649, 4991826, 580894, 3702799, - 1447404, 4311611, -8805220, 4705137, 2395518, -2625836, 510027, 447213, -2333241, 4778688, - -3787624, -2197413, -10737, -330176, 2178622, -2467459, 1437203, 269509, -1571958, -614180, - 1064615, -644782, 1483374, -2148558, -451508, 894427, -242129, -500901, 2153926, -363998, - 1448478, -3572876, -784368, -458488, -364535, 390842, -1021129, 630286, 1059246, 604517, - 1700270, -485868, 550293, -1198296, -3045132, -1598802, - }, - { - 7540352, -106754096, 8996346, 50601156, -4881767, 2924336, -3114388, 5590437, 1291711, 4616553, - -5315559, 11721503, -1192927, -848793, 7248831, 8561480, 173946, 3652870, 926639, 4522064, - -2558727, 230854, -692564, -2451353, -4239670, 3635153, 930934, -6009733, -3781182, -15315317, - 53150, 4915590, -4389994, 2024003, -650151, 5349919, 1362042, 8836358, 2045478, 6285685, - 1095217, 3850438, -889058, 2878702, 5777268, -4187056, -770410, 4191888, -1494649, 5549098, - 3728032, -869194, 2837363, 3454228, -3132105, 250182, -612033, 330176, 312996, 568009, - -925565, -2758443, -877247, -41339, -4212289, -3419331, 2521146, 276489, -1254131, -500364, - 2173790, 3741454, -733366, -3453154, -1257889, -1464584, 479426, 157303, 584652, -2767033, - 554588, 2725157, 3091303, -2447595, -870268, -70330, 948114, 1606855, 918586, 473520, - -825707, 435402, 1796370, 1506997, -1081795, 1381369, - }, - { - -639413, 40507984, -27567248, -5382668, 3020973, 3855270, 10270877, 13571560, -2013266, -7366406, - -7025493, -1464584, 4720169, -13087839, 7539278, 3480534, 2849711, -1482301, 14439680, 13213467, - 2193118, -1934883, 2566780, -10027675, 1458678, -8194261, 478889, 7201587, -3462818, 4494684, - 1268626, 321586, 13657996, -1788854, 5287105, -5961952, 1381369, 5193689, 11708081, -11974369, - -1897839, 1773822, -10162966, -3047279, -6003291, 5577552, 3557307, -470299, 1900523, 2058363, - -5714991, -1338419, 4628364, 3127810, -6639483, -4073240, -7001871, -3019362, -642098, 90731, - -5906117, -894427, 1427540, -2662880, -4438849, -183610, 686121, 4336307, 3724274, 3790846, - 280784, -925029, -1781338, 1373853, -1664300, 1237488, -1155346, 650151, 2432562, 378494, - 1443646, -2225867, -3781182, 12885, -144955, 1256278, 1580011, 609885, -1737851, 1056025, - -982474, 86436, -849330, -1311039, 2741800, -373125, - }, - { - -8597451, -40403296, 20844550, 2339147, -9700184, 9745818, -24729884, -34907884, 5884105, 15444166, - 14906758, -14848239, -17661980, -16527034, 23432804, 4125316, -2840047, 1855963, -1917166, 4634807, - 1439351, 3825742, -4713727, -4532264, 6243272, -288300, 1139777, 11036455, 5695664, 8812199, - -6324876, -750546, -10544145, 5378910, 2182380, -7941932, 5059472, -3140695, -2295660, 1629403, - -3245922, 7529615, -3748433, -2819109, 4064650, 2794950, 10947335, -7517804, 1040456, 6531035, - 4683125, 783295, -3391951, 4203699, -1364726, 1533840, -1986422, 7053947, -1574106, -5809480, - 3278134, 319975, 2812667, 2333778, -2381023, -2444910, 3324305, 2882460, -1096290, 121870, - -193274, -2780455, 1937567, 2083059, 711891, 398358, -2401961, 2011118, -1272384, 1612223, - -1916092, -2756832, -2102923, -802085, 648003, -457951, -847182, 721018, -564251, -1814087, - 1899449, -930934, 845035, 281320, 1258425, 577136, - }, - { - -168577, 6542309, -17686138, -3067144, 2669859, 2406792, -8303246, -289910, -920734, -1369021, - -15096810, 5770826, -9986336, -9225590, 1140314, 2236067, -3801046, -628139, 16115791, 5768141, - 3086471, -22701050, 4592394, -10666551, -9245454, 513785, -6685654, -16783658, -9506910, 7206419, - 4134980, 1377074, 6178848, 8217883, 2825552, 3467649, -4177930, -8574365, 3265786, -4019553, - 7209640, 636729, 3208878, 3985193, 845035, -589484, -767189, 2992519, 7982197, -1963874, - 5147519, -2641942, -438087, -2667175, 4220879, -2037425, -835371, -340913, 1438277, 1102733, - 624918, -1580011, -2228014, -776852, 2417530, -89121, -1036698, -1389959, -3674882, 1039919, - 180389, 1711545, 1338419, 49929, 1612760, 1619740, -865973, -267362, 747324, -880468, - 64425, -3772592, -2964601, -1838246, -235686, -656056, 1153199, 970126, 2782602, -284005, - -2280628, 2188823, -615791, -876710, 941135, 278636, - }, - { - 15192910, -59070832, -29281476, -840203, 3952444, 10617696, -16786342, -6783364, 1607928, 5341329, - 6103149, -5601174, -2676838, 10809896, -1674500, -21937620, 21437792, 2447595, 17395154, 12678743, - -11702175, 2361695, 486405, -1523640, 9337259, 816581, 356482, 3365644, 5931350, -7576859, - 5051956, 10484015, -5172215, -1830730, -12069395, 5328444, -2872796, -7460358, 3626026, -4972499, - 4716411, 2142115, 763967, -2492155, -8227547, -3005940, -1817845, -2059974, -10119480, -2284923, - 9308268, -31675, 7172596, -1063541, -2536715, 1329829, -5385889, 138513, -620623, -5623186, - 202400, -1345935, -4912369, 1625645, -3333968, -3212099, -534187, 1320166, -5463199, 1239635, - -2915746, 2382633, 1282585, -492848, -377957, -5160940, 2677912, -3238942, -2377265, 1597728, - -1523640, -983011, -1446330, 1669132, 1398549, 545461, -1477469, 483721, -715649, 237297, - -2286533, -1400696, -2065342, 2529736, 1265942, 1783485, - }, - { - -2010582, 56491704, -16152298, -2345052, 610422, 2732136, 2308008, 115427, 7061463, 1245541, - 5641977, -3120294, 9562208, -4754529, -24046448, -18360986, -2764348, 2026151, 1846836, 13350906, - 3794604, -2226404, 4789426, 10214506, 1214939, -16401943, -4060892, -3172907, 11661910, 18160732, - -11836930, -8546448, -1536525, -559420, -3557844, -5512591, -409633, -797790, 4587562, 5383742, - -7901666, -2444910, 1956895, -8943196, -833761, -4939213, 122943, 4210679, 2034204, -2965675, - -7797513, 6308770, 1430224, 3352222, 1400696, 6366752, -6222334, 3159485, -2348273, -626528, - 4828080, 2229625, -1460826, 4748087, 1457605, -586263, -1465121, 1025423, -501437, -326418, - 1117228, -3574487, -2228551, -82141, 441845, 3514357, 1414655, 484794, -1459752, 300648, - 2761127, 155693, 1538135, -755377, -2900714, 2127083, -814970, 419833, 2999498, -1970853, - 803696, 2177549, -1396938, 646929, 4295, 54761, - }, - { - 12208445, -65768836, 1174137, -18540300, -14968498, 4679904, -8137890, -7351374, 8696235, 9911174, - 3506841, 5859409, -14815490, 12607340, 8208756, -5063767, 7303592, 10403485, -18598282, -1811939, - -1394254, -2442763, -11330124, 14741402, 6891812, 1551557, -8646843, 3245922, 2041720, 11556146, - -9178882, -14909979, -7157026, -3761318, 11649562, -8665633, 2913062, -1293859, 7900056, 3256659, - -2168959, 7372848, 2594697, -1396401, 6007586, -4844723, -1484985, 2705293, 4361003, 11672647, - 1721208, -5006858, -286152, -3249143, 2550137, 2184528, 326954, 2944737, 143881, 6580427, - -1665911, -681826, 41339, -4786741, 4081830, -2648384, -3003793, -5325223, -524523, -876710, - -2476586, 372588, 1378685, 3742527, -1757715, 1141388, -3280818, 1462436, 5904507, 2151242, - -4500589, 1839320, 189515, -933082, -1341104, -1214939, 1140314, 2266132, -519691, -3959423, - 639413, 1634235, 3054796, -1356673, -249108, 18254, - }, - }, - { - { - -725850, -48672180, -10793253, 26825828, -13721884, -1583232, -677531, 6623914, 5341866, 5925981, - -2944200, -2213519, -6088653, -10966662, -2985002, 16268262, 4800163, 4699768, -2437931, 8260833, - 11633456, -10618233, -9186935, 4762582, -2639794, -9334038, -3203509, 5481452, 3723737, 8752606, - 7130720, -6005975, 1762547, -11996917, -917512, 2500208, 11123428, 2393908, -1222455, -751619, - -377957, -3962107, 3896072, 2301029, -197569, -3842385, 1840394, 1524713, -540629, 454193, - 375810, 3157875, -3513283, 707059, -3211025, -1027034, -947040, -2593087, 583042, 1919314, - 144955, 2588255, 1866163, -542777, 4352413, 2139431, 243203, 1547799, -1490891, 606127, - 619012, -1493575, 452045, 1024350, -2436320, 1776506, 312459, 230854, -596464, -818191, - 1304596, 1162326, 208306, 1627793, -1481227, -245350, -2188823, -798327, -112743, 69793, - 1497870, 336618, 145492, 1924682, -2147, 144955, - }, - { - 5100274, 149795040, -29055990, -63755568, -29988536, -2662343, -10143639, -12006581, 4735202, -779537, - 10866267, 6054830, -7879655, -2295660, 5372467, 255551, 5743445, -15037754, -14165876, 618475, - -7965017, 1544578, 202937, -3100967, -2526515, 333934, 3351148, -615254, 1379758, 12126303, - -3883187, 456340, 9999758, 2692945, 6507413, 5888937, -1156420, -3780108, 3645354, 5141613, - -3764002, -3850438, -13422, -5261335, -831076, -1282048, 2334852, 3155190, -2570001, -2649458, - -2503966, -1287953, -153545, 1460289, 611496, -2813741, 3837017, -1289564, -1014686, 6967511, - 3180423, -489089, 2309082, -2712809, 1338956, -1789391, -1865626, -1347009, -200253, -1495186, - 4573604, 1886028, 1316944, -709207, -974958, 1544578, -1122597, -2346126, 317828, -1277216, - 301721, 914291, -862752, 940598, -417149, -933082, -265214, 735513, -8053, -852014, - -530965, 426812, -886911, 317828, -226023, -71941, - }, - { - -2479807, -3910568, 39440148, -24020142, 5921686, 6106370, 8356396, -4100620, -7729331, 9629317, - -11310796, -2756295, -4404489, -1842004, 7915088, -1399086, 7400229, -5815923, -233002, -1549410, - -2085207, -5150203, -6659884, 4487167, 3277597, 2563022, 3126736, 2254321, -2297271, -1773822, - 3769908, 3102577, 538482, -3579318, -2123325, 4775467, -7438347, -508417, 3630858, 5240934, - -1701881, 3633542, 9066676, 784905, -6405944, -3636764, -5368172, 924492, -1045288, 4706211, - -8240432, -4483409, -2254858, -2760590, 1611, 1130113, 580357, -428423, -831076, 5267778, - 1974611, 2340757, -1652489, -1528472, 983548, -3102040, 238908, 605590, -1825361, -88047, - -1716913, -15569, -729608, -2265595, -1075352, -1272384, -2721936, -612033, -2168422, -1382980, - 127238, -357556, -758599, -396211, 144955, -1610076, -1403381, -2218888, 238371, 56371, - 23622, -462783, -222801, 1406602, 289373, -944356, - }, - { - -1188632, -35694400, 3466039, 7341173, -1184337, -242666, -588411, 1957431, 2021319, -10638634, - 1178969, -12371116, -7348689, -5335960, 1386738, -13968307, -7824894, -9147207, -14609331, -7614440, - -13157095, -6266358, 5170067, 2001455, 530428, -6123550, -769336, 7159174, 3910031, 2072322, - 1786706, 2792266, 1537598, 8995272, 292595, 2190970, 3781719, -7743826, -2651069, -6949794, - -3151432, 4958003, -6959458, -2036888, 1216013, -3244848, -4015258, -1298691, 1078037, 4286914, - -366146, 874563, -2534031, 4778688, 2245731, -719407, -1550483, -24159, 1198296, 2436857, - 800475, -336618, -440234, 212064, 1197222, -2119030, -1278827, 2724620, 2183991, -457951, - 520765, -1236951, -914291, 493384, -3974992, -1613834, 1358820, -380641, 411243, -6979, - -4328790, -1895691, 580894, -432181, 148713, 993748, -877247, -906238, 315143, -191663, - 1056562, -651224, 1044214, 1826435, 1672353, 450972, - }, - { - -5354214, -58648852, 6532646, 29533806, 2025077, 1027034, -1179505, 2003602, -6952479, 8893267, - 6140730, 10189273, 5861020, 5330592, 2727304, 6584185, 14669461, -4247723, 10062035, -6522445, - -1665374, 4252018, 4592394, -8844411, -1303523, 2014877, 7424388, -351650, 613107, 11594801, - 11239929, -3056943, 9444633, 9360881, 3499862, -2199560, -1073205, -7837779, -1095217, -5197448, - -10150618, -9916006, -4808753, -2424509, -113280, 1954210, -3722663, 4147328, 4648229, -2521146, - -3386045, -1400159, 3160022, -1145683, 5487358, -1939178, 1072668, -2403571, -4514548, 1234803, - -614180, -1431298, 2931852, 257161, 3560528, -1512902, 2404108, 2596845, -2118493, -1192927, - -373662, -1992865, -3197066, 37044, -1805497, -789200, 757525, 491237, 98784, -596464, - 1089848, 183610, -1320166, -269509, 1675574, -70330, -800475, -583579, -948651, -1339493, - 745714, 373662, -187905, 1850057, -1240709, -295279, - }, - { - -64961, 13326210, 8554501, 3414499, -3622268, -1842541, 645319, -1444720, -1527935, -4794794, - -5592585, -4515085, 6235219, -10259066, 19351512, 1090922, -2616172, -16336982, -6642167, -6743636, - -7070053, 4665945, 2265595, -5230734, -6806987, 1519345, 9441949, -4699231, -10122701, 2287607, - -5947993, 290984, -2762738, -3689377, 5197448, -2049236, 333934, -3293166, -2495913, 1166621, - -3099356, -2571612, 2593087, 2835215, 1730335, 5167383, -108985, -1072131, 365072, 4817343, - 4013647, 1774895, 3578245, -6045704, -196495, -1538135, 146029, -641024, 209917, -1870995, - 1446330, 1189169, 3040300, 391916, 1062468, 229244, 90194, -1807108, -828392, -3644817, - 2194728, 565325, 122943, 2769180, 2228551, 468688, -363462, 689879, 284005, -1971390, - 920734, -838056, -596464, 212064, -1029718, -1625108, -891743, -1262720, 1610613, -16106, - -1644436, -934155, 284542, -808528, -1243930, -301721, - }, - { - -12358768, -38145216, -12065637, 43195560, 1193464, -99858, 3294777, -12123619, -19227494, 2378875, - 2513630, 4767951, 2540473, -9259413, -12354473, 73014, -11315091, 8466454, -3008625, -12589623, - 4073240, 7532836, 2735894, -7240778, 24159, -344671, -1437203, 1081795, 885300, 1151588, - 4255239, 8296803, 3755412, 10211822, -5257040, 3222836, -2576444, 1473711, -883153, 6328098, - 4582193, 1998770, 1848447, -8438537, -2130304, -741419, -1290101, 1347546, -1810866, 2042794, - -2656974, -1796907, 1294933, -6358699, -1963337, -62814, 1977296, -506269, 2217277, -449361, - 2375117, 2478196, 1440962, -1826435, -2113661, -665720, 2150168, -370441, -399969, 2179696, - -704912, -3214783, 219043, 1916629, 2178622, -263067, 3639985, -2702071, 558883, 67646, - -598611, -1998234, -904091, 443455, -1145146, 750009, -749472, 286152, -1016834, 854162, - -1229434, -475668, 1348620, -449898, -312459, 1349694, - }, - { - 1238561, 30175366, 25905096, -3987877, 4176856, -4817343, -3788161, -826244, 3320010, 110595, - -2166274, 1556926, 3608310, -1883880, 4540854, -8336532, -3833795, -3889630, -13196287, -8842264, - 1562831, -1184874, 6519224, -4391067, 1252520, -5188858, 4042638, -142808, -4101694, -3058554, - -14588930, 2746095, 1549946, 6311992, -2285996, 150324, 6063957, -387621, 9984188, -977642, - -6681896, 3025268, 2814814, 2847027, -1229971, 7775502, 1165010, 1881196, 1966021, -195421, - 342524, 4815732, -5651640, 3707631, -589484, -3302830, 4036196, -1801739, 289373, 3421478, - -703301, -1408212, -629213, 1282585, -559420, -1481764, -2689187, 2961917, -967441, 1091995, - 505196, -269509, 1708323, -3054796, -767725, -24159, -13959, 822486, 1451162, -374736, - -1065152, -1286343, -887448, 800475, -2423972, -888521, 513249, -169114, 1096290, 562104, - 1214402, -170725, -355945, -1162862, -1199907, -2378338, - }, - { - -11447698, -61982820, -9947681, 39128764, 1698123, 6791954, -4288525, 3262028, 11485816, 2060511, - 15129022, -6891275, 1014149, -4796405, 17741974, -2677375, -5918465, 10018011, 4023311, 5776731, - 2807298, -4641786, -4187593, 274341, -1884954, 504659, -589484, -1451162, -12954158, -11664594, - -1246614, 3109556, -1453310, 3715147, 4031901, 2843268, -884226, 5739687, 5359583, -572841, - 4314832, 4454418, -2040110, 6080600, 5569499, -1721208, -217970, -618475, 1321239, 1197222, - 6309844, -644782, 2713346, -1730335, 3474629, -3450469, 2308008, 329102, 988379, -162672, - -3453691, -62814, -675384, 97174, -4987531, -3959423, 2829847, 2030446, -763430, -91805, - 3344169, -565862, -560493, -510564, -2255395, 752156, -508954, -868657, 583042, -591095, - -1292248, 1867774, 614717, -796180, -413391, -530428, 677531, 1848983, -141197, 265214, - -104153, -290447, 2135673, 2140504, -222801, -594316, - }, - { - -1632088, 3269544, -6765111, -927176, 13701483, 7824357, -9382356, 6000606, 10759430, -4799626, - -9515500, 1510755, -4336307, 5637682, -3206730, 4544076, 8188892, -6331856, 13506598, 27921046, - -14747307, 4921496, 2047089, -3402688, -5739687, -2713883, 1934883, 226023, 679142, -2099702, - 6088653, 6446209, 1385664, 3408594, 322659, -2607045, -645319, 2818572, 7445326, -3747896, - 301185, -5545340, 562104, -10596221, 492311, 3093450, 3614215, -4037269, -57445, -1182727, - -9664, 376883, 2843805, 628676, -1737851, -9047885, -5255966, -5665062, 135291, -2295123, - -9480067, 1834488, 1069984, -3859565, -4287451, -2428804, 2369211, 5868536, -396748, 5098663, - -402116, -166430, -1552631, -435402, 992674, 1649268, -2182380, 2406792, -664646, -1715839, - 389768, -1493575, -1900523, 843961, -238908, 1041530, 1847373, -476205, 1277216, -503585, - -1692217, 1105954, -1591285, -632971, 1221918, 416075, - }, - { - 10834055, -41480796, 2058900, 4400194, 3070365, -9868224, -106300, -27536646, -5497558, 14898168, - 5283347, -4325032, -22435836, -16905528, 7119982, 7923678, -5319317, 1964411, 2163590, -3255585, - 10553808, -815507, -2404108, -6944962, 377420, 5004711, 8217883, 6654515, -846109, 9241696, - 3238405, -9485972, -5095442, 5458904, -836982, -8519068, 2743410, -107911, -722628, 40802, - 4855461, -2209761, -45097, 550830, -181462, 3371549, 4625143, 1657857, 2697240, 6002754, - 1421097, 4206384, -2226941, 5281736, -4124242, 1977833, -3602404, 8106214, -850940, -4525822, - -558883, 5864778, -518080, 1840394, -2169495, 282931, -1944547, 2429341, 1447404, -955630, - -72478, -708133, 620623, 2294586, 1913408, -134218, -706522, -993211, 470836, 170188, - -154619, -3273839, -1642288, -1301375, 210990, -497142, 266288, -224412, -292595, -1928977, - 1198296, -920197, 2117419, 1063541, 1002875, 1220845, - }, - { - -1509681, -20153060, -925029, -5461051, 3854196, 2039573, -3556770, -1976222, 1312113, -3612604, - 1090385, -9284109, -17717, -29016262, 8636642, -5722507, -4862440, 260919, 18676666, 10168872, - -2020245, -12007655, -3491809, -6107981, -5957120, -9177271, -4266513, -5829881, -17689360, 8898098, - 17382806, -6800007, -1216013, 11698954, 2937758, 3628711, -3201898, -3190087, -2185065, -4063039, - 5122822, 1847373, 9550397, -3180423, 2680597, -5130876, 2200634, 9214315, 732829, -4314295, - 12349105, -5653788, 1680943, -1857037, 1001264, 2377801, -1846836, -218506, -926639, 4619238, - -1791538, -617402, -1027571, 1127429, -3369939, 897111, -1118839, 759672, -3639985, -69793, - 1104344, 1897302, 286689, -729071, 1091459, 3140695, 1397475, 950798, -2138357, -2115272, - 1403917, -3547643, -2172717, -2687039, 304943, -1133335, 1770063, -398895, 2714419, -329102, - -834297, -135828, 2102923, -376883, -1906966, 684510, - }, - { - -16718160, -28388124, -19813758, -9964324, 10300942, -7052337, 1819456, 5461588, -3864397, 38118, - -2488934, 4245575, 11853573, -4319664, -14510010, -12338904, 19716048, 4768488, 21288006, 6952479, - -5173288, -1361505, -2808372, 3682935, 9065065, -5632313, 716723, 3874597, 1760937, 4216048, - 5408438, 1861332, -8040716, -3058017, -4155381, 10984916, -10369662, -2935073, 2026151, -2184528, - 795106, -2035815, 1541356, -4848481, -164819, -4992900, -2046552, -4431333, -6883759, 452582, - 6703370, 1963874, 1199907, -132070, 1492501, -1239098, -3278134, -13422, -2838974, -7204271, - 1186485, -1268626, -3070365, -3227668, -5212480, 729071, 1508070, -274341, -1865090, -1347546, - -168041, -2703145, 2729452, -777926, -2782065, -2544768, 2185065, -3679176, 17717, -1392106, - -801548, -1485522, 984084, 779537, 1449552, -654983, -296353, 328028, -1637993, 282931, - -1072131, -1711008, 273804, 1578937, 1450088, 415538, - }, - { - 217433, 34089156, 4236449, -8269423, -239981, 2646774, 6475737, -76236, 5583458, 4318053, - 1474784, -1838783, 8329552, -10598369, -8379481, -5069135, -20876762, -5390721, 7157563, -3449396, - 18472118, 4523138, -321049, 8735963, 4193499, -14663555, -2334852, -6984691, 11183021, 4397510, - 3467112, -4950487, -2239289, -6298570, -802085, -5130876, 1351841, -1797444, -756451, 5411659, - -3201361, -2108829, -2784213, -3899294, -1391569, -5665062, -1417876, 6965900, -916439, -638876, - -2335389, 5360656, -2567317, 6496138, 2596308, 1962263, -5401995, 4653597, -2218888, 848793, - 901406, 3874061, 2506650, 4053376, -743029, -248034, -29528, 2505040, -1136556, -1287953, - 832687, -3089692, -2373506, -845572, 744640, 3797288, 2012729, 321586, -1181116, 649077, - 1686848, 1038308, 333397, -2518462, -764504, -1279900, 1434519, -64425, 2800319, -1234266, - 541703, 1171989, 1802813, -1018981, 220117, 634045, - }, - { - -13926431, -29716342, -10151692, -9612137, -5331128, -11691438, 114354, -4956929, 8257612, 2161979, - 9905268, -9738838, 6841883, 22570054, -17868674, -2300492, 6801618, 6997576, -10536629, -576063, - 1251983, 2158758, -8910983, 423591, 7636452, 2287070, -9026411, 2580739, -181999, 2688650, - -1394791, -3969087, -6109054, -7231651, 1064615, 2155537, 315143, -379568, 6226092, 2674691, - -3737695, 9513889, -1079647, 2480881, -2696703, -899259, 1310502, 762894, 3311957, 3675955, - 5207648, -3169686, -2647847, 107374, -1742146, 730681, 3554086, 5539434, 1376537, 2234457, - -384400, -3232500, -3176128, 2454574, 559956, -467615, -1414655, -5112085, -2656974, -1790465, - -2806761, 1819992, 849867, 1885491, -1061394, 722091, -2576981, 4687957, 3009162, -983548, - 669478, 542777, 1169842, -1270774, -3231963, 424665, 1351304, 357019, 1254667, -1819456, - -632434, 1728724, 1893544, -1557463, -1347546, 25770, - }, - }, - { - { - 131533, -7552700, 14386530, 34977140, -11138998, -2277943, 887448, -1216550, 649077, 2995740, - -4364224, -9797894, -9903121, -4195646, 1085016, 5925981, -12258374, -5026723, -10474351, -2743947, - 4755066, -8660802, -21897354, -6375342, 4516158, -351650, -170188, -1844152, -3439195, -201327, - 5083094, -4329327, 3817152, -7746511, -578747, 1819456, 7969849, -422517, -2397129, -3354906, - -1100049, -4184372, 3610994, 2085744, -749472, -6172405, -714575, 947577, 959925, 3790846, - 2326799, 5484673, -2057826, -387621, -4485020, 2130304, 1481227, -4640712, -872952, 564251, - -3209951, 862752, 2892124, 133144, 650688, -1934346, 231928, 2554432, 2144799, 1323924, - 1547262, -2696703, -3663607, 1956358, -1540283, 869731, 2222109, 2193655, -1107028, 187368, - 820339, -960462, 375273, 1963874, -260919, 1505923, -452045, -223338, 23622, 915365, - 1961190, 1229434, 1383516, 1700807, -286689, -587337, - }, - { - -4088809, 157826096, -9466645, -56996364, -17453136, 4512400, 8425652, 13111998, 6182069, -16705275, - 1282585, 19478214, 6270116, 2714956, -106300, -283468, 16580721, -6305549, -663036, 12566537, - -1831267, 2389076, -5959267, -9595494, -4050691, -2542084, 8139500, -189515, -8486319, 10274636, - -4834523, 825171, 9532143, -300111, -425202, -870268, 3626563, 7118372, 9954124, 5408975, - -4281009, -3787624, 2837363, -1832877, -592706, -2653216, 1296543, 4421132, 3824669, -1447404, - -1046361, 3507378, -1848447, -3595961, -2050310, -1387274, 1331977, -4565550, -4680978, 362388, - -345208, -2026688, 1832340, -1450625, 2535105, -10737, 104153, -2961380, -1509681, -1216013, - 3404835, 1069447, -572841, -2404645, -1444720, 2993055, -602906, -102005, 2282775, -2046552, - -1269700, -255014, -548682, 809064, -731218, -301185, 565325, 1282585, 803696, -1056025, - -705985, -76236, -1581622, 496606, 166430, 532576, - }, - { - 4485557, -65009700, -16127602, -1738925, 10189810, -2481954, 7635378, 740345, -2815351, 11502996, - 2937221, 6869264, -1880122, 4619774, 12875775, 6712497, 11751031, -9690520, 2078764, 11697343, - -26307, -2468533, 3440269, 9845139, 5765457, 2122251, -3097745, 3108483, 5717675, 523449, - -6979, -220654, -235149, -5422396, -1858110, 7071127, -2443300, -1995549, 981937, 5520644, - -1586454, -74625, 5204964, 2552284, -2886218, 5783711, 2991445, 1549946, -3204046, 3644817, - -574452, 3489124, 2171643, -507880, 2996277, 2585570, -1209033, -2159832, -3526705, 1052804, - 187905, 1411971, -2957622, -2146410, 2538863, -2130304, 1146756, 2458869, -1612223, -616865, - 85362, 1117765, -1000191, -310311, -326418, -2748779, -2448131, 850404, 1981054, 2805688, - 555661, -1085016, -301721, 316754, 2528125, 171799, -721555, -1450088, -556735, 327491, - -935766, -1864553, -487479, 1873143, 458488, -2039573, - }, - { - 1698123, -36913096, -2229088, 9039832, 3253438, -772557, -1170379, -657130, 1636919, -10640245, - -1473174, -7581691, -3842922, 1263257, 13833553, -2655901, 7264937, 3856344, 2218351, 660351, - -8711267, -7933879, 5492190, 2432562, -5966784, -5489505, -4090956, -2390686, 2101313, -2070711, - 2155000, 8024073, -18254, 6997039, 1315871, -999117, 6944962, -2829310, 360777, -2637110, - -1354525, 7531762, -1216550, 1367410, 6078453, 860604, 631360, -682900, -4647692, -1647657, - -1805497, -1665374, -4515621, 1991254, 1059246, -881542, -206695, 2035278, -585726, 3480534, - 971736, 1136556, 1552094, -748398, 2129230, -1526861, -3812857, -244276, -1485522, -1308354, - 3285650, 1308354, -51540, 650151, -2758980, -1021665, 656593, -1741609, -1353989, 1796907, - -2127083, -258772, -138513, -932008, 1095217, 767189, -1194001, -292058, 151934, -73551, - 1335198, -1799591, 312996, 436476, -289910, -311922, - }, - { - 9601936, -33931852, 6974490, 22638236, -4017942, -2915746, -1309965, 8007967, -7510824, 9353365, - 6954089, 7872138, 1658394, 2573222, 3410204, -6267431, 4583267, -173946, 22019760, -2244657, - -1846299, 3308199, 6503654, 1122597, 2105071, 765578, -749472, -929860, 4649302, 3204583, - 4393215, -3304977, 6875169, 2626373, -64425, -4257923, 1483374, 4839355, 1024350, -3089692, - -2541547, -5392332, -481573, 3832185, 6267431, 3479461, -4744328, 3230352, 2291365, 102005, - -415538, -3010772, 783832, -1352915, 3111167, -4334696, -2285996, -1895154, -1021665, 3750580, - -1921998, -698469, 1588601, -2544768, 3354906, -404264, 2398739, 1370632, -2270427, -498216, - -649077, -500364, 421981, 1960653, -948651, -1582159, 319438, 2048163, 369367, -153545, - 767725, -170188, -294742, 708133, 1180042, -72478, -984621, -1832877, 527207, -44560, - -110595, -1147830, -1356136, 1098975, -1554241, 296890, - }, - { - -1560147, 3236795, 2679523, 3621194, -1526861, -969589, 2906082, 310848, -197032, -4151086, - -4078072, -2735357, 2276333, -5339181, 37633040, 14531485, 17263622, -2035815, 1640141, -224949, - -731218, 9584756, -2229625, -5428839, -414464, 4660577, 13445932, 2793339, 2303176, 1143535, - -11197517, -6553583, -6827925, -3942243, -162672, -3479997, -875100, -4323422, -1440425, 4919348, - -3211562, -4844186, 2233383, 2319282, 965831, 5077188, 2447595, 3464965, -954020, 3724274, - 1472637, -9664, 4504347, -4271882, -2797634, -2143726, 2407329, -1203665, -1079111, -1887101, - 1276142, 1006633, 1818382, 600222, 2610266, -98784, -1510218, -714038, 351650, -4094178, - 1629403, -1163399, 94489, 2871186, 2488397, 827855, -897648, -1454920, -1888175, -2590939, - 1206886, -385473, 97711, 2002529, -433792, -837519, 511101, -309775, 1877438, 219580, - -311922, -1311039, -1162862, -619549, -914828, -1173600, - }, - { - 16268262, 1003412, -11643656, 42217916, 1309428, 3846680, -462783, -1495722, -1262720, -7085623, - -3929358, 7051263, 6732361, -5231807, -11176042, 6037651, 9348533, 10514080, 4118874, -1038845, - 6342056, 5599564, 1766842, -10008348, 3984656, 1621350, -5801964, -2253784, 3067681, 16643, - 7595650, 11156178, -6441377, 4773320, -836445, 10930155, -2274722, 1576790, 1251446, 1383516, - 940598, -23622, 3352759, -4099546, 6022618, -209917, -527207, 4258460, -468688, 5577015, - 1863479, 900333, 994822, -3421478, 1709397, 758062, 4096862, 663572, 3006477, 344671, - -929860, -1148904, 2169495, -379568, -3713536, -2635499, -2000381, -37044, 4376035, 3535832, - 726386, -2371359, -671089, 326418, 2261300, 140123, 2120640, -3386582, 1165547, 150324, - -841277, -599685, -1749125, -1913945, -1443646, 1151051, -85899, 810675, -1379221, 797253, - -1781338, 246961, 1190780, -604517, 1057636, 846109, - }, - { - -3520800, -23306104, -8737574, -9805410, 4884989, -593779, 548682, 3191698, 3148748, -3580929, - -1628866, 8390219, -1870995, -24978992, -1021665, 6917582, 12402792, 5941551, -7103876, -2967823, - -5046587, -8391829, 4429722, -8169028, 163209, -6158446, 1354525, -2724083, 4791036, 6449967, - -3730179, 8313983, -2855617, 5591511, 1761474, 1405528, 8551280, -2833068, -2598992, -6448894, - 253403, 6114960, 2254858, 3000035, -785979, 6410239, 23085, -1197222, 566399, -1382443, - 1312113, 4814659, -3804804, 2112587, -2923799, -2615635, 3860639, -2585570, 2463164, 5632313, - 1845225, 1050120, 1536525, 2825015, -1975148, 80531, -1867774, 2420214, -743029, 2439005, - 2674691, 806380, 1757715, -2996814, -3224984, -784905, 238908, 890132, -240518, -2699924, - -1312649, 218506, 762894, 562104, -2807835, -376883, -86436, -1447941, 294205, -47245, - 124554, -1240172, -824097, -257161, -11274, -1618666, - }, - { - 17164836, -23952496, -4939213, 43456480, -4658966, 2587181, -4276714, 1662689, 8938901, -9310415, - 10460930, -3941706, -6337761, -8514236, 16138876, 1629940, -7686918, 1160715, 879395, -862752, - -3355980, -9430138, -5341329, 2849174, 3879966, 4342212, -3746285, 2621004, -6774774, -2477123, - -2947958, -4072703, -769873, 1855963, 4478041, 5267241, -960462, -2218351, -220654, -1971927, - -482110, -827318, -3484829, 3084324, 3755412, -2047626, -697395, -409096, 1829656, -3234110, - 2636573, -30065, 2247342, -4081293, 4512937, -1343251, 302258, -2005213, -1917166, 1678259, - -3148748, 591095, 491774, 2133525, 60666, 387084, 1089311, -75162, -1051193, -770947, - 1981591, -60666, 92342, 1595580, -342524, 1440962, -519154, -1327682, -297963, 876710, - -684510, -307090, -44023, 25770, 25233, -375273, -491774, -332323, -2174327, -341450, - -436476, -577673, -52613, 1156957, 650151, -776852, - }, - { - 3896072, -7478075, -8754754, 788663, 6593849, -9643812, -22565758, -2540473, 7546258, 1660005, - -1547799, 8707509, -312459, 16161962, 5331665, -1119913, 2013266, -6478422, -5974300, 10485626, - -13679471, 2926483, 3800509, -10887205, -9347459, 2430952, -3116536, -3980898, 3321084, -4273493, - 6159520, 7614977, -3810710, -6036040, -6474663, -248571, -1695438, -1327145, 6466074, -630823, - -703838, -5401995, 5930276, -1873680, 3915937, -310311, 875100, -4793721, 1983201, -245350, - 33286, 1536525, -2118493, 53687, 4109210, -6708739, -1170916, -1422171, 1933272, 1932735, - -5507222, 3262028, 1342714, -3626563, -2928094, 1517734, 444529, 474594, -5474473, 890669, - -769873, 417686, -722091, 2052458, 448287, 52076, 4832, 2630131, -1710471, -1799591, - -554051, -294205, 59593, 450972, -1220308, 899259, 397821, -1605244, 2217277, 111132, - -2001992, 697395, -1442572, -963683, 355945, 157303, - }, - { - -11449309, -58306328, -2510409, -4204236, 7005092, 779000, 13882945, -4757213, 7313793, 11292006, - -507880, -41339, -5502390, -6415071, -4475893, -1809255, -10472204, -6317897, -3555159, -10551124, - 5303748, -1840930, 1017370, -8763881, -4897874, 3374234, 666794, -300648, -5915781, -5102958, - -5765994, -10443750, -3795677, -4373888, 508417, 8009041, 12963822, 1292248, 5605469, -396211, - -3906810, -7365332, 3036005, 2728378, -494458, 3573950, -129923, -3431679, 2470680, 2098092, - -7835094, -876173, -3917010, 5779416, -652835, 5702106, -3281355, 3788161, -97711, -2289755, - -3639448, 3770445, 1874753, 2089502, -3701725, 120259, -1258962, 1504849, -890669, -1683627, - 1206886, 692564, 60130, -460098, 1341640, -648003, -511638, -271657, 293132, -850404, - 2397666, -1005022, -910533, -985158, -255551, -1338956, -836982, -1573569, -817654, -790811, - 587874, -1022202, 2331094, 257161, 921807, 1093606, - }, - { - 2374043, -26933740, -9123584, -4179003, 1571958, 1309428, 4053912, -2597918, -311922, 478352, - 13247290, -3541738, 6883759, -27695022, 2219424, -5375689, -2275259, -471373, 7155953, 1669669, - 3907883, 2646774, 1831267, 241592, -1976222, -6255620, 11093364, 14113799, -1053341, 6801081, - 14334990, -1814087, 2316061, 12009802, 2112587, 589484, -5329518, 5456219, 385473, -2731599, - 5143224, 765578, 7838316, -6453189, 1191317, -6989523, -1705102, 6908992, -116501, -8833674, - 9021579, 891743, 9099425, 629213, -343597, 3745748, 2099702, 4269735, 999654, 2996814, - -998580, 547608, -3532074, 1498944, -2341831, 1415729, 367757, 1392643, -3301219, 182536, - -3134789, -1919850, -1662689, -104690, 1491427, 399432, 774705, 1112933, -249645, 985158, - -261993, -2030983, 1468342, -525060, 1000727, -1852742, 1243930, 42950, 1905355, -1746978, - -1005559, 279173, 2930242, 277562, -1725503, 1086627, - }, - { - 14626511, 33636572, -7126962, -6645388, 8007967, -25297894, -4287451, -3249680, -12026445, -5563057, - -7335268, 8636105, 7939784, -16162499, 2805151, -2667175, 8125005, -1482301, 16750909, -683974, - -8238284, -2529736, 3222836, 4926865, -145492, -8609262, -3719979, -6849399, -3511673, 1714766, - -4459250, -5284958, -6295885, -13422, 687195, 10111427, -6416681, 6901476, -5915781, -5723581, - 523449, -8157754, 1661079, 6218039, 10130217, 1177358, 3741990, 3163780, 481573, 1259499, - 4967667, -1546725, -4757750, -3456375, 114354, -753230, 215822, -1134945, -3564286, -3912715, - 1966558, 55298, -2978560, -5252745, -3736085, 1315334, -792421, 1335735, 450435, -2566243, - 1259499, -2309619, -61740, -2906082, -2845416, -28454, 4035122, 283468, 1914482, -2270427, - 356482, 961536, 343597, -1683090, 796716, 89657, 893890, 1275068, 222801, 1382980, - -154082, -601295, -602906, -68183, 89657, -351114, - }, - { - 1633698, 28687160, 3595425, -408559, 7292318, 2790655, 1161252, -10422275, -5065914, 4804995, - 5150203, -4375498, -2608656, 30769146, 78653736, 21549998, -22196928, -11889543, 5932424, -10497437, - 12584254, 11220065, 2668249, -5143224, -2934537, -14541149, 238371, -1640141, 7199439, -4326643, - 4526896, -6320581, -194347, -2972117, 4667556, -335007, 6762963, 593779, -10127533, 2114198, - 1496259, -6727530, -6926709, -618475, -153545, -6146635, -1114544, 5982353, -5968394, -2224256, - -671089, 1964948, -3794067, 4645544, 3393024, 914291, -6717866, 2990908, -1776506, 2020245, - -4126927, 656056, 2057826, -1131187, -3387119, -449898, 265751, 2454037, -2572686, -1151051, - 690953, 449898, 155156, -1715303, -277025, 2190433, 1784559, 66035, -649614, -603980, - -1002338, 235149, -268435, -2022393, 874563, -512712, 1217086, -1625645, 698469, -827318, - 132607, 1611, 293132, -2800319, -1144609, 251792, - }, - { - 14353244, 16797618, -1596654, -3663607, -2238752, -7489349, 6191196, 1105417, 3269544, -15585899, - -15180025, -20020454, 6326487, -6345278, -47505024, -6615860, 18410378, 16261820, 5556614, 15881178, - 6376953, 2686502, 725850, 3615826, 14356465, 6623914, -8446590, 8855686, 3786014, 4533338, - 16556025, 9380745, -9615895, -3509525, 3137474, 223875, -5377299, -1710471, -4485020, -2987687, - -4357245, 2885681, -5818607, -1538135, -6481643, -2156611, 2193655, -1165547, -1167157, -5370857, - -900869, -6155762, -2834142, -165893, -4909685, 616328, 4548371, 2687039, -499290, -3122978, - -2780991, -4624069, -2656437, 4729833, -621160, 260919, -383863, -2512556, -1624571, -309238, - -1674500, 1649268, 275952, -914828, -1800665, 2467459, -704912, 4243965, -1491427, -3452080, - 1546725, 18254, 1079647, -928787, -2783676, 748935, 2250026, 85362, 1948841, 560493, - -363998, 287763, -173409, -1866163, -615254, 175557, - }, - }, - { - { - 1149441, 31255550, -8657580, 8272107, 1319629, -2571075, 1788317, -4310000, -6483253, 3133716, - 6871411, -19773492, 1708860, -4694936, -3508988, 2205466, -8919036, -944356, -987843, -10065793, - -2815351, -5595269, -12822625, -7055558, 7818988, -5011153, 3252364, -13898514, 3904662, -3234647, - -3833795, 1179505, 1559073, 1418950, -188979, -6116034, 4552666, 3258270, -4486630, -5890548, - 2514167, -1406065, 3619047, -2170569, 811749, -6599754, -1931125, 3741454, -2826625, 6129992, - 4518306, 2510945, 1470489, -2248952, -4830228, 1194538, -455267, -2721399, 2649458, -964220, - -1766842, -753230, 250719, 1563368, -1268089, -2563559, 2371359, -1923609, 5464272, 1709397, - -1074, -2242510, -3228742, 1865090, -1591285, -412317, 2257542, 3165928, 508417, -659814, - 447213, -417686, 1478006, -352724, 12885, 1363652, 51003, 1010391, -1104344, 2121714, - 1436667, 862215, 2202245, 0, -17180, 627602, - }, - { - 3928285, 127469264, 18202072, -86937120, 16760036, 303869, 10386305, 18039400, -1738925, -8843338, - -309775, 25605522, -205622, -1066226, -2589329, 1119376, 6455873, 2903935, 12962211, 2483028, - -5791764, 2400350, -5892159, -4846871, -1208496, -5152887, 3470334, 5858336, -8283382, 4174708, - -510027, 2625836, 2059437, -1869385, 870268, 2399276, 2574296, 7582228, 8863202, 1531156, - -1012002, -5893769, -2157147, 895501, 4160750, -4780299, 1850057, -183610, 10510859, -6209986, - -1898376, 3251827, -1826972, -1845225, -1276142, -168577, -2878702, -3054796, -1205275, -3307662, - 979253, -4643934, -1314797, 1548873, 542240, 3234110, 539555, -1277216, -3930969, 1755568, - -1413044, 801011, -1311576, 472446, -1794223, 2410551, 94489, 947040, 612033, 443455, - -1856500, -1400696, 826244, -1406065, 1157494, -449898, 1399623, -347892, 388695, -856309, - -264677, -273267, 117575, 1571958, -608812, -713501, - }, - { - -4208531, -81110992, 8606578, 34127812, -30116310, 8112657, -553514, -6437082, 11005317, 874563, - 4466766, 10787347, -1664300, 9458592, 9754944, 8915278, 11725798, -7963406, 737661, 26529476, - -13231184, -3084860, 10584947, 4173635, 4034048, 3302293, -6667937, 9787157, 5362804, -770947, - -2686502, 1445793, 3316789, -8979166, 3115999, -1707250, 9741523, -7948374, 2573222, 2469606, - 4763656, -4086125, -2438468, 7595113, -2965675, 5206037, 5515275, -595927, -310311, -2036888, - 6280316, 3401077, 3602404, 38118, 1002338, 2357937, -556735, -959388, -2103460, 13422, - 345745, 777926, -3964792, -652298, 2740726, -928250, 23085, -215822, 2261300, -2955474, - 215822, 1176284, -352724, 738734, 955093, -2432562, -1350767, -2136746, 3760781, 3306588, - -25233, -3036005, 106837, 878321, 2367601, 1169305, -2151242, 242666, -2106682, 2215130, - -2049773, -1342177, -476741, 1370632, 348966, -1104344, - }, - { - -135828, -28561532, -3698504, 7231115, 2057289, -633508, -413391, -5156645, 2194728, -933619, - -8474507, -10138807, 369904, -7291781, 16652125, 7378217, -4613869, 3722126, 17449916, -6606197, - -7119445, -3264175, -6505265, 3291556, -1152125, -7132330, -7263864, -5472325, 7199439, -261993, - 6761889, 5368172, -679142, 6352794, 2716030, -3184718, 2470680, -4167192, 5955509, 563714, - -1754494, 554588, 4599373, 2578591, 2523830, 2324114, 2694018, -2120640, -1518271, -4281546, - -1683090, -3485366, 664109, -547608, -918586, -1524177, 1216550, 2215130, -2054068, 3106872, - 1493575, 1928977, 1142998, -164819, -35433, 644245, -4731444, 894427, -3383897, 791348, - 2530810, -445066, -257161, 588411, -1440425, 1086627, -3293703, -95026, -1594507, 761820, - 649077, 1042066, -4316979, 611496, -296353, 376347, -283468, 131533, -1114007, 811212, - 891743, -517007, -703301, -155156, -1069447, 1005022, - }, - { - -13147969, -10094784, 11083700, 29593936, -7990250, -3782793, 106837, 3392487, -1263257, 4922570, - 8526047, 13681081, 4655208, -5072893, 3737159, -7004555, 1137630, -1476932, 18928994, -2712272, - 4847408, -4590247, 9296994, 10478646, -4720706, 4629438, -5388037, 5319854, 1950452, -3708704, - 110595, 5517423, 2717641, 2525978, 268972, -2563559, -716186, 7284265, 768262, -5015985, - 1732482, 3462281, -1111323, 5207111, 4752918, 2721936, -6459631, 3855807, -1308354, 4760971, - -4135517, -971736, -2594697, 3127273, -2351495, -495532, -5498095, 473520, -2438468, 3797825, - -325881, -536334, -886911, 463320, -416612, 2025077, 2180770, -1373316, 341450, -512712, - -2804077, 1592896, 619012, -141197, 1804423, -1345935, 977105, 112206, 357556, 691490, - -1607392, 662499, 1567126, -305480, -1451162, 874026, -224949, -1007707, 61203, 866510, - -1548336, -856846, -1502702, 1076963, -1144609, 1316408, - }, - { - -149787, 3995930, -7248831, -1147830, 5309117, -128312, 82678, -114890, -920197, -2407329, - 2648921, -4034048, -3971234, -11167452, 45170708, 18908594, 13882408, 904091, 19327, 4163971, - -1356136, 10736881, -6426345, -1669669, 8071854, 986232, 10299332, 1272921, 7952132, -8578660, - 4888210, -9417253, -1984812, 471373, -2566780, -3859565, -1859184, -3082713, 1260036, 2754685, - -3322157, -2277407, -3427921, -1446867, 2222646, 4399121, 5708549, 1855426, 635118, 609885, - 2013803, 79994, 2905009, -821413, -4663798, -2823404, 3980361, -581431, -3193845, 775242, - -18254, -387084, -540629, 2946348, 652835, 1340567, -969052, -442919, -887448, -892816, - 97174, -1353989, -520228, 1733556, 2076080, -362925, 2718178, -2768643, -3721052, -842887, - -1801202, 825171, 518617, 2895882, 454193, -336081, -1044214, -936303, 1352378, 519691, - 1175210, -1455994, -1691680, -438624, 294205, -1247151, - }, - { - -16642998, 37642168, -264141, 44350908, -1636383, 2124398, -5684389, -2497524, 16620987, -13793824, - 2820183, 2996277, 3084324, -1323387, -10509248, 4017405, 31343598, -6111739, 5124970, 5454609, - 4671851, -539555, 3057480, -10308458, 10822781, 6318971, -2208687, -8304856, 569620, -2071248, - 7628936, 10070625, 289910, -1638530, 3551938, 7802345, -3179350, 4327180, 3455838, -1903744, - -595927, -1678259, -580357, -4358318, 10234907, -2571612, 2257005, 3659849, -2812667, 7130720, - 1770600, 659814, 404801, -2356863, 3259343, -1066226, 3154654, -42950, 2501819, 2006824, - -1237488, 331249, -867583, 1325534, -3414499, -2393371, -2107755, 91268, 5698348, 2415382, - -787053, 185757, 1103270, -782758, 817654, 2213519, -1977296, 423054, -1146756, 1761474, - -1973538, 344671, -3351148, -807991, -448824, 1140314, 5369, 376883, -1362578, 341987, - -332323, 210990, 84289, 206695, 1381906, -833224, - }, - { - -369904, -38284800, -13328357, -965294, -4446902, 5624260, 2149094, 3616363, -1022739, -2364380, - -3994857, 8659191, -4364761, -13333189, 2662343, 994822, 21239150, -6716255, -11598022, 1993402, - -3522410, -3694746, -1482838, -10805601, 1270237, -4370129, 4738423, -7490960, -319438, 3999688, - 7267085, 6940131, -3111704, 3010772, 6152004, -1842541, 4843113, -3571265, -8755291, -1163399, - 3059091, -1014686, 6403260, -991601, 2632278, 2753611, 231391, 679679, -1656247, -465467, - 4364761, 2671470, 688269, -2091649, -850940, -1287417, -430034, -1739999, 2870649, 6660421, - 1113470, 2494302, -616865, 3539590, -3259880, 3272228, -1817845, -454193, 412854, 1795296, - 958851, 1952600, -620623, 561567, -2688113, -2459943, 149787, 1239098, -320512, -1626182, - -573915, -449361, -655519, 619012, -242666, -1804960, -1348083, 447213, 149250, 267362, - -114354, -1618666, -1347009, -12348, 676994, -1702955, - }, - { - -20862804, 19301584, 9181566, 52396452, -12221866, -1289027, 3310346, -5848672, 3739306, -1655710, - -16229608, 21267604, -14960982, 2218351, -9272298, -6752763, 16473884, -4607426, -3132105, -6128919, - -6611029, -7451769, -1926293, 4568235, -92342, 11799886, -7974144, 502511, -4858682, -161061, - -1130650, -2481954, -3437585, -2342905, 1818919, 4750771, 1730335, -3299609, 1270237, -681289, - -1226750, -251256, -3597035, 823023, -414464, 695785, 1400696, -3068217, 5099200, -1138166, - -2260227, 2451890, -2006287, 1689533, -1064078, 3354370, -6768332, 1470489, -5979668, 6803765, - -1221918, -2572149, -732292, 646929, 1719061, 1919850, -109522, 661425, -598611, 516470, - -427349, 2348810, 244813, -537408, 1481227, -1060320, 526670, -682363, -870268, 463856, - 205622, -929860, 657130, 790274, -550293, -128312, -62277, -1580548, -2148021, 873489, - -1973538, 9664, -1464047, 1803886, 899259, -699006, - }, - { - -3701188, -14157286, 16251083, -4116726, -2171106, -21832930, -756988, -5726265, 563714, 10375030, - -7293928, -1738388, 14746233, 6352794, 14501957, -3561602, -4290673, -2972654, -8432095, -1659468, - 1905892, -6036577, 3708704, -16279537, -12126840, 4523138, -6199786, 3207804, 5785321, -294742, - 2487860, 5526549, -2537252, -6907918, -6351183, 1397475, 78920, 809064, 3148211, 4769561, - -4716411, -1314260, 2792266, 51003, 3302293, 3867618, -2435783, -3019899, -4875862, 5655935, - -226560, 793495, -1076963, -3038153, 2462627, -4254702, 328028, 4227322, -2899640, 3852586, - 308701, 1447941, -597000, -818728, -2592550, 2972654, -1960116, -3228742, -965294, -1269163, - 226560, -1701344, 1432909, 2790118, -1621887, 229244, -17717, 266288, 2504503, -2077690, - -208306, -85899, -832150, 842350, -2010582, 2035278, -795106, -183073, 206158, 1191317, - -579821, -138513, -1892470, 1078037, -1019518, -710280, - }, - { - 11542725, -68426344, -29792040, -12466679, 21052856, 21870510, 2089502, 3753802, -2350958, 1846299, - -6373732, 4143570, 11722039, -6504191, 1794760, -12444131, -5122286, -16550120, 2108292, -1600412, - -2419140, 753767, -294205, -15477988, 1787243, -3033321, 6054294, -907312, -8615168, -8917426, - -4153234, -7322919, -2760590, -7647190, 5936182, 3179350, 11618423, -998580, 8782134, -344134, - -4293894, -8377334, 7598871, -761283, 2318746, 3467649, -3143916, -2094333, 413391, 348429, - -7601555, -4023311, -3092377, 3555696, 1033477, 3779571, 631897, -2129230, 2237141, 287763, - -85362, -2335925, 2189897, 1178432, -1386738, -882616, -499290, 1285806, -405338, -2129230, - 2187212, -68719, -951872, -1475321, 2008434, -514322, -98784, -98784, 1553168, -1530082, - 1062468, 178241, -1773285, 937377, -223338, -1357210, -1995012, -741419, -2559264, 1163936, - -751082, 1349694, 866510, -532039, 974958, -25770, - }, - { - -1285269, -23409720, -4841502, -3023120, -6915434, 5543729, 4213900, -2934000, 1073205, -1577327, - 10495289, 3817152, -8406862, -8891119, 2895882, -1809792, 1080184, 7004018, -3921305, -187368, - 365072, 8362838, -4966593, 2132451, 6068789, -10151155, 12856985, 14472429, 19413252, -6982006, - -1102733, 9356049, 6808597, 6912750, -6170258, 6187438, -4600984, 8893267, -2912525, 778463, - 360240, 3027952, 951872, 1214402, 595390, -1027034, -3478924, -2986076, 1692754, -2216740, - 4412005, 3175055, 4556424, 402116, -540629, 5067525, 4167192, 2081449, 2968359, 1578937, - -833224, 1974074, -4623533, 255014, 439697, 402653, -529355, -623844, 717260, -59056, - -3957276, -4204236, -2579128, 3425237, -510564, -114354, 832150, 310311, -1304060, 3259880, - -1506997, 6979, 158377, 257698, 2063195, -2040110, 2327872, 459025, -603443, -940598, - -32749, 419296, 691490, 341987, 139586, 320512, - }, - { - -5070746, 68691024, -5311801, -16479253, -9595494, -7754027, -6541772, -3056406, -11530377, -12926241, - 5974837, 1363115, 13936632, -17317846, 9004936, -2388002, 2385318, -1315334, 8161512, -4792110, - 3145527, -5902359, 421981, 10030896, -3898220, 1466731, -7486128, -14026826, -3248606, 1136019, - -1018444, -9388799, 1183800, -2537252, 4164508, 6817724, -11273215, 12204686, -5033165, -4285304, - -1013075, -8164733, -96637, 8002598, 10662793, 6054830, 3034395, 1422708, 1347546, -474594, - 5101885, -2937221, -3317325, -1854352, -3590056, 1035624, -282394, -9664, -1333051, -3685082, - -170188, 1719598, -4212826, -6882685, 2673617, 237297, -4391604, 2330557, -3200288, 57445, - 603443, -936840, 278636, -3190087, -2020245, 1255204, 369904, 2696703, 288837, -1747515, - 1617055, 1297617, -1325534, -1490354, 594316, 1918240, 746787, 729071, -430570, 2723009, - -487479, 312996, -2397129, 963146, -686121, 324270, - }, - { - -1947768, 29174102, 3479997, 5580773, 7178501, 916439, 816581, -11686069, -5541045, 1768990, - 8781598, 1662689, -10702522, -3891777, 134051296, 21170430, -13606993, -19416474, 8837432, 333934, - -5826660, 12996571, 12370043, -8076149, -11290395, -14424111, 3781182, 1235877, 173946, -1240709, - 2566243, -6359236, -1326608, -7828652, 11785390, 308701, 3062312, 1771674, -7409356, -2308545, - 4931696, -11077258, -1389959, -1299765, -4113505, -380641, 1232656, -2813204, -122407, -4265977, - -2110440, 1636383, -3699578, 1338956, 3060164, -3033858, -964220, 919660, -2240899, 3953518, - -6090801, -4909148, 7059853, -3504157, -3001109, 118648, -2145336, 4837207, -5191005, 2094870, - 171799, 353798, -294742, -1430224, -616328, 1090385, 1730872, -2006824, 1902134, 328028, - -962610, -795106, -2039036, 1935420, -1682017, 491237, -415001, 317828, -1733556, 1448478, - 267362, -774705, -1983738, -1068373, -2360085, -92342, - }, - { - -9994926, 52307868, 2322504, -9782862, -10830834, 6233608, 3155190, 3524021, 1378148, -11501386, - -23198728, -12671227, -4678293, -17322676, -48951888, 2399813, 32321240, 5162551, 21235928, 4904853, - 13423383, -6120329, 10122164, 5214091, 10375030, 7667591, -3362960, 7374996, 8109972, 6039261, - 8831527, 11085847, -3215857, -1862405, 1698660, -1267015, -8523899, 2244657, -5353140, -9865540, - 2370822, -1468342, 2236604, -6445136, -2708514, -4306242, 3798899, -1391569, -5155572, -2973728, - -635118, -7285339, 2981781, -6521371, -1979443, 1353452, 6110665, -2328409, -1644973, -2149631, - -4764730, -3624953, -102005, 2537789, -1236414, 903017, -1063004, 1401770, -1415192, -4380867, - -720481, 1522566, 2105608, -1062468, -1444720, 2652679, -891743, 2075543, -790811, -3140695, - 1792612, 492311, 673236, -1149978, -427349, -22549, 1021129, 389768, 265751, 27380, - 579821, 319975, -534723, -1386201, 901943, -76236, - }, - }, - { - { - -811749, 49443664, 12200391, -25987236, -14734422, 5256503, 986232, 1384590, -3481071, 4656819, - 11781095, -6412923, 14505178, -1970316, -10521059, 7330973, 12712566, 19576460, 8520141, -15389942, - 5020280, 9145596, -848793, -632971, 1404991, -8493298, 4165045, -15649787, -524523, -2681133, - -2573222, 2276870, 2292976, -2284923, -5612986, -9747965, 1011465, -2239289, -10125385, -3661997, - 7327214, 4275103, 2509335, -6573448, 5318780, -3204046, -3898220, 1041530, -4331475, 3192771, - 181462, -1073205, 426812, 756988, -1798518, -1258962, -1841467, -1047972, 91268, -6126234, - -1580548, 1190243, 1982664, 2236604, -2025614, -2334315, 2454574, -88584, 5776194, 586263, - -3189013, -219043, 1027034, -294205, -1404991, -142271, 717796, 1313723, 1969779, 1200443, - -107911, -201863, 976031, -721018, 214748, 165356, -1144609, 1034013, -1442572, 861141, - 186831, -391916, 840203, -347355, -529892, -38118, - }, - { - -2596845, 98028872, -1411971, -56482040, 48894444, 7583839, 4537633, -3245922, -4180077, -5537824, - -18447422, 7295002, -4317516, -3983582, 2634963, -5825587, -10718091, -4745402, 7581691, -3347927, - -2554969, 3849901, -5849746, -2680060, 4444755, 4218195, 7661685, 7733089, -12029130, -3167539, - -7348152, -100932, 4523675, -1706713, -4508105, -2769180, -1644436, 2006824, -141197, -4875862, - -3104188, -7775502, -2341831, 149787, 2823941, -4917201, -814970, -4163434, 2368675, -8548059, - -1998234, 2470143, 639413, 267899, 443992, 431107, -1386201, 573378, 281320, -5409512, - 681289, -4410395, -787590, 3220689, -2563559, -605054, -1794760, 2430415, -894964, 747324, - -4500052, 172872, -235686, 2004676, -3015067, 483184, 1787243, 743029, -264141, 2251637, - -113280, -380105, 1224066, -2413772, 1961726, 4832, 888521, -1015760, -1912334, -535797, - 1682554, 1052267, 1795296, 1757179, -692564, -983011, - }, - { - 1167157, -84636088, 4165582, 65485904, -9416716, 7714298, 2027761, -1894618, 8654896, -1061394, - 13346074, 19814832, -4032438, 6253473, 10372883, 355945, 7197292, -436476, 1814087, 19432042, - -7980049, 4992900, 7817914, 3020436, 1835562, 277025, -4940286, 8779987, 830539, 1044214, - -7030862, -3760244, 11401528, 1758252, 4552666, -2720862, 7373385, -9396852, 2566243, -4825396, - 3593277, -2127083, -4290136, 12033961, -1354525, -4602595, -1451699, -1883880, -1228898, -1709397, - 4721243, 1252520, 1722819, 218506, -1633161, -1649804, 129923, 2687039, 2464238, 1836635, - 2141041, 3509525, 21475, 956167, 1600949, 551366, 1544041, -2072859, 2983929, -4250407, - -2190433, 214748, 631360, 908386, 251256, -2434173, -808528, -2185602, 600222, -936303, - -1455457, -2951716, -509491, 121870, 795106, -257698, -1701881, 1171452, -1113470, 2593087, - -1329292, 111669, 27917, 1389959, 598074, 44560, - }, - { - -1607928, -27254788, -1809255, -969052, -3727495, -877247, -2404108, -1321776, 2968896, 627602, - -1756642, -11672647, 79457, -8129836, 2726767, -2558190, -15899969, 25233, 18166638, -8286603, - -1060857, -2639258, -15376520, 2799782, -4326106, -8982387, -1232656, -4711579, 4076461, 468151, - 6133214, 8766565, -1969779, 4221416, 1743757, -2341294, 3061238, 1165547, 10606422, 3585761, - -3796751, -32212, 5796595, 2301566, -4490389, -4844186, 196495, -1129040, 4192962, -4564477, - -1969779, 2098092, 2880849, -1675574, -541703, 258772, 625455, 1693828, -1953136, 557272, - -814433, -614717, 382252, 1740536, -765041, 2692945, -1166621, 2818572, -1685775, 1245541, - -397821, -2354179, -484258, -1223529, -2201708, 537408, -1691680, 2438468, -310848, 1717987, - 1229971, 1171452, -1718524, 1130113, -2587181, -376883, -151934, 424128, -813896, 540629, - -41339, 566936, -317291, -1102733, -1028108, 1971927, - }, - { - 12816719, 16492138, 9426379, 40597104, -2695092, 3129421, 663572, -2257542, 2507724, 9600326, - 1748052, 7710003, 9104257, -4181151, 4349728, -5091684, -2984466, -8475044, 12649752, -6251325, - -1626182, 1002875, 4739497, -9186935, -7775502, 4397510, 1249299, 23625004, 7131257, -6781754, - -1962800, 5360119, 455803, 4030827, 6438156, 175020, -5658083, -1778117, 2098629, 951335, - 5290863, 6647536, -156229, -306553, 1126355, 4090956, -5103495, 3064996, -5108864, 3515431, - -1450625, 315143, -7196755, -1855426, -4485557, 1796907, -1492501, 2983392, -1187559, 2799245, - 1660542, -643708, -1442035, 1195612, -295279, 699006, -755914, -4252018, -148713, 1103270, - -2306398, -628139, -1396401, 1633698, 4544613, -226560, -27917, -1458141, -1129040, 216359, - -2267743, 420907, 1102733, -945967, -3728032, 956167, 905164, -347355, 628676, 1854352, - -1034013, -4832, -251256, 1488743, -412854, 1603633, - }, - { - 1576790, 15247671, -3168075, -3479461, 3623879, -1215476, 1174137, 547608, 1637993, 5681168, - 2263448, -10934987, -9036611, -23354958, 33403034, 6686191, 1663226, -5862631, -2857764, -264141, - -10580115, 5047124, 11781095, 10931766, 1121523, 67646, 6550362, -6385543, 7929047, -3052648, - 11615739, 2314987, 5737003, 3505230, -1096827, -814433, 4072703, -2204929, -2274722, -4800700, - -3055869, 3289408, -3226057, -2078764, 394600, -195421, 3897146, 461172, -1985349, -2054068, - 1027571, -1094680, 653372, 192737, -1141924, -4089883, -282394, -1184337, -217433, 2961917, - -1385664, -2361158, -2410014, 2252710, -672162, 1653026, 691490, 805306, -416075, 772020, - 1042603, 1868848, -1160178, -2339684, 343597, -1336809, 4228932, -332860, -1663226, -1391033, - -3005940, 2719788, 78383, 1600949, 59593, -1654636, -1293322, -104690, 318364, -1206886, - 950262, -196495, 269509, 605054, 658204, -299037, - }, - { - 11186779, 67065916, 613107, 53717692, -1391033, 4291209, -1051730, -9183714, 9592809, 2513093, - -1743757, -9414031, 14232448, 12565464, -45097, 12120398, 33846488, -9683004, 1402307, 6979, - 1892470, 2058363, 10079751, 2445447, 6379637, 668404, -3045669, -4748623, 2808909, -3285113, - 4500052, 6822556, -3112778, -7968238, -947577, 1370095, -6675990, 3735011, 4783520, -1799591, - 1961190, -18254, -2797098, -4952634, 3786014, -6376953, -2953864, -3859565, -5552856, 1220845, - -1518271, 539018, 869731, -15032, 4709432, -927713, 2232309, 1320166, 2114198, -506269, - 268435, 2580739, -1655173, 2626909, 710280, 1111323, -1207423, -2206003, 3060701, 2818036, - 719944, 2336462, 2384781, -505732, 420370, 1052804, -594316, 3537443, -1586454, 330712, - -3112778, 2195265, -982474, -5906, 185220, 1155346, 1198296, 1232119, -2627983, -535797, - 1504312, 480499, -245887, -80531, 960999, -1624571, - }, - { - 3331821, -2354716, 8230768, 14755360, 3757023, 2727841, 3804267, 2021319, -5211406, -274878, - -5057861, 963146, -1939178, 2000381, 15141907, 4346507, 10162429, -11077794, -7053410, 7609072, - -18790, -955093, -1975148, -6838662, -1682017, -15392626, -1600412, -7945690, -2449205, -260382, - -6422587, -5398774, -1591822, 3984656, 5744519, -5525476, -1983738, -9286256, -7447474, 2702608, - -1102733, 880468, 8011188, 165356, 2570538, -446140, 829466, 2688113, 403727, 1559073, - 2033667, 3428995, 2397666, -2122788, 3446175, 913217, 1074, -354872, -747324, 1134945, - -2800856, 2835752, -3250217, 3247532, -3335579, 1798518, -62277, -2681670, -1012539, -484258, - -2772938, 159451, -2479807, 315680, -723165, -1466195, 1049583, 4372814, 1516124, 85362, - 1452773, -1240172, -2316598, 640487, 690416, -463856, -91805, 1823214, 307627, 701153, - 995896, -576063, -425202, 98784, 1465121, -2011118, - }, - { - 19276886, 65860640, 10897943, 71233640, -5573794, -127238, -1175210, -18450642, -4771709, 1371168, - -26909044, 8442295, -12574054, 729608, -26113938, -11876121, 21395380, -13248900, -9394704, -6471979, - -8861054, -10384157, -1787780, 3303904, -2182917, 10741713, -3464428, 6847789, -431107, -1157494, - -2614025, -10154376, -13726715, -5354214, -5158256, -2417530, 1194001, 478889, 5929203, 4577899, - -2383707, 234076, -4219269, 1530619, 331249, 2364380, 4625143, -4656819, 1145146, -11811, - -3036005, -790811, -3763465, 289373, -3451006, 2738579, -7179575, 3095598, -1791001, 7400766, - -2426120, -3970161, -3122978, -3365107, -4403415, -858993, 2660732, 2165201, 2011118, 3425773, - -895501, 708133, -444529, -2950643, 1414118, -2598455, -2514167, 685047, 1589138, -116501, - 1018444, 712428, 2523830, 397821, -2630668, -452045, 560493, -965294, -1625108, 456877, - -1037235, 916439, -2049236, 976568, 628676, -640487, - }, - { - 2161442, -24640228, 3652870, -2398739, -4779762, -98784, 21160230, -17069274, -15615427, 15982110, - -557272, -7281044, 159988, -14288819, 5673115, 1197222, -100932, -8074002, 2969970, 8151848, - 4925254, -2643552, -27917, -12145094, -12910135, 3429532, -1480153, 197569, 4645007, 5910412, - -833761, 6534256, 9587978, 759136, -9123047, 326954, 5890548, -552440, 2641405, 16565689, - 4475356, 1049046, 2341294, -6871411, -3810173, 3794067, -2121714, 1635309, -5800890, 2271501, - 2799782, 1489817, -304406, -6235756, -2244657, -6863358, 6442, 6125697, -3533684, 3433290, - 1079647, 529355, -2327872, -2907693, -853625, 3317862, -1983201, -1460826, 3104725, 1169842, - -198105, -2371896, 826244, 1064078, 983548, 1041530, -1759326, 2109366, 6076842, 995896, - -863288, -897111, -248571, 2179696, -1234803, 922344, -825171, 332323, -412854, 1494649, - -3221, -274878, -849330, 2054068, -913754, -294205, - }, - { - -11192148, -88514448, -17909476, -5229660, 14723148, 6447283, -730681, 5546414, 7036767, -3738232, - -4540854, 6597070, 22847616, 11977590, 8811662, -14886894, 3729105, -5560909, 7906498, -140660, - -2640331, 2636036, 5298916, -5658083, 9314173, -11416560, 3921842, 3069828, 2774549, 5128728, - 8995272, 4085051, -4212289, -9473087, 362925, -13761075, -508954, -989990, 8536248, 3537443, - 4865661, -2065342, 6137509, -1376000, -797253, -2246805, -5746666, -4353486, -2123861, -2035815, - -100932, 2364380, -3454764, -1512365, -1074279, 4837744, 777389, -3344169, 1577864, 53150, - 3452080, -1080721, -1193464, -2122788, -2753611, -1615445, 787590, 1886028, -230318, -1400159, - 1557999, -937914, -2685428, -380105, 4337917, 243739, -535797, -14496, 2108292, -870268, - -355945, -1538135, -2956011, -103616, 358630, 2229088, -770410, -1184874, -1771137, 1420024, - -936303, 1490354, 628676, -1257889, -414464, -1022739, - }, - { - -369904, -25200184, -2398739, 2367064, -9456981, -4017942, -4103305, -689342, -261993, -367220, - 3019362, -1551557, 6869264, 16307991, 7289097, -2528125, 8904541, 13664438, -10298258, -6358699, - -5276904, 3173444, -5565204, 5711770, 17125646, -615254, 4013110, -6868727, 5865315, -9002251, - -9142912, 845572, -2150168, 4416300, -7931731, -3192771, -3861176, 15754477, -1147293, -1120450, - -1259499, 1218160, 1158031, 3969087, 1129040, 7203197, 2728378, -7270843, -4502200, -2066416, - 1883343, -4180077, -1611687, -1656784, 1772211, 3542274, -2844342, -4312147, -763967, -213138, - 797790, 1416266, -4742181, 1620276, 2450816, 2863670, -1269700, -2021319, 3292629, -540629, - -3019899, -1212255, -2176475, 4682051, -637803, -83215, 1307818, -1231045, -2752000, 2418067, - -2481954, 915902, -260382, -1833951, 1657321, -2622078, 1833414, 1458141, -139050, -178778, - 524523, 537, -537945, -1101122, -826244, 87510, - }, - { - -8252243, 48535276, -13069049, 3263638, -3866544, 10670309, 8231305, 5261872, 1642288, -13250511, - 1989644, -6312528, -5513128, -22651120, 13551159, -9540196, -2883534, 4892505, -4224101, 2396055, - 18032420, -3524558, 4941360, 2578054, -2273648, 13696114, -4217121, -4427038, 7512972, 556735, - 1550483, -1647120, 11395622, 2227478, -3042984, 284542, -6296959, 12805445, 1049583, 4226785, - 4328790, -5298379, -854699, -1132261, 937914, -1234266, -2141578, -1580548, -4707284, -5208185, - -514859, -2064806, 4454418, 2075543, -1829119, 5871221, 999654, -979253, -2507724, -2684892, - -1261647, -713501, -226023, -2361158, 1947231, 1252520, -3155190, -1629403, -5595806, -1297617, - -1248225, -1767916, -113280, -1033477, -364535, 2154463, 1432909, 2644626, 166430, -1250372, - 1673427, 1224603, -461709, 542777, 1113470, 1598265, -747861, -924492, -2650532, 1810866, - -242129, 1482301, -1753420, 610422, -1055488, 841277, - }, - { - 2007897, 22851374, -7220377, 1945620, -1445793, 929324, 9372692, 1820529, 4915053, 194884, - 4914517, 577673, -7917236, -28599650, 80781896, 13974750, 9496173, -2035278, 15582141, 14845554, - -12919798, -3543885, 4715874, -14129906, -14998563, -4330938, 3479461, -11074036, -1628330, -3829500, - 778463, 1759326, 1467268, -5522254, 7039989, -4960687, 4541391, 3696893, -3942780, -1908039, - 2910914, -5354214, -49929, -2563559, -2224793, 1282048, 4411469, -1637993, -913217, -2065879, - 531502, 2859911, -9004936, -10558640, -1793149, -1722282, -217433, 1520955, -2246268, 2764885, - 469225, -3563749, 2319819, -46708, 2241436, 207232, -5375152, 2343442, -3616363, 4090956, - 45097, -2794413, -1976222, -576063, -2046015, -379031, 2147, -2263448, 1304060, -181999, - 1392106, 481036, -760209, 3136400, -2691334, 207232, -528818, 1991254, 555125, 562641, - -284005, -419833, -1518808, 505196, -2115272, 227096, - }, - { - 1142998, 61005716, -7754564, -24566676, -12037183, 24122684, 14116484, 6469832, 800475, -1942399, - -14015552, -4101694, 550293, 17709760, -1406065, 9089761, 27057758, 2554432, 14737107, 4330401, - 11686069, -12989055, 12746926, 3847217, -3211025, 2724620, -427886, 12156368, 11362873, -7421167, - -5913633, -1721745, -5682242, -967978, 4353486, 1348083, 1045288, 5340792, -6378027, -3739306, - 9183177, 4362613, 8613557, -7172596, -1282048, -3350075, 1835025, 586800, 2912525, 434865, - 381178, -5812702, 2037962, -3584687, 1671279, 3559991, 6313065, -1247151, -2871186, -3616899, - -2888903, -601295, 1603633, 1006633, -507343, 697932, -1928977, -723165, -675384, -2200097, - 201327, -246424, 2120640, 4314832, 916439, 708670, -3841848, 1070521, 1205275, -3053185, - 291521, -271657, 574452, -419833, 365609, 183073, -796180, -239444, -33286, -1385664, - 1284195, 300111, -700080, 344134, 2542084, 712428, - }, - }, - { - { - -981400, 51845088, 10529649, -39899708, 6249715, 1483374, -2984466, 6328098, -2798171, 5464809, - 8562017, 2840584, 2082522, 4316979, -9384504, 10744934, 17311940, 17083232, 5609764, -13262859, - 8159901, 1719061, 6227166, 8866423, -11613592, 3457449, -12905840, -1655173, -3707094, 1399086, - -6398428, -6061810, 5120138, 1581085, -11900818, -5218922, 4355097, 324270, -11045045, -1878511, - -420370, 4439923, 7073275, -6776385, 2980171, -2077690, -2488934, 3732864, -3541738, -1976759, - 1918240, 1418413, -3973919, -1098975, 4846334, -888521, -5010616, -763430, -3581466, -5438503, - 2327336, 1074, 1300301, 165893, 538482, 2403034, -2531883, 3706020, -438624, 1904281, - -1887638, 446140, 2916283, -1138703, -1356673, -277025, 1092532, -1337882, 1433982, 2304250, - 135291, 2650532, -1594507, -444529, 843424, -1299765, -1634235, -421981, 783832, 626528, - -828929, 100932, -198642, 1557463, -1203665, -618475, - }, - { - -37581, 126462088, -19444928, 3119220, -23490250, 16802986, 12697534, -20459076, 3763465, 2266132, - -10306311, -19952808, 7059316, -7024419, 3998615, -5387500, -10106595, -2914672, -6550362, 3339874, - 7690139, -8196945, -1912334, -2156611, 5093831, 5080947, 1522566, 7376070, -2159295, -9827959, - -4640176, 1139777, 1727651, 688805, -3878892, -213675, 187905, -1791538, -2694018, -3731253, - -4159676, -9987410, -1486596, 38118, -14496, 4233227, -8268886, -2143189, -4407710, 1348083, - -4723927, -443455, 2328946, -1416802, 847182, -20938, 33286, 5130339, -5522254, -2519535, - -1788317, -205085, -418222, 450435, -2422899, 844498, -5389110, 3220689, 1796370, -1562831, - -4533338, 1131724, 1032403, -1286343, 304943, -2467996, 2477659, 2047626, 264677, -159988, - 994285, 217970, -199179, -1072668, 1632625, 538482, 468151, 147640, -2787971, -156766, - 1354525, -13422, 2920041, -301185, -5906, 614717, - }, - { - 2704219, -102313104, 16855062, 51069844, 1140314, 4874251, 6732898, 9679246, 1077500, 1996086, - 386010, 25221658, 8458938, 1411971, 12036646, -1110786, 1675037, 1425929, 12570296, 4138738, - -3024194, 11332808, -1695438, 6782290, -229781, 124017, 1677722, 1241246, -1930588, 2334315, - -890669, -3285113, 14023605, -41339, -2696166, 10988137, -7415798, -6825777, 5639829, -5346698, - -4143033, 3711389, -4737349, 6900939, 1653026, -5967320, -1368484, -989453, -4290136, 4592394, - -506269, 3557844, 3462281, -3244848, -4597226, -5296769, 3643743, 3539053, 1705639, 3702799, - 2499134, -340376, 3583613, -624381, 100395, -1497870, 5986111, -2356327, 1210107, -2920578, - -1236414, -2559264, 340376, 133144, -1060857, -592706, -2631741, 807991, -834297, -3415573, - -1270774, -426276, -1216550, 695248, 74625, -1709397, 62277, 192200, 1557463, 218506, - -176631, 226560, 143345, 1615982, -840740, -111669, - }, - { - 1921998, -28099286, -5528697, -5465346, 954557, -1467805, -4837207, 3765076, 2332167, -115427, - -396211, -13226352, -1106491, 2498597, -9866077, 4661114, -16009491, 1070521, 9131100, -2771328, - 2101313, -1173600, -18889266, 3171833, -4839355, -11933030, 5382668, -5530844, -6393596, 8398809, - 8745627, 6849936, -4399121, 7789460, -8067023, 13348758, 19327, 3445101, -1269163, 10449119, - -10820633, 5364951, 3451006, 1975148, -2910377, -4648765, -197032, -176631, 5287105, -3260954, - -4852240, 2907156, 1043140, -597537, 803159, 950262, 99858, 1034013, 107911, 2490007, - -247497, -2101313, -2445984, 3612068, -3327526, 1869385, 597000, 289373, 2895345, 1296543, - -543850, -3655554, 387621, -2207076, -537945, -804233, 1487132, 672699, 88584, 1506997, - 1179505, -475131, 995896, 1450088, -3240553, 60666, -675384, 976568, -485868, 29528, - 50466, 1358283, -537945, -1496259, 238371, 896574, - }, - { - -6869800, 40854804, 44023, 48129404, 3712999, 932545, 5403069, -2554432, 4202626, 10170483, - 1760400, 1529008, 6505265, -2033130, -1692217, 1322850, -4241817, -5755793, 6201396, -342524, - -10863046, 10960757, -4573067, -16236587, -5987722, 9588514, -1286343, 18836652, 10386305, -1493575, - 3451006, -4931696, 4252018, -1274532, 10413685, -1020055, -25233, -6788196, -1739999, 5253819, - 5983427, 2924336, 1283122, 1831267, -4482872, 2858301, 3263638, -662499, -7892540, 4078608, - 3480534, -3127810, -7294465, -5287642, 2406256, -1258962, 1687922, 1961190, 151934, -1075352, - 1986959, 571231, 1939178, 1378685, -2911988, -107911, 547608, -4246649, -1817308, 1322313, - -572304, -818728, -2614561, 1970853, 2851322, 3338263, -2508798, -440234, -2505040, 1197222, - -2210298, 1061394, 24159, 99858, -2856153, 218506, 190589, 1846836, -370441, 1663763, - -383863, -1457605, 320512, 838056, 1292785, 536334, - }, - { - 8590, 8035884, 10741713, 1102733, -3884261, -535797, 336618, 2062658, 3326989, 2083059, - 4079682, -13360033, -8660265, -17907866, 32016296, 5316633, 3629247, -14127758, -2754148, -8634495, - -4976257, 3762928, 13329968, 13852343, -1647120, 2291902, -2480344, -3088618, -5195837, 7732015, - 4323959, 5389647, 1136019, 1628866, 2677375, 813359, 4196183, 1106491, -2223719, -5223754, - -1030792, 164819, -4989679, 1523103, 2313377, -3139621, 1277216, 537945, -2278480, 812823, - -944893, 890132, -2219961, 3345780, -1011465, -2140504, -6003291, -1152125, 2156074, 3520263, - -4100083, 734439, -2541010, -499290, 839129, 134218, 1766305, 1152125, -329102, 1804423, - 313533, 1821603, 286152, -746787, -1653562, -396211, 3001109, -722091, 89121, -2456185, - -1476932, 1356673, -828929, 1938641, -92879, -1472637, -423591, -923418, -447750, -1488743, - 794032, 657667, 450435, 991601, 229244, 98247, - }, - { - 555661, 80521512, -4786741, 63122060, -4601521, -1675574, 5242545, 1433445, -9195525, 13478144, - -2238215, -11199664, 17849884, 1126892, 16055125, 11900281, 16445967, -7672422, 2359011, 8826158, - -9361418, 10993506, 1722282, 22278532, -6708202, -2695092, -6321118, -4469987, 1629403, -1433982, - 951872, 5883032, -5573257, -5473399, -3009162, -5849746, 2610266, 1629403, 748935, 2221035, - 2181844, 1363652, -2819109, -108448, -2007897, -7271380, -4460324, -517007, -4117263, 669478, - -3968550, -4529580, 8085813, 779537, -102005, 1733019, 2333241, 1086627, 2570001, -1866163, - 1432909, 5133560, -2702071, 1681480, 2768107, -1762010, 1302449, -643171, -981937, 2095944, - 2124935, 890132, 1471026, 543850, 1473711, 282394, 326418, 2476049, -1629940, -501974, - -544387, 544924, 1871532, -1535988, 1184874, -486942, 2316061, 210990, -2222109, -412317, - 1104880, -446677, 796180, 521839, -529355, -851477, - }, - { - -421981, 33929704, -5997385, 8229694, 9929428, -1296006, 4783520, 2108829, -6881075, -4426501, - 7240241, -2981244, -5334350, 8051990, 19224810, 8607651, -9263171, -10003516, 343061, 16360604, - -2297271, 3478387, -12481175, -339839, 3673271, -19408958, -8283382, -4157528, -9814537, 12805982, - -19658602, -8730595, 8547522, -814433, 12178380, -2776160, -16139413, -1766305, 3597035, 1489280, - -5767604, 4995047, 2230699, 7566659, -4504884, -1298691, 2651069, 3218541, 2705830, 6272263, - -8032663, 5544803, 1766305, -1730872, 2833605, 2729989, -2663417, 857383, -637266, 333397, - -222265, -2238215, -476205, 4242891, -3817689, -25233, 977105, -1108102, -2188286, -1465121, - -2571612, 479963, -3332358, 65498, -925565, -1109175, 1159104, 3821984, 2415382, 599685, - 1546725, -581431, -2202781, 772020, -39728, -1027571, 943282, 1474248, 781684, -335544, - 415001, 1566053, -306016, -1013075, 1922535, -1594507, - }, - { - -10428717, 112048720, -2241436, 78006808, -4555887, -9418326, -492848, -12322261, -2214056, 1964948, - -14054207, -5851893, 8572755, -14697378, -15470472, -2349884, 5437966, -9571871, -8099235, -9190693, - -9103183, -3381213, -4408784, -4479114, 3435974, 2544231, 3901441, 4153770, 1800665, -3298535, - -3072512, -6722161, -14130442, -845572, -13458817, -1625108, 3000035, 8297877, -3748433, 4605279, - 106837, -4372814, -3066607, 4906464, -2309619, 5306969, 1222455, -4184909, -2752000, 1697049, - 1794760, -5849746, -4473746, 399969, 1447404, -3592203, -2149631, -588947, 3572339, 1173600, - 328028, -1965484, -1128503, -5039608, -6055367, -3570729, 4196183, 1661079, 3741454, 787053, - 404264, 643171, -221191, -5705327, 2426657, -1207423, -4603131, 546535, 2670396, 97174, - 240518, 1722282, 2930242, -1166621, -2172180, -590558, -37581, 223338, -1461363, -292595, - 546535, -736587, -478352, -565862, 777389, -70330, - }, - { - -1543504, -35333084, 625992, 5914707, -6172405, 12646531, 7489349, -15818901, -11777874, 11952894, - 2210835, -5677410, -860604, -4839892, -5037460, -5793374, 7019051, -1979443, 2186138, 10092636, - 4891968, 2148021, -10450192, -3716221, -4349192, -5114769, 1082332, -1235877, 460098, 14126684, - -8304320, 3882651, 16652125, 2434173, -13422847, 1412507, 7939784, -552977, -1705639, 15873662, - 12642773, -2653753, 191126, -7859254, -838592, 2212445, 1793149, -1918777, -468688, -4645007, - 2850248, 1527935, -2811056, -2939905, -970126, -9575093, 585189, -545998, 1571421, -464930, - 964220, 52613, -1914482, -3038153, 2238215, -841814, -1072131, 475668, 2434173, 731755, - -785442, -748398, 2484102, -20938, -127775, 2106682, -2381023, 1115618, 4051765, 4801237, - -1429150, -870805, -654983, 2461016, -1648194, -508417, 1151588, -267362, -749472, 645319, - 591095, -1824824, 1666447, 314069, 405338, -827318, - }, - { - 9378598, -138181984, 11348377, -2073932, 11179800, -30580704, 43831752, -2158221, 2929705, -19864, - -666257, -3810710, 24065238, 4854924, 12892418, -13875429, 13959181, 855235, 3692061, -6532646, - -192737, -3167539, 6241125, 2833605, 4291746, -6134824, 6231461, -6704444, 8701604, 13383655, - 87510, 6002754, 1357747, -10098542, -7217156, -2542084, -7795366, 1975148, 4515621, 754304, - 8508330, 5165235, -1923609, 121333, 2565169, -5415954, -4744865, -6473053, 2501282, -5563594, - 2748779, 1348620, 538482, -4674535, 1054415, 2448668, -712965, -791348, 260919, -2905009, - 4857071, 1329829, -2884608, -3756486, -1520418, 1041530, -1467805, 2334852, -362388, -133681, - -778463, -80531, -2178622, 727460, 1808181, 1213865, -1067299, 440771, 1516660, 868657, - -2708514, 39192, -1478006, -2180233, 274341, 2410551, -1419487, -1188632, -91268, -461709, - 1027571, 335544, 599148, 689342, -1816234, -495532, - }, - { - 1069447, -34568044, 372588, 4169340, -4484483, -1101122, -12209518, 3663070, -1101659, 2945274, - -16574279, 6487548, 5913096, 13695577, 17222282, -7846369, 8925479, 15192910, -19535658, -4323422, - -2129230, -103616, -2972117, 1368484, 18375480, 392453, 10694469, -2053531, -10070088, -4884989, - -7886634, -5658620, -11026792, 10128070, -574452, -6025302, -221728, 5311264, 2401961, -2718714, - -2579665, -835908, 4722854, 4481262, -716186, 5891622, 428423, -5940477, -1496259, 292595, - -2330557, -3368865, -3043521, -327491, 1352915, 5790690, -6951942, -15032, -1412507, -2608119, - 489089, 332323, -565325, 1843615, -671089, 1990181, 271657, -1880122, 2338073, -1073742, - -808528, -192200, -1737851, 2924336, 974421, 755377, -1226213, -1005022, -1175747, -327491, - -2348810, 3328063, -706522, -2595234, 944893, -1334124, 748935, 1568737, 675384, -1284195, - 659278, 798327, -641561, -1722819, -712428, 1522566, - }, - { - 18575734, 2554432, -10027675, 12652974, -5210869, 25620016, -6183679, 12804371, -1899449, 4966056, - -19053548, 9561134, -20956756, -13787919, 40802, -5761699, -347892, 11767137, -6208375, 4330401, - 10129143, -567473, 8382166, 2857227, 1991791, 7668127, -4501663, -1872069, 3509525, 1265942, - 6907918, -11630771, 13108777, 2379949, -3748970, 869731, 4981089, -732292, 6228777, 1765232, - 8035347, -165893, -2451890, -4509179, -3322694, 1242319, -1909650, 188442, -9643812, -1247688, - -4622459, -1807108, 4687957, 3934190, -3011846, 4612795, -674310, -2349884, -763430, -1642288, - -3013457, -1341640, 665183, 537408, -2245731, 1851131, 1991791, -4879620, -5364414, -1964411, - -2816962, 49392, 61740, -1007707, -431107, 1359357, 2647847, 2020782, -1559073, 306553, - 2317135, 1353989, -557272, 1356673, 534187, 214748, -389231, -203474, -2747705, 1374390, - -92879, 455267, -1080721, 763430, -725850, 485868, - }, - { - -3101503, 27545772, -5514738, -374199, -6332393, 5761699, 11090679, 2708514, 6798933, 2262374, - 381178, -3194919, 4417374, 53789096, -36862092, -381715, 13995151, 16452409, 4672925, 12570296, - -6505802, -7532299, -2937221, -9759239, -17507898, -3843996, -3517578, -6373195, -4398047, 3607773, - 1002875, 9114457, 31675, -1607928, -3949759, 141197, 2799245, 4205310, -2893734, 2005213, - -1126355, 1018444, -410706, -3934190, 1785633, 1666447, -3962644, 1426466, -3385508, 4362076, - 1207423, -139586, -5724118, -9613747, -7316477, 2279554, -1730335, -1027571, 3538516, -1576790, - 3272765, -657667, -4228396, 3975529, 4833449, 197569, -4472672, -521839, 3008625, -284542, - -727460, -1640141, -3426847, 890669, -3103114, -210990, -1375463, 1696512, -1888712, -308701, - 1950989, -368830, 1433445, 1197759, -698469, -690953, -721555, 1168768, 2121714, 459562, - -1670742, 1085553, -1421634, 570157, -18790, -1372242, - }, - { - 9534291, 45748380, -3171297, -30621506, 2518462, 19943144, 13248900, 4379256, -5323612, 5367636, - -3631932, -1022202, -17037062, 3813931, 45746772, 7330436, 4153234, 16689169, -1221381, 10007274, - 1100049, 132607, 5122822, 2209761, -8138963, 7136625, 11238319, 2943126, 2712809, -12229919, - 2956011, -11684995, 1369021, -1809792, 4938139, -7378754, 7552700, 571231, 3330747, -2165737, - 6686727, -203474, 13225278, -1937030, -3674345, -3209951, -5120138, 2335389, 2976412, 2819646, - -3413425, -1751810, -5228586, 5601174, -630823, 3868155, 3559454, 821413, -2244657, -3992172, - -2487323, 269509, 4029216, 799938, -5014375, 821949, -49929, -2186138, -903554, 940598, - 813359, 575526, 434329, 3875671, 595927, -824097, -1719598, 329102, -35970, -1965484, - 1418950, -630286, -871342, 1611, 478352, 505196, -1557999, -326954, 1537061, -3134789, - 1592896, 1295470, -501437, 835371, 1006096, 887985, - }, - }, - { - { - 1968169, 37911676, -4532264, -9005473, 26009786, -527744, -6450504, -3251827, -9100499, 3974992, - 121333, -7848516, -1990181, 9692131, 230318, 9660455, -3808562, -6896107, 1801202, -1799054, - 16534550, 540092, -3971234, 8573292, -11667816, 3116536, -11417634, 6971806, 119185, 2092186, - -9789304, -10280004, 3294777, 1168231, -3717831, -3165928, -595390, 6702834, 690416, 1526324, - -3039226, 6607271, 9147207, -4114042, 2869038, 2019708, 6680822, 7039452, -2786360, -2453500, - 2841658, 3192771, -2957622, -680752, 5657546, 1445257, -5505075, -486942, -93416, 1533303, - 3223373, -2455111, 121870, -1436130, -811749, 477815, -3196530, 3380139, -753230, 1131724, - -1419487, 1947768, 3417183, 31139, -1329292, -872415, -418759, -2152316, 218506, 2163590, - 69793, 3227131, -1469416, 861141, -304943, -1907502, -692027, -354872, 1432909, 1196685, - -119185, 781684, -624381, 639950, -727460, 513785, - }, - { - 2043868, 190358320, 19965156, 53814868, 9767293, 7145752, 15769509, -68719, 13427142, 9983115, - -3948149, -36134632, -2856153, -4949950, 11701102, 4573067, -10218264, -8599061, -4228396, 1970316, - 2168422, -2491618, 3116536, -4400194, 1648731, 2505577, -1122597, 3524558, 7756174, 610422, - 217433, 1875827, 4038343, 8754217, 809601, -4034585, -5551245, -2199560, 1954747, 3299609, - 361851, -5061619, 5430986, 649077, -2862059, 2594160, -4740570, 2234457, 2705830, 7416872, - -2811593, -749472, -1264331, -6621229, -3409130, 2083596, 1294396, 2772938, -5081483, 1177895, - -4205847, -469762, 1946157, -856309, -367220, 4143570, -4224101, 1160715, 1177358, 1297080, - -2066416, 348966, 1671279, -763967, 1819992, -3602941, 482647, 1051193, -945967, 205085, - 329102, -1549410, -180389, 556198, 1320703, 1898912, 1435056, 505732, -1351304, -796716, - 882616, -8053, 1695975, -381715, 1405528, 625455, - }, - { - -5552319, -112415400, 12339441, 614180, -30407832, 6821482, 7882876, 8053601, -2807835, -4105989, - 858993, 34320008, 9681393, -367757, 13808857, -1073205, -628139, 2590939, 15553150, -8288750, - -9208410, 11718281, -3153043, 6745783, -9116605, -7006703, 557272, 2678449, 3509525, 3671660, - 3291556, -2877091, 8829916, -3952981, 2847027, 12119324, -15141907, -7611219, 5107253, -5009006, - -8479339, 445603, -2865280, 3971771, -547608, -1219234, 2833605, -2713346, -8000987, 5338108, - 2530273, 1678259, -411780, -4627291, -1399086, -4550518, 1205275, 1878511, -418222, 4035122, - 1439888, -4735739, 566399, -3746822, -2047089, -4308389, 5178120, -2215130, 336081, -301721, - -682363, -3452617, -2229088, -2884608, -2083059, 62277, -1041530, 2469606, -1343251, -2334315, - 2469069, 1768990, 410706, 1255741, -296353, -518080, 1555315, -103616, 1332514, -84289, - 1049583, 1313186, -472983, 316754, 70867, 772020, - }, - { - -1738925, -12582644, 13608067, -7244536, -1539209, 739808, -776852, 6194417, 1437740, -1551020, - 5077725, 2035278, 7235946, 2081985, -15410880, 10093710, -327491, 7127498, 8577050, 201863, - -162672, -570694, -11989938, 4136054, -8300025, -10224707, 12409771, 4723927, -1897839, 8964134, - 5495948, -2406792, -5129802, 6449967, -5009006, 17813914, 5609764, 716186, -13236015, 8624831, - -6301791, 4864588, -2016487, -1071058, 620086, -3809099, -99858, 66035, 3848828, 550830, - 1358820, 2027225, -1341640, 1242319, -1543504, -3747896, -1136019, 1289027, -656593, 3260954, - 4136591, 1395328, -1594507, 2161979, -5103495, 1642288, 2437394, 507880, 3160022, 1200443, - 1476932, 2259690, 3123515, -4245039, -1086627, -215822, 2146410, 285078, -1242319, 1782948, - 2654290, 263604, 588411, 1415192, -960999, 1360968, -23085, 2848100, 383326, 251792, - 548682, -553514, -673236, 834834, 1368484, -575526, - }, - { - -3909494, 33703144, -1854352, 47809964, -3721052, 681826, 10075993, -893353, -3822521, -9172976, - -23154706, -8981850, 8323647, 1773822, 10201084, 14192719, 3877282, -12841952, -16895864, -12072079, - -17943836, 6387153, -6908992, -15352361, -1883880, 12537546, -8931384, 2095407, 2037962, 7201050, - 6485938, -8090108, 2435783, -6364068, 9419937, 2528125, 3204046, -8602283, -10514080, -78383, - -1028108, -1319629, -1039919, 5218386, -2008971, 1001264, 10307922, 4211216, -6298570, 2554432, - 638340, -5754720, -4565550, 1323387, 6379100, 1122597, 770947, 2684, 783832, -2794413, - 549219, 4216048, 4854924, -892279, -5370320, 1874216, 928250, 209380, 999117, 1912871, - 1115081, 1189706, -1282048, 179852, 339839, 3099893, -1791001, 259309, -2743947, 209917, - -1695438, 838056, -126702, 1279363, 71941, 1350230, -1261647, -317828, -1722819, 1067836, - 303869, -104153, 1204202, 640487, 387084, -644782, - }, - { - -1373316, -16004122, 339839, 7123204, -2927020, -1862405, -465467, -1392643, -1382443, -2610266, - 4105989, -7655243, -1372242, 947577, 47097000, 2542084, -4096862, -8375723, -7882339, -11644730, - 7408819, 8273181, -3763465, 321586, -1007170, 2346126, -10525891, -4232691, 3769908, 6846715, - -10441065, -12406013, -7394860, 191663, 4511327, 6722161, 1648731, -2697240, 188442, 995896, - -6111739, -5514738, 549756, 2194728, 3130494, -3677566, -1731409, 1661616, -1845225, 3861713, - -579284, -284542, -1587527, 6015102, 195421, 284542, -2462090, -176631, 1912871, 4577362, - -1824824, 2353642, -1449552, -4614943, -1217623, 662499, 1369021, -606127, 818728, 4217121, - 155156, -785979, -51003, 1130113, -624918, 714575, 1160178, -3420405, 750546, 529355, - -40802, -529355, -3211562, 1169305, 113817, -1472100, 1071594, -856846, -1795833, -1888175, - 776315, 1480690, -100932, -892279, -1088237, -296353, - }, - { - -16930762, 62250184, 4119411, 61998928, -7750806, -2100776, 13135621, 15557982, -7445863, -81068, - -775778, -1195075, 16988744, -2486786, 12572980, -746787, 399969, -17035450, -2564096, 2578591, - -8250096, 17197050, -2343979, 6101001, -11489574, 583579, -9670119, -9658845, -1253594, 2623151, - -7415798, -5150740, -4695473, 1695438, 4532264, -4377646, 2816425, 3879429, 2316061, -42413, - 488016, 6083285, -168577, 719944, 1652489, -3755412, 732292, 1500554, -6739878, 2369748, - 1025423, -4471061, 7959648, -1160178, -2717104, 2579665, 2459943, 959388, 2706366, -2911451, - -63351, 1512902, -4191351, 537408, -2104534, -3431142, 3576634, 2316061, -461709, 919660, - 1095754, -818728, -1127429, -94489, 1459752, -1144072, -1007170, 697932, -173409, -602906, - -1372242, 249645, 2093260, -215822, 2438468, -2360622, 233002, -214212, -845035, 1240709, - 756451, 397821, 1480690, -238371, 169651, 93416, - }, - { - -2711735, 17519172, -12557948, -3876745, 560493, -1733556, 2874407, 261456, -6416681, -200253, - 12243878, 2004676, 102005, 8318815, 17634598, 436476, -12725988, -2833605, 6044630, 17535814, - -5937793, -2528125, -10725070, 6803765, 9325985, -17665200, -15278272, -51003, 1313186, 4895726, - -19978040, 5728950, 14353244, -958851, 9526774, 3604015, -7941932, 9479530, 7072738, 1536525, - 927176, 3544422, -5557688, 2753611, -5711770, 1023276, 4788889, 2146947, 3863860, 4685273, - -8771934, 3183645, -4057670, -4843113, -386547, 488016, -2783676, 826244, 2334852, 3473555, - 1821066, -1408749, -2074469, 4095251, -775242, 2535641, 754841, -1152125, -142271, 244813, - -2794413, 99858, -4217658, -867047, -336618, -822486, -923955, 1207423, 2092723, 932008, - 2269353, 1185411, -1091995, -587337, -1366337, -820876, -186294, -425202, 1181116, -54761, - 589484, 270583, -823023, -595927, 1435593, -886911, - }, - { - -6248641, 131025496, 8307004, 64698312, -11713450, -2466922, 11022497, 7632157, 12740484, -4081293, - -5101885, 6858526, 18210124, 6923488, 5624260, -3192235, 8312909, 7296613, -2457258, -882616, - 3313567, -1205812, -9253507, -6403260, 8113193, 2435783, 2951716, 3474629, 1485522, -4781909, - -1080721, 5573257, -818728, 5493263, -6925635, 3522947, -214212, 5313412, -8734890, -4616553, - -4148402, -2544768, -1814087, 1715839, -1910187, -682363, -5982353, -1413044, -6108517, -9667971, - -3322157, -5745056, -3364570, -2191507, 383326, -1597728, 1557463, 1762010, 6014565, -345745, - -2086280, -554588, 129923, -5061619, -3642132, -3672734, 1132261, -1881196, 99858, -2398202, - -313533, 866510, 180389, -5648419, 1110249, -376883, -3077344, 658741, 1665911, 1799591, - 2071248, -68183, 2025614, 605590, -1347009, 831076, 539555, -773094, -2012192, -586800, - 998580, 459562, 885837, -1382443, 260919, 934155, - }, - { - 1586990, -54997592, -28629178, -741419, -5719286, -5528160, -7774428, 404264, 4170950, 17575006, - 7827041, 10302016, 15638513, 3261491, -7874286, -4093104, 4337917, -6876780, -163746, 6263673, - 8216273, 9709310, -7204271, -2163590, 7233799, -2127620, 4918275, 383326, 1096290, 10025527, - -13135621, 7833484, 10185515, -6476811, -7614440, 637803, -5172215, -10158671, -5240397, 4757750, - 5602785, -3107946, 2543158, 294742, 2148021, -420907, 464930, -2334315, 6025302, -3461207, - -3718368, -5238250, -4474819, 1283658, 1872069, -4798016, 317828, -2155000, 2346126, -2415382, - -1176284, -1675574, 943282, -1379758, 335544, 563714, 55835, 312996, 37581, -408559, - 111132, 501974, 2575907, -1846836, -2474975, 1105954, -1454383, 922344, 850940, 3482145, - -1239635, 1206886, 626528, 492848, -3278671, -2098092, 635655, -607738, -2147484, -1694902, - 104153, -2057289, 118112, -6442, 703838, -840740, - }, - { - -5980205, -139731936, 45206680, -1411971, -5456756, -49499500, 32278290, -149250, 6321655, 10017474, - 1934883, -6897718, 7009924, -18486612, 4617627, -7385197, 19434728, 17863306, 10460393, -9979893, - 817118, -1802813, 4183835, -1907502, 606664, -3748433, -1609539, -10846403, 1483911, 8199630, - -1314260, -646929, 3020973, -7752953, -3875671, 7271380, -3813931, -1479079, 4377109, 1940252, - 4562329, 3564823, -574989, 2588255, 1893544, -4181688, -816044, -7854959, 2739116, -1820529, - 2824478, -4179540, -2121714, -1287953, 3544959, -1661079, -3375844, -3792993, -828929, -2126009, - 1156957, -1762547, -2807835, -779000, 1050656, 3618510, 647466, 114354, -222265, 1453846, - -900869, 97174, 192737, 102005, -603443, 337692, -2452963, -469225, 1319092, 2936147, - -1350230, 49929, 165893, -1321239, -6979, 594853, -1718524, -1282048, 409096, 570157, - 10737, -2160906, 17180, 2058900, -421444, -511101, - }, - { - -1327682, -39150236, 4840965, 12226161, 4460324, 2974802, -9696426, 6118181, -1885491, 1754494, - -14452028, 1859721, -11251741, -7623030, 17785996, -15380278, -4456566, 5594195, -24794310, 245887, - 5706938, 709207, -11274289, -9019431, 6000070, 3786551, 15280420, -3211025, -4338454, 1287417, - -3863860, -2656974, -8159901, 13437342, 1064615, -5509906, -8092256, -14960982, -9542880, 622233, - 8625368, 1243930, -6057515, -1892470, -1290101, -417149, -1559610, -2149094, 901943, 2597918, - -2253784, -2638721, -637803, -48855, 1445257, 4858145, -4409858, 7926362, 5739150, -248571, - -3961034, 1296006, 1357747, 1923609, -1444183, 906775, 2546916, 432181, -206158, -1192390, - -559420, -626528, -2229625, 168577, 1047972, 2602750, -2492155, -1002338, -45634, -1358283, - -2350421, 1923609, 129386, -1954747, 1074, 651224, -685047, 774168, 1023813, -668404, - 1034550, 210453, 158377, -244813, 188442, 1382980, - }, - { - -21053930, -43906912, -5141076, 13419625, -5768678, 12824235, -19304804, 11777874, 11429982, 8313446, - -32901060, 13128641, -528818, -2323577, -4547297, 6934225, 11145977, 3482145, -11036992, -3953518, - -4706748, 120796, 1530619, 5983427, 4866735, -9746891, -11754252, -7631620, -13146358, -2927020, - 11684459, -19792284, 3668976, 6894497, 2759517, 4271882, 6704444, -5047661, -3759707, -6059662, - 10828149, 9089225, 214748, -1195075, -1299228, 5781026, 3727495, 4352950, -8021389, -3432216, - -4692789, -4971962, -1461900, -2150705, -9393630, -4656819, -5142150, 663572, -347355, 417149, - 1641751, 1443109, 3381750, 901943, -3313031, 3219615, 5389647, -2838974, -5375689, -1878511, - -1859721, 2456185, -615791, -2731599, -904091, 685047, 2721399, 238908, -1054951, 1816771, - 1870995, 2404108, 760746, -244276, -1586990, -296890, 305480, 625992, -3149285, 624381, - 97711, 733903, -11811, 75162, -2069101, -1534377, - }, - { - 4138201, 42913164, -3671123, -1762010, -1622961, 6845104, 6645925, -1412507, 2956011, 3004330, - -5439039, -2841121, 7779797, 20439212, -67007932, -4454955, -1279900, 13670881, -12694850, -9570261, - -726386, -336618, -3684008, -6093485, -12217571, -1400696, -6636262, 3034931, -6308233, 2675228, - 6168110, 13154411, 2318746, -1701881, -308164, 12177843, 5961952, 1461363, 940061, 1624035, - -4561256, -1974074, -3990025, 1930588, 2905009, 1103807, -2336999, 2909840, -2440615, 4736812, - -149787, -2331094, 4706211, 609885, -4769561, 4710506, -1805497, 2366527, 3751654, -5228049, - 494458, -930397, -757525, 7543037, 3479997, 1462973, 1558536, 2719251, 4872104, -1849520, - 315680, 3696356, -600222, -366146, -5037997, 1801739, 989453, 830539, -4259534, -1083942, - 646929, -55298, 1240172, -938987, 550293, 2238215, 2041183, -521302, 1780801, 2232846, - -3424163, 1162862, 430570, 1600412, 1449015, -1263257, - }, - { - -18571976, 20185272, 23265838, -19611894, 1984275, 6010270, 2138357, 3511136, -8849243, 3805878, - 8041253, 56908, -17197050, 5804112, 43861280, 3751654, -4489315, -3002719, -20086488, -972273, - -7985418, 8307004, 9951976, -2763812, -10166724, 7095286, 1200980, -10549513, -6053757, -11759084, - 467615, -12057584, 7892540, 3684545, 3322694, -6953552, 3790846, -255551, 5687611, -6649146, - 941135, -4385162, 8241506, -2158221, -5989332, -4930623, -7961796, -4825396, -6809134, -2153926, - 315680, 1530619, -8202851, 7866770, -456340, -2813204, -964757, 2715493, -836445, -5869610, - -1613297, 3534221, 4475893, 1739462, -803696, 2017024, -748935, -75162, 373662, 1504312, - -1080721, -753767, -1539209, 796716, -630823, -1772211, -1865626, 1338956, -492311, -2198487, - 2251100, 323196, -1550483, -460098, 282931, 345745, -307090, 23622, 1640678, -1242319, - 2159832, 1525787, 426276, 540092, 525597, 752156, - }, - }, - { - { - -1199907, 7886097, 16495896, 28274306, -13778255, 2535641, -5597416, -2557116, -6295885, 2521146, - -4835060, -9968619, -2599529, 8355322, 13087839, 2055679, -24565066, -5636608, 13564580, -2028835, - 10472204, -700080, 1357210, 7126962, -10522670, 5951214, -17942226, 11729556, -2926483, 579284, - -1867237, -13240310, 4105989, -157840, -2047089, -2152316, -4002373, -586800, 7627862, 1280974, - -3193308, 8779450, 4784057, 761283, -2507724, 1359357, 15099494, 3252364, -6762963, -635118, - 2178622, 7406134, -4677220, 4603668, 6056441, -828392, -4988605, 1851131, -1945620, 2644626, - 485868, 1277753, -329639, -3833258, -507343, -1291175, -813359, 1253594, 1804960, 2491081, - -958851, 1984812, -2177549, 4112431, -2149094, 295816, -995896, 1142998, -2859375, 2081985, - 955093, 1661079, 1085553, 722628, -2377265, -1240709, 559956, 99321, 755914, 1229434, - 1115618, 302258, -66572, -1039382, 126702, 1016834, - }, - { - -3462818, 249409824, 2187212, 70927088, -11260331, 6198712, 8661875, 9023726, 8841190, -1926830, - 3474629, -25819196, -9657234, -1498407, -512712, 10708964, -249645, -9191230, 1978369, -2193118, - -2091112, -1735704, 4243428, 57982, -418759, -7662759, 1378148, 4013110, 12816182, -1719061, - 837519, 7128572, -3477313, 8341364, 5864241, -4898947, -1712618, -1343251, 1330903, 468151, - 2171643, -900333, 8242042, -5711770, -457951, -5917928, -267899, 5070209, 5833640, 2092186, - -790274, -280784, -318901, -9771051, 16643, 5735392, -5129265, -89121, -1833414, 386547, - -1059783, -1238024, 1818919, -560493, 2406256, 957241, 545461, -1645509, 274341, 1890859, - -1942399, 42950, 1624571, 628676, 907849, -177167, -826244, -1016834, -1848983, 222801, - 1910187, -1367410, -801011, 637266, 1017907, 1881196, 1999307, -1032940, -1611, -502511, - 853625, 1606855, 1026497, -807454, 926639, -259309, - }, - { - 6969122, -95834680, -19422916, -38830800, 15126338, -3598109, 10581726, 745714, 3488050, -10929081, - 1845762, 26203058, 9502078, 3372086, 2088428, 9710384, -3619047, 8428873, -3504157, 6136972, - -7858717, 1276142, 1722282, 5700496, -4150549, -7140383, -7691213, -1430224, 11709155, -4213363, - 8659728, 3791919, 1749662, -5579700, 9853192, -3940096, -1967095, -7144678, -3162170, 13959, - -6561637, -2842732, 2009508, 660888, 1985349, 1552631, 1235877, -2326262, -6861747, -243203, - 10529112, -2401961, -646929, -3711389, 501437, 742493, -1056562, -590558, -743566, 5078262, - 1184337, -5235029, -1990717, -3377455, -2230699, -1155883, 2410551, -2320893, -1891933, 1176821, - -759136, -3656628, -3164317, 556198, -1221918, 683437, 98247, -120796, -60666, -2468533, - 2093260, 1807108, 2022930, 3758, -149250, 229781, 1249836, -738734, 2037425, 740882, - 1481227, -172872, -502511, -1056562, 1867237, 1152662, - }, - { - 2202245, 3486977, -1862405, -3917547, -2212982, -1279363, 3240553, 2679523, 2372970, 3881040, - -3905736, 7507066, 4769561, 6272800, -16746614, -8552354, 13774497, 21826486, 7161858, -5820218, - -1112397, 3117073, -7027640, -13036836, 4173635, 7955353, 1184874, -2161979, 1427003, 3644280, - 7234873, -11740830, 8246874, -5359583, -2029372, 8735963, 17080548, -1000191, -2585570, -1609002, - 5118528, -1659468, -7670275, -1663763, 1889786, -592169, 23085, -442382, 5620502, -732829, - 1078037, -3764002, 3271691, 4721243, -4444218, -1515587, -2603287, -1344862, 1950989, 1589675, - 3318936, 1078037, 1034013, 1173600, -1270774, -227633, 2647847, -2242510, 3655017, 2490544, - -658204, 3530463, 1192390, -522912, -2699387, 1877975, -100395, -676457, 515396, 545461, - 1715303, -226023, 864899, 410169, 404801, 311385, 1860795, 2661806, -663572, 569620, - 2268280, -725313, -1168231, 749472, 921807, -1565516, - }, - { - 16281684, -4242891, -4405026, 45101452, 6790344, -949725, 2449205, 3577708, -9620727, -3874061, - -27844810, -10298795, 21056078, -4854387, 17097192, 9424769, 157840, -14992657, -15583215, -19238232, - -5622112, -3777961, -15333033, 1901597, -6686191, 9805947, -11553462, -935229, 5279589, 10900627, - 72478, -375810, -2395518, -5818070, 2012729, 10401874, -10646150, 10102837, -13162464, -2719788, - -3720516, -423054, -1644973, 4444755, 4254165, -4584878, 8621610, 3872450, -4127464, 1575716, - -1481764, -5590437, 890669, 1151588, 3719979, 1568737, -1519345, 1429687, 175557, 2102923, - -7478075, 4352950, 4361540, 1842004, -5651103, 6104223, -4481799, 2564632, 2299955, 1038308, - -1443646, 1797444, 2018635, -330176, 756451, -780073, -1051193, -1029182, 591632, -2018635, - 418222, 234076, 1648194, -2603287, 3017752, 1611150, -767725, -2120103, -2029372, 1191317, - 215822, -841814, 1434519, 1508070, -1154809, -85362, - }, - { - -102005, -25512106, 1700270, 6191196, -492311, -1865090, -1006096, -1273995, 25233, -2863133, - -1121523, -3721589, 2967823, 10693395, 26499948, 2380486, 820339, -4330938, -6171331, -3749507, - 9607842, 4126927, -6666863, -878321, -4808216, 1174674, -3857954, -15037217, 12844637, 3204046, - -5567888, -3602404, -10897406, -3006477, 2230699, 10728828, -3965866, -5055714, 3999688, 305480, - -7907572, -3994857, 1196685, 3711926, -858457, 2782602, -4380330, 1319629, -1880122, 1455994, - 1409286, 118648, 3070365, 3405909, -2895345, -1965484, 2505577, 27380, 4567161, 456877, - 1241246, -348966, -935766, -4748623, -375273, -270583, 1316944, -3376918, 4607426, 1111323, - -1312649, 1629940, 468151, 1443109, 10737, -891743, 1748589, -2440078, 1059246, -777389, - -90194, -466541, -3187403, 852551, -242666, -1034550, -172872, -264141, 146566, -1287953, - -535797, 842350, 665183, -1983738, -457951, -411780, - }, - { - 32663226, -14175540, 7279970, 51556252, 8069170, -3136937, 6932077, 10026601, 8668855, -9522479, - 13014825, -2215130, 13817984, 4036196, 7700340, -5799817, -11963631, -16536698, 3056943, 4781909, - 573378, 926639, 6507413, -9496173, 3059091, 4232154, -5845451, -13984950, 2002529, -3311957, - -3274913, -5822902, 1285269, 1129040, 4338991, -2986613, 733366, 3464428, 692027, -1186485, - 3924526, 1680406, 2312840, 4157528, -577673, -5636608, 10902774, -3114388, -7735773, 823023, - 2805688, -4302484, 4868883, -876173, -343061, 657130, 2982855, -485331, 2735894, -1072131, - -1851131, 1072131, -6721087, 4207994, -4268661, -363998, -1256278, 4185983, 174483, 62277, - 1487132, -584652, -1183800, -1116692, -82141, -602369, 380641, -92342, -392990, 422517, - -417149, -904628, 453656, 1788317, 315680, -2119030, -416612, 86436, 462783, 2695092, - -446140, 1006096, 385473, 176631, -115427, 905701, - }, - { - 796716, -15107547, 4886599, -5568425, -4010963, 1586990, -1044214, 1007707, -5366025, 1875290, - 7873749, 4796942, 11591580, 9006546, 100395, -8793409, -2477659, -4835597, -759672, 17357036, - -2644626, -9983651, -3398930, 255014, 8901857, -19689204, -13092134, 5095442, 12569222, -6442988, - -18059800, 15380278, 805843, 4125316, 6839736, 359167, -9689983, 17185774, 1671816, 231391, - 8658654, -5993090, 5578626, -6476274, -2182917, 1911797, 4212826, 790274, 2586644, 5776194, - -4406637, -2128156, -2647847, -3869229, -1135482, -316754, -3543885, 2726231, 1093606, 4716411, - 1134945, -8590, -1043140, 2482491, 3119757, 2189897, 675384, -1355599, 354335, -144418, - -5858873, 504659, -797790, -2632278, 429497, 339839, -890669, -438087, 1722819, 1535988, - -76236, 1230508, 932545, -2512019, -306553, 168041, -550293, -1652489, 769336, 227096, - 768799, -1627793, 613107, 1263257, -796180, -484794, - }, - { - 28493886, 101802536, -13259101, 59931972, 15812459, -10063108, 7876970, 7633231, 21943524, -10306311, - 11698954, -3141232, -2008434, 13982803, 13329968, -2908767, 9681930, 2400350, -3979824, 4640176, - 6714108, 2001455, -8509404, -4626754, 13365401, 2631741, -3440806, 707596, 1188095, -1669669, - 6937983, 3709241, -1790465, 5060009, -773094, 622233, -3161633, 3961034, -280784, -11562052, - -9654550, 1413581, 4376035, -1080184, -7387344, -768799, -2874944, -3894999, -1822140, -10906533, - -5596880, -3926674, 2809982, -8086887, -3413425, 83752, 559420, 2713346, 2271501, -836445, - 952946, -384400, 2517925, -4654134, -5449777, 105227, -3851512, -1611150, -442382, -3107946, - 2704756, 374736, 483184, -3744138, -2367064, -21475, 43487, -1784022, 1180042, 3168612, - 4172024, -1000727, -457414, 4139812, -2453500, 684510, -651224, -1539209, -331249, -1003949, - 424128, 758599, 867047, -1023813, -144418, 1203665, - }, - { - -610422, -53592600, -23914914, -5643587, 3255048, -16925392, -9746891, -2256469, 10953240, 11019812, - -2474438, 24508158, 11791833, 12558484, -10232760, -6284611, -8201240, 5543192, 5372467, -7624104, - 20554640, -2226941, 5018670, -10273025, 14129906, -2276333, -1528472, 1818382, 7951058, 4604742, - -12702903, 3394635, 16649978, -11579232, -4922033, 4810364, -17810156, -2328946, 1282585, -6673306, - 1647657, 1561221, -1600949, 3917547, 4851166, -1009854, -1276142, -614180, 9406515, -4679904, - -6770479, -5966784, -4380867, 10380399, -4560182, 2124935, -591095, -570694, -1765232, -1258425, - 287226, -1600949, -871878, 2994666, -2429341, 2077154, -2410551, 507343, -1425929, 2094333, - 788663, -328028, -1483911, 2050310, -3307125, -1276679, 2273112, 853088, 627602, 1966558, - 30602, -601832, 277562, 402653, -2367601, -1379758, -243203, -869194, -2617783, -2726767, - 541166, -594316, -497142, -1403917, 798864, 613107, - }, - { - 2032056, -144386592, 38611220, -1897302, -16852378, 9129490, -15853261, 8146479, 1974074, 2428804, - -3100430, 11533598, -8829916, -7092602, -1382443, -6284611, 9250286, 27839442, -5365488, 1098438, - 3055332, 8267812, -4443144, -1365800, -10833518, 4930086, -4096862, -6170795, -10650982, 5172215, - 8638790, -10284836, 3765076, -5913633, -2072859, 6370510, 1859721, -5847061, 4939213, 6210523, - 430034, -542240, 2597918, 4350265, -2953864, -2226404, 70330, -4685273, -410169, -1356673, - -2034204, -3859028, -351114, -3388192, 4303021, -1661616, -2953864, -4398584, -278636, 2226404, - -4677220, -3405372, 1574642, -51540, 852014, 3022046, 1997697, -3663607, 1741072, 707596, - 1961190, -2010045, 3179887, -2573759, 843961, 887448, -2332167, -782758, -19327, 2164664, - 173409, 3221, -450435, -93416, 827318, -1365263, 149250, -1225139, -1307818, 1336809, - 54761, -1997160, 1254667, -418759, 575526, -893890, - }, - { - 2232309, -28723130, -3317862, 2042794, 13741748, 2742337, -4616553, -54761, 1418950, -5132486, - 649614, -8803072, -7850664, -19925428, 17279728, -7929047, 2425583, 3230889, -26272314, -7078643, - 11205570, -4500052, -13760538, 4622459, -647466, -1382443, 24089934, -5704254, -2594697, 7217156, - -10246718, 1533840, -6780143, 12552042, -1072131, -9139154, -1894618, -10424959, -14219563, 176631, - 12864501, 812286, -3937948, -6194954, 72478, -3628711, -7635378, 5179194, -2081985, 1947231, - -421981, -726923, 1577864, -2768107, 595927, -869731, 1678259, 8737574, 5877126, 2592013, - -5518496, 3572339, -1648731, 5720897, -2375654, -278636, 3469260, -1612760, -1014686, 1116155, - -884763, -2513093, -1925756, -729071, 2197950, 1152125, -2632278, -920197, 472446, -1042603, - -851477, 1611, -520228, 575526, -2891050, 1144609, -450435, 1385127, -726386, 1745904, - 565325, -1265942, 33286, 59593, 897111, 519154, - }, - { - 12639552, -90119688, -5200132, 26521424, -20492900, -17553532, 5561983, 2777770, 11700028, 8316668, - -25083682, 7031399, -739808, 12352326, -5753646, 576063, 18194018, -9137006, 1409823, -439697, - -17514876, -1307818, -3287261, 9118216, 1836635, -6217502, -9790378, -5852967, -17745732, 3704409, - 2962454, -9732933, -314069, 6904697, 7291781, 787590, 1450625, 1828582, -8197482, -1936493, - 1209033, 9769977, 5076652, -36507, 441308, 2674154, 4510790, 2326262, -2368675, -384400, - -9008694, -3184182, -2250563, -7999914, -5277978, -6430640, -7006166, 2225867, 423591, 3517041, - 63351, 3432753, 2217814, -976568, -513785, 4045859, 559956, -481036, -3120831, -709743, - -1884954, 2156611, -979253, -4274030, 934692, 216896, 1335735, 193274, -448824, 1275605, - 2181307, 1593970, 2858301, -934155, -2311229, -1407139, 2745021, -361851, -2914672, 311385, - 2102923, 130997, 211527, -2539400, -1073742, -1645509, - }, - { - -4067334, 53679576, 3758, -2449742, 3281355, 8425115, -6098317, 2529736, -4087735, 6272800, - -5890548, -4002373, 10846940, -35004520, 13346611, -11267310, -5273683, 6401112, -7779797, -8906152, - -10152766, -2379412, 8550743, -7100118, -14796162, 6680822, -9731322, 12773233, -19349364, 2316061, - 7303592, 9640054, 6914361, 6952479, -6919193, 12163884, 6191196, 1733556, 423591, -12538620, - 1900523, 1038308, -6483790, 3882114, 4450660, 1432372, 1484448, 2774012, -2367601, 4217658, - -1642825, -9039296, 8227547, -57445, 1168768, 5495411, -3804804, 601832, 96100, 673236, - -1478006, -1387811, 3093987, 4618164, -262530, 4236985, 1889249, 4158602, 2724083, 1678795, - -1882269, 4547297, 614180, -1591822, -2975339, 39192, 1321239, -261456, -2130304, -826244, - -1095217, 957241, 659814, 4295, -532039, 593242, 3505767, 496069, -1337882, 2760053, - -2116882, 326954, 104690, 1076963, 1923609, -1098975, - }, - { - 21107616, -31886374, 27006754, -17996986, -9289477, -5534066, 10402411, 5592585, 4794794, -10137197, - 17999134, -13991393, -6247030, 27954868, 3573950, -10216653, 10072772, -15424838, -1328219, -4807142, - -14323179, 14840186, 8181913, 5995238, -9927280, 4887136, -7598871, -13023951, -10088878, 8412230, - -7284265, -3534758, 1460289, 10211822, -7807714, -1511292, 2542084, 10857140, 3100430, -8037495, - -5504538, -6515466, 505732, 6174016, -8581345, -5835250, -6970195, -7952132, -5647345, -324807, - 4460861, 395137, -3633006, 3235721, 4406100, -4501126, -5738077, 76773, -678068, -3977140, - 1371705, -318364, 3915400, 625992, 3754338, -266825, -3401077, 2943663, 96637, 1312113, - -3753265, -2144263, -197032, 199716, -332860, -1751810, -2732673, 2024540, -1430761, -146566, - 2146410, -110059, -782221, -110595, 374199, -26307, 1191853, 17180, -860067, 938987, - 2410014, 39192, 1637993, -983548, 2198487, -320512, - }, - }, - { - { - 139586, -41724532, -25381110, 26025892, -16516297, -924492, -7022809, 3457986, 93416, -471910, - -7346005, -5614059, -5246303, -15149423, -8003672, -6157910, -18617072, 2636573, 11627550, -5375689, - 14341433, 6191732, -3392487, 2934537, -4625680, 6416681, -15915001, 6643241, -4880157, 1097901, - 4998268, 3629784, 9604084, -5265093, -1330903, -942745, -6283001, -3157338, 5806796, -359167, - -4268124, 2754148, 1708860, 1069447, -2491618, -1271847, 9303973, -2219961, -7855495, -1058173, - 3260954, 6965363, -2710661, 10137197, 4166118, -2098629, -1936493, 885837, -3969624, 2860985, - 90194, 4443681, 3902515, 1188095, 2466385, -517007, -1720671, -739808, 2835215, 5184563, - 2353642, 3095598, -3147137, 4918812, 273804, 3121904, -427886, 2190433, -195421, 2290828, - -281320, 421444, 1435593, 988379, -1046898, 413391, 1418950, -28991, -22549, -498753, - 1001801, 934155, 378494, -1722819, -946503, 122407, - }, - { - 6022081, 295972096, 29658360, 66723928, -12819941, -7683697, -8451959, -6227166, -4762045, -16382616, - -5943161, 1835562, 6888054, -10394358, -9528385, -677531, 2785823, 4505958, 10293426, 4811437, - 1852742, -3216931, 5369246, 7722351, 2580202, -4407710, -2250026, -3128347, 4708895, -3388729, - -85899, 2329483, -9675488, 881005, 3645890, -5360119, -464930, -251256, -155156, -1560684, - 3813394, -2721399, 6533719, -3034395, -1796907, -9422621, -954020, 2242510, 1281511, -2812130, - -3404835, -1499481, 3000035, -3218004, 3073586, 3411815, -8167417, -868120, -274878, 3600256, - 2648921, -1941862, 3812320, 5452461, 1401233, -1866163, 2344515, 581431, 3071975, 2561948, - -2014877, -1007170, 1053341, 1027571, -55835, 776852, 822486, 670552, -1134945, -468151, - 2159295, -1888175, -1771137, 440771, -652835, 150861, 969589, -781147, 1432372, 601832, - 795643, 1287417, 827318, -777389, 983548, -810675, - }, - { - -7383586, -46135464, 30711700, -44594644, 16874926, 661425, 5548024, -5476084, 3716221, -7759396, - -9813463, 5720360, -6358699, -7370164, 4147328, 12431783, -10427107, 10382547, -6867653, 1772211, - -10288594, -5290326, -4700305, -666794, 292595, 2667712, -4853850, 994285, 3335042, -16535087, - 7854959, 9698036, 1654099, -10379325, 4184909, -3697967, 13816373, 7929047, 5205501, -1098438, - -6203007, 4052302, 4410395, -217433, 3373697, -1838783, -4887673, 443992, -262530, 1214402, - 10113574, -4997195, -1064615, 55835, 3584150, 4142496, 731755, 429497, -230318, 3343095, - 432718, -3835406, -700617, -129386, 105764, 454730, 876173, -2341831, -2852395, -3469260, - 1329292, 110595, -397821, 4451197, 1451162, 3651796, 1254667, -2681133, -1808181, -3025268, - 15032, -435939, 2347200, -195958, -168041, 709743, 166430, -722628, 1901597, 303332, - 324270, -1980517, -83752, -45634, 1727651, 1331440, - }, - { - -2574833, 11496017, 8655433, 832687, 134218, -1144609, 3248606, -2239289, -496069, 2930242, - -5360656, 4290673, -429497, 608275, -18485002, -9192841, 13550622, 8470212, -4460324, 3631932, - 10760504, -1463510, -3723737, -2288681, 9325448, 17151952, 7203734, 499290, 564788, -10835666, - -1011465, -2841658, 9795210, 773094, 2039573, 1220308, 16523276, 2697240, 6284074, -1011465, - 6443525, -2645700, -9307731, -3784403, 2410551, 5708549, 328565, -3156264, 3127810, -3683471, - 2150168, -1665911, 1032940, -1658931, -2926483, 93952, -5641440, -3598646, 3574487, 2756295, - 1866163, 1337346, 1758789, 744103, 1532767, 2813204, 1335735, -4354023, -985158, -298500, - -914828, 2080912, -941135, -652835, -468151, 2013803, -904091, 363998, -265214, -1675037, - -218506, -995359, 1000191, 1667521, 582505, -1624035, 458488, 1924145, -180389, 267899, - 1516124, -544387, -553514, -67646, -118112, -612033, - }, - { - -25891674, -70017632, -3376918, 36766532, -7155953, -2370285, -4667556, 683437, -9316321, -10088341, - -2532957, 16321413, 13104482, -11316702, -23622, -3186866, 2171106, -14721537, -11017665, -15149423, - -3213173, -6352257, -11799886, 3853123, -8572755, 11542725, -7010461, 7984344, 10688563, 201863, - -8880919, 3093450, -6482180, -3336116, 3274913, 1149978, -14654965, 10778757, -9564892, 3024731, - 2440078, 5322002, -4042638, -2048163, 133144, -7599408, 1617055, -1057636, -211527, 839666, - -2858301, -3460670, 2785823, 195421, 1517197, -410706, -2689723, 761283, 363462, -838056, - -10506564, 821949, 1360968, 6264210, -4176319, 3783329, -4403415, 1021665, 202937, -1250909, - -2911988, 1731409, 2356863, -293132, -228707, -256087, 2736431, 292058, 879931, -2155537, - -967441, 78383, 3071975, -3786014, 495532, 1424319, 325881, -2749853, -1720134, 1219234, - -445066, -1052267, 1592359, 795106, -1016297, 863825, - }, - { - 1423245, -8196945, 9011915, 2012729, -781147, 275415, 353261, 36507, 1953673, -5152887, - -6948720, -4079682, 5302137, -4435091, 3294777, -7021735, 4631049, 8860518, 8342974, 7604240, - 7001334, -3459596, -924492, 7388418, -12000675, -6682969, 8027831, -12640089, 4689031, 1624035, - 9947144, 8390755, -10277857, -1725503, -3985730, 1137630, -6299644, -6250788, 2016487, -3706557, - -6959995, 4063576, 8054138, 9909563, 3161633, 4509179, -5364414, 1166084, -6652368, -535260, - 5683316, 1112397, 1953673, -2590939, -2334315, -679142, 3545496, 836982, 3202972, -1371168, - 1347009, -1349157, -671089, -2961380, 2614025, -428423, -1233193, -4105989, 4894652, 411243, - -1764695, 2609730, -656593, 1032940, 1546725, -341987, 2804614, -33286, 2513093, -1068373, - -789200, 264677, -2434173, -77846, 135291, 607201, 527744, -176094, 1132798, -375810, - -1606318, -98784, 1618129, 60130, 432718, -614717, - }, - { - -40080096, -140051360, -10832444, 42709692, 4855461, -1429150, -3599720, 11265162, 15219753, -6007586, - 28225452, 1239635, 6342056, 5963562, 2078764, 219580, -1699196, -8056285, -2227478, -1723893, - 4652524, -6918656, 7748658, 2574296, 15505369, 3095061, 1278827, 5369, 9536975, -1010928, - 3733400, 2441689, 6646999, -581431, 7110855, 3351148, -1316408, -1320703, -1364726, -1599875, - 1913408, -1370632, 1532767, 4174171, 5593658, -3512210, 3171833, -10060424, -5996311, -1531156, - 1207960, -3412352, -385473, -5846524, -1352915, 393526, 1242319, -3924526, 1089311, 196495, - -1711545, 6693170, -3327526, 4043712, 410706, 4620311, -2844342, 436476, -440234, 253403, - -919660, -710817, 642098, 18254, -178778, -333934, -301185, -1131187, -1392106, 1488743, - -218506, -2246805, 370441, 1550483, -1003949, -1337346, -55298, 313533, -651224, 2253247, - 340913, 300111, -871878, 609349, 889058, 1181116, - }, - { - 1998234, -15781857, -467615, -1028108, -2101313, 1352378, -2132451, 2006824, -3601867, -1271847, - -2166811, -1466195, 4394289, -3729642, -18211736, -9868761, 8510478, -8160438, -20373178, 1086627, - -10787884, -13723494, 11378979, 4635344, 4837744, -9463424, -5138929, -7084012, -3645354, -6973417, - -7241852, 9061307, -8193724, 739271, 861678, 4557497, -11487427, 4552666, -8713952, 249108, - 13174812, -8150774, 6364068, -4330401, -1341640, 579284, 6283001, 5893232, -2649458, 5797669, - 3088618, 3390340, 908922, -2516851, 1049046, 94489, -2331094, 5491116, -4993437, -3514894, - -124554, 4323959, -170188, 598611, 4467840, 2854543, 1626719, -2786360, -2371896, 1004486, - -3258807, 2938831, 3041374, -1171989, 1581622, 114354, -1376537, -1224066, 544387, 534723, - -1005559, -845572, 625455, -905164, 982474, 1923072, -503048, -2544231, 228170, 570694, - -552977, -1464047, 998043, -93416, -2273648, -1389959, - }, - { - -50927576, 34244848, 23307176, 66274568, 18968186, -4975720, 16915728, -8135205, -1266479, 446140, - 14747844, -7608535, -7100118, -2074469, 784368, -6179921, 1861868, -9155797, 865973, 4926328, - 7999377, 10185515, -4156455, -4332012, 8915278, 4123169, -3491272, -2975876, 76773, 2690797, - 11594264, 1025960, -10098005, 4738960, 9924059, 11681237, -6743636, -7165616, 6194954, -3512210, - -5618891, 9910637, 6966437, -4061429, -6021008, 176631, 1327145, 920197, -139050, -7554848, - -819802, -3227668, 2269353, -7258495, -1335735, -1393180, -5324149, -315143, 335544, 1239098, - 3624416, -1329829, 1629940, -1068910, -1851668, 2322504, -2672007, -620086, 447213, -2732673, - 2084133, -164283, 1401233, -382252, 514859, 1512365, 2321430, -1224603, 632434, 2832531, - 2954938, -1775969, -237834, 918586, -3441343, -670552, -2169495, -335544, 1836099, -223338, - -790274, -663036, -312996, -70330, 156229, 165893, - }, - { - -1390496, -52297668, -12945568, -539018, 1093606, -13879724, -3956202, -3639448, 5603322, 2728915, - -14527190, 10259603, 4530654, 12579422, -11620571, -5087389, -10147934, 2467459, 4885526, -22310208, - 120259, -6894497, 12640626, -2806224, 4714801, -3863323, 4684199, 6422587, 6598681, -1692217, - -7955353, 805306, 9112310, -3773666, 1375463, 9425843, -10073846, 1064078, 63351, -6569153, - 5454072, 3210488, -1418950, 5242008, -2103997, -5381057, -1546725, 3888019, 13675713, -1175210, - -1782411, 3460133, 2480881, 7421167, -8943196, 3357591, -1785633, -1097901, 1092532, 2709588, - 3246995, -1728724, -4085051, 5430986, -2812130, 387621, 621697, 2054605, -2152852, -693637, - -1258962, 162135, -3342558, 1409286, -1299765, -1960653, 1185948, -839129, 283468, 1397475, - 1663226, 324270, -229781, -64425, -1430761, 1016297, -325881, -1589675, -1996086, -1903207, - 46708, -360777, -645319, -1636919, 695785, -47245, - }, - { - 2097555, -171451872, 5058398, -4554276, -4037269, 26747982, -32433982, 1250909, 6053220, -5996848, - -7861938, 7248831, -10395431, 745714, -1830730, -8273718, 3134789, 27532888, -5655398, 2815351, - -1330366, 6267968, 4103841, -2537252, -14883135, 6897181, 85362, -4806606, -17423608, -6758131, - 4386236, -5110474, 2425046, -5565741, 9174587, 10768020, 39192, -6276558, -3355443, 4147865, - 4472672, -3234647, 4230006, 2688650, -10133438, -4019016, -48855, -2608656, 730144, -5959267, - -3216394, -2104534, -900333, -2035278, 5620502, -1837172, -3980898, 377420, 849330, 2525978, - -861678, 1548336, 3830574, -137976, 281857, 2600603, 3270081, -2416456, 2285460, -64425, - 196495, -1493575, 5429913, -1534914, 1554778, 1333051, -622233, 725850, 49929, 3195993, - 1115618, 472446, -230854, 898722, 736050, -198642, 2197413, -50466, -1734093, 265214, - 424128, -1544041, 748935, -2692945, 711354, 79457, - }, - { - -3378529, -23884314, 5222144, -965831, 4299263, -2377265, 142271, -755377, 2189360, 212064, - 9109089, -2973191, -6950331, -1082869, 28033788, -1990181, 11400991, 10873247, -12182138, -11387569, - 1195612, 12134356, 10937134, 10403485, 1753957, -13815299, 10248329, -1562294, -3895535, 3728569, - 668404, 12662637, -5783174, 10744934, -4020626, -11143293, 8269423, 3102040, -7834021, -214212, - 6831146, -5836324, -4911832, 925565, 4435628, -499827, -5939940, 4993973, -117038, 4177930, - -1641751, -3423089, -1195075, -4984310, 674847, -1580548, 2362232, 1889786, -1580011, 2846490, - -646929, 6732898, 995359, 2979097, -6546067, -2551748, 1679869, -2659122, -358630, 905701, - -1706176, -279710, 2808372, 1619740, 574452, -355945, -995896, -785442, 964757, -158377, - -1005559, -1420024, -3031173, 541166, -2092186, -380641, -2133525, 917512, -2341831, -1065152, - -585726, -893353, 440771, 430570, 1761474, 1201517, - }, - { - 6524056, -109026672, -17107392, 15016279, -33375118, -26015690, -211527, -4352950, -4121558, 6433324, - -10129680, -1182727, -928787, 12603045, -7596187, 6739878, 19079318, 7027640, 13219372, 2338073, - -6954626, 4900558, 4107063, -723702, -7770133, 2407866, 661962, 12438225, -3483755, 6204617, - 8025684, -932545, -1014686, 7679402, 3966939, -3736085, 5362267, 3762928, -4901632, 1844152, - -371515, 3910031, -777389, -4122632, -49929, -3767223, 3096672, 6988449, 64425, 2551211, - -4901632, -3632469, -3576097, -1905355, 3279745, -1865626, -7355132, 773094, 1188095, 5371394, - 1635309, 3719979, 3172370, 3748433, 871878, -1500017, -5643587, -405874, -2624225, -1519882, - -1515050, 154082, -324270, -423591, 2309619, -1462436, -1932198, -102005, 864362, -377420, - 1493038, -151934, 702227, -718870, -424128, -1527935, 1362042, 81068, 189515, 102005, - 1331977, 377957, 635118, -2094870, 288837, 1749125, - }, - { - 4089883, 45419280, -16275779, -5679558, 2677912, 2124935, -10390600, 5989869, -413927, 9094056, - 1537598, -1433982, 3661460, 6432788, 80675056, -18707266, -5727339, 4689031, -14883672, 870805, - -13989782, -5647882, 18910204, 395674, -6438156, 17786534, -3764002, 8458401, -17235704, -3764539, - -8490613, -8522826, -403727, 5137318, -5708012, 10129143, -3216931, -6322192, 3319473, -11274289, - 2317672, 4748623, -2940979, 4597763, 1035624, 3107946, 5395016, -5766531, -5086315, -1013075, - -1591285, -3573413, 5954436, 2088428, 4191888, 5493800, -5526549, 1874216, 1332514, -140123, - -758599, -770410, 1451699, -233002, -2831994, 1383516, -1039919, 4324495, 1741609, 2226941, - -2427194, 1046361, -880468, 1892470, 1014149, 83752, -965294, -804233, 153008, 1452236, - -362388, -900333, -178241, 448824, -1177895, -79457, 1484448, -1393717, -2996814, 2153926, - -374199, 1191853, -1828046, -600759, 1770063, -933619, - }, - { - -12856448, -103979544, -7039989, -21319144, -3441343, -5063230, 11943767, 12212740, 14624901, -19936702, - 10211285, 11029476, 7744900, -21596706, -56396140, 84289, 27415314, -1961726, 27392764, -248034, - -19543712, 13351980, 14860587, 11099806, -11800423, -5959267, -9165460, 7748121, 1954210, 14290967, - -2084133, -4389994, 35970, 17335024, 4007205, 4685273, 395674, 4804458, 11147051, 1759863, - -3666292, -7373922, -4040491, 10918881, -3116536, 933619, 4735202, 898722, 1108102, 5866389, - 5723581, 2299418, 692564, 60130, 2412161, -3804804, -6088116, -4618701, -1554241, -1097364, - -340376, -4644471, -176094, -1520955, 851477, -3767760, -2585570, -786516, -4077535, 1313723, - -1762010, -3534221, -623844, 1390496, 1903207, 933082, -1736777, 1828582, 2684, 298500, - 1794223, 1168231, 1212255, 619012, 1408212, 544924, 1609002, 161598, -1665374, -1708323, - 110595, -828929, 1613297, -259846, 1724429, -891743, - }, - }, - { - { - -108985, -75054552, 1265405, 10029822, 443455, -4516158, -2462627, 1236951, -3029026, 4760435, - -11126113, -17190070, 14040248, -7562364, -13635447, -15052787, -4225174, -2858301, 18304076, -565862, - -4857071, 5372467, -1202591, 5925981, -2735894, 188979, -1940788, -8846022, 3455301, 3356517, - 5870684, 3743064, 5935645, -5188321, -4406637, -1739462, 33286, -6033356, 8857296, -4059818, - -2547989, -537408, 1657321, 104153, -3643743, 2654290, 10609643, -6692096, -3937411, -4734665, - 2820183, 2725157, -330176, 10312753, 3374234, -179315, 2254321, -5316633, -734976, 667331, - -769336, 6379100, 2965675, 3653407, 1002338, 1500017, -1180579, -1677185, 177704, 6286222, - 2663954, 2616709, 568546, 1495186, 2116345, 1742683, -110059, 728534, 1628866, 1462973, - -452582, 672699, 1129040, -368830, 1035624, -249108, 1893544, -778463, -781684, -1526861, - 916439, 1372779, 1285269, -1662689, -1013612, -366146, - }, - { - -9288404, 315762240, 29853244, 38034084, 7771744, -7396471, -14884209, -7317014, -8839043, -2773475, - -26674968, 8960912, 10729902, -15127949, -4320737, -2804614, 15275588, 7277285, 5505075, 5417565, - 3055869, -5431523, 273267, 13829795, 3723200, -1427540, -12082280, 6969122, -7149510, 5568962, - -1721745, -7579544, 1853815, -9208947, 525597, -1390496, 5156645, -2393371, 200790, -1686312, - 2317672, 2012192, -5657009, 2852395, -6003291, 335007, -3295851, -3470871, 3944391, -3406983, - -3093987, -1024350, 1998234, 438624, -2237141, -1258962, -2917894, -1613834, 1417339, -25233, - 4728222, -3481608, 4218732, 7396471, -33286, -1089848, 2874944, -146029, 3529926, 444529, - -1210644, -986769, 296353, 1646046, 446677, -788663, 933619, 286689, -197569, -436476, - 1509681, 445603, -3870839, 607738, -5369, 2684, -724776, 840740, 678068, 1091459, - 657667, 85899, 1045288, 10201, 27380, -236223, - }, - { - 7123204, 29364692, -40241160, -20907900, 3879966, 6449967, -7745437, -2783139, -3905736, 10586021, - -5490042, -5587753, -8483097, -4221953, 8616241, -104153, -4991289, 18358300, -11798275, 3289945, - -3475702, -6589017, -12404402, 7200513, 3324305, -3913789, -1363652, 1000191, -4619774, -6902013, - 5948530, 3705483, -3073586, 1859184, -1764695, -4771172, 18432926, 9068823, 8839043, -5881421, - -5314485, 5260798, -297427, -1263257, 6152541, -2207613, -10158671, 7837242, -486405, 2141578, - 3412352, -2405719, 382789, 1406602, -883690, 5435818, 1972464, 1461363, -273804, 284542, - -274878, -1910724, -112206, 1345935, -1311576, 3622805, -648540, -6140193, 352724, -4393752, - 1376000, -1222455, 1689533, 3430068, 3416647, 1564979, -467615, 700080, -2177549, -3013993, - -395137, 893890, -567473, 568546, 178241, -381715, -387621, 1489280, 483184, -477815, - -300648, -1251446, 77309, 619549, 1000191, 770947, - }, - { - 2005213, 19526532, -2286533, 1080721, -931471, 509491, 1903744, -2378338, -2466922, 4126927, - -4279935, -849867, 1645509, 1924145, 2594697, -19153944, 7019587, 7332046, 3371013, -14340896, - 16574279, 5413807, -10580652, 1245004, 2047089, 18473728, 11638288, -1183800, -70867, 3911105, - -21384642, 15789910, -4608500, 8409009, 7740068, -2124935, 12181064, 491237, 12443057, -881005, - 5778879, -7125888, -768799, -3390877, -2943663, 5684926, -3059627, -773094, -3144453, 412854, - 1423245, -1832877, 236223, -3692061, 1830193, -3939559, -1455457, -5585068, 4304094, 3173981, - 77846, 3149822, -26307, 127238, 1706713, 4386772, -468151, -1952600, -3695819, 387621, - 1634772, -2134599, -1229971, 1010391, 186831, 446140, -214748, -290984, 833761, -1874216, - 1545115, -1116692, 13959, 1460289, -321586, -782758, 192737, 708133, 820876, -52613, - 498753, 448287, 188442, -838056, -862215, 979789, - }, - { - 28960964, -139638512, -20114406, 25958782, 12155831, -340376, -6418829, -13755170, 6643241, -21512418, - 5807333, 22697828, 11950747, -2863133, -15588047, 8675834, -6157910, -19673634, 7122667, -16139950, - -814970, -11126113, -4909685, 4002910, -9524090, 9967545, -1562831, 8991514, 6493454, -1076426, - -8123394, -3029026, -5094368, -1384053, 1165010, -2957085, 8361765, -12487081, 861678, 4391067, - 5117991, 1243930, -3377992, -3689914, -4105989, -1639067, -2858301, -2052458, 7429757, -4461398, - -5092758, -1466195, 3867618, 794569, -1767379, -4227859, 5201743, -3192771, -23622, -3281892, - -4460861, 76236, 1256278, 1299228, 894427, -636729, -1273458, -261993, 583579, -1648194, - -1506460, 619549, 675921, 752693, -692564, 734439, 2439542, 289910, 1939178, -3782256, - -666257, 2807835, 390305, -1191853, -756451, 263067, 1073742, -1465121, -1134408, -645856, - 742493, -783295, 704375, 1279900, 169651, -340913, - }, - { - 82678, 13008382, -2050847, -2350421, -243203, 428423, 1167157, 2478733, -601295, -4699231, - -4781909, -6019397, 6231461, -5297306, -3888019, -3279208, 15122043, -8543227, 27400818, 48855, - -2913599, -620086, 5520107, 9470403, -22935126, -1912334, 12401718, -11194295, 5985037, -1899449, - 637266, 12965433, -11214160, 5373004, -2963528, -4432406, -6149857, -5437966, -1819992, -1253057, - -823023, 5406827, 2007897, 11996381, 2138357, 2492155, -3418794, -1435593, -9130564, 3723200, - 8472360, -1678795, 518617, -6067715, 2938831, -2829847, 5133023, -717796, 2550137, -468688, - 1178432, 216896, -1289564, -228170, -104153, 3376381, -2540473, -4575751, 1186485, 2450816, - -1443109, 1276679, 10737, 1305133, 3794067, -715649, 833761, 1076963, 4066797, -2652679, - -1147830, 430034, -179852, -2336999, -164283, 1736777, 696322, -570157, 747324, 517007, - -1622961, -478352, 959388, 2010045, -83752, -830539, - }, - { - 33948496, -253037456, -14239964, 42426224, 5490042, 4303021, -5355288, 13982266, 3886946, 6528351, - 15006616, 3024731, -3661997, 8578123, 6567542, 6650220, -11904576, 4523138, 2786360, -19298362, - 16575353, -8515310, 1667521, 14306536, 17623862, -4286378, 1257352, 4762045, 5735392, 4868346, - 3373160, -2214593, 10380399, -163209, 5510443, 1202591, 5720897, -3963181, -5144297, 3652333, - -3178276, 504659, 1007707, 2078227, 7125888, 477278, -6020471, -7260106, -2276333, -8308078, - -1160178, 2587718, -725313, -7487739, 737124, 4483946, -2338610, -5493263, -55298, 1772748, - -759136, 7243463, 199716, -390305, 3894462, 3546032, -1806034, -1447941, -245350, -305480, - -2449205, 608275, 780610, -756988, 281857, 1097901, -2758980, 321049, -1879585, 1644973, - -15032, -2014877, -173946, 2271501, -2397129, -586800, 47245, 483721, 460635, 498753, - 606664, 40802, -517007, 383863, 843961, 556198, - }, - { - -724239, 5094905, -12241731, 3426310, -2526515, -1241246, -866510, -1248225, -445066, 1625645, - -8643622, 5337034, -6583648, -7377680, -12099460, -14264123, 4138738, -1270237, -8315594, -1900523, - -13546864, -4945118, 17542794, 10473278, -9672266, 3096135, 552440, -17357574, -15488726, 3962644, - 3867081, -7827578, -1000191, -1536525, 2036888, 8916352, -11251204, -12520367, 766652, 3565360, - 763967, -169651, 7437273, -1548873, -2130841, 3200288, -4020090, 13950591, -4004520, 2864743, - 9974525, 3096672, -3488587, -969589, -3130494, 1549410, 1792075, 4263829, -4854387, -3373160, - -907849, 2843805, -1411971, 1656784, 2487860, 2836289, 1443646, -3794067, -114354, -999654, - 121333, 435402, 4105452, -2305324, 2334315, 220654, -625455, -1048509, 823023, -988379, - -553514, 311922, -1149978, 1078574, -631360, 2355253, 638340, -920734, -1554241, 956704, - -1796370, 697932, -1021129, -244813, -1853815, -1480153, - }, - { - 67313408, -60659432, -41886132, 76131520, 13296682, 8732742, 15900506, -5658083, -19363860, -1954210, - 13760001, 2994666, -431644, -4977867, -4938139, -2900714, 7764227, -29160144, -2656437, 10721849, - 1711545, 11577084, 825707, -2151779, -2117956, 8067023, -876710, -809601, -6164889, 4483409, - 7470022, 1807644, -13385802, 7239168, 10668699, 6664179, 6439767, -11202885, -2509872, 6458020, - -2765422, 9568113, 5900748, -4466766, -8401493, 1428077, 7563975, -286689, -4120484, -2501819, - 1225676, -2787434, -852551, -4810900, -467615, -507343, -7435126, -2542621, 882616, 2261300, - 3452617, 2627446, -3377455, -43487, 916976, -743029, -839666, 557809, 854699, -1173600, - 54761, -521302, 1049046, -19864, 1854352, 673773, 2582349, -179852, 2112587, 103616, - 2560338, -1189706, 1346472, -3597572, -461709, -2579665, -1369021, 1308354, 1903207, -1481227, - -461172, 79994, -832687, -352724, -856309, 284542, - }, - { - 3045669, -64961380, -11425687, 12177843, -4013110, -20105816, 1624571, 2241973, -3490735, 4355634, - -7652558, 7716983, -551366, 7876970, -8681740, -1033477, -3771518, -12331925, -5251135, -1990181, - -10707890, -1028108, 5929203, 4603668, -4501126, -387621, 8438000, 10274636, -5319317, 4496831, - -2110440, -1676111, 4596689, 1187022, -4119948, 3341485, -515396, -858457, -7390565, 4487167, - 10072772, -4049081, 528281, 4946192, -9634149, -103616, -2221035, 9386651, 6502581, -438624, - 701690, 2905546, 5062156, 881005, -3422015, -704912, -2458869, -1855963, 1745367, 3783866, - -423054, 1167694, -4471061, 2578054, 301185, -1637456, -955630, 1589675, -1453310, 222265, - -582505, -447213, -1660542, -1218697, 1202054, -2408403, 115964, -1269163, 3298535, -321049, - 785442, -97174, 462783, 285078, -2068564, 516470, 533113, -885300, -1445793, -1198833, - -262530, -479963, -551903, -1089848, -760746, 576063, - }, - { - -7137162, -203074640, 39251708, -3849365, -2605972, -1284195, -2028298, -1677722, 4729833, -7659001, - 7300371, -20554640, 2764885, 92879, -3102040, -6509560, 9148280, 14826227, -6923488, 13367012, - -1975685, -2901787, 5784784, 1334124, -8185671, 2186675, -4750234, 615254, -12887049, -10228465, - 4429185, -10943577, -3913789, 3448322, 9007620, 8475581, 1816234, -1962800, -6031208, 439697, - 1828582, 3573413, 3647501, 1072131, -8245801, -3079492, -540092, -4295504, -1189706, -5902359, - 642635, -1771137, 1175210, -1862942, 1198296, 4260071, -7525320, 4945655, 38655, 1016834, - 587337, 3472481, 2262911, 1921998, 622233, -906775, 3388192, 2488934, -823023, 2297271, - -2706903, -1538135, 3005940, 2423972, -62277, 1199907, -695248, 2415382, 901943, 2816425, - -908386, -104153, 150861, 1423245, 596464, 1964948, 245887, -24159, -729608, -275415, - 891743, -900869, -204548, -2826625, 682900, -846109, - }, - { - 3710315, -13613436, -9304510, -966905, -6369437, 1275068, 2543158, -1655173, 798864, 4354560, - 10724533, -4508642, -19201726, 14607721, 25332790, 5265093, 15738908, -4509179, -4600984, 10468983, - -13547937, 2263448, 32744830, -8485782, 7968238, -1183264, -10988674, 5427765, -6793565, 11767674, - 4428112, 7859254, -3745748, 13893145, -6302328, -8485782, 5098663, -252329, 4351876, -4398047, - -1682017, -3494493, -1242856, 2902861, 426812, 2790655, -4810364, 2078227, 3312494, -937377, - 1515587, -4005594, -4807142, -5929739, 2879776, -54761, 712965, -1267552, -1651415, 398358, - 4458713, 3356517, 4842039, -797253, -4134980, -4735739, 1640678, -1829656, 322659, 79457, - -1134945, 1357210, 3242164, 1534377, -1600412, -912144, 2894808, -1610613, -1008244, -156229, - -1004486, 1335735, -3061775, -2040646, 156766, -1612760, -1563905, 98247, -1066226, -1563905, - -621697, -2146410, 2059437, 449898, 176631, 72478, - }, - { - -28457916, -64673616, -10402411, 3833795, -22384296, -11790759, -17008608, 3646964, -1336272, -5049808, - 3942780, -5303211, -5555004, 5630702, -13661217, 19726248, 17249662, 17809082, 15421080, -6508486, - 3928285, -5612986, 7329362, 384936, -10262287, 1744831, -2394444, 13492103, 14704894, -6244346, - 3210488, 9638980, -302258, 2697776, 819802, -1863479, 6106370, 4882304, -1595580, 147640, - 2669322, -707059, 2737505, -11157788, 2080375, -1213865, 2735357, 1956895, 2803003, 1188632, - -4693863, -5022965, 229244, -534187, 1355062, 1144609, -5688684, -504122, 649614, 3167002, - 3256659, 4919348, 2389076, 4223027, -738734, -2037425, -7221988, -1211718, -67109, -2550674, - -248034, 471373, -803159, 1676111, -1389422, -2541547, 345745, -996969, 2284923, -2925410, - 2064269, -522375, 86436, 64425, -819802, -2684, 549219, -1919850, 2659122, 81604, - -166430, 520228, 1651415, -1840930, 138513, 2582349, - }, - { - -5418638, 35595616, 519691, -9446781, -2969433, -3666292, 7391639, -2043331, 6985765, 5363878, - 5756867, 4290673, -392453, 37514392, 41101228, -29459180, -517544, -1561221, -12797929, -974421, - -7660074, -16826072, 18869938, 7472706, 1661616, 2751464, 11080479, -9899900, 3352222, -6568079, - -9340480, -14010720, 1121523, 3361349, -1140314, -1183264, -5129265, 3942780, 4224101, -5215164, - -8103530, 6801081, 4223027, -3258270, 4866735, -63888, 1832877, -9642738, 4185446, -2972117, - -543313, 2316061, -3060164, 6764574, 447750, 6250788, -4861366, -537, 179315, 2373506, - -30065, -2301566, 1884417, -511638, -3860639, 19864, -667331, 1932735, 2512019, 2432562, - -1906966, -1344325, -2359548, 3007014, 4059818, -1049583, -430570, 777926, -612570, -1273995, - -169114, -1186485, 1289027, 585726, -526670, 1495722, -3075734, 1254667, -679679, -2433636, - 1523103, 968515, -150861, -1569811, 721018, -1100049, - }, - { - -4511327, -115785336, -20034412, -18613852, 4899484, -1258425, -2943663, 12321724, 9131100, 3663070, - -15097347, 15736223, 17824652, -14434848, -69171520, 15259482, 31494996, -7194607, 28547574, 49929, - -858993, -974421, 13142063, 5203353, -7772280, -4993437, -12783433, 6109591, 5925981, 5677947, - 2910377, -8982387, 9559523, 6878390, 10619844, 8746164, -1713155, -1756105, 18277770, 1576790, - -13773423, 9807021, -5777268, 9041443, 4996121, -1345935, 2266669, 1283122, 4158602, 9124658, - 4022237, 41876, 3648575, -1878511, 101469, -2673080, -1455457, -2672007, -3078955, -1222992, - -2895882, -3550327, 2559801, -4541928, 1423782, -4239133, -623307, -7398618, 974421, -2510945, - 273267, -3595425, 1705102, -777389, 947040, 4449049, -1120987, -129386, 1960653, -1221918, - 3249680, 1128503, 1829119, -705448, 1705102, 233539, 1599339, 314069, -2556579, -1364726, - -271120, -1090922, 398358, 1087164, -702764, 1439888, - }, - }, - { - { - 455803, -59528248, 14878840, -6979, -2509872, -1504312, 321586, 1570884, 9886478, 15543487, - -11267847, -24023900, 19024020, 1091459, -16101296, -11425687, 10009421, -9718974, 2189897, 11320997, - 6002754, -3745748, -9395241, 6216429, -6986301, -4547297, -1366873, -9098888, -3871913, -7364259, - 6022081, 3109556, 2457258, -2916283, -5414880, 1873143, 12718472, 8121247, 12750147, -2111513, - -870805, -3055332, 4205310, 3753265, -3101503, -1186485, 6032282, -930934, 202937, -6681359, - 1343788, -2411087, -2394444, 4153234, -1200443, 2723546, 7100655, -2387465, -1962800, -3850975, - -931471, 1514513, -958851, 3353296, 163746, -1514513, -3376918, -2138357, -4801237, 3104725, - 4102768, 1970853, -738734, -78383, -660888, -147103, -1344325, -722091, 867583, -1159641, - -1302449, 758062, -1352378, -2327872, 585726, 29528, 2124935, -1149441, -918049, -1218160, - -230318, -652835, 702764, 52613, 1111860, 447213, - }, - { - 11625403, 272233824, -30630634, 3373697, -5509906, 5037997, -7450695, 7409356, -337692, -8130373, - -16274705, 21336324, 9719511, 2913062, 11170136, 9015136, 19414862, 1036698, 9007620, 15182173, - 8798777, -8220031, -10480794, 6863358, 7136088, 6710350, -10686416, 2971581, -14981920, 2812667, - 507880, -3598646, 8218420, -3553549, 4083440, 739271, 7035694, 728534, 2557116, 4051228, - -2456721, -749472, -4969814, 688805, -7417946, 4357245, 1393717, 379031, 8441221, -4378719, - -2462627, 1533303, 1247151, 3912178, -1747515, -4596689, -2606508, -4216584, -737661, 1429687, - 3811784, -2306934, 2151242, -505732, -1509144, -422517, 310848, -3281355, 118112, -950262, - 958315, -102542, -728534, -536334, 563714, -1108638, -338229, 799938, 836982, -417686, - 419296, 221191, -3562139, 173946, 414464, 632971, -423591, 869194, -735513, -726923, - -758599, -772557, 128849, 140660, 836982, 808528, - }, - { - -6138045, 100035160, 24973088, -7541426, 6213207, 3142842, -8169565, -151934, 4507032, 12960064, - -22454626, -4411469, 6402186, 2208150, 14244796, -19327, -1098438, 17056926, -14481019, 16260746, - 11869142, -1295470, -7801808, 19295140, 19043884, 3132642, 2931315, 1811939, -2205466, -2029909, - 2730526, -5208185, -5085778, 2747705, -5249524, -4518306, 11557220, -688805, 5567352, -4732517, - -7534447, 132607, -2528125, -2328409, 2863133, 1170916, -7735236, 3551938, -1875290, 180926, - 1669132, 838592, 2809446, -201863, -5038534, 2820720, 688805, 279173, 151398, 3462818, - -474057, -2577517, -802085, 108448, -2661806, 2457795, -3031173, -4730370, 4035659, -3202435, - 126702, -2309619, 892816, -40802, 690416, 331249, 212064, 3389803, -355945, -681826, - 695248, 541166, -1926293, 697395, 1035087, -908386, -561567, 1666984, -729071, -1583232, - -690416, -769873, 45097, 294205, 365609, -440771, - }, - { - -1238561, 24970402, 2569464, 2852395, 1407139, -942745, 382789, 554588, -1990181, 5269925, - -935766, 777926, 5827734, 3913252, 17014512, -5650030, -69793, -13530758, -1085553, -7590818, - 15494095, 5582384, -10987600, 4884452, 7206419, 17860084, 4405026, -6310918, 1860258, 23352810, - -4474282, 13977971, -11218991, 2275796, -1109712, -14801531, 10512469, 8462696, 5411122, -6332930, - 5376226, -3657702, -2622615, -6869264, -4589710, 1763084, -4493073, -925029, -9968619, -2765422, - 1043140, -3899294, 372052, 766652, 3763465, -3671660, 1156420, -2666638, 3510062, 875100, - -454730, 2334315, -1198833, 336081, -1439351, -105764, -449898, 1473174, -1736777, -933082, - 668404, -2554969, -769336, 165356, 132070, 741956, -1053341, -765041, 1428077, 26307, - 3296924, -1066763, -1040993, 533650, -1211718, -169114, 97711, -220654, -356482, 56908, - 865436, 304406, 810138, -1475321, -1496259, 125091, - }, - { - -23270132, -200074080, 2221035, 9211094, -10608032, 1265942, 1460826, -10771778, 17846126, -20466592, - -3026878, 14374182, 14125611, 7963943, -24238112, 585726, 4638565, -15313169, 11788075, 5536213, - 7405061, -234613, 8587250, 3779034, -9850507, -1079111, -9317395, 14206678, 11076184, -2957085, - -7233799, -4763656, -1075352, -2687576, -4571456, 4034585, 21907554, -12951474, 372588, 1191317, - -1839320, -6272263, -3234647, -5369, -1983201, 4835060, 1256278, 73014, 8871792, -5193153, - -155156, -3058017, -4891431, -2916283, 491237, -609885, 7873749, -2062121, 2343979, -1668595, - -1584306, 3111167, 1165547, 2551211, 3138547, -1275605, -454730, -643708, 2195265, 295816, - -1238024, 360777, -38118, 1534377, -500364, -898185, 1392106, 2219424, 4432406, -1597728, - 458488, 1589675, 235149, 1362578, 4295, 192737, 1225676, -19864, 1261647, 215822, - 714575, -712965, 162135, 1221381, 498753, -862215, - }, - { - -1685775, 7183870, -3619047, -2003602, 264141, -280247, -377957, 499827, 632434, 3127273, - 5111548, -2112050, 7759932, 15848429, 1897839, -6086506, 12656195, -18458158, 3496104, -13460964, - 4540318, 5652714, 5902359, 13043816, -4378719, 5980205, 4790499, -16108812, -5130339, -8239358, - 1148904, 12277701, -6676527, 6747931, -3270081, -5645735, -8451959, -7780334, 1547799, 4284767, - 1232656, 755377, -4120484, 6959458, -53150, 1081795, 935229, 4141422, -9445170, 1510218, - 2189897, -7588671, -294742, 1537598, 6988449, -3872450, 2981781, 1661079, 3279745, -836445, - 1162862, 3611531, 4367982, 2261300, 661962, 3513820, -1629940, -1846836, -1887638, 729608, - -2077154, -1081258, 176631, 1830730, 1449015, -2605435, -751082, -814433, 3193308, -1541893, - 117575, 185757, 935766, -992137, -771484, 174483, 1169305, 134755, -390842, 221728, - -1187559, -206695, 96100, 1017907, -328028, -59056, - }, - { - -14573361, -325324992, -5325223, 35034048, -15249281, 238908, -10298258, -6009733, -12713640, -4323422, - -8932458, -6157373, -931471, 9473087, 12206297, 2190970, -10369125, 10344429, 3292629, -9730248, - 26148298, 5871757, 6364068, 1408749, 3870839, -2103997, -1631014, -5628018, -5194763, 9482751, - 6834904, -4185446, 10205916, -3226057, -6607807, -6418292, 7089918, -3041911, -4963909, 1385127, - -4363150, 1300301, -171262, -2223183, 2991445, -727997, -5127654, 17180, -1519882, -9426916, - -60130, 5089536, 6332393, 927176, 3382824, 3382824, -560493, 1394254, 643708, -446677, - -59056, 6653441, 2753611, -1039919, 1394254, 625992, -3081639, -1239635, 1563368, -779537, - -4595078, -702227, 899259, -1112397, 165356, 1502702, -4109747, -1146219, -2668785, 750009, - -368293, -181462, 919123, 1738388, -707059, 530428, -238371, -1163399, -568009, 31139, - -108448, -674310, -641024, 288837, 896038, 615254, - }, - { - -1540820, 3223910, -9775346, 1360968, -2672544, -929324, -1757715, 158377, 4329864, 4881767, - -3059091, 7209103, -11547556, 827855, 6449431, 5792301, 15017890, -111132, 2367064, 9753871, - 1996086, 1541356, 19078244, 20434918, -6056978, 9920838, 17103096, -17726940, -12501039, 17793512, - -817654, -12910135, 3759170, 1595044, 10711112, 11710765, -12997645, -12766253, 3322157, -5504538, - -11297375, 2650532, 7935489, 1547262, 1353452, 2356327, -11915850, 7447474, 2656974, 5765457, - 4474819, -1541893, -749472, 1101659, -5577552, 245887, -1697049, -535260, -1782948, -1325534, - -2233383, -505732, -6886980, -595390, -645319, 394600, 2216203, -1154273, -1298691, -679142, - 2513093, -2118493, 1707786, -1781338, 1551557, 659814, -126702, -680215, 2714956, 1007170, - 905701, -33286, -2548526, 1315871, -280247, 2142652, 559956, -261993, -1463510, -1006633, - -1701344, 1466731, -1189706, 1378148, 424665, -65498, - }, - { - -72807752, -177383216, 21170430, 53271552, -23345832, -6786049, 8746701, 577136, -17826798, -5854041, - 3549254, 10155987, 16136729, 13640816, 10212895, -4497368, -6001143, -28128278, -1637993, 7638063, - -6813966, 7472706, -3494493, -6826851, -10039486, 419296, -5374078, 4512400, -1882269, -2304250, - -2950106, -133144, -7981660, 4763656, 4496831, 3877282, 9006010, -609885, 1903207, 7532299, - -4708358, 2135673, 5227512, -75162, 898185, 5259725, 2084670, -1803349, -359704, 3799436, - 915365, -4330401, 1977833, -1560147, -1119376, 4578435, -411243, -661962, 4115116, 1707786, - 44023, 478889, -3936338, 3718368, 4339528, 48318, 582505, 2083596, 3906273, 319438, - -1696512, -72478, 610959, -1548336, 1221918, 911607, 2229625, -1374390, 1148904, -1915019, - 976031, -1057636, 1036161, -3737695, 1518271, -101469, -419833, 452582, 593779, -1064078, - 500364, 207769, -970663, 88584, -678068, -271657, - }, - { - -3911642, -62111132, -1769527, 6740415, -8164196, -19419694, -4066260, -3554086, -7571491, 7361037, - 6878927, 17099876, 1394791, -3117073, -19582366, 5481452, 3125126, -11637751, -8397735, -3477850, - -4348118, 10408316, 3796214, -3039226, 2537252, 2938295, 2245194, 2207076, -4627291, 3740380, - -4380330, -5053566, -748935, 1124208, -9325448, -116501, 1131187, -4299263, -7527467, 12094091, - 16192027, -710817, 1893544, -550830, -10291815, 6018323, -1967095, 2742337, -2130841, -10385768, - -1286343, 819265, -3173444, -4248797, -403727, 965294, -3396246, -5004174, -4164508, -3055869, - -1571958, 5951751, -2342368, -1003412, -2329483, -973347, -1276142, -1722819, -883153, 1033477, - -3003256, -1207423, 616328, 203474, 1956358, -1309965, 481036, -2660195, 2412161, 1571958, - 2044404, 654446, -85899, -9664, -1694365, -169651, 1282048, 122943, 1133871, -413927, - -513249, 74088, 500364, -665720, -1691680, 135828, - }, - { - 13037910, -215081232, 16703665, 7992398, 26339424, -10657424, -8177081, 1136019, 10943577, 1699196, - 14828911, -17750026, 11292006, -658741, -3602941, -3956739, -797253, 1853278, -18943490, -7167764, - -16422881, -8235600, 7449084, 2167885, -6651831, 3118683, -309775, 8161512, -4895726, -7443179, - -343061, -5428839, 3937948, -1208496, 591632, 5720360, 693637, 260382, 689342, 2990371, - -2257542, -826244, 4043175, 3236258, 1135482, 425202, -1513976, -4527970, -1788317, -86436, - 4828080, 552977, 2180770, -3066070, 2994129, 8540006, -2536715, 7107097, -2953864, -462246, - 1486059, 3810173, -631360, 1347009, 4405563, -896574, 1690607, 4133906, 42413, 2486786, - -2525441, -3813931, -877784, 476205, -2154463, 340913, -782758, 3457986, 729608, 2158758, - -1457068, -780073, -525597, -497679, -1567663, 1052804, -540092, -500364, -519154, -294205, - 1185411, 246961, 1051730, -511638, 1548873, -751082, - }, - { - -3281892, 7427072, 13870597, -2636573, -12181064, -1902134, 3550327, -4252555, 186294, 2574833, - 7410966, -2564096, -3792456, 17696340, 10148471, 15439871, 31675384, -2943663, -8680666, 11844983, - 2891587, 10203769, 15380278, -25831544, 2153926, 5784784, -18148384, 2007360, 9033390, 19155554, - 1913945, 3135326, -3816079, 9756555, -3626563, 2685965, 830002, -10429791, 1342177, -3240016, - -1643362, -750009, 575526, 2294586, -1352378, 211527, -640487, 688269, -6011881, -6356015, - 4839892, 330176, -1072668, -2553358, 577136, -3218004, -2035815, 1740536, -1414655, -2366527, - 3729642, 2227478, 529892, -1229434, 2251100, -3973919, -904628, -1691680, -1979443, 1469953, - 2092723, 2420214, 3147674, -1301912, -3238942, 838592, 4191351, -1062468, -819265, 1008780, - 1585917, 3751117, -2561948, -903017, 1789391, -231928, 357556, -337155, -667867, -712965, - 675384, -887448, -237297, -1612223, -164819, -1935957, - }, - { - 39071316, 33714420, 927713, 3891777, -13885092, 13709536, 7108708, 22972706, 6437619, -6328098, - -3262028, 7206419, 5370320, 8069707, -13533442, 27954868, 16397111, 648540, 8684961, -13429289, - -4954245, -16789564, 29528, -721018, -13106630, -3609383, -7841537, 3101503, 8570607, -3650185, - 7868380, 5192079, -4921496, -5917928, -5039608, -2568391, 2100776, 5334350, -1978369, -5485747, - 7714298, -32212, -594316, -10837276, 5290326, 6947110, 2146410, -2170569, 1464047, 5630702, - -1214402, -4940823, 5494337, -3271155, -1954747, 2876554, -6433324, 590558, 1866700, 812823, - 636729, 4342212, 1109712, 1513976, -892816, 262530, -4967667, -217970, -1233729, -3566970, - 842350, -91268, -1848447, -653909, -3157338, -1555852, 1989644, -150861, -330712, -3598109, - 1827509, -716186, -252329, -1665374, -1873143, -595927, 426812, 143345, 2787434, -1410360, - -273804, -61203, 1840930, -1315871, 608812, 2145336, - }, - { - 6962142, 39587252, -4722854, -3863323, -2929705, -4236985, 3852586, -7711077, 5839008, 8818105, - 1930051, -2390149, -9127879, -59290412, -66369056, -19763292, -1113470, -1133871, 7129646, -2506114, - -19679004, -15143518, 15199889, 3383361, 14977088, 9807021, 8121783, -1653562, 14283451, -1243930, - -693637, 904628, 12150462, 1147293, -1293859, -7283191, -426812, 9524627, 4584878, 4159676, - -10420128, 2202245, 3952444, -6291590, -1956895, -6257768, 602369, -8410620, 6628209, -796180, - -987843, 3707631, -2001455, 1962263, -3527242, 4601521, -3963181, 506269, -2369211, 925029, - -2446521, -4220879, -1590212, -2514703, -4281546, 3464428, 1982127, -4191888, -2884608, 810675, - -2097555, -1327145, -2228551, 263067, 3569655, -48318, 1981591, 810675, -3131568, -1445793, - -1034550, 143881, 3118683, 241055, -71404, 3141232, -867583, 2616172, 224412, -2010045, - 642635, -553514, 574989, -635118, 313533, -171799, - }, - { - 22066468, -71123584, -13103408, -13896367, 7534983, 6216429, 3958886, 9232569, 1039919, 3978750, - -21556440, 8868571, 19683298, 28150826, -19257022, 12193949, 11547020, -13140452, 21245592, 4322348, - 533650, -12559021, 2301029, -2859911, -5313412, 3333432, -5698885, -4567161, -5590974, 6168110, - 2747705, -14465987, 5674726, -2018635, 3668976, 5141076, -5061619, -2353642, 10206453, 1357210, - -7150047, 15146202, -2648384, 7583302, 4345433, 2478196, 3806952, -2588255, 681289, 5015985, - -2616709, -2608656, 4342212, 3205119, 825171, -2290828, 7865159, 2285996, -3439195, -875636, - -2886755, -3275986, 5529234, -3197603, 820876, -673236, 5105106, -1155346, 2887829, -5529234, - 587874, 134218, 1368484, -2000918, 382252, 5529234, 754841, -471910, 2346126, 103079, - 5067525, 980863, 89121, -1562294, 692027, -1024887, -950262, -1328219, -2002529, -1537061, - -1913945, -1060857, -561030, -1024887, -1811939, 1796370, - }, - }, - { - { - -2147, -13490492, -15266461, -12771622, 1262184, 3697430, -1728188, -2753611, 7575249, 2408403, - 5865315, -11163694, 2327336, -2859375, -197569, -16129213, -5182952, 9361955, -11629698, 19396072, - 7103339, -5655935, -9346923, -3704946, 5079336, -13976360, -7836168, -2538326, -10147397, 3320547, - -5886253, 9880035, -10879689, 4377109, 4057134, 10152766, 800475, 7529078, 15644955, -2871186, - -1445793, -4156455, 3484829, 7129646, 134755, -1948305, -2718178, 1574642, 1967095, -2163053, - 1053341, -6089727, 4615479, -1094143, 3533684, -2025614, 8179765, -1617055, -333397, -4461398, - 190589, -2073932, 368293, -1426466, 1293859, -3218004, -3919695, -1498944, -1088237, 2873333, - -23085, 1092532, -1168768, 1149978, -1165010, 781147, -1472100, 762894, -694711, -1288490, - -548682, 413927, -1100585, -956167, -939524, -605590, 2456185, -1043677, -964220, -647466, - -26307, -243203, -668941, 702764, 1915019, -21475, - }, - { - -13927505, 209854256, 33974800, -8231305, 12692702, -2600066, -6554657, 16852378, -7308424, -12289512, - -2058363, 21515102, 2676838, 6840809, 189515, 16436840, 27227946, -7265474, 12255689, 16452409, - 2546916, -9284646, -10945724, 7426536, 7721815, 681289, -7036230, 6667937, -8841727, -4226785, - -3075734, 6047851, 5152350, -3692061, 4250407, -1886564, 3255048, 11135776, 1254667, 8229694, - -5264020, 1602023, 731755, -7931194, -938987, -1888175, 520765, 1456531, 8705899, -1533303, - 3319473, 3875671, -2186675, 4440996, -2516851, -5095442, -53150, -6098854, -1147830, 4818417, - 1937030, 1490354, -1061931, -5199058, 2888366, -1271310, -1859184, -428423, -177704, -3550864, - 2697240, -90194, -2206540, -305480, 1821066, 133681, -2556579, 1785633, 520765, 1084479, - 419296, -2807835, -77309, -258235, 348429, 48318, 893890, -127238, -1229434, -1777580, - -204011, -214212, 278099, 462246, 515933, 444529, - }, - { - 4337380, 134573680, -7617662, -5797132, -5881958, 4602595, -4541928, 5747203, -1203665, 8042327, - -20137492, -17217450, 15365782, 16287590, 1416266, 1205812, 1910187, -4134980, -8665633, 18831820, - 7145215, 3144990, 5014911, 9127879, 18565534, 5080947, 6436009, 1752347, 6522982, -7691213, - 84826, -4917201, -8988293, -1990181, -211527, 2453500, 2668785, -599685, 4184372, -358093, - -3532611, -10034117, -1366337, 399432, -1965484, 5288179, -703838, -5101885, 3551401, -513249, - 2851322, 3802120, -2448131, -214748, -1314260, -127775, 1794223, -999654, 2607045, 1335198, - -1317481, -1584843, -1595580, -654446, 1091995, -1146219, -5482526, -1160178, 976568, 512175, - -1469953, 364535, 162135, -760209, 468688, 281857, 1020592, 2331094, 142808, 1386201, - 177704, -213138, -839129, 470836, -540092, -117575, 370978, 874026, -1444720, -782758, - -796180, -948651, 1212791, -417149, -216359, -552440, - }, - { - 1038308, 27571542, -1247688, 5684389, -1465121, 775778, -1682554, 2334852, -3347390, 2699387, - 5954972, -3043521, 5966784, 5181341, 3842922, 17956722, -13036299, -15359877, 79457, 3127273, - -2390686, -5844914, 3144990, -1613834, 12604118, 11545409, -2415919, 3653407, -8396124, 20824148, - 15621870, -1848983, -1993939, -3925600, -4832, -8828305, 2905009, 12207908, 2218888, -5180268, - 3804804, -2876554, -7139310, -2247342, -7720741, 1535451, 1439888, -651224, -13833016, 703838, - 1929514, -6118718, 2084670, -392453, 1084479, -1180579, 210990, 2703145, 298500, -216359, - 776315, 948651, -1469416, 2099165, -2865280, -901943, 1165010, -1793686, 963683, -1081795, - -2843268, -45097, -1119376, 51003, 648003, 1035624, -2182917, 321049, 733366, 1465658, - 1700270, 1642288, -3037079, 111669, -1582696, 665720, 530428, -807454, -467078, 956167, - 1119376, -386547, 226023, -672162, -2061584, 176631, - }, - { - 8872866, -259941616, 11618423, -3833795, 4665945, -1614908, -367220, -4602058, 12848395, -23862838, - 7757785, 8359617, 15946140, 2770254, -19147502, -2962454, 4206921, -18910204, 17929878, 7955890, - -3347927, 7645579, 7666517, 1468342, -5259725, -4578435, -7658464, 14617384, 4362613, -2222109, - 3099356, -16135655, 6559489, -8955544, -1590749, 2936147, 2731062, 11931419, -11144366, 3607773, - -885837, -7604240, -1782411, -4025995, 2682207, 1806034, 6694781, -2437931, 10198937, -3400540, - 358093, -1808181, -8810589, 1232119, -1573032, 2412698, 1222992, 3221762, 2362769, -2459943, - -1494649, 3495567, 2621541, 644245, 4707821, -1372779, -4279398, 1232119, 2405719, 1131724, - -134218, -776315, 921807, 780073, -545461, 3758, 687732, 1396938, 4339528, -876173, - 1434519, 30602, 933082, 1103270, -268435, 1130113, 490700, -243203, 1969243, 652835, - -526134, -212064, -1611, 404264, 1101122, -212064, - }, - { - 523449, -2927557, -1573569, -2043868, 2107218, 544924, -1270774, 1578401, 1066763, 2228014, - 3500398, 4322885, 181999, 11383274, -9452149, 13567802, 80531, -4706748, -4040491, -2407866, - -833224, 9361418, 4249870, -4510253, -1166621, 10771241, -6052146, -16062641, 4664872, -7767985, - 6767258, 5148055, 2258079, 1293859, -1356673, -6910066, -7146826, -4434554, 5494874, -2985539, - 4881767, -5890011, -2754685, 6680285, -1220308, -209917, 1889786, 2037425, -4145180, 1714766, - -2758980, -2617783, -3426310, 7486665, 2483028, -3202972, 314069, 5737540, -759136, 4910222, - -958851, 2818572, 6708739, -724776, 2202781, 1953673, -1500554, -572304, -2051384, 1154273, - -3818763, -1699733, 75699, 2530810, -1737314, 93416, -444529, -2524904, 1159641, 293132, - 1189706, 57982, 297963, 288837, -481573, -1624035, 475668, 836982, -492848, 65498, - -813896, 78920, 479426, -188979, -178778, -344671, - }, - { - -13453448, -360643040, 21974664, 18873696, -2342905, -1960653, 379568, -13909788, -10150618, -11324218, - -862215, -2276333, 5258114, -15127412, 11523934, 9400610, -5011153, 17833778, -15061377, 5301064, - 6984691, 19015430, 6252936, -2405719, -2199023, 4107599, -7490960, -849867, -7803956, 5144834, - 10743861, -819802, -1280437, 5821292, -12197707, -7097971, 10962367, -5157719, -1377611, -6657200, - 3317325, 362925, -1437203, -1292785, 1379221, -3101503, -8220568, 9584756, -8595840, -1740536, - 2640331, -361851, 8663486, 3047279, 3495567, 206158, 908922, 3124589, -1199907, -417149, - 1070521, 1910724, 6092411, -1220845, -599685, -489089, -831076, -479426, 2283849, -1324997, - -4141959, -1861332, 1678259, -252866, -2932926, 358093, -339302, -2056753, -3742527, 2214056, - -1891396, 1063004, 1927904, -1218160, 2119566, 447213, 1136019, -2371359, -275415, -11811, - -883153, 811749, -1640141, -759672, 1828582, 264677, - }, - { - 484794, -10037875, -1355599, -4050154, 868657, 254477, -1128503, 1629940, 1125818, 3040837, - 1409823, -428423, -4762045, 3153043, 3283503, 18582712, 13239237, -13742822, 26277684, -17174500, - 16131360, 7766375, -3594888, 5752572, 8536248, 5770289, 13925358, -2588792, 6196564, -8680666, - -6613176, -5960878, 5957657, 13158169, 1109712, 4912906, -7217693, -2537252, -6946036, -6711960, - -5015985, -189515, 4896263, 2440615, -2223183, 4039954, -4847408, -5677947, 10288594, 6717866, - -420370, -2274185, 1509144, 681289, -5027259, 2815888, 545461, -5799280, 949188, -923955, - -4275103, 1767379, -7650948, -849867, -1248762, 2678449, -3515431, 3030636, -272194, -1333051, - 2596845, -1084479, -155156, -645319, -2106145, 1966558, 137976, -253403, 1168768, 2063195, - 108448, -715649, 492311, -1513976, 1813013, 45097, 778463, -910533, 1139240, -2629057, - -879931, 335007, -288837, 555125, 1316944, 925029, - }, - { - 64707440, -304361248, -20417738, 31197568, -8887898, -5872831, 1872606, -90194, -5600638, 266288, - -12205223, 20320564, 10241886, 24781424, -1034550, 4813585, -21237540, -6652905, -8572755, -778463, - 1417876, 2416993, -5501316, -3416647, -7185481, -1387811, -6589554, 3430605, 2029372, -252866, - -5633387, -1131187, -4770098, 8545374, -661962, 1622424, 3462818, 11857331, 3381213, -4117800, - -3058017, 2229088, 5392332, -3170223, 2342905, 2630131, 3027415, 257161, 528818, 4228396, - -2050847, -6036040, 2534031, 1826435, -5778342, 5862094, 2510409, 1084479, 1814087, 2188823, - -1215476, -1859721, 3446711, -963683, 3532611, 1900523, -292595, 2822867, 2633889, 1660542, - -2252174, 321586, 441308, -725313, -712965, 399969, 3529926, -1271847, 131533, -1556926, - 388158, 3758, -1045288, 351114, -563178, 1958505, -203474, -607738, -1406065, 724776, - 860067, -796180, -370978, -1081795, 188442, 859530, - }, - { - 4495757, -45518064, -23191212, 855235, -8232916, -7588671, -9390946, -4465692, -5262946, 7445863, - 9922448, 9122511, 5659693, -11592654, -15758235, 8045011, -11168526, 2640868, 13437879, -37754912, - 11710765, 12738873, 6842420, -8282845, 10288057, -2797098, 5069672, 1444183, -4552129, -5851356, - -4212289, 3228742, -2524904, -2149631, -4350802, -4592394, 2977486, -2487860, -2545842, 3435437, - 13706851, 993211, 4477504, -2468533, -3308199, 683974, 1365263, -3505767, 2317672, -11307575, - 314069, -364535, -8187282, -2080912, -2521683, 3328600, -2594160, -391916, -8482560, -2960306, - -301721, 3965329, -806380, -1999844, -2578591, 769336, -492311, -5470178, 2162516, -137439, - -940598, -3939559, -193274, 1671816, 700080, -1271847, 1798518, -165356, 20401, 760209, - 158377, 1901060, 1738388, -912681, -1020055, -1784022, 2102387, -173409, 1664300, -723702, - 650151, -1409823, 2077690, -1750199, -1302986, -58519, - }, - { - -18148922, -231587328, 56870736, 13689135, 28991566, -2921652, -2587718, -2312840, 11192685, -913217, - 4209605, -201327, 7618735, -5139465, -2905546, 5167920, -4737349, -6293738, -16470126, -1441498, - -24939264, -961536, 840203, 5277441, -8750996, 5214627, -5763309, 2787971, 2556579, 4786741, - -5018133, -3306051, 4065724, -4242891, -782758, 1754494, 6847252, -194347, 6566468, 411780, - -3903052, -4007205, 2584497, -1746441, 3624953, 5240934, -2123325, -6952479, -3092377, 9046812, - -3045132, -517007, 5702643, -3775276, 2945811, 2426120, 5311264, 4532264, -2291902, -2798171, - 2885144, 827318, 2857764, 234613, 3656628, -1589675, 467078, 2693481, 2557653, 2423972, - -2949569, -3606162, -514322, -206695, -2331094, 1547262, -691490, 3000035, -77846, -282394, - 228170, 499827, -2229625, -44560, -1858647, 351650, -403190, -55298, -856846, 185220, - 323196, 936303, -66035, 834834, 1243930, 459562, - }, - { - 2803540, 30292942, -4715874, -6266358, -5894843, -4648765, 2815888, 423054, -4906464, 4441533, - 8108362, -6193343, 14179835, 1654099, 12251394, 2450279, 38676180, -9806484, 3695283, -7490960, - 3769908, 26277146, -15838229, 4277788, -15875810, 13114683, -14324253, -930934, 10479720, 19352048, - 1503775, -7973070, 13753559, -2299955, -5078262, 9202504, -8450885, 3764002, -5181878, 125091, - 912144, 1360431, 1715303, -1772748, 2908767, -9993852, 5841156, 383863, -5228049, -1689533, - -220654, 766652, 113280, -89121, -5200669, -6129992, -681289, 5203353, -1399623, 2218888, - -169114, 979253, -499827, -862215, -512175, 541166, -3706557, 839129, -2543158, 752156, - 1150514, 2084670, 2519535, -2796561, 1278827, 2380486, -513249, 2451353, -1387811, -1367410, - 4266513, 2018635, -1515587, 1861332, -1054951, 1605244, -548145, -674310, 1014686, -991601, - 620086, -136902, -1903207, -827855, 284005, -2455648, - }, - { - -28943784, 139476384, 22012, -6705518, -14390288, 25698936, 4225174, 21734146, -14655502, 8777839, - -1014686, 11870216, -2596845, -1622961, 7757785, 19302120, 15525233, -922881, 393526, -7510824, - -11074036, -7610145, -9263171, -5862094, -5444408, -3013457, 3762928, 1279900, -9258339, -5800354, - 12887586, 5071820, -5020817, -4070019, 2541010, -7484518, -3907347, 775242, 2462090, -5289789, - 7689602, -5143224, -3649649, -3952981, -646929, 13386876, -2787434, -3631932, 2330020, 5150740, - 3020436, -7072201, 2178085, 1756642, -2657511, -1910724, -414464, 1806034, 464930, 1064078, - -1099512, 5648419, 1248762, -568546, -848793, 617938, -3511673, 23622, 919660, -4387846, - -121870, -368293, -1739999, -343061, -2821257, 462783, -136365, -106300, -3017752, 229781, - -964220, 1829119, -536871, -2421825, -609349, -1627256, 825171, 2025614, 1407139, -2617783, - 1846836, -1022739, 472446, -180389, 795643, 1039382, - }, - { - -7241315, 43906376, 7307887, 7102802, -10000294, 2261837, -5730023, 3525095, -3111167, -3390877, - 1450625, 3222836, -6567005, -40622336, -98909872, 3423626, -24673514, 12756053, 10246718, -36740760, - 13282723, -9110163, 4442070, 10159745, 1804423, 18670760, 1562294, 8724689, 7058242, 9232569, - -7894150, 3576097, 9539122, 4700842, -1671816, -17425220, 11454141, 8459475, -882079, 5889474, - -5483063, -4735739, 4938139, -2636573, -6784438, -3428995, -931471, -3599183, -1545651, 3240553, - 1177895, -1705102, 1600949, -3325915, 635655, 2775623, -2538863, 3182034, -5510980, 826781, - -3419868, -2101850, -4196720, -3650722, -969052, 144418, 4181151, -2554969, -3519189, -43487, - -4594542, -830002, 3869766, -2608656, 1560147, 2036888, 332860, 882079, -1443109, -150861, - -2214056, 1219771, 1418950, -1806034, 1915019, 2062121, -68183, 3196530, -104690, -782758, - -1027034, -1130650, 541703, 1083942, -610422, 1433982, - }, - { - -29923574, -5252208, 4825396, -1319092, -15112379, 6959995, 6106370, 17088064, -2114735, -2407329, - -10042707, 9489193, -396748, 5791764, 28906204, 13491029, -561030, -4733054, 518080, 15277736, - -5194763, -10362682, 5310190, -3397319, -10819023, 6873022, -6156299, -2754148, -1056025, 2710661, - -6441377, -3969087, -3316252, -1687922, 10408316, 5857799, -16273094, 9411884, -1035087, 4695473, - -7478612, 3425773, 4430796, 2902861, 3489661, 3073049, 7479686, -2017561, -1096290, -1655173, - 645319, -3215857, 56371, 9061307, -3616899, -4448513, 10790032, 2511482, -1774358, -2826625, - -4693326, 198642, 3999152, -256624, 1048509, 94489, 3062312, 3723200, -3156264, -794569, - 203474, 1435056, -3285650, -1243393, 1459215, 3129421, 4317516, -2115808, 1035087, 3058017, - 1452773, 3179887, -1249299, -671626, 689342, -1927904, -955093, -797790, -1658394, -757525, - -2920041, -190589, -2394444, -928787, -100395, 827318, - }, - }, - { - { - -1056025, 32141924, 16557636, -22859964, -10030896, 1992865, 1153199, -3208878, 2787971, 3856344, - 7206419, -5392332, -2299955, -14992120, -13644037, -28285580, -18778670, -2626373, -18520972, 8691940, - -5235565, 4821101, 5631776, -4417911, -6512244, -18739480, -10378788, -5233955, -8738111, 4858145, - -15646566, 1504849, -8660265, 6833830, 2891050, 12308303, 1640678, 3157875, 6784438, -5126581, - -1243930, -3621194, -245350, -2008434, -1563905, 5376226, 103616, 3253975, 3854733, 3374771, - 5833640, 1203665, 8400956, 115964, 7836705, -2134062, 2870112, -3718368, 2735357, -2334852, - 1688459, 1409286, 1763084, -3525631, -644782, -1906429, -2393908, -1071594, 2272038, 2571612, - -3158412, -1661079, -1383516, 3699578, 47782, 1769527, -200790, 1147830, 1420560, 123480, - -1357210, 1818919, 1672890, 271657, 10737, 180926, 2095944, -252866, 22549, -420907, - 266288, -823023, -852014, 1389959, 1968706, -929324, - }, - { - 17460652, 149785904, -35497368, -3950296, 5856188, -348429, -7390028, 206158, -20883742, -3567507, - 8083129, 13321915, -6576132, -5414880, 2527588, -6927246, -2365990, -3750043, 6956774, 6521908, - -2932389, -12639015, -12764643, 8260296, 3809099, -3680787, -1109712, 10520522, -2149094, -4335770, - -5179731, 9877888, 1237488, -11812771, 12852690, 8516383, 1349694, 5140539, -6745246, 5885179, - -3698504, 6420439, 2369748, -6017786, 6675453, -1600949, 2915746, 2077154, 5366562, 2971581, - 6969658, 8455180, 3353833, 7391639, 1437740, -2189360, 4590783, -299574, 1182190, 5106716, - 2698313, 3948149, 56908, -5585605, 2193118, -727460, -2677375, -467615, 2684355, -1288490, - 1828582, -431107, 141197, 2417530, 534187, 699543, -1335198, 751082, 641024, 1723893, - 761283, -2356327, 1350767, 776315, 422517, -961536, 1366873, 1042066, -773094, -1222455, - 1567126, 851477, 610422, 2069101, 688805, -1381369, - }, - { - -2119030, 118753160, -23189066, -8553427, -4473209, 4613869, -4804458, 5433134, -7385733, -8905078, - -23308250, -21383568, 1352378, -566936, -6742562, 4808753, -1453310, -9177271, -8313983, 2774012, - -7943542, -6833830, -2908767, 2356327, 16907138, 6048925, 2337536, 1415729, 6570763, -13527536, - -6053757, -2047626, -799401, -4289062, -7474854, 853625, 350040, -6138582, 5324686, 6007049, - 1555315, -3664681, 4176856, 3213173, 1283122, 5131412, 2616172, 809601, 7081328, 1422171, - 3258270, 1819992, -3481071, 1959579, 191126, -3566434, 2787971, 1273458, 1410360, -1895691, - 362925, -530965, -895501, -1446867, 3769371, 404264, -4125853, 1652489, 2463164, 4552129, - 912144, 643171, 471910, 1461363, 884226, -1462973, -955630, 683974, 1442572, 1966558, - -384936, -1011465, -620623, -17717, -1086627, 612570, -413927, -731755, -578747, 443992, - 380641, 333934, 1227287, -787590, -339839, -709743, - }, - { - -718333, 23880556, -1679869, 7883950, -559956, 806917, -372052, 2036351, -4489852, 152471, - 1891396, -8404177, 8926553, -3448859, -33062658, 675921, -10832444, -9538049, -2565706, -4933307, - -14564234, -14547054, -1973001, -1121523, 10893111, -2317672, -8937827, 4126390, -10602127, 11538967, - 9157407, -1121523, 923955, -6246493, -2597382, -1533303, 7274064, -3792993, -2848637, 135291, - 2154463, -1184874, -7069516, -1249836, -2641942, 6228240, 5591511, 2104534, -3746285, 5119064, - 18790, -7429757, 715112, -1547262, -212601, -1619740, -166967, 3809636, 967978, -2080912, - -2334315, 1381906, 514859, 3863860, -1850057, -2211908, 583042, -483721, 1318555, -2107755, - -3869766, 1326608, -157840, -498216, -477815, 476741, -252329, 2015950, -101469, 942208, - 393526, 2289218, -1473711, 516470, -1312113, 40265, 306016, 137439, 92879, 1538672, - 766652, -990527, 380105, 627602, -683437, 445603, - }, - { - 11076184, -292373984, -9938554, -7005092, -2616172, -104153, -2028835, -898185, 15547782, -16666084, - 261456, -5497558, 11542725, 2623151, -6931004, -5195837, 6128919, -14703821, 4839892, -8990440, - -10267656, 6047851, 3776887, -4172024, -8672076, -2847027, -15264851, 1272921, -4860293, 782758, - 15129559, -8570070, 4584878, -10504953, 3030100, 5260261, -23267986, -6908992, -9334038, -2007360, - -7929584, -7895761, -461172, -117038, 1713692, 3402151, 6595459, -6601902, 7595650, 1953673, - 5187247, 2114198, -2090039, 5359583, 2361158, 1231045, -5546414, 2808372, 1242856, -48855, - -3758, 654446, -169114, -1305670, 5339181, 798864, -6361921, -393526, 2237141, 175557, - 79457, -1005022, -1422708, -666257, -1621350, -1902671, -565325, -748398, 2730526, 581968, - 1821603, -422517, 1540820, 369904, -1672353, -1069984, -689342, -266288, 592169, -722628, - -1174674, 8053, -148713, -1645509, 390305, -104690, - }, - { - 1194538, 4672388, 1777580, 642098, 3658239, 135291, -260382, 1760400, 1757179, 1029718, - 1910724, -581968, -13795435, -16760573, -54692112, -224412, 5650030, 1654099, -4843650, 8919036, - 12610024, -2012729, -12150462, -13431436, -10431402, -8062191, -9999221, -14117021, 11631845, -4278325, - -5872831, -8344048, -2369748, 11398843, 12338904, 3760781, 5439039, -609885, 981937, -10106595, - 3388729, -6581501, -6633577, 2508261, -2500745, -1855426, -1532767, 694174, 2294586, 4005594, - -2498597, 1804960, -243203, 6328098, 2428804, -2297808, 351650, 6454262, -1687385, 4229469, - -3324842, -328028, 4385162, -3573413, -613643, -881005, -2438468, 1451162, 164283, -3044595, - -5368709, 606664, -2069101, -1002338, -1973538, 1963874, 1722282, -2643016, -457951, 188442, - 500364, -140123, 38118, 608275, -991064, -2193118, 469762, 942208, -587337, 654446, - 229244, 17717, -49392, -581431, 69793, -384936, - }, - { - 43120396, -341536352, -24247774, 9126806, -1198833, 3797288, 7574712, 2231773, 1661079, -7216082, - -4119948, 173946, 9685688, -27049168, -120259, 6160057, -1269700, 19065360, -20792474, 1840930, - 5951751, 6109054, -3753802, 585726, 2328409, 9323837, -2685965, 52613, -6437619, -125628, - 157840, 994285, -702764, 2277943, -11856794, -1204202, 11482058, -7152195, 1297617, -6189585, - 5575942, 712965, -337155, -2372970, 2479807, 2994666, -9764608, 6792491, -2634426, 3237332, - 3314641, -1760400, 7078106, 3153580, 1742146, -510027, 2591476, 5628018, 2185602, 568546, - 280784, -3337190, 3834869, 759136, -2280628, 1185948, 2998424, 2222646, 1481227, 328028, - -1799054, -1785096, 2632815, 457951, -2597918, 933082, 1994476, 200253, -2659659, 2924336, - -2628520, 145492, 2495376, 231391, 1461363, -649077, 1948841, -1138703, -10201, 99321, - 170188, 1608465, -922881, -969589, 1029182, 725850, - }, - { - 1406602, 387621, 5078262, -1131187, 1567126, 1218160, 879395, -4216048, -4156455, 5564130, - -3956739, -365072, 4832, 9951439, -2983392, -2626909, -10539313, -36674188, 12838194, -34335580, - 1808181, -11274, -3548717, -6971269, -2961917, -6186364, 4603131, 4119948, 6002754, -32789390, - -14176613, 5168993, 1364189, 14170171, -741956, -725313, -1491427, 7218767, -4080219, 2139431, - 4012036, -5407901, 2156074, 274878, 221191, 8782134, 1909650, -4717485, 2050310, 188979, - -1893544, 2776160, 2528662, 2618856, -1298154, 3277060, 1304060, -7089918, 960462, 2208687, - -2960843, 3701725, -3335579, 862215, -970126, 1610613, -4566087, 2359548, -1651415, -234613, - 4020626, -752693, -852551, -1068910, -2880849, 857383, -811212, -830002, 950798, 2292976, - -934692, -1950452, 1606855, -1265942, 1737851, -1279363, -265751, -1991254, 1203665, -556735, - 692027, -361851, 26844, 332860, 72478, 695785, - }, - { - -43431248, -396807744, 26431766, 34184180, 591632, -1273458, 6720013, 2005750, 6869264, 9212705, - -19850266, -5544266, -8906152, 16672526, -9780177, -740882, -5011690, 11157788, -5066988, 418222, - -4594005, -8294119, -3138547, 10529649, 7322383, 6456947, -3348464, 3576634, 4739497, -2706366, - -5915781, 6305012, -3315178, 6590628, -3710315, -3238405, -4065724, 7359964, 523449, -11586211, - -8903467, -796180, 805306, -3090229, -875636, -2721936, 7422241, 5443871, -4077535, -4452808, - -2816962, -4694936, 3134789, 3308736, -5357435, 3896072, 2748779, 3656091, 1401770, -165356, - -1922535, -1205275, 3932043, -1953136, 1006633, -704912, -250182, 1800665, 762894, 1717987, - -507343, 1709934, -138513, -1841467, -348966, -960999, 1163399, -167504, 1064078, -59056, - 1318555, 6442, -335544, 2292976, -1316408, 471910, -916976, -1667521, -874026, 2091112, - 953483, -784905, -470836, -1641214, -215285, 1968706, - }, - { - -4781909, -15111842, 10331544, -3146064, -14993731, 4503810, 4307852, 4306779, 2672544, 6052683, - -1154809, -4132832, -2668249, -24176908, -21080236, 2484102, -19461570, 13932874, 48187924, -14700599, - 1007707, -8964670, -6170795, -9423158, 17769890, -1621887, -1096290, -7012071, -6777996, -7380902, - -11164767, 1913408, 11982422, 7556458, 46708, -3279745, 956167, 13017509, 1122597, -12472048, - 4137127, -2952253, -263067, -876173, 6365679, 3623342, 3342558, -762357, 5209796, -909459, - 8100845, -1493038, -6518150, 108448, -6143951, 4839892, 2463701, 180926, -8705899, 2574833, - 3419331, 1392106, -1044214, -460635, -1229971, 2010045, -995896, -5874979, 4161287, 1381369, - 2085207, -3311957, -2328946, 1348083, 831076, -978179, 2423972, 462246, -1185411, -1191317, - -314069, 1331977, 2088428, -798327, -760746, -1613297, 1344862, -368830, -135828, -1345399, - 1403381, -528281, 2670933, -1468879, 374199, 1316944, - }, - { - 21157546, -246447904, -2017024, 10850161, 5231270, 12321724, 18292266, 3229816, 3619047, -14674830, - -4631049, 12509629, 18887118, 11058467, 6008659, 3789235, -4620848, -552977, -11310260, 7488813, - -17001628, -3899830, -4850092, 1397475, -6236830, 8419747, -13774497, -205085, 5144297, 9660992, - 2116345, 2649995, 3892314, -8096550, -930397, 2952790, 9301825, 990527, 3170760, 2634963, - 3358128, -6394670, -4825396, -8764955, 450435, 2910377, -4626754, -3590593, -2989297, 5870684, - -9430674, -7851737, 763967, -1007170, 4871567, 1256815, 3695283, 2079301, 2754685, -2094870, - -4122095, -5647882, 2002529, 186294, -219580, -3800509, -2077154, -1443646, 2392834, 2885681, - -1290101, -956704, 848256, 2135136, 1892470, 1603097, -317828, 570694, -3578245, -894427, - 1089311, 583042, -2864206, 869731, -753767, 743029, 448287, -90194, -1249836, 1115081, - 932008, 1050656, -302258, 587874, 1497870, 578210, - }, - { - -2254321, 46684148, 11242614, 557272, 9555228, 3820374, -414464, -1328219, -4334696, 5997385, - 9574556, -8295193, 21795348, -6536940, -2135136, -16376710, 19963008, -6790880, 9593883, -17218524, - -3468723, 7374459, -14379551, 31527744, -15675020, 1725503, -3608310, 8519068, 3505230, 15936476, - -4831302, -13120588, 26124138, -3519726, -10732050, 8448738, -9835475, 13999983, 9117679, 14146549, - 10146860, -3795677, -242129, 6948184, 6414534, -9478993, 4284230, 1220308, 5032628, 2375654, - -3819837, -694711, 1771674, 1002875, -7471633, -3827353, 456340, 1351841, -2167348, -194884, - -3570729, -862752, -463320, 425202, -3076807, -1076426, -3283503, 12348, -1143535, 722628, - -350040, -52613, 1050656, -1522566, 3890167, 3382824, -3167002, 1991254, -139050, -1235340, - 3675418, 1821603, -512712, 2660732, -1320703, 1358283, -484258, 13959, 1974074, -358630, - 323733, -193810, -1156420, 734976, 438087, -1174674, - }, - { - 1233729, 182113056, 1316944, 1617055, -12113418, 24406688, -16455630, -14671608, -36153960, -4112968, - -10447508, 6768869, -4708895, 370978, 2716567, 5817533, 7975218, -4123169, -10921565, -732292, - 5660230, -8626442, -16276852, 1929514, 9732933, 9439801, 10327786, -279173, -13145284, -5146445, - 3775276, -3266860, -81604, -1240172, 1083942, -1690607, -6060199, -8144332, -2224793, -10449119, - 795106, -1964411, 3335579, 1349157, -6824703, 1101659, -3748970, -6627135, -3728032, 811749, - 5616744, -5027259, 1910724, 6488622, -2828773, -255551, 3218541, 5713380, -497679, 1097364, - 2877628, 4904316, 98784, 1423782, 2252174, 1043140, -2597918, 2191507, 4998805, 740882, - 1877975, 130460, 606664, 1642288, -1227824, -35970, -1995012, -1618129, -3422552, 3320547, - 958315, 641024, 443455, -1405528, 544387, -50466, 880468, 455267, 786516, -2129767, - 1971927, -897648, 239981, 321586, 227633, -198105, - }, - { - 6831683, 35669168, -11880953, 10786810, -2644089, 4704063, -10935524, -207232, -9823664, -10012643, - -5651103, 1430761, 1239635, 24888262, -25872882, 7214472, -15599321, 5498632, -1544041, -15327128, - 34049428, 5927055, 1350767, -7168838, -15795279, 9767829, 14597520, 30242476, 2361695, -3588445, - -15870441, -1750199, -2335389, -4971962, -8636105, -12033425, 12920335, 2453500, -2393371, -1937567, - -8099235, -7009387, -1660542, 244813, 923955, 1712081, 1438277, -1084479, -5058398, -3820910, - -2396055, -2129230, -636192, -1996623, 2533494, 340376, -6091338, 2186675, -1800128, 863825, - -826781, 1087164, -631360, -900333, -68719, -688269, 1771137, -462783, -105227, 1509681, - -1332514, 4112968, 7154879, -2633352, -678068, 3003256, -127238, 150324, 287226, 1580548, - -2594160, -821949, -92342, -3154117, 56371, 725850, 426276, 1600949, -2287070, -658741, - 1034550, 1300301, 607201, 781147, -417149, 496069, - }, - { - 24074902, 75182328, 3749507, -2719788, -13708462, -3293166, -1360431, 21818970, 5280126, -7992398, - 12069932, 22659174, -8328479, 10433549, 28362354, 11324218, 10424422, -488016, -9284109, -433255, - -16639777, -10716480, 3065533, -2682744, -3326989, -4188130, -10123238, 1697586, 4063039, 8398272, - -7771207, 3991098, -10737, -2810519, -6569690, -8128763, -14106283, 8191577, -10481331, -2418067, - -7314866, -5195300, -4529580, -3000035, -421444, 1899986, 3221, -7528541, 3180423, 2112587, - 181462, -1827509, -50466, 6346888, -2472828, -4858682, 4483946, -1478006, -1385664, -1181116, - -708670, 1356136, 2977486, -508417, 1489280, -5906, -629213, 1825898, -2012192, 1743757, - -2431488, 761820, -35970, -99321, 646929, -1340567, -340376, -1628330, 746787, -583579, - -2012729, 2728378, -959925, -390305, 491774, -1500017, -405338, 1382443, 644245, 278636, - -1224603, 1138703, -790811, -964220, -115427, -214748, - }, - }, - { - { - 1659468, 43694312, -1130113, -5679021, -15483357, 504659, 954020, 2163053, -4516695, 16495359, - -4649302, 7646116, -18400176, -1056025, -32696512, -11315091, -20421496, -14693620, 1362042, -1345935, - -5236102, -4093104, 4343286, -11688753, -1453846, -6610492, -17100950, -10096394, -13415330, 3228205, - 772020, -4634807, -7413651, 6628745, -2984466, 11326903, 501437, 10735271, -3810710, -2397666, - -6116571, 1613297, 3354370, -7553774, -4592394, 8625905, 4913443, 2390686, -1086090, 4668630, - 3234110, 2166811, 7222525, 3835943, 5464272, 2379949, -2587181, -1845225, 1687385, -1592896, - 2546379, 3973382, -1233193, -429497, -872952, -756988, 48855, -2398739, 1759326, 2710124, - -2399276, -1860795, 203474, 4734665, -315680, -352187, 2276870, 231928, 1918240, -526134, - -236760, 510027, 1669132, 1212791, 974421, -736587, 549756, -206695, 649614, -189515, - 140660, -696858, -153008, 1110786, 1452236, -600222, - }, - { - -19493246, 123713848, 11343545, 13790603, -5155035, 24696, -777389, -14802605, -10577968, 919123, - 11311333, -5759015, -689879, -9993852, 1882269, -23429584, 4361003, 7385733, 590021, 2042794, - -5702643, -11628087, -9985262, 12384538, 198105, 8189429, -1901597, 1420560, 3032247, -1911261, - -6245420, 2260764, 2528662, -10234370, 9177271, 9725953, -293668, 6874095, -52613, -2857764, - -3380139, 563178, -762894, 4434017, -2499671, 3121368, 1244467, 7129109, -282394, 4796942, - 5199595, 4845260, 6873559, 7007239, 3751654, -3352222, 972810, 2565706, 2767033, 6812892, - -1906966, 3598646, 2224793, -442919, -2442763, 1289564, -3320010, 798327, 2026151, -655519, - 1349157, 90731, 1680406, 670552, 312459, -96100, 1888712, 363998, -617402, 849330, - 421981, 507880, -110595, -12885, 426812, 575526, 753230, 881542, -388695, 55835, - 547608, 850404, 544924, 2092723, 649077, -1578937, - }, - { - 260382, 76726904, 6925635, 6446746, -13419625, 100932, -3051038, 2639258, -3904662, -11500312, - -16299938, -16360604, -4639102, -120796, -4641786, -3500398, 1455457, -5033702, 2887292, -15834471, - 4831302, -11519639, 5240934, -6672769, 2806761, 6775848, -936303, 5021354, -2087354, -10607495, - -14858976, 8104067, -3122441, 1903207, -8574902, 675384, -1539746, 517007, 3125663, 6408628, - 711891, -840203, 8326331, -4850092, 2586644, 9292162, -277025, 3247532, 6512781, -486405, - 4660040, -1338956, -3412352, 2288144, 2214056, -4567161, 3856881, -1977296, 1226213, -2241973, - 4338991, -4414690, 3062312, -2394981, 2938831, 852551, -956704, 154619, 2664490, 3286187, - 2426657, 274878, 312459, 1324997, 846645, -1749125, -1255741, -666794, 1782948, 717260, - -985158, -271120, 774168, 618475, -1257889, -204548, -5906, -876173, -326418, -3221, - 322123, 803696, 359704, -882079, 172336, -288837, - }, - { - -306553, 20314658, -876710, 4720169, 4095788, -465467, 1447404, -2782602, -2041720, -164819, - -149250, 637266, 3650722, -8075076, -31554588, -12404402, -5463199, 9184788, -6764574, -14079440, - -14340359, -40802, -14914811, -2159832, 12933757, -10737, -7283191, -8373039, 5345087, 3029563, - 1351841, -6722161, 1050656, 11689827, -9520869, -5392332, 14410689, -9658308, 5167920, -4388920, - 1225139, 18790, -6068789, -900333, 242666, 3473555, 1486596, -1910724, 9702868, -1163399, - 217433, -3184182, -3461744, -360240, -776852, -1167694, -1163399, 4221953, -785979, 1402844, - -2518998, -183610, 3606162, 1989644, -2416456, 1693828, -253940, -1724429, -663036, 391916, - -767725, -2164664, -234613, 978716, -1206349, -653909, 366146, 2885144, 342524, 183073, - -405874, 1898912, -147103, 202937, -406948, -818191, -20938, -490700, 1294933, 1474784, - -353261, 345745, -774168, 619012, 386010, -380105, - }, - { - -30802968, -281631744, 15406585, 1222992, -3622805, -722628, -2847563, 5669357, 2746095, -2742874, - -1529008, -2319282, 7543037, 431644, -6064494, -16800838, 5044976, 6200859, -2367601, -12514461, - -8107288, 9126806, -8652748, 1247688, -5204427, -8539469, -9585830, -2993592, -8883066, 5711233, - 9028558, 1235340, -4303557, -5238787, 3524558, 4319127, -16750909, -16441672, -9619653, 1080184, - -5395553, -4573604, -4254165, 661425, 156766, 995896, 6794639, -5607080, 4013647, 7373922, - 1960116, -677531, 2416456, 5601174, 2869575, -1509681, -3277060, 2660195, -2724083, 2441689, - 523449, -430570, -874026, -55298, 1719598, 1333051, -3717831, -664109, 2143726, 227633, - -605590, -1981054, -2893197, -360240, -3110093, -567473, -434865, -317291, 1650341, 1012539, - 369904, 649614, 671089, 483184, -459025, -2189360, -8053, 217433, -1280974, -1184874, - 256087, -842350, 610959, -1758789, 281857, -1011465, - }, - { - -613107, 17244830, -2179159, 1318555, -263604, 244813, 879395, -1362578, 4281546, 4213900, - -6009196, -1866163, -6863358, -29739428, -65799436, 12357695, 941135, 106837, 6390375, 11014981, - -3394098, -16073378, -157303, -10952167, -13445932, -12976170, -1905892, -15555298, 9783399, -2681133, - -10838887, -1414118, -11611444, 13276281, 14261976, 4010963, 1612223, 531502, -972273, -494458, - -4261145, -6036577, -4191888, -5083631, 3959960, -3845606, -537, 3654480, 1670742, -3579318, - 1968706, 754304, 2828773, -111669, 4527970, 1977296, -1835025, 6324340, 69793, 2334315, - -4877472, 76773, 2129230, -1473174, -1861332, -2537252, 2587181, -1842541, 845572, -584116, - -2773475, -541166, -3571802, -3645890, -111669, 163209, 3215320, -789200, -1592896, 2478196, - -439160, -478352, -45634, 133681, -1697049, -92342, -718870, 1370095, -404801, 173946, - -17180, 92342, -192200, -733366, 1132798, -805843, - }, - { - -65582540, -257999216, 15594489, 17696876, -1660005, 1828046, 4052839, -5189931, 9891847, 10537165, - -5113159, -4283156, -3485903, -13158169, -12601971, 5074504, 8609799, 6598681, -8122857, -930397, - 5648419, 826244, -8698919, 7119982, 4344360, 3784940, -1128503, 3447785, 956167, -8014409, - -820339, 5902359, -2614025, 168577, -4511863, -3622268, 3099893, -7102802, 5363341, -891206, - 2042794, -2709051, 5804112, -5163625, 5160940, 532576, -4736812, -2737505, 2856153, 4947803, - 2138894, 7856032, -5908265, 2425583, 5788542, -2034204, 3520263, 4256313, 1739462, 828392, - 397821, 829466, 368830, 3743601, -2521146, 1764695, 370978, 2485176, -932008, 1129576, - 1423782, -1170916, -526670, -626528, 1234803, -11811, 796716, 1605781, -1660005, 1221918, - -1192390, -198105, 1258962, 1167157, 996432, -225486, 1269163, 172336, -300111, -91268, - 67109, 408559, 186831, 435402, 149250, 1648731, - }, - { - -408022, 17659294, -7078643, 2522220, 45097, 2114198, 1341640, 1488743, -7792145, 2312303, - -6353331, 2733747, 7087770, 1865626, -6147709, -9663676, -13796509, -16086263, -9734007, -22100292, - 4868346, -13201656, 8527658, -11456825, -1660005, 3285113, -660888, 13091060, -12391518, -28672128, - -11480984, 7733626, -4299799, 13937169, 3946001, -3444564, -2134062, 11154030, -7598334, 6259378, - 8945343, -10517301, 6132677, -4359392, 3578782, 2481417, 3802657, 1819456, -5888400, 1478006, - -1014686, 7853348, -2332167, 3828427, 4320737, 1639604, -2363843, -2910914, -1786170, 938450, - -1040993, -1235340, -477815, 2155537, 730144, -2346126, -1221381, 1353452, -1668595, -131533, - 3236258, 132070, -1530619, -375273, -421444, -1845762, 137976, -195421, 641024, 2122251, - -1600412, -2082522, 2030983, -989990, 588947, -973884, 24159, -1392106, 380641, 266825, - 766652, -926639, 108448, -320512, 828929, 94489, - }, - { - 13789529, -432349120, -9316858, 37692632, 6614250, -6586333, 9441412, 2237141, 7334194, 2596308, - 10031433, -32259500, -7840463, 7767449, 8599061, -21467858, 10155987, 9037685, -2418604, -2457258, - 1271847, -14106820, -2142115, 11009075, 7947300, 1110786, 1835025, 1000727, 1811403, 1659468, - -669478, -1690607, -5004174, 9897215, -3594351, -5173825, 1263257, 3148211, -6870337, -5577552, - -11755325, -2580739, -1453846, 1780264, -2351495, -2221035, 6360310, 4881231, -5039608, -167504, - -1143535, -7447474, 4519380, -2344515, 4657355, -462246, 3080565, 3932043, 766115, -74088, - -2269890, -936303, 585189, 136365, 794032, 904628, 5369, -714038, 1534914, 731218, - 1824287, 572304, -2482491, -517544, 1098975, -394063, 45634, 1597191, -715112, 337692, - 803159, 326418, 170188, 2047626, -731218, -1403381, -710817, -1363115, -470836, 1398549, - 782758, -610959, -843424, -643708, -665183, 1723356, - }, - { - 4402342, 24000278, -20638392, -10007274, -11377368, -4130148, 11584064, 11420318, -3773129, 9361418, - -11887933, -2324651, -11295764, -24926380, -12458090, 153545, -4541928, 6148783, 13810467, 14764487, - 3675418, -9804337, -6129992, -5861557, 4399121, 2236604, -3870839, -12070469, -6546604, -4025458, - -1159104, -4667556, 10943577, 16042777, -5806796, 351650, -7486665, 21470004, 1228361, -11120207, - -606664, 1439351, -8379481, 5412733, 2002529, 7183333, 1577327, 2310156, 2073396, 3308736, - 5296232, -1016297, -1560147, -4778151, -2421825, -43487, 1527398, 1326071, -3729105, -113280, - 6309307, 1425929, -4292820, 1824824, -1005022, -170725, -3052111, -3672734, 4619774, -78383, - 5130339, -3076807, -3811784, 386010, 2335389, 1685238, 391916, -337155, -675384, -2082522, - 1414655, -1064078, 1513439, 1261647, -502511, -1166084, 92342, 125091, -1316408, -375810, - 955093, 535260, 1667521, -1088237, 703838, 991601, - }, - { - -22715546, -242671552, 27535572, 22225918, -18429168, 27138824, -2397129, 14084808, -8698919, -6353867, - -6542309, 10031970, 16514686, 34616900, -12924630, 5430450, -11161546, 1603633, -9094593, 5031554, - -3446175, -4982699, -7240778, -10573673, 4159139, -494995, -5663452, -1707250, 771484, 11167452, - 6093485, 638876, 1045825, -2805688, 3115999, 4617090, -782758, 3008088, -5614059, 7562364, - 4290136, -4291746, -8140037, -4775467, -2543695, 2164127, -2317672, 192200, 3037079, -5430986, - -8883066, -6760816, -2700461, 7911330, 1111860, 4146254, -1792075, -439160, 5907728, -2885681, - -3190087, -5768141, 1936493, 785442, -2138357, -1207423, -3002182, -3107946, 3437048, -1001264, - 423591, 2835752, -23085, 767725, 4185983, -551366, 351114, -1055488, -3451543, 670015, - 945430, -233002, -2273112, 285615, 782758, 767725, 340376, -355409, -750546, 495532, - 772557, 656593, 1014686, 596464, 387621, 213138, - }, - { - 1212791, 57120380, -9315247, 8318815, 10450192, 7386807, -806917, -5233955, -2434173, 2804614, - 2126546, 1678795, 564788, -19940996, 45847164, -12065100, -7490423, -1639067, 25330644, -15655693, - -4089346, -2389076, 3927748, 9267466, -6273874, -11809013, 8712878, 13330505, 3746822, 5954436, - 5203353, -3019899, 15180562, -6738267, -4700305, 2457258, -3048890, 7066295, 15782394, 8243116, - 8967355, -737124, 564788, 7953743, 1286880, 4987531, -595927, -3008088, 3094524, 2496450, - -2157684, 3414499, -5906654, 195958, -3717294, -241592, 2237141, -4091493, 4115653, -3228742, - -3570192, -3430068, 1513439, -372588, -2765959, -4251481, 3075197, -1337346, 411243, -2032593, - 907312, -1577327, -1384053, 4167192, 2424509, 185220, -1509681, 2315524, 1285806, -553514, - 584116, 2506114, 88584, 847182, -132070, -466541, -312459, 847182, 754304, 1100585, - -660888, -599685, 92879, 1280974, -1246614, 588411, - }, - { - 31481036, 167113424, -32633698, 28570122, -18475338, -6715718, -5379447, -12356084, -22699976, -19477676, - -9053254, -11516418, 4145180, 1056025, -1463510, 17522930, -6660421, 6940667, -11511586, -5376226, - 15472620, -20029044, -9550397, 10825465, 13274133, 3957276, 4693863, 6955700, -202400, -6364068, - -5103495, 1793149, -12344273, 8447664, 2269353, -1960653, -1774358, -16052440, -4221953, -1331977, - -1550483, -6307160, 8311299, -4930086, -1976759, -4415764, 3878356, -2241436, -8994735, -1791538, - 945430, 437013, -3540127, 10198937, -4216584, 4505958, 2262911, 6549289, 389768, -3016141, - 4904316, 2263448, 681826, 1693828, 3959960, 1265405, -1214939, 1759326, 2137820, 1891396, - 3092377, -410169, 2212445, 472983, 634045, -1830730, -2029909, -2629594, -264677, 419833, - 4236449, -2386391, 1586454, -1388348, -1868848, 3433826, -107911, -1353452, 1376000, -327491, - 243203, 493384, -527744, 1330366, -24696, -914828, - }, - { - -7019587, 15181099, 16768089, 4073240, 5211406, 6684043, -13003550, -6158983, 1838783, -12561706, - -872415, -393526, 2696703, -24519432, 43195560, -4212289, 10876468, -8980777, -19085224, 24189792, - 4064650, 11868068, -2536715, -13620415, -13289703, 4772783, 16028281, 25185152, -5537287, -3910031, - -4922033, -10950556, -5500243, -373662, -15261093, 4545149, 1724429, 2667175, -4105989, -4454955, - -6150393, -3368328, 906775, -3903589, -71941, 6240588, -3965329, 142808, -4903779, -1096827, - -6402723, 3374771, -4917201, 1312649, 1601486, -188442, -6479495, -3533148, 3444564, -2661269, - 4000762, -150324, 650151, -312459, 2005750, 544924, -3716757, -1574642, 3396782, 1581622, - 2168422, 3809099, 3693135, -502511, -2215666, 3019362, 358093, -1051730, 69793, 1017370, - -1523103, 112743, 636192, -1774358, -1462973, -866510, 1442035, 681289, -1291711, -583579, - 1430761, 306553, 394600, 905701, 294742, -296890, - }, - { - -7113540, 126151776, -8680129, 2920578, -15522549, -19883552, 13873281, 10191957, 6629282, 2054605, - 15210627, 17116518, 3558381, 13173738, 9708774, -402116, 21347598, -6773164, 2871186, -2418067, - -11730093, -4393752, -2061584, -6754910, 6888591, -23833848, 1854352, -3272228, 282394, 20447266, - -5288179, 3526705, -6584722, -5443871, -3829500, -8205535, -3262028, -13764833, 5983963, -11077258, - -8839580, 4701916, -13041668, 4594005, -2853469, -181462, -2510945, -3563212, 10349261, -187368, - -129386, -3499325, -1918777, 1976759, 3405909, -1773285, -1390496, -241592, 1850057, -1118302, - -2471217, 2655364, 150324, 1916629, 799938, -1405528, -1835562, 930397, 1551020, -988379, - -751619, -207232, 1059783, 394063, -180389, 25770, -2861522, -372052, -417149, 587874, - -1984812, 496069, 863288, -2073396, -30602, 855772, 578210, -335544, 1957431, -1057636, - 790811, 167504, -81604, -679679, -1087164, -724239, - }, - }, - { - { - -1377611, 26974006, -11714523, 15314243, 6136435, 788127, 3769908, 7408819, -1481764, 9885941, - -9555765, 14015552, -19273128, 688269, -26709328, 12967043, 2658585, -872415, 7468412, -15247134, - -13518946, -13762686, -3675418, -27098022, -9053254, 5835787, -9786083, -5213017, -11176579, -11405823, - -10476499, -2422899, -577673, 7712688, -5547487, 9488120, 2098629, 9423158, -6889128, 1898376, - -2800319, -713501, 2191507, -2196339, 2586107, 5617281, -790274, 3118146, -766652, 1859184, - 151398, -1892470, 2724083, -201327, 805843, 315680, -4432406, -933082, 4846334, 1966558, - 4270808, 2368675, -599685, 5050345, 3754875, 739271, -322659, -728534, -73551, 2157147, - 876710, 505196, 1378148, 2888903, -1317481, 1048509, 1959042, -1713155, 1320166, 511638, - 562104, -1584306, -468688, -181462, 1193464, -627065, 19864, 411780, 1122597, 158914, - -125628, -1202054, -343061, 397821, 585726, -456340, - }, - { - 16781510, 106806712, -29781840, -2672544, -14772003, 2020245, -3032247, -3692061, 2252174, -8607114, - -11590506, -15705622, 6040872, -7547868, 8546985, -6709813, 8542690, 1709934, -337692, 1133335, - 4288525, 8925479, -2445447, 2981244, -7542500, 9917616, -2260227, 3019899, 7698192, 3501472, - -6847789, -2328946, -947040, -5781026, 3689914, -1995012, -2258079, 1986422, -2765959, -5367636, - -8398272, -6986301, -2115272, 5288716, -9368397, -508954, 111669, 6388764, -5161477, -227633, - 2942053, -368830, -893890, 1936493, -2146410, -5570573, 192200, -188979, -719944, 2236604, - -3010235, 2775623, 736050, -243203, -1637993, 2177012, -1396401, 3974992, 1964411, -300648, - 533650, 635118, 3140158, 591095, 2046015, 1180579, 2647311, 150861, -1345399, -1487132, - -1134945, 2473901, 426812, -1269700, 170188, 1535988, 345745, 283468, -772557, 344134, - 836445, 699543, -75699, 734976, 359704, -518080, - }, - { - 912144, 24743844, -22196928, 33037962, 3935264, -2644626, -6556268, -482110, -237834, 3925063, - 14539001, 5364414, -2943663, 14147622, 11687680, -1377074, 4440996, 11978664, 15969762, -11262478, - 10928544, -14331232, 6584722, -3923990, -6211597, -346819, -8797167, -6912213, -6612639, -6348499, - -7057705, 12948253, -6578280, 1864553, -6641630, -1979443, -45097, 3975529, -2025077, 7391639, - 2656974, -728534, 4911832, -8056285, 2690797, 7546795, -609349, 839666, 328028, -3352759, - 4882841, 70867, -4336843, -2592013, -2260227, -5076115, 266288, -2687039, 3193308, -2233920, - 4180614, -3775813, 4675072, -772557, 405338, -163746, -606664, 452045, 4032974, 758599, - -1372242, -1093606, -678605, -726386, -331786, -1846299, -1023813, -703301, -961536, -1605244, - -781684, -384400, -340376, -18790, -829466, 187368, 1223529, -537, -599148, 201863, - 64425, -309775, -380641, -331786, 1090922, 900869, - }, - { - 1184337, 26674968, 2776160, -2526515, 29528, -343597, 565862, -2348810, 1349694, -2573222, - -4642860, -1482301, 5924371, -4731980, -13475460, 29572460, 20386600, 665720, 1550483, 2830384, - 8082592, 15904264, -10104984, 2269890, -586263, 7783555, 8504035, -21261162, -526670, -9063455, - -5582384, 814433, -5284958, 12262132, -92879, -9723269, 6924024, -9235253, -1520418, -6718940, - -149250, 3227131, 2620467, 6963216, 4789963, -6981470, -9754944, -4108136, 4982162, -4397510, - 2884071, -1326071, -3171833, -1401770, -506806, 3071439, 1756642, 1221918, 527744, 6759205, - 2901251, -25233, -1516660, -344671, -992674, 3095061, 631897, 900333, 250182, -257161, - 2826089, -130997, -1446867, 834834, 1381369, 836982, -911607, 574452, -849330, -768799, - -1770600, 89121, 330712, 850404, -137439, -316754, -642098, -1542430, 37581, -70867, - -488016, 525597, -984621, 413927, 13959, -1099512, - }, - { - 44453984, -243696448, -28391882, 17664664, 5859946, 1834488, -510027, 8242042, 842887, -5176510, - -11084237, -4523675, 7035157, -4313758, -5464272, -6120866, 17598092, 9832254, -801011, -2201708, - -346819, 639950, -20623896, 4707284, -228707, -879931, 2782065, -7792145, -15520401, 9508521, - 9950902, -1260573, -9338333, -1307818, 2811056, -542777, 5443871, 8040179, 8443906, 8438537, - -2379412, -2742337, -11179800, -6650757, 2624762, -850940, -1950452, -3233037, 4944044, -682900, - -5629092, -1887101, 2608656, 3911105, 1552631, -4228932, -2605435, 1971390, -4236449, 2081449, - 288837, -1655710, -3226594, -1155346, -172336, 2301029, 1315871, 1198833, 905701, -456877, - -65498, -1335735, -1991254, 525597, -4664335, -191126, -629750, -1112397, 265214, -433255, - -9664, -258235, -136902, 1619740, -443992, -1692217, 1292248, 656056, -1152662, -543850, - 1176821, -132607, 1678259, -927713, 641024, -810675, - }, - { - -650151, 6317360, -8517457, 2198487, -1167694, -141734, 89657, -2009508, -39728, -3878356, - -8592082, 4095788, 1847910, -6553583, -45891724, -16262357, -22831510, 3938485, 563714, 7593502, - 3569655, -9284646, 6526203, -8921184, -9682467, -2468533, -3017215, -21919366, -12793097, -19848118, - -2596845, 10401337, -11905649, -3543348, -1339493, -628139, -2250563, 3103651, 2309619, 1561758, - -3674882, -468688, 748398, -6393059, 584652, -3899294, 982474, 5469104, 833761, -5954972, - 804770, -105764, 456340, -3869229, 5811091, 1372242, -6151467, 2453500, -1403917, 3948149, - -2246805, -266288, 1005022, -722091, -1380832, -2062121, 3322157, 916439, 3003793, 1629403, - 1639604, 2197950, -2615635, -1362578, 961536, -3170223, 682363, 572841, 352724, 2598992, - -992674, 65498, 428960, -195958, -258235, 900869, -592169, 1450088, -972273, -187368, - 789200, 774168, -743029, -588411, 1345935, -721555, - }, - { - 72727752, -153870432, -47540992, 40022116, 11057930, -22012, -1344862, -15895137, 395674, 4968204, - -2542084, -1122060, -8202851, -6306623, -5370857, 11674258, 7284802, 6495065, 5616744, 2134062, - 1388885, -6742025, -9539122, 2408403, -1064078, 611496, -319438, 6892349, 5813238, 527744, - 437013, -2093260, -5555004, 3376918, -2747705, -4961761, -1327145, -14125611, -853088, -939524, - 2407329, -134218, 11194295, 1759863, 12095165, 4767951, 122943, -1765232, 1020055, 1644436, - -1235877, 7262253, -7741142, 732829, 6034966, -3423626, 1571421, -1488206, -1490891, -296353, - 1000727, 4647692, 611496, 2280091, 201863, 1778653, -5368172, -1561221, -1694902, 2912525, - 2785286, -388158, -1187022, -1732482, 2001455, 39728, 260382, 2979634, -6979, 1068910, - -372052, 99858, -132070, -880468, -175557, -779000, 398895, 113280, -1611, 1176284, - -173409, -244276, 736050, 281857, -648540, 72478, - }, - { - -1296006, 6168647, -15374372, 2079301, 520228, 664646, 783295, 1682554, -7037841, 1622961, - -3723200, 4880694, 1458141, -14409078, -16664473, 7171522, 16320339, 2411087, -12153684, -135828, - 33729452, 5994701, 24628416, -1148904, -1299765, 9907953, 7021735, 12928925, -14285061, -1698660, - 8676908, 6403260, -347892, 19981798, 8477192, 244276, 920734, 7205345, 128849, 6724845, - 3257196, -9460202, 5312875, -287226, 4844723, -2354716, -324807, 6033892, 116501, 1342177, - -1323924, 1307818, -5559299, -214748, -1263257, 2659122, -1927367, 438624, -1327682, -1872069, - -708133, -2993592, -1234803, 2311229, -549756, -3128884, 1236951, 403727, -1863479, 824097, - 2572686, -1004486, -1257889, 301185, -580357, -1304060, 671089, 592169, 1132261, 1432372, - 331249, -916439, 1635846, 1075352, -270046, -1549946, 1136019, -470299, 806917, -402116, - -157840, -1158031, -694174, -462246, 343597, -628676, - }, - { - 16157667, -406241632, 2036351, 52777096, 13452911, -10241886, 1083406, -1722819, 8130910, -2989297, - 22189948, -4803921, 12438225, 15877957, 24910810, -15637439, -396748, -5332202, -3027415, -6446209, - -1963337, -8362838, 3758, 6040872, -1027034, -3470334, -3515431, -6149857, -471373, 1100049, - -7863012, -6488622, -1224066, 3695283, -9819369, -1585380, 5630166, -3096672, -9551470, 1512365, - -4323959, -1045825, -1146219, -877247, -1898912, -1039382, 235686, 1218697, -374199, 11148124, - 7339562, -4849018, 3179887, -4138201, 4949950, 965294, 1897839, 1758789, 3912715, 2570538, - -2418604, -916439, -2056216, -834834, 1556926, 494458, -505732, -267899, 3088618, 1640141, - 2670933, 1079647, -2313377, 240518, 1828582, -904628, -1262184, 1047972, -657667, -628139, - -772557, 454730, 143881, 762357, -619012, -219580, 359167, -1644973, -1427540, 770947, - 787590, -503048, -204011, 164283, -1207423, 1491427, - }, - { - -3670587, 53792856, 8395587, -4719096, -2297808, -7168838, 6618545, 6046777, -3777424, 10385231, - -14855218, -5414880, -1697586, -10428717, -9611600, 4864588, 1335198, -7438347, -18254148, 12206297, - 12822088, -11443403, -9270687, -12407624, -10723460, -3681324, 2500745, -2900177, -135828, 8724689, - 7196218, -4260071, -3368328, 8764955, -8140037, -706522, -9569187, 11161009, -2217277, -6239514, - -1772211, -1284195, -4578972, 6659884, -5826123, 4113505, 257698, 3508988, 4667556, -649077, - -3136937, -4225174, 1297080, -2365453, 372588, -1172526, -1834488, -1535451, -5301064, -1062468, - 5423470, 993211, -4056597, -203474, -2381023, 2279554, 680752, -3301219, 799938, 340376, - 6058588, -8590, -1078037, 2031520, 2746095, -154619, -522375, 263067, 1451162, 128312, - 3022046, -1240709, -39192, 219580, -625455, -319975, 627065, 880468, -29528, -202937, - -280247, -35433, 363462, -1757715, -2147, 194884, - }, - { - 24057186, -245443952, -24823838, 6665789, -35250944, -14558865, -45432700, 14822469, 9667435, -1218160, - -8814884, 5478231, -5519570, 5348308, -27521076, 4052302, -9678172, 939524, -7385733, 1574106, - 1361505, -2272575, -10299868, -9494025, 1028645, -8586176, -395137, 238371, -5135171, -1551557, - -94489, 441845, 4342212, 443455, -2501282, 2528662, -2178622, 3943317, -1770600, 4892505, - -890132, -4695473, -1999307, 1161789, -2117956, 2931315, -1967632, 2128156, 4406100, -454730, - 1282585, -1550483, -996969, 6359773, -2077690, 3730179, -1745367, -63888, 4754529, -1459752, - 1672890, -818728, 2661806, -190589, -1773822, 352724, -1459215, -3272228, 984084, -3405909, - -1045825, 1884417, -681289, -650151, 1840930, -3100430, -1594507, 258772, -1078037, 1985886, - 950262, 39728, 32212, 142271, 410169, 1215476, -785442, -191663, -453656, -465467, - 392453, -290984, 678068, 968515, -277025, -547071, - }, - { - 76773, 55642376, -13594108, 4536023, 1316944, 5835250, 4002910, -6565932, 1436667, -313533, - -4865124, -486942, 3191161, -3270081, 55682640, -8630200, 1824287, 6020471, 33527588, 13408888, - 19640348, 5971079, -6525129, -4741644, -4862440, 5481452, 25710748, 20477868, 15168214, -795643, - 8397735, -851477, -595927, -2079301, 2904472, -189515, -1992865, -1641751, 4804458, -573915, - -3316252, -3313567, 900869, 6279242, 1070521, 7157563, 925565, -3063386, -1631014, -1442035, - -153008, 5399311, -5717675, 1160178, 930934, 5335423, 2630668, -2826089, 6167036, 159451, - -171799, -2571612, 5278515, 1013075, -1739999, -3777424, 4782446, -236223, 772020, -1877438, - 1635309, -608812, -1599875, 4260608, -907312, -2929168, -827855, 1385664, 103616, -291521, - -180926, 473520, -1347009, 643708, 355409, -984621, -1595580, 272730, 34897, -216896, - -685584, 93952, 780610, 1432909, -1033477, 943819, - }, - { - -54889684, 95779920, 5037997, 19902342, -22550188, -28474560, -20681342, 8353175, -4365835, -17105780, - -424665, -11843909, 3615826, 7879118, 2166274, 17614734, 4935991, 20106890, -8405788, -16631187, - 7257958, -15715822, 5154498, 20243792, 9193377, 1620276, 5078262, 1768453, 2303713, -784368, - -5091684, 552977, -6549289, 9421548, -5219996, -983548, 6651294, -6305012, 4194573, -2544768, - -4011500, 231391, 12998182, -1751273, 10082436, 2329483, 6206765, 769873, -6027987, 1611687, - 694711, 302258, -4196720, 6594923, -8181376, 1934883, -934692, 5164698, 1848983, -4085588, - 2937758, -772020, -606127, 2802466, 4363150, 1534914, -1191853, -372588, -2283849, -1043140, - 2937221, 354335, 1589675, -1366873, -650151, -1799054, 1284195, -683974, -641561, -2900714, - 1271310, -2944200, 32749, -1862942, -1555315, 2683281, 488016, -556198, 1605244, 339839, - -241592, 963146, -1400696, 434865, 444529, -130460, - }, - { - 7519951, 729071, -9247065, -3708168, -397821, 9335648, -3388192, -3235184, 12254079, 4357781, - 8099772, 8977555, 6062883, -42720428, 32102196, 1064078, 11389180, -22605486, -13267154, 19397682, - -24498494, -15103789, -14664629, -13726179, -16726750, -14645838, -9030706, -2233920, -4114042, 1701344, - 2979634, -333934, -2012192, 4621385, -5397164, 8573828, -2022393, -712428, -1114007, 1310502, - -1511829, 528818, -1536525, -5441187, -3052111, 9169218, -5152887, -5317707, -1712618, 3409130, - -5308580, 2408940, -4866735, 2736968, -2712809, -5217312, -3416647, 858457, 3706020, -1098438, - 6356552, -2774549, -1114007, 260919, 810675, -663036, -2128156, -550293, 3864397, 1472100, - 1007170, -586263, -132607, 1632088, -1120987, 985158, 438087, -612570, -887985, 1440962, - -321586, 26307, 1069447, 974958, 1269163, -43487, 964757, 129386, -184147, -623844, - -71404, -625455, 329102, 801011, 193810, 475131, - }, - { - -14421963, 143354736, -3893925, -14194867, -8977019, -22566296, 3073049, 6190659, 8683350, 10363756, - 9863929, 8332774, 5659693, 323196, -1247688, 5164162, 14265734, -7218230, 4867809, 1540283, - 3774203, 1218160, -6694244, -21918292, -1031866, -19572702, 6011344, -863825, -4860293, 19406810, - 3078955, 1107028, -4341138, 421444, 4614406, -4124779, 1197222, -20987894, 4648765, -2284923, - -5115306, 10449655, -465467, 14761266, 1542967, 748398, 1541893, 2514167, 15063524, 613107, - -2869575, -2035278, -1738388, 909996, 3101503, 988379, 2151779, 3624953, 4639102, 1341640, - -3241627, 1110249, -7516, 1678259, -1104344, -2521683, -2321430, -3700114, 955630, 1434519, - 565325, -49929, 932008, 1428077, 412317, 648540, -588411, 1496796, 92342, -61203, - -3392487, -605054, 1724966, -1513439, 1553704, 851477, -615254, 280784, 1674500, -2010582, - 57982, 165356, 1437740, -163209, -1098975, 1275605, - }, - }, - { - { - 585189, -77846, 9246528, 12181064, 10125922, -695785, 2975339, 4236985, 439697, 12907987, - -4264366, -991601, -3684008, 2978023, -32589674, 11512660, 10708964, 3332358, -8315057, -18931678, - 5913096, -19453518, -3696356, -21154324, -4955319, -9342091, -5423470, -3682398, -5153424, -16916266, - -7402913, 1315871, -5643050, 12465606, 76773, 7750806, -1168768, -2903935, 2437931, 2933463, - -922881, -2973728, 1707786, 1515050, 5220533, -3425773, 1614908, 6288906, 2663417, 2351495, - -3596498, -3623879, 2085207, 90731, 3133179, -2204929, -3196530, 691490, 1981591, 2266669, - 3721589, 3773129, -492311, 3828427, 2869575, -523986, 1276142, -827855, -893353, 1422708, - 1582159, 1992865, -24696, 2292976, -702227, 1602560, 1203128, -1569274, 679142, 18790, - 523449, -1033477, 3758, 565862, -775242, -724239, 684510, 699543, 318901, 965831, - -591632, -96100, -725313, 239981, -63888, 464393, - }, - { - -11904039, 13554917, 70801464, -30354682, 10802916, 2882997, -8716099, 5764920, 777926, -13833553, - -9743670, -5194763, -395674, -4313221, -1654099, 10922639, 3501472, 4124779, -1636383, -5489505, - 11453067, 12559558, -7323993, 555661, -2217814, 5789616, 1117228, 7985955, 3479997, 4497905, - -8629663, -1308891, -7729331, 2131915, 3717831, -7007239, -2029372, 1792075, -5578626, -7773891, - -1081795, -9682467, 979789, 1505923, -6815576, -3201898, -521839, 2732136, 3171833, -1259499, - 1508607, -792421, -5352603, 806917, -938450, -1247151, -2007897, -1066763, -1841467, -549756, - -1102196, -68183, 293132, -56908, 1254667, 221728, 1228361, 2889439, -310311, 2940979, - 618475, -327491, 3032784, 294742, 2357400, 932008, 1534377, -378494, -931471, -488016, - -931471, 2654827, -707596, -894427, 975494, 774168, 827318, -527207, -451508, 283468, - 35433, 1128503, 724776, -365609, 208843, -20401, - }, - { - -1697586, -23950348, 14733885, 25521770, 12185359, -4151086, -2930242, -905701, 2282238, 6634651, - 10682121, 7920457, -1225139, 14300630, 11995307, 3571802, 8805757, 8078297, 6799470, 8967355, - -3620658, 3544422, -584652, -3336653, -1491964, -7956427, -9518721, -9245454, 1214939, -3912178, - -5842766, 4811437, -5383742, -1835562, 1636383, -2058363, -4721780, 6992207, -8212515, 10490458, - 3513820, -1896228, -1341640, -4409858, 5298916, 2063732, 312996, 3163244, -1198296, -1117765, - 586800, 1640141, -1264331, -3337727, -5958731, -1834488, -1391569, 610959, -507343, 946503, - -356482, 2665027, -817654, 609885, 226560, 1261110, -502511, -137439, 3732864, -275952, - -1797444, -439697, -669478, -1081258, -2889976, 391916, -279710, -343597, -1619740, -761283, - -614180, -843961, -641024, -664646, 529892, -690953, 952409, 1069447, -729608, -76236, - -140123, 211527, -1023813, 174483, 653372, 934155, - }, - { - -1212791, 27013734, 7228430, -6409702, 588411, 830539, -1478543, 748398, -651224, -4774930, - 1089311, -4629438, 3291556, 11906723, 13827110, -6725382, 32503238, 5063230, 3920768, 1741609, - 4056060, 14931991, -7688529, 1292248, -7885560, 7250442, 17265232, -12200928, -15709380, -1484985, - 2212445, -8511015, -11017665, 8260296, 3954054, -470836, 4439923, -4502200, -12005507, -3397856, - -239981, 4632659, 3950833, 6710887, 4053912, -6020471, -10230612, -2813741, -83752, -809064, - -1924145, -305480, 197032, -2337536, -2208150, 2978023, 1967632, 2676838, 3255585, 2690797, - 4781373, -346282, -2911451, -1275068, 916976, 1385664, 2281165, -57445, 620623, -24696, - 2095407, 112743, -34360, -847719, 2318746, 606127, -835908, -699006, -1427540, -114354, - -1106491, -740345, 604517, 571768, 1074, -960462, 571231, -1257889, -905164, -807454, - 281320, 43487, -136902, -330712, -379031, -956704, - }, - { - -48462264, -172067120, 15042049, 28164784, 1133871, 2815888, -1941862, 9408126, -591095, -8276402, - -4985920, -16342887, 13955422, -572304, -14271639, 6300180, 6669548, 1434519, 17458506, -825171, - 2241973, -14243185, -12465606, 6225018, -958851, 8337069, 5010616, -3542274, -21269214, 3190087, - 566399, 2129230, -351114, -5056787, -2319819, 3907347, 16886200, 4118874, 11086384, -4143033, - 5743982, -2643552, -7190312, -9025874, 3735011, 3475702, -7519414, -1762010, 5316096, -5829881, - -4746476, 134755, -2116345, 5965710, -998043, -1679332, -527744, -3514894, 902480, 2143189, - -3835406, 1660005, -3810710, -1054415, -325881, 2761664, 750546, 1261647, 662499, 1327682, - -2393908, 34360, -1926830, 242129, -1460289, -1267015, -872415, -330176, -639950, -446140, - -887448, 570694, -538482, 1604707, -675384, -1600412, 1832877, 260382, 419296, -227096, - -241055, -34897, 999654, 702764, 42950, 151398, - }, - { - 93416, -6894497, -4215511, -435402, 3405372, 104690, -560493, -3628174, 234076, -7481833, - -590021, 988379, 2652679, 8476118, -31932008, -27576374, -25235080, -1237488, 8466991, 1065152, - 4254165, -3502009, -288300, -16361141, -4811437, 23816668, -20774756, -16764868, -6681896, -21791590, - -5626407, -2310156, 991601, -3875134, -13894219, 7238631, 2310693, 952946, -2056753, 2027225, - 1627256, -1326071, -4203163, -6073621, -3172370, 878321, -1116692, 3502546, -3400540, 1563905, - 3505230, 106837, -3520263, -508954, 3460133, -1432372, -3004330, -57445, -159988, 4115116, - -370441, -33286, -1188095, -444529, 722628, -957778, 27917, 2487323, 2401424, 1905355, - 1429687, 1202591, -925565, -628139, 1109175, -1915555, -600759, 82141, 665720, 1149441, - 406411, -1894081, 1052267, -159988, -274341, 1356673, 318364, 619549, -1064078, 450435, - 482647, -330176, -130460, 91268, 228707, 4295, - }, - { - -61954368, -58377732, 28474560, 60321740, -7135015, -4290136, -4249870, -5937256, -5246840, -9185324, - 3478387, -3447785, -2421825, -2200634, 6788196, -3547643, 7552700, 10303090, 1258425, 5972689, - 1136019, -7878044, -1699733, -6085969, -456340, 93416, 3948149, -1003949, 6023692, 5639292, - 1692217, -5031554, -7358890, 8036958, -3612604, -8299488, -5925981, -13254269, 1542967, 2454037, - -2240899, 7425999, 2599529, 10350334, 9232032, -821413, 4215511, -1800665, 2500745, 133681, - -1166621, 4148402, 33823, -1338956, 3847754, -1900523, 900869, -1499481, -1047435, -2123325, - 579284, 4082367, 2194728, -317828, 505732, -32212, -3557307, -3112778, 854699, 2079838, - 1466731, 635655, -1046898, -1159641, 306553, 566936, 569083, 1631551, 199716, 615791, - -335007, 872952, -1025423, -945967, 468688, -1632625, 21475, 791348, -16643, 1304060, - -408559, 374199, 387084, -339839, -201863, -1115081, - }, - { - 397821, -15282567, -664646, -1733556, 2014340, 978716, -188442, -552977, -4006131, -40802, - 1362578, 1630477, -9669582, 1742146, -14835354, -3259880, 23965918, 2538326, -13358959, 14281303, - 18102750, 20085414, 10563472, 3688840, 8989367, 9977746, 13620415, -2521683, -12455405, 13524315, - 2216203, -1757715, 10618770, 16623134, 15213848, -4566624, 6425271, -1169305, 9747965, 4290136, - -6903086, 5906, -6129992, 1426466, 5744519, 2098092, 111132, -2432025, 8512625, -2203855, - -1079111, -3669513, -387621, 267899, -3128884, -165356, -460098, -1522029, -364535, 605590, - -1283658, -3948686, 408022, -446140, -1004486, -2096481, 3652870, -2092186, -1888712, 2255932, - 673773, -197032, -974421, 561030, -1243930, 152471, 813359, 753767, -30065, 1760400, - 797253, 61740, 712428, 348966, 628139, -1409823, -96100, 1067836, 427886, -17717, - -1023813, -890669, -701153, 87510, 295279, 158914, - }, - { - -38660612, -325942368, -1202054, 75983344, -9721658, -6199249, -6213207, -2864743, 14892262, -7669738, - 5937793, 23763518, 10829223, 14239427, 16929688, 2807298, -14195404, -3511136, -1484448, -2985539, - -9201967, -4568235, 2638184, 1905355, -2382096, -60666, -854162, -8049843, -1925219, -1709934, - -5094368, -11858942, 5985574, -7655779, -2439005, 2760053, 914291, -6573985, 2234994, 1569811, - -1660542, -9328132, 1335198, -2707440, 905701, 3938485, -2703145, -1273995, 1282585, 8782671, - 6770479, 1270237, 1202054, 177167, -1979443, 2365453, 1422708, 697395, 3857954, 3141232, - -1841467, -1681480, -2106145, 836445, 806917, -593242, 23622, 508954, 695785, 3218004, - 2440615, 673773, -1084479, 789200, 353798, -846109, -312459, -1065689, -329639, 571231, - -370441, -846645, 157840, 676994, -650151, 521302, -121333, -899259, -1023813, 128849, - -12885, 46708, -295279, 845035, -1116155, 490163, - }, - { - 3061238, 58544700, -5272073, -211527, 2759517, -6304475, 2362232, -209380, 1577864, 3779034, - -1369558, -8304856, -13124346, 15186467, -8135205, -7702487, 7969849, -7063611, -26742614, 5450314, - 16091095, -6651831, -7147363, -13436268, -9067750, -1146756, -1237488, 4129611, -1749662, 13521094, - -815507, 825707, -12922483, 3942243, -4009352, -1783485, -657667, 2018635, -1332514, -7642895, - -2151779, 3792993, -916976, -2229088, 376347, 2716567, 287763, 634045, 4710506, -2647311, - -4434554, -3241627, 641024, -1648731, 1399623, 476741, -1641751, -2120103, -4505958, -1981591, - 912144, 3511136, -4772246, -12348, -842887, 1408212, 995896, 275952, -3228205, 1381906, - 2075006, 3370476, 1002338, 2744484, -292595, 177167, 1238561, -1450625, 1415729, 1339493, - 1445257, 82678, -358093, -1537598, -571231, 1009854, 1061931, 281320, 239981, 69256, - -485868, 192737, -807454, -588947, -594316, 238908, - }, - { - -24922622, -210356224, -2458332, -12569759, -3488587, -34763464, -32127430, 4790499, 12367358, -2412698, - -2755222, 6994891, -10813654, -5837398, -13996225, 1025960, -7196755, -11115375, -3044058, -12127377, - 9221832, -298500, -6267431, -8992051, -1577864, -7465190, 6466610, -5745593, -7097971, 759672, - -3234110, 208843, 4004520, -2100239, 1691680, 620623, 4474282, -6034429, 4911295, 3846680, - -5179731, -1134408, 1176821, 3565360, -1756642, -1217086, 1284195, 2390686, -1165010, 4489315, - 2600603, -2909304, -519691, 2266132, -1504849, 5164698, -965831, 2124935, 1215476, 1818382, - 1392643, -176631, 299037, -2474438, 1469416, -1240172, 548145, -2905546, -1046898, -1177358, - -655519, 448824, -430034, -784368, 293132, -1268089, -3404299, 927713, -752693, 1954210, - 490700, 60666, 960999, -184147, -133144, 1002875, -1371168, 569083, -629750, -201863, - -130997, 62814, 330176, 822486, -74088, -987306, - }, - { - -1068910, 40505300, 6753299, -2727304, -3794067, 4140349, 10030896, -2348810, 233539, -1145683, - -8596914, -753230, -7085086, 17685064, 28854128, 24867324, -9666898, -388158, 36179732, 19054086, - -2756832, 34413424, -8141648, -9774809, -8301098, 16848620, 24857660, 8201777, 26670136, -3807489, - 1389422, 3368328, -4861903, 4831838, 1088774, -343061, 1038845, -392453, -6566468, 1382443, - -3690451, -4250407, 3757560, 2623688, -1419487, 8231842, 2552284, -1381369, -5118528, -4930086, - 5836861, 1329292, -1333051, 16643, 731755, 5101348, -1540820, 4563403, 1460289, 352187, - 3350075, -2339147, 1304596, 1402844, 1806034, -1564442, 2803540, 507343, -1321239, 1383516, - -1321239, -1581085, 821413, 593779, 151398, -692027, 93952, -897648, -1060320, -75699, - 1461900, -1047972, -1913945, 1119376, 497142, -958851, -1206349, 831076, -481573, 496069, - 241055, -66572, 574989, -134755, 971200, -193274, - }, - { - 57936960, -22634478, 2653216, -2272038, -6982543, -30773978, -16587701, -168577, -5748277, -2383707, - -8125542, -10630581, -1753420, 13897977, 15892453, -1985349, 15829102, 3779571, -3309809, -9993852, - -7617662, -4437775, 9620727, 19585050, 3885872, -753230, 5380521, -4306242, 9704479, -2940979, - 2651606, -6317897, 2043868, -2465848, -126165, 1456531, 1014149, -755914, 3612604, -1496259, - -5050345, 3467112, 9795210, 883153, 6488622, 7147363, -1469953, -2010045, -665720, 5282810, - -1141924, 246424, 3986804, -353261, -2787434, -2506650, -1757715, -403190, 5057324, -1218697, - 2042794, -1541893, -1019518, 3322694, 2100239, -876710, 1555852, 408022, -2188823, -3218541, - 2300492, 3202435, -1321776, -165893, -176094, -1315871, 558346, 477815, -2159832, -1624035, - -1198833, -79994, -1508607, -1791538, -1060857, 601832, 1331440, 1217086, 176631, -275952, - 164283, 1250372, -963683, -372588, 456877, -363462, - }, - { - -7331509, -4227859, 6176700, -2895882, 1955284, -1150514, 5276904, -1023813, 8202851, 12011950, - 5902359, 10188736, 2275796, -12724914, 5181878, -10402948, 6848326, -15362561, -4313758, -17272210, - -7012071, -28302760, -3665755, -15861314, -4660577, -21145734, -12023761, -6552510, 5591511, 2297271, - 3570729, 3624953, 1347546, 1104880, 2425046, -1061394, 5458904, -5804649, 1484985, 5109401, - -4367982, 3124589, -9458592, -3100967, 1299765, 8957691, -4099546, -9124658, 549219, 1347009, - -804770, -1629403, -1491427, -3307662, -315680, -5516886, -261993, 2560338, -471910, 2575370, - 3077344, -2310156, -3977677, 562641, 1544578, -2507724, 2412698, 324807, -16643, 1539209, - -822486, -600759, 776852, 3447248, -563714, -2621541, 2092186, 1243930, -493384, 775242, - -982474, 538482, 425739, 1365263, 732829, 874026, 780073, 514322, 897111, -1098438, - -1512365, -440234, 78920, 600222, 293132, 316217, - }, - { - 31731756, 100152728, -1818382, -11399917, -13154411, -15752866, -8021389, 6714645, 9640591, 5770826, - -563178, 15707769, 3295314, 2015950, -9869298, 12358768, -5305895, -6606734, 5921686, 11200201, - 9266929, -3928821, -9294309, -13313325, -4874788, -17631378, 5103495, 1081795, 4177393, 6023692, - 5679021, 1787780, -257161, -6119255, 5726265, -6105296, 239981, -8730595, -5385352, 59056, - 118648, 6197638, 10887742, 6752226, 498753, 1227824, 3469797, 6122476, 7303055, 4000225, - -5092221, -625992, -1793686, 3388729, 1110249, 162672, 2120103, 3866008, 3202972, 3082713, - -557272, -717796, -1343251, 1234266, -277562, -1465121, -1189706, -2602213, -1690607, 1407139, - 1028645, -858457, 1590749, 1371168, -82141, 1901060, 549219, -258235, -170725, -923955, - -979789, -353798, 617402, -168577, 539018, 1277753, -1148367, 430570, 482647, -289373, - -1906966, 518617, 1598265, 336081, -888521, 1533303, - }, - }, - { - { - 201327, -13214004, 2683281, -4859756, -4590783, 293668, -770947, 471373, -450972, 13018583, - 384400, 3451006, 9732396, 7620346, -21898964, 557272, -14116484, 941672, -1198833, 3633542, - 21256866, -10541460, 8477192, -18957448, -5113696, -4327180, 9694815, 7667591, 8524973, 816581, - 735513, 4374424, -9838159, 5250598, -1844152, 5938866, -5651640, -7462506, 3361886, 4306242, - 3446711, -2377801, -3053185, 1671279, 7863548, -3812320, -1461363, 5420786, 2032056, 2517925, - 2579665, -745177, 1523103, 601832, 1888712, -1814087, 326418, 288837, -481573, 530428, - 289910, 1967632, -1806571, -221728, 781147, 190589, 1576253, 638876, 1188632, 214212, - -572841, 956167, -1057099, 2218351, 224412, 1372242, 563714, -679679, 512175, -595390, - 409096, -516470, 520765, 529892, 139586, 143345, 544924, 610959, -239444, 323196, - -760209, 258235, -504122, 433255, -112206, 614717, - }, - { - 9801652, -82937432, -20039244, -30176440, 4469451, -2437931, -3164854, -1218160, -6061810, 2508798, - -1424319, -4756140, 4029753, 103616, -4393215, 9736154, -5010080, -1047972, -1151588, -7581154, - 6270116, 8024073, -3850975, -4675072, -9389335, 892816, -1776506, 7198902, -173409, 1651952, - -1677185, 3468723, -5153961, 1261110, 1159641, -5639829, -5448166, -972273, -3084860, -3082176, - 4063039, -4293357, 4085051, 2796561, 52613, -13959, -1628330, -3220689, 262530, -2868501, - -372052, 625455, -2403571, 2525441, -139050, 853088, 1347009, 131533, -2054605, 240518, - 193810, -835908, -818191, 926639, 2182917, -479963, 1047972, 3083787, -152471, 1768990, - -228170, -907849, 1336272, -601832, 760746, -850940, 118648, -745714, 42413, 1239098, - -682900, 554588, -1089848, -630286, 702764, -8590, 798327, -881542, -1048509, 147640, - 66035, 695785, 516470, -988379, -235149, -17180, - }, - { - 2039573, -38922604, -9605157, -7341173, -3240016, 1180579, 1062468, 412854, 216896, -7334731, - 2353105, 12856985, -11137924, 132070, 10654203, 1190243, 2203855, -597537, -7923141, 5674189, - -2743410, 5644661, 6728603, 6010807, 5303211, 349503, -722628, -5007395, 675921, -2282238, - -616328, 811749, -8626979, -2689723, 3361886, 1151588, -4064650, 5812165, -8701604, 3373160, - -308164, 1352915, 2109366, -1335198, 3708704, 646393, 449898, 2189360, -1198296, -102542, - 277025, 897111, -293668, -1352915, -1648194, 1973538, -67109, 3795677, 884763, 373125, - -2268817, 2900177, -2036351, 106300, -592169, 867047, -441308, -1416266, 1230508, -505732, - -779000, -528281, -364535, 887448, -1062468, 234076, -214748, 1673964, 53687, 863288, - 512712, 175557, 311385, -937377, 510564, -401579, -405874, 162672, -601832, -161061, - 312459, 816581, -882616, -406948, -184147, 475131, - }, - { - 1221918, 17468168, -3716221, -4954782, 1305670, 303332, -1639067, 1610613, 376347, -2793876, - 1497870, -6382322, -754304, 7064685, 32483912, 746787, 8441758, -13241384, -4514011, 2699387, - -1909113, 14496051, -467615, -1356136, -2834142, 4092567, 10679436, -283468, -7278896, 4656282, - 2190970, -10994043, -6706055, 4113505, -1033477, 5513665, 8848706, -2232846, -5417028, 3657165, - 5424544, 5190468, -2593087, -68719, 4232154, 343597, -2092186, 194347, -2461553, 2097555, - -1723893, -768262, 1664837, -166430, -1226750, 1418950, -1913408, 1799591, 1736777, -3274913, - 2187749, 554051, -2131378, -1704028, 1861868, 256624, 909996, 410169, 561030, -1294933, - -708133, -1144072, -433255, -1097901, 1068373, -185757, -497679, -270583, -1009854, 149787, - -428960, 309775, -176094, -240518, 714575, -585726, 614180, -421444, -132070, -277025, - 208306, -398358, 574452, 154082, -325344, -634045, - }, - { - 41880764, -70008504, 8005282, 36514740, -1853278, 3137474, -4110284, 813359, -6084358, -5641977, - 10264972, -9822053, 12087112, 437550, -8940511, 8642011, 308701, -7961259, 15100568, 3341485, - -1951526, -7250442, 348429, -1476395, -5767068, 4781373, -2597382, 10107669, -7342247, 993748, - -926102, -1700270, 220117, -414464, -2033667, -1930588, 3863860, -4889821, 9343701, -4786741, - 6626598, 336618, 856309, -3218004, 538482, 2343442, -4966593, -1267552, 3230352, -5965710, - -1590212, 1224066, -5105643, 1475858, -3354370, 1319092, 656593, -4714801, 573378, 3423089, - -1801202, 2519535, -2828236, -979789, -784905, 2182917, -1291711, -415001, -277025, 1020592, - -1891396, 972810, -1523640, 459025, 66035, -179852, 907312, 1037235, -280247, 57982, - -623307, 253940, -601295, 916976, -393526, -883153, 715649, -651224, 590021, 279173, - -37581, -132070, 72478, 281857, 108448, 345745, - }, - { - 935766, -10346039, -7285339, -1535451, 1643362, 748398, -501437, -1923609, 2824478, -2742874, - 5849746, 2596308, -1854352, 741956, -4477504, 3860639, -16386374, 2196339, 5068062, -5965173, - 10546829, -1010391, -2552284, -11304891, -4583804, 29266980, -3732327, -4582193, 7143605, -8635569, - -49392, 151934, 3490735, 2638184, -7242926, 2425583, -3109020, 1913945, -614717, 1230508, - 5117991, -1702418, -6003291, -3176128, -2473901, 2204392, -1762547, 703301, -2894271, 4388383, - 4518306, -171262, -2204392, 2160906, 2479807, -3758, -1392643, -609885, -1326071, 1125818, - -1738388, -1453846, -1555315, 481036, 3258270, -430570, -1647120, 983548, -974421, -299574, - 660351, 666794, 113817, 1102733, 2244657, -1105417, -679142, 73551, 623844, -650151, - -86973, -1787780, 300111, 2684, -359704, 419296, -234076, 53150, -1337882, 231391, - 61740, -493384, 151934, -76773, -30602, 122943, - }, - { - 37877316, 28761786, -5166846, 56526600, -6617471, 565325, 6816650, 2672544, -8530879, -12159589, - 5873368, 1129576, 9901510, 4789426, 10058813, -1211718, 4981089, 4595615, 42413, 3816615, - -10268730, -10144176, 1644436, -8026757, -1015223, 1108638, 5690295, -1634772, 1250909, 295816, - -942208, -629750, -4995584, 4903779, -980326, -3036005, -2753611, -5051956, 4977330, -1525787, - -6570763, 3885335, -1940252, 1186485, -1775432, -3586298, 4673462, -2889976, 1202054, 1083406, - -3034395, 2290291, 6396280, -370441, 434865, -948651, 3286724, 1118302, -848256, -1450088, - -510564, -205085, 287226, -724239, -779000, -234076, -484794, -96100, 776852, 132070, - 299574, -73014, 122407, 9664, -652298, -648003, -964757, -30602, -600759, -198105, - -810138, 752693, -593242, 304406, 718333, -851477, 295816, -107911, -765578, 338766, - -919123, 692027, 519691, -500364, -133144, -1035624, - }, - { - 1133335, -7596187, 7786776, -3126199, -1706713, 302795, -750009, 1531693, -1610076, -309238, - -28454, -2587718, -7092065, -445066, -3875671, -7863548, -8979703, -5310727, -2851858, 16228534, - 642635, 2206003, -1634772, -2029372, 12693239, 10543608, 2332704, -550830, -6484864, 10227928, - 3381750, -7301445, 7075959, 180389, 2520072, -7141457, 5628555, -5236639, 5027259, -510564, - -9907953, 2489471, -4594005, 128312, -2828236, -843424, 971200, -4602595, 7114614, -3257733, - -348429, -3444027, 1647657, 1178432, -2115272, 94489, -510027, -2959233, -734976, 1933809, - 1080184, -629213, 1279363, -965831, -488553, -2565169, 1532230, -1133335, -483184, 1600949, - 191126, 99321, -888521, 814970, -502511, 574452, 648540, 646393, -643708, 950798, - 535797, -619549, -619012, -887985, 1155346, -630823, 173946, 957241, 346819, 948114, - -8053, 241055, -111132, -93416, 140660, 307090, - }, - { - 48860084, -197135776, 4823785, 62398360, -16840030, 1022202, -804770, -2381559, 10311143, -3648575, - -1268089, 5468030, -10146323, 1017370, 7711614, 6932614, -9579388, 6448894, 5833640, 1268626, - -2707440, -2987687, 1532767, 2410014, -4435628, 2334315, 4223564, -7477001, -2654290, 582505, - 1760937, -6029061, 6920266, -5821292, -1410897, -246961, -203474, -966905, 9744207, 415001, - 2904472, -1348083, 4727686, -607738, 421444, 3450469, 489626, 855235, -1141388, 1248225, - 2589865, 2079838, 748935, -756451, -3472481, 876710, -1125818, -1219234, 1878511, 1018981, - -2092723, -673773, 40265, 962073, -888521, -881005, -272730, 573915, 310848, 1762010, - -219043, -150324, 201863, -173409, -288837, -232465, 25770, -1119376, -487479, 1385664, - 830002, -1060320, -648540, 567473, 0, 434865, 122407, 711891, -494458, -136902, - 300111, 539018, -1041530, 586263, -270046, -192200, - }, - { - -2210298, 46339476, 2477123, 7050189, -112743, -10340671, -6528351, -3257196, -785442, 1573569, - 2360085, -5609764, -987306, 17995912, -6307160, -4704063, 2235531, 2385318, -5574331, 8447127, - 7596724, -1704028, 9672803, 3012383, 5200669, 1796370, 1437740, 17144436, 466541, 5800354, - -4374961, 4138738, -9764071, 2038499, -3935264, 948114, -397284, -1061394, 480499, -4576825, - -2903398, 4141422, 672162, -3787088, 1181653, 2418604, 2140504, -1260573, -734439, -5131412, - -1526324, -486942, 1251983, -648003, 2859375, 1771137, -1159641, -2041720, -821949, 1100049, - -1766842, 2845416, -1698123, 605590, -1603633, 486405, 338766, 1191853, -1217086, 1047972, - -841814, 813896, -733903, 1656784, -1521492, 71404, 2274722, -1516124, -418222, 92879, - 157840, -205622, -130997, -337155, 1175210, 281857, -285615, -638340, 4832, 76236, - -685584, 332323, 17717, 565325, -375810, -81604, - }, - { - 24257976, -155260928, -6591701, -268435, 12761958, 3675955, -3133716, -7854959, 6742025, -1634235, - 444529, 7113003, -5551245, 3341485, -7219303, 5138392, -742493, -9232032, -1733019, -3244848, - 5156108, -2733747, 2456721, -5218922, 2171643, 1864016, 4894115, -5756330, 709743, 4947266, - 544924, 3041374, 2494839, -2144263, 2602750, -2816962, 4919348, -2126546, 4000225, 151398, - -1043677, 906775, -1212255, 1235340, -542240, 674847, 443455, 634581, -1521492, 4074850, - -1091995, -4615479, -1792612, -688269, -18790, 4236985, -1825898, 1010928, -63888, 911070, - -19327, -287763, -787053, -3576097, 1006096, 532039, 3414499, -1906429, -805306, 1078574, - -306553, 605590, 1368484, -448824, -775778, -212601, -1547799, 1486596, -1108638, 1154809, - 634045, -437550, 121870, 676457, -354335, 404801, -1348620, 814433, 141734, 345745, - -66572, 527207, -58519, 141197, -110595, -831613, - }, - { - 1831267, 25471840, -4570919, -1883880, -1483911, 5216775, 7803419, -1298691, 1334124, 378494, - -4946192, -1655710, -2441152, 21579526, -4398584, 1883343, -11041824, -397284, 22949084, 3854196, - -6969122, 30350386, 3338800, 3988951, -11170136, 5779416, 3554086, -8122320, 18894098, -1965484, - 159988, 559420, -7226820, 2741800, -2524367, -270583, 2954938, 73014, -6684043, 4257387, - -552440, -743029, 4907000, -2526515, -5172215, 1367410, 928787, 2697240, -563714, -1688996, - 4313758, 549756, 689879, -1741072, -2454037, 1020055, -3154117, 3544422, -416075, -908386, - 2414309, 93952, -926639, -2604361, 2415382, 410706, 690953, 243203, -1433982, 906238, - -486942, -1349157, 415538, -37581, 1093069, 522912, 1179505, -809064, -1391569, 12885, - 1605781, -664109, -1757179, 1087164, 1527398, 734976, -310311, 294205, -448824, 1067836, - 1102196, 256087, -24159, -527207, 675384, -687195, - }, - { - -37128920, -146997408, 1265942, -7851200, 5735929, 11895986, 16006806, -926102, -10103374, 8164196, - 4688494, 354872, 4482872, 10228465, 3129958, -6976638, 6249178, -10957535, 2011655, 2276333, - -4777614, -9680319, -1433982, 6840809, -4803921, 4946729, 5864241, -10809359, 10602127, -616865, - 3100430, -6963753, 3633006, -5348308, -758062, 1549410, -296353, 1751273, 4753992, 384936, - -2585034, -921807, 3408594, -1792075, 712965, 3711926, -4523138, 47245, 2344515, 3204583, - -2137820, -1150514, 2630131, 716186, 1236951, -2226404, -1668595, -1777043, 3303367, -522912, - 2121177, -1449015, -2949032, 311385, -90194, -2294050, 1600949, 1372779, 79457, -1116692, - 942745, 2348273, -294205, -124554, 137439, -395674, 568009, 1432909, -72478, 48855, - -1669132, 717260, -663572, -427349, -16106, -723165, -106300, 503048, -560493, -889595, - -447750, 597537, -709743, -274878, 527207, -345745, - }, - { - 6634114, -9028021, -13011067, -907849, 2181844, -5943161, 1203665, -5894306, -5746666, -1419487, - -4887673, 6069863, 14956687, -21729850, -10303090, 3974455, 13445932, -4254702, 2364380, -12769475, - 7654706, -9017821, 14374182, -4555887, 8101919, -4381941, -3527779, 2241436, 5769215, -8089571, - 2233383, 5191542, 1253594, 6136972, 4819490, -5616207, 6233608, -4038880, -2043331, 1338956, - -2036351, 5703717, -5364951, 712965, -42413, 2375654, -3161633, -1636383, 3634079, 845572, - -533650, -1333587, 1381369, -3917010, 2861522, -2222646, 915902, 2491618, -2934000, 360777, - 816581, -1434519, -3047279, 170188, 579284, -2434710, 3966939, 1143535, -2426120, -195421, - -121870, -53150, 871342, 3246995, 147640, -1505923, 1869921, 1100585, 299037, 908386, - -954020, 273267, -1243393, 205622, -137976, 621160, 608812, -332323, 235686, -870805, - -923418, 28991, -749472, -256087, -131533, 67109, - }, - { - -36290328, 23754928, 10712185, -567473, 17505212, 10191957, -5559835, 18254, 54224, -7209103, - -9378598, 5791227, -12429098, -7192997, -13477071, 1273458, -12969727, -230318, 5257040, 5857262, - 2848100, -8945880, -1377611, 4332549, 4459250, -7472170, 8932995, -946503, 1823751, -2449205, - -2587718, 1042603, 1358283, -5513128, 5694053, -4487167, 2226404, 2669322, -906238, 231391, - 3312494, 3080565, 306553, 179852, -1328219, -3104188, -769336, 1937030, 3123515, 526134, - -5921150, 1327145, 938987, 2915746, -753767, -1478006, 1010928, 599685, -1028108, 3517041, - 2333778, -978179, -2120640, -474057, -8590, 1666447, 500364, -1234266, -847182, 2368138, - 657667, -1561221, 634581, 766115, -816581, 868120, 374736, -1244467, -676994, 132607, - 308701, 217433, -630286, -437013, 367757, -34897, -1544041, 920734, 66035, 170188, - -979789, 422517, 313533, 278636, 130460, 1087701, - }, - }, - { - { - -568009, -7240241, -3147674, -7619809, -1931125, 159451, -1612760, 323196, 1991254, 3008625, - 10047539, 7788387, 3412889, -443455, -12673375, -5146445, -12399571, 316217, 1367947, -1016297, - 16280074, 3069291, 4701916, 2430415, -14382772, -171799, 1798518, 2725694, 11043435, 10614475, - -358630, -3292629, 4213900, -1884417, -866510, 422517, -706522, -5675800, -1173063, 4253628, - 307090, 774705, -1950989, 949725, 3287798, 1050656, -900333, 2257542, 723702, 3066607, - 2783139, 632971, 539555, 2050310, -87510, 108985, 1213865, -332860, -1105954, 992137, - -57982, 1814087, -998043, -111132, -967978, 1229434, 1322850, 641561, 2456185, -219043, - -515396, -108448, 229244, 234613, 1140851, 943282, 460635, -35970, -60130, -130997, - 348429, 388695, 362388, 215822, 395137, 394600, -25770, 767189, -303869, -75162, - -398895, -214212, 23085, 693637, -257161, 165356, - }, - { - -9474698, -92130272, -11975979, -10887205, -6487548, -1676111, 1727651, -7427072, -5739150, 1846299, - -2233383, 1858110, 420370, -3397319, 1567126, 2900177, -5512591, 1760400, -3288871, -6132140, - 7910256, -2229088, 4543539, -5233955, -12019466, 848793, -1737851, 3483219, 1105417, -3321620, - 4214437, -1992865, 3325379, -3597572, -3610994, 677531, -2859375, -3378529, 70330, -1346472, - -227633, 663572, 2093797, 673773, 3917010, -1067299, -1559073, -1308891, -1716913, -1983201, - -1222992, -110059, 3129958, -681289, 540092, 651761, 737124, 1851668, -1183800, -620086, - 1228898, 204548, -2184528, 2193655, 1431298, 641561, 522375, 1826435, 793495, 562104, - 191126, -686121, -64961, -125091, 143881, -897648, 83752, -477278, 721018, -48855, - 273267, -348429, -703838, -5369, 119722, 245350, 183610, -490163, -777389, -153008, - 394600, 344134, 483721, -549756, -384400, -93952, - }, - { - -1249836, -18828062, -19967840, -22099754, 1862405, 1656784, 3476239, 892279, -1799591, -4223564, - 223338, 4981625, -1699733, -4465156, -1326608, 2177012, -1774358, -2165737, -1496259, -1912334, - 5862631, 1938104, 6077379, 5210332, 4355634, 2082522, 456340, -331249, -3956739, -2931315, - 1126355, -756988, -5196911, -4625143, 4105989, 1735167, -903017, -3583077, -408022, 402653, - 149787, 784905, 1862405, 802085, 2084133, 2026688, -2770254, 865436, 1803886, 1327682, - -967441, -281857, -146029, -438624, -1061931, 770947, 1296543, 2374043, 1427540, -201327, - -666257, 614180, -10201, 448287, -1352378, 31139, 341450, 343061, -964220, 386010, - 133681, -840740, -603443, 903554, -118112, -147640, -547608, 774168, 1018444, 778463, - 405338, 528818, -381178, -295816, 458488, 81604, -755914, -464930, -151934, -253940, - 462246, 419833, -353798, -207769, -258772, 18254, - }, - { - -2008434, 9203041, 3401614, -1329829, -298500, -201327, -1319092, 921807, -184147, -1227824, - 653372, -3400004, 226560, 7508677, 29160144, 6999723, -15173583, 5287105, -11531987, -7219840, - 7086696, 7419019, 3082176, -1246614, -613643, -1502165, 6051609, 3256659, -1247151, 7089381, - -7948374, -10909217, 2953864, 3212636, -227096, 4981625, 6177774, -425739, -796180, 2142652, - 4344360, 4268124, 628139, -2639258, 814433, 2222646, 1264331, 511638, -1905355, 2728378, - -2966212, 318901, -214748, 1525787, -720481, 170725, -1231045, 1178969, 104690, -2714419, - 162135, 1295470, -1566589, -709743, 1109175, 644782, 544924, 472983, 254477, -318364, - -2175938, -1476395, -741419, 69256, -26844, -230854, -79994, -77846, -824097, 31675, - 318901, -66035, -36507, 181462, 96100, 11811, 0, 191126, 5906, -254477, - -139050, 117038, 235149, 550830, -374736, 94489, - }, - { - -26312580, 37583112, -11651173, 37882684, 5630166, -89657, -3557844, -1940788, -1619740, -5634460, - 4264903, 4316442, 2281702, 243739, -187905, 3481608, -781684, -4467840, 7422777, 3338263, - -3501472, -1681480, -1391033, -4700305, -67646, 2851858, -5456756, 7678865, -200253, -1902671, - 1453846, -2481417, 937377, -951335, 295279, 665183, -6910066, 730681, 1642288, 97711, - 4274030, 709743, 856846, 504659, -3445638, -421444, -1094143, -920734, -2850248, -1231582, - -141197, -1044751, -205622, -2836826, -1603097, 724776, -40265, -1059783, -312459, 274341, - 832150, -523449, 564251, -903017, -694174, -322123, 346282, -1472100, 320512, -610959, - -1234266, 362925, -541166, 529892, -267899, 166967, 717796, 909996, -76773, 297963, - -573378, -153545, 348429, 15032, -425739, -657667, 98247, -208306, 179315, 89121, - 136902, -76236, 126702, -454193, 172336, 343061, - }, - { - -231928, -8172786, -3378529, -751619, -1544041, 886374, 478352, -640487, -185220, 3354906, - 2865817, 142271, 447750, 1098975, 286152, -7872138, 3357591, -3444027, 5154498, -7512972, - 3244848, 4154844, -4639639, -129386, -2365990, 6587406, 10845866, -2207613, 1017370, -3927211, - 3007014, 3106872, 1487669, 5645735, -2902861, -4923643, -643708, 285615, 4142496, 198105, - 1120987, -1755031, -3706020, -2178085, -603980, 1013075, 430570, -2344515, 909996, 1839320, - 3773666, -892279, 495532, 1388885, -274341, 789737, 916976, -1552094, -747324, -1159104, - -1439888, -1127429, -1684164, 1335735, 2461553, -311922, -810138, -715649, -996969, -208843, - 18254, 956167, 1131187, 395674, 1739462, 381715, -711354, 192200, 653372, -1353452, - -467615, -675921, -633508, 189515, 77309, -172336, -12348, -455267, -520228, -209917, - -10201, -405874, -373125, 433792, -63351, 31139, - }, - { - -9091909, 79809080, 4988605, 47700980, -3866008, 2354716, 2592013, 4159676, -4788889, 239444, - 24159, 483721, 10179609, 3285113, 4755603, -1267552, 5439576, 5676336, 1933809, 1511292, - -9394167, -8664023, 258235, -6163278, 1170379, -314606, 2952253, 2739116, -463320, -3612068, - -817118, 995359, -1753420, -758062, 3047816, -1717987, -4371203, -96100, -407485, -972273, - -1026497, 622233, 59056, -3953518, -1201517, -3255048, -107374, 1840930, -2010045, 1373316, - -3729642, 4811974, 2567854, 1398549, 341450, 484794, 1694902, 590558, 922881, -998043, - 11274, -448824, -1604707, 699543, -1070521, -624918, 415001, 1357747, -409633, -722628, - 906775, -385473, 359167, 646929, -820339, -768262, -883690, -513785, -111132, -443992, - -284542, 41876, -161061, 882616, -402116, 244276, 224949, -775242, -392990, 14496, - -248571, 9127, 163209, -107911, -481036, -182536, - }, - { - -345208, 4253092, 861141, 39728, -1327145, -428423, 135828, -260919, 474594, -1246614, - -432718, -2401961, -310848, -2480344, 3601867, -10738492, -15253576, -9737228, -958851, 15870978, - 8000987, -9571871, -3760781, -238908, 7511361, 7321846, 3244311, -3629247, 609349, 2506114, - 5132486, -4180614, -4629438, 2845953, -890669, -2789045, -597000, -3298535, 2122788, -563178, - -3623879, -1693828, -1729261, 433792, -6823093, -341450, 1139240, 571231, 613643, -3295314, - 972273, -1178969, 2237141, 135828, -738734, -774705, 198105, -1651952, -1256815, 1345935, - 1344325, -321049, 734439, -976031, 451508, -1699733, -731755, 606664, 180389, -498753, - 989453, -62814, -40265, -562104, 725313, 172872, 753230, -370441, -169651, 631897, - -270583, 300111, -589484, -620086, 359167, -253940, 251792, 574452, 37044, 784368, - 305480, 274341, 12348, -499827, 690953, -234076, - }, - { - -45213656, -56690348, 907849, 43763032, -668404, -573378, 889058, -633508, 1871532, 5373004, - -4873178, -6526740, -6167036, -1670742, 6282464, 2414845, 511101, 3416647, 2153389, 4843650, - -519154, -3308199, -940598, 1178432, -2737505, 3984656, 2471217, -3973382, -5036386, 766652, - 229781, 1052267, -2674691, 665183, -3060701, -1498944, 753767, 2723009, 8003135, 597000, - 798864, 2300492, 2390149, 1394254, -1080721, 2412698, 3383361, -1858647, 1396401, -1902671, - -460635, 3306588, -996432, 618475, -2270427, -1813013, -266825, -551366, 1411971, -888521, - -973347, -149787, 1194001, 537, -1086627, -234076, -770410, 351114, 623307, 441845, - -404264, -739271, 1476932, -535797, 146029, -146566, -635655, -112743, 4832, 827318, - 286689, -446677, -769336, 342524, 598611, 17717, -105227, 411780, -5369, 27917, - -256624, 392453, -263604, 92879, 198105, -76236, - }, - { - 646393, 28188944, 9237938, 8492761, -1372779, -4114579, -6965363, -5987185, 1910724, -4014721, - 2231773, -2530273, 579821, 8087424, -292595, 2650532, 2171106, -2728378, 12381854, -1800128, - 5790690, 2726767, 1888712, 8689256, 7388955, 5326833, -3565360, 10331544, 7107097, 3898757, - -4088272, -457414, 1147830, -1598265, -4850629, 2242510, -3101503, 4757750, -2624762, -3393561, - 2413235, 296353, -2345589, -2989297, 2563022, 890132, 2585570, -699006, -3358665, -2445984, - 1192390, -768262, 1482301, -696322, 1430761, 457951, 467078, -1897302, -707059, 721555, - 502511, -128849, 1074, -376347, -81068, -107911, 683974, 504122, 583579, 6979, - 114890, -1258962, 228170, 507343, -960462, 599685, 438087, 31675, -754304, -485868, - -179852, -535797, 341987, -35433, 1259499, -98247, -602906, -215285, -379031, -583042, - 170188, 9664, 277025, 578747, -91805, -265751, - }, - { - -22428856, -95513096, -3176665, 5723044, 9048959, 6965900, 6530498, -5664525, -2867965, -2049773, - 2574833, 5532992, -143345, 2800856, -4101694, 4907000, -326418, -1825361, -4698694, 1975148, - -4410395, -852014, 2254321, -815507, -2703145, 8832063, -3939559, 3267933, 3329137, 1808718, - 4678830, 1716913, 1538135, -1379758, 35433, 345745, 3062849, 1720134, -1285269, 98247, - 1789928, -412317, 646393, -439160, -101469, -977105, 1280437, -336081, 1115618, 1723356, - -2614561, -2245194, -3139084, -588411, 2193655, 680752, 427886, -471373, -337692, 1600949, - -1661616, 457951, -1726577, -977105, -1506997, 1203128, 1469416, 137439, -1642825, 1921998, - 766115, -64961, 1315334, 233002, -597000, -887448, 476741, 704375, -891743, -41876, - 723702, 86436, -118648, 384400, 57982, 194347, -689342, 271120, 423054, 264677, - 41339, 315680, 184147, -41876, -280247, -8053, - }, - { - -2626373, 13203266, 5518496, -2244657, 5119064, 6229313, 577136, 3981972, 818191, -688269, - -618475, -5167383, 2027761, -242666, 7059853, 424128, -11673184, 5673115, 7947300, 4874788, - 8557185, -4080219, 14615237, 5265630, 110059, 3623879, -8265128, -450435, 8250096, -2647847, - -759672, 3288334, -2997887, -3967476, -1869385, -873489, 3638911, 1008780, -1817308, 477278, - 1983738, 1306744, 849867, -1566053, -3420405, 774705, 2518998, 181462, 847182, 3257733, - -490163, -251256, 1852742, -3221762, -830002, -1076426, -439697, 23085, -520765, -655519, - 1296543, 314069, -243203, -1844152, 11274, 1450625, -261456, -609885, 274878, 425202, - -281857, -1255741, 905164, -110059, 1075889, 147640, 1169305, -494458, -503048, 725313, - 5369, -758599, 137439, 234076, 1421097, 192200, 83752, -118648, -290984, 944893, - 951872, 524523, 98247, -89657, -47245, -214212, - }, - { - 733366, -191791760, -24925842, 4694400, 6714108, 27434104, 13261785, -6123013, -9939628, 10362682, - 6002217, -934692, 5504538, 1890859, 1420560, -1684701, -5087926, -2799782, -1873680, 5748814, - -3526168, -8069707, -4292820, 3733400, 2764348, 3604551, 281320, -5597953, 1018981, 5368172, - 548145, -3950833, 102542, -932545, -1897302, -724776, -1071058, 4398047, 2817499, 2783676, - -713501, -3258807, -409096, 2412698, -4352413, 1255204, -53687, -1198296, 1949378, 1400159, - 760746, -2452963, 519154, 1815161, 140123, 4295, -1354525, -1063004, 402116, 311922, - 1535451, -699006, -1487669, -2845953, -197032, -504659, 978716, 582505, 309775, 2059974, - 44023, 55298, 1872606, 226560, -267362, 260382, 523449, 535797, 186294, 290984, - -943819, 23085, 81604, -82678, 88584, -906238, 106837, -293668, -251792, -1001801, - -134218, -185757, 9664, -41876, 273267, -231391, - }, - { - -6184216, -9221295, -1402307, 1878511, -190589, -4187056, -2618856, -285078, -10474888, -3760781, - -6349036, 4805532, 11426224, -1326071, -16074989, -525597, 8140574, 3642132, -519691, -8193187, - 4012573, 4036733, 8257075, -2742874, 4997195, 1741072, 1457068, 5000416, 178778, -3033321, - -3673271, 8181376, 56908, 1306207, 4275640, -719407, -520765, 2804614, -1881733, -2565706, - 1144609, -1482838, 255551, 1179505, 1165010, -1989644, 376883, -97174, 1548873, 567473, - 1313186, -1730335, -33823, -2462090, 2528125, 650688, -165356, 1527935, -2388002, -25233, - 131533, -441308, -596464, -1490891, 350577, 67646, 221191, 1045288, -113817, -1458141, - -184147, 871878, 1759863, 1468342, 286689, 391916, 873489, 359167, 377420, 256087, - -112206, -6979, -793495, -219043, -562641, 81604, 644782, -354335, 248034, -650151, - -563714, 288300, -871878, -247497, -42950, -197032, - }, - { - 25045564, -55550032, -6820408, 8394514, 12961138, 8447664, 7473243, -5168457, 2181307, -11731703, - 3477313, -9509594, -7582228, -4929012, -13762686, -3244848, -4354560, -3742527, 3655554, 1966021, - -1868311, -3237869, -3787624, 8500814, 1409286, 3478924, 412854, -376347, 2208150, -1519345, - -2059437, -2757906, 1467805, -77309, -1966021, 353798, 40802, 6321655, -396211, -3347390, - 3173444, 2076617, 194884, 813359, -2756295, -2902861, -1840394, -610422, 3785477, -1073205, - -1536525, 64425, 1446867, 47782, 1087164, -326418, -616328, -61203, -494995, 1748589, - 2717641, 598611, -2385318, -1214402, -216359, 1895691, 365609, -393526, -829466, 2223183, - 403190, -542240, -47245, 928250, -635118, -301721, 179315, -1155346, -168577, -828929, - 570157, 716186, -947577, -75699, -382789, -283468, -1031866, 842350, 429497, -102005, - -236760, -48318, -324270, 425739, 494995, 92342, - }, - }, - { - { - 428960, 3100430, 1490891, 6196027, 7572028, -772020, -1132261, -1269163, -1840394, -1124745, - 4081830, -2044404, -1842541, 4065187, -1755568, 9210020, -1016834, 9212705, 3166465, -9743133, - 10370199, 1979980, 1085016, 7180649, -9831180, 3673808, -2545842, -8650601, -73551, 9073118, - 2501282, -1013612, 7553774, -3533684, 144955, -400506, 126165, -1583232, -1209033, 1804423, - -1540820, 1255204, -1279363, -1469416, -573378, 1596117, 768799, 1130650, -537945, 526134, - 184147, -630286, 14496, 1906429, -1213328, 1212791, 1239635, 20401, 150324, 1001801, - 154619, 2673617, 10201, 1442035, 978179, 1400696, 459562, 24159, 1142461, 154619, - 341987, -100395, 311385, -794569, -143345, 274878, 375810, -518617, 4832, 115964, - -170725, 9664, -211527, 86436, 300111, -94489, -785442, -24696, -320512, -215822, - -409096, 136902, 127775, 317828, -306553, 102005, - }, - { - 6183679, -66507032, -9096741, 9263171, 3282429, 1401770, 3029026, -3911105, -85362, -2160906, - -6958921, 1236951, -692564, -552440, 245887, -1296543, -3432216, 3573413, 2368138, 2254321, - 9189083, -4635344, 6239514, -972810, -12739410, -2435783, -704912, -329639, -2111513, -3555696, - 1473711, -6303402, 7472170, -49929, -2811056, 2908230, 2342368, 3073586, 4316979, 59593, - -2243584, 1371705, 1722282, -523986, 3576634, 2369211, 1005022, 571768, -335007, -663572, - 867047, -831613, 1735167, -2249489, 362388, 1107565, -282394, 1110249, -241055, -411780, - 75699, 875636, -1508070, 693100, 99321, 924492, 140660, -27917, -525597, -559956, - -481036, -714575, -4295, -217433, 254477, -252866, 946503, -622233, 265214, -670015, - 203474, 200790, -182536, 153545, -271120, 332860, 112206, 248034, -131533, 94489, - 76236, -197569, 143345, -22549, 38118, -287226, - }, - { - -658204, 3100430, 6278706, -177167, 6389838, -1020592, 1989644, 2005750, 1826972, 1609539, - 2493766, 768262, -2200634, -2587181, 916976, 1936493, 187905, 4817880, 4403415, -6087043, - 1323924, -5893769, 730144, 1466731, 122407, -711891, -2371896, -3124052, -2316598, -404801, - -1212255, -2962991, 1424319, -1415729, 3370476, 1121523, -4045859, -4402342, 4806069, 1018981, - -3958349, -1275068, 173946, -2189360, -593779, 692564, -3143379, -424128, -464393, 766115, - -176094, 567473, 90194, -379031, -1071058, -210990, -288837, -194347, 397821, 64961, - -441308, -25770, 130460, 579284, -560493, 185220, 1122060, 1092532, -941672, -303869, - 155156, -839129, -1096827, 317291, -200790, -117575, -1137630, -450972, -15032, -213138, - -66035, 797790, -28991, 8053, 564788, 55298, -332323, 77846, 100395, -322659, - 32212, -123480, -170188, 95026, -281320, -185757, - }, - { - 2807298, 7039989, -2641405, 652298, 1169305, -309238, -477278, 722091, -804233, -2645700, - 1517734, 2519535, 2973728, 1809792, 19940996, 5735392, -8973797, 6669548, -8055748, 2495376, - 9383430, 3167539, 1430761, 2066416, -2212445, -4641249, 5874442, 2508261, -42413, 5932424, - -4206384, 762357, 6979859, 2714419, -832687, 1963337, 1004486, -3329674, 1513439, 564251, - -170725, 782758, -126702, -2496450, 1244467, 1824287, 1058710, 1406065, -1503239, 1998770, - -357019, 1364726, -2188286, 1445793, -488553, -1231582, -1541893, 71404, -186294, -78383, - 485331, 1261110, -45634, -121870, 676457, 468688, 191663, -500364, -496606, 698469, - -860604, -791348, -280784, 387621, 156766, -259309, -28454, 291521, -36507, 440771, - 427349, -318364, 89121, 256624, -100932, 43487, 148176, 459025, -41339, -215285, - -74625, 258235, 126165, 554588, -235149, 184147, - }, - { - 6747394, 86356224, -9360344, 35399656, -1530082, 437550, -818728, 331786, 1401770, -5170067, - -2021856, -621160, -1457068, 1421097, -1296543, 427886, -4743792, -3079492, 4312147, -2340757, - -2962991, 1061931, -1745904, -1758789, -341987, -1177358, -5077725, 6695317, 1367947, 121870, - 1805497, -1603633, 3320010, 2544231, 2023467, 1037772, -4961224, 52076, 1272384, 2692945, - 1824287, -2614025, -3517041, -1206349, -3295314, -2115808, -1765768, -1033477, -3570192, 792421, - 1794223, 195421, 2100239, -518617, 749472, 847182, 1661079, 963146, -1362578, -445603, - 2113124, -1545651, 406411, -406411, -347355, -398895, 1373316, -418759, 772557, -1235340, - -1093069, 424665, 8590, 302258, -1194538, -172336, 406948, 511638, -234076, 221191, - -744640, -186831, 223338, -283468, -231928, -656593, -190589, -278636, -450435, -146566, - 543850, 124554, 270046, -357019, -264677, -38655, - }, - { - -953483, -8377871, 61203, 1186485, -1131187, 46171, -37044, -314606, -32212, 2716567, - -1549410, -724239, 1400159, -4347044, 3390340, 2556043, 13560822, 8249559, 5813775, -8712341, - 345745, 5030481, 4315906, 4085051, -8310762, 3088618, 12412455, -31675, 765578, -8152922, - 2626909, 5868536, 1310502, 10004053, 2121714, -4536023, -2165201, -2013803, 2135136, -1279900, - -452582, 289373, -275415, 213675, 234076, -1194538, 316217, -969052, 982474, -739808, - 334471, -2496987, 94489, -252866, -937914, 132070, 472446, -1019518, -273267, -846109, - 428423, 1006096, -104690, 1260573, 970126, -219043, 584652, 602906, 333934, 929324, - 190052, 934155, 1491427, -144418, 203474, 530428, 132607, -24159, 344671, -918049, - -344671, -214212, -195958, 272730, 45097, -360777, -78383, -106300, 95026, -301721, - 47782, -311922, -536334, 380105, -91805, 253403, - }, - { - -15338402, 76453640, 406411, 42577620, -3631395, 1196148, -1227287, 6417755, -805843, 5638219, - -526134, -4773856, -446677, -6037114, 1737851, 722628, 925565, -470299, 4609574, 4891431, - -372052, -4596689, 2175938, 1248225, 3090766, -4053376, -3400004, 723702, -222265, -2626373, - -2097018, 1091459, 1639067, -2171643, 1268626, -645319, -2585034, -819802, -1675574, 2378338, - -382789, -1246614, 2432562, -4232691, -776852, -3816079, -3324842, 970126, -1255204, 2497524, - -4000225, 1529545, -525597, 2471217, 1204738, 480499, -274341, -830539, 901406, -650151, - 693637, 781147, -925565, 1626719, -328565, -627065, 459562, 1009854, -583042, -894427, - 579821, 331786, 235686, 840203, 549756, 125091, 53687, -217970, -250182, 226560, - 792421, 38118, -264677, 83752, -874563, 322123, 287226, -613643, -183073, 221191, - 237834, -70867, -65498, -30065, -465467, -85362, - }, - { - -948651, 1216550, -2149631, 1764158, 1114544, 49392, 223875, 1159641, 3113851, 7516, - 3036005, 870805, 246424, -7507603, 5595269, 9463424, 12219719, 5681168, 1609002, 7758859, - 1283658, -7398081, -2342905, -7041062, -2854543, 3933653, -109522, -3995393, 2720325, -804233, - 3728569, -3078955, -10402948, 446677, -816581, 1021665, 2907156, -1209570, -1132261, -1904818, - -490163, 2111513, 2525978, 1810866, -6137509, -50466, 528818, 1449552, 687195, -992674, - 3496640, -704375, 1094143, -1717450, -222265, -820876, -823023, 916976, 702227, 1042603, - 507343, -1825361, -814970, -666794, 1544041, -1170379, -841814, 130460, -876710, -925565, - 1519345, -546535, -806917, -916976, 1105417, 103079, 2684, -1098975, -311385, 197569, - -483184, 424665, -6442, 40265, 11274, -322123, -132070, 42413, -283468, -77309, - -153008, 76773, -199716, -587337, 618475, -397821, - }, - { - 29759828, 53611928, -64961, 38219304, 1241782, -67109, 1675037, 1647657, 986232, 1436667, - -4996658, -5703717, -24159, -1611687, 547071, -3138011, 738734, 897648, -4010963, 1997160, - 673773, -598074, -708670, -1300301, -3495567, 469225, 1088774, -763967, -4196720, 1461363, - -1362042, -516470, -5872294, 2506114, 237297, 1463510, 2305324, -978179, 578210, -3146064, - 1353989, 5086852, 801011, 427349, -1883880, 638876, 1647657, -3902515, -505196, -4184909, - -3410741, 1435593, -2874407, 1466731, 1477469, -1386738, 139586, 172336, 908922, -468688, - -467615, 319438, 273267, -753767, -258772, -204548, -795106, 330176, -8053, -627602, - 29528, -164819, 1260036, -163209, 480499, 547071, -132607, 556198, 144418, 673773, - -187368, -502511, 1611, 239981, 128312, -420370, -441845, 237297, -242129, -72478, - -166430, 242666, -67109, 0, -192200, -184684, - }, - { - 1034550, 19182398, -6762963, 1136019, 3712999, -2142115, -2985002, -893353, 1956895, -4816806, - 930934, 966368, 1049583, -36507, -2110977, 3647501, 5010616, -4096862, 12737799, -1598265, - 1719598, 1382980, -4007741, 3219078, 3675418, 4634270, -1260036, 2827699, 2418604, 3208878, - -1693828, 2115808, 4614406, -473520, -6200859, 1982664, -3224984, 4728759, -3047279, -1211181, - 3052648, -3762391, -3365107, -1557463, 55298, 540629, 671626, -1305133, -247497, 1138703, - 2182380, -1726577, 1012002, -809601, -606664, 404264, 782221, -1992865, 425739, 686121, - 1357747, -621697, 696322, 934155, 352187, -576063, -301721, -963146, 112206, -148176, - 551903, -1021129, -156229, -91268, -464930, 316754, -612570, 733903, 80531, -111132, - 369367, -127238, 148176, -193810, 253940, -449361, 61203, 185757, -88584, -264677, - 30065, -487479, -138513, 292058, 81604, 9664, - }, - { - 21097954, -57905824, -18009334, 10249403, 5547487, -6953015, -17180, -1795296, -4452271, -2181307, - 100932, 6232535, 588411, 379031, -2370822, 5467494, 1848447, 1249299, -5775658, 1204202, - -7182259, -1953673, 3242700, 2761664, -2607045, 8297340, -2561411, 6754910, 7072738, -273267, - 868657, 478352, 2082522, -1161252, -225486, 758062, 622233, 1416802, -3115999, -2057826, - 669478, 310848, 2273112, 1933272, -60130, -1644436, 1148904, -1074279, 438087, 204548, - -1304060, 1375463, -709743, -1138166, -246961, -762894, 1016297, 117575, -573378, 920734, - -1404454, 1215476, -243203, 201863, -1742683, 441308, -852551, 327491, -926639, 466541, - 4832, -226560, 689342, 460098, -338766, -888521, 798864, 351114, -956167, -153545, - 298500, 212064, 188442, 17180, 182536, 286152, -246961, -81604, 143881, 120259, - 2684, -30065, 112206, -2684, -358630, 244276, - }, - { - 3074123, 3670050, -8563628, -2437931, 6954626, 5049808, 1131187, 6230387, 111132, -2570001, - 1586454, -1089848, 683974, -14190572, 4467303, 2058900, -6294812, 2908767, -5744519, -1108638, - 1524177, -19043348, 5603859, -3331284, -4125853, 3612068, 698469, 3213173, 350040, -10193568, - -3985193, 3318399, 3264175, 1580011, 1327682, -2753611, 426276, 2668249, 468151, -1165547, - 1275605, 361314, -1185411, -1708860, -1520955, 2427194, 2401961, -1244467, 507880, 3982509, - 323196, 920197, 978716, -2112587, 941135, -269509, 233539, -1156957, -222801, -466004, - -862752, -579821, 904628, -491237, -630286, 474594, 384936, -518080, 983011, 484794, - -322659, -613107, 258772, -665183, 579284, -250719, 860604, 64425, 832150, 1036698, - -106837, -88584, 576599, -240518, 408022, -671626, -283468, -311385, -646393, 12885, - -104153, 53687, 254477, 314606, -301185, -93416, - }, - { - 33856692, -149360176, -21298206, 12832289, 13589277, 9284646, -12388296, -4577899, -5811091, 7717520, - 7725036, 2652142, -323196, -6828998, 972810, 704912, -3259880, 411243, -7757785, 1027571, - -358630, -4209068, -2940979, 3382287, 788127, -6365142, 288300, 2187212, 807454, 2865817, - 858457, -1648731, -2338073, -1092532, -1798518, -1970316, -3415573, 907849, 971736, 2660195, - 1410360, -1118302, 263067, 4923643, 781147, 4952098, 19327, -2358474, -1447941, -2015950, - -1952600, -2251100, 2024540, 2075543, -630823, -606127, -1700807, -371515, -82141, -1214939, - 472983, 124017, 210453, -1457605, 93952, -122943, 31139, -108985, 1032940, 2279017, - 277562, 34897, 1575179, -22012, -469762, -594316, -636729, 9127, -208843, -49392, - -252866, 90194, 217433, 199716, 862215, 35433, 499827, -62814, 370441, -128849, - 441845, 266825, -32212, -103616, 253403, -77846, - }, - { - 5824513, -6990596, -9474161, 973884, -512175, -703838, 1586454, 5253819, -1257889, 3375308, - -3583613, -1262184, 3422552, -9201431, -6226629, 12140262, 3595425, 2790655, -747861, -1721745, - 7339562, 1412507, -1616518, -10305774, -2377801, -912144, 3742527, 10929618, 4748087, 4279935, - -7161858, 826781, -2314987, -63351, 3071975, 2006287, 3141769, 4835597, -3083787, -1471563, - 949725, -1620813, 949188, -1690607, -284542, -1034550, 1765768, 1457068, 617938, -625992, - 1915555, -1075889, -281320, -854699, 1802276, 1574106, -1083942, 1074279, 542240, 169651, - -1168231, 127775, 1380295, -498216, -235686, -246961, -1535988, 347892, 1330366, -1061931, - -39192, 60666, 683437, 426812, -14496, 179315, 266825, -77846, -24696, 74088, - -111132, 472446, 184684, 510564, -296353, -311385, 770947, -231928, 567473, 296353, - 118648, 721018, -161061, 187905, 514322, 144955, - }, - { - -3554086, -109644072, -16634408, 9715753, 4388920, -8732205, 666257, -6823093, 262530, 605590, - 10111427, -8761733, 2232846, 2916283, -4741107, 3915400, 3293703, -7164543, -6849399, -7438347, - 2812667, 1614908, -6792491, 1301375, 2074469, 7573638, 1436667, 433792, 1958505, 1160715, - 1553704, -1672890, 482647, 2309619, 768799, 2150705, -1367410, 910533, 152471, -1984275, - -2152852, -3105261, -2639794, -214212, -959388, 605590, 1570884, 956704, 2203855, 666794, - 2485176, 1239635, -1094680, -2330557, 746251, 383863, -644782, -1160715, -1154809, 759672, - 181462, 1147830, -1132261, -681826, 186831, 1039382, 25233, 628139, 563178, 1748052, - -197569, 287226, 87510, 388158, -401043, -62814, -238371, -613107, 549219, -609885, - 130997, -443455, -860067, -16106, -666257, -235686, -905164, 437550, 212064, -254477, - 238908, -69256, -624381, 51540, -139050, -289910, - }, - }, - { - { - -361851, 13681618, -6291590, 16907676, -1526324, 205085, -1680943, -1508070, -676457, -60666, - -3055869, -4917738, 1202054, 3711926, 3087545, 14648523, 4900558, 3365644, 3277060, -5426155, - -467078, 3078955, 3758, 6147709, -1152662, 778463, -11184632, -4116189, -1875290, 5222680, - 1052804, 842350, 4512937, -1221381, 1105417, -1165010, 1275068, 519154, -1777043, 794569, - 1979980, -3216931, -1823751, -500364, 1417876, 568009, 1109712, 810138, -1124208, 9664, - 643171, -1066226, -456340, -110595, -481573, 1299228, 631897, 636729, 816044, 1447404, - 312459, 805306, 1440962, 1215476, 1248762, 962610, 66035, -105764, -80531, 401043, - 1002338, -35433, -12885, -79457, -665720, 249108, 296890, -186294, -753767, 392453, - -193274, -137976, -685584, 249108, 39192, -248571, -541703, -300648, -11811, -317291, - -208306, 15569, 192200, -143345, 96100, 20401, - }, - { - -688269, -54430656, 79994, 6750615, 2541547, 1648194, -1175747, 2955474, 784905, -3207804, - -10206453, 4912369, -2098629, 2931315, -274878, -4381404, 1281511, 2945811, 4784057, 3432753, - 8563091, 374736, -2764885, 1188095, -7160248, -3530463, 665183, -2633889, -3024731, 2085744, - -4675072, -4080756, 3590056, 2399276, -819265, 1489817, 2500745, 3813394, 2282238, 1475321, - -763430, -74088, 1774358, 373662, 621160, 2092723, 1539209, 1078037, 1457605, 244276, - 1063004, -2590402, 238371, -554051, -1440425, 1246077, 118112, -236760, 461709, 68183, - -1032940, 710280, -962073, -314606, 941672, 312996, 689879, -1052804, -118112, -850404, - -678068, -649614, 447750, -352187, 795106, -400506, 761283, -576063, 202937, -253403, - -587874, 562641, -272194, 152471, 50466, 308164, -111132, 272194, -537, 252866, - -395674, -111132, 5369, 55298, 128849, -353261, - }, - { - 2337536, -1289564, 11767137, 33516314, -19545322, -554588, 331786, 2152852, 3186866, 2294050, - 1863479, 528281, 379031, 1897302, 5094905, -5450314, 4628364, 2956548, 6332930, -766652, - -2424509, -11324755, 3687766, 1270774, -2325725, -489089, 433792, -4593468, -1088774, -307090, - -3204046, -5077725, 5163625, 375273, -178241, 1346472, -4727686, -1037772, 1201517, 3456912, - -3738769, -1806034, -1547799, -3013457, -597537, 738734, -1219234, -984084, -980863, -629213, - 1374926, 1615445, -298500, -1533840, -1505923, 23085, -278636, 122407, -294742, 745177, - -838592, -695785, 708670, -464930, 748935, 186831, 886374, -351114, 589484, -415538, - -639950, -98784, -435402, -268435, -437013, -320512, -636192, -576063, -428423, 187368, - -67646, 90194, 179852, 31675, 482647, -362388, 295279, 95026, -68719, -56908, - 249108, -536871, -12348, 64425, -208843, 78383, - }, - { - -2651069, 6271726, 4582193, 482110, 491237, -668941, 715112, -1335198, 577136, -1903744, - 253403, 2079301, 6113349, 5528160, 4598300, 4318053, 17956184, -14171781, 8094940, 4820564, - 1881196, 5424544, -1804960, 3674345, -4512937, 3210488, 4078072, 219580, -3461207, 3851512, - 1255204, 577673, 4962835, 4015258, -1324997, 1534914, -2252174, -465467, -398895, -1170379, - -918586, 297427, -711891, 2269353, 372052, 971200, -60666, 588947, -523449, -370978, - 2107755, -157303, -902480, 1406065, -661425, -1523103, -851477, -59056, -875636, 859530, - 1003949, 11811, 466541, 362925, 870268, -258772, -169114, -820876, -313533, 133144, - 483721, -559420, 386010, -127238, 638340, -159451, -810675, 219580, 408022, 248571, - 428960, -399969, -44023, 439697, -456877, 83215, 160524, 475668, -534187, -48855, - 301721, 89657, 197032, 40265, -48855, 59593, - }, - { - 9275519, 73656544, -7544647, 33267206, 3298535, 861141, 2347737, -3794067, -532576, -4658429, - -166430, -2228551, -4574677, 4141422, -8334384, 4632122, -4963909, 981400, -678605, -1052267, - -3825742, -49392, -222801, -334471, 932545, -2581812, -2371896, -795106, 2212445, 210990, - 2797098, 95563, -266288, 6541772, -120796, -523449, 2361695, -2373506, 2572149, 708670, - 649077, -2233920, -3842922, -1873143, -1425929, -1250372, -1080721, -1864553, -3322157, -816044, - 2353105, 1532767, -583579, 1844689, 892816, 432718, 2106682, -6442, -44560, 26307, - 1480690, -1580548, 449361, -79994, -1253594, 460635, 1571958, -94489, 1083406, -1123134, - -748935, 173409, 486942, 55835, -1057099, -82678, -96100, -115427, -121870, -147103, - -465467, 19327, 17717, -223338, -135291, -300648, -241055, -297427, -507343, 311385, - 191126, 227633, 176094, 134218, -325881, -326954, - }, - { - 504659, -8881455, -1945083, 943819, -1111860, 307090, 239444, -1017907, 648540, 1684164, - -2753074, 10201, -518080, 7228430, -3525631, 4179540, 6608881, 14273250, 210453, -2215130, - 974958, 1131187, 3703873, -804233, 2345052, 1694365, -5297842, 14048301, 1797444, -8952322, - 2564632, 615791, 2542621, 7463043, 886911, 759136, -3322157, -1732482, -647466, 821949, - -2109366, -474057, 2744484, 216896, 39728, -1803886, -1108102, 1018981, 124017, 331249, - -2150705, -807454, -391916, -1426466, 392453, -339302, -542777, -242666, -629750, -84289, - -31675, 1621887, 1062468, 462783, -60130, 875100, 688269, 1252520, 207769, 1060857, - 1222992, 629750, 330712, 627065, -731755, 634045, 287226, -327491, -138513, -166430, - 133681, -263604, -330176, -5369, 356482, -444529, 329639, -267362, 81068, -218506, - -238371, -24159, -302795, 50466, 129386, -144955, - }, - { - 27306866, 28926604, -2156611, 42886324, -6209449, 293132, 689342, 462246, 329639, 2436857, - 1963874, -3564823, -6212134, -4650376, -1932735, 2747705, 1860258, -840203, 2652679, 3811247, - 3989488, -2011118, -2989834, 3222836, 1051730, -3460670, -2262374, -1302449, -1787780, -509491, - -2527052, 1992865, 1181116, -882616, -597537, 593242, -1180042, -3438658, -909459, 2310156, - -1677722, -1330903, 1109712, -594853, -2084133, 530965, -3659849, -1425929, 81604, 149250, - 258235, -2120640, -788127, 2276870, 1038308, 576599, 171262, -1207960, 386547, -138513, - 845035, 402116, 301185, 238908, -135828, -140123, 580357, -292595, -646929, -261993, - 32749, 1161789, 23622, 223875, 1545651, -130997, -319438, -97174, 426812, -103079, - 632971, 437550, -462246, -738734, 155693, -23085, 321586, -604517, -119185, 297963, - 284542, 81068, -131533, -29528, -263604, -317291, - }, - { - 143881, -611496, -4728222, 1046361, 295816, 1031866, -619012, -403190, 5440650, -405338, - 3228742, -477815, 2255395, -2617246, 1367947, 8977555, 11750494, 7963406, 4694400, -1132798, - 2022930, 44023, 17717, -6934762, -3286724, 5565741, -3266323, -3830574, -3558917, 9014599, - -4182761, 2071785, -3438658, -2590402, -1092532, 1888175, 2491081, 2709051, -1316944, -3781719, - -535260, 2942053, 2871186, -585189, -2451890, -1966558, 977105, 810675, 1388348, -199716, - 2510945, -726923, -340913, -447750, -1234266, -605054, -397284, 550293, 830002, 864899, - -572841, -1086090, -854699, 262530, 1130113, -1326071, -143881, -930397, -810138, 203474, - 1181116, -1248225, -918586, 161061, 24159, 263067, -213675, -1032940, -310311, 417149, - 25233, 102005, 388695, 39192, -155693, -157840, -210453, 98247, 19864, -185220, - -233002, -111669, -285078, -575526, 336081, 41339, - }, - { - -8302172, 109266112, 1895691, 39673148, -3632469, -956704, -735513, 2913599, 2091112, -2415919, - -5464809, -465467, 865973, -734439, 1895691, 61740, -3891777, 596464, -4757750, 3477850, - 2645700, -399969, -2376191, -542240, -1567126, -13422, -1230508, -432181, -1057099, -488553, - -2505577, -3462281, -1137093, -139050, 2689187, 1181653, 281320, 1263257, -2542621, -710817, - -302795, 3915400, 1036161, -458488, 47245, 580357, -921807, -3026341, -966905, -3034395, - -1347009, -629213, -557272, 654983, -358630, 1095217, 223338, 1523640, -2090575, 726386, - -618475, 1135482, -1201517, -534187, 634581, -791348, -33286, 146029, -497679, 198642, - -128312, 625992, 310848, 205622, 189515, 503585, 609349, 372588, 204548, 158377, - -596464, 66572, 108448, 191663, -255014, -214748, -378494, 177167, -351650, 141197, - -115964, -119722, 55298, 13422, -278099, -6979, - }, - { - -1846299, 20069846, -2814277, -3994320, 4552129, -4775467, 2580739, 1990717, -650151, -4220879, - 593242, 2603824, 3327526, -624918, 1598802, -2709051, 4173098, -2675765, 8617852, -1202591, - 2114198, -3009698, -2495376, 1457605, 3088618, -2243047, 3320547, 1601486, -1855963, 3473555, - 3590056, -368293, 5469104, -2763275, -5881421, 3571802, -1278827, 941135, -1882269, -147640, - 942208, -1934883, -2969970, -592169, -2573222, 1234803, -679679, -796716, 893353, 2106145, - -72478, -1269163, -128849, -910533, 289910, 587337, -295279, -399432, 26307, 457951, - 1200443, -608812, 527207, 839666, 97174, 297427, -673236, -1072668, -172336, -369904, - 593779, 339302, -1073742, 394063, -427349, 384936, -405338, 461709, 176094, 412317, - 336081, 102005, -195421, -35433, -621697, 328565, -35433, 11274, -89657, 316754, - -278636, -35433, -502511, -183610, 250719, -10201, - }, - { - -20850992, -29579440, 3541201, 6255620, 2638184, -4858682, -7849053, 59593, -4920959, 2072859, - -935229, 4809290, -2707440, 3244848, 111132, -2266669, 6269579, -1210107, -2765959, -5721970, - -4691178, -1115081, 731218, 3371013, -1874216, 4980015, 3462818, 2237678, 4657892, -307090, - -1205812, 2223719, 735513, -954020, 4723391, -1208496, -3271691, 3207267, -2641405, -1067836, - -2607582, 1942936, 2952790, 1350230, 832687, -1911261, 1645509, -1195075, 94489, 882079, - -1014149, -148176, 874563, -705448, -2630131, 981937, 369367, 1066226, -521302, -1851668, - 551903, 588411, 689342, -199179, -194347, -329102, -1314260, 39728, 19327, -555125, - 33286, 149250, -449361, 528818, -292595, -618475, 784368, -896574, 336081, -144955, - -15569, 297427, 583042, -17180, -40265, -346282, 268972, -117575, -261993, -144418, - 296353, -263067, 277025, 254477, -277562, -110059, - }, - { - -2675228, -5415417, 7152195, -5264020, 5435818, 150861, 7081328, 4677757, 119185, -3055869, - 1609002, -318364, -616328, -12060268, 7241315, -4399121, -183610, 1866700, -12800613, 6646462, - -10050223, -2988224, -7519951, 796716, 1676648, -4936528, 2925410, 10153303, 387084, -11089069, - -1152125, 2197950, -145492, 2815351, 3430605, -117575, 102542, 683974, -2969433, -2163590, - 2859375, 292058, -2853469, -2437394, 1400159, 2326262, -374199, -1301912, 2480881, 350577, - 1079111, 1307818, -47245, 480499, -1337346, 1467805, -91805, 131533, 283468, -468151, - -2092723, 534187, -305480, 761283, 216359, -1238024, 614180, 865436, 153545, 697395, - -1240172, 12885, -411243, -130460, 210990, 73014, -120796, 428960, 1246077, 10201, - 628676, 273267, 77846, 537, -265214, -256087, -512712, -13959, -478889, -348429, - -237297, 23622, 103079, 364535, -459562, 134755, - }, - { - -50934016, -54827940, 14853608, 4773856, 20151986, -15551003, -7312719, 6500970, -3778498, -3400540, - 6340983, 6868190, 1032403, -5746130, 371515, -3691525, 2991445, 2683818, -11222213, 2827699, - -5014911, -2317672, 1373316, -1705102, 1870995, -8343511, 1593970, 3173444, 2331094, -673236, - -40802, 74625, -3450469, -1946694, 834297, -1562831, -1715303, -282394, -1676648, 1415729, - 1316408, 1088774, 3120831, 2828773, 2435247, 6316823, -476205, -1224066, -1440425, -1821603, - -4540318, 871342, 24159, -66572, 323196, -1534914, -1057099, 703838, 16106, -237297, - -1832877, 606127, 15569, 397821, -531502, 119185, -31139, 888521, 353798, 609349, - 921807, 326954, 307627, 545998, -998580, -271120, -670552, 420370, -625455, -541166, - -187905, 318364, -245350, 514322, 381715, 448824, 276489, 442382, -21475, 88047, - 269509, 671626, -143345, -193274, 69793, 114890, - }, - { - -5032091, -12279311, 8117488, 1087701, -1282048, 8590, 4680978, 738734, 7831873, 2159295, - -2105608, -1626719, -1308891, -14971719, 13484050, 5659693, 201327, -32212, 3889630, 3408594, - -2560874, 3034395, -5290326, -5596880, -9142912, 5963025, -8256538, 15920370, 5935645, 5400385, - -4765803, -6019397, 987843, 3922379, -954557, 2421825, 5000953, 2265595, -15032, 1228361, - -2308008, -517007, -748398, -1496259, -1985886, 1305133, 1087701, 1803886, -500364, -722628, - 1212255, -81068, 82141, -386547, 609349, 378494, -710817, 1626719, 92879, 1195075, - -1643362, -6979, 489626, -763430, -494458, -176631, -416612, -462783, 1222992, -470299, - 459025, -1182727, 439697, 526134, -245350, 178778, 374199, -145492, -173946, 732829, - -192737, 358630, 214212, 590021, -104153, 298500, 234076, 124017, 520765, 450435, - -62277, 258235, 235686, 289910, 310848, 258772, - }, - { - -17486422, -98455680, 3553012, -6730751, 2152852, -1704028, -5369246, -43487, -6291590, 5942088, - 4564477, -8884140, 9029095, -5927592, 9374303, 3988414, -4203699, -5497022, -5009006, -5583995, - 2419140, 1345399, -1137630, -4859219, 2978023, 2893734, 6755984, -1971390, 1787780, 2221572, - 2539936, -3305514, 2528662, 6567005, 20938, 275952, 505196, -2012192, -490700, -108985, - -5577015, -820876, -1632088, -2319819, 1677722, 1336272, 1178969, 1844152, 105764, 1667521, - 1201517, 2592013, -3781182, 366683, -1582696, 1672890, -1316408, 320512, -1636919, 240518, - -1195612, 2217277, -878321, -549219, 740882, 105227, 547071, 1178969, -230854, 1187022, - -328028, 1139240, 34897, -290984, 295816, -64961, -354335, -95026, 199716, -466541, - 213138, -359704, -530428, -119722, -255551, -788663, -189515, -262530, 99321, -151934, - 301185, -181462, -243203, -346282, -360777, -23622, - }, - }, - { - { - 969052, 22889492, -600759, 2787434, -13801341, -725313, -717260, 1015760, 523449, -1262720, - -6460168, -4789426, 4217658, 523986, 2657511, 12582644, -162672, -665720, 936303, -4516158, - -7523172, 1389422, -1365263, 1089311, -1082869, -3466576, -8222178, -741956, -1020592, 4503810, - -447750, -619549, 2045478, -149250, 1545115, -1596117, 579284, 1493038, -1416802, -2204929, - 2380486, -1589138, -2291365, 2263985, 4283156, -1672353, -656593, -199716, -2121177, -148713, - -45097, -756988, -735513, -1429150, -180926, 583579, 484794, 805843, 475668, 974421, - 184684, -42950, 496069, -84289, 301721, 375273, -621697, -1188095, -577673, 137439, - 577136, -77846, 44023, 319975, -334471, -11274, 135828, 156766, -759672, -77846, - -488016, 76773, -469762, 418222, 275415, 89121, 37581, 68719, -82678, -443992, - 28991, -115964, -167504, -417149, -67646, -31139, - }, - { - -1756642, -48007532, 9258876, -16416439, -12880607, -736587, -330176, 5405753, -681289, 2172717, - -5131412, 2122788, 964757, 9249749, 3937411, -6672232, -5020280, -1465121, 4536023, 2782065, - 7173133, 4286914, -1376000, 551903, -2538863, 3352222, 5186173, -2967823, -4547834, 4231617, - -1805497, -2576444, -1005022, 701153, -1985349, 674310, -391379, 1348083, -779537, -215285, - -1392643, -1359357, 1794760, -595390, -26307, 691490, 424665, 46171, -454730, -129386, - 726923, -2997350, 391916, 827318, -980863, -13422, 90194, 923955, 333934, 700080, - -375273, 233539, -995896, -788127, 784905, -188979, 665720, -388695, 1068373, 193274, - -128849, -848256, 401043, 10201, 664646, -639413, 276489, -876710, -59056, 104690, - -615791, 223875, -255014, 171799, 226560, 251792, -331249, -349503, -484258, 125091, - -367220, 79994, 30602, -77846, 258772, -166430, - }, - { - -2629594, -5983963, 8587787, 34946000, -12437152, 492848, 1507534, 2031520, 1643899, -1488743, - -4136054, 2743947, 1227824, 896574, 6008123, -6830609, 2629057, -1909650, 733903, -3521873, - -2889976, -7878581, 1084479, -2763812, 1016834, 2182380, 4948876, 763430, -590021, 462783, - -3034931, -2700461, 4313221, -1456531, -1576253, 152471, -4314295, 2348810, -339839, 2849174, - -1858110, -158377, 248571, -1745904, -1257352, 557272, 697932, 951872, 431644, 15569, - 1363652, 907312, -725313, -903554, -984084, 1177895, 743566, 674310, -1044214, 818191, - -608812, 154082, 1618129, -242666, 1056025, -229244, 211527, -98247, 1355062, 124554, - -642635, 291521, -38118, 135828, -182536, -104153, 50466, -202937, -106837, 377957, - 175557, 267362, 20401, -603980, 170188, -376883, 12885, 54761, 94489, 58519, - 493384, -118112, 351650, 108448, -117038, 76773, - }, - { - 1993939, -4310000, -8063264, 1597191, 394600, -849330, 703301, 164819, 2121177, -1891933, - 279710, 293132, 1682017, 6892349, -1502702, -1645509, 15373835, -9424769, 13386339, 83752, - 1197222, 1275068, -3470334, 2554432, -4088809, 5041218, 4839355, -39728, -6233608, 5142687, - 3700114, -3117610, 322659, 679142, -3445638, -1889786, -4417911, -1152662, -2729452, -300111, - 390842, 376347, -610422, 3386045, 493384, 382252, -1399623, 1463510, 607738, 630286, - 1577864, 46171, -212601, 321586, -948114, -213138, 453656, 734976, -991064, -375810, - -199716, -968515, 469225, 920197, 896574, -989990, 339302, -150324, -685047, -84826, - 747324, -379568, 500364, -165893, 406948, 261993, -284005, -141734, -230318, -118648, - 188979, -295279, -354872, 154619, -667867, -128312, 330712, 555661, -359704, -39192, - 197032, -204548, -27917, -210990, -120796, 39192, - }, - { - -15811385, 16307991, -17729088, 24616068, -8121783, 16643, 514322, -8151311, -4054449, -8018167, - -3430068, -7868380, -5034776, 6711424, -7683697, 8648454, -1879585, -3725884, -5161477, -195958, - -4060892, -3392487, 2696166, 2285460, -376347, -3475166, -4913443, -4072166, 107374, -2094870, - 1545115, -306016, -3730179, 1454920, -3583077, 54224, 4694400, -2031520, 2912525, -1363652, - -2444373, -3410204, -463320, 2090039, 690953, -11274, 1729798, 351114, -1856500, -1655173, - 419833, 833761, -823560, 2121714, 442919, -441308, 6979, -664109, 645319, 59593, - 566936, -1308354, 326418, 448287, -153545, 1292785, 816044, -529892, 1020592, -438624, - -60130, -68183, -481036, -6442, -503585, 329639, -357019, -264677, -70867, -125091, - -348966, -192737, 292595, 303332, 124554, 74088, -145492, -45634, -102542, 199716, - -259846, 94489, 123480, 302258, -49392, -66035, - }, - { - 553514, 2603824, 4868883, 33823, -2065342, -90194, -188442, -509491, 532039, 483184, - -661962, 819802, -786516, 4864588, -5554467, -1412507, -11439109, 4908611, 2165201, -804233, - 2256469, -2357400, 458488, -284005, 2295660, -629213, -9540733, 12630425, 833224, -8902930, - 3992172, -5055714, -3952981, 1261110, -796180, 5995775, 2748242, 2379412, 256624, -620086, - -260382, 1107565, 2576981, -155693, -1713692, -1605781, -541166, 274341, -1771137, 646929, - 220654, 1021129, 313533, -761283, -46708, -742493, -746787, -345745, -756451, 364535, - -24159, 1653026, 1040456, 359704, -110595, 216896, -119722, 539018, 16106, 338229, - 355945, 259846, -239981, 511638, -938450, 194347, -159988, -476741, -98247, -87510, - 693637, 165893, -304943, -66572, 341987, -456340, 341450, -233539, 66035, -111132, - -427886, 34897, -118648, -60130, 192200, -114890, - }, - { - -22243636, -33153390, 3820910, 47270948, 2033667, 986769, -2970507, -2733210, 409633, -4952634, - -598074, -2343442, -16106, 943282, 708670, 1520418, 208843, -366683, -1538672, -1055488, - -1152125, -913217, -3149822, -3237332, -5523328, -2655901, 157840, -3526705, -3113315, 508954, - -1526861, 914828, 1287417, 2917894, 1212791, 2138357, -1068373, -1817845, -1632625, -866510, - -156229, -1105954, 251792, 2447595, -321586, 2644089, -527744, -1045288, -901406, -549756, - -1096290, -3172370, -1449552, -93952, -113280, 1132798, 897111, -1455994, 577673, -428423, - 337692, 313533, -104153, -609885, -42950, 471373, 705448, -254477, -210453, 29528, - -194884, 897648, 52613, -101469, 483184, -479426, -154082, -177704, 231928, -31139, - 293668, 498216, 145492, -42413, 565862, -164283, 298500, 40802, 12348, -13959, - 220117, 148713, 13422, 104690, 274341, 239981, - }, - { - 966905, 5768141, -1756642, -1733019, -2850248, 671089, -1156957, -2363306, 2556043, -2106145, - 2659122, 459025, 3440806, -2094870, -45097, -7947837, -17884780, -876710, 10343892, -5277441, - -1187559, 6013491, 428960, -3473018, -290984, -2772938, -9012452, -3569655, 1784022, 11120207, - -5684926, 6961605, 6524056, 3584687, 1320703, -128312, 1961190, -71941, -1948841, -178241, - -857383, 625992, 1200443, -1515587, -1685238, -1154273, 219043, -409633, 2615098, -517007, - 226023, -982474, 240518, -24159, -565325, -385473, -431644, -846645, 37044, 1511829, - 569620, 718870, 47245, 55835, 891743, -835908, 471910, -570157, -391379, -88047, - 342524, -596464, 102542, 619549, -187905, 27380, -221728, -702227, -137439, 970126, - 466004, -12348, 528281, 43487, 52076, 252866, 428423, 438087, 143881, 132607, - -139050, -273267, -101469, -537408, 32749, 28991, - }, - { - -11508365, 89314384, -9924596, 48168596, 4358318, -792421, -1838783, -2609730, -2365453, -1913945, - -3706557, -459025, -1973001, 6497749, 6732898, 4721780, -2089502, -576063, -4875325, 4576825, - 3949223, 936303, -610959, 2378338, 648003, 1389959, 667331, 1885491, -515933, -2522757, - -2317135, -2211371, 200790, -847182, 1432372, -2193655, 454193, 3214783, -491774, 1015760, - 55298, 1628866, 677531, -677531, 2014877, 1865090, -367757, -762894, 3094524, -1191317, - -643708, 1274532, 253403, 533113, -1011465, 1947231, -6442, 597000, -1867237, 2200634, - -408022, 173946, -336081, 774705, 219580, -666257, 543850, 564788, 318364, 521839, - -420907, 681289, 265214, 97711, 172336, 196495, 335544, -26844, 33286, -54761, - -785979, -175020, 95026, 88047, -471910, 432718, -147103, -215822, -433792, 462783, - 111132, -275415, -299037, -94489, -114354, 290447, - }, - { - 1786706, 22038550, -103616, -5015448, -2170569, 1631551, 8316668, 2066416, 4161823, -2363306, - -2167885, -3207804, 952409, -1859721, -640487, 264141, -617402, -1533840, 8363375, -6345278, - -3459596, -11781095, -6839199, 1428614, 30065, -6571300, 3862249, -117038, -5725192, 2877091, - 3917010, -621160, 3013457, -4256850, -2296197, 2568391, -788127, 2326799, -100395, -427349, - 2640331, 2270964, 1191317, 513249, -2771865, 811749, -138513, -904091, -501437, 1418413, - -288300, -1392106, 94489, -452045, 218506, 442919, -664646, 1018981, 259309, -681826, - -73014, -572841, -348429, 555125, -314606, 304406, -119722, -616865, 242666, -94489, - 694711, 703301, -758599, 991601, 115964, 820876, 78383, 306553, 35433, 108448, - -324270, 347355, 287226, 73551, -244276, 552977, -151934, -142271, -268972, 320512, - -248571, 26307, -347892, -188442, 258772, -170188, - }, - { - 20541218, -10235444, -29348586, -5096516, -3409667, 1465121, -6252936, -3849901, -4949413, -1314260, - -4085051, 1868848, -3499325, 2349347, 2216203, -4741107, -1805497, -1590212, 4867809, 1011465, - 3953518, 2776696, -4379256, -1395328, -3172907, 2848100, 753230, -4960151, -617938, -2768643, - -2185602, 1374926, -1331440, -2757906, 6025302, 499290, -3383897, 2288681, 20938, 938987, - -2525441, 1357210, 1052804, -244276, 1374390, -499290, 2761664, -1260573, -52076, 1784022, - -1534377, -1481227, 158377, -1060857, -2318209, 921271, -1374390, -233539, -587337, -500901, - 1308891, -574989, -169651, -908922, 472983, -127238, -454730, 434865, 500364, -224412, - -121333, 360240, -602906, 384400, -13422, -745177, 320512, -1090385, 653909, 253940, - 216896, 198642, 368830, -38118, -231928, -476205, 112206, 143881, -255551, -180926, - 205622, -173946, 241592, 346819, 81604, -134755, - }, - { - 1765232, -18196702, -2752537, -3912178, -555125, -2576981, 4874251, -1047435, -889595, 1359357, - 150324, -2915746, 1134945, -4798016, 5981816, -2436320, 2229088, 5416491, -4469451, 9208947, - -5402532, 6703907, -5724118, 5065377, 1271847, -2655364, -22012, 2338073, -2093797, -5047124, - -725850, -155693, -2137820, 1488743, 2367601, -660351, 1172526, -106837, -2146947, -1699733, - 1721745, 970663, -2412161, -2434710, 577136, -1931125, -3084860, -3301756, 1132798, -607201, - 643171, 317828, 894964, 1910187, -2252174, -207769, -745177, 1295470, 1063541, 574452, - -1072668, 1403917, -946503, -951335, -94489, -438624, -227633, 529355, -637803, -62814, - -1122060, 248571, -862752, -581968, 606127, 690416, -34360, 27917, 202400, -807991, - 584116, -34897, -199179, 82141, -281857, 183610, -439697, 134755, -14496, -324270, - -381715, 137439, -51003, 235149, -335544, 224949, - }, - { - 45488000, 61630096, 892279, -4978404, 16331613, -14806363, -773631, 8176544, -7302518, -9097278, - -1502702, 7088307, 4256850, -4275640, 1692217, -2233383, 4044786, 2923262, -11470247, -370978, - -6822556, 792421, 5749351, -92342, 4255239, -1706176, 4671851, 2277943, 1207423, -864362, - 1589138, 839129, -1074816, -967441, 1405528, -810138, -998580, 2989834, -801548, -2666638, - 583042, 548145, -72478, 1996623, -1479079, 1660542, -865436, -587874, 202937, 1150514, - -2367601, 1756105, 1025960, 307627, -719944, -796716, 138513, 869731, -68719, 466004, - -1057636, 412854, 254477, 1164473, -461709, 17717, -185757, 757525, -463856, -794032, - 132607, -328565, -576063, 85362, -799938, 433255, 341987, 675384, -942745, -725850, - -901943, 299574, -504659, 90194, -38118, -147103, -183610, 277025, -169651, -15032, - 100395, 700080, 101469, -171262, 96637, -17180, - }, - { - 4102231, -16379932, -4167729, 2417530, 222801, 2532420, 6465000, -860067, 7732552, -1898376, - -3736622, -1322313, 745714, -2331094, 29152628, 8551280, -2304250, -7648263, -1868848, 3349538, - 1155883, 5046050, 1542430, 2662343, -8367133, 6379100, -9160092, 7233262, -1650341, 3621731, - 928787, -552440, 2062121, 3900367, -3027952, -1445793, 3183108, 2403571, 2386928, 1895691, - -2602750, 260382, 362388, -588947, 538482, 2244657, -2109903, 96100, 215285, -577673, - 807991, -289373, -198642, -2321967, -907849, -146029, -1387811, 911070, -854699, 352724, - -1078574, 157840, -876173, -847182, 713501, 339302, 418222, -98784, 306016, -466541, - 641561, -1030792, 29528, 345745, 284542, 623844, 424128, -49392, -292595, 469762, - -106837, 437013, -285078, 468688, 53687, 540629, 141197, 46708, 70867, -1611, - -293132, 102005, -94489, 15032, 249645, 97711, - }, - { - 28984050, -38580080, 2386391, -14267881, 1460289, 6015639, 225486, 6349573, -5329518, 2104534, - 1949378, -348429, 6586333, -9077950, 12467753, 3185255, -7622493, 205085, 2095407, -334471, - -628139, -1992865, 1905892, -1710471, 2801929, -2761664, 4529580, -3431142, 2512556, 3852049, - 820339, 107374, 4836133, 4204236, -2284386, -1535988, -112743, -1841467, -599685, 3499325, - -530428, -362925, -338766, -1574642, -657667, -1099512, 57982, 259309, -2376728, -540092, - -386010, 2478733, -3629784, 338229, -2894271, 690416, -2142115, 584652, -1418413, -382789, - -1517734, 1317481, -183610, 180926, 951872, -396211, -170188, 449361, -1557463, 655519, - -257698, 875636, 215285, -143881, 384936, 219580, -101469, 44560, 569083, -223875, - 588411, 850940, -35433, -5369, 539555, -291521, 47782, -170725, -183610, -16106, - 136365, -327491, -53150, -129923, -162135, -11274, - }, - }, - { - { - -1656247, 23449448, 1792075, -14124000, -1604707, 1885491, 488553, -2416456, 5230197, -4719632, - -5170067, -3269007, 3211562, 580894, 3762391, 5083094, -8357470, 7420093, -2627983, -4983773, - -6761889, -1523103, 440771, -2729989, 1708323, -4775467, -1402307, -2155000, 212601, 1443646, - 3694746, -3925600, 3005940, -312996, -1808181, 3104725, -2386391, 3033321, 703301, -2895882, - 2761664, -111132, -5199595, 3721052, 4305705, -857383, -1850594, -903017, -1067299, -83752, - -1934883, 533113, 181462, -906238, 867583, -47245, -12348, 731755, 398358, -106837, - 796180, -241592, 785442, -758062, 718333, 456877, -665183, -952946, -393526, 341450, - -333934, -39728, 477278, -18254, 112743, -381715, 106837, 331786, -151934, -571231, - -250719, -167504, 322659, 105227, 118648, 144955, 209380, 19327, -210453, -293132, - -222801, -171799, -186831, -80531, -141734, -65498, - }, - { - 1266479, -39521216, -5704254, -27304718, -3798362, -2976412, 3138011, 2635499, -2610266, 3663607, - 4796405, -10110353, 7364259, 4281546, 5760625, -10509785, -2266132, 461172, -2339147, 2900714, - 3316252, 9428527, -539018, -2753611, 1788854, 834834, 2417530, 1516660, -3055869, -985158, - -3112241, 4172561, -737661, -979253, -3737695, 1553168, -2570001, 1809792, -1984812, 519154, - -1191317, -1078574, 1610076, -986232, -70330, 1633161, -822486, -372052, -1225139, 1055488, - -765578, -1454383, -640487, 606664, 1420024, -938450, 110595, 1787780, 715649, 44023, - 508417, -134218, -309775, -602906, 570157, -46708, -156766, 348429, 1090385, 488553, - -492311, -558346, -120259, 535797, 157840, -104153, -700617, -252329, -81068, 56371, - -255551, -120796, -130460, 79994, 369904, -33286, -406948, -140660, -458488, -130460, - -101469, 78383, 1074, -128849, 169651, -4295, - }, - { - 1735704, 13484050, -21270288, -7835094, 27815818, -293668, 3438658, 1636919, 1118302, -595927, - -5668820, 2672007, -957241, -2631741, 179852, 570694, -2550674, -67109, 1795833, -5114233, - -3671123, -9380745, -889058, -345208, -1087701, 6117644, 3650185, 3648575, -3500935, 813359, - -2217814, 2305861, -3948149, 3266860, -1887638, -588411, -3377992, 2338610, -1906429, 2732673, - 235686, -9664, -199179, -379568, -1797981, 535260, 989453, 127775, 699543, 2173790, - 206158, -263604, -2046015, 1287953, -119722, 1138166, 53150, 1208496, -1736241, -198105, - 84826, 626528, 1438814, 119722, 122943, 680215, -235149, 481573, 102542, 892279, - -119722, -19864, 371515, 143881, 522912, -418759, -26307, -494995, 266288, -92879, - 371515, 20401, 333934, -323733, -297963, 59593, -110059, -80531, 155156, 4295, - 303869, 222801, 368293, 21475, -209380, 19327, - }, - { - -1667521, -21677236, 5808407, 3423089, 431107, 277025, -33823, -85899, 3268470, -814970, - -2138894, 1479616, -1475858, 6926709, -6220724, 6735583, -4643934, -713501, 12833899, 895501, - 3255585, -1474784, -1369021, 2585570, -3636227, 3658239, 3070902, -255551, -3577708, 4979478, - 1825898, -6486475, 978716, 1492501, -2206003, -2813741, -2618856, -3167002, -1248225, 1105954, - 658741, -625992, -804770, 3764539, -215285, 141197, -830539, 1392643, 1583232, 2273648, - -46708, 791348, -202400, -277025, -842887, 991064, -176094, 144955, -672699, -727997, - -507343, -384936, 473520, 917512, 665183, -868657, 288837, 78383, -556198, 433792, - -391379, -118112, 73551, 166430, 296890, 4295, 241055, -277562, -382252, 65498, - 13422, 40802, -344134, -44023, -303332, -147640, 311385, 295279, 19864, 18254, - 125091, -257698, -14496, -66035, -63351, 2147, - }, - { - 11935177, -56594784, 1795833, 14442901, 5864778, 1180579, -2581275, -4219806, -5821828, -3341485, - -6913824, -11547556, 1810329, 5468567, -6209449, -4475893, 6046777, -5699422, 21475, 1567663, - -7592966, -3786014, 4939213, -3163780, -2381023, -142271, -1938641, -4308926, 848256, -3920232, - 1038845, 723165, -4643934, 1184874, -217970, -1597191, 3194919, -3441343, 840203, -903017, - -1972464, -1580011, 485868, 2100776, 711891, -256087, 845572, -497142, 367220, -1036161, - -983011, 73551, 122943, 1030792, 915902, -179315, -1445793, -302795, 33823, 1258425, - -940598, -1045288, 628676, 782758, 152471, 759136, 156229, 226560, -642635, 140123, - 470299, 12885, -1652489, 319438, -624918, 615254, -372588, -8053, 161598, -109522, - -352187, -149250, -127238, 519691, -76236, 105764, -214212, 188442, 133144, -328565, - -238908, 258235, -10201, -61203, -54224, 199179, - }, - { - -254477, 17551920, -3111167, -1491427, -1750199, -192737, 20938, -831076, 1284732, -2107218, - 5763309, -2748242, -2733210, 4354560, -2160906, -10411538, -10537702, 4062502, 7510287, -12693776, - 11293080, 730681, 118648, -374736, -3740917, 2164664, 2139968, 1211718, -142271, -3534758, - -1600949, -5313949, -1311039, -3790846, 2654827, 7136088, 4198868, 1439888, 122407, 332323, - 737124, 1937030, 1243930, -944356, -744103, -1822677, -667331, -162135, -668941, -974958, - 822486, 2088965, -357019, -119722, 258235, -1038845, -768262, -854699, -663572, -24159, - 51540, 1462436, 624381, 433792, -253403, 155693, 191126, -150861, 920734, -705985, - -129386, 738198, -339302, -53150, -140123, -299037, -504122, 91805, -88584, 263067, - 104690, 136365, -215822, -128312, 125628, -351650, 226560, 48318, -255551, -125091, - -170188, -93416, -199179, -80531, 194347, 250182, - }, - { - 2974802, -73421392, 9941239, 46668040, 353798, 436476, 1424855, -6222871, 1935957, -2871186, - -1049046, -1755568, 2563022, 1273458, 291521, 1144609, -1384590, 2912525, -2532420, -439160, - -7351374, -266288, -253403, -1817308, -9468255, -1284195, 125628, -2503966, 113817, -3270618, - 1101659, 1391569, -1407676, 3316252, 598611, 3155190, -2798708, 2786360, -1343788, -3454764, - 2126546, -1912334, -2130841, 2607045, 392453, 2404645, 169114, -2011118, -396748, 629750, - -1973001, -2257542, -1133335, -419296, -547071, 1050120, 1756105, -1408749, -83752, -207769, - 455803, 716186, -957241, -614180, -267362, 1089311, 402116, 95026, -438087, -1611, - -63888, -197569, 484258, 472446, -543850, 245350, -428423, 427886, -385473, 325881, - 213138, 277562, 175557, 341987, -70330, 149250, 48855, 283468, 47782, -89121, - 235149, 78383, -1611, 298500, 205085, 351114, - }, - { - -9664, 7756711, 3109556, -4378183, -2589865, 193810, -714038, 346819, -1999844, 465467, - -1930588, 4334159, 3371013, 2906082, -6788733, -11082089, -20312510, -2626909, 10624138, -2196876, - 446677, 3126199, -1185948, 1061394, -4377646, -2473364, -2712809, -8740795, 7905961, -629750, - 1032403, 2435783, 7310571, 3913252, 3212636, -4675609, 1108102, 215822, -600222, 2685965, - -3818763, -395137, 2013266, -1969243, -2035815, 554588, 1143535, 374199, 231391, -1375463, - 1025960, 298500, -699543, 541703, 970126, -1298154, 673236, -1500554, -354872, 1633161, - 255551, 609349, 1138703, 23622, 521302, -1103807, 188442, -185757, 448824, -652835, - 146029, 130460, 123480, 272194, 373125, -590558, -379031, -2684, -17717, 500364, - 642098, -104690, 198105, -537, 255551, 13422, 639413, 359167, -110059, 157840, - 72478, -88584, -35433, -305480, -380641, 154619, - }, - { - 23422068, 7062000, 14412300, 49093624, 1126355, 825707, 807454, -5477694, -5994164, 4233764, - -6172942, 2747169, -4357245, 388158, 4258460, 7960722, -1503239, 319975, -1207423, 2582349, - 2584497, -1859721, 2629057, 1397475, 2725157, -870805, 3221762, 638876, -391379, -3871376, - -1698123, -1211181, 986232, 115964, -743566, -2445447, 2964064, 583042, -386547, 1964411, - 1100049, 1072668, 266825, -382789, 1605781, 1654636, -396211, 2071785, 2734821, -2835215, - 736050, 474594, -159451, 912144, -265751, 1552094, -387084, 57982, -85899, 769873, - 743566, -862752, 887448, 601295, -823560, -67109, 175020, 1042066, 478352, 393526, - -124554, 202400, 273804, 174483, 642098, 39192, -163209, -40265, 241592, -218506, - -525597, -217433, -294742, 34897, -406948, 406411, -88584, -326418, -30065, 242129, - 93952, -235686, -120259, -227633, 47245, 487479, - }, - { - -1549410, 8670465, 5792837, 7372312, -3117610, -4786741, 11842299, 717796, 3583077, -144955, - -2347737, 2021856, -6385543, 4473746, -10779294, 5320391, -1862405, 998043, -5101885, 4064650, - -1657857, -10802380, -5610838, 3386045, -1612760, -6972343, 726386, 2450816, -2381023, -1835025, - 4489315, -1107028, 2407329, -89121, 1312113, -2240362, 1648731, 16643, 1254667, -1809255, - 2442763, 2183991, 1414655, -629750, 28991, -91268, 401579, 137439, -1808718, 1223529, - 1128503, -198105, -807991, -1204738, 505196, -676994, 477278, 509491, -38655, -110595, - -845035, 308164, -148176, 81604, -350040, 161598, 270583, -702227, -49392, 715112, - 121870, 89657, 18790, 345745, 627065, 430570, 66035, 420907, 295279, -254477, - -338229, -27380, 467078, 40802, 261993, 148176, 162672, -166430, -197569, -55835, - 93416, -17717, -333934, -52613, 197032, -133144, - }, - { - -19452444, -4708358, 3044058, -7554311, -1347009, 7254200, -1726040, -8742406, -682363, -5971079, - 3704409, -7453379, 3467649, -547608, 3732864, -4795868, 1564442, -5120138, 5835250, 6470905, - 4907537, -1886564, -1964411, -3430605, -70867, 1364726, 173409, -1986959, -2428267, -2267743, - -477815, 470299, -3665218, -746251, 3843996, -1048509, -1617055, 2313914, 179315, 1452773, - -369367, -1448478, 923955, -408559, 1432372, 95563, 1191317, -550830, 1058173, -161598, - 875100, -2129230, -1485522, -426276, -981937, 638340, -1987496, -789200, -296353, 330176, - 812286, -568546, -205622, -667331, -476205, 53687, -99858, 323733, 812286, -221728, - -194884, -23085, 280784, 6442, 132070, -488553, 186831, -370441, 437550, 250182, - 311922, 87510, 24696, -20401, -203474, -212064, 219043, 479426, -431644, 191126, - -205622, -30602, 154082, 238371, 129923, 25770, - }, - { - -1075352, -28394028, 3246459, 3753802, -7366943, 4603668, -3131031, 503048, -88584, 2648384, - -1788317, -271120, -4497905, 8446590, -4954782, 2869038, -908386, 4808216, 5815923, -2264522, - 2305324, -1609002, 3877819, 882616, 742493, 1673964, -8125542, 3763465, -2510409, -3860639, - -1445257, -1379221, -1941862, 2263448, 2871723, -2733210, 7124814, -3664144, -1005559, -132070, - 2436857, -1947768, -2451353, -887448, -877784, -3174518, -3060164, -1002875, 1380295, -1002875, - 1669669, -848793, 645319, 52613, -1063004, -1403381, 521839, 865436, 96637, 1019518, - -368830, 286152, -588411, -1026497, -432718, 306016, -393526, -276489, -307627, -321586, - -430570, -189515, -481573, -203474, 290447, 1116155, 32749, -135828, -218506, -703838, - 421444, -260382, 3758, -49392, -285615, 206158, -248571, 34360, -147640, 1611, - -183073, 47782, -38655, 289373, -234076, 129386, - }, - { - -23124104, 153413008, -18264348, 6784975, 14489609, -14009646, 6308233, 1181653, -12002823, -7255811, - -3216931, 8703214, 2796561, -4328254, -3205119, 4450123, -403727, 3508988, -8529805, -2107755, - -2506650, 1899449, 2540473, 644245, 134755, 4944581, 3691525, -870268, 4239670, 455803, - -330176, 1228898, 1794760, -1102196, -477278, -1479079, -606127, 3889630, -1884417, 203474, - -351114, 580357, 117575, 1284195, -5167383, 24159, 1146219, 456340, 257698, -345208, - -96100, 427349, 766115, 746787, -1782411, 1283122, 46708, 848793, 34897, 431107, - -363998, -557272, 355945, 504659, 86973, -110059, 200790, 824097, -642098, -366683, - -286152, -671626, 191126, -655519, 367757, -376347, 912144, -251256, -49392, -817654, - -856309, 252329, -4832, -486405, 147103, -184147, -206695, -135828, 19327, -517544, - 340913, 404801, 141734, 127775, 339302, 55298, - }, - { - -3553549, -25572236, 8360691, 7591355, 572841, -1292785, 3831111, 1779190, 4425964, -6077379, - -1869921, 300111, -1230508, 14536317, 13489419, -469225, 2696166, -4749697, -555125, -3106872, - 6113349, 7558606, 3107946, 3297998, -3351148, -204011, 3521336, -8157217, 632434, 2978023, - 171799, 3371013, -673236, 2768107, -2874407, -2223183, 3297998, 78920, 3141769, -47245, - 2633352, -2071248, 905701, -980863, 1801202, 2677912, -2562485, -1294396, 1125818, 130997, - -1437740, 903554, -22549, -2724083, -169114, -71941, -235686, 194884, -1138166, -419833, - 53687, 80531, -1102733, -844498, 1426466, 653909, -198642, 197569, -520765, -133144, - 412854, 513249, -947577, 67109, 772020, 754841, 128849, -252866, -413927, 650151, - -3221, 95026, -64425, 111132, -14496, 448287, -537, 324270, -125628, -278636, - 54761, 53687, -91268, 17180, 167504, -10201, - }, - { - -27358942, 28654412, 1192390, -10802916, 5615670, 6965900, 4683125, 5717139, -4086125, 360777, - -1572495, 6402186, -2930778, -708133, -868120, 4976257, -5259725, 4402879, -4119948, 3719979, - -1721208, -6956774, 893353, 6270653, -4229469, -2222109, 3322157, 3288334, -2151242, 5048197, - -3913789, 2907156, 5324686, -1096290, -1962800, -1620276, 2214593, -2559264, 476741, 2847027, - 1671816, 826244, -1559610, -1339493, -2218888, -725313, -2285996, 95026, -1732482, -257161, - -75699, -437550, -565862, -1510755, -2062121, 335544, -1058173, -690416, -486405, 37581, - 194347, -1218697, 513249, -56908, 415538, -128312, -291521, -120259, -973347, -213138, - 1004486, -102005, -119185, 344134, 692564, 157303, -270046, 2684, 469225, -222265, - 601295, 641024, 31675, -39192, 775242, -204011, -114890, -105227, 66035, -11274, - -255014, -41876, -279173, -95026, 103079, -11274, - }, - }, - { - { - 1120987, 8665633, -11523934, -8941585, 5273146, 2800856, 2686502, 1625108, 6049999, -2556043, - 3321084, -4388920, -7686381, -7647726, -4554813, -6500433, -14333916, 966368, -7102266, -2036351, - -910533, 714575, 6942278, 621697, -1624571, -2747169, 858993, -2159832, 3174518, 3917547, - -1624571, -8754754, 500901, -4066260, -2859911, 6212670, 3406983, 8442295, 2762201, -2249489, - 748935, 958315, -2920041, 692564, 2852395, 790274, -2463164, -857383, -656056, -125628, - 775242, 2670396, 923418, 463856, 795643, 309238, 537, 1716913, 1161252, -1251446, - 82678, -909459, 187905, -732829, 650151, 1072131, 392453, -190052, -780610, -121333, - 412317, 108985, 245350, 265214, 119722, -827855, -324270, -13959, -113280, -142808, - 20938, -54761, 214748, -33286, 150861, -36507, -104153, -214212, -105764, -300648, - -394063, -26307, 216359, 411780, 13422, 16106, - }, - { - -3559991, -43344272, -9321690, -17828410, 7256884, 135291, 1389422, -313533, -1370095, 4440460, - 3991098, -14030048, 2590939, -1250909, 5376226, -6965900, -800475, -4399657, -8866423, -928787, - -2147484, 1822677, -2238215, -2063732, -1230508, -1781338, 1161789, 2653753, 66572, -1015760, - 594853, 9045201, 1402307, -2488397, -3435437, 4963909, 64961, 1744831, -199179, 1727651, - -1435593, -4440460, -651761, -911070, -1020055, 1177358, -701153, 1467805, -281320, 1784559, - 479426, -25233, -806917, -840203, 2155537, -466004, 639413, 2854006, 1561758, 3758, - -120796, -90194, 264141, -209380, -68719, 144418, -236223, -432718, 535260, 141734, - -697932, -130460, -252866, -11274, 112206, 47782, -666794, 579821, 418222, 96637, - -120796, -226560, -32749, -185220, 107911, 124554, -354335, 335544, -234613, -326954, - -88047, 101469, 8590, -30065, 78920, -9664, - }, - { - -135291, 53624276, 7070590, -48777944, -693637, -1789391, 63351, 612570, 1841467, 2849711, - -5363341, -2856690, -5196374, -679142, 5987185, 6046240, 2546916, -108448, 707059, -3048890, - 412854, -12671764, -7226283, 1079111, 1553168, 4597226, -1556926, 2756832, -2752000, 426276, - 387084, 2940979, -5257040, 3882651, -1428077, -100395, -155156, 790811, -4509716, 669478, - 5906, -29528, 47245, 566399, -1672353, 632434, -453656, -1365263, 692027, 2592013, - -412854, 942745, -355409, 1995012, -780073, -557272, -686658, 512712, -2190433, 50466, - 143345, -557809, 332860, -1219771, -1601486, 504659, -13959, 297427, -376883, 742493, - -43487, -228170, 619012, 791348, 573915, -600759, 27380, -487479, 155156, -370978, - 184684, 77309, 601295, 95026, -86436, 526134, 180926, -113817, 213138, 5906, - 252866, -51003, -20938, 54224, -150324, -55835, - }, - { - 1373853, -33123324, -6332393, 337155, 294205, 780073, -861678, -690953, 2680597, -2743947, - -2075006, 3712999, -6245420, -1226750, -14569603, -4944044, -7692824, 4538707, 7160784, 3526705, - 4653060, -3542274, 1334124, 6847252, -866510, 1326071, 1423782, 1046898, 449361, -274341, - -6023155, -5152350, 5003637, 3368328, -481573, -508417, 3620658, -1136556, 608275, 1493038, - -340376, -1473174, -3320547, 1565516, 408559, 1445257, -51540, 885837, 2064806, 1928977, - -301185, 1804960, -123480, -661962, -756451, 1436667, 22012, 35433, 44560, -168577, - -31139, 27917, -151398, 492311, 713501, 367220, 544387, 321049, 533650, 593779, - -578747, 158377, 127775, 51003, 100395, 6979, 540629, -1074, 237297, 616328, - 282394, 300648, 18254, 413927, 143881, -193810, -53687, 99321, 97174, 219580, - 135291, -247497, 86436, 153008, 36507, -109522, - }, - { - -439160, -113562696, -18185428, 7849053, -4895726, -224949, -1620276, 1548873, -1467268, 4125853, - -1165547, -4881767, 3555159, -3578782, -12793634, -7943542, 3325379, -6990596, 8367133, 11772505, - -5274220, -1598802, 1788317, -8187282, -3476239, 1268089, 4546223, -755914, 3067681, -3796751, - -2554432, -1409823, -1105954, 3087545, 76236, -148713, 5209796, -4143033, -64425, 1216550, - 535797, -406411, 427886, 3273839, 199716, -2483565, -788663, 4295, 13959, 155156, - -2029372, -1884954, -230854, -869194, 183610, -392453, -483721, 263604, -825707, 547071, - -583579, -1040456, 810675, 1348083, 422517, 361314, 161061, 27380, -1667521, -1000191, - 321049, 297963, -899796, 504659, -972810, 567473, -546535, -303332, -37581, 117038, - -545461, -827855, -554051, 327491, -154082, 59056, -578747, 109522, 87510, -268435, - 198642, 137439, -452582, -339302, -1611, 204011, - }, - { - -616865, 16970490, -1472637, -1110786, -672699, 151398, 293132, -260382, 1341640, -2545305, - 6144488, -2072322, -705448, 10017474, 4064113, -2824478, -4993973, -1293859, 3697430, -18333068, - 10330470, 7023882, -514859, -6630356, -2239826, 3108483, -1303523, -2646774, 266825, 1081795, - -1041530, -2531883, 2762738, 1501091, 5535676, 5881421, 2923799, -113280, 1319629, 2656437, - 1321239, -547608, -795106, -607738, 275415, -1159641, -234076, 357556, 937914, -424128, - -1074, 380641, -673773, 428960, 521839, -418759, 115427, -1425929, -746787, 3758, - -208306, 573915, -790811, 117038, -10737, 446677, 597000, -163746, 909996, -1125818, - -902480, 380641, 20938, -353798, -852014, -678605, -205085, -33286, -346819, 34897, - -387621, 27380, 17180, -275415, -63888, -187368, 405338, 199716, -330712, -219043, - -537, -88047, -527207, -62814, 339302, 538482, - }, - { - 20897164, -69663296, -11171747, 40984724, -1803886, 960999, 2746632, -5581310, 3121904, 4671851, - 6661495, 6140730, 4450123, -158914, -1283122, 2234457, -1131187, 1101122, -1919850, -786516, - -5867462, 2119566, 2328946, 2162516, -2243047, 2223183, 749472, 2101850, 3500935, -3151969, - 294205, 333934, -4184372, 1234266, -96637, 1737314, -481573, 3900367, -1623498, -1189169, - 4539781, -1628330, -3343632, 674310, -149250, 1130113, 1286880, -374736, 889595, 602369, - -2268280, 529355, 314069, 1176284, 187368, 445066, 892816, -1431298, -8053, -537, - 636729, 386010, -1367410, -869194, -964757, 285615, -302258, 34360, -745177, -250719, - -143881, -577136, 69793, 107911, -164283, 556198, -710280, 209380, -207769, 687732, - 227633, -312996, -37044, 230854, -544924, -66572, -57982, 139050, 266825, 134755, - 83752, -188442, -115964, 113817, -227633, -42413, - }, - { - -1143535, -4924717, -95563, -155693, -795106, 374199, 170725, 1618129, -2150705, 1273995, - 573378, 6412923, 2906619, 3076270, -6153615, -1764158, -5457830, 6104759, 3552475, 2865280, - 11567958, 163746, -4304094, 4898947, -2494302, 1280974, 3346853, -154082, 8699456, -8022462, - -1606318, -4299263, 1899986, -658741, -309775, -3949223, -1473711, -1607928, 1096827, 3560528, - -3148748, 441845, 3445101, -1549946, -1144072, 3222299, 2571075, 1311039, 2102387, -264677, - 131533, -401579, 323733, 2398739, 2020245, -439160, 1484985, -1566053, -1433982, -403190, - -1054415, 379568, 649077, -604517, 581968, -1123134, 209380, 340376, 228170, -555661, - 901943, 469225, 73014, -192737, 325344, -762894, -332323, 427349, 392453, -211527, - 191663, -185757, 46708, 164819, -32212, -260919, -193274, -212064, -174483, -3758, - 63351, -34897, -140660, -151398, -321586, -119185, - }, - { - -24229522, -110183624, -23643794, 40080636, -4096862, -1216550, -1666447, -4618701, -7311108, 778463, - -10906533, 5441724, 3292629, -4821101, -9859097, 647466, 2591476, 3578245, 2552284, 522912, - -2391760, -3613678, 2677912, 829466, 982474, -2604898, 2671470, -103079, 238908, -1460826, - 957241, -1213328, -2780455, 234076, -151934, -1068373, 5428839, -896038, -3122441, 2602213, - 2266132, 1502702, -1376537, -103616, 137439, -1574642, -459562, 3535295, 2804614, -2653753, - -955093, -1688459, -972273, 735513, -673236, -280247, -205622, 819265, 803696, 940598, - 1103270, 229781, 821949, -289373, -1058710, -222265, -66572, 853088, -137439, 91268, - 397284, -226560, -85899, 325344, -107911, -534187, 537, 147640, 28991, 129923, - 7516, -84826, -341987, 256624, 8053, 293668, -176631, -337692, 262530, 208843, - 26844, 83752, 231391, 11811, 124554, 423591, - }, - { - 1316408, -12787191, -22057342, 2247342, 4482872, -6489696, 7706245, 2621541, 3535832, 1757715, - 2361158, 7729868, -1785096, 8321499, -12693776, 6647536, 5947456, -5409512, -17843978, 3905199, - 7787313, 5654325, 143345, 1376537, -3736085, -4675072, -4710506, -2685965, 785442, 3198677, - 8520678, -1546725, 2698850, 2605435, -215822, -5684926, -422517, -2933463, -67109, -1709934, - 907312, -1322313, 1372779, 2804077, 668404, -26844, 401043, 55298, -648003, 2998961, - 1565516, 1093069, -476741, -2322504, 128849, -594316, 1374390, 938450, 891206, 836982, - -257161, 493921, 28454, 133681, -361851, -175557, -37581, -1428077, -344671, 620086, - -302258, -206158, -180389, -670015, -292058, -281857, -296890, 400506, -63351, 157303, - 319438, -341450, -33823, -282931, 190589, -338766, 56908, 12885, -6442, -173946, - 152471, 202400, -155693, 76236, 171262, -136902, - }, - { - 18603650, -21329882, -46880104, 1937567, 178778, 3422552, 11800960, 441845, 5418101, -814970, - 7174206, -7517267, 766115, 2756832, 10914049, -695785, 4874788, -5517959, 3625489, -362388, - 987843, -1559610, 232465, 602369, 1516660, 57982, 1358820, 3259343, 2588255, 820876, - 428423, -319438, -3475166, 416612, 874563, -1959042, 42413, 1440425, -1527935, -1176284, - -2363306, -1012002, 1858110, 1141388, 1776506, -823560, -215822, -1018981, 1107565, -2179696, - 686658, -95563, -1267552, 700080, 923418, 1036698, -857383, -496606, 748935, 500364, - 107374, -412317, 234613, 292595, -1260036, -210453, -457951, -304943, 703301, 317828, - 442382, 189515, 307090, 52076, 511638, -207232, 344134, 162135, 669478, 278099, - 142808, -238371, -202400, 2684, 246424, 144418, 348966, 435939, -249108, 336618, - -263067, -113280, 23622, -53150, -61740, 3758, - }, - { - 666794, -39666708, -9201967, 14305999, 3277597, 6941741, -4547834, -1307818, -1653562, 2838437, - 882616, 3735548, -2652142, 5886253, -5986648, 9349070, 470836, 3754875, 4168803, -4066797, - 6673843, -7410429, 3940096, -1264868, 2214593, 2897492, -6528887, 773094, -4516695, -4085051, - -1814624, 1040993, -875100, 424665, -1045288, -6012954, 5091147, -2673617, 3569655, -694174, - -1282585, -2546379, -192200, 206158, -135828, -208306, -846109, 152471, 1578937, -1821066, - 1178969, -1581085, -638340, -460635, -289910, -1533840, -459562, 440234, 657667, 1116155, - -360240, 202937, -258772, -502511, -80531, 567473, -149250, -538482, 102542, -692564, - 492848, 1396401, 152471, 290984, 140660, 711354, 27917, -283468, 35970, -214748, - 45097, -306016, 252866, -165893, -122407, 275952, -215822, -128312, -310311, 55835, - 71941, 440234, 92342, 131533, -302258, 116501, - }, - { - -4918275, 168472784, -39914740, -404801, 11804181, -12491376, 686121, -6473590, -9031779, -2654827, - -7154342, 1549410, -994822, -4190814, -3620121, 7564511, -2752000, -110595, -6150393, -1769527, - 2272038, 5346698, 949188, -2358474, -4981089, 1656784, -1872069, -343061, 6579353, 168041, - -293668, 2625836, 4594542, -340376, -4221416, -474057, 2217814, 2483028, 555125, 2089502, - -932545, 1100049, 77309, 1377611, -2864743, 544387, 942208, 821413, 554051, 190589, - -475131, -1979443, -1333587, -1896228, -2479270, 1949378, 34897, 1162862, -404264, -18254, - -589484, -1236414, -617938, -521839, 122407, 960999, 623307, 273267, -275952, 878321, - 647466, -161061, 785979, -835371, 567473, -341987, 542240, -605590, 451508, -395674, - -124554, 347355, 118648, -435939, -93952, 230318, 462246, -177167, 155693, -540092, - 133144, 30065, -164819, 202937, 364535, 120796, - }, - { - 3112241, -26804354, 708670, 4405026, -3481608, -4100620, 1281511, -1474248, -752693, -3802120, - 1792612, 3029563, -2211371, -16374026, -16719234, 3096135, 5332739, 2943126, 8511551, 773631, - 5981279, 1445257, -4351339, 2582349, -4480188, -6354941, 1117765, -11485816, -164819, -487479, - 685047, 882616, -4510790, 3043521, -1648731, -1561758, 1309965, -2688650, 2010045, -123480, - 5215164, 98247, 1880122, 834297, 2225867, 1462436, -1553168, -161061, 820339, -32212, - -1465658, 1045288, 79457, -891743, 1233729, 758062, -224412, -113817, -24159, 894964, - 913754, 12885, -508954, -374736, 424665, 717796, -450435, -505732, -199179, -56908, - 290984, 777389, -572841, 623844, 840740, 103079, -535797, -977105, -740345, 353261, - -413927, -35970, 251792, -134755, -329102, 204548, -265751, 65498, 57982, -278636, - 3221, 1074, -140660, 24159, 133681, -78383, - }, - { - 14681272, 77221904, -7211250, -9825275, 5228586, 4090956, -1024887, 1485522, -3279745, -1308891, - -3479997, 6196027, -653909, -10241886, -22996328, 3135326, 3635690, 2307471, -10612327, -2611340, - -4754529, -5090610, -1493575, 1330903, -3326989, 4302484, 1952063, -1754494, -7526930, 3923990, - -4497368, -2771328, 406948, -1040993, -2196339, -2544768, 2907693, -3330210, 579821, 2461553, - -78920, 1233729, -1131187, -1226213, -3063922, -2172717, -3444564, 720481, -1100049, 1075889, - 1785096, -686658, -893353, -1582159, -783832, 1313186, 565325, -103079, -287763, 541166, - 867583, -828929, 724776, -680752, -726923, 311922, 402653, 150861, -135828, -418222, - 645319, -585189, -1046898, -101469, 514859, 8590, -303869, -135291, 682363, -167504, - -322123, -398358, -99858, -268435, 339839, -501437, -630823, -427886, 153008, 224949, - -5906, 127238, -31675, -10201, 37581, 8590, - }, - }, - { - { - 525060, -25992606, 15164993, -184147, 403190, 497679, 4446902, 2621541, 4685810, -392990, - 2867428, -7828652, -7895224, -2151242, -5872294, -7700340, -8789114, -7613367, -1892470, -2870112, - 6830072, -745714, 4258997, 2541547, -10635950, 2797098, -1771674, -3200288, 2238215, 4878546, - -4570382, -4312684, -1058710, -5824513, 1410360, 5251135, 1905355, 8746164, 2643016, 478352, - 1145683, -737661, 401043, -1246077, 935229, 963683, -2111513, -2490544, 1059246, 1403381, - 1566053, 957778, 507880, 1265405, -482647, 1258425, 224412, 595927, 1385664, -196495, - -485331, -1547799, -157303, 794569, 141734, 499290, 59593, 164283, -461709, -259309, - 468151, 218506, 314069, 551903, -830539, -385473, -532039, 271120, -308701, -163209, - -150324, 338766, -185220, 31139, -314069, 46708, -63351, -379031, 246424, -134218, - -395674, -127238, 219580, 475668, 190589, 121870, - }, - { - 9494562, -103414760, 27251030, -1721208, -3601330, 1901060, -1377074, -97174, 731755, 3515968, - -2192044, -3660386, -2369211, 594853, -2661806, -4580583, -1435056, -3620121, -5542119, -5381057, - 1275068, -3752191, 2203855, -577673, -2975876, -1010391, -871342, 6014565, -737124, -1726040, - 1511829, 6983617, 4596152, -6276558, 2368675, 609885, 2177012, 443992, 1071058, 2552821, - 11811, -6288369, -1861868, 489089, -290984, -591095, 1662152, 1518808, -10201, -11811, - 1981054, 328565, -1235340, -1468879, 1648194, -260382, 1802813, 609885, 1426466, 681826, - -1068373, 680215, 288300, -527207, 277562, -190589, 73551, -595390, -358093, -30602, - -104153, 359167, -253940, -939524, 453119, 355409, -637803, 628139, 39192, 428423, - 27380, -373662, -117038, -67646, -39728, 11811, 66035, 239981, -164819, -315680, - -145492, 129923, -5906, 19864, 120259, -47782, - }, - { - -2283849, 89398136, -7417409, -30775588, -18985902, -1216550, 939524, -875100, 1708860, -2383707, - 2873333, -7059316, 484794, 2597918, -732292, 4529043, 4117263, 3077881, 1161252, -1102196, - 1479079, -7248831, -7518877, 3286724, 1330366, -1720134, -1223529, 517544, 474057, -1546725, - 3779571, -1801202, -1255204, -1908576, 1292785, -2886755, 4082903, -1333051, -2797098, -1707250, - -772557, 1022739, 321049, 47245, -2092723, 1556926, -858993, 24159, 865436, 916439, - -560493, 497679, 1347546, 1157494, -319975, -1202054, -151934, -899796, -744640, 453119, - -512175, -140123, -759672, -1030792, -1462436, 110595, -200790, -147103, 100395, 277025, - 163746, -23622, 519691, 843961, -175557, -105227, -177167, -505196, -114890, 216896, - -89121, 183073, 523449, 273804, 112743, 275952, 223875, 44023, 139586, -137976, - 241592, -139586, -68719, -40802, 280784, -128849, - }, - { - -519154, -39882528, 3120831, -2771328, 1270774, 351650, -795643, 10201, 1089848, -1105417, - -2056216, 5456756, -4704063, -9461813, -14070850, -4504347, -1595044, 6204617, 2378338, 6132677, - 372052, -3196530, 8259222, 796180, 1881196, -2204392, 4384088, 426276, 2163590, -3220152, - -5573257, -558883, 1505386, 2975876, 642098, -3886409, 6265821, -1640678, 3091303, -809064, - 769336, -1605244, -1580011, -213675, 942208, 696858, 2215666, -1500017, 2628520, 471373, - -107911, 1413044, 872952, -1111323, -300648, 1573569, -117038, 177704, -547071, -213138, - 185757, 811749, -936303, 649614, 558883, 576599, 124017, 141734, 969052, 14496, - -77846, 285078, 58519, 346819, 18790, 381178, 85899, 304943, 461709, 348966, - 401579, 212601, -153545, 583042, 154082, -151934, -137439, 43487, 5906, 212601, - 67646, -63351, -28991, 59593, -26307, -131533, - }, - { - -15248745, -149736512, 19799262, 1854889, 3755412, -2884608, -35433, 2715493, -219580, 6529961, - -1705102, -1786170, 428960, 1273995, -18023830, -3100430, -4249334, -2552284, 9659918, 7628936, - -494458, -3354370, 3716757, -8365523, -4959077, -1770600, 7159174, -3347390, 5630166, -3863323, - -3054259, -1821603, 3673808, 1498407, -1810866, 853088, -1469953, 3322694, 425202, -900333, - 858993, 1183264, 208843, 1698660, 716186, -644782, -2084133, 1266479, -1174137, 1927904, - -2091649, -2727304, -913754, -1477469, 1050656, 518080, -229781, 363462, -411780, -567473, - 250719, -770410, 1044214, 1013612, 51003, 144418, 543313, 411243, -1468879, -1126892, - 599685, -597537, 625455, -32749, -572304, -390842, -199179, -269509, -456877, 339302, - -510027, -1037235, -489626, 48855, 126165, -137976, -404801, 154619, -161061, 10201, - 539555, -198105, -367757, -268972, 81604, 32212, - }, - { - 316217, 3077344, 7365869, -2625299, 635655, 573378, -63888, 356482, 1192390, -154619, - 2870112, -2309082, -2836289, 7640210, 6587943, 2416993, 140660, -3352759, 1635309, -11898670, - 4436165, 5304285, 2558190, -13775571, -3893925, 11630771, -3234110, -1999844, 2134599, -792958, - -4540318, 3833258, 1379221, 3062312, 5413270, 3412889, 1359357, -2796561, 2779381, 4483946, - -704912, -1057099, -87510, -430034, 1148367, -35433, -805306, -337155, 1399623, 336618, - -834834, 645856, -1700270, 954557, 484258, -1741072, 648540, -281857, -1158031, -934692, - 1420560, 209917, -705985, -392453, 948114, -85362, 625992, 118648, 342524, -738198, - -497679, -108448, 308164, -740345, -680752, -790811, 200253, -379031, -241055, 278636, - -491774, -341987, 415538, -370441, -54761, 66572, 245887, 214212, -140123, -485331, - 263604, 31139, -651761, -176631, 409633, 294205, - }, - { - -39411156, -28177132, 20963736, 30373472, 2283312, 3472481, -1940252, -302795, -5105106, 7910793, - 8443906, 8431021, 2628520, -4180614, 4387846, -302795, -1981054, -590021, 104690, -3015067, - -821413, 1515587, -243739, -2099165, 7023882, 2196876, 1803349, 3310346, -1870995, 2238215, - -1242856, -2609193, -1568200, -240518, 796716, -858993, 4189741, -2661806, 1739999, 822486, - 1570884, 447213, -4830228, 139586, 2506650, -351114, 111669, 1151051, 605590, 126702, - -567473, 79457, 1843615, 801548, 72478, 60666, -124554, -167504, -782758, -159451, - -134218, -689342, -261456, -233002, -921807, -83752, -232465, -652298, -327491, -319975, - -519154, -524523, 644245, -664646, 387084, 359167, -324807, -113817, 357019, -102542, - 254477, 77846, 30602, -309238, -323196, 39728, -5369, 110059, 394600, -128312, - 161598, -252866, -54224, -205622, -19327, -268972, - }, - { - 124554, -14337138, 1078037, 3406446, -390842, -966368, 243739, 500901, 1052804, -637266, - 2674154, 8018167, 436476, 4035122, -10681584, 5869610, -1527398, 3433826, 1127966, 11957189, - 3608846, -453119, -3409667, 4443681, -373662, -1364189, -1866700, 9890773, 4306779, -5551782, - 877247, -2416993, -1409286, -1131187, -3738232, 3258807, -2275796, -1184874, 2510945, 767725, - -1278290, -973347, 2909840, 245350, -637266, 2109366, 1118839, 1731409, 2901251, 620623, - 307627, -1304596, 848256, 1543504, 896038, 971200, 1166621, -1960116, -1185411, -78383, - -740882, -1186485, -418222, 809601, 12348, -101469, -292058, 142808, 55835, -630286, - 1190780, 322123, 449898, -495532, 363462, -775242, -497679, 193274, 621160, -45097, - 4295, 37044, 75699, 499827, -424128, -86973, -535797, -55298, 46708, -235686, - -245887, -44023, -158914, -47245, -93416, -179852, - }, - { - 13874355, -213935536, 14082661, 22922778, 7787313, -179315, -7261179, -2696166, -5468030, -756451, - -9328669, 5922223, 865436, -690416, -3626563, -5771899, 5954436, -284005, 288837, 868657, - -1685238, -1720134, 1121523, 2711735, -938987, -1511292, 1273995, -157303, -4295, 44560, - 2845953, -3148748, -1641214, -2746095, 791348, 3007551, 1842541, -680215, -3595425, 2388002, - 3587908, 1813013, -2801393, 836445, -621160, -3177739, 371515, 2343979, 779000, -271120, - -2828236, -1116692, 461709, 257698, -607201, -2250563, 1162862, 1285269, 82678, 1059246, - 820876, 1026497, -496069, -258235, -205622, -163209, 18790, 226560, -250719, 155693, - 584652, -456877, -484794, 409096, -425739, -331249, 426276, 2684, -382789, 322123, - 347355, -71404, -309775, 62814, 498753, 345745, -127238, -349503, 20401, 188979, - -98784, 175557, 317291, 390305, -11274, 5369, - }, - { - -795643, -35422744, 6140193, -7712688, 8740795, -1025960, -3184718, 2994666, 1668058, 3363496, - 7567196, 7325067, -923955, 2796561, -3995393, -1877438, 9011915, -7926899, -14622753, -1065152, - 7372848, 16620987, -3642132, 2537789, -4697084, -11039677, -1798518, 2109366, -3288334, 6278706, - 4268124, -399432, 1150514, 2515240, -2241973, -5152350, -2214056, -383326, 1171452, -1869385, - 1279363, -2101850, -1013612, 4143570, 2273112, 632971, -3041911, 132607, 1779727, 2625836, - 209917, 1654636, -1620276, -571768, -646393, -290984, 1206886, 1604707, 1440425, -365072, - 729071, 297427, -366683, -308164, -144418, 279710, -704375, -735513, -484794, 0, - -40802, 63351, -514322, -388695, -659278, -492848, -419833, 708133, -58519, 167504, - 408559, -308164, -272730, -229244, -207232, -463856, 188979, 41339, 220654, 158377, - -293668, -61740, -41876, 192200, 144955, -220117, - }, - { - -18945100, -47771312, 12080669, 8652748, 3250753, -7913477, 11435887, 4187593, 1334124, 8104067, - 1004486, -1299228, -2749853, -1843615, 12070469, 3375308, 1525250, -2675765, -972273, -1696512, - 735513, 386547, 1053341, -1236951, 2910914, -3266860, 2328409, 1640141, 4564477, 1423782, - -1925219, 458488, -1507534, -913754, 34360, 362388, 1032940, -328028, -531502, -2360622, - -2303176, -1051193, 2871186, 1210644, -739808, 1876901, 193274, -659278, -1378148, -489089, - -214748, 793495, -262530, -192200, 738734, -547608, 1733556, -789737, 855772, -181999, - -1111860, 971200, 303332, 664109, -1551557, -852551, 105227, -227633, 274878, 672699, - 322123, -68183, 371515, 175020, 190052, 128849, -281320, 694711, 539555, 212064, - 80531, -39192, -185220, -116501, 73551, 262530, 236223, 206158, 44560, -105764, - 2147, -84826, 537, -42950, -156229, -199716, - }, - { - -86973, -32603096, -7635915, 9131100, 8239358, -1336809, -762894, -3536369, 1603097, -1984812, - 3335042, 8138426, 3170223, -8920647, -513249, 8930311, 4441533, 591632, -296890, -133144, - 2349347, -3940096, 5072357, -4143033, 5156108, -5945846, -858993, 757525, -2917357, 275952, - -5432597, 2576444, -1111860, 692564, -3155190, -2106145, 335007, 121333, 4072703, -1893544, - -4849018, 823023, -474057, -1689533, -525060, 1780801, -453656, 1202054, -1140851, -660888, - -95026, -510564, -381178, -1473711, 1350767, -2389613, -637266, -18790, 2163590, 494995, - -222801, 179852, -638876, -628676, 766115, -76773, 286152, -389231, -360777, -46171, - 289373, 1844689, -412854, 580357, 81604, 380641, -537, -5906, 265751, -258772, - 29528, -643708, 648003, -201327, 3221, 416612, -453656, -165356, -216896, 66572, - 129923, 162135, 57982, 34360, -32212, -88584, - }, - { - 26305064, 111772768, -16186121, -5039071, 5713380, 118648, -13638669, -1661616, -8938364, -3037616, - 2042794, -4610648, -28991, -1395864, -2983392, 2435247, -3119220, 4763119, -4648229, -1980517, - -675921, 7780870, 1035087, -4532264, -7416335, -253403, 1368484, 1195075, 2572686, 970663, - 2971581, -1315871, 4608500, 2024540, -6853157, 3071439, 1207423, -3748970, 4198868, 61740, - 528281, 1619740, 3896072, -2579665, -1126892, -263067, 1127429, 1139240, 875100, -126165, - -2142652, -996432, -2639794, -2432562, -258235, -316754, 151934, 1521492, -169114, 373662, - -814433, -766115, -870805, 47782, -374199, 709743, 608275, -83215, 74088, 982474, - 543313, -402653, 1364189, -530428, -116501, 338766, 207232, -696322, 399432, -289910, - -76773, 254477, 2684, -372588, -134218, 290984, 437013, 30602, 197032, -91268, - -344134, 98784, 104690, 89657, 170188, 230854, - }, - { - -2341831, -21883396, 4880694, 916976, -2649458, -708670, -354335, -651761, -6228240, 2312303, - 258235, -122943, 2730526, -25269440, -4351876, 9526237, 1233729, 2843268, 11525545, -6649683, - 7754564, 2310156, -5663452, -2624762, -3766686, -2320893, -4641249, -6754373, -1016297, -4483409, - 5448703, -1883880, -3307125, 2202245, -3692598, 286152, 1971927, -2764885, 2670933, 1164473, - 2270964, -37581, 1437203, 2449742, 766115, 32749, 159988, 493921, 1360968, -824634, - -938450, 362925, -678068, 804233, 922881, 260919, -713501, 771484, -322123, 677531, - 1521492, -657130, 38118, -122943, -294205, 695248, -374199, -787053, 129923, 347355, - -59593, 389231, -124017, 723165, 524523, -307627, -382789, -1088774, -240518, -53687, - -356482, -282394, 532576, -244813, -52076, 190052, -255014, -47245, 81068, -114890, - -221728, 16643, 11274, 17180, -63351, 86436, - }, - { - 2677912, 85435488, -1120987, -4849555, 2034741, 1449015, 1080721, 1772211, -4367445, 4384625, - -2886218, -4662724, 7262253, -8436926, -24400246, -859530, 12377559, -110595, -6871948, -9057012, - -3331284, -842350, -2495913, -1284732, -2555506, 8017630, -309775, -5404680, -3937948, 1155883, - 999117, -4740034, -3941169, -1176284, -2358474, 479963, -359167, -711354, 1571421, -153008, - 803159, 2218351, -2349347, -2024003, -2680597, -1760400, -1038845, -670015, -964220, 865973, - 719407, 1308354, -177704, -2285996, 701690, 27917, 312459, 854699, 402653, -37044, - 387621, -620086, -172336, 252329, -841814, 816581, 170725, 198642, 330176, -357556, - 274341, -548682, -597000, -491774, 169651, -199716, -41876, -19864, 303869, 304943, - -366683, -843424, 170725, -286689, -322659, -372052, -701690, -344671, 122407, 372588, - 134218, 35433, 128849, -236760, -70330, -141197, - }, - }, - { - { - -1444183, -61152820, -4096325, 5303748, 299574, -909996, 3486977, -993748, -290984, 2561948, - 4019553, -3469260, -2574833, -4629438, -2587718, 7293392, 1459215, -2292976, 12981002, 5454072, - 1364726, 111132, 2506650, 4561256, -5450851, -4541928, -8320963, -3967476, -2559264, -7099044, - -6070937, 3979287, 4043712, -1022739, 412317, 570157, -731755, 4471598, 1017370, 608812, - 653372, -1898376, -728534, -1911797, -97174, 392453, -585189, -993211, 3196530, 1649804, - 879395, 455803, 152471, 619549, -734439, 544387, -832687, -1052267, 794032, -301185, - -1204202, -629750, 551366, 188979, 153545, 67109, -768799, 219580, 171799, 56371, - 287226, -86436, -210453, 183073, -688269, 576063, 91268, 907312, -23085, 178241, - -56908, -76773, -285615, 225486, -293668, -20938, 6442, -449361, 231928, 239981, - 253403, 146566, 31139, 80531, -26307, 175020, - }, - { - -13082470, -180136304, 5481989, 12925704, 3625489, -406948, -2146947, -309775, -4131759, -4857071, - -9632001, -3658239, 1422171, -1490354, -10346039, -5722507, -4378719, -889058, 2837900, -1837172, - 1464047, -4064650, 4176856, 1039382, -3731790, -990527, 1567663, 5818607, -473520, 1366873, - 650688, -186831, 2186675, -806917, 2930242, -1536525, 3480534, 1312649, 1958505, 3495030, - -279173, -3180423, -143881, -340913, -99858, -1825361, 942745, 459562, -107911, -78383, - 2417530, 1999307, 848256, -2226404, -244276, -246424, 1347546, -1445257, -316217, 624918, - -1248762, 25233, -96637, -657130, -181462, -966368, 407485, -348429, -522912, -145492, - 256624, 579284, 194884, -541166, 59593, 621697, -258772, 79994, -185220, 542777, - -134755, -284542, -44560, -56371, 191663, -90194, -13422, -31139, -110059, 103616, - 66572, 265751, 133144, -61740, 14496, -85899, - }, - { - 4992900, 132666704, 24612846, 2901251, 5644661, 2042257, 2002529, -1284195, -2849711, -5880347, - 2304250, -6046777, -2195802, 984621, 627065, 2921652, 5358509, 2637110, 2113661, 3648038, - 4272956, -60130, 3806415, 8055748, -3364570, -2359011, -1772211, -3218004, -1457068, -3523484, - 737661, -1102733, 485331, -4537633, 558346, -2235531, 3246459, -824634, 89657, -3115999, - -1889249, 1082332, 883153, 1704028, -751082, 1505923, -377957, 1346472, 663572, 486405, - -845572, 602369, 1678795, -622770, -1570347, -242666, 1384590, -748935, 476205, 2006287, - -144418, -124554, -563714, 641561, 268435, -220654, -801011, -545461, 307627, 29528, - -126702, 378494, 456877, 147640, -836982, -34360, 61740, -15569, -13422, 153008, - -143881, 106837, 328028, -55298, 25233, 70867, 38655, -115427, -98247, -192737, - 177704, -255551, -99858, -38118, 381715, -100395, - }, - { - -471910, -38225744, 4778151, -3633006, 222801, 231928, -126702, 64961, -248571, -1741072, - -1701881, 7125888, -2371896, 2988760, -3833795, -7668127, -2568391, -1947768, -7421167, 1557999, - -5506148, -9083319, 6189048, -2301029, 3701725, 110595, 4055523, -27917, 947577, -5427228, - -335007, 3617436, -925565, 3313031, 358630, -4945655, 3111167, -1970853, 2865280, -2141578, - 1736777, -329639, -558346, 106837, 1431835, 1435593, 2471754, -2771865, 38118, -1680406, - -1091995, 456340, 759136, -716186, -526670, 1184337, -243203, 540629, -227096, -659814, - -871878, 55835, -1293322, -25233, -142271, -66035, -463856, 252866, 571231, -404801, - 177167, 51003, -145492, 461709, 22012, 250719, -56908, 249108, 134218, -49929, - 271120, -30602, -838056, 262530, 209380, -105764, -231391, -130997, -193274, 41876, - 119722, 16106, -28454, 12885, 14496, -150861, - }, - { - 31093952, -134768016, -11723650, 2530273, 883153, -1386201, -273267, 2661269, -1644436, 2985539, - 5845451, 8718784, 1623498, 3256122, -12329240, -199716, -4382478, -7036230, 676457, 2299955, - -257698, -2273648, 4668630, -4234301, 142808, -951872, 612033, -8230768, -283468, -4119948, - 530965, -2063732, 1322313, -1880659, -4670777, 308164, -8489003, 715649, 3379603, -2892124, - -2304787, 2507187, 373125, 395674, 4006668, 3163244, 955630, 4409858, 124554, 928250, - -291521, -115427, -39728, -12348, 1435593, 670015, 513249, 1179505, 384400, -291521, - -17717, -551903, 1034013, 501437, -491237, 729608, 753767, 952409, 80531, -25233, - 813896, -415538, 647466, -442382, -432181, -557809, -359167, -455803, -419833, 136365, - -486942, -102542, 113817, -214748, -94489, -43487, -156766, 92342, 25233, 86436, - 383863, 73014, -169114, -104153, 181999, -7516, - }, - { - 557809, -9088688, -1051193, 734439, 840740, 391379, -78383, 1049583, 1883880, -2678449, - -614180, -3180960, -5833640, 3648575, 4545686, 325344, 1093069, 3096135, 6231461, -14220637, - -1398549, 2021319, -1826972, -15402826, -4922033, 11440182, -1547799, -1097364, -1196685, -3976603, - -2400350, 5727339, 1693828, -679679, -177704, 940598, 1338956, -3555696, -420370, 1709397, - 329639, -565325, -220654, -214748, 1813013, 555661, -627602, 296353, 1775969, 835371, - -1894081, -435402, -2265595, 47782, 13422, -820339, 862215, 416075, 418759, 91805, - 1410360, 365609, 86436, -320512, 765041, -683974, 261456, -119722, -347355, -710817, - 483721, -1611, 49392, -237297, 249108, 418759, 712965, -122407, -292595, 458488, - 90194, -333397, 406411, -105764, 333934, -17180, -96637, 173409, 322123, -537, - 166430, 86436, -249645, -171262, 75162, -78920, - }, - { - 47308528, 45417132, -13591961, 14976014, -7237557, 167504, -1399086, 557809, -6407018, 3394098, - 1222992, -3703873, -6185827, -4571456, 8207683, -844498, -656593, 1722819, 1236414, -540629, - -855772, 242129, -1986959, -3179350, 8525510, 1917703, 134218, 547608, -2937221, 3233037, - -20938, -1308891, 1376537, 2118493, 1769527, -1804423, 1612760, -6487548, -676994, 600222, - 2254858, 1991791, -4627828, -589484, 1532767, 848793, 295816, -152471, 377420, 1169305, - -47782, -1811939, 1799591, -357019, -913754, -614180, -709743, 114354, -681289, -482110, - -95026, -152471, -229244, 105227, -419296, 125628, 662499, -672162, 19864, -105764, - -603980, -168577, 718870, -849867, 361851, 610959, -13959, -402116, 257161, -527744, - -357019, 153008, 363462, 177167, 353261, 195958, -37581, -56908, -78383, -372588, - 233002, -188979, -40265, -342524, -87510, -147640, - }, - { - 1226213, -3809636, 1766842, 600222, 316217, 53150, 78920, 206695, 2793339, -539555, - 16643, 2475512, -1643899, 6282464, -12671227, 3061775, -976031, -1457605, -1468342, 12664785, - -4995584, -7823283, -3751654, 7516, 2979097, -1925756, -5958731, 6156299, -883690, -730681, - 5418101, 3833795, 774168, -1380295, -669478, 5782100, -1308354, -883153, 2006824, 52076, - -926639, -1896228, 273267, 1188095, -73551, -658741, -838592, -1239635, 1137093, 1511829, - -101469, -1213865, 723702, -276489, -153545, -617938, -344134, -2367064, -1068910, 730681, - 57445, 267899, 64425, 809064, 109522, 37044, -665183, -432181, -68719, -1511292, - 572304, 135828, -111132, -199179, 535797, -304406, -1074, 384936, 845035, 717796, - 470836, -38655, 64961, 446677, -294742, 19327, -452582, 235686, 338229, -76236, - -112743, -60666, 30065, 368293, 283468, 18790, - }, - { - 4035659, -252788896, -450972, 10101226, -2935610, -3568044, -6620692, -721018, -2690797, 2977486, - -7873212, 208306, -4240744, 2189360, 4893579, -1098975, 397821, -1093606, 1764695, 2751464, - 4098473, 1515587, -149787, 1323387, -894427, -498753, 222265, 58519, 866510, -419833, - 2329483, -4017405, -255551, -2078764, 1737851, -1594507, -2212445, 2315524, -727460, 1364189, - 3817689, 448287, -1623498, 2393371, 78920, -3333432, -384936, 415001, -902480, 73551, - -1146219, -9127, 252329, 94489, -154082, -1221918, 967978, -775778, -1850057, 292058, - 134755, 975494, -428423, 229781, 529355, -355945, -616865, -212064, -454193, -317828, - 474057, 151398, -587337, 162672, 45097, -191126, 220654, -14496, -284542, 269509, - 510564, 62277, -215822, -64961, 503048, 455267, -121870, 166430, 35970, 45097, - -13422, 232465, 95026, 241055, -177167, -143881, - }, - { - 63351, -44396004, 8288750, -5747740, 3521873, -681289, -3288334, 1918777, -1203128, -1051730, - 4190814, 4796405, -1710471, 4010963, -2137283, -9430674, 1311039, -3676492, -1311039, 2348273, - -1767916, 10403485, -3971771, 2502355, 2939368, -4846334, -161598, -1115081, -8562554, 4385162, - 494458, -3762391, -2103460, -1556389, -3628174, 47782, 2866891, 881005, 2390686, -743566, - 1982664, -1205812, -1291711, 2348810, 1087164, -2147, -3601330, -549756, 440771, -37581, - -1610076, 1376537, -775242, 1523640, -129386, -366683, 557272, 466541, 245887, -2134062, - 135291, 745714, -321586, -105227, -270583, 113817, -459562, 501974, 1611, -595927, - -143881, 67109, -804770, -507880, -1174137, -237834, -356482, 307090, -542777, -501974, - 382252, 9664, -12348, -97174, -297427, -253940, 77846, -32212, 147103, -24696, - -413927, 19327, 124554, 40265, -96637, -54761, - }, - { - 19487878, -47419124, -24921548, 486942, 10452340, -3735548, -243739, 2525978, -4072703, 4541391, - -4453344, -2561948, -1112397, -1481227, 3823058, -2175938, 301721, -2238752, -3444564, -5385889, - 91268, 2498597, 619012, -3461744, 2282238, -5222144, 2142115, -1716913, 940598, -52613, - -1330366, 399432, -1098975, -600222, 1098975, 2898029, 938987, -992137, -23622, -1313186, - -533650, 179315, 2431488, 82678, -1186485, 3286724, 1408749, -1049583, -2745558, 140123, - 449361, 976568, 447213, -813359, -793495, -2419140, 729071, -77846, 69793, -1104880, - -634045, 1427003, 54761, 463856, -229781, -513785, -2684, -251256, 107911, 599148, - 70330, -304406, 36507, -347355, -188442, 323196, -159988, 235149, -67109, -13422, - 181999, 201863, 37581, 40265, -89121, -76236, -415538, -88047, 68183, -182536, - -60666, -92879, -64961, 24696, -24696, -233539, - }, - { - -670552, -17137456, 5895917, 3495567, 4753455, -2431488, 2046015, -3715147, -175020, -2674691, - 1278290, 4217658, -9450539, -27775016, -3326452, 5231807, 1647120, 1425392, 583579, 1331977, - 1419487, -3432216, 5922223, -3787624, -1129040, -4310537, 4861366, 4729296, 2914135, 3306588, - -6122476, 3879966, -113280, 1566589, -3170760, -1537061, -4485557, -2955474, 1708860, -1576790, - -3186866, 1939178, -895501, -2325725, 52076, 1748589, -1379221, 1357747, -2073932, -1377611, - 222801, -156766, 157840, -357556, 851477, -2966212, 456877, -579821, 676994, -416612, - -368830, 244813, 44023, -62814, 634581, -183610, -294205, -483184, -368830, 643708, - -219580, 790274, -104690, 671089, -52076, 324270, -132070, -157303, 336618, -26307, - 432181, -310848, 585189, -92879, -176094, 107374, -309238, 15569, -240518, -49929, - -61740, -144955, -108448, -27917, 71941, 46171, - }, - { - -32661616, 37917580, 3176665, 1256278, 12453795, 10897943, -14489072, -3794067, -4913980, 1679332, - 11073499, 3430068, 697932, 3124052, 7146289, 805843, 362925, 6874632, -1566053, 787590, - -4182225, 510027, -2951180, -1850057, -5167383, -1786706, 911607, 1778653, 3506841, -1420024, - -359167, -2425046, 3376381, 2698850, -2783139, 4470524, -4000225, -6051072, 3333432, -1410897, - 386547, 649077, 3504693, -5209259, -3685619, -1870458, 345208, -90731, -691490, -244276, - -1262720, 295279, -1937030, -1851668, 770410, 344671, 1229434, 1487669, 257161, 1961190, - -265214, -538482, -52613, 511101, -841814, 148713, -297427, -819802, -451508, -283468, - 205622, 121333, 1845225, 56371, 53687, 520228, 491774, -411243, -181462, 193274, - 259846, 28454, -347355, 26307, 221728, -104690, 75699, 8053, 23622, 184684, - -110059, 65498, 156229, 58519, -26844, -47782, - }, - { - 1539209, -17925582, 827318, 170188, 1387811, 1210107, 829466, 2164664, -2971044, 4621385, - 3180960, 2637110, 3109020, 17157320, 56652768, 10924786, -5942624, -1031866, 7701413, -8540006, - 2940442, 1563368, -3927748, -4816269, 528281, 4019016, -1037235, -2324651, -1152662, -5452998, - 5526013, 2451890, -1195612, 1430224, -5007395, -868120, 1949915, -3977677, 3199751, 2499134, - -853088, -929324, 1626182, 850940, -1530082, -1057636, 955630, -240518, 441845, -139050, - -514859, 660351, 209917, 149250, 199179, -818728, -566936, 1123671, -1134408, -47245, - 475668, -1043677, 819802, 557809, -865973, -309238, -298500, -721018, 187905, 314606, - -734439, 243739, 60130, 32749, -132607, 33823, 105764, -164283, 357019, -121333, - -16643, -314069, 310848, -69793, -40802, 132070, -134755, 105227, 8053, 24159, - -125091, 67109, -1074, 76236, 2684, -169651, - }, - { - -16694001, 58594092, 7710540, -312996, 27380, 1249299, 2916820, 7565048, -1469953, 6065031, - 1249836, 993748, 9388799, 12528956, 6313602, 4428648, 11605539, -5492190, -2223183, -402116, - 2663954, 2925410, 95026, -803696, -1850594, 6663105, 1250909, -5760088, -3360812, -236223, - 688269, -971200, -448824, 2890513, -128849, 406411, -3796751, -1762010, 516470, -191126, - 1910724, 2603287, -2094870, -3062849, -620086, 178778, 1455994, 810675, -439160, 193810, - -171799, 2051384, 1485522, -520765, 2194728, -676457, -1316944, 977105, -134755, -1159104, - -729071, -1566589, -317828, 818191, -605054, 381715, -161598, 177167, 677531, -479963, - -303332, -365609, -86973, -273804, 127238, 66572, 421444, 28991, 193274, 102005, - -76773, -418222, 305480, -376347, -606664, -6979, -72478, -56908, -219043, 194884, - 147640, -20938, 185757, -7516, 71404, -361851, - }, - }, - { - { - 683437, -64956548, -354335, 5129265, -2940442, 75699, 1962263, 936840, -2845953, 3157338, - -253403, 228707, 409633, -373125, -7449621, 12062416, -500364, 639413, 1854889, 11382200, - -966905, 773631, 980863, 853625, 7478075, -9598178, -7951058, -2792803, -2337536, -13283797, - 1673427, 1931125, -296353, 3087545, 876710, -1119376, -1473711, 965831, 4588636, -1656247, - 985158, -824097, -3310883, 715112, 84289, -1519345, 294742, 155156, 2104534, 906238, - 745714, 22549, 500364, -334471, 904628, -653909, -412317, -1321776, 267362, -1136019, - -108985, -88584, 632434, 213675, -576063, 635655, -593779, -158914, 482110, 312996, - -124554, -41876, -43487, -159451, -141197, 400506, 248571, 783295, 47782, -19327, - 324807, -252866, 191126, -183073, 17180, 31139, 156229, -334471, -127238, 200253, - 329102, 117575, 62814, -11811, -117575, 224949, - }, - { - 11942693, -202772928, 1644436, 10498511, 957778, -3388729, 840203, -85362, -4415227, -8293582, - -6927782, -5018133, 4163434, -4782446, -7787850, -3660386, -10908143, -2459406, 7933342, -2231236, - -1932735, 4423280, -3113851, 3185792, -2692945, -2161979, 5759551, 1261110, -635655, 682900, - 823023, -2684, -1875290, 5022428, -2044941, 2128693, 1198833, 3566970, 2598992, 651761, - -1748052, 411243, -1522029, 442919, 1599875, -2338073, -812286, 617938, 112206, 981937, - 2246805, 161061, 1388885, -844498, -1293859, 556735, 607201, -510564, -1193464, 1043677, - -650688, -428960, -236760, -126165, -164819, -1578937, 256087, 151934, -93416, -591095, - 79994, 178778, 404801, -191663, -303332, 294742, 587874, -391916, -268972, 416075, - 284542, -372588, -85362, 90194, 299574, -194347, -124554, -50466, -210453, 314606, - -195421, 315680, 128849, 53150, -102542, -76236, - }, - { - -6373732, 132961448, 28509456, 15159624, 4150012, -1984275, 856846, 1093606, -3474629, -3293166, - -945967, -3559991, -4534412, 323733, -2950643, 7249905, 3910031, -4798016, 734976, 5789079, - 3679176, 1352915, 1870995, 8965744, -3095598, -2442763, 620623, -3527242, -7372312, -1065152, - 242129, 1382980, -1745367, -831613, -2162516, 1168768, 797253, -438087, 3349001, -3958349, - -929324, -231928, -801011, 4975720, -1272384, -20938, 1791538, 658204, 52613, 289373, - -201327, 498216, -249645, -215822, 241055, -412317, 136902, -293668, 679142, 1655173, - 84826, -387621, 585189, 381178, 827855, -537945, -732292, -550293, 308164, -175020, - 551903, 24159, 717796, 19327, -649614, -204011, 38655, 29528, -166430, 171799, - -67646, 261993, -150861, 0, 169651, -144955, -143345, 136902, -138513, -37581, - 27917, -231391, 100395, -75699, -1074, 151398, - }, - { - 898185, -28623272, -4964982, -2269353, -275415, -255551, 11811, 1366337, -2404108, 1042603, - -1413581, 2718714, 1050656, -1094143, 4578435, -8927626, 1448478, -7207492, -11993696, 2084133, - -4388920, -9922448, 370978, 891206, 2209761, 2860985, 885300, 2332704, -3500398, -3693672, - 648003, 1996086, 831076, 2872260, -2141041, 588411, -2091649, 642635, -1532230, 278636, - 1505386, 458488, -221728, 295816, 423591, 2080375, 1073742, -1416802, -682363, -1449552, - 89657, -366683, 158377, -619012, -480499, 1578401, -775242, 450435, 282394, -962610, - -494458, -949188, -804233, 212601, -347892, 234613, -284542, -208306, 341987, -331786, - 168041, -329102, 22549, 320512, -85899, -27380, 71941, 231391, 177167, -247497, - 194347, -1611, -471373, -135828, 125628, 213675, -482110, -181462, -8590, 57982, - 128312, -56908, 11811, 94489, 62814, -34360, - }, - { - -41422812, -52562348, -6573985, 5956046, 3468186, -810675, -1050656, 632434, 738734, 896574, - 5119064, 7877507, 3621731, 1282585, -2111513, -4952098, -6146635, -991601, -1656784, -2197950, - -1916629, 3993246, -542240, -811749, -432718, -662499, -2312840, -2400350, -6958921, -1689533, - 1591285, -2482491, -581431, -2472291, -3839164, 1034550, -9404368, -1141924, 2935610, -1488206, - -2115808, 1572495, 51540, 882079, 4360466, 3078955, 1421097, 2318209, 2371896, -988916, - 1393717, 541703, 346819, 321049, 316754, 1473174, 93416, 1272384, -110059, -380105, - 70330, -242666, -159451, 1125281, -479426, 284005, 785442, 214212, 861141, 49392, - 446677, 767189, -447213, -759672, -109522, 193274, -833224, -249645, -367757, -62277, - -347892, 247497, -147103, 138513, -335544, 90731, 25233, -456877, 229781, 201863, - -73551, 136365, 41876, 40802, -45097, 134755, - }, - { - -496069, -7247758, -1518808, 1787780, 245887, 195421, 44560, 955630, 1404454, -402116, - -1728724, -4663261, -1188095, -1274532, 4416837, -4453344, 3723200, 3707094, 2805688, -18103824, - 2515777, 332860, -4967130, -6488085, -4310000, 860067, 1771674, 134218, -1387811, -5168993, - -804770, 3036542, -256087, 504659, 1221381, 881005, 1048509, -1315334, -2682744, 253940, - 2437931, -740345, -1302986, 818191, 980326, 747324, 201863, -367220, 1063541, 1093069, - -1757715, -958851, -253403, -1016297, -847182, -115427, 277025, 1170916, -86436, 788663, - 1052267, 433792, -37044, -340376, 701153, -340913, 492311, -855235, -596464, 25770, - -277562, 665720, -49392, -8590, -18790, 889595, 215822, 210990, -332323, 518080, - 293668, -177704, 61203, 46708, 180389, 203474, -299037, 49929, 469762, 82678, - -98784, 7516, 70330, -137976, -3758, -158914, - }, - { - -43166032, 147417776, 5950141, 6203544, 756988, -2794413, -190589, 658741, -1064615, -2893197, - -556735, -7762080, -4829154, -2143189, 6694781, -361851, 2173790, -29528, 2545842, -850940, - -403190, -2078764, -2062658, -2416456, 3227668, 5109938, 1506460, 134755, 483184, -1854889, - 981937, -2600066, 2987687, 941672, 984084, 485868, -1939715, -1785096, -3313567, -650688, - 2653216, 1511292, -1142461, -3103114, 678605, 1272384, -390305, 1136019, 287226, 1787780, - -234613, -1406602, 670015, -1701881, -490163, 93952, -454193, -214212, -61203, -799401, - 211527, -51540, -478352, -77846, 50466, -415538, 926102, -492848, 76236, -144418, - -238908, -255014, 188979, 173409, -89657, 186294, 284005, -155693, 74088, -617402, - -72478, 169114, -19864, 649077, 432718, 31675, -88047, 40265, -237834, -200790, - 84289, -67109, -126702, -190052, -206158, 143345, - }, - { - -402116, 13136694, -5600101, -1859184, 397821, -25233, -207769, 1157494, 1619740, -527744, - 2147, -1402844, 1540283, 2533494, 3271155, -13480829, 5303748, -3038689, -787590, 3309272, - 296353, -9601936, 3093450, 1816771, -4221416, -4173635, -4930086, 3490735, -3391951, 3971234, - 1265942, 3849365, 772020, 665183, -944893, 2132451, 493921, 284005, 1507534, 2054605, - -1530619, -2335389, 385473, 138513, -762894, 710817, -702764, -1152125, -981400, 2298344, - -185757, 18254, 401043, -1432909, 808528, -1458141, -546535, -1563368, -885837, -90194, - 164283, 822486, 774705, 350577, 496606, -82678, -874026, -358093, 484258, -1939178, - -26844, 743029, -152471, -289373, 256087, -32749, 330176, 401579, 282394, 1108102, - 330176, -321049, 629213, -128312, -129386, 133681, -317828, 81604, 302795, 59593, - 114890, -49392, 199716, 143881, 154082, 57445, - }, - { - -22677964, -234276512, 14849313, 4716411, -42950, -3482682, -2799782, -1469953, -1524177, 853625, - -1625645, -6116571, -5259188, -3657165, 7672422, 2028835, -2008434, 3086471, 1565516, 435402, - 4693326, 2360622, 336618, 2275259, -60666, -1722282, 523449, -52613, 1002875, -1044751, - 3299609, -4770098, 171262, -2158758, 1935420, -4016331, 467078, 1156957, -475131, 1180042, - 5996311, -4583804, 1661616, 553514, 1061394, -1589675, 623307, -2183991, 945967, -1058173, - -538482, 580357, -1428614, -566399, 1444720, -249645, 596464, -1702418, -962073, 51003, - 106300, 506269, -322123, 435939, 70330, 13422, -6979, -194347, -27380, -185220, - -311385, 245887, -375810, -79994, -20938, 144955, 21475, 338229, -24696, 205622, - 59593, 108448, -141197, -31139, 279173, 342524, -228707, 439160, 32749, 139586, - 5906, 392453, -38118, -91268, -6979, -184684, - }, - { - 511101, -38246684, 1909650, 928787, -4239670, 2649458, -1208496, -2146410, 544924, -1491964, - 2038499, 218506, 3869229, -4265440, -791348, -6034429, -3103114, 2037962, 2703682, 2903398, - -5302137, 5827197, 2668249, -1611687, 660888, 2870649, -3917547, -3958886, -3082713, -2596308, - 5366025, -3717831, -3695283, -2654290, -3015067, 1420560, 1294396, -75699, 3504693, 428423, - -506269, 1147830, 446677, 1267552, -629213, 892279, -1452236, -1954747, 279173, -2174327, - 312996, 248571, -92879, 1065689, 285078, -751619, -84289, 828392, -1190243, -1652489, - -48318, 1097364, -198642, -280784, -206158, 209917, -634581, 1188632, -330176, -547608, - -126165, 299037, -757525, -505732, -867047, -121870, -405338, -300111, -90731, -803159, - -2147, 253403, 92879, 77846, -357556, 134755, -155693, 80531, 14496, -126165, - -91268, -202937, 169114, -75162, 94489, -14496, - }, - { - -18639622, -42894912, 11987254, -4678830, 8457327, 10438918, -10202158, -2132451, -2960843, 911607, - -479426, -4105989, -2377265, 2516851, -850940, 356482, -4960151, 2734284, -2415382, -7406134, - 2214056, 1416802, 1473711, -6782827, 6331319, -3820910, -122943, -2506114, -965294, -819802, - 570157, 914828, 433255, -1006096, 850404, 2123861, 2215130, 213138, -3270618, 1276679, - 534723, 1598802, -731218, -41876, 349503, 1442035, 814970, -540092, -1454920, -1171989, - 628139, 638876, 1089848, -569620, -2283312, -570157, -955630, 53687, 114354, -411780, - -9664, 399969, 316217, -359704, 437550, -288300, -383863, 182536, -43487, 496069, - 184147, -299037, -264677, 203474, -183610, 48855, 433792, -63888, -534723, 117038, - 210453, 55298, 316754, -86973, -278636, 50466, -281857, -92342, 215822, -391916, - -51003, -141197, 2147, 31675, 16643, -170188, - }, - { - 1138703, -5090073, -3545496, -256624, 2255932, 363998, 897648, -1916629, -1192927, -2642479, - -63888, 359167, -3220152, -22029962, -7937100, -1702418, -866510, 1925756, 4864588, -501437, - 631360, -4725001, 7900056, -797790, -8348880, 2288681, 1304596, 5701032, -1077500, 2837363, - 1858110, -4072703, 1732482, 1550483, -4865661, 791348, -4227859, 298500, -1735704, -1548336, - 145492, 984621, -762357, -1170916, -1335198, 217970, -293668, -532039, 496606, -1420560, - -471910, -725850, 410169, 947577, -66572, -1881733, 289373, -875636, -643171, -195421, - 389231, -287226, 323196, -443992, -418759, 432718, -106837, -418759, -360777, 637266, - -161598, -139586, 358630, 413927, 617402, 316754, -134755, -221191, 233002, 64961, - 93416, 200253, 117038, -189515, -287226, 33286, -17180, -309775, -40265, 140660, - -105227, -245887, -3221, 27917, 2684, 164283, - }, - { - 24401856, -35608500, -11285027, 12262132, 8211978, 933082, 5425618, -7327751, -2267743, 778463, - 8952322, 4258460, 8484171, -7524246, 9554155, 1389959, -624381, 882079, 2834679, -3474092, - 2044941, -4358318, -2681670, -4037806, 526134, -919123, 2279554, 964757, -1798518, 872415, - -863288, 3214783, -302258, 2219961, 0, -1290638, -1236951, -2764348, -2230162, 1448478, - 1355599, -731755, 868657, -2504503, -4799626, -2532420, -109522, 1250909, -782758, -2015950, - -308701, -389768, -170725, -72478, 140123, 813359, -212601, 2290828, 527744, 654983, - 607201, -896574, -90194, 1020055, -459025, -63351, -1013075, -710817, -412317, -259846, - 661425, -183610, 1001264, 932008, -260919, 482110, 106300, 301185, -210990, 134218, - 107374, -20938, -281320, 135828, 266288, 225486, -336618, 71404, -175557, 104153, - 96100, 65498, 202937, 40802, -38118, 20401, - }, - { - -1117228, -10252624, -2137820, -943819, -42413, 1988033, 1963337, 1597191, 31675, 428960, - 2051384, 3349538, 4580046, 12513924, 74107512, -5686000, 3362960, -6468221, 3609920, 1904281, - -3262028, 3737159, -3282966, -4984310, 2132451, 3983045, 3267396, -2940979, -6703907, 3578782, - -1785096, 3970161, -539018, -748398, -2664490, 1851131, 391916, -4236449, 544924, 3868692, - -1858647, 6979, 2072322, -654983, 365609, -896574, -571231, -192737, 1390496, -309238, - -301185, -583042, 883153, 310311, 473520, -940598, -716723, 211527, -525597, -373125, - 393526, 140123, -103616, 178778, 54224, -692027, -647466, -195421, 99321, -49929, - -602369, 537, 106837, 1611, -16106, 52076, 192737, 158377, 187368, -12885, - 133144, -198105, 68183, -108448, -60130, 109522, -149250, 57445, 48855, -78383, - 141734, 70867, 83752, -68719, 47245, -158914, - }, - { - 21772262, 3587908, 7837242, -974421, 750546, 2822331, 1708860, 8740258, -2027761, 5833640, - 1639604, 6794102, -1672353, -6938520, 42298984, 1340567, 7369090, -5656472, 541703, 242666, - 2860448, 1480153, 1170916, 1241246, -745177, 1316408, 2963528, -7394323, 1411434, -1636383, - -3270081, 1628330, -597000, 4533875, 989990, 1444720, -4621385, -1277753, -787053, -234076, - 3990025, -266288, -49929, -2938831, 1625108, -553514, -839129, 359167, 661962, -258235, - 830002, 1061931, 980863, 686658, 1708323, -593779, -1675574, 150324, 165893, -971200, - -733366, -872415, -565862, 21475, 455267, -777926, -166430, -292058, 969589, -415001, - -120259, -186294, -418759, 85362, -57445, 205622, 557272, -87510, 416075, -388158, - 30065, -306553, 427886, -323733, -502511, -39728, 188442, -102005, -99321, 5906, - 134218, 44023, 161061, 124017, -9127, -120796, - }, - }, - { - { - 253403, -22121230, 26970784, 3881040, -2605435, -300648, 793495, 928787, -2887829, -699006, - -858457, 962073, 3740380, 7291781, -10024991, 3135326, -7929584, -3957812, -4881231, 913754, - -7719130, -3771518, -790274, 4274566, 9017821, -3222299, -2413235, -4292283, -4571993, -9589588, - 5009006, -3019899, -1847373, 1677722, -979253, -3477850, -1329829, 346819, 3471944, -1543504, - 1046898, -303332, -2844342, 1006096, -278099, -835371, 1191853, -648540, 501974, 61740, - -919660, -159988, 636192, -983548, -299037, -531502, 606664, -252329, -197032, -1783485, - 351650, 38655, 660888, 32749, -1248225, 542240, -428423, -97174, 814433, 602369, - 146029, 82141, 130997, -100932, 289910, 283468, 89657, 315143, -186831, -172336, - 307090, -5906, 281857, -187368, 304406, 172336, 276489, -227096, -201863, 91805, - -125628, -184147, -13422, -75162, -228707, 58519, - }, - { - -11297375, -129168992, 68403256, 3505230, -1319629, -135291, 3299609, 2413235, 496606, -2760590, - -14496, -6703907, -747324, -4286378, -506806, 716186, -2951180, -4220342, -3182571, -281320, - -1147830, 6112276, -1595580, 2616709, -2823404, -3196530, 5265630, -1305670, -1120987, -747861, - -593242, -387621, -2053531, 2503429, -3702262, 1758789, 364535, 4031364, 1560147, 1597191, - 718333, 1688459, -1564442, 2807835, 3362960, -608275, -1177358, -273267, 1180579, 732829, - -995359, -1437740, 1522566, -172872, -685584, 579284, 1203128, -466004, -1899986, 287226, - -657667, 537, 373125, 817118, -157303, -1462436, -137439, 297963, -76773, -980863, - 216359, -365609, -118112, 2147, -108985, 242129, 495532, -350577, -271657, 40802, - 539555, -140660, -21475, 175020, 305480, 60130, -99321, -86436, -248571, 128849, - -403727, 146566, 54761, 115427, -181999, 11274, - }, - { - 5999533, 57179436, -55948392, 268972, 1051730, -5535676, -1479079, 1517197, 448824, 1874753, - -1175210, -5185100, -8671539, 1005559, 2519535, 4772783, -1592359, -2959769, -5512591, -6603512, - -4452271, -9265318, -2181844, 6060736, -1613834, -321586, -59056, -3363496, -5790153, 2806761, - 3970161, 4936528, -2901787, 2377265, 1664837, 1638530, -82141, 908922, 5352066, -1604707, - 1163399, -337692, -1331440, 4024384, -1738388, -1108638, 136365, -835908, -106837, 1455457, - -276489, -1217623, -1414655, -1072131, 351114, 379568, -1620813, -1096290, -6979, -60130, - 14496, 227633, 558883, -754841, 287226, 258235, -251792, -43487, 743566, -95563, - 741956, -2147, 723165, 159451, -566936, -458488, -133681, -175557, -204011, 191126, - -30065, 85362, -365609, 105227, 365072, -57982, -77309, 100395, 74625, 331786, - -537, -191126, 164819, -22012, -53687, 115427, - }, - { - -1008780, -11202885, 8416525, -2678986, 62814, -255014, -779000, 804770, -1712618, 1174137, - -2164127, 1304596, 1014686, -1394254, 13962939, 3850975, 1221918, -10339060, -16046535, -2152316, - -1157494, -10171556, -6495065, -5570036, -3498788, 3745212, 558346, 3375308, -1206349, -1471563, - 247497, -3080565, -1578937, 879395, -3302293, 2111513, -593242, 2301029, -2917357, -248571, - 828392, 1135482, -479426, -150861, 286689, 302795, -448824, 439160, 1486059, -344671, - 1987496, -7516, -1326608, -661962, -1050656, 1239635, -244813, -263604, 68183, 67646, - 311922, -473520, -220117, 391916, 40802, 488553, -1074, -471373, 24696, -303332, - -49929, -480499, 8053, -5369, -325344, -426276, -81604, 176631, -15032, -434865, - -300111, -115427, 233539, 55835, 110595, 236223, -325344, 55835, 44560, 59056, - 91805, 6442, 89121, 190589, 88584, -28454, - }, - { - 41596760, 38851200, -25278030, 9210557, 3135863, 537408, -802085, -1687922, -1990181, 3077881, - -1460826, -1017370, 2848637, 3925600, 10421738, 1798518, 4896263, 4072703, -8598525, -6894497, - -3482682, 1675574, -3743064, 490700, 1177358, 1276679, -1811403, 1563368, -2645163, 717260, - 2887292, -2922188, -3726421, -4046396, -355945, 3394635, -1816771, 1779727, 1881196, -343597, - 617938, 1611150, -2542084, -601832, 830002, -176631, -919123, -728534, 978179, -938450, - 1096827, 219580, 1136556, 578210, 236223, 628139, -317291, -135291, -1481764, -158914, - 340913, -573378, -727460, 851477, -752156, -281857, 564788, -547071, 143345, -450972, - -163209, 415538, -627602, -600759, 43487, 532576, -285078, 488016, -14496, 103079, - -188442, 689879, 127238, 341987, -351650, -133144, 85362, -198105, 76773, 54224, - -145492, -5369, -10737, 4295, -141734, 233539, - }, - { - -108448, -5097053, -976568, 1090385, 861678, 347355, 499290, 1444183, 25770, -911070, - -799938, -1241782, 936303, -4089346, 3941706, -3991098, -464393, -2429341, -2461016, -29721710, - -927176, 5798206, -6960532, -3042984, 1269700, -6307697, -932008, 3463891, -1343788, -5813238, - -1034013, 1097901, -1600412, -1156420, 2368675, 1258962, 1629940, 608275, -3222836, -477278, - 2551211, 236760, -686658, 454730, -793495, -128312, -488016, -1663226, 450435, 1059783, - -295279, 922344, 1340567, -1335735, -663572, 321049, -367757, 243203, -504659, 1010928, - 399432, -472983, -68183, -307090, 253940, 267362, 692027, -549219, 287226, 417686, - -325344, 584652, -372588, 46171, 153008, 200790, -483721, 312996, 45634, 358093, - -297427, 69793, 113280, -164283, -62277, 27917, -298500, 113280, 336081, -43487, - -27917, -4832, 163209, 102005, -18254, -316754, - }, - { - 27494770, 263698640, 15381888, 11534135, 6713034, -2012729, 290447, -191663, 452582, 161598, - 4516695, -3409130, -2246268, 816044, 3272765, -5501853, 832687, -2160369, 687732, -1525787, - 480499, -172336, -1788854, -3405909, -2176475, 629213, -669478, 1549410, 2940979, -2669322, - 1333587, -2322504, 812286, -2135136, -1828046, -2260764, -2020782, 1565516, -1659468, 149787, - 1605781, 341450, -603443, -985695, 979789, -635655, 459025, 1503239, 708670, 1720671, - -222265, -114890, 436476, -1690607, -818191, 389231, -322123, -184147, 137976, -959925, - 752693, 857920, -378494, -339302, 56908, -819802, 232465, -40265, 418222, -216896, - 236223, 8053, -63351, 213138, -4832, 115427, 260919, 82678, 266825, -37581, - 435939, -210990, -435402, 325881, 101469, -70867, -143881, 364535, 227633, -90194, - 12348, 230854, 176631, 120796, -37044, 228707, - }, - { - -1042066, 10919954, -1740536, -425202, 509491, -282931, -1143535, -1028645, -900333, -1228361, - -1168768, -2033667, 2983929, 4248260, 23602992, 4027069, 12370043, 3042984, 4137127, 1307281, - 7373385, 2215130, 8220031, -2605435, -12888660, -616328, -5590974, -423591, -4918275, -1350230, - -3205119, 184147, -2185065, -102005, -514322, -1483374, -1571421, 825707, 574989, 1714766, - -35970, -1905892, 1479616, 1668595, -629213, 319438, -711354, 413927, -932008, 1458678, - 415001, 671626, 205622, -1216550, 1012002, -2266669, -607738, -335544, -347355, -898185, - -113817, 1411434, 1067836, -374199, 429497, 574452, -719407, -396211, 1198296, -957241, - 83752, 53687, -379568, -171799, 233539, 32749, 219043, -186294, -468151, 356482, - -125628, -308164, 643708, -369367, -130997, 389768, -235686, -121333, -9664, -69256, - 193274, -142808, 42413, -43487, -100395, -162135, - }, - { - 35606888, -184248192, -10375030, 5145371, 3058554, 308701, 863825, 1329829, -1066763, 847182, - 2272575, -3741454, -599148, -4037806, -681826, -2752537, -3745212, 2713346, 6084358, -603443, - -768799, 289373, 3077344, 2823941, -2382633, -1331440, 595390, -1029718, -558346, -4276714, - 4981625, -2364916, -1493038, -1206349, 1148904, -3446175, 2267206, 64425, -605054, 2933463, - 3661460, -5569499, 3812320, -330176, 203474, -674847, 614180, -836445, 2517388, -1343251, - -1194538, -387084, -2089502, 181999, 2611877, -45097, 627065, -884226, 562641, 620086, - 164283, 476205, 526134, 843961, 169114, 505732, 149787, -5369, 561567, 59056, - -512712, 372588, -22012, 118648, 331786, 402116, -19327, 700617, -9127, -96637, - -13959, 169114, -345745, -297427, -137976, 117575, -211527, 274341, 35970, 23085, - -69793, 305480, -124554, -191126, 52613, -5906, - }, - { - -925029, -24735790, 10902238, 3523484, -5330592, -845035, -725313, 1105954, 1494649, -2801393, - -3619047, -2691871, 67646, -7992934, -2796024, -11030013, 1311576, 3877819, 3980898, 12445741, - -3451006, 3659312, -349503, -4260608, 1121523, 2116882, -4046396, -2986076, 1042066, -3277597, - 6094559, -47782, -64961, -1033477, -2910377, 87510, -1254131, -1613297, 270046, -1437203, - -1056562, 1087164, 1137630, 1274532, -313533, 1471563, -1089848, -1296543, 429497, -2910914, - 758599, 253940, -1556926, 139586, 324270, -1975148, -1935420, -296890, -1010391, -869194, - 387621, 1200443, 31139, -170188, 159988, 412317, -451508, 834834, -395674, 82678, - -236760, 392453, -88584, 265214, 239981, 606127, -234613, -226560, 466004, -136365, - -149250, 67109, 248571, 427886, -53687, 295279, 80531, 86436, 150324, -168577, - 90731, -133144, 91805, -31675, 132070, -67109, - }, - { - 16645683, -52162916, -26298084, -5212480, -3699041, 6542846, -5539434, -6005975, -5912023, 2386391, - 3038689, -4426501, -4915590, 1789928, -4762045, -1394254, -10072772, 1698660, 6130529, -3086471, - 5370857, 1749662, 2127083, -6403796, 4496831, -3008088, 1040993, 512712, -1697586, -2838974, - 93952, 2469606, 4140349, 1808718, 1232119, 1897839, 1157494, 131533, -2411624, 2202781, - 1730335, 1970316, -1583769, -806917, -252866, -6442, -235149, 588947, 299037, -2186675, - -375810, 323733, 522375, 55835, -485331, 519691, -425202, 90194, 328565, 98784, - 409633, 317828, -43487, -711354, 193810, 82141, -304943, 711354, 4295, -254477, - -113817, 147103, -8590, 210990, -323733, -342524, 202400, -166967, -532576, 10737, - -5369, -206695, 158377, -330176, -179852, 217433, 79457, 41339, 291521, -331786, - -82678, -140660, 167504, 166967, 39192, -114890, - }, - { - -1151588, 3242700, -46708, -5270999, -2751464, -1007707, 870268, -744103, -818191, -1475321, - -365609, -1820529, 11304354, 1461363, -3152506, -3421478, -4914517, 622233, 6380174, -423054, - -304406, -6618545, 2083059, -6795175, -10904922, 4709432, 666257, 96100, -3469260, -71404, - 1767379, -3771518, 1600412, 723165, -2854006, 2883534, -568009, 2433099, -792958, -2301566, - 185757, 2212445, 854162, -300111, -2225867, -221191, 166430, 323196, 2384781, -896574, - -551903, -9664, 144418, -569620, 143881, 105227, 1874753, 154619, -582505, -300111, - 415538, -308701, 208843, -905701, -870805, 469225, 249645, -219580, -233002, 66572, - -358630, -217970, -214212, -148176, 625455, 256624, 31675, -185220, 154619, 106837, - -84826, 181462, -115427, -365609, -181462, 8590, 186294, 44023, 115964, 83215, - -51003, -19327, 115964, 25770, -120796, 70330, - }, - { - -9626632, -71746888, -16812650, -88047, 4169340, -1110249, 5247377, -10049687, 1615445, -1969243, - 1635846, 637803, -7873749, -18575196, 8301635, -6674916, -7479149, -1583232, 6317897, -1681480, - 4313221, -2659122, 2871186, -233002, 1292785, -2029372, -1495186, -1493038, -2993055, 386547, - -1807108, 3287798, -2122251, 1807108, 1174137, -2507724, 1146756, 10737, -2283312, 130460, - -81068, -838592, 2000381, 2861522, -1786706, 348429, 1677185, 731218, -1429150, -1023276, - 1032403, -727997, 992674, 1589138, -331249, 92879, -947577, 1964948, 345208, -1714229, - -685047, -239444, 232465, 1146756, -10737, 717260, -132607, -470836, -836982, -587874, - 189515, -834297, 5906, 278636, -241055, 60666, 48318, 384936, -479426, -344671, - 139050, 279173, -279710, -84289, 206158, 610422, 8590, 287763, 100932, -63351, - 10737, 31675, 156229, 214212, 6979, 84289, - }, - { - 838056, -5982353, -683437, 2017561, -230318, 1229971, 2737505, -1483374, -2389076, -472446, - 799938, 2800856, -1735704, -44364328, 16131897, -8879308, -5091684, -7281044, 4039417, 7774965, - 783295, 2376728, -3820910, 2102923, 3929358, -641561, 4633196, -4161823, -7370164, 5223217, - -1775432, 777389, -3909494, -2078764, 16106, 4905390, 2480881, -715649, 15569, 2287070, - -869731, -179852, -241592, -1402307, 1560684, -253403, -207769, -583042, 1225676, -194884, - -427886, -1095217, -234613, 15569, 338229, 193810, -174483, 412854, 135828, -193810, - 882616, 123480, -176094, 159988, 78920, -640487, -846645, 83215, 12885, -602906, - -437013, -137439, -70330, 114354, -45097, 57982, 81604, -186294, 326418, 272194, - 304943, 285615, 207769, -167504, -176631, 27380, -11811, 119185, 354872, -62277, - 124017, 58519, 169651, -36507, 82141, 30065, - }, - { - -17528298, -51153596, -1013075, -4613332, 2563559, -4524211, -5811091, 5977521, -528818, 5576478, - 333934, 742493, -7413114, -2028298, 44441100, -10293426, -5627481, -8478802, 1158031, -385473, - -125628, -1771674, -1507534, 783295, 1251983, 2318746, 2593087, -9351218, -629750, -597537, - -3535295, 2580739, -911607, 1319092, 642635, 3598109, -433255, 1124208, 925565, -980326, - 2553358, 1835025, 1643362, -2377801, 933082, 774168, 331786, -759136, -689342, -266825, - 336618, -656056, -675384, -849330, 339302, -810675, -831613, -32749, -208843, -255551, - 608812, -470836, -1138166, -674310, 339302, -661962, 2684, -346282, 1244467, -79994, - 424665, 443992, -424665, -117575, -9664, 184684, 341450, -296890, 440771, -225486, - 57445, -397821, 455803, -39728, -319438, -156229, 119185, -79994, 150324, 78920, - 136365, -59593, -49392, -54224, -33823, 111669, - }, - }, - { - { - 318364, 45221172, -28611998, 848793, 4017942, -2257005, -140660, 23622, -38118, -1821066, - -1941325, 10737, 7327751, 4566087, -11970611, -1180042, -330712, -3191161, -10392210, -5844377, - 1938641, -8296803, -386010, 7007776, 3900367, 3445101, -3857954, -6959995, -1870458, -8393977, - 4552666, -4533338, -3670050, -2916820, 332860, -1083942, -699543, 2206003, 1595580, 559956, - -418759, -673236, -304406, -265214, -2013803, 377957, 1206886, 208306, -1981591, 813359, - -202937, -486405, -15032, -40802, -1580011, 353798, -287226, 963683, -590021, -1068373, - 843961, -724776, 572841, 99321, -1027034, -25233, 242129, -62277, 410169, 644245, - 155156, -102542, 120796, 419296, -29528, 111669, 441845, -412854, -93416, -8053, - 19327, 269509, 45634, -239444, 250182, 56371, 189515, -176631, 149787, 118648, - -335544, -211527, -176094, -13422, -45097, 41876, - }, - { - 14432701, -18698140, -48010220, 7584912, 124017, 2917894, 1573569, -244813, 4603131, -814433, - 271120, -6646999, -641561, -578210, -6817187, -1607392, 9446244, 2363843, -15559593, 3715684, - -3068754, 1141924, 3654480, 429497, 196495, -4265440, 2504503, 928250, -1292248, -908386, - 385473, -411780, -169651, -2570538, 1962800, -511101, 898185, 2608119, 2430415, 296353, - 696858, 2922725, -287226, 2000918, 2144799, -400506, 220117, -687195, 1158567, -251256, - -1533840, -81604, 65498, 117575, 651224, -646929, 494995, -790811, -560493, 1611, - -321586, -17180, -53687, 367757, -358630, -403727, 50466, -404801, -20401, -557809, - -2147, -649077, -49392, 28991, 165893, 214748, 323733, -175557, -198105, -230854, - 518080, -132607, 271120, 35433, 129386, 177704, 6979, -54761, -4295, -137439, - -163746, -171262, -105227, 169651, -28454, 62814, - }, - { - -5698885, -49152680, 33502892, 3451543, -4278325, -6203007, -2861522, -470299, 1759863, 2716567, - -4169340, -988916, -8968965, 2371896, 9128953, -2298344, 396211, 1458141, -7916699, -9305047, - -5843840, -6692633, -130997, 1369021, 878321, -1755568, -181999, -5978595, 791348, 4172561, - 2085207, 865973, -50466, 365609, 3570729, 4162360, -3293166, 853088, 4660577, -819265, - 2177012, -1718524, 1423245, 2353642, -678605, -2667175, 159988, -1385127, 1153736, 1528472, - -841814, -1485522, -1527935, -1241782, 1078037, 477815, -2591476, -538482, -666794, -502511, - 650688, 86436, 205085, -739808, -441308, 1081258, -780610, 329639, 520228, 52076, - 889595, -16643, 27917, 535797, -367220, -678068, 72478, -304406, -410169, 273267, - 257161, -280247, -82678, 100395, 368293, -74625, 6442, -33286, 248571, 184684, - 60666, -96100, -19327, -68719, 63888, 31675, - }, - { - 1347009, 5449240, -5899675, -1552094, -296353, 73551, -1121523, -532576, 4295, 457414, - -637266, -223338, 1593433, -2549600, 11574400, 6374269, 2277943, -12154221, -13304735, 1151051, - -2261837, -7758322, -7094212, -4681515, -4182225, 2522757, 2122788, 1979443, -1327682, -1658931, - 265214, -4185983, -20401, -854699, -302795, 892279, -818728, 2873333, -2136746, -115427, - -320512, 939524, -1625645, 809064, 1523103, 41876, -1895691, 687195, 1968169, 505196, - 1009317, 91805, -1219234, -352724, -602369, 130460, 147103, -335007, -606127, 1082869, - 57445, 99321, 49929, 35433, 181462, 25770, 498216, -268972, -187905, -246424, - 100932, -780073, 350577, 5906, -418759, -62814, -287226, -3758, -137976, -143345, - -321049, -240518, 404801, 39192, 209917, -3758, -65498, 118112, -191663, 149250, - -25770, 55298, 63351, 45634, 87510, -41339, - }, - { - -32203664, 109582336, -6657200, 6067715, 7064148, -816581, 703301, -1694902, -2823941, 5150203, - -3549791, -1851668, 1179505, 3602941, 15635828, -158914, -3758, 4345970, -2465311, -11635066, - 570157, -2304787, -1705102, 66035, 5350993, -3768297, 355945, -3998615, 5808944, -594853, - 886374, -474594, -4246112, -2679523, -806380, 466541, 9451612, -4199405, 1638530, -813896, - 1972464, 1008244, -2374043, -128312, -331786, -624918, -2070174, 157840, -723702, -306553, - 990527, 625992, 1025960, 296353, 695248, 139586, -69793, -1547799, -382252, 324270, - -506269, 17180, -839666, -156229, 359167, -614717, 411243, -48318, -29528, -570694, - -554051, 324270, -242129, -308164, -115427, 207769, 375273, 446140, -248034, 177167, - -112743, 290984, 321586, 123480, -118112, -127775, -119185, 133144, -99858, 94489, - -121870, 159988, -110595, 175020, -233002, 178778, - }, - { - 125628, -4381941, -3754338, 1916092, 1115618, 256087, 254477, 495532, -950798, 790811, - -1670205, -362388, -2082522, -2608656, 8681740, -1203665, -1067836, -5823976, -2629057, -27222576, - -3277060, 5396627, -2139431, -8221105, 4339528, -7350300, -3568581, 2956011, -3202972, 1576790, - -3116536, -2055142, 448287, -1025423, 3615826, -116501, 525060, 350040, -1266479, 693100, - 1503775, -1740536, 497142, -651224, -694711, -114354, 255551, -889058, -728534, 585189, - 608275, 1302986, 481036, -750546, 340913, -1225676, 435402, 150861, -250719, 254477, - 365609, -564251, -471910, 777389, -352187, 833761, 19327, 330176, 253403, 390842, - -154619, 291521, -240518, -18254, 52076, 61203, -670015, -57445, 464393, 20401, - -253940, 148713, 256624, -154619, -266825, -117575, 105764, -101469, 383863, -194884, - 207232, -52613, 123480, 129923, -108448, -185757, - }, - { - -4307852, 344780096, -11269994, 17569100, 2172717, -1230508, 55298, -464393, -2405182, 3656091, - 4266513, 311922, -3338263, 4832, 3514357, -8025147, 667331, -508954, -1360968, 212601, - 758599, 781147, -1879585, -3037616, -2026688, -1374390, -2036888, 2093260, 1599875, 142808, - 2387465, -1925219, -1337882, -3646964, -1899449, -2270964, -2206540, 1884417, -518617, 235149, - -141197, 1043677, 69256, -196495, 1248225, -2849174, 2193118, 208843, 1801739, 828929, - -1369558, 1301375, -463320, 199179, -1034013, 530965, -437013, -522375, 660888, -785979, - 534187, 382789, -195958, -146566, -139050, -838056, 133144, -88047, 551366, -228170, - -221191, 433255, 9127, -83215, 349503, 71941, 135828, 319438, -111669, 76236, - 490700, -246424, -338229, -37581, 96637, 35433, -4832, 97174, 213675, 216359, - -89121, 297963, 127775, 170725, 75699, -15032, - }, - { - 565862, -7046968, 9045738, 707596, 556198, -292595, -1042603, -995359, -1531156, -281857, - -710817, 514322, 2095944, 2513630, 31526134, 11556146, 3039763, 2445984, 7220377, -6776922, - 8044474, 11642046, 128849, 2640868, -10799158, -673236, -1774895, -3303904, -1929514, -6179384, - 935766, -1258962, -4177393, 1893544, -63888, -1490354, -2739116, -122943, 1848447, 877784, - 762894, -898722, 671626, 842887, 452045, 266825, -137976, 6442, -472983, 759136, - 767189, -503048, 1497870, -270046, -506806, -936840, -1540820, 213138, -474594, -779537, - 1240709, 201327, 670552, -454193, 97711, 371515, -69256, 182536, -188442, 459025, - -117575, -896038, 16643, -104690, 68719, 178241, 352187, -629750, -136365, 61203, - -515396, 230854, -11811, 102005, -49392, 83215, 79994, -148713, -259846, -68183, - 181462, -75162, -91268, -26844, -147103, -207769, - }, - { - -40492952, -130419904, 22989886, 12023761, -2024540, 590558, 7516, 1040456, 296353, -539018, - 416612, 2149094, 727460, -2703682, -5941014, -1502165, 2024003, -2069637, 2762201, 686121, - -980326, -502511, 3959423, 303869, -666257, -1467805, -263067, -1053341, -1437740, -1629403, - 2360085, -454193, -3452617, 594316, -1032940, 1500554, 74088, 168041, -34360, 2515240, - 86973, -1149978, 1138703, 905701, -986769, -151934, 49929, 26307, 501437, -54224, - -640487, -1349694, -976568, 135828, 1855963, 176094, 191126, 109522, 979253, 194347, - 538482, -147103, 705448, 605054, 372588, 738198, -360240, -15032, 322123, 132607, - 13959, 70330, 103079, 68719, 261456, -175557, 525597, 512175, -70330, 22012, - -3221, 132070, -433255, -119185, -134755, 105227, 113817, -76236, -11274, 22549, - -11811, 102542, -20401, -113817, -64425, 56371, - }, - { - 1378148, -2185602, -7522099, -576063, -413391, -316754, -6375879, 3170223, 1416802, -2007360, - -5813775, -2713883, 545998, -8940511, -5890011, -5668820, 6120866, -812286, 4092567, 11142756, - 1821603, -1293859, 4822175, -6145025, 754841, -2345589, -285615, -3382824, 3762391, -232465, - -724239, 1421097, 2044404, -1686312, -2852932, 732829, -595927, -3057480, -368830, -681826, - -1144609, 109522, 799401, 1827509, 1260036, 155156, -743566, -943282, 165356, -1835025, - -488553, 62814, -927176, 213138, -563714, -772557, -1740536, -928250, -872952, -68719, - 328565, 544387, 561567, -527207, 737661, 249645, -268972, 184147, -453656, 409096, - -297963, 1074, 379031, 341450, 358630, 383863, 69793, -192737, 310311, 534723, - -253940, -148176, 301185, 205622, 139586, -87510, 205622, 212064, 172872, -78383, - 21475, -106300, -54224, 115427, -42413, 23085, - }, - { - -15126338, -72033048, 18456548, -1056025, -3459059, -5873905, -1517197, 906775, -6517076, 2399813, - 5977521, -5954436, -2646237, 785979, -8330089, 1974074, -6980933, 1847910, 3113851, -1864553, - 4177393, 1229971, 352187, -2182380, -1723893, 1204738, -793495, 3515431, -461709, -3107946, - -2920578, -910533, 7661148, 3873524, -320512, 1755031, 3065533, 220654, -2243047, 2054605, - 1336272, -453656, -966368, -86973, -1146756, -13959, 322123, -316217, 626528, -1805497, - -690953, 331786, 925565, -583042, 359167, -116501, 1010391, -888521, 801548, -288300, - 366146, 501437, -204011, 61740, -477815, 215285, -196495, 561030, 69256, -287226, - -184684, 89657, 95563, 190052, -357019, -178241, -224949, -118112, -55298, -322123, - 91268, -306553, -100395, -148713, 106837, 16643, 104690, 201863, -81604, -149250, - -192200, 71941, 166430, 69793, 8053, -88047, - }, - { - 979253, 10808285, -11221676, -4188130, 144955, -925029, -404801, 1548336, -2194728, -724776, - -709743, -3540664, -2960843, 23500450, -2695092, 2115808, -5634997, -804770, 2215666, 5719823, - -10837813, 2767033, -1068373, -5233955, -4740570, -2908230, 5250061, -3986804, -24696, -2413235, - 777389, -1588601, 3109020, -401579, -417686, 730144, -536871, 751619, 431644, -2260764, - -487479, 1274532, 1224066, 224949, -1889249, -385473, -467078, 1735704, 1737851, -279173, - -680215, 405338, -69256, -1255741, 238908, 389231, 1211718, 909996, 720481, 67109, - 391916, -1161789, -28991, -450435, -708133, 145492, 461172, -174483, 28991, -316217, - 33823, -231928, -613643, 83752, 379031, -15032, 156766, -212601, 122943, 121333, - -8053, -162135, -108985, -157303, 13422, -7516, 58519, 147640, 174483, 65498, - -41876, 14496, 122407, -99321, 17717, -51003, - }, - { - -3138011, -79870824, -11457362, -8468065, 10299868, -3048353, -4759361, -4058744, 361314, 41339, - -5440650, 3600793, -6998113, -20341502, 6851010, -7103339, -1257889, -1814087, 2343979, -122943, - -477278, 1950452, 3236795, 1771674, -850940, -3101503, -2609193, -1217086, -1816771, -860067, - 1086627, -2684, -2784213, 510564, 1839857, -2942053, 2884071, -384400, -1311576, -1423782, - 330712, 2363306, 1021665, 1379221, 656593, 1787243, 1368484, -754304, -136365, 11811, - 538482, -1019518, -257698, 1246077, -88584, -354872, -102005, 1297080, -281320, -1420024, - -1299228, 494995, 165893, 973347, 269509, 999117, -346282, -543313, -755377, -435402, - -7516, -282931, -616328, -329639, 318364, -88584, -169651, 521302, -634045, -171262, - 26844, 104690, -292595, 92342, 123480, 387621, 347355, 236223, 271120, -6979, - -51540, -15569, 96100, 91268, 74088, 2684, - }, - { - -420907, -1261647, -781147, 69256, -475131, 428960, 1763621, -1424855, -2493766, 13422, - -169651, 913754, -2355790, 4937602, -43394740, -13912473, -4047470, -1889786, -451508, 8004746, - 3266323, -2288144, -3013457, 5641440, -721555, -139586, -801011, -1377074, -1490891, 1468879, - -89121, -4095251, -938987, -2884071, 205622, 6669011, 891206, -383863, 1343251, -1336272, - 2656437, 389231, -2426120, 503585, 618475, -1388885, 506806, -642098, 2386928, -459562, - -1227287, -806917, -432181, 587337, -1069984, 1296543, -41876, -264141, 611496, -94489, - 328028, 6442, 254477, -666257, 403190, -592169, -678068, 183073, 425739, -537945, - -719944, -256624, 191663, -388695, 76236, 36507, 125091, -51003, 282931, 347355, - 173409, 377957, -79457, 59056, -225486, -125091, 234613, 93416, 343597, -28454, - 85362, 111669, 70867, 28454, 28991, 8053, - }, - { - 7876433, -77073728, -9789304, -6402723, 3397856, -3218004, -7684770, 2694555, 1589138, 5414880, - 1804960, -5728950, -1438814, 17262010, 20190104, -9036074, -9836549, -7104950, 326418, -859530, - 1146219, -4413616, -2397666, 290447, -743566, 3635690, 571231, -2222109, -7479686, 2207076, - -1377611, 1592896, 627065, -2538863, 2858301, 219043, 2128693, 2209761, -911607, 608275, - 726386, 3440269, 46708, -590021, 70867, -182536, 414464, 814433, -1506460, -296890, - -217970, 606127, -1029182, -1325534, 685047, -759672, 79457, -1050656, -549756, 797790, - -66572, -77309, -548682, -491237, -339839, -812286, 713501, 240518, 62277, 393526, - 316217, 61203, 270583, -418222, -69793, 356482, 27380, 137439, 59056, -5369, - -345208, -18254, 15032, 195421, -160524, -201863, -59056, -137976, 148713, 104153, - 57445, 30602, 26307, -186831, -112206, 135291, - }, - }, - { - { - -1568737, 70054672, -12424267, -7655779, 906238, -337155, 387621, 321586, -30602, 7516, - -227096, -3990562, 2626373, -4039417, -15695421, 1440425, 4748623, 3541738, -6580964, -12259447, - 1380295, -2739116, 1326071, 3277597, -293132, -174483, -3136937, 347355, 3310346, -5191005, - 3812857, -611496, -921807, -4951561, 973884, -113817, 497679, -293132, -2137820, 1855963, - -605054, -1771137, 140123, 208306, -1389959, -289910, -380641, 393526, -994822, 915902, - 12348, -508954, -271120, 515396, -1041530, 286152, -561567, -112206, -182536, 728534, - 870268, -1180579, 366146, 221728, -416075, 24159, 202400, 297427, 399969, 66035, - -285078, -19864, 126702, 355945, -93952, -127238, 288837, 41339, 37044, -247497, - -173946, 177704, -16106, -278636, -29528, -73014, 196495, -77309, 248034, 97174, - -77846, -25233, -181999, 24159, 95026, 105764, - }, - { - -16989816, 32148368, 15684147, 1365800, -856309, 3121904, -1722282, -3153580, 3597035, -200790, - 5735392, 3540664, 1449015, -1547262, -6328098, -2216203, 7304666, 2732136, -11999065, 6904697, - -1515050, -1620813, 536871, 1015760, 3748970, -2958696, -680215, 321049, 34897, 1038308, - 360240, 221728, 1685775, -1736241, 3907883, -1080184, 169651, 1058710, 999117, -193274, - 30602, 740345, -568009, 1781338, 357556, -2377801, -428423, -1122597, 1222455, -234076, - -440234, 1950989, 522375, -5369, 565325, -1141388, -52613, -860604, 313533, 672699, - 170725, -342524, -484258, 166967, -86973, 238371, 153545, -561030, 224949, -248034, - 318901, -355945, -26307, -98784, 33823, 146566, 416612, 36507, -51540, 23085, - 311385, -273267, 275952, 8053, 87510, -133144, 193274, 132607, 238908, -42950, - -140123, -84289, 6442, 38118, -64961, 111669, - }, - { - 6535867, -122060288, -18123152, 16462073, -1128503, -1476395, -680752, -1483911, 94489, -310311, - -4400194, 4634270, -584116, 5759551, 6176163, -644245, 4137127, 4546760, 601295, 342524, - -804233, -3260417, 175557, -1452773, 180389, -637266, 3158412, -1526861, 4885526, 2520609, - -411780, -1612223, -1231582, -2249489, -414464, 1281511, -2264522, -971200, 1020055, -571231, - 3492882, -799401, 246424, 744640, 286152, -708133, 1089311, -1483911, 1101659, 777389, - -655519, -160524, 896574, -982474, -756451, 118112, -1385127, 241592, 234076, -171262, - -281320, 70330, 471910, -185757, -155693, 1086627, -691490, 115964, -47782, -587874, - 454730, 340376, 172336, 412854, -202400, -177704, 435402, -1611, -355409, 298500, - 372052, -286152, 139050, 27380, -72478, -233539, 120796, -83215, 192737, 51003, - -54224, -105764, -18254, -166967, 19327, -9664, - }, - { - -1635309, 12575664, 3247532, 440234, 460098, 399432, -555125, -120259, 21475, -537408, - -1450625, 1009854, 3604551, -9155797, 2004139, 3527242, 3683471, -1703491, -3374771, 1362578, - -1973538, -363462, 437550, -566936, -3234110, -1229434, -653909, 1503775, 99321, -1609539, - 2679523, -1197222, -261993, -1360431, 1326608, 364535, -1825898, 2710661, -721555, 497679, - 409096, 953483, -1386738, 711891, 1693828, 596464, -1505923, 170725, 937914, -322123, - -769336, -55835, 630286, 723165, 70330, -206695, -365072, 491237, -512175, 297427, - -95563, -126702, -221191, 358093, -119722, -764504, 281320, 386547, -60666, -509491, - 112743, -425202, 360777, -61740, -10737, 323196, -70867, 121333, -109522, 235686, - -43487, -267899, 170725, -114354, 139050, -60666, 61740, 122407, -248034, 18790, - -106300, 46171, -47245, -74088, -5906, -31675, - }, - { - 18444200, 119291640, -44928044, 304943, -2225330, -134218, 547608, -480499, -2661806, 1457068, - -412854, -1457605, -2655901, 3714073, 14650670, -2927557, 451508, -3819300, -6601902, -4051765, - 227633, -1673964, 1777043, -3375308, 2289755, -5467494, 1980517, -3084860, 3821447, -971736, - 908386, 702764, 729071, -489626, -1527935, -2448131, 7177964, -2738042, 1897302, -2217814, - 1138703, -47782, -2161979, 10201, 275415, -416612, -2356863, 406411, 477278, 1239098, - 635118, -139586, 537408, -329102, 469762, 639413, -172336, -1383516, 268435, 704375, - -1079647, -112206, -293132, 44560, 508954, -361314, 246961, 105227, 418759, -133681, - -510564, -9664, -41339, 200253, -49392, -42950, 308701, -6979, -191663, 418222, - -16643, -18254, 84826, -136902, -84826, 57445, 31675, 279710, -134755, 212064, - -172872, 149250, -80531, 158914, -198105, 118648, - }, - { - 93952, 346819, -2009508, -635118, -184147, -154082, 561567, -244813, -1702418, 1418413, - -1577327, 462783, -2603824, -6097243, 9104794, 4241817, 1335198, -3987877, 4261145, -24998320, - -9158481, 1115081, -2786897, -10833518, 5141613, -1360431, -8266739, 317291, 3230352, 4438849, - -2086817, -377420, 4544613, -1340030, 1051730, -643708, -1197759, -218506, 958851, 1606318, - 1018981, -1722819, 1414118, 505196, -296353, -421981, 598074, -163746, -814970, 510027, - 55835, 161061, -142808, -348966, 673236, -1456531, 60666, 17717, -39728, 637266, - 192200, -12885, 108985, 482647, -394063, 706522, -311922, 99321, 102005, 110595, - -447213, -122407, -357556, 9664, 134218, 710280, -221728, -334471, 45634, -265214, - -54224, -25770, 106837, 8053, -93952, 59593, 346819, -176094, 266288, -188442, - 198642, 57982, 246961, 18790, -173946, -120796, - }, - { - -17987324, 338925536, 401579, 12380243, -219043, -535260, -495532, -85362, -1581085, 2749316, - 1647120, -29528, -2682207, 89657, 1784559, -9137543, 1850057, -1612223, -3357591, 815507, - 1420024, 1952063, -1512902, -2433636, 1041530, -808528, -3079492, 634581, 798864, 989990, - 1302986, -540092, 1396938, -3497177, -2536715, -756451, -1024887, 1110249, -938450, -882079, - -463320, 1460289, -1019518, -772557, 1382443, -2019708, 2361695, 207769, -136365, -1473174, - -1421097, 151934, 62814, 1215476, 479963, 1732482, -1024350, -950798, 607201, -709743, - 588947, 260919, -446140, 168041, 459562, -27380, 79457, -540092, 549756, -317291, - -327491, 443992, -149250, -467078, 293132, 115427, 140660, 301721, 68719, 88047, - 39192, -129923, -37581, -162672, -31675, 197569, 134755, -53687, 47245, 100932, - -205622, 62814, -41876, 68183, 1611, 13959, - }, - { - 728534, -9173513, 4246112, 115427, 702227, -168041, -548682, -206695, 38118, -25770, - -1069447, 864899, 1954210, -952409, 22335978, 2259690, -6114960, -69256, 5471789, -5024575, - 4991826, 7114077, -3443490, 783295, -3666828, 4760435, 1748052, 3379066, 1946694, -5738077, - 2838437, 450972, -2703682, 2235531, 768799, -31675, -1908039, 369367, 864899, -586263, - 222801, -133144, -564251, -733366, -489626, -639413, 689879, -439697, 898185, 1468879, - 223875, -425202, 1253057, 636729, 370441, 544924, -118112, -88047, -634045, -485868, - 1255204, -185757, 22549, -444529, -654983, -59593, 358093, 192737, -591632, 434329, - -301721, -736050, 60130, -102005, -99858, -362388, 192737, -327491, -47782, 164819, - -522375, 329639, -143881, 56371, 203474, 61203, -59056, -13422, 54224, -60130, - 30602, -61740, -89657, -24159, -82141, -136365, - }, - { - 38427072, -94828048, -31612570, 16940424, -755914, -932008, -3689377, -719407, 1797981, -234076, - -139586, 4085051, 1865090, 1410360, -2926483, 1647657, 3434900, -4993437, -2463164, -588947, - 660351, -711891, 1637456, -1902134, -1394254, -733366, 147640, -1100585, 628139, 208306, - 805843, 1310502, -188979, 1447941, -813359, 2500745, -748935, 809601, 456340, 898185, - -1996086, -1945083, -509491, -45634, -1213328, 697932, 441845, -728534, -602369, 534187, - 154082, -1113470, -217970, -156766, 681826, -478352, -27917, -62814, -172336, -738198, - 71941, -432718, -58519, -262530, -326954, 355409, -81068, -132070, 164283, 156766, - -163746, -203474, -196495, -367757, 64961, -333934, 476741, 61203, -280784, -52613, - 8053, 89657, -335007, 44023, -113817, 168577, 207769, -155156, -23622, 118648, - -62277, 54761, 71404, 85362, -75162, -64425, - }, - { - -1712618, 16100759, 8221105, -5622112, 968515, 2215130, -9780714, -278636, 98784, -254477, - -1676648, -2379412, 2591476, -476205, -3301219, -3775276, 10147397, 2124935, 3867081, 2284923, - -1761474, 75162, 4402879, -6271189, 2466385, -24159, 2030446, -4141959, 2484639, 595927, - -2549063, -115427, 2327336, -394063, -514322, 674847, 2131378, 396211, 852551, 710817, - 985695, 2046015, 1018444, 341450, 235149, -221191, 382789, -580894, 1067836, -583042, - -802085, 271120, 78920, 1187559, -242666, 952946, -63351, 112206, 116501, 736050, - 322123, -92879, 248571, -179852, 259309, -329639, -287763, 164819, -399969, 148176, - -118112, 27917, -224412, 146566, -10201, 32212, 312459, -126702, -85362, 380105, - -47245, -202937, 236223, 34360, -125628, -295816, -32212, 537, 21475, 82678, - 24696, -92342, -63888, 141734, -45634, -25770, - }, - { - 14457934, -80088792, -8420820, 9666361, -715112, -1202054, 263604, 1264868, -3977677, 896038, - 4773856, -1147293, 900869, 1063004, -5456219, 2279554, -614717, 4934918, -858993, -2240362, - 2220498, 2040110, 1501091, 1313723, -368293, 2185602, -1223529, 893890, -924492, -471373, - -2132988, -4572530, 4304631, 1619740, -1244467, 1532230, 2622078, 799938, -1548336, 1285806, - 58519, -1141924, -285078, 816581, -210453, -328028, -471373, -1534914, -243203, -799938, - -56908, -66572, 689879, -1010928, 306016, -175557, 1461900, -153545, 477278, -479963, - 16643, 177704, 101469, 605054, -350577, 164283, -143881, 338766, 69793, -380105, - -125628, -32749, -60130, 130997, 15569, 314069, -206695, -110595, 143345, -186294, - 233539, -57982, -136902, -91805, 63351, 32212, 10201, 133144, -191126, 17180, - -73014, -50466, -47245, -10201, 64961, 12348, - }, - { - -781684, 14994268, -1139240, -446677, 1393180, 374199, 748398, 2014877, -761283, -454193, - 409633, -1095217, -2719251, 27520002, 1722282, 4376035, -3626026, 2315524, 219580, 42413, - -5600101, 12728136, 1845225, -799938, -5583995, -2610266, 6768332, -4066797, 4612258, 2178085, - 1832877, 107911, -485331, -1492501, -497142, -1335735, -1037772, 437550, 993211, 1549946, - -137976, -1575716, 94489, 444529, -772557, 670552, -147640, 1894618, 852551, 256624, - 103079, 154619, 329639, -375273, 750546, 157303, 126165, 302258, 412854, -566936, - 430570, -777389, 84289, -140660, -653372, -23085, -79994, -133681, -224949, -247497, - 634581, 161598, -481573, 1611, 136365, -136902, 77846, -265214, -65498, -39728, - 126702, -291521, -75699, 139050, 204548, 134218, -53687, -9664, 16643, 537, - -26307, -34360, -7516, -210990, 10737, -142271, - }, - { - 10095858, -61251604, -3047816, -7119445, 6380174, -2416993, -2041183, -207232, 1449552, 2818572, - -1380832, 3906810, 1924145, -9157944, 6435472, -4035122, 2578591, -4014184, -2850785, 1934346, - 144418, -240518, 185757, 1529545, -299574, -261993, 607201, -364535, -775242, -1486059, - 2659659, -61740, -4094178, -430570, 1851668, -1595580, 1357210, -870805, 1664837, -346282, - 1081795, 1180579, -1153199, -1352915, 252329, 2681133, 580894, -2262374, 119185, -687732, - 108448, 501437, -1021665, 105764, -450435, -311385, 319438, 584116, -93952, -597000, - -1146219, 552977, -332323, 616328, -324270, 186294, 163209, -157303, -455267, -37044, - -43487, 22549, -375810, -190052, 435402, 96100, -457414, 280784, -315143, 49392, - -266288, -30065, -357556, 142271, 86973, 90731, 11811, -57982, 85362, -137976, - -49929, 76773, 179315, -93952, 32749, 36507, - }, - { - 159988, -1964948, -3563749, -1418950, -284542, -1133335, 261993, -789737, -1695975, -33823, - -2044941, 146029, -3715684, 15681462, -19787988, -1112933, -1056562, 1483911, -1643899, 1167157, - 1219234, -1049046, -2056216, 5641440, -2602750, -1703491, -3714610, 3062849, 2687039, -1303523, - -1323387, -2771328, 2263985, -1663226, -3053722, 2616172, 85899, 904628, 1633698, -1490891, - 1831804, -484794, -1716376, 1236414, 707059, -348429, 1886564, -1838783, 723165, -1098975, - -502511, -877784, -871878, 386010, -1176284, 689879, -150861, 171799, -120796, -247497, - 432181, -797790, 346819, -161061, 374736, -73551, 37581, 179852, 466004, -217433, - -594316, -89657, 580357, -435402, -216359, -74625, 44560, 212601, 156766, -43487, - -179315, 39728, -240518, 56908, -86973, 162135, 228170, -186294, 28454, -25770, - 86973, 29528, -90731, 49392, 45634, -48855, - }, - { - 1996086, -71708240, 1167694, -6324876, 5705327, 7199439, -1481227, 1217623, -535260, 793495, - 2319819, -1475321, 3708168, -8551280, -8589935, 4352950, 3608310, 404264, -1392106, -2327336, - 1220308, -1588601, -562104, -1142998, -2719788, 3277597, 154619, 2799782, -3169149, 2185602, - -527207, 695785, 351114, -3031173, 1056562, -2233920, -518617, 173946, -2078227, 237297, - -734439, 2148021, -754841, -1137630, 777389, 725313, 912144, 1505386, -130997, 161061, - 317828, 1357747, -162135, -413391, 710817, -301721, 519691, 49392, 730681, 333397, - -1190780, -273804, -1074, 226560, 306016, -324270, 572304, -41876, -486405, 198105, - -253403, -351650, 363998, 3758, 118648, 76236, -50466, 281857, 19327, -52076, - -175020, 197569, -236760, 70330, -30602, -147640, 16643, 95026, 42413, 87510, - 76773, 64961, 74625, -169651, -1074, 97174, - }, - }, - { - { - 1403917, 37110664, 10589242, -4982162, -1696512, 1072131, 460098, 1492501, -59056, -1861332, - -48318, -1622961, -1991254, -3741454, -7880728, -1059783, 1952600, 2552284, -2752537, -5737003, - -2306934, -2602213, 1265405, 646393, 2312303, -5231270, -526134, 2006287, 2809982, -3968550, - 2384781, 2397666, -775778, -1808181, -1388885, -154619, -157840, -3260417, -245350, 858993, - -273804, -1417876, 5906, 157303, -1571958, -429497, -639950, 701690, -112743, -23085, - 775778, -252329, -201327, -15569, 69256, -522375, -162135, -525060, -251256, 815507, - -91268, -19864, 354335, -200253, 3758, 205085, 226560, 479963, 39728, 71404, - -292595, 18254, 196495, 38655, -10737, -15569, 122943, 337155, 105764, -326418, - -118112, 147103, 62277, -161061, 30065, -114890, 31675, 92342, 141734, 23622, - 67109, -73014, -40802, 32212, 30065, -9127, - }, - { - 14842333, 23286238, -12345883, 5962489, -1513439, 803696, -839129, -1860258, -689879, 3614215, - 1233193, 5422396, 1103270, -1660005, -2739116, -2425583, 329102, -1807644, 110059, 1530082, - -1074, -287763, -779000, 2799782, 1011465, -515396, -307627, -563178, -878858, 1530619, - 34360, 1169305, 555661, 1229971, 1144609, -103079, 408022, 1333587, -847182, 205622, - 244813, -466004, -220117, 1018444, -64425, -1910187, -712965, 226023, -59056, -270046, - 814433, 1146219, 351650, 536334, 245350, -615254, -596464, -166967, 294742, 158914, - 452582, 64961, -494458, -246961, -5369, 31675, 100932, 56371, 96100, 127775, - -85899, 6979, -28991, -53150, -260382, 237297, 300648, 133681, 132070, 46708, - 17717, -30602, 174483, 73551, 74088, -164283, 42950, 135291, 175020, 103079, - -130997, -38655, 5369, -36507, 18254, 38118, - }, - { - -6492917, -125503776, -5133023, 8125542, 11622718, 1169305, -86436, -1352915, -680752, -2858838, - -2123861, 1608465, 3081639, 5093831, 1319629, 4886062, 1042066, 1110786, 4108136, 2727304, - -2965675, 436476, 598074, -2199023, -134755, 207769, 3694209, 2292976, 1554241, -697932, - 537, -1600412, -1083406, -2122788, -213675, -763430, 897648, -775242, -1021129, 252329, - 2194728, 553514, -82141, 449361, 441308, 143345, -94489, 697932, 719944, -142808, - -607738, -100395, 683437, 8590, -974421, -274878, 42413, 387084, -399969, 14496, - -777926, 465467, 62814, 494458, 312996, 274878, -231391, -62277, -282394, 58519, - 222801, 204011, 309238, 176094, 83752, -64961, 67109, 45634, 47782, 17180, - 135291, -1611, 210453, -46171, -283468, -97711, -22549, -49929, 104690, 4832, - -59593, 16106, -60130, -23622, -45097, -20938, - }, - { - 1349694, 9603010, 1471026, 1424319, 486405, 63351, 399432, -375810, -391916, 129923, - -1037772, -729608, 1739462, -3306588, -1104880, -2665564, 4680441, -272730, -4080756, 2362769, - -1840930, 1446330, 1955821, -2323041, 985158, -2806761, -652298, 448824, -611496, -751082, - 760746, 518080, -117575, -221728, 319438, -309775, 54761, 399432, 832150, 253940, - 434865, 392453, 646929, 79457, 1396938, 463856, -607738, -340913, -126702, 372052, - -1173063, -236223, 1311039, 182536, 329102, 39728, -241592, -53150, -83752, 92342, - -478352, -175557, -183073, 138513, -50466, -336618, -62277, 410706, -51003, -213675, - -353261, -103616, 60666, -219043, 255014, 201327, 117575, 28991, -13422, 152471, - -62277, -70330, 3221, -23085, 69256, -15569, 36507, -11811, -78920, -46708, - -41876, -4295, 11274, -34360, -53150, 89121, - }, - { - -5253282, 94073744, 3556770, -7298223, 161061, -183073, 388695, 518617, -1494649, -226560, - 1854352, -1759326, -2173254, 1582696, 8672613, 2289218, -4978404, -6058052, -847182, -2121714, - -146566, -157840, 472983, -1517197, -1672890, -2856690, 632434, 983548, -571768, 588411, - 661425, -638340, 1524177, -459025, -418222, -1948305, 972273, 1241246, 247497, -1048509, - -519154, -693100, -498216, -1234266, 1299765, -155693, -1024350, -360777, 6442, 1076963, - 1137630, 543850, -159451, 259309, 405874, 563178, -496606, -855235, 201863, 396748, - -712428, -221191, -128849, 143881, 159988, 346282, -406411, 177167, 363998, -48855, - -314069, -217433, 48318, 78383, 33823, -13422, 206695, -48855, 13959, 235149, - 128849, -4832, -48318, -165893, 47245, 13959, 105227, 92342, -139586, 158377, - -76236, 120796, -53687, 34360, -102542, 31139, - }, - { - 176094, 1187022, -834834, -1020592, 149250, -217433, 410706, -226023, -731755, -254477, - -373662, -1010928, -2332704, -3736085, 3716221, 3058554, 5523328, -4395899, -287763, -23507966, - -1006096, -3390877, -919123, -7809861, 162672, 1275068, -3180960, -2760053, 2644089, 1678259, - -1174674, 1948305, 1063541, -2684, 239444, -389768, -541166, 798327, 1017907, 869194, - 119185, -55835, 412854, 376347, 170725, 6442, -278099, 432718, 175020, 221191, - -477278, -224949, -243203, -431644, 340913, -877247, 121333, -192737, 51003, 522375, - 373662, 12348, -20938, 539018, 34897, -30065, -156229, 171262, -51003, -355409, - -242666, -13422, -237834, 31139, 38118, 497679, 164819, -50466, -392453, -98784, - -13959, 32212, 16106, -67646, 53150, 56908, 149787, 19864, 127238, 49929, - -39192, 130997, 114354, 14496, -29528, -8053, - }, - { - 31036508, 234309264, 27545772, 7573638, 2987150, 63351, -448287, -322659, 646393, 577136, - 854162, -730681, -2102387, -1633161, 752156, -1715839, -2601677, -895501, -1672890, -671089, - 575526, 86436, -441308, -441845, -368293, -41876, -767725, -115964, 23085, 63888, - 1225676, -1174137, 555125, -470836, -2742874, 478889, -77846, -278636, -1411434, -1132798, - 26307, 230318, 576599, -1266479, -668404, 1326071, 660351, -751082, -122407, -1174674, - -656593, -625455, -102005, 1147293, 685047, 485331, 335544, -666257, -100932, 239981, - 273267, 0, -424665, 223875, 190589, 386010, 187368, -379031, 105764, -2684, - -168041, 56908, -102542, -108448, 171262, 179852, 140660, 52076, 146029, 22012, - 69256, -22549, -12348, -81068, -83215, 235686, 46708, 17180, -16106, -53150, - -18254, -35433, -102542, 28991, 30602, 34897, - }, - { - -528818, 1207423, -3685619, 1983201, 682900, -376883, -146566, -599685, 584652, -81604, - -1014686, 1273995, 387084, 2252174, 9578851, 564251, -1925756, -3557307, 2935610, 4515085, - 246961, 1351841, -3058017, -769336, -2046552, 1508607, 5450314, 5255966, -1801739, -2820183, - 2762201, 1868848, -1336272, 230854, 294742, -409633, 637803, -267362, 750009, -353261, - -703301, -511101, -315143, -904628, -624918, -245887, 162135, 135291, 1078037, 964757, - -594316, 906775, 617402, 431107, 344134, 889058, 459562, -266825, -446677, -200790, - 518617, 108448, -354335, -74088, -390305, -311922, 91805, -63888, -306553, 208843, - -160524, -279173, -344671, 71404, -161061, -295816, 81068, 71941, -97711, -42413, - -130460, 64425, 15032, -128849, 145492, 11811, 38655, 2684, 108985, 4832, - -73014, -2684, -42413, -5906, -42413, -71941, - }, - { - -30771830, -36411124, -1203128, 10679436, 187905, -95563, -3057480, -1446867, 83215, 1491427, - 1274532, 711891, 1493575, -3321620, 2617783, 2249489, -310848, -1745367, -2409477, -381178, - 403190, 835371, -1252520, 528818, -862215, -1301912, -107911, -350040, -332860, 1789391, - 428960, 476741, 1276679, 615254, -643708, 1512902, -683437, 697932, 488016, -602906, - -2778307, 1746441, -755914, -1268089, -685584, 151934, 1194538, -722628, -1190243, 100932, - 687732, -450972, 357019, -545998, -13959, -37044, -498216, 179315, -630286, -482110, - -638876, 97711, -233539, -122943, -482647, -286689, 156229, 233002, 84826, 82678, - -274341, -264677, -40802, -410169, -16106, 34360, 220117, -71941, -149250, -201327, - 110595, -118648, -120259, -35433, -150861, 48318, 91805, 98247, 24159, 96637, - 33823, 13422, 60130, -29528, 57982, -537, - }, - { - 1624571, 16567836, 3128884, -1225676, -998580, -864362, -4284767, -1200980, 272194, -698469, - 569083, -2855617, 752156, 1810866, -5747740, 2021319, 1318555, 4310000, 5777268, 1166084, - -1896765, 897648, 196495, -678068, 2196339, 189515, -273804, -1888712, 676994, -1140851, - 1560147, -2200634, 1631014, 170725, 351650, 889595, 1636383, 640487, 1864016, 805306, - 1004486, 1777580, 1819456, -626528, -17180, -211527, 133681, 213675, 75162, 145492, - -396211, 200253, 534723, 981937, -263067, 525060, 553514, 96637, 377957, 501437, - 44560, 242129, -78920, 33823, -291521, -344671, -134218, 32749, 102005, -42413, - 163746, -234076, -212064, 31675, -18254, 38655, 176094, -117575, -108985, 25233, - -4832, -16106, 146029, -55298, -63888, -52613, -139050, -68719, -61740, 76773, - 27917, -26844, -10201, 43487, 19864, 5369, - }, - { - -13258564, -51739860, 3250753, -594316, 3000572, -1516124, 2423435, 421444, -718333, -630286, - 921807, 2702071, 738734, 118648, -791348, -1496259, 5464809, 1983201, -2029372, 996432, - 772020, 810675, 1838246, 804233, 1054951, 787590, 231928, -624918, 156229, -1795296, - -1357210, -2032056, 1161252, 1408749, 295816, 1401770, 820876, 249108, -587337, 1677185, - -54761, -186294, -665183, 502511, -632434, -607738, -217970, -832150, -628139, -541166, - 134218, -112206, 158914, -658204, -19327, -96100, 274341, 935766, 160524, 3758, - -14496, -109522, 214212, 248034, -86973, -35433, 16106, -40265, 191126, -260382, - 22549, -213138, 40265, 232465, 108448, 209917, -195421, -5906, 86436, -25233, - 63888, 140123, -212601, 64425, -61740, 59056, 28991, 13959, -70867, 54761, - -73014, -13422, -89657, -57445, 93952, 25233, - }, - { - 471910, 11603928, 1903744, -591632, 1787780, 345208, 603980, 862215, -19327, 100395, - -177704, 842350, 7575786, 9833864, 4037806, 62277, 700080, 2267206, -374736, -2784750, - -682900, 7953743, 1904281, -126702, -1466731, -2180233, 1279363, 2368675, 2552284, 3952444, - 745177, -406411, -1432372, -715112, -934155, -808528, -423591, 18254, 346819, 1705102, - 380641, -1036698, -457951, 484794, 286152, -382789, -28454, 1677722, -495532, 987306, - 643171, 2684, 296353, 230318, 292058, 164819, 69256, -167504, -170725, -66035, - -509491, 57982, -66035, -218506, -564251, -124554, -226023, -316217, -183073, 105764, - 428960, 99858, -145492, 162135, -160524, 75699, -30602, -137976, -116501, -85899, - 24696, -112206, -26844, 87510, 66035, 59593, -35433, 12885, -15569, -60130, - 34897, -3758, -95026, -64961, -64961, -77309, - }, - { - -11075110, -36239324, -5211406, 2196339, -478352, 2046015, 3609383, -310848, -361314, 2253247, - 1938641, -862215, -3469260, 4701916, 5395553, -1907502, 151398, -2544768, -3167002, 1473174, - 1192390, -708133, -413927, -329639, 679142, 535797, 1288490, 25233, -1124208, -823560, - 2789581, -1728188, -1055488, -853088, 1168231, 307090, -910533, -412854, 1930051, 1164473, - 118112, 133681, -102005, -2317135, -1025960, 1408212, -38655, -967441, -443455, -532039, - -49929, -102542, -72478, 149250, 542240, -463320, -152471, 180389, 17180, 73551, - -592169, -230318, 256624, -18254, -133681, -91268, -11274, -73014, -136902, 79457, - -204548, 24159, -140123, 113817, 230318, 98247, -345208, -76773, 114890, 107911, - -326418, 3221, -272730, 64961, 129923, 45097, -125091, -85362, -88584, -94489, - 26844, -41339, 149787, -23085, 79457, 114890, - }, - { - -255014, -1735704, -3607773, -2685428, 1270237, -559420, -1273458, 597537, -877247, -308701, - -1820529, -1614371, -2647847, -12281996, 30106110, -2981244, -3222299, 1498944, -2335925, -2141578, - 286689, 1094680, 2455648, 676457, -67646, -3561065, -1517197, 3252364, 2516314, -1832877, - -1391569, -569083, 99321, -770410, -1613834, 92879, 915902, 517007, 1261110, 6442, - -318364, -362925, 215285, 904091, -317291, 184684, 1017907, -307090, -363998, -820339, - -513249, -175557, -514322, -693100, -216359, -259309, -224949, 608275, -489626, -151934, - 294742, -270046, -164819, 66035, 360240, 115427, 88047, 233539, -14496, 21475, - -209380, 79457, 13959, 27380, -192200, 48318, -133681, 185220, -21475, -33286, - 1611, -134218, -175557, 1074, 30065, 28454, 33823, -59056, -43487, -66572, - 90731, 86436, -33286, 16106, 82678, -88047, - }, - { - -8037495, -48314624, -6953552, -1264331, 3590593, 6452115, 4220342, 1413581, -2535641, -983548, - 1483374, 4555887, 1238024, 1410360, -19333796, 2241436, 7215008, 450435, -1532230, -913217, - -75162, -389231, -873489, -1030792, -435939, 631897, 171799, 2996814, 108448, -1117228, - 24159, 1509144, 428960, -2487323, -563714, -1607392, -766115, -934692, -238908, -971736, - -284005, 925565, -456340, -871342, 501974, 485331, 715649, 843961, 731755, -119722, - 823023, 358630, 560493, 513785, 260919, -32749, 195421, 493384, 552977, -216896, - -601832, -304943, -229244, 172872, 352187, -8053, -537, -36507, -283468, -57445, - -194347, -285078, 108985, 311385, 175020, -183610, 275415, 127775, -133681, 67646, - -102542, 129923, -194347, -7516, -44023, -16106, -7516, 136902, 53150, 87510, - 151934, 32749, -27917, -73551, 101469, 13959, - }, - }, - { - { - 305480, 6346351, -7530152, -746251, 881542, -139050, -550830, 329102, 115427, -1498944, - 235686, -69793, -608275, 17717, -1053878, 607201, -1216013, 927713, 8053, -302795, - 1327682, 2057289, 1717450, -76236, 3436511, -3644280, -1118839, 377420, 1151588, -3705483, - 3320010, 1268089, -1811403, -1158031, -830002, 714575, 1228361, -1597728, 770410, 220654, - -5369, -275415, -166430, 357019, -264677, 462783, -620623, 504659, 2684, -517544, - 245350, -394063, 7516, 150324, 371515, -196495, 70867, -343597, -252866, -9127, - -500901, 346819, 434329, -55298, 79994, 177167, -25233, 206158, -153008, 164819, - -42413, -37044, 144955, -157840, -57445, 33286, -6979, 124554, 180926, -70867, - 42950, 46171, 5906, -28991, 228707, 15032, -28454, 4832, 36507, -13959, - 32212, 1611, 31675, 64425, -1611, -60666, - }, - { - -10881300, 16073378, 5801427, 3248606, -2984466, -1184337, 674847, -282931, -1864553, 790811, - -2845953, 1927904, 1035624, -244813, 1048509, -1133335, -2854543, 1759863, 5828271, -1169305, - -938450, 648003, -2310693, 1315871, 570694, 543313, 328565, -1047972, -925029, 807454, - -402116, 1246077, 188442, 398358, 125091, 846109, -1297617, -77846, -1042603, 352187, - -620086, -675921, 5369, 855772, 382789, 195421, -203474, 185220, -231391, -31139, - 585189, -199716, -157303, -193274, 19327, -28454, -289373, 316754, -68719, -281320, - 39192, 290984, -67109, 51540, 134755, -210453, -77846, 209917, 75162, 64425, - -85899, 292595, -83752, -47245, 23622, 52076, 96637, 99858, 108985, -115964, - -112206, 55835, 21475, -42413, -1074, -73014, -56371, 68719, -55835, 77846, - -85362, -4832, 4832, -14496, -42950, -30065, - }, - { - 3521873, -80752904, 15613280, -8490613, 1575179, 246424, 28454, -231391, -442919, -18790, - 410706, 219043, 641561, 2076080, -3054796, 542777, -3421478, -907312, 2955474, 2183454, - -1739999, 1130113, 1257889, -949188, 2099165, 670015, 2176475, 1150514, -1496259, -2498060, - 832150, 1236414, 1013612, -37044, -375810, -1300301, 919123, -1015223, -370978, -138513, - 490700, 25770, -234613, -11274, 92879, 838056, -175557, 340913, 74088, 324807, - 148176, -42950, 54224, 332323, -113817, 25233, 81068, 230318, -326418, 237297, - -662499, 204548, -238371, 162672, -54224, 229781, 27917, -41876, -191126, 36507, - -34360, -155156, 85362, 54224, 144418, -163746, -41339, 133144, 195958, -71941, - 83752, 76236, 73551, 61740, -101469, -82141, -57445, -50466, 79994, 45634, - -96100, 62814, -33823, 25770, -36507, 8053, - }, - { - -767725, 5258114, -254477, 188979, -62277, -285615, 281320, 202937, -259846, 91805, - -161598, -656593, 1764695, -3255048, -2224793, -3315178, 45634, 1101122, -1747515, 1138703, - 110595, -239981, 1322850, -863288, 823560, -1993402, -260919, 1418413, 887448, 463856, - -285078, 715649, 674847, 462783, 546535, -118112, 358093, -871342, 194884, 678605, - 461709, 6979, 781684, -56371, 114890, -50466, 149787, -357556, -345208, 912144, - -296353, -389231, 637266, -418759, -206695, -537, -93952, -220117, 98247, 175557, - -337155, -37581, -162135, -170188, -83752, 11274, -150324, 17180, -148713, 104153, - -71941, -188442, 13422, -17180, 208306, -99321, 11274, 17717, 82141, 79994, - -12885, 16106, 71404, 33823, 70330, 8053, -43487, -52613, 3758, -7516, - -30065, -26844, 10201, 41876, -32749, 77846, - }, - { - -5119601, 75573168, -2239826, -4701916, -383863, 154619, 257698, 1379221, 456340, -32212, - -762357, -2098629, 157303, -204548, 2635499, 676994, 1887101, 452582, -433255, -1085016, - 790811, 727460, 55835, -921807, -1674500, -484258, 645856, 1082869, -1470489, -392990, - 615791, -824097, 212064, 1611, 1123671, -1418413, -550830, -99858, 204548, 405874, - -434865, -867583, 88047, -172872, 1209033, -69256, 438087, 134218, -324807, 429497, - 427886, -311922, -380105, 631360, 231928, -12348, -137976, 88047, 97711, -48318, - -147103, 113280, -79994, 214748, -89657, 186294, -354872, -123480, -68183, -143345, - -27380, -50466, -70330, -182536, -57445, 33823, -47245, 79994, 16643, 9127, - 74625, 18790, -155156, -20938, 44560, -83752, 30065, 35970, -104690, 91268, - -84826, 51003, -41876, 40265, -70867, 54761, - }, - { - -375810, 1986959, 3567507, 220654, -309238, -341987, 95026, -67646, -520228, 81604, - 584116, -244276, -493384, -1735704, 499827, -2034741, 4949950, -2018098, 3482682, -17820894, - 3169149, -1665374, 2888366, -638876, 1678259, 532576, 869731, -388695, -230318, -893353, - -776852, 805843, -1949915, -657130, 529355, 313533, 603980, 720481, 154082, -177167, - -461709, 37044, -954020, -365609, -139586, 350040, 128849, 417686, -36507, -103616, - -245887, -282394, 158377, -314069, -33823, -126165, 436476, -375810, 105764, 125628, - 97711, -122407, -213675, 268435, -197032, -24696, -71404, -38118, -103079, -78383, - -105227, 233539, 47245, 12348, -164819, 146029, 31139, 86973, -140123, 91268, - -119185, 37581, -40265, -32212, 9664, -50466, 18254, -33286, -5369, 65498, - -66035, -33823, -56371, 12348, -16643, -4295, - }, - { - -32202592, 102693744, -7697119, 2495913, 232465, 300111, -256087, 467615, 1060857, -216359, - 75699, -479963, -1318018, -1198833, -99858, 483184, -746251, 353798, 875636, -42413, - 485868, 183610, 223338, 295279, -302795, 372052, -89657, 274878, -59593, -1156957, - 182536, -1723893, -83215, 589484, -365072, 2271501, -9664, -690953, -727997, 62814, - 64961, -762894, 1096827, -554051, -615254, 1232119, 44560, -1130650, 323733, -56908, - 51540, -338229, -618475, 478352, 1611, -462246, 186294, -284542, -7516, 277025, - 87510, 90731, -251792, 35433, -55298, 57445, 115427, 13959, -23085, 113817, - 177167, -18254, -173409, 96637, 166967, 41876, -71941, -87510, 24696, -68183, - 152471, -21475, 14496, 73014, -28991, 32212, -41876, 81068, 8053, -40802, - -13422, -11274, -68719, 55835, -27380, 3221, - }, - { - -454193, 4632659, -1199907, 535797, 539018, -273267, 532576, -110059, -38118, 328028, - -404264, 475131, -1398549, -972810, 1852742, -2989297, -1139240, -3582540, 1111860, 2581812, - -1488206, -1589675, -1160715, 913754, -860067, 2005750, 677531, 789200, -1272921, -1516660, - 1750736, 874563, -1823214, 131533, 184684, -717796, 1068373, 154619, 407485, -318364, - -599685, -363462, 475131, -273804, -274341, 77846, -61203, 639950, 399432, 146566, - -557809, 780073, -53687, -233539, -199716, 154619, 31139, 33823, 230854, -82678, - 207769, -20401, -28454, 196495, 45097, -163746, -188442, -63351, 43487, 3758, - -17717, 174483, -112206, 114890, -133144, -151398, 11274, 85362, -43487, 5369, - 88584, -57982, 21475, -192737, -14496, -26844, -17717, 62277, 3758, -56371, - 22012, -16643, -35970, 2684, -9127, 33286, - }, - { - 19002010, 24812562, -7639673, 5693516, -795643, 735513, -625455, 304943, -660888, 466541, - 287226, -1838783, -134218, -5144297, 3506841, -389231, -419833, 1979980, -952946, -387621, - 794032, 931471, -2003602, 1479079, 598611, -534723, 807454, 948651, -562104, 924492, - -383863, -66572, 732292, 588947, -816581, 728534, -687732, -34360, 115427, 561030, - -2587718, 1258425, -141734, -762894, -349503, -972810, 600759, 836982, -24696, -535260, - 26844, -455803, 561567, -277562, 417686, 617402, -341987, 40802, -217433, 169651, - -369367, 181462, -241055, 15032, -165356, -310311, 139050, 318901, 6442, -98247, - -122943, 44023, 153008, -205085, 108985, 228170, 10737, -3221, 63351, 15032, - 46708, -66035, 32749, 49929, -79457, -83752, -38655, 109522, 23622, 49392, - 38118, -9664, 13422, -127775, 112206, 1611, - }, - { - -1211718, 9880035, -2486786, 873489, 469762, 845035, 3007014, 780610, 9664, -253940, - 2488397, -722628, 854699, 519154, -6765111, 2664490, -2081449, 702227, 2348810, 959388, - -496069, 2093797, -1486596, -1476395, 481036, -59056, -379568, -997506, 149787, -1810329, - 2940979, -2331630, 446677, -92342, 19864, 270583, -57982, -542240, 1348083, -140660, - -60666, 92879, 741956, -461172, -333397, 216359, 39192, 673236, -92879, -418222, - -161598, 147103, -32212, 279173, -234076, 40802, 280247, -256087, -153545, 120259, - -85899, 11811, -191663, -47245, -12348, -43487, -30065, -17180, 25770, 125091, - 261456, -102005, 0, -121333, -24696, 87510, 42950, -82678, -29528, -70867, - 37044, 0, 78383, -13959, 42413, 51003, -56371, -18254, -11811, 6442, - 35970, -30602, -537, 1074, 39728, 33823, - }, - { - 10682657, -21609592, -91805, -3577708, 670552, -3440269, 2386391, 952946, 883690, -7516, - -245350, 1495186, 216896, -49392, 1614908, 1324461, 7248831, 2272575, -1137093, 470836, - -69793, -228170, 635655, -855772, 967441, -26307, 923418, -942208, -819265, -427349, - 711354, -18254, -7516, -139050, 435939, 915365, -518080, 646393, -5369, 921807, - -44560, 948114, -506269, 699543, -38655, 151398, 255014, -30602, 432718, -391916, - 125091, -415001, -6442, 132070, 116501, -246424, -370441, 326418, 207769, 97174, - -4295, 131533, 95026, -26844, 39728, 90731, 62814, 32749, 193274, -19864, - 136365, -183610, -53150, 152471, 14496, 3758, -75162, 74625, -6442, 22012, - -26307, 98247, -70867, 2147, 16106, 1611, 28991, 3221, -2147, 31675, - -55835, 34897, -8590, -30602, -9127, 537, - }, - { - -77309, 7307350, -1993939, -1846299, 832687, 773094, -246424, -164283, 98247, 745177, - 138513, 1266479, -334471, -5185636, 2856153, -727460, -930934, -202400, 26844, -1478543, - -1865626, -293132, 310848, 1057099, 995359, -277562, -754304, 1309428, 291521, 1246614, - 587874, -1135482, -44023, 362388, -258772, -370441, 229244, -187368, -74088, 641561, - 379031, -306553, -443992, 540629, 250182, -548145, -486405, 363462, -953483, 205622, - 126702, 60666, 214748, 226560, -39192, 27917, 150861, -239981, -529355, 70867, - -638340, 256624, 310311, 191126, -420907, -117038, 168041, -208843, -86973, -145492, - -80531, -152471, -82678, 206158, -191126, 98247, 99858, 27917, 29528, 26844, - -53150, 1074, 23085, -26307, -71941, 4832, -34360, -46708, 30065, -58519, - -34897, -13422, -1074, 64425, -49929, 5369, - }, - { - 7370701, -3212099, 1044751, 5448166, -3420942, 631897, 4619238, -954020, 198642, -319438, - 60130, -1021129, 773631, 10921028, 2946348, -2451353, 183073, -162672, -721018, 194347, - 1779727, -852551, -905164, -555661, 532039, -1103270, -521302, -308164, 668404, 481573, - 1505923, -1130113, 1272384, -214748, -412317, -352724, 296890, 80531, 491237, 296353, - -791348, 48318, 433792, -1139240, -1093606, 396211, -332860, -127775, -244813, -147103, - 377957, 42413, 205085, 175020, 608812, 75699, -212064, 86973, 17717, 61203, - 70330, -31139, 415001, -129923, 162672, 168577, -104690, 24696, 63888, 181462, - -8590, 74625, 17180, 133681, -102005, -22012, -95026, -133681, 77846, 92342, - 19864, 148713, -124554, -39192, -30602, 97711, -49929, -89121, -16643, 1074, - 74088, -5369, 67109, 32212, 4295, 46708, - }, - { - 295816, 2328409, 297963, -1358283, 1501091, 15569, -517007, -159988, -499290, 381715, - -446677, 1385664, -1968169, -7023882, 41564548, -1389959, -2415382, -105764, -1286343, -2328409, - -3640522, -1763621, 1807108, 171799, 877247, -2399276, 905164, 59593, 290984, -265214, - 86973, 1105417, 700080, 1074, 429497, 27917, 945430, 15032, -241592, 498753, - -369367, -50466, 477278, 89121, -467615, 252329, 312459, 209917, -158914, -95563, - -106837, 324807, -55298, -499827, 386547, 358093, -326418, 334471, -415538, -15569, - 302258, -82141, -147103, -93416, 73014, 22012, -338766, -57982, -28454, 37044, - 32212, 206695, -137439, 349503, 20938, 8590, -46171, 33823, -62277, -25770, - 51540, 53687, -39192, -11811, 49392, -62814, -44560, -90731, 96637, -52076, - 59056, 61740, -2684, -25770, 51540, -34360, - }, - { - 8680129, -18975166, 1437740, 5306432, 765578, -727997, 2700998, 2150168, -938987, -366146, - -409633, 4622459, -1633698, 4973036, -11111080, -871878, 2810519, -276489, 762894, 704912, - -195421, 18254, 568009, -202400, 54761, 612570, -1054951, 796180, -718333, -1796370, - -267362, 388695, 68719, -1083406, 601832, -15032, 226023, -576599, 418222, -184147, - 37044, -28991, -363998, -689342, -41876, 197032, -318901, -383326, 581431, -93416, - 497679, -521302, -154619, 335544, 273804, 56371, -73551, 273804, 449898, -253403, - -48318, 205085, -96100, -37044, 95563, -110595, -99858, -53687, -183073, -15569, - -11811, -72478, 37044, 100395, 156229, -91805, 111132, -63351, -73551, 89121, - -96637, 96100, -74088, -10201, -70330, 20938, 55298, 5369, 70867, -27380, - 59056, 1611, -67109, -11811, 61203, 2147, - }, - }, - { - { - -1592359, -9451612, 4553202, 1876901, 469225, -918586, -628139, -422517, 360777, -914291, - -700617, 503048, 280784, 479963, 194884, 1110786, -1953673, 602906, 1215476, -179852, - 1707250, 344134, 787590, 2097555, 35433, 186294, -1248762, -374199, -1345399, -1088774, - 1310502, 1119913, -2111513, -551903, -162672, -98247, 250182, 368293, 1228898, -202400, - 153545, -76773, -68719, -52613, 468688, 116501, 116501, 164819, -376883, -62277, - 173946, -353798, -249108, -37581, -86973, 277025, -1611, 60666, 30602, -540092, - -121870, 102005, 93416, 242129, 537, 88584, -42413, 10737, -128312, -18254, - 122407, 33823, 26844, -95563, -81068, 119185, 15032, 6442, -34897, 50466, - 42413, -1074, -55835, 18790, 76773, 48855, -3221, -24696, 26307, 62814, - 10737, -16106, 44023, 54224, 1074, -5369, - }, - { - 9361418, 6491306, -7888781, -424665, 1214402, -634045, 521302, 193810, 192200, -1563368, - -945967, 277025, 220654, 291521, 1282585, -1212255, -607738, 3354370, 2498597, -127775, - -957778, 292595, -950798, 386010, 331786, -209917, 406948, -571231, -541166, -277562, - 815507, 562104, -120796, 500901, -493384, 1381369, -937377, -1093069, 325344, 325881, - -817654, 76236, -149250, 104690, 503048, 346819, 450972, -121333, 260382, -100395, - 357019, -440234, -387621, -207769, -39728, -84826, -82678, 221191, -340376, -181462, - -100932, 61203, 134218, 55298, 20938, 5906, -49392, -23622, 61203, -8590, - 2147, 183610, -8590, -221728, 189515, 91805, -3758, 182536, -16106, -103616, - -10201, -23085, -70330, -24696, -24159, 52613, -47782, -9664, -6442, -29528, - -31139, -46708, -5369, -23085, -8590, -22549, - }, - { - 659814, -51977156, -237297, -12111808, -1312649, 772557, -555661, -10201, -201327, 1392106, - 453656, 1569274, -1017370, 1175210, -748398, -911070, -3328063, 445603, 1612760, -619012, - 1330366, -868657, 568546, 49392, 2351495, 1166621, 688269, 418759, -1743220, -886374, - 998043, 1369558, 758062, 530965, -446677, -811749, 900869, -1479079, -478352, -52076, - 606127, -600759, -236760, -151398, -354335, 852551, 445603, -179852, -265214, 485331, - 131533, 236760, -384936, 264677, 394063, -111132, -409633, 13959, 148713, -59593, - -315680, -175020, 54224, -183610, -208843, 168577, 33286, 20938, -107374, -25770, - -129386, -198105, 75699, 74088, 29528, -120259, -17180, 108985, 133144, 42950, - 67109, 27380, -23622, 57982, 54761, -68719, 537, 19864, 29528, 41339, - -62277, 12348, -8053, -9127, -34360, 37044, - }, - { - 486405, 3877819, -85899, -751082, -51003, 35433, 34360, 33286, 66572, 64961, - 22012, 83215, 267362, -2218888, -5338645, 3047816, -867047, -2003065, 1782411, 802085, - 32749, 457951, 825171, -147103, -1672890, -435939, 293132, 899796, 386010, 669478, - 68183, 857920, 520228, 178241, 509491, 321049, 210990, -1016834, -307090, 680752, - 399969, 380641, 47245, 80531, -8590, -235149, 239981, -406948, -11274, 202400, - 536871, -289910, -55835, -95563, -397284, -17180, 43487, -192737, -35970, 321049, - -133681, 81068, -13422, -332323, -162672, 163746, -46708, -246424, -86436, 57445, - 88047, 18790, -49392, 48318, 67646, -38655, -51003, -38118, 42413, 42950, - 25233, 41339, 22012, 69256, 47245, 72478, -52613, -60130, 5906, -56371, - 26844, -20938, -23085, 3758, 537, -19864, - }, - { - 11330661, 46231028, 3159485, -2139968, -50466, -81604, 179852, 1054951, 1006633, -64961, - -1938104, -1770063, 355409, -555125, 2949569, 596464, -1093069, 4179003, 963683, -137439, - 456340, 944893, -1183800, 94489, -485868, -551366, 929324, -742493, -475131, -399432, - 470836, 209917, -150324, -439697, 222801, -528818, 561567, -130460, 417686, 457951, - 124554, -825171, -483184, 949188, 187905, 113280, 454193, -257161, 35970, 332860, - -282394, -197569, -153008, 564788, -199179, -215285, 176094, 297963, -138513, -41339, - 104690, 89657, -303332, 232465, -91268, -68719, 97711, -203474, -200790, -214212, - 59056, -4832, 73014, -148176, -108985, 71941, -127775, 108985, -12885, -50466, - 0, 13422, -135291, 34897, 44560, -53150, -25233, 73551, -57982, 3758, - 2684, -6442, 7516, 28991, -28991, 18790, - }, - { - -44560, 3015067, 1247151, 255014, -159451, 21475, -360777, -97174, -375273, 249108, - 175020, 95026, 363998, -421444, 1371168, -238371, 162672, 1072131, -1288490, -14586783, - 2899103, 406411, 672162, 3294777, 498753, 532039, 1084479, -1035087, 227633, -1643899, - 619549, -354335, -1239098, -1065689, 657130, 57982, 599685, 222265, 374736, -193274, - -475131, 22549, -1089311, -306016, -409633, 181462, 2147, 403190, 294742, -468151, - 173409, -573378, 292058, -49392, -102005, 69256, -115964, 28454, -79457, 27380, - 200253, -178778, 11274, 104153, -235686, -2684, 66035, -24159, -4832, 93952, - -15032, 25233, 114890, -60666, -102005, 13959, -62277, -27917, 21475, 13422, - -79994, 17717, -16643, -13959, 44560, -24696, -45634, -32749, -38655, -35433, - 76236, -22549, -109522, -24159, -15032, -22012, - }, - { - 24787330, 7007239, 28991, 3714610, 9664, -84289, 259846, 355945, 47782, -235149, - 464930, -68719, -715112, -342524, -1153199, 461709, -313533, 400506, 826781, 398358, - 525060, 587337, 541703, 158914, -548682, 398895, -450972, 333397, 221191, -722091, - -392990, -1234803, -306016, 158914, 263067, 754841, 867047, -1180042, -137439, 361851, - 61203, -508417, 61740, 334471, -3221, 236223, 298500, -667867, 432181, 151934, - -31139, -264677, -184684, 122407, -31675, -590021, -93416, -11274, -45634, -23085, - 78383, 75699, -82678, 11274, 12348, -197032, -109522, 198642, -20938, 142808, - 53687, 203474, -168041, -54761, 161061, 46171, -34360, -115427, 21475, 20401, - 80531, -13422, -49392, 7516, 45634, -67646, -19864, 86973, 63351, -3758, - -43487, -22012, 29528, 54224, 7516, -39192, - }, - { - 339839, 273267, 844498, -431644, 498753, 129923, 166430, 386010, -507343, -85899, - 199716, 346819, -810138, -750009, -2724083, 304406, 349503, 1256278, -798864, 926102, - -1229434, -416612, 1129040, -197032, -455267, 1396938, 857383, -1255204, -1835562, 1094143, - -825171, 519154, -839129, -282394, 473520, -176094, -382252, 984084, 165893, -426276, - -419833, -273267, 234076, 352724, -213675, 238908, -365609, 693637, 483721, -537, - -175020, 45634, 154082, -187368, -264677, -317828, -319975, 363462, 321586, -35433, - 78920, -133144, 325344, -108448, 73014, -17180, -110595, -13422, 137976, -104690, - 11274, 35970, -6979, 180926, -133144, -107374, -2684, -35433, -63888, -31675, - 75162, 25233, 2684, -45634, -125628, 4295, -29528, -537, -19864, -64961, - 11274, -18790, -53150, 6442, 7516, 30602, - }, - { - -6716792, 54621248, 550293, 2072859, 1233193, -461172, 217970, 231928, -48318, -170725, - -653372, 14496, -242129, -2335925, 913217, -386010, 374199, 919123, -394063, -695248, - 358630, 532576, -86436, 465467, 543313, -233002, 169114, 1806034, -862215, -159988, - -91268, 572841, -512712, 294205, -395674, 202937, 758599, 439697, -1132261, 144418, - -1063541, 269509, -595390, -193274, 0, -740345, -665183, 934155, 660888, -105227, - -501437, -506269, 318901, 136902, 208843, 467078, 54224, -10201, 100395, 106837, - -210990, -3758, -43487, -181999, 96100, 9664, 45634, 29528, 47782, -37581, - -30065, 32749, 19864, -14496, 133681, 137439, 19864, -10737, 69793, 92342, - -40265, -5906, 62277, 77846, 21475, -48318, -48855, 40265, -37581, 27380, - 30065, -8053, 4832, -67646, 21475, 19864, - }, - { - 808528, 4656282, -4347581, 1599875, 2913062, -433255, 4104378, 1075352, 141197, 830539, - 842887, 444529, 349503, 712965, -5222144, 414464, -957241, 985695, -1704028, 3048890, - 890669, 1569274, -1088237, -1227824, -874563, -171262, -761283, 178241, -163746, -940061, - 971200, 361314, -807991, -65498, 22012, 339839, -1132798, -292595, 170188, -5906, - 256624, -457951, -242129, 351114, -233002, 250719, 16643, 257698, 149787, -169114, - -366683, 285615, -144955, -316217, 298500, 10737, -115964, -142271, -252329, -40802, - 58519, -197032, 118112, -75162, 69256, 183073, -63351, -98784, -95026, 71941, - 177167, -11811, 86436, -52076, -18790, 22012, 92879, -41876, 103079, -11274, - 100932, 12885, 3758, -12885, 5369, -48855, 37581, 10737, 17717, -10201, - 12348, -19864, -16643, 0, 6442, 12885, - }, - { - -7719667, -3549254, 3990562, 972273, -1598265, -400506, -4064650, 1333587, 854162, 1148367, - 662499, -25770, 396748, -348966, 1177358, 4051765, 2984466, 1559610, 2165201, -710817, - -767725, 130460, 129923, -837519, 188979, -27917, 379031, 180389, -878321, -354335, - 630823, 844498, -374199, -1032403, 1227824, 123480, -30602, 687195, 760209, -389231, - 144418, 467615, 375810, 616865, 146029, 193274, 56908, 103616, 369367, -257161, - 26844, -91268, -253403, 67109, 279173, -159988, -55298, -84826, 236760, 220117, - -72478, 136902, -15569, 76773, 78383, 105227, 99858, 122943, 6979, 12885, - 148176, -59593, -98247, -24696, -55835, -95563, -85362, 94489, 69793, -44023, - 19327, 17180, 3221, -72478, 34897, -22549, -27917, 20938, 26307, 9127, - -44560, -537, 31139, 24696, -51003, -25770, - }, - { - -207769, 5609228, -384936, -2792803, 271120, 991064, -96100, -252329, 128849, -259309, - 74625, 994822, -1426466, -2398739, 2427194, -996969, 454193, -2894808, 886911, -905701, - -1615982, -2022930, 555125, 534723, -452582, 1563368, 605590, 312996, 596464, -541703, - 399432, -678605, 366146, 151934, 19327, -410169, 294205, -60666, 25233, -176631, - 134218, 28454, 102542, 279710, -399969, 150324, -216896, -336081, -264677, -259846, - -323196, 332860, 101469, 193810, -5906, 5906, 151934, 89121, -212064, -537, - -315143, 132607, 141197, 162135, 3221, -175020, 85899, 34360, -93416, -115964, - -279710, -136365, -77846, -19327, -32749, -13422, 47782, 10201, 40802, 78383, - -44023, 18790, 65498, -15032, -31139, -8590, 13422, -9664, -18254, -32212, - -46708, -19327, 42413, 7516, -17717, 3221, - }, - { - -2035278, 14867566, 2729989, -1146756, -2286533, 73551, 1779727, 28991, 371515, -901943, - -159451, -792958, 2639258, 8155069, 853625, -802085, -738734, 912681, 537, -790811, - 785979, -185220, -210990, -368293, -641024, -1664837, 287226, -1591285, 469225, 1197759, - 553514, -502511, 856846, 363998, -116501, -827855, 573915, 303869, -50466, 322659, - -822486, 97174, -193810, 226560, -111132, 153545, 110595, -78920, -164819, 379031, - 215285, -373125, 294742, 183073, 101469, 307090, -280247, -1611, 88584, -68719, - -19864, 30065, 223875, 20401, 229781, 218506, -8053, 141734, -2147, 126165, - 22549, 92879, 19327, -140123, -56371, -46708, 23085, -112743, -66572, -17717, - 140123, 99858, 8053, -119185, -118112, 67646, 30602, 51003, 5906, 45097, - 44560, 79994, -46171, 27380, -23085, -20938, - }, - { - -26844, 2464238, 1553704, 489626, -215822, 676457, -24159, -733366, -649077, 617938, - 89121, 545461, -676994, 11872363, 7258495, 578210, -79457, -1538135, 2134062, -2770254, - -5230734, -1147830, 690953, 1458678, -788663, -1496259, 1120987, -514859, -220654, -1149978, - 1769527, 260919, 487479, 569620, 894964, 678605, 582505, -229781, 42950, 185757, - -36507, 361314, -132607, -478352, 125628, 310848, 43487, 247497, -194884, 66035, - -43487, 1611, -144955, 182536, 120259, 207769, 41339, -50466, -32212, 81068, - 24159, -198105, 28454, -45634, -99321, 0, -315680, -207232, 77846, -53687, - 28991, 167504, -25770, 192737, 109522, -18790, 54224, -77309, -23622, 2684, - -18254, 43487, 28991, 48855, 40265, -5369, -75162, -7516, 86436, 48855, - -47245, 537, 33286, 3221, -34897, 6979, - }, - { - -5331128, 591095, 1706176, 5750425, 256087, -1356673, -338229, 1131724, 934692, 1603633, - -1232656, 1655710, -1154809, -2748779, 3653407, -2138357, -2774012, -313533, 665720, 1603633, - -145492, -62814, 432718, -146566, -393526, 1286343, -1185948, -877247, -950798, -1035624, - 3221, 57445, -632434, 358630, -135291, 597537, 539555, 44023, -46708, -286152, - -181999, 45634, -224412, 92879, -228707, 168041, -577136, -191126, -35433, 102005, - 260382, -401043, -18254, -116501, 136902, -61203, 82141, 302795, 128849, -49392, - 146029, 238371, 63888, -32749, -115427, -77309, -39192, 2684, -8590, -48318, - 15032, 34360, 54761, -2684, -147103, 209380, -25770, 7516, -12885, -11274, - 20938, -16643, -38655, -22549, -6442, -14496, 537, -90731, 93416, 20938, - -31675, 44023, -47782, -24696, -3221, 6979, - }, - }, - { - { - 1324461, -14815490, -3917547, 1093606, -92342, -832150, -366683, -588947, 87510, 423591, - 319975, 918049, 1147293, -106837, 1497333, 2505040, -1478006, -345208, 448287, -982474, - 2854006, -39728, -412317, 2152316, -148176, 2249489, 488553, -326418, -789737, -629750, - -1647120, -601832, -1974611, 245887, 893890, 538482, 68719, -125091, -234613, -265751, - 415538, -3758, 282931, 35970, 664109, 233539, 166430, -45634, -326418, 306553, - 158914, -239981, -198642, -9127, -392990, 61740, -8053, -12885, 237297, -100395, - 186294, -8053, -178778, 32212, -151398, 1611, -147103, 5369, 6979, -176631, - 42413, 48318, 22012, 140660, 37044, 157303, -15032, -5906, -90194, 17180, - -1074, 20401, -42950, -10201, -56371, -8590, 27917, -61203, -23085, 26307, - 55835, -47245, 13422, -8053, -27380, 38655, - }, - { - -9147207, -20148228, -4767951, -1373853, 32749, 325344, -283468, -125628, 1119913, -556735, - -115427, 613107, -241055, -302795, 410169, -929860, 763967, 479963, -1490354, 848256, - -790274, 121870, -243739, 131533, 528818, -185757, 354335, 453119, 409633, 227633, - 1171989, -148176, -1194001, 41339, 379568, 923418, -313533, -267362, 452582, 38655, - -401043, 228170, -85899, 86436, 497679, -316754, 532576, -252866, 396748, -251792, - 188979, 73014, -310311, -206158, 65498, -120259, -232465, -160524, -48855, 41876, - -8053, -196495, -23622, -27917, -31675, 173946, -1611, -173409, 47245, -114354, - -24159, 32212, 3758, -195421, 24159, 81068, -167504, 71404, -37581, 48318, - 75699, -122943, -26844, 537, -88047, -72478, 95563, -44023, 25770, -45097, - 43487, -3758, 20938, -47245, 10201, -12348, - }, - { - -2654827, -46178416, 7583839, -5226975, 172336, 346819, 46708, -220117, -452582, 183073, - -639950, 467078, -1104344, 3162707, 2312303, 143345, -390842, 1810329, 363462, 135291, - 2130841, -1386201, -124554, -1082869, 1431298, 57445, -572304, -114890, -767725, -444529, - 730144, 664646, 438087, -243739, -343061, -259846, 787590, -823560, -339839, -57445, - 625455, -703838, 17180, -30065, -535797, -57982, 462783, 149250, -38655, 176094, - -241592, 54224, -264141, 187368, 105227, -25770, -184147, -78383, 365609, 171799, - -17717, 110059, 26307, -237297, -132607, 133144, -27917, 83215, 39192, -23622, - -78383, -90731, -22549, 39192, -18254, -47782, 537, 5906, -9127, 39192, - -30602, -66035, -5906, -110059, 47782, 73014, 32749, 46708, 14496, -7516, - 3221, -37581, -18790, -36507, -2684, 53150, - }, - { - -461709, 3146064, 822486, -126165, -210990, 62277, -98247, 106837, 267362, -328028, - -163209, -502511, 78920, 711891, -4901632, 1978369, 1014149, 555125, 3959960, 798327, - -602906, 239981, -565325, -631360, -1095754, 362925, 1569811, 500364, -275952, 235149, - -505196, 344134, 132070, -235686, 604517, 379031, -234076, -77309, 316754, 29528, - -22549, 121333, -476741, -40265, 34360, -116501, 185220, -239444, 233002, -178241, - 230854, -77846, -66572, 79994, 27380, -4295, 84289, 151398, -188442, 267899, - -82141, 183073, 144955, -13959, -54761, 35433, -6442, -49392, 14496, -96100, - 23085, 155156, -8590, -3758, -41876, 42950, 27380, 6442, -36507, -24159, - -50466, -4295, -85899, 48318, -34360, 26844, 44560, -2147, 14496, -39728, - 67109, 31139, -23622, -42950, 6979, -40265, - }, - { - -12035572, 12431783, 3073049, -528281, -403190, -302795, -544924, 217970, 281320, -105764, - 456877, -74625, 897648, -498753, 894964, -62814, 646393, 5375689, 179852, 28991, - 1375463, 1017370, -747861, -216359, 712428, -783832, 439160, -723165, 461709, -256624, - 588947, 241592, -54224, -391916, -91268, -543313, 1073205, 624918, 384936, -292058, - 383863, 66572, -412854, 118648, -16643, 119722, -129923, -97174, 37044, -1611, - 53687, 49929, -494995, 276489, -623844, -526134, -169114, 206695, -96100, 55835, - 34897, 125628, -168041, 49929, -178778, 89657, 113280, -98247, 62814, -137439, - 22549, -48855, 110595, 53687, -20401, -48855, -40802, 10201, 51540, 46708, - -27380, -32749, -36507, -22549, 26307, -37581, -10737, 95026, -61740, 25233, - -9664, 45097, 1611, 2147, 12885, 23622, - }, - { - 329102, 4092030, -773631, -434865, -13422, 183073, -207232, 43487, -1611, 54224, - -397284, 193274, -52613, -406948, 3143379, 1209570, -2294586, 567473, 2417530, -12560632, - -492848, -843424, -730681, 713501, 494995, 518080, -471910, -1233193, 772020, -98247, - 1511292, -84289, -27380, -91805, 641024, -665183, -148713, -728534, -53150, -212064, - -33823, 143345, -208843, 254477, -566936, 16643, -207769, -537, -43487, -417149, - 506269, -268435, 8053, 88047, 95563, -175020, -256624, 37044, -173946, -86436, - 75699, -84826, 192200, 69793, -129386, 66035, 82141, 129386, 84826, 89121, - 128849, -35970, -40265, 3758, 49929, 13422, -22012, -6979, 41339, -17180, - -1074, -35970, -22012, -37581, 103079, -537, -3221, -10737, -7516, -40802, - 54761, 32212, -7516, -36507, -8590, -33823, - }, - { - -13892609, -46124728, 986769, 3510062, -185220, -12348, 387084, -214748, -692564, -336081, - 595927, 70330, 719944, 1045288, -144955, 105764, -321049, 90194, -466541, 302795, - 227633, 191126, 26307, -194884, -272194, 306553, -3221, 356482, 200790, -86973, - 220117, -92342, 111669, 127775, -12348, -798864, -12885, -838592, 598074, 340913, - -125628, -428960, -369904, 477815, 155156, -107911, 86973, -227096, 541703, -167504, - 210990, -128312, -31139, -121333, 175020, -63888, 69793, 48318, 70867, 93952, - -127238, -227096, 64425, 176094, 90194, -153545, -157303, 12885, 30602, 134218, - -163746, 224949, 34360, -193810, -20401, 57982, 68719, -86436, 83215, 77846, - -60130, -31675, -8590, -22012, 16106, 59056, -6442, -20938, 23085, 24696, - -10737, -69793, 41876, 37044, 29528, -47245, - }, - { - 335544, -1422171, -921271, 57982, -70330, 185220, 22549, 369367, -129386, -153545, - -19864, 12885, -4832, -1763084, -6653441, -1876901, -989453, 2381559, -909996, -262530, - -1745367, 1231045, 994822, 147103, -1339493, -1731946, -68183, -1347009, -2056216, 916439, - -1142461, 527744, 302795, 153008, 118648, -33286, -449898, 693637, 38655, -305480, - 99858, -186831, -363462, 193274, 190052, 236223, -510027, -143345, 316217, 120796, - -139586, -161061, 113280, -44560, -192737, -23622, -132070, 136365, -190052, -12348, - 179852, -149250, 121333, -95563, 31139, 119185, 184684, -2147, -26844, -30065, - 19864, -44560, -20938, 171799, -67646, 24159, 139586, -13422, -59593, 12348, - -30065, 7516, 537, 69793, 19327, 15032, -2684, -52076, 3221, -3221, - -57445, 8590, -15032, 9664, -25233, -27380, - }, - { - -1532230, 56482040, -1719061, 1462973, 543850, -726386, -306016, -523986, 723702, 27380, - -1111860, 518617, -9127, 459025, 506269, 754304, 973347, 466004, 11274, -75162, - 330176, -240518, 512175, 146029, -380641, -94489, -576599, 484794, -1063004, 335007, - 543850, 95563, -885300, 439697, -160524, 348966, 510027, 872415, -805306, -964757, - -1406602, -157840, -485868, 498753, 319438, 70330, -201327, 199179, 353261, 231928, - -220117, -378494, 111132, -44560, -455803, -34360, 258235, 81604, 4295, 233002, - -18254, 53150, 75699, -279173, 6442, 130460, -51003, -236760, 63351, 114890, - -6979, -31675, 67109, -18790, 33823, -54761, 91268, -81068, 32212, 28454, - 68719, 4295, 1611, 23622, -43487, 56908, 61203, -2147, -86436, -27380, - -39192, -5906, 2684, 44560, -24696, -3221, - }, - { - -522375, 1490354, -556735, 1595580, 387084, -644245, 1684701, 850940, -137976, -115964, - -182536, -268972, 279173, 1900523, -901943, 2685428, -110059, 2602750, -445066, 456877, - -783295, 1371705, 737661, -257698, -655519, -146029, 102542, 722628, 68183, -159988, - -387621, 1210107, -292595, -645856, -62814, 1009317, -503048, -399432, -134218, 8053, - 234076, -251256, -233002, 343597, 676994, -30602, -358630, 54761, 288837, 95026, - -619012, 95026, 42413, -325344, 5369, 297427, -62814, -11274, -158377, -101469, - -40265, -107374, 238371, 51540, 19864, 190052, -12348, -58519, 28991, -96637, - 49929, -46708, -9127, 137439, 19327, -71941, 117575, -34897, 68719, 38655, - 104153, -11811, 537, -33823, 27917, -69256, -3758, 31675, 7516, 22549, - -24159, 2147, -69793, -4832, 14496, -17180, - }, - { - 5586142, 8173860, 307090, 2660195, 572304, -339839, -7592966, -8590, -19327, 1705639, - 561567, 196495, 132607, -232465, 432181, 1694902, -1188632, -1500017, 1086090, -131533, - -674847, 842887, -427349, -876173, -783832, -717796, 129386, 401579, -26844, 401043, - -243203, 91805, 512175, -621160, 359704, -654983, 856309, -23622, 89657, -441308, - -186294, -402653, 24159, 45097, 74088, 655519, 153008, -299037, 25233, 200790, - 218506, -2147, -134755, -166430, 124017, -223875, 66035, -82141, -34360, 246424, - -97711, -82141, -100395, 47245, 49392, -40265, 111132, 82141, -38655, -125628, - 88584, -38655, -34897, -22549, -97174, -3221, -108985, -1611, 71404, -124017, - 34360, 33823, -42950, 48318, -5906, 40802, -43487, 40265, -32212, 9127, - -5369, 2684, -13422, 23622, 26844, -20938, - }, - { - 316217, 4435091, -1131724, -2093260, 812286, -386010, 57445, 107374, -73014, -443455, - -328028, -40265, 1735704, 2974265, -76773, -263067, 2527588, -1574106, 1098438, 493921, - 1271310, 1538135, -539018, -481573, -2208150, 201863, 1104344, -459562, 585189, -286689, - -681826, 636192, -74088, 227096, 379031, -321586, -76236, 103616, -110059, -20938, - 77309, 271657, 474594, 293668, -361314, 411780, 80531, 248571, 102005, 207769, - -47245, 137976, 149250, 127238, -64961, -247497, -368293, -71941, 246424, 267899, - 41339, 137976, -159988, -20938, 151934, -61740, -154619, 140660, -44560, 13422, - -87510, 59056, 23085, -47245, 10201, 4832, -55835, -67646, 19327, 3221, - 33286, -46171, 15569, 59593, 26844, 35970, 32212, 34360, 7516, 16106, - -1611, 13959, 3758, -47245, 31139, -18790, - }, - { - -1094143, 10714333, -351114, -2784750, -476741, 162135, -1064078, 387621, 943819, 153008, - 96637, -868657, -2131378, -1255741, -1048509, -733903, 96637, 1241246, -494458, -36507, - -300111, 285615, -115964, 187905, 159451, -107911, 1626182, -965831, 780610, 950262, - 321586, -1130650, 505732, 617938, 450435, -384936, 542240, 404801, 10201, -236223, - -787590, 85899, 84826, 624918, 476205, 312459, 308164, -396211, 70867, 442919, - 100932, -365609, 6442, 243739, -17180, 95026, -290447, -270046, -105764, 106837, - -28991, 93952, -2684, 35433, -35433, -1074, 4832, 105227, 5369, 26307, - -62814, 140123, 103079, -143881, -57445, -34897, 17717, 141734, -34897, 22012, - -102005, -53150, 49392, 47782, -78920, -64961, -8590, 59593, -51003, -3758, - 28454, 59056, -3758, -27917, -10737, -27380, - }, - { - -148713, 785979, 330712, 868120, -426812, 249108, 68719, -102005, -474057, 63351, - -134755, 1081795, 323196, 397284, -13785234, 530965, 1913408, -2142115, 2481954, 1472637, - -314069, 199179, 505196, 731755, -1188632, -431644, -548145, 238371, 338229, -1192390, - 1349694, -1123134, 268435, 558883, -512175, -98784, 281857, -347355, 347892, -339302, - 250182, 776852, -248034, -258772, 90731, 63888, 192737, -21475, -122943, 9664, - 46708, -179852, -173946, 100932, 59593, 76236, -62814, -16643, 249645, 231928, - 13422, -311922, 59056, -4295, -35970, -25770, 79457, 17180, -1611, -15032, - -126702, 17180, 82678, 1074, 5369, -64425, -22549, 100932, 34360, 82678, - 6979, -103616, -24696, 67109, -50466, 25770, 7516, 59593, -16643, 105227, - -11274, -25233, -32749, 55298, -20938, -60130, - }, - { - 1141388, 8228084, -1695975, 1378685, 785442, 392453, -1360431, 574452, 834834, 1718524, - -315680, -164819, -802622, -1557463, 5421323, -835908, -1852205, 773094, -407485, 558346, - -649614, -96100, 635655, -229244, -976568, 751619, -1289027, -183073, -139050, 10737, - 379031, 331786, -725313, 636192, -19327, -256087, 21475, 222265, -446677, -205085, - 19864, 381715, -194884, 215285, 296353, 256087, 57982, 388158, -361851, -113280, - 276489, -163746, -139586, -308701, 138513, -259846, 142271, 281320, -82678, 18790, - 89121, 20401, 537, 52613, 23622, 63888, 37581, 61203, -11811, 10737, - -32749, 47782, 164283, 28454, -217433, 90731, -65498, 69793, 42413, 50466, - 49929, 63888, 537, 34360, 45097, -13959, -12348, -28454, -47245, 38118, - -25770, 22549, 49392, 13422, 2147, -18790, - }, - }, - { - { - -472446, -16684874, -121870, 15032, -488016, -487479, 35433, -447213, -3758, 14496, - 869194, 292058, 1195075, 33286, 1776506, -161598, 466541, 4832, 1207423, -457951, - 1889249, -378494, 49929, 1354525, 853625, 1701344, 431107, -163209, -296890, -565862, - -1615982, -913754, -551366, 255551, 471910, 704912, -966368, 614180, -1342177, 98247, - 327491, -193810, 229244, 463856, 521302, -12348, 132070, -183610, -223338, 260919, - 187368, -106300, -107911, -17717, -172336, -155156, -62814, 55835, 2684, 110595, - 98247, 139586, -102005, -158377, -117038, 6442, -32212, 3221, 147103, -164283, - -89657, 62277, 84826, 105227, 209380, -5369, 20401, 15032, -2684, 4832, - 8590, 57445, 38655, 23622, -82678, -19327, 22012, -42950, -7516, -35433, - 48855, -9127, -31675, 0, -26307, 9664, - }, - { - 7346542, -47131896, -502511, -3100430, -241592, 314606, -401579, -176094, -650688, 813896, - 107374, 552977, -257161, -206158, -761820, -117038, 297963, -806917, -969052, -87510, - 81604, -479426, -236223, 631360, 570694, 258235, -174483, 670015, 795643, 171799, - 724239, -57445, -870268, -503585, 557272, 113280, 687195, -283468, 202400, -311385, - 259309, -216359, 107374, -17717, 325881, -174483, -42950, -197032, 20401, 28454, - -118648, 378494, -8053, 39728, -88584, -155156, -214212, -192737, 201327, 127238, - 70330, -156229, -122943, 48318, -37044, 77309, 23085, -146029, 12885, 74088, - -97174, -47245, 3758, -51540, -107911, -17180, -56908, -2147, -59056, 114354, - 63888, -112206, -9127, 26307, -46708, -126702, 43487, 5906, 2684, 8590, - 7516, 35433, 15032, -20401, -17717, -7516, - }, - { - 2173790, -33772940, -9757092, 1453310, -925029, 557272, 346819, -219580, -417149, -717260, - -482110, -609885, 391379, 1484448, 2417530, -775778, 2539400, -121870, 1060857, 161061, - 1359894, -20401, 279710, -826244, -135291, 402653, 170188, -108448, -544924, -768799, - 572304, 744103, 39192, 65498, -685584, -463320, 694711, -527207, -284542, 366146, - -461709, 918586, -392990, 117575, 123480, -563178, 91805, 164283, 512175, -148713, - -222265, -127238, -5369, -3221, -140123, 69793, 166967, 14496, 280247, 165356, - 91805, 252866, -197032, -6442, 40265, 58519, -118112, 140660, 108985, -92342, - -12348, 15032, -6442, 33823, -6979, -35433, -8590, -11274, -61203, -4295, - -55835, -50466, 38655, -85899, -34360, 75162, 5906, 6442, 13959, -25770, - -11811, -7516, 5369, -27380, 8590, 18790, - }, - { - 331786, 3152506, -751082, 566399, -136365, -85899, 67646, 169114, 52076, -229244, - -264677, -524523, -327491, -907312, -1050120, -1351841, 1326608, 1851131, 1882269, 1036698, - -53687, -280784, -604517, -304943, -579821, 729608, 770410, -381715, 390842, -43487, - -780073, 729071, 29528, -88584, -130997, 590021, 12885, 363998, 175020, 191126, - 56371, -6979, -201327, -354335, -19864, 158914, -70867, -68183, 344134, -17717, - -149250, -48318, 105227, 112206, 9127, 150861, -47245, 125091, 63351, -10201, - -198105, 87510, 142271, 71941, 30065, -62814, -9127, 102542, -16643, -81604, - -112743, 78383, -8053, -32212, -24159, -2147, 131533, 30602, -21475, -28454, - -62277, -6442, -51540, -6442, 1074, -39728, 43487, 32212, 32749, 1074, - 16106, 30065, 15032, -31139, 6979, 10737, - }, - { - 7850127, -12444668, -2153389, -86973, 423591, -353798, -697932, -104153, 235149, -294205, - 1130113, 1366873, -110595, 11274, 521839, -482647, -98247, 4262755, 1006633, 576599, - 1001264, -56908, 178241, -176631, 111132, 33823, -234613, -3758, -428423, 26844, - 371515, 126165, 89121, 144955, -96100, -209917, -688805, 612033, 265214, -311385, - 89121, 108448, 82678, -523449, 27380, 262530, -120259, 63351, 189515, -133681, - 203474, 76773, -226023, -187368, -380105, -278636, -479426, -59056, 163746, -37044, - 79994, 98784, -94489, -55835, -69793, 129386, -9127, -148713, 151398, 5369, - -31675, -64425, -41339, 93952, -9127, -128849, 68183, -13422, 51540, 68719, - 10737, -25233, 16643, -68719, 25233, -56371, 36507, 48855, -62814, 14496, - -21475, 21475, 25770, -28991, 18254, 14496, - }, - { - 55835, 2416456, 1479079, -532576, 136902, -89657, 89121, -192200, 252866, -13422, - -180926, -134218, 129386, 1071594, -617938, -197032, -157303, 36507, 545461, -8507256, - -984084, -1458141, -326954, -1166621, 1021129, -123480, -206158, -926639, -39728, 1744831, - 1218160, -562641, 93952, 437550, 297963, -745177, -293668, -141197, -431107, -228707, - 129386, 153008, 297963, -31675, -171262, -48855, -295816, -120259, -73551, -297427, - 129923, 57982, -117575, 165893, -98784, -235149, -86973, -37044, 5906, -209380, - 4832, 53150, -24159, 37581, 62814, 39728, 79994, -3221, 76773, -37044, - 163209, 50466, -59056, -35970, 18790, 106300, 57982, 119722, -45097, -41339, - 43487, -7516, -64961, -32749, 62277, 9127, 31675, -54224, 15032, 49392, - -40802, -10737, 71941, -27380, -19864, 16106, - }, - { - 3662533, -61799212, -3737695, 1961726, 45097, 526670, 169114, -296353, -248034, -506806, - 642098, 156766, 501974, 200253, 373662, 188442, 482110, -353261, -228170, -148713, - -76236, -252329, -96637, -293132, 271657, 5369, -50466, 296890, -89657, 473520, - 491237, 99858, 368830, -360777, 42413, -469762, -218506, -848256, 957241, -17180, - -119722, 83752, -693100, 259309, 49392, 68719, -105764, -100932, 77846, -165356, - 22549, -93952, 74088, -154619, 123480, 89121, 143345, 172872, 40802, 77846, - -106300, -107911, 7516, 102542, 28454, 55298, 86973, -84826, -68719, 53687, - -31139, -16106, 125091, -56908, -74088, -20938, 119722, -20401, 28991, 66035, - -84826, -29528, 62814, 4832, -27380, 83752, 73551, -37581, -42413, -33823, - 28454, -35970, -30065, 20938, 27917, -13959, - }, - { - -147640, 362925, -520765, 460098, -198105, 85362, 103079, -127775, 252329, -12348, - -330712, -533113, 470299, -1086090, -8592082, -2169495, -1726040, 331786, -383326, 349503, - -1866700, 296353, 455803, 118112, -102542, -3349001, -285615, -370978, -1374926, -468688, - -41876, 435402, 38655, 83215, 537, 108985, -44023, 242129, -160524, 353798, - -124554, -256087, -284005, 10201, -13959, 92342, -62814, -352724, -230854, 171799, - 112743, -139586, 17717, 105227, 9127, -73014, 141197, 77846, -278636, 139586, - 45634, 46708, -41339, 5369, 5369, -48855, 85899, 75162, -75699, 28991, - -5906, -26307, -42413, 48855, 70330, 35433, 123480, 55835, -24159, 51540, - -78383, -25770, 3758, 24696, 54761, 6979, 34897, -26844, -12885, 55298, - -48855, -2147, 17180, 6442, -35433, -28454, - }, - { - 4150012, 42169064, 2462090, 778463, 77846, 272730, -361314, -585189, 368293, 551366, - -214212, -364535, -1215476, 667331, 1025423, 664646, 971200, 80531, 69256, 264141, - 354335, -61203, 280784, 399969, -466541, -348966, 348429, -86973, -758062, -151934, - 442919, 47782, -433255, 339302, 234613, 321586, 113817, -127775, 21475, -911070, - -1047435, -483721, -179852, 518080, 82141, 148713, 247497, 13422, 325344, -163746, - 37581, -15569, -124554, -121870, -360240, -217970, 188979, 45097, 106300, 77846, - 128849, -111669, 17180, -107374, -169114, -5906, 27917, -215285, -10737, 165893, - 28991, -97174, -26844, 37581, 96637, -97711, 49392, 19864, -53150, 36507, - 25233, -8590, -33823, 8590, -78383, 5369, 77309, 53150, -3221, -76236, - -62277, 25233, -15032, 59056, -2147, -2147, - }, - { - 321049, 763967, 1707250, 782758, -1048509, 1413581, 76773, 357019, -352724, -386010, - -477278, 30602, 143345, 725313, 652835, 1807108, 597537, 471910, 2776696, 231391, - -1059246, 34360, 858457, 679142, 222801, -346819, 461709, 429497, -302795, 303869, - -945967, 366146, 583042, -636192, 534723, 445066, 101469, -41339, 29528, -164819, - 302258, 243203, -20938, -17717, 571768, -91805, -217970, 121870, -104153, 228170, - -205085, -141734, 351114, -210453, -288300, 91805, 210453, -56908, -49392, 31675, - -176631, 61203, 62814, 11811, -21475, -87510, 129386, 38655, 173409, -34360, - -62814, -51003, -120796, 119185, 10201, -12885, 37044, -21475, -24696, -4295, - 28991, -1074, 14496, 6442, 42413, 5906, -53150, 17180, -24159, 15032, - -4295, 9127, -54761, -7516, 31139, 19327, - }, - { - -4059818, 17285632, 5603322, 1171452, 82678, -2122788, -2543158, -1470489, 288300, 1138166, - 103616, 396211, 20401, 684510, 388695, -212601, -1334124, -526134, 501974, 489089, - -364535, 513249, -287226, -472983, -796180, -276489, -198642, -157303, 289910, 511101, - -55298, -100932, 37044, -175020, -112206, -463320, 494458, 162135, -129386, -140660, - -174483, -52076, -208843, -380641, 53687, 401579, 175557, 33823, -208306, 163746, - 357019, -60666, -158914, -85362, -193274, -153008, -48855, 87510, -99321, 67646, - -4832, -98247, -92879, 39192, 51540, -88584, 75162, -33286, 13959, -91268, - 46708, 9664, -10201, -1074, -8053, 64425, -46171, -64425, -15569, 6979, - 7516, 39192, -50466, 55298, -22549, 49392, 48318, 18254, -23622, 537, - 10737, -8590, -33286, 10201, 33823, 20938, - }, - { - -343597, 2083596, 1273995, -759672, 351650, -584652, 50466, -28454, -37581, -416075, - -445066, 58519, 1561758, 2954401, -1202591, 1876364, -59593, 102005, 748398, 404801, - 1832877, 1241782, 24696, 275952, -1098438, -1133335, -278636, -292058, 655519, 596464, - -862215, 596464, -173409, 227633, -239444, 71941, -329102, 164819, 162135, 257698, - 184147, 111669, 357019, 347892, 3758, 228170, 53150, 257161, 103079, 453119, - 197569, -131533, 81604, 186831, -75699, -227096, -416612, -210990, -25233, 157303, - 113280, 90194, -110595, -142808, 58519, 30602, -190052, 8053, -41339, 3221, - 115427, 21475, -13959, 59593, 27380, 59593, -49929, -54224, 4295, -39192, - 14496, -18790, -32749, 54761, 22012, 17717, 26844, 15032, -5906, 20938, - 11811, 39192, -13959, -24159, 19327, 1611, - }, - { - 927176, 1928440, -157840, 811212, -550830, 962610, 172872, 897111, 176631, 62277, - 577673, -25770, -299037, -4615479, -2105608, 412317, -121333, 98784, -314069, 1294396, - -296890, -111132, -176094, -121870, 777926, 1005022, 1244467, -427886, 986769, 878858, - -1611, -539018, 108448, 513785, 321586, 557272, -359704, 401043, 212064, -283468, - -437550, -178778, 214748, 186831, -179852, 110059, 22549, -209917, -99858, 95026, - 199179, 61740, -80531, 342524, 97711, 83215, -62814, -264677, -267899, 193810, - 33823, 25770, -68719, 115427, -87510, -158914, 18254, 52076, 73551, -23622, - -45097, 82678, 117038, 12885, 22549, -6442, -88047, 158914, 63888, 55298, - -73014, -136902, -9127, 67109, 13422, -66572, -47782, -62814, -54224, -39192, - 31139, 17717, 48855, 7516, 15569, 7516, - }, - { - -24159, 1112933, -1531156, 357556, 354872, -244813, -70330, 243203, 86436, -658741, - -246424, 852551, 800475, -6505265, 2361695, -3828963, 1920387, -539018, 316217, 2236067, - 1205275, 250182, 1385127, 502511, -1639067, 1140314, -1187559, 158914, 77309, 682900, - -769336, -251256, -236223, 446140, -1111323, -395674, 160524, -220654, 511638, -352724, - 76773, 528818, 113280, -86973, -77846, 192737, 86436, -119722, -54224, -112743, - 167504, 6979, -126165, -141197, 188979, -158914, -1611, 63351, 162135, 123480, - -33286, 13422, -117575, 10737, 114890, -24696, 114354, 85362, -10737, -8590, - -71404, -5906, 130460, -107374, -32749, 45634, -32212, 74625, 27380, 17180, - 69256, -66035, -115964, 39728, -51003, -24696, -2684, 51003, -42950, 31675, - 46171, 33823, -26307, 42413, 4295, -55835, - }, - { - 1478006, 7473780, 580894, -2019708, 843424, 1438814, -278636, 748935, 862215, 404801, - 1227824, -712428, -164283, 2342368, -536334, -642635, 534187, 1127429, -999117, 393526, - -753767, 319975, 261456, 419296, -635655, -507343, -580894, 418759, -380641, 386010, - 55835, 411243, -341987, 117038, 422517, -391379, -494458, 151398, -421981, 141197, - 268972, -67646, -114890, 49929, 522375, 174483, 150324, 104153, 69793, -303332, - 98784, 176094, -53687, -160524, 6979, -75699, -57982, 54761, 71404, 155693, - -53150, -75162, -70867, 131533, 63351, -13422, 70867, -90731, -6979, 22012, - -9664, -35970, 98784, 98247, 35433, -66035, -95563, 105764, 24159, 15569, - 59593, 112206, 15569, 13959, 30602, 26307, -7516, 4832, 2147, -37044, - 42950, -3758, 39728, 42950, 16643, -21475, - }, - }, - { - { - 179315, -13596256, 3178276, 665720, -246961, -12348, 334471, -18790, 635118, -180926, - 439160, -914828, 375810, -221191, 256624, -1592359, -69793, 367757, 332323, -637266, - 1525787, -547071, -22549, 920734, 580357, 649077, 433255, 956704, 699543, 348429, - 162135, 305480, 363462, -365072, -551366, -559956, -844498, 976568, -1064078, 206695, - -40802, -336081, 16106, 284005, -79994, 31675, 153008, -177167, 58519, 144418, - -163209, -176094, -25770, -186294, 44560, 71941, 2147, 113280, -84826, 37581, - -105227, 89121, 97711, 34897, -12348, 82678, 46171, 1074, 42413, -45097, - -30602, -30065, 105227, -27380, 111669, -115964, 38118, 5369, 32212, 63888, - 10737, -5369, 8590, 37044, 30065, 15569, -1074, -22012, 13422, -19864, - -40802, 22549, -30602, 46171, 10737, -24696, - }, - { - -5052492, -44794900, 12407087, -2685428, -956704, -548145, 27917, 398358, -1330366, 649077, - 97711, -79457, 299037, -109522, -1100049, -184147, -626528, -81604, 1024887, -347892, - 60666, -179315, -322123, 281320, 86436, 344134, -135828, 241592, 270583, -369367, - 12885, -19327, -148713, 128849, 3758, -513785, 226023, 55835, 223338, -591095, - 177704, 201327, 392990, -255551, -97174, 170188, -399969, 40802, -110059, -177704, - -399432, -146566, 13959, 95026, -70867, 76773, -88047, 66572, 93416, 31139, - 15569, 13959, -42950, 146029, 93416, 73014, -93952, -139586, -68719, 97711, - -60130, 26844, -17180, 26307, -11811, -122407, 35433, 27917, -37581, 10201, - 22012, 9127, -24159, 24159, 28454, 27917, -72478, 61203, -35433, 10737, - -15569, 8590, -9127, 28454, -24696, 22549, - }, - { - -1740536, -11530377, 8150774, 2063732, 2095407, 194347, -71404, 155156, 135828, 325344, - -244813, -651761, -110059, -136902, 2330020, -164283, 1021665, -1541893, 1386201, -575526, - 1073742, 514859, 758062, -467078, -685047, -25770, 312996, 763430, 207769, -144418, - 286689, 452045, 112743, 489089, -555661, -391916, 673236, -370441, 331249, 814433, - -858457, 934692, -206158, 299037, 186831, -388158, -149250, -103616, 164283, 34360, - -52613, -310311, -5369, -93416, -132607, 70330, -74088, -12885, 153545, 70867, - -104690, 57445, -85362, 119722, -113280, -63888, -195958, 62277, 85362, -52076, - 16106, -15032, 26844, -6442, 73014, -8590, -11811, 0, 11274, -28991, - -55298, -35433, -19864, 36507, -48318, -13959, 20938, -28454, -10201, 13422, - -48855, 9664, -4832, 20938, -16643, -26844, - }, - { - -165356, 4019553, -29528, 271657, 222265, -54224, -40265, -42950, 15569, 144418, - 255014, -23085, -400506, -593242, 2907693, -1003949, -2258079, 212064, 824097, 16643, - 432718, -100932, -530428, 422517, -432181, -354872, -1109712, -756451, 86436, -122407, - -1196148, 578747, 357556, 407485, -293132, 288300, 760746, 228170, -190052, 372052, - -69793, -76236, 14496, -148713, 7516, 15032, -81604, -185220, 161598, 122407, - 1611, -211527, 60130, 47782, -128849, 223338, -122943, -170188, 156766, 76773, - -175020, -63351, 79457, -89121, -24159, 40265, 3221, 87510, -32749, 40265, - -45634, -73014, -29528, -27380, 62277, -70330, 23085, 22012, 61203, -6442, - -8053, -10737, 35970, -16643, 34360, -11811, -30065, -5906, 27380, -2684, - -28454, -25233, 16643, 20401, -2147, 15569, - }, - { - -2039573, -21590800, 907849, -1332514, -265214, 148176, -311385, -463320, 375810, 11274, - 1074, 945430, -247497, 547071, 382252, -756451, 534187, 3183645, -372052, -5906, - 63351, -209917, 468151, 462783, -475131, 606127, -137976, 312459, -757525, -86436, - -147640, -302258, -432181, 221191, 60130, -6979, -1004486, -728534, -186294, 128849, - 3221, -96100, 91805, -252866, -149250, -148713, -75699, 67109, 62814, -177704, - -146566, -111132, 279710, -56371, -59056, 47245, 41339, -75699, -81604, -182536, - 50466, 67109, -64961, 99321, 60130, 15032, -33823, -138513, 89657, 3221, - 16106, 5369, -139586, -68719, -8053, -7516, 13959, 74625, -7516, -44560, - -2684, 30065, 537, 45634, 1074, -87510, 19864, 1611, -11274, -9127, - 4295, 8590, 22012, -16643, -26844, -18254, - }, - { - -281320, -2332704, 457951, 82141, 74625, -186831, -70330, -197569, 134218, -31139, - 241055, 115964, 470299, 133144, -1551020, 483184, 854162, -139586, 1808181, -5352603, - 184147, -737124, 1058173, 73014, 173946, -672162, 330712, -797790, -864362, 1261110, - 1405528, -92879, -206695, 12885, 440234, -252866, -31139, 193274, -228707, 16106, - -222265, 523449, 431107, 76236, 137439, -103616, -137439, -47245, -37581, -318901, - -153545, -38118, -164283, -137976, -255551, -52613, 130997, 25770, 170725, -26307, - 22549, -32212, -59056, 42413, -34360, -11274, 11811, -137976, 49392, -72478, - 19864, 74088, 53687, -7516, -66572, 5906, -23085, 147103, -52613, 35433, - 6442, 84826, 30602, -20938, -55298, -1611, 35433, -48318, 10201, 65498, - -10737, -57982, -8053, 25233, 27917, 54761, - }, - { - 2899103, -49258980, 6185827, 1569274, -470299, 432718, 26307, 347892, 481036, -558883, - 127775, -7516, -5369, -328028, -2147, 401043, 338229, -280247, 834834, -317828, - -309238, -343597, -3758, -76773, 257698, -20401, -173946, 453119, -214748, 146566, - 280247, -138513, 349503, -338766, -21475, -10201, 108448, -880468, 398358, -261456, - 201327, 583042, -254477, 9127, 146566, 181999, 60666, -48318, -80531, -136902, - -171262, -125628, -148713, -4295, 47782, -16643, 34360, 35433, -64425, 24159, - 5369, 42413, -22549, -11811, -125628, -24159, 33823, 9664, -83752, 3758, - 146029, -85899, -90731, 56908, 37044, -80531, 22012, 9664, -37044, -26844, - 47782, -20938, 37044, 60130, 4832, -52613, 26307, 5906, -16643, -35970, - -3221, 21475, -37581, 2147, -8053, -2684, - }, - { - -340376, 538482, 976031, -111669, 103616, 52613, -6979, -267899, -22012, 158377, - 249645, 46708, 826244, -25770, -5779416, 11274, -534187, -580357, 51540, 1206886, - -1065152, -325881, 1140851, 1304596, 745714, -1329292, 677531, 256624, -503048, -457414, - 418759, 69256, -337155, 59593, -112743, -4832, 119185, 186831, -421444, 548682, - -129386, -61203, 146029, 42950, -310311, 45634, -13422, 241592, -403727, -250719, - 122943, -82141, -186294, -128849, 183073, 62277, -48855, 9664, -24696, 22012, - -121870, -93416, 18254, 73551, 43487, -173409, -115427, 62277, 91805, 28991, - -23622, 21475, -69793, -52613, 53687, -1074, 9664, 51003, 23622, 6979, - 44560, 28454, -11811, -70330, -50466, 537, -11811, 33286, -19327, 15032, - 13422, -10737, 17717, 35433, 4832, 8590, - }, - { - -3262028, 29291676, -1306744, -616865, -266288, 180389, 270046, 444529, -520765, 222265, - 1233193, -106837, -651224, -948651, 652298, -755914, 55835, -212601, -69256, -111669, - -186294, -53150, -513249, 236223, 273804, -326418, 450435, 99321, -304943, -117038, - -170725, 306016, 37044, 450972, 122943, -75699, -309238, -393526, 184147, -353798, - -229781, 421444, -17180, 16643, -5906, -173946, 123480, 177704, 86973, -620086, - -104153, 111669, -115427, 134218, 290984, 1074, -75162, -162672, 169651, -91268, - 14496, -14496, -2147, 49929, -4832, -128312, 24159, 35433, 21475, 39728, - 53687, -6979, -2684, 68183, 41876, -15569, -85899, 40802, -48318, 55298, - -68183, 32212, 2147, 8053, -25770, -30602, -17717, 41339, 39192, -19327, - 18790, 38655, -11274, -24696, 38655, 7516, - }, - { - -275415, 2723546, 712428, 150861, -453119, -179315, 508417, 603980, -536871, -181462, - -274878, 402116, -757525, -1200980, -559420, 2063732, 596464, -1896765, 565325, 621697, - -760746, -63888, -269509, 250182, 663036, 237834, 316754, 482647, -399432, -300111, - 26307, -449898, 206158, -461172, -44023, -75699, 86973, 41876, 366683, -132607, - 278636, 265214, 118112, -80531, -178778, 168041, 8590, 248034, -297963, -58519, - 123480, 22549, 210990, -52076, -18254, -195958, 98784, -105227, -28991, 78383, - -67646, 71941, 45634, -93416, -31675, -212064, -20938, -38655, 155156, 137439, - -69256, 19327, -31675, -42413, -10737, 53687, -8590, -41339, -1611, -13422, - -4295, -31139, 15032, 1611, -12348, 48855, -6442, 6442, -10201, -40265, - 32749, -1074, -17180, -22012, 10201, 51540, - }, - { - 2289755, 22247930, 2302103, 2000918, -813359, 1503775, 5377299, -853625, -278636, -445066, - -210453, -33823, -62277, -203474, 273804, 440234, -736050, -746787, -394600, -351650, - 88047, -155693, 154082, -216896, -299037, 68719, -194884, -392990, -336618, 258772, - -3758, -30065, -37044, -302258, -161061, 95563, -269509, 6442, 23085, -111669, - -113280, 284005, -285615, -224949, -27380, -72478, 9664, 169651, -23622, -63888, - 243739, -22549, -82678, 193810, 27380, -44560, -297427, -30602, 63351, 91268, - -537, 12885, 9127, -24696, -49929, -8053, 3758, -51003, -31139, -26307, - 41339, -29528, -47245, 15032, 56371, 13959, 70867, 45097, -61740, 92879, - -59056, -3758, 15032, -67109, 6442, -27380, 75162, -7516, 24159, -9664, - -25770, 2147, 11811, -6979, -46171, 31675, - }, - { - 346819, -323196, -1114544, 86436, 188979, 125091, -50466, -365609, 47245, 82141, - 133681, 358093, -2680597, -1316944, 340913, 454193, -1413044, -285078, 68719, -415001, - 794569, -1735704, -215285, 216896, 231391, -457414, -729608, -239444, -55298, 540629, - 387084, -158914, -61203, 139050, -237297, -22549, -552440, -357019, 652835, -3758, - 71404, 83752, -199716, 66572, -23622, -122407, -45634, 141734, 88584, 38655, - 74088, -120259, -207232, 93952, -54761, 165356, 26844, -12348, -183073, 10737, - -159988, 27380, 69793, -9664, -131533, -92342, 113817, -37044, -6979, -43487, - 99321, 30602, -95563, 28991, -26844, -16643, 51003, 63351, 9127, 11274, - -61203, 41876, 17717, -13959, -15569, 8053, 22012, -30602, -37044, 2684, - -7516, 17180, 20401, 21475, -22012, 1611, - }, - { - 139586, 1075889, -1863479, 2309082, -1351841, 916439, 2195265, 615791, 494995, -609885, - 38118, 134755, 926102, -2069637, -1846836, 830539, -774168, 0, 65498, 12885, - 463856, -3758, 226023, 345745, 734976, 75162, 582505, -452045, 739808, 633508, - -350040, -386547, -12885, 278636, -267362, 299037, -95026, 256087, -259309, 417686, - 122943, 154082, 86436, 48318, -443455, -161061, -212064, 177704, -382789, -170725, - 177704, 223338, 55298, 24696, 60666, 155693, 68183, 96100, -41876, 36507, - 87510, -71404, 39728, 73551, -36507, -64425, 4295, -6442, -99321, -5906, - 73014, -23085, 10201, 85899, 55835, -14496, -45634, -15032, 63888, 13959, - 102542, -89121, -71404, -31675, 33823, 92879, 3221, -87510, 9664, -30602, - -4295, -20401, -13422, 47782, 537, 2147, - }, - { - 134755, 3152506, -518617, -906238, -206695, -206158, -144955, -115427, 561567, -13959, - -139586, 758599, -455803, -1827509, 17723720, -733366, -448824, -1322850, -848793, 1262720, - 777389, 419833, 918049, 103616, -1040993, 572841, 84826, 499290, 289373, 1533840, - -543850, 447750, -464930, -103079, 6442, -42950, 16106, -238371, -15569, -197569, - -209917, 161061, 73551, -172872, -119722, 98247, -363462, -89121, -52613, -34897, - -129923, 159988, 59056, -129923, 143881, -197569, -97174, 1074, -5369, -56371, - -42413, 280784, -102005, -42950, 75699, 140660, -53150, -83752, 30065, 23085, - 75699, 37581, 1074, -55298, -21475, 34897, 54761, -100395, -27380, -122407, - -6442, 77846, -76773, 17717, 26844, -39728, -55835, -37044, 23622, -54224, - -17717, 55835, 34360, -7516, 6442, 27380, - }, - { - -2084670, 4294431, 2076617, -1204738, -229781, -319975, 543313, 26844, -241592, 122943, - 112206, 308701, 869194, 200253, -4235912, 111132, 1580011, 718870, -336618, 480499, - -776315, -190589, -283468, 183073, 302795, -421981, -504659, 853088, 75699, 701690, - -236760, 47782, 87510, -226023, 197569, -107911, -334471, -242129, -245887, 273804, - 284005, 108985, 149250, 61203, 186831, 160524, -26307, -108448, 207769, -168041, - -9664, -46708, 44023, 207232, 145492, 194884, -23085, -99321, 121870, 120796, - -11811, 1611, -183073, -46171, 38118, -2147, 8590, -127238, 28991, -45097, - 80531, -55835, -132070, -17717, 135291, 26844, -70330, 51540, -15032, -10737, - -13422, -23622, -8053, 1611, 537, 24159, 6979, -63888, 98784, -59056, - 52613, 22012, -10737, 10737, -5369, 20938, - }, - }, - { - { - -178241, -5960341, -2399813, 966368, 411243, -56908, 141197, 311385, 105764, 223338, - 19327, -97711, -431644, -464930, -358093, -16106, 174483, -527744, -477815, -445603, - 990527, -439160, 65498, 541166, 575526, 832150, 507880, 656056, 458488, 486405, - 187905, 922344, -128312, -763967, -57982, -1326071, -186831, 203474, 38655, 380105, - -68183, -88584, -35433, 161061, -113280, 173946, 33286, -2684, 129923, -226560, - -52076, -312996, -83215, -143881, -79457, 153008, 122943, 168577, 16106, -9127, - -71941, -95563, 134755, 135828, -5906, -1074, -18790, -9127, -55835, -12885, - -3758, 1611, 75699, 4832, -39728, -78920, 47245, 12885, -24159, 26307, - -12348, 5369, -38655, -6979, 27380, 26844, -3221, -8053, 537, 48318, - -60130, -15569, 20938, 27380, 20401, -2147, - }, - { - 4722854, -21990770, -15597711, -1127966, -155156, -454193, 18790, 510027, -62814, -134755, - -176631, -236223, 379031, 858457, -1047435, -161061, -93416, 220654, 773631, -552440, - 37044, -112206, -127238, 76773, 101469, -56908, -59593, 496069, -258772, 186831, - -308701, 223875, -321586, 500901, -566399, 57982, -597000, 423054, 300111, -425739, - 56371, 340913, 164819, -62814, -233539, 178778, -23085, -155156, 185220, -291521, - -77846, -446140, -228170, -60130, -8590, 35970, -5369, 78920, -66035, -69793, - -65498, 55835, 31139, 44560, 122943, 70330, -22012, -148176, -79457, -69256, - -11811, 71941, -15569, -3221, 42950, -38655, -23085, 53687, 21475, -58519, - -6979, 36507, -20938, -17180, 21475, 84826, -22549, 3221, -23622, -9664, - -2147, -17180, -5369, 11274, -6979, 17717, - }, - { - 2342905, 6179921, -5423470, -194347, 368293, 102542, -205085, 29528, 367757, 595927, - -77309, -343061, -213138, 42413, 2522220, 192200, -1107565, 699006, 540092, -463856, - 491774, 541703, -69793, 284542, -73551, -256087, 28454, 275952, 528281, 191126, - 178778, 315680, 217970, 248034, 25233, -12348, 385473, -336081, 236760, 391916, - -209380, 312459, 119185, -173946, 90194, -72478, -172872, -184147, -351650, 62277, - 223875, -167504, -15569, -154082, 20401, -42413, -234076, -44023, 32749, 18790, - -1611, -117038, -23085, -68183, -153008, -125091, -115964, -22549, 97711, -15032, - -58519, -16643, 52613, -24696, 18254, 11274, 12348, 9664, 44560, -55298, - 14496, -23622, -61203, 10201, 44560, -29528, 13422, 22549, -22012, 32749, - -20401, -22549, -26307, 18790, -17717, -28454, - }, - { - 181999, 4667556, -32749, -306016, 134755, 82678, -110595, -90731, -72478, 249645, - 321049, 230854, -184684, 688269, 3381213, -1168768, -2251637, 202400, 176631, 363462, - 680215, 113280, 118648, -209380, -254477, 191126, -1487132, -1242319, -185757, 169114, - -1430761, 317291, 738198, 247497, -23622, 581968, 462783, 47245, -172872, 75699, - -104153, -108448, 66035, -30065, 107374, -267899, -127775, 123480, -173946, 4832, - 111132, -89657, -71404, 133144, -176631, -17180, 68719, -151934, 75699, 106837, - 1611, -63351, 69256, -126702, -62814, 107374, -5369, 1074, -15569, 46708, - 45634, -43487, 32212, -21475, 59593, -9127, -67646, -38118, 56371, -1074, - 28454, -22012, 24159, -5906, -1074, 40265, -23622, -10737, -9664, -11274, - -15032, -27917, -25233, 22549, -9664, -14496, - }, - { - -2083059, -18389976, -19864, -1392643, 292058, -86436, 41876, -348429, 145492, 423054, - -474594, -236760, 334471, 899259, -444529, 397821, 250182, 2935073, 397284, -57445, - -258235, -154082, 482647, 207769, 266825, 89121, 173946, 100395, -50466, -395137, - -571768, -347892, -375273, 185757, 190052, -264677, -252866, -476205, -175020, 360777, - 21475, -146566, -61740, -64961, -122407, -394600, -117038, 57982, -57445, 0, - -222265, -158377, 61203, -34897, 85899, -47782, 200253, 42950, -172872, 33286, - 21475, -38655, -77846, 61740, 55298, -76236, -11274, 37044, -6442, 1074, - -27380, 47245, 4832, -96637, -31139, 74625, -86973, 88047, -8053, -64425, - -32749, 32749, -42413, 68719, -7516, -33823, 4832, -36507, 37044, 16643, - 12885, 6442, 11274, 0, -22012, -12348, - }, - { - -161061, -3878356, 265214, 394063, 11811, -30602, -223338, -104153, -73014, 64425, - 162135, 365072, 582505, 1102733, -594853, 117575, -243203, 30065, 355945, -3303904, - -636192, 755914, 409096, 1046898, 380641, -863825, 704912, -936840, -1151588, 1169842, - 845035, 381715, -38655, -42950, 26844, 121333, 120259, -104690, -108448, 34360, - -51003, 308701, 162135, 83752, -3758, -96100, 46171, -4295, -236223, -104690, - -178241, -119185, -84826, -124017, -212064, -32749, 137976, 11274, 122943, 44023, - 23085, 11811, -71941, 35970, -75699, -6979, 20401, -77846, 73551, 103079, - -34360, -2147, 57445, 2147, -74088, -85899, -33286, 4295, 6979, 61740, - -44560, 70867, 55298, 23622, -41876, -16643, -537, 3758, -9664, 12885, - 33823, -18790, -56371, 11274, 40265, 26844, - }, - { - -4355097, -24457692, -4523675, 929860, 142271, -103616, 46708, 271120, 195421, 11274, - -345745, 296353, 33823, -485331, -1074, 477815, -30602, -303332, 623844, 103079, - 193810, -144955, -69793, 100395, -223875, 85362, 22012, 74088, 284542, -139050, - 271120, -331786, -153545, 199179, -329639, -71941, 165893, -554051, -92879, 207769, - -17717, 229781, 352187, -79457, 141197, -9127, 368293, 124017, -156766, 24696, - -139050, -158377, -147640, 100932, 2147, -62277, -129923, 16643, -90194, -47782, - 48318, 38118, -49392, -56371, -107374, -95563, -119722, 67646, -19864, -17717, - 159451, 10201, -153545, 10201, 48318, -35433, -24159, 17717, -44560, -50466, - 52076, 26307, -15569, -5369, 51003, -54761, -33823, 6442, 6442, 16106, - -17717, 26844, 9127, 1074, -18790, 1074, - }, - { - 44560, -1167694, 519691, -60666, 49392, 72478, 22012, -51540, -289910, 48318, - 469225, 469762, 481036, 555125, -2050847, -1059246, -570157, 1035624, 294205, -55298, - 804770, 61203, 909459, 529355, -103616, 1215476, 568546, -772557, 362388, 257698, - 292058, -322659, -207769, -204011, 228707, 40265, 38118, -29528, -405874, 404264, - -188442, 277025, 99321, 136902, -297427, 75162, -57982, 232465, -103079, -191126, - -147640, -74625, -111669, -119185, -28454, 97711, -77309, -153545, 125628, 76773, - -166430, -134218, -22549, 42950, 46708, -54224, -96637, -13422, 112206, 20401, - 18790, -27917, -16643, -62814, -11274, 14496, -28991, -18254, 32212, -20401, - 69256, 56371, 9127, -42413, -57445, -20938, -26307, 0, -6979, -23085, - 18790, -12348, -5369, 38655, 22012, 10737, - }, - { - 1471563, 21814138, 658204, -1963337, -190589, -14496, 408022, 519691, -293668, -271120, - 813896, 447213, 134218, -1540283, 989990, -673773, -359704, 66035, -38118, -370441, - -585726, 14496, -438624, -82678, 259846, 294205, -167504, 6442, 368830, -242129, - -77309, -90731, 64961, 291521, 20938, -224949, 446140, -488553, -130460, -141734, - 184684, 20938, -11811, -159451, 67646, -3758, -220117, 64425, 168041, -499290, - -220654, 108985, 40265, 105227, 297427, 91805, -149250, -81604, 111132, 92342, - -1074, -5906, 16106, 39728, 91805, -21475, -78920, 35970, 11811, -13959, - 81604, 105764, -2147, 45097, -9127, 46708, -64961, -17717, -30602, 19327, - -25770, 49929, 43487, 5369, 40802, -5906, -38655, 2147, -7516, 2147, - 30602, 13422, 24159, -34360, 3758, 26844, - }, - { - 368293, 4624606, -1622961, -463856, -83752, -914828, 603980, 696858, -214748, -11811, - -543313, 604517, -109522, -667867, -665183, -62277, 1370095, -1326608, -1644973, 651224, - 525060, 1074, -498216, -275415, 381178, 494458, -45634, 82678, 133681, -91268, - 22012, 34897, -270583, -413927, -6979, -344134, -370441, -153545, 206158, -160524, - 96637, 52613, 148713, 199716, -191126, 47245, 79457, 56908, -22012, -153545, - 31139, -31139, -79994, -24696, 169114, -30065, -40265, -3758, -104690, -49392, - 54224, 69793, 48855, -35970, -537, -62277, -32212, -111132, -79457, 140123, - 3221, 23622, 49392, -26307, -6442, 22012, 4295, 10201, 30065, 42413, - 38118, -13959, -26844, -537, -47245, -6442, 47782, -1611, 9664, -25233, - 9664, 537, -14496, -6979, -24696, 18790, - }, - { - -343597, 25534118, -369904, 2426120, 379031, 1231582, 4049617, 281857, -231928, -368293, - -97711, -93416, -20401, -437550, -635118, 401579, 204011, -1121523, -98784, -483184, - 84826, -387621, -99321, -154619, -270583, -204548, -95563, -112743, -410169, -42950, - -156766, 146566, -11274, -103079, -85899, 82678, -68183, -297427, -73551, -85899, - -121333, 118112, -84826, -118648, 196495, -33286, -69256, 31139, 104690, 99858, - 30602, -13959, -40802, 198105, 100932, 57445, -147103, -93416, 15569, 93416, - 0, 104690, -6442, 7516, -26307, -49929, 19327, -18254, -42413, 5369, - 16106, -25770, -42413, -53687, -22549, -30602, 24696, 92879, -9127, 51003, - -52613, -45634, 50466, -71404, 2147, -40265, -2684, 18790, 13422, -11274, - -35433, 7516, 34897, -6442, -49392, -1611, - }, - { - -322123, -1656784, 547071, -58519, -28991, 158377, 47782, -146566, -191126, 242666, - 142808, 85899, -1613834, -2299418, 1495186, -828392, -783295, -762357, -151398, 489089, - -267899, -1502702, -1095217, 301721, -20938, 462246, -1015760, 23622, -804770, 716186, - 579284, -208306, 180926, 358630, -337155, -214748, -241592, -153008, 102005, -147640, - -57982, 216359, -192200, -221728, -85899, -176631, 175020, -157840, 231928, -148176, - -132070, 33286, -88584, 3221, -11811, 92879, 176094, 222265, 1074, -18254, - -113280, -66572, 74625, 71941, -42413, -86436, 132070, 6442, 44560, -22012, - -46708, -16106, -61203, -77846, -17717, -51540, 20401, 78920, 31675, 19327, - -18254, 24696, 28454, 11274, -12885, 23085, 37581, -23085, -18254, -16643, - -9127, 8590, 6979, 19327, -27380, -1611, - }, - { - -23085, 2976412, 231928, -890669, -145492, -904091, 1598265, 795643, 893890, -355409, - -832687, 79457, -1022739, 511101, -475131, 363998, -267899, -471373, 155156, -624918, - 260382, 239981, 335007, 626528, 123480, -61203, -175020, -25233, 260919, 258235, - -239981, -328565, 63351, 186831, -22012, -200790, 132607, 166967, -266825, 197032, - 200790, 241055, 265751, 142808, 113817, -45634, 6979, 103079, -166430, -136365, - 178778, -18254, 252866, -215822, -112206, 68719, 20401, 221728, 72478, -115427, - 86436, -6979, 86973, -78383, 8053, 68719, 12885, 26307, -105764, -25233, - 58519, 21475, -33823, -32212, 18790, 12885, -6979, -44023, -3221, -42413, - 67109, 27380, -45097, -101469, -16643, 83215, 82678, 19864, 5369, 537, - -5906, -19864, -44023, 2684, -17717, -28991, - }, - { - 90194, 2950106, 1069984, -1014149, -370441, -85899, -28454, -311385, 144418, 535797, - 354335, 271657, -256624, 6514392, 2556043, 2766496, -2051384, -936840, -132607, -82141, - 570694, -64961, 311922, 181462, -89121, -1117228, -223338, 852551, 127238, 1355062, - 157303, 324807, -442382, -245350, 782758, 215822, -161598, 77846, -424665, 70867, - -129923, -83215, -3758, -158377, -137439, 11274, -268435, -75699, -98784, 8053, - -49929, -154619, 106300, 2147, 18790, -66035, -71941, -27917, 45634, -52076, - -85362, 81604, 34897, -64425, 4832, 117038, -10201, -148713, 27917, -3221, - 98784, 8590, -57982, 9664, 16106, -20938, 34360, -69793, -79457, -57445, - -67646, 70867, 18254, -18254, 51003, 537, -18254, -27917, 28991, -31675, - -56371, 537, 46708, -3758, -16106, 39728, - }, - { - 1328756, -488553, 199716, 2279554, -905701, -1163936, 212601, -511101, -44560, 295816, - -828929, 901406, 213675, -1137093, -1715839, -292058, 1059783, -139050, 108985, 192737, - 52613, -357556, -427349, -199716, 286152, 27380, -124017, -271120, 519691, 70330, - 238371, -478889, 171262, -12348, 124554, 273804, -51540, -469225, 6442, 45634, - -117575, 304943, 354335, 128849, -180389, 152471, 12348, -8053, 81604, -168041, - -51540, -35970, -56908, 115427, 148713, 151934, 133681, -54761, 93416, 105764, - -35970, 98784, -76773, -74088, -27380, 51540, -9664, -53150, 67646, -25233, - 11274, 57982, -129923, -113280, 22549, 64961, 32749, -8053, -49392, 45634, - -14496, -80531, -8590, 5369, -2684, -1611, -2147, -79457, 23622, 18254, - 12885, 30602, 3221, -9127, -27380, 30602, - }, - }, - { - { - -190589, -149250, 62814, -205622, 321049, -168577, 22012, 271657, -250182, 85362, - -300648, 468688, -864899, -187905, 351114, -341987, 1212255, -458488, -599148, -679679, - 937914, -98247, 108448, 130460, -301185, 258772, -13422, -272730, 411243, 780073, - -948651, 726386, -569620, -513249, 642098, -695248, 196495, -313533, -315680, 60666, - 32749, 149787, -67646, -33823, 15032, 190052, -104153, 133144, 192200, -201863, - 143881, -395674, -132070, 57982, -218506, 54761, 177704, 36507, 112206, 176094, - 128849, -84826, -37044, 81604, 69793, -22012, -120259, -19864, 53150, -25233, - -6979, 8053, -42950, 77846, -34897, -31139, 28991, 49929, -16643, -16643, - -26307, 56908, 7516, -23085, -64425, -15569, 32212, 10201, -30065, 13422, - 25770, -36507, 9664, -22012, -3221, 17180, - }, - { - -5369246, -12867722, 947040, -1560147, 1045825, 245887, -608275, 266288, 892816, -16643, - -94489, 406411, -295816, 832687, -205085, 315143, 930934, -60130, -577673, -265751, - -67646, -405874, 244813, 245350, -124554, -245350, -4295, 708670, 22012, 383326, - -238908, 338229, -566399, 100932, -107911, 190052, -672162, 121333, 58519, -140123, - 245350, 204011, -10201, 107374, 40802, -186294, 300648, -322123, 277025, -172872, - 185757, 64961, -144955, -154619, 11274, -38655, 75162, -101469, -100932, -34360, - 31675, -48855, -5369, -67109, -33286, 24159, 160524, -26844, 19327, -117575, - -33823, 15569, 32749, -38118, -61740, 104153, -58519, 11811, 44023, 42413, - 9664, -17180, 28991, -13959, -24159, -49929, 86973, -50466, 19327, -23085, - -9664, -6442, 26307, -23085, 7516, -20401, - }, - { - -2553358, 10747082, 4946192, 1449015, -1114544, -374199, 17717, -306016, 62277, -49392, - -44560, -106837, -42413, -301185, 1515050, 172336, -676457, 1182190, -466004, -769873, - 55298, 357019, -27917, 563178, 402653, -46708, -144955, -345745, 179852, 300648, - 122943, -197569, -61203, 13422, 149250, -33286, 100932, -144955, 74088, -122943, - 74088, -159451, 244813, 12885, -76236, -215285, 130997, 58519, -113817, -197569, - 54224, 81068, 118112, -173409, 60666, 154619, -41339, -153008, -56908, -15032, - 162672, -44560, -99858, -45097, 33823, -41876, -35433, -1611, 132070, 53150, - -51003, 17180, 55835, -15569, -51003, 16643, 1611, 5906, 537, 18790, - 68719, -19864, -2147, -77309, 40802, 19327, -25770, 21475, 3758, 22012, - 36507, -33286, -6442, -15569, 8053, 7516, - }, - { - -205622, 4407710, 564788, -142808, -250719, 19864, 27380, 85899, -32212, -37581, - 11811, 264141, 278636, -149250, 1712618, 1607392, 1357747, 851477, 118648, 415538, - -484794, 223875, 799401, -214212, 492311, 999117, -179315, -1245541, -1220845, 807991, - 351650, -96100, 128312, 250719, 202937, 448824, -358093, 352187, 172336, -311385, - -170725, -30065, -11274, 59056, 285078, -25770, -62814, 125091, -50466, -61740, - -13422, 158377, -47245, 23622, -180926, -199716, 68719, 111132, -118112, -51540, - 106837, 80531, 0, -64425, -52613, 51003, 9664, 13422, -6979, -47782, - -33823, 45097, 110059, 2147, -37581, 79457, 16643, -34360, -15569, -37581, - -1074, 33823, -31139, -13959, -71941, 11274, 39192, 23085, -6979, -28454, - 20938, 28454, -28454, -13959, 11274, -22549, - }, - { - 3368328, -8106751, 3781182, -52613, 328565, -294205, -71941, -258235, 168577, 680215, - 212601, -943819, 102005, 894964, -419833, 848256, -488016, 1849520, 593779, 221728, - -75699, -259309, 173946, -501974, 926639, -429497, 45097, -229781, 372052, 117038, - -99858, -12348, 103616, -79457, -54224, -38655, -19864, 125628, 22012, -190052, - -23085, -78920, 150861, -59056, -23085, -147103, -51540, 147103, -24696, 11811, - 135291, 98784, -319438, -92342, -30065, -69793, -98784, 50466, -4295, 194347, - -85899, -45097, 53687, -67646, -82141, -13959, -41339, 87510, 57982, 18254, - -50466, -26307, 59056, 100932, 51003, 15032, -4832, -34897, 1611, 11811, - -54224, 6979, 4832, -50466, -15569, 17717, 13959, -8590, 11811, 38655, - -22549, -5906, 3758, -8053, 21475, 19327, - }, - { - 398895, -1454383, -341987, 236223, -40802, 89121, 41339, 68719, 15569, -106300, - -246961, 84826, -430570, -1096290, 522912, 1774358, -1592896, -448824, 1173600, -1761474, - -755377, 205085, -648003, -266288, 115964, 104690, 807454, -769336, -89121, 332860, - -579284, -139586, 233539, 140660, -230318, 199716, 80531, -425202, -100932, 2147, - 256087, -152471, 86973, 145492, -200253, -77846, -63888, 95563, 24159, 146566, - 83752, 5906, -78383, 129386, 146029, -70867, -36507, -20938, 59056, -2684, - -1611, 85899, -13422, -10201, -11274, -51003, -3221, -16106, 18254, 65498, - 51540, -9664, -33823, 3221, 31139, -19864, 16106, -86973, -28991, 4832, - 4295, -19864, -10201, 22549, 33286, -12885, -11274, 15032, -12885, -34897, - -6979, 37044, 20938, -33823, -8590, -20401, - }, - { - 1765232, -5708549, 2599529, 245887, -6979, -301185, 95026, -311922, -390305, 308701, - 86973, 121870, -24159, 27917, 297963, -711891, -221728, -196495, -387084, 276489, - 424128, 328565, -84826, -149250, -229244, -1611, 282394, -215822, 31675, -355409, - 259309, -108985, -294742, 173946, -394600, -231391, 240518, -228170, 108448, 177704, - -230318, -190052, 184684, 86973, 14496, -114354, 93952, 246961, 537, 49929, - 136365, -153008, 92879, -23085, 27917, 38118, -139586, 82141, 9127, -55298, - 5906, 537, -10201, 35433, 31675, 41876, -76236, -46171, 51003, 14496, - -26307, 98247, 53687, -55835, -39192, -5906, 47245, -30065, -13959, -6442, - -83752, 34897, 1074, -93952, -19327, 51540, -17717, -17717, 1611, 45634, - 23085, -22549, 17717, -8053, -2147, 6979, - }, - { - 357556, -293668, -1051193, -27380, -211527, 32749, 19327, -36507, 26844, -103616, - -69256, -31139, 64961, 316754, 1174674, 2641405, -223338, 1658394, -170725, -741419, - 95026, 2684, -316217, 10737, -67109, 1091995, 1072131, -572841, 407485, 406411, - -73014, -194347, 315680, -257698, 174483, 280784, 4295, -144418, -505732, -84289, - -277025, 267899, -171262, 20401, 537, 126165, 92342, -213138, 83215, 326954, - -117575, -120796, 79994, 201863, -104690, 48318, -8053, -222801, 3758, 247497, - -81604, -34897, -89657, 2147, -1074, 73551, 99858, -19864, -29528, -25233, - -11274, -60666, 22012, 32749, -41339, -37044, 30065, -18790, -25233, -4832, - -35433, 33823, 14496, 22012, 49929, -18790, 19864, -36507, 8590, 10201, - -37581, -2147, -2684, 10201, 8053, 1611, - }, - { - 54761, 18606872, 965294, -1501091, -249108, -136365, -124017, -340376, 597537, -173409, - -703838, 261993, 319975, -661425, 395674, 759672, 93952, 53150, 261993, -62277, - -468688, -321049, 78920, 70330, -98784, 599685, -402653, -123480, 583579, -278099, - 214748, -296890, -63888, 122943, 48318, 16643, 682900, -128312, 274341, -102005, - 249645, -219043, -140123, -246424, -272730, 182536, -345745, -492311, 331786, 9127, - -44023, 127238, 185757, 121870, -41876, -42413, 45634, 88047, -106837, 86973, - 151934, -60666, -16643, -106300, -55835, 181999, 64425, -54224, 3221, 15032, - 9664, 94489, 47782, -36507, -51003, -69256, 92879, -34897, -50466, -7516, - 38655, -11274, 10201, 14496, 27917, 32212, 35970, 3758, -41876, -15569, - -14496, -537, 7516, 26307, -36507, 23622, - }, - { - -366683, 4340602, -542777, -1159641, 642635, 458488, -251792, 311385, -53150, 191126, - -737661, 188979, 710817, 486942, -295816, -1367410, 891743, 85899, -987843, -1295470, - 388695, 491237, 78383, -365609, -237297, 162672, 171262, -205085, -274878, 309238, - -372588, 548145, -185220, -253940, 149787, -194347, -235686, -342524, 74088, -121333, - -137439, -122943, -78383, 102005, 260919, -153545, -6442, -132070, 196495, 160524, - -25770, -100395, -73551, -144955, -41339, 266825, -537, 74088, -49929, -91805, - 9664, 32212, -30602, 62814, -33823, 68719, 114354, -61740, -61203, -67109, - 2684, 2684, 537, 106300, -20401, -45097, 25233, 45634, -10201, 8590, - 44560, 12885, -18254, 2684, -6979, -51540, 3221, 22012, 11274, 28991, - -36507, 19864, -19327, 12885, -10737, -20401, - }, - { - -1061931, 21522618, -4050691, 272730, 280247, -1256815, -1772748, 228170, 284542, 293668, - 195958, 352724, -39728, -187905, -695248, -247497, -318901, -583579, 279173, 148713, - -76773, 5906, -199716, 184684, -321049, -174483, 121333, -54761, -49392, 187368, - -237297, 34360, 277025, 244813, 44560, -489089, 394600, -337692, -111669, 198642, - -392990, -340376, 115964, -66572, 285615, 99321, 30065, -38118, -137439, 123480, - -42413, 30065, -12885, -80531, -3221, 84289, 83752, 149250, -120796, -3758, - -26844, 105764, -2684, 40265, 59593, -140123, 47782, 1074, 42950, -4832, - 18790, -1074, 55835, 3221, -85362, 3221, -62814, -20401, 21475, -13959, - 9127, -15569, -2147, 66035, -19327, 38118, -69793, 14496, -42950, 1611, - 15032, -7516, -10737, 11274, 24159, -29528, - }, - { - 296890, -1879585, 118648, -398895, 72478, -443455, 193274, 148713, -184147, 241055, - 3758, -328565, 1369021, 2039036, 980326, -919660, -64961, -166967, 52613, 59593, - -789737, 1499481, -181999, 617402, -1181653, 234076, 38655, 659814, -644245, 646393, - -571768, 249645, -37044, 674847, -30065, 63888, -102542, 215285, -405874, 8590, - -238371, 51003, 121333, -242666, -164819, -110059, 95563, -17717, 165356, -12348, - -33823, 6442, 107374, 2684, -52076, -121333, -57982, 165893, 190052, 17717, - 81068, -115964, -83752, -11274, 104153, 51540, -82678, 83215, 1611, 53687, - -24159, -41339, 27380, -37044, 17180, 12885, -28454, -38655, 1074, -14496, - 59056, -23622, -23622, 48855, 6979, -5369, 11274, 24696, 10737, -6442, - 13422, 21475, -27380, -17717, 15569, 0, - }, - { - -632434, 1116692, 2843268, -1297617, 445066, -1021665, -1131724, -308164, 19327, 601295, - -17717, -130460, -299037, 1023813, 532576, 267362, 265214, -95026, -138513, -116501, - -497142, 473520, -115964, 249645, -127775, 93952, -439697, -40265, -1611, -195421, - 139586, -254477, 47245, 421981, 511101, -179852, -153545, -5906, 136365, -152471, - -240518, -45097, 327491, 61740, 304406, 48318, 177704, -252866, 306016, 96637, - 90194, -85899, 111132, -70867, -91268, -126165, -72478, 72478, -8053, 69256, - -27917, -26307, 33823, -29528, -77846, 0, -2684, 79457, 76236, -46708, - -78920, 85362, 38118, -62814, -22012, 26307, -23622, 55298, -31139, 0, - -81068, 52613, 28991, -8590, -20938, -76236, 22012, 59056, -16643, 12885, - 25770, -1074, 13959, -32749, 11811, -17717, - }, - { - -266288, 1387811, 832687, -201863, -4295, 159988, 146029, 152471, -104153, 122943, - 370978, -135828, 724239, -674310, -15247134, 417149, -639413, -393526, 879395, -550293, - -440771, -751082, -127238, 51540, -415538, -543313, -1204202, 471910, -480499, 601295, - -42413, 30602, 87510, 324270, 167504, 324270, 57445, 49392, -103616, 102005, - 222801, -111669, -262530, -8053, 18254, -22549, 73551, -92342, 30065, -61740, - 175557, -255551, -30065, -96100, 48318, -9664, -17717, 55298, 30602, 33823, - 54224, -148176, 13959, -9127, 29528, -61203, 168041, 45097, -13959, -46171, - -23622, -25770, 49929, -19864, 38655, -7516, -81068, 84826, -30065, 63888, - -12348, -55835, -2684, -5906, -24696, 33286, 51540, 54224, -40802, 44560, - 0, -32212, -11274, 32749, -1074, -33823, - }, - { - 7516, -3463354, -949725, 1935957, 22012, 898185, -89657, -426276, 322659, 492311, - -288837, -62277, -278099, 792421, 1911797, -246424, 158914, 195421, -259309, 126165, - 734439, 162135, 131533, 82678, -381178, 144955, -171262, -1283658, -139050, -486942, - 302258, -348966, -66035, -40802, -384400, -141734, 189515, -9127, -264677, -165893, - -145492, 45634, -17180, 82141, 112206, -2147, 48318, 154619, -35433, -163746, - 63888, 79994, -46171, -145492, -9664, -105227, 69793, 66572, 4295, 70330, - -20938, 31675, -20401, 48318, -32212, 42950, 83752, 45634, 57982, 16643, - -60666, 57445, 60130, -6979, -76773, -25770, 5369, 9664, -46171, 15032, - 21475, 19327, -24696, 2147, 12885, -10201, 6442, 34360, -73551, 36507, - -10201, -16643, 27380, -3758, -2684, 8053, - }, - }, - { - { - 644782, 239444, -526134, -1211718, -108448, 30602, 33823, 62814, -52613, 123480, - -143881, 249108, -158914, -1071058, 142271, 34360, 978179, 83215, -54224, -214748, - 26307, 225486, 113817, -140660, 22549, -290984, 25233, 86973, 363998, 525060, - -955093, 528818, 7516, -449898, 146029, -24696, 151934, -697932, -534187, -331249, - 359167, 14496, -29528, -40802, -18790, 150324, 26307, -35433, 135291, -146566, - 145492, -235686, -152471, 42413, -75162, -22549, 30602, 28991, 43487, 161061, - 94489, 51003, 62814, -53687, 102005, 3221, -68183, -6979, 103616, -2147, - -20401, -24159, -17180, 34897, 42413, -9664, 17180, 28991, 51540, -14496, - -17717, 48855, 62277, 3221, -41876, -3221, 12348, -6442, -11811, -40802, - 26844, -11274, -11811, -14496, -15032, -537, - }, - { - 4608500, -19887846, -3893388, -1568200, -99858, 290984, -321586, -606664, 428423, 444529, - 136365, 359704, -537, -206695, 283468, 406948, 267362, -127775, -419296, -99858, - -195421, -670552, 188979, 356482, -121870, -74088, 45097, 471373, 321586, 384936, - 165893, 105227, -566399, -252329, -46171, 253403, -216359, -162672, -192737, -46171, - 97711, 104690, 168577, 95563, 92879, -231391, 63888, -65498, -113817, 19864, - 40265, 169114, 147103, -134755, 59056, -78383, 89657, -49392, 17180, 25770, - 38655, -44023, 11274, -12348, -33823, -68183, 120259, 16643, 85362, -6442, - -57445, -55298, 44560, -16106, -88584, 23622, 15032, -22549, 16643, 82678, - 4832, -23085, 20938, 30602, -12885, -88047, 54761, -25770, 11274, -3221, - -10737, 12348, 21475, -19327, -2147, -20938, - }, - { - 1773285, 7306276, 1254667, 3101503, -268435, -164283, -19864, -149787, -193810, -400506, - -268972, -16643, 118648, 363998, -9664, -86973, 158914, 454193, -784905, -208843, - 35970, 395674, 228707, 371515, 134218, 156766, 20401, 67109, -337155, 164283, - -31139, -145492, 6442, -132607, -8590, -54761, 15569, 105764, 133681, -277562, - 90194, -92342, 434865, 86973, -25233, -170188, -100932, 242129, 230318, -91805, - -187368, 42413, 90731, -107374, 14496, 172872, 116501, -47782, -75699, -48855, - 132607, 93416, -86973, 22549, 78920, 31675, -19327, 99858, 23085, 87510, - -537, 32212, 22549, 14496, -18254, -5906, -18790, -28991, -17180, 53150, - 3758, 8590, 39728, -76236, -25770, 18254, -25770, -13959, 17180, -2147, - 30602, 537, 5369, -12348, -1611, 11811, - }, - { - 27380, 4027069, 8590, 101469, -73551, -102542, 48318, -17717, 137439, 40802, - -129386, 74088, 48318, 1043140, 688805, -96100, 1804423, 1431298, -97174, 55835, - -865973, 555661, 158377, 641024, 653372, -155693, 207232, -277562, -786516, -117575, - 497142, 356482, -242666, 244813, 206695, 282394, -7516, -6442, 313533, -132607, - -96637, 5369, 90731, -78383, 191126, 165893, 28991, 10737, 119722, -114354, - -107374, 229781, 26307, -71404, -18254, -141197, -72478, 191663, -120259, -108985, - -18790, 90731, 0, -8590, -25233, 15569, -8590, 33823, 42413, -77309, - -80531, 4295, 74625, 37044, -64961, 48318, 48855, 27917, -34360, -28454, - -20938, 38118, -26844, -11274, -54761, -29528, 30065, 16643, 33286, -8590, - 5369, 22012, 9127, -6979, 8053, 16643, - }, - { - -2166811, 2143189, 155693, 834297, -35970, -134755, -85362, -236760, 146029, -27380, - 992674, -201327, -68183, -268972, 455803, 136902, 195958, 702227, 565862, 390842, - -261456, 74625, 231928, -485331, 284005, -35970, -160524, 215822, 62277, -9664, - 216896, 55298, 122943, -167504, -44023, -103079, -249108, -173409, 158377, -397284, - -402653, -3758, 370441, -32749, -308164, 183073, 166967, 44023, -19327, 35433, - 207232, 195958, -194884, -123480, -210990, 63351, -255014, -7516, 89121, 59593, - -29528, -55298, 100932, -38655, -89121, -7516, -11811, 26844, 37581, 24159, - -12348, -49929, -9664, 66035, 83215, -10201, 51003, -54224, -6979, 64425, - -30065, 0, 16643, -59593, -44023, 18790, 5906, 12885, -13422, 9664, - -20938, -15032, -2684, -15569, 17180, 20938, - }, - { - 64425, 722628, -229244, -301721, 11274, -47245, 177704, 33286, 178241, -120259, - -148176, -191663, -410706, -911607, -111669, -79994, 245887, -818728, 1104880, -496606, - -1065152, -676994, -163746, -846645, -413927, 194347, -144418, -90194, -169114, 112206, - -570694, -277562, 307627, 496606, -338766, -37044, 155156, -239981, -157303, -96100, - 368830, -147103, 94489, 150861, -69256, -39728, -26307, -162135, 192737, 69256, - 174483, 53687, -117575, 18254, 236760, 24159, -69256, -19864, 8590, -7516, - -42413, 9664, 57982, -57982, 33286, -25770, -25233, 2684, -46708, -55298, - 44023, 43487, -48855, -9127, 64961, 38118, 62277, -21475, -8053, -42413, - 35433, -11811, -37044, -16106, 22012, 6979, -1611, -4832, 537, -12885, - -47782, 17717, 51540, -12348, -17717, -14496, - }, - { - 2001992, 1260573, -2493766, -907312, 277025, 51540, -44560, -140123, -154082, 96100, - 216359, -168041, -55835, -2684, 18790, -535260, 46171, 84289, -372052, -27380, - 121333, 145492, -239444, -65498, -11274, -238371, 440234, 56371, -328565, -307627, - 35970, 112743, 218506, -221728, -7516, -104153, -56908, -95563, 93416, 33286, - -120259, 537, -15569, 117038, -258235, 63351, -171799, 103079, 81068, -73014, - 49929, -29528, 82141, -183610, 76773, 100395, 5369, 48855, 90194, -1611, - -8053, 27917, -5369, 29528, 46171, 85899, 60666, -48318, 13959, -1074, - -56371, 13422, 90731, 7516, -42413, -11811, 59593, -34897, -537, -15032, - -66035, -15569, 27917, -19327, -72478, 51003, 33286, -4832, -22549, 5906, - 28991, -20401, -15032, -2147, -2684, 10737, - }, - { - 3758, 1437203, -724239, -57445, -195958, -70867, -57445, 22012, 170188, -65498, - -294205, -243203, -579284, 2423972, 1861868, -401579, -679679, 364535, -239981, 302258, - -1134408, -367757, -506269, 76236, 527207, -40802, 408022, 365609, -221728, 282394, - -63351, 46171, 301185, 40802, 13959, 54761, -4832, -140660, -345208, -207232, - -33823, 75162, -176631, -188442, 183610, 16643, 33823, -255014, 10201, 256087, - 0, -35970, 120259, 195958, 114354, 15569, 38118, -131533, -74625, 95563, - 68719, -27917, -19864, -23085, -35970, 43487, 75162, 19327, -54224, -59593, - -25233, -26844, 17180, 34897, -3758, -12885, 7516, 53150, -25770, 16643, - -54761, -11274, -5906, 17180, 60666, 537, 40265, -15032, -4295, 28991, - -29528, 0, 21475, -3758, 1074, -8590, - }, - { - -389231, 23291070, -2918430, -1061394, -186294, -11274, -96637, -545998, 489626, 237297, - -546535, -251256, -133681, -784368, 178241, 1197759, 478352, 122943, 77846, 2147, - -110059, -132607, -399969, 313533, -91268, 248034, 127775, -82141, 282931, -4295, - 104153, -296353, -133681, 13422, 147103, 409633, 155156, 1074, 314606, 90731, - -22549, -223338, -23085, -216359, -333397, 177167, 40265, -549219, -37581, 258235, - 52076, 151934, 132070, 132070, -186294, -54761, 57445, 82141, -61203, -46708, - 90194, 17717, -46708, -80531, -76236, 11274, 115427, -25233, 18790, 71404, - -32749, 12885, 55298, -43487, -13959, -69256, 52076, -26844, 12348, -46708, - 37581, -17180, -39192, 12348, -25233, 19327, 46171, 14496, 2147, -5369, - -32749, -15569, -2684, 43487, -23622, 11811, - }, - { - 185220, 3252364, 163209, -603980, -122943, 1233729, -271657, -288300, -42413, 115427, - -236760, -530428, 83215, 751082, -484794, -187905, -151934, 673236, 262530, -1117765, - -77309, 90731, -73014, -4832, -137439, 118112, 208306, -267362, -438624, 405874, - -511638, 266288, 67109, 17717, 47245, 76236, -66572, -30602, 85362, -81604, - -110059, -29528, -1611, -83752, 264677, -66035, -56908, -97711, 59593, 143345, - 137439, -15569, 10201, -45097, -185220, 185220, 37044, 57982, 1074, -17180, - -47245, -38118, -56908, 52076, -70867, 15032, 96637, 48318, 65498, -94489, - 12885, -18254, -61740, 76773, -10737, -31139, 0, -5906, -28454, -36507, - -6442, 3221, -537, 17180, 40265, -10201, -36507, 7516, -4295, 34897, - -16643, 5906, -2147, 7516, 20938, -15032, - }, - { - 1793149, 14520211, -123480, -1499481, 639950, -569620, -2124398, -294742, 198105, 133144, - 157840, 215822, 244276, -144418, -191126, -702227, -474057, -59593, 44560, 475131, - -98784, 304943, 2147, -234076, 102005, -22012, -120796, -150861, 220117, 16643, - 253940, -11811, 234076, -1074, 135828, -352724, 56371, 4295, -337692, 159988, - -69793, -268972, -80531, -69256, -19864, 123480, 90194, -3221, -94489, 5369, - -7516, 41876, 29528, -112206, -75699, -22012, 66572, 127775, -35970, -55835, - 4832, 18790, 15569, -2684, 27380, -71941, 1611, 5369, 33286, -537, - 6979, 21475, 63351, 70867, -4295, 3221, -22012, -61740, -2684, -31139, - 26844, 26307, -31139, 77309, -10201, 61203, -32212, -3221, -26307, -1074, - 20401, 3221, -30602, -8590, 42950, -537, - }, - { - -267899, -1523103, 115427, -185757, 82141, -220654, -82678, 162672, 5369, 68183, - -180389, -247497, 600222, 3711926, 430570, -1021129, -106300, 150861, 688269, -427886, - -693100, 1843615, 402653, 523986, -617402, -593242, -39192, 631897, -92342, 484258, - -606664, 193274, -164819, 108448, 323733, 34897, 76773, 186294, -253940, 188979, - -102005, -122407, 48855, 35970, -37581, -111132, -113817, 44023, 150324, 133144, - 74088, -31139, 10737, 37581, -25233, -92879, -150324, -49392, 2147, 16643, - 56908, -42950, -77846, -68183, 5369, 82678, -110059, 55835, -1074, 34897, - 25233, -10737, 32212, 40802, 34897, 43487, 3758, -44560, -40802, -17180, - 39728, -20401, -25770, 5369, 17180, -20938, -13959, 12885, 8590, 8053, - 7516, 22012, -4832, -16106, 12348, 10201, - }, - { - 598074, -2002529, 1171989, 468688, 416612, 1121523, -1450625, -683437, 53150, 547071, - 434865, -196495, 277025, -42413, 539018, 180926, 27917, 205085, -568546, 403190, - -88047, 218506, -89657, -24696, -91268, 486405, -98784, -22012, 90731, -130997, - 10737, 77846, 66035, 291521, 376883, 195421, -137439, -314606, 290447, -76236, - -251256, -179315, -26307, 133681, -81604, -161598, 171799, -306016, 146029, 106837, - 93416, 20938, 79457, 79457, 34897, -32749, 57445, -49929, -124554, 96100, - -17717, -8590, -37581, 4295, -67646, -88584, 32212, 11811, 74088, 41339, - -103616, 24696, 71404, 66572, -15569, 7516, -43487, 74088, 13422, 49392, - -70330, -33286, 22012, 61203, 20401, -71941, -51540, -5369, -31675, 1074, - 11274, -2684, 47245, 1611, 20938, 24159, - }, - { - 119722, 393526, -719944, 839666, 4295, 95563, 131533, 297963, 240518, -293132, - 24159, -26307, 129386, -3485903, -8586713, -1964411, 787590, -346282, 767189, -136902, - -639413, 79994, -391379, 102542, -355945, -51540, -539555, 417149, -900333, 41876, - -73551, 119185, 415001, 233002, -348429, 146566, -28454, -56371, 158377, -90731, - 150324, 24696, -132070, 34360, 32212, 8590, -13959, 23622, 41339, -52076, - 112743, -30602, -57982, -157303, 10737, -27380, -1074, 29528, -8590, 28991, - 97711, -16106, -45097, 42413, 71941, -42950, 114890, 140123, -26307, -8590, - -73014, -62277, 90194, -9127, -4832, 46708, -67646, 67646, 0, 22012, - 49929, -60666, -48318, -3758, -53687, -7516, 32749, 53150, -38118, 13422, - 45634, 8053, -25233, 17180, 26844, -44023, - }, - { - -994285, -2556579, 122943, 185220, 308164, 2216740, -347892, -227096, 331786, 136365, - 853625, -622770, -142271, 751082, 1335735, 347892, 335007, 644782, 31139, -51003, - 440234, -91268, 286152, 699006, -373662, -290447, -405338, -1101659, -47245, -370441, - 140660, -16106, -82678, -279710, -372052, -373662, -27380, 182536, -165356, -350040, - 79457, -5906, 4832, -22549, 203474, -65498, -77309, 185220, -7516, -19864, - 132070, 40265, 74088, -130997, -46171, -164283, 28991, 75162, 42413, -15032, - -7516, -34897, -15569, 31139, -10201, 20938, 46171, 19327, 3758, 67109, - -40802, -56908, 96100, 98784, -25770, -52076, -41876, -5369, 9127, -26307, - 11811, 57445, 10737, -16643, 2684, 14496, 3758, 76773, -33823, -12885, - 1611, -6442, 3758, 16106, 15569, -5369, - }, - }, - { - { - -566936, -1632625, 277562, -774705, -188979, 146566, -25770, -249108, 89657, 8590, - 69793, -25770, 585189, 457414, -106300, -807454, -204011, 149787, 801011, -137976, - -1015760, -244813, 337692, 115964, 423591, -277562, -324270, 175557, -226023, -137439, - -389231, -216359, 277562, -71941, -245350, -187368, 430570, -63351, -306553, -426276, - 123480, 68719, 79457, -98784, -231391, 159988, 69256, -224412, 24696, -304406, - 79994, -4295, -48855, -60666, 37044, 4832, -85899, 124554, -120796, -74625, - -21475, -35433, 81068, -39728, 27917, -14496, 49392, -54761, -34360, 60666, - 37581, -37581, 61203, -23085, 55835, -6442, 13422, -54761, 42413, 21475, - -3758, -2147, 11274, 20401, 52076, 42413, -16643, -36507, 14496, -537, - -43487, 26307, -9664, 22549, 10201, -24159, - }, - { - -2852395, -23443006, 877247, -88584, -125628, -56908, 271657, -506269, -365609, 101469, - 86436, -216359, 141734, -586800, 221728, 418222, -582505, 181999, 549756, -100932, - 61203, -180926, 28991, 104690, 34897, 411243, 251256, 141197, 36507, 118112, - -67646, 31139, -103616, -82678, -520228, 262530, 323733, 234613, -38118, -132607, - -369367, -116501, 188442, 154619, -23085, 48855, -155693, 253940, -281857, -41876, - 27380, -93952, 252866, 4295, 98784, 30602, -30602, 130460, 67109, 73014, - 25233, 68183, 30065, 50466, 51540, -87510, -35433, -53687, 47245, 119722, - 0, -19327, -43487, -24696, 23622, -110059, 69793, 1074, -25233, -15032, - -20401, 37044, -20401, 18254, 34897, 36507, -88047, 34897, -5906, 20938, - 7516, -537, -20401, 15569, -15569, 6442, - }, - { - -1238561, 2370822, -1915019, 911607, 1124208, 345208, -286689, 41339, -64425, 260919, - -83215, 66035, 190589, -646393, -1269163, -212601, -243739, -398895, -608275, -43487, - 297427, 70867, 537, -144955, -448824, 260382, 455267, 543313, -581968, -148176, - 128849, 102005, 82141, 262530, -105227, -231928, 38655, 53150, 404264, 68719, - -97174, 96637, 269509, 79994, 198642, 246424, -143881, 125091, 142271, 212601, - 32749, 7516, 42413, 12348, 11274, -5369, 40802, 110595, 16643, -13422, - -76236, 6442, 25770, 27917, -13422, 49392, -28454, 96637, -75162, 28454, - 41876, 9664, -537, -17180, 31139, -9664, -10201, -3221, 18254, -3758, - -37044, 8053, 1074, 15569, -13959, -15032, 22549, -35433, -21475, -537, - -25770, 27380, -13422, 19864, -13422, -8590, - }, - { - 150324, 4225711, -416612, -235149, 233539, -71941, -148713, -208843, 50466, 86973, - -67109, 168577, -95563, 512712, 1270237, -1640678, -1331440, 146029, -450972, 303869, - 150324, 137439, -485331, 1087701, -13422, -632971, -376883, 344671, 159451, -434329, - 194347, 440771, -384400, 109522, -328565, -241592, 438087, -237834, 81068, 215822, - -74625, 140660, 290447, -15032, 57982, -130460, 76236, 38118, 60130, 86973, - 146029, 17180, -17180, -38118, 48855, 147103, -12348, 4295, 56908, 7516, - -93416, -15032, 73014, -1611, 7516, 51003, -33286, -22549, 27917, 66572, - 37581, -100932, -24159, 16643, 11811, -32212, -11811, 24159, 23085, 26307, - 8053, -26844, 13959, -11274, 18790, -3221, -53687, -25233, 39728, 25233, - -7516, -28454, 10201, 35970, -9127, 16643, - }, - { - -783295, 5074504, -1029182, 649614, -102005, 103616, 208306, -241055, 212064, -335007, - 426812, 927176, -319438, -787590, 699543, -789737, 82141, 53150, -243203, 207769, - -286152, 338229, 98784, -85362, -512175, 253403, -101469, 948114, 314606, 89657, - 30602, -66572, -259846, 121870, 274878, 31675, 44560, -649077, 21475, 134218, - -233539, -12885, 81604, 31675, -271657, 34897, 250719, 87510, -10201, -45634, - -49392, 54224, 152471, 89121, -117575, 30065, 29528, 38118, -44560, -149787, - 61740, -44023, 1074, 52613, 12885, -33823, 52076, -9664, -68719, -18790, - 49929, 18254, -30065, -64961, 3758, 5906, -49929, 29528, -35970, 12885, - -12348, 20938, -20401, 44560, -38118, -23085, 2147, 4295, 3758, -27917, - 16106, -9664, -3221, 7516, -19864, -8053, - }, - { - -350577, 368293, 2035815, -233002, -11274, -118648, 4295, -1611, 168041, 102542, - 216359, -41339, 239981, -431107, -944893, -271120, 2349347, -218506, 270583, 644245, - 636729, -563178, -217970, 178241, -747861, -799938, -313533, -86973, -1247688, -380641, - -238908, -179852, -35970, 228707, -19327, -6979, 135291, 181462, 84826, -26307, - -151398, 197569, 90731, -22012, 238371, 128312, 46171, -246424, 53150, -89657, - 67109, 120796, 69793, -136365, 31675, 63351, -28454, -25770, -14496, 20938, - -45634, -100932, 54761, -9664, -29528, 5369, 13422, -11811, -6442, -64961, - -77846, 61203, 24696, -18790, -3758, -5369, 10201, 68719, 60666, -4832, - -37044, 49929, 0, -15569, -38118, 18790, 8053, -16643, 1611, 33823, - -3221, -38118, -20938, 24696, 3758, 5369, - }, - { - -4309463, -2993055, 865436, -1071594, -419833, 258235, -25770, 388158, 318364, -143345, - -127775, -125628, -359704, 471373, 386010, -274341, -56908, 131533, 493921, -317828, - -249645, -359704, -193810, 158914, -15032, -254477, 23622, 277562, -324270, -273267, - -73551, 80531, 540629, -235686, 244276, 171799, -176631, -193274, -31675, -31675, - -93416, 341987, 263604, -119185, -250182, 31675, -50466, -95026, -5906, 123480, - -195958, 71404, -20938, -170188, -9664, 12885, 26844, 6442, 40802, 35970, - 62277, 37581, -44560, 10737, -52613, -45097, 43487, 80531, -46171, -63888, - 64961, -81604, -108985, 62814, 20401, -30602, -7516, 11811, 7516, -31139, - 71941, -51003, -4295, 74088, -3221, -59593, 18790, 37044, 2147, -23622, - -24696, 30065, -13422, 11811, -16106, 6979, - }, - { - -353798, 338766, 826244, 166430, 244813, -45634, -97711, 70867, -21475, 108985, - 33823, -27917, -514859, 579821, 1474784, 159988, -499827, -423591, -562104, 1514513, - 91268, -438624, -84826, -128849, -339839, -916439, -449898, 222801, -198105, 27917, - 133681, 227096, -228170, -25770, 62814, -319438, -78383, 5906, -81068, 205085, - 67646, 8053, 61203, -44560, -67109, -172336, -131533, 248034, -189515, -152471, - 129923, -26307, -42413, -54224, 156229, 5369, 55298, 98247, 35970, -146566, - 4295, -71404, 99858, -12348, 27380, -38655, -87510, -537, 41339, -14496, - 13959, 28454, 3758, -22549, 27917, 25233, -59056, 51003, 31675, 1074, - 37581, -14496, -11811, -9127, -12885, 19864, -1611, 23085, -16643, -11811, - 35970, -4832, 4832, -3758, -3758, 2684, - }, - { - -1522029, 32075352, 3419868, -1165547, 234613, 142271, 137976, -31139, -373125, 95026, - 703838, -303869, 100932, -1085016, 903554, -48855, -55835, 162135, -248571, -237834, - -136365, 287763, -795643, 215285, 257161, -286689, 138513, 194884, 55298, -119722, - -117575, 9127, -151934, -179315, -252866, 17717, -111669, -86436, 141734, 336081, - -219043, 87510, 379568, -15569, -53150, -200253, 78383, 48318, -22549, 0, - -114890, 149787, -53150, 16643, 53687, 56371, -53150, -68719, 87510, -27380, - -18790, 46708, -33823, 47245, 63351, -165893, -24159, 66572, 13422, 23622, - 0, -6979, -39728, -4295, 24696, 49929, -74088, -16643, 12348, -12885, - -11811, 6979, -47245, 10737, -20401, -40802, -28991, 4832, 21475, 22012, - 15032, -18790, -3221, -24696, 17180, 8053, - }, - { - -54761, 2774549, -494458, 593779, -377957, -177167, 436476, 21475, -113280, 141197, - 178778, 268972, -387084, 91268, -996969, 626528, -114890, -512712, 137439, 858457, - 17180, -944356, -878858, 203474, 353798, 419833, -161061, -90194, -104153, 115427, - 148713, -117038, -110595, 166430, -2684, -63351, -171799, 108448, 229244, -70867, - -108985, -107374, 155693, 38655, -243739, 150861, -56371, 20938, -86973, -201327, - 217433, 166430, 88584, 161598, 85362, -106300, -72478, 3758, -15569, 64961, - 54761, 0, 38655, -13959, 12348, -69793, -63888, 12348, 44560, 73551, - -6442, -2147, -4832, -43487, 4295, 21475, -22549, -35970, -9664, -18254, - -27917, -36507, -13959, 13422, 17717, 29528, -1611, -26307, -16106, -18790, - 33823, -12885, 6442, -4832, 3758, 17717, - }, - { - -2270964, 9233106, 1473711, -871878, -233539, -117038, 1568200, 135291, -142808, -286152, - 57445, -234613, 86973, -62277, 429497, -535797, -242129, 45097, 161061, 294205, - 155693, -222801, 414464, -396748, 307090, 78383, -112206, 39728, -142808, -231928, - 472446, 212601, 34897, -348429, -30065, 153008, -406411, 102542, -144418, 68719, - 235686, 317828, -53150, -9127, -220117, -88584, -76236, -55298, 139050, -84289, - 30065, 8053, 63888, 154619, -77846, -77846, -111132, -120796, 108448, -1611, - 17717, 15569, 35970, -26307, -54761, 52613, -36507, -21475, -41339, 15569, - -12885, 5369, -25233, 24159, 71404, -20401, 67109, 30065, -55835, 9127, - -13422, 3758, 29528, -41876, 11274, -24696, 35433, -4832, 31139, -2684, - -20401, 12885, 6979, -15569, -15032, 26844, - }, - { - 177167, -1619740, -1167694, -245350, -198105, 242129, -142271, 86973, 8590, -64961, - -101469, 33823, -724776, 894427, 91268, -569083, 41876, -166967, 902480, -103079, - -731755, -375273, 390842, -232465, 656056, 455267, -627065, 224412, -57982, -191663, - 386010, 104690, 88047, -287763, 227096, -157840, 136365, -93416, 278099, 187368, - 141734, -2147, -185220, 177167, 100395, -111669, -24696, -171799, 21475, -31139, - 39192, 48855, -139050, 68183, 42413, 63888, -12348, -33823, -224949, -51003, - -120796, 4832, 18254, 8590, -96637, -51003, 93952, -44560, 15032, -17717, - -3758, 33823, -11811, 33286, 24159, 4295, 54224, 37044, -40265, 17180, - -33823, 25770, 33823, -28991, 1074, -9664, -7516, -26307, -13959, -4832, - -17717, 537, 23085, 20401, -24159, 8053, - }, - { - -90731, -3186866, -1968706, 1378685, -118112, 1751810, 1313186, -61203, 390842, -455803, - -23085, -16106, -18254, -435939, -265214, 423054, -834834, 63351, -85362, -194884, - 679142, 72478, 105764, -54761, -15569, 284542, -31139, -315143, 68719, 298500, - -119185, 242129, 111132, -54761, -352724, 38655, 211527, -179852, 12885, 251792, - 68183, -110059, -117038, 398895, -248571, -118648, 52076, 8053, -222801, -111132, - -19327, -44023, 89121, -2684, 179852, 89121, 142271, 100932, -42950, -124017, - 4832, -22012, -7516, -33286, 12348, 10201, 30065, -39728, -47245, 62277, - 23085, -27917, -23085, 82678, 0, -1611, -20938, -33823, 32749, 2684, - 74625, -45097, -23622, 2684, 23085, 73014, -5369, -50466, -1074, -4832, - -15032, -19864, -13422, 35970, -3758, 29528, - }, - { - -1611, 310848, -1740536, 254477, -24159, 8590, 105227, 101469, 369367, -211527, - -212601, 106300, -946503, 267899, 4092030, 822486, 978179, -207232, 92879, -111132, - -158377, 767725, -19327, 722628, 797790, 198642, 440234, 82678, -791885, 111132, - -576599, 99858, 421981, 54224, 18254, -13959, -14496, -51540, -50466, 168041, - -209380, 4832, 130460, -98784, -24159, 114890, -291521, 82141, 31675, 117038, - -132607, 164283, 199716, -23622, 4832, -1611, -40265, -19864, 27917, -53687, - -68719, 171262, -36507, -40265, 15032, 90194, -104690, -13959, 20938, 17717, - 41876, -32749, -10201, 24696, -19864, 34360, 67646, -68183, -17180, -49392, - -8053, 39192, -17717, -3221, 19327, -38118, -28454, -42950, 31139, -40802, - 1074, 37044, 24696, -29528, 10201, 31139, - }, - { - 874026, 844498, 547608, -261456, -598074, -314606, -643708, -174483, 118112, -340376, - 651224, 226023, -65498, -783832, -1691143, -367757, 653372, 33286, 71941, -156766, - 13959, -198105, -9127, 247497, 110595, -28454, -243739, -331786, 389768, -11811, - 90731, 10737, 241055, -26844, -82678, -318901, -202400, -136902, 215822, -224412, - 100932, 176631, 192200, 47245, -39192, 119722, -134755, -117575, -45634, 3221, - 68719, 10201, 123480, 121870, 28991, 13422, 59593, -63351, 90194, -38655, - 25233, 53150, -46708, -53687, 12348, -27917, -86973, -2147, 24159, 10201, - 35433, -56371, -79457, 22012, 66035, 25233, -14496, -32212, 18254, 1611, - -34897, -35433, 45097, -8053, -17180, 16643, 10201, -15569, 68183, -15569, - 1611, 20938, -27380, 3758, -13422, -1611, - }, - }, - { - { - 140660, -340913, -1697049, 556735, -389231, -70867, 73551, -258772, -14496, -34897, - 89121, -86436, 634045, 523986, 185220, -445066, -318901, -173409, 227096, -135828, - -639413, -601832, 316754, 68183, 316217, 106837, -545998, 231391, -238371, -644782, - -28454, -278636, -310311, 393526, -176094, -157303, 242129, 348429, -119722, -231928, - -11274, -50466, 143881, -128312, -76236, 84826, 54761, -56908, -118112, -200253, - -53150, 23622, -30065, -111669, -60666, 6979, -6442, 132607, 51540, -156229, - -52613, -124017, 8053, 49392, -1611, -55298, 20401, -42950, -119185, 34360, - 72478, 18790, 24159, -10737, 18790, -2147, 2684, -32212, -27380, 8590, - 12885, -29528, -31139, -10737, 52076, 33823, 1074, -35433, 9127, 36507, - -32212, 11274, 6979, 7516, 18790, -4832, - }, - { - 1910187, -17331804, -5388574, -727460, -154619, -418222, 223338, 237834, 56371, -346819, - -1611, -268972, 22012, -54224, -562104, 565862, 120796, 44560, 484794, -100932, - 132607, 473520, -385473, -19327, 218506, 270046, 2684, 458488, -68719, -27917, - -222265, -236760, 199716, 173946, -466541, -70867, 337692, 311385, 149250, -259846, - -111669, -253940, 146566, 197569, -180926, 198642, -103079, 223338, -86973, 95026, - -31675, -261456, 55298, 75162, -26844, 56908, -27917, 120796, 44023, 18790, - -68719, 131533, 26844, 12885, 51003, 3758, -73551, -60666, -69256, 87510, - 40265, 2684, -27380, -62814, 77846, -52613, 8590, 35433, -5906, -62814, - -18254, 19864, -10201, 1611, 11274, 83752, -61203, 17717, -537, 2147, - 5369, 537, -26844, 12348, -11811, 12348, - }, - { - 1473174, -2912525, 136365, -1125281, 991064, 317291, -293132, -25770, -25233, 628676, - 6979, 100395, 97711, 28454, -1363115, -477278, -302795, -235149, -170725, -365609, - 281320, -248571, -8590, -310311, -180926, 83752, 458488, 237834, -310848, -138513, - 393526, 176631, -161598, 371515, 46171, -257161, -135828, 95563, 321049, 97711, - -187368, 48855, 179315, -69256, 84826, 403190, 67646, 27917, -98247, 96100, - 97711, 87510, 99858, 13422, -2684, 4832, -134755, 98247, 30602, 16106, - -112743, -79457, 27917, -50466, -44560, -6442, 20401, -17717, -7516, -16106, - 5906, -3221, -4832, -45634, 20938, 8590, 19327, 4832, 45097, 0, - -22012, 3221, -44560, 22549, 27917, -13422, 31675, 2684, -30065, 20938, - -32212, 4295, -13422, 4295, -9127, -12885, - }, - { - -126702, 4080219, 561567, -398358, 116501, 57982, -220654, -157840, -86973, 29528, - 69256, 147640, -70330, -367757, 2437931, 122943, -2320893, 75162, -872952, 478889, - 646393, -695248, 154082, 485331, -538482, 327491, -612033, -168577, 513785, -404801, - 130460, 186294, -263067, -68719, -103079, -181462, 42413, 66035, -59056, -40265, - 80531, 126165, 184147, 79457, -4295, -117038, -28991, 25770, 45097, 96637, - 255014, -60130, -85899, 45097, 2147, 88047, 84826, -52076, 51540, 72478, - -28454, -40802, 87510, 9664, -23085, 32212, 3221, -38655, -21475, 92879, - 76236, -35433, -25770, 9127, 26307, 1611, -55298, -27917, 18254, 42950, - 26307, -36507, 6979, -7516, 17180, 25770, -46171, -22012, 5906, 12348, - -4295, -28454, -15032, 33286, -12348, -7516, - }, - { - 4078608, 2597918, -4075387, 641561, -151398, 120259, 187905, -28454, 24696, 292595, - -342524, 457414, -156766, -264677, 307090, -554588, 240518, -93952, -6979, 1074, - -90731, 173946, -244813, 345745, -318364, 135291, 100932, 1125281, 44023, 112206, - 0, -220117, -384936, 256624, 86973, 227096, 105227, 29528, -56371, 72478, - 212601, -122943, -83752, 9127, -179315, -58519, 86973, 97711, -19864, 17180, - -142271, -60130, 56371, 140123, 32212, -58519, 176094, 7516, -44023, -109522, - 27917, -5906, -61740, 32212, 31675, -75699, 55835, 48318, -46171, -18254, - -12348, 75699, 37044, -39728, -45097, 30602, -84826, 15569, -19327, -31139, - 1611, -5369, -27380, 37044, 17180, -32749, -3758, -9664, 12348, 5369, - 25233, -3758, -2684, 21475, -16643, -14496, - }, - { - -31675, -762894, 1381369, 360240, -24696, -2684, -122943, 55298, 9664, 135291, - 197032, 37581, 410706, 507880, -682900, 600222, 629213, 663036, -437550, 1158031, - 541166, -171262, -654446, 1007170, -806917, -527744, -512175, -133681, -259846, -1026497, - -215285, -149250, 59056, -210453, 329102, 156229, -199716, 229781, 141734, 67109, - -288300, 208306, 141734, -65498, 87510, 147640, -1074, -33286, -79457, -25233, - -44560, 125628, 89121, -11811, -126165, 15569, -40802, 69793, -6442, 11274, - 33823, -98784, -6979, 40265, -53687, -27917, 60130, 8053, 46171, -2147, - -64961, -4295, 16106, 28991, -40265, -49392, -49392, 35970, 26307, 42413, - -43487, 24696, 30602, 11811, -28991, -3758, 5369, -537, -9664, 22012, - 34360, -25770, -54761, 8053, 8590, 11811, - }, - { - 3897683, -12349105, 139586, -1430224, -140660, 45097, -44560, 450972, 106837, -154082, - -266825, 115964, -88047, 231928, 222265, -53687, 56371, -241055, 650688, 49929, - -228707, -248571, -132070, 147640, -184684, -103616, -112206, 112206, -273804, 60666, - -76773, -79457, 353261, 60130, -95563, 147640, -37044, -58519, -354335, 9127, - 17717, 260919, 244813, -82678, 9664, -92879, 37581, 44560, -47245, 165893, - -125091, 39728, -42413, -63351, -38655, -68719, -5369, 30602, -62277, 4832, - 33286, 25770, -10201, -5369, -52076, -102005, -59056, 79994, -23622, -41876, - 63888, 0, -136902, 6442, 16106, -17180, -23085, 15569, 4832, -32212, - 71404, -10737, -36507, 13959, 45634, -46171, -33823, 31139, 22549, 9127, - -40265, 26307, 15569, 8053, 5369, -12348, - }, - { - -35433, -1182190, 307090, 473520, 135828, 30065, -90731, 61203, -74088, 2684, - 265751, 125628, 88047, 717796, 1357747, 180389, 195421, 258772, -424665, 607738, - 1403917, 281320, -402653, 581968, -642098, -1142998, -185757, -67646, -120796, 45634, - 384400, -130460, -73014, -214748, 168041, -171262, -171799, -89657, 70867, 84289, - 106837, 79994, 18790, 114890, -77846, -161061, -189515, 271657, 32212, -185757, - 537, -8590, -114354, -56371, -14496, 24159, -32212, 85362, 96100, -95026, - -44560, -40802, 26844, 15032, 44023, -17717, -62277, -59056, 52076, 34360, - 23085, 29528, -10737, -3221, -4832, 12348, -20938, -24696, 25770, -20401, - 52076, 10737, 14496, -6442, -30065, 25770, -30065, -2684, 8053, -31139, - 22012, 1074, -21475, 9664, 1074, 4832, - }, - { - 5156645, 31678606, -1579474, -839129, -367757, 46708, -246424, 459562, -300111, -342524, - 539555, 188979, 331786, 265751, 321586, -703301, -431107, 181462, -191126, -117575, - -320512, 206158, -374736, -235686, 198105, -228707, 18790, -62814, -64961, 77846, - -14496, -134218, 47245, -382789, -209380, -192200, -39192, 476741, -624381, 480499, - -204011, 293668, 137439, 85899, -53150, -132607, -98784, 107374, 157840, -134218, - -142271, -42950, -40802, 73014, 161598, 27380, -33823, -60666, 79994, 38655, - 16106, 3758, -39728, 69793, 96100, -49929, -92879, 40265, -9664, -1611, - 8053, 41339, -50466, 40265, -19864, 55298, -48855, -13959, -14496, -13959, - -24159, 37581, -4832, 13422, 9664, -12348, -35970, -30065, 2684, 0, - 35970, -6442, 0, -38655, 16106, 8053, - }, - { - 110595, 2412161, -448287, 434865, 64425, -836445, 108448, 434329, 115964, 70330, - 178241, 709743, -246424, 96100, -1117228, 137976, 347355, -492311, -686658, 821949, - 71404, -658204, -472446, -53150, 202400, 177704, -156766, -54224, 190589, 154082, - 31675, -119722, -132607, 137976, -202937, -38118, -350040, -73551, 133681, -146029, - -96100, -186294, 53687, 225486, -263604, 67646, 32749, -41339, 3221, -137976, - -25233, 171262, 9127, 125091, 245350, -140660, -25770, -2147, -39728, 19864, - 74625, 46171, 81068, 9664, 24696, 9127, -77846, -49392, -66572, 68719, - 2684, 18790, 59056, -55298, 8053, 4295, 4295, -15032, 17180, 24696, - 9127, -26307, -18790, -15569, -21475, 10737, 26844, -18254, -6442, -26307, - 29528, -9664, -5369, -6442, -17717, 9664, - }, - { - 2563559, 4845797, -1815697, 664109, -146029, 83752, 849867, 632434, 229781, -353261, - 83752, -97174, -78920, -106837, -204548, 195421, -259309, -206695, 37044, 17180, - 181999, -227633, 198642, -78383, 164819, -35970, -218506, 219043, -82678, -248034, - 118648, -33823, 244276, -224412, -284542, 346819, -169114, -168041, 111132, 45634, - -537, 236760, 119185, 27380, -54761, -92879, -114890, -68183, 74088, 34897, - 34897, -42413, 41876, 134218, 59056, -26307, -76773, -171262, 66572, 54761, - 35970, -3221, 75162, 1611, -69256, 53150, -17180, -10737, -62277, 18254, - 13422, -12885, -45634, -33286, 9127, -25770, 32212, 54761, -28454, 10201, - -9664, -26844, 45634, -54761, 537, -53150, 15032, 0, 23085, 4832, - -22549, -4832, 24159, 5906, -34360, 8590, - }, - { - -55298, -2142652, -327491, -496069, -261456, 169651, 16106, -97174, 78920, -15569, - -111132, 87510, -177167, -435939, -110059, 12885, -181462, -24696, 64425, 63351, - 532039, -1666447, 213138, -806917, 627065, 747861, 88047, -392453, -4832, -31675, - 355945, 139586, 394600, -149787, -103079, 47245, 18254, -187905, 308701, 22012, - 37581, 102542, -77309, -16106, 9664, 10737, 3758, -183073, -42413, -186831, - -66572, 166967, -77309, 60130, -23085, 99321, 75699, 67646, -67109, -16643, - -63888, -38655, -9664, 56371, -25233, -67109, 132607, -35970, 34897, -28991, - -26307, 27917, -45634, -6442, -19864, -23085, 19327, 42413, -3758, 32749, - -27917, 23622, 42413, -537, 6442, 5906, 11811, -18790, -13422, -12348, - -20401, -4832, 8590, 13959, -10201, -12348, - }, - { - -401043, -2404645, -103616, 82141, -262530, -197032, 2128156, 98784, 520228, -355409, - -674310, -39728, -390842, 536871, -426276, 525597, -779000, -89121, 128312, -510027, - 431107, 100932, 197569, 70330, 67109, -211527, -187905, -266288, -280247, 236223, - 38118, 95563, -16643, -26844, -305480, -202400, 271120, 42950, -44560, 178778, - 17180, 25770, 151934, 250719, 130997, 197569, -99858, 106837, -128312, -197569, - 50466, -122943, 59593, -42950, 16106, 44560, 54761, 132070, 58519, -125091, - -39192, -12885, 537, -28991, 24159, 101469, -2147, 19864, -62277, -22549, - 83752, 0, -68719, -13422, 5906, -26307, 24159, -48318, -9127, -41339, - 74625, 15032, -17180, -36507, -20401, 69256, 45097, 8590, 24159, 2684, - -12885, -537, -51003, 1074, -12885, -9664, - }, - { - 169114, 610959, -803159, -413391, -15032, 12348, 4832, 156229, 78920, 94489, - -82141, 9664, -859530, 1971927, 1235877, 1592896, 10737, 403190, 117575, -505196, - -233002, 345745, 221728, 522375, 645319, 186831, 219043, -159451, -122943, 136365, - -515933, 230854, 237297, 163209, 252329, 47782, 215285, -58519, -161598, 292058, - -178778, -164283, 77846, -99858, -52613, 52076, -187368, -75699, 50466, 175557, - -130460, 47782, 160524, 124017, -21475, 9664, -22549, -47782, 85899, -40802, - -122943, 56908, -10737, -33286, -40802, 78383, -73551, -92879, 22012, 537, - 47782, 12885, -54761, 22549, 18254, -35433, 84289, -65498, -25770, -32749, - -42950, 33286, 32212, -11811, 53687, -9664, -13959, -49929, 30065, -8590, - -32212, -2147, 32212, -18254, -20401, 40265, - }, - { - 9127, 1800128, 1819456, -665720, -391916, -2288681, 57445, 29528, -30065, -126165, - -93952, -17180, 269509, -916439, -1727114, -428423, 579821, -772020, 304943, -70330, - -52613, 46708, -163746, -289373, 294742, 168577, -79994, 410706, -566399, 249108, - 195421, -98784, 137976, 321586, -64961, -31139, -329102, -101469, 93952, 54224, - -130997, 201863, 181462, 121333, -84826, 114354, 73014, -164283, -161061, 5906, - 38118, -88047, 11274, 97174, 54761, 60130, 109522, -32212, 65498, 12885, - -4832, 68719, 21475, -60130, -10201, 3758, -75162, 51540, 26307, -48855, - 64425, 5369, -100932, -76236, 16106, 44023, 30602, -16106, -23085, 37581, - -15569, -79994, 21475, 28454, -18790, -2147, -1611, -66035, 45097, 21475, - -1611, 20938, -5369, -18254, -27917, -2684, - }, - }, - { - { - 18254, 4119948, 767725, 789737, 186294, -187905, 102005, 103616, -78920, 219580, - -51003, 71404, 90194, -128849, 601295, -289910, 582505, -333934, -128312, -84826, - 355945, -61203, -154619, -403190, -391916, -317291, -449898, 15032, -183073, -97711, - 224949, 405338, -790274, 385473, 264141, 61740, 4295, 108985, 175020, 135828, - 128849, -229244, 25770, -43487, 186294, 8053, -170188, 59593, 20938, 103079, - 93952, -49392, -42950, 62814, -137439, -132070, 48855, -55298, 159988, 52613, - 80531, -32212, -101469, 41339, 78920, -20401, -63351, -7516, -15569, -73551, - -537, 46708, -48855, 44023, 11811, 537, -13959, 45097, -23085, -42413, - 16643, 30602, 12885, -23622, -42413, -24696, 31675, -6979, -10737, 5369, - 45097, -21475, 12348, -26844, -12885, 16643, - }, - { - -1646046, -11676405, 5760088, 1074279, 496069, 82678, -69256, 226560, 437550, -487479, - -152471, -11811, -367757, 452045, -751082, -313533, 573915, -243739, -547608, -52613, - -134218, 414464, 171799, 205622, -1074, -154082, -428960, 402116, -47245, -261456, - -284005, -306553, -199716, 102005, 23085, -236760, -142808, 54761, 179852, -30065, - 353798, -172336, -82678, 120259, -38655, -194347, 25770, -42413, 20938, 188979, - 124554, 15569, -122943, -52076, -111132, -119185, 47782, -10201, 69256, -6442, - -38118, 2684, -17717, -30602, -20938, 51540, 40265, 537, -71941, -55298, - 14496, -41876, 64961, -30065, -16643, 96100, -53150, -13422, 15569, 24696, - 17717, -39192, 32749, 13422, -31139, -26844, 76773, -35433, 17717, -17180, - -3758, 19864, 14496, -25233, 1611, -10201, - }, - { - -1452236, -6629819, 1967095, -878858, -1494112, -199179, -62277, -227633, -69793, 95563, - -138513, 100395, -8590, 596464, -934692, -477815, 172336, 408022, 352724, -51540, - -14496, 0, -56371, -83752, 343061, -191663, -228707, -388158, -274341, -2684, - 455803, 14496, -373662, -328028, -102542, -92342, -235686, -20938, -8053, -188979, - -57982, -225486, 130460, -76236, -132070, 18790, 142808, 137976, -38655, -298500, - -144955, 195421, 199716, -41339, -15569, 87510, -103079, -123480, -73014, 64961, - 53687, -23085, -74625, -90731, 63351, -17180, 12885, -69256, 62277, 31675, - -22012, -5906, -4832, -31675, -47245, 1074, 9127, 2684, 6442, 41876, - 16106, 10737, 9127, -47245, 8590, 19327, -12885, 19327, -1611, 12885, - 27917, -13422, 6979, -29528, -3221, 11811, - }, - { - 99858, 3340948, 607201, 215822, -157303, 56371, -18254, -17717, -146029, -100395, - -57445, 23622, 415538, -266825, 427349, 800475, 42413, 84289, -1316408, 716186, - 264677, -783832, -197569, -267899, -112743, 574452, 112206, -164283, 244276, -569620, - -282931, -246424, 18790, -62277, 86436, 350577, -561030, 86973, 184684, -419296, - 129386, 83215, -64425, -56908, -15032, 220117, -42950, -6979, 179315, -34897, - 9127, 91268, -89121, -5906, 52076, -80531, 17717, 132070, -61203, -33823, - 17717, 24696, -15569, 40802, -25233, -45097, 0, 6979, -31139, -39192, - -18790, 92879, 43487, 2147, -40265, 74088, -7516, -13959, -38655, -3758, - 9664, 26307, -38655, 6979, -22549, 10201, 25770, 13959, 3221, -24159, - 5906, 31139, -16106, -8590, 6442, -16643, - }, - { - -5797132, -7437810, 65498, 1298154, -132070, -238371, -192737, 202937, -118648, 287763, - 9664, -360777, 159988, 210453, 140123, 280784, -116501, -413391, 238371, 95026, - 277025, -223338, -344671, -9664, 259309, -148713, 194347, 639950, -269509, -282931, - 84289, -46708, 31139, 21475, -354335, 46171, -187905, 659814, 176631, -325344, - 360777, -11811, 10201, -127238, 28991, 152471, -201863, -24696, 75162, 0, - 37581, 118112, -238908, 35970, -22549, -28454, -44560, -27917, 104153, 135291, - 14496, -1611, -14496, -104153, -64425, -22549, -31139, 74088, 32749, -8053, - -63888, -18254, 23085, 93952, -11274, -4832, 6442, -59593, 31139, 16106, - 1611, -16643, 12885, -59593, 19864, 8053, 3221, -13959, -22012, 37581, - -2147, -6979, -7516, 6979, 25233, 8053, - }, - { - 251792, 241592, -682363, -116501, 25770, 89121, 74088, 537, -50466, -50466, - -198642, 1611, -47782, -199179, 552977, 1120987, -1491427, 424128, -259846, 493921, - -469762, 198642, 358093, 1083406, -105764, 702227, 41876, 4295, 654446, 75162, - 316754, -351650, 219043, -186294, 151934, 214212, -85899, -121870, -179315, 47782, - 175020, -132607, 91268, 40802, -69256, 14496, -219043, 46708, 6442, 119185, - 50466, 46171, -49929, 136902, 28454, -28991, -37581, 125628, -17180, -12885, - 72478, -10201, -11274, 62277, 37581, -73014, -12348, -24696, 35970, 39728, - 62814, -4295, -47245, 18254, 8053, -18790, -10201, -41876, -55298, -10201, - 28454, -25233, -10737, 7516, 37044, -15032, -11274, 12885, -3221, -19327, - -3758, 34360, 15569, -26844, -9127, -10201, - }, - { - -831613, -19117974, 518080, -1165010, 529892, -62814, 52076, -39728, -434865, 34897, - -21475, 48855, 215285, 287226, 425739, -203474, 368830, -344671, -319438, 310848, - 138513, 275415, -135291, -41339, -344671, -93416, 105764, -99321, -53150, 61740, - 163209, 73014, 99858, 145492, -188442, 117575, 52076, 134218, -183610, 45634, - -76236, -170725, -55835, 122943, 52076, -26307, -114354, 175557, 53150, -10201, - 81604, -52076, 91268, 29528, 75162, -25770, -13422, 126702, -4295, -22549, - -46171, -38118, -3758, 4295, 19327, 2147, -52613, -57445, 32749, 9664, - -59593, 84289, 41339, -58519, -52613, 15032, 34360, -38118, 23085, 17180, - -49392, 32212, 8590, -59593, -6979, 69256, -36507, -23085, -3221, 37044, - 3758, -29528, 11274, -17717, 14496, -10737, - }, - { - 328565, -466004, -1939715, 317828, -103079, 1074, 33823, -18254, 22012, -160524, - -44560, 88584, 435939, -714575, 198642, 1511292, 446140, 1034013, -133144, -679679, - 565862, 1011465, -799401, 517544, 154619, -217433, 308164, -427349, -539018, -40265, - 212601, -155693, 312996, -285615, 137439, 307090, -4295, -221728, 121333, -117575, - 58519, 179852, -141197, 39728, 118112, -18790, 68719, -133681, 166430, 230318, - 2684, 3221, -31139, 89657, -198642, -39192, -20401, -68183, 32749, 133144, - -2684, 82141, -74088, 10737, -9127, 38118, 132070, -26307, -49929, 2684, - -1074, -40802, -17717, 63888, -22012, -3221, 49929, -39728, -10737, 3221, - -47782, -537, 18790, 19327, 17180, -12348, 1611, -46708, 21475, 5369, - -36507, 17180, -13422, 5906, 9664, -2147, - }, - { - -8273718, 19838454, 4256313, -399969, 260382, 74625, -443455, 65498, 531502, -230318, - -764504, 106300, 36507, 729608, -364535, 301185, -268972, -40265, -150324, 103616, - -91805, -42413, -537, -362925, -272194, 75699, -260919, -379031, 33286, 100932, - 318901, -345745, 108448, -376347, -31675, -333934, -241055, 620623, -678068, -79994, - -85362, 315680, -79457, 188979, -53150, 149787, -56371, -208843, 123480, 2147, - -64961, -301185, -100395, 9127, -102542, -37044, 61203, -30065, -132070, 5906, - 51540, -70867, -28454, -33823, -73014, 143881, 62814, -53150, -5906, 23622, - -47245, 57445, 30065, 16643, -19864, -64961, 56908, -16106, 0, -29528, - 5906, 3758, 9127, 13422, -537, 30065, 35433, -13959, -5369, -32749, - -8053, 13959, 1611, 22012, -24696, 6442, - }, - { - -172872, 951335, 229244, 197032, 406948, 479426, -560493, 31139, 206158, 38655, - -274878, 118112, 377957, 749472, -559420, -442919, 386547, 696322, -187905, -670552, - -129386, 24696, 525060, 69256, -236223, -150861, 194884, -15032, -180926, 268435, - -555125, 219580, 41339, 38655, -183073, 249108, 17180, -180926, -206158, -220117, - -44023, -54761, -97174, 62814, 223338, -181462, 45634, -160524, 56371, 84289, - -149250, 27917, -64425, -137976, -48855, 104153, 53687, 12885, -13959, -26307, - 3758, 20401, -39192, 54761, -35970, 117575, 79994, -5369, -22549, -98784, - -9664, -19864, 18254, 51003, -13959, -45634, 16643, 9664, 2147, 11274, - 33286, 27917, 15032, -12885, -4295, -30602, -6979, 14496, -1611, 23085, - -24159, 4832, -12885, 8053, -1074, -23622, - }, - { - -2381559, 803159, -77846, 485331, -9664, 1078037, -1561758, -175557, 425202, -3758, - -40265, 24696, 32749, 125628, -798327, 308164, -71404, -175557, -151398, 55298, - -55835, 380641, -119185, 88047, -187368, -27917, -95563, 21475, 187368, -12885, - -224412, -561030, 279710, 81068, -278099, -242666, 264677, -194884, 89121, 335007, - -121333, -278099, 98247, -13959, 144955, 66572, -56908, -2684, -173946, 50466, - 2147, -9127, 28454, -138513, 83215, 7516, 74625, 51003, -107374, -3221, - 12885, -22012, 27917, 55298, 61203, -44560, 3758, -6442, 2147, -13959, - 25770, 9127, 31139, -3758, -64425, 9127, -47782, -28991, 24159, -32749, - 34897, -12885, -32749, 54761, -27917, 26307, -37044, 5906, -34360, 9127, - 16106, -22012, -15569, 15032, 24159, -18254, - }, - { - 18790, -2539936, 122407, -300648, 152471, -353798, 4832, 124017, 29528, -132070, - -193274, -171262, 561030, 592706, -1624571, -371515, 693100, 95563, -1005022, -326954, - 474057, 195958, 454730, -319975, -409633, -130460, 567473, -340376, -302795, 473520, - -475131, 521839, 119185, 90194, -185757, -5369, -110595, 120796, -254477, 1074, - -94489, 75699, 268972, -83215, -126165, 110595, 33286, 26844, -12885, -42413, - -84826, 71404, 105764, 20401, -97711, -31675, -4832, 103079, 161061, 19864, - 118648, -33823, -83752, -5906, 111132, 103616, -25770, 71941, 1074, 14496, - 8053, -12885, 1074, -4832, -25770, 11811, -49392, -40802, 10737, -5369, - 38655, -11274, -4832, 28454, 15032, -4832, 11811, 24159, 12348, 7516, - 11274, 11811, -26307, -20401, 32749, -5906, - }, - { - 1060320, -861678, 2876554, -440771, -76236, -1340567, -792958, -195421, 235686, 531502, - -315143, -424128, 397821, 1240709, -310848, 68719, 90731, 179315, -70330, 161061, - -523986, 137439, -28454, 28991, 537, -30065, -111132, 96100, -232465, -172336, - 48855, -191126, -176631, -47245, 210453, -63888, -161061, 97174, 265214, -264677, - -291521, -58519, 199716, -111669, 173409, 128849, 17717, -199179, 190052, 10737, - 226023, -18790, -84289, 2147, -107911, -84826, -64961, -33286, 8053, 109522, - -26307, 26307, 11274, 33823, -82141, 2147, -33286, 59593, 64425, -77309, - -55298, 64961, 30602, -40802, -8590, -20401, 11811, 57445, -33286, -9127, - -68183, 34897, 32212, 22012, -28454, -63888, 6979, 55835, 2147, 8053, - 13959, 12348, 3221, -33286, 12348, -22012, - }, - { - -309775, 947577, 1041530, -55835, 34897, -68719, -172872, 250182, -402653, -336618, - 185757, 24159, 377957, 1493575, -5352603, 714575, -1074, -150861, 260382, -451508, - -216359, -188442, 168041, 294742, -26307, 577673, -607201, 211527, 330712, 6442, - -56371, 381178, -5906, 226023, -61203, 157303, 254477, 6979, 43487, 33286, - 165893, -74625, -6979, 53687, -20938, -79457, 102542, -122943, 25770, -42413, - 118112, -108448, -142271, 2147, -3221, -44560, 8053, 20401, 43487, 14496, - 78920, -125091, -56371, 5906, -34897, -99321, 76236, 7516, -34897, -3758, - -42413, 1611, 36507, -25770, 21475, -30602, -43487, 60130, -10201, 48855, - 9664, -73014, 12885, -5906, -9127, 19864, 39728, 45634, -39728, 42950, - 13959, -34360, -22012, 23085, -4295, -26307, - }, - { - -456877, -266825, 2170032, 376883, 270046, -105227, 490163, 316217, -149250, -318901, - -42950, -907312, 113817, 1044751, 1734630, 38655, -92879, -304406, 321049, -357556, - 51003, 290447, 22012, -177704, -261456, -15032, 242666, 1321776, 44560, 15032, - 161061, 71404, -36507, 223875, -164283, 128849, -125628, 230318, -69793, 279173, - 6979, 66572, 39192, 5369, -8053, -196495, 173409, 130460, -112206, -105764, - 4295, -18790, -54761, -120259, 78383, -141734, -18254, 39192, -5906, 95026, - -39192, -31139, 61740, 22549, -1074, 22012, 5369, 62814, -33823, -43487, - -11811, -5369, 57982, 3221, -70330, -53687, 19327, 27917, -45634, 10737, - 42950, -1074, -27917, 20938, 9664, -1611, -16106, 8590, -71941, 17180, - -1611, -9664, 32749, 1611, 3758, -8590, - }, - }, - { - { - 122943, 7268159, -1272921, -172336, 267899, -55298, -55835, 240518, -3758, 220654, - 14496, 295816, -169651, 153008, -417686, -186294, 660888, 68183, 253940, -335007, - 544387, 77846, -255551, -281857, -703301, -520228, -187368, -81604, 79457, -2684, - 347355, 153545, -50466, -74625, 310311, 55298, -159988, 134218, -258235, 270046, - 54224, -47245, -93416, 1074, 170725, 10201, -231391, 26307, 18254, 158914, - 142271, 10201, -67109, 94489, -8590, -148176, 26307, -144418, 74625, 135291, - 28454, 108448, -34360, -33286, 52613, 51540, -35970, 0, 49392, -45634, - -51540, 16643, -31139, 51540, 24696, 0, -14496, 46708, 11274, -25770, - 1611, 52076, 44023, 8590, -36507, -20938, 9664, 2684, -9664, -31139, - 42950, -10737, -4832, -8590, -26307, 2684, - }, - { - 935766, -11209328, 3311957, -88047, -227096, 238908, -140123, -37581, -41876, 195421, - -302795, 1611, -230854, -280247, 112206, -484258, 91268, -191126, -565325, -318364, - 77309, 162672, 290984, 292595, -85362, -155693, -256087, 121870, -20938, -279173, - -40265, -339302, -155693, -52613, 74625, -47782, -227633, -113280, -18790, 106837, - 230318, 33823, -210453, 13959, 90194, -176631, -43487, -179852, -9664, 38118, - 172336, 148176, 19327, -52076, -74625, -154619, 34897, 20938, 76236, 20401, - 76236, -63888, 18790, 21475, -80531, 6979, 49392, 22012, 9664, -37044, - -13422, -44560, 39728, 25770, -73551, 60130, -26844, -28454, 9127, 37581, - 32749, -27917, 25233, 20938, 0, -73551, 53687, -9664, 9127, -4832, - 1611, 12348, 24159, -24696, -1074, -13422, - }, - { - 797253, -722091, -6373732, -1611, -719944, -274878, 182536, -280247, 59056, -338766, - -246424, 161598, -125091, 56908, -391379, -238908, 43487, 150861, 637803, 65498, - -156766, 34897, 23622, 33286, 236760, -176094, -143881, -307090, -181462, -122943, - 117038, -147640, -132070, -350040, -321049, -93952, 11811, -131533, -48318, -273804, - 45097, -23085, 37581, 68183, -64425, -174483, 144955, 72478, 128312, -153008, - -142808, 37044, 67109, 26307, 22012, 3758, 26844, -53150, -57445, 11811, - 41876, 31139, 7516, -53687, 65498, 12885, -9127, 8590, 32749, 59056, - -1074, 1074, 4832, -14496, -15569, -9127, -27380, 10737, -31675, 16106, - 13959, 12885, 40265, -29528, -34360, 14496, -19864, -4832, 18254, -9664, - 27380, -3221, 16106, -14496, -9127, 13422, - }, - { - -240518, 2138894, 1324997, 527744, -116501, -55835, 37044, 13422, -70330, -11811, - -119722, -284542, 214748, 182536, -1822677, 1080721, 1243930, 8053, -1646583, 472983, - -445066, -361851, 59056, -469225, 303869, -322123, 936303, 283468, -347355, -434865, - -165893, -334471, 23622, -147640, 224412, 229244, -377420, -3221, 214748, -287763, - 98247, 129923, -80531, 14496, -161598, 282931, 105227, -25233, 179315, 32212, - -106837, 45634, 38655, -57445, 82141, -57982, -43487, 161598, -46171, -110595, - -33286, 42413, -20938, 9127, -19327, -14496, -18790, 18254, 3221, -48855, - -47782, 37581, 30065, 5369, -25770, 20938, 37581, 17717, -27917, -17717, - -11274, 38118, -27380, 2684, -12348, -11274, 17180, 23622, 23622, -11274, - -6979, 29528, 16643, -13959, 9664, 9127, - }, - { - 4997732, -19530826, -2238752, 1378148, 199179, -70330, -420907, 176631, -150861, -115427, - 503048, -121333, 202400, 295816, 68183, 147103, -213675, -391379, 109522, 6442, - 187905, -148176, 8053, -347892, 98784, -155156, 165356, -464930, 807454, -456877, - 154082, -48318, 184147, -180389, -236760, -4832, -199716, 161061, 129923, -183073, - 176631, -124017, 59593, -89121, 46171, 168577, -127238, -32749, 115427, -23085, - 89657, 171799, -112743, -62814, -60130, 22549, -114890, -98784, 91805, 110059, - 65498, -18254, 45097, -99321, -91805, 11274, -48855, 34897, 47782, 6979, - -40802, -45634, -52076, 59593, 36507, -36507, 60130, -38118, 11274, 42413, - 23085, 4295, 16643, -59593, -25770, 22012, 1611, -1611, -29528, 4832, - -7516, -1611, -11811, -8590, 17717, 17717, - }, - { - 115964, 1169842, -572841, -424665, 21475, 19327, 98784, 54761, 39192, 20938, - -272194, -150324, -147103, -718333, 294205, 533650, -270583, -176094, 381178, 454730, - -1113470, 12885, 351114, 183073, 476741, 199179, 557809, -26844, 222801, 961536, - 164283, -190589, -73014, 78383, 23622, 206158, -11274, -108985, -94489, -173409, - 332323, -106300, 49929, 37044, -13422, 5369, -174483, -22549, 22549, 69793, - 161061, -2684, -23622, 27380, 93416, 36507, -32212, 90194, -10201, -44560, - 26307, 50466, 40265, 8053, 39192, -44023, -45097, -42950, -11811, -9127, - 56908, 33286, -46708, 2147, 24696, 26844, 35433, -24159, -40802, -35970, - 31675, -9664, -39728, -2684, 28991, -3221, -5906, 537, 7516, -11274, - -30602, 18254, 44023, -12348, -6442, -14496, - }, - { - -3606162, -17970680, 2282238, -380641, -414464, 19864, 308701, -276489, -332860, 167504, - 59593, -138513, 229781, 362925, 135828, 171799, 81068, 194884, -432718, -57445, - 139586, 142271, -219580, -78920, -130460, -118112, -22549, 37581, 67109, -100395, - 59593, 368830, 53150, -90731, 85899, -40265, 280247, 209380, -194347, -2147, - -16643, -207769, -171799, 192200, -82678, -42950, -127775, 39728, 191663, -146029, - 111132, -11274, 9127, 16643, 38118, 84289, -19864, 144955, 51003, -9664, - -5906, -29528, -11811, -16643, 34897, 62277, 26844, -60666, -10201, 13959, - -60666, 35433, 78920, -23085, -53150, 537, 37581, -9127, 6979, 27917, - -52076, 14496, 22012, -19327, -45097, 56371, 17180, -26844, -12885, 2684, - 25233, -33823, -19327, -13959, 0, 6442, - }, - { - 78920, 746787, -1308891, -74088, -152471, -49929, 17717, -2684, 96637, -125091, - -217970, -151398, 148713, -559420, 185220, 285078, 467615, 121870, 30065, -399969, - -32749, 2147, -452045, 291521, 82141, 454193, 50466, -99321, -648003, -250719, - 19327, -21475, 273267, -81604, -104690, 462246, 46171, -167504, 18254, 38118, - -133681, 121870, -112743, -82141, 96100, 60130, 170188, -125628, -10737, 226023, - 75162, 0, 65498, 46708, -67646, -21475, 37581, -77309, -49929, 132607, - 51003, 83215, -5369, -16106, 0, -24159, 101469, 20401, -23085, -54761, - -3221, -30602, -23085, 56371, 1611, 5906, 30602, 25770, -12885, 19327, - -52613, -32749, -15032, 20938, 31675, -10737, 20938, -23085, 1074, 24696, - -32749, 8053, 17717, -11274, 7516, -1611, - }, - { - 9233106, 2186138, -1223529, -431644, -2684, -12348, 57445, -407485, 350577, 234613, - -692564, -197569, -465467, 663572, -580357, 322123, 496069, -249645, -263067, 332323, - 128849, -61740, -318364, -156766, -299037, 213138, -126165, -269509, 44023, -18254, - 100395, -138513, 6442, -124554, -79457, -268435, -311385, 123480, 102005, -368293, - -135291, 111132, 144418, 20938, 71404, 124554, -56371, -171799, -1074, 7516, - 24159, -143881, -172336, -55835, -96100, -98247, 41339, -29528, -131533, 15032, - -8590, -29528, -30065, -60130, -143881, 95026, 107911, -54761, 20938, 28991, - -23085, -24159, 55298, -4295, -1074, -67646, 35433, 10201, -537, -8053, - 5906, -25770, 4832, -8590, -26844, 15569, 28454, 18790, 13422, -14496, - -22012, 7516, -7516, 31139, -16106, -4832, - }, - { - 133681, -1263257, 1962800, 118648, 115964, 718333, -55298, -337155, 64961, -62814, - -199179, -121870, 336081, 718333, -127238, -144418, -266288, 551903, 721018, -746251, - -386547, -128312, 237297, 496069, -12885, -255551, 359167, 2147, -295816, 127238, - -583579, 1611, 255014, 16106, 28991, 49392, 319438, -73551, -149250, -126165, - 11811, 18254, -41339, -89657, 291521, -165356, 16106, -89121, -86436, 77309, - 51003, -31139, 19327, -95563, -175557, 42950, 57982, -14496, 24696, 16106, - -18790, -22012, -70867, 537, -41876, 47782, 93416, 71941, 64425, -103616, - -14496, -20938, -35970, 35433, -13959, -17717, -13959, -6442, -9127, -35970, - 537, 25770, 23622, 5369, 22549, -5369, -28991, 10737, -9664, 26844, - -17180, 537, -3758, 9127, 18790, -14496, - }, - { - 1796370, -990527, -1916092, -998580, 352187, -84289, -359167, -517544, 126702, 272730, - -82678, -63351, 41339, 250719, -411780, 147103, -243203, 76236, -189515, 196495, - -181999, 402116, -19327, -9127, -99858, 117575, -28991, -73551, 46171, 167504, - -139586, -335007, -12885, 207232, -162135, -402653, 146029, -57982, 5369, 138513, - 180389, -187905, -59593, -54761, 66572, 33823, -47782, 16106, -72478, -1074, - -10737, -27917, 17180, -148176, 30602, -5906, 8590, 93952, -54224, -45634, - -29528, 4295, -18254, 28991, 85899, -36507, -12885, -30602, 23622, 16643, - -10201, 20938, 51540, 42950, -21475, 18254, -30065, -60130, 17180, -24696, - 22549, 14496, -48318, 59056, -16643, 45097, -9127, -537, -22549, -2147, - 18790, -9127, -29528, -1074, 39192, -4295, - }, - { - -55835, -2099702, 83215, -418759, 181999, -281857, -124554, 0, 178778, -225486, - -93952, -222265, -47782, 676994, -526134, -459025, -231391, 339839, -505732, 35970, - -340376, 1258962, 40265, 395674, -454193, -300111, 21475, 54761, -192737, 161598, - -128849, 216896, -189515, 210990, -191126, -81068, -83215, 250182, -195421, 112206, - -62814, -71941, 287226, -12885, -70867, 126165, -86973, 137439, -1611, 85899, - -8053, -63351, 87510, -39728, -4295, -67646, -47782, -10737, 88584, -15032, - 97174, 13959, -85899, -49392, 33823, 144418, -53687, 27917, 14496, 31139, - 15569, 2684, 26307, 23085, 9664, 15569, -13422, -47245, 4295, -22012, - 30602, -12885, -27380, 10201, 18254, -6979, -13959, 17717, 13422, 8590, - 22012, 9664, -15032, -10201, 22549, 5906, - }, - { - -1468342, 4641249, 88047, -82141, -121333, -246424, -1522029, 23085, 64425, 430570, - 187905, -130460, 177167, 902480, -104153, -274341, 317828, 191663, -52613, 431644, - -183073, -84289, -129386, -60666, -104153, 457951, -83752, 125091, 127238, -153545, - -141197, -122407, -148176, -42950, 293132, 103616, -226560, -37044, 241055, -144418, - -208843, -167504, -8590, -171799, -86973, -79457, -61203, -187368, 66035, 112743, - 183073, 81604, -88047, 122407, -55298, -32749, 4295, -83215, -62277, 128849, - 26307, -41339, 537, 60130, -80531, -68719, -35433, 8590, 70867, -5369, - -85362, 17180, 77846, 20938, -1611, 5369, -22549, 65498, 6442, 31139, - -62277, -11274, 20938, 50466, 10737, -66035, -35970, 6442, -20401, 537, - 10737, 2147, 30602, -2147, 17717, 8053, - }, - { - 203474, 313533, 563178, 64961, -63351, -67109, -127775, 266288, -411243, -312459, - 62277, 12348, 770947, -2107755, 1168231, -1856500, 478352, 339839, -9664, -408022, - 56908, -6442, 156766, 517007, -222801, 559956, -150861, 21475, 596464, -221728, - 89657, 18254, 30602, 129923, -230318, 139586, 61740, -67109, 160524, 4832, - 92879, 59593, 50466, 145492, 26307, -112743, 99321, -90731, 28991, -89657, - 133681, -44560, -126165, -122943, 6442, -33823, -30602, 39728, 8053, 8590, - 114890, -54224, -73551, 16106, 38118, -94489, 43487, 88047, -38655, -13422, - -33286, 0, 44560, -23622, -537, 29528, -73014, 47782, 16106, 30065, - 32212, -55298, -24159, -2684, -39728, 1611, 18790, 52613, -31675, 15569, - 37581, 1074, -32212, 18254, 17717, -39728, - }, - { - -46171, -1175747, 1066226, 469225, 757525, 1983738, -218506, 327491, -137976, -383863, - -346282, -265751, 10201, -53687, 3571802, 247497, -498216, 441845, 119185, -204011, - -112743, 313533, 101469, 153545, -249645, -258235, 11811, 1374926, 270046, 39728, - 39192, 76236, 15569, -11811, -59056, 20938, -33823, 49929, -52076, 224412, - 238908, 36507, -95026, -44023, 169114, -155156, -77846, 104690, 66572, -93416, - -21475, 31139, 39728, -68719, 5906, -136365, -134755, 15569, -4832, 84289, - -12885, -62814, 22012, 18254, 12348, -10737, 30065, 13422, -49392, 537, - -59593, -14496, 67109, 64425, -41339, -54761, -24159, 37044, -27380, -17180, - 23085, 46171, -6979, -10737, 19864, 2147, -10201, 42413, -48318, -13422, - 5906, -16643, 18254, 23085, 17180, -5906, - }, - }, - { - { - -132070, 6135898, -998580, -248034, -60666, 130460, -173946, -183073, 148713, 88047, - 134218, -197569, 34897, -62277, -1954210, -405338, -330176, 69256, 591632, -137976, - -32749, -157840, 149250, 135291, -383326, 170188, 287226, 271120, 322123, -107911, - 275952, -537408, 600222, -60130, -195958, -312996, -106837, 484258, -288837, 60666, - -128312, 108448, -16643, -129386, -25233, 190589, -16643, -22549, -46171, 22012, - 93952, 114890, 14496, -26844, 107911, 51003, -9664, -11811, -62277, -31139, - -72478, 59056, 98784, -10737, -16106, 46171, 61203, -13422, -28454, 59056, - 7516, -15569, 10201, -36507, 16643, 10737, 11811, -29528, 0, 17180, - -10737, -19864, -10201, 26307, 40265, 18790, -21475, -14496, 7516, -2147, - -34360, 22012, -14496, 20938, 4832, -15032, - }, - { - -52076, -14158360, 519691, 408022, -421981, -210453, 374199, -26844, -499827, 306553, - -117038, -118112, 230854, 47782, 1176821, 451508, -186831, 125091, 626528, -212601, - 10737, -196495, -239444, -73014, -200253, 97174, -114354, -122943, -119722, -135828, - 114890, -109522, 255014, 49929, -220654, 92879, -7516, 108448, 176631, -60666, - -287226, -42950, -22012, 78920, -40265, 148713, -241592, 59056, -153545, -118112, - 111132, -133681, 81068, 34897, 18790, 28454, -94489, 97174, 43487, 2684, - 31675, 18790, 36507, 97174, -2684, -37581, -42950, -5906, 20401, 89121, - 21475, -1074, -54224, 15032, 13959, -85362, 36507, 12885, -17180, -42413, - 10201, 26844, -26307, -6442, 34897, 42950, -83215, 39728, -10737, 17180, - 6979, -14496, -6442, 18254, -13422, 8053, - }, - { - -462783, 9902584, 741956, -423054, 1230508, 245350, 64425, -49392, 56908, -88584, - -385473, 71404, -47245, 151934, 24696, 39728, -33823, -302258, 651224, 288300, - 342524, 53687, 231928, -94489, -294205, -154082, 159988, 104690, 42950, -191126, - -132070, -168577, 12348, 257161, -45634, -50466, 185220, -169114, -3221, -59056, - -63351, 148176, -26307, 90194, 189515, 115427, -129923, -235149, -11274, 148176, - 95026, -95026, -107911, 43487, 28454, -105764, -25770, 109522, 15569, -14496, - -95563, -40802, 132070, 23622, -32212, 45634, -19864, 54224, -35433, 11274, - 49929, 8053, 5369, -4832, 40802, -20938, -11811, 5906, -5906, -20401, - -27917, -2147, 8053, 63888, -18790, -20938, 21475, -20401, -2147, 0, - -35970, 4832, -6979, 25770, -2147, -3221, - }, - { - 340913, 1137630, -778463, 22549, 148176, -48855, -66572, 73014, 84289, 53687, - -31675, -62814, 31675, -255551, -3388729, -1279900, -773094, -235686, -1247688, -288837, - 220117, 195421, 309775, 15032, 120259, -661425, -246961, 486942, 166967, -191663, - -149250, -198105, 243203, -63351, -31675, -388695, 170188, -5906, -25233, 85899, - 23622, 78383, 51540, 188979, -214748, -62814, 173946, -19864, -20938, 64961, - 73551, -128312, 32749, -42950, 9127, 105764, 16106, 9664, 107374, -2684, - -70330, -15569, 39192, -88047, -49392, 54761, 8590, -1074, -5369, 60130, - 44560, -71404, -44023, -9127, 45634, -56371, -12885, 19864, 47782, 12348, - -19327, -23622, 26307, -11274, 27380, 5906, -45097, -13422, 17180, 21475, - -22549, -28454, 13422, 19864, -6979, 11274, - }, - { - -2379412, -25528748, 446140, 894427, -185757, 42950, -189515, 250719, 99858, -265751, - -145492, 429497, -54761, -511101, -71404, -226560, 348429, -177704, -84289, 15032, - -109522, -10201, 190052, 41876, -525597, 149787, 134755, -1064615, 187368, -367757, - -33823, -92879, -27380, 52076, 91268, 200790, 412317, -339302, -217433, 145492, - 49929, -195958, -68183, 102542, -113817, -132607, 63888, -55835, -57445, 69256, - 537, -15032, 164283, -4295, -37044, -29528, 145492, -36507, -33286, -102542, - 96100, 4295, 34360, 35433, -5906, -20938, 27917, -9664, -22012, 18790, - 19864, 33286, -34360, -69256, 14496, 13422, -10737, 70330, -11274, 10201, - 22549, 17180, -10201, 41339, -36507, -17717, 13422, 24159, 13959, -34897, - 14496, 4832, -5369, -537, -32212, -1074, - }, - { - -270046, -126165, 1061931, -22549, 18790, -73551, -67646, 84289, -17717, 95563, - 24696, -70330, 362925, -93416, -417149, 117038, 1110786, -528281, -310848, 1278290, - -103616, -77846, -483184, 165356, 334471, -912144, 337692, 183073, -596464, 508954, - 207232, 108985, -124554, 15569, -22549, 35433, -147103, 171262, 209380, -111132, - -121870, 167504, 25770, -95026, 68183, 79457, 117575, 26307, -3221, -92342, - 13959, 14496, 86436, -65498, -6979, 106300, -27917, 7516, 46708, -1074, - 37581, 4295, 68183, 38118, -27380, 17717, 6442, -45634, -4832, -23085, - -98784, 15569, 40802, 3758, -24696, 8590, 2147, 29528, 29528, 16643, - -42413, 48318, -6979, -5369, -37044, -2147, 10201, -3221, -6442, 18254, - 9127, -32749, -12885, 23085, 10737, 9664, - }, - { - 7254200, -7747584, -2158758, 450972, -89657, 188979, 222265, 143881, 197032, 98247, - -63888, 49929, 32749, 164283, -301185, 631897, -71941, 196495, 448287, -251256, - -85899, -235149, -243739, -45097, 122407, 56371, -155693, 555125, 228707, -145492, - -198642, 180389, 51003, -284005, 183073, -25233, 193810, 286152, -17717, 20401, - -19864, 6442, -18790, 53150, 20938, -49392, 105227, -107911, 30602, -44023, - -67646, 79457, -147640, 6979, -96637, -41876, -59593, 28991, -5906, 29528, - 53687, 0, -5369, -15032, -19864, -20401, 28454, 75699, -53150, -9664, - 78383, -46171, -79457, 64961, 30602, -14496, -24696, 28991, -9127, -24696, - 53150, -18254, -24159, 43487, 2147, -64961, 11274, 18790, 18790, -26307, - -15032, 31675, -11274, 10737, -12348, 537, - }, - { - -308701, 1611, 967441, 64425, 151398, -12348, -4832, 59056, -127775, 37044, - 72478, -121333, -350577, -364535, 776852, -1276142, -333397, -685584, -171799, 12348, - -266825, -961536, 181462, 255551, -255551, 885300, 69256, 156766, -151934, -86436, - 98247, -180389, -93416, 110595, -163746, 97174, 66572, 42950, -3221, 84826, - -134755, -30602, 45097, 93416, -108985, -58519, -26307, 242666, -194347, -174483, - 87510, 537, 66035, -68183, 57982, 5369, -23622, 88584, 96637, -71941, - 17717, -25770, 97174, -28991, 50466, -44023, -67109, 2147, 60666, -48318, - 10201, 22549, -13422, -13959, 3221, 28454, -39728, 26844, 36507, 1074, - 44560, -16643, -26307, -13422, -30065, 14496, -5369, 31675, -10737, -8590, - 27380, -13422, 11811, -3221, -537, 4295, - }, - { - -8083129, -17379048, -166967, -586263, 536334, 35433, 491237, 185220, -493384, 103079, - 614717, -49929, -386010, -428960, -39192, -47245, 707596, -24696, -278099, 340913, - 71941, 208843, -577673, 71941, 133144, 61203, 132070, 246961, 71941, -99858, - -264141, 158914, 126702, 150861, -99321, -43487, -116501, -291521, 17717, -41339, - -180926, 116501, 264677, -185757, -4832, -184147, -101469, 131533, -25770, -60130, - 16106, 181999, -61740, -75162, 106300, 537, -17180, -41876, 82141, 27380, - -70330, 73014, -10737, 37581, 16106, -99858, -50466, 21475, -6979, -537, - 35970, -61203, -26307, 4832, -9127, 58519, -80531, 8590, 1611, 26844, - -27917, 12885, -6979, -3221, -4295, -30602, -34360, 6442, 23622, 23085, - 11811, -12885, 0, -24696, 25233, -2684, - }, - { - -155156, -2636036, 58519, 348966, -329639, -396211, 868120, -100932, -420370, -380641, - 22549, 346282, -432181, -311922, -386010, 330176, -623844, -362925, 415001, 834297, - -51540, -230318, -412317, -149250, 132070, 65498, -35433, -144955, 37044, 210453, - 190052, -320512, -105764, 70867, 103616, -268435, 32212, 60130, 169114, -17717, - 31675, -19864, 111669, -41876, -151934, 125091, 36507, 113817, -139586, -193274, - 153008, 83215, 21475, 95026, 84289, -206158, -30065, -61740, -32212, 55835, - 51540, -3221, 33823, -67646, -537, -76236, -58519, 36507, 28454, 74088, - -11274, 12885, 19864, -55298, 12885, 42413, -9127, -18254, 4832, -22549, - -34360, -39728, -6442, 4295, -537, 32749, 6442, -15569, -2684, -14496, - 27380, -18790, 11274, -2684, -1074, 20401, - }, - { - -1202591, -1673964, 1731946, -382789, -136902, -1188632, 1910724, -166430, -562641, -300111, - 22012, -182536, -38655, -15569, 52076, 260382, -300111, 110595, 62277, 50466, - 125091, -254477, 135291, -120796, 117038, 143345, 28991, -1074, -273804, 102542, - 153008, 223338, -51540, -18790, -56371, 119185, -306553, 20401, -7516, -310848, - 185757, 268435, -74088, 63351, -14496, -128849, -36507, -1074, 147103, -54761, - -31675, -71404, 22549, 69793, 34360, 11811, -107374, -119185, 121333, 1074, - -52076, 23085, 13959, -32212, -32749, 52613, -30065, -9127, -23622, 47245, - -22012, 3758, -30602, 4832, 44560, -12885, 46171, 11811, -35433, 15569, - -26307, -537, 29528, -48855, 20401, -30065, 42413, -15569, 27380, -2684, - -17717, 18254, 13959, -15032, -23085, 19864, - }, - { - 23622, -1246077, 35433, -189515, 52613, 309238, -87510, -311385, 26844, -263604, - 67109, 119185, -1001801, -635655, 995359, 324270, -526670, -26307, -76773, 415538, - -9127, 467615, 127238, -53687, 363462, 205085, -549756, -136365, -10201, -399969, - 812286, -291521, -30602, 68183, -46171, 30065, -16106, -199716, 120259, 9664, - -2684, -75699, -88047, 4295, -1611, -31139, -60666, -49392, 22549, 71404, - 34897, 35433, -135828, -85362, 70330, 37581, 21475, -26307, -103079, -32212, - -86436, 47782, 16106, 13422, -126165, -62277, 93952, -56371, 46708, -14496, - -29528, 40802, -18790, 20938, 13422, -30602, 39192, 29528, 0, 17180, - -27917, 16643, 15032, -25233, -1074, 11274, -9127, -23622, -9127, -1074, - -537, -9127, 13422, 18254, -23622, -537, - }, - { - 459562, 8623221, -2290828, 864362, -255551, 435939, 867047, 435402, 159451, -390305, - 170188, 536871, -430034, 596464, -107911, 39192, -260919, 35970, 227633, -274341, - 694711, -54761, 151398, -160524, -219580, 373662, 235149, 76236, 81068, 79457, - -300648, 69793, 76236, 83752, -57982, -12885, 23085, -132607, -179852, 234076, - 209917, 46708, -96100, 99321, -206695, -51540, -177167, 64425, -188442, 43487, - 24159, 13959, -12885, -31675, 37044, 83215, 67646, 46171, -26844, -125091, - 44023, -26307, -3758, -13422, -3221, -13422, -30602, -57445, -64961, 51540, - 48855, -58519, -31675, 43487, 42413, 26307, -5369, -25233, 35970, -3758, - 77309, -32212, -37581, -9664, 18790, 62277, -537, -49929, -9664, -10201, - -21475, -16643, -25233, 33286, -4832, 18790, - }, - { - -133144, -199716, -608275, -236760, 12885, -7516, 96100, 75699, -95026, 97711, - -191663, 22549, -616865, -2208150, 8509404, -315680, 660351, 530428, -375810, -103079, - 537408, 482110, -471373, -88584, 12348, 106837, 740345, -299037, 409096, -22549, - -107374, -110059, -98247, -264141, 149250, 25770, -48318, -77846, -124554, 107911, - -231928, 30065, 63888, 56908, 83215, 39728, -148713, -15032, 17180, 15032, - -91268, 112206, 68719, -50466, -21475, -4295, -59593, -20938, 1074, -48855, - -52076, 147103, 4832, 8590, 30065, 91805, -77846, 16643, 49392, -6442, - 45097, 18254, -39192, 19327, -2684, 31139, 47782, -81604, 23622, -40265, - -16643, 64425, -9127, -10737, 15569, -27380, -32749, -35433, 42950, -38655, - -10737, 40265, 26307, -24159, 1074, 26844, - }, - { - 827318, -35433, -404264, -705985, -279710, 738734, -30065, 92342, 220117, 205622, - -663036, 380641, 322659, -1033477, 1823751, 14496, -229244, -175020, -68183, 353261, - -49929, -12885, -91805, 82141, 158914, -115427, -367220, 435402, -197032, 209917, - -135828, 35970, 241592, -142808, -52613, 59593, 107911, -215822, 49929, 12885, - 81604, 173946, 57982, 16106, 57445, 99321, -210453, -201327, 38655, 29528, - -16643, -30602, 81068, 68719, -76236, -13422, -77309, -47782, 48318, 5369, - -1611, 34897, -13959, -76236, 17180, -11274, -18254, 1074, -11274, 13422, - 23085, 15032, -81068, -6442, 61740, 42950, -18790, -11274, 1074, 23085, - -13422, -12885, 23622, -24159, -10201, 8053, 6979, -18790, 73014, -26844, - -6442, 4295, -23622, 7516, -6979, 5906, - }, - }, - { - { - -74088, 2136209, 1916092, 9127, 82678, 65498, -106837, -179315, -3221, 128312, - -72478, -366683, 18790, 419833, -2298344, -125091, -734439, 94489, 151934, 329639, - 98247, -556198, -37581, 508417, -386547, 523986, 332323, 160524, 240518, -353261, - 68183, -237834, 354335, 74625, -547608, -144418, 121870, 389231, -43487, 13422, - -104690, 34897, 44023, -54761, -86436, 55298, 144418, 10201, -68719, -30602, - 71941, 99321, 15032, -28991, 12885, 89121, -5906, 77846, -32212, -90731, - -34897, -49929, 74088, 35433, -20938, -4832, 29528, -5906, -63351, 42413, - 46171, 0, -537, -41876, -17717, 31675, 10201, -39192, -24159, 10737, - -10201, -35433, -42950, 5369, 32212, 19864, -12348, -6979, -1611, 23085, - -32212, 18254, -3221, 7516, 18790, -2684, - }, - { - -246424, -17016660, 3439195, 1143535, -430034, -217433, 494458, 30602, -19864, 56371, - -150861, -214212, 267899, 303332, 992137, 798864, -77309, 74088, 741419, -83752, - 95026, -297963, -125091, -375810, 56908, -45097, -39192, -47245, -135828, -235686, - -92879, 157303, 133681, 158914, -285615, 135291, 169114, 124017, 157840, -64425, - -229781, -186294, 77846, 103616, -84289, 140660, -142808, 61203, 11274, -60130, - -10737, -151398, -63351, 11274, -30602, 119185, -102005, 40265, 31139, 7516, - -38655, 43487, 36507, 46708, 8590, -8590, -32212, -11811, -39192, 67646, - 20938, 33823, -61203, -24696, 71404, -77846, 19327, 35970, -11274, -45634, - -13422, 24696, -19327, -15569, 8053, 79994, -63888, 23085, -5906, 5369, - 1611, -5369, -21475, 19864, -10737, 11274, - }, - { - 745177, 16878684, -3117073, -1489817, 281857, 406411, -201863, 76236, -32212, 169114, - -219580, 2684, 330712, -246961, 193810, 162135, 59593, 67646, 219043, 68719, - 531502, -66035, 111669, -12348, -565325, -64425, 64961, 227633, 134755, -36507, - -189515, -69793, 73014, 153008, 71941, -48318, 134755, 20938, -125091, 537, - -30065, -63351, 55298, -8590, 82141, 185757, -117575, -154619, -137439, 63888, - 147640, 8053, -83215, 18790, 20938, -88584, -84826, 34360, 18254, -1611, - -81068, -74625, 56908, 34897, -78383, 19864, -10201, 17717, -8053, -17717, - 17717, -1611, 10737, 1611, 18254, -16643, 16106, -537, 18254, -5369, - -13959, -10201, -19327, 47782, 24159, -26307, 31139, 8053, -24159, 9664, - -33286, -3758, -14496, 18254, 0, -5369, - }, - { - -252329, 734439, 250182, -270583, 145492, 80531, -100932, -29528, 111132, 28991, - -5906, 61203, 35970, -599685, -4115653, 278636, -791348, -1423245, -490700, 166430, - 148713, 191126, 441845, -163746, 129386, 93416, -1095217, 498216, 81068, -311922, - 154082, -117038, 91268, -13422, -108985, -407485, 194884, 39728, -216896, 140660, - -51540, 19864, 170725, 63888, 37581, -208843, 3758, 38118, -86436, 54224, - 119722, -86436, -32749, 6442, -77309, 95563, 85362, -32749, 82141, 79994, - -1074, -37044, 46708, -71404, -68719, 48318, 16106, -14496, -31675, 71941, - 74088, -31139, -46171, -3221, 45634, -26307, -37044, -8053, 31675, 24696, - 0, -41876, 24696, -6442, 15569, 26307, -37044, -15032, -12348, 13422, - -2684, -38655, -10737, 17180, -8590, -7516, - }, - { - -853625, -26357678, -569083, 530965, 375273, -85362, 152471, 74625, 157840, -1611, - -386010, 157840, 135828, -931471, 153545, -265751, 455267, -272730, 127238, -21475, - -11274, -48855, -2684, 205622, -365609, 96637, 151398, -814970, -291521, -104153, - -279710, -115427, -75162, 141197, 69256, 302795, 500901, -136902, -324270, 256624, - 67109, -68183, -150861, 126165, -31675, -297963, 46171, 59593, -107911, -29528, - -10201, -106837, 130997, 71404, -41339, -46708, 193274, 40265, -49392, -79994, - 56908, 11274, 19864, 10737, 42950, -43487, 33286, -6979, -4295, -5906, - 33823, 47245, 36507, -56371, -16106, 39728, -44023, 51540, -1611, -11811, - 6979, 4832, -12885, 38118, -4295, -24696, 11274, 18790, 26844, -12885, - 16106, 5369, -537, 10201, -23622, -9127, - }, - { - -127238, -405874, 455267, 252329, -10201, -5906, -96637, 13422, -34360, -17717, - 152471, 85899, 338766, -15569, 672699, -128312, 462783, 47782, -293668, 1718524, - -602906, 57445, -1181116, 1313186, 69793, -687195, -95026, 357556, -111132, -462246, - 56371, 369904, 17180, -72478, -29528, -22549, -116501, 112743, 258235, 138513, - -372588, 148176, 46708, -100932, 49392, 33823, 141197, 81604, 8053, -97174, - -97174, 83215, 41339, -6442, -10201, 26844, 22549, -19864, 67646, 2147, - 52076, -3221, 40802, 43487, -13959, 11274, 17717, -16106, 30065, 7516, - -71941, -42950, 40802, 24159, -30602, -35433, -33286, 5906, 31139, 28454, - -41339, 27380, 18254, 9664, -33286, -6979, 10737, -537, -8590, 3758, - 30065, -17717, -37581, 18790, 7516, 11811, - }, - { - -8321499, 8681203, 1933809, 813896, -307090, 113280, -23085, 456340, -76773, 10201, - -47245, 279710, -40265, 158914, -317828, 413391, 23622, 62814, 466541, 31675, - -35433, -234613, -111132, -84289, 157840, -17180, -92342, 479963, 246961, -31139, - -16643, -70867, -135291, -112743, -62277, 89121, 198642, 161061, -1074, -30065, - -13959, -37581, 249645, -106837, 151398, -48855, 113280, 13959, -17180, 10737, - -86436, 39192, -92879, -26307, -47245, -89657, -91268, -42413, -31675, 2684, - 37581, 1074, 1074, -3221, -30065, -53150, -48318, 57982, 1611, -10201, - 89121, -21475, -97174, 24696, 51003, -1074, -45097, 18790, -6442, -22012, - 51540, -5906, -39728, 15569, 31139, -62814, -22549, 20938, 31675, -5906, - -26844, 32749, 11274, 15569, -7516, -10201, - }, - { - -127238, -655519, 649614, 134755, 92879, 60130, -47245, 51003, -134755, -4295, - 217433, 128312, -128312, -1050120, 646929, -774168, 146566, 194347, -104153, 406948, - -388695, -280784, 782758, -352187, -119185, 446677, 140660, -298500, 241055, 77846, - 186294, -118648, -176631, 0, 48318, -227633, 89657, 30065, 47782, -7516, - -36507, 16643, 56908, 67109, -32749, -71404, -71404, 194884, -52076, -194347, - 4832, -13959, -10737, -45097, -51003, 41339, -98247, 95026, 140123, -91805, - 3758, -38655, 52613, -26844, 51003, 41339, -78920, -10737, 32212, 14496, - -4295, 11274, 12885, -22012, -13959, 17717, -34360, -12885, 27380, -32212, - 53150, 24696, 3758, -18790, -38118, 12885, -19864, 17180, 2684, -27380, - 25770, -8053, -9127, 7516, -2684, 6979, - }, - { - 5267241, -33881924, -748398, -77846, -207232, -26844, 239444, 411780, -403727, -206695, - 630286, 187905, 155693, -171262, 156766, -386010, -38655, 360777, 22549, 67109, - -204548, 246961, -521839, 76236, 123480, 78383, 55298, 335007, -118112, 31139, - -245887, 215822, 112743, 91805, -12885, -77846, -33823, -221728, -85899, 206158, - -85362, -16643, 152471, -100932, -57982, -194884, -180926, 169651, 537, 41876, - -91805, 50466, 56371, -27917, 63351, 94489, -42413, -14496, 83215, 60130, - 8053, 18790, 23085, 39728, 90731, -62814, -114890, 4295, -11811, -21475, - 33286, -4832, -41876, 2147, -16106, 55298, -67109, -6442, 3221, 9664, - -13959, 23085, 7516, 2684, 20401, -10737, -37581, -8053, -1611, 8590, - 30602, -13422, 8590, -31675, 16106, 6442, - }, - { - 293132, -2193655, -1124208, 244276, -132070, -670015, 425739, 282931, -419833, -296353, - -42413, 452045, -253940, -201863, -663036, 52076, -30602, -548682, -631897, 1037772, - 150324, 2147, -196495, -346282, 61740, -18254, -335544, -62277, 192200, 202400, - 542240, -203474, -244813, -49929, -31139, -206695, -157303, -28454, 97711, -18254, - -68719, -75699, 105764, 82141, -229244, 130997, 22549, 124554, -61203, -151398, - 23622, 52076, -42950, 112206, 164819, -146566, -73551, -26844, -49392, 20938, - 62814, 22012, 69256, -34360, -1611, -19864, -54761, -28454, -62814, 74625, - 18790, 6442, 59056, -43487, 13959, 30065, 4832, 537, 13422, 18254, - -9127, -32212, -17180, -16643, -20401, 16106, 23085, -13422, 3758, -18254, - 23622, -12885, 2684, -4832, -13959, 10201, - }, - { - 675921, -2767570, 814433, 470836, -387084, -503048, 619549, 541703, -655519, -209917, - 161598, -107374, -50466, -244813, 114354, 324270, -416075, 37044, 112206, -16106, - -62277, -242666, 70330, -64961, 25233, 50466, 39192, 23622, -165356, -66035, - 137976, 189515, 97174, -133681, -122943, 265751, -234613, -57445, 13422, -229781, - -52613, 209917, 59056, 125628, 17717, -102005, -5906, -17180, 123480, -74625, - 1074, -53687, -26844, 113817, 54224, 32212, -40265, -130997, 58519, 42413, - -3221, -17717, 26844, 9127, -58519, 25770, -1611, 5906, -31675, 31139, - 2147, -6442, -44023, -38118, 10737, -22012, 27380, 34897, -28454, 18790, - -23622, -20938, 52076, -61740, 11274, -39728, 7516, 0, 16106, 8053, - -24696, 11274, 23085, 537, -32749, 5369, - }, - { - 80531, -516470, -619549, -88047, -109522, 270583, 4832, -191126, -141734, -172872, - -51003, 311385, -787053, -272194, 1025960, -192737, -207232, -290984, -99321, 65498, - 442382, 537, -118648, -396748, 140123, 759672, -300111, -598611, 257161, -428423, - 579821, -65498, 149787, 149250, -46708, 77846, -166967, -277562, 119185, -63351, - -52076, 37044, -144418, -101469, 23622, -112743, -1074, -52613, -6442, -25233, - -35970, 105227, -131533, -69793, 43487, 46171, 44023, 56908, -22012, 2684, - -86973, 24696, 39192, 29528, -55835, -109522, 102005, -19864, 32212, 0, - -45097, 23085, -32212, -15569, -19327, -33286, 3221, 49392, 11811, 18254, - -16106, 14496, 20938, -537, -6979, 20938, 6979, -16643, -10201, -6442, - -8053, -10201, 6979, 13959, -19327, -10737, - }, - { - 1793686, 8327405, -2165737, -136902, -87510, -60666, 964757, 360240, 459025, -501974, - -63888, 405338, 338229, 46171, -266825, 190052, -215285, -25233, 205085, -488553, - 504659, -8590, 102005, -29528, 64961, -172872, 36507, 139050, -206695, 166967, - -115964, 23622, -8590, 155693, -121333, -68183, 83215, -82141, -252329, 111132, - 247497, 207232, -40265, 233002, -49929, 118648, -101469, 135291, -122407, -13959, - -26844, -39728, 44023, -100395, -26307, 39728, -6442, 88584, 33286, -118112, - -3221, -537, 10201, -59056, 10201, 49392, 5369, -49392, -71941, -9664, - 68719, -22549, -66035, -3758, 25770, 26844, 28454, -48855, 2684, -27917, - 70330, 2147, -27380, -38655, -9664, 56371, 41339, -16643, 15569, -1074, - -23622, -8590, -45097, 6442, -12885, -3221, - }, - { - 268435, -22549, -1039382, 0, -104690, 34897, 121870, -90731, -28991, 134218, - -33286, -54224, -358630, 924492, 2599529, 1705639, -286689, 56371, -150861, 46171, - 352724, 263067, -387084, -421981, -92342, 173409, 606664, -418222, 15569, 384936, - -78383, -28454, -231391, -114354, 362388, -134218, 52613, 14496, -178778, 136365, - -184684, -26844, -537, -16106, -5369, 105764, -121333, -34897, -8053, 88047, - -158377, 68183, 102005, 15569, -23622, -21475, -32749, -16106, 0, -15032, - -103079, 62814, 28454, 15032, -18254, 99321, -43487, -41339, 37581, -6979, - 43487, 26307, -47782, 32749, 5369, -9127, 57982, -64425, -1611, -20938, - -46171, 62814, 19327, -12885, 36507, -6442, -12885, -48855, 41339, -16643, - -35970, 11811, 29528, -17180, -19864, 37581, - }, - { - -1192390, 2229625, 495532, -932545, -347355, -919660, 458488, 32749, 189515, 324270, - -207769, -191126, 110059, 914291, -540092, -204011, -125091, -469762, -323196, 345745, - 54761, -108985, -65498, -105764, 169651, 126702, -328565, 45634, -83752, 70867, - 93952, -135828, 180389, 33286, 56908, 27380, -5369, -91268, 93416, -97711, - 9127, 186294, 136902, 43487, -89121, 216896, -51003, -192200, -93952, -54761, - 5369, 0, 25770, 48855, -63351, 14496, 2147, -57445, 41339, -16643, - 14496, 77846, -11811, -68719, -33286, 42950, -9664, 11274, 17717, 1074, - 34360, 38655, -84289, -74088, 39192, 52076, 16643, -14496, 2147, 20401, - 10201, -39728, 10737, -6979, -16643, -2684, -1611, -39728, 50466, 2684, - -19327, 11274, -13959, -15032, -12348, 7516, - }, - }, - { - { - 200790, -871878, -1019518, -160524, 103079, -74625, -61740, 77309, -241055, 192200, - -248034, 45097, -229244, -638876, -1821603, 739808, 756988, 565862, -832687, -551366, - 1154273, 262530, -48318, 300648, -412854, 395674, 21475, -319438, 103079, 25233, - -143881, 141734, -341987, -48318, -409096, 28454, 79994, 121333, 110059, 152471, - 35970, -146029, -15032, 96637, 98784, -124017, -48855, 12885, -1611, 35970, - 17717, -86436, -90194, 73551, -106837, -73551, 27380, -31675, 70867, 9127, - 45634, -2684, -47245, 28991, 34897, -8590, -56371, 21475, 36507, -49929, - -11811, 46171, -14496, 30602, -26844, 29528, 537, 42950, -9127, -42413, - -8590, 28991, 1611, -10201, -47782, -27380, 27380, 22012, -19327, -1074, - 43487, -18254, 11274, -17717, -9127, 16106, - }, - { - 291521, -20451560, 1325534, 860067, 114890, 163746, -162135, -159988, 514859, 27380, - -190589, 89657, -117038, 92342, 293668, 215822, 323733, -362388, -285078, 48855, - 154082, -236760, 161061, -20401, 249108, -160524, -249645, -38655, 83752, -167504, - -114890, 106837, -391379, -64425, 171262, 195958, 35970, -70867, -4832, 46708, - 145492, -112743, -37581, 35433, 31675, -148713, 81604, -153545, 250719, 163209, - -19327, 85899, -153545, -81604, -48318, 69256, 38118, -92342, 57982, 20938, - 25233, -36507, 8053, -49392, -69256, 22549, 31675, 42950, -28991, -56908, - -3221, -24159, 10201, -17180, -25770, 67646, -34897, -7516, 13959, 40265, - 5906, -34897, 29528, 7516, -35970, -33823, 73014, -27917, 9664, -20401, - -6442, 18254, 2147, -20938, 13422, -7516, - }, - { - -733366, 16394427, 1217623, 652835, -891743, -41876, -121333, -183073, -15032, -24696, - -107374, -33286, -92342, 103616, 529892, -102005, 170188, -333934, -731755, -421444, - -333934, -51540, 46708, 114890, -78383, 96100, -10737, -28454, -43487, -23622, - 99321, 188442, 27917, -261993, 66035, -30065, -92879, 106837, -190589, -168577, - 229781, -191663, 72478, 8053, -176094, -143345, 210453, 206695, 23085, -239981, - -140660, 105764, 46708, 0, 12885, 27917, 30602, -73551, -27380, 26844, - 96100, 18790, -46171, -22549, -15032, -6442, 3758, -22012, 57982, 0, - -30602, 3221, 15569, 6442, -18254, 5369, -4295, -14496, -12885, 32749, - 22012, -4295, 8590, -51540, 4295, 10201, -12885, 30065, 0, -5369, - 27917, -8053, 8053, -20401, -2684, 5369, - }, - { - 176631, -438624, -504659, 55298, -214212, 44560, 1611, -21475, -24696, -91805, - -80531, -181462, 191663, -51540, -4514548, 967978, 1028645, -270583, 130997, 594853, - 250719, -19864, -643171, -1068910, 350577, 88047, -550293, 515933, -60130, -357019, - 260919, -201327, -10201, -90194, 83215, 184147, -323196, 112206, 42413, -136365, - 119185, 22012, 3221, -18790, 187905, 50466, -119185, 67646, 47782, -62277, - -100395, 80531, -66035, -11811, 30602, -24159, 8590, 84826, -40265, 38118, - 51003, 26307, 4295, 55835, -10737, -37581, -37044, 5369, -29528, -54761, - -41876, 61740, 28991, 31675, -32212, 53150, 31139, -6442, -37581, 2147, - -537, 8053, -26844, 3758, -28454, 9127, 32212, 25770, -15032, -24696, - 11811, 16643, -10201, -20938, 10201, -8590, - }, - { - 3846143, -22741314, -1794223, 143345, -308164, -60130, 151398, 25770, -107911, 240518, - 532039, -437550, 22012, -550293, -35970, -68719, -28991, -678068, 96637, -154082, - 135291, -225486, -234076, -458488, 335007, -22549, -127238, -742493, -80531, -178778, - -126702, -106837, 87510, 30602, -111669, -75699, -111132, 389768, -112743, -149787, - 155156, 68719, -5906, -133144, 73551, 28454, -55835, 134755, -11274, -30602, - 204548, -51003, -138513, 110059, 8053, 57982, -48318, -21475, 1074, 50466, - 5369, -8053, 54761, -53687, -15569, 6979, -55298, -24696, 49392, -15032, - -44560, -46708, 37044, 83215, 11274, 1611, 25233, -69793, 6442, 10737, - -4832, -20401, 8053, -53687, 15569, 14496, -2684, -1611, -10201, 22549, - -12348, 4832, 5906, 537, 23622, 11274, - }, - { - 263067, 802622, -1121523, 150324, 11811, 60130, 57445, -20938, 1074, -111669, - -45097, 14496, -245350, -151934, 2628520, -237297, -1341104, 936840, -639950, 1468879, - -52076, 75699, -889058, 664646, -229781, 288300, -95026, 2147, 491774, -475668, - -223875, 289373, 340376, 132070, -105227, 94489, 124017, -119722, 102542, 151934, - 95026, -125091, 40265, 83215, 2147, -24696, -73014, 55298, -4295, 14496, - 20401, 45097, -107911, 60130, 81604, -56371, -13422, 9664, -1074, -54761, - 45097, 27917, -39192, -17180, 45097, -35970, -5906, -2684, 11274, 34897, - 98247, -33823, -41876, 18790, 32212, 4295, 13959, -42950, -34897, -19327, - 30065, -46171, -17717, 13959, 32212, -7516, 2147, 12348, 2147, -26307, - -14496, 32749, 25233, -17717, -10737, -8590, - }, - { - 6524592, 25028922, -836982, 389768, 219580, -146029, -114890, -136365, -657667, 77309, - 97711, 97711, -54761, 14496, -100395, 88584, 68183, -134218, -375810, 268972, - 229244, 212601, -40265, -18790, 203474, -88584, -64961, -5906, 284005, 90194, - 236760, 23622, -235686, 205085, -147103, -170188, -127775, 57445, 160524, -60130, - 23085, -124554, 45634, -71941, 37581, -38655, -78920, 149787, 113817, -140660, - -17180, -150324, 49929, -69256, 31675, -4832, -91268, -6979, 14496, -40802, - -46708, -9127, 3758, 2684, 39192, 42950, -38655, -78920, 45097, 34360, - -51003, 32212, 69793, -52076, -40802, 22012, 16106, -37581, 2684, 24159, - -53150, 27917, 3221, -47245, -11274, 67109, -12348, -27380, -6979, 23622, - 19327, -31139, 12348, -1074, 6979, -1074, - }, - { - 303332, 775242, -983548, 55835, -163746, 41876, 18790, -1074, 20401, -173409, - -42950, 46171, 227633, -1126355, -693637, 80531, 940598, 821413, -60130, 428960, - 223875, 833761, 128849, -938987, -336618, -599685, 292058, -157303, 235686, 224412, - -31139, -154619, 146566, -128312, 10737, -53687, -62277, -188442, 34897, -186831, - 15032, 165893, -64961, -76773, 123480, 7516, 67646, -286689, 109522, 187368, - -125628, -44560, 16643, 92879, -187368, 3758, -33823, -65498, 15032, 119185, - 23085, 50466, -70330, -43487, -26844, 57982, 45634, -16643, -25233, 46171, - 0, -1611, 41339, 48318, -32749, -17717, 30065, -28991, -31675, -33823, - -53150, 19864, 13422, 7516, 29528, -2147, 10737, -33286, 19327, 11274, - -28991, 9664, -5369, 537, 1611, 537, - }, - { - -1063004, -43553652, 474594, 834834, 145492, -143345, -232465, -171262, 467078, -18254, - -542240, 41339, 143345, 869194, -98784, 540092, -436476, -123480, 175557, 72478, - -176631, -190589, -345745, 45634, -136365, 201327, -147103, 69793, 53150, 343597, - 309775, -135828, -88584, -15569, 53150, 39192, 117038, 338766, 280784, -76236, - 139586, -61740, -110595, 15032, -88584, 326954, 113280, -72478, -64425, 40802, - -88584, -164819, 84289, 28454, -84826, 56908, 76236, 65498, -79457, 25233, - 63888, -32749, 65498, -34897, -63351, 113817, 40802, -61203, 6979, 5906, - -20401, 28991, 34360, -18790, -12885, -70330, 48318, 5906, 10737, -38118, - 21475, -10201, 8053, -537, 6442, 36507, 28991, -4295, -18790, -27380, - -12348, 2147, 2147, 25770, -20938, 9664, - }, - { - -338766, -896574, 970126, -494995, 297963, 311922, -676457, 49929, 89657, 142808, - -228170, -237297, -43487, 273804, -160524, -63888, 533650, 547608, -565325, -936303, - -385473, 579284, 739808, -11811, -157303, -246424, 56908, 74625, -100395, 286152, - -1074, 337155, 73551, -184147, 15032, 81604, 163209, -84289, -244813, -92342, - -88047, -28454, -37044, -56908, 133144, -143345, -1074, -55298, 61740, 158377, - -96100, -47782, -49392, -92879, -70330, 136902, 37581, 28991, 11274, -35433, - -69793, -26844, -15569, 68183, -49392, 58519, 75699, 6979, -32749, -93416, - 34360, -26844, -537, 44023, -12885, -28454, 10737, 21475, -6442, 8053, - 27380, 28454, 8590, -17717, 5369, -22012, -11811, 11811, -1611, 23085, - -23085, 9664, -6979, 2684, 3221, -20401, - }, - { - -27917, -2828236, 2083059, 1436130, 405338, 1242319, -1418950, 234076, -83215, 136902, - 77309, 180926, 111132, -206695, -270583, 420907, -295279, -113817, -166430, 281320, - -250719, 417149, -191126, 14496, -272194, -87510, 15032, -27380, 157303, -47245, - -11811, -246961, 8590, 102542, 89121, -105227, 232465, -148176, -126702, 188979, - -184684, -345745, 78920, 17717, 122943, 64425, 26307, 20938, -97711, -1074, - 31675, -34360, -34360, -78920, -7516, -12348, 85899, 111132, -99321, 17717, - 49392, -33823, -42950, 37044, 35970, -68719, 23085, 9664, 24696, -10201, - 19327, 13422, 32212, -3758, -58519, 10737, -39728, -31675, 29528, -15032, - 26307, -5906, -22549, 46708, -30065, 31675, -49392, 17717, -28991, 10201, - 9664, -16643, -17180, 14496, 26844, -18790, - }, - { - -105227, -412317, 307090, -54761, 42413, -250719, 77846, 136902, -17717, 15569, - -104153, 11274, 578747, 55298, -20401, 950798, 475131, 331786, -242129, -391379, - -625455, 198642, -107911, 167504, -674310, 128312, 246424, -621697, 4295, 18790, - -663572, 224949, -41339, 348429, -56371, 19864, -241592, 117038, -153545, 20938, - -158377, 53687, 132607, -136365, -40802, -37581, -24696, 108448, -9127, 10737, - -103079, 16643, 67646, -41339, -76236, -123480, -89121, -11811, 125628, 51540, - 117575, -23085, -55835, -51540, 72478, 66572, -60130, 62277, 2684, 47782, - 5906, -10737, 12348, -4295, -22549, 11811, -51003, -28454, 11274, -30602, - 37581, -22012, -34360, 23622, -3758, -5369, 1611, 20401, 11274, 1074, - 9664, 11811, -19327, -18254, 17180, -5369, - }, - { - -3420405, 1176821, 1152662, -552977, 407485, 79994, -602369, -146566, 40265, 176631, - -14496, -201327, 176094, -637266, -293132, -152471, 341450, -12885, -196495, 38118, - -426276, 108448, -52613, 66572, 200253, -78920, -249108, 253940, -112743, 107911, - 176631, -94489, -161061, 120796, 130997, -24159, -113817, -4832, 166430, -220117, - -76236, 102542, 54761, 42413, 89657, 75699, 71404, 1611, 207769, 47245, - 22012, 12885, 75162, 62814, -126702, -66572, -74625, -18254, -3221, 99858, - -15569, 37581, 16106, -7516, -47782, -5369, 10201, 12885, 69793, -54761, - -52613, 61740, 38655, -28454, -26844, 1611, 11274, 34897, -31139, 2147, - -74088, 15032, 26844, 17180, -12348, -70330, 5369, 37044, 1074, 6979, - 14496, 13959, 17717, -26307, 6979, -13422, - }, - { - -334471, -82678, 406411, 378494, -31675, -22549, -118112, 122407, -102005, -104690, - 171262, -376347, 553514, 430034, -7561827, -846645, -292058, -742493, -32212, 315680, - 227096, -285078, -31675, -160524, -466004, 430570, -228170, -205622, -268972, -35970, - -78383, -70867, -202937, 282394, -81604, -125628, 202937, 0, -14496, -14496, - 198642, 4295, -106837, -19327, -143881, -91805, 177704, -11274, 71941, 42413, - 79994, -82678, -42950, 6979, 36507, -55298, -10737, 30602, 3758, 31675, - 63888, -135828, -53150, 13959, -22549, -54761, 82141, 4832, -57982, -4832, - -45097, -20938, 30065, -11274, 11811, -8590, -69256, 67109, -13959, 47782, - 5369, -54761, 9664, -2684, -20401, 17180, 32212, 35433, -40802, 33823, - 12348, -29528, -30065, 19327, -3758, -27917, - }, - { - 1123671, 3750043, 164283, -434329, 327491, -447750, -389231, 173409, -203474, -27917, - 791885, -223338, -233539, -68183, -1120987, 330176, -171799, -117575, -207769, -64961, - -75162, 32212, 112206, -51003, -467078, 94489, 384400, 394600, -122407, -182536, - 94489, -83752, 30602, 130460, -9127, -115964, -102005, 271120, 51540, 61203, - 81604, -30065, -37581, 16643, 38118, -2147, 102542, 141197, -6979, -77846, - 140123, 163746, -17717, -132070, 22549, -75699, -5369, 57445, -38118, 24159, - -1074, -30065, -15569, 30602, -16106, 28991, 31139, 3221, -25233, 2147, - -22549, 19327, 41339, -3758, -45634, -38118, 16643, 33823, 1611, -16643, - 34897, 14496, -25770, 3758, 12348, -5369, -18790, 25770, -73551, 6442, - -2684, -13959, 16643, -2684, 3758, -11811, + 974, 5300, 9537, 10289, 7949, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 9152, 18404, 17554, 15119, 10745, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + -430, -1502, -366, 507, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 631, 133, 845, 554, -946, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 143, 618, 179, 151, -1951, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + -145, -942, -1322, 574, 142, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 399, 947, 954, 318, 716, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + -1391, -1979, 495, 375, -308, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 2594, 4388, 3090, 1617, 1340, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 120, 2049, 4761, 7099, 6419, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 81, -958, -1576, 249, -254, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 173, -152, 4255, 6572, 4169, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 107, 894, 1364, 326, -1185, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 278, 1695, 2519, 1214, 519, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { + 13, -147, 1966, 2097, 180, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 42, 31, 105, 1304, 1210, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } }, -}; - -const Word32 rightBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX] /* Q29 */= -{ { { - -2035278, 19121194, -18495202, 21711596, -15680926, 9638980, 6416681, 4471598, -10793253, -3351685, - 2279017, -5827197, 1007707, 9967008, 8763344, -16039555, 6591164, -2894271, 10535555, -6199249, - 2529736, -2745021, 10612864, -10028749, 3979287, -10853919, 5805185, -3331821, 1793149, 659278, - -1992865, 6929393, -4472135, -2035278, -152471, 761283, 6942278, -13087839, 4218732, -5743445, - 6646462, 9316858, -7805030, -2385318, -988916, -551903, 368830, 5871221, -1902134, 1813550, - -2979634, 1300301, -1066763, 1910187, -861678, -1155883, -2600603, 1974611, -551903, 4977867, - -1408212, -1838783, 600222, 867047, 162672, 37044, 1451699, -635118, -2068027, -2888366, - 1687922, -876173, 179315, 925565, -1653026, 2085744, -1959579, 1526324, 286689, 463856, - 368293, 169114, 262530, 455267, -1733019, 155156, -1090922, 1658931, -1168231, -1552094, - 1267552, -25770, 284542, -1096290, 321586, -537, - }, - { - 8136816, -25189446, 12812961, 30360586, -9987410, 9773198, -3379603, 3135863, -9449465, 456340, - 2957085, -13490492, 9465034, 2585034, 7221988, -7059316, -6502581, -1435056, 13447543, -11040213, - 4391067, -13959, -3312494, -3750043, 8544301, -2517388, -6125160, 1289027, 4635344, -7394860, - 13889924, -8974871, 992674, 354335, -1604170, 10275172, -1265405, -4112968, -4556424, -2851858, - 9610526, -2658585, -3022046, -2483028, 6434398, -4887673, 2120640, 799401, 1380832, -566936, - 499290, -955630, -3023120, 3121368, -3856344, 1736241, -592169, 1614908, -1478006, -240518, - 2666101, 1079111, -4053376, 4402342, 458488, 25233, 1598265, -1979980, -1576790, 156766, - -2041183, -168041, 698469, 436476, -746787, 1155346, 341987, 493384, 2553358, -1379758, - 552440, 861678, -331249, 361314, -855772, -1482838, 2013803, -1247151, -683974, -374736, - 347355, 1074279, -404264, 140660, 199179, -215285, - }, - { - 2308008, -1722819, -2019172, 29935922, -13342853, 13094818, -861141, -8566849, 1262184, 3405372, - -4356708, -11042898, 6787659, 4838818, -5328444, 1803349, 6729677, -6644852, 5601174, -48855, - -5687611, 6048388, 3274913, -1105954, 1222455, -1165547, -6602439, -9337259, -3428995, 1684701, - 11617350, -535797, -4531728, 3995930, 2230162, -3075734, 3430605, 1599875, 3325915, -4949950, - -4392141, 5973763, 3742527, -3918084, -689342, -1402307, 1336272, 2644626, -136365, -2348810, - -3827890, 1547262, -1386201, 382789, 22012, 1186485, 1546725, -4494684, 68183, 1663763, - 4500052, 544924, 180926, -2998961, 4159139, -2168959, 1541893, -1443646, 1865090, -2579128, - -2211908, -1650878, 643171, -1351841, 568009, -1274532, 1035087, -261993, 2499671, 1340567, - 1093606, 78383, 341450, -1297617, 115964, 981400, -2317135, -1459215, -791885, 2099165, - 174483, -565325, 146029, 132607, 117575, -758599, - }, - { - 301721, 8079371, -16995722, 20680804, -17728552, 6823630, 5736466, -1010928, 466541, -789737, - -3018288, -5883032, -1736777, 16521129, -16350404, 14711874, 2678986, -10865730, -332860, 1115618, - 39192, 4937602, 1141924, -9066139, 8107288, 7423314, -10737955, -7816304, 7523709, -7333657, - 11012833, -8402567, 2571612, 740882, -3403762, 888521, 9127, -2197950, 4801774, -2711198, - 1327145, 3643743, -2845953, -1785096, 88584, 3867081, -5732171, 1149978, 3424163, -835908, - -4743255, 3193845, 1904818, -3505230, 1681480, -897648, 1036698, -2356327, -332860, 3483755, - 126702, -1999844, -1533303, 3488050, 2003065, -1791001, -2138894, 2908230, -1492501, -1691143, - 898722, -1073205, 1481227, -334471, 222265, 790274, -613643, -523986, 1110786, -122943, - -403727, -28454, 78383, 659278, -983011, 712965, 503048, 91805, -1144072, 1039919, - -441845, 12885, -659278, 17717, 482647, 79457, - }, - { - 16685411, -54204096, 18261128, 23584740, -8156680, 5968394, -1075889, 176094, -1830193, -12161737, - 5422933, -8902393, 9307194, -1027571, 1838783, 2260764, 3607236, -3780645, -1861332, 3337727, - -6289443, 7250979, -6560563, -9421548, 16391206, 5369, -6279242, -7256347, 8251169, 8474507, - -954020, -11196443, 13689135, -10506564, 3978750, 4214974, -2521146, -4527433, 6531572, -1715839, - 3189013, -3187403, 2526515, -2851322, 1031329, 3116536, -2349347, -2099702, -126702, 2244121, - 717260, -1673964, 1902671, -1938641, 104690, 2276870, -6514929, 3122978, -11274, 3352759, - -885837, -652298, -170725, 842350, -1556389, 4847408, -2079838, -1475321, -211527, 146566, - -2585570, -1027034, -86973, 1322313, 984621, 668404, 760209, -203474, 920197, 2085744, - -2031520, 190052, -890669, 1233193, -1330366, 352724, 533650, -53150, -1380295, 1931125, - -1017907, 738198, -183073, -519154, -305480, 521302, - }, - { - -2437931, 24202678, -32778116, 23180476, -17727478, 5976984, 9805947, -3591130, 231928, -6711424, - 5379447, -7529078, -8643622, 3347390, -432718, 13681618, -417686, -6272800, -4049081, -4777078, - 13830332, 853088, -9789304, -7119445, 5083094, -2570538, 18596134, -14281840, 5530308, -4474282, - -4737886, -7016366, 9075803, 4195110, -601832, -9510131, 3097208, -1195612, -2209224, 5714991, - -1158567, -10047539, 7479149, 2357400, -1275068, -5388037, 4286378, -3728569, 1725503, -1583232, - 1963874, -602369, 32749, 1540820, 2452426, 3233037, -3412352, -2348810, -331786, 1192927, - -983548, 857920, -3028489, -1441498, 2808372, -1243393, 1506997, 379568, -2443300, 905164, - 39728, 99321, 1142998, -1673427, -1089848, 2616709, -230854, 23085, -1470489, 655519, - -523449, -2321967, 105764, 676994, 1919850, 1213328, -846109, -794569, -855235, 371515, - 153008, -790811, 1471563, -1074, -241592, -325881, - }, - { - 19390166, -64063196, 24146306, 20260972, -654446, 1129040, 4246649, -3192771, 191126, -9803800, - 10201621, -15146739, -1774358, 11901354, 3289945, 9708774, -7872675, -5925981, -4275103, 408559, - 11675869, -5082020, -13572634, 4686883, 2867428, -3920768, 8893804, -8516383, 6592775, -607738, - -2825015, -6295885, 8706972, 7479149, -5155035, -5909875, 4575214, -4413616, 6012954, -1402307, - -432718, -5543729, 3523484, 3182034, -4394289, -2340220, 2091649, 1402844, 856846, -2628520, - 881005, -1826972, 4114579, 660888, -278099, 3063386, -3355443, 521839, 2674154, -2136746, - -41876, 186831, -2192044, 714575, -455267, 980326, 1877975, -2006824, 875100, -2247879, - 704912, 239981, 1570884, 232465, 1915019, -2413772, -118648, 1237488, -98247, -339839, - -1067836, -889595, -228707, 1085016, -2053531, 3872987, -1950452, 688805, -1749662, -193810, - 1383516, -1638530, 1030255, -149250, 422517, 343061, - }, - { - -2224793, 24359980, -38693360, 24678882, -14039174, 1191853, 8783745, 723702, 1782411, -6467684, - 1130650, -10030896, -3144990, 9911711, 2107218, 554588, -2541010, -5852430, 10450192, 5086852, - -8255464, -49392, -983011, -978716, -15438797, 13928042, 11463268, -7081864, -5822902, 1729798, - -4765803, 3954054, -5646809, 11143293, -8586176, 4599373, -4912369, 5098663, -5324686, 519154, - 2229625, 602906, -8669391, 2154463, 5063230, -989453, -3520800, -3645890, 4125853, 4983773, - -4363687, -5438503, 8181913, 1229971, 1847910, -361851, 442919, 205085, -6287832, 1260573, - 1610076, -3684008, 516470, -316754, -501974, -683437, 3135326, 2234457, -4832375, 181462, - 1666447, 845572, 2465848, 727460, -155693, -1211181, 2338073, -1021665, -1751810, -353798, - -694711, -446677, 374736, -438087, 1165010, -113817, 1073742, -550830, -2615635, -96100, - 995359, -276489, 2211908, 282931, -190052, -740882, - }, - { - 18733036, -62598076, 27393838, 19163070, -535260, 9795210, -2845953, -1230508, -4468377, 0, - 3419868, -12179454, -2422362, 22666154, -18511846, 10930692, -6583648, -4216048, 11125039, -3110630, - 2776696, -15039902, 15306190, -11666742, -11208791, 10506564, 5202816, 2368675, -12700755, 3821984, - -643171, 493921, -2736968, 425739, 6603512, -6469832, 958315, 3280818, 934155, -2275796, - -2750390, -2179696, -427886, 678605, 1084479, 1592359, 361851, -1058710, -1385127, 1103270, - 2352568, -5490579, 1574106, 3666828, 760746, 2566243, -1251983, -12885, -4351339, -537, - 1276679, -2313377, 1281511, 3760781, -3617436, 952409, 3158412, -528818, 616865, -2945274, - 925565, 1319092, 186831, 2400350, -2095407, -51540, 616328, -1152662, -1024887, -210453, - -485331, -1555315, 1232119, 432718, 892816, 361314, 93416, -398358, -390305, -520765, - 377420, 1126355, -794569, 1438814, -107911, -121870, - }, - { - 2752000, -825707, -8179229, 16479253, 2835215, 3725884, -20996484, 5611912, 13813152, -4757213, - -1916629, -12141873, 12455405, 4762045, -11391327, 2378338, -10085120, 5406827, 4566087, 2015413, - -6605660, 9790378, -1069984, 1208496, 3748433, -12312061, 7002408, -9823664, -1425929, 3026341, - 4692789, -1962800, 6811818, -5387500, -1667521, 6510634, 264677, -586263, -5311264, 8185671, - -250719, 2115808, -261456, -11483669, 1715303, -1672353, -3612604, 5099737, 1149441, 3209414, - -5313949, -16106, -2797098, 1750736, -2193655, 4679367, 1271847, -1480690, 4041027, -5419175, - 875636, -5175436, 3777961, -2184528, 2040110, 992674, 1005559, -1060320, 2103997, -2279017, - 847182, -1785096, 598611, -1993402, -1107565, -216896, 140123, 727997, -121333, 205085, - 731755, 248571, -56371, -333397, 413391, -1195612, -385473, 1349694, -356482, -1950452, - 1060857, -808528, -383863, -70867, 1350767, -1133335, - }, - { - 11999065, -40768904, 18858128, 15680389, 1698123, -2427194, -11236708, -7740605, 16375100, -3618510, - -6114960, -481036, 6647536, -3309272, -704912, 1320166, -1129576, 11656541, -6546067, 5200669, - 2527052, 7603703, -12822625, 11763379, -14040248, 623844, 3594888, -251792, 30065, 2532957, - -1068373, -516470, 2602750, -7248294, 4001299, 24696, 1743220, -3599720, 3703336, -3347927, - 3355980, -2763812, 988379, -1322313, 154082, -537, -3790846, 6980933, -2502892, -421444, - 5133023, -5999533, -1521492, -1117765, 3856881, -97174, -185220, 5153424, -1775432, -1306207, - -938450, -314069, -77846, 2870112, 1905892, -1671279, -663572, -569620, 183073, -919660, - 1631014, -275952, 1882806, -2303713, -451508, 637803, -1475321, 1974074, -153545, -592169, - 1198296, 2167885, -1814624, -467078, -102542, 1296543, -2226404, 284005, -245350, -257698, - 25233, -1120450, 1564979, 813896, -340913, 228707, - }, - { - 596464, 6371047, -9658308, 15191836, 228707, -1268626, -21166136, 16761647, -2787971, 4490389, - 3436511, -13826573, 14001593, -12692702, 1101659, 1949378, 5230734, -9315784, 4208531, 318901, - -8022462, 835371, -7016903, 12051141, 359167, -8105677, 8099772, 3777961, -2772402, -2400350, - -2447595, 5048197, -5597953, 6600828, 4696547, -5738077, 2341294, -5284421, -40802, 1775432, - -1517197, -7615514, 12034498, -3599720, -5408975, 6559489, -1930051, 1999307, -3163780, 4827007, - 4862440, -8359080, 2467996, -850940, 1184337, -89657, -5303748, 2367601, 68183, -3901441, - 3757560, 3653944, -1782948, -391916, 877784, -683437, 315143, -3100967, 1063541, 3797825, - -1165547, -1789928, 2885681, 2587181, -1634235, -640487, 1476932, -1544041, 559956, -1927367, - 1895691, -1404454, -547071, -30065, 1059783, -797253, -539018, 2723546, 991064, -433792, - 1355062, 377420, 76236, -335007, 444529, -1616518, - }, - { - 18286360, -59293096, 25884158, 13550085, 6586869, -1349694, -10688026, 12868796, -10344966, 15255724, - -25170118, -95563, 6919193, -17524540, 16559246, 833761, 39728, -2471754, 2050847, -5446019, - -166967, 4176319, -3117073, 4264903, -7564511, -483184, 1455994, 7459285, 2395518, -8699993, - -2865280, 437013, -3252364, 6910066, 4022237, -2068564, -1074, -5796059, 6518150, -2180233, - -7810935, 987306, 7740068, -1113470, -3537979, 3973382, -883153, 3079492, -2222109, 421444, - 887448, -1373853, 288837, 1604707, -4583267, 2483028, -5653251, 6015102, -3847754, 3966402, - -1320703, 1296006, -1108102, -122407, 731755, -811749, -1991791, 2147, 4271882, 1867237, - -2911451, 1600949, -370978, 858457, 276489, -624918, -734439, 1032940, -2309619, 1322850, - -2050310, 74088, -1268626, -526670, 1245541, 348966, -190052, 1330366, -733903, 732292, - -151934, 1126355, 1050656, 120796, 79994, -907312, - }, - { - 4379256, -8027294, -2474975, 11282879, 2308545, -699543, -26183194, 22315040, -4377109, -5325760, - 6444599, -17369922, 5887864, 5151814, 10521596, -12064026, 13545253, -2038499, -5294084, -8467528, - 7938710, -8148627, 14334990, 2097555, -11656541, 6869800, 5526013, -10798085, 1962800, 3207804, - -7486128, 3976066, 2341831, 3394635, -13418552, 9698573, -1971390, -1440425, 633508, 1112933, - 5093831, -2662343, -763430, -3320547, 3207804, -1882269, -1918777, 4769025, 218506, 1089311, - 906238, 177704, -1381906, -1457068, -408022, -330176, -1122597, 937914, -1254131, -619549, - 1773822, -2922188, 994822, 1688996, 2619393, -1215476, -2312303, 2065342, -1634772, 287763, - 649077, 434329, 41876, -1411434, 1393180, 580357, -988916, -311385, -265214, 1007170, - 152471, 284542, 295816, 129923, 239444, 256087, -215285, 473520, -470299, -877247, - -10201, -454730, 44560, 534723, 615254, -1833414, - }, - { - 16895864, -54960012, 26162256, 1380295, 16823924, -7062537, -11407433, 12160126, -9874667, 6729677, - -7201587, -1016297, -9790378, 15442018, -4313221, 1765232, 2644089, -5308580, -6852621, 474594, - 3176128, 8330626, -7447474, 7694434, -7218230, -8999567, 9812390, 2077690, -3107409, 3114925, - -6233608, 3409667, 153545, 2242510, -8741332, 4974646, 337692, 2350421, -4612795, 4078072, - 1963337, 4505421, -8259759, 858993, 1553704, -3667365, -216359, 2161442, 2552284, -157840, - 1795296, -2142115, -2095944, 1222455, -2944200, 1583769, -1969243, 1218697, 217970, 2449205, - -2509335, 610422, 9127, 170188, 380105, -2280091, 1448478, -21475, 368293, -3209951, - 3218004, -2907156, 2608119, -1095754, -857920, 909459, -95026, -1690070, 27917, -792421, - 1132798, -970663, 348429, -856846, 1066226, -81068, 1224066, -341450, -289373, -1067299, - 153545, 544924, 372052, -1489817, 1401770, -318364, - }, - }, - { - { - -264141, 68258840, 16369194, 7657927, -19297288, 12680891, 8750996, 8322036, -8681740, 590558, - 1330903, -3745212, 11426224, 15974057, 6109591, -22472880, 15177878, 2458869, 5107790, -12659416, - 7072738, 6630893, 19915764, -18089328, -4084514, -15334644, 7822746, 1563905, 10470057, 2245731, - -11425687, -791885, -10370199, -765041, -2507187, -3817152, 5339181, -18183818, 1686848, -12220793, - 3582540, 10499584, -6015639, 1218160, -3363496, -4555350, 2185065, 13197361, -621160, 1715303, - 820876, 2257005, -350040, 3044595, -192737, -620086, -5199595, -1002875, -1379221, 8775692, - -537408, -5123359, -2718178, 124017, -417686, -1664300, -100395, -469225, -1668595, -2694018, - 4977330, 337155, 84289, 1720671, -1258425, 1060320, -4556424, 268435, -316217, 187905, - -342524, -941135, -515933, -1095754, -3115462, -447213, -2077154, 1591822, 570694, 683437, - 2177012, -179315, -494458, -1740536, -92342, -963683, - }, - { - -4207458, 11868605, 68243808, 64874944, 963146, 1488743, -8151848, 8546985, -1186485, 4255776, - 4422743, -15265924, 8908299, 3878892, 18137646, -13084618, -16029892, -6694781, 6089190, -13163538, - -2189897, -7266548, -6488085, -3187403, 15574088, -1573032, -3801046, 3948149, 1757179, -7145752, - 20168630, -10482405, 3975529, 10151692, 4738423, 12752832, -2797634, -6446209, -12394202, -8941048, - 8881992, -5426155, -3031710, -2182380, 6542846, -2054068, 7231651, 1922535, 1042066, -1531693, - 1868311, -1212791, -5148592, 2353105, -1440425, 5470178, -1835562, -507880, -4183298, -3055332, - 1342714, 100932, -5385889, 8165807, 2510945, 285615, 1763621, -1602023, -776852, 266288, - -1804960, 2097018, 2119566, 2414309, 101469, 137439, -498753, -814970, 1097364, -1450625, - 2468533, 770410, -2040110, 325344, 1233729, -443992, 2629057, -1296006, -1644436, -288837, - 932008, 1259499, 561567, 770947, -706522, -1843078, - }, - { - 360240, 59506236, 54447300, 49316960, 3038689, 6859600, -4317516, -4193499, 2901251, 9657234, - -4147865, -18968186, 2515777, 2574833, -6462852, 2360622, 15911243, 26307, 9143985, 1374926, - -7511898, 2328946, 1428614, -3746285, -1068910, -8958228, -16355772, -14168560, -4329864, 3381213, - 14697378, 2992519, -7168838, 3199214, 7068443, 3152506, 10628433, 7519414, 9500468, -2983929, - -8159364, 4471598, 5507222, -3732327, -2914672, -4795331, -1592359, 1921461, 1227824, -3299072, - -3706020, 4696010, -3301756, 215822, -598074, -860604, 6550362, 1823214, 508417, -1575179, - 5600101, 2542084, 409633, -5030481, 2576981, -2389076, 893890, -1142998, 3403225, -2692408, - -289373, -1605244, -292058, -1339493, -400506, -2269353, 886374, 338229, 5612449, 3199214, - 2233383, 1023813, 1071058, -1959579, -1937567, -478889, -3166465, -686121, -948114, 1605781, - 872415, -556735, -1476395, -1075352, -100932, 333397, - }, - { - 531502, 43401720, 3537979, 1577864, -34132640, 4432943, 5692979, -2640868, 2745021, 19924890, - 6817724, -8168491, -3328063, 10139881, -28794534, 19249506, 23091892, -8381629, -17289928, -5530844, - 675384, 8301635, 10322954, -4350802, 8532489, 5298916, -15050102, -15217069, 1519882, -13725642, - 15373835, -6106907, -4163434, -3051038, -4210679, -1787780, -4375498, -3969624, 7347079, 1956358, - 4325032, 3663607, -1793686, -4230543, -2026688, 4755066, -8110509, 1428614, 3813931, 1873680, - -5880884, -1782411, 3063386, -1624035, 2356327, -75699, -586800, -5396090, -1050120, 5902896, - 1153736, -1986959, -311385, 6939057, 6101538, -1575179, -3809636, -290447, -4608500, 810138, - 4321811, -175020, 2995740, -178778, 282931, 456877, -322123, 379568, 644245, -789737, - -139050, 356482, 111132, 676457, -1199907, 650151, 735513, 1610613, 177167, 1088774, - -960999, -363462, 292595, 497142, -99858, -162672, - }, - { - -14406931, -97638032, 20167018, 57848376, 17260400, 2102387, -7294465, -2382633, -7247758, -10233296, - 9731859, -14901389, 8752606, -9897215, -3969087, 4721243, 20994338, -1827509, -15416785, -6052683, - -24034100, 770947, 7330973, 929860, 14398341, -51003, 1061931, 1007170, 14256070, 9368934, - -1114007, -15522012, 14061723, -6973417, 8539469, 7597797, 591095, -4095788, 7967165, 784368, - 956704, -6170795, 6309844, -1786706, -1880659, 3495567, 407485, 3068754, 1776506, -302795, - 656593, -3244848, 3884798, -614717, -3867081, 2477123, -7969312, 945967, 786516, 4130685, - 999117, 1772211, -2575370, -1768453, -2158758, 8359617, 506806, -1627256, -2023467, -2541547, - -5661304, -2167885, 1455994, 3266323, 4156992, 1324997, 258772, 1341104, 3541738, 4835597, - -559956, 57982, -1640678, 1546725, -2763275, -1045825, 1279363, 1407676, -181462, 2694018, - -728534, 1558536, 506806, -126165, -97174, 1141388, - }, - { - -1709934, 53832048, -15636902, -4982699, -38745436, 7272454, 9113384, -4870493, 5386963, -2739652, - 4188667, -9689446, -5834176, -6052146, -12681965, 6539625, -5248450, -4712116, -8708583, -11519102, - 10946798, 710280, -1588064, -13626857, -4671851, -5371931, 20970178, -13539884, 2967286, -9826885, - -5739687, -17287780, 76236, 5759015, -3591130, -12936441, 4291746, -5178657, -5720897, 5063767, - 2779918, -8745627, 4474282, 2184528, 1973001, -2500745, 3600256, -7444252, 1564442, -358093, - 2791192, 1781875, 277025, 1864553, 5597416, 3664681, -6814503, -4044249, -925029, 758062, - -744640, 1199370, -4755066, -2698850, 1524713, -3941169, 2275796, 4118874, -1459752, 67646, - 44023, -1498944, -2912525, -6648610, -4444755, 3225521, 316217, 494995, -1442572, 361851, - -818728, -2570001, 54761, 2206003, 3364033, 856309, -1827509, -483184, -103616, 1584306, - 578747, -1868311, 762894, -1175210, -408559, 28454, - }, - { - -16222628, -118763360, 20569136, 65128884, 34739308, -2097555, 5369783, -4232691, 2654290, -12229919, - 12791486, -2734821, 488016, 11002096, 4356708, -3078418, -15992311, -1684164, -9960566, -16145856, - 3534221, -7588134, -15604153, 7527467, 3561065, -10734734, 5029944, -4920959, 13320841, 1678795, - -11274, -6325413, 4936528, 10176388, -630823, -7608535, -814433, -8527121, 8180839, 79457, - 3346317, -5655398, 2627983, 780610, -11334419, -5671505, 2827699, 4954782, 6896107, -1822677, - -5020817, -4156992, 7619809, -623844, -3088082, 5021891, -180926, 6977711, 6842957, -2402497, - 3175592, 1369021, -5062693, -925029, -828392, 236760, 1435056, -1135482, 863288, -4093104, - 1316944, -294205, 2559801, 1895691, 2027225, -4370129, -1394254, 3416110, 2029909, 13959, - -546535, -1330366, -776315, 171799, -3670587, 3891777, -2906082, 1051730, -1647657, -725313, - 1679869, -1009854, 439160, -758062, 1139240, 908386, - }, - { - -2219424, 42355356, -32041530, -1141924, -32543504, -3792993, 8963597, 7785165, 6080063, -3036005, - 7787313, -5597953, -5874979, 153545, 5277441, 3939022, 1756105, 7575249, 8230768, -963146, - -13646185, -4514011, -4355097, 9257265, -5930276, 7636452, -2311766, -5406290, 809064, -228707, - 3695819, 4208531, -16069083, 5367636, -10220412, 6593312, -5848135, 888521, -8319889, 120259, - 4854387, 4691178, -12111808, -1730872, 6338298, -85899, -3127810, -5130876, 864899, 6976638, - -2062121, -3659849, 11198053, 1411971, 3722126, 1090385, -2201708, -2020245, -5067525, 316754, - -1870458, -5059472, 2196876, 608275, 902480, -777389, 859530, -1044751, -3335579, 5276904, - 5186173, 3817152, 5046587, 2024003, -497679, -4060355, 576063, 836982, 612033, 351650, - 285615, 494458, -109522, -2614561, -1152662, -1865090, 1188095, 963146, -2824478, -1773822, - 797790, -150861, 1656247, 676994, 949725, -146566, - }, - { - -15829639, -110438104, 30605400, 69485056, 43733504, 11235634, -6339909, -1993402, 573915, 9400610, - 16230681, -9069897, -11547020, 14753750, -33012192, 1687922, -2166811, -7781944, 7033546, 2911451, - 3606699, -27564026, 10615012, -5402532, -17794050, 2283849, 3342558, 3766686, -6459094, 3898757, - -12232067, -9852655, 3721589, 2822331, 2840584, -6944425, 978179, 280247, -2435783, 1275605, - 227096, -6495065, 634045, 292058, 474594, 9312563, 6704981, -2259690, -6755447, -215822, - 2816425, -5832029, 2029909, 122943, -1808181, 2816425, -5488432, -418222, -2097018, 2997887, - 4195110, -1457605, 3700651, 7563975, -125091, 2978560, 1904818, -153545, 391916, -4334696, - 912144, 239444, -2011655, 1298154, -1161252, -741956, -2119566, -3084860, -2282775, 1212255, - -402116, -2946348, 1297080, 1330903, 793495, 382252, 1313186, 828392, 863288, -44560, - -1077500, 509491, -941135, 1770063, 571231, -452582, - }, - { - -339839, 44124348, 26177826, 10539850, -9363566, -6541772, -24353538, 17830020, 25158308, -6756521, - 2340757, -16545825, 12599287, 13695577, -14882599, -12927315, -28409062, 14654965, 17803714, 5109938, - -6106370, 5277978, -5619965, -4399121, 2581275, -10138270, 7839926, -15468325, -113280, 7741679, - 13956496, 485331, 5724655, -5297842, 1183264, 14993731, 10114111, 4206921, -6965363, 8410620, - -2738579, -364535, -2531883, -18612240, -4217121, -2622078, -8845485, 847719, -2096481, -1132798, - -2263985, 1522566, -3172907, 6910066, 3769371, 8256538, -1839320, -1879048, 4782446, -10922639, - -407485, -5303211, 1831804, -7557532, -1663226, 1391033, 4396436, 310311, 1768990, -2795487, - -531502, -2842732, 1672353, 256624, -834297, -3186329, -1682017, 978179, 378494, -1451162, - -2500208, -1032940, 598074, -525060, -2004139, -5039608, -862752, 3219078, 1655710, -176631, - 1494649, -1185948, -1142998, -1242856, -16106, -3591130, - }, - { - -9096204, -48709760, 45932528, 28967944, -1402844, 11814381, 504122, -28758028, 15211164, -6026376, - 666257, 748398, 1163936, 4890894, 1649804, 4962298, 17480516, 35225176, 1400159, 12046846, - 15061377, 4494147, -20076288, 6463389, -13477071, 6518687, 6799470, 2131378, 5486284, -5484673, - -7472170, 7437273, 2684355, -7296076, 2414309, -660351, 1615982, -4911832, 3090766, -4846334, - 5865852, 1857573, 9038222, 7577396, 3908420, -1487132, -12265890, 740345, -2016487, -2579128, - 4234838, 38118, 1442035, -1268626, 7180649, -127238, 90731, 7564511, -3417183, -3746285, - -2144799, 617938, 2651069, 3580392, 2176475, -573378, 197032, -106837, 909459, -1111860, - 1680943, 10737, 2121177, -2248952, -1870458, -1853815, -2812667, 3216931, 36507, -1225676, - 1409823, 2120103, -2434173, 705448, 1676648, 1318018, -3786014, -1835025, 242666, 679679, - -1220845, -1190780, 3220689, 995359, -1360968, 48855, - }, - { - 17717, 54784992, 23431730, 1261647, -15328738, -15483894, -26288422, 19927574, -5037997, 1713155, - 24054502, 6634114, 9312563, -14493367, -8264591, -25598542, -10921028, -6864432, 2573759, -3119757, - -14550275, -11250667, -6102075, 16705275, 7176354, 1389422, 9811853, 1286343, -1203665, 9263171, - 6380174, 4863514, -7590818, 2022930, 253940, -3193308, 1948841, -17146046, -7196755, 2149094, - -463856, -13774497, 12564927, -1797981, -8523363, 6788196, -2374043, 681289, -5655398, 1437740, - 3498251, -7858717, 3701188, -1290101, 3436511, 3903589, -4709969, 4153770, 5297842, -4374424, - -332860, 1532230, -3764539, 1905355, 519154, -5029407, 2206540, 185757, -43487, 2928094, - -538482, 490700, 5464272, 1500017, -2569464, 134218, 3336116, 1271310, 3312494, -679679, - 2463164, -1781875, 174483, 1300301, 2326799, 101469, -516470, 3731253, 2050847, 107911, - 1561758, -184684, 471910, -406948, 293132, -2758980, - }, - { - -13037373, -119832808, 20034412, 33978024, 28166932, 22021908, 4514548, 1536525, -23257784, -2517925, - -34543884, 732829, 1498407, -23270132, 8352638, -5792301, 4954245, 279710, -5243618, -3097745, - 9058086, 11238319, -2702608, -7373385, -13749801, 3248606, 7058242, 11234024, 700080, -16359530, - -13044353, -4664335, -5019743, 10441065, 4859756, -640487, 10001905, -1467268, 5603322, -1282048, - -11167989, -1177895, 5214627, 503585, 5438503, 2747705, -3906810, 7931194, -4318053, -7828115, - -6734509, -3400004, 6933688, 3829500, -5398774, 8350490, -4884989, 8793946, -486942, 2975876, - -3671660, -389768, -2155000, 96637, -404264, -1844689, 106300, 1551020, 5019206, 4592931, - -3461744, 307627, -1483911, -986232, -689879, -3584150, -3265786, 2895345, -949725, 2254321, - -3060701, -2143189, -4442070, -3450469, 1283122, 1207960, -542777, 2015413, 511101, 615254, - -92342, 2246268, 2260227, 1665911, 867583, -2013803, - }, - { - -1574106, 28410672, 25350508, -263067, -12904766, -18254148, -38652560, 22014392, -13957570, -16482474, - 7407745, -19494320, 13811004, 11447162, 12911745, -3107946, 21007758, -6742025, -14986752, -18660560, - 1446330, -13320304, 19738060, 14465450, -11120207, 5535139, 1085016, -15114527, 6826314, 3825742, - -10099079, 6310381, 2850248, -3690451, -15334644, 11972758, -4378183, -3469797, -4003447, -1180579, - -987843, -2045478, 6498823, 2587181, 8345659, 5111548, 1829656, 5087389, -2306934, -3893388, - 3545496, 4791573, -2787434, 1060320, 1707786, -4021700, -5747203, -1468879, -2952253, -4022237, - -1130113, -2844342, 4635344, 3595425, 2395518, -4681515, -5033165, 1705102, -1339493, 4152697, - 4198331, 838592, 276489, -158914, 1963874, 933619, -636729, 1564979, 1387811, 1771137, - 856846, 695248, 195421, -1058710, 279710, 368830, -2510409, -146029, 1190780, -993748, - -1483374, -1474784, 325881, 1495186, 791348, -2379412, - }, - { - -12686797, -114869976, 14782741, 12022150, 27876486, 3537443, -6538551, 1541356, -11693048, -105764, - -15764677, 4575214, -21502216, 9688909, 3062849, 320512, -11837467, -18284750, -17658222, -1417339, - 11826729, 14911590, -16420197, -2177549, -14505178, -10348724, 19689740, 8227547, -6728067, -2907693, - -6628209, 11530377, 2808372, -3825742, -8645232, 13686987, 3542274, 5517959, -3066607, 2404645, - -1107028, 3416647, -10194642, -7060390, -2795487, -2154463, -78383, -693100, -2320356, -3117610, - 4847408, 1249836, -3910568, 2581275, -1980517, -180926, -8295193, -2182917, 1132798, 5174362, - -912144, 2592550, 3278671, 683437, -3942243, -6502581, 1400696, -2298881, -3142842, -5080947, - 3237332, -4072166, 2511482, -1592359, -1452236, -209380, -1818919, -1594507, 132607, -3551938, - -531502, -2587181, -1224603, -2474438, 932008, 1799591, 2067490, 131533, -221728, -1684164, - 120259, 1286343, 532576, -2388539, 1607928, -1526861, - }, - }, - { - { - 2319819, 28944858, 37702832, -23418846, 21703544, 3565897, 9201967, -31675, -2671470, -225486, - 10560251, -11447698, 16920560, 15935402, -13241921, 587874, -4072166, 1095217, 6875706, -9826885, - -5191005, 13609141, 23190676, -9360881, -4994510, -9152575, -2283312, 4062502, 7018514, -1185411, - -4217658, -11281805, -7624641, 6271726, -1721208, -5656472, -3153043, -6708202, -2204392, -9580998, - -1003412, 6698002, -1792075, 482110, -1799054, -3906810, 4581120, 2047626, 7164006, 6979, - 453656, -1037235, 3088082, 261993, -813896, -1254667, -3978214, 999117, -612033, 2655364, - 570157, -5136244, -272194, 1833951, -3446175, -1828582, 439697, -1059246, -573915, -3516505, - 4056060, 3534221, -156229, 78383, 1741072, -326954, -2935073, -2637647, 420907, -1549410, - -340913, -20938, -1730872, -115964, 110059, -2113661, -994822, 1246614, 611496, 1607928, - 745714, -188442, -107374, -1186485, -448824, 558346, - }, - { - 753767, 108776488, -22784802, 22588844, 21629456, 6777459, -4938139, -857920, 6720013, 4965519, - -2471217, -564788, -1379758, 1301375, 17222818, -10423349, -10629507, -2128156, -1199370, -2287607, - -14916421, -2884071, -3186329, -5877663, 12251394, -1234266, 825171, 1622424, -7526930, 4479114, - 8270497, 1734630, 4357781, 6941204, 4226248, 5331665, -3427384, 811749, -11646341, -6671158, - 2944200, -3454228, 925029, 892816, 2964064, 1538672, 522375, 1288490, 1899449, -1962800, - 3625489, -4380330, -742493, 921807, -154619, 3010772, -3125663, -793495, -1939178, -2510945, - -1758789, 1687385, -3310346, 6277632, 3006477, -1568737, 737124, 27380, -4331475, 3058554, - 361314, 2936684, -856309, 1373316, 685047, -602906, -1224066, -227096, 1097364, -1210107, - 3096672, -1377611, -312459, -2590939, 3039763, 1684164, -205622, -935229, -831613, 1245004, - -947577, 1515587, 522375, 773631, -1415729, -913217, - }, - { - -2006824, 103549512, 17637820, -5538897, 45635100, 5542119, -5538361, -7670275, 4872104, 9917079, - -2228014, -10747082, -4708895, -1699196, 3350075, 1067836, 9624485, 6330782, 1838246, 2168959, - 5611375, -8829916, 148713, -7799124, 1787243, -473520, -15446850, -17827336, -3163780, 10790568, - 984621, -623844, -714038, 5652714, 8495445, -362925, 6298033, 7435662, 7712151, -1674500, - -3993783, 4139275, 209917, -499290, -5053566, -2975339, 3253975, -3045669, -3189550, 2457258, - 1534377, 2068564, -3296924, 2377265, -1301375, -494458, 2265595, 2931315, 5541045, -3969624, - 2161979, 2877091, 299574, -2123861, 2185602, -1718524, -2212982, 1660005, 117038, 408022, - -57445, -727460, -958315, 213138, -1620813, -461709, -702764, 1574106, 6328635, 1829656, - 1344862, 1687385, 672699, 13422, -2755759, -833224, -1774358, -748935, -660888, 1757715, - 583579, -495532, -2022930, -304406, 348429, 929860, - }, - { - -392990, 41625212, 10570988, -14656576, -10007274, -1921461, 1383516, -838056, -2013803, 18891950, - 6048388, -5664525, 548682, -720481, -10778220, 10470057, 11247446, 9737765, -23707146, -4012573, - 3853660, -7345468, 8099235, 4086662, 9196062, -1850594, -8952322, -6728603, -5669357, -9167608, - 5989869, -140123, -5742908, 2643552, -9250286, -1943473, -6310918, 2885144, 1162862, 5325223, - 4292820, -1648194, 1002338, 1586454, -1050656, -1373853, -7685307, 3872450, -648003, 3112778, - 3623342, -9716290, 1438814, 4480725, -3205119, 2017561, -2035278, -1605781, -3986267, 4001299, - 2251637, 518617, 2209224, 2848100, 5950141, -3132105, -564788, -2794950, -3221762, 2068027, - 3809636, -868657, 1510755, 1196148, 2041183, -1547799, 155693, 445603, 1530082, -962610, - -641024, 185220, 1374390, -260919, -1131187, 882616, 503585, -37581, 1008244, 536871, - 427349, -1687922, 481036, -134218, 366683, 472446, - }, - { - 12954695, -61631172, -37902012, 43744240, 19943680, 14212584, -11323681, 6899328, -5323075, -1649804, - -9860708, -10394358, 4308926, -3387656, 957778, -12364137, 23770496, -1658394, -11199664, -11897059, - -17113298, 4134980, 8600672, 1266479, 7688529, -3712462, 8318815, 6398428, 6229850, 4748087, - -1938104, -3860639, 1566589, 4811974, -1777580, 6323803, -1365263, 2128156, 2146947, 7098507, - 353261, -1602023, -3164854, -200790, 1584306, -4534412, 1908039, 4523675, 5236639, -2210835, - -1780264, -2420214, 3855270, 254477, -3536369, 3674345, -811212, -2755222, -2140504, 2414845, - -204548, -498753, 852014, -756988, -106837, 1647657, 4236985, -2769717, -2525441, -2010582, - -2892661, -2024003, 3979824, -1054415, 4907537, 612033, -1199370, 3659312, 3497177, 1631014, - -374199, 1367947, -1203128, 1093069, -2040110, -662499, 2191507, -304406, 2587718, 273267, - 78383, 973347, 1085553, 222801, -1032403, 668941, - }, - { - 2897492, -22214644, 56315076, -16298864, -19292994, 679142, 763967, 795106, -1476932, 4671851, - 2322504, -8194798, -5809480, 1423782, -17292612, -2463164, 6000606, -11121281, -3917547, -212601, - -6662031, -5126581, 0, -18816252, 11337103, -8024073, 820339, -1915555, 3346853, -4524748, - -10072235, -9329743, -120796, 1825898, -8617852, -1556389, -2625299, -6512244, 1923072, 2532420, - 3731253, -7903814, 6039798, -2253784, 1652489, 5970542, -3033858, -3956739, -1940252, 7219840, - -515933, 5877126, -5326833, 2008971, 3251827, 4005594, -962073, -2399276, -6631967, 2119566, - 193810, -3780108, -2876018, -265751, -4221416, 1592359, 1671816, 6204617, -1133871, -5093831, - 795106, 178778, -3451006, -2552821, -4828080, 1674500, 948651, -1771674, -1391033, 180926, - 1433445, -3657165, 109522, 4448513, -436476, 1398549, -1731409, 1082869, 188979, 657667, - 968515, -1923072, 1073205, -3256659, 579284, 1124208, - }, - { - 14364518, -80550504, -47483548, 72426568, 24154896, 4940286, 2577517, -1988033, 6879464, -10627897, - -6793028, 13962402, 3634616, -690953, 14814953, -9290551, -14208826, -3568581, -8363375, -4986994, - -5245229, -10459319, -8067023, 120259, -2403034, 1929514, -146029, 1571421, 1610076, 7381438, - -766652, -4441533, -1510755, 7169911, 2697240, -8498667, 2192044, -7756711, 5091147, 1337882, - 2814814, -2855080, 190052, -1967095, -1949378, -3200825, -1862942, 2980707, 1898376, 4096325, - -9882183, -1541893, 3647501, -2042257, 961536, 2869575, -227096, 6660421, 6994891, 17180, - 2458869, -3056943, -772020, 3076270, -1941862, -3064459, 287226, 1189169, -437013, -2489471, - 2457258, 656056, -445603, 3249680, 1419487, -3541738, -2147, 2115272, 209380, -813896, - 1699196, -1432372, -337155, -409096, -1103270, -459562, -608275, 1797444, -2087354, 272730, - 818728, 99858, 1413044, -1603633, 1149978, -311922, - }, - { - 2579665, -40336724, 51156280, -12734578, -18255222, -7678865, 5017596, 6427956, 3042448, 3697967, - 4057134, 4563403, -15539192, 16549583, 77846, 4536023, 8067559, 8933532, -5475010, -7257958, - -3950833, -5145908, -2913062, 7628399, -4872641, -5819144, 9654013, -9446244, 13945222, -11560441, - 17472464, -146029, -13969918, 682900, -2309082, -11154030, 6209449, -4904316, 1132798, 998043, - 4056597, -1731946, -972810, -3942780, 1571421, 2411087, -3081639, 1147293, -5186710, 2330557, - 1987496, -1733556, 5512054, 3837017, 3793530, 1893007, -1232119, -3926674, 899259, -4617090, - -310848, -3901978, 935766, -1670205, 5339181, -5428302, 298500, -644245, 1003412, 2854543, - 3549254, 9527848, 1021665, 105764, -668404, -22012, -306016, -781147, 947040, 1189169, - -333934, 340376, 107374, -2764348, -692564, -1090385, -166967, 731755, -1999844, -1713692, - 643708, 937377, -507880, 1209033, 1583232, -563714, - }, - { - 14132053, -71225056, -42908872, 78504488, 32649268, 9781788, -7323993, 4472135, -2007897, 17058000, - 7848516, -6811818, -4708358, -3936875, -7399155, -20024212, 13773423, -5065377, 157303, 11645267, - -7619272, -12361990, 682363, -15994995, 932008, -2284923, 2811056, -2223719, -2341294, 1016834, - -6393596, -5953362, 4725001, 1029718, 865973, -5821828, 1181116, -170725, 3683471, 1254667, - -1626182, -8784282, 2421288, 710817, 5204964, 3033321, 1623498, 7471096, -11628624, 236223, - -1383516, 1174137, 2884608, -3655017, -1611150, 1059783, -3834332, -748398, -1982664, 4955319, - -79457, -1740536, 4743255, 3931506, 1095217, 1446330, 1131724, 1977296, -3050501, -1837172, - 1622961, -429497, -3196530, 2503966, 1202591, -1232119, -3498788, -2560338, -2752537, 2486249, - -1452236, 332323, -1850594, 1605244, -101469, 280784, 214212, 1520955, -1155346, 1960653, - 131533, -2224256, 257161, 472983, 2287070, -1478543, - }, - { - -922344, 72021232, -4733054, 7123740, -667867, -22170622, 1170916, 17093432, 8396124, 71941, - 2243584, -5024038, -3020436, 16132434, -16524887, -10103374, -10636487, -1744294, 20018842, 523986, - -619549, -2701535, 854162, -2974802, 5114233, -7841537, 2908230, -10545218, 8689256, -3168075, - 13419625, 1510218, 4942971, -1698660, -4633196, 9732396, 10821707, 6271726, -4631049, 1409286, - 4634807, -4458176, -2212982, -9414568, -10961293, 3586298, -2927020, -5034239, 2592550, -4084514, - -1033477, 3630858, -6227166, 1020055, 12026445, 4653597, -3083250, 230318, -2743947, -2879239, - -4468914, -2426120, 3093450, -2804077, -6646999, -1387274, 3513820, 1439888, -260382, 3539053, - -4388920, -789200, -1253057, 1484985, 1945083, -3755412, -425739, 265751, -1174674, -495532, - -2145336, -2413772, 719944, -127775, -2099702, -2163590, -833761, 1794760, 1982127, 707059, - 988379, -1852205, -277562, -1323387, -797790, -1818382, - }, - { - 6829535, -4631586, -2022393, 22952842, -6286759, -10412611, 47649976, -19138912, -8761196, -18123688, - 15247134, 826244, -1563905, 11100343, 3874597, 135291, 14912663, 17854180, 24543054, 7419019, - 13469017, -5099737, -5581310, -1948305, -6321655, -565325, 4143033, 4322885, 11477763, -7404524, - -5694053, 8495982, 2360622, -1997160, -1754494, 2569464, -8004746, 3281355, 4850629, -6138045, - 6324876, 6009196, 3154117, 15094126, -378494, -1792075, -7276212, -5564130, 1826972, 3514894, - -4450123, -905164, -1493575, 8164733, 3221762, -1743220, 1485522, 2906619, -317828, -6451578, - -2924336, -463856, 7247758, -1966021, 1187559, 2372970, -48318, -974958, 2687576, -2034204, - -942208, 3061775, -1816771, -1198296, -1122060, -3861176, -180926, 2161979, -1772211, 1873143, - -99321, -527744, 1377074, -2560874, 3274376, -1801739, -471910, -1874216, 306016, 1126892, - -1371705, 1906966, -553514, 1481227, -1591822, 392990, - }, - { - -19864, 59989956, 7067369, 155693, -5249524, -7074885, -18354006, 6287832, -14496, 1925219, - 8179229, 15331423, -9498320, -4452808, 7060926, -14884746, -26843546, -3818226, 532576, -2065879, - -17450988, -10554882, -5025649, 20571282, 7714835, 4760435, 1087701, -10098005, 14557792, 9210557, - 15593953, -539018, -1185411, -13053479, -2245731, 3538516, -4478041, -19733228, 779000, 512712, - -3025268, -9882720, -646393, 3098819, -3958349, 8253317, -3776887, -920197, -1884417, -4560719, - 2134599, -1459752, 795106, -1773285, 3620658, 3841312, -1576790, 3290482, 763967, 2466385, - -6521908, 2421288, 278636, -9127, -323733, -5100274, -1840930, 1614371, 1056562, -1306744, - 1016297, 2105071, 4930623, -1725503, 64425, 40802, 3030100, 2332704, -82678, 2814277, - 1541356, -2250026, 199179, 2167348, 202937, 1327682, 1544578, 1396938, 1928977, -1321776, - 1043677, 430570, 1220845, -941135, -34360, -1855426, - }, - { - 7998303, -126444912, -2124935, 27062588, 22119618, 4729833, 36673652, -12920335, -5803575, -15448460, - -32138704, 11742977, -2935610, -3482682, -2052994, -9889162, 7932268, -8997956, -683437, -4476430, - 11574937, 7524246, 11304354, -12541305, -9454834, -1960653, 5217312, 14353244, -8145943, -9180493, - -12410845, 5837935, -7912404, 3833795, 3586298, -4996658, 13214541, -1912871, 4458176, -2796024, - -4699231, -1364726, 1930051, 4263829, 3100430, 1147293, -3722663, 7454453, -6751689, -5834176, - -1240709, -4653597, 7908109, -530428, 742493, 2005750, -2276870, 5861557, 2037962, -2426657, - -530965, -1993939, 1356673, -1047435, -2247342, 2843268, -315680, 3307662, -949188, 751082, - 1228361, -3251290, -68183, -739271, -2930778, -290984, -5513128, 2525441, -1957431, 1065689, - 144418, -4342749, -2490007, -3899294, -28991, 1785096, 2331630, -453119, 2855080, -134755, - -11811, 2276333, 243203, 1846299, -275952, -1449015, - }, - { - -239444, 64660732, -7542500, -1413044, -7427072, -19581830, -26217554, 7961259, -18523120, -2325725, - 2055142, -7137699, 7783018, -2286533, 7580081, 24739012, 2565169, -9474161, -10690174, -10882373, - -18433462, 9125732, -10428181, 25200720, -187905, -3858491, -1597728, -11820287, 6437619, 13970455, - -5391258, -6322729, 4958540, -14073534, -4568235, 5798743, -7526394, 3952981, -4640712, -6068789, - -2576981, 2402497, 3516505, 7998840, 10105521, 5260261, -3411278, 2045478, -588947, -2138894, - 5474473, 1498407, 583579, 2688113, -605054, -4816806, -3187403, -2224256, -3986267, -3394098, - 3203509, -5547487, 4103841, 3103651, 518080, -3459059, -3769908, 3206730, -2099165, 4172024, - 5148055, -1465121, 377957, 3844533, -1430224, -549219, 1177358, 1534377, 1539746, 173409, - -2138357, 3531537, 155156, -1935420, 518080, 2016487, -1881196, -1559073, 1373853, -1909113, - -1079111, -1047435, -49929, 1214939, 209380, -783295, - }, - { - 8339216, -116711440, -15710990, 21214990, -2940442, -6344204, 35182760, 785979, -8130910, -12636868, - -15180562, -3327526, -17394618, 7359964, -13263396, 16000364, -2921652, -29623464, -14282914, 14407468, - 6478422, -605590, -3767223, -9404368, -16044387, 252329, 15077483, 7737921, -7301445, -10338523, - -1089848, 12239046, 12205760, -5396090, -1835025, 1465121, 8293582, -887985, 237834, 879931, - -680752, -5015985, 452045, -12487617, -6416681, 6979859, -2079838, -6749004, -3044058, -3362960, - 3955665, 1533840, -2987150, 3329674, -126702, -3555696, -6625524, -4499515, 4407710, 7291781, - -4605279, 5317170, 2995740, -878858, -601295, -7810398, -1227824, 956704, -4676146, -1893007, - -2907693, 528281, 579821, -4063039, 513785, -333934, 41339, -1392106, 781147, -4263292, - -2277407, -24159, -1592359, -1631014, -1539746, 2783139, 1904281, -491774, 1287417, -1622424, - 484794, 887448, -190052, -1510755, 212064, -1074816, - }, - }, - { - { - -1918240, -43880072, -18045842, -25942676, 25643640, -6176700, -2615635, -3579855, 4920959, 4709969, - 9423695, -12212740, 6226092, -4181151, -24048058, -1581622, -22200686, -8328479, 4632122, -2757906, - -1834488, -2239826, 6148246, -2541547, 4937065, -1029182, -993748, 667331, 290984, 6148246, - 8431558, -9540733, -1769527, 9940702, -251256, -501974, -2218351, 35970, -484258, -8828305, - 342524, 3484829, -322123, 2375654, 524523, 2191507, 2244121, -12552579, 3438121, 1379221, - -4555350, -6427956, 911607, -5410048, -1988570, 5608154, -869731, -858993, -730144, -3974455, - -640487, -1587527, -261993, 2106682, -3610994, -850404, 3235721, 3298535, 4095251, -1050656, - 1009317, 2163590, 1574106, -186831, 54761, -730681, 1691680, -567473, 119185, -2391760, - -387084, 1140314, 989990, 2535641, 2264522, 260919, 1197759, 1144072, -62277, 515396, - 548682, 286152, 1953136, 902480, -362388, 68183, - }, - { - 711354, 138954544, -12490302, -35967668, -26876832, 849867, 3845070, 5906117, 9491341, 7217693, - -205622, 2899103, -3848291, 1131187, 16150151, -11436961, -7938710, 5352066, -5513665, -4710506, - -4370129, 4804458, 7346005, 853088, 3373697, -3283503, 803159, -968515, -4248797, 3658775, - -2619393, -736050, 3296388, -118648, -5040681, -951872, -1628866, 4953171, -642635, 1323387, - 3359201, -1728188, -83752, 2853469, -2473901, -3881040, -4246649, -4216048, 2120640, -2165201, - 1136556, -419296, 251792, -722628, -219580, -36507, -3664681, -2322504, 108448, -2260764, - -2595771, 3980361, 236223, 5332202, 528818, -3245922, -2338073, -685584, -2248416, 4540318, - 166967, 1236951, -4146254, -753767, -62277, -2147484, -3181497, -1876364, -424665, -820876, - 3813931, -1786706, 18254, -3591667, 3037079, 1453846, 61740, 1065152, 150324, 235686, - -2216203, 925565, 226023, 1032403, -573915, -206695, - }, - { - 958315, 58310624, -43556872, -59716688, 6352794, 991601, 401579, -824634, 5898601, -322123, - 1767916, -1779727, -5461588, -5406290, 1220845, -3659849, -760209, 1921998, -285615, -3635690, - 3139084, -12343736, -920197, -6639483, 9166534, 6650220, -2014340, -7974144, -7427072, 8618389, - -3652870, -2698313, 2396592, 862215, -1519345, -7485591, -2357937, 3886409, 3342558, -1867774, - 3817689, 5250061, -1760937, -938450, -2435783, 1737851, 6539088, 690953, -108985, 5785858, - 3550327, 2716030, 2736431, 7515119, 3931506, 206695, -2326799, -1018981, 4481262, -5245766, - -429497, 413391, 883690, -110595, 2074469, -516470, 433255, 2973191, -1681480, 2330020, - 842887, 747861, 415001, 91805, -296353, 1692217, -630823, 2261300, 4753455, -1123671, - -216896, 636192, -1385664, -693637, -1657857, 874026, 41339, 856309, 428423, 811749, - 1314260, 1341104, -69256, 126165, -714575, 1307281, - }, - { - -708670, 14049375, -3346853, -7175280, 4207994, -2696703, -2211371, -706522, -8320963, -3506304, - -3863323, 6509560, 4721243, -4027069, -2675228, -561030, -4581657, 16904454, -17861696, -2068564, - 2880313, -12125766, 516470, -6117644, -4759361, -3603478, 6247030, 3732864, -4847945, -9203041, - 552440, 5270999, -4342749, 4371740, -4609574, 1579474, -2452426, 2752537, -6216429, 6409702, - 5796595, -6928856, 3122441, 1872069, -183610, 501974, -6387690, 2416993, -168041, 6922951, - 5876589, -7285875, 4205310, 4189204, -6081137, 98247, -2152852, -542240, -4789963, 3124589, - 2260764, 955093, 863288, -240518, 707596, -3008625, 2360085, -2887829, -1354525, -361851, - 354872, -281320, 1551020, 422517, 1305670, -3351148, -599148, 422517, 2333241, -606664, - -897648, 96100, 1457605, 76236, -1459215, -657667, 214212, -947577, -747324, -585189, - -96637, -1611687, -68719, -1241782, -522912, -494458, - }, - { - -14264123, 1555315, 25510496, 8566312, -8382703, 8748848, -3743064, 15483357, -3855807, 15152645, - -3266860, -12496207, 2539936, -9794136, -2559264, -12444668, 14336601, 1790465, 8952322, -1737851, - -4117800, 5468567, 6672769, 2187749, 3506304, -2725157, 6859063, -1396401, -5215164, -6301254, - -2535105, 3834869, -810675, 3237332, -8638790, -1694365, -6200859, -366146, -2491081, 5547487, - -3282429, -4089346, -1640141, 4275103, 6211597, -1684701, -4014721, -3693672, 7266548, -842350, - 4847408, 3812320, -2487323, -3923990, -3823595, 4646081, 1537061, -1673964, -2886755, -1298154, - -651761, -590021, -287226, -420907, -89121, -3605088, 1104344, -2305861, -977105, 1103807, - 2675228, 1377074, 4906464, -3116536, 777389, -1534377, 341450, 2358474, -484794, -1829119, - -2523830, 1087164, -857920, 1139777, -537, -93416, 1428077, -1374390, 1951526, -471373, - 576599, 389768, 403190, 1115618, 286152, 99858, - }, - { - 573915, -46036680, 40758164, -2710124, 7351911, -1191853, -2334315, 4228932, -2225330, 2248416, - 2725694, 1598265, -3174518, 7179575, -10473278, -8401493, 6350646, -4610648, -4240744, -7239168, - -21087216, -13972602, 2401961, -23034446, 17027398, -290984, -9906879, -1375463, 6651831, 14020384, - 3251827, -5890011, -692564, 1106491, -7711077, 5828808, -2405182, -1086090, 12524662, 1549410, - 54761, -4480725, 7307887, -971200, 1377074, 5964099, -1362042, 338766, -1583232, 8360154, - -3288334, 3825742, -5506685, -1383516, -2887292, -1938104, -1662689, 313533, -3212099, 6918119, - 2900177, -2514703, -1762547, 401579, -4198868, 3474629, 818191, 5693516, 414464, -3678103, - -251256, -1981591, -132607, 4012036, -838056, 654983, -1174137, -3046743, -1733019, -1158567, - 3097208, -2190970, -1327682, 1919314, -3760781, 469225, 196495, 1524713, -45634, -1143535, - -286689, -2262374, 1045288, -1818919, 1060857, 825171, - }, - { - -16001438, -14432701, 29985852, 35421668, -10590852, 4774930, 614717, 5539434, 17623324, -4271882, - -12428025, 3508452, -175557, -5707475, 13246753, -2922188, -8778913, -2936147, 199716, -1369021, - -8099235, -5225902, 1104880, 3590056, -2885144, 11010149, 5792837, 2245731, 2384244, 5508296, - -561030, -3017215, -7714835, -1127966, -174483, -8036958, 2368138, -2513093, 7001871, -439697, - 425202, -26844, 2628520, -1974074, 4837744, 1078574, -3672197, 1376537, -2849174, 2735894, - -5749888, 812286, 313533, -4017405, 37581, -911607, -4829154, 4714264, 6925635, -629750, - -3135326, -4592394, 5048197, 4504347, -1123134, -1372779, -408559, 1095754, 200790, -348429, - 1505386, 680215, 222801, 3652333, 1758789, -2641942, 54224, 507880, -18254, 517007, - 2952253, -770947, 180926, -116501, -115427, -68719, 158377, 2052458, 32749, 1033477, - -146566, 48855, 1204202, -1704565, 1513976, -918586, - }, - { - 2020245, -34964792, 58193048, -4935991, 5336497, -4766877, -3154117, 394063, -2794413, 1532767, - 563714, 13346074, -4528506, 17318382, 6089727, -387621, -4979478, 16233366, -7428683, -16183974, - -4175782, -3163244, -8408472, 9404368, -1770063, -8878771, 10997801, -4734128, 20869782, -16682190, - 13026636, 2211908, -4526896, 6142877, 2605435, -10471130, 11293617, -6200859, 234076, 4567698, - 5151277, -1784022, 4731980, 2051921, 3272228, 3956202, 4241280, 8534100, -9792525, -3812857, - 411243, -7007239, 138513, 669478, 127238, 4386772, 4151623, -2822867, 294742, -4822175, - 1392106, -3976066, -654983, -2285996, 4296041, -5722507, 1551020, 1860795, 1903744, 586800, - -503585, 4830765, -4125853, -1621350, 1762010, 1784559, -2094870, -1288490, -490700, -2520072, - -2369748, 591095, 257698, -1592896, 798327, -1017370, -1862942, -471910, 19864, 714038, - 945430, 21475, -2325188, 801011, 1416802, -578747, - }, - { - -15714212, -20855824, 19266686, 40329744, -15804406, -3865471, -6774774, 10850161, -39192, 6509023, - -4828080, -2595771, 3053722, -4053376, 6351720, -3800509, 21959630, -7469485, -9573482, 11648488, - 674847, -4153770, 1890323, -12010339, 8990440, -1626182, 4231617, 252866, -985695, 3834869, - 3118683, 3539053, 6397354, -4582193, -2813741, -2764348, 6850473, -1462436, 1073205, 5548561, - 7444252, -5841693, 1469416, -1392106, 1367410, -194884, 3052648, 10077604, -9124658, 2652142, - -3158412, 780610, 1541356, -2433636, -164819, -1413044, -3827353, -1233729, -5347235, -1485522, - -4420595, -5073430, 609349, 510027, -1150514, 590558, -920197, 650688, -2410551, -1411971, - 2343979, 1217086, -455803, 3083787, 1645509, 331786, -1492501, -622233, -1723893, 1865090, - -1402844, 2458869, -1422171, -1045288, -3090229, 722091, -9664, 210453, -2374580, 1510218, - 923955, -2547453, 661425, -248034, 402116, -1320703, - }, - { - -72478, 59748900, -25232396, -11822434, -1745904, -2550137, 16608639, 3008625, -3508988, -169651, - 437013, -12706124, -7094212, 16385300, -5209796, 19147502, 14152454, -12771085, -1224066, -8170102, - 737661, -5996311, 3256659, 1000727, 10071698, -5398237, 4205847, 2554969, 11495480, -16229071, - 532576, -7283191, 7310035, -638876, -12994424, 8292508, 3264175, -6455873, -4168803, 1745904, - 4323959, -3198677, 8834211, -522912, -8458938, 7801271, 2169495, -791348, 3810173, 1518808, - 2944200, -2281702, -4433480, 424665, 4864588, -461709, -3499862, 3202435, -2450816, 2097555, - -2553358, -3379066, 268972, -629750, -2706366, -1158031, -258235, 1141388, -3097208, 440234, - -3320010, 2486249, 980863, 865973, 2059974, -497679, 1773822, 289373, -2306398, -695248, - -1246614, -2551211, 1185948, 1826972, 942745, 2573759, 2685965, 4145180, 2022393, 777926, - 1300301, -324807, 1514513, -301185, 179852, -192200, - }, - { - -7235946, 53833656, 38021736, 9775882, -7416335, -13034152, 42877732, -10982768, -4117263, -32023276, - 1089311, 1686848, 3809099, 9793062, 9286793, 1873680, -2406792, -5910949, 10792716, -7117835, - -1826972, -8815420, -374199, 11274, 6590628, -4632659, -10557566, 1667521, 7547868, -6244346, - 2419677, 3889093, 1747515, 704375, 4015795, 9046275, -4598836, 9475772, 10170483, 271657, - 5998459, 2325725, -8594766, 2819646, -471373, 7842611, 2182380, -1285806, 762894, 725313, - -6620155, -5752035, -6624450, 5197448, -261993, -6027987, -3206193, -1739999, -6792491, -5401458, - 1289027, -1717450, 1777043, -7980049, -521839, -2167348, -1463510, 1884417, 1929514, -1618666, - -3988414, -641024, -2070711, -202937, 1676648, -1116155, 1496796, 1557999, -2648921, 3463891, - -2090575, -4891431, 541166, -2055142, 2345052, -913754, 2758980, 1583232, 279173, -493384, - -407485, 2506114, -2691334, 427349, -1295470, 1618129, - }, - { - -534187, 18891950, -26160108, -572304, 2762201, 8715562, -5819681, 2410551, -270583, -2982855, - -13526463, 3798899, -5781563, -1806571, 19184546, 6346351, -13139379, 7958575, -3198677, -198642, - -6257768, 6356552, -5114233, 2299955, -8117488, 219580, 293132, -10699300, 13353053, 7097971, - 11410117, -3917547, 3118683, -6853157, -249645, 6563784, -4714264, -17099876, 7763154, 3939559, - 5092221, -1147293, -816581, 5227512, -5960878, 3847217, -4114579, -423054, -1355062, -5994701, - 7277822, 4198868, 1994476, -3980361, 1551020, 6001143, -3903589, -2451353, -4155918, 3678103, - -3710852, -2106145, -2137283, 810675, 1716913, -3470871, -5258651, -619012, -1607392, -6666326, - 360777, 1749125, 1955284, -4181151, -617402, 857383, 881542, 550830, 277025, 322123, - -1258962, 168577, 1207423, 338229, -1998770, -268435, -85899, -1118839, 1017907, -1108638, - 684510, 54224, 732292, -1982664, -1277216, 638340, - }, - { - -5968931, -136162272, -8779450, 7566122, 11451993, -14922864, 31347892, -3075734, 3410204, -2914135, - -10872710, 18344342, -3726421, 2207613, -15848429, -24343874, 5982353, -3504693, 8744017, 9014063, - 16371342, 2150168, 12680354, -5180805, -2467996, -2734284, -4672925, 9096204, -2988760, 7206955, - -6254546, 8375186, -2269353, 838592, 5904507, -3074123, 7205345, -7186554, -39192, -2544768, - -5470178, -6466610, 616328, 6609418, 1893544, -1443646, -2295660, 5377299, 1540820, 1981054, - 6225018, -609349, 5375152, -6509560, -2346663, -1966021, -4508642, -1109712, -5222680, -3798899, - 5705864, 4316979, 4804995, -1404454, -3197066, 721555, -2802466, 1651415, -3616899, -754841, - 2726231, -2842732, -1238561, -244276, -3506304, 1538672, -4642323, -60130, -3529390, 154082, - 1287953, -1505386, 1440962, 145492, 742493, -1521492, 1015760, 473520, 3612068, 560493, - -215285, 1437203, -778463, 112743, -579284, 113280, - }, - { - -227633, 71292160, -9406515, -8950175, 433792, 6003291, -13150653, 259309, -5757941, 4684736, - -2052458, -5763309, 172336, 14958297, 41667624, 11363410, -22239878, -3892851, 7620346, -348966, - -13530221, 20627118, -19959786, 17281338, -2240899, -13649406, -3627637, 2344515, 4313758, -1882806, - -11150809, -7580081, 2922188, -11441793, 2963528, 7716446, -7953743, 1582696, -413391, 127775, - 1503239, 4466766, 3829500, 8039105, 2189897, -1953136, -6391448, -1505386, 2397129, 2591476, - 3307662, -3473018, 3604551, 1345399, -4460324, 747861, 1559073, -359167, -1255741, 148713, - 6002754, -6779069, -410706, 1660005, 1781875, 2384781, -881005, 2088428, -1750736, 1345935, - 2793339, -2034204, 430034, 2097555, -2837900, 163746, 1365263, 365072, -2141578, -626528, - 340376, 3049427, -2711198, -2964064, 253940, 2241973, -1642825, -1697049, 2644089, -1793686, - -853088, 744103, -1010391, -531502, 115427, -973347, - }, - { - -6466074, -111536008, -10341208, 10894721, -13147432, -16146930, 34506840, 3171297, -3536369, -3668976, - -10514617, 2346663, -13188771, 4302484, -17532056, 4998268, 6920803, -4879083, -2439005, 8571144, - -4878546, -7877507, 5619965, -11811, -4667019, 5556614, 3380676, -1126892, -3980361, -11153493, - -959388, 3149822, 6935836, 1141388, 7637526, -3215857, -2500208, -3310883, 10669773, 8142721, - 2593624, -3124589, 1463510, -10227928, -7708393, -644782, -6090801, -6998649, -2511482, -2243584, - 6105833, 2538863, -6058052, -1321776, -278099, -2136209, -3015067, -188979, 7805566, 5267241, - -4897874, 4419522, 2556579, 2696166, 3418794, -2094333, 3702262, 5464272, -2752537, -1278290, - -2844879, 839666, -973884, 232465, 3502009, -814433, -346282, -260919, 2142652, -3581466, - -1743757, 1410897, -311922, 71941, -1044751, 1644973, 1763084, 416612, 639950, -1511292, - 985158, 804233, 1464584, -386010, -236223, 28454, - }, - }, - { - { - -250182, -67501320, -3795677, 12597139, -12487617, -4380330, -6108517, 187905, 8588861, 4679367, - -136365, 4977867, -5176510, -6286222, -14210436, -6744710, -19058380, -11252814, -9173513, 1122597, - 9018894, -9630927, -644245, -4821638, 15969762, 222801, -3336116, -2173790, -433792, 17851494, - 2760590, -3085934, -5096516, 7583302, -4633733, 1342177, 2357937, 607738, -2771328, -526670, - -2131378, -3108483, 4831838, 2831994, 670552, -118648, 1806034, -4778688, -3406446, 522375, - -4274566, -5395553, 2441689, -4719096, -442382, 981400, 874563, -3429532, 1498944, -2670933, - -1877975, -1821066, 2790655, -719407, -3440806, 2412161, -479963, 4206921, 4240207, 1448478, - -1088774, -175020, 2872796, 357019, 669478, -1632088, 3056406, -491237, 1072131, -2440615, - -267362, 2808909, 411780, 2418067, 1210644, 454193, 2609193, -846109, 498216, 134755, - 1125818, -453656, 2826625, -206158, 76236, 241592, - }, - { - -2980171, 135668352, 5640903, -82402704, 18248242, -24159, 5470715, -357556, 7912941, 5806796, - 11026255, -11322071, 758599, 5941551, 3129958, -5308580, -3478387, -8595303, 1300838, -9011378, - 2548526, -667867, 12090333, 9814000, -9022653, 2403571, -4227322, 2147, 8054138, -1234266, - -5425618, -6599218, 8784282, -4458176, -2585034, -2055679, 1721208, -2209224, 6007049, -763967, - 1438814, 1802276, -3806952, 2770254, -1949915, -515933, -8890582, -1106491, 1723893, -996969, - -1028108, 2756295, -689879, -3155190, 259846, -3157875, -1554778, -2655901, 3922916, -3958886, - -1384053, 2757369, 426812, 973884, 1054415, -744103, -3923990, -145492, 835908, 3031173, - 462246, 858993, -1845225, -1765768, -802085, -2831457, -2164127, -2390149, -932008, 371515, - 4344897, -2758980, 881005, -2605972, 1596117, -704912, 2377265, 306016, 1651952, -878321, - -2316061, 711891, 665720, 161061, 941672, -391379, - }, - { - 340376, -7754027, -1139240, -42134704, -19724638, 608275, 8788577, -3143379, 4630512, -9401147, - 11850352, -12202002, 5746666, -2141041, -8706436, -1352378, 610959, 4338991, -3770981, -5679558, - -919660, -6963216, -169114, -11243688, 11367168, 1764158, 4532801, -8616778, -4132296, 6102075, - 1728188, -5637145, 503585, -663572, -4085051, -5248450, -6360847, 9880035, 352724, -659814, - 6182069, -2187749, 3528316, 1768453, -4147865, 1506997, 2783139, 3053722, 5886790, -2722473, - 7128572, 3125663, 5999533, 2451353, 9482214, -1388348, -1604707, -4679904, 1620276, -174483, - -738734, -1363115, -791348, 1934883, 1889249, -2405182, 3898757, 1391033, -629213, 2834679, - -1611687, 2228014, -993748, 262530, 2216740, -1174137, -638340, 1960116, 1703491, -730144, - -468688, 784905, 1097364, -2587181, -2361158, 1758252, 848793, -49929, 463320, -178778, - 2576444, 419296, 156229, 97174, -220654, 312459, - }, - { - 777926, -35521528, 30748744, 5361193, -3146601, -3801046, -1184874, 1142461, -7658464, -11431592, - -3280818, 15389942, -65498, 1228898, 3363496, -6041409, -10226317, 17902498, -17317308, -2809982, - -514859, -7230578, -10543608, -730681, -2941516, -10973105, 12270722, 4897337, -3151969, -4540854, - -7932805, 507343, 4355634, -488016, 2172717, 7281580, -9371082, 1681480, -1088237, 195958, - 6584185, -3241627, 1491964, 245887, 2353105, -4332549, 642635, -2120640, 1976759, 7815767, - 5971615, -6382322, -845572, 3922379, -3282429, -4364224, -920734, -455803, -2212445, 2092186, - 3860102, 456340, -3093450, 759136, 433792, -3518115, 1754494, -733903, 1578401, -4684736, - 1415192, -756451, 1365800, 1561758, -1128503, -2891050, 1609002, 1117765, -555661, 284005, - -247497, -1331440, 161061, 2072859, -2231236, -1403381, 255014, -166430, -1034013, -268972, - -862752, 97711, 457951, -3360812, 904091, -1973538, - }, - { - 16713328, 43716324, -43960600, -5837398, 3705483, 6150393, 7680476, -2825015, 7969312, 4545149, - 7790534, -5020817, -5465883, -9856950, -9617506, 3650185, 9417253, -10551124, 18799072, 8731132, - 1451699, 163209, -1888175, 2631204, 3040837, 3577171, -3171833, -711354, -7248831, -4910222, - 4874251, -219580, 1156957, -172336, -6496675, -4122095, -2553358, -1241246, -758599, 1777043, - -1249299, -2242510, 2979634, -872952, 3249143, -363462, -1714766, -805306, 2932926, -2905009, - 10266046, 2323577, -6347425, -1469953, -2916283, 3717831, -733366, -1051193, -2579665, 1387811, - -1498944, -230318, 3053185, -4740034, -1029718, -166430, -1610613, -1959579, -668404, -563178, - 3590593, 2239826, 1699733, 446140, -2784213, -880468, 3586298, 549219, -1663226, -1618129, - -1802813, -1615445, 3540664, -1094680, 718870, 1058710, -649614, 213138, -41339, 521302, - -222801, -80531, 1282585, 373125, 1682554, -268972, - }, - { - -2490544, 10312753, -18825916, 4035659, 10657424, -2956548, -484258, -741956, -961536, 7450695, - -4341138, 5794448, -3263102, -2289755, -6315213, 4692789, -5277441, 441845, -5741835, -11854647, - -19110994, -11012833, -7374996, -10098542, 6401112, 7869991, -2860448, -4984310, -2940979, 25063282, - -4850629, 3599183, -773094, -4230543, -4511327, 3957276, -4158602, 4982699, 5348308, 2335925, - -4801774, -1636919, 3765613, -645319, 5684926, 3220689, -2227478, 1365800, -1858647, 5037460, - -1480153, -1274532, -220117, -1644436, -2649995, -1820529, -2065879, -5369, -1738925, 4683125, - 5100274, -583042, -2325725, -999117, -3020973, 3207804, 1453846, 2475512, 500364, -1481764, - -81068, -1200980, 788127, 1083942, 1230508, -390842, -1606855, -3683471, -712965, -810675, - 4141959, -3235721, -1035624, 913754, -1368484, -3015067, 2593087, 689342, 676457, -1671816, - -2094870, 215285, 486942, -1291711, -388695, 1973538, - }, - { - 18121540, 10298258, -17045652, 1853278, 17655000, 1649268, 3148211, 4039417, 12921409, 2167348, - -1195612, -18729278, 486942, 8363375, 8105140, -6133214, -5587753, 3635153, -7553237, -2590402, - -6756521, 3639448, -1510218, -4966056, 10104984, 5945309, 12142946, -6029597, 10456098, 1049046, - 7326141, -9657234, -5350456, -3202972, -4269735, -169114, -2092723, 781684, 4714801, -2388539, - 1369558, -373125, 17717, 4915053, 2491618, 2976412, -2056216, -4193499, -208306, 1401770, - 3408594, -5356898, -2643552, 78383, -1970316, 4546760, -3865471, 3491809, 3045669, 1436667, - -6301254, -1406602, 2390149, 3230352, 3423089, -1650878, -1248762, 1837709, -1531693, 2822331, - -1761474, 1924682, 2536715, 241055, 825171, -1216013, 366146, -185757, 1279363, 868120, - 716186, 442919, 689879, -2294050, 237834, 2507724, -1602023, 1685775, 2335925, 22549, - -1360431, -220654, 722628, 208843, -147103, -274341, - }, - { - -3009698, 46557984, -26159036, 887985, 7141994, -146566, -4876399, 631897, -4224637, -1167694, - -2958696, 10485626, 12875775, 3911105, 405874, 19530826, -14317810, 5446556, -17818208, -8495445, - -1021665, -5616744, -3383897, 11939472, -10891500, 4282620, 3080029, -6415608, 9454834, 1640141, - -2720325, 5601711, 1979443, 2157147, 1106491, -1258425, -675384, -2847563, -4465156, 5250598, - 3812320, 503585, 3454228, 2974802, 3358128, 1141388, 8628052, 1588064, -4325032, -862215, - -4341675, -4973036, 2613488, -5567352, 802622, 4115653, 4085588, -527207, -1003949, -1520955, - -4792110, -340913, -2816425, 1452236, -659814, -2471217, 730681, 3813931, 815507, 442382, - -1606318, 440771, -1510755, -1834488, 562641, 3941169, -2022393, -83215, -2632815, -2756832, - -2945274, 309775, -62277, 329102, -989453, 771484, -1606318, -2484102, 875100, 941672, - 296890, 290984, -1805497, 988379, 839666, -659814, - }, - { - 17979806, -3631932, -20299090, 6653978, 11613592, -6372121, -1911797, 1895154, 4730370, -413927, - 5292474, -8537321, -6589554, 15923054, -4285841, 18507550, -5872294, -328565, -10061498, 5032091, - 6767258, -11245835, 7266548, -6296959, -1677185, 8401493, -6371584, 5572183, -2028298, 1795296, - 905701, 3449396, 3736085, -4077535, 568009, -1304060, 7677791, -6205691, 8738648, -1284732, - 5469641, -3115462, 443992, 548682, 2136746, 973347, -974421, 5143760, -2355790, 413391, - -438624, 708133, -1381906, -2947421, 1821603, -2169495, -379568, -1794760, -3132642, -7410429, - -245887, -1651415, -5090073, 278636, -2884608, 4044249, 572841, -1301912, 52076, -1169305, - -404801, 360777, 2160906, 516470, 3413425, -2488397, 1836635, -1229971, 476205, -863825, - -138513, 1052804, 81604, -1758789, -2052458, 1256815, -277025, -259846, -98784, -71404, - 122943, -1256278, -433792, 1295470, -1639067, 430034, - }, - { - 460098, -3091840, 30697206, -12254079, -3761855, -6173479, 23046258, -5920076, 3512747, -6580427, - -2588255, -15245523, 1331977, 8439074, 5552856, 5138929, 21680458, -11566884, 5148592, -11972221, - -5942088, -3571265, 702764, 10632192, 9057549, -2195802, -1488743, 4050691, 9549323, -6857452, - -11503533, 1511829, 3645890, 5990406, -11664594, -1582696, 3915400, -9175124, 71941, -3081102, - 2485176, -2078227, 7960722, -170725, 4896800, -5731634, 5917391, -5598490, 6029597, 772020, - 4642323, -2771328, -4449049, -2789581, -1210107, 6364605, -2854006, 1969779, -3296924, 3672734, - -3158949, 1249299, -4628901, 994822, -2987150, 1025960, -2460480, 207769, 833761, -3684008, - -1256815, 1854889, -2109903, 1482838, 2280091, 1109712, -74088, -1035624, -328028, -1925219, - -395674, -406948, -2085744, 3627100, 1948841, 3011846, 685584, 4259534, 2109903, 1238024, - -97711, -453119, 2012729, 1019518, -197032, -148176, - }, - { - 8458938, 108714216, -24852828, -3724274, -2849711, 9477919, 325344, -6059662, 8457864, -21102784, - -13609678, 339302, 1299228, 5728413, 12466679, 7197292, -5170067, -13261785, 6242735, -3236795, - 565862, -5747740, -2047089, 2317672, 2462627, -1914482, -11682311, 3076270, 6714645, -6299644, - 1753420, -4204773, 7793755, 823023, 9095130, -6190659, 7446400, 4270808, 9069897, 3822521, - -558883, 2084670, -7159174, 1990181, 2462090, 5219996, 4687420, -2983392, 164283, -1735167, - -7438884, -2677912, -4676146, -2162516, 512175, -4268124, -2482491, -2567854, -9096741, -1495186, - -2302639, 3147674, -1445793, -3595961, -1636383, -5522254, -1984275, 4305705, 934155, -1415192, - -3249143, -51540, 952409, -617402, -1816234, 819265, 347892, 2057289, -2496987, 3598109, - -1145146, -3038689, -3904662, 2024003, -1848983, 1912871, 459025, 2363306, -297963, 457414, - -275415, 1386201, -2872796, 1731409, -143881, -1081258, - }, - { - 246424, -31960462, 17033840, -9354976, 10309532, 721555, 2348810, 1913945, 184147, -3782793, - -14718316, -214748, -5469641, 5116917, 747324, 12255152, 2071248, 9517648, -11411728, -4734665, - -2418067, 9292699, -3851512, 9862319, -17207786, -2583960, 3548180, -3959960, 13377749, 3750580, - -236223, 4968741, -4665945, 5841693, 5629629, -2483565, -9204115, -1344325, 3197066, 3948686, - 10135586, 1697586, -1554241, 4256313, 1053341, -5498632, -2903398, 3932043, -1483374, -94489, - 6735046, 1512365, 2197950, -6497212, 3005403, 224412, 949188, -6483253, -3636227, 2513093, - 856309, -5667210, 1712081, -517544, 1902134, 888521, -8264591, -1282585, -2639258, -4595615, - 652835, 732829, 2885681, -5872294, -1784022, 4110821, -914828, -838056, 3081102, -2127620, - -1904281, 2594160, 722091, -1715303, -2095407, 180926, 591632, -749472, -51003, -39728, - 104153, 1166084, -496069, -210990, -2178622, 664646, - }, - { - 4432406, -135855184, 2277943, -15048492, -897111, 13881871, 6971269, 6162205, -9173513, 7721815, - -7606387, 7268696, -10772315, 1850594, -14296872, -18961744, 1851131, -1956358, 6943889, 10205916, - 14779519, 2304787, 3729642, 10519986, -9376450, 4320737, -9744744, -1430224, 8556649, 6666326, - -938450, 3666292, -5107790, 186294, 6299644, -1691680, 2919504, -2718178, -5576478, -4106526, - 1996086, -10615012, 1679869, 6196564, 6499360, -8964670, 392453, -949725, 10556493, -641561, - 7286412, 4197794, -752693, -4347044, 703838, -7189776, 2042794, -8560944, -6306623, 722628, - 5477157, 2667175, 1740536, 2093797, -1078037, -2092186, 892816, 1580548, -3936875, -1600412, - 1060320, -249645, -504659, -743029, -4795331, 3206730, -365609, 1083942, -5063230, 221191, - -1721208, 370978, 558346, 3406983, -160524, -2721399, 66572, 336081, 1846836, 3675418, - -94489, 766652, 640487, -485331, -142808, -608812, - }, - { - 146566, 42217380, 12011413, -13450227, 690416, 3143379, -9316858, -4155918, 7237557, -3242700, - 1987496, -4970351, 7639673, -2916820, 62750008, -1945083, -22229140, -2099165, 14192719, 8065949, - -6609955, 3861176, -6560026, 8523899, -7942469, 1282048, -11996381, 1065689, 8035884, -11586748, - -5788542, -6195491, 587337, -5350456, 9777493, -3502546, -5420249, 1411434, 4495757, 664646, - -387621, 4089346, 5435281, 7310035, -3046206, -326954, -4006131, -3906273, 858457, 1340030, - 4664872, -3396782, 2426657, -289373, -4919885, 5513128, 356482, 99858, -899259, 4822175, - 4451197, -5713380, -5261872, 3145527, 1122597, 4143570, -943819, 345208, -787053, -1130650, - 3910031, 718870, -2605972, 1069984, -610959, -466541, -862215, 911070, -2153926, 473520, - 2863133, 215285, -2127083, -2080912, -1125818, 840203, 2076617, -1737314, 116501, -123480, - -2260227, 1782948, -670552, -1290101, 1706713, -4850629, - }, - { - 5861557, -100537128, -25125558, 6523519, -9728638, 233539, 7281044, 10153840, -10461467, 2530810, - -2419140, -10838887, -6321118, -16750372, 5013838, 3832185, 512175, 2282775, 5189931, -4552129, - 9568650, -15080704, 13542569, -2347737, 1695438, 4303557, 318364, -4356708, 1829656, -5141613, - -5275831, -7057168, 2738042, 5265630, 12328167, -5766531, -5499706, 3688840, 13159243, 5387500, - -876710, 1926293, -4949413, -5126044, -3664144, -8353175, -5284421, 1825361, -4452271, 2485712, - 2713346, 2298344, -5875516, -3206730, -221728, -3595961, 322123, 2455648, 3604015, 2006287, - -855772, 2925410, 2215130, 3442416, 1209033, 2707977, 4263829, 5122286, -4890357, -308701, - -2508261, 1472100, 1088774, 2365990, 1006633, -2788508, -39192, 1161252, -27917, -2272575, - -2202781, 3847754, -518617, -1896765, 595927, -543850, 2301029, 1191317, -463320, -375273, - 411780, -464930, 1861332, 1268089, 292058, 1044214, - }, - }, - { - { - 1491964, -18676128, 36704252, 29393146, -9873056, 1316408, -2943663, 3233574, 4790499, 2987687, - 535797, 5202279, 2661269, 1363652, -3665755, 2066416, -17051558, -18131204, -17817134, -2552284, - 7652021, -10399726, 7127498, -2728915, 700080, -5799817, 6488622, 3007551, 1219771, 10312753, - 1226213, 2455111, -2743947, 7193534, -6591164, -632434, 7645042, 2479807, -1442572, 7286412, - 941135, -412317, 480499, -719407, 5918465, -1931125, 3999152, 5275831, -3773666, -5027259, - -6244346, -2566243, 2449742, -371515, 2585034, -5432060, -2637110, -1279900, 3095598, 448824, - -1646583, -1731409, 5063767, -2140504, -1596117, 4497368, -1239098, 1580548, 564251, 798327, - -837519, -1828046, 2011655, 1591822, 1377611, -2226941, 1193464, -879395, 2870112, 32749, - 1111323, 4062502, -249108, 926639, -767725, -69793, 2603824, -1674500, 97174, 1496796, - 877247, -2658048, 155693, -2031520, -73014, 1079111, - }, - { - 7046968, 123163552, -6510634, -61540440, 48434348, 6185290, -3529390, -18343806, 1424319, 1733556, - 9675488, -14350023, -710280, 1664300, -5658083, -6752763, -4634807, -9863929, 878858, -9125732, - 9745281, 1408749, 10057203, 2464238, -12860206, 11589432, -169114, -6116571, 3570729, -4508642, - -5148592, -8061654, 9274445, 762894, 3729105, 4479651, 4910758, -8116415, -3681324, -4740570, - 124017, 2658585, -4133906, 103616, 426812, 2369748, -2387465, 4253628, 896038, -2156611, - -4345970, -2338073, -1349157, -113817, 577136, -6084358, 1047435, -660351, 981937, -2218351, - 1253594, 1288490, 305480, -276489, -2099165, 324270, -568009, 875636, -142271, 1731409, - -695248, -459025, -734976, -1766842, -331249, -236223, 981400, -208306, 2844342, 936840, - 1242856, -2512556, 1414655, -1395328, 161598, -3856881, 2625299, 526670, 700080, -108448, - -1196685, 617938, -514859, -1059246, 832687, 215822, - }, - { - 154619, -87307024, -45352708, 15333033, 9133248, -1919314, 6678674, -8064338, -2337536, -8297340, - 6040872, -19589346, 14758044, 7862475, 435939, 3696356, 734439, -1495186, -6776385, 2653216, - 6994891, -5046050, -4358318, -4888747, 6048388, -11756936, 1458678, -7977902, -4935991, 8153459, - 15423764, 1290101, -7617125, -6835441, 5181878, 4479114, 1436130, 13334800, -5339718, -2507724, - 7296613, -2518998, 246424, -4429185, -274341, 4057134, -5334350, -1896228, 6300180, -3513283, - 1134945, -340376, 5630166, -2792266, 6940131, -220117, 1493575, -3576634, -1737314, -537408, - -287226, -395137, 170725, 198105, -2106682, -3968013, 1212791, -2295123, -511101, 2237678, - -3854733, 2092723, -373662, -2068564, 1499481, -2385854, -1773285, -804770, -1354525, -246961, - -195958, 440771, 861141, -2038499, -624918, 1423782, -814433, -1883880, -1157494, -494995, - 1803349, -1564442, -1216013, -257161, -60130, 338766, - }, - { - 347355, -57187488, 13820131, 14095009, -1765232, -2600066, 1613297, 3613678, -219043, -3760244, - -5322002, 13774497, -1322850, 2094870, 9611600, -4009889, -16820702, 10378788, -10479183, -81604, - 3252901, 3566970, -5006858, 4408247, 1479079, -17606144, 4230543, 9767293, -541703, -3444564, - -1757715, -3178276, 2982318, -3000035, -574452, 5932424, -2826625, 8872866, 5158793, -5014375, - 1654636, -5126581, -1316944, 122943, 3282966, 943282, -245887, -274341, 4123706, -3897683, - 1075352, -1145146, -1314260, -2674691, -3543348, 1840394, 625992, -689879, 315143, -372588, - 1763084, 740882, -3682398, 1552094, 781684, -4319664, 3109556, 1494649, 4341675, -2329483, - 1738388, -928787, 1525250, 843424, -260382, -286152, -500901, -1329292, -1511829, 628139, - 1075889, -1140851, -178241, 2183991, -1846836, -1418413, 926102, 328028, -2269890, -236223, - -266288, 542240, 551903, -1146219, 2670396, -2057826, - }, - { - -17361868, 39228084, -6689412, -13740137, -9432285, 1842004, 4345433, -14331769, -5480379, -1245541, - 15718507, -3332895, -4109747, -5662915, -5581310, 12409234, 9919764, -15535970, 21871584, 21284784, - 5512054, 295816, -8150774, -10011032, -754841, 3554086, -5031554, 5417028, 383863, -750546, - 6098854, -8133058, -737661, -748398, -5106716, 535797, 3979287, 5158256, 5311801, 2412698, - 3499325, 1684164, 5068599, -3627637, -2585570, -242666, 954020, 213675, 169651, -3514357, - 7231115, 2778844, -2260764, 1312113, 617402, 817118, -3440269, 1574642, 593779, 1914482, - -3826816, -2567317, 3615289, -1338956, 2246268, 228170, -4449586, -1456531, -1624035, -1819456, - 1423782, -796716, -2204392, 1083406, -1684164, -1341104, 3308199, -481036, 768262, 2152316, - -67646, -2126009, 2516314, 239444, 1273995, 1683627, 1283122, 933619, -975494, 801548, - 678068, -899796, -1837172, -652298, 1549946, 327491, - }, - { - 86436, 25100326, -22784802, -1868848, 830539, -2128156, 540092, -2775623, 2080375, 10383083, - -2051921, 10022306, -5344013, -10926397, -6286759, -3835406, -20546586, -5403606, -4914517, -611496, - -3182034, 1734093, -328028, -3404299, 4837207, 9004936, 2584497, -3790846, -10381473, 12691628, - -12010876, 2712809, -663572, -5193689, -4733591, -997506, -8504572, 1646046, -3636227, -3911642, - -7029251, -1902134, 2760590, -3615289, 1155346, -756451, -1564442, 584116, -372588, 552440, - -6213207, -869194, 2220498, -1953673, -169651, -415538, -1917166, 2622615, -801548, 4666482, - 8949638, 2430952, -429497, 944893, -1744831, 181462, -1923072, 82141, 1988033, 30065, - -212064, -823560, 1255741, -1142998, -955630, -470836, -1909650, -1729798, 2161979, -954557, - 3380676, -1208496, -831076, 817654, 740345, -2727841, 2463701, -661962, 80531, -1622424, - -2581275, 666794, 1922535, 298500, -1739999, 401579, - }, - { - -16973710, 2239289, 29914448, -6963216, -1026497, -1449015, 3839164, 2210835, 2991445, -2623151, - 10428181, -17418240, 5218922, 19906100, 6785512, -579284, -3744675, -2700998, -4263292, 7359427, - -3714610, 2972654, 9696962, 2496987, 6316823, 221728, 12021613, -4713190, 7014219, -3852049, - 6486475, -11529303, -2370285, -3129958, -3722126, 5601174, -2450816, -4503273, 1472100, -2250563, - 6620692, 2244121, 208843, 8244190, -376347, 2015950, 934692, -1642288, 6211597, 5819681, - 4199405, -3950296, 318364, 858993, -3167002, 8460012, 1583232, 1570347, -434329, 989453, - -2649458, 1079647, 526134, 1013075, 3646964, 1750736, 541703, 478352, 1156957, 5659693, - -1159641, 1137630, -909996, -3184718, 2065879, 964757, 548145, -1678259, -947040, -1246077, - -365072, 844498, 2216203, -1567663, 289910, 3738769, -2706366, 288837, 1009854, -882616, - -1110249, 670015, 764504, -857920, -430570, 1054415, - }, - { - -1599875, 27468464, -57295936, -3105798, -1785096, 2209224, -2059437, 1351304, -6548215, -2092723, - -5440650, 18254, 12105902, 7933879, -6386080, 9421011, -12880607, 298500, -15963857, -1691680, - -2042257, -6853694, -6128382, 7440494, -20411296, 1598802, 1633161, -19519552, -6681359, 2863133, - -1400696, 6693707, 307090, -620623, -3856344, 35433, -2029372, -4946192, -12271258, -42950, - -2558190, -5108864, -3481071, 1859721, 2375654, -2271501, 9003325, 1510755, 2687039, 3996467, - -4363150, -7949985, 4517232, -1895691, -2391760, -1532767, 240518, -1707786, -540092, -759672, - -5930813, 3144453, 1021665, 4224637, 88584, 694711, 564788, -341450, -2184528, 1581085, - -1133871, -621697, 723165, -404264, 485331, 2552821, -2427194, 1538135, -1759863, -1171989, - -2837900, -969589, 538482, 1352915, 55298, 317828, -1365263, -1682017, -9664, -192200, - -821413, -139586, -1117765, -670552, -92879, 665183, - }, - { - -17696340, -9414568, 29146184, -9927817, -5399311, -729071, 506806, -4991289, -3734474, -2928631, - 23135378, 4598300, -6738267, 21595632, -4799626, 10079751, -29015188, -10679973, -13778255, -4196720, - 3795141, -10038949, 7493644, -5886253, -3778498, 7687455, -10383620, 4781373, -9219147, -5049271, - -4363150, -5069135, -3493419, -2285460, 7716446, 2747705, 5741835, -10153840, 4148402, -8487929, - -3600793, -5009543, -1152125, 1107565, 737661, 1559073, 2783676, 3349538, -608812, 2268280, - -1094143, 267362, -13422, -3894462, 1678259, -751619, 683974, 8590, 1330903, -4076461, - 1516124, 390842, -2479270, 1793686, -3240553, 3490198, -392453, -1914482, 1909113, 1145683, - 2275259, -572304, -1864553, -1824287, 2358474, -1226750, 4177930, -426812, 428960, 481036, - 2158221, 1227824, -887448, -1618129, 848256, 2510945, 537945, 212601, 489626, -1404454, - -366146, 140660, -551366, 1155346, -694174, 1446330, - }, - { - 1199907, -50862076, 87510, -4743255, 5991480, 1687922, 20157356, -19562502, -4025458, -7473780, - 1748052, -7846369, -693100, 4052839, 4384088, -11396696, 10518375, -7233262, 9710921, -517007, - -1734630, -59056, -2803003, 9533217, 10640781, -600759, 6521908, 3651796, 7910793, 3587908, - -3082713, 12978854, 3657165, 4946729, -4747013, -1809792, 4736275, -6234145, -6687264, -9649181, - 5475010, -3969087, 5222144, 417149, 8446590, -3666828, 4173635, -5491116, 2969433, -9423158, - -1642288, 718870, 527207, -2135136, -3570192, 8264054, 823560, 5646809, 572304, 1923072, - -4213900, 2120640, -4847945, -531502, -142808, 2731599, -2892124, 790811, 748398, -5294084, - -2701535, -1232656, -3442953, -2173254, -1862942, 1196148, -32749, 772557, 1654636, -2589865, - -3090766, -3280818, -3910031, 2435247, 614180, 1235877, -2165201, 894964, 774168, 1042603, - -625992, -217970, 1360968, 2222646, 533113, -1700807, - }, - { - -8230231, 98618888, -22869628, -9950365, 4640176, 3750043, -24662240, 14396194, 43526272, 2427194, - -16957068, -6039261, 3853660, 9861782, 8126615, -7261179, -7642358, -13660680, 162672, -4092567, - 5251672, 7516, -2880849, 2218351, -4333085, -5040681, -3151969, 6330782, -3037079, -15312632, - -1293322, -4503810, 7842074, 3279208, 9110163, -7973070, 922344, -10203769, 190589, -5123359, - -1998234, 3313031, -7515656, 4531191, 2319282, -22549, -7595113, -8646306, 4067334, -762894, - -4924180, -368830, 1231582, -147103, 2172717, -1950452, -47782, -537, -6927246, 3914326, - 97174, 5747740, 2618320, -579821, -166967, -1058710, -309775, -1199370, -2704756, 183610, - -1726577, 1912871, 2932926, -1349694, -2351495, 817118, 861678, 2727304, -2632815, 2509872, - -865436, -158377, -2953327, 2423435, -3439195, -69256, -1670742, 768799, -1696512, 574989, - -1748589, -618475, -1780264, 2649995, 667331, -1262184, - }, - { - 842887, -49976240, 10519986, -6592775, 4133906, -10797011, -2085207, 3994320, 2394981, 779537, - 4494684, 11133092, -763430, 5167383, -8029442, 3752191, -1330366, 7735236, -10020696, -1158031, - -6460705, 8775692, 86436, 9659918, -2740189, 5810017, 5886253, 2900714, 14697378, -1770063, - 2256469, 15438797, 1227287, 8741869, 6131066, -4983773, -4429185, 12918188, 8396661, 5488968, - 9889699, 1830730, 5870147, 6160594, 1471026, -5471252, 715112, 12042551, 1743757, 330712, - 6059125, -1641214, 1142998, -5093295, 702764, -4285304, 2195802, -3225521, -3208878, 97711, - 3144453, -3578245, 4721780, 4323422, 3651259, 1106491, -5202816, -1051730, 1209033, 660888, - 1294933, 687195, 3138011, -3758633, -2750927, 937377, -501974, 1718524, 4360466, -4074850, - -3259880, 1723893, 729071, -697395, -418222, 1246077, 2041720, 1413044, 62814, -544387, - 1956358, 1965484, -647466, 2666638, -513249, -1032940, - }, - { - -1165010, -112155016, 33030982, -9839770, -11219528, -12171400, -25487410, 6572374, -3971234, 7328825, - -21989696, -7976291, -7566659, 9141838, -12498892, -9833864, 3350075, -5859409, 2824478, -10358924, - 2362232, 1387274, -5971079, 7807714, -10907606, 1128503, -12913893, -7250442, -856309, -278636, - 5148592, -411780, -11065983, -6107444, 4399657, 3041911, 1700807, -833224, -2764348, 2889439, - 8248485, -8063264, 1232656, -1432909, 3735548, -2889976, 2608119, -5632313, 6187438, 2388539, - 5657546, 1749662, -2245731, -6513855, 2889439, -4135517, 5249524, -2490544, -1870995, 2466922, - 3075734, -1603633, 684510, 2856153, -2659659, -2584497, 4291209, 3992172, 2180770, 4769025, - 4824859, 3676492, -32749, 1409823, -3147674, 5198521, 2747169, 1996623, -1933272, 983548, - -4059818, -1052804, -1108102, 3685082, 141734, -2780991, -729071, 7516, -704375, 1136019, - -997506, 1047972, 3149822, 2612414, 1207423, -528818, - }, - { - 1995549, -2473901, -15988553, -2964064, -1989107, -5354751, -11427297, 2150168, 12284680, -2347737, - 2205466, -6658810, 8301098, -19876572, 27824946, -5887864, 882616, 3973919, 6648610, -2253784, - -12695923, 2124935, 234076, 1423245, -17007534, 8237211, 912144, 4025458, 6711424, -24062018, - -13069049, 4420595, 12938589, 569083, 8005282, -2531883, 1192927, 2236067, 2628520, -4047470, - -6816113, 1347546, -2828773, -879931, -5487895, 617402, 684510, -1909650, -3769908, -3910031, - 6426882, 3310883, 1928440, -723165, -1294396, 2928631, -3431679, 1421634, -757525, 4911832, - 1061394, -5877663, -3020436, 4522601, -931471, 1076426, -2099165, 442919, 358630, -635118, - 2479270, 623844, -2603287, 125091, 661425, 25770, -2058900, 202400, -288300, 3600793, - 4190814, 1125281, 237297, -1163399, -167504, -958315, 62277, -1207960, -1216013, -740882, - -1633698, -95026, -928250, 29528, 2051921, -3785477, - }, - { - -4597226, -69978976, 9011915, 2106682, 8771934, 3074660, -18961206, 3197066, -8560944, -110059, - -5174899, -16549046, -2557653, 5415954, 20176146, 3672734, 938450, -8302709, 796180, -1772211, - 17754858, -674310, 29025926, 9657771, -717796, -6841883, -1333587, -1608465, 3423626, -9873056, - -19986630, -14497662, 4669703, 9357123, 3453691, -8007430, 3104188, 9102109, 10630044, 1604170, - 635118, 5917928, -5215164, 2622615, -563714, -8738111, 2667175, 11670500, 2364916, 852014, - -7216082, -243739, -3503083, -861678, 617938, -4287451, -973884, 1980517, 2028298, -237834, - -2189897, 324807, -3961034, 368830, 184684, 1372242, 3861713, 6908455, -996432, 1243393, - -855772, 2411087, 1722819, -99858, -1900523, -4457103, -1890859, 1937030, -596464, -4333622, - -2332704, 4686346, -380105, -526134, 1356136, -236760, 2784750, -303869, -2164664, 1319629, - 3024731, 1127429, 1503775, 853625, 769873, 435402, - }, - }, - { - { - -613643, 36815924, -3166465, 26130582, 1042603, 261456, -3163780, -1853815, 6582575, -3826816, - 11183558, -5231270, 11105712, 3612068, -10149008, -7576859, -8721468, -16154446, -13252122, -8447664, - 8974334, 1586990, -6286222, 9768903, -544924, -599148, -290447, -255551, 4698694, 59593, - 9073118, -2385854, 5115306, -1104344, -2677375, -1790465, 1483911, 6851010, -1228898, 5908802, - -358630, 2282775, -2297271, 268435, 6847252, -1949378, 950798, 6250788, -1758252, -7713225, - -4270271, -45097, -267899, 1993402, 2316061, -4048007, -5944235, -1310502, 1885491, 1205812, - -434865, -527207, 4746476, -2998961, -922881, 3244311, 376347, 1125281, -840203, -175557, - 2336999, -2964064, 415001, 4000225, -1225139, -1028108, 269509, -1289564, 2083596, 2212445, - -1715839, 4165582, -215285, 1796907, -688805, 550830, 556735, -649077, -165356, 1373853, - -60130, -421981, -1777043, -1524713, -95026, 250719, - }, - { - -10476499, 80577880, 47158740, -20006494, -585726, 6326487, 1600412, -21602074, -5179194, -5659693, - 3896609, 7415798, -2194728, -4186519, -11861089, 1369558, -1484448, -6389301, -581968, -1999844, - 1673964, -814970, 5296232, -741419, -2867428, 2164664, 5714991, -11435350, -1203128, 505196, - -5379984, -1555852, 611496, 4826470, -488553, 10349261, 6576132, -4823249, -9807558, -2216740, - 2208687, -454730, 2563022, -4895189, 1998770, -31139, -933619, 4631586, 3311957, -3820910, - -1173600, -5422933, -3518115, -694711, 2153926, -3205119, -1739462, 1982664, -5433671, -249108, - 3898220, 931471, 442382, -871878, -3273839, 1315871, -186831, 32212, 1030792, -1664300, - 425202, -1340567, -350040, -1633161, 454730, -118648, 1854352, 1420560, 586800, 645856, - -452045, -412317, 325344, -900333, -439160, -1693828, 558883, 1351841, -391916, 85362, - -769336, -535797, -170725, -560493, 1294933, -478352, - }, - { - -712965, -120520000, -10108206, 38346540, -9646497, 5294084, 3923453, 1585917, -15287399, 6014028, - -2684, -16136729, 9241159, 2895345, 5698348, 3439195, 228707, 717796, -5283884, 7286949, - 4279398, 1088237, -10159745, -289373, -2388002, -7504919, -5299453, -1971390, 1159104, 2782602, - 10438918, 3593814, -2865280, -7926362, 6383932, 5328981, 5107790, 4837207, -3940633, -111132, - 4339528, -1998770, -1661079, -646393, 2127083, 4079145, -8009041, -2835752, -423591, 3069291, - 1083406, 22012, 744640, -269509, 1119913, 1432909, -185220, 925565, -6094559, 844498, - -296353, 1895154, 338229, -966368, -2326262, -1526861, -1146219, -2551211, -523449, 1124745, - -1083406, -1654636, 1701881, -1095217, -779537, -966368, 233539, -1319092, -1117765, -508954, - -828392, 1305133, -961536, -502511, 628676, -10201, 56371, -2097018, -2300492, 662499, - 37581, -579284, -1436130, -412854, 170725, 99321, - }, - { - -383863, -31075162, -11862700, 15848966, -178241, -873489, 1729261, 100932, 3539590, 406411, - 1714229, 8114267, -1935420, 3914863, 1788854, 3078418, -8385924, -4155918, 686121, -2626909, - 5093831, -7270306, 4912369, -5366025, 2940442, -4512937, -8791798, 4067334, 6796249, -9891310, - 9993852, -5792837, -565862, 352724, 1563905, -872952, 8514773, 2689723, 6063957, -1699733, - -6174553, 2809982, -5721434, 1992328, -51003, 3734474, -1802276, -1175747, 219580, -3183108, - 1609002, -875636, -1822677, -3374771, 556735, 1263257, 2561411, -3002719, 896038, 170188, - -1050120, 3218004, -3203509, 301185, 2157684, -2608119, 536871, 1782411, 2382633, 3103651, - 996969, 273804, -227633, 1581622, 538482, -77846, -881005, -3050501, 292595, 1818919, - 542240, -143881, -1190780, 1014686, -978179, -1775432, 1047435, 255551, -2393908, -452582, - -162672, 247497, 181999, -583579, 2115272, -915902, - }, - { - 14889578, -5733782, -14585172, -8705362, 1857037, -2003065, 2750927, -8210367, -11897059, -5369, - 3495030, -1020055, -2301566, 1602560, -4055523, 855772, 13792214, -213138, 11512123, 15102179, - 5754720, -2136746, -4999342, -3664681, -5516349, -687195, -4857608, 13415867, -3160559, -4359929, - 5908802, -7405061, -4226248, -1828046, 2633889, -1722819, 9645960, 3857418, 2179159, 9105331, - 413927, 2435247, 1619203, -1735704, -4604205, 780073, 153008, -699006, -888521, 5692443, - -57445, -1276679, 2651069, -666257, 3127273, -1225676, -25233, 1938104, 1403381, -2542084, - -1793149, -1394254, -2057289, 1636383, 2142652, 22549, -3946538, -792421, -527207, -346282, - -684510, 169114, -1092532, -1744831, 775778, -2489471, 2550137, -170188, 958315, 2596308, - -1000191, 469762, 312459, 2015950, -1058710, 3069291, 509491, 1698123, 244276, -302258, - -230854, -464930, -2371359, -111669, 1167694, -209380, - }, - { - 1709397, 4190814, 2083059, -7452842, -3280281, 1612223, -113280, -2529199, 3621731, 5192616, - 3687766, 3260417, -4854924, -6471442, -11841225, -2034741, -9099962, -11790222, -5647345, -3272765, - 2474438, -2459943, 1909113, 2443300, -151398, 2600603, 4628364, -414464, -3478387, -11384348, - -389231, -3528853, 4420058, -5244692, -3338800, 321586, -5153961, 125628, -3779034, -1774358, - -5223754, -1952600, 2230699, -4511863, -258235, -4004520, 6283001, -3680787, 163209, -1643362, - -5269925, 906775, 2824478, -48318, -1819992, 995359, -2578591, 2222646, 1989644, 2393371, - 7635915, 2414309, 57982, 1793686, -163746, -2368675, 201327, 856309, 1095217, 292595, - -1336272, 187368, 904091, -2187212, -268972, -835908, -1821066, -5906, 1651415, 586800, - 755914, -177704, -253940, 301185, 855772, 125628, 392453, -1207423, -1308891, -195958, - -873489, -1114007, 1649804, 974958, -1794760, -992674, - }, - { - 11879880, -30870078, 10532334, -3180960, 10595147, -2262911, 2375654, 14337138, -11087995, -8383240, - 5746130, 724239, 4220879, 22721988, -1854352, 5552856, -3452080, -10596221, 11539503, -3669513, - -1180042, -1384053, 13612362, 4082903, -1781338, 2718178, 4960151, 6833293, -521302, -5021891, - 3884798, -12327093, -5029407, 4642860, -331786, 5249524, -5977521, 438624, -4370129, 473520, - 5743982, 5370857, 3010772, 6598681, -1481764, -2845416, 3415573, 997506, 4702453, 5153961, - 3762928, -3219078, 1312113, 1560684, -2407866, 3164854, 5080947, -1826972, 1254667, -1905892, - -330712, 1341640, 2602213, 17717, 2595234, 214748, 302795, 2496450, 1478006, 3024194, - 3091840, -1587527, -1883343, -2206540, 2632815, -88584, 647466, -249645, -1316408, -2090039, - 1375463, 1149441, -494458, -403190, 1181653, 1408749, -352724, -542240, -60666, -426276, - -397284, 1358820, -583042, 420907, -563178, -469225, - }, - { - 3427384, -34581468, -3792993, -8096014, -1740536, 679679, 970126, -2837363, -5401995, -2796561, - 1319629, -2659659, 306016, 3353833, 16894254, -5359046, 4017405, -3123515, -7813620, -7801271, - -13562433, 1952063, -5609764, 678605, -14239964, -2928631, -6134287, -7613367, -5408975, 2008971, - 318901, -650688, -1374390, 3365107, -1256815, -2963528, -1346472, -6062883, -10576357, 4483409, - -2602213, -8200167, -4102231, 2902861, -2478733, 809601, 6104223, 924492, 5648956, 609349, - -2174864, -4154844, 2059974, -1878511, 61740, -1717450, -2987687, 102005, -1520418, -635655, - -1866163, 1612760, 3111167, 1407676, 707059, 3674882, -1217623, -1687922, -999654, 1359894, - 480499, -2442226, 2169495, -524523, 165893, 1619203, -1574642, 653909, -1883343, 605590, - -524523, -916439, 205085, -488016, 1999307, -580357, -1934346, -1170379, -261456, -746787, - -135291, -96637, -597537, -463320, -237297, 753230, - }, - { - 14281303, -37787124, 5213554, -9515500, 1416266, 4347581, -923418, -5987185, -7265474, 1694902, - 20833276, 6147709, 2615098, 7453916, 7511898, -2485712, -31403728, -6359773, -9666898, -5747203, - -375273, -433255, -791348, -1555852, -10737, -537945, -1506997, 3614752, -5858873, -5264020, - -16071768, 841277, -3842385, -1537061, 4698694, 6465000, -1502165, -9118216, 2512556, -2174864, - -11098732, 1145683, -1595044, -610959, 2364380, 1746441, 2889439, 1203665, -600222, 722091, - 1119376, 108448, 118112, -2442226, 3064459, -3250753, 1207423, -2445984, 3185792, -1407676, - 1595044, -398895, -758062, 545461, 837519, -2163053, -3077344, 590021, 1452773, -348966, - 2692408, 667331, -2102387, 592169, -248571, 92879, 1799591, 1053878, -842887, 2804614, - -482110, 765041, -128312, -1101659, 2192581, 16106, 1094143, -147640, 637266, -823560, - -156766, -725313, -1687922, 1581085, 995359, 140660, - }, - { - -2255395, -47641924, 143881, -9702868, 5213554, 472983, 10463077, -12395812, -3393024, 1959579, - -1027571, -5178120, -5519033, 7692824, -2855080, -7905424, 3812320, 1034550, -14310831, 21731998, - -1851131, 1706176, 295816, 4299799, 9603547, -184684, -1067836, 7422241, 4865124, 5595806, - 2204929, 10085657, 3891777, -1283122, 4752918, -177167, -2527588, -3204046, -3546569, -3320547, - 307090, -48318, 4209605, 4639102, -2604361, 3144453, 3450469, -248571, -82678, -10347113, - -379031, -547071, -1937030, 4308389, -466541, 2506650, 4643397, 698469, 4501663, -721555, - -1014686, -3047279, 627602, -1808718, 2654290, -930934, -3795677, 881005, -1646583, -1345935, - -205622, -2680597, -2241973, -1547262, -4150012, 2206540, 529892, -1344862, 2637110, -1415729, - -4364761, -748935, -4287988, 16106, -45634, 333397, -1802813, 985158, 493384, 1215476, - -1103807, 1410897, 693100, 843424, 1087701, -780073, - }, - { - 7353521, 73327976, -15923054, -6364605, -3312494, 14105746, -6270116, 26261040, 11976516, 9931575, - -9387188, 165356, 14478872, -5718749, -1850057, 2091112, -6568079, -10070088, -5341329, -3004330, - 4345970, 4718022, 4814122, -5195300, -6394133, -6133214, -4982162, 13386876, -9256728, -12735115, - 470299, 5364414, -1238561, 578747, 15314243, -2004139, -10174241, -7865696, -773631, -9910637, - 417149, 2773475, -3365644, 4073777, -696322, -273804, -10840497, -2827162, 2473364, -4055523, - 667867, 254477, 2094870, 1258425, 2393908, -1894081, -2734821, -1835025, 1312649, 279710, - -886374, 5558762, 3174518, -474594, -342524, 1331977, -576063, -4420058, -1697049, 1217086, - -1175210, 2860448, -1269163, -585189, -1370095, 585726, 1449015, 1212255, -1653026, 1254667, - 1011465, -664109, -1380295, -1127429, -847719, -1435593, -1240172, -156766, -38118, -384400, - -2213519, -979253, -128849, 656056, 1456531, -1278290, - }, - { - -831076, -33628520, 552440, -2196876, -6592775, -5637145, 1402844, -4469987, 7467338, -893353, - 12206297, 6681359, 9995463, -8434779, -4807679, 1253057, -755377, -2523293, -7074348, 7408282, - 3968013, 1961190, 2992519, -490163, 8054138, 3774203, 8070781, 3741454, 7821136, -7998303, - 12387223, 9532680, 4418448, 5429376, 4304094, -6451578, 4566087, 11294153, 4150012, 5701032, - 2274185, 3008088, 6332393, 2933463, 3592203, -3038689, -52613, 8768713, 4503273, -4388920, - 5913633, 4496831, -2602750, -2547453, -2758980, -2207076, 687732, -475131, -4201552, -918049, - 5214627, -2871723, 4418448, 3639985, 3876745, -1743757, 1029182, -4278325, 3179887, -200253, - 91268, 2123861, 274341, -542777, -3621731, -2365453, 3324305, 825707, 5256503, -5871221, - -1248762, 2734821, -920734, -1008244, -131533, 47245, 2063732, 1958505, -675921, 158377, - 2407866, 841814, 549756, 1474784, 630286, -1177358, - }, - { - -3102577, -58657444, -10574746, 6419903, -29387776, -16092706, -21650394, -3292629, 7141457, -7546258, - -16212965, -6570226, -12634183, 18170932, 6190659, -20126216, -2542084, 905701, -5151814, -2328946, - -1704028, 4316979, -2148021, -8994735, -1273458, -1896765, -9084930, -7338489, -2135673, -8129300, - 4748623, 3064459, -5620502, -5187784, -2455111, 4271345, 9027484, -8322036, -4534412, 11265162, - -273804, -2754148, 1344325, -131533, -2352032, 4675609, 81604, 934692, -2952253, 875636, - 3235721, 898185, -304406, -2361158, -303332, 1980517, 1000191, -2879776, 5780489, 89121, - -926102, 897111, 542240, 970663, -1959579, -1892470, 2807298, 5773510, 1934883, 2957622, - 6764037, 264141, 894427, 1445793, 805843, 2283312, 2907693, 2229625, -2130304, -164283, - -2124398, -1403917, -3026341, 2294050, -452045, 122407, -1915555, 1154809, -725313, -1280974, - 770947, 823560, 850940, 2683281, 811749, 478352, - }, - { - -3861713, -16824998, 1639604, 1313186, -5338645, -10195715, -5106179, 740882, 5871221, 4092567, - -197569, -4266513, 3325379, 15537044, -42763916, 16716013, 5130339, -736050, -2803003, -3930432, - -12800076, 6213744, -8296803, -307627, 95026, 1701344, 4119411, 498753, -5823976, -11056320, - -5542119, -9127, 15057618, -2508798, 6058052, -2072859, 4069482, -389231, -4995584, 3969087, - -8528194, -1023276, -3259880, 336618, -6449967, 466004, -1317481, 1153199, -6427419, 5481452, - -2916283, 7073811, -410169, -858993, 2677912, 204548, -3462281, 1831267, 1779190, 1482838, - -2305861, -2076080, -3428995, 3375844, 1359357, -1585917, -1482838, 97711, 1823751, -695785, - 2249489, 2391760, -3496640, -250719, -770947, -705448, 224412, -571768, 400506, 2181307, - 3226057, 2700461, 999654, -205085, 615791, -2664490, -881542, -1520418, -106300, -857383, - -654446, -1224066, -363998, 892279, 66572, -843961, - }, - { - 1971927, -51230368, -1086090, 1964948, 7373922, -5267241, -12927852, -6593312, -5894843, -2990371, - -8214125, 1677185, -17792976, 9569724, 25898116, -6276558, 5078799, -10456635, 4848481, 501974, - 3326452, 16482474, 14599131, 7165079, 2617783, -6527814, 456877, -1537061, -5833640, -3981972, - -7244536, -21984326, 7699266, 7861938, -3597572, -4202089, 5196374, 6491306, 2971044, 8825084, - -4930623, 3133716, -1449015, 4590783, -4395362, -2058363, 436476, 10164577, 169651, -2719251, - -3239479, -255014, -958851, 1013075, -3994320, 1402307, -5962489, 4910758, -1348620, 251256, - 1457068, -2314451, -1960653, -4090956, 804770, 2499671, 3129421, 5307506, 1715839, 1565516, - -2676302, 683437, 559956, -1178969, -770410, -2127620, -2582886, -1309965, -1330903, 215285, - -2601140, 2285460, 743029, 2003602, -103079, 1025423, 1326071, -494995, 336081, 1218697, - 797790, 1224066, 1392643, 2160369, -165893, 367220, - }, - }, - { - { - -580894, 57650808, 4544076, -9863929, -7231651, 4780836, -1860258, -4534412, -2357400, -15177878, - 3717294, -13377213, 3309272, 623844, -8515846, -7088307, -5906654, -4697084, 510564, 4641249, - 5970005, -5857799, -5064304, 20274930, 6389301, 7153805, 2279017, -3189550, 1267015, -2005750, - 732292, -11643119, -1780801, -2819646, 6906845, 1374926, -8428873, -1395328, -3861713, 928787, - -5751498, 2001455, -159451, -581968, 1588601, -5232881, -2268280, 1343251, 668941, -4331475, - 474594, 706522, -1109712, 1495722, 717796, -1403381, -6602439, -4209605, 554051, 1517734, - 4786204, 4736812, 3765613, -2864743, -987306, 1220845, 1714766, 935766, -2416993, -894964, - 1977296, -1941325, 656056, 3242700, -940598, -430034, -1163936, -3526168, 478889, 1584843, - -3386045, 2640868, 932545, 2451353, -347355, -314069, -672162, 404801, 464393, 1694902, - 421444, 716186, -143881, -526670, -1004486, 375810, - }, - { - 12486544, 21235392, -34173444, -18798534, -12045773, -3513283, -1044214, -13061532, -3373160, -6766184, - 16323560, 26876832, 3522410, -312459, -7473243, 6652905, -810138, -5798206, 12061879, 8808978, - -3377992, -10095858, -5461588, -2385318, 5686000, 4190814, 4436701, -17158932, 362925, 3878892, - -2236067, 12109660, -344671, -2741800, -5817533, 7726646, 9558987, 5309117, -1817308, 270046, - 1137093, 1980517, 2612414, -8209830, 674847, 451508, 1267552, 889058, 1066226, -386010, - 2377801, -4354560, -4568772, -1395328, 3155727, 17717, -2530273, -1294933, -3589519, 2610803, - 3271691, -217433, -1144072, -3905199, -5859409, -1415192, 505732, 1414118, 1666447, -205085, - 2043331, -3692061, -3445638, -2971581, 1424855, 46171, -445066, 849330, -1425392, -1024350, - 17717, -290984, -98784, -1446867, 181999, 92879, 944893, 534723, -1691143, -398358, - -1004486, -1692217, -9127, 874563, 2086280, -143345, - }, - { - -1222455, -83522616, 26109644, 55748676, 2528125, 7650411, 2633352, -3419331, -11440719, 9232032, - -4604742, -17528836, -1670205, -874563, 4644471, -894427, -3671660, 1089311, 3910568, 15355582, - 8301635, 3236795, -3310346, 5197448, -4483946, -6316823, -4924180, 1339493, 2063195, -4115653, - -3147137, 935229, 3438121, -3982509, 6751152, 693637, -1089311, 3010235, -483184, 990527, - 6338835, 2957085, -2114735, -4603668, -1920387, 1210644, -5670968, -3642132, -2564632, 2064806, - -695785, 500901, 180389, 1533840, -955093, -1447941, -1823214, 3339874, -1717450, 2630131, - 570157, 1512365, -1120450, 38118, -715649, 797790, -90731, -3205119, -1910187, 1526324, - 1042066, -1758252, 1398549, -265751, -404801, 1768453, 4005057, 1421634, 268435, 429497, - -519691, 833761, -1522029, 950262, 1046898, -577136, 977105, -74625, -237297, 717260, - -408559, 565862, 927713, 408022, -620086, 470299, - }, - { - -1403381, -4697621, 5308043, 8447127, -439160, -151398, 1068910, -1404991, -1908576, 5424007, - 5382668, 570694, -2285460, -1177895, -10103911, 3127273, -748398, -6145025, 1762010, -1904281, - 1615445, -6761353, 7577933, -14523969, -2867965, -563178, -10509248, -6200322, -1161252, -8383776, - 18213882, 1166084, 934692, 4475893, 1653026, 1492501, 6238440, -6088116, -911070, -1391033, - -1665374, 1788317, -8511551, 3346853, -4141959, -61740, -3092377, -1486596, -727997, -1141924, - 3867618, -719407, 1668595, 3557844, 2949569, 7516, 1885491, -1544041, 29528, -1277216, - -2806761, 5150740, 9664, 1083942, 1260036, -2713346, 350040, 521839, 392453, 4772246, - 2230699, 415001, -1648194, -304943, 295279, 2648921, 886911, -2418604, 1811939, 729071, - 85362, 3898220, 113817, -472446, -671089, -2476049, -381178, 105764, -1592896, -480499, - -557809, 67109, 888521, -726386, 1291711, -298500, - }, - { - -9707700, -37801616, -1730872, -3757023, 1083406, -1681480, 3636227, -764504, -3919158, 4883378, - -7613904, -730144, 4598300, 10191957, -3417183, -5679021, 10067403, 5185636, -2392297, -11543798, - 971200, 896038, -4415227, 3852049, 3066070, 3293703, 4022774, 15460809, -5181878, -10835129, - -4095251, -8722542, -3965866, -4614943, -2949569, -7897908, 3550864, -713501, -5820755, 570157, - -7994008, 1228361, 3835943, 5633924, 2771328, 26844, -1074, 1650878, -995896, 5462125, - -2699924, -2725157, 2006824, 459562, 3658239, -194884, 3336653, 1267015, 311385, -4931696, - -2393371, 283468, -2390686, 2593624, 1103807, -2021319, -543313, -198642, 998043, 2394981, - -315680, 926639, 1850057, -2311229, -369367, -2198487, 2861522, -142808, -193810, 1372779, - -1341640, 237834, -28454, 2334315, -2241436, 804770, -1305670, 1893544, 1714229, -323196, - -572304, -584116, -1354525, -684510, -290447, 15032, - }, - { - 91268, -2364916, 13912473, -5807870, -3606699, 3988951, -85362, -4000762, -2451890, -3825742, - 31139, 5731097, -4460324, 1291175, -6488085, -2443300, -440234, -6789807, 631360, -4220879, - 1262720, -1384053, -424128, -5894843, -40265, 3699578, -3532074, -5221070, -2013266, -20714628, - -3033858, -3266860, 3398393, 2358474, 4707821, 9061844, 1046361, 3132642, 6144488, 8230768, - 6590628, 7971996, 7570954, -4788352, -1487132, -3543348, 5969468, -2786360, 2317672, 2577517, - -2873333, 2497524, -1176284, -1371705, -496069, 2256469, 286689, 3649112, 1965484, 344134, - 4262755, -82141, -513785, 1235340, -883153, -2929705, 1360968, 2008971, -569620, 596464, - 1887638, 1047972, 1103807, -191126, -159451, -1753957, -241055, 1286880, 222801, -103079, - 328028, -1648731, -936840, -565862, -93952, 2037962, 1043140, -947040, -2413235, -1437740, - -574452, -1324997, 296353, -474057, -1184337, 104153, - }, - { - -3728032, -66572528, 8582955, 773631, 91805, -5447629, -9456444, 1685775, -8290361, -1212255, - 7889318, 18928458, 2934537, 2905546, -6288369, 8704288, 5073430, -2421825, 9477382, -1773822, - 3619584, -4943508, 2862059, -5302137, -7573638, 2488934, 7594039, 14198625, -3395172, -6933151, - 2928631, -14370424, -6390912, 7341173, 3368328, 5765994, -6292664, 6876243, 1194001, 5668820, - 5180268, 3032247, -3460133, -2704219, -4694936, -6091874, 599685, 409096, 593779, -693637, - -169114, -2769180, -650688, 12348, -1455457, -800475, 1207423, -4957466, -1190780, -3553549, - 919123, 1924145, 2945811, -1969243, 144955, -1574106, -580357, 3604551, 2545305, 1037235, - 348966, -2467459, 523986, 1212255, 2455648, 98247, -8053, -1247688, -332323, -1785096, - 1977833, 901406, -1918240, -591095, 1638530, 1065152, 1142998, -450972, -557272, 528818, - 565862, 2560338, -671089, 631360, 375810, -1228898, - }, - { - 831076, -35295504, 24735790, 6001143, 82141, -3964255, 2587181, -335007, -1899986, -1088237, - 4218195, -4408247, -13415330, 1759863, 29510720, 881005, 13449153, 2542621, -9234180, -10619844, - -14015015, 9701794, -3854733, -1128503, -9789841, -1804423, 3331284, 7356742, 1292785, -8175470, - -844498, 2799245, 2474438, 6902550, 2771865, 3505230, 3955128, -2157684, -2637647, 7347616, - 5391795, -348429, -1605244, 1108102, -4412542, -208843, -862215, -2379949, 231928, -3339874, - 2691334, -33286, 1836099, 1085553, 1514513, 1926293, -1633161, -2022930, 168577, 832687, - 1639604, 2826089, 1709934, -1476932, -1927904, 2800319, 57445, -788127, 460635, 1465121, - -90194, -2706366, -1376000, -3131031, 1458678, 2199023, -929860, 215285, -2175401, 2275259, - 2494839, 1390496, 469762, -2442763, 1759863, 583042, -1966021, -453119, 862215, 404801, - 253403, 51003, -997506, -881542, -947577, 165893, - }, - { - -8063801, -71899904, 11793443, -876173, -6849399, 536871, -1218697, 5117991, -852014, 2436320, - 631360, -5058398, 7602092, 10167798, 9848897, -13560822, -18044768, 14947023, 4246649, -1053878, - -5171141, -119722, 893890, 3821447, 5167920, -1464584, 2664490, 952946, -6035503, -767189, - -10555419, 6245420, 4898947, 865973, -2487323, -3117073, -5176510, -5267241, 4212289, 1329292, - -4480725, 4912906, 1967632, 1848447, -2806224, -3922379, -238371, -1659468, -2376191, 1939178, - 1937030, 350040, -559956, -1724966, 3706020, -4452808, 612570, -4826470, 1836099, -2042794, - 2136209, 1495186, -321049, -3089692, -1629403, -2367601, -3291556, -434329, 317291, 37044, - 1472637, 454730, 520765, 1848447, 17717, -977642, -1080721, 1223529, -748398, 1392106, - -2004676, -178241, -1126355, -2035815, 678068, -1693291, 506806, -1044214, -378494, 230854, - 287763, -1462436, -2065879, 172872, -308701, -752156, - }, - { - 492848, -37533720, 2458332, -5674726, -272730, -19001472, -5033165, -2447058, 3451543, 7344394, - 2806224, -7723962, -10249403, 8611409, -2703682, 3536906, 2926483, 1764695, -10392210, 8783208, - -7063074, 6544457, -5057861, -10923712, -4526359, -8839043, -15540802, -1798518, -1097901, 3439732, - 3604015, 1385664, -5311801, -8559870, 2056216, 1873680, -1144072, 4182225, 4973036, 2238752, - 1168231, 2527052, 3969087, 2933463, -1375463, 8588324, 8333311, 4677220, 1742683, -5480379, - 5204427, 239444, -1674500, 4299799, -4452808, -6183679, 1294933, -1164473, 3277060, -3259880, - 1830730, 2496987, 2206540, 227096, 5682242, 1741072, -332860, -274878, -1090385, 3358665, - 2281165, 81604, 1472100, 3984119, -1224603, 1209033, 671089, -3602404, -901406, -330176, - -2064806, 2231236, -1787243, -726923, -1799054, 200790, -1951526, 975494, -231928, -609885, - -600222, 2129767, -434329, 552440, 1811939, -641561, - }, - { - -8089571, 68410240, 7007776, -803159, -10761577, 31791348, 23074174, 37266356, 2935610, 1654636, - -7647190, -4879620, 11862163, -1958505, 73551, 6889665, 420907, -1430761, -3080029, 5817533, - 9067750, 6975564, 7983808, -5347771, -1823751, -1505386, -2888366, 14161044, -1782411, -4744328, - 840203, 3669513, -3233574, -206158, 13391171, 4677757, -6108517, -5060545, -300111, -8184060, - -270046, 1301375, -530965, 2524904, -1879048, 4880157, -4293357, 4534949, 6470905, -2035815, - 4048007, 1075352, 1229434, 1433982, 826244, -3316789, -4215511, -2464774, -2564096, -2288144, - 1224603, 3073049, -2911988, -5905043, -2396055, 2573222, 435402, -3170223, -1037772, 1752884, - -908386, 1298154, -3736622, -236760, -1916629, -2112587, -671089, -576599, -1677722, 1251983, - -552440, -2340757, -249108, -282394, 2282238, 754304, 35970, 422517, 557272, 227633, - -588947, 1574106, 1252520, -746251, 1380832, -1085553, - }, - { - -966368, -17090212, 7861401, 185220, -5221070, -2190970, 4371740, -8207683, 5971615, -1659468, - 173409, -3351148, -5082020, -20936892, 643708, 1002875, 1646046, 6266894, 2659659, 8540542, - 5024038, 620086, -67109, -9676024, -56371, -2141041, -1349694, -8901857, 12125766, 9703405, - 5111548, -5948530, 5142150, 570694, -7618735, -8678518, 7690139, 5026723, -7012608, -571231, - -5743445, -3841848, -6319508, -8013872, 2189897, 1836099, 3700114, -1118302, -8049843, -5352603, - 4989679, 4769025, -1422708, -4195110, -2849174, -2272038, 943282, 1195612, -589484, 643708, - 3105261, -4106526, 3451543, -355945, 1116692, -1773822, 1270774, -5088463, 1546188, -1518271, - 301721, 802622, -2539936, 782221, -1579474, -2750390, 1874216, -2942053, 1532230, -5213017, - -1299228, 1692217, -1759863, -1175747, -525060, -310311, 2353105, 1948841, -1349694, -1568737, - 1536525, 1381906, -59056, -1671816, 919660, 897111, - }, - { - 8023536, -33432026, -6514929, 12514461, -40466644, -19024558, -10049150, -9749039, 1388885, -11568494, - -2792803, 7825968, -8946954, 26511760, 19709604, -4154844, 13878113, 10641855, -1292248, -2076617, - -4662187, 8251706, 854162, -10798622, 6548752, 6487548, 5052492, 1598802, -3691525, -12419435, - 818728, 3600256, -866510, -2122251, -1949378, 1478006, 4941897, -9226663, -5187247, 9895605, - -4387846, -2044404, 1349157, -2472291, -5742908, 4232154, 5690832, 3871913, -3081102, 1371705, - 1205275, -446140, 2377801, 3242164, 2216203, 1348620, -1876901, -4107063, 6324876, 1235340, - -735513, 708133, -268435, -2281165, 374736, 3280281, 861141, 1742146, -4423280, -3561602, - 1764695, -3440269, 1190243, 1253057, 2113124, 2794950, -218506, -682900, -2980171, -852014, - 599685, 422517, -3026878, -222801, -2152852, 582505, -390842, 1008244, -881542, -1966021, - 128312, -308701, -1644973, 419833, -72478, 1430761, - }, - { - 3640522, -14071923, -4593468, 2036351, 1283122, -1024350, 667867, -4014721, -1802813, 1156420, - -4042638, -273267, 5298379, 12996571, -68383392, -368293, 1536525, 3799972, -3710315, 3920232, - -7671886, 1941325, -13520020, 6721624, 7061463, -1098438, -58519, 4197257, -1595580, 456340, - 4912906, -3499325, 6297496, -11384348, -1806034, -1311039, 2824478, -7898982, -6040335, 6517076, - -6997039, -1280974, -713501, 8065412, -2883534, 3413962, 5494337, 2250563, -5084168, 11638825, - -2245731, 4323959, -630823, 4174171, 3337727, -4390531, -2215130, 3855270, 988379, 1052804, - -497679, -1407139, -4292820, 957241, -559956, -1801202, -137439, 79457, 1089848, 493384, - 1697586, 2704219, -786516, 1633698, -113817, 134755, 310311, -1391569, -1555852, 257161, - 1610076, 1832877, -336618, 267362, 2078764, -1124745, -661425, -564251, 518080, -246961, - 2444910, 539555, -543313, 2147, 674310, 456340, - }, - { - 2840047, -45383844, -464393, -775242, -2732136, -3411815, 2572149, -1551020, -5393942, -3627100, - -2368675, 18997178, -9189619, -18486076, -12167105, -12569222, 8439611, -11661910, 4713190, -679679, - -15118822, -1045825, -4164508, -2823404, -1629940, -9854266, 2940979, 3255048, -9295920, 3098819, - 6607807, -19732690, 6103149, 9897215, 141197, -3751654, -75699, -5537287, -5491116, 2433636, - -11251204, -2430415, -3062849, 4733054, -1483374, 6947110, -28454, 4068408, -5665062, -5888937, - -1386201, 1005022, 4761508, 4070555, -1646583, 7434052, -2343979, 4014184, -4422206, -445603, - -214748, -3186866, 1766305, -2775623, -1842004, -1912334, -2960306, 1474248, 4173098, 1524177, - -4718559, -1580548, -750546, -1015760, 1684164, 1199907, 694174, -386010, -2712272, 2200097, - -357556, 2325725, 1321239, 2020782, 1486596, 4259534, 1634772, 934155, 1094143, -732292, - -1186485, -290447, -461709, 1141924, 81604, 1900523, - }, - }, - { - { - 24696, 44578004, 13873818, -40288404, 19002546, -5093831, -53150, 1122597, -10873783, -10031970, - -490163, 746251, -9572408, -2747169, -9659381, 830539, -6082211, 2243047, -4168803, 8491150, - 7133404, -6987912, -1823214, 6410776, 5603322, 12255689, 2968896, -2534568, -5323075, 8891656, - -6280853, -6083285, -8456254, 119722, 7591355, -2743947, -7954280, -2288144, 4395362, -2390686, - -3826279, -1633161, -2999498, 4936528, -840203, -4550518, -4386236, -1897302, 2720325, -4875325, - 1195075, 1263257, 2193118, 2233920, -3708704, -1192927, -620086, -5080410, -3464965, 2314451, - 5508296, 5087389, 640487, -1473174, -179852, 345745, 2880313, 202400, -2265059, -813896, - -341987, 3682935, -2249489, 877784, 2855617, -2916283, -1104880, -2246268, 1999307, -1269163, - -830002, 889058, 2398739, 1469416, 159988, -389768, -229781, 645319, -440234, 685047, - 791348, 243739, 225486, 1180042, -1189169, 800475, - }, - { - -15170898, -9798968, 25266218, 20259360, -47232828, -5474473, -13016435, 1388885, 1847910, -3978214, - 6305012, 26348014, 7494718, 4474282, -477278, -5313949, -1818382, 918049, 7592429, 7228430, - 5542119, -12313671, -2141041, -4123706, 9944460, 539018, -107374, -10624138, 834297, -548682, - 1683627, 10399190, 1545115, -4837744, -5455682, 4235912, 7917236, 4672925, 1339493, 6388764, - 1023276, 4461934, -4326106, -6872485, -190589, 688805, 3456912, -3733937, -1076963, 7414188, - -2491618, -1534914, -2944200, -1231045, 862752, -206695, -1570884, -1947768, 61203, -738198, - 4670240, -2617783, 750546, -6033892, -4001299, -3505767, 4112431, 1323924, 994822, -820339, - 1268626, -2643552, -2358474, -1964411, -1785096, 1305133, -1124745, -1102196, 710817, 105227, - -90194, -418759, -573378, -1821066, 1306207, -1058173, 1659468, -717796, -348429, 404264, - -1028108, -1552631, -635118, 765578, 1653026, -201863, - }, - { - 4991826, -42782168, -11487427, 53757420, 1458678, 2557116, 4053912, -6563247, -7799124, 5303748, - -5599027, -13036299, -8302709, 1890323, -369904, -4260071, 5726265, 355945, -1696512, 15530602, - 16437914, -5123896, 301721, 3199751, -4708358, -2107218, -3097208, -2431488, 2624225, -1605244, - -10524817, 2688113, 8372502, 1859184, -4659503, 1338419, 740882, 2139431, -208843, 765041, - 9269613, 606127, -381178, -2003602, -5242545, -6500433, 2845953, -3277060, -30065, -1465658, - -540629, -595390, 3021510, 4480188, -2757906, -1322850, -555661, 2619930, 1033477, -850404, - 3061775, 741419, -63888, -2119566, 441308, 1602023, -2302639, -976031, -371515, -514859, - 1043677, 237297, -112743, -286689, 150861, 2987150, 2377801, -20938, -748935, 1269163, - 1585917, -282931, -1297080, -146029, 527744, 814970, 1320166, -703301, 1241246, -907312, - 1462973, -409633, 803159, -23622, 882616, -365609, - }, - { - 2769717, 6631967, -4489315, -3943317, 7865159, -661425, 679142, 1703491, -7241315, 10228465, - 6170795, -7003481, 1490354, -9363566, -14017700, 8947491, -823560, -3085934, -2178622, 3754875, - -142808, -5819681, 2081449, -9802726, -4708895, 1786170, -8622684, -11190000, -9154186, 1688996, - 3791919, 11989401, -6352257, 7973607, 1002875, 5020817, 4453344, -2783139, -6857452, 537945, - -776852, -3784940, -4388383, 846109, -6085969, 1693828, -1687385, 1433982, -652835, -357019, - 4512937, -309775, -27917, 3211025, 3055332, 317828, -3038153, 3680250, -3985193, -442919, - -264141, 3175592, 2980707, 1356673, -1733556, 1915555, -1928440, -321586, 324270, 1288490, - 1331440, 3370476, -3340948, 132607, -156229, 2084133, 1717450, -470836, -48318, 569620, - -819265, 4907537, 1140851, -2891050, 120259, -1387274, -551903, -919660, -82141, -1680943, - -78920, 751082, 115427, -430570, 416612, 462246, - }, - { - 2720325, -59900300, 132607, -5663988, 9342091, -864362, -4373351, 3339874, 1553704, 1356136, - -14050449, 12657269, 7342784, 6591164, 1571421, -4632122, 2176475, 803696, 840203, -10342281, - 818728, 5460514, -12378633, 6708202, 11050414, -5225902, 19697794, -1781338, -2150705, -9555228, - -4991289, -6214818, -5210332, -2190970, -4194573, -5119601, -6289980, 2363306, -3850975, -3940096, - -8756901, 3163780, -156766, 4319127, 7907572, -759672, 1504312, -663572, -62277, 2202245, - 2595771, -2476586, -2346663, 1522029, 1953136, 4706748, 246961, 1895154, -2222109, -3866544, - -665720, -1620813, 1021129, 1190243, 1340030, -4880694, 2070711, -44023, 1964411, 1538135, - -460635, -492311, 2614025, -1213328, -2135136, -1051193, 1567663, 383863, 12348, 122943, - -171799, -1363115, 1256278, 553514, -558346, 467078, -1603633, 1313723, 1658931, 128312, - -173946, -301721, -1129576, -1343788, -415538, -47782, - }, - { - -1556389, 5580773, 2670396, 789200, -1504312, 1212255, 1386201, -4304094, 519691, -4154307, - -5144834, 8382703, -3047816, -14409078, -9318468, 3275450, 9276592, 2311766, -393526, -1643362, - -9170829, 4064650, 7765838, -17954038, 3427921, 5542656, -8550743, 495532, -594853, -13477071, - -4261145, 516470, -6518687, 3097208, 3958886, 9412421, 612033, 1339493, 5446556, 6332930, - 14664092, 6743099, 3056943, -2292439, -4079682, 62814, 1226213, 1905892, -598074, 3342558, - -423591, 1701881, -2672544, 2743410, -115427, -1240709, 2762738, 3452080, 2189360, -321049, - 1404454, -753767, 1085553, -1598265, -102542, -1228898, 1403917, 960462, -229244, -299574, - 2686502, 2335389, -3454228, 1566589, 476205, -1662689, 2292439, 1151588, 271657, -2465311, - 1380832, -1852205, -3103651, 338229, -126702, 1718524, 1978906, -1004486, -3146064, -1556389, - -304943, 218506, -595390, -1837172, 406948, 506269, - }, - { - -6680285, -70456792, 4376035, -3755412, 9877888, -3262028, -7103339, -15382962, 7816304, 8350490, - -9986873, 23490786, 8493298, -5675263, -3382287, -846109, 4191351, 10121090, -2211908, 3049427, - 5113696, -1934883, 2031520, -8808441, -4625680, 6739341, 10301479, 10491531, -4795331, -2889439, - -7352984, -3922916, -4860293, 3861176, 1432372, 2733210, -2135673, 6163815, 3374771, 4958003, - 6439230, -2305324, -10201, -7274601, -6805913, 2473364, -8352101, 2976412, -404264, -3974455, - 4495757, -4436165, 843424, -857383, -773094, -2610803, -556198, -1960116, -4791573, -1195075, - 1499481, -118648, 3083250, -291521, 1226213, -1620813, -1693291, 1551020, 2212982, 2317672, - -826244, -843424, -534723, 2231773, -421444, 1688459, 1786170, -2465848, -890669, -817118, - 1218160, 2004676, -2319819, 88047, 0, 1017370, 1784559, 118112, -1335735, 1481764, - 772020, 309238, -103079, 278099, 913754, -1359894, - }, - { - -3496104, 11553999, -354872, 9647570, -7003481, -3439732, 4080756, -3033321, 4975720, -715112, - -4608500, -2313377, 1977296, -2177549, 14540612, 7013145, 3062849, 12700218, -13711683, -8802535, - -6961068, 4319664, -922881, -1040993, -9019968, 391379, 6173479, 11256572, -5455146, -12332462, - -2812667, 5232881, 5776731, 1245004, 2811593, 7217693, 3390877, -2518998, 4264903, 916439, - 3374771, 6343130, -5917928, 5371931, -6298570, 1988570, -4134443, 521839, -1994476, -2613488, - -262530, 4003983, 944356, 1498407, 3336116, -2078227, 3455838, -6262599, -966368, -1547262, - 6141267, 2348810, -3425237, 3978214, -4488241, 2412698, 376883, -1637456, 2420751, -2579665, - 385473, -865973, -2177549, -1680406, 2907693, -1204202, 226023, -666257, -1389422, 2274185, - 937377, 1144609, 75162, -891743, 1257889, 703838, -2195265, 13959, -494458, 2143726, - -650688, 762894, -710280, -1577327, 17717, -1321239, - }, - { - -1539746, -88138632, 5192079, 4427038, 7382512, -5432060, -3885872, 5342940, 3113851, 7460895, - -16740709, -24159, 14815490, 7033009, -227096, -2926483, -8716636, 9368934, 10287520, 1779190, - -5864241, -2151779, 1490354, 798864, 2614025, -1493575, 7878581, -2898566, -2570001, -6223408, - -265751, -3596498, 10631655, -1667521, -3244848, -8928163, 1467268, -1280974, 4999342, -5745593, - 3104725, 3844533, -828929, 2479807, -4129611, -2933463, 833761, -5370857, -436476, 1709397, - 512712, 2012729, -1062468, -3376381, 3173981, 362388, -1038308, -1825898, -1802276, -3435974, - 3104725, 1603097, -564788, -3214246, -3264175, 962610, -2072859, -1015760, 1433982, 883690, - -1694902, 1174137, 2672007, -397284, 1366873, -1571421, -562641, 1899449, -724239, -625992, - 285615, -2219424, 412317, -2416456, -590558, -2684, -933619, 372052, -1176284, 19327, - 1254131, -2251637, -1439888, -1120987, 39192, -875636, - }, - { - 2238752, -36217312, -887985, -113280, -3799972, 1307818, -24779276, -5106179, 3522410, 13284871, - -3208878, -9635222, -16343961, 9286256, 682900, 16205985, -8832600, 5927055, 3755412, -13722421, - 4544076, -767725, -3007014, -3736622, -17898202, -4258460, -16183437, -9375914, 1283658, -945967, - 180926, 1581085, -2880849, -5095979, -6081674, 1978369, -168041, -334471, 7634841, 3126199, - 1599339, 2535105, 2720862, -3986804, 4468377, 5723044, 8578123, 9119289, -6986838, 2678986, - 3657702, -1444720, 3825742, -4002373, 359704, -5753109, -989990, -772020, -1719598, 1175747, - -738734, 4224101, 95026, 2951716, 4210142, 936303, 2541010, -1063004, 864362, 1240709, - 568546, 1691680, -210453, 4840965, 2852932, -2877628, 2261837, -2913599, -2359011, 76773, - -2011655, 2913062, -1523640, 497142, -2458869, -849867, 1611, 10737, -639950, -486942, - 294742, 920197, 38118, 87510, 1227824, 677531, - }, - { - 10775536, 65954592, -10320806, -991064, -21751324, 28609850, 17427366, 42380588, -2000918, -3977677, - 5426155, -13185013, 8007967, 6433324, -7680476, 10895258, 330176, 5157719, -10121090, 13189845, - 2318209, 11523397, 858457, 4236985, -10662793, -1470489, 4436701, 7175280, 5242008, -796716, - 2000381, -4618164, -4751845, 5208722, -2446521, 2474975, 4257387, -1268626, -3540127, 485331, - -1218697, -3170760, -721555, 1613297, -4600984, 8161512, 118112, 5104032, 288837, 6035503, - 3624953, -312996, -3978750, 1107028, -158377, 76236, -4889284, -1289564, -4343286, -995896, - 1589675, 337692, -5131412, -2534568, -3035468, 2003065, -733903, -1586990, 1126355, -230854, - -330712, -344671, -2024003, 261456, -1891396, -2283849, -1340567, -1331977, -395137, 1073742, - -1585380, -1446867, 212601, -308701, 2997887, 2203318, -898722, 311385, 773094, -1395328, - 783832, 1038308, 1275605, -645856, 1168231, -427886, - }, - { - 2717641, -6997039, -3565360, -1235340, -5361730, -4781373, 7853348, -4465692, -379568, 4388383, - -11580842, -3041374, 6419366, -30766462, -2344515, 1193464, 6246493, -1172526, 9155260, -1396938, - 7084549, -1898912, 2560338, -7132867, -2526515, -4438849, -17696876, -2172180, 16155519, 17437030, - -7279970, -760209, -2045478, 6546604, -10584947, -3297461, 10615549, -988379, -5627481, 98247, - -5655398, -5745593, -6468221, -6323803, 805306, 6583648, 1194538, -7417946, -7882876, 2090575, - -2415382, 3363496, 731755, -3002719, -2379949, -5277441, 3177202, -1016834, 3469260, 840203, - 2201708, -3792456, 4248797, -1571958, 767189, -678605, -2813741, -1044214, -207769, -2762738, - 3796214, -1786706, -3383361, 423591, -1273995, 122407, -1287953, -1822677, -1775432, -1852742, - -1851668, 367757, -1285806, -1452236, 274341, -440234, 1717987, 1874216, -415001, 54761, - -1108102, 1429150, -252329, -651761, -214212, 2094870, - }, - { - -13656922, -18677202, 15981573, 1693828, -39939976, 2274185, -18370112, -2182917, -4995047, -14596446, - 5023501, -6438156, 7503308, 21038898, 9309342, -5590437, 20893942, 1751810, -521839, 15553150, - -12983686, 9435506, -5561983, -7254200, 18101140, 5507759, 8523363, 5631239, -9570261, -7588134, - 3786551, 2155537, -2932389, -2552284, -8405788, 7642358, 326954, -7077033, 3635690, 144955, - -2272038, 425739, -3438121, -6839199, -515933, -724239, 10203769, 2889976, 1752884, -211527, - -97174, 6605660, -310848, 2730526, 3508452, -649077, -2193655, -1348620, 2140504, 3979824, - -4038880, 3052648, 2535641, -4531728, -1541356, 6214818, -1975148, 423054, -1963337, -5194763, - -41876, -3109020, 2608119, 2371896, 721555, 1412507, -721555, -1626182, 95563, -2709588, - 899259, 249108, 520228, -2642479, -1466195, -897111, 977642, -184147, -1093606, 39192, - 346819, 71404, -1834488, -986232, 1052804, 627602, - }, - { - -2968359, -18220326, 7373385, -4825396, 1371705, 5118528, 2364380, 1517734, -10596221, -2644089, - -4416300, 7582228, -1454920, -34736084, -1953136, 10204305, 9491341, -5754720, -1322313, 5517959, - -10118406, -1800128, 318364, 6722698, 10420128, 1437740, -17069274, 7933342, 427886, -2845416, - 10172093, 612033, -2150168, -4700842, -13095355, 5746130, -206158, -7641821, 1488743, -5409512, - 4669703, -769873, -3063386, 10129143, -1626719, 5019206, 5032091, -1039382, -1581085, 9271224, - -2001455, 4016868, -3231963, 4319127, 5511517, -3662533, -359167, 1370632, -911070, 3023120, - 4337917, -8230231, -2057826, 3283503, -3036542, 23622, -1996623, 1303523, 1237488, 1251446, - -388158, 2246268, 2211908, 596464, -1398549, 1234803, -1040456, 1278290, -2837900, 1258425, - 1666984, 561030, -570157, 578747, 386010, 1399086, -1378685, 970126, -945430, -818728, - 3287798, 375273, 1266479, -1258962, 715649, 144955, - }, - { - -10146860, -36332740, 5661841, -4951024, -1687385, 1534377, 951872, 1421634, -5951214, 6364605, - -1369021, 12221329, -3608310, 1073742, -45086956, -21261162, -1229971, 922344, -1199370, 4176319, - -16886738, -1878511, -4589710, -9471477, -6652368, 1147293, -2208687, 7659001, -9474698, -3704946, - 3578782, -5960341, 4870493, 4194036, 4239133, -122407, -492311, -13153337, -1614371, 2663417, - -14267881, 1181116, -5952288, 6139119, 1767379, 7023882, -2900177, 5294084, -3510062, -6754910, - 3710852, -2377265, 4395899, 3697967, -860604, 2152316, 1566053, 4191888, -4263292, 2654290, - -1545651, -2413772, -1544041, 1070521, -565862, -5499169, -176094, -2316061, 6991670, -2193118, - -2206540, -4934918, 3406446, 959925, -705985, 281857, 1345935, 654446, 69793, -1416266, - 981400, 1586990, 2678986, 1005559, 1827509, 2899640, 578747, 2704756, -135291, -224412, - -1414118, -1043677, 724239, 762357, 53150, 919660, - }, - }, - { - { - 1555852, 17490718, -6881075, -36741836, 13898514, -6469295, -3031710, 44560, -3455838, 1028108, - -4003983, 9388799, -3528316, -6213744, -2485176, 9368934, 780073, 8751533, -8393440, 4265977, - 8531416, -14065481, -6679211, 3142842, -515396, 10749766, 150861, -2106145, 1395864, 13928579, - -470836, -137976, -10483478, -3604551, -2684, -3869766, 3599720, 3173981, 10211285, 7279970, - 2812667, -3794067, -7663833, 4645007, -1712618, -5209796, -2160906, -1366873, 3599720, -2262911, - -294742, 1977833, 2872260, -1012002, -2288681, 3881577, 5083631, 438624, -4056597, -2147484, - 854162, 1614908, -1299765, -3906273, -2525441, 2616172, 3996467, 1342714, -2035278, -5098126, - -2915746, 3534758, -2031520, -337692, 3285113, -835908, 2521146, 150861, 1532230, -2515777, - 323196, 1747515, 2401424, 296890, 73551, 287226, -234076, -1024350, -1754494, 565325, - -199179, -314069, -276489, 1372779, 491237, 853088, - }, - { - 18923626, 15362561, 17930952, 95011120, 15745350, -4916664, -6616397, 3147674, -6586869, -6713034, - 2361695, 8376260, -3857954, 8853001, -10201, -12368969, -6290517, 5212480, 1356673, -7374459, - 15287399, -821413, 483184, 672162, 10200010, 568546, -1330903, -10515691, 3188476, -852014, - -1877438, 6256157, 648540, -6291054, -4959614, 2897492, 8200167, 6631430, 2196876, 5437429, - -452582, 3504157, -4429722, -4225711, -1872069, 1933809, 5386963, -2422899, -5563057, 2207076, - 602369, 44560, -3313567, -2264522, -1506460, -1323387, -1301912, 1717987, 2015950, -2884608, - 1799591, -1756105, 5636071, -1646583, 960462, -699006, 3294240, -1271847, 586800, -990527, - -617402, -271657, 1414118, -1058710, -2522757, 1240709, -1343788, -1265942, 3539590, 1418950, - -594316, 929324, -77309, -779537, 1916092, -1312649, 1182190, -520765, 956167, 2303713, - 1016834, -173409, -389231, -875636, -1412507, -807991, - }, - { - -7652558, -21580600, 9714142, 7706782, -33206002, -3103114, -6099391, 729608, 1393180, 7231651, - -158914, -17335562, -9111236, 10769630, -3545496, -2263448, 5528697, -3716221, 170725, 1013612, - 2852395, -2310156, 2247879, -3196530, -6324340, -914828, 5497022, 993211, -2332704, -4294431, - -6577206, 10084046, 12096239, 6020471, -5272609, 1829119, 679679, 845572, 1791001, 1288490, - 3782793, -4142496, 5976984, -1157494, -8731132, -5107790, 3312494, -1609002, 2219961, 1466195, - 2250026, 894964, 6627135, 7541426, -160524, -1690070, -1108102, 1770600, 1455457, 869731, - 3788161, -596464, -576063, -721555, -237834, -802085, -2160906, 1948841, 1051730, -2711198, - 1096290, 1095754, -1833414, -1678795, -1814087, -329639, -242129, -898185, -143345, 417686, - -753230, -1373316, 119185, -542777, -492311, -1017907, -246424, -1900523, 1676111, -552977, - 1035087, -623844, 445603, 173409, 114354, -2761664, - }, - { - -2168959, 10072235, 1953136, -10047002, 1953673, -1944547, -741956, 2684355, -6841883, 4142496, - -717260, -8186208, -1854352, -4569309, -6009733, 3698504, 163209, 8418673, -5716065, -4447976, - 5011690, -86973, 6306623, -33286, -3115999, 6769942, 973347, -155693, -7412577, -3159485, - -5796595, 5250061, -8991514, 4744328, -6432788, 1733556, 5981816, 2889439, -4282083, -3281355, - -4433480, -4317516, -4911832, -4187056, -8247411, 2818572, 2240362, 4774930, 3215320, 2000918, - 5153961, -1442572, -3041374, -2824478, -1370632, 317291, -1651415, 3079492, -1613834, 6000070, - 5393405, 4126927, 2951180, 1264868, -967978, 1639604, -2886218, -2521683, -2594697, -835371, - -613107, 2276333, -4118874, -1324997, -519154, 1164473, 2550137, 1597728, -71941, 1120987, - -2167348, 11274, -738734, -1458141, 1242856, 298500, 302258, -613643, 403727, -701153, - -335007, 660351, 309238, -584652, 328565, -139586, - }, - { - 4866735, -52716964, 8921721, -17646946, -4121558, 770947, -3985193, 2511482, 7734699, 5456756, - 2935610, 28588912, 7962333, 3801583, 4532264, -3908420, -2898029, -3994857, 5815923, -1855963, - 6002217, 10126459, -12133283, -2410014, 6065031, -10187126, 13127031, -13632226, -7738994, -2343442, - 5689758, 1079647, -1925756, -1371705, -4385699, -4983236, -7127498, 1416266, -3489124, -3690988, - -2552821, 3486977, -1326608, 3932043, 5903433, -4240207, 2889439, -532576, -3468186, -2836289, - 2797098, -1183800, -2498597, -1229971, -1080184, 3484292, -2351495, 2782065, 1052267, 889058, - -344134, -2477659, 2141041, 1501091, 3323768, -2903935, 1123134, -27917, 417686, -2579128, - -2539936, -1488206, 1078037, 69793, -2742337, -1466731, 779000, -980326, -995896, -1144609, - -221728, -1111323, 667867, -1051730, 620086, 1578937, -2317135, 931471, 2064806, 1037235, - 836982, 659278, -629750, -1482301, -354335, 709743, - }, - { - -107911, -1745904, -14134737, 5501853, 1449552, -1088774, 1795833, -3395709, 5840082, 315680, - -8132521, 3352759, -3927211, 5194763, 5195300, -2596308, 10167798, 7026030, 1116155, 1579474, - -2462090, 9702331, 8481487, -7968238, 9423158, 12577812, -3558381, 5619965, -1054415, -8733279, - -2971044, -886374, -7745974, -6063957, -7010997, -782221, -7207492, -2114735, 1663763, 65498, - 7045357, 2608119, -2517388, 70330, 1712081, 3142842, 86973, -1537598, -3700114, 2130841, - -253940, 2596308, 890132, 5065377, 1918240, 2106682, 2375654, -1393717, 880468, -803696, - -1438814, -1767379, 1619740, -2954401, 159988, -872415, -1287417, -1699196, -120796, 114890, - 402116, -161598, -3856344, 2970507, 2134599, 808528, 2365453, -1087164, 946503, -2081985, - 2268817, -470299, -2838437, 365609, -1466195, -161061, 2136746, -120796, -1964411, -831076, - -293668, 69793, -255551, -628676, 1225676, 934692, - }, - { - 16949552, -45043468, 6993281, -11634530, -5129802, -4110821, -8181913, -9693741, 9183714, 1053341, - -13159780, 14647449, 6339372, -7808251, -1584306, 10979547, -4930086, -5947456, -7840463, 3195993, - 10776073, 927176, 396748, 1240709, 16873316, 8130910, 4107063, 5146445, 1217086, 3791919, - -2301029, 2334315, -2361695, 1890859, -2943126, -6838662, -4400731, 4613869, -4836133, -5129265, - 842350, -6801081, -1515050, 248571, -2200097, 2423435, -8476118, -401043, 2536178, 2243584, - 6434935, -5582384, 157840, 2536178, 653372, -2134599, 130997, 176631, -4479651, -1497870, - 65498, -1635309, 2828773, 324807, 2601677, 1354525, -355409, 3098282, 2114198, -508417, - -2287070, -325881, -2775623, -552977, -1956358, 271120, 2020782, -1619740, -1326071, -2524367, - 88047, 2070174, -1185411, 2012729, 7516, 738734, 917512, -259309, -1083942, 1811939, - -381178, -1737851, -1371168, 247497, 450972, -1338956, - }, - { - 60130, 37755448, 2298344, 3037079, -8166881, 616328, 4038880, -3992172, 3927748, -3972308, - -4511863, 5049271, 8533026, 304406, 7583839, 7776575, -5390184, -3565360, -8616778, 5566278, - 2274722, 6926172, 998043, 1809792, -4583267, 8108362, 3624953, 3219615, -10331007, -10572599, - -3389803, -2143726, -2217814, -3842385, -3363496, 5302137, -4952634, -11237245, 3548180, 3007014, - 2471754, 8527121, -6058588, 7875897, -1820529, 882616, -5369783, 1046361, 1108638, 3364570, - 435939, -965831, -2338610, -714038, 1714766, -3739843, 3121904, -6187974, -632434, -5066988, - 2352568, -2404645, -5677410, 5434208, -3875134, 2283849, -1748052, -542240, 2726767, -4231080, - -287226, -314606, -32212, 345208, 1367410, -2461016, 957241, -818191, -3100967, -155156, - -1692754, -1433445, 366683, 824634, 670015, 358093, -958851, 807454, -1113470, 1355599, - -2333778, -198105, 1389959, 248571, 42950, -1123671, - }, - { - 14199162, -71717360, 13506598, -7691750, -5696201, -4660577, -16601122, -5853504, -5153961, -4437238, - -3412352, 7675107, 12786655, 7262790, -7084549, 25438554, 6220187, -3543885, 6184216, 2206540, - -6869264, -1256278, 8455180, -1452773, -1296543, -5377836, 2385318, -2837900, -3860102, -4599373, - 1817308, -5980742, 9226663, 2299955, 2692408, -5506148, 5659693, 4608500, 7146826, -8637179, - 2341831, -18254, -5289789, 2386928, -2334852, -978179, 863825, -5365488, -1635309, -2623688, - 1387274, 3105261, -1049046, -2986613, 5879810, 2829310, 323733, 995896, -898722, -5836861, - -2405719, 1424855, 2573222, 3447785, 1767916, 5459441, 999654, 263067, 3085397, 804233, - -2124935, 1846299, 1956895, -1005022, 913754, -887985, 1474784, 1859184, -1278290, -241592, - 1079111, -1109712, 2871186, -1675037, -155156, 1669669, -1736241, -420907, -52076, 147103, - 1926830, -861141, -303869, -599148, -906238, -904091, - }, - { - -3255585, -36145372, 6637872, 340376, -483184, 18287434, -12058658, -10636487, 5729487, 5664525, - -15708843, -6903623, -16158741, 7643431, 1580011, 2683281, -24621436, 3185255, 13294534, -10212358, - 2340220, -3882651, -9837623, -2736968, -4262755, 7069516, -8822400, -6840809, -597000, -6899328, - -4028679, -3296924, -9388262, -5170067, -7095286, -1272921, -3379603, -3027415, 6969122, -3754875, - -3491272, 1774895, -2138894, -10581189, 3429532, -1599339, 685047, 6137509, -3808026, 6230387, - -886374, -3519189, 1626182, -4553739, 4301947, 1384590, 4692252, -1612760, -4531728, 1414655, - -3955128, 471373, -4319127, -518617, 4604742, 734976, -133681, 185757, 1721745, -2088428, - -3560528, 133681, -547608, 2833068, 2726231, -3207267, 3380139, 124017, -2727304, -1365263, - -670015, 3670050, -492848, 1396938, -1384590, -710280, 339302, 216359, -418759, -926102, - -812286, -1675037, -135828, -144955, -688269, 560493, - }, - { - -14062797, 38962332, -18176302, 1210644, -22466974, -12537546, -21836688, 26108032, -110595, -1673964, - 8998493, -7269232, -1876364, -3934727, -14890652, 4878546, 3978214, 17006460, -3179887, 8527121, - -3362960, 2667712, -14385993, 4493073, -10459319, -1614371, 8811662, 318901, -1078037, 3518652, - -1080184, -12122008, -5801964, 5174899, -9594420, 678068, 12592844, 6394133, 2895345, -178778, - -4056060, 1342177, 1670205, -570694, -4093641, 7052337, -1701344, 2746095, -1058710, 5481452, - 644245, -3056943, -3551938, 1815697, 1525250, 3143379, -3888019, 1702418, -394063, -151934, - -1309428, -511101, -1502702, 1480153, -2165737, 2486249, 614180, -193810, 1280437, 515396, - 147640, -1139777, 653372, 3155190, -540629, -2188823, -816581, 674847, 80531, 623307, - -1514513, -615254, 1999844, 1237488, 1688996, 368293, -2822867, -1337882, 691490, -1926293, - -205085, 368830, 496069, 219043, 1429687, -104153, - }, - { - -2863133, -7495255, 3252364, -4425964, -3518115, -1121523, 8500277, 286689, 694711, 8097624, - -14360760, -12474733, 7121593, -23689428, -3341485, -2193655, 10759967, -9538049, -1418950, -12103218, - -3651259, -13618268, -1823751, -1032403, -2519535, -4610648, -10230075, 13108777, 16043313, 3840238, - -5420249, 3330210, -8013335, 836445, -6658810, 2144263, 11849815, 1116155, -2165201, 7581691, - 1127966, -4075924, -1345935, 1314797, 2097555, 2805688, -6011881, -9543954, -3140695, 9410273, - -3136937, -1430224, 164283, -993748, 1460289, -4900558, 2091649, 159988, 5612986, -752156, - 1983738, -4064650, 4517232, 3328600, 3016678, -1407676, -3614752, 190589, -551903, -4350265, - 2154463, -1385127, 462246, 1691680, -746787, 3111704, -1726040, -2331630, -373662, -602369, - -2850248, 776315, 31675, 141197, 1138166, -52613, 1695975, 1297080, 477278, 1496259, - -1792612, 710817, -124017, 63888, -559420, 2167348, - }, - { - 16005732, 11439645, 10695542, 9302362, -12757127, 30381524, -4716948, 8573828, -7461969, -7506529, - 11951820, -4972499, 1064078, 2961917, -1975148, -18081276, 7778723, -8164733, 1608465, 21237002, - -11027865, 3755949, -1526861, 3375308, 17894444, 3308736, 4809827, 10736881, 2265059, 3501472, - 7488813, 1424319, -2302103, -3371013, -8122857, 3685082, 4310000, 785979, 384400, -703838, - -1312113, 4269198, 3855270, 891743, 2531883, -3191161, 5123359, 1793686, 2979634, 3624953, - 2086817, 6887517, -983011, -308164, 4881767, 1342177, -263067, -1596654, -2491081, 5361193, - -2135136, 1975148, 633508, -1811403, 187368, 1834488, -2892661, 1044751, 1779190, -581431, - 316754, -1717987, 1771137, 1570884, 642635, 1662689, 274341, -828392, 175557, -2791192, - 1068910, 411780, 1823214, -474594, 1369021, -1086627, -197569, -537408, 1071058, 3380676, - 1650878, 1238561, -450435, -90731, 1233729, 891743, - }, - { - 3553549, -18824304, 3263638, -2590402, -1168231, 3289945, -384400, 4713727, -3318936, 433255, - -2536178, 1759326, 878321, 49548352, 107142256, -1057636, -8045011, -2526515, 8046085, -187368, - -4052302, 5481989, 2308008, -5246303, 1296006, -828929, -24009404, -4699768, -7209640, -9856413, - 6460705, 2202781, 969052, 8087424, -5478768, 2402497, -1263257, -8698383, 1683090, -5759551, - 3774203, 253403, 1088237, 8910983, 774168, 10572062, 3359201, -4271345, -5178657, 3483219, - -1069984, 2596308, -5171141, 3349538, 4830228, -2095407, 1103270, -2132451, -3677566, 2799245, - 2083059, -3627100, 797790, 733366, -2967286, 1875290, -443992, 1010391, 2094870, 3731253, - -1545115, 297963, 713501, -779537, 138513, 2455648, -2704756, 2022930, 179315, 2385318, - 1636919, -585189, -108448, 468688, 45634, 3081639, -600222, 289373, -1686312, -2332167, - 96637, -1262720, 1052267, -2203855, 328565, -118648, - }, - { - 16546362, -8431021, -6720550, -9426379, 15795816, 14367739, -2512019, 803696, -7490423, 6507413, - -1020055, 15712601, 3540664, -6325950, -43794172, 1491964, -6447820, -8122320, -5635534, 51003, - -17529910, -1429687, -876173, -14580340, -9647570, -2657511, -580894, 15434502, -8621610, -12814572, - -1948305, -3299072, 1655173, 2255395, 5422933, -2200634, -2221035, -11231876, -954557, 12644384, - -807991, 6235219, -9994389, 6097243, 5743445, 7902203, -2810519, 4866198, 427886, 552977, - 4844723, -4196720, 90194, 1235340, 1126355, 2730526, 1306744, 1276679, -4318590, 3492882, - 1276679, 1807644, 1538135, 5277441, 1450625, -6326487, -12348, -4103305, 977105, -4250944, - 2997350, -45097, 6858526, 1187022, -2376728, -3180423, 215822, 1798518, -1736241, -3173444, - 1239098, 303869, 311922, -1774895, -183610, -175020, -1442035, 715112, -1334124, 94489, - -1373853, -1502165, 693100, 1158567, -235149, -1598802, - }, - }, - { - { - -1810866, -13997298, 14891188, 11316165, -24411520, 1748589, -6845104, -4480725, 3261491, 980326, - -6157910, 9892383, 1540820, -3257733, -233002, 690953, -2461553, 3504693, 13424994, -3777424, - 1776506, -10464151, -8093329, 14605573, -5139465, 13455596, -190589, -1748052, 3948149, 5286568, - 3051038, -985695, -10528575, 1163399, 1582159, -11072426, 8260833, 9213779, 5279589, 3170760, - 2072322, -2809982, -4720706, 3591130, -3403225, 1033477, -6008123, 809064, 1136556, -2601677, - -964757, 1683090, 4252555, -6118181, 3452617, 4883378, 1879048, 2825015, 494458, -3426310, - -4895726, 1483374, -886911, -2010582, -4237522, 3613141, 1253594, 202400, -970126, -4591320, - 803159, -781684, 493921, -1250909, 2464238, -1590212, 3104188, 256087, 757525, -2637647, - 1298691, 1147293, 2136209, 1018981, -1369021, 2124935, -1592359, -1111860, -1822140, 928250, - -285615, 151398, -1119913, 884226, 1796907, 460635, - }, - { - -21638582, 62524524, 19603304, 112741816, 4760435, -10770704, 12152073, 207232, -15373299, 5151814, - -8907225, -666257, -1761474, 8425652, -2851322, -9048959, -6827388, 4814659, 897648, -11889006, - 13507672, 11187316, -7512435, 4335233, 564251, 6148246, -11825656, -6979, 4520990, 1154809, - -8262980, 1632625, 2817499, -3942780, -3120294, 349503, 5903433, 9914932, 4005594, 4247186, - 42950, 2379949, -3723737, -1137630, -4916664, 6768869, 997506, -1750199, -435402, -5006322, - 3588982, -4164508, -627065, -3530463, -2583960, 3081102, -3149285, 2383707, 3318399, -2654827, - -4076461, 4814659, 1136556, 745177, 1957431, 2062121, -1274532, -1261110, 559956, 2467459, - -3987877, -454193, 1958505, -1367947, -429497, -2458332, 1324997, -1478543, 3658239, 858993, - -1486596, 1687385, 424665, 207232, -1228361, 2415382, -2183991, 3297461, -819802, 1236414, - 666257, 450972, -922344, 1521492, -2978560, -319438, - }, - { - 7624104, -236223, -28523952, -35388384, 7659001, -5029944, -13690745, 9891310, 954557, 9974525, - -7328825, -9942312, -11952894, 16265578, -7952669, 6644315, -1269700, 3288871, -5286031, -6555731, - 11172821, -8213588, 6272263, -7466264, -2945811, 3240553, 5347771, 734976, -3287798, -2762201, - 1074, 4224637, 8669928, 9044664, 1232656, -3182571, 4904316, 2013266, -3052111, 4385699, - -3792993, 478889, 1362578, -4577899, -2455648, 922344, -3357591, 971736, -1649268, 3150359, - 22012, 2433099, 5938329, 8356933, 1275605, -3495030, -1865090, 2003065, -965831, 4633196, - 365609, 1495186, -669478, 170725, -679679, -3299609, 1017907, 541166, 2089502, -1259499, - -868120, 876173, -3577171, -1041530, -420907, -1262720, 648003, -1444183, 129923, 1653026, - -1845225, -2369211, 850404, -1757715, 355945, -694711, -1526861, -1574642, -18790, 1133335, - 1064078, -231391, -1208496, 628676, 447750, -2698313, - }, - { - 956167, 23764590, -10402411, -10402411, 675384, -309238, -1038308, -3418794, -211527, 491774, - 5116917, -3935264, -10761041, -3483219, 2716567, -604517, -189515, -2838974, 3080565, -1851668, - 4303557, 8701067, 4551055, -1103270, -2537789, 9639517, 4243428, 6771553, -10264972, -7665980, - -7386270, 5909875, -3521336, 3161633, -7377143, -4009352, 5532992, 881005, -1806571, 3470871, - -6826314, -3819837, -5804649, -3498251, -2509872, -3210488, 4556961, 613643, 5442261, 6188511, - 1880659, -6162741, -1218697, -1561758, -4378183, 831076, 3371013, -1606318, 1930588, 5601174, - 8009041, 2316061, 1476932, -71404, 2530810, -265751, -588411, -3548180, -3036005, 1026497, - 1394791, 1044214, -4563940, -1269163, 916976, 66572, 2658048, 707059, 212064, 1611150, - -506269, -2104534, -2245194, 1850594, 302795, -359704, -438624, 1316944, -1627793, 536871, - -1296543, 647466, 1957968, -18254, -1014149, -841277, - }, - { - -11113765, -32569810, -450435, -24832964, 10127533, -946503, 2204392, -4322885, 7419019, -5618354, - 22217866, 13715441, 14002130, 2444373, 9312563, -4874251, 3710852, -16564078, 4110284, 10545755, - -539555, 7382512, -1497870, -4767951, -1755031, -7557532, -2336999, -15014669, 2246805, 4755603, - -1139240, 4563940, -3049964, -1770063, -3828963, -1191317, -3441880, -7814156, 4827007, -7530152, - 3248069, 1202054, 1403381, 5846524, -659814, -77846, 4090956, -840203, -1868311, -7945690, - 4403415, -507343, 3396246, -4979478, -2014340, 2427194, -3786551, 3180423, 1764158, 1265405, - 999117, -2907693, -7516, 69793, 4954782, -650151, 512712, 2335389, -3941169, -986232, - -2289218, -870268, -1523103, -1082332, -1164473, 1141924, -469225, -1086090, -2054068, -673236, - -245350, -1187559, 481573, 724239, -128312, 192737, -1307281, 1301912, 959925, 1838246, - 1977833, 511638, -2110977, -692027, -787053, 422517, - }, - { - 1498407, -21138218, 1731946, 2001455, 1388885, -1212255, 778463, -4669703, 5813775, -317291, - 3330210, -1391569, 824097, 3121368, 1345399, -4718559, 14128295, 10964515, -10362145, 9846749, - 709743, 3312494, -6727530, 16537235, 2483565, 12157442, -2794950, 10332618, -10445897, -9526774, - -6888591, 857920, 2833605, -7414188, -6201396, -3504157, -8395050, 2283312, 1072668, 5422396, - -8786966, 11621645, -5511517, -1464584, 5143224, -1034013, 3454228, -2384244, -1653562, 1193464, - -2323577, 2503966, 2985539, 4990752, 3326452, 3952444, -183610, -3747896, -198105, 2029909, - -898185, -556198, 227633, -4258460, 2206540, -1393180, -1867774, -2556579, 2193655, 281857, - -2048163, -2272038, 1570884, 1287953, 2737505, 199179, 187368, 703838, 2183991, 227633, - -1491964, 66035, -1633698, 142271, -11811, -413391, 1718524, -2150705, 286152, -784905, - -217970, -233002, -878321, 623307, 559420, 1213328, - }, - { - -22352620, 9760850, -12068858, -10854993, 9060234, -5384279, -3678640, -1953136, -5092758, -8499203, - 9656697, -1909650, -395674, 4929012, -6376953, 10047539, -2113124, -5137318, -10609106, 1843078, - 16131897, -5684926, -1351304, 1344862, 27495306, 541166, 9298067, -3745212, 7471096, 1934883, - -8865349, 8600135, 3051574, 1092532, -2288681, -10539313, -1986422, 221728, -4959614, -7959648, - -1024887, 439697, -7636452, 4946192, 2600603, -3086471, -4135517, -1382443, 694711, 7166690, - 2869575, -5147519, -2282775, 3220152, 1447404, -280784, -2168959, 2026151, -3416647, 554051, - -2854006, 590021, 2695629, -963683, 2190433, 4138201, 373662, 1821603, 734439, -1336272, - -866510, -441308, -2806761, 54761, -2360085, -115427, -509491, 1246077, -476205, -3851512, - 932545, 336081, 863288, 2002529, -386547, -501437, 297427, 1054415, -43487, 159451, - -821413, 57982, -2197413, 278636, 813359, -1832340, - }, - { - 3062849, 12102681, 13022341, -8422968, 3075734, 2140504, -1132261, 2112587, 1078574, -4159139, - -5126044, 10705743, -982474, 5223754, 4392141, 4825396, 11992086, -9278203, -9356586, 2554969, - 7026030, 6569690, 8147016, -7486665, 2990371, 7554848, -9316321, 5452461, -13272523, -4138201, - 9414568, -13859859, -4425964, -7918309, 1803886, 9641128, -10018011, -8519068, -3908420, 7857643, - 1944547, -1180042, -935766, 6799470, 2137820, -1657321, -3955665, 111669, 642098, 4658429, - 4990752, -8611409, 122943, 158914, -2063732, 919123, -137439, -4182225, 657667, -5172751, - 1423245, -4169876, -3391951, 3340411, 515933, 412317, -2211908, 2661269, 909459, -1184337, - -1765768, -637266, 228707, 1547799, -413391, -1811939, -1144609, -483721, -568546, -1304596, - 141197, -1579474, 411243, -266288, 1252520, 237297, -1250372, 711354, 364535, -594853, - -1088774, -1848983, 2508798, -227633, 497679, 399432, - }, - { - -26844082, -21184390, -5415954, -18538152, 24131274, -3362960, -13379897, -9470940, -13591424, -7641821, - 17202418, 1202591, 8797167, 14440217, -11742441, 12275017, 17314624, -3058554, -2655364, 6329708, - -8706436, -2171106, 5953899, -1241246, -2400887, -1265405, -1027034, -1739462, -2578591, -2188823, - 2215130, 6446209, -1296543, 4486630, 2943126, -3140158, -2535641, 6788196, 2835752, 125628, - 60130, 52076, -7815767, 2110977, 930934, -7220914, 5800354, -1720134, -7625715, -2235531, - 5355824, 1554778, -94489, -1498407, 4923643, 2501282, -249645, -360777, -1061394, -5168457, - -2397129, 2663954, 501437, 8565239, 1746978, 600759, 452582, -1074, 2151779, 362388, - 184684, 1946157, 1990717, 291521, -1378685, 2025077, 714038, -413927, -2510409, 2735894, - -1644436, 448824, 2060511, 972810, 169114, 1010928, -1447404, -966368, 571768, -493921, - 1393717, 307627, -649077, -1501628, -209380, -413391, - }, - { - 3085934, -34175592, 244276, -150861, 3987340, -3700114, 20070382, -4605279, -9114457, -1584306, - -11664057, -1745904, -11555073, -1374926, 6489159, -6267431, -23612656, -1254131, 7394860, -1134408, - -126165, 4024921, -12081206, 1391569, -186831, 2428804, -1513976, -9105331, -1721208, -5103495, - 1301912, -8798777, -15137612, 9693741, -4620311, -10539313, -2783676, 823560, 2835752, -8980240, - 5217849, -512712, 1708323, -6219650, -4557497, 1141388, 636729, 2955474, 4246649, 1082332, - -5326833, 1501091, -1245541, -911070, 4358855, 4159676, -1082332, 3098282, -4180614, -507343, - -2931315, -270046, -394063, -4185983, 2991982, 3157338, -2489471, 991064, -1568200, 406948, - -2433636, -936840, -705985, 477278, 2716567, -1537598, 2375654, -1419487, -1716913, -219043, - 2204929, 2003602, -996432, -383326, 1253594, -2302103, 1821066, -722091, 81604, -1806571, - 761283, -2964064, -176094, 954020, -1880122, 1006096, - }, - { - 17516488, 34311420, -43204688, -16470663, -4553202, -28084792, -4029216, 13529147, 10475425, 7090991, - -5575405, -735513, -8309688, -5238787, 5280126, -1090385, 2003065, 19482508, -2421825, 3561065, - -3687230, -1592896, -10310606, -295816, -887985, -5922223, 3787624, 7994545, -15537044, 10810433, - -6470368, -4770098, 1447941, 2044404, -5657546, 1496796, 4508642, 3344706, 5323075, -1315334, - -4641786, 6928319, -271657, 1269163, -2339147, 7087233, -2057826, -1562831, 2461553, 3602941, - -2434710, -4488241, 3133179, 2034204, -2432562, 1167694, 987306, -1306744, 3686156, -1770600, - -2609730, 195421, 2138894, 2180770, -3277597, 2822867, 222265, -1430224, 2459943, -621697, - 234613, 48318, 1795833, -779000, 166430, -316754, -409096, 799938, -67646, 1372242, - -2449742, 768799, 2084133, 444529, -115427, -822486, -433255, -2052994, 444529, -1850594, - -1626719, 82678, 928787, 1740536, 362388, -307627, - }, - { - 2225867, -2248952, -120259, -7776575, -257698, 611496, 5507759, -66035, 1739462, 5165235, - -6349573, -15867757, -9078487, -4760971, 1625108, -12060805, 8179229, -483721, 6025302, -13667123, - -9992241, -12447352, -4889284, -12080132, 6244883, -2287607, -5491653, 21016348, 13231184, -1900523, - 3939559, -1014686, -7326678, -7264401, 1181653, 3196530, -3973382, 3817152, 8314520, 5126581, - 3417720, -8181376, -2104534, 9891310, -1977296, 1247151, -4194573, -5439039, -2139968, 4152160, - -2108292, -290984, -1617055, 322659, 122407, -2874944, 2192581, 507880, 4989679, -2795487, - 397821, 2250563, -440234, 4326106, 3507378, -2457258, 2430415, -2945274, -1648731, 347892, - -1231045, 894427, -181462, -679679, 1772211, 2834679, -2237141, 521302, -1966558, -102005, - -2143726, -664646, 2935073, -1722819, 2542621, -345745, -949188, 2680060, 172336, 1676111, - -1634772, 604517, 829466, -237297, -940061, 634581, - }, - { - -8655433, 64572148, -12060805, 11977053, 4151086, 6838125, 2030446, 13604309, -3653944, -5854578, - 5068062, 6489696, 11813308, -20699594, 7557532, -5033702, -11283953, -6210523, 9328669, 1494649, - 5631776, -1000727, -7388418, 20962662, -6195491, 6480569, 10735271, 3912715, 557272, 9656697, - 7242926, -6136972, 1270237, 1953673, -5344550, 1780801, 1101659, 3513283, -4858682, 4017405, - 2156611, 4599910, 201863, 8669928, -4679367, 7226283, -4673462, 7779797, -3804804, 6332393, - 4443144, -1594507, 2737505, -215285, 2892661, 897648, 3846143, -533113, -4871567, 7106024, - -942745, -397821, 84289, -1094143, 538482, -1306207, 1870995, 18254, 1626182, 1003412, - -474057, 309775, -1419487, 2462627, -1352378, 1971927, -66572, 8053, 1665911, -3993783, - 417686, 1148904, 1185948, -627065, 2432025, -581968, -804770, 1225139, 508417, 2275796, - 1475858, 2557653, 93416, -75162, 279173, 511101, - }, - { - -4285304, -10356240, 1720671, 4504347, -727997, -3779034, 4547297, -356482, 5988795, -2939905, - 2611340, -72478, -423054, 35080220, 111419504, -9480067, -2401424, -4413616, 3403762, 2873333, - 11191611, -9500468, 5629629, -2742337, -2398739, -13981729, -9223442, -9905268, -13878650, -5652177, - -2341831, 1525250, 4235912, 5886253, 7713762, -5601174, -5990406, 208843, 1663226, -9364102, - 421981, -1003949, 5630702, 3667902, -1757715, 12434467, -117038, 270046, -3300682, -2768107, - 4386236, -202937, 5800354, -4417911, 341450, -476741, -86436, -236760, -7389491, 3631932, - -1869385, 2903398, 330176, -3194382, -2926483, 4891968, 54224, -1061931, 2482491, 1711545, - 3797288, -1891396, 49392, -2149631, 2609193, 1057636, -2234994, -839666, 2409477, 1629403, - 489089, 1217623, -1139240, 987306, 2325188, 1188095, -687195, -2368675, 1487669, -2646237, - -1611687, 401043, -669478, -1547262, 129386, -876173, - }, - { - -15919296, 39927088, 1927367, -6801618, 4622996, -4208531, 7258495, 2139968, -1260036, 6970195, - 5228049, 7949448, 3487514, -23895050, -17499308, 6917582, -15103789, -11496017, -1648194, -4020090, - -5412196, -2439005, -6960532, -8728447, -2985002, -11093901, 2801393, 8216810, -565325, -8446053, - -6890202, 3701188, 86436, -618475, 4583804, -1572495, -11577084, 2316598, 642635, 4192425, - 9780714, -1933272, -5390721, 8016557, 4132832, 4745402, -1453310, -715649, -653909, 5170067, - 3360812, -3100967, -3231963, 2901251, 92342, 1558536, 4279935, 946503, -2069637, 288837, - 3121904, 1390496, -675384, 7029788, 925565, -5034239, -1124745, -835908, -2995203, -2391223, - 1938641, 2560874, 2253247, 151934, 454730, -3149285, -172336, 296890, -1850057, -2463701, - 785442, 60666, -1184874, -923418, -628139, -597537, 289910, -2203318, 624381, -316217, - -2240362, 22549, 313533, -178778, -62814, -1072668, - }, - }, - { - { - 304406, -42120208, -7528004, 42295228, -864899, -3636227, -7739531, -4129611, 7678328, 8575976, - -3991635, 3246995, 1159104, -2594160, 9906879, 9581535, -5759551, -6628745, 12367358, 4634270, - 7012071, -7854959, -2374580, 18931142, -3779034, 13525389, 2287070, 3379603, 3292093, -4531191, - 2195265, 9277666, -561567, 5587753, 5269925, -6426345, 6773701, 1231582, -7490423, -4489852, - -1120987, 2064806, -4645544, 1311576, -2516314, 185220, -3906273, 180389, -2821794, -4431870, - -3223910, -5025649, 177704, -3788161, 5299453, 1091995, -1009317, 4123169, 4785668, -166967, - -4955319, 2027225, 1432372, 116501, -4031364, -463856, -1921998, -37044, 626528, -395674, - 5230734, 1809792, 311922, -3366718, 577136, -2505577, 956704, 332323, 2042257, -2911451, - 157303, -838592, 189515, 1977296, -1996623, 758062, -1695975, 811212, -379568, 627602, - 217970, 890669, -916439, -208306, 355945, 479963, - }, - { - 22948548, 73724728, -29923574, 75240312, -20477330, -6887517, 7860327, -5214627, -8061117, -3695819, - -26277684, 1557999, -3363496, -965294, -8093866, -15090368, -585726, 10909754, 9051107, -1941325, - 4281546, 5401995, -8054675, 3983045, -1264868, 659814, -16498580, -1693291, -1657857, -388158, - -9159018, 2019172, 1388348, -4269198, -4916127, -1609002, 4731980, 13058848, 6199249, 5202279, - -1629403, 6896644, 8354785, 4845797, -2779381, 1238561, -4905390, -219043, 6226092, -4785668, - 1357210, -2415919, 2020782, -1855426, 1781338, 7850664, -129386, -2389076, -1338956, -2369748, - -4748087, 6172405, 614717, -278099, 1582159, 1644436, -1035087, 2590402, 5906, 317291, - -4300873, -603443, -235686, -1733556, 26307, -744640, 5017059, -1526861, -741956, -2437931, - -3534758, 693100, 905164, 238371, -1767379, 2581275, -3067144, 1877438, -2877628, 205085, - -344671, 1230508, 477278, 2766496, -1797444, -860067, - }, - { - -5712307, 45532560, 16386911, -61537756, 10573136, 15411953, -3393024, 11946988, -607738, 13043279, - 6102075, 2878165, -18301930, 15284715, -7230041, -912681, -3607773, 11585137, -10065256, -16038482, - 19544248, -3663070, 4446365, -1978906, 6664179, 15134391, 8218957, -1164473, -6006512, -1220308, - -788127, 4838281, 3417720, 3156801, 10548977, -6199249, -2895345, 5080947, -8020315, -6639483, - -4318590, -314069, -3382824, -3952981, -1075352, 4344897, -1736241, -465467, -1275068, 2721936, - -3939559, -1020055, -2036351, 1453310, -1194001, 755914, 4236985, 2779381, -2203855, 3321620, - -2217277, 2375117, 16106, -740882, -1367947, -203474, 2802466, -1998770, -380641, -1333051, - -1178969, -1571958, -4108136, -766115, 1269163, 1050120, 2598992, -51003, -637266, 2148021, - -1069984, -1851668, 1526324, -1027571, 633508, 118648, -535260, -575526, -440234, 1205812, - 1783485, 610959, -941135, -326418, 226023, -266825, - }, - { - -615254, 37155764, 379568, -6943889, 5469104, -346282, -156229, -2863670, 1223529, 3865471, - 8308614, -1228898, -5530844, -5585068, 7980586, -5279052, -11782169, -24696, 17052630, 7369090, - 3113851, 5706401, 14435385, 418759, -5311801, 25114822, 22929220, 11098195, -3587372, 1089311, - -776315, 3236258, -119722, 4697084, -8639327, -10331007, -9157944, -6166500, 5923834, 11145440, - 776852, 7934415, -1758789, -122943, -935766, -3898757, 1044751, -1945620, 1783485, 3035468, - -42413, -9776419, -4624069, 1427540, -491774, 2996277, 7002944, -345745, 2485176, 2725694, - 1851668, -2665027, -682363, -1438814, 4538170, 3670050, 2050310, -476741, -462246, 4153234, - 2589865, 1482301, -4654134, 322659, 3952444, 1520418, 3002182, -1322850, 664646, 3350611, - 207232, -1607392, -1988033, 560493, -2068564, -1557463, -616328, 1891396, -2674154, 46171, - -967978, 1380295, 3018288, 1413044, -390305, -753230, - }, - { - 13504988, 2398739, 8653285, -33332704, -4748087, 370978, -1069984, -12569759, -4444755, -14685030, - 12865038, -7454453, 2607582, 3376381, 13557064, -123480, 3037079, -16602733, 402653, 3292629, - 2497524, 11141682, -4810900, -2619393, 10005663, -5048197, -5556614, -7620346, 1374926, 3026878, - -4422206, 5065377, -147103, 5261335, -2341831, -4022237, -3870839, -6477348, 17544942, 6273874, - 8274255, 1487669, 1258962, 4692789, -252329, 7369627, 4042638, -3422552, 2512019, -2990371, - 813896, -2697240, 8123394, 2779918, 868120, 919660, -3164317, 2024003, -690953, 1196685, - 3608846, -3927211, -3987877, -4888210, 3317325, 2560338, 1379758, 2308545, -1044751, 3103651, - -212601, -1142998, -1107565, 1257352, 2879776, 1393717, -3343095, -3830574, -2621541, -660888, - -34360, 1209033, 1212791, 420907, -501974, 1590749, 836982, 2259690, 979789, 1137630, - 843961, 410706, -1692217, 69256, -635118, -484258, - }, - { - 11811, -19298898, 12824772, -2750390, -1993939, -807454, -50466, -4472135, 3674882, 891206, - 4564477, -3062312, 5250061, 19206020, 6167036, -24533390, 264141, 1267015, -12978854, 12308303, - 3962107, 483184, -8861591, 14453639, -8921184, 1155883, -8916889, 5974300, -11873437, -11506754, - -9610526, 6197638, 18159658, 7194607, 3085934, 5732171, -1960653, 2630668, 1046361, 5089000, - -8752070, 13249437, -940061, 422517, 1860258, -3355980, 7172596, 603980, 1804423, 3034395, - -4395899, 882616, 3129958, 4960151, 494995, -878321, -2214593, -959388, 3346853, 3354370, - 519691, 1247688, -84826, -1343251, 4976257, -150861, 404264, -1194538, 3533148, -1173600, - -4212289, -3000572, 3233037, 1739999, 2968359, 278099, -1331977, 1330366, 4272956, 1545115, - -1147293, 601832, 491237, 1839320, -206695, -333397, -120796, -3658775, 1377611, 1749125, - 1894081, -101469, -841277, 217433, -594853, 659278, - }, - { - 18777060, 64472828, 1349157, -15983721, -7410966, 2927020, 6075231, -6911140, -17279728, -7414188, - 13026099, 2583423, 1330366, 8546985, 1621887, 8003672, -13784161, -17689896, -12629351, -4306242, - 12174085, -7247758, -4833986, -12335146, 1644436, -9234180, 7727183, -934692, 5675800, -3335579, - -10855530, 6947647, 2910914, 8626442, 5080410, -3100967, 1869921, 748935, -4687420, -6177237, - 1071594, 3159485, -8274255, 6853694, 2100239, -5779416, 1219234, 4194036, 2489471, 5257040, - -2085744, -1569274, -1991791, -2377265, 3207804, 3113851, -750546, 3700114, 86973, 3491809, - 2209761, 2044404, 1522566, -85899, 1554241, 5060545, 836982, -1117765, -38655, -636192, - 19864, 620623, -710280, 1541893, -3096672, -2222646, -1521492, 1434519, 121333, -2063195, - 2552821, 1949378, 680752, 1166621, -1170379, -2427194, -761820, -941135, -261456, 1663226, - 627065, 2091649, -1054951, 190052, 499827, -1444720, - }, - { - -675384, -25282324, -1395328, -3789235, 4938676, -130997, -4396973, -4165582, -2475512, 2047089, - -3494493, 4502737, 958315, 20105816, 6291054, -11392401, 4908611, -3860639, -6203007, -8810052, - -4442070, 2713346, 7340099, -6423661, -6773164, -12541305, -16152835, 8117488, 4094178, 7028714, - 19933480, 1734093, 4345970, -5228586, 6578280, 1711545, -9250823, -1421097, -3798899, 4918275, - -1959042, -8049843, 1013612, 4527433, -13959, 4269735, 1589138, -1269163, -2854543, -605054, - 6747931, -4709432, -3048353, 1407676, -310848, 200253, -694711, -2037962, 2495913, -1992865, - 2935610, -1779727, 405874, 2727304, 2512556, 3344169, -317828, 4152697, 4317516, 2794950, - -441845, -1766842, -1349694, 1517197, -597000, 275952, 1911797, 2640331, 2096481, 1439351, - 1904818, -1780801, 627602, -947040, 794569, 774705, 73014, 1621887, 871342, -1163936, - -513249, -2623151, 119722, 178241, 1473711, 580894, - }, - { - 35056596, 54679228, -7625178, -35556960, -180389, 9809168, -2348273, -8302709, -3253975, -638876, - 24515136, 11328513, -6756521, -9250286, -18079128, 1902671, 10927471, -6874632, -13443785, -256087, - -7558069, -2913062, 1997697, 6589017, 10231686, 7754027, 2977486, -1400159, -2653216, -606664, - 7366943, 11096585, -504659, 4604742, 4481262, 1017907, -8825084, 949188, 1918777, 6212134, - -1591285, -1727651, -4920959, 5206574, 438087, -10142028, 4682051, -1618129, -8220031, 1738925, - 6135361, 717796, 6687264, 4674535, 2021319, -3339337, -1001801, 96637, -1328219, -6273337, - -4418985, 778463, -2064269, 5509906, -189515, -1121523, -1387274, -3681861, -2309619, -2537252, - 845572, 1826435, 400506, 2494839, 117575, -703838, -525597, 17180, -3151432, 2134062, - -2168422, 1883880, 413927, -227633, 1462973, 1345399, -789200, -1591822, 77309, -361314, - 176094, -505732, -830002, -750546, 863825, -104690, - }, - { - -3750043, -22505092, 18241262, 2244657, 6668474, -2618320, 22706418, -38655, -7880191, -3365107, - -17660906, -584652, -9484898, -8661338, 1210107, -2372433, -20270098, -7477538, 3151969, -970126, - 4350802, 8898098, -2531883, 10786810, 3996467, 10247255, 6338835, -4420058, 5104569, -392453, - 7800735, 1801739, -9525701, 12840878, 3653944, -741956, -2551211, 430570, 9944997, 694174, - 4482335, -3925600, 4147865, -2908767, -4232691, 4868346, 2770254, 3854196, 6025839, -896038, - -4479651, -695785, -4190278, 506269, 3106872, 3266323, 1344862, 8715562, 472983, -248571, - -1675037, 1215476, 2780991, -1730335, 1697049, 2267743, -2987687, -1292248, -5018133, 1184874, - 1517734, 1469953, -2568927, -2627983, 1956358, -1966558, 1301375, 753230, 2442226, 1641214, - 2389076, 1166084, -2314451, -2936684, 926639, -290447, 2287607, -1184337, 411243, -1110786, - 577673, -1192927, 1449015, 1186485, -2384781, 1051730, - }, - { - -21791054, 39996348, 10707353, -11980274, 229781, 21840982, 46721192, 14794015, 11472931, 5232344, - -9592809, 10477036, 2729989, 6577206, 18988050, 9147207, 5479305, 9978283, -15831786, -6369437, - -3038689, 11866458, 6276558, 3579318, 4430259, -5421323, -438087, 12196097, -7881265, 7175280, - -2325725, 6617471, -486942, 2348273, 3769908, -1222455, -6228240, -722091, 1442035, 2720325, - -362388, 3044058, -3115999, 1591285, -4160213, 3244311, -3668439, 1800665, 4981089, 1233729, - -2829310, -5129265, 5180268, 3591130, -5095979, -3654480, 455267, -1166621, 3605625, 942208, - 71404, -2520072, 413391, 2332167, -320512, 3813394, -278099, -3179350, 302795, -2872796, - -153545, 1199907, 876173, -1763621, 721018, 904091, 1619740, 2066953, 572841, -202937, - -3534758, 70867, -250719, -1526861, -356482, -1166621, 408022, -220117, 842350, -1524177, - -1928440, 108448, 1741609, 1037772, -603980, -867583, - }, - { - -2141578, 15902653, 22662932, -6727530, -1765768, 995359, 8941048, 1281511, 1413044, 207232, - 3614215, -2804614, -6252399, 8917963, -7926362, -22370874, 11832098, 3796214, 10547903, -838592, - 1313186, -4810364, -10065793, -11009612, 6082211, -1394254, -5166309, 6999186, 1434519, 2296197, - 8773544, -2326799, -361851, -5626407, -6535330, -4143570, -9909563, 2583423, 10025527, 3821447, - 1557999, -5497558, 4402342, 14865956, -409633, 2858838, -3859028, -1200443, -784368, -5457293, - -7226283, 2084133, 1251983, 2888903, 1305133, -6001143, -1880122, -1280437, 947577, -3607236, - 1893007, 4500589, -1972464, 584652, 4114579, 1831804, 6299644, -804770, -322123, 1793149, - 1292785, 3351148, 438087, -631897, 1267015, 411780, -2733210, 1692754, -1651952, 27917, - 950798, 623844, 1794223, -1401233, 2335925, -2408940, -2241436, 1549946, -2379412, 1060857, - 590558, 849330, 20401, -1161252, -897111, -1423245, - }, - { - -8284455, 75612896, -6513855, 14244796, 6846178, -19643032, -14531485, 12948790, -134218, -7892003, - 8086350, 17631914, 11995844, -9644886, 28108950, 12895639, -198642, -2428267, 5349382, 8032663, - 12411382, -224412, -15344308, 4866198, -21882858, -5776731, 2857764, -2237678, -6253473, 10098005, - -1572495, -6462852, 12596065, 6305549, -864899, 6540162, -3174518, -972273, -2058900, 10231686, - 3545496, -5492727, -7072201, 7299834, -3459059, 9458055, -5527623, 738198, -10204842, 7100118, - 3506841, -3212636, 6077916, -1277753, -1763084, -564788, 2118493, -274341, -3631932, 6156299, - -545461, 155156, 712965, -3862249, -1785633, -10737, 136365, -4815195, -587337, 2516851, - 2920578, 2459406, -1289027, 1713155, -1634772, 1928977, -808528, -594316, 2003065, -2067490, - 685047, -626528, 12885, 117038, 2111513, -303332, 84289, 1624035, -162135, 347355, - 838592, 2978023, 1051193, -333397, -866510, 416075, - }, - { - 3871913, -12880607, -6941741, 10487236, 8725763, 6182069, 9055402, -3726421, 4781373, -4709432, - 1490891, 561567, -1864553, -42071888, -12207908, -24380918, 7761543, -15000710, -10860899, 5930813, - 3744675, -20611012, -9007620, -8653285, -3187403, -8827768, 780610, -156766, -10835666, -4469987, - -9507984, -7370164, -3682935, 5905580, 16216723, -1290638, -6222334, 5393942, 4430259, -14568529, - -9357660, -7919383, 486405, -2020782, -7662222, 4939750, -3262565, 4169340, 4698158, 3476239, - 7786239, -1171989, 4309463, -9101036, -499827, 1039382, 801548, 2498597, -11583527, -1432909, - -1930051, 2639258, 2815351, -515933, -4533875, 824097, 920734, 156229, -190052, -974958, - 5417565, -2066953, 856309, -1897839, 2393371, 1436130, -1955821, -2297271, 701153, 1201517, - -1185948, 1032403, -363998, 1422171, 2853469, -744103, -2497524, -1767916, 3352759, -3304441, - -1131724, 869194, -1810329, -1130113, -1260036, -1485522, - }, - { - 5735392, 77039368, 6619619, 213138, 4337917, -22807350, -2866891, -4788889, 998043, 8201240, - 10337986, -2642479, -3642669, 13051869, 31117038, 9191230, -16990354, -13175349, -233539, 2412161, - 3599720, 8701067, -2251100, -1221918, 14255533, 4173635, 5289252, -1213328, -10165114, -753230, - 4032438, 12407087, 10569378, 2587718, -2705293, -6432251, -8429947, 11943767, 9089761, 3902515, - 8303783, -4973036, -5355288, -2387465, -3282966, -1272384, -5920076, -9849434, -8790724, -1549946, - 434865, -2382633, 1574642, 6148783, 733903, 5245229, 5071283, -328565, -3664681, -1389959, - 5135707, 2997887, -2885681, 1423245, 467078, -21475, -597537, 620623, 1376537, 1634772, - -1099512, -1682554, -2771328, -2092186, 141197, -2453500, -779537, -1470489, -3330210, -1087164, - 1421097, -917512, -1377611, 884763, 148713, 141734, 1398012, -396211, 562641, -113280, - 499827, 904091, 71941, -545461, -271120, 443455, - }, - }, - { - { - 1028645, -64508800, 4415764, 29436096, 14849313, -7791608, -2615635, 2269890, 933082, 1463510, - 11829414, -7577933, -8265665, -7378217, 21825414, 11508902, 7707319, -18176838, 2352568, 18173080, - 4793721, -5630166, -6584722, 16006269, 5100811, 3145527, 9352828, -3711926, 7133941, -5414343, - 11574400, 9010305, -5787469, 10273025, 4616016, -2045478, -1597191, 69793, -9899900, 1351304, - -8201240, 436476, 1241246, 259309, -2922188, -9031779, -403190, 5560909, -1473174, -6031745, - -4337917, -6220187, 1207960, -4473209, 2022393, 4248797, 1701881, -826244, 4607426, 282394, - -2977486, 2669859, 1710471, 963683, -3325379, -1947231, -2230699, 803696, 53150, 2367064, - 3617973, 1331977, -57445, -331249, -384400, 44560, -2850248, 3490198, -513785, -1404454, - -1446330, 310848, 150324, 2181307, -391379, -427349, -1703491, 1208496, -374736, -448287, - 1228361, 271657, 265751, -57445, -763430, 646929, - }, - { - -24570972, 44130252, 38962332, 27275726, 12004434, -9439264, 8341900, -10622528, 5733245, -15334644, - 3311420, 3450469, -17302276, -8975945, -6487011, -16186121, 13099650, 3650185, 9087077, 5670968, - -41876, -3664144, 1473174, -299574, 2988760, -1649804, -15000173, -5428839, -2398202, 2718714, - -5706938, 1391033, -3800509, -680752, -4364761, 525597, 4365298, 10435160, 3628711, 7827041, - -705985, 4381941, 10954851, 2988224, -213675, -3272765, -1184874, -4283693, 5731634, 773631, - 494995, -1534914, 5899675, -427349, -184147, 2804614, 4046396, -4210679, -908922, -1010928, - -2819109, 1027034, 1373853, 1242319, -3013457, 3935801, 359704, 3950296, -1306744, -287226, - -1906966, -2291902, -1015760, -679142, -293668, 1961190, 1975685, 1301912, -4083440, -2572686, - -2116882, -235686, 1479079, -1446867, -1317481, 926639, -626528, 581431, -1723893, -717796, - -916976, 1144609, 1141388, 1750736, -361314, -1216550, - }, - { - 3289408, 98420784, -25441238, -44846976, 1612223, 7803956, 6696391, 2720862, 7458748, 3607773, - -3992172, 6570226, -4417911, 4199941, 3874061, -9389872, -4066260, 11098732, -8963060, -4731444, - 9198746, 4129074, -1906429, 2331630, 18180060, 10583336, 3110630, -1652489, -11559368, 538482, - 903554, 4311074, 1066763, -910533, 10095858, -432181, -512175, 369367, -4932233, -10614475, - 1174137, -2850248, -6622303, -1546188, -1137093, 599685, 1011465, 2644626, 1074816, -5303748, - -745714, -2241436, 500901, -972810, -1064078, 880468, 5139465, 1371705, -307090, -1613834, - 3358128, 1060320, 141734, 142271, -2347737, -207232, 1801202, 1936493, -5743445, 195421, - 2637647, -4239133, -2814814, -1734630, 385473, 3421478, -1098438, 753767, 869731, 1016834, - -2973728, 918049, 1187559, -620623, 1229971, -382789, -551366, 351114, -745177, 1284195, - 682900, 1290638, 971200, -1704565, -835908, 1418413, - }, - { - 431107, 34065532, 2833605, 397284, 127775, -478889, -1144609, -2263985, 2551211, 3204583, - 8240432, -8398809, 2457258, -4286378, 13085155, -8114804, -17831630, -6454262, 32101660, 14223321, - -8822400, 4853850, 26840324, -9780714, -2529736, 17665200, 22646288, 7272454, -4861366, -404264, - 14311905, -6118181, 51003, 5019206, -10944650, -12247099, -5411659, -3077881, 5985574, 4372277, - 8247948, 6476274, 865436, 44560, -330712, 878321, -5985574, 694711, -2516851, 4990215, - -959925, -5692443, -9394167, 1959042, 7021198, -1267552, 4396436, 1716376, 1110786, 559420, - -955093, -292058, -1964411, 370441, 3536369, 2340220, 815507, 1509681, -2266132, 5222144, - 1650878, 860604, -3024194, 2241436, 3052111, -896038, 4006668, -1371705, 6979, 1855426, - 59593, 1011465, -1913408, 716186, -3612068, -860067, -1455994, 1901060, -1262720, -993211, - -478352, 2525978, 1722819, 585726, 493384, 536334, - }, - { - -9652402, 50484120, -10198400, -43007656, 9780177, -570694, -3929358, -4277251, -12304544, -4622459, - 18601504, -34426312, -1604170, 13806709, -6570763, 20609400, 578747, -3369402, -564251, -627602, - -1503775, 12396886, -3654480, -2379949, 6239514, 1991791, -4416837, -1020592, -7594039, -2250026, - 7759396, 2695092, -1524177, 9034464, -10162429, -4019553, 2952790, -129386, 10014790, 10404558, - 3845070, 4768488, -5021354, 6400038, 830002, 8937290, -4373351, 5704791, 1286880, -394063, - 1109712, -1178969, 2266132, 4882304, 1997697, -374199, -725313, 1473174, -507880, -675921, - 4657355, -6979859, -217970, 192200, -3983582, 4221416, 2368675, -1319092, 2134062, 2551748, - 1270774, -1655710, 138513, 872415, 2454574, 1854889, -2021856, -5326297, -1193464, -782758, - -2338610, 2805688, 1325534, -955093, -677531, 3262028, 967978, 2221572, 1305133, -627602, - 652298, 355409, -1154273, -380105, 1449552, -1603097, - }, - { - -1314797, 4061965, -4851166, -1434519, 1701344, -1888712, -1256278, -981400, 1923072, -1570884, - 4866735, -628139, 3877282, -1109175, 9949292, -11538967, 4305705, -1683627, -6343130, 9838159, - -9800578, 8034810, -3384971, 8826695, -12704513, 569083, 855772, -6942278, -13408888, 4261682, - -5625334, 1089311, 12431783, 6104759, 207232, 8917426, 6979859, -2869575, 1655173, -392990, - 7054484, 1974611, 3788698, -1163399, 2011118, -2566243, 5739687, 1870995, -1059246, 3525095, - -2109903, 411780, 498216, 3527779, 4260071, -5219996, -233002, -318901, 1723356, 4566087, - 325344, 1961726, 880468, 496069, 3391414, -3573413, 4969814, -1508607, 1235340, -2749853, - -513249, -3548180, 1692754, 1738388, 2925410, 105227, 63351, 1438814, 2558190, 1973001, - -411243, 1114544, 133144, 813359, 175557, -7516, -1483374, -2029909, 1100585, 1344862, - 779000, 238908, 445603, -57982, -973347, 365072, - }, - { - -5284958, 98782640, -4206384, -26827440, 15117211, -4307852, 2903398, -2555506, -14171245, -200253, - 14652818, -10041634, 8715562, -2551211, 10618233, 9292162, -9097814, -21201032, -19908248, 5648956, - -4727149, 397821, -6187438, -5002563, -15200426, -906238, 9688909, 1721745, -4742181, -193810, - -3381750, 368830, -1643362, 7802345, 6038187, 3644817, -6295885, 5797132, -4665408, -488553, - -2609193, 2631204, -4435091, 4323959, 3532074, -7448547, 294742, 8983461, 4657892, -3659312, - 1055488, -3364033, -579821, -2995740, 3052648, 1258425, 3310346, -593779, 4196720, 1505923, - 3036542, 5458367, -2585570, 1147830, 4185983, 1371705, -292595, -1287953, 2118493, -1846836, - -372052, 1775969, 870268, -167504, -3002182, -931471, -2081449, 458488, -189515, 1311576, - -32212, 2711735, -26307, -306016, 937914, -2093260, -1381369, -1644973, -1084479, 2665564, - 904091, 869731, -100932, 1240709, -727460, -222801, - }, - { - -2336999, -18022756, -2150705, 2690797, 103079, -2631204, -2649458, -2703145, -3550327, -2140504, - -1894618, -881005, 6258841, 13840532, 7687455, 4661650, -16486769, -4842039, -16577500, -1644973, - -2894271, 2712272, 4329327, -9911711, 4110821, -11074573, -11140071, -8884140, 14151917, 10999411, - 14148696, -6378027, 17020418, -11303280, 10168335, 2790118, -7716446, -7482907, 1094680, 3258807, - -477815, -10248866, 6061810, 2600066, -825707, 2818036, 4607963, -4133906, -3723737, 2960306, - 2772402, 2645163, -3565360, -525597, 1001801, -3295851, 1115081, -2376191, -2930778, 1906429, - 4621385, 908386, -2074469, 890132, 4138738, 1036698, 4474819, 302795, 4875862, 5075041, - -1214939, -1529545, -1150514, -623844, -494458, 804770, 2262374, 1644436, 1738388, 2491618, - 707596, -1429150, 2430415, -1432372, 726923, -356482, 1031329, 958851, 1057636, -1239098, - -619549, 9664, -2246268, 350577, 2041183, -318364, - }, - { - -35136592, 157297808, -24412594, -33143188, 10327786, 7630547, 7485591, -23365696, 19945292, 8591545, - -616328, 23965918, -16471736, -16204912, -2365990, -851477, -2164664, 11003706, -15173583, -11894912, - 2302103, -2449742, -517544, 3979287, 5463736, 13590887, 46171, 1396401, -1789928, 287763, - 3127273, 8840653, 81068, 6039261, 4583267, 1653562, -16461536, 9469329, 4054986, 3386045, - -2658048, -1932735, -6192806, 8687108, -1119913, -9074192, 4179540, -1788854, -4286914, 3824132, - 1842541, -540092, 7977365, 5782637, 59056, -4906464, 55298, -932008, -1984275, -2772938, - -5015985, -1073742, 2449742, 2718714, -788663, -1472637, -1117765, -3998078, -2188823, -2764885, - -152471, 1333587, 1973001, 2637647, -960999, -1199907, -648003, -1425929, -1726577, -112743, - -1314797, 3821447, -1603097, -388158, 3610994, -1487132, 1064615, -1038845, 112743, -520765, - -1395864, -265751, -90194, 1113470, -1328756, -116501, - }, - { - 5100811, 284005, -4351876, -3664144, 9568113, 9558450, -1451162, 1765768, -9019431, -3693672, - -15162308, -10562935, 3171297, -5086852, 16643, -1309428, -12419435, -6429566, -2085744, -14244796, - 14076755, 7490423, 9881646, 2010045, -2015950, 18014704, -52613, 1098438, -3464965, 5477157, - 12701829, -12719546, 6628745, 15509127, -3621731, 8272644, -2936684, -3391951, 5142687, 4037269, - 3638374, -3288871, 2813204, -4747550, -3487514, 4812511, 2732673, 3012383, 5063767, 158914, - 2008434, -3797825, -6747394, -2168422, 5634460, 2168422, 1034013, 7326141, 2258079, -499827, - -301721, -394600, 1371705, 3626026, -3440806, 4886062, -1411971, -4285841, -3793530, -1717450, - 3965329, 2144799, -4229469, 962073, -466541, -1126355, -308164, 773631, 2799245, 2416993, - 3325379, -607738, -1854889, -1671816, 1178432, 326418, -720481, 1097901, 420907, -1300838, - -1279363, 1260036, 288300, 711891, -1461900, -40265, - }, - { - 26520886, -9143449, -3347927, 12977244, -390305, 23190140, 27809376, 24732570, 5534602, -1725503, - 2571612, 2695092, 7608535, 11889006, 9538049, 11409044, -7404524, 14704357, -14405857, -1438277, - -7352447, 20913270, 9196062, 182536, 5988258, -158914, 2084133, 3266323, 3763465, -8245801, - 11840688, 8250632, -10399726, 5643050, 4053912, -7362111, -2255932, 577673, -8618926, 10875394, - -1685238, -2430415, 2212982, -4740034, 2549600, -386547, -148176, 3395709, 2737505, -3169149, - 2226941, -5303748, 2954401, 657667, -3401614, -3853660, 2774012, -887985, -2415919, 3869766, - 2614561, -3599183, -2396592, 496069, 2195802, 975494, 1197222, -1848447, -1006633, -3172907, - 955630, 1420560, -198105, -1111860, 1028108, 685047, 3388192, -814970, 1227824, -501437, - -1050120, -1114007, -1238561, -1280437, -1155883, 1588601, -365072, 1100585, -1565516, -537408, - -46171, -184147, 1170379, -45097, 1609539, -1697049, - }, - { - 2211371, 28998546, 4362076, -5369246, -4110284, 7414724, 9588514, -4825396, 7515656, -3637301, - 7128035, 1505923, -4239133, 3635690, -28107340, 3522947, -6478958, 19891604, 888521, -10633265, - 9120900, 10440529, -24624122, -490163, -9708237, -5276368, -370978, 9547712, -14550812, 13649406, - 8086350, -5057324, -2580202, -4526359, 420370, -7308424, 2963528, -2793876, 4962298, -2129767, - -801548, 1305670, 9243843, 9823127, -291521, 4621922, -2746632, -3377992, 1642825, -7873749, - -5121212, 1909113, 1952600, 1432909, -1469953, -3120294, -3526168, -5946382, 1853815, 2636036, - 335544, 1396938, -28991, -2725694, 5827197, 2103997, 3364570, 2270427, -275952, 527744, - 2787971, 4413079, -358093, -1009854, -184147, 226023, -438087, -912681, 23622, -1171452, - 1250909, -662499, 1729798, 962073, -268972, -2629057, -1165010, 480499, -2165201, -19864, - 3171297, 204548, -777926, -447750, -560493, -1470489, - }, - { - 25013352, 33259690, -7593502, 3043521, 18815714, -21780316, -11592654, -1727651, -2914135, 21238076, - -3084324, 8762270, 9106941, 1560147, 19735374, 5082020, 3680250, 16624208, -11618423, 25279104, - 3424700, 3977140, -16856136, -13829795, -863825, -1467805, -3508452, 1706176, -11553999, 7732015, - -2644089, -549756, 2055142, 9119826, -4320200, 10570451, -3595425, -2153389, 6773701, 406411, - 2666638, -10179072, 1493038, 1881733, 1754494, -3106872, 6786049, -3733937, -3584150, 6238977, - 1730335, -4133369, 4576825, 4320200, -5222680, -782221, -2345052, -1586990, -97711, 996969, - 595390, -653372, 2308008, -1196685, -5936182, 41876, 147640, -1190243, -3957276, 2877628, - 1772211, 816581, 4277788, 193810, -1331440, -579821, -1276679, 2589865, -1363652, 227633, - -662499, -350040, -748398, 4166118, -294742, -1066763, 647466, 3142842, -938450, -1915019, - 2428804, 1205812, 2643552, -146029, -185220, 667331, - }, - { - -3436511, -29260538, 15840913, 4839892, 6636262, 3559454, 10704132, -107374, -3578782, 789200, - 911070, -3483219, -5588826, 1883880, -75322456, -8302709, 7141994, -13346074, -10499048, 15214385, - -14249628, -4853313, -20002200, 4445291, -11647951, 3069291, -13813152, 12928925, -11156178, -6587406, - -17143898, 512175, -6264747, 12276627, 6170258, 1461900, -6297496, 6023155, 9594957, -11638288, - -9752797, -7792145, -574452, -4975720, -6401649, 6823093, -5627481, 451508, 8919036, 1088237, - 14573361, -4575751, -683974, -2351495, -2361158, 827855, 3167002, 616865, -8937827, -4289062, - 2371896, -1193464, -461172, 1480153, -98247, -4176856, 3774203, -1490354, -475668, 915902, - 2105608, -1080721, 3285650, -212601, 498216, -734976, -848793, 930934, 471910, 162672, - -2086280, -941672, 1198833, 1353989, 1813550, -1351841, -2114735, -256624, 1897839, -1651415, - 132607, -923418, -2170032, 235149, -1531693, -291521, - }, - { - 9551470, 58783608, 17578764, 11324218, -6758131, -17853642, -6517076, -5550709, 4203699, -10406169, - 25895432, 1046361, -20841328, -5071283, 63353988, 1508070, -15685221, 4780299, -6604586, -1807644, - 3223910, 6960532, 3246995, 4561792, 11310796, 5592048, 15556908, 52076, -22371410, 4995584, - 4922570, 6335077, 5891085, 11081552, -4829154, -9343164, -5004711, 4690641, 20316270, 2813204, - 2697240, -9932112, 1777580, -5967320, 2704756, -1702418, -2372970, -15363098, -6586869, -7598334, - 456340, 2239289, 1811403, 530428, 4316442, 7683697, 1740536, -1943473, 2975876, -2730526, - 2069637, 966905, -223338, 1605244, -2475512, 6337224, -1015223, -2776160, 2575370, 6048925, - -3633006, -2732673, -3740380, 1114007, -2231773, 952409, -3164854, -1618129, -1657857, -1707786, - 27917, 1586454, -1560147, 1178969, -577136, 812286, 245887, 2013266, -626528, -1847373, - 2281702, 793495, 261993, 143345, -1513439, 1596654, - }, - }, - { - { - -920734, -60347512, 7643968, -1292248, -6158983, -2521146, 5365488, 8045011, -5987185, -13118441, - 246424, -19252728, -13970992, -1263794, 27995670, 9802189, 15038828, -3499862, 4672925, 27249956, - 6291590, -19117436, -13548474, 1880659, 315680, -6471442, 7394323, -2430952, 3349001, 6718403, - 19285476, 11968463, -5068062, 3623879, 2565706, -1853278, -286152, 2603287, -4935991, 3206730, - -6425808, 605590, -1617055, -5759015, -8590471, -8102993, 2683818, 2565169, -1118302, 222801, - -199716, -7882876, 679679, -4203699, -3621194, 1738925, 4304631, -2466385, 752156, 2596308, - -1133335, 1847910, 628139, 1644436, -1637456, -1034550, 1317481, 3470871, 431107, 1480690, - -267899, -2336999, 946503, 2649458, 808528, 2360085, -2375654, 3457449, -606127, 641561, - -151398, 1326608, 413927, 1134945, 355409, 1975685, 204011, 1833951, -229244, -1010391, - -69256, -572304, 797253, 1276679, 751082, 1387811, - }, - { - 26345866, -3489124, -33588792, -10749229, -5566815, 2460480, 13967771, -2123325, 7690139, -5728413, - 25164750, 2117956, -14198088, -8070781, -1510755, -9939091, 11518029, 6456947, 15919833, 5422933, - 1682554, -4313221, 4851166, -1348083, 5497022, 2539400, -7490423, 732292, 1384053, 4884452, - 5200669, -176094, -1516660, 3488587, -9853729, -5259188, 1318018, 3080565, -1382443, 4742718, - -2705293, 4215511, 3325915, -7016903, -2787434, 1404991, 9265855, -1064078, 1178969, 1222455, - 4543002, 3628174, 7733089, 3548180, 661425, -6738804, -736050, -861141, 3648575, 1479079, - -3814468, -1927367, -1319629, -365072, -4205310, 3536906, 1307818, 4175782, -219580, 79457, - -1170916, -440234, -345745, -86436, 543313, 1248762, -911070, -511101, -3877819, -173946, - -900869, -791348, 1517734, -1250372, -602369, 807991, -789200, -54761, -457414, -39728, - -175557, 528818, -1022202, 702764, 141197, -962073, - }, - { - -929860, 144543904, 15413027, -886374, 21163988, 845035, 2242510, -10006200, -5841693, -13357885, - 2754148, 16532403, -2509335, 4295504, 9762461, -12324409, -5557688, 8677445, -1903207, 3985193, - 4052302, 7242926, 2607045, 3311957, 14977088, -1605781, -3727495, -944893, -13433047, 1748052, - 8414915, -1613834, -11025718, -6970195, 5507222, -380105, 1793149, 697932, 2681670, -4870493, - 5987185, 2822331, -3643743, -2719788, -4137127, -3832185, -2163053, 3104188, 5825587, 789200, - 1291711, -4468914, 3577171, 1369558, 2247879, -839129, 2550674, 1482301, 4462471, -1343788, - -734976, -2022930, 263604, 744103, -551903, 1903744, 1815697, 1876901, -6183679, 505196, - 2960843, -3646964, -416075, -974958, 476741, 2238752, -5080947, -1446330, 1006096, 2561948, - 32212, 3762391, 2156611, -826781, 1453846, -234613, -744640, 1084479, 217970, 97711, - -1453846, -13959, 1685775, -213138, 28454, 495532, - }, - { - 550293, 29633126, 2712272, 4170950, -1503775, 1076963, 2025614, -149250, 1416266, -2719251, - 3615826, -8108899, 1935957, -4597763, 22143240, 18105972, 1501091, -4555350, 32163936, 15037217, - -13035226, -3491809, 17506286, -8000451, -5017059, -7508677, -10098005, -8879308, -9716290, 421444, - 8763344, -11848204, -3468723, -3171833, -3764002, 4602595, 7211787, -6709813, -2773475, -325344, - 6429566, -2398202, 761283, 8461622, 6575595, 3499862, -4924180, 2346126, -4871567, 2160906, - 1371705, -269509, -4845797, -1540283, 4109747, -5422933, -908386, 2018635, 858993, -720481, - -2185065, -644245, -1502702, -1221381, -899259, -712428, -2747705, 484258, -3377992, 287763, - -188442, 260382, -4094178, 61740, 1340030, -3517578, 866510, -2126009, -1960116, -135291, - -61203, 3121904, 947577, 1290638, -3062849, 637803, -269509, 1029718, -936303, 570694, - -944893, 482647, 25770, -306553, 125628, 1191317, - }, - { - -1595580, 94087168, 20179904, -51241644, -5759551, 121870, -938987, -8307004, -16167331, -12865575, - 13419088, -26358752, -5260798, 5529771, -12144557, 22444962, -663036, -7343321, 5167920, 9358734, - 1300838, 9011915, -2327336, 5356898, 10770167, 9255655, 8706972, 16408386, -2630131, -4564477, - 10047002, 1015223, -6200859, 6364605, -8720931, -4735202, 11180874, 1381906, -2897492, 5723581, - 1673427, 5033165, -4727686, 7120519, -2864743, 6013491, -4428112, 4385699, 1450088, 2932389, - 827318, -2515240, 311922, 5741835, 3235184, -2563559, -229244, 2916283, -653372, -5660230, - 5264556, 1221918, 7123740, 947040, -6526203, 2085744, -1033477, -1547262, 1063541, -515396, - 1862405, 1132261, 298500, -647466, -294742, 1837172, 768262, -2302639, -189515, -1214939, - -3357054, 2287607, 155693, -1322850, 914828, 1693291, -2308545, 459025, 1917166, -852014, - -846645, 1088237, 310311, -663572, 2273112, 187368, - }, - { - -185757, 22487912, 2292976, -1936493, 139586, -2351495, -73551, 1528472, 1858647, -5308580, - 1505386, 1423245, 1366337, -8988293, -2165737, -7937100, 12645457, 2547989, -705448, 21150566, - -8400419, 9305584, 1096827, 7887171, -14887430, 956704, -1705102, -3306588, 3266323, 23432268, - 945967, -13339632, -7838316, -2281702, 216896, 5686537, 3489124, 491774, 2076617, -5182415, - 11533598, 7401840, 8012799, -466004, 2372970, -5013301, 1848983, -4159139, -8761733, 1918240, - 788663, 2348273, 682363, -1141388, 1896228, -3467112, 2424509, 721018, -1523640, 1072668, - -439697, 1944547, 908922, 1039382, 3220152, -3678103, 6179384, -175557, 99321, -4637491, - 1111860, -3229816, -1759863, -1567126, 489626, 1588064, 1145146, 113280, 804770, 372588, - -556735, -378494, -283468, 701690, -889058, -470299, -291521, -896574, -304943, -971200, - 80531, 991601, 70867, 9127, 20401, 429497, - }, - { - -16339666, 118656528, 34092912, -29954176, -1438814, -9771051, 3524558, 8733816, 487479, 10698227, - 14504641, -17448842, 4643934, -15333570, -2160906, 2161442, -5364951, -8538932, -2764348, 8309688, - -12011950, 626528, -9470403, -3877819, -4408784, 459025, 2257542, -248571, -3622805, 3540664, - 677531, -2800319, -7754564, -1010928, -343597, 517007, -4391067, 9566503, -159988, 5595806, - -292595, 2452963, -154082, 2707977, 1081795, -1579474, 1258425, 1130113, 4581657, -2997887, - -292595, -4044786, 2250563, -2045478, 2271501, 2704756, 5264556, -2120103, 427886, -2868501, - 2079301, 2961380, -3746285, 1379758, 2018098, -1722282, -1187559, 722091, 2346126, -2197950, - -1886564, 1175747, 632434, -820876, -2040646, 576599, -1780801, -565325, 134755, 1810866, - -1979443, 1752884, -328028, -1019518, 706522, -1055488, -610959, -947040, 578747, 2758980, - -768799, -186294, 592706, 2307471, -46708, 314069, - }, - { - 796180, 7361037, 7528541, 3980898, 1056025, -867047, 972273, -430570, -4233227, -969052, - -1734093, -2256469, 1243930, -8039642, -6222871, 6289443, -33498060, -25628606, -12762495, 9409736, - -9295383, 1061931, 12222403, 259846, 6784438, 1847910, 6544994, -8374650, 4484483, -7353521, - 4277251, -6566468, 12416750, -7537131, 8286603, 321586, -139050, -4886062, -5874979, 3343095, - -1097901, -8568460, 5172215, 1118839, 1588601, 3986804, 3371549, -3911105, 1311039, 2163053, - -957778, 7607461, 329639, -2442226, -1245004, -8604967, 1731946, -1057099, -4149475, 3115999, - 6339372, 683974, -2547453, 1815161, 2024003, -1497333, 1867774, -4967130, 1213328, 2121714, - -654983, 1431298, -491774, -1008244, -711891, -987843, 463320, 595927, 358630, -729608, - -2109366, -2079838, 2100776, -1063004, 680752, -1879585, -703838, 1233729, 1869385, -258235, - 479963, 2229625, -297963, -718333, 39192, -992137, - }, - { - 24659554, 271473600, 22083648, -23698556, -7633231, 6401112, 23109072, -7301982, 27807228, 2207613, - -18875308, 13421236, -1212791, 7260642, 8035347, 3834869, 3294777, 18027052, -8624831, -12818867, - 927176, -12298102, -9522479, 1426466, -4301410, 535797, -3213173, 7304129, -964220, -195421, - -5026723, -5043366, -4490925, 3740380, 1910724, -2526515, -12540231, 17131550, -992674, -5800890, - 2206003, 8244727, -3501472, 5479305, -167504, -7293928, 3668439, 3474629, -90194, 2856153, - 452582, 1881733, 4565014, 2316598, 4272419, 1438277, 3204046, 829466, -1917703, -1162326, - -2596845, 1195612, 3961034, 27380, 3221, 526670, -381178, -116501, 528818, -461709, - 454730, -373662, -751082, -348966, -1265405, -718870, -1671279, -905701, 1574642, 1015223, - -2015413, 2298881, -95026, -1138703, 2077690, -1813550, 675921, 1042603, 2037962, 257698, - -568546, 1287953, 1684164, 2143189, -1928977, -586263, - }, - { - -5461588, -653909, 1227824, -2118493, 4934381, -944356, -15061377, 1638530, 1960653, -802622, - 1089311, 3976066, 11214696, -6487011, 306553, 10693395, 5733782, 4311611, -12158516, -14457397, - 18316962, 3779034, 2983392, -3766686, -7252589, 6655589, -2509335, 6807523, -3112778, -3052111, - 13557601, -2431488, 11769821, 10182831, -2404645, 3136937, -6780680, -2631204, -1497333, 619549, - 5429913, -4108673, -694174, -7041062, -6699075, -2685428, -3007551, 3946001, -601295, -4691715, - 5674726, -228170, -1451162, -3522947, 2887829, 2696703, -2760590, 2583423, 511101, 1883343, - 1471026, -2450816, 1093606, 3110093, -3798899, 6668474, -974421, -4745939, -2971044, -3667365, - 1907502, 2051384, -1433445, 2808372, -1146756, 459562, -51003, -86436, 3533684, 2625299, - 1218160, -2270427, -1187022, -159451, 594853, -966368, -3115462, 118648, 223338, -628139, - -195958, 1164473, -573378, 819802, -587337, -920734, - }, - { - -30129196, -53483616, 13333726, 10559177, -3550327, -30193620, -22956064, 17655536, -1333051, -8348880, - 7482370, -7655243, -10370735, -2076080, -8996346, 882616, -4734128, 8245264, -24374476, 6576132, - 2999498, 20433844, -1551557, -5118528, 11155104, 12818867, 2993592, -5609764, 7940858, -5906, - 12321187, 2704219, -19777788, -4720169, 1491964, -10280541, -2513630, 5050345, -3042984, 8853538, - -10515154, -4402342, 5931350, -7332046, 1815161, 1630477, 2666101, 1748589, -2577517, -7559143, - 2688650, -5456756, -791885, -418222, -1008244, -4810900, 3157338, -751619, -2480344, 3577171, - 2192044, -1173600, -2598455, 1413581, 3664681, -1083406, -1597728, 433255, 1870995, -606664, - 1767916, 927713, -1035087, -1708860, 2313377, -586263, 2042794, -432181, 3279745, 2086817, - 282931, -1234266, -1815161, -459562, -236760, 3725347, 255551, 377420, -816581, 1678259, - 1648731, 1294933, 1540283, -279710, 2125472, -1917166, - }, - { - -1378148, 35585952, 9329206, -2477659, -7431904, -1822677, 2449205, -5798743, 5631239, -3713536, - 7836705, 935766, -6690486, -146566, -24700356, 10259603, -7474854, -5824513, -23606214, -5279052, - 13522705, -1481764, -29530048, 249108, -19606526, -4423817, -4300873, -3197066, -20722144, 1272384, - 3741454, -7715372, -301185, 4884452, 5044439, 1242319, 9722195, -10970957, 3368328, 5098663, - 1214402, -2333778, 7213935, 6955163, -631360, 2769717, 2716030, -1353989, 5487895, 2318209, - 463856, 2694555, 122407, -2303176, -2696703, -803696, 1083942, -5687611, -608275, 346819, - -924492, -900869, -689342, -3486440, 1507534, -799938, -1766842, -514322, 315680, 133681, - 129923, 2673617, -192200, -1165547, -1744294, -1276142, -824097, -183610, 78920, -3471944, - -1794760, -2655364, 1618129, 1168768, -1100585, -915902, 207232, 539555, -921271, 1560147, - 3048353, -264677, -558883, 2274185, 862215, -1818382, - }, - { - -30115774, -39227548, 9716290, -6963216, 9820980, 14663018, 13598403, -1119913, -4022774, 14628659, - -10413685, 5079336, 2157684, -13672492, -10033044, -7996692, -8030515, 13836774, -9969693, 15684684, - -1008780, 11241003, -8702677, -8571144, 10508711, 5032628, -2841658, 827318, -3992172, 14533096, - -8886824, -6359773, 236223, 7067369, -10205379, 7333120, -1439351, -1750199, 6081674, -310311, - 5271536, -5626407, 4638028, 2125472, 3510062, -4034048, 11108933, -2248952, -853088, 2059974, - -5347235, -5327907, -1152662, 2006824, -4256313, -4545149, -1928977, 2640868, 422517, -2184528, - -1446330, 823023, 2879239, 1233193, -4173098, -1683090, -2265595, -1642825, -4880694, 2510409, - 361314, 1191853, 4998268, 2765422, 752156, -1890859, -1114007, 2641405, -1957968, 1168768, - -1342177, -565862, -1785633, 2522757, -1225676, 92879, 1734630, 1498407, -1716376, -47782, - 2008434, -941672, 1224066, 364535, 1649804, 898185, - }, - { - 4200478, -47586628, -6882685, -2554432, -5771363, -17179332, -1935957, 2712272, -2758443, -12348, - -5337034, 1717450, 1287417, 54246512, 7959648, 11950210, 20333986, -142808, -1582696, 5147519, - -12031814, 17283486, -10193031, 6125697, 2426657, 7530152, -17868138, 10364830, -6932614, 10264972, - -2229088, 13626857, -2719788, 5711233, 134755, -879931, -13034152, 198105, 11771432, 2551211, - 5340255, -3335042, 2521146, 314606, -2976412, 10147934, -8562017, -8730058, 4091493, -1974074, - 10275709, 534723, 2384244, 635118, 2286533, -446140, 2340220, 2450279, -5221070, -1382443, - 3414499, -1510218, -544387, 2790655, 3199751, -2876554, 1029182, -3371549, -1782411, -901943, - -478352, -1460289, 973347, -1644973, 41876, -112206, 1176284, 3380139, 3649649, 1454920, - -2350958, -1925219, -16643, -483184, 890669, 1641751, -443992, -1384590, 2779381, -318901, - -857383, -1102733, -328565, 2688650, -852551, -685584, - }, - { - -22277996, 23413478, 14759655, 5392869, 6620155, 8460549, -180926, -15411953, -15598247, -19437412, - 15790984, -14110578, -26650272, -26574036, 30866320, 644245, -3096672, 19873888, -1516124, -10486163, - 12496207, 22672058, 8191040, -1926830, 3962644, 5593658, 13588740, 1056562, -13026636, 2532957, - -13870597, -7551626, 1383516, 6438693, -6496675, -2029372, 1187559, -667331, 10353556, -4626754, - -6120866, -9208410, 11107859, -1540820, 6586869, 7886634, 4220342, -7508677, 2503429, -296353, - 3666828, 3211025, 1862942, 158377, -1359357, 663572, 367220, 1262184, 8158827, 362925, - 222801, 977105, 4137127, 4742718, -617938, 8191040, 3274913, -3139084, -289910, 4020090, - -3373697, -826244, 794032, 4053376, -3202972, 953483, -694174, 1330903, 372588, -83215, - -48318, 1914482, -104153, 1458678, -622770, 78920, -731755, 1463510, -1058173, -1373853, - 2541547, 943819, 38655, 450435, -1349157, 654983, - }, - }, - { - { - 368293, -14049912, -23935852, -15277199, -1277216, 2229625, 3992172, 2429878, 1889249, -19530826, - -4578435, -20098300, -4884989, 2093260, 16007343, 17741974, 3758097, -9982041, 15730855, 23587424, - 2201171, -19772956, 4832, -7012071, 901406, 1356673, -346819, 1346472, -7612293, 13498008, - 18544596, -646393, 10183904, -7604777, 4244502, -111132, 10611790, -8419747, -960462, 4831302, - -3567507, -3062849, -847182, -7655779, -5523865, -8985608, 4886599, 4468914, -5173288, 1540820, - -2496987, -4954245, -1525787, -6456947, 1767916, 3218004, 1435056, 2808909, -6007049, 4975720, - -653372, -2975876, 3753802, 962073, -1042603, -563714, 2816425, 1183800, -3321620, 3751117, - -485331, -2818572, 1296006, 1303523, -30602, 3200288, -861141, 1713692, -514322, 105227, - 2295660, -543850, 696858, 1060857, 1324997, 1228898, 887448, 1651415, 31139, -370441, - -2372433, 228707, 1669669, 1744294, 892816, 417149, - }, - { - -26496726, -89033600, 73549168, -29027000, 29718490, 3155727, 8319889, 4122632, 1604707, -3691525, - 30411590, -27229018, 9680856, -3656091, -10581726, -9490804, 2974802, 9876814, 17963164, 1203665, - 9048422, -6017249, 157303, -3338263, 13165685, 951335, -5944772, -4728759, 7128035, 1365263, - 11317239, -6385006, 7502234, -4174171, -4191351, -10086731, 1540283, -2136209, 3132642, -490700, - -4152160, 9265318, -896574, -3225521, -3397856, 6616397, 3805878, 1508070, -3541201, 1315871, - 6113349, 4555350, 4321274, 7566122, -2799245, -4540318, -1684164, -928787, 3007014, 106837, - -3602941, 1659468, -7144678, -402116, 1648194, 659278, 294742, 2387465, -4832, 2849711, - -1463510, -3758, -1721745, -686121, 2203318, -137976, -816044, -1358820, -1744294, -1206886, - -167504, 1056562, -420370, -884763, 711891, -76773, -50466, -852014, 70867, -362388, - 395137, 2147, -1079647, 1206886, -420370, 59593, - }, - { - -1360968, 155808528, 5900748, 22009024, -3821447, 6851010, -240518, -6885370, -3624416, -19861002, - 9264781, 19590956, -7131793, 3219615, 7566122, -5296769, 798864, -2970507, 5126044, 8167954, - 124017, 1927367, 5930813, 1474248, 10875394, -5962489, 308701, -7488813, 1226213, -2651606, - 4141959, -989990, -3911105, -9788230, 1298691, -838592, -2997887, 2067490, 7945690, 3018288, - 1196685, 1815161, 54224, -6657200, -3472481, 2520609, -7227893, 656593, 5334887, 562641, - 4319664, -1420560, 3817152, -1664300, 3927748, -2153926, 3097208, 409633, 6871411, 321049, - -2789045, -1163399, -454193, -334471, 566936, 2382096, 1657857, 2464774, -4597763, -774168, - -893890, -600759, -1588601, -1596117, 1839857, 319438, -1504849, -1488206, 1658394, 1565516, - 785442, 2509872, 1654636, 824634, 585726, -920734, 131533, -88584, 920734, -240518, - -397284, -626528, 124017, 752156, 222265, -593242, - }, - { - -1568200, 24109798, 6635188, 7987029, -3657702, 1408749, 2042794, 3467649, -3478387, 1121523, - -3139621, 848793, -7162932, 2697776, 23969138, 11443403, 4735739, -419296, 31921808, 5922760, - -2428267, 1240172, 665720, 3769371, -11578695, -12748537, -15417322, -1161252, -6096706, 4753455, - -6959995, -10840497, 806380, -12264816, 1474248, 474594, 17218524, -10111427, -3920768, 1476932, - 6571300, -1326608, -2407329, 8697846, 5184026, -1739462, 4031364, -1025423, -2163053, -2713346, - 4851166, -2952790, 2389613, -2699387, -1686312, -1335735, -1393180, 95563, -1655710, 1139777, - -587337, -710280, 259309, -1310502, -3752191, -273267, 1005022, 134218, -3563749, -1993402, - 479426, -702764, -1663763, -2879776, 1425929, -2137820, -880468, -1337882, -1145146, -744103, - 477815, 1382980, 2292439, -599148, 60130, -437013, 81068, -202400, -259309, 1106491, - -929324, 249645, 60666, -606127, 818191, -1292248, - }, - { - 18760954, 116616416, -26292716, -57276612, 4609037, 3393561, 3040837, -16061567, -40802, -22301618, - -8550206, -11847667, 5873368, 2134599, -11968463, 11945915, 17096118, -21350820, 9169218, 16268799, - -8743480, 14772540, -12635257, 11439109, 2257005, 3338800, 14827838, 14142254, 1482301, 224412, - 8748312, -1947768, -1043140, -5268315, -4241817, 3633542, 308701, 2637110, -1527935, -3833795, - 6308233, 2826625, 6356015, -454730, 97711, 1928977, -2483565, 2066416, -1114544, 8429410, - 150861, -6419366, 1134408, 4942971, 6357089, -4851703, 1549946, -147640, 2943126, -4207458, - 2696166, 804770, 4977867, 2314451, -4666482, 2054605, -2477659, -1630477, 1431835, -1843078, - 1050120, 934155, -171799, 1097901, -2177549, 798327, 1257889, 591632, -696858, -238371, - -4024921, 90731, 1601486, 27917, -213138, 52076, -993748, 773094, 638876, -487479, - -601295, 591095, -418759, 449898, 862752, 975494, - }, - { - 1599875, 11694122, 7375533, -869731, -2531346, -1065689, -715649, 899259, 5192079, -1011465, - -1547799, -2612414, 118648, 5925445, -26281978, 7379291, -2476586, 7650948, -13424457, 38170448, - -5730560, 9463424, -1553168, 16761647, -8966281, -12920335, -102542, -3548180, 835371, 22681722, - -2288144, -5864778, -8797167, -4104915, 2763812, 3299609, 551903, 2408403, 3729642, -2561411, - 3789235, 7264937, 3859565, 1219771, 5739150, -3878356, 5299990, -8056285, -7415261, -5753109, - 3794604, 2501819, 6169721, -2220498, -699543, -2208150, 556198, 2643552, -3990562, 250719, - 1229434, 2587181, 1658931, -168577, 748398, -217433, 5929739, -874026, -3772055, 720481, - -1633161, -2343442, -1700270, -2670396, -179852, 2399276, 1627793, -1218697, 1619740, 923955, - -915365, -1138166, 1738388, -670015, -1093606, -1136019, 1482838, -1395864, -871342, -184147, - 212601, 188979, -917512, 865973, 1080184, 645856, - }, - { - 41991360, 106954888, -31540092, -32507534, 3779571, -1454920, -4519380, 3036005, 18194018, -2157147, - 999117, 8457327, -3985730, -6645388, -11933567, -368293, 6068789, -12946105, 15323906, -5437429, - -5439576, -3870839, -9038222, -16061567, 14436996, 1730335, -3757023, -6242735, 3374771, 3818763, - -117038, -2466385, -4610111, -7168838, 311385, -2227478, 3488587, 5978595, 1894618, 763967, - 3100967, -278099, 3041374, -3221762, 5323612, 2193655, 4974109, -2880849, 2725157, -1675037, - -220654, -4412005, 4782446, 124554, -2242510, 2859911, 7659001, 228170, -6307697, 270583, - -300648, -498753, 1498944, -1349694, -149250, -688269, -90194, 1935957, 520228, -802622, - -1535988, -244813, 274341, -1011465, -98247, -1231582, -1115618, -11274, -475131, -241055, - 594316, 535797, -1324997, 60666, 780073, -1268089, -989990, -343597, 1384053, 1552094, - -515933, 263604, 1694902, 419833, 571768, 202400, - }, - { - 1736241, 9714142, 3124589, 108985, 2384244, 861678, -377420, 2411624, -4793184, -712965, - 71941, -2586107, -2367064, -1850057, -9483825, -1823751, -25882010, -21932788, -5744519, 12840878, - -11076721, -3011846, 9443559, 8269960, -4308926, 12432320, 6436546, -11148124, 7472170, -7987029, - -9883257, 8927626, -8338679, 8332237, 765041, 202937, 4502737, -2269890, -7794829, -5089536, - 2359011, -774168, -3223910, 7032472, -683437, 1381906, -1546725, 556735, 6046240, -4307852, - 588947, 7088307, 5112622, -5028870, -2915746, -7862475, -830002, 1399086, 2770791, -1585380, - 4708358, -1860795, 1837709, 667331, -416612, 578747, 3235184, -4796405, -958851, 2470680, - -214748, -1047435, 2937758, -330176, -1722282, -241592, -44560, 234076, 809601, -2017561, - -1447941, -2598992, 1324461, 202937, -742493, -1197759, -479963, 1736241, 231928, 577136, - 1914482, -105764, 1571958, -274341, -799401, -1023813, - }, - { - -3375308, 355566368, -24724516, -39154532, 17875118, 26844, 24898462, 10633265, 12715251, -6997576, - -10895795, 5532992, 13044889, 13384729, 9292162, -8063801, 21888764, 7200513, -5818607, -15216532, - -4167192, -7398081, -5878737, -474594, -7579007, -1215476, 29528, 11354283, -6646999, -1941325, - -5029944, 1538135, -4207458, -6878390, 3748433, -3790309, 3454764, 9848360, -4550518, -1324997, - -2586644, 5418638, 7406671, 3750043, 853625, -10285910, -515396, 9159555, 2783139, 1239635, - -3384434, 7106024, 1153736, 2939368, 1100585, 8269960, -951872, -21475, -1462973, -4381941, - 774705, 579284, 5012764, 1535451, -1858647, 2080375, -2259153, 1141924, 1234803, -1117228, - 397821, 348966, -2568391, -49392, -1211181, -547608, -2101850, 338229, 811749, 465467, - 176094, 1049583, 425202, 821949, 398895, -288300, -966368, 754304, 2218351, 1136556, - -30602, 1213328, 1679869, 1822140, -2228014, -109522, - }, - { - 4533338, 17812840, -23677080, -8805220, 13264470, -9164923, -9994389, -3302830, 5378373, -1181116, - 9902584, 481036, 8975945, -8231305, 11252277, 8185671, 6407555, -1745904, -9553618, 1582159, - 1224066, 6521908, -10246181, 4912369, 1469953, -6664179, -3263102, 10048076, 9027484, -8783208, - 12407624, -3006477, 17167522, 944893, 3905736, -2367601, -1753957, -1796370, 490163, -3306051, - 2210298, 1931662, -7025493, -2104534, -1066763, -3781182, -8938364, 2208687, -2059974, 2043331, - 3042984, -170188, -1828046, 2639794, 1894081, 819802, -586263, -496069, -260919, 1367410, - 5534066, -1829119, 118648, -2091112, 2179696, 3264175, -1492501, -3436511, -60130, -4686346, - 879395, 1677185, 1500554, -193274, 651224, -55298, -566936, -588947, 3640522, 3137474, - -652835, -1834488, -1278290, 2114198, -1168231, -1911797, -1625108, -290984, 986232, -2097555, - 1562294, -168041, 338229, 29528, -870268, -181462, - }, - { - 32030256, -93479960, -34876208, 17664126, 150861, -49932216, -12070469, 6490770, 2964064, -263067, - 1038845, -2549063, -10698227, -11667279, -7234336, -6118718, -9375914, 9815074, -21859236, 5346698, - 9307194, 10839424, -4532801, 2639794, 8501351, 8693551, 8141111, -5463736, 4567698, 304406, - 7886097, 4725538, -15149423, -13874892, -1214939, -5079336, -170725, 6004901, 3416110, 1167694, - -10437844, -507343, 3426310, -833761, 3751117, -6812355, 9241696, -4261145, -1602023, -5578626, - 693637, -5189931, -649614, -1499481, 1218160, -3645890, 1998770, -3836480, 1612223, 2224793, - -20401, 150861, -2612414, 5754183, 1712618, -1496796, -2537252, 3204046, -890669, 3154117, - 1960116, -2338610, -1162326, 39728, 1198296, 443992, 879931, 830002, 1844152, 3003793, - 48855, -466004, -1588601, -900869, 709743, 2226941, 1069984, 56371, 528818, 702227, - 2047089, 1556389, 1597191, 86436, -333397, -562104, - }, - { - -98247, 48474076, -5539971, 2511482, -8504572, -1909113, -4010963, -415001, 2780455, -6764037, - 11035918, 3235721, 2969433, -28533078, 991064, 8706972, -7526394, -4847408, -29956860, 11497091, - 1547262, -22857280, -16891570, -3954591, -7612293, -3111167, -8570070, -3051038, -6612102, -18925236, - 9168681, -7898982, 524523, 1145683, 15025406, -1449015, -1577327, -6780680, 8256538, 1125818, - 5247377, -3001645, 5410048, 1084479, 4480188, -103079, 5157182, -6352794, 5149129, 6965363, - 6055367, -687195, 2714419, -5007395, -2522757, -1501091, -296890, -326418, -4697084, -1047435, - -4832, -1767916, -2223183, 5166309, -877784, -5170067, -372588, -1583769, -616328, 3331821, - -2459406, -154082, 376347, -1352915, -921807, -235149, -1430224, 1244467, -427886, -2250026, - -3542811, -205622, -737124, 2641942, -2654827, 1630477, -699543, -1051730, 1415192, 1319092, - 1654636, -59593, -2528125, 4111358, -369367, -1073205, - }, - { - 19073950, -100168304, 11385958, -3135326, 7845832, 22010096, 11546483, -6055904, 2572149, -9468255, - 1956358, 10952703, -6523519, -11389180, -22137336, -3098819, -22262426, 10986526, 7870528, 3237869, - 2605435, 818728, 4122632, -1388348, 3644280, 749472, -3089155, -2099165, 9607842, 7548405, - -10893648, -5483063, 3937411, -1281511, 2381559, 874026, -1511292, 6622303, -2821794, 5272609, - 4858145, -2479807, 5994701, 2563022, 1306744, 1337346, 2201708, 568546, -1283122, 3890704, - -7165079, -972273, -3886409, -5909338, 4199941, -4614943, -2607582, 4578435, -3506304, -634045, - -2938295, 3430068, -148713, 3623342, 16106, -762894, -3478924, -2602213, -3920232, 4080756, - -2674691, 2964601, 1679869, 2333241, 2731599, -1721745, 90194, -28991, -1875290, 2168959, - -3332358, 572841, -1095217, -172336, 497679, -66035, 1528472, 1161789, -2426657, 2305324, - -4295, 21475, 714575, 852551, 857920, -551903, - }, - { - -4978941, -46925204, 3997004, -2645163, -8931921, -16473884, -8883603, 5515275, 399969, 1595580, - -12219719, 8581345, 3915937, -17544942, 123628488, 7120519, 5487358, 1074279, 27354646, -32851668, - 4976794, 11405286, -14387604, 8729521, 14305462, -11622718, -1485522, 3432216, -6247030, 13741748, - 7373385, 8145943, -5735392, -279173, 6726456, -9125195, -2516314, -9130564, 11105712, 9529996, - -2246805, 1796370, -378494, 1777043, -2523293, 7432978, -2355253, -6096169, -2163590, 432718, - 2259690, 7412577, -1782948, -39728, 2851322, 547071, 3476776, -1329829, -781684, -471910, - 1891396, -209917, -325881, 2941516, 1177358, 1829119, -6590628, -1980517, -419833, 1697586, - -1624035, -1001801, -2887829, -1823751, 1754494, 79994, 2769717, -700080, 5823976, 1312649, - -1590212, -113817, -1698123, -471910, -258235, 3215320, -84826, -1946157, 2496987, 311922, - -2523293, -864362, 1697049, 524523, -106837, -381715, - }, - { - 26540214, -15953119, -7898445, 9779104, -951335, 17170206, -10010495, -16900160, -11344619, -3277060, - -7234873, -17721036, -6807523, 12345347, -28626494, -15130096, 14487998, 13101798, -3232500, 4278861, - 5338108, 14449344, 5788542, 8424578, 3130494, 5974300, 6453189, -16029355, 9336722, -3980898, - -11719892, -11833709, -198642, -5988258, 1156420, 3732864, 4316442, -4955319, 690953, 8783208, - -6551973, -8345122, 4244502, 1056562, 5267241, 10425496, -1547799, 1785096, -341450, 1954747, - 2021856, 7332046, -1478543, 5851893, -4597226, 1060857, 878858, 457414, 5928129, 2728915, - -716186, -657667, 6364068, 683437, 4556424, 5008469, 4754529, -403727, -3798362, -1302986, - 3177739, -1649268, 565325, 1152662, -2717104, 473520, 619549, 1312649, 174483, 545998, - -388158, -206158, 2175938, 114354, 369367, -337692, -1199907, 2062121, -22012, -900869, - 1051193, 1495186, -1169842, -309775, 431107, -590558, - }, - }, - { - { - -637803, 40569724, 16386374, -18139258, -1770063, 3449396, 1494112, -3114388, 3754875, -29995514, - -20688858, 1269700, 11150809, -20604032, -7275675, 10507637, -5566278, -10549513, 24464670, 12707198, - 6455336, 999117, 17194364, -3349538, -449898, 9689983, -5613523, -1700807, -10985453, 4593468, - 6177774, -10060961, 4760435, -16337519, 7145752, 14052059, 19247896, -5653251, -857383, 2559801, - -310311, -1040456, 877247, -3876745, 8044474, 5501853, 3331284, -4332549, -8668318, 2477123, - 1492501, -3281892, 1205812, -1735704, 4333085, 3248069, -3925063, 1375463, -4503810, 4843650, - 2119566, -1912334, 2005750, -1650878, -4054449, -3164854, -2493229, -3062849, -2369748, 5901822, - -129923, -4772246, -1542430, -2266132, -3427384, 458488, -1579474, 1192927, -561030, -1837709, - 2295123, -470299, -343061, 1677185, 2100239, 366146, -993748, -492311, -692027, 132070, - -1607928, 859530, 935229, 285615, 1611, -601295, - }, - { - 25379498, -162592960, -33809444, -37413996, 19268298, -4780299, -1725503, -1378148, -1527935, -12283070, - 19219442, -19396610, 10536092, -1368484, -12368432, -16702591, 1801739, 4773856, 8517994, -2193118, - -490163, -11311870, 537, -1585380, 5109938, -7143068, -7458211, -6150930, 7297150, 3677029, - 3684545, -4774930, 7312182, -2484639, 3744138, -12138114, -7727720, -8609799, 4584341, 1832877, - -1824824, 9909026, 3819837, 6052683, 1294396, 6165426, -5590974, -3686156, -8619999, -6852084, - 4473746, 6027987, 2797098, 4350265, -4039417, -1734630, -458488, -1962800, -86973, 24159, - -2615635, 5424544, -3462281, -1845225, 511101, -553514, -3766150, 482647, 1387274, 2243047, - -1954210, -54224, -2037425, -2614025, 22549, -166967, 290984, -185220, -34360, 108985, - 933082, -32212, -194884, 1967632, 2030983, 833761, 1455994, 540092, -49929, -762357, - -421444, -324270, -240518, 1683627, -753767, 46171, - }, - { - 3485366, 118116968, -28417652, 22576496, -1016834, 2081985, -449898, 9308805, 11151883, -13085155, - 8007967, 17381196, -12420509, 13518410, 20236812, 3923990, 12419435, -10021769, -7902203, 2013266, - -11993159, -10766946, 9938554, 8884140, -1806034, -12413529, 1803349, -2246805, 8418673, 3628711, - 1588064, 462783, 2192581, -12336220, -3901441, 5206574, -752156, -722628, 5840619, 1632625, - 6652368, 5099737, -1760400, -3769371, -1823751, 336618, -2593087, 1065689, -497142, 1786706, - 5410048, 3032247, 4563940, -4680978, 3260954, 213675, 3078418, -1016297, 5429913, 1668595, - -3187940, 54761, 578747, -70330, 3098282, 2129767, -2713346, 2245731, -2666638, -1459752, - -2110977, 710280, 1568200, 61203, 1058710, 223875, 2315524, 685584, 40265, 646393, - 451508, 8590, 563714, 1857037, -46171, -1778653, 991601, 398358, 66035, -262530, - 598611, -615791, -278636, 1126355, 87510, -912681, - }, - { - 1765232, 16796006, -4440996, 5908265, -3138547, 1335198, 202937, 579284, -2873870, 624918, - -3886946, 7105487, -5765457, -5184026, 216359, -491237, 12024835, -2731599, 17401596, 6648073, - 11027865, -9789841, -8519068, 9147743, -3628711, -7743826, -13504988, 1625645, -1648194, -9112847, - -15178951, -7985955, -3022583, -9674951, -3256122, 2124935, 15205795, -11526618, -259846, 1582159, - 2482491, -4687957, -8091182, 1874753, 867583, -6782290, 1230508, -1286343, -1109712, -2491081, - 3322694, -1913408, 6538551, 113817, -4682588, -1154273, 291521, 2418604, 979789, 1229971, - 2786360, 2604898, 1341640, 694711, -1239635, 1941325, 4230006, 1107565, -2014877, 1214402, - 224949, -1149978, -159451, -2642479, 1879585, -294742, -6442, -184684, 602906, 936840, - 407485, -420907, 2092723, -1060857, 83215, -628676, 550830, -361314, -532039, 1358820, - -266825, 706522, 89121, -945430, 937377, -1959042, - }, - { - -37385544, 79473536, 9088151, -50122268, 4188130, 2990371, -1393180, -6028524, 4977330, -25198036, - 232465, 5590974, 12241194, -4282083, -12163884, 4068945, 5710159, -24489366, 4637491, 8236674, - -13699335, 8125005, -14289356, -4099010, -8108899, -8242579, 6752226, 13031468, -3044058, -5368709, - 5327370, -2291902, -1677722, -6587943, -603980, 2594160, -25567940, -9320079, 4642323, -7940321, - 5869073, 2481954, 11621645, -3182571, -595390, 1262720, -4068408, 2705830, -2270427, 6201396, - 1744294, -2829310, 3463354, 3432753, 6230924, -1948841, 1708323, -2774012, 4854387, -2960843, - 1823214, -1558536, 1116155, 2770791, -1595580, 1409286, -3342558, -1561758, -28991, -3361886, - 578210, 105764, -841277, 1086627, -2639258, 769336, 2099702, 1795833, -1130113, -55298, - -1184337, 278636, 502511, -291521, -1500554, -338229, -77309, 383326, -100395, 40802, - -222265, -159988, -771484, -236223, -963683, 636729, - }, - { - -182536, -4128001, 711891, -1401233, -2771865, -104153, -408559, 584652, 6105833, 1733556, - -3219615, -5218386, 1564442, -1830730, -39195872, 6696928, -18199924, -413391, -15273441, 35305168, - -1093069, 7355132, 2436320, 11614665, -17035988, -15269682, -12408697, -17272210, -12052215, 587874, - -3382824, 3416647, 5943161, 8510478, 405338, -514322, -4775467, 2586107, 9893457, 1457605, - -770947, -675921, -656056, 204548, 3506841, -3696893, 5391258, -7348152, -1180579, 82141, - 13422, -186831, 6744173, 526134, -559956, -2292439, -920734, -282931, -6123550, -1083406, - 2244121, 2065879, 595927, -1868311, 128849, -1701344, 1312649, -1129576, -1838246, 2479270, - 68719, -52613, 652835, -402116, -1197222, -154082, 1168768, -763967, 32212, -1264331, - 116501, 358093, 2493766, -73551, 1248762, 996969, 1355599, -1865090, -45097, 158377, - -66035, 113280, -105764, 968515, 479426, 190052, - }, - { - -64422360, 20347408, 17789754, -34879968, -7976291, -1183800, -2106145, 1301375, 7064148, -10376641, - -1266479, 29773250, 15324443, 8325794, -16003048, -8075613, 16240882, 4744865, 17450452, 4725001, - 2886218, -9592273, 2655364, -7201587, 13455059, -4076998, -6733972, -7821136, 8604430, 1423245, - -3059091, 6738267, -365609, -8462696, 3426847, 1097901, 3183645, 537945, 1460826, -2943663, - 2437931, 2780991, 3633542, -598074, 8443369, -1074279, -531502, -2786897, -273804, 264141, - 8258685, 2280091, 4922570, 824097, 1627256, 1466731, 4409858, 2100776, -4968204, 310311, - -344671, -2265059, 1027571, -2010582, -635118, -1473174, -549219, 1791001, 48318, -532576, - 75699, 727997, -25770, -297963, 671626, -4606353, -2457795, 395137, -948651, -1293322, - -46171, 227633, 133681, -803159, -1259499, -550830, 895501, 1228361, 1755031, 1341640, - 208306, 1033477, 1763621, -853625, 17180, -441308, - }, - { - -613643, -6563784, -2492692, -3087545, 44023, 1794223, 273267, 6185827, 2715493, -740345, - 1231582, -3642132, -7716983, 7037304, -12233141, 3867081, 3075197, 8007967, 16786342, 17892296, - -1955821, 21119964, 15207942, -13992467, -23362474, 1427540, -11002632, -12948790, 28886876, 7614440, - -11272142, 4988605, -10565083, 16682727, 7296613, -7316477, -1227824, 9106404, 2625836, -6248641, - 4252555, 6797860, -2624762, 2595771, -3371013, -6126234, -1218697, 324807, -337155, -3759707, - -645856, -1502702, -356482, -5544266, -2206003, -1446330, 2993592, 4355097, 6718940, -1088774, - 2738579, -2572149, 3600256, 1820529, 365072, 1788317, 2156074, -4055523, 1731409, 5138929, - 1225139, 756988, 4651450, 1853278, 238371, -471910, -222265, 1712618, 2039573, -1471026, - -300648, -2735357, 1374926, 796180, 197569, -346282, -1468879, -144418, 141197, 1029718, - 1678795, -1440425, 978179, -416075, -1025423, 311385, - }, - { - -25052544, 372542784, 22011170, -44379896, -5625871, -3543348, 9294309, -12797929, -3046206, 380105, - 540092, 5029407, 16205985, 12467753, 6872485, -9174050, 15533286, 374736, 12598213, -7123740, - -1384053, 3787624, -863288, 3522947, 826244, 2364380, -816581, 6614787, -8483097, 2463164, - 4151086, 5175973, -401043, 738734, 6260452, -1570884, 540092, 4343823, 3566970, 3658775, - -4012573, 5144297, 6462315, 569083, 785442, -7360500, -3405372, 2746095, -430570, 3100967, - -1897839, 5063767, -2327872, -907849, -2094870, 2427730, -4936528, 1488206, 399432, -3905199, - 659278, -3512747, 3173444, 3652333, -4423817, -790274, -2539936, 724239, -324270, -2442763, - 687732, 900869, -2789045, 1385664, 482647, -452045, -1789928, 1241782, 206695, 449898, - -557272, -204548, -1226213, 726386, 879931, 383863, 955630, 1571958, 653909, 201327, - 600759, 97174, -248034, 489626, -1484448, 1359894, - }, - { - -3349001, 43057584, 7294465, -15411416, -1020055, -2540473, 9465034, 1748052, 4659503, 1538135, - 11200201, -5164162, -5972689, -20557324, 4454955, 603980, -9177271, -5913096, 5760625, -755377, - -16836272, 3374234, -9038759, 13225278, 9013526, -4773320, -856309, 9936407, 13400835, -10009958, - 2518462, -1078037, 15864535, -6329708, 5927592, 1402307, 3651259, 4671851, 8076686, 6581501, - -220117, -111132, -1068910, 5442261, 9048959, 6138045, -2708514, 2927557, -2634963, 5935108, - 5880347, 1902671, 24696, 3243237, 957778, -1465121, -1880122, 1142998, 3732327, 2205466, - 6886980, -710817, 59593, -2592013, 1352915, 670552, 84826, 492848, 3622805, -1398012, - 2197950, 1684164, 967978, -1275605, -222801, -1207423, -1116692, 161598, 3641059, 859530, - -2669859, -3000572, -1150514, 1229434, -786516, -417686, -328565, -648003, 734976, -1392106, - 2397129, -20938, 235686, -331786, -498753, 169651, - }, - { - -33268816, -118295744, 2265059, 2148558, 1261647, -19334332, 15848429, 12715251, 3586835, 7621420, - -4808216, 5008469, 4385699, -10466835, -11232950, -4451734, -5093295, 2517925, -21910776, 4357781, - -2641405, 5099737, -2364916, -2492692, 4532264, -2228014, -279173, -12182675, -8455717, 2121177, - 8566849, 11724187, 817118, -1974611, 7289633, -987843, -2392297, 5105106, 8276402, 7422241, - -1921998, 3745212, 1455457, -4396436, -1603633, -11211475, 6608881, -6447283, 100395, -92879, - 3081639, -3151969, 3420942, 4342749, 5988258, -5906654, -363998, -1397475, 2017024, -759136, - -1607928, 1330366, 254477, 7664906, 784368, 517544, -753767, 1147830, -1999844, 2406792, - -570694, -1620813, 517544, 726923, 189515, 490700, 1961726, 964220, 530965, 408022, - -2276333, 583042, 520765, -334471, 342524, 310311, -149250, -147640, 1202054, 499290, - 351650, -228170, -578210, -964220, -1207423, -100932, - }, - { - 1236414, 56559352, -1621350, 1849520, -2146410, 3714073, -4209068, 622233, 5723581, -4380867, - 6422050, -2098629, 18620830, -9229885, 14618458, 11500312, -10039486, -1420560, -11342472, 16959216, - -9522479, -11707007, -10471130, -7846369, 2254858, -3872450, -2095944, 8589398, 7032472, -14181982, - 2985002, -8433705, 248034, -9981504, 447213, -9387188, -13051869, -4341675, 9599789, -4041564, - 501974, -4714264, 6087580, -272194, 1824287, -4090420, 657130, -5864241, 1602023, 5787469, - 7779797, -1537598, 3487514, -1787780, -428960, -4824859, -4271345, -1146756, -5099200, 1773822, - 4676683, -299574, -2773475, 4673998, -4266513, -5822365, 1472637, -1349157, 932008, 3583077, - -3664144, -1713692, -2183991, -3915400, 1021665, 3901441, -183610, 1730872, 2148021, 773631, - -600759, 360240, -2484102, 3958886, -1155346, 1781338, -938987, -2073396, 548145, 153008, - -261456, -291521, -2659122, 2007897, -1236951, 226560, - }, - { - 4893042, -121569584, 13982803, -5499706, -1433982, 7233799, 1343788, -9584220, -8675834, -27401354, - 7735773, 17297444, -3935801, -17603460, -13586592, 14293114, -26367342, 2895882, -438624, -6722161, - -5324149, -4647155, 11626476, -4923643, -7199976, -2075543, 5763846, 14237817, 10099079, -1336809, - -9491341, -1649268, 6206228, 1224603, 16337519, 11873974, 4377109, 5599027, -5627481, 13325673, - 12661564, 809064, -749472, -597537, 385473, 2568927, -2633889, -2277407, -3085934, 2772938, - -4943508, 4277251, -1499481, -6910066, 8753143, -2096481, -527207, 9198209, 90194, 4625143, - 157840, 3440806, -705448, 3579318, 402653, -399969, -828929, 1757715, -1282585, 5141076, - -2585570, -173409, -2736431, -1337882, 1111860, 763430, 1309428, -1125818, -3132105, 1987496, - -3302830, -76236, -821413, -1636919, 977642, 425739, 253940, 2056753, -743029, 1267552, - 16106, 1386201, -203474, -538482, 1165010, -365072, - }, - { - 4270808, -46721192, -5454072, 6059662, 4709432, -372052, 584652, 10612864, 13078175, 2612951, - -16551193, 5767604, 705985, -29270202, 101112120, 6651831, 10990284, -1118302, 34559456, -35822176, - -2192044, 20823612, -6861211, 9371082, 15634755, -10386305, 5639292, 259846, -14700599, 6417218, - 4822175, 2833068, -9938554, -7023882, 5486821, -9364639, 1909650, -7272990, -139050, -5163088, - -4873714, 4711579, -3449396, 3210488, -2962991, 3227668, 114354, 776852, -1733556, -4484483, - 1119913, 4991826, -2979634, -2860985, -470299, -2851322, 492848, 1509681, 3149285, -319975, - 490700, 1868848, 917512, -2063732, -270046, 2850248, -7472170, 128849, 3212636, 2879239, - -2003065, -3040300, -3019899, 755914, 1323387, -1384590, 317291, -5856725, 1690070, 856846, - 432718, 3776887, -275952, -1624571, -690416, 1533840, -1304596, -2114735, 1051193, 1425929, - -568009, -1330366, -671089, -1113470, -4295, 969589, - }, - { - -19438486, -74715248, -11500312, 20145544, 530965, 1404991, -8985072, -4010426, 591095, -691490, - 4017942, 4833449, 5346698, -16683800, -55771760, -126702, 6541235, 1640678, -7940321, -8366597, - -11805791, 296890, -742493, 5566815, -3425773, -7701950, -1986422, -16401943, 20337208, 1674500, - -7905424, -5421860, 763967, -16112033, 2145873, 9118752, 7032472, 1612223, 235686, 7595113, - 4984310, -7714835, -3250217, -1887101, -3622805, 1223529, -5187247, 7430294, 7388418, 1820529, - -2157684, 8165807, -2494839, 5200132, -5700496, -903554, -2169495, -4347581, 1426466, 1596117, - -3276523, -2349884, 1741609, -4174708, 4001836, 1219771, 1335735, 978179, -4242891, -4080219, - 4952098, 1585380, -1740536, -3700114, -1822677, -1398549, -1120987, 1898912, -1079111, 1384590, - 412317, -2610803, 680215, -67646, 970663, 340913, -884763, 1725503, 1059246, 898722, - 841277, 1500017, -1755031, -1629403, 1284195, 122943, - }, - }, - { - { - 1306207, 64990908, -7233262, -11133629, -1515050, 645319, 3863860, -8480950, -1098438, -18671296, - -17962090, 8133595, 3762391, -20178294, -913754, -90194, -1875290, -11754252, 24192478, -3282429, - 22509924, 16530792, 8617852, -7959648, -2485176, 17886928, -8189429, 254477, -7431367, -4440996, - -4767414, 5597416, -286152, -10458782, 2652142, 16199006, 10501195, -4351876, 4526359, 3828963, - 1016834, -3520800, -1159641, -1437740, 13999983, 4554813, 1436130, -4879620, -2961917, -870805, - 1357747, -621160, -5963025, 4502200, 2194192, -235686, -3286187, 2605972, 673773, -84826, - 2120640, 1470489, -1805497, -2314987, -2908767, -198642, -5586679, -2246268, -1207960, 1209033, - 1440962, -3221762, -1049046, -2774012, -1925756, -1155883, -781147, -250719, 2485712, -3216931, - 1163399, 1322850, -408559, 821949, 2425046, -991064, -905164, 179852, -1174137, -680215, - -416612, -20401, 972273, -636192, -264677, -460635, - }, - { - -24275692, -196462000, 34831648, -25601226, 3673271, 5316096, -11526618, -3203509, 2982855, 7374459, - -16295643, 5554467, -2437931, 2761664, -2091112, -41475964, 15844134, 11458436, -12722230, 13738527, - -5743445, 410169, -13560822, 5604396, -9440875, 6410776, -6731825, -2282238, 4213363, 3271155, - -2794950, 3397856, -4748623, 5676873, 4870493, -12327093, -12895102, -7526394, 4704063, 8361765, - 1799591, 7258495, 341450, 12359842, 440234, -1166084, -2533494, -10948945, -2047626, -4085588, - -1423245, 7662222, 573378, 2874944, 117038, -322123, -508954, -2631741, -5422933, 119722, - 1461363, 1895154, 660888, -2586107, -32212, -398358, -2756832, -534187, 4639639, -1751273, - -1314260, 369367, -96100, -3233574, -2848100, 3202972, -2027761, 822486, 569620, -15032, - 1296006, 142808, 90194, 1727651, 680752, 754304, 2336462, 949188, -268972, -251256, - -488016, -1338419, 732292, 1039919, -1040456, -124017, - }, - { - -5016522, 47702592, 37516540, 17787608, -1028108, 4547297, -3433290, 15423228, -1868848, 6796786, - 11705933, -1509681, -11843372, 14727443, 23875724, 8064338, 2638184, 1330366, -14046691, -10577431, - -3855807, -4281546, 1930588, 15110769, -9214315, 241592, -8290361, 11078868, -592706, 9383430, - -8520141, 8665097, -2312840, -13747653, -3946001, 3730716, -1635846, -801011, 8005819, 1473174, - 8979166, 3899830, -5084705, 1221918, -4758287, -3999688, 7721278, -2785286, -1868311, 3034395, - 57445, 7477538, 842350, -288837, -2175938, 2499134, 3823595, 742493, -1393717, 3511136, - 386547, -229781, -644245, 297963, 4554276, 51540, 585726, -2066416, -831076, -839129, - -2762201, 344134, 1521492, 1545115, -1741072, 1742146, 542777, 2470680, -476205, -23622, - 173946, -404801, 690416, 1135482, 783832, -941672, -345745, 1442035, 1068910, -974421, - 1305670, -1114544, -250182, 921807, -285078, -134218, - }, - { - -1809255, 7401303, 4627291, 1889786, 887985, 252329, 635655, -1528472, -1727651, -3144990, - -391379, 1016834, 7424388, -15554224, -11712376, 11433740, 12586402, -2911988, 8105140, 2254321, - 12048457, -11566884, 210453, -4097399, -5826123, -4902169, 5326297, -9794673, -3653944, -17481590, - -4010963, -2284923, -14444512, -791348, -3486977, 8083666, -9200357, -8054675, 12910135, -110059, - -3827890, 5659693, -11400454, 4173098, -5983963, -2079838, -4797479, 3186329, -995359, -4463008, - -811749, 3644280, 252866, 2581275, -4121558, 403190, -1362042, 2769180, 1353989, -1091459, - 3361886, 3429532, -366683, 2710661, -465467, 571768, 5171141, 1404454, -1993939, 1899986, - 145492, 348966, -2405182, -921271, 163209, 977105, 1259499, -2245731, 1266479, 833224, - -181999, 1813550, 991601, -1053341, 244813, -1756642, 1619740, -649614, -606664, 525060, - 130460, 996432, 640487, -209380, 68719, -1434519, - }, - { - 51761336, -5164162, -20363514, -35012036, -1324461, 2677375, -7271917, 2472828, -3840238, -7206955, - -20725902, 15507516, 5740224, 10219338, -1682554, -12091407, 3237332, -16980690, -5280663, 1607928, - 2436320, -9510668, 4778688, -18352396, 6888591, -9617506, -3382287, 2844342, 4606890, -1572495, - 6708739, -4627828, -2844879, -4005594, 1061931, -5343476, -32042066, 2767033, 5613523, -17507898, - 16179142, -3573413, 15323370, -8491150, 2350958, -1727114, -2811593, 243739, 877784, 7162395, - 636729, 3736085, 1211181, 803159, 5588826, -3660923, 1893544, -431644, 2878165, 2136209, - -2188286, -1784559, 782221, 1148367, 3304441, -250719, -2789045, -1816771, -945967, -1118839, - 1776506, -1609539, -886374, 1010928, -1261647, -867583, 2193655, -1058710, 1409286, 490700, - -939524, 537408, -93952, -689879, -1086090, -827318, 1633161, -179315, -661425, 396211, - 296353, -177704, -1060320, -878858, 451508, -410706, - }, - { - -1553168, 1129040, -1867237, 1110249, -4110284, 515396, -12348, 155693, 2940442, 1162862, - 1119913, -9854802, 3016141, -12217034, -31251256, 6316823, -13201656, -3626563, -6487548, 27311160, - -797790, -7894150, 8240969, 6941204, -17031156, -16815334, -1860795, -20524038, -8167954, -14566382, - -6861747, 9108015, 11082626, 12567611, -1919314, 5737003, -5689221, -4547297, 4087198, 4854924, - 4059281, -4483409, -3346853, 662499, 856846, 420370, -3075734, 2247342, 2065879, -1180579, - -1503239, 2499671, -2155000, 1779727, 356482, -1203128, -2400887, -2689187, -2412698, -821413, - 1078037, -807991, 1088774, -1086090, -53687, -1344325, 213675, 1736241, -3141769, -553514, - 5407364, -1074816, -1142461, 586800, 456877, -1735167, 736587, -1200980, -442382, -1537061, - 926639, 1101659, 1525250, 899259, 1061394, 1768453, -132607, -1214402, 515933, 535260, - -196495, -1097901, 1038845, 191663, 552977, -312459, - }, - { - 75001400, -117714320, -28039694, -25555056, -618475, -5217849, 5805722, 5846524, -15950435, 4763119, - -6824166, 38668128, 4368519, 11546483, -16813186, 255014, 5076652, 18013092, 2489471, 11684995, - -2776696, -11959336, 12768938, -739808, 4270271, -3427921, -1653026, -9934796, 11707007, -10537165, - 891743, 11644730, -3955128, -1230508, 5810554, 1178969, -3045669, 3950833, 1996086, -3140158, - 2273112, 2467996, 3026878, 1224603, 5965173, 3911105, -11291469, 5496485, -1433445, -1742146, - 4479651, 5110474, 4800163, -1360431, 3366181, 3674882, 471373, 3120831, -1157494, -2461553, - -465467, -5062693, 5813775, -3229279, 1263257, -231391, 1310502, -2051921, 590558, 1642288, - -301721, -207769, 726386, -483721, 188979, -4277788, -645319, -948114, -853088, -2039573, - -160524, -982474, 1452773, -1276679, -2748242, 686658, 2088428, 1370632, 554051, 1220308, - 1130650, 395137, 1446867, -2135136, 491237, -186294, - }, - { - -1436130, 1074816, -3661460, -3412352, -1875827, 1324461, 2126009, -1464584, 12989055, -2500208, - -2926483, 2572686, -9900436, 15443629, -25016574, 6084895, 3284039, 17936320, 15963857, 8286603, - 4219806, 28088550, 6010807, -18168248, -13711683, -11163157, -5868536, 4859219, 17632988, 5065914, - 8090108, -7659538, -8327942, 15879568, 2724620, 3164854, 104153, 6516539, 4124779, -2040646, - -721555, 856846, 3336116, -554051, 1050120, -7504382, 1851131, -6084895, -6896107, 457414, - 1483911, -1145146, -6149857, 1189169, -5748277, 3010235, 3135326, 3770981, 5142687, 2381559, - -1923072, 2455111, 1021129, -972273, 1040456, 1451699, 525060, -2401424, 3333968, 3860639, - 632434, 2313377, 2625299, 2311229, 562104, -318901, 42950, 1970853, 650688, 498216, - -610959, -1147293, 868120, -105764, 200790, -785442, 127238, -1364189, 1444183, 1658394, - -439160, -805843, 572304, -1360968, -633508, 1314797, - }, - { - 53469660, 326865280, -38589744, -22123914, -8777839, 30602, -3828963, -7624641, -847719, -4115653, - 2377801, -434329, 12147241, 5261872, 10375567, 4175245, 14394046, -8880382, 12502650, -6320045, - -3646964, 8236137, 5107253, 3616363, 2264522, 633508, -1626182, -1794223, -1634772, -3348464, - 12659953, 4318590, -6106370, 3089155, 5712307, -989453, -4070019, 5344550, 8728447, 1905355, - -186831, -1427003, 4413616, 4201015, -6172405, -1963337, 380105, -2659122, -4363687, 3584150, - 8229158, -3197603, -834297, -1355599, -3180960, -2137283, -1013075, 1513976, -1793149, -615791, - 316754, -2429341, -763967, 3073049, -5277441, -180389, 571231, -2724620, 192737, -73551, - 608275, -442382, -1666447, 361851, 1336272, -3392487, 660888, 2252710, -284542, 811749, - -1949378, 148713, -884763, 321049, -381178, 1163399, 1612760, 1256815, 877247, -1038308, - 871342, 134218, -520765, -705448, -493921, 1613834, - }, - { - 2250026, 68265824, -9475772, -12265353, -5353677, 11544872, -4465692, 10525354, -6201933, 3106335, - -648003, -2440078, -5298916, -12103218, -5786395, -8215199, -4924717, -3364033, 19765976, -19729470, - -28358058, 2623151, 2875481, 15231565, 3257196, -1586990, -17180, 7104413, 8150238, -3685082, - -10035191, 10714333, 6261526, -1959042, 5849746, -429497, 2750390, 12670690, -6339909, 8827768, - 756988, 3103114, 719407, 8946954, 8818642, -450972, 7053947, -2966749, 4288525, 6154688, - 907849, 895501, 6915971, -3075197, -574989, 598074, -1593433, -594853, 7001871, 1752884, - -76236, 2210298, 2777233, -1883343, 2122251, -2100239, 2896419, -548682, 2371359, 45634, - 4224637, 40802, -683974, -1362578, -516470, -801011, -312459, 508417, 1938104, -358630, - -1210107, -3460133, 418222, -1126355, 2088965, -1774895, 299574, -789200, -483184, 899796, - 609885, 605054, -261993, 729071, -335007, -661962, - }, - { - 34337728, -160682784, -30618822, -1815697, -13637058, 39375188, -1365800, 9269613, -4104378, 10758356, - -5429913, 11411728, -8435316, 12220793, -18758806, -700617, -1111323, -1889249, -12913893, 3400540, - -3943854, -6023155, 7151121, -5752572, 7480223, -7989713, -6529961, -3894999, -11931956, 5233418, - 8013872, 9016210, 328565, 4989142, 4282620, 1407676, -497679, 2750390, 4262755, 9620727, - 5298916, -3864934, 1085553, -6576669, -2054068, -9401683, 6386080, -3125126, -3102577, 3496640, - -16643, -1542967, 2247342, 7951058, -96637, -426812, -4213363, 2878702, 3439195, -5801427, - -1991254, 1284732, 2698313, 3701725, 278099, 3738769, -2340220, -195958, 11274, 1992865, - -799938, 292595, -1409823, 3434363, -1806034, 118648, 2245194, -1155883, 2028298, -554588, - -1294933, 414464, 788663, 99321, -406948, -132607, 257698, -259309, 1159641, 421981, - -648540, -359704, -1156420, -674847, -685047, -353798, - }, - { - -1953673, 50078244, 8783745, 1425929, 4249334, -3684008, -887985, 2876554, 1785633, -1731409, - 2025614, -3175055, 19359566, -19123878, 11986717, 2765422, -368293, 8675297, -3656628, 8039642, - -14620069, -4457639, 11201812, -6889665, -13537737, 937377, 4331475, -3806415, -3692061, 5190468, - -10552198, 5157719, -212601, -10983842, -3679176, -8558259, -11000485, 3604015, 105764, 1593970, - -8675834, -3138547, 8003135, 3253438, -4399657, 2218351, -7574712, 6221260, -707596, -1524713, - 5602248, 886911, 4767414, -3935264, 1174137, -4338454, -8449811, -2394444, -1618666, 712428, - 5191542, -608812, 731755, 543313, -4890894, -1556389, -1137630, -352187, 2952790, -1515050, - -852014, -2689187, -1435056, -2812130, 1999844, 1424319, 16106, 2267743, 2577517, 307627, - -175020, 966368, -455803, 1319629, 912681, 236223, -176631, -1375463, -115964, -369367, - -230318, -361851, -151398, -873489, -454193, 981937, - }, - { - -32824824, -83092048, 23138062, -6488622, 4769025, -15928423, -8107825, -4454955, 3969624, -28006408, - 13436268, 2216740, 3120831, -15382962, -17775796, 3342022, -348429, -5862631, -10201, 6190659, - -6842957, -7931194, 5054103, -1532230, -7841000, -728534, 1872069, 14492830, 11456825, -4003447, - -12625593, 8907225, 9196599, -7327751, 22841710, 13188771, 948651, 2815351, 719944, 6872485, - 12656732, 9820980, -6917582, 2650532, -13662828, 6886443, 208306, -2057289, -1956895, 421981, - 3881577, -1060857, -347892, -3263638, 2639794, 1586454, -159451, 6262599, 468688, 7816841, - -1089848, 192737, 2639794, 3020436, -1297080, 825707, 1040993, 471910, 2379412, 1387274, - -1531156, -919123, -1621887, -1040993, -195421, 715649, 904628, -891206, -1267015, 1032940, - -3530463, -99321, 752156, -879395, 470836, -332860, -75162, 80531, 2667175, -801011, - 1006096, 883690, 310848, -568546, 256087, 740345, - }, - { - -2896956, -57783952, 8497056, 7238094, 7937637, 979789, 8641474, 536871, 16644072, -2362232, - -10244034, 4759898, 6960532, 51163260, -29886530, 21922050, 9186935, -3951907, 20780662, 2159832, - -16935056, 16711718, -9378598, 13194676, 928250, 2993055, 14282377, -3828963, -14017163, 2049773, - 7299297, -4527970, -10873783, 755914, 1519882, 198105, -12328704, 2535641, -908922, -12117713, - 5708549, -6294275, 389231, 9062381, -2444373, -2496987, 1404454, 1189169, -4522601, -4774393, - 5985574, -1447941, 375810, -1342177, -3956202, -634581, -79457, 3502009, 2788508, -3232500, - 3955128, -1116692, 4005594, -5594195, 944356, -1938641, -911607, 658204, 1442035, 801011, - 1180042, -4671314, -978179, 138513, -872415, 1156957, -2830384, -1152125, -1738388, 1080721, - -703838, 2384781, 984084, -707596, -1124745, 666794, -1509144, -1481227, 1403917, 1170379, - 1550483, -1541893, -2777233, -447750, 161061, -145492, - }, - { - 1721745, -100196216, -15508590, 21564494, 1890323, -18955302, -4919885, 6191732, 358093, -5571110, - 23230404, -14869177, 11741367, -27239220, -40041444, 6016713, -280784, -1883880, -15580531, -4001299, - -6039798, -1807108, -5257040, 12150462, -2857227, -16561394, 6341519, -11394011, 11353209, -2593624, - 5596343, -2206003, -3293166, -16001974, -7368017, 19461034, 8885750, -3333968, 584116, 11751031, - 3212636, -9521406, -569620, -7354595, 3886946, -7297687, -1582159, 6206228, 11092827, -680752, - 161061, 7082401, -5286568, 2336999, -401579, -3855270, -6604049, 2636036, -1396401, 4332549, - -4029216, -4383551, -915902, -2066416, 3502009, -625992, -1346472, 1706176, 205085, -3208878, - -849867, 6331856, -2436320, -4798016, -1671279, -3812857, 1620813, 2507187, -3066607, 37581, - 2120103, -1247688, 933619, -259309, 376883, 940061, -188979, 2634963, -243203, 2261837, - 58519, 1445793, -979253, -2132988, 1005559, -189515, - }, - }, - { - { - -1210644, 46752868, -20779052, 639950, 8163659, 676457, 3803731, -4641249, 3484292, -608812, - 1802813, 9394167, 1464047, -7431904, 8646843, 3902515, 15457050, -11681774, 13657459, -865436, - 24962886, 11779485, -4469987, -19440096, -8778376, 15278272, 1447941, 4793184, -6731288, -11610370, - -382252, 21923124, 9693204, 4268661, 4749160, 5127654, -2348273, -2486786, 4833449, -631360, - -2615098, -4008278, 4080756, 581968, 6974490, -4519380, 2498060, 4956393, 2302639, -1181653, - -2188286, -1684164, -8254927, 1731946, -2456185, -1570347, -1406065, 2376191, 655519, -2906082, - 302795, 823560, -2848100, -2567854, -1532230, 44023, -1962800, 2517925, -21475, -1771674, - -578210, -1009317, 2223719, 1359357, 2353642, 663572, -375273, 1680406, 3824132, -2211371, - 1123134, 1785096, -1164473, -492848, 2010045, -68719, -933619, -1305133, -2277407, -1188632, - -676457, -1125281, 1008780, 65498, -493921, -354872, - }, - { - 21532818, -194490608, -14182519, -14918032, 9109089, 359167, -5612986, -95563, -273804, 20531018, - 4864051, 19319300, -6380711, 8419747, 10147934, -38210176, 3462818, 5342940, -7884486, 9664213, - -12244415, -6181532, -14037027, 5707475, -12633109, 12704513, 10618233, 6329708, 812823, 2958159, - 4281009, 6097780, -12734578, 7076496, 6457484, -8301635, -5652714, -5792837, 8420820, 11351062, - 1160178, 2187749, -12379169, 4332012, -3518115, -5677410, 1274532, -4969814, 4105989, 925565, - -2233383, -1046898, -5672578, -519691, -1790465, 2113661, -1383516, -4429722, -3057480, 2465311, - 1291711, -4290673, -2894271, 480499, 3416110, 262530, 1332514, 1963337, 3509525, -2168422, - 246424, 1784022, 3404299, 196495, -2626373, 1775432, -2333778, 2603287, 954557, -545461, - -306553, 613643, 840740, -278636, -1739462, -316754, 2121714, -15569, -432718, 1810329, - 1349157, -901406, 666794, 337692, -1472637, -333397, - }, - { - 5493800, -22468048, -20353850, 25109452, 2943663, 3087545, -5545340, 7326141, -7865696, 4587562, - 2849711, 885300, 3974992, 9725417, 12282533, -704912, -6235219, 6628745, -222265, -1584843, - 1959579, 10472204, 16026134, 27360552, -4036196, -2639794, -15149423, 6617471, -13469554, -2911988, - -15643345, -3435974, -11002632, -12611635, -2030446, 2912525, -3984119, -1156957, 9183177, -2164664, - 877784, 964220, -165356, 3567507, -5898601, -5057324, 7461969, -1034550, 367757, -122407, - -3442953, -157840, -4457103, -1336809, -3773666, 2791729, 3795141, -200253, -6078453, -610422, - 1263794, -863288, -1037235, 150324, 2048699, -3772055, 2253247, 1268089, 591095, -1436667, - -2598992, 367757, 250719, 576599, -2988760, 215285, -1627793, 326954, -2101313, -1622424, - -2319282, -2109366, 300111, 1119376, 2427730, 1129040, 53150, 1336809, 1835025, -260382, - 1058710, -287226, 148176, -340913, -754304, 144418, - }, - { - 2362769, -785442, -6316823, -4344360, -3702262, -611496, 551903, -3409667, -4183298, -4170413, - -3075197, 3673271, 17960480, -17770428, -2109366, 11314554, -14775224, -6276558, 12976707, -5095979, - -1359894, -8639864, 7670812, -10701985, -11141682, -3107409, 4740034, -17936320, 287226, -3656091, - 3100967, -11130945, -25866440, 59056, -2075006, 293668, -14421426, -9418326, 12602508, 2014877, - -3046206, 8046085, -6347962, 6345814, -4129074, 2535641, -6746857, -3716221, -1843615, 743566, - -4459250, 3180423, -1234266, 1594507, -899259, 1171989, -2609730, -24159, -1481227, -4291209, - 787053, -1013075, -1560147, 2625299, -2247342, 298500, 4183298, 1299765, -3662533, -766115, - 2626373, 2562485, -2253784, 853625, 480499, -798327, 184147, -2260764, 911070, 564788, - -435939, 831613, 278099, -668404, 846645, -441845, 1247688, -926639, -182536, 944893, - -370441, 700617, 670552, -814970, -21475, -678068, - }, - { - -57319024, -102291088, 30234960, -13923747, 4815732, -1133871, -7813083, 7924752, -10587631, -2769717, - -7617662, 22850300, 4514011, 9810779, 4245575, -7246147, -9121437, -11343009, 4708895, -1502702, - 9048959, -4333085, 10108206, -12442520, 16767015, -1017907, -3131568, -1785096, 3961034, 3918621, - 1096827, -7943005, 99321, -1734630, 4491999, -2951716, -10364830, 13263933, 875100, -21021180, - 9287330, -6751689, 11944841, -4490389, 7021735, -1753957, -3868155, 2944737, 475131, 3354370, - 1818382, 2139968, -1455457, 23622, 2586644, -5473399, 3532611, 2685428, 769336, 1992865, - 2684, 659278, 2185602, 2930242, 3150896, -2949569, -642635, 2415919, 1924145, 1495186, - 3692061, -1002338, -265214, -418222, -2214593, -1325534, 1001801, -701690, 2113124, 780073, - -899259, -61203, -38118, -1757179, -175020, 927176, 2173254, 855772, -185757, -406411, - 234076, 722091, -501437, 55298, 1738925, -805843, - }, - { - 716186, 9635222, 1097901, 6534793, -1042066, -148176, 459025, -2115808, -2227478, 1169305, - 4922570, -9825811, 1901060, -14788109, -23794656, 20093468, 4136054, 4781909, 2589329, 31607202, - -5364414, -25566330, -15263777, -6735583, -12144020, -10172630, 1412507, -5669894, 3733937, -3241090, - 1516124, 7735236, 5792301, 6864432, -3726958, 7222525, -4126927, -8541616, -6877854, 2414845, - 8092792, -6167036, -1929514, -3735548, -6343667, -1248762, -4087198, 5999533, 4053912, -4116189, - -5745593, -954557, -6002754, -1236414, -5413270, -3626026, 1108102, -1479616, 1457068, 930934, - -2297808, -2177012, -2301029, -3912178, -321049, -3546569, 287763, 2863670, -4672925, -2433636, - 8198019, 2017561, -851477, -643708, -1231582, -2817499, -1808718, -1540820, 326418, -445603, - 2097555, 1244467, 258235, 122407, -750546, 922881, 712965, -583579, 734976, 656056, - -492848, -1537061, 95026, -992674, -372052, -417686, - }, - { - -68744712, -252797488, 38546256, -1399086, 8726300, -993748, 716723, -5764920, -22761180, 15698105, - 5856188, 30105036, -14805289, 9028021, 1153736, -15569, -3738769, 3880503, -15934329, 14359149, - -894427, -10126459, 7291244, -3957812, 2448131, -4657892, -401579, -8267275, 12090870, -6877317, - -2710661, 6039261, -368830, -503048, 5308580, 9898289, -7937637, -5015985, 899259, 3797825, - 6003828, -1127429, 1250909, 1323924, 2276870, -1887638, -9225053, 5356361, -6860137, -2651069, - 995896, 7331509, 6183679, -4907000, -756988, 1963337, -563178, 1850594, -261456, -2509335, - 772020, -1358820, 7407745, -1551557, 6359236, 2911451, 2736968, -1668595, 274341, -492848, - -875636, 3200288, 1884954, -3032247, 642098, 193810, 874563, -2132451, 603443, -1248762, - -1598265, -374736, 25770, -2074469, -2002529, 1033477, 715112, -173409, 300648, 592706, - -71404, -1995549, -882616, -944356, 1868311, 1130650, - }, - { - 415001, 13813689, 2335925, 557272, -1781875, -70867, 1886028, -1007170, 18359912, -608812, - -3496640, 6411313, 1384053, 20735028, -14278619, 12952548, -19582904, 6779606, 3749507, 1867237, - 10223096, 9082245, -7854959, -13077102, -395137, 7914014, 13209172, 14302241, 4742718, -3843996, - 15701864, 1076963, 1588601, 8542153, -6940131, 6749004, -1024887, 2329483, 887985, -609349, - -678605, 1502702, 6677064, 268435, 4223564, -6599754, -3389266, -5272073, -6638946, -4174171, - -3153580, -382252, -3950833, 708133, -432181, 7763154, -85899, 323196, 1741072, -412854, - -2666101, -699006, -5167920, -3018288, -468688, -1430224, -1147293, -1804960, 842350, 1626182, - -2409477, -1449552, -819802, -823560, 1460289, 1311039, -304943, 2097018, 959925, 875636, - -680215, -133144, 1140314, -424665, -870805, -1307818, 219580, -709743, 1134408, 434865, - -275415, -115964, 724776, -1021129, -138513, 1624571, - }, - { - -74431248, 231840720, 41941428, 470836, -11559904, 1153199, -6778532, -3687766, 3862249, -11646341, - 7190849, 7068443, -1144609, -15648713, -5880884, -5432597, -1398549, -13311714, 7249368, -6152004, - 326418, 7970923, 6247030, 1441498, -2285996, -5690295, -7059316, -2207076, -4646081, -10125385, - 10555419, 3056943, -8830453, -227633, 1703491, 1200980, -1008244, 6826851, 1162862, -3492345, - 1566053, -4547297, -6385006, -1268626, -4677757, 2724620, 2665027, -5994164, -6286759, 2182380, - 6053220, -3558381, 1383516, -3600256, -1053341, 3649649, 1702418, 3738769, -810675, 199179, - 646393, 48318, -3778498, 38118, -3399467, 2614025, 4832375, -453656, 759672, -285078, - 222265, -273267, -2909840, -2244121, -29528, -2391223, 1981054, 2381559, -119722, 11274, - -1575179, 116501, 23085, 141734, -117575, 1017370, -583042, -332323, 1355062, -1057099, - -868120, -947040, -1003949, -1037772, 124017, 513785, - }, - { - -867583, 83098488, 15262166, 4265977, 1116692, 11622718, -16935592, 6979859, -3985193, -1593970, - -11595338, -7523709, -10285373, -21316460, -5418101, -7794829, 5201743, 14385993, -6161668, -42230264, - -19193672, 1910187, 4141422, 15918223, 943282, -4384088, -4111894, -9523016, -7786239, -10092099, - -9361955, 9962714, -2137283, -4727149, -224412, -2738579, -2836826, 2343442, -15937550, 8517994, - 736587, 2749853, 317828, 1748052, 2890513, -4614406, 6019397, -814970, 2658585, 1282585, - -2612414, -5156108, 6614787, -4788889, 278099, 2446521, -5036923, -7001871, 5125507, 4475356, - -916976, 2884608, 4042638, 825171, 6036040, 350577, -477278, -3047816, 2381023, -1938104, - 1460826, -992137, -1611, -988916, -2091649, 1151051, 2851858, 401043, 250182, -817118, - 922344, -1888712, -1072131, -2911988, 2624225, -66035, 982474, -1123671, -1601486, -184684, - -866510, 343597, -802622, 87510, 667331, -493921, - }, - { - -33950644, -168576400, 42582452, 2435247, -12315282, 34478924, -9296457, 4115653, -16880296, -4959614, - -3141232, 7010997, -17432198, 22843320, 2489471, 8208220, 49392, -4030827, -7059316, -128849, - -1960116, 3948149, 13862007, -7562901, 1758252, -8439611, -4700842, 6258841, -6832756, 110595, - 1490354, 3111167, -6240051, 1115618, 8011725, 12170327, 4931696, -1305670, -6798933, -2928631, - -3765076, -8696235, -369367, -6639483, 3442416, -7881802, 4453344, 3215320, 7821136, 7344394, - -4598300, -1757179, -2627983, 3740380, 1858647, 5618891, -39728, 155156, -1854889, -6851547, - -2201708, 217970, -377957, -1465658, -3422015, 1797981, -1255741, 1012002, 130460, -1671816, - -3676492, 2133525, 1398012, 3671123, -1582159, -403727, 1302449, -2822867, 1611, -22012, - 219043, -545998, -409096, -484258, -428423, 474594, -204011, -974958, 160524, 316754, - -1207960, -1352378, -598074, 1058173, 206695, -1254131, - }, - { - 2740726, 34637836, -10149545, -1537061, 3523484, -1335735, 2592550, 3867081, 2035278, -883690, - -9132711, -10225243, -855235, -56457344, -13087302, 14097693, 10632728, -1924145, -1632625, 10524280, - 4916127, 520765, 26088706, 4558034, -17991618, -1287953, -5191005, -8627516, -6548752, 918049, - -15624017, 19299436, 14155138, -8470212, 4904853, -109522, 2831457, 9279277, -2962991, 1174674, - -12702366, -3881040, 9552007, 4381404, -9201431, 7025493, 3070365, 9244380, -3279745, -8733279, - -1115081, -468688, 1996623, -11073499, -3304441, -1280437, -3091840, -499827, 1544578, 2835752, - 2949569, -942745, 274341, -3262565, -4477504, -889595, -1232656, 1864553, 4483409, -1009854, - 1468342, -1093606, -1823214, -1524713, 2868501, -2160906, -2446521, 775242, 1356673, 2544768, - 1326071, -192200, 956167, 561030, 8590, -471910, -462783, 405874, -255014, -367757, - 1017370, -223875, 989990, 226023, -491774, 933082, - }, - { - 51310364, 19949586, 5430450, -8579197, 21394842, -21339546, -19617264, -166430, 20892868, 4342749, - 15473157, -14366129, -5863704, -5686537, -11880953, 5637145, 7446400, -11598559, -3524558, 10310069, - -3104725, -11794517, -2029909, 3006477, 4052839, 4615479, -9139690, -5768141, 9070434, 13505525, - 512175, 11553462, 4988068, -14078903, 13515725, 9055939, 1339493, 4680441, -3392487, -1460289, - 10325638, 9655623, -5609764, 2185602, -13680545, 2186138, -867047, 5760088, 9301825, 4360466, - -24159, -5499169, 784368, -7005629, -4277788, 1270237, 1190243, 3899830, -1291711, 6249178, - -2005750, -2449742, -642098, 148713, -3394635, -629750, 1853278, 3157338, 1191317, -1094680, - -925029, 423054, 1256815, 408022, 175557, 1145683, 464393, -1243393, 869731, 2971044, - -1188095, 2072322, 1459752, 1315871, 288837, -561567, 1115618, -1052804, 781147, -799938, - 1559610, -47782, 1069984, 694711, 1198296, 500901, - }, - { - 2399276, -74737264, -8992588, -3009162, 1738388, 1595044, 6372121, -7050726, 6005438, 115964, - 170725, 7656853, -1676111, 5429913, -94449552, 6847252, 6699612, 8698383, 6928319, 24299314, - 1322313, 9691594, -4971962, 7573101, -2851322, 13827110, 17237314, 985695, -11973832, -11295764, - 3211562, 2043331, -8423505, 2032056, -3536906, 10888816, -1063541, 4086125, 2197950, -11673721, - 4627828, -5583995, 4938676, 10127533, -1132798, -544924, -3181497, -3101503, -3296388, -2167885, - 5177046, -2786897, 2665564, 2879239, 6979, 2396055, 2899640, 1240709, -2583423, -5106179, - 602369, -4784057, 2284923, -3977677, 2968896, 1607928, 2577517, -2446521, -2367064, -2212445, - 3245922, 2561948, 1918240, -680215, -109522, 1057099, -2159832, 1136019, -2254321, -1352378, - -3928821, 478889, 1126892, 2278480, 1578401, 401043, -464393, -782221, 667331, 1613297, - 3082713, -94489, -1782411, -301721, 153545, -932545, - }, - { - 20096152, -75528072, -17160542, 14903000, 4916127, -14965277, 2272038, 7503308, -13317620, -8846022, - 27218818, -21327734, 11148661, 5714991, -420907, -2239289, -24890946, -17994302, -20601884, -2297271, - -1288490, 10073309, 1152125, 10552735, 9072582, -6716792, 13870597, -1680406, 2577517, -3825205, - 12595528, 10562935, 4775467, -6713034, -9709310, 10412074, 10400800, -2678986, -615254, 8419210, - -3389266, -1141924, 6591701, -3262028, 9240622, -5154498, -3819300, 1009317, 11062762, 766115, - 1562831, 4937602, -5796059, -4011500, -4566624, 1802276, -3212099, 852014, -2106682, 4395899, - -2050847, -1066226, -1346472, -2121177, 1670205, -1653026, -2746632, -846109, 3500398, -14496, - -2353105, 5332202, -362925, 81068, 363998, -1583232, 2044941, 1799054, -2879239, -1325534, - 3664681, 892816, 652298, -420370, -1381369, -620623, 1642825, 2927020, -1756105, 955630, - 308701, 2284386, 391379, -312996, 1582159, -1467268, - }, - }, - { - { - 236223, 7364259, 6971806, 19210314, -6539625, -668404, 3463891, -1014149, -2634963, -4632659, - 24082956, -1079647, -2330557, 12123619, 11668352, 2680597, 8273718, -256624, -6596533, 2200634, - 22335978, 1647657, 266288, -21922586, 8074539, 6414534, 3102040, 2221035, -9390946, -17924510, - 7704098, 20653424, 5422396, 3329137, 5090610, 436476, 677531, -3304441, 5817533, 2003065, - -5127117, -5652714, 5088463, 6283537, -3092913, -9065602, 2870649, 9386114, -843424, 1118302, - -2621541, -3756486, -5408975, -1969243, -2025077, 2058900, 87510, 2074469, -8053, -2224793, - -2673080, -1211718, 2485712, -3066070, 111132, -3704946, 1610076, 2531883, -4070019, 1724429, - -1908039, 527207, -751619, 1557999, 4350265, 996969, -1479616, 3073049, 1084479, 2170569, - -1722282, 704375, -756988, 231391, 2084670, -402116, -409633, -1176821, -2367601, -528818, - -1321776, -500901, 217970, -372052, 390305, 404264, - }, - { - -15227270, -175850992, -4161823, -13951664, 14283451, -5034239, 2486249, 8057359, -6640557, 3309809, - 12217571, 22056268, 333934, 3017752, 7118909, -16005732, -20025286, 2937758, 7399155, -5690295, - 4863514, -9264244, -15047418, -13190918, 4265440, 4698158, 13965623, 6921877, 4165045, 2797634, - 5988258, -1507534, -2268817, 3124052, -8653822, 3265249, -2638721, -5748814, 12174085, 3277060, - 2512019, -2863133, -4728759, -5126044, -2155537, -4903242, 603980, -3018288, 1365263, 2571075, - 613107, -5989332, -3693135, -1334124, -830002, 5301064, -4456029, -2798171, -2491081, 1704565, - 3128884, -7318625, -1179505, 914828, 3476239, -689879, 3887482, 497142, -154619, 543313, - -672699, 3697967, 692564, 2158221, -785979, -443455, -1522566, 2330020, -230318, -653372, - -54224, 1981591, -350040, -1080721, -883690, 132070, 188442, 1067836, -286152, 2242510, - 406411, 71941, -433255, 17180, 362388, 115427, - }, - { - -4980015, -62272192, 16980690, 26952530, -1235877, -1427540, -1433445, -2122251, 2910377, 6384469, - 9065065, -13162464, 7394860, 10499048, 1269700, -1179505, -3107946, 13319230, -5228049, 7822209, - -10201, 8196408, 25147570, 11135240, 2340757, -1337882, -11734924, -3149822, -2210298, -4190814, - -8574365, -16166794, -11158862, -4141422, -3812320, -1826435, 1850594, -4736812, 3442953, 3314104, - -1171452, -932545, 1270774, 1966021, -7370164, -1482301, 3326452, -3721589, 3540664, -1665911, - 953483, -4199941, -2794413, -4588099, 1795833, -277562, -217433, 2914672, -4294431, -3739306, - 2145336, -2173254, 1635309, -2554969, -1279900, -330712, 1633161, 1227824, -222265, -2756295, - -93416, 991601, -830539, -32749, -516470, -1274532, -782221, -1938641, -2361158, -103079, - -1562294, -2525441, -121870, 1219234, 2539400, 1009317, 710280, 335544, 1385127, 803696, - -719407, 229781, 835371, -639413, -328028, -73014, - }, - { - -2663954, -630823, -2513630, -7968775, -322659, -120259, -750546, -551903, -3639985, -8114804, - -380641, 3197066, 12902619, -7050189, 20049982, 9286256, -43795780, 8312909, 17267916, 3382824, - -6019397, -7960185, 6149857, -15629923, -18489298, 17239998, -15148350, -10997801, 2303176, -12543452, - 18611704, -16101296, -23833848, -1335198, 4456566, -20876226, 2808909, -3711389, 1636919, 6467147, - -4367445, 8534100, -1838783, 2678986, -3212636, -3703336, 2354179, -6008123, -5246303, 6855305, - -2696703, 889058, -666257, -646929, 1771137, 675384, -4423817, -3476239, 3357054, -3805341, - 1769527, -6494528, 677531, 2292976, -308701, -863288, 3442953, 1711008, -3913789, -1376537, - 5184026, -832150, -824097, 1320166, 1248762, -1779190, -2037425, -527207, 604517, 178241, - -194347, 52076, 1345399, -658204, 1058710, 444529, -723702, 377420, -1194001, 1360968, - 292058, 310311, 119722, -159988, -738734, 248571, - }, - { - 51836496, -195390416, -15424838, 826781, -1534377, -3731253, -1592359, -574452, -3911642, -3827890, - -165356, 17077864, -3109556, 16252693, 5190468, -2560874, -16291885, -13247290, 9674414, 6095096, - -1271847, -2046015, 1692217, 7781944, 1128503, 11758547, -4573067, -3744675, 7108171, 1617055, - -3587908, -6322192, 2479270, 2544768, -7031935, -1001264, 21262236, 90194, -5222144, -14089640, - -295816, 282394, -2356863, 5091147, 4409858, -6498286, 2108829, 5706401, -5721434, 1930588, - 3588445, 3151432, -4870493, 478352, 1457068, -2271501, 3679713, 1011465, 142808, 1432909, - 1089848, 548145, 3144990, 1743220, 536871, 989990, 1006633, -1187559, 2215666, 2393371, - 4118874, -1133335, 1624571, -3346853, -1173063, 42413, -1741609, 1044751, 315143, 1404454, - -185757, -1598265, 1249299, -1566053, 631897, 1428077, 238371, 1116155, 501437, 41339, - -264141, 660888, -288300, 224412, 1165547, -374199, - }, - { - 798864, -1533303, 12468827, 505732, 1758789, -522912, 644245, -2051384, -6090801, 3374234, - 3958349, 619012, -3828427, 14903537, -24770150, -21427054, 33178622, -2392834, 1122060, 28798292, - 2888366, -15710990, -19075560, -9764071, -10799695, -2856153, -4806606, -1501628, -9227200, 21870510, - 5872294, 1531693, -5754183, -4772783, 7218230, 2245194, 2035815, -1784559, -7687992, 74088, - 7386270, 575526, -2823404, -8479876, -6014565, -802622, -4046396, 4038880, 79457, -4473746, - -4383551, -1430761, -5040144, -3444564, -2746632, -4845260, 179852, -1231582, 2353642, 2635499, - -2105608, -3912178, -1235877, -2803003, -854699, -3189013, 519691, 1655173, -3697430, 710817, - 5069672, 1852742, 68183, -408559, -4410932, -2385854, -1293859, 1122597, -1761474, 379031, - 1694365, 2232846, -1838783, 1660542, -854162, -823560, 847719, 177704, 175557, 514322, - 191126, -1238024, -1154809, -47782, -1232119, 587337, - }, - { - 47318192, -351603744, -17053168, 19366544, 2219424, 1060857, -3528853, -11965242, -6333466, 3602941, - 22919556, 2749316, 13959, 3621731, 2851858, -1173600, -14178224, 9470403, -9357123, -19864, - -3271691, 2672544, -714575, -7546795, 3823595, -2555506, -25233, -2604361, 2885681, 2655901, - -8894340, 1372242, 4687957, 1288490, 3528316, 5599564, -6300717, -6638946, -4811974, 10141492, - 1319629, 776315, 1220308, 862215, 1762547, -3109020, -843424, -4053376, -7189239, 360777, - -2290291, 9066676, 2277407, 50466, -2982855, 2132988, -1072668, -497679, 3900367, -2837363, - 1989644, 518617, 2017024, 3022046, 7087770, -968515, 1914482, 874026, 397821, -197569, - -912681, 4001299, -169114, -1326071, -351114, 1358283, -7516, 301721, -798327, -631897, - -1158031, -840203, -1478006, -1792075, 228170, 141734, -478889, 490700, 452582, 1024350, - -2224793, -172872, -1864553, 430570, 530965, 1334124, - }, - { - 1363115, 2670933, 7479686, 1536525, -2843805, 493384, 1483911, 4536559, 9310952, 570157, - 2289755, -102005, 6678674, -209917, 15651935, 8669928, -10351408, -6752763, -89657, 14099841, - 854699, -3896609, -4907537, -8997420, -4716411, 16329466, 11071352, 16059420, 4742718, 13289166, - -12043088, 4001299, 712965, 2485712, -4648229, 12310450, -8410620, 4383014, 3136400, -6397891, - 6410776, 1528472, 3355980, 3023657, -4663798, -714575, -5525476, 2426120, -8628052, -3433290, - -5768141, -3780645, 3895535, -7501161, 7423314, 5389647, 317828, 2517925, -4841502, 1262720, - -395674, -3358128, -4861366, -1973538, -2349884, 435402, -2825015, -752693, -111132, -1202591, - -1847910, -953483, -335007, -1836635, 1174137, 1494112, -730144, 1989644, -365609, 860067, - 2107218, -2248952, 1563905, 353798, -3045132, 1445793, -1427003, 414464, 38118, -476205, - 942745, 2684, -58519, -98247, -685584, 1451162, - }, - { - 82762944, 100474856, -38257960, 17652852, -3905199, -165356, -12737262, 5397700, -3724274, -5908802, - 10930155, 13114683, -16823924, -10395431, -2423435, -7883950, -16656957, -333397, 3767760, -8428873, - 10943040, 406411, 551366, -4828080, -408022, -2961917, -8674223, 1180042, -4614406, -3583613, - -884226, 9196599, -10073309, -3497177, 428960, 7910793, -4146791, 5579163, 843961, 3620121, - -1222455, -4708895, -8934606, -4599910, 1621350, -1496259, -1076963, 717260, -550830, 372052, - 613643, -1195075, -1457068, -389768, -437550, 5121749, -1360968, 5309654, 1442572, 466541, - 140660, 977105, -4693863, -237834, -769873, 2405182, 2719251, 2272575, -693637, -481036, - 288837, 630286, -2070174, -2578591, -1240172, -981400, 1508070, 1459752, 945430, -2007360, - 823023, -90194, -268435, 66572, 1626182, 531502, -907849, -1060320, 652298, -545461, - -551366, -904091, -106300, -1491964, -155156, -392990, - }, - { - -551903, 82159504, 12499429, 12104828, 1196148, -4887136, -10831371, 1588601, 5641440, -7721815, - -3831111, -6199786, 3351685, -27458800, -741956, -8703751, 5414880, 4100083, -20075214, -18597208, - -8949638, -4893579, 11258720, -739808, 3942243, -764504, 4538170, -13430900, -6034966, -10954314, - -1980517, -1410897, -10660646, 6860137, -4749160, 1666447, -10936597, -4900558, 2462627, 2237141, - -4962835, 4929012, 4063576, -5856188, -2057826, 2724083, 738734, 4580046, -52076, -3046743, - -1511292, 255014, 3363496, -2637647, -237834, -909459, -3340411, -3295314, 1836635, 3438121, - -1228361, 5072893, 3191161, -434865, 6255620, 2960306, -1078574, -5367636, 815507, 33286, - -1284195, 2599529, -1801739, -100395, -3243774, 1375463, 3855270, 1343251, -95563, -686658, - 270583, -1524177, -1850057, -1088237, 1196148, 181999, 261993, -373125, -792421, -2106145, - -270046, -359704, -153545, 208843, 29528, -329102, - }, - { - 31003222, -179057728, -16958142, -7836168, 13931800, -17624398, 13639742, 8163122, -6096706, -19827716, - 4958540, -9783936, -14396194, 13057774, 26348014, 2552284, 7093676, -9179419, 1007170, -12875775, - 6799470, 687195, 8368207, -4832, -13109314, 2246805, -915902, 1995549, -8020852, -4578972, - 7653095, -2893197, 1840394, -5757404, 3186329, 15796890, 3638374, 3735011, -10084583, -7494181, - -4437238, -2354179, 779000, -7015292, 1873680, -2974265, 477815, 6129992, 6440304, 11000485, - -3356517, -3112241, -5901822, -1131187, 4020090, 4400731, 4584341, -4249334, -1489280, -1307818, - -102542, -2292439, -2315524, -1997697, -1096827, -123480, 351114, -1078037, -983011, -1249299, - -2756832, 1122597, 2920578, -192200, 556735, 326954, 595390, 242666, -1975685, -668404, - 474057, 162672, -25770, -2817499, 1159104, -532576, -376883, 426812, -1342714, -24696, - -803159, -1875827, 616865, 519691, 62814, -870268, - }, - { - -3424163, 14549202, 5383742, 1815161, -7563975, 11278047, -3347390, 9016210, -955093, -4364224, - -7198902, -6992744, -9478993, -50133544, -22836878, 19248432, 25011206, -28217398, 13716515, 13342316, - 6060736, -14367202, 22326314, 6017786, -2015413, -4502200, -15873662, -4883915, -2130304, -13930190, - 12064026, -5635534, 16712255, 7888781, -2003065, 596464, 9550934, -6124624, 5410048, -5033702, - -3847754, 2367064, -301721, 4594542, -4139275, 3046206, 10377178, 2396055, -2340220, -4973572, - -3274913, 872415, -972810, -7095286, -3554622, -2979634, -1600949, 586800, 1427540, 5587216, - -1772748, 1032403, -1026497, -5189394, -165893, -3754875, -52076, 1792612, 3396246, -279173, - 2296734, -1903207, -2111513, -1476932, -388158, 503585, -1316944, -1082869, 2028835, 2041183, - 62814, -31675, 1948305, -6442, -35970, -583042, -1199907, 919660, -907312, 113280, - 2081985, -452045, 665183, 381715, 430034, -336081, - }, - { - -48103632, 164651328, -9178345, 4086662, 24521578, -20703890, -3411815, 16070157, 117575, 22788022, - 1102196, -14319421, -10539850, -2574296, -9287330, 2427194, 10505490, -9147743, -3096672, -6542846, - 6373195, -5104032, -6758668, -6024229, 7986492, 5091684, -9241696, -10993506, 13492103, 13242458, - 3434363, 10539850, 2668785, -10686416, 2987150, 13850733, 5214627, 6751689, -7462506, -4434017, - 9745281, 5755256, -2878165, 3357591, -4166118, -7090454, 3442416, 4375498, 9137543, -189515, - -865436, -6338298, -871342, -7008850, -1271310, -1034550, 1741609, 2093797, 2384781, 489626, - -926102, -1621350, -217433, -1787780, -1319092, -293132, 264141, 2114198, 143881, 143345, - -1369021, 1908039, 30065, 934692, 1043140, 1980517, 1163399, -2502892, 1054415, -1229971, - 2479270, 2159295, 321049, 3293166, -1749125, -1033477, 2779381, -1912334, 566936, -336618, - 657130, 287763, -16106, 1643362, 1449015, 410169, - }, - { - -2430952, -80115632, -1289564, -7142531, 236223, 7938710, 1031866, -4597763, 1641214, 4882841, - -1999844, 12010339, -2708514, -27872190, -44405132, 4393215, -11082089, 27083526, 4765803, 1271847, - 9174050, 4886062, 7167764, 5876052, -10132902, 8841190, -2674154, 6750078, 9558450, -17595408, - 9544491, -1752347, -5983963, 3727495, -1063004, -708133, 4260608, 3520263, 3191161, -3638374, - 1140851, -5601174, 6092411, 3209951, -2506650, 6905771, -7496329, -394063, -1566589, -11811, - -1296543, 60130, 3534758, 1460289, -1569274, 5901822, 4797479, -2330557, -5536750, 673773, - -4813585, -1833951, 61740, -1388348, -105764, 4041027, 2430952, -3466576, -2875481, -2001992, - 1333051, 1340567, 3710315, 1409286, -731755, -1334661, 815507, -166967, -1115081, -433792, - -3195993, -1354525, 2039036, 3288871, 1098975, -841814, -66572, 92342, 1738388, 397284, - 1808718, 453119, -376347, -615791, 151934, 310311, - }, - { - -35013648, -64961, -18046916, 22928682, 11392401, -14879377, -2961917, 4437238, -9446781, 2678449, - -5734855, -499290, 4665408, 1625645, 24876988, -18299782, -19765976, -13434658, -25457882, 4873178, - 2705293, 4311611, 4685273, -1845225, 18933290, 4606353, -3623342, 9556839, -16709570, 16224239, - 2002529, 13925895, 6274947, 1119913, -7190849, 4114579, 6178311, -4671314, 4970888, 6376953, - -11982422, 7962333, 3323768, 1142461, 1442572, -278099, -789737, -2027225, 6106370, 2400887, - 5737003, 1002338, -4333085, -5943161, -1884417, 2408403, -1373853, -1645509, -478352, 2572686, - -2723546, 1261647, -2186138, -515933, -1126892, 1405528, -3253438, -2405182, 5520107, -84289, - -898185, 1104344, 475131, 2815888, -2306934, 1933272, 1785096, -368830, -1440962, -1347009, - 1547262, 2094870, 729608, -286689, -713501, -3036005, 3722126, 725850, -920734, 621160, - 484258, 1523640, 1276142, -121333, 1319092, -750009, - }, - }, - { - { - 799938, -19618874, -10013179, 14323716, -7583839, 2401424, 3241090, -2563559, -839129, -6422050, - 23108534, -5668283, -3930969, 11945915, 8965744, -3788161, -1534377, 9677098, -9059697, -21731998, - -5171678, -5152887, -99321, -9603547, 27944668, 3026878, -8491687, -6677601, -9729175, -16655346, - 276489, 3604015, -3968550, -4029216, 6334540, 6310381, 5130339, -9160092, -5655398, -687195, - -4564477, -5294084, -269509, 2620467, -1899986, -10965052, -5332202, 2001455, -2364380, 6640020, - 442919, -2355790, -3283503, -2828236, 612033, 3422015, 40802, 4122095, 1079111, -1727651, - -2528125, -1668595, 5927055, 976568, 1066226, -4576288, 719407, 1723893, -3887482, 1433445, - -2559264, 832150, -797790, -1385664, 631360, 601832, -2279017, 930934, -1448478, 798864, - -3569655, -811212, -54224, 1903744, 1964948, -1392643, -53687, 102542, -1088237, 80531, - -1098975, 356482, 1168768, 396748, 389768, 215285, - }, - { - 8349417, -203197584, -54977728, -36130876, -5408438, -7215545, -1398012, 962610, -9584220, -12089259, - -9636833, 13353590, 2447058, -4212826, -1942936, -5670968, -11944841, 2325188, 6695854, -11009075, - 4554813, -4030290, -9731322, -16689706, 6296422, -2479807, 3030636, 6562173, 5591511, 1111323, - 3054259, -2338073, -3689377, -938987, -7427609, 3369939, 32749, -4464619, 2755759, -10974715, - -4214437, -922881, 3199214, -5690295, -2179696, -1896765, -1361505, -8286603, -2945811, 5216775, - 5453535, -1706713, 206158, -2842732, -4600447, 7245610, 1258425, 1619740, 1133871, -320512, - 1238024, -4969277, -2836826, -2762738, 1022739, -2675228, 2192044, -203474, -3938485, 28991, - 90194, 3170760, -1671279, 1314797, -207769, -369367, -1950989, -1007170, -2777233, -1357747, - 186294, 2186675, -1300301, -581431, 1216550, 1028645, -704912, 607201, -417149, 1957431, - -406411, -171262, 70330, 833761, 638340, 571231, - }, - { - 4038343, -77815144, -9757092, 2676302, -17778480, -5187247, -2410014, -591095, 4674535, 8546985, - 13262859, -15707232, -134755, 6058588, -9991168, -2959233, 4828080, 14734422, -13154948, 11538967, - 1043677, 4239133, 22180284, -1709934, 5990943, 5380521, -7640747, -4563940, 3094524, 6493454, - 10205379, -6944425, -5427228, 977105, -668941, 3762928, 6074695, -4808216, -173409, 2051384, - -1122597, 1403917, -4365298, -3830574, -1036698, -1592359, -6018860, -7611219, 412317, -95026, - 1890323, -7437273, -1212255, -1548336, 1304060, -3353296, -2559264, 3418257, -2237678, -3987877, - -1194001, -2640331, 2252174, -5414343, -2580202, -16643, 1353989, 2327872, 884763, -2253247, - 153545, 1347009, 197569, 982474, -815507, -2077154, 1471563, -89657, -897648, 1361505, - 585726, -864362, -417149, -622770, 542240, -177704, -710280, -1214402, 405338, 600759, - -1199370, -194884, 244813, -136365, 347892, -482647, - }, - { - 2069101, -2813741, -7073275, -4191888, 1690070, 219043, -1296543, 1708860, 141197, -6841883, - 769336, 2315524, 4161823, 2141578, 54794120, 27845346, -38048040, 19355806, 27745488, 18321794, - 11920145, -2228014, 4429722, -2150705, -10559177, 10137733, -21203716, 4010426, 12757127, -12672301, - 23339926, -856309, -6692096, -4850629, -5789616, -11660299, 17271138, 4291746, 2043868, 4522601, - -3125663, 4799089, -640487, 5586142, -2029909, -4212826, 8521752, 2375117, -1263794, 8157217, - -872415, -1718524, 1507534, 1589675, 1797981, 45634, -3642132, -2059974, 6898255, 458488, - 3182571, -4239670, 1841467, 698469, 1083406, -635118, 2197413, 1488743, -2077154, 302258, - 3853660, -2796024, 929860, 2006824, 1438814, -995896, -751619, 272730, -419296, -782758, - 315680, -168041, 911607, -425739, 726923, -380105, -1217623, 1606318, -233002, 595927, - -313533, -215822, 327491, 556735, -994285, 73551, - }, - { - -36039072, -249955824, 33156610, 3010772, -11811, 214212, 3671123, 973347, 1189169, -898185, - 2119566, 8077223, -12184285, 5524939, -728534, 3432753, -6308233, -23809688, 633508, 5989869, - 103616, -5872294, -8737037, 6229313, -8976482, 11092290, 8518531, 12085501, 18105434, 7232188, - -11614128, -15917149, 1683090, 6209449, -9339943, -1814624, 25063282, 4854924, 4326643, -10074920, - -6288906, -2879239, -3929358, 6164352, 3399467, -2661806, 5154498, 5886253, -4897337, -2908230, - -2007897, 1400696, -3877819, -1607392, -1840394, -3097745, 3787624, -2494839, -1241782, 1981054, - -1268089, -2882997, 550830, 136902, 361851, 1381369, 470299, -2325725, -178241, 17180, - 1372779, -3051574, 1306744, -3922379, 619549, 3227131, -686658, 2263448, 121333, 909459, - 2147, -1380295, 2291365, -740345, -423591, 108448, -831076, -150861, 667867, 1795833, - 89657, -185757, -1501628, -629750, 300648, -159451, - }, - { - -308164, -16652125, 5075578, -5819681, -1341104, -33286, 282394, -388158, -5558225, -1504849, - 2462627, 3738769, -6954626, 18829674, 4687420, -6844031, 32265404, 366146, -1472637, 23077934, - 3038153, 2141041, -1466195, -7832947, -7250979, 10545218, 1621887, 4102768, 817654, 30303678, - 15235323, -6241125, -12796855, -636192, 4511327, -4316979, 10216653, 13479218, 1857573, -549219, - 5965710, 7056095, 1555852, -5001490, -3607773, -686121, -2138894, -3293166, -11029476, -6904697, - 656056, 3912715, 58519, 980863, 1646046, -6579890, -1191317, -1369021, -901406, 896574, - -823023, 1236414, 1767916, -1422171, 804233, 973347, 1785633, 498753, -1541356, 1104880, - 763967, -2185065, -893353, 1659468, -2651069, 903017, 2496987, 2930778, -70867, 169651, - -74625, 1073742, -2785823, 536871, -1572495, -1551020, 881542, 165356, -450435, 1031329, - 1127966, -1138703, -1758252, 1009854, -777926, 211527, - }, - { - -17322676, -390875840, 20938502, 29033442, 729608, -231391, -9294309, -7102802, 8322573, -10399726, - 1623498, -14638322, -5671505, -2083596, 7710003, 3339874, -18204218, 3797825, -9858024, -11087995, - -9442486, -117575, 442919, -4377646, 4341138, -2263985, 2378875, -2717641, -6368900, 758599, - -6062883, -164819, 1411971, 107374, -515933, 934155, -10854993, -10214506, -10019085, 3313567, - -2720325, 3040300, 84289, -264141, 5947456, -3532611, -1606318, -4871567, -3160022, 2682744, - -3172907, 2488934, -1639604, 6360847, -1032403, 2370285, 1978369, -237297, 5647345, 648003, - 3477850, 136902, 847719, 1107565, 2398739, -5319317, -528818, 1222992, 985158, 2250563, - -1415192, 1377074, -615791, 1477469, 834297, 479426, 1108638, 1647120, -900869, -245350, - 24159, 263067, -534723, -493384, 898722, -471373, -1430761, -209917, 446677, 882616, - -1564442, 2123861, -312996, 321049, -489626, -597000, - }, - { - -397284, -18435074, -4747013, 59593, -2653216, 555125, -651761, -2768107, -1876364, -2477123, - 3204046, -1699196, -9259949, -14096083, 25004762, 6067715, -2758980, -1426466, 631360, 21759378, - -4540318, -6478422, -2341831, -12149926, -1763621, 12464532, 6739341, 5340792, -10976326, 17193828, - -14847165, -5612986, -8464307, -1573032, -7280507, 9163850, -4563403, 4338454, 5534066, 572304, - 4923107, 765578, 629213, -5568962, -10579578, 1941862, 2247879, 6951405, -5361193, 1032940, - -2592013, -5348308, 3726421, -4307316, 7959112, 900333, -3519189, 1417876, -5424544, 1984812, - 1447404, -1593970, 154082, 184147, -4373351, 23622, -514859, 24696, -1413581, -879931, - -1864553, -2034741, 76773, -1561758, -702227, 789737, -265751, 2020782, -513249, -54761, - 1553168, -1392106, 2126009, 149250, -2514703, 2555506, -1335735, 191663, 105227, -595390, - 681289, -928787, -455267, 467078, -410706, 1517197, - }, - { - -76114336, -34829500, 27924804, 22750978, -4523138, 3647501, -7422241, 3278671, -6737730, -1284732, - -7445326, -2064269, 1081795, 9401683, -4894115, -8761733, -2618320, 2957085, 1973001, -4753455, - 7496329, -7420630, 1030792, -5340792, -2054068, 1394791, -578210, 9917616, 4796942, 858457, - -4299799, 9287330, -4872104, -7250979, -7271380, 11537893, -2144263, -2445447, -72478, 12053826, - 7381438, 3767223, -3894462, -3488587, 2574833, 1871532, 4603131, 5772436, 4415764, 1239098, - -6027987, 535797, 2451890, 5496485, 4321811, 3135863, -3046206, 3504693, 771484, -1424855, - -172872, 2340757, -1911261, 2733210, 1400696, 113817, -727997, 2792266, -971736, -1598802, - 207232, 323196, -415538, 1473711, 998043, -463320, 1355062, 88584, -218506, -827318, - 2675765, 755914, -70330, 55835, 754304, 25770, -933082, -1340030, 1370632, 1120450, - -177704, -1233729, 318901, -678068, 891743, -16643, - }, - { - 1462436, 53509924, -22645216, -6046240, -4608500, -1325534, 5579700, 383326, 6169184, -5822902, - 4381404, 9467719, 9410810, -15761993, 29222958, 6911140, 8362302, 7376070, 875100, 9669045, - -2959769, -4121021, 11213623, -3077881, 8927626, 6560026, 15629386, -1159641, 9804873, 4231080, - 5394479, -1710471, -6931004, 403190, -11350525, -215822, -3768297, 3178276, 2377265, -1779727, - -7718593, 2394444, 7283728, -4025458, -2335389, 7895761, 116501, 3860102, -3115462, -4191888, - -1101659, 1606855, 1412507, -797790, 752156, -1269700, 1150514, 1086627, 2734284, 4766877, - -2163053, -872952, -1497333, -4643934, 2637110, 1172526, -1935957, -1467268, 3244848, 1068373, - -3502009, -702227, 665183, 4468914, -948651, 506806, 2690260, 1053341, -20401, 474594, - 51003, -1103807, 258235, -826781, -1701881, -1357210, 588411, 181999, 173946, -1209570, - 923418, 465467, -197032, -128849, 463320, 293132, - }, - { - -26486526, -163718240, 46744276, -28838558, 5280126, -26306674, 15051713, 19838454, -2428267, -17399986, - 9983115, -554051, -2784213, -5849746, 15709917, 7213398, 12142946, -4258460, 2845953, -17662516, - -8312909, -11684995, -1945083, 3088082, -8869644, 3426847, 3178813, 4654671, -5196374, -2340757, - 6564858, -3568581, 1671279, -11043435, -3929895, 6541235, -174483, 4489315, -7708930, -2912525, - -4250407, -760746, 5867462, 1641214, 9173513, 1095217, 54761, 6255620, 741419, 4753992, - -1771674, 1798518, -110059, -1986422, -1440425, -1923609, 1762547, -811212, 2492692, 2124935, - 4670777, 1509681, 555125, -2524904, -367220, -347892, -1032403, -1209570, -1119376, -801548, - 418222, 1052804, 419296, -1068910, 283468, 353261, 1698660, 1006633, -1018981, 280784, - -560493, -745177, 797253, -1949915, 1218160, -1552631, -999654, 556735, -1198833, 103079, - -253940, -1081258, 582505, -807454, -1122597, -594853, - }, - { - 3484829, -10747082, -15874736, 7148436, -11133092, 4937065, -13471702, 6968048, 3653944, -572841, - -555661, -1675037, -3324305, -12758200, -16615618, 1436667, 29503740, -17307108, 10595147, 3416647, - -8427800, -33224256, 10668699, -444529, 3112778, 8694624, -753230, 3562139, 1171989, -10190347, - 11246909, -21066814, 2565169, 3752728, -1686848, -361851, 6047851, -2137820, 9425306, -5979668, - -371515, 3702799, -3577708, 2639794, -3674345, -1822140, 4800163, -252866, 754304, -2573759, - -125628, 482647, -608812, 610959, 2006824, 118112, -2584497, 1326608, -248034, -1035087, - -4253092, 2623688, -2201171, -6703370, 328565, -175557, 3340411, 401579, 897111, 615791, - 2476586, -3432216, -442919, -1727651, -4179003, 1224603, 2727841, 231928, -329639, -638340, - -849330, -956704, -270046, -1251983, -1641214, -2035815, -2430952, 52076, -1373316, -554051, - 1824824, 151934, 1059783, -405338, 268972, 412317, - }, - { - 21806086, 253950144, 4609037, 19560354, 28947006, 14762876, 31279710, 24182276, -10652056, 21746494, - 9339943, 909459, 2147, -1882806, 5561446, 7597261, 882079, -12198781, -16156593, -12928388, - -3649649, -10107132, 7866770, -914828, 1892470, 1138703, -10011569, -12642236, 4334159, 2080375, - 896574, 7368017, 8394514, -3668976, -2962991, 11143830, 1326071, 4973036, -3804804, -2245194, - 6399502, 5794448, -38118, 5574868, 3316789, -5027796, -1175747, -12265890, -6903086, -7320235, - -3966402, -8303783, 4431333, -683437, 4403952, 4182761, 2429878, -1835025, -4478577, -1860795, - 1279363, -929324, 832687, 568546, -297963, -3742527, -3760781, -825171, -1203128, 818191, - -2823404, 394600, -2362232, -1385127, 634045, 2098629, 1222455, -2687039, -128312, -2723009, - 887985, 13422, -831613, 1050656, -1036161, -1382443, 383863, -1469953, 826244, -1830193, - -900333, -725850, -827318, 1081258, -158377, -673236, - }, - { - 1780801, -71365176, 484794, -5988258, 796180, -1585380, -9173513, -325881, 3370476, 7022809, - 5005785, 16931834, -7905961, 10983305, 47604880, 24481850, -20883742, 11637751, 12890271, -21875342, - -19587198, -12704513, -13458280, -9744744, -15540802, -3293703, -16768089, -5677410, 3781182, -8281234, - 12741557, -2878165, 1754494, 3799436, 1405528, -3069291, 1289564, -65498, 1787780, 1838246, - 4690105, -1970853, 382789, -7007239, -2093797, 8963597, -3184718, 5960341, 2112587, -431107, - -1893007, 2631741, 2454037, -1422171, -6874095, 346282, 3256122, 672162, -2573222, 4794794, - -2013803, -640487, 106300, -2474975, -2954938, 155156, 404264, 852014, 871342, -1860258, - -2157147, -4125853, 111132, 585189, 742493, -1214939, -714575, -675384, 2113661, 2524367, - -424665, 360240, 1333587, 1746978, -112743, -920734, 42950, -23085, 2375654, 834834, - 898185, 320512, 753767, -156229, 288837, 905164, - }, - { - 34628712, 87395072, -20483772, 36390184, 22888954, 6164889, 12990129, 7348689, 1425929, 8738648, - -12536473, 1612223, 6180458, 3639985, 22173306, -7267622, -5870147, -10006200, -22115324, 2219424, - -746251, -96100, -4030827, -6536404, 12677670, 3351148, -6338298, 4381941, -2606508, 20981988, - -8092792, 7483444, 6529424, 6677064, -5728950, -5345624, -7152195, -4390531, 5538897, -2461553, - -8032126, 5102421, 3011309, 5162014, -6455873, -1035624, 341987, 2114735, 1111323, -6184753, - 3055869, 855772, 448824, 1031329, 1642825, 2767570, -215822, -2157684, -2675228, -991601, - -1461900, 3959423, -1155883, -1679869, -2525978, 1497870, -961536, 790274, 5207111, -1725503, - -1660005, -1447941, -1637993, 1320703, -2665027, 1921461, 1664300, -481036, -1033477, -2640331, - -1155346, 1774358, -162672, 673236, 1136019, -2792803, 2662880, 4832, -1221918, 199716, - -108448, -537408, -480499, -1179505, 1243393, 150861, - }, - }, - { - { - -1293322, -23229330, -449361, -11705933, 11316165, 1791001, -2097555, 1759326, -4083440, 3089155, - 5472862, 7802882, 2595234, 4268124, 11278047, -27154394, 4697084, 12156368, 1328219, -15423764, - -27262842, 8157754, -7180112, 986769, 19660750, 3635690, -3652870, -16462610, -77846, -12416750, - -6131066, -6223408, -7129646, -2029909, 6849936, 6826851, 5109938, -4485020, -8922795, -1082332, - -944893, -6965900, -2178085, 1440425, -430034, -6265284, -7996156, -504659, -1459215, 7703024, - 4502737, -6958384, -804770, -3438658, 1995549, 4268661, 550830, -455267, 2072322, -2239289, - -2058363, 1842004, 2978560, 1137630, 2448131, -2193118, -627065, 823023, -1903207, -1364189, - -377957, 53687, -504659, -681826, -1160178, -603980, -125091, -42950, -1908039, -193810, - -2230699, -695248, -326418, 2223183, 1781875, -1787243, -445066, 50466, -290447, -502511, - 185220, 337155, 670552, 508417, 164819, 353261, - }, - { - -5318244, -228414416, -4949413, -34928820, -24539296, 2726767, -87510, -16471200, 9446244, -7627862, - -21174188, 6745246, 6415071, -6247030, -11267847, -1562294, -9134859, 7173669, -1004486, -4785668, - -9242233, 6345278, -6051072, -12554726, 2070174, -2524904, -789200, 5369783, 3912178, 7417409, - 1952600, -4205310, -705448, -9442486, 2499671, -1469416, -2671470, 1268626, -28991, -8584566, - -4185446, -1248762, 302795, -1231045, -157840, -3528853, -6190659, -8411157, 367220, 2001992, - 4695473, 2557116, 817654, -3687766, -2408403, 4537633, 3350075, 0, 2325725, -717796, - -1415192, -1793686, -2818572, -2059974, -2226941, -250719, -832687, 899796, -3095598, -801548, - 1848983, 792421, -1364726, 1127966, -1169305, 426812, -1076963, -1018444, -2186675, -612033, - -1592359, 1177358, 387621, -510564, 772557, 575526, 412854, 35970, 190052, 789737, - -695248, -283468, 827318, 635118, 902480, 381715, - }, - { - -2932389, -54305028, -18591840, -24909200, 4073777, -2305861, -4976257, 3229816, 352724, 1845225, - 14869714, -2660732, -16508781, 10755135, -6172942, -5941014, 7947300, 2258079, -8278013, 12798466, - 441845, 6998649, 16216723, -764504, 5917928, 7042673, -3244311, -6602439, 1165010, 10190347, - 4575214, -4354023, 3756486, -4827543, 2137283, 5023501, 1719061, 63888, -3261491, -4952098, - 7898982, 1993939, -4027606, -6247567, -1481764, 331249, -7370164, -4751308, -1531693, 1776506, - -1744831, -3499862, -453119, 171262, 1248762, -5930276, -781147, 487479, -1779727, -3303367, - -2925410, -274878, -860604, -2478733, -3095598, 1293322, -155693, 970126, 519154, 1293322, - -280247, 197032, 1501628, 1151051, -1117765, -2772402, 2531883, 223875, -347355, 738734, - 280247, 396211, -944356, -1184337, -4832, -450435, -1661079, 337692, -279173, 97711, - -370978, -208306, -325881, -194884, 72478, -242129, - }, - { - -1430224, -15622407, 5851893, 1762010, -2244657, 795106, -766652, 1052804, 1244467, -3320010, - -1217623, 2566780, -5318244, 10210748, 56848188, 725313, -8822937, 13993003, 31867046, 13801341, - 6628745, 12809740, -2308008, 640487, 3742527, -17647484, 406411, 13616120, -893890, -1098975, - 6087043, 10390600, -6366752, -10656351, -7211787, 5106716, 4454955, 12057584, 4018479, -1982127, - 285078, -3104725, 1182727, 4290136, 3946538, 382789, 5704254, -1632625, 3342558, 4973036, - -325344, -1461900, 2260227, 2274722, -333397, -2215666, -2470680, 2173790, 1233729, 2689187, - 2590402, 1264331, 253940, -1151051, 2313914, -2603824, 3666292, 88584, 435402, 142808, - 1462436, -994285, 1553704, 374199, 438624, 568546, 571768, -37044, -293132, -1364189, - 957241, -520765, -716186, 879395, 737661, -1424855, 21475, 1125281, 456340, -368293, - -692564, 67109, 862215, -318364, 162135, -652835, - }, - { - 14325863, -235138192, -29736206, -9612137, 9933722, 3914326, -672699, -2561411, 9819906, 2245194, - 9346923, -14687178, -125091, -353261, 5196911, -9713605, 838056, -22198538, 1771137, 3965866, - -681826, 9403831, -17791902, -7187628, 1031866, 117038, 14896557, 28810640, 3178276, 1974611, - -7918846, -12281996, 3569655, 3524558, -9903658, 347892, 7698192, 10023917, 9300215, -7132867, - -3879429, -2849174, 4540854, -3466039, -872415, 5341329, 4896263, -1438814, 81068, -1606855, - -1592359, -3365107, -1833414, -3138547, 808528, -139050, -345745, -2482491, -512175, 2421825, - -1234803, -3116536, 309775, -1360968, 760209, 406948, -156229, -815507, -1160715, 1216013, - -231928, -1507534, -1263257, -1386738, 1190780, 1606855, 1356673, 325344, 746787, 481573, - -8590, -664646, 1126355, -194884, 961536, -1754494, -948114, 268435, 817118, 1672890, - 242666, -1044751, -1277216, -22012, -441308, 223875, - }, - { - -745714, -11569568, 1166084, -8148090, -192737, 171262, 250182, 791348, -2938295, -796716, - -1170379, 409096, -3982509, 12833899, 40299680, -11908871, 5976984, 1558536, -887985, 14374182, - 7793755, -2348810, 10966125, -7429220, -11239393, 10776073, 15205258, -3964255, 15098958, 8751533, - 11419244, -7704098, -6616397, 5972689, -1760937, -10577431, 13306346, 11218991, 5201743, 23622, - 6670084, 2764348, 5654325, -3566434, -3721052, -2272575, -1919850, -5140539, -7126962, -6619619, - 635655, 3652870, 2923799, -446140, 533113, -994822, -5053029, 472983, -4274030, 1002338, - 528818, 2206540, 1449015, -578747, 1401233, 332323, 1380295, -1469416, -432718, 2054605, - -1202054, -1344862, 345745, 255014, -744640, 1118302, 2298881, 1962800, 659278, -789200, - 1646046, -1081258, -1253594, -435939, -1563368, -830002, 274341, 372052, -41876, 563714, - 646929, -227633, -1245004, -18790, 178778, -373662, - }, - { - -12496207, -328438848, -40645424, 15924665, 23198192, -3663607, -642635, -11836393, 6125160, -7617662, - -4772246, -11209328, -142271, -9827959, 8192650, -2920578, -12991739, -3893925, 1232119, -18103824, - -1791001, -322123, -421444, -2151242, 814970, -2668249, 2752537, -4541928, -5902896, -1645509, - -400506, 5459977, -7977902, 1570347, 4299263, -1570347, -7923678, -7315940, -13967234, -2404645, - -2756295, 3148748, -921271, -2820720, 6893960, 3314104, -5283347, -3275450, 294205, 820339, - -3088082, 740882, 3719979, -2131915, 4849555, 1343251, 3541738, 126165, 3007551, 3629247, - -1170379, 925565, 2464238, 801548, -803159, -1049583, -324807, -389768, -1358283, 2341831, - -115427, 331249, 1038845, 1068373, 482110, -504122, 880468, 1469953, -140660, -439160, - 843961, -394600, 918049, -386547, -6442, 52076, -1739999, -340376, 172872, -70867, - 609885, 1165010, 460635, -142271, -238371, -715649, - }, - { - -1235877, -7786239, -10570451, -5620502, 472446, -365609, -801548, 330176, -6499896, -573915, - -1709397, 32212, -6418829, -12513924, 34486976, -27077622, 8310225, 16259672, -1189169, 635655, - -5896990, 6971806, -1584843, -6841883, 2561948, -578210, 2604898, 22353158, -22816476, 17128866, - -13063680, -3263638, -14393509, -10071161, 10986526, 1612223, 2782065, -2006287, 5524402, 4338454, - 6647536, 1348083, -946503, -10348187, -9113921, 4209068, 3235721, 2568927, -2576981, 2565169, - -2090039, -3167002, -1058173, 1461363, 3755412, -674310, -1384053, -1065152, -1884954, 342524, - 2662343, -1078574, -285078, -200253, -2191507, -2681670, 358630, 2212445, -2728915, -1000191, - -1243930, -834297, -962610, 183610, -1367947, -19327, 120259, 1850594, -1017907, 600222, - 447750, -179315, 956167, -15569, 622233, 357556, -219043, -960999, 781684, 157840, - 187368, -721018, -977105, -129386, 293668, 967978, - }, - { - 55672440, -130993280, -47890496, 4133369, 30048664, -1198833, 527744, -10471667, -4147865, 7767985, - -20086488, -10421738, 8480950, 7167764, -102542, 2607045, 2508261, 2426657, -3381213, 4619774, - 2750927, -9021042, -11811, -2002529, -3223910, 4757750, 4261145, 5597953, 5668820, 2650532, - 2232309, -730681, -2049236, -3383361, -8038032, 3412889, 3122978, -2185602, 177704, 8280160, - 14555107, 320512, -2282238, -1142998, -2585570, 4240744, 7207492, 3469797, -293132, 905701, - -1643899, 1822677, 1979443, 5182415, 5597953, -1996086, 744103, -330176, 1021665, -748935, - 2330557, -171262, 823023, 121333, 2065342, -207769, -478889, 1185411, -892816, -1845762, - 198642, 1334124, 174483, 613107, 2757906, -224949, 732292, -148713, -861678, 1167157, - 1271310, 704912, -534187, 642098, 374199, -902480, 976031, -645319, -106837, 985695, - 336081, -1220308, -717796, 860067, 460098, -970126, - }, - { - -2116882, 18682034, 12830678, -20755966, 2340757, -5198521, 12316892, -930934, -537945, 2923262, - 4365835, 10882910, 3541201, -14127758, 34646428, -2838437, 13923747, 10305237, 13784161, -6644315, - -876710, 11931419, 5653251, 901406, 3995930, 1799054, 17806398, 2132451, 600222, 7947837, - 9054328, -1603097, -1766305, -8621073, -3187403, -4332549, -2982855, 3629784, 6251862, -4281546, - -7671349, 3607236, 3346317, -362388, -2713346, 6813429, 1360968, 418759, -3578782, 1862942, - -828392, 1000727, -1751273, 2311766, -1631551, -609349, 1486596, 3569655, 4410932, -1284195, - -2265595, 1012539, -1931662, -4815195, 156229, -832150, -179315, 1899449, 2092186, -1855426, - -1400159, -1781338, 1830193, 3083250, 1743757, 289910, 1884417, 19327, 211527, 764504, - -381178, 222801, 342524, 461709, -2964601, -1845762, 704375, 288837, 755914, -645319, - 482110, 755914, 251792, -188979, -184147, 434329, - }, - { - 22141094, -128475896, -26589068, -17864380, -7472706, 18196166, -20260434, 5505611, 6253473, -4728222, - -585189, 18790, 12094628, -6154152, 2893734, 9851581, 10581189, -1665911, -154619, -8209830, - -24211268, 2817499, -4920959, -1873143, 172872, -1980517, -2044404, 8019241, -2370822, -3340411, - 4575751, -2886218, -1589138, -3654480, -5503464, -2685428, 4599373, 2845416, -10129143, 2416456, - 945967, -4370129, 1977833, 5974300, 7216619, 2112587, -1555852, 5774047, 92879, 464930, - 1173063, 4633196, -1869921, -193274, -2180770, -3653407, 1101659, 418759, 3208878, 636192, - 6503118, 912144, 1953673, -2740726, 680215, -384400, -574452, -2400887, -28991, -1307818, - 310311, 1520418, -305480, -770410, 144955, 2251100, 375273, 169114, -285615, -265214, - -228707, -1136556, 806380, 160524, -1250372, 68719, -908386, 119185, -194347, -698469, - -118648, -298500, -854162, -411780, -841277, -309775, - }, - { - -3060164, -28091234, 7166690, 2018635, -5609228, -4223564, -6441377, 5083094, 3387656, 3680250, - 1549410, -5245766, -3325915, -11001559, -29766270, 23048942, 11906723, -2088965, -9954124, 14735496, - -16171089, -13185013, 9536975, -4160213, -3434900, -1745904, 5839545, 5137318, 2552284, 8423505, - -6938520, -8144869, -5971615, 3347390, -3207804, 4577362, -4057670, 7548405, 2539400, -558883, - -1248762, 3550327, -6554120, 1378148, -1267015, -5089000, 6749004, 1173063, 2191507, -4963909, - -537, 1530619, -467078, 1022202, 1035087, -21475, -450435, -1848447, 1716376, -5265630, - 723165, 1479616, -5945309, -2135136, 92342, 140123, 1653562, 2551748, -1679869, 2128693, - 1925219, -3182034, -1086627, -1188632, -2750927, 711354, 2703145, 233002, -519691, -1615445, - -213675, 143881, -2414309, -850404, -1007707, -1517734, -2782065, -1219771, -358093, -863288, - 1201517, 126702, 893353, -398895, 3221, 897111, - }, - { - 15123654, 238092048, 28313498, 17020956, 29867202, 34183644, 15985331, 9863392, 3038153, 10179072, - 15623480, 1938104, -1707250, -11451457, 7820062, 17020418, -17453136, 6634651, -13098577, -6621766, - -13611825, -9838159, 48318, 104690, 5089536, 6917582, -13624173, -137976, -2137820, -1219234, - 2931852, 5548561, 5476620, 197032, 1709934, 4338991, 3047816, 222801, 478352, 3286724, - 3760781, -2936684, 6376416, 657667, 4688494, -3681861, -118112, -9940165, -12819404, -7923141, - -1400696, -6098854, 1707786, 5520644, 4250944, 2175938, 3117073, -5210332, -2567317, -1859184, - 1555315, 61740, -687732, 448287, -405338, -2868501, -3262028, -1222992, 0, -1070521, - -3716221, 724239, -1545115, -1847910, 1433445, 845572, 387621, -147640, -313533, -2729989, - -40265, -672162, 531502, -464393, -637266, -2101313, -826781, -54761, 530428, -1548873, - -1578937, -141197, -115427, -11811, -343597, -425739, - }, - { - -653372, -62736052, -2030446, -3138547, 126702, -5406827, -4777078, -3308199, 3260954, 2955474, - 9152038, 8026220, 13996762, -10347650, 82835960, -2618320, 7002944, -7825968, 17853642, -21572546, - -14716705, -16444356, -15370614, -15701864, -5382131, -10644540, -17301738, -3529926, -14751065, 4529043, - 7529615, -5738613, 9703942, 415538, 148713, -3293166, 4043712, -2370285, -419296, 3752728, - 5736466, 399432, -142271, -10040023, -2334852, 1893007, 10868952, 2855080, -1628866, -165356, - -185757, 4078608, 255551, -3537443, -2094333, -3474092, 893890, 68719, 1072131, -71404, - 2672544, 944356, -945967, -3636764, -1726040, -469225, -704375, 1554778, -62814, 409633, - -2254321, -5249524, -920197, 546535, 2276870, -1158031, -2096481, 339839, 2251637, 1207960, - 1633698, -93952, 519691, 1190780, -484258, -53150, -774168, 519154, 1961190, 1790465, - 500364, 85899, -214748, 397821, 192737, 772557, - }, - { - -19316078, 139728704, 5655935, 31614180, 26146150, 615791, 4440996, 1371168, 7909719, 3956739, - -6455873, 3542274, 3349538, 14203457, 2665027, -2027761, 6650220, -9616432, -20557860, -2499134, - -556198, 3017215, 2082522, -3573950, 4421132, 449361, -5685463, -5815386, 11089069, 3908957, - 5730560, 2551211, 9118752, 704912, 733366, -8011188, -4636954, -105227, 30602, -7534983, - 1555852, -7668664, 1621350, 10308995, -5383742, -1698123, -1588064, 2195265, -762894, -1623498, - 2235531, 1256278, -67109, 383863, 2775086, 1160178, -258235, -3500935, -1439351, 315143, - 192737, 1314797, 434329, -3534758, 1111323, -366146, 137976, 2200634, 1432372, -1545115, - -885300, -1525250, -1935420, 99321, -580894, 635118, 1514513, -455803, -269509, -1076426, - -2323041, 797790, -927713, 2166811, -723702, 218506, 813896, 68719, -623844, 1129040, - -387084, -1827509, -991601, 468688, 42413, -177704, - }, - }, - { - { - 1169305, -6470368, 9911174, -15272904, 7842074, -194884, -2115272, 2452426, 305480, 355945, - -7378754, 11982422, 6494528, -12919798, 2977486, -23216982, 3732327, 6846715, 75699, 214212, - -28108950, 801548, -11119133, 1307281, 21548388, 10976326, 7124814, -13176960, 3421478, -3620658, - 733903, -7202124, -3244311, 6391985, 6406481, 1235340, -134218, 5907191, 2240362, 2120103, - -225486, -5152887, 1169842, 5159867, 1751273, -833224, 2076080, 4016331, -2429341, 3158412, - 2061584, -4779762, 2423972, -1708860, -757525, 408559, 266288, -1198833, 1869385, -554588, - 1246077, 1789391, 97174, 1125818, 2660195, -869194, -487479, 391916, -137439, -670552, - 733903, 250182, 624381, 324807, -1615982, -638876, -701690, 154619, -1152125, -325881, - -874563, 803159, 170188, 614717, 290447, -1363652, -50466, -134218, -46171, -632971, - 602906, -20401, 33286, 370441, 207769, 125628, - }, - { - 4599373, -155649616, 53782116, -5248450, -2669859, 3842922, 1835025, -11087458, 15006079, 486942, - -17276506, 4866198, 4487167, -5219459, -4261145, 2785286, -5866389, 7852811, -3235721, 3476776, - -2694018, 5386426, -1622424, -1517197, 3776887, 2508798, 1741609, 2441152, -2133525, 1253594, - -272194, -3706020, 1879048, -3730716, 1506460, -6158446, -310311, 3062849, 1533840, 2309619, - 1632088, 748935, 1896765, -424665, 510027, -2055142, -4094178, -2676302, 2939368, -184147, - 1260573, -81604, 2326262, 991064, -996969, 1173063, -337155, -2857227, 1299228, -684510, - -831613, 796180, 388695, 446677, -1028108, 1629403, 1264331, 1828582, -728534, -199716, - 914828, 1079111, -326954, 596464, -1428614, 958851, -476741, 267899, 503048, 645856, - -1600412, 31139, -183073, -82141, 208306, -139586, 404801, -828392, 74625, 292595, - -566936, -125628, 133681, -170725, 498216, -53150, - }, - { - 1439888, -10503879, 18849538, -16837882, 6079526, -226560, -2202781, 4646618, -3427384, -1596654, - 14389751, -2695092, -9942312, 23148800, -1541893, -12309376, -4720169, -13445932, -13636521, 2697240, - -6056978, 5246303, 7348152, -3357591, -929324, 0, -3679713, 457414, 1148904, 3269544, - 368830, -2723546, 6288369, -1876901, 2494839, 1390496, 2700461, 914291, -2657511, -3553012, - 6778532, 2498597, -1729261, -1374926, 1165010, 1890323, -792421, -1717987, -1378148, 2517388, - 258772, -110595, 491774, 267899, 2192581, -3550327, 671626, -1098438, -2972117, -2383170, - -572841, -229781, -2224793, 1045825, -617938, 475131, -2442763, 236760, -11811, 706522, - -110059, 35433, 1355599, 292595, -541166, -1330366, 1844689, -478352, -844498, 308701, - -202400, 768262, -982474, -1360431, -78383, -176631, -709207, 648003, -719944, -34897, - 123480, -481036, -617402, 55835, 418222, 297963, - }, - { - 1522566, -23489714, -2512019, 4335233, -383326, 211527, -163209, -17180, -855235, -1266479, - -1136019, 2514703, 851477, 8068633, 29431800, -9019968, 899796, -328028, 23042500, -562104, - -1964411, 10259066, -5940477, 2908230, 9436580, -9803263, 2030446, -380105, -5142150, 4391067, - -5345624, -2136746, -4993973, -2359548, 215822, 11167452, -8543764, 1058710, 4337380, -150324, - 1070521, -5425618, 5906, 5296769, 2767033, -2969433, 1387811, -2154463, 3473555, 2437394, - -1210107, -158914, 227633, 56371, 155156, -1150514, 109522, 4444218, -1955821, 417686, - 846645, -623844, -1484985, -743029, 2278480, -3379066, 1952600, -1053341, 522912, -625992, - 384936, -919660, 186831, -607738, -461709, -246424, 627065, -437550, -294205, -1338419, - 731218, -184147, -1068373, 722091, 163209, -1128503, 395674, 83215, 216359, -416612, - -752693, 30065, 432718, -1044214, 107374, -330176, - }, - { - 6174553, -164789312, 37383396, -20360292, -3465502, 861678, -3962644, -5585068, 3416647, 3339874, - 1745367, -12641699, 8035347, -8646306, 8256538, -1856500, 6923488, -1192390, 8275865, -4898410, - -3824132, 11334956, -9509594, -6643778, 7295002, 1273995, 7428146, 11209865, -10294500, 2616172, - -403190, -1865090, 5890548, 2515240, -4821101, 2843268, -3455301, 4575214, 8040716, -4355634, - 3059091, -2570001, 4911832, -2676302, 1665911, 1402844, 85899, 172872, 343597, -2146410, - 2267206, -2787434, 1060857, -172336, 1349157, 839129, -2600066, -495532, 4042638, 2581812, - -1101122, -2529736, 239444, 681289, 2586644, -120796, -789737, 876173, -25233, 555125, - -565862, -709207, -566399, 1023276, 1146756, 904091, 1424855, -1081258, 204011, 58519, - 195421, -410169, 803696, -188442, 838592, -897111, -57445, 231928, 430570, 682900, - 33823, -221191, 100932, 438624, -352187, 33286, - }, - { - 57982, -4245575, 2516851, -960999, 2796561, -796180, -173409, 2977486, -1235340, 1066763, - 839666, -1462436, -5263483, 1451699, 41908680, -11023570, 633508, 8048232, -3686693, 5851356, - -645856, -11940546, 4933844, -4225711, 9958419, 7201587, -3369939, -6492380, 3270081, -15667504, - 1767916, -3786014, 1632625, 5148055, -2081985, -10507101, 1921998, -2386391, -509491, 1354525, - 2147484, -8551280, 971736, -1300838, 75699, -25770, 1218697, 1138703, 2653753, 2082522, - 383863, -309238, 2436320, 1942399, 280784, -638876, -2810519, 2882460, -1782948, 1083406, - -1281511, 440234, 456877, 302258, 1057636, -1759863, 1394791, -1300838, -1603633, 642098, - -1216550, -1183264, -40265, 137439, -996432, -134218, 843961, 344134, 149787, -1269700, - 701153, -951872, 54224, -332323, -292058, 250182, 94489, -37044, -31675, 515396, - -4832, 408559, -222801, -257698, 351650, -306016, - }, - { - 32914482, -192530496, 29567628, 2070174, -671626, -2081449, 2874944, -17228724, -2805151, 4769025, - 7348152, -1474248, 5456219, -6284611, 3522410, -7757785, -10525354, -4655745, 4293894, -10115722, - 463320, 2615098, 3006477, -974958, 1296543, -1234803, 2085744, -2285996, -193810, -2331630, - -1402307, 3504157, -6475737, 1043677, 578747, 816044, -2182380, 3906810, -4890894, -5237713, - -2159295, 5250598, 779000, -2026688, 2876554, 5022428, -2958696, 1357747, 4638028, -1155346, - -2113124, 2792803, 3053722, -6526740, 2985002, 229781, 2198487, -3245922, -1199907, 1436130, - -1551020, 1003949, 1003949, -980326, -608812, 545461, -23622, -357556, -1294933, 715649, - -982474, -199179, 521839, -39192, -280784, -987843, -25233, -222265, -310848, -229244, - 382252, -801548, 631897, -199716, -563714, 645319, -358093, -391379, -210990, -305480, - 769336, 358630, -608812, -750546, -373125, -210453, - }, - { - 405338, 9408126, -2710124, -5427228, 1475321, -198642, 459025, 1118302, -4605279, 268435, - -4467840, -506269, 5479305, -2233920, 34357592, -14354318, 12166569, 8405788, -4321811, -3892851, - 348429, 16661789, 1084479, 3024731, 9983115, -5123359, -7842611, 15855946, -20434918, 17966922, - -9467182, 8184597, -2344515, -6901476, 9310415, 1896765, 3687766, -6345278, 536334, -4396973, - 4144107, 2471217, 127238, -3284039, -3092377, 2731062, -2888366, 1321239, -1573569, -879395, - -3722663, -1812476, -252866, 76236, -9664, -2216203, -1016297, -302258, 706522, 26844, - 447213, -859530, -1029718, -737124, -1163936, -828929, 830002, 1452773, -82678, 1189169, - -792958, -274878, -46171, 1344862, -715112, 472983, -81604, 557272, -1696512, 215285, - -1355062, -623844, 687195, 827855, 1300838, -331786, 807991, -488016, 708670, -262530, - -428960, -413391, -853625, -522912, -126702, -101469, - }, - { - -27146340, -166404752, 31345746, -10421738, 2876018, 2264522, 4806606, -2688650, -1129040, 5962489, - -9355513, -10014790, 163746, 2932389, 2172717, 4673462, 5899138, 9403294, -3950296, 3180960, - 3708168, 123480, 6438156, -673773, -2644089, 7274601, 1196685, 212601, 4996658, 2139431, - -90194, -1494112, 244276, 50466, -2985539, -876173, -949725, 2153389, 2247342, 966368, - 9036611, -1573569, -71941, 549219, -1719598, 2720325, 3105798, -1457605, -1882806, 3434363, - 436476, -394063, -1635846, 125628, 2376728, -3453154, 401579, -784368, 529892, -2429341, - 371515, -1014149, 1109712, -598074, 894964, 937914, 1377074, 714038, 375810, -641561, - -840203, -169651, -430034, -493921, 1854352, -417686, 287226, -150861, 504659, 1566053, - -913754, -415001, -62277, 297427, 270046, -148176, 1950452, -277025, -733366, 363462, - 255551, -1312649, -584652, 948114, 102542, -245887, - }, - { - 2964064, -5957120, -4115653, -13325673, 1088237, -5916318, 11445014, -1739462, -828929, 1814087, - -6579890, -188442, 5024575, -18859738, 11241540, -7445326, 15942382, 6413997, 20907364, -87510, - -317291, 13817447, 2430415, -2070174, 619549, -1807108, 11439645, -8602283, -11678016, -523986, - 1685238, -6018323, -86973, -4544613, -1702418, -3084860, -5277978, -828929, 149250, -3867618, - -373125, 5935108, -1311039, -1074279, -1361505, 1975685, -2815351, -1251446, -4032438, 1596117, - 60666, 1284195, -1183800, 1930588, -994822, -1063541, -1679869, 1145146, 2720862, -3682398, - -2022393, 696858, -1768990, -3258270, -876710, -926102, 539555, 1037772, 1300301, -1447941, - 999117, -1000727, 830539, 1054415, 914291, 1013075, 717260, -797790, 1179505, 1241246, - 70330, 353261, 296353, 1631014, -715649, -586263, 376883, -26307, 818191, -911607, - -357556, 325881, 13422, -205085, -434329, -33286, - }, - { - -18111340, -108955808, 35307852, 1924682, -2878165, 21946746, -24517820, 6134824, 9286256, -3210488, - -175557, -3925600, 9802726, -3336653, -2380486, 4121021, 863288, -534723, 8431558, 9349070, - -10792179, 8902930, -3604551, -1612760, 2141578, -3010772, -9096204, 1989107, 2214593, -3093987, - 1973001, -2018635, -2455111, 447213, -4721780, -4974646, 3391414, 2043868, -6141267, 2528662, - 1646583, -5464809, -460098, 1446867, 1307818, -202400, -3068754, 2206003, -1217623, -1074, - -1468879, 3359201, -1190243, 1222992, 1913408, -905164, 1059246, 1164473, 900869, -2179696, - 2891050, -1468879, 448287, -1248762, 2462090, -147103, -1428614, -2567317, 1034013, -1236414, - 764504, 2142652, -76773, -316217, 20938, 1016834, 133144, 569620, 865436, 685584, - -238371, -662499, 1168231, 875636, -973884, 881542, -293668, 551903, 76236, -341450, - 162672, -85362, -765578, 256087, -183073, 571768, - }, - { - 2572149, -34711924, -2742874, 107374, 284542, 2419677, -2497524, 1644973, 1245004, 2852932, - 3541738, -972273, 6032819, -11056320, -34237332, 14189498, -788663, 10913512, -11547556, 2335389, - 4261145, 4536023, -5516349, -14799920, -3045132, 7989713, 5723044, 5545340, 2568391, 4012036, - -7674033, 1023276, 2146947, 4705674, -5275294, 3133179, -4972499, 3517041, -602906, 2387465, - -3271691, 5572720, -3459059, -1590212, 948114, -1512365, 5840082, 748935, 1626182, -198105, - 2813741, -1023276, -2008971, -1140851, 254477, -915902, 584652, -1460826, 890669, -3626563, - 1843078, 287763, -3682935, 2100776, 1428077, -357019, -739271, -38655, -2506650, 749472, - 690953, -1721208, 599148, 858993, -676457, -372052, -274878, -1628866, 3221, 75699, - 357019, -853625, -1176284, 1449552, 367757, -378494, -1039382, -417686, 216896, -615791, - 49392, -794569, 404801, -95026, -108448, 573915, - }, - { - -44829796, 138064944, 4753992, -9088151, 4566087, 12741020, -156229, -1297617, 5296232, 9003325, - 8496519, 229781, 4020090, -7423314, -3081102, 13042742, -15730318, 10679973, -396211, 5882495, - -7219840, -2083596, 4197257, -135291, 6805913, 18298708, -3741454, 10650982, -848793, -6227703, - -1289027, 130460, -166430, -989453, 4831302, 282394, -1921998, -399432, 3266323, 1623498, - 4050691, -345745, 5050345, -2375117, 4407710, -6472516, 1244467, 671089, -2191507, -1445793, - 4065187, 2176475, 2532420, 2265595, -1642825, -2689723, 2364916, -1460826, 205622, -1367410, - 496606, -1677722, 255551, 467078, -2873870, -1341640, -159451, -670015, -952946, -443992, - -739808, 556735, -1403381, -595390, 759672, -207232, 1386201, 1283658, 379568, -1492501, - 346282, -335544, 627602, 292058, 448287, -1129576, -30065, 106300, 295279, -522375, - -4832, 86973, -149787, 304406, -90194, -111669, - }, - { - 28991, -56263536, 4855998, 1784022, 2403571, -1366337, 1588601, -1234266, 4627291, -3017215, - 1429687, -942208, 4173635, -21740588, 65863860, -10782515, 9598715, -14721537, 13034152, -5261872, - -2394981, -5070746, -768799, -8506183, 522912, -4475356, -1075352, 7723425, -13931263, 1277216, - 4493073, -4706211, 11704323, 594853, -4830765, -553514, 2323041, -5563057, 3503620, 3442416, - 5866926, -2814814, -2499671, -3564286, 1491964, -2700461, 5810017, 1399086, -2308008, -1405528, - 172872, 2298881, -2018098, -1927904, 932545, -2619393, 1879048, -265214, 539555, -1551020, - 1376537, -1020055, 947577, -23622, -332323, 1452773, 706522, -1275605, -1341104, 1516124, - -477278, -2018098, 1906966, 37044, 251792, 445603, 482110, 802085, 646393, -1086090, - 388158, -677531, -76236, 752156, -671089, 294742, -1038308, -344134, 41876, 299574, - 210990, -234076, -740345, 354335, -172872, -86436, - }, - { - -2943663, 140153904, -12937515, 7214472, -139586, -25290914, -7543573, -1482838, 2612414, 109522, - 4485020, 2984466, -7778186, 5973763, 570694, 1130650, 9280887, 5904507, -5235565, 2570538, - -2954938, -185757, 7045894, 510564, -468151, 2464238, 4533338, -6961068, 5971079, -4881767, - 6611566, -830539, 1087164, 948651, 3451006, -3903052, 2273112, 2084670, 2801393, -4371203, - 3247532, -8877161, -1303523, 8783745, -685047, 1524177, 1058710, 1946157, -1428614, -3393024, - 229244, 1532230, -995359, -2065879, -775242, 345745, 757525, -1919850, 1683627, 1741609, - -1666447, -602369, 1586990, -559956, 2615098, -341450, -376883, 1129040, 1376000, -499290, - -365072, 915365, 938987, 972273, 603443, 133144, -53687, -275952, 840740, 234613, - -1641214, 743029, -802085, 2047089, -557272, 122407, 342524, 758599, -346819, 1258425, - 631897, -176094, -228170, 543850, -1611, -557809, - }, - }, - { - { - -672162, 8099772, -1726577, 3850438, -5966247, 1116692, 107911, -2057826, 1301912, -1527935, - -4624606, 5226975, 8764955, -2592013, -3837553, -8995272, -844498, 3478924, -10261214, 2120103, - -14893336, -6441914, -8136816, 12438225, 9858024, 13008919, 2206540, -8272644, -2031520, 5342940, - 2024540, -3976603, -2867965, 7124814, 4791573, -1884417, 1311039, 7588134, 2148021, 492848, - 1285806, -1366337, 590558, 1947231, 500364, 3102577, 2881386, 2904472, 130997, -1643362, - 1593970, -340913, 909459, -1042066, -1407676, -374736, -314606, 1080184, -241592, -165356, - 2260764, 694711, -117575, 1579474, 1414118, -1628866, 985158, -907849, 461172, 403190, - 22549, 395674, 208843, 187905, -864899, -98784, -555661, 92879, -114890, -1207960, - -12885, 631360, 377420, -104153, -477278, -54224, -354335, -243739, 292595, -423054, - 615254, -245887, -368830, 171799, 679142, -72478, - }, - { - -1400696, -59488520, -11166378, 12288975, -4335233, 410169, -1659468, 5028870, 455803, -503048, - -2690797, -3753265, 3964255, -1169305, -4583267, 4040491, -2368675, 2854006, 4113505, -215822, - -1738388, 4921496, -528818, 6756521, -5080410, 4921496, 3191161, -1867774, 1476395, -1895154, - 92342, -1992865, 3469797, -1819992, -1473711, -4928475, 3199751, 171262, 649614, 3729642, - 1017370, 2490544, -2379412, 1483374, -717796, 1066763, -4882841, 2048163, 477278, 1324461, - -205085, -2011655, 875636, 2716567, 755377, -1001264, -2218888, -448287, 317828, -849330, - -580357, 1588601, -204548, -853625, 1531156, 1180579, 1830193, 121870, 1436667, -356482, - 1131724, 490163, 1037235, -752156, 305480, 221728, -303332, -112206, 1254131, 108448, - -306553, -578210, 156229, -751619, -11811, -104690, 542777, -353798, -40265, -349503, - -175020, -111132, -4832, 288300, -184147, -40265, - }, - { - 128312, 19513110, -2139431, 4908611, -6460168, -906238, -610959, 2343979, -989990, 823023, - 1862942, -1969243, 5151277, 10192494, 3557844, -8710194, -9047349, -10752451, -9578314, -6038187, - -2021319, 3597035, 474594, 3040837, -2959769, -595390, -4024921, 4530654, 2178622, -795643, - -2895882, 1995549, 3727495, -3301756, 2265059, -721018, 2967823, 1938641, -1584306, -3299609, - 3075197, 1646583, 73551, -318364, -249108, 1937567, 2751464, -3964255, 513249, 1000191, - 1832340, 337155, 778463, 735513, 49392, -1649268, -1174674, -1560147, -1158567, -1099512, - -451508, -877247, -2242510, 2057289, -593242, -834297, -1318555, -210990, -541166, 149250, - 666257, 17180, 443992, -19864, 120259, 139050, -588411, -317291, -648540, 217433, - 118112, 592169, -722091, -1066763, -166967, -69793, 216896, -18254, -562104, -245350, - -302795, -12348, -212601, -149787, 188442, 282931, - }, - { - -1553168, -23553064, 2400350, 2604898, -549756, 358093, 304943, -1360968, -1551020, -1152125, - 1433445, 1075889, 1128503, 3215320, 9009768, 6761889, 7631620, -4003983, 17542794, -343061, - -9290014, 6838125, 478889, 5575405, -3332358, 1748589, -1978369, -2663954, -3521873, 3174518, - 2390149, -8730058, -11458973, 2068027, 1956895, 3661460, -6547678, 3013993, 1774358, -964220, - -1596117, -1716376, 1202054, 3248606, 1909650, -1981054, 239444, 74625, 765041, 1386201, - 1213865, -1532767, -1067299, 701153, -155693, -310311, 1453846, 1195612, 974958, -392990, - -1514513, 286152, -1012539, -915365, -70867, -741419, -25770, -810138, 566399, -37581, - -128312, 85899, -1392106, -217970, -635655, 92879, -197032, -146566, -511638, -702227, - -148176, 139586, -609885, 226560, -49392, -96637, 207769, -340376, 62277, -254477, - -435402, -218506, -157840, -426812, -100932, -98247, - }, - { - -19149648, -88432304, 405338, -23536958, 6380174, 871342, -2187749, -1529008, -1682554, 1916629, - -8174934, -381715, 4855998, -3430605, 1171989, 2646774, 2515777, 8640937, 298500, -1513439, - 3445638, -903554, 456340, -3423089, 1502165, 6153078, 5663452, -1692754, -2367601, -369367, - -326418, 3977677, 2001455, 411780, -88584, 1013075, 783832, 214212, 4983236, -1177895, - 1007170, 1160178, 274341, 2399813, 1966558, -2267206, 1047435, 993748, 403727, -1996623, - 1158567, -1673427, 1056562, 737124, -6979, -977105, -163209, 140660, 2090039, 2268817, - -789200, -1159641, 362388, 1726577, 1364189, -501437, 92342, 1103270, -25233, 557809, - -360777, -396748, -58519, 944893, 766652, 749472, 547071, -409096, 330712, -170188, - 114354, -177704, 25770, 260919, 774705, -599148, 191126, -23622, 331249, 231928, - 292595, -31139, 555125, 128849, -257698, 301185, - }, - { - 1052267, 1037772, -4230543, 3415573, -186831, -457951, 490700, 1960116, -1062468, 96100, - 1377611, 211527, -2958696, 2583960, 31993212, -5610838, 4437238, 3971771, -2792266, 4974109, - -3760244, -3173444, -239981, -6312528, 8713415, 8797167, -11938398, 1299228, -3699041, -11854647, - -1460826, -1900523, 2486249, 2660195, -919123, -4435091, -4696547, -5025112, -1871532, 2837363, - 794032, -5568962, -2156611, -788663, -1442572, 21475, 2327872, 1879048, 1969243, 2050310, - 359704, 881542, 686658, 2058363, -237297, -947040, 344671, 1374926, 178241, 509491, - -406411, -1037772, -192200, -986769, 787590, -432718, 796716, -583042, -1022202, -1360968, - -597000, -469762, -129923, -987843, -488016, 802085, -268435, -509491, 346819, -2147, - -593242, 132607, -215822, -468151, 13422, 145492, 188442, 428423, -144955, 46708, - 201327, 164283, 110059, -569620, 395674, 77309, - }, - { - -37250252, -47542604, -13663365, 5913633, 5103495, -753230, -2136746, -3665755, -10623602, 8581345, - 1218160, 5039071, -2935073, 3949759, -812286, -6245956, -12579422, -204548, 274341, 208306, - 2415382, -2473364, 5143760, -3042448, -1562831, -469225, -1691143, 2283849, 1219234, -1623498, - -2803003, 300648, -561567, -4248260, 1115081, 2153389, 551366, 293132, -1200980, -2420751, - -4019553, 3628174, 2355253, -865973, 2077690, 629213, 1326071, 1746441, 3619047, -1209033, - -1560684, -301185, 3651796, -3520800, 667331, -388158, 391379, -1455994, -1100049, -383863, - 194347, 861141, -135828, -162135, -198105, 200790, -224949, -505196, 721018, -1930051, - 5906, 233002, -427349, 64425, -289373, 197569, -455803, -1387811, 17717, 642098, - -983011, -70867, -243203, -445603, 238908, 35970, 301721, -166430, -515933, 79994, - 350577, -391916, -399969, -383863, -255014, -162672, - }, - { - 1012002, 5258651, 659814, -1293322, -931471, 190052, 605590, 335007, -2186138, -655519, - -1553704, -1029718, 4914517, 5617281, 17663054, 16325708, 4723927, -6082211, -5435281, -10746008, - 12556874, 12702903, -2164664, 4257387, 2145336, 5122822, -4704063, 7098507, -7807714, -1155346, - 6314139, 1648731, 914291, -1487669, 2608656, 4125853, 1527935, -5677410, -2659122, -791885, - 1444183, 2656437, -1818919, 897111, -309238, -1119376, -4797479, 1120450, 623307, -1240172, - -4555350, -1335735, -806380, -344671, 776852, -3773129, 805306, 265214, -209917, -883690, - -134218, -730144, -1430224, -301185, -581431, 98247, -264141, 65498, 607201, 964220, - -369367, -135828, -34897, 831613, -182536, 142271, -197569, 119185, -1399086, -260919, - -1129576, -64961, 475668, 842887, 399432, 183610, -178778, 537945, 20938, -394600, - 13959, -351650, -201327, -796180, -387621, -170188, - }, - { - -750546, -154165696, -13037373, -3441343, 5174362, 4028679, 1362578, 1375463, -54761, -3607773, - 3317862, -6655589, -2019172, -7694434, 3866008, 6589554, 3471407, 6519224, -4254702, 4088809, - 2230162, 7266011, -491237, 1070521, -921807, 1510755, 5117991, 1058173, 1485522, 1863479, - -1801202, 355409, -1438814, 2858301, -2159295, -722091, -4027606, 1156420, 2354716, 2582349, - 5912023, -2049236, 467078, 688269, 387621, 442382, 1791001, -1319629, -122407, 857383, - 1120450, -759136, -1263794, 2095944, -627602, -1894081, -15569, -606664, -90194, -272730, - -1494112, -148713, -329639, 483184, 714575, 965831, 1602560, -119722, 197032, -68183, - 310311, -1517734, -94489, -321586, 236223, 640487, -216359, 155156, 398358, 1091459, - -952946, 19864, 406411, -753767, 631360, 527207, 868657, 75162, -452045, 84826, - -81068, -760746, -60666, 6442, 81068, 459025, - }, - { - -3481608, -13944148, -2214056, 4312684, -1625645, -3280818, 4918275, -1227824, 105764, -669478, - -5713917, 817118, -4394289, -5257577, -1744831, 2352032, 10744934, 7331509, 10056129, 4922570, - 2673617, 12439299, -3963181, 2698850, -2635499, 7796977, -2748242, -9070434, -5611375, -3407520, - 1891396, -4408784, -2804077, 565862, -5282810, -1939715, -5490042, -2640331, -668404, -1899986, - -235149, 3606699, 1904281, -3801583, -257161, -1204202, -2547989, -93952, -101469, -2405182, - 562641, -1410897, 2214056, -1581622, -6442, 1511292, -3116536, 1415192, -452045, -2353105, - -571231, -807991, -162135, -2073932, -1825898, -265751, -21475, 52613, 759672, -574989, - 906775, 72478, -49392, 635118, 880468, 231928, 1102733, 338229, 794569, 599685, - 942745, 27917, -31675, 793495, -222801, 854699, -147640, -107374, 321586, -580357, - -747324, 3221, -34360, -30602, -63351, -316754, - }, - { - 13470091, -108068360, -530428, 3369939, 3449396, -2848100, -20938, 381715, 5044976, -3097208, - -1052804, 1480153, -820339, 1804960, 3142842, -3698504, 4594005, -580894, 9077413, 5386426, - -113280, 1984812, -1239635, 725850, -5184026, -461709, -5869610, -811212, 1206886, -3405372, - -506269, -276489, -891743, -1479616, -2530273, -1961726, 1222992, 150861, 335007, -2086817, - 648540, -3369939, 641024, 195421, -469225, -216359, -1540820, -3221, -867047, 1814087, - 740882, 943282, -1395328, -772557, 1930051, 1355062, 1822140, 485868, -449361, 138513, - -504122, -166967, -197569, -208843, 843961, -938450, -1302449, 467615, -1171452, -1312113, - 1522029, 672162, 792421, -74625, 508417, -66035, 38118, 627065, 868657, 445603, - -291521, 488016, 119722, 722091, -76236, 569083, 52076, -199716, 242129, -48318, - -132607, -313533, -150861, 311922, 235686, 335544, - }, - { - -1854352, -35290672, 2795487, -1976759, -135828, 384936, 2903935, -477815, 955093, 2490007, - 3628174, 1999844, -1246614, -20082730, -11445014, 6892886, -82678, -1750199, -5870684, -1631014, - 8762807, 2063732, -7794829, -11811697, 901943, 11972758, 4312147, -4486630, 6924024, -338229, - -2367064, 3840238, 9338870, -2034204, -565862, -4273493, 3240553, 715649, -812823, 867583, - -1634235, 1789391, 1229971, -2045478, 161061, 111132, 4076461, 1038845, 1005022, 1991254, - 2138357, -1907502, -955093, -353798, -1658394, -790811, 636192, -1089311, 1073742, -1502165, - -353261, -152471, -31675, 840740, 463856, 2684, -930934, -1249836, -263067, -894427, - 624381, -756451, -317291, 499827, 587337, -928250, -1265942, -622233, -67109, -127775, - 820339, -1250909, 11274, 295279, 443455, 238371, -133681, -265214, -260382, -512712, - -304943, -217970, 107374, 385473, -185220, 259309, - }, - { - 54735064, 5855114, -3375844, -11770895, 1616518, -11902428, 13007845, 8614094, 2398202, 7861938, - 3318936, 4257387, -6338835, 7341710, -4109210, 3583613, -3874597, 1550483, 674847, 6641630, - 885837, -162672, -2880849, 4080219, 3603478, 11574937, 10167798, 2668249, -2974265, -2505577, - 1696512, -2352568, -2756832, 51003, 2721936, -1917703, -1656247, 75699, 3329674, 377420, - 4984847, 379031, 1869385, 1618666, 1690607, -4334696, -623844, 3474092, -755377, 2639258, - 1682554, 5933498, 333397, -357019, -2215130, -1670742, 124017, 829466, -462246, -644245, - -420907, -341987, 381178, -563714, -3323768, -522375, -1134408, 1086627, -1440962, -1127966, - 1163399, -728534, -893890, 605054, 123480, -779000, 1433982, 1370095, 84289, 254477, - -307627, 307090, -79994, 814433, 315143, -624381, 262530, -24159, 188442, 66035, - 67646, -272730, -235149, 330712, 25770, -44560, - }, - { - 189515, -47492676, -1525787, -216896, 3083250, -166430, 2461016, 1541356, 2522220, -1915019, - -1540283, -8135742, 4955319, -1845225, 32744830, -4731980, 2320893, 548682, -383326, 7927973, - -3995393, -6731825, 3809099, -5281736, 87510, -3235184, 7122667, -4596689, 3921305, -4201015, - -2367601, 2875481, 5220533, 1631014, -3285650, 2017561, -21475, -4902705, 4852240, 4066797, - 2085744, -785979, -4281009, -979253, 2298344, -1117228, 1302449, 202937, -1603633, -1031866, - 1767379, -1009854, 543850, -1681480, 137439, 650688, -1124745, 1967632, 82678, -2477123, - 736587, -365072, 1367410, 84289, -502511, 1292248, 402653, -993748, -830539, 468688, - -393526, -259846, 798327, 389231, 391379, -237297, 1683627, 708133, 32749, -560493, - -499827, 78920, -76773, 394063, -433792, -148713, 52076, -878321, 130460, 309775, - -329639, -125091, -325881, -110595, 17180, -695785, - }, - { - 22257594, 81151256, 16648904, -10296110, -8891656, -20868710, 2258616, -5661841, 4328254, 3380139, - -417149, 4917738, -8169565, 6298570, -838056, 4678830, 1031866, 1503775, -3492882, 5547487, - 3579318, -4389457, 5006322, -1949915, 5542119, -1271847, 7817914, -3440269, -665183, -1928440, - 5076115, -373125, -3741990, 5568962, 824097, -337692, 199179, 1768453, 5066988, -1257889, - -5513665, -1778653, 451508, 3505230, 5382131, 625992, 2880313, -2554432, -1069984, 1802276, - -2117419, 55298, -2101850, -683974, -1628866, 967441, 16643, -863288, 2212982, -85362, - -1522029, 1879585, 358630, 1382443, 156766, -121870, 779537, 1028108, 297427, -759136, - 912681, 1029182, 1135482, 864899, 1182190, -197032, -219580, 638876, 93416, 84289, - -1154809, 192200, 1010391, 11274, 528818, -171799, 115964, 35433, 289373, 893353, - 662499, 256624, 84826, 161061, -149250, -275415, - }, - }, - { - { - 338766, 11468100, -85362, 12635794, -2105071, 809601, 376883, -3152506, 2251637, 2455111, - -2436857, -4841502, 2400887, -2562485, 2160369, 3549791, 4614406, 7903814, -11732777, 9545565, - 230854, -2819646, -3886409, 7685307, 2353642, 12468827, -1174674, -2557653, 3643206, 5343476, - 342524, -237297, -3255048, -1398012, -577673, -4908074, -563178, 3723737, 956167, -147640, - 3390340, 1206349, -1503775, -1170379, -1982664, 2114735, 1391033, 716723, -252866, -2624225, - 540092, 1202591, 1547262, -1412507, -1083406, 221191, -1260036, 540092, -488016, -63888, - 1626182, -868657, -681289, 1164473, 255551, -1793149, 1010391, -848256, -178241, -246961, - -696322, 33286, -622233, 62814, 468151, 900869, -176631, 312459, 493921, -503585, - 397821, 366146, 260919, 201327, -134218, 272194, -66572, -93416, 304406, -139050, - 320512, -177167, -312996, -185757, 372052, -72478, - }, - { - -3518652, -15643882, 7195681, 8136816, -634045, 1467268, -3068217, 3123515, -4690105, -2044941, - 2568391, -1319092, 4110284, 922881, -2527052, 2652142, -2685965, 4859756, 6015639, 2995203, - 132070, 5437966, -2347200, -3022046, -4598836, 7256347, 2893734, -3329674, 1300301, 1238024, - 771484, -662499, 4499515, -5312875, -719944, -643171, 4043712, -897111, -2673617, -2372970, - -632434, 3852049, -2094333, 1814087, -274341, 529355, -4432406, 1066226, -1529545, 2476049, - 1880122, -1169305, -552440, 967978, 1211181, -937377, -1106491, 620623, 37581, 518617, - 241055, 800475, -596464, -47245, 2000918, 398895, 886374, -807991, 943282, -122943, - 171262, -454730, 561567, -590558, 919660, 96637, -306016, -730681, 682900, -41339, - 653909, -257698, 181462, -605590, 554588, 342524, 174483, -122943, 242666, 196495, - 110059, -25233, -235149, 231928, -337155, -180389, - }, - { - -611496, 16965658, -3350075, 27094802, 6881612, -53687, -1544041, -1216013, -1392643, -143345, - -2273648, -4177393, -422517, 2792803, 6080063, 625455, 26307, 1145146, -2905009, 1581622, - 4448513, -117575, -4231617, 941672, -3534221, -1158567, -2101313, 3926137, 3210488, -957241, - -3811784, -1073742, -505732, -1720134, 3048353, -5470715, -484258, 2854543, 989453, -3413425, - 619012, 1798518, 23622, -1235877, -405874, -4832, 1759326, -2228551, 1322313, 256087, - 1280974, 496069, 1108102, 25233, -126165, -622233, -768799, 428960, 1429687, 341450, - 124554, 125628, -1244467, 660888, -1593433, 88047, 162672, -768799, -1641751, -419296, - 17180, -599148, 555661, 805843, 847182, 543313, -379568, 468688, -64425, 515396, - 613107, 210453, -731218, 29528, 171262, -544924, 174483, -107374, -566936, -43487, - -78920, 330712, 75162, -26844, 69256, 282394, - }, - { - 631897, -21998286, 372052, 1123671, -518080, -119185, 221191, -1305133, -2718714, 52076, - 2243047, -1053878, -1340567, 3745212, -5917928, -14259291, 791885, -3435437, 4071629, 8172249, - -3952981, 1343788, -2138357, 1024887, -8230231, 9030706, 2875481, 84826, 500901, -1352915, - 124017, -3642132, -7036767, 1062468, -1660005, -877784, -3581466, 3008625, 994822, -707059, - -2164664, -1925756, -1917703, 222265, 2332704, -1506460, 1903744, -717796, -1032403, 54224, - 472446, -1896765, -550293, 1541893, -26844, 665183, 1376537, -301721, 848793, -90194, - -791885, 411780, -483721, -127775, 492311, 599685, 138513, -1523640, -81068, -333934, - -766115, 207769, -325881, 881005, 202400, 512175, -579284, -306553, 57982, 333397, - -194347, 132607, 37581, 339302, 159451, 344671, 100395, -474594, -402653, -226560, - 85899, -23622, 198105, 5906, -124554, 4295, - }, - { - 22000434, -35092032, 3755949, -21879100, -1902671, 1545651, 2774012, 2645163, -4634807, -2850785, - -2714956, 6445672, 7474317, -1226213, -3052648, -3599720, -5333813, 5884105, -1057636, -1360431, - 1891396, -4563403, 3082176, -158914, -2570001, 1414655, 3703873, -3117073, -3351685, -2039036, - -3485903, 1997697, -1624571, -1326608, 1214939, 421981, 3950833, 1268089, 2530810, -1681480, - -2314451, -892816, -1540283, 1822140, 293132, -2081985, 3064459, 1216013, 288837, -1527935, - -214212, -847182, 428960, -1058710, -578747, -1109712, 821949, -1493575, -1102196, 944893, - -422517, -525597, 331249, 813359, 184147, -616328, 79457, 544387, -282931, 160524, - 547608, 433792, 466541, 149250, 323733, 912144, 379031, -96637, -230318, -799938, - -358630, 7516, -53150, -173409, 49929, -401043, 383863, -215285, -13959, 71404, - 299574, -152471, 64425, -156229, -139050, 310848, - }, - { - -443455, 2449205, 2391760, 2476586, -1459215, -132607, 87510, 1400159, 66572, 777389, - 630286, 1483911, -2289755, 543850, 17360258, -8707509, 7851200, 2079301, -6437619, 3854733, - 4509179, 4364224, 392990, -11274826, 2377801, 11197517, -18303004, -4359392, -3008088, 2529736, - 9610526, -1645509, -344671, -1767379, -3110093, 480499, 584116, 510027, -969052, 25770, - 595390, -3073586, -1945620, -248571, -377957, 764504, 771484, -1184337, -520228, 1009317, - -568009, 114354, 306016, -51540, -833761, 126165, 609885, 350577, -66035, 479426, - -95563, -1510755, -136902, -924492, -907849, -1071058, 682900, 135291, 419833, -645856, - 427886, 1294396, 578210, -702764, -250182, 344671, -573915, -166430, -25233, 137976, - -23622, 958315, 432718, -126165, -251256, -101469, 331786, 622770, -54224, 70330, - 130997, -322123, 302795, -10737, 477278, 202400, - }, - { - 25504590, 60108068, 10658498, 10463614, -4906464, 1564442, 2530273, 7072201, -7331509, 3566434, - -3628174, 8421357, -741956, 5262409, -1055488, -4045859, -4986994, 4456566, 1277216, -2829847, - -1168231, -1546188, 3425773, -5683853, -1960653, -1884417, -1481227, 2799245, 145492, -894964, - -2822331, 928787, 2173254, -2937758, 309775, -352724, 1135482, 480499, 1061394, 2643552, - -2557116, 1439888, -1456531, -3065533, 114890, -1678795, 4699768, -209917, 1006633, -1834488, - -741956, 489626, 1946694, -1731409, -584116, -2043331, -489626, 282394, 246961, 13959, - 1896765, 800475, 561567, 1212255, -501437, 137439, 867583, 304406, 446677, -1747515, - 411780, -107911, -672162, 130460, -63351, 909459, -194347, -1022739, 309775, 1112933, - -504122, 205622, -251256, -657130, 188979, -205085, 150324, 28454, -118648, 159988, - -75699, -117575, 123480, 26844, 137976, -56371, - }, - { - -243203, -945430, 4118874, 3004330, 478352, 766652, 176094, 513785, -1510755, 1762547, - 1829656, -3114925, -2236604, 2627446, 11338177, 9795747, -678068, -8479339, -945430, -12976170, - -4036733, -2834142, -6909529, 3281892, 220654, 7605850, -2196876, 6544457, -3101503, -5739150, - 701690, -7867843, 1584843, 2931852, -3412889, -1623498, -2661806, -4436701, 1627256, 585189, - -123480, 1079111, -1493575, -438624, -1236414, 843424, -3016141, 2809446, 63888, 209917, - -1991254, -393526, -1192390, -1628330, 1802813, -2587718, 1759326, 1400696, 302258, -947040, - -1801739, -2084670, -782758, 753230, 108985, -48318, -575526, -1048509, -927713, 759672, - 333934, -316217, -656056, 543313, -86436, -447213, -1068373, -203474, -480499, 137976, - -191126, 199716, -89657, 48855, -613643, 31139, -560493, 269509, -295279, -152471, - 544924, 11274, 223338, -98784, -275415, -138513, - }, - { - 20175072, -103939816, 14732275, 7258495, -5296769, 94489, -2229625, 311922, -762894, -6082211, - 3194382, -3862249, 1491427, -7236483, -2963528, -3976603, -4379256, -3344706, -7275138, 1611687, - -1298154, 4246112, -4632122, -874563, 949188, 984621, 3040837, -1581085, 513785, 2741263, - -2323577, 765041, -1945083, 3578782, -1374390, 3787624, -2617783, 44023, -294742, 1364726, - 3709241, -2886755, -1029182, -1245004, 915365, -796716, -1630477, -1495722, -159451, -3033858, - 1489817, 312996, -547608, 3569118, -1806571, -1074279, 727460, 1445257, 1239098, -420370, - -1639604, 655519, -602369, -425739, -501974, -1087164, -243203, -293132, -767725, -449361, - 1086090, -384936, 282394, -399969, -300111, -23622, -433792, 516470, 372052, 621697, - -1030792, 334471, 753767, -576599, 348429, -393526, -404264, -354335, -192737, 447750, - 236760, -254477, 88584, -355409, -17717, 380641, - }, - { - 2881386, -11203422, -7611219, 4316442, -3814468, -7745437, -202937, 1381906, 1403381, -1086627, - -828392, 3723200, 1486596, 3925600, 7512972, 7556995, 1525787, 1733556, -999117, 1690607, - 1605244, 4626754, -3612068, 8353712, 331786, 5771363, -4912906, -3395172, 564251, -5756867, - 776315, -437550, -2537252, 1715303, -2129230, 2234457, 1504312, 1619203, 294742, 2211908, - -105227, -320512, 3147137, -1204738, 1433445, -200790, -2217814, -66035, 1533840, -1204202, - 884226, -1144072, 2688113, -2384244, 111132, 1383516, -3429532, 720481, -537408, 130997, - 1308354, -427886, 1093069, -863288, -1272921, 2147, -651224, -666257, 332323, -33286, - 44560, 284542, 339302, -137976, 103616, -358630, 842350, 279173, -194884, -152471, - 601295, -66035, -474594, 89121, -679679, 641024, -51003, -399432, -229244, -273804, - -131533, 350040, 606127, 154619, 67109, 38655, - }, - { - -8587250, -122555816, 7443715, -766115, -3865471, -15089294, 9040906, -1979980, -2096481, -3488587, - 5120675, 3520800, -5576478, -374199, 11104638, -2413235, 5071820, 228707, 7349226, 763430, - -2039573, -950798, -3078418, -577136, -4195110, 1886028, -1726040, 3723737, -1639604, -4481262, - -488016, 874026, 332323, -1621887, 4645007, 4823249, 226560, -675384, 2051921, -1509144, - 1326071, -99858, 3037079, 282931, -746251, 1067836, -369367, -126702, 1017907, 2272575, - 518080, -179315, -1818382, -616865, 685584, 53687, 1159641, -318901, 1283122, 414464, - -2204392, -587874, -677531, -584116, 748398, 54761, -130997, 596464, -1001801, -794569, - 357556, -580357, -44023, -1159641, -352187, -299037, 354335, -461709, -432181, 417149, - -328565, 354335, -272730, 256624, 314606, -219580, -52076, 89657, 201327, -352724, - -402116, -266825, 15569, 69793, 71404, 164283, - }, - { - 605590, -34475164, -446140, -618475, 383863, -3247532, -613643, -2514703, -1666984, -1307818, - 65498, 621697, -2899640, -4037806, 10673531, 2490544, -2748779, -3569655, -4524748, -4192962, - -6292127, -8296803, -4268124, -10916733, 6344204, 7602092, -8114267, -8461086, 3705483, -2100776, - 6276558, 5854578, 5796059, -4460861, -381715, -957778, 8527658, 2869038, 695785, -419296, - -789200, 432718, -192200, -1610613, 1741072, 2186675, 2052458, -1728188, 2749316, 2116882, - 243739, -1152125, -964757, 181462, -1266479, -965831, 1042603, -59056, 1975685, -99321, - -964220, 1611, -68719, -654983, 579821, -133681, -946503, -556735, 1255204, -739808, - -110595, -609349, -770947, 39728, 943282, 71941, -255551, -103079, 414464, -395137, - 183610, -461172, 677531, -238908, -390305, -292595, -129923, -260382, -60130, -130997, - -85362, 537, -60130, 75699, -514322, -64425, - }, - { - -41774464, -131440496, -79994, 7297150, 11222750, -22089016, 3813931, 8312909, 7086696, 8069707, - -4057670, 1704565, -7837242, 11555610, -853625, -2477123, -5081483, -2268817, -2364916, 4862440, - 2490007, 2605972, 1999307, 3785477, -7366943, -984084, 3786551, -4032438, -1153736, 526670, - -883153, -5204427, -3054259, -3536906, -1981591, -2952790, 2294050, 3139621, -811749, -3940633, - -374736, -4081830, 1781338, 1739999, 1212255, -1179505, -1148904, 3353296, 1540283, 3796751, - -662499, 4578435, 415001, -3148748, -2864206, -1197759, -1146219, 1304060, 140123, 734976, - 198642, -768799, -901943, -482110, -935229, 689879, -773094, 2110440, 322659, -304943, - 811749, -259846, -805843, 2684, 5906, -700617, 610959, 30602, -73551, 449361, - 76236, 606664, -512175, 581431, 214212, -100932, 711891, -29528, 93952, -104690, - -184147, -512712, -596464, 222801, -173409, -103616, - }, - { - -685047, -47115256, -2860985, -402116, 975494, -399969, 1634235, -1445793, 885300, 1348620, - 2231236, -1267552, 3564823, -10630044, 17233556, -5194763, -3784940, -881542, -3114388, 13166222, - 4576288, -3011309, 3796214, -858993, 6245420, 230318, 8555038, -7186554, 8991514, -1103270, - 1558536, 1789391, -3431142, 656056, 112206, 359704, 1648194, -5317170, 1117228, 2989834, - 491237, 1603097, -1131724, -210990, 2175938, -1228361, -44023, 886911, 512175, -202400, - 161061, -1940788, 2408403, 404264, 1927904, 839666, -1377074, 1877975, 32212, -919123, - 1668058, 1471026, 1508607, -359167, -1104344, -71404, 115964, 369367, -560493, 118112, - 689879, 552977, -75162, -222265, -53150, -855235, 846109, -730144, -406948, -71404, - 273267, 790811, 107911, 344134, -354335, 376347, 491774, -630823, 567473, 142271, - -196495, 86973, -129923, 130997, 144955, -472983, - }, - { - -30983358, 648003, 18820546, -1037772, -5949604, -5323075, 15311022, -985158, 8549132, 6125697, - -5675800, 1682554, -5153961, 2610266, -4226248, 5583458, -6600291, -5543192, -4933844, 6799470, - 2767570, -7645042, 3412352, 294742, 6038724, -4919885, 2160906, -2522757, -612570, -2034204, - 743029, -2229088, -4998268, 4713727, 1988570, 699543, 47245, 1610613, 3190087, 696858, - -4964982, 771484, 2340220, -469225, 2185602, 2090039, 3440269, -2056216, -396211, 2630668, - -870268, -197569, -2156074, 977642, -624381, 316217, -355409, -387084, 1903207, -515396, - -1436667, 1465658, -530965, 938450, -320512, -518617, 365072, 838056, 460098, -1045288, - -226560, -178778, 11811, -539555, 466541, 110595, -365609, 416612, -351114, -142271, - -717260, -331249, 725313, -297427, 656593, -411243, 230318, -68719, -206158, -7516, - -39192, -9127, 122943, 49392, -376883, -24159, - }, - }, - { - { - -522375, 9284109, 188979, -998580, 8771397, 5369, 1612760, -1326608, -714038, 3173981, - -2054605, -2498060, -4225174, -4168266, 2767570, 2790118, 5922760, 2502892, 5071820, -891743, - 925565, 1739462, -4715337, 4202626, 2619393, 9888088, 998580, -2797098, 2459943, 1109175, - -298500, -182536, -2445447, -2189360, -3089155, -2475512, 1174137, -276489, -783295, -656593, - 4918275, 2589865, -3223910, -1592359, -2094333, 1098975, 1162862, -1002875, 831076, -1079111, - -148713, 1627793, -502511, 17180, -341987, -53687, -749472, -221191, -547608, 741419, - 128312, -406948, -69256, 815507, -690416, 580357, -563714, 228170, -555661, -71404, - -699006, 220117, -627065, 5369, 298500, 217433, 459025, 188442, 347355, -274878, - 507343, 311922, -54224, 745177, 21475, 214748, -173946, 159451, -197032, 282394, - -121870, -201863, -112743, -43487, -113280, 102005, - }, - { - 5241471, 2391223, -18442052, -9990094, 8675297, -77309, 125628, -3168612, -1422171, 2843268, - -4636417, 903554, 3040300, 659814, -697932, -1835025, -2850248, 4870493, 3309272, 1682554, - 961536, 6698539, 156766, -6043019, 4326643, 860067, 140123, -2469069, 2174327, 3002182, - 668941, -3688840, 1382443, -2593087, 355945, 161061, 306016, -165356, -1821603, -3056406, - 122943, 1156957, 1576790, -465467, 1661616, -2609730, -92342, -3303904, -754304, 2528662, - 1960116, 651761, -44560, -458488, 306553, -1436130, 1832340, -595927, 61203, 1549946, - -414464, 852551, -434329, 101469, 602906, 746787, 121333, 435939, 113280, 556198, - -322123, -875636, -128312, -93416, 389768, -1074, 210990, -815507, 118648, 264677, - 407485, -91805, 166430, -372052, 721555, 231391, -88584, 81604, 206158, 441308, - -24696, 3221, -195958, 224412, -121333, -46171, - }, - { - -588411, 11979201, -2495376, 19432042, 9093520, 462246, -1595580, -1663763, -622233, 292058, - -3052111, 4251481, -8801462, 4814659, 163746, 4438312, 91268, 1366873, -1694365, 6147172, - 8182450, -2861522, -9254044, 1910187, 242666, -5289252, 6700149, -1669132, 3476239, -1228898, - -791885, -1879048, -3443490, 309238, 1925756, -2907156, 1521492, -381715, -862752, -341987, - 1903207, 1312649, 571231, -2525441, 74625, -501974, 679679, 83215, 16106, 25770, - -21475, 843424, 1774895, -209380, -280784, -404264, -289910, 464393, 1180042, 805306, - -427349, 374736, -335544, -1064615, -717796, -419296, 967441, -699006, -1074816, -631360, - -156766, -375810, 334471, 1163936, 447750, 759136, 236223, 249108, 176094, 66572, - 863825, -217970, -510564, 183610, 34897, -414464, -265214, 129923, -396748, -158377, - 169114, 368293, -66572, 176631, 20938, -74088, - }, - { - 606127, -27400280, 2920578, 1416266, -342524, 426276, -705448, 872415, -3135326, 1728724, - 119185, -2509335, -4738423, 7477001, -12943958, -6190122, -6518687, 14408005, -19574850, 17627620, - -1852205, 728534, 456340, -1724966, -630286, 1961726, 6063420, 2622078, 1025960, -2682207, - -816581, -2419677, -3835943, 211527, -1418413, -2880849, 4461934, -2297271, 2842732, -1005022, - -1094143, -2338073, -1230508, -1831804, 2585570, -1320703, 2502892, -347892, -535797, -474057, - -846645, 547608, -1178432, 1264331, 914828, 1495722, -85362, 62814, 7516, -147103, - -261993, 657667, -141734, 146029, 311922, 1131724, 563714, -1138166, -869194, 374736, - -767725, -480499, 475131, 363462, 374736, 1026497, -600759, -489626, 23622, 355945, - -52076, 256624, -146566, 491237, -20401, 230854, -222801, 27917, -268435, -533650, - 87510, 42950, 243739, 186831, -29528, 53687, - }, - { - -15289010, 4668630, 1110786, -25407952, 7561290, 1623498, 4391604, 421444, 1483374, -7581691, - 5359046, 1174137, 6376416, 1074279, -1588601, -4714801, -5559835, -1895154, -165356, 4308926, - -2676302, -3240016, 3740917, -2578054, -3303367, 842887, 314606, 781684, -2467459, -3332358, - -2319819, 535260, -4335770, -612570, 2578591, 2748779, 1293859, 1717450, 646929, -1386738, - -2533494, 258772, 784368, -722628, -1679869, 1078574, 3139621, -126165, 134218, -1883343, - -2169495, 1705102, -455803, -1504849, -273804, -920734, 536871, -687195, -1538135, -449898, - 1101659, -598611, -261993, 785442, -46708, -1038845, 74088, -33286, 248034, 241592, - 401043, -396748, 805843, 11274, 754841, 199716, 329639, 338766, -718333, -65498, - -703838, 28991, 288300, -241592, -383863, -46171, -80531, 245350, -502511, 104690, - 29528, -20401, -179315, 44023, -100395, -4832, - }, - { - -722628, 10588705, -448824, -1300301, 224949, -752693, 756988, 1129576, -920734, 1866163, - -52613, 1298154, -2841658, 2091112, 9003862, -4714264, -3766150, 5734318, 3123515, -1791001, - 1454383, 4485557, 2284923, -2967823, -5443871, 5526549, -8917426, -5243082, -281320, 9596031, - 3785477, -2336999, -2454037, -709743, -1141388, 2519535, 1651952, 2272575, -1403381, -1753957, - 2025614, -2763812, -688269, -285615, 579821, 2109903, -1280437, -1961726, -887448, 1864016, - 164819, -804770, 927176, -1368484, -264677, 828929, 52076, -85362, -421444, 155693, - -839666, -677531, -449361, 41876, -1717450, -542777, -57982, 175557, 881542, -602906, - 493921, 1246614, 530428, 111132, -139586, -121870, 28991, 319975, -118648, -243739, - 825171, 364535, 416612, -347355, -1611, -150861, 277025, 345208, 230318, 39728, - -16106, -104690, -27917, 327491, 206695, 139050, - }, - { - -4601521, 100942472, -4599910, 16691854, 5476620, 170725, 461172, 10558103, -4527970, -815507, - 1315871, 5994701, 3768297, -337155, -1505386, -6338298, 1991254, 1175747, 2147, -3388729, - 510564, 1968169, -3272765, -3356517, 881542, -1548873, -534723, -914828, 1460289, -128849, - -3506841, 789737, 2566780, 16106, -1201517, 12348, 570157, 1228361, -1275068, 2981244, - 1404991, -2594160, -724239, -1948305, -1069447, -937377, 4692789, -3344706, 1076963, -2013803, - 836982, 1372242, -1939715, 346819, -652298, -570157, -960999, 1261110, 458488, -54761, - 1685238, 945967, 852014, 1042066, -104153, -206695, 803159, 985158, -476741, -469225, - -467078, -371515, -256624, 8590, 54224, 995896, -191126, -387621, 158377, 573915, - -14496, 436476, 235686, -484258, -392990, -344671, 410169, 203474, -574989, 6979, - 24159, 190052, 274341, -75699, 475668, -370441, - }, - { - -932008, 2965138, 3187403, 1058173, 1470489, 652835, -162135, -1297617, -193274, 1675037, - 2065342, -3281355, -2820720, 2927020, 10534481, -10830297, 1017907, 4214437, -2783676, -10894721, - -4299799, -4181151, -4730907, 5827197, -4997195, 92342, 8604967, 3122441, -1297080, -6221797, - -989990, -4271345, -306553, 2102387, -3724811, -3167539, -3919158, -2778844, 5351530, 1421634, - -2495913, -1313186, 1257352, -829466, -1062468, -1126355, -743029, 2683818, -608275, -620623, - -892279, 1288490, -2300492, -294742, 601832, -576599, 158914, 1090922, 22549, -21475, - -1157494, -1966558, -543313, -113817, 937914, -52076, -632971, -586263, -1139777, -259309, - 634581, 868657, -1029182, -119185, -27380, -477815, -474594, -268435, -235686, -55298, - 104690, -26307, 82141, -351650, -316754, 137439, -442382, -190589, -307627, 367757, - -36507, 296353, 221191, -72478, -272730, -79457, - }, - { - -26783416, -43832824, 3020436, 17286170, 3008088, -2488934, -593242, -4086662, 539018, 1276142, - -461709, -7261716, 4277788, -1432909, -10364293, -1934346, -3137474, -9436580, 421444, -3956202, - 3704946, -1138166, -1008780, -1418950, 1312113, 1124208, 2188823, 270046, -1061394, 2716030, - -359167, 383863, -3670587, 3133716, -2551211, 4081830, -491237, 22012, -648003, 2491618, - -1514513, -142271, -807991, -649614, 181462, -1814087, 469762, -1657321, 1398012, -5099200, - 1479616, 184147, -450435, 1865090, -1013075, -458488, -257161, 1908576, 1689533, -928787, - -1490354, 252329, 573378, -853625, -1435593, -492311, -1600412, 370441, -839129, -620086, - 566399, 99321, 177704, 49929, 26844, -545998, 3758, 446140, 421981, 317291, - -258772, 177167, 217433, -200790, 193274, -300648, -912144, -305480, 161598, 387621, - 76236, -129923, -102005, -39192, 36507, 217970, - }, - { - -1504849, -10931229, 812286, -8355859, 1975148, 76236, -10180683, 6007586, 756988, -2008971, - -1111860, 649614, 5772436, 2132988, 14244259, 4090956, -3653407, 5173288, -4387846, 1981591, - 1879585, -567473, 1961190, 5243082, 1061931, 4413079, -2910914, -2151242, 1119913, -2778844, - -3036005, 2001992, -3453691, 4790499, -848793, -908386, 6183143, 2524367, 1060320, 1100585, - 1913945, -1559073, 3853660, -2033667, 1478543, -1153199, 801548, -1765232, 746787, -129386, - 1626719, -132607, 1910187, -1877975, -220117, -1193464, -61203, 215822, -1120450, 281857, - 1115618, -40265, -421981, 442382, -1443646, 270583, -493384, 249108, -399969, 331786, - -491774, 545461, 103616, -12885, -44023, -195421, 99321, 74625, -142808, -257161, - 27917, 597537, -512175, -37581, -481036, -79457, 151398, -133144, -472446, 55298, - 66035, 506806, 685584, -191126, 281857, -76773, - }, - { - 5197984, -128006128, -3526168, -7405061, -4361003, 51540, 4121558, -3241627, -2365453, -4533338, - 5056787, 1340567, -158377, -2421288, 11687680, -4586488, 3366718, 9934796, 1305133, 2122251, - -1533840, -5073967, -5502390, 1577864, -3476776, 743566, -668404, 3294240, -692027, -909996, - -295279, 576599, 971736, -2000918, 6569153, 4425964, -2631204, 1044751, 1893007, -1095754, - 1853815, -882616, 1620276, 780610, 1144072, 535797, -69256, -744103, 1854889, 449361, - 871878, 144418, -1140851, 644245, -975494, -912144, -49929, 600222, 2290828, -227096, - -2065879, -759672, -191663, -284542, 718333, -22549, 1002875, -1332514, 379031, -861141, - -109522, -366683, -938987, -251792, -586263, -567473, 471910, -465467, -396211, 30602, - -199179, -114354, 98247, 69256, 547608, -574452, 50466, 396211, 22549, -470299, - -178778, -168041, -246961, 60130, 99858, -83752, - }, - { - 710817, -35078608, 2401961, -2961380, -1762547, -1540820, -3984119, -2379412, 4592394, -2487860, - -2374043, 566399, -768262, 3970697, 7342247, 342524, -4166118, -90731, -1371705, -6803765, - -5498632, -12199855, -3807489, -6178848, 2208150, 3814468, -14165339, -3799972, 4995584, 4633196, - -3015604, 7816304, -3612604, 703301, -3177739, 4562329, 2754148, 7417946, 2192581, -4287988, - 1268089, 2623688, -2438468, 1073205, -1464047, 2481417, 1076963, -2282238, 3285113, 1080721, - 347892, -295816, 528818, -373662, -854699, -1530619, 1051193, 371515, 1108638, 115427, - -425739, -362925, -809601, -1326608, 1454920, -417149, -933082, 371515, 10201, 526670, - 212601, -890669, -894964, 253940, 294205, 530428, 530428, -551366, 184147, -123480, - -300648, 331786, 280247, -358093, -242666, -464930, -542777, -34897, -57982, -488016, - 141734, 60666, -190052, -58519, -275415, -76236, - }, - { - 12172474, -200636176, -5315022, 422517, 16965120, -6309844, -2665564, 3429532, 9074729, -1962800, - -1987496, 1648194, 477815, 3354906, 1873143, -3872987, -5190468, 2654290, -4773856, 1102196, - 4976257, 1717987, 3518652, -1657321, -2350958, -3633542, -1740536, -3178276, -475668, 2275796, - -3133716, -3751654, -299574, -4841502, -2479270, -267362, 370441, 3742527, -3907883, -3577708, - 1290101, -7024956, 2010582, 1922535, -2423972, 1095217, 2203318, -463856, 3506304, 2122251, - 6442, 364535, 1694365, -2768107, -1592359, 390305, -2181307, 261456, -304406, 2066953, - -9127, -980863, -612570, -876710, 289373, -140660, -526134, 963683, 788663, 441845, - 37581, -191126, -188979, -223875, 426276, -33286, -39728, -760746, 707596, -113817, - 194347, 71941, -111669, 68719, 228170, 251792, 184684, 230318, 306016, -523986, - -638340, -27380, -333934, -195958, -202937, -37044, - }, - { - 1262720, -45207752, -9862319, 3234647, -647466, 3095061, -5308043, 661962, -33823, 3170760, - 1826972, 2328409, 1268626, 158914, 702227, 585726, -4924180, -3676492, 1426466, 10100689, - 1970853, 898722, 4023848, 2187212, -568009, 5339181, -707596, -4295504, 5089536, 6161668, - 6390912, -4431333, -3456375, -1181116, 3448322, -3957276, 2867965, -1074279, -8590, 146566, - 2187212, 2100776, 841277, -1097364, 1606855, -3245922, 1271847, 1673427, 1915555, -1211718, - 132607, -1356136, 2104534, -476741, 1859721, 403190, -862752, 1456531, 162672, 556735, - 2406792, 766115, 1096827, -13959, -526134, -1024887, 226560, 314069, 19864, 195958, - 481036, 236223, -806917, 323733, -213138, -317291, -386547, -406411, -750546, -15569, - 1171989, 234613, 73014, 354872, -278636, 167504, -26307, 66035, 237297, 180389, - 187905, 65498, -222265, 171799, 121870, -155156, - }, - { - 25807384, -66765804, 1622424, 1548873, -1163399, 4035122, 9870372, 2988224, 7151121, -796180, - 2790655, 1396938, -5924371, 2235531, -7796440, 6132140, -3018825, -406411, -5648956, 2190433, - -4824859, 2889976, -3666292, 5437966, -1189169, -4147865, -1078574, -449898, 2851322, -2092723, - -656593, -1424855, -5260261, 1796370, 3477313, 675921, 70330, 2732136, 362925, 2786360, - -2216740, -2042794, 3839164, -2361695, -936840, 3401614, 1126355, -877247, 718870, -156229, - 1541893, -102005, -537945, -179852, -288300, -279173, -457951, 1301912, -701690, -177167, - -377957, 365072, 1060320, -933082, 45097, -752693, 355945, 468151, 278099, -354872, - -641024, -390305, -97174, -929860, 441845, 238371, -37044, -164283, 160524, -814433, - -47245, -28454, -303869, 149250, 650151, -146566, 32749, -121870, -122407, 5906, - -406411, 121870, 39728, -80531, -405338, 83215, - }, - }, - { - { - 637266, -1719061, -9946607, -18080738, -3961571, -86436, 3935264, 891206, -3400004, 1265405, - -4231617, 405874, -3188476, -2973191, 6120866, -1853278, -2076617, -1936493, 8549669, -1577327, - 807454, 2630131, -8502425, -7605850, -8978629, -2083596, -1476932, -1177358, 3311420, -5262946, - -8252780, -1579474, -3642669, -1577327, -3264712, -1365263, 56371, -4364761, -3117610, 24696, - 3572876, 1723893, -1481227, 1292785, -645856, -268435, 1066226, -1179505, 1548336, 1930588, - -177704, -997506, -1450625, 1244467, 1293859, 1688996, 731218, 105227, -440234, 265214, - -494458, 10201, -212064, 326954, -41876, 1645509, -946503, 770947, 423591, 906238, - -111132, 57982, -33286, 147103, -388695, -358630, 138513, -132070, 590021, 147640, - 571768, 335007, -49392, 977642, -308701, -292058, -346819, 111669, -629750, 47782, - 19864, -242129, -137439, -83215, -181999, 214212, - }, - { - -4164508, 15015743, 2536178, -18487686, 3171833, -839666, 535797, -2308008, 1497870, 3030100, - -3570729, 3798362, 2077690, 2226941, -4669167, -7567196, -3435974, 4066260, -86973, -1433982, - -4221953, 847182, 3173981, -1650341, 6594923, 3172370, -2797634, -2610803, 5834176, 2679523, - -2696166, -4882304, 2537252, 1199370, 4531191, 761283, -2488397, -905164, -1404454, -1302449, - -223875, 199716, 2332704, -565862, 2244657, -1858647, 2158758, -2724620, -457414, 1362042, - -635655, 722628, 575526, -2100239, -491774, -938987, 2404645, -1225676, -446140, 358093, - -1167694, 103079, -387084, 425739, -242666, 562104, -317291, 574452, 48318, -156766, - -371515, -456877, 151934, -52076, -198105, 139586, 400506, -504659, 280784, 67109, - 75162, -68183, 322123, -175557, 384936, -349503, -201863, -147103, 162135, 260382, - -9127, 308701, 52613, 213675, -39192, 65498, - }, - { - 2610266, 27631136, -20401, -32210644, -25587804, 2003602, 2345589, 3320547, 1817308, 2634963, - 2149094, 11048266, -3944391, 8493835, -7936026, -2455111, -2748242, -3168075, -1648731, 4778151, - 4072703, -1610076, -4355634, 4543002, 2706903, -4488241, 6850473, -3213709, 1854889, -608812, - 1489817, 3837553, -303869, -1178969, 2942590, -40802, 3311420, 76773, -745177, -787590, - 2000918, 1953136, 1218697, -1510218, 1415729, -97174, 1569811, 1536525, 97174, 58519, - 538482, 93416, -403727, -1172526, 722091, 1406065, 941135, -384400, -118112, -63888, - -1326608, 536334, -519691, -768262, 311385, -206158, 968515, 95563, -241592, -905164, - -117575, -101469, 319438, 527207, -261456, 761820, 361851, 187368, 270583, -244276, - 295816, -324270, -562641, 112743, 114890, -123480, -83215, 571768, 34897, 106837, - 35433, -9664, -43487, -2147, -217970, -268435, - }, - { - -1184874, -36056252, -2736968, 499827, -1380295, 1106491, 631360, 2898029, -1421097, 3109556, - 1736241, -471373, -1901060, 7004555, -9124658, 8415452, -4366908, 7026567, -19830938, 11281805, - -1668058, 3112241, 4190278, 2709051, 5128728, 2178085, 4321811, -1602560, 1270237, 1463510, - -532039, 1214939, -884226, -1592896, 315680, 710817, 3536369, -4378719, 2408940, -692564, - 1563905, -1126355, 590021, -549219, 2245194, -1597728, 849330, -178241, 147640, 352187, - -340376, 1328756, -1045825, 623844, 255014, 1381906, 139586, 343061, -874026, -30065, - -113280, 835371, 615791, 1001801, 9664, 266825, 305480, -529355, -255014, 751082, - -424665, -284542, 188442, -423054, -206695, 571768, -219580, -238371, -325344, -197569, - -345745, 23085, -347355, -48855, -637803, 175557, 105227, 34897, -154619, -266288, - -6979, 11811, 46708, -83215, 69256, 15569, - }, - { - 1272384, 9699110, -6666326, -32237488, -5948530, -210990, -371515, -1610613, 5863167, -136902, - 7021735, -5069672, 4523675, 1761474, 6578816, -1292248, -10087804, -4001299, 2252710, 5381057, - -1381906, 195958, 2100239, -4874788, -5291400, -3051574, -1081795, 3979287, -711354, -1309965, - -837519, 56371, -1527935, 216359, 2667175, 5237713, -1500554, -229244, -315143, -3798362, - -3131031, 82141, 3755949, -978179, -1708323, 2342905, 1415192, -3224447, -6979, 1191317, - -133144, 1527398, -461172, -421981, 367757, 353261, 392453, 75162, -275952, 658204, - 984621, -906775, 229781, 355945, 312996, -352187, -755377, -391379, -217970, -759136, - 363998, -403727, 466541, -515396, 85362, -579284, -277025, -64961, -194347, 567473, - -368830, 394600, 460098, -405874, -289373, -255014, -358093, 326954, -168041, 299037, - -227096, 40265, 50466, 84289, -235686, -170188, - }, - { - 395674, 17570174, 526670, -1840930, 642098, -59056, 580894, 555661, -1510755, -140660, - -429497, 2251100, -2142115, -4363687, 4970351, -6233608, -13633300, 884226, -594853, -7346005, - -5248987, 1056562, 5109938, 4883378, -4069482, 1437203, 10917807, 10943040, -530965, 7961796, - 1209033, -4221416, 1947231, 1745367, -2637110, 1451699, 300648, 1147293, -2432025, -1585380, - 3182571, -297427, 2652142, 351650, 525060, 2428804, -523986, 83215, 1046361, 2371896, - -325344, -734976, 820876, -815507, 821413, 1070521, -464393, -654446, -439697, -216896, - -591095, 107374, -419833, 470299, -977105, -423054, -300648, -250182, 624918, -253403, - 204011, 236223, -155156, -287226, -55298, 341450, -216896, -47245, -49392, -31675, - 1028645, -516470, -88584, -255551, 106837, -171799, -26844, -170725, 29528, -345745, - -88047, 215285, -12348, 130460, -223875, -55835, - }, - { - -16291885, 71984728, -1174137, 14506252, -5688148, -565325, -1130113, 8448738, -2550674, 3690988, - 3383361, 1636383, 1409286, -2131915, 1141924, -2776696, 959388, -1107565, 623307, 900869, - 2330557, 222801, -2838437, 1345935, 2876554, -334471, -195958, -3023120, 1931662, 802622, - -88584, 3038153, 2239289, 1127966, -1141388, -791885, -1952063, 868120, 121333, 2882460, - 1397475, -1731409, 770947, -2245194, -1236414, -1117228, 1601486, -3862249, 1159104, -2225867, - 1668058, 1752884, -323196, 1702955, 949188, 1306744, -461172, 1670742, 578747, -630286, - 428423, 181999, 194884, 113817, 197569, 333934, 449898, 173946, -382789, 514322, - -55298, -285615, -454730, -39192, -591095, -27917, -70867, 297963, 482647, 347355, - -51540, 323196, 420907, -125628, -416075, -167504, 91268, -209917, -645856, -71941, - -8053, -174483, 23622, -172336, 462246, -186831, - }, - { - 50466, 3448859, -1302986, -1441498, -76773, -318901, -667867, 873489, 1178432, 297963, - 234613, -2661806, 469225, 2715493, 6943352, -20753282, 180926, 9047349, -3687766, -4153770, - 6242198, 795106, -3060164, 6350646, -4177393, -3859028, 8092792, 7589207, 3020973, -3465502, - -425739, 3092913, -318901, 273267, 346282, 1633698, -2410014, -2772402, 4468377, 2953864, - -202400, -266288, 113817, -2310693, -131533, 255551, 618475, 3029563, -584652, -1939178, - -1561221, 1806571, -938450, -63351, -195421, -66572, -358093, -153545, -47245, 637803, - 169651, -687195, -514322, 442919, 769336, -325344, -83215, -192200, -281857, 369904, - 34897, 849330, -191663, 207232, 155693, 3221, -195958, 72478, 374199, 177704, - -159988, 242129, 285078, -306016, 149787, 208306, -158377, -176094, -284542, 59056, - -712965, 123480, 22012, 197569, 238908, 154619, - }, - { - 20024748, 1301375, -778463, 14144401, -8578660, -3444027, 1137093, -3979824, 589484, 1301375, - 1410897, -179315, 10610717, 2454574, -8007967, 3470334, 1407676, -4130685, 7592966, 645319, - 3814468, -2901251, 2115272, -38118, 275952, 1269163, 838592, -111132, -2515777, 435402, - -1781875, -2269353, -2881386, 4954782, -2862596, 2158221, 1258962, 280784, -1761474, 46171, - -1891933, 511638, -1341640, -296890, -677531, -1840394, 461709, -1242319, 1872606, -4941897, - 1637993, -683437, -1636919, -515933, -597000, 479963, -115964, -105227, 848793, -276489, - -838592, 107374, 523986, -260382, -1104344, 666794, -528818, 277025, -204011, -355409, - 170725, 217970, 155156, -83215, 556735, 309238, 614180, 103616, 128312, 76773, - -97711, 327491, 117575, -391916, 5369, -11811, -390305, 14496, 300648, 45097, - -303869, -248034, -27380, 271657, 74088, 183610, - }, - { - 362925, -22987202, -11059541, -5557151, 10439992, 7371238, -9451612, 2984466, -4021163, -3965329, - -2275796, 1802276, 6103686, -2095944, 6933151, -3410741, -7414188, 3039226, -10173704, -11375221, - -3193308, -3657702, 2831457, 3259880, -3285650, 2612951, -2187749, -2229625, 3635690, 3785477, - -4653597, 295816, -5270462, 977642, 2573222, 1216013, 5781563, 2236067, 131533, 1355062, - 2036351, -2413772, 1941325, -4594005, 357556, -980863, 1114007, -1301912, 1759863, 263604, - 544924, 213675, 1802276, -1527398, 443455, -1068373, 1088237, 718333, -1214939, -1170379, - -988379, -909459, -375810, 1083406, -1056025, 672699, -125091, 930934, -265214, -191126, - -363998, -672162, -578210, -47782, -124017, -358630, -616328, -416075, 24159, 22012, - -158377, 577673, -544924, 48318, -198642, -396748, -77846, 231928, 107911, 312996, - -16643, 312996, 284542, -124554, 201327, -373125, - }, - { - -3969087, -144069840, -1796907, -3303904, -4836670, 11083700, -1814624, -4020626, 2208150, -2396592, - 3992172, -1148367, 2488397, 932545, 2060511, -7721278, 789200, 7709467, -3510062, 2040646, - 3977140, -1641214, -3461744, 2558190, -666257, 2448131, -2566780, 3894999, 2609193, 1166084, - 2354179, 913754, -704375, -290984, 2015413, -3834332, -3821447, -631360, -842887, -1285806, - 2866891, -1240709, -1604170, -1123134, -314606, -128312, -751082, -2042794, 456340, -2390149, - 257161, 2029909, -505196, 433255, -157840, 187905, -443455, 419296, 552440, -405338, - -575526, -180389, 401043, 241592, 724776, -590558, 760209, -879395, 1172526, -335544, - 249108, -350040, -667867, 341987, -1064078, -703301, -91805, -320512, 493921, 43487, - 63351, -51540, 52613, -131533, -81068, -375273, 14496, 220654, 75699, 116501, - 282394, 16106, -161598, 6442, 30602, -168577, - }, - { - -1374390, -31483184, 9801652, 1385127, 321049, 768799, -1481227, -3466039, 5324149, 346282, - -2556579, 857920, -769873, 1804960, 1221918, -1458678, -1823214, 1253057, 2163053, -1238561, - -1025423, -5015448, 1546188, -915365, -6801081, -1855963, -9481140, -4495220, -562104, 3350611, - -7486128, 2284386, -8280697, 1851668, -2871723, 4404489, 1637456, 7194070, 835371, -991064, - 4923643, 4302484, -2149631, 2069101, -2254321, -1044751, -2288144, -1219234, 3161633, -202937, - 1454920, 1065152, 2102387, -1481227, -952946, -1529008, 711354, 574452, 424665, -758062, - 934155, -82678, -1510218, -750009, 1519882, 261993, -44023, 804770, -757525, 395674, - 1174674, -190589, -460635, 1005559, 308164, 172336, 510027, -343061, 27917, -216359, - -143345, -18254, -150861, -252329, 115427, -364535, -314069, 279710, -30065, -402116, - 531502, 282931, -121870, -10737, 95026, 382789, - }, - { - 20386600, -180198576, -161061, -4854387, 9182640, -3641059, 1268626, -3644817, -2792803, -9501541, - -4030290, -1121523, -3552475, -4041564, -2910377, -2487860, -2494302, 1542430, -3263638, 2506114, - 3358665, 3502546, 1826435, -3194382, 454730, -1861332, 645319, -115964, -1452773, 2834142, - -738734, -832150, 2180233, 180926, 1200443, 1279900, -1782948, 503585, -4272956, -2539936, - 3848828, -4034048, 3981435, 1671279, -3685619, -1657321, -197032, -1476395, 2480344, -1022202, - -1173063, -637266, 393526, -2143189, -1464584, -46708, -1318018, -420907, -1034013, 1640678, - 428423, 41339, 303869, -520228, 95026, -83215, -200790, 621697, 689879, 646393, - -181462, -177704, 585726, -168041, 718870, 483184, 288300, -672162, 281857, -287763, - 149787, 5906, 358630, 274878, 19327, 94489, -98247, 45634, 134218, -470836, - -322659, 49929, -382252, -331786, -47782, 67109, - }, - { - -1348620, -42237244, -4064650, 3564823, 2414309, 7210177, -6246493, 875636, -915365, -3570192, - -3042448, 110595, -2846490, 9677098, 17425220, -3163244, -6888591, -2038499, 4782446, 3344706, - -6749004, -2395518, 3398393, 30065, -254477, 7770133, 3764002, 3546569, -1333051, 3339874, - 3768297, -1844689, 5005248, 1348083, 2406792, -855235, 4299799, 510564, -259309, -2356863, - 2917894, 2956548, 1156420, -833224, 1348620, -2954401, 2481417, 855772, -136902, -1061931, - 424128, -2751464, -261993, -1655710, 1069984, -626528, -46708, 2286533, 620623, 85899, - 1318018, -849867, -155693, 168041, 631897, -210453, 569083, 386010, -320512, -230318, - -324270, 213138, 382252, 213138, -417686, -92879, -760209, -119185, -474057, -309775, - 635118, -581968, -409096, -21475, -543313, -108985, -494995, 150324, -84289, -158914, - 238371, -29528, -308164, 331786, 165356, -190052, - }, - { - -9459665, -112986096, -9165460, -7443179, 2132451, -2537252, 1359357, 959388, 4322348, 555661, - 6078990, 4151086, -6429029, 3036005, -731218, 1702955, -686121, 7914551, -2740189, 100932, - -1326608, 7141457, -5304285, 5435281, -1776506, -5215701, -3502009, -15569, 8333311, -988379, - -1345399, 130997, -433255, -1901597, -3127810, -1646583, -1133871, 253940, -874026, 751619, - -1092532, -994822, 3360812, -1449015, -830002, 1141388, 66572, -1292785, 437550, -459562, - 1747515, -2170032, -1736777, -791885, -658741, -514322, -606664, 1065689, -1091995, 1282048, - 1975685, 896574, 590021, -395674, 692027, -435402, 427349, -533650, 182536, 191663, - -177704, 243203, -69793, -553514, 418222, 151934, 326418, 448824, 553514, -571231, - 653372, 168041, -683437, 88047, 275415, -62277, 259309, 212601, 143345, 534187, - -270046, 1611, 16643, -115427, -235686, 153545, - }, - }, - { - { - 223875, -19938848, 7463580, -11107322, -12297028, -475668, 3801583, 1117765, -5127654, 6509560, - -3183108, -4920959, -5560372, 4003983, 855235, 1280437, 736050, -6296422, 9284109, 3822521, - -2019708, -550830, -3447785, -11171747, -5424007, -6364068, 1483374, -3629784, 2430415, -9230958, - -5345087, -1430761, -4376572, 993211, -4408247, 890669, -3052111, -3111167, -1436667, 398895, - 88584, 5162551, -1931125, -781147, 2247879, -62814, 767725, 1446330, -1514513, 2904472, - 821413, -2739116, -147640, 657130, 227633, 1880122, 729071, 1123671, -1112397, -195958, - 390305, -591632, -207769, -121333, 598074, 1269163, 39192, 244276, -150861, 828929, - 783832, -1064078, 658204, 510027, -440234, -361314, -152471, 171262, 493921, 625992, - -55835, 463320, -204548, 621160, -393526, -198105, -236223, -35970, -361314, -20401, - 85899, -224949, -186294, -223338, -37581, 205085, - }, - { - 5721970, 18185966, -4121558, 61740, -10697153, -1610613, -3482682, 4082367, -397821, 1171452, - 1409823, 2397666, -2504503, 3959423, 1257352, -4899484, -6925635, 694711, 2214056, -4416837, - -4269198, -1532767, 5713917, 3091840, -570694, 6307697, -4001836, 2750927, 4302484, -72478, - -259846, -5553393, 2749853, 3550327, 2458869, 2240899, -4623533, 13959, -1658394, 259309, - -201863, -1673427, 2364916, -256087, 425202, -420907, 2226404, 386547, -201863, 118112, - -305480, 292058, -1142998, -1503775, 149250, -704375, 709207, -915365, -96637, -818191, - -438624, -579821, 617938, -393526, -147103, 1067299, -293132, 47782, 240518, -401043, - 227096, 29528, -33823, -236760, 118648, 357019, 12348, 370978, -353261, 421444, - -448824, 258772, 97711, -326954, 156229, -197569, -537, -114354, 53687, -59593, - 323733, 83752, 234076, -124554, 47245, 95563, - }, - { - -4377109, 51448876, -11337640, -53987204, -4511863, -2468533, 2865280, 4595615, 2171106, 5034239, - -474594, 7043210, 2556043, 9766219, -7280507, -3022583, -5626944, -8425115, 5867462, 2374580, - 2714419, -4674535, 527744, 3709241, 799401, -3630321, 1380832, 3332895, -1389959, 1421097, - 2177549, 1914482, 907312, -359704, 654446, 3170760, 875636, -1422171, 4295, -535797, - 2086817, -417686, 2846490, -237297, -56908, 67646, 1588064, 672162, 971200, -573915, - 2032593, 975494, -1867237, -797253, 21475, 1673964, 938450, -178778, -148713, 3758, - -1458678, -287763, -364535, -30065, 97174, 435402, 37044, 103079, -110059, -676457, - -15569, -51540, 516470, -34897, -75699, 797790, 299037, -11811, -101469, -20401, - -207232, -105764, -304406, 9127, 126702, 244813, -180926, 492848, 91805, 195421, - -199179, -244813, 86436, 73551, -292058, -14496, - }, - { - 1400159, -33422898, -8204998, -771484, 366146, 614717, 991064, 984084, 267362, 2196876, - 2752537, -408022, 48318, 2673617, -4786741, 2401424, 11509439, -16093779, -1326071, 3460670, - -1879585, 4886599, 2866891, 6683506, 1226213, 1094143, 1611687, 1384053, -1330903, -1054951, - 3768297, 1944010, -2757906, -2473901, 3184182, 1024887, 91805, -4338991, 862752, -2114198, - 2557653, -1226750, -623844, 1100049, 1998234, -490163, -1272921, -107911, -58519, 75699, - 1187559, 686121, -627065, 470836, -31139, 937914, 564251, 708670, -478889, -736587, - 392990, -532576, 826244, 644782, 627065, 319975, -1044214, 741956, -416612, -358630, - 441845, 55298, -660351, -447750, -117038, 227096, -23622, -218506, -121870, -645319, - -62814, -102005, -239444, -237834, -383863, -136365, 133681, 12348, -55298, 5369, - -154082, 91805, -106837, -101469, 4832, -177704, - }, - { - 15459198, -12566537, -6244346, -37846716, -1307281, -1108102, 358093, 957241, 555125, 7907035, - 882616, -1215476, -5547487, 2035815, 12425340, -5514738, -5803038, -3950833, 8030515, -784368, - 2115808, -225486, -4829691, 3404835, -6048925, -1994476, -391916, -1061931, -1082332, 719944, - -4063039, 2742874, 592169, -1282048, 3045669, 3773129, -86973, -1451699, 77309, -2683818, - -1364189, -1824824, 2560338, -431644, 42950, 268972, 849867, -1518271, -944893, 2397666, - -481573, 1036698, -1216550, 10737, 236760, 1377074, 280247, 51003, -114354, 1152662, - 657667, -629750, 157840, 543313, 92879, -45634, -803159, 258772, -355409, -839129, - 527207, 332860, 224412, -624381, -154082, -573378, -512175, -335544, 395674, 318364, - -95026, 97711, 257698, -491774, 312459, -426276, -369367, 209380, 207232, 246424, - -270046, 7516, 163209, 231928, -192200, -196495, - }, - { - 525060, 8813810, 4605816, 1519882, -799401, 108448, 363462, -248034, -845572, -1619203, - 1858110, 2414309, -2050847, -2747705, 906775, 412854, -16931834, -4551592, 490700, -5571647, - -4074313, 2011655, -842350, 7667591, 1378685, -6714108, 13054553, 11267310, 5126581, 4120484, - -1414655, 15569, 1587527, 1148904, -5891085, 2440078, -679142, 1195075, -3130494, 1580011, - -229244, -771484, 3799972, 798864, 501974, 1606855, -161061, 1446330, 1475858, 1056562, - -1568200, 357019, 1299228, -457414, 1035087, 966368, -406948, -951872, 916439, -1487132, - -452045, -471373, -22549, 625992, -413927, -380641, -453656, -68183, 114890, 279710, - -274341, 274341, -57445, -454193, -338229, 784905, -630286, -516470, -56371, 390842, - 467078, -179315, -104153, -246424, 238371, -246424, -20938, -207769, 55298, -374199, - -33286, 264141, -40802, -53687, -363462, 201863, - }, - { - 29704530, -11817603, 4632659, 8450348, 6938520, 229244, 2045478, 791885, 1452236, 1751273, - 4727149, -564788, -120259, -631897, 74625, 3119220, -4387846, -402653, 1154809, 3529926, - 1931125, -1811403, -661425, 2355253, 1938641, -2493229, -481036, -31675, -318364, -816581, - 2305324, 1036698, 768262, 1270774, -1679869, -144955, 75699, -1502165, 1711008, 2752537, - -471910, 663036, -832687, -2458869, -857920, 83752, 1095754, -2051921, -190589, -2132451, - 2939368, 418222, 465467, 1347009, 396748, 596464, 736587, 1445257, -49929, -227633, - -460635, 90731, 259309, -371515, 225486, 169114, 498753, 222801, -39192, 339839, - -206695, -117575, -814433, -25770, -357556, -314606, -124017, 274878, 706522, -12348, - -316754, 245887, 402116, -77846, -297963, 53687, -310848, -245887, -35433, -222265, - -264141, -88047, -178778, -31675, 51003, 206158, - }, - { - 1055488, -6589554, 4969814, -1761474, -684510, -941135, 324270, 456340, 1240709, 8053, - -1022202, -3017752, 4860829, 3586298, 3827890, -4384088, 1256815, -7325604, -7807177, 12590697, - -69256, -1074279, 2051384, 3481071, -2706903, 1813013, 2160906, 6410776, -5697274, 4031901, - -4061429, 4611721, 30602, -1078037, 2972654, 2889439, -4195646, 1518271, 133681, 3176665, - 1087164, -125091, -1644436, 89657, 592169, 106300, -844498, 1408749, 2544768, -3806952, - -1025960, 792421, 1174674, -1124745, -438624, 106837, 49929, -900869, -194884, -425739, - 1596117, -106837, -1549946, 825707, 729608, -201327, 185757, -604517, -31675, 710817, - -360240, 439697, 77846, 285078, 149787, 589484, -314606, 26844, -191663, -126165, - 261456, 192200, 311922, -88047, 194884, -111132, -415538, 430570, -75162, -300111, - -403190, -37581, -30065, 364535, -74625, 153008, - }, - { - -3096672, 21304112, 1639604, -2672544, 9241696, -3863323, 2623151, -930934, -1831804, -3226594, - 2330020, 7431367, 6067715, -6361384, -1609539, 7330436, 940598, 3380676, 1640141, -685047, - 2813204, 350040, 577673, -31675, -227633, 1615445, -944356, 962610, -37581, -949188, - -1435056, -4631586, -370441, 3944928, -1726040, 842350, 1753957, -593779, -256624, -1989107, - -217970, -357019, 66572, 181462, -1996086, -69256, -107911, -1188632, 1027034, -1331440, - -1468879, -758599, -650151, -1387811, -136902, 278636, 1040456, -1065689, 689342, -504122, - 447750, 90194, -646929, 159451, 104153, 289910, 122943, -466004, 108448, 263604, - 49929, -184684, 411243, -510564, -81604, 1161252, 661962, -268972, 136902, 329639, - -76236, 56371, 177167, -124554, -290447, 27917, 170725, -5369, 184684, -485331, - 139586, -243739, -28991, 190052, -73551, 206695, - }, - { - 290984, -35882304, -7435662, 7817914, 8085276, -982474, -807454, 329639, -4238596, -466004, - -2786360, 5137318, 4747550, 267899, -2425046, -1510218, -1855426, -6514392, -6893960, -11884711, - 2128156, -571231, -3706020, -1078574, 3914863, 723702, -11435350, 6120329, 1168768, 4154307, - -3831648, -2647311, -2318209, -429497, 1041530, 3441880, 602906, 758062, 2568927, 63351, - -63351, 382252, 834834, -3144453, -2114735, 1088774, -666257, -294742, 1576253, -358630, - -359704, 2062121, -340913, -466004, 581431, -6442, 110059, -106300, -79457, -1331440, - -1359894, -536871, -83752, 627602, -763430, 731218, -99858, 248571, -156229, -834834, - 153008, -664646, -554051, -504122, -117575, -63351, -367757, -573378, 139050, 890669, - -360240, 81068, -440234, 151934, -57445, -542777, 107911, 145492, 296353, 27917, - 310848, 90194, -28991, -15032, -11274, -123480, - }, - { - 3621194, -159454416, 1627256, 2433636, -12416750, 13092671, -4951024, -161061, 90731, -1567126, - 2195802, -894427, -1455994, 8123394, -8127689, 457951, -2035278, 2221572, -3254512, -2019172, - 10151692, -874563, 1102733, 31139, -1816771, 971200, 30602, 2285460, 2529736, 987306, - 410706, 153545, 296890, -742493, -3336653, -389231, -2487860, -3495030, 665183, -1725503, - 1901060, -204011, -2927020, 636192, -2451353, -341450, -733903, -282394, -1247688, -1883880, - 1653026, 1539746, -940598, 1176821, -375810, 879395, 173946, 32749, -301721, -711354, - -28454, -340376, 788127, 565325, -261456, 134218, -803696, 359704, 495532, 513785, - -79457, -505196, -360240, 60130, -594853, -599148, -616328, 22012, 279710, 117038, - 187368, -35433, 191126, 18790, -330712, -178241, -310848, 200253, 172872, 270046, - 82141, 39192, -147103, 138513, 126702, -114890, - }, - { - 1461900, -23519778, 1584306, 7801271, -3274913, 331249, -308701, -2182380, 334471, 3248069, - -3049427, 2767570, -818728, -3970161, -514322, 4832912, -5920076, 5893232, -5236639, 8052527, - -1985349, -2741263, 1132798, -1444720, -3967476, -2240899, -4401268, -9269613, 4263292, -3532611, - -1402844, -2995740, -3386582, -2263448, 555125, 2275796, 2765959, 7107097, -716186, 1619740, - 2583423, 5770826, 66035, -797790, -523449, -914828, -2843805, 19327, 789737, -100395, - 2152852, 245887, 2728378, -1653562, -122943, -1613297, -207769, 1213328, -11811, 328565, - 696858, -89121, -833761, 248034, 70867, 709743, -445066, 1038845, -761283, 76236, - 1277753, -77846, -67646, 364535, 57982, 14496, 229781, -131533, 547608, -420907, - -58519, -95563, -316217, 181999, -9127, -45634, 48855, 35433, 56908, -62814, - 404264, 145492, -310311, 228707, 267362, 166430, - }, - { - -40837084, -94333048, -2284923, -2640868, -349503, 8997420, -8059506, 2937758, -244813, -10627360, - -11349988, -12348, -1755568, 140123, -7822746, 332860, -7186554, 2607582, 3896072, -2187212, - 5157719, -2217277, 4013647, -2335925, 2261837, -3486440, 560493, 4447439, -3894999, 3390877, - 833224, 1846299, -572841, 2684355, -311922, 3966402, -3694209, -963146, -855772, -3428458, - 858993, 976568, 1287953, 4283156, -2018098, -3626563, -1439888, 1436130, 904628, 285615, - -2101850, -486942, -539018, -2385854, 145492, -2784213, 221728, -1125281, 146566, 557809, - 440771, 44023, -2684, 45634, 62277, 212064, -459562, 809064, 863825, 245350, - 245350, -238908, 268972, 27380, 683974, -89121, 419296, 215822, -4832, 42413, - -109522, -173946, 635118, 134218, -320512, 519691, -163746, -125628, 32749, -214748, - -180926, -423591, -27380, -303332, 61740, 84826, - }, - { - 1194538, -35817880, -8935679, -31675, 6197101, 2958159, -722091, -1422171, 796716, -447213, - -4713727, -1132261, -4303557, -10081899, 35818952, -2501282, -1503239, 1379758, 4393215, -2784213, - -8400956, -1852742, 5017596, 3884798, -1721208, 6033892, 5434208, 6860137, -3783866, 1970853, - 2557653, 174483, 6270116, 3743601, 2147, 934692, -168577, 1977296, -22549, -129386, - 3187940, 1341640, -120259, 1309428, -2343979, 835371, 1657321, -844498, -1506460, 1152662, - -1034013, -1839320, -692564, -106837, -763430, -178778, 133681, 1496259, 1317481, -304943, - -295816, -756988, 357019, -427349, -368293, 1721208, -146566, 165356, -314606, -481036, - -302258, 680752, 905701, -499290, -491237, -325881, 143345, -129386, -266288, -398358, - -156766, -316754, -290984, -444529, -135291, -225486, -267362, -38655, 51003, -283468, - 37581, -287763, 53150, 137976, 23085, -201327, - }, - { - -9782325, -110027936, -6330245, -12964359, -819265, -7437810, -2662343, 7006703, 548145, 1463510, - 7188702, -15032, -935229, -4689031, 8555575, 540629, 732292, 959388, 4660040, -4131759, - 7302518, 2201171, -3837553, 623844, 4354023, -6063420, -3582540, 674847, 5020817, 402116, - 585726, -3273839, 4422206, -930934, -5156645, -2536715, 379568, -2738042, 590558, -1596654, - -760209, 2438468, 1705639, 207232, 163209, -1359357, 1563905, -701153, -755377, 732829, - -251792, -2435783, -453656, -661962, -1155883, -614717, 493921, -894427, 389768, 1142998, - 1962800, 972273, -91268, 49929, 474594, 678068, -124017, -199716, 257698, -614717, - 496069, 350577, -35433, 294205, -252866, 770947, 206695, 442919, 514322, -301185, - 205085, 401043, -23085, -299574, 179852, 11274, 204548, 102005, 135291, 644782, - -122943, 181999, 78920, -234613, -83752, -70330, - }, - }, - { - { - -1607928, -40409200, -1836099, 7229504, 932545, 467078, 518080, 1633161, -1840394, 8545374, - -357019, -5300527, -5204427, 7794292, 6892349, 4936528, 5046050, -3111704, 1615982, -377420, - 1078574, 8412767, 6131066, -695785, -2669859, -7260642, 1107565, -4861366, -1544041, -8825084, - -1669132, 1820529, -1016297, -483721, -1452236, 3962107, -1195075, -2062121, -3526168, -598611, - -170725, 4134443, 433255, 3275450, 2601140, -1067299, -151934, 722628, -3600793, 1597191, - 2725694, -521839, -8053, -259846, -695785, 230318, 202400, 1422171, -2016487, -649614, - 649614, -615791, -547608, 12348, 904091, -154619, -588947, -848793, -671626, 810138, - 696858, -1074279, 754841, 693637, -17180, -84289, -537, -34897, 14496, 297427, - -746251, 101469, -170188, 382252, -434329, -156229, -285078, -115964, -28454, 234613, - 216896, -42950, -176094, -233539, 85899, 288300, - }, - { - -10261214, -5956046, -9643275, 18791018, 3143379, -103616, -2391760, 2427730, -3870839, 666794, - -2085744, 4592394, 4932233, 5129265, 2516314, -2036351, -5767068, -1999307, 2604361, -3374234, - -4071629, -4828617, -992674, 955093, -2960306, 5638219, -1568737, 2611340, 2400887, -791885, - 2434173, -2972654, 1588601, -600759, -589484, 3032784, -3961571, -548682, -2790118, -1896765, - -1581085, -925565, 396748, -2645700, 379031, 170725, 2217277, 2756295, 1276679, 416612, - -397284, -251792, -1123134, -81604, 986769, -994285, 963146, -181999, -913754, -1534914, - -614180, -496069, 597537, -205622, 528281, 1043677, -250182, 125091, 341987, -759136, - 238908, 667867, 454730, -169651, 52076, -197032, -107911, 489089, -713501, -155156, - -416612, 444529, -149787, -308701, 297427, -273267, -29528, 168041, -53150, -62814, - 245887, -115427, -17180, -128312, 54761, 87510, - }, - { - 5669894, 54562728, -19866372, -14513231, 29465624, -2085207, 1864553, 2172717, 69256, -973347, - -6455873, 2923799, 1404991, 14865419, -769336, -2439542, -8040179, -9227737, 3614215, -3531000, - -2777770, -4218732, 8356933, 5002563, 4469451, -429497, -2405182, 1429150, -2279554, 1032403, - 1663226, -12885, 557809, -304943, -3412352, -820876, -2239826, -2246805, 507880, 20938, - -1041530, -2777770, 1945083, -735513, -451508, -355945, -504122, -362925, 2806224, 593242, - 1486596, 117038, -1995549, -596464, -534723, 1440425, 570157, -230854, 685047, 1472100, - -724239, 691490, 625992, -3758, 150324, 503048, -449898, -409096, -119185, -481573, - 63351, 365072, 613643, 89121, -175557, 379568, 8590, -365609, -657667, -143345, - -164819, 10737, -171799, 39192, 358093, 392990, -293668, 92342, -81604, 107911, - -387621, -340376, 33823, 37581, -42413, 421981, - }, - { - -1928977, -21954262, 4139275, -337692, 551903, -567473, -1043140, 71941, -1138166, -430034, - 5119601, 1379758, 1302449, -983548, -12820477, -4500052, 9601936, -7996692, 6875706, 1945083, - -7072201, 63888, 2621541, 4435628, -4556424, -1235877, -4085588, 208843, -1193464, -3041374, - 2443837, 3007014, 453119, -3433826, -1286343, -4011500, -3022046, -5232344, -357556, -3189550, - 147103, -2335389, 870268, 1900523, 555125, -1493575, -670552, 343597, -212601, -485331, - 775242, -484794, -716723, 315143, 84826, 1187559, 589484, 676457, 22012, -1149441, - -264141, -971736, 643708, -56908, 278636, 495532, -760746, 612570, -638876, -625455, - -35970, -186831, -872415, -217970, -34360, 42950, -265751, -49392, 662499, 46708, - 117575, -198642, 32212, 183610, -2684, 38118, 105227, 30602, 53150, 325881, - -111132, 72478, 144418, 77309, -104690, -158377, - }, - { - -27893128, -70605504, 1408749, -31562640, -2076080, -3776350, -2472291, -2254321, -4959077, 4099546, - -2262911, 488016, -7150047, -4499515, 6134824, -1000727, -1057099, -2196339, 12575127, -6117107, - -1669132, 1997160, -3767223, 6659884, -2122251, -1893544, -4430259, -6092948, -3291019, -52613, - -4475356, 1568200, 2333778, 751082, 1182727, 2552284, -3974455, -4022774, 2362769, -1003949, - -395137, -978179, 1948841, 887985, -1013075, -1533303, 1708860, 66572, -1571958, 1251983, - -328028, 1429150, -1055488, -755914, -1301912, 590558, 1014149, 103616, -19864, 57982, - -406411, 381178, 1253594, 816581, 226023, 183610, -434865, 351650, -100395, 130460, - 902480, -146566, 115964, -356482, 408022, -26844, -639413, 255014, 415001, -123480, - -12885, 138513, 319975, -242666, 368293, -258235, -163746, 372588, 65498, 64961, - 171799, 44560, -90731, 308164, 5369, 37044, - }, - { - -197569, -8171712, -3875671, 1066763, -1452773, 250719, -26844, 683437, 304943, 2120640, - 4398047, 360777, 530428, -3965329, -12045236, -2645163, -3842385, 3987877, -3288871, 1931662, - 8505109, -517544, -8344048, 1312113, -1704565, -10797011, 941135, 4333622, 2968896, 4297115, - -1923609, 3039763, 2709051, 2757906, 188979, 5234492, -2663417, -316217, -2918430, 1971390, - -2399813, -2748779, 521302, -865436, -221191, 1478006, 1736777, 1110786, -403190, -265214, - -830002, 1324461, 1835025, 411780, 950798, 221728, -707596, -204548, 1963874, -1370632, - -26844, -104153, 13959, 483184, 44023, 757525, 18790, 324807, -239981, -133144, - -4295, 472983, 253940, -380105, -533113, 624918, -575526, -259846, 110595, 690416, - 138513, 99321, 127238, -11811, 140660, -88047, 334471, -148713, 205622, -94489, - 81068, 83215, -48855, 231928, -51003, 193810, - }, - { - -30288646, -119527864, -8674760, -4484483, -10585484, 491237, -1466195, -2779918, -306553, -6829535, - -1029182, -1141388, 1615445, 956167, 1531693, 4951561, -2887829, -863825, -594316, -1982664, - -1283122, -210453, -2376191, -6046777, -3546569, -2491618, 909459, 4225711, -712965, -1447941, - 2748779, -2113124, -1096827, 238908, -2421288, -1338956, 729608, -3063922, -1454383, 4136591, - -476741, -769873, -668941, -1372779, 666257, 944893, -241055, -2410014, -125628, -2840584, - 734439, 160524, 1297080, 1894081, 233002, 344671, 57445, 1037235, 927713, 747861, - -111669, -1689533, -1335198, -344671, 323733, 155156, 176094, 47782, -125628, -57445, - -472446, -408022, -897648, 59056, -69256, -409633, -417686, 151398, 467078, -170188, - -670552, 23622, 310848, -38655, -250719, -57982, -81604, 240518, 625992, 164819, - -191663, 163209, 54224, -71941, -149250, 221191, - }, - { - -42950, -12017855, 3448322, -955630, 2383707, 692027, 302258, -990527, -113280, 584116, - 1607928, 293132, 4280472, -1073205, 466004, 6063420, 8696235, -4838281, -7381438, 15458661, - -5057324, -6600828, -479426, 1016297, -3980361, -912144, -10652056, -4226248, -10603737, -1055488, - -5366025, 2812130, -1741072, -4250407, -3928821, -2263985, -2776160, 3197066, 585189, 643171, - 258235, 1443109, -2226404, 407485, 1869385, 1216550, -2488397, -585189, 2080375, -2778307, - 571768, 979253, 2178622, -383326, -850404, -216359, 602906, -451508, 990527, -3758, - 2336462, 653372, -2080375, -188442, -134755, -217970, 699006, -619549, -374736, 403727, - -182536, -163209, 128312, 645856, 122943, 664646, 11274, 100395, -420370, -192737, - 219043, -287763, 203474, -2147, -13422, -75699, -365072, 690953, 150861, 51540, - -54224, -311385, -314069, 19327, -414464, -46171, - }, - { - -17554068, 13110925, 13282723, -19981798, -11212012, -3862249, 696322, -4027069, -2956011, -6811282, - 1380832, 6240588, -3504693, -10696616, 4690105, 7923141, 1343788, 4841502, -3648575, -5167383, - -2176475, -496069, -1453846, -472446, 32212, 1097364, 105764, 1130113, 419833, 41339, - 1640141, 1012002, 2898029, 3481071, -2440078, 3584687, 4087198, -1403381, 1300301, 1504312, - 1918777, 1234803, 2742337, 2792266, 408022, 497679, 1545115, 762357, -620086, -1382980, - -1644436, -1162862, 743566, 402116, 441308, -266288, -270046, -898722, 1183800, -88584, - 389231, 343597, -978179, -429497, -29528, -73551, 519691, -39728, -166430, 565325, - 510027, -416075, 9664, -767725, -1061931, 206158, 71404, -350040, -130997, -41339, - -203474, -18254, 210453, -55298, -139050, 64425, 185220, 187905, 264141, -340376, - 157840, -276489, -143345, 70867, 230854, 97174, - }, - { - -897648, -39274792, -1880122, 15305116, 3986267, 4013647, 11191611, 738198, -3007551, 1746441, - 4831838, 7915088, 6099391, -1729798, -3599720, 6298570, -2391760, -9389335, 860604, 1786170, - 2595234, 2029372, 373125, 3418257, 7221988, -32749, -12421045, 8268349, 4184909, 6578816, - -2786360, -2690260, -390305, -1059783, -3212099, 4295, -5435281, -3648038, 2174327, 20401, - 112743, 941135, 1243393, -2828236, -1634235, 3288871, -767725, -1661079, 1170379, -48855, - -636729, 1655173, -1472100, 394600, 991601, 1611, -814433, -599148, 585726, 155693, - 546535, 846645, 163746, -418759, -1461363, 145492, -1188632, -472446, 327491, -235686, - 159451, -27917, -16643, -227096, 324270, 394063, 183073, -68183, 195958, 1216013, - -226560, 15032, -277562, 154082, 0, -358630, 68183, -158914, 110595, 192200, - 627602, -221191, -341987, -45634, 51003, 112743, - }, - { - -3083250, -179193008, -7250979, 11422466, -2091649, 6444062, -3240553, -176631, -4408784, -2023467, - 948114, 628676, 992137, 5777805, -10785737, 2029909, -2544768, -1635846, -2185602, -5928666, - 5991480, -1989107, 3408594, 1151051, -2253247, 22549, -1349157, -2837363, -3245922, -2559801, - -3072512, -3624953, 143881, -985158, -4064650, 1037772, 190589, -1523103, 1191853, -2238752, - 984084, 2434710, -248571, 2172180, -3330747, -1100585, -142808, 1619203, 304406, -82678, - 1716376, 56908, -55835, 1950452, -434329, -388695, -87510, 778463, 802085, 253940, - -408022, -865973, 689879, 185220, -581968, -197569, -1262184, 578210, -126702, 141197, - -274341, -599685, -416612, 223875, 241055, 169651, -162672, 170725, 147640, -4832, - -25233, 23085, 369904, 19327, -164283, -239981, -35970, 5369, 77309, 15032, - -355945, 159451, 85899, 163209, 24159, -147103, - }, - { - -1561221, -6976638, 19459960, 10742787, -1926830, 294205, -4078608, -4020090, -2775086, 143881, - -5034776, 2529736, 3497714, 4619238, 6666863, 9842991, -1119376, 10672994, -5405753, 10399190, - -2193118, -2624225, 5026186, 1687922, 6401649, 1801202, -2958159, -7139310, 1878511, -4254702, - 5829881, -1292785, 108985, -2248416, -2573222, 609885, 244276, 3387119, 2204929, 2770791, - -494458, 2658585, 1466195, 406948, 434329, -143881, -57982, 2225330, 12348, -28991, - 1624571, -1213865, 2582349, -582505, 578210, 353798, 682363, 774168, -70330, 692027, - 256087, 688805, 73014, 45634, -822486, -215285, -1019518, 637803, -683974, -294742, - 678068, -58519, -284542, -355409, -49929, -171262, -205622, 99321, 955093, 134755, - 250719, -81068, -204011, 109522, 19864, 312996, 178241, -185220, 46708, 176631, - 395674, 82678, -349503, 42413, 121333, 18254, - }, - { - 41732048, -2557116, -13588740, 14862197, -5632313, 4642323, -971736, 4846871, 4096862, -1456531, - 233539, 9498857, -134218, 7406671, 325344, 1263257, -12543452, -3710852, 3475702, -971736, - 5568425, -3062849, 5966247, -331249, 1282585, -3945464, 919660, 8250096, -1869921, 1098438, - 4124242, 5140002, -666794, 1677185, 289910, 5804112, 873489, 1094143, -1042066, -2661269, - -857920, 1409286, 1086627, 4530117, 650688, -335544, -1403381, 1244467, 209917, 1104344, - -2106682, -533113, -1211718, -2722473, 2473364, -851477, 12348, -1253057, -142808, -610959, - -871878, 60666, 173409, 488016, 790274, 492311, -1006096, -147640, -200790, 215822, - 343597, -573378, -653909, -107374, 525597, -302258, 338229, -41339, -46171, 114354, - 201863, -269509, -87510, -250719, -447213, 463856, -306016, -427886, -144955, 96637, - 108985, -590021, 112206, 283468, 266825, 192737, - }, - { - -1334661, -20770998, 7896298, -274878, 1999307, 3721589, 6236830, 2418067, 1796907, 2279554, - 16643, -2719251, -5784784, -14318884, 18434000, -2708514, 5696201, 7053947, 4431333, -2908767, - -3629784, 616328, 4958540, 4250407, -3626563, 3920232, 2012729, 5526549, 1936493, 813896, - 1934883, -1094680, 2366527, 265214, -4268661, -1211181, -2782602, 671626, 1777043, 1754494, - 821413, -1883343, -2455648, -19327, -2335389, -779537, -1878511, -1243930, -113280, 1609539, - -367220, 325344, -752156, 25770, -329102, -299574, -784368, -569620, 111669, -1122060, - -1401770, -379568, 523986, -438624, -747324, 1194001, -1134945, -175020, -30065, -47245, - 316217, 270583, 294205, 104153, 49392, -378494, 184147, -420370, 196495, -64961, - -343061, 127238, -46171, -415001, 178778, -15569, -120796, -173409, -20938, -391379, - -201863, -344671, 149250, 33823, -222801, -223338, - }, - { - 22638236, -63776508, -5143760, -8619999, 3096672, -7605314, -2510945, 3610457, -2092186, 2505040, - 8288213, -509491, -4354560, -6728067, 7951595, 220117, -5643587, -5245229, 8023536, 802622, - 3183645, -754304, -749472, -1213328, 6619082, 918049, -77309, -3578782, 2099165, 1207960, - 2536715, 2525978, 5608691, -2954401, -7021198, -2900177, -1599339, -3626026, 3761318, -217970, - -960462, 3512747, 846109, -137976, -209380, -1523640, 2888366, 264677, -1249836, 798864, - -1767916, -2331094, 1238561, 1078037, 700617, 232465, -42413, -1540283, 718870, 693637, - 399432, 588411, -571768, -935229, 30065, 860067, 37581, 45097, 200790, -220117, - 892279, 107374, 448824, 1340567, 211527, 624918, -196495, 225486, 114354, -352724, - 157840, 281320, 375273, 30602, 64425, -592706, -253940, -293668, 40802, 357556, - -40802, 409096, 190589, -80531, -139050, -280247, - }, - }, - { - { - 1856500, -46577848, -3591667, 10795400, 2536178, -566936, -965294, -466004, 4356708, 6533182, - -992137, 2485712, -6726993, 1542430, 12646531, 7843147, -431107, 2793876, 910533, -12041478, - 3928821, 10994579, 172336, 10820633, -8484708, -4611185, -1976222, -952946, -9387188, -3451543, - 4605279, -345745, 118112, -3710315, -3257196, 3588445, 380105, -4420058, 33286, -1244467, - 812823, 2872260, 1159104, 2624762, 1326071, 2013266, -707059, -1298154, -1873680, -980863, - 3013993, 596464, 47782, -728534, 450972, -826781, 262530, 4295, -402653, -637266, - 128849, 872952, -1795833, 399969, 852551, -976568, 195958, -896574, 4295, 85362, - 165893, -374736, 407485, 369904, 852014, -148713, -234613, -114354, 125091, 53150, - -867047, -165893, 388158, 235149, -226560, -355409, -90194, -228707, 247497, 162135, - 187905, -224949, -282931, -88584, 108985, 195958, - }, - { - 11862163, -26976690, -18371186, 21965536, -1840394, 1767916, -1474248, -782758, -4700305, 1261110, - -1179505, 5758478, 6780680, -1257352, 4762045, 1577327, -5198521, 196495, -3540664, -148713, - -9082782, 761283, -3914326, -197569, -577673, 1668058, -4295, 566936, 3836480, 314606, - -3402688, -1983738, 5972689, -2015413, -3503083, 1657321, -68719, -3588982, 82678, -4253092, - 707059, 1961726, -4472672, -1767379, 453656, 314606, 290447, 1828046, 1479616, -70867, - 552977, 1150514, -494995, -1642288, 1178969, -720481, 425739, -176631, -256624, -566399, - -586263, -341987, 541166, 52613, 364535, 638876, 177704, -75699, 376883, -413391, - 207232, 16106, 881542, -368830, -517544, 241055, -274341, -205085, -185757, -712965, - 357556, 344671, -438624, 59593, 267899, -261993, -146566, 321049, 57982, 172336, - -294205, -47782, -71404, -16106, 43487, 127775, - }, - { - -6195491, 36950676, 4690105, 25309706, 2397666, -3291019, 2495913, -1175210, 955630, -1398012, - -3488050, 3397319, -4862440, 14493904, -767725, -4303021, -1553704, -6859600, 243203, -4241817, - -199716, 712428, 7126962, -4909148, 7531225, 3456375, -4024384, 1191853, 137439, -2142652, - -47245, 4329864, -2422362, -170188, -2478733, -2444910, -4414153, 2640868, -749472, -1050120, - -993211, -1299228, 198642, -252329, 489626, -2578054, 395674, -265751, 1822140, 2071785, - -644245, 428960, -1847910, -844498, 730681, 1544041, -64961, 134218, 1080721, 430570, - 181999, 379568, 1324461, 384936, -379568, -175557, 104690, -642098, -143345, -622770, - 343061, 285615, -125628, 585726, 236760, 268435, -12885, -4295, -1131724, -32749, - -146566, -58519, -98247, 159451, 218506, 70330, 10737, -334471, 208306, -186294, - -132070, -183073, -15569, 36507, 61740, 236223, - }, - { - 2400887, -7164543, -9727564, -441845, 239444, -535260, -900869, -988379, 96637, -261456, - 3877282, 1742683, 2095407, 7195681, -19356344, -4770098, -3966402, 4401805, -167504, 5976447, - -5507222, 703838, -230318, 3302293, -493384, -2443837, -4238059, 2743410, -573378, -2126546, - 5055714, -3558917, 1902671, -280784, -3364033, -4072166, -3655017, -1014149, -2968896, -1404454, - -579821, -1042066, 818728, 303869, 213138, -1708860, 1036161, -1029182, 6442, 118648, - 295816, -1276142, 1115081, -14496, -476205, 915365, 902480, 324807, 619549, -1255204, - -874026, 329639, -156229, -603443, 697932, 207232, 431107, 14496, -876173, 648003, - -934155, -499290, -359704, 64425, -278099, 1611, -118648, 75699, 351650, 466541, - -36507, -22549, -74088, 432181, 94489, 66572, -92342, 98784, 5369, 214748, - 88047, 89121, 147640, 154082, -63888, -56371, - }, - { - 30415884, -133366248, -13617731, -23576686, -2143189, -3431142, -4269735, -1974074, -5785858, 249108, - 5945846, -3400540, -8262980, 4713190, -461172, -2331094, 1075889, -8062728, 6470368, -835908, - 2132451, -2830384, 4333085, 2178622, 1151588, -8696772, -4005057, -2774549, -3164317, 1747515, - -2909840, -2316061, 415538, 3366718, 373662, 2769717, -8732205, 363462, 1233193, -1778653, - -263067, 1720134, -2236604, 2564632, -676457, -60130, 1063541, 211527, -1985349, 457414, - 1950452, 470299, -692027, -1019518, -2265059, 787053, 1369021, -581431, 780073, -1046361, - 95563, 369904, 481573, 456877, 861141, 10737, -314069, 510027, 151398, -1074, - -67646, 271657, -501974, 281857, 334471, 79994, -151398, 308164, 76773, -290447, - 628676, 426812, -473520, -26307, -28991, 200790, -47782, 125628, 45097, -314606, - 517007, 89657, -207769, 151398, -114354, 108448, - }, - { - -674847, -16555488, 7048042, -2349347, -1350230, 171262, -18254, 1004486, 657130, 1085553, - 5416491, 785979, -2983929, -4048007, -10258529, -3451006, 3069291, 3687230, -817654, -1334661, - 3816615, 1157494, -3325915, 2588255, -12935905, -959388, -3332895, 1789928, -490163, 9846749, - -3672197, 3350075, -880468, 984084, 2386928, 5181878, 318364, -412854, -3336116, 1305133, - -285615, -1590212, -1523640, -505196, 659278, 635655, 2694018, -552440, -564251, -221728, - 42950, 1353452, 1105417, 406948, 1540820, 195958, -1792075, 1376537, 532576, -1313186, - -729608, 1050656, 246424, -415001, -3221, 889058, 272730, 397821, -354872, 481036, - 26307, -406411, 898185, -21475, 126702, -328565, -277025, 309775, -331249, 733366, - 73014, 147640, 35433, 237297, -193274, -53150, 256087, 105227, 410706, -53687, - -210453, 237297, 103616, -74088, -67109, 157303, - }, - { - 15830176, -206453712, -3143379, -9833328, 1131724, 870805, 995359, -3258270, -383326, -10298795, - -2799782, -2553895, 6860674, 716723, 1544578, 45634, 4925254, -4108136, 1705639, -4358318, - -3000035, 484794, -2778844, -6118718, -6356015, -2292439, 1938104, 4398584, 1628866, -56908, - 1671279, -856309, -1676111, -970663, -1476932, -2495376, 265751, -1672890, -851477, 2211371, - 286689, 528818, -1790465, -1177358, -937377, 2968896, -3488587, -867583, -581968, -432718, - -1567663, 687195, 1397475, 1030792, 1088774, -74625, 834834, 940061, 1306744, 474594, - 628139, -1488743, -1700270, 579821, -713501, 568546, 166967, -216359, 33286, -509491, - -31675, -979253, -635118, 206158, -116501, -222265, -428960, 13959, 191126, -173409, - -385473, 217433, 207769, 197569, -264677, -414464, 316217, -23622, 576599, 244276, - 146029, 123480, 197569, -243203, -2684, 62814, - }, - { - -1205812, 1096827, -6506339, 2956548, 2338610, 772557, -1078037, -266288, -141734, 326954, - -1588601, 1836099, 2327336, 3713536, -3472481, 8854075, -1862942, 921807, -4262218, 8388071, - -9198209, 5140539, -7723962, 2016487, 2411087, -8501888, -9030169, -11953431, -1187022, -2719251, - -3449933, -675921, -4694400, -484794, -4811974, -6445136, 467078, -272730, 1783485, 611496, - 2032593, -1986959, -561030, 2067490, -1690607, 347355, 63888, -2147484, 842350, 202400, - 362925, 1680406, -154082, 243203, 204011, -1289027, 1944010, 505732, 501974, 464930, - 1485522, 463320, -1720671, -600222, -104690, 18790, 208306, -257698, 99321, -799401, - 542777, -758062, 817118, 619012, 218506, 622233, -186831, 7516, -235149, 98247, - -27917, -444529, 23085, 203474, -27380, 31139, -55298, 268972, -39192, 415538, - -75699, -383326, -102542, -107911, -329102, -135828, - }, - { - 34932580, -7405598, -35992364, -20852066, -3346317, 239981, 1691680, -5998459, -2556043, -1794760, - -2036351, -2203855, -1195612, -5335423, 4811974, -748935, 1041530, 5792837, -4607963, -1461900, - -2689723, -2805151, -3506304, 949725, 2757906, -615254, 693100, 1786706, -234076, 186294, - 2162516, 4784594, 1801202, 1915555, -1933809, 770410, 5442798, 2370822, -1095754, 568009, - 2724083, 2270964, 3910031, 741956, 2061047, -727997, 1611687, 75699, -472446, 504122, - -1195612, -1846836, 11274, 1170916, 494995, -539555, -2202245, 279710, 596464, 81604, - -20401, 824097, -732292, -120259, -719944, -935229, 275952, 601295, -295816, 343061, - 945967, -159451, -706522, -73014, -481036, -982474, -129386, 257698, -306016, -257161, - 68719, 2684, -14496, -345745, 122943, -208843, 416612, 307090, -330176, 287226, - -132070, -197569, -230318, 188979, 264141, 158377, - }, - { - 1495722, -28375238, -1420560, 1213328, 4613332, 7703024, 11104101, -2771328, 7516, -2014340, - 7561290, 5666673, 5013301, 3437048, -3456912, 2566780, -3104725, 3002719, 1061394, -220654, - -9515500, 9813463, 1900523, 8878234, 8230768, -3848828, -5669357, 73551, 6774237, 1125818, - -983011, 1482301, -1364726, -67646, -1023813, 943282, -7229504, -3413962, 442382, 1125818, - -389768, 468688, -536334, -2074469, 498216, 2615098, 535797, -1880122, -1174137, 809601, - 549219, 1638530, -592169, 1175210, -1606318, 622233, -2296197, 519154, 464930, 667331, - 988379, 776852, 164819, -663572, -1234266, -556735, -262530, -183073, -176631, 62277, - -47245, 122943, 302795, -192737, 492311, 572304, -552977, 385473, -63351, 794032, - 93952, -1611, 62814, -65498, -89121, -18790, -372588, 135828, -248034, 478352, - 519154, -63351, -265214, -315143, 206158, 478352, - }, - { - 3061775, -165264432, -20710332, -2149631, 18139794, -13432510, 11909944, -5130339, -5747740, -241592, - -131533, 4600984, 3038153, -4907000, -7582228, 6160057, -1475321, -893353, -3215857, -2232846, - -743029, 1162862, 1149978, 1162326, -1286880, 534723, -913754, -5097590, -3003793, -1729798, - -1811403, -4524211, 2182917, -3787088, -132607, -836445, -1583769, 2705830, -1472637, 629750, - 289373, 991601, 358630, 1141924, -1824287, -295816, -578747, 1704028, 357556, 1138703, - -231928, 202937, 836982, 745177, -448287, -1568737, 579284, 893353, 40265, 1229434, - -281857, -820339, -16643, 617402, 234076, -1239635, -545998, -159988, -290984, 6442, - -289373, -122407, -777389, 294205, 438624, 476205, -66035, -207232, 118112, 169651, - -60666, 228707, 199179, 25770, -66572, -521302, 192737, 103079, 238371, -229781, - -202937, 142271, -42413, 181999, -117038, 68183, - }, - { - 1724966, 15131707, -4285841, 4627828, 4651450, 1421097, -3511136, -4954782, -2182917, -1384590, - -6338298, 1865090, 610959, 18521510, 6381248, -586263, 7282117, 5400385, 2679523, 3269007, - -1920387, -2039036, 5332739, 1285806, 6373732, 5310190, -7290707, -1420024, -1370095, -3754338, - 5895380, -1336809, -1095217, -1828046, -1670742, -2363843, -1533303, 2734821, 4598300, 3052111, - 186831, -609349, 2558190, 1248225, 603443, -1281511, 1197222, 1627793, -527744, 1479079, - 250182, -148713, 367220, 1496259, -787053, 2669859, -166967, -1127429, 234613, 735513, - 441845, 820339, 1098438, -1258425, -905701, -421444, -410706, 226023, -301721, -24159, - -918586, 612570, 193274, -882616, 20401, 123480, 245350, 7516, 839129, 220117, - 296353, -119185, -277562, 157840, -379568, 310848, 321586, -376347, -98784, 108985, - 217433, 75699, 25770, -231928, 139050, 33286, - }, - { - -26722212, 85241144, -3624416, 1995012, 3424163, -224949, -1922535, 8348880, 1156420, -197569, - 5619428, 7012608, -3006477, 15575699, -4115653, 375273, -5374615, -6556805, 3824132, -1573032, - -140660, -1497870, 8116952, 2815888, -5250598, -2833605, 1091995, 5920076, 1823214, -3962107, - 5858873, 2589865, 2004139, 2534031, 3923453, -809064, 2698313, 3344706, -4306779, 1155346, - -2507187, 792421, 1249299, 3186329, 1176821, -12885, -1360968, -498216, 524523, 2269890, - -1904281, -94489, -2267743, -51003, 164819, 1774895, -1929514, -982474, 1611, -30602, - -1195612, 787590, -537408, 301721, 545998, 382789, -1175747, 61203, -920197, 301721, - 614180, -456877, -814433, 369367, 26844, -191663, 520765, -637266, 159451, 665183, - -374736, -377957, -114354, 31139, -550293, -65498, -111669, -370978, -49392, 143345, - -253403, -382789, 131533, 312996, 60130, 349503, - }, - { - 1520955, -12122545, -2691871, 4753992, 678068, 992674, 7110319, 3303367, 3111704, -1514513, - 3396782, -6202470, -3117610, 19756850, -32734094, 1743757, 10082436, 4544613, 1124745, 3163780, - -7020124, 9764071, -967441, 5553393, -1195612, 1337346, 3432753, 2119030, 2028298, -1833414, - 2663417, 1141924, -2690797, -235686, -2717104, -3553549, 5906, -1353452, 2610266, -154082, - 123480, -374736, -2525441, -1920387, -351650, -861141, -1205275, -2514167, 2420751, 880468, - -300648, 1380832, -1342714, -870805, 188442, -20938, -149250, -1613834, -16643, -1464047, - -682900, 1029718, 275415, -828392, -645319, 321049, -325881, -255014, 279710, -412854, - 471910, 138513, -411243, -17180, 606664, 352724, -370441, 55298, -637803, 173946, - 200790, -275415, 29528, -47782, -330712, 122407, -31139, -173409, -84826, -135291, - -308164, -48318, -118112, 124017, -265214, -158914, - }, - { - -24178518, 304406, -1907502, -6918656, -1978369, -1709934, 867583, 1151588, 162135, 1224066, - 7511361, 32749, -4090956, 11307575, -18636400, 453119, -9987946, 2660195, 8471823, 2838437, - -4405563, -612570, -802622, 652835, 2309619, 564788, 4970351, -5012764, 1239635, 100395, - 4071629, 4886599, 718870, -2674691, -5400922, -3415573, -2806224, -579821, 947577, 1562831, - -944356, 3830037, -521839, 1054951, -795643, 25233, 805843, 39728, -1022202, -915365, - -1567663, -41876, 1104880, 905701, 811749, -718870, -239444, -595927, -250182, 834297, - -178778, 730681, -297427, -932545, -428960, 510027, 160524, 244813, 88584, -158914, - 642098, 471910, 365609, 619549, 632971, 309775, -215822, -83752, -67646, -114354, - 520228, -241055, 352187, 20401, 119185, -116501, -481036, -428960, -175557, 125091, - 178778, 175557, 187905, 151398, -315143, -228707, - }, - }, - { - { - -548145, -18871550, 16725676, 4978404, 380641, 729608, -173409, -392453, 2940979, 2739116, - -5283347, 1411434, -4895726, -463856, 8810052, 3452617, -570694, 9175661, 2799782, -18403934, - -1972464, 2258079, -7975218, -54761, -10519449, 1910187, -439697, 3799972, -2445447, 1166621, - 6207839, 3372086, -1039382, -4096325, -1373853, 3875671, 2225330, -3080565, 574452, 123480, - 365609, 578747, -481573, 1245541, 1996623, 2284386, -655519, 1124745, 2044404, -1419487, - 1156420, -467615, -518080, -1391033, 246961, -625992, -362925, -463320, -229244, -1296543, - -528818, 1665374, -1098438, 481036, 683974, -572841, 764504, 477815, 627065, -10737, - 39192, -100395, 442382, 11811, 792958, 129923, 128312, 100932, -15569, -92879, - -478352, 69256, 396211, 123480, -293668, -182536, 84826, 120259, 340376, -150861, - 28454, -175020, -38655, 28454, -21475, 185220, - }, - { - -8821863, 23973434, 40948756, 12319040, -6004901, 1240709, -2360085, -238908, -1171452, 1513439, - -4648229, 3955128, 4583804, -4027606, 2524367, 5267778, 160524, -1498407, -5534066, 4129074, - -6427956, 6764037, -109522, -2325725, -868120, 2234994, 2100776, -243203, 396211, -1543504, - -4378719, -2923262, 1656247, -3117073, -1897839, 278099, 1699196, -2008434, 4891431, -1043677, - -1268626, 566936, -3272765, -394600, 456877, 0, -1414655, -1679869, -185757, 168041, - 1424319, 1761474, -1335198, -1905355, 1028108, -476741, 182536, -1079647, 770410, 129386, - 621160, 616328, 630823, 71404, 62277, 605590, 397284, 26844, 689342, 210990, - 258235, -865436, 167504, -440771, -486405, -15032, -527207, 28991, 156766, -445603, - 168041, 212601, -169651, 316217, 234613, -156766, 67109, 149787, 82141, 268972, - -241592, -53687, -168577, -114354, -41339, -8053, - }, - { - 5093295, -8724152, -36126580, 27521076, -554588, -2389613, 710817, -3716757, -151398, 2289218, - -152471, 3983582, -3183108, 12541305, -1695438, -511638, 7599408, -3346317, -4998268, -4189204, - 938987, 2347200, 7186554, -9153112, 3285650, 1663763, -1560147, 2378875, -407485, -3622805, - -1567663, 1747515, -5136244, 434865, -1030255, -253403, -1794223, 2378875, -1168768, -26844, - 2825552, 1004486, -729608, -1520418, 1080184, -2447595, 1829119, 1484985, 875100, -356482, - -2294050, 1306207, -1087701, -1544578, 1301375, 2199560, -507343, -830002, 395137, -405874, - -205085, -629750, 328028, 506269, 27380, -185757, 220654, -78920, 92879, -852551, - 42950, 3221, -438087, 19864, -124554, 297427, -42413, 412854, -511101, 115964, - 3221, 314606, -75699, -251256, -74088, -244276, -296353, -345208, 328565, -40802, - 159451, -79457, 102005, 125628, -234613, -288300, - }, - { - -2161442, 10118943, 7135015, 5369, 856846, -594853, -301185, 170725, 337692, -864899, - 4690105, -708133, -1098975, 7650411, -14299020, 790274, -1513976, 7981660, -2665564, 6918119, - -3176128, 6794639, 772557, 1607928, 5672578, 3280281, 2175938, 4549444, -742493, -2316061, - 4585415, -4781909, 3406446, 2304250, -1570884, 3289408, 1808181, 2068564, -1158031, -1261110, - 561030, -768262, 834297, 607201, 857383, -384936, 163209, -1381369, 215822, -1037772, - 370978, -622770, 153008, -998043, -541166, 234613, -433255, -434865, 90194, -605054, - 77309, 623844, -648540, -117038, 599685, -73551, 893353, 550830, -570157, 642098, - -583579, 16106, 346819, 307627, -361851, 55835, 75162, -142808, -293668, 67646, - -161598, -45097, 62814, 547071, -305480, -82141, 9127, -19864, -150861, 13959, - -5369, 29528, -82141, -56371, -70330, -9664, - }, - { - -22949620, -165896864, 25232396, -11794517, 1899449, -1007707, -1072131, -665183, -1634772, 2434173, - 3974992, -3865471, -5914707, 2092723, -288837, 2244121, -649614, -9402757, 6009733, -325344, - 1003949, -1530619, 5379447, -1339493, 5377299, -4501126, -1816234, 3791383, 379031, 2348810, - -63888, -1620813, -959388, 1128503, -43487, 2077690, -5610838, 4769561, -919123, -3143916, - 1952600, 2078227, -3380676, 1785096, 182536, 1087164, 884763, -726923, -2247342, 10201, - 864362, 799401, 574452, 1259499, -765578, 601295, 1069984, -164819, 1236951, -278099, - 355945, 449898, 108448, -925029, 312996, 11274, -819265, -604517, -731755, -132070, - -719944, 373662, -19327, 212601, 20401, 458488, 671626, 243739, 270046, -169651, - 445603, 564251, -499290, -94489, -10737, 341987, 296890, 68719, -223875, -190589, - 238908, -346282, -305480, 259846, 70330, 97174, - }, - { - 462783, -9037148, 8843875, -2370822, 4295, 255014, 196495, 596464, -1767916, -747861, - 3616363, -852551, 1085553, 5194763, 619549, 985158, 2412161, 6439230, -4310537, -6990596, - 4076461, -121870, -6589017, 6332393, 986232, 6915434, -4128537, -1108102, -4813048, 6184753, - -2889439, 1493038, -6423661, -2241436, 258235, 2778844, -161061, 267899, -674310, 1221381, - 865973, -59056, -507343, 324270, 702227, -995896, 1166084, 597000, 433255, -409096, - -183610, -307627, -284005, 539555, 515396, -373125, -2149094, 350040, -564788, -839666, - -640487, 652298, -60666, -463856, -362925, 345745, 433255, 419296, -689879, 617402, - 388158, -791348, 579284, 399969, 616328, -227096, 7516, 45097, -547608, 37044, - -128312, 271120, -84289, 130997, -65498, -35970, 327491, 114890, 202400, -51003, - -284005, 12885, 2684, -17717, -139050, 61203, - }, - { - 9579925, -222563056, 1006096, -5937793, -1611, 3397319, 3053722, -1038845, 7667054, 1567126, - -1354525, -8899172, 408022, -1437740, -1345935, -6218576, 6024229, -2952253, 2160906, -1481764, - 1724429, 2583423, -1341640, 1089848, -2831457, -2926483, 2690260, 3741454, 5497558, 3745748, - 1757179, 210453, 200253, 482110, -1601486, -1401770, -162672, 152471, 2409477, 294742, - -1556389, -2324651, -631897, 2197950, -2427194, 1328219, -4388920, 205085, 1180579, 757525, - -610422, 1908039, 1162326, -1580548, -17180, 57982, 1067836, 465467, 587874, 377420, - 1180042, -9127, -515933, 832687, -469762, 780073, -381178, -757525, -113280, -506269, - 186831, -41339, -282931, 86973, 353798, -214748, -629750, -34360, 110595, -210990, - -140123, 415001, 166967, 33823, 15569, -51003, 303869, -285615, -98784, 27917, - 258772, -151934, 59056, -231391, 88584, 33823, - }, - { - 256624, 14988899, 947577, 3245385, 237297, -196495, -1055488, 966905, 951872, -190052, - -1032403, 334471, 1506997, 1824824, 761283, 6598144, -8343511, 6519224, 1529008, -597000, - -14876156, 6262599, -4334159, 7863012, 8035884, -6597607, -1044214, -3784940, -838056, 692564, - -59056, -1958505, -6431714, 1005559, -626528, -5803038, -2742874, -2381559, 296890, -418222, - 1311576, -1454920, 1176284, 290984, -4271345, -1225139, 1049583, -1354525, 241055, -273267, - -912681, 1076963, -626528, -100932, -260919, -1679869, 845035, -511638, 832687, 118112, - -125091, -83215, -1096827, -537, 9127, -106837, -47245, 379568, 369367, -441845, - 746787, -935229, 786516, 505196, -273804, -100932, -89657, 402116, -136365, -45634, - -399432, -442382, 136365, 93416, -79457, -1611, 76773, -21475, -410169, 199716, - -102005, 75699, 419296, 186831, -146029, -134755, - }, - { - -44627396, -48074104, 22108882, -9775882, -329639, -55298, 3568581, -1944010, 4305705, 1974074, - -1010391, -631897, 2331094, -3751117, -3273839, -5384279, -2084670, 5211943, 183610, 860604, - -2202781, -2712272, -755377, 710817, 2226404, 917512, -12885, 864362, -1587527, 1103270, - 1530082, 975494, 360777, 2170032, -1144609, -1932198, 4226785, 3129958, -561030, 233002, - 1299228, -959388, 162135, -2807298, -1915555, -1344325, 3021510, -545998, -1110249, 638876, - 178241, -598611, -447750, -1096827, -1591822, -260919, -940598, -197032, 25233, 314606, - -59056, 425202, -876710, -389768, -1420024, -1284732, 144955, 738198, 230318, 775778, - 861678, -150324, -325344, 442919, -255551, -1091995, -67109, 230318, -21475, 295279, - 111669, -418222, -199716, -96100, 355409, -335544, 106837, 166430, -427349, 244813, - 30602, 238371, 169114, 285615, 0, 163209, - }, - { - -1713692, -3668976, 18136036, -4989142, 2131915, 1286880, 5090073, -4531191, -1648194, -3629247, - 1955821, -4629438, -1899449, 1000727, -10485626, -403727, -363462, 5768678, 8547522, 1438814, - -7786239, 6050535, -1397475, 8615704, -906775, -3411815, 2643552, -5109938, 2770791, 134218, - -2262911, 4306242, 1374926, -677531, -356482, 3337727, -3605625, -3101503, -3546032, -459562, - -2185602, -2427194, 383863, 434865, 217970, -1394254, 1316408, 1174137, -402116, 470299, - 397821, 399432, -973884, 843961, -2628520, 1101659, -1066763, 1115618, -540629, -760746, - 306553, -306553, -227633, 197569, -184684, 104153, 667867, 529892, -123480, -433792, - -112206, -106300, 387084, 88584, 728534, 753767, -288300, 418759, -482647, 427349, - -118112, -33286, 115964, -3758, -159451, 140660, -280247, 289910, -293132, 62814, - 195421, 161061, -89657, -362388, -24159, 253940, - }, - { - -4407710, -148624656, 5385352, -1345935, 13152800, -7859790, 14868640, -8587250, -2403571, -1015760, - -4800700, 2139968, 1631551, -2328409, -4686883, 5600638, -2523830, 3351148, 784368, 2073396, - -165893, 424665, -2447595, -580357, -688805, 3612604, 3678103, -1913945, -528818, -1695438, - 110595, -2500745, 2826089, -609349, 2132451, -1942399, -2146410, 3803731, -1624035, 1291711, - 1107028, 1263257, 54761, -677531, 1002875, 1827509, -2108292, -863825, -1082869, 343597, - -1382443, -680752, -703301, -100395, -1293322, -1266479, 642098, -344134, -1635309, 341987, - 949188, -62814, -675921, 60666, 39192, -666794, 86973, -180926, -47782, -149250, - -218506, 418759, -679679, 48855, 142808, 285615, 77309, 121333, 160524, 102542, - 17717, 40265, 23085, 255014, -14496, -335544, 144955, 200253, 244813, -85362, - 19864, 51003, -193274, 112206, -140123, 81604, - }, - { - -1512365, 22531398, 1605244, 47245, -489626, -700080, -997506, -1043140, 2179696, 1479079, - -3597572, -2442226, -7265474, 16708497, 11827266, -3275986, 777389, -2201708, -674310, -2504503, - -4470524, -1697049, 2420214, -2088965, 512712, 3308199, -1816771, 2075006, -1181653, -6576669, - 3409130, 1379221, -3051574, -2024003, -2557653, -3435437, -2720862, 3011846, 1648731, -1483374, - 1478006, 822486, 1324461, 1545115, 1684701, -1821603, -60130, -61740, -2102923, 1621887, - -62814, -882079, -1519882, 1111860, -950262, 2621004, 853088, -809601, 289910, -267899, - 787590, 713501, 847719, -693100, -312996, -461709, -419833, 439697, 249645, 475131, - -408022, 437013, -24696, -520228, 170725, 406411, 364535, -47245, 485868, -34360, - 125628, 61203, -91805, -84826, -486405, -202937, 77846, -388158, -346282, -113817, - 53150, -43487, 55298, -218506, 69256, 36507, - }, - { - 5455682, 117336360, -16039018, -3110093, 2311766, -17133698, -17206176, 6754910, 2392297, 4751845, - 4948876, -504122, -1965484, 20333986, -4524748, 4486094, 8107825, -68719, 930397, -4452271, - -2796561, -2712272, 470299, -5117454, -6536940, 362925, 1685775, 4868346, -1356136, -9108552, - 131533, 1670205, 4102231, 547608, 3608846, -4002910, -3474629, 4006668, -2771865, 93952, - -271120, 2171643, -1462973, -2118493, 20401, 1354525, -353261, -750009, 1273995, 2146947, - -1858647, -227633, -1614371, 2608656, 775778, 2545842, -1057636, -710817, 336081, 329102, - -1196148, 756988, -774705, -415001, 40265, 596464, -1146219, -133144, -812823, 185757, - 600759, 843961, -116501, -45634, 47245, -246424, 1074, -941672, 410706, 685584, - -505196, -521839, -126702, 320512, -354335, -40265, 106300, -17180, 57982, -83215, - -188979, 48318, 300111, 5906, -284542, -14496, - }, - { - -1282048, -4720706, 6667400, 4729296, -2400350, -3435437, 561030, -2085207, 2167885, -2108292, - 99321, -7309498, -4756677, 25912074, -25905096, -10490458, 1748589, 3107409, -4982699, 5215164, - -3276523, 5799817, -5405753, 3542274, -2892124, -319438, -1231582, -1057636, -2056216, -353798, - 3944928, -2995203, -3404299, -457414, -1283658, 2450279, 3674345, 354335, 2241436, -3408594, - -1018981, 180926, -476741, -1263794, 562641, 1300301, 1472100, -1652489, 2401424, 383863, - 718333, 1130650, -1664837, 24696, 1309965, 838056, 1307281, -857920, 44560, -55298, - 170188, 1041530, 786516, -885837, -380641, 130460, 47245, 135291, 566936, -528281, - 234076, -92342, -574989, -341987, 335007, 322659, -707596, 658741, -341987, 187905, - 395674, -236760, 95026, -61740, -366683, 200253, 112206, 106837, -171262, 4832, - 45634, 173946, -104690, 253940, -130997, -114890, - }, - { - 15480136, 53679040, -1542430, -3048890, -265751, -136902, 3735011, -87510, -747861, -2276870, - 2266132, 1069447, -3629247, -5900212, -39864276, 1030255, -7230578, 1268089, 3616899, -242666, - -4456566, 132607, -1061931, 1414655, 1665911, -1858647, -1252520, -7674033, 2835215, -135828, - -8590, -1082869, -3453691, -1852742, -321586, 1583769, 822486, 2655901, -157840, 253403, - -302795, -64961, -4655208, 950262, 1773822, 2778844, -151934, -1915555, -1337346, -1084479, - -444529, 910533, -1240709, -545461, 390305, -1523640, 407485, -99321, -1377074, 540629, - -718870, 464393, 1234803, 226023, 330176, 827855, -126702, -12885, -328028, -510564, - 186294, 233539, -41339, -134755, -65498, -333934, -288837, -8590, 160524, -301721, - 112206, -531502, -93416, -457414, 122943, 220654, -147103, -47782, -157840, 27917, - -131533, -188442, 56371, 237297, -135291, 89657, - }, - }, - { - { - -557809, 33124398, -17353816, 565325, 842887, 1249299, -755377, 2199560, -978179, -445066, - 294205, -4927401, 1645509, 4598300, -2902861, -334471, 5233418, 6535330, -1262720, -13652627, - 2172180, -6585796, -1902671, -7981660, -3617973, 8101382, -2112050, 614180, 2553895, 5552319, - -5000953, 7021735, -2429878, -1648731, -1951526, 2326799, 726923, -2605972, 2318746, 1378685, - 529892, -24159, 761820, -316754, 2508261, 774705, 831076, 208843, 2913599, -1372242, - 270046, 78383, -919660, -1127429, -795643, 871342, -514859, -533650, -855235, -468151, - -672162, 470299, -479426, 550830, -79994, 627602, -10201, 1355062, -139586, 387621, - 22012, 260919, 19864, 548145, 338229, -35970, 340376, 104153, 91268, -311385, - 122407, 123480, 2684, 75162, -335544, -27917, 178778, 167504, -71941, 83215, - -242129, 152471, -118112, 55835, -63351, 164283, - }, - { - 6784438, 130150392, -49316424, 4917738, 4894115, -102542, -3273302, 3380139, -8053, 2824478, - -3597572, -2178085, -948651, 7920457, -679142, 1122060, 3981435, -10974178, 2720862, 4027606, - -4598836, 5067525, -895501, -213138, -999654, 1573032, -256087, 1773285, 678068, -3952444, - -1458141, -2137820, -835371, -3109020, 2240362, -3651259, 3182034, -1884417, 4199941, 3586298, - -1930051, -2651606, -243739, -11274, -598074, 1293322, -2679523, -382252, 223875, -1258962, - 710817, 2255932, -1628866, 108448, -984084, 394600, -352724, -1283658, 515396, -226560, - 1673964, -81604, 1066763, -332323, 440234, 396211, 56371, 764504, -322123, 884763, - -60666, -882616, 222265, -224949, -350040, -253940, -528281, 723702, -408559, 71941, - -71941, 120259, -28991, 175020, -134755, 373125, -98784, 16643, 167504, 4295, - 110595, -142271, -113280, -196495, -39728, -6979, - }, - { - -2587718, -99238976, 38332584, 17658222, 3826816, 2724083, -2859911, -142808, -130997, 1966558, - 452582, 2044404, 2081449, 6151467, -365609, -2818572, 7261179, 3413962, -13459891, 1009854, - -2275259, 3529926, 3381213, -4865661, 6637335, -5228049, 3870303, -383326, 592706, -5075041, - 1101659, -3115999, -3392487, 1780264, -2817499, -933619, 1921461, -1225139, 49392, 1677185, - 1177358, 79457, -1540820, -1035624, 1832877, -1849520, 1701881, 1445257, 610959, -770410, - -918586, 138513, 546535, -2493766, 2442763, 1063541, -832687, 49929, -1267015, -190052, - 762894, -781147, -848793, 685584, 497142, 321586, -304943, 205085, -298500, -687732, - -116501, -25770, -227096, -58519, 30602, 71404, -53687, 234613, 20401, -143345, - 29528, 172872, -2147, -322659, 60666, -204548, -273804, -201863, 343597, -16643, - 16643, 51540, -24159, 35970, -272194, -310311, - }, - { - 1553168, 24961276, -6477348, 230318, -263067, -89657, -462246, 647466, 357019, -426276, - 2275259, -508954, 2411624, -1868848, 1662689, -1739462, -1480153, 7885560, -5203353, 3094524, - 5014911, 1007170, -779000, 304406, 6201933, 4589173, 2088965, 4631586, -90194, 433792, - -2231236, -3043521, 2587181, 345745, 3085397, 2744484, 2463701, 838056, -1080184, -710817, - -112743, 1064615, -1200980, 1296543, -156229, 154082, 228707, 423054, -1249299, -769336, - 598611, -1002875, -383863, -144418, -1685775, 875636, -680215, -674847, -62814, 244276, - -75162, 295816, -762357, 257698, 35433, -161598, 757525, 12348, 321586, -349503, - 289373, 292595, -110595, 118648, 53687, -210990, 225486, -454730, -197569, -186831, - -199179, 409096, 95026, -51003, -180389, 127238, 245887, -267362, -206158, -62277, - 69793, 11811, -236223, -120796, -71404, 13422, - }, - { - 9754944, -180884688, 6763500, -13108777, 1629940, 406948, -748935, -1932198, 242129, 5312338, - -8348880, 2497524, -1818919, 873489, 5957657, 86436, 2150705, -14217952, 6114423, 520765, - 431644, -2865817, 5881958, -640487, 4181688, -437550, -1684164, 5507759, -2565169, 2886755, - -2297808, 1433982, -2724083, 2639794, 518080, -1738925, 4595615, -1905355, -1762547, -143881, - 1352915, -1135482, -828929, -503048, 24696, 2543158, -826244, -648540, -197032, 300111, - -650688, 1114544, 624381, 1469953, -202400, 329639, 780073, 311385, 1288490, 863288, - -267899, 520765, -265751, -578210, -89657, 89121, -1031329, -426812, -513249, -99321, - -876173, 625992, 671626, 175020, -405874, 526134, 781147, 32749, 316754, -34360, - 230854, 296353, -347892, -74088, 118112, 82141, 574452, -173946, -337155, 216896, - -271657, -112743, -123480, 196495, 149250, 121870, - }, - { - 333397, -92342, -2569464, 1584306, 212064, 105227, 445603, -730681, -2285996, 918049, - 2481417, 1526861, -1385127, 1871532, 6675990, 2449742, -3208878, 7216082, -148176, -5650030, - 1973538, -370441, -5129265, 9880572, 1072131, 1700807, 1145146, -163746, -4467303, 1666447, - -697395, -1918240, -3367791, -3975529, 1618666, -630286, 2833605, -1352378, 34897, -347355, - 2195802, 239444, 64961, -1082869, -322123, 408022, -799938, 2200634, -19864, 632434, - -162672, -545461, -704375, 228707, 511101, -1192927, -1494649, -229781, -179852, -360240, - -1021665, 759136, -143345, -541166, -163209, 289373, 34897, 998043, -650688, 222265, - 187368, -564788, 213138, 780073, 12885, -397284, 528281, -505196, -85899, -728534, - 332323, 253403, -238371, 202400, -8053, -17717, 318364, 10201, -125628, 184147, - -220117, 58519, -109522, 13959, -277562, -8590, - }, - { - -35744864, -161306624, 907312, 3790309, -1066226, 2856690, 1045288, 1226750, 6199786, 3774203, - 1748052, -7304129, -1752347, -5091684, -3155727, -2547453, 2315524, -2586644, 2730526, 738198, - 4767414, 565325, 485331, -103616, -3194382, 146029, 2077690, 3463354, 4833986, 2916820, - 3357591, -734976, 218506, 312996, -1717987, -283468, 1350767, -46708, 2567317, -2589865, - -1848983, -1535451, 1853815, 1903207, -3808026, 561567, -2119566, -387084, 756451, 583042, - 1643899, 192737, 1108638, -1534377, -376883, 131533, 807991, 180389, 104153, 315143, - 784905, 507880, -158914, 96637, 472983, -265751, -457414, 151398, -715649, 63888, - -56908, 121870, -352187, -107911, 194347, -122407, -316754, -91805, 263604, -160524, - -345745, 82141, 166430, -392990, 488553, 159988, -46171, 116501, -367220, -89657, - 135291, -36507, -136365, -1074, -42950, -4295, - }, - { - 1160178, 7815230, 5748814, 365609, -173946, 9664, -814970, -70867, 2305324, -712965, - 267899, 152471, 2528662, -2555506, 16493211, -3117610, -338229, 1874216, 4386772, -10080288, - 1432909, -4685810, -845572, 1051730, 11164231, 389768, -6913824, 3667365, -5591511, 1817845, - -1789928, 1443646, -5976984, 1445793, -1655173, -3189013, -2331630, -2660195, -2877628, 1860258, - 1063004, -1116155, 1405528, -1072668, -2605435, -1901597, 932545, 63888, -783295, -1199370, - 468151, -777926, 231391, -42950, -914291, -622233, 481036, -831613, 572841, -989453, - 256624, -321586, -869194, 115427, 329639, 492311, -772020, 585189, 654983, 126165, - -570694, -349503, 813896, 115964, -297427, -112743, -171799, 104153, -264141, 38655, - -168041, 31675, -175020, 128849, 180389, -128312, 18790, -239444, -91805, -141734, - 19864, 124554, 426276, 77846, 83215, -175020, - }, - { - 45035416, -118103544, -18977312, -877247, 2393371, -1534914, 1619740, 655519, 3186329, 492311, - 2703682, -220654, 5303748, -7773354, -6663642, -165356, -4032438, 6027987, 2414309, -3973382, - -892816, -553514, 2179696, -2627983, 1991254, 3352759, -3530463, 2187749, -2816425, 865436, - 4220879, -2632278, 1374390, 500901, -675384, 18254, 1180579, 1990717, 1586454, -1832877, - -47245, 2451890, -2738042, -3544959, -267362, -667867, 828392, 748935, -1285806, 83752, - 99858, -169114, -170188, -1968169, -1897302, 32212, 228707, -39728, -523449, 307627, - -192200, 463856, -362388, -1021665, -697395, -290447, -317828, 545461, 590558, 461709, - 284005, 565325, -328028, 125091, -361851, -551903, -316217, 234076, -275415, 529892, - 70330, -280247, -191663, 8590, -51003, 402116, -228707, 41339, -119185, -107374, - 216359, 178778, 420907, 207769, -28991, 130997, - }, - { - 1562831, 17842904, -2389613, -1384590, 968515, -403190, 3126736, -2226941, -3132105, -1559073, - -4300873, -687195, -5466420, 4233764, -12226161, -4687420, 7055558, -3227668, 10353019, -2516851, - -967441, -268435, 270583, 8544837, -5203353, 187905, 3288334, -3359201, -228170, -2349884, - 2448131, 2754685, 1934883, -2290828, 714575, -1732482, 376347, -3878892, -4642323, 644782, - -2312840, -1676111, -899796, 635118, 966905, -2362769, 2160369, 885300, 670552, -677531, - 681826, -1461900, -181462, -58519, -286152, -280247, 110595, 634045, 340376, -1574642, - -246961, -779537, 562641, 45097, 248034, 416075, 486942, -220117, 716186, -988916, - -30602, -44560, 561567, 339302, 438087, 246961, 181999, 79994, 98247, 82141, - -384936, 319975, -248571, 402653, -391916, 198105, -356482, 136902, 51003, -162135, - 197032, -51540, -109522, -125091, -165356, -98247, - }, - { - 6076842, -146534624, 218506, -7541426, -83752, 10466835, 1208496, -6442988, 2877628, -5629092, - 134218, -1006633, -2466922, 1405528, -4352413, 4972499, -5646272, 8313446, 3546569, -784368, - 870268, -1885491, 1314260, -3670587, -227096, 4013647, 2604361, 100932, -1350767, -482647, - -976568, -186831, -344134, 2146947, -1096827, -1110786, -995359, 4088809, 250719, -263067, - 1085016, 865973, 382789, -976568, 1723893, 125091, -17717, -741419, -1304060, -1027034, - -1171989, -777389, -1071594, 1152125, -923418, -930397, 556735, -1331977, -1137630, 89657, - 290447, 15032, -499827, 99858, -200790, -34897, -290447, 176094, -550830, -207232, - 331249, 322659, -553514, -185757, -54761, 38118, -12885, 593242, 113280, -70330, - 133144, -37581, 6442, 300648, -127775, 77309, -124554, 106300, 188442, 176631, - -46708, -88047, 22012, 26844, 38118, -75699, - }, - { - 870805, 23277112, -1594507, -2281702, -1866163, 518617, 1547799, -106837, 2741800, -148176, - -1709934, -4210142, 10241886, -6117107, 8683350, -3055332, 2018635, -6767258, 988916, -5522791, - 3933653, -8360691, 670552, 809601, 1295470, 68719, 137976, 494995, 2689187, -7472706, - 3241627, 1262184, -3169686, 876173, -1341104, -2508261, -335544, -596464, 841277, -1787243, - 1717987, 1639067, 976568, 687732, 741956, -607201, -514322, -566936, -829466, 463320, - -3758, -365609, -1845762, -394600, 1738925, 571768, 1074816, -275415, 198105, -335544, - 1256278, 320512, 229244, 140123, 99858, -836445, -9664, 362925, 55835, 174483, - 395674, 65498, -522375, 53150, 207769, 297963, 317291, -2147, 215822, 111132, - 140660, -71404, 73551, 24159, -259309, -345208, 218506, -222265, -496069, -127238, - 171799, -122407, -183610, 90731, -96637, 63351, - }, - { - 12856448, 103156528, -14526116, -5514738, 28454, -9564355, -16010027, 4437775, 3527779, -1875827, - 3711926, -3811784, 995896, 21090974, -8184597, 5731634, 8000451, 4323959, 1043140, -4017942, - -3376381, -407485, -819265, -7665443, -2124935, -1956895, 1228361, 3338263, -2350421, -4733591, - -2768107, 2530810, 1906429, 2568391, 1063004, -2872260, -2081985, 967978, -1161252, -3753265, - 2408403, 1024887, 1628330, -1035624, -1588601, 1729261, -2215666, 875100, 1585917, 2086280, - -1779727, -445603, -103616, 988916, -287763, 1517197, -695785, 274878, 458488, -856309, - 748398, -37044, -929324, -243739, -112743, 783832, -151934, -680752, -592169, -336081, - 359167, 1043140, -209917, 261993, 9127, -352724, 144418, -635118, 316754, 4832, - 112743, -199179, -377420, 107911, -241592, 210990, 82141, 248571, -153008, -113817, - 90194, 2147, 237834, -76236, -199179, -100395, - }, - { - 856309, -1010391, 3890167, 3246459, -4301410, -863825, -3084860, -1764158, 899796, -594316, - -4562329, -3459059, -5525476, -29748018, 47487304, -13756780, -1086627, 5355824, -6247567, 6702297, - -2149631, 1359357, -285615, 2725157, -8557185, 2132988, -543313, -174483, -2925947, 755914, - 1794223, -3627637, 130460, -170725, -649614, 2056216, 5350456, 1184337, -2833068, -727997, - -795106, -1085553, -579821, 1271310, -115427, 2069637, 524523, -1278827, 952946, 1294933, - 1222455, -991064, -598611, 664646, 1401233, 1403917, 539018, 469225, -885300, 721018, - -210453, -92342, 1155883, -717796, -16106, 54224, 379568, -333934, -164819, 345208, - 135291, -536871, 219580, -605054, 41339, -32212, -278636, 472983, 247497, -26844, - 143345, 5906, -127238, 45097, -228707, 259309, 56908, 54224, -136365, -71941, - 16643, 13959, 171262, 76773, 3221, -26844, - }, - { - -1687922, 75138304, -2159295, 3817689, -4618701, -3793530, 2940442, 401579, -455267, -3736085, - 2605435, -5191542, 3769908, -20330228, -25178708, -3547643, 3416647, 2377801, -1067836, -1986422, - -1152662, 1750736, -2274722, 3236258, -881542, -1345399, -2978560, -3179350, -75699, -60130, - -1233193, -2141041, -4737886, -1219771, 1739462, 3428995, 1831267, 1124208, -272730, -3051574, - 1387274, -228170, -2529199, 13422, 1489280, 4410395, -1752347, -2182917, -1032403, -344671, - -1493038, 688805, -1327682, -552440, -409633, 761820, 202400, -530428, -1010391, 918586, - -364535, -229781, 1022739, 881005, 872952, 594853, -286689, -110059, -128849, -255014, - 196495, 274878, -279710, -49929, -479426, -371515, 33286, -42950, 443992, -91805, - -83215, -537945, -113280, -223338, -26844, -161598, 234613, -114890, -102542, -42413, - -159451, -227096, 150324, 73014, 238371, -74088, - }, - }, - { - { - 66035, 76746768, 14488535, -4683662, -2979097, 1582159, -2544231, -1923072, -3882651, -155693, - 105764, -6495065, 4760435, 1205812, -6879464, -3503620, -1132798, 4966056, 21475, -9203041, - 5367099, -801011, 6506876, 1411434, 1202054, 8056285, 2743947, 2295123, 1060320, 8516920, - -2379412, 6641093, -1332514, -2387465, -6991670, -2908230, -634045, -1248762, 2179159, 612570, - 224412, -813359, 1960116, 711891, 42413, -1104880, 451508, -187905, 1184874, -2921652, - -348966, 359704, -922344, -904091, -758599, 721018, -1051730, -565325, -907312, -16106, - -77846, 305480, 7516, 79457, -245887, 537945, -256087, 1450625, -205085, 539555, - 238908, 194347, -333397, 466004, 369904, -75162, 555661, -82678, -308164, -42950, - 280247, 43487, -57445, 141197, 27380, 144418, -114354, -229244, 12885, 404264, - -153008, 235149, -227096, -141197, -50466, 98247, - }, - { - -8722542, 225454112, 27022860, -8198556, 49929, -503585, -2523293, 872952, -5988795, 1364726, - -1713692, -4543002, -4794794, 6658810, -3113315, -8734890, -375810, -1734630, 12847858, 4692252, - -2229088, -832687, -5191005, -27917, -2538863, 2538326, -1565516, -753767, 981937, -2040110, - 1751810, 1074279, 2435247, -2098092, 2763275, -591095, 4916127, -1267552, 1391569, 1500017, - -2751464, -2346126, 3517578, 2981781, -1335735, 1068373, -196495, 3187940, 1613297, -1684164, - -902480, 1111323, -1501091, 195958, -297963, 1335735, -1221918, -2374043, 37044, -394063, - 1132261, 67646, 994285, -912681, -714038, -359704, 39192, 512175, -1094143, 953483, - 346819, -564251, 80531, -81604, 304406, 199179, -321049, 527207, -308164, 284542, - -392990, -166967, -44023, 173409, -265214, 250182, -273267, -4832, 199716, -39728, - 340913, 144418, -178241, -343597, -95563, 118648, - }, - { - 548682, -171487840, -17835926, 9775346, 3060164, 4793721, -338229, 657667, -1451699, -1029182, - -4682588, -3109556, 329102, 1789928, 1059783, -2077690, -1212791, 3717294, -8492761, 1411434, - -9654550, -3087008, 4764730, -3141769, 3399467, -5717675, 1340567, -5408438, 969052, 118648, - 3424700, -6539088, -4580046, 870805, -4460324, -207769, 1786170, -2928094, -1991791, -937377, - -1515050, -2679523, -153545, 788127, 2015413, 122943, -183610, -892816, 780610, 1210644, - 881005, 231928, 425739, -2586644, 1857573, 374736, -588947, 1522029, -191126, -431107, - 594316, 246424, -533650, 398895, 276489, 168577, -396748, 438087, -117038, -41339, - 716186, 695248, 73014, -330712, 235686, 408022, 127775, 106300, 45097, -191663, - -148176, -140660, -15569, 110059, 228707, 4295, 107374, -182536, 168041, -190052, - -342524, 51003, -72478, -116501, -134755, -159451, - }, - { - -1238024, 32477468, 261993, -380641, 749472, 129923, -253940, -683437, -430034, -801548, - 2210835, 1331440, -291521, -1930588, 5854041, -4173635, -6196564, -2963528, -8333847, 1369558, - 334471, -3185792, -1580011, -1210107, 2470680, 2099702, -1752347, 2631204, -2789581, -340376, - -3824132, -4556961, -238371, -2944737, 1334124, 253940, 808528, -1000191, -1511829, 1784022, - 337155, 268435, -2894808, 204548, -418222, 221728, 347355, 506806, -1492501, 418759, - 1590212, -1368484, -36507, 505732, -532039, 1231582, -877247, -689879, -663036, -241055, - -738734, -457951, 16643, 305480, -387084, -493384, -16106, -133144, 358093, -244813, - 541166, 110595, -513249, 55298, 221728, -95026, 376883, -219580, -89657, -88584, - -109522, 383863, 75699, -63888, 162135, 110059, 168041, 16106, 23622, 124554, - 113280, -36507, -56371, 1611, -189515, -16106, - }, - { - 5027259, -194215200, 6134287, -10583336, -658741, -620086, -442382, -744640, 163746, 5029407, - -8127152, 5343476, 568546, 1257889, 4543002, -1906429, 2585034, -19430432, 3995393, -1606318, - -177167, -4189741, 498753, -1641214, 2939905, 1205275, -1939715, -1342714, -6364605, 3990025, - -4679904, 1305133, -2407329, 2213519, 1435056, -2950643, 8249022, 1444183, -1777580, -205622, - 428960, -2619393, -532039, 1416266, -90731, 422517, -1402844, 738198, 144418, -753767, - -2008971, 341450, 294205, 717260, 235149, 202937, 341987, -1020055, -91268, 783832, - -593779, 277025, 347892, -363462, -502511, 732829, -423054, 289910, 248571, 380105, - -303869, 197032, 68183, 9127, -200253, -33823, 170725, 334471, 425739, -70867, - 207769, 98784, -297427, -82141, -99321, -93416, 194884, -288837, -128849, 99858, - -420370, 59593, -19864, 159451, 99858, 108985, - }, - { - -375273, 868120, -1583769, 1593433, 43487, -79457, 56908, -1767379, -3299609, -518617, - -140123, 10737, -6315213, -3841312, 1105954, -2684, -2135136, 4372814, -6692633, -2176475, - 13296682, 926102, -3251827, 13351980, 1986959, -294205, 1645509, 3471944, -6546604, 1123134, - 4490925, 882616, -1406602, -2034741, 3645354, -925565, 1705639, -2364916, 1019518, 1787243, - 2350421, -446140, -374736, -2359011, -2209761, -507343, -1666447, 1729798, -18254, -649077, - -858457, 435402, -724776, -717796, 922881, -537408, -154082, 519691, 1079111, 711354, - -1257889, 23085, -979789, -513785, 103616, 285078, -738198, 571768, -117575, -110059, - 29528, -121870, 249108, 634045, -92342, -363998, 257161, -610422, 116501, -545998, - -45634, 189515, -136902, 255551, -57982, -311922, 4295, -50466, -352187, 18790, - -134755, -2684, -280247, -51540, -347892, 17717, - }, - { - 52674552, -61424476, -14661945, 7722888, -2813741, 38118, -242666, -537, 888521, -531502, - 2040646, -2490544, 3519726, -519154, -2360622, -823023, 624918, -2756295, 3701188, 314069, - 4156992, -657667, 935766, 1632088, 1522029, 1204202, -643708, 92342, -1937030, -1856500, - 2371896, 1197222, 1174674, -1577327, -1846299, -254477, 1551557, -2100776, 916976, -741956, - -379031, -1536525, 874563, 2800319, -1253057, 1056025, -112206, -969052, -1203128, -486942, - -768799, -2137820, -692564, -1825361, 298500, -774705, -349503, -292595, -287226, 568546, - 1138166, -154619, -493921, 35433, 88047, -672162, -289373, 823023, -355945, 184147, - -131533, -271120, -445066, 44560, 293668, 255551, 106837, 267362, 200790, -278636, - -365072, -314606, 24159, -346819, 198642, -226560, -62277, 289910, -457951, -287763, - -5906, 90731, -157840, -46171, -78383, -99321, - }, - { - -498216, -10436771, -5832029, -1459752, -289910, -102542, -482647, 4832, 1221381, -372052, - 2271501, 3267933, 5138392, 1481227, 18494666, 5031554, 12115029, -2217277, 2518998, -8846022, - -3413425, -10630581, -6231998, -13119514, 5259725, 2401961, -3912178, 5566278, -5995238, 741419, - -2781528, 2785823, -4472135, 1268626, -611496, -263604, 701153, -1127429, -3198677, 736050, - -197032, 79457, 1917703, -1022202, -1046898, 12885, 1334661, 1474784, 614717, -1345399, - 17180, -1861868, -374199, 808528, -278636, -179852, 659278, -1000191, 380641, -1037772, - 1892470, 1108638, -60666, 196495, 359704, 22012, -1111323, 884763, 333934, -15569, - 198642, -377420, 34360, -196495, -251256, 78383, 122407, 66572, 205085, 490163, - 64961, 401579, -314069, -268435, 318901, -181462, -114354, 347892, 162672, -202400, - 125091, 3221, 289373, 7516, 103079, -49929, - }, - { - -36086316, -189527776, 17627082, 4545149, 3372623, -2566243, 1004486, 503585, 112743, -1556389, - 1545115, -721555, 6061810, -3930432, -2445447, 593779, 34897, 8541616, -544387, -6077916, - 129386, 1047435, 1726040, -5235565, -594316, 2961380, -3528316, 1922535, -3009698, 981400, - 3095598, -4096862, 262530, -1409823, -2179159, 878858, 695785, -1128503, 1870458, 337155, - -3781719, 1882806, 229244, -1764695, 1739462, -350577, -564788, 1528472, -1246077, -1772211, - -575526, -46171, 526670, 775242, -740345, 133144, 47245, 75699, 683437, 1024887, - 377420, 953483, 191663, 0, 525597, 647466, -323733, 183610, -84826, -546535, - -16106, 627602, -267899, 337155, -6442, -150324, -442919, -39192, -615791, 369367, - 122407, -132607, -177704, 68719, -57982, 370978, -163209, 222801, 60130, -51003, - 277025, -18790, 29528, -48855, -92879, 61203, - }, - { - -1370095, 33552284, 8323647, -2469069, 784905, 323733, 4625143, 754304, -765041, 1346472, - -2407329, 1454383, -6873559, 1491427, -14907295, -3918621, 9211094, -9168145, 3638374, -5076115, - 1379221, -139050, -4948339, 7455527, -1072131, -580894, -1497333, 310311, 2779381, 2981244, - 4064113, -2829847, -195421, -2069101, 632434, -1375463, 3125663, 290447, -868657, 2074469, - 527207, 598611, -1119376, -778463, 1197222, -645856, 932008, 777389, 825707, -1062468, - 1507534, -1769527, 314606, 1103270, 272194, -785979, 831076, 515933, 119185, -416075, - 1045288, -692027, 267362, -503585, 81068, 47782, 148176, -683437, 332323, -424128, - 398895, -219580, 71941, 116501, 32749, -94489, 12885, 147640, 112743, 182536, - -73014, 397821, -256087, 194884, -396211, 302258, -415001, 38655, 114354, -103616, - 230854, -91805, 6979, 79994, -98784, -40265, - }, - { - -6208375, -151601072, 8414915, -9175124, -2946885, -970663, -13087839, -7063611, 4807679, -3100967, - 1175747, -1919314, -1234803, 4378719, -4062502, 1974611, -1284195, 12748000, 3796214, 53150, - 5182415, -1457068, 801548, -1944010, -1334124, -1696512, -179852, -624918, 415001, 3181497, - 411243, -1095754, -3052111, 594853, -193274, 1204202, -98784, 4179003, 3142306, 2471754, - 2699924, 1729261, 228707, 161598, 749472, -1217623, 643171, 256624, -600222, 97174, - 612033, 209917, -149250, 1401770, 280784, -111132, 942208, -733366, -119185, 93416, - -483184, -267362, -426276, 110059, -136365, -48318, -292595, 245350, -964220, -164819, - 165893, -112743, -481036, -124554, 18254, 163746, -53687, 186294, 3221, 102005, - 537, -33823, -274341, -230318, 119722, 284542, -20401, 205622, 67109, -1611, - -127775, 46171, 371515, 79457, -12348, -43487, - }, - { - -233539, 19985020, -4206384, -4467840, -2297808, 2115272, 1336809, -1059783, 1022202, -780073, - 675921, -3514357, -2201171, -27773406, 246424, -2453500, 6429566, -1275605, 803696, -3766150, - 4008278, -12392591, -1308891, -3287261, 9375914, 7398081, 302258, -117038, 5459441, -3953518, - 2626909, -948114, 1083406, 3692061, 3656628, 3362423, 2932926, -889058, 416075, -620086, - 1502702, 55835, -1202054, -1139240, 1023276, 782221, -327491, -40265, -347355, -63888, - 687732, 983011, -369904, -311922, 922881, -1014149, -378494, -1386201, -105764, 587874, - 1577864, 137439, -266825, -124017, 574989, -418222, 115427, 89657, 142808, 286152, - 486405, 302258, -375273, 485331, 435402, -28991, 92879, 127775, 238371, 117038, - 171799, -184147, -190052, -73014, 51540, -34360, 132607, -208843, -242129, 10737, - 145492, -34897, -92342, 174483, -7516, 134218, - }, - { - -21927418, 49571440, -10160819, 7071664, 3350075, 5921150, -5285494, 2618320, 2346126, -4701916, - -935229, -8781061, -7834557, 13405667, -10070088, -4398584, 1456531, 7041599, 4185446, -230854, - -1334661, -311922, 3409667, -987843, 3358665, -796716, -177704, -13422, -90731, 1446330, - 2118493, 2142652, -1283658, 107374, -3135863, -2563559, -958315, -198105, -646929, -3336653, - 326418, 536334, 3813394, -380641, -1341104, 2774012, -1956895, 187368, -471910, 2344515, - 337155, 1088237, 199716, -1113470, -1760400, 352724, 7516, 1315871, -754304, -1973538, - 609349, -206158, -247497, 165356, -125628, 1171989, 169651, -606127, -366683, 25233, - 27380, 613107, -134218, -19327, -166967, -162135, 174483, -527207, -61203, -136902, - 605054, -43487, -578210, 91805, 55835, 228707, -149787, 157303, -251256, 39192, - 290984, -22012, 34360, -113280, -51540, 5369, - }, - { - -657667, -23085, 5898064, 2994666, -2441152, 2144799, -2309082, -2991982, 456340, 971200, - -2809982, -1598802, -9404368, 3665218, 98277440, -8676908, -49392, 9637370, 275415, 4059818, - -288837, 191663, -46171, 6945499, -5545877, 2340757, -1872069, -3011846, 2025077, 4282083, - 1613297, -2800856, -212064, -280784, 397284, 1048509, 1573569, -1210644, -2742337, -773631, - -2705293, 385473, -152471, 2414845, 46708, 513785, -2092723, -1775432, 463856, 1079111, - 529355, -857920, 1053878, 1142461, 381178, 363462, 529892, 693637, -1016297, 1015760, - -872415, -951335, 880468, -973347, -686121, -341987, -208843, -469762, -228170, 616865, - 500364, -194347, 574989, -533113, -328565, -271120, -66572, 196495, 442382, 36507, - 169114, 448287, -62277, 42950, 62277, 34360, -320512, -74088, -38655, -213675, - -128312, 6979, 245887, -41339, 31139, 30065, - }, - { - -10815801, 70389144, 1442035, 3919695, -4425427, -5041755, 2425583, -1898912, -2331094, -3112241, - 1005559, -7907572, 5092221, 13322989, 18116708, 2025614, 7595113, 748398, 1250372, 1685775, - 3436511, 2864743, -2790655, 1537598, -1323387, -1861868, -6731825, -853088, 1168768, -2390686, - -232465, 1173063, -126165, 1191317, 881005, 50466, -1780801, 550293, 221728, -1680943, - 2662343, 1714229, -672162, 932545, 1535451, 2358474, -2866354, -1502165, -128849, 564251, - -1778653, 146029, -4295, 805306, 105764, 1665911, 1368484, 434865, -937914, 504659, - -166430, -470836, 741956, 1307818, 752156, -91805, -206158, 987843, 464393, -354335, - 348429, -211527, -458488, 525597, 29528, 390305, 292058, 151934, 552977, 54761, - -104153, -250182, 242129, -250182, 80531, -9664, 394063, -133681, 121333, -17180, - -173409, -180389, 89657, -106837, 176094, -272194, - }, - }, - { - { - 850940, 66901096, 14106283, -4220342, 971200, 172872, -3586298, -1479079, -2989297, 2493229, - -4185983, -5397700, 3103114, -2586107, 2554969, -4843113, -1903744, 6438693, -3719979, -7327751, - 7450695, 2925947, 942745, 1711545, 5876052, 3207267, 8974334, 1753957, 208306, 4746476, - -1610076, 8408472, -3715147, -2521146, -4993437, -3888556, 361314, -4569309, 2469069, 1211181, - -1052804, 1231582, 219580, 2233920, -1255204, -1454383, -875100, 1415192, -1250909, -1896765, - -160524, 154619, -803159, 202400, -558346, -288837, -1090922, -963683, 711354, -719944, - -332323, 273804, 389768, 216359, 74625, -359704, 402653, 529355, 82141, 372052, - 548682, 137976, -315680, 159988, 505196, -327491, 717796, -26307, -331786, -6979, - 106300, -110595, 387084, -9664, 238908, 13422, -111132, -221728, 88047, 174483, - 314606, -91805, -106837, -157840, -30602, -119722, - }, - { - 9906879, 221927408, 265214, -3367254, -62277, -1437203, -1330903, -2050310, -4272956, -8590, - 3817152, -5670968, -4740034, 2044404, 884763, -13233331, -2644089, 7144678, 9028021, -123480, - 864362, -6913287, -2580739, 683437, 711891, -1879585, -2127620, 1072131, 257161, -2684, - -668404, 3740917, 901943, -607201, 87510, 2088965, 1456531, 549756, 563178, -272194, - -1990717, -646929, 3674882, 814970, 377957, 619012, 707059, 2314451, 930397, -206695, - -407485, -89657, -715112, -176631, 349503, 566399, -853088, -759672, -900333, 185220, - 49929, 558346, 377420, -306553, -779537, -494458, -657130, 586263, -464393, 479963, - 212601, -164283, -561030, 244813, -5906, 37044, 428423, -199179, 103616, -171262, - -229781, -35970, -201327, 277562, -67646, -60130, 53150, -15032, 122943, 17717, - 207232, 151398, -178778, -328565, 17717, 56371, - }, - { - 193274, -171806208, -11045582, -3709778, 10064719, 2269353, 434865, -1282585, -805843, -2303713, - -2542084, -847719, -3440806, -4749160, -77846, 6318434, -7195681, 5555540, -1549946, -1367410, - -9904195, -4643934, -1287953, 1210644, -266288, 368830, -1588064, -2090575, -3278671, 106837, - 1887638, -4286914, -2595771, -3089692, -4850092, 2338610, 732292, -4933307, 153008, -1052804, - -1847910, -1945620, -2077154, 2907693, 1974611, 1466195, -3111704, -132070, -18790, 2570538, - 1034013, 627602, -315680, -2328946, 67109, 1513439, 526670, 697395, 811749, -1341640, - 101469, 1079647, 181462, -74625, -139586, 321586, 93416, -310848, -66572, 146029, - 933082, 863825, -112743, 28454, 630286, 211527, 148176, 114354, -309238, -125628, - -86436, -158377, 88047, 49929, -44560, 339839, 49929, -292595, 40265, -282394, - -132607, 47782, -55835, -181999, -54224, -67646, - }, - { - 1008244, 26909580, 2115272, 272194, 52076, 128849, -132607, -568009, -1235877, 162135, - 1125281, 2725694, -2484639, -5702106, 5180268, -3391951, -1977833, 3649112, -13485124, -3476776, - 2117956, -616865, -3186329, -406948, -3962107, 1716913, -2293513, 5745593, -3122978, -959925, - -2663417, -2152316, -4596152, 695785, -1989107, -63351, -472446, -96637, -216896, 1367947, - -280247, -143881, -1570884, -1401770, 3758, 973884, 656593, -1039919, -509491, 855235, - 332860, 466541, 329639, -273804, 397284, -273267, -51540, 50466, -1552094, -395674, - -244276, -932008, 697395, -282931, -419833, -165893, -12348, 376883, -333934, 593779, - -12348, 60666, -801548, 575526, -19327, 56908, 194347, 81068, -56908, 248034, - -307627, 132607, -34360, 114890, 225486, 68719, 32212, 135291, 156229, -34360, - 177704, -90194, 118112, 39728, -160524, 93952, - }, - { - -18540300, -185437360, 22277458, -18460306, 3845070, 650151, -2548526, 3158949, -3773129, 340376, - 3977677, -2887292, 1909113, -260382, -34897, 1103270, 3620121, -22741314, 12017318, -5737003, - -5311801, 2483028, -5254356, -2650532, 2429878, 1611687, 621160, -6233072, -4372814, 3155190, - -3790309, 2610266, -602906, -721018, 64961, -2562485, 4813585, 3661460, -1509144, 334471, - -1603633, -893890, 358630, 560493, -433792, 537, -224949, 316754, 755377, -2209224, - -2204929, 653372, 594316, -681826, 1219234, 85362, 606664, -1128503, -716186, 117575, - -264141, 329102, 305480, -396748, -426812, 395674, -29528, 125091, 561030, 274878, - -99858, -441845, 175020, -192200, -73014, -154082, -93416, 583042, 449361, -57445, - 209917, -271120, 165356, -135291, -51540, -58519, -53687, -158914, -156766, -44560, - -349503, 122943, -104690, 141197, -6442, 68719, - }, - { - 0, 4400731, -4359392, -831613, 733366, 82678, 37581, -2155000, -1058173, -455803, - -1449015, 132070, -5964099, -7939247, 22012, -20401, 1455994, 1326071, 3559991, -6131066, - 2889976, 2131915, 5479842, 5347771, 2287607, 2598455, -6675453, 10051834, -5830418, 1454383, - 2866354, 1928977, -584652, -3841312, 4005594, -122407, 102005, 554051, 1540283, -293132, - 2578054, 201327, -769873, -1577864, -2353105, -1151588, 173946, -580894, 200790, -1058710, - -432181, -56908, 876710, -1305133, 1151051, -776315, 141734, 388158, 1102733, 168577, - -825171, 628139, -1752884, -358630, 152471, 159988, -491774, -39728, 465467, -411243, - -53150, 239444, 545461, 89657, 177167, 230318, -404264, -134218, -275952, 33823, - -203474, -168041, 228170, 166967, -175557, -74625, -300111, -193810, -138513, 8590, - -115427, -105764, -188442, -122943, -55835, -78920, - }, - { - -56534116, 14949707, 30732102, 3361886, 5660767, -621697, -187905, 1677722, -1776506, -3755949, - 707059, 3900367, 1481227, -99858, -3348464, 4067871, -2592013, -1009317, 2660732, -148176, - 1511292, 868657, 840203, 1272384, 2443837, -1779190, 381178, -1441498, -1124208, -2713346, - 1029182, 4847945, -363998, -2231236, -177167, -136902, -485331, -1503775, -257161, -105764, - 435939, -1324997, -235149, 1759326, 1067299, -227633, -113280, -996432, -2879776, 1279363, - -1814087, -2080912, -332860, -1687385, 1253594, -2059437, -284542, -109522, 212064, 477815, - 1058173, -496069, -74625, 110595, -173946, -453656, -514859, 719407, -314606, 282931, - -168577, -713501, -198105, 264677, 206158, 183073, 252329, 382252, 92879, -371515, - -248571, 129386, -259309, -71941, -272730, -11811, -6979, 33823, -227096, -263067, - -52076, 88047, 537, -92342, -121870, 79994, - }, - { - -904091, -10730976, -6426882, 330176, -88047, 139586, -11274, 420907, -326954, 404801, - 1586454, 2972117, 2374580, -1264868, 7892003, 11752641, 13886703, -513249, -2107218, 212601, - -14740865, -3328600, -6843494, -8148627, 4459787, -6136435, 1545115, 1023276, -2192581, -3714073, - -1329829, -688805, 13422, -2793876, 1968169, -1826972, 1962800, -2539400, -1467805, 104153, - 379568, 1088237, -1173063, 776315, -1891396, 2090039, 752156, 1010391, 761820, -1510218, - 399432, -1542967, -788127, 1878511, -359704, 785442, -278636, -654446, 337155, -929324, - 1678259, 638876, 1234266, -323733, 99858, -155693, -8053, -59056, 489626, -443992, - 857920, -206695, -494995, -199179, -66035, -353798, 830002, 25770, 314069, 412317, - 200253, 78383, -280247, -101469, 168041, -168041, -47245, 607201, -73014, -84826, - 131533, 45634, 71941, 78920, 110595, 5369, - }, - { - 20058572, -239548048, -37044, 3098819, 3670587, -861678, 631360, 747861, -1069447, -427886, - 689342, -622233, 2439542, 965294, -3024731, -632434, 2262374, 2229088, -1327682, -744640, - -517544, -585189, -1031329, -1215476, 424128, 614717, -224412, -637803, 979789, -2536178, - 1598802, 1682017, -2375654, -1944547, -1866163, 972273, -267899, -126702, -536334, 1590749, - -3313567, 712428, 373662, 958315, 847719, 134755, -909996, 1082869, -1247151, -694711, - -1386201, 709743, -420907, 986232, -441308, 323196, -326418, 184684, 525597, 920734, - 634045, 680215, -236223, 780610, 77309, 706522, 113817, -333397, -5906, -563178, - 134218, 26307, 148713, 157303, 357019, -396211, -434329, -137439, 30065, -164819, - 178778, 19864, -76773, -134755, -93952, -24696, 69793, 119185, 224949, 52613, - 41339, 56908, -54761, -52076, -91268, -84826, - }, - { - 1112933, 37609416, -3304977, 2785286, 795106, 2701535, 1155346, 527207, 1141924, 3579855, - -34360, -3536906, -272730, -699006, -12904766, -188979, -1280974, -3735011, -5007395, -621160, - 3474092, -476741, -3172907, 5572183, 1687922, 1324997, -5031018, 2178622, 1160715, 5358509, - 184684, -687732, -1091459, 2099702, -1940252, -1130650, 5167383, -311385, 825707, 1267015, - 1526861, -388695, -972273, -1261110, 958315, 2239826, 194347, -299037, 1402844, -1015223, - 993748, -787053, 647466, 363462, 527744, -455803, 579821, 15569, 204548, 40265, - 242129, -412854, 518080, -639413, -488016, 35970, 157303, -293132, 44023, 50466, - 436476, -381178, -394063, 420907, -337692, 306016, -45097, 70867, -248571, 435939, - 118112, -119185, 204548, -231928, 28991, 67109, -204011, -52613, 113817, 220117, - 25770, 91805, -32749, 106300, -28991, 104153, - }, - { - 4685273, -139137072, -5038534, -10594074, -2728378, -1657321, -16253230, -802622, -2866891, -2040646, - 1815697, 1977833, -2164127, 2678449, 694711, -4373351, 9660992, -430570, 7634305, -98784, - 3491272, 940598, 1097364, 214212, -2524367, -2491081, -2052458, -886374, 3052648, 4407710, - -1684164, -4076461, -2176475, -20401, 2542621, -57445, 1270237, 4807142, 1124208, 2949032, - 3062312, 3066070, -178241, 1508607, -998043, -1442572, 499827, 379031, 849330, 286152, - 326954, -506806, 1502702, 136902, 955630, -770410, 741419, -415538, 374199, -40265, - -640487, -61203, 182536, -240518, -59056, -9664, -437013, -31675, -602369, 3221, - -112206, -352187, -354872, 201327, 339302, -17717, 154082, -254477, 134755, 19327, - -114354, 128849, -417686, -248571, 189515, 135828, 147640, 148713, 179852, -55835, - -171799, -28991, 316217, 35433, 60130, 109522, - }, - { - -166430, 15400679, 2441152, -7429757, -1089311, 1894081, -1709397, 683437, 272194, -1588064, - 1981591, -3013457, -12982076, -11461657, -4759361, -114890, 2982855, 3558381, -4958540, 1843078, - 4471598, -14985678, 2852932, -4153770, 7660074, 6448894, -3063386, 2900177, 3180423, -528818, - 1917166, -3420405, 529892, 5435281, 1831267, 4105989, 3012920, -683974, 2382096, 690953, - -2209224, -679679, 346819, -266288, 1234266, 398358, -900869, -643171, 461709, 425739, - 506806, 43487, 1277216, -184684, 87510, -1348620, -1002338, -1063541, -358630, 689879, - 1741072, 3221, 159451, -527744, 15569, -199716, 156229, 181462, -204011, 637266, - 301721, 310311, -181999, 172336, 348429, 169651, 314606, 63888, 79994, 171262, - 120259, -107374, -141734, -235686, 32749, -31675, -227096, -205622, -67646, 92342, - 12348, 55298, 49392, 6442, 62277, 138513, - }, - { - 19818590, -5106716, -6396280, -321049, -718333, 12665859, 1567126, -1116692, -1544578, -1078037, - -2326799, -7660074, 6228777, -10762651, -2297808, -2110977, -3718368, 3940096, 2631741, 5450314, - -3380139, -1308891, 2831457, 3636764, 1406065, 2477123, -2266132, -733903, 1494649, -243203, - 4748623, -423591, -484258, -1613834, -2336999, -687732, -2286533, 1545651, -1307281, -1120987, - -1807108, -1166621, 3550327, 130460, 740345, -49929, -441308, -325344, -128849, -48318, - 2828236, 800475, -1379221, -242129, -976031, 1140851, -1015223, 1065152, -595927, -887985, - -363462, -379568, -550830, 757525, -482110, 1228361, 558883, -835371, 26307, -9664, - -212064, 296353, -77309, -55298, -370441, 333397, -701153, 289910, -170188, -127238, - 284005, -38118, -321586, -151934, 141197, 51540, -283468, 71941, -47782, 6442, - 264677, -36507, -43487, -127238, 143881, -26307, - }, - { - 485868, -330176, 3147137, 2553358, -484258, 290447, 217433, -1280437, 556198, -1205275, - -1008780, -746787, -7986492, 34778496, 55370180, 2313377, 1462436, 2287607, 2597382, -3082176, - 8010651, -1910724, 1518271, 2476586, 455267, -673236, -722091, -424128, 111132, 1948305, - 2575370, -326954, -1370632, -2008971, -1804423, -44560, 2407329, -1384590, -2342905, 23085, - -4345433, 3185255, -817654, 1613297, 366683, 340376, -3191698, -1446867, 538482, 1780801, - 370978, -587337, 1254667, 576063, 141197, -380641, 1069447, -126702, -424128, 704912, - -697932, -379031, 696322, -1043677, -699006, 164819, -1265942, -52613, 115427, 606127, - 271120, -83752, 150861, -309238, -332860, -132607, -11274, -59056, 54761, 142808, - 386010, 508954, 85362, -8053, 220654, -270046, -479963, -122943, 160524, -192737, - -55298, 20938, 179852, -27380, 96637, 10201, - }, - { - 17099876, 46186468, -7554848, -330712, -2216740, 3912715, -6272800, -1202054, -2804077, -3036005, - 3110630, -2364380, -272194, -7773891, 53323092, 4782446, 6732361, -5344013, 1908039, 2196339, - 3711926, 2625836, -2559264, -1063541, -736587, -2500745, -4679904, 4258460, -3203509, -1835025, - -743029, 545998, 3406983, -290447, -350577, -685584, -2488397, 1104880, 993211, 55835, - 345208, 2718714, 776852, 916439, 1404991, 22549, -2374043, 74625, 236223, -790274, - -484258, -958315, 1771674, -274341, 726386, 1642825, 557809, 1318018, -992137, -929860, - 561567, 112206, 505196, 557809, 817654, -647466, -112743, 787053, 513785, -149787, - 57445, -155693, -286152, 767189, -139050, 490700, 70330, 508417, 64961, 323733, - -112206, -151398, -17717, 69793, 142271, 31675, 263604, -83215, 76236, -149787, - -15032, -140123, 16106, -53687, 25770, -194884, - }, - }, - { - { - -266825, 4566624, -37771016, -3140158, 2633352, -1155346, -1910724, 1411434, -19864, 2544231, - -5004711, -1391569, -378494, -10468446, 9397925, 5614059, 730681, 509491, -5630702, 245887, - 12719009, 2394444, -1304060, -2445447, 347892, -5289252, 2523293, 321586, -3449396, 1836635, - -2695629, 3573413, -4037269, 3508988, 3487514, 1195612, 2869575, -5323075, 877784, -11274, - -2336999, 555661, -717796, 1137630, -1546725, -1318018, -1660542, 399969, -930397, -609349, - -168041, 411243, 340913, 776852, -173946, 52076, -366146, -319975, 1452773, -241592, - -767725, -55835, 366146, -210453, 45634, -138513, 358093, 455803, 112743, -325881, - 29528, 209380, 11811, -91268, 95563, -453656, 397284, -34360, -42950, -45097, - 97711, -106300, 248571, -98247, 226560, -22549, -83215, -107374, 62814, -177704, - 256087, -180926, 91268, 130997, 82141, -102005, - }, - { - -6605660, 153247120, -33708512, -1595580, 1265405, -58519, -1337346, 1074816, 928787, 2163590, - 5486284, -3272765, -3404835, -2640868, 3821984, -2137820, 1264331, -4661114, -2767570, -2286533, - -1797981, -3893925, 1055488, 2790118, 361314, -3062312, -30065, 1871532, -16643, -340913, - -2525441, 1720671, -1228361, 620623, 635118, -381715, 190589, 1414118, 839666, -183610, - 565862, 356482, 1200980, -1024887, -1442572, -1302986, -789737, 721018, 711354, 82141, - 776315, 1072668, -728534, -496069, -94489, 72478, 160524, 333397, 194347, 212601, - -827318, 4295, 401579, 35970, -792421, -413927, -1032940, 382252, -246961, 60666, - -83215, -203474, -222265, 315680, -317291, -23085, 209380, -549219, 293132, 114890, - -63888, 56371, -7516, 330712, -24159, -53150, 311922, -111669, -27380, -141734, - 8590, 128849, 9127, -188979, 95026, 41876, - }, - { - -1435593, -103781440, 37754912, -18755586, -7444789, -2640868, 1124745, -226560, 832150, -2023467, - 132070, 273267, -3694746, -1527935, -3586298, 5682779, -3685082, 2876018, -2816425, 984084, - -4976794, -309238, -494995, 1584306, -544924, 1995012, -540092, 2415382, 651224, -1789391, - -994285, -2818036, -2158221, -3144990, -3122978, 811212, -594316, -449361, 2164664, -209917, - -161061, -748398, -1018444, 1527398, -577673, 802085, -2610266, 1090385, 1006633, 996969, - -1059246, 120259, -623844, -1599875, 220654, 694711, 559956, 1013612, 981400, -1051730, - -34897, 544387, -330712, -501974, 251792, 64961, -270583, -324270, -402653, 54761, - 759136, 316754, -98247, -19864, 231391, 230854, 96100, -163209, -120796, 297963, - -132607, -172336, 226560, -76773, -316217, 181462, -31675, -182536, 108448, -324270, - -38118, 28454, -42413, -81604, 121870, 49392, - }, - { - -372052, 14458471, -5228049, 129923, -558883, -298500, 346819, 612033, -832150, 169651, - 689879, 2228014, -5032091, -4013647, 8307004, -3149822, -3307125, 4828080, -10200547, -1872069, - 360240, 1872069, 496606, 484794, -1842004, 4543002, 1792075, 6801081, -2581812, 1657857, - -491237, -658741, -2665564, 2932389, -1149441, -518617, -692027, 670015, -174483, 951335, - -752693, -879395, -64961, 649614, 847182, 753230, 575526, 156229, 40802, -306553, - -755914, 701690, 171262, -759672, 43487, -714575, 440234, 775778, -1093069, 215285, - 201863, -607201, 515933, -398895, -511101, 194347, 455267, 366683, -542777, 705448, - -225486, 340376, -113817, 376347, -289373, 85362, 224412, 97711, -147103, 186294, - -467615, 57982, -144955, 44560, 16643, -104153, 21475, -36507, 14496, -195958, - 75162, -37581, 73014, 45634, -35970, 138513, - }, - { - 27260694, -157394976, -2629594, -11415486, 2733210, -1158567, -4453881, 1780264, -3276523, 244276, - 5422933, -3366181, 2932926, 1904818, -7404524, -6305012, 1384053, -25843892, 5850283, -5142150, - -2745021, 4588099, -4394289, -2222109, 962073, -1403917, 974958, -1283658, 151934, 3365644, - -770947, 1939715, -1126355, -1547262, -24159, -23622, -930934, 275415, -106837, 539018, - -357556, -981937, 294205, -208843, -1246614, -117038, 689342, 646393, 217433, -2261837, - -1877975, 387084, -12885, -1254667, 1036161, -415001, -216359, -581968, 23622, -329639, - -411243, 266288, 170188, -151398, -531502, 142808, -27380, -269509, 18790, -377957, - -209917, -556198, 15569, -17717, 4295, -15569, -93416, -11274, 241055, -44560, - 104153, -168577, 201327, -232465, 98784, 147103, 124017, -15032, -178241, -58519, - -204011, 245887, -67109, 50466, -32749, 54761, - }, - { - -110595, 4789426, -5033702, -1553168, 6979, 213675, 588411, -1190243, 1200443, 108448, - -2076617, 256624, -4286378, -966368, 4176856, -2727304, -1200443, 1299765, -3956202, -16008954, - 2256469, 1512365, 1391033, 2541010, 998043, 826781, -2093797, 14377403, -1566589, 687195, - -2354179, 1668058, -544387, -4631586, 1593970, -2517925, -874563, 678605, 1586990, -986232, - 726923, -627065, 684510, -290984, -926639, -47782, 289910, -1447941, 1076426, 810675, - 635655, -222265, 724239, -1187022, 456877, -1014149, 106300, -289373, 126165, -457414, - -771484, 949188, -1051193, -122407, 352724, 139586, -526134, -37044, 549219, -422517, - -43487, 83215, 233002, 54761, 453656, 18790, -693637, 232465, -245350, -81604, - -56908, -252329, 117038, -62277, -128312, 194347, -310311, -129923, 24159, 40265, - -33823, 66572, -21475, -271657, -39192, 97711, - }, - { - 49074296, 44639204, -54943368, -5168457, -446677, -1018981, 476741, 848793, -324807, -911607, - -1275068, 541166, -622233, -113280, -6507949, 4934918, 2023467, -1503775, 2115808, 488553, - 208306, -1571958, -2896419, 464393, 1135482, -3585224, 2319282, 1526324, 1893007, -1014149, - -148176, 2379412, -3128347, -2576444, 1832877, 619012, 696858, 919660, 67646, -215822, - 882616, -1729798, -1264331, 1257889, -486942, -104153, 679679, -556198, -2481417, 932008, - -306553, 160524, 1021129, -1098438, 1695438, -2267206, -834297, 565862, 194347, -39192, - 980863, -651761, -114890, 206158, -294742, -236223, -595390, 214748, -576063, -91805, - 33823, -391379, -194884, 194884, 156229, 78383, 268972, 106300, -53687, -171799, - -100932, 402653, 68719, 159451, -153008, 282931, 12885, -88584, -37044, -92879, - 91268, 97711, 117038, 19864, 20401, 286689, - }, - { - 584652, 3760244, 161598, -120796, -74625, 55835, 282931, 176631, -572304, -457951, - -259309, 1648731, 869194, 1682017, -3796751, -11651173, 506806, 1532230, -4089883, 6460168, - -234076, 5415954, -1726040, -3169149, 3334505, -10132902, -1664837, 275415, -3360275, -3614215, - 777389, -1786170, 3265249, -417149, 1196685, -3489661, 1903744, -274341, 766652, 854699, - 282394, 223338, -2083059, 733366, -1728188, 1924682, -115427, -446677, 1285269, -255014, - 286689, -275415, -185757, 1134945, -1120450, 108448, -236223, -170188, 727460, 228707, - 1075352, -562641, 416612, -891743, 112206, 224949, 397821, -642098, -101469, -843424, - 425202, 79994, -79457, -99858, -18790, -407485, 636192, -101469, 328028, -9664, - -114890, 173409, -18790, 244813, 181462, -239444, -47782, 262530, -222265, 74625, - -27380, -85899, -61740, -32212, 77309, 36507, - }, - { - -2714956, -223520832, 39660800, 3816079, -1726040, -36507, 2035278, 1979443, 251792, 181462, - 1313186, -514859, 158914, -228707, -3385508, 1386738, -1728188, -3890704, -245887, 3069291, - 461709, -814433, -357019, 575526, 2233920, 1847373, 1094143, -425739, 1542430, -2232309, - 2015413, 2137283, -887448, 321049, -452045, 109522, -943282, 621697, -1838783, -1231582, - -5640366, -306553, 1173600, 1008244, -319438, 342524, -748398, 286152, -1075889, -95026, - -1506997, 448287, 34897, 1506460, -182536, -84289, -477278, -73551, -310311, 184147, - -123480, -125628, -405874, 551366, -191126, 391916, -148713, -332323, 338766, -330712, - 22549, -275415, 34360, 89657, 357556, -186831, 275952, 22549, 230854, -254477, - 48855, -134218, -75699, -62277, -96637, -157840, -141734, -140123, 90731, -104690, - -104153, 95026, -45634, -2147, -128849, 32749, - }, - { - -558883, 25334402, -13449153, 1584306, 2140504, -1768990, -5101348, 730144, 506806, 2157147, - 427886, -640487, 2778844, 859530, -5747203, 6584185, -1904818, -3709241, -4400731, -4153234, - -55835, 855235, -4923107, 1621887, 2496450, 2392834, -4574677, 260919, -871878, 307090, - -1973001, 2874407, 149250, 1877438, -381178, 752693, 3769371, -1626719, 207232, 456877, - 1312113, -759672, -497679, -721555, 429497, 976031, -740345, -1036161, 304943, -1320166, - 1150514, -317828, 852014, -338766, -43487, -302258, 537, -179315, 454730, 51003, - -410706, -362388, 553514, -22012, -301721, -271657, 321049, -221191, -117038, -133681, - 307627, -338229, -375273, 452045, -219043, 463856, -171799, 20938, -185757, 255551, - -114890, -19864, 418759, -265214, -5369, 77846, 118648, 169114, 94489, 219043, - -116501, 171799, 98247, 131533, -12885, 102005, - }, - { - -3085934, -98577016, 40477384, -4168803, -2006824, 1611687, -11591580, 194884, -2175401, 1742683, - -745714, 70867, -525597, -820339, 2309082, -2136746, 9450002, -4231617, 1972464, 47782, - 3837017, 865973, -40265, 403190, -534723, -1271310, -1535988, -930934, 2183454, 2140504, - -3259880, -932545, 1265942, -1006096, 2774549, 766115, 822486, 529892, -2381023, 1662689, - 524523, 1155346, 113817, 1589675, -789200, -1081795, -471373, 153008, 750009, 46708, - 504122, -45634, 1026497, -745177, 720481, -632971, 118112, -559956, 232465, 173946, - 605590, 640487, 564251, 83215, 217970, 196495, -90731, 123480, -373662, 37044, - 33286, -15569, -23622, 343597, 225486, -168041, -155156, -437550, 81604, 12348, - -70867, 55298, -259846, 102542, 121870, -24696, -32212, -136902, -82678, -61203, - -68719, -90194, 86973, -37581, 53687, 25233, - }, - { - 466541, 5942088, -2984466, -2715493, 2034741, 1181116, -1702955, 472446, -368293, -956167, - 1436130, -302795, 7698192, 11712376, -4723927, -3811247, -1322313, 5040681, -4514548, -2166274, - 6638946, -6381248, 1013612, -10338523, -1970853, 3151969, -6597070, 356482, 2837363, 522375, - 826781, -2906619, -1615982, 1816234, -1686312, 869731, 1946157, 379031, 1804423, -358630, - -3098282, -217433, 1775432, -8590, 974958, 384936, -389768, 6979, -689879, -1055488, - -441845, -616865, 878321, -148176, 271120, -671089, -90731, -464930, -293132, 126165, - 806917, -562104, 482110, -806917, 48318, 219580, -185220, -150861, -688269, 435402, - 18254, -178778, -47782, 309238, 57445, -11274, 62814, -239444, -18254, -25233, - -100395, -106837, 139586, 10737, 78383, -165356, -271657, -15569, 72478, 2147, - -86973, 91268, 37044, -75699, 58519, 63351, - }, - { - -10541460, -38184408, -2838974, -6285685, -7039452, 941672, -2631741, -177167, -135291, -169651, - 1445257, -5506148, -2095944, -17714592, 1429150, 1843615, -1624571, -163746, 256624, 4597763, - -4168266, -1409823, 1076426, 1035624, -2375117, 1247151, -2690260, -483721, 86436, -2704756, - 1880122, -4312147, -998580, 782758, -358630, 1598265, -1117765, 1359894, -439160, 1139240, - 433792, -1732482, 1815161, 466541, 2016487, -612033, -1332514, -613107, 615254, -821413, - 2126009, -840203, -1872069, 983548, -55298, 2110977, -1054415, -25770, -1092532, -24696, - 391916, 218506, -289373, 731218, -986769, 436476, -121870, -846109, 276489, 130460, - -342524, 9127, -23622, 239444, -222265, 198642, -580357, 343061, -202937, 12885, - -90731, -96100, 132070, 158914, 49392, -130997, -300111, 153545, 54761, -74088, - 220654, 14496, -63351, -289373, 42950, -94489, - }, - { - -86436, -2550674, 108448, 1057099, -830539, 542240, 994822, -156229, 2262911, 143881, - 2612951, 1871532, -4215511, -2790118, -18606336, -7247221, 5350993, -1220845, 1234803, -5079336, - 1976759, -4953708, 3021510, 306016, -1509681, -1171452, -1213328, 424665, -2559264, -1906429, - 395137, 1297617, -847182, -3060701, -482110, 361314, 1037772, -302258, -846645, 1759326, - -2253784, 1715303, -965831, 1754494, -356482, 286689, -2084670, -547071, 630286, 284005, - 130997, -472446, 1115081, 31139, 341450, -437013, 83215, -511638, -376883, 663572, - -285615, -169114, 593242, -703838, -214748, 99321, -649614, 556198, -172872, -365609, - 2147, 346282, 3221, -337155, 234076, 418759, 110595, 93952, -343597, -184147, - 215822, 15032, -56371, 15032, 199716, 30065, -278636, -537, 159451, -31139, - 97174, -137439, -1611, 54761, 105227, -16106, - }, - { - -15881715, 11863237, -212601, -1611, 1475321, 2147484, -6809671, 2775086, -175557, -2477659, - 1924145, -874026, 231928, -10755135, 43772696, -2390149, 2780455, -4377109, 1458141, 283468, - 1076963, 1586454, -775242, -1167694, 1198833, 1091459, -1648194, 3775813, -1782948, 745177, - -799938, 367757, 2355790, 325344, 537945, -113280, -171262, 1254667, 1422708, 1796907, - 10201, 949725, -1057099, 853625, 1286343, -491774, -1046361, 734976, -9664, -1072131, - 359167, -1473711, 52613, -863288, 342524, 126702, -436476, 1351304, -427886, -1223529, - 308701, 391379, 314606, -184147, 85362, -448287, -12348, -260919, 209917, -17180, - -207769, 266288, 9664, 448824, -351114, 0, -176631, 479963, -306553, 67109, - 186294, 40265, -159451, 63888, 11811, 14496, 120796, -123480, -120796, -151934, - 151398, -35970, 14496, -23622, 105227, -62814, - }, - }, - { - { - -1423782, -35196184, -6299644, -353261, -3129421, -1003412, -97711, 282931, 2748779, -801548, - -2352032, -142271, -3058554, -2069637, 6065568, -47245, 4836670, -4207994, 3011309, 271657, - 10296110, -1657321, -2409477, -3462818, 933619, -3489661, -1984275, -412317, 67646, -1010928, - -1239098, -904091, 795643, 3237869, 4549981, 1709397, 1431835, -2139431, -1112397, -403190, - -181462, -891743, -506269, 548682, -532576, -1869921, -1074816, -111669, -81604, -637266, - -216896, 348429, 852014, 99858, -139050, 161598, -37044, 263604, 607201, -404264, - 37044, -564251, -3221, 49929, -133144, -37581, 139586, 595927, 88584, -223338, - -38118, -61203, 278099, -66035, -67109, -130997, -82141, 177704, 195421, -53150, - -32212, -79457, 99858, -79457, -1611, 68183, -94489, -23085, -82678, 4295, - 95563, -63888, 23085, 127238, 100932, 25233, - }, - { - 2553895, 102707160, -3702799, -2522757, 1538135, -177167, 1217623, 661962, 2081449, 541703, - 2694018, -802085, 112206, -2030446, 2471754, 468151, 336618, -1513976, -8974334, -1602560, - -1045825, -1151588, 76773, 2024540, 797790, -1357747, 218506, 1583232, -321586, -1818382, - -694174, -639950, -788127, 448287, 2348273, -2182917, -163209, 1764158, 1586454, 636192, - 403190, 1134408, -798327, -663036, -729071, -655519, -1860258, 454730, 746251, 358093, - 34897, 960999, -552977, -724239, 581968, -219043, 339302, -207232, 437013, -240518, - -486405, 80531, 191663, -48318, -465467, -523449, -279710, -314069, 5369, -191663, - 124017, -197569, 51540, 124554, -139586, -318901, 16106, -131533, 304943, 60666, - 13959, 23622, 48318, 144418, -46708, 190052, 165893, -207232, -12348, 35970, - 20938, 56371, -47782, -62814, -34897, 33286, - }, - { - 4521527, -16412144, -36881420, -22099218, -5834713, -367757, 810675, 105227, -22549, 1440962, - -1628866, -1449015, -1874753, -250182, -3127273, 1839320, 2631204, -1255204, -1545651, 1632625, - -1439351, 529892, -1323387, 1529545, -424128, -1374390, 541703, 2438468, 1859721, -1163936, - -901406, -1288490, -2654290, -2820720, -1989107, -293132, -1017907, 2261837, 407485, -632434, - 225486, 430570, -263067, -297427, -279173, 87510, -586800, 433792, 858993, 476741, - -598611, -278636, -931471, 27917, -15569, 313533, 70867, 667331, 617402, -46708, - -252329, -579821, -405874, -130997, 89121, 193274, -412854, -157840, -255014, -298500, - 453119, 31675, 124554, 6979, 148176, 126165, 108448, -177704, 85362, 136365, - -6442, -121333, 27380, 12885, -78920, -114354, -14496, -16106, -27380, -81068, - -75162, -42950, -66572, -28991, 102005, -20938, - }, - { - -355409, 4904853, 2014877, -749472, -256624, -31675, 514859, 882616, -1062468, 636729, - 1134408, -907849, -877784, -2372433, 4209068, -1563368, -1940252, 5051956, -8369281, -820339, - -652298, -237834, 4529043, -911070, 1467268, 2683818, 3913789, 2157684, 1167157, 201327, - -372588, -543850, -855235, 1059783, 559420, -547071, -772020, 446677, 175557, 537, - -421981, -1187022, 820339, 357019, 715112, 1577327, 4832, 235686, 13422, -471910, - -397821, -61203, -388158, -207232, -426276, -159451, 438087, 312996, -507880, 157303, - 332323, -286152, -155693, -135291, -257698, 17180, 203474, 151934, 31139, 199179, - 192737, 57445, 506269, -213138, -220117, 118648, 137976, -17717, -118112, -126165, - 6442, -234076, -57982, -53150, -111132, 53687, 46171, -79994, -91805, -127238, - -6442, -7516, -74625, 26844, -2147, 19327, - }, - { - -27741194, -76146016, -8017094, -7220914, -2669322, -1070521, -3047816, 717796, -1331440, 773094, - 336081, 2019172, 281857, -3283503, -6468758, 845572, -3096135, -14877767, -5519570, -120259, - -2325725, 1250372, -1316944, -588411, 737124, -1207423, -2105071, 2169495, 637266, 1081795, - 2355790, -546535, -39728, -259309, -442382, 42950, -1850594, 519691, 920734, -36507, - 259846, -360240, 56371, -1218697, -683974, 452045, 663036, -228707, -887985, -1466731, - -864899, -731755, 242666, -300648, 28991, -47782, 16643, 250182, -578747, 89121, - -15569, -16643, -95026, -286689, -234076, 43487, -107374, -258772, -113280, -216359, - -239444, -341450, 10737, 40265, -70330, -75162, -1074, -83752, 38118, 21475, - 49929, -32212, 43487, -102542, 111132, 129923, 92879, 83215, -81604, -85362, - -86973, 146029, 64961, 52613, 41876, -49392, - }, - { - 264141, 2425583, -2207076, -2277943, -279710, 420907, -88047, 183610, 226560, 146029, - -1079647, -342524, -1637456, 1282585, -260382, -226023, 420370, 2662343, -887985, -10931766, - -7609609, 2033667, 1567126, 844498, 211527, 455803, 5686537, 3453691, 1454920, 836445, - -2359548, -898185, 125628, -1786706, -1831267, -639950, -1630477, -624918, 831613, 35970, - 535797, -1220845, 1052804, -341987, -102542, 163746, -455267, -550293, 623307, 1481764, - 587337, -428960, 439160, -567473, -480499, 81604, -836982, 49929, -427886, -784368, - 237297, -65498, -221191, -275952, 478889, -135828, -157840, -71941, 377957, 91805, - -195421, 12348, -105764, 139050, 81604, -137439, -261456, -46708, -16643, -341987, - 18790, -282394, 117038, -52076, -60666, -12885, -48855, -162672, 38655, 24696, - -39728, 96637, -10737, -227633, -46708, 70330, - }, - { - -33791192, 54325968, 22983980, -6052683, 1530082, -73014, 429497, -88047, -401043, 1341104, - -1214402, 465467, -1567126, -1160715, -3731253, 3415573, 1465658, -740345, 973347, 959388, - -12885, -1010928, -2605972, 793495, -490700, -1132261, 1117765, 908386, 2476586, -244813, - 1005559, -800475, -1862405, -422517, 830539, -324807, 241055, 2093797, 757525, -908922, - -684510, -1042066, 441845, 303332, -1181653, -165893, 638876, 148176, -846109, 30065, - 336618, 295816, 266825, -367757, 350577, -1114544, -277562, 215285, -236760, -209917, - 210990, 316754, -306016, -169651, -24696, -372052, -125091, -361314, -275952, -97174, - -132607, 24696, -85899, -286689, 77846, 129923, 208306, -45634, 31675, -133144, - 27380, 311385, 143881, 15032, 66572, 133681, 28454, -137439, 37581, 56908, - 4295, 23085, 91805, 42950, 115427, 164283, - }, - { - 567473, 6530498, -1932198, -549219, 229781, 454193, 591632, -548145, -53150, -70330, - -684510, 447213, 1173063, -1353452, -5346161, -5007932, -4958003, 3483755, -4731980, 4466229, - 5770826, 4323959, 1420560, 699543, -1360968, -6903623, -5912560, 4242891, -1467805, -3062312, - -807991, 626528, 2092723, 882079, -409096, -636192, -506806, 654983, 144418, 1421097, - 99858, -188979, -1150514, 9664, -218506, -31675, -184147, -616865, 847719, 715649, - -208306, -391916, 571768, -143345, -653372, -290447, -45097, 219043, 629213, 388695, - 23622, -49392, -240518, -244813, -24159, 265751, -22012, -179852, -540092, -375273, - 146029, 140123, 11274, -221191, -24159, -94489, -56908, 172336, 71404, 17180, - -227633, 122407, 255551, 172872, 83752, -193274, 73551, -74088, -92879, 88047, - -136365, -27380, -28991, -45097, 87510, 71941, - }, - { - -9579388, -148861952, -15701327, 4033511, 1365263, 1344325, 1458141, 1392643, 447750, -1015760, - 736587, 1791538, 849330, 81068, -3383361, 114354, -59593, -2711198, -768262, 2204929, - 3221, -736587, 777389, 986232, 1931125, 1753420, 77309, 677531, -763430, -125091, - 617402, 1074279, 416075, 1019518, -427886, -750009, -651761, 866510, -1203128, -2032593, - -4559108, -937914, 1250372, 330712, -751619, -396748, 215822, 307090, -1069447, -636729, - -455267, -84826, 743029, 197569, 284005, 125628, -347892, -191126, -114354, 295816, - -531502, -341987, -86973, 215822, 210453, 110059, -232465, -204548, 193810, 33823, - 119185, -199716, -30602, -72478, 9664, 21475, 389231, 85899, 190052, -125628, - -155156, 17717, -68719, 37044, -104153, -84289, -179852, -154619, -75699, -142271, - 1611, 53150, 50466, 10737, -144418, 46708, - }, - { - -129923, 8642011, 97174, 1313186, 294205, -359167, -6190122, -1203128, 449898, 1192390, - 939524, 603980, 1265942, -165356, 663036, -638340, -1727651, -2944737, -3988951, -4014184, - 2196876, -2351495, -873489, -2643552, 1964411, 912681, 746787, -3665755, -68719, -1818919, - -421444, 2000918, 442919, 514322, 562104, 1341640, 448824, -438624, -608275, 42413, - 559420, -1017370, 417149, 365072, -40802, -428960, -611496, -55835, -998580, -3758, - -293668, 51003, 42950, -17717, 222265, 252329, -279173, -35433, -37581, 64961, - -526670, 1074, 260382, 487479, 24159, -62814, -51003, -284005, -263067, -189515, - 88047, -62814, -114354, -1074, 105764, 161061, 65498, 104690, -122407, 158377, - -3221, 67646, 95563, 56908, -74625, -15569, 186831, 161061, 84826, 24696, - -38655, 127775, 35970, 105764, -6442, -3221, - }, - { - 2201708, -60583200, 1292785, 792958, -144418, -3277597, -3197603, -2837363, 1612223, -1605244, - -576599, -1089848, 877247, -1670742, 2697240, -331786, 2865280, -503585, 479963, 290447, - 3253975, 586263, -467078, 382252, -282931, -552440, 206695, -1798518, 3146064, 137976, - -2097018, -565325, -324270, 845035, 998043, 768799, 1681480, -627065, -1123134, -363462, - 743029, 309238, 642635, 781147, 533650, -432718, -975494, 239444, -39192, 223875, - -184147, 352724, 324807, 20401, -296890, 379568, -570157, -214748, -88584, 320512, - 847182, 627065, 28454, 675921, 113817, 41876, 213138, -110059, 93416, -90731, - -6979, 117575, -27380, 124017, -37581, 23085, -334471, -192200, -11274, 49929, - -35433, -18790, -13422, 77846, -11274, -93952, -104153, -130460, -177167, 59056, - -13959, -90194, 7516, 29528, -11811, -8590, - }, - { - -710817, -950798, 2522220, -56908, 564788, 342524, 64961, 408559, -37581, 214212, - -763967, 488553, 1526324, 13764296, 3051038, -3282429, -1678795, 666257, -112206, -1591285, - -1044751, -44560, -801011, -5460514, -5293547, -832150, -3308199, -432718, 1311039, 890132, - 558883, 367220, -563714, -719944, -481036, -672162, 1370095, 208306, 211527, -838056, - -637803, 89121, 547071, 327491, 467615, 268435, -490700, 179315, -626528, -1376000, - -245350, -341987, 312996, -382252, 97174, -237297, 383326, -15569, 169651, 204011, - 39192, -225486, 165356, -12348, -63888, 62814, -236223, -186831, -504122, -51003, - -54761, 22549, 76773, 101469, 23622, -41876, -169651, -92342, -57445, -95026, - -61203, -125091, 170725, 124017, 11274, -32212, -141734, 92879, 68183, -93952, - -38118, 27917, 5906, 37044, 41339, 7516, - }, - { - 1527398, -35050692, -12741020, -11918534, -4212826, -6601902, -2848100, 1197759, 899796, -2192581, - 1728724, -2779918, -4533338, -14329622, -924492, 4356708, 1373316, -984084, 266288, -1120450, - -603443, -839666, -333397, 239444, -1918777, -996969, -1431298, 1141924, -1569274, -2699924, - -1461900, -644782, -1644436, -412854, 25770, 1651952, -248034, -455803, -316754, 705448, - 1555852, 343597, 582505, 1293322, 406948, -372052, -158914, -66035, 747324, -425739, - 888521, -1211181, -998043, 67646, 523449, 1112933, -527744, -377957, -473520, 525597, - 58519, 73551, -115427, 162672, -338766, -130997, -260382, 51540, -183610, -105764, - 41339, -11811, 85362, -186831, -31139, 125091, -38655, -153545, -123480, 141197, - -217970, 74088, 176631, 31675, -115427, -53687, 77309, 17717, 161598, -32212, - 132607, -4295, -110059, -201863, -158914, -81068, - }, - { - -209917, 925029, -1793149, -332860, -1221918, 1010391, 28991, 214212, 2060511, 523986, - 3465502, 900333, 230318, -10336376, -33093260, 4918812, -681289, 416075, 338766, -2607582, - -4486630, -1914482, 1781338, -779000, 583042, -710280, -3260954, -1618129, 318901, -1121523, - -570157, 1317481, -724239, -1459215, -677531, -130460, 1315334, -839129, 704912, 846645, - 249108, -721555, 7516, 600222, 452582, -557809, -341987, -206695, 42413, 290984, - -268435, -64961, 372052, 235686, 626528, -246961, -592169, -74625, -188442, 288837, - -365072, -46171, -9127, -280784, -140660, -52613, 117575, 30602, -94489, -389231, - -14496, 311385, 26844, -79994, 79994, 302795, 242666, 139586, -197032, -143881, - -63351, -93952, -48318, 50466, 87510, 175557, -12885, -57445, 26844, 62814, - -39728, -166967, 20401, 85899, 31139, 3758, - }, - { - 9673877, -14192719, -1967095, -5236102, -1628866, -2088965, -155693, 1684701, 461172, -2274185, - -1197759, -393526, -996432, 9296994, 10337449, 1156420, 1502702, 1868311, -577673, -926639, - 1419487, 1242856, 992674, -2221035, 782758, 1117765, 183610, 551366, 433792, 686121, - -907849, -566936, 2340757, 1145683, 729071, -71941, 1109712, 572304, 708670, 2229088, - -1430224, 148713, 67646, 437013, 636192, -52613, -41876, 15569, 111669, -1001264, - 34360, -940061, -1020592, -171799, 106300, -388695, 537, 494995, 105227, -289373, - 3758, 284542, 259309, -148176, -101469, 71941, -1074, -423591, 28991, 167504, - -251256, 454730, -23622, -24696, -86973, -253403, -50466, 376883, -87510, -29528, - 234076, 77309, -162672, 0, -68183, 37581, -23085, -170725, -191126, -13422, - 92879, 79994, 85362, -9664, -20401, 39192, - }, - }, - { - { - 2061047, -35036732, -750009, 5891622, -1733556, 271120, 608812, -681289, 1061394, -656593, - 292595, -52613, 301721, 1118839, 1894081, -3124589, 3509525, -3284039, 5734855, 1568737, - 7436736, -2964064, 373662, -258235, 1463510, -2193118, -426276, 750009, -329102, -716186, - 535260, -2232309, 1280437, 1802813, 2842732, 128312, -766652, -1256278, 307627, 30602, - 443455, -318364, 92879, 67646, 91805, -695785, 56908, 326954, -48318, -239981, - 162672, 399432, 727460, -402653, -471373, 101469, -149250, 228170, 222265, -358093, - 408559, -267362, -2147, -43487, -73014, 8053, 95563, 277025, -134755, 47782, - -27917, -171799, 134218, -163746, -16106, 64425, -26307, 148176, 39192, -82141, - 3221, -135828, -28454, 22012, 1074, 16106, -94489, -18254, -74088, 45634, - -53687, -17180, -45634, 0, 30065, 33286, - }, - { - -2238215, 78634944, -10209674, -2710124, -2490544, -715112, 1045288, -561567, 302258, -2235531, - 911070, 646929, 948114, -1000727, 683974, -1211718, 117575, 2897492, -3206193, -318364, - 970663, 7516, -9664, 1801202, 545461, -150324, -304943, 122943, -58519, -1233729, - 432718, -259309, -736587, -337692, 1254131, -2799245, -25233, 331786, 179315, 452045, - -448287, 1101122, 782758, 467078, -449898, 260382, -1091995, 699543, 40802, 19327, - -439160, -70330, -577136, -131533, 737124, -312459, 61740, -178778, 175557, -252866, - 93952, 128849, -93952, 52613, 49929, -126165, 263604, -197569, -5369, -3758, - 351114, -20401, -13959, 63888, 118112, -318901, 55835, 48855, 67109, -138513, - 45634, 103616, -90194, -96637, -80531, 268972, 46171, -103616, 51003, 70330, - 31139, 29528, -61740, -5369, -59593, 47245, - }, - { - -7345468, 26218628, 6445672, -10573673, 3423626, 352187, -352724, -468688, -501974, 1877975, - -1161789, 576063, 2498060, 799938, -2069101, 607201, 2207076, 704375, 198642, 561567, - -1639067, 1440425, -2144799, 583579, -237834, -1589138, 693100, -33286, 236760, 122407, - 1852205, 525060, 57445, 343061, 184147, 713501, 110059, 1769527, -67646, -21475, - 203474, 549219, 214748, -281320, 112206, 315143, 84826, 220654, 151398, 394063, - 83215, 133681, -316217, 332323, -12348, 134218, -564788, -98784, 162135, 54761, - -185220, -455803, -146029, 289373, 97174, 203474, -417686, 85899, 11811, -238908, - 126702, -175020, 121870, 2147, 16643, -31675, 173409, -94489, 33823, -26307, - 11811, -117038, -106837, -15032, 8053, -123480, 55835, 63888, 16643, -2147, - -103079, -23622, -38655, 24696, 53687, -64425, - }, - { - 573915, 2941516, -170188, -986232, -85362, -38655, 35970, 214212, -1032403, 445066, - 781147, 140123, 866510, -3202972, 539555, -508417, 900333, 2663954, -4980015, 2225330, - -861678, -1565516, 3893925, 190052, 1470489, 605590, 1410360, -351650, 319438, -1358820, - -751082, 570694, 137976, 346819, 501437, -516470, 467615, 337692, -435402, -348966, - -273804, -369904, 716723, -234076, -366146, 265214, -443455, -2147, 17180, -249645, - -219580, -50466, -248571, -45634, -219580, 208843, 179852, -145492, -53687, 1074, - 31139, -162135, 34360, 102542, -69256, -20401, 41339, -24696, 18254, -21475, - 123480, -61740, 374199, -164819, 12885, -18790, -55835, -34897, 14496, -148176, - 88584, -140123, 63888, -83215, -62277, 86436, 20401, -70330, -33286, 19864, - 16643, -21475, -45634, 46171, -32212, -13422, - }, - { - 20318416, -3511136, -4495220, -3419868, 453656, 889595, -89121, 1240172, -563714, 329102, - -3513820, 2049236, -261456, -2057289, -1789928, 3442416, -339839, -7762080, -3282429, 2690260, - -121333, 484794, -182536, 909459, 909996, 1265942, -110059, 1766305, -1005022, -411780, - 642635, -418222, 1283658, 1247688, -777389, -197569, 176631, -323196, 38655, -218506, - 147640, -165893, -79457, 124017, 237297, -158914, 425739, -312459, -323196, 404801, - -103079, -909996, 906238, 591095, -223875, -234613, 251792, 526670, -439160, 124017, - 101469, 90194, -168577, -156229, -19327, -61203, -129386, 123480, -30602, -59593, - 39192, 17180, 120796, -66572, 4832, 31675, 56371, 87510, 2684, -34360, - -18254, -115964, -10201, 48318, 39192, 10737, 77309, 50466, 88047, 19327, - -76773, 43487, -21475, 16643, -22549, -47245, - }, - { - 131533, 2151242, 1071058, -681826, -97174, 227633, -431644, -205622, -482110, 547608, - -285615, 32749, -484794, 2968896, -1343251, 2093797, 1418950, 2194192, -2952790, -5130876, - -161061, 649614, -1440425, 88047, 1171452, -2171106, 2448668, -2309082, -1127429, 41339, - -549756, -595390, 673773, 656056, -601295, 463320, -791348, -906238, 245887, -163209, - 246424, -850940, 822486, -399969, 404264, 425202, -415001, -472983, -176631, 498753, - 36507, -352724, 191663, -272730, -284005, 620086, -522912, 66572, -45097, -416075, - 270046, -397284, 253403, -57445, 268435, -77309, 27917, 8590, 168577, 136365, - -89121, 89121, -142271, -5369, -212601, -49392, -12348, -74625, 147640, -194347, - 23622, -60666, 132607, 537, -20401, 32212, 157303, -59593, 30602, -27380, - -44560, 28991, -6442, -48855, -5369, 35970, - }, - { - 14834817, 76194864, -3687766, -2206540, 685047, -509491, -32212, 511638, -170725, 682363, - -1032403, 318364, -1158031, 1065689, -1549410, 1243393, -569083, -267362, 734439, 271120, - -118648, -431644, -871342, 792421, -53150, -107374, -73551, -749472, 322123, -510564, - 443992, -1325534, 380105, 461172, 542777, -918049, -889058, 472446, 78920, -619012, - -568546, 583042, 895501, -476205, -229244, 28991, 6979, 271657, 133681, 242666, - 222801, -339839, 156766, 153545, -45097, -374199, 178778, -12348, -45097, -211527, - -267362, 165356, -190052, -96100, 98784, -228170, 110059, -37044, 90194, 47782, - -71404, 42950, -45634, -156229, 34360, -90194, -4832, -18790, 69256, -537, - 103616, 35970, -33823, -52076, 116501, -118112, -56371, 10201, 103616, 48855, - -77846, 13959, 19327, 26307, 30065, 55835, - }, - { - -439160, 175020, -1330366, 829466, 1611, 249645, 315680, -455803, 320512, 17180, - -531502, -701690, -250719, 275415, -1881196, -1604707, -3340411, 3758633, -854699, 1896228, - 1479616, -468151, 1825361, 1716376, 860604, 1146219, -2116345, 4907537, -767725, 708670, - 916439, -602906, 11811, 873489, -643171, 1073205, -282931, 309775, -755914, 532576, - -195958, 221191, -399432, 161598, 272730, -337692, -55298, 93952, 351114, -150324, - 57445, -329639, 282394, -377420, 188979, 162135, -272194, -23622, 186831, -65498, - -217433, -133144, 110059, 264141, 537, 64425, -282394, 127775, 44023, 155156, - 15032, -120796, -58519, -199179, 37044, 153008, -168577, 48855, -41339, 34360, - -114890, 7516, 41339, -37044, 30602, -125628, 51003, -25233, -68719, 1074, - -42950, -22549, 26844, -6442, 33823, 59056, - }, - { - 14579803, -84888416, 740882, 33823, -1949915, -215285, -711354, 445603, -818728, -1517197, - 315143, 1685238, 10201, 1605781, 564251, -89121, 2658585, 430570, -1072668, 424665, - -770947, -907849, 809064, 680215, 256087, 636729, -387621, 982474, 142271, 864362, - -790811, 454193, 525597, -257698, -965831, -545998, -1080184, 1392643, 453119, -368830, - -1197759, 1675037, 275415, -353798, 19327, 497679, 657667, 285615, -747861, 69793, - 287763, 352724, 552440, -281857, 375273, 200790, -142808, 169651, 390305, 508417, - -348429, -11274, -87510, 35970, 78920, 11274, -4832, 54224, -1611, 71941, - 339302, 84289, -126702, -173409, 27917, 145492, 70330, -122943, 39192, 56908, - -93952, 12885, -52076, 52076, -38118, 126702, -42950, -55298, -9127, -17717, - 75699, 3221, 12885, 4832, -35433, -6442, - }, - { - 547608, 1746978, -4326106, -1527935, -2303713, 277562, -1923072, -221728, -472446, 1285806, - 974958, 181462, -338229, -2557116, 1852742, -884226, -1484448, -1074279, -2532957, -2691334, - 3506304, -2386928, -734976, -2097018, 1347546, -510027, 1043140, -1880659, 1123134, -884226, - -459025, -645856, -360240, -674847, 245350, 376347, -1224066, 202937, -40802, -863288, - 291521, -55298, 443455, -111132, -440771, -526670, -257698, 371515, -1222455, -277562, - -355409, 275415, 193810, 306553, 527207, 468151, -252329, -95026, -121870, 194347, - -132070, 29528, -32212, 200790, 100932, 18254, -140660, -127238, 97174, 177167, - -2147, 58519, 99321, -81604, 25233, -15032, 3758, 62814, -27380, 172336, - -30065, 49929, -49929, 88047, -39728, -46708, 48318, -5369, -2684, -96100, - -39728, -30065, -59056, 56908, -50466, -30065, - }, - { - -1112397, -48859548, 1552631, -2484639, 1515587, -9127, 7166690, -847182, 1236414, -2699387, - 529355, -1201517, -303332, -1319092, 1836099, 235149, 30602, -3490735, 157303, -125628, - 1875827, -640487, -361851, 310848, -3221, 114890, 916439, -2068564, 1720671, -190052, - -168041, 1852205, 521302, 103616, -415538, 201327, 340913, -395137, 927176, -578210, - 148713, 115427, 483184, 862215, 879395, 528818, -394063, 331786, -125628, 153008, - -292058, 183073, 301721, 189515, -492311, 388158, -137439, -35433, -39728, 63888, - 165356, 78383, -433255, 208843, -214212, -4295, 177704, -10201, 16106, -125628, - -81068, 26307, 37044, -19864, -104153, 50466, -150861, 95563, -63888, 36507, - -17717, 21475, 78383, -19327, -19327, -109522, -9127, -50466, -57445, 110059, - 4832, -5369, 25233, 24159, -42413, 25233, - }, - { - 749472, -3396246, -244276, 1906429, 165356, 52613, 858993, 435939, 212064, -21475, - -1524713, -541703, -5189931, 3709778, 3783866, -444529, 106300, -515396, 887448, -184147, - -1184337, -544387, -358630, -423591, -1352378, 355409, 590021, 1305670, 1761474, -81604, - 1044214, 817654, 946503, -786516, -169114, -986232, 274878, -972273, 278099, -249645, - 259846, -133144, -196495, 145492, -144955, 38118, 309238, 331786, 113280, 37044, - 351650, -130460, -22549, -573915, 144955, -190052, 380641, 129386, 285078, 12885, - -209917, 192737, 91268, 18790, -167504, 75162, -23085, -20401, -38655, 84289, - 18254, 100932, 62814, -61203, 7516, 87510, -89657, 73014, -36507, -76773, - -45097, -127238, 110595, 41876, -7516, 97174, -30065, 96100, -8053, -102542, - -1074, -23622, -19864, 77309, -6442, -16106, - }, - { - 2715493, -17939542, 6050535, -1455994, -294742, -2493766, -67646, 1114544, 992674, -3321084, - 1104880, -90731, 3999152, -715112, -830539, 1248225, 1204738, -673773, 1342714, -883153, - 1275068, -33823, 392990, 1139777, -1069984, -1169305, 45097, 1626182, -1163936, -781684, - -1407676, 520765, -702227, -986232, -682900, 1177358, 101469, -617938, -705448, -350040, - 1317481, 871878, -832687, -312459, -16106, -25770, -365072, 132070, 447750, -133681, - 542777, -625455, 74088, -120259, 41876, 160524, 19864, 494995, 83215, 339302, - -30602, 71404, -319975, -160524, -10201, -71404, -233539, 310848, -198105, -57982, - 229781, -32212, -45097, -243739, -21475, 105227, 135291, -74625, -59056, 78920, - -24159, 105764, -29528, -39728, -59593, 92879, 74088, -103079, 51003, -68183, - 27917, -47245, -64961, -31139, -41876, 10201, - }, - { - 133144, 1249836, -2649458, 359704, -350040, 590021, 114890, -267899, 1273458, -69256, - 1750736, -529355, -1857037, 14420353, 4922033, 2340220, -5509906, -127775, 213138, -588947, - -3490198, -419833, 1058710, -643708, 488553, -388695, -38655, 625455, 2674154, 34360, - -778463, 601295, -586800, -586263, 421981, 132070, 1173600, -1264868, 459025, 446677, - 221728, -405874, 338766, -69256, 215285, 416075, 431644, 200790, -111132, 306016, - -236223, 59593, -28991, 172872, 779000, -228170, -399432, 204548, -278636, 316754, - -603443, -120796, -49392, 2147, 66572, 148176, 220654, -94489, -1074, -97711, - 31139, 80531, 63888, 49392, -207769, -18254, 304943, 54224, 76773, 23085, - -140123, -537, -66035, 11274, 26307, 101469, -11274, -101469, 57445, -2684, - -64961, -97711, 84289, 26307, -45634, 3758, - }, - { - -2495913, -25414396, 3752728, -2856690, -2623688, -1075889, 2497524, -1347546, -1189169, -393526, - 146029, -635655, -1072668, -1631014, -9291625, 2435783, 3083787, 115964, -1317481, -914828, - 918586, 212601, 674310, -1629403, 1411971, 430570, -571231, -1040993, -1245541, 388158, - -415538, -1042603, 181462, 300111, 228170, -892816, 312996, -265751, -227096, 745177, - -1755031, -63351, -205622, 159988, 586800, 649077, 162672, -427349, -119185, -395674, - 11811, -464930, 123480, 936840, 120796, -173409, 79994, -89121, -82678, -157303, - 30065, 61740, 86973, 63888, 13959, 46171, -23085, -312996, -64425, 141734, - -187368, 287226, -222265, -55298, -7516, -58519, 6442, 120259, 71941, 18254, - 20401, 33823, -42413, 17180, -79457, 31139, 9664, -153008, 3758, 63351, - -3221, 22549, 44560, -30065, -26844, -1611, - }, - }, - { - { - -934692, -24043764, -231391, 1711545, 957778, 547608, -347355, -342524, -88047, 1045825, - -450972, -640487, 1427003, 149250, 459025, -1371705, -1221918, 985695, 3476776, 3267933, - 2973728, 497679, 1156957, 1640141, 611496, 345745, -667867, 140660, 276489, -1182190, - -744103, 197032, 2108292, -409633, 1305670, -363998, -361314, -1974611, 375810, 79457, - 420907, 216896, -75699, -395137, 287226, -23622, -297427, -10201, 0, -447213, - 501437, 674847, 33823, -46171, -259846, -67646, -246424, 22012, 41339, 99858, - 20938, 97711, 99858, -111132, 13959, 100395, 32749, 60130, -20401, 183073, - -93952, -128849, -1074, -121333, -22012, 10737, 31139, 36507, 49392, -31139, - -77309, -44560, 24159, 145492, 63351, -73551, -83215, -84289, 15569, -40265, - -43487, 39728, -53687, -32749, -21475, -16643, - }, - { - 3854196, 50731080, 7681549, -7420630, -2059974, -631360, -60130, -985158, -1024887, -707596, - -1125818, 1152662, 392453, -327491, 288837, -2106682, -1056025, -484258, 3837017, -905164, - 543313, 102542, -573378, 528281, 1211718, 176094, -468688, -489626, -46708, -324270, - -193810, 99858, -118648, -578747, -553514, -931471, 931471, -818191, -951335, -9127, - 194347, 518080, 1472637, 180926, 52613, -140123, -63888, 51540, -377957, -12885, - -204011, -227633, -51003, 160524, 361851, -42950, -251792, 318364, -75699, -136365, - 301185, 25770, 17717, -38118, 67646, -100395, 3758, 107374, -29528, 106837, - 213138, -51003, 32749, 7516, -82678, -118648, 29528, 70330, -103079, -64961, - 81068, 51540, -76236, -93416, 77309, 85362, -27917, 65498, -3221, 88047, - 25233, -61740, 39192, -28454, -537, 24696, - }, - { - 7030862, 24692304, -6201396, 2749316, -1620813, 628676, -418222, -265751, -508417, -13422, - -741956, 540629, 2193655, -78920, 549756, -396211, 1270774, -423054, 672699, 797790, - -2404645, 22012, -918586, -661962, -171799, -288837, 770410, 77846, -121870, -195958, - 1359357, 340913, 1680406, 223338, 1322850, -546535, 1294933, 744103, -157303, -142808, - -195958, 783295, 239444, 54761, 358630, -366683, 465467, 17717, 223875, 549756, - 108985, -91805, 230854, -120796, -56371, 248034, -256087, -185757, 173409, -74625, - -49392, -19327, 35433, 155693, 56908, 104153, -66572, 20401, 22549, 30602, - 27380, -142271, -17717, 160524, 64961, -9127, 23622, -8590, -44560, -120259, - 6979, -15569, -90194, -11811, 21475, -71941, -15032, -3221, -20938, 8590, - -62814, -30602, 39728, 46171, -20938, -9127, - }, - { - -419296, 2842195, 674310, -381178, 23622, -349503, -152471, -25233, -321586, -11274, - 705448, -302258, 1082332, 1062468, -5510980, -1090385, 2418067, -215285, -2596845, 293668, - 520228, -2036888, 1780264, 2263448, 822486, -73551, -207232, -71404, 280247, -1883343, - -825707, 1080184, 525060, 222265, -431107, -262530, 1152662, 38655, -624381, -586800, - -6442, 321586, 200790, -206158, -643171, -123480, 180389, -193274, -179315, 25233, - 16106, -232465, 24159, 148713, 80531, -22012, 108448, -318901, 129386, -70867, - -217433, 33823, 174483, 25233, -23085, 46708, 24696, 51003, -21475, 64425, - -124554, -59056, 23085, 101469, 25770, -53150, 19327, 64425, 28454, -51540, - -44560, -3221, 61740, -63351, 15032, 12885, -20938, 11274, 47245, 39192, - -30065, 15569, 66035, 55298, -38655, 34360, - }, - { - -9651328, 33630668, 1758789, -3669513, 636729, 347892, 613107, 71941, 289373, -489089, - -235686, -235149, -445603, -2507724, -601295, 3220689, -748398, -6100464, -1497333, 1246077, - 406411, 284542, 97174, 111669, 745177, 659278, 1407139, 714038, -1276142, -707059, - -644782, 416612, 936840, 1502165, -568009, -337692, 95563, -1252520, 101469, 54761, - 1074, 169651, -917512, 635118, 80531, -160524, 386547, 237834, -544924, 778463, - -47245, -176094, 377957, 468151, -233539, 37581, 205622, -130997, -291521, 92342, - 1074, 143345, -132070, -176094, 24159, -46708, -86436, 170188, -82141, 22012, - 28991, -46171, -105764, 13422, 53150, 21475, 75699, 169114, -1074, -52076, - -7516, -33286, 26307, 22012, -101469, 40265, 18254, 46708, 66572, -40802, - 19864, -70867, -75162, -537, -66035, -10201, - }, - { - -392453, 1438814, 2433636, 216359, -302795, -82678, -243203, -15032, -489626, 56371, - -537, -126165, -101469, 528281, -1304060, 1399086, 886911, 1523103, 2768643, -6198712, - -1198833, -944356, -617402, -462246, 875100, -2730526, 1899986, -2814814, -686658, -222265, - 668941, -17717, 330712, 841814, 3758, 11811, -78920, -408559, 365609, -256087, - 258235, 201863, 31675, -200253, 192737, 267899, -295816, -744640, 27380, -49929, - 220117, -25233, -408559, 120259, -6979, 301185, -125628, -165893, 27380, -142271, - -109522, 10737, 49929, 14496, 135828, 31675, 3221, 54761, 8590, -11274, - 51003, 88584, 58519, 13422, -235686, -34897, 209380, 54224, 76236, -64961, - -103079, 133144, -13422, -31675, 15569, 53150, 119722, -12348, 6442, -32749, - -39728, -49929, 30602, 62277, 4295, -49929, - }, - { - 2265059, 81658600, 2830920, -273804, 559956, -89657, -150324, 635118, 118648, -1270237, - -270583, 340376, 711891, -180389, 183073, -733366, -474594, 489089, 100932, -567473, - -690953, -346819, 519154, -141197, 142808, -75162, 80531, -1006633, -645319, -551366, - 154619, -83752, 98247, 625992, -371515, -941672, 317828, -223875, -837519, 144955, - -302795, 1066226, -238908, -338766, 307627, -261456, 124017, -110059, 109522, 192200, - 102542, -491774, -315680, 354335, 114890, 97174, -69793, -61203, 292595, 23622, - -394600, 52076, 44023, -179315, -37044, -48318, 150861, 104153, 25233, 50466, - -48318, -183073, 136902, -6442, -2147, -88584, -2684, 100395, -61203, 117575, - 93952, -78383, 48318, 8590, -65498, -109522, -38655, 105227, 59593, 537, - -19327, 55835, -15032, -12885, 16106, 19327, - }, - { - -375810, -2487860, 2430415, -339302, 450972, 1074, -40265, 166967, -103616, 190052, - -630286, -783295, -331249, -425739, -901943, -2212445, 346819, -899259, 2117956, 316217, - -216359, -1581622, 1208496, 821413, -612570, 2367601, 652298, 2363306, -130997, 1106491, - -259846, -143345, -232465, -42413, -564788, 1173600, -89657, -111669, 141734, 343597, - -34897, -248034, -3758, 10737, 119722, -192200, 250182, 224412, -341987, 30602, - 424128, -319975, -125091, 131533, 612033, 132070, -243203, -78920, -194884, 89657, - -27917, 2147, 339839, 324807, -40802, -63888, -229781, 113280, 206695, 195421, - -20401, -95026, -245887, -30602, 166430, 65498, -49929, 86436, 15032, 17180, - 11274, -142808, -1074, -90731, 11811, -44560, 25233, 12348, -10737, -23622, - 41339, -27917, -9127, 8590, -15032, 39192, - }, - { - -14398341, -38281044, -4439923, -2147484, -367220, 3758, -755914, -658741, -1401233, 458488, - 34897, -766115, 785979, 484794, 867047, 426276, 2279017, 1165010, -369367, -1036161, - -789200, -337692, 292058, 338229, 452045, 293132, -403190, 1045288, 1369021, 605590, - -788127, 362925, 288837, -539555, -1216013, 64425, -1083942, 1206886, 287226, 615791, - -81604, 1428077, 88047, 35970, 234613, 816044, 185220, -404264, 117038, -17717, - 645856, 178241, -99321, 401579, -53150, 186294, 10737, 175020, 587337, 162135, - -22012, 127238, -155693, 59056, -210990, -153545, 64961, 276489, -151398, 170725, - 136902, 103616, -44560, -104153, 68183, 133144, -201327, 110059, -101469, 76236, - 34897, -102005, -86973, -62277, 4832, 39192, -24159, 35433, 59593, 60130, - 20938, -25770, -34360, 2684, 15032, -16643, - }, - { - -621697, -70867, 2097018, -7533910, -472446, -219043, 1979443, -509491, -309238, 696858, - 1666984, -749472, -932545, -51540, 2145336, -2594697, -1689533, -1111323, -1814087, -577673, - 462246, -268435, -350577, -248034, 704912, -222801, -475131, 575526, 372052, -213675, - -659278, -998580, -496606, -210453, -68719, 386010, -607738, 555661, 259309, -378494, - -100932, 858457, -4832, -370441, -63351, -426812, 115964, -200253, -644245, -394600, - 157840, 120259, 518617, 270046, 142808, -22012, 71941, 21475, -70330, 198642, - 156766, 5906, -186294, -124554, -18254, -136365, -32212, 125091, 277562, 188979, - 11811, 123480, -55298, 63351, -76236, -79457, -53687, -1611, 14496, 33286, - -77309, 38655, 30065, 39192, 52076, 12885, -48318, -23085, -44023, -31139, - 31675, -62814, -19327, 20401, 3221, 44560, - }, - { - -944893, -41736880, -8497593, 775778, 1633161, 1294933, 6903623, -2070711, -183073, -1315334, - 275415, -319975, -970663, 738734, -1189706, -201863, -381715, -1611150, 1097364, 666794, - 139050, -562641, 361851, 293668, -124017, -3221, 523449, -638876, 341450, 147103, - 296353, 2101850, 737124, -756988, -650151, 856846, -861678, 13422, 1221381, 201327, - 440234, 163209, 321586, 689342, 661425, 463320, -44560, 274341, 485331, -183073, - 59593, 105764, 545998, -165893, -192200, -220117, -83215, 70867, 241592, 89657, - -241592, 10201, -183073, -285078, 0, 13959, 19864, 29528, -103079, -70867, - -76236, 6442, 32212, 72478, 9127, 61203, 36507, -95563, -46708, -3221, - -53687, 122407, 16643, -38655, -8053, -1611, 28991, 0, 32212, -7516, - 26307, 42950, -31139, -18254, 537, 45097, - }, - { - -575526, -3608310, 1736777, 1779190, -994285, 483184, 688269, -205622, 470299, -373125, - -1245004, -1477469, -479963, -3882651, 2180770, 2276333, 657667, 155693, 411780, 1470489, - -1560147, -3040837, -572304, 1369558, 1338956, -883153, 1105417, 597537, 1637456, 544387, - 1822677, -380641, 95026, 238371, -310848, -328028, -655519, -161598, 391916, -8053, - 302795, -433792, -400506, 522375, -148176, 195421, 310848, 191126, 281857, 574452, - 121870, -176631, -63888, -142808, 150324, -185220, -106837, 31139, 134755, -207232, - -2684, 155693, -31139, -66572, -236760, 136365, 42950, 13959, 135291, 17180, - 172872, 92342, -52076, -22012, 48855, 104153, 132607, 44023, -78920, -71941, - -52076, -35433, -55298, -52613, 12885, 14496, -40802, -16643, -5369, -40265, - -16643, 6442, 11811, 17180, -30065, 26844, - }, - { - -3145527, -11296838, 5266704, 5399848, -2041720, 522912, 1471563, 1081795, -819265, -1252520, - -199179, 1306207, -1961190, 5887864, 1920924, -1240172, 210990, 411243, 461709, 650151, - 1214402, 348966, 619549, 1049046, -404264, -370441, 248034, 552977, -637803, -321049, - -363998, 133144, -206695, -967978, -283468, 587874, 496069, -727460, -505196, 472983, - 238908, 44560, -236223, -775778, -437550, -373662, -40802, -351114, -215822, 45097, - 256087, 112743, 133144, 90731, 142271, 126165, 335007, 292595, 94489, 15032, - 279710, -256087, -198642, -159451, 18790, 32749, -216359, -16643, -12348, 154082, - 33286, -161061, 53150, -129923, -1611, 45097, 93952, 32212, -60130, 20938, - 28991, 23085, -23085, -20401, 9664, 87510, -162672, -65498, -80531, -59593, - -63888, -32212, 31139, 13959, 56908, 44560, - }, - { - -57445, -1005559, -311385, 9664, 172336, 359167, 833224, -13422, 709743, -230318, - 761820, -130460, -2713883, 2672544, 29016262, -73551, -4534949, -1241782, 365609, 2869038, - -2988760, -1271310, -1518271, 1864553, 740345, -974958, 1028645, 1398549, 1711008, 635118, - -1427540, -159451, -414464, -427886, 207232, -275952, 660351, -762357, 253940, -106837, - 227633, 307627, 343061, -158914, -120259, 328028, 246961, 446140, 266288, 30602, - -86973, 420907, -115427, -40265, 352187, -186294, -206158, 163746, 27380, -235149, - 26307, 45097, -181999, -24696, 115427, 151398, 10737, -38118, 27917, 161598, - -127775, -79457, 26844, 103616, -127775, 537, 163209, -42950, 111132, 40802, - 14496, 90731, -64961, -63351, -3221, -22012, -69793, -61203, 78920, -67109, - 28991, 15032, 35970, -18254, 20938, 2684, - }, - { - -2558190, -20994874, -4712116, 2462090, -1457068, 1780264, 838592, -1673964, -920197, 383863, - 627065, -285078, 602369, -3765076, -6291590, 3503620, 2058363, -1183800, -1022202, 425739, - -487479, 343061, -478889, 587874, 551366, -549219, -117575, -518080, -578210, -598611, - -760209, 290447, -772557, 362925, -874026, -631360, -405874, -92342, 482110, -488016, - -82678, -164819, -297963, 4295, 268972, 524523, 10201, -468688, -194884, 202400, - -396748, 45097, 519154, 952946, -22012, 285078, -248034, -262530, -130460, -51540, - -22549, -103616, -41876, 5369, 175020, -227096, -122407, 1611, -109522, -32212, - 47782, -134755, -235149, 168041, 33823, 25233, 0, -57982, 204548, -23085, - -135828, 90731, 85362, -52613, 9127, 28991, 17717, -61740, 64961, 15569, - -44560, 6442, 16106, -57982, -4295, 10737, - }, - }, - { - { - -420907, -13728863, 4188130, -1656247, 260919, -64425, -547608, 235149, -324270, 432181, - -1810329, -841814, -1306744, -2453500, 2128693, -2066416, -2739652, 959925, 251792, 1389959, - 1435056, -152471, 180926, 117038, -542240, 855235, 120259, -352724, -373125, -1207423, - -825707, -292058, 17717, -1010928, 286152, -452045, 161598, -1850057, 595390, -125628, - 133681, -100932, -257698, -148713, 600759, 198105, -307090, -69793, 104690, -370441, - 40265, 115964, -221728, 265214, -19864, -53150, -222265, -107911, 249108, 178241, - 23622, 239444, 83752, -118112, 38118, -9127, -220117, -39728, -55298, 7516, - -125628, -39728, 37581, -62277, 62814, -28991, -26844, -23085, 17180, -47245, - -39728, 54224, 81604, 115964, 27917, -104690, -44023, -42413, 63888, -41876, - 50466, 29528, 26844, -12885, -43487, 6442, - }, - { - -3755949, 30678414, 3688840, -3474629, 730144, 422517, 31139, -164819, 444529, 765041, - -100395, 1169305, -296890, -545461, 473520, -1321776, 1197222, -462783, 3106335, -1211718, - -258235, -39192, -638340, 127238, 758062, -40802, -88047, -169651, 598074, 807991, - -229244, -258772, 509491, 267362, -247497, -622233, 462783, -367757, -492311, -122943, - 750009, 379568, 408559, -69793, 179852, -260919, 266288, -398895, -482110, 74088, - -39728, -13422, 178241, 150324, 137439, -194884, -52613, 272730, -55835, 78383, - 212601, -56371, 190589, 19327, 28454, -33286, -86973, 245887, -4295, -98784, - 92879, -134218, -9664, 0, -116501, 52613, 40802, 16106, -53687, 19327, - 24159, -51540, 25233, 18790, 29528, -60130, 45634, 34360, -19327, 45634, - -17180, -63888, 62814, -42413, 47245, -15032, - }, - { - -4315369, 28423556, 10511932, 7090991, -328565, -93416, -161598, -115427, -209380, -408022, - 32212, 54224, 867047, 359704, -491237, -2458869, -181462, -423054, -202937, 392453, - -2805688, -658741, -461709, 375810, 509491, -313533, 502511, -48318, -639950, -244276, - 710817, 132070, 836445, -767189, 1157494, -295279, 396748, -386010, -91268, -60130, - -489626, 245887, 442382, 203474, 556198, 59593, 625992, -73014, 150324, 75699, - -435939, -22012, 468151, -104690, -264141, 91268, 92342, -1611, 145492, -273804, - 204011, 372588, -25770, -177167, -1074, 39728, -11274, -83752, -33286, 29528, - -53687, -101469, 8053, 125628, 3758, -42950, -26307, 45097, -26844, -112743, - -2147, 48855, -10737, -36507, 42950, 27380, -40265, -4295, -11811, -10737, - 21475, -17717, 44560, 5369, -14496, 33286, - }, - { - 391379, 2714956, -2147, 35433, -2684, -246424, 59056, 365072, -30602, -314606, - 75162, -724239, 521839, -126702, -4798552, -111669, 802085, 1584306, -1680406, -1547799, - 819802, -948651, -111132, 381715, 11811, 183073, 930397, -392990, -183610, -777389, - -125628, 994285, -4832, 428960, -736587, -390305, -161061, 74625, 273267, -320512, - 307627, 210990, 137976, 22549, -319438, 168577, -64425, -333934, 83215, 85899, - -62277, 48318, 80531, 82678, 179315, -321586, 55298, -77309, 163746, 60666, - -122943, 137439, -34360, -93416, 1611, 19864, -20938, 119185, -61740, 65498, - -184684, -53687, -68719, 72478, -88047, -31139, 110595, 50466, -60666, -20401, - -46708, 38118, 46708, 17180, 1611, -27380, -35433, 41876, 61203, -5369, - -12885, 32749, 32212, 6442, -11811, 42413, - }, - { - 590021, 42856796, -205622, -3670587, 912144, -253940, -269509, -313533, -97174, -159988, - 1919314, -656593, 750009, -178778, -242129, 1691143, 579821, -4343286, -852014, 981400, - 616865, -178241, -1366337, -1117228, 366146, -314606, 821949, 237297, -731218, -6979, - -332860, -436476, -268972, 690416, -60666, 694711, -22549, -466541, 411780, -81604, - 109522, 235686, -370441, 406411, -253940, -116501, 60130, 248034, -248034, 581968, - 129923, 116501, 18254, -130997, -401043, 281857, 81068, -413927, -250182, 138513, - -42950, 106300, 62277, -150324, -71941, -3758, -183610, -15569, -150324, -23085, - 15569, -107911, -118648, 145492, 60666, -56371, 31675, 5906, -24696, -53150, - -13959, -28454, 31675, -46171, -102542, 47245, 537, -2684, -39192, -34897, - 67109, -31675, -51540, 15569, 12348, 38655, - }, - { - -11274, -753230, -2086280, -590021, -104153, -12348, 75162, 222801, -253403, -234076, - -102005, 118112, -239444, 1885491, 2019172, -1341104, -2610803, 202400, -1705639, -7166153, - 2646237, -160524, 1494649, -1082332, 77846, -1749125, 1335735, -1105417, 718333, 609885, - 1204202, -2684, -222801, 709743, 68183, -322123, 171262, 12885, 499827, -345208, - 708133, 183610, 194884, 193810, 28991, 230318, 48318, -268972, 244813, 51003, - 173409, -212601, -216359, 369904, 150324, -5369, -120259, -88047, 112206, 60130, - -137439, 286689, -33286, -292595, -40802, 17717, 54224, 23622, -53150, -44023, - 164819, 79994, 99321, 116501, 4295, -28991, 137439, 65498, -2147, -45634, - -25770, 57445, -81068, -25233, 56371, -4295, 3221, -31139, 4832, -9127, - -17180, -27917, 44023, 22549, -19327, -66035, - }, - { - -12330314, 62147104, 1928977, -1112397, -108985, -35970, -20938, -329102, -637266, -935229, - -231391, 218506, 1196685, -1054951, -430570, -1235877, -89657, 434865, -391379, -248571, - -204011, 150324, 298500, -337692, 30065, -176631, 387621, -1035624, -726923, -628139, - 544924, 893890, 135291, 145492, -705448, -501437, 205085, 32749, -247497, 543850, - -83752, 524523, -283468, 120259, 348966, -2147, -77309, 215285, 115964, -195958, - -10201, -346819, -58519, 280784, 330176, 156766, -118112, 20938, 356482, 38655, - -361851, 71404, 188979, -86973, -117575, -13422, 154619, 74088, 1074, -7516, - -40265, -144955, 110595, 32212, 83752, -17717, -7516, 78383, -13959, 58519, - -55835, -62814, 115427, -3758, -143345, 34360, 12885, 53687, -19327, -30065, - 9664, 23085, 41339, -15032, 7516, 26844, - }, - { - 233539, -185757, 549219, -835371, 431644, -58519, 119185, 77309, -433255, 93416, - -474057, -381178, -55835, -1516124, -1246077, -1114544, 1891933, -503585, 870268, -600222, - 192200, 929324, 450972, -310848, -1098975, 1309965, -120259, -433255, -343061, 1014686, - -360777, 667867, 287226, -382789, -551903, 460635, 207232, -61203, 105764, 238908, - 67109, -179315, 149250, 115427, 54761, -157303, 307627, 81068, -527207, -154082, - 177704, -103616, -325344, 118112, 309238, -142271, -179315, -82678, -222265, 470836, - 213675, 210990, 301185, 168041, 12348, 96100, 8590, 30065, -1074, -16106, - 86436, 66035, -72478, 38118, 41339, 2684, 78920, 42950, -20938, 20938, - -35970, -118648, 38118, -22012, 64425, -32749, 67109, -17717, 12348, 37581, - 30602, 41339, -8053, 1611, -12885, 12885, - }, - { - 11541114, -9109626, -4517769, 555661, -724239, -137976, -220117, -562104, -154619, 1038308, - -415538, -1229971, 269509, 228707, 339839, 220654, 116501, -705448, -380641, -242129, - -274341, -578210, 301721, 217433, 97711, 96100, 186831, 670015, 1103270, 427349, - -667867, -418222, -210453, -11811, -440234, 856309, -28454, 530428, -1504849, -107374, - 302258, 716723, -314606, 454193, -285615, 221728, -151934, -774168, 171262, -127238, - 200790, -161598, -205085, 265751, -180926, 28991, -135828, -141734, 149787, -52076, - 243203, 317291, -167504, 121333, -85899, 115427, 186294, 229244, -84826, -10737, - -128849, 47782, 16643, -89657, 95563, -11274, -127238, 234613, 9127, -2684, - 42413, -108985, -57982, -106300, -2684, -15569, -3221, 47782, 60666, 22549, - -68183, -31139, -40802, 45097, -5369, 4832, - }, - { - 556735, 1262184, 4275640, -3441343, 1693291, 1751810, 2669859, -651224, -173409, -189515, - 144418, -1204738, 1104344, 266288, 2174327, -1545115, -1376537, -286152, -1573032, -1038845, - -266288, 939524, -194347, 159988, 647466, 121870, -125628, 513249, -476741, 501437, - 57982, -281857, -361314, 275415, 554051, 809601, -164283, 629213, 183610, 34360, - -229781, 272730, -154619, -136902, 395674, -499290, 241055, -168577, -237834, -137439, - 376883, -7516, 161598, -226560, -269509, -302258, -83752, -9664, -37044, 67109, - -5369, 151398, -16106, -35433, -33823, -134755, 64961, 205622, 144418, -36507, - 26307, -22012, -159451, 92879, -89657, -6442, -97174, -24696, -23622, -28454, - -70330, 18254, 47245, -14496, 52613, -15569, -30065, 39192, -21475, 46708, - 11274, -537, 13959, 31675, 22012, 26307, - }, - { - 3155190, -30333206, 1511829, 3597035, 1007170, -2369211, -1609002, -2608119, 329102, 157303, - 90731, 60666, -523986, 818191, -639950, -1076963, -1540820, -1394791, 772020, 179852, - -230854, -11274, -244276, 168041, 162672, 130460, 590558, -329102, 433255, 266825, - -309238, 666257, -266825, -512175, -206158, 234076, -699006, -412317, 108448, 352187, - 307627, -382789, 118648, 76773, 135291, 14496, -424665, 155156, 488016, -224412, - 141197, -5369, 274341, -246424, -53687, -402653, -25770, 284542, 179852, -76773, - -328565, 55835, -6442, -104153, 218506, 37581, -3758, -73551, -103079, -11811, - -18790, 24159, 84289, 102542, -56371, 22012, 57445, -134218, -28454, -15032, - 49929, 92342, -53687, 75699, -16106, 54761, -2147, 30602, 25770, -34897, - 39192, 16643, -67646, 5906, 39192, 17717, - }, - { - 370978, -4898410, -1399086, 818191, -22012, -99858, -89121, -375273, 302258, -213675, - -581968, -801548, 1472100, -2479270, -1732482, 1553168, 580894, 159451, -569620, 476205, - -142271, -1574642, -281857, 439160, 1147830, 281320, 107911, -1028645, -6979, 89121, - 198642, -809064, -520228, 1060320, -312996, -17180, -228707, 461709, 208843, -20938, - 125628, -203474, 63888, 306553, -252866, 266825, 107374, 105227, -48855, 286689, - -27380, -95563, 221191, -537, 92879, -116501, -142808, 7516, 272730, -187368, - 250719, 57982, -72478, -100932, -119185, 281320, 57445, 96637, 17180, -53150, - 161598, 51003, -66572, -25770, -34897, 15032, 51540, -79994, -54224, -57982, - -28991, 13422, -69256, -83215, 13422, -42950, -47782, -5906, 32212, -7516, - -11811, 39192, 15032, -40802, -25770, 39192, - }, - { - 2363843, -8316131, -1479616, 721555, -1406065, 1833951, -466004, 232465, -580894, 260919, - -480499, 587337, -746251, 4898947, 1037235, -1003412, 905164, -230854, -1263257, 1028108, - 295279, -311385, -112743, 607201, -209380, 1194001, -171799, 38118, 406948, -13422, - -301185, 115964, 814433, -73551, 158377, 570157, 557272, -352187, 83752, 305480, - -501974, -282394, 380105, -142808, -82678, -283468, 200253, -515396, 30065, -221191, - -66572, 70867, 117038, 351650, -44560, -35433, -104690, -40265, -20938, 63351, - 170725, -212064, -17717, -42413, -63351, 39728, -97711, -57445, 151934, 144955, - -124017, -70330, 151934, -82678, 12348, 49392, 56371, 91268, -6442, 29528, - -89657, 24696, 82678, 5906, -53150, -46171, -179315, 20401, -40802, 6442, - -9664, 1611, 70330, -28454, 42413, -4832, - }, - { - 283468, -759672, 609349, -257698, -221191, -273267, -46708, -402653, 231928, -1142461, - 267362, -310848, -1400696, -6399502, 9696426, -2450279, -1628330, 4832, 1355062, 2818572, - -1075352, 660351, -878321, 1395328, 220117, 312459, 1387274, 400506, -1388348, 502511, - -297427, 230854, 322123, -162135, -397821, -549219, 52076, -548682, 401043, -355945, - 594853, 144418, -250719, -258772, -215285, -194347, -45634, -70867, 43487, -244813, - -37581, 277025, -184147, -83752, 156766, -216359, -12885, 267362, 246424, -132070, - 266288, 22012, -88584, -57445, 64425, -105227, -92342, 51003, 47782, 115964, - -96100, 50466, 42413, 77309, -35970, 74088, 1074, 40265, -29528, 1611, - 74088, 5906, 24159, -32212, -57445, -24159, -18254, 45097, 27917, -53150, - 59056, -23622, -40802, 5906, 27917, -33286, - }, - { - 4153770, -7581154, 144955, 4913443, -285615, 1046361, -1117765, -593242, 427349, 351114, - 1406065, 205085, -202400, 1501091, 3253975, 2126546, -458488, -263067, -414464, -89121, - -1355599, 908386, -248571, 685047, 382252, -741419, 849867, 1270237, 152471, -599148, - -352724, 476205, -753230, 216896, -688269, 376883, 310848, 239981, 658204, 148713, - 1169305, 192200, -332860, 208843, 256624, -16643, 208843, 185220, 173409, 336618, - -319438, -46171, 139586, 245887, -238908, 113817, -170188, -127775, -329102, -51003, - -2684, -215822, -104690, -16643, 179852, -216896, -16643, 60130, -39192, -4295, - 45097, -42950, -42950, 86973, -30602, 15032, -25233, -31675, 97174, -93416, - -51003, 93416, 30602, -12348, 48318, 49929, 15569, 21475, -4832, -15569, - -6442, -1611, 18790, -8590, 8590, 4295, - }, - }, - { - { - 716186, -4162360, -6356552, -1214939, 137439, -404801, -47245, 169651, -142808, -930397, - -1529008, -766115, -1911261, -1285269, 1402844, -1446330, 170188, -1262184, -711891, 1624035, - 984084, -709207, -1330903, -1134408, -696858, 688269, 1264868, -330712, -406948, -906238, - -874563, -243203, -2035278, 488553, -142271, 248034, 56371, -950798, 876710, -609349, - 234613, -620623, 207769, -311922, 521302, 255014, 83752, 319438, 123480, -279173, - -357019, 106837, -149250, 63888, -59593, -77846, 16106, -71404, 490700, -68183, - 27380, 11811, 17180, 11274, -15032, -158914, -151934, 5369, -115964, -99321, - -136902, -10201, 42413, 18254, 13422, 41876, 3758, 13959, -58519, -34360, - -26307, 63888, -10201, -14496, -38655, -34897, 45634, -24696, -1611, 23622, - 69256, -11811, 19864, 24159, 4832, 40802, - }, - { - 2847563, 40094592, -9911174, -312459, 676457, 48855, 484794, 1220308, 879395, 707596, - 677531, 202937, 151398, -381715, 249108, 765041, 1608465, 724239, -291521, -13422, - -546535, 359704, -197569, -385473, 379031, 132607, 308164, 198105, 434865, 289910, - 151398, -15032, 601832, 579284, -262530, -930934, 241055, 194884, 219043, 354872, - 721555, 236760, -438087, -106300, 126702, -108985, 262530, -150861, -106837, -180389, - 18254, 79457, -76236, -46708, 82678, -71941, 13422, -223338, 85362, 81068, - -8590, -56908, 150324, -4832, 131533, 41339, 78383, 61740, -128849, -21475, - 2147, -31139, 76773, -46708, -41876, 111132, -77846, 34360, 107374, -23622, - -13422, -31139, 31675, 5906, -55298, 5369, 67646, -46171, 15032, -2684, - 12348, -8590, -3758, -16643, 22012, -21475, - }, - { - 2377801, 41044320, -3331284, 3745212, -2715493, -81068, 159451, -121333, 155693, 14496, - 421981, 366146, -488016, 974421, -545998, -1364189, -1617055, 342524, -185757, -784905, - -335007, -642635, -214212, 278099, -41339, -625455, 354872, 528818, 110595, -355945, - -833761, 874026, -285078, -72478, 867047, -44023, -136365, 214748, -418759, 85899, - -399969, -55835, 765578, -179852, 161061, 655519, 621697, -122943, -39728, -265214, - -197032, 224412, 290447, -264677, 248571, -297963, 26307, -104690, 23085, 2147, - 100932, 100932, -28454, -178241, -129923, -6979, -122943, -95026, 2684, -74625, - -130460, -33823, -8590, -35433, 60130, -52613, -24159, -1074, 80531, -26844, - -17717, -21475, -1074, -45634, -537, 89121, -20938, 39192, 12348, 32749, - 5906, -35970, -4832, -18790, -4832, 14496, - }, - { - -475131, 3075197, 625455, -15569, -265751, 114354, 41876, 240518, 153008, -180389, - -51540, -224412, 289373, -1302449, 114354, -1439351, -500364, 1522566, -270583, -1465121, - 914291, 523986, -478889, 306016, -503048, 64961, 2287070, -812286, -732829, 1190243, - -435402, -62814, -17717, 490163, -469225, -61203, -673773, 257161, 166967, -158377, - 297427, -103616, 299037, 199179, 48318, 113817, -510564, -126165, 4295, -172872, - 71404, 144418, -180926, 0, 31139, -331786, 105227, 96637, -42413, 252866, - 61203, -112206, -57982, -16106, -71941, -69256, 0, 81068, -108985, -30065, - 8590, 59056, 39192, -135828, -537, -41876, 5369, -13422, -129923, 11811, - 10201, -11811, -13959, 8590, -27380, 31139, -1611, -9127, -22549, -11811, - 28991, -2684, -51003, -38118, 11811, -26844, - }, - { - 4916664, 33770256, 1356673, -2546379, 115964, -88047, -632434, -580894, 387084, 234613, - 450972, -545461, 1287417, 313533, -63888, 803696, -1522566, -2695629, 483184, 439697, - 812823, -88047, -858457, -577673, 378494, -263604, -61740, 419296, 235149, 11274, - -56908, -486405, -307090, -106300, 360777, 1171989, -339839, 623844, 87510, -97711, - 542240, -49392, 354872, -380641, 98247, -219580, -130460, -27917, 32749, 178241, - 116501, 159988, -98784, -205085, 62814, 35433, -69793, -288300, 158914, -59056, - -10201, 213138, 60666, -122943, -71941, -135828, -49392, -71404, -105764, -105764, - 5906, -2147, 67109, 155156, -27380, -27917, -67646, -137976, 32212, -59056, - -11811, -40265, -6442, -83215, 47782, 32749, -48318, 38655, -2684, -1611, - 34897, 17717, 24696, 35433, 41876, 10201, - }, - { - 268435, -4611721, -535260, -356482, 44023, 105227, 71941, -20401, -237297, -275952, - 190589, 95563, 62277, 1948305, 5995238, -3065533, -2234994, -695248, -447750, -4773856, - -1451699, 757525, 747324, -1860795, 691490, 768799, -785979, 1314797, -620623, 440771, - 631897, 559956, -278636, -227633, 183073, -135291, -304406, -79457, 277562, 76773, - 64425, 193274, 392990, 352724, -232465, 96100, 178778, 193810, 281857, 144955, - -169114, -209917, -61203, 375810, 93416, -155693, -62814, -28454, 89121, 67646, - -111132, 224949, -82141, -207769, -91805, -83752, 92879, 59593, -20401, 54224, - 140123, -22549, 94489, 68719, 35433, -89121, -40802, -51540, -16643, 35970, - -8590, -46708, 12348, -37581, 52613, -1611, -20401, 3758, -42413, -18790, - 50466, 23085, -10201, -40265, -41339, -12885, - }, - { - 13826037, 34382824, -5223217, -555125, 81068, -158377, 125091, -600222, -644782, 121333, - -526670, 106837, 294205, -615791, -797253, -1037235, 502511, -524523, 76236, 283468, - 604517, 208306, -389768, 274341, -234613, 117575, -145492, -793495, -145492, -183073, - 570694, 358093, 156229, -211527, -557272, 88047, -272730, 255014, -194884, 400506, - 297963, -80531, 173946, 287763, 26844, 96100, 206695, 541166, -176631, 19864, - 74088, -103079, 301185, -37044, 247497, -10201, -210453, 142808, -39192, -99321, - -100395, 24696, 49392, -13959, -25233, -22549, -127775, 121870, 62814, -129923, - 41339, 88584, -67646, -37581, 22549, 37581, -10737, -6442, 49929, -39728, - -37581, 5369, 16106, -63351, 13959, 26844, -9664, -6979, 12885, 16643, - -38118, -1611, 18790, 27380, 47245, 44560, - }, - { - 332323, 739271, -2580739, 249108, 19864, 163746, 156229, 7516, -135291, -293668, - 153008, -171262, 596464, 303869, 89657, -1800128, -526134, 930934, 164283, -435939, - 2010045, 1086090, 488016, 832687, -81068, 584652, -1021129, -16643, -608812, 424128, - 190052, 817654, 812286, -758599, 204011, -47782, 129386, -51003, -161598, 108985, - 153008, 99321, -221728, 306016, 97174, -110595, -83752, -99321, 83752, -338766, - -165893, -78383, -109522, -120259, -42413, -235149, -354335, -44560, 164819, 210453, - 212601, 115964, 110595, 98247, 73014, 242666, 52076, -75699, -44560, -82678, - 82141, 81604, 56908, -18790, -80531, -2684, 38118, -35433, -46708, -47245, - -13959, 2684, 18790, 70330, 27917, -35970, 25233, -10737, 3221, 6979, - -11811, 66035, -4295, 19327, 12348, 537, - }, - { - -7164543, 6222871, 5189394, 1023276, -1024350, -484258, 91805, 81068, 332323, -286689, - 230854, 631360, 660351, -986769, 165356, 573915, -1457605, -152471, -112743, 49392, - -367220, -259846, 243203, 154082, 423591, -313533, 245350, 532576, 914291, -428960, - -191126, -450972, -102542, -185220, 411780, -316217, 916976, 484794, -1488743, -607738, - 698469, -582505, -352187, 34897, -37581, -177167, -380641, -589484, 215822, 206158, - -211527, -210453, 157303, -71941, -64961, -95026, -72478, -184147, -168041, 122943, - 386010, 121333, -3758, 83752, 173946, 276489, 135291, 35433, -28991, -120796, - -17717, 83752, -51003, -157840, -34897, 52613, 107911, 50466, 88047, -40802, - 16643, -20938, -11811, -11274, 54761, 1611, -40802, 8590, 16106, -22549, - -49929, -14496, 12885, 20401, -33823, 22549, - }, - { - -433792, 4466766, -1309965, 3266860, 507880, 140123, 891206, 573915, 202400, -284542, - -1180042, 171799, 892816, 601832, 565862, -611496, -687732, -998580, -2317672, -1201517, - 1031329, 470299, -563178, -215822, -42950, 336618, 353261, -430570, -596464, 641561, - 117575, -150324, 220117, -435402, 468151, 1017370, -42950, -379568, 53687, -245887, - -56371, -370441, -69256, 40265, 183610, -303869, -49929, -172872, 124017, -157303, - 94489, -331786, 17180, -214748, -51540, -56371, -198105, 35433, -117038, -154082, - -53150, 47782, 226560, 146029, 33823, 84289, -43487, 58519, -106300, -137976, - 101469, -56908, -49392, -26307, -26844, 31139, -13959, 17717, -13422, 9127, - 20938, 29528, -13959, -44560, 3221, -30602, 8590, 49929, 3758, 5906, - -42413, 36507, -5369, -6442, -9127, -33286, - }, - { - -4305705, -21407190, 7158100, 1763621, 155156, 1628330, -8766565, 292058, -753230, 727460, - 21475, -150861, -15569, -1216013, 1373316, -1360431, -1694902, -1450088, -558346, 636192, - 338229, -69256, 3221, -248034, 205085, 205085, 71941, 141197, 227633, 61740, - -634581, 38655, 78383, -273804, 41339, -379031, -97174, -532576, -537, -59593, - -554588, -310311, 368830, -78920, 85362, -156229, -22012, -230854, 95563, 13422, - 33286, 186831, -231928, -54224, 195958, -248571, 194347, 11811, -92879, -39728, - -57445, 5369, 7516, 86436, 159988, 2684, 44560, -33286, -10201, -28454, - -1611, 61740, 107911, -85362, -75699, -68719, -8590, -55298, 31139, -25770, - 103616, -14496, 23085, 60130, -32212, -18254, -63351, 16643, -13422, 47245, - 10737, -20401, -11811, 39728, 20401, -30065, - }, - { - -233002, -5669357, 492311, -368293, 367220, -294205, 125628, 71404, 79994, -56908, - -531502, -574452, -1718524, 3309272, -3013457, 1103807, 1115618, -991601, -1386201, -306553, - 889058, 695248, -789200, -389768, -316754, 1279900, 318901, -1424319, -228707, -46171, - -965831, 396748, -270046, 995896, -285078, -73014, -158914, 294742, -297963, -163746, - 110059, 226023, 5906, -41339, -46171, -28454, 335007, 154619, -359167, -103079, - 110595, -37044, 157840, -109522, 105227, 130997, 18790, 310848, 191126, 68719, - 147103, -89121, 101469, -26307, 139586, 110595, 59056, 46708, -28454, -6442, - 34897, -4295, -48318, -59593, -84826, -71941, -68719, -116501, -4832, -6442, - -20401, -22012, 10737, 8053, 23085, -16106, 46171, 51003, 17717, 6979, - -24159, -6979, -2147, -5369, 17717, -36507, - }, - { - -1242856, -884763, -2866354, -3263638, 165356, -750009, -2830920, 731218, 796180, 318364, - -819265, -56371, 2432025, 1014686, 88047, 510564, 1066226, -623307, -1097364, -283468, - 278099, -128849, -246424, 41339, -400506, 586800, 163209, -57445, -455267, 161061, - 57982, -139050, 271120, 456340, 261456, 361851, 55835, -69256, 374736, -46708, - -200790, 171262, -188442, 713501, 71404, 119722, 92342, 150861, 131533, -270583, - -119185, -49929, -274878, 173946, -198105, -98247, -59056, -41339, 116501, 57445, - -103079, -10737, 101469, -156229, -31139, -43487, 79457, 17717, 108985, -9664, - -40265, 91268, 39728, -9664, -73014, 105764, 40265, -10201, 62277, -34360, - -35970, 86436, 62814, 23085, -128849, -86436, 33823, 75699, -1611, 33823, - 10737, 27380, -15032, -45634, -24696, -70867, - }, - { - -450435, 1248225, 42950, -752156, 29528, -455803, -599148, -121870, -237297, -499827, - -424665, -631360, 700080, -797253, -8633421, 286152, -163209, 638876, 724239, 790811, - 304406, 189515, -260382, 770947, 285615, 913754, 458488, 57445, -2070174, 625455, - 541703, 748935, -33823, 321049, -183610, -284542, -229781, 72478, -44023, 239444, - 329102, -476741, -82141, -47245, -279173, -178241, 171799, -319975, -122407, -327491, - 17180, -81604, -20938, 46171, 97174, -21475, 125628, 97711, 40802, 275952, - -30065, -216359, 46171, -32749, -60666, -8590, 24159, -48855, -3221, 10737, - -44560, 198642, 35433, 19327, -9664, 59056, 11811, 165356, -57445, -41339, - -12348, -70330, 53150, 7516, 5906, 60130, 37581, 18254, -46171, 31139, - -49929, -70330, -34897, 42950, -4832, -32749, - }, - { - -2711198, 4642323, 909996, 1167694, 592706, -1551557, -1099512, -473520, 508954, 824097, - -195958, 1087164, -1190780, 380105, 6177774, 200790, -2452963, 1817308, -1389959, -359167, - -294205, 571768, 292595, 73551, 461172, -36507, 1287417, 679679, -28991, -413927, - -319438, -7516, -156766, -572841, 503048, 578210, 912681, 75162, 273804, 484794, - 537945, 186831, -80531, 275415, 220117, 105227, 653372, 179852, 115964, 17180, - -207232, -68719, -180926, -134218, -162135, -106300, 537, -75162, -247497, 38655, - -70867, -48855, -31139, 127775, 71404, 32749, 16106, -22012, -44560, 52076, - 0, 65498, 132070, -153008, -51003, -25770, 48318, 15032, -19864, -46708, - 85899, -15032, 6442, 34897, 1074, 1611, 30065, -33286, -83752, 44023, - 8053, 25233, 19327, 20401, 18790, -33286, - }, - }, - { - { - -461172, 4959614, 3001645, 279710, -566399, -225486, 168577, 77846, 71404, -647466, - 238908, 461709, 1111860, 762357, -945967, -769873, 2637110, -639413, -471910, 1320703, - -73014, -1875290, -67109, -420907, -525060, 126702, 226023, -199716, 13959, -603980, - -359704, 296890, -769336, 1080184, -37044, -186831, 122407, -943819, -112743, -650151, - 264141, -303332, 818191, -213675, 314069, 217970, 198105, 316754, 284005, -105764, - -443992, 96637, -125628, -218506, -8053, 74088, 54224, 34897, 159988, -232465, - 4832, -184147, 70330, 121870, 25233, -55298, 56371, 84289, -125091, 66035, - 6442, -10737, 44560, 57982, -31675, 30065, 13959, 6442, -16643, 36507, - -67109, -30065, -71404, -30065, -13959, 57445, 64961, -18790, 2684, 54224, - 1074, -19327, -19327, 42413, 32749, 27380, - }, - { - -3690988, 61022896, 9088688, -795643, 906775, -369904, 752156, 726923, -334471, -34360, - 39728, -614717, 209917, 375810, 921271, 1669132, 987843, 586800, -350577, 96100, - -224412, 242666, -108985, -431107, 34360, 186294, 255551, 178241, -252329, -207232, - 709207, 292058, 552977, 585726, 1611, -569083, 547071, 221728, 276489, 211527, - 211527, -9127, -265751, -139586, 74088, 3758, 86973, 279710, -31675, -335007, - 158377, 93416, -138513, -45097, 111669, 16643, -133144, -209917, 68719, -106300, - -127238, -69793, 52613, -49929, 152471, -79994, -40265, -86973, -48855, 122943, - -9664, 16643, 12348, -40265, 75162, -3221, -63888, 38118, 69793, -32212, - -26844, -5369, -4832, -47782, -33823, 86436, -9127, -23622, -11274, -16106, - 46708, 20938, -12885, 8590, -9127, 0, - }, - { - -2154463, 44386340, 427886, 1009317, -1976222, 383326, 10737, 63351, 334471, 18790, - -584652, -248571, -496069, 986232, -11274, -258772, -1457068, 238371, 175557, -13959, - 1107028, -332323, -398358, -683974, -117575, -416075, 579821, 389231, 418759, -28991, - -914291, -29528, -619549, -281857, -108985, 63888, 83215, 452045, 36507, 53687, - -406411, 142271, 579284, -275952, -176094, 521839, 321586, -265751, -162135, -288837, - 63351, 130997, 110059, -164283, 538482, -258772, -128312, 137976, 155693, 10201, - -126165, -133681, 47245, 4832, -135291, -14496, -136365, 50466, -28454, -108448, - -60666, 25770, 22012, -40802, 72478, -44023, 38118, -40802, 83215, -32749, - -65498, -63351, 3221, 12885, -6442, 50466, -3221, 9664, -3221, 31675, - -40265, -537, -9127, 5906, 8590, -8590, - }, - { - 406948, 2922725, -714038, -100932, -22012, 187368, -70330, -24696, 32212, -32212, - 265214, 14496, 263604, 826244, 4883915, 253940, -402116, 1023813, 481036, -1008244, - 452045, 143345, 560493, 1082869, 139586, 915365, 1878511, -210990, 155156, 1131724, - -690416, -422517, -320512, 37581, -149250, 288837, 358093, 107374, -197569, -44560, - -62277, -308164, 91805, 287226, 89657, -74088, -405874, 210453, 40265, -243203, - -22012, -250719, -177704, -64961, -11811, -60130, 24159, -63351, 5906, 77309, - -52076, -159451, -39728, -53687, -28454, -10201, -8590, -43487, -100395, 537, - 113817, 45634, 35970, -103079, 140660, -12348, -51003, -1074, -32212, 25233, - 52076, -26307, -3758, -28991, -12885, 38118, -9127, -23622, -55298, 23085, - 38118, -35433, -43487, -7516, -8590, -33286, - }, - { - -6746857, 15927886, -1900523, -2294050, 293668, -3221, 52613, 75699, 660351, -366683, - -1090922, -274878, 464393, -126165, -622770, 107911, 192737, -888521, -103616, 339302, - 289373, -175020, 548145, 585726, 22549, 43487, -338229, 214748, 723165, 472446, - -133144, -274341, -343061, -226560, -54224, 453119, -363998, 160524, -217433, 70867, - 362925, -271120, 197032, -304406, 197032, -362388, -128849, -143881, -254477, -82678, - -86973, 100932, 106300, -113280, 62277, -79994, 44560, -98784, 175557, -29528, - 173946, 217433, -19327, 24159, 55835, -97711, -30602, 42413, 20401, -31675, - 49392, 34897, 90731, 4832, -79994, 25233, -50466, -51003, 23085, -41876, - 46171, 3221, 9127, -4832, 22549, 1611, 4295, 31139, 31675, 15032, - 17717, 20938, 23622, 10201, -20401, -17180, - }, - { - 137439, -4201015, 2032593, 135828, 81604, 17180, -163209, -41876, -141197, 41339, - 426276, 127775, 21475, 799401, 4652524, -1633698, 54761, 107374, -1050656, -2070711, - 270583, -14496, -239444, -1279363, 1166084, 452582, -1370095, 982474, -870268, -31675, - -435402, -302258, 18790, -20401, 205085, 20938, -34897, 89657, 411780, 233539, - -118648, 481036, 126702, -134218, -347892, 23085, 193810, 272730, -111132, -83752, - -135828, -10737, -20938, 153008, -137976, 10201, 154619, 91268, 31139, 20938, - -73014, -16643, 1074, -26844, -39192, -56908, -20938, 25770, 9127, 74088, - 51540, -40265, 66035, -15569, -61203, -70330, -16106, -79457, 21475, 98247, - -34897, -11811, 30602, -41876, 11274, 5369, -537, 5369, -4295, 3221, - 44560, -18254, -39192, -7516, 5369, 28454, - }, - { - -9403831, 13855564, 5259188, 398895, -545998, 56908, -28454, -13959, -79457, 591632, - 106837, 64425, -181462, -29528, -199179, -28991, 602906, -397821, 447750, -153008, - 445066, 49392, -345208, 314069, -89657, -46708, -217433, -190589, 178241, 287763, - 102542, -460098, -103079, -171262, -30602, 408559, -282394, 293668, 10737, 176631, - 306553, -121870, 292058, 391916, -25233, -224412, 259846, 306553, -240518, 212601, - 152471, -63351, 202937, -66035, -67646, -105227, -50466, 85362, -159988, -19327, - 112743, 110595, 35970, -46708, -41339, -75162, -149787, 133144, 86436, -89657, - 86973, 74088, -145492, -25770, -22549, 13959, -15032, -13422, 30602, -53687, - 31675, -537, -33823, -42413, 104690, -48318, -11274, 10201, 27380, 9127, - -68719, 33286, -10737, 32212, 10737, 3221, - }, - { - -85362, -760746, -917512, 772557, 64961, 89121, -79994, 143345, 252866, -2684, - 488016, -24159, 208306, -137976, 4350265, 2702608, -923418, -606664, -56908, -1104880, - 991064, 353261, 657667, -48855, -2254321, -25770, -1177358, -218506, -1083942, 332323, - 200253, 312996, 228170, -508954, 178241, -13959, 55298, -89657, -549219, -100932, - -179852, 110059, -168577, 165356, 16106, -206695, -242666, 19327, 223875, -232465, - -161061, -304943, 117038, -172336, 1074, -89657, -123480, 198105, 209380, -128849, - -3758, -4295, 80531, 40802, 6442, 154082, -25770, -39728, 4295, -45097, - -31675, -19327, 49929, -25233, -84826, 32749, -60666, -76773, -18790, -12885, - 96637, 24159, -32212, 15569, 4832, -2147, -15032, 31675, -4295, -49929, - -5906, 15032, 8053, 27917, -2684, 6442, - }, - { - 2921115, 9903121, -3626563, 666794, -657130, -218506, 314069, 727460, -98784, -572841, - 846109, 800475, 37044, -1793149, -197569, 86436, -533650, 802085, 175557, 31139, - -194884, 255014, 32212, -269509, 51540, -376347, 68719, -176094, 245887, 4295, - 535260, 274878, 284005, -287226, 74088, -834297, 73014, 328028, -481573, -103079, - 698469, -362388, -332323, -295279, 12885, -155156, 25233, 217433, 55298, -149787, - -194884, 69256, 388695, 10737, -54224, -1611, -64425, -105764, -107374, 53150, - 105764, -63351, 20938, 84289, 200253, 51003, -141197, -68183, -80531, -84826, - 34897, 60130, -53687, -91805, -113817, 120796, 89657, -76773, 27917, 2147, - -11274, 60130, 47782, 66035, 60130, 51540, -46708, -27917, -20938, 22012, - 51003, 4295, 20938, -4832, -1074, 15032, - }, - { - 270583, 5150203, -2133525, 4234301, -281857, -1319629, 402653, 46171, -128849, 199179, - -461709, 566399, -483721, 250719, 1316944, 359167, -906238, -1016834, -947577, -41876, - 1702418, 6442, -777926, -392990, -52076, 415001, 501974, -580894, -522912, 310311, - 284542, -227096, 287226, -449361, 449361, 652835, -349503, -290447, 257161, -363998, - 21475, -387084, 108448, 208306, 97174, 63888, 8053, 21475, 165356, -244813, - -25233, -212064, -110059, -84826, 227633, 56908, -140660, 60130, -59056, -57445, - 28454, -17180, 118648, -30602, 26844, 109522, -119722, 17180, -67646, -77309, - 40265, 36507, 68719, -54224, -8590, 40802, 23622, 14496, 8053, 36507, - -5906, -3758, -57445, -41339, -10737, 4832, 26844, 1074, -25770, -45634, - -14496, -15032, -20938, 11811, 8053, -19327, - }, - { - 4387846, -11714523, 1960116, -3282966, -2121177, 3121904, -3766686, 1933809, -392990, 300648, - 114890, -258772, 8053, -814970, 1788317, -1627256, -1342177, -224949, -267362, 328028, - 959388, -26307, 312996, -496606, 85362, 149787, -163209, -118648, -57982, -183610, - -636729, 298500, 97174, -323733, 130997, 121870, 208306, -137439, 93952, -940061, - -592706, 189515, 250182, -74625, -9127, -81068, 202937, -380105, -86973, 221191, - 64961, 23622, -162672, 161061, 195958, -119722, 270046, -108985, 27380, 52613, - -7516, 53687, 38655, 56371, 2684, 13422, 49392, 3758, -12348, 46708, - 12348, -24159, 54224, -96637, 22012, -41339, -3221, 18254, 28454, -20401, - 4295, -49392, 32749, -39728, 4832, -49392, -23622, -9127, -11811, 45097, - -31675, 1611, 41876, 7516, -32212, -4832, - }, - { - 123480, -5173288, 612570, -59056, 143345, -76773, 293132, 2684, 30602, 13959, - 89121, -282931, -1575716, 4239133, -605590, 529892, -133144, -1070521, -286152, 766115, - 936840, 695248, -199716, 6979, 311922, 1593433, 917512, -779537, 54224, -824634, - -203474, 609885, 183610, 296353, -304406, -303869, -348429, 323733, 55298, -244813, - 240518, 243739, -228170, -110595, 60666, -131533, 284005, 7516, -376347, -143881, - 82678, -129386, 17717, -113280, 126165, 99858, 30065, 308164, 4295, 23622, - -125091, -82141, 73551, 32212, 34897, -98784, 82141, -79994, 13422, 70330, - -12348, -77846, -78920, -48318, -45634, -31139, -26307, -6442, 40265, 32749, - 4832, 0, 47245, 32212, 7516, 26307, 46708, 3758, -13422, 18790, - -4295, -16643, -13959, 33823, 26307, -52613, - }, - { - 75162, 3263638, 97174, -1320703, -16643, -970126, -1693291, 985158, 671089, 12348, - -236223, 157303, -358093, -2615098, -347355, 821949, 779537, 153545, -158914, -871878, - 622770, 120259, 59056, 27380, -796716, -274341, 173946, 153545, -72478, 175020, - -257698, -25233, 176631, 132607, -196495, 125091, 22012, -233539, 12348, -207232, - 16643, 413927, -574989, 401579, -199716, 114354, -245887, 241055, 5369, 1611, - -95563, -103616, -229781, -69256, -70867, -112206, 88584, 132070, 220654, -78383, - -122943, 104153, 216359, -148713, 25770, -19327, 94489, 11811, -75699, -5369, - 114354, 62277, -81068, 18254, -51003, 69793, 33286, -61203, 33286, -32212, - 31675, 28454, -29528, 2684, -56908, 35970, 76236, 57445, 6979, 22549, - 1611, -6442, -68183, -11274, -41339, -47782, - }, - { - 263604, 1249299, -1647120, -673236, 375810, 38655, -157303, 92879, -97711, 151398, - 95026, -31139, 98784, 6554120, 1822140, 412854, 107911, 1206349, 849330, -652835, - -228170, 390842, -19327, 205085, 877247, 851477, -301721, 139586, -235149, 671089, - -186831, 297963, -447750, 27380, 180389, 69256, -125628, 41339, -244813, 208843, - 13959, -600222, -17180, 239981, 65498, 95026, 126165, -7516, 67109, -40802, - 82141, 1611, 98784, 98784, 26307, -42413, 109522, 3758, -121333, 229244, - -237297, -155156, 33823, 19864, -45097, 164283, 57982, -42950, 15032, 28991, - 8590, 136365, -73014, -12885, -31139, 4295, 57982, 21475, 3758, -44023, - -52076, -11811, 36507, 35433, 26844, 28454, 5906, -27380, 9127, 16643, - -80531, -10201, 23085, 0, -32749, 2684, - }, - { - 155156, 8145943, -2061047, -2425046, -324270, -1098975, 636729, -170188, 265751, 236760, - -2239826, 812823, -250719, -2113124, 272730, -602369, -1283122, 1302986, -1312113, 341450, - 99321, 374736, 177704, -331786, 504659, -80531, 508417, -263604, -79994, 255014, - -350040, -242129, -107374, -431644, 471373, 111669, 666257, -240518, 166967, 416612, - -194347, 29528, 290447, 383326, -10201, -2147, 151934, -380641, -283468, 10201, - -177704, 3221, -29528, 115964, -106837, -37581, 41876, -40265, 32212, 126165, - -67646, 32749, 39192, 165356, 34897, 112206, -19864, -32749, -77309, 31675, - -5906, -22549, 45634, -114354, 46171, -23622, 71404, 6442, -40265, 10201, - 44023, -78383, 29528, 33286, -36507, -55298, 6442, -51540, -12348, 27917, - -16643, 15032, -12885, -14496, 22549, -11811, - }, - }, - { - { - 538482, 8884677, 730144, 316754, -321586, -74088, -153545, 12348, 84826, -323733, - 1070521, 242666, 1956895, 1034013, -3367254, 721555, 1004486, 592706, 935229, -398358, - -306553, 184147, 460098, 21475, -261993, -200790, -456340, 143881, 287226, -195958, - -311922, 217433, 1077500, -171799, -155156, -185757, -198642, -1108102, -974958, -588411, - 409633, 264141, 82141, 142271, 263604, 231391, -47782, 198642, -78383, 100395, - -19327, -22012, -54224, -137976, 77846, 17717, -181462, 36507, -183073, 40265, - 12348, -31139, 146029, 123480, 34360, 74088, 85899, -63351, 89657, 140660, - 4295, -104153, 18254, 34360, 15569, 4832, -55298, 12348, 56908, 32749, - -75162, -42950, 35433, 63888, 50466, 3221, 3758, -3758, 16106, -3221, - -3758, 1611, -26844, 27917, -2147, -34360, - }, - { - 5211406, 61046516, -432181, -700617, -1154809, -83215, 311922, -587874, -864362, -214212, - -160524, -421444, -267899, 1124745, 1111323, -64425, 123480, 153008, 1160715, -116501, - -39192, -255014, -417149, -234613, -49392, 629750, -649614, -35433, -157303, 82678, - 482647, 989453, 89657, -176094, 209380, 71941, 512175, -489626, 224949, -271657, - -154082, 75162, 384400, -5906, 37581, 24159, -54761, 18790, -293132, 25233, - 54761, 99858, 129386, 2147, 119722, -52613, -66035, 19327, -47245, -18254, - 1074, 26844, -66572, 11811, -61203, -98247, -19327, -51540, 106837, 60130, - -20938, -39728, -88584, 27917, 16106, -68183, 40802, -50466, -32749, -28991, - 47782, 10201, -57982, -11811, 70867, -26844, -34360, 63351, -28454, -9664, - 3758, 10737, 30602, 18790, -13959, 0, - }, - { - 1854352, 32959042, 2295123, 2020245, 1627793, -15569, 227633, -15569, 119722, -354335, - -686121, -719944, -359167, -1603633, 1356673, 401579, -927713, -309238, 23085, 515933, - 0, -235686, 115964, -1079111, 243203, 273267, 462246, -253403, 212601, 27380, - -383326, -593242, 289910, -53150, -852014, 115964, 121333, 632971, -175020, 20938, - -329102, 238371, 476205, 101469, 113280, 185757, -320512, 57445, -10201, -47782, - 50466, -103616, -30602, 151398, 90194, 78920, -33286, 234076, 63351, -32749, - -65498, 60130, 213138, 0, -8053, -20938, -15569, -44023, 4295, 44023, - 537, -26844, 43487, 47245, 53687, -31675, 47245, -21475, -34360, -41339, - -73014, -21475, 30602, 36507, -48318, -6979, -10201, -45097, 13422, -40265, - 537, 34897, 22012, 17717, 20938, -25233, - }, - { - -312996, 1751810, 463856, 205622, 252866, -99321, 37581, -127238, -63351, -55835, - 299037, 176094, -295816, 442382, 4814122, 1497870, -1200443, -399432, 243203, -130997, - -367757, 66035, 1005022, 538482, 1040456, 900333, 461172, 581968, 24159, 1062468, - -993748, -1000727, 565862, -306016, -312996, -232465, 1410360, -258772, -1611, -5369, - -112206, 80531, -148713, 181462, -303332, 90731, -58519, 51003, 164283, 44560, - -233002, -336618, 19327, -75699, 120796, 92342, -144418, -116501, 57982, -68719, - -84826, -108985, -9664, -51540, 41876, 74625, -17717, -101469, 72478, 56908, - -78920, -86973, -3758, 61203, 54761, 30602, 27380, 53150, 84289, -16106, - 20938, 23085, 20401, -20401, 18254, -37581, -31139, 25233, 13959, 34897, - -2147, -2147, 42413, 27380, -17180, 14496, - }, - { - 5091684, -904091, -2194728, -1401770, -113280, 154082, 392990, 126702, 209917, -774705, - -606127, 406948, -591095, 153008, -628676, -237297, -257161, -420907, 438624, -15032, - 54224, -87510, 463320, 364535, -432718, 318364, 213138, -133681, 613107, 343061, - -433792, 129386, -601295, 111132, -30602, 167504, -805843, -583579, -128312, 302795, - -231928, -104153, 33286, 143345, -324270, -55298, 69256, -259309, -92879, -137439, - 96637, 81068, 230318, -76773, -124554, -2147, -35970, -124554, -147103, 39728, - 178778, 142271, -13959, 25770, 51003, -2147, -34897, -22012, 12885, 110595, - 9127, -70330, -50466, -45634, -2684, 11811, 33286, 27917, -5906, 10737, - 40802, 60130, 16643, 15569, -52613, -26307, 42950, 1074, -25233, 1611, - 8590, -22549, 1074, -36507, -41876, 3221, - }, - { - -346819, -81604, 881005, -248571, 37581, -89121, -31675, -9664, -79457, 223875, - 30065, -87510, -70330, -552977, 2319819, -377420, 782221, -666794, 802622, -234613, - -978179, -1131724, -167504, 334471, -551366, 257161, -724776, 407485, -1104880, -1104344, - 632971, -384400, 222801, 340376, 638876, -57445, 259846, 559956, 313533, -108985, - 159451, 463320, -54224, -104690, 25233, 68719, -7516, 158377, -302795, -187905, - 8590, 195958, -137976, -11811, -9664, 41876, 77846, 112206, -23085, 20938, - -65498, -45097, 19864, -5906, -8590, -15569, -29528, -79457, 537, -17717, - 44560, 121870, 44023, -3221, -40802, 3221, 66572, 50466, 77309, -5906, - -4295, 24159, 1074, -45097, -9127, 17180, 6442, -5369, 12885, 30065, - -18254, -55298, 11811, 30602, 20938, 8053, - }, - { - 3305514, 4658429, -584116, -250719, 50466, 187368, -53687, 237297, 229781, -174483, - 349503, -136365, 92879, 530428, -824634, 384400, 503048, 215285, -1611, -650688, - -189515, 169114, -60666, -121870, 79994, -472446, 96637, -13422, -226560, 30065, - -60130, 43487, -250182, 190052, 223338, 162135, 161061, -127775, -207232, 351114, - 123480, 143881, 153008, 1074, 331249, -395674, 111132, -149787, 173409, 79994, - -67109, -23085, -173409, 23085, -55298, 47782, 122943, 2684, 122407, 88047, - 176094, 26307, 92342, -70330, -64425, -39728, 83752, 26844, 12885, -6979, - 17180, -77309, 4295, 78920, -33823, -35970, 11274, 40802, -12348, 18254, - 33286, -46171, 12348, 32212, -22549, -49392, 62814, 45097, -14496, -45097, - 4295, 41876, -11811, -4832, -18790, -6979, - }, - { - -353798, -300648, 1208496, 222801, 157840, -121333, -92879, 179852, 216896, 122407, - -45634, -207769, -722628, 1062468, 6385006, 686658, -905701, -2171106, 214748, -280247, - -1349694, -200790, 335544, -723165, -2076080, -470836, -465467, -462246, -838592, -226560, - 26307, -82141, -312996, -19327, -274341, 193274, 25770, 106837, -437013, -62814, - -186294, -22012, 126165, -116501, -92342, -133144, 233539, -81068, -205622, 31675, - 4295, -284005, 37044, 11274, 125628, 30602, 212601, 240518, -137439, -56908, - 55835, 125091, 129923, 15032, 54761, -72478, -19327, 39192, 40802, -15032, - -5906, -35970, -36507, 9127, -12885, 20401, -11274, 15032, 23622, 51003, - 55835, -46708, -41339, -38655, 10201, 30065, 9127, 46708, -34897, 6442, - 26307, -34897, 8590, -537, 12348, 5369, - }, - { - -1239098, 4609574, 3670587, -11274, -236760, 159451, 75699, 227096, -482647, 456877, - 175020, -276489, -425202, -1598265, -397821, -45097, 783832, 404264, 236223, -125628, - 2147, 204548, -249645, -175020, -290447, -63888, 140660, -8590, -24696, 437013, - 645856, 566399, -153545, -280247, -322123, -107374, -481036, -121333, 630286, 363998, - -44023, 395137, -304943, -192737, -77846, 105227, 222265, 419296, -82678, -327491, - -33823, 195958, 33823, 287763, -82678, -2147, -119185, -9127, -64425, 5906, - -44560, -42413, 66035, 34360, -11274, -129386, -62277, -18254, -150324, 6979, - -23622, -5369, -17717, 30602, 14496, 28454, -19864, -19327, -3221, 22012, - -42413, 37044, -1074, 39728, -36507, 537, 14496, 10737, 32749, 72478, - 10737, -6979, -28454, 14496, 42413, -13959, - }, - { - -214748, 3295314, 1387811, 1883880, -453656, 132607, 625992, -275415, -123480, 550293, - 31675, -119185, -1093069, 688269, 608812, 426812, -893353, -341450, 397821, 639950, - 573378, -415538, 136902, -92342, 470299, 292058, 59593, 107911, -143345, 105764, - 236760, -718333, 560493, 286689, -68183, 396211, 110059, 298500, 456877, -237834, - -30065, -22549, 230318, -39728, 156229, 481036, -94489, 169114, -161598, -10201, - 136365, 59056, -99321, 82141, -156229, -186294, 25233, 79994, 53687, 130997, - 37044, -67109, -69256, -159988, -32749, -93952, 5369, 105227, 122407, 47245, - -2147, 50466, 0, -44560, 34897, -33286, -23622, -23622, -42950, -20401, - -60130, -8053, -13959, 6979, 12885, 36507, -2147, -22012, -33286, -15569, - 24159, -15569, 9664, 11274, 39728, 38655, - }, - { - -4159139, -4641786, -23622, -1590749, -614717, -709743, 4344360, -350577, -450972, 71941, - 203474, -234076, -16106, 949725, -233539, -1310502, 31675, 189515, -364535, 387621, - 78383, 259846, 573915, -176094, 91805, -154619, 32749, -508954, -52076, -143345, - 168577, 192737, -84826, -251792, 126702, 55298, 24159, 308701, -82678, -674310, - 119722, 449898, -178778, 20401, -459562, 105227, 97711, 0, 537, -27917, - 285078, -27380, 176094, 9664, -23622, -72478, -43487, 124017, 141734, -27917, - -19327, 92879, -6442, -86973, 29528, 35970, -34360, 11274, -37044, 27917, - -20401, -18254, 11274, 87510, 42950, 61740, 6979, -20401, -27380, 17180, - -70867, 22012, -18790, -40802, 31675, 2684, 37044, 8590, 28454, -20401, - -14496, 9664, 20401, -39192, -19864, 25233, - }, - { - -27380, -3803731, -380105, 282394, -48855, 250182, -220654, -196495, 144955, -103079, - 242666, -498753, 1398549, -510564, 1104344, -244813, -311385, 52613, 568546, 497679, - 257161, 409633, 151934, 571231, 1644973, 706522, 105764, 154619, -963146, -173409, - 744103, -486405, 275415, -318901, 257161, -398895, -288837, 228170, 529355, -5369, - -20401, -34897, -9127, 98784, 127775, -69793, -18254, -117575, -76236, 173946, - 62814, -158377, -75699, 96100, 107911, -34360, -88584, -119185, -135828, -72478, - -92342, 38118, -16106, -81604, -143881, -18254, 84289, -104690, 81604, 67109, - 22549, -16106, -38118, -16106, -18254, 79994, 57445, 11811, 34360, -10201, - -4832, 37581, -45097, -30065, -16106, -22549, -17717, -31139, -18254, 12885, - 6979, 17180, 23085, 0, -5906, 13422, - }, - { - 213675, 413927, 2368675, 999654, -856846, 325881, 884226, -109522, -537, 686121, - 508417, 319975, -660888, -2372970, 8590, -543313, 265751, 948651, -282394, 42413, - 668941, -95563, 147103, -12348, -276489, -249108, 372052, 310311, 307090, 351114, - 169114, -48855, 18254, -27380, -229244, 300648, 250719, -314606, 70330, -70330, - -155156, -235149, -179852, -366683, -226023, -282931, -234076, -149250, -151398, -154619, - -1611, 53150, 48855, 136365, 143345, -65498, 199179, 66035, 49392, -161061, - 91268, 20938, 132070, -19327, 53687, -42950, -77846, -12885, -49929, 84826, - 42413, -98784, 2147, 60130, 4295, 48855, -43487, 12348, 14496, 42950, - 46171, -67646, -59593, -2147, 37581, 39728, -74625, -2147, 0, -42413, - -13422, -28454, 1611, 31139, 5906, 36507, - }, - { - -83752, -367220, -549756, 27917, 24159, 379568, 67109, 128849, -135291, 240518, - -56908, 282394, -600222, 733366, 15185394, 159988, 654446, 133681, 654983, -1113470, - 998043, 38118, 418222, 678605, 1196685, 501437, -252866, -324270, 1323387, -259309, - -214212, -250719, -155693, -494995, 63888, 16643, -158914, -292595, 57982, -89657, - -370441, 105227, -1074, 259309, 47782, 43487, -57445, 281857, 212601, -26844, - 194347, 201327, 41876, -107374, 35970, -102005, -24159, -18254, -33823, 50466, - -28991, 128312, -84289, -2684, 15032, 82678, -11274, 139050, 12885, 71941, - 58519, -75699, -57445, 38655, -28991, 12348, 9127, -87510, 46708, -28454, - 28454, 85899, -26844, 6442, -32212, -44023, -74088, 17180, 55298, -33286, - -537, 61740, 2147, -34360, 16643, 9127, - }, - { - 1351304, 3724274, -2215130, -776315, -348966, 1763621, 490163, -33823, 6979, -349503, - -980863, 421981, 474057, 228170, -3441880, -238908, 803696, -415538, 185757, 568009, - -340376, -81068, -52613, 153008, 289373, 35970, -633508, -243203, 291521, 238908, - -84826, -24696, -261456, -201327, -426812, 294205, -4832, -36507, 253403, 230318, - 12885, -16643, 310311, 263067, -76236, -81604, -492848, -243739, -56371, 156766, - -250182, 128312, 292595, 96100, 17717, 71404, -158377, 15569, -35970, 81604, - 36507, -84826, 6979, -35433, 10201, -5369, 0, -13422, -83215, -10737, - 18254, -139050, -57445, 74088, 98784, 537, -35970, 0, 1611, -17717, - -38655, -3758, 41876, 0, -5906, 4295, 4295, 21475, 42950, -57982, - -27917, -12885, -32212, -6442, 15032, 23085, - }, - }, - { - { - -705448, 6296422, -471910, 8590, 388695, 35970, -108448, -23622, -70330, -76236, - 467615, -190052, 178778, 144955, -2562485, 445603, -292595, 311922, 759136, -232465, - 494458, 1027034, 134755, -420370, -358093, -346819, -377957, 207769, 469225, -316754, - -427886, 167504, 341450, -322659, -382252, 38655, 538482, -628139, -136902, -97711, - 390842, 169651, -304943, 158914, 211527, 102005, -151934, 309238, -181999, 185220, - 182536, 15032, 174483, 135828, 69256, 28454, -146029, -108985, -37581, 170725, - -53687, 28991, 48855, 30065, 22549, 48855, -39192, -52076, 141197, -17180, - -28991, -24696, 51003, 2147, -11274, 1074, -5906, 39728, 49392, -3221, - 1611, 33823, 45097, 22549, 12348, -40802, -7516, -11811, 9127, -42950, - 28991, -9127, 6979, 5369, -37581, -30602, - }, - { - -4915053, 40121972, -3151969, 1857037, -98247, -4832, 8590, -467615, -121870, 169114, - 124017, 118112, -269509, 159988, -23622, -1005022, -121333, -330176, 724776, 128312, - 166967, -59056, -45634, -25233, -206695, 156766, -802085, -234076, -232465, 17717, - -41876, 584116, -247497, -314069, 54224, -13422, 295279, -494458, -46708, -364535, - 45634, -107374, 45634, -19327, -10737, -164283, -119185, -242129, -137439, 257161, - 22012, 27380, 84826, -128849, -46708, -206158, 47782, 45634, -9127, 142271, - 27917, -65498, -51003, 37044, -107911, 33286, 11274, -11274, 71941, -99321, - -6442, -44560, -56371, 9664, -75699, 25770, 48318, -48855, -537, -1611, - 41876, -26307, -35970, 18254, 34897, -104153, 41876, 41876, -4832, -6442, - -28991, -1611, 37044, -12885, 4295, -10201, - }, - { - -683974, 18160732, -4180614, 1876901, 284542, -340376, 162135, -328565, -103079, -499827, - -144955, -221191, -9127, -479963, 1992865, -40802, -39728, 69793, -510027, 233539, - -131533, 40265, 485868, -298500, 621697, 490700, 181462, -368293, -70330, 177704, - 154619, -14496, 616328, 47245, -590021, 317291, -95563, 388158, -123480, -29528, - -7516, 100395, 148176, 114354, -64425, -147103, -267899, 169114, 119185, 93416, - -6979, -37044, 6979, 68719, -71404, 166430, 76236, 41339, -44560, -45634, - 59593, 81604, 125091, -48855, 18790, -56908, 104153, 22549, 68183, 62277, - 19327, -16106, 8590, -3221, 23085, -32749, 1074, -10201, -81068, -1611, - -2147, 31139, 40802, 3758, -34360, -14496, -44023, -27917, 31675, -49929, - 35433, 14496, 34897, -3221, 2147, -18790, - }, - { - 407485, 548145, -732829, 271657, 37581, -103616, 164283, -65498, -82141, -27380, - 193810, 70867, -317828, 370978, 2362769, -382252, -1109712, 27380, 79457, 140123, - -288300, 403727, 160524, -443992, 809064, -707596, -1253057, 46708, 481036, 1406065, - -777389, -535797, 813359, -233539, -255551, -181462, 722091, -193810, 125091, -193810, - 117038, 316217, -61740, 112743, -341450, 242666, 76773, -16106, 203474, 74625, - -268435, -8590, 73014, -123480, 155693, 38655, -75699, 46171, -11274, -26844, - 27917, 23085, -15032, 6442, 88584, 55298, -13422, -31139, 60666, 13422, - -166967, -24159, 30602, 71941, -24696, 58519, 79457, 27917, 13959, -48318, - -6442, 35433, -5906, 8053, 21475, -24696, -6442, 40802, 23622, -6979, - -12885, 21475, 36507, 10737, -1074, 17717, - }, - { - -1203665, -7318625, 1586990, -426812, 325881, -82141, 14496, 140660, 401579, -350577, - 485868, 138513, -39728, 281320, -838056, -139586, 147103, -208843, 63888, -464930, - -99321, 81068, -198105, -135291, 126165, 66035, 545461, 191663, 443992, 181462, - -108985, 450972, -9127, 461709, -17180, 92879, -845035, 222801, 342524, 284005, - -289373, -89121, -28454, 49929, -325344, 186294, 328028, -25233, 99858, -19864, - 275952, -13422, 64961, -2147, -75162, 24159, -99858, -103616, -111669, 34897, - -33286, 11274, 5906, -56908, -2684, 19327, -11811, 10737, -2147, 27917, - -59056, -90731, -34360, 74088, 12885, -14496, 81604, -9127, 10737, 22012, - 30065, 61203, 3758, -25233, -26844, 4295, 11811, -20938, -56371, -19327, - -4832, -22549, -12348, -39728, 5906, 6979, - }, - { - -131533, 2282775, 450972, -592706, 37044, -33823, 167504, 69793, -41876, -19864, - -180389, -79457, -186831, -696322, 3389803, -250719, -310848, -52613, 1073742, -162672, - 549219, -249645, 1167694, 1286880, -481036, 1285269, -195958, -65498, -123480, -679142, - 358093, -299574, 86436, 257698, 536334, -221728, 66035, 234076, -537, -244276, - 348966, 145492, -61203, 88047, 113817, 29528, -84289, 84289, -133144, -3758, - 77846, 97711, -171799, -45634, -15032, -55298, -35433, 62814, -34897, -7516, - -51003, 52076, -70330, -63351, -24696, -11274, 46171, -25233, 60666, -28991, - 77846, 46171, -62277, -11274, 44023, 18254, 51540, 43487, 25233, -55298, - 51540, 7516, 537, -11811, 19327, 10737, -6442, 2147, 14496, 9664, - -41876, -1074, 47782, 4295, 4832, -15032, - }, - { - 1085016, 6641630, 2653753, -1060857, 157840, 129923, 16643, -169114, 44560, -233539, - 25233, -430034, 144955, 362388, -1364726, -641024, 22549, 21475, -191126, -244813, - -128312, 225486, -97711, -147103, 45097, -320512, 362925, -19327, -86436, -9664, - 48318, 275415, -101469, 283468, 124017, 316217, 133681, 70330, -57982, 107911, - -36507, 167504, 55835, -46171, 386010, -63351, 25770, -166967, 254477, -66035, - -195421, 32749, -78920, -40265, 108448, 65498, 67109, 9127, 125628, 38118, - 40265, -86973, 84826, -9127, 20938, 54224, 77846, -72478, -5906, 48855, - -18790, -91268, 73551, 41339, -31139, 24696, 46171, 12885, 2684, 35970, - -10201, -11274, 35433, 11274, -71404, 28991, 45634, 5906, -22549, -11811, - 46171, -12348, 3758, -11274, 6979, 17180, - }, - { - 18790, 1343788, 275952, -154619, -32749, -116501, -88584, -9127, 41876, -79457, - -358093, -35970, -438087, 665720, 5822365, -530965, -71404, -615791, 175020, 504659, - -966905, 238908, 54224, 34360, -4295, 679679, 129386, -361314, -210990, -408559, - -256087, -207232, -148713, 249108, 229781, 266288, -54761, -89121, 71941, 161598, - -61740, 106300, 131533, -160524, 5369, 160524, 326954, -400506, -255551, 193810, - -34897, -41876, 27917, 119185, 97174, 64961, 150861, 28454, -132070, 78383, - -5906, 139050, 51003, 11274, -3758, -106300, 71941, 57445, 20401, -49929, - 34897, -5906, -40265, 43487, 10737, 9127, 83752, 47245, 6442, 21475, - -43487, -44560, -8590, -6442, 16106, -537, 33823, -8053, -20401, 46708, - -10737, -9127, -1074, -22549, 15032, -7516, - }, - { - 2664490, 2727841, -1145683, -46708, 238371, 244813, -384400, -481036, -156766, 565325, - -759672, -862215, -77309, -16106, 40265, -306553, 141197, -178241, 198105, -90731, - 68719, 99321, 148713, 63888, -278636, -168041, -31675, 174483, -158914, 33286, - 353798, -27380, -347892, -179315, -331249, 455267, 70867, 102542, 412854, 8053, - -161061, 256624, -249645, -537, -200253, 130997, 53687, 163209, -104153, -240518, - 255551, 73014, -245350, 227096, -100932, -81604, -57982, 20401, -48318, 28991, - -69793, -88047, 23085, -49392, -45634, 50466, 77309, 3221, -37044, 59056, - -53687, -21475, -537, 42413, 67646, -59056, -10737, -3221, 24159, 9664, - -31139, -11274, -22012, -16106, -57982, -19864, 69256, 32749, 16643, 26844, - -35433, -3758, -40802, 36507, 20938, -11274, - }, - { - 319438, 1429687, -370441, 228170, -119722, 1065152, 296890, -468151, -280784, 24696, - -71404, -106837, -929860, -241592, -1012539, -1611, -624381, 417149, 817654, 35970, - 44023, 188979, 973884, 386010, 355945, -187368, -406411, -191663, -280784, 95563, - -29528, -498216, 238908, 295816, -362925, 38118, 263604, 350577, 222265, -132070, - 88584, 7516, 48855, -241055, 120796, 172336, -62277, 88584, -166430, 157303, - 124017, 34360, -4832, -56908, -241592, -82141, 89657, 59056, 64961, 105764, - 1074, -51003, -120259, -74088, -66572, -72478, 92342, 85362, 112206, -42413, - 15032, -5369, -31675, 18254, 32212, -23085, -35970, -26844, -64961, -18254, - -28454, 8590, 27917, 15032, 11811, 2684, -15569, 6442, -17180, 31139, - 13422, 17717, 13422, 1611, 27380, 17717, - }, - { - 3811247, -599685, -3585761, 1341640, 531502, -521302, 3127273, -1218697, -258235, 250719, - -20401, -194884, -8053, 603443, -932545, -577136, 633508, 297427, -234613, 223875, - -925565, 161598, 382789, -147103, -19327, -173409, 28991, -543850, 278636, 13959, - 165893, -43487, -63351, -18254, 13422, -135828, 146029, 185757, 78383, 133144, - 305480, 143345, -316217, 59056, -294205, -12348, -102542, 103079, 64425, -178778, - 137439, -78920, 144955, -158377, -35970, -81068, -110595, 194884, -17717, -47782, - 44560, 67109, -73014, -78383, 25233, -23085, -31139, 3221, 9127, -22012, - -32749, 21475, 16643, 93416, -9127, 68719, -5906, -60130, 4295, 11274, - -44560, 41876, -32212, 27380, -1611, 52076, 6979, 5369, 2147, -29528, - 12885, -11274, -16643, -19327, 15032, 6979, - }, - { - -46171, -2405719, 331249, -170725, -76773, -1074, -256624, -171262, 307090, 1074, - -158914, -627065, 1214939, -2144263, -580357, -485868, 127238, 817118, 303332, -472446, - 76773, 568009, 165893, 2147, 326418, -378494, -646929, 263604, -636729, 918586, - 216896, -398358, 48855, -217970, -43487, -175557, -12348, 275952, 202400, 25770, - -152471, -68183, 118648, 49392, 40802, 76236, -63888, -59056, 7516, 146566, - -54224, -119185, 42413, 23085, -52076, -66035, -67646, -210990, -102005, -86973, - 61740, 5906, 5906, -84289, -46171, 95026, 18254, -1611, 74088, 32749, - 38118, 27917, 43487, 43487, -4832, 66572, 35433, -39192, 13422, -37581, - -3221, 31139, -45634, -28991, -4832, -33823, -12885, -4295, 4295, 11811, - 9127, 16106, 19864, -27917, -11811, 28454, - }, - { - 328565, -1108638, 885837, -490163, -576599, 1858110, 1069447, -600222, -291521, 1151051, - 477815, 34360, 647466, -518617, 949188, -523986, 47245, 764504, -402653, 553514, - 158377, -286689, 33286, 377957, 333934, 159451, -62277, 304943, 297427, -6442, - 16106, -162672, 261456, 200253, -88584, 187905, 324270, 39728, 340376, 3221, - -216359, -246961, 158377, -504659, -69256, -202400, 99858, -186831, 4295, -242666, - 90194, 105227, 33286, 274878, 28454, -25233, 160524, -84289, -66035, -33823, - 56371, -103079, 24696, -63888, -29528, -59593, -53687, 17180, 30065, 25770, - -48855, -67109, 62277, 28991, -4832, 6442, -61740, 76236, 8590, 30602, - -33286, -60666, -10201, 27917, 28454, -20401, -102005, -5369, 2684, -13422, - 1611, -5906, 63351, 14496, 21475, 24696, - }, - { - 217970, -778463, -420907, 194347, 106300, 209380, -1074, 260382, -74625, 73551, - -39728, 80531, -552977, -5865315, 5971615, -630286, 160524, -614717, 724776, 43487, - 1318018, 32749, 487479, -114890, -73551, -102005, 78920, 157303, 744103, -857383, - -486405, 129386, 519154, 160524, 37044, 172872, -46708, -169114, 347892, -123480, - -184684, 284005, -56908, 61740, -70867, -163209, -119185, 85899, 158377, -102005, - 171799, 75162, -89657, -104153, 86436, -172872, -11811, 15032, -23622, -52613, - 132607, 86436, -96637, 51540, 78383, -58519, -33823, 138513, 537, 77309, - 37581, -87510, -41876, 28454, 12348, 18790, -69256, 4295, -1611, 4832, - 67646, 16106, -19864, 7516, -53150, -19864, -45634, 44023, 537, -3221, - 54224, 39192, -38655, -12348, 20938, -33286, - }, - { - -1168768, -909459, -692564, 1855426, 388695, 1991254, -352187, 128312, 135828, -79994, - 1067299, 562104, -155693, 775242, -1569274, 545461, 795643, -619549, 616328, 737661, - -303332, -61740, -230318, 212064, 34360, 50466, -551366, 40802, 173946, -233539, - 4832, 220654, -14496, -77309, -604517, 289373, -265214, -42950, 191126, 30602, - 143881, -198642, -51540, 146029, 51003, -209380, -375273, 143881, 127775, 97711, - 14496, 141734, 111669, -118648, 20401, -20938, -214212, 130460, -70330, 7516, - -10201, -170725, -32212, -60666, -31675, -69793, 12348, -8590, -31139, -22012, - 30602, -81604, -4832, 86436, 10201, -44560, -51540, 3221, 4295, -32212, - -1611, 35970, 4295, 3221, 33286, 55298, 8590, 46171, 0, -39192, - -8053, -11274, 537, 16643, 4832, 5906, - }, - }, - { - { - 367220, 2853469, -381178, 243739, 260919, -59056, 52076, -74625, -199179, 56908, - -304943, 243203, -826244, 598611, -1324461, -265214, -39728, 337155, -230854, 43487, - 914828, -306553, -573915, -980326, -185220, -319975, 91805, -115427, 52613, 11811, - -409096, -477278, 39192, 247497, -101469, 197032, 279173, 332860, 394600, -12348, - -28991, 79457, -122943, 163746, -32749, 44023, 193810, 383863, 105227, 100395, - 62277, 45634, 89657, 100395, -187368, 52076, 62814, -24696, 142271, 67646, - -58519, -169114, -93416, 63888, -12885, 13959, -74088, 15569, -1611, -141734, - 34360, 40802, 63888, -3758, 2684, 2147, 34360, 48855, -17180, -18254, - 64425, 1074, -42413, -67109, -59593, 17180, 35433, -10201, -1074, 15032, - 27917, -27380, 16643, -10737, 12348, 26844, - }, - { - 3451006, 27208618, 172872, 1452236, 670552, 7516, -102005, 740345, 408559, 171799, - 312996, 66572, -27917, -52613, -365072, -70867, 719407, -122943, -501437, 642635, - 60130, 454730, -158914, 6979, -143345, -314606, -285615, -142271, -166967, -130460, - 25233, 120259, 55298, 213138, -98247, -268435, 89121, -99321, 274878, 17180, - -57445, -243739, -417149, 227633, -281857, -63351, 16106, -45097, 177167, 79994, - 94489, -102542, -207769, -184147, -143881, -142808, -64425, -53687, 24159, 112206, - -145492, -143881, 11811, -19864, 58519, 122407, 16643, -15032, -109522, -57445, - 2684, -4295, 38118, -28454, -9127, 66035, -47245, 28454, 74625, 24159, - -40802, -32212, 10201, -28991, -51003, -10737, 69793, -29528, 16106, -4295, - 537, -6442, -8053, -11811, 5906, -13959, - }, - { - -91268, 8763344, 3548180, -581431, -1065152, -52613, -188979, -283468, -128312, 49929, - 284542, -27380, 285615, 596464, 1275068, 93952, 61740, -56371, 256087, -275415, - 89657, 353261, 17180, 458488, 323733, 37581, -163746, 207769, -33823, 281857, - 196495, 167504, -36507, -43487, 265214, 87510, 9664, -54761, 124017, 59593, - 243739, -413391, 67109, 57982, -299574, 136365, 178778, -120796, -27917, -69256, - 127775, 112743, 62814, -3221, -84289, 106300, 37044, -186294, 43487, -16106, - -6442, -24159, -122943, -11811, -30065, -91268, 16643, 12885, 47245, -23085, - 12348, -23085, 1611, -81604, 13422, -13959, -13422, -4295, -35433, 59056, - 18254, 19864, -4832, -35433, 37581, -5369, -14496, 15569, 11274, 11811, - 27917, -29528, -537, -14496, -3758, -6442, - }, - { - -502511, 47245, 1054415, -186831, -154082, 174483, 75699, 5369, -163746, 79457, - 3221, 212601, 213675, -362925, 1498944, 70330, 18254, 274878, 1005022, 48318, - 137439, 222801, -226023, -18254, -228170, 24696, -550293, -334471, 301721, 833224, - 28991, -615791, 266288, -223338, 219043, 100395, -245887, 343061, -37581, -198642, - 186831, -14496, 95026, 107374, 30065, 89121, -35433, 12348, 13959, -90731, - -138513, 148713, -127238, -12885, 31139, -105227, 55835, 113280, -66035, 69793, - 78920, -18790, -2147, 89121, -75162, -57982, 16643, 14496, -55835, -47782, - 30602, 69256, 30602, -4832, 4295, 53150, 11274, -71404, -59056, -1611, - -9127, -6979, -24159, 20938, -8053, 26844, 22549, -10201, -30602, -8590, - 8590, -5906, -53687, -17717, 0, -20938, - }, - { - -2298881, -3995393, 1898376, -341987, 37581, -119722, -118112, 110595, 280784, 140123, - 511638, -382252, 110059, 274878, -541703, -220654, -379031, 73014, 210990, 120259, - 144418, -263604, -275952, 302258, 518617, -103079, 72478, 821413, 459025, 209380, - 237834, 175020, 308164, 173946, -81604, 175557, 176631, 687195, 126702, 216359, - 121333, -186831, -231391, 130460, 127775, -194884, 37044, 199179, -18254, -23085, - 242666, -215285, 52076, 80531, -22549, -55835, -34360, 85899, 48855, 32749, - -64425, -13959, 2684, -50466, 16643, -24159, -63888, 90731, -23622, -48318, - -38655, 20401, 137439, 60130, -66035, 22012, -5369, -48855, 28991, 8053, - -4832, 7516, -17180, -13422, 53687, 11811, -24159, -10737, -5369, 7516, - 1074, 18254, -2684, 23085, 13959, -6979, - }, - { - 403727, 1071058, -1407139, 398358, 91805, 76236, 70867, -70330, -4832, -176631, - 28991, 161598, 93952, 1238561, 3642669, -289373, -244276, -398358, 60130, 759136, - 305480, 252329, 806917, 719944, 923418, 1209570, -63351, -110059, 59056, 126702, - -615254, -34897, -195421, 20401, 63888, -154619, -16106, -255014, -49929, -45097, - 75162, -19864, 83752, 121333, 75699, -172872, 92879, 127775, 45634, 153545, - -78383, -52613, 38118, -98247, -70867, -162672, 53687, -20938, 28991, 29528, - -8053, 51540, -97174, -33823, -62277, -33823, 56371, 76773, 62814, 62814, - 47245, -98784, -74088, -1611, 29528, -39728, -66572, -48318, -49392, 9664, - 42950, -40265, 39192, 46171, 24696, -18790, -4295, 16106, -3221, -15032, - 8590, 53687, -11811, -40802, -13959, 1074, - }, - { - -2078764, 14590004, -217970, -719944, -19864, -47245, -53150, -448824, 9664, 279710, - -225486, -246424, -102542, 311922, -1162326, -1028108, -152471, -448824, -46171, 581968, - 318364, 114890, -47782, -31139, -10737, 59056, -213138, 221728, 273267, 205622, - 10201, -53150, -37581, 126702, 47245, 162135, 8590, 498753, -12885, -172872, - -86973, 147640, 131533, 285615, 53687, 211527, 112743, 157840, 139586, -38118, - -23085, 132070, 105764, -123480, 74088, -71404, -64961, 0, -87510, -66572, - -84289, -34897, 50466, 52076, 45097, 5906, -106837, -34897, 62277, -9664, - 9664, 88584, -27380, -118648, 23622, 70330, -7516, 4295, 41339, -26307, - -46708, 38118, -11274, -37581, 30602, 40265, -49392, -19327, 18254, 33286, - -1611, -34897, 24696, 9664, 42413, 15569, - }, - { - 359167, 267362, -1090922, 80531, -193274, 108448, -35433, -76773, -26307, -170188, - -65498, 347355, 193810, -1017907, 6134824, -147640, 897648, 397284, -24696, 673236, - 809601, 467615, -409096, 690953, 848793, 721555, 212064, -126702, 79994, -468151, - 326418, 105764, -71404, 315680, 407485, 170188, -15032, -111132, 126165, -193810, - 12885, 111669, 52613, 34360, 76773, 140660, -120259, -266825, 86973, 68719, - -232465, 5906, 12348, -56908, -102005, 66035, 18254, -199179, 95026, 78920, - -30065, 28991, -134755, 70330, -44023, 87510, 62814, -45097, -5906, -11274, - -14496, 10737, 14496, 14496, -41339, 16106, 16643, -27380, -23085, -34897, - -47245, 42950, 41876, 33823, -10201, -22012, -3221, -28991, 24696, -17180, - -20938, 11274, -10201, -4832, 13422, 537, - }, - { - -5059472, 10974178, 1224603, 874026, -642635, -151398, -590558, 33286, 278636, -433792, - -477815, 279710, 799401, 398895, -343597, -453656, -638340, 48855, 144418, 290984, - -93416, 164819, 375273, -259846, -33286, -390305, -60666, 73014, -271120, -10201, - 66572, -339302, -110059, -97711, -207232, 100932, 597537, 545998, -521302, -324270, - 113280, -90731, -172336, -10737, -330712, -126165, 38118, -105227, -45097, 67646, - -12348, -86436, -56371, -41339, 44560, -16643, 34360, -144418, 20938, 64425, - -29528, -30065, 3758, -53687, 163746, 198642, -1611, -42413, 41339, -25233, - -2684, 20401, -24159, -9664, -35970, 1074, 73551, -48855, 24159, 4295, - -3221, -21475, 54761, -3221, 35433, 24696, 37581, -16643, -23622, -34360, - 6442, 4295, 10737, 16643, -26844, 11274, - }, - { - -370441, 942745, 761820, -157840, 520228, -300111, -255551, 60130, -44023, -543313, - -97711, 311922, -179315, -475668, -1211718, -598611, -213138, 714038, -461172, -826781, - 463320, 617938, 898185, -303332, -166430, -357556, 10737, -541703, -399969, 88584, - -57445, 156766, -327491, -122407, -60666, -34360, 4832, -380641, -105764, 15032, - -119722, -130460, -190589, 36507, -24159, -216359, 24159, 27380, 46708, 13422, - -171262, -65498, -27917, -203474, 119185, 132607, 15569, 28454, -16643, -72478, - -32749, 26844, 5906, 106837, 15569, 54761, 17180, -49392, -108448, -102542, - 30065, -12885, 39192, 35433, -8590, 23622, 33823, 2147, -10201, 37044, - 33286, 22549, -24159, -13959, -23622, -39192, 14496, 9664, 9664, 3758, - -15032, 12348, -8590, 0, -28454, -23622, - }, - { - -3007551, 5087926, 2579665, -261993, 482110, 440234, -1634772, 319438, 530428, 5906, - -277562, -13422, -78920, -163209, -406948, -31139, -85362, -312996, -152471, -190589, - -417686, 79457, 6442, -266288, -98247, -15569, 9664, -223875, 95026, -106300, - -319438, -229781, 148713, 221728, -242129, 119722, 268972, -143881, 186831, 126702, - -314606, -192200, 34897, -82678, 124554, -93952, -196495, -31675, -100395, 48855, - -112743, -61740, -81604, -86973, 92342, 104690, 76236, -48318, -151934, 53150, - 65498, -34360, 9664, 92879, -34360, -27917, -9127, 37044, 28454, -31675, - 2684, 48855, -16643, -42413, -37581, -15569, -56908, 30065, 15569, 5369, - 22549, -33286, 13422, 37581, -48855, 17717, -48855, -21475, -27380, 21475, - -2147, -23085, 3221, 37044, -2147, -30065, - }, - { - 126702, -1598802, -409633, -253940, -173946, -241055, 345208, 78920, -99321, 162672, - -351114, -83215, -679142, -1482301, 294742, 904628, -350040, -448287, -324270, -328028, - 500901, 918049, -358093, -657130, -396211, -81604, -399969, -1074, 92342, 9664, - 8590, 452582, -160524, 332860, -494458, 81068, 201863, -110059, -250719, -19327, - 35433, 72478, 86973, -231928, -17180, 78920, 98247, -121870, -90731, -57982, - -195958, 89657, 35970, -130997, -91268, -13422, 106300, 128849, 90731, 28991, - 67109, -97711, 5369, 104153, 137439, -20938, -34360, 60130, 34360, 22549, - -12348, 19864, 17717, -14496, -1074, -62277, -74625, -5906, -1611, 7516, - 14496, -13422, 47245, 34897, 14496, 23622, 45097, 44023, 9664, 5369, - -3758, -21475, -13422, 13422, 2684, -11811, - }, - { - -243203, 1198833, -637266, -1809255, -24696, 682900, -1057636, 231391, 41876, 960462, - -241055, -36507, 374736, 297427, 572841, 530428, 480499, -40265, 75162, -374199, - -432181, 108985, -154619, 428423, 287763, 65498, -277562, -40802, -24159, -159988, - -227096, -120259, 119185, 111132, 236223, -70867, 112743, 330176, 51540, -134218, - 180389, -18254, 253940, -122943, 285615, 146029, 163746, 153545, 148713, -165893, - -1074, -75699, -100395, 117038, -264677, -62814, 22549, 2684, 120796, 6979, - -90194, -42413, 13422, -95026, -81068, -20401, 49392, 101469, 18790, -117038, - 40265, 63351, -15569, -53150, 3221, -5369, 12885, 11274, -6979, -31675, - -45097, 52613, 26307, -537, -60666, -19327, 53150, 44560, 15569, 49392, - 18254, 11274, 537, -39728, -10201, -52613, - }, - { - -343597, 160524, 293132, -122943, 61203, -256087, -6442, 63888, -171262, 190052, - 61740, -76236, 288837, -227633, -7684234, 413391, -543850, -260382, 315143, 1084479, - -56908, 154619, 303869, -632971, -193810, -300111, -415538, 610959, -485868, -479963, - -41876, 507343, 699543, 442919, 44023, 466541, 167504, 90731, 209380, 11811, - 61740, -83752, -132070, -86973, -32212, -29528, 31139, -250719, -51540, -5906, - -45634, -74625, -49929, 107374, 35970, -28454, 27917, 18254, -55835, -8053, - -54761, -157303, 42950, 27917, 32212, -48318, 92879, -26844, 2147, 37581, - 11811, 57445, -17180, -44023, 32212, -26844, 15569, 81604, -16643, 13422, - -68719, -44023, 44560, 13422, 13959, 45634, 38118, -14496, -27917, 42413, - -17717, -51540, -9664, 22012, -29528, -20938, - }, - { - 287226, -2586644, 957778, 1127429, 424665, -1413044, 461172, 231928, -268435, 238908, - 1436667, -602369, -306016, -756451, 1198833, -525597, -231928, 175557, 140123, 11811, - 844498, 226560, -318364, -282931, 299037, 424665, 333934, 29528, -638876, -310848, - 20401, 26307, 57445, 204011, -137439, 194884, 32212, 56371, 5369, -118112, - -52613, -336081, 57445, 142808, 139586, -46708, 190589, 18254, 67646, -217970, - 290984, -51540, -225486, -94489, -98247, -124554, -8053, 69256, 17180, 47782, - -81604, -18254, 18790, 95026, -41339, -20401, 49392, -7516, -20938, 10737, - 10201, 84289, 32212, -48855, -122407, 0, 32212, 5369, -32212, 8053, - 48318, 2684, -34360, 28991, 12885, -537, 18790, -42413, -38118, 41339, - -13959, 25770, 28454, 17717, -11274, -24159, - }, - }, - { - { - 197569, 3074660, 164819, 862215, 82678, -140660, -11811, -109522, -46171, -121870, - -162672, 154082, -91268, 1309965, -1287953, 490163, 623844, 146566, -428423, -337155, - 441308, -865436, 64961, -288300, 148176, -131533, 177167, -93952, 130997, 200790, - -78383, -485868, -18254, 277025, 167504, 256624, 90731, 396211, 337155, 37044, - -41339, -48318, -34360, -115427, -130997, 20401, 48318, 201327, 59593, 1074, - -51003, -53150, 31675, -41876, -148176, 83752, 68183, 68719, 29528, 13422, - -26844, -210990, -20401, 66572, -89657, -42950, -10201, 10737, -61740, -49392, - 49392, -4832, 37044, -12348, 3758, 22549, 15569, 13959, -24696, 0, - 41339, -35433, -61203, -42413, -24696, 55298, 22012, -5369, 15032, 34360, - -15032, 2147, 3758, -1074, 33286, 17717, - }, - { - -3001109, 26287884, 5603322, 1927367, 780610, -252866, -399432, 535260, -121870, -216359, - 132070, -130997, 191126, 311922, -162135, 124017, 397821, -115964, -658204, 136365, - -252329, 598611, -68719, -204011, -97711, 79994, 81068, 51003, -14496, -85899, - 144955, -227096, -54224, 275415, 149250, -111669, 141734, 72478, 270583, -41339, - -174483, -12348, -129923, 207232, -369904, 121333, 75162, 120796, 15569, -13959, - 157840, -180926, -246961, -28454, 31675, -14496, -143345, -70330, -15569, -537, - -144418, -30065, 38118, -5369, 122943, 56908, -4295, -35433, -90731, 38118, - -1611, 25770, 23085, -9664, 83215, 2684, -38118, 37581, 51540, 1074, - -38118, 3221, -3221, -48855, -23622, 50466, -11274, -20938, 4832, 0, - 20401, -8053, -25233, 9127, -6979, 1074, - }, - { - -85899, 4955856, -624918, -2258079, -1054415, 85362, -180389, 204011, 240518, 273804, - 26307, -144418, 105227, 105764, 703838, 48318, -53687, -16106, 567473, 216896, - 397821, -4832, -220117, 85899, -245350, -350577, -68183, 269509, 154619, 341450, - -17180, -56371, -110059, 81604, 406411, 43487, 51003, -71404, 178241, 61740, - 6979, -347892, 82141, -130997, -215285, 248571, 192737, -90194, -27380, -22549, - 176094, -21475, -107374, -30602, -19864, -59056, -130460, -85362, 149787, 48855, - -103079, -86436, -106300, 52076, -1074, -33286, -19864, 13422, -1611, -41876, - 2684, -13959, 6979, -84289, 19864, -11274, 31139, 3758, 18254, 54224, - -12348, -23085, -40802, -13959, 39728, -12348, 17717, 3221, 5906, 44023, - -1074, -27380, -13422, 6442, 10201, 537, - }, - { - 387621, -474594, -776315, -417686, 58519, 140123, -75162, 53687, 15032, 81604, - 24696, 189515, -15569, -1341640, 282394, 425202, 1551020, 571231, 1609002, 273267, - 154619, -504122, -19327, 455267, -1030255, 511638, 272194, -116501, -341987, 54761, - 303332, -433255, 17180, -388158, 287226, 65498, -217970, 157840, -112206, -130460, - 30065, -70330, 16106, 118648, 43487, -125091, -11811, 10201, -168577, -13959, - 134755, 10201, -103079, 100395, 16106, 14496, 99321, -2147, -22012, 41876, - 16106, -82141, -9664, 17180, -86973, -68183, -5906, 2147, -28991, -10737, - 107374, 28991, -9664, -60130, 42413, -10737, -66035, -60130, -12885, 24159, - -537, -40265, -11274, -5369, -3758, 24159, 2147, -8053, -31675, 18790, - 10201, -39728, -51003, -3221, -19327, -21475, - }, - { - 3398393, 7559143, 3941169, -329639, -193274, 42413, 116501, 45097, 166967, 178241, - -18790, -242129, -377420, 341987, -29528, -237297, 44023, 360240, 75699, 268435, - 105227, -331249, -79457, 428960, 64961, -3221, 47782, 755377, 144955, -104690, - 16643, 17717, -70330, -107374, -311385, 82678, 294205, 113280, -82678, 132607, - 224412, 99858, -99858, 212601, 206695, -288300, -107374, 63351, -176094, -85899, - 113817, -226023, 91805, -8053, -33286, 15032, 126702, 116501, 6442, -16106, - -58519, -41339, -52076, -33286, 16643, -56908, -85899, 9127, -75699, 9127, - 16106, 36507, 113817, -53150, -64425, 16106, -60666, 3758, 4832, -24696, - -13422, -7516, -23622, 13959, 30602, 9664, -7516, 2147, 27917, 13422, - 2147, 18790, 12348, 40265, -15569, -8590, - }, - { - 26307, -318901, -1152125, 249645, 76773, 37044, -86973, -74088, 66572, -5906, - 210990, 132070, -6442, 867583, 1785633, -158914, 845572, -686658, -264677, 1134945, - 329639, 119185, -316754, -445603, 184147, -67109, -872415, -549219, 134755, 1034013, - -392453, 107911, -43487, -301721, -156229, 160524, -10201, -364535, 133681, 75162, - -231391, 28454, 48855, 20938, 44560, -186831, 50466, 121870, 51003, 143345, - -98784, -11811, 91268, 20401, -12885, -147103, 46708, -67109, 44023, 55298, - 14496, 23085, 11811, 30602, -30602, -10737, -15032, 61203, 39192, 42413, - -17180, -53687, -10737, 10737, -28454, -33286, -51003, -48855, -30065, 15569, - -1074, -17180, 28454, 25770, -3221, -20401, -1611, 4295, -11811, -2684, - 34897, 13422, -49392, -24159, -13422, 12348, - }, - { - -111132, 18709952, 409633, -107374, 5906, -26307, -75699, -34897, 201863, 192737, - -95563, 82678, -16106, 755377, -815507, -431107, 158914, -257161, 198642, 452045, - 288300, -181999, 4295, -79457, -66572, 165356, -406411, 100932, -190052, 200253, - 39728, -162672, -16643, 5369, 84289, -102542, -108985, 409096, 46708, -208306, - -81068, 296890, 12885, -32749, -83752, 98784, 218506, 80531, -2684, 3758, - 17180, 115427, 17717, -59056, -54761, -176094, -42413, 30602, -119185, -59056, - -48855, -46708, 6442, 9664, -26844, -48855, -69793, 59593, 28991, -55835, - 42413, 67646, -60130, -45097, 37044, 27380, -43487, 17180, 20401, -37044, - 2684, 22012, -21475, -23622, 64961, -25233, -35970, 8053, 31675, 13959, - -37044, 6979, 0, -1074, 21475, 0, - }, - { - 17717, -1398012, -271120, 422517, -68719, 117575, -31139, -40802, -12885, 1611, - 199716, 168041, 441308, -893353, 5341866, -329102, 631897, -329639, -38118, 10201, - 166430, -126702, -301185, 727997, 705985, 653909, -154619, 223875, 438624, -60666, - 512175, 179852, -263067, 223875, -23622, -27380, 23085, 6442, -31139, -200790, - 6979, 9127, -95026, 37581, -3758, -67109, -186831, 57445, 200253, -3758, - -194884, -116501, 60666, -171262, -113817, -2684, -76236, -131533, 102005, -113280, - -82678, -22549, -87510, 63351, 0, 106300, -49929, -99858, -29528, 9127, - -56908, -6979, 30065, -16643, -39192, 23622, -47245, -8053, 7516, -12348, - 37044, 40265, 17180, 5906, -31139, -2684, -31675, 5906, 23085, -40265, - 20938, -8053, 2147, 13959, 3221, 6442, - }, - { - 6286759, 21864604, -4219806, 1030792, 41876, -70330, -362925, 518080, 51540, -545998, - 284005, 759136, 219580, 389768, 941135, -253403, -280247, 149250, -262530, 163746, - 124554, 319438, 314606, 149787, 295816, -233539, 130997, 168041, -449898, -155693, - -98247, -122943, 154619, -23622, -28454, -118112, 69793, 314606, -281857, -192737, - 43487, 67109, -62814, -120796, -161061, -238908, 537, 86436, 64425, 19864, - -185220, -20938, -4295, -154619, 54761, 76236, 8590, -95563, 115964, 80531, - 2147, 34897, 35433, 6979, 166967, 31139, -93416, -17717, -2684, -55298, - 38118, 6979, -88584, -20938, -75699, 45634, 26307, -56371, 15032, 24159, - -11274, -15032, 56371, 39192, 42950, 33286, -9664, -38655, -13422, -7516, - 33286, 5906, 28454, -21475, -8053, 17180, - }, - { - 235149, 358630, -498216, 502511, 363462, -857383, -1611, 95563, 173409, -212064, - 184147, 750546, 79994, -144418, -360240, 183073, -246961, -270046, -598611, 59593, - 390305, -554588, 260382, -272194, 298500, 8053, 270583, -57445, 184147, 253403, - 222801, -26307, -467615, -170188, 51003, -118648, -264677, -404264, -47782, -137976, - -182536, -25770, -32749, 103079, -198642, -144955, -98784, 54224, 25233, -107911, - -146029, -75162, -63351, -2147, 298500, 28991, -93416, 6979, -67109, -23085, - 13959, 19864, 78383, 73014, 55298, 49929, -84826, -74088, -86436, 3758, - 2684, 25233, 86436, -13959, -33823, 15569, 53687, 11811, 23085, 47245, - 6979, -537, -41339, -8053, -37044, -16643, 28991, -11811, 14496, -27917, - -4832, -14496, -9664, 1074, -34897, -10201, - }, - { - 1824824, 10372883, 310311, -2389613, -158914, 426812, -1095754, 539555, 330176, -186831, - -122943, 102542, -69256, -32749, 213138, 89657, -158914, -112743, 58519, -431644, - 41339, -167504, -193810, -370441, 177167, 143881, 109522, -126702, -128312, 66035, - -99858, -97711, -38655, -80531, -322123, 124554, 53150, -151934, 270583, -177704, - -403727, -8590, 108448, -70867, 85362, -52076, -104153, -57445, -121870, 141197, - -57982, -4832, -57982, -15569, 35433, 117575, 111132, -177167, -53150, 54224, - 15032, -47245, 42950, 97174, -75162, 9664, -3221, 34897, -13959, 7516, - 23622, 26844, -29528, -61740, -5369, -23085, -26844, 59593, -31675, 10737, - 12348, -27917, 40265, -24159, -26307, -39192, -23085, -16106, -15032, 25233, - -18254, -1611, 18790, 20938, -25233, -15569, - }, - { - -200253, -1605244, 129923, 304406, -50466, -15032, 476205, -105764, -539555, -23085, - -93952, 136902, -102542, -175557, 535797, 734976, -689342, -1242856, -359704, -626528, - 335007, 889595, -618475, -628139, 0, -129923, -129386, -223875, -152471, -766115, - 335544, 272730, -99321, 277025, -395137, -5369, 157840, -350577, -93952, 24159, - 153545, 35970, -51003, -149787, 49392, 59593, 193274, -67646, -15032, -114890, - -111669, 100395, -25233, -49929, 1611, -537, 159451, 194347, 5369, 47782, - -24696, -1074, 45097, 150861, 76773, -111669, 27380, -22012, 4832, -2684, - -39728, 28454, -14496, -25770, 22549, -61203, -63888, 19864, -9127, 41876, - 11811, -23085, 42950, 27380, -1611, 39728, 37044, 16643, -9127, 1074, - -3758, -24159, -21475, 29528, 7516, -25233, - }, - { - -828929, 1702418, 215285, -347892, 163746, -1178432, -1590749, 863825, 154082, -23622, - -546535, 41876, -207769, -181462, 115427, 223338, 82141, -261993, 154619, -654446, - 92879, 286152, -155156, -22012, -111669, -188442, -105764, -31675, -60130, -111132, - -190589, 52076, -139050, -306553, -35433, -205622, -109522, 46708, -139050, -92879, - 360777, 164819, 303332, 119722, 139050, 277562, -34897, 134218, 89121, -3758, - -96100, -97711, -86436, -54761, -101469, -26844, 52076, 42413, 109522, -69256, - -32749, 25233, 10737, -96637, 28991, 57982, 46708, 63351, -46708, -93416, - 115964, 68183, -77309, -49392, 9127, 4295, 15032, -42950, -19864, -26844, - 33286, 70330, -1074, -16643, -34360, 45097, 73551, 16643, -2684, 28991, - -3221, -1611, -38118, -21475, -17180, -39192, - }, - { - 170188, 1130113, 219580, 51540, -102005, -193274, -26307, -126702, -225486, 348966, - 96637, -89121, 287763, 1878511, -3661460, 1582696, -1401233, 47245, -6979, -152471, - -674310, -214748, 112743, -245350, -197569, -694711, -492848, -7516, -276489, 326954, - 215285, 266825, 78383, -44560, 53150, 122943, 47782, 45634, 8053, 156766, - -4295, -140123, -115427, -15569, 97711, 101469, 44023, -137976, -144418, -1611, - -160524, -7516, 39728, 78383, 5369, 50466, 37044, 10201, -81604, 37044, - -165356, -116501, 23622, -38655, -20938, 52613, 79994, -67646, -2147, 8590, - -17717, 74625, 19327, -30602, 8053, -40802, 72478, -19327, 21475, 537, - -106837, 11274, 31139, 11811, 44023, 41339, 32749, -48855, 1074, 14496, - -54224, -26307, 32749, 14496, -24696, 18254, - }, - { - 278636, -1850057, 1111860, -488553, -710817, -2444373, 233539, 263604, -79994, 371515, - 107374, -1091995, 173946, -557809, 450972, -705985, -42950, 88047, -373125, -105227, - 827855, 57445, -20938, -389768, 362925, 363462, 213675, 517544, -237297, -80531, - -12348, -148176, 3221, 171799, 123480, 213675, 184684, 44560, -105227, -69793, - 53687, -42413, 178241, -82141, -38118, 189515, 333934, -102542, -44560, -61740, - 301185, -30602, -135828, 75699, -139586, -34897, 83215, -47245, 71941, 76236, - -11811, 84289, 13422, 110059, -6979, 19864, 42413, 57445, -17180, 2684, - -10737, 71404, 1074, -58519, -65498, 41339, 31675, -17717, -22549, 30602, - 0, -23085, -4832, 21475, -3221, -32749, 15032, -75699, -2684, 33823, - -22549, 33823, 8590, -1611, -3221, -8053, - }, - }, - { - { - -333397, 5885179, 84826, 603443, -239444, -40265, -204548, 121870, -74625, 35433, - 13959, -122943, 1030792, -134755, -732292, 466004, 275415, 105764, 802622, -610422, - 159451, -99858, 770410, 450435, -23085, 16106, -91805, -135291, 350577, 530428, - 58519, -267899, 227096, -337155, 54224, 82678, 86973, 76236, -139050, -256624, - 99321, -46708, 54224, -268972, 76773, -93952, -82678, -113280, 52076, -43487, - 9127, 36507, -15569, 21475, 111669, -75162, -77309, -90731, -33286, 28454, - 61740, 4295, 90194, -1611, -52613, 38118, 4295, -19864, -3221, 88584, - -22012, -28991, -22012, -9664, 15569, 21475, -25770, -1074, 35433, 26844, - -25233, -11811, 37581, 56908, 28991, 2684, -17717, 13422, 8590, -24159, - -24696, 33286, -6442, 12348, -18254, -24159, - }, - { - 3427921, 24433532, 891743, 37581, -250182, -10201, -381715, -996432, -682363, 4295, - -31139, -166967, 400506, 306016, -474594, -659814, -246961, -149250, 354872, -419296, - -374736, 379568, -128849, -316754, 3758, 360777, -408022, -49929, 149250, 83215, - 326418, -144955, -207232, -135291, 164819, 174483, 61740, 91268, -204548, -272730, - -165356, 149250, 163209, 23085, -4295, -15032, -53150, -23085, -335544, 151934, - 70330, -101469, 48318, 156766, 31139, -8053, -66035, 53150, -31139, -43487, - 82141, 26844, 31675, 54224, -5369, -71404, -32212, 39192, 8590, 55298, - -11274, -28991, -26844, 24696, 4832, -50466, 39192, -25770, -33286, -6442, - 41876, -1074, -35970, -1074, 62814, -23622, -54761, 37044, -14496, 9127, - -12348, -537, 12885, 11811, -5369, 3758, - }, - { - 114890, 4708895, -2248416, -1087701, 1323387, -85899, 193810, 302258, 82678, -167504, - -387621, -150861, -528281, 44023, 326954, 238371, -284542, 293668, 313533, 86436, - 138513, -297427, -42413, -143345, -359704, -34897, 133681, 292058, -6979, 19864, - -98784, 74088, 251256, -13959, 191126, 10737, -19327, -55298, 273804, -35433, - -259309, 71941, 30065, 40802, 91268, -156229, -184147, 227096, 140123, 215285, - -54761, -183610, -129923, 49929, -47245, -74088, -10201, 106837, 115427, 3758, - -57445, 71404, 88584, 23085, 41339, 45634, 11811, 27380, 6979, 49392, - 22012, -25770, 35970, 2684, -3758, -10201, 45097, -19327, -1074, -28991, - -3221, -22549, 25233, 10201, -51540, -13422, -6442, -26844, 1611, 2684, - 537, 23085, 13959, 26844, 2147, 6442, - }, - { - -255551, -1664300, 100932, 132607, 132607, -41339, -53687, -1074, 84289, 61740, - 53150, -53150, -456340, -1023276, -1258425, 1705102, 532039, 474057, 1008780, 134218, - 237834, -1097901, 126165, 398895, -296890, -170725, 96100, 520228, -399432, -674310, - -121870, 590021, 31139, -443992, -140123, 129923, 122407, -233002, 157303, -25770, - -101469, 46708, 4832, -31139, -113817, -5369, 60130, -9664, -32212, 131533, - 74625, -92879, 125091, 40802, 123480, 113817, -66572, -30602, 89657, -85362, - -62814, -57445, -3221, -38655, 55835, -2147, 6979, -42950, 75699, 36507, - -30065, -92879, -41339, 27917, 27380, -62277, 27380, 59056, 27380, -6442, - -6979, -1074, 17180, -5369, 8590, -34897, -17717, 16106, 37581, 15569, - -4832, -9127, 28454, 20401, -11811, 17717, - }, - { - -2121714, 19828254, -1302986, -256087, 264141, 1611, 424128, 25770, -207769, -137439, - 4832, 502511, -358093, -129923, 214748, -89121, 100932, 191126, -150324, 219580, - -211527, -195421, 446677, -441845, -266825, 223338, 267899, -119722, 110059, -135291, - 96100, 155693, -315680, -117575, -190052, -42413, -398895, -530428, 171799, 101469, - -51003, 121333, 86973, 265214, -198642, -63351, 2684, 9664, -35970, -98784, - 36507, 152471, 43487, -106300, -49929, 94489, 78383, -129923, -76236, -61740, - 1074, -100395, -33823, -7516, 9664, -71941, -42413, -107911, -37044, 79994, - 12885, -94489, -62277, -73551, 46171, -5369, 9664, 75699, -57445, -1074, - 28454, 17717, 14496, 11274, -62277, 9664, 12348, -4295, -17180, -18254, - 4295, -22549, 537, -15569, -25770, 7516, - }, - { - -290984, 283468, 363998, -121333, -71941, -56908, -41876, -41876, 195421, 115964, - 80531, -81604, -118648, -271657, -580894, -19327, 1319629, -201863, 239981, 821949, - 569083, 368830, -379568, -350577, -957241, -864362, -542777, -693637, -84289, 1226750, - -289373, -90731, -68719, 8590, 122407, 208306, 199179, -130997, 269509, -69256, - -67646, 77309, -71404, 113280, 66572, -17717, -1074, -59056, -60666, -15569, - 24696, 129386, -41876, 62277, 27380, 65498, -74088, -78383, 17717, 9127, - 16643, -43487, 97711, 18790, 9127, 17717, -88584, 6979, 26844, -38655, - -40802, 113817, 12885, -23085, 1611, 27917, 66572, 38118, 32212, -32749, - -8053, 42413, -33286, -24159, -14496, 10201, -5369, -4832, -537, 16106, - -1074, -49392, 5906, 28454, -2147, -3221, - }, - { - 3594888, 13654238, 179315, 402116, -478352, 92342, -43487, 403727, 82678, -131533, - -29528, 240518, -19864, 424128, -401579, 250719, -52613, 162672, 93416, -267362, - -78383, -122943, -17717, -191126, -69256, -57982, -181462, 256624, -561567, -196495, - 120259, -109522, 206158, 89121, 262530, -149250, 42413, 48855, 18790, 5369, - -54761, 170725, -64961, -198642, 114890, -90194, -46171, -197032, 52076, -38655, - -8590, -81604, -53687, 76773, -191126, 26844, 52076, 48855, 81068, 65498, - -3758, -19327, -11274, -33286, -62814, 28991, 87510, 54224, -61740, -2147, - -2147, -102005, 53150, 114354, 9127, -55298, 3758, 32212, -7516, 22012, - 36507, -22012, 27380, 31139, -42413, -43487, 53687, 27380, -5369, -27380, - 7516, 35433, -36507, -12885, -19864, 3758, - }, - { - -340376, -319975, 1202591, 184684, 115427, -96637, 1074, -148176, 98247, 145492, - -44560, -190589, -387621, -135828, 3502546, 872415, -654446, -740345, 30602, -1070521, - -610959, -181999, -146029, -202400, 883153, -64961, -595390, 448287, 96637, 137439, - -68183, -108985, -227633, 158377, -373662, 190052, -32212, 154619, -63351, 26307, - -39728, -39728, -6442, -162135, -105764, 3758, 135291, 26844, -173409, 88584, - 91805, -140123, -11811, -26844, 107911, 8053, 26307, 122943, -139050, -163746, - 24159, 35970, 75699, 10201, 15569, -45097, -53687, 537, -38655, 4295, - -42950, -12885, -13422, -4295, 46171, 9664, -14496, 84826, 54224, 24696, - 48318, -54224, -28454, -46171, -10201, 27380, 17717, 25770, -23085, 22549, - 37044, -30602, 10737, 2684, -2147, -3221, - }, - { - -5931350, 30662308, 870805, 1464584, 194884, 95563, 231391, -231928, -369904, 451508, - 112206, -317291, -841277, 152471, 1282585, -20938, 651224, -258235, -150861, -56908, - 435939, 183610, 5906, 396748, 103079, 80531, 215822, 209917, -330712, -18254, - 49392, 243739, -74625, -99321, 34360, -207232, -284542, -151398, 568009, 110595, - 104153, 57445, 53150, 64961, -62277, -158914, 294205, 45634, -118648, -53150, - -38118, 6442, -67646, -54761, 92879, -21475, -104690, 74088, 89657, -67109, - 15032, 71941, 41876, 10201, -85362, -133681, 4295, 25770, -57445, 3758, - 8053, -64961, -34897, 29528, 37044, -45634, -62814, 31675, 17180, -3221, - -44023, 19327, -44560, 23085, -41876, -13422, 4832, 21475, 33286, 31675, - 4832, -2147, -16643, -11811, 31675, -3758, - }, - { - -91805, -815507, 1065689, 112743, -221191, 609349, 358630, -459562, 144955, 261456, - 255014, 4295, -229244, 140123, 676994, 11811, -181462, -830539, 1042066, 849330, - -387084, -657667, -49392, 266825, 741419, 164283, 151398, 446140, 111669, 317291, - 270046, -583579, 55835, 132070, -70330, 37044, -61203, 166967, 57445, 46171, - -55835, 132070, -18254, -62814, -55835, 162135, -69793, -3758, -176094, -15569, - 169651, 25233, -21475, 159451, -56908, -153545, -48855, 32749, 40265, 121333, - 20938, -40265, -51540, -64961, -18254, -81604, -23622, 74625, 125628, 76236, - -43487, 47782, 3758, -40265, 23085, -28454, -26844, -15032, -4832, -38118, - -42950, -12348, 9664, 5369, 5906, 32749, -3758, -14496, -6442, -9127, - 18254, 537, 11274, -1074, 20938, 27380, - }, - { - -767725, 13300977, -1040456, -2131915, -107911, 1236414, 845572, -541703, -389768, 123480, - -14496, 42950, 311385, 477278, -110059, 229244, 129923, 261993, -51540, -282931, - 158377, -431107, 123480, -208306, 226023, 242129, -100932, -258772, -12348, 209917, - 279710, 41339, -207232, -240518, 11811, -236760, -73014, 239444, -90731, -53687, - 284542, 108448, -101469, -537, -249645, -33823, 31675, 96637, -69256, -4295, - 98784, 102542, 27917, 9664, -108985, -89657, -25770, -31675, 133144, -83215, - -6442, 17717, -15032, -24159, -17717, 10201, -22549, -7516, -42413, 10201, - 12885, -14496, 9127, 69256, 56371, 25233, 42950, -28991, -41339, -3758, - -32749, 36507, -13422, -22012, 30602, -15032, 46171, -1611, 17180, -25233, - -2147, 19327, -15032, -34360, -5369, 28454, - }, - { - 189515, -1405528, -5906, 290447, -61203, 118648, -200253, -230854, -428423, -3758, - 132070, -182536, -97174, 533113, -399969, 275415, -560493, -826781, 411243, -226560, - -530965, 297427, 24696, 329102, 290984, -710817, -28991, -397284, -473520, 0, - 417149, -550830, -27917, -189515, 92342, -248034, 26844, -11811, 231391, 162672, - 66572, -157840, -8053, 186831, 86436, 90194, 14496, -49929, 157303, -4832, - 62277, -102542, -12348, 66572, 98784, -55835, 2684, -188442, -149787, -92342, - 11811, 142808, 18790, -55835, -114354, 4295, 70867, -75162, 4295, 13959, - 20401, 33286, 10737, 28991, 32212, 50466, 46171, 17717, -23622, -2147, - -8590, 18790, -51003, -44023, -11811, -5906, -32212, -30065, -6442, 5369, - -1074, 12885, 13422, -8590, -3758, 13959, - }, - { - 1272921, -2508261, 1316944, 1017907, 257161, -1347009, 1293322, 23622, -208306, -135828, - 385473, -8590, 24159, -976568, -80531, -176631, -290447, 136365, -70330, 86436, - 426276, 163746, 8590, -138513, -261456, 206695, 304406, 130460, 129386, -54761, - 55298, 80531, -111669, -433792, 48855, -156766, 108985, -182536, -124554, 313533, - 44560, -84826, -76236, 17180, -253940, -1611, -40265, -226023, -96637, 2147, - -39728, 47782, 5369, 98784, 238908, 75699, 33286, 66035, -124017, -33286, - 105227, -20938, -35433, -25770, 58519, 18254, -55835, -46708, -22012, 80531, - -8590, -37581, -12885, 49929, 10201, 2147, -43487, -9664, 9127, 33286, - 54224, -44023, -30602, 11811, 65498, 38118, -73551, -39192, -20401, -34897, - -20938, -7516, 13959, 37581, 6979, 38655, - }, - { - 11811, 1735167, -897111, 282394, -130460, 169651, -82678, -94489, 161598, 100932, - 184684, -34360, -514322, 1052267, 5405753, -970126, -1086090, 130997, -31139, -115964, - -209380, -325881, -63351, 419833, -170725, -251792, -91805, -161061, 338229, 206158, - 61740, -581431, -442919, 73551, 59593, -437550, 33286, -51003, -152471, 79994, - -11274, 146566, 22012, 10201, 94489, -17717, -2684, 104153, -75162, -26844, - 88047, 58519, 12885, -51540, -47782, 13422, -27917, -34897, -39728, 25233, - 31675, 99321, -81604, -67109, 9127, 60666, -61203, 84826, 46171, 12885, - -8590, -53687, 4295, 33823, -20401, 30602, -16106, -86436, 38655, -25770, - 48855, 57445, -33286, -5369, -9664, -41876, -38118, 16643, 17717, -36507, - 24696, 57445, 9664, -18254, 31139, 11274, - }, - { - -386547, -1686848, 594316, -823560, -454730, 1068373, -754841, 86436, 95026, 337155, - -583042, 295816, 217433, 1025423, -2077690, 166430, 410706, 45097, -201863, 314606, - -284005, -148713, 103079, 223875, 146566, -141734, -156766, 896038, 137976, -256624, - 45634, 105764, -168041, -82141, 126165, 30065, -106837, -39728, 76236, 119722, - 9664, 292595, -52076, -204011, -115964, 155693, -100395, 19327, 59593, 143345, - 82678, 163209, 144955, 118112, -3221, -32212, -37044, -82141, 64961, 20401, - 35970, 16643, -71941, -29528, -3221, -16106, -27917, 48318, -13422, 12885, - -22012, -51003, -41339, 74625, 71404, -12348, -35970, -31675, 16106, -10201, - -43487, -7516, 34897, -1611, 19327, 14496, -2684, 22012, 24696, -44023, - 0, -11274, -11811, -2684, 17180, 20938, - }, - }, - { - { - 102542, 5863167, -266825, 135291, -312459, 77309, -180389, 169651, -62814, 161598, - -215822, 100395, 383326, -618475, 105227, -74625, -181999, 241592, 1292248, -424128, - 431644, 641024, 440771, 180389, -77309, -79994, 102005, -82141, 92342, 323196, - 102005, -60666, 258235, -191663, -212064, 19327, 16106, -265214, -294205, -291521, - 49392, -77846, 27917, -74088, 267899, -117575, -130997, -133144, -55298, -59056, - 0, -25770, -52076, 42413, 37044, -94489, -21475, -136902, 20938, 32749, - 43487, 84289, 63351, 12348, -2147, 32749, -54761, -9127, 55298, 49392, - -33823, -15032, -24159, 19327, 12885, -19864, -30065, 10201, 22012, -6442, - -19864, 13422, 48318, 34897, 8590, -32749, -26844, 4832, 1611, -40265, - 10737, 7516, -2684, 3221, -32212, -14496, - }, - { - -3292629, 15647103, 2916820, 79457, -517544, 196495, -229244, -929860, -192737, 376883, - 281857, -14496, 236223, -213675, -656056, -500901, -66572, -138513, 414464, -425202, - -385473, 156766, -45634, -25233, 67109, 108448, -353261, 115964, -45097, -60666, - 66035, 9664, -28454, -80531, 122943, 365072, 171799, 98247, -319438, -178241, - 61203, 155156, 143881, -79994, 1611, -124017, 63888, -134755, -214748, 252329, - -130997, 13959, 198105, 88584, -54761, -22012, 96637, 100395, -41339, -45097, - 117575, -9664, 31139, 68719, -88047, -50466, -22012, 60666, 39728, -4295, - -34360, -41876, 1611, 6979, -61740, 3221, 25770, -46708, -22549, 4832, - 32749, -16643, 5369, 25233, 42413, -64961, 3758, 26307, 0, 6442, - -19327, 7516, 19864, -11811, 7516, 0, - }, - { - 477815, 10810433, 3737695, 359167, 1180579, -264677, 129386, -56371, -56908, -247497, - -47245, 291521, -270583, -407485, -261456, 777926, 300111, 297427, 120796, 13422, - 40802, -169114, -163209, -61740, -46708, 209917, -34360, -34897, -198105, 263604, - 65498, -70867, 78383, -155156, -41339, -94489, -3221, 36507, 39728, -309238, - -118112, 282931, 79994, 106837, 119722, -329102, -214212, 247497, -26844, 57445, - -2147, 99858, -22549, 5906, -21475, 26844, 62277, 16643, 45097, 4832, - 39728, 92342, 84826, 20401, 51540, -22549, -1611, -19327, 17180, 44560, - -4295, -54224, 16643, 13422, 3221, 14496, 23622, 4832, 2147, -49929, - 0, 11274, 35970, -14496, -42413, 3758, -30065, -12885, 15569, -17180, - 18790, 19327, 15569, 5369, -4295, 10201, - }, - { - 293668, -2662343, -794569, 219580, -48855, -113280, -10737, -25770, -33823, 19327, - 33286, -117575, -466004, -555125, -2455111, -293132, -630286, 280247, 170725, 114890, - -229244, -966905, 128312, -63351, 30602, -990527, -485331, 766115, -214212, -482647, - -36507, 688805, 118112, -327491, -254477, 76773, -109522, -100395, 160524, -150861, - 20938, 4832, -57982, -120796, -68183, 124554, -42950, 46171, 124554, 69793, - -55298, -35970, 51003, -22012, 121333, -25770, -83752, 50466, 5906, -89657, - -12885, 28991, 1611, -19327, 50466, 2147, 20938, -41339, 41876, 3221, - -82141, -43487, -11811, 40265, -11811, -18790, 77309, 56371, -12348, -26307, - -14496, 19327, 1611, 9664, 0, -33286, -2684, 27380, 48855, -15569, - 0, 27917, 41876, 16106, 4295, 21475, - }, - { - -501974, 24245628, 255551, -520765, -225486, -69256, 335544, 40265, -279710, -257698, - 261456, 211527, -100395, 236760, 562104, 356482, -10737, 113280, 217433, 150861, - -194347, -17180, 446140, -557809, 157303, 131533, 194347, -1185411, -690416, 158914, - 353798, 129923, -9664, 67109, 5906, 75699, -383863, -537, 105764, 28454, - 24159, 38118, -23622, -54761, -234076, 176631, 10737, 12348, 123480, -11811, - 110059, 110059, -67109, -57445, -24159, 95563, -24159, -117038, -46171, -60666, - -17180, -78920, 23622, -36507, -13422, -31139, 10737, -69793, -8053, 37044, - -11811, -88584, -55298, 6442, 38655, -26844, 31675, 36507, -26844, 9664, - 11274, 31139, 26844, -5369, -42413, 17180, 5369, -11811, -33286, -15569, - -6979, -24696, 1074, -26844, 1074, 8590, - }, - { - -74625, 1322313, 163746, -171799, -79994, -47782, 55835, -82141, 128849, 1611, - -32749, -24159, -254477, -870268, -71404, -405874, 201327, 405874, 1026497, 514322, - 166430, 510027, 372052, -351114, -1362578, -322659, 35433, -336618, -552977, 324807, - -491774, 6442, -24696, 79457, 138513, -130460, 170188, -51540, 157840, -59593, - 195958, 55835, -6979, 147103, 54761, -34360, -27917, -1611, -6442, -54224, - 56908, 59056, -99321, 29528, -2147, 52613, -70867, -22549, -26844, -41876, - -54224, -27380, 103079, 8053, -11811, 6442, -32212, -5906, 12885, -53150, - 18790, 89121, -38118, -23622, 42950, 26844, 73014, 39192, 13422, -45097, - 21475, 2684, -60130, -26307, 2684, 11274, -5906, 537, 4832, 4832, - -27917, -18254, 37044, 17180, 3221, -11274, - }, - { - -5995238, -432718, -285615, 957241, 666257, 72478, 69793, 93952, -334471, -124017, - -101469, 31675, -28454, 168577, -309238, 255551, -149787, 94489, 126702, -199716, - -66035, 136365, 35433, -30065, -3221, 172872, 182536, 98784, -341987, -113817, - 193274, 121333, 150324, -131533, 91805, -198105, -100932, 40802, -3221, 60130, - -69256, -33823, -110595, -100932, 102542, -140123, -267362, -185220, 103616, -70867, - 17180, -15032, 18790, 64961, -48318, 139586, 70330, 4295, 62814, 39192, - -33823, 6442, 9127, -18790, -26307, 71941, 65498, -37044, -74088, 17717, - -35970, -102542, 91268, 66035, -20401, -28991, 9127, 2147, 6442, 29528, - 6979, -5369, 43487, 17180, -69793, 6442, 39728, 6442, -20401, -16106, - 37581, 8590, -18254, -8053, -17180, 5906, - }, - { - -59056, 941672, 775242, 307090, -53150, -131533, 44023, -164283, 80531, 26844, - -252866, -163209, -439160, -799401, 971200, -1135482, -928250, -178778, -182536, -574989, - 53687, 155156, -212064, -436476, 1074, -591632, -240518, 123480, -9127, 303332, - -282394, -208843, -77309, 97174, -135291, 258772, -67109, 182536, 175557, 198105, - 70867, -100932, 10201, -178241, -178778, 32749, 255551, -85362, -156229, 207232, - 121333, -7516, -13959, 79994, 76773, 41339, 112206, 131533, -154082, -32212, - 70867, 62814, 44560, 16106, -1074, -49392, 8590, 23085, -19864, 10737, - 10201, 15032, -3221, 25233, 39728, -6442, 19327, 60666, 21475, -3758, - -20401, -45097, -13422, -30602, 10201, 15032, 39728, 537, -13422, 44023, - 5369, -10737, 2684, -10201, -1611, -10201, - }, - { - 4024384, 39221104, -810138, 2203318, 503585, 99858, 330712, -399432, -271120, 471910, - -421444, -656056, -556735, 217433, 654983, -201863, 327491, -368293, 107911, 5906, - 324270, -132607, -134755, 75699, -218506, 81068, 106300, 271657, 80531, 241055, - 8590, 6979, -232465, -9664, 128312, -74625, 168577, -241592, 405338, 343597, - 318901, 537, -54761, 128849, -59056, 135828, 216896, -198642, -124017, -53687, - 32212, -24696, -25233, 26844, 65498, -73014, -105764, -537, -51540, -87510, - 42413, 27380, 37581, -18254, -143881, -19864, 96100, -1074, -10201, 10737, - -31675, -32212, 24696, 30065, 56908, -98784, -41339, 47782, 7516, -39192, - -10201, 17717, -53150, -5906, -57982, -18790, 26307, 31675, 19864, -1611, - -18254, 1611, -26844, 13422, 12885, -14496, - }, - { - 86436, -1574106, 580357, -598074, -291521, 805843, -229244, -486942, 6979, -38118, - -78920, -383326, 108448, 244276, 888521, 611496, 724776, 144955, 1139240, 76236, - -638876, 21475, 34360, -51003, 359167, -69793, -53150, 176631, 91268, 272194, - 18254, -222265, 331786, 219043, -102542, 112206, 37581, 226560, -133144, 126702, - 74625, 131533, -73014, -69793, 142271, 152471, 62277, -2147, -109522, 133681, - 262530, 56908, 0, 44560, -180926, -40265, 54761, 24696, 73551, 92879, - -10201, -23085, -84289, -45634, -59593, -61740, 42413, 84826, 100395, -20938, - -26307, 12348, -42413, -15569, 23085, -30065, -52076, -25233, -20938, -47782, - -26307, 3758, 31139, 5906, 18254, 6979, -22549, 3758, -6442, 18254, - 0, 18254, 11811, -2684, 25233, 16106, - }, - { - 20401, 13781476, 234613, 372588, 517544, 273804, -955093, -960999, -537408, 226560, - 106837, 158377, 390305, 200253, -393526, 523449, 362925, 391379, 90731, 224949, - -28991, -277025, 73014, -155693, -40265, -74088, -197032, -120259, 154619, 3758, - 4295, -60666, -102005, -144418, 222801, -209380, 59056, 186831, -163209, 147640, - 221191, -67646, -130460, 24159, -156766, -5906, 537, 91805, -45097, -18254, - 117575, 113817, -12348, -57982, -75699, -130460, -62814, 86973, 88584, -77309, - 24696, 39192, -46171, -61740, 19864, -10737, -14496, -16643, -9664, 5906, - 12885, -1611, 30065, 85899, 17180, 30602, 18790, -69793, -2684, 9664, - -10201, 28991, -32749, 27917, 13959, 32212, 23622, 2147, 20938, -20401, - 12348, 2147, -28991, -17717, 19864, 16106, - }, - { - -116501, -457951, 1041530, 188442, -9664, -147640, -396211, -114354, -165893, 71404, - 5906, -185757, -147640, -746787, -1678259, 943282, 115964, -489626, 244276, 345745, - -143881, 304943, -26307, 90194, -54761, -513785, 12885, -128312, 120259, 774168, - 66572, -292595, -216359, -151398, 231391, -186831, -39192, 125628, 166967, 186294, - -5906, -74625, 126702, 105764, -62814, 38118, -120796, -32212, 185757, 68183, - 108448, -124017, -11274, -39728, -5369, -89657, -85362, -281320, -66572, -71404, - 99858, 56908, -12348, -117038, -81068, 89657, 16643, -35970, -23622, 11811, - 39192, -1074, 25233, 30065, -9127, 43487, 28454, -13422, -7516, -15032, - -4295, 32212, -57445, -48855, -2684, -22012, -25233, -12348, 10737, 3758, - -1074, 17717, 13959, -22549, -6442, 22012, - }, - { - -137976, -4002910, 2858301, 471910, 336081, 202400, 1491964, -754841, -343061, 129386, - 329639, 1074, 686658, -1018444, -214748, -174483, -206158, 284542, -185220, 576599, - 189515, 107911, -52076, 106837, 50466, 435402, 71941, -64425, 88584, 7516, - 123480, -69793, 27380, -124554, 277562, -54761, 215822, 47245, 17180, 143345, - -134755, -90731, -29528, -129923, -190589, -102542, 15032, -286152, -32212, -74625, - 39192, -4832, -22549, 220654, 139050, 49929, -21475, -5369, -122407, 95563, - 122407, -41876, -36507, -6979, -9127, -15032, -47245, -31139, 24696, 66035, - -74625, -35433, 53150, 52076, -21475, -12348, -21475, 34360, 5369, 28454, - -11274, -54761, 9127, 25233, 34360, -22549, -90731, -16643, -9664, -24696, - -8053, 2147, 45634, 28991, 16106, 29528, - }, - { - 64961, 1305133, -739808, 601832, -32212, 97174, -22549, 23622, -77309, -205085, - 303869, -5369, -17717, -1149441, 2260227, -689879, -638876, -228170, 79457, 441845, - 265751, -174483, -136902, 365609, 56908, 150324, -81068, 53687, 56908, -137439, - 262530, -185220, -293668, 156766, -108985, -227633, 23622, -163746, -120259, -107911, - 4832, 168041, 48318, -11811, 46708, -113817, 28991, 136365, 56908, -7516, - 217433, -19864, -90194, -45634, -50466, -49392, -32212, -18254, -2147, 3758, - 151934, 34360, -100395, -28454, 17717, -35970, -76236, 93416, 24696, -6442, - -15032, -45097, 1074, 26844, 4832, 62814, -58519, -10737, 1074, -6442, - 84826, -2684, -24159, -2684, -37044, -34897, -23085, 46708, -5906, -5369, - 56371, 32212, -30065, -12348, 30602, -22549, - }, - { - 152471, -694711, 68719, -1489817, 139586, 2609730, -258235, 118112, -128849, 77309, - -372052, 305480, -135291, 342524, -2239826, 381715, 107374, -97711, -24159, 41876, - -546535, -111132, 76236, 354872, -100395, -170725, 66572, 568546, -144955, -231928, - 199179, 225486, -242129, -248034, -76236, 121333, -41339, 69793, 29528, 9127, - -58519, 161061, -294205, -194884, -42413, 25770, -147640, 61740, 119722, 68719, - -28991, 76773, 88047, 44560, 116501, -12348, 5369, 21475, -8053, -64961, - -17717, -19327, -65498, -48318, -4832, -46171, -15032, 5906, -5369, 52613, - -13959, -42413, 24696, 93952, 18790, -52076, -27380, -2684, 33286, -16643, - -16106, 4832, 16643, -10201, 27380, 36507, -11274, 55298, -10201, -38655, - 15569, -26307, -9127, 0, 5906, 8053, - }, - }, - { - { - -41339, 1937567, 1728724, -171262, 119722, 53687, -76773, -62814, 0, -120259, - -176631, 48855, -549219, -35970, 1537598, -1037772, 268435, -145492, 328565, 294205, - 476205, 86973, -524523, -294205, 141734, 193810, -7516, -42413, 106837, -386010, - -239444, 253940, -251256, 404801, -55298, 96637, -177167, 251792, 136365, -59056, - -96637, -86436, -20938, 90194, 75162, -7516, 61203, 93952, -88047, -27380, - -152471, -38118, 11274, -119185, -118112, 36507, 51003, 41876, 68719, 25770, - -66035, -52613, -84826, 38655, 10737, -63888, -46171, 34360, -30065, -82678, - 13422, 33823, -10201, 33823, -537, -5906, 12348, 11811, -37581, -33286, - 18254, -11274, -35970, -67109, -39728, 9127, 30065, -12348, -10201, 26844, - 17180, -20401, 537, -5906, 19327, 27917, - }, - { - 2738042, 5185636, 3640522, 2403571, 235149, 49392, -144955, 514322, 588947, 67109, - 561567, 15569, -78383, 11274, -627602, 461709, 361314, -70330, -162672, -340913, - -173946, -71404, 396748, -61740, 111669, -183073, 84826, 314606, -84826, -78920, - -234613, 19327, -42950, 494995, 56908, -22549, 126165, 266825, 143881, 56908, - 157840, -43487, -115427, -61740, -137439, -27917, 183610, 26844, 164819, 1074, - -83752, 8590, -84289, -56908, -35970, -15569, -42950, -38655, -15569, -11274, - -68183, -66035, 40802, 31139, 25233, 68719, 32212, -27917, -58519, -54224, - 13422, 8590, 57445, -37044, 5906, 64961, -54761, 13959, 52613, 8590, - -48855, -13959, 36507, -18790, -44023, 28991, 37581, -35433, 24696, -3221, - 5906, 10737, -9127, -16643, 5906, -8590, - }, - { - -754304, 18666464, 1849520, -938450, -1495722, -32212, -117575, -328028, -21475, 211527, - 437013, 220117, 564251, 507343, -671089, 554051, 426276, -195421, 513249, 207232, - 148713, 299574, -380641, 105227, 24159, -171262, -286152, 41876, 229781, 139050, - 186831, -96100, -307627, 86973, 106300, -150324, -16643, -18790, -198105, 23622, - 0, -89121, 40265, 29528, -194347, 9127, 119722, -17717, -198105, -154082, - 195421, 223875, 73551, -78920, 64425, 56371, -71941, -152471, 28991, 69256, - 57445, -156229, -9664, -4832, -6979, -90194, -45097, -41339, -14496, -37044, - -17180, -34897, -17717, -33823, -14496, 42413, -3758, 18254, 48855, 13959, - -4295, 10737, -20401, -37581, 45634, 3758, -8053, 36507, 8053, 19327, - 5906, -21475, -11274, -11274, 4832, -8590, - }, - { - -308164, -3316252, 914828, -175020, -118648, 86973, 61203, 6979, -210453, -9127, - 76236, 23085, -155693, -410169, -2440615, -348966, -215285, 1513976, -714575, -40265, - 341987, -422517, -238371, -407485, -8053, -892816, -160524, 200790, 202937, 331786, - -211527, 166967, -86436, -199179, 84289, -114890, -219580, 118648, -110059, -158914, - -17717, -185220, 55835, 53687, 61203, 1611, -118112, 26307, -6979, -102005, - 86973, 59593, -127238, -9664, -21475, -118648, 85899, 62277, -63351, 44023, - 53150, -11274, -12348, 42413, -77846, -54224, 20401, -6442, -97174, -42950, - 58519, 99321, 537, -34897, -11274, 54224, -22012, -55835, -51540, -19327, - 9127, -4832, -28454, -3758, -13959, 37581, 23622, -23085, -10737, -11811, - 20401, -537, -37044, -8590, 7516, -22012, - }, - { - 3636227, 22993644, -2105608, -1420560, -56908, 18254, 22549, 141197, -66572, 86973, - -184147, -350040, 283468, 181999, 685047, 597537, -219580, 256087, 392453, 124017, - 46708, 92879, -25233, 277562, 568009, -266825, -59056, -1265405, -61740, 470299, - 135828, 87510, 189515, 19327, -38655, 118112, 526134, 494995, -158377, -26844, - 347355, 68719, -181462, -183073, 92879, 52076, -133144, -54224, 97711, 172872, - -62814, -177704, -63351, 68719, 56371, -54761, 44560, 108448, 34360, -52613, - -55298, 32212, 6442, -53687, -28991, -4295, -59056, 42413, 13959, -54761, - -22549, 74088, 89657, 31675, -51003, -13959, -23085, -50466, 36507, -22012, - -38118, 20401, -3221, 2147, 47782, 4832, -8053, -1074, 6979, 8590, - -5369, 25770, 7516, 11811, 25770, -9127, - }, - { - 252866, -191663, -324270, 206158, 8053, 39728, 6442, -122407, -98247, -38118, - 154082, 97174, 96637, 347355, 1264331, -475131, -746251, 744103, 115427, 1217086, - 18254, 570694, -491237, -150324, 178778, 115964, -128849, -2684, -348966, -388158, - -224949, 105764, 27380, -361851, -234613, -60130, -76236, -117575, -59056, 155693, - 11811, -68183, 206158, 6979, -106300, 25770, 52613, 121870, 81068, -26307, - -34360, -93952, 84826, 24159, -112743, -61203, -47782, 67646, 20401, -49392, - -5369, -10201, 24159, 15569, -2684, -34897, 59056, 8053, 24159, 45634, - 6979, -53687, -54224, 4295, 21475, -31139, -52076, -61203, -23622, 4295, - 14496, -57982, 3758, 19864, 13959, -23085, 13422, 0, -10737, -8053, - 6442, 48855, -18254, -40265, 2147, 4295, - }, - { - 5841156, -18599892, 1120450, 1937030, 185757, -165893, -32749, -166967, -201863, 82678, - -96100, -212601, -3221, -288837, 203474, -224949, -250182, -191126, 286689, 490163, - 281320, 256624, -105764, 163746, 169651, 236760, 32212, -208843, 250719, 74088, - 78920, -55298, 38118, -134755, -229781, -212601, -168041, 517007, -31139, -234613, - -41876, -139586, 20938, 200253, -99321, 23085, -78383, 38655, -15032, 91805, - 64961, 110595, 126702, -49392, 35970, -10201, -57982, -57445, -66035, -106300, - -74625, 22549, 9127, 16643, 34897, -27917, -93952, -52613, 42950, -31675, - -27917, 90731, -12348, -100932, -2684, 46171, -44023, -17717, 36507, -40265, - -9127, 40265, -16106, -35970, 39728, 27917, -57445, -10201, 11811, 31675, - 1074, -24159, 24159, 4295, 17717, -2147, - }, - { - 322123, 278636, -998043, 289910, -79994, 92879, 4295, -104153, 2147, -97711, - -38655, 198105, 97711, -304406, -729608, -1150514, 275952, 790811, -518617, 184684, - 909996, 632434, -167504, 337155, -185757, 162672, 27917, 31139, 160524, 98784, - -55835, 223338, 147640, -21475, 96100, 187905, -4832, 111132, -41876, 99858, - 150324, -157303, 101469, -66035, -42413, -46708, -130997, -30602, 307090, -4295, - -77309, 90731, 22549, -35970, -156229, 15032, -18790, -61203, 53150, 39728, - -20938, -48855, -48855, 8590, 25770, 85362, -537, -40802, -24159, 28454, - 4295, 36507, 13422, 10201, -42413, 15032, -9127, -50466, -19864, -37581, - -27380, 54224, 11274, 23085, -5906, -12885, 0, -22012, 27917, -8053, - -28991, 22012, -7516, 0, -3758, 3758, - }, - { - -287226, 41953240, 3357054, 2163590, -106837, -86973, -38118, 169114, 155693, -512175, - -172872, 299574, 500364, 139586, 633508, -284542, -833761, 188442, 103079, 113817, - -95563, 93416, 381715, -583042, -93416, -67109, -63888, 219043, 4832, 143345, - -188979, -245350, 42950, 215285, -84289, 266825, 97711, 139586, -350577, 207769, - 236223, -254477, 3221, -97711, 2147, 258772, -264141, -188442, 107911, 84826, - -111669, 19864, -45634, -64961, -16643, 55298, 10201, -115964, -130997, 50466, - 79457, 3221, -2684, 9127, 79994, 120259, 26307, -59056, 31675, -21475, - -25233, 48855, -537, -45097, -33823, 2684, 25770, -25233, -9664, -18254, - 31675, -8590, 30065, 25233, 17717, 31675, 5369, -34897, -22012, -40802, - 3758, 20401, 15032, 4295, -31139, 2684, - }, - { - -89657, -940061, -419833, -105227, 440771, -619012, -738198, 191663, -163209, -271120, - -325881, 198642, 374199, 288837, 668941, -145492, 1265405, 791348, -755377, -699543, - 401043, 543313, -600222, -655519, 122407, -228170, 55835, -367757, 414464, 66035, - 32212, 263067, -206158, 71404, -24696, -64961, -141734, -263067, -238371, -19327, - -54224, -67646, -178241, 97174, 134218, -181462, 102005, 40265, 117038, 3221, - -106837, -19864, -23085, -91805, 170188, 176094, 24696, -33286, -20401, -89121, - 10737, 51003, 55835, 80531, -8590, 69256, 0, -68719, -100932, -83752, - 16106, -17180, 26307, 31139, -40802, 17717, 27917, -3758, 3758, 36507, - 20401, 12885, -7516, -17180, -23622, -38655, 8053, 14496, 7516, -5369, - -23085, 11811, -13959, -6979, -22549, -22012, - }, - { - 598074, 12178380, 2790655, 521302, 217970, -1365263, -2432562, 158914, -16106, 32212, - 142808, 248034, -90731, -342524, 119185, 464393, 14496, 66572, -4832, 280247, - -128312, -138513, -177704, -57445, -397821, -64425, -42950, 25233, 184684, -314069, - -336081, -142271, -41339, 226023, -64425, 47782, 235686, -262530, 79994, -42950, - -407485, -103079, 45097, 78383, 129386, 15032, -27380, -236223, 0, 70867, - 5906, -16643, -103616, -75162, 115964, 68183, 63888, -46171, -102005, 55298, - 30602, -13959, -4295, 35433, 2147, -17180, 39728, 14496, -5906, 4295, - 27917, 22549, -1074, -46708, -45634, -12348, -53687, 19327, 25233, 5906, - 36507, -33823, 18790, 21475, -28454, -3221, -46171, -10737, -1074, 24696, - 2147, -17717, 3758, 27917, 2147, -24159, - }, - { - 106300, 812823, -81604, 84826, -222265, -184684, 83752, -85362, -44560, 68719, - -255014, 187368, -491237, -1261647, -63351, 922344, -27380, -699543, -723702, 290447, - 844498, 482110, -741419, -487479, -980326, 521302, 128849, 64961, 517007, -24159, - -249108, 477815, 66572, 167504, 25770, -8053, -55298, -256087, -104153, 27380, - 102542, 137439, 26844, -118112, -176094, 13959, 78383, -53687, 69256, -68183, - -52076, 33823, -31139, -132607, -107374, -41339, 19864, 96637, 157840, 55835, - 49392, -67109, 14496, 31139, 96637, -34897, -10201, 37581, -41876, 11811, - -20401, -18254, -537, -22012, -38655, -55835, -79994, -8053, 13422, 22012, - 13959, -11274, 35970, 16643, 15569, 26844, 42413, 28454, 13422, -4832, - -5906, -16106, -19864, 6979, 7516, -11274, - }, - { - -1414655, -1234266, 2554969, -594853, 78920, 463856, -1118839, -431644, 247497, 351114, - -488553, 25233, -195421, 591095, -277562, 330176, 126702, -219043, 60666, -100395, - -168577, 229244, -108448, 137976, 224412, 64425, -166430, -386010, -264677, 8053, - -11811, -156229, 51540, 76773, 74088, -92879, 5369, 212601, 12885, -155156, - 105227, 213675, 84826, 115427, 175020, 212064, 2684, 88047, 152471, -178778, - -10201, -102005, -110595, -19327, -117575, -105227, -13959, -9127, 129923, 70330, - 537, 19327, -44560, 1611, -76773, 22012, 66572, 53150, 19327, -79994, - 15032, 51540, -537, -45097, -13422, -21475, 44560, -537, -23622, -36507, - -31675, 53150, 38118, -4295, -60666, -28454, 60666, 36507, 14496, 36507, - 11811, 13959, -12348, -32749, -9127, -45634, - }, - { - -152471, 987306, 751082, 333934, -84826, -181999, -57445, -18790, -191663, -126702, - 71941, 94489, 741956, -1459752, -4961224, 1676648, -584652, -496069, 615791, 282931, - -404264, -107911, -526670, -116501, 173946, -47245, -138513, -37581, -462246, 166430, - 360777, 461172, 124017, 66035, 28991, 200790, 95563, -9664, -130460, -23622, - 149250, -258772, -86436, 102005, -41876, 85899, 44560, -78920, -71941, 52613, - 32749, -168041, -18254, 97174, -1611, -9127, 33286, -31675, -2684, 32212, - -62814, -149250, 9127, -6979, -56908, -13422, 34360, -48855, -33286, -29528, - -16643, 84826, 1074, -24696, 30602, -9664, 24159, 77309, -28454, 15032, - -41339, -67646, 41876, 10201, 12885, 51540, 40802, -12348, -22549, 44560, - -22549, -45634, -10737, 18254, -26844, -18254, - }, - { - 369904, -872415, 286152, -724239, 33823, -251256, 361851, 208306, 122407, 55835, - -299037, -585726, -415001, -1452773, 365072, -307627, -272194, -325881, 76236, -198642, - 97174, 77309, 145492, -222265, -71941, 527207, 4295, -317291, 177167, -117038, - 183610, 97174, -263604, 82678, 12348, 426812, 179315, -1611, -232465, -158377, - -128849, -76773, -132607, 53150, -537, 52076, 260382, -6979, -4295, -86436, - -7516, -103079, -158914, -37044, 87510, 4832, 147103, 39192, -61203, -6979, - -41339, 44560, 45097, 71404, -3758, 5369, 40802, -27380, 53687, 21475, - 7516, 73014, 61740, -48855, -97711, -12348, 32212, 26844, 9127, -3758, - 52076, -26844, -31139, 16106, 7516, -3758, -2684, -25233, -53687, 34897, - 4832, 2147, 16106, -1074, -10737, -24159, - }, - }, - { - { - 219580, -3122441, -2285996, -19327, -33286, -37581, -78383, -13959, 185757, -108985, - 39728, -258235, -359704, -92342, 1230508, -253940, 352724, -865973, -750546, 262530, - 595927, -444529, -369904, -350577, 307090, 434865, 41339, 180389, 169114, -392453, - -481573, 0, -26307, 469762, -24159, 3758, 70867, 526670, 121870, 62277, - -132607, -37044, 1611, 31139, 1074, -97174, 1074, 105764, -24159, 10737, - -157840, -31675, 43487, -121870, -35970, 102005, 32212, 124554, 8590, -41339, - -60666, -91805, -58519, 36507, -18254, -56371, -2147, 5906, -77309, -31139, - 41876, 26307, -14496, 10737, -15032, 13422, 15032, -16106, -46708, -2147, - 23085, -30602, -44560, -46171, -21475, 38655, 32212, -8590, 2684, 42413, - -20938, -8590, -7516, -2684, 31675, 22012, - }, - { - -2699924, -1453310, 630286, 428423, 95563, 1074, 119185, 753230, 293132, -231391, - 325344, -50466, 8053, 557272, -129923, 695248, 137439, -214748, -220117, -254477, - 105764, -154082, 251256, -244276, 36507, -78383, 228707, 355409, 8590, 34897, - -165356, -6979, -1074, 294742, -156766, -280784, 116501, 424665, 250182, -28991, - 3758, -90194, -13422, 37581, -97711, 91805, 89121, 191126, 166430, -16643, - 22012, -89121, -146566, -22012, 20401, 22012, -130997, -41339, -23622, -5906, - -67646, -10201, 41339, -12885, 71404, 38655, 15569, -46171, -48855, 27380, - 13422, 6442, 30065, -35970, 58519, 8053, -55298, 24696, 27917, 1074, - -37044, -1611, 12885, -34360, -26844, 62814, -9127, -20938, 9127, -1611, - 13959, 3758, -15569, 2147, -3221, -5369, - }, - { - 383863, 17714592, -869194, -155693, -716186, 107911, -182536, -84826, 160524, 146029, - 212601, 11811, 693100, 740882, -1002875, -74625, -77846, -6979, 813896, 114354, - 195958, 392453, -110595, 153545, -149787, -386547, -263604, 82141, 383863, 86436, - 117038, -177167, -108985, 268435, 45097, -236223, -96100, -32749, -7516, 314606, - 52076, -181462, -10201, -2147, -146029, 178241, 2684, -203474, -114890, -54761, - 170725, 35433, 31675, -26307, 66572, -12348, -59593, -34360, 37044, 17180, - -48855, -148176, -21475, -51540, -6979, -37581, -41876, 3221, -14496, -27380, - 8590, -9127, -13959, -20938, 4295, 16643, 5906, -9127, 41876, 28454, - 1074, 1074, -16643, -9127, 48318, 4295, 20938, 28454, -6979, 18790, - -26307, -20401, -16643, 537, 8590, -12348, - }, - { - 140660, -3056406, 453119, -412854, -54224, 107374, 56908, 22549, -171799, 5906, - 64425, 188979, 49392, -886374, -1721745, 731218, 280784, 677531, -1166084, 267362, - 403190, -641024, -263604, -126702, 52076, 330712, 815507, 285078, 45634, 175020, - -287226, 181999, 53687, -5369, 339302, -160524, 186294, 261993, -179315, 32749, - 52076, -197569, 141734, 117038, 74088, 44023, -19864, -27917, -139586, -102005, - 137439, -21475, -29528, 85362, -30065, -40265, 107374, -28991, -51003, 12348, - 27380, -31139, -13959, 3758, -59056, -30602, 10737, -9127, -70330, -12348, - 86973, 53150, -18254, -48318, 15569, 16643, -73014, -45634, -2684, -2147, - 10737, -22012, -17180, -10737, 1074, 31139, 8590, -26844, -29528, -537, - 18254, -18790, -41339, -6442, -8053, -26844, - }, - { - -6229850, 12640089, 551903, -1511292, -394600, 23085, 76236, 176094, -58519, 215822, - -416075, -70867, 159451, -136902, 147640, 163746, -295279, 59593, 44560, 41339, - 37581, 25233, 2147, 464930, 291521, -125091, -103079, -214212, 794569, 273804, - -44560, 48855, 86436, -11811, -40265, 232465, 706522, 6979, -326418, -10737, - 110595, -97711, -101469, 32212, 212601, -64961, -107911, 34897, 92342, 169651, - -208843, -203474, 45634, 60130, -1074, -107911, 38118, 40802, 20938, -18790, - -8590, 17717, -33823, -40265, -2684, 17717, -44560, 35970, -17717, -56908, - -2147, 106300, 94489, -15569, -33286, 13422, -30602, -13422, 28454, -14496, - -27917, -2684, -16643, 19327, 35433, -537, 537, 5369, 24696, 16106, - 6442, 22012, 3221, 19327, 6979, -4295, - }, - { - 134218, -758062, 257161, 253940, 52613, 35970, -10201, -59056, -89121, -6979, - 158377, 180389, 231391, 527207, 697932, -448824, -253940, 13959, 1611, 2086817, - -86436, 99321, -1214939, 67109, 799401, 274341, -11811, 162672, 491237, 356482, - -139586, -30065, 70330, -278099, -94489, 103079, -142808, -2147, -12348, 194347, - -75699, -19864, 82678, -113280, -66035, 74088, 53687, 46708, 4832, 30065, - -63351, -67646, 111669, 537, -86436, -39192, 20401, 104153, 41339, 19327, - 59593, -55298, 2684, -12885, -14496, -6979, 29528, 8590, 35433, 46171, - -38655, -29528, 4295, 13959, -19327, -31139, -68719, -69256, 1611, 24696, - -10201, -24159, 33286, 26307, -5906, -19327, 28454, -3221, -11274, 4295, - 20938, 22012, -42413, -25770, 6442, 12348, - }, - { - -3031710, -32509682, -578747, 1487669, -423054, -111669, -196495, -55298, 209380, 35433, - -46708, 27380, 53150, -170188, 369904, -159988, -390305, -150861, 202400, 277562, - 200790, -89121, -173946, 123480, 141197, -24696, -173409, 9664, 137439, 24159, - 114890, -105227, -26307, -80531, -191663, -115427, 98247, 396211, -147640, -239981, - -68719, -80531, 98247, 213138, -156229, 79994, 174483, 72478, -103616, 92342, - 25770, 16106, 26307, -64961, -72478, -85362, -11274, -13422, -84289, -76773, - -25233, 15032, 5906, 20938, 18790, -67109, -64961, 12348, 56371, -18790, - 16643, 81604, -71404, -82141, 10201, 47245, -39728, 2147, 11811, -46708, - 21475, 10201, -44560, -18254, 76773, -11811, -49392, 13959, 31675, 22549, - -25233, 537, 15032, 6442, 16106, -10201, - }, - { - 99321, -708670, -472446, 291521, -41876, 105227, -41339, -127775, -83752, 4295, - 166430, 251792, 226560, 66572, -665720, -773094, 102542, -14496, -214212, 782758, - 711354, 117575, 470836, 1021129, 377420, 1094143, -20938, -89657, -41876, -32212, - -13959, 389768, 248034, 39728, 114354, 99321, -190589, 42950, -271120, -92342, - 116501, -52076, 181999, 34360, 22549, -30065, -143881, 110595, 302258, -117038, - -85899, 36507, 45634, -146029, -139586, 9127, -79994, -32749, 109522, -66572, - -84826, -106300, -69256, -44560, 1611, 74088, -33823, -15032, 5369, 44560, - -8053, 6442, 8590, -14496, -48318, 34897, -46171, -42413, -4295, -31139, - 4832, 34897, 8053, 26307, -11274, -4295, -30602, 3221, 22012, -38118, - -10201, 8590, 0, 11811, -6442, 4295, - }, - { - -4491999, 35223564, 724239, 1388348, -138513, -159451, -103079, 333934, 11811, -580894, - 312996, 583579, 530965, -42950, 819802, 76236, -737661, 129923, 198642, 241592, - -221191, 24159, 233002, -358093, 186831, -122407, -73014, 212064, -183073, -111669, - -303869, -76773, 177704, 33286, -171799, 265214, -206158, -13422, -536334, 70330, - 261456, -4295, 74625, -161598, 145492, 84289, -263604, 78383, 113817, 99321, - -78920, 85362, -38118, -26844, -24159, 84826, 31139, -68719, -18790, 53150, - 39192, 18254, -11274, 45634, 165893, 60666, -54761, -37044, 14496, -12885, - 8590, 40802, -20938, -51003, -52076, 70867, 17717, -41339, -9127, 15569, - 25233, -537, 34897, 39728, 24159, 28991, -24159, -41876, -8590, -16643, - 21475, 13959, 25233, -10201, -11811, 14496, - }, - { - 12885, 1016834, 579821, 401579, 398358, -780610, -115427, 238908, -126165, -61203, - 14496, 279710, -136365, -54761, 280247, -633508, 533650, 61203, -1306744, -543313, - 492848, 108448, -652835, -401579, 379031, -11274, 88584, -453119, 329639, -310311, - -13422, 259309, -212601, 108448, 5369, -79457, -141197, -239981, -22549, -61203, - -128849, -83215, -91268, 112743, -44560, -169651, -22549, -3221, 84289, -103079, - -140660, -38655, -63888, 10201, 241055, 78383, -44560, -70330, -51003, -71941, - 26844, 34897, 85362, 48318, 25770, 67646, -33286, -72478, -101469, -5369, - 13422, 13959, 48855, 4832, -33286, 30602, 53150, 4295, 13959, 45634, - 10737, 3758, -20938, -15032, -23622, -11274, 24696, -1074, 8590, -23085, - -10737, -6442, -10201, -3758, -24159, -10201, - }, - { - -1059783, 8378408, 606664, -810675, -149787, -355409, -474057, 547608, -34360, -202937, - 46171, 105227, -235149, -281857, 678605, 348966, -373125, 13422, 100395, 150861, - 154082, -134218, -59056, 22549, -155693, 146029, 113817, 7516, 23085, -156766, - -129386, 137976, 149250, 213138, -187905, 109522, 49392, -269509, 160524, -228170, - -365072, 60130, 79994, 95563, 53150, -51540, 27380, -180389, 68183, 69793, - -92342, -42950, -24696, 13959, 115964, 66035, 76236, -95563, -27917, 51003, - 12885, -13422, 19327, 56371, -15569, -9664, 13422, 13422, -21475, 7516, - 3221, -2147, -29528, -73014, -20938, -10737, -31675, 58519, -2147, -5369, - 13959, -33286, 40265, -22012, -15032, -33823, -24159, -11811, 537, 22012, - -10201, 537, 20938, 16643, -15569, -12348, - }, - { - -160524, 1203128, 179852, 113817, -112206, 17717, 186294, -49392, -122943, -85362, - -192200, 100932, -286152, 450972, 2611340, 762894, -263604, -587874, -371515, 118112, - 333934, 407485, -752693, -278099, -576063, 511101, 32212, -154619, 185757, -605590, - -67646, 195421, 287226, 114890, -10737, 130997, 20938, -349503, -62277, -105764, - 121870, 146029, -107374, -110059, -5369, 51003, 134755, -64961, 42413, -139050, - -42950, 73014, -76236, -51540, -25233, 7516, 95563, 199179, 93952, 35433, - -79994, -83752, 17717, 98247, 93952, -78920, 14496, 6979, -11274, -7516, - -25233, 8053, -19327, -23622, -20938, -48855, -60666, 21475, 9127, 28454, - 1074, -26844, 45097, 29528, 7516, 31139, 29528, 11811, -537, -4295, - -5906, -24696, -20938, 23085, 9664, -15569, - }, - { - 2112587, 2615098, 723702, -311922, -222265, -150324, -1023276, 72478, 295279, -62277, - -437550, 80531, 5369, 1613834, -154619, 340376, 98784, -148176, 187368, -432718, - 92342, 166967, -168577, -251256, 104153, -153545, -214748, -451508, -408022, -165893, - -124554, 1611, 19327, -83215, -197032, -141734, -28454, 74625, -90194, -184684, - 90194, 153008, -58519, 122407, 61203, 130997, -150324, 215285, 137439, -44560, - -99321, -125628, -92879, -172336, -55835, -59593, 38118, 25770, 115964, -39728, - -17180, 48318, -13959, -8590, -42413, 34360, 71404, 68719, -10737, -64961, - 64425, 26844, -64961, -45097, 13959, -6979, 46708, -25233, -24696, -31675, - 19864, 52076, 3758, -19864, -41876, 20401, 79457, 16643, 7516, 35970, - 8590, 5369, -38118, -19327, -13959, -32749, - }, - { - 32212, 1515050, 514322, -25233, -62277, -64425, 112743, -115427, -67646, 132607, - -140123, 19864, 451508, 2217814, -886374, 1961190, 213675, -63888, 229781, -68719, - -360240, -29528, -253940, 107911, 135828, -170188, -1074, -6442, -331786, -25233, - 70867, 253403, 24159, -41876, 243203, 114890, -84289, -93952, -96100, 94489, - 18790, -257161, -49929, 121333, -97174, 113817, -9127, -47782, -94489, 38655, - -114890, -103616, 92342, 105227, 3758, 27380, 38655, -1074, -24159, 25233, - -146029, -98247, 38655, -15032, -67109, 55298, 42413, -62814, -36507, -20401, - -15032, 59593, -13422, -11811, 12348, -48318, 53687, 21475, 9664, -4295, - -75162, -15569, 32749, 6442, 34897, 42413, 33286, -34897, 537, 22549, - -49392, -26307, 18254, 9127, -28454, 13959, - }, - { - -699543, -2830384, 42950, -135828, 2684, -1755031, 66035, 185220, 155156, 115964, - -69793, 59056, -126702, 437013, 2621004, -457414, -24696, 135291, 366683, -28991, - 331249, -39192, -23085, -394600, 145492, 624918, 31139, -712965, -16106, 73551, - 37044, 76773, -120796, 135291, 123480, 288300, -16643, -157840, -143345, -102542, - -156766, -59056, 64961, 121333, -122407, 25770, 250719, -35970, -56908, -79457, - -54761, -122943, -130460, 5369, -16643, -537, 154619, -17180, -3221, 21475, - -35433, 85899, 34897, 75699, -18254, -4832, 27380, -22549, 8053, -8590, - 13959, 40802, -15032, -67109, -49392, 32212, 31675, -3221, -537, 9664, - 16106, -32212, -5369, 24159, -4832, -31139, -4832, -47782, -16643, 34897, - -8053, 12348, 13422, -12885, -10737, -10737, - }, - }, - { - { - -273804, -5084168, 492848, -236760, -153008, 6442, -159451, 197032, 70330, 195958, - 90731, -126702, 320512, -445066, 427886, 290447, -420907, -354872, -918586, 251792, - 649077, 140123, 574989, -16643, 414464, -340913, 146566, 56371, 407485, 269509, - -399969, -119185, 421444, -38655, -137976, -28454, 80531, 125628, -378494, 537, - -68719, 66572, -47782, -37581, -6979, -52613, -239981, -112743, 14496, -125628, - 62277, 33823, -10737, 44560, 175557, -50466, -39728, -13422, -117038, -14496, - 46708, 53150, 97174, -11274, -49392, 85362, -1611, -35433, 12885, 80531, - -13959, -1074, -13422, -41339, 537, 5369, -15569, -27380, 25233, 18254, - -16643, -3758, 37581, 60666, 26844, -2684, -19864, 9664, 12885, -30065, - -33823, 20938, -3221, 3221, -18254, -24696, - }, - { - 2921115, -6028524, -3641059, -33823, -216359, -98784, 45097, -347355, -593242, 260919, - -64425, 33823, 34360, -56908, 356482, -139586, -342524, -256624, 403190, -245350, - 73014, -210453, -133144, -109522, 3221, 192200, -143345, -38655, 382252, 51540, - -23085, -67109, -104153, -264141, -56908, 3758, 135828, 91805, -114890, -216359, - -23622, 140660, 124017, -28991, 163209, 72478, -114354, 5369, -123480, 67646, - 21475, 37581, 85899, 133681, 28454, 19327, -71941, 69793, -35970, 21475, - 90194, 59593, 6979, 17180, 5369, -123480, -24696, 60666, 42950, 70330, - -24159, -44023, -28991, 8053, -8590, -62277, 22549, -34360, -44023, -7516, - 41339, 6979, -28991, 16106, 50466, -28991, -37581, 34897, -18254, 9127, - -5906, -5906, 15032, 16643, -3221, -5369, - }, - { - -273804, 9541270, 3312494, 1612760, 943819, -92342, 61740, 277562, 130460, -247497, - -315143, -130460, -266825, 474594, -765041, -237297, -241055, 122407, 586800, -52076, - 100932, 155156, 183073, 106300, -157840, 18790, -18790, -88047, -24696, 16643, - 137439, -98247, 267362, 109522, -261456, -230318, -100932, 135291, 180926, 31675, - 26307, 45634, -39192, 143345, 91268, -66035, -248571, -92879, 195958, 95563, - -105764, -137439, -16643, 77846, -16643, -12348, 103079, 153008, -5369, -74625, - -30602, 96637, 55835, -38655, 32212, 60130, -3758, 39728, -8590, 53687, - 37581, -12885, 12348, 37044, 38655, -29528, 16106, -17180, -17717, -28991, - 11274, -3221, 35970, 25233, -31139, -2684, 5369, -17717, -3758, -22012, - -8590, 19327, 3221, 23085, -7516, 1611, - }, - { - 5906, -3192771, -51540, 102542, 94489, -99321, 5906, -13959, 17717, 76236, - 25233, -179852, -102005, 412317, -1577864, -890669, 480499, 97174, -1691143, 393526, - -133681, -1131724, -185757, 597537, -259846, 761283, 254477, 890669, -288300, -319438, - -184684, 474594, 197569, 82678, -18254, 104153, 353261, -33823, 127775, 114890, - 18254, -46708, 99321, 17180, -46171, 36507, 214212, -95563, -26844, 94489, - -537, -84289, 164819, 71404, 77846, 55835, -100395, -49392, 70867, -89657, - -78920, 26844, -6442, -13959, 44023, 11274, -1074, -16106, 68719, 15569, - -54761, -92342, 2147, 9664, 1074, -38118, 13422, 62277, 42413, -2147, - -25233, 8053, 12885, 537, 10201, -36507, -11274, 15569, 17717, 12885, - -10201, 10201, 34360, 11274, -4832, 18790, - }, - { - 6906845, -4258997, -1314797, -1664837, 285615, 192200, -17717, 19864, -111669, -55298, - 85899, 259846, -68719, 289373, -567473, -127775, 277562, -394600, -278636, -7516, - -60666, 140123, 136902, -98784, -153545, 112743, -100395, 833224, 48855, -111132, - 54224, -14496, -133681, 224949, -122943, 22549, -3758, -495532, 16106, -81604, - -222801, -79994, 85362, 69256, 30065, 15032, 74088, 108985, 41876, 86436, - -164283, 112206, 121870, -69256, -61740, -29528, -51540, -175557, -86436, -26844, - 73014, -107374, 33823, 13959, -26307, 5369, -8590, -83215, -10201, 26307, - -5369, -29528, -68183, -35970, 55298, 8590, 30602, 51003, -28454, 20401, - 35970, -4295, 24696, 15032, -50466, -4832, 8590, 5369, -12885, -11274, - 3758, -15032, -10737, -18254, -17717, 13959, - }, - { - -273804, 571231, 1219234, -292058, -20401, -64961, 28454, 64425, 96637, 96637, - -60130, -93416, 38118, -497142, -1297080, -248571, 1592359, -841277, -166967, 2934000, - 51003, -509491, -544387, -551903, 225486, -162672, 40802, 52613, 557272, 513785, - 138513, -192737, 37581, 268435, 103616, 227633, -59056, 192200, 102542, 6442, - 166967, 26844, -117575, 45634, 73551, 71941, -51003, -126165, -83215, 72478, - -15032, 79994, -64961, -53687, 76773, 48855, 40265, -22012, 20401, 44023, - -1611, -51003, 24696, -4832, 15032, 51003, -45634, -26307, -8053, -24696, - -14496, 80531, 38118, -11274, 8590, 31675, 41339, 42950, 25770, -13422, - -23622, 41339, -9127, -34360, -10201, 12885, 9127, -8590, 15569, 11811, - -19327, -41876, 11274, 33286, 10201, -4295, - }, - { - -1420560, -36447092, -126165, 889595, -100932, 70330, -74625, 213675, 367220, -432718, - 140123, 84826, -19864, 263604, -35433, 142808, -190052, 304943, -102005, -394600, - -124554, -191126, 35970, -110595, -1074, -294205, -117575, 243739, -170725, -119722, - 70867, 159988, 86436, 69256, -102542, -77309, 75162, 84289, -12348, -20401, - 81068, -79457, -124017, -19327, -4832, 31675, -60130, -127775, 6442, -45097, - -107911, -22549, -93952, -26844, -82141, 62277, 83752, 10737, 108985, 16643, - 86973, -18254, 10737, -23085, -27380, 31139, 104690, 15569, -53150, 31675, - -6442, -74625, 17180, 78920, -14496, -15569, 11274, 22549, -34897, 38655, - 26307, -33823, 18254, 38118, -32749, -26844, 49392, 13422, 0, -14496, - 5906, 25770, -19864, -9127, -12348, -3758, - }, - { - -303332, 477278, 975494, -10737, 117575, -128849, -40802, -93952, -49929, 125091, - -35433, -212601, 75162, 243739, -1142998, 389231, -1328219, -960999, 191126, 708670, - -616328, -150861, 199716, 526134, 150861, 413391, 478889, -127775, -186294, -287763, - -104690, -12348, 139050, 95026, -59593, -61740, -48318, 98784, -149787, 60130, - -42950, 66035, 90194, -67109, -53687, 43487, 181999, 113817, -121333, -10201, - 114354, 24696, -36507, 24696, 84826, 26307, 34897, 88047, -63888, -106300, - -24159, 11811, 38118, -57982, -29528, -82141, -11274, 69256, 53150, -13422, - 23085, -21475, -27380, -4832, 37581, 9127, -6442, 61740, 27380, 14496, - 7516, -66572, -22549, -12885, 10737, 13959, 5906, 31675, -25233, 16106, - 18254, -22549, 12885, -2684, -2684, -5369, - }, - { - 8184060, 19821810, -2852932, 1236414, 267899, 145492, 127238, -78920, -350040, 410169, - 69793, -365609, -464393, 180389, 427349, 426276, 87510, -3221, 92879, 148176, - 217970, -105227, -253403, 310311, -51540, -95563, 341987, -42413, 102005, -158914, - -32212, -49929, 125091, -220654, 73014, 170725, -492311, -213138, 125091, 76236, - 326954, 89657, 202400, 39728, 204548, 537, 130460, 85362, -227096, 10201, - 155693, 66572, -72478, 106300, -17180, -52613, -45097, 63351, 32749, -107374, - 9127, 49392, 26307, 14496, -41876, -96637, 31675, 19864, -31675, 18790, - 22012, -54761, 6442, 24696, 40265, -17180, -34360, 11274, 10201, -2684, - 537, -8053, -22549, -12348, -35433, -28454, -9127, 20401, 40265, 25770, - -5369, -5369, -14496, 2684, 28454, -2147, - }, - { - -11274, 2939905, -666257, 555661, -325881, 422517, 636729, -298500, 124017, 178778, - 100395, -467615, -580357, 401043, 324807, 195958, -485331, -511638, 323196, 217970, - -239981, -520765, -123480, 397821, 454193, 284542, -37044, 70330, -251792, -132607, - 16643, -13422, 126702, 318901, -7516, -19327, 185757, 184147, 206158, 19864, - 8053, 35433, 75699, -117038, -31139, 173409, -101469, -20401, -53150, -79994, - 200790, 52613, -13959, 117575, -86973, -146566, -22549, -24159, 36507, 59593, - 0, -12348, -37581, -76236, -37581, -88584, 28454, 85362, 107374, 67646, - -23085, 19327, -23622, -33286, 30602, -10737, -20938, -18254, -10201, -34897, - -34897, -8053, 12348, 16643, 16643, 36507, -4295, -11811, -8053, -1074, - 19864, -2684, 12885, -1611, 30065, 23085, - }, - { - 1137630, 4267587, -701153, -745714, -53687, 1336809, 1201517, -369904, -573915, -205085, - 69256, -12348, 90194, 294205, 481036, 60130, 201327, 97711, 326418, 105764, - 194347, -133681, 140123, 73551, 157840, 99858, 47245, -40802, -200253, 226560, - 396748, 84826, 54761, 47245, 149250, -266825, -146029, 99321, -107911, -9127, - 197032, 173946, -116501, -41339, -141197, -64425, 33823, 125091, 106837, -57982, - -1611, 33823, 130997, -13422, -110059, -62277, -43487, 52613, 125091, -58519, - 12348, 4832, -20938, -41876, 15569, 12348, -46708, -17717, -34897, 7516, - -18790, -23085, 3758, 61203, 43487, 28991, 45634, -22012, -32212, -11811, - -31139, 29528, -12348, -13422, 20938, 7516, 43487, 12348, 8053, -18790, - 1611, 19864, -8053, -33286, 4295, 27380, - }, - { - 141734, 874026, 187368, 6979, 107374, 135828, -260919, -146566, -1074, -146029, - -6442, -344671, 594853, -493921, 3663070, -687195, -84289, 355409, 481036, -140660, - -1238561, 370441, 442382, 423591, 137976, -435939, -11274, -324807, -386547, 31675, - 33286, -348429, -91805, -31675, 133681, 62814, 12348, 103079, 155156, -44560, - 53150, -139050, -537, 198642, 95563, 47245, -82141, -13422, 104153, 14496, - 108448, -71404, -30602, 61740, 5369, 31675, -62814, -150324, -136902, -38655, - -95563, 49392, 537, -41876, -96637, 41876, 14496, -45634, 25233, -16106, - 48318, 16643, 10201, 35433, 13422, 49392, 49929, 1074, -8590, -13422, - -13959, 8590, -44560, -29528, -17180, -13422, -39728, -27917, -5906, 1074, - 3221, 12885, 13422, -9127, -2147, 18790, - }, - { - -1978369, 6925098, 708133, 913217, -78920, 113817, 821949, -313533, -132607, -282394, - 446677, -49929, 138513, 1030255, 175557, -432181, -195421, 275415, 112743, 92879, - 557809, -81068, 23085, -457414, 17180, 35433, 17717, -86973, 39192, -163209, - -67109, 136902, -108448, -245350, -221728, 214748, 99321, -164283, 537, 26844, - -104690, -252329, -142271, -121870, -294205, -259846, -95563, -78383, -187368, 108985, - -143881, 125628, 1611, 32749, 175557, 111132, 24696, 29528, -137439, -32212, - 104690, -6442, -19864, 23085, 31675, -37044, -24696, -31675, 5369, 73551, - -19327, -78920, -6979, 42950, 4832, 14496, -25770, 10201, 17180, 34897, - 34897, -49929, -34360, 11811, 61203, 16643, -62277, -39728, -16643, -22012, - -3758, -10201, 21475, 31675, 13422, 46708, - }, - { - 63351, 1939178, -679679, -45634, 170725, 91268, 153545, 33823, 252866, -99858, - -48855, -199179, -240518, 2659122, 5071820, 813896, 560493, 226560, -145492, 2684, - 106837, 101469, 411780, 522375, -205622, -88584, 498753, -98247, 157840, -232465, - -188442, -266288, -176631, -141734, -18254, -125091, -256087, -272194, -16106, 19864, - -145492, 153545, 67109, -6442, -7516, -63351, 33286, 106837, 48855, -9127, - -48318, 132607, 56371, -68183, -39728, -4295, -66035, 14496, -537, -51003, - 90194, 85899, -47245, -72478, 49929, 16643, -68719, 73551, 26844, 18254, - -41339, -66035, -1611, 32749, -10201, 17717, -15032, -68719, 25770, -10737, - 37581, 56371, -32212, -10737, -12885, -49929, -30065, 21475, 18790, -24159, - 22549, 53150, 3221, -20401, 30602, 7516, - }, - { - 179852, -5887864, 579821, 9664, 126702, -82678, 331249, -96100, 119185, -3758, - 592706, 632434, -127775, 506269, 2218351, 804770, 129386, 385473, 384400, -23085, - -228170, -194884, -85899, 154619, 177167, 38655, -192737, -497142, 365072, -6979, - -23622, 147640, 41339, -157840, 46708, -188979, -82141, -166430, 146029, -26307, - -16643, 38655, 128312, -156766, -103079, -41876, -132607, 52076, 82141, 67646, - -103616, -5906, 130997, 92342, 13959, 22012, -33823, -67646, 3221, 1074, - 12348, -20938, -49929, -16106, -68183, -51003, -30065, 3758, -36507, 3758, - 1611, -84826, -51003, 77309, 64425, 6442, -48855, -16106, 22549, -28454, - -52076, 26307, 38655, 1611, 537, 13422, -10737, 27917, 29528, -28991, - -3758, -20401, -13422, -5906, 537, 26844, - }, - }, - { - { - 120796, -3971771, 964220, -167504, 151934, 25233, -84826, 228707, 537, 163746, - -293132, 68719, 294205, -932545, 729608, 794569, -291521, 77846, -741956, 230854, - 295279, 136902, 437550, -406948, 110059, -509491, -243203, -273804, 570694, 545998, - -91268, 100932, 274878, -326954, -114890, 252866, 63351, -217433, -461172, 6979, - -117038, -37044, -112206, 22012, 17180, -3758, -191126, -97711, 37044, -59056, - 171799, 41876, -32212, 97711, 101469, -110595, -12348, -60666, -56371, 31675, - 82141, 110059, 62814, -33823, -30065, 86973, -37044, -9127, 47782, 23622, - -33286, 4832, -16106, -34360, 19327, 2684, -20938, -12885, 25770, -4295, - -9664, 17717, 49392, 47782, 8590, -26307, -22012, 4832, 1074, -34897, - 4832, 13422, 8053, 0, -28991, -18790, - }, - { - -2800856, -7233262, 3688840, -539018, -570157, 188979, -173409, -649614, -424665, 234076, - -148176, 139050, -54224, -118112, 419296, -703301, -394063, 132607, 822486, 135291, - 213675, -537, -100932, -114354, -120796, -51540, -251792, -6442, 345208, 26307, - -118648, -289373, -305480, -260382, 73014, 134218, -178778, -276489, -319975, -197032, - 36507, 172872, 108448, -74625, 169114, -43487, -91805, -62814, -53150, 97174, - -21475, 128849, 113817, 104153, 32212, 15032, -19864, 113817, -16106, -9664, - 52613, -1611, -8053, -16106, -63888, -83215, 5906, 84289, 38655, 17717, - -28991, -56908, -10737, 10737, -62814, -29528, 28454, -35970, -26844, 2147, - 34360, 1611, -16106, 17180, 28991, -63888, 3221, 20401, -18254, 3221, - -9127, -2684, 13959, 1074, 4295, -9127, - }, - { - 715649, -909996, -4708895, 1474248, 646393, -192200, 27917, 271120, 82141, -394063, - -244813, 27917, -518080, 481036, -265214, 118648, 38655, -64425, 88047, -195958, - 134755, 243203, 187905, 84289, 34360, 485868, 101469, -259309, -463320, -117575, - 262530, 107374, 77309, -210990, -273804, -37581, 33286, 13959, -106300, -93952, - 109522, 35970, -87510, 94489, 9664, -112206, -79994, 31139, 110595, -68183, - -156229, -68719, -16643, 80531, -51003, 34360, 134218, 85899, -4832, -38655, - 68719, 159988, 74088, -35433, 37581, 49392, 22549, 38118, -8590, 33286, - 9664, -16643, 22549, 32212, 15569, -34360, 2684, 5369, -15569, -39192, - 6442, 7516, 33823, -2147, -38655, 9664, -2684, -15569, -537, -22549, - 23622, 25233, 8590, 8053, -14496, 4832, - }, - { - 10737, -3448859, -164283, 287763, 47245, -129386, -8053, 40265, 60666, 6442, - -104690, -222265, -85362, -310848, -558346, 655519, -744640, -588947, -1468879, 474057, - -458488, -1051730, -442382, 770947, -143881, -431644, -357556, 788663, -879931, -44560, - 245887, 584652, 230318, -17180, -151398, 239444, 190052, -73551, 223875, 96637, - 113280, 36507, 41339, -44023, -87510, 8590, 176094, -92879, 36507, 75162, - -48318, -8590, 91805, 17180, 135828, 16643, -108985, 32212, 56371, -66572, - -78920, 45634, -15032, 18254, 86436, 23622, -1074, -6442, 89121, 24159, - -81068, -64425, 37581, 40802, -23085, -13422, 56371, 54224, 1611, -24159, - -32749, 33286, 12885, 8053, -1611, -41339, -1611, 19864, 23622, -4295, - -19327, 20938, 37044, 3758, 3758, 18254, - }, - { - -5256503, -19937238, 79457, -1318555, 253403, 179852, -23622, -3758, -83752, 20401, - 351114, -60130, -174483, 687195, -213675, -73551, 1611, -598074, -77846, 12885, - -53150, 126165, 56908, -282394, 41339, -33286, -90731, 1241782, -9664, -253940, - 73014, -112206, -69256, 219043, -132070, -32749, -182536, -193274, 210453, 36507, - -111132, 13422, 161598, 21475, -29528, 118112, 165893, 79457, -22012, 114354, - -5369, 130460, 64961, -78383, -39192, 45634, -55298, -122407, -38655, 537, - 71404, -78383, 88584, 3221, -35970, -24696, -17180, -50466, 44023, 22012, - -40802, -69256, -73014, 16106, 51003, -5906, 34360, 6979, -20938, 24696, - 24159, -9127, 13422, -15569, -38118, 9127, 8590, -537, -32749, -11274, - 4832, -7516, -6442, -22549, 1611, 10737, - }, - { - -132070, 632434, 412317, -281857, -47782, -54224, 78383, 59056, 88584, 24159, - -141734, -162135, -57445, 71941, -323733, 59056, 1767379, -592706, 434329, 2876554, - -120259, -238908, 554588, -153545, -355409, -52613, 333397, 195421, -132070, -312459, - 207232, 57445, 78383, 312996, 71941, 146029, -58519, 143881, 66572, -95563, - 223875, -42950, -67646, 147103, 91268, 9127, -71404, -93952, -45097, 91268, - 79994, 28454, -175020, -34897, 84289, -3758, -15569, -63351, -11811, 54761, - 16106, -3221, 22549, 11811, 34897, 42413, -31139, -20401, 3221, -14496, - 27380, 59593, 19864, 3221, 39192, 32212, 46708, 43487, 3221, -32749, - -3221, 20938, -20938, -28991, 4295, 12348, -4295, -11274, 11811, -2147, - -30602, -19327, 32212, 22549, 4295, -15569, - }, - { - 5784247, -29011430, -1870458, 361851, 12348, 179852, 155156, 73014, 188979, -192200, - 207769, -45097, 28991, 54224, -388158, 70867, -41339, 328028, -156766, -281857, - -241055, -127238, 116501, -8590, -152471, -302795, 219043, 345745, -197569, -141734, - 119185, 84826, 1611, 169114, 33823, 49929, -66035, 52613, 95026, 130460, - 188979, 10737, -32212, -20938, 49392, 20938, -163209, -76236, -22549, -187905, - -79994, 44560, -33823, -5369, 30065, 106837, 63351, 25770, 138513, 30065, - 97711, -537, 25770, -18790, 7516, 73014, 91805, -8053, -37581, 47245, - -26307, -65498, 66572, 69793, -31139, -26307, 6979, 537, -25770, 35433, - -10201, -15032, 44023, 31675, -63351, 8053, 40802, -8590, -19864, -15032, - 18790, -537, -11811, -11811, -13422, 5906, - }, - { - -144418, 776315, 140660, -125628, 25233, -121333, 32749, -27917, -31675, 74088, - -130997, -246424, -272194, 326954, -800475, 1248225, 305480, 16643, -16643, 44560, - -563178, 665720, -569620, -617938, -117575, -421444, 456877, -164819, -73551, -219580, - -140660, -95563, 99321, 26307, -49392, -55298, 47782, 136902, -1611, 42950, - -55298, 42413, -6442, -17180, -7516, 75162, 200790, -42413, -142271, 71404, - 102542, 83215, -68719, 48855, 76236, 50466, 66572, 120796, -67646, -5906, - 38118, 78920, 42950, -8053, 5906, -97174, 20401, 74625, 31675, -45097, - 38655, -8053, -28991, -1611, 35433, -5906, 25770, 53687, -2684, 10201, - -537, -51540, -18254, -2147, 24159, 6442, 25770, 8590, -23622, 34897, - 1074, -8053, 5906, -14496, 6442, -4295, - }, - { - -9388262, 472983, 1891933, 1085553, -48855, 143881, 164819, -242129, -143881, 515396, - -333397, -606127, -284542, 360777, 170188, 551366, 333934, 176631, 204011, 117575, - 328565, -311922, -201327, 570694, -63888, 20938, 258772, -311922, 152471, 27917, - 45634, -97711, 157303, -82678, 40265, -5906, -263067, 36507, 276489, -20401, - 355945, 71941, 233539, 110059, 169114, 74625, 95026, -134218, -316754, -74088, - 123480, 29528, -60130, 97711, 7516, -75699, -64425, 40802, -8053, -119722, - -9127, 33286, 33823, -42413, -99858, -44560, 51003, -6442, -5369, 13959, - 537, -51540, 18790, 28991, 66572, -60130, 4832, 46708, 6442, -35433, - 3758, -17717, -31675, -38118, -38118, -30065, 11811, 31675, 25770, 10201, - -18790, -2684, -23622, 12885, 18254, -3758, - }, - { - 152471, 4743255, 504659, -74088, -353261, 693100, 215822, -401043, 164819, 207232, - 87510, -431107, 32749, 756451, 604517, 708670, -307627, -263067, 780610, 242666, - -97174, 2147, -49392, 153545, 93952, 255551, 83752, 58519, -260382, 268435, - 3758, -11274, 29528, 212064, -39728, 83215, 273267, 159988, 74088, 85899, - 128312, 129386, 71404, -140660, 87510, 177704, 15032, -31675, -51540, 18790, - 229244, 20938, -12348, 1611, -206695, -97711, 27917, 2684, 66035, 33823, - -40802, -4295, -67646, -77846, -60666, -61740, 62277, 82141, 105764, 29528, - -10201, -13422, -43487, -13959, 38655, -16643, -38118, -8590, -12348, -40802, - -16643, 2147, 18790, 19327, 28991, 13959, -23085, -537, -6979, 18790, - 9664, 12885, 15032, 0, 32749, 13959, - }, - { - -908386, 1136556, -787053, -457951, -6979, 706522, 242666, -360777, -286152, 207232, - 28454, -53687, 138513, 271120, 244813, -205622, 374736, 318901, 312996, 124554, - -1611, 85899, 116501, 147640, 175020, 14496, -158914, -110595, -93952, 247497, - 309775, -162135, -82678, -39192, 167504, -432181, -120796, 81068, -156229, 233539, - 204011, 43487, -123480, -71404, -128849, -56371, 8590, 147640, 38655, -111669, - 24159, 22012, 95563, -44023, -93416, -39192, -13422, 121333, 69256, -67646, - 537, -10737, -24159, -49392, 9127, -3221, -23085, -9127, -2684, 2147, - -12348, -6442, 20401, 74625, 26307, 37581, 28454, -56908, -10201, -5906, - -17717, 30065, -30602, 15569, 8590, 35433, 28454, 17180, 3221, -18790, - 10201, 6442, -19864, -21475, 15569, 13959, - }, - { - -35970, 650151, 237834, -148176, 131533, 12885, -312996, -58519, 162135, 63888, - 153545, -250719, 471373, -2158758, 1611687, -813359, 197032, 782758, 525597, 18790, - -768262, 277562, 396211, 384936, 75162, -414464, -323733, -336081, -346282, 453656, - -107911, -248034, -262530, -71941, 6979, -139050, -20401, 325344, 134218, -7516, - -67109, -155156, 73551, 177167, 0, -21475, -127238, 22012, 99321, 54224, - 86973, -94489, 10201, 67646, 17717, 51540, -56371, -193810, -89657, -37044, - -4295, 33823, -20401, -84826, -76236, 98247, -7516, 2147, 28991, -16106, - 48855, 2147, 24696, 39728, 1611, 55835, 53150, -12348, -8053, -22549, - -3758, 8590, -56371, -35433, -11274, -24696, -40265, -19864, 1611, 5906, - 6979, 16643, 15569, -21475, -6442, 22012, - }, - { - 1087164, 11100880, 1109175, 654446, 72478, 197032, 711891, -424128, -209380, -41339, - 455803, -205622, -113817, 35433, 18790, -443455, -248034, 147640, -62277, 306016, - 176094, -286689, -12885, -181999, 84826, 53687, 51540, 76236, 217970, -24159, - -44023, 51540, -55835, -133681, -162672, 176094, 71941, -28454, 115427, 97711, - -51003, -309775, -23622, -147640, -244276, -204011, 64425, -100932, -124017, 93952, - -60666, 183610, 36507, 124554, 77309, 92342, -27380, -3758, -142271, 63351, - 97174, -53150, -45097, 31675, 26844, -44023, -47782, -46171, 31139, 54761, - -61203, -49392, 50466, 44023, -15032, 537, -46171, 21475, 16106, 29528, - -12885, -59056, -12348, 22549, 40265, -22012, -77846, -24696, -6979, -22549, - -2147, -5906, 44560, 22012, 17180, 37044, - }, - { - 31675, 1749125, -496606, 139586, 85362, 23085, 110059, 151398, 135291, -208843, - 41339, -282931, -62814, 381715, 551366, -752156, 283468, 31675, 165893, 403727, - 150861, -88047, 428960, 491237, 73014, 335544, 116501, 12885, 452045, -79457, - 67646, -60666, 122943, 9127, -376347, -83752, -169651, -304943, 42950, -34360, - -98247, 148176, 20938, -126165, -53150, -100395, 69793, 75699, 105227, -44560, - 17717, 82141, -55835, -92342, -60130, -82141, -82141, 2684, -5906, -69793, - 163746, 44560, -51003, -41339, 81604, -32749, -65498, 90194, 22549, 18790, - -42413, -54224, 18254, 28454, 3758, 40802, -49929, -26307, -5369, 3758, - 65498, 24159, -31139, -16106, -31139, -45634, -30065, 35433, -3758, -10201, - 44560, 37581, -17180, -9127, 35970, -15569, - }, - { - 977105, -5772436, -430570, -480499, 501974, 813359, 347892, -212601, -147103, -135828, - 474594, 208843, -199716, -439160, 631360, 539555, -284005, -97711, 19327, -199179, - -397821, 32749, 22549, 256087, -5906, -46171, 2684, -129923, 357019, -95563, - 35970, 223875, 83752, -196495, -108985, -213138, 155693, 100395, 198105, 92879, - 71404, 44560, 61740, -133144, 84826, -54224, -164819, 130460, 140123, 128849, - 20938, 11811, 77846, 20401, 39728, -16643, -38118, 2147, -24696, -3758, - 537, -104690, -79457, -36507, -40802, -19864, -31675, -31675, -13959, 19864, - -12348, -74088, -7516, 99321, 38118, -22549, -42950, 2684, 22549, -30065, - -16106, 34897, 14496, -11274, 5369, 30065, -5369, 51003, -3221, -31139, - 5906, -24696, -3758, 11274, 2147, 15569, + 974, 5300, 9537, 10289, 7949, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - }, -}; - -const Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /* Q31 */= -{ - 921702144, 440470368, 434517536, 447499072, 463134912, 507976512, 495205440, 490485280, 488481664, 470204416, 485509536, 473953952, 475669760, 479900320, 480402816, 487614080, 489409376, 479041312, 472446400, 469403424, 473341888, 468688320, 457950880, 451686688, 445424608, 426812384, 421443680, 418581056, 408736992, 396210720, 387262176, 378315744, 379030848, 381356576, 394241504, 420728544, 436476064, 447572096, 460993888, 472446400, 478710624, 494816736, 502356544, 501753120, 507521248, 509872736, 518894336, 517796960, 512920032, 520515680, 528908032, 528169312, 528495712, 526983904, 523880768, 524250144, 513828416, 518561472, 504280704, 543399232 + { + -9152, -18404, -17554, -15119, -10745, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + -430, -1502, -366, 507, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 631, 133, 845, 554, -946, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + -143, -618, -179, -151, 1951, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 145, 942, 1322, -574, -142, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 399, 947, 954, 318, 716, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + -1391, -1979, 495, 375, -308, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 2594, 4388, 3090, 1617, 1340, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + -120, -2049, -4761, -7099, -6419, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + -81, 958, 1576, -249, 254, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + -173, 152, -4255, -6572, -4169, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 107, 894, 1364, 326, -1185, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 278, 1695, 2519, 1214, 519, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 13, -147, 1966, 2097, 180, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { + 42, 31, 105, 1304, 1210, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } + } }; - -const Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX] /* Q31 */= -{ - 1254130, 450971, 500363, 455266, 551903, 3259880, 2478196, 2355789, 2716566, 2787433, 4982162, 5222680, 5768141, 5802501, 5652177, 5506148, 5866925, 5856188, 5602785, 5420248, 7337951, 3828963, 2119566, 1501091, 1301375, 1151051, 1097364, 1221918, 1288490, 1166083, 2699387, 2596307, 2055141, 1290637, 588410, 227633, 154618, 109521, 85899, 64424, 51539, 38654, 30064, 27917, 25769, 23622, 19327, 19327, 17179, 17179, 15032, 12884, 10737, 6442, 4294, 4294, 2147, 2147, 0, 0 +const Word16 parametricReverberationTimes_factorQ_fx = 15; +const Word16 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] = { +11321,10468,10910,11827,12265,12150,11751,11407,11243,10858,10371,9993,9662,9422,9172,8856,8652,8402,8189,7931,7703,7525,7331,7169,6966,6806,6622,6491,6354,6092,5986,5962,5891,5868,5785,5647,5607,5503,5504,5545,5483,5437,5360,5294,5191,5133,5091,5033,4967,4914,4856,4799,4741,4684,4626,4568,4511,4453,4395,4338 }; - -const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /* Q31 */= -{ - 741942720,686022272,715028288,775076224,803800960,796237568,770141312,747545472,736820992, - 711570880,679682880,654928832,633196288,617506752,601123648,580415424,567025856,550623424, - 536654016,519776928,504817568,493163168,480456512,469858688,456552864,446008736,433967776, - 425403616,416412096,399234400,392295872,390756128,386091776,384573504,379121056,370071552, - 367440896,360672032,360721408,363373568,359359904,356323360,351253152,346943168,340172160, - 336405472,333613728,329810528,325506976,322043104,318265664,314490400,310715104,306939840, - 303164576,299389280,295611872,291836576,288061312,284286048 +const Word16 parametricReverberationEneCorrections_factorQ_fx = 15; +const Word16 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX] = { +6291,4710,3720,3075,2954,2620,2182,2382,2506,2689,2794,3076,3339,3727,3855,3719,4133,4139,4061,3803,3229,1687,981,826,693,634,547,532,603,604,560,499,466,318,131,53,32,21,16,14,10,6,4,4,3,3,2,2,2,2,2,2,1,1,0,0,0,0,0,0 }; - -const Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX] /* Q31 */= -{ - 412276064,308677152,243799520,201511280,193589216,171714944,143009520,156122064,164263168, - 176233248,183105200,201571408,218830736,244229024,252642864,243726512,270851360,271235776, - 266133360,249251984,211587264,110556752,64317136,54165980,45404248,41570988,35878008, - 34847216,39548060,39554500,36715528,32682554,30524332,20815560,8581345,3463891, - 2072321,1380832,1069446,895500,652835,388694,249108,242665,219043, - 167503,137438,128849,135291,133143,130996,111669,85899,64424, - 30064,15032,6442,2147,0,0 +const Word16 parametricEarlyPartEneCorrection_factorQ_fx = 12; +const Word16 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX] = { +2439,2802,4265,3605,2976,2167,1871,1569,1359,1354,1788,2427,3143,4550,6343,7972,10444,13857,17347,19203,13634,5375,1542,723,614,534,562,1199,2377,3003,3009,3134,3112,2258,1055,373,214,225,208,146,91,65,52,44,37,32,33,45,61,69,67,175,317,271,172,82,32,12,4,1 }; -const Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]/*Q-28*/ = -{ - 159864320,183638576,279548416,236250576,195044928,142030544,122610040,102857488,89049168, - 88735368,117163752,159042096,205982336,298174336,415684640,522399296,684511744,908078208, - 1136966912,1258442624,893532544,352242880,101077488,47363556,40222368,34979020,36799548, - 78574008,155763696,196791376,197201008,205362512,203973104,147970752,69162392,24413400, - 14014478,14734691,13604577,9571603,5986110,4277519,3390071,2863669,2437930, - 2085475,2156073,2945273,3965865,4507031,4388919,11464610,20759992,17780628, - 11286637,5373272,2119566,791079,250181,40802 -}; - #undef WMC_TOOL_SKIP /* clang-format on */ diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 2b4c3e919fcb39f74d9d8ae84b4a89ea1bf52ecf..ae97fc0feddcb92e1aca13577804a22338f56bea 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -33,8 +33,8 @@ /* clang-format off */ /*------------------------------------------------------------------------- - * Binaural rendering related ROM tables - *------------------------------------------------------------------------*/ +* Binaural rendering related ROM tables +*------------------------------------------------------------------------*/ /* Binaural rendering data set based on HRIRs */ /* Tables generated by scripts/binauralRenderer_interface/generate_cren_ivas_tables.c, see mixer_conv_sofa_to_rom_table_converter_readme.txt */ @@ -47,244 +47,305 @@ #include "ivas_cnst.h" +extern const Word32 sine_table_Q31 [361]; +extern const Word32 cosine_table_Q31 [181]; + -extern Word32 sine_table_Q31 [361]; -extern Word32 cosine_table_Q31 [181]; /********************** CRendBin_Combined_HRIR **********************/ -extern Word32 CRendBin_Combined_HRIR_latency_s_fx; +extern const Word16 CRendBin_Combined_HRIR_Q_latency_s_fx; +extern const Word32 CRendBin_Combined_HRIR_latency_s_fx; /* Sample Rate = 48000 */ -extern Word16 CRendBin_Combined_HRIR_max_num_iterations_48kHz; -extern UWord16 CRendBin_Combined_HRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][1]; -extern UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; -extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[15]; -extern UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_Combined_HRIR_coeff_re_48kHz_fx[15][BINAURAL_CHANNELS][240]; -extern Word32 CRendBin_Combined_HRIR_coeff_im_48kHz_fx[15][BINAURAL_CHANNELS][240]; -extern Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]; -extern Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_HRIR_max_num_iterations_48kHz; +extern const Word16 CRendBin_Combined_HRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]; +extern const Word16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; +extern const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_Q_48kHz_fx; +extern const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; +extern const Word16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_HRIR_coeff_Q_48kHz_fx; +extern const Word16 CRendBin_Combined_HRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 CRendBin_Combined_HRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern Word16 CRendBin_Combined_HRIR_max_num_iterations_32kHz; -extern UWord16 CRendBin_Combined_HRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][1]; -extern UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; -extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[15]; -extern UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_Combined_HRIR_coeff_re_32kHz_fx[15][BINAURAL_CHANNELS][160]; -extern Word32 CRendBin_Combined_HRIR_coeff_im_32kHz_fx[15][BINAURAL_CHANNELS][160]; -extern Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]; -extern Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_HRIR_max_num_iterations_32kHz; +extern const Word16 CRendBin_Combined_HRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]; +extern const Word16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; +extern const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_Q_32kHz_fx; +extern const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; +extern const Word16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_HRIR_coeff_Q_32kHz_fx; +extern const Word16 CRendBin_Combined_HRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 CRendBin_Combined_HRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern Word16 CRendBin_Combined_HRIR_max_num_iterations_16kHz; -extern UWord16 CRendBin_Combined_HRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][1]; -extern UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; -extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[15]; -extern UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_Combined_HRIR_coeff_re_16kHz_fx[15][BINAURAL_CHANNELS][80]; -extern Word32 CRendBin_Combined_HRIR_coeff_im_16kHz_fx[15][BINAURAL_CHANNELS][80]; -extern Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]; -extern Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]; - +extern const Word16 CRendBin_Combined_HRIR_max_num_iterations_16kHz; +extern const Word16 CRendBin_Combined_HRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]; +extern const Word16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; +extern const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_Q_16kHz_fx; +extern const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; +extern const Word16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_HRIR_coeff_Q_16kHz_fx; +extern const Word16 CRendBin_Combined_HRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 CRendBin_Combined_HRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]; /********************** CRendBin_FOA_HRIR **********************/ -extern Word32 CRendBin_FOA_HRIR_latency_s_fx; +extern const Word16 CRendBin_FOA_HRIR_Q_latency_s_fx; +extern const Word32 CRendBin_FOA_HRIR_latency_s_fx; /* Sample Rate = 48000 */ -extern Word16 CRendBin_FOA_HRIR_max_num_iterations_48kHz; -extern UWord16 CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]; -extern UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; -extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[4]; -extern UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_FOA_HRIR_coeff_re_48kHz_fx[4][BINAURAL_CHANNELS][240]; -extern Word32 CRendBin_FOA_HRIR_coeff_im_48kHz_fx[4][BINAURAL_CHANNELS][240]; -extern Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]; -extern Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_FOA_HRIR_max_num_iterations_48kHz; +extern const Word16 CRendBin_FOA_HRIR_num_iterations_48kHz[FOA_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]; +extern const Word16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; +extern const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_Q_48kHz_fx; +extern const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]; +extern const Word16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_FOA_HRIR_coeff_Q_48kHz_fx; +extern const Word16 CRendBin_FOA_HRIR_coeff_re_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 CRendBin_FOA_HRIR_coeff_im_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern Word16 CRendBin_FOA_HRIR_max_num_iterations_32kHz; -extern UWord16 CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]; -extern UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; -extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[4]; -extern UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_FOA_HRIR_coeff_re_32kHz_fx[4][BINAURAL_CHANNELS][160]; -extern Word32 CRendBin_FOA_HRIR_coeff_im_32kHz_fx[4][BINAURAL_CHANNELS][160]; -extern Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]; -extern Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_FOA_HRIR_max_num_iterations_32kHz; +extern const Word16 CRendBin_FOA_HRIR_num_iterations_32kHz[FOA_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]; +extern const Word16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; +extern const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_Q_32kHz_fx; +extern const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]; +extern const Word16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_FOA_HRIR_coeff_Q_32kHz_fx; +extern const Word16 CRendBin_FOA_HRIR_coeff_re_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 CRendBin_FOA_HRIR_coeff_im_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern Word16 CRendBin_FOA_HRIR_max_num_iterations_16kHz; -extern UWord16 CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]; -extern UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; -extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[4]; -extern UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_FOA_HRIR_coeff_re_16kHz_fx[4][BINAURAL_CHANNELS][80]; -extern Word32 CRendBin_FOA_HRIR_coeff_im_16kHz_fx[4][BINAURAL_CHANNELS][80]; -extern Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]; -extern Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_FOA_HRIR_max_num_iterations_16kHz; +extern const Word16 CRendBin_FOA_HRIR_num_iterations_16kHz[FOA_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]; +extern const Word16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; +extern const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_Q_16kHz_fx; +extern const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]; +extern const Word16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_FOA_HRIR_coeff_Q_16kHz_fx; +extern const Word16 CRendBin_FOA_HRIR_coeff_re_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 CRendBin_FOA_HRIR_coeff_im_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]; /********************** CRendBin_HOA2_HRIR **********************/ -extern Word32 CRendBin_HOA2_HRIR_latency_s_fx; +extern const Word16 CRendBin_HOA2_HRIR_Q_latency_s_fx; +extern const Word32 CRendBin_HOA2_HRIR_latency_s_fx; /* Sample Rate = 48000 */ -extern Word16 CRendBin_HOA2_HRIR_max_num_iterations_48kHz; -extern UWord16 CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]; -extern UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; -extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[9]; -extern UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[9][BINAURAL_CHANNELS][240]; -extern Word32 CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[9][BINAURAL_CHANNELS][240]; -extern Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]; -extern Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA2_HRIR_max_num_iterations_48kHz; +extern const Word16 CRendBin_HOA2_HRIR_num_iterations_48kHz[HOA2_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]; +extern const Word16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; +extern const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_Q_48kHz_fx; +extern const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]; +extern const Word16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA2_HRIR_coeff_Q_48kHz_fx; +extern const Word16 CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern Word16 CRendBin_HOA2_HRIR_max_num_iterations_32kHz; -extern UWord16 CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]; -extern UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; -extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[9]; -extern UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[9][BINAURAL_CHANNELS][160]; -extern Word32 CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[9][BINAURAL_CHANNELS][160]; -extern Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]; -extern Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA2_HRIR_max_num_iterations_32kHz; +extern const Word16 CRendBin_HOA2_HRIR_num_iterations_32kHz[HOA2_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]; +extern const Word16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; +extern const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_Q_32kHz_fx; +extern const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]; +extern const Word16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA2_HRIR_coeff_Q_32kHz_fx; +extern const Word16 CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern Word16 CRendBin_HOA2_HRIR_max_num_iterations_16kHz; -extern UWord16 CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]; -extern UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; -extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[9]; -extern UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[9][BINAURAL_CHANNELS][80]; -extern Word32 CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[9][BINAURAL_CHANNELS][80]; -extern Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]; -extern Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA2_HRIR_max_num_iterations_16kHz; +extern const Word16 CRendBin_HOA2_HRIR_num_iterations_16kHz[HOA2_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]; +extern const Word16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; +extern const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_Q_16kHz_fx; +extern const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]; +extern const Word16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA2_HRIR_coeff_Q_16kHz_fx; +extern const Word16 CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]; -/********************** CRendBin_HOA3_HRIR **********************/ -extern Word32 CRendBin_HOA3_HRIR_latency_s_fx; +/********************** CRendBin_HOA3_HRIR **********************/ + +extern const Word16 CRendBin_HOA3_HRIR_Q_latency_s_fx; +extern const Word32 CRendBin_HOA3_HRIR_latency_s_fx; /* Sample Rate = 48000 */ -extern Word16 CRendBin_HOA3_HRIR_max_num_iterations_48kHz; -extern UWord16 CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]; -extern UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; -extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[16]; -extern UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[16][BINAURAL_CHANNELS][240]; -extern Word32 CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[16][BINAURAL_CHANNELS][240]; -extern Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]; -extern Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA3_HRIR_max_num_iterations_48kHz; +extern const Word16 CRendBin_HOA3_HRIR_num_iterations_48kHz[HOA3_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]; +extern const Word16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; +extern const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_Q_48kHz_fx; +extern const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]; +extern const Word16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA3_HRIR_coeff_Q_48kHz_fx; +extern const Word16 CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ -extern Word16 CRendBin_HOA3_HRIR_max_num_iterations_32kHz; -extern UWord16 CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]; -extern UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; -extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[16]; -extern UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[16][BINAURAL_CHANNELS][160]; -extern Word32 CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[16][BINAURAL_CHANNELS][160]; -extern Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]; -extern Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA3_HRIR_max_num_iterations_32kHz; +extern const Word16 CRendBin_HOA3_HRIR_num_iterations_32kHz[HOA3_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]; +extern const Word16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; +extern const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_Q_32kHz_fx; +extern const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]; +extern const Word16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA3_HRIR_coeff_Q_32kHz_fx; +extern const Word16 CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ -extern Word16 CRendBin_HOA3_HRIR_max_num_iterations_16kHz; -extern UWord16 CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]; -extern UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; -extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[16]; -extern UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[16][BINAURAL_CHANNELS][80]; -extern Word32 CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[16][BINAURAL_CHANNELS][80]; -extern Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]; -extern Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA3_HRIR_max_num_iterations_16kHz; +extern const Word16 CRendBin_HOA3_HRIR_num_iterations_16kHz[HOA3_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]; +extern const Word16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; +extern const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_Q_16kHz_fx; +extern const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]; +extern const Word16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_HOA3_HRIR_coeff_Q_16kHz_fx; +extern const Word16 CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]; +extern const Word16 *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]; +extern const Word16 *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]; /********************** CRendBin_Combined_BRIR **********************/ -extern Word32 CRendBin_Combined_BRIR_latency_s_fx; +extern const Word16 CRendBin_Combined_BRIR_Q_latency_s_fx; +extern const Word32 CRendBin_Combined_BRIR_latency_s_fx; /* Sample Rate = 48000 */ -extern Word16 CRendBin_Combined_BRIR_max_num_iterations_48kHz; -extern UWord16 CRendBin_Combined_BRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][22]; -extern UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; -extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[15]; -extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]; -extern Word32 CRendBin_Combined_BRIR_coeff_re_48kHz_fx[15][BINAURAL_CHANNELS][2955]; -extern Word32 CRendBin_Combined_BRIR_coeff_im_48kHz_fx[15][BINAURAL_CHANNELS][2955]; -extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS][2885]; -extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS][2885]; +extern const Word16 CRendBin_Combined_BRIR_max_num_iterations_48kHz; +extern const Word16 CRendBin_Combined_BRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]; +extern const Word16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; +extern const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_Q_48kHz_fx; +extern const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; +extern const Word16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]; +extern const Word16 CRendBin_Combined_BRIR_coeff_Q_48kHz_fx; +extern const Word16 CRendBin_Combined_BRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955]; +extern const Word16 CRendBin_Combined_BRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955]; +extern const Word16 CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS][2885]; +extern const Word16 CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS][2885]; /* Sample Rate = 32000 */ -extern Word16 CRendBin_Combined_BRIR_max_num_iterations_32kHz; -extern UWord16 CRendBin_Combined_BRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][22]; -extern UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; -extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[15]; -extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]; -extern Word32 CRendBin_Combined_BRIR_coeff_re_32kHz_fx[15][BINAURAL_CHANNELS][2819]; -extern Word32 CRendBin_Combined_BRIR_coeff_im_32kHz_fx[15][BINAURAL_CHANNELS][2819]; -extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS][2870]; -extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS][2870]; +extern const Word16 CRendBin_Combined_BRIR_max_num_iterations_32kHz; +extern const Word16 CRendBin_Combined_BRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]; +extern const Word16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; +extern const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_Q_32kHz_fx; +extern const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; +extern const Word16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]; +extern const Word16 CRendBin_Combined_BRIR_coeff_Q_32kHz_fx; +extern const Word16 CRendBin_Combined_BRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2818]; +extern const Word16 CRendBin_Combined_BRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2818]; +extern const Word16 CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS][2868]; +extern const Word16 CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS][2868]; /* Sample Rate = 16000 */ -extern Word16 CRendBin_Combined_BRIR_max_num_iterations_16kHz; -extern UWord16 CRendBin_Combined_BRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][23]; -extern UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; -extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[15]; -extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]; -extern Word32 CRendBin_Combined_BRIR_coeff_re_16kHz_fx[15][BINAURAL_CHANNELS][1774]; -extern Word32 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[15][BINAURAL_CHANNELS][1774]; -extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS][2522]; -extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS][2522]; +extern const Word16 CRendBin_Combined_BRIR_max_num_iterations_16kHz; +extern const Word16 CRendBin_Combined_BRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern const Word16 CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][23]; +extern const Word16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; +extern const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_Q_16kHz_fx; +extern const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; +extern const Word16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]; +extern const Word16 CRendBin_Combined_BRIR_coeff_Q_16kHz_fx; +extern const Word16 CRendBin_Combined_BRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1799]; +extern const Word16 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1799]; +extern const Word16 CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS][2474]; +extern const Word16 CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS][2474]; + + +/********************** default HRIR reverb rom tables **********************/ + +/* Sample Rate = 48000 */ + +extern const Word16 defaultHRIR_Q_48kHz_fx; +extern const Word16 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC]; +extern const Word16 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; +extern const Word16 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; + +/* Sample Rate = 32000 */ + +extern const Word16 defaultHRIR_Q_32kHz_fx; +extern const Word16 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC]; +extern const Word16 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; +extern const Word16 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; + +/* Sample Rate = 16000 */ + +extern const Word16 defaultHRIR_Q_16kHz_fx; +extern const Word16 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; +extern const Word16 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; +extern const Word16 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; + #endif /* _IVAS_ROM_BINAURAL_CREND_HEAD_ */ diff --git a/lib_rend/ivas_rom_binaural_crend_head_fx.c b/lib_rend/ivas_rom_binaural_crend_head_fx.c index be015058b11ea110a13953c52676ad6ac5cdc9b3..9be532b7961d4f3976de3633f36a96c16c48af75 100644 --- a/lib_rend/ivas_rom_binaural_crend_head_fx.c +++ b/lib_rend/ivas_rom_binaural_crend_head_fx.c @@ -33,59619 +33,7491 @@ /* clang-format off */ /*------------------------------------------------------------------------- - * Binaural rendering related ROM tables - *------------------------------------------------------------------------*/ +* Binaural rendering related ROM tables +*------------------------------------------------------------------------*/ /* Binaural rendering data set based on HRIRs */ /* Tables generated by scripts/binauralRenderer_interface/generate_cren_ivas_tables.c, see mixer_conv_sofa_to_rom_table_converter_readme.txt */ /* Can be replaced by your own generated HRIR or BRIR tables */ - - #include -#include "ivas_cnst.h" - -/* clang-format off */ +#include "ivas_cnst.h" #define WMC_TOOL_SKIP - /********************** CRendBin_Combined_HRIR **********************/ +const Word16 CRendBin_Combined_HRIR_Q_latency_s_fx = 31; const Word32 CRendBin_Combined_HRIR_latency_s_fx = 44741;/*Q-31*/ + /* Sample Rate = 48000 */ const Word16 CRendBin_Combined_HRIR_max_num_iterations_48kHz = 1; -const UWord16 CRendBin_Combined_HRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; -const UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; -const UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz = 0; -const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[15]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; -const UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_Combined_HRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const Word16 CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const Word16 CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const Word16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz = 0; +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_Q_48kHz_fx = 0; +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; +const Word16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_Combined_HRIR_coeff_Q_48kHz_fx = 13; +const Word16 CRendBin_Combined_HRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {9023, 9189, 9544, 10030, 10304, 9998, 9415, 9346, 9713, 9241, 7392, 5799, 6456, 9007, 11265, 12165, 12697, 13890, 15372, 16348, 16723, 16621, 15741, 13934, 11864, 10465, 10027, 10196, 10633, 11326, 12414, 13935, 15718, 17389, 18563, 19084, 19084, 18795, 18365, 17805, 17077, 16205, 15332, 14636, 14187, 13928, 13755, 13573, 13291, 12856, 12306, 11735, 11213, 10764, 10390, 10087, 9849, 9671, 9533, 9389, 9189, 8912, 8549, 8058, 7388, 6545, 5598, 4643, 3777, 3086, 2616, 2354, 2260, 2295, 2422, 2588, 2744, 2860, 2927, 2957, 2972, 2990, 3020, 3075, 3175, 3332, 3538, 3791, 4094, 4442, 4803, 5143, 5438, 5669, 5821, 5881, + 5847, 5727, 5537, 5298, 5027, 4741, 4462, 4208, 3977, 3762, 3576, 3437, 3352, 3316, 3339, 3431, 3589, 3802, 4065, 4378, 4738, 5146, 5606, 6116, 6673, 7286, 7964, 8695, 9464, 10275, 11137, 12029, 12919, 13789, 14632, 15419, 16093, 16606, 16931, 17039, 16886, 16430, 15670, 14641, 13368, 11859, 10147, 8302, 6388, 4421, 2405, 394, -1557, -3444, -5296, -7097, -8801, -10409, -11967, -13484, -14927, -16287, -17598, -18877, -20098, -21229, -22273, -23239, -24107, -24831, -25379, -25758, -25976, -26001, -25804, -25413, -24876, -24190, -23321, -22296, -21173, -19937, -18524, -16939, -15225, -13340, -11198, -8799, -6192, -3340, -194, 3149, 6529, 9870, 13065, 15819, + 17831, 18984, 19133, 17950, 15295, 11422, 6517, 600, -5410, -9138, -8590, -4640, -605, 1037, 668, 59, -2, 83, -4, -64, 12, 49, -15, -38, 17, 30, -16, -24, 15, 18, -14, -15, 12, 11, -12, -9, 10, 6, -9, -4, 7, 2, -6, 0, 5, -1, -3, 3 }, + {7933, 8087, 7124, 4883, 2740, 1402, 146, -1325, -2013, -1274, 53, 770, 405, -1151, -3842, -6754, -8408, -8324, -7419, -6527, -5492, -4123, -2969, -2521, -2420, -2087, -1524, -928, -49, 1442, 3279, 4881, 6097, 7185, 8110, 8378, 7658, 6270, 4849, 3731, 2825, 1957, 1092, 227, -705, -1721, -2702, -3520, -4161, -4658, -4987, -5099, -5003, -4745, -4354, -3864, -3320, -2739, -2095, -1377, -614, 160, 908, 1570, 2073, 2397, 2575, 2646, 2629, 2549, 2440, 2332, 2244, 2187, 2154, 2128, 2080, 1983, 1812, 1561, 1254, 923, 583, 231, -151, -592, -1119, -1725, -2356, -2939, -3408, -3702, -3776, -3617, -3253, -2738, + -2145, -1561, -1059, -673, -403, -236, -143, -77, 11, 164, 421, 825, 1407, 2166, 3061, 4018, 4936, 5695, 6180, 6304, 6019, 5311, 4202, 2750, 1044, -813, -2707, -4516, -6111, -7379, -8231, -8611, -8495, -7901, -6896, -5566, -4008, -2318, -596, 1074, 2637, 4043, 5238, 6178, 6835, 7179, 7184, 6838, 6158, 5174, 3931, 2500, 981, -527, -1932, -3144, -4085, -4709, -5009, -4999, -4706, -4187, -3513, -2749, -1950, -1172, -457, 172, 704, 1130, 1450, 1674, 1817, 1889, 1899, 1857, 1769, 1639, 1472, 1274, 1047, 793, 523, 241, -51, -344, -628, -894, -1131, -1317, -1429, -1452, -1378, -1189, -884, -493, + -56, 394, 806, 1098, 1211, 1133, 858, 375, -215, -647, -681, -370, -27, 105, 59, 4, 6, 20, 12, 8, 19, 25, 19, 18, 25, 27, 21, 20, 23, 22, 16, 14, 15, 12, 6, 3, 2, -2, -7, -10, -11, -15, -18, -20, -21, -23, -24, -24 } + }, + { + {7933, 8087, 7124, 4883, 2740, 1402, 146, -1325, -2013, -1274, 53, 770, 405, -1151, -3842, -6754, -8408, -8324, -7419, -6527, -5492, -4123, -2969, -2521, -2420, -2087, -1524, -928, -49, 1442, 3279, 4881, 6097, 7185, 8110, 8378, 7658, 6270, 4849, 3731, 2825, 1957, 1092, 227, -705, -1721, -2702, -3520, -4161, -4658, -4987, -5099, -5003, -4745, -4354, -3864, -3320, -2739, -2095, -1377, -614, 160, 908, 1570, 2073, 2397, 2575, 2646, 2629, 2549, 2440, 2332, 2244, 2187, 2154, 2128, 2080, 1983, 1812, 1561, 1254, 923, 583, 231, -151, -592, -1119, -1725, -2356, -2939, -3408, -3702, -3776, -3617, -3253, -2738, + -2145, -1561, -1059, -673, -403, -236, -143, -77, 11, 164, 421, 825, 1407, 2166, 3061, 4018, 4936, 5695, 6180, 6304, 6019, 5311, 4202, 2750, 1044, -813, -2707, -4516, -6111, -7379, -8231, -8611, -8495, -7901, -6896, -5566, -4008, -2318, -596, 1074, 2637, 4043, 5238, 6178, 6835, 7179, 7184, 6838, 6158, 5174, 3931, 2500, 981, -527, -1932, -3144, -4085, -4709, -5009, -4999, -4706, -4187, -3513, -2749, -1950, -1172, -457, 172, 704, 1130, 1450, 1674, 1817, 1889, 1899, 1857, 1769, 1639, 1472, 1274, 1047, 793, 523, 241, -51, -344, -628, -894, -1131, -1317, -1429, -1452, -1378, -1189, -884, -493, + -56, 394, 806, 1098, 1211, 1133, 858, 375, -215, -647, -681, -370, -27, 105, 59, 4, 6, 20, 12, 8, 19, 25, 19, 18, 25, 27, 21, 20, 23, 22, 16, 14, 15, 12, 6, 3, 2, -2, -7, -10, -11, -15, -18, -20, -21, -23, -24, -24 }, + {9023, 9189, 9544, 10030, 10304, 9998, 9415, 9346, 9713, 9241, 7392, 5799, 6456, 9007, 11265, 12165, 12697, 13890, 15372, 16348, 16723, 16621, 15741, 13934, 11864, 10465, 10027, 10196, 10633, 11326, 12414, 13935, 15718, 17389, 18563, 19084, 19084, 18795, 18365, 17805, 17077, 16205, 15332, 14636, 14187, 13928, 13755, 13573, 13291, 12856, 12306, 11735, 11213, 10764, 10390, 10087, 9849, 9671, 9533, 9389, 9189, 8912, 8549, 8058, 7388, 6545, 5598, 4643, 3777, 3086, 2616, 2354, 2260, 2295, 2422, 2588, 2744, 2860, 2927, 2957, 2972, 2990, 3020, 3075, 3175, 3332, 3538, 3791, 4094, 4442, 4803, 5143, 5438, 5669, 5821, 5881, + 5847, 5727, 5537, 5298, 5027, 4741, 4462, 4208, 3977, 3762, 3576, 3437, 3352, 3316, 3339, 3431, 3589, 3802, 4065, 4378, 4738, 5146, 5606, 6116, 6673, 7286, 7964, 8695, 9464, 10275, 11137, 12029, 12919, 13789, 14632, 15419, 16093, 16606, 16931, 17039, 16886, 16430, 15670, 14641, 13368, 11859, 10147, 8302, 6388, 4421, 2405, 394, -1557, -3444, -5296, -7097, -8801, -10409, -11967, -13484, -14927, -16287, -17598, -18877, -20098, -21229, -22273, -23239, -24107, -24831, -25379, -25758, -25976, -26001, -25804, -25413, -24876, -24190, -23321, -22296, -21173, -19937, -18524, -16939, -15225, -13340, -11198, -8799, -6192, -3340, -194, 3149, 6529, 9870, 13065, 15819, + 17831, 18984, 19133, 17950, 15295, 11422, 6517, 600, -5410, -9138, -8590, -4640, -605, 1037, 668, 59, -2, 83, -4, -64, 12, 49, -15, -38, 17, 30, -16, -24, 15, 18, -14, -15, 12, 11, -12, -9, 10, 6, -9, -4, 7, 2, -6, 0, 5, -1, -3, 3 } + }, + { + {8505, 9051, 9535, 9034, 7569, 6711, 7590, 8677, 7443, 4269, 2625, 4645, 8335, 10323, 9989, 9454, 10375, 12249, 13593, 13598, 12466, 10906, 9610, 8901, 8706, 8884, 9458, 10470, 11766, 13033, 13944, 14252, 13909, 13136, 12231, 11276, 10174, 8969, 7947, 7390, 7345, 7655, 8089, 8418, 8494, 8330, 8050, 7734, 7363, 6897, 6358, 5823, 5358, 4975, 4648, 4352, 4079, 3823, 3555, 3258, 2960, 2710, 2520, 2360, 2206, 2073, 1988, 1952, 1944, 1948, 1969, 2025, 2128, 2273, 2443, 2624, 2805, 2988, 3176, 3372, 3575, 3774, 3960, 4136, 4313, 4503, 4699, 4887, 5055, 5198, 5303, 5348, 5306, 5168, 4940, 4641, + 4301, 3966, 3680, 3470, 3345, 3316, 3394, 3589, 3898, 4312, 4831, 5460, 6201, 7043, 7955, 8905, 9861, 10785, 11627, 12348, 12933, 13376, 13656, 13755, 13681, 13456, 13076, 12520, 11783, 10884, 9828, 8600, 7211, 5711, 4151, 2547, 906, -734, -2324, -3852, -5342, -6796, -8191, -9525, -10828, -12117, -13368, -14554, -15680, -16749, -17727, -18562, -19229, -19732, -20049, -20141, -19989, -19615, -19043, -18271, -17309, -16195, -14979, -13685, -12330, -10953, -9605, -8320, -7111, -5999, -5013, -4167, -3449, -2847, -2354, -1963, -1655, -1402, -1185, -996, -824, -654, -474, -281, -83, 124, 351, 597, 856, 1130, 1426, 1737, 2040, 2325, 2586, 2801, + 2939, 2987, 2946, 2793, 2502, 2083, 1553, 878, 58, -711, -1097, -946, -484, -98, 34, 16, -3, 5, 4, -5, -3, 5, 2, -3, -1, 3, 0, -3, 0, 2, 0, -2, 0, 1, -1, -1, 0, 1, 0, -1, 0, 1, 0, 0, 1, 0, 0, 0 }, + {8505, 9051, 9535, 9034, 7569, 6711, 7590, 8677, 7443, 4269, 2625, 4645, 8335, 10323, 9989, 9454, 10375, 12249, 13593, 13598, 12466, 10906, 9610, 8901, 8706, 8884, 9458, 10470, 11766, 13033, 13944, 14252, 13909, 13136, 12231, 11276, 10174, 8969, 7947, 7390, 7345, 7655, 8089, 8418, 8494, 8330, 8050, 7734, 7363, 6897, 6358, 5823, 5358, 4975, 4648, 4352, 4079, 3823, 3555, 3258, 2960, 2710, 2520, 2360, 2206, 2073, 1988, 1952, 1944, 1948, 1969, 2025, 2128, 2273, 2443, 2624, 2805, 2988, 3176, 3372, 3575, 3774, 3960, 4136, 4313, 4503, 4699, 4887, 5055, 5198, 5303, 5348, 5306, 5168, 4940, 4641, + 4301, 3966, 3680, 3470, 3345, 3316, 3394, 3589, 3898, 4312, 4831, 5460, 6201, 7043, 7955, 8905, 9861, 10785, 11627, 12348, 12933, 13376, 13656, 13755, 13681, 13456, 13076, 12520, 11783, 10884, 9828, 8600, 7211, 5711, 4151, 2547, 906, -734, -2324, -3852, -5342, -6796, -8191, -9525, -10828, -12117, -13368, -14554, -15680, -16749, -17727, -18562, -19229, -19732, -20049, -20141, -19989, -19615, -19043, -18271, -17309, -16195, -14979, -13685, -12330, -10953, -9605, -8320, -7111, -5999, -5013, -4167, -3449, -2847, -2354, -1963, -1655, -1402, -1185, -996, -824, -654, -474, -281, -83, 124, 351, 597, 856, 1130, 1426, 1737, 2040, 2325, 2586, 2801, + 2939, 2987, 2946, 2793, 2502, 2083, 1553, 878, 58, -711, -1097, -946, -484, -98, 34, 16, -3, 5, 4, -5, -3, 5, 2, -3, -1, 3, 0, -3, 0, 2, 0, -2, 0, 1, -1, -1, 0, 1, 0, -1, 0, 1, 0, 0, 1, 0, 0, 0 } + }, + { + {8062, 7950, 8249, 9046, 9968, 10942, 11995, 12559, 12104, 11253, 11045, 11305, 10987, 9954, 9106, 8821, 8533, 7918, 7319, 6887, 6303, 5547, 5061, 5003, 5079, 5147, 5325, 5474, 5235, 4620, 4041, 3723, 3529, 3369, 3350, 3514, 3775, 4118, 4608, 5198, 5734, 6121, 6360, 6456, 6434, 6385, 6408, 6551, 6829, 7246, 7754, 8251, 8642, 8866, 8879, 8670, 8296, 7834, 7321, 6768, 6198, 5631, 5072, 4523, 4008, 3553, 3173, 2881, 2690, 2598, 2590, 2655, 2779, 2948, 3155, 3408, 3722, 4103, 4563, 5118, 5785, 6570, 7469, 8466, 9551, 10718, 11950, 13208, 14443, 15604, 16623, 17411, 17893, 18052, 17901, 17443, + 16687, 15685, 14510, 13212, 11815, 10359, 8900, 7464, 6042, 4638, 3296, 2060, 955, -3, -789, -1386, -1814, -2111, -2306, -2408, -2424, -2375, -2279, -2146, -1979, -1795, -1618, -1456, -1303, -1147, -984, -810, -617, -397, -152, 104, 353, 582, 779, 932, 1018, 1025, 949, 792, 539, 175, -301, -875, -1534, -2270, -3061, -3866, -4645, -5384, -6078, -6709, -7262, -7743, -8175, -8562, -8894, -9171, -9408, -9611, -9768, -9871, -9927, -9950, -9937, -9882, -9789, -9673, -9548, -9410, -9254, -9091, -8941, -8798, -8641, -8470, -8303, -8128, -7908, -7630, -7307, -6921, -6415, -5770, -4994, -4055, -2891, -1508, 35, 1714, 3509, 5292, + 6885, 8191, 9121, 9462, 9014, 7791, 5826, 2980, -546, -3579, -4584, -3269, -1088, 241, 359, 65, -14, 41, 14, -35, -6, 28, 2, -22, 1, 19, -2, -15, 3, 12, -4, -10, 3, 7, -4, -6, 3, 4, -3, -3, 3, 2, -2, -1, 2, 0, -1, 1 }, + {7242, 6085, 3964, 1548, -389, -1714, -2825, -3767, -4096, -3702, -3132, -2845, -2705, -2467, -2245, -2133, -1768, -677, 1108, 3044, 4533, 5228, 5071, 4271, 3144, 1891, 574, -672, -1601, -2099, -2297, -2386, -2425, -2406, -2347, -2233, -1964, -1440, -673, 228, 1112, 1824, 2228, 2278, 2022, 1564, 1023, 521, 155, -48, -129, -147, -150, -167, -209, -269, -331, -383, -423, -457, -498, -566, -667, -793, -921, -1013, -1011, -859, -531, -48, 534, 1130, 1648, 2014, 2184, 2153, 1932, 1547, 1020, 375, -355, -1119, -1837, -2415, -2755, -2790, -2498, -1920, -1145, -289, 534, 1230, 1736, 2020, 2081, 1941, + 1640, 1232, 774, 323, -71, -375, -577, -685, -720, -710, -679, -647, -626, -619, -623, -627, -615, -568, -467, -298, -63, 224, 534, 830, 1073, 1234, 1294, 1246, 1095, 852, 536, 167, -231, -626, -987, -1278, -1464, -1519, -1426, -1190, -835, -403, 54, 476, 817, 1048, 1158, 1155, 1060, 899, 700, 482, 261, 47, -153, -335, -494, -622, -710, -752, -741, -675, -559, -406, -230, -49, 117, 257, 363, 434, 472, 484, 480, 463, 436, 401, 356, 290, 195, 67, -99, -306, -541, -771, -960, -1065, -1033, -823, -436, 82, 659, 1188, 1537, 1593, 1324, 776, + 42, -719, -1292, -1504, -1319, -790, -28, 726, 1087, 831, 196, -282, -319, -107, 27, 10, -24, -10, 2, -13, -20, -6, 0, -9, -9, 2, 5, 1, 2, 10, 12, 8, 10, 13, 12, 9, 8, 9, 6, 2, 0, -2, -5, -7, -9, -10, -12, -12 } + }, + { + {7242, 6085, 3964, 1548, -389, -1714, -2825, -3767, -4096, -3702, -3132, -2845, -2705, -2467, -2245, -2133, -1768, -677, 1108, 3044, 4533, 5228, 5071, 4271, 3144, 1891, 574, -672, -1601, -2099, -2297, -2386, -2425, -2406, -2347, -2233, -1964, -1440, -673, 228, 1112, 1824, 2228, 2278, 2022, 1564, 1023, 521, 155, -48, -129, -147, -150, -167, -209, -269, -331, -383, -423, -457, -498, -566, -667, -793, -921, -1013, -1011, -859, -531, -48, 534, 1130, 1648, 2014, 2184, 2153, 1932, 1547, 1020, 375, -355, -1119, -1837, -2415, -2755, -2790, -2498, -1920, -1145, -289, 534, 1230, 1736, 2020, 2081, 1941, + 1640, 1232, 774, 323, -71, -375, -577, -685, -720, -710, -679, -647, -626, -619, -623, -627, -615, -568, -467, -298, -63, 224, 534, 830, 1073, 1234, 1294, 1246, 1095, 852, 536, 167, -231, -626, -987, -1278, -1464, -1519, -1426, -1190, -835, -403, 54, 476, 817, 1048, 1158, 1155, 1060, 899, 700, 482, 261, 47, -153, -335, -494, -622, -710, -752, -741, -675, -559, -406, -230, -49, 117, 257, 363, 434, 472, 484, 480, 463, 436, 401, 356, 290, 195, 67, -99, -306, -541, -771, -960, -1065, -1033, -823, -436, 82, 659, 1188, 1537, 1593, 1324, 776, + 42, -719, -1292, -1504, -1319, -790, -28, 726, 1087, 831, 196, -282, -319, -107, 27, 10, -24, -10, 2, -13, -20, -6, 0, -9, -9, 2, 5, 1, 2, 10, 12, 8, 10, 13, 12, 9, 8, 9, 6, 2, 0, -2, -5, -7, -9, -10, -12, -12 }, + {8062, 7950, 8249, 9046, 9968, 10942, 11995, 12559, 12104, 11253, 11045, 11305, 10987, 9954, 9106, 8821, 8533, 7918, 7319, 6887, 6303, 5547, 5061, 5003, 5079, 5147, 5325, 5474, 5235, 4620, 4041, 3723, 3529, 3369, 3350, 3514, 3775, 4118, 4608, 5198, 5734, 6121, 6360, 6456, 6434, 6385, 6408, 6551, 6829, 7246, 7754, 8251, 8642, 8866, 8879, 8670, 8296, 7834, 7321, 6768, 6198, 5631, 5072, 4523, 4008, 3553, 3173, 2881, 2690, 2598, 2590, 2655, 2779, 2948, 3155, 3408, 3722, 4103, 4563, 5118, 5785, 6570, 7469, 8466, 9551, 10718, 11950, 13208, 14443, 15604, 16623, 17411, 17893, 18052, 17901, 17443, + 16687, 15685, 14510, 13212, 11815, 10359, 8900, 7464, 6042, 4638, 3296, 2060, 955, -3, -789, -1386, -1814, -2111, -2306, -2408, -2424, -2375, -2279, -2146, -1979, -1795, -1618, -1456, -1303, -1147, -984, -810, -617, -397, -152, 104, 353, 582, 779, 932, 1018, 1025, 949, 792, 539, 175, -301, -875, -1534, -2270, -3061, -3866, -4645, -5384, -6078, -6709, -7262, -7743, -8175, -8562, -8894, -9171, -9408, -9611, -9768, -9871, -9927, -9950, -9937, -9882, -9789, -9673, -9548, -9410, -9254, -9091, -8941, -8798, -8641, -8470, -8303, -8128, -7908, -7630, -7307, -6921, -6415, -5770, -4994, -4055, -2891, -1508, 35, 1714, 3509, 5292, + 6885, 8191, 9121, 9462, 9014, 7791, 5826, 2980, -546, -3579, -4584, -3269, -1088, 241, 359, 65, -14, 41, 14, -35, -6, 28, 2, -22, 1, 19, -2, -15, 3, 12, -4, -10, 3, 7, -4, -6, 3, 4, -3, -3, 3, 2, -2, -1, 2, 0, -1, 1 } + }, + { + {8712, 8545, 8853, 9945, 11321, 12333, 12876, 13082, 12774, 11825, 10776, 10361, 10452, 10213, 9404, 8749, 8760, 8956, 8689, 8121, 7801, 7763, 7630, 7341, 7170, 7190, 7187, 7065, 6972, 7034, 7217, 7434, 7612, 7687, 7660, 7640, 7742, 7990, 8356, 8816, 9326, 9825, 10282, 10706, 11080, 11366, 11559, 11699, 11821, 11943, 12074, 12210, 12322, 12381, 12366, 12262, 12062, 11784, 11446, 11042, 10568, 10050, 9520, 8976, 8411, 7842, 7290, 6749, 6214, 5712, 5281, 4944, 4715, 4611, 4640, 4792, 5054, 5419, 5873, 6407, 7023, 7723, 8490, 9311, 10192, 11146, 12157, 13196, 14248, 15300, 16317, 17240, 18017, 18615, 19004, 19141, + 18990, 18552, 17860, 16936, 15785, 14429, 12933, 11348, 9689, 7970, 6250, 4595, 3028, 1560, 235, -891, -1807, -2538, -3097, -3484, -3716, -3837, -3879, -3850, -3761, -3628, -3476, -3321, -3167, -3012, -2862, -2721, -2577, -2403, -2188, -1941, -1673, -1383, -1079, -784, -524, -318, -178, -120, -165, -336, -644, -1088, -1667, -2390, -3255, -4235, -5287, -6390, -7529, -8654, -9704, -10654, -11503, -12232, -12810, -13235, -13534, -13718, -13778, -13719, -13567, -13345, -13060, -12718, -12337, -11942, -11553, -11174, -10800, -10444, -10129, -9851, -9579, -9313, -9076, -8855, -8603, -8307, -7989, -7625, -7139, -6504, -5731, -4766, -3514, -1971, -203, 1781, 3976, 6217, + 8272, 10016, 11330, 11903, 11447, 9968, 7487, 3796, -838, -4816, -6072, -4245, -1321, 406, 503, 81, -23, 58, 20, -49, -8, 40, 2, -32, 2, 27, -4, -22, 5, 17, -6, -15, 6, 11, -7, -9, 6, 6, -6, -4, 5, 3, -4, -1, 4, 0, -2, 2 }, + {7418, 5559, 2551, -607, -3207, -5058, -6113, -6070, -4623, -2085, 581, 2486, 3418, 3682, 3541, 3013, 2097, 977, -74, -936, -1670, -2303, -2664, -2549, -1982, -1197, -378, 449, 1245, 1852, 2125, 2063, 1746, 1230, 567, -153, -826, -1365, -1685, -1718, -1490, -1108, -667, -199, 286, 753, 1155, 1439, 1539, 1406, 1042, 512, -91, -665, -1107, -1342, -1357, -1188, -894, -536, -170, 175, 499, 802, 1072, 1273, 1354, 1258, 938, 387, -338, -1117, -1776, -2129, -2045, -1505, -626, 379, 1265, 1840, 2011, 1800, 1297, 627, -85, -728, -1211, -1465, -1454, -1189, -736, -199, 308, 691, 898, 921, + 794, 574, 318, 74, -125, -266, -349, -383, -380, -353, -310, -254, -183, -95, 12, 136, 263, 372, 439, 442, 373, 237, 55, -139, -308, -421, -459, -419, -316, -175, -23, 116, 224, 293, 321, 310, 266, 194, 102, 0, -102, -192, -257, -287, -277, -228, -145, -43, 61, 150, 212, 238, 230, 192, 135, 67, -3, -67, -119, -156, -177, -179, -163, -129, -80, -19, 48, 114, 168, 204, 212, 190, 137, 62, -26, -115, -188, -233, -246, -223, -165, -79, 22, 127, 224, 297, 324, 292, 200, 48, -146, -335, -456, -464, -344, -106, + 193, 444, 543, 450, 200, -134, -423, -494, -271, 82, 278, 204, 21, -65, -32, 8, 1, -12, -4, 3, -4, -9, -1, 3, -1, -2, 4, 6, 2, 2, 5, 4, 0, -1, 0, -1, -4, -5, -3, -3, -4, -2, 0, 0, 1, 3, 4, 4 } + }, + { + {7418, 5559, 2551, -607, -3207, -5058, -6113, -6070, -4623, -2085, 581, 2486, 3418, 3682, 3541, 3013, 2097, 977, -74, -936, -1670, -2303, -2664, -2549, -1982, -1197, -378, 449, 1245, 1852, 2125, 2063, 1746, 1230, 567, -153, -826, -1365, -1685, -1718, -1490, -1108, -667, -199, 286, 753, 1155, 1439, 1539, 1406, 1042, 512, -91, -665, -1107, -1342, -1357, -1188, -894, -536, -170, 175, 499, 802, 1072, 1273, 1354, 1258, 938, 387, -338, -1117, -1776, -2129, -2045, -1505, -626, 379, 1265, 1840, 2011, 1800, 1297, 627, -85, -728, -1211, -1465, -1454, -1189, -736, -199, 308, 691, 898, 921, + 794, 574, 318, 74, -125, -266, -349, -383, -380, -353, -310, -254, -183, -95, 12, 136, 263, 372, 439, 442, 373, 237, 55, -139, -308, -421, -459, -419, -316, -175, -23, 116, 224, 293, 321, 310, 266, 194, 102, 0, -102, -192, -257, -287, -277, -228, -145, -43, 61, 150, 212, 238, 230, 192, 135, 67, -3, -67, -119, -156, -177, -179, -163, -129, -80, -19, 48, 114, 168, 204, 212, 190, 137, 62, -26, -115, -188, -233, -246, -223, -165, -79, 22, 127, 224, 297, 324, 292, 200, 48, -146, -335, -456, -464, -344, -106, + 193, 444, 543, 450, 200, -134, -423, -494, -271, 82, 278, 204, 21, -65, -32, 8, 1, -12, -4, 3, -4, -9, -1, 3, -1, -2, 4, 6, 2, 2, 5, 4, 0, -1, 0, -1, -4, -5, -3, -3, -4, -2, 0, 0, 1, 3, 4, 4 }, + {8712, 8545, 8853, 9945, 11321, 12333, 12876, 13082, 12774, 11825, 10776, 10361, 10452, 10213, 9404, 8749, 8760, 8956, 8689, 8121, 7801, 7763, 7630, 7341, 7170, 7190, 7187, 7065, 6972, 7034, 7217, 7434, 7612, 7687, 7660, 7640, 7742, 7990, 8356, 8816, 9326, 9825, 10282, 10706, 11080, 11366, 11559, 11699, 11821, 11943, 12074, 12210, 12322, 12381, 12366, 12262, 12062, 11784, 11446, 11042, 10568, 10050, 9520, 8976, 8411, 7842, 7290, 6749, 6214, 5712, 5281, 4944, 4715, 4611, 4640, 4792, 5054, 5419, 5873, 6407, 7023, 7723, 8490, 9311, 10192, 11146, 12157, 13196, 14248, 15300, 16317, 17240, 18017, 18615, 19004, 19141, + 18990, 18552, 17860, 16936, 15785, 14429, 12933, 11348, 9689, 7970, 6250, 4595, 3028, 1560, 235, -891, -1807, -2538, -3097, -3484, -3716, -3837, -3879, -3850, -3761, -3628, -3476, -3321, -3167, -3012, -2862, -2721, -2577, -2403, -2188, -1941, -1673, -1383, -1079, -784, -524, -318, -178, -120, -165, -336, -644, -1088, -1667, -2390, -3255, -4235, -5287, -6390, -7529, -8654, -9704, -10654, -11503, -12232, -12810, -13235, -13534, -13718, -13778, -13719, -13567, -13345, -13060, -12718, -12337, -11942, -11553, -11174, -10800, -10444, -10129, -9851, -9579, -9313, -9076, -8855, -8603, -8307, -7989, -7625, -7139, -6504, -5731, -4766, -3514, -1971, -203, 1781, 3976, 6217, + 8272, 10016, 11330, 11903, 11447, 9968, 7487, 3796, -838, -4816, -6072, -4245, -1321, 406, 503, 81, -23, 58, 20, -49, -8, 40, 2, -32, 2, 27, -4, -22, 5, 17, -6, -15, 6, 11, -7, -9, 6, 6, -6, -4, 5, 3, -4, -1, 4, 0, -2, 2 } + }, + { + {8934, 9213, 9570, 10255, 11619, 13087, 13559, 12961, 12322, 12086, 11499, 10151, 8956, 8860, 9465, 9803, 9788, 9992, 10439, 10603, 10403, 10349, 10654, 10887, 10629, 10008, 9438, 9152, 9123, 9188, 9188, 9130, 9251, 9778, 10629, 11476, 12088, 12484, 12765, 12959, 13061, 13125, 13233, 13439, 13739, 14098, 14472, 14830, 15153, 15406, 15537, 15508, 15324, 15018, 14620, 14167, 13711, 13298, 12936, 12604, 12270, 11900, 11448, 10859, 10102, 9185, 8151, 7055, 5961, 4941, 4063, 3358, 2831, 2485, 2328, 2359, 2550, 2869, 3297, 3826, 4450, 5156, 5928, 6744, 7580, 8406, 9194, 9928, 10623, 11312, 12015, 12721, 13416, 14092, 14721, 15240, + 15581, 15702, 15579, 15177, 14456, 13419, 12123, 10629, 8983, 7243, 5501, 3835, 2273, 810, -537, -1747, -2833, -3832, -4758, -5588, -6304, -6915, -7423, -7809, -8055, -8178, -8210, -8166, -8048, -7867, -7644, -7391, -7100, -6762, -6388, -5999, -5609, -5222, -4848, -4505, -4210, -3970, -3789, -3677, -3658, -3752, -3971, -4319, -4806, -5444, -6222, -7107, -8061, -9056, -10058, -11009, -11851, -12559, -13123, -13521, -13728, -13748, -13607, -13313, -12864, -12275, -11583, -10819, -9997, -9139, -8279, -7451, -6672, -5954, -5307, -4748, -4286, -3915, -3618, -3392, -3240, -3149, -3088, -3047, -3036, -3040, -3012, -2927, -2786, -2550, -2145, -1544, -765, 202, 1379, 2694, + 4010, 5240, 6310, 7026, 7168, 6675, 5531, 3549, 737, -2066, -3476, -2894, -1246, -11, 254, 63, -17, 29, 18, -26, -11, 22, 6, -18, -3, 16, 1, -13, 0, 10, -2, -9, 1, 6, -3, -6, 2, 4, -2, -3, 2, 2, -2, -1, 2, 1, -1, 1 }, + {7514, 5337, 1976, -1468, -4398, -6443, -7054, -5791, -2961, 382, 3171, 4935, 5667, 5376, 3991, 1657, -1077, -3466, -4943, -5284, -4519, -2806, -454, 2000, 3904, 4777, 4507, 3282, 1430, -656, -2517, -3724, -4030, -3427, -2098, -366, 1332, 2567, 3091, 2907, 2180, 1114, -82, -1176, -1955, -2282, -2128, -1561, -723, 186, 961, 1455, 1615, 1469, 1089, 562, -8, -522, -900, -1102, -1119, -964, -673, -298, 105, 488, 811, 1034, 1116, 1015, 701, 187, -442, -1030, -1399, -1430, -1103, -511, 176, 772, 1139, 1234, 1089, 774, 361, -94, -539, -915, -1148, -1161, -912, -429, 178, 744, 1110, 1186, + 980, 576, 97, -344, -666, -832, -838, -705, -469, -174, 139, 429, 656, 780, 769, 608, 308, -84, -484, -791, -917, -821, -522, -103, 320, 638, 780, 735, 538, 253, -47, -301, -471, -540, -511, -399, -231, -33, 163, 327, 433, 462, 408, 278, 94, -110, -294, -423, -468, -418, -282, -87, 125, 311, 428, 452, 380, 230, 38, -154, -307, -391, -394, -320, -185, -19, 145, 277, 353, 359, 295, 172, 14, -149, -283, -358, -356, -279, -138, 35, 200, 319, 369, 341, 234, 70, -115, -281, -394, -415, -318, -116, 134, 359, 485, 449, + 237, -76, -352, -482, -413, -151, 199, 425, 349, 43, -207, -208, -50, 53, 38, -1, 4, 20, 13, 0, 3, 5, -5, -13, -10, -7, -10, -9, -1, 5, 6, 8, 13, 13, 8, 4, 1, -4, -9, -12, -11, -10, -8, -3, 2, 6, 10, 12 } + }, + { + {7514, 5337, 1976, -1468, -4398, -6443, -7054, -5791, -2961, 382, 3171, 4935, 5667, 5376, 3991, 1657, -1077, -3466, -4943, -5284, -4519, -2806, -454, 2000, 3904, 4777, 4507, 3282, 1430, -656, -2517, -3724, -4030, -3427, -2098, -366, 1332, 2567, 3091, 2907, 2180, 1114, -82, -1176, -1955, -2282, -2128, -1561, -723, 186, 961, 1455, 1615, 1469, 1089, 562, -8, -522, -900, -1102, -1119, -964, -673, -298, 105, 488, 811, 1034, 1116, 1015, 701, 187, -442, -1030, -1399, -1430, -1103, -511, 176, 772, 1139, 1234, 1089, 774, 361, -94, -539, -915, -1148, -1161, -912, -429, 178, 744, 1110, 1186, + 980, 576, 97, -344, -666, -832, -838, -705, -469, -174, 139, 429, 656, 780, 769, 608, 308, -84, -484, -791, -917, -821, -522, -103, 320, 638, 780, 735, 538, 253, -47, -301, -471, -540, -511, -399, -231, -33, 163, 327, 433, 462, 408, 278, 94, -110, -294, -423, -468, -418, -282, -87, 125, 311, 428, 452, 380, 230, 38, -154, -307, -391, -394, -320, -185, -19, 145, 277, 353, 359, 295, 172, 14, -149, -283, -358, -356, -279, -138, 35, 200, 319, 369, 341, 234, 70, -115, -281, -394, -415, -318, -116, 134, 359, 485, 449, + 237, -76, -352, -482, -413, -151, 199, 425, 349, 43, -207, -208, -50, 53, 38, -1, 4, 20, 13, 0, 3, 5, -5, -13, -10, -7, -10, -9, -1, 5, 6, 8, 13, 13, 8, 4, 1, -4, -9, -12, -11, -10, -8, -3, 2, 6, 10, 12 }, + {8934, 9213, 9570, 10255, 11619, 13087, 13559, 12961, 12322, 12086, 11499, 10151, 8956, 8860, 9465, 9803, 9788, 9992, 10439, 10603, 10403, 10349, 10654, 10887, 10629, 10008, 9438, 9152, 9123, 9188, 9188, 9130, 9251, 9778, 10629, 11476, 12088, 12484, 12765, 12959, 13061, 13125, 13233, 13439, 13739, 14098, 14472, 14830, 15153, 15406, 15537, 15508, 15324, 15018, 14620, 14167, 13711, 13298, 12936, 12604, 12270, 11900, 11448, 10859, 10102, 9185, 8151, 7055, 5961, 4941, 4063, 3358, 2831, 2485, 2328, 2359, 2550, 2869, 3297, 3826, 4450, 5156, 5928, 6744, 7580, 8406, 9194, 9928, 10623, 11312, 12015, 12721, 13416, 14092, 14721, 15240, + 15581, 15702, 15579, 15177, 14456, 13419, 12123, 10629, 8983, 7243, 5501, 3835, 2273, 810, -537, -1747, -2833, -3832, -4758, -5588, -6304, -6915, -7423, -7809, -8055, -8178, -8210, -8166, -8048, -7867, -7644, -7391, -7100, -6762, -6388, -5999, -5609, -5222, -4848, -4505, -4210, -3970, -3789, -3677, -3658, -3752, -3971, -4319, -4806, -5444, -6222, -7107, -8061, -9056, -10058, -11009, -11851, -12559, -13123, -13521, -13728, -13748, -13607, -13313, -12864, -12275, -11583, -10819, -9997, -9139, -8279, -7451, -6672, -5954, -5307, -4748, -4286, -3915, -3618, -3392, -3240, -3149, -3088, -3047, -3036, -3040, -3012, -2927, -2786, -2550, -2145, -1544, -765, 202, 1379, 2694, + 4010, 5240, 6310, 7026, 7168, 6675, 5531, 3549, 737, -2066, -3476, -2894, -1246, -11, 254, 63, -17, 29, 18, -26, -11, 22, 6, -18, -3, 16, 1, -13, 0, 10, -2, -9, 1, 6, -3, -6, 2, 4, -2, -3, 2, 2, -2, -1, 2, 1, -1, 1 } + }, + { + {9113, 9104, 8999, 8734, 8338, 7832, 7170, 6505, 6418, 7477, 9457, 11389, 12484, 12666, 12171, 11192, 10076, 9329, 9137, 9283, 9679, 10497, 11617, 12473, 12677, 12384, 11894, 11369, 11032, 11190, 11838, 12640, 13410, 14237, 15084, 15656, 15778, 15589, 15277, 14894, 14486, 14138, 13850, 13539, 13201, 12901, 12657, 12447, 12289, 12182, 12057, 11873, 11689, 11567, 11478, 11373, 11252, 11110, 10905, 10623, 10304, 9993, 9696, 9408, 9128, 8837, 8504, 8098, 7596, 6986, 6294, 5555, 4782, 3974, 3168, 2409, 1703, 1029, 398, -152, -611, -985, -1266, -1440, -1528, -1568, -1583, -1580, -1567, -1563, -1578, -1619, -1677, -1736, -1787, -1835, + -1881, -1917, -1944, -1979, -2030, -2087, -2140, -2193, -2246, -2280, -2282, -2249, -2183, -2081, -1942, -1771, -1575, -1360, -1134, -901, -660, -417, -177, 58, 295, 538, 784, 1035, 1298, 1577, 1873, 2185, 2512, 2849, 3188, 3519, 3823, 4081, 4283, 4426, 4501, 4496, 4415, 4270, 4067, 3800, 3477, 3117, 2736, 2332, 1906, 1470, 1038, 604, 155, -312, -790, -1279, -1797, -2356, -2949, -3568, -4225, -4930, -5679, -6454, -7253, -8084, -8949, -9825, -10691, -11546, -12394, -13206, -13943, -14594, -15167, -15633, -15940, -16071, -16041, -15827, -15375, -14674, -13752, -12592, -11145, -9421, -7467, -5272, -2808, -147, 2587, 5326, 7988, 10356, + 12195, 13405, 13877, 13356, 11702, 9074, 5595, 1233, -3398, -6510, -6434, -3631, -563, 766, 524, 48, -8, 64, 2, -50, 6, 39, -9, -30, 11, 24, -10, -18, 10, 14, -10, -11, 8, 8, -8, -7, 6, 4, -6, -3, 5, 2, -4, -1, 3, 0, -2, 1 }, + {8844, 8178, 6966, 5177, 2927, 1013, 500, 1584, 3249, 4122, 3411, 1230, -1470, -3400, -3912, -3519, -3191, -3341, -3835, -4623, -5719, -6731, -7049, -6575, -5826, -5297, -5053, -4922, -4740, -4354, -3641, -2618, -1429, -238, 803, 1576, 2096, 2533, 3044, 3632, 4208, 4696, 5057, 5286, 5418, 5496, 5513, 5437, 5265, 5019, 4699, 4289, 3788, 3187, 2465, 1629, 732, -179, -1085, -1966, -2785, -3515, -4150, -4676, -5079, -5366, -5556, -5648, -5612, -5427, -5095, -4630, -4058, -3416, -2735, -2027, -1295, -549, 189, 898, 1557, 2151, 2668, 3088, 3397, 3587, 3668, 3651, 3547, 3378, 3160, 2899, 2600, 2280, 1957, 1636, + 1321, 1021, 747, 500, 280, 94, -56, -177, -280, -370, -451, -533, -621, -720, -832, -959, -1103, -1268, -1454, -1656, -1865, -2073, -2271, -2444, -2578, -2667, -2707, -2686, -2596, -2437, -2208, -1906, -1531, -1094, -607, -74, 499, 1098, 1705, 2311, 2902, 3454, 3946, 4360, 4682, 4889, 4956, 4868, 4621, 4206, 3622, 2881, 2011, 1041, 2, -1063, -2100, -3064, -3920, -4633, -5170, -5511, -5655, -5601, -5351, -4919, -4333, -3619, -2799, -1899, -956, 0, 943, 1841, 2659, 3365, 3937, 4352, 4592, 4648, 4515, 4200, 3714, 3076, 2311, 1449, 532, -399, -1309, -2149, -2855, -3378, -3680, -3715, -3441, -2867, + -2053, -1056, 52, 1121, 1965, 2475, 2575, 2121, 1058, -244, -1085, -1060, -489, -21, 64, -29, -58, -31, -36, -58, -49, -30, -36, -45, -34, -22, -25, -27, -17, -7, -8, -7, 3, 10, 11, 14, 22, 27, 28, 32, 37, 41, 42, 44, 47, 49, 49, 50 } + }, + { + {8844, 8178, 6966, 5177, 2927, 1013, 500, 1584, 3249, 4122, 3411, 1230, -1470, -3400, -3912, -3519, -3191, -3341, -3835, -4623, -5719, -6731, -7049, -6575, -5826, -5297, -5053, -4922, -4740, -4354, -3641, -2618, -1429, -238, 803, 1576, 2096, 2533, 3044, 3632, 4208, 4696, 5057, 5286, 5418, 5496, 5513, 5437, 5265, 5019, 4699, 4289, 3788, 3187, 2465, 1629, 732, -179, -1085, -1966, -2785, -3515, -4150, -4676, -5079, -5366, -5556, -5648, -5612, -5427, -5095, -4630, -4058, -3416, -2735, -2027, -1295, -549, 189, 898, 1557, 2151, 2668, 3088, 3397, 3587, 3668, 3651, 3547, 3378, 3160, 2899, 2600, 2280, 1957, 1636, + 1321, 1021, 747, 500, 280, 94, -56, -177, -280, -370, -451, -533, -621, -720, -832, -959, -1103, -1268, -1454, -1656, -1865, -2073, -2271, -2444, -2578, -2667, -2707, -2686, -2596, -2437, -2208, -1906, -1531, -1094, -607, -74, 499, 1098, 1705, 2311, 2902, 3454, 3946, 4360, 4682, 4889, 4956, 4868, 4621, 4206, 3622, 2881, 2011, 1041, 2, -1063, -2100, -3064, -3920, -4633, -5170, -5511, -5655, -5601, -5351, -4919, -4333, -3619, -2799, -1899, -956, 0, 943, 1841, 2659, 3365, 3937, 4352, 4592, 4648, 4515, 4200, 3714, 3076, 2311, 1449, 532, -399, -1309, -2149, -2855, -3378, -3680, -3715, -3441, -2867, + -2053, -1056, 52, 1121, 1965, 2475, 2575, 2121, 1058, -244, -1085, -1060, -489, -21, 64, -29, -58, -31, -36, -58, -49, -30, -36, -45, -34, -22, -25, -27, -17, -7, -8, -7, 3, 10, 11, 14, 22, 27, 28, 32, 37, 41, 42, 44, 47, 49, 49, 50 }, + {9113, 9104, 8999, 8734, 8338, 7832, 7170, 6505, 6418, 7477, 9457, 11389, 12484, 12666, 12171, 11192, 10076, 9329, 9137, 9283, 9679, 10497, 11617, 12473, 12677, 12384, 11894, 11369, 11032, 11190, 11838, 12640, 13410, 14237, 15084, 15656, 15778, 15589, 15277, 14894, 14486, 14138, 13850, 13539, 13201, 12901, 12657, 12447, 12289, 12182, 12057, 11873, 11689, 11567, 11478, 11373, 11252, 11110, 10905, 10623, 10304, 9993, 9696, 9408, 9128, 8837, 8504, 8098, 7596, 6986, 6294, 5555, 4782, 3974, 3168, 2409, 1703, 1029, 398, -152, -611, -985, -1266, -1440, -1528, -1568, -1583, -1580, -1567, -1563, -1578, -1619, -1677, -1736, -1787, -1835, + -1881, -1917, -1944, -1979, -2030, -2087, -2140, -2193, -2246, -2280, -2282, -2249, -2183, -2081, -1942, -1771, -1575, -1360, -1134, -901, -660, -417, -177, 58, 295, 538, 784, 1035, 1298, 1577, 1873, 2185, 2512, 2849, 3188, 3519, 3823, 4081, 4283, 4426, 4501, 4496, 4415, 4270, 4067, 3800, 3477, 3117, 2736, 2332, 1906, 1470, 1038, 604, 155, -312, -790, -1279, -1797, -2356, -2949, -3568, -4225, -4930, -5679, -6454, -7253, -8084, -8949, -9825, -10691, -11546, -12394, -13206, -13943, -14594, -15167, -15633, -15940, -16071, -16041, -15827, -15375, -14674, -13752, -12592, -11145, -9421, -7467, -5272, -2808, -147, 2587, 5326, 7988, 10356, + 12195, 13405, 13877, 13356, 11702, 9074, 5595, 1233, -3398, -6510, -6434, -3631, -563, 766, 524, 48, -8, 64, 2, -50, 6, 39, -9, -30, 11, 24, -10, -18, 10, 14, -10, -11, 8, 8, -8, -7, 6, 4, -6, -3, 5, 2, -4, -1, 3, 0, -2, 1 } + }, + { + {8808, 8800, 8996, 9678, 10665, 11119, 10450, 9244, 8616, 8771, 8982, 8932, 9179, 10098, 11186, 11791, 11910, 11869, 11683, 11172, 10407, 9661, 9055, 8526, 8030, 7593, 7228, 6904, 6579, 6227, 5878, 5611, 5476, 5416, 5333, 5204, 5083, 5036, 5102, 5290, 5568, 5883, 6210, 6555, 6914, 7262, 7575, 7840, 8035, 8135, 8144, 8099, 8051, 8046, 8119, 8278, 8508, 8786, 9083, 9347, 9528, 9609, 9594, 9483, 9273, 8996, 8694, 8386, 8067, 7737, 7402, 7056, 6679, 6262, 5812, 5344, 4866, 4391, 3941, 3544, 3212, 2937, 2697, 2480, 2280, 2089, 1898, 1721, 1593, 1539, 1569, 1686, 1894, 2191, 2565, 3007, + 3513, 4076, 4688, 5333, 5980, 6592, 7146, 7625, 8007, 8270, 8411, 8442, 8366, 8172, 7863, 7461, 6985, 6439, 5827, 5176, 4514, 3854, 3193, 2539, 1909, 1308, 723, 138, -443, -1012, -1576, -2150, -2729, -3290, -3818, -4318, -4785, -5196, -5532, -5800, -6010, -6160, -6246, -6280, -6283, -6270, -6244, -6210, -6182, -6176, -6196, -6238, -6299, -6391, -6520, -6675, -6845, -7031, -7243, -7471, -7701, -7928, -8161, -8398, -8627, -8838, -9034, -9220, -9385, -9516, -9605, -9658, -9670, -9625, -9511, -9333, -9096, -8787, -8387, -7898, -7334, -6684, -5929, -5080, -4164, -3178, -2112, -985, 167, 1338, 2522, 3672, 4722, 5645, 6407, 6928, + 7138, 7031, 6594, 5768, 4555, 3063, 1369, -503, -2253, -3188, -2798, -1449, -174, 323, 207, 24, 3, 24, -3, -18, 5, 14, -5, -10, 6, 8, -5, -6, 5, 5, -4, -4, 4, 3, -4, -2, 3, 1, -3, -1, 2, 1, -2, 0, 2, 0, -1, 1 }, + {7866, 6683, 4355, 1329, -1458, -3166, -3760, -3964, -4429, -5033, -5099, -4231, -2741, -1246, -39, 1047, 2227, 3405, 4239, 4458, 4080, 3345, 2501, 1634, 688, -384, -1501, -2497, -3238, -3656, -3698, -3332, -2600, -1640, -620, 339, 1168, 1813, 2235, 2429, 2425, 2264, 1987, 1625, 1201, 726, 210, -328, -868, -1386, -1850, -2209, -2407, -2393, -2150, -1694, -1071, -337, 449, 1221, 1904, 2421, 2706, 2725, 2476, 1985, 1300, 481, -401, -1265, -2016, -2551, -2783, -2670, -2231, -1545, -732, 74, 762, 1263, 1560, 1677, 1654, 1527, 1325, 1063, 752, 401, 23, -356, -703, -979, -1155, -1219, -1176, -1045, + -849, -611, -351, -85, 175, 418, 632, 807, 930, 991, 979, 891, 728, 499, 220, -84, -384, -653, -862, -990, -1026, -968, -825, -613, -353, -69, 216, 481, 703, 863, 945, 939, 839, 654, 402, 115, -173, -426, -615, -724, -749, -699, -588, -439, -273, -107, 45, 175, 278, 353, 402, 424, 422, 397, 349, 281, 194, 93, -18, -130, -235, -325, -391, -427, -429, -395, -326, -228, -108, 25, 156, 276, 372, 437, 463, 450, 397, 307, 185, 41, -114, -270, -411, -520, -581, -581, -507, -351, -126, 139, 409, 637, 765, 750, 586, 301, + -57, -409, -656, -723, -599, -321, 53, 399, 534, 369, 45, -177, -175, -61, 6, 1, -11, 1, 10, 6, 6, 15, 18, 14, 12, 15, 13, 6, 3, 1, -3, -9, -12, -13, -15, -17, -16, -14, -12, -10, -6, -1, 3, 7, 10, 13, 15, 16 } + }, + { + {7866, 6683, 4355, 1329, -1458, -3166, -3760, -3964, -4429, -5033, -5099, -4231, -2741, -1246, -39, 1047, 2227, 3405, 4239, 4458, 4080, 3345, 2501, 1634, 688, -384, -1501, -2497, -3238, -3656, -3698, -3332, -2600, -1640, -620, 339, 1168, 1813, 2235, 2429, 2425, 2264, 1987, 1625, 1201, 726, 210, -328, -868, -1386, -1850, -2209, -2407, -2393, -2150, -1694, -1071, -337, 449, 1221, 1904, 2421, 2706, 2725, 2476, 1985, 1300, 481, -401, -1265, -2016, -2551, -2783, -2670, -2231, -1545, -732, 74, 762, 1263, 1560, 1677, 1654, 1527, 1325, 1063, 752, 401, 23, -356, -703, -979, -1155, -1219, -1176, -1045, + -849, -611, -351, -85, 175, 418, 632, 807, 930, 991, 979, 891, 728, 499, 220, -84, -384, -653, -862, -990, -1026, -968, -825, -613, -353, -69, 216, 481, 703, 863, 945, 939, 839, 654, 402, 115, -173, -426, -615, -724, -749, -699, -588, -439, -273, -107, 45, 175, 278, 353, 402, 424, 422, 397, 349, 281, 194, 93, -18, -130, -235, -325, -391, -427, -429, -395, -326, -228, -108, 25, 156, 276, 372, 437, 463, 450, 397, 307, 185, 41, -114, -270, -411, -520, -581, -581, -507, -351, -126, 139, 409, 637, 765, 750, 586, 301, + -57, -409, -656, -723, -599, -321, 53, 399, 534, 369, 45, -177, -175, -61, 6, 1, -11, 1, 10, 6, 6, 15, 18, 14, 12, 15, 13, 6, 3, 1, -3, -9, -12, -13, -15, -17, -16, -14, -12, -10, -6, -1, 3, 7, 10, 13, 15, 16 }, + {8808, 8800, 8996, 9678, 10665, 11119, 10450, 9244, 8616, 8771, 8982, 8932, 9179, 10098, 11186, 11791, 11910, 11869, 11683, 11172, 10407, 9661, 9055, 8526, 8030, 7593, 7228, 6904, 6579, 6227, 5878, 5611, 5476, 5416, 5333, 5204, 5083, 5036, 5102, 5290, 5568, 5883, 6210, 6555, 6914, 7262, 7575, 7840, 8035, 8135, 8144, 8099, 8051, 8046, 8119, 8278, 8508, 8786, 9083, 9347, 9528, 9609, 9594, 9483, 9273, 8996, 8694, 8386, 8067, 7737, 7402, 7056, 6679, 6262, 5812, 5344, 4866, 4391, 3941, 3544, 3212, 2937, 2697, 2480, 2280, 2089, 1898, 1721, 1593, 1539, 1569, 1686, 1894, 2191, 2565, 3007, + 3513, 4076, 4688, 5333, 5980, 6592, 7146, 7625, 8007, 8270, 8411, 8442, 8366, 8172, 7863, 7461, 6985, 6439, 5827, 5176, 4514, 3854, 3193, 2539, 1909, 1308, 723, 138, -443, -1012, -1576, -2150, -2729, -3290, -3818, -4318, -4785, -5196, -5532, -5800, -6010, -6160, -6246, -6280, -6283, -6270, -6244, -6210, -6182, -6176, -6196, -6238, -6299, -6391, -6520, -6675, -6845, -7031, -7243, -7471, -7701, -7928, -8161, -8398, -8627, -8838, -9034, -9220, -9385, -9516, -9605, -9658, -9670, -9625, -9511, -9333, -9096, -8787, -8387, -7898, -7334, -6684, -5929, -5080, -4164, -3178, -2112, -985, 167, 1338, 2522, 3672, 4722, 5645, 6407, 6928, + 7138, 7031, 6594, 5768, 4555, 3063, 1369, -503, -2253, -3188, -2798, -1449, -174, 323, 207, 24, 3, 24, -3, -18, 5, 14, -5, -10, 6, 8, -5, -6, 5, 5, -4, -4, 4, 3, -4, -2, 3, 1, -3, -1, 2, 1, -2, 0, 2, 0, -1, 1 } + }, + { + {8365, 8314, 8491, 9089, 9865, 10274, 10020, 9361, 8750, 8328, 7995, 7823, 8058, 8713, 9446, 9937, 10141, 10109, 9798, 9218, 8578, 8112, 7837, 7591, 7271, 6895, 6505, 6101, 5681, 5265, 4856, 4434, 3987, 3529, 3086, 2694, 2406, 2278, 2326, 2511, 2770, 3065, 3379, 3689, 3961, 4176, 4342, 4476, 4593, 4703, 4825, 4969, 5142, 5336, 5532, 5703, 5825, 5886, 5875, 5785, 5624, 5416, 5184, 4926, 4632, 4299, 3928, 3513, 3058, 2588, 2140, 1751, 1442, 1226, 1105, 1059, 1062, 1082, 1101, 1115, 1125, 1139, 1162, 1202, 1267, 1359, 1480, 1633, 1820, 2047, 2315, 2627, 2985, 3394, 3854, 4357, + 4887, 5421, 5943, 6428, 6848, 7181, 7424, 7588, 7675, 7681, 7611, 7478, 7281, 7002, 6637, 6197, 5695, 5135, 4522, 3880, 3235, 2600, 1975, 1369, 801, 282, -196, -644, -1057, -1435, -1792, -2147, -2503, -2849, -3179, -3493, -3784, -4030, -4215, -4345, -4426, -4461, -4448, -4396, -4321, -4233, -4136, -4035, -3942, -3870, -3825, -3807, -3819, -3869, -3964, -4098, -4263, -4459, -4689, -4947, -5218, -5496, -5782, -6075, -6362, -6632, -6884, -7118, -7325, -7490, -7607, -7679, -7704, -7670, -7568, -7402, -7179, -6888, -6520, -6081, -5584, -5027, -4398, -3706, -2970, -2190, -1362, -502, 363, 1222, 2069, 2868, 3576, 4173, 4637, 4923, + 4992, 4843, 4478, 3871, 3032, 2035, 929, -265, -1372, -1979, -1776, -970, -179, 157, 117, 17, 3, 14, -1, -10, 3, 8, -3, -6, 3, 5, -3, -4, 3, 3, -3, -2, 2, 2, -2, -1, 2, 1, -2, -1, 1, 0, -1, 0, 1, 0, 0, 1 }, + {7642, 7014, 5574, 3413, 1214, -195, -715, -1103, -2007, -3159, -3867, -4035, -4195, -4640, -5052, -5042, -4588, -3816, -2755, -1486, -261, 735, 1570, 2367, 3094, 3650, 4028, 4274, 4376, 4267, 3896, 3263, 2427, 1501, 593, -257, -1053, -1765, -2317, -2663, -2816, -2820, -2728, -2591, -2444, -2295, -2147, -1997, -1822, -1569, -1186, -653, 13, 758, 1503, 2165, 2698, 3095, 3363, 3498, 3485, 3304, 2937, 2382, 1666, 844, -15, -851, -1617, -2282, -2834, -3260, -3535, -3622, -3490, -3133, -2578, -1885, -1132, -392, 285, 873, 1363, 1750, 2036, 2229, 2338, 2367, 2324, 2216, 2051, 1828, 1549, 1212, 817, 363, + -139, -663, -1177, -1649, -2047, -2340, -2510, -2548, -2452, -2225, -1881, -1441, -932, -382, 179, 715, 1198, 1602, 1906, 2096, 2165, 2120, 1969, 1724, 1405, 1034, 633, 219, -187, -561, -887, -1149, -1333, -1429, -1438, -1371, -1239, -1060, -855, -643, -439, -250, -82, 66, 196, 315, 426, 531, 631, 726, 810, 874, 910, 913, 873, 786, 653, 479, 269, 36, -206, -442, -656, -836, -969, -1045, -1061, -1016, -914, -762, -570, -349, -114, 123, 348, 551, 718, 845, 924, 949, 920, 840, 711, 535, 319, 75, -184, -445, -687, -879, -997, -1024, -943, -745, -448, -93, + 273, 604, 837, 914, 821, 582, 227, -185, -510, -573, -353, -45, 118, 97, 20, -6, 4, 4, -4, -2, 5, 3, -2, 1, 5, 3, 0, 2, 4, 3, 1, 2, 3, 2, 0, 1, 1, 0, -1, -1, -1, -2, -2, -2, -2, -3, -3, -3 } + }, + { + {7642, 7014, 5574, 3413, 1214, -195, -715, -1103, -2007, -3159, -3867, -4035, -4195, -4640, -5052, -5042, -4588, -3816, -2755, -1486, -261, 735, 1570, 2367, 3094, 3650, 4028, 4274, 4376, 4267, 3896, 3263, 2427, 1501, 593, -257, -1053, -1765, -2317, -2663, -2816, -2820, -2728, -2591, -2444, -2295, -2147, -1997, -1822, -1569, -1186, -653, 13, 758, 1503, 2165, 2698, 3095, 3363, 3498, 3485, 3304, 2937, 2382, 1666, 844, -15, -851, -1617, -2282, -2834, -3260, -3535, -3622, -3490, -3133, -2578, -1885, -1132, -392, 285, 873, 1363, 1750, 2036, 2229, 2338, 2367, 2324, 2216, 2051, 1828, 1549, 1212, 817, 363, + -139, -663, -1177, -1649, -2047, -2340, -2510, -2548, -2452, -2225, -1881, -1441, -932, -382, 179, 715, 1198, 1602, 1906, 2096, 2165, 2120, 1969, 1724, 1405, 1034, 633, 219, -187, -561, -887, -1149, -1333, -1429, -1438, -1371, -1239, -1060, -855, -643, -439, -250, -82, 66, 196, 315, 426, 531, 631, 726, 810, 874, 910, 913, 873, 786, 653, 479, 269, 36, -206, -442, -656, -836, -969, -1045, -1061, -1016, -914, -762, -570, -349, -114, 123, 348, 551, 718, 845, 924, 949, 920, 840, 711, 535, 319, 75, -184, -445, -687, -879, -997, -1024, -943, -745, -448, -93, + 273, 604, 837, 914, 821, 582, 227, -185, -510, -573, -353, -45, 118, 97, 20, -6, 4, 4, -4, -2, 5, 3, -2, 1, 5, 3, 0, 2, 4, 3, 1, 2, 3, 2, 0, 1, 1, 0, -1, -1, -1, -2, -2, -2, -2, -3, -3, -3 }, + {8365, 8314, 8491, 9089, 9865, 10274, 10020, 9361, 8750, 8328, 7995, 7823, 8058, 8713, 9446, 9937, 10141, 10109, 9798, 9218, 8578, 8112, 7837, 7591, 7271, 6895, 6505, 6101, 5681, 5265, 4856, 4434, 3987, 3529, 3086, 2694, 2406, 2278, 2326, 2511, 2770, 3065, 3379, 3689, 3961, 4176, 4342, 4476, 4593, 4703, 4825, 4969, 5142, 5336, 5532, 5703, 5825, 5886, 5875, 5785, 5624, 5416, 5184, 4926, 4632, 4299, 3928, 3513, 3058, 2588, 2140, 1751, 1442, 1226, 1105, 1059, 1062, 1082, 1101, 1115, 1125, 1139, 1162, 1202, 1267, 1359, 1480, 1633, 1820, 2047, 2315, 2627, 2985, 3394, 3854, 4357, + 4887, 5421, 5943, 6428, 6848, 7181, 7424, 7588, 7675, 7681, 7611, 7478, 7281, 7002, 6637, 6197, 5695, 5135, 4522, 3880, 3235, 2600, 1975, 1369, 801, 282, -196, -644, -1057, -1435, -1792, -2147, -2503, -2849, -3179, -3493, -3784, -4030, -4215, -4345, -4426, -4461, -4448, -4396, -4321, -4233, -4136, -4035, -3942, -3870, -3825, -3807, -3819, -3869, -3964, -4098, -4263, -4459, -4689, -4947, -5218, -5496, -5782, -6075, -6362, -6632, -6884, -7118, -7325, -7490, -7607, -7679, -7704, -7670, -7568, -7402, -7179, -6888, -6520, -6081, -5584, -5027, -4398, -3706, -2970, -2190, -1362, -502, 363, 1222, 2069, 2868, 3576, 4173, 4637, 4923, + 4992, 4843, 4478, 3871, 3032, 2035, 929, -265, -1372, -1979, -1776, -970, -179, 157, 117, 17, 3, 14, -1, -10, 3, 8, -3, -6, 3, 5, -3, -4, 3, 3, -3, -2, 2, 2, -2, -1, 2, 1, -2, -1, 1, 0, -1, 0, 1, 0, 0, 1 } + } +}; +const Word16 CRendBin_Combined_HRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {178, 510, 733, 655, 163, -364, -316, 117, -52, -931, -943, 1158, 4167, 5703, 5232, 4349, 4204, 4188, 3384, 1910, 277, -1460, -3229, -4362, -4229, -3057, -1633, -446, 530, 1436, 2219, 2643, 2436, 1482, -42, -1753, -3328, -4661, -5808, -6836, -7720, -8357, -8674, -8739, -8722, -8772, -8949, -9261, -9670, -10079, -10381, -10539, -10586, -10570, -10525, -10476, -10443, -10452, -10535, -10713, -10970, -11275, -11621, -11996, -12338, -12547, -12541, -12287, -11797, -11124, -10363, -9603, -8897, -8277, -7767, -7377, -7092, -6876, -6691, -6504, -6298, -6073, -5831, -5567, -5289, -5019, -4777, -4567, -4404, -4316, -4324, -4426, -4609, -4860, -5159, -5484, + -5804, -6094, -6332, -6507, -6615, -6650, -6612, -6519, -6384, -6207, -5977, -5702, -5398, -5071, -4722, -4366, -4020, -3694, -3388, -3105, -2847, -2616, -2417, -2258, -2140, -2067, -2056, -2128, -2288, -2535, -2893, -3393, -4047, -4850, -5815, -6971, -8324, -9851, -11523, -13323, -15225, -17166, -19066, -20869, -22547, -24067, -25369, -26420, -27240, -27855, -28251, -28409, -28367, -28181, -27857, -27373, -26749, -26043, -25267, -24389, -23404, -22347, -21231, -20025, -18700, -17270, -15753, -14138, -12400, -10541, -8600, -6608, -4565, -2473, -380, 1654, 3631, 5579, 7473, 9262, 10963, 12631, 14253, 15767, 17182, 18544, 19804, 20853, 21662, 22219, 22392, 22007, 21013, 19394, 17024, 13829, + 9968, 5646, 945, -3893, -8287, -11736, -13997, -14438, -11899, -6274, 64, 3720, 3527, 1458, 49, -108, 67, 4, -72, 9, 56, -15, -44, 16, 34, -16, -26, 16, 21, -14, -16, 13, 13, -12, -10, 10, 7, -10, -5, 8, 2, -7, -2, 5, -1, -5, 2, 3 }, + {-658, -2552, -4977, -6488, -6562, -6232, -6055, -5295, -3665, -2299, -2289, -3468, -5101, -6589, -7109, -5826, -3068, -303, 1532, 2781, 3883, 4511, 4403, 4119, 4294, 4808, 5279, 5778, 6474, 7004, 6833, 5978, 4861, 3580, 1836, -397, -2559, -4027, -4720, -5019, -5247, -5448, -5571, -5633, -5623, -5427, -4964, -4295, -3522, -2668, -1726, -747, 191, 1046, 1803, 2440, 2961, 3399, 3764, 4018, 4129, 4082, 3865, 3473, 2952, 2389, 1846, 1344, 894, 514, 209, -34, -237, -424, -623, -857, -1132, -1442, -1766, -2063, -2305, -2490, -2635, -2756, -2865, -2953, -2982, -2887, -2618, -2162, -1537, -781, 40, 840, 1539, 2076, + 2415, 2554, 2538, 2434, 2300, 2185, 2130, 2163, 2285, 2483, 2736, 3007, 3230, 3319, 3192, 2782, 2050, 997, -324, -1819, -3377, -4876, -6195, -7223, -7874, -8091, -7840, -7117, -5951, -4413, -2602, -637, 1350, 3223, 4864, 6192, 7156, 7728, 7909, 7729, 7223, 6421, 5360, 4089, 2662, 1128, -449, -1988, -3407, -4636, -5599, -6230, -6489, -6374, -5903, -5116, -4084, -2903, -1666, -455, 651, 1587, 2318, 2834, 3138, 3244, 3185, 2999, 2716, 2365, 1977, 1578, 1181, 796, 432, 91, -224, -512, -767, -988, -1173, -1316, -1414, -1466, -1469, -1418, -1309, -1143, -915, -622, -281, 89, 470, 835, 1136, 1327, + 1389, 1308, 1062, 667, 189, -295, -727, -1003, -960, -553, -8, 327, 314, 130, 13, 10, 30, 21, 11, 18, 21, 11, 4, 8, 7, -2, -7, -5, -7, -15, -18, -16, -18, -23, -24, -22, -23, -25, -24, -21, -21, -20, -17, -13, -12, -9, -5, -1 } + }, + { + {-658, -2552, -4977, -6488, -6562, -6232, -6055, -5295, -3665, -2299, -2289, -3468, -5101, -6589, -7109, -5826, -3068, -303, 1532, 2781, 3883, 4511, 4403, 4119, 4294, 4808, 5279, 5778, 6474, 7004, 6833, 5978, 4861, 3580, 1836, -397, -2559, -4027, -4720, -5019, -5247, -5448, -5571, -5633, -5623, -5427, -4964, -4295, -3522, -2668, -1726, -747, 191, 1046, 1803, 2440, 2961, 3399, 3764, 4018, 4129, 4082, 3865, 3473, 2952, 2389, 1846, 1344, 894, 514, 209, -34, -237, -424, -623, -857, -1132, -1442, -1766, -2063, -2305, -2490, -2635, -2756, -2865, -2953, -2982, -2887, -2618, -2162, -1537, -781, 40, 840, 1539, 2076, + 2415, 2554, 2538, 2434, 2300, 2185, 2130, 2163, 2285, 2483, 2736, 3007, 3230, 3319, 3192, 2782, 2050, 997, -324, -1819, -3377, -4876, -6195, -7223, -7874, -8091, -7840, -7117, -5951, -4413, -2602, -637, 1350, 3223, 4864, 6192, 7156, 7728, 7909, 7729, 7223, 6421, 5360, 4089, 2662, 1128, -449, -1988, -3407, -4636, -5599, -6230, -6489, -6374, -5903, -5116, -4084, -2903, -1666, -455, 651, 1587, 2318, 2834, 3138, 3244, 3185, 2999, 2716, 2365, 1977, 1578, 1181, 796, 432, 91, -224, -512, -767, -988, -1173, -1316, -1414, -1466, -1469, -1418, -1309, -1143, -915, -622, -281, 89, 470, 835, 1136, 1327, + 1389, 1308, 1062, 667, 189, -295, -727, -1003, -960, -553, -8, 327, 314, 130, 13, 10, 30, 21, 11, 18, 21, 11, 4, 8, 7, -2, -7, -5, -7, -15, -18, -16, -18, -23, -24, -22, -23, -25, -24, -21, -21, -20, -17, -13, -12, -9, -5, -1 }, + {178, 510, 733, 655, 163, -364, -316, 117, -52, -931, -943, 1158, 4167, 5703, 5232, 4349, 4204, 4188, 3384, 1910, 277, -1460, -3229, -4362, -4229, -3057, -1633, -446, 530, 1436, 2219, 2643, 2436, 1482, -42, -1753, -3328, -4661, -5808, -6836, -7720, -8357, -8674, -8739, -8722, -8772, -8949, -9261, -9670, -10079, -10381, -10539, -10586, -10570, -10525, -10476, -10443, -10452, -10535, -10713, -10970, -11275, -11621, -11996, -12338, -12547, -12541, -12287, -11797, -11124, -10363, -9603, -8897, -8277, -7767, -7377, -7092, -6876, -6691, -6504, -6298, -6073, -5831, -5567, -5289, -5019, -4777, -4567, -4404, -4316, -4324, -4426, -4609, -4860, -5159, -5484, + -5804, -6094, -6332, -6507, -6615, -6650, -6612, -6519, -6384, -6207, -5977, -5702, -5398, -5071, -4722, -4366, -4020, -3694, -3388, -3105, -2847, -2616, -2417, -2258, -2140, -2067, -2056, -2128, -2288, -2535, -2893, -3393, -4047, -4850, -5815, -6971, -8324, -9851, -11523, -13323, -15225, -17166, -19066, -20869, -22547, -24067, -25369, -26420, -27240, -27855, -28251, -28409, -28367, -28181, -27857, -27373, -26749, -26043, -25267, -24389, -23404, -22347, -21231, -20025, -18700, -17270, -15753, -14138, -12400, -10541, -8600, -6608, -4565, -2473, -380, 1654, 3631, 5579, 7473, 9262, 10963, 12631, 14253, 15767, 17182, 18544, 19804, 20853, 21662, 22219, 22392, 22007, 21013, 19394, 17024, 13829, + 9968, 5646, 945, -3893, -8287, -11736, -13997, -14438, -11899, -6274, 64, 3720, 3527, 1458, 49, -108, 67, 4, -72, 9, 56, -15, -44, 16, 34, -16, -26, 16, 21, -14, -16, 13, 13, -12, -10, 10, 7, -10, -5, 8, 2, -7, -2, 5, -1, -5, 2, 3 } + }, + { + {171, 178, -611, -1796, -2056, -881, 86, -960, -2868, -2453, 1090, 4681, 5206, 3255, 1754, 2056, 2881, 2534, 789, -1399, -3019, -3613, -3308, -2562, -1750, -974, -271, 158, 55, -691, -2001, -3621, -5178, -6376, -7209, -7832, -8244, -8251, -7770, -6999, -6270, -5828, -5773, -6064, -6535, -6993, -7353, -7655, -7945, -8187, -8314, -8302, -8189, -8038, -7888, -7740, -7593, -7457, -7332, -7182, -6969, -6703, -6429, -6169, -5904, -5612, -5302, -5002, -4725, -4458, -4187, -3908, -3638, -3399, -3201, -3041, -2910, -2802, -2712, -2642, -2601, -2592, -2606, -2629, -2661, -2712, -2797, -2924, -3089, -3292, -3537, -3821, -4123, -4407, -4637, -4781, + -4810, -4713, -4502, -4205, -3846, -3437, -2998, -2553, -2128, -1739, -1398, -1119, -932, -874, -975, -1248, -1707, -2359, -3199, -4197, -5318, -6546, -7865, -9239, -10628, -12022, -13424, -14820, -16171, -17452, -18659, -19768, -20724, -21490, -22075, -22495, -22740, -22793, -22678, -22444, -22107, -21658, -21100, -20464, -19761, -18962, -18041, -17007, -15872, -14615, -13208, -11665, -10024, -8303, -6503, -4651, -2807, -1022, 687, 2298, 3768, 5056, 6154, 7067, 7784, 8285, 8580, 8698, 8660, 8479, 8180, 7808, 7398, 6970, 6539, 6128, 5759, 5439, 5162, 4924, 4727, 4569, 4436, 4315, 4202, 4098, 3998, 3888, 3763, 3622, 3454, 3237, 2964, 2639, 2258, 1808, + 1303, 767, 213, -355, -899, -1369, -1750, -2007, -1996, -1562, -787, -45, 311, 271, 102, 14, 8, 6, -5, -4, 4, 2, -4, -1, 4, 1, -3, 0, 3, 0, -2, 0, 2, 0, -2, 0, 1, -1, -1, 0, 0, -1, -1, 0, 0, 0, 0, 0 }, + {171, 178, -611, -1796, -2056, -881, 86, -960, -2868, -2453, 1090, 4681, 5206, 3255, 1754, 2056, 2881, 2534, 789, -1399, -3019, -3613, -3308, -2562, -1750, -974, -271, 158, 55, -691, -2001, -3621, -5178, -6376, -7209, -7832, -8244, -8251, -7770, -6999, -6270, -5828, -5773, -6064, -6535, -6993, -7353, -7655, -7945, -8187, -8314, -8302, -8189, -8038, -7888, -7740, -7593, -7457, -7332, -7182, -6969, -6703, -6429, -6169, -5904, -5612, -5302, -5002, -4725, -4458, -4187, -3908, -3638, -3399, -3201, -3041, -2910, -2802, -2712, -2642, -2601, -2592, -2606, -2629, -2661, -2712, -2797, -2924, -3089, -3292, -3537, -3821, -4123, -4407, -4637, -4781, + -4810, -4713, -4502, -4205, -3846, -3437, -2998, -2553, -2128, -1739, -1398, -1119, -932, -874, -975, -1248, -1707, -2359, -3199, -4197, -5318, -6546, -7865, -9239, -10628, -12022, -13424, -14820, -16171, -17452, -18659, -19768, -20724, -21490, -22075, -22495, -22740, -22793, -22678, -22444, -22107, -21658, -21100, -20464, -19761, -18962, -18041, -17007, -15872, -14615, -13208, -11665, -10024, -8303, -6503, -4651, -2807, -1022, 687, 2298, 3768, 5056, 6154, 7067, 7784, 8285, 8580, 8698, 8660, 8479, 8180, 7808, 7398, 6970, 6539, 6128, 5759, 5439, 5162, 4924, 4727, 4569, 4436, 4315, 4202, 4098, 3998, 3888, 3763, 3622, 3454, 3237, 2964, 2639, 2258, 1808, + 1303, 767, 213, -355, -899, -1369, -1750, -2007, -1996, -1562, -787, -45, 311, 271, 102, 14, 8, 6, -5, -4, 4, 2, -4, -1, 4, 1, -3, 0, 3, 0, -2, 0, 2, 0, -2, 0, 1, -1, -1, 0, 0, -1, -1, 0, 0, 0, 0, 0 } + }, + { + {95, 534, 1230, 1668, 1682, 1418, 645, -815, -2237, -2758, -2769, -3336, -4448, -5105, -5021, -4937, -5238, -5490, -5454, -5433, -5487, -5235, -4612, -4036, -3714, -3488, -3371, -3568, -3944, -4045, -3724, -3254, -2817, -2330, -1756, -1215, -761, -345, -11, 114, 8, -230, -510, -778, -955, -988, -904, -772, -652, -619, -760, -1114, -1652, -2323, -3058, -3759, -4346, -4801, -5145, -5383, -5511, -5539, -5480, -5325, -5066, -4714, -4285, -3795, -3267, -2728, -2199, -1687, -1197, -729, -268, 197, 665, 1131, 1594, 2045, 2464, 2820, 3083, 3230, 3244, 3099, 2761, 2192, 1375, 298, -1047, -2637, -4395, -6226, -8062, -9855, + -11532, -13021, -14295, -15363, -16218, -16845, -17257, -17491, -17565, -17457, -17156, -16681, -16066, -15332, -14511, -13652, -12811, -12016, -11267, -10563, -9918, -9341, -8831, -8380, -7994, -7679, -7426, -7214, -7024, -6853, -6703, -6573, -6466, -6393, -6372, -6416, -6531, -6715, -6966, -7285, -7666, -8091, -8541, -9013, -9499, -9979, -10419, -10795, -11094, -11296, -11374, -11317, -11139, -10864, -10503, -10063, -9568, -9049, -8515, -7956, -7375, -6788, -6201, -5603, -4991, -4378, -3777, -3188, -2606, -2034, -1488, -972, -478, 4, 470, 912, 1343, 1787, 2248, 2712, 3190, 3712, 4283, 4878, 5499, 6173, 6893, 7611, 8311, 8996, 9609, 10043, 10238, 10163, 9728, 8824, + 7462, 5711, 3572, 1083, -1506, -3897, -5936, -7304, -7215, -5089, -1696, 1038, 1787, 1034, 189, -43, 33, 21, -37, -10, 31, 3, -26, 0, 21, -2, -16, 3, 14, -3, -11, 4, 9, -4, -7, 3, 5, -4, -4, 3, 2, -3, -2, 2, 0, -2, 0, 1 }, + {-1390, -3924, -5634, -6107, -5624, -4868, -4049, -2870, -1370, -147, 454, 767, 1187, 1651, 2039, 2595, 3542, 4556, 4979, 4429, 3012, 1127, -755, -2266, -3280, -3862, -4032, -3733, -3042, -2231, -1531, -960, -437, 63, 555, 1098, 1711, 2292, 2681, 2762, 2493, 1902, 1103, 266, -452, -957, -1206, -1213, -1058, -850, -672, -555, -495, -472, -461, -440, -401, -351, -299, -256, -225, -195, -143, -41, 134, 401, 754, 1148, 1506, 1745, 1798, 1631, 1252, 709, 76, -579, -1195, -1731, -2151, -2422, -2505, -2360, -1963, -1324, -497, 419, 1298, 2012, 2470, 2628, 2493, 2113, 1558, 910, 248, -358, + -854, -1204, -1394, -1428, -1330, -1142, -909, -672, -461, -290, -161, -64, 12, 86, 170, 276, 409, 568, 740, 900, 1017, 1062, 1011, 858, 611, 293, -66, -431, -771, -1058, -1270, -1390, -1404, -1304, -1089, -768, -364, 88, 543, 949, 1256, 1428, 1447, 1318, 1071, 746, 390, 44, -259, -501, -678, -790, -845, -849, -810, -731, -615, -466, -291, -96, 104, 292, 453, 571, 639, 651, 614, 538, 436, 321, 205, 96, -4, -96, -184, -268, -357, -449, -539, -617, -672, -682, -619, -464, -212, 131, 539, 944, 1259, 1404, 1324, 984, 410, -288, -953, -1442, + -1635, -1448, -900, -148, 592, 1140, 1329, 1016, 279, -456, -711, -436, -34, 124, 54, -19, -7, 12, -2, -10, 6, 14, 4, 3, 13, 16, 8, 7, 12, 11, 4, 2, 4, 1, -5, -6, -6, -9, -12, -12, -11, -12, -12, -10, -8, -6, -4, -1 } + }, + { + {-1390, -3924, -5634, -6107, -5624, -4868, -4049, -2870, -1370, -147, 454, 767, 1187, 1651, 2039, 2595, 3542, 4556, 4979, 4429, 3012, 1127, -755, -2266, -3280, -3862, -4032, -3733, -3042, -2231, -1531, -960, -437, 63, 555, 1098, 1711, 2292, 2681, 2762, 2493, 1902, 1103, 266, -452, -957, -1206, -1213, -1058, -850, -672, -555, -495, -472, -461, -440, -401, -351, -299, -256, -225, -195, -143, -41, 134, 401, 754, 1148, 1506, 1745, 1798, 1631, 1252, 709, 76, -579, -1195, -1731, -2151, -2422, -2505, -2360, -1963, -1324, -497, 419, 1298, 2012, 2470, 2628, 2493, 2113, 1558, 910, 248, -358, + -854, -1204, -1394, -1428, -1330, -1142, -909, -672, -461, -290, -161, -64, 12, 86, 170, 276, 409, 568, 740, 900, 1017, 1062, 1011, 858, 611, 293, -66, -431, -771, -1058, -1270, -1390, -1404, -1304, -1089, -768, -364, 88, 543, 949, 1256, 1428, 1447, 1318, 1071, 746, 390, 44, -259, -501, -678, -790, -845, -849, -810, -731, -615, -466, -291, -96, 104, 292, 453, 571, 639, 651, 614, 538, 436, 321, 205, 96, -4, -96, -184, -268, -357, -449, -539, -617, -672, -682, -619, -464, -212, 131, 539, 944, 1259, 1404, 1324, 984, 410, -288, -953, -1442, + -1635, -1448, -900, -148, 592, 1140, 1329, 1016, 279, -456, -711, -436, -34, 124, 54, -19, -7, 12, -2, -10, 6, 14, 4, 3, 13, 16, 8, 7, 12, 11, 4, 2, 4, 1, -5, -6, -6, -9, -12, -12, -11, -12, -12, -10, -8, -6, -4, -1 }, + {95, 534, 1230, 1668, 1682, 1418, 645, -815, -2237, -2758, -2769, -3336, -4448, -5105, -5021, -4937, -5238, -5490, -5454, -5433, -5487, -5235, -4612, -4036, -3714, -3488, -3371, -3568, -3944, -4045, -3724, -3254, -2817, -2330, -1756, -1215, -761, -345, -11, 114, 8, -230, -510, -778, -955, -988, -904, -772, -652, -619, -760, -1114, -1652, -2323, -3058, -3759, -4346, -4801, -5145, -5383, -5511, -5539, -5480, -5325, -5066, -4714, -4285, -3795, -3267, -2728, -2199, -1687, -1197, -729, -268, 197, 665, 1131, 1594, 2045, 2464, 2820, 3083, 3230, 3244, 3099, 2761, 2192, 1375, 298, -1047, -2637, -4395, -6226, -8062, -9855, + -11532, -13021, -14295, -15363, -16218, -16845, -17257, -17491, -17565, -17457, -17156, -16681, -16066, -15332, -14511, -13652, -12811, -12016, -11267, -10563, -9918, -9341, -8831, -8380, -7994, -7679, -7426, -7214, -7024, -6853, -6703, -6573, -6466, -6393, -6372, -6416, -6531, -6715, -6966, -7285, -7666, -8091, -8541, -9013, -9499, -9979, -10419, -10795, -11094, -11296, -11374, -11317, -11139, -10864, -10503, -10063, -9568, -9049, -8515, -7956, -7375, -6788, -6201, -5603, -4991, -4378, -3777, -3188, -2606, -2034, -1488, -972, -478, 4, 470, 912, 1343, 1787, 2248, 2712, 3190, 3712, 4283, 4878, 5499, 6173, 6893, 7611, 8311, 8996, 9609, 10043, 10238, 10163, 9728, 8824, + 7462, 5711, 3572, 1083, -1506, -3897, -5936, -7304, -7215, -5089, -1696, 1038, 1787, 1034, 189, -43, 33, 21, -37, -10, 31, 3, -26, 0, 21, -2, -16, 3, 14, -3, -11, 4, 9, -4, -7, 3, 5, -4, -4, 3, 2, -3, -2, 2, 0, -2, 0, 1 } + }, + { + {116, 648, 1576, 2237, 2064, 1226, 171, -1004, -2278, -3187, -3275, -2923, -2979, -3527, -3783, -3367, -2905, -3010, -3366, -3351, -3009, -2799, -2782, -2645, -2324, -2065, -1954, -1808, -1518, -1184, -930, -791, -753, -757, -687, -472, -161, 148, 399, 556, 584, 485, 299, 43, -294, -689, -1085, -1451, -1792, -2125, -2470, -2856, -3300, -3797, -4332, -4886, -5427, -5928, -6389, -6812, -7170, -7440, -7632, -7762, -7820, -7791, -7683, -7508, -7247, -6878, -6404, -5850, -5230, -4567, -3893, -3237, -2613, -2034, -1511, -1045, -638, -308, -70, 79, 142, 95, -94, -439, -946, -1633, -2530, -3644, -4952, -6425, -8041, -9768, + -11544, -13292, -14962, -16531, -17965, -19207, -20220, -21015, -21601, -21950, -22035, -21882, -21527, -20980, -20241, -19356, -18397, -17411, -16414, -15436, -14518, -13683, -12924, -12233, -11617, -11084, -10630, -10240, -9899, -9601, -9340, -9103, -8872, -8650, -8459, -8320, -8238, -8218, -8280, -8437, -8689, -9024, -9437, -9923, -10474, -11068, -11676, -12269, -12830, -13336, -13745, -14015, -14131, -14093, -13879, -13467, -12876, -12148, -11306, -10354, -9323, -8264, -7203, -6141, -5090, -4082, -3136, -2250, -1425, -670, 8, 606, 1140, 1628, 2073, 2472, 2843, 3221, 3616, 4009, 4414, 4875, 5398, 5951, 6543, 7222, 7981, 8766, 9566, 10400, 11194, 11810, 12172, 12242, 11878, 10921, + 9369, 7295, 4671, 1530, -1798, -4916, -7619, -9465, -9367, -6540, -2040, 1533, 2432, 1354, 213, -75, 45, 29, -53, -13, 44, 4, -36, 0, 30, -3, -24, 5, 20, -5, -15, 6, 13, -6, -10, 6, 7, -6, -6, 5, 3, -5, -2, 4, 0, -3, 1, 2 }, + {-1860, -5004, -6705, -6776, -5627, -3744, -1317, 1483, 4031, 5434, 5288, 4027, 2430, 949, -377, -1559, -2442, -2850, -2807, -2499, -2032, -1338, -363, 714, 1584, 2092, 2295, 2252, 1915, 1270, 455, -347, -1032, -1557, -1862, -1902, -1680, -1228, -604, 75, 663, 1076, 1326, 1443, 1424, 1254, 931, 469, -96, -679, -1168, -1471, -1538, -1361, -974, -465, 61, 516, 853, 1053, 1127, 1105, 1009, 834, 568, 198, -267, -791, -1297, -1675, -1805, -1598, -1028, -169, 800, 1644, 2144, 2178, 1754, 1003, 122, -697, -1314, -1654, -1697, -1465, -1014, -423, 204, 751, 1117, 1246, 1140, 851, 462, 64, + -269, -496, -605, -610, -539, -422, -287, -154, -35, 67, 153, 227, 290, 339, 367, 361, 308, 204, 56, -117, -285, -415, -479, -462, -366, -211, -27, 149, 288, 370, 390, 354, 275, 171, 57, -54, -153, -230, -278, -294, -274, -219, -135, -32, 75, 172, 241, 273, 262, 214, 138, 49, -39, -113, -166, -194, -198, -180, -144, -96, -39, 21, 78, 129, 167, 188, 187, 162, 114, 47, -32, -111, -177, -220, -232, -208, -150, -69, 24, 117, 197, 250, 269, 250, 190, 89, -43, -183, -308, -390, -394, -294, -99, 143, 371, 515, + 505, 318, 15, -289, -490, -510, -301, 65, 365, 382, 141, -101, -147, -52, 18, 8, -12, -4, 7, -1, -5, 3, 8, 2, 0, 5, 6, 0, -2, 1, 0, -4, -5, -3, -3, -4, -3, 0, 1, 1, 2, 4, 4, 4, 4, 4, 2, 0 } + }, + { + {-1860, -5004, -6705, -6776, -5627, -3744, -1317, 1483, 4031, 5434, 5288, 4027, 2430, 949, -377, -1559, -2442, -2850, -2807, -2499, -2032, -1338, -363, 714, 1584, 2092, 2295, 2252, 1915, 1270, 455, -347, -1032, -1557, -1862, -1902, -1680, -1228, -604, 75, 663, 1076, 1326, 1443, 1424, 1254, 931, 469, -96, -679, -1168, -1471, -1538, -1361, -974, -465, 61, 516, 853, 1053, 1127, 1105, 1009, 834, 568, 198, -267, -791, -1297, -1675, -1805, -1598, -1028, -169, 800, 1644, 2144, 2178, 1754, 1003, 122, -697, -1314, -1654, -1697, -1465, -1014, -423, 204, 751, 1117, 1246, 1140, 851, 462, 64, + -269, -496, -605, -610, -539, -422, -287, -154, -35, 67, 153, 227, 290, 339, 367, 361, 308, 204, 56, -117, -285, -415, -479, -462, -366, -211, -27, 149, 288, 370, 390, 354, 275, 171, 57, -54, -153, -230, -278, -294, -274, -219, -135, -32, 75, 172, 241, 273, 262, 214, 138, 49, -39, -113, -166, -194, -198, -180, -144, -96, -39, 21, 78, 129, 167, 188, 187, 162, 114, 47, -32, -111, -177, -220, -232, -208, -150, -69, 24, 117, 197, 250, 269, 250, 190, 89, -43, -183, -308, -390, -394, -294, -99, 143, 371, 515, + 505, 318, 15, -289, -490, -510, -301, 65, 365, 382, 141, -101, -147, -52, 18, 8, -12, -4, 7, -1, -5, 3, 8, 2, 0, 5, 6, 0, -2, 1, 0, -4, -5, -3, -3, -4, -3, 0, 1, 1, 2, 4, 4, 4, 4, 4, 2, 0 }, + {116, 648, 1576, 2237, 2064, 1226, 171, -1004, -2278, -3187, -3275, -2923, -2979, -3527, -3783, -3367, -2905, -3010, -3366, -3351, -3009, -2799, -2782, -2645, -2324, -2065, -1954, -1808, -1518, -1184, -930, -791, -753, -757, -687, -472, -161, 148, 399, 556, 584, 485, 299, 43, -294, -689, -1085, -1451, -1792, -2125, -2470, -2856, -3300, -3797, -4332, -4886, -5427, -5928, -6389, -6812, -7170, -7440, -7632, -7762, -7820, -7791, -7683, -7508, -7247, -6878, -6404, -5850, -5230, -4567, -3893, -3237, -2613, -2034, -1511, -1045, -638, -308, -70, 79, 142, 95, -94, -439, -946, -1633, -2530, -3644, -4952, -6425, -8041, -9768, + -11544, -13292, -14962, -16531, -17965, -19207, -20220, -21015, -21601, -21950, -22035, -21882, -21527, -20980, -20241, -19356, -18397, -17411, -16414, -15436, -14518, -13683, -12924, -12233, -11617, -11084, -10630, -10240, -9899, -9601, -9340, -9103, -8872, -8650, -8459, -8320, -8238, -8218, -8280, -8437, -8689, -9024, -9437, -9923, -10474, -11068, -11676, -12269, -12830, -13336, -13745, -14015, -14131, -14093, -13879, -13467, -12876, -12148, -11306, -10354, -9323, -8264, -7203, -6141, -5090, -4082, -3136, -2250, -1425, -670, 8, 606, 1140, 1628, 2073, 2472, 2843, 3221, 3616, 4009, 4414, 4875, 5398, 5951, 6543, 7222, 7981, 8766, 9566, 10400, 11194, 11810, 12172, 12242, 11878, 10921, + 9369, 7295, 4671, 1530, -1798, -4916, -7619, -9465, -9367, -6540, -2040, 1533, 2432, 1354, 213, -75, 45, 29, -53, -13, 44, 4, -36, 0, 30, -3, -24, 5, 20, -5, -15, 6, 13, -6, -10, 6, 7, -6, -6, 5, 3, -5, -2, 4, 0, -3, 1, 2 } + }, + { + {350, 928, 1443, 2070, 2309, 1428, -237, -1479, -1917, -2354, -3163, -3485, -2669, -1461, -938, -1029, -990, -748, -817, -1224, -1437, -1311, -1326, -1788, -2374, -2608, -2396, -1970, -1573, -1306, -1095, -741, -156, 444, 721, 566, 164, -271, -684, -1085, -1437, -1690, -1852, -1986, -2162, -2427, -2797, -3269, -3844, -4530, -5310, -6129, -6923, -7651, -8290, -8821, -9245, -9597, -9930, -10286, -10686, -11141, -11649, -12182, -12673, -13047, -13244, -13227, -12978, -12499, -11829, -11028, -10142, -9200, -8237, -7299, -6424, -5627, -4911, -4277, -3740, -3312, -3008, -2838, -2806, -2911, -3137, -3450, -3818, -4238, -4736, -5341, -6067, -6933, -7974, -9210, + -10620, -12155, -13779, -15457, -17117, -18659, -20005, -21120, -21976, -22539, -22798, -22803, -22616, -22271, -21782, -21188, -20538, -19846, -19090, -18262, -17384, -16476, -15536, -14568, -13606, -12689, -11831, -11026, -10277, -9597, -8988, -8436, -7935, -7495, -7137, -6866, -6676, -6565, -6539, -6600, -6739, -6943, -7208, -7539, -7930, -8362, -8810, -9253, -9671, -10027, -10273, -10369, -10300, -10053, -9608, -8955, -8123, -7154, -6074, -4901, -3676, -2453, -1260, -108, 980, 1965, 2824, 3556, 4158, 4619, 4933, 5116, 5188, 5165, 5060, 4890, 4682, 4466, 4256, 4055, 3880, 3757, 3695, 3679, 3718, 3844, 4064, 4354, 4712, 5159, 5666, 6151, 6561, 6864, 6969, 6748, + 6160, 5221, 3892, 2148, 144, -1883, -3805, -5383, -5934, -4762, -2197, 262, 1275, 908, 236, -17, 25, 25, -27, -15, 24, 8, -20, -4, 17, 2, -14, 0, 12, -1, -9, 2, 8, -2, -6, 2, 4, -3, -4, 2, 2, -2, -2, 1, 0, -1, 0, 1 }, + {-2055, -5418, -7055, -6938, -5441, -2807, 630, 4004, 6171, 6510, 5281, 3176, 714, -1822, -4061, -5446, -5532, -4307, -2177, 297, 2621, 4367, 5142, 4697, 3128, 902, -1369, -3185, -4226, -4315, -3442, -1833, 95, 1889, 3166, 3655, 3265, 2160, 705, -711, -1820, -2475, -2606, -2215, -1410, -385, 635, 1450, 1905, 1930, 1563, 935, 213, -456, -972, -1270, -1325, -1151, -808, -368, 93, 509, 823, 1000, 1028, 913, 667, 310, -129, -602, -1029, -1299, -1300, -979, -388, 323, 960, 1348, 1394, 1113, 617, 52, -457, -835, -1053, -1101, -975, -676, -224, 316, 830, 1177, 1247, 1005, 521, -62, + -582, -920, -1025, -913, -641, -286, 81, 400, 631, 751, 751, 633, 408, 103, -240, -563, -795, -872, -754, -451, -27, 410, 744, 886, 806, 540, 173, -195, -480, -632, -641, -528, -333, -100, 126, 312, 434, 480, 444, 335, 169, -27, -218, -370, -454, -451, -361, -198, 6, 211, 373, 459, 449, 343, 166, -43, -237, -376, -431, -396, -281, -115, 67, 228, 339, 379, 345, 245, 100, -63, -213, -320, -363, -333, -232, -80, 89, 242, 344, 369, 311, 185, 20, -152, -296, -375, -370, -280, -115, 99, 306, 438, 444, 313, 68, -224, + -449, -498, -348, -63, 248, 454, 425, 140, -211, -349, -194, 46, 136, 66, -7, -7, 14, 4, -13, -9, -3, -10, -15, -7, 2, 1, 2, 10, 14, 10, 7, 6, 3, -5, -9, -10, -11, -12, -9, -3, 1, 5, 9, 12, 12, 10, 7, 3 } + }, + { + {-2055, -5418, -7055, -6938, -5441, -2807, 630, 4004, 6171, 6510, 5281, 3176, 714, -1822, -4061, -5446, -5532, -4307, -2177, 297, 2621, 4367, 5142, 4697, 3128, 902, -1369, -3185, -4226, -4315, -3442, -1833, 95, 1889, 3166, 3655, 3265, 2160, 705, -711, -1820, -2475, -2606, -2215, -1410, -385, 635, 1450, 1905, 1930, 1563, 935, 213, -456, -972, -1270, -1325, -1151, -808, -368, 93, 509, 823, 1000, 1028, 913, 667, 310, -129, -602, -1029, -1299, -1300, -979, -388, 323, 960, 1348, 1394, 1113, 617, 52, -457, -835, -1053, -1101, -975, -676, -224, 316, 830, 1177, 1247, 1005, 521, -62, + -582, -920, -1025, -913, -641, -286, 81, 400, 631, 751, 751, 633, 408, 103, -240, -563, -795, -872, -754, -451, -27, 410, 744, 886, 806, 540, 173, -195, -480, -632, -641, -528, -333, -100, 126, 312, 434, 480, 444, 335, 169, -27, -218, -370, -454, -451, -361, -198, 6, 211, 373, 459, 449, 343, 166, -43, -237, -376, -431, -396, -281, -115, 67, 228, 339, 379, 345, 245, 100, -63, -213, -320, -363, -333, -232, -80, 89, 242, 344, 369, 311, 185, 20, -152, -296, -375, -370, -280, -115, 99, 306, 438, 444, 313, 68, -224, + -449, -498, -348, -63, 248, 454, 425, 140, -211, -349, -194, 46, 136, 66, -7, -7, 14, 4, -13, -9, -3, -10, -15, -7, 2, 1, 2, 10, 14, 10, 7, 6, 3, -5, -9, -10, -11, -12, -9, -3, 1, 5, 9, 12, 12, 10, 7, 3 }, + {350, 928, 1443, 2070, 2309, 1428, -237, -1479, -1917, -2354, -3163, -3485, -2669, -1461, -938, -1029, -990, -748, -817, -1224, -1437, -1311, -1326, -1788, -2374, -2608, -2396, -1970, -1573, -1306, -1095, -741, -156, 444, 721, 566, 164, -271, -684, -1085, -1437, -1690, -1852, -1986, -2162, -2427, -2797, -3269, -3844, -4530, -5310, -6129, -6923, -7651, -8290, -8821, -9245, -9597, -9930, -10286, -10686, -11141, -11649, -12182, -12673, -13047, -13244, -13227, -12978, -12499, -11829, -11028, -10142, -9200, -8237, -7299, -6424, -5627, -4911, -4277, -3740, -3312, -3008, -2838, -2806, -2911, -3137, -3450, -3818, -4238, -4736, -5341, -6067, -6933, -7974, -9210, + -10620, -12155, -13779, -15457, -17117, -18659, -20005, -21120, -21976, -22539, -22798, -22803, -22616, -22271, -21782, -21188, -20538, -19846, -19090, -18262, -17384, -16476, -15536, -14568, -13606, -12689, -11831, -11026, -10277, -9597, -8988, -8436, -7935, -7495, -7137, -6866, -6676, -6565, -6539, -6600, -6739, -6943, -7208, -7539, -7930, -8362, -8810, -9253, -9671, -10027, -10273, -10369, -10300, -10053, -9608, -8955, -8123, -7154, -6074, -4901, -3676, -2453, -1260, -108, 980, 1965, 2824, 3556, 4158, 4619, 4933, 5116, 5188, 5165, 5060, 4890, 4682, 4466, 4256, 4055, 3880, 3757, 3695, 3679, 3718, 3844, 4064, 4354, 4712, 5159, 5666, 6151, 6561, 6864, 6969, 6748, + 6160, 5221, 3892, 2148, 144, -1883, -3805, -5383, -5934, -4762, -2197, 262, 1275, 908, 236, -17, 25, 25, -27, -15, 24, 8, -20, -4, 17, 2, -14, 0, 12, -1, -9, 2, 8, -2, -6, 2, 4, -3, -4, 2, 2, -2, -2, 1, 0, -1, 0, 1 } + }, + { + {-66, -238, -467, -670, -755, -697, -379, 500, 2029, 3601, 4244, 3579, 2117, 567, -704, -1467, -1497, -906, -152, 503, 1127, 1603, 1513, 745, -244, -978, -1339, -1319, -877, -220, 226, 285, 115, -224, -910, -1966, -3104, -4068, -4844, -5475, -5948, -6304, -6645, -6982, -7250, -7441, -7608, -7763, -7909, -8097, -8350, -8598, -8789, -8971, -9205, -9486, -9794, -10143, -10528, -10896, -11208, -11480, -11743, -12008, -12294, -12620, -12991, -13394, -13802, -14171, -14459, -14656, -14772, -14788, -14682, -14470, -14195, -13860, -13442, -12951, -12421, -11866, -11294, -10736, -10233, -9795, -9410, -9072, -8783, -8538, -8324, -8123, -7918, -7703, -7486, -7273, + -7060, -6846, -6645, -6458, -6269, -6064, -5847, -5620, -5371, -5093, -4796, -4492, -4188, -3888, -3602, -3337, -3099, -2890, -2711, -2557, -2428, -2326, -2247, -2181, -2127, -2088, -2063, -2049, -2047, -2064, -2106, -2178, -2291, -2451, -2667, -2946, -3294, -3703, -4158, -4651, -5178, -5721, -6259, -6781, -7287, -7770, -8212, -8604, -8956, -9276, -9558, -9798, -10008, -10207, -10396, -10565, -10716, -10860, -11001, -11124, -11216, -11278, -11316, -11316, -11255, -11128, -10940, -10687, -10346, -9898, -9347, -8702, -7942, -7045, -6019, -4888, -3649, -2277, -788, 770, 2385, 4073, 5803, 7509, 9167, 10781, 12302, 13642, 14765, 15660, 16231, 16348, 15967, 15071, 13570, 11401, + 8671, 5533, 2045, -1632, -5076, -7894, -9896, -10607, -9087, -5096, -310, 2637, 2663, 1143, 45, -93, 49, 8, -56, 3, 43, -9, -34, 10, 27, -10, -20, 11, 17, -9, -12, 9, 10, -8, -8, 7, 5, -6, -4, 5, 2, -4, -2, 3, 0, -3, 1, 1 }, + {-1065, -3051, -4739, -5974, -6263, -5208, -3369, -2120, -2475, -4304, -6596, -8121, -8061, -6580, -4790, -3757, -3580, -3700, -3765, -3700, -3237, -2063, -416, 1010, 1818, 2209, 2569, 3086, 3792, 4650, 5515, 6180, 6514, 6493, 6164, 5666, 5201, 4875, 4606, 4254, 3757, 3138, 2443, 1729, 1037, 355, -348, -1067, -1768, -2444, -3104, -3743, -4346, -4906, -5397, -5762, -5962, -6007, -5908, -5659, -5265, -4752, -4144, -3453, -2704, -1930, -1137, -311, 542, 1390, 2192, 2914, 3527, 4018, 4394, 4668, 4838, 4895, 4834, 4657, 4374, 3995, 3532, 2996, 2411, 1807, 1210, 641, 115, -356, -773, -1137, -1442, -1680, -1857, -1982, + -2059, -2086, -2073, -2030, -1964, -1878, -1787, -1702, -1628, -1565, -1515, -1480, -1455, -1435, -1417, -1398, -1372, -1332, -1270, -1176, -1042, -864, -636, -360, -40, 313, 696, 1104, 1524, 1940, 2345, 2727, 3069, 3354, 3576, 3732, 3808, 3791, 3679, 3470, 3156, 2733, 2206, 1588, 883, 100, -740, -1607, -2472, -3307, -4074, -4730, -5242, -5586, -5737, -5677, -5403, -4929, -4278, -3470, -2540, -1533, -492, 550, 1554, 2480, 3295, 3983, 4525, 4902, 5106, 5135, 4991, 4672, 4189, 3562, 2815, 1972, 1067, 135, -787, -1661, -2450, -3121, -3646, -3993, -4146, -4098, -3842, -3371, -2699, -1865, -909, 121, 1139, 2031, + 2710, 3116, 3170, 2808, 2075, 1091, -50, -1193, -1953, -1891, -1041, -48, 419, 307, 53, -25, 12, 17, -5, 7, 30, 27, 17, 28, 42, 39, 34, 43, 51, 46, 43, 49, 52, 48, 45, 47, 47, 42, 38, 38, 35, 29, 25, 22, 17, 12, 7, 3 } + }, + { + {-1065, -3051, -4739, -5974, -6263, -5208, -3369, -2120, -2475, -4304, -6596, -8121, -8061, -6580, -4790, -3757, -3580, -3700, -3765, -3700, -3237, -2063, -416, 1010, 1818, 2209, 2569, 3086, 3792, 4650, 5515, 6180, 6514, 6493, 6164, 5666, 5201, 4875, 4606, 4254, 3757, 3138, 2443, 1729, 1037, 355, -348, -1067, -1768, -2444, -3104, -3743, -4346, -4906, -5397, -5762, -5962, -6007, -5908, -5659, -5265, -4752, -4144, -3453, -2704, -1930, -1137, -311, 542, 1390, 2192, 2914, 3527, 4018, 4394, 4668, 4838, 4895, 4834, 4657, 4374, 3995, 3532, 2996, 2411, 1807, 1210, 641, 115, -356, -773, -1137, -1442, -1680, -1857, -1982, + -2059, -2086, -2073, -2030, -1964, -1878, -1787, -1702, -1628, -1565, -1515, -1480, -1455, -1435, -1417, -1398, -1372, -1332, -1270, -1176, -1042, -864, -636, -360, -40, 313, 696, 1104, 1524, 1940, 2345, 2727, 3069, 3354, 3576, 3732, 3808, 3791, 3679, 3470, 3156, 2733, 2206, 1588, 883, 100, -740, -1607, -2472, -3307, -4074, -4730, -5242, -5586, -5737, -5677, -5403, -4929, -4278, -3470, -2540, -1533, -492, 550, 1554, 2480, 3295, 3983, 4525, 4902, 5106, 5135, 4991, 4672, 4189, 3562, 2815, 1972, 1067, 135, -787, -1661, -2450, -3121, -3646, -3993, -4146, -4098, -3842, -3371, -2699, -1865, -909, 121, 1139, 2031, + 2710, 3116, 3170, 2808, 2075, 1091, -50, -1193, -1953, -1891, -1041, -48, 419, 307, 53, -25, 12, 17, -5, 7, 30, 27, 17, 28, 42, 39, 34, 43, 51, 46, 43, 49, 52, 48, 45, 47, 47, 42, 38, 38, 35, 29, 25, 22, 17, 12, 7, 3 }, + {-66, -238, -467, -670, -755, -697, -379, 500, 2029, 3601, 4244, 3579, 2117, 567, -704, -1467, -1497, -906, -152, 503, 1127, 1603, 1513, 745, -244, -978, -1339, -1319, -877, -220, 226, 285, 115, -224, -910, -1966, -3104, -4068, -4844, -5475, -5948, -6304, -6645, -6982, -7250, -7441, -7608, -7763, -7909, -8097, -8350, -8598, -8789, -8971, -9205, -9486, -9794, -10143, -10528, -10896, -11208, -11480, -11743, -12008, -12294, -12620, -12991, -13394, -13802, -14171, -14459, -14656, -14772, -14788, -14682, -14470, -14195, -13860, -13442, -12951, -12421, -11866, -11294, -10736, -10233, -9795, -9410, -9072, -8783, -8538, -8324, -8123, -7918, -7703, -7486, -7273, + -7060, -6846, -6645, -6458, -6269, -6064, -5847, -5620, -5371, -5093, -4796, -4492, -4188, -3888, -3602, -3337, -3099, -2890, -2711, -2557, -2428, -2326, -2247, -2181, -2127, -2088, -2063, -2049, -2047, -2064, -2106, -2178, -2291, -2451, -2667, -2946, -3294, -3703, -4158, -4651, -5178, -5721, -6259, -6781, -7287, -7770, -8212, -8604, -8956, -9276, -9558, -9798, -10008, -10207, -10396, -10565, -10716, -10860, -11001, -11124, -11216, -11278, -11316, -11316, -11255, -11128, -10940, -10687, -10346, -9898, -9347, -8702, -7942, -7045, -6019, -4888, -3649, -2277, -788, 770, 2385, 4073, 5803, 7509, 9167, 10781, 12302, 13642, 14765, 15660, 16231, 16348, 15967, 15071, 13570, 11401, + 8671, 5533, 2045, -1632, -5076, -7894, -9896, -10607, -9087, -5096, -310, 2637, 2663, 1143, 45, -93, 49, 8, -56, 3, 43, -9, -34, 10, 27, -10, -20, 11, 17, -9, -12, 9, 10, -8, -8, 7, 5, -6, -4, 5, 2, -4, -2, 3, 0, -3, 1, 1 } + }, + { + {67, 286, 671, 954, 550, -676, -1867, -2043, -1363, -804, -717, -537, 15, 345, -104, -1078, -2028, -2861, -3748, -4603, -5165, -5395, -5471, -5502, -5474, -5380, -5263, -5156, -5054, -4918, -4692, -4372, -4042, -3788, -3594, -3376, -3079, -2711, -2316, -1951, -1667, -1475, -1351, -1285, -1294, -1386, -1550, -1775, -2052, -2347, -2608, -2794, -2897, -2928, -2927, -2939, -3004, -3150, -3403, -3772, -4231, -4736, -5258, -5779, -6265, -6682, -7030, -7335, -7610, -7854, -8075, -8285, -8484, -8651, -8767, -8825, -8820, -8744, -8592, -8377, -8128, -7874, -7623, -7371, -7116, -6853, -6563, -6221, -5822, -5382, -4925, -4466, -4024, -3619, -3267, -2977, + -2758, -2624, -2590, -2676, -2897, -3252, -3723, -4299, -4968, -5705, -6476, -7260, -8052, -8838, -9585, -10274, -10901, -11467, -11954, -12345, -12649, -12882, -13054, -13160, -13208, -13219, -13211, -13177, -13107, -13005, -12881, -12725, -12516, -12245, -11927, -11568, -11157, -10695, -10206, -9713, -9223, -8739, -8276, -7855, -7483, -7154, -6863, -6615, -6412, -6245, -6099, -5966, -5848, -5741, -5631, -5502, -5357, -5201, -5026, -4817, -4574, -4308, -4017, -3691, -3324, -2924, -2496, -2034, -1529, -984, -408, 195, 832, 1504, 2196, 2892, 3597, 4317, 5035, 5727, 6388, 7024, 7611, 8114, 8525, 8851, 9068, 9138, 9055, 8823, 8410, 7779, 6940, 5915, 4698, 3297, + 1790, 259, -1259, -2682, -3848, -4634, -4998, -4778, -3680, -1755, 228, 1280, 1142, 471, 31, -26, 19, 0, -20, 4, 15, -5, -12, 5, 9, -5, -7, 5, 6, -4, -4, 4, 4, -4, -3, 3, 2, -3, -1, 2, 1, -2, 0, 1, 0, -1, 0, 1 }, + {-1520, -4372, -6514, -7320, -6592, -4939, -3363, -2369, -1589, -362, 1412, 3137, 4178, 4466, 4388, 4223, 3864, 3052, 1745, 213, -1171, -2193, -2873, -3341, -3659, -3747, -3488, -2861, -1945, -841, 349, 1488, 2407, 2979, 3185, 3076, 2713, 2156, 1478, 766, 87, -519, -1033, -1450, -1771, -1995, -2114, -2116, -1993, -1735, -1335, -792, -131, 590, 1292, 1896, 2338, 2579, 2595, 2372, 1914, 1252, 452, -403, -1224, -1928, -2451, -2744, -2772, -2515, -1978, -1204, -282, 660, 1483, 2070, 2354, 2329, 2047, 1597, 1072, 548, 68, -350, -701, -984, -1197, -1331, -1372, -1307, -1133, -865, -531, -174, 170, 470, + 709, 879, 979, 1013, 985, 897, 754, 563, 330, 68, -207, -474, -712, -897, -1010, -1034, -967, -811, -580, -296, 11, 311, 576, 785, 920, 974, 945, 836, 654, 415, 136, -158, -439, -673, -833, -900, -868, -744, -550, -316, -73, 150, 332, 462, 535, 556, 533, 475, 394, 297, 192, 84, -24, -126, -219, -300, -362, -402, -414, -397, -349, -273, -173, -56, 68, 189, 297, 382, 435, 450, 425, 362, 267, 146, 11, -127, -257, -370, -452, -496, -497, -451, -354, -210, -30, 174, 380, 559, 673, 694, 608, 407, 112, -222, -523, -726, + -782, -657, -370, -2, 343, 579, 632, 443, 69, -272, -362, -199, 5, 78, 42, 8, 15, 23, 13, 8, 12, 11, 2, -3, -3, -6, -13, -15, -14, -15, -17, -15, -11, -8, -6, -1, 4, 7, 10, 13, 16, 16, 16, 15, 13, 10, 6, 2 } + }, + { + {-1520, -4372, -6514, -7320, -6592, -4939, -3363, -2369, -1589, -362, 1412, 3137, 4178, 4466, 4388, 4223, 3864, 3052, 1745, 213, -1171, -2193, -2873, -3341, -3659, -3747, -3488, -2861, -1945, -841, 349, 1488, 2407, 2979, 3185, 3076, 2713, 2156, 1478, 766, 87, -519, -1033, -1450, -1771, -1995, -2114, -2116, -1993, -1735, -1335, -792, -131, 590, 1292, 1896, 2338, 2579, 2595, 2372, 1914, 1252, 452, -403, -1224, -1928, -2451, -2744, -2772, -2515, -1978, -1204, -282, 660, 1483, 2070, 2354, 2329, 2047, 1597, 1072, 548, 68, -350, -701, -984, -1197, -1331, -1372, -1307, -1133, -865, -531, -174, 170, 470, + 709, 879, 979, 1013, 985, 897, 754, 563, 330, 68, -207, -474, -712, -897, -1010, -1034, -967, -811, -580, -296, 11, 311, 576, 785, 920, 974, 945, 836, 654, 415, 136, -158, -439, -673, -833, -900, -868, -744, -550, -316, -73, 150, 332, 462, 535, 556, 533, 475, 394, 297, 192, 84, -24, -126, -219, -300, -362, -402, -414, -397, -349, -273, -173, -56, 68, 189, 297, 382, 435, 450, 425, 362, 267, 146, 11, -127, -257, -370, -452, -496, -497, -451, -354, -210, -30, 174, 380, 559, 673, 694, 608, 407, 112, -222, -523, -726, + -782, -657, -370, -2, 343, 579, 632, 443, 69, -272, -362, -199, 5, 78, 42, 8, 15, 23, 13, 8, 12, 11, 2, -3, -3, -6, -13, -15, -14, -15, -17, -15, -11, -8, -6, -1, 4, 7, 10, 13, 16, 16, 16, 15, 13, 10, 6, 2 }, + {67, 286, 671, 954, 550, -676, -1867, -2043, -1363, -804, -717, -537, 15, 345, -104, -1078, -2028, -2861, -3748, -4603, -5165, -5395, -5471, -5502, -5474, -5380, -5263, -5156, -5054, -4918, -4692, -4372, -4042, -3788, -3594, -3376, -3079, -2711, -2316, -1951, -1667, -1475, -1351, -1285, -1294, -1386, -1550, -1775, -2052, -2347, -2608, -2794, -2897, -2928, -2927, -2939, -3004, -3150, -3403, -3772, -4231, -4736, -5258, -5779, -6265, -6682, -7030, -7335, -7610, -7854, -8075, -8285, -8484, -8651, -8767, -8825, -8820, -8744, -8592, -8377, -8128, -7874, -7623, -7371, -7116, -6853, -6563, -6221, -5822, -5382, -4925, -4466, -4024, -3619, -3267, -2977, + -2758, -2624, -2590, -2676, -2897, -3252, -3723, -4299, -4968, -5705, -6476, -7260, -8052, -8838, -9585, -10274, -10901, -11467, -11954, -12345, -12649, -12882, -13054, -13160, -13208, -13219, -13211, -13177, -13107, -13005, -12881, -12725, -12516, -12245, -11927, -11568, -11157, -10695, -10206, -9713, -9223, -8739, -8276, -7855, -7483, -7154, -6863, -6615, -6412, -6245, -6099, -5966, -5848, -5741, -5631, -5502, -5357, -5201, -5026, -4817, -4574, -4308, -4017, -3691, -3324, -2924, -2496, -2034, -1529, -984, -408, 195, 832, 1504, 2196, 2892, 3597, 4317, 5035, 5727, 6388, 7024, 7611, 8114, 8525, 8851, 9068, 9138, 9055, 8823, 8410, 7779, 6940, 5915, 4698, 3297, + 1790, 259, -1259, -2682, -3848, -4634, -4998, -4778, -3680, -1755, 228, 1280, 1142, 471, 31, -26, 19, 0, -20, 4, 15, -5, -12, 5, 9, -5, -7, 5, 6, -4, -4, 4, 4, -4, -3, 3, 2, -3, -1, 2, 1, -2, 0, 1, 0, -1, 0, 1 } + }, + { + {4, 136, 440, 600, 213, -718, -1697, -2240, -2335, -2247, -2050, -1644, -1147, -936, -1228, -1878, -2651, -3466, -4265, -4865, -5135, -5187, -5257, -5436, -5650, -5820, -5944, -6035, -6080, -6076, -6041, -5979, -5864, -5667, -5371, -4964, -4451, -3874, -3318, -2850, -2492, -2232, -2063, -1989, -1996, -2049, -2116, -2180, -2237, -2285, -2326, -2372, -2443, -2560, -2740, -2986, -3288, -3629, -3992, -4357, -4693, -4986, -5245, -5483, -5701, -5888, -6039, -6140, -6168, -6097, -5922, -5657, -5328, -4965, -4603, -4272, -3989, -3753, -3548, -3356, -3165, -2968, -2761, -2542, -2315, -2085, -1853, -1623, -1396, -1179, -976, -793, -639, -522, -461, -473, + -574, -773, -1071, -1472, -1966, -2528, -3129, -3752, -4396, -5048, -5693, -6329, -6964, -7592, -8190, -8737, -9229, -9660, -10013, -10274, -10447, -10549, -10585, -10551, -10454, -10316, -10155, -9975, -9774, -9567, -9365, -9163, -8940, -8691, -8416, -8114, -7774, -7397, -7002, -6611, -6230, -5862, -5520, -5217, -4957, -4737, -4556, -4418, -4324, -4270, -4244, -4240, -4256, -4287, -4320, -4341, -4347, -4337, -4302, -4230, -4117, -3967, -3783, -3554, -3275, -2953, -2593, -2192, -1744, -1253, -732, -187, 384, 980, 1587, 2191, 2792, 3392, 3974, 4519, 5025, 5495, 5915, 6262, 6531, 6725, 6829, 6817, 6684, 6435, 6055, 5523, 4851, 4061, 3156, 2151, + 1098, 54, -951, -1868, -2599, -3075, -3276, -3114, -2417, -1217, 30, 725, 692, 309, 39, -8, 12, 0, -12, 2, 9, -3, -7, 3, 5, -3, -4, 3, 3, -2, -2, 2, 2, -2, -2, 2, 1, -2, -1, 1, 0, -1, 0, 1, 0, -1, 0, 0 }, + {-1089, -3257, -5185, -6310, -6248, -5387, -4665, -4561, -4582, -4032, -2986, -2081, -1535, -920, 114, 1406, 2636, 3690, 4507, 4931, 4909, 4627, 4278, 3843, 3232, 2475, 1662, 811, -111, -1090, -2051, -2888, -3502, -3839, -3931, -3841, -3590, -3160, -2575, -1913, -1262, -674, -174, 238, 589, 905, 1205, 1514, 1861, 2253, 2651, 2989, 3196, 3213, 3014, 2621, 2091, 1475, 797, 71, -690, -1460, -2199, -2847, -3342, -3637, -3716, -3588, -3279, -2823, -2246, -1563, -787, 54, 908, 1701, 2358, 2824, 3073, 3119, 2999, 2753, 2416, 2016, 1579, 1126, 669, 218, -218, -629, -1015, -1372, -1695, -1976, -2206, -2365, + -2430, -2379, -2205, -1911, -1506, -1013, -463, 112, 682, 1215, 1677, 2044, 2297, 2425, 2420, 2284, 2030, 1677, 1245, 763, 264, -224, -678, -1074, -1394, -1627, -1770, -1819, -1774, -1641, -1431, -1157, -838, -497, -160, 153, 423, 638, 792, 888, 935, 943, 922, 883, 833, 776, 709, 633, 544, 437, 307, 156, -16, -203, -397, -586, -758, -899, -998, -1046, -1036, -967, -842, -667, -453, -213, 38, 284, 511, 705, 856, 956, 1001, 990, 924, 807, 649, 457, 242, 13, -214, -430, -623, -785, -901, -960, -956, -882, -729, -501, -215, 104, 431, 722, 927, 1011, + 962, 774, 461, 77, -296, -594, -761, -724, -444, -30, 276, 310, 151, 4, -29, -2, 7, -2, -1, 7, 5, -1, 1, 5, 2, -1, 0, 2, 0, -2, -1, 0, -2, -3, -2, -2, -3, -4, -3, -2, -3, -3, -2, -2, -2, -1, -1, 0 } + }, + { + {-1089, -3257, -5185, -6310, -6248, -5387, -4665, -4561, -4582, -4032, -2986, -2081, -1535, -920, 114, 1406, 2636, 3690, 4507, 4931, 4909, 4627, 4278, 3843, 3232, 2475, 1662, 811, -111, -1090, -2051, -2888, -3502, -3839, -3931, -3841, -3590, -3160, -2575, -1913, -1262, -674, -174, 238, 589, 905, 1205, 1514, 1861, 2253, 2651, 2989, 3196, 3213, 3014, 2621, 2091, 1475, 797, 71, -690, -1460, -2199, -2847, -3342, -3637, -3716, -3588, -3279, -2823, -2246, -1563, -787, 54, 908, 1701, 2358, 2824, 3073, 3119, 2999, 2753, 2416, 2016, 1579, 1126, 669, 218, -218, -629, -1015, -1372, -1695, -1976, -2206, -2365, + -2430, -2379, -2205, -1911, -1506, -1013, -463, 112, 682, 1215, 1677, 2044, 2297, 2425, 2420, 2284, 2030, 1677, 1245, 763, 264, -224, -678, -1074, -1394, -1627, -1770, -1819, -1774, -1641, -1431, -1157, -838, -497, -160, 153, 423, 638, 792, 888, 935, 943, 922, 883, 833, 776, 709, 633, 544, 437, 307, 156, -16, -203, -397, -586, -758, -899, -998, -1046, -1036, -967, -842, -667, -453, -213, 38, 284, 511, 705, 856, 956, 1001, 990, 924, 807, 649, 457, 242, 13, -214, -430, -623, -785, -901, -960, -956, -882, -729, -501, -215, 104, 431, 722, 927, 1011, + 962, 774, 461, 77, -296, -594, -761, -724, -444, -30, 276, 310, 151, 4, -29, -2, 7, -2, -1, 7, 5, -1, 1, 5, 2, -1, 0, 2, 0, -2, -1, 0, -2, -3, -2, -2, -3, -4, -3, -2, -3, -3, -2, -2, -2, -1, -1, 0 }, + {4, 136, 440, 600, 213, -718, -1697, -2240, -2335, -2247, -2050, -1644, -1147, -936, -1228, -1878, -2651, -3466, -4265, -4865, -5135, -5187, -5257, -5436, -5650, -5820, -5944, -6035, -6080, -6076, -6041, -5979, -5864, -5667, -5371, -4964, -4451, -3874, -3318, -2850, -2492, -2232, -2063, -1989, -1996, -2049, -2116, -2180, -2237, -2285, -2326, -2372, -2443, -2560, -2740, -2986, -3288, -3629, -3992, -4357, -4693, -4986, -5245, -5483, -5701, -5888, -6039, -6140, -6168, -6097, -5922, -5657, -5328, -4965, -4603, -4272, -3989, -3753, -3548, -3356, -3165, -2968, -2761, -2542, -2315, -2085, -1853, -1623, -1396, -1179, -976, -793, -639, -522, -461, -473, + -574, -773, -1071, -1472, -1966, -2528, -3129, -3752, -4396, -5048, -5693, -6329, -6964, -7592, -8190, -8737, -9229, -9660, -10013, -10274, -10447, -10549, -10585, -10551, -10454, -10316, -10155, -9975, -9774, -9567, -9365, -9163, -8940, -8691, -8416, -8114, -7774, -7397, -7002, -6611, -6230, -5862, -5520, -5217, -4957, -4737, -4556, -4418, -4324, -4270, -4244, -4240, -4256, -4287, -4320, -4341, -4347, -4337, -4302, -4230, -4117, -3967, -3783, -3554, -3275, -2953, -2593, -2192, -1744, -1253, -732, -187, 384, 980, 1587, 2191, 2792, 3392, 3974, 4519, 5025, 5495, 5915, 6262, 6531, 6725, 6829, 6817, 6684, 6435, 6055, 5523, 4851, 4061, 3156, 2151, + 1098, 54, -951, -1868, -2599, -3075, -3276, -3114, -2417, -1217, 30, 725, 692, 309, 39, -8, 12, 0, -12, 2, 9, -3, -7, 3, 5, -3, -4, 3, 3, -2, -2, 2, 2, -2, -2, 2, 1, -2, -1, 1, 0, -1, 0, 1, 0, -1, 0, 0 } + } +}; +const Word16 *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; + /* Sample Rate = 32000 */ const Word16 CRendBin_Combined_HRIR_max_num_iterations_32kHz = 1; -const UWord16 CRendBin_Combined_HRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; -const UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; -const UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz = 0; -const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[15]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; -const UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_Combined_HRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const Word16 CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const Word16 CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const Word16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz = 0; +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_Q_32kHz_fx = 0; +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; +const Word16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_Combined_HRIR_coeff_Q_32kHz_fx = 13; +const Word16 CRendBin_Combined_HRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {10018, 10185, 10541, 11028, 11305, 11001, 10420, 10353, 10723, 10251, 8401, 6806, 7463, 10015, 12273, 13170, 13701, 14890, 16369, 17343, 17714, 17607, 16722, 14912, 12840, 11438, 10999, 11168, 11604, 12297, 13384, 14904, 16684, 18352, 19523, 20041, 20037, 19745, 19312, 18750, 18020, 17146, 16269, 15567, 15111, 14846, 14669, 14482, 14193, 13752, 13196, 12617, 12088, 11633, 11252, 10942, 10697, 10513, 10369, 10218, 10011, 9729, 9360, 8862, 8186, 7337, 6383, 5419, 4545, 3845, 3366, 3094, 2991, 3016, 3132, 3287, 3433, 3538, 3593, 3611, 3614, 3619, 3636, 3678, 3765, 3908, 4101, 4340, 4628, 4961, 5307, 5632, 5910, 6126, 6262, 6305, + 6253, 6114, 5906, 5647, 5355, 5047, 4745, 4466, 4209, 3968, 3755, 3587, 3471, 3405, 3396, 3454, 3578, 3757, 3984, 4256, 4572, 4933, 5348, 5817, 6336, 6907, 7535, 8209, 8917, 9661, 10450, 11270, 12088, 12883, 13647, 14349, 14927, 15321, 15501, 15434, 15065, 14350, 13289, 11919, 10261, 8331, 6171, 3858, 1457, -1006, -3504, -5976, -8359, -10636, -12802, -14820, -16639, -18245, -19652, -20848, -21798, -22500, -22977, -23229 }, + {7936, 8091, 7127, 4886, 2744, 1406, 149, -1323, -2011, -1271, 57, 774, 409, -1150, -3844, -6760, -8417, -8332, -7426, -6531, -5495, -4123, -2968, -2519, -2418, -2085, -1521, -925, -47, 1443, 3280, 4882, 6098, 7186, 8113, 8381, 7663, 6275, 4855, 3737, 2831, 1962, 1096, 230, -704, -1722, -2704, -3523, -4165, -4662, -4990, -5102, -5005, -4746, -4355, -3864, -3319, -2737, -2093, -1376, -613, 161, 909, 1571, 2074, 2398, 2576, 2647, 2631, 2551, 2442, 2335, 2248, 2190, 2157, 2131, 2084, 1986, 1814, 1563, 1255, 924, 583, 230, -152, -593, -1120, -1726, -2356, -2939, -3408, -3702, -3775, -3617, -3253, -2739, + -2146, -1562, -1061, -675, -406, -238, -145, -80, 9, 163, 420, 824, 1408, 2168, 3064, 4020, 4938, 5696, 6178, 6300, 6013, 5305, 4195, 2745, 1041, -814, -2708, -4518, -6116, -7388, -8246, -8630, -8515, -7921, -6913, -5579, -4015, -2323, -603, 1060, 2605, 3980, 5133, 6020, 6614, 6893, 6838, 6452, 5761, 4812, 3665, 2399, 1114, -95, -1155, -2004, -2601, -2941, -3060, -3009, -2847, -2641, -2465, -2367 } + }, + { + {7936, 8091, 7127, 4886, 2744, 1406, 149, -1323, -2011, -1271, 57, 774, 409, -1150, -3844, -6760, -8417, -8332, -7426, -6531, -5495, -4123, -2968, -2519, -2418, -2085, -1521, -925, -47, 1443, 3280, 4882, 6098, 7186, 8113, 8381, 7663, 6275, 4855, 3737, 2831, 1962, 1096, 230, -704, -1722, -2704, -3523, -4165, -4662, -4990, -5102, -5005, -4746, -4355, -3864, -3319, -2737, -2093, -1376, -613, 161, 909, 1571, 2074, 2398, 2576, 2647, 2631, 2551, 2442, 2335, 2248, 2190, 2157, 2131, 2084, 1986, 1814, 1563, 1255, 924, 583, 230, -152, -593, -1120, -1726, -2356, -2939, -3408, -3702, -3775, -3617, -3253, -2739, + -2146, -1562, -1061, -675, -406, -238, -145, -80, 9, 163, 420, 824, 1408, 2168, 3064, 4020, 4938, 5696, 6178, 6300, 6013, 5305, 4195, 2745, 1041, -814, -2708, -4518, -6116, -7388, -8246, -8630, -8515, -7921, -6913, -5579, -4015, -2323, -603, 1060, 2605, 3980, 5133, 6020, 6614, 6893, 6838, 6452, 5761, 4812, 3665, 2399, 1114, -95, -1155, -2004, -2601, -2941, -3060, -3009, -2847, -2641, -2465, -2367 }, + {10018, 10185, 10541, 11028, 11305, 11001, 10420, 10353, 10723, 10251, 8401, 6806, 7463, 10015, 12273, 13170, 13701, 14890, 16369, 17343, 17714, 17607, 16722, 14912, 12840, 11438, 10999, 11168, 11604, 12297, 13384, 14904, 16684, 18352, 19523, 20041, 20037, 19745, 19312, 18750, 18020, 17146, 16269, 15567, 15111, 14846, 14669, 14482, 14193, 13752, 13196, 12617, 12088, 11633, 11252, 10942, 10697, 10513, 10369, 10218, 10011, 9729, 9360, 8862, 8186, 7337, 6383, 5419, 4545, 3845, 3366, 3094, 2991, 3016, 3132, 3287, 3433, 3538, 3593, 3611, 3614, 3619, 3636, 3678, 3765, 3908, 4101, 4340, 4628, 4961, 5307, 5632, 5910, 6126, 6262, 6305, + 6253, 6114, 5906, 5647, 5355, 5047, 4745, 4466, 4209, 3968, 3755, 3587, 3471, 3405, 3396, 3454, 3578, 3757, 3984, 4256, 4572, 4933, 5348, 5817, 6336, 6907, 7535, 8209, 8917, 9661, 10450, 11270, 12088, 12883, 13647, 14349, 14927, 15321, 15501, 15434, 15065, 14350, 13289, 11919, 10261, 8331, 6171, 3858, 1457, -1006, -3504, -5976, -8359, -10636, -12802, -14820, -16639, -18245, -19652, -20848, -21798, -22500, -22977, -23229 } + }, + { + {8842, 9388, 9873, 9372, 7908, 7051, 7930, 9019, 7786, 4609, 2964, 4987, 8680, 10671, 10336, 9799, 10720, 12594, 13938, 13941, 12804, 11240, 9941, 9229, 9033, 9210, 9783, 10794, 12090, 13356, 14267, 14575, 14231, 13458, 12554, 11598, 10495, 9288, 8265, 7706, 7659, 7968, 8400, 8726, 8800, 8634, 8351, 8032, 7658, 7188, 6646, 6108, 5639, 5254, 4924, 4625, 4349, 4091, 3821, 3521, 3220, 2968, 2776, 2613, 2456, 2321, 2233, 2194, 2183, 2184, 2201, 2253, 2352, 2493, 2660, 2835, 3013, 3192, 3375, 3566, 3765, 3959, 4140, 4310, 4483, 4667, 4858, 5040, 5203, 5340, 5440, 5479, 5432, 5289, 5056, 4751, + 4405, 4064, 3772, 3555, 3424, 3388, 3459, 3646, 3947, 4354, 4865, 5485, 6219, 7052, 7955, 8895, 9840, 10753, 11583, 12292, 12865, 13296, 13566, 13656, 13574, 13341, 12953, 12389, 11643, 10732, 9662, 8417, 7007, 5483, 3897, 2263, 591, -1080, -2696, -4245, -5746, -7198, -8574, -9867, -11102, -12289, -13400, -14404, -15303, -16097, -16757, -17238, -17532, -17658, -17621, -17414, -17057, -16603, -16109, -15608, -15132, -14731, -14454, -14318 }, + {8842, 9388, 9873, 9372, 7908, 7051, 7930, 9019, 7786, 4609, 2964, 4987, 8680, 10671, 10336, 9799, 10720, 12594, 13938, 13941, 12804, 11240, 9941, 9229, 9033, 9210, 9783, 10794, 12090, 13356, 14267, 14575, 14231, 13458, 12554, 11598, 10495, 9288, 8265, 7706, 7659, 7968, 8400, 8726, 8800, 8634, 8351, 8032, 7658, 7188, 6646, 6108, 5639, 5254, 4924, 4625, 4349, 4091, 3821, 3521, 3220, 2968, 2776, 2613, 2456, 2321, 2233, 2194, 2183, 2184, 2201, 2253, 2352, 2493, 2660, 2835, 3013, 3192, 3375, 3566, 3765, 3959, 4140, 4310, 4483, 4667, 4858, 5040, 5203, 5340, 5440, 5479, 5432, 5289, 5056, 4751, + 4405, 4064, 3772, 3555, 3424, 3388, 3459, 3646, 3947, 4354, 4865, 5485, 6219, 7052, 7955, 8895, 9840, 10753, 11583, 12292, 12865, 13296, 13566, 13656, 13574, 13341, 12953, 12389, 11643, 10732, 9662, 8417, 7007, 5483, 3897, 2263, 591, -1080, -2696, -4245, -5746, -7198, -8574, -9867, -11102, -12289, -13400, -14404, -15303, -16097, -16757, -17238, -17532, -17658, -17621, -17414, -17057, -16603, -16109, -15608, -15132, -14731, -14454, -14318 } + }, + { + {8558, 8447, 8746, 9544, 10467, 11442, 12498, 13064, 12609, 11759, 11552, 11812, 11494, 10459, 9609, 9322, 9032, 8414, 7813, 7378, 6791, 6033, 5545, 5485, 5560, 5627, 5803, 5951, 5712, 5097, 4517, 4198, 4003, 3842, 3822, 3984, 4242, 4583, 5071, 5660, 6195, 6583, 6820, 6913, 6889, 6836, 6857, 6996, 7272, 7686, 8191, 8684, 9071, 9291, 9299, 9086, 8708, 8242, 7726, 7170, 6596, 6027, 5465, 4913, 4394, 3935, 3552, 3255, 3059, 2962, 2949, 3008, 3127, 3290, 3492, 3740, 4048, 4425, 4879, 5428, 6090, 6870, 7762, 8753, 9831, 10991, 12215, 13465, 14691, 15843, 16853, 17633, 18108, 18259, 18101, 17636, + 16873, 15863, 14681, 13374, 11966, 10498, 9027, 7577, 6139, 4719, 3359, 2106, 984, 9, -793, -1407, -1851, -2164, -2375, -2495, -2532, -2502, -2424, -2306, -2155, -1991, -1837, -1702, -1579, -1456, -1326, -1185, -1025, -837, -626, -407, -199, -19, 120, 203, 209, 121, -61, -338, -719, -1220, -1835, -2545, -3334, -4189, -5082, -5969, -6815, -7607, -8338, -8991, -9555, -10041, -10461, -10815, -11093, -11298, -11441, -11518 }, + {7241, 6085, 3964, 1548, -389, -1715, -2826, -3770, -4098, -3705, -3135, -2848, -2708, -2470, -2248, -2135, -1770, -678, 1109, 3047, 4538, 5232, 5075, 4273, 3146, 1892, 574, -672, -1601, -2098, -2297, -2386, -2425, -2406, -2347, -2234, -1965, -1440, -673, 228, 1113, 1825, 2231, 2281, 2025, 1566, 1024, 522, 156, -48, -129, -147, -150, -167, -209, -269, -331, -383, -423, -457, -498, -566, -667, -792, -921, -1013, -1011, -859, -531, -48, 534, 1131, 1650, 2016, 2187, 2156, 1935, 1549, 1021, 376, -356, -1120, -1839, -2417, -2757, -2792, -2499, -1920, -1145, -289, 534, 1230, 1736, 2020, 2081, 1940, + 1640, 1232, 774, 323, -71, -375, -578, -686, -722, -711, -680, -648, -627, -620, -624, -627, -616, -569, -467, -299, -64, 224, 534, 830, 1073, 1233, 1293, 1246, 1095, 853, 537, 166, -233, -631, -993, -1283, -1467, -1519, -1423, -1187, -836, -411, 32, 439, 764, 980, 1079, 1072, 980, 832, 654, 466, 284, 118, -27, -147, -241, -307, -346, -362, -359, -345, -329, -319 } + }, + { + {7241, 6085, 3964, 1548, -389, -1715, -2826, -3770, -4098, -3705, -3135, -2848, -2708, -2470, -2248, -2135, -1770, -678, 1109, 3047, 4538, 5232, 5075, 4273, 3146, 1892, 574, -672, -1601, -2098, -2297, -2386, -2425, -2406, -2347, -2234, -1965, -1440, -673, 228, 1113, 1825, 2231, 2281, 2025, 1566, 1024, 522, 156, -48, -129, -147, -150, -167, -209, -269, -331, -383, -423, -457, -498, -566, -667, -792, -921, -1013, -1011, -859, -531, -48, 534, 1131, 1650, 2016, 2187, 2156, 1935, 1549, 1021, 376, -356, -1120, -1839, -2417, -2757, -2792, -2499, -1920, -1145, -289, 534, 1230, 1736, 2020, 2081, 1940, + 1640, 1232, 774, 323, -71, -375, -578, -686, -722, -711, -680, -648, -627, -620, -624, -627, -616, -569, -467, -299, -64, 224, 534, 830, 1073, 1233, 1293, 1246, 1095, 853, 537, 166, -233, -631, -993, -1283, -1467, -1519, -1423, -1187, -836, -411, 32, 439, 764, 980, 1079, 1072, 980, 832, 654, 466, 284, 118, -27, -147, -241, -307, -346, -362, -359, -345, -329, -319 }, + {8558, 8447, 8746, 9544, 10467, 11442, 12498, 13064, 12609, 11759, 11552, 11812, 11494, 10459, 9609, 9322, 9032, 8414, 7813, 7378, 6791, 6033, 5545, 5485, 5560, 5627, 5803, 5951, 5712, 5097, 4517, 4198, 4003, 3842, 3822, 3984, 4242, 4583, 5071, 5660, 6195, 6583, 6820, 6913, 6889, 6836, 6857, 6996, 7272, 7686, 8191, 8684, 9071, 9291, 9299, 9086, 8708, 8242, 7726, 7170, 6596, 6027, 5465, 4913, 4394, 3935, 3552, 3255, 3059, 2962, 2949, 3008, 3127, 3290, 3492, 3740, 4048, 4425, 4879, 5428, 6090, 6870, 7762, 8753, 9831, 10991, 12215, 13465, 14691, 15843, 16853, 17633, 18108, 18259, 18101, 17636, + 16873, 15863, 14681, 13374, 11966, 10498, 9027, 7577, 6139, 4719, 3359, 2106, 984, 9, -793, -1407, -1851, -2164, -2375, -2495, -2532, -2502, -2424, -2306, -2155, -1991, -1837, -1702, -1579, -1456, -1326, -1185, -1025, -837, -626, -407, -199, -19, 120, 203, 209, 121, -61, -338, -719, -1220, -1835, -2545, -3334, -4189, -5082, -5969, -6815, -7607, -8338, -8991, -9555, -10041, -10461, -10815, -11093, -11298, -11441, -11518 } + }, + { + {9315, 9149, 9457, 10550, 11928, 12942, 13487, 13694, 13388, 12439, 11390, 10975, 11065, 10825, 10014, 9356, 9366, 9560, 9290, 8718, 8397, 8356, 8221, 7929, 7756, 7774, 7769, 7647, 7553, 7613, 7795, 8011, 8189, 8262, 8234, 8211, 8311, 8556, 8920, 9378, 9888, 10387, 10843, 11264, 11635, 11918, 12108, 12243, 12361, 12478, 12605, 12735, 12842, 12896, 12876, 12766, 12561, 12279, 11936, 11528, 11050, 10529, 9995, 9448, 8879, 8305, 7748, 7202, 6662, 6153, 5716, 5372, 5136, 5025, 5047, 5192, 5448, 5805, 6252, 6779, 7388, 8080, 8839, 9652, 10525, 11469, 12470, 13500, 14542, 15583, 16590, 17503, 18270, 18859, 19239, 19368, + 19207, 18760, 18059, 17125, 15961, 14592, 13081, 11479, 9801, 8063, 6323, 4645, 3057, 1568, 222, -926, -1862, -2612, -3191, -3599, -3856, -4000, -4062, -4052, -3980, -3870, -3746, -3624, -3506, -3390, -3281, -3180, -3074, -2940, -2766, -2561, -2340, -2106, -1868, -1648, -1478, -1378, -1356, -1429, -1621, -1950, -2422, -3031, -3774, -4651, -5649, -6735, -7868, -9023, -10176, -11283, -12297, -13199, -13991, -14659, -15181, -15561, -15819, -15957 }, + {7418, 5560, 2551, -608, -3208, -5059, -6116, -6074, -4626, -2086, 582, 2488, 3422, 3686, 3545, 3017, 2100, 979, -74, -937, -1672, -2304, -2665, -2550, -1983, -1198, -378, 449, 1245, 1852, 2125, 2063, 1746, 1230, 567, -153, -826, -1366, -1686, -1719, -1491, -1109, -668, -200, 286, 754, 1157, 1441, 1541, 1407, 1043, 512, -91, -665, -1107, -1343, -1358, -1188, -894, -536, -170, 175, 499, 802, 1072, 1273, 1355, 1259, 938, 387, -338, -1118, -1777, -2132, -2048, -1507, -627, 379, 1267, 1842, 2013, 1801, 1298, 628, -85, -728, -1211, -1465, -1454, -1189, -735, -198, 308, 692, 898, 921, + 794, 574, 318, 74, -126, -267, -350, -384, -381, -354, -311, -254, -184, -96, 12, 136, 263, 372, 439, 442, 373, 237, 55, -139, -308, -421, -459, -419, -316, -175, -23, 116, 225, 295, 323, 312, 267, 194, 102, 1, -99, -185, -247, -274, -264, -217, -142, -51, 37, 111, 160, 180, 176, 153, 120, 83, 47, 13, -17, -43, -66, -84, -97, -104 } + }, + { + {7418, 5560, 2551, -608, -3208, -5059, -6116, -6074, -4626, -2086, 582, 2488, 3422, 3686, 3545, 3017, 2100, 979, -74, -937, -1672, -2304, -2665, -2550, -1983, -1198, -378, 449, 1245, 1852, 2125, 2063, 1746, 1230, 567, -153, -826, -1366, -1686, -1719, -1491, -1109, -668, -200, 286, 754, 1157, 1441, 1541, 1407, 1043, 512, -91, -665, -1107, -1343, -1358, -1188, -894, -536, -170, 175, 499, 802, 1072, 1273, 1355, 1259, 938, 387, -338, -1118, -1777, -2132, -2048, -1507, -627, 379, 1267, 1842, 2013, 1801, 1298, 628, -85, -728, -1211, -1465, -1454, -1189, -735, -198, 308, 692, 898, 921, + 794, 574, 318, 74, -126, -267, -350, -384, -381, -354, -311, -254, -184, -96, 12, 136, 263, 372, 439, 442, 373, 237, 55, -139, -308, -421, -459, -419, -316, -175, -23, 116, 225, 295, 323, 312, 267, 194, 102, 1, -99, -185, -247, -274, -264, -217, -142, -51, 37, 111, 160, 180, 176, 153, 120, 83, 47, 13, -17, -43, -66, -84, -97, -104 }, + {9315, 9149, 9457, 10550, 11928, 12942, 13487, 13694, 13388, 12439, 11390, 10975, 11065, 10825, 10014, 9356, 9366, 9560, 9290, 8718, 8397, 8356, 8221, 7929, 7756, 7774, 7769, 7647, 7553, 7613, 7795, 8011, 8189, 8262, 8234, 8211, 8311, 8556, 8920, 9378, 9888, 10387, 10843, 11264, 11635, 11918, 12108, 12243, 12361, 12478, 12605, 12735, 12842, 12896, 12876, 12766, 12561, 12279, 11936, 11528, 11050, 10529, 9995, 9448, 8879, 8305, 7748, 7202, 6662, 6153, 5716, 5372, 5136, 5025, 5047, 5192, 5448, 5805, 6252, 6779, 7388, 8080, 8839, 9652, 10525, 11469, 12470, 13500, 14542, 15583, 16590, 17503, 18270, 18859, 19239, 19368, + 19207, 18760, 18059, 17125, 15961, 14592, 13081, 11479, 9801, 8063, 6323, 4645, 3057, 1568, 222, -926, -1862, -2612, -3191, -3599, -3856, -4000, -4062, -4052, -3980, -3870, -3746, -3624, -3506, -3390, -3281, -3180, -3074, -2940, -2766, -2561, -2340, -2106, -1868, -1648, -1478, -1378, -1356, -1429, -1621, -1950, -2422, -3031, -3774, -4651, -5649, -6735, -7868, -9023, -10176, -11283, -12297, -13199, -13991, -14659, -15181, -15561, -15819, -15957 } + }, + { + {9365, 9643, 10001, 10688, 12053, 13523, 13997, 13400, 12762, 12526, 11939, 10590, 9393, 9296, 9901, 10238, 10222, 10424, 10870, 11032, 10830, 10774, 11078, 11308, 11048, 10424, 9852, 9565, 9534, 9598, 9597, 9538, 9658, 10184, 11035, 11880, 12491, 12886, 13166, 13359, 13461, 13524, 13632, 13836, 14133, 14490, 14861, 15216, 15535, 15784, 15910, 15876, 15688, 15376, 14973, 14515, 14056, 13638, 13273, 12938, 12601, 12229, 11774, 11183, 10423, 9503, 8465, 7365, 6266, 5242, 4358, 3647, 3114, 2761, 2599, 2623, 2808, 3122, 3544, 4067, 4685, 5386, 6152, 6962, 7790, 8610, 9390, 10117, 10804, 11486, 12181, 12880, 13569, 14238, 14860, 15374, + 15709, 15824, 15695, 15286, 14557, 13510, 12203, 10697, 9036, 7280, 5522, 3840, 2260, 781, -582, -1807, -2907, -3920, -4858, -5702, -6432, -7056, -7576, -7971, -8228, -8365, -8416, -8393, -8299, -8143, -7946, -7718, -7451, -7137, -6787, -6422, -6059, -5702, -5360, -5052, -4796, -4598, -4461, -4394, -4420, -4557, -4811, -5183, -5681, -6308, -7049, -7871, -8737, -9625, -10506, -11336, -12079, -12727, -13285, -13744, -14093, -14342, -14513, -14605 }, + {7514, 5337, 1976, -1468, -4399, -6445, -7057, -5794, -2963, 382, 3174, 4941, 5674, 5382, 3996, 1659, -1078, -3470, -4948, -5289, -4524, -2808, -454, 2001, 3905, 4779, 4508, 3283, 1430, -656, -2517, -3724, -4031, -3428, -2098, -366, 1333, 2568, 3092, 2909, 2182, 1115, -82, -1177, -1957, -2284, -2131, -1563, -724, 186, 962, 1456, 1616, 1470, 1089, 562, -8, -522, -900, -1102, -1119, -964, -673, -298, 105, 488, 811, 1035, 1116, 1015, 702, 187, -443, -1031, -1401, -1432, -1105, -512, 176, 772, 1141, 1235, 1090, 775, 361, -94, -539, -915, -1147, -1160, -912, -428, 179, 744, 1110, 1186, + 980, 576, 97, -344, -667, -833, -839, -706, -470, -175, 139, 430, 657, 781, 770, 609, 308, -83, -483, -790, -917, -821, -522, -103, 320, 638, 780, 735, 538, 253, -48, -303, -474, -543, -513, -400, -230, -33, 162, 324, 427, 455, 402, 278, 103, -88, -260, -381, -427, -391, -283, -125, 49, 204, 310, 351, 326, 249, 140, 23, -84, -168, -224, -253 } + }, + { + {7514, 5337, 1976, -1468, -4399, -6445, -7057, -5794, -2963, 382, 3174, 4941, 5674, 5382, 3996, 1659, -1078, -3470, -4948, -5289, -4524, -2808, -454, 2001, 3905, 4779, 4508, 3283, 1430, -656, -2517, -3724, -4031, -3428, -2098, -366, 1333, 2568, 3092, 2909, 2182, 1115, -82, -1177, -1957, -2284, -2131, -1563, -724, 186, 962, 1456, 1616, 1470, 1089, 562, -8, -522, -900, -1102, -1119, -964, -673, -298, 105, 488, 811, 1035, 1116, 1015, 702, 187, -443, -1031, -1401, -1432, -1105, -512, 176, 772, 1141, 1235, 1090, 775, 361, -94, -539, -915, -1147, -1160, -912, -428, 179, 744, 1110, 1186, + 980, 576, 97, -344, -667, -833, -839, -706, -470, -175, 139, 430, 657, 781, 770, 609, 308, -83, -483, -790, -917, -821, -522, -103, 320, 638, 780, 735, 538, 253, -48, -303, -474, -543, -513, -400, -230, -33, 162, 324, 427, 455, 402, 278, 103, -88, -260, -381, -427, -391, -283, -125, 49, 204, 310, 351, 326, 249, 140, 23, -84, -168, -224, -253 }, + {9365, 9643, 10001, 10688, 12053, 13523, 13997, 13400, 12762, 12526, 11939, 10590, 9393, 9296, 9901, 10238, 10222, 10424, 10870, 11032, 10830, 10774, 11078, 11308, 11048, 10424, 9852, 9565, 9534, 9598, 9597, 9538, 9658, 10184, 11035, 11880, 12491, 12886, 13166, 13359, 13461, 13524, 13632, 13836, 14133, 14490, 14861, 15216, 15535, 15784, 15910, 15876, 15688, 15376, 14973, 14515, 14056, 13638, 13273, 12938, 12601, 12229, 11774, 11183, 10423, 9503, 8465, 7365, 6266, 5242, 4358, 3647, 3114, 2761, 2599, 2623, 2808, 3122, 3544, 4067, 4685, 5386, 6152, 6962, 7790, 8610, 9390, 10117, 10804, 11486, 12181, 12880, 13569, 14238, 14860, 15374, + 15709, 15824, 15695, 15286, 14557, 13510, 12203, 10697, 9036, 7280, 5522, 3840, 2260, 781, -582, -1807, -2907, -3920, -4858, -5702, -6432, -7056, -7576, -7971, -8228, -8365, -8416, -8393, -8299, -8143, -7946, -7718, -7451, -7137, -6787, -6422, -6059, -5702, -5360, -5052, -4796, -4598, -4461, -4394, -4420, -4557, -4811, -5183, -5681, -6308, -7049, -7871, -8737, -9625, -10506, -11336, -12079, -12727, -13285, -13744, -14093, -14342, -14513, -14605 } + }, + { + {9689, 9681, 9576, 9312, 8917, 8411, 7750, 7085, 6999, 8059, 10041, 11975, 13072, 13253, 12758, 11776, 10657, 9907, 9712, 9856, 10250, 11067, 12185, 13038, 13241, 12946, 12455, 11928, 11591, 11749, 12396, 13198, 13967, 14792, 15637, 16207, 16327, 16137, 15823, 15439, 15030, 14683, 14392, 14077, 13735, 13432, 13184, 12971, 12809, 12697, 12568, 12379, 12191, 12064, 11970, 11861, 11735, 11589, 11380, 11093, 10771, 10456, 10156, 9864, 9581, 9287, 8950, 8541, 8034, 7420, 6722, 5978, 5198, 4383, 3570, 2803, 2089, 1406, 767, 208, -259, -642, -931, -1114, -1209, -1257, -1280, -1285, -1280, -1284, -1308, -1357, -1423, -1492, -1553, -1610, + -1666, -1714, -1753, -1800, -1864, -1935, -2002, -2070, -2138, -2189, -2207, -2191, -2142, -2058, -1937, -1785, -1608, -1413, -1207, -996, -782, -567, -352, -138, 79, 298, 516, 734, 960, 1198, 1451, 1721, 2008, 2305, 2603, 2891, 3147, 3345, 3471, 3518, 3472, 3320, 3060, 2707, 2264, 1731, 1118, 453, -244, -966, -1700, -2423, -3114, -3772, -4394, -4969, -5486, -5944, -6344, -6685, -6959, -7165, -7305, -7376 }, + {8847, 8181, 6970, 5183, 2933, 1018, 506, 1591, 3257, 4130, 3419, 1236, -1468, -3401, -3914, -3521, -3193, -3342, -3836, -4625, -5721, -6732, -7050, -6575, -5825, -5296, -5051, -4920, -4739, -4352, -3640, -2617, -1428, -236, 805, 1578, 2098, 2536, 3047, 3636, 4213, 4702, 5064, 5294, 5427, 5505, 5522, 5445, 5273, 5027, 4705, 4295, 3792, 3190, 2468, 1631, 733, -178, -1083, -1964, -2783, -3513, -4147, -4674, -5077, -5364, -5555, -5647, -5612, -5428, -5096, -4631, -4059, -3417, -2735, -2027, -1294, -547, 193, 902, 1562, 2157, 2674, 3095, 3403, 3594, 3674, 3655, 3551, 3382, 3163, 2902, 2603, 2283, 1960, 1639, + 1325, 1025, 750, 503, 284, 98, -53, -174, -278, -368, -450, -532, -621, -721, -833, -959, -1104, -1270, -1455, -1657, -1866, -2075, -2272, -2442, -2575, -2665, -2706, -2688, -2601, -2443, -2214, -1912, -1535, -1096, -608, -76, 494, 1088, 1689, 2285, 2866, 3410, 3893, 4301, 4621, 4832, 4908, 4838, 4616, 4237, 3698, 3014, 2213, 1320, 365, -613, -1570, -2472, -3292, -4006, -4592, -5037, -5339, -5494 } + }, + { + {8847, 8181, 6970, 5183, 2933, 1018, 506, 1591, 3257, 4130, 3419, 1236, -1468, -3401, -3914, -3521, -3193, -3342, -3836, -4625, -5721, -6732, -7050, -6575, -5825, -5296, -5051, -4920, -4739, -4352, -3640, -2617, -1428, -236, 805, 1578, 2098, 2536, 3047, 3636, 4213, 4702, 5064, 5294, 5427, 5505, 5522, 5445, 5273, 5027, 4705, 4295, 3792, 3190, 2468, 1631, 733, -178, -1083, -1964, -2783, -3513, -4147, -4674, -5077, -5364, -5555, -5647, -5612, -5428, -5096, -4631, -4059, -3417, -2735, -2027, -1294, -547, 193, 902, 1562, 2157, 2674, 3095, 3403, 3594, 3674, 3655, 3551, 3382, 3163, 2902, 2603, 2283, 1960, 1639, + 1325, 1025, 750, 503, 284, 98, -53, -174, -278, -368, -450, -532, -621, -721, -833, -959, -1104, -1270, -1455, -1657, -1866, -2075, -2272, -2442, -2575, -2665, -2706, -2688, -2601, -2443, -2214, -1912, -1535, -1096, -608, -76, 494, 1088, 1689, 2285, 2866, 3410, 3893, 4301, 4621, 4832, 4908, 4838, 4616, 4237, 3698, 3014, 2213, 1320, 365, -613, -1570, -2472, -3292, -4006, -4592, -5037, -5339, -5494 }, + {9689, 9681, 9576, 9312, 8917, 8411, 7750, 7085, 6999, 8059, 10041, 11975, 13072, 13253, 12758, 11776, 10657, 9907, 9712, 9856, 10250, 11067, 12185, 13038, 13241, 12946, 12455, 11928, 11591, 11749, 12396, 13198, 13967, 14792, 15637, 16207, 16327, 16137, 15823, 15439, 15030, 14683, 14392, 14077, 13735, 13432, 13184, 12971, 12809, 12697, 12568, 12379, 12191, 12064, 11970, 11861, 11735, 11589, 11380, 11093, 10771, 10456, 10156, 9864, 9581, 9287, 8950, 8541, 8034, 7420, 6722, 5978, 5198, 4383, 3570, 2803, 2089, 1406, 767, 208, -259, -642, -931, -1114, -1209, -1257, -1280, -1285, -1280, -1284, -1308, -1357, -1423, -1492, -1553, -1610, + -1666, -1714, -1753, -1800, -1864, -1935, -2002, -2070, -2138, -2189, -2207, -2191, -2142, -2058, -1937, -1785, -1608, -1413, -1207, -996, -782, -567, -352, -138, 79, 298, 516, 734, 960, 1198, 1451, 1721, 2008, 2305, 2603, 2891, 3147, 3345, 3471, 3518, 3472, 3320, 3060, 2707, 2264, 1731, 1118, 453, -244, -966, -1700, -2423, -3114, -3772, -4394, -4969, -5486, -5944, -6344, -6685, -6959, -7165, -7305, -7376 } + }, + { + {9186, 9178, 9375, 10057, 11045, 11501, 10833, 9627, 9000, 9156, 9367, 9318, 9565, 10485, 11573, 12178, 12296, 12253, 12064, 11550, 10783, 10033, 9424, 8894, 8396, 7957, 7592, 7267, 6941, 6589, 6239, 5971, 5835, 5774, 5690, 5560, 5437, 5389, 5454, 5641, 5918, 6232, 6557, 6900, 7257, 7603, 7913, 8176, 8368, 8465, 8471, 8423, 8371, 8364, 8434, 8589, 8816, 9092, 9386, 9646, 9824, 9902, 9885, 9770, 9559, 9279, 8974, 8663, 8342, 8008, 7670, 7320, 6939, 6517, 6062, 5588, 5105, 4624, 4168, 3764, 3427, 3145, 2899, 2676, 2471, 2273, 2076, 1894, 1761, 1701, 1725, 1837, 2039, 2329, 2696, 3132, + 3631, 4187, 4793, 5430, 6070, 6675, 7221, 7691, 8064, 8318, 8449, 8468, 8379, 8173, 7850, 7433, 6944, 6384, 5759, 5094, 4418, 3743, 3069, 2403, 1762, 1151, 552, -49, -649, -1240, -1829, -2429, -3034, -3622, -4176, -4700, -5190, -5623, -5981, -6271, -6507, -6689, -6813, -6894, -6956, -7015, -7075, -7139, -7224, -7341, -7490, -7663, -7857, -8077, -8319, -8567, -8807, -9037, -9256, -9454, -9613, -9733, -9819, -9868 }, + {7865, 6683, 4356, 1329, -1458, -3167, -3761, -3966, -4433, -5037, -5104, -4236, -2744, -1248, -39, 1048, 2230, 3409, 4243, 4462, 4083, 3348, 2503, 1635, 688, -384, -1501, -2497, -3238, -3655, -3698, -3332, -2599, -1640, -620, 339, 1168, 1814, 2236, 2431, 2427, 2266, 1989, 1627, 1202, 727, 211, -328, -869, -1388, -1852, -2211, -2409, -2395, -2151, -1695, -1071, -337, 449, 1221, 1904, 2420, 2705, 2725, 2475, 1985, 1300, 481, -401, -1266, -2017, -2553, -2786, -2674, -2234, -1547, -734, 74, 763, 1264, 1562, 1679, 1655, 1529, 1326, 1064, 753, 401, 23, -356, -703, -979, -1155, -1218, -1176, -1045, + -848, -610, -350, -84, 176, 418, 633, 808, 932, 992, 981, 893, 730, 500, 220, -84, -385, -653, -862, -990, -1026, -968, -824, -612, -352, -69, 216, 480, 703, 864, 947, 940, 840, 654, 401, 113, -174, -426, -614, -722, -747, -697, -589, -444, -282, -121, 28, 155, 259, 337, 391, 421, 427, 410, 368, 302, 215, 111, -5, -122, -232, -325, -392, -427 } + }, + { + {7865, 6683, 4356, 1329, -1458, -3167, -3761, -3966, -4433, -5037, -5104, -4236, -2744, -1248, -39, 1048, 2230, 3409, 4243, 4462, 4083, 3348, 2503, 1635, 688, -384, -1501, -2497, -3238, -3655, -3698, -3332, -2599, -1640, -620, 339, 1168, 1814, 2236, 2431, 2427, 2266, 1989, 1627, 1202, 727, 211, -328, -869, -1388, -1852, -2211, -2409, -2395, -2151, -1695, -1071, -337, 449, 1221, 1904, 2420, 2705, 2725, 2475, 1985, 1300, 481, -401, -1266, -2017, -2553, -2786, -2674, -2234, -1547, -734, 74, 763, 1264, 1562, 1679, 1655, 1529, 1326, 1064, 753, 401, 23, -356, -703, -979, -1155, -1218, -1176, -1045, + -848, -610, -350, -84, 176, 418, 633, 808, 932, 992, 981, 893, 730, 500, 220, -84, -385, -653, -862, -990, -1026, -968, -824, -612, -352, -69, 216, 480, 703, 864, 947, 940, 840, 654, 401, 113, -174, -426, -614, -722, -747, -697, -589, -444, -282, -121, 28, 155, 259, 337, 391, 421, 427, 410, 368, 302, 215, 111, -5, -122, -232, -325, -392, -427 }, + {9186, 9178, 9375, 10057, 11045, 11501, 10833, 9627, 9000, 9156, 9367, 9318, 9565, 10485, 11573, 12178, 12296, 12253, 12064, 11550, 10783, 10033, 9424, 8894, 8396, 7957, 7592, 7267, 6941, 6589, 6239, 5971, 5835, 5774, 5690, 5560, 5437, 5389, 5454, 5641, 5918, 6232, 6557, 6900, 7257, 7603, 7913, 8176, 8368, 8465, 8471, 8423, 8371, 8364, 8434, 8589, 8816, 9092, 9386, 9646, 9824, 9902, 9885, 9770, 9559, 9279, 8974, 8663, 8342, 8008, 7670, 7320, 6939, 6517, 6062, 5588, 5105, 4624, 4168, 3764, 3427, 3145, 2899, 2676, 2471, 2273, 2076, 1894, 1761, 1701, 1725, 1837, 2039, 2329, 2696, 3132, + 3631, 4187, 4793, 5430, 6070, 6675, 7221, 7691, 8064, 8318, 8449, 8468, 8379, 8173, 7850, 7433, 6944, 6384, 5759, 5094, 4418, 3743, 3069, 2403, 1762, 1151, 552, -49, -649, -1240, -1829, -2429, -3034, -3622, -4176, -4700, -5190, -5623, -5981, -6271, -6507, -6689, -6813, -6894, -6956, -7015, -7075, -7139, -7224, -7341, -7490, -7663, -7857, -8077, -8319, -8567, -8807, -9037, -9256, -9454, -9613, -9733, -9819, -9868 } + }, + { + {8652, 8601, 8778, 9377, 10154, 10564, 10311, 9653, 9042, 8621, 8288, 8116, 8351, 9006, 9739, 10231, 10434, 10400, 10087, 9505, 8862, 8395, 8117, 7870, 7548, 7171, 6780, 6376, 5956, 5539, 5129, 4707, 4259, 3800, 3357, 2964, 2674, 2545, 2593, 2777, 3034, 3328, 3642, 3950, 4220, 4434, 4598, 4730, 4844, 4952, 5071, 5214, 5384, 5576, 5770, 5938, 6058, 6117, 6104, 6012, 5849, 5639, 5405, 5144, 4849, 4514, 4140, 3723, 3265, 2792, 2341, 1948, 1636, 1417, 1291, 1243, 1241, 1257, 1273, 1282, 1289, 1298, 1318, 1354, 1414, 1502, 1619, 1767, 1950, 2172, 2435, 2743, 3096, 3500, 3955, 4454, + 4978, 5508, 6025, 6505, 6920, 7247, 7485, 7642, 7722, 7721, 7643, 7501, 7293, 7005, 6629, 6178, 5665, 5095, 4471, 3818, 3163, 2517, 1882, 1267, 691, 163, -326, -786, -1214, -1609, -1985, -2360, -2736, -3102, -3452, -3785, -4093, -4355, -4557, -4704, -4805, -4864, -4881, -4868, -4844, -4819, -4799, -4789, -4802, -4850, -4935, -5053, -5203, -5389, -5606, -5843, -6084, -6325, -6560, -6775, -6955, -7093, -7191, -7245 }, + {7642, 7014, 5574, 3413, 1215, -195, -716, -1103, -2008, -3162, -3871, -4039, -4200, -4646, -5058, -5048, -4594, -3821, -2758, -1487, -262, 736, 1571, 2368, 3095, 3651, 4028, 4274, 4376, 4266, 3895, 3263, 2427, 1501, 593, -257, -1054, -1765, -2318, -2665, -2818, -2822, -2731, -2594, -2447, -2299, -2150, -2000, -1824, -1571, -1187, -653, 13, 759, 1504, 2166, 2699, 3095, 3363, 3498, 3484, 3303, 2936, 2382, 1666, 845, -15, -851, -1617, -2283, -2836, -3263, -3539, -3626, -3495, -3137, -2582, -1888, -1134, -392, 285, 875, 1365, 1752, 2038, 2231, 2339, 2368, 2324, 2216, 2050, 1827, 1548, 1212, 817, 364, + -138, -663, -1177, -1650, -2048, -2342, -2513, -2551, -2456, -2229, -1884, -1443, -934, -382, 179, 716, 1199, 1603, 1907, 2096, 2165, 2119, 1967, 1722, 1403, 1034, 633, 219, -187, -562, -889, -1151, -1335, -1430, -1439, -1371, -1239, -1060, -855, -644, -439, -249, -79, 72, 208, 333, 449, 558, 659, 747, 815, 854, 855, 812, 720, 579, 394, 177, -59, -296, -515, -698, -830, -899 } + }, + { + {7642, 7014, 5574, 3413, 1215, -195, -716, -1103, -2008, -3162, -3871, -4039, -4200, -4646, -5058, -5048, -4594, -3821, -2758, -1487, -262, 736, 1571, 2368, 3095, 3651, 4028, 4274, 4376, 4266, 3895, 3263, 2427, 1501, 593, -257, -1054, -1765, -2318, -2665, -2818, -2822, -2731, -2594, -2447, -2299, -2150, -2000, -1824, -1571, -1187, -653, 13, 759, 1504, 2166, 2699, 3095, 3363, 3498, 3484, 3303, 2936, 2382, 1666, 845, -15, -851, -1617, -2283, -2836, -3263, -3539, -3626, -3495, -3137, -2582, -1888, -1134, -392, 285, 875, 1365, 1752, 2038, 2231, 2339, 2368, 2324, 2216, 2050, 1827, 1548, 1212, 817, 364, + -138, -663, -1177, -1650, -2048, -2342, -2513, -2551, -2456, -2229, -1884, -1443, -934, -382, 179, 716, 1199, 1603, 1907, 2096, 2165, 2119, 1967, 1722, 1403, 1034, 633, 219, -187, -562, -889, -1151, -1335, -1430, -1439, -1371, -1239, -1060, -855, -644, -439, -249, -79, 72, 208, 333, 449, 558, 659, 747, 815, 854, 855, 812, 720, 579, 394, 177, -59, -296, -515, -698, -830, -899 }, + {8652, 8601, 8778, 9377, 10154, 10564, 10311, 9653, 9042, 8621, 8288, 8116, 8351, 9006, 9739, 10231, 10434, 10400, 10087, 9505, 8862, 8395, 8117, 7870, 7548, 7171, 6780, 6376, 5956, 5539, 5129, 4707, 4259, 3800, 3357, 2964, 2674, 2545, 2593, 2777, 3034, 3328, 3642, 3950, 4220, 4434, 4598, 4730, 4844, 4952, 5071, 5214, 5384, 5576, 5770, 5938, 6058, 6117, 6104, 6012, 5849, 5639, 5405, 5144, 4849, 4514, 4140, 3723, 3265, 2792, 2341, 1948, 1636, 1417, 1291, 1243, 1241, 1257, 1273, 1282, 1289, 1298, 1318, 1354, 1414, 1502, 1619, 1767, 1950, 2172, 2435, 2743, 3096, 3500, 3955, 4454, + 4978, 5508, 6025, 6505, 6920, 7247, 7485, 7642, 7722, 7721, 7643, 7501, 7293, 7005, 6629, 6178, 5665, 5095, 4471, 3818, 3163, 2517, 1882, 1267, 691, 163, -326, -786, -1214, -1609, -1985, -2360, -2736, -3102, -3452, -3785, -4093, -4355, -4557, -4704, -4805, -4864, -4881, -4868, -4844, -4819, -4799, -4789, -4802, -4850, -4935, -5053, -5203, -5389, -5606, -5843, -6084, -6325, -6560, -6775, -6955, -7093, -7191, -7245 } + } +}; +const Word16 CRendBin_Combined_HRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {186, 534, 772, 709, 231, -282, -222, 225, 67, -802, -804, 1310, 4332, 5880, 5419, 4547, 4413, 4409, 3617, 2155, 535, -1189, -2944, -4062, -3913, -2725, -1285, -83, 906, 1826, 2622, 3058, 2863, 1922, 411, -1287, -2848, -4167, -5300, -6313, -7185, -7810, -8117, -8170, -8141, -8175, -8339, -8638, -9033, -9428, -9716, -9859, -9890, -9858, -9798, -9732, -9683, -9675, -9741, -9903, -10143, -10432, -10761, -11120, -11447, -11640, -11618, -11349, -10843, -10155, -9378, -8600, -7878, -7241, -6714, -6306, -6004, -5771, -5567, -5361, -5137, -4893, -4631, -4348, -4051, -3761, -3498, -3268, -3085, -2975, -2962, -3043, -3205, -3433, -3711, -4014, + -4313, -4581, -4798, -4952, -5038, -5050, -4991, -4875, -4717, -4515, -4261, -3961, -3631, -3278, -2903, -2519, -2145, -1791, -1458, -1148, -862, -597, -360, -162, -12, 88, 123, 75, -59, -279, -604, -1068, -1689, -2462, -3403, -4544, -5895, -7430, -9116, -10933, -12850, -14791, -16665, -18411, -19993, -21359, -22443, -23212, -23675, -23842, -23697, -23225, -22457, -21435, -20166, -18645, -16904, -14999, -12951, -10762, -8459, -6093, -3687, -1237 }, + {-658, -2552, -4977, -6488, -6563, -6233, -6057, -5297, -3666, -2300, -2290, -3471, -5106, -6597, -7117, -5832, -3071, -302, 1536, 2786, 3890, 4518, 4409, 4124, 4298, 4812, 5282, 5781, 6476, 7006, 6835, 5980, 4864, 3584, 1840, -393, -2556, -4024, -4719, -5018, -5248, -5450, -5574, -5637, -5627, -5431, -4967, -4296, -3522, -2667, -1723, -743, 195, 1051, 1808, 2445, 2966, 3403, 3767, 4022, 4132, 4085, 3868, 3476, 2956, 2393, 1850, 1349, 899, 519, 214, -30, -233, -420, -620, -854, -1129, -1441, -1764, -2062, -2304, -2489, -2633, -2754, -2862, -2950, -2978, -2883, -2614, -2158, -1532, -776, 44, 844, 1542, 2079, + 2418, 2558, 2542, 2438, 2306, 2191, 2136, 2170, 2293, 2491, 2744, 3015, 3238, 3327, 3199, 2787, 2054, 999, -322, -1817, -3373, -4870, -6187, -7214, -7864, -8082, -7835, -7114, -5951, -4414, -2603, -634, 1357, 3233, 4878, 6207, 7166, 7729, 7897, 7701, 7177, 6360, 5292, 4027, 2625, 1143, -351, -1776, -3051, -4110, -4896, -5361, -5490, -5308, -4861, -4210, -3437, -2636, -1888, -1246, -743, -394, -179, -51 } + }, + { + {-658, -2552, -4977, -6488, -6563, -6233, -6057, -5297, -3666, -2300, -2290, -3471, -5106, -6597, -7117, -5832, -3071, -302, 1536, 2786, 3890, 4518, 4409, 4124, 4298, 4812, 5282, 5781, 6476, 7006, 6835, 5980, 4864, 3584, 1840, -393, -2556, -4024, -4719, -5018, -5248, -5450, -5574, -5637, -5627, -5431, -4967, -4296, -3522, -2667, -1723, -743, 195, 1051, 1808, 2445, 2966, 3403, 3767, 4022, 4132, 4085, 3868, 3476, 2956, 2393, 1850, 1349, 899, 519, 214, -30, -233, -420, -620, -854, -1129, -1441, -1764, -2062, -2304, -2489, -2633, -2754, -2862, -2950, -2978, -2883, -2614, -2158, -1532, -776, 44, 844, 1542, 2079, + 2418, 2558, 2542, 2438, 2306, 2191, 2136, 2170, 2293, 2491, 2744, 3015, 3238, 3327, 3199, 2787, 2054, 999, -322, -1817, -3373, -4870, -6187, -7214, -7864, -8082, -7835, -7114, -5951, -4414, -2603, -634, 1357, 3233, 4878, 6207, 7166, 7729, 7897, 7701, 7177, 6360, 5292, 4027, 2625, 1143, -351, -1776, -3051, -4110, -4896, -5361, -5490, -5308, -4861, -4210, -3437, -2636, -1888, -1246, -743, -394, -179, -51 }, + {186, 534, 772, 709, 231, -282, -222, 225, 67, -802, -804, 1310, 4332, 5880, 5419, 4547, 4413, 4409, 3617, 2155, 535, -1189, -2944, -4062, -3913, -2725, -1285, -83, 906, 1826, 2622, 3058, 2863, 1922, 411, -1287, -2848, -4167, -5300, -6313, -7185, -7810, -8117, -8170, -8141, -8175, -8339, -8638, -9033, -9428, -9716, -9859, -9890, -9858, -9798, -9732, -9683, -9675, -9741, -9903, -10143, -10432, -10761, -11120, -11447, -11640, -11618, -11349, -10843, -10155, -9378, -8600, -7878, -7241, -6714, -6306, -6004, -5771, -5567, -5361, -5137, -4893, -4631, -4348, -4051, -3761, -3498, -3268, -3085, -2975, -2962, -3043, -3205, -3433, -3711, -4014, + -4313, -4581, -4798, -4952, -5038, -5050, -4991, -4875, -4717, -4515, -4261, -3961, -3631, -3278, -2903, -2519, -2145, -1791, -1458, -1148, -862, -597, -360, -162, -12, 88, 123, 75, -59, -279, -604, -1068, -1689, -2462, -3403, -4544, -5895, -7430, -9116, -10933, -12850, -14791, -16665, -18411, -19993, -21359, -22443, -23212, -23675, -23842, -23697, -23225, -22457, -21435, -20166, -18645, -16904, -14999, -12951, -10762, -8459, -6093, -3687, -1237 } + }, + { + {174, 187, -597, -1777, -2031, -851, 121, -920, -2825, -2406, 1144, 4742, 5271, 3322, 1822, 2128, 2957, 2613, 869, -1316, -2934, -3523, -3212, -2460, -1642, -859, -150, 285, 187, -554, -1858, -3473, -5025, -6218, -7047, -7666, -8074, -8078, -7593, -6818, -6085, -5638, -5579, -5866, -6334, -6788, -7143, -7442, -7726, -7964, -8086, -8068, -7950, -7794, -7637, -7484, -7331, -7189, -7058, -6903, -6685, -6413, -6133, -5868, -5598, -5301, -4987, -4683, -4400, -4129, -3853, -3569, -3294, -3050, -2847, -2682, -2546, -2432, -2337, -2262, -2216, -2201, -2210, -2228, -2254, -2299, -2379, -2499, -2659, -2856, -3095, -3372, -3668, -3946, -4170, -4308, + -4332, -4230, -4014, -3712, -3346, -2933, -2488, -2037, -1606, -1212, -865, -580, -388, -325, -420, -689, -1141, -1788, -2622, -3612, -4724, -5942, -7250, -8613, -9993, -11378, -12774, -14163, -15509, -16787, -17991, -19096, -20047, -20806, -21378, -21780, -21998, -22016, -21856, -21565, -21161, -20633, -19987, -19255, -18451, -17550, -16535, -15424, -14238, -12973, -11618, -10204, -8785, -7396, -6051, -4783, -3648, -2683, -1888, -1250, -773, -447, -232, -73 }, + {174, 187, -597, -1777, -2031, -851, 121, -920, -2825, -2406, 1144, 4742, 5271, 3322, 1822, 2128, 2957, 2613, 869, -1316, -2934, -3523, -3212, -2460, -1642, -859, -150, 285, 187, -554, -1858, -3473, -5025, -6218, -7047, -7666, -8074, -8078, -7593, -6818, -6085, -5638, -5579, -5866, -6334, -6788, -7143, -7442, -7726, -7964, -8086, -8068, -7950, -7794, -7637, -7484, -7331, -7189, -7058, -6903, -6685, -6413, -6133, -5868, -5598, -5301, -4987, -4683, -4400, -4129, -3853, -3569, -3294, -3050, -2847, -2682, -2546, -2432, -2337, -2262, -2216, -2201, -2210, -2228, -2254, -2299, -2379, -2499, -2659, -2856, -3095, -3372, -3668, -3946, -4170, -4308, + -4332, -4230, -4014, -3712, -3346, -2933, -2488, -2037, -1606, -1212, -865, -580, -388, -325, -420, -689, -1141, -1788, -2622, -3612, -4724, -5942, -7250, -8613, -9993, -11378, -12774, -14163, -15509, -16787, -17991, -19096, -20047, -20806, -21378, -21780, -21998, -22016, -21856, -21565, -21161, -20633, -19987, -19255, -18451, -17550, -16535, -15424, -14238, -12973, -11618, -10204, -8785, -7396, -6051, -4783, -3648, -2683, -1888, -1250, -773, -447, -232, -73 } + }, + { + {99, 546, 1250, 1696, 1718, 1461, 694, -760, -2177, -2693, -2698, -3260, -4368, -5021, -4932, -4843, -5138, -5384, -5341, -5314, -5361, -5101, -4470, -3885, -3555, -3322, -3196, -3386, -3754, -3848, -3520, -3043, -2600, -2106, -1526, -978, -517, -94, 248, 381, 282, 51, -225, -487, -658, -684, -594, -455, -328, -288, -423, -770, -1301, -1965, -2692, -3385, -3963, -4410, -4745, -4974, -5094, -5114, -5047, -4884, -4618, -4258, -3823, -3326, -2790, -2244, -1706, -1186, -688, -211, 259, 732, 1210, 1685, 2156, 2616, 3043, 3407, 3679, 3834, 3855, 3719, 3389, 2829, 2022, 955, -380, -1960, -3706, -5526, -7352, -9134, + -10802, -12282, -13549, -14609, -15458, -16078, -16482, -16709, -16774, -16657, -16345, -15859, -15230, -14483, -13647, -12774, -11918, -11109, -10347, -9631, -8972, -8379, -7851, -7386, -6989, -6666, -6405, -6184, -5984, -5800, -5636, -5490, -5366, -5278, -5244, -5279, -5388, -5568, -5818, -6134, -6509, -6922, -7350, -7786, -8219, -8626, -8970, -9227, -9384, -9421, -9317, -9064, -8684, -8198, -7618, -6955, -6235, -5483, -4700, -3883, -3040, -2186, -1322, -443 }, + {-1390, -3924, -5634, -6108, -5626, -4870, -4051, -2871, -1371, -147, 455, 768, 1188, 1653, 2041, 2598, 3547, 4562, 4985, 4434, 3015, 1129, -756, -2267, -3281, -3862, -4033, -3733, -3041, -2231, -1531, -960, -437, 63, 556, 1099, 1712, 2293, 2682, 2764, 2495, 1904, 1105, 267, -453, -958, -1207, -1215, -1059, -851, -673, -555, -495, -473, -462, -440, -401, -351, -299, -256, -224, -195, -143, -41, 134, 401, 754, 1148, 1507, 1746, 1799, 1632, 1253, 710, 76, -579, -1197, -1733, -2154, -2425, -2508, -2363, -1965, -1325, -497, 420, 1298, 2013, 2470, 2627, 2492, 2112, 1558, 910, 248, -358, + -854, -1205, -1395, -1429, -1331, -1143, -910, -673, -462, -290, -161, -65, 12, 86, 170, 276, 409, 568, 740, 899, 1017, 1062, 1011, 857, 609, 291, -67, -431, -771, -1060, -1274, -1395, -1410, -1309, -1091, -769, -364, 88, 539, 938, 1238, 1403, 1418, 1291, 1052, 742, 407, 87, -187, -399, -548, -635, -671, -664, -625, -562, -481, -391, -300, -214, -141, -83, -42, -13 } + }, + { + {-1390, -3924, -5634, -6108, -5626, -4870, -4051, -2871, -1371, -147, 455, 768, 1188, 1653, 2041, 2598, 3547, 4562, 4985, 4434, 3015, 1129, -756, -2267, -3281, -3862, -4033, -3733, -3041, -2231, -1531, -960, -437, 63, 556, 1099, 1712, 2293, 2682, 2764, 2495, 1904, 1105, 267, -453, -958, -1207, -1215, -1059, -851, -673, -555, -495, -473, -462, -440, -401, -351, -299, -256, -224, -195, -143, -41, 134, 401, 754, 1148, 1507, 1746, 1799, 1632, 1253, 710, 76, -579, -1197, -1733, -2154, -2425, -2508, -2363, -1965, -1325, -497, 420, 1298, 2013, 2470, 2627, 2492, 2112, 1558, 910, 248, -358, + -854, -1205, -1395, -1429, -1331, -1143, -910, -673, -462, -290, -161, -65, 12, 86, 170, 276, 409, 568, 740, 899, 1017, 1062, 1011, 857, 609, 291, -67, -431, -771, -1060, -1274, -1395, -1410, -1309, -1091, -769, -364, 88, 539, 938, 1238, 1403, 1418, 1291, 1052, 742, 407, 87, -187, -399, -548, -635, -671, -664, -625, -562, -481, -391, -300, -214, -141, -83, -42, -13 }, + {99, 546, 1250, 1696, 1718, 1461, 694, -760, -2177, -2693, -2698, -3260, -4368, -5021, -4932, -4843, -5138, -5384, -5341, -5314, -5361, -5101, -4470, -3885, -3555, -3322, -3196, -3386, -3754, -3848, -3520, -3043, -2600, -2106, -1526, -978, -517, -94, 248, 381, 282, 51, -225, -487, -658, -684, -594, -455, -328, -288, -423, -770, -1301, -1965, -2692, -3385, -3963, -4410, -4745, -4974, -5094, -5114, -5047, -4884, -4618, -4258, -3823, -3326, -2790, -2244, -1706, -1186, -688, -211, 259, 732, 1210, 1685, 2156, 2616, 3043, 3407, 3679, 3834, 3855, 3719, 3389, 2829, 2022, 955, -380, -1960, -3706, -5526, -7352, -9134, + -10802, -12282, -13549, -14609, -15458, -16078, -16482, -16709, -16774, -16657, -16345, -15859, -15230, -14483, -13647, -12774, -11918, -11109, -10347, -9631, -8972, -8379, -7851, -7386, -6989, -6666, -6405, -6184, -5984, -5800, -5636, -5490, -5366, -5278, -5244, -5279, -5388, -5568, -5818, -6134, -6509, -6922, -7350, -7786, -8219, -8626, -8970, -9227, -9384, -9421, -9317, -9064, -8684, -8198, -7618, -6955, -6235, -5483, -4700, -3883, -3040, -2186, -1322, -443 } + }, + { + {121, 663, 1600, 2271, 2107, 1278, 231, -936, -2204, -3107, -3189, -2831, -2880, -3423, -3672, -3248, -2779, -2876, -3225, -3202, -2851, -2632, -2606, -2460, -2130, -1861, -1740, -1585, -1285, -942, -679, -532, -486, -482, -403, -180, 139, 457, 718, 884, 921, 830, 651, 400, 70, -317, -706, -1065, -1398, -1723, -2060, -2437, -2872, -3360, -3886, -4431, -4960, -5451, -5901, -6314, -6662, -6922, -7104, -7225, -7274, -7236, -7120, -6936, -6666, -6288, -5805, -5241, -4612, -3939, -3254, -2587, -1953, -1364, -831, -354, 63, 403, 652, 811, 884, 848, 670, 335, -160, -835, -1719, -2821, -4116, -5576, -7178, -8894, + -10658, -12396, -14056, -15617, -17043, -18276, -19282, -20069, -20646, -20983, -21058, -20891, -20522, -19958, -19203, -18301, -17324, -16319, -15307, -14314, -13379, -12525, -11745, -11036, -10407, -9866, -9405, -9005, -8653, -8341, -8063, -7807, -7557, -7317, -7110, -6959, -6868, -6844, -6901, -7055, -7301, -7625, -8015, -8468, -8969, -9490, -9998, -10466, -10873, -11192, -11383, -11413, -11275, -10968, -10481, -9808, -8970, -8008, -6941, -5776, -4540, -3270, -1981, -665 }, + {-1860, -5004, -6706, -6777, -5628, -3746, -1317, 1484, 4033, 5438, 5293, 4032, 2432, 950, -377, -1561, -2445, -2854, -2810, -2502, -2034, -1339, -364, 714, 1585, 2093, 2295, 2252, 1915, 1270, 455, -346, -1032, -1557, -1863, -1903, -1680, -1228, -604, 75, 663, 1077, 1327, 1445, 1426, 1255, 932, 469, -96, -679, -1169, -1472, -1539, -1361, -975, -465, 61, 516, 853, 1053, 1127, 1105, 1009, 834, 567, 198, -267, -792, -1298, -1676, -1807, -1600, -1029, -169, 801, 1646, 2147, 2181, 1757, 1005, 122, -698, -1315, -1655, -1698, -1466, -1014, -423, 204, 751, 1117, 1245, 1139, 850, 462, 64, + -269, -496, -606, -611, -539, -422, -287, -154, -35, 67, 153, 227, 290, 339, 367, 361, 309, 205, 56, -117, -285, -415, -479, -462, -366, -211, -27, 150, 289, 371, 391, 355, 277, 172, 57, -55, -154, -230, -277, -291, -270, -216, -134, -36, 64, 152, 214, 241, 231, 191, 130, 63, 0, -51, -87, -108, -118, -119, -113, -101, -85, -64, -40, -14 } + }, + { + {-1860, -5004, -6706, -6777, -5628, -3746, -1317, 1484, 4033, 5438, 5293, 4032, 2432, 950, -377, -1561, -2445, -2854, -2810, -2502, -2034, -1339, -364, 714, 1585, 2093, 2295, 2252, 1915, 1270, 455, -346, -1032, -1557, -1863, -1903, -1680, -1228, -604, 75, 663, 1077, 1327, 1445, 1426, 1255, 932, 469, -96, -679, -1169, -1472, -1539, -1361, -975, -465, 61, 516, 853, 1053, 1127, 1105, 1009, 834, 567, 198, -267, -792, -1298, -1676, -1807, -1600, -1029, -169, 801, 1646, 2147, 2181, 1757, 1005, 122, -698, -1315, -1655, -1698, -1466, -1014, -423, 204, 751, 1117, 1245, 1139, 850, 462, 64, + -269, -496, -606, -611, -539, -422, -287, -154, -35, 67, 153, 227, 290, 339, 367, 361, 309, 205, 56, -117, -285, -415, -479, -462, -366, -211, -27, 150, 289, 371, 391, 355, 277, 172, 57, -55, -154, -230, -277, -291, -270, -216, -134, -36, 64, 152, 214, 241, 231, 191, 130, 63, 0, -51, -87, -108, -118, -119, -113, -101, -85, -64, -40, -14 }, + {121, 663, 1600, 2271, 2107, 1278, 231, -936, -2204, -3107, -3189, -2831, -2880, -3423, -3672, -3248, -2779, -2876, -3225, -3202, -2851, -2632, -2606, -2460, -2130, -1861, -1740, -1585, -1285, -942, -679, -532, -486, -482, -403, -180, 139, 457, 718, 884, 921, 830, 651, 400, 70, -317, -706, -1065, -1398, -1723, -2060, -2437, -2872, -3360, -3886, -4431, -4960, -5451, -5901, -6314, -6662, -6922, -7104, -7225, -7274, -7236, -7120, -6936, -6666, -6288, -5805, -5241, -4612, -3939, -3254, -2587, -1953, -1364, -831, -354, 63, 403, 652, 811, 884, 848, 670, 335, -160, -835, -1719, -2821, -4116, -5576, -7178, -8894, + -10658, -12396, -14056, -15617, -17043, -18276, -19282, -20069, -20646, -20983, -21058, -20891, -20522, -19958, -19203, -18301, -17324, -16319, -15307, -14314, -13379, -12525, -11745, -11036, -10407, -9866, -9405, -9005, -8653, -8341, -8063, -7807, -7557, -7317, -7110, -6959, -6868, -6844, -6901, -7055, -7301, -7625, -8015, -8468, -8969, -9490, -9998, -10466, -10873, -11192, -11383, -11413, -11275, -10968, -10481, -9808, -8970, -8008, -6941, -5776, -4540, -3270, -1981, -665 } + }, + { + {354, 940, 1462, 2096, 2342, 1467, -192, -1429, -1862, -2295, -3100, -3418, -2596, -1382, -853, -939, -896, -648, -712, -1113, -1321, -1189, -1197, -1653, -2233, -2460, -2241, -1808, -1404, -1130, -912, -551, 40, 648, 931, 782, 387, -43, -449, -843, -1189, -1437, -1595, -1725, -1897, -2157, -2523, -2990, -3560, -4241, -5017, -5831, -6618, -7340, -7971, -8495, -8911, -9254, -9579, -9928, -10320, -10767, -11269, -11795, -12280, -12648, -12839, -12818, -12563, -12079, -11404, -10597, -9704, -8756, -7785, -6840, -5957, -5154, -4429, -3789, -3244, -2810, -2499, -2322, -2283, -2381, -2599, -2905, -3266, -3677, -4167, -4763, -5481, -6339, -7371, -8600, + -10003, -11532, -13151, -14825, -16482, -18021, -19364, -20476, -21329, -21887, -22140, -22137, -21941, -21586, -21086, -20480, -19818, -19114, -18347, -17509, -16620, -15700, -14749, -13772, -12806, -11888, -11028, -10219, -9465, -8778, -8159, -7596, -7082, -6631, -6261, -5980, -5781, -5661, -5625, -5674, -5799, -5984, -6225, -6526, -6878, -7262, -7651, -8027, -8370, -8648, -8818, -8852, -8745, -8492, -8083, -7522, -6838, -6067, -5226, -4322, -3380, -2427, -1468, -493 }, + {-2055, -5418, -7056, -6939, -5442, -2808, 630, 4006, 6176, 6515, 5286, 3179, 714, -1824, -4066, -5453, -5539, -4312, -2180, 298, 2623, 4371, 5146, 4700, 3130, 903, -1369, -3185, -4227, -4315, -3441, -1833, 95, 1889, 3166, 3656, 3266, 2161, 705, -712, -1821, -2478, -2609, -2218, -1411, -386, 636, 1451, 1907, 1932, 1564, 936, 214, -456, -973, -1271, -1325, -1152, -808, -368, 93, 509, 824, 1000, 1028, 913, 667, 310, -129, -602, -1030, -1300, -1302, -981, -389, 323, 961, 1350, 1395, 1115, 618, 52, -457, -836, -1054, -1102, -976, -676, -224, 316, 830, 1177, 1246, 1005, 521, -62, + -582, -921, -1026, -914, -642, -286, 81, 401, 632, 752, 752, 634, 409, 103, -240, -563, -795, -872, -754, -451, -27, 410, 744, 886, 805, 539, 173, -195, -481, -634, -643, -530, -334, -100, 128, 314, 436, 480, 443, 334, 170, -21, -206, -353, -434, -433, -352, -207, -26, 156, 302, 385, 392, 324, 201, 51, -93, -206, -274, -292, -266, -209, -132, -45 } + }, + { + {-2055, -5418, -7056, -6939, -5442, -2808, 630, 4006, 6176, 6515, 5286, 3179, 714, -1824, -4066, -5453, -5539, -4312, -2180, 298, 2623, 4371, 5146, 4700, 3130, 903, -1369, -3185, -4227, -4315, -3441, -1833, 95, 1889, 3166, 3656, 3266, 2161, 705, -712, -1821, -2478, -2609, -2218, -1411, -386, 636, 1451, 1907, 1932, 1564, 936, 214, -456, -973, -1271, -1325, -1152, -808, -368, 93, 509, 824, 1000, 1028, 913, 667, 310, -129, -602, -1030, -1300, -1302, -981, -389, 323, 961, 1350, 1395, 1115, 618, 52, -457, -836, -1054, -1102, -976, -676, -224, 316, 830, 1177, 1246, 1005, 521, -62, + -582, -921, -1026, -914, -642, -286, 81, 401, 632, 752, 752, 634, 409, 103, -240, -563, -795, -872, -754, -451, -27, 410, 744, 886, 805, 539, 173, -195, -481, -634, -643, -530, -334, -100, 128, 314, 436, 480, 443, 334, 170, -21, -206, -353, -434, -433, -352, -207, -26, 156, 302, 385, 392, 324, 201, 51, -93, -206, -274, -292, -266, -209, -132, -45 }, + {354, 940, 1462, 2096, 2342, 1467, -192, -1429, -1862, -2295, -3100, -3418, -2596, -1382, -853, -939, -896, -648, -712, -1113, -1321, -1189, -1197, -1653, -2233, -2460, -2241, -1808, -1404, -1130, -912, -551, 40, 648, 931, 782, 387, -43, -449, -843, -1189, -1437, -1595, -1725, -1897, -2157, -2523, -2990, -3560, -4241, -5017, -5831, -6618, -7340, -7971, -8495, -8911, -9254, -9579, -9928, -10320, -10767, -11269, -11795, -12280, -12648, -12839, -12818, -12563, -12079, -11404, -10597, -9704, -8756, -7785, -6840, -5957, -5154, -4429, -3789, -3244, -2810, -2499, -2322, -2283, -2381, -2599, -2905, -3266, -3677, -4167, -4763, -5481, -6339, -7371, -8600, + -10003, -11532, -13151, -14825, -16482, -18021, -19364, -20476, -21329, -21887, -22140, -22137, -21941, -21586, -21086, -20480, -19818, -19114, -18347, -17509, -16620, -15700, -14749, -13772, -12806, -11888, -11028, -10219, -9465, -8778, -8159, -7596, -7082, -6631, -6261, -5980, -5781, -5661, -5625, -5674, -5799, -5984, -6225, -6526, -6878, -7262, -7651, -8027, -8370, -8648, -8818, -8852, -8745, -8492, -8083, -7522, -6838, -6067, -5226, -4322, -3380, -2427, -1468, -493 } + }, + { + {-62, -225, -445, -639, -717, -650, -324, 563, 2100, 3681, 4332, 3673, 2216, 670, -597, -1355, -1378, -780, -18, 645, 1277, 1762, 1680, 921, -60, -785, -1137, -1108, -657, 8, 462, 528, 366, 34, -645, -1693, -2823, -3778, -4546, -5169, -5634, -5984, -6319, -6651, -6912, -7095, -7254, -7402, -7540, -7721, -7965, -8206, -8388, -8561, -8786, -9057, -9355, -9694, -10070, -10428, -10729, -10992, -11244, -11500, -11777, -12094, -12456, -12851, -13251, -13612, -13892, -14082, -14190, -14197, -14082, -13862, -13577, -13231, -12803, -12302, -11760, -11193, -10610, -10039, -9523, -9073, -8676, -8326, -8024, -7768, -7542, -7330, -7113, -6886, -6658, -6434, + -6210, -5985, -5773, -5574, -5373, -5157, -4928, -4688, -4426, -4134, -3823, -3506, -3187, -2872, -2571, -2292, -2039, -1815, -1621, -1454, -1311, -1189, -1088, -1003, -932, -881, -846, -822, -809, -812, -836, -889, -982, -1125, -1328, -1602, -1953, -2373, -2848, -3366, -3918, -4482, -5029, -5542, -6014, -6428, -6759, -6991, -7131, -7178, -7123, -6966, -6720, -6399, -6006, -5543, -5020, -4451, -3841, -3194, -2514, -1813, -1096, -367 }, + {-1065, -3050, -4738, -5973, -6262, -5208, -3368, -2119, -2475, -4306, -6601, -8129, -8069, -6586, -4794, -3759, -3581, -3701, -3766, -3700, -3236, -2061, -413, 1014, 1822, 2213, 2573, 3089, 3795, 4653, 5518, 6183, 6518, 6497, 6169, 5671, 5207, 4880, 4613, 4260, 3764, 3145, 2449, 1734, 1041, 358, -346, -1066, -1768, -2444, -3105, -3744, -4347, -4908, -5398, -5762, -5962, -6006, -5906, -5656, -5262, -4750, -4142, -3451, -2702, -1928, -1135, -309, 544, 1392, 2195, 2918, 3533, 4025, 4402, 4676, 4847, 4905, 4844, 4666, 4383, 4003, 3539, 3002, 2416, 1811, 1215, 645, 119, -352, -768, -1132, -1437, -1674, -1851, -1976, + -2052, -2079, -2066, -2024, -1957, -1872, -1781, -1696, -1622, -1559, -1509, -1473, -1449, -1429, -1410, -1390, -1363, -1323, -1260, -1165, -1031, -851, -622, -346, -28, 324, 706, 1114, 1535, 1954, 2361, 2746, 3089, 3374, 3595, 3748, 3821, 3803, 3690, 3484, 3176, 2763, 2250, 1650, 968, 210, -603, -1440, -2276, -3085, -3829, -4470, -4978, -5334, -5519, -5518, -5333, -4980, -4476, -3837, -3090, -2264, -1383, -466 } + }, + { + {-1065, -3050, -4738, -5973, -6262, -5208, -3368, -2119, -2475, -4306, -6601, -8129, -8069, -6586, -4794, -3759, -3581, -3701, -3766, -3700, -3236, -2061, -413, 1014, 1822, 2213, 2573, 3089, 3795, 4653, 5518, 6183, 6518, 6497, 6169, 5671, 5207, 4880, 4613, 4260, 3764, 3145, 2449, 1734, 1041, 358, -346, -1066, -1768, -2444, -3105, -3744, -4347, -4908, -5398, -5762, -5962, -6006, -5906, -5656, -5262, -4750, -4142, -3451, -2702, -1928, -1135, -309, 544, 1392, 2195, 2918, 3533, 4025, 4402, 4676, 4847, 4905, 4844, 4666, 4383, 4003, 3539, 3002, 2416, 1811, 1215, 645, 119, -352, -768, -1132, -1437, -1674, -1851, -1976, + -2052, -2079, -2066, -2024, -1957, -1872, -1781, -1696, -1622, -1559, -1509, -1473, -1449, -1429, -1410, -1390, -1363, -1323, -1260, -1165, -1031, -851, -622, -346, -28, 324, 706, 1114, 1535, 1954, 2361, 2746, 3089, 3374, 3595, 3748, 3821, 3803, 3690, 3484, 3176, 2763, 2250, 1650, 968, 210, -603, -1440, -2276, -3085, -3829, -4470, -4978, -5334, -5519, -5518, -5333, -4980, -4476, -3837, -3090, -2264, -1383, -466 }, + {-62, -225, -445, -639, -717, -650, -324, 563, 2100, 3681, 4332, 3673, 2216, 670, -597, -1355, -1378, -780, -18, 645, 1277, 1762, 1680, 921, -60, -785, -1137, -1108, -657, 8, 462, 528, 366, 34, -645, -1693, -2823, -3778, -4546, -5169, -5634, -5984, -6319, -6651, -6912, -7095, -7254, -7402, -7540, -7721, -7965, -8206, -8388, -8561, -8786, -9057, -9355, -9694, -10070, -10428, -10729, -10992, -11244, -11500, -11777, -12094, -12456, -12851, -13251, -13612, -13892, -14082, -14190, -14197, -14082, -13862, -13577, -13231, -12803, -12302, -11760, -11193, -10610, -10039, -9523, -9073, -8676, -8326, -8024, -7768, -7542, -7330, -7113, -6886, -6658, -6434, + -6210, -5985, -5773, -5574, -5373, -5157, -4928, -4688, -4426, -4134, -3823, -3506, -3187, -2872, -2571, -2292, -2039, -1815, -1621, -1454, -1311, -1189, -1088, -1003, -932, -881, -846, -822, -809, -812, -836, -889, -982, -1125, -1328, -1602, -1953, -2373, -2848, -3366, -3918, -4482, -5029, -5542, -6014, -6428, -6759, -6991, -7131, -7178, -7123, -6966, -6720, -6399, -6006, -5543, -5020, -4451, -3841, -3194, -2514, -1813, -1096, -367 } + }, + { + {70, 295, 686, 976, 578, -643, -1829, -2000, -1315, -751, -659, -475, 81, 416, -30, -1001, -1949, -2778, -3661, -4512, -5069, -5294, -5363, -5388, -5354, -5253, -5129, -5016, -4909, -4767, -4534, -4209, -3875, -3615, -3416, -3193, -2890, -2517, -2116, -1745, -1456, -1260, -1132, -1062, -1066, -1153, -1312, -1532, -1804, -2094, -2349, -2531, -2627, -2653, -2645, -2651, -2710, -2850, -3097, -3460, -3913, -4411, -4927, -5442, -5922, -6333, -6676, -6975, -7245, -7484, -7699, -7905, -8099, -8261, -8373, -8425, -8415, -8334, -8176, -7954, -7699, -7437, -7179, -6920, -6657, -6386, -6089, -5739, -5333, -4886, -4422, -3956, -3506, -3094, -2735, -2439, + -2213, -2072, -2031, -2111, -2326, -2674, -3139, -3710, -4374, -5106, -5871, -6650, -7436, -8215, -8956, -9636, -10255, -10811, -11289, -11671, -11965, -12188, -12348, -12443, -12482, -12488, -12476, -12439, -12366, -12260, -12131, -11968, -11748, -11466, -11135, -10761, -10338, -9866, -9368, -8870, -8381, -7902, -7447, -7037, -6677, -6357, -6068, -5814, -5591, -5387, -5182, -4967, -4743, -4502, -4230, -3915, -3564, -3182, -2767, -2310, -1823, -1319, -803, -271 }, + {-1520, -4372, -6515, -7321, -6593, -4941, -3365, -2371, -1590, -362, 1414, 3140, 4182, 4472, 4393, 4228, 3869, 3056, 1747, 214, -1172, -2195, -2875, -3343, -3661, -3748, -3489, -2862, -1945, -841, 349, 1488, 2406, 2979, 3185, 3076, 2714, 2156, 1479, 766, 87, -519, -1034, -1452, -1773, -1998, -2117, -2119, -1995, -1738, -1337, -793, -132, 590, 1293, 1896, 2339, 2580, 2596, 2372, 1914, 1252, 452, -403, -1224, -1928, -2452, -2745, -2773, -2516, -1980, -1206, -283, 661, 1484, 2072, 2357, 2332, 2050, 1599, 1074, 550, 69, -349, -701, -984, -1197, -1331, -1372, -1307, -1133, -864, -531, -173, 170, 470, + 709, 879, 980, 1014, 985, 898, 755, 563, 331, 68, -207, -475, -714, -899, -1011, -1036, -968, -812, -580, -296, 11, 311, 576, 784, 919, 973, 944, 835, 654, 414, 135, -160, -441, -676, -835, -902, -868, -744, -550, -318, -78, 143, 323, 451, 524, 548, 529, 478, 404, 314, 214, 108, 1, -105, -205, -292, -362, -408, -425, -409, -360, -282, -179, -62 } + }, + { + {-1520, -4372, -6515, -7321, -6593, -4941, -3365, -2371, -1590, -362, 1414, 3140, 4182, 4472, 4393, 4228, 3869, 3056, 1747, 214, -1172, -2195, -2875, -3343, -3661, -3748, -3489, -2862, -1945, -841, 349, 1488, 2406, 2979, 3185, 3076, 2714, 2156, 1479, 766, 87, -519, -1034, -1452, -1773, -1998, -2117, -2119, -1995, -1738, -1337, -793, -132, 590, 1293, 1896, 2339, 2580, 2596, 2372, 1914, 1252, 452, -403, -1224, -1928, -2452, -2745, -2773, -2516, -1980, -1206, -283, 661, 1484, 2072, 2357, 2332, 2050, 1599, 1074, 550, 69, -349, -701, -984, -1197, -1331, -1372, -1307, -1133, -864, -531, -173, 170, 470, + 709, 879, 980, 1014, 985, 898, 755, 563, 331, 68, -207, -475, -714, -899, -1011, -1036, -968, -812, -580, -296, 11, 311, 576, 784, 919, 973, 944, 835, 654, 414, 135, -160, -441, -676, -835, -902, -868, -744, -550, -318, -78, 143, 323, 451, 524, 548, 529, 478, 404, 314, 214, 108, 1, -105, -205, -292, -362, -408, -425, -409, -360, -282, -179, -62 }, + {70, 295, 686, 976, 578, -643, -1829, -2000, -1315, -751, -659, -475, 81, 416, -30, -1001, -1949, -2778, -3661, -4512, -5069, -5294, -5363, -5388, -5354, -5253, -5129, -5016, -4909, -4767, -4534, -4209, -3875, -3615, -3416, -3193, -2890, -2517, -2116, -1745, -1456, -1260, -1132, -1062, -1066, -1153, -1312, -1532, -1804, -2094, -2349, -2531, -2627, -2653, -2645, -2651, -2710, -2850, -3097, -3460, -3913, -4411, -4927, -5442, -5922, -6333, -6676, -6975, -7245, -7484, -7699, -7905, -8099, -8261, -8373, -8425, -8415, -8334, -8176, -7954, -7699, -7437, -7179, -6920, -6657, -6386, -6089, -5739, -5333, -4886, -4422, -3956, -3506, -3094, -2735, -2439, + -2213, -2072, -2031, -2111, -2326, -2674, -3139, -3710, -4374, -5106, -5871, -6650, -7436, -8215, -8956, -9636, -10255, -10811, -11289, -11671, -11965, -12188, -12348, -12443, -12482, -12488, -12476, -12439, -12366, -12260, -12131, -11968, -11748, -11466, -11135, -10761, -10338, -9866, -9368, -8870, -8381, -7902, -7447, -7037, -6677, -6357, -6068, -5814, -5591, -5387, -5182, -4967, -4743, -4502, -4230, -3915, -3564, -3182, -2767, -2310, -1823, -1319, -803, -271 } + }, + { + {7, 143, 453, 617, 234, -693, -1668, -2207, -2299, -2208, -2008, -1598, -1098, -884, -1173, -1821, -2591, -3404, -4201, -4798, -5064, -5112, -5176, -5351, -5560, -5725, -5845, -5930, -5971, -5962, -5923, -5857, -5738, -5537, -5237, -4827, -4309, -3729, -3168, -2696, -2334, -2071, -1899, -1822, -1825, -1874, -1937, -1997, -2051, -2094, -2130, -2172, -2239, -2351, -2527, -2769, -3066, -3402, -3761, -4120, -4452, -4740, -4995, -5229, -5442, -5626, -5772, -5869, -5893, -5818, -5639, -5370, -5037, -4670, -4302, -3967, -3680, -3438, -3228, -3031, -2835, -2633, -2421, -2197, -1965, -1729, -1493, -1257, -1025, -802, -594, -406, -246, -124, -56, -63, + -159, -352, -645, -1041, -1530, -2088, -2685, -3305, -3944, -4592, -5234, -5866, -6496, -7119, -7712, -8253, -8737, -9161, -9507, -9760, -9926, -10020, -10047, -10004, -9901, -9759, -9595, -9412, -9209, -8999, -8793, -8584, -8354, -8096, -7811, -7499, -7149, -6765, -6365, -5972, -5594, -5235, -4904, -4615, -4372, -4168, -3997, -3862, -3760, -3680, -3606, -3530, -3446, -3346, -3215, -3042, -2827, -2572, -2271, -1923, -1535, -1119, -684, -231 }, + {-1088, -3257, -5185, -6311, -6249, -5388, -4667, -4563, -4585, -4035, -2989, -2083, -1536, -922, 114, 1407, 2640, 3694, 4512, 4936, 4914, 4631, 4281, 3845, 3234, 2475, 1662, 811, -111, -1090, -2050, -2887, -3501, -3839, -3931, -3841, -3591, -3162, -2576, -1914, -1262, -674, -174, 239, 589, 906, 1207, 1517, 1864, 2256, 2655, 2993, 3199, 3215, 3016, 2622, 2092, 1475, 797, 71, -690, -1460, -2198, -2846, -3341, -3637, -3716, -3589, -3280, -2824, -2247, -1565, -788, 54, 909, 1703, 2362, 2828, 3078, 3124, 3003, 2756, 2419, 2018, 1580, 1126, 669, 217, -218, -629, -1014, -1371, -1694, -1975, -2205, -2364, + -2429, -2379, -2206, -1912, -1507, -1014, -463, 112, 683, 1217, 1680, 2047, 2301, 2429, 2423, 2286, 2032, 1678, 1245, 763, 263, -225, -677, -1072, -1392, -1625, -1769, -1818, -1774, -1641, -1431, -1157, -838, -496, -158, 154, 423, 638, 791, 887, 935, 944, 924, 885, 833, 770, 695, 606, 499, 371, 219, 47, -140, -333, -519, -683, -810, -887, -905, -858, -748, -580, -368, -126 } + }, + { + {-1088, -3257, -5185, -6311, -6249, -5388, -4667, -4563, -4585, -4035, -2989, -2083, -1536, -922, 114, 1407, 2640, 3694, 4512, 4936, 4914, 4631, 4281, 3845, 3234, 2475, 1662, 811, -111, -1090, -2050, -2887, -3501, -3839, -3931, -3841, -3591, -3162, -2576, -1914, -1262, -674, -174, 239, 589, 906, 1207, 1517, 1864, 2256, 2655, 2993, 3199, 3215, 3016, 2622, 2092, 1475, 797, 71, -690, -1460, -2198, -2846, -3341, -3637, -3716, -3589, -3280, -2824, -2247, -1565, -788, 54, 909, 1703, 2362, 2828, 3078, 3124, 3003, 2756, 2419, 2018, 1580, 1126, 669, 217, -218, -629, -1014, -1371, -1694, -1975, -2205, -2364, + -2429, -2379, -2206, -1912, -1507, -1014, -463, 112, 683, 1217, 1680, 2047, 2301, 2429, 2423, 2286, 2032, 1678, 1245, 763, 263, -225, -677, -1072, -1392, -1625, -1769, -1818, -1774, -1641, -1431, -1157, -838, -496, -158, 154, 423, 638, 791, 887, 935, 944, 924, 885, 833, 770, 695, 606, 499, 371, 219, 47, -140, -333, -519, -683, -810, -887, -905, -858, -748, -580, -368, -126 }, + {7, 143, 453, 617, 234, -693, -1668, -2207, -2299, -2208, -2008, -1598, -1098, -884, -1173, -1821, -2591, -3404, -4201, -4798, -5064, -5112, -5176, -5351, -5560, -5725, -5845, -5930, -5971, -5962, -5923, -5857, -5738, -5537, -5237, -4827, -4309, -3729, -3168, -2696, -2334, -2071, -1899, -1822, -1825, -1874, -1937, -1997, -2051, -2094, -2130, -2172, -2239, -2351, -2527, -2769, -3066, -3402, -3761, -4120, -4452, -4740, -4995, -5229, -5442, -5626, -5772, -5869, -5893, -5818, -5639, -5370, -5037, -4670, -4302, -3967, -3680, -3438, -3228, -3031, -2835, -2633, -2421, -2197, -1965, -1729, -1493, -1257, -1025, -802, -594, -406, -246, -124, -56, -63, + -159, -352, -645, -1041, -1530, -2088, -2685, -3305, -3944, -4592, -5234, -5866, -6496, -7119, -7712, -8253, -8737, -9161, -9507, -9760, -9926, -10020, -10047, -10004, -9901, -9759, -9595, -9412, -9209, -8999, -8793, -8584, -8354, -8096, -7811, -7499, -7149, -6765, -6365, -5972, -5594, -5235, -4904, -4615, -4372, -4168, -3997, -3862, -3760, -3680, -3606, -3530, -3446, -3346, -3215, -3042, -2827, -2572, -2271, -1923, -1535, -1119, -684, -231 } + } +}; +const Word16 *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; + /* Sample Rate = 16000 */ const Word16 CRendBin_Combined_HRIR_max_num_iterations_16kHz = 1; -const UWord16 CRendBin_Combined_HRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; -const UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; -const UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz = 0; -const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[15]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; -const UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_Combined_HRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const Word16 CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const Word16 CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const Word16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz = 0; +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_Q_16kHz_fx = 0; +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; +const Word16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_Combined_HRIR_coeff_Q_16kHz_fx = 13; +const Word16 CRendBin_Combined_HRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + { 10176, 10343, 10699, 11186, 11462, 11155, 10569, 10496, 10858, 10378, 8519, 6917, 7568, 10113, 12363, 13255, 13782, 14968, 16442, 17411, 17777, 17662, 16766, 14943, 12855, 11437, 10982, 11136, 11556, 12232, 13302, 14805, 16567, 18217, 19370, 19869, 19843, 19527, 19069, 18480, 17719, 16811, 15902, 15168, 14680, 14383, 14173, 13951, 13626, 13147, 12548, 11922, 11341, 10830, 10389, 10014, 9702, 9449, 9234, 9007, 8719, 8349, 7879, 7264, 6453, 5447, 4314, 3154, 2073, 1159, 459, -38, -371, -583, -711, -795, -868, -943, -1011, -1051 }, + { 7990, 8145, 7183, 4943, 2800, 1461, 202, -1272, -1961, -1222, 106, 822, 458, -1098, -3788, -6699, -8354, -8272, -7370, -6479, -5445, -4075, -2920, -2470, -2368, -2034, -1470, -874, 4, 1492, 3327, 4928, 6145, 7235, 8163, 8433, 7713, 6322, 4897, 3775, 2865, 1994, 1129, 264, -668, -1684, -2666, -3487, -4132, -4634, -4966, -5082, -4989, -4732, -4343, -3855, -3313, -2735, -2097, -1388, -634, 131, 871, 1525, 2021, 2334, 2490, 2523, 2449, 2292, 2094, 1896, 1727, 1599, 1508, 1440, 1377, 1311, 1248, 1208 } + }, + { + { 7990, 8145, 7183, 4943, 2800, 1461, 202, -1272, -1961, -1222, 106, 822, 458, -1098, -3788, -6699, -8354, -8272, -7370, -6479, -5445, -4075, -2920, -2470, -2368, -2034, -1470, -874, 4, 1492, 3327, 4928, 6145, 7235, 8163, 8433, 7713, 6322, 4897, 3775, 2865, 1994, 1129, 264, -668, -1684, -2666, -3487, -4132, -4634, -4966, -5082, -4989, -4732, -4343, -3855, -3313, -2735, -2097, -1388, -634, 131, 871, 1525, 2021, 2334, 2490, 2523, 2449, 2292, 2094, 1896, 1727, 1599, 1508, 1440, 1377, 1311, 1248, 1208 }, + { 10176, 10343, 10699, 11186, 11462, 11155, 10569, 10496, 10858, 10378, 8519, 6917, 7568, 10113, 12363, 13255, 13782, 14968, 16442, 17411, 17777, 17662, 16766, 14943, 12855, 11437, 10982, 11136, 11556, 12232, 13302, 14805, 16567, 18217, 19370, 19869, 19843, 19527, 19069, 18480, 17719, 16811, 15902, 15168, 14680, 14383, 14173, 13951, 13626, 13147, 12548, 11922, 11341, 10830, 10389, 10014, 9702, 9449, 9234, 9007, 8719, 8349, 7879, 7264, 6453, 5447, 4314, 3154, 2073, 1159, 459, -38, -371, -583, -711, -795, -868, -943, -1011, -1051 } + }, + { + { 9239, 9786, 10272, 9774, 8309, 7451, 8330, 9415, 8176, 4992, 3340, 5357, 9042, 11024, 10685, 10145, 11063, 12934, 14275, 14276, 13136, 11566, 10259, 9536, 9329, 9494, 10056, 11057, 12342, 13598, 14498, 14795, 14441, 13655, 12735, 11762, 10640, 9412, 8368, 7789, 7723, 8013, 8425, 8731, 8784, 8597, 8290, 7946, 7547, 7049, 6477, 5907, 5404, 4981, 4612, 4271, 3953, 3649, 3333, 2986, 2634, 2325, 2070, 1835, 1596, 1368, 1180, 1035, 917, 812, 727, 680, 681, 722, 782, 845, 903, 954, 990, 1009 }, + { 9239, 9786, 10272, 9774, 8309, 7451, 8330, 9415, 8176, 4992, 3340, 5357, 9042, 11024, 10685, 10145, 11063, 12934, 14275, 14276, 13136, 11566, 10259, 9536, 9329, 9494, 10056, 11057, 12342, 13598, 14498, 14795, 14441, 13655, 12735, 11762, 10640, 9412, 8368, 7789, 7723, 8013, 8425, 8731, 8784, 8597, 8290, 7946, 7547, 7049, 6477, 5907, 5404, 4981, 4612, 4271, 3953, 3649, 3333, 2986, 2634, 2325, 2070, 1835, 1596, 1368, 1180, 1035, 917, 812, 727, 680, 681, 722, 782, 845, 903, 954, 990, 1009 } + }, + { + { 8583, 8472, 8772, 9571, 10494, 11469, 12523, 13085, 12626, 11770, 11556, 11810, 11487, 10448, 9595, 9307, 9016, 8396, 7794, 7357, 6766, 6003, 5508, 5441, 5507, 5566, 5733, 5872, 5623, 4998, 4410, 4082, 3878, 3708, 3677, 3827, 4074, 4402, 4876, 5451, 5970, 6340, 6560, 6636, 6596, 6529, 6534, 6658, 6917, 7314, 7799, 8270, 8633, 8826, 8805, 8563, 8158, 7666, 7126, 6549, 5950, 5350, 4750, 4151, 3581, 3072, 2654, 2348, 2176, 2141, 2222, 2393, 2620, 2870, 3113, 3331, 3518, 3660, 3749, 3788 }, + { 7252, 6096, 3976, 1559, -378, -1705, -2818, -3762, -4090, -3696, -3125, -2837, -2697, -2458, -2235, -2123, -1759, -668, 1116, 3053, 4545, 5242, 5086, 4284, 3156, 1900, 581, -666, -1595, -2092, -2290, -2379, -2418, -2399, -2341, -2229, -1960, -1436, -667, 234, 1120, 1831, 2236, 2284, 2027, 1568, 1026, 525, 159, -45, -127, -146, -150, -167, -211, -272, -335, -388, -429, -464, -506, -575, -679, -808, -940, -1034, -1028, -867, -530, -54, 483, 972, 1309, 1428, 1327, 1062, 722, 393, 143, 11 } + }, + { + { 7252, 6096, 3976, 1559, -378, -1705, -2818, -3762, -4090, -3696, -3125, -2837, -2697, -2458, -2235, -2123, -1759, -668, 1116, 3053, 4545, 5242, 5086, 4284, 3156, 1900, 581, -666, -1595, -2092, -2290, -2379, -2418, -2399, -2341, -2229, -1960, -1436, -667, 234, 1120, 1831, 2236, 2284, 2027, 1568, 1026, 525, 159, -45, -127, -146, -150, -167, -211, -272, -335, -388, -429, -464, -506, -575, -679, -808, -940, -1034, -1028, -867, -530, -54, 483, 972, 1309, 1428, 1327, 1062, 722, 393, 143, 11 }, + { 8583, 8472, 8772, 9571, 10494, 11469, 12523, 13085, 12626, 11770, 11556, 11810, 11487, 10448, 9595, 9307, 9016, 8396, 7794, 7357, 6766, 6003, 5508, 5441, 5507, 5566, 5733, 5872, 5623, 4998, 4410, 4082, 3878, 3708, 3677, 3827, 4074, 4402, 4876, 5451, 5970, 6340, 6560, 6636, 6596, 6529, 6534, 6658, 6917, 7314, 7799, 8270, 8633, 8826, 8805, 8563, 8158, 7666, 7126, 6549, 5950, 5350, 4750, 4151, 3581, 3072, 2654, 2348, 2176, 2141, 2222, 2393, 2620, 2870, 3113, 3331, 3518, 3660, 3749, 3788 } + }, + { + { 9611, 9445, 9754, 10847, 12225, 13238, 13780, 13983, 13669, 12713, 11656, 11233, 11316, 11071, 10255, 9593, 9599, 9789, 9514, 8938, 8610, 8561, 8416, 8114, 7929, 7934, 7915, 7778, 7670, 7715, 7883, 8085, 8248, 8306, 8261, 8222, 8301, 8525, 8868, 9302, 9786, 10256, 10684, 11076, 11419, 11676, 11840, 11948, 12038, 12125, 12218, 12310, 12373, 12380, 12310, 12149, 11894, 11563, 11172, 10712, 10178, 9593, 8983, 8346, 7678, 6999, 6337, 5694, 5075, 4508, 4034, 3674, 3434, 3312, 3294, 3353, 3454, 3560, 3642, 3685 }, + { 7418, 5560, 2552, -608, -3209, -5062, -6120, -6078, -4629, -2087, 582, 2487, 3420, 3683, 3541, 3013, 2097, 978, -74, -937, -1672, -2305, -2667, -2552, -1984, -1199, -378, 450, 1245, 1852, 2125, 2063, 1746, 1230, 567, -153, -826, -1367, -1687, -1720, -1492, -1109, -668, -199, 286, 753, 1156, 1439, 1540, 1406, 1043, 513, -91, -666, -1108, -1344, -1358, -1188, -893, -536, -170, 176, 499, 802, 1073, 1274, 1355, 1255, 926, 363, -371, -1138, -1749, -2016, -1825, -1197, -283, 686, 1479, 1921 } + }, + { + { 7418, 5560, 2552, -608, -3209, -5062, -6120, -6078, -4629, -2087, 582, 2487, 3420, 3683, 3541, 3013, 2097, 978, -74, -937, -1672, -2305, -2667, -2552, -1984, -1199, -378, 450, 1245, 1852, 2125, 2063, 1746, 1230, 567, -153, -826, -1367, -1687, -1720, -1492, -1109, -668, -199, 286, 753, 1156, 1439, 1540, 1406, 1043, 513, -91, -666, -1108, -1344, -1358, -1188, -893, -536, -170, 176, 499, 802, 1073, 1274, 1355, 1255, 926, 363, -371, -1138, -1749, -2016, -1825, -1197, -283, 686, 1479, 1921 }, + { 9611, 9445, 9754, 10847, 12225, 13238, 13780, 13983, 13669, 12713, 11656, 11233, 11316, 11071, 10255, 9593, 9599, 9789, 9514, 8938, 8610, 8561, 8416, 8114, 7929, 7934, 7915, 7778, 7670, 7715, 7883, 8085, 8248, 8306, 8261, 8222, 8301, 8525, 8868, 9302, 9786, 10256, 10684, 11076, 11419, 11676, 11840, 11948, 12038, 12125, 12218, 12310, 12373, 12380, 12310, 12149, 11894, 11563, 11172, 10712, 10178, 9593, 8983, 8346, 7678, 6999, 6337, 5694, 5075, 4508, 4034, 3674, 3434, 3312, 3294, 3353, 3454, 3560, 3642, 3685 } + }, + { + { 10199, 10478, 10837, 11524, 12889, 14358, 14828, 14225, 13580, 13334, 12738, 11380, 10176, 10072, 10669, 10997, 10975, 11170, 11608, 11761, 11550, 11483, 11774, 11992, 11715, 11075, 10484, 10178, 10128, 10171, 10151, 10072, 10172, 10677, 11506, 12328, 12913, 13279, 13528, 13687, 13752, 13776, 13844, 14008, 14267, 14585, 14918, 15235, 15513, 15719, 15796, 15707, 15456, 15077, 14602, 14070, 13535, 13043, 12601, 12185, 11760, 11287, 10718, 9995, 9084, 7995, 6773, 5478, 4186, 2979, 1934, 1092, 456, 17, -240, -350, -367, -344, -316, -298 }, + { 7514, 5338, 1977, -1469, -4401, -6450, -7062, -5798, -2964, 382, 3174, 4939, 5669, 5377, 3991, 1657, -1077, -3467, -4945, -5287, -4523, -2809, -455, 2002, 3908, 4782, 4510, 3284, 1430, -656, -2517, -3724, -4031, -3428, -2099, -366, 1333, 2570, 3094, 2910, 2183, 1115, -82, -1177, -1955, -2281, -2128, -1561, -723, 186, 962, 1456, 1617, 1471, 1090, 563, -9, -523, -901, -1102, -1119, -964, -674, -300, 102, 487, 811, 1031, 1100, 973, 630, 106, -485, -969, -1181, -1041, -590, 23, 598, 943 } + }, + { + { 7514, 5338, 1977, -1469, -4401, -6450, -7062, -5798, -2964, 382, 3174, 4939, 5669, 5377, 3991, 1657, -1077, -3467, -4945, -5287, -4523, -2809, -455, 2002, 3908, 4782, 4510, 3284, 1430, -656, -2517, -3724, -4031, -3428, -2099, -366, 1333, 2570, 3094, 2910, 2183, 1115, -82, -1177, -1955, -2281, -2128, -1561, -723, 186, 962, 1456, 1617, 1471, 1090, 563, -9, -523, -901, -1102, -1119, -964, -674, -300, 102, 487, 811, 1031, 1100, 973, 630, 106, -485, -969, -1181, -1041, -590, 23, 598, 943 }, + { 10199, 10478, 10837, 11524, 12889, 14358, 14828, 14225, 13580, 13334, 12738, 11380, 10176, 10072, 10669, 10997, 10975, 11170, 11608, 11761, 11550, 11483, 11774, 11992, 11715, 11075, 10484, 10178, 10128, 10171, 10151, 10072, 10172, 10677, 11506, 12328, 12913, 13279, 13528, 13687, 13752, 13776, 13844, 14008, 14267, 14585, 14918, 15235, 15513, 15719, 15796, 15707, 15456, 15077, 14602, 14070, 13535, 13043, 12601, 12185, 11760, 11287, 10718, 9995, 9084, 7995, 6773, 5478, 4186, 2979, 1934, 1092, 456, 17, -240, -350, -367, -344, -316, -298 } + }, + { + { 10587, 10578, 10473, 10207, 9810, 9301, 8636, 7966, 7874, 8928, 10903, 12828, 13914, 14086, 13582, 12593, 11467, 10711, 10508, 10644, 11029, 11835, 12942, 13783, 13969, 13656, 13146, 12599, 12241, 12378, 13004, 13784, 14531, 15335, 16157, 16701, 16794, 16575, 16229, 15810, 15363, 14975, 14642, 14286, 13902, 13556, 13263, 13003, 12793, 12630, 12445, 12195, 11940, 11738, 11563, 11368, 11150, 10905, 10593, 10199, 9762, 9320, 8878, 8425, 7949, 7425, 6816, 6085, 5201, 4161, 3000, 1764, 483, -807, -2046, -3168, -4134, -4916, -5470, -5755 }, + { 8728, 8063, 6853, 5066, 2816, 899, 386, 1470, 3135, 4008, 3295, 1112, -1587, -3517, -4026, -3632, -3303, -3453, -3948, -4737, -5835, -6848, -7167, -6691, -5939, -5407, -5161, -5028, -4845, -4458, -3745, -2722, -1533, -340, 704, 1479, 2003, 2443, 2956, 3548, 4127, 4616, 4979, 5209, 5343, 5423, 5444, 5373, 5207, 4967, 4652, 4247, 3751, 3154, 2436, 1606, 715, -186, -1080, -1946, -2749, -3463, -4081, -4591, -4976, -5237, -5389, -5420, -5294, -4982, -4483, -3817, -3024, -2158, -1278, -432, 334, 971, 1427, 1664 } + }, + { + { 8728, 8063, 6853, 5066, 2816, 899, 386, 1470, 3135, 4008, 3295, 1112, -1587, -3517, -4026, -3632, -3303, -3453, -3948, -4737, -5835, -6848, -7167, -6691, -5939, -5407, -5161, -5028, -4845, -4458, -3745, -2722, -1533, -340, 704, 1479, 2003, 2443, 2956, 3548, 4127, 4616, 4979, 5209, 5343, 5423, 5444, 5373, 5207, 4967, 4652, 4247, 3751, 3154, 2436, 1606, 715, -186, -1080, -1946, -2749, -3463, -4081, -4591, -4976, -5237, -5389, -5420, -5294, -4982, -4483, -3817, -3024, -2158, -1278, -432, 334, 971, 1427, 1664 }, + { 10587, 10578, 10473, 10207, 9810, 9301, 8636, 7966, 7874, 8928, 10903, 12828, 13914, 14086, 13582, 12593, 11467, 10711, 10508, 10644, 11029, 11835, 12942, 13783, 13969, 13656, 13146, 12599, 12241, 12378, 13004, 13784, 14531, 15335, 16157, 16701, 16794, 16575, 16229, 15810, 15363, 14975, 14642, 14286, 13902, 13556, 13263, 13003, 12793, 12630, 12445, 12195, 11940, 11738, 11563, 11368, 11150, 10905, 10593, 10199, 9762, 9320, 8878, 8425, 7949, 7425, 6816, 6085, 5201, 4161, 3000, 1764, 483, -807, -2046, -3168, -4134, -4916, -5470, -5755 } + }, + { + { 9823, 9815, 10012, 10694, 11683, 12137, 11466, 10256, 9623, 9773, 9978, 9921, 10161, 11073, 12154, 12752, 12865, 12819, 12627, 12110, 11337, 10580, 9962, 9420, 8908, 8455, 8074, 7735, 7394, 7028, 6665, 6384, 6233, 6156, 6055, 5904, 5760, 5688, 5729, 5890, 6141, 6428, 6726, 7041, 7370, 7686, 7966, 8196, 8352, 8411, 8375, 8283, 8183, 8124, 8141, 8239, 8405, 8617, 8841, 9026, 9124, 9115, 9002, 8779, 8442, 8015, 7534, 7014, 6446, 5828, 5171, 4479, 3750, 2996, 2247, 1540, 909, 387, 10, -188 }, + { 7861, 6679, 4352, 1325, -1464, -3174, -3769, -3974, -4440, -5043, -5109, -4239, -2747, -1252, -44, 1041, 2221, 3400, 4234, 4454, 4077, 3343, 2498, 1630, 682, -391, -1509, -2505, -3246, -3662, -3704, -3338, -2606, -1646, -627, 333, 1163, 1810, 2233, 2428, 2423, 2262, 1984, 1622, 1197, 723, 208, -329, -869, -1387, -1851, -2212, -2410, -2396, -2151, -1693, -1067, -331, 455, 1226, 1910, 2427, 2716, 2739, 2492, 2001, 1311, 486, -397, -1242, -1942, -2385, -2488, -2231, -1666, -908, -102, 615, 1141, 1415 } + }, + { + { 7861, 6679, 4352, 1325, -1464, -3174, -3769, -3974, -4440, -5043, -5109, -4239, -2747, -1252, -44, 1041, 2221, 3400, 4234, 4454, 4077, 3343, 2498, 1630, 682, -391, -1509, -2505, -3246, -3662, -3704, -3338, -2606, -1646, -627, 333, 1163, 1810, 2233, 2428, 2423, 2262, 1984, 1622, 1197, 723, 208, -329, -869, -1387, -1851, -2212, -2410, -2396, -2151, -1693, -1067, -331, 455, 1226, 1910, 2427, 2716, 2739, 2492, 2001, 1311, 486, -397, -1242, -1942, -2385, -2488, -2231, -1666, -908, -102, 615, 1141, 1415 }, + { 9823, 9815, 10012, 10694, 11683, 12137, 11466, 10256, 9623, 9773, 9978, 9921, 10161, 11073, 12154, 12752, 12865, 12819, 12627, 12110, 11337, 10580, 9962, 9420, 8908, 8455, 8074, 7735, 7394, 7028, 6665, 6384, 6233, 6156, 6055, 5904, 5760, 5688, 5729, 5890, 6141, 6428, 6726, 7041, 7370, 7686, 7966, 8196, 8352, 8411, 8375, 8283, 8183, 8124, 8141, 8239, 8405, 8617, 8841, 9026, 9124, 9115, 9002, 8779, 8442, 8015, 7534, 7014, 6446, 5828, 5171, 4479, 3750, 2996, 2247, 1540, 909, 387, 10, -188 } + }, + { + { 8979, 8928, 9106, 9705, 10482, 10892, 10637, 9976, 9361, 8934, 8597, 8419, 8650, 9299, 10028, 10515, 10716, 10680, 10366, 9782, 9137, 8665, 8381, 8126, 7795, 7409, 7008, 6593, 6163, 5738, 5320, 4889, 4432, 3964, 3509, 3103, 2799, 2654, 2686, 2853, 3094, 3371, 3667, 3960, 4213, 4409, 4555, 4668, 4760, 4845, 4938, 5053, 5193, 5354, 5516, 5651, 5736, 5758, 5706, 5572, 5362, 5103, 4813, 4491, 4125, 3710, 3244, 2723, 2149, 1552, 973, 453, 18, -320, -559, -718, -822, -893, -939, -964 }, + { 7612, 6985, 5545, 3384, 1185, -226, -747, -1136, -2041, -3195, -3903, -4070, -4229, -4673, -5084, -5074, -4620, -3849, -2788, -1519, -294, 704, 1541, 2339, 3068, 3625, 4002, 4247, 4349, 4239, 3868, 3237, 2402, 1476, 569, -281, -1078, -1791, -2344, -2690, -2842, -2844, -2751, -2612, -2463, -2313, -2165, -2014, -1839, -1586, -1201, -664, 5, 755, 1503, 2168, 2702, 3101, 3370, 3509, 3502, 3329, 2971, 2423, 1712, 894, 39, -783, -1515, -2118, -2567, -2844, -2924, -2789, -2439, -1915, -1299, -702, -232, 24 } + }, + { + { 7612, 6985, 5545, 3384, 1185, -226, -747, -1136, -2041, -3195, -3903, -4070, -4229, -4673, -5084, -5074, -4620, -3849, -2788, -1519, -294, 704, 1541, 2339, 3068, 3625, 4002, 4247, 4349, 4239, 3868, 3237, 2402, 1476, 569, -281, -1078, -1791, -2344, -2690, -2842, -2844, -2751, -2612, -2463, -2313, -2165, -2014, -1839, -1586, -1201, -664, 5, 755, 1503, 2168, 2702, 3101, 3370, 3509, 3502, 3329, 2971, 2423, 1712, 894, 39, -783, -1515, -2118, -2567, -2844, -2924, -2789, -2439, -1915, -1299, -702, -232, 24 }, + { 8979, 8928, 9106, 9705, 10482, 10892, 10637, 9976, 9361, 8934, 8597, 8419, 8650, 9299, 10028, 10515, 10716, 10680, 10366, 9782, 9137, 8665, 8381, 8126, 7795, 7409, 7008, 6593, 6163, 5738, 5320, 4889, 4432, 3964, 3509, 3103, 2799, 2654, 2686, 2853, 3094, 3371, 3667, 3960, 4213, 4409, 4555, 4668, 4760, 4845, 4938, 5053, 5193, 5354, 5516, 5651, 5736, 5758, 5706, 5572, 5362, 5103, 4813, 4491, 4125, 3710, 3244, 2723, 2149, 1552, 973, 453, 18, -320, -559, -718, -822, -893, -939, -964 } + } +}; +const Word16 CRendBin_Combined_HRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + { 195, 561, 817, 772, 310, -188, -112, 351, 211, -639, -620, 1516, 4560, 6130, 5693, 4845, 4734, 4750, 3977, 2534, 931, -778, -2518, -3620, -3454, -2247, -785, 438, 1449, 2391, 3210, 3668, 3495, 2576, 1087, -591, -2132, -3431, -4543, -5536, -6386, -6986, -7265, -7290, -7232, -7239, -7375, -7648, -8017, -8387, -8652, -8773, -8780, -8723, -8635, -8540, -8457, -8415, -8448, -8576, -8784, -9045, -9349, -9682, -9979, -10135, -10059, -9712, -9103, -8288, -7357, -6401, -5474, -4602, -3799, -3065, -2380, -1713, -1038, -348 }, + { -657, -2549, -4974, -6484, -6559, -6229, -6052, -5291, -3657, -2288, -2276, -3453, -5084, -6570, -7089, -5805, -3048, -282, 1554, 2807, 3913, 4545, 4440, 4159, 4334, 4849, 5320, 5820, 6515, 7047, 6879, 6027, 4914, 3637, 1895, -340, -2504, -3974, -4666, -4963, -5187, -5383, -5501, -5560, -5547, -5349, -4885, -4215, -3439, -2581, -1635, -650, 294, 1155, 1917, 2558, 3082, 3523, 3890, 4148, 4265, 4225, 4016, 3632, 3116, 2549, 1998, 1488, 1038, 675, 415, 249, 155, 102, 64, 27, -12, -40, -43, -18 } + }, + { + { -657, -2549, -4974, -6484, -6559, -6229, -6052, -5291, -3657, -2288, -2276, -3453, -5084, -6570, -7089, -5805, -3048, -282, 1554, 2807, 3913, 4545, 4440, 4159, 4334, 4849, 5320, 5820, 6515, 7047, 6879, 6027, 4914, 3637, 1895, -340, -2504, -3974, -4666, -4963, -5187, -5383, -5501, -5560, -5547, -5349, -4885, -4215, -3439, -2581, -1635, -650, 294, 1155, 1917, 2558, 3082, 3523, 3890, 4148, 4265, 4225, 4016, 3632, 3116, 2549, 1998, 1488, 1038, 675, 415, 249, 155, 102, 64, 27, -12, -40, -43, -18 }, + { 195, 561, 817, 772, 310, -188, -112, 351, 211, -639, -620, 1516, 4560, 6130, 5693, 4845, 4734, 4750, 3977, 2534, 931, -778, -2518, -3620, -3454, -2247, -785, 438, 1449, 2391, 3210, 3668, 3495, 2576, 1087, -591, -2132, -3431, -4543, -5536, -6386, -6986, -7265, -7290, -7232, -7239, -7375, -7648, -8017, -8387, -8652, -8773, -8780, -8723, -8635, -8540, -8457, -8415, -8448, -8576, -8784, -9045, -9349, -9682, -9979, -10135, -10059, -9712, -9103, -8288, -7357, -6401, -5474, -4602, -3799, -3065, -2380, -1713, -1038, -348 } + }, + { + { 182, 214, -554, -1718, -1959, -765, 220, -810, -2702, -2268, 1299, 4914, 5460, 3532, 2054, 2380, 3227, 2902, 1176, -994, -2598, -3175, -2851, -2085, -1252, -452, 275, 728, 649, -74, -1361, -2960, -4496, -5675, -6490, -7095, -7487, -7473, -6968, -6173, -5418, -4951, -4871, -5139, -5587, -6022, -6359, -6639, -6906, -7127, -7232, -7196, -7061, -6886, -6710, -6536, -6362, -6198, -6045, -5869, -5632, -5343, -5048, -4767, -4478, -4154, -3804, -3453, -3112, -2773, -2421, -2059, -1705, -1383, -1100, -853, -632, -433, -253, -83 }, + { 182, 214, -554, -1718, -1959, -765, 220, -810, -2702, -2268, 1299, 4914, 5460, 3532, 2054, 2380, 3227, 2902, 1176, -994, -2598, -3175, -2851, -2085, -1252, -452, 275, 728, 649, -74, -1361, -2960, -4496, -5675, -6490, -7095, -7487, -7473, -6968, -6173, -5418, -4951, -4871, -5139, -5587, -6022, -6359, -6639, -6906, -7127, -7232, -7196, -7061, -6886, -6710, -6536, -6362, -6198, -6045, -5869, -5632, -5343, -5048, -4767, -4478, -4154, -3804, -3453, -3112, -2773, -2421, -2059, -1705, -1383, -1100, -853, -632, -433, -253, -83 } + }, + { + { 103, 559, 1273, 1727, 1756, 1506, 745, -704, -2115, -2623, -2618, -3170, -4265, -4905, -4804, -4704, -4988, -5225, -5175, -5141, -5181, -4916, -4279, -3688, -3351, -3110, -2977, -3158, -3517, -3601, -3264, -2778, -2327, -1826, -1239, -684, -216, 214, 562, 702, 610, 387, 120, -132, -292, -309, -211, -65, 67, 110, -22, -367, -897, -1558, -2280, -2966, -3535, -3973, -4302, -4530, -4654, -4682, -4623, -4465, -4193, -3811, -3340, -2799, -2225, -1664, -1155, -724, -387, -147, 8, 95, 126, 111, 71, 23 }, + { -1390, -3924, -5634, -6109, -5627, -4871, -4051, -2870, -1368, -143, 459, 772, 1192, 1656, 2044, 2600, 3547, 4562, 4987, 4437, 3021, 1135, -750, -2262, -3277, -3859, -4029, -3728, -3035, -2223, -1523, -952, -429, 71, 564, 1108, 1722, 2305, 2695, 2777, 2507, 1916, 1116, 279, -439, -943, -1191, -1198, -1043, -834, -656, -538, -478, -455, -444, -422, -382, -331, -278, -234, -204, -175, -125, -24, 151, 419, 771, 1155, 1483, 1666, 1642, 1394, 971, 467, 0, -338, -502, -494, -350, -125 } + }, + { + { -1390, -3924, -5634, -6109, -5627, -4871, -4051, -2870, -1368, -143, 459, 772, 1192, 1656, 2044, 2600, 3547, 4562, 4987, 4437, 3021, 1135, -750, -2262, -3277, -3859, -4029, -3728, -3035, -2223, -1523, -952, -429, 71, 564, 1108, 1722, 2305, 2695, 2777, 2507, 1916, 1116, 279, -439, -943, -1191, -1198, -1043, -834, -656, -538, -478, -455, -444, -422, -382, -331, -278, -234, -204, -175, -125, -24, 151, 419, 771, 1155, 1483, 1666, 1642, 1394, 971, 467, 0, -338, -502, -494, -350, -125 }, + { 103, 559, 1273, 1727, 1756, 1506, 745, -704, -2115, -2623, -2618, -3170, -4265, -4905, -4804, -4704, -4988, -5225, -5175, -5141, -5181, -4916, -4279, -3688, -3351, -3110, -2977, -3158, -3517, -3601, -3264, -2778, -2327, -1826, -1239, -684, -216, 214, 562, 702, 610, 387, 120, -132, -292, -309, -211, -65, 67, 110, -22, -367, -897, -1558, -2280, -2966, -3535, -3973, -4302, -4530, -4654, -4682, -4623, -4465, -4193, -3811, -3340, -2799, -2225, -1664, -1155, -724, -387, -147, 8, 95, 126, 111, 71, 23 } + }, + { + { 130, 690, 1645, 2332, 2184, 1369, 336, -818, -2070, -2956, -3020, -2641, -2670, -3191, -3419, -2975, -2487, -2566, -2897, -2857, -2491, -2257, -2216, -2054, -1709, -1424, -1285, -1112, -794, -431, -148, 19, 83, 105, 201, 440, 775, 1111, 1389, 1572, 1626, 1555, 1397, 1170, 864, 501, 134, -205, -519, -828, -1151, -1515, -1935, -2406, -2912, -3433, -3937, -4402, -4831, -5226, -5560, -5812, -5986, -6093, -6119, -6045, -5877, -5626, -5280, -4829, -4286, -3685, -3063, -2451, -1883, -1385, -969, -632, -357, -116 }, + { -1860, -5005, -6707, -6779, -5631, -3748, -1318, 1485, 4035, 5439, 5293, 4030, 2431, 949, -377, -1559, -2443, -2851, -2808, -2500, -2034, -1340, -364, 715, 1586, 2094, 2297, 2253, 1916, 1270, 455, -347, -1033, -1557, -1863, -1904, -1682, -1229, -605, 75, 663, 1077, 1326, 1443, 1424, 1253, 930, 468, -96, -679, -1169, -1473, -1540, -1362, -975, -465, 61, 516, 853, 1053, 1127, 1106, 1009, 835, 569, 199, -267, -793, -1297, -1664, -1766, -1515, -899, -21, 913, 1657, 2011, 1890, 1333, 479 } + }, + { + { -1860, -5005, -6707, -6779, -5631, -3748, -1318, 1485, 4035, 5439, 5293, 4030, 2431, 949, -377, -1559, -2443, -2851, -2808, -2500, -2034, -1340, -364, 715, 1586, 2094, 2297, 2253, 1916, 1270, 455, -347, -1033, -1557, -1863, -1904, -1682, -1229, -605, 75, 663, 1077, 1326, 1443, 1424, 1253, 930, 468, -96, -679, -1169, -1473, -1540, -1362, -975, -465, 61, 516, 853, 1053, 1127, 1106, 1009, 835, 569, 199, -267, -793, -1297, -1664, -1766, -1515, -899, -21, 913, 1657, 2011, 1890, 1333, 479 }, + { 130, 690, 1645, 2332, 2184, 1369, 336, -818, -2070, -2956, -3020, -2641, -2670, -3191, -3419, -2975, -2487, -2566, -2897, -2857, -2491, -2257, -2216, -2054, -1709, -1424, -1285, -1112, -794, -431, -148, 19, 83, 105, 201, 440, 775, 1111, 1389, 1572, 1626, 1555, 1397, 1170, 864, 501, 134, -205, -519, -828, -1151, -1515, -1935, -2406, -2912, -3433, -3937, -4402, -4831, -5226, -5560, -5812, -5986, -6093, -6119, -6045, -5877, -5626, -5280, -4829, -4286, -3685, -3063, -2451, -1883, -1385, -969, -632, -357, -116 } + }, + { + { 369, 985, 1537, 2199, 2473, 1623, -11, -1223, -1629, -2033, -2808, -3094, -2240, -994, -433, -487, -412, -134, -168, -539, -718, -558, -538, -966, -1518, -1716, -1467, -1002, -566, -259, -7, 387, 1011, 1650, 1965, 1847, 1481, 1081, 705, 342, 29, -183, -302, -391, -521, -739, -1064, -1493, -2027, -2674, -3417, -4200, -4954, -5639, -6231, -6710, -7078, -7373, -7653, -7959, -8313, -8726, -9194, -9684, -10124, -10433, -10545, -10418, -10028, -9383, -8529, -7538, -6478, -5399, -4349, -3374, -2500, -1720, -1006, -331 }, + { -2055, -5418, -7057, -6941, -5445, -2810, 630, 4009, 6179, 6517, 5286, 3178, 714, -1822, -4061, -5446, -5532, -4307, -2178, 298, 2623, 4372, 5149, 4703, 3132, 903, -1370, -3187, -4227, -4315, -3441, -1833, 95, 1889, 3167, 3658, 3269, 2163, 706, -712, -1821, -2477, -2608, -2216, -1409, -384, 636, 1450, 1905, 1931, 1564, 936, 214, -456, -973, -1272, -1325, -1151, -807, -367, 94, 510, 824, 1001, 1030, 916, 668, 305, -140, -607, -1002, -1207, -1124, -735, -138, 482, 926, 1051, 818, 307 } + }, + { + { -2055, -5418, -7057, -6941, -5445, -2810, 630, 4009, 6179, 6517, 5286, 3178, 714, -1822, -4061, -5446, -5532, -4307, -2178, 298, 2623, 4372, 5149, 4703, 3132, 903, -1370, -3187, -4227, -4315, -3441, -1833, 95, 1889, 3167, 3658, 3269, 2163, 706, -712, -1821, -2477, -2608, -2216, -1409, -384, 636, 1450, 1905, 1931, 1564, 936, 214, -456, -973, -1272, -1325, -1151, -807, -367, 94, 510, 824, 1001, 1030, 916, 668, 305, -140, -607, -1002, -1207, -1124, -735, -138, 482, 926, 1051, 818, 307 }, + { 369, 985, 1537, 2199, 2473, 1623, -11, -1223, -1629, -2033, -2808, -3094, -2240, -994, -433, -487, -412, -134, -168, -539, -718, -558, -538, -966, -1518, -1716, -1467, -1002, -566, -259, -7, 387, 1011, 1650, 1965, 1847, 1481, 1081, 705, 342, 29, -183, -302, -391, -521, -739, -1064, -1493, -2027, -2674, -3417, -4200, -4954, -5639, -6231, -6710, -7078, -7373, -7653, -7959, -8313, -8726, -9194, -9684, -10124, -10433, -10545, -10418, -10028, -9383, -8529, -7538, -6478, -5399, -4349, -3374, -2500, -1720, -1006, -331 } + }, + { + { -47, -178, -368, -531, -578, -481, -124, 794, 2362, 3974, 4656, 4028, 2605, 1095, -134, -856, -844, -210, 585, 1281, 1947, 2464, 2413, 1685, 735, 43, -276, -211, 277, 981, 1474, 1579, 1456, 1163, 522, -489, -1581, -2499, -3228, -3812, -4236, -4543, -4832, -5114, -5325, -5459, -5568, -5665, -5754, -5886, -6082, -6274, -6408, -6531, -6702, -6916, -7153, -7428, -7735, -8023, -8258, -8456, -8645, -8843, -9061, -9313, -9594, -9882, -10131, -10275, -10256, -10049, -9641, -9004, -8120, -7008, -5702, -4223, -2598, -876 }, + { -1066, -3054, -4745, -5984, -6277, -5227, -3390, -2143, -2502, -4335, -6630, -8158, -8098, -6618, -4831, -3802, -3630, -3754, -3823, -3762, -3302, -2129, -482, 944, 1749, 2137, 2493, 3006, 3706, 4560, 5420, 6082, 6413, 6390, 6058, 5557, 5088, 4756, 4482, 4124, 3620, 2994, 2293, 1574, 877, 190, -518, -1242, -1950, -2633, -3302, -3950, -4563, -5133, -5632, -6004, -6211, -6262, -6170, -5930, -5548, -5049, -4455, -3775, -3034, -2259, -1459, -624, 236, 1075, 1835, 2461, 2907, 3141, 3158, 2964, 2568, 1987, 1256, 429 } + }, + { + { -1066, -3054, -4745, -5984, -6277, -5227, -3390, -2143, -2502, -4335, -6630, -8158, -8098, -6618, -4831, -3802, -3630, -3754, -3823, -3762, -3302, -2129, -482, 944, 1749, 2137, 2493, 3006, 3706, 4560, 5420, 6082, 6413, 6390, 6058, 5557, 5088, 4756, 4482, 4124, 3620, 2994, 2293, 1574, 877, 190, -518, -1242, -1950, -2633, -3302, -3950, -4563, -5133, -5632, -6004, -6211, -6262, -6170, -5930, -5548, -5049, -4455, -3775, -3034, -2259, -1459, -624, 236, 1075, 1835, 2461, 2907, 3141, 3158, 2964, 2568, 1987, 1256, 429 }, + { -47, -178, -368, -531, -578, -481, -124, 794, 2362, 3974, 4656, 4028, 2605, 1095, -134, -856, -844, -210, 585, 1281, 1947, 2464, 2413, 1685, 735, 43, -276, -211, 277, 981, 1474, 1579, 1456, 1163, 522, -489, -1581, -2499, -3228, -3812, -4236, -4543, -4832, -5114, -5325, -5459, -5568, -5665, -5754, -5886, -6082, -6274, -6408, -6531, -6702, -6916, -7153, -7428, -7735, -8023, -8258, -8456, -8645, -8843, -9061, -9313, -9594, -9882, -10131, -10275, -10256, -10049, -9641, -9004, -8120, -7008, -5702, -4223, -2598, -876 } + }, + { + { 82, 330, 743, 1055, 678, -523, -1690, -1841, -1134, -549, -435, -227, 353, 713, 293, -650, -1570, -2374, -3233, -4061, -4597, -4802, -4852, -4856, -4800, -4676, -4527, -4388, -4253, -4084, -3825, -3474, -3114, -2830, -2607, -2360, -2032, -1633, -1204, -805, -486, -259, -99, 3, 31, -24, -152, -342, -583, -843, -1067, -1216, -1279, -1270, -1226, -1195, -1216, -1317, -1525, -1848, -2259, -2718, -3195, -3672, -4115, -4489, -4789, -5031, -5218, -5336, -5375, -5333, -5195, -4935, -4531, -3981, -3289, -2465, -1530, -519 }, + { -1520, -4372, -6516, -7324, -6597, -4944, -3368, -2372, -1591, -362, 1413, 3139, 4179, 4467, 4387, 4221, 3863, 3051, 1744, 212, -1174, -2198, -2879, -3349, -3667, -3754, -3495, -2867, -1949, -846, 344, 1483, 2400, 2973, 3180, 3071, 2709, 2151, 1473, 759, 78, -528, -1043, -1460, -1781, -2005, -2124, -2126, -2004, -1748, -1349, -805, -144, 579, 1282, 1886, 2328, 2567, 2582, 2358, 1901, 1241, 442, -413, -1235, -1941, -2462, -2742, -2742, -2443, -1860, -1054, -143, 723, 1396, 1770, 1805, 1527, 1012, 353 } + }, + { + { -1520, -4372, -6516, -7324, -6597, -4944, -3368, -2372, -1591, -362, 1413, 3139, 4179, 4467, 4387, 4221, 3863, 3051, 1744, 212, -1174, -2198, -2879, -3349, -3667, -3754, -3495, -2867, -1949, -846, 344, 1483, 2400, 2973, 3180, 3071, 2709, 2151, 1473, 759, 78, -528, -1043, -1460, -1781, -2005, -2124, -2126, -2004, -1748, -1349, -805, -144, 579, 1282, 1886, 2328, 2567, 2582, 2358, 1901, 1241, 442, -413, -1235, -1941, -2462, -2742, -2742, -2443, -1860, -1054, -143, 723, 1396, 1770, 1805, 1527, 1012, 353 }, + { 82, 330, 743, 1055, 678, -523, -1690, -1841, -1134, -549, -435, -227, 353, 713, 293, -650, -1570, -2374, -3233, -4061, -4597, -4802, -4852, -4856, -4800, -4676, -4527, -4388, -4253, -4084, -3825, -3474, -3114, -2830, -2607, -2360, -2032, -1633, -1204, -805, -486, -259, -99, 3, 31, -24, -152, -342, -583, -843, -1067, -1216, -1279, -1270, -1226, -1195, -1216, -1317, -1525, -1848, -2259, -2718, -3195, -3672, -4115, -4489, -4789, -5031, -5218, -5336, -5375, -5333, -5195, -4935, -4531, -3981, -3289, -2465, -1530, -519 } + }, + { + { 14, 163, 486, 664, 293, -623, -1587, -2116, -2196, -2092, -1879, -1455, -940, -711, -984, -1615, -2369, -3166, -3948, -4533, -4787, -4825, -4879, -5043, -5240, -5392, -5497, -5568, -5592, -5568, -5513, -5432, -5299, -5085, -4773, -4350, -3819, -3224, -2648, -2160, -1781, -1500, -1310, -1215, -1200, -1233, -1279, -1325, -1363, -1392, -1413, -1439, -1489, -1583, -1740, -1963, -2241, -2558, -2898, -3239, -3553, -3824, -4062, -4279, -4474, -4636, -4757, -4820, -4796, -4656, -4392, -4020, -3565, -3061, -2542, -2037, -1559, -1103, -659, -220 }, + { -1089, -3258, -5187, -6315, -6255, -5395, -4674, -4571, -4593, -4042, -2995, -2090, -1543, -930, 103, 1394, 2623, 3676, 4493, 4918, 4896, 4614, 4263, 3827, 3214, 2454, 1639, 786, -137, -1117, -2078, -2916, -3531, -3870, -3964, -3877, -3627, -3199, -2614, -1952, -1300, -712, -214, 197, 545, 858, 1156, 1464, 1809, 2200, 2599, 2936, 3142, 3156, 2953, 2556, 2022, 1403, 724, -2, -763, -1535, -2277, -2930, -3429, -3723, -3791, -3639, -3297, -2802, -2195, -1509, -785, -79, 529, 957, 1140, 1057, 740, 265 } + }, + { + { -1089, -3258, -5187, -6315, -6255, -5395, -4674, -4571, -4593, -4042, -2995, -2090, -1543, -930, 103, 1394, 2623, 3676, 4493, 4918, 4896, 4614, 4263, 3827, 3214, 2454, 1639, 786, -137, -1117, -2078, -2916, -3531, -3870, -3964, -3877, -3627, -3199, -2614, -1952, -1300, -712, -214, 197, 545, 858, 1156, 1464, 1809, 2200, 2599, 2936, 3142, 3156, 2953, 2556, 2022, 1403, 724, -2, -763, -1535, -2277, -2930, -3429, -3723, -3791, -3639, -3297, -2802, -2195, -1509, -785, -79, 529, 957, 1140, 1057, 740, 265 }, + { 14, 163, 486, 664, 293, -623, -1587, -2116, -2196, -2092, -1879, -1455, -940, -711, -984, -1615, -2369, -3166, -3948, -4533, -4787, -4825, -4879, -5043, -5240, -5392, -5497, -5568, -5592, -5568, -5513, -5432, -5299, -5085, -4773, -4350, -3819, -3224, -2648, -2160, -1781, -1500, -1310, -1215, -1200, -1233, -1279, -1325, -1363, -1392, -1413, -1439, -1489, -1583, -1740, -1963, -2241, -2558, -2898, -3239, -3553, -3824, -4062, -4279, -4474, -4636, -4757, -4820, -4796, -4656, -4392, -4020, -3565, -3061, -2542, -2037, -1559, -1103, -659, -220 } + } +}; +const Word16 *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; /********************** CRendBin_FOA_HRIR **********************/ -const Word32 CRendBin_FOA_HRIR_latency_s_fx = 44741; // Q31 +const Word16 CRendBin_FOA_HRIR_Q_latency_s_fx = 31; +const Word32 CRendBin_FOA_HRIR_latency_s_fx = 2;/*Q-31*/ /* Sample Rate = 48000 */ const Word16 CRendBin_FOA_HRIR_max_num_iterations_48kHz = 1; -const UWord16 CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; -const UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; -const UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz = 0; -const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[4]={0, 0, 0, 0}; -const UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_FOA_HRIR_num_iterations_48kHz[FOA_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const Word16 CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const Word16 CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const Word16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz = 0; +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_Q_48kHz_fx = 0; +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]={{0, 0, 0, 0},{0, 0, 0, 0}}; +const Word16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_FOA_HRIR_coeff_Q_48kHz_fx = 14; +const Word16 CRendBin_FOA_HRIR_coeff_re_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {15831, 12015, 6081, 228, -4182, -7041, -8906, -10180, -10812, -10551, -9307, -7250, -4684, -1918, 791, 3247, 5333, 7035, 8406, 9503, 10331, 10868, 11128, 11185, 11114, 10932, 10612, 10153, 9599, 9002, 8387, 7766, 7156, 6571, 6010, 5460, 4919, 4395, 3899, 3430, 2976, 2527, 2078, 1633, 1192, 757, 333, -79, -480, -873, -1257, -1630, -1991, -2340, -2674, -2992, -3293, -3578, -3850, -4108, -4354, -4586, -4808, -5019, -5218, -5403, -5577, -5741, -5899, -6051, -6200, -6349, -6498, -6648, -6800, -6959, -7125, -7298, -7480, -7674, -7877, -8086, -8299, -8516, -8731, -8938, -9133, -9317, -9492, -9660, -9820, -9967, -10098, -10210, -10306, -10390, + -10461, -10523, -10579, -10628, -10672, -10713, -10754, -10798, -10847, -10903, -10962, -11026, -11097, -11181, -11275, -11374, -11471, -11564, -11653, -11735, -11814, -11890, -11960, -12026, -12089, -12151, -12212, -12271, -12328, -12380, -12427, -12469, -12508, -12543, -12572, -12596, -12616, -12633, -12648, -12665, -12685, -12705, -12724, -12745, -12766, -12786, -12808, -12832, -12855, -12876, -12896, -12914, -12928, -12939, -12951, -12964, -12976, -12987, -13000, -13012, -13021, -13025, -13028, -13027, -13023, -13018, -13016, -13014, -13012, -13014, -13018, -13020, -13018, -13018, -13018, -13015, -13011, -13011, -13011, -13009, -13007, -13007, -13004, -13000, -13001, -13009, -13016, -13024, -13041, -13062, -13077, -13092, -13114, -13133, -13145, -13157, + -13177, -13189, -13192, -13202, -13218, -13218, -13207, -13212, -13220, -13195, -13150, -13132, -13127, -13084, -13035, -13055, -13115, -13107, -13027, -12947, -12816, -12499, -12082, -11907, -12168, -12614, -12825, -12666, -12356, -12156, -12103, -12058, -11959, -12014, -12538, -13523, -14481, -14884, -14719, -14424, -14310, -14286, -14196, -14128, -14229, -14418, -14507, -14487 }, + {15831, 12015, 6081, 228, -4182, -7041, -8906, -10180, -10812, -10551, -9307, -7250, -4684, -1918, 791, 3247, 5333, 7035, 8406, 9503, 10331, 10868, 11128, 11185, 11114, 10932, 10612, 10153, 9599, 9002, 8387, 7766, 7156, 6571, 6010, 5460, 4919, 4395, 3899, 3430, 2976, 2527, 2078, 1633, 1192, 757, 333, -79, -480, -873, -1257, -1630, -1991, -2340, -2674, -2992, -3293, -3578, -3850, -4108, -4354, -4586, -4808, -5019, -5218, -5403, -5577, -5741, -5899, -6051, -6200, -6349, -6498, -6648, -6800, -6959, -7125, -7298, -7480, -7674, -7877, -8086, -8299, -8516, -8731, -8938, -9133, -9317, -9492, -9660, -9820, -9967, -10098, -10210, -10306, -10390, + -10461, -10523, -10579, -10628, -10672, -10713, -10754, -10798, -10847, -10903, -10962, -11026, -11097, -11181, -11275, -11374, -11471, -11564, -11653, -11735, -11814, -11890, -11960, -12026, -12089, -12151, -12212, -12271, -12328, -12380, -12427, -12469, -12508, -12543, -12572, -12596, -12616, -12633, -12648, -12665, -12685, -12705, -12724, -12745, -12766, -12786, -12808, -12832, -12855, -12876, -12896, -12914, -12928, -12939, -12951, -12964, -12976, -12987, -13000, -13012, -13021, -13025, -13028, -13027, -13023, -13018, -13016, -13014, -13012, -13014, -13018, -13020, -13018, -13018, -13018, -13015, -13011, -13011, -13011, -13009, -13007, -13007, -13004, -13000, -13001, -13009, -13016, -13024, -13041, -13062, -13077, -13092, -13114, -13133, -13145, -13157, + -13177, -13189, -13192, -13202, -13218, -13218, -13207, -13212, -13220, -13195, -13150, -13132, -13127, -13084, -13035, -13055, -13115, -13107, -13027, -12947, -12816, -12499, -12082, -11907, -12168, -12614, -12825, -12666, -12356, -12156, -12103, -12058, -11959, -12014, -12538, -13523, -14481, -14884, -14719, -14424, -14310, -14286, -14196, -14128, -14229, -14418, -14507, -14487 } + }, + { + {1139, 5779, 11703, 14505, 11689, 4085, -5221, -13206, -18426, -20871, -21077, -19577, -16851, -13330, -9353, -5179, -1056, 2789, 6187, 9061, 11418, 13345, 14934, 16211, 17146, 17741, 18074, 18238, 18290, 18250, 18128, 17918, 17609, 17210, 16748, 16246, 15713, 15140, 14511, 13816, 13065, 12288, 11511, 10743, 9989, 9252, 8533, 7831, 7151, 6504, 5890, 5302, 4732, 4173, 3624, 3092, 2587, 2115, 1675, 1274, 916, 593, 297, 24, -223, -451, -672, -888, -1095, -1293, -1491, -1689, -1884, -2079, -2283, -2499, -2725, -2959, -3205, -3466, -3738, -4016, -4299, -4591, -4892, -5199, -5506, -5811, -6115, -6425, -6752, -7106, -7487, -7880, -8273, -8667, + -9063, -9456, -9831, -10177, -10484, -10753, -10989, -11197, -11367, -11488, -11556, -11582, -11578, -11553, -11514, -11467, -11421, -11384, -11360, -11349, -11347, -11356, -11386, -11440, -11514, -11600, -11688, -11770, -11840, -11903, -11965, -12025, -12081, -12136, -12190, -12240, -12282, -12318, -12348, -12373, -12400, -12431, -12469, -12510, -12553, -12599, -12647, -12699, -12761, -12835, -12918, -13011, -13110, -13212, -13313, -13416, -13527, -13642, -13759, -13883, -14011, -14136, -14251, -14358, -14456, -14541, -14614, -14680, -14737, -14782, -14816, -14843, -14858, -14862, -14866, -14874, -14881, -14888, -14905, -14925, -14934, -14930, -14917, -14894, -14860, -14827, -14801, -14772, -14741, -14721, -14710, -14692, -14669, -14658, -14652, -14639, + -14631, -14635, -14632, -14626, -14644, -14667, -14654, -14644, -14700, -14746, -14684, -14650, -14802, -14918, -14639, -14162, -14078, -14447, -14706, -14697, -14923, -15461, -15489, -14510, -13285, -12869, -13284, -13763, -13795, -13406, -12900, -12665, -12645, -11793, -9021, -5140, -2748, -3407, -5796, -7498, -7815, -7812, -8202, -8392, -7548, -5720, -3736, -2491 }, + {-1139, -5779, -11703, -14505, -11689, -4085, 5221, 13206, 18426, 20871, 21077, 19577, 16851, 13330, 9353, 5179, 1056, -2789, -6187, -9061, -11418, -13345, -14934, -16211, -17146, -17741, -18074, -18238, -18290, -18250, -18128, -17918, -17609, -17210, -16748, -16246, -15713, -15140, -14511, -13816, -13065, -12288, -11511, -10743, -9989, -9252, -8533, -7831, -7151, -6504, -5890, -5302, -4732, -4173, -3624, -3092, -2587, -2115, -1675, -1274, -916, -593, -297, -24, 223, 451, 672, 888, 1095, 1293, 1491, 1689, 1884, 2079, 2283, 2499, 2725, 2959, 3205, 3466, 3738, 4016, 4299, 4591, 4892, 5199, 5506, 5811, 6115, 6425, 6752, 7106, 7487, 7880, 8273, 8667, + 9063, 9456, 9831, 10177, 10484, 10753, 10989, 11197, 11367, 11488, 11556, 11582, 11578, 11553, 11514, 11467, 11421, 11384, 11360, 11349, 11347, 11356, 11386, 11440, 11514, 11600, 11688, 11770, 11840, 11903, 11965, 12025, 12081, 12136, 12190, 12240, 12282, 12318, 12348, 12373, 12400, 12431, 12469, 12510, 12553, 12599, 12647, 12699, 12761, 12835, 12918, 13011, 13110, 13212, 13313, 13416, 13527, 13642, 13759, 13883, 14011, 14136, 14251, 14358, 14456, 14541, 14614, 14680, 14737, 14782, 14816, 14843, 14858, 14862, 14866, 14874, 14881, 14888, 14905, 14925, 14934, 14930, 14917, 14894, 14860, 14827, 14801, 14772, 14741, 14721, 14710, 14692, 14669, 14658, 14652, 14639, + 14631, 14635, 14632, 14626, 14644, 14667, 14654, 14644, 14700, 14746, 14684, 14650, 14802, 14918, 14639, 14162, 14078, 14447, 14706, 14697, 14923, 15461, 15489, 14510, 13285, 12869, 13284, 13763, 13795, 13406, 12900, 12665, 12645, 11793, 9021, 5140, 2748, 3407, 5796, 7498, 7815, 7812, 8202, 8392, 7548, 5720, 3736, 2491 } + }, + { + {1832, 1518, 322, -1390, -2156, -1241, 343, 1160, 935, 281, -406, -1040, -1342, -1043, -434, -83, -76, 32, 533, 1255, 1922, 2464, 2897, 3146, 3132, 2911, 2637, 2435, 2308, 2164, 1912, 1554, 1167, 810, 508, 298, 230, 314, 496, 707, 908, 1082, 1224, 1333, 1403, 1429, 1413, 1366, 1279, 1133, 909, 601, 207, -264, -804, -1403, -2057, -2755, -3476, -4213, -4962, -5706, -6420, -7097, -7734, -8310, -8799, -9191, -9491, -9686, -9762, -9723, -9571, -9300, -8915, -8446, -7913, -7314, -6657, -5982, -5336, -4724, -4135, -3580, -3101, -2724, -2426, -2161, -1926, -1767, -1714, -1732, -1763, -1788, -1825, -1888, + -1969, -2053, -2129, -2177, -2184, -2153, -2093, -2010, -1896, -1739, -1523, -1251, -954, -667, -397, -134, 119, 357, 578, 775, 932, 1036, 1089, 1088, 1029, 921, 777, 596, 377, 128, -133, -399, -666, -918, -1150, -1364, -1552, -1700, -1813, -1911, -2004, -2098, -2210, -2344, -2477, -2584, -2668, -2739, -2787, -2808, -2816, -2811, -2785, -2743, -2704, -2668, -2623, -2582, -2556, -2533, -2498, -2462, -2428, -2379, -2308, -2236, -2163, -2067, -1953, -1842, -1732, -1611, -1502, -1428, -1364, -1295, -1245, -1220, -1186, -1133, -1085, -1024, -911, -767, -632, -478, -273, -65, 110, 304, 536, 736, 889, 1070, 1264, 1391, + 1503, 1693, 1851, 1880, 1974, 2254, 2410, 2282, 2346, 2832, 3028, 2565, 2555, 3873, 5038, 3947, 1297, -121, 538, 1423, 1503, 2016, 3525, 4216, 2660, 239, -826, -393, 104, -14, -168, 358, 1654, 3015, 3167, 1473, -822, -1567, -263, 1366, 1739, 1238, 1070, 1376, 1390, 849, 246, -39 }, + {1832, 1518, 322, -1390, -2156, -1241, 343, 1160, 935, 281, -406, -1040, -1342, -1043, -434, -83, -76, 32, 533, 1255, 1922, 2464, 2897, 3146, 3132, 2911, 2637, 2435, 2308, 2164, 1912, 1554, 1167, 810, 508, 298, 230, 314, 496, 707, 908, 1082, 1224, 1333, 1403, 1429, 1413, 1366, 1279, 1133, 909, 601, 207, -264, -804, -1403, -2057, -2755, -3476, -4213, -4962, -5706, -6420, -7097, -7734, -8310, -8799, -9191, -9491, -9686, -9762, -9723, -9571, -9300, -8915, -8446, -7913, -7314, -6657, -5982, -5336, -4724, -4135, -3580, -3101, -2724, -2426, -2161, -1926, -1767, -1714, -1732, -1763, -1788, -1825, -1888, + -1969, -2053, -2129, -2177, -2184, -2153, -2093, -2010, -1896, -1739, -1523, -1251, -954, -667, -397, -134, 119, 357, 578, 775, 932, 1036, 1089, 1088, 1029, 921, 777, 596, 377, 128, -133, -399, -666, -918, -1150, -1364, -1552, -1700, -1813, -1911, -2004, -2098, -2210, -2344, -2477, -2584, -2668, -2739, -2787, -2808, -2816, -2811, -2785, -2743, -2704, -2668, -2623, -2582, -2556, -2533, -2498, -2462, -2428, -2379, -2308, -2236, -2163, -2067, -1953, -1842, -1732, -1611, -1502, -1428, -1364, -1295, -1245, -1220, -1186, -1133, -1085, -1024, -911, -767, -632, -478, -273, -65, 110, 304, 536, 736, 889, 1070, 1264, 1391, + 1503, 1693, 1851, 1880, 1974, 2254, 2410, 2282, 2346, 2832, 3028, 2565, 2555, 3873, 5038, 3947, 1297, -121, 538, 1423, 1503, 2016, 3525, 4216, 2660, 239, -826, -393, 104, -14, -168, 358, 1654, 3015, 3167, 1473, -822, -1567, -263, 1366, 1739, 1238, 1070, 1376, 1390, 849, 246, -39 } + }, + { + {974, 1408, 1397, 456, -720, -1041, -320, 546, 603, -263, -1446, -2303, -2597, -2476, -2247, -2111, -2006, -1696, -1035, -101, 932, 1950, 2883, 3654, 4240, 4753, 5334, 5998, 6631, 7142, 7531, 7816, 7959, 7896, 7612, 7135, 6495, 5705, 4803, 3865, 2968, 2154, 1425, 775, 195, -325, -807, -1263, -1693, -2077, -2393, -2623, -2762, -2821, -2830, -2833, -2862, -2923, -3012, -3128, -3262, -3397, -3516, -3626, -3735, -3840, -3933, -4024, -4117, -4200, -4260, -4306, -4351, -4382, -4376, -4333, -4264, -4157, -3990, -3766, -3510, -3230, -2908, -2542, -2162, -1803, -1470, -1153, -844, -541, -232, 91, 415, 712, 978, 1229, + 1469, 1669, 1800, 1866, 1895, 1908, 1889, 1803, 1624, 1367, 1075, 780, 476, 133, -252, -651, -1021, -1342, -1621, -1890, -2174, -2467, -2736, -2958, -3131, -3271, -3401, -3542, -3698, -3857, -4005, -4143, -4281, -4425, -4578, -4746, -4930, -5120, -5312, -5505, -5695, -5875, -6045, -6205, -6348, -6466, -6558, -6620, -6646, -6632, -6588, -6519, -6425, -6320, -6215, -6111, -6008, -5913, -5833, -5762, -5701, -5663, -5649, -5650, -5660, -5686, -5720, -5746, -5765, -5788, -5815, -5848, -5901, -5978, -6060, -6140, -6230, -6325, -6406, -6474, -6543, -6598, -6615, -6606, -6585, -6529, -6430, -6319, -6211, -6075, -5917, -5781, -5661, -5518, -5380, -5284, + -5179, -5030, -4931, -4904, -4798, -4598, -4543, -4640, -4526, -4189, -4192, -4573, -4392, -3326, -2782, -4026, -5986, -6628, -5926, -5487, -5621, -5104, -3945, -3920, -5677, -7463, -7728, -7183, -7185, -7661, -7815, -7559, -7022, -5771, -3819, -2515, -3074, -4758, -5745, -5508, -5158, -5525, -6039, -5894, -5470, -5899, -7430, -8879 }, + {974, 1408, 1397, 456, -720, -1041, -320, 546, 603, -263, -1446, -2303, -2597, -2476, -2247, -2111, -2006, -1696, -1035, -101, 932, 1950, 2883, 3654, 4240, 4753, 5334, 5998, 6631, 7142, 7531, 7816, 7959, 7896, 7612, 7135, 6495, 5705, 4803, 3865, 2968, 2154, 1425, 775, 195, -325, -807, -1263, -1693, -2077, -2393, -2623, -2762, -2821, -2830, -2833, -2862, -2923, -3012, -3128, -3262, -3397, -3516, -3626, -3735, -3840, -3933, -4024, -4117, -4200, -4260, -4306, -4351, -4382, -4376, -4333, -4264, -4157, -3990, -3766, -3510, -3230, -2908, -2542, -2162, -1803, -1470, -1153, -844, -541, -232, 91, 415, 712, 978, 1229, + 1469, 1669, 1800, 1866, 1895, 1908, 1889, 1803, 1624, 1367, 1075, 780, 476, 133, -252, -651, -1021, -1342, -1621, -1890, -2174, -2467, -2736, -2958, -3131, -3271, -3401, -3542, -3698, -3857, -4005, -4143, -4281, -4425, -4578, -4746, -4930, -5120, -5312, -5505, -5695, -5875, -6045, -6205, -6348, -6466, -6558, -6620, -6646, -6632, -6588, -6519, -6425, -6320, -6215, -6111, -6008, -5913, -5833, -5762, -5701, -5663, -5649, -5650, -5660, -5686, -5720, -5746, -5765, -5788, -5815, -5848, -5901, -5978, -6060, -6140, -6230, -6325, -6406, -6474, -6543, -6598, -6615, -6606, -6585, -6529, -6430, -6319, -6211, -6075, -5917, -5781, -5661, -5518, -5380, -5284, + -5179, -5030, -4931, -4904, -4798, -4598, -4543, -4640, -4526, -4189, -4192, -4573, -4392, -3326, -2782, -4026, -5986, -6628, -5926, -5487, -5621, -5104, -3945, -3920, -5677, -7463, -7728, -7183, -7185, -7661, -7815, -7559, -7022, -5771, -3819, -2515, -3074, -4758, -5745, -5508, -5158, -5525, -6039, -5894, -5470, -5899, -7430, -8879 } + } +}; +const Word16 CRendBin_FOA_HRIR_coeff_im_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {-3812, -10154, -13424, -13506, -11577, -8956, -6265, -3457, -373, 2864, 5885, 8325, 9988, 10835, 10931, 10408, 9448, 8231, 6876, 5425, 3888, 2316, 796, -615, -1926, -3178, -4370, -5457, -6403, -7214, -7911, -8507, -9012, -9445, -9829, -10173, -10473, -10726, -10943, -11141, -11329, -11506, -11665, -11804, -11920, -12014, -12086, -12140, -12180, -12205, -12214, -12207, -12184, -12148, -12099, -12038, -11969, -11895, -11818, -11736, -11653, -11568, -11483, -11397, -11309, -11224, -11144, -11071, -11005, -10946, -10896, -10853, -10816, -10784, -10759, -10740, -10722, -10706, -10689, -10668, -10637, -10595, -10541, -10473, -10386, -10282, -10167, -10045, -9918, -9785, -9643, -9491, -9334, -9175, -9022, -8873, + -8733, -8601, -8478, -8363, -8258, -8164, -8082, -8009, -7944, -7883, -7825, -7771, -7723, -7674, -7618, -7550, -7472, -7386, -7296, -7202, -7108, -7011, -6912, -6814, -6718, -6621, -6524, -6426, -6325, -6221, -6117, -6014, -5912, -5810, -5709, -5611, -5517, -5427, -5344, -5265, -5189, -5113, -5038, -4965, -4892, -4820, -4750, -4678, -4604, -4529, -4454, -4377, -4301, -4229, -4159, -4090, -4020, -3952, -3883, -3812, -3739, -3668, -3598, -3529, -3464, -3404, -3347, -3291, -3238, -3187, -3133, -3077, -3024, -2972, -2920, -2869, -2822, -2777, -2729, -2683, -2640, -2597, -2554, -2517, -2486, -2452, -2416, -2384, -2352, -2311, -2266, -2225, -2181, -2127, -2073, -2025, + -1971, -1907, -1849, -1798, -1733, -1659, -1599, -1546, -1467, -1379, -1324, -1289, -1227, -1159, -1144, -1144, -1064, -915, -791, -686, -527, -411, -581, -1058, -1487, -1515, -1200, -907, -891, -1091, -1310, -1493, -1795, -2356, -2989, -3214, -2747, -1878, -1186, -917, -839, -711, -590, -600, -637, -519, -276, -73 }, + {-3812, -10154, -13424, -13506, -11577, -8956, -6265, -3457, -373, 2864, 5885, 8325, 9988, 10835, 10931, 10408, 9448, 8231, 6876, 5425, 3888, 2316, 796, -615, -1926, -3178, -4370, -5457, -6403, -7214, -7911, -8507, -9012, -9445, -9829, -10173, -10473, -10726, -10943, -11141, -11329, -11506, -11665, -11804, -11920, -12014, -12086, -12140, -12180, -12205, -12214, -12207, -12184, -12148, -12099, -12038, -11969, -11895, -11818, -11736, -11653, -11568, -11483, -11397, -11309, -11224, -11144, -11071, -11005, -10946, -10896, -10853, -10816, -10784, -10759, -10740, -10722, -10706, -10689, -10668, -10637, -10595, -10541, -10473, -10386, -10282, -10167, -10045, -9918, -9785, -9643, -9491, -9334, -9175, -9022, -8873, + -8733, -8601, -8478, -8363, -8258, -8164, -8082, -8009, -7944, -7883, -7825, -7771, -7723, -7674, -7618, -7550, -7472, -7386, -7296, -7202, -7108, -7011, -6912, -6814, -6718, -6621, -6524, -6426, -6325, -6221, -6117, -6014, -5912, -5810, -5709, -5611, -5517, -5427, -5344, -5265, -5189, -5113, -5038, -4965, -4892, -4820, -4750, -4678, -4604, -4529, -4454, -4377, -4301, -4229, -4159, -4090, -4020, -3952, -3883, -3812, -3739, -3668, -3598, -3529, -3464, -3404, -3347, -3291, -3238, -3187, -3133, -3077, -3024, -2972, -2920, -2869, -2822, -2777, -2729, -2683, -2640, -2597, -2554, -2517, -2486, -2452, -2416, -2384, -2352, -2311, -2266, -2225, -2181, -2127, -2073, -2025, + -1971, -1907, -1849, -1798, -1733, -1659, -1599, -1546, -1467, -1379, -1324, -1289, -1227, -1159, -1144, -1144, -1064, -915, -791, -686, -527, -411, -581, -1058, -1487, -1515, -1200, -907, -891, -1091, -1310, -1493, -1795, -2356, -2989, -3214, -2747, -1878, -1186, -917, -839, -711, -590, -600, -637, -519, -276, -73 } + }, + { + {2300, 4666, 1852, -5592, -14123, -19737, -20452, -16872, -10891, -4195, 2257, 7982, 12713, 16347, 18898, 20405, 20929, 20594, 19589, 18128, 16413, 14584, 12684, 10707, 8687, 6720, 4888, 3200, 1628, 142, -1278, -2645, -3950, -5172, -6302, -7352, -8342, -9286, -10184, -11016, -11757, -12395, -12939, -13406, -13804, -14142, -14428, -14663, -14847, -14987, -15096, -15187, -15259, -15310, -15332, -15319, -15274, -15204, -15112, -15003, -14888, -14781, -14682, -14589, -14507, -14444, -14399, -14362, -14333, -14319, -14318, -14326, -14342, -14373, -14418, -14469, -14523, -14579, -14639, -14696, -14744, -14784, -14820, -14852, -14873, -14882, -14879, -14870, -14860, -14854, -14852, -14842, -14805, -14733, -14629, -14499, + -14337, -14135, -13889, -13606, -13297, -12973, -12640, -12297, -11938, -11572, -11220, -10895, -10603, -10344, -10118, -9927, -9769, -9640, -9533, -9439, -9358, -9294, -9242, -9191, -9131, -9056, -8964, -8859, -8749, -8642, -8537, -8431, -8326, -8222, -8118, -8011, -7904, -7802, -7705, -7618, -7541, -7473, -7408, -7345, -7285, -7227, -7174, -7127, -7087, -7046, -7001, -6952, -6894, -6828, -6756, -6684, -6607, -6522, -6430, -6330, -6215, -6082, -5937, -5784, -5620, -5450, -5279, -5107, -4931, -4753, -4579, -4406, -4236, -4076, -3929, -3785, -3643, -3508, -3373, -3225, -3067, -2909, -2755, -2603, -2462, -2338, -2217, -2096, -1987, -1886, -1777, -1662, -1559, -1461, -1354, -1246, + -1147, -1042, -926, -822, -720, -584, -441, -343, -230, -27, 169, 237, 357, 768, 1230, 1251, 916, 840, 1179, 1443, 1533, 2091, 3321, 4323, 4260, 3544, 3208, 3620, 4403, 5109, 5533, 5865, 6777, 8590, 10083, 9229, 5763, 2029, 436, 885, 1592, 1686, 1844, 2720, 3844, 4205, 3262, 1224 }, + {-2300, -4666, -1852, 5592, 14123, 19737, 20452, 16872, 10891, 4195, -2257, -7982, -12713, -16347, -18898, -20405, -20929, -20594, -19589, -18128, -16413, -14584, -12684, -10707, -8687, -6720, -4888, -3200, -1628, -142, 1278, 2645, 3950, 5172, 6302, 7352, 8342, 9286, 10184, 11016, 11757, 12395, 12939, 13406, 13804, 14142, 14428, 14663, 14847, 14987, 15096, 15187, 15259, 15310, 15332, 15319, 15274, 15204, 15112, 15003, 14888, 14781, 14682, 14589, 14507, 14444, 14399, 14362, 14333, 14319, 14318, 14326, 14342, 14373, 14418, 14469, 14523, 14579, 14639, 14696, 14744, 14784, 14820, 14852, 14873, 14882, 14879, 14870, 14860, 14854, 14852, 14842, 14805, 14733, 14629, 14499, + 14337, 14135, 13889, 13606, 13297, 12973, 12640, 12297, 11938, 11572, 11220, 10895, 10603, 10344, 10118, 9927, 9769, 9640, 9533, 9439, 9358, 9294, 9242, 9191, 9131, 9056, 8964, 8859, 8749, 8642, 8537, 8431, 8326, 8222, 8118, 8011, 7904, 7802, 7705, 7618, 7541, 7473, 7408, 7345, 7285, 7227, 7174, 7127, 7087, 7046, 7001, 6952, 6894, 6828, 6756, 6684, 6607, 6522, 6430, 6330, 6215, 6082, 5937, 5784, 5620, 5450, 5279, 5107, 4931, 4753, 4579, 4406, 4236, 4076, 3929, 3785, 3643, 3508, 3373, 3225, 3067, 2909, 2755, 2603, 2462, 2338, 2217, 2096, 1987, 1886, 1777, 1662, 1559, 1461, 1354, 1246, + 1147, 1042, 926, 822, 720, 584, 441, 343, 230, 27, -169, -237, -357, -768, -1230, -1251, -916, -840, -1179, -1443, -1533, -2091, -3321, -4323, -4260, -3544, -3208, -3620, -4403, -5109, -5533, -5865, -6777, -8590, -10083, -9229, -5763, -2029, -436, -885, -1592, -1686, -1844, -2720, -3844, -4205, -3262, -1224 } + }, + { + {-421, -1439, -2279, -1879, -173, 1372, 1473, 454, -541, -982, -995, -623, 143, 911, 1193, 1077, 1098, 1460, 1838, 1900, 1659, 1255, 714, 41, -648, -1193, -1540, -1768, -2002, -2301, -2614, -2840, -2931, -2905, -2782, -2570, -2313, -2094, -1981, -1982, -2074, -2234, -2447, -2704, -2999, -3322, -3664, -4026, -4420, -4847, -5292, -5734, -6154, -6533, -6859, -7125, -7320, -7431, -7454, -7393, -7240, -6983, -6629, -6189, -5660, -5036, -4331, -3571, -2766, -1921, -1056, -194, 652, 1464, 2212, 2872, 3450, 3944, 4323, 4569, 4700, 4751, 4727, 4609, 4403, 4157, 3919, 3686, 3422, 3120, 2830, 2609, 2457, 2335, 2225, 2141, + 2098, 2099, 2148, 2240, 2359, 2485, 2612, 2743, 2883, 3029, 3162, 3248, 3264, 3220, 3140, 3029, 2882, 2700, 2483, 2225, 1929, 1607, 1273, 933, 602, 295, 14, -244, -468, -645, -775, -861, -901, -898, -863, -801, -709, -602, -503, -420, -349, -288, -233, -159, -46, 93, 237, 389, 551, 710, 860, 1009, 1153, 1277, 1383, 1486, 1583, 1663, 1743, 1837, 1934, 2027, 2129, 2243, 2349, 2443, 2544, 2645, 2725, 2784, 2839, 2876, 2882, 2882, 2900, 2918, 2925, 2956, 3020, 3088, 3164, 3275, 3398, 3486, 3560, 3653, 3724, 3735, 3736, 3755, 3731, 3647, 3577, 3527, 3419, 3287, + 3221, 3142, 2957, 2813, 2818, 2723, 2392, 2209, 2360, 2267, 1641, 1365, 1978, 2117, 355, -2024, -2372, -563, 946, 993, 932, 1467, 1106, -983, -2966, -2835, -1195, -14, 136, 176, 768, 1604, 1879, 911, -1087, -2578, -2010, 156, 1728, 1448, 332, -124, 76, 0, -542, -901, -717, -249 }, + {-421, -1439, -2279, -1879, -173, 1372, 1473, 454, -541, -982, -995, -623, 143, 911, 1193, 1077, 1098, 1460, 1838, 1900, 1659, 1255, 714, 41, -648, -1193, -1540, -1768, -2002, -2301, -2614, -2840, -2931, -2905, -2782, -2570, -2313, -2094, -1981, -1982, -2074, -2234, -2447, -2704, -2999, -3322, -3664, -4026, -4420, -4847, -5292, -5734, -6154, -6533, -6859, -7125, -7320, -7431, -7454, -7393, -7240, -6983, -6629, -6189, -5660, -5036, -4331, -3571, -2766, -1921, -1056, -194, 652, 1464, 2212, 2872, 3450, 3944, 4323, 4569, 4700, 4751, 4727, 4609, 4403, 4157, 3919, 3686, 3422, 3120, 2830, 2609, 2457, 2335, 2225, 2141, + 2098, 2099, 2148, 2240, 2359, 2485, 2612, 2743, 2883, 3029, 3162, 3248, 3264, 3220, 3140, 3029, 2882, 2700, 2483, 2225, 1929, 1607, 1273, 933, 602, 295, 14, -244, -468, -645, -775, -861, -901, -898, -863, -801, -709, -602, -503, -420, -349, -288, -233, -159, -46, 93, 237, 389, 551, 710, 860, 1009, 1153, 1277, 1383, 1486, 1583, 1663, 1743, 1837, 1934, 2027, 2129, 2243, 2349, 2443, 2544, 2645, 2725, 2784, 2839, 2876, 2882, 2882, 2900, 2918, 2925, 2956, 3020, 3088, 3164, 3275, 3398, 3486, 3560, 3653, 3724, 3735, 3736, 3755, 3731, 3647, 3577, 3527, 3419, 3287, + 3221, 3142, 2957, 2813, 2818, 2723, 2392, 2209, 2360, 2267, 1641, 1365, 1978, 2117, 355, -2024, -2372, -563, 946, 993, 932, 1467, 1106, -983, -2966, -2835, -1195, -14, 136, 176, 768, 1604, 1879, 911, -1087, -2578, -2010, 156, 1728, 1448, 332, -124, 76, 0, -542, -901, -717, -249 } + }, + { + {70, -221, -1145, -1839, -1478, -384, 310, -66, -1082, -1809, -1720, -957, 20, 834, 1391, 1859, 2468, 3252, 4015, 4538, 4756, 4710, 4437, 4001, 3536, 3146, 2780, 2294, 1619, 804, -86, -1053, -2117, -3239, -4340, -5361, -6274, -7047, -7629, -7993, -8164, -8197, -8141, -8024, -7867, -7688, -7494, -7275, -7015, -6706, -6354, -5983, -5623, -5309, -5067, -4900, -4787, -4697, -4614, -4527, -4420, -4287, -4138, -3989, -3835, -3668, -3495, -3320, -3132, -2920, -2696, -2473, -2237, -1972, -1684, -1394, -1099, -789, -478, -197, 45, 263, 455, 593, 655, 657, 625, 573, 501, 413, 308, 170, -21, -261, -528, -818, + -1152, -1541, -1964, -2385, -2790, -3199, -3638, -4107, -4568, -4975, -5310, -5598, -5868, -6117, -6310, -6424, -6466, -6468, -6467, -6478, -6479, -6442, -6357, -6246, -6138, -6054, -5998, -5963, -5927, -5877, -5820, -5770, -5727, -5690, -5657, -5621, -5571, -5503, -5417, -5313, -5187, -5041, -4878, -4696, -4492, -4270, -4037, -3793, -3544, -3305, -3084, -2884, -2711, -2572, -2462, -2374, -2309, -2270, -2246, -2234, -2239, -2259, -2279, -2292, -2302, -2306, -2294, -2270, -2249, -2235, -2222, -2217, -2217, -2203, -2165, -2116, -2057, -1971, -1861, -1745, -1613, -1449, -1272, -1102, -927, -741, -575, -447, -326, -210, -138, -103, -62, -29, -41, -58, + -44, -66, -153, -186, -146, -223, -428, -467, -331, -471, -905, -914, -384, -519, -2041, -3557, -3292, -1765, -919, -1083, -964, -457, -1006, -2782, -3849, -3006, -1521, -967, -1047, -688, 154, 993, 1873, 2676, 2428, 621, -1474, -2123, -1358, -712, -979, -1392, -1159, -753, -1106, -2048, -2301, -1031 }, + {70, -221, -1145, -1839, -1478, -384, 310, -66, -1082, -1809, -1720, -957, 20, 834, 1391, 1859, 2468, 3252, 4015, 4538, 4756, 4710, 4437, 4001, 3536, 3146, 2780, 2294, 1619, 804, -86, -1053, -2117, -3239, -4340, -5361, -6274, -7047, -7629, -7993, -8164, -8197, -8141, -8024, -7867, -7688, -7494, -7275, -7015, -6706, -6354, -5983, -5623, -5309, -5067, -4900, -4787, -4697, -4614, -4527, -4420, -4287, -4138, -3989, -3835, -3668, -3495, -3320, -3132, -2920, -2696, -2473, -2237, -1972, -1684, -1394, -1099, -789, -478, -197, 45, 263, 455, 593, 655, 657, 625, 573, 501, 413, 308, 170, -21, -261, -528, -818, + -1152, -1541, -1964, -2385, -2790, -3199, -3638, -4107, -4568, -4975, -5310, -5598, -5868, -6117, -6310, -6424, -6466, -6468, -6467, -6478, -6479, -6442, -6357, -6246, -6138, -6054, -5998, -5963, -5927, -5877, -5820, -5770, -5727, -5690, -5657, -5621, -5571, -5503, -5417, -5313, -5187, -5041, -4878, -4696, -4492, -4270, -4037, -3793, -3544, -3305, -3084, -2884, -2711, -2572, -2462, -2374, -2309, -2270, -2246, -2234, -2239, -2259, -2279, -2292, -2302, -2306, -2294, -2270, -2249, -2235, -2222, -2217, -2217, -2203, -2165, -2116, -2057, -1971, -1861, -1745, -1613, -1449, -1272, -1102, -927, -741, -575, -447, -326, -210, -138, -103, -62, -29, -41, -58, + -44, -66, -153, -186, -146, -223, -428, -467, -331, -471, -905, -914, -384, -519, -2041, -3557, -3292, -1765, -919, -1083, -964, -457, -1006, -2782, -3849, -3006, -1521, -967, -1047, -688, 154, 993, 1873, 2676, 2428, 621, -1474, -2123, -1358, -712, -979, -1392, -1159, -753, -1106, -2048, -2301, -1031 } + } +}; +const Word16 *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; + /* Sample Rate = 32000 */ const Word16 CRendBin_FOA_HRIR_max_num_iterations_32kHz = 1; -const UWord16 CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; -const UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; -const UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz = 0; -const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[4]={0, 0, 0, 0}; -const UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_FOA_HRIR_num_iterations_32kHz[FOA_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const Word16 CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const Word16 CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const Word16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz = 0; +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_Q_32kHz_fx = 0; +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]={{0, 0, 0, 0},{0, 0, 0, 0}}; +const Word16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_FOA_HRIR_coeff_Q_32kHz_fx = 14; +const Word16 CRendBin_FOA_HRIR_coeff_re_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {16374, 12559, 6625, 772, -3639, -6498, -8364, -9640, -10273, -10013, -8769, -6710, -4142, -1374, 1338, 3796, 5884, 7586, 8957, 10053, 10879, 11413, 11670, 11724, 11650, 11464, 11141, 10679, 10123, 9523, 8906, 8284, 7673, 7087, 6524, 5974, 5432, 4907, 4410, 3939, 3483, 3032, 2581, 2132, 1688, 1249, 821, 404, -1, -399, -788, -1167, -1533, -1886, -2224, -2547, -2852, -3142, -3418, -3680, -3929, -4165, -4390, -4605, -4808, -4997, -5174, -5343, -5506, -5662, -5816, -5970, -6125, -6281, -6440, -6606, -6779, -6960, -7150, -7353, -7564, -7782, -8004, -8229, -8453, -8669, -8872, -9065, -9248, -9424, -9592, -9747, -9885, -10005, -10110, -10203, + -10284, -10356, -10422, -10483, -10539, -10592, -10646, -10704, -10768, -10839, -10913, -10993, -11081, -11181, -11293, -11410, -11525, -11636, -11743, -11845, -11943, -12037, -12128, -12214, -12298, -12382, -12466, -12549, -12632, -12713, -12790, -12864, -12938, -13010, -13080, -13148, -13215, -13282, -13350, -13423, -13502, -13584, -13667, -13753, -13841, -13931, -14022, -14115, -14208, -14297, -14383, -14465, -14542, -14614, -14682, -14747, -14807, -14860, -14906, -14946, -14978, -15000, -15014, -15021 }, + {16374, 12559, 6625, 772, -3639, -6498, -8364, -9640, -10273, -10013, -8769, -6710, -4142, -1374, 1338, 3796, 5884, 7586, 8957, 10053, 10879, 11413, 11670, 11724, 11650, 11464, 11141, 10679, 10123, 9523, 8906, 8284, 7673, 7087, 6524, 5974, 5432, 4907, 4410, 3939, 3483, 3032, 2581, 2132, 1688, 1249, 821, 404, -1, -399, -788, -1167, -1533, -1886, -2224, -2547, -2852, -3142, -3418, -3680, -3929, -4165, -4390, -4605, -4808, -4997, -5174, -5343, -5506, -5662, -5816, -5970, -6125, -6281, -6440, -6606, -6779, -6960, -7150, -7353, -7564, -7782, -8004, -8229, -8453, -8669, -8872, -9065, -9248, -9424, -9592, -9747, -9885, -10005, -10110, -10203, + -10284, -10356, -10422, -10483, -10539, -10592, -10646, -10704, -10768, -10839, -10913, -10993, -11081, -11181, -11293, -11410, -11525, -11636, -11743, -11845, -11943, -12037, -12128, -12214, -12298, -12382, -12466, -12549, -12632, -12713, -12790, -12864, -12938, -13010, -13080, -13148, -13215, -13282, -13350, -13423, -13502, -13584, -13667, -13753, -13841, -13931, -14022, -14115, -14208, -14297, -14383, -14465, -14542, -14614, -14682, -14747, -14807, -14860, -14906, -14946, -14978, -15000, -15014, -15021 } + }, + { + {1862, 6502, 12427, 15231, 12416, 4811, -4498, -12488, -17713, -20162, -20369, -18870, -16143, -12619, -8637, -4460, -333, 3515, 6916, 9789, 12146, 14071, 15658, 16931, 17862, 18453, 18782, 18942, 18990, 18947, 18823, 18609, 18299, 17899, 17436, 16933, 16400, 15826, 15196, 14499, 13747, 12967, 12186, 11414, 10656, 9915, 9190, 8482, 7796, 7141, 6520, 5926, 5348, 4782, 4226, 3688, 3178, 2700, 2255, 1849, 1486, 1159, 859, 582, 331, 98, -127, -348, -561, -766, -971, -1176, -1379, -1583, -1795, -2021, -2257, -2502, -2760, -3033, -3315, -3602, -3896, -4199, -4512, -4830, -5147, -5463, -5777, -6096, -6432, -6797, -7191, -7598, -8005, -8411, + -8819, -9225, -9615, -9975, -10297, -10583, -10838, -11063, -11251, -11391, -11480, -11527, -11545, -11543, -11527, -11504, -11482, -11469, -11471, -11485, -11508, -11544, -11601, -11682, -11785, -11901, -12020, -12134, -12240, -12341, -12443, -12547, -12651, -12757, -12866, -12977, -13085, -13190, -13295, -13403, -13516, -13639, -13773, -13917, -14067, -14223, -14386, -14555, -14733, -14921, -15119, -15323, -15529, -15731, -15929, -16119, -16301, -16472, -16627, -16764, -16883, -16978, -17044, -17077 }, + {-1862, -6502, -12427, -15231, -12416, -4811, 4498, 12488, 17713, 20162, 20369, 18870, 16143, 12619, 8637, 4460, 333, -3515, -6916, -9789, -12146, -14071, -15658, -16931, -17862, -18453, -18782, -18942, -18990, -18947, -18823, -18609, -18299, -17899, -17436, -16933, -16400, -15826, -15196, -14499, -13747, -12967, -12186, -11414, -10656, -9915, -9190, -8482, -7796, -7141, -6520, -5926, -5348, -4782, -4226, -3688, -3178, -2700, -2255, -1849, -1486, -1159, -859, -582, -331, -98, 127, 348, 561, 766, 971, 1176, 1379, 1583, 1795, 2021, 2257, 2502, 2760, 3033, 3315, 3602, 3896, 4199, 4512, 4830, 5147, 5463, 5777, 6096, 6432, 6797, 7191, 7598, 8005, 8411, + 8819, 9225, 9615, 9975, 10297, 10583, 10838, 11063, 11251, 11391, 11480, 11527, 11545, 11543, 11527, 11504, 11482, 11469, 11471, 11485, 11508, 11544, 11601, 11682, 11785, 11901, 12020, 12134, 12240, 12341, 12443, 12547, 12651, 12757, 12866, 12977, 13085, 13190, 13295, 13403, 13516, 13639, 13773, 13917, 14067, 14223, 14386, 14555, 14733, 14921, 15119, 15323, 15529, 15731, 15929, 16119, 16301, 16472, 16627, 16764, 16883, 16978, 17044, 17077 } + }, + { + {1629, 1316, 120, -1593, -2359, -1443, 142, 959, 735, 81, -607, -1242, -1543, -1245, -635, -284, -275, -168, 333, 1057, 1725, 2267, 2700, 2950, 2937, 2714, 2441, 2240, 2113, 1969, 1718, 1362, 975, 618, 318, 109, 41, 125, 308, 521, 722, 896, 1040, 1149, 1219, 1245, 1231, 1184, 1099, 954, 731, 422, 29, -441, -979, -1577, -2231, -2928, -3648, -4384, -5131, -5872, -6585, -7261, -7896, -8470, -8958, -9351, -9649, -9843, -9920, -9881, -9727, -9454, -9069, -8597, -8061, -7459, -6798, -6119, -5468, -4854, -4262, -3702, -3220, -2841, -2539, -2271, -2034, -1875, -1819, -1833, -1861, -1882, -1915, -1976, + -2055, -2135, -2205, -2249, -2253, -2217, -2153, -2067, -1951, -1787, -1563, -1285, -983, -687, -410, -143, 117, 365, 592, 794, 959, 1073, 1133, 1138, 1088, 991, 855, 684, 476, 240, -11, -264, -514, -751, -968, -1161, -1326, -1453, -1541, -1609, -1671, -1736, -1814, -1908, -2001, -2069, -2107, -2125, -2124, -2097, -2049, -1990, -1921, -1842, -1763, -1699, -1646, -1603, -1577, -1568, -1563, -1556, -1554, -1558 }, + {1629, 1316, 120, -1593, -2359, -1443, 142, 959, 735, 81, -607, -1242, -1543, -1245, -635, -284, -275, -168, 333, 1057, 1725, 2267, 2700, 2950, 2937, 2714, 2441, 2240, 2113, 1969, 1718, 1362, 975, 618, 318, 109, 41, 125, 308, 521, 722, 896, 1040, 1149, 1219, 1245, 1231, 1184, 1099, 954, 731, 422, 29, -441, -979, -1577, -2231, -2928, -3648, -4384, -5131, -5872, -6585, -7261, -7896, -8470, -8958, -9351, -9649, -9843, -9920, -9881, -9727, -9454, -9069, -8597, -8061, -7459, -6798, -6119, -5468, -4854, -4262, -3702, -3220, -2841, -2539, -2271, -2034, -1875, -1819, -1833, -1861, -1882, -1915, -1976, + -2055, -2135, -2205, -2249, -2253, -2217, -2153, -2067, -1951, -1787, -1563, -1285, -983, -687, -410, -143, 117, 365, 592, 794, 959, 1073, 1133, 1138, 1088, 991, 855, 684, 476, 240, -11, -264, -514, -751, -968, -1161, -1326, -1453, -1541, -1609, -1671, -1736, -1814, -1908, -2001, -2069, -2107, -2125, -2124, -2097, -2049, -1990, -1921, -1842, -1763, -1699, -1646, -1603, -1577, -1568, -1563, -1556, -1554, -1558 } + }, + { + {1303, 1737, 1726, 785, -391, -711, 10, 876, 934, 67, -1118, -1976, -2269, -2148, -1920, -1784, -1679, -1370, -709, 226, 1259, 2276, 3208, 3978, 4563, 5074, 5654, 6316, 6949, 7459, 7846, 8131, 8273, 8210, 7925, 7449, 6808, 6017, 5114, 4175, 3277, 2460, 1730, 1077, 495, -29, -513, -972, -1404, -1791, -2110, -2343, -2484, -2544, -2556, -2561, -2592, -2656, -2747, -2865, -3002, -3138, -3260, -3372, -3483, -3589, -3686, -3780, -3876, -3962, -4025, -4075, -4123, -4158, -4156, -4116, -4051, -3947, -3783, -3562, -3311, -3035, -2718, -2355, -1981, -1627, -1299, -986, -683, -386, -81, 239, 556, 847, 1107, 1352, + 1586, 1781, 1908, 1968, 1992, 1998, 1973, 1878, 1689, 1423, 1123, 818, 503, 150, -247, -658, -1040, -1370, -1661, -1943, -2239, -2542, -2824, -3059, -3244, -3397, -3542, -3698, -3869, -4045, -4212, -4371, -4530, -4698, -4879, -5075, -5288, -5512, -5740, -5969, -6197, -6419, -6631, -6831, -7015, -7175, -7305, -7402, -7463, -7485, -7474, -7435, -7378, -7309, -7235, -7165, -7101, -7046, -7002, -6968, -6941, -6919, -6906, -6902 }, + {1303, 1737, 1726, 785, -391, -711, 10, 876, 934, 67, -1118, -1976, -2269, -2148, -1920, -1784, -1679, -1370, -709, 226, 1259, 2276, 3208, 3978, 4563, 5074, 5654, 6316, 6949, 7459, 7846, 8131, 8273, 8210, 7925, 7449, 6808, 6017, 5114, 4175, 3277, 2460, 1730, 1077, 495, -29, -513, -972, -1404, -1791, -2110, -2343, -2484, -2544, -2556, -2561, -2592, -2656, -2747, -2865, -3002, -3138, -3260, -3372, -3483, -3589, -3686, -3780, -3876, -3962, -4025, -4075, -4123, -4158, -4156, -4116, -4051, -3947, -3783, -3562, -3311, -3035, -2718, -2355, -1981, -1627, -1299, -986, -683, -386, -81, 239, 556, 847, 1107, 1352, + 1586, 1781, 1908, 1968, 1992, 1998, 1973, 1878, 1689, 1423, 1123, 818, 503, 150, -247, -658, -1040, -1370, -1661, -1943, -2239, -2542, -2824, -3059, -3244, -3397, -3542, -3698, -3869, -4045, -4212, -4371, -4530, -4698, -4879, -5075, -5288, -5512, -5740, -5969, -6197, -6419, -6631, -6831, -7015, -7175, -7305, -7402, -7463, -7485, -7474, -7435, -7378, -7309, -7235, -7165, -7101, -7046, -7002, -6968, -6941, -6919, -6906, -6902 } + } +}; +const Word16 CRendBin_FOA_HRIR_coeff_im_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {-3808, -10142, -13405, -13479, -11543, -8915, -6216, -3400, -307, 2940, 5970, 8421, 10092, 10947, 11050, 10533, 9578, 8366, 7015, 5568, 4037, 2470, 955, -449, -1753, -2997, -4181, -5260, -6198, -6999, -7687, -8274, -8771, -9196, -9572, -9908, -10200, -10446, -10656, -10848, -11029, -11200, -11353, -11486, -11596, -11684, -11749, -11796, -11829, -11846, -11847, -11831, -11800, -11755, -11696, -11626, -11548, -11464, -11377, -11286, -11193, -11099, -11005, -10910, -10814, -10720, -10632, -10551, -10477, -10410, -10352, -10303, -10258, -10218, -10186, -10159, -10133, -10108, -10083, -10053, -10013, -9961, -9897, -9818, -9720, -9605, -9479, -9346, -9208, -9063, -8910, -8747, -8579, -8411, -8247, -8090, + -7940, -7799, -7666, -7543, -7428, -7325, -7233, -7151, -7075, -7003, -6934, -6870, -6810, -6749, -6681, -6600, -6509, -6409, -6305, -6198, -6089, -5979, -5867, -5755, -5645, -5536, -5427, -5317, -5204, -5089, -4974, -4859, -4745, -4631, -4516, -4403, -4292, -4183, -4078, -3974, -3869, -3761, -3649, -3533, -3414, -3289, -3160, -3024, -2880, -2728, -2570, -2406, -2236, -2063, -1886, -1704, -1515, -1322, -1126, -926, -721, -515, -309, -103 }, + {-3808, -10142, -13405, -13479, -11543, -8915, -6216, -3400, -307, 2940, 5970, 8421, 10092, 10947, 11050, 10533, 9578, 8366, 7015, 5568, 4037, 2470, 955, -449, -1753, -2997, -4181, -5260, -6198, -6999, -7687, -8274, -8771, -9196, -9572, -9908, -10200, -10446, -10656, -10848, -11029, -11200, -11353, -11486, -11596, -11684, -11749, -11796, -11829, -11846, -11847, -11831, -11800, -11755, -11696, -11626, -11548, -11464, -11377, -11286, -11193, -11099, -11005, -10910, -10814, -10720, -10632, -10551, -10477, -10410, -10352, -10303, -10258, -10218, -10186, -10159, -10133, -10108, -10083, -10053, -10013, -9961, -9897, -9818, -9720, -9605, -9479, -9346, -9208, -9063, -8910, -8747, -8579, -8411, -8247, -8090, + -7940, -7799, -7666, -7543, -7428, -7325, -7233, -7151, -7075, -7003, -6934, -6870, -6810, -6749, -6681, -6600, -6509, -6409, -6305, -6198, -6089, -5979, -5867, -5755, -5645, -5536, -5427, -5317, -5204, -5089, -4974, -4859, -4745, -4631, -4516, -4403, -4292, -4183, -4078, -3974, -3869, -3761, -3649, -3533, -3414, -3289, -3160, -3024, -2880, -2728, -2570, -2406, -2236, -2063, -1886, -1704, -1515, -1322, -1126, -926, -721, -515, -309, -103 } + }, + { + {2305, 4682, 1879, -5556, -14080, -19686, -20394, -16805, -10813, -4104, 2364, 8103, 12848, 16497, 19059, 20577, 21110, 20783, 19784, 18329, 16620, 14797, 12904, 10934, 8922, 6965, 5142, 3465, 1904, 429, -979, -2334, -3627, -4837, -5957, -6996, -7976, -8911, -9800, -10624, -11356, -11987, -12524, -12982, -13373, -13703, -13981, -14206, -14381, -14511, -14610, -14689, -14751, -14790, -14799, -14773, -14716, -14632, -14527, -14405, -14278, -14157, -14046, -13941, -13848, -13773, -13717, -13671, -13633, -13608, -13597, -13595, -13602, -13622, -13657, -13698, -13741, -13786, -13834, -13877, -13911, -13938, -13960, -13978, -13985, -13979, -13962, -13938, -13912, -13892, -13877, -13855, -13807, -13721, -13603, -13457, + -13281, -13066, -12807, -12511, -12189, -11852, -11506, -11147, -10774, -10396, -10029, -9689, -9381, -9106, -8863, -8654, -8479, -8332, -8205, -8092, -7993, -7909, -7837, -7768, -7690, -7597, -7487, -7365, -7239, -7116, -6995, -6874, -6752, -6632, -6510, -6384, -6255, -6129, -6005, -5887, -5773, -5662, -5550, -5430, -5303, -5171, -5032, -4887, -4734, -4570, -4389, -4188, -3966, -3722, -3457, -3172, -2868, -2542, -2196, -1832, -1450, -1050, -635, -213 }, + {-2305, -4682, -1879, 5556, 14080, 19686, 20394, 16805, 10813, 4104, -2364, -8103, -12848, -16497, -19059, -20577, -21110, -20783, -19784, -18329, -16620, -14797, -12904, -10934, -8922, -6965, -5142, -3465, -1904, -429, 979, 2334, 3627, 4837, 5957, 6996, 7976, 8911, 9800, 10624, 11356, 11987, 12524, 12982, 13373, 13703, 13981, 14206, 14381, 14511, 14610, 14689, 14751, 14790, 14799, 14773, 14716, 14632, 14527, 14405, 14278, 14157, 14046, 13941, 13848, 13773, 13717, 13671, 13633, 13608, 13597, 13595, 13602, 13622, 13657, 13698, 13741, 13786, 13834, 13877, 13911, 13938, 13960, 13978, 13985, 13979, 13962, 13938, 13912, 13892, 13877, 13855, 13807, 13721, 13603, 13457, + 13281, 13066, 12807, 12511, 12189, 11852, 11506, 11147, 10774, 10396, 10029, 9689, 9381, 9106, 8863, 8654, 8479, 8332, 8205, 8092, 7993, 7909, 7837, 7768, 7690, 7597, 7487, 7365, 7239, 7116, 6995, 6874, 6752, 6632, 6510, 6384, 6255, 6129, 6005, 5887, 5773, 5662, 5550, 5430, 5303, 5171, 5032, 4887, 4734, 4570, 4389, 4188, 3966, 3722, 3457, 3172, 2868, 2542, 2196, 1832, 1450, 1050, 635, 213 } + }, + { + {-422, -1443, -2285, -1888, -184, 1359, 1457, 435, -563, -1007, -1023, -653, 111, 877, 1156, 1038, 1056, 1415, 1791, 1851, 1606, 1198, 656, -20, -713, -1261, -1609, -1839, -2077, -2379, -2694, -2923, -3017, -2993, -2873, -2665, -2411, -2195, -2084, -2088, -2184, -2347, -2562, -2823, -3121, -3447, -3791, -4156, -4553, -4983, -5432, -5878, -6300, -6681, -7010, -7280, -7478, -7592, -7618, -7558, -7408, -7155, -6804, -6367, -5841, -5222, -4522, -3765, -2963, -2122, -1260, -400, 444, 1254, 1999, 2659, 3235, 3725, 4103, 4345, 4472, 4518, 4491, 4369, 4157, 3906, 3664, 3426, 3156, 2849, 2557, 2333, 2176, 2050, 1935, 1845, + 1798, 1797, 1841, 1928, 2043, 2165, 2285, 2411, 2549, 2693, 2821, 2901, 2913, 2864, 2776, 2659, 2508, 2319, 2094, 1830, 1529, 1200, 857, 512, 177, -138, -426, -689, -918, -1103, -1239, -1329, -1375, -1380, -1351, -1293, -1209, -1112, -1020, -947, -890, -845, -804, -749, -662, -549, -432, -317, -202, -91, 2, 77, 138, 177, 188, 180, 163, 136, 102, 73, 55, 38, 19, 5 }, + {-422, -1443, -2285, -1888, -184, 1359, 1457, 435, -563, -1007, -1023, -653, 111, 877, 1156, 1038, 1056, 1415, 1791, 1851, 1606, 1198, 656, -20, -713, -1261, -1609, -1839, -2077, -2379, -2694, -2923, -3017, -2993, -2873, -2665, -2411, -2195, -2084, -2088, -2184, -2347, -2562, -2823, -3121, -3447, -3791, -4156, -4553, -4983, -5432, -5878, -6300, -6681, -7010, -7280, -7478, -7592, -7618, -7558, -7408, -7155, -6804, -6367, -5841, -5222, -4522, -3765, -2963, -2122, -1260, -400, 444, 1254, 1999, 2659, 3235, 3725, 4103, 4345, 4472, 4518, 4491, 4369, 4157, 3906, 3664, 3426, 3156, 2849, 2557, 2333, 2176, 2050, 1935, 1845, + 1798, 1797, 1841, 1928, 2043, 2165, 2285, 2411, 2549, 2693, 2821, 2901, 2913, 2864, 2776, 2659, 2508, 2319, 2094, 1830, 1529, 1200, 857, 512, 177, -138, -426, -689, -918, -1103, -1239, -1329, -1375, -1380, -1351, -1293, -1209, -1112, -1020, -947, -890, -845, -804, -749, -662, -549, -432, -317, -202, -91, 2, 77, 138, 177, 188, 180, 163, 136, 102, 73, 55, 38, 19, 5 } + }, + { + {73, -214, -1133, -1823, -1457, -358, 340, -31, -1044, -1768, -1675, -906, 76, 894, 1455, 1928, 2541, 3330, 4098, 4625, 4847, 4804, 4535, 4103, 3642, 3256, 2895, 2414, 1743, 933, 49, -913, -1973, -3090, -4186, -5202, -6112, -6881, -7459, -7820, -7988, -8017, -7957, -7837, -7676, -7492, -7292, -7069, -6804, -6490, -6133, -5757, -5391, -5070, -4824, -4652, -4533, -4437, -4349, -4256, -4144, -4005, -3851, -3696, -3537, -3366, -3188, -3008, -2815, -2598, -2369, -2140, -1899, -1628, -1335, -1039, -738, -422, -105, 182, 428, 652, 850, 994, 1062, 1069, 1044, 998, 932, 851, 754, 622, 436, 202, -58, -341, + -667, -1049, -1465, -1880, -2279, -2683, -3118, -3582, -4037, -4436, -4766, -5048, -5311, -5552, -5739, -5845, -5876, -5869, -5860, -5861, -5852, -5805, -5712, -5592, -5474, -5381, -5318, -5274, -5230, -5173, -5109, -5050, -4999, -4955, -4912, -4865, -4804, -4723, -4620, -4496, -4350, -4179, -3986, -3771, -3531, -3268, -2989, -2699, -2404, -2115, -1841, -1590, -1365, -1167, -996, -848, -719, -606, -503, -405, -309, -219, -132, -45 }, + {73, -214, -1133, -1823, -1457, -358, 340, -31, -1044, -1768, -1675, -906, 76, 894, 1455, 1928, 2541, 3330, 4098, 4625, 4847, 4804, 4535, 4103, 3642, 3256, 2895, 2414, 1743, 933, 49, -913, -1973, -3090, -4186, -5202, -6112, -6881, -7459, -7820, -7988, -8017, -7957, -7837, -7676, -7492, -7292, -7069, -6804, -6490, -6133, -5757, -5391, -5070, -4824, -4652, -4533, -4437, -4349, -4256, -4144, -4005, -3851, -3696, -3537, -3366, -3188, -3008, -2815, -2598, -2369, -2140, -1899, -1628, -1335, -1039, -738, -422, -105, 182, 428, 652, 850, 994, 1062, 1069, 1044, 998, 932, 851, 754, 622, 436, 202, -58, -341, + -667, -1049, -1465, -1880, -2279, -2683, -3118, -3582, -4037, -4436, -4766, -5048, -5311, -5552, -5739, -5845, -5876, -5869, -5860, -5861, -5852, -5805, -5712, -5592, -5474, -5381, -5318, -5274, -5230, -5173, -5109, -5050, -4999, -4955, -4912, -4865, -4804, -4723, -4620, -4496, -4350, -4179, -3986, -3771, -3531, -3268, -2989, -2699, -2404, -2115, -1841, -1590, -1365, -1167, -996, -848, -719, -606, -503, -405, -309, -219, -132, -45 } + } +}; +const Word16 *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; + /* Sample Rate = 16000 */ const Word16 CRendBin_FOA_HRIR_max_num_iterations_16kHz = 1; -const UWord16 CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; -const UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; -const UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz = 0; -const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[4]={0, 0, 0, 0}; -const UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_FOA_HRIR_num_iterations_16kHz[FOA_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const Word16 CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const Word16 CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const Word16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz = 0; +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_Q_16kHz_fx = 0; +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]={{0, 0, 0, 0},{0, 0, 0, 0}}; +const Word16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_FOA_HRIR_coeff_Q_16kHz_fx = 14; +const Word16 CRendBin_FOA_HRIR_coeff_re_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + { 17330, 13516, 7582, 1726, -2688, -5552, -7423, -8704, -9342, -9086, -7847, -5795, -3236, -478, 2220, 4665, 6741, 8432, 9794, 10881, 11699, 12224, 12470, 12511, 12421, 12217, 11874, 11391, 10812, 10190, 9552, 8908, 8275, 7665, 7077, 6500, 5927, 5369, 4836, 4326, 3830, 3336, 2842, 2350, 1862, 1381, 908, 445, -10, -461, -909, -1352, -1789, -2219, -2641, -3052, -3450, -3835, -4212, -4581, -4944, -5305, -5672, -6049, -6440, -6849, -7282, -7745, -8240, -8765, -9317, -9887, -10463, -11029, -11564, -12051, -12469, -12800, -13030, -13148 }, + { 17330, 13516, 7582, 1726, -2688, -5552, -7423, -8704, -9342, -9086, -7847, -5795, -3236, -478, 2220, 4665, 6741, 8432, 9794, 10881, 11699, 12224, 12470, 12511, 12421, 12217, 11874, 11391, 10812, 10190, 9552, 8908, 8275, 7665, 7077, 6500, 5927, 5369, 4836, 4326, 3830, 3336, 2842, 2350, 1862, 1381, 908, 445, -10, -461, -909, -1352, -1789, -2219, -2641, -3052, -3450, -3835, -4212, -4581, -4944, -5305, -5672, -6049, -6440, -6849, -7282, -7745, -8240, -8765, -9317, -9887, -10463, -11029, -11564, -12051, -12469, -12800, -13030, -13148 } + }, + { + { 3153, 7793, 13719, 16524, 13708, 6095, -3224, -11226, -16459, -18914, -19125, -17631, -14912, -11400, -7435, -3276, 833, 4662, 8047, 10907, 13252, 15164, 16737, 17995, 18907, 19476, 19780, 19912, 19930, 19858, 19704, 19461, 19121, 18690, 18194, 17656, 17084, 16467, 15789, 15041, 14234, 13397, 12558, 11727, 10910, 10110, 9326, 8556, 7805, 7080, 6382, 5703, 5031, 4362, 3695, 3038, 2402, 1793, 1212, 663, 145, -351, -842, -1338, -1847, -2381, -2958, -3584, -4254, -4964, -5712, -6485, -7261, -8018, -8738, -9396, -9960, -10407, -10719, -10881 }, + { -3153, -7793, -13719, -16524, -13708, -6095, 3224, 11226, 16459, 18914, 19125, 17631, 14912, 11400, 7435, 3276, -833, -4662, -8047, -10907, -13252, -15164, -16737, -17995, -18907, -19476, -19780, -19912, -19930, -19858, -19704, -19461, -19121, -18690, -18194, -17656, -17084, -16467, -15789, -15041, -14234, -13397, -12558, -11727, -10910, -10110, -9326, -8556, -7805, -7080, -6382, -5703, -5031, -4362, -3695, -3038, -2402, -1793, -1212, -663, -145, 351, 842, 1338, 1847, 2381, 2958, 3584, 4254, 4964, 5712, 6485, 7261, 8018, 8738, 9396, 9960, 10407, 10719, 10881 } + }, + { + { 1681, 1369, 173, -1541, -2307, -1389, 196, 1013, 790, 136, -554, -1188, -1488, -1190, -581, -230, -220, -112, 389, 1114, 1784, 2327, 2761, 3012, 3000, 2777, 2503, 2303, 2177, 2033, 1783, 1430, 1044, 688, 390, 183, 115, 200, 386, 601, 803, 980, 1127, 1239, 1311, 1342, 1334, 1290, 1208, 1069, 852, 549, 162, -302, -834, -1427, -2072, -2756, -3464, -4186, -4917, -5640, -6336, -6994, -7607, -8152, -8599, -8929, -9134, -9200, -9110, -8866, -8485, -7983, -7390, -6768, -6189, -5696, -5318, -5104 }, + { 1681, 1369, 173, -1541, -2307, -1389, 196, 1013, 790, 136, -554, -1188, -1488, -1190, -581, -230, -220, -112, 389, 1114, 1784, 2327, 2761, 3012, 3000, 2777, 2503, 2303, 2177, 2033, 1783, 1430, 1044, 688, 390, 183, 115, 200, 386, 601, 803, 980, 1127, 1239, 1311, 1342, 1334, 1290, 1208, 1069, 852, 549, 162, -302, -834, -1427, -2072, -2756, -3464, -4186, -4917, -5640, -6336, -6994, -7607, -8152, -8599, -8929, -9134, -9200, -9110, -8866, -8485, -7983, -7390, -6768, -6189, -5696, -5318, -5104 } + }, + { + { 1339, 1774, 1762, 821, -356, -677, 43, 908, 965, 95, -1092, -1953, -2248, -2130, -1905, -1772, -1670, -1364, -706, 226, 1256, 2270, 3200, 3967, 4549, 5054, 5628, 6285, 6912, 7414, 7796, 8075, 8211, 8142, 7852, 7369, 6719, 5918, 5004, 4052, 3141, 2313, 1572, 909, 317, -214, -707, -1176, -1621, -2021, -2355, -2605, -2766, -2845, -2876, -2901, -2950, -3031, -3141, -3280, -3440, -3603, -3755, -3901, -4048, -4192, -4325, -4452, -4576, -4684, -4761, -4816, -4862, -4893, -4893, -4877, -4867, -4860, -4840, -4816 }, + { 1339, 1774, 1762, 821, -356, -677, 43, 908, 965, 95, -1092, -1953, -2248, -2130, -1905, -1772, -1670, -1364, -706, 226, 1256, 2270, 3200, 3967, 4549, 5054, 5628, 6285, 6912, 7414, 7796, 8075, 8211, 8142, 7852, 7369, 6719, 5918, 5004, 4052, 3141, 2313, 1572, 909, 317, -214, -707, -1176, -1621, -2021, -2355, -2605, -2766, -2845, -2876, -2901, -2950, -3031, -3141, -3280, -3440, -3603, -3755, -3901, -4048, -4192, -4325, -4452, -4576, -4684, -4761, -4816, -4862, -4893, -4893, -4877, -4867, -4860, -4840, -4816 } + } +}; +const Word16 CRendBin_FOA_HRIR_coeff_im_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + { -3791, -10093, -13324, -13368, -11400, -8739, -6007, -3157, -30, 3250, 6313, 8795, 10498, 11385, 11522, 11042, 10126, 8952, 7641, 6232, 4737, 3205, 1723, 351, -921, -2132, -3281, -4324, -5224, -5987, -6635, -7183, -7641, -8028, -8367, -8666, -8922, -9130, -9302, -9453, -9591, -9716, -9821, -9905, -9965, -10002, -10018, -10018, -10004, -9976, -9932, -9871, -9793, -9699, -9588, -9461, -9323, -9178, -9028, -8875, -8721, -8569, -8420, -8271, -8118, -7960, -7791, -7603, -7385, -7125, -6810, -6428, -5967, -5419, -4783, -4058, -3252, -2377, -1449, -487 }, + { -3791, -10093, -13324, -13368, -11400, -8739, -6007, -3157, -30, 3250, 6313, 8795, 10498, 11385, 11522, 11042, 10126, 8952, 7641, 6232, 4737, 3205, 1723, 351, -921, -2132, -3281, -4324, -5224, -5987, -6635, -7183, -7641, -8028, -8367, -8666, -8922, -9130, -9302, -9453, -9591, -9716, -9821, -9905, -9965, -10002, -10018, -10018, -10004, -9976, -9932, -9871, -9793, -9699, -9588, -9461, -9323, -9178, -9028, -8875, -8721, -8569, -8420, -8271, -8118, -7960, -7791, -7603, -7385, -7125, -6810, -6428, -5967, -5419, -4783, -4058, -3252, -2377, -1449, -487 } + }, + { + { 2328, 4750, 1991, -5402, -13887, -19456, -20121, -16485, -10445, -3686, 2827, 8610, 13396, 17085, 19690, 21252, 21834, 21559, 20613, 19211, 17553, 15780, 13933, 12008, 10040, 8127, 6350, 4720, 3209, 1786, 431, -870, -2110, -3269, -4337, -5327, -6257, -7142, -7980, -8749, -9424, -9993, -10465, -10857, -11178, -11439, -11648, -11807, -11916, -11984, -12021, -12038, -12036, -12008, -11946, -11844, -11704, -11535, -11341, -11132, -10919, -10717, -10529, -10348, -10176, -10011, -9840, -9642, -9398, -9097, -8722, -8253, -7675, -6984, -6177, -5252, -4215, -3084, -1883, -634 }, + { -2328, -4750, -1991, 5402, 13887, 19456, 20121, 16485, 10445, 3686, -2827, -8610, -13396, -17085, -19690, -21252, -21834, -21559, -20613, -19211, -17553, -15780, -13933, -12008, -10040, -8127, -6350, -4720, -3209, -1786, -431, 870, 2110, 3269, 4337, 5327, 6257, 7142, 7980, 8749, 9424, 9993, 10465, 10857, 11178, 11439, 11648, 11807, 11916, 11984, 12021, 12038, 12036, 12008, 11946, 11844, 11704, 11535, 11341, 11132, 10919, 10717, 10529, 10348, 10176, 10011, 9840, 9642, 9398, 9097, 8722, 8253, 7675, 6984, 6177, 5252, 4215, 3084, 1883, 634 } + }, + { + { -422, -1444, -2288, -1892, -188, 1354, 1451, 426, -573, -1019, -1037, -667, 96, 860, 1138, 1021, 1037, 1395, 1770, 1829, 1583, 1173, 628, -50, -746, -1297, -1646, -1878, -2117, -2421, -2736, -2967, -3065, -3043, -2925, -2720, -2469, -2255, -2146, -2154, -2253, -2418, -2637, -2901, -3202, -3531, -3881, -4251, -4652, -5086, -5541, -5994, -6423, -6811, -7148, -7423, -7625, -7745, -7779, -7728, -7586, -7344, -7006, -6577, -6056, -5437, -4731, -3963, -3154, -2322, -1500, -732, -53, 502, 890, 1079, 1079, 923, 631, 226 }, + { -422, -1444, -2288, -1892, -188, 1354, 1451, 426, -573, -1019, -1037, -667, 96, 860, 1138, 1021, 1037, 1395, 1770, 1829, 1583, 1173, 628, -50, -746, -1297, -1646, -1878, -2117, -2421, -2736, -2967, -3065, -3043, -2925, -2720, -2469, -2255, -2146, -2154, -2253, -2418, -2637, -2901, -3202, -3531, -3881, -4251, -4652, -5086, -5541, -5994, -6423, -6811, -7148, -7423, -7625, -7745, -7779, -7728, -7586, -7344, -7006, -6577, -6056, -5437, -4731, -3963, -3154, -2322, -1500, -732, -53, 502, 890, 1079, 1079, 923, 631, 226 } + }, + { + { 76, -204, -1118, -1802, -1431, -325, 378, 13, -995, -1713, -1614, -838, 150, 975, 1542, 2022, 2642, 3437, 4212, 4746, 4975, 4939, 4676, 4249, 3792, 3411, 3056, 2581, 1915, 1112, 235, -720, -1774, -2885, -3976, -4989, -5896, -6660, -7234, -7589, -7748, -7768, -7699, -7570, -7400, -7208, -7004, -6777, -6509, -6191, -5832, -5452, -5081, -4755, -4502, -4322, -4195, -4095, -4003, -3908, -3794, -3655, -3501, -3343, -3177, -2997, -2806, -2608, -2396, -2162, -1920, -1686, -1455, -1218, -988, -783, -597, -410, -228, -71 }, + { 76, -204, -1118, -1802, -1431, -325, 378, 13, -995, -1713, -1614, -838, 150, 975, 1542, 2022, 2642, 3437, 4212, 4746, 4975, 4939, 4676, 4249, 3792, 3411, 3056, 2581, 1915, 1112, 235, -720, -1774, -2885, -3976, -4989, -5896, -6660, -7234, -7589, -7748, -7768, -7699, -7570, -7400, -7208, -7004, -6777, -6509, -6191, -5832, -5452, -5081, -4755, -4502, -4322, -4195, -4095, -4003, -3908, -3794, -3655, -3501, -3343, -3177, -2997, -2806, -2608, -2396, -2162, -1920, -1686, -1455, -1218, -988, -783, -597, -410, -228, -71 } + } +}; +const Word16 *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; + /********************** CRendBin_HOA2_HRIR **********************/ -const Word32 CRendBin_HOA2_HRIR_latency_s_fx = 44741; // Q31 +const Word16 CRendBin_HOA2_HRIR_Q_latency_s_fx = 31; +const Word32 CRendBin_HOA2_HRIR_latency_s_fx = 44741;/*Q-31*/ /* Sample Rate = 48000 */ const Word16 CRendBin_HOA2_HRIR_max_num_iterations_48kHz = 1; -const UWord16 CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; -const UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; -const UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz = 0; -const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[9]={0, 0, 0, 0, 0, 0, 0, 0, 0}; -const UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -/* Sample Rate = 32000 */ - -const Word16 CRendBin_HOA2_HRIR_max_num_iterations_32kHz = 1; -const UWord16 CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; -const UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; -const UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz = 0; -const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[9]={0, 0, 0, 0, 0, 0, 0, 0, 0}; -const UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -/* Sample Rate = 16000 */ - -const Word16 CRendBin_HOA2_HRIR_max_num_iterations_16kHz = 1; -const UWord16 CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; -const UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; -const UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz = 0; -const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[9]={0, 0, 0, 0, 0, 0, 0, 0, 0}; -const UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; - - -/********************** CRendBin_HOA3_HRIR **********************/ - -const Word32 CRendBin_HOA3_HRIR_latency_s_fx = 44741;/*Q-31*/ -/* Sample Rate = 48000 */ - -const Word16 CRendBin_HOA3_HRIR_max_num_iterations_48kHz = 1; -const UWord16 CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; -const UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; -const UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz = 0; -const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -const UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -/* Sample Rate = 32000 */ - -const Word16 CRendBin_HOA3_HRIR_max_num_iterations_32kHz = 1; -const UWord16 CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; -const UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; -const UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz = 0; -const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -const UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_HOA2_HRIR_num_iterations_48kHz[HOA2_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const Word16 CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const Word16 CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const Word16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz = 0; +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_Q_48kHz_fx = 0; +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0}}; +const Word16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_HOA2_HRIR_coeff_Q_48kHz_fx = 14; +const Word16 CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {15654, 10415, 2730, -4074, -8334, -10258, -10654, -9905, -8002, -5055, -1475, 2185, 5438, 7939, 9524, 10211, 10145, 9496, 8391, 6919, 5173, 3290, 1421, -349, -2021, -3619, -5104, -6396, -7451, -8282, -8922, -9389, -9705, -9904, -10021, -10074, -10071, -10031, -9973, -9908, -9833, -9738, -9614, -9458, -9271, -9056, -8815, -8551, -8264, -7955, -7624, -7274, -6912, -6543, -6172, -5802, -5442, -5094, -4757, -4427, -4105, -3790, -3481, -3175, -2874, -2581, -2296, -2017, -1744, -1480, -1222, -965, -709, -456, -204, 53, 315, 576, 840, 1114, 1396, 1679, 1956, 2231, 2508, 2783, 3045, 3294, 3537, 3779, 4017, 4237, 4434, 4614, 4783, 4941, + 5078, 5193, 5296, 5399, 5510, 5624, 5739, 5856, 5983, 6129, 6292, 6465, 6642, 6822, 7008, 7197, 7388, 7575, 7755, 7923, 8079, 8226, 8365, 8498, 8625, 8748, 8867, 8983, 9097, 9207, 9311, 9407, 9497, 9578, 9651, 9717, 9781, 9844, 9907, 9970, 10034, 10097, 10159, 10222, 10288, 10357, 10431, 10510, 10591, 10673, 10754, 10836, 10914, 10988, 11061, 11131, 11195, 11254, 11308, 11357, 11398, 11430, 11456, 11476, 11491, 11503, 11517, 11531, 11545, 11565, 11590, 11613, 11633, 11654, 11674, 11689, 11702, 11717, 11731, 11741, 11751, 11765, 11777, 11789, 11808, 11836, 11866, 11900, 11943, 11994, 12042, 12090, 12146, 12202, 12248, 12294, + 12350, 12399, 12433, 12472, 12527, 12566, 12580, 12609, 12665, 12690, 12663, 12664, 12740, 12802, 12755, 12653, 12615, 12651, 12685, 12673, 12578, 12325, 11947, 11700, 11832, 12234, 12506, 12407, 12092, 11862, 11798, 11761, 11698, 11811, 12342, 13223, 14032, 14387, 14310, 14125, 14034, 13978, 13884, 13842, 13904, 13918, 13744, 13526 }, + {15654, 10415, 2730, -4074, -8334, -10258, -10654, -9905, -8002, -5055, -1475, 2185, 5438, 7939, 9524, 10211, 10145, 9496, 8391, 6919, 5173, 3290, 1421, -349, -2021, -3619, -5104, -6396, -7451, -8282, -8922, -9389, -9705, -9904, -10021, -10074, -10071, -10031, -9973, -9908, -9833, -9738, -9614, -9458, -9271, -9056, -8815, -8551, -8264, -7955, -7624, -7274, -6912, -6543, -6172, -5802, -5442, -5094, -4757, -4427, -4105, -3790, -3481, -3175, -2874, -2581, -2296, -2017, -1744, -1480, -1222, -965, -709, -456, -204, 53, 315, 576, 840, 1114, 1396, 1679, 1956, 2231, 2508, 2783, 3045, 3294, 3537, 3779, 4017, 4237, 4434, 4614, 4783, 4941, + 5078, 5193, 5296, 5399, 5510, 5624, 5739, 5856, 5983, 6129, 6292, 6465, 6642, 6822, 7008, 7197, 7388, 7575, 7755, 7923, 8079, 8226, 8365, 8498, 8625, 8748, 8867, 8983, 9097, 9207, 9311, 9407, 9497, 9578, 9651, 9717, 9781, 9844, 9907, 9970, 10034, 10097, 10159, 10222, 10288, 10357, 10431, 10510, 10591, 10673, 10754, 10836, 10914, 10988, 11061, 11131, 11195, 11254, 11308, 11357, 11398, 11430, 11456, 11476, 11491, 11503, 11517, 11531, 11545, 11565, 11590, 11613, 11633, 11654, 11674, 11689, 11702, 11717, 11731, 11741, 11751, 11765, 11777, 11789, 11808, 11836, 11866, 11900, 11943, 11994, 12042, 12090, 12146, 12202, 12248, 12294, + 12350, 12399, 12433, 12472, 12527, 12566, 12580, 12609, 12665, 12690, 12663, 12664, 12740, 12802, 12755, 12653, 12615, 12651, 12685, 12673, 12578, 12325, 11947, 11700, 11832, 12234, 12506, 12407, 12092, 11862, 11798, 11761, 11698, 11811, 12342, 13223, 14032, 14387, 14310, 14125, 14034, 13978, 13884, 13842, 13904, 13918, 13744, 13526 } + }, + { + {1594, 6786, 12249, 12363, 5420, -5353, -14772, -19507, -19416, -16170, -11354, -5814, -37, 5493, 10343, 14252, 17080, 18728, 19184, 18610, 17306, 15562, 13523, 11227, 8737, 6195, 3748, 1462, -666, -2646, -4473, -6145, -7670, -9054, -10301, -11425, -12448, -13380, -14219, -14955, -15575, -16070, -16440, -16697, -16852, -16914, -16887, -16777, -16594, -16356, -16080, -15780, -15455, -15095, -14690, -14238, -13747, -13223, -12676, -12116, -11557, -11005, -10463, -9931, -9418, -8929, -8463, -8017, -7598, -7214, -6863, -6541, -6251, -5997, -5770, -5556, -5349, -5154, -4969, -4776, -4562, -4334, -4103, -3862, -3596, -3304, -2997, -2686, -2369, -2040, -1692, -1319, -917, -482, -12, 497, + 1047, 1635, 2244, 2857, 3458, 4034, 4577, 5077, 5521, 5899, 6211, 6460, 6647, 6775, 6853, 6898, 6932, 6967, 7011, 7057, 7102, 7152, 7224, 7326, 7460, 7614, 7774, 7925, 8062, 8190, 8316, 8441, 8562, 8679, 8792, 8900, 9001, 9093, 9176, 9251, 9322, 9394, 9467, 9540, 9614, 9687, 9761, 9839, 9929, 10033, 10153, 10290, 10443, 10604, 10771, 10947, 11133, 11328, 11528, 11738, 11954, 12169, 12375, 12572, 12758, 12929, 13085, 13232, 13367, 13488, 13595, 13689, 13765, 13825, 13881, 13936, 13984, 14032, 14088, 14146, 14190, 14218, 14234, 14234, 14219, 14206, 14200, 14188, 14176, 14179, 14191, 14193, 14192, 14205, 14219, 14223, + 14238, 14264, 14276, 14285, 14331, 14383, 14381, 14386, 14484, 14573, 14518, 14491, 14725, 14955, 14684, 14069, 13855, 14240, 14612, 14680, 14941, 15543, 15645, 14656, 13345, 12883, 13339, 13870, 13899, 13488, 12999, 12822, 12873, 12094, 9377, 5492, 3032, 3607, 5938, 7606, 7900, 7887, 8272, 8431, 7534, 5685, 3748, 2567 }, + {-1594, -6786, -12249, -12363, -5420, 5353, 14772, 19507, 19416, 16170, 11354, 5814, 37, -5493, -10343, -14252, -17080, -18728, -19184, -18610, -17306, -15562, -13523, -11227, -8737, -6195, -3748, -1462, 666, 2646, 4473, 6145, 7670, 9054, 10301, 11425, 12448, 13380, 14219, 14955, 15575, 16070, 16440, 16697, 16852, 16914, 16887, 16777, 16594, 16356, 16080, 15780, 15455, 15095, 14690, 14238, 13747, 13223, 12676, 12116, 11557, 11005, 10463, 9931, 9418, 8929, 8463, 8017, 7598, 7214, 6863, 6541, 6251, 5997, 5770, 5556, 5349, 5154, 4969, 4776, 4562, 4334, 4103, 3862, 3596, 3304, 2997, 2686, 2369, 2040, 1692, 1319, 917, 482, 12, -497, + -1047, -1635, -2244, -2857, -3458, -4034, -4577, -5077, -5521, -5899, -6211, -6460, -6647, -6775, -6853, -6898, -6932, -6967, -7011, -7057, -7102, -7152, -7224, -7326, -7460, -7614, -7774, -7925, -8062, -8190, -8316, -8441, -8562, -8679, -8792, -8900, -9001, -9093, -9176, -9251, -9322, -9394, -9467, -9540, -9614, -9687, -9761, -9839, -9929, -10033, -10153, -10290, -10443, -10604, -10771, -10947, -11133, -11328, -11528, -11738, -11954, -12169, -12375, -12572, -12758, -12929, -13085, -13232, -13367, -13488, -13595, -13689, -13765, -13825, -13881, -13936, -13984, -14032, -14088, -14146, -14190, -14218, -14234, -14234, -14219, -14206, -14200, -14188, -14176, -14179, -14191, -14193, -14192, -14205, -14219, -14223, + -14238, -14264, -14276, -14285, -14331, -14383, -14381, -14386, -14484, -14573, -14518, -14491, -14725, -14955, -14684, -14069, -13855, -14240, -14612, -14680, -14941, -15543, -15645, -14656, -13345, -12883, -13339, -13870, -13899, -13488, -12999, -12822, -12873, -12094, -9377, -5492, -3032, -3607, -5938, -7606, -7900, -7887, -8272, -8431, -7534, -5685, -3748, -2567 } + }, + { + {1912, 1182, -338, -1838, -1970, -523, 1105, 1502, 644, -564, -1396, -1561, -1027, -120, 577, 836, 1025, 1517, 2137, 2455, 2331, 1908, 1286, 493, -339, -998, -1404, -1659, -1904, -2181, -2419, -2523, -2461, -2275, -2024, -1754, -1519, -1398, -1439, -1622, -1889, -2199, -2535, -2877, -3203, -3502, -3777, -4034, -4276, -4498, -4675, -4780, -4793, -4712, -4537, -4263, -3887, -3415, -2860, -2223, -1504, -708, 151, 1067, 2035, 3036, 4043, 5032, 5984, 6876, 7677, 8362, 8911, 9304, 9526, 9586, 9503, 9279, 8916, 8440, 7903, 7338, 6741, 6110, 5486, 4921, 4422, 3950, 3486, 3065, 2736, 2495, 2302, 2134, 1999, 1912, + 1874, 1878, 1910, 1948, 1975, 1989, 1996, 2000, 2000, 1975, 1895, 1743, 1541, 1323, 1102, 872, 627, 368, 97, -170, -411, -611, -765, -866, -907, -894, -837, -734, -582, -390, -175, 57, 295, 526, 743, 946, 1125, 1264, 1367, 1451, 1529, 1608, 1709, 1843, 1989, 2124, 2247, 2366, 2472, 2559, 2636, 2701, 2741, 2756, 2763, 2762, 2745, 2725, 2717, 2711, 2694, 2677, 2666, 2641, 2598, 2559, 2522, 2465, 2393, 2324, 2253, 2166, 2088, 2041, 2004, 1962, 1937, 1940, 1935, 1914, 1898, 1868, 1780, 1653, 1526, 1371, 1155, 925, 720, 491, 216, -32, -236, -468, -717, -897, + -1059, -1299, -1512, -1588, -1718, -2041, -2252, -2163, -2237, -2746, -3003, -2568, -2512, -3815, -5114, -4206, -1557, 65, -421, -1310, -1450, -1945, -3444, -4258, -2874, -493, 667, 314, -186, -80, 105, -373, -1639, -3003, -3203, -1595, 641, 1412, 187, -1393, -1774, -1298, -1135, -1426, -1427, -891, -314, -56 }, + {1912, 1182, -338, -1838, -1970, -523, 1105, 1502, 644, -564, -1396, -1561, -1027, -120, 577, 836, 1025, 1517, 2137, 2455, 2331, 1908, 1286, 493, -339, -998, -1404, -1659, -1904, -2181, -2419, -2523, -2461, -2275, -2024, -1754, -1519, -1398, -1439, -1622, -1889, -2199, -2535, -2877, -3203, -3502, -3777, -4034, -4276, -4498, -4675, -4780, -4793, -4712, -4537, -4263, -3887, -3415, -2860, -2223, -1504, -708, 151, 1067, 2035, 3036, 4043, 5032, 5984, 6876, 7677, 8362, 8911, 9304, 9526, 9586, 9503, 9279, 8916, 8440, 7903, 7338, 6741, 6110, 5486, 4921, 4422, 3950, 3486, 3065, 2736, 2495, 2302, 2134, 1999, 1912, + 1874, 1878, 1910, 1948, 1975, 1989, 1996, 2000, 2000, 1975, 1895, 1743, 1541, 1323, 1102, 872, 627, 368, 97, -170, -411, -611, -765, -866, -907, -894, -837, -734, -582, -390, -175, 57, 295, 526, 743, 946, 1125, 1264, 1367, 1451, 1529, 1608, 1709, 1843, 1989, 2124, 2247, 2366, 2472, 2559, 2636, 2701, 2741, 2756, 2763, 2762, 2745, 2725, 2717, 2711, 2694, 2677, 2666, 2641, 2598, 2559, 2522, 2465, 2393, 2324, 2253, 2166, 2088, 2041, 2004, 1962, 1937, 1940, 1935, 1914, 1898, 1868, 1780, 1653, 1526, 1371, 1155, 925, 720, 491, 216, -32, -236, -468, -717, -897, + -1059, -1299, -1512, -1588, -1718, -2041, -2252, -2163, -2237, -2746, -3003, -2568, -2512, -3815, -5114, -4206, -1557, 65, -421, -1310, -1450, -1945, -3444, -4258, -2874, -493, 667, 314, -186, -80, 105, -373, -1639, -3003, -3203, -1595, 641, 1412, 187, -1393, -1774, -1298, -1135, -1426, -1427, -891, -314, -56 } + }, + { + {946, 1258, 964, -226, -1301, -1214, -265, 281, -299, -1531, -2448, -2519, -1885, -997, -192, 519, 1347, 2404, 3532, 4437, 4940, 5028, 4762, 4239, 3604, 2963, 2271, 1404, 322, -887, -2135, -3410, -4700, -5924, -6981, -7825, -8460, -8878, -9059, -9017, -8803, -8471, -8060, -7595, -7098, -6589, -6077, -5556, -5014, -4450, -3883, -3344, -2861, -2459, -2142, -1885, -1648, -1406, -1151, -881, -595, -302, -19, 253, 519, 777, 1026, 1278, 1550, 1835, 2119, 2401, 2696, 2991, 3260, 3490, 3686, 3842, 3929, 3931, 3865, 3751, 3580, 3339, 3043, 2736, 2439, 2140, 1823, 1496, 1161, 802, 407, -9, -428, -851, + -1289, -1727, -2135, -2496, -2815, -3100, -3347, -3529, -3623, -3627, -3571, -3488, -3378, -3215, -2986, -2703, -2401, -2116, -1859, -1607, -1328, -1013, -691, -399, -156, 39, 207, 379, 572, 779, 981, 1176, 1369, 1570, 1787, 2036, 2316, 2617, 2926, 3240, 3551, 3851, 4143, 4428, 4698, 4944, 5162, 5347, 5490, 5589, 5650, 5678, 5672, 5640, 5596, 5541, 5474, 5409, 5353, 5304, 5266, 5255, 5274, 5313, 5367, 5442, 5528, 5609, 5683, 5758, 5836, 5916, 6014, 6135, 6261, 6385, 6521, 6664, 6795, 6916, 7044, 7162, 7244, 7299, 7340, 7342, 7293, 7224, 7152, 7046, 6908, 6785, 6675, 6537, 6397, 6299, + 6192, 6036, 5922, 5888, 5780, 5563, 5477, 5564, 5452, 5082, 5018, 5372, 5201, 4037, 3227, 4238, 6245, 7146, 6621, 6168, 6257, 5755, 4534, 4292, 5860, 7673, 8096, 7622, 7567, 7983, 8145, 7935, 7459, 6285, 4378, 3021, 3458, 5055, 6050, 5868, 5543, 5881, 6366, 6243, 5850, 6192, 7489, 8718 }, + {946, 1258, 964, -226, -1301, -1214, -265, 281, -299, -1531, -2448, -2519, -1885, -997, -192, 519, 1347, 2404, 3532, 4437, 4940, 5028, 4762, 4239, 3604, 2963, 2271, 1404, 322, -887, -2135, -3410, -4700, -5924, -6981, -7825, -8460, -8878, -9059, -9017, -8803, -8471, -8060, -7595, -7098, -6589, -6077, -5556, -5014, -4450, -3883, -3344, -2861, -2459, -2142, -1885, -1648, -1406, -1151, -881, -595, -302, -19, 253, 519, 777, 1026, 1278, 1550, 1835, 2119, 2401, 2696, 2991, 3260, 3490, 3686, 3842, 3929, 3931, 3865, 3751, 3580, 3339, 3043, 2736, 2439, 2140, 1823, 1496, 1161, 802, 407, -9, -428, -851, + -1289, -1727, -2135, -2496, -2815, -3100, -3347, -3529, -3623, -3627, -3571, -3488, -3378, -3215, -2986, -2703, -2401, -2116, -1859, -1607, -1328, -1013, -691, -399, -156, 39, 207, 379, 572, 779, 981, 1176, 1369, 1570, 1787, 2036, 2316, 2617, 2926, 3240, 3551, 3851, 4143, 4428, 4698, 4944, 5162, 5347, 5490, 5589, 5650, 5678, 5672, 5640, 5596, 5541, 5474, 5409, 5353, 5304, 5266, 5255, 5274, 5313, 5367, 5442, 5528, 5609, 5683, 5758, 5836, 5916, 6014, 6135, 6261, 6385, 6521, 6664, 6795, 6916, 7044, 7162, 7244, 7299, 7340, 7342, 7293, 7224, 7152, 7046, 6908, 6785, 6675, 6537, 6397, 6299, + 6192, 6036, 5922, 5888, 5780, 5563, 5477, 5564, 5452, 5082, 5018, 5372, 5201, 4037, 3227, 4238, 6245, 7146, 6621, 6168, 6257, 5755, 4534, 4292, 5860, 7673, 8096, 7622, 7567, 7983, 8145, 7935, 7459, 6285, 4378, 3021, 3458, 5055, 6050, 5868, 5543, 5881, 6366, 6243, 5850, 6192, 7489, 8718 } + }, + { + {364, 252, 301, 578, 765, 618, 361, 326, 319, -284, -1685, -3190, -3837, -3352, -2268, -1175, -172, 931, 2168, 3380, 4454, 5372, 6080, 6473, 6522, 6307, 5885, 5236, 4348, 3275, 2081, 801, -535, -1883, -3208, -4476, -5609, -6493, -7065, -7353, -7437, -7389, -7256, -7077, -6867, -6628, -6361, -6064, -5729, -5352, -4943, -4525, -4116, -3735, -3405, -3130, -2892, -2670, -2454, -2238, -2011, -1766, -1506, -1229, -928, -605, -264, 97, 488, 902, 1324, 1757, 2209, 2671, 3118, 3532, 3915, 4258, 4526, 4697, 4790, 4833, 4820, 4726, 4555, 4348, 4125, 3861, 3527, 3139, 2735, 2324, 1894, 1448, 1018, 631, + 290, -14, -287, -528, -734, -909, -1064, -1206, -1336, -1455, -1580, -1723, -1876, -2013, -2118, -2196, -2265, -2344, -2438, -2530, -2590, -2604, -2587, -2567, -2560, -2575, -2604, -2628, -2630, -2609, -2572, -2518, -2444, -2346, -2218, -2050, -1845, -1616, -1377, -1135, -902, -688, -492, -312, -155, -30, 63, 126, 158, 163, 156, 145, 129, 112, 103, 100, 105, 126, 170, 235, 325, 451, 612, 794, 988, 1197, 1411, 1613, 1804, 1990, 2164, 2319, 2468, 2621, 2766, 2902, 3044, 3195, 3342, 3488, 3644, 3791, 3908, 4007, 4104, 4176, 4210, 4241, 4279, 4294, 4283, 4283, 4286, 4257, 4223, 4222, + 4202, 4133, 4109, 4156, 4123, 3991, 3994, 4146, 4080, 3768, 3762, 4117, 3889, 2687, 1895, 2936, 4963, 5919, 5449, 4931, 4869, 4367, 3367, 3266, 4633, 6124, 6484, 6146, 6050, 6214, 6207, 5876, 4984, 3339, 1856, 2180, 4448, 6641, 7040, 6265, 5919, 6287, 6529, 6358, 6192, 6057, 5596, 5034 }, + {-364, -252, -301, -578, -765, -618, -361, -326, -319, 284, 1685, 3190, 3837, 3352, 2268, 1175, 172, -931, -2168, -3380, -4454, -5372, -6080, -6473, -6522, -6307, -5885, -5236, -4348, -3275, -2081, -801, 535, 1883, 3208, 4476, 5609, 6493, 7065, 7353, 7437, 7389, 7256, 7077, 6867, 6628, 6361, 6064, 5729, 5352, 4943, 4525, 4116, 3735, 3405, 3130, 2892, 2670, 2454, 2238, 2011, 1766, 1506, 1229, 928, 605, 264, -97, -488, -902, -1324, -1757, -2209, -2671, -3118, -3532, -3915, -4258, -4526, -4697, -4790, -4833, -4820, -4726, -4555, -4348, -4125, -3861, -3527, -3139, -2735, -2324, -1894, -1448, -1018, -631, + -290, 14, 287, 528, 734, 909, 1064, 1206, 1336, 1455, 1580, 1723, 1876, 2013, 2118, 2196, 2265, 2344, 2438, 2530, 2590, 2604, 2587, 2567, 2560, 2575, 2604, 2628, 2630, 2609, 2572, 2518, 2444, 2346, 2218, 2050, 1845, 1616, 1377, 1135, 902, 688, 492, 312, 155, 30, -63, -126, -158, -163, -156, -145, -129, -112, -103, -100, -105, -126, -170, -235, -325, -451, -612, -794, -988, -1197, -1411, -1613, -1804, -1990, -2164, -2319, -2468, -2621, -2766, -2902, -3044, -3195, -3342, -3488, -3644, -3791, -3908, -4007, -4104, -4176, -4210, -4241, -4279, -4294, -4283, -4283, -4286, -4257, -4223, -4222, + -4202, -4133, -4109, -4156, -4123, -3991, -3994, -4146, -4080, -3768, -3762, -4117, -3889, -2687, -1895, -2936, -4963, -5919, -5449, -4931, -4869, -4367, -3367, -3266, -4633, -6124, -6484, -6146, -6050, -6214, -6207, -5876, -4984, -3339, -1856, -2180, -4448, -6641, -7040, -6265, -5919, -6287, -6529, -6358, -6192, -6057, -5596, -5034 } + }, + { + {56, -200, -20, 346, -40, -713, 16, 2151, 3168, 1200, -2313, -4393, -3962, -2308, -886, 43, 831, 1631, 2380, 2979, 3289, 3218, 2845, 2328, 1759, 1211, 798, 567, 447, 394, 455, 636, 831, 944, 990, 1034, 1087, 1101, 1003, 745, 345, -118, -575, -1002, -1392, -1732, -2043, -2368, -2726, -3105, -3490, -3877, -4247, -4577, -4856, -5061, -5152, -5108, -4940, -4658, -4250, -3722, -3104, -2412, -1637, -788, 100, 1000, 1897, 2769, 3577, 4293, 4895, 5355, 5653, 5793, 5786, 5631, 5326, 4895, 4377, 3800, 3164, 2466, 1729, 999, 305, -366, -1033, -1684, -2288, -2840, -3347, -3797, -4173, -4473, + -4701, -4839, -4866, -4784, -4612, -4358, -4020, -3596, -3095, -2558, -2050, -1618, -1249, -897, -549, -236, 5, 161, 236, 260, 272, 285, 285, 267, 247, 237, 243, 281, 362, 476, 607, 752, 911, 1065, 1196, 1305, 1390, 1437, 1449, 1443, 1422, 1383, 1341, 1311, 1283, 1243, 1198, 1158, 1111, 1051, 989, 927, 851, 767, 694, 630, 560, 494, 447, 408, 364, 332, 326, 327, 326, 342, 375, 399, 411, 434, 461, 474, 490, 533, 583, 618, 661, 726, 779, 806, 831, 844, 802, 714, 627, 523, 361, 179, 27, -137, -347, -541, -688, -858, -1056, -1199, + -1310, -1490, -1669, -1723, -1793, -2036, -2223, -2139, -2139, -2532, -2792, -2443, -2280, -3226, -4289, -3539, -1173, 431, 85, -831, -1053, -1337, -2506, -3441, -2640, -604, 813, 780, 56, -429, -693, -1522, -3424, -5550, -5964, -3754, -660, 534, -766, -2490, -2786, -2088, -1812, -2217, -2490, -2228, -1815, -1613 }, + {-56, 200, 20, -346, 40, 713, -16, -2151, -3168, -1200, 2313, 4393, 3962, 2308, 886, -43, -831, -1631, -2380, -2979, -3289, -3218, -2845, -2328, -1759, -1211, -798, -567, -447, -394, -455, -636, -831, -944, -990, -1034, -1087, -1101, -1003, -745, -345, 118, 575, 1002, 1392, 1732, 2043, 2368, 2726, 3105, 3490, 3877, 4247, 4577, 4856, 5061, 5152, 5108, 4940, 4658, 4250, 3722, 3104, 2412, 1637, 788, -100, -1000, -1897, -2769, -3577, -4293, -4895, -5355, -5653, -5793, -5786, -5631, -5326, -4895, -4377, -3800, -3164, -2466, -1729, -999, -305, 366, 1033, 1684, 2288, 2840, 3347, 3797, 4173, 4473, + 4701, 4839, 4866, 4784, 4612, 4358, 4020, 3596, 3095, 2558, 2050, 1618, 1249, 897, 549, 236, -5, -161, -236, -260, -272, -285, -285, -267, -247, -237, -243, -281, -362, -476, -607, -752, -911, -1065, -1196, -1305, -1390, -1437, -1449, -1443, -1422, -1383, -1341, -1311, -1283, -1243, -1198, -1158, -1111, -1051, -989, -927, -851, -767, -694, -630, -560, -494, -447, -408, -364, -332, -326, -327, -326, -342, -375, -399, -411, -434, -461, -474, -490, -533, -583, -618, -661, -726, -779, -806, -831, -844, -802, -714, -627, -523, -361, -179, -27, 137, 347, 541, 688, 858, 1056, 1199, + 1310, 1490, 1669, 1723, 1793, 2036, 2223, 2139, 2139, 2532, 2792, 2443, 2280, 3226, 4289, 3539, 1173, -431, -85, 831, 1053, 1337, 2506, 3441, 2640, 604, -813, -780, -56, 429, 693, 1522, 3424, 5550, 5964, 3754, 660, -534, 766, 2490, 2786, 2088, 1812, 2217, 2490, 2228, 1815, 1613 } + }, + { + {-215, -201, -480, -1005, -1338, -1378, -1502, -1684, -1069, 1012, 3892, 6008, 6407, 5394, 3794, 2108, 492, -914, -1981, -2749, -3350, -3823, -4125, -4245, -4195, -3948, -3509, -3015, -2667, -2545, -2559, -2555, -2459, -2280, -2049, -1774, -1452, -1086, -685, -252, 203, 640, 1009, 1290, 1509, 1701, 1878, 2033, 2161, 2257, 2319, 2345, 2332, 2273, 2162, 2000, 1797, 1572, 1344, 1126, 927, 749, 599, 484, 409, 375, 387, 453, 586, 787, 1051, 1371, 1749, 2191, 2691, 3234, 3807, 4408, 5029, 5643, 6224, 6759, 7242, 7661, 7993, 8225, 8356, 8389, 8329, 8178, 7929, 7567, 7079, 6479, 5808, 5110, + 4403, 3684, 2960, 2270, 1678, 1228, 918, 713, 579, 512, 530, 641, 828, 1053, 1279, 1477, 1632, 1741, 1807, 1832, 1811, 1733, 1591, 1387, 1133, 852, 561, 267, -26, -319, -610, -895, -1174, -1449, -1730, -2020, -2313, -2599, -2877, -3151, -3429, -3716, -4019, -4338, -4664, -4979, -5272, -5536, -5765, -5953, -6096, -6193, -6246, -6262, -6252, -6220, -6172, -6116, -6058, -5997, -5935, -5873, -5815, -5760, -5709, -5662, -5619, -5574, -5524, -5470, -5413, -5359, -5316, -5285, -5258, -5230, -5203, -5174, -5133, -5079, -5015, -4938, -4843, -4735, -4618, -4485, -4334, -4175, -4015, -3844, -3667, -3503, -3355, -3210, -3069, -2947, + -2832, -2709, -2598, -2504, -2390, -2251, -2150, -2091, -1986, -1839, -1789, -1833, -1752, -1537, -1549, -1946, -2303, -2238, -2036, -2085, -2084, -1617, -1174, -1620, -2766, -3484, -3295, -2857, -2772, -2899, -3013, -3108, -2881, -2015, -1239, -1857, -3788, -5339, -5468, -5000, -4914, -4917, -4652, -4765, -5309, -4563, -1475, 1734 }, + {-215, -201, -480, -1005, -1338, -1378, -1502, -1684, -1069, 1012, 3892, 6008, 6407, 5394, 3794, 2108, 492, -914, -1981, -2749, -3350, -3823, -4125, -4245, -4195, -3948, -3509, -3015, -2667, -2545, -2559, -2555, -2459, -2280, -2049, -1774, -1452, -1086, -685, -252, 203, 640, 1009, 1290, 1509, 1701, 1878, 2033, 2161, 2257, 2319, 2345, 2332, 2273, 2162, 2000, 1797, 1572, 1344, 1126, 927, 749, 599, 484, 409, 375, 387, 453, 586, 787, 1051, 1371, 1749, 2191, 2691, 3234, 3807, 4408, 5029, 5643, 6224, 6759, 7242, 7661, 7993, 8225, 8356, 8389, 8329, 8178, 7929, 7567, 7079, 6479, 5808, 5110, + 4403, 3684, 2960, 2270, 1678, 1228, 918, 713, 579, 512, 530, 641, 828, 1053, 1279, 1477, 1632, 1741, 1807, 1832, 1811, 1733, 1591, 1387, 1133, 852, 561, 267, -26, -319, -610, -895, -1174, -1449, -1730, -2020, -2313, -2599, -2877, -3151, -3429, -3716, -4019, -4338, -4664, -4979, -5272, -5536, -5765, -5953, -6096, -6193, -6246, -6262, -6252, -6220, -6172, -6116, -6058, -5997, -5935, -5873, -5815, -5760, -5709, -5662, -5619, -5574, -5524, -5470, -5413, -5359, -5316, -5285, -5258, -5230, -5203, -5174, -5133, -5079, -5015, -4938, -4843, -4735, -4618, -4485, -4334, -4175, -4015, -3844, -3667, -3503, -3355, -3210, -3069, -2947, + -2832, -2709, -2598, -2504, -2390, -2251, -2150, -2091, -1986, -1839, -1789, -1833, -1752, -1537, -1549, -1946, -2303, -2238, -2036, -2085, -2084, -1617, -1174, -1620, -2766, -3484, -3295, -2857, -2772, -2899, -3013, -3108, -2881, -2015, -1239, -1857, -3788, -5339, -5468, -5000, -4914, -4917, -4652, -4765, -5309, -4563, -1475, 1734 } + }, + { + {829, -350, -1649, -1717, -24, 2436, 3691, 2506, -281, -2467, -2690, -1569, -538, -173, -121, -88, -114, -90, 247, 781, 1041, 874, 649, 707, 972, 1223, 1424, 1634, 1810, 1843, 1697, 1426, 1124, 880, 711, 531, 242, -174, -665, -1172, -1638, -2010, -2267, -2439, -2547, -2590, -2577, -2534, -2476, -2403, -2320, -2241, -2163, -2072, -1969, -1859, -1732, -1575, -1397, -1216, -1042, -882, -747, -646, -587, -567, -568, -575, -587, -612, -637, -635, -596, -533, -442, -292, -64, 240, 611, 1048, 1550, 2107, 2703, 3309, 3903, 4486, 5054, 5575, 6006, 6361, 6698, 7038, 7322, 7482, 7508, 7439, + 7296, 7056, 6687, 6194, 5619, 5000, 4334, 3590, 2770, 1921, 1098, 319, -432, -1183, -1943, -2685, -3358, -3929, -4404, -4808, -5151, -5429, -5636, -5771, -5843, -5868, -5868, -5847, -5801, -5734, -5659, -5578, -5481, -5357, -5190, -4971, -4719, -4470, -4244, -4032, -3823, -3606, -3367, -3099, -2824, -2575, -2359, -2163, -1984, -1819, -1648, -1465, -1288, -1137, -1011, -905, -817, -739, -651, -547, -436, -320, -204, -100, -10, 80, 178, 274, 370, 482, 602, 702, 778, 845, 900, 930, 946, 966, 980, 979, 980, 992, 996, 991, 1007, 1048, 1084, 1120, 1189, 1276, 1348, 1422, 1525, 1625, 1695, 1781, + 1899, 1982, 2021, 2115, 2256, 2303, 2277, 2378, 2573, 2575, 2414, 2533, 2977, 3100, 2576, 2113, 2485, 3311, 3635, 3384, 3306, 3577, 3484, 2688, 1946, 2091, 2855, 3270, 2964, 2479, 2310, 2121, 1287, -16, -733, -134, 1220, 2066, 1869, 1290, 1205, 1633, 1899, 1653, 1390, 1843, 3031, 4080 }, + {829, -350, -1649, -1717, -24, 2436, 3691, 2506, -281, -2467, -2690, -1569, -538, -173, -121, -88, -114, -90, 247, 781, 1041, 874, 649, 707, 972, 1223, 1424, 1634, 1810, 1843, 1697, 1426, 1124, 880, 711, 531, 242, -174, -665, -1172, -1638, -2010, -2267, -2439, -2547, -2590, -2577, -2534, -2476, -2403, -2320, -2241, -2163, -2072, -1969, -1859, -1732, -1575, -1397, -1216, -1042, -882, -747, -646, -587, -567, -568, -575, -587, -612, -637, -635, -596, -533, -442, -292, -64, 240, 611, 1048, 1550, 2107, 2703, 3309, 3903, 4486, 5054, 5575, 6006, 6361, 6698, 7038, 7322, 7482, 7508, 7439, + 7296, 7056, 6687, 6194, 5619, 5000, 4334, 3590, 2770, 1921, 1098, 319, -432, -1183, -1943, -2685, -3358, -3929, -4404, -4808, -5151, -5429, -5636, -5771, -5843, -5868, -5868, -5847, -5801, -5734, -5659, -5578, -5481, -5357, -5190, -4971, -4719, -4470, -4244, -4032, -3823, -3606, -3367, -3099, -2824, -2575, -2359, -2163, -1984, -1819, -1648, -1465, -1288, -1137, -1011, -905, -817, -739, -651, -547, -436, -320, -204, -100, -10, 80, 178, 274, 370, 482, 602, 702, 778, 845, 900, 930, 946, 966, 980, 979, 980, 992, 996, 991, 1007, 1048, 1084, 1120, 1189, 1276, 1348, 1422, 1525, 1625, 1695, 1781, + 1899, 1982, 2021, 2115, 2256, 2303, 2277, 2378, 2573, 2575, 2414, 2533, 2977, 3100, 2576, 2113, 2485, 3311, 3635, 3384, 3306, 3577, 3484, 2688, 1946, 2091, 2855, 3270, 2964, 2479, 2310, 2121, 1287, -16, -733, -134, 1220, 2066, 1869, 1290, 1205, 1633, 1899, 1653, 1390, 1843, 3031, 4080 } + }, + { + {-119, 1081, 1578, 102, -2617, -5062, -6244, -5545, -2579, 1994, 6391, 9197, 10432, 10724, 10097, 8239, 5468, 2672, 396, -1505, -3359, -5203, -6844, -8114, -8998, -9614, -10098, -10481, -10683, -10636, -10352, -9860, -9169, -8288, -7256, -6121, -4919, -3690, -2479, -1330, -283, 639, 1451, 2188, 2860, 3447, 3926, 4300, 4585, 4808, 5002, 5191, 5375, 5530, 5638, 5695, 5700, 5650, 5548, 5406, 5234, 5041, 4830, 4603, 4363, 4116, 3862, 3603, 3346, 3101, 2871, 2652, 2445, 2258, 2093, 1939, 1795, 1673, 1583, 1518, 1457, 1388, 1309, 1221, 1118, 1000, 877, 769, 694, 653, 640, 648, 677, 727, 775, 780, + 699, 522, 268, -39, -396, -815, -1292, -1789, -2254, -2653, -2987, -3268, -3493, -3642, -3698, -3667, -3574, -3448, -3306, -3147, -2960, -2747, -2527, -2324, -2151, -2006, -1871, -1719, -1538, -1338, -1139, -951, -769, -590, -407, -214, -5, 212, 433, 657, 882, 1105, 1325, 1546, 1767, 1980, 2180, 2360, 2512, 2627, 2705, 2745, 2750, 2726, 2677, 2603, 2500, 2370, 2217, 2039, 1837, 1626, 1416, 1210, 1009, 823, 655, 497, 348, 217, 111, 28, -31, -65, -86, -105, -119, -129, -150, -181, -200, -196, -183, -163, -128, -87, -59, -40, -19, -6, -7, -1, 22, 38, 47, 73, + 106, 113, 117, 154, 181, 151, 139, 211, 263, 209, 210, 410, 568, 400, 185, 485, 1257, 1808, 1774, 1568, 1649, 1867, 1844, 1592, 1426, 1508, 1757, 2043, 2262, 2358, 2391, 2423, 2234, 1356, -299, -1949, -2487, -1766, -905, -877, -1184, -789, -61, -304, -1022, 446, 5115, 9652 }, + {-119, 1081, 1578, 102, -2617, -5062, -6244, -5545, -2579, 1994, 6391, 9197, 10432, 10724, 10097, 8239, 5468, 2672, 396, -1505, -3359, -5203, -6844, -8114, -8998, -9614, -10098, -10481, -10683, -10636, -10352, -9860, -9169, -8288, -7256, -6121, -4919, -3690, -2479, -1330, -283, 639, 1451, 2188, 2860, 3447, 3926, 4300, 4585, 4808, 5002, 5191, 5375, 5530, 5638, 5695, 5700, 5650, 5548, 5406, 5234, 5041, 4830, 4603, 4363, 4116, 3862, 3603, 3346, 3101, 2871, 2652, 2445, 2258, 2093, 1939, 1795, 1673, 1583, 1518, 1457, 1388, 1309, 1221, 1118, 1000, 877, 769, 694, 653, 640, 648, 677, 727, 775, 780, + 699, 522, 268, -39, -396, -815, -1292, -1789, -2254, -2653, -2987, -3268, -3493, -3642, -3698, -3667, -3574, -3448, -3306, -3147, -2960, -2747, -2527, -2324, -2151, -2006, -1871, -1719, -1538, -1338, -1139, -951, -769, -590, -407, -214, -5, 212, 433, 657, 882, 1105, 1325, 1546, 1767, 1980, 2180, 2360, 2512, 2627, 2705, 2745, 2750, 2726, 2677, 2603, 2500, 2370, 2217, 2039, 1837, 1626, 1416, 1210, 1009, 823, 655, 497, 348, 217, 111, 28, -31, -65, -86, -105, -119, -129, -150, -181, -200, -196, -183, -163, -128, -87, -59, -40, -19, -6, -7, -1, 22, 38, 47, 73, + 106, 113, 117, 154, 181, 151, 139, 211, 263, 209, 210, 410, 568, 400, 185, 485, 1257, 1808, 1774, 1568, 1649, 1867, 1844, 1592, 1426, 1508, 1757, 2043, 2262, 2358, 2391, 2423, 2234, 1356, -299, -1949, -2487, -1766, -905, -877, -1184, -789, -61, -304, -1022, 446, 5115, 9652 } + } +}; +const Word16 CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {-4581, -11759, -14379, -12696, -8766, -4424, -345, 3439, 6770, 9228, 10441, 10312, 8993, 6797, 4109, 1296, -1387, -3807, -5911, -7653, -8972, -9828, -10256, -10360, -10227, -9864, -9250, -8414, -7440, -6408, -5360, -4322, -3325, -2391, -1520, -704, 57, 761, 1416, 2041, 2651, 3255, 3851, 4434, 4997, 5540, 6060, 6556, 7029, 7477, 7897, 8284, 8636, 8954, 9238, 9488, 9709, 9908, 10091, 10260, 10415, 10559, 10693, 10817, 10928, 11028, 11121, 11208, 11287, 11362, 11436, 11510, 11580, 11648, 11716, 11783, 11844, 11899, 11953, 12001, 12036, 12052, 12056, 12053, 12038, 12005, 11955, 11899, 11841, 11775, 11691, 11590, 11484, 11381, 11280, 11176, + 11072, 10978, 10906, 10855, 10815, 10781, 10753, 10736, 10732, 10734, 10729, 10713, 10687, 10654, 10612, 10559, 10493, 10412, 10318, 10215, 10107, 9998, 9888, 9780, 9671, 9563, 9454, 9346, 9236, 9123, 9006, 8888, 8770, 8652, 8539, 8432, 8332, 8236, 8145, 8058, 7973, 7889, 7808, 7732, 7658, 7586, 7515, 7441, 7362, 7278, 7192, 7099, 7002, 6902, 6800, 6694, 6583, 6472, 6359, 6243, 6126, 6012, 5902, 5795, 5695, 5604, 5518, 5436, 5360, 5288, 5213, 5135, 5058, 4983, 4907, 4831, 4760, 4692, 4624, 4558, 4499, 4443, 4388, 4341, 4301, 4261, 4217, 4177, 4137, 4088, 4032, 3977, 3919, 3848, 3773, 3705, + 3631, 3541, 3454, 3380, 3293, 3184, 3087, 3014, 2917, 2781, 2674, 2627, 2554, 2383, 2193, 2097, 2073, 2014, 1882, 1702, 1483, 1295, 1323, 1654, 2052, 2146, 1858, 1504, 1407, 1565, 1769, 1938, 2219, 2710, 3205, 3310, 2851, 2095, 1474, 1149, 959, 760, 603, 527, 406, 152, -76, -73 }, + {-4581, -11759, -14379, -12696, -8766, -4424, -345, 3439, 6770, 9228, 10441, 10312, 8993, 6797, 4109, 1296, -1387, -3807, -5911, -7653, -8972, -9828, -10256, -10360, -10227, -9864, -9250, -8414, -7440, -6408, -5360, -4322, -3325, -2391, -1520, -704, 57, 761, 1416, 2041, 2651, 3255, 3851, 4434, 4997, 5540, 6060, 6556, 7029, 7477, 7897, 8284, 8636, 8954, 9238, 9488, 9709, 9908, 10091, 10260, 10415, 10559, 10693, 10817, 10928, 11028, 11121, 11208, 11287, 11362, 11436, 11510, 11580, 11648, 11716, 11783, 11844, 11899, 11953, 12001, 12036, 12052, 12056, 12053, 12038, 12005, 11955, 11899, 11841, 11775, 11691, 11590, 11484, 11381, 11280, 11176, + 11072, 10978, 10906, 10855, 10815, 10781, 10753, 10736, 10732, 10734, 10729, 10713, 10687, 10654, 10612, 10559, 10493, 10412, 10318, 10215, 10107, 9998, 9888, 9780, 9671, 9563, 9454, 9346, 9236, 9123, 9006, 8888, 8770, 8652, 8539, 8432, 8332, 8236, 8145, 8058, 7973, 7889, 7808, 7732, 7658, 7586, 7515, 7441, 7362, 7278, 7192, 7099, 7002, 6902, 6800, 6694, 6583, 6472, 6359, 6243, 6126, 6012, 5902, 5795, 5695, 5604, 5518, 5436, 5360, 5288, 5213, 5135, 5058, 4983, 4907, 4831, 4760, 4692, 4624, 4558, 4499, 4443, 4388, 4341, 4301, 4261, 4217, 4177, 4137, 4088, 4032, 3977, 3919, 3848, 3773, 3705, + 3631, 3541, 3454, 3380, 3293, 3184, 3087, 3014, 2917, 2781, 2674, 2627, 2554, 2383, 2193, 2097, 2073, 2014, 1882, 1702, 1483, 1295, 1323, 1654, 2052, 2146, 1858, 1504, 1407, 1565, 1769, 1938, 2219, 2710, 3205, 3310, 2851, 2095, 1474, 1149, 959, 760, 603, 527, 406, 152, -76, -73 } + }, + { + {2262, 3816, -971, -10031, -17682, -19237, -14163, -5453, 3335, 10261, 15007, 17799, 18773, 18054, 15918, 12726, 8804, 4476, 122, -3892, -7352, -10247, -12663, -14628, -16093, -17030, -17508, -17647, -17534, -17210, -16709, -16065, -15309, -14461, -13544, -12580, -11576, -10528, -9428, -8275, -7080, -5861, -4640, -3434, -2254, -1103, 12, 1082, 2096, 3048, 3940, 4785, 5598, 6387, 7144, 7860, 8522, 9126, 9669, 10147, 10563, 10927, 11244, 11514, 11738, 11926, 12086, 12216, 12316, 12394, 12461, 12522, 12576, 12634, 12712, 12812, 12924, 13049, 13199, 13377, 13570, 13763, 13963, 14177, 14403, 14623, 14829, 15028, 15229, 15435, 15645, 15858, 16069, 16270, 16457, 16621, + 16750, 16828, 16839, 16780, 16653, 16464, 16217, 15917, 15573, 15199, 14813, 14426, 14049, 13695, 13380, 13115, 12898, 12721, 12570, 12437, 12327, 12247, 12193, 12152, 12107, 12043, 11956, 11849, 11737, 11628, 11522, 11413, 11302, 11191, 11078, 10963, 10847, 10733, 10623, 10521, 10429, 10347, 10270, 10200, 10135, 10078, 10031, 9996, 9973, 9956, 9942, 9927, 9904, 9869, 9828, 9783, 9728, 9660, 9582, 9491, 9379, 9243, 9089, 8920, 8735, 8538, 8336, 8129, 7914, 7694, 7472, 7248, 7024, 6810, 6609, 6411, 6216, 6031, 5846, 5647, 5438, 5229, 5023, 4821, 4636, 4469, 4308, 4150, 4008, 3873, 3729, 3580, 3444, 3312, 3168, 3029, + 2900, 2760, 2609, 2482, 2356, 2182, 2002, 1889, 1761, 1508, 1262, 1192, 1075, 565, -84, -219, 173, 367, 55, -266, -400, -991, -2319, -3459, -3463, -2720, -2363, -2825, -3674, -4397, -4809, -5148, -6101, -7988, -9600, -8891, -5541, -1863, -289, -752, -1472, -1581, -1772, -2690, -3821, -4142, -3171, -1179 }, + {-2262, -3816, 971, 10031, 17682, 19237, 14163, 5453, -3335, -10261, -15007, -17799, -18773, -18054, -15918, -12726, -8804, -4476, -122, 3892, 7352, 10247, 12663, 14628, 16093, 17030, 17508, 17647, 17534, 17210, 16709, 16065, 15309, 14461, 13544, 12580, 11576, 10528, 9428, 8275, 7080, 5861, 4640, 3434, 2254, 1103, -12, -1082, -2096, -3048, -3940, -4785, -5598, -6387, -7144, -7860, -8522, -9126, -9669, -10147, -10563, -10927, -11244, -11514, -11738, -11926, -12086, -12216, -12316, -12394, -12461, -12522, -12576, -12634, -12712, -12812, -12924, -13049, -13199, -13377, -13570, -13763, -13963, -14177, -14403, -14623, -14829, -15028, -15229, -15435, -15645, -15858, -16069, -16270, -16457, -16621, + -16750, -16828, -16839, -16780, -16653, -16464, -16217, -15917, -15573, -15199, -14813, -14426, -14049, -13695, -13380, -13115, -12898, -12721, -12570, -12437, -12327, -12247, -12193, -12152, -12107, -12043, -11956, -11849, -11737, -11628, -11522, -11413, -11302, -11191, -11078, -10963, -10847, -10733, -10623, -10521, -10429, -10347, -10270, -10200, -10135, -10078, -10031, -9996, -9973, -9956, -9942, -9927, -9904, -9869, -9828, -9783, -9728, -9660, -9582, -9491, -9379, -9243, -9089, -8920, -8735, -8538, -8336, -8129, -7914, -7694, -7472, -7248, -7024, -6810, -6609, -6411, -6216, -6031, -5846, -5647, -5438, -5229, -5023, -4821, -4636, -4469, -4308, -4150, -4008, -3873, -3729, -3580, -3444, -3312, -3168, -3029, + -2900, -2760, -2609, -2482, -2356, -2182, -2002, -1889, -1761, -1508, -1262, -1192, -1075, -565, 84, 219, -173, -367, -55, 266, 400, 991, 2319, 3459, 3463, 2720, 2363, 2825, 3674, 4397, 4809, 5148, 6101, 7988, 9600, 8891, 5541, 1863, 289, 752, 1472, 1581, 1772, 2690, 3821, 4142, 3171, 1179 } + }, + { + {-615, -1742, -2171, -1203, 669, 1812, 1264, -227, -1287, -1330, -597, 459, 1359, 1667, 1401, 1069, 1009, 950, 481, -373, -1274, -2021, -2592, -2924, -2918, -2628, -2256, -1956, -1719, -1446, -1068, -615, -182, 153, 360, 431, 356, 158, -80, -271, -377, -400, -344, -207, 3, 271, 581, 934, 1336, 1803, 2344, 2954, 3609, 4288, 4977, 5667, 6338, 6971, 7556, 8090, 8562, 8954, 9255, 9458, 9549, 9506, 9322, 8998, 8536, 7933, 7198, 6350, 5409, 4399, 3361, 2335, 1342, 394, -476, -1230, -1853, -2370, -2796, -3112, -3295, -3371, -3397, -3396, -3337, -3192, -2993, -2795, -2622, -2454, -2278, -2101, + -1940, -1811, -1726, -1689, -1688, -1707, -1742, -1796, -1881, -2008, -2165, -2315, -2421, -2480, -2509, -2517, -2499, -2447, -2350, -2195, -1984, -1728, -1440, -1127, -805, -490, -188, 102, 367, 590, 769, 905, 994, 1037, 1047, 1026, 972, 899, 834, 786, 754, 741, 743, 734, 689, 618, 535, 437, 320, 196, 68, -73, -223, -363, -492, -619, -738, -837, -930, -1033, -1135, -1231, -1334, -1448, -1554, -1648, -1751, -1860, -1953, -2032, -2112, -2178, -2213, -2243, -2291, -2339, -2377, -2438, -2535, -2642, -2762, -2926, -3110, -3266, -3410, -3575, -3719, -3800, -3866, -3945, -3977, -3940, -3909, -3892, -3811, -3698, + -3645, -3579, -3398, -3246, -3247, -3157, -2816, -2598, -2729, -2645, -2007, -1666, -2249, -2466, -773, 1722, 2319, 637, -966, -1149, -1110, -1643, -1372, 628, 2678, 2721, 1182, -18, -197, -212, -772, -1615, -1928, -1014, 935, 2430, 1941, -132, -1675, -1433, -356, 98, -84, 1, 532, 871, 678, 231 }, + {-615, -1742, -2171, -1203, 669, 1812, 1264, -227, -1287, -1330, -597, 459, 1359, 1667, 1401, 1069, 1009, 950, 481, -373, -1274, -2021, -2592, -2924, -2918, -2628, -2256, -1956, -1719, -1446, -1068, -615, -182, 153, 360, 431, 356, 158, -80, -271, -377, -400, -344, -207, 3, 271, 581, 934, 1336, 1803, 2344, 2954, 3609, 4288, 4977, 5667, 6338, 6971, 7556, 8090, 8562, 8954, 9255, 9458, 9549, 9506, 9322, 8998, 8536, 7933, 7198, 6350, 5409, 4399, 3361, 2335, 1342, 394, -476, -1230, -1853, -2370, -2796, -3112, -3295, -3371, -3397, -3396, -3337, -3192, -2993, -2795, -2622, -2454, -2278, -2101, + -1940, -1811, -1726, -1689, -1688, -1707, -1742, -1796, -1881, -2008, -2165, -2315, -2421, -2480, -2509, -2517, -2499, -2447, -2350, -2195, -1984, -1728, -1440, -1127, -805, -490, -188, 102, 367, 590, 769, 905, 994, 1037, 1047, 1026, 972, 899, 834, 786, 754, 741, 743, 734, 689, 618, 535, 437, 320, 196, 68, -73, -223, -363, -492, -619, -738, -837, -930, -1033, -1135, -1231, -1334, -1448, -1554, -1648, -1751, -1860, -1953, -2032, -2112, -2178, -2213, -2243, -2291, -2339, -2377, -2438, -2535, -2642, -2762, -2926, -3110, -3266, -3410, -3575, -3719, -3800, -3866, -3945, -3977, -3940, -3909, -3892, -3811, -3698, + -3645, -3579, -3398, -3246, -3247, -3157, -2816, -2598, -2729, -2645, -2007, -1666, -2249, -2466, -773, 1722, 2319, 637, -966, -1149, -1110, -1643, -1372, 628, 2678, 2721, 1182, -18, -197, -212, -772, -1615, -1928, -1014, 935, 2430, 1941, -132, -1675, -1433, -356, 98, -84, 1, 532, 871, 678, 231 } + }, + { + {-18, -481, -1443, -1878, -1123, 60, 390, -376, -1261, -1266, -289, 1045, 2095, 2632, 2823, 2939, 3042, 2924, 2358, 1341, 69, -1256, -2493, -3541, -4373, -5083, -5791, -6486, -7038, -7353, -7445, -7337, -6989, -6364, -5499, -4478, -3358, -2170, -966, 181, 1219, 2135, 2936, 3626, 4214, 4712, 5141, 5516, 5833, 6075, 6226, 6284, 6262, 6189, 6110, 6061, 6052, 6068, 6092, 6114, 6123, 6105, 6063, 6010, 5946, 5871, 5793, 5719, 5636, 5524, 5383, 5221, 5029, 4784, 4482, 4143, 3771, 3355, 2898, 2435, 1993, 1569, 1156, 775, 459, 214, 9, -179, -344, -481, -599, -702, -771, -785, -749, -672, + -544, -343, -68, 260, 622, 1021, 1467, 1964, 2487, 2996, 3466, 3906, 4342, 4777, 5186, 5535, 5811, 6029, 6225, 6425, 6623, 6782, 6878, 6918, 6931, 6947, 6990, 7062, 7142, 7209, 7263, 7316, 7378, 7449, 7530, 7611, 7673, 7704, 7703, 7670, 7604, 7509, 7392, 7248, 7070, 6864, 6635, 6384, 6119, 5854, 5598, 5355, 5131, 4936, 4770, 4627, 4514, 4433, 4378, 4343, 4334, 4347, 4365, 4376, 4385, 4386, 4367, 4331, 4295, 4260, 4225, 4196, 4173, 4136, 4076, 4006, 3927, 3822, 3691, 3553, 3397, 3204, 2988, 2771, 2543, 2294, 2059, 1858, 1664, 1471, 1321, 1212, 1099, 994, 939, 894, + 817, 775, 806, 789, 688, 698, 853, 854, 653, 704, 1086, 1077, 462, 433, 1901, 3623, 3659, 2232, 1240, 1244, 1074, 497, 893, 2603, 3817, 3185, 1750, 1099, 1113, 786, 2, -809, -1686, -2530, -2391, -708, 1344, 2052, 1361, 724, 940, 1310, 1079, 674, 944, 1745, 1960, 877 }, + {-18, -481, -1443, -1878, -1123, 60, 390, -376, -1261, -1266, -289, 1045, 2095, 2632, 2823, 2939, 3042, 2924, 2358, 1341, 69, -1256, -2493, -3541, -4373, -5083, -5791, -6486, -7038, -7353, -7445, -7337, -6989, -6364, -5499, -4478, -3358, -2170, -966, 181, 1219, 2135, 2936, 3626, 4214, 4712, 5141, 5516, 5833, 6075, 6226, 6284, 6262, 6189, 6110, 6061, 6052, 6068, 6092, 6114, 6123, 6105, 6063, 6010, 5946, 5871, 5793, 5719, 5636, 5524, 5383, 5221, 5029, 4784, 4482, 4143, 3771, 3355, 2898, 2435, 1993, 1569, 1156, 775, 459, 214, 9, -179, -344, -481, -599, -702, -771, -785, -749, -672, + -544, -343, -68, 260, 622, 1021, 1467, 1964, 2487, 2996, 3466, 3906, 4342, 4777, 5186, 5535, 5811, 6029, 6225, 6425, 6623, 6782, 6878, 6918, 6931, 6947, 6990, 7062, 7142, 7209, 7263, 7316, 7378, 7449, 7530, 7611, 7673, 7704, 7703, 7670, 7604, 7509, 7392, 7248, 7070, 6864, 6635, 6384, 6119, 5854, 5598, 5355, 5131, 4936, 4770, 4627, 4514, 4433, 4378, 4343, 4334, 4347, 4365, 4376, 4385, 4386, 4367, 4331, 4295, 4260, 4225, 4196, 4173, 4136, 4076, 4006, 3927, 3822, 3691, 3553, 3397, 3204, 2988, 2771, 2543, 2294, 2059, 1858, 1664, 1471, 1321, 1212, 1099, 994, 939, 894, + 817, 775, 806, 789, 688, 698, 853, 854, 653, 704, 1086, 1077, 462, 433, 1901, 3623, 3659, 2232, 1240, 1244, 1074, 497, 893, 2603, 3817, 3185, 1750, 1099, 1113, 786, 2, -809, -1686, -2530, -2391, -708, 1344, 2052, 1361, 724, 940, 1310, 1079, 674, 944, 1745, 1960, 877 } + }, + { + {-62, -58, 88, 70, -269, -647, -770, -836, -1277, -1998, -2215, -1284, 517, 2273, 3368, 3906, 4248, 4471, 4412, 3995, 3295, 2361, 1191, -151, -1518, -2817, -4052, -5222, -6259, -7094, -7712, -8114, -8288, -8223, -7923, -7371, -6549, -5504, -4361, -3250, -2238, -1340, -550, 149, 781, 1362, 1898, 2397, 2856, 3264, 3603, 3866, 4058, 4183, 4261, 4325, 4400, 4491, 4593, 4708, 4834, 4962, 5087, 5208, 5322, 5419, 5498, 5560, 5597, 5593, 5546, 5466, 5340, 5146, 4879, 4551, 4169, 3719, 3205, 2664, 2134, 1612, 1080, 550, 63, -370, -778, -1183, -1558, -1865, -2102, -2290, -2430, -2499, -2489, -2420, + -2318, -2196, -2057, -1903, -1742, -1585, -1438, -1297, -1161, -1035, -924, -810, -669, -497, -312, -136, 22, 171, 332, 526, 749, 970, 1165, 1328, 1472, 1616, 1778, 1968, 2177, 2391, 2607, 2827, 3051, 3278, 3507, 3726, 3917, 4068, 4180, 4251, 4282, 4284, 4264, 4223, 4158, 4080, 3998, 3917, 3846, 3797, 3775, 3773, 3790, 3830, 3891, 3967, 4062, 4178, 4307, 4443, 4589, 4736, 4867, 4971, 5053, 5112, 5137, 5135, 5119, 5090, 5044, 4994, 4950, 4900, 4840, 4783, 4731, 4667, 4590, 4508, 4411, 4282, 4137, 3998, 3850, 3684, 3530, 3402, 3268, 3123, 3001, 2900, 2785, 2672, 2600, 2529, + 2425, 2358, 2357, 2300, 2163, 2135, 2229, 2152, 1884, 1874, 2158, 2027, 1339, 1309, 2782, 4477, 4492, 3036, 1939, 1807, 1647, 1229, 1652, 3094, 4026, 3438, 2234, 1614, 1462, 1116, 494, -239, -956, -965, 599, 3098, 4409, 3466, 1671, 891, 1115, 1146, 644, 196, -17, -326, -593, -320 }, + {62, 58, -88, -70, 269, 647, 770, 836, 1277, 1998, 2215, 1284, -517, -2273, -3368, -3906, -4248, -4471, -4412, -3995, -3295, -2361, -1191, 151, 1518, 2817, 4052, 5222, 6259, 7094, 7712, 8114, 8288, 8223, 7923, 7371, 6549, 5504, 4361, 3250, 2238, 1340, 550, -149, -781, -1362, -1898, -2397, -2856, -3264, -3603, -3866, -4058, -4183, -4261, -4325, -4400, -4491, -4593, -4708, -4834, -4962, -5087, -5208, -5322, -5419, -5498, -5560, -5597, -5593, -5546, -5466, -5340, -5146, -4879, -4551, -4169, -3719, -3205, -2664, -2134, -1612, -1080, -550, -63, 370, 778, 1183, 1558, 1865, 2102, 2290, 2430, 2499, 2489, 2420, + 2318, 2196, 2057, 1903, 1742, 1585, 1438, 1297, 1161, 1035, 924, 810, 669, 497, 312, 136, -22, -171, -332, -526, -749, -970, -1165, -1328, -1472, -1616, -1778, -1968, -2177, -2391, -2607, -2827, -3051, -3278, -3507, -3726, -3917, -4068, -4180, -4251, -4282, -4284, -4264, -4223, -4158, -4080, -3998, -3917, -3846, -3797, -3775, -3773, -3790, -3830, -3891, -3967, -4062, -4178, -4307, -4443, -4589, -4736, -4867, -4971, -5053, -5112, -5137, -5135, -5119, -5090, -5044, -4994, -4950, -4900, -4840, -4783, -4731, -4667, -4590, -4508, -4411, -4282, -4137, -3998, -3850, -3684, -3530, -3402, -3268, -3123, -3001, -2900, -2785, -2672, -2600, -2529, + -2425, -2358, -2357, -2300, -2163, -2135, -2229, -2152, -1884, -1874, -2158, -2027, -1339, -1309, -2782, -4477, -4492, -3036, -1939, -1807, -1647, -1229, -1652, -3094, -4026, -3438, -2234, -1614, -1462, -1116, -494, 239, 956, 965, -599, -3098, -4409, -3466, -1671, -891, -1115, -1146, -644, -196, 17, 326, 593, 320 } + }, + { + {-112, -2, 317, 75, -351, 273, 1555, 1290, -1331, -3991, -3943, -1307, 1527, 2919, 3133, 3037, 2925, 2676, 2201, 1485, 574, -350, -1091, -1586, -1855, -1892, -1741, -1531, -1348, -1164, -983, -901, -977, -1147, -1320, -1494, -1721, -2039, -2432, -2829, -3137, -3307, -3360, -3333, -3246, -3128, -3016, -2911, -2779, -2594, -2351, -2038, -1644, -1170, -616, 22, 731, 1467, 2197, 2911, 3594, 4206, 4729, 5170, 5519, 5744, 5825, 5765, 5564, 5209, 4702, 4063, 3306, 2453, 1541, 612, -314, -1221, -2075, -2837, -3494, -4058, -4537, -4916, -5168, -5292, -5323, -5291, -5188, -4994, -4713, -4369, -3965, -3494, -2968, -2405, + -1805, -1166, -511, 123, 721, 1279, 1790, 2231, 2569, 2771, 2836, 2817, 2774, 2716, 2610, 2435, 2209, 1966, 1745, 1573, 1448, 1345, 1253, 1186, 1154, 1152, 1176, 1222, 1271, 1298, 1301, 1282, 1230, 1136, 1012, 868, 706, 532, 368, 221, 83, -39, -136, -222, -315, -407, -486, -562, -644, -719, -780, -840, -897, -931, -947, -962, -972, -962, -944, -934, -917, -882, -849, -832, -813, -790, -786, -803, -816, -825, -849, -877, -888, -902, -945, -997, -1044, -1113, -1223, -1343, -1471, -1636, -1824, -1983, -2123, -2282, -2428, -2512, -2575, -2657, -2707, -2692, -2679, -2688, -2646, -2562, + -2528, -2501, -2370, -2239, -2246, -2210, -1947, -1745, -1859, -1853, -1351, -992, -1412, -1659, -353, 1746, 2298, 744, -926, -1284, -1221, -1689, -1761, -390, 1412, 1771, 460, -1119, -1918, -2190, -2697, -3568, -3873, -2406, 617, 2982, 2599, 114, -1743, -1472, -259, 153, -272, -455, -40, 376, 376, 135 }, + {112, 2, -317, -75, 351, -273, -1555, -1290, 1331, 3991, 3943, 1307, -1527, -2919, -3133, -3037, -2925, -2676, -2201, -1485, -574, 350, 1091, 1586, 1855, 1892, 1741, 1531, 1348, 1164, 983, 901, 977, 1147, 1320, 1494, 1721, 2039, 2432, 2829, 3137, 3307, 3360, 3333, 3246, 3128, 3016, 2911, 2779, 2594, 2351, 2038, 1644, 1170, 616, -22, -731, -1467, -2197, -2911, -3594, -4206, -4729, -5170, -5519, -5744, -5825, -5765, -5564, -5209, -4702, -4063, -3306, -2453, -1541, -612, 314, 1221, 2075, 2837, 3494, 4058, 4537, 4916, 5168, 5292, 5323, 5291, 5188, 4994, 4713, 4369, 3965, 3494, 2968, 2405, + 1805, 1166, 511, -123, -721, -1279, -1790, -2231, -2569, -2771, -2836, -2817, -2774, -2716, -2610, -2435, -2209, -1966, -1745, -1573, -1448, -1345, -1253, -1186, -1154, -1152, -1176, -1222, -1271, -1298, -1301, -1282, -1230, -1136, -1012, -868, -706, -532, -368, -221, -83, 39, 136, 222, 315, 407, 486, 562, 644, 719, 780, 840, 897, 931, 947, 962, 972, 962, 944, 934, 917, 882, 849, 832, 813, 790, 786, 803, 816, 825, 849, 877, 888, 902, 945, 997, 1044, 1113, 1223, 1343, 1471, 1636, 1824, 1983, 2123, 2282, 2428, 2512, 2575, 2657, 2707, 2692, 2679, 2688, 2646, 2562, + 2528, 2501, 2370, 2239, 2246, 2210, 1947, 1745, 1859, 1853, 1351, 992, 1412, 1659, 353, -1746, -2298, -744, 926, 1284, 1221, 1689, 1761, 390, -1412, -1771, -460, 1119, 1918, 2190, 2697, 3568, 3873, 2406, -617, -2982, -2599, -114, 1743, 1472, 259, -153, 272, 455, 40, -376, -376, -135 } + }, + { + {-23, -198, -434, -331, 160, 646, 1086, 2024, 3603, 4817, 4362, 2093, -840, -3220, -4665, -5373, -5525, -5209, -4611, -3942, -3260, -2520, -1721, -918, -137, 585, 1131, 1398, 1433, 1429, 1548, 1808, 2130, 2444, 2733, 2999, 3235, 3426, 3564, 3641, 3631, 3516, 3318, 3089, 2869, 2663, 2453, 2228, 1991, 1744, 1490, 1233, 976, 724, 488, 288, 140, 55, 32, 65, 147, 272, 440, 644, 880, 1141, 1427, 1734, 2052, 2364, 2655, 2920, 3158, 3356, 3494, 3560, 3553, 3468, 3288, 3002, 2617, 2147, 1599, 971, 273, -471, -1241, -2021, -2801, -3576, -4343, -5088, -5780, -6370, -6831, -7165, + -7393, -7518, -7518, -7368, -7081, -6711, -6325, -5960, -5619, -5287, -4969, -4696, -4506, -4418, -4430, -4526, -4684, -4885, -5116, -5373, -5656, -5956, -6257, -6537, -6778, -6972, -7123, -7242, -7334, -7404, -7453, -7483, -7501, -7512, -7516, -7506, -7474, -7422, -7360, -7293, -7220, -7140, -7045, -6921, -6754, -6543, -6292, -6008, -5695, -5362, -5016, -4670, -4333, -4015, -3720, -3447, -3200, -2977, -2774, -2586, -2413, -2256, -2109, -1971, -1840, -1714, -1588, -1461, -1337, -1219, -1110, -1012, -922, -828, -725, -617, -502, -376, -239, -100, 39, 182, 322, 453, 578, 699, 804, 888, 958, 1014, 1043, 1045, 1040, 1029, 1001, 966, + 937, 902, 850, 807, 777, 711, 603, 525, 478, 352, 151, 49, 42, -153, -596, -865, -677, -399, -446, -568, -406, -371, -1063, -2052, -2255, -1509, -776, -688, -892, -948, -881, -673, -255, -216, -1319, -2996, -3563, -2464, -1032, -438, -249, 195, 510, 565, 1466, 3513, 4472, 2122 }, + {-23, -198, -434, -331, 160, 646, 1086, 2024, 3603, 4817, 4362, 2093, -840, -3220, -4665, -5373, -5525, -5209, -4611, -3942, -3260, -2520, -1721, -918, -137, 585, 1131, 1398, 1433, 1429, 1548, 1808, 2130, 2444, 2733, 2999, 3235, 3426, 3564, 3641, 3631, 3516, 3318, 3089, 2869, 2663, 2453, 2228, 1991, 1744, 1490, 1233, 976, 724, 488, 288, 140, 55, 32, 65, 147, 272, 440, 644, 880, 1141, 1427, 1734, 2052, 2364, 2655, 2920, 3158, 3356, 3494, 3560, 3553, 3468, 3288, 3002, 2617, 2147, 1599, 971, 273, -471, -1241, -2021, -2801, -3576, -4343, -5088, -5780, -6370, -6831, -7165, + -7393, -7518, -7518, -7368, -7081, -6711, -6325, -5960, -5619, -5287, -4969, -4696, -4506, -4418, -4430, -4526, -4684, -4885, -5116, -5373, -5656, -5956, -6257, -6537, -6778, -6972, -7123, -7242, -7334, -7404, -7453, -7483, -7501, -7512, -7516, -7506, -7474, -7422, -7360, -7293, -7220, -7140, -7045, -6921, -6754, -6543, -6292, -6008, -5695, -5362, -5016, -4670, -4333, -4015, -3720, -3447, -3200, -2977, -2774, -2586, -2413, -2256, -2109, -1971, -1840, -1714, -1588, -1461, -1337, -1219, -1110, -1012, -922, -828, -725, -617, -502, -376, -239, -100, 39, 182, 322, 453, 578, 699, 804, 888, 958, 1014, 1043, 1045, 1040, 1029, 1001, 966, + 937, 902, 850, 807, 777, 711, 603, 525, 478, 352, 151, 49, 42, -153, -596, -865, -677, -399, -446, -568, -406, -371, -1063, -2052, -2255, -1509, -776, -688, -892, -948, -881, -673, -255, -216, -1319, -2996, -3563, -2464, -1032, -438, -249, 195, 510, 565, 1466, 3513, 4472, 2122 } + }, + { + {-623, -1227, -405, 1433, 2811, 2272, -219, -2901, -3686, -2187, 13, 1207, 1198, 849, 697, 660, 690, 916, 1177, 1079, 623, 271, 305, 503, 551, 430, 258, 29, -326, -779, -1219, -1552, -1749, -1855, -1975, -2175, -2414, -2593, -2650, -2568, -2347, -2023, -1658, -1295, -938, -591, -276, -3, 243, 466, 662, 840, 1016, 1190, 1354, 1511, 1668, 1810, 1919, 1990, 2027, 2034, 2013, 1975, 1934, 1912, 1920, 1957, 2013, 2097, 2228, 2404, 2602, 2819, 3071, 3358, 3655, 3934, 4185, 4396, 4553, 4635, 4626, 4518, 4323, 4052, 3691, 3229, 2698, 2155, 1607, 992, 266, -539, -1355, -2153, + -2951, -3763, -4560, -5292, -5930, -6487, -6992, -7435, -7770, -7963, -8032, -8020, -7958, -7843, -7646, -7337, -6917, -6426, -5910, -5383, -4841, -4284, -3723, -3170, -2644, -2156, -1701, -1267, -852, -462, -92, 270, 634, 1001, 1365, 1700, 1977, 2196, 2384, 2562, 2735, 2907, 3072, 3205, 3285, 3320, 3338, 3351, 3360, 3374, 3394, 3399, 3374, 3331, 3286, 3245, 3214, 3203, 3211, 3219, 3220, 3213, 3193, 3160, 3132, 3114, 3094, 3068, 3046, 3020, 2967, 2888, 2808, 2731, 2647, 2564, 2501, 2449, 2395, 2353, 2333, 2316, 2297, 2302, 2330, 2351, 2361, 2391, 2429, 2438, 2432, 2443, 2445, 2410, 2377, 2369, + 2329, 2246, 2202, 2197, 2115, 1970, 1931, 1970, 1851, 1609, 1598, 1808, 1698, 1110, 761, 1201, 1833, 1732, 1024, 580, 563, 291, -445, -867, -400, 372, 461, -227, -907, -1083, -1132, -1550, -2010, -1642, -237, 1234, 1625, 912, 148, 157, 668, 892, 622, 443, 877, 1606, 1727, 757 }, + {-623, -1227, -405, 1433, 2811, 2272, -219, -2901, -3686, -2187, 13, 1207, 1198, 849, 697, 660, 690, 916, 1177, 1079, 623, 271, 305, 503, 551, 430, 258, 29, -326, -779, -1219, -1552, -1749, -1855, -1975, -2175, -2414, -2593, -2650, -2568, -2347, -2023, -1658, -1295, -938, -591, -276, -3, 243, 466, 662, 840, 1016, 1190, 1354, 1511, 1668, 1810, 1919, 1990, 2027, 2034, 2013, 1975, 1934, 1912, 1920, 1957, 2013, 2097, 2228, 2404, 2602, 2819, 3071, 3358, 3655, 3934, 4185, 4396, 4553, 4635, 4626, 4518, 4323, 4052, 3691, 3229, 2698, 2155, 1607, 992, 266, -539, -1355, -2153, + -2951, -3763, -4560, -5292, -5930, -6487, -6992, -7435, -7770, -7963, -8032, -8020, -7958, -7843, -7646, -7337, -6917, -6426, -5910, -5383, -4841, -4284, -3723, -3170, -2644, -2156, -1701, -1267, -852, -462, -92, 270, 634, 1001, 1365, 1700, 1977, 2196, 2384, 2562, 2735, 2907, 3072, 3205, 3285, 3320, 3338, 3351, 3360, 3374, 3394, 3399, 3374, 3331, 3286, 3245, 3214, 3203, 3211, 3219, 3220, 3213, 3193, 3160, 3132, 3114, 3094, 3068, 3046, 3020, 2967, 2888, 2808, 2731, 2647, 2564, 2501, 2449, 2395, 2353, 2333, 2316, 2297, 2302, 2330, 2351, 2361, 2391, 2429, 2438, 2432, 2443, 2445, 2410, 2377, 2369, + 2329, 2246, 2202, 2197, 2115, 1970, 1931, 1970, 1851, 1609, 1598, 1808, 1698, 1110, 761, 1201, 1833, 1732, 1024, 580, 563, 291, -445, -867, -400, 372, 461, -227, -907, -1083, -1132, -1550, -2010, -1642, -237, 1234, 1625, 912, 148, 157, 668, 892, 622, 443, 877, 1606, 1727, 757 } + }, + { + {450, 355, -1354, -3145, -3311, -1542, 1589, 5351, 8552, 9667, 8152, 5030, 1635, -1671, -5034, -8058, -9984, -10643, -10599, -10386, -10043, -9363, -8277, -6918, -5487, -4114, -2788, -1410, 59, 1560, 3015, 4393, 5673, 6812, 7768, 8526, 9080, 9422, 9558, 9504, 9292, 8975, 8603, 8193, 7726, 7199, 6635, 6069, 5528, 5027, 4569, 4129, 3678, 3202, 2709, 2212, 1719, 1239, 786, 367, -13, -358, -671, -953, -1201, -1416, -1602, -1755, -1871, -1954, -2015, -2056, -2076, -2077, -2070, -2059, -2037, -2000, -1963, -1946, -1953, -1976, -2005, -2038, -2069, -2087, -2077, -2039, -1985, -1936, -1903, -1893, -1911, -1974, -2106, -2315, + -2572, -2829, -3050, -3232, -3377, -3471, -3480, -3372, -3149, -2846, -2496, -2111, -1683, -1218, -744, -296, 105, 455, 768, 1058, 1323, 1547, 1719, 1846, 1950, 2053, 2175, 2313, 2444, 2548, 2624, 2683, 2736, 2786, 2836, 2883, 2918, 2933, 2929, 2908, 2866, 2805, 2726, 2629, 2506, 2353, 2172, 1960, 1721, 1462, 1195, 924, 657, 401, 154, -86, -316, -527, -718, -888, -1026, -1123, -1187, -1222, -1228, -1205, -1166, -1115, -1045, -954, -851, -743, -633, -531, -446, -371, -302, -244, -193, -129, -48, 33, 105, 173, 234, 272, 297, 323, 348, 363, 389, 430, 466, 490, 525, 565, + 583, 595, 636, 676, 673, 689, 779, 855, 843, 872, 1050, 1174, 1050, 951, 1291, 1861, 1982, 1481, 943, 828, 884, 694, 342, 185, 302, 472, 507, 359, 53, -332, -729, -1257, -2098, -3049, -3356, -2402, -625, 689, 859, 669, 1167, 1991, 2064, 1859, 3213, 6026, 6924, 3156 }, + {450, 355, -1354, -3145, -3311, -1542, 1589, 5351, 8552, 9667, 8152, 5030, 1635, -1671, -5034, -8058, -9984, -10643, -10599, -10386, -10043, -9363, -8277, -6918, -5487, -4114, -2788, -1410, 59, 1560, 3015, 4393, 5673, 6812, 7768, 8526, 9080, 9422, 9558, 9504, 9292, 8975, 8603, 8193, 7726, 7199, 6635, 6069, 5528, 5027, 4569, 4129, 3678, 3202, 2709, 2212, 1719, 1239, 786, 367, -13, -358, -671, -953, -1201, -1416, -1602, -1755, -1871, -1954, -2015, -2056, -2076, -2077, -2070, -2059, -2037, -2000, -1963, -1946, -1953, -1976, -2005, -2038, -2069, -2087, -2077, -2039, -1985, -1936, -1903, -1893, -1911, -1974, -2106, -2315, + -2572, -2829, -3050, -3232, -3377, -3471, -3480, -3372, -3149, -2846, -2496, -2111, -1683, -1218, -744, -296, 105, 455, 768, 1058, 1323, 1547, 1719, 1846, 1950, 2053, 2175, 2313, 2444, 2548, 2624, 2683, 2736, 2786, 2836, 2883, 2918, 2933, 2929, 2908, 2866, 2805, 2726, 2629, 2506, 2353, 2172, 1960, 1721, 1462, 1195, 924, 657, 401, 154, -86, -316, -527, -718, -888, -1026, -1123, -1187, -1222, -1228, -1205, -1166, -1115, -1045, -954, -851, -743, -633, -531, -446, -371, -302, -244, -193, -129, -48, 33, 105, 173, 234, 272, 297, 323, 348, 363, 389, 430, 466, 490, 525, 565, + 583, 595, 636, 676, 673, 689, 779, 855, 843, 872, 1050, 1174, 1050, 951, 1291, 1861, 1982, 1481, 943, 828, 884, 694, 342, 185, 302, 472, 507, 359, 53, -332, -729, -1257, -2098, -3049, -3356, -2402, -625, 689, 859, 669, 1167, 1991, 2064, 1859, 3213, 6026, 6924, 3156 } + } +}; +const Word16 *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 32000 */ + +const Word16 CRendBin_HOA2_HRIR_max_num_iterations_32kHz = 1; +const Word16 CRendBin_HOA2_HRIR_num_iterations_32kHz[HOA2_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const Word16 CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const Word16 CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const Word16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz = 0; +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_Q_32kHz_fx = 0; +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0}}; +const Word16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_HOA2_HRIR_coeff_Q_32kHz_fx = 14; +const Word16 CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {14867, 9627, 1943, -4863, -9124, -11050, -11449, -10700, -8798, -5849, -2267, 1398, 4655, 7159, 8747, 9436, 9371, 8722, 7617, 6145, 4399, 2517, 648, -1120, -2791, -4386, -5868, -7157, -8209, -9037, -9674, -10139, -10452, -10649, -10765, -10815, -10812, -10770, -10711, -10644, -10567, -10470, -10344, -10185, -9994, -9775, -9529, -9259, -8967, -8652, -8314, -7958, -7589, -7213, -6835, -6459, -6092, -5738, -5395, -5059, -4731, -4411, -4097, -3785, -3479, -3181, -2891, -2606, -2328, -2057, -1793, -1529, -1265, -1004, -742, -475, -204, 68, 343, 629, 923, 1218, 1507, 1794, 2084, 2371, 2645, 2906, 3160, 3415, 3664, 3896, 4104, 4295, 4476, 4647, + 4798, 4927, 5045, 5164, 5290, 5423, 5556, 5693, 5841, 6007, 6193, 6389, 6590, 6795, 7006, 7221, 7438, 7653, 7859, 8054, 8239, 8414, 8582, 8744, 8902, 9057, 9210, 9362, 9514, 9666, 9815, 9960, 10103, 10241, 10376, 10509, 10646, 10787, 10932, 11082, 11239, 11399, 11563, 11730, 11905, 12085, 12271, 12463, 12657, 12849, 13039, 13223, 13400, 13565, 13720, 13863, 13991, 14102, 14197, 14278, 14343, 14391, 14424, 14441 }, + {14867, 9627, 1943, -4863, -9124, -11050, -11449, -10700, -8798, -5849, -2267, 1398, 4655, 7159, 8747, 9436, 9371, 8722, 7617, 6145, 4399, 2517, 648, -1120, -2791, -4386, -5868, -7157, -8209, -9037, -9674, -10139, -10452, -10649, -10765, -10815, -10812, -10770, -10711, -10644, -10567, -10470, -10344, -10185, -9994, -9775, -9529, -9259, -8967, -8652, -8314, -7958, -7589, -7213, -6835, -6459, -6092, -5738, -5395, -5059, -4731, -4411, -4097, -3785, -3479, -3181, -2891, -2606, -2328, -2057, -1793, -1529, -1265, -1004, -742, -475, -204, 68, 343, 629, 923, 1218, 1507, 1794, 2084, 2371, 2645, 2906, 3160, 3415, 3664, 3896, 4104, 4295, 4476, 4647, + 4798, 4927, 5045, 5164, 5290, 5423, 5556, 5693, 5841, 6007, 6193, 6389, 6590, 6795, 7006, 7221, 7438, 7653, 7859, 8054, 8239, 8414, 8582, 8744, 8902, 9057, 9210, 9362, 9514, 9666, 9815, 9960, 10103, 10241, 10376, 10509, 10646, 10787, 10932, 11082, 11239, 11399, 11563, 11730, 11905, 12085, 12271, 12463, 12657, 12849, 13039, 13223, 13400, 13565, 13720, 13863, 13991, 14102, 14197, 14278, 14343, 14391, 14424, 14441 } + }, + { + {609, 5800, 11264, 11378, 4434, -6342, -15767, -20507, -20418, -17172, -12353, -6809, -1025, 4512, 9369, 13284, 16117, 17769, 18227, 17652, 16349, 14604, 12565, 10269, 7780, 5239, 2795, 512, -1613, -3590, -5413, -7081, -8603, -9985, -11229, -12352, -13373, -14304, -15141, -15876, -16495, -16988, -17356, -17610, -17762, -17819, -17787, -17672, -17482, -17236, -16952, -16644, -16311, -15942, -15528, -15068, -14568, -14036, -13481, -12914, -12348, -11790, -11242, -10704, -10185, -9690, -9219, -8766, -8339, -7946, -7588, -7257, -6957, -6692, -6455, -6229, -6009, -5800, -5601, -5393, -5166, -4925, -4680, -4424, -4143, -3836, -3515, -3189, -2858, -2515, -2154, -1767, -1349, -896, -408, 117, + 683, 1287, 1915, 2547, 3168, 3767, 4334, 4858, 5326, 5731, 6071, 6349, 6567, 6726, 6836, 6913, 6979, 7049, 7127, 7207, 7287, 7374, 7482, 7622, 7795, 7991, 8194, 8391, 8578, 8759, 8942, 9130, 9319, 9509, 9702, 9897, 10092, 10286, 10478, 10672, 10870, 11076, 11292, 11518, 11752, 11991, 12239, 12497, 12767, 13050, 13349, 13660, 13977, 14292, 14600, 14899, 15184, 15450, 15693, 15909, 16093, 16238, 16336, 16385 }, + {-609, -5800, -11264, -11378, -4434, 6342, 15767, 20507, 20418, 17172, 12353, 6809, 1025, -4512, -9369, -13284, -16117, -17769, -18227, -17652, -16349, -14604, -12565, -10269, -7780, -5239, -2795, -512, 1613, 3590, 5413, 7081, 8603, 9985, 11229, 12352, 13373, 14304, 15141, 15876, 16495, 16988, 17356, 17610, 17762, 17819, 17787, 17672, 17482, 17236, 16952, 16644, 16311, 15942, 15528, 15068, 14568, 14036, 13481, 12914, 12348, 11790, 11242, 10704, 10185, 9690, 9219, 8766, 8339, 7946, 7588, 7257, 6957, 6692, 6455, 6229, 6009, 5800, 5601, 5393, 5166, 4925, 4680, 4424, 4143, 3836, 3515, 3189, 2858, 2515, 2154, 1767, 1349, 896, 408, -117, + -683, -1287, -1915, -2547, -3168, -3767, -4334, -4858, -5326, -5731, -6071, -6349, -6567, -6726, -6836, -6913, -6979, -7049, -7127, -7207, -7287, -7374, -7482, -7622, -7795, -7991, -8194, -8391, -8578, -8759, -8942, -9130, -9319, -9509, -9702, -9897, -10092, -10286, -10478, -10672, -10870, -11076, -11292, -11518, -11752, -11991, -12239, -12497, -12767, -13050, -13349, -13660, -13977, -14292, -14600, -14899, -15184, -15450, -15693, -15909, -16093, -16238, -16336, -16385 } + }, + { + {2055, 1324, -196, -1696, -1828, -381, 1247, 1644, 786, -424, -1257, -1422, -888, 19, 718, 977, 1166, 1658, 2280, 2598, 2473, 2049, 1427, 632, -201, -860, -1266, -1521, -1768, -2044, -2283, -2388, -2327, -2140, -1890, -1621, -1387, -1266, -1308, -1491, -1758, -2068, -2405, -2749, -3075, -3375, -3651, -3908, -4152, -4375, -4554, -4658, -4671, -4591, -4416, -4142, -3766, -3294, -2739, -2103, -1386, -592, 267, 1182, 2147, 3147, 4154, 5142, 6094, 6985, 7787, 8473, 9023, 9415, 9637, 9697, 9611, 9386, 9021, 8541, 8001, 7433, 6834, 6200, 5573, 5006, 4505, 4030, 3564, 3144, 2813, 2569, 2373, 2202, 2065, 1976, + 1936, 1938, 1966, 2001, 2026, 2036, 2040, 2044, 2043, 2013, 1926, 1770, 1565, 1341, 1115, 881, 631, 364, 89, -181, -428, -635, -794, -898, -946, -941, -889, -791, -648, -465, -257, -34, 192, 412, 619, 807, 970, 1094, 1180, 1245, 1302, 1365, 1448, 1558, 1682, 1796, 1892, 1978, 2052, 2106, 2141, 2164, 2169, 2155, 2129, 2106, 2084, 2064, 2053, 2053, 2054, 2052, 2052, 2057 }, + {2055, 1324, -196, -1696, -1828, -381, 1247, 1644, 786, -424, -1257, -1422, -888, 19, 718, 977, 1166, 1658, 2280, 2598, 2473, 2049, 1427, 632, -201, -860, -1266, -1521, -1768, -2044, -2283, -2388, -2327, -2140, -1890, -1621, -1387, -1266, -1308, -1491, -1758, -2068, -2405, -2749, -3075, -3375, -3651, -3908, -4152, -4375, -4554, -4658, -4671, -4591, -4416, -4142, -3766, -3294, -2739, -2103, -1386, -592, 267, 1182, 2147, 3147, 4154, 5142, 6094, 6985, 7787, 8473, 9023, 9415, 9637, 9697, 9611, 9386, 9021, 8541, 8001, 7433, 6834, 6200, 5573, 5006, 4505, 4030, 3564, 3144, 2813, 2569, 2373, 2202, 2065, 1976, + 1936, 1938, 1966, 2001, 2026, 2036, 2040, 2044, 2043, 2013, 1926, 1770, 1565, 1341, 1115, 881, 631, 364, 89, -181, -428, -635, -794, -898, -946, -941, -889, -791, -648, -465, -257, -34, 192, 412, 619, 807, 970, 1094, 1180, 1245, 1302, 1365, 1448, 1558, 1682, 1796, 1892, 1978, 2052, 2106, 2141, 2164, 2169, 2155, 2129, 2106, 2084, 2064, 2053, 2053, 2054, 2052, 2052, 2057 } + }, + { + {443, 754, 461, -729, -1805, -1718, -769, -223, -803, -2037, -2954, -3026, -2391, -1502, -695, 18, 846, 1906, 3037, 3943, 4447, 4537, 4272, 3750, 3115, 2475, 1785, 918, -163, -1370, -2617, -3890, -5180, -6402, -7458, -8302, -8936, -9353, -9534, -9492, -9276, -8943, -8530, -8063, -7562, -7050, -6535, -6011, -5465, -4897, -4327, -3783, -3296, -2891, -2570, -2309, -2069, -1823, -1564, -1291, -1002, -706, -419, -144, 125, 386, 638, 895, 1171, 1461, 1749, 2036, 2336, 2637, 2912, 3147, 3349, 3511, 3604, 3610, 3550, 3444, 3280, 3044, 2755, 2456, 2166, 1873, 1564, 1245, 917, 564, 178, -229, -639, -1054, + -1482, -1912, -2313, -2665, -2975, -3251, -3488, -3658, -3737, -3729, -3661, -3564, -3438, -3260, -3014, -2713, -2393, -2091, -1816, -1544, -1246, -913, -572, -259, 3, 218, 409, 605, 823, 1056, 1289, 1516, 1744, 1983, 2245, 2540, 2871, 3228, 3600, 3978, 4358, 4734, 5103, 5465, 5815, 6142, 6436, 6692, 6906, 7074, 7198, 7285, 7340, 7367, 7374, 7368, 7356, 7339, 7324, 7312, 7299, 7287, 7280, 7279 }, + {443, 754, 461, -729, -1805, -1718, -769, -223, -803, -2037, -2954, -3026, -2391, -1502, -695, 18, 846, 1906, 3037, 3943, 4447, 4537, 4272, 3750, 3115, 2475, 1785, 918, -163, -1370, -2617, -3890, -5180, -6402, -7458, -8302, -8936, -9353, -9534, -9492, -9276, -8943, -8530, -8063, -7562, -7050, -6535, -6011, -5465, -4897, -4327, -3783, -3296, -2891, -2570, -2309, -2069, -1823, -1564, -1291, -1002, -706, -419, -144, 125, 386, 638, 895, 1171, 1461, 1749, 2036, 2336, 2637, 2912, 3147, 3349, 3511, 3604, 3610, 3550, 3444, 3280, 3044, 2755, 2456, 2166, 1873, 1564, 1245, 917, 564, 178, -229, -639, -1054, + -1482, -1912, -2313, -2665, -2975, -3251, -3488, -3658, -3737, -3729, -3661, -3564, -3438, -3260, -3014, -2713, -2393, -2091, -1816, -1544, -1246, -913, -572, -259, 3, 218, 409, 605, 823, 1056, 1289, 1516, 1744, 1983, 2245, 2540, 2871, 3228, 3600, 3978, 4358, 4734, 5103, 5465, 5815, 6142, 6436, 6692, 6906, 7074, 7198, 7285, 7340, 7367, 7374, 7368, 7356, 7339, 7324, 7312, 7299, 7287, 7280, 7279 } + }, + { + {-47, -160, -110, 167, 354, 207, -51, -85, -92, -696, -2097, -3604, -4252, -3767, -2680, -1586, -582, 523, 1763, 2977, 4052, 4972, 5681, 6074, 6124, 5909, 5487, 4838, 3952, 2879, 1686, 407, -927, -2273, -3598, -4865, -5997, -6881, -7453, -7741, -7824, -7774, -7642, -7461, -7249, -7008, -6739, -6440, -6102, -5723, -5312, -4890, -4477, -4094, -3761, -3483, -3242, -3016, -2797, -2578, -2348, -2102, -1839, -1559, -1256, -931, -587, -222, 172, 589, 1015, 1451, 1907, 2374, 2825, 3244, 3632, 3980, 4254, 4430, 4527, 4576, 4568, 4478, 4313, 4112, 3894, 3634, 3307, 2926, 2528, 2121, 1696, 1257, 834, 455, + 122, -175, -442, -676, -874, -1041, -1188, -1320, -1439, -1548, -1663, -1795, -1936, -2062, -2154, -2217, -2272, -2337, -2416, -2491, -2535, -2533, -2500, -2462, -2438, -2435, -2444, -2448, -2430, -2387, -2323, -2242, -2140, -2009, -1842, -1634, -1384, -1104, -808, -507, -209, 77, 349, 607, 846, 1058, 1239, 1390, 1514, 1614, 1700, 1781, 1858, 1932, 2002, 2074, 2144, 2212, 2277, 2339, 2394, 2439, 2474, 2494 }, + {47, 160, 110, -167, -354, -207, 51, 85, 92, 696, 2097, 3604, 4252, 3767, 2680, 1586, 582, -523, -1763, -2977, -4052, -4972, -5681, -6074, -6124, -5909, -5487, -4838, -3952, -2879, -1686, -407, 927, 2273, 3598, 4865, 5997, 6881, 7453, 7741, 7824, 7774, 7642, 7461, 7249, 7008, 6739, 6440, 6102, 5723, 5312, 4890, 4477, 4094, 3761, 3483, 3242, 3016, 2797, 2578, 2348, 2102, 1839, 1559, 1256, 931, 587, 222, -172, -589, -1015, -1451, -1907, -2374, -2825, -3244, -3632, -3980, -4254, -4430, -4527, -4576, -4568, -4478, -4313, -4112, -3894, -3634, -3307, -2926, -2528, -2121, -1696, -1257, -834, -455, + -122, 175, 442, 676, 874, 1041, 1188, 1320, 1439, 1548, 1663, 1795, 1936, 2062, 2154, 2217, 2272, 2337, 2416, 2491, 2535, 2533, 2500, 2462, 2438, 2435, 2444, 2448, 2430, 2387, 2323, 2242, 2140, 2009, 1842, 1634, 1384, 1104, 808, 507, 209, -77, -349, -607, -846, -1058, -1239, -1390, -1514, -1614, -1700, -1781, -1858, -1932, -2002, -2074, -2144, -2212, -2277, -2339, -2394, -2439, -2474, -2494 } + }, + { + {144, -113, 67, 433, 47, -626, 103, 2239, 3257, 1287, -2228, -4311, -3880, -2224, -801, 129, 918, 1718, 2469, 3068, 3378, 3307, 2933, 2415, 1845, 1297, 884, 652, 532, 479, 539, 720, 915, 1028, 1073, 1116, 1170, 1185, 1086, 827, 428, -36, -494, -923, -1312, -1653, -1965, -2291, -2650, -3030, -3417, -3803, -4172, -4504, -4784, -4989, -5079, -5035, -4867, -4585, -4178, -3652, -3034, -2343, -1570, -723, 166, 1066, 1963, 2835, 3645, 4361, 4963, 5424, 5723, 5862, 5854, 5698, 5391, 4956, 4436, 3857, 3220, 2518, 1779, 1048, 353, -320, -987, -1637, -2242, -2796, -3306, -3758, -4136, -4436, + -4665, -4806, -4836, -4757, -4587, -4336, -4000, -3575, -3074, -2539, -2034, -1603, -1235, -886, -541, -229, 10, 160, 231, 254, 261, 269, 266, 247, 222, 206, 210, 245, 320, 430, 557, 697, 848, 995, 1121, 1220, 1292, 1329, 1330, 1308, 1272, 1222, 1167, 1120, 1079, 1030, 972, 914, 856, 784, 704, 624, 541, 449, 363, 291, 227, 164, 113, 77, 43, 9, -12, -15 }, + {-144, 113, -67, -433, -47, 626, -103, -2239, -3257, -1287, 2228, 4311, 3880, 2224, 801, -129, -918, -1718, -2469, -3068, -3378, -3307, -2933, -2415, -1845, -1297, -884, -652, -532, -479, -539, -720, -915, -1028, -1073, -1116, -1170, -1185, -1086, -827, -428, 36, 494, 923, 1312, 1653, 1965, 2291, 2650, 3030, 3417, 3803, 4172, 4504, 4784, 4989, 5079, 5035, 4867, 4585, 4178, 3652, 3034, 2343, 1570, 723, -166, -1066, -1963, -2835, -3645, -4361, -4963, -5424, -5723, -5862, -5854, -5698, -5391, -4956, -4436, -3857, -3220, -2518, -1779, -1048, -353, 320, 987, 1637, 2242, 2796, 3306, 3758, 4136, 4436, + 4665, 4806, 4836, 4757, 4587, 4336, 4000, 3575, 3074, 2539, 2034, 1603, 1235, 886, 541, 229, -10, -160, -231, -254, -261, -269, -266, -247, -222, -206, -210, -245, -320, -430, -557, -697, -848, -995, -1121, -1220, -1292, -1329, -1330, -1308, -1272, -1222, -1167, -1120, -1079, -1030, -972, -914, -856, -784, -704, -624, -541, -449, -363, -291, -227, -164, -113, -77, -43, -9, 12, 15 } + }, + { + {99, 113, -166, -691, -1024, -1064, -1188, -1370, -754, 1329, 4211, 6330, 6730, 5715, 4113, 2425, 806, -603, -1672, -2441, -3044, -3518, -3821, -3942, -3892, -3645, -3207, -2714, -2366, -2245, -2259, -2256, -2161, -1983, -1753, -1479, -1157, -793, -393, 40, 494, 930, 1297, 1578, 1796, 1986, 2161, 2316, 2442, 2536, 2596, 2620, 2605, 2544, 2430, 2265, 2060, 1833, 1602, 1382, 1180, 1001, 848, 731, 654, 618, 627, 691, 821, 1019, 1281, 1599, 1974, 2413, 2910, 3451, 4022, 4619, 5235, 5845, 6423, 6955, 7434, 7848, 8176, 8402, 8527, 8555, 8489, 8331, 8078, 7712, 7221, 6617, 5941, 5238, + 4526, 3802, 3071, 2375, 1776, 1319, 1002, 788, 645, 569, 578, 681, 858, 1075, 1290, 1478, 1623, 1722, 1777, 1791, 1758, 1669, 1516, 1299, 1034, 740, 435, 127, -182, -492, -801, -1106, -1406, -1706, -2013, -2331, -2654, -2972, -3285, -3596, -3912, -4238, -4581, -4939, -5301, -5651, -5974, -6264, -6516, -6722, -6880, -6990, -7057, -7089, -7095, -7084, -7065, -7043, -7023, -7005, -6986, -6969, -6956, -6949 }, + {99, 113, -166, -691, -1024, -1064, -1188, -1370, -754, 1329, 4211, 6330, 6730, 5715, 4113, 2425, 806, -603, -1672, -2441, -3044, -3518, -3821, -3942, -3892, -3645, -3207, -2714, -2366, -2245, -2259, -2256, -2161, -1983, -1753, -1479, -1157, -793, -393, 40, 494, 930, 1297, 1578, 1796, 1986, 2161, 2316, 2442, 2536, 2596, 2620, 2605, 2544, 2430, 2265, 2060, 1833, 1602, 1382, 1180, 1001, 848, 731, 654, 618, 627, 691, 821, 1019, 1281, 1599, 1974, 2413, 2910, 3451, 4022, 4619, 5235, 5845, 6423, 6955, 7434, 7848, 8176, 8402, 8527, 8555, 8489, 8331, 8078, 7712, 7221, 6617, 5941, 5238, + 4526, 3802, 3071, 2375, 1776, 1319, 1002, 788, 645, 569, 578, 681, 858, 1075, 1290, 1478, 1623, 1722, 1777, 1791, 1758, 1669, 1516, 1299, 1034, 740, 435, 127, -182, -492, -801, -1106, -1406, -1706, -2013, -2331, -2654, -2972, -3285, -3596, -3912, -4238, -4581, -4939, -5301, -5651, -5974, -6264, -6516, -6722, -6880, -6990, -7057, -7089, -7095, -7084, -7065, -7043, -7023, -7005, -6986, -6969, -6956, -6949 } + }, + { + {620, -559, -1859, -1926, -234, 2227, 3484, 2298, -491, -2678, -2901, -1780, -748, -382, -329, -296, -323, -298, 41, 575, 835, 668, 444, 502, 768, 1019, 1221, 1431, 1606, 1640, 1495, 1224, 922, 680, 511, 332, 43, -372, -862, -1369, -1835, -2206, -2464, -2635, -2742, -2785, -2771, -2727, -2669, -2594, -2511, -2431, -2351, -2259, -2155, -2044, -1915, -1757, -1577, -1394, -1218, -1058, -921, -819, -759, -738, -738, -743, -754, -778, -801, -798, -758, -694, -600, -448, -218, 89, 463, 902, 1407, 1968, 2567, 3176, 3773, 4358, 4929, 5451, 5885, 6243, 6583, 6925, 7211, 7374, 7404, 7340, + 7202, 6967, 6603, 6114, 5544, 4929, 4267, 3527, 2710, 1864, 1043, 269, -477, -1223, -1978, -2713, -3379, -3942, -4408, -4803, -5137, -5405, -5602, -5727, -5789, -5805, -5795, -5763, -5707, -5629, -5541, -5445, -5333, -5190, -5001, -4758, -4478, -4197, -3935, -3686, -3434, -3170, -2881, -2562, -2234, -1929, -1656, -1403, -1164, -938, -712, -479, -253, -59, 102, 238, 351, 439, 516, 593, 666, 723, 765, 790 }, + {620, -559, -1859, -1926, -234, 2227, 3484, 2298, -491, -2678, -2901, -1780, -748, -382, -329, -296, -323, -298, 41, 575, 835, 668, 444, 502, 768, 1019, 1221, 1431, 1606, 1640, 1495, 1224, 922, 680, 511, 332, 43, -372, -862, -1369, -1835, -2206, -2464, -2635, -2742, -2785, -2771, -2727, -2669, -2594, -2511, -2431, -2351, -2259, -2155, -2044, -1915, -1757, -1577, -1394, -1218, -1058, -921, -819, -759, -738, -738, -743, -754, -778, -801, -798, -758, -694, -600, -448, -218, 89, 463, 902, 1407, 1968, 2567, 3176, 3773, 4358, 4929, 5451, 5885, 6243, 6583, 6925, 7211, 7374, 7404, 7340, + 7202, 6967, 6603, 6114, 5544, 4929, 4267, 3527, 2710, 1864, 1043, 269, -477, -1223, -1978, -2713, -3379, -3942, -4408, -4803, -5137, -5405, -5602, -5727, -5789, -5805, -5795, -5763, -5707, -5629, -5541, -5445, -5333, -5190, -5001, -4758, -4478, -4197, -3935, -3686, -3434, -3170, -2881, -2562, -2234, -1929, -1656, -1403, -1164, -938, -712, -479, -253, -59, 102, 238, 351, 439, 516, 593, 666, 723, 765, 790 } + }, + { + {-151, 1049, 1546, 70, -2649, -5095, -6279, -5580, -2612, 1963, 6365, 9175, 10412, 10704, 10077, 8217, 5442, 2643, 364, -1539, -3395, -5240, -6881, -8151, -9035, -9649, -10133, -10515, -10716, -10669, -10384, -9893, -9202, -8321, -7290, -6155, -4954, -3725, -2513, -1363, -315, 609, 1422, 2160, 2834, 3422, 3902, 4276, 4562, 4785, 4979, 5170, 5353, 5508, 5616, 5672, 5676, 5626, 5525, 5382, 5210, 5017, 4807, 4580, 4341, 4094, 3841, 3582, 3326, 3081, 2852, 2633, 2427, 2240, 2074, 1921, 1777, 1655, 1562, 1495, 1435, 1368, 1291, 1202, 1100, 982, 859, 751, 676, 636, 624, 632, 662, 713, 764, 770, + 690, 513, 259, -48, -405, -824, -1301, -1799, -2264, -2664, -2998, -3279, -3503, -3651, -3705, -3673, -3578, -3450, -3306, -3145, -2956, -2743, -2522, -2318, -2145, -2000, -1864, -1713, -1531, -1331, -1131, -941, -757, -575, -389, -192, 20, 242, 467, 692, 917, 1138, 1352, 1562, 1765, 1956, 2125, 2267, 2376, 2445, 2472, 2458, 2409, 2332, 2232, 2116, 1985, 1847, 1710, 1581, 1461, 1360, 1288, 1252 }, + {-151, 1049, 1546, 70, -2649, -5095, -6279, -5580, -2612, 1963, 6365, 9175, 10412, 10704, 10077, 8217, 5442, 2643, 364, -1539, -3395, -5240, -6881, -8151, -9035, -9649, -10133, -10515, -10716, -10669, -10384, -9893, -9202, -8321, -7290, -6155, -4954, -3725, -2513, -1363, -315, 609, 1422, 2160, 2834, 3422, 3902, 4276, 4562, 4785, 4979, 5170, 5353, 5508, 5616, 5672, 5676, 5626, 5525, 5382, 5210, 5017, 4807, 4580, 4341, 4094, 3841, 3582, 3326, 3081, 2852, 2633, 2427, 2240, 2074, 1921, 1777, 1655, 1562, 1495, 1435, 1368, 1291, 1202, 1100, 982, 859, 751, 676, 636, 624, 632, 662, 713, 764, 770, + 690, 513, 259, -48, -405, -824, -1301, -1799, -2264, -2664, -2998, -3279, -3503, -3651, -3705, -3673, -3578, -3450, -3306, -3145, -2956, -2743, -2522, -2318, -2145, -2000, -1864, -1713, -1531, -1331, -1131, -941, -757, -575, -389, -192, 20, 242, 467, 692, 917, 1138, 1352, 1562, 1765, 1956, 2125, 2267, 2376, 2445, 2472, 2458, 2409, 2332, 2232, 2116, 1985, 1847, 1710, 1581, 1461, 1360, 1288, 1252 } + } +}; +const Word16 CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {-4586, -11776, -14408, -12737, -8819, -4486, -417, 3358, 6682, 9133, 10338, 10200, 8870, 6662, 3962, 1136, -1559, -3993, -6109, -7862, -9192, -10058, -10495, -10609, -10485, -10133, -9529, -8703, -7740, -6720, -5684, -4658, -3673, -2751, -1892, -1088, -338, 355, 1000, 1614, 2214, 2808, 3395, 3969, 4523, 5057, 5568, 6055, 6517, 6955, 7365, 7741, 8081, 8386, 8658, 8896, 9103, 9289, 9458, 9614, 9755, 9885, 10006, 10117, 10215, 10303, 10384, 10458, 10525, 10588, 10651, 10714, 10774, 10830, 10887, 10943, 10992, 11035, 11076, 11112, 11132, 11134, 11124, 11106, 11075, 11025, 10960, 10887, 10813, 10730, 10629, 10512, 10389, 10271, 10156, 10037, + 9918, 9811, 9725, 9659, 9605, 9557, 9514, 9483, 9464, 9449, 9428, 9396, 9352, 9300, 9240, 9167, 9081, 8979, 8863, 8738, 8609, 8478, 8347, 8217, 8088, 7960, 7832, 7705, 7577, 7445, 7311, 7175, 7038, 6900, 6765, 6634, 6507, 6381, 6255, 6128, 5997, 5860, 5719, 5574, 5423, 5264, 5094, 4912, 4712, 4497, 4265, 4018, 3753, 3474, 3183, 2878, 2561, 2235, 1903, 1566, 1223, 876, 527, 176 }, + {-4586, -11776, -14408, -12737, -8819, -4486, -417, 3358, 6682, 9133, 10338, 10200, 8870, 6662, 3962, 1136, -1559, -3993, -6109, -7862, -9192, -10058, -10495, -10609, -10485, -10133, -9529, -8703, -7740, -6720, -5684, -4658, -3673, -2751, -1892, -1088, -338, 355, 1000, 1614, 2214, 2808, 3395, 3969, 4523, 5057, 5568, 6055, 6517, 6955, 7365, 7741, 8081, 8386, 8658, 8896, 9103, 9289, 9458, 9614, 9755, 9885, 10006, 10117, 10215, 10303, 10384, 10458, 10525, 10588, 10651, 10714, 10774, 10830, 10887, 10943, 10992, 11035, 11076, 11112, 11132, 11134, 11124, 11106, 11075, 11025, 10960, 10887, 10813, 10730, 10629, 10512, 10389, 10271, 10156, 10037, + 9918, 9811, 9725, 9659, 9605, 9557, 9514, 9483, 9464, 9449, 9428, 9396, 9352, 9300, 9240, 9167, 9081, 8979, 8863, 8738, 8609, 8478, 8347, 8217, 8088, 7960, 7832, 7705, 7577, 7445, 7311, 7175, 7038, 6900, 6765, 6634, 6507, 6381, 6255, 6128, 5997, 5860, 5719, 5574, 5423, 5264, 5094, 4912, 4712, 4497, 4265, 4018, 3753, 3474, 3183, 2878, 2561, 2235, 1903, 1566, 1223, 876, 527, 176 } + }, + { + {2255, 3795, -1007, -10081, -17748, -19319, -14258, -5559, 3222, 10142, 14880, 17664, 18629, 17898, 15748, 12540, 8601, 4255, -117, -4148, -7623, -10534, -12962, -14940, -16418, -17368, -17858, -18010, -17911, -17601, -17114, -16485, -15744, -14911, -14009, -13060, -12071, -11037, -9951, -8813, -7631, -6423, -5214, -4020, -2851, -1710, -606, 452, 1455, 2395, 3274, 4106, 4906, 5680, 6422, 7121, 7767, 8354, 8880, 9340, 9739, 10085, 10385, 10639, 10847, 11019, 11164, 11280, 11366, 11429, 11482, 11528, 11568, 11612, 11676, 11761, 11859, 11968, 12101, 12262, 12436, 12612, 12793, 12990, 13196, 13395, 13582, 13761, 13940, 14125, 14317, 14512, 14704, 14886, 15052, 15195, + 15305, 15363, 15356, 15278, 15133, 14927, 14661, 14340, 13976, 13583, 13176, 12767, 12367, 11989, 11649, 11357, 11115, 10911, 10732, 10572, 10434, 10325, 10243, 10175, 10103, 10012, 9899, 9768, 9632, 9498, 9368, 9236, 9101, 8964, 8824, 8680, 8531, 8380, 8229, 8079, 7932, 7785, 7636, 7481, 7317, 7146, 6968, 6782, 6585, 6374, 6143, 5884, 5592, 5266, 4907, 4516, 4091, 3634, 3145, 2626, 2079, 1504, 909, 304 }, + {-2255, -3795, 1007, 10081, 17748, 19319, 14258, 5559, -3222, -10142, -14880, -17664, -18629, -17898, -15748, -12540, -8601, -4255, 117, 4148, 7623, 10534, 12962, 14940, 16418, 17368, 17858, 18010, 17911, 17601, 17114, 16485, 15744, 14911, 14009, 13060, 12071, 11037, 9951, 8813, 7631, 6423, 5214, 4020, 2851, 1710, 606, -452, -1455, -2395, -3274, -4106, -4906, -5680, -6422, -7121, -7767, -8354, -8880, -9340, -9739, -10085, -10385, -10639, -10847, -11019, -11164, -11280, -11366, -11429, -11482, -11528, -11568, -11612, -11676, -11761, -11859, -11968, -12101, -12262, -12436, -12612, -12793, -12990, -13196, -13395, -13582, -13761, -13940, -14125, -14317, -14512, -14704, -14886, -15052, -15195, + -15305, -15363, -15356, -15278, -15133, -14927, -14661, -14340, -13976, -13583, -13176, -12767, -12367, -11989, -11649, -11357, -11115, -10911, -10732, -10572, -10434, -10325, -10243, -10175, -10103, -10012, -9899, -9768, -9632, -9498, -9368, -9236, -9101, -8964, -8824, -8680, -8531, -8380, -8229, -8079, -7932, -7785, -7636, -7481, -7317, -7146, -6968, -6782, -6585, -6374, -6143, -5884, -5592, -5266, -4907, -4516, -4091, -3634, -3145, -2626, -2079, -1504, -909, -304 } + }, + { + {-615, -1739, -2167, -1198, 677, 1822, 1276, -215, -1274, -1314, -579, 480, 1382, 1693, 1429, 1099, 1040, 984, 516, -338, -1238, -1983, -2553, -2884, -2875, -2583, -2209, -1907, -1668, -1393, -1014, -559, -123, 213, 422, 496, 423, 227, -9, -198, -301, -323, -266, -126, 87, 356, 668, 1023, 1427, 1897, 2442, 3055, 3712, 4392, 5085, 5778, 6450, 7085, 7672, 8208, 8681, 9075, 9379, 9584, 9677, 9639, 9458, 9137, 8677, 8078, 7346, 6500, 5559, 4552, 3515, 2489, 1496, 550, -320, -1073, -1693, -2207, -2632, -2945, -3124, -3196, -3219, -3214, -3150, -3002, -2802, -2602, -2425, -2254, -2074, -1893, + -1729, -1598, -1511, -1469, -1464, -1481, -1511, -1560, -1645, -1771, -1925, -2070, -2174, -2229, -2253, -2257, -2237, -2180, -2075, -1916, -1701, -1440, -1145, -828, -503, -183, 125, 418, 686, 915, 1099, 1237, 1330, 1381, 1395, 1377, 1330, 1266, 1207, 1168, 1149, 1150, 1162, 1165, 1138, 1081, 1011, 932, 841, 742, 645, 549, 453, 367, 301, 251, 210, 179, 157, 134, 103, 74, 47, 17 }, + {-615, -1739, -2167, -1198, 677, 1822, 1276, -215, -1274, -1314, -579, 480, 1382, 1693, 1429, 1099, 1040, 984, 516, -338, -1238, -1983, -2553, -2884, -2875, -2583, -2209, -1907, -1668, -1393, -1014, -559, -123, 213, 422, 496, 423, 227, -9, -198, -301, -323, -266, -126, 87, 356, 668, 1023, 1427, 1897, 2442, 3055, 3712, 4392, 5085, 5778, 6450, 7085, 7672, 8208, 8681, 9075, 9379, 9584, 9677, 9639, 9458, 9137, 8677, 8078, 7346, 6500, 5559, 4552, 3515, 2489, 1496, 550, -320, -1073, -1693, -2207, -2632, -2945, -3124, -3196, -3219, -3214, -3150, -3002, -2802, -2602, -2425, -2254, -2074, -1893, + -1729, -1598, -1511, -1469, -1464, -1481, -1511, -1560, -1645, -1771, -1925, -2070, -2174, -2229, -2253, -2257, -2237, -2180, -2075, -1916, -1701, -1440, -1145, -828, -503, -183, 125, 418, 686, 915, 1099, 1237, 1330, 1381, 1395, 1377, 1330, 1266, 1207, 1168, 1149, 1150, 1162, 1165, 1138, 1081, 1011, 932, 841, 742, 645, 549, 453, 367, 301, 251, 210, 179, 157, 134, 103, 74, 47, 17 } + }, + { + {-22, -491, -1460, -1903, -1155, 22, 345, -427, -1320, -1331, -360, 969, 2014, 2546, 2731, 2841, 2938, 2814, 2241, 1216, -64, -1396, -2641, -3697, -4535, -5252, -5967, -6670, -7228, -7550, -7650, -7549, -7208, -6591, -5734, -4720, -3606, -2425, -1228, -87, 945, 1856, 2650, 3336, 3918, 4410, 4833, 5201, 5511, 5746, 5891, 5941, 5910, 5830, 5742, 5686, 5668, 5676, 5691, 5705, 5705, 5679, 5629, 5567, 5495, 5413, 5327, 5245, 5154, 5035, 4886, 4716, 4516, 4263, 3952, 3604, 3223, 2798, 2332, 1860, 1410, 977, 554, 162, -162, -417, -633, -830, -1005, -1152, -1282, -1394, -1472, -1496, -1471, -1406, + -1289, -1100, -836, -518, -166, 223, 661, 1149, 1661, 2158, 2618, 3048, 3473, 3897, 4294, 4631, 4892, 5095, 5277, 5463, 5643, 5787, 5869, 5893, 5889, 5891, 5921, 5978, 6044, 6098, 6140, 6179, 6228, 6287, 6353, 6416, 6461, 6472, 6445, 6381, 6281, 6145, 5975, 5772, 5529, 5246, 4930, 4587, 4225, 3853, 3485, 3126, 2782, 2456, 2153, 1872, 1611, 1367, 1137, 917, 703, 497, 299, 100 }, + {-22, -491, -1460, -1903, -1155, 22, 345, -427, -1320, -1331, -360, 969, 2014, 2546, 2731, 2841, 2938, 2814, 2241, 1216, -64, -1396, -2641, -3697, -4535, -5252, -5967, -6670, -7228, -7550, -7650, -7549, -7208, -6591, -5734, -4720, -3606, -2425, -1228, -87, 945, 1856, 2650, 3336, 3918, 4410, 4833, 5201, 5511, 5746, 5891, 5941, 5910, 5830, 5742, 5686, 5668, 5676, 5691, 5705, 5705, 5679, 5629, 5567, 5495, 5413, 5327, 5245, 5154, 5035, 4886, 4716, 4516, 4263, 3952, 3604, 3223, 2798, 2332, 1860, 1410, 977, 554, 162, -162, -417, -633, -830, -1005, -1152, -1282, -1394, -1472, -1496, -1471, -1406, + -1289, -1100, -836, -518, -166, 223, 661, 1149, 1661, 2158, 2618, 3048, 3473, 3897, 4294, 4631, 4892, 5095, 5277, 5463, 5643, 5787, 5869, 5893, 5889, 5891, 5921, 5978, 6044, 6098, 6140, 6179, 6228, 6287, 6353, 6416, 6461, 6472, 6445, 6381, 6281, 6145, 5975, 5772, 5529, 5246, 4930, 4587, 4225, 3853, 3485, 3126, 2782, 2456, 2153, 1872, 1611, 1367, 1137, 917, 703, 497, 299, 100 } + }, + { + {-65, -67, 75, 51, -293, -677, -805, -877, -1324, -2051, -2273, -1347, 451, 2203, 3295, 3828, 4166, 4384, 4319, 3896, 3189, 2250, 1073, -276, -1648, -2953, -4195, -5371, -6412, -7253, -7877, -8285, -8464, -8405, -8112, -7566, -6750, -5711, -4574, -3468, -2461, -1568, -783, -88, 539, 1115, 1646, 2139, 2594, 2997, 3330, 3588, 3773, 3891, 3963, 4021, 4090, 4174, 4270, 4377, 4496, 4617, 4735, 4849, 4956, 5047, 5120, 5176, 5206, 5195, 5143, 5055, 4923, 4723, 4448, 4114, 3724, 3267, 2745, 2196, 1658, 1128, 587, 49, -446, -887, -1304, -1717, -2100, -2417, -2664, -2861, -3008, -3085, -3084, -3024, + -2931, -2819, -2690, -2545, -2393, -2245, -2106, -1973, -1847, -1733, -1631, -1526, -1395, -1233, -1058, -892, -747, -610, -460, -278, -70, 138, 320, 469, 599, 729, 879, 1055, 1251, 1454, 1658, 1866, 2079, 2296, 2513, 2719, 2896, 3033, 3124, 3170, 3175, 3144, 3082, 2993, 2874, 2731, 2573, 2410, 2247, 2092, 1950, 1817, 1688, 1561, 1437, 1313, 1184, 1050, 912, 766, 610, 446, 274, 93 }, + {65, 67, -75, -51, 293, 677, 805, 877, 1324, 2051, 2273, 1347, -451, -2203, -3295, -3828, -4166, -4384, -4319, -3896, -3189, -2250, -1073, 276, 1648, 2953, 4195, 5371, 6412, 7253, 7877, 8285, 8464, 8405, 8112, 7566, 6750, 5711, 4574, 3468, 2461, 1568, 783, 88, -539, -1115, -1646, -2139, -2594, -2997, -3330, -3588, -3773, -3891, -3963, -4021, -4090, -4174, -4270, -4377, -4496, -4617, -4735, -4849, -4956, -5047, -5120, -5176, -5206, -5195, -5143, -5055, -4923, -4723, -4448, -4114, -3724, -3267, -2745, -2196, -1658, -1128, -587, -49, 446, 887, 1304, 1717, 2100, 2417, 2664, 2861, 3008, 3085, 3084, 3024, + 2931, 2819, 2690, 2545, 2393, 2245, 2106, 1973, 1847, 1733, 1631, 1526, 1395, 1233, 1058, 892, 747, 610, 460, 278, 70, -138, -320, -469, -599, -729, -879, -1055, -1251, -1454, -1658, -1866, -2079, -2296, -2513, -2719, -2896, -3033, -3124, -3170, -3175, -3144, -3082, -2993, -2874, -2731, -2573, -2410, -2247, -2092, -1950, -1817, -1688, -1561, -1437, -1313, -1184, -1050, -912, -766, -610, -446, -274, -93 } + }, + { + {-112, -1, 321, 79, -347, 279, 1563, 1299, -1323, -3984, -3935, -1296, 1543, 2938, 3153, 3057, 2946, 2699, 2225, 1508, 598, -326, -1066, -1561, -1828, -1864, -1712, -1502, -1316, -1131, -950, -866, -941, -1109, -1282, -1454, -1679, -1996, -2389, -2785, -3092, -3261, -3314, -3285, -3197, -3079, -2965, -2859, -2726, -2539, -2293, -1978, -1583, -1107, -552, 88, 799, 1537, 2268, 2982, 3665, 4279, 4804, 5246, 5597, 5825, 5909, 5851, 5651, 5299, 4795, 4155, 3399, 2547, 1636, 705, -220, -1127, -1981, -2743, -3398, -3960, -4438, -4815, -5064, -5185, -5214, -5180, -5073, -4877, -4597, -4252, -3846, -3373, -2844, -2277, + -1676, -1037, -381, 257, 857, 1419, 1934, 2379, 2719, 2921, 2989, 2973, 2931, 2874, 2772, 2599, 2373, 2132, 1915, 1745, 1621, 1522, 1435, 1371, 1340, 1342, 1371, 1419, 1470, 1501, 1507, 1488, 1439, 1349, 1226, 1084, 925, 758, 598, 456, 329, 219, 130, 57, -18, -95, -163, -221, -281, -338, -381, -411, -435, -444, -430, -405, -378, -342, -295, -247, -204, -151, -87, -27 }, + {112, 1, -321, -79, 347, -279, -1563, -1299, 1323, 3984, 3935, 1296, -1543, -2938, -3153, -3057, -2946, -2699, -2225, -1508, -598, 326, 1066, 1561, 1828, 1864, 1712, 1502, 1316, 1131, 950, 866, 941, 1109, 1282, 1454, 1679, 1996, 2389, 2785, 3092, 3261, 3314, 3285, 3197, 3079, 2965, 2859, 2726, 2539, 2293, 1978, 1583, 1107, 552, -88, -799, -1537, -2268, -2982, -3665, -4279, -4804, -5246, -5597, -5825, -5909, -5851, -5651, -5299, -4795, -4155, -3399, -2547, -1636, -705, 220, 1127, 1981, 2743, 3398, 3960, 4438, 4815, 5064, 5185, 5214, 5180, 5073, 4877, 4597, 4252, 3846, 3373, 2844, 2277, + 1676, 1037, 381, -257, -857, -1419, -1934, -2379, -2719, -2921, -2989, -2973, -2931, -2874, -2772, -2599, -2373, -2132, -1915, -1745, -1621, -1522, -1435, -1371, -1340, -1342, -1371, -1419, -1470, -1501, -1507, -1488, -1439, -1349, -1226, -1084, -925, -758, -598, -456, -329, -219, -130, -57, 18, 95, 163, 221, 281, 338, 381, 411, 435, 444, 430, 405, 378, 342, 295, 247, 204, 151, 87, 27 } + }, + { + {-21, -191, -423, -315, 180, 671, 1115, 2058, 3643, 4862, 4411, 2144, -788, -3167, -4611, -5316, -5464, -5144, -4541, -3866, -3180, -2434, -1630, -822, -36, 690, 1242, 1513, 1552, 1553, 1676, 1941, 2268, 2586, 2880, 3150, 3390, 3586, 3729, 3810, 3804, 3694, 3501, 3275, 3060, 2858, 2652, 2431, 2198, 1955, 1706, 1453, 1200, 952, 721, 526, 383, 303, 285, 323, 411, 541, 714, 924, 1165, 1431, 1721, 2034, 2358, 2674, 2970, 3241, 3485, 3688, 3831, 3902, 3899, 3818, 3644, 3364, 2984, 2519, 1975, 1351, 659, -81, -844, -1618, -2392, -3160, -3918, -4656, -5340, -5926, -6381, -6709, + -6931, -7050, -7044, -6889, -6596, -6220, -5828, -5459, -5111, -4770, -4445, -4165, -3967, -3871, -3876, -3964, -4113, -4306, -4528, -4777, -5050, -5341, -5633, -5904, -6136, -6321, -6464, -6575, -6660, -6722, -6763, -6785, -6794, -6797, -6791, -6770, -6725, -6659, -6579, -6491, -6394, -6286, -6158, -5996, -5788, -5530, -5230, -4895, -4531, -4146, -3751, -3359, -2980, -2622, -2289, -1982, -1700, -1439, -1193, -958, -731, -514, -305, -101 }, + {-21, -191, -423, -315, 180, 671, 1115, 2058, 3643, 4862, 4411, 2144, -788, -3167, -4611, -5316, -5464, -5144, -4541, -3866, -3180, -2434, -1630, -822, -36, 690, 1242, 1513, 1552, 1553, 1676, 1941, 2268, 2586, 2880, 3150, 3390, 3586, 3729, 3810, 3804, 3694, 3501, 3275, 3060, 2858, 2652, 2431, 2198, 1955, 1706, 1453, 1200, 952, 721, 526, 383, 303, 285, 323, 411, 541, 714, 924, 1165, 1431, 1721, 2034, 2358, 2674, 2970, 3241, 3485, 3688, 3831, 3902, 3899, 3818, 3644, 3364, 2984, 2519, 1975, 1351, 659, -81, -844, -1618, -2392, -3160, -3918, -4656, -5340, -5926, -6381, -6709, + -6931, -7050, -7044, -6889, -6596, -6220, -5828, -5459, -5111, -4770, -4445, -4165, -3967, -3871, -3876, -3964, -4113, -4306, -4528, -4777, -5050, -5341, -5633, -5904, -6136, -6321, -6464, -6575, -6660, -6722, -6763, -6785, -6794, -6797, -6791, -6770, -6725, -6659, -6579, -6491, -6394, -6286, -6158, -5996, -5788, -5530, -5230, -4895, -4531, -4146, -3751, -3359, -2980, -2622, -2289, -1982, -1700, -1439, -1193, -958, -731, -514, -305, -101 } + }, + { + {-625, -1231, -412, 1424, 2800, 2258, -236, -2923, -3712, -2214, -15, 1178, 1166, 814, 660, 620, 647, 871, 1129, 1029, 570, 215, 246, 441, 486, 363, 187, -45, -403, -858, -1301, -1637, -1836, -1945, -2068, -2271, -2512, -2695, -2756, -2676, -2458, -2137, -1775, -1415, -1060, -716, -404, -133, 109, 330, 524, 699, 872, 1043, 1203, 1358, 1511, 1651, 1757, 1824, 1857, 1860, 1836, 1794, 1749, 1723, 1728, 1761, 1813, 1894, 2022, 2194, 2390, 2604, 2852, 3136, 3429, 3706, 3952, 4160, 4313, 4392, 4377, 4264, 4064, 3788, 3421, 2954, 2419, 1872, 1318, 699, -31, -839, -1660, -2462, + -3266, -4083, -4887, -5626, -6269, -6833, -7345, -7796, -8137, -8337, -8411, -8404, -8347, -8237, -8045, -7740, -7325, -6840, -6329, -5809, -5275, -4726, -4172, -3629, -3112, -2633, -2186, -1761, -1355, -971, -608, -253, 106, 468, 826, 1154, 1426, 1637, 1812, 1975, 2132, 2282, 2418, 2518, 2559, 2549, 2514, 2468, 2410, 2344, 2272, 2179, 2047, 1885, 1713, 1537, 1356, 1181, 1017, 855, 680, 495, 303, 103 }, + {-625, -1231, -412, 1424, 2800, 2258, -236, -2923, -3712, -2214, -15, 1178, 1166, 814, 660, 620, 647, 871, 1129, 1029, 570, 215, 246, 441, 486, 363, 187, -45, -403, -858, -1301, -1637, -1836, -1945, -2068, -2271, -2512, -2695, -2756, -2676, -2458, -2137, -1775, -1415, -1060, -716, -404, -133, 109, 330, 524, 699, 872, 1043, 1203, 1358, 1511, 1651, 1757, 1824, 1857, 1860, 1836, 1794, 1749, 1723, 1728, 1761, 1813, 1894, 2022, 2194, 2390, 2604, 2852, 3136, 3429, 3706, 3952, 4160, 4313, 4392, 4377, 4264, 4064, 3788, 3421, 2954, 2419, 1872, 1318, 699, -31, -839, -1660, -2462, + -3266, -4083, -4887, -5626, -6269, -6833, -7345, -7796, -8137, -8337, -8411, -8404, -8347, -8237, -8045, -7740, -7325, -6840, -6329, -5809, -5275, -4726, -4172, -3629, -3112, -2633, -2186, -1761, -1355, -971, -608, -253, 106, 468, 826, 1154, 1426, 1637, 1812, 1975, 2132, 2282, 2418, 2518, 2559, 2549, 2514, 2468, 2410, 2344, 2272, 2179, 2047, 1885, 1713, 1537, 1356, 1181, 1017, 855, 680, 495, 303, 103 } + }, + { + {449, 355, -1355, -3147, -3313, -1545, 1587, 5351, 8555, 9672, 8156, 5031, 1632, -1678, -5045, -8073, -10001, -10661, -10617, -10403, -10059, -9378, -8290, -6930, -5498, -4125, -2799, -1422, 48, 1548, 3002, 4379, 5659, 6797, 7753, 8512, 9066, 9409, 9546, 9492, 9281, 8964, 8592, 8181, 7714, 7186, 6620, 6053, 5510, 5008, 4549, 4108, 3655, 3177, 2684, 2186, 1693, 1213, 759, 340, -40, -386, -700, -982, -1230, -1446, -1632, -1785, -1902, -1986, -2048, -2090, -2111, -2113, -2107, -2097, -2076, -2041, -2005, -1986, -1991, -2014, -2045, -2079, -2110, -2128, -2120, -2082, -2028, -1978, -1947, -1936, -1953, -2016, -2150, -2360, + -2619, -2877, -3101, -3283, -3429, -3525, -3535, -3428, -3205, -2902, -2552, -2165, -1736, -1272, -797, -348, 51, 401, 713, 1002, 1265, 1487, 1658, 1783, 1884, 1987, 2108, 2244, 2375, 2479, 2554, 2613, 2666, 2715, 2763, 2807, 2839, 2849, 2837, 2805, 2752, 2676, 2581, 2466, 2326, 2158, 1963, 1745, 1507, 1257, 1006, 766, 543, 343, 170, 24, -93, -176, -224, -243, -232, -191, -124, -42 }, + {449, 355, -1355, -3147, -3313, -1545, 1587, 5351, 8555, 9672, 8156, 5031, 1632, -1678, -5045, -8073, -10001, -10661, -10617, -10403, -10059, -9378, -8290, -6930, -5498, -4125, -2799, -1422, 48, 1548, 3002, 4379, 5659, 6797, 7753, 8512, 9066, 9409, 9546, 9492, 9281, 8964, 8592, 8181, 7714, 7186, 6620, 6053, 5510, 5008, 4549, 4108, 3655, 3177, 2684, 2186, 1693, 1213, 759, 340, -40, -386, -700, -982, -1230, -1446, -1632, -1785, -1902, -1986, -2048, -2090, -2111, -2113, -2107, -2097, -2076, -2041, -2005, -1986, -1991, -2014, -2045, -2079, -2110, -2128, -2120, -2082, -2028, -1978, -1947, -1936, -1953, -2016, -2150, -2360, + -2619, -2877, -3101, -3283, -3429, -3525, -3535, -3428, -3205, -2902, -2552, -2165, -1736, -1272, -797, -348, 51, 401, 713, 1002, 1265, 1487, 1658, 1783, 1884, 1987, 2108, 2244, 2375, 2479, 2554, 2613, 2666, 2715, 2763, 2807, 2839, 2849, 2837, 2805, 2752, 2676, 2581, 2466, 2326, 2158, 1963, 1745, 1507, 1257, 1006, 766, 543, 343, 170, 24, -93, -176, -224, -243, -232, -191, -124, -42 } + } +}; +const Word16 *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 16000 */ + +const Word16 CRendBin_HOA2_HRIR_max_num_iterations_16kHz = 1; +const Word16 CRendBin_HOA2_HRIR_num_iterations_16kHz[HOA2_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const Word16 CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const Word16 CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const Word16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz = 0; +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_Q_16kHz_fx = 0; +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0}}; +const Word16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_HOA2_HRIR_coeff_Q_16kHz_fx = 14; +const Word16 CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + { 14067, 8828, 1144, -5663, -9925, -11850, -12245, -11491, -9580, -6622, -3030, 642, 3905, 6415, 8009, 8707, 8652, 8015, 6923, 5465, 3732, 1863, 7, -1748, -3404, -4983, -6448, -7717, -8747, -9552, -10166, -10608, -10898, -11071, -11161, -11184, -11151, -11076, -10981, -10875, -10757, -10616, -10444, -10238, -10001, -9735, -9442, -9123, -8780, -8410, -8013, -7591, -7149, -6695, -6230, -5762, -5298, -4843, -4393, -3945, -3496, -3043, -2580, -2096, -1589, -1054, -485, 123, 769, 1449, 2157, 2885, 3617, 4331, 5005, 5617, 6142, 6558, 6846, 6992 }, + { 14067, 8828, 1144, -5663, -9925, -11850, -12245, -11491, -9580, -6622, -3030, 642, 3905, 6415, 8009, 8707, 8652, 8015, 6923, 5465, 3732, 1863, 7, -1748, -3404, -4983, -6448, -7717, -8747, -9552, -10166, -10608, -10898, -11071, -11161, -11184, -11151, -11076, -10981, -10875, -10757, -10616, -10444, -10238, -10001, -9735, -9442, -9123, -8780, -8410, -8013, -7591, -7149, -6695, -6230, -5762, -5298, -4843, -4393, -3945, -3496, -3043, -2580, -2096, -1589, -1054, -485, 123, 769, 1449, 2157, 2885, 3617, 4331, 5005, 5617, 6142, 6558, 6846, 6992 } + }, + { + { -201, 4992, 10458, 10576, 3632, -7146, -16573, -21310, -21212, -17952, -13120, -7565, -1773, 3769, 8629, 12548, 15389, 17051, 17524, 16967, 15681, 13954, 11931, 9652, 7178, 4654, 2228, -35, -2137, -4089, -5886, -7528, -9023, -10377, -11593, -12686, -13675, -14571, -15371, -16065, -16637, -17081, -17397, -17597, -17694, -17696, -17610, -17440, -17194, -16888, -16539, -16160, -15747, -15291, -14780, -14216, -13604, -12956, -12281, -11588, -10887, -10181, -9464, -8731, -7980, -7212, -6419, -5596, -4752, -3901, -3052, -2214, -1409, -662, 14, 609, 1111, 1498, 1756, 1883 }, + { 201, -4992, -10458, -10576, -3632, 7146, 16573, 21310, 21212, 17952, 13120, 7565, 1773, -3769, -8629, -12548, -15389, -17051, -17524, -16967, -15681, -13954, -11931, -9652, -7178, -4654, -2228, 35, 2137, 4089, 5886, 7528, 9023, 10377, 11593, 12686, 13675, 14571, 15371, 16065, 16637, 17081, 17397, 17597, 17694, 17696, 17610, 17440, 17194, 16888, 16539, 16160, 15747, 15291, 14780, 14216, 13604, 12956, 12281, 11588, 10887, 10181, 9464, 8731, 7980, 7212, 6419, 5596, 4752, 3901, 3052, 2214, 1409, 662, -14, -609, -1111, -1498, -1756, -1883 } + }, + { + { 1807, 1075, -445, -1945, -2078, -631, 999, 1398, 539, -671, -1502, -1665, -1131, -223, 477, 735, 924, 1417, 2039, 2358, 2234, 1812, 1192, 398, -434, -1091, -1495, -1749, -1993, -2267, -2503, -2608, -2544, -2355, -2103, -1831, -1594, -1470, -1509, -1690, -1953, -2261, -2594, -2933, -3254, -3551, -3823, -4075, -4313, -4533, -4709, -4809, -4818, -4732, -4550, -4266, -3881, -3403, -2840, -2197, -1474, -674, 194, 1121, 2102, 3121, 4148, 5150, 6100, 6968, 7717, 8317, 8751, 9009, 9101, 9070, 8974, 8850, 8718, 8627 }, + { 1807, 1075, -445, -1945, -2078, -631, 999, 1398, 539, -671, -1502, -1665, -1131, -223, 477, 735, 924, 1417, 2039, 2358, 2234, 1812, 1192, 398, -434, -1091, -1495, -1749, -1993, -2267, -2503, -2608, -2544, -2355, -2103, -1831, -1594, -1470, -1509, -1690, -1953, -2261, -2594, -2933, -3254, -3551, -3823, -4075, -4313, -4533, -4709, -4809, -4818, -4732, -4550, -4266, -3881, -3403, -2840, -2197, -1474, -674, 194, 1121, 2102, 3121, 4148, 5150, 6100, 6968, 7717, 8317, 8751, 9009, 9101, 9070, 8974, 8850, 8718, 8627 } + }, + { + { 472, 784, 491, -699, -1775, -1687, -737, -188, -767, -1998, -2912, -2980, -2341, -1450, -641, 74, 904, 1966, 3099, 4009, 4517, 4612, 4352, 3834, 3205, 2569, 1884, 1023, -52, -1253, -2492, -3759, -5040, -6256, -7304, -8140, -8766, -9173, -9343, -9287, -9057, -8710, -8283, -7801, -7288, -6764, -6238, -5700, -5139, -4556, -3968, -3404, -2896, -2467, -2122, -1836, -1571, -1300, -1014, -710, -388, -55, 273, 595, 916, 1236, 1554, 1883, 2238, 2613, 2990, 3367, 3754, 4137, 4487, 4797, 5073, 5298, 5444, 5507 }, + { 472, 784, 491, -699, -1775, -1687, -737, -188, -767, -1998, -2912, -2980, -2341, -1450, -641, 74, 904, 1966, 3099, 4009, 4517, 4612, 4352, 3834, 3205, 2569, 1884, 1023, -52, -1253, -2492, -3759, -5040, -6256, -7304, -8140, -8766, -9173, -9343, -9287, -9057, -8710, -8283, -7801, -7288, -6764, -6238, -5700, -5139, -4556, -3968, -3404, -2896, -2467, -2122, -1836, -1571, -1300, -1014, -710, -388, -55, 273, 595, 916, 1236, 1554, 1883, 2238, 2613, 2990, 3367, 3754, 4137, 4487, 4797, 5073, 5298, 5444, 5507 } + }, + { + { 85, -27, 23, 301, 488, 342, 85, 51, 45, -558, -1958, -3463, -4108, -3621, -2534, -1440, -435, 670, 1910, 3126, 4203, 5126, 5839, 6235, 6288, 6075, 5655, 5007, 4123, 3053, 1864, 589, -741, -2083, -3403, -4667, -5796, -6676, -7243, -7525, -7602, -7545, -7404, -7214, -6994, -6747, -6470, -6163, -5817, -5429, -5010, -4579, -4156, -3760, -3413, -3121, -2865, -2624, -2388, -2150, -1900, -1631, -1343, -1035, -698, -334, 56, 477, 939, 1434, 1950, 2487, 3045, 3607, 4139, 4623, 5052, 5397, 5625, 5730 }, + { -85, 27, -23, -301, -488, -342, -85, -51, -45, 558, 1958, 3463, 4108, 3621, 2534, 1440, 435, -670, -1910, -3126, -4203, -5126, -5839, -6235, -6288, -6075, -5655, -5007, -4123, -3053, -1864, -589, 741, 2083, 3403, 4667, 5796, 6676, 7243, 7525, 7602, 7545, 7404, 7214, 6994, 6747, 6470, 6163, 5817, 5429, 5010, 4579, 4156, 3760, 3413, 3121, 2865, 2624, 2388, 2150, 1900, 1631, 1343, 1035, 698, 334, -56, -477, -939, -1434, -1950, -2487, -3045, -3607, -4139, -4623, -5052, -5397, -5625, -5730 } + }, + { + { 150, -108, 72, 439, 52, -623, 107, 2245, 3262, 1291, -2224, -4305, -3874, -2219, -796, 133, 919, 1718, 2468, 3066, 3376, 3306, 2933, 2413, 1842, 1294, 881, 647, 526, 474, 533, 712, 906, 1018, 1062, 1104, 1158, 1171, 1069, 808, 408, -58, -519, -949, -1339, -1683, -1998, -2325, -2686, -3070, -3461, -3851, -4225, -4562, -4846, -5054, -5151, -5116, -4957, -4683, -4286, -3771, -3164, -2483, -1724, -893, -27, 838, 1678, 2468, 3168, 3741, 4173, 4454, 4587, 4607, 4562, 4482, 4386, 4315 }, + { -150, 108, -72, -439, -52, 623, -107, -2245, -3262, -1291, 2224, 4305, 3874, 2219, 796, -133, -919, -1718, -2468, -3066, -3376, -3306, -2933, -2413, -1842, -1294, -881, -647, -526, -474, -533, -712, -906, -1018, -1062, -1104, -1158, -1171, -1069, -808, -408, 58, 519, 949, 1339, 1683, 1998, 2325, 2686, 3070, 3461, 3851, 4225, 4562, 4846, 5054, 5151, 5116, 4957, 4683, 4286, 3771, 3164, 2483, 1724, 893, 27, -838, -1678, -2468, -3168, -3741, -4173, -4454, -4587, -4607, -4562, -4482, -4386, -4315 } + }, + { + { -94, -79, -358, -883, -1217, -1257, -1381, -1564, -949, 1133, 4013, 6128, 6525, 5508, 3906, 2219, 603, -804, -1873, -2643, -3246, -3723, -4029, -4153, -4105, -3861, -3424, -2932, -2586, -2468, -2483, -2482, -2389, -2214, -1987, -1716, -1398, -1037, -640, -211, 240, 673, 1037, 1314, 1528, 1715, 1887, 2037, 2159, 2249, 2306, 2326, 2306, 2241, 2122, 1952, 1742, 1512, 1279, 1057, 854, 673, 518, 394, 310, 269, 281, 362, 532, 800, 1161, 1610, 2138, 2734, 3369, 3996, 4567, 5046, 5400, 5591 }, + { -94, -79, -358, -883, -1217, -1257, -1381, -1564, -949, 1133, 4013, 6128, 6525, 5508, 3906, 2219, 603, -804, -1873, -2643, -3246, -3723, -4029, -4153, -4105, -3861, -3424, -2932, -2586, -2468, -2483, -2482, -2389, -2214, -1987, -1716, -1398, -1037, -640, -211, 240, 673, 1037, 1314, 1528, 1715, 1887, 2037, 2159, 2249, 2306, 2326, 2306, 2241, 2122, 1952, 1742, 1512, 1279, 1057, 854, 673, 518, 394, 310, 269, 281, 362, 532, 800, 1161, 1610, 2138, 2734, 3369, 3996, 4567, 5046, 5400, 5591 } + }, + { + { 648, -531, -1831, -1898, -204, 2258, 3516, 2331, -460, -2648, -2870, -1747, -716, -350, -297, -263, -290, -265, 75, 610, 870, 705, 482, 541, 807, 1061, 1263, 1473, 1649, 1684, 1540, 1270, 972, 732, 566, 388, 102, -310, -800, -1306, -1770, -2138, -2394, -2561, -2662, -2700, -2681, -2630, -2564, -2484, -2396, -2311, -2225, -2129, -2017, -1895, -1753, -1581, -1385, -1183, -989, -811, -654, -529, -443, -384, -329, -259, -172, -70, 65, 251, 485, 741, 1005, 1274, 1540, 1771, 1934, 2014 }, + { 648, -531, -1831, -1898, -204, 2258, 3516, 2331, -460, -2648, -2870, -1747, -716, -350, -297, -263, -290, -265, 75, 610, 870, 705, 482, 541, 807, 1061, 1263, 1473, 1649, 1684, 1540, 1270, 972, 732, 566, 388, 102, -310, -800, -1306, -1770, -2138, -2394, -2561, -2662, -2700, -2681, -2630, -2564, -2484, -2396, -2311, -2225, -2129, -2017, -1895, -1753, -1581, -1385, -1183, -989, -811, -654, -529, -443, -384, -329, -259, -172, -70, 65, 251, 485, 741, 1005, 1274, 1540, 1771, 1934, 2014 } + }, + { + { 0, 1199, 1697, 220, -2501, -4949, -6134, -5433, -2464, 2114, 6515, 9322, 10555, 10845, 10217, 8358, 5587, 2791, 514, -1389, -3245, -5092, -6736, -8010, -8895, -9511, -9994, -10377, -10578, -10531, -10248, -9759, -9070, -8191, -7162, -6028, -4827, -3597, -2385, -1235, -187, 734, 1543, 2276, 2944, 3526, 4000, 4370, 4653, 4873, 5065, 5253, 5432, 5581, 5682, 5730, 5724, 5663, 5552, 5399, 5217, 5012, 4788, 4544, 4282, 4007, 3718, 3414, 3101, 2793, 2493, 2201, 1923, 1677, 1466, 1287, 1139, 1033, 974, 951 }, + { 0, 1199, 1697, 220, -2501, -4949, -6134, -5433, -2464, 2114, 6515, 9322, 10555, 10845, 10217, 8358, 5587, 2791, 514, -1389, -3245, -5092, -6736, -8010, -8895, -9511, -9994, -10377, -10578, -10531, -10248, -9759, -9070, -8191, -7162, -6028, -4827, -3597, -2385, -1235, -187, 734, 1543, 2276, 2944, 3526, 4000, 4370, 4653, 4873, 5065, 5253, 5432, 5581, 5682, 5730, 5724, 5663, 5552, 5399, 5217, 5012, 4788, 4544, 4282, 4007, 3718, 3414, 3101, 2793, 2493, 2201, 1923, 1677, 1466, 1287, 1139, 1033, 974, 951 } + } +}; +const Word16 CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + { -4603, -11826, -14491, -12854, -8967, -4664, -623, 3123, 6417, 8835, 10005, 9830, 8464, 6222, 3489, 631, -2096, -4562, -6712, -8500, -9866, -10768, -11242, -11391, -11302, -10983, -10414, -9622, -8695, -7712, -6714, -5726, -4780, -3897, -3076, -2309, -1595, -940, -333, 242, 801, 1351, 1892, 2416, 2920, 3402, 3861, 4297, 4711, 5101, 5464, 5793, 6085, 6340, 6559, 6739, 6885, 7007, 7111, 7201, 7278, 7347, 7411, 7465, 7505, 7526, 7522, 7483, 7394, 7242, 7017, 6703, 6286, 5759, 5120, 4371, 3520, 2582, 1576, 530 }, + { -4603, -11826, -14491, -12854, -8967, -4664, -623, 3123, 6417, 8835, 10005, 9830, 8464, 6222, 3489, 631, -2096, -4562, -6712, -8500, -9866, -10768, -11242, -11391, -11302, -10983, -10414, -9622, -8695, -7712, -6714, -5726, -4780, -3897, -3076, -2309, -1595, -940, -333, 242, 801, 1351, 1892, 2416, 2920, 3402, 3861, 4297, 4711, 5101, 5464, 5793, 6085, 6340, 6559, 6739, 6885, 7007, 7111, 7201, 7278, 7347, 7411, 7465, 7505, 7526, 7522, 7483, 7394, 7242, 7017, 6703, 6286, 5759, 5120, 4371, 3520, 2582, 1576, 530 } + }, + { + { 2238, 3743, -1094, -10206, -17913, -19521, -14491, -5819, 2933, 9818, 14519, 17261, 18182, 17410, 15222, 11979, 8007, 3630, -775, -4841, -8355, -11305, -13775, -15794, -17312, -18300, -18829, -19019, -18958, -18687, -18240, -17654, -16956, -16166, -15307, -14401, -13454, -12461, -11416, -10319, -9181, -8020, -6861, -5720, -4607, -3526, -2482, -1482, -537, 347, 1172, 1952, 2699, 3418, 4102, 4738, 5315, 5828, 6277, 6661, 6986, 7263, 7497, 7688, 7830, 7923, 7966, 7943, 7837, 7639, 7349, 6955, 6449, 5836, 5130, 4338, 3464, 2519, 1526, 511 }, + { -2238, -3743, 1094, 10206, 17913, 19521, 14491, 5819, -2933, -9818, -14519, -17261, -18182, -17410, -15222, -11979, -8007, -3630, 775, 4841, 8355, 11305, 13775, 15794, 17312, 18300, 18829, 19019, 18958, 18687, 18240, 17654, 16956, 16166, 15307, 14401, 13454, 12461, 11416, 10319, 9181, 8020, 6861, 5720, 4607, 3526, 2482, 1482, 537, -347, -1172, -1952, -2699, -3418, -4102, -4738, -5315, -5828, -6277, -6661, -6986, -7263, -7497, -7688, -7830, -7923, -7966, -7943, -7837, -7639, -7349, -6955, -6449, -5836, -5130, -4338, -3464, -2519, -1526, -511 } + }, + { + { -617, -1747, -2179, -1215, 656, 1798, 1248, -249, -1313, -1357, -626, 428, 1324, 1630, 1360, 1024, 961, 900, 428, -430, -1335, -2084, -2660, -2996, -2991, -2703, -2334, -2037, -1803, -1533, -1160, -710, -279, 51, 255, 324, 246, 44, -198, -391, -500, -528, -476, -341, -134, 127, 435, 784, 1180, 1642, 2180, 2788, 3440, 4117, 4805, 5491, 6155, 6781, 7360, 7887, 8351, 8740, 9038, 9237, 9322, 9271, 9067, 8710, 8204, 7554, 6776, 5904, 4978, 4042, 3153, 2362, 1679, 1089, 592, 184 }, + { -617, -1747, -2179, -1215, 656, 1798, 1248, -249, -1313, -1357, -626, 428, 1324, 1630, 1360, 1024, 961, 900, 428, -430, -1335, -2084, -2660, -2996, -2991, -2703, -2334, -2037, -1803, -1533, -1160, -710, -279, 51, 255, 324, 246, 44, -198, -391, -500, -528, -476, -341, -134, 127, 435, 784, 1180, 1642, 2180, 2788, 3440, 4117, 4805, 5491, 6155, 6781, 7360, 7887, 8351, 8740, 9038, 9237, 9322, 9271, 9067, 8710, 8204, 7554, 6776, 5904, 4978, 4042, 3153, 2362, 1679, 1089, 592, 184 } + }, + { + { -25, -501, -1477, -1926, -1184, -13, 305, -474, -1374, -1391, -426, 896, 1932, 2456, 2633, 2735, 2824, 2693, 2114, 1084, -202, -1541, -2793, -3856, -4702, -5426, -6149, -6858, -7423, -7752, -7858, -7764, -7431, -6821, -5972, -4964, -3857, -2681, -1490, -355, 670, 1571, 2356, 3030, 3600, 4082, 4496, 4856, 5158, 5386, 5524, 5568, 5530, 5441, 5344, 5276, 5247, 5245, 5252, 5258, 5250, 5217, 5160, 5090, 5008, 4914, 4812, 4708, 4588, 4429, 4229, 3995, 3718, 3376, 2972, 2524, 2032, 1483, 893, 296 }, + { -25, -501, -1477, -1926, -1184, -13, 305, -474, -1374, -1391, -426, 896, 1932, 2456, 2633, 2735, 2824, 2693, 2114, 1084, -202, -1541, -2793, -3856, -4702, -5426, -6149, -6858, -7423, -7752, -7858, -7764, -7431, -6821, -5972, -4964, -3857, -2681, -1490, -355, 670, 1571, 2356, 3030, 3600, 4082, 4496, 4856, 5158, 5386, 5524, 5568, 5530, 5441, 5344, 5276, 5247, 5245, 5252, 5258, 5250, 5217, 5160, 5090, 5008, 4914, 4812, 4708, 4588, 4429, 4229, 3995, 3718, 3376, 2972, 2524, 2032, 1483, 893, 296 } + }, + { + { -66, -70, 70, 44, -302, -688, -819, -893, -1343, -2071, -2295, -1372, 423, 2172, 3259, 3789, 4124, 4340, 4274, 3850, 3142, 2200, 1020, -332, -1708, -3017, -4262, -5441, -6484, -7326, -7952, -8363, -8545, -8490, -8200, -7658, -6846, -5809, -4674, -3569, -2564, -1674, -893, -203, 418, 989, 1515, 2003, 2452, 2850, 3179, 3433, 3613, 3728, 3795, 3847, 3910, 3988, 4078, 4179, 4292, 4407, 4519, 4628, 4730, 4814, 4879, 4925, 4938, 4900, 4804, 4652, 4426, 4102, 3679, 3170, 2576, 1893, 1148, 382 }, + { 66, 70, -70, -44, 302, 688, 819, 893, 1343, 2071, 2295, 1372, -423, -2172, -3259, -3789, -4124, -4340, -4274, -3850, -3142, -2200, -1020, 332, 1708, 3017, 4262, 5441, 6484, 7326, 7952, 8363, 8545, 8490, 8200, 7658, 6846, 5809, 4674, 3569, 2564, 1674, 893, 203, -418, -989, -1515, -2003, -2452, -2850, -3179, -3433, -3613, -3728, -3795, -3847, -3910, -3988, -4078, -4179, -4292, -4407, -4519, -4628, -4730, -4814, -4879, -4925, -4938, -4900, -4804, -4652, -4426, -4102, -3679, -3170, -2576, -1893, -1148, -382 } + }, + { + { -112, 0, 324, 83, -342, 286, 1573, 1309, -1314, -3973, -3921, -1281, 1557, 2952, 3168, 3073, 2964, 2719, 2247, 1531, 624, -298, -1038, -1532, -1796, -1830, -1678, -1466, -1277, -1091, -909, -823, -895, -1062, -1234, -1402, -1625, -1942, -2333, -2726, -3030, -3198, -3247, -3214, -3123, -3003, -2886, -2776, -2641, -2453, -2203, -1884, -1486, -1005, -444, 200, 912, 1654, 2391, 3111, 3799, 4421, 4954, 5400, 5754, 5982, 6060, 5990, 5778, 5421, 4928, 4331, 3669, 2981, 2318, 1724, 1213, 775, 413, 126 }, + { 112, 0, -324, -83, 342, -286, -1573, -1309, 1314, 3973, 3921, 1281, -1557, -2952, -3168, -3073, -2964, -2719, -2247, -1531, -624, 298, 1038, 1532, 1796, 1830, 1678, 1466, 1277, 1091, 909, 823, 895, 1062, 1234, 1402, 1625, 1942, 2333, 2726, 3030, 3198, 3247, 3214, 3123, 3003, 2886, 2776, 2641, 2453, 2203, 1884, 1486, 1005, 444, -200, -912, -1654, -2391, -3111, -3799, -4421, -4954, -5400, -5754, -5982, -6060, -5990, -5778, -5421, -4928, -4331, -3669, -2981, -2318, -1724, -1213, -775, -413, -126 } + }, + { + { -21, -191, -424, -316, 178, 668, 1112, 2054, 3639, 4857, 4404, 2137, -794, -3170, -4610, -5313, -5461, -5143, -4541, -3869, -3185, -2441, -1639, -831, -46, 681, 1232, 1502, 1541, 1541, 1663, 1926, 2251, 2568, 2859, 3128, 3366, 3561, 3703, 3782, 3775, 3663, 3468, 3240, 3022, 2818, 2609, 2386, 2149, 1904, 1650, 1394, 1136, 884, 648, 449, 302, 218, 195, 228, 308, 429, 591, 791, 1027, 1294, 1595, 1924, 2266, 2591, 2875, 3096, 3233, 3257, 3137, 2858, 2424, 1855, 1171, 401 }, + { -21, -191, -424, -316, 178, 668, 1112, 2054, 3639, 4857, 4404, 2137, -794, -3170, -4610, -5313, -5461, -5143, -4541, -3869, -3185, -2441, -1639, -831, -46, 681, 1232, 1502, 1541, 1541, 1663, 1926, 2251, 2568, 2859, 3128, 3366, 3561, 3703, 3782, 3775, 3663, 3468, 3240, 3022, 2818, 2609, 2386, 2149, 1904, 1650, 1394, 1136, 884, 648, 449, 302, 218, 195, 228, 308, 429, 591, 791, 1027, 1294, 1595, 1924, 2266, 2591, 2875, 3096, 3233, 3257, 3137, 2858, 2424, 1855, 1171, 401 } + }, + { + { -626, -1234, -415, 1419, 2793, 2250, -247, -2938, -3729, -2231, -34, 1156, 1142, 788, 632, 589, 615, 838, 1094, 991, 530, 174, 202, 393, 437, 310, 131, -104, -464, -922, -1367, -1705, -1906, -2019, -2146, -2354, -2599, -2788, -2854, -2777, -2563, -2246, -1887, -1530, -1179, -841, -535, -270, -35, 176, 361, 529, 693, 856, 1012, 1160, 1305, 1436, 1533, 1587, 1604, 1593, 1556, 1502, 1449, 1420, 1424, 1451, 1487, 1535, 1597, 1654, 1672, 1635, 1548, 1409, 1202, 917, 570, 192 }, + { -626, -1234, -415, 1419, 2793, 2250, -247, -2938, -3729, -2231, -34, 1156, 1142, 788, 632, 589, 615, 838, 1094, 991, 530, 174, 202, 393, 437, 310, 131, -104, -464, -922, -1367, -1705, -1906, -2019, -2146, -2354, -2599, -2788, -2854, -2777, -2563, -2246, -1887, -1530, -1179, -841, -535, -270, -35, 176, 361, 529, 693, 856, 1012, 1160, 1305, 1436, 1533, 1587, 1604, 1593, 1556, 1502, 1449, 1420, 1424, 1451, 1487, 1535, 1597, 1654, 1672, 1635, 1548, 1409, 1202, 917, 570, 192 } + }, + { + { 451, 359, -1348, -3138, -3302, -1529, 1608, 5378, 8585, 9704, 8188, 5065, 1669, -1634, -4994, -8016, -9938, -10595, -10549, -10336, -9990, -9307, -8217, -6853, -5415, -4037, -2706, -1323, 151, 1654, 3112, 4493, 5777, 6920, 7883, 8648, 9209, 9557, 9699, 9649, 9441, 9126, 8757, 8351, 7889, 7368, 6811, 6254, 5721, 5228, 4777, 4344, 3897, 3426, 2940, 2451, 1966, 1498, 1056, 650, 282, -51, -354, -626, -865, -1070, -1242, -1377, -1465, -1509, -1513, -1477, -1395, -1271, -1119, -947, -751, -535, -314, -103 }, + { 451, 359, -1348, -3138, -3302, -1529, 1608, 5378, 8585, 9704, 8188, 5065, 1669, -1634, -4994, -8016, -9938, -10595, -10549, -10336, -9990, -9307, -8217, -6853, -5415, -4037, -2706, -1323, 151, 1654, 3112, 4493, 5777, 6920, 7883, 8648, 9209, 9557, 9699, 9649, 9441, 9126, 8757, 8351, 7889, 7368, 6811, 6254, 5721, 5228, 4777, 4344, 3897, 3426, 2940, 2451, 1966, 1498, 1056, 650, 282, -51, -354, -626, -865, -1070, -1242, -1377, -1465, -1509, -1513, -1477, -1395, -1271, -1119, -947, -751, -535, -314, -103 } + } +}; +const Word16 *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; + + + +/********************** CRendBin_HOA3_HRIR **********************/ + +const Word16 CRendBin_HOA3_HRIR_Q_latency_s_fx = 31; +const Word32 CRendBin_HOA3_HRIR_latency_s_fx = 44741;/*Q-31*/ + +/* Sample Rate = 48000 */ + +const Word16 CRendBin_HOA3_HRIR_max_num_iterations_48kHz = 1; +const Word16 CRendBin_HOA3_HRIR_num_iterations_48kHz[HOA3_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const Word16 CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const Word16 CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const Word16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz = 0; +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_Q_48kHz_fx = 0; +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; +const Word16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_HOA3_HRIR_coeff_Q_48kHz_fx = 14; +const Word16 CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {15982, 13492, 9482, 5102, 1170, -1922, -4355, -6659, -8796, -9889, -9322, -7308, -3801, 1614, 7308, 8833, 3596, -4183, -6538, -678, 7738, 11360, 8737, 3593, -967, -4772, -8286, -10979, -12383, -12957, -13252, -13224, -12739, -12021, -11311, -10569, -9735, -8901, -8132, -7383, -6635, -5928, -5248, -4551, -3863, -3225, -2614, -1999, -1409, -870, -352, 168, 666, 1127, 1569, 1996, 2384, 2733, 3065, 3379, 3660, 3920, 4178, 4425, 4647, 4856, 5065, 5265, 5449, 5628, 5811, 5990, 6162, 6335, 6514, 6693, 6869, 7047, 7225, 7404, 7584, 7760, 7919, 8065, 8211, 8351, 8469, 8566, 8658, 8750, 8825, 8873, 8901, 8918, 8929, 8935, + 8929, 8908, 8881, 8869, 8876, 8891, 8904, 8921, 8950, 9000, 9070, 9153, 9238, 9319, 9405, 9505, 9617, 9732, 9844, 9947, 10038, 10123, 10209, 10295, 10376, 10447, 10511, 10566, 10616, 10662, 10706, 10741, 10765, 10780, 10786, 10786, 10785, 10785, 10787, 10788, 10789, 10791, 10796, 10804, 10822, 10853, 10894, 10944, 11001, 11064, 11129, 11197, 11266, 11335, 11401, 11462, 11516, 11562, 11598, 11626, 11646, 11658, 11665, 11667, 11665, 11662, 11658, 11657, 11659, 11666, 11679, 11693, 11705, 11716, 11727, 11734, 11737, 11740, 11742, 11741, 11739, 11742, 11747, 11753, 11767, 11790, 11819, 11850, 11890, 11939, 11986, 12032, 12086, 12142, 12187, 12231, + 12286, 12335, 12366, 12401, 12459, 12502, 12511, 12536, 12606, 12648, 12613, 12609, 12725, 12823, 12695, 12400, 12217, 12269, 12408, 12473, 12423, 12224, 11863, 11535, 11545, 11893, 12192, 12122, 11812, 11594, 11560, 11558, 11550, 11744, 12315, 13130, 13831, 14166, 14182, 14086, 14001, 13910, 13811, 13776, 13808, 13759, 13540, 13309 }, + {15982, 13492, 9482, 5102, 1170, -1922, -4355, -6659, -8796, -9889, -9322, -7308, -3801, 1614, 7308, 8833, 3596, -4183, -6538, -678, 7738, 11360, 8737, 3593, -967, -4772, -8286, -10979, -12383, -12957, -13252, -13224, -12739, -12021, -11311, -10569, -9735, -8901, -8132, -7383, -6635, -5928, -5248, -4551, -3863, -3225, -2614, -1999, -1409, -870, -352, 168, 666, 1127, 1569, 1996, 2384, 2733, 3065, 3379, 3660, 3920, 4178, 4425, 4647, 4856, 5065, 5265, 5449, 5628, 5811, 5990, 6162, 6335, 6514, 6693, 6869, 7047, 7225, 7404, 7584, 7760, 7919, 8065, 8211, 8351, 8469, 8566, 8658, 8750, 8825, 8873, 8901, 8918, 8929, 8935, + 8929, 8908, 8881, 8869, 8876, 8891, 8904, 8921, 8950, 9000, 9070, 9153, 9238, 9319, 9405, 9505, 9617, 9732, 9844, 9947, 10038, 10123, 10209, 10295, 10376, 10447, 10511, 10566, 10616, 10662, 10706, 10741, 10765, 10780, 10786, 10786, 10785, 10785, 10787, 10788, 10789, 10791, 10796, 10804, 10822, 10853, 10894, 10944, 11001, 11064, 11129, 11197, 11266, 11335, 11401, 11462, 11516, 11562, 11598, 11626, 11646, 11658, 11665, 11667, 11665, 11662, 11658, 11657, 11659, 11666, 11679, 11693, 11705, 11716, 11727, 11734, 11737, 11740, 11742, 11741, 11739, 11742, 11747, 11753, 11767, 11790, 11819, 11850, 11890, 11939, 11986, 12032, 12086, 12142, 12187, 12231, + 12286, 12335, 12366, 12401, 12459, 12502, 12511, 12536, 12606, 12648, 12613, 12609, 12725, 12823, 12695, 12400, 12217, 12269, 12408, 12473, 12423, 12224, 11863, 11535, 11545, 11893, 12192, 12122, 11812, 11594, 11560, 11558, 11550, 11744, 12315, 13130, 13831, 14166, 14182, 14086, 14001, 13910, 13811, 13776, 13808, 13759, 13540, 13309 } + }, + { + {1200, 4945, 10805, 15658, 16608, 13003, 6129, -2334, -10430, -15793, -17423, -16443, -13008, -4659, 8193, 16996, 11982, -4210, -15995, -11636, 3743, 15779, 17435, 12921, 8159, 4102, -327, -4350, -6740, -8042, -9365, -10634, -11308, -11572, -11858, -12087, -12051, -11873, -11679, -11349, -10833, -10258, -9659, -8947, -8159, -7413, -6682, -5882, -5075, -4359, -3699, -3027, -2377, -1778, -1178, -557, 35, 585, 1135, 1673, 2149, 2572, 2988, 3375, 3690, 3958, 4217, 4445, 4613, 4749, 4879, 4986, 5059, 5128, 5211, 5298, 5387, 5497, 5625, 5766, 5931, 6119, 6303, 6477, 6668, 6877, 7071, 7239, 7409, 7589, 7766, 7942, 8139, 8360, 8596, 8859, + 9158, 9474, 9792, 10118, 10449, 10759, 11029, 11263, 11463, 11616, 11717, 11771, 11769, 11707, 11614, 11520, 11433, 11347, 11269, 11200, 11130, 11070, 11045, 11059, 11093, 11132, 11169, 11191, 11193, 11190, 11199, 11212, 11217, 11222, 11231, 11237, 11238, 11244, 11254, 11259, 11260, 11267, 11277, 11283, 11290, 11305, 11322, 11339, 11368, 11415, 11474, 11544, 11634, 11739, 11848, 11963, 12091, 12224, 12355, 12489, 12630, 12769, 12900, 13031, 13162, 13282, 13393, 13503, 13608, 13699, 13780, 13855, 13916, 13961, 14002, 14044, 14077, 14104, 14137, 14170, 14189, 14194, 14196, 14189, 14171, 14158, 14155, 14150, 14142, 14149, 14168, 14174, 14176, 14193, 14209, 14214, + 14230, 14258, 14264, 14267, 14314, 14364, 14344, 14334, 14442, 14535, 14451, 14415, 14712, 14991, 14609, 13756, 13389, 13823, 14333, 14484, 14777, 15416, 15527, 14470, 13070, 12585, 13079, 13642, 13685, 13311, 12896, 12814, 12965, 12266, 9575, 5657, 3151, 3707, 6030, 7673, 7933, 7904, 8281, 8421, 7501, 5660, 3771, 2638 }, + {-1200, -4945, -10805, -15658, -16608, -13003, -6129, 2334, 10430, 15793, 17423, 16443, 13008, 4659, -8193, -16996, -11982, 4210, 15995, 11636, -3743, -15779, -17435, -12921, -8159, -4102, 327, 4350, 6740, 8042, 9365, 10634, 11308, 11572, 11858, 12087, 12051, 11873, 11679, 11349, 10833, 10258, 9659, 8947, 8159, 7413, 6682, 5882, 5075, 4359, 3699, 3027, 2377, 1778, 1178, 557, -35, -585, -1135, -1673, -2149, -2572, -2988, -3375, -3690, -3958, -4217, -4445, -4613, -4749, -4879, -4986, -5059, -5128, -5211, -5298, -5387, -5497, -5625, -5766, -5931, -6119, -6303, -6477, -6668, -6877, -7071, -7239, -7409, -7589, -7766, -7942, -8139, -8360, -8596, -8859, + -9158, -9474, -9792, -10118, -10449, -10759, -11029, -11263, -11463, -11616, -11717, -11771, -11769, -11707, -11614, -11520, -11433, -11347, -11269, -11200, -11130, -11070, -11045, -11059, -11093, -11132, -11169, -11191, -11193, -11190, -11199, -11212, -11217, -11222, -11231, -11237, -11238, -11244, -11254, -11259, -11260, -11267, -11277, -11283, -11290, -11305, -11322, -11339, -11368, -11415, -11474, -11544, -11634, -11739, -11848, -11963, -12091, -12224, -12355, -12489, -12630, -12769, -12900, -13031, -13162, -13282, -13393, -13503, -13608, -13699, -13780, -13855, -13916, -13961, -14002, -14044, -14077, -14104, -14137, -14170, -14189, -14194, -14196, -14189, -14171, -14158, -14155, -14150, -14142, -14149, -14168, -14174, -14176, -14193, -14209, -14214, + -14230, -14258, -14264, -14267, -14314, -14364, -14344, -14334, -14442, -14535, -14451, -14415, -14712, -14991, -14609, -13756, -13389, -13823, -14333, -14484, -14777, -15416, -15527, -14470, -13070, -12585, -13079, -13642, -13685, -13311, -12896, -12814, -12965, -12266, -9575, -5657, -3151, -3707, -6030, -7673, -7933, -7904, -8281, -8421, -7501, -5660, -3771, -2638 } + }, + { + {1855, 1823, 1024, -597, -1892, -1783, -502, 808, 1333, 1050, 281, -656, -1330, -1182, -64, 1221, 1400, 146, -1216, -982, 952, 2898, 3270, 2118, 592, -512, -1192, -1661, -1981, -2189, -2362, -2484, -2474, -2338, -2172, -2048, -2007, -2103, -2353, -2674, -2966, -3198, -3383, -3518, -3599, -3644, -3667, -3662, -3613, -3507, -3325, -3041, -2648, -2161, -1585, -921, -180, 613, 1444, 2310, 3204, 4110, 5011, 5900, 6762, 7567, 8286, 8897, 9382, 9721, 9897, 9904, 9743, 9419, 8950, 8370, 7709, 6983, 6213, 5442, 4714, 4037, 3396, 2799, 2283, 1871, 1539, 1245, 984, 792, 697, 681, 707, 762, 851, 982, + 1148, 1338, 1529, 1695, 1821, 1905, 1954, 1967, 1936, 1846, 1683, 1456, 1195, 930, 667, 398, 125, -146, -404, -638, -830, -970, -1057, -1087, -1057, -975, -853, -694, -499, -283, -63, 156, 365, 555, 723, 871, 993, 1077, 1130, 1174, 1222, 1281, 1370, 1494, 1631, 1759, 1881, 2001, 2110, 2201, 2283, 2355, 2402, 2427, 2444, 2452, 2446, 2438, 2441, 2446, 2443, 2443, 2450, 2446, 2427, 2413, 2400, 2368, 2320, 2275, 2223, 2155, 2093, 2056, 2025, 1986, 1962, 1961, 1951, 1925, 1902, 1864, 1768, 1635, 1502, 1341, 1120, 888, 682, 453, 182, -60, -259, -486, -726, -898, + -1054, -1285, -1484, -1551, -1677, -1986, -2174, -2074, -2150, -2643, -2863, -2423, -2400, -3699, -4912, -3921, -1298, 226, -310, -1180, -1318, -1850, -3351, -4110, -2696, -367, 713, 325, -171, -71, 98, -381, -1626, -2959, -3133, -1525, 677, 1406, 179, -1367, -1726, -1259, -1106, -1386, -1376, -849, -288, -38 }, + {1855, 1823, 1024, -597, -1892, -1783, -502, 808, 1333, 1050, 281, -656, -1330, -1182, -64, 1221, 1400, 146, -1216, -982, 952, 2898, 3270, 2118, 592, -512, -1192, -1661, -1981, -2189, -2362, -2484, -2474, -2338, -2172, -2048, -2007, -2103, -2353, -2674, -2966, -3198, -3383, -3518, -3599, -3644, -3667, -3662, -3613, -3507, -3325, -3041, -2648, -2161, -1585, -921, -180, 613, 1444, 2310, 3204, 4110, 5011, 5900, 6762, 7567, 8286, 8897, 9382, 9721, 9897, 9904, 9743, 9419, 8950, 8370, 7709, 6983, 6213, 5442, 4714, 4037, 3396, 2799, 2283, 1871, 1539, 1245, 984, 792, 697, 681, 707, 762, 851, 982, + 1148, 1338, 1529, 1695, 1821, 1905, 1954, 1967, 1936, 1846, 1683, 1456, 1195, 930, 667, 398, 125, -146, -404, -638, -830, -970, -1057, -1087, -1057, -975, -853, -694, -499, -283, -63, 156, 365, 555, 723, 871, 993, 1077, 1130, 1174, 1222, 1281, 1370, 1494, 1631, 1759, 1881, 2001, 2110, 2201, 2283, 2355, 2402, 2427, 2444, 2452, 2446, 2438, 2441, 2446, 2443, 2443, 2450, 2446, 2427, 2413, 2400, 2368, 2320, 2275, 2223, 2155, 2093, 2056, 2025, 1986, 1962, 1961, 1951, 1925, 1902, 1864, 1768, 1635, 1502, 1341, 1120, 888, 682, 453, 182, -60, -259, -486, -726, -898, + -1054, -1285, -1484, -1551, -1677, -1986, -2174, -2074, -2150, -2643, -2863, -2423, -2400, -3699, -4912, -3921, -1298, 226, -310, -1180, -1318, -1850, -3351, -4110, -2696, -367, 713, 325, -171, -71, 98, -381, -1626, -2959, -3133, -1525, 677, 1406, 179, -1367, -1726, -1259, -1106, -1386, -1376, -849, -288, -38 } + }, + { + {886, 1313, 1560, 1034, -92, -865, -543, 441, 900, 277, -868, -1814, -2354, -2197, -748, 1572, 2633, 777, -2487, -3549, -833, 3426, 6005, 6042, 4819, 3388, 1701, -388, -2530, -4387, -5995, -7444, -8626, -9416, -9814, -9859, -9565, -8995, -8251, -7403, -6503, -5608, -4750, -3913, -3097, -2329, -1619, -936, -269, 354, 906, 1376, 1747, 2008, 2187, 2337, 2497, 2675, 2875, 3096, 3323, 3537, 3733, 3913, 4078, 4228, 4372, 4523, 4680, 4831, 4963, 5076, 5171, 5228, 5227, 5164, 5047, 4873, 4625, 4310, 3957, 3582, 3174, 2732, 2292, 1885, 1509, 1144, 790, 455, 130, -210, -568, -927, -1277, -1625, + -1978, -2322, -2631, -2886, -3085, -3235, -3334, -3364, -3308, -3172, -2982, -2756, -2493, -2183, -1826, -1446, -1074, -731, -416, -105, 224, 565, 892, 1180, 1420, 1622, 1806, 1997, 2202, 2413, 2616, 2807, 2993, 3181, 3382, 3608, 3859, 4124, 4394, 4661, 4918, 5163, 5397, 5623, 5834, 6021, 6176, 6295, 6372, 6409, 6415, 6396, 6357, 6304, 6244, 6176, 6101, 6028, 5965, 5909, 5867, 5853, 5870, 5905, 5953, 6019, 6095, 6164, 6227, 6292, 6360, 6431, 6519, 6625, 6735, 6841, 6957, 7078, 7186, 7288, 7396, 7496, 7561, 7603, 7630, 7619, 7558, 7480, 7398, 7283, 7140, 7012, 6897, 6755, 6614, 6512, + 6401, 6243, 6130, 6092, 5979, 5764, 5683, 5765, 5648, 5285, 5232, 5579, 5395, 4242, 3459, 4476, 6459, 7348, 6842, 6406, 6492, 5988, 4771, 4501, 5994, 7740, 8150, 7689, 7617, 7990, 8131, 7945, 7521, 6408, 4552, 3206, 3603, 5149, 6134, 5979, 5668, 5989, 6454, 6333, 5941, 6250, 7481, 8656 }, + {886, 1313, 1560, 1034, -92, -865, -543, 441, 900, 277, -868, -1814, -2354, -2197, -748, 1572, 2633, 777, -2487, -3549, -833, 3426, 6005, 6042, 4819, 3388, 1701, -388, -2530, -4387, -5995, -7444, -8626, -9416, -9814, -9859, -9565, -8995, -8251, -7403, -6503, -5608, -4750, -3913, -3097, -2329, -1619, -936, -269, 354, 906, 1376, 1747, 2008, 2187, 2337, 2497, 2675, 2875, 3096, 3323, 3537, 3733, 3913, 4078, 4228, 4372, 4523, 4680, 4831, 4963, 5076, 5171, 5228, 5227, 5164, 5047, 4873, 4625, 4310, 3957, 3582, 3174, 2732, 2292, 1885, 1509, 1144, 790, 455, 130, -210, -568, -927, -1277, -1625, + -1978, -2322, -2631, -2886, -3085, -3235, -3334, -3364, -3308, -3172, -2982, -2756, -2493, -2183, -1826, -1446, -1074, -731, -416, -105, 224, 565, 892, 1180, 1420, 1622, 1806, 1997, 2202, 2413, 2616, 2807, 2993, 3181, 3382, 3608, 3859, 4124, 4394, 4661, 4918, 5163, 5397, 5623, 5834, 6021, 6176, 6295, 6372, 6409, 6415, 6396, 6357, 6304, 6244, 6176, 6101, 6028, 5965, 5909, 5867, 5853, 5870, 5905, 5953, 6019, 6095, 6164, 6227, 6292, 6360, 6431, 6519, 6625, 6735, 6841, 6957, 7078, 7186, 7288, 7396, 7496, 7561, 7603, 7630, 7619, 7558, 7480, 7398, 7283, 7140, 7012, 6897, 6755, 6614, 6512, + 6401, 6243, 6130, 6092, 5979, 5764, 5683, 5765, 5648, 5285, 5232, 5579, 5395, 4242, 3459, 4476, 6459, 7348, 6842, 6406, 6492, 5988, 4771, 4501, 5994, 7740, 8150, 7689, 7617, 7990, 8131, 7945, 7521, 6408, 4552, 3206, 3603, 5149, 6134, 5979, 5668, 5989, 6454, 6333, 5941, 6250, 7481, 8656 } + }, + { + {295, 121, 56, 302, 674, 814, 742, 879, 1387, 1727, 1099, -764, -3129, -4345, -2847, 963, 4014, 3108, -1285, -4935, -4324, -274, 3679, 5406, 5402, 4734, 3554, 1766, -206, -1881, -3248, -4465, -5475, -6180, -6653, -6960, -7002, -6683, -6073, -5319, -4532, -3785, -3126, -2555, -2041, -1573, -1142, -719, -282, 147, 540, 893, 1209, 1475, 1688, 1874, 2055, 2237, 2427, 2632, 2853, 3084, 3326, 3582, 3840, 4087, 4326, 4569, 4811, 5037, 5243, 5437, 5616, 5762, 5856, 5900, 5900, 5839, 5700, 5491, 5246, 4979, 4673, 4317, 3940, 3576, 3213, 2812, 2365, 1908, 1476, 1070, 672, 288, -56, -343, + -575, -770, -939, -1078, -1174, -1225, -1245, -1250, -1251, -1261, -1293, -1345, -1399, -1441, -1471, -1503, -1550, -1617, -1695, -1761, -1793, -1791, -1776, -1770, -1782, -1811, -1845, -1868, -1870, -1853, -1821, -1771, -1695, -1589, -1446, -1262, -1047, -817, -586, -365, -165, 5, 147, 261, 336, 363, 344, 287, 194, 80, -36, -142, -235, -311, -365, -397, -409, -391, -339, -255, -134, 33, 244, 484, 744, 1021, 1303, 1575, 1833, 2083, 2314, 2520, 2711, 2897, 3067, 3221, 3376, 3534, 3686, 3835, 3991, 4136, 4252, 4356, 4460, 4544, 4599, 4655, 4722, 4769, 4791, 4823, 4855, 4853, 4845, 4868, + 4869, 4820, 4815, 4877, 4856, 4735, 4747, 4898, 4825, 4504, 4485, 4810, 4530, 3268, 2422, 3422, 5430, 6388, 5923, 5392, 5301, 4766, 3723, 3556, 4858, 6322, 6690, 6344, 6201, 6310, 6274, 5945, 5081, 3491, 2065, 2387, 4582, 6704, 7105, 6378, 6055, 6405, 6630, 6459, 6282, 6123, 5650, 5093 }, + {-295, -121, -56, -302, -674, -814, -742, -879, -1387, -1727, -1099, 764, 3129, 4345, 2847, -963, -4014, -3108, 1285, 4935, 4324, 274, -3679, -5406, -5402, -4734, -3554, -1766, 206, 1881, 3248, 4465, 5475, 6180, 6653, 6960, 7002, 6683, 6073, 5319, 4532, 3785, 3126, 2555, 2041, 1573, 1142, 719, 282, -147, -540, -893, -1209, -1475, -1688, -1874, -2055, -2237, -2427, -2632, -2853, -3084, -3326, -3582, -3840, -4087, -4326, -4569, -4811, -5037, -5243, -5437, -5616, -5762, -5856, -5900, -5900, -5839, -5700, -5491, -5246, -4979, -4673, -4317, -3940, -3576, -3213, -2812, -2365, -1908, -1476, -1070, -672, -288, 56, 343, + 575, 770, 939, 1078, 1174, 1225, 1245, 1250, 1251, 1261, 1293, 1345, 1399, 1441, 1471, 1503, 1550, 1617, 1695, 1761, 1793, 1791, 1776, 1770, 1782, 1811, 1845, 1868, 1870, 1853, 1821, 1771, 1695, 1589, 1446, 1262, 1047, 817, 586, 365, 165, -5, -147, -261, -336, -363, -344, -287, -194, -80, 36, 142, 235, 311, 365, 397, 409, 391, 339, 255, 134, -33, -244, -484, -744, -1021, -1303, -1575, -1833, -2083, -2314, -2520, -2711, -2897, -3067, -3221, -3376, -3534, -3686, -3835, -3991, -4136, -4252, -4356, -4460, -4544, -4599, -4655, -4722, -4769, -4791, -4823, -4855, -4853, -4845, -4868, + -4869, -4820, -4815, -4877, -4856, -4735, -4747, -4898, -4825, -4504, -4485, -4810, -4530, -3268, -2422, -3422, -5430, -6388, -5923, -5392, -5301, -4766, -3723, -3556, -4858, -6322, -6690, -6344, -6201, -6310, -6274, -5945, -5081, -3491, -2065, -2387, -4582, -6704, -7105, -6378, -6055, -6405, -6630, -6459, -6282, -6123, -5650, -5093 } + }, + { + {451, -284, -385, 434, 654, -566, -1583, -340, 2489, 3978, 2454, -721, -2967, -2908, -915, 1487, 2391, 883, -1680, -2678, -1112, 1279, 2268, 1608, 603, 115, 2, 39, 353, 979, 1658, 2169, 2488, 2620, 2559, 2376, 2141, 1807, 1308, 696, 88, -447, -878, -1174, -1340, -1441, -1534, -1635, -1740, -1846, -1932, -1974, -1975, -1942, -1854, -1672, -1380, -989, -506, 61, 696, 1373, 2071, 2777, 3482, 4164, 4797, 5356, 5819, 6163, 6358, 6382, 6225, 5891, 5390, 4750, 4003, 3172, 2281, 1370, 482, -372, -1207, -2021, -2774, -3440, -4033, -4582, -5088, -5535, -5921, -6257, -6538, -6740, -6851, -6871, + -6799, -6621, -6329, -5936, -5465, -4922, -4303, -3617, -2897, -2202, -1582, -1041, -544, -59, 399, 787, 1075, 1265, 1383, 1466, 1540, 1602, 1638, 1645, 1639, 1639, 1655, 1697, 1764, 1840, 1913, 1979, 2038, 2075, 2079, 2051, 1991, 1896, 1774, 1639, 1498, 1351, 1208, 1081, 962, 843, 731, 633, 537, 436, 338, 244, 146, 48, -37, -112, -189, -262, -319, -367, -415, -445, -444, -429, -406, -360, -293, -229, -169, -96, -15, 55, 131, 230, 333, 421, 515, 623, 717, 784, 845, 889, 874, 816, 753, 668, 525, 363, 227, 75, -120, -299, -439, -602, -790, -923, + -1032, -1207, -1371, -1416, -1487, -1721, -1884, -1793, -1810, -2202, -2434, -2092, -1997, -2977, -3962, -3110, -766, 704, 268, -641, -864, -1212, -2411, -3272, -2388, -382, 926, 826, 108, -358, -622, -1452, -3334, -5423, -5796, -3576, -527, 600, -722, -2411, -2675, -1984, -1724, -2119, -2372, -2107, -1700, -1500 }, + {-451, 284, 385, -434, -654, 566, 1583, 340, -2489, -3978, -2454, 721, 2967, 2908, 915, -1487, -2391, -883, 1680, 2678, 1112, -1279, -2268, -1608, -603, -115, -2, -39, -353, -979, -1658, -2169, -2488, -2620, -2559, -2376, -2141, -1807, -1308, -696, -88, 447, 878, 1174, 1340, 1441, 1534, 1635, 1740, 1846, 1932, 1974, 1975, 1942, 1854, 1672, 1380, 989, 506, -61, -696, -1373, -2071, -2777, -3482, -4164, -4797, -5356, -5819, -6163, -6358, -6382, -6225, -5891, -5390, -4750, -4003, -3172, -2281, -1370, -482, 372, 1207, 2021, 2774, 3440, 4033, 4582, 5088, 5535, 5921, 6257, 6538, 6740, 6851, 6871, + 6799, 6621, 6329, 5936, 5465, 4922, 4303, 3617, 2897, 2202, 1582, 1041, 544, 59, -399, -787, -1075, -1265, -1383, -1466, -1540, -1602, -1638, -1645, -1639, -1639, -1655, -1697, -1764, -1840, -1913, -1979, -2038, -2075, -2079, -2051, -1991, -1896, -1774, -1639, -1498, -1351, -1208, -1081, -962, -843, -731, -633, -537, -436, -338, -244, -146, -48, 37, 112, 189, 262, 319, 367, 415, 445, 444, 429, 406, 360, 293, 229, 169, 96, 15, -55, -131, -230, -333, -421, -515, -623, -717, -784, -845, -889, -874, -816, -753, -668, -525, -363, -227, -75, 120, 299, 439, 602, 790, 923, + 1032, 1207, 1371, 1416, 1487, 1721, 1884, 1793, 1810, 2202, 2434, 2092, 1997, 2977, 3962, 3110, 766, -704, -268, 641, 864, 1212, 2411, 3272, 2388, 382, -926, -826, -108, 358, 622, 1452, 3334, 5423, 5796, 3576, 527, -600, 722, 2411, 2675, 1984, 1724, 2119, 2372, 2107, 1700, 1500 } + }, + { + {-184, 60, -7, -514, -945, -1110, -1578, -2682, -3686, -3424, -1330, 2351, 6350, 7971, 4667, -2310, -7226, -5359, 1215, 5733, 4597, 630, -1784, -1865, -1414, -1152, -404, 808, 1516, 1373, 1002, 887, 916, 955, 1092, 1319, 1482, 1546, 1596, 1647, 1662, 1648, 1599, 1465, 1258, 1064, 900, 711, 483, 261, 41, -221, -523, -831, -1150, -1491, -1825, -2122, -2391, -2636, -2832, -2970, -3055, -3075, -3001, -2830, -2571, -2214, -1747, -1191, -573, 104, 839, 1608, 2382, 3144, 3880, 4571, 5197, 5742, 6188, 6529, 6774, 6924, 6963, 6886, 6712, 6452, 6101, 5661, 5136, 4516, 3785, 2965, 2105, 1242, + 385, -456, -1252, -1954, -2506, -2870, -3058, -3112, -3062, -2904, -2630, -2262, -1839, -1405, -1003, -663, -394, -191, -54, 18, 23, -44, -192, -411, -672, -947, -1221, -1487, -1743, -1997, -2253, -2507, -2755, -3005, -3270, -3550, -3840, -4134, -4431, -4728, -5028, -5339, -5667, -6006, -6344, -6664, -6952, -7196, -7394, -7546, -7649, -7703, -7717, -7700, -7657, -7593, -7517, -7437, -7356, -7273, -7192, -7116, -7044, -6977, -6915, -6857, -6799, -6737, -6667, -6589, -6506, -6427, -6359, -6299, -6240, -6180, -6119, -6050, -5966, -5866, -5754, -5625, -5478, -5318, -5148, -4963, -4763, -4558, -4353, -4141, -3929, -3734, -3559, -3390, -3230, -3091, + -2961, -2826, -2704, -2601, -2480, -2337, -2232, -2174, -2075, -1933, -1884, -1934, -1872, -1666, -1660, -2041, -2425, -2418, -2251, -2290, -2273, -1805, -1340, -1724, -2816, -3539, -3392, -2970, -2858, -2955, -3055, -3143, -2918, -2083, -1350, -1969, -3857, -5377, -5529, -5096, -5018, -5013, -4752, -4856, -5362, -4610, -1599, 1513 }, + {-184, 60, -7, -514, -945, -1110, -1578, -2682, -3686, -3424, -1330, 2351, 6350, 7971, 4667, -2310, -7226, -5359, 1215, 5733, 4597, 630, -1784, -1865, -1414, -1152, -404, 808, 1516, 1373, 1002, 887, 916, 955, 1092, 1319, 1482, 1546, 1596, 1647, 1662, 1648, 1599, 1465, 1258, 1064, 900, 711, 483, 261, 41, -221, -523, -831, -1150, -1491, -1825, -2122, -2391, -2636, -2832, -2970, -3055, -3075, -3001, -2830, -2571, -2214, -1747, -1191, -573, 104, 839, 1608, 2382, 3144, 3880, 4571, 5197, 5742, 6188, 6529, 6774, 6924, 6963, 6886, 6712, 6452, 6101, 5661, 5136, 4516, 3785, 2965, 2105, 1242, + 385, -456, -1252, -1954, -2506, -2870, -3058, -3112, -3062, -2904, -2630, -2262, -1839, -1405, -1003, -663, -394, -191, -54, 18, 23, -44, -192, -411, -672, -947, -1221, -1487, -1743, -1997, -2253, -2507, -2755, -3005, -3270, -3550, -3840, -4134, -4431, -4728, -5028, -5339, -5667, -6006, -6344, -6664, -6952, -7196, -7394, -7546, -7649, -7703, -7717, -7700, -7657, -7593, -7517, -7437, -7356, -7273, -7192, -7116, -7044, -6977, -6915, -6857, -6799, -6737, -6667, -6589, -6506, -6427, -6359, -6299, -6240, -6180, -6119, -6050, -5966, -5866, -5754, -5625, -5478, -5318, -5148, -4963, -4763, -4558, -4353, -4141, -3929, -3734, -3559, -3390, -3230, -3091, + -2961, -2826, -2704, -2601, -2480, -2337, -2232, -2174, -2075, -1933, -1884, -1934, -1872, -1666, -1660, -2041, -2425, -2418, -2251, -2290, -2273, -1805, -1340, -1724, -2816, -3539, -3392, -2970, -2858, -2955, -3055, -3143, -2918, -2083, -1350, -1969, -3857, -5377, -5529, -5096, -5018, -5013, -4752, -4856, -5362, -4610, -1599, 1513 } + }, + { + {894, -27, -1303, -2224, -2159, -712, 1705, 3564, 3343, 1216, -991, -1783, -1338, -645, -82, 485, 811, 427, -446, -950, -670, -89, 208, 268, 486, 964, 1470, 1822, 1998, 1968, 1665, 1143, 578, 107, -281, -668, -1110, -1610, -2133, -2607, -2948, -3117, -3144, -3087, -2986, -2859, -2721, -2583, -2440, -2284, -2114, -1936, -1746, -1541, -1324, -1104, -875, -635, -391, -165, 28, 187, 309, 390, 430, 445, 460, 489, 525, 567, 633, 741, 888, 1065, 1279, 1555, 1900, 2303, 2753, 3248, 3779, 4328, 4873, 5394, 5882, 6339, 6756, 7102, 7354, 7535, 7690, 7819, 7865, 7776, 7559, 7248, + 6855, 6358, 5741, 5022, 4244, 3437, 2599, 1714, 797, -100, -940, -1723, -2479, -3228, -3965, -4654, -5251, -5739, -6137, -6471, -6749, -6964, -7112, -7196, -7227, -7227, -7215, -7196, -7163, -7120, -7072, -7017, -6943, -6838, -6686, -6480, -6235, -5983, -5733, -5477, -5203, -4901, -4560, -4180, -3789, -3421, -3082, -2762, -2459, -2173, -1888, -1602, -1340, -1124, -949, -804, -683, -573, -452, -314, -168, -21, 124, 257, 378, 504, 641, 781, 924, 1085, 1251, 1395, 1511, 1615, 1702, 1759, 1798, 1838, 1868, 1877, 1886, 1900, 1901, 1891, 1902, 1939, 1973, 2009, 2081, 2175, 2253, 2334, 2447, 2556, 2633, 2728, + 2858, 2947, 2990, 3094, 3247, 3296, 3265, 3373, 3581, 3571, 3378, 3491, 3947, 4005, 3282, 2591, 2860, 3726, 4119, 3884, 3781, 4006, 3826, 2926, 2140, 2325, 3137, 3547, 3206, 2713, 2559, 2382, 1561, 287, -409, 169, 1470, 2283, 2094, 1539, 1460, 1875, 2130, 1890, 1634, 2071, 3213, 4220 }, + {894, -27, -1303, -2224, -2159, -712, 1705, 3564, 3343, 1216, -991, -1783, -1338, -645, -82, 485, 811, 427, -446, -950, -670, -89, 208, 268, 486, 964, 1470, 1822, 1998, 1968, 1665, 1143, 578, 107, -281, -668, -1110, -1610, -2133, -2607, -2948, -3117, -3144, -3087, -2986, -2859, -2721, -2583, -2440, -2284, -2114, -1936, -1746, -1541, -1324, -1104, -875, -635, -391, -165, 28, 187, 309, 390, 430, 445, 460, 489, 525, 567, 633, 741, 888, 1065, 1279, 1555, 1900, 2303, 2753, 3248, 3779, 4328, 4873, 5394, 5882, 6339, 6756, 7102, 7354, 7535, 7690, 7819, 7865, 7776, 7559, 7248, + 6855, 6358, 5741, 5022, 4244, 3437, 2599, 1714, 797, -100, -940, -1723, -2479, -3228, -3965, -4654, -5251, -5739, -6137, -6471, -6749, -6964, -7112, -7196, -7227, -7227, -7215, -7196, -7163, -7120, -7072, -7017, -6943, -6838, -6686, -6480, -6235, -5983, -5733, -5477, -5203, -4901, -4560, -4180, -3789, -3421, -3082, -2762, -2459, -2173, -1888, -1602, -1340, -1124, -949, -804, -683, -573, -452, -314, -168, -21, 124, 257, 378, 504, 641, 781, 924, 1085, 1251, 1395, 1511, 1615, 1702, 1759, 1798, 1838, 1868, 1877, 1886, 1900, 1901, 1891, 1902, 1939, 1973, 2009, 2081, 2175, 2253, 2334, 2447, 2556, 2633, 2728, + 2858, 2947, 2990, 3094, 3247, 3296, 3265, 3373, 3581, 3571, 3378, 3491, 3947, 4005, 3282, 2591, 2860, 3726, 4119, 3884, 3781, 4006, 3826, 2926, 2140, 2325, 3137, 3547, 3206, 2713, 2559, 2382, 1561, 287, -409, 169, 1470, 2283, 2094, 1539, 1460, 1875, 2130, 1890, 1634, 2071, 3213, 4220 } + }, + { + {-429, 1125, 2275, 1911, 670, -1083, -3963, -7488, -9316, -7722, -3220, 2981, 9653, 13380, 9318, -2212, -12246, -11227, -253, 9913, 11359, 6411, 1748, -192, -1315, -2859, -4049, -4475, -4799, -5257, -5328, -4838, -4171, -3489, -2624, -1606, -654, 179, 935, 1523, 1878, 2113, 2331, 2485, 2538, 2551, 2534, 2428, 2257, 2120, 2035, 1950, 1858, 1774, 1666, 1507, 1326, 1140, 916, 651, 386, 128, -156, -462, -750, -1026, -1311, -1586, -1814, -2002, -2174, -2318, -2423, -2514, -2606, -2688, -2753, -2811, -2859, -2889, -2921, -2978, -3050, -3119, -3195, -3283, -3358, -3398, -3405, -3383, -3325, -3243, -3156, -3067, -2983, -2947, + -3004, -3152, -3361, -3621, -3944, -4323, -4732, -5140, -5507, -5804, -6031, -6204, -6309, -6322, -6244, -6096, -5895, -5655, -5394, -5119, -4818, -4493, -4174, -3882, -3615, -3364, -3116, -2848, -2549, -2242, -1957, -1694, -1440, -1193, -949, -695, -428, -164, 87, 335, 583, 826, 1069, 1323, 1584, 1837, 2077, 2304, 2506, 2672, 2808, 2918, 2997, 3044, 3066, 3062, 3024, 2957, 2873, 2769, 2644, 2514, 2387, 2256, 2117, 1984, 1861, 1736, 1609, 1498, 1409, 1337, 1283, 1253, 1236, 1219, 1209, 1205, 1194, 1175, 1169, 1182, 1199, 1215, 1245, 1281, 1302, 1316, 1335, 1348, 1349, 1359, 1388, 1411, 1426, 1457, + 1493, 1502, 1509, 1548, 1568, 1532, 1520, 1586, 1610, 1523, 1506, 1666, 1717, 1416, 1137, 1462, 2262, 2784, 2698, 2461, 2517, 2694, 2634, 2379, 2223, 2293, 2512, 2772, 2967, 3033, 3037, 3065, 2899, 2057, 434, -1202, -1771, -1117, -314, -295, -586, -198, 504, 272, -406, 1029, 5545, 9923 }, + {-429, 1125, 2275, 1911, 670, -1083, -3963, -7488, -9316, -7722, -3220, 2981, 9653, 13380, 9318, -2212, -12246, -11227, -253, 9913, 11359, 6411, 1748, -192, -1315, -2859, -4049, -4475, -4799, -5257, -5328, -4838, -4171, -3489, -2624, -1606, -654, 179, 935, 1523, 1878, 2113, 2331, 2485, 2538, 2551, 2534, 2428, 2257, 2120, 2035, 1950, 1858, 1774, 1666, 1507, 1326, 1140, 916, 651, 386, 128, -156, -462, -750, -1026, -1311, -1586, -1814, -2002, -2174, -2318, -2423, -2514, -2606, -2688, -2753, -2811, -2859, -2889, -2921, -2978, -3050, -3119, -3195, -3283, -3358, -3398, -3405, -3383, -3325, -3243, -3156, -3067, -2983, -2947, + -3004, -3152, -3361, -3621, -3944, -4323, -4732, -5140, -5507, -5804, -6031, -6204, -6309, -6322, -6244, -6096, -5895, -5655, -5394, -5119, -4818, -4493, -4174, -3882, -3615, -3364, -3116, -2848, -2549, -2242, -1957, -1694, -1440, -1193, -949, -695, -428, -164, 87, 335, 583, 826, 1069, 1323, 1584, 1837, 2077, 2304, 2506, 2672, 2808, 2918, 2997, 3044, 3066, 3062, 3024, 2957, 2873, 2769, 2644, 2514, 2387, 2256, 2117, 1984, 1861, 1736, 1609, 1498, 1409, 1337, 1283, 1253, 1236, 1219, 1209, 1205, 1194, 1175, 1169, 1182, 1199, 1215, 1245, 1281, 1302, 1316, 1335, 1348, 1349, 1359, 1388, 1411, 1426, 1457, + 1493, 1502, 1509, 1548, 1568, 1532, 1520, 1586, 1610, 1523, 1506, 1666, 1717, 1416, 1137, 1462, 2262, 2784, 2698, 2461, 2517, 2694, 2634, 2379, 2223, 2293, 2512, 2772, 2967, 3033, 3037, 3065, 2899, 2057, 434, -1202, -1771, -1117, -314, -295, -586, -198, 504, 272, -406, 1029, 5545, 9923 } + }, + { + {-121, -149, -18, 371, 1162, 2496, 3803, 3951, 2615, 317, -3142, -7843, -10515, -6004, 4954, 12857, 9200, -2496, -10355, -8261, -1357, 2728, 2786, 2170, 2467, 2567, 1848, 1062, 638, 189, -429, -863, -957, -906, -825, -691, -543, -427, -289, -117, 0, 42, 98, 191, 245, 241, 240, 257, 258, 254, 291, 369, 463, 574, 704, 827, 928, 1016, 1089, 1131, 1149, 1161, 1164, 1142, 1101, 1053, 991, 908, 814, 718, 614, 497, 376, 246, 92, -91, -297, -524, -769, -1024, -1282, -1551, -1831, -2100, -2335, -2538, -2717, -2869, -2982, -3042, -3039, -2979, -2876, -2742, -2581, -2404, + -2232, -2080, -1949, -1844, -1774, -1747, -1756, -1784, -1819, -1859, -1917, -2001, -2104, -2205, -2296, -2377, -2454, -2532, -2607, -2671, -2711, -2725, -2725, -2723, -2722, -2716, -2695, -2646, -2564, -2458, -2339, -2206, -2055, -1880, -1680, -1453, -1208, -961, -719, -482, -253, -33, 182, 392, 587, 755, 899, 1022, 1127, 1220, 1315, 1415, 1517, 1622, 1730, 1837, 1936, 2036, 2142, 2247, 2354, 2472, 2599, 2723, 2843, 2965, 3080, 3177, 3264, 3350, 3425, 3482, 3541, 3607, 3669, 3727, 3799, 3884, 3965, 4049, 4146, 4232, 4288, 4340, 4406, 4454, 4474, 4510, 4568, 4598, 4606, 4641, 4685, 4688, 4692, 4743, + 4759, 4707, 4721, 4823, 4797, 4631, 4658, 4881, 4786, 4353, 4352, 4843, 4520, 2898, 1944, 3594, 6549, 7831, 6953, 5975, 5738, 4985, 3538, 3369, 5409, 7758, 8401, 7760, 7297, 7306, 7257, 6889, 5936, 4158, 2481, 2604, 4591, 6339, 6388, 5696, 5646, 5960, 5911, 5900, 6100, 5047, 1803, -1450 }, + {121, 149, 18, -371, -1162, -2496, -3803, -3951, -2615, -317, 3142, 7843, 10515, 6004, -4954, -12857, -9200, 2496, 10355, 8261, 1357, -2728, -2786, -2170, -2467, -2567, -1848, -1062, -638, -189, 429, 863, 957, 906, 825, 691, 543, 427, 289, 117, 0, -42, -98, -191, -245, -241, -240, -257, -258, -254, -291, -369, -463, -574, -704, -827, -928, -1016, -1089, -1131, -1149, -1161, -1164, -1142, -1101, -1053, -991, -908, -814, -718, -614, -497, -376, -246, -92, 91, 297, 524, 769, 1024, 1282, 1551, 1831, 2100, 2335, 2538, 2717, 2869, 2982, 3042, 3039, 2979, 2876, 2742, 2581, 2404, + 2232, 2080, 1949, 1844, 1774, 1747, 1756, 1784, 1819, 1859, 1917, 2001, 2104, 2205, 2296, 2377, 2454, 2532, 2607, 2671, 2711, 2725, 2725, 2723, 2722, 2716, 2695, 2646, 2564, 2458, 2339, 2206, 2055, 1880, 1680, 1453, 1208, 961, 719, 482, 253, 33, -182, -392, -587, -755, -899, -1022, -1127, -1220, -1315, -1415, -1517, -1622, -1730, -1837, -1936, -2036, -2142, -2247, -2354, -2472, -2599, -2723, -2843, -2965, -3080, -3177, -3264, -3350, -3425, -3482, -3541, -3607, -3669, -3727, -3799, -3884, -3965, -4049, -4146, -4232, -4288, -4340, -4406, -4454, -4474, -4510, -4568, -4598, -4606, -4641, -4685, -4688, -4692, -4743, + -4759, -4707, -4721, -4823, -4797, -4631, -4658, -4881, -4786, -4353, -4352, -4843, -4520, -2898, -1944, -3594, -6549, -7831, -6953, -5975, -5738, -4985, -3538, -3369, -5409, -7758, -8401, -7760, -7297, -7306, -7257, -6889, -5936, -4158, -2481, -2604, -4591, -6339, -6388, -5696, -5646, -5960, -5911, -5900, -6100, -5047, -1803, 1450 } + }, + { + {-44, 89, 208, 136, -311, -1097, -1534, -650, 1383, 2747, 1898, -317, -1588, -1037, 8, 236, -8, 159, 581, 538, 66, -178, -39, 6, -285, -569, -511, -206, 78, 248, 334, 329, 200, -34, -319, -591, -798, -927, -1017, -1103, -1168, -1170, -1103, -998, -888, -799, -752, -756, -793, -832, -851, -838, -789, -704, -592, -464, -329, -188, -45, 96, 234, 368, 497, 612, 706, 781, 842, 889, 921, 941, 962, 987, 1010, 1033, 1067, 1125, 1210, 1323, 1475, 1677, 1929, 2225, 2557, 2924, 3329, 3769, 4225, 4673, 5095, 5487, 5846, 6147, 6350, 6427, 6372, 6192, + 5892, 5472, 4945, 4341, 3705, 3071, 2451, 1848, 1274, 765, 345, 4, -300, -605, -917, -1212, -1464, -1665, -1834, -1996, -2161, -2319, -2461, -2584, -2695, -2806, -2929, -3063, -3200, -3331, -3449, -3556, -3649, -3726, -3788, -3830, -3854, -3865, -3871, -3875, -3878, -3876, -3867, -3851, -3833, -3825, -3833, -3852, -3878, -3906, -3931, -3944, -3951, -3966, -3995, -4030, -4065, -4097, -4115, -4105, -4063, -3991, -3883, -3737, -3558, -3347, -3101, -2824, -2527, -2216, -1894, -1576, -1277, -999, -734, -489, -272, -69, 126, 305, 470, 633, 793, 932, 1058, 1197, 1339, 1463, 1583, 1724, 1862, 1971, 2078, 2197, 2290, 2355, + 2457, 2580, 2631, 2654, 2795, 2978, 2980, 2910, 3111, 3434, 3347, 3058, 3551, 4839, 5302, 3848, 1799, 1168, 1855, 2276, 2175, 2704, 3792, 3760, 2082, 492, 399, 948, 783, 182, 83, 256, 3, -189, 670, 2182, 2853, 2193, 1262, 1035, 1299, 1412, 1269, 1116, 1026, 946, 904, 914 }, + {44, -89, -208, -136, 311, 1097, 1534, 650, -1383, -2747, -1898, 317, 1588, 1037, -8, -236, 8, -159, -581, -538, -66, 178, 39, -6, 285, 569, 511, 206, -78, -248, -334, -329, -200, 34, 319, 591, 798, 927, 1017, 1103, 1168, 1170, 1103, 998, 888, 799, 752, 756, 793, 832, 851, 838, 789, 704, 592, 464, 329, 188, 45, -96, -234, -368, -497, -612, -706, -781, -842, -889, -921, -941, -962, -987, -1010, -1033, -1067, -1125, -1210, -1323, -1475, -1677, -1929, -2225, -2557, -2924, -3329, -3769, -4225, -4673, -5095, -5487, -5846, -6147, -6350, -6427, -6372, -6192, + -5892, -5472, -4945, -4341, -3705, -3071, -2451, -1848, -1274, -765, -345, -4, 300, 605, 917, 1212, 1464, 1665, 1834, 1996, 2161, 2319, 2461, 2584, 2695, 2806, 2929, 3063, 3200, 3331, 3449, 3556, 3649, 3726, 3788, 3830, 3854, 3865, 3871, 3875, 3878, 3876, 3867, 3851, 3833, 3825, 3833, 3852, 3878, 3906, 3931, 3944, 3951, 3966, 3995, 4030, 4065, 4097, 4115, 4105, 4063, 3991, 3883, 3737, 3558, 3347, 3101, 2824, 2527, 2216, 1894, 1576, 1277, 999, 734, 489, 272, 69, -126, -305, -470, -633, -793, -932, -1058, -1197, -1339, -1463, -1583, -1724, -1862, -1971, -2078, -2197, -2290, -2355, + -2457, -2580, -2631, -2654, -2795, -2978, -2980, -2910, -3111, -3434, -3347, -3058, -3551, -4839, -5302, -3848, -1799, -1168, -1855, -2276, -2175, -2704, -3792, -3760, -2082, -492, -399, -948, -783, -182, -83, -256, -3, 189, -670, -2182, -2853, -2193, -1262, -1035, -1299, -1412, -1269, -1116, -1026, -946, -904, -914 } + }, + { + {-514, -288, 206, 444, -21, -319, 967, 3413, 4317, 1434, -4183, -8371, -7137, -549, 6340, 7599, 2460, -3675, -5205, -2195, 1041, 1781, 1025, 456, 30, -805, -1561, -1526, -1006, -770, -938, -1097, -1037, -807, -388, 254, 971, 1575, 2025, 2361, 2588, 2719, 2808, 2869, 2872, 2820, 2745, 2646, 2498, 2310, 2100, 1839, 1491, 1066, 600, 114, -374, -832, -1249, -1645, -2032, -2400, -2735, -3035, -3288, -3470, -3555, -3527, -3378, -3110, -2731, -2247, -1659, -982, -247, 515, 1290, 2070, 2829, 3532, 4160, 4712, 5194, 5596, 5903, 6112, 6231, 6265, 6209, 6054, 5794, 5424, 4928, 4304, 3565, 2738, + 1843, 899, -57, -969, -1786, -2485, -3066, -3533, -3877, -4071, -4098, -3972, -3747, -3469, -3160, -2821, -2454, -2068, -1675, -1287, -923, -597, -313, -72, 131, 314, 494, 670, 828, 948, 1020, 1038, 1011, 951, 866, 752, 600, 410, 185, -68, -336, -612, -894, -1182, -1466, -1733, -1977, -2196, -2383, -2537, -2660, -2754, -2815, -2843, -2850, -2845, -2831, -2818, -2817, -2828, -2844, -2867, -2896, -2927, -2955, -2987, -3024, -3055, -3076, -3091, -3099, -3096, -3091, -3091, -3094, -3090, -3083, -3081, -3072, -3045, -3001, -2938, -2844, -2720, -2583, -2438, -2272, -2096, -1928, -1764, -1593, -1428, -1284, -1148, -1009, -886, + -786, -683, -574, -488, -424, -339, -244, -197, -186, -135, -67, -85, -185, -238, -215, -252, -412, -568, -602, -577, -603, -633, -520, -256, -70, -195, -536, -725, -606, -465, -530, -461, 157, 947, 950, -108, -1337, -1698, -1120, -364, -86, -288, -471, -252, 59, -362, -1753, -3096 }, + {514, 288, -206, -444, 21, 319, -967, -3413, -4317, -1434, 4183, 8371, 7137, 549, -6340, -7599, -2460, 3675, 5205, 2195, -1041, -1781, -1025, -456, -30, 805, 1561, 1526, 1006, 770, 938, 1097, 1037, 807, 388, -254, -971, -1575, -2025, -2361, -2588, -2719, -2808, -2869, -2872, -2820, -2745, -2646, -2498, -2310, -2100, -1839, -1491, -1066, -600, -114, 374, 832, 1249, 1645, 2032, 2400, 2735, 3035, 3288, 3470, 3555, 3527, 3378, 3110, 2731, 2247, 1659, 982, 247, -515, -1290, -2070, -2829, -3532, -4160, -4712, -5194, -5596, -5903, -6112, -6231, -6265, -6209, -6054, -5794, -5424, -4928, -4304, -3565, -2738, + -1843, -899, 57, 969, 1786, 2485, 3066, 3533, 3877, 4071, 4098, 3972, 3747, 3469, 3160, 2821, 2454, 2068, 1675, 1287, 923, 597, 313, 72, -131, -314, -494, -670, -828, -948, -1020, -1038, -1011, -951, -866, -752, -600, -410, -185, 68, 336, 612, 894, 1182, 1466, 1733, 1977, 2196, 2383, 2537, 2660, 2754, 2815, 2843, 2850, 2845, 2831, 2818, 2817, 2828, 2844, 2867, 2896, 2927, 2955, 2987, 3024, 3055, 3076, 3091, 3099, 3096, 3091, 3091, 3094, 3090, 3083, 3081, 3072, 3045, 3001, 2938, 2844, 2720, 2583, 2438, 2272, 2096, 1928, 1764, 1593, 1428, 1284, 1148, 1009, 886, + 786, 683, 574, 488, 424, 339, 244, 197, 186, 135, 67, 85, 185, 238, 215, 252, 412, 568, 602, 577, 603, 633, 520, 256, 70, 195, 536, 725, 606, 465, 530, 461, -157, -947, -950, 108, 1337, 1698, 1120, 364, 86, 288, 471, 252, -59, 362, 1753, 3096 } + }, + { + {-320, -395, -389, -161, 255, 659, 810, 492, -376, -1471, -2002, -1335, 151, 1210, 1008, -22, -848, -1050, -931, -729, -323, 289, 780, 949, 1003, 1167, 1308, 1123, 549, -194, -838, -1211, -1271, -1114, -921, -818, -799, -778, -692, -535, -350, -192, -79, 10, 99, 195, 302, 426, 559, 676, 765, 829, 865, 865, 827, 744, 608, 416, 186, -71, -350, -640, -928, -1216, -1512, -1807, -2089, -2366, -2644, -2903, -3112, -3258, -3334, -3319, -3196, -2974, -2664, -2271, -1802, -1281, -723, -132, 490, 1127, 1754, 2353, 2920, 3460, 3966, 4404, 4734, 4947, 5060, 5078, 4983, 4762, + 4420, 3977, 3472, 2949, 2436, 1923, 1397, 869, 375, -44, -357, -566, -710, -827, -910, -929, -870, -744, -567, -363, -157, 49, 276, 534, 813, 1102, 1395, 1674, 1922, 2146, 2358, 2549, 2709, 2839, 2939, 2991, 2985, 2936, 2848, 2711, 2530, 2315, 2062, 1761, 1423, 1064, 683, 280, -128, -526, -926, -1323, -1688, -2009, -2302, -2572, -2808, -3024, -3243, -3461, -3659, -3838, -3996, -4115, -4191, -4253, -4311, -4344, -4359, -4384, -4407, -4398, -4371, -4357, -4343, -4308, -4279, -4278, -4276, -4257, -4246, -4235, -4180, -4090, -4018, -3946, -3827, -3700, -3616, -3533, -3407, -3297, -3239, -3160, -3046, -2986, + -2960, -2857, -2746, -2763, -2769, -2584, -2441, -2590, -2669, -2313, -2061, -2474, -2741, -1765, -482, -1051, -3509, -5366, -5167, -4265, -4076, -3775, -2303, -851, -1373, -3626, -5464, -5612, -4756, -4092, -3811, -3099, -1276, 1019, 1927, 296, -2583, -4086, -3254, -1727, -1396, -2136, -2533, -2043, -1540, -1959, -3154, -4160 }, + {-320, -395, -389, -161, 255, 659, 810, 492, -376, -1471, -2002, -1335, 151, 1210, 1008, -22, -848, -1050, -931, -729, -323, 289, 780, 949, 1003, 1167, 1308, 1123, 549, -194, -838, -1211, -1271, -1114, -921, -818, -799, -778, -692, -535, -350, -192, -79, 10, 99, 195, 302, 426, 559, 676, 765, 829, 865, 865, 827, 744, 608, 416, 186, -71, -350, -640, -928, -1216, -1512, -1807, -2089, -2366, -2644, -2903, -3112, -3258, -3334, -3319, -3196, -2974, -2664, -2271, -1802, -1281, -723, -132, 490, 1127, 1754, 2353, 2920, 3460, 3966, 4404, 4734, 4947, 5060, 5078, 4983, 4762, + 4420, 3977, 3472, 2949, 2436, 1923, 1397, 869, 375, -44, -357, -566, -710, -827, -910, -929, -870, -744, -567, -363, -157, 49, 276, 534, 813, 1102, 1395, 1674, 1922, 2146, 2358, 2549, 2709, 2839, 2939, 2991, 2985, 2936, 2848, 2711, 2530, 2315, 2062, 1761, 1423, 1064, 683, 280, -128, -526, -926, -1323, -1688, -2009, -2302, -2572, -2808, -3024, -3243, -3461, -3659, -3838, -3996, -4115, -4191, -4253, -4311, -4344, -4359, -4384, -4407, -4398, -4371, -4357, -4343, -4308, -4279, -4278, -4276, -4257, -4246, -4235, -4180, -4090, -4018, -3946, -3827, -3700, -3616, -3533, -3407, -3297, -3239, -3160, -3046, -2986, + -2960, -2857, -2746, -2763, -2769, -2584, -2441, -2590, -2669, -2313, -2061, -2474, -2741, -1765, -482, -1051, -3509, -5366, -5167, -4265, -4076, -3775, -2303, -851, -1373, -3626, -5464, -5612, -4756, -4092, -3811, -3099, -1276, 1019, 1927, 296, -2583, -4086, -3254, -1727, -1396, -2136, -2533, -2043, -1540, -1959, -3154, -4160 } + }, + { + {-335, -397, -120, 540, 1151, 1417, 1243, 334, -1381, -2884, -2638, -455, 1922, 2594, 1388, -318, -1153, -751, 298, 1008, 718, -344, -1282, -1433, -914, -237, 303, 705, 1000, 1196, 1355, 1522, 1624, 1575, 1405, 1203, 994, 751, 488, 264, 115, 34, -7, -40, -92, -182, -323, -523, -774, -1037, -1272, -1454, -1578, -1643, -1662, -1664, -1676, -1707, -1757, -1830, -1930, -2054, -2191, -2324, -2430, -2486, -2481, -2409, -2268, -2063, -1811, -1538, -1258, -968, -675, -403, -167, 42, 242, 418, 541, 606, 640, 667, 682, 673, 667, 708, 819, 976, 1137, 1286, 1435, 1601, 1789, 1987, + 2183, 2369, 2537, 2687, 2835, 3010, 3224, 3465, 3704, 3922, 4117, 4294, 4445, 4551, 4597, 4580, 4509, 4392, 4223, 3991, 3689, 3322, 2910, 2476, 2034, 1587, 1128, 656, 182, -274, -691, -1060, -1388, -1696, -1996, -2286, -2541, -2740, -2874, -2954, -3000, -3026, -3041, -3044, -3027, -2974, -2882, -2757, -2609, -2438, -2247, -2047, -1852, -1665, -1486, -1316, -1153, -993, -835, -679, -529, -395, -288, -208, -147, -100, -67, -40, -12, 16, 35, 49, 68, 99, 144, 211, 303, 420, 558, 715, 877, 1019, 1133, 1228, 1303, 1347, 1368, 1383, 1388, 1370, 1339, 1304, 1250, 1173, 1100, 1039, + 957, 860, 804, 774, 697, 603, 600, 634, 535, 374, 405, 541, 341, -208, -436, 48, 646, 621, 193, 64, 212, 70, -285, -115, 698, 1318, 1184, 791, 813, 1102, 1143, 964, 930, 885, 241, -1003, -1962, -1918, -1219, -733, -668, -555, -261, -233, -488, -172, 1197, 2615 }, + {-335, -397, -120, 540, 1151, 1417, 1243, 334, -1381, -2884, -2638, -455, 1922, 2594, 1388, -318, -1153, -751, 298, 1008, 718, -344, -1282, -1433, -914, -237, 303, 705, 1000, 1196, 1355, 1522, 1624, 1575, 1405, 1203, 994, 751, 488, 264, 115, 34, -7, -40, -92, -182, -323, -523, -774, -1037, -1272, -1454, -1578, -1643, -1662, -1664, -1676, -1707, -1757, -1830, -1930, -2054, -2191, -2324, -2430, -2486, -2481, -2409, -2268, -2063, -1811, -1538, -1258, -968, -675, -403, -167, 42, 242, 418, 541, 606, 640, 667, 682, 673, 667, 708, 819, 976, 1137, 1286, 1435, 1601, 1789, 1987, + 2183, 2369, 2537, 2687, 2835, 3010, 3224, 3465, 3704, 3922, 4117, 4294, 4445, 4551, 4597, 4580, 4509, 4392, 4223, 3991, 3689, 3322, 2910, 2476, 2034, 1587, 1128, 656, 182, -274, -691, -1060, -1388, -1696, -1996, -2286, -2541, -2740, -2874, -2954, -3000, -3026, -3041, -3044, -3027, -2974, -2882, -2757, -2609, -2438, -2247, -2047, -1852, -1665, -1486, -1316, -1153, -993, -835, -679, -529, -395, -288, -208, -147, -100, -67, -40, -12, 16, 35, 49, 68, 99, 144, 211, 303, 420, 558, 715, 877, 1019, 1133, 1228, 1303, 1347, 1368, 1383, 1388, 1370, 1339, 1304, 1250, 1173, 1100, 1039, + 957, 860, 804, 774, 697, 603, 600, 634, 535, 374, 405, 541, 341, -208, -436, 48, 646, 621, 193, 64, 212, 70, -285, -115, 698, 1318, 1184, 791, 813, 1102, 1143, 964, 930, 885, 241, -1003, -1962, -1918, -1219, -733, -668, -555, -261, -233, -488, -172, 1197, 2615 } + }, + { + {315, 89, -27, -21, -172, -237, 502, 1855, 2126, 0, -3161, -4133, -1517, 2244, 3453, 1324, -1458, -2218, -1124, -87, 54, 146, 963, 2060, 2612, 2534, 2310, 2152, 1848, 1214, 335, -597, -1430, -2052, -2416, -2572, -2605, -2551, -2416, -2223, -2003, -1774, -1570, -1441, -1405, -1437, -1494, -1551, -1585, -1574, -1513, -1411, -1275, -1106, -920, -742, -595, -491, -437, -440, -496, -598, -733, -890, -1055, -1219, -1371, -1497, -1589, -1642, -1645, -1583, -1450, -1248, -979, -649, -273, 136, 561, 982, 1379, 1748, 2104, 2450, 2776, 3080, 3372, 3653, 3925, 4215, 4568, 4996, 5456, 5892, 6288, 6658, + 6997, 7266, 7406, 7385, 7201, 6875, 6420, 5838, 5145, 4374, 3561, 2722, 1853, 955, 46, -837, -1653, -2392, -3068, -3702, -4294, -4824, -5274, -5638, -5930, -6177, -6402, -6608, -6783, -6913, -6995, -7034, -7033, -6992, -6897, -6736, -6512, -6235, -5913, -5546, -5132, -4670, -4153, -3587, -2996, -2405, -1825, -1261, -716, -191, 320, 814, 1271, 1676, 2033, 2352, 2644, 2922, 3200, 3478, 3749, 3993, 4192, 4336, 4428, 4481, 4498, 4479, 4434, 4370, 4280, 4156, 4008, 3849, 3681, 3504, 3330, 3168, 3013, 2863, 2721, 2578, 2422, 2261, 2110, 1964, 1813, 1672, 1552, 1438, 1324, 1231, 1162, 1090, 1019, 976, + 943, 880, 818, 801, 770, 664, 575, 593, 591, 439, 325, 467, 597, 267, -339, -514, -36, 531, 720, 710, 746, 672, 414, 344, 703, 1131, 1216, 1118, 1220, 1527, 1831, 2095, 2268, 2077, 1480, 1025, 1248, 1905, 2286, 2169, 1960, 1966, 2043, 2060, 2271, 2983, 4031, 4815 }, + {315, 89, -27, -21, -172, -237, 502, 1855, 2126, 0, -3161, -4133, -1517, 2244, 3453, 1324, -1458, -2218, -1124, -87, 54, 146, 963, 2060, 2612, 2534, 2310, 2152, 1848, 1214, 335, -597, -1430, -2052, -2416, -2572, -2605, -2551, -2416, -2223, -2003, -1774, -1570, -1441, -1405, -1437, -1494, -1551, -1585, -1574, -1513, -1411, -1275, -1106, -920, -742, -595, -491, -437, -440, -496, -598, -733, -890, -1055, -1219, -1371, -1497, -1589, -1642, -1645, -1583, -1450, -1248, -979, -649, -273, 136, 561, 982, 1379, 1748, 2104, 2450, 2776, 3080, 3372, 3653, 3925, 4215, 4568, 4996, 5456, 5892, 6288, 6658, + 6997, 7266, 7406, 7385, 7201, 6875, 6420, 5838, 5145, 4374, 3561, 2722, 1853, 955, 46, -837, -1653, -2392, -3068, -3702, -4294, -4824, -5274, -5638, -5930, -6177, -6402, -6608, -6783, -6913, -6995, -7034, -7033, -6992, -6897, -6736, -6512, -6235, -5913, -5546, -5132, -4670, -4153, -3587, -2996, -2405, -1825, -1261, -716, -191, 320, 814, 1271, 1676, 2033, 2352, 2644, 2922, 3200, 3478, 3749, 3993, 4192, 4336, 4428, 4481, 4498, 4479, 4434, 4370, 4280, 4156, 4008, 3849, 3681, 3504, 3330, 3168, 3013, 2863, 2721, 2578, 2422, 2261, 2110, 1964, 1813, 1672, 1552, 1438, 1324, 1231, 1162, 1090, 1019, 976, + 943, 880, 818, 801, 770, 664, 575, 593, 591, 439, 325, 467, 597, 267, -339, -514, -36, 531, 720, 710, 746, 672, 414, 344, 703, 1131, 1216, 1118, 1220, 1527, 1831, 2095, 2268, 2077, 1480, 1025, 1248, 1905, 2286, 2169, 1960, 1966, 2043, 2060, 2271, 2983, 4031, 4815 } + }, + { + {-72, -60, -42, -28, -54, -164, -275, -154, 228, 324, -487, -1726, -1770, 215, 2595, 2691, 90, -2542, -2552, -316, 1624, 1719, 627, -317, -631, -517, -122, 500, 1128, 1516, 1632, 1581, 1439, 1275, 1181, 1164, 1114, 926, 598, 180, -277, -714, -1065, -1299, -1428, -1471, -1450, -1401, -1360, -1339, -1340, -1367, -1422, -1490, -1552, -1596, -1615, -1607, -1587, -1570, -1569, -1588, -1636, -1716, -1820, -1934, -2051, -2170, -2286, -2392, -2485, -2563, -2623, -2656, -2666, -2663, -2652, -2629, -2589, -2543, -2510, -2483, -2438, -2359, -2261, -2162, -2047, -1887, -1673, -1430, -1193, -979, -787, -612, -468, -380, + -358, -387, -441, -511, -613, -759, -941, -1128, -1279, -1371, -1407, -1408, -1391, -1354, -1286, -1177, -1029, -860, -687, -523, -368, -215, -57, 108, 280, 452, 624, 800, 980, 1161, 1334, 1493, 1630, 1744, 1836, 1913, 1981, 2043, 2105, 2172, 2250, 2342, 2454, 2591, 2753, 2941, 3151, 3376, 3606, 3830, 4041, 4226, 4381, 4508, 4604, 4665, 4688, 4677, 4630, 4544, 4420, 4267, 4088, 3886, 3669, 3448, 3225, 3002, 2785, 2581, 2394, 2230, 2096, 1986, 1889, 1800, 1722, 1642, 1550, 1450, 1353, 1252, 1146, 1037, 923, 788, 633, 474, 306, 118, -72, -238, -389, -542, -678, -790, + -911, -1041, -1132, -1207, -1343, -1498, -1548, -1557, -1709, -1899, -1835, -1665, -1889, -2372, -2206, -1114, -176, -344, -1011, -1122, -970, -1482, -2212, -1748, -85, 1090, 838, 156, 195, 686, 911, 1009, 1285, 1218, 287, -807, -874, 107, 1030, 1227, 1093, 1150, 1314, 1379, 1614, 2426, 3672, 4626 }, + {-72, -60, -42, -28, -54, -164, -275, -154, 228, 324, -487, -1726, -1770, 215, 2595, 2691, 90, -2542, -2552, -316, 1624, 1719, 627, -317, -631, -517, -122, 500, 1128, 1516, 1632, 1581, 1439, 1275, 1181, 1164, 1114, 926, 598, 180, -277, -714, -1065, -1299, -1428, -1471, -1450, -1401, -1360, -1339, -1340, -1367, -1422, -1490, -1552, -1596, -1615, -1607, -1587, -1570, -1569, -1588, -1636, -1716, -1820, -1934, -2051, -2170, -2286, -2392, -2485, -2563, -2623, -2656, -2666, -2663, -2652, -2629, -2589, -2543, -2510, -2483, -2438, -2359, -2261, -2162, -2047, -1887, -1673, -1430, -1193, -979, -787, -612, -468, -380, + -358, -387, -441, -511, -613, -759, -941, -1128, -1279, -1371, -1407, -1408, -1391, -1354, -1286, -1177, -1029, -860, -687, -523, -368, -215, -57, 108, 280, 452, 624, 800, 980, 1161, 1334, 1493, 1630, 1744, 1836, 1913, 1981, 2043, 2105, 2172, 2250, 2342, 2454, 2591, 2753, 2941, 3151, 3376, 3606, 3830, 4041, 4226, 4381, 4508, 4604, 4665, 4688, 4677, 4630, 4544, 4420, 4267, 4088, 3886, 3669, 3448, 3225, 3002, 2785, 2581, 2394, 2230, 2096, 1986, 1889, 1800, 1722, 1642, 1550, 1450, 1353, 1252, 1146, 1037, 923, 788, 633, 474, 306, 118, -72, -238, -389, -542, -678, -790, + -911, -1041, -1132, -1207, -1343, -1498, -1548, -1557, -1709, -1899, -1835, -1665, -1889, -2372, -2206, -1114, -176, -344, -1011, -1122, -970, -1482, -2212, -1748, -85, 1090, 838, 156, 195, 686, 911, 1009, 1285, 1218, 287, -807, -874, 107, 1030, 1227, 1093, 1150, 1314, 1379, 1614, 2426, 3672, 4626 } + } +}; +const Word16 CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][L_FRAME48k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {-2898, -7932, -11166, -12449, -12178, -11005, -9558, -7837, -5224, -1561, 2352, 5801, 8559, 9399, 6016, -1285, -7118, -5634, 2040, 7966, 6108, -1520, -8602, -11836, -12357, -11868, -10448, -7949, -5126, -2687, -529, 1600, 3522, 5037, 6274, 7390, 8339, 9080, 9699, 10255, 10721, 11108, 11464, 11774, 11999, 12167, 12320, 12436, 12490, 12516, 12541, 12541, 12497, 12433, 12360, 12258, 12131, 12005, 11883, 11749, 11613, 11491, 11376, 11251, 11126, 11016, 10911, 10801, 10696, 10604, 10516, 10425, 10339, 10259, 10177, 10091, 10003, 9912, 9816, 9715, 9603, 9475, 9336, 9199, 9061, 8907, 8743, 8585, 8437, 8283, 8117, 7952, 7801, 7666, 7545, 7431, + 7324, 7235, 7175, 7141, 7116, 7088, 7066, 7058, 7065, 7077, 7086, 7082, 7065, 7045, 7030, 7014, 6984, 6937, 6875, 6801, 6723, 6647, 6571, 6488, 6396, 6300, 6202, 6105, 6009, 5915, 5819, 5719, 5619, 5525, 5438, 5360, 5293, 5234, 5180, 5130, 5088, 5052, 5022, 5002, 4991, 4981, 4970, 4954, 4934, 4905, 4870, 4828, 4778, 4719, 4651, 4575, 4493, 4406, 4318, 4230, 4143, 4060, 3982, 3909, 3841, 3781, 3728, 3680, 3637, 3597, 3556, 3511, 3464, 3417, 3369, 3321, 3276, 3234, 3194, 3156, 3127, 3103, 3080, 3063, 3053, 3043, 3028, 3014, 3000, 2978, 2947, 2916, 2882, 2835, 2781, 2734, + 2682, 2613, 2544, 2493, 2431, 2337, 2255, 2209, 2137, 2002, 1893, 1870, 1808, 1566, 1263, 1163, 1299, 1437, 1402, 1234, 1019, 816, 771, 1037, 1473, 1683, 1488, 1174, 1114, 1326, 1577, 1787, 2105, 2589, 3006, 3039, 2620, 1990, 1448, 1093, 842, 632, 491, 404, 256, 11, -163, -100 }, + {-2898, -7932, -11166, -12449, -12178, -11005, -9558, -7837, -5224, -1561, 2352, 5801, 8559, 9399, 6016, -1285, -7118, -5634, 2040, 7966, 6108, -1520, -8602, -11836, -12357, -11868, -10448, -7949, -5126, -2687, -529, 1600, 3522, 5037, 6274, 7390, 8339, 9080, 9699, 10255, 10721, 11108, 11464, 11774, 11999, 12167, 12320, 12436, 12490, 12516, 12541, 12541, 12497, 12433, 12360, 12258, 12131, 12005, 11883, 11749, 11613, 11491, 11376, 11251, 11126, 11016, 10911, 10801, 10696, 10604, 10516, 10425, 10339, 10259, 10177, 10091, 10003, 9912, 9816, 9715, 9603, 9475, 9336, 9199, 9061, 8907, 8743, 8585, 8437, 8283, 8117, 7952, 7801, 7666, 7545, 7431, + 7324, 7235, 7175, 7141, 7116, 7088, 7066, 7058, 7065, 7077, 7086, 7082, 7065, 7045, 7030, 7014, 6984, 6937, 6875, 6801, 6723, 6647, 6571, 6488, 6396, 6300, 6202, 6105, 6009, 5915, 5819, 5719, 5619, 5525, 5438, 5360, 5293, 5234, 5180, 5130, 5088, 5052, 5022, 5002, 4991, 4981, 4970, 4954, 4934, 4905, 4870, 4828, 4778, 4719, 4651, 4575, 4493, 4406, 4318, 4230, 4143, 4060, 3982, 3909, 3841, 3781, 3728, 3680, 3637, 3597, 3556, 3511, 3464, 3417, 3369, 3321, 3276, 3234, 3194, 3156, 3127, 3103, 3080, 3063, 3053, 3043, 3028, 3014, 3000, 2978, 2947, 2916, 2882, 2835, 2781, 2734, + 2682, 2613, 2544, 2493, 2431, 2337, 2255, 2209, 2137, 2002, 1893, 1870, 1808, 1566, 1263, 1163, 1299, 1437, 1402, 1234, 1019, 816, 771, 1037, 1473, 1683, 1488, 1174, 1114, 1326, 1577, 1787, 2105, 2589, 3006, 3039, 2620, 1990, 1448, 1093, 842, 632, 491, 404, 256, 11, -163, -100 } + }, + { + {2291, 5533, 5078, 129, -7537, -14811, -19452, -20404, -17160, -10532, -2920, 4186, 11409, 17451, 16347, 4322, -10966, -14939, -2772, 13554, 18716, 10538, -1178, -8399, -11376, -13049, -13631, -12331, -10129, -8429, -7094, -5402, -3527, -1971, -622, 827, 2271, 3546, 4770, 6021, 7164, 8150, 9081, 9950, 10651, 11221, 11761, 12232, 12548, 12767, 12983, 13171, 13290, 13386, 13485, 13535, 13518, 13481, 13425, 13306, 13139, 12977, 12807, 12591, 12357, 12151, 11952, 11733, 11521, 11350, 11200, 11055, 10941, 10873, 10830, 10801, 10796, 10812, 10833, 10861, 10893, 10908, 10902, 10900, 10906, 10890, 10847, 10810, 10793, 10775, 10756, 10752, 10763, 10768, 10769, 10768, + 10744, 10678, 10578, 10448, 10269, 10033, 9761, 9467, 9148, 8809, 8465, 8122, 7787, 7488, 7249, 7060, 6901, 6770, 6663, 6574, 6503, 6466, 6454, 6438, 6401, 6345, 6272, 6185, 6105, 6044, 5990, 5930, 5871, 5820, 5770, 5718, 5673, 5637, 5599, 5560, 5530, 5509, 5486, 5468, 5461, 5460, 5462, 5474, 5500, 5530, 5559, 5591, 5620, 5636, 5641, 5641, 5633, 5607, 5571, 5529, 5475, 5402, 5322, 5235, 5135, 5021, 4904, 4784, 4650, 4508, 4365, 4218, 4065, 3917, 3779, 3642, 3502, 3370, 3241, 3102, 2956, 2817, 2683, 2551, 2432, 2331, 2230, 2127, 2036, 1953, 1855, 1749, 1656, 1564, 1458, 1355, + 1263, 1154, 1035, 945, 855, 704, 552, 487, 402, 164, -57, -58, -136, -725, -1494, -1595, -972, -531, -736, -1046, -1165, -1746, -3103, -4257, -4186, -3316, -2860, -3263, -4042, -4677, -5011, -5306, -6256, -8189, -9875, -9216, -5866, -2166, -582, -1039, -1732, -1800, -1959, -2847, -3924, -4173, -3153, -1164 }, + {-2291, -5533, -5078, -129, 7537, 14811, 19452, 20404, 17160, 10532, 2920, -4186, -11409, -17451, -16347, -4322, 10966, 14939, 2772, -13554, -18716, -10538, 1178, 8399, 11376, 13049, 13631, 12331, 10129, 8429, 7094, 5402, 3527, 1971, 622, -827, -2271, -3546, -4770, -6021, -7164, -8150, -9081, -9950, -10651, -11221, -11761, -12232, -12548, -12767, -12983, -13171, -13290, -13386, -13485, -13535, -13518, -13481, -13425, -13306, -13139, -12977, -12807, -12591, -12357, -12151, -11952, -11733, -11521, -11350, -11200, -11055, -10941, -10873, -10830, -10801, -10796, -10812, -10833, -10861, -10893, -10908, -10902, -10900, -10906, -10890, -10847, -10810, -10793, -10775, -10756, -10752, -10763, -10768, -10769, -10768, + -10744, -10678, -10578, -10448, -10269, -10033, -9761, -9467, -9148, -8809, -8465, -8122, -7787, -7488, -7249, -7060, -6901, -6770, -6663, -6574, -6503, -6466, -6454, -6438, -6401, -6345, -6272, -6185, -6105, -6044, -5990, -5930, -5871, -5820, -5770, -5718, -5673, -5637, -5599, -5560, -5530, -5509, -5486, -5468, -5461, -5460, -5462, -5474, -5500, -5530, -5559, -5591, -5620, -5636, -5641, -5641, -5633, -5607, -5571, -5529, -5475, -5402, -5322, -5235, -5135, -5021, -4904, -4784, -4650, -4508, -4365, -4218, -4065, -3917, -3779, -3642, -3502, -3370, -3241, -3102, -2956, -2817, -2683, -2551, -2432, -2331, -2230, -2127, -2036, -1953, -1855, -1749, -1656, -1564, -1458, -1355, + -1263, -1154, -1035, -945, -855, -704, -552, -487, -402, -164, 57, 58, 136, 725, 1494, 1595, 972, 531, 736, 1046, 1165, 1746, 3103, 4257, 4186, 3316, 2860, 3263, 4042, 4677, 5011, 5306, 6256, 8189, 9875, 9216, 5866, 2166, 582, 1039, 1732, 1800, 1959, 2847, 3924, 4173, 3153, 1164 } + }, + { + {-275, -1118, -2142, -2317, -1107, 626, 1540, 1199, 188, -751, -1244, -1124, -317, 862, 1553, 995, -443, -1267, -386, 1446, 2273, 1099, -1121, -2762, -3208, -2942, -2525, -2107, -1683, -1301, -947, -553, -149, 157, 317, 359, 311, 220, 191, 307, 554, 872, 1232, 1631, 2050, 2474, 2915, 3391, 3905, 4458, 5047, 5655, 6246, 6798, 7304, 7747, 8104, 8365, 8535, 8611, 8581, 8438, 8183, 7811, 7311, 6678, 5921, 5059, 4106, 3081, 2015, 942, -108, -1101, -1998, -2777, -3433, -3962, -4346, -4577, -4679, -4692, -4627, -4470, -4225, -3940, -3659, -3380, -3069, -2718, -2365, -2050, -1783, -1546, -1334, -1155, + -1027, -961, -967, -1037, -1154, -1297, -1461, -1645, -1850, -2068, -2275, -2437, -2534, -2576, -2580, -2552, -2481, -2364, -2198, -1981, -1717, -1424, -1112, -791, -475, -182, 85, 324, 524, 675, 780, 845, 871, 863, 835, 788, 723, 653, 604, 581, 580, 598, 628, 643, 624, 578, 521, 447, 353, 249, 141, 18, -113, -236, -350, -462, -566, -652, -732, -820, -907, -989, -1079, -1182, -1279, -1369, -1471, -1581, -1679, -1767, -1859, -1939, -1991, -2041, -2107, -2171, -2226, -2302, -2410, -2526, -2655, -2823, -3008, -3164, -3309, -3471, -3608, -3684, -3744, -3815, -3837, -3795, -3760, -3736, -3650, -3535, + -3480, -3407, -3224, -3077, -3076, -2977, -2638, -2437, -2570, -2474, -1848, -1549, -2138, -2304, -591, 1818, 2292, 572, -987, -1149, -1137, -1671, -1360, 644, 2624, 2597, 1061, -94, -247, -257, -801, -1612, -1902, -984, 945, 2403, 1889, -164, -1662, -1403, -344, 93, -81, 11, 531, 854, 661, 225 }, + {-275, -1118, -2142, -2317, -1107, 626, 1540, 1199, 188, -751, -1244, -1124, -317, 862, 1553, 995, -443, -1267, -386, 1446, 2273, 1099, -1121, -2762, -3208, -2942, -2525, -2107, -1683, -1301, -947, -553, -149, 157, 317, 359, 311, 220, 191, 307, 554, 872, 1232, 1631, 2050, 2474, 2915, 3391, 3905, 4458, 5047, 5655, 6246, 6798, 7304, 7747, 8104, 8365, 8535, 8611, 8581, 8438, 8183, 7811, 7311, 6678, 5921, 5059, 4106, 3081, 2015, 942, -108, -1101, -1998, -2777, -3433, -3962, -4346, -4577, -4679, -4692, -4627, -4470, -4225, -3940, -3659, -3380, -3069, -2718, -2365, -2050, -1783, -1546, -1334, -1155, + -1027, -961, -967, -1037, -1154, -1297, -1461, -1645, -1850, -2068, -2275, -2437, -2534, -2576, -2580, -2552, -2481, -2364, -2198, -1981, -1717, -1424, -1112, -791, -475, -182, 85, 324, 524, 675, 780, 845, 871, 863, 835, 788, 723, 653, 604, 581, 580, 598, 628, 643, 624, 578, 521, 447, 353, 249, 141, 18, -113, -236, -350, -462, -566, -652, -732, -820, -907, -989, -1079, -1182, -1279, -1369, -1471, -1581, -1679, -1767, -1859, -1939, -1991, -2041, -2107, -2171, -2226, -2302, -2410, -2526, -2655, -2823, -3008, -3164, -3309, -3471, -3608, -3684, -3744, -3815, -3837, -3795, -3760, -3736, -3650, -3535, + -3480, -3407, -3224, -3077, -3076, -2977, -2638, -2437, -2570, -2474, -1848, -1549, -2138, -2304, -591, 1818, 2292, 572, -987, -1149, -1137, -1671, -1360, 644, 2624, 2597, 1061, -94, -247, -257, -801, -1612, -1902, -984, 945, 2403, 1889, -164, -1662, -1403, -344, 93, -81, 11, 531, 854, 661, 225 } + }, + { + {105, -6, -728, -1590, -1742, -915, 80, 154, -772, -1705, -1832, -1219, -149, 1338, 2614, 2219, -259, -2603, -1922, 1678, 4791, 4536, 1462, -1920, -4224, -5775, -7019, -7737, -7707, -7153, -6335, -5238, -3817, -2191, -506, 1157, 2721, 4092, 5232, 6154, 6865, 7387, 7772, 8054, 8226, 8296, 8303, 8264, 8154, 7957, 7689, 7369, 7015, 6671, 6385, 6171, 6007, 5865, 5731, 5585, 5412, 5214, 5003, 4783, 4557, 4330, 4107, 3879, 3630, 3350, 3043, 2713, 2351, 1951, 1522, 1089, 660, 232, -181, -545, -849, -1106, -1322, -1472, -1540, -1550, -1535, -1501, -1441, -1362, -1280, -1191, -1071, -909, -712, -486, + -217, 113, 508, 950, 1420, 1913, 2434, 2982, 3532, 4053, 4531, 4973, 5389, 5772, 6100, 6357, 6545, 6686, 6810, 6933, 7038, 7101, 7111, 7083, 7042, 7013, 7010, 7026, 7042, 7044, 7035, 7025, 7022, 7030, 7047, 7064, 7063, 7035, 6978, 6892, 6779, 6646, 6496, 6325, 6126, 5903, 5661, 5406, 5147, 4899, 4669, 4460, 4273, 4113, 3975, 3857, 3765, 3701, 3661, 3640, 3644, 3666, 3689, 3703, 3712, 3713, 3694, 3660, 3626, 3594, 3560, 3531, 3506, 3465, 3404, 3334, 3256, 3153, 3030, 2901, 2757, 2577, 2375, 2172, 1957, 1724, 1506, 1320, 1140, 964, 831, 736, 637, 547, 505, 471, + 406, 378, 419, 410, 323, 348, 510, 516, 329, 397, 781, 768, 168, 166, 1634, 3331, 3361, 1956, 980, 971, 785, 200, 571, 2235, 3433, 2845, 1470, 842, 855, 557, -159, -901, -1736, -2571, -2462, -835, 1180, 1903, 1256, 639, 840, 1196, 976, 584, 841, 1619, 1847, 831 }, + {105, -6, -728, -1590, -1742, -915, 80, 154, -772, -1705, -1832, -1219, -149, 1338, 2614, 2219, -259, -2603, -1922, 1678, 4791, 4536, 1462, -1920, -4224, -5775, -7019, -7737, -7707, -7153, -6335, -5238, -3817, -2191, -506, 1157, 2721, 4092, 5232, 6154, 6865, 7387, 7772, 8054, 8226, 8296, 8303, 8264, 8154, 7957, 7689, 7369, 7015, 6671, 6385, 6171, 6007, 5865, 5731, 5585, 5412, 5214, 5003, 4783, 4557, 4330, 4107, 3879, 3630, 3350, 3043, 2713, 2351, 1951, 1522, 1089, 660, 232, -181, -545, -849, -1106, -1322, -1472, -1540, -1550, -1535, -1501, -1441, -1362, -1280, -1191, -1071, -909, -712, -486, + -217, 113, 508, 950, 1420, 1913, 2434, 2982, 3532, 4053, 4531, 4973, 5389, 5772, 6100, 6357, 6545, 6686, 6810, 6933, 7038, 7101, 7111, 7083, 7042, 7013, 7010, 7026, 7042, 7044, 7035, 7025, 7022, 7030, 7047, 7064, 7063, 7035, 6978, 6892, 6779, 6646, 6496, 6325, 6126, 5903, 5661, 5406, 5147, 4899, 4669, 4460, 4273, 4113, 3975, 3857, 3765, 3701, 3661, 3640, 3644, 3666, 3689, 3703, 3712, 3713, 3694, 3660, 3626, 3594, 3560, 3531, 3506, 3465, 3404, 3334, 3256, 3153, 3030, 2901, 2757, 2577, 2375, 2172, 1957, 1724, 1506, 1320, 1140, 964, 831, 736, 637, 547, 505, 471, + 406, 378, 419, 410, 323, 348, 510, 516, 329, 397, 781, 768, 168, 166, 1634, 3331, 3361, 1956, 980, 971, 785, 200, 571, 2235, 3433, 2845, 1470, 842, 855, 557, -159, -901, -1736, -2571, -2462, -835, 1180, 1903, 1256, 639, 840, 1196, 976, 584, 841, 1619, 1847, 831 } + }, + { + {-68, -60, 188, 422, 342, 44, -94, -28, -268, -1240, -2625, -3404, -2505, 284, 3464, 4306, 1430, -2898, -4362, -1232, 3593, 5920, 4624, 1709, -879, -2889, -4614, -5797, -6123, -5826, -5286, -4551, -3562, -2434, -1288, -75, 1236, 2508, 3564, 4347, 4880, 5207, 5395, 5513, 5593, 5642, 5679, 5713, 5718, 5665, 5564, 5436, 5284, 5115, 4958, 4831, 4729, 4642, 4568, 4498, 4421, 4332, 4231, 4108, 3954, 3775, 3581, 3369, 3124, 2846, 2543, 2216, 1853, 1446, 1009, 559, 93, -391, -871, -1312, -1705, -2070, -2418, -2722, -2960, -3152, -3336, -3508, -3625, -3661, -3634, -3571, -3472, -3320, -3114, -2876, + -2630, -2389, -2147, -1896, -1642, -1405, -1199, -1026, -885, -772, -675, -572, -453, -328, -210, -108, -12, 91, 220, 383, 561, 729, 869, 989, 1104, 1230, 1379, 1553, 1740, 1933, 2130, 2335, 2546, 2758, 2964, 3148, 3292, 3389, 3440, 3447, 3414, 3354, 3274, 3174, 3056, 2935, 2827, 2741, 2690, 2684, 2725, 2805, 2916, 3056, 3219, 3399, 3597, 3815, 4042, 4274, 4510, 4741, 4946, 5116, 5254, 5354, 5411, 5430, 5424, 5395, 5339, 5273, 5207, 5133, 5050, 4971, 4898, 4817, 4727, 4635, 4531, 4401, 4261, 4133, 3998, 3846, 3706, 3589, 3462, 3318, 3192, 3081, 2951, 2822, 2730, 2636, + 2508, 2416, 2386, 2296, 2125, 2062, 2115, 1992, 1682, 1630, 1865, 1681, 951, 901, 2376, 4089, 4127, 2682, 1572, 1412, 1228, 793, 1194, 2630, 3595, 3062, 1886, 1257, 1101, 792, 233, -437, -1099, -1079, 457, 2888, 4168, 3275, 1561, 810, 1013, 1033, 546, 111, -101, -394, -627, -328 }, + {68, 60, -188, -422, -342, -44, 94, 28, 268, 1240, 2625, 3404, 2505, -284, -3464, -4306, -1430, 2898, 4362, 1232, -3593, -5920, -4624, -1709, 879, 2889, 4614, 5797, 6123, 5826, 5286, 4551, 3562, 2434, 1288, 75, -1236, -2508, -3564, -4347, -4880, -5207, -5395, -5513, -5593, -5642, -5679, -5713, -5718, -5665, -5564, -5436, -5284, -5115, -4958, -4831, -4729, -4642, -4568, -4498, -4421, -4332, -4231, -4108, -3954, -3775, -3581, -3369, -3124, -2846, -2543, -2216, -1853, -1446, -1009, -559, -93, 391, 871, 1312, 1705, 2070, 2418, 2722, 2960, 3152, 3336, 3508, 3625, 3661, 3634, 3571, 3472, 3320, 3114, 2876, + 2630, 2389, 2147, 1896, 1642, 1405, 1199, 1026, 885, 772, 675, 572, 453, 328, 210, 108, 12, -91, -220, -383, -561, -729, -869, -989, -1104, -1230, -1379, -1553, -1740, -1933, -2130, -2335, -2546, -2758, -2964, -3148, -3292, -3389, -3440, -3447, -3414, -3354, -3274, -3174, -3056, -2935, -2827, -2741, -2690, -2684, -2725, -2805, -2916, -3056, -3219, -3399, -3597, -3815, -4042, -4274, -4510, -4741, -4946, -5116, -5254, -5354, -5411, -5430, -5424, -5395, -5339, -5273, -5207, -5133, -5050, -4971, -4898, -4817, -4727, -4635, -4531, -4401, -4261, -4133, -3998, -3846, -3706, -3589, -3462, -3318, -3192, -3081, -2951, -2822, -2730, -2636, + -2508, -2416, -2386, -2296, -2125, -2062, -2115, -1992, -1682, -1630, -1865, -1681, -951, -901, -2376, -4089, -4127, -2682, -1572, -1412, -1228, -793, -1194, -2630, -3595, -3062, -1886, -1257, -1101, -792, -233, 437, 1099, 1079, -457, -2888, -4168, -3275, -1561, -810, -1013, -1033, -546, -111, 101, 394, 627, 328 } + }, + { + {-355, -388, 390, 557, -385, -808, 664, 2652, 2471, -323, -3239, -3752, -1743, 1028, 2660, 2129, -127, -2100, -1739, 737, 2845, 2685, 956, -387, -545, -125, 293, 723, 1188, 1424, 1275, 860, 325, -271, -850, -1343, -1786, -2229, -2599, -2783, -2761, -2585, -2295, -1941, -1603, -1327, -1095, -870, -635, -371, -64, 276, 632, 1014, 1441, 1897, 2345, 2753, 3104, 3378, 3552, 3615, 3567, 3407, 3130, 2726, 2194, 1541, 778, -86, -1031, -2021, -3018, -3980, -4869, -5652, -6310, -6835, -7214, -7435, -7518, -7501, -7394, -7180, -6854, -6457, -6024, -5559, -5045, -4483, -3889, -3261, -2587, -1868, -1122, -365, + 399, 1161, 1891, 2561, 3161, 3691, 4139, 4475, 4668, 4713, 4649, 4535, 4400, 4225, 3978, 3657, 3298, 2947, 2636, 2373, 2140, 1915, 1699, 1507, 1352, 1230, 1130, 1041, 942, 819, 676, 518, 339, 136, -79, -295, -506, -703, -873, -1014, -1130, -1220, -1281, -1324, -1363, -1392, -1406, -1416, -1429, -1436, -1432, -1425, -1413, -1383, -1341, -1300, -1254, -1192, -1122, -1054, -974, -876, -778, -693, -610, -527, -466, -428, -392, -360, -348, -347, -338, -341, -377, -428, -479, -559, -677, -810, -954, -1137, -1339, -1516, -1676, -1854, -2016, -2119, -2202, -2301, -2366, -2371, -2378, -2402, -2374, -2308, + -2290, -2271, -2152, -2043, -2065, -2033, -1789, -1626, -1763, -1757, -1278, -983, -1427, -1612, -256, 1763, 2161, 545, -1067, -1378, -1339, -1807, -1798, -369, 1371, 1622, 286, -1230, -1968, -2221, -2719, -3567, -3846, -2370, 631, 2941, 2511, 38, -1758, -1448, -249, 143, -272, -435, -23, 379, 375, 134 }, + {355, 388, -390, -557, 385, 808, -664, -2652, -2471, 323, 3239, 3752, 1743, -1028, -2660, -2129, 127, 2100, 1739, -737, -2845, -2685, -956, 387, 545, 125, -293, -723, -1188, -1424, -1275, -860, -325, 271, 850, 1343, 1786, 2229, 2599, 2783, 2761, 2585, 2295, 1941, 1603, 1327, 1095, 870, 635, 371, 64, -276, -632, -1014, -1441, -1897, -2345, -2753, -3104, -3378, -3552, -3615, -3567, -3407, -3130, -2726, -2194, -1541, -778, 86, 1031, 2021, 3018, 3980, 4869, 5652, 6310, 6835, 7214, 7435, 7518, 7501, 7394, 7180, 6854, 6457, 6024, 5559, 5045, 4483, 3889, 3261, 2587, 1868, 1122, 365, + -399, -1161, -1891, -2561, -3161, -3691, -4139, -4475, -4668, -4713, -4649, -4535, -4400, -4225, -3978, -3657, -3298, -2947, -2636, -2373, -2140, -1915, -1699, -1507, -1352, -1230, -1130, -1041, -942, -819, -676, -518, -339, -136, 79, 295, 506, 703, 873, 1014, 1130, 1220, 1281, 1324, 1363, 1392, 1406, 1416, 1429, 1436, 1432, 1425, 1413, 1383, 1341, 1300, 1254, 1192, 1122, 1054, 974, 876, 778, 693, 610, 527, 466, 428, 392, 360, 348, 347, 338, 341, 377, 428, 479, 559, 677, 810, 954, 1137, 1339, 1516, 1676, 1854, 2016, 2119, 2202, 2301, 2366, 2371, 2378, 2402, 2374, 2308, + 2290, 2271, 2152, 2043, 2065, 2033, 1789, 1626, 1763, 1757, 1278, 983, 1427, 1612, 256, -1763, -2161, -545, 1067, 1378, 1339, 1807, 1798, 369, -1371, -1622, -286, 1230, 1968, 2221, 2719, 3567, 3846, 2370, -631, -2941, -2511, -38, 1758, 1448, 249, -143, 272, 435, 23, -379, -375, -134 } + }, + { + {57, -102, -587, -844, -682, -591, -753, -438, 1085, 3516, 5720, 6347, 4080, -1232, -6737, -7622, -2219, 4767, 6686, 2454, -2714, -4103, -2297, -449, 342, 999, 1731, 1722, 883, 110, -85, -15, 1, 19, 58, -21, -231, -444, -627, -834, -1067, -1306, -1574, -1850, -2057, -2189, -2317, -2460, -2571, -2644, -2722, -2797, -2825, -2804, -2748, -2637, -2449, -2203, -1916, -1576, -1179, -744, -274, 240, 786, 1331, 1865, 2384, 2858, 3253, 3565, 3796, 3928, 3939, 3829, 3605, 3268, 2819, 2268, 1626, 910, 148, -645, -1469, -2313, -3149, -3957, -4739, -5492, -6201, -6863, -7473, -7998, -8390, -8629, -8729, + -8701, -8534, -8213, -7738, -7135, -6469, -5812, -5201, -4633, -4109, -3657, -3317, -3112, -3048, -3112, -3275, -3504, -3778, -4087, -4420, -4769, -5126, -5468, -5768, -6005, -6185, -6320, -6423, -6507, -6579, -6638, -6680, -6713, -6747, -6778, -6793, -6788, -6762, -6717, -6655, -6580, -6490, -6374, -6220, -6016, -5761, -5460, -5126, -4772, -4403, -4030, -3665, -3319, -2994, -2693, -2418, -2171, -1948, -1744, -1557, -1386, -1228, -1079, -936, -798, -659, -518, -376, -235, -99, 24, 135, 240, 351, 468, 591, 721, 862, 1010, 1158, 1304, 1447, 1583, 1705, 1818, 1920, 2002, 2059, 2099, 2120, 2110, 2074, 2030, 1980, 1914, 1841, + 1776, 1704, 1616, 1538, 1474, 1374, 1231, 1119, 1042, 893, 667, 533, 504, 308, -142, -455, -322, -58, -73, -165, 0, 42, -623, -1610, -1868, -1195, -487, -382, -577, -656, -624, -451, -77, -75, -1176, -2820, -3384, -2335, -955, -370, -171, 265, 570, 629, 1508, 3478, 4376, 2069 }, + {57, -102, -587, -844, -682, -591, -753, -438, 1085, 3516, 5720, 6347, 4080, -1232, -6737, -7622, -2219, 4767, 6686, 2454, -2714, -4103, -2297, -449, 342, 999, 1731, 1722, 883, 110, -85, -15, 1, 19, 58, -21, -231, -444, -627, -834, -1067, -1306, -1574, -1850, -2057, -2189, -2317, -2460, -2571, -2644, -2722, -2797, -2825, -2804, -2748, -2637, -2449, -2203, -1916, -1576, -1179, -744, -274, 240, 786, 1331, 1865, 2384, 2858, 3253, 3565, 3796, 3928, 3939, 3829, 3605, 3268, 2819, 2268, 1626, 910, 148, -645, -1469, -2313, -3149, -3957, -4739, -5492, -6201, -6863, -7473, -7998, -8390, -8629, -8729, + -8701, -8534, -8213, -7738, -7135, -6469, -5812, -5201, -4633, -4109, -3657, -3317, -3112, -3048, -3112, -3275, -3504, -3778, -4087, -4420, -4769, -5126, -5468, -5768, -6005, -6185, -6320, -6423, -6507, -6579, -6638, -6680, -6713, -6747, -6778, -6793, -6788, -6762, -6717, -6655, -6580, -6490, -6374, -6220, -6016, -5761, -5460, -5126, -4772, -4403, -4030, -3665, -3319, -2994, -2693, -2418, -2171, -1948, -1744, -1557, -1386, -1228, -1079, -936, -798, -659, -518, -376, -235, -99, 24, 135, 240, 351, 468, 591, 721, 862, 1010, 1158, 1304, 1447, 1583, 1705, 1818, 1920, 2002, 2059, 2099, 2120, 2110, 2074, 2030, 1980, 1914, 1841, + 1776, 1704, 1616, 1538, 1474, 1374, 1231, 1119, 1042, 893, 667, 533, 504, 308, -142, -455, -322, -58, -73, -165, 0, 42, -623, -1610, -1868, -1195, -487, -382, -577, -656, -624, -451, -77, -75, -1176, -2820, -3384, -2335, -955, -370, -171, 265, 570, 629, 1508, 3478, 4376, 2069 } + }, + { + {-581, -1340, -1168, -37, 1685, 3161, 3200, 1276, -1472, -3001, -2436, -824, 359, 771, 840, 650, 13, -706, -756, -38, 706, 889, 728, 716, 888, 921, 649, 166, -427, -1097, -1742, -2195, -2393, -2437, -2454, -2485, -2489, -2408, -2191, -1813, -1309, -765, -261, 173, 543, 862, 1136, 1382, 1613, 1830, 2028, 2208, 2375, 2523, 2646, 2746, 2827, 2880, 2892, 2860, 2798, 2720, 2633, 2548, 2484, 2462, 2481, 2527, 2592, 2686, 2815, 2966, 3120, 3278, 3450, 3628, 3783, 3896, 3959, 3962, 3891, 3733, 3484, 3152, 2750, 2281, 1736, 1115, 454, -206, -875, -1605, -2418, -3272, -4108, -4909, + -5689, -6448, -7154, -7763, -8258, -8656, -8978, -9210, -9317, -9290, -9163, -8979, -8756, -8475, -8109, -7640, -7086, -6493, -5897, -5304, -4707, -4106, -3511, -2937, -2400, -1906, -1446, -1004, -574, -158, 251, 665, 1091, 1528, 1968, 2388, 2763, 3094, 3402, 3703, 3996, 4278, 4539, 4752, 4894, 4978, 5032, 5066, 5080, 5084, 5078, 5041, 4962, 4862, 4766, 4681, 4615, 4577, 4561, 4549, 4528, 4498, 4458, 4411, 4371, 4342, 4311, 4272, 4231, 4181, 4098, 3984, 3865, 3746, 3617, 3488, 3380, 3281, 3180, 3092, 3027, 2966, 2907, 2877, 2877, 2871, 2859, 2868, 2886, 2875, 2847, 2836, 2814, 2752, 2692, 2658, + 2587, 2470, 2394, 2358, 2235, 2042, 1963, 1966, 1788, 1470, 1404, 1572, 1364, 614, 154, 646, 1445, 1468, 773, 286, 230, -79, -833, -1209, -636, 217, 309, -402, -1067, -1203, -1226, -1632, -2077, -1706, -332, 1098, 1484, 809, 86, 104, 603, 822, 564, 397, 822, 1530, 1651, 724 }, + {-581, -1340, -1168, -37, 1685, 3161, 3200, 1276, -1472, -3001, -2436, -824, 359, 771, 840, 650, 13, -706, -756, -38, 706, 889, 728, 716, 888, 921, 649, 166, -427, -1097, -1742, -2195, -2393, -2437, -2454, -2485, -2489, -2408, -2191, -1813, -1309, -765, -261, 173, 543, 862, 1136, 1382, 1613, 1830, 2028, 2208, 2375, 2523, 2646, 2746, 2827, 2880, 2892, 2860, 2798, 2720, 2633, 2548, 2484, 2462, 2481, 2527, 2592, 2686, 2815, 2966, 3120, 3278, 3450, 3628, 3783, 3896, 3959, 3962, 3891, 3733, 3484, 3152, 2750, 2281, 1736, 1115, 454, -206, -875, -1605, -2418, -3272, -4108, -4909, + -5689, -6448, -7154, -7763, -8258, -8656, -8978, -9210, -9317, -9290, -9163, -8979, -8756, -8475, -8109, -7640, -7086, -6493, -5897, -5304, -4707, -4106, -3511, -2937, -2400, -1906, -1446, -1004, -574, -158, 251, 665, 1091, 1528, 1968, 2388, 2763, 3094, 3402, 3703, 3996, 4278, 4539, 4752, 4894, 4978, 5032, 5066, 5080, 5084, 5078, 5041, 4962, 4862, 4766, 4681, 4615, 4577, 4561, 4549, 4528, 4498, 4458, 4411, 4371, 4342, 4311, 4272, 4231, 4181, 4098, 3984, 3865, 3746, 3617, 3488, 3380, 3281, 3180, 3092, 3027, 2966, 2907, 2877, 2877, 2871, 2859, 2868, 2886, 2875, 2847, 2836, 2814, 2752, 2692, 2658, + 2587, 2470, 2394, 2358, 2235, 2042, 1963, 1966, 1788, 1470, 1404, 1572, 1364, 614, 154, 646, 1445, 1468, 773, 286, 230, -79, -833, -1209, -636, 217, 309, -402, -1067, -1203, -1226, -1632, -2077, -1706, -332, 1098, 1484, 809, 86, 104, 603, 822, 564, 397, 822, 1530, 1651, 724 } + }, + { + {699, 1010, -462, -2357, -3671, -4661, -4960, -2993, 1630, 6886, 10465, 11261, 8024, -252, -10196, -13602, -5728, 7152, 13150, 7900, -1668, -7050, -7151, -5964, -5609, -5132, -3915, -2719, -1887, -868, 492, 1696, 2529, 3224, 3817, 4108, 4087, 3901, 3560, 3047, 2507, 2055, 1627, 1161, 717, 322, -77, -462, -752, -951, -1145, -1356, -1560, -1774, -2018, -2255, -2461, -2661, -2862, -3022, -3134, -3235, -3324, -3363, -3356, -3333, -3283, -3178, -3038, -2896, -2751, -2591, -2439, -2310, -2187, -2058, -1935, -1821, -1708, -1610, -1541, -1482, -1410, -1329, -1247, -1145, -1009, -857, -709, -569, -449, -370, -334, -340, -407, -547, + -725, -887, -1013, -1107, -1158, -1137, -1019, -796, -471, -74, 362, 831, 1340, 1870, 2384, 2860, 3294, 3679, 4018, 4324, 4600, 4825, 4992, 5121, 5237, 5351, 5474, 5601, 5705, 5765, 5789, 5804, 5816, 5823, 5831, 5838, 5826, 5788, 5738, 5682, 5614, 5534, 5450, 5353, 5227, 5070, 4889, 4680, 4441, 4184, 3922, 3652, 3376, 3103, 2836, 2570, 2312, 2075, 1859, 1660, 1487, 1348, 1229, 1123, 1040, 984, 941, 909, 901, 920, 952, 991, 1038, 1082, 1113, 1137, 1161, 1176, 1183, 1202, 1235, 1264, 1280, 1297, 1311, 1307, 1291, 1282, 1273, 1256, 1248, 1257, 1257, 1243, 1237, 1235, + 1209, 1177, 1173, 1160, 1105, 1074, 1112, 1120, 1040, 1016, 1135, 1169, 966, 875, 1291, 1908, 1997, 1444, 890, 778, 822, 626, 295, 161, 270, 415, 437, 289, -19, -398, -771, -1262, -2078, -3028, -3361, -2461, -745, 543, 739, 591, 1096, 1903, 1984, 1801, 3122, 5837, 6692, 3048 }, + {699, 1010, -462, -2357, -3671, -4661, -4960, -2993, 1630, 6886, 10465, 11261, 8024, -252, -10196, -13602, -5728, 7152, 13150, 7900, -1668, -7050, -7151, -5964, -5609, -5132, -3915, -2719, -1887, -868, 492, 1696, 2529, 3224, 3817, 4108, 4087, 3901, 3560, 3047, 2507, 2055, 1627, 1161, 717, 322, -77, -462, -752, -951, -1145, -1356, -1560, -1774, -2018, -2255, -2461, -2661, -2862, -3022, -3134, -3235, -3324, -3363, -3356, -3333, -3283, -3178, -3038, -2896, -2751, -2591, -2439, -2310, -2187, -2058, -1935, -1821, -1708, -1610, -1541, -1482, -1410, -1329, -1247, -1145, -1009, -857, -709, -569, -449, -370, -334, -340, -407, -547, + -725, -887, -1013, -1107, -1158, -1137, -1019, -796, -471, -74, 362, 831, 1340, 1870, 2384, 2860, 3294, 3679, 4018, 4324, 4600, 4825, 4992, 5121, 5237, 5351, 5474, 5601, 5705, 5765, 5789, 5804, 5816, 5823, 5831, 5838, 5826, 5788, 5738, 5682, 5614, 5534, 5450, 5353, 5227, 5070, 4889, 4680, 4441, 4184, 3922, 3652, 3376, 3103, 2836, 2570, 2312, 2075, 1859, 1660, 1487, 1348, 1229, 1123, 1040, 984, 941, 909, 901, 920, 952, 991, 1038, 1082, 1113, 1137, 1161, 1176, 1183, 1202, 1235, 1264, 1280, 1297, 1311, 1307, 1291, 1282, 1273, 1256, 1248, 1257, 1257, 1243, 1237, 1235, + 1209, 1177, 1173, 1160, 1105, 1074, 1112, 1120, 1040, 1016, 1135, 1169, 966, 875, 1291, 1908, 1997, 1444, 890, 778, 822, 626, 295, 161, 270, 415, 437, 289, -19, -398, -771, -1262, -2078, -3028, -3361, -2461, -745, 543, 739, 591, 1096, 1903, 1984, 1801, 3122, 5837, 6692, 3048 } + }, + { + {86, 356, 753, 1176, 1523, 1331, -52, -2381, -4521, -5940, -6475, -4328, 2458, 10678, 12071, 2924, -8950, -11902, -4151, 5035, 7541, 4600, 1813, 1124, 731, -352, -1224, -1380, -1369, -1472, -1349, -888, -401, -63, 199, 409, 533, 625, 717, 741, 689, 657, 671, 653, 586, 541, 540, 540, 539, 575, 638, 685, 709, 718, 694, 627, 537, 433, 308, 168, 36, -92, -231, -376, -511, -642, -777, -905, -1017, -1124, -1231, -1332, -1428, -1531, -1637, -1733, -1811, -1868, -1896, -1892, -1861, -1803, -1701, -1544, -1346, -1125, -883, -615, -318, -2, 314, 608, 868, 1090, 1271, 1400, + 1475, 1510, 1514, 1490, 1443, 1390, 1351, 1332, 1327, 1325, 1323, 1334, 1374, 1446, 1540, 1644, 1757, 1884, 2029, 2198, 2383, 2570, 2749, 2924, 3106, 3304, 3521, 3752, 3981, 4198, 4405, 4608, 4809, 5003, 5186, 5345, 5471, 5561, 5625, 5668, 5689, 5696, 5688, 5661, 5610, 5544, 5476, 5411, 5355, 5314, 5288, 5267, 5248, 5229, 5208, 5181, 5156, 5136, 5116, 5094, 5075, 5057, 5026, 4980, 4930, 4872, 4798, 4717, 4642, 4565, 4483, 4409, 4352, 4296, 4237, 4189, 4150, 4100, 4041, 3984, 3914, 3815, 3716, 3637, 3551, 3445, 3357, 3295, 3213, 3109, 3033, 2974, 2883, 2787, 2735, 2668, + 2546, 2472, 2477, 2388, 2189, 2148, 2272, 2148, 1767, 1760, 2160, 1984, 1068, 1104, 3200, 5478, 5265, 2942, 1217, 1023, 904, 409, 1065, 3209, 4659, 3791, 1804, 615, 327, -3, -672, -1514, -2389, -2580, -1157, 1223, 2393, 1456, 2, -382, -190, -477, -996, -1337, -2308, -4177, -4858, -2244 }, + {-86, -356, -753, -1176, -1523, -1331, 52, 2381, 4521, 5940, 6475, 4328, -2458, -10678, -12071, -2924, 8950, 11902, 4151, -5035, -7541, -4600, -1813, -1124, -731, 352, 1224, 1380, 1369, 1472, 1349, 888, 401, 63, -199, -409, -533, -625, -717, -741, -689, -657, -671, -653, -586, -541, -540, -540, -539, -575, -638, -685, -709, -718, -694, -627, -537, -433, -308, -168, -36, 92, 231, 376, 511, 642, 777, 905, 1017, 1124, 1231, 1332, 1428, 1531, 1637, 1733, 1811, 1868, 1896, 1892, 1861, 1803, 1701, 1544, 1346, 1125, 883, 615, 318, 2, -314, -608, -868, -1090, -1271, -1400, + -1475, -1510, -1514, -1490, -1443, -1390, -1351, -1332, -1327, -1325, -1323, -1334, -1374, -1446, -1540, -1644, -1757, -1884, -2029, -2198, -2383, -2570, -2749, -2924, -3106, -3304, -3521, -3752, -3981, -4198, -4405, -4608, -4809, -5003, -5186, -5345, -5471, -5561, -5625, -5668, -5689, -5696, -5688, -5661, -5610, -5544, -5476, -5411, -5355, -5314, -5288, -5267, -5248, -5229, -5208, -5181, -5156, -5136, -5116, -5094, -5075, -5057, -5026, -4980, -4930, -4872, -4798, -4717, -4642, -4565, -4483, -4409, -4352, -4296, -4237, -4189, -4150, -4100, -4041, -3984, -3914, -3815, -3716, -3637, -3551, -3445, -3357, -3295, -3213, -3109, -3033, -2974, -2883, -2787, -2735, -2668, + -2546, -2472, -2477, -2388, -2189, -2148, -2272, -2148, -1767, -1760, -2160, -1984, -1068, -1104, -3200, -5478, -5265, -2942, -1217, -1023, -904, -409, -1065, -3209, -4659, -3791, -1804, -615, -327, 3, 672, 1514, 2389, 2580, 1157, -1223, -2393, -1456, -2, 382, 190, 477, 996, 1337, 2308, 4177, 4858, 2244 } + }, + { + {54, 73, -91, -401, -666, -415, 724, 2117, 2210, 361, -1858, -2272, -791, 632, 707, 165, 112, 357, 145, -401, -576, -308, -165, -352, -459, -198, 194, 375, 313, 145, -64, -313, -555, -721, -774, -710, -566, -399, -249, -95, 95, 307, 495, 629, 705, 734, 733, 738, 778, 864, 986, 1129, 1278, 1420, 1542, 1641, 1718, 1777, 1816, 1838, 1844, 1836, 1811, 1767, 1714, 1661, 1613, 1568, 1532, 1514, 1515, 1527, 1551, 1596, 1667, 1759, 1864, 1982, 2110, 2238, 2347, 2425, 2468, 2471, 2427, 2316, 2122, 1839, 1477, 1044, 531, -76, -770, -1516, -2276, -3024, + -3740, -4400, -4972, -5425, -5752, -5968, -6094, -6136, -6088, -5958, -5785, -5618, -5482, -5360, -5219, -5041, -4835, -4631, -4450, -4291, -4136, -3973, -3805, -3643, -3495, -3362, -3236, -3102, -2952, -2786, -2609, -2424, -2232, -2035, -1835, -1636, -1443, -1264, -1097, -939, -784, -633, -487, -349, -227, -120, -15, 96, 216, 347, 491, 640, 783, 920, 1066, 1230, 1415, 1624, 1863, 2124, 2399, 2682, 2969, 3252, 3522, 3779, 4016, 4220, 4388, 4521, 4612, 4656, 4663, 4649, 4614, 4557, 4491, 4427, 4357, 4279, 4203, 4131, 4047, 3957, 3883, 3816, 3732, 3641, 3568, 3489, 3381, 3267, 3171, 3060, 2927, 2825, + 2746, 2613, 2456, 2389, 2353, 2167, 1921, 1893, 1953, 1680, 1250, 1371, 1862, 1390, -504, -2165, -1899, -419, 340, 124, 177, 553, -101, -1873, -2901, -2137, -914, -726, -1090, -868, -264, -61, 79, 914, 1891, 1708, 366, -724, -703, -173, 4, -188, -332, -315, -265, -201, -102, -24 }, + {-54, -73, 91, 401, 666, 415, -724, -2117, -2210, -361, 1858, 2272, 791, -632, -707, -165, -112, -357, -145, 401, 576, 308, 165, 352, 459, 198, -194, -375, -313, -145, 64, 313, 555, 721, 774, 710, 566, 399, 249, 95, -95, -307, -495, -629, -705, -734, -733, -738, -778, -864, -986, -1129, -1278, -1420, -1542, -1641, -1718, -1777, -1816, -1838, -1844, -1836, -1811, -1767, -1714, -1661, -1613, -1568, -1532, -1514, -1515, -1527, -1551, -1596, -1667, -1759, -1864, -1982, -2110, -2238, -2347, -2425, -2468, -2471, -2427, -2316, -2122, -1839, -1477, -1044, -531, 76, 770, 1516, 2276, 3024, + 3740, 4400, 4972, 5425, 5752, 5968, 6094, 6136, 6088, 5958, 5785, 5618, 5482, 5360, 5219, 5041, 4835, 4631, 4450, 4291, 4136, 3973, 3805, 3643, 3495, 3362, 3236, 3102, 2952, 2786, 2609, 2424, 2232, 2035, 1835, 1636, 1443, 1264, 1097, 939, 784, 633, 487, 349, 227, 120, 15, -96, -216, -347, -491, -640, -783, -920, -1066, -1230, -1415, -1624, -1863, -2124, -2399, -2682, -2969, -3252, -3522, -3779, -4016, -4220, -4388, -4521, -4612, -4656, -4663, -4649, -4614, -4557, -4491, -4427, -4357, -4279, -4203, -4131, -4047, -3957, -3883, -3816, -3732, -3641, -3568, -3489, -3381, -3267, -3171, -3060, -2927, -2825, + -2746, -2613, -2456, -2389, -2353, -2167, -1921, -1893, -1953, -1680, -1250, -1371, -1862, -1390, 504, 2165, 1899, 419, -340, -124, -177, -553, 101, 1873, 2901, 2137, 914, 726, 1090, 868, 264, 61, -79, -914, -1891, -1708, -366, 724, 703, 173, -4, 188, 332, 315, 265, 201, 102, 24 } + }, + { + {183, 538, 600, 168, -40, 803, 1838, 907, -2641, -6334, -6446, -1581, 5360, 8871, 5615, -1756, -6571, -4954, 264, 3475, 2748, 602, -496, -724, -1019, -1109, -443, 484, 856, 738, 744, 1082, 1541, 1998, 2435, 2717, 2703, 2450, 2098, 1701, 1280, 880, 511, 136, -247, -606, -941, -1280, -1616, -1929, -2233, -2548, -2844, -3071, -3211, -3265, -3228, -3109, -2939, -2735, -2484, -2171, -1800, -1371, -873, -304, 319, 975, 1637, 2279, 2880, 3426, 3897, 4263, 4505, 4625, 4631, 4516, 4270, 3904, 3445, 2916, 2322, 1665, 957, 220, -532, -1297, -2075, -2858, -3634, -4394, -5117, -5772, -6322, -6746, + -7032, -7160, -7105, -6864, -6466, -5955, -5366, -4713, -4001, -3249, -2506, -1830, -1257, -781, -380, -44, 225, 423, 547, 597, 578, 504, 390, 253, 107, -39, -193, -375, -595, -851, -1130, -1414, -1688, -1946, -2195, -2441, -2677, -2894, -3082, -3232, -3342, -3414, -3453, -3453, -3408, -3322, -3205, -3059, -2891, -2709, -2523, -2331, -2140, -1964, -1809, -1675, -1561, -1472, -1399, -1329, -1260, -1192, -1121, -1043, -963, -883, -793, -692, -585, -479, -369, -261, -161, -64, 43, 155, 266, 386, 524, 674, 829, 991, 1155, 1301, 1425, 1537, 1633, 1698, 1738, 1767, 1780, 1764, 1734, 1704, 1662, 1598, + 1536, 1484, 1414, 1325, 1252, 1190, 1088, 959, 869, 801, 669, 490, 387, 372, 315, 173, 83, 142, 251, 289, 302, 403, 551, 545, 280, -49, -111, 138, 357, 336, 352, 673, 890, 318, -894, -1681, -1302, -214, 545, 494, -12, -351, -292, -229, -733, -1664, -1986, -913 }, + {-183, -538, -600, -168, 40, -803, -1838, -907, 2641, 6334, 6446, 1581, -5360, -8871, -5615, 1756, 6571, 4954, -264, -3475, -2748, -602, 496, 724, 1019, 1109, 443, -484, -856, -738, -744, -1082, -1541, -1998, -2435, -2717, -2703, -2450, -2098, -1701, -1280, -880, -511, -136, 247, 606, 941, 1280, 1616, 1929, 2233, 2548, 2844, 3071, 3211, 3265, 3228, 3109, 2939, 2735, 2484, 2171, 1800, 1371, 873, 304, -319, -975, -1637, -2279, -2880, -3426, -3897, -4263, -4505, -4625, -4631, -4516, -4270, -3904, -3445, -2916, -2322, -1665, -957, -220, 532, 1297, 2075, 2858, 3634, 4394, 5117, 5772, 6322, 6746, + 7032, 7160, 7105, 6864, 6466, 5955, 5366, 4713, 4001, 3249, 2506, 1830, 1257, 781, 380, 44, -225, -423, -547, -597, -578, -504, -390, -253, -107, 39, 193, 375, 595, 851, 1130, 1414, 1688, 1946, 2195, 2441, 2677, 2894, 3082, 3232, 3342, 3414, 3453, 3453, 3408, 3322, 3205, 3059, 2891, 2709, 2523, 2331, 2140, 1964, 1809, 1675, 1561, 1472, 1399, 1329, 1260, 1192, 1121, 1043, 963, 883, 793, 692, 585, 479, 369, 261, 161, 64, -43, -155, -266, -386, -524, -674, -829, -991, -1155, -1301, -1425, -1537, -1633, -1698, -1738, -1767, -1780, -1764, -1734, -1704, -1662, -1598, + -1536, -1484, -1414, -1325, -1252, -1190, -1088, -959, -869, -801, -669, -490, -387, -372, -315, -173, -83, -142, -251, -289, -302, -403, -551, -545, -280, 49, 111, -138, -357, -336, -352, -673, -890, -318, 894, 1681, 1302, 214, -545, -494, 12, 351, 292, 229, 733, 1664, 1986, 913 } + }, + { + {-1, 76, 290, 510, 522, 207, -400, -1104, -1508, -1126, 109, 1419, 1696, 688, -632, -1140, -729, -79, 382, 756, 1091, 1139, 810, 397, 138, -118, -612, -1265, -1755, -1859, -1586, -1089, -574, -215, -61, -14, 51, 181, 337, 456, 500, 480, 437, 405, 380, 353, 319, 267, 176, 44, -116, -295, -493, -708, -933, -1165, -1392, -1592, -1753, -1872, -1947, -1974, -1960, -1913, -1830, -1699, -1527, -1319, -1058, -724, -322, 132, 633, 1171, 1718, 2243, 2733, 3176, 3553, 3850, 4071, 4221, 4286, 4253, 4122, 3904, 3612, 3249, 2794, 2240, 1609, 945, 270, -418, -1111, -1780, + -2386, -2898, -3289, -3564, -3751, -3873, -3920, -3867, -3704, -3443, -3122, -2795, -2494, -2203, -1890, -1558, -1235, -946, -707, -527, -392, -278, -177, -108, -84, -108, -185, -318, -492, -689, -913, -1175, -1466, -1781, -2127, -2502, -2884, -3260, -3637, -4010, -4365, -4701, -5024, -5323, -5577, -5789, -5967, -6095, -6168, -6200, -6195, -6136, -6024, -5887, -5740, -5576, -5405, -5245, -5086, -4904, -4701, -4486, -4252, -4003, -3768, -3557, -3347, -3138, -2953, -2783, -2598, -2410, -2254, -2116, -1969, -1833, -1726, -1619, -1487, -1358, -1233, -1080, -911, -778, -671, -544, -424, -362, -319, -242, -184, -184, -174, -127, -123, -158, + -134, -91, -153, -217, -128, -70, -254, -386, -166, -39, -451, -742, -156, 359, -797, -3007, -3737, -2150, -256, 311, 438, 1231, 1646, 273, -1944, -2705, -1378, 538, 1609, 1916, 2364, 3290, 3852, 2759, -53, -2656, -2884, -907, 899, 849, -262, -712, -206, 128, -449, -1367, -1571, -689 }, + {-1, 76, 290, 510, 522, 207, -400, -1104, -1508, -1126, 109, 1419, 1696, 688, -632, -1140, -729, -79, 382, 756, 1091, 1139, 810, 397, 138, -118, -612, -1265, -1755, -1859, -1586, -1089, -574, -215, -61, -14, 51, 181, 337, 456, 500, 480, 437, 405, 380, 353, 319, 267, 176, 44, -116, -295, -493, -708, -933, -1165, -1392, -1592, -1753, -1872, -1947, -1974, -1960, -1913, -1830, -1699, -1527, -1319, -1058, -724, -322, 132, 633, 1171, 1718, 2243, 2733, 3176, 3553, 3850, 4071, 4221, 4286, 4253, 4122, 3904, 3612, 3249, 2794, 2240, 1609, 945, 270, -418, -1111, -1780, + -2386, -2898, -3289, -3564, -3751, -3873, -3920, -3867, -3704, -3443, -3122, -2795, -2494, -2203, -1890, -1558, -1235, -946, -707, -527, -392, -278, -177, -108, -84, -108, -185, -318, -492, -689, -913, -1175, -1466, -1781, -2127, -2502, -2884, -3260, -3637, -4010, -4365, -4701, -5024, -5323, -5577, -5789, -5967, -6095, -6168, -6200, -6195, -6136, -6024, -5887, -5740, -5576, -5405, -5245, -5086, -4904, -4701, -4486, -4252, -4003, -3768, -3557, -3347, -3138, -2953, -2783, -2598, -2410, -2254, -2116, -1969, -1833, -1726, -1619, -1487, -1358, -1233, -1080, -911, -778, -671, -544, -424, -362, -319, -242, -184, -184, -174, -127, -123, -158, + -134, -91, -153, -217, -128, -70, -254, -386, -166, -39, -451, -742, -156, 359, -797, -3007, -3737, -2150, -256, 311, 438, 1231, 1646, 273, -1944, -2705, -1378, 538, 1609, 1916, 2364, 3290, 3852, 2759, -53, -2656, -2884, -907, 899, 849, -262, -712, -206, 128, -449, -1367, -1571, -689 } + }, + { + {54, 339, 770, 877, 453, -295, -1226, -2125, -2192, -668, 1769, 3153, 2276, 46, -1588, -1593, -447, 684, 917, 158, -872, -1224, -594, 459, 1212, 1457, 1402, 1232, 997, 750, 523, 256, -107, -500, -813, -1033, -1208, -1340, -1389, -1352, -1276, -1211, -1185, -1206, -1268, -1355, -1450, -1525, -1544, -1483, -1349, -1169, -968, -772, -605, -482, -393, -320, -254, -187, -108, 0, 152, 356, 614, 917, 1245, 1580, 1903, 2192, 2428, 2606, 2738, 2828, 2865, 2848, 2798, 2738, 2659, 2545, 2407, 2282, 2195, 2134, 2087, 2072, 2116, 2210, 2307, 2365, 2381, 2381, 2384, 2387, 2371, 2328, + 2257, 2161, 2050, 1941, 1848, 1765, 1664, 1514, 1307, 1054, 768, 448, 84, -323, -759, -1203, -1643, -2081, -2519, -2950, -3357, -3715, -4010, -4237, -4409, -4537, -4620, -4651, -4618, -4515, -4356, -4162, -3956, -3744, -3513, -3244, -2928, -2580, -2224, -1883, -1566, -1270, -985, -699, -406, -108, 177, 439, 677, 890, 1069, 1210, 1318, 1400, 1464, 1511, 1546, 1571, 1583, 1577, 1549, 1499, 1435, 1370, 1312, 1261, 1219, 1191, 1174, 1159, 1149, 1154, 1177, 1213, 1258, 1311, 1361, 1398, 1415, 1404, 1349, 1255, 1143, 1022, 885, 743, 614, 492, 364, 238, 127, 20, -90, -177, -235, -294, + -355, -376, -367, -395, -438, -412, -359, -416, -520, -467, -336, -459, -766, -689, -56, 447, 216, -329, -422, -139, -91, -232, 56, 736, 968, 401, -261, -346, -150, -279, -678, -924, -1090, -1590, -2252, -2274, -1305, -59, 548, 505, 475, 679, 727, 580, 855, 1696, 2062, 965 }, + {54, 339, 770, 877, 453, -295, -1226, -2125, -2192, -668, 1769, 3153, 2276, 46, -1588, -1593, -447, 684, 917, 158, -872, -1224, -594, 459, 1212, 1457, 1402, 1232, 997, 750, 523, 256, -107, -500, -813, -1033, -1208, -1340, -1389, -1352, -1276, -1211, -1185, -1206, -1268, -1355, -1450, -1525, -1544, -1483, -1349, -1169, -968, -772, -605, -482, -393, -320, -254, -187, -108, 0, 152, 356, 614, 917, 1245, 1580, 1903, 2192, 2428, 2606, 2738, 2828, 2865, 2848, 2798, 2738, 2659, 2545, 2407, 2282, 2195, 2134, 2087, 2072, 2116, 2210, 2307, 2365, 2381, 2381, 2384, 2387, 2371, 2328, + 2257, 2161, 2050, 1941, 1848, 1765, 1664, 1514, 1307, 1054, 768, 448, 84, -323, -759, -1203, -1643, -2081, -2519, -2950, -3357, -3715, -4010, -4237, -4409, -4537, -4620, -4651, -4618, -4515, -4356, -4162, -3956, -3744, -3513, -3244, -2928, -2580, -2224, -1883, -1566, -1270, -985, -699, -406, -108, 177, 439, 677, 890, 1069, 1210, 1318, 1400, 1464, 1511, 1546, 1571, 1583, 1577, 1549, 1499, 1435, 1370, 1312, 1261, 1219, 1191, 1174, 1159, 1149, 1154, 1177, 1213, 1258, 1311, 1361, 1398, 1415, 1404, 1349, 1255, 1143, 1022, 885, 743, 614, 492, 364, 238, 127, 20, -90, -177, -235, -294, + -355, -376, -367, -395, -438, -412, -359, -416, -520, -467, -336, -459, -766, -689, -56, 447, 216, -329, -422, -139, -91, -232, 56, 736, 968, 401, -261, -346, -150, -279, -678, -924, -1090, -1590, -2252, -2274, -1305, -59, 548, 505, 475, 679, 727, 580, 855, 1696, 2062, 965 } + }, + { + {-134, -224, -102, -57, -2, 464, 1000, 395, -1711, -3478, -2481, 1087, 3943, 3213, -190, -2667, -2118, 84, 1426, 1324, 1050, 1420, 1806, 1397, 380, -538, -1131, -1690, -2379, -3018, -3374, -3380, -3075, -2549, -1939, -1366, -864, -419, -37, 259, 469, 591, 620, 578, 525, 513, 557, 651, 791, 960, 1130, 1283, 1413, 1507, 1546, 1525, 1456, 1353, 1229, 1102, 991, 910, 871, 880, 939, 1049, 1211, 1421, 1672, 1961, 2284, 2630, 2981, 3320, 3632, 3902, 4116, 4267, 4350, 4365, 4326, 4257, 4168, 4050, 3907, 3750, 3587, 3418, 3254, 3113, 2973, 2773, 2462, 2048, 1559, 1003, + 351, -417, -1285, -2205, -3123, -4007, -4843, -5609, -6275, -6822, -7251, -7580, -7814, -7943, -7944, -7812, -7568, -7252, -6895, -6494, -6037, -5522, -4962, -4388, -3824, -3282, -2750, -2206, -1640, -1057, -466, 126, 721, 1325, 1939, 2550, 3141, 3703, 4236, 4740, 5214, 5652, 6043, 6366, 6606, 6766, 6862, 6902, 6891, 6840, 6747, 6603, 6407, 6178, 5937, 5693, 5454, 5219, 4981, 4721, 4427, 4093, 3725, 3342, 2964, 2596, 2238, 1895, 1572, 1265, 967, 688, 441, 226, 36, -124, -252, -360, -456, -539, -614, -691, -758, -801, -826, -845, -849, -828, -798, -771, -730, -671, -621, -581, -527, -470, + -443, -423, -368, -321, -331, -323, -221, -133, -168, -170, 21, 176, -15, -288, -41, 721, 1298, 1282, 1032, 939, 897, 786, 878, 1301, 1649, 1572, 1335, 1355, 1564, 1645, 1547, 1340, 947, 444, 298, 790, 1455, 1595, 1195, 845, 866, 1023, 1098, 1256, 1644, 1962, 1695, 678 }, + {-134, -224, -102, -57, -2, 464, 1000, 395, -1711, -3478, -2481, 1087, 3943, 3213, -190, -2667, -2118, 84, 1426, 1324, 1050, 1420, 1806, 1397, 380, -538, -1131, -1690, -2379, -3018, -3374, -3380, -3075, -2549, -1939, -1366, -864, -419, -37, 259, 469, 591, 620, 578, 525, 513, 557, 651, 791, 960, 1130, 1283, 1413, 1507, 1546, 1525, 1456, 1353, 1229, 1102, 991, 910, 871, 880, 939, 1049, 1211, 1421, 1672, 1961, 2284, 2630, 2981, 3320, 3632, 3902, 4116, 4267, 4350, 4365, 4326, 4257, 4168, 4050, 3907, 3750, 3587, 3418, 3254, 3113, 2973, 2773, 2462, 2048, 1559, 1003, + 351, -417, -1285, -2205, -3123, -4007, -4843, -5609, -6275, -6822, -7251, -7580, -7814, -7943, -7944, -7812, -7568, -7252, -6895, -6494, -6037, -5522, -4962, -4388, -3824, -3282, -2750, -2206, -1640, -1057, -466, 126, 721, 1325, 1939, 2550, 3141, 3703, 4236, 4740, 5214, 5652, 6043, 6366, 6606, 6766, 6862, 6902, 6891, 6840, 6747, 6603, 6407, 6178, 5937, 5693, 5454, 5219, 4981, 4721, 4427, 4093, 3725, 3342, 2964, 2596, 2238, 1895, 1572, 1265, 967, 688, 441, 226, 36, -124, -252, -360, -456, -539, -614, -691, -758, -801, -826, -845, -849, -828, -798, -771, -730, -671, -621, -581, -527, -470, + -443, -423, -368, -321, -331, -323, -221, -133, -168, -170, 21, 176, -15, -288, -41, 721, 1298, 1282, 1032, 939, 897, 786, 878, 1301, 1649, 1572, 1335, 1355, 1564, 1645, 1547, 1340, 947, 444, 298, 790, 1455, 1595, 1195, 845, 866, 1023, 1098, 1256, 1644, 1962, 1695, 678 } + }, + { + {4, 5, -8, -45, -110, -138, -12, 206, 126, -494, -1035, -367, 1514, 2737, 1467, -1472, -3058, -1581, 1282, 2588, 1522, -257, -1057, -758, -99, 489, 935, 1109, 898, 424, -80, -503, -825, -1029, -1163, -1347, -1645, -1992, -2284, -2464, -2510, -2409, -2192, -1919, -1645, -1397, -1202, -1075, -1003, -963, -943, -934, -916, -874, -807, -726, -641, -569, -524, -508, -513, -533, -562, -583, -582, -555, -507, -437, -344, -230, -99, 48, 209, 378, 543, 698, 850, 1003, 1148, 1276, 1398, 1537, 1698, 1860, 2006, 2145, 2298, 2456, 2583, 2649, 2651, 2610, 2540, 2437, 2293, 2119, + 1943, 1796, 1679, 1579, 1488, 1426, 1423, 1499, 1646, 1833, 2026, 2208, 2387, 2573, 2767, 2956, 3120, 3249, 3342, 3413, 3472, 3528, 3580, 3623, 3653, 3669, 3674, 3670, 3651, 3611, 3549, 3468, 3373, 3274, 3180, 3097, 3026, 2969, 2927, 2899, 2884, 2879, 2879, 2879, 2870, 2843, 2790, 2702, 2575, 2408, 2202, 1961, 1695, 1411, 1109, 794, 473, 152, -168, -481, -775, -1046, -1292, -1507, -1687, -1834, -1953, -2041, -2099, -2130, -2138, -2126, -2106, -2093, -2089, -2092, -2106, -2136, -2174, -2205, -2236, -2271, -2305, -2340, -2382, -2428, -2459, -2474, -2483, -2472, -2421, -2347, -2272, -2187, -2080, -1979, + -1889, -1772, -1638, -1545, -1462, -1288, -1075, -972, -896, -616, -258, -196, -268, 216, 1254, 1776, 1142, 249, 194, 609, 553, 394, 1236, 2736, 3226, 2207, 1105, 1088, 1582, 1619, 1326, 1174, 874, 119, -380, 252, 1589, 2345, 2081, 1549, 1422, 1539, 1570, 1661, 2036, 2386, 2065, 829 }, + {4, 5, -8, -45, -110, -138, -12, 206, 126, -494, -1035, -367, 1514, 2737, 1467, -1472, -3058, -1581, 1282, 2588, 1522, -257, -1057, -758, -99, 489, 935, 1109, 898, 424, -80, -503, -825, -1029, -1163, -1347, -1645, -1992, -2284, -2464, -2510, -2409, -2192, -1919, -1645, -1397, -1202, -1075, -1003, -963, -943, -934, -916, -874, -807, -726, -641, -569, -524, -508, -513, -533, -562, -583, -582, -555, -507, -437, -344, -230, -99, 48, 209, 378, 543, 698, 850, 1003, 1148, 1276, 1398, 1537, 1698, 1860, 2006, 2145, 2298, 2456, 2583, 2649, 2651, 2610, 2540, 2437, 2293, 2119, + 1943, 1796, 1679, 1579, 1488, 1426, 1423, 1499, 1646, 1833, 2026, 2208, 2387, 2573, 2767, 2956, 3120, 3249, 3342, 3413, 3472, 3528, 3580, 3623, 3653, 3669, 3674, 3670, 3651, 3611, 3549, 3468, 3373, 3274, 3180, 3097, 3026, 2969, 2927, 2899, 2884, 2879, 2879, 2879, 2870, 2843, 2790, 2702, 2575, 2408, 2202, 1961, 1695, 1411, 1109, 794, 473, 152, -168, -481, -775, -1046, -1292, -1507, -1687, -1834, -1953, -2041, -2099, -2130, -2138, -2126, -2106, -2093, -2089, -2092, -2106, -2136, -2174, -2205, -2236, -2271, -2305, -2340, -2382, -2428, -2459, -2474, -2483, -2472, -2421, -2347, -2272, -2187, -2080, -1979, + -1889, -1772, -1638, -1545, -1462, -1288, -1075, -972, -896, -616, -258, -196, -268, 216, 1254, 1776, 1142, 249, 194, 609, 553, 394, 1236, 2736, 3226, 2207, 1105, 1088, 1582, 1619, 1326, 1174, 874, 119, -380, 252, 1589, 2345, 2081, 1549, 1422, 1539, 1570, 1661, 2036, 2386, 2065, 829 } + } +}; +const Word16 *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 32000 */ + +const Word16 CRendBin_HOA3_HRIR_max_num_iterations_32kHz = 1; +const Word16 CRendBin_HOA3_HRIR_num_iterations_32kHz[HOA3_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const Word16 CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const Word16 CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const Word16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz = 0; +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_Q_32kHz_fx = 0; +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; +const Word16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_HOA3_HRIR_coeff_Q_32kHz_fx = 14; +const Word16 CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {15421, 12931, 8921, 4541, 608, -2485, -4920, -7227, -9366, -10462, -9896, -7880, -4370, 1052, 6753, 8281, 3038, -4749, -7105, -1236, 7189, 10815, 8191, 3045, -1515, -5320, -8832, -11522, -12924, -13496, -13788, -13759, -13272, -12554, -11842, -11100, -10265, -9431, -8661, -7910, -7161, -6452, -5769, -5069, -4377, -3735, -3120, -2500, -1905, -1361, -838, -312, 191, 656, 1104, 1535, 1927, 2280, 2617, 2934, 3219, 3483, 3744, 3994, 4221, 4433, 4646, 4851, 5040, 5223, 5411, 5595, 5773, 5953, 6139, 6324, 6509, 6694, 6880, 7068, 7257, 7441, 7608, 7763, 7918, 8066, 8193, 8299, 8400, 8499, 8583, 8640, 8675, 8700, 8720, 8735, + 8739, 8729, 8713, 8712, 8731, 8758, 8785, 8815, 8859, 8924, 9010, 9109, 9211, 9310, 9414, 9532, 9663, 9798, 9929, 10052, 10163, 10268, 10374, 10481, 10584, 10679, 10765, 10846, 10923, 10999, 11073, 11143, 11204, 11258, 11307, 11355, 11404, 11458, 11517, 11579, 11644, 11713, 11787, 11870, 11965, 12073, 12193, 12321, 12455, 12594, 12735, 12874, 13009, 13138, 13257, 13364, 13457, 13536, 13600, 13651, 13692, 13722, 13743, 13752 }, + {15421, 12931, 8921, 4541, 608, -2485, -4920, -7227, -9366, -10462, -9896, -7880, -4370, 1052, 6753, 8281, 3038, -4749, -7105, -1236, 7189, 10815, 8191, 3045, -1515, -5320, -8832, -11522, -12924, -13496, -13788, -13759, -13272, -12554, -11842, -11100, -10265, -9431, -8661, -7910, -7161, -6452, -5769, -5069, -4377, -3735, -3120, -2500, -1905, -1361, -838, -312, 191, 656, 1104, 1535, 1927, 2280, 2617, 2934, 3219, 3483, 3744, 3994, 4221, 4433, 4646, 4851, 5040, 5223, 5411, 5595, 5773, 5953, 6139, 6324, 6509, 6694, 6880, 7068, 7257, 7441, 7608, 7763, 7918, 8066, 8193, 8299, 8400, 8499, 8583, 8640, 8675, 8700, 8720, 8735, + 8739, 8729, 8713, 8712, 8731, 8758, 8785, 8815, 8859, 8924, 9010, 9109, 9211, 9310, 9414, 9532, 9663, 9798, 9929, 10052, 10163, 10268, 10374, 10481, 10584, 10679, 10765, 10846, 10923, 10999, 11073, 11143, 11204, 11258, 11307, 11355, 11404, 11458, 11517, 11579, 11644, 11713, 11787, 11870, 11965, 12073, 12193, 12321, 12455, 12594, 12735, 12874, 13009, 13138, 13257, 13364, 13457, 13536, 13600, 13651, 13692, 13722, 13743, 13752 } + }, + { + {614, 4360, 10220, 15073, 16025, 12420, 5544, -2925, -11026, -16395, -18029, -17051, -13613, -5254, 7613, 16427, 11409, -4801, -16598, -12232, 3166, 15213, 16869, 12353, 7591, 3533, -895, -4916, -7304, -8604, -9925, -11191, -11864, -12128, -12413, -12640, -12605, -12428, -12232, -11902, -11385, -10809, -10207, -9492, -8702, -7951, -7214, -6410, -5598, -4876, -4209, -3533, -2877, -2271, -1666, -1040, -444, 111, 665, 1207, 1687, 2114, 2532, 2921, 3241, 3513, 3775, 4007, 4181, 4322, 4457, 4570, 4650, 4726, 4815, 4909, 5008, 5126, 5263, 5413, 5587, 5781, 5973, 6157, 6357, 6574, 6776, 6954, 7132, 7318, 7502, 7688, 7896, 8128, 8376, 8650, + 8957, 9284, 9614, 9951, 10294, 10618, 10903, 11151, 11364, 11532, 11652, 11722, 11737, 11696, 11621, 11545, 11477, 11413, 11356, 11305, 11258, 11220, 11216, 11252, 11311, 11375, 11436, 11485, 11517, 11545, 11585, 11635, 11681, 11727, 11781, 11838, 11896, 11958, 12031, 12107, 12182, 12264, 12358, 12458, 12562, 12676, 12797, 12923, 13060, 13217, 13391, 13573, 13762, 13960, 14158, 14347, 14528, 14701, 14857, 14987, 15097, 15185, 15243, 15268 }, + {-614, -4360, -10220, -15073, -16025, -12420, -5544, 2925, 11026, 16395, 18029, 17051, 13613, 5254, -7613, -16427, -11409, 4801, 16598, 12232, -3166, -15213, -16869, -12353, -7591, -3533, 895, 4916, 7304, 8604, 9925, 11191, 11864, 12128, 12413, 12640, 12605, 12428, 12232, 11902, 11385, 10809, 10207, 9492, 8702, 7951, 7214, 6410, 5598, 4876, 4209, 3533, 2877, 2271, 1666, 1040, 444, -111, -665, -1207, -1687, -2114, -2532, -2921, -3241, -3513, -3775, -4007, -4181, -4322, -4457, -4570, -4650, -4726, -4815, -4909, -5008, -5126, -5263, -5413, -5587, -5781, -5973, -6157, -6357, -6574, -6776, -6954, -7132, -7318, -7502, -7688, -7896, -8128, -8376, -8650, + -8957, -9284, -9614, -9951, -10294, -10618, -10903, -11151, -11364, -11532, -11652, -11722, -11737, -11696, -11621, -11545, -11477, -11413, -11356, -11305, -11258, -11220, -11216, -11252, -11311, -11375, -11436, -11485, -11517, -11545, -11585, -11635, -11681, -11727, -11781, -11838, -11896, -11958, -12031, -12107, -12182, -12264, -12358, -12458, -12562, -12676, -12797, -12923, -13060, -13217, -13391, -13573, -13762, -13960, -14158, -14347, -14528, -14701, -14857, -14987, -15097, -15185, -15243, -15268 } + }, + { + {1993, 1960, 1161, -459, -1755, -1647, -366, 945, 1471, 1187, 418, -520, -1196, -1048, 71, 1358, 1537, 281, -1083, -848, 1088, 3036, 3407, 2253, 726, -379, -1058, -1528, -1849, -2057, -2231, -2354, -2345, -2209, -2043, -1920, -1879, -1976, -2226, -2549, -2841, -3073, -3259, -3396, -3477, -3521, -3545, -3541, -3493, -3388, -3207, -2922, -2529, -2042, -1467, -803, -62, 731, 1561, 2427, 3319, 4222, 5123, 6011, 6871, 7675, 8394, 9005, 9490, 9829, 10006, 10013, 9852, 9527, 9057, 8475, 7811, 7083, 6310, 5535, 4803, 4124, 3481, 2881, 2362, 1949, 1615, 1318, 1056, 865, 769, 750, 773, 825, 912, 1040, + 1206, 1393, 1581, 1744, 1867, 1948, 1994, 2006, 1974, 1879, 1711, 1479, 1214, 944, 676, 404, 126, -151, -415, -652, -849, -995, -1087, -1120, -1097, -1022, -905, -751, -565, -357, -142, 67, 265, 445, 603, 738, 843, 913, 952, 978, 1007, 1053, 1126, 1230, 1349, 1462, 1562, 1655, 1738, 1803, 1852, 1888, 1909, 1910, 1901, 1892, 1883, 1875, 1873, 1881, 1888, 1891, 1894, 1899 }, + {1993, 1960, 1161, -459, -1755, -1647, -366, 945, 1471, 1187, 418, -520, -1196, -1048, 71, 1358, 1537, 281, -1083, -848, 1088, 3036, 3407, 2253, 726, -379, -1058, -1528, -1849, -2057, -2231, -2354, -2345, -2209, -2043, -1920, -1879, -1976, -2226, -2549, -2841, -3073, -3259, -3396, -3477, -3521, -3545, -3541, -3493, -3388, -3207, -2922, -2529, -2042, -1467, -803, -62, 731, 1561, 2427, 3319, 4222, 5123, 6011, 6871, 7675, 8394, 9005, 9490, 9829, 10006, 10013, 9852, 9527, 9057, 8475, 7811, 7083, 6310, 5535, 4803, 4124, 3481, 2881, 2362, 1949, 1615, 1318, 1056, 865, 769, 750, 773, 825, 912, 1040, + 1206, 1393, 1581, 1744, 1867, 1948, 1994, 2006, 1974, 1879, 1711, 1479, 1214, 944, 676, 404, 126, -151, -415, -652, -849, -995, -1087, -1120, -1097, -1022, -905, -751, -565, -357, -142, 67, 265, 445, 603, 738, 843, 913, 952, 978, 1007, 1053, 1126, 1230, 1349, 1462, 1562, 1655, 1738, 1803, 1852, 1888, 1909, 1910, 1901, 1892, 1883, 1875, 1873, 1881, 1888, 1891, 1894, 1899 } + }, + { + {446, 873, 1120, 594, -533, -1306, -984, 1, 459, -164, -1310, -2257, -2798, -2641, -1190, 1134, 2196, 339, -2926, -3989, -1269, 2995, 5578, 5615, 4392, 2961, 1275, -814, -2955, -4810, -6417, -7865, -9046, -9834, -10233, -10277, -9983, -9413, -8668, -7819, -6918, -6021, -5160, -4321, -3501, -2730, -2016, -1330, -659, -33, 522, 996, 1371, 1635, 1816, 1969, 2132, 2313, 2516, 2740, 2969, 3186, 3385, 3568, 3736, 3888, 4037, 4192, 4353, 4507, 4643, 4762, 4860, 4923, 4926, 4867, 4755, 4586, 4343, 4031, 3683, 3314, 2912, 2475, 2041, 1640, 1271, 912, 565, 237, -82, -415, -766, -1117, -1459, -1799, + -2145, -2482, -2784, -3031, -3223, -3366, -3456, -3474, -3406, -3259, -3059, -2820, -2543, -2218, -1847, -1451, -1063, -706, -374, -46, 299, 656, 999, 1305, 1562, 1781, 1985, 2197, 2424, 2658, 2886, 3106, 3322, 3544, 3783, 4049, 4343, 4657, 4979, 5301, 5616, 5924, 6223, 6514, 6792, 7045, 7263, 7441, 7579, 7677, 7739, 7774, 7790, 7789, 7776, 7754, 7727, 7700, 7676, 7656, 7639, 7627, 7621, 7620 }, + {446, 873, 1120, 594, -533, -1306, -984, 1, 459, -164, -1310, -2257, -2798, -2641, -1190, 1134, 2196, 339, -2926, -3989, -1269, 2995, 5578, 5615, 4392, 2961, 1275, -814, -2955, -4810, -6417, -7865, -9046, -9834, -10233, -10277, -9983, -9413, -8668, -7819, -6918, -6021, -5160, -4321, -3501, -2730, -2016, -1330, -659, -33, 522, 996, 1371, 1635, 1816, 1969, 2132, 2313, 2516, 2740, 2969, 3186, 3385, 3568, 3736, 3888, 4037, 4192, 4353, 4507, 4643, 4762, 4860, 4923, 4926, 4867, 4755, 4586, 4343, 4031, 3683, 3314, 2912, 2475, 2041, 1640, 1271, 912, 565, 237, -82, -415, -766, -1117, -1459, -1799, + -2145, -2482, -2784, -3031, -3223, -3366, -3456, -3474, -3406, -3259, -3059, -2820, -2543, -2218, -1847, -1451, -1063, -706, -374, -46, 299, 656, 999, 1305, 1562, 1781, 1985, 2197, 2424, 2658, 2886, 3106, 3322, 3544, 3783, 4049, 4343, 4657, 4979, 5301, 5616, 5924, 6223, 6514, 6792, 7045, 7263, 7441, 7579, 7677, 7739, 7774, 7790, 7789, 7776, 7754, 7727, 7700, 7676, 7656, 7639, 7627, 7621, 7620 } + }, + { + {-84, -258, -323, -76, 296, 436, 364, 502, 1010, 1350, 722, -1142, -3510, -4727, -3228, 587, 3642, 2735, -1662, -5314, -4702, -648, 3310, 5038, 5034, 4366, 3187, 1399, -572, -2246, -3611, -4828, -5837, -6541, -7014, -7321, -7363, -7043, -6432, -5677, -4888, -4139, -3480, -2907, -2390, -1919, -1486, -1060, -622, -190, 205, 562, 880, 1148, 1363, 1552, 1735, 1920, 2112, 2319, 2543, 2775, 3020, 3278, 3538, 3787, 4030, 4276, 4521, 4751, 4961, 5158, 5341, 5490, 5589, 5637, 5640, 5584, 5449, 5243, 5001, 4739, 4437, 4085, 3713, 3354, 2996, 2600, 2159, 1709, 1283, 880, 487, 110, -227, -507, + -732, -921, -1084, -1216, -1305, -1350, -1363, -1358, -1349, -1350, -1373, -1415, -1458, -1489, -1507, -1525, -1559, -1614, -1677, -1727, -1744, -1728, -1697, -1674, -1669, -1682, -1699, -1703, -1686, -1649, -1593, -1518, -1415, -1279, -1100, -878, -620, -342, -58, 219, 478, 716, 929, 1117, 1271, 1383, 1452, 1487, 1495, 1489, 1481, 1485, 1504, 1537, 1583, 1640, 1705, 1774, 1844, 1913, 1976, 2030, 2071, 2094 }, + {84, 258, 323, 76, -296, -436, -364, -502, -1010, -1350, -722, 1142, 3510, 4727, 3228, -587, -3642, -2735, 1662, 5314, 4702, 648, -3310, -5038, -5034, -4366, -3187, -1399, 572, 2246, 3611, 4828, 5837, 6541, 7014, 7321, 7363, 7043, 6432, 5677, 4888, 4139, 3480, 2907, 2390, 1919, 1486, 1060, 622, 190, -205, -562, -880, -1148, -1363, -1552, -1735, -1920, -2112, -2319, -2543, -2775, -3020, -3278, -3538, -3787, -4030, -4276, -4521, -4751, -4961, -5158, -5341, -5490, -5589, -5637, -5640, -5584, -5449, -5243, -5001, -4739, -4437, -4085, -3713, -3354, -2996, -2600, -2159, -1709, -1283, -880, -487, -110, 227, 507, + 732, 921, 1084, 1216, 1305, 1350, 1363, 1358, 1349, 1350, 1373, 1415, 1458, 1489, 1507, 1525, 1559, 1614, 1677, 1727, 1744, 1728, 1697, 1674, 1669, 1682, 1699, 1703, 1686, 1649, 1593, 1518, 1415, 1279, 1100, 878, 620, 342, 58, -219, -478, -716, -929, -1117, -1271, -1383, -1452, -1487, -1495, -1489, -1481, -1485, -1504, -1537, -1583, -1640, -1705, -1774, -1844, -1913, -1976, -2030, -2071, -2094 } + }, + { + {544, -192, -293, 527, 747, -473, -1491, -248, 2584, 4073, 2549, -630, -2879, -2819, -824, 1580, 2485, 976, -1590, -2589, -1022, 1371, 2361, 1700, 694, 205, 93, 129, 443, 1069, 1748, 2258, 2576, 2709, 2648, 2464, 2229, 1895, 1396, 783, 175, -361, -794, -1091, -1257, -1357, -1452, -1553, -1659, -1766, -1852, -1894, -1894, -1862, -1775, -1593, -1301, -910, -427, 140, 773, 1448, 2145, 2851, 3554, 4235, 4869, 5429, 5892, 6235, 6432, 6456, 6299, 5964, 5463, 4822, 4072, 3239, 2345, 1430, 539, -316, -1154, -1970, -2725, -3391, -3986, -4537, -5043, -5488, -5874, -6212, -6496, -6700, -6813, -6834, + -6764, -6588, -6299, -5909, -5440, -4900, -4283, -3596, -2876, -2183, -1565, -1026, -530, -48, 408, 795, 1080, 1264, 1379, 1460, 1529, 1586, 1618, 1623, 1613, 1607, 1621, 1660, 1721, 1793, 1862, 1923, 1974, 2004, 2001, 1961, 1888, 1782, 1648, 1498, 1342, 1184, 1030, 891, 763, 640, 522, 414, 313, 209, 102, 0, -101, -202, -296, -378, -455, -529, -594, -648, -698, -742, -769, -779 }, + {-544, 192, 293, -527, -747, 473, 1491, 248, -2584, -4073, -2549, 630, 2879, 2819, 824, -1580, -2485, -976, 1590, 2589, 1022, -1371, -2361, -1700, -694, -205, -93, -129, -443, -1069, -1748, -2258, -2576, -2709, -2648, -2464, -2229, -1895, -1396, -783, -175, 361, 794, 1091, 1257, 1357, 1452, 1553, 1659, 1766, 1852, 1894, 1894, 1862, 1775, 1593, 1301, 910, 427, -140, -773, -1448, -2145, -2851, -3554, -4235, -4869, -5429, -5892, -6235, -6432, -6456, -6299, -5964, -5463, -4822, -4072, -3239, -2345, -1430, -539, 316, 1154, 1970, 2725, 3391, 3986, 4537, 5043, 5488, 5874, 6212, 6496, 6700, 6813, 6834, + 6764, 6588, 6299, 5909, 5440, 4900, 4283, 3596, 2876, 2183, 1565, 1026, 530, 48, -408, -795, -1080, -1264, -1379, -1460, -1529, -1586, -1618, -1623, -1613, -1607, -1621, -1660, -1721, -1793, -1862, -1923, -1974, -2004, -2001, -1961, -1888, -1782, -1648, -1498, -1342, -1184, -1030, -891, -763, -640, -522, -414, -313, -209, -102, 0, 101, 202, 296, 378, 455, 529, 594, 648, 698, 742, 769, 779 } + }, + { + {43, 287, 220, -287, -718, -883, -1351, -2456, -3460, -3197, -1102, 2582, 6587, 8209, 4901, -2084, -7007, -5138, 1443, 5964, 4825, 853, -1563, -1645, -1194, -933, -185, 1026, 1734, 1590, 1219, 1103, 1132, 1170, 1307, 1534, 1696, 1760, 1809, 1860, 1874, 1858, 1808, 1673, 1465, 1269, 1104, 912, 683, 459, 237, -27, -330, -640, -961, -1304, -1639, -1939, -2210, -2455, -2654, -2793, -2879, -2901, -2829, -2659, -2402, -2047, -1583, -1029, -412, 263, 997, 1765, 2537, 3297, 4032, 4720, 5342, 5883, 6327, 6666, 6908, 7053, 7088, 7007, 6828, 6563, 6208, 5764, 5235, 4612, 3880, 3057, 2193, 1326, + 466, -380, -1181, -1888, -2445, -2815, -3009, -3069, -3026, -2874, -2607, -2244, -1826, -1399, -1004, -671, -409, -215, -85, -21, -24, -99, -255, -481, -752, -1036, -1319, -1595, -1862, -2127, -2396, -2664, -2927, -3193, -3475, -3774, -4084, -4399, -4718, -5038, -5361, -5695, -6044, -6403, -6758, -7090, -7386, -7635, -7837, -7990, -8093, -8145, -8159, -8146, -8113, -8065, -8013, -7966, -7926, -7889, -7857, -7832, -7814, -7804 }, + {43, 287, 220, -287, -718, -883, -1351, -2456, -3460, -3197, -1102, 2582, 6587, 8209, 4901, -2084, -7007, -5138, 1443, 5964, 4825, 853, -1563, -1645, -1194, -933, -185, 1026, 1734, 1590, 1219, 1103, 1132, 1170, 1307, 1534, 1696, 1760, 1809, 1860, 1874, 1858, 1808, 1673, 1465, 1269, 1104, 912, 683, 459, 237, -27, -330, -640, -961, -1304, -1639, -1939, -2210, -2455, -2654, -2793, -2879, -2901, -2829, -2659, -2402, -2047, -1583, -1029, -412, 263, 997, 1765, 2537, 3297, 4032, 4720, 5342, 5883, 6327, 6666, 6908, 7053, 7088, 7007, 6828, 6563, 6208, 5764, 5235, 4612, 3880, 3057, 2193, 1326, + 466, -380, -1181, -1888, -2445, -2815, -3009, -3069, -3026, -2874, -2607, -2244, -1826, -1399, -1004, -671, -409, -215, -85, -21, -24, -99, -255, -481, -752, -1036, -1319, -1595, -1862, -2127, -2396, -2664, -2927, -3193, -3475, -3774, -4084, -4399, -4718, -5038, -5361, -5695, -6044, -6403, -6758, -7090, -7386, -7635, -7837, -7990, -8093, -8145, -8159, -8146, -8113, -8065, -8013, -7966, -7926, -7889, -7857, -7832, -7814, -7804 } + }, + { + {604, -318, -1594, -2515, -2451, -1003, 1415, 3275, 3055, 926, -1283, -2075, -1631, -936, -372, 196, 522, 139, -734, -1238, -958, -375, -77, -17, 202, 680, 1187, 1539, 1716, 1686, 1384, 862, 298, -172, -559, -946, -1387, -1886, -2409, -2883, -3223, -3391, -3418, -3360, -3257, -3129, -2991, -2851, -2707, -2549, -2378, -2198, -2006, -1799, -1582, -1359, -1129, -887, -641, -413, -218, -58, 67, 150, 191, 207, 225, 256, 294, 337, 406, 516, 665, 844, 1061, 1340, 1688, 2095, 2548, 3046, 3581, 4135, 4684, 5208, 5699, 6160, 6580, 6929, 7184, 7369, 7528, 7661, 7710, 7626, 7415, 7111, + 6724, 6233, 5622, 4909, 4136, 3335, 2502, 1622, 710, -184, -1018, -1795, -2544, -3286, -4015, -4694, -5280, -5758, -6143, -6464, -6729, -6931, -7065, -7135, -7153, -7140, -7114, -7079, -7032, -6973, -6907, -6832, -6737, -6605, -6423, -6183, -5901, -5603, -5304, -4993, -4658, -4289, -3877, -3424, -2956, -2507, -2086, -1686, -1300, -933, -574, -222, 103, 375, 597, 781, 933, 1054, 1159, 1260, 1350, 1420, 1467, 1493 }, + {604, -318, -1594, -2515, -2451, -1003, 1415, 3275, 3055, 926, -1283, -2075, -1631, -936, -372, 196, 522, 139, -734, -1238, -958, -375, -77, -17, 202, 680, 1187, 1539, 1716, 1686, 1384, 862, 298, -172, -559, -946, -1387, -1886, -2409, -2883, -3223, -3391, -3418, -3360, -3257, -3129, -2991, -2851, -2707, -2549, -2378, -2198, -2006, -1799, -1582, -1359, -1129, -887, -641, -413, -218, -58, 67, 150, 191, 207, 225, 256, 294, 337, 406, 516, 665, 844, 1061, 1340, 1688, 2095, 2548, 3046, 3581, 4135, 4684, 5208, 5699, 6160, 6580, 6929, 7184, 7369, 7528, 7661, 7710, 7626, 7415, 7111, + 6724, 6233, 5622, 4909, 4136, 3335, 2502, 1622, 710, -184, -1018, -1795, -2544, -3286, -4015, -4694, -5280, -5758, -6143, -6464, -6729, -6931, -7065, -7135, -7153, -7140, -7114, -7079, -7032, -6973, -6907, -6832, -6737, -6605, -6423, -6183, -5901, -5603, -5304, -4993, -4658, -4289, -3877, -3424, -2956, -2507, -2086, -1686, -1300, -933, -574, -222, 103, 375, 597, 781, 933, 1054, 1159, 1260, 1350, 1420, 1467, 1493 } + }, + { + {-674, 879, 2029, 1666, 424, -1330, -4211, -7738, -9568, -7974, -3469, 2739, 9418, 13150, 9084, -2459, -12505, -11484, -496, 9681, 11128, 6175, 1509, -432, -1555, -3098, -4287, -4713, -5037, -5494, -5563, -5074, -4406, -3723, -2858, -1840, -887, -52, 704, 1294, 1650, 1887, 2106, 2261, 2317, 2331, 2315, 2210, 2041, 1904, 1819, 1736, 1646, 1563, 1455, 1298, 1119, 933, 711, 448, 185, -71, -354, -657, -944, -1219, -1502, -1774, -2001, -2188, -2357, -2498, -2602, -2691, -2781, -2861, -2924, -2980, -3026, -3056, -3085, -3136, -3204, -3271, -3343, -3426, -3499, -3537, -3539, -3512, -3452, -3368, -3275, -3180, -3092, -3052, + -3104, -3248, -3453, -3710, -4027, -4402, -4808, -5211, -5572, -5865, -6087, -6252, -6349, -6356, -6269, -6111, -5902, -5653, -5382, -5096, -4787, -4454, -4125, -3822, -3547, -3288, -3028, -2749, -2440, -2121, -1820, -1541, -1272, -1004, -737, -459, -167, 126, 408, 685, 964, 1241, 1513, 1792, 2077, 2353, 2608, 2842, 3046, 3210, 3336, 3433, 3500, 3532, 3534, 3517, 3480, 3424, 3364, 3310, 3259, 3212, 3181, 3170 }, + {-674, 879, 2029, 1666, 424, -1330, -4211, -7738, -9568, -7974, -3469, 2739, 9418, 13150, 9084, -2459, -12505, -11484, -496, 9681, 11128, 6175, 1509, -432, -1555, -3098, -4287, -4713, -5037, -5494, -5563, -5074, -4406, -3723, -2858, -1840, -887, -52, 704, 1294, 1650, 1887, 2106, 2261, 2317, 2331, 2315, 2210, 2041, 1904, 1819, 1736, 1646, 1563, 1455, 1298, 1119, 933, 711, 448, 185, -71, -354, -657, -944, -1219, -1502, -1774, -2001, -2188, -2357, -2498, -2602, -2691, -2781, -2861, -2924, -2980, -3026, -3056, -3085, -3136, -3204, -3271, -3343, -3426, -3499, -3537, -3539, -3512, -3452, -3368, -3275, -3180, -3092, -3052, + -3104, -3248, -3453, -3710, -4027, -4402, -4808, -5211, -5572, -5865, -6087, -6252, -6349, -6356, -6269, -6111, -5902, -5653, -5382, -5096, -4787, -4454, -4125, -3822, -3547, -3288, -3028, -2749, -2440, -2121, -1820, -1541, -1272, -1004, -737, -459, -167, 126, 408, 685, 964, 1241, 1513, 1792, 2077, 2353, 2608, 2842, 3046, 3210, 3336, 3433, 3500, 3532, 3534, 3517, 3480, 3424, 3364, 3310, 3259, 3212, 3181, 3170 } + }, + { + {-575, -605, -473, -83, 707, 2040, 3349, 3498, 2161, -138, -3600, -8306, -10982, -6466, 4506, 12419, 8757, -2951, -10817, -8720, -1808, 2283, 2342, 1725, 2024, 2125, 1406, 621, 198, -249, -866, -1299, -1392, -1339, -1258, -1123, -973, -856, -717, -544, -425, -380, -323, -228, -171, -173, -172, -154, -151, -153, -113, -32, 66, 179, 310, 437, 542, 632, 709, 755, 775, 790, 796, 777, 739, 693, 635, 555, 464, 372, 272, 160, 41, -84, -234, -413, -615, -836, -1075, -1324, -1578, -1843, -2118, -2381, -2610, -2806, -2978, -3124, -3229, -3280, -3272, -3206, -3097, -2955, -2786, -2601, + -2420, -2261, -2123, -2009, -1931, -1896, -1896, -1911, -1932, -1962, -2010, -2082, -2171, -2260, -2336, -2400, -2462, -2525, -2584, -2628, -2650, -2648, -2630, -2608, -2588, -2563, -2521, -2449, -2344, -2214, -2066, -1904, -1721, -1510, -1267, -995, -701, -398, -94, 206, 505, 801, 1095, 1387, 1668, 1928, 2160, 2370, 2566, 2754, 2938, 3122, 3305, 3485, 3657, 3819, 3971, 4108, 4230, 4337, 4427, 4498, 4547, 4574 }, + {575, 605, 473, 83, -707, -2040, -3349, -3498, -2161, 138, 3600, 8306, 10982, 6466, -4506, -12419, -8757, 2951, 10817, 8720, 1808, -2283, -2342, -1725, -2024, -2125, -1406, -621, -198, 249, 866, 1299, 1392, 1339, 1258, 1123, 973, 856, 717, 544, 425, 380, 323, 228, 171, 173, 172, 154, 151, 153, 113, 32, -66, -179, -310, -437, -542, -632, -709, -755, -775, -790, -796, -777, -739, -693, -635, -555, -464, -372, -272, -160, -41, 84, 234, 413, 615, 836, 1075, 1324, 1578, 1843, 2118, 2381, 2610, 2806, 2978, 3124, 3229, 3280, 3272, 3206, 3097, 2955, 2786, 2601, + 2420, 2261, 2123, 2009, 1931, 1896, 1896, 1911, 1932, 1962, 2010, 2082, 2171, 2260, 2336, 2400, 2462, 2525, 2584, 2628, 2650, 2648, 2630, 2608, 2588, 2563, 2521, 2449, 2344, 2214, 2066, 1904, 1721, 1510, 1267, 995, 701, 398, 94, -206, -505, -801, -1095, -1387, -1668, -1928, -2160, -2370, -2566, -2754, -2938, -3122, -3305, -3485, -3657, -3819, -3971, -4108, -4230, -4337, -4427, -4498, -4547, -4574 } + }, + { + {-205, -72, 48, -25, -471, -1257, -1695, -810, 1225, 2590, 1741, -477, -1748, -1197, -151, 77, -167, 1, 423, 380, -92, -337, -197, -152, -442, -726, -668, -363, -78, 92, 179, 174, 46, -189, -472, -744, -951, -1080, -1170, -1255, -1320, -1322, -1254, -1149, -1039, -949, -901, -904, -940, -979, -997, -984, -934, -848, -734, -606, -470, -329, -185, -43, 96, 231, 361, 477, 573, 648, 710, 759, 792, 813, 834, 860, 885, 909, 944, 1004, 1091, 1206, 1359, 1563, 1818, 2116, 2450, 2819, 3226, 3667, 4126, 4576, 4998, 5392, 5754, 6058, 6263, 6341, 6289, 6112, + 5816, 5400, 4877, 4276, 3643, 3012, 2395, 1793, 1220, 714, 298, -39, -339, -640, -947, -1238, -1483, -1677, -1840, -1996, -2153, -2303, -2437, -2552, -2655, -2758, -2872, -2998, -3127, -3247, -3356, -3451, -3531, -3594, -3639, -3662, -3663, -3648, -3624, -3594, -3556, -3511, -3455, -3385, -3310, -3241, -3183, -3132, -3086, -3041, -2992, -2934, -2878, -2836, -2815, -2812, -2825, -2854, -2889, -2923, -2953, -2977, -2994, -3002 }, + {205, 72, -48, 25, 471, 1257, 1695, 810, -1225, -2590, -1741, 477, 1748, 1197, 151, -77, 167, -1, -423, -380, 92, 337, 197, 152, 442, 726, 668, 363, 78, -92, -179, -174, -46, 189, 472, 744, 951, 1080, 1170, 1255, 1320, 1322, 1254, 1149, 1039, 949, 901, 904, 940, 979, 997, 984, 934, 848, 734, 606, 470, 329, 185, 43, -96, -231, -361, -477, -573, -648, -710, -759, -792, -813, -834, -860, -885, -909, -944, -1004, -1091, -1206, -1359, -1563, -1818, -2116, -2450, -2819, -3226, -3667, -4126, -4576, -4998, -5392, -5754, -6058, -6263, -6341, -6289, -6112, + -5816, -5400, -4877, -4276, -3643, -3012, -2395, -1793, -1220, -714, -298, 39, 339, 640, 947, 1238, 1483, 1677, 1840, 1996, 2153, 2303, 2437, 2552, 2655, 2758, 2872, 2998, 3127, 3247, 3356, 3451, 3531, 3594, 3639, 3662, 3663, 3648, 3624, 3594, 3556, 3511, 3455, 3385, 3310, 3241, 3183, 3132, 3086, 3041, 2992, 2934, 2878, 2836, 2815, 2812, 2825, 2854, 2889, 2923, 2953, 2977, 2994, 3002 } + }, + { + {-417, -191, 303, 541, 76, -222, 1065, 3512, 4418, 1533, -4089, -8281, -7047, -451, 6445, 7706, 2560, -3582, -5114, -2101, 1138, 1878, 1120, 550, 125, -712, -1468, -1433, -912, -677, -845, -1004, -944, -715, -296, 346, 1063, 1667, 2116, 2452, 2679, 2811, 2899, 2960, 2963, 2911, 2836, 2735, 2586, 2398, 2187, 1924, 1575, 1149, 682, 195, -294, -753, -1171, -1567, -1955, -2323, -2659, -2959, -3213, -3395, -3481, -3454, -3307, -3040, -2662, -2180, -1593, -915, -181, 580, 1356, 2136, 2896, 3599, 4225, 4777, 5257, 5657, 5963, 6170, 6286, 6318, 6260, 6102, 5841, 5469, 4973, 4348, 3608, 2779, + 1883, 937, -21, -935, -1756, -2458, -3042, -3513, -3861, -4058, -4087, -3965, -3741, -3466, -3159, -2822, -2458, -2075, -1684, -1300, -940, -616, -337, -101, 98, 277, 451, 622, 775, 891, 957, 969, 936, 869, 776, 653, 491, 288, 49, -218, -503, -797, -1099, -1406, -1708, -1993, -2254, -2488, -2690, -2854, -2983, -3084, -3155, -3196, -3218, -3230, -3237, -3243, -3254, -3271, -3287, -3297, -3304, -3309 }, + {417, 191, -303, -541, -76, 222, -1065, -3512, -4418, -1533, 4089, 8281, 7047, 451, -6445, -7706, -2560, 3582, 5114, 2101, -1138, -1878, -1120, -550, -125, 712, 1468, 1433, 912, 677, 845, 1004, 944, 715, 296, -346, -1063, -1667, -2116, -2452, -2679, -2811, -2899, -2960, -2963, -2911, -2836, -2735, -2586, -2398, -2187, -1924, -1575, -1149, -682, -195, 294, 753, 1171, 1567, 1955, 2323, 2659, 2959, 3213, 3395, 3481, 3454, 3307, 3040, 2662, 2180, 1593, 915, 181, -580, -1356, -2136, -2896, -3599, -4225, -4777, -5257, -5657, -5963, -6170, -6286, -6318, -6260, -6102, -5841, -5469, -4973, -4348, -3608, -2779, + -1883, -937, 21, 935, 1756, 2458, 3042, 3513, 3861, 4058, 4087, 3965, 3741, 3466, 3159, 2822, 2458, 2075, 1684, 1300, 940, 616, 337, 101, -98, -277, -451, -622, -775, -891, -957, -969, -936, -869, -776, -653, -491, -288, -49, 218, 503, 797, 1099, 1406, 1708, 1993, 2254, 2488, 2690, 2854, 2983, 3084, 3155, 3196, 3218, 3230, 3237, 3243, 3254, 3271, 3287, 3297, 3304, 3309 } + }, + { + {-16, -91, -85, 143, 559, 964, 1115, 797, -71, -1167, -1698, -1031, 456, 1517, 1313, 282, -546, -748, -631, -429, -23, 589, 1078, 1247, 1300, 1464, 1603, 1418, 844, 99, -545, -918, -979, -824, -631, -529, -511, -492, -406, -249, -66, 91, 203, 291, 379, 473, 579, 702, 834, 950, 1038, 1099, 1133, 1131, 1091, 1007, 868, 674, 441, 181, -99, -389, -679, -970, -1266, -1562, -1847, -2128, -2409, -2670, -2883, -3033, -3112, -3099, -2980, -2760, -2453, -2063, -1596, -1076, -520, 67, 686, 1320, 1944, 2538, 3100, 3637, 4138, 4569, 4893, 5102, 5212, 5226, 5126, 4900, + 4551, 4104, 3594, 3067, 2547, 2028, 1494, 957, 453, 27, -292, -510, -665, -790, -882, -912, -864, -746, -580, -389, -194, 1, 214, 457, 723, 999, 1275, 1537, 1770, 1978, 2169, 2340, 2480, 2586, 2657, 2679, 2640, 2549, 2413, 2226, 1988, 1706, 1382, 1008, 590, 146, -315, -794, -1278, -1749, -2207, -2653, -3068, -3433, -3757, -4053, -4316, -4542, -4745, -4935, -5098, -5220, -5304, -5351 }, + {-16, -91, -85, 143, 559, 964, 1115, 797, -71, -1167, -1698, -1031, 456, 1517, 1313, 282, -546, -748, -631, -429, -23, 589, 1078, 1247, 1300, 1464, 1603, 1418, 844, 99, -545, -918, -979, -824, -631, -529, -511, -492, -406, -249, -66, 91, 203, 291, 379, 473, 579, 702, 834, 950, 1038, 1099, 1133, 1131, 1091, 1007, 868, 674, 441, 181, -99, -389, -679, -970, -1266, -1562, -1847, -2128, -2409, -2670, -2883, -3033, -3112, -3099, -2980, -2760, -2453, -2063, -1596, -1076, -520, 67, 686, 1320, 1944, 2538, 3100, 3637, 4138, 4569, 4893, 5102, 5212, 5226, 5126, 4900, + 4551, 4104, 3594, 3067, 2547, 2028, 1494, 957, 453, 27, -292, -510, -665, -790, -882, -912, -864, -746, -580, -389, -194, 1, 214, 457, 723, 999, 1275, 1537, 1770, 1978, 2169, 2340, 2480, 2586, 2657, 2679, 2640, 2549, 2413, 2226, 1988, 1706, 1382, 1008, 590, 146, -315, -794, -1278, -1749, -2207, -2653, -3068, -3433, -3757, -4053, -4316, -4542, -4745, -4935, -5098, -5220, -5304, -5351 } + }, + { + {-370, -432, -155, 505, 1116, 1382, 1208, 299, -1417, -2922, -2675, -491, 1889, 2561, 1355, -354, -1189, -787, 264, 974, 684, -379, -1318, -1469, -949, -272, 268, 671, 966, 1161, 1321, 1487, 1590, 1542, 1371, 1169, 961, 718, 455, 231, 82, 1, -40, -73, -125, -215, -356, -557, -808, -1072, -1306, -1489, -1612, -1677, -1696, -1697, -1708, -1738, -1788, -1861, -1961, -2085, -2221, -2354, -2460, -2517, -2512, -2440, -2299, -2094, -1841, -1569, -1288, -998, -704, -431, -195, 16, 215, 392, 516, 582, 616, 644, 659, 651, 645, 686, 798, 954, 1115, 1264, 1414, 1581, 1769, 1968, + 2165, 2352, 2520, 2671, 2821, 2997, 3212, 3455, 3697, 3916, 4112, 4290, 4442, 4549, 4595, 4579, 4509, 4391, 4222, 3992, 3692, 3327, 2917, 2486, 2047, 1603, 1148, 680, 208, -246, -660, -1026, -1353, -1658, -1956, -2241, -2491, -2681, -2803, -2868, -2894, -2896, -2882, -2854, -2800, -2708, -2578, -2419, -2240, -2044, -1835, -1623, -1418, -1226, -1047, -879, -722, -575, -441, -321, -216, -133, -78, -52 }, + {-370, -432, -155, 505, 1116, 1382, 1208, 299, -1417, -2922, -2675, -491, 1889, 2561, 1355, -354, -1189, -787, 264, 974, 684, -379, -1318, -1469, -949, -272, 268, 671, 966, 1161, 1321, 1487, 1590, 1542, 1371, 1169, 961, 718, 455, 231, 82, 1, -40, -73, -125, -215, -356, -557, -808, -1072, -1306, -1489, -1612, -1677, -1696, -1697, -1708, -1738, -1788, -1861, -1961, -2085, -2221, -2354, -2460, -2517, -2512, -2440, -2299, -2094, -1841, -1569, -1288, -998, -704, -431, -195, 16, 215, 392, 516, 582, 616, 644, 659, 651, 645, 686, 798, 954, 1115, 1264, 1414, 1581, 1769, 1968, + 2165, 2352, 2520, 2671, 2821, 2997, 3212, 3455, 3697, 3916, 4112, 4290, 4442, 4549, 4595, 4579, 4509, 4391, 4222, 3992, 3692, 3327, 2917, 2486, 2047, 1603, 1148, 680, 208, -246, -660, -1026, -1353, -1658, -1956, -2241, -2491, -2681, -2803, -2868, -2894, -2896, -2882, -2854, -2800, -2708, -2578, -2419, -2240, -2044, -1835, -1623, -1418, -1226, -1047, -879, -722, -575, -441, -321, -216, -133, -78, -52 } + }, + { + {117, -109, -226, -220, -371, -437, 303, 1656, 1927, -200, -3364, -4337, -1719, 2046, 3258, 1127, -1658, -2418, -1322, -283, -141, -49, 769, 1867, 2418, 2341, 2116, 1958, 1654, 1020, 142, -790, -1622, -2244, -2608, -2764, -2796, -2741, -2606, -2412, -2191, -1961, -1756, -1626, -1590, -1620, -1677, -1733, -1767, -1756, -1694, -1591, -1454, -1284, -1096, -918, -769, -663, -608, -609, -664, -764, -898, -1053, -1218, -1381, -1531, -1656, -1748, -1800, -1802, -1739, -1605, -1400, -1129, -798, -419, -7, 420, 844, 1244, 1617, 1976, 2325, 2653, 2960, 3254, 3537, 3812, 4104, 4459, 4889, 5352, 5791, 6191, 6564, + 6908, 7181, 7326, 7309, 7131, 6810, 6359, 5781, 5093, 4326, 3516, 2680, 1815, 921, 16, -861, -1672, -2404, -3072, -3697, -4280, -4801, -5241, -5594, -5876, -6113, -6328, -6524, -6689, -6808, -6878, -6904, -6889, -6830, -6715, -6531, -6279, -5970, -5610, -5201, -4741, -4225, -3652, -3030, -2379, -1728, -1091, -472, 124, 697, 1249, 1779, 2270, 2708, 3096, 3445, 3765, 4058, 4330, 4583, 4808, 4989, 5112, 5175 }, + {117, -109, -226, -220, -371, -437, 303, 1656, 1927, -200, -3364, -4337, -1719, 2046, 3258, 1127, -1658, -2418, -1322, -283, -141, -49, 769, 1867, 2418, 2341, 2116, 1958, 1654, 1020, 142, -790, -1622, -2244, -2608, -2764, -2796, -2741, -2606, -2412, -2191, -1961, -1756, -1626, -1590, -1620, -1677, -1733, -1767, -1756, -1694, -1591, -1454, -1284, -1096, -918, -769, -663, -608, -609, -664, -764, -898, -1053, -1218, -1381, -1531, -1656, -1748, -1800, -1802, -1739, -1605, -1400, -1129, -798, -419, -7, 420, 844, 1244, 1617, 1976, 2325, 2653, 2960, 3254, 3537, 3812, 4104, 4459, 4889, 5352, 5791, 6191, 6564, + 6908, 7181, 7326, 7309, 7131, 6810, 6359, 5781, 5093, 4326, 3516, 2680, 1815, 921, 16, -861, -1672, -2404, -3072, -3697, -4280, -4801, -5241, -5594, -5876, -6113, -6328, -6524, -6689, -6808, -6878, -6904, -6889, -6830, -6715, -6531, -6279, -5970, -5610, -5201, -4741, -4225, -3652, -3030, -2379, -1728, -1091, -472, 124, 697, 1249, 1779, 2270, 2708, 3096, 3445, 3765, 4058, 4330, 4583, 4808, 4989, 5112, 5175 } + }, + { + {-91, -79, -61, -46, -73, -183, -294, -173, 209, 304, -507, -1748, -1792, 195, 2579, 2675, 71, -2564, -2573, -335, 1608, 1702, 610, -334, -648, -534, -139, 483, 1111, 1500, 1616, 1564, 1422, 1259, 1164, 1147, 1098, 910, 582, 165, -293, -730, -1081, -1315, -1444, -1487, -1465, -1417, -1375, -1355, -1355, -1381, -1436, -1505, -1567, -1610, -1628, -1620, -1598, -1582, -1580, -1599, -1646, -1726, -1830, -1944, -2061, -2179, -2295, -2401, -2494, -2573, -2633, -2666, -2676, -2672, -2661, -2637, -2597, -2552, -2517, -2489, -2442, -2362, -2264, -2163, -2048, -1888, -1673, -1430, -1193, -980, -787, -612, -468, -379, + -356, -385, -439, -509, -610, -756, -939, -1124, -1272, -1363, -1399, -1400, -1382, -1345, -1276, -1165, -1017, -848, -676, -511, -356, -203, -46, 119, 291, 463, 636, 811, 992, 1173, 1348, 1507, 1645, 1759, 1851, 1927, 1992, 2052, 2111, 2173, 2246, 2333, 2438, 2564, 2713, 2885, 3071, 3264, 3457, 3638, 3796, 3922, 4016, 4078, 4111, 4116, 4100, 4069, 4028, 3981, 3932, 3888, 3855, 3837 }, + {-91, -79, -61, -46, -73, -183, -294, -173, 209, 304, -507, -1748, -1792, 195, 2579, 2675, 71, -2564, -2573, -335, 1608, 1702, 610, -334, -648, -534, -139, 483, 1111, 1500, 1616, 1564, 1422, 1259, 1164, 1147, 1098, 910, 582, 165, -293, -730, -1081, -1315, -1444, -1487, -1465, -1417, -1375, -1355, -1355, -1381, -1436, -1505, -1567, -1610, -1628, -1620, -1598, -1582, -1580, -1599, -1646, -1726, -1830, -1944, -2061, -2179, -2295, -2401, -2494, -2573, -2633, -2666, -2676, -2672, -2661, -2637, -2597, -2552, -2517, -2489, -2442, -2362, -2264, -2163, -2048, -1888, -1673, -1430, -1193, -980, -787, -612, -468, -379, + -356, -385, -439, -509, -610, -756, -939, -1124, -1272, -1363, -1399, -1400, -1382, -1345, -1276, -1165, -1017, -848, -676, -511, -356, -203, -46, 119, 291, 463, 636, 811, 992, 1173, 1348, 1507, 1645, 1759, 1851, 1927, 1992, 2052, 2111, 2173, 2246, 2333, 2438, 2564, 2713, 2885, 3071, 3264, 3457, 3638, 3796, 3922, 4016, 4078, 4111, 4116, 4100, 4069, 4028, 3981, 3932, 3888, 3855, 3837 } + } +}; +const Word16 CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][L_FRAME32k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + {-2902, -7944, -11187, -12480, -12217, -11054, -9614, -7901, -5294, -1637, 2273, 5718, 8473, 9308, 5915, -1402, -7249, -5770, 1906, 7832, 5964, -1678, -8773, -12015, -12542, -12061, -10647, -8155, -5340, -2909, -760, 1360, 3273, 4779, 6008, 7116, 8058, 8791, 9404, 9953, 10412, 10793, 11143, 11447, 11666, 11828, 11974, 12083, 12129, 12147, 12164, 12155, 12102, 12029, 11946, 11835, 11698, 11562, 11430, 11287, 11141, 11010, 10885, 10751, 10617, 10498, 10385, 10266, 10153, 10052, 9957, 9858, 9764, 9676, 9586, 9492, 9395, 9295, 9190, 9080, 8958, 8819, 8670, 8522, 8373, 8208, 8032, 7863, 7703, 7537, 7360, 7183, 7021, 6876, 6744, 6620, + 6503, 6404, 6334, 6290, 6255, 6218, 6185, 6167, 6163, 6164, 6162, 6146, 6117, 6085, 6057, 6027, 5984, 5923, 5845, 5757, 5663, 5572, 5481, 5384, 5278, 5168, 5056, 4946, 4838, 4732, 4623, 4511, 4399, 4291, 4191, 4097, 4012, 3932, 3855, 3778, 3704, 3633, 3565, 3500, 3436, 3367, 3288, 3198, 3095, 2978, 2844, 2694, 2528, 2348, 2152, 1943, 1726, 1501, 1273, 1043, 813, 582, 349, 116 }, + {-2902, -7944, -11187, -12480, -12217, -11054, -9614, -7901, -5294, -1637, 2273, 5718, 8473, 9308, 5915, -1402, -7249, -5770, 1906, 7832, 5964, -1678, -8773, -12015, -12542, -12061, -10647, -8155, -5340, -2909, -760, 1360, 3273, 4779, 6008, 7116, 8058, 8791, 9404, 9953, 10412, 10793, 11143, 11447, 11666, 11828, 11974, 12083, 12129, 12147, 12164, 12155, 12102, 12029, 11946, 11835, 11698, 11562, 11430, 11287, 11141, 11010, 10885, 10751, 10617, 10498, 10385, 10266, 10153, 10052, 9957, 9858, 9764, 9676, 9586, 9492, 9395, 9295, 9190, 9080, 8958, 8819, 8670, 8522, 8373, 8208, 8032, 7863, 7703, 7537, 7360, 7183, 7021, 6876, 6744, 6620, + 6503, 6404, 6334, 6290, 6255, 6218, 6185, 6167, 6163, 6164, 6162, 6146, 6117, 6085, 6057, 6027, 5984, 5923, 5845, 5757, 5663, 5572, 5481, 5384, 5278, 5168, 5056, 4946, 4838, 4732, 4623, 4511, 4399, 4291, 4191, 4097, 4012, 3932, 3855, 3778, 3704, 3633, 3565, 3500, 3436, 3367, 3288, 3198, 3095, 2978, 2844, 2694, 2528, 2348, 2152, 1943, 1726, 1501, 1273, 1043, 813, 582, 349, 116 } + }, + { + {2287, 5520, 5056, 99, -7577, -14863, -19516, -20478, -17241, -10618, -3009, 4098, 11322, 17365, 16253, 4208, -11106, -15091, -2917, 13419, 18577, 10382, -1350, -8584, -11569, -13251, -13840, -12547, -10353, -8662, -7335, -5653, -3788, -2241, -900, 539, 1974, 3242, 4459, 5702, 6839, 7820, 8745, 9607, 10303, 10868, 11402, 11865, 12174, 12385, 12592, 12771, 12882, 12968, 13056, 13095, 13068, 13021, 12953, 12824, 12647, 12473, 12293, 12069, 11826, 11609, 11402, 11176, 10957, 10776, 10617, 10465, 10342, 10265, 10214, 10177, 10164, 10169, 10180, 10197, 10217, 10220, 10205, 10192, 10186, 10158, 10104, 10055, 10024, 9995, 9966, 9953, 9953, 9948, 9937, 9922, + 9886, 9811, 9700, 9557, 9368, 9123, 8839, 8531, 8202, 7852, 7496, 7140, 6793, 6481, 6226, 6022, 5851, 5704, 5580, 5475, 5391, 5336, 5307, 5276, 5225, 5152, 5064, 4965, 4872, 4795, 4729, 4658, 4585, 4518, 4455, 4389, 4326, 4269, 4211, 4148, 4087, 4032, 3975, 3913, 3850, 3786, 3715, 3642, 3570, 3493, 3397, 3281, 3148, 2991, 2805, 2593, 2361, 2103, 1818, 1515, 1200, 868, 522, 173 }, + {-2287, -5520, -5056, -99, 7577, 14863, 19516, 20478, 17241, 10618, 3009, -4098, -11322, -17365, -16253, -4208, 11106, 15091, 2917, -13419, -18577, -10382, 1350, 8584, 11569, 13251, 13840, 12547, 10353, 8662, 7335, 5653, 3788, 2241, 900, -539, -1974, -3242, -4459, -5702, -6839, -7820, -8745, -9607, -10303, -10868, -11402, -11865, -12174, -12385, -12592, -12771, -12882, -12968, -13056, -13095, -13068, -13021, -12953, -12824, -12647, -12473, -12293, -12069, -11826, -11609, -11402, -11176, -10957, -10776, -10617, -10465, -10342, -10265, -10214, -10177, -10164, -10169, -10180, -10197, -10217, -10220, -10205, -10192, -10186, -10158, -10104, -10055, -10024, -9995, -9966, -9953, -9953, -9948, -9937, -9922, + -9886, -9811, -9700, -9557, -9368, -9123, -8839, -8531, -8202, -7852, -7496, -7140, -6793, -6481, -6226, -6022, -5851, -5704, -5580, -5475, -5391, -5336, -5307, -5276, -5225, -5152, -5064, -4965, -4872, -4795, -4729, -4658, -4585, -4518, -4455, -4389, -4326, -4269, -4211, -4148, -4087, -4032, -3975, -3913, -3850, -3786, -3715, -3642, -3570, -3493, -3397, -3281, -3148, -2991, -2805, -2593, -2361, -2103, -1818, -1515, -1200, -868, -522, -173 } + }, + { + {-274, -1116, -2138, -2311, -1100, 635, 1552, 1212, 202, -736, -1226, -1105, -295, 887, 1581, 1024, -414, -1236, -352, 1482, 2312, 1139, -1082, -2722, -3166, -2898, -2480, -2059, -1633, -1249, -894, -499, -92, 216, 377, 422, 376, 287, 260, 378, 628, 947, 1309, 1711, 2133, 2558, 3001, 3480, 3996, 4551, 5144, 5754, 6347, 6901, 7409, 7854, 8213, 8476, 8647, 8724, 8696, 8555, 8303, 7933, 7435, 6806, 6053, 5193, 4242, 3220, 2156, 1083, 34, -957, -1855, -2634, -3288, -3816, -4199, -4427, -4526, -4536, -4469, -4308, -4060, -3771, -3487, -3204, -2888, -2535, -2180, -1864, -1593, -1354, -1137, -955, + -824, -757, -759, -826, -940, -1080, -1239, -1420, -1624, -1842, -2045, -2203, -2297, -2336, -2336, -2303, -2230, -2108, -1936, -1714, -1448, -1150, -832, -507, -188, 110, 382, 624, 827, 984, 1093, 1160, 1190, 1189, 1164, 1120, 1062, 1002, 959, 945, 957, 988, 1028, 1056, 1053, 1021, 974, 917, 845, 762, 678, 593, 506, 426, 362, 311, 266, 230, 202, 171, 134, 96, 60, 21 }, + {-274, -1116, -2138, -2311, -1100, 635, 1552, 1212, 202, -736, -1226, -1105, -295, 887, 1581, 1024, -414, -1236, -352, 1482, 2312, 1139, -1082, -2722, -3166, -2898, -2480, -2059, -1633, -1249, -894, -499, -92, 216, 377, 422, 376, 287, 260, 378, 628, 947, 1309, 1711, 2133, 2558, 3001, 3480, 3996, 4551, 5144, 5754, 6347, 6901, 7409, 7854, 8213, 8476, 8647, 8724, 8696, 8555, 8303, 7933, 7435, 6806, 6053, 5193, 4242, 3220, 2156, 1083, 34, -957, -1855, -2634, -3288, -3816, -4199, -4427, -4526, -4536, -4469, -4308, -4060, -3771, -3487, -3204, -2888, -2535, -2180, -1864, -1593, -1354, -1137, -955, + -824, -757, -759, -826, -940, -1080, -1239, -1420, -1624, -1842, -2045, -2203, -2297, -2336, -2336, -2303, -2230, -2108, -1936, -1714, -1448, -1150, -832, -507, -188, 110, 382, 624, 827, 984, 1093, 1160, 1190, 1189, 1164, 1120, 1062, 1002, 959, 945, 957, 988, 1028, 1056, 1053, 1021, 974, 917, 845, 762, 678, 593, 506, 426, 362, 311, 266, 230, 202, 171, 134, 96, 60, 21 } + }, + { + {102, -16, -743, -1612, -1771, -949, 40, 108, -824, -1763, -1895, -1288, -222, 1261, 2533, 2132, -353, -2705, -2029, 1569, 4680, 4419, 1336, -2055, -4366, -5923, -7173, -7897, -7873, -7325, -6513, -5423, -4009, -2389, -711, 946, 2504, 3870, 5005, 5922, 6629, 7146, 7526, 7804, 7971, 8035, 8036, 7991, 7874, 7670, 7396, 7069, 6707, 6355, 6062, 5842, 5670, 5521, 5379, 5225, 5045, 4840, 4622, 4395, 4162, 3929, 3699, 3464, 3208, 2921, 2607, 2270, 1901, 1492, 1056, 615, 178, -259, -680, -1052, -1362, -1627, -1851, -2009, -2085, -2103, -2096, -2071, -2018, -1948, -1877, -1796, -1684, -1531, -1344, -1128, + -869, -549, -164, 270, 731, 1216, 1730, 2271, 2812, 3323, 3793, 4226, 4633, 5006, 5324, 5570, 5745, 5873, 5986, 6095, 6186, 6235, 6233, 6191, 6136, 6095, 6079, 6083, 6087, 6079, 6059, 6038, 6024, 6020, 6025, 6026, 6010, 5964, 5884, 5772, 5629, 5461, 5267, 5047, 4793, 4506, 4193, 3863, 3527, 3193, 2872, 2567, 2280, 2011, 1759, 1526, 1310, 1110, 923, 745, 574, 408, 246, 82 }, + {102, -16, -743, -1612, -1771, -949, 40, 108, -824, -1763, -1895, -1288, -222, 1261, 2533, 2132, -353, -2705, -2029, 1569, 4680, 4419, 1336, -2055, -4366, -5923, -7173, -7897, -7873, -7325, -6513, -5423, -4009, -2389, -711, 946, 2504, 3870, 5005, 5922, 6629, 7146, 7526, 7804, 7971, 8035, 8036, 7991, 7874, 7670, 7396, 7069, 6707, 6355, 6062, 5842, 5670, 5521, 5379, 5225, 5045, 4840, 4622, 4395, 4162, 3929, 3699, 3464, 3208, 2921, 2607, 2270, 1901, 1492, 1056, 615, 178, -259, -680, -1052, -1362, -1627, -1851, -2009, -2085, -2103, -2096, -2071, -2018, -1948, -1877, -1796, -1684, -1531, -1344, -1128, + -869, -549, -164, 270, 731, 1216, 1730, 2271, 2812, 3323, 3793, 4226, 4633, 5006, 5324, 5570, 5745, 5873, 5986, 6095, 6186, 6235, 6233, 6191, 6136, 6095, 6079, 6083, 6087, 6079, 6059, 6038, 6024, 6020, 6025, 6026, 6010, 5964, 5884, 5772, 5629, 5461, 5267, 5047, 4793, 4506, 4193, 3863, 3527, 3193, 2872, 2567, 2280, 2011, 1759, 1526, 1310, 1110, 923, 745, 574, 408, 246, 82 } + }, + { + {-71, -68, 176, 404, 320, 17, -125, -65, -310, -1288, -2679, -3464, -2569, 219, 3398, 4236, 1351, -2986, -4456, -1327, 3498, 5822, 4519, 1596, -997, -3013, -4744, -5932, -6263, -5971, -5436, -4707, -3722, -2601, -1460, -252, 1054, 2321, 3373, 4151, 4681, 5003, 5186, 5300, 5376, 5419, 5451, 5480, 5478, 5420, 5314, 5181, 5021, 4847, 4684, 4551, 4443, 4349, 4269, 4193, 4109, 4014, 3908, 3778, 3618, 3433, 3234, 3016, 2765, 2480, 2171, 1837, 1467, 1054, 610, 152, -320, -811, -1299, -1748, -2147, -2520, -2875, -3186, -3430, -3629, -3821, -4000, -4125, -4169, -4152, -4098, -4006, -3861, -3663, -3433, + -3197, -2965, -2732, -2489, -2244, -2016, -1816, -1651, -1520, -1417, -1329, -1234, -1124, -1008, -900, -807, -723, -631, -511, -361, -196, -41, 88, 194, 294, 408, 545, 705, 881, 1062, 1249, 1443, 1644, 1847, 2043, 2215, 2347, 2429, 2461, 2446, 2390, 2300, 2184, 2042, 1879, 1703, 1531, 1375, 1244, 1141, 1068, 1018, 979, 942, 905, 861, 808, 743, 665, 574, 468, 349, 217, 74 }, + {71, 68, -176, -404, -320, -17, 125, 65, 310, 1288, 2679, 3464, 2569, -219, -3398, -4236, -1351, 2986, 4456, 1327, -3498, -5822, -4519, -1596, 997, 3013, 4744, 5932, 6263, 5971, 5436, 4707, 3722, 2601, 1460, 252, -1054, -2321, -3373, -4151, -4681, -5003, -5186, -5300, -5376, -5419, -5451, -5480, -5478, -5420, -5314, -5181, -5021, -4847, -4684, -4551, -4443, -4349, -4269, -4193, -4109, -4014, -3908, -3778, -3618, -3433, -3234, -3016, -2765, -2480, -2171, -1837, -1467, -1054, -610, -152, 320, 811, 1299, 1748, 2147, 2520, 2875, 3186, 3430, 3629, 3821, 4000, 4125, 4169, 4152, 4098, 4006, 3861, 3663, 3433, + 3197, 2965, 2732, 2489, 2244, 2016, 1816, 1651, 1520, 1417, 1329, 1234, 1124, 1008, 900, 807, 723, 631, 511, 361, 196, 41, -88, -194, -294, -408, -545, -705, -881, -1062, -1249, -1443, -1644, -1847, -2043, -2215, -2347, -2429, -2461, -2446, -2390, -2300, -2184, -2042, -1879, -1703, -1531, -1375, -1244, -1141, -1068, -1018, -979, -942, -905, -861, -808, -743, -665, -574, -468, -349, -217, -74 } + }, + { + {-355, -386, 394, 562, -380, -801, 672, 2663, 2483, -312, -3229, -3743, -1731, 1046, 2681, 2150, -108, -2082, -1719, 760, 2872, 2713, 983, -359, -517, -94, 324, 756, 1222, 1460, 1311, 898, 364, -231, -809, -1300, -1742, -2184, -2554, -2736, -2713, -2536, -2245, -1889, -1550, -1272, -1039, -812, -576, -310, -1, 341, 698, 1082, 1510, 1968, 2416, 2826, 3178, 3453, 3628, 3692, 3646, 3488, 3213, 2812, 2283, 1631, 869, 7, -936, -1927, -2924, -3886, -4775, -5558, -6216, -6741, -7119, -7338, -7419, -7399, -7290, -7073, -6744, -6343, -5908, -5440, -4922, -4358, -3764, -3136, -2461, -1739, -991, -231, + 535, 1297, 2029, 2702, 3306, 3839, 4293, 4633, 4827, 4873, 4811, 4700, 4566, 4393, 4149, 3829, 3470, 3121, 2814, 2554, 2322, 2101, 1889, 1701, 1548, 1430, 1335, 1248, 1151, 1032, 892, 735, 557, 358, 144, -70, -276, -467, -631, -763, -866, -941, -989, -1016, -1036, -1048, -1049, -1043, -1037, -1029, -1012, -985, -952, -908, -850, -785, -719, -644, -559, -471, -380, -278, -166, -54 }, + {355, 386, -394, -562, 380, 801, -672, -2663, -2483, 312, 3229, 3743, 1731, -1046, -2681, -2150, 108, 2082, 1719, -760, -2872, -2713, -983, 359, 517, 94, -324, -756, -1222, -1460, -1311, -898, -364, 231, 809, 1300, 1742, 2184, 2554, 2736, 2713, 2536, 2245, 1889, 1550, 1272, 1039, 812, 576, 310, 1, -341, -698, -1082, -1510, -1968, -2416, -2826, -3178, -3453, -3628, -3692, -3646, -3488, -3213, -2812, -2283, -1631, -869, -7, 936, 1927, 2924, 3886, 4775, 5558, 6216, 6741, 7119, 7338, 7419, 7399, 7290, 7073, 6744, 6343, 5908, 5440, 4922, 4358, 3764, 3136, 2461, 1739, 991, 231, + -535, -1297, -2029, -2702, -3306, -3839, -4293, -4633, -4827, -4873, -4811, -4700, -4566, -4393, -4149, -3829, -3470, -3121, -2814, -2554, -2322, -2101, -1889, -1701, -1548, -1430, -1335, -1248, -1151, -1032, -892, -735, -557, -358, -144, 70, 276, 467, 631, 763, 866, 941, 989, 1016, 1036, 1048, 1049, 1043, 1037, 1029, 1012, 985, 952, 908, 850, 785, 719, 644, 559, 471, 380, 278, 166, 54 } + }, + { + {59, -97, -579, -832, -667, -573, -731, -414, 1114, 3549, 5759, 6389, 4123, -1192, -6702, -7585, -2173, 4824, 6748, 2514, -2656, -4043, -2232, -379, 416, 1076, 1812, 1806, 971, 201, 10, 83, 103, 124, 166, 90, -116, -326, -506, -711, -941, -1178, -1443, -1716, -1921, -2049, -2174, -2315, -2422, -2492, -2566, -2638, -2663, -2638, -2578, -2464, -2273, -2022, -1731, -1387, -986, -547, -74, 444, 994, 1543, 2081, 2604, 3082, 3481, 3797, 4032, 4167, 4182, 4075, 3855, 3520, 3073, 2525, 1886, 1175, 416, -375, -1196, -2037, -2869, -3673, -4450, -5197, -5902, -6557, -7161, -7682, -8071, -8307, -8403, + -8371, -8201, -7876, -7397, -6791, -6121, -5460, -4844, -4271, -3741, -3283, -2938, -2729, -2660, -2719, -2876, -3100, -3369, -3672, -3999, -4343, -4693, -5029, -5323, -5555, -5729, -5859, -5958, -6037, -6104, -6158, -6195, -6223, -6251, -6276, -6283, -6268, -6232, -6175, -6098, -6005, -5895, -5757, -5576, -5343, -5059, -4730, -4371, -3993, -3604, -3214, -2836, -2484, -2159, -1861, -1592, -1355, -1139, -938, -748, -570, -400, -236, -78 }, + {59, -97, -579, -832, -667, -573, -731, -414, 1114, 3549, 5759, 6389, 4123, -1192, -6702, -7585, -2173, 4824, 6748, 2514, -2656, -4043, -2232, -379, 416, 1076, 1812, 1806, 971, 201, 10, 83, 103, 124, 166, 90, -116, -326, -506, -711, -941, -1178, -1443, -1716, -1921, -2049, -2174, -2315, -2422, -2492, -2566, -2638, -2663, -2638, -2578, -2464, -2273, -2022, -1731, -1387, -986, -547, -74, 444, 994, 1543, 2081, 2604, 3082, 3481, 3797, 4032, 4167, 4182, 4075, 3855, 3520, 3073, 2525, 1886, 1175, 416, -375, -1196, -2037, -2869, -3673, -4450, -5197, -5902, -6557, -7161, -7682, -8071, -8307, -8403, + -8371, -8201, -7876, -7397, -6791, -6121, -5460, -4844, -4271, -3741, -3283, -2938, -2729, -2660, -2719, -2876, -3100, -3369, -3672, -3999, -4343, -4693, -5029, -5323, -5555, -5729, -5859, -5958, -6037, -6104, -6158, -6195, -6223, -6251, -6276, -6283, -6268, -6232, -6175, -6098, -6005, -5895, -5757, -5576, -5343, -5059, -4730, -4371, -3993, -3604, -3214, -2836, -2484, -2159, -1861, -1592, -1355, -1139, -938, -748, -570, -400, -236, -78 } + }, + { + {-583, -1346, -1177, -50, 1669, 3141, 3177, 1249, -1504, -3039, -2476, -867, 314, 723, 789, 595, -47, -770, -823, -109, 633, 812, 647, 630, 798, 828, 551, 64, -533, -1206, -1855, -2312, -2514, -2562, -2584, -2618, -2626, -2550, -2337, -1963, -1462, -922, -422, 8, 375, 690, 961, 1203, 1429, 1642, 1836, 2012, 2175, 2318, 2437, 2533, 2609, 2658, 2665, 2629, 2561, 2479, 2387, 2297, 2228, 2201, 2216, 2257, 2317, 2405, 2530, 2676, 2825, 2978, 3146, 3319, 3469, 3577, 3634, 3632, 3556, 3392, 3136, 2796, 2388, 1913, 1361, 733, 66, -600, -1276, -2013, -2831, -3690, -4532, -5340, + -6128, -6896, -7610, -8228, -8731, -9139, -9470, -9711, -9827, -9808, -9688, -9511, -9294, -9021, -8661, -8199, -7652, -7067, -6479, -5897, -5311, -4720, -4136, -3575, -3051, -2569, -2121, -1692, -1273, -867, -468, -63, 355, 785, 1217, 1628, 1994, 2314, 2607, 2889, 3159, 3410, 3632, 3796, 3884, 3902, 3878, 3824, 3740, 3628, 3491, 3314, 3085, 2821, 2548, 2275, 2002, 1737, 1486, 1236, 975, 702, 425, 143 }, + {-583, -1346, -1177, -50, 1669, 3141, 3177, 1249, -1504, -3039, -2476, -867, 314, 723, 789, 595, -47, -770, -823, -109, 633, 812, 647, 630, 798, 828, 551, 64, -533, -1206, -1855, -2312, -2514, -2562, -2584, -2618, -2626, -2550, -2337, -1963, -1462, -922, -422, 8, 375, 690, 961, 1203, 1429, 1642, 1836, 2012, 2175, 2318, 2437, 2533, 2609, 2658, 2665, 2629, 2561, 2479, 2387, 2297, 2228, 2201, 2216, 2257, 2317, 2405, 2530, 2676, 2825, 2978, 3146, 3319, 3469, 3577, 3634, 3632, 3556, 3392, 3136, 2796, 2388, 1913, 1361, 733, 66, -600, -1276, -2013, -2831, -3690, -4532, -5340, + -6128, -6896, -7610, -8228, -8731, -9139, -9470, -9711, -9827, -9808, -9688, -9511, -9294, -9021, -8661, -8199, -7652, -7067, -6479, -5897, -5311, -4720, -4136, -3575, -3051, -2569, -2121, -1692, -1273, -867, -468, -63, 355, 785, 1217, 1628, 1994, 2314, 2607, 2889, 3159, 3410, 3632, 3796, 3884, 3902, 3878, 3824, 3740, 3628, 3491, 3314, 3085, 2821, 2548, 2275, 2002, 1737, 1486, 1236, 975, 702, 425, 143 } + }, + { + {697, 1004, -470, -2369, -3687, -4681, -4983, -3019, 1603, 6861, 10441, 11235, 7993, -295, -10254, -13668, -5787, 7106, 13107, 7847, -1734, -7123, -7226, -6041, -5689, -5215, -4000, -2808, -1978, -963, 393, 1594, 2424, 3115, 3705, 3993, 3970, 3781, 3436, 2921, 2378, 1922, 1490, 1021, 573, 173, -229, -618, -912, -1116, -1313, -1527, -1736, -1954, -2201, -2442, -2652, -2856, -3059, -3223, -3340, -3445, -3537, -3580, -3578, -3559, -3512, -3412, -3276, -3138, -2997, -2842, -2694, -2569, -2450, -2326, -2208, -2098, -1990, -1894, -1826, -1771, -1704, -1628, -1550, -1453, -1324, -1176, -1031, -897, -783, -707, -675, -687, -760, -906, + -1090, -1258, -1390, -1490, -1546, -1531, -1419, -1200, -880, -488, -56, 410, 913, 1437, 1947, 2417, 2843, 3221, 3553, 3851, 4117, 4335, 4494, 4614, 4720, 4828, 4943, 5061, 5159, 5214, 5232, 5239, 5244, 5246, 5244, 5239, 5217, 5166, 5096, 5017, 4925, 4816, 4694, 4558, 4393, 4190, 3957, 3699, 3413, 3111, 2807, 2505, 2201, 1905, 1627, 1367, 1124, 908, 723, 558, 408, 278, 165, 56 }, + {697, 1004, -470, -2369, -3687, -4681, -4983, -3019, 1603, 6861, 10441, 11235, 7993, -295, -10254, -13668, -5787, 7106, 13107, 7847, -1734, -7123, -7226, -6041, -5689, -5215, -4000, -2808, -1978, -963, 393, 1594, 2424, 3115, 3705, 3993, 3970, 3781, 3436, 2921, 2378, 1922, 1490, 1021, 573, 173, -229, -618, -912, -1116, -1313, -1527, -1736, -1954, -2201, -2442, -2652, -2856, -3059, -3223, -3340, -3445, -3537, -3580, -3578, -3559, -3512, -3412, -3276, -3138, -2997, -2842, -2694, -2569, -2450, -2326, -2208, -2098, -1990, -1894, -1826, -1771, -1704, -1628, -1550, -1453, -1324, -1176, -1031, -897, -783, -707, -675, -687, -760, -906, + -1090, -1258, -1390, -1490, -1546, -1531, -1419, -1200, -880, -488, -56, 410, 913, 1437, 1947, 2417, 2843, 3221, 3553, 3851, 4117, 4335, 4494, 4614, 4720, 4828, 4943, 5061, 5159, 5214, 5232, 5239, 5244, 5246, 5244, 5239, 5217, 5166, 5096, 5017, 4925, 4816, 4694, 4558, 4393, 4190, 3957, 3699, 3413, 3111, 2807, 2505, 2201, 1905, 1627, 1367, 1124, 908, 723, 558, 408, 278, 165, 56 } + }, + { + {82, 346, 739, 1155, 1495, 1298, -91, -2427, -4576, -6001, -6543, -4401, 2387, 10611, 12001, 2837, -9057, -12018, -4263, 4927, 7429, 4479, 1683, 987, 588, -501, -1381, -1543, -1537, -1647, -1530, -1075, -594, -264, -8, 196, 314, 399, 485, 504, 446, 407, 415, 392, 318, 266, 258, 251, 244, 274, 331, 372, 389, 390, 360, 287, 189, 78, -54, -202, -342, -477, -624, -777, -920, -1058, -1199, -1335, -1455, -1569, -1683, -1793, -1897, -2006, -2120, -2225, -2309, -2373, -2410, -2415, -2393, -2343, -2249, -2100, -1909, -1697, -1465, -1205, -917, -612, -307, -23, 228, 441, 612, 731, + 795, 819, 813, 779, 722, 659, 612, 585, 568, 553, 541, 541, 570, 631, 714, 807, 905, 1019, 1152, 1307, 1476, 1649, 1814, 1973, 2138, 2322, 2525, 2740, 2955, 3160, 3353, 3543, 3732, 3915, 4083, 4227, 4337, 4409, 4448, 4462, 4453, 4421, 4366, 4284, 4173, 4033, 3879, 3723, 3568, 3412, 3255, 3093, 2920, 2732, 2530, 2313, 2082, 1837, 1581, 1315, 1038, 751, 455, 153 }, + {-82, -346, -739, -1155, -1495, -1298, 91, 2427, 4576, 6001, 6543, 4401, -2387, -10611, -12001, -2837, 9057, 12018, 4263, -4927, -7429, -4479, -1683, -987, -588, 501, 1381, 1543, 1537, 1647, 1530, 1075, 594, 264, 8, -196, -314, -399, -485, -504, -446, -407, -415, -392, -318, -266, -258, -251, -244, -274, -331, -372, -389, -390, -360, -287, -189, -78, 54, 202, 342, 477, 624, 777, 920, 1058, 1199, 1335, 1455, 1569, 1683, 1793, 1897, 2006, 2120, 2225, 2309, 2373, 2410, 2415, 2393, 2343, 2249, 2100, 1909, 1697, 1465, 1205, 917, 612, 307, 23, -228, -441, -612, -731, + -795, -819, -813, -779, -722, -659, -612, -585, -568, -553, -541, -541, -570, -631, -714, -807, -905, -1019, -1152, -1307, -1476, -1649, -1814, -1973, -2138, -2322, -2525, -2740, -2955, -3160, -3353, -3543, -3732, -3915, -4083, -4227, -4337, -4409, -4448, -4462, -4453, -4421, -4366, -4284, -4173, -4033, -3879, -3723, -3568, -3412, -3255, -3093, -2920, -2732, -2530, -2313, -2082, -1837, -1581, -1315, -1038, -751, -455, -153 } + }, + { + {53, 71, -95, -408, -674, -425, 712, 2104, 2195, 343, -1881, -2297, -816, 606, 679, 134, 79, 322, 108, -440, -617, -351, -210, -399, -508, -249, 141, 321, 256, 86, -125, -375, -620, -789, -843, -783, -640, -476, -328, -176, 12, 222, 408, 539, 613, 640, 638, 640, 679, 762, 881, 1022, 1169, 1309, 1428, 1524, 1599, 1655, 1692, 1711, 1715, 1704, 1676, 1631, 1575, 1519, 1468, 1420, 1381, 1360, 1358, 1369, 1389, 1431, 1500, 1590, 1692, 1806, 1932, 2057, 2162, 2237, 2276, 2276, 2227, 2113, 1915, 1627, 1262, 826, 310, -302, -1000, -1749, -2512, -3264, + -3984, -4649, -5225, -5684, -6016, -6237, -6370, -6419, -6375, -6248, -6078, -5916, -5784, -5666, -5530, -5356, -5153, -4954, -4780, -4626, -4476, -4320, -4160, -4004, -3863, -3737, -3619, -3492, -3349, -3190, -3019, -2839, -2651, -2459, -2262, -2066, -1878, -1703, -1541, -1390, -1246, -1108, -978, -863, -771, -699, -637, -580, -525, -472, -420, -379, -359, -358, -363, -368, -369, -357, -329, -287, -234, -174, -106, -35 }, + {-53, -71, 95, 408, 674, 425, -712, -2104, -2195, -343, 1881, 2297, 816, -606, -679, -134, -79, -322, -108, 440, 617, 351, 210, 399, 508, 249, -141, -321, -256, -86, 125, 375, 620, 789, 843, 783, 640, 476, 328, 176, -12, -222, -408, -539, -613, -640, -638, -640, -679, -762, -881, -1022, -1169, -1309, -1428, -1524, -1599, -1655, -1692, -1711, -1715, -1704, -1676, -1631, -1575, -1519, -1468, -1420, -1381, -1360, -1358, -1369, -1389, -1431, -1500, -1590, -1692, -1806, -1932, -2057, -2162, -2237, -2276, -2276, -2227, -2113, -1915, -1627, -1262, -826, -310, 302, 1000, 1749, 2512, 3264, + 3984, 4649, 5225, 5684, 6016, 6237, 6370, 6419, 6375, 6248, 6078, 5916, 5784, 5666, 5530, 5356, 5153, 4954, 4780, 4626, 4476, 4320, 4160, 4004, 3863, 3737, 3619, 3492, 3349, 3190, 3019, 2839, 2651, 2459, 2262, 2066, 1878, 1703, 1541, 1390, 1246, 1108, 978, 863, 771, 699, 637, 580, 525, 472, 420, 379, 359, 358, 363, 368, 369, 357, 329, 287, 234, 174, 106, 35 } + }, + { + {184, 540, 604, 173, -34, 811, 1848, 918, -2631, -6326, -6438, -1568, 5382, 8899, 5640, -1739, -6558, -4939, 287, 3503, 2776, 629, -468, -695, -988, -1076, -408, 520, 894, 777, 785, 1124, 1584, 2043, 2481, 2764, 2752, 2501, 2150, 1755, 1335, 935, 567, 194, -188, -546, -881, -1219, -1554, -1865, -2169, -2483, -2777, -3002, -3141, -3193, -3154, -3033, -2861, -2655, -2402, -2088, -1715, -1284, -785, -215, 410, 1067, 1731, 2375, 2977, 3526, 4000, 4369, 4612, 4734, 4743, 4630, 4386, 4020, 3561, 3032, 2439, 1783, 1076, 340, -410, -1174, -1950, -2731, -3504, -4260, -4981, -5634, -6183, -6606, + -6890, -7016, -6960, -6718, -6319, -5807, -5215, -4560, -3844, -3089, -2342, -1663, -1087, -607, -204, 134, 406, 606, 733, 785, 769, 697, 585, 451, 308, 165, 13, -165, -382, -636, -912, -1193, -1464, -1721, -1968, -2212, -2446, -2661, -2845, -2990, -3094, -3158, -3186, -3171, -3110, -3006, -2867, -2698, -2504, -2295, -2083, -1870, -1659, -1459, -1278, -1116, -969, -835, -709, -584, -454, -324, -196, -66 }, + {-184, -540, -604, -173, 34, -811, -1848, -918, 2631, 6326, 6438, 1568, -5382, -8899, -5640, 1739, 6558, 4939, -287, -3503, -2776, -629, 468, 695, 988, 1076, 408, -520, -894, -777, -785, -1124, -1584, -2043, -2481, -2764, -2752, -2501, -2150, -1755, -1335, -935, -567, -194, 188, 546, 881, 1219, 1554, 1865, 2169, 2483, 2777, 3002, 3141, 3193, 3154, 3033, 2861, 2655, 2402, 2088, 1715, 1284, 785, 215, -410, -1067, -1731, -2375, -2977, -3526, -4000, -4369, -4612, -4734, -4743, -4630, -4386, -4020, -3561, -3032, -2439, -1783, -1076, -340, 410, 1174, 1950, 2731, 3504, 4260, 4981, 5634, 6183, 6606, + 6890, 7016, 6960, 6718, 6319, 5807, 5215, 4560, 3844, 3089, 2342, 1663, 1087, 607, 204, -134, -406, -606, -733, -785, -769, -697, -585, -451, -308, -165, -13, 165, 382, 636, 912, 1193, 1464, 1721, 1968, 2212, 2446, 2661, 2845, 2990, 3094, 3158, 3186, 3171, 3110, 3006, 2867, 2698, 2504, 2295, 2083, 1870, 1659, 1459, 1278, 1116, 969, 835, 709, 584, 454, 324, 196, 66 } + }, + { + {1, 82, 300, 525, 542, 230, -374, -1074, -1474, -1088, 151, 1465, 1747, 741, -577, -1082, -667, -12, 453, 832, 1171, 1223, 898, 489, 234, -18, -508, -1157, -1643, -1742, -1465, -964, -445, -82, 77, 127, 196, 331, 491, 615, 663, 647, 609, 580, 560, 537, 508, 460, 373, 245, 89, -86, -280, -490, -711, -938, -1160, -1356, -1512, -1625, -1694, -1716, -1697, -1645, -1557, -1422, -1246, -1033, -767, -429, -22, 438, 945, 1489, 2042, 2574, 3070, 3519, 3902, 4205, 4431, 4585, 4656, 4629, 4502, 4289, 4004, 3646, 3196, 2648, 2026, 1370, 702, 20, -668, -1330, + -1930, -2433, -2818, -3086, -3268, -3384, -3426, -3367, -3194, -2923, -2595, -2262, -1952, -1651, -1331, -990, -656, -358, -112, 78, 224, 347, 456, 536, 572, 557, 490, 370, 207, 19, -196, -446, -729, -1038, -1375, -1740, -2116, -2486, -2850, -3208, -3547, -3860, -4149, -4406, -4613, -4762, -4859, -4900, -4875, -4793, -4662, -4477, -4233, -3949, -3648, -3330, -2988, -2637, -2283, -1911, -1511, -1092, -664, -224 }, + {1, 82, 300, 525, 542, 230, -374, -1074, -1474, -1088, 151, 1465, 1747, 741, -577, -1082, -667, -12, 453, 832, 1171, 1223, 898, 489, 234, -18, -508, -1157, -1643, -1742, -1465, -964, -445, -82, 77, 127, 196, 331, 491, 615, 663, 647, 609, 580, 560, 537, 508, 460, 373, 245, 89, -86, -280, -490, -711, -938, -1160, -1356, -1512, -1625, -1694, -1716, -1697, -1645, -1557, -1422, -1246, -1033, -767, -429, -22, 438, 945, 1489, 2042, 2574, 3070, 3519, 3902, 4205, 4431, 4585, 4656, 4629, 4502, 4289, 4004, 3646, 3196, 2648, 2026, 1370, 702, 20, -668, -1330, + -1930, -2433, -2818, -3086, -3268, -3384, -3426, -3367, -3194, -2923, -2595, -2262, -1952, -1651, -1331, -990, -656, -358, -112, 78, 224, 347, 456, 536, 572, 557, 490, 370, 207, 19, -196, -446, -729, -1038, -1375, -1740, -2116, -2486, -2850, -3208, -3547, -3860, -4149, -4406, -4613, -4762, -4859, -4900, -4875, -4793, -4662, -4477, -4233, -3949, -3648, -3330, -2988, -2637, -2283, -1911, -1511, -1092, -664, -224 } + }, + { + {53, 338, 769, 875, 451, -298, -1230, -2130, -2197, -673, 1766, 3151, 2273, 41, -1596, -1601, -455, 677, 910, 149, -882, -1235, -605, 448, 1202, 1446, 1391, 1220, 985, 737, 510, 243, -121, -514, -828, -1049, -1224, -1357, -1407, -1371, -1295, -1230, -1205, -1227, -1289, -1377, -1473, -1548, -1568, -1507, -1373, -1193, -992, -796, -629, -506, -418, -346, -280, -215, -136, -29, 122, 325, 582, 885, 1212, 1546, 1869, 2159, 2394, 2572, 2704, 2794, 2830, 2812, 2762, 2700, 2621, 2506, 2368, 2242, 2153, 2091, 2043, 2027, 2070, 2163, 2258, 2315, 2331, 2332, 2335, 2336, 2320, 2276, + 2203, 2106, 1995, 1886, 1792, 1708, 1606, 1455, 1246, 991, 703, 381, 14, -395, -832, -1278, -1721, -2160, -2598, -3029, -3437, -3796, -4090, -4319, -4493, -4622, -4708, -4741, -4711, -4611, -4454, -4263, -4058, -3846, -3614, -3343, -3023, -2670, -2309, -1965, -1644, -1347, -1064, -786, -505, -229, 25, 248, 440, 600, 723, 807, 854, 874, 872, 851, 813, 757, 683, 593, 484, 357, 217, 73 }, + {53, 338, 769, 875, 451, -298, -1230, -2130, -2197, -673, 1766, 3151, 2273, 41, -1596, -1601, -455, 677, 910, 149, -882, -1235, -605, 448, 1202, 1446, 1391, 1220, 985, 737, 510, 243, -121, -514, -828, -1049, -1224, -1357, -1407, -1371, -1295, -1230, -1205, -1227, -1289, -1377, -1473, -1548, -1568, -1507, -1373, -1193, -992, -796, -629, -506, -418, -346, -280, -215, -136, -29, 122, 325, 582, 885, 1212, 1546, 1869, 2159, 2394, 2572, 2704, 2794, 2830, 2812, 2762, 2700, 2621, 2506, 2368, 2242, 2153, 2091, 2043, 2027, 2070, 2163, 2258, 2315, 2331, 2332, 2335, 2336, 2320, 2276, + 2203, 2106, 1995, 1886, 1792, 1708, 1606, 1455, 1246, 991, 703, 381, 14, -395, -832, -1278, -1721, -2160, -2598, -3029, -3437, -3796, -4090, -4319, -4493, -4622, -4708, -4741, -4711, -4611, -4454, -4263, -4058, -3846, -3614, -3343, -3023, -2670, -2309, -1965, -1644, -1347, -1064, -786, -505, -229, 25, 248, 440, 600, 723, 807, 854, 874, 872, 851, 813, 757, 683, 593, 484, 357, 217, 73 } + }, + { + {-136, -229, -110, -68, -15, 448, 983, 375, -1735, -3505, -2510, 1060, 3916, 3183, -226, -2708, -2160, 42, 1382, 1277, 1000, 1368, 1751, 1338, 318, -603, -1199, -1761, -2453, -3094, -3453, -3461, -3159, -2635, -2028, -1457, -957, -515, -136, 158, 365, 485, 511, 466, 410, 395, 435, 526, 664, 830, 997, 1148, 1276, 1366, 1403, 1380, 1307, 1201, 1074, 944, 829, 745, 703, 707, 762, 869, 1028, 1234, 1482, 1767, 2087, 2430, 2779, 3115, 3425, 3691, 3902, 4050, 4129, 4141, 4099, 4026, 3931, 3809, 3661, 3499, 3331, 3157, 2990, 2843, 2698, 2494, 2180, 1762, 1269, 708, + 53, -720, -1594, -2519, -3443, -4334, -5176, -5949, -6622, -7176, -7612, -7946, -8187, -8321, -8327, -8199, -7960, -7649, -7296, -6901, -6451, -5941, -5389, -4823, -4268, -3734, -3211, -2676, -2119, -1543, -959, -373, 217, 817, 1427, 2034, 2622, 3178, 3703, 4196, 4654, 5071, 5432, 5717, 5912, 6017, 6048, 6016, 5925, 5785, 5598, 5356, 5058, 4719, 4361, 3991, 3608, 3212, 2799, 2361, 1885, 1373, 833, 279 }, + {-136, -229, -110, -68, -15, 448, 983, 375, -1735, -3505, -2510, 1060, 3916, 3183, -226, -2708, -2160, 42, 1382, 1277, 1000, 1368, 1751, 1338, 318, -603, -1199, -1761, -2453, -3094, -3453, -3461, -3159, -2635, -2028, -1457, -957, -515, -136, 158, 365, 485, 511, 466, 410, 395, 435, 526, 664, 830, 997, 1148, 1276, 1366, 1403, 1380, 1307, 1201, 1074, 944, 829, 745, 703, 707, 762, 869, 1028, 1234, 1482, 1767, 2087, 2430, 2779, 3115, 3425, 3691, 3902, 4050, 4129, 4141, 4099, 4026, 3931, 3809, 3661, 3499, 3331, 3157, 2990, 2843, 2698, 2494, 2180, 1762, 1269, 708, + 53, -720, -1594, -2519, -3443, -4334, -5176, -5949, -6622, -7176, -7612, -7946, -8187, -8321, -8327, -8199, -7960, -7649, -7296, -6901, -6451, -5941, -5389, -4823, -4268, -3734, -3211, -2676, -2119, -1543, -959, -373, 217, 817, 1427, 2034, 2622, 3178, 3703, 4196, 4654, 5071, 5432, 5717, 5912, 6017, 6048, 6016, 5925, 5785, 5598, 5356, 5058, 4719, 4361, 3991, 3608, 3212, 2799, 2361, 1885, 1373, 833, 279 } + }, + { + {3, 4, -9, -46, -112, -141, -14, 203, 123, -498, -1039, -371, 1512, 2736, 1464, -1479, -3067, -1587, 1279, 2586, 1517, -264, -1064, -766, -107, 481, 926, 1100, 888, 415, -90, -514, -835, -1041, -1175, -1359, -1657, -2005, -2297, -2478, -2524, -2424, -2207, -1934, -1659, -1412, -1218, -1090, -1019, -979, -959, -949, -932, -890, -824, -742, -657, -585, -541, -526, -531, -552, -580, -602, -602, -575, -527, -458, -366, -252, -121, 26, 188, 357, 521, 676, 829, 982, 1127, 1256, 1379, 1518, 1679, 1840, 1986, 2124, 2276, 2434, 2561, 2625, 2627, 2587, 2517, 2414, 2270, 2096, + 1921, 1773, 1657, 1557, 1466, 1404, 1403, 1480, 1627, 1812, 2005, 2189, 2367, 2553, 2748, 2937, 3100, 3228, 3322, 3393, 3452, 3508, 3561, 3605, 3636, 3653, 3659, 3656, 3637, 3599, 3537, 3456, 3360, 3261, 3165, 3080, 3008, 2949, 2905, 2875, 2858, 2850, 2845, 2840, 2826, 2793, 2733, 2641, 2516, 2356, 2165, 1953, 1730, 1506, 1285, 1074, 879, 704, 547, 408, 290, 191, 107, 34 }, + {3, 4, -9, -46, -112, -141, -14, 203, 123, -498, -1039, -371, 1512, 2736, 1464, -1479, -3067, -1587, 1279, 2586, 1517, -264, -1064, -766, -107, 481, 926, 1100, 888, 415, -90, -514, -835, -1041, -1175, -1359, -1657, -2005, -2297, -2478, -2524, -2424, -2207, -1934, -1659, -1412, -1218, -1090, -1019, -979, -959, -949, -932, -890, -824, -742, -657, -585, -541, -526, -531, -552, -580, -602, -602, -575, -527, -458, -366, -252, -121, 26, 188, 357, 521, 676, 829, 982, 1127, 1256, 1379, 1518, 1679, 1840, 1986, 2124, 2276, 2434, 2561, 2625, 2627, 2587, 2517, 2414, 2270, 2096, + 1921, 1773, 1657, 1557, 1466, 1404, 1403, 1480, 1627, 1812, 2005, 2189, 2367, 2553, 2748, 2937, 3100, 3228, 3322, 3393, 3452, 3508, 3561, 3605, 3636, 3653, 3659, 3656, 3637, 3599, 3537, 3456, 3360, 3261, 3165, 3080, 3008, 2949, 2905, 2875, 2858, 2850, 2845, 2840, 2826, 2793, 2733, 2641, 2516, 2356, 2165, 1953, 1730, 1506, 1285, 1074, 879, 704, 547, 408, 290, 191, 107, 34 } + } +}; +const Word16 *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; + /* Sample Rate = 16000 */ -const Word16 CRendBin_HOA3_HRIR_max_num_iterations_16kHz = 1; -const UWord16 CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; -const UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; -const UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz = 0; -const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; -const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -const UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; -const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_HOA3_HRIR_max_num_iterations_16kHz = 1; +const Word16 CRendBin_HOA3_HRIR_num_iterations_16kHz[HOA3_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const Word16 CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const Word16 CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const Word16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz = 0; +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_Q_16kHz_fx = 0; +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; +const Word16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 CRendBin_HOA3_HRIR_coeff_Q_16kHz_fx = 14; +const Word16 CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + { 14619, 12130, 8121, 3741, -192, -3284, -5718, -8022, -10157, -11244, -10668, -8642, -5124, 302, 6004, 7539, 2311, -5460, -7805, -1932, 6501, 10142, 7532, 2396, -2154, -5944, -9441, -12114, -13496, -14045, -14317, -14268, -13761, -13021, -12288, -11522, -10660, -9795, -8992, -8205, -7417, -6669, -5947, -5208, -4476, -3795, -3140, -2479, -1839, -1248, -671, -87, 481, 1016, 1540, 2051, 2527, 2967, 3395, 3809, 4198, 4576, 4966, 5364, 5762, 6174, 6620, 7091, 7581, 8099, 8646, 9206, 9766, 10318, 10844, 11320, 11729, 12057, 12286, 12401 }, + { 14619, 12130, 8121, 3741, -192, -3284, -5718, -8022, -10157, -11244, -10668, -8642, -5124, 302, 6004, 7539, 2311, -5460, -7805, -1932, 6501, 10142, 7532, 2396, -2154, -5944, -9441, -12114, -13496, -14045, -14317, -14268, -13761, -13021, -12288, -11522, -10660, -9795, -8992, -8205, -7417, -6669, -5947, -5208, -4476, -3795, -3140, -2479, -1839, -1248, -671, -87, 481, 1016, 1540, 2051, 2527, 2967, 3395, 3809, 4198, 4576, 4966, 5364, 5762, 6174, 6620, 7091, 7581, 8099, 8646, 9206, 9766, 10318, 10844, 11320, 11729, 12057, 12286, 12401 } + }, + { + { -328, 3419, 9282, 14138, 15095, 11492, 4615, -3856, -11955, -17316, -18938, -17945, -14495, -6131, 6730, 15543, 10541, -5642, -17422, -13052, 2351, 14414, 16089, 11587, 6837, 2793, -1619, -5622, -7989, -9265, -10563, -11806, -12455, -12695, -12956, -13158, -13093, -12883, -12652, -12283, -11723, -11103, -10455, -9695, -8859, -8063, -7281, -6430, -5570, -4796, -4071, -3330, -2603, -1919, -1228, -512, 180, 835, 1493, 2142, 2737, 3294, 3857, 4413, 4928, 5430, 5956, 6489, 7004, 7519, 8051, 8578, 9082, 9568, 10033, 10452, 10811, 11099, 11299, 11397 }, + { 328, -3419, -9282, -14138, -15095, -11492, -4615, 3856, 11955, 17316, 18938, 17945, 14495, 6131, -6730, -15543, -10541, 5642, 17422, 13052, -2351, -14414, -16089, -11587, -6837, -2793, 1619, 5622, 7989, 9265, 10563, 11806, 12455, 12695, 12956, 13158, 13093, 12883, 12652, 12283, 11723, 11103, 10455, 9695, 8859, 8063, 7281, 6430, 5570, 4796, 4071, 3330, 2603, 1919, 1228, 512, -180, -835, -1493, -2142, -2737, -3294, -3857, -4413, -4928, -5430, -5956, -6489, -7004, -7519, -8051, -8578, -9082, -9568, -10033, -10452, -10811, -11099, -11299, -11397 } + }, + { + { 1945, 1913, 1114, -507, -1804, -1697, -415, 897, 1423, 1139, 370, -567, -1242, -1093, 25, 1310, 1488, 233, -1130, -897, 1037, 2986, 3358, 2204, 676, -429, -1109, -1579, -1900, -2108, -2281, -2406, -2397, -2261, -2097, -1975, -1934, -2031, -2283, -2606, -2898, -3132, -3319, -3456, -3538, -3584, -3612, -3609, -3563, -3462, -3286, -3005, -2616, -2133, -1560, -898, -162, 622, 1443, 2298, 3178, 4067, 4955, 5831, 6677, 7462, 8150, 8708, 9106, 9318, 9322, 9116, 8715, 8147, 7460, 6730, 6040, 5449, 5003, 4757 }, + { 1945, 1913, 1114, -507, -1804, -1697, -415, 897, 1423, 1139, 370, -567, -1242, -1093, 25, 1310, 1488, 233, -1130, -897, 1037, 2986, 3358, 2204, 676, -429, -1109, -1579, -1900, -2108, -2281, -2406, -2397, -2261, -2097, -1975, -1934, -2031, -2283, -2606, -2898, -3132, -3319, -3456, -3538, -3584, -3612, -3609, -3563, -3462, -3286, -3005, -2616, -2133, -1560, -898, -162, 622, 1443, 2298, 3178, 4067, 4955, 5831, 6677, 7462, 8150, 8708, 9106, 9318, 9322, 9116, 8715, 8147, 7460, 6730, 6040, 5449, 5003, 4757 } + }, + { + { 557, 984, 1231, 706, -421, -1194, -871, 115, 576, -45, -1188, -2133, -2669, -2509, -1057, 1266, 2330, 477, -2785, -3845, -1124, 3143, 5731, 5773, 4554, 3126, 1443, -642, -2778, -4628, -6229, -7671, -8847, -9631, -10024, -10063, -9761, -9182, -8426, -7566, -6652, -5744, -4873, -4024, -3196, -2419, -1699, -1004, -324, 314, 883, 1372, 1763, 2044, 2242, 2411, 2588, 2784, 3003, 3244, 3492, 3731, 3955, 4166, 4363, 4545, 4720, 4895, 5069, 5225, 5348, 5440, 5502, 5521, 5488, 5420, 5347, 5278, 5210, 5161 }, + { 557, 984, 1231, 706, -421, -1194, -871, 115, 576, -45, -1188, -2133, -2669, -2509, -1057, 1266, 2330, 477, -2785, -3845, -1124, 3143, 5731, 5773, 4554, 3126, 1443, -642, -2778, -4628, -6229, -7671, -8847, -9631, -10024, -10063, -9761, -9182, -8426, -7566, -6652, -5744, -4873, -4024, -3196, -2419, -1699, -1004, -324, 314, 883, 1372, 1763, 2044, 2242, 2411, 2588, 2784, 3003, 3244, 3492, 3731, 3955, 4166, 4363, 4545, 4720, 4895, 5069, 5225, 5348, 5440, 5502, 5521, 5488, 5420, 5347, 5278, 5210, 5161 } + }, + { + { 235, 62, -3, 244, 616, 757, 685, 823, 1332, 1672, 1044, -820, -3185, -4399, -2901, 911, 3963, 3059, -1335, -4986, -4375, -320, 3639, 5370, 5367, 4698, 3518, 1730, -241, -1914, -3279, -4494, -5502, -6205, -6678, -6984, -7025, -6704, -6090, -5332, -4541, -3789, -3128, -2553, -2037, -1566, -1133, -707, -268, 165, 562, 920, 1240, 1510, 1727, 1916, 2099, 2282, 2473, 2680, 2902, 3136, 3381, 3639, 3899, 4144, 4376, 4603, 4820, 5010, 5170, 5310, 5431, 5514, 5551, 5559, 5558, 5546, 5512, 5478 }, + { -235, -62, 3, -244, -616, -757, -685, -823, -1332, -1672, -1044, 820, 3185, 4399, 2901, -911, -3963, -3059, 1335, 4986, 4375, 320, -3639, -5370, -5367, -4698, -3518, -1730, 241, 1914, 3279, 4494, 5502, 6205, 6678, 6984, 7025, 6704, 6090, 5332, 4541, 3789, 3128, 2553, 2037, 1566, 1133, 707, 268, -165, -562, -920, -1240, -1510, -1727, -1916, -2099, -2282, -2473, -2680, -2902, -3136, -3381, -3639, -3899, -4144, -4376, -4603, -4820, -5010, -5170, -5310, -5431, -5514, -5551, -5559, -5558, -5546, -5512, -5478 } + }, + { + { 771, 35, -66, 755, 974, -249, -1267, -23, 2808, 4297, 2771, -408, -2657, -2597, -605, 1796, 2697, 1189, -1376, -2378, -815, 1577, 2566, 1902, 892, 402, 287, 320, 632, 1255, 1930, 2435, 2751, 2879, 2813, 2625, 2385, 2046, 1540, 920, 307, -235, -676, -979, -1153, -1263, -1368, -1479, -1596, -1715, -1815, -1870, -1885, -1868, -1796, -1631, -1362, -997, -543, -6, 594, 1234, 1895, 2561, 3215, 3835, 4384, 4824, 5122, 5248, 5171, 4872, 4362, 3675, 2862, 2005, 1195, 506, -9, -292 }, + { -771, -35, 66, -755, -974, 249, 1267, 23, -2808, -4297, -2771, 408, 2657, 2597, 605, -1796, -2697, -1189, 1376, 2378, 815, -1577, -2566, -1902, -892, -402, -287, -320, -632, -1255, -1930, -2435, -2751, -2879, -2813, -2625, -2385, -2046, -1540, -920, -307, 235, 676, 979, 1153, 1263, 1368, 1479, 1596, 1715, 1815, 1870, 1885, 1868, 1796, 1631, 1362, 997, 543, 6, -594, -1234, -1895, -2561, -3215, -3835, -4384, -4824, -5122, -5248, -5171, -4872, -4362, -3675, -2862, -2005, -1195, -506, 9, 292 } + }, + { + { 83, 327, 261, -246, -677, -843, -1312, -2418, -3425, -3164, -1069, 2611, 6609, 8225, 4918, -2060, -6979, -5115, 1460, 5978, 4839, 866, -1555, -1641, -1194, -937, -193, 1014, 1717, 1569, 1194, 1074, 1098, 1132, 1263, 1484, 1640, 1697, 1739, 1780, 1787, 1764, 1705, 1562, 1347, 1143, 970, 770, 533, 299, 66, -209, -524, -848, -1185, -1541, -1891, -2206, -2490, -2748, -2960, -3115, -3220, -3264, -3220, -3079, -2846, -2504, -2039, -1462, -796, -52, 761, 1609, 2446, 3228, 3919, 4480, 4878, 5085 }, + { 83, 327, 261, -246, -677, -843, -1312, -2418, -3425, -3164, -1069, 2611, 6609, 8225, 4918, -2060, -6979, -5115, 1460, 5978, 4839, 866, -1555, -1641, -1194, -937, -193, 1014, 1717, 1569, 1194, 1074, 1098, 1132, 1263, 1484, 1640, 1697, 1739, 1780, 1787, 1764, 1705, 1562, 1347, 1143, 970, 770, 533, 299, 66, -209, -524, -848, -1185, -1541, -1891, -2206, -2490, -2748, -2960, -3115, -3220, -3264, -3220, -3079, -2846, -2504, -2039, -1462, -796, -52, 761, 1609, 2446, 3228, 3919, 4480, 4878, 5085 } + }, + { + { 777, -145, -1422, -2342, -2278, -830, 1590, 3453, 3231, 1101, -1108, -1899, -1454, -761, -197, 370, 696, 313, -559, -1062, -783, -199, 100, 160, 379, 858, 1365, 1716, 1892, 1863, 1562, 1040, 478, 10, -376, -762, -1201, -1700, -2223, -2697, -3036, -3204, -3230, -3170, -3064, -2933, -2792, -2648, -2499, -2338, -2165, -1982, -1788, -1580, -1358, -1129, -892, -641, -384, -143, 65, 238, 375, 473, 530, 570, 626, 714, 830, 982, 1188, 1463, 1792, 2153, 2530, 2917, 3292, 3614, 3844, 3961 }, + { 777, -145, -1422, -2342, -2278, -830, 1590, 3453, 3231, 1101, -1108, -1899, -1454, -761, -197, 370, 696, 313, -559, -1062, -783, -199, 100, 160, 379, 858, 1365, 1716, 1892, 1863, 1562, 1040, 478, 10, -376, -762, -1201, -1700, -2223, -2697, -3036, -3204, -3230, -3170, -3064, -2933, -2792, -2648, -2499, -2338, -2165, -1982, -1788, -1580, -1358, -1129, -892, -641, -384, -143, 65, 238, 375, 473, 530, 570, 626, 714, 830, 982, 1188, 1463, 1792, 2153, 2530, 2917, 3292, 3614, 3844, 3961 } + }, + { + { -332, 1220, 2371, 2009, 766, -990, -3872, -7400, -9231, -7635, -3126, 3081, 9753, 13478, 9415, -2115, -12153, -11135, -158, 10013, 11461, 6511, 1845, -100, -1225, -2768, -3959, -4387, -4711, -5167, -5239, -4752, -4086, -3403, -2541, -1524, -570, 265, 1020, 1608, 1964, 2197, 2410, 2560, 2612, 2622, 2600, 2492, 2322, 2183, 2094, 2008, 1914, 1823, 1707, 1542, 1353, 1155, 923, 653, 380, 111, -184, -501, -811, -1114, -1427, -1736, -2009, -2248, -2468, -2668, -2836, -2977, -3105, -3215, -3297, -3348, -3373, -3382 }, + { -332, 1220, 2371, 2009, 766, -990, -3872, -7400, -9231, -7635, -3126, 3081, 9753, 13478, 9415, -2115, -12153, -11135, -158, 10013, 11461, 6511, 1845, -100, -1225, -2768, -3959, -4387, -4711, -5167, -5239, -4752, -4086, -3403, -2541, -1524, -570, 265, 1020, 1608, 1964, 2197, 2410, 2560, 2612, 2622, 2600, 2492, 2322, 2183, 2094, 2008, 1914, 1823, 1707, 1542, 1353, 1155, 923, 653, 380, 111, -184, -501, -811, -1114, -1427, -1736, -2009, -2248, -2468, -2668, -2836, -2977, -3105, -3215, -3297, -3348, -3373, -3382 } + }, + { + { -150, -180, -48, 342, 1133, 2468, 3778, 3927, 2589, 289, -3172, -7875, -10545, -6032, 4929, 12833, 9176, -2520, -10380, -8287, -1380, 2712, 2774, 2157, 2455, 2558, 1839, 1052, 629, 183, -434, -868, -961, -906, -824, -689, -538, -418, -280, -106, 15, 59, 115, 210, 267, 264, 263, 283, 289, 287, 325, 407, 504, 615, 746, 872, 973, 1058, 1131, 1175, 1191, 1200, 1204, 1182, 1136, 1080, 1008, 903, 773, 629, 464, 272, 64, -148, -371, -604, -816, -984, -1104, -1171 }, + { 150, 180, 48, -342, -1133, -2468, -3778, -3927, -2589, -289, 3172, 7875, 10545, 6032, -4929, -12833, -9176, 2520, 10380, 8287, 1380, -2712, -2774, -2157, -2455, -2558, -1839, -1052, -629, -183, 434, 868, 961, 906, 824, 689, 538, 418, 280, 106, -15, -59, -115, -210, -267, -264, -263, -283, -289, -287, -325, -407, -504, -615, -746, -872, -973, -1058, -1131, -1175, -1191, -1200, -1204, -1182, -1136, -1080, -1008, -903, -773, -629, -464, -272, -64, 148, 371, 604, 816, 984, 1104, 1171 } + }, + { + { -104, 30, 150, 78, -369, -1155, -1593, -708, 1328, 2692, 1842, -376, -1647, -1096, -51, 177, -66, 102, 525, 482, 10, -234, -95, -51, -342, -626, -569, -264, 21, 191, 277, 273, 146, -88, -372, -643, -850, -980, -1070, -1156, -1221, -1222, -1155, -1048, -937, -845, -796, -798, -833, -871, -888, -873, -823, -736, -622, -490, -350, -203, -52, 98, 244, 386, 523, 647, 752, 843, 930, 1018, 1104, 1195, 1301, 1419, 1538, 1649, 1751, 1847, 1930, 1995, 2039, 2061 }, + { 104, -30, -150, -78, 369, 1155, 1593, 708, -1328, -2692, -1842, 376, 1647, 1096, 51, -177, 66, -102, -525, -482, -10, 234, 95, 51, 342, 626, 569, 264, -21, -191, -277, -273, -146, 88, 372, 643, 850, 980, 1070, 1156, 1221, 1222, 1155, 1048, 937, 845, 796, 798, 833, 871, 888, 873, 823, 736, 622, 490, 350, 203, 52, -98, -244, -386, -523, -647, -752, -843, -930, -1018, -1104, -1195, -1301, -1419, -1538, -1649, -1751, -1847, -1930, -1995, -2039, -2061 } + }, + { + { -496, -269, 224, 463, -2, -300, 987, 3436, 4341, 1453, -4170, -8360, -7125, -534, 6354, 7613, 2473, -3662, -5194, -2184, 1054, 1794, 1036, 465, 38, -800, -1558, -1523, -1003, -768, -937, -1097, -1039, -810, -393, 248, 965, 1568, 2017, 2353, 2578, 2708, 2794, 2853, 2854, 2800, 2724, 2624, 2475, 2288, 2078, 1816, 1467, 1040, 570, 81, -408, -866, -1281, -1671, -2052, -2413, -2744, -3042, -3294, -3471, -3539, -3474, -3259, -2889, -2369, -1712, -932, -64, 831, 1690, 2464, 3107, 3570, 3812 }, + { 496, 269, -224, -463, 2, 300, -987, -3436, -4341, -1453, 4170, 8360, 7125, 534, -6354, -7613, -2473, 3662, 5194, 2184, -1054, -1794, -1036, -465, -38, 800, 1558, 1523, 1003, 768, 937, 1097, 1039, 810, 393, -248, -965, -1568, -2017, -2353, -2578, -2708, -2794, -2853, -2854, -2800, -2724, -2624, -2475, -2288, -2078, -1816, -1467, -1040, -570, -81, 408, 866, 1281, 1671, 2052, 2413, 2744, 3042, 3294, 3471, 3539, 3474, 3259, 2889, 2369, 1712, 932, 64, -831, -1690, -2464, -3107, -3570, -3812 } + }, + { + { -376, -450, -444, -217, 200, 606, 756, 437, -432, -1528, -2061, -1394, 94, 1154, 949, -80, -905, -1107, -990, -788, -380, 230, 719, 890, 944, 1106, 1246, 1063, 489, -257, -900, -1271, -1333, -1179, -985, -881, -864, -845, -756, -598, -415, -256, -141, -52, 35, 133, 243, 367, 499, 619, 712, 777, 814, 818, 783, 701, 568, 386, 164, -86, -353, -630, -908, -1187, -1467, -1740, -1992, -2219, -2417, -2566, -2635, -2609, -2493, -2286, -1999, -1664, -1333, -1048, -831, -709 }, + { -376, -450, -444, -217, 200, 606, 756, 437, -432, -1528, -2061, -1394, 94, 1154, 949, -80, -905, -1107, -990, -788, -380, 230, 719, 890, 944, 1106, 1246, 1063, 489, -257, -900, -1271, -1333, -1179, -985, -881, -864, -845, -756, -598, -415, -256, -141, -52, 35, 133, 243, 367, 499, 619, 712, 777, 814, 818, 783, 701, 568, 386, 164, -86, -353, -630, -908, -1187, -1467, -1740, -1992, -2219, -2417, -2566, -2635, -2609, -2493, -2286, -1999, -1664, -1333, -1048, -831, -709 } + }, + { + { -518, -580, -303, 357, 970, 1237, 1063, 153, -1563, -3067, -2820, -635, 1744, 2415, 1210, -495, -1329, -926, 125, 836, 548, -513, -1452, -1602, -1080, -402, 140, 544, 841, 1039, 1201, 1370, 1476, 1430, 1263, 1063, 856, 616, 355, 133, -12, -89, -125, -152, -198, -282, -417, -612, -856, -1114, -1343, -1519, -1635, -1691, -1699, -1689, -1687, -1704, -1739, -1797, -1881, -1987, -2105, -2215, -2293, -2313, -2261, -2131, -1919, -1631, -1290, -929, -564, -195, 166, 489, 752, 960, 1124, 1223 }, + { -518, -580, -303, 357, 970, 1237, 1063, 153, -1563, -3067, -2820, -635, 1744, 2415, 1210, -495, -1329, -926, 125, 836, 548, -513, -1452, -1602, -1080, -402, 140, 544, 841, 1039, 1201, 1370, 1476, 1430, 1263, 1063, 856, 616, 355, 133, -12, -89, -125, -152, -198, -282, -417, -612, -856, -1114, -1343, -1519, -1635, -1691, -1699, -1689, -1687, -1704, -1739, -1797, -1881, -1987, -2105, -2215, -2293, -2313, -2261, -2131, -1919, -1631, -1290, -929, -564, -195, 166, 489, 752, 960, 1124, 1223 } + }, + { + { 75, -152, -268, -262, -413, -479, 262, 1617, 1890, -238, -3400, -4370, -1753, 2010, 3221, 1092, -1691, -2450, -1354, -315, -172, -77, 743, 1844, 2398, 2323, 2099, 1942, 1639, 1007, 131, -798, -1626, -2244, -2604, -2757, -2785, -2727, -2589, -2392, -2166, -1933, -1724, -1588, -1545, -1569, -1617, -1665, -1690, -1670, -1600, -1490, -1344, -1165, -965, -772, -607, -483, -408, -387, -420, -499, -608, -735, -864, -981, -1069, -1111, -1100, -1024, -874, -638, -320, 65, 494, 936, 1352, 1709, 1973, 2116 }, + { 75, -152, -268, -262, -413, -479, 262, 1617, 1890, -238, -3400, -4370, -1753, 2010, 3221, 1092, -1691, -2450, -1354, -315, -172, -77, 743, 1844, 2398, 2323, 2099, 1942, 1639, 1007, 131, -798, -1626, -2244, -2604, -2757, -2785, -2727, -2589, -2392, -2166, -1933, -1724, -1588, -1545, -1569, -1617, -1665, -1690, -1670, -1600, -1490, -1344, -1165, -965, -772, -607, -483, -408, -387, -420, -499, -608, -735, -864, -981, -1069, -1111, -1100, -1024, -874, -638, -320, 65, 494, 936, 1352, 1709, 1973, 2116 } + }, + { + { -236, -224, -207, -192, -219, -329, -440, -318, 65, 162, -648, -1887, -1929, 58, 2439, 2535, -65, -2697, -2706, -469, 1474, 1571, 480, -462, -774, -658, -259, 365, 996, 1387, 1504, 1455, 1316, 1155, 1063, 1050, 1004, 821, 496, 82, -371, -804, -1151, -1380, -1504, -1542, -1516, -1461, -1413, -1386, -1379, -1398, -1445, -1505, -1558, -1592, -1600, -1582, -1549, -1520, -1505, -1510, -1541, -1602, -1686, -1775, -1861, -1944, -2017, -2074, -2114, -2140, -2149, -2133, -2098, -2060, -2029, -1999, -1965, -1939 }, + { -236, -224, -207, -192, -219, -329, -440, -318, 65, 162, -648, -1887, -1929, 58, 2439, 2535, -65, -2697, -2706, -469, 1474, 1571, 480, -462, -774, -658, -259, 365, 996, 1387, 1504, 1455, 1316, 1155, 1063, 1050, 1004, 821, 496, 82, -371, -804, -1151, -1380, -1504, -1542, -1516, -1461, -1413, -1386, -1379, -1398, -1445, -1505, -1558, -1592, -1600, -1582, -1549, -1520, -1505, -1510, -1541, -1602, -1686, -1775, -1861, -1944, -2017, -2074, -2114, -2140, -2149, -2133, -2098, -2060, -2029, -1999, -1965, -1939 } + } +}; +const Word16 CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][L_FRAME16k/MAX_PARAM_SPATIAL_SUBFRAMES]={ + { + { -2917, -7989, -11262, -12586, -12353, -11219, -9807, -8120, -5539, -1908, 1972, 5385, 8105, 8905, 5482, -1858, -7731, -6287, 1351, 7243, 5347, -2325, -9454, -12730, -13289, -12836, -11452, -8991, -6207, -3809, -1696, 389, 2268, 3740, 4935, 6011, 6921, 7622, 8201, 8715, 9136, 9475, 9782, 10042, 10215, 10331, 10433, 10499, 10503, 10481, 10459, 10410, 10316, 10199, 10069, 9907, 9716, 9526, 9338, 9138, 8938, 8756, 8583, 8399, 8215, 8038, 7851, 7635, 7392, 7117, 6788, 6391, 5922, 5376, 4741, 4020, 3222, 2357, 1436, 482 }, + { -2917, -7989, -11262, -12586, -12353, -11219, -9807, -8120, -5539, -1908, 1972, 5385, 8105, 8905, 5482, -1858, -7731, -6287, 1351, 7243, 5347, -2325, -9454, -12730, -13289, -12836, -11452, -8991, -6207, -3809, -1696, 389, 2268, 3740, 4935, 6011, 6921, 7622, 8201, 8715, 9136, 9475, 9782, 10042, 10215, 10331, 10433, 10499, 10503, 10481, 10459, 10410, 10316, 10199, 10069, 9907, 9716, 9526, 9338, 9138, 8938, 8756, 8583, 8399, 8215, 8038, 7851, 7635, 7392, 7117, 6788, 6391, 5922, 5376, 4741, 4020, 3222, 2357, 1436, 482 } + }, + { + { 2270, 5471, 4975, -16, -7728, -15051, -19741, -20733, -17524, -10929, -3350, 3721, 10904, 16901, 15751, 3683, -11650, -15670, -3544, 12749, 17876, 9650, -2120, -9394, -12417, -14133, -14758, -13499, -11340, -9686, -8399, -6757, -4932, -3425, -2123, -722, 676, 1908, 3087, 4291, 5385, 6320, 7198, 8009, 8651, 9162, 9644, 10056, 10316, 10481, 10642, 10774, 10838, 10875, 10911, 10892, 10804, 10691, 10557, 10361, 10121, 9888, 9650, 9369, 9068, 8781, 8483, 8140, 7766, 7376, 6946, 6453, 5906, 5311, 4651, 3919, 3127, 2279, 1384, 463 }, + { -2270, -5471, -4975, 16, 7728, 15051, 19741, 20733, 17524, 10929, 3350, -3721, -10904, -16901, -15751, -3683, 11650, 15670, 3544, -12749, -17876, -9650, 2120, 9394, 12417, 14133, 14758, 13499, 11340, 9686, 8399, 6757, 4932, 3425, 2123, 722, -676, -1908, -3087, -4291, -5385, -6320, -7198, -8009, -8651, -9162, -9644, -10056, -10316, -10481, -10642, -10774, -10838, -10875, -10911, -10892, -10804, -10691, -10557, -10361, -10121, -9888, -9650, -9369, -9068, -8781, -8483, -8140, -7766, -7376, -6946, -6453, -5906, -5311, -4651, -3919, -3127, -2279, -1384, -463 } + }, + { + { -274, -1116, -2138, -2311, -1100, 637, 1556, 1216, 206, -731, -1221, -1099, -290, 892, 1584, 1028, -408, -1229, -346, 1489, 2320, 1149, -1072, -2712, -3155, -2885, -2466, -2044, -1617, -1232, -876, -480, -72, 237, 400, 446, 403, 315, 289, 410, 662, 983, 1348, 1752, 2175, 2602, 3048, 3530, 4049, 4606, 5203, 5819, 6418, 6978, 7493, 7942, 8304, 8570, 8746, 8829, 8808, 8677, 8434, 8072, 7578, 6945, 6179, 5298, 4327, 3300, 2263, 1275, 390, -338, -858, -1136, -1180, -1025, -702, -251 }, + { -274, -1116, -2138, -2311, -1100, 637, 1556, 1216, 206, -731, -1221, -1099, -290, 892, 1584, 1028, -408, -1229, -346, 1489, 2320, 1149, -1072, -2712, -3155, -2885, -2466, -2044, -1617, -1232, -876, -480, -72, 237, 400, 446, 403, 315, 289, 410, 662, 983, 1348, 1752, 2175, 2602, 3048, 3530, 4049, 4606, 5203, 5819, 6418, 6978, 7493, 7942, 8304, 8570, 8746, 8829, 8808, 8677, 8434, 8072, 7578, 6945, 6179, 5298, 4327, 3300, 2263, 1275, 390, -338, -858, -1136, -1180, -1025, -702, -251 } + }, + { + { 100, -21, -753, -1626, -1788, -969, 18, 83, -853, -1796, -1932, -1328, -266, 1211, 2476, 2070, -417, -2772, -2101, 1491, 4599, 4336, 1250, -2145, -4461, -6022, -7276, -8003, -7981, -7436, -6628, -5542, -4131, -2515, -839, 817, 2375, 3739, 4874, 5788, 6491, 7002, 7376, 7647, 7807, 7867, 7866, 7820, 7704, 7501, 7227, 6901, 6539, 6185, 5889, 5664, 5489, 5340, 5199, 5048, 4872, 4671, 4457, 4232, 3998, 3758, 3519, 3272, 3003, 2705, 2388, 2063, 1731, 1394, 1074, 798, 566, 364, 190, 57 }, + { 100, -21, -753, -1626, -1788, -969, 18, 83, -853, -1796, -1932, -1328, -266, 1211, 2476, 2070, -417, -2772, -2101, 1491, 4599, 4336, 1250, -2145, -4461, -6022, -7276, -8003, -7981, -7436, -6628, -5542, -4131, -2515, -839, 817, 2375, 3739, 4874, 5788, 6491, 7002, 7376, 7647, 7807, 7867, 7866, 7820, 7704, 7501, 7227, 6901, 6539, 6185, 5889, 5664, 5489, 5340, 5199, 5048, 4872, 4671, 4457, 4232, 3998, 3758, 3519, 3272, 3003, 2705, 2388, 2063, 1731, 1394, 1074, 798, 566, 364, 190, 57 } + }, + { + { -69, -63, 184, 415, 334, 33, -107, -44, -286, -1261, -2648, -3429, -2530, 258, 3436, 4276, 1397, -2933, -4400, -1271, 3556, 5885, 4586, 1666, -927, -2940, -4669, -5852, -6179, -5883, -5343, -4610, -3622, -2497, -1352, -140, 1172, 2444, 3502, 4285, 4818, 5145, 5330, 5447, 5526, 5575, 5612, 5647, 5653, 5601, 5502, 5375, 5223, 5056, 4899, 4772, 4670, 4585, 4514, 4448, 4376, 4292, 4196, 4076, 3924, 3744, 3548, 3336, 3093, 2825, 2545, 2261, 1959, 1641, 1330, 1047, 782, 525, 288, 89 }, + { 69, 63, -184, -415, -334, -33, 107, 44, 286, 1261, 2648, 3429, 2530, -258, -3436, -4276, -1397, 2933, 4400, 1271, -3556, -5885, -4586, -1666, 927, 2940, 4669, 5852, 6179, 5883, 5343, 4610, 3622, 2497, 1352, 140, -1172, -2444, -3502, -4285, -4818, -5145, -5330, -5447, -5526, -5575, -5612, -5647, -5653, -5601, -5502, -5375, -5223, -5056, -4899, -4772, -4670, -4585, -4514, -4448, -4376, -4292, -4196, -4076, -3924, -3744, -3548, -3336, -3093, -2825, -2545, -2261, -1959, -1641, -1330, -1047, -782, -525, -288, -89 } + }, + { + { -352, -377, 411, 586, -351, -765, 717, 2715, 2541, -247, -3157, -3663, -1643, 1139, 2778, 2255, 7, -1957, -1588, 896, 3016, 2866, 1143, -192, -340, 91, 517, 958, 1433, 1678, 1538, 1134, 610, 24, -545, -1026, -1458, -1891, -2250, -2420, -2386, -2198, -1894, -1526, -1175, -887, -639, -398, -148, 132, 457, 816, 1190, 1591, 2037, 2511, 2975, 3402, 3776, 4073, 4273, 4364, 4344, 4208, 3949, 3558, 3031, 2381, 1633, 813, -36, -850, -1559, -2098, -2413, -2463, -2249, -1808, -1180, -412 }, + { 352, 377, -411, -586, 351, 765, -717, -2715, -2541, 247, 3157, 3663, 1643, -1139, -2778, -2255, -7, 1957, 1588, -896, -3016, -2866, -1143, 192, 340, -91, -517, -958, -1433, -1678, -1538, -1134, -610, -24, 545, 1026, 1458, 1891, 2250, 2420, 2386, 2198, 1894, 1526, 1175, 887, 639, 398, 148, -132, -457, -816, -1190, -1591, -2037, -2511, -2975, -3402, -3776, -4073, -4273, -4364, -4344, -4208, -3949, -3558, -3031, -2381, -1633, -813, 36, 850, 1559, 2098, 2413, 2463, 2249, 1808, 1180, 412 } + }, + { + { 61, -90, -566, -816, -647, -548, -703, -382, 1150, 3591, 5804, 6437, 4175, -1129, -6625, -7501, -2091, 4906, 6834, 2607, -2557, -3941, -2128, -270, 530, 1195, 1935, 1935, 1104, 339, 153, 230, 255, 280, 325, 253, 50, -156, -332, -532, -757, -988, -1248, -1515, -1714, -1838, -1959, -2095, -2199, -2267, -2338, -2407, -2430, -2403, -2340, -2220, -2024, -1769, -1472, -1125, -724, -285, 187, 704, 1256, 1816, 2375, 2924, 3433, 3860, 4187, 4403, 4480, 4387, 4114, 3666, 3054, 2299, 1430, 485 }, + { 61, -90, -566, -816, -647, -548, -703, -382, 1150, 3591, 5804, 6437, 4175, -1129, -6625, -7501, -2091, 4906, 6834, 2607, -2557, -3941, -2128, -270, 530, 1195, 1935, 1935, 1104, 339, 153, 230, 255, 280, 325, 253, 50, -156, -332, -532, -757, -988, -1248, -1515, -1714, -1838, -1959, -2095, -2199, -2267, -2338, -2407, -2430, -2403, -2340, -2220, -2024, -1769, -1472, -1125, -724, -285, 187, 704, 1256, 1816, 2375, 2924, 3433, 3860, 4187, 4403, 4480, 4387, 4114, 3666, 3054, 2299, 1430, 485 } + }, + { + { -583, -1345, -1174, -46, 1674, 3149, 3186, 1256, -1498, -3032, -2468, -859, 322, 731, 798, 605, -36, -756, -809, -95, 647, 827, 662, 645, 814, 844, 566, 79, -517, -1189, -1838, -2294, -2495, -2543, -2566, -2601, -2610, -2536, -2325, -1950, -1450, -910, -410, 21, 387, 700, 969, 1209, 1433, 1641, 1831, 2004, 2162, 2302, 2420, 2515, 2589, 2635, 2638, 2595, 2519, 2428, 2329, 2231, 2160, 2137, 2159, 2206, 2266, 2341, 2424, 2483, 2487, 2423, 2288, 2071, 1755, 1335, 832, 282 }, + { -583, -1345, -1174, -46, 1674, 3149, 3186, 1256, -1498, -3032, -2468, -859, 322, 731, 798, 605, -36, -756, -809, -95, 647, 827, 662, 645, 814, 844, 566, 79, -517, -1189, -1838, -2294, -2495, -2543, -2566, -2601, -2610, -2536, -2325, -1950, -1450, -910, -410, 21, 387, 700, 969, 1209, 1433, 1641, 1831, 2004, 2162, 2302, 2420, 2515, 2589, 2635, 2638, 2595, 2519, 2428, 2329, 2231, 2160, 2137, 2159, 2206, 2266, 2341, 2424, 2483, 2487, 2423, 2288, 2071, 1755, 1335, 832, 282 } + }, + { + { 699, 1012, -457, -2351, -3666, -4655, -4951, -2980, 1650, 6914, 10498, 11293, 8054, -222, -10163, -13569, -5693, 7194, 13197, 7949, -1622, -7006, -7106, -5916, -5555, -5075, -3854, -2655, -1818, -796, 565, 1773, 2612, 3310, 3907, 4204, 4190, 4007, 3668, 3160, 2623, 2171, 1746, 1287, 848, 457, 66, -310, -594, -789, -975, -1180, -1381, -1591, -1827, -2056, -2255, -2446, -2632, -2780, -2884, -2974, -3051, -3083, -3069, -3034, -2967, -2846, -2682, -2502, -2310, -2094, -1864, -1633, -1398, -1148, -886, -623, -367, -120 }, + { 699, 1012, -457, -2351, -3666, -4655, -4951, -2980, 1650, 6914, 10498, 11293, 8054, -222, -10163, -13569, -5693, 7194, 13197, 7949, -1622, -7006, -7106, -5916, -5555, -5075, -3854, -2655, -1818, -796, 565, 1773, 2612, 3310, 3907, 4204, 4190, 4007, 3668, 3160, 2623, 2171, 1746, 1287, 848, 457, 66, -310, -594, -789, -975, -1180, -1381, -1591, -1827, -2056, -2255, -2446, -2632, -2780, -2884, -2974, -3051, -3083, -3069, -3034, -2967, -2846, -2682, -2502, -2310, -2094, -1864, -1633, -1398, -1148, -886, -623, -367, -120 } + }, + { + { 85, 353, 751, 1173, 1518, 1325, -60, -2393, -4538, -5958, -6494, -4345, 2442, 10662, 12053, 2904, -8973, -11926, -4175, 5013, 7522, 4580, 1788, 1096, 703, -381, -1257, -1414, -1401, -1505, -1384, -922, -434, -97, 164, 376, 501, 591, 682, 708, 656, 622, 637, 622, 555, 510, 513, 516, 516, 553, 619, 669, 694, 704, 684, 620, 531, 431, 313, 179, 51, -69, -200, -341, -474, -601, -734, -865, -975, -1067, -1148, -1203, -1220, -1204, -1154, -1051, -883, -667, -419, -144 }, + { -85, -353, -751, -1173, -1518, -1325, 60, 2393, 4538, 5958, 6494, 4345, -2442, -10662, -12053, -2904, 8973, 11926, 4175, -5013, -7522, -4580, -1788, -1096, -703, 381, 1257, 1414, 1401, 1505, 1384, 922, 434, 97, -164, -376, -501, -591, -682, -708, -656, -622, -637, -622, -555, -510, -513, -516, -516, -553, -619, -669, -694, -704, -684, -620, -531, -431, -313, -179, -51, 69, 200, 341, 474, 601, 734, 865, 975, 1067, 1148, 1203, 1220, 1204, 1154, 1051, 883, 667, 419, 144 } + }, + { + { 54, 72, -92, -405, -671, -421, 717, 2110, 2200, 348, -1875, -2289, -808, 614, 689, 145, 91, 335, 121, -427, -604, -338, -197, -386, -495, -235, 155, 335, 271, 102, -109, -358, -603, -772, -827, -767, -625, -462, -314, -163, 25, 235, 421, 553, 626, 652, 647, 647, 683, 764, 881, 1019, 1164, 1301, 1419, 1514, 1588, 1641, 1675, 1688, 1685, 1668, 1633, 1581, 1524, 1470, 1422, 1375, 1329, 1288, 1244, 1183, 1099, 996, 881, 750, 602, 439, 267, 90 }, + { -54, -72, 92, 405, 671, 421, -717, -2110, -2200, -348, 1875, 2289, 808, -614, -689, -145, -91, -335, -121, 427, 604, 338, 197, 386, 495, 235, -155, -335, -271, -102, 109, 358, 603, 772, 827, 767, 625, 462, 314, 163, -25, -235, -421, -553, -626, -652, -647, -647, -683, -764, -881, -1019, -1164, -1301, -1419, -1514, -1588, -1641, -1675, -1688, -1685, -1668, -1633, -1581, -1524, -1470, -1422, -1375, -1329, -1288, -1244, -1183, -1099, -996, -881, -750, -602, -439, -267, -90 } + }, + { + { 184, 540, 604, 172, -35, 809, 1846, 915, -2637, -6333, -6443, -1573, 5372, 8885, 5628, -1742, -6556, -4939, 281, 3494, 2767, 620, -479, -707, -1002, -1090, -423, 505, 878, 760, 766, 1104, 1563, 2020, 2458, 2740, 2727, 2474, 2121, 1723, 1300, 898, 528, 153, -231, -591, -927, -1266, -1604, -1918, -2226, -2545, -2846, -3077, -3221, -3277, -3241, -3122, -2953, -2752, -2506, -2202, -1840, -1418, -922, -348, 291, 970, 1654, 2304, 2881, 3353, 3679, 3814, 3730, 3430, 2928, 2246, 1413, 482 }, + { -184, -540, -604, -172, 35, -809, -1846, -915, 2637, 6333, 6443, 1573, -5372, -8885, -5628, 1742, 6556, 4939, -281, -3494, -2767, -620, 479, 707, 1002, 1090, 423, -505, -878, -760, -766, -1104, -1563, -2020, -2458, -2740, -2727, -2474, -2121, -1723, -1300, -898, -528, -153, 231, 591, 927, 1266, 1604, 1918, 2226, 2545, 2846, 3077, 3221, 3277, 3241, 3122, 2953, 2752, 2506, 2202, 1840, 1418, 922, 348, -291, -970, -1654, -2304, -2881, -3353, -3679, -3814, -3730, -3430, -2928, -2246, -1413, -482 } + }, + { + { 0, 75, 287, 507, 520, 202, -408, -1113, -1517, -1137, 98, 1409, 1685, 674, -646, -1154, -745, -98, 362, 736, 1070, 1115, 786, 371, 109, -149, -643, -1298, -1792, -1897, -1625, -1131, -620, -263, -110, -67, -5, 124, 278, 393, 433, 410, 364, 325, 297, 268, 228, 169, 74, -62, -229, -416, -620, -842, -1076, -1314, -1545, -1753, -1923, -2051, -2136, -2177, -2178, -2141, -2063, -1936, -1762, -1546, -1282, -964, -606, -239, 107, 410, 634, 744, 732, 615, 414, 147 }, + { 0, 75, 287, 507, 520, 202, -408, -1113, -1517, -1137, 98, 1409, 1685, 674, -646, -1154, -745, -98, 362, 736, 1070, 1115, 786, 371, 109, -149, -643, -1298, -1792, -1897, -1625, -1131, -620, -263, -110, -67, -5, 124, 278, 393, 433, 410, 364, 325, 297, 268, 228, 169, 74, -62, -229, -416, -620, -842, -1076, -1314, -1545, -1753, -1923, -2051, -2136, -2177, -2178, -2141, -2063, -1936, -1762, -1546, -1282, -964, -606, -239, 107, 410, 634, 744, 732, 615, 414, 147 } + }, + { + { 52, 332, 759, 862, 433, -320, -1257, -2162, -2233, -713, 1722, 3101, 2219, -17, -1655, -1664, -524, 603, 831, 67, -970, -1328, -703, 346, 1095, 1335, 1274, 1098, 858, 606, 374, 101, -268, -668, -988, -1216, -1398, -1537, -1593, -1562, -1491, -1432, -1413, -1441, -1511, -1607, -1711, -1796, -1825, -1774, -1649, -1477, -1285, -1097, -939, -826, -749, -689, -636, -583, -519, -425, -287, -96, 151, 443, 758, 1072, 1365, 1606, 1771, 1856, 1872, 1822, 1693, 1482, 1217, 919, 585, 203 }, + { 52, 332, 759, 862, 433, -320, -1257, -2162, -2233, -713, 1722, 3101, 2219, -17, -1655, -1664, -524, 603, 831, 67, -970, -1328, -703, 346, 1095, 1335, 1274, 1098, 858, 606, 374, 101, -268, -668, -988, -1216, -1398, -1537, -1593, -1562, -1491, -1432, -1413, -1441, -1511, -1607, -1711, -1796, -1825, -1774, -1649, -1477, -1285, -1097, -939, -826, -749, -689, -636, -583, -519, -425, -287, -96, 151, 443, 758, 1072, 1365, 1606, 1771, 1856, 1872, 1822, 1693, 1482, 1217, 919, 585, 203 } + }, + { + { -138, -234, -118, -79, -30, 430, 963, 351, -1764, -3538, -2546, 1018, 3867, 3130, -280, -2764, -2221, -24, 1312, 1203, 924, 1288, 1667, 1250, 225, -702, -1304, -1870, -2566, -3211, -3575, -3587, -3290, -2772, -2170, -1605, -1112, -677, -304, -16, 185, 298, 318, 268, 206, 184, 216, 299, 427, 582, 739, 879, 997, 1079, 1106, 1074, 992, 873, 733, 586, 454, 353, 296, 288, 333, 433, 584, 775, 997, 1236, 1481, 1705, 1878, 1973, 1966, 1841, 1596, 1239, 789, 271 }, + { -138, -234, -118, -79, -30, 430, 963, 351, -1764, -3538, -2546, 1018, 3867, 3130, -280, -2764, -2221, -24, 1312, 1203, 924, 1288, 1667, 1250, 225, -702, -1304, -1870, -2566, -3211, -3575, -3587, -3290, -2772, -2170, -1605, -1112, -677, -304, -16, 185, 298, 318, 268, 206, 184, 216, 299, 427, 582, 739, 879, 997, 1079, 1106, 1074, 992, 873, 733, 586, 454, 353, 296, 288, 333, 433, 584, 775, 997, 1236, 1481, 1705, 1878, 1973, 1966, 1841, 1596, 1239, 789, 271 } + }, + { + { 1, -3, -20, -61, -131, -163, -40, 174, 90, -536, -1081, -417, 1460, 2677, 1402, -1542, -3133, -1660, 1199, 2502, 1431, -354, -1159, -864, -209, 375, 815, 984, 767, 288, -221, -649, -976, -1186, -1324, -1513, -1816, -2169, -2467, -2653, -2704, -2610, -2397, -2131, -1862, -1621, -1431, -1309, -1244, -1210, -1196, -1192, -1182, -1147, -1087, -1013, -936, -871, -833, -825, -839, -867, -903, -932, -938, -918, -878, -820, -744, -654, -559, -460, -356, -256, -175, -118, -73, -32, -4, 2 }, + { 1, -3, -20, -61, -131, -163, -40, 174, 90, -536, -1081, -417, 1460, 2677, 1402, -1542, -3133, -1660, 1199, 2502, 1431, -354, -1159, -864, -209, 375, 815, 984, 767, 288, -221, -649, -976, -1186, -1324, -1513, -1816, -2169, -2467, -2653, -2704, -2610, -2397, -2131, -1862, -1621, -1431, -1309, -1244, -1210, -1196, -1192, -1182, -1147, -1087, -1013, -936, -871, -833, -825, -839, -867, -903, -932, -938, -918, -878, -820, -744, -654, -559, -460, -356, -256, -175, -118, -73, -32, -4, 2 } + } +}; +const Word16 *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; +const Word16 *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; + /********************** CRendBin_Combined_BRIR **********************/ -const Word32 CRendBin_Combined_BRIR_latency_s_fx = 313176;/*Q-31*/ +const Word16 CRendBin_Combined_BRIR_Q_latency_s_fx = 31; +const Word32 CRendBin_Combined_BRIR_latency_s_fx = 313177;/*Q-31*/ + /* Sample Rate = 48000 */ const Word16 CRendBin_Combined_BRIR_max_num_iterations_48kHz = 22; -const UWord16 CRendBin_Combined_BRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]={{22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22} }; -const UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {40, 40}; -const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][22]={{{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240},{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240}},{{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240},{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240}},{{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240},{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240}},{{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240},{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240}},{{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240},{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240}},{{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240},{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240}},{{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240},{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240}},{{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240},{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240}},{{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240},{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240}},{{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240},{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240}},{{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240},{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240}},{{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240},{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240}},{{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240},{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240}},{{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240},{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240}},{{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240},{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240}}}; -const UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz = 98; -const float CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[15]={0.224183f, 0.227455f, 0.241830f, 0.207155f, 0.218087f, 0.222942f, 0.232158f, 0.248203f, 0.249262f, 0.261591f, 0.246276f, 0.279163f, 0.285701f, 0.262541f, 0.271844f}; -const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[15]={7346, 7453, 7924, 6788, 7146, 7305, 7607, 8133, 8167, 8571, 8069, 9147, 9361, 8602, 8907,}; -const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]={{47, 47, 47, 47, 47, 47, 51, 51, 58, 58, 58, 65, 65, 65, 65, 65, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 91, 91, 93, 93, 93, 98},{47, 47, 47, 47, 47, 47, 51, 51, 58, 58, 58, 65, 65, 65, 65, 65, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 91, 91, 93, 93, 93, 98}}; -/* Sample Rate = 32000 */ - -const Word16 CRendBin_Combined_BRIR_max_num_iterations_32kHz = 22; -const UWord16 CRendBin_Combined_BRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]={{22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22} }; -const UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {40, 40}; -const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][22]={{{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 137, 134, 129, 128, 160},{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 137, 134, 129, 128, 160}},{{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 139, 133, 131, 128, 160},{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 139, 133, 131, 128, 160}},{{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 128, 160},{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 128, 160}},{{102, 116, 116, 121, 116, 114, 115, 121, 125, 123, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 125, 160},{102, 116, 116, 121, 116, 114, 115, 121, 125, 123, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 125, 160}},{{115, 115, 115, 119, 121, 119, 125, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 140, 146, 127, 131, 160},{115, 115, 115, 119, 121, 119, 125, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 140, 146, 127, 131, 160}},{{112, 106, 118, 121, 115, 117, 129, 123, 128, 126, 130, 130, 131, 131, 130, 134, 133, 149, 130, 132, 126, 160},{112, 106, 118, 121, 115, 117, 129, 123, 128, 126, 130, 130, 131, 131, 130, 134, 133, 149, 130, 132, 126, 160}},{{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 124, 133, 130, 129, 134, 134, 135, 127, 120, 160},{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 124, 133, 130, 129, 134, 134, 135, 127, 120, 160}},{{110, 113, 123, 113, 121, 120, 120, 126, 131, 123, 128, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160},{110, 113, 123, 113, 121, 120, 120, 126, 131, 123, 128, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160}},{{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 127, 136, 128, 128, 127, 132, 132, 129, 125, 120, 160},{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 127, 136, 128, 128, 127, 132, 132, 129, 125, 120, 160}},{{99, 100, 111, 117, 114, 114, 118, 116, 121, 124, 124, 121, 125, 130, 127, 132, 132, 130, 133, 128, 131, 160},{99, 100, 111, 117, 114, 114, 118, 116, 121, 124, 124, 121, 125, 130, 127, 132, 132, 130, 133, 128, 131, 160}},{{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 136, 128, 128, 160},{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 136, 128, 128, 160}},{{105, 100, 112, 114, 115, 108, 117, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 139, 153, 116, 160},{105, 100, 112, 114, 115, 108, 117, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 139, 153, 116, 160}},{{110, 106, 113, 110, 122, 116, 119, 125, 123, 128, 125, 127, 128, 127, 133, 130, 132, 132, 143, 155, 127, 160},{110, 106, 113, 110, 122, 116, 119, 125, 123, 128, 125, 127, 128, 127, 133, 130, 132, 132, 143, 155, 127, 160}},{{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 135, 127, 160},{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 135, 127, 160}},{{110, 117, 106, 118, 118, 116, 121, 124, 128, 125, 122, 122, 126, 131, 124, 130, 133, 131, 139, 134, 131, 160},{110, 117, 106, 118, 118, 116, 121, 124, 128, 125, 122, 122, 126, 131, 124, 130, 133, 131, 139, 134, 131, 160}}}; -const UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz = 97; -const float CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[15]={0.224190f, 0.227445f, 0.241827f, 0.207131f, 0.218113f, 0.222941f, 0.232139f, 0.248192f, 0.249239f, 0.261572f, 0.246309f, 0.279145f, 0.285786f, 0.262528f, 0.271847f}; -const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[15]={7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907,}; -const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]={{47, 47, 47, 47, 47, 47, 50, 50, 56, 56, 56, 63, 63, 63, 63, 63, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 93, 93, 93, 93, 93, 97},{47, 47, 47, 47, 47, 47, 50, 50, 56, 56, 56, 63, 63, 63, 63, 63, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 93, 93, 93, 93, 93, 97}}; -/* Sample Rate = 16000 */ - -const Word16 CRendBin_Combined_BRIR_max_num_iterations_16kHz = 23; -const UWord16 CRendBin_Combined_BRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]={{23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23} }; -const UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {40, 40}; -const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][23]={{{77, 76, 77, 77, 77, 76, 77, 76, 77, 76, 77, 77, 77, 78, 76, 76, 77, 77, 77, 77, 77, 76, 80},{77, 76, 77, 77, 77, 76, 77, 76, 77, 76, 77, 77, 77, 78, 76, 76, 77, 77, 77, 77, 77, 76, 80}},{{76, 77, 77, 75, 77, 78, 77, 76, 77, 77, 76, 77, 77, 77, 77, 77, 76, 77, 76, 76, 77, 78, 80},{76, 77, 77, 75, 77, 78, 77, 76, 77, 77, 76, 77, 77, 77, 77, 77, 76, 77, 76, 76, 77, 78, 80}},{{77, 76, 76, 78, 75, 76, 74, 78, 77, 76, 77, 77, 77, 76, 76, 77, 78, 78, 77, 77, 77, 77, 80},{77, 76, 76, 78, 75, 76, 74, 78, 77, 76, 77, 77, 77, 76, 76, 77, 78, 78, 77, 77, 77, 77, 80}},{{76, 76, 76, 76, 77, 77, 76, 78, 77, 77, 77, 77, 78, 78, 77, 77, 77, 77, 77, 78, 77, 78, 80},{76, 76, 76, 76, 77, 77, 76, 78, 77, 77, 77, 77, 78, 78, 77, 77, 77, 77, 77, 78, 77, 78, 80}},{{76, 77, 77, 76, 77, 77, 75, 77, 77, 77, 76, 77, 77, 77, 77, 78, 77, 77, 77, 77, 76, 76, 80},{76, 77, 77, 76, 77, 77, 75, 77, 77, 77, 76, 77, 77, 77, 77, 78, 77, 77, 77, 77, 76, 76, 80}},{{77, 76, 77, 77, 77, 77, 77, 77, 76, 78, 76, 78, 75, 76, 77, 77, 76, 76, 77, 78, 78, 77, 80},{77, 76, 77, 77, 77, 77, 77, 77, 76, 78, 76, 78, 75, 76, 77, 77, 76, 76, 77, 78, 78, 77, 80}},{{77, 77, 75, 76, 76, 77, 77, 77, 77, 77, 77, 75, 77, 76, 76, 76, 77, 77, 76, 77, 76, 77, 80},{77, 77, 75, 76, 76, 77, 77, 77, 77, 77, 77, 75, 77, 76, 76, 76, 77, 77, 76, 77, 76, 77, 80}},{{75, 76, 77, 77, 75, 77, 75, 76, 76, 77, 77, 77, 78, 78, 77, 77, 76, 77, 78, 78, 78, 76, 80},{75, 76, 77, 77, 75, 77, 75, 76, 76, 77, 77, 77, 78, 78, 77, 77, 76, 77, 78, 78, 78, 76, 80}},{{77, 77, 77, 76, 77, 77, 76, 76, 76, 77, 77, 75, 76, 78, 78, 77, 77, 78, 78, 77, 76, 76, 80},{77, 77, 77, 76, 77, 77, 76, 76, 76, 77, 77, 75, 76, 78, 78, 77, 77, 78, 78, 77, 76, 76, 80}},{{76, 75, 76, 76, 77, 77, 77, 77, 77, 77, 74, 78, 77, 78, 78, 77, 76, 77, 77, 77, 77, 76, 80},{76, 75, 76, 76, 77, 77, 77, 77, 77, 77, 74, 78, 77, 78, 78, 77, 76, 77, 77, 77, 77, 76, 80}},{{76, 76, 77, 76, 77, 77, 76, 76, 76, 76, 77, 77, 76, 76, 77, 75, 77, 76, 76, 76, 77, 77, 80},{76, 76, 77, 76, 77, 77, 76, 76, 76, 76, 77, 77, 76, 76, 77, 75, 77, 76, 76, 76, 77, 77, 80}},{{76, 76, 77, 75, 78, 77, 77, 77, 77, 77, 77, 77, 77, 76, 78, 77, 76, 78, 76, 77, 76, 77, 80},{76, 76, 77, 75, 78, 77, 77, 77, 77, 77, 77, 77, 77, 76, 78, 77, 76, 78, 76, 77, 76, 77, 80}},{{76, 77, 77, 76, 76, 77, 77, 75, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 77, 76, 76, 78, 80},{76, 77, 77, 76, 76, 77, 77, 75, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 77, 76, 76, 78, 80}},{{74, 76, 74, 76, 75, 76, 76, 76, 76, 77, 77, 78, 77, 78, 75, 76, 77, 76, 78, 76, 78, 77, 80},{74, 76, 74, 76, 75, 76, 76, 76, 76, 77, 77, 78, 77, 78, 75, 76, 77, 76, 78, 76, 78, 77, 80}},{{76, 77, 77, 77, 76, 78, 77, 76, 75, 77, 77, 77, 76, 78, 77, 78, 78, 78, 77, 76, 77, 75, 80},{76, 77, 77, 77, 76, 78, 77, 76, 75, 77, 77, 77, 76, 78, 77, 78, 78, 78, 77, 76, 77, 75, 80}}}; -const UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz = 77; -const float CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[15]={0.223532f, 0.226827f, 0.248830f, 0.208782f, 0.220391f, 0.219790f, 0.231187f, 0.248730f, 0.251408f, 0.263698f, 0.243858f, 0.281483f, 0.283080f, 0.261660f, 0.273527f}; -const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[15]={7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907}; -const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]={{46, 46, 46, 46, 46, 46, 46, 49, 49, 53, 53, 53, 55, 55, 61, 61, 61, 65, 67, 67, 67, 67, 67, 67, 69, 72, 72, 72, 73, 73, 75, 75, 75, 75, 75, 75, 75, 75, 75, 77},{46, 46, 46, 46, 46, 46, 46, 49, 49, 53, 53, 53, 55, 55, 61, 61, 61, 65, 67, 67, 67, 67, 67, 67, 69, 72, 72, 72, 73, 73, 75, 75, 75, 75, 75, 75, 75, 75, 75, 77}}; -//BRIR and HRIR coeff tables in Q29 -const Word32 CRendBin_Combined_BRIR_coeff_re_48kHz_fx[15][BINAURAL_CHANNELS][2955] ={ -{ -{ --4881767, -5023501, -1853815, 6442, 4696010, -2676302, 1832340, -340376, 657130, -3187403, -6676527, --1373316, 2622615, -1711545, 1595044, 2317672, 1963874, -1463510, 1111323, -4126927, -760209, -1038845, 1705639, -134755, -98247, 518617, 1014686, -3453154, -2878165, 1218160, 2386928, --1188095, 2498597, 4788889, -6432788, 922344, -3082176, -2074469, 1426466, -788663, 3940096, --1213865, 3547643, 1880122, 572304, -242666, 1890859, 126702, -398895, -1990181, 5753109, --3987340, -1225139, 2041183, 2226404, -84826, -1961190, 1124208, -2168422, 2252710, 416612, -831613, -59593, -746787, -726386, 3005403, -7708393, 1824824, -1005559, -4444755, -772557, -3782256, 1804423, 2357400, -3384971, 2731062, -1190243, 1726040, 1020592, 1348620, -1440962, -586263, 2006824, -1318555, -3025805, 1251446, -2810519, 564788, 2028298, 24696, -1029718, --1138703, 527744, 1123671, -475131, 1345399, 38655, 971736, 788127, -339839, -214748, -387621, -459025, -235686, -361851, 395137, -628139, 330176, -908922, -191126, -855235, --89657, -287763, -908922, -230854, 466541, -8884140, 7032472, -3280281, 1623498, 1366337, -284542, -1851131, -82141, -4964446, -6192806, 1779727, -1127429, 2024003, 2050847, 5713917, --4540854, 741419, 3921305, 3787624, -3668439, -3931506, -2037425, -3405372, 405874, -1095217, --2614561, -2014340, 104690, -6270653, -5959267, -1210644, 1298691, -481036, 597000, -657130, -1471026, -3261491, 3939559, -1287417, 2284386, -409096, 1642288, -2968896, 1127966, 2175938, -2638184, 1169305, 584116, 978179, -991601, -2449742, 5217312, 3939022, 1720134, -1848447, -6446746, 4366908, -1709934, 4109747, -227096, -3093450, -681289, -1073742, -2725694, 1904818, -2211908, 1085553, -2069637, 4555350, -2869038, 2697240, 3890704, -659814, 489089, -5519570, --2377801, -5945309, 980863, 2929705, -2783139, -793495, 1224603, -2651606, -658741, 1396401, --54224, 1021665, -517007, -1378148, -3853123, -1867237, -605054, -881005, -217970, -11811, -355945, -417686, -556735, -1380295, -550830, 115427, 431107, 386547, -686121, -61203, -93952, 287226, -62814, 294742, 37044, 475668, 50466, -637266, -1071594, -1159104, -537, -655519, -850404, 239444, 7524783, 3449396, -2877091, 1291175, 993211, 11982422, --3519189, 3437048, 5852967, -1124745, 5328444, 2168422, 3632469, -4740034, -1738388, -5556077, --2550674, 3743064, -86436, -2645163, 656056, -3898220, -281320, -2554432, 3583613, -1566053, --464930, -1412507, 1917703, 825171, 68719, -464393, 1581085, -5863167, -4482872, 2003065, -565325, -580894, -2938831, 6957847, 2030983, -912681, 2333778, 2744484, 35970, 1348620, -686658, -3464428, 3155190, -4121558, -3068754, 3657165, -4343286, 3754338, 1727651, -3331821, -5717139, 3042984, 2218888, -1577864, 5186173, 1170916, -666257, -1528472, 1606855, 567473, --860604, -6112276, -840203, -1225139, 1896228, -3609920, 4855998, -1720134, 3987340, -4172561, -180926, -479963, 4956929, -2341294, -1570347, 845572, 1872606, -110595, 1009854, -802085, --4478577, -558346, -273804, -286689, -570157, -139586, 69256, -671089, -821413, -983548, --1014686, 28991, -366683, -30602, 668404, -810675, 534723, 549756, 1391033, -1662689, -1108102, 431107, 872415, -151398, 1293859, 416612, -548682, -1033477, -234076, -519691, -12522514, -10364830, -9095667, -2920041, 9592809, -1321776, -5172215, 6571837, -4350802, 3112241, --221728, -7122667, -4836133, 6032819, -3880503, 2995740, -4049617, 3991098, -1751273, -1089311, --433255, -3921305, 2099165, 2895345, -3932580, 983548, -1987496, 829466, 1831267, -563714, -2616172, 797253, 2145873, 3372086, -4283693, -3155727, 3921305, 214212, 3052111, 2964064, --2705293, -4057134, -1589675, 719407, 5391795, -5773510, 2425046, -6448894, -7840463, -1837709, --4466766, -738198, -5298379, -10136660, -5338645, 4728759, 4443681, 2873333, -3339337, 9735080, --2947958, 1654099, -5330592, -5055714, 1379758, 12885, -448824, -6386080, -2046015, -354335, --1248762, -1231045, -3401077, -2761664, 756451, -875100, -1844152, 226023, -3293166, 607201, -1949915, 3332358, 1901597, -2798171, 2998424, -1928440, -136365, 3314104, 1451699, 493384, --1034550, 1708323, 1999307, 1531693, 387621, -848793, 340376, 2356327, 1261647, 1518808, -698469, -879931, 1309965, 244276, -93416, 358630, -617938, 223338, 396748, -701153, -1343251, 1919850, 2317672, -152471, -121333, 323733, -1410360, 2105071, -89657, 1309428, --272730, 15993384, -5283884, 7463580, -2025077, 10040560, -1978906, -1598265, 1681480, 1991791, --1723893, -11630235, 1125818, -1167694, -3096672, -229781, -565325, 4066797, -1331977, 9803263, --1311039, 1054951, -712965, 5519033, -1101122, 1864016, -4614406, -239444, -3169686, -3370476, --944893, -1024887, 41876, 3507915, -6328098, -1951526, 2151779, -813359, 4383014, 919123, --1104880, -2995740, -2881923, -3178813, -5785321, 2086280, 2459406, 2066416, -10086731, -1584843, -7132330, 3897683, -1610076, -423054, -3118146, -7038378, -7342247, 7223062, -2257542, -5035313, --2743410, 3871376, 3180960, 250719, 3565360, 1358820, 3448322, -1812476, -7197829, -2571612, --3238942, -3791919, 5308580, 3390340, -584116, 5787469, 8838506, -2221035, 3747896, -3532074, --432718, -58519, 3850975, -415001, 966905, 761820, 1197222, 2938295, -3033858, 2279017, --1575716, 129386, -1931662, 217433, 1021129, 2059974, 1578937, -155156, 566936, 26307, --235686, 1012002, -2861522, -510564, -2283849, 420370, -409633, -473520, -999654, -708133, --1191317, 1169842, 602369, -23965918, 13195213, 4814659, -1092532, -1052804, 78383, -3637837, --6666863, -1437203, 3279208, 10165114, 6835978, -9239012, -1751810, -5491116, 3780108, -455803, --12481712, -3673271, 7688529, 4753992, 2641405, 6519761, 3959423, -649077, -802622, 1937567, --4737349, -2794950, 1117228, 5690295, -2367601, -4754529, -6883759, -3460670, 3473018, 11194832, -801548, -1938641, 2394981, -2283849, -8261370, 637803, -5823976, -4582193, -5433134, 3423626, --307090, -7747584, 1477469, 2966212, 3064459, -8383776, -4639102, -3107946, -2063195, -893353, --3084324, -1479616, -3994320, -8136279, -930934, -6906308, -8298951, -5131949, -1450625, 1458141, --4932233, -7286949, 2175401, 5889474, -288300, -1054415, -678068, 4290673, -6364068, 4792110, -7549479, 7344394, 5786395, 9869835, 141197, -4034585, 2669322, 464393, -1025423, -893890, -27380, -2224256, 3273839, 190589, 261993, -1978906, -533650, 1094680, 1245541, -1142998, --1047435, 645856, 3377455, -415001, 1294933, 1156420, 2889976, -2308008, 166430, -26307, --2573759, 415001, 378494, 2218888, 259309, 475668, 1905892, 1216013, -3212099, 1233193, --1138703, 1047972, -9897752, 3763465, -4885526, -824634, 1314797, 2950106, -390842, 5151814, -144955, -1009317, -13895293, 6473590, -2568391, -2931852, 5008469, -8039642, -11072963, 4550518, --3870839, -5173288, -1627793, 10037339, 6308770, -3636764, -2148558, 4684736, -1375463, -472446, -1358820, 4573604, 8353175, 5339718, 6760279, -1007707, -283468, 192737, -4440460, 1165010, --1867237, 11389716, -8679055, -5003100, -4588099, -4271345, 2739116, 1570884, 4074850, -645856, --5733245, -7652021, -2218351, -9533754, -13322452, -2641405, 363462, 10384157, 2054068, -8176007, --2106682, 7793218, -3289945, 2632815, 2335925, 4388920, -6169721, -9216463, -4094178, -4674535, -14926085, 1700807, -4790499, 3282966, 2486786, -1066763, 1876901, 3449933, -419296, 6660958, --8778913, -7822209, 2543695, -3593814, 7952132, -3643743, -212064, 4316979, -1320703, 3829500, --238371, -155693, -270583, -1254131, -147640, 3450469, 1258425, 3353833, 1852742, 1693291, -108448, -1175747, -551903, 1428077, -445603, 461172, -689879, 2421288, -1983738, 1427540, --1779190, 2442763, -2305324, 261993, -234613, -202937, 1695438, 2306934, -2412698, 1722819, -908386, -758599, 3505767, 8449274, 2602750, -804770, 5808944, -1219234, -7451769, -1469953, --748398, 7141994, -4187056, -1081795, -2310693, 1065689, -2339684, 340913, 2273648, 3315715, -4847945, 3127810, 1472100, 12599823, 4919348, 4067334, -634581, -10135586, 566936, -8462696, -2457795, -5775121, 1294396, -92342, 3136400, 15517717, 4349192, -2546379, 5530844, -4539781, -4699231, -2863670, 8061117, -4574677, -136902, -6251862, 3634079, 6082748, -7367480, 14576045, --3704946, 960462, -2357937, -4068408, 1481227, -4525285, -12696460, 2025077, -3257196, -805306, --7878044, 1743757, -2850248, -13072807, -5968931, -3723737, -11560978, 6408091, 16432545, 19926500, --19174882, -14671608, -8169565, 712965, 4664872, -5986111, 2642479, -6780143, 1671816, 9148817, -14173929, -9917616, 15882252, 5026186, 1786706, 2636036, 2801393, -3628174, 5398237, 4962835, -6024766, 4605279, 1888712, 7026030, -46708, 2147484, -209380, -101469, 3776887, -1219771, --4735202, -1343788, 2971044, 2280628, 886374, -118112, -370978, -480499, 2995740, 2372970, -1009317, -2820720, 623844, 691490, -24696, 3197066, 1355599, 1956358, -85362, 2373506, -1346472, 2400887, 3360812, 3499325, 158377, 57445, -1867237, 3867618, 3455301, -488016, --1154273, 319438, 2471217, -1005559, 7070590, -13735842, 19587198, 263067, 11410654, 4032974, --4198868, -4343286, 10564546, -6462852, 6622840, 8184597, -1215476, -6022081, 194884, 8469139, -4723927, 4275640, 3717831, -930397, 1254667, 2739116, 10806675, 7543573, -5977521, -5151814, --1023276, -2693481, -1343788, -5905580, -3960497, 5328981, 9517648, 2298881, 14424111, -4228932, -15785615, 555125, 7365332, 17362942, 12287901, 3811784, 3455301, 7752953, -1859721, -7257421, --171262, 7284265, -4427575, -8303246, 174483, -1466731, 15897821, 12700755, -289373, 17941152, --1739999, 9561671, 5015985, 7523172, -1136556, -6436546, 8003672, -1823214, 9385577, 6326487, -19979114, -11430519, -2059974, -22890028, 4702453, -11352672, -1642825, 10256382, -4406637, 4100083, --1988570, 12021613, -3335579, -8707509, -759672, -3091840, 3541738, -744640, 5807870, 6749541, -1728724, -2026688, 5395016, -1414118, 2274185, -172336, -3755412, 2305861, 2460480, 4629975, -2411624, 5211406, 2325725, -304943, 113817, -1880122, -31675, 5101885, -1991791, -4208531, -2209761, -494995, 696322, 4137127, 902480, 855235, 1730335, 2678449, -999117, -742493, -1844152, 3308736, 5588290, 4990215, -82678, 2252174, -22012, -459562, 2404108, 3443490, -3100430, -1967632, -10737, -788663, 4136054, 588947, -842350, 501437, -13181255, -9683004, -4715874, -7831873, 4438312, -4739497, 1265405, 12062416, -2091649, -11455752, 3055869, -4836670, -11615202, -12242804, -8551817, 4920422, 5578089, 8457327, 265214, -895501, 5452998, -3395172, --8381092, 5126044, -3469797, -6716255, 1954747, 6456947, -4820027, 12191265, 4923107, -513785, -1569274, 5931887, 2585570, -21006686, 8514236, -2223719, -2252174, -3694746, 11094437, -19864, -11817066, 405874, 1000727, 1213328, -3170223, -1369021, 5724118, -6802692, 1556926, 18927384, -1642825, 13889924, 1054951, -2951180, -1562294, -9529996, -19597398, -14362908, 6448357, 8872866, --3898220, 14866492, 6381785, -10808822, -6249715, 13601625, 9730248, 8978629, 2773475, -4325569, -109522, -862752, -8442295, -2713883, -4940286, -23137526, -9913321, -648003, 15453829, 3328063, --3585224, 1542430, 13269301, -3413962, 669478, -42413, 3361349, -4483409, -2090575, -3383361, --1870995, -1279363, 3194382, -285078, -567473, -333397, 2506114, 1866163, 3907883, -2895345, --4306242, 1417339, -4555350, -2663954, 590558, 1515050, 549219, -947040, 4795331, -2374580, --1399623, -5673652, 2126009, -5146445, 3970161, 1582696, 2647311, -4386772, 412317, -892816, -2096481, -2604898, 1645509, -2350958, 2673080, -4864588, 213675, -5676873, 6107981, 5746666, -12443594, 4695473, 4124242, 14296872, 11941620, 9955197, 323196, 3659849, 702227, -2406256, --2878165, 2282775, -1220308, -8682813, 1806034, 8372502, -178778, -2508261, 2531346, -21111912, -6920266, -8454643, 5138929, 7052873, 6349036, -7975755, 4175782, -889595, -255551, 12381317, -9028021, 47245, 4799089, 3536369, -1768453, -7190312, 1656247, 6004901, 42950, 8798241, -2583960, 7951595, 15751256, 750546, 6315213, 6700686, 8414378, -432718, -5504001, 13597330, --5360119, 10963441, -13069585, -10766946, 14918569, -826781, 4887136, 8761196, 13011067, 16838956, -7067369, 2255932, -8319352, 3651259, -1752884, -15189689, 12771622, 7925289, -12435004, -799938, -712965, -15566572, 5154498, 12262132, 7227893, -166967, 4683125, 3310883, -7274601, 13427678, -1242319, -2704756, 6899865, 13281649, 5188858, -595390, -4712116, -3715147, -1650878, 2223719, -3714073, 5456219, 1750199, 898185, 1675037, 6386080, 5708012, 7106024, -139050, -811749, -2797098, 6077379, -23622, 516470, -1273995, 2779918, 460098, -758599, -2357400, 1411434, --4461934, -7936563, -402116, 4377646, -155693, 3080565, -3800509, 2354179, 130460, 2680597, -387621, -2181307, 1752347, -1490891, -1202591, -556735, -4808216, 3328600, -1792612, 1344862, -2612414, 79457, -716723, -2270427, -3124589, -704912, -34845608, -21667036, 7091528, 7424388, -14332843, 23693188, -6510634, -3702799, -7533910, -6987375, -8889509, -9532680, 787053, 3822521, -3011309, 14945412, 666257, 14664629, -726923, 5043366, 6803765, 5209796, 10932302, 7775502, -568546, 9606768, -103079, -1146756, -5519033, 6495601, -855235, -14330695, -12362526, 7762617, --1771674, 17066052, 10221485, 10969346, 4089346, -21500070, 5204427, 13495324, -2045478, 3914326, --3264175, 2663954, 16999480, -608812, 14252849, 23688356, 1364189, -8968429, -221728, 228170, --14848776, 20103668, 9622874, -2694555, -1114007, 14558865, 6907381, -17695266, -14356465, 5647882, --6228240, 8425115, 6132140, 2652679, -6963216, -12579422, -572304, 3156801, 2392834, 13559749, --18213882, 2643016, -1218697, -15487115, -7346542, -15575699, 13605920, -4642860, 18800146, -14789183, -1401233, -7130720, 10697153, 4616553, -4587025, -918049, 9862319, 589484, 3102040, -5718749, --2995740, -4840965, 8749922, 4302484, 2684, 2291902, 2649995, -8013872, 578210, -2276870, -2840584, 1640141, -1687922, -8189966, -2805688, -6057515, 7244536, -5388037, 1216013, -1470489, -7176891, -1538672, -1200443, -2568927, -4395899, -294742, -2899103, 2805688, 7919920, 6825240, --429497, -7215008, 9176734, 24713242, -29417304, -8230768, -14341433, -604517, 4662187, 778463, -19720880, -20353850, 9621800, -2778844, 3928821, -2464238, 10828149, -5971615, -10080825, -841814, --2939905, 7656853, -640487, 5177583, 11470784, -2385854, -8603356, -1148367, 12899934, -7589207, -3071975, 2906082, 507343, -1168231, 12810814, -480499, -3311420, -21400748, 6880538, -5291937, --13525389, -11757473, -3131031, -13033615, -7690139, -11317239, 5364951, -13356811, 13326210, -12258374, -8259222, -6330782, 16157130, -15652471, -9105331, -2351495, 9357660, 3863860, 70867, -6437082, --12839805, 1312113, 5005785, 18327700, 9596031, 4007205, -10487236, 6242735, -9304510, -10472741, -9136469, -10166188, 4838281, 11882564, 9894531, -2630131, -3796214, -8553964, 14274324, 1409286, -13660680, 22113176, -4337380, -11584064, -5192079, -3847754, -7975218, 3512210, -13229036, 5770826, -4297652, 3985730, 10437844, -7372848, 373662, -1329829, 2636036, 9521942, 263067, 7492034, --2726231, -162135, 924492, -4220879, -1530619, 4508642, 2358474, -6039261, -7927436, -3741990, -3476776, 3152506, -3491272, 11323681, 3295851, -8242042, 4148939, 6063420, 15052250, 12264816, -6850473, 2561948, 1439888, -6299644, -4968741, -181462, -5033165, 980326, -2924336, -9207873, -5085242, -3025805, -1298691, 1126355, 5015985, 155156, -4264366, 15992311, 22290880, -24363202, -17250200, 11905649, 225486, 8462159, 29749090, -8858907, -9046275, 2470680, 8495982, 12119324, -3753265, -12147241, 12938589, -5280126, 26246008, -1091459, -4759361, 8220568, 6629282, 6531572, --649614, 24592446, -21117818, 4674535, -739271, 6469295, -9018894, -17667348, 8236137, 6389301, -6652368, -6437082, -4958540, 20493974, 7475391, 25854630, 2042794, -10096394, -1398549, 5444408, --2637110, 26854284, -3782256, 14445049, -2994666, 24055574, 8560944, 6206765, -6281390, -1760937, -13107703, -133681, 14061186, 10491531, 12386686, -17293686, 2369748, 11696807, 14185203, 10464151, -7977365, 19168976, 23655606, -18687402, -2532420, 36088464, -9105331, -10260140, 23270132, 31442918, -269509, -700617, -17551920, -14551886, -1257889, 15602006, -2662880, -3392487, 403190, -1602023, --4756677, -12646531, -4799089, -1305670, -7577933, 122407, 7116224, -4521527, 9190693, -9979357, -8067023, -2318746, 6988449, -7569343, -63888, 5041218, 2865817, 8884140, -1939715, -5234492, --2455648, 2399276, 8151311, 2152316, -3316789, 11324218, -3929895, 5810017, 5881958, -1404454, --1593433, -2976949, 16751983, -6556805, 1904281, 4017942, 6054830, -3411815, -11330124, -6733435, --2203318, 12558484, 5961952, -1282585, 496606, 4270808, -1099512, -150324, 4286378, 2115808, -895501, -182536, 9993852, 22502944, -1388885, 7006166, -19249506, 18299246, -9762998, -6044093, --16851842, -10961293, 34517040, 436476, -24321326, -10890963, -733903, 43487, -3219078, 26641682, -12459700, -2341294, -11159399, -1126355, 7011534, -3376918, 35554276, 7485591, 15627775, 5312875, --8019778, -20221242, 4727149, -317291, 3147137, -15693810, -1660542, -10632192, 11985643, -26307, -1960653, 12346957, -11277510, -8366597, 2451353, 439160, 3693135, -17342542, -13544179, -29637422, --15449534, 1152662, -16865800, 2141041, -12239046, -7452842, 21919902, 6765647, -10665478, 6434398, -2484639, -227096, 21089364, -3755412, 25549150, 9629854, -10997801, -31336618, 5437429, 4816806, -17273284, -9494025, -22404160, -8148090, 6497212, 947040, -5343476, -16299401, -5178120, -22963580, --25957708, 7928510, -1442572, 26411902, -8506183, -16402480, -14086419, -1498407, 18811420, -1219234, -6933688, 11858405, 9249212, -4343286, 6139656, 8031052, 2765959, 8230768, 8312373, -6105833, --838056, 11609297, -2332704, 1414118, 11285027, -2382096, 6705518, -8568460, 3274376, 6221797, --3777424, 3609920, 3734474, -8037495, 10356240, -10023380, 5022428, 4911832, 8231305, -2311766, --5609228, 10730976, -1424319, 7855495, -11720429, -6015102, -8595840, -7573101, 1130113, -6296422, -4512937, 301721, 1911797, -12093554, 1336809, -3665755, 16426639, -17712446, -850404, 27506044, --5641977, 8308078, 3061775, 3850975, -25334402, 21470004, -1897839, -20213726, -11771968, 10980084, --2851858, 5623186, 74088, -8228621, -6125697, 3940633, -6137509, -1217086, -166430, -29392608, --7566122, -19620484, 4584878, 7332046, 5369, -8488466, 3702262, -3921842, 11813844, -25974888, -1939715, 4844186, 15195594, -11157788, 14169097, -10985989, 9080098, 2652142, 11062225, -16863116, -5421860, -8217346, -18041010, 12112345, -14566382, -29349660, 4525822, -2505040, 23529978, -10998874, -3441880, 11008538, 15670188, 17819282, 2064269, -5735929, -10871099, 628139, 8533026, 11831561, --22908282, 26146150, -23622, -17184702, -12878996, -22957138, 9641128, 5923834, 9431211, 4373351, -24824910, -8470749, 26965416, -14253923, 6453189, -5623723, -12263205, -37042484, 21249888, 4319664, --9714679, -25053618, -1288490, 4987531, -1984275, 9562208, -6648073, -7858180, -1130650, 4239133, --6926709, -6733435, -4304631, -1022739, 4115653, -1917166, -2069637, -9759239, 7649874, 524523, --5308580, 4889284, -3798362, 8043937, -2206540, 4169340, 5338645, 9872519, -3110093, 8992588, -1165010, 777926, -9195525, -7085623, 2498060, 3830037, 1501091, 795106, -1619740, -5853504, --3209951, -2619930, -6508486, -2784750, 11937862, -5570036, -6467147, 3953518, -14443438, 248571, --3636764, -21937082, -54224, 12146704, -4784057, -23766202, -3757560, -34746284, 16877610, -38405060, -22974316, -26546656, -23154168, 6629282, 19937238, 14886357, -13176960, 13965623, 25074020, 4466766, -3772592, 5906654, 2289755, -14744086, 17995376, -30137248, -18699214, 1703491, -1835025, -1926293, --3975529, -7504919, 4057670, 27752468, 7209103, 3861713, 2633889, -13051869, 16146930, -2911451, --27881318, -4298189, 636192, 599685, -19061064, -13495324, 14733348, -4791573, 25256556, 4673998, -59056, -20526186, -11207180, 7558069, 3300682, -5601711, 21651468, -17107928, -10341744, -754841, --1215476, 20381768, 1709397, 23843510, 59593, -19504520, 4909685, -16631187, 12720619, -2346126, -17315160, 32628866, -50177568, 17100950, 7019587, 9185324, 19086834, 4699768, -22972170, -5364414, --2018098, -4186519, 11851962, -23617488, 2317135, -6200859, -3277597, -16281684, -8654359, -24621436, -2831457, -1574106, 2627983, 6750615, -9887015, -1833414, 12050604, -7386270, 2449742, -4127464, --12015171, 5601711, 7437810, -8533026, -779537, -13464186, -669478, -19464792, 7105487, 4728759, --2297808, 2036351, -4773856, 768799, 4083440, -3164317, -3491272, 11042361, 13700946, -3104725, -4640176, 2128156, 14065481, 6127845, -17375828, 2259690, 10209674, -5786395, 10318122, 3205119, -4518843, 41084048, 35499516, -10193568, -13768591, -841814, -27055610, 15756088, -1569811, 5927055, -2076617, -13692356, 40987408, -17650704, -72368592, -10616622, 14412300, -48730700, -8370892, 15212774, --41280004, 5695664, 26835492, -18993420, 26771604, -25759604, 22997402, 28532542, -18268106, 7749195, --2656437, 590558, -7753490, -11330124, -2108292, 17550846, -11355894, -18891414, -10327786, -15218143, --1632625, -11951820, -1973001, 6269579, -2861522, 17142826, -15176804, -18643380, 14810121, -19718732, --29236916, -37484864, -13074417, -918586, 7262253, 20845624, -8741332, 9329206, 9757092, -6897718, --3251290, 34367792, -22762790, -903554, 23519240, 7274064, 18489298, -4650913, 6727530, 26090852, -13406740, -1443109, -3205119, -16120086, 6581501, 26246546, -24445344, 18559628, -24190866, 7035157, -34160560, 7860327, -19215684, 19417010, 3071439, -12283606, -9592273, 23502062, 7727720, 10129680, --1430224, 1766842, 6439230, 7702487, -712428, -2367064, 9993315, 8716636, 1830193, -11632382, -12787728, 1574642, -4420595, 3140695, 4380330, -8469676, -2249489, 6522982, 1257352, 10869488, --13428215, 20194400, 15649250, -2782602, -12805445, -5203353, 13465259, 15394237, 24836186, -767725, -4783520, 4064113, 13618268, -20718386, -11050414, 20785494, 13006772, 1409286, -3354370, 1786170, -5748277, -10844792, -8507256, -7295002, 1525787, 6628745, -3343632, -27380, 10799158, -11534135, --8179229, 36349920, 24700356, -34613680, -6816650, 31329102, -9260486, -19042812, -13391708, -19107772, --11199127, 31629750, 19363860, -2312840, 14464376, -3211025, 17585744, -10714870, -5871757, 35121020, --14326937, 6528887, -9903121, -3550327, -201863, 9768903, 28589450, 11166915, -19053012, -5418101, --695785, -2687039, 16173773, 2366527, 28783260, -8196945, 5129802, -2717104, 8535174, -23735064, -14592688, -21874268, 15159624, -933082, 22162568, -5491653, 16481400, -7271917, 5317170, 9594957, --9301825, 9934796, 22370338, 27956480, -14493367, 28642600, 12118250, 33935612, -9491878, 6606197, --1080184, -3891240, -6283001, -2068564, -10980621, -54957328, -34594888, -10435697, -532039, 8100845, -4054449, 13027710, 20958366, -30115774, -1553168, -11999065, 46148888, -2940442, -13856101, -3716757, --40219148, -33475512, 50985020, 20970178, 11503533, -7545184, 16062641, 1620813, -36829344, 7861401, -2631204, -13747653, -14302241, 2641942, 322659, 4257923, -7624104, -3605088, -17999672, -14984604, -6593312, 8398272, 7109245, 5747740, -9323300, -13482976, -8345659, -17542258, 11409044, 4227322, --31754304, -3398393, -9160628, -1821603, 15634755, -14275398, -20536386, -4137127, 13359496, 4901632, --14252312, 8938364, 18442590, -33812132, -9177808, 12625056, -595390, -2163053, -6516539, -931471, -5977521, 10698764, 2418067, -4275103, 27278948, -39689256, 37171332, -10973105, -11228118, 9502078, -17248588, -31097710, -6311455, 454193, 6089190, 1580548, -993211, 15466714, -9546102, 1909650, -8062728, 8968965, 12857521, 10650445, 3469260, -17098802, -3549254, 23060754, -22604412, -19304804, -23856396, 8108899, 16815870, 26139170, 40519260, -9298067, -25991532, 34313568, -14027900, -5881958, -35704600, 11188927, -13299903, -37476812, -24838332, -3828427, -13962402, 17525614, 35176856, 18037788, --12278238, 36221068, 12052215, -13211319, 9852655, 40432824, 11560441, 7787850, -8703751, -32499480, --43714176, -34672196, -2661806, 26193932, 7860327, 16533477, 61915176, 30545808, -37327024, -25074556, -16303159, -51483772, -23804320, 44320840, 15677704, -57192860, -47871168, -22159346, -36694052, -34350076, --20716238, 31077310, -9036611, -6544994, 80981608, 13622563, -23549306, -6495065, -25432648, 43111272, --9287867, 9351754, 2782065, 601832, -23826332, -9149891, -2062658, -11980811, 2632278, 9236327, -20900922, 2734284, -14578730, -635118, -300648, -9483825, 4134443, 6113349, 6918656, -18730352, -4567161, -17351668, 2771328, 9086540, -1272384, 13824426, -3610994, -917512, 13743895, -2883534, -7563975, 15525770, -5552856, 4619238, 10448045, 11671574, 9317932, 1918240, 2115272, 8120173, --8874476, -3309272, 5291400, 15343771, -55486144, 38359428, 16440061, 12377559, 15388868, -6000070, -18894098, 15501611, 22158810, -4271345, 30406220, -19197430, 23053236, -8479339, -17744120, -5680631, --29075318, 2945811, -10708427, 10187126, -7416335, -11315091, 27793270, -32068374, 20589000, -1177895, --13989245, -5671505, 12284680, 13861470, 10024454, 26264798, 21194590, -15359340, -3238942, -13753559, -11791296, -12203613, 9185861, 12594992, 5760625, 7019587, 4670777, -7623030, 29046864, -2838974, -8601209, 2789045, 13361106, 7318088, -34839700, 2131378, -20859582, 5181341, 15316390, -2978560, --14781130, -13639742, 32383516, -34404300, -27758910, 50745576, -21661130, 13057237, 5019743, 16200080, --7718593, 8406862, -35454956, 2276870, 34359740, -18573586, -13943611, 29498910, -2059974, -24744380, --18238578, 10773925, -9674414, -5876589, 18362596, -13719736, 4549444, 22752590, -25847114, 1535451, -15086609, -8544301, -5163088, -6911676, 9277666, 2400350, 3731253, -3561065, 5262409, 3803194, --5094368, 221191, 898185, 13499082, 6876780, -12994424, 15669651, 3747896, -7993471, 4401805, -4782446, -1597728, -4679904, 11063836, 13422, 3610994, 1406602, 14358613, -6750615, -5652714, -8830453, -13238700, 16436840, -1417876, -9279277, -1714766, -984621, 1791538, -177167, -6503118, --934692, 8376797, 17611514, -32603096, -132843336, -143325200, -5032091, -82140712, 73058464, 263656768, -115024592, 159074848, 200876688, -75631152, -53428320, -21169894, -180067040, -125899448, -40688372, -197477760, --85950888, -17417702, -80603648, 19429896, 185732096, 168731008, 182606976, 236609216, 142669152, -12641162, -53350472, -52825952, -210161872, -114121040, -84362824, -174628000, -119640608, 6853157, -134372880, -44130252, -29917132, -134300400, -68745248, 100774968, 39242044, 109274704, 271997056, 221112976, 178884848, 321623264, -233545824, -3811784, 33775084, -59936804, -287829376, -275176416, -283816800, -442253856, -299460160, -185071744, --181103744, 2303176, 143847584, 161939600, 226965936, 343455104, 317917248, 268363520, 265022032, 151783600, -53501872, 8539469, -16121697, -120237608, -206951392, -254203552, -272117312, -367538080, -305455936, -235603648, --115174376, 123300456, 363875520, 338856800, 371360576, 260402256, 31915366, -35298724, -111276160, -153110208, --103421200, -50761144, -51122460, -22655416, -23368918, -37251324, 412854, 5426691, 27194122, 84680648, -76976552, 56690884, 77987480, -7340636, -50173272, -6750078, -58942520, -51096688, 31779000, 34293704, -8041253, 7859790, -89912992, -230230656, -217934160, -185678416, -139811392, 68093488, 210111952, 256853536, -324523968, 290842848, 179467888, 124528280, 44261248, -51707648, -108306728, -129288176, -167586944, -205741824, --231963664, -270989888, -240906864, -83403432, 59290412, 139456512, 180895968, 196524288, 147496160, 102245456, -51210504, -2077690, -6065568, 24787866, 39709120, 43389372, 47182364, 38930120, 2864206, -33474976, --71459128, -127287800, -122781840, -100001336, -83619256, -46903192, -7081328, 23574002, 33800856, 35664872, -22436372, 13960791, 20300162, 32255742, 45293652, 61579092, 73202888, 70543768, 51367808, 25616258, --5674726, -28797218, -38020660, -50489488, -63231044, -62474596, -48408576, -36935644, -26674432, -20204600, --12170864, 2449742, 21632140, 32340566, 29753386, 27722940, 23781234, 13908715, 11783243, 9941239, -4184372, 8645232, 17462800, 16416976, 14577119, 15021111, 3346317, -10750303, -20018306, -33758980, --40598716, -34304440, -26386132, -19046570, -2747169, 7810398, 11220065, 14671608, 11000485, 4314295, -4697621, 10699837, 13073880, 20334522, 22259204, 18894098, 15375983, 6019397, -6820408, -17784386, --23818814, -25642566, -22677964, -15161771, -5388574, 3470871, 7589207, 8280160, 6216429, 4721243, -4328790, 4366908, 3847754, 2950106, 1348083, -134755, -1145683, -1647120, -1563905, -1193464, --614717, -255551, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --7737921, -3799972, -8803609, 1763084, 674847, 584652, -5995775, -2106682, 1692754, -1291711, 1998234, -3170223, 1929514, -52076, 2508798, -6786049, 199179, -236760, -133144, 3773129, 5731097, --5946382, -1305670, -3596498, -1146219, 2153926, 3944391, 659814, 1005022, -1445793, -1910724, --1559610, -1173063, -2694555, 1523103, -2716567, -1815161, 3144453, -2627983, 2263448, 406411, --6721087, -2249489, -3693672, -854699, 2888366, -1957968, -567473, -1924682, -2006287, -1381906, -2823404, 4296578, 806917, 2405182, 1903207, -2224793, -4268124, 2339684, 1916629, -900333, --3670587, -3042448, 2800319, 600222, 2099165, 1028645, -5654862, -1835562, -2092723, 3169149, -1285806, -5668820, 1520418, -2986613, -918049, -258235, -2050847, 1666447, -1869921, 476205, -2195265, 2287070, 1398549, 1589138, 1030792, -142271, 1099512, 1372779, 143345, -1068373, -1540283, 355409, 28991, -409633, -1007707, 531502, 976568, 214212, 803159, -263067, --507343, 28991, -787590, 883153, -134755, 1036698, -179315, 234613, -84289, 966905, -498216, -6442, -377957, 628139, -427349, -11036992, 7195144, -5310190, 660888, -766115, --2068027, 5496485, -4959077, -3320547, -67646, 5813238, -2246805, -404264, -695248, 4797479, --2997887, -7861401, -1795296, -4074850, -5510980, 138513, -495532, 836445, 3089692, 5125507, -3175592, 437013, 7877507, 3025805, 208843, 5596343, 5879274, -542777, -3258807, 159988, -2565169, 2030983, -104153, -1212255, -4666482, -4131759, -2054068, 4474282, 1823751, 7755101, -4372814, -419833, 2562485, 3117073, 1010391, -4935455, 5209259, -2160906, 2697776, -282394, -1612223, -5871757, -979789, -1917703, 1997160, -1844689, -2242510, 5976984, -470836, -4619238, -1744294, -3533684, 2774012, -2026688, 4485020, 3833795, 4299799, 1388348, -4241817, 2229088, --685584, 2195802, -1863479, 570694, 5910412, -2376191, 2845953, 3840238, -636192, 158914, --226023, -794032, -1631014, 908386, -140123, 1408212, -77846, 1121523, 31675, 15569, -814970, 1366873, 561567, 1308354, 1508607, -379568, -1175210, 1931125, 179315, -143345, -115964, 1142998, -370978, -1195612, 547608, -355409, 280784, -46171, 1173063, 304943, -621160, 308164, -1052267, 2207613, 2478196, 141197, -2120640, 2314987, 911070, 712428, -1101659, -8665633, 2825552, -5516886, 929324, 1807108, 1894618, -2523293, 4619774, 746251, --1698660, -780610, 5389110, 3877282, -2335925, -2997887, -2466385, 2096481, 3823595, -2294586, --2518998, 760209, -9837623, -10737, -4196720, -1645509, -4175245, -5465346, -671626, 4999342, -1375463, -4451197, -1184337, 4282083, 1292248, -2726231, 4830765, -2088965, -6737193, -1993402, -3782256, -1656784, 4474819, 8570607, 6918119, 972810, -97711, 2434173, -1052804, -5033165, -49392, 1919850, -3621194, 3066070, -7177964, -1055488, 440234, -3027415, -2348810, 3143379, -6247030, -4880694, -5124433, 3200288, 3192235, 5908802, 1889249, -3417183, 4694400, 4081293, --1362042, 4548907, -5018133, 5094905, 1219234, 3461744, 683437, -2670933, -1557463, -463856, -1104344, 132070, -2477123, 875100, 11811, -1414118, -1197759, 361314, -381178, 1134945, -47782, 1874216, -1353989, -945430, -86436, 268435, 1578401, -777389, -1614371, 759136, -39192, -301721, 1065689, -210453, 637266, -682900, 641561, 1006096, 103616, 1607928, -14766098, -5761162, -2546916, -964757, 10641318, -1078574, 8043937, -5879274, 7086159, -7048578, --6185827, 1465121, 3346853, -4168803, -1036698, 2102387, -559956, 2747169, -4297115, 4922570, -1770600, -5315559, -217433, 2108829, 1643362, 929860, 10011032, 7974681, 6236830, -17717, -4043175, 363462, 1155346, 2986076, -9268539, -1431298, 5624260, 3653407, 4362613, -120259, --1654636, 2026151, -379031, 11293080, -1726577, 1890859, 1121523, 536871, -3359201, 6766184, --784368, 7035694, -3898220, -4089883, 2909304, -2729989, -9425843, -4352413, 1883343, -909459, --6745246, 1864016, 8053, 8746701, 756451, 745177, -2689187, 3174518, 3224447, -733903, --521302, 7681549, 5647345, 5603859, -3720516, -5297306, -4620311, -9039296, 742493, -6403796, --2165737, 388158, -3490735, -3990025, -2222646, -463856, -1363652, 2109366, 3954591, -755914, --464930, -1793686, 912144, -1302986, -1493038, 620086, 1080721, 2684, 1394254, -830002, -46171, -802085, -533650, -443992, 811749, -501437, -491237, -304943, -1284732, -1473174, -88047, -175020, -1765232, 1486596, 1503239, 1815161, -34360, -1291175, -746251, 1423782, -381178, 10944650, -8536784, -141734, -8932995, -5842766, -3434900, 7889855, 4658429, -10806675, --14804215, -5650567, 5322538, 3810173, -2157684, 5173825, 121333, -1190243, 651224, -7744900, -2426657, -952409, 723702, 2550674, 599685, 51003, 3355980, 2964064, -5127654, -5102421, -5986111, -1793686, -2841121, 3704946, -10107132, 2507724, 2194192, -9294846, 3482145, 9789304, -5949067, 6746320, 1435593, 3761318, 9285182, 1816234, 1826435, -10484015, 5652177, 8056822, -6590628, 1341640, 6694244, -7443179, 7488813, -2136209, -7339026, -11327976, -41876, -7172059, --5788006, -2420214, -6889665, -17264158, 824097, 998580, -510027, 2797098, 8611409, 3308199, -3516505, 2375117, -6130529, 1006096, 2972654, 2588255, 2274185, 2624762, -6293201, -1787780, --7951595, -3518652, -504659, 1976222, -2860985, 2955474, 644245, 610959, -1936493, -214212, --993211, 128849, -1079647, 1188632, 421981, 929324, -220654, -1349157, -1149441, -1087701, -1307281, 913754, 73014, -442382, -1034550, -1078037, -1095217, -3488587, 620623, 635118, --2665027, -1300301, -919123, -23438710, 11577621, 1511829, -9092446, 2237141, -979789, -2669322, --1838246, -5144297, 2796024, -2628520, 567473, 3399467, 3140695, 10182831, -4086662, -9695889, -5307506, -12300249, -5288179, 2026151, 1716913, 1420024, 4012036, 4958003, 4280472, -75162, -5658083, 381178, -2216740, 7499550, 4660577, -2267743, 4474819, -7730941, 14652818, 564788, -2744484, -1360968, -12538620, -2164127, -4652524, -4389994, 1972464, 10479183, 319438, 448824, --1326608, -2879239, -6755447, 2154463, -1094143, 3757560, -8518531, 2891050, 4576825, 2011655, --6303402, -2239826, 1694902, 824634, 5155572, 1014686, 17816062, -5070746, -7552700, -8611409, --2576981, 186831, 6381785, -8578660, -1081258, -3675418, 3956202, -12528956, -511101, -3392487, --5212480, 1563905, -1486059, 3419868, -407485, 6281390, 4016331, -17717, 1376537, 485868, -834834, 7282117, 921271, 5206574, 1935957, -1318018, 183073, 184684, 1555852, -960999, -826244, -282931, 2259690, 403727, -1592359, -2400887, 1996623, -928250, -2794950, -1264331, --1438814, -670015, -807991, -61203, 3598109, 52076, 1063004, 417686, 1498944, -1406602, --704375, -2585570, -2863670, 10741176, -3266860, -2386391, 2422362, 3269544, -8409546, -8485245, --7750806, -7275675, -11992622, 7786239, -6961605, 2284923, 3082176, 11164231, -1688459, -2482491, -8769786, 2138894, 1942399, -10002442, -6511708, 5122286, 2296734, 4100620, 6093485, -10545218, -248571, 4696010, 10323491, 30602, 1091995, -1401233, 134755, -6835441, -1192927, -2033667, --12836584, -907849, 4088272, -7307350, 3311420, -7961259, 78920, -5468030, -1027034, -1615982, -855235, 10584947, -2925410, 268972, 5479842, -2866354, 3259343, -8546985, -15342697, -8272644, --4568772, -2062658, 1764158, 10442139, -4735202, 2892124, 2627446, -7298223, 2622615, -5592585, --1897839, 3899830, 10579041, -1485522, -450435, 3464428, -127238, -9709847, -9196599, -3785477, -9396315, -1001264, -13821742, 1101122, -9045201, -3943854, -1794760, -853625, 3198140, -3409667, --962610, 3580929, -877247, 4185446, 3627637, 2662343, -1550483, 4100620, -3453691, -2560874, --2417530, 713501, -312996, -654446, -741419, -576063, -1131724, 903554, -224949, 2680597, --1680943, -1021129, 1177895, -1436667, -814970, -3916473, -4773856, -323196, 480499, 2502355, -416612, 1552631, 207769, 10230612, 10744934, -3405372, 920734, 11270531, -11641509, -10376641, -8611409, -2176475, 1106491, 7798587, -1640141, -2256469, 7806640, -14705968, 6145562, -758599, -2396055, 7009387, 7257421, -8282308, 1475858, -11342472, 3383897, -3488050, -1275605, -7927973, --471910, -11319386, 1015760, -9826885, 6736120, -3520800, 1219771, 12014097, 5558225, 5315559, --9746891, 1667521, 11179800, -2776696, -16041703, 8457864, -2012729, 1444720, -3204583, -7530689, -10497437, 3672734, 8544301, 2025614, 1189706, -7221451, -9264781, 3191698, 4258460, 4493610, -6075768, 14012331, -519691, -11097659, -7186554, 8380018, -1273995, -9561671, -2524367, -717796, --2613488, -12068321, 147640, 1488743, 2939905, -4466766, 6838125, -498753, 724239, 9632001, -4968204, 10032507, -10051834, -4344897, 1819456, -5664525, 4535486, 2642479, 2768643, -583042, --1298154, -1007170, -177167, -4117263, 5025649, -2021856, 3075734, -993748, 3586835, -1618129, --1804960, 40265, 2056216, -1964948, -81604, -632434, -2001992, -1194001, 903017, -2384244, --692564, -4844723, -3635153, 1761474, 3200288, 1463510, 1455994, -693637, -383863, -2386391, --351650, 2177012, -3103114, -660888, 1431835, -849330, 2509872, 2204929, -1735167, -934155, -2246268, 1319629, -1164473, -77846, 8213588, -10011032, 11712913, -2644089, 12389907, -10129680, -9170292, 1002338, -973347, 15431817, -8069170, 916439, -7831873, -2340220, 23527830, 11348377, -4993973, 3397319, 6690486, -3767760, -32749, -19900730, 3694209, -838592, -8603356, 9531069, -7155953, -306016, 1699196, -11504070, 10130754, -5377299, 10759430, 7040525, 5745593, -8257075, --1449552, -6943889, 10332081, 2369748, -3759707, 18300318, 8754754, -2075006, 964220, -15178951, -2578591, 694174, 12052215, -5422396, -15424838, -2664490, -4265440, -3009698, -21801790, -10877542, --23221278, -11842835, -8295730, 2723546, -5834176, 10955388, 1373853, -12550431, 7573101, -8400419, -11866995, -10583873, -8565775, 6168647, 10572599, 10394895, 44023, -9769977, -7777649, 4760971, --6376416, 227633, -3214246, 3918084, -4371740, -6459094, 11379516, 5257577, 1568200, -1823751, -4299799, 2407866, 5289252, -510564, 3588445, 1248762, 5939403, 99858, -258235, 317291, --2895882, 85899, 1535451, 708670, 672162, 139586, 4583267, 2071248, -3575560, 379568, -2099165, -1158031, -1348083, -891206, 302795, 849867, 2324651, -597000, 1595580, 2645163, --522912, -2728378, -205085, -2972654, -1262184, -2747169, -1719598, 2340220, 198642, -1547262, -1560147, 839666, 3274376, -1931125, -962610, -2940442, 1299765, 640487, -14133127, -16832514, --11062762, -1352915, 59593, -1941325, 4347044, 6469295, 4578435, 275952, 2585034, -5152350, -3844533, -10745471, -15088220, 761283, 12062953, 2341831, -3869229, 9706626, 5860483, 9404368, -15641734, 2273112, -4464082, -9511205, -7558606, 4767414, -8704825, -5952288, 2593087, -6832756, --15393700, -8314520, -586800, -1540820, 3944928, -3246459, 8962523, 2800856, 3574487, 12295418, --1644973, 1705102, 3067144, -9310952, 11594801, 2142652, -10181220, -16838956, 4639102, 1819456, --12156905, 13447543, 8832600, -11251204, 4189204, 11349451, 6512781, 3249143, 9477919, -3923990, --3420942, 978179, -4803384, -7866770, 14236206, -12153147, -1097364, 5486284, 1484448, 21961242, --18527416, 6024229, -2113661, 194884, 6354404, 528281, 1592359, -4777614, 3163780, -10879689, --23376970, -1049583, 8590, -11885785, -7439420, -1413044, 4773856, 4185983, 1968169, 1284195, --3643206, 161598, -5222680, -2502355, -769336, -2924336, -4676683, 1989107, -643171, 1131724, --2244657, -1584306, 1482301, -3779034, -8328479, -2738579, 890669, -2063195, -8018167, -4369056, -3764002, 2646237, 1949378, -1373316, -2887292, -3714073, -426276, -1728188, -4412005, -3639985, --5256503, -2634963, -3442416, -3492882, 208306, -646393, 1831804, -1200443, 1786706, -1005559, -3109020, -4121021, -11110544, 9889162, -20132122, -14292577, 10697690, -449898, -18327700, 9475235, --10697153, 20860120, 4227322, -27359478, -3422552, 2529199, -6856916, 2098092, 4841502, 9759776, -8393977, -15883863, -629213, 1519345, -3231426, -14557255, -2184528, -3000035, -4937602, -4423817, --136902, 1103270, 12490302, 13623099, -4138738, 7345468, 6406481, 6202470, 13636521, 187905, -3729105, -15600395, -5281199, 5515275, -2999498, 7550016, 18697604, 2750927, -16193100, -36287640, -12885, -11183558, 10404558, -6855842, -3597035, -7128572, -19505058, 8536248, 26316338, 1536525, -6976638, -20562156, 4366371, -2332704, -9149354, 2359011, 10167261, 5224828, 8228084, -8857833, -13127031, 7624641, -15038828, -22524420, -1311039, -17129940, -15894600, -10217727, -11683385, 1533303, -21246130, 8101919, 912144, -2829310, 13732621, -6929393, -9982041, -1629403, 2260227, -1600412, -2650532, 2099702, 273804, 2124935, 5355288, 1904281, -407485, 379031, -1856500, -2011118, -5618891, -1661079, 5534066, 121870, -2874944, 650688, -1431835, -2277407, 6664179, -1575716, -3687230, -7988103, -842887, 3870303, 141734, 1578401, 6816113, -4993437, 6247567, -622233, -863825, 1847373, -1847373, 4625680, 869194, 263067, 1014149, 213675, 2317672, 5957657, --2289218, 2079838, 2552821, 2303713, 2851322, -952409, -39602820, -25012278, 17933100, 14439680, -23497230, -98247, 9247065, 2282775, 7404524, -311385, 4768488, -10431402, -12510703, -7765838, --11202885, -7226820, -7988103, 9558450, 22583474, 4929012, -27604828, -6560026, 4811974, -7332046, -6715718, -15773267, -1299765, -537408, 893353, 7683160, 5803575, 1076963, -1924145, -3525631, -6394670, 12475269, -10027138, -15517180, 10295037, 4913443, 13511430, 6180995, 19654308, -13617194, --4808753, 12566537, 18737332, 16305843, 9622874, 4588636, -4056597, 1234266, -2397129, 69793, -6470905, -24522652, 13147432, -1934883, 3536906, -1622961, 18584860, -5683853, -313533, -4085588, -11770895, 10024454, -20958904, 15007153, -17835388, -901406, -9065065, -8952322, 8085276, 1484448, --27783070, -2459406, -2231236, -5119601, -3273302, -652298, -3585761, 14412300, 1372779, 13786845, --4405563, 16302622, 7645042, -8419210, 3540664, -2102387, 889058, 1060320, 1489817, 2200634, -791885, -3157338, -5269925, 8112657, 3546032, 6659884, 1807108, -3955128, 7608535, 304406, -351114, 5780489, -16229608, -7494181, -7241315, 2279554, -270583, -10982768, 423591, 1854352, --561030, -2055679, -81604, 3787088, -4072166, -151398, 4326106, 2194728, 5283884, -4651450, --2339147, 1342177, 5737003, 21943524, -24479702, -593242, -13928042, -39230232, -4667019, -14498199, --30972620, 6153078, -232465, -6043019, 1912334, 16598438, -1108638, -17605608, 5998996, 680752, --5681705, -4257387, -3167539, 860067, 19128710, -4329327, -739271, 8672613, 6396817, -2786897, -9244917, 8463770, -4126390, -4052302, -7733089, 10635950, -2583423, -18387828, 2769180, -1242856, -6274411, 24034100, -16095390, -25787520, -16282758, -7549479, 3526705, 8569533, 4531728, 18290118, -9116605, -12931610, -7489886, -17629768, 15206869, 9356049, 1658931, 3214246, -10138807, 1042603, --10725607, 18440442, 18077518, 1271847, -8478802, -4714264, 1749662, 16786342, 33503966, 20623360, --3214783, -7512972, 423591, 10658498, 4595615, 9836549, 13550622, -13481365, -668404, -25984016, --17541720, -16702591, -11220602, 6967511, 15901043, 10937671, 1693291, -3191698, -1535451, -14470819, --18216030, -4603131, -9698036, -9121974, 2044941, -1858647, -2365990, 84826, 541166, 4138201, --4672388, 9275519, -9483825, 3976603, -12059731, -4039417, -67646, 2214056, -406411, 2101850, -4553739, -3271691, 491774, 11025181, 13424457, 16210280, 8852464, 10150618, 4547297, 1923609, -704375, 278099, 558883, -2847563, -8816494, -8594230, -1481227, 6662568, -64425, 1019518, --3643743, -2557116, 968515, 8155069, 5087389, 9734543, 7824357, 6975564, 8409009, -19132468, --2240899, -9904195, 14416058, -15895674, 3092377, 1403917, 28186796, -17420924, -5097053, -17918604, --3867618, -17699560, -14870251, -10733123, 5563057, -19040126, -13807246, -20705500, -5279589, -3113315, --6328098, -9356586, -23072028, 6034966, -16305843, 6594923, -17108466, 21098490, 3258807, 9455907, --4063576, -19903952, 10671383, 6171868, -6689949, 10654740, 14919106, -8062191, -21435644, -11487964, -28752658, -12285754, -928787, 737124, -4867809, 6314676, 18638010, 3301219, 7932268, -6004365, -13335873, 181462, 10506564, 3193845, 3571802, -331786, 1083942, 22784264, 6915434, 54556824, --33298882, 21254720, 29908542, -7909719, 687195, 15413564, -11172284, -3286187, 25041270, 9906342, --4170950, 13275207, -5685463, -24260122, -17934172, 6069863, 976031, -32411434, -9015673, -3330747, --16825534, 8625368, 5040681, -10959146, -8960376, -6628745, 943819, 2956011, 6851547, -5713380, -800475, 3974455, -1801202, -7232725, 1976759, 1477469, 2258079, 6700686, 1186485, -4141422, -530965, 7763691, 6901476, 3321084, -7763691, -215285, 14228153, -4116726, -3032784, 7855495, --7769059, -13456669, -3851512, 673773, -1778117, -6942278, -2153926, -482647, -7630547, -1646046, -764504, -2182917, -7926362, -13066364, 4879083, 13872744, 4989679, -383326, 437013, -2713346, --8335458, -6707129, 30298310, 33864744, 431644, 24432458, 24334748, -1395328, 10935524, -24574192, --7638063, 21674552, 2034741, 21399674, 29972966, 24671366, -4996658, 16084116, -25166360, -39244188, --16803522, -14708116, 9421548, 26307, 10082436, 10892037, 23600846, 18247168, 6354404, -18734648, --2293513, 18649284, 5996848, -9217000, 12009265, 25730612, -2919504, 8927090, -21049098, 10024454, --16620987, -4547834, -10559714, -21857626, 13354664, 1463510, 6502581, 26064546, -14144401, -15924128, -9401147, 27009438, -21287468, -14275398, 8769249, -6915434, 38191388, 28242632, -26922466, -10206990, --21290690, 1087164, 23285702, -10875931, -16230681, -7442105, 1394254, 5557151, -19423452, 4581657, -38919920, 2760053, -26091926, -39840652, 32052804, -38435124, -32258426, -18911814, -16523813, -27830852, -7356742, 6971269, 44560824, 11076721, 19545860, -9946071, 21258478, -2701535, -9216463, 7962333, -883153, -2157147, 21799106, 2687576, 11100343, 13835700, 7434589, 16608102, -4866735, 4409858, --3738769, -1465658, -3721052, -14172855, -10518912, -11723113, 13259101, 4656282, 11793443, 14638859, --3384971, 8726300, 19011672, 6775848, -6318971, 9757092, 11355357, 3830037, -2831457, -14003741, --12601971, 12295954, 5114769, 8142185, 16216723, 36195300, 15479599, 9046812, 6528887, 10164040, --5564667, -1320703, 18161270, -11880416, -14530948, -2930778, 6907381, -6333466, 6547141, 3888556, --35296040, -20395726, -26501558, 7192997, 14959371, 5339718, 22877144, 20519206, 28975996, 9059160, -31629212, 14156749, 20478940, -9879499, -3753265, -9931575, -24060406, -17309792, -37315212, -22164716, --7020661, -21776558, 5019743, -766115, -371515, 9044127, 7573638, 3486440, 18366890, -4483946, --14838038, 21807160, 2228551, -28678570, -12173011, -3038153, -34319472, -26156350, -25251186, 2422899, -12566537, 3402151, -13015362, -1618666, 14703284, 8947491, 34656628, 6460168, -45978700, -15373299, --7719130, 7422241, 7507066, -5285494, -11976516, 17165374, -25318832, -4730370, -20233590, 15584826, --40053256, -24995636, -32598802, -26440356, 1594507, -14912126, -11179263, -26540214, 13697724, 47670916, --878321, 30804580, -16740172, 7535520, -22269406, -124017, 34339336, 8056285, -15669651, 1752884, -13465796, -22993644, -35128536, -19192062, 9493488, -27709518, 12291123, -490163, -343597, 17645336, -9692131, -4834523, 21024402, 20388746, 16902844, -5527086, -5203353, -3721052, 223338, 14148159, -10748693, 7065758, 853625, 14739791, 8758512, 2126009, 2467459, 10856067, -4077535, -3968013, -8216273, -11680164, 10915123, -10184441, -9256191, -11959873, 21121038, 12553116, 19685982, 6735583, -7798587, 1421097, 1952063, 9046812, -13706314, -23378580, 2454037, 6127845, 6425271, 8456791, --1496259, -9281424, 26570816, 10942503, 26805428, -43408696, 19020262, 32825362, -3042984, 37787124, --19826642, -57363584, -29601988, -293668, -5590437, 6447820, -20443508, 19964618, 28229210, -25186762, -22455162, -13757317, -16799764, -40042516, -16232292, -22975390, -15072651, -18362058, 18260590, 2783139, --35801236, -45967424, 34947612, 7946763, 12635257, -10692321, 2955474, -12389907, 499827, 10650445, -16222628, 14616847, 39122320, 1316944, -27777164, 37845104, -3823058, -9752260, -17363480, 16006269, --30899068, -20813412, 17818208, -16106664, -24023362, -30325690, -26432840, -5631776, 3747896, 2932389, --8027831, 32811940, 28080496, -2639794, -15702400, -27343372, -31242666, 7808788, 6832756, -6138582, --2866891, 45015016, 3240016, -13074954, 19637664, 9377524, -29425358, 23626078, 43010340, -46881180, -76025752, 20297478, 22106734, 8351564, 22264574, -5978058, -46582140, 32101660, 2957085, -5776194, -33541548, -39483636, 7151121, 6985228, 8590, -3782793, 1897302, -3049427, -10688563, 5867462, -11927124, -9701257, -1009317, -14367739, -16274705, 21453362, -4501663, -10486163, 5158793, -5708012, --12895639, -23803782, -5229123, -8079371, 21104932, -19972672, -1769527, 24576876, -4949413, 19641422, --6757594, -17152488, 9186398, -3450469, -7897908, 10171556, 2665027, 27062052, -3351685, -413927, -17643726, 54181012, 23703924, 1108102, -18360986, 25803090, -600222, 1724966, -12633646, 23539106, --27655832, 19917910, 19108846, 20178294, 9655086, -7581154, 26759794, 33652680, -7069516, 13831942, --21122650, 33866892, 14325863, 11261404, -21854942, -47486232, 9260486, -14619532, -11005854, -19318762, --24408836, 14552423, 6388764, -11854110, 2528125, 1066226, -12983686, -57979376, -3796751, -12360916, --6124624, -950798, 40628244, 27808840, -13796509, 10465225, -27078696, 2952790, 19934554, -30774514, --28698972, -23480586, 36751500, -26600344, 7489349, 29620778, -40189620, -37197640, 34019364, 27174258, -28523952, 38330436, 13989782, -49149460, 10870562, 14473503, -4548907, 80142480, -8503498, -12254615, --36451924, -31370978, 15950435, -28916942, 18608482, 6517613, 21074330, 43889732, -28403156, -19259708, -53265112, -32613298, -36197984, 23477902, -46559056, 33668248, -35458712, 8001524, 11886859, -25537876, -10351945, -29640644, 20380694, 37765648, -1781338, 6541235, 7524246, 1389959, -11787001, -10894185, --2718714, 10947335, -5123359, 7387881, -7917236, -23430120, 9795210, 2078227, 15680926, 7907572, -13659070, -4728759, -4898410, -23214836, 16051367, -3110630, -21476448, 4993437, 43420508, 12124693, --11424076, 12894566, 23256712, -11599096, 2301029, 18107582, -9332964, 18064632, 5833640, -5553930, --28382218, 4871567, -11026792, -569620, 34744136, -15888695, 1556926, 6890738, 4803384, -9893457, -11570642, 39775156, 2896956, -34773664, 48527760, 11450383, -3736085, 34481072, 16837882, 27814746, -10081899, -42438036, -9718974, -16131897, 19287624, 48526152, -31511638, 7495255, -15380815, 21392158, -24557012, -33425046, 27074400, -26919782, -24360518, 11754252, 22194780, 588411, 7035694, 17303350, --27237608, 23240604, 1357210, 28449326, -5607080, -7964480, 8898098, 42309724, -19649476, 34119756, --17176648, 6605660, 8516383, 34103652, -2522757, -2573759, 11353746, 51582556, 2922188, -40910636, --3797288, -49182744, 28841242, -215285, 79594336, 16830904, -23920284, -7421704, 17202954, -18035642, -27624692, 51960516, 35281544, 478352, 14700062, 22337588, -3089692, -24628954, -3857418, -5834176, --84131968, 51832204, 38377680, 35583268, 8140037, -36517960, -11368778, 27010512, 13615583, 23487566, -12283606, -80371184, -29169808, 48875116, 12971338, 15578920, 41791644, -30296162, -1543504, -4520990, -23417236, 5761162, -2950643, -6839199, 18323404, -5268315, -22443888, 10526428, -11140608, -12836584, -10734197, 16322486, -12905303, -4161823, -1064078, 12813498, -17428440, 13327820, -15474230, 6693170, --26298084, -26572426, 25413322, 3077344, 1660542, -3320010, -19607600, -6141267, 16797618, 1573569, -5277441, 28742458, -5151277, -22346714, -2780991, -12826383, 9249212, 10578504, -11162083, -9196599, -10788958, 23767812, 29756070, -1234803, 31532040, -19452980, 32090386, -29314762, 4984847, 15346992, --15029701, 2156074, 6077379, -8025147, -15684684, -29677150, 45252312, -10146860, -8836358, -15101105, --2459406, -6255620, 14766634, -30426622, -8682276, -19060528, 6615324, -19166828, 18446348, -179315, -9557376, -21143050, -38308424, 1748052, -27966680, -29406030, 13407277, -22580254, -18917184, 37042484, --13606993, -21800180, 2921115, -22419730, 10621991, 13916231, -3931506, -18343268, -5159330, 10510322, -9523553, -8415452, -608812, 32605244, -5650567, -20344724, -25472378, -3839164, -11052025, -38788388, -36455684, 12373801, -44147968, 27145804, -1753420, -18778134, 85541256, 47860968, 39517996, 20658256, -12232067, -20453708, 3408057, 9175661, 10312753, 3602404, 37622304, 8144332, -10807748, -18633716, --75187160, 15155329, 10208064, -624918, -14430016, -28691456, -5311801, -18585398, -16081431, -1461900, -24154896, -16626892, 41558640, 5746666, -7884486, -3195456, -3160022, 2966749, 17702782, -7057705, -4714801, 11840151, 4574140, 1999307, 9870372, -15731928, 7872138, 2411087, 24520506, -8752606, --5616207, -7016903, -5674726, -19537806, -10004053, 6588480, -20477330, 15188615, -3789772, -10398116, -14816563, 8706972, 12541841, -4945655, -1430761, 1160715, 2778307, -13670881, 7419019, 484794, --130997, -1661616, 9127879, 4320737, -39349952, 65700116, 8141111, 21354578, 11521250, -16622597, -12000675, 18316962, 4365835, -2153926, -16209207, -3055332, 4235912, -7713762, -5925981, 2509335, -7143605, 18935974, -13554917, 7818451, 519154, 15064598, -5671505, 2783676, 4785131, -17844516, -14046154, 2069101, 3281892, 4889821, 5025649, -11395085, 11627550, -9854802, 2174864, 11143830, --6461242, 10922639, -5081483, 13831405, 10652593, 6110665, -17710298, 12814035, 9648107, 7708930, -21481816, -21136070, -2093797, -417149, -4712116, 6172942, -11069204, -17544404, 11617350, 13218836, -6473053, -1875290, 2587718, -2079301, 6723772, -6290517, 2570538, -13077102, 11443940, -20184198, -18589692, 10311143, -6600828, -488553, 7560753, 351114, 6749004, -63888, 525597, -874026, --7046431, 9477919, 12847858, -11771432, -2931852, 2224793, 7006703, -5451924, -5789079, 1338419, -2121177, -1505923, 1039919, -4441533, 1330903, 5216238, -4482872, 970663, 2900177, -4537096, -3453154, 4555887, -714575, -1696512, -2535641, 752156, 9516037, -3855270, 983548, -9259949, -254477, 9940165, -7438347, 7363185, -3767760, 422517, 16423418, -3076270, 31675, -492311, --5461051, 8524436, 3240553, 3590056, 3239479, -2858301, 1925219, 9366787, -3077881, 6346351, --4525822, -821949, 12642773, -52740052, -122714728, -19705310, 71701792, 65058016, 160388576, 83687976, --43239584, -13376139, -88902600, -150936960, -10461467, -68659888, -9595494, 109775072, 46888696, 84780504, -130302328, -15292231, -19128710, -66337916, -112613504, -89646704, -5797669, -33772940, -12768401, 93390304, -29640106, 60695404, 110547624, 17965312, -465467, 11294153, -67262408, -101979704, 17486422, -105378632, --68840808, 23192286, -10584410, 16939352, 135420848, 15369540, 51917028, 110402136, -22025130, 3255585, -24663850, -106780400, -88888104, -31686658, -121310816, -47176996, 15475841, 22253836, 83580064, 117504400, -83919368, 59023588, 51620140, -19805704, -71042520, -58565100, -87835304, -92522184, -39539468, -23601920, -652298, 77263776, 92465280, 28722594, 72266048, 20849918, -22821846, 14979235, -50291384, -70203384, --13643500, -32733556, -21699248, 39222180, -1404454, 27280558, 49131204, -13698798, -1013612, -236223, --24768540, -7889318, -1636919, -18868866, 20863878, 7287486, -4755066, 33705292, 10920491, -5118528, -32725504, -11718818, -34867080, 432718, -53312356, -37652368, 11656541, -35811436, 7718593, 40913860, -30391188, 55863564, 61351460, 22018150, 21781926, -2854006, -50337016, -70839040, -72449120, -76120240, --48037060, -3928821, 24492588, 52068964, 91118808, 97281544, 81201192, 63106492, -3610457, -59942712, --85295904, -109619376, -111293344, -59787556, -17729624, 46332496, 98919536, 89058832, 54117660, 39574904, -11865921, -8658654, -13118441, -39715024, -45245868, -34539052, -28333900, -20845624, -3913252, 3833795, -16726213, 24142548, 25353192, 23786602, 22161494, 10681047, 805306, -8604430, -12870406, -19087908, --18429168, -14185740, -7497939, -3231963, 3518115, 6052146, 8740795, 6889665, 5964636, 4750234, -4688494, 1338956, 1243930, 1018981, 423054, -2266132, -659814, -3400540, -6561100, -7131257, --6762963, -6407555, -265751, 1012002, 3613141, 7634841, 9371619, 8734890, 7911867, 2665027, --877247, -5407901, -8227010, -9317932, -7037304, -5051419, -1835562, 1433445, 4271345, 4689031, -5375152, 4203699, 2879239, 1453846, -31139, -2088965, -1560147, -2231773, -1773822, -1399086, --1402307, -683974, 300648, -1142461, -682363, -148176, 590558, 1393180, 1385664, 1470489, -2398739, 1546188, 823560, -73014, -1124745, -1881196, -1870458, -2114198, -1498407, -860067, --192200, 445603, 1000727, 1009854, 1067836, 875636, 597537, 151398, -43487, -292595, --419833, -466004, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --4391067, -4664335, 1187559, -2494302, -1096290, -5590437, -1477469, 4733591, -2462627, -1784559, 1475858, --703301, -151398, 329102, -1475321, -1174137, 5728950, 2807298, -668941, 312996, -823023, --1668595, 810675, 2073396, 3163244, -766115, 1225139, 1484985, -5024575, -1511829, 13959, --965294, 3120294, 319438, -1039382, 2825552, -2102387, 980326, 4348655, -2360622, 296890, -618475, 3306051, -1226213, 4551592, -6383932, -2323577, 2834679, -1253594, -5404143, 409096, -1133871, 1830730, 1903207, -571231, -2304787, 218506, -2087891, -1430761, 674847, 2711198, -2522220, -3613678, 3234110, -3956202, 3587372, 216896, 3150896, -1197759, -2536178, -1127966, -2131915, -391379, -489089, -617402, 2937221, -3111167, 1646046, 773631, 819265, 1000727, -2357937, 750009, -1452773, -1677722, -892816, 1269700, -234613, -1230508, 277025, -1487132, --290984, -98784, -1486059, -605054, -819265, 205622, 863288, -1025960, -699006, 430034, --168577, -1469416, 27917, 805843, -529892, -71941, 345208, -134755, 622233, 421444, -88584, -1111323, -325881, 41876, -457414, 30602, -75162, -779537, 486405, -1321239, --212064, -15295989, 5012227, -5564667, -2221572, -4557497, -4678830, 2648384, -1565516, -3952981, --2126546, 5358509, 7968775, -4369593, -1630477, -395137, -5750961, -5405753, 397821, -553514, -3502546, 1174674, 2607045, -2310693, -1447941, -2991445, 833761, 5139465, 2228551, 992137, --3325379, 2508261, 754304, 1531693, -2173254, 182536, 754304, 1147293, -2950106, -2162516, -799401, -4073240, -4160750, 1772748, 3144990, -3552475, -1788854, -1376000, 248571, 3131568, -2526515, 1085553, 470836, 8114267, 3184182, -2576981, 3156801, 2242510, -2263985, 3827353, --1437203, -974421, -27917, -1685238, 3404299, -1932735, 889058, 2043868, 1640678, -3048890, -1188632, 554051, 607201, -1074816, -1512902, -645319, 4757750, 303869, -1420024, -1035624, -1116692, -4301947, 822486, 2538863, -173946, 1638530, -952409, -1560147, 1028108, 928787, --408022, 1591285, 819265, -474594, 1131724, 1177895, 1987496, 243203, -2147, -158377, --610422, -866510, -95563, -170188, -541166, 569620, -199716, 1958505, 11601780, 4604742, --843961, 493384, 2632815, 1359894, -820339, -5062156, 129386, 4427038, -4610111, -545998, --8622684, 2219961, 3464428, 198642, -2079301, 6244346, 4380867, -4080756, 1921998, 202937, --3582003, 5568425, 3055332, -399969, 2229088, 5303748, -1689533, -1138166, 322659, -3221, -93416, 1247151, 6521908, 1285269, 943819, -10635413, -595390, 447213, 1231582, -4832375, -1075352, -3905199, -3005403, -4128537, -2709588, -11811, 1195612, -2537252, 2464238, -6126771, --3534221, -408559, -117038, 1916629, -2477123, -605590, -2246805, 1285806, 3260954, -2032056, -317291, -1764695, -351650, 5075578, 3967476, -1653026, 3715684, -1836635, -3238942, -4036733, --339302, -410169, -2735894, 2397666, -468151, 656056, -338766, -927713, 142808, -614180, --2226941, -178241, -3524558, 353798, -1757179, -1160715, -2968359, 3354906, -1083406, 1117228, -2276870, 878321, -1224066, -315143, -1370095, -137976, 540629, -1347009, 1303523, -151934, -102542, 151934, -525060, 749472, 413927, 206695, 53687, 1876364, 875100, -662499, --1355599, -1236414, 1111323, 1516660, -54761, 353261, 1461363, 193274, 18290118, -8063801, -1437203, -744103, -3461207, 2844879, 5075041, -3415573, 5461588, -377420, 5830418, 1563905, -2011118, -2617246, 3273302, 1220845, 3353296, -7298223, 3797825, -4345433, 1264331, -3660923, -4460324, -1310502, 4493610, -2756832, 1608465, -1832340, -469225, -274878, -533650, 1722282, -9417253, 346819, 2713346, -2699924, -4471598, 112743, 12348, 113280, 1371705, -3121368, -6152004, -468151, 5145908, 290984, -2329483, -2927020, -7901129, 3773666, 2477659, -3732864, -335544, 3064996, 1594507, -9190693, 5373004, -379568, 3798362, -5549098, -5970005, -2934537, --5816997, -1126355, 6565932, 1309428, -2617246, 324807, 3681861, -1334661, -3088082, -1637456, --3454228, 2348810, -5199058, -973884, -4006668, -1573569, -92342, 4338454, 1998770, 413391, -1302449, 5464809, 2834679, 608275, 1949915, -1633161, -690953, 302258, 27380, 816581, -388158, -1021665, 467078, 1885491, -210990, 354335, 653372, -1010391, -1352915, 1158567, --1604707, 1750199, 998580, 1616518, -35970, -710817, 958315, 1599875, 359704, -759136, -468688, -114890, 4755603, -11307575, 2250563, -3597035, -10333691, -7978439, 4172561, 4654134, -6145562, -3111704, -1634772, 4211753, 1993939, 6317360, 2032056, -760746, 610959, 4013110, -7878581, -2079301, 2268280, -149250, 6376953, 1423245, -430570, -1340567, -4933844, -7499013, -43487, -1125281, 2201171, -477278, 1716913, 1248225, 418759, 420907, 1447404, -2599529, -250719, 3482682, 5504538, -2769180, 624918, -2447595, -3214783, 4515621, -3543885, -8805757, --3470334, -2301566, 4171487, 288300, 4605816, 4175782, -2276333, 123480, -3658239, -569620, --1586454, 5363878, -6866579, -264677, 2276870, -7309498, -8178155, 57445, 2492155, 5092758, --3624953, -8692477, 4475893, -8026757, 9278203, 5185636, 1506997, 3893925, -117575, -3904125, -11802570, -1150514, 5701032, -293668, 8249559, 5611375, 3002719, -919660, -1633698, -2852932, --1043140, 1171989, 279710, 2206540, -2358474, 1343788, -1261647, -928787, -897111, -1038845, -1104344, -678605, -38118, -1837172, -97711, 996432, 1978369, -2091112, -2467996, 258235, -1069447, -104690, 1289027, -821949, 138513, -1051193, -324270, 584116, 1218697, 1418950, -891743, -1286343, -1801739, -24828132, 5218922, 1346472, -12427488, -15704548, -2454574, -12104828, -9996000, 2925410, -7265474, 546535, -3336653, 1189706, -4934381, 730144, -203474, 146029, -7070053, -2409477, -1546725, -2826089, -2488397, -6501507, -4335770, 6700149, -2647847, 4269735, --3599720, 1898376, 193274, 3867081, -3762928, 2950643, -3780645, 1774358, -1396401, -2320893, -2473364, -6070400, 2449205, -3046206, -1045825, -4387309, 10903311, 5242545, 9570261, -3953518, -4083440, 3313031, -1801739, 1781875, -4411469, 4861366, 10486163, 8319889, -5647345, -1439888, -2519535, -4052302, -2704219, -7166690, -13508746, -4513474, 7052337, 2604361, -3271691, 1477469, -797253, -3604551, -6373732, -6417218, 4715874, 640487, -9907953, 1164473, 1046898, -386547, --664646, 3418257, 7326678, -633508, 74088, 1119376, 75162, -1798518, -6523519, 2294050, -2308545, 1467268, 3168075, 1977833, -2745021, 838056, -1698123, 478889, -1423782, -496606, --1584306, 154082, 455267, -88584, -1124745, -1059246, -273804, 627065, 40802, 2541547, -948114, 2379949, 2532957, 2770254, -3103114, -3117073, -1132261, 2554432, -750009, 1010928, --872952, 1463510, 1491427, 1029182, -1472637, -758599, -9820443, -4126390, -2596845, 7315403, --2008434, 1695438, -7666517, -7990787, 336081, 2250026, -4704600, -2712272, -4418448, 8983998, -1935420, -3074123, -6647536, -6548215, -6415608, -1812476, 3000035, 9029095, 2887829, 5085778, --4127464, 9620727, 5462125, 1741609, 54224, 9898289, -5858873, 913217, 3092377, 6693170, --10933376, -5565204, 4693326, 1887101, -1555315, 11317776, -5010080, 3189013, 6788196, 2109903, -1098438, 4982699, 1979980, 2474438, 2494839, 1074816, 2882997, -175020, 4271345, -1008244, -10546829, -7709467, 8670465, 6928319, -6088116, 6862821, 1218160, 5834176, 5852430, -12954695, --392990, -516470, -3951907, 2076617, -3570192, 3597035, -1522566, 8267812, -951335, 1305670, -3336653, 2330020, 3227668, -5259725, -1818919, -5374078, -5039071, -2850248, 7970386, 1210644, --2604361, 2383170, 2161979, 1036161, -1401233, 852014, -1005559, 3178813, 1151051, 1022202, --1576790, 994285, -3058017, -256624, 3455838, 1847373, -614180, 1188632, 1195075, -954020, -1431298, 1021129, 3351685, 1900523, -1935420, -719407, -1166621, 1069984, -3064996, 916976, -1617592, 1050120, -492311, -116501, -312996, 12948790, -3466576, -2046015, -3219078, 9214315, -4817343, 957241, 3489124, -6283537, 13787382, 4551592, -1132261, 5191542, 6636798, -11316165, --800475, 2646237, 1276142, -40265, 9507984, -4617627, -5847598, 13123809, 1939715, -955630, --1356136, 6848862, 476741, -1018444, -1340567, -3211562, 3374234, -1997697, 4516695, 3197603, --8337606, -7866233, 928787, 15503758, -240518, 3153043, -9630927, 4712653, 6315213, -3974455, -4665945, 5851893, -9767829, -5937256, -1281511, -12445205, -6663105, -7431367, 2117956, -2552821, --2824478, -1373316, 8677445, -11997454, 5228586, 2600066, -3960497, 7315940, -4758287, 699543, --10145250, -214212, 6014565, 5469641, 11386495, -13548474, -3445638, -15040439, -3308736, -306553, --3661460, 1685775, -820339, 13682155, 10536092, 6012954, -6898791, 349503, 2533494, 6669548, -8116952, -187368, -58519, -1167694, 77846, 4668630, -325344, -402116, -288837, 85899, -132607, 570157, 1791001, -1923609, -712428, 1956358, 217970, 1808718, -173409, 206158, --1685238, 2483028, 1413581, 39728, 2211371, -1171452, -267362, 2183454, 462246, -360777, --2818572, -168577, 482647, 406948, -1088774, 2801393, 4539781, -833761, -261456, -2084133, -1409823, 8769249, -10027675, 240518, -6179921, 16931298, -7282117, -4216584, 14661945, 11037529, -1971927, -20656108, -5105643, 9382893, 678068, -1069447, -3018825, -1701344, -1693828, 1357747, -3096672, 2827162, 2674691, 18149458, -3893925, -2723546, -75162, 2302103, -5523865, 3126199, -1845225, -758062, -6070937, -3836480, 6493454, 6972343, 13255343, 3335042, -5582921, 3295851, --261993, 3342022, 158377, 7329362, -6260452, -9280351, -9577777, 6136972, -2796024, 1223529, -2379949, -3466039, -721018, 15765751, 5317170, -13436268, 9411347, 2962991, 15946140, -8414378, --7956964, 4568772, 8540006, 5894843, 3230352, -1546188, 407485, 4057670, -5323612, -1569274, -73551, 6743099, -5036386, 13615583, -594316, -253940, -7175280, -8041253, 15543487, 4586488, --12942347, -3068754, 10681584, 7416335, 1387274, 2646237, -6641093, 1984812, 1636383, 2042794, -1090385, 2275259, -3110630, -3712462, 383863, -170188, -3117073, -1057636, 2698850, 2695092, --4133369, 1009854, -104690, 1702955, 2313914, -725850, -806380, -1045825, 1530082, 4759898, --3580929, 2600066, -322659, 67109, -2138894, -526134, -1616518, -1077500, 2209224, -845572, --1436667, -3172370, -203474, -1816234, -12150999, -10302553, -3977677, 3834869, 3935264, 18884434, -18333604, -2076080, 1525250, 861141, 186831, -155693, -3732864, -12221329, -9366250, -4810900, -4392141, -3372086, -10630581, -2974802, 2075006, -742493, -16322486, -4762582, 3670050, -1625645, -1595580, 1178432, 4964982, 7254200, 1211718, -5175436, 5358509, 5583458, 3937411, -170188, -7217693, -14307610, 4855461, -12671764, 15897285, -11202348, 4376572, -11889006, -1934346, -13288629, --7002944, -8264591, -8948027, 6213207, -7863012, -1481764, 2828236, -55298, -4169876, -2991982, --1337346, -12998719, 475131, 897648, 6517613, -20317880, 528281, -485868, 9546102, 11460046, --7704635, -4720169, 480499, 8813273, -16787954, 10829223, -7522099, -4968204, 871878, -16345035, --798864, -1288490, -2515777, -2893734, -1999844, 16464220, 6747931, 3409667, -3888556, -3658775, --4071092, 545998, 4078072, -6550362, -134755, -1116155, -1726577, 907312, 4898947, -1781338, --3067681, 3099356, 1928977, -39192, 3454228, 1870458, 2901787, -1713155, -2165201, 4158602, --2942590, 1088774, -3871376, -724776, 220117, -771484, -1440962, -3434900, -3760781, -4012036, -1021665, -196495, -835371, -2886218, -2707440, -1101122, -1406602, 933082, 4152697, -1070521, -3189550, -9531606, -25071334, -9928354, -4660577, 4534412, 6945499, -8129836, -2996277, -10262287, --9047885, 4982699, -7934952, 8450885, 3511673, 6110128, -871342, -8043400, 14420353, 5820218, -8126078, -10086731, 4449586, 2003065, -14788646, 9346386, 5623186, 681289, -10040560, -3771518, -5100274, 5441187, -151398, 1963337, 7312719, -6945499, -5146445, 8642548, -16887812, -16604880, --21915070, -4811437, 7137699, -19178640, -16043850, -9649718, 381715, 7067906, 2270964, 2080912, -386547, -5463199, -7652558, -18105434, 9666361, 2836826, 22137872, -5163088, 620623, -13558675, --16322486, 2200097, 10600516, 849330, -10291279, 6934225, 2789045, 15185931, 1503775, 2017561, --7269769, -1261647, 6405407, -14654428, -27590870, -7573101, -6881612, 1613834, 7267622, -13095892, --6684580, 4440460, -4612795, -944356, 4323422, -2426657, -2215666, 5813238, 1402844, -380641, -2802466, 4546760, 4929549, 1074816, -3307125, -8645232, -805306, -5222680, 1450625, 1107028, -1119376, 3774740, -3149822, 3444027, 4519380, 3164317, 2554969, 2675765, -6512781, -5819681, --2263985, -4992900, 564251, 1605781, 1717450, 6241125, -1442572, 4020090, 2371359, -2421825, --1340567, -3590593, -5059472, -1227287, -6664716, -2014340, -1513439, -23601920, -18136574, -8348343, -12462921, -1093069, 21340082, 4207458, -1839320, -11985106, 4271882, 21969294, -22999550, -20730734, --6832756, -3460670, -14418205, 13654238, 4018479, 7387881, 8864276, -14477798, -1707250, 5776731, --9094056, 17026860, 263604, 3808562, -4951024, 4180614, -11256036, -6459094, -3860639, 6381248, -3058017, 10333691, -16979616, 1487132, -118648, -12698071, 13836237, -8302709, -20205136, 3956739, -7296613, 1430224, -6027450, -1510755, -8409009, 1345935, 6899328, 2884071, -13808320, 5366562, --3139084, -15398531, -9062381, -18909130, 430034, -2988760, -491774, 2393371, 11579769, 14324790, -11971684, -6175626, -10424422, 3391951, -2646774, -1816771, -8056822, 14902463, 12372727, -2717641, -22986128, -14720464, 7668664, 14427332, 15607374, 356482, 9924596, -6486475, -2526515, -12930536, --5437966, 7624641, -2612951, -10089415, 6255620, -5812165, 6572911, -3003256, -6832219, 3498788, --1348083, -3987877, -2973191, 2546916, -3317862, 2211371, 4642860, -4944581, 6294275, -847719, --3402688, 2263448, 770947, 326954, -2823941, 3592203, -5565741, 1826972, 2121714, 155693, --3707631, -470836, -2190970, 2760590, 5219996, 11176579, 5734855, 8910983, -427886, -163209, -4653597, -5819144, 1578937, -7868917, -3128347, 1632088, -77846, 8629126, -20440824, 2600066, -248571, -12920872, 1893007, -28755342, -24869472, -5946382, -209380, 1081795, -617402, -10217727, --348966, -2915746, 9210020, 1803886, -570157, 1735704, -21721260, 7521562, 4065187, 12070469, -5016522, 5232881, 14181445, 7065758, 2063195, 35459788, 7596187, 13647259, 18824842, 886374, -13280576, 3331284, -7354595, 8621073, 623844, 4153770, -7202660, 544387, -4668093, 3012920, --4653060, 9978283, 1216013, -6199249, -7739531, 1073205, -21021718, 12233677, 8265665, -1066763, --1889786, 4811437, -5576478, -4634807, -6885907, -8326868, 6970732, -6641630, 11508365, 13378286, -13122199, 13944685, -3218004, -21117818, 355409, 8921721, 21322902, -4937065, -765578, 10098542, -14898705, 21927956, -2822331, 9663676, -6467147, -3754338, -17592722, -13731010, -5982353, -6228240, --5009006, 3684008, 786516, -7547868, 8579734, 5405753, 6747931, 12062953, 4849555, 4526359, --1412507, 22549, -1757715, -3442416, 129386, 2183991, 38118, 6371047, 5112085, 3119757, --334471, -5207648, 332323, -3736622, -4122095, 2666101, 3256659, 979253, -6470905, -1452236, --9424232, -2290291, 3118146, 4695473, -2997887, 3906273, -5373004, -6272800, -3148211, -3776887, -3529390, 1831804, -5498095, -3788698, 4334696, 16988206, 22158810, -17118666, -17897666, -23526220, -20537460, -2530273, -8762270, 6920266, 6688338, 19213536, 15964393, 755377, 17536352, 25056840, -6925635, -13197361, 11870216, -12233677, -6960532, -2749316, -8625368, -10310069, 4948876, -5333276, --5237176, -12380243, 27333172, 3193845, -14928769, -256087, -2232846, 12104828, 12822088, 4907000, --8830990, 12931073, -3810710, 7890392, -25463788, 1084479, 10260677, -11063836, 3400004, -12001749, --9817758, 25817586, 10597295, 7624641, -2043331, -23314694, -5830955, 6449431, 4751845, 3503620, --5695127, 18134962, -13133473, 9974525, -6289443, 6520297, 7216619, 14320495, 19439022, -23066658, --821413, 11509975, 5478768, 16271484, 15773804, -23003308, -164283, -6534793, -12030740, -973884, --12572443, 4844723, 9221832, -4836670, 16893716, -4092567, -10469520, -12660490, 10424959, 12000139, -11942157, -3592203, 1880122, -952409, -17923972, -17355426, -16294569, 9685151, 4747013, 2918430, -7730941, -791348, -4727149, 11810623, 1398012, -345208, 7130720, 11428371, 6812355, 610422, -1010928, -3743601, 6835441, 3264712, 14686104, -1693828, 1529008, 10227391, 8244727, 2636573, --1780264, 6426345, -508954, -1699196, 11523397, -9782862, 205085, 6984154, 274341, -2509872, --3869766, -2132451, -335544, 7553774, 1170379, 233539, 8367670, 5995238, -5920613, 9008694, --742493, 17474612, 34820372, 1487669, -16656957, 4702989, -11147051, 7209640, -9693204, -10420664, -31601296, -23994908, 39680664, 24334210, -5879810, 8026220, 19164680, 2810519, -29950954, 11790759, --24259050, 5810554, 2144799, -11931419, 498753, -1585380, 17303350, -8614094, -882616, -614180, --5284421, 36644124, -2116345, -5440650, 4700842, 12383464, -12484396, -26266946, 20763482, -3259880, --1603633, 23752780, -13944148, -3784403, -16599512, 4507568, -11606075, 13451301, 12321724, 25283398, --7241852, 7124814, 16824460, -23817204, 2913599, -15144592, -24067386, -30656402, -16190416, -33152316, --37402184, -5141076, 2401961, -17501992, -18950470, 11818676, -1347009, -10524280, -20430086, 14823543, --10924249, 3932580, 18493592, -34799972, -10095321, -6311455, 15467788, 41845328, -19776176, 1320703, --12563316, -18415210, 8956617, -22057342, 17832704, 31222802, -8901857, -14421963, -15436112, -3774740, --3714073, 415001, 10065256, 7541963, -8226473, 8360154, -1065152, 6603512, 340913, -7427072, --2184528, 9240622, -15162845, 7230578, -7963406, 2211908, -6491843, -2355253, -9146670, 2202245, --8793946, -13475997, -6587406, 3349538, -10140955, 107911, 3004867, 15051176, -8663486, -4902169, -4860829, 6280853, -10819023, -6586869, 3019899, -2792266, -5790153, 10549513, 1780801, -8006356, -7228967, 2200097, -12628814, 2205466, -10137733, 11254425, -5009543, -16146393, -23897198, -18126372, -20149302, -16412681, 8167954, 19173270, 8227010, 12325482, -22778360, 32864016, 20702816, 17939004, --13154948, 23561116, -2527588, 15591805, 10277857, 3491272, 8537858, 11452530, 7012608, -3806415, --5796595, -5209259, 2428804, -15786152, -18592914, 10523207, 4694936, 6119792, -15280420, 4208531, -4733591, 11516955, 17190606, 25789668, -14487998, 3924526, 36719288, 7930120, 3999152, 3567507, --7486128, 2713883, 36567888, 10611254, 23712514, 6760816, -25222732, -10516227, -18346490, 53014392, -21607980, -20464982, -12752832, -18252000, 3168075, -11972221, -28715078, 6627672, -21725556, 32463510, --2193655, -26851598, 35451732, 28683402, 4182225, -7786776, 4930623, -16341814, 21878564, 38927436, --10314364, 18465138, 43622372, -6845641, -6976638, -4952634, 26605712, -1921461, -14515379, -13733158, --13853954, -231928, -1603633, -12170327, 1091995, -5101885, 13479755, 3331821, -12712566, -8087961, --14494441, -1584306, 2127620, -2375117, -10108206, -11415486, -7984881, 7165079, 12189117, 1890859, --12406013, -1817845, 16103980, 132070, 14774687, 7697655, -8043937, -724776, -12566537, 12508019, -5750961, -16385300, -30698278, 2848637, -1822677, -9343701, 10319196, -65498, -5203890, -4379793, -3352759, 856309, -1029182, 9115531, -24970940, 10110890, -3297998, 25043954, -51946556, -35604204, -20760798, 9997073, 7610145, 17634062, -17621714, -23039816, -12603582, -18955302, 10940355, -20349556, -6131066, 13720273, 22494354, 863288, 18879602, 11020886, 3240553, -5854041, -19415936, -13703093, -11577084, -23834384, 12357158, 2926483, 20566450, 15669651, -7459285, -29699698, -19206020, -1699733, --1316944, -7782481, 20575040, -35932232, -2618320, 1352378, -37553584, -638340, -4469987, -2922725, -4216584, 22176526, -21345988, -59222768, 22318798, 24248312, 14587856, 46336256, -37901476, -4814659, -25881472, 19731080, -23719494, -11038603, -6410239, 36502928, 7356742, 34842384, -50130320, 7399692, --59836412, -35893040, -34610456, 41309532, 13258027, -26564372, 24407226, 2877091, -23159538, 23787140, --34737160, -36617816, 5665062, -38035156, 11483132, -65000036, 10116259, 20549808, -27515172, 30481920, --13626857, -7323456, 20551956, -7013145, -5412733, -14496588, -877784, 4803921, 11416560, -1335735, -10621991, 20511690, -15256261, -1692217, -12095165, 7294465, -7841000, -2143189, 4649302, 2508798, -2920578, -2723546, 21300354, -7034083, 1877438, 9013526, -18485540, -16443282, -17946520, -8472360, --30339112, -14048838, -10992969, 26229366, 5360119, 23334020, 10228465, 4667556, 10781979, 7347616, -1107028, 8784819, 2032056, 18249852, 44950052, 16610786, -16135655, -10553272, 6184216, -11461120, --13423383, -1633698, 20910048, -3674882, 3894999, -22293028, -4616016, 30690226, -22439594, 16955458, -40130028, 20023674, -1712081, -7710003, -13203803, -25720948, -18878528, 22065932, -12602508, 20700668, -14961519, 7066832, 983548, 8045011, -6394670, -32706176, -11316702, 23296976, 18521510, 19352048, --20642150, 35582732, -9162239, 13797582, -26331908, 24070070, 41555420, -8421894, -14775761, -1597191, -1544578, -9300752, 9098351, 18101676, -34057480, 22304838, 21725018, -5380521, 25182466, 13268228, -10882373, -16025597, 3322694, 22436372, -47496432, -42395084, -17601850, 11143293, -21848498, -64404644, -26989574, 17580912, -8313983, -10990284, 521839, -3849901, -22003654, -59170692, -3541201, 41887744, -10222022, -7543037, -4983773, 8986682, 34403760, 27292906, -40303972, -16724603, 26954678, -5779952, --10780368, -46201500, -2652679, 25220048, 8444443, -7184944, 15636902, -5883032, 1688996, -17457432, --2811593, 10485089, 15910169, -9102109, -3221762, 3180423, 9220758, -5768141, 5694590, 669478, --11227045, 6689412, 19344532, 3236795, 5810554, 3524021, 8762807, -9168681, -15887621, 1473174, -17292076, -14201309, 6245956, -4848481, 1603097, -13773960, -26331908, -14427869, 9891847, 32053878, --3217468, 15108621, -21206402, -9409736, -14315126, 8836895, 6314676, 10087268, -7185481, -11048266, --705448, 2275259, 2543158, -4990752, -1094143, 21876416, 28997472, 645856, -32695976, 43296492, --12164421, -30227442, 27084064, -4350802, -16445430, 20932060, 5602248, -4383014, 17657684, -24212342, -22961968, -8206609, 770947, -7041599, -6015102, -33754148, 13364864, -12885976, 5316633, -13532905, --1116692, -10089415, 9664750, -5911486, 36477696, 6444599, 23863912, -9286793, 5967320, 15083925, --6406481, 10424422, -2068027, 18219252, -915902, -6125697, 28806882, -25742960, 14361834, 19684908, --11556146, 22280142, -13641890, -558883, 11463805, -8722542, 26192858, 23450522, 4876399, 39027296, --24055038, -55116240, -9276592, -34080564, -22546968, 80483392, -2050847, 24689620, -3757560, -33973192, --875100, 33811056, 47887276, 29111826, 48238388, -25953950, -7763154, -11632382, -27542552, 18259516, --7733626, -17004850, -1775969, -33431488, -61097520, 15374909, 21509196, -18087182, 12177306, -3808562, --18226768, 19450834, 14328011, -7125351, 20042464, -7369090, -17895518, 9190156, -8886287, 23763518, -2235531, 1773822, 13426068, 4476430, -15141907, -6352257, 7792682, -4988605, 14794015, -20637854, -13316009, -21638046, -5512591, 5394479, -15358803, 9801115, 616328, -23051626, -3736622, 1487132, --6192269, -56908, -4310537, -16911970, 6922414, 5073967, -2695629, 16983912, 26029650, -14187888, --20310364, -1296543, -9691057, 28168544, 28918014, -17043504, -10807211, -3547106, -14343043, 303332, -5078262, 24316494, -26086558, 30828202, -18967112, 4054449, -286689, 3002719, -24087788, -3908957, --21809844, -18073222, -164819, -7254737, -16511465, -6709813, 11710228, -14115947, 10772852, -6780143, -33152852, -15672336, 9739912, 1817308, -8533026, -27012124, -10067403, 20215338, 3454228, -6884833, -26531624, -20007032, -20233590, -2927557, 25322054, -23447300, -3491809, 4361540, 6694244, -26088706, -7548942, 8794482, -9502078, -27270358, 239444, -21219822, 8659191, 4585415, 7814693, -41576896, --17940078, 23408108, 63411436, -29018410, -4235912, 4935455, -11002096, -18170932, -610959, 52993452, -11999065, -5611912, -4932233, -14249091, -3526168, -10955388, 20371030, 894427, -13431436, -14331232, -479426, 9354976, -21470004, 16376710, 4645544, 17871358, 457951, 22781044, 9385040, -16181826, -21297132, 20402706, 50659140, 16041703, 3688303, 5086852, -18860812, 6059125, 16394964, 17063906, -5684926, -1347546, 399432, -2215666, 6163815, 7032472, -1945083, 9128953, -2645163, -1082869, -17333952, 7344931, 2768643, -5389647, 4954245, 13193603, 13761612, 15983721, 5592585, 5794448, --9279814, -183073, -777389, 2837363, 8851391, -484794, -7463043, 8156680, -7808788, 6771016, --583042, 8011725, 967441, -6762963, -2097018, 446677, 1612760, 3942780, -1212255, 2799782, -1945620, -196495, -40537512, 53643068, 7337415, 12146168, 12811351, -12495670, -14384919, 426276, --5592048, 7551090, 17619566, -24947854, 8150238, -5335423, 6385543, 5953899, 4134443, 14069239, -11011222, -10697153, 9893457, 8563628, -8671002, -14944876, 4466766, -5371394, -12380243, 7268159, -5987185, -1149441, -8115341, 118112, -5932961, -2963528, 504659, 3087008, 5592048, -11216844, --1712081, 8773008, -4029753, 7859790, 1466731, 5636071, 11611444, 3329674, -11976516, 1123134, -11078868, -6448357, -640487, 5268851, -19002546, -1281511, -4741107, -17792976, 24368570, -6346888, --1074816, 14359149, 2432562, -11038066, 4249334, -10558103, -2154463, 7921531, -9815611, -3675418, -18008262, -19323058, 2001992, 1576253, 6516539, -8672613, 5764383, -3077881, 5370857, -7465727, -298500, -1924682, 18149994, -8460549, -859530, 4582730, -9229348, -1048509, 12556337, -2824478, -8082592, -5710159, -5252745, 769873, 4847408, -4970888, 9257802, -238908, -2066416, -2197413, --2965675, -3102577, 7895761, -6932614, 7729868, 4061965, -10228465, 2270964, -1060857, -1056562, -5986648, -8683887, -3437048, 1051730, -5683853, 5700496, -5844377, -1050656, 9590662, 1530082, --1817308, 4177930, -4844723, -4045322, -2358474, 4463008, 8000987, -2683281, -2321967, 663036, --6920266, 12566537, -53253300, -108307264, -13989245, 67903432, 52196736, 149959328, 72122704, -35019016, --30605400, -71170296, -124615256, -15794742, -48343616, -15032922, 87898120, 56021404, 59797220, 114428664, --4062502, -25382182, -43229920, -113250768, -62542776, -20146618, -21087216, 3111167, 51484308, 39875012, -42315628, 79861160, 46699180, -29411400, 42543260, -44788456, -104469712, 13327820, -70131448, -97534416, -37977176, -8404177, -18119394, 119859112, 39222180, 31841276, 103282688, -11120744, -20380156, 31424666, --69305200, -86073832, -23197118, -73705936, -65904124, 13931263, 14219026, 29746406, 90103048, 79825192, -48316236, 57248692, 11023034, -45193792, -48700636, -60234232, -82812336, -38665980, -21061446, -28143846, -24955908, 79723720, 52005076, 51399484, 42216308, -29825326, -382252, 8392366, -68357624, -28177670, --17176648, -20016696, 31268436, 16009491, -3986804, 25593174, -6003291, -5350993, 4320200, -18446348, --13955422, 9077413, -11476689, 18545668, 23288386, -8722542, 12600897, 23779086, -13936632, 15570867, -7737921, -46506444, 8170102, -15108621, -50536732, 765578, -28885802, -25812754, 36658620, 39727372, -38316476, 71102648, 22617834, 22623740, 24065238, -31128850, -62147104, -69342248, -88809720, -66136592, --19991462, 11570105, 53782656, 89197880, 98794984, 77186464, 56215752, 11107322, -52376588, -78829832, --96288336, -89441624, -46396384, -2952253, 25212532, 64072860, 59112708, 32298690, 32434520, 12625056, --912144, -186294, -10008348, -19592568, -16251083, -20317880, -24624658, -18060338, -13399761, -3456375, -6895570, 16695612, 20103132, 21766894, 18805514, 13237626, 6739341, -35433, -10909217, -18176302, --16645146, -11653320, -8116415, -6350109, -1699733, 2315524, 7962870, 9302362, 6191732, 5869073, -5098126, 2101313, 2913062, 2610266, -3103651, -4044249, -1980517, -3850438, -3483219, -5171678, --6981470, -3368865, 298500, 693637, 3617436, 5631239, 5721434, 6972343, 5208722, 1904818, --717796, -3526705, -4970888, -4906464, -4493610, -4117263, -2047626, 840740, 2229625, 2108292, -2018635, 1798518, 1785096, 1616518, 572841, 127238, 437550, 316754, 164283, -168577, --993748, -1340567, -2186138, -2949032, -2353105, -1235340, 207232, 1484448, 2149094, 2724620, -2834142, 1893544, 1155883, 581968, -1116692, -1840394, -1715303, -1751810, -1512902, -962610, --784368, -62277, 495532, 667867, 862752, 912681, 585726, 301185, 42950, -235686, --376883, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --1049583, -2694555, 4660577, -3473555, -3004867, -4648765, 4219806, 2105071, 372052, 6239514, -619012, --73551, -1902671, -1538672, 1357747, -1663226, -3244848, 1832877, 532039, 5211943, 7121056, --1848447, -4182761, -5153961, -320512, -2945274, -2838437, -1946157, -391916, -4104915, 3961571, --1467268, -1548336, -2713883, -1999844, 762894, 4450660, -459025, -1278827, 1347546, -4363687, -3281355, -2720325, -9791452, 4862977, 3233037, 5401458, 5602248, 1070521, 2952253, -2918430, -834834, 4247186, 335007, -46171, -1017370, -558346, 2280628, -2063732, -1488743, 111669, -2168422, -1791001, -2232309, -3270618, 4197257, 1670205, 521839, -1015760, -4190814, -139586, -3140158, 1953136, -593242, -788663, 3145527, -375810, -225486, -1362578, -1288490, -1911797, --2265595, 147640, 483721, 1085016, -2331630, -919123, 1304060, -1612223, 1407139, 385473, -633508, -598611, -33286, 311385, 688805, 178778, -266825, 435939, -292595, -791348, --254477, -1314797, 882616, 458488, -372588, 25770, -592706, 795643, 817118, 269509, -85899, 313533, 293132, -814433, 34897, -153008, -195421, -314069, -106300, 469225, -142808, -14672682, 7678865, -707596, 234076, 2680597, 3770981, -5457293, -679679, -967978, -3139084, 1202591, -3332895, 10461467, -1103807, -633508, 4664335, 3830037, 1263794, 2661806, -8543764, -4207458, 284542, -2138357, 870805, -2611877, 230318, 279710, 976568, -4721243, -425202, -1123671, -1762547, -190052, 2994666, -1627256, 2785823, 4041027, -6929930, 949725, --2805688, -755377, -4258997, 2147484, -2519535, -423054, -1414118, -4334696, 1681480, -2904472, -2003065, 1102733, -2130304, -3152506, 121870, 2951180, 2232309, 5353140, 2490007, -2297271, --6537477, -428960, 1178432, 8282845, -2543158, -1245004, -69256, -1601486, -4289062, -2046015, --3991635, -530428, 3352759, -743029, 3987340, 2564096, 2071785, 2888903, 542240, -5163625, --1185948, -3319473, -2093260, -5735392, -171262, -1627793, 798327, 1567663, 704375, -846109, --1146219, 206158, 1541893, -1286343, -332323, 45097, -443992, -111669, -506269, 618475, --1951526, -669478, -442382, 67646, -168041, -358093, 30065, -2901251, 10624138, 5491653, --1836635, -4421669, 6037651, -7270843, -1297080, 3882651, -3061775, -2238752, -3189013, 6978248, --2599529, 2083059, 489089, 2056216, 9569724, -9826348, 2786897, 4762045, -3346853, -9103183, --4799089, -722628, 455267, -1384053, -1735704, 3661997, 5372467, -559956, -3994320, 185220, --5032091, 1358820, -3200825, 1630477, 5745593, 2038499, -5992553, -263067, 250719, 8659191, -1531156, 4281009, -1369558, 1839857, 1428614, -10703595, 64425, 4916664, 2220498, 5510980, --5077725, -3159485, -5055714, 1240709, 3073586, -1115618, 979789, 171799, -2586644, 841277, --1967632, 1585380, 1495186, -466004, 2496450, 431644, -482647, 1044214, 6206765, 1056562, -3194382, 4002910, 2173790, -3758, -192200, -6015639, -106300, 6198712, 2132988, 2692408, --213138, -538482, 3869766, -3063386, 236760, -374199, 1923072, 967978, -70867, -2673080, -337155, -1402307, -468688, 333397, -912144, -710280, 537408, -179315, 1955821, 753230, -1781338, 792958, 487479, 907849, -835371, -1119913, 39728, 13959, 2250026, 1324997, -265751, 703301, 2136209, -476741, 144955, 585189, 897648, -23622, 22066468, -5772436, --2124398, -3416647, 4468914, 2960306, 7472170, 2927020, -1167694, 3546032, -216359, 3972845, -1505386, 5545877, 61203, 4643397, 6068789, -6859600, 1161789, 1690607, 1076963, 1003949, -1461900, -4107063, -66035, -4719632, -727997, -236760, -7937100, -5425081, 1918777, -103616, --331249, 3067681, 3022583, -1674500, -6848326, 1966558, 6073084, 3962644, 5661304, -1611687, -3036542, 5596880, -9494562, 2922188, 4102231, -4740570, 5792301, -4143033, -905164, 502511, -1102196, -3219078, 2714956, -905164, -1112933, -3347390, -2718178, 3196530, 3243237, 1404991, -3192771, 4958003, 2716567, 6922951, -1517197, -7962870, 7585986, 1165010, 3702799, 1503775, --1340030, 1909650, 1415729, 249645, 5197448, -1684164, 5128728, -7495255, -1739462, 876173, -2265059, 419296, -4085051, -1955284, 642098, 146566, -459562, 162672, 1536525, -2076080, --1162862, -1210107, -1474248, 759136, -464393, -638340, -1204738, -947040, 2224793, -628139, --767189, -120796, -813896, -744103, 1120987, -544924, 1199907, -351114, 79457, 857920, --290984, 20938, 9922448, -11135776, 7601555, 1697586, 7781944, 1891396, -4197794, 1532230, -6024766, -6939057, -1371705, 922344, -7831873, -1459215, -5990406, -3628711, -4330401, -4773320, -2199023, -7485055, -4592931, -5941551, -1418413, 5957120, 2234457, -7171522, -2710124, -7506529, --1756642, 1771137, 11062225, -8698383, 3738769, -2133525, -3100967, -6456410, 434329, 1226750, -7138236, 3791383, 1010391, -5845988, -10205379, -46708, 3157338, 8221105, 2958159, 2707977, --5873368, 2292439, 5215164, 497142, 920197, -3107946, -3055332, -971200, 3089692, 633508, --1932735, 165356, -6468758, -841277, -5430450, 3608846, -1036161, 3607773, -5316633, -4510790, --7369090, -767725, -4691715, -1975148, 2054605, -7180112, -3008625, 941672, 4147865, -8646306, -5240397, -4016331, -4280472, -4548907, -3746285, 2728378, -2471754, 1317481, 1649804, -2222109, -474057, 1918777, 1555315, 191663, -1934346, -213675, -855235, -2251100, -269509, 1832340, -1175747, -1066226, 1735704, -1265942, -886911, -163746, 690416, -1655173, 271657, -120259, -1338419, 1024887, 2110977, -1486059, 618475, -265751, -517544, 701153, -1661616, -548145, -1082869, 586263, -692564, -27327266, 4422743, 3134789, -7876433, -1744294, -16106, 285615, --1493575, -2612414, -2001992, -8115878, 6274411, -3927211, 883690, -6760279, -2385318, 9797894, -8893804, -5621576, -3374771, 287763, -134755, -4614943, -5363878, -3816615, 663572, 420907, -186831, -555661, 2307471, -6672769, 2108292, 226560, -11745662, -1417339, -3496640, 5377299, -7888781, 1222992, -1358283, 369367, -6871411, -8647380, 4659503, 8537858, 9545028, -2577517, -1764158, 5541045, 5758478, -2980171, 5315022, 8598525, -330712, 7235410, 6176700, -7240241, -2397666, 401579, 7803419, -4781909, -5044439, 4459250, 5924371, -1831804, 561567, -8534637, -6028524, -4784594, 6362457, -10610717, 1187022, 2493766, 5091147, 321049, -4393752, -9058623, --5499706, 7569880, -7464653, -381178, 892279, 4069482, -2228014, -1634235, 3241090, -6069326, --5214627, 2124398, 1483911, -473520, 4365298, -2037425, 1072668, 1079111, 1204202, 1597728, -401579, -1721208, 1098975, 2189360, -874563, 270046, -400506, -1163936, 960462, -2836826, --343061, -3056943, -523986, -613643, -930934, -1592359, 679679, -941135, 13422, -2391223, -992674, -474594, 871342, 902480, 414464, 342524, -10536092, 3815542, -9303973, 11908871, -11454141, 410169, -15377594, 6453189, 934155, -2817499, 10710575, 107911, -9140227, -915902, -11638288, -14463302, 517007, -3571265, -11407433, -3125126, 265751, -2193118, -5814849, 3445101, --4807142, 4019553, -4086662, -7702487, 4197257, -515396, 6005975, -11500312, 4776004, 9167608, --3604015, 814433, 9205726, 13447006, -3503620, -2665564, -11221139, 726923, -9248138, -691490, --6421513, 389768, 960999, 5474473, 2644626, 5009543, -3512210, 978179, 3114925, -516470, -12402255, -8127152, -3996467, 16318728, 16371878, -3149822, -978179, -10169946, -5184026, 593242, --2790655, -6706055, 9907953, 3111704, -2517388, 14537927, 2854006, -6866042, -141734, -13207561, --6612639, -7454990, -6404870, -1688996, -10321343, -7408819, 4321811, 4027606, -714038, 2408403, --3029563, 3550864, -2263985, -3315715, 634045, -4807142, -2185602, 6353867, 548682, 3206730, --1631014, 722628, 526670, 1553704, 1406065, -192737, -79994, -3023657, 9127, 745714, -546535, -791885, -836445, 2181307, 668404, -363998, 118112, -449361, 113817, 1248762, -774705, -333934, -1130650, 408559, -736050, 13082470, -3531000, -188979, 9000104, -2201171, -5306969, -2971581, -11501922, -784905, -17717, -2399276, -6825240, -7625715, 3920768, -6050535, -10590852, -3308736, -7728257, 6524592, 13302051, -3358665, 3712462, -3631395, 7677791, 120796, --16217797, 5718212, 8977019, 846645, -2716030, -9470940, 7880191, 5232881, 5069135, 982474, -3190087, 10516764, -7477538, 1264868, 2054068, -5937793, -11400991, 10790568, 6020471, 20129974, --1042066, 8847633, -2980171, -6402186, 1065152, -1052267, -299037, -1866700, -6589554, 14434848, -324270, 1069984, 2041183, -2085207, 11916387, 1451699, 9975598, 4105452, 1669669, 10611790, --5047661, -12033961, -2374580, 2145873, 1536525, -5017059, 5837935, -3611531, -16759499, 1447941, -3316789, -9320616, 4300336, -1029718, 1796370, -47245, -3813931, -4275103, -29528, 1514513, -5099737, -533650, 1422171, -2046015, -1476395, 2237141, 1504849, -364535, 1551557, -1779727, --205622, 41876, -2306934, -3383361, 2051384, -3758633, -964220, -1683627, -3229816, -972810, --440234, -1273995, 1391569, -629213, -1365800, -481573, 6146635, 2333778, 2339147, -1325534, -870268, -2010045, -2513630, -905701, -873489, 986232, -1666447, 2894808, -3871376, -1302986, -818728, 10547903, -17708688, 2812130, 7810398, 11670500, -12429098, -1858647, 8282845, 5753109, -7055021, 1182727, 14987288, 2717104, 6162205, -1950989, 802622, 6143951, 3321084, 7104950, -478352, -10043781, -14637785, 7640210, 3641059, -2842732, 1617055, 4265977, -13704167, 55298, --8683887, 3947075, -564251, 8849780, -2957085, 3914863, -2159295, 2240899, 1120987, -447750, -4922570, 6636262, 2301029, 3815005, -10764799, 4345433, -1982127, -18661632, -12457553, 3099893, --13683229, -1001801, 11116986, -8254927, 22187264, 7993471, -4597763, 12033425, 457951, -4027606, --9108015, -8977555, -12490839, -1989644, 7124277, -8921721, -1214402, 7969312, 3553012, 4473209, -16219944, 1953673, 10562935, 18790, 1977833, -17597554, 4736812, 1258425, -16082505, -15171435, -8595840, -5824513, 890132, 4529043, -2729452, -4169340, 794569, -973347, -1222455, 862752, --2986076, 2509872, -2185602, 514859, -5173288, 2680597, 710817, 1057099, -410169, 6164352, --5178657, 380105, -1552631, -1308891, 1114544, 1219234, 1593970, 2940442, 4850092, 3035468, --3360275, 727997, -555125, 4500052, -1650878, 2886218, -4815195, -3592203, -2842732, -2309082, --467615, -302258, 2153926, 2658048, -9218610, -298500, 5756867, -102005, 4033511, -9443022, -7299834, -599148, 2107755, 6801081, -12738873, -8763881, 2285996, -193274, 6954089, 14372571, --1359894, 3568581, 15435576, -5762773, -10500658, -622770, 11302743, -2474975, -13066901, 1025960, -4795331, -2585034, -4102768, -980863, 16743930, -3214246, 14410689, 10879689, 13146895, 703838, -1057099, 7669738, 2564632, -2692945, 2696703, -10446434, 7843147, 13164075, 8260833, 1109712, -7344394, -5807333, 5637145, -5650567, 8251169, -7475928, 129386, -617938, -594316, 23432268, --3523484, -1335198, -2056216, 3235721, 6454799, 12326556, 14088566, -7730405, 3366718, 14012331, --7883413, -9797357, 5867462, -4279398, 6049999, 26770532, -12672301, 1789928, 2494839, -7000797, -3009162, 8724152, 6120329, 704375, -5500780, -13220983, 6242198, -5778879, 7223598, -4982699, -1006096, -6556805, -1445257, -10952167, 922881, -3492345, -3876208, -1382443, 1315334, 2738579, -5410585, 2272038, -3119220, -799938, 5516349, -3284039, -2874407, 368293, 381178, -4998805, --75162, -2532957, -1245004, -960462, -903017, 1888712, 1186485, 3893388, -2513630, -2534031, -292595, -3030636, 1401770, 6128382, -3085934, -3306588, -6125160, 3110630, -1553168, -4185446, --1504312, -9036074, -14268955, -10978473, -14848776, -5697274, 1725503, 11969537, 8891119, 3240016, -12618614, 3814468, 7731478, 7099044, -3347927, 10929081, 11870216, 8371965, -15877420, -8903467, --9167608, 3505767, -6300180, 469762, 4607963, -4607426, -11178189, 7300908, -5260798, 2605435, -2494839, 11497091, -11889543, 18626736, -18299782, 19026168, 39728, 9552544, -9139690, 3369939, --20459076, -11429445, -9908490, 9067213, 4261682, 13139916, -1213865, -40265, -6570763, -16465294, -10850698, -8990440, -4576288, 7838316, 18783502, 18078592, 8581882, -1205275, -12126840, 7195144, --18677202, -1464047, -10556493, 6049999, 20384452, -19459960, 7211250, 9026411, -11979201, -1205275, --1944547, 6777459, -7897908, -11559904, 2424509, -4683125, -16840566, 8602283, -1547799, -15952045, -11968463, 15640123, -5028333, 511101, 2348810, -6756521, 10308458, 4694400, -2735894, -2549600, --6528887, -3832722, 8304320, 4650376, 4804995, -377420, -7199976, -2239289, -2340220, -8193724, --1581085, 2428804, -329639, -2420214, -577673, -5852430, 931471, -2010582, 4136054, 2174327, -1002338, -6781217, 5750961, 485331, -2735357, -1739462, -923418, -372052, 3495567, -2524367, --843424, 2496450, 7050189, 3406446, 2226404, -4184909, 5673652, -13493177, -15786152, -4325569, -10481868, -12045236, 8275328, -16616155, -2813741, -6276558, -5732708, -13135621, -1001264, -4786204, --7816304, 6594923, -8730058, 9788767, 2218888, 7686381, -11595338, -21860310, -1640678, 4733591, --9039832, -6573985, 3798362, 3061775, -10604811, -4939213, 15554224, 7643431, -1830193, 8588861, -22254374, 969589, 2992519, 2445447, -1479616, -177704, 3447785, 3139084, -16756278, -5980742, --20518132, -6365142, -19121732, -8925479, 1249299, 22753662, 10733123, -10990821, -12921409, 8595303, -18024904, 11449309, -7778186, 13842143, -5004711, -854699, -23734526, -6943889, -2885681, -2780991, --16170552, -26058640, 8607651, 106837, -18990198, 5055177, 30221538, 4079682, 3598646, -18801220, --1506997, -114354, 4401268, -21134460, 19863150, 3263638, 5633387, 11027329, 4401805, 11947525, --701153, 5688684, -4427038, -9071508, -7476465, 4202626, -5985037, -1815697, -8064338, 2914672, -6953552, 265751, 5888937, 773094, -2084670, 31675, -4551055, 3430068, 3607236, 735513, -822486, -3112778, -1123134, 1927904, 5143224, 3709241, -4151623, -1431835, -1596654, -9844602, --13611288, -10057203, -3134253, -1173600, 1801202, -2275259, -3716221, -4140885, 188979, -2748242, --3486440, -6098854, -3165928, 10053982, -5978595, -5325223, -1372779, 12293270, -18218178, -3615826, -4514548, -8704825, 21276194, -17325362, -17822504, -14488535, 20585242, 9248138, -11709155, -10574209, --6985228, -2122788, -6279242, -6506876, 1151588, 7732552, 20347944, -2142115, 8755291, 7587060, -7432978, -13399761, -16684874, -12011950, 14275398, -2366527, 17314086, 5777805, -1746441, -23394686, --18983756, -1905355, 1712618, -13540421, -8360154, -6324340, -6376953, -30719754, -6533182, -7452305, --10937134, -5368172, -7096897, -14066018, 10098005, 19275814, 10844792, 594853, 11513197, 14490146, --4971425, 4635881, 3843459, 1489280, -423591, -3612068, 10298795, 4139275, 17153026, -3885335, -1860258, 6111739, 33609192, -336081, 17956184, 22534082, -1767916, -19539416, 1883880, 19576998, -3066607, -16634408, -14754823, -19077170, 12683575, -15575699, -4032438, 22437982, -9418326, -14949171, -4845797, -4061429, 650151, 6163278, -9180493, -4172561, 2086280, -2763812, -4039954, -805306, -1942936, 11224897, -820339, -5768141, -4767951, -12885, -4068408, -3497714, -2900177, -5607617, --2433636, 2149094, -2445984, -515933, -7418483, 1988570, -479963, 1561221, 7916162, 4803921, --4263829, 2094870, 1926830, -6760816, -10036802, 3842922, 4387309, 576063, -10256382, -11399380, --1522029, -7976291, -2312840, -1199907, -10116259, 18689014, 13568339, -31836982, 9867150, 12446278, --5721434, 8987756, 29911226, 2287607, 6528351, -10696079, 6806987, -11295227, -7259032, -6109054, -2048699, 7546258, 10663867, -1748052, 4305168, -3471944, -1996623, -6007049, 7813083, 28192166, --9423158, -9358197, 10034117, 6974490, 881542, -20857972, 13243532, -16672526, 9305584, 11639898, -1178969, 2798708, -3546032, 19320374, 14650670, -41339, 9813463, -8032126, 12410845, 1883880, -14034343, 20468740, -586800, 5028333, -2823941, -7845832, -650151, 8795019, 10046465, -19985020, --12125230, 4407710, 21351356, -10629507, 14135274, 9316858, 2657511, -23255638, 2688113, 3354370, --27569932, 15954730, -15475841, -18512920, -34862788, 8227010, 20994338, -9790378, -19492172, 3782793, -23284092, 14669998, 2515240, -3292629, 244276, 8000451, -7232188, 10755135, 17876728, 16859894, --1338956, 6999186, 17692580, -3053185, -303869, -2226404, 15231565, -2520609, 3702262, -7425462, -3833258, -4676683, 542240, -63888, -1245004, -3746285, 3309272, 8725763, 3002182, 2273648, --8170102, 1780801, -8428873, 2258079, 13215077, -5116380, 189515, 1445793, -6290517, -8489003, --9427453, -2444910, 5980742, -3077344, 1612223, -6012418, -566936, -95563, -17421998, -4793184, --711354, 3351685, 4487167, -3944391, 6234682, 2954401, 3359738, -5499706, -5004711, -3466576, -1622424, 8037495, 22104586, 16107201, -5177583, -42331196, 5294084, 21626770, 10465762, 4931696, --18414136, 183073, -12628278, 3299072, -968515, 3832722, 6692633, 9236327, 4086125, -22871238, -13692356, -2923262, 4333622, 17901960, 7044820, 3595425, -6036577, 22135724, -510027, 22004728, --26101590, -7444252, 8665633, -15054934, -13020193, 1239098, -3217468, -11714523, 1656247, 19485730, --394063, 1585380, -9836012, -20645908, -13122199, -5674189, 8920647, -1992865, 2253784, -9992241, --10982231, -5181878, 16899086, -11150809, 9826348, 6773164, 5626407, 2178622, -17030620, -24274618, --1784559, 16783658, -20216948, 10193568, -17378512, 11343545, -18294414, -608275, -18035104, 26204132, --23405962, -13776108, 6314139, 4583267, 12064026, 10203232, -5912560, -2923799, -5951214, 3553012, --50466, 15766288, -18951006, -7243999, -24410446, 13071196, -8544301, 1309965, -825171, 7067906, --5245229, 2869038, -9868761, -14967424, 10051297, -7564511, 455803, 2885681, 13285408, 5580237, --9185324, 2366527, -2970507, -11735461, -2025614, 3196530, 4027606, -10572599, -5121212, 12432857, --1009317, -9800578, -4236449, 14530948, -16399796, -5277441, 3627100, -3496640, 6161668, -877784, --7068980, -9472550, -2906619, -4037806, -2808909, -2861522, 2955474, -390842, 6437082, -6136972, -3696356, 1570347, -2677375, 6579890, -36390720, -5186173, 10853382, 2627983, -8694088, -13014825, -1171452, -12375948, -1178432, -19092204, 17810156, -7175817, 11138998, -24817932, -14079440, -562641, -30334280, -24902758, -2183991, -19507204, -15501074, -4789426, 18997178, -4488241, 8417599, 8832600, --10125385, -21645562, 30370788, 13156022, -17418240, 3289945, 2209224, 8302172, -16947404, 15087683, --1367947, -31877248, 3337190, 6269042, 8175470, -26433914, -6328635, 3221226, 23180476, 4312684, -12907987, -34082712, -20673288, 10314901, -16106, 22063784, -5957120, -3857954, 1685238, 11155104, -10314364, 3821984, -43211664, 12048994, -5038534, 9761387, 23019950, -7413114, -2052994, -26446798, -8536248, 11764452, -13839995, -8356933, 23829552, 37484864, 9844065, 5987185, -10653130, -4566087, --20548198, 1415729, 258235, -25531970, 9259413, -925029, -7421167, -2100776, 11950210, -9888088, --6539625, -1306207, -2705830, -1091995, 10558103, -4731444, 227096, 5886253, 2435783, 8163659, -7055021, 5156108, 3794067, 9800578, 11728482, -15867757, 5005248, -9986336, 7776575, 948114, --9887015, -6942815, -3828963, -3507915, -6471979, 5787469, -3281892, -6662568, 10812580, -1942399, --3379603, 5899675, 11139535, -287226, -3946538, 2809982, 10400800, 10989748, 7124814, -3947075, -1939178, 1818919, 9370545, 5445482, -30714384, -19923816, -6546604, 157840, -17288854, 14591615, --36384280, 2274722, -22150756, 12224014, -7910256, -24674588, -1745367, -6298033, -8382703, -28172838, --20431696, 6463389, 23068270, -14691473, 28363428, -23289998, -15151571, 5567352, -1852205, 13131863, --7432978, -7822209, -11065983, -2758443, -38685844, -10805601, 1593970, -1242319, -6067178, -14954002, -12750684, -13182328, 21364778, -6026913, -2152852, -14375792, -13200045, -25484188, -10836739, 10024991, -4398584, -1116155, 2160369, -8877697, -6585796, -11576011, -9634149, 5730560, 8154533, 4060355, --22073448, 26203058, 3936338, -10755672, 21061982, 15163382, 25014964, -4258997, 14775224, -33272038, --17776870, -31419296, 32803350, -10059350, -22160958, -21348672, -45699524, -18920942, 32339494, -1730872, --15770046, 12037183, -31058520, -20692078, 8315057, -1504312, -25853556, -25310780, 99858, -14406931, -4346507, 5817533, -19131394, 19366544, -11227581, -16751446, 1882269, -9807021, 27599996, -10174778, -12618077, 2255932, 16928614, -8118562, -4450123, 1890323, -7156490, 15569, -15479599, -11719892, --2683818, 6894497, 690416, 11277510, 4806069, 8435316, -6757594, 227633, -13440563, -3118146, --4621922, 4389994, 13526463, 6336688, 5635534, 6532646, 5796595, 1707786, -17646410, -5095442, --12084427, -2852395, 2406792, 8553964, 40581000, 51857436, -4583804, -22624814, -5130339, -8384850, --22818088, 10234370, 980863, -16512002, 49631032, 17353816, -11323681, -33927556, -2702071, 8479876, -9359807, 10242960, 23951958, -6559489, -11273752, 11291469, -42378444, -28370406, -10774462, -2866891, -4993437, -22643604, -20449950, 22184580, 17913234, -13273060, -25460566, 16601122, 916439, 29146722, --23152022, -5260798, -7598871, -1318555, -18196166, -27644558, 23804856, -17095580, -10418517, -21107080, --4277251, 14150843, 13661217, -8446053, 2342905, 2579128, 18109192, 27078158, 20365662, -34467648, --16100759, -20415054, -4616553, 11880416, 4837744, -23550916, -33442226, 28876138, 2363843, -28159954, --46304580, 23687282, -5550172, 12767327, 12302934, 12479027, 2218888, 9218074, -17845052, -6940131, -13214541, 2334852, -8039642, 5257040, -1607928, -24817394, 13123273, -31520228, -1461900, -1527398, --4886599, -11316165, -3793530, 13881871, -329639, -3167002, 7742216, -10196252, 31351650, -2427194, -3386045, -2286533, 943819, 7649337, 169651, 7364795, -15023796, 3375844, -2212982, -10966662, -1789928, 5201743, 10910291, -5200669, 3544422, -26215406, -7869454, -1487669, -13007845, 11604465, --862215, -3223373, -6655052, -10851772, -15180562, -22392886, 7490423, -2319819, 17090748, 19314468, -13103408, -13309030, -17619566, -23412940, -7976828, 21305186, 18254148, 2884608, 8953933, -7611756, --12651900, -10366440, 814433, 2962991, -9757092, 4614406, 18109730, 22435298, -27785218, -23295366, -66279936, -5314485, -6478422, -9914395, -20917028, -2248952, 23911694, 38454988, -17696340, -10654740, --3901978, -17446694, -4356708, -9819906, 15265924, -15760382, 17473538, 8375186, -6011344, -21994528, --1627793, -9035001, 33062122, -18128520, -459562, 99321, -3313567, 15008226, -9548786, -1203128, -6858526, -4481262, -32321240, 16525424, -14760729, -17013440, -3954591, -18147848, -10601053, -33013266, -31609886, 1512902, -21113522, -38689064, 22524420, -22793928, -22360674, 368830, -17428978, 7912404, -14261976, 44146896, -12585328, 17333414, -3768834, -21234318, -18170932, -5209259, 66242356, -58402964, --4349192, 60978872, -55790016, -21049098, 31304942, -4540854, -25259240, 58982248, -29237452, -12015171, -26944478, 6804839, 11442330, -17352742, 19422916, 27567784, 12764643, -6913824, -1916629, 27846958, --4155918, 15982647, -495532, 11192685, -16003585, -1948841, 7187628, 4585952, 2929705, 862215, -994822, 11668889, -5438503, 3112241, 4135517, 4038880, -25070260, -10124312, 7834557, -20970714, -6200859, 12193949, -9082245, -9264244, -7429220, 5200132, -10385231, 12236362, 10074383, -1177358, -5761162, -7344931, -15200963, -14472966, 28927142, 5418101, 17971216, 3912715, 3396246, 11696807, --10124312, -2157684, 18261128, -10781442, -25393994, 19082540, -2749853, 11245835, -3125126, -7248831, --7377143, 30946850, -40259412, 35478040, -6465000, -22613002, 18916646, 6415608, -3923453, 3686693, -2272575, -4658966, 6680285, -8061117, -10328859, -4901095, -14176076, -11882564, -26322244, -10304700, -22008486, 20710870, -32642826, 10444287, 16807280, 14003204, -5893232, -32259500, -3226057, -16154983, --37682968, 23185844, 59471876, -34701188, -4060355, 42130944, -12411919, -15529528, 34176664, 25256018, -12305081, -14301167, -28155122, 8904004, -11673184, -17956184, 62213140, 45656576, -38080252, -28167470, -33443836, -62001076, -22024056, -17833778, -10975252, 42698956, 28302760, 18456548, 20345796, -72784128, --25606058, 68602440, 39628052, 7792145, -18756660, 23379654, -24637544, -49582176, -33136746, 23603530, --18291728, -4254165, 27514634, 51201380, -6561637, -29462938, 3385508, 20002200, -35525820, -13430900, -36294084, 32564442, 32683628, 22536230, -6933688, -21336860, -10739566, 27611272, 7744900, 11382737, --5738077, 2751464, 12404939, 724776, -5434744, -6365142, -8362302, 5834176, 4160750, 26458072, -7176891, -5716602, -11064373, 2246268, 983011, -4354023, -9761387, 2259690, 20423644, -22497576, --6979322, 19568944, -4931160, -932008, 12906377, -5494337, 9452149, 3733937, 11164231, -22752590, --3575024, 4276177, 25067040, 5732171, 11827803, 10197326, 5498095, -5313949, 8021925, 11610907, --13967234, 6276021, -61499636, 26322780, 105764, -6488622, 31217970, -5553393, -23900420, 11709691, -10685879, 30495342, 17223892, -16831976, 716723, 4523675, 20870856, 4650913, -24391656, -1165010, --1551557, 4705137, -22694608, -24813100, 35451196, -13075491, -37393060, 18909668, 32902670, -18847390, --6476274, 1916629, 22514756, -27296128, -35650912, 9483288, 29848412, -6767258, -12921409, -7684234, --7443179, 12771622, 5429376, 7515119, 75459888, 3891240, -9783399, 741419, 2254321, 40529996, -1175210, -14810658, 9084930, -32218160, -18852758, 7966628, 56371, 34770980, 27752468, -18347564, --5375689, -17368310, 716186, 12250320, 3103114, 3568581, 12499965, -9378061, -37241124, 9113921, -25006374, -12210592, 22063784, -34765076, 16130823, 10011032, -30222074, 4791573, 540629, -13533442, -1327682, -6012418, 14949171, 14239427, -25313464, -15983721, 33683280, -26145076, 12370043, -2825552, --9917079, 6976638, -1024350, -15575162, 8609799, 4788352, 6165426, -921271, -2574296, 1221381, -4677757, -6235756, -5466420, 4111358, 3304977, -3673808, -252329, 6969122, 12585865, -7933879, --5038534, 1094680, -2201171, 3877282, -3059627, -2216203, 2967823, -689879, 7610682, -2936147, -3798362, -10331007, 6020471, -7390565, 6367289, 10451803, -881005, -393526, 1643899, -13316546, -10450729, 21100100, -39589936, -130214280, -154093232, -13858249, -106873816, 41982232, 260532176, 140152832, -211603376, 223013488, -24254218, -64273648, 19048716, -162438880, -198572448, -61350924, -218593968, -175475184, -44484588, -126225328, -34413424, 251605088, 91071560, 177882512, 307292576, 182902800, 81787448, 62261456, -21759914, -136901008, -170455440, -56240448, -232802800, -232939696, 30671436, -174201184, -142995568, 85938536, --146616768, -150730272, 113749528, 46227268, -20840256, 268606176, 251486448, 160610832, 340967264, 321362336, -109740176, 127911640, 99643240, -161809136, -162257424, -205122800, -406199232, -479413376, -344867072, -343273120, --253272608, 8677445, 23332946, 167186432, 289026080, 356322304, 324591072, 376766880, 322743168, 190393760, -127935264, 42631308, -63723356, -143001472, -203539568, -174811616, -253581856, -283915584, -235557488, -275279488, --206656112, 32745904, 66126392, 160399312, 321615200, 256187280, 197332816, 149243664, 58674084, -48759152, --39924944, -80635864, -101040720, -77058696, -87799872, -84696752, -36244156, -34275988, 1788317, 52346524, -37096168, 73486888, 88126288, 15408732, 63887640, 61531848, -17208860, 20471962, 14237817, -46772732, -1871532, 15173583, -54303420, -59117004, -82729664, -169825696, -190070560, -147715744, -141366160, -46255188, -69153808, 124996968, 203141216, 306776640, 330991104, 307147616, 214999088, 65689376, -69609072, -148442128, --221878544, -273578688, -269337952, -210184432, -144614768, -68605664, -21357798, 8660265, 24625194, 62510564, -102779640, 106274672, 98368712, 101282848, 71738304, 64864208, 55816320, 22701050, 4789426, 14002130, -11826192, 7431367, 4471061, -12984760, -34911104, -52956948, -76360760, -96848832, -97089344, -78134584, --60030220, -31525060, 5239860, 32794760, 47868484, 55713780, 49017388, 43458088, 47481400, 46005004, -36797132, 31502512, 26009786, 17885318, 9236864, 511101, -17603998, -32460290, -35913980, -33692944, --30681636, -28620052, -26534844, -19709068, -7157026, 732292, -2668249, -8731132, -4916127, 675921, -3926674, 7726110, 8959302, 12268574, 19513648, 26594974, 26102664, 26889716, 23726474, 15349139, -9273908, 5373541, -2098629, -8809515, -13642964, -24398098, -33830920, -37126236, -38620884, -33381022, --21327734, -5653251, 11912629, 27623082, 35036196, 34208876, 26719528, 17685602, 8708583, 462246, --4380867, -6918656, -7317551, -6398965, -6178848, -6049462, -5478768, -4278325, -3321084, -1988570, --689342, 200790, 984084, 1385127, 1319092, 1007170, 503585, 139050, -35433, -62814, --51540, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --8851391, --10554345, 5538361, 401043, 8317741, 3059627, 3714610, 2408940, 3423089, -24696, -33286, --1786706, -5329518, -3050501, 1511829, -200790, -922881, -573915, 2948495, 2304250, 105764, -2659659, -2349884, -6079526, 2031520, -1364189, 761820, -3068754, 2532420, -2500745, -1211718, --950262, 4478577, -975494, 21475, -1776506, -435939, -4912906, 1746441, -780073, 2756832, --2304250, 386010, -1056562, -3927211, 1328219, -330712, -1019518, 1844152, 3344706, -615254, --1953673, -5776731, 592169, -3408594, 1672353, 121870, -2190970, -27380, -906238, -753230, --4154307, 2789045, -3677029, 2127083, -1410360, -2433099, -2063732, -4427575, 2534568, 290447, -1293322, 2761127, -2818036, -4543539, 3011846, -4352413, 205622, -2881386, 1001801, -2217277, -2066416, -1093069, 1122060, -1906429, 419833, -854699, 1244467, -885300, -970663, -947577, --883690, -1706713, 321049, 487479, -241055, -1334124, 1027034, -995359, 213675, -648540, --1133871, -391916, -362388, -142808, -197032, -126165, -923418, -486942, 219580, -545461, --248034, -270583, -630286, -165356, -452582, -601832, -505732, -15754477, -202937, -2121177, -4103305, 43487, 1560684, -1335198, 2027225, 365072, 1771137, -1854889, 10121627, -2243584, --1453846, -4394289, 1435056, -5298379, -1712618, 356482, -2580202, -73014, 3702262, 2094870, -1394791, 2470143, 3597572, -4442607, -1699733, -125091, 2281702, -4195110, 4035122, -3517578, --1769527, 3204046, -629750, 708670, -2594697, 2956011, 3124589, 3323768, -5180805, -1620276, -5576478, -117038, -851477, -1295470, 6082211, 3928285, 4704063, 41339, -1109175, -1452773, --340913, -171262, 686658, 1777580, -5892159, -577136, -2746095, -3525631, -459025, 956704, --3057480, 769336, -2336999, -903017, -945430, -119722, 2037962, 1838783, -1066763, -746787, --1334661, -4827543, -1131187, -3012383, 79457, -3958349, 1060320, 12885, 3950296, -1414118, -543313, -3475166, 299037, 430034, -1596117, -1693828, 1678259, 3758, 447213, -210990, -1178432, -360240, 490163, -250719, -270583, 1376537, 656593, 545461, 221728, -209917, -850940, 5290326, 6274947, -4456566, 513249, -3809099, 5745056, 1009854, -2451353, -3454228, --3061238, -685584, 680752, 1481227, 7661148, -4646081, -784905, -1880122, 2968359, -8675297, --1064615, 5436355, -207769, 4558571, 1985886, 3644280, 3797825, 1616518, -810138, -4105989, -1278290, -1192390, 456877, 6365679, 1562831, 5452998, -2954938, -1568737, 363462, -7479686, -811212, 5480915, -1686848, 454730, -4694400, 3439195, -135291, 1492501, -5545340, 3166465, --3743601, -2119566, -3907883, -4587562, 2549600, 820876, -1523640, -2380486, -2247879, -1676111, --1152662, 2495913, -2595234, -4661114, -7136625, 6484864, 4970351, 205622, -7139310, 2085744, --3453154, 2723546, -2350958, 440771, -4395899, -2800319, -5709086, -2623688, -845035, 5453535, -3235721, -6229313, 2618856, 69793, -588947, 2627983, -418222, 2072322, 4333085, 161598, -872952, 2839510, 549756, 512712, 2823941, -574452, -126702, 151398, 324270, 541703, -664646, -710817, 784368, -671089, 162672, 72478, 688805, 99321, 1771137, 1518271, -66035, -159988, 1736777, 838592, -1388348, 181999, 596464, 26716844, -9944460, 11959873, --9532143, 799401, 2826089, 2793339, -7872138, -2685428, -2655364, -13170517, -89121, 677531, --4757213, -785442, -74625, 9385577, 1720671, -6578280, 4772246, 5210332, 1149441, 9514963, --7107097, -2612951, -3806952, 1994476, 7618735, -572841, 463320, 2822331, -1384053, 3394098, -1523103, 8706972, -1335198, 3401614, -5734318, 5196911, -4021163, 5804649, -122943, -6107444, --933082, 8778376, -407485, 5933498, 3554086, 5705864, 491237, -4548371, -3703873, 76773, --2757906, 4681515, 3097745, -4668630, 623844, -3651259, 6185827, -1704565, 4959077, 5925445, -1023276, 6109054, -299574, -2986613, -1027034, -3801046, 156766, 8033737, -5063767, -5183489, --1970316, 2269890, -3553012, -2206003, 1544041, 3852586, -1620813, 1406602, -7820599, 1908039, -492848, -571768, 2720325, 160524, 722628, 1844689, -250719, -1022739, 828392, -1810329, -551903, -761283, 214212, 329102, -289373, -637803, -1572495, -134755, -1254131, -786516, --535797, -2610266, -22202296, 2502355, -6493991, -4623533, -7129109, -8650601, 3498788, 7860864, --1115618, 3097745, 1293322, 4070019, 965831, 361314, 2472828, -4702989, 11118597, -506269, --6385006, 7329899, -2165737, 3151969, -7206419, -4446902, -5091684, 2298344, 1402844, 5752572, -222265, -3457986, 642635, -3079492, -3417720, -3771518, -1289564, -5278515, -2667175, 5060545, --4598300, -255014, -3588982, -5605469, -2488934, 785442, 1860795, 3679176, -2820183, -2547989, -3601867, 696858, 1378685, 1020592, 2242510, 3418257, -5400922, -1745904, -518617, -7545721, -2051921, -462783, 4493073, -4393752, -3382824, -4102231, 747861, 4799626, 3684545, 8410620, -5620502, -5080410, 2117419, -2262911, 3968013, 2542084, -5550709, 4088809, 1101122, -6111202, -816044, -1054951, 548145, -1088774, -4207458, 845035, -3015604, -3115462, 1182190, -1682017, -745714, 2338073, -1508607, -1955284, -2097018, -3078955, -578747, 2499134, -637803, 2596845, -25770, 1777043, 1163399, 958315, -1126355, -373125, 433255, -1028645, -1228361, 358630, --1188095, -387084, 317828, -2144263, 1236951, -1064078, -392990, 324807, -88047, 246424, -704375, -916976, 622770, 1555852, -28246926, 7887171, -8353175, -6940131, -4966056, 1060857, --1374390, 16805670, 1744831, 4102768, -1762010, 171799, -6761353, 6921340, 2087891, -883690, -1466195, 9004399, -4358318, -1429150, 2149631, 726386, 4561256, -3776887, -1653026, 5018133, -1896765, 4631586, 634581, -4687420, -3049427, 2816425, -375273, -1518808, -2905009, -1619203, --106837, 8541616, 2218888, -1414118, 266288, 734439, -2469606, 6185290, 4737349, -1336272, --6293738, 1708860, -3292093, 5891085, 4575214, -4392678, 1843078, -5720360, -5113159, -4459787, --5652177, -1872606, 1348620, -3340411, 367220, -3700651, -3147137, 6765111, 4314295, -5531918, --7536057, 963683, 6566468, -4899484, -3636227, 5588826, 4391067, 6359773, -3954591, -69793, -1843615, 2685428, 7101729, 2005750, -844498, -163746, -5045513, -663036, -18790, -4287451, -394600, -1187559, -1932735, 193274, -521302, 2274722, -448287, -737661, 1100585, -550293, --1759863, -1095754, 454730, 1859184, -768262, -545998, 122407, -324270, 3360812, 703301, -4336843, -2910377, 839129, 330176, -1712618, 67109, -81068, -2176475, 645856, -327491, --2464774, -2238752, -1163399, -2135136, -1652489, 705448, -1057099, -14930917, -1480690, 2512556, -7260106, -1416266, -3805341, 1700270, 10669236, -13439490, 3114925, -2729452, -2495376, -6051609, -3635153, -10771241, -7010461, 3699578, -5630702, 3402688, 15341623, -2718178, 6200859, -7218230, -7408819, -1928977, 2209761, -6475200, 3021510, 1833414, -3468186, 1520955, -699543, -3333432, --221728, 4209068, 6605123, -5177046, -8248485, -6541772, -6054830, 779000, 4844186, 12824235, --146029, 8633958, 9025337, -8402030, 6456947, -12355010, -4513474, 774705, -5491116, -5126581, -3426847, -11966316, -2361158, 8311836, -3587372, -3138011, 1101122, -3663070, 3403762, -3635153, -5837935, 7526930, -2085744, 2331094, 316217, -7646116, 659814, -4953708, -3402688, -6045167, -3433826, 2609193, -5789616, 453656, 4320737, 3995930, 5117991, 5253282, -802085, -5031554, -4159139, 2153926, 2493229, 1336272, 3009698, -363462, -92879, 416612, 1241782, 1431298, --2046552, -657667, -1649804, -1128503, 2418604, 2042794, 2334852, -4256850, 871878, -559956, --1735167, -2075543, 2188286, -1381906, -2302103, 549756, 555125, -798864, 5150740, 1667521, --1001264, -1178969, -2381023, -703838, 2110440, 3157338, 812823, -38655, 3230889, 35344896, --1748052, -14031121, -1790465, -651761, 1304060, 4420058, 1782411, -1658931, -1488206, -7084012, --3372623, 3913252, 8611409, -7121056, -4489852, 5735929, 437013, -2113124, 2281165, -599685, --8231842, -8386461, 11337103, -1093606, -751619, -1932735, 5811091, -485868, 590021, 3684008, --6251862, 6573985, 2724083, 1045288, 2499671, 6571837, -15902116, -7139310, -3884261, 14603963, -1868848, 1066226, -4526359, -4994510, 4361540, -688269, 5060545, -1836099, -10166724, 1060857, -1223529, -1564442, 4915590, 2187749, 1308891, 8086350, 19760070, -1591285, -1686312, 7505456, -2274185, -2361695, 5159867, 15363635, -1741609, 2920041, 5558762, 4454418, 3990562, 4065724, -4560182, 3500935, -4080756, 6117107, 10963978, -2561411, 4196183, 37044, -1395328, -7619272, -4724464, 1770600, -631360, 2277943, 2621541, 606127, 292595, -2582349, -2957085, -1182190, --5878200, -2628520, -3987340, 5076115, 2486249, 1916629, -838592, -788663, 288837, -3393561, --3758, 1219234, -4669703, 4064650, -2041183, 706522, -1435593, 202937, 1537061, 1837709, --3640522, -3611531, -3001645, 385473, -629213, -1015760, -286152, 2499671, -674847, 244276, --1501091, -3212099, -1750199, -105764, 7136625, 7946763, -10135049, -2946885, -8603356, 8507793, -15950972, -7649874, -1795833, -8776229, -3812320, -10618233, 7560753, -6487548, -2633889, -700080, -75699, -4236449, -5195300, 9507984, -8641474, -3210488, 991601, 6481106, 6943352, -9982041, --2923799, 3812320, -8563628, 4848481, -6791417, -2790655, 2513093, 179315, -3710852, -1056562, -2058363, 11110007, 1387274, 2491081, 14496, -9542344, 10412611, -5126581, -7785702, 6215892, --5545340, -6316287, 8213051, -3735011, 1065689, -1840930, 1118839, 10746008, -1825361, 2385854, --9402220, -770410, 10988137, 2421825, 10887742, 9271224, -3040837, -2414845, -12617540, 1907502, --2101313, 8345659, 10293426, -5939403, 2582886, -18605798, -5052492, 6114423, -6389301, 9584220, -674310, 2039036, -3379603, -760746, -4424890, 746251, -3040300, 6751689, 6713034, -347892, -2308008, -148176, 3809099, 1584306, 2769180, 5694590, -1694902, -6508486, 3000572, 1421097, -4130148, -1117228, 4380330, -939524, -1471563, 1042066, -2575370, -1790465, 483184, -4596152, -1308354, -1636383, 4066797, 1683090, -255014, -914828, -2613488, -4086125, -279173, 485868, -1679332, -1540283, 946503, -3850438, -5369, 163746, -1953673, 2475512, 303869, -6442, -1129040, -1306744, 248034, -44560, 6364605, -8176007, 2750927, -7647726, -865973, -10317585, -16855062, -5007932, 1114007, -5368709, -15441481, 8846559, 3076270, -11533061, 7084549, -5214627, --3847754, 3987340, 15953656, -8014409, 15410880, -338229, -10888816, 422517, 3575560, -9584756, -10510859, -5564130, 7774428, 16938278, 1627793, -7959648, -2250563, -935766, 3859028, -6773701, --3713536, -940598, 8333847, -3016141, -3390340, -11138998, -407485, -13163538, -2451353, 14855755, --3368865, 8448201, 775778, 2234457, -19534586, 242666, -12509092, 10030896, 17453136, 5369783, -4366908, 1063541, 2595234, -10215580, 3569655, 5426691, -4563940, -1290101, -4047470, -2582349, -7858180, 162672, 9536438, 29268592, 10677826, 2908230, -10075993, -9362492, -6076305, 5741835, --9976135, -877784, -923418, 2026688, 5619965, -5475010, -1044751, 5434744, 5965710, 1221381, -1007170, 4057134, 5136781, 4290136, -60130, -961536, -977105, 446140, -2137283, -2662880, -2323577, -1349694, 3617973, -4444755, -1412507, 3063386, 2602213, -269509, 2351495, -2290291, -1069984, 1610613, 2184528, -2513093, -2470680, 3470334, 2480344, 1946694, -898722, -1753420, -841814, -4946729, -1297617, 790274, -2632815, 1200980, -1825898, -1287953, 563714, 399432, --412317, -981937, -3278671, 30987116, -16178068, -63888, -7841537, -15140297, -20332912, 6126234, --6255620, 6463389, -19224810, 4228932, 7377680, 6669011, -7854422, -17626546, -13795435, -11531450, -527744, -6556268, -12763569, -8677981, -4226248, -10367514, -7116224, 2136746, 13914620, -20401, -2291902, -156766, -11567958, 7662759, -731218, 2469069, -2309619, -7576859, 7063074, -9528922, --13405130, 12619688, -13069585, 2945811, 221728, -18513456, -10889353, 7634305, 4832, 9320616, --5667210, -19690814, 258772, 963683, 7789460, 8224863, 18997178, -10550050, -38102804, -13186623, --12773770, 8858907, -24707874, -8221105, -3839701, -22707492, -7313793, -147640, -4033511, -4065724, -5350456, -5952288, -206695, -5570573, 5735929, -13262859, 5208722, 11083700, -13323525, -6637335, -7073811, 5525476, 4886062, -13758928, 3670050, 399432, -1632088, 7654706, -1522029, 6335614, -5740224, -978716, 2025077, 1407676, -1340030, -4425964, 7993471, -2276333, -5026723, 398358, -136902, 4323422, 1802276, 244813, 1627793, -3802657, -3770981, 695785, 1800128, 2684892, -4735202, -278636, 2358474, -200790, 2127620, -4464082, -1682554, -3024194, -2639794, -257698, --279710, 1966021, -4967130, -2179696, -3624416, -2587718, -5216775, -6614250, -5729487, -409633, --182536, 992674, -3376918, -4562866, -17725330, 7021198, 8766028, -2913062, -3416110, -8823473, --9756555, 22551800, 8203925, -21007222, 7272990, -11430519, -1100585, -10378788, -21616034, 6382322, --11272679, -4671851, 878858, 678068, -5518496, -18226230, -11352135, 9020505, -11228118, -250719, --9938017, -15146739, -5950677, 16956530, 2676302, 3079492, -14760192, -4860829, -3052648, -1838246, -5945846, 7489349, 9500468, 11902965, -5811628, 6752763, 2280628, -6723235, 4139275, -11361799, --10042707, -8526584, 3668976, -9862319, 423054, -14882599, -13217762, -6655589, 15489800, 12276627, -11752641, 13172665, -12070469, 16476568, 474594, 7670275, 22391812, -4468377, -4206921, 3811784, --10888279, 4617627, -5155035, -13805099, 1747515, 11579232, -13571023, -9450539, -1730335, 12438225, --10334765, 1348083, 3699578, 7554311, 1767379, -2871186, -7078643, 2061584, 5140539, -2687576, -578210, -3428995, 1068910, -3248069, 1284732, 414464, 1838246, -1113470, 1239098, 2674691, -6236830, -616328, -239981, 710280, 2846490, -4512400, -2066416, -4985920, -1560684, -969052, --6047851, 1313723, 5261872, -289910, -7188702, -1007170, -766115, -5951751, -7047505, -9907416, --4320200, 4067871, 495532, 2936684, -1669132, -1616518, -3772592, -329102, -9029095, -1414118, -5171141, 8666707, -588947, 2752000, -5199595, 851477, -3163780, 4544613, 1742683, -8490613, --19796042, 22637162, -17690970, 23441394, 13120588, 8924942, 5017596, 9206799, 10005126, 9244917, -25197500, -8828842, 1775969, -1692217, -4349192, -774168, 3123515, -2350421, 4847408, -1644973, -7881265, 6601365, -1419487, -4376035, -25116432, -8959839, -18218178, -853625, 9605157, 9677098, -3082713, 4923643, 7241852, 5969468, 7019587, 17974438, 26831198, 17985712, 3631395, -3428458, --5182415, -7719667, 9388799, 9543954, 10721849, -7990787, -6281927, -9907416, -1632625, 13056164, -128312, 15648713, -9498857, 8373039, 5057861, 14041322, -29389924, -21069498, -8617852, -11834246, --12081743, 3606699, -4930086, 18479634, 5494874, -20646982, -1697049, 33356326, -11248519, 10388452, --5039608, 13696114, -6385543, -4194036, 497142, -5689221, -7441568, -557809, 5616744, 8235600, -5763846, -2190433, 6499896, -1750736, 3011846, -8527121, -5779416, 5425618, 3474629, -8574365, --3716221, -3654480, -1135482, 2100239, -2238752, -4218195, 1944010, 353261, 1414118, -700617, --2402497, 3767760, 1254667, -2181844, 5040144, -733366, 1494649, -967978, 5943161, -5066988, -5295695, 2283849, -4940286, 3244311, 195958, 841814, -5150203, -15129022, 5679021, 94489, -1114007, -1767379, 5774047, -1433445, -2670396, 1802276, 4516695, 3689377, -2206003, 4583267, --14397804, -7163469, 12100533, 5334887, 8950175, 23195508, 2066953, 15526844, 22664542, 15760919, --10125385, -22877680, -682363, -10460930, 24850144, 7205345, 19435264, -2689187, -10276246, -3748433, --11221139, 4535486, -8612483, 1117765, -9603010, 5112622, -6990596, -2918967, -15476915, -15371688, --1435593, -22049288, 12202539, 8396661, -6518687, 11373610, -5291400, 4452808, 12699681, -13929653, --18221936, 3302293, -3903589, 30798674, 13167296, -33716568, -9012989, -9547175, -17313550, -18403398, --37602440, 6674379, -13408351, -3513820, 5508296, 1392106, 7866770, -1479079, -4357245, -28563144, -3504693, -12981002, 3618510, 16764868, 3636227, 11242077, -16916266, -22598508, 4679904, 14013941, -9547712, 5262409, 9078487, 14565308, 18341120, 18737332, -16543140, -10035728, -11883101, -8592619, --13890461, 19761144, 11712376, 11135776, 3175055, 8511551, 7429757, -711354, 10463614, -15946140, --5472325, -1920924, 1443109, -3469260, -11157788, 621160, -2145336, 1444183, 3812320, 11521250, -789200, 5373541, 5567352, 832687, 5904507, 155156, -3324305, 667331, -8503498, -3562675, -4794794, 6617471, 2220498, 1173063, -10422812, -1077500, 554588, -5151277, -3346317, 1515587, -3590593, -9793062, -10572599, -4975183, 3853660, 3058017, 5704791, 1243930, -3221762, 2338073, --10923176, -9995463, 40831180, 26975616, 37464464, 2448668, -7403987, -25419764, -7485591, 4275640, -5922760, -6045167, -19641960, -7086696, 32370094, 13397077, -4457639, 9928354, -713501, -11866995, --3455838, -7736847, 22074522, -1675574, 1309965, 9540733, 641024, 10824391, -97711, 15314243, --14059039, 17642652, 3582540, -8186208, -4952098, -9069897, 15922518, -22022444, -23791434, 15075872, -24908126, 1189706, 17197586, 23656680, -26601416, 8879845, 5449240, -1439351, -231928, 3973919, --9979357, 18579492, -11252277, -8928700, 7505992, 967978, -2003602, -4293357, -5539971, 2699924, --17570712, -5241471, 14164265, -17317846, -3988414, -11689827, 445603, 35116728, -11018739, 2280091, -9395241, 197569, -8075076, -21896280, 21422224, 10016401, -44146896, 10966125, 11115912, 8240969, --9896678, -4586488, 22557168, 1037772, 1665374, 5808407, -15684147, 625992, 9985262, -4052302, -5771363, -1228898, -5095979, -13053479, 1996086, -1694365, 12125230, -1104344, -513785, -8684961, -9606231, -3206730, -3337190, -13778255, -6937446, 4878009, -8886287, 760209, -4379793, 5546951, --5203353, -11078868, 5609764, -11936251, -3280281, -5411122, 558346, 754304, -4491999, 11949136, --1476932, 16103443, 9805410, -1590212, 1686312, 10313827, -7134478, 1870458, 1219234, 9900973, --8942122, -5270462, 454193, -18234284, -43700756, 38878044, 23174570, 12326556, 8668318, 19206556, --44100188, 18107582, 20364588, 8722542, -28232430, 15710453, 28540594, 13230110, 31470836, 11481521, -537945, -1247151, -987306, -5358509, 13334800, 22362284, 21296058, 7446937, -6544457, -11105175, -2654827, -10110353, -11840688, 12458090, 8564165, 2374043, -11866995, -11543261, -2538326, -10035191, -5118528, 25701084, -4570919, -8307004, 8672076, 4659503, 7612293, 8977019, -1968169, -5184563, -20645908, 13663365, 6748468, 9113921, -1666447, -20517596, 4757750, 13662828, 1768453, -15270756, -20434380, 5331128, 28425704, 1057099, 25553444, 2734284, -8378408, -2719251, 6127845, 36381056, --4597763, 13078175, 8963060, 17190606, 9003325, 81068, -1105954, 11215770, 51760800, 2423435, -20765630, -17547088, -13107703, 6577743, 8137890, 10091563, 4148402, 1658394, -25440702, -10061498, --26676042, 1458141, -4582730, -8808441, -7460895, -2962991, -11255499, 1416802, -1169305, -11829951, -8459475, -13778255, -6696391, -12439836, -8509941, -814970, 1367410, -9949829, -11552925, 2781528, -7340636, 8579197, -1747515, -3278671, -14862734, -19422916, 1940252, 2381559, -8857296, 17685064, -17107392, 25323128, 8878771, -5564667, 3457986, 7827578, 9582072, 11511586, 1696512, -11989938, -3025268, 15389405, 7876970, 803159, 6154152, -28472948, 31227096, -463856, 27638652, 695248, -1881196, -25073482, -7707856, -11271605, 19173808, 4896263, 8500277, 5087926, -19262928, 1930588, -1547262, -16893180, -24217710, -24720222, 8383240, -9171366, 22544284, 1327682, -7152731, -5819681, -4860293, -8694624, 1451699, 6645388, -9490267, 5365488, 7592429, 2630668, 2163053, 17093970, -28659244, -5572720, -242666, 14450954, 11777337, 17301738, -12822088, -4968204, 5173825, -17104170, -1645509, 1546188, -22816476, 29427506, -1477469, 14884209, 12753905, 9040369, -17379048, 1711545, -14761803, -11978664, 26307748, 7319161, -9698573, 21882322, 16371878, 11553999, -36772436, -7386807, -7231651, -12438225, 1893544, -20371030, -5212480, -30919470, -8969502, -4636417, -8667781, -34267396, --3556770, -9270687, 51552492, -7318088, 10405632, -5181878, 8144869, -4206921, -8559333, 5718749, --7202660, -950798, -3940096, 14025216, 4845260, 6253473, -22457310, -19800336, -15059229, -6045704, -3796751, -27885076, -4674535, -2085744, 1939178, 10446971, 7606924, -656056, 10713259, -9630927, -48855, 787053, -16335371, -22109954, 4217658, -6318971, -20890720, -5463199, -9945534, 1633698, --22334366, -2297271, -9870909, 13301514, 2684, -9205189, -3663070, 4319664, 4941360, -1860795, -9756018, -9842454, -6520297, 13214541, 12097312, 21910238, -7486128, -1610076, -3106872, 5869610, -15591268, 13636521, 10031433, -8127689, 6086506, 17149804, 16530255, 7013682, -21041582, -24319716, -10110890, -3746285, 7178501, -4850092, 19757924, -15559593, -3604551, -5663988, 17169668, -13717052, -30464204, 37598680, 38320772, 1945620, -7682086, 5858873, -5528160, 9055939, -2142115, -651761, --11860015, -31580894, -10865730, -30261266, 16608102, 15666430, -18877456, -14186277, -18925774, -9038222, --3161633, 40247600, -24696, -21168284, -22797686, -1762547, 27930172, 13174275, -57512832, -12042551, --10590852, 7088307, 20910586, -25163676, -8359080, -15147813, 5956583, -34185256, 16281147, -6035503, --1286343, 8977555, 868657, -16940962, 32821066, -3735548, 15339476, 35310536, 72653664, 43499428, --1599339, 24269250, 36791764, 47617764, 51496120, 14506252, 31336618, 8739722, -123480, 19191524, --15934329, 31728534, 13222594, -14324253, -48399988, -35185444, 3999152, -13972065, -10360535, -9190693, --5850819, -6228240, -20263118, -13251048, 184147, -3389266, -1632625, -6540162, -2301029, -10602127, -12202002, -21602074, -9263708, 5848135, 3362960, 1606855, -6054294, -6962142, -4320200, 3988414, --3955665, 10673531, -13452911, -16465294, -16769700, -10277857, 11770358, 13553843, -5756867, -2692945, -4467303, -2918967, 22377854, 4707284, 1442572, 18121540, 10945187, 10257456, 25479894, 16876000, -19022410, 5864778, 8859444, 21271900, 7709467, 16466905, -15955804, 8644695, -7516730, -16585553, -18587008, -23964306, 39470212, -4922570, -7555921, 506806, 31369368, -21355652, -4009352, -1140314, -146029, 11268384, -8477729, 16349867, 5455682, -3319473, 3546032, 1701344, 12703976, -40009232, --12865575, -1409286, 3897146, -4125316, -29337310, 23627688, -1649804, 3076807, 8286066, -19106698, --8973260, -44097504, 11285563, -10462540, 8058433, 31906776, -9168145, 6561637, -4510790, 15132244, --26613764, -35249332, 30348776, -3043521, 2244121, 5053566, 30515206, 22383222, 26424250, -610959, --36342404, 21170430, 9583146, -8630200, -13141526, 20238422, -4168803, 25630218, 42174432, 33003066, -5191005, 2764348, 30982820, -6324340, 9190693, 25756918, -18090402, 29804926, 17832168, 10561325, --21634288, -10546292, -28712930, -914291, 9183714, 41925860, 17190606, -39087960, -4115653, 25159382, --4223027, 12219182, 16372415, -27721866, -7379828, 13463649, 2708514, 7513509, -12641699, 8947491, -14660871, 1956358, -354335, 22276384, 3668439, -4813048, -6382859, 7399692, -2573222, 11986180, -1274532, 9081708, 9684078, -1540283, -11327439, 21976274, -3799972, -6694244, -2071785, -14852534, --15652471, -9783936, -11057930, 7196755, 12304008, -12986907, -11892228, 2687039, 18811420, -28098750, --7566122, 10990821, -4082903, 184147, -4590247, -2922725, -21026012, -146566, -6175089, 5763846, -776315, 3535832, -564788, 1934346, -5052492, 8796093, 4145180, -2320893, -4952098, 3730716, -435939, -1570884, -55158656, 12639552, -9129490, -2161979, 43073692, 18519362, -13506062, -10454487, --163746, -27857694, -34135328, 2892124, 295279, -19200652, 20379620, 2477659, -19704236, 12459700, -37047316, -4955856, -21351894, 13415330, -12576738, -13691282, 6908455, 30103426, -9805410, 4417911, -8243116, -9269613, -22413286, -14687714, 29705604, 10468446, -29310468, 25075630, 9816685, -20065014, --10509785, 41286984, -13441100, -31661426, -16293495, 54871964, -54175644, -25087440, 32115618, -14530411, --17437568, -51592220, 40235792, -33029910, 11806865, 1729798, -6222871, -58262840, -17252346, 49894636, -31425738, -39412768, -10826539, -17059610, -8109435, 8099235, 10801843, 13001940, -68880536, 37674916, -28840168, 30320858, 434865, 15881178, -33725156, -29931090, 58885612, 24196236, 6488085, 23746874, --31758598, 6405944, -14076218, 15180025, -8610873, 41369124, -16902844, -14350559, 5687611, 5016522, --15691126, 9443022, 4494147, 3548180, -3003256, 2123325, 3271691, 3395709, -3931506, -2207613, -8600135, 529355, -4655745, 18124226, 5267241, -16052977, 1704028, 15552077, 3975529, -15266998, -20450486, 36885716, -18192944, -21095806, -5812702, -4731980, 12418898, 27033598, 8091719, -24953760, --8416525, -3600793, 3626026, 7633231, -4306779, 11079405, -8083666, -921271, 6349573, -10664404, --45574972, 7809325, 56734372, 17680232, 6018860, 1475858, 4187593, 24285356, 33273648, -7709467, -6147709, 8546985, -5828808, 20039780, -10695005, -2929705, -8116415, 15377057, 11388643, -6395743, -10462540, -15236933, -12443594, 15355045, -10019085, 16881906, -11404749, -5104032, -428960, 9191230, --678605, 6818261, 2694555, 17195438, -12462921, -2554432, 201863, -6956237, 16579648, 14390288, --12060268, -4325032, -7452305, 3753802, -15530065, 8240969, 4653060, 7558606, -6270116, -4758287, -18884434, -22901302, -4054986, 9550397, -6300180, -4229469, 9825811, -28125594, 6662568, -10230075, -1568200, -10018548, 24144696, -7973070, -10586021, 9882183, -5618354, -15974594, 30736934, -928250, -3051038, -6969122, -11987791, -14073534, 15454366, -17556752, -8536784, 17718350, -24391120, -10650982, -3027415, -2349884, 2876554, -453119, 3362423, 10743861, -3988951, 4169340, -5053566, 11279658, -6118181, -549756, 864362, 6847252, -6170258, 4959614, 723702, 5462662, -2592550, 8527121, --4470524, 2248952, -7567196, -6513855, -10302553, 1846836, 511638, 3360275, -5090610, 11368778, --3856881, -2018098, 9716290, 8587787, 4551055, -4069482, -6655589, 5847598, 7738994, 4851166, -3301756, -151934, 6992744, 7616588, 3318399, 6464463, 789737, -5091684, -300648, 14928233, --42287176, -119658328, -98298920, 52078088, 14983530, 119087096, 212701280, 31659278, 67102960, 24467354, --169536848, -53552336, -114994528, -138956688, 3964792, 22286048, -57943404, 84127672, 110051560, 61826056, -175484848, 101261904, -22524956, -41554344, -81365472, -158361888, -125089848, -36792300, -111544056, -15458124, -96311960, 16170552, 22443888, 145644496, 74282000, 46027552, 151780384, 23479512, -41867880, 59427852, --79454208, -157319824, -65857416, -132712344, -166206112, -2324651, -34698504, -43645996, 110716200, 122110216, -77644952, 184184848, 148529632, 70176544, 63369020, 36800892, -123001424, -113037096, -143292992, -189079488, --151702544, -63895156, -43982076, 3999152, 108756088, 132379480, 138436464, 132839584, 122972432, 26353920, -2264522, -20769388, -93776856, -102605160, -59391880, -107593224, -45352172, 9517648, -23533200, 54172960, -97235376, 29862370, 41058276, 18399104, -26593364, -16446504, -40691056, -52773336, -6400575, 14998563, -367757, 43750684, 40218072, 4694936, 38710004, 134218, -49121004, 43423192, 12976707, -43511240, -30601642, -32198296, -65643744, 30071750, -46743740, -115453552, 1731946, -50758996, -33752000, 114666496, -51730196, 54581520, 163784816, 108777024, 60182692, 71656160, -17970144, -103492072, -131838856, -178711440, --197983504, -125429152, -80383000, -13737990, 75077640, 167717392, 184826944, 171645680, 178404352, 95595768, -4105989, -45518600, -117962352, -150462368, -97784592, -108713672, -87010672, -17450988, 2742874, 11485279, -42071888, 36158792, 31053150, 56232396, 55504936, 47275240, 55187644, 38605312, 12290049, -4423280, --24950538, -54898808, -61031484, -51034948, -54644332, -40052716, -21967684, -3133179, 16164109, 40825812, -44159780, 40898288, 37124088, 26186416, 9602473, 817654, -3697967, -15650324, -16220481, -9794136, --12292733, -14273250, -10107132, -15697569, -14224932, 247497, 1376000, 110595, 5337571, 2545842, -2959233, 12268574, 12438762, 13592498, 15623480, 8404177, 2361158, 529355, -4701916, -9816685, --12713640, -14305999, -14755897, -10423349, -4828617, -312996, 3998615, 8468602, 8866960, 9455371, -9275519, 5036386, 177704, -948651, -3879429, -4543539, -3332895, -1042603, 864362, 2592013, -2745558, 2111513, 460098, -2187212, -4085588, -4489852, -4865124, -4706211, -3590056, -1403381, -1792612, 3970697, 4594542, 5500780, 5881421, 4587562, 3154117, 1469416, -689879, -2100239, --2970507, -3582540, -3296388, -2416993, -1619740, -624918, 387084, 992674, 1302449, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --10530723, --12826383, 6532109, -2314451, 5718212, -2777770, -2840584, -5715528, 1399623, 1261647, -214748, -134218, -602369, -4362613, -468688, -2477659, -2852932, -2704219, -62277, 370978, -176631, --455803, 2226941, -566936, -6618545, 4184372, 2103460, -2230699, 708670, -25770, 114354, -974421, 4326106, -2348273, 296353, -7511898, 3805878, 780610, 1742146, 2647311, 4283156, --2333778, -1759863, -820876, -3753802, 340913, -528281, 3317862, -1721745, -188979, -1794223, --2069637, 4039954, -2976949, -1413044, 410169, -2690260, 2317672, -57982, -1249836, 2515777, -4568235, 328565, -142271, -592169, 3909494, -3808026, 67109, -557272, 2061047, -903554, --1733019, 4261682, -42950, 935229, -1139777, 920734, 2298344, -1771674, -2511482, 175020, -2244657, 3764539, -1644436, -1087701, 944893, 248034, 597537, -1658931, -521302, 1064615, --201327, 762357, -1320703, -372052, -804770, -1115618, -815507, -734439, 617938, 153008, --563714, 642098, 433792, -484794, -140660, -82678, -706522, -1264331, -345208, 49929, -294742, 761820, -75162, 510564, 289373, -569083, 545998, -15329275, 2623151, 1826972, -5393405, -2094870, 1645509, 6265821, -2405719, 1721745, -3777424, -5555540, 2054068, -3778498, --4308389, -4329327, 1324461, 1665911, -7386270, 4362613, 2903935, -1250372, -2692408, 1741072, --654446, -1677722, 555661, 2462627, 1835562, 3927748, 777389, -1186485, 4056597, -2023467, -8824010, 1988570, 5445482, 2096481, 4780836, 2124398, 3302830, 1780264, 416075, 187368, -6685654, 1134408, -1043677, 445066, 3543348, 2608656, 409633, -294742, -1342177, 745177, -8153996, 2333241, 3784403, -3924526, -1991791, -4139275, -2588792, -4018479, 3049427, 1908039, --2538326, -1829119, 1840930, -1915019, 2051384, -901406, -577136, -2780455, -4655745, 2018098, --7581691, -1076426, -1592896, -1927904, 447213, -1778653, 390842, 2866891, 1423245, -1955284, -389768, -1551557, -3280818, -539018, 1626719, -165356, -2523830, 928787, 506806, 969589, -1791538, 65498, 284542, -1207960, -690416, -180926, 19327, 627602, -1345399, -1188632, -129386, 8551280, 11814381, -3731253, 3114388, -5996848, -398358, 267899, 15119359, -1640141, --4101157, -6637872, 69793, 4277788, 6910066, -1661616, -9260486, -2725157, -3582003, -2591476, -3037079, -758062, 5757404, 566399, -3384971, -7508140, 2145336, -780610, 1643362, -980326, -756988, 3553012, 1253057, -9424769, 1043140, 5923834, 2874407, 653909, 1357210, -1585917, -4082367, -5607617, -620086, 4470524, -3223910, -84826, 7320235, -3504693, -431107, -2594160, -4472135, -4874788, -3635690, 2130304, -5048197, -2534568, 6380711, 3713536, -5857262, -2216203, --949725, -1519882, -2714956, 1988570, -2342368, 2293513, -153545, 267899, 959388, 4791573, --637803, 6638409, 3393024, -5250598, -2462627, -2607045, 3956202, 1117228, -355409, -2161442, -5325760, 1997160, -184147, -203474, -1435593, -1328219, 1522029, 536334, 1697049, 4133369, -1449552, -314606, 192737, 253940, 1285269, -367220, 437550, 1930588, 354872, 2410014, --537, 797253, 1194001, 1443646, 465467, 882616, 1026497, 827318, 1351304, -526134, -358093, 897111, 1385127, -213138, -1202054, -1402307, 239444, 28406376, -10473815, 5777805, --7996156, -813896, 296890, -563714, -4233227, 2346126, 3279745, 816044, -3076807, -6554657, --235149, 4042101, 2865817, -2867965, -4942434, -374199, 4443144, 8123931, -4361540, -561567, --3291556, -7062000, 799401, -3539053, 2157147, -2612414, 5519033, -9651328, 6539625, -400506, --5759551, 1432909, 2428804, -652835, -3049964, 219043, 7572564, -255014, 1247151, -1039382, -2898029, 1367410, -1788854, -2811593, -6226629, 4068945, -1305670, -1799054, 2390686, 75699, --10467372, 8074539, -11266773, -6465537, -7981660, 1753957, -941672, 4816269, -2619393, 2578591, --4809827, 2345589, -1264868, -1927367, -5306969, 3281355, 3719442, 6413460, -1561221, -572841, -1716913, -1899986, -1156420, 1265942, 3673808, -4840428, 2399276, 3543885, 3881040, -6142877, --5067525, 2158758, -3174518, 1653026, -69793, -329639, 526134, 819265, -281320, 1501628, --1819992, 918586, -579284, 3658239, 194347, 929324, 792421, 275415, -1446330, -78920, -330712, -390305, -22395034, 2284923, 238371, -1900523, -3453154, 3920232, -3036542, 2609193, --802622, -37044, 3622805, 4715874, -2896956, 3474092, -1009854, -1912334, -6279779, -305480, --8485782, -6229850, 7475928, 2669322, -2889439, -1054415, -871878, 5189394, 2741800, -2663417, -4733591, 3149822, 1860258, 1640141, 2019172, 3605625, 3106872, 3063922, 8362302, 7523709, -3256659, 838592, -5182952, 5786395, -7704635, 1531156, -2138357, 6267968, -4708358, -6133750, -10566693, -2451353, -5641440, -5035849, 7868917, 4830228, 303332, 4046396, 5717139, 2623688, -9236864, -542240, -1439351, 5240397, 3215857, 315143, 224412, -4789963, 2894808, 3000035, -7461969, 3037616, 4653597, -2852932, -3806415, -8118562, -1848447, -4387846, -3476239, -3693672, -4124779, -137976, 336081, -2372433, -2733210, -756988, -2401961, 759136, -1611687, -2685965, -1125281, -257161, 121333, -2513093, -346819, 112743, -3153580, -426812, -734976, 220654, --1404991, -1640141, -1000727, -602369, 78920, -520228, 525060, -732829, 909996, 223875, -807454, 1752884, -376883, 1851131, 401043, 1220308, -819265, 388695, -1565516, -579284, --242666, -1902134, -566936, -927713, -29732984, 8126615, -6255620, -9305584, -9199820, 5897527, --6798397, 5223217, -8570070, 4900021, 4202089, 2627983, -9028021, 6380711, 5369, 3908420, --7459822, 4335770, 9079561, 6966974, 364535, -3095061, 1377074, -1821066, -9546639, -1842541, --4527433, 2326262, -5961415, 5334887, 5236102, -1908039, -108448, 7297150, -1458678, 4987531, --3804804, -6146635, 3379066, 5369, 3492345, 8949638, 5493800, -215822, -15288473, -7271917, --2022930, 2252174, -2253784, 8597988, -13267154, 4350265, 1932735, -21475, 4312147, -1620276, -6616397, -13916768, -6432788, 5549635, -13984950, -2500745, 6696391, 2470143, -2999498, -9292162, -3608310, 6182606, 4569309, -1566589, -9752797, -738198, 190052, -1007170, -411780, -4719632, -2305324, -7617662, 4868883, 781147, -4471061, 1018981, -5401458, 530965, -6483253, -1735704, -2428267, 2544231, 330176, -523986, -2159295, -1604707, 576063, -3767223, 3237332, 350040, --1761474, 122407, -3232500, -2530273, 861141, -1267552, 1929514, -1653562, -869194, -1046361, --1154809, -2156074, -267899, -1155346, -388695, 741419, -413927, -913217, 946503, -303869, --760209, -787590, -1893007, -1300301, 381715, 1167694, -190589, -14039711, 1512365, 2335389, -10994043, -10390600, 12006044, 3397319, -968515, -2828236, -1294396, 1105417, -8778376, -1690607, -2815351, -2894808, -5150740, -1403381, 8307541, -8591008, -1863479, 8581882, 42413, -3420942, -3035468, -4194573, 6329708, 2765422, -75699, 3147674, -3665755, -5796059, -407485, 424665, -4738423, -10152766, -5458904, -4491462, -3124589, -3022046, -3064996, 1501091, 504122, 823023, --7555921, -7787850, -6159520, 203474, -9708237, -5388037, 5826660, -3957276, 1293322, 597537, --175557, 2405719, 3459596, 3265249, 3915400, 5709086, -1006096, 6177774, -389768, 3111704, --511101, -4007741, -228707, -6448894, 3976603, -7544110, 7026567, -8415988, -120796, -8680666, -828392, -8723079, -8355322, 3928821, 11522324, 3445638, -7418483, 5266704, 7516, -3313567, --1952063, -3471407, 4588099, 3914863, 5640903, 981400, 4400194, -3743601, -390305, 4269198, -515396, 1294396, 857920, -2128693, 2588792, -270046, 970126, 3777424, 1127966, -987843, --2269890, -1086627, 1583232, 1518808, 1253594, 401579, -1766842, 97174, -368830, -4037269, -3890704, 406948, 1428614, 140123, -940598, -1934883, 1374390, -1972464, -914828, 38830264, -267899, -11457362, 1574642, -6314139, 15363098, -2752000, 4181688, 932545, 557809, -13882408, --7204271, 7375533, 6470368, -10984916, -2086817, -537945, 9397388, 4504347, 3457449, 9190693, -1287953, 403190, 7971996, -3069291, -12621298, 1622961, 9316321, 5410585, -3788698, -28454, -6440304, 3823058, 1624571, -574452, -7162395, 3172907, -7773354, 532576, -14469208, 3521336, -4212826, -1380832, -6758131, 8842264, 4583804, -2106145, 6868190, 3024194, -6129455, 10657961, -991064, -4089346, 2345589, 10932302, 1556926, -519691, -9494562, -5665599, 1126355, 3550864, -12543989, -4429722, -5221070, 867583, 6767258, -4723391, -5692979, -734439, 9071508, 6381785, --2480344, -7339562, -546535, 7836168, -3388729, 16532940, 3482682, 2263985, -8758512, 7043747, -270046, -2100239, -4533338, 183610, -2606508, 201863, 10206990, 4482335, 3613141, 1731946, -1035624, -78383, -837519, 709207, 1925219, 3490198, 418222, 419833, 1216550, -3097208, --97174, 974421, -797790, 2999498, -2466922, -325881, -1287953, 1020055, 5355288, 1621350, --1876364, -676457, 1159641, 200790, 1687385, -624918, -2528125, 1927367, 1819456, -2133525, --653909, 4585952, 1511829, 2222109, 8858370, 4729833, -13822279, -1390496, -6962679, 13990856, --5179731, 6542309, 1298691, 8773008, 3500935, 1331977, -660351, 3583077, -3929895, -5891622, --16353625, -12115029, 4076461, 10836739, 14566918, -5310190, -7021735, -6208912, 3301756, -3393561, --673236, -564788, 2021856, 2229088, 9754408, -5141076, 981400, 2403034, 4803384, -4668093, --3402151, -7714835, -5161477, -5376762, -9121974, -23337242, -191663, -3119757, -9951976, 2258616, --1048509, -12658342, 4339528, -10735271, 2841658, -1303523, -790274, 5447093, 7149510, -205622, --10377715, 3078955, -6476811, -7260106, 10180146, 9096741, 10255845, -3323231, 1749125, 1336272, --5075041, 790274, -2381023, 15888695, -2516314, -1655173, -1462973, -133681, -9594957, -12045236, -2976949, -902480, -773631, 2691334, 17427904, -2165201, -7983808, -3449933, 9211631, -1355599, --2818572, -2647847, -54224, -7406671, 1917166, -1453310, 1514513, -3762928, 302258, -4725538, --256087, -340913, 2038499, -2011118, -818728, -2910377, 4015258, 196495, -2691334, 581431, -1430761, -3091303, 928250, 1142461, 4884452, -1040993, 1248762, 3291019, 2225867, -1792612, -2164127, -3663607, -5719286, 650151, 720481, -2289755, -5317170, -1192927, -1189169, 4784057, -1963337, 3184182, -395674, 3990025, 4538707, -15261629, 5652177, 1875290, 16141024, -10842645, --6138582, -3592740, 8622684, -8209830, -7892003, 7149510, 4812511, -8303783, -8380555, -8199630, --18372260, 12081206, 11336566, 12028593, -5164698, 3815005, 11929272, -17259326, 32212, 11359115, -10523207, 4789963, -18790, -5511517, 1163936, -2643552, -14939507, 1916629, 4103305, 2216740, -9921374, -8715026, 948651, -16307454, -2065879, 3252364, -8966281, 3495030, 2762201, 7330973, -8935143, 12449500, -2536178, -4850629, -14992120, -10676752, 4630512, 22060562, -6833293, -887985, --10152229, -5351530, -8054675, 4776004, 4882841, -1664837, 723165, -16094853, -2126009, 10943577, --8711804, -7521562, 6475200, -2879776, 9473624, 2374043, -6961605, 1153199, -10517838, -3000035, --2778844, 20318416, -2032593, -5910412, 4440996, 4171487, -1785633, -3421478, -1040456, -2744484, --3776350, -3482682, -2692408, 1454920, 1570347, 3300682, -851477, -21475, -1963874, 2011655, -504659, -5177046, 1383516, -17717, -574989, 1911261, -128312, -2814277, -2825552, -6699075, -2229625, -2088965, 1971927, 2597918, -3179350, 1473711, 901406, -646393, 2535105, 38118, -7274064, 1050656, -1341640, 201327, -2138894, -354335, 1249836, 233539, -656593, 620086, --2871723, 2306934, -9378598, 22081500, -10710038, -5456219, -323733, -608812, -15476915, 1122060, --11366094, 8418136, -21464100, -3025268, -6781754, 7488276, -7305203, -7347079, -18140868, 12428025, --7387344, 5181341, -5753109, 3805878, 9845139, -6935836, -11850889, -3894462, 8318278, 17132624, -5588826, 7250442, 967441, -16990354, -9044127, -9096204, -4621385, 3130494, 15650324, 6828461, -9167608, 8617852, -2248416, -3476239, -5096516, -14172318, 903017, -9846213, 15622407, -6942278, -10798622, 2433099, -5461588, 3726958, -3594888, -4703526, -8317741, 12884365, 3457986, 21664888, -4832375, -22996328, -5651640, 7581154, 6144488, 3547106, -1188632, 2215666, 24348170, 12282533, --3977677, 2773475, -6406481, 17726404, -555661, -519691, 6950868, -15295989, -6560563, -5087389, --16429324, -19423990, 4002910, 7167764, -1719061, -9482214, -2414309, -2898566, -7472170, 294742, --1436667, -5827197, 6082748, 9341017, -1902134, -1171452, -1274532, -3419868, 2735894, 794569, --937377, -1671279, -1489280, -902480, 3124589, -1586454, -4211753, -871878, -106837, 1566053, -962610, -2452426, 6575595, -1940788, 4032974, -578210, 3383361, 1921461, -949725, -4214437, --4132832, 1647657, -1055488, -6461779, -2353105, -1437740, 2542084, 823023, -405874, 2069101, -3146064, 1245541, -1732482, -2525978, -13390097, 8005282, 17891224, -1761474, -782758, -415001, -16625818, 5152350, 3977140, 2842195, 1954210, 2829847, -6568079, 1220845, -20626044, 2957622, --9949292, 8609799, 21060372, -2740189, 1515587, -16632261, 22200150, 10776610, 9418863, -2768643, --12242804, 1469953, -4194036, 11274826, 8061117, -10102837, 512175, 5949067, 4176856, -7819525, --6972880, 32556926, -7581691, -5674726, 6830609, -8288213, -6078453, 10354092, 10106595, 402653, -3866008, 3688840, -12639015, -6266358, -577136, 4296041, 10991358, 2729989, 2563022, -14230300, --1388348, 4203699, -19472844, 4263829, -5450851, -1957431, -3631395, 5719286, -5828808, -10540923, --11325829, -17838072, 2202781, -7225746, -3539590, 11436424, -3929895, 3716221, -20187956, -29528, -18482854, 4345433, -9423695, -5561983, 11200738, 5784247, -12416214, 6943889, -9011378, -6882685, --3013457, -1716913, 4134980, -1181653, 653372, -1896228, -2539936, 1508607, 2165201, -3124589, -2590939, 8205535, 1183800, -1098975, 3415573, 5194763, -2294050, 3542811, -2401961, -3155190, -793495, 2365990, 6697465, 1821066, -773094, 2503429, -1148367, 3540127, -2099165, 3257733, --2578591, 1104344, 2716030, 860067, -4834523, -2646237, 8500277, -3624953, -7044283, 3441880, -1662152, 2576444, -1968706, 11096585, 3071975, -2527588, -1442035, 2806224, -1246614, -10273562, --10315975, 24589224, -14688251, 3854196, -9383430, 28986198, 6171331, 5376762, -9244380, -10935524, -1070521, 8296803, -8866960, -14139032, -8403104, -20569672, -8011188, -12067784, -9664, -27652610, -1949915, 15015743, 9242233, 12277164, -8543227, 3219615, 13313862, -1517734, 9656160, 3612068, -15043123, -7518341, 12546673, 9997073, 7136625, 16319802, -9119289, 9731859, -4981089, -5768678, --3841312, 3628174, -31591632, -10078141, -19636054, 22759032, -14324253, -16146930, -3459596, 12853763, -358630, -5755256, 17879948, -6366216, -5671505, -12953084, -31960462, 1575716, 2966212, 13343927, --13405667, 63888, -8177081, -10755672, 17082696, -3427384, 8551817, -18562848, -18106508, -11264089, -14232985, -1446330, -9040906, -9556839, -400506, -15743739, -10784126, 1551020, -6635188, -11739219, -17313014, -23781234, -22705882, 5945846, 64961, 10031970, 1116155, -1081795, -7351911, -6448894, -1024350, -11243151, -4577362, 9594957, 1228898, 1649268, -5611375, 5680631, 2055142, -6143951, -2823941, -4555887, -992674, -4673998, 4001836, -6220724, -1627793, 4228396, 8173860, 913754, -260382, -8990440, -2800856, -628676, 1216550, -1342714, 7547868, -339839, -3026878, 4865661, --5804649, -5258114, 3105798, 6953015, -2087891, -4988068, -6861747, 5337571, 4185446, 8616778, --11810086, -9664, 15998753, 2165737, -4750771, 8294656, -12877386, 25841208, 16236050, -77309, --11723113, -13249974, 5618891, -3278671, -1149441, -623844, 23557358, -11457899, 488016, -7945153, -8701604, -14518063, -13338558, -26261040, 6154688, -10619844, -14767171, -1717450, -25010668, -12217034, -7115687, 5436355, -3396246, 13141526, 1256815, 15910706, -6942815, -21689048, -3274913, -15860777, --3009162, -4689568, -20861730, 2841121, 17055852, -47822852, 6102612, 232465, 11919071, -2263448, --14891188, -28325846, 11367705, -3370476, 10624675, 6470368, -3440269, 16726750, -20623360, 29078002, --7237557, 16281684, 33800856, 13651554, 24056112, 9587978, 6328098, -3139621, 12572443, -4525285, --13117904, -17558364, -11413339, -446677, 9981504, -1480153, -7715909, -10834592, -9818295, 13532905, --5944772, -4661114, 12006581, 2347737, 9045201, -766652, -1297617, -3474092, 2136209, 4714264, --6123013, -817654, -14997489, -10659572, 7386807, -3471944, -370441, -1999844, -275415, -5536213, --8974871, 6708739, -5399311, 8661875, -8633958, -3772592, -952946, -5851893, -3040837, 4472135, -1775432, 10473815, -2573222, -5906117, 3877819, -12029130, 208843, 1719061, -1899449, 1025960, --1359894, 6262063, 8693014, 1714229, -305480, -3957812, -7262253, -3280818, 423591, 14471892, -7134478, -6930467, 40353904, 32874216, 29614336, -6815576, 14496, -25249038, 18767396, 23305566, -7881802, 22512608, 8943196, 7620883, 7852811, -4034585, 3051574, 6196564, -5825050, -24319716, --14811195, -942208, -16202227, -18838800, -44218836, 9657234, 7549479, 11466489, -8533563, -3058017, --5956583, 273267, -13890461, -432718, -10605885, 12184822, 10082973, -6339909, -8650064, -23311472, -39113192, -12276627, 7646653, -48855, 2428267, 6226092, -16305843, 19520090, -9961103, 6653441, -4279935, -14638859, -15160698, -2815888, -1423782, 9055939, 41273024, -3482682, 6044093, 1348620, -12368969, 8861054, 9184251, -7331509, -2296734, 3559991, -20117626, 4048544, -17235166, -27347668, -9401683, 853625, 2042257, -20023138, -48220672, 20786568, 21594022, 14959908, -27407260, 25959320, -27461484, 10201084, 7870528, 237834, -8086887, -18170932, 13458280, -12804371, 686658, 222265, --7354595, 5485210, -13193066, -1364726, -2699387, 6455336, -3768297, -6009196, -8260296, 12426414, --6969122, -2960843, 3082713, -11166915, 6049999, 5083094, -4027606, -3907883, 920734, -10371272, -9429064, -3478387, -2762201, -864899, 641024, 7077569, -5748814, -13111461, 3726421, -7306813, --2448668, -7488276, -6828461, 1030792, -5561983, -2455648, -5199058, 16851304, -7667054, -13681618, -1955284, -4906464, -543313, -23617488, -47219944, 39336532, 6395743, 7049652, -15673946, -11263552, --50240916, 13994077, 36075576, 11116986, -31787052, -15866146, 5264020, -12327093, -7788387, 14830522, --16504486, 9347459, 8357470, 6919729, -18382996, 6678674, 5807333, -8591008, -17198122, -9931038, --6565395, -4398047, -16401406, -14148696, -7733626, -16930762, 13500693, -6275484, -21856552, -7507603, -13554380, -2713883, -15128485, -8308078, -7676717, 15032, -11973295, -7209103, -19899658, -18927384, -8178692, -6692633, 25029458, 16455093, 1693291, 14945949, -21713208, 14158360, -20606716, 17452062, --2892124, 8954470, -9142912, 30960808, -7619272, 17361868, -4342212, 25473452, 10323491, 6236293, --26152056, 28508382, 22865870, 9967008, 10669773, -20420958, -3823058, 8418673, 14067092, -3587372, -3458523, -22568442, 14586783, 24831354, -464393, -17721036, -955093, -11710228, -9972914, 4883378, -20938, -4879620, 5808407, -12936441, -2971044, 517007, 3764539, -8919573, -12191265, 4731444, --5902359, -11570105, -20700132, -1520955, 6516539, -1728724, -10392210, -12613245, -3806952, 8021925, --8610873, 3322157, 4711579, 1299765, 3478387, -1084479, -5522791, -4728759, -1510218, 5774584, -1998770, -2273648, -7743826, 10652056, -6853157, -6069326, -4991826, 2108292, 12468827, -8445516, -12276627, 10278394, -4077535, 3711389, 6551973, -33640332, 27238146, -4041564, 12670154, -18884972, --6622303, -5251135, -4954245, -4965519, 15609522, -248034, -14330695, 10227391, 1157494, 7182796, -13123809, 13258027, 9664, -12783970, 48810156, -14293651, 37372120, -401043, 1564442, -22256520, --10145786, 2902324, 17734994, 8451959, -6698539, 14440217, 2385854, -21499532, 2796024, 2405182, -20768314, -1431298, 12162811, -16449188, -668941, 13887240, 6551436, 11521787, 31553514, 25191594, --4688494, 12772159, -2674154, 24733642, -20985210, 16330539, 6228240, -1503239, 14555644, -8589935, -38821136, -7384660, 18428094, -14919106, -13401372, 89121, 41407244, 13131326, -39649528, 34039764, --1315871, 11572253, -30032022, 9447854, 2787434, -59479392, 24137180, 44461500, 16700443, -19376208, --12438225, 8565239, 43861280, 24698210, 33303714, -12868259, -16993574, -15563888, 6589017, 8653285, --2045478, -17502528, -8051990, 20483236, 3269007, 4241817, -7735236, 9116605, -2945811, 3842922, --4983236, -6253473, -7221988, 12148315, 20891794, 20089710, 4241280, 10407243, 19177566, 12411919, -13401372, 18224620, 10258529, 17377974, 13290239, 4370129, -27592480, -5893232, -13085692, 7036230, -15519864, -18748070, -6803228, 20813948, 11416023, 1841467, -5309117, 17523466, -14499273, 2681133, -18453326, 14114873, 7932268, 9272298, 11170673, 6017786, 2130841, -1839857, 2641942, 965294, -9556302, 11321534, 7347079, -9314710, -4706748, -16291885, 20001126, 2797098, 13253732, -11181947, -26809186, -9779641, 12399571, 3868155, 5439576, 3632469, 2201171, -28597502, -16524350, -167504, -2412698, 18964964, 15815680, -23416698, 2223183, -13072807, -11659226, 5305895, 1304596, -8289824, -9426916, 36907192, -24831890, -2379412, 57046292, -35196184, 4001836, 19975892, -10554345, -8847096, -11762305, 18403398, -20603494, 9669582, -37309308, -4466229, 55506548, 1977833, 15694347, -6339372, -30327300, 30055108, -8461086, -995359, -14442364, 3047279, -10676752, -27574226, -17432198, -32814624, --23864448, 35482872, 14464913, 10145250, 47858284, -34423628, -20067160, 5597416, 17944374, -13836237, -8740795, -14791330, 26521424, 15386183, 9200894, 18958522, 69446936, -16942572, -5394479, -19888920, --22306450, -1926293, 29235842, -23360864, -2913062, 20302848, 22370874, 25934624, 15479062, -18345416, -4666482, -10366977, -2037425, 14911053, 5091684, -1805497, 11648488, -21519396, 1537598, -111132, -5840619, -5210332, -5254356, 12309376, -4555887, -3662533, 14330695, 17677548, 14717242, 5885179, -6373732, 11480448, 3799972, 408022, 8554501, 307627, -4485020, 3110630, 165356, -1818919, --23365158, 5184563, 15578383, 24362666, -5474473, -7644505, -7874823, 12099997, 14696304, -32723892, -4212826, -14919643, -1663226, 1162862, 2480344, 8756365, 6957847, 5688148, -7963943, -16777216, -13727252, -4046396, 31344672, -28466506, 7196755, -2046015, -9131100, -8274792, -4114042, 9622874, -5916855, 6546604, -1509144, 17554606, 3070365, -22907744, -18064096, -2460480, -10616085, -13157632, -3006477, 14534706, -2040110, -3252901, -21027624, 10399190, -3375844, 21562884, -7322919, -41333692, -5061082, -12217034, -6241125, 118648, -33571612, -17598628, -28840168, 580357, -2103997, -8029978, --38182260, -15464030, -3344706, 20024212, 22057342, 1838783, 1677185, 10816875, 2433636, -26164404, -22990424, 31387084, -13604846, 4806606, -13633837, 5727876, -124017, 23933706, -26801670, -19362786, --61283816, -21659520, 15424301, 24765318, 17543868, 16016470, -15117748, -4933307, 12198781, 11807402, -26563836, 12686260, 11331734, 20546050, 5143760, -22470196, -24183350, -32678258, 13645111, -20859046, -1800665, -18280992, -28337120, -42800960, 6039798, -12343736, -13456133, 3898220, 3998078, -1551557, --6231461, 966368, 14074071, 9883257, 3562139, -5386426, 10155987, 23131620, -5156108, -12527346, --10407780, 11386495, -6087043, -5103495, -20651276, -19825570, -15391552, -33934536, -1967095, 170725, --13706314, 6105833, 9101573, 6785512, 16852914, 4764193, 19904490, 1389422, 5404680, 22131966, --10853919, -524523, 3183108, -102542, -15430207, -486405, -3078955, 26656178, -1833951, -10951630, -8185671, 3395709, 7633768, 17107928, -3082713, -185757, 9628780, 4460324, 415001, -1198296, --5352603, 5732708, -49129596, 20526722, -14724759, 1762547, 34804268, 29117730, -11643119, -4967667, -17886928, -11270531, -11862163, -9891310, 2333778, -3457449, -1399086, 4083440, -3926674, 17102560, -40889700, -17394080, -32195074, 31964220, -24965034, -6813966, 136902, 39908300, 2989834, -12212203, -11668889, 11045045, -41972568, -12418898, 6790344, -1743220, -19999516, -1619740, 7741679, -61612916, --28578712, 30327300, -30464204, -33901788, -20984674, 24737402, -32436130, -50710140, 50782620, -15137612, --31997506, -2006824, 19752554, -19654308, -34336116, -1013612, 15436112, -1933809, -44131864, 10180146, --775778, -19875498, 46134928, 43404404, -3430605, -17910014, -34456912, 52948356, 7274601, 9216463, -18228914, -13233331, -51645908, 23043036, 39284992, 31358094, -19624780, 11207717, 42872900, 24786794, --29832842, -6735046, -23420994, 10307385, 6355478, 26870926, 26613228, -32285806, -1194538, -3540127, -4737349, -12662100, 12815646, -8358543, 7394323, 6566468, 5393942, -9229885, 6966974, -13706314, -22304838, -11518565, -5767068, 14052596, 12358768, -13084618, 2014340, -6196027, -15105937, -8216273, -6018860, 11725798, 7232188, -12340515, 6813966, -7985418, -18769008, 782758, 3332895, -3142842, --1553168, 12626130, 795643, 1279363, 5997385, -1857037, 3226594, -20229296, 15092515, 5400922, --51140176, 5202279, 47486768, 25675852, 6323803, -1005022, -9033390, 12044162, -17245904, 39351564, --3402688, 10194642, 14316200, -14085345, 167504, -2134599, -15511811, -469762, 5382668, 21889300, --441308, -14252312, 6518687, 17530446, -3329137, 28026272, -22448184, 4197794, 6054294, 7004018, -24304146, -13927505, 1819456, -1353452, -32529546, 4145717, -10872173, -18008798, 7172596, -7120519, -24939802, 17788680, -13612899, -29291140, 13362180, 2353642, 5434208, 15679852, 34754876, -6429029, -6929930, -14702210, 19801946, 13967234, 14718853, -17183090, 22732726, -8374650, -10411538, -20643224, --2144263, -8429410, 29540248, -22718766, 1279900, 6940667, -7141457, -14039711, 41385768, -2266132, -9577240, -4269735, 4707284, -3906273, 11378442, -1891396, -5397700, -3789772, -4786741, 13515725, -9384504, 12700218, 6999186, 3787088, -9294846, 9288941, 467615, 4988605, 4320737, 11392401, --1952600, 56908, 1606855, 3408594, 3605088, 8405251, -7532836, 5175436, 4537633, 3964255, -3338263, 2645700, 8293582, 2976949, -11521250, 6489696, 7534447, 7842074, 3288871, 8452496, -2152316, -865973, 4705137, 2545305, 6058052, -819265, -5858336, 1085553, 8495982, -4733054, -3387119, 166967, 9279277, 8284992, 3076270, 5745056, 8620536, 3875134, 6958384, 16689706, --44396540, -124570160, -118455200, 51470352, 5023501, 113868712, 241192480, 52823804, 97189208, 51869784, --178961088, -80073224, -120373976, -176707840, -11886322, 20905216, -83530672, 74221864, 126175936, 77317464, -217321056, 133438728, 1173063, -20079508, -76971184, -191963024, -155593248, -66986456, -147392544, -43436616, -84170624, 25076166, 21255794, 199150656, 76747848, 48541720, 184213296, 8769249, -9389872, 85004384, --42388644, -151886144, -73640976, -151770720, -221850096, -24515674, -100831336, -82188496, 70899712, 137723488, -63592896, 243323856, 193715376, 112453520, 147090288, 49947248, -72261752, -111118856, -148339040, -237334528, --190449056, -127634616, -108925200, -33776160, 82558400, 125672888, 139852720, 188247872, 158296928, 74334072, -26876832, 40891308, -63684164, -97307856, -69318624, -145430816, -109667696, -18749680, -65541736, 26057030, -106378824, 38182260, 54191748, 77508056, 8049843, 4753455, -19057844, -72790568, -38388416, 738734, --29322816, 22639310, 30674120, -12412455, 38947300, 33801928, -53022980, 40510668, 46875272, -33086280, -76542760, 11850889, -75806176, 53009024, -41699836, -147508512, -24664386, -89593552, -109226384, 67418104, -8250096, 17264158, 141813376, 90447176, 100240240, 161683504, 118549688, 39527120, 16706349, -112363320, --204874240, -203387632, -204411984, -192866576, -118081536, 6199786, 110640504, 163078304, 222916320, 207487184, -195545024, 154524864, 25860534, -70851392, -78206520, -163796624, -203262016, -121908888, -109767552, -60799556, -10871636, 29502130, 34922380, 69923680, 60793652, 57636312, 80866720, 67270464, 42054172, 37154688, -7705172, -23409182, -41954316, -50718196, -68838664, -57800596, -46001248, -35788352, -11805791, 12075837, -20795694, 30060476, 35089884, 33999496, 25931402, 20927228, 9119289, -715649, -4572530, -4766877, --9295920, -7206419, -4793184, -5450851, -5377299, -1381369, -7475928, -8608188, -8471286, -13127031, --14709726, -8643622, -7382512, 4129074, 17818746, 23784992, 24197308, 22899692, 14922864, 10889353, -4014721, -6808597, -17940078, -21398600, -23333484, -20936892, -15610059, -7123204, 973347, 10068477, -15825344, 16633335, 13915157, 10421738, 3864934, -1120987, -5113159, -7458748, -8167417, -5198521, --2738579, 943819, 3526705, 5567888, 5354214, 3582003, -625455, -3535295, -5954436, -6616934, --5913633, -3850438, -1870995, 1142461, 3083787, 4349728, 4837207, 4627828, 3320547, 2259153, -1078574, 20401, -941135, -1369558, -1687922, -1490354, -1090922, -672699, -493384, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --5042829, --1938641, 1176284, -935766, -2905009, -210453, 6729677, -3454228, 785442, -1456531, -75699, --2573222, 4843113, -2512019, -2677375, -3024194, 5770826, -3430605, -898185, -1620813, 1622961, -2665027, 3376918, -4763656, -11811, 4562329, 2017561, 782221, -252329, -568546, 2059437, -4651987, 1121523, -5970005, -3080029, -3211025, 5212480, -531502, 3976603, -2498060, 1842004, -5219459, -2544231, -3926137, 1394254, -1466731, -265751, -3512210, -1422171, -2623688, 996432, --4763119, -1575716, -1215476, -155693, 6456947, -2108829, -964757, -233002, -1685238, -671626, --602906, 3902515, 2027761, 2391760, -3348464, 2458869, 2594160, -2289755, 1078037, 1530082, --1719061, -2348810, 2752537, -4116189, 2914672, 1752347, 779000, -3815005, -1310502, 1417876, --325881, -795106, -1016834, -92879, -2032593, -2378338, -352724, -394600, 298500, -897111, -33823, 1403381, -39192, 520228, 215822, 273804, 30602, -280784, -1013075, -625455, -721018, -326954, 57445, -102005, -3131031, 3389266, 430034, -1408749, -2124935, -553514, --1062468, 40802, -2641942, -2020782, 1552631, -387084, -993748, -4642860, -665183, 4387846, --2900177, -697932, 3311420, -1855426, -3477850, -2643552, 2268817, 54224, -310311, -640487, --3333968, 1167694, -1467268, -756451, 3837553, -2059974, -5127117, -1503775, 316754, 1578401, -1385664, 475668, -3888019, -871878, -4743255, -4305168, -1139240, 4576288, -757525, -8950712, --375273, 3056943, 2655901, -1823214, 1795833, 1962800, 208843, 2702071, -4810900, -3395172, --427349, 1434519, 249108, 1030255, -493921, 1294933, 1175747, 1897839, -255014, 1180579, -1123134, -875636, 1882269, -432718, -4692789, -3839701, -2479807, -1968169, -2093797, 670552, --1049583, 3681324, 3047279, -534723, -1433982, -1247151, -652298, 1121523, 1750736, 239981, --984621, 206695, 266288, -978716, 1323387, 27917, -274878, -480499, -84826, -724776, -544924, -129386, 123480, -843424, 538482, -526134, 30602, 20938, 380641, -129386, --384936, -153008, -784368, -303332, 107374, -387621, 93952, -251256, -712428, 4068408, -2253784, 6116034, 363462, -1257352, -807454, 4314295, -1237488, 2294050, -4042101, -469225, --157840, 2244657, 1540820, 3866544, 2699924, -2055679, -3993246, -3262565, 2144799, -1416802, -2949569, 1845225, 344671, -239981, 2441689, 1714766, -1875827, 2014340, -4299263, -635118, --3990562, -3411278, -4790499, 1334661, 2636036, -546535, 3690451, -2962454, 3413425, -7085086, -2644089, 1154809, 5143760, 1481764, 1806571, 2765422, -190589, -1839320, 1880122, 4501663, -1480153, 2159295, -800475, -121870, -6512244, -469762, 958315, 1200443, -1013612, 3398393, -6391448, -2200097, -4718022, 3057480, 615791, -3331821, -123480, -1564442, -3388192, 370978, -4576288, 1126892, 1618666, 747861, -569083, 1731946, 1018444, -126165, 1455457, 62277, --496606, -376883, -952409, 868120, -1364726, -192737, 2082522, -500364, -126702, 794569, --586263, 1442035, -2135136, -955093, -46171, -850404, -976568, 190589, -583579, 679679, -1501091, -621697, 812286, 213675, 12348, -2684, 138513, -1799591, -540629, -424665, -265751, 1440962, 779537, 2273112, 3338800, 3209414, -3204046, 4923643, -1817845, -3355980, --4932770, 1081795, -6507949, -456340, 624381, 1734093, -4167192, 2609193, -112743, 539018, -1679332, 1005559, 1414655, -5616207, -418222, -1314260, -3672734, 2064806, 1023813, 776852, -3069291, 10898480, -850940, 505196, 1518808, 2648921, 1029718, -9051644, 1825898, -1553704, --1074279, 4865661, 103616, 2390686, 3512210, -4497368, -2516851, -1341640, -4345433, -9292162, -395674, -3542274, -596464, -868120, -229781, -2204392, -4556424, 1217623, -4361540, -1438277, -935229, -4884989, 4949950, 1654636, 1380295, -2092723, -407485, -857383, 954557, -1622961, -2523830, -4022774, 1276142, 5939403, 4941897, -1811939, 2495376, -2439542, 1037235, -4555350, --184147, 2714956, 3182034, 2804077, -532039, 5284958, 454193, 2602750, 2357400, -171262, -1079647, 505732, 165356, -985158, 503585, 755377, -358093, 13959, -639413, -1554778, --264677, 924492, -823023, 2078227, -632971, -1207423, -992137, 673236, -574989, 859530, --215822, -996969, 507343, -340913, 1081795, 590021, 621160, 357556, -1971390, -549219, -228707, 736587, -4832, 66572, -553514, 7349763, -9269076, 417149, -5699422, 2951180, -4246649, 5173825, -777389, -4869419, 146029, 5097590, 1103270, 994285, -3794604, -487479, --6660421, 8904004, -450972, -6812892, 7423314, 1878511, 2214593, -457951, -2650532, -848256, --3506841, -3454228, 2755759, 3907347, -771484, 3688303, -2999498, -1860795, 19864, 5138392, -4859756, -1331977, -2708514, 4006668, 2559801, 399969, 3389803, 829466, -3940096, 4194036, -2619930, -285078, -1356136, 1178432, -4248797, 11400454, -569083, -377957, 8493835, -741419, --5164162, -2783139, -592169, 2094870, -5367636, 3717294, 1133871, 158377, -4871567, -4091493, --8625368, -732292, 4054449, 2039036, 4912369, -2678986, -1898376, 10275709, -2823404, 1745904, --1401233, -4210679, 349503, 1908576, -4407710, -7821136, 350577, -4809290, -4865124, -2353642, -2574296, 264677, -715112, -2967286, -1005559, 382252, -1100049, -797790, 827855, 2837363, -418222, 744103, -1956358, -970663, -181462, 22012, -2770254, -2006287, -1749662, -62814, -700617, 316754, -885837, 112206, -154082, -237834, -1441498, -492311, -187368, -513785, --743029, -970126, -9827422, -161061, -4164508, -4702453, 1354525, -5637682, 101469, 3767223, -2024540, 7950522, -13407277, 8519068, -1479616, 3695283, -2616709, -1966021, -7075422, 6194954, -5451924, 1332514, -6296959, -397284, -3668976, -484258, 6431177, 4467840, 932545, 6134824, --151934, 265214, 542777, -268435, -4395362, 9198746, -993211, 34360, 10683194, -6987912, -2504503, -3360275, -765578, 3345780, -1534914, -5522791, 10280004, 8014946, -358093, 2568391, -4269735, 11126113, -1515050, -2064806, -6132140, 1013075, 2056216, -6467147, -6911676, -6069863, -7153268, 117575, -3027952, 4912906, 3462818, 18790, -1779190, 1569811, -3961034, -1039382, --4304631, -996432, 3950296, -7881265, 1800128, -1686312, -5485747, 3289945, 5174362, 2196876, -5390721, 4685810, -4046396, -6424734, -3240016, 2787434, -2567317, -4943508, 3146064, 5348845, --3945464, 646393, 1107565, 581968, -3687766, 2110440, -1662689, -1303523, -2379412, -1240172, --1870995, -194884, -240518, 696858, 1094143, -935229, -836445, -366146, -1493038, -856846, --428423, -586800, 1120987, 1445793, 337692, 2130841, -1942399, 1472637, -1681480, -745714, -1508070, 7385733, 7834557, 1328219, -6685654, -888521, -6347962, 2698313, 16829830, 4181688, -11673184, 4312684, 184684, -10817949, -2629057, 1825361, 10547903, -4610648, -2276333, -4009889, -1047435, 8486855, -6144488, 4175245, 7351374, 1664300, 2731062, -4744865, 9075266, -1896228, -11807939, -71404, -3556770, -11002096, 1394791, 81068, 13212393, -3933653, -1030792, 8393440, -104690, 1147830, -2671470, -8593156, 969589, 5015448, -6156836, -4846334, 1336272, -10312216, -5728413, 5792837, -1701344, -629213, 2967286, 5907728, -450435, -3562675, -90194, 8655970, --1052267, -1277216, -3208341, 11194295, 11334956, 812286, -1998770, 1808181, -433255, 2992519, -5266167, -380105, 7584912, -2883534, -4135517, -6046777, 2112587, -447213, -9226663, -6638409, --3800509, 7350300, -2083059, -3360275, -889595, 59056, -3094524, -4694936, -1616518, -1334661, --2783676, 524523, -1725503, -1501628, 1551557, -2957622, -3058017, 1043140, 2552821, -1439888, --1948305, -1451162, -2557116, -1186485, 872952, -834297, 507880, 1449552, -399432, -701690, --2244657, 1377611, 156766, -7449084, 7464653, 5669894, 398895, -4955856, -5561446, -2443837, --11005854, 12688944, 9532143, -2094333, 3504693, 1107565, -2136746, 9612137, -819265, -4530117, -14243722, -15524159, 3953518, 6629819, -99321, -6372658, 6764037, 1012002, 9801115, -3850438, --1105417, 2585034, 3887482, 624918, -1393180, 14286672, 6133214, -6590091, -9939628, 6841346, --9943386, -2912525, -11441256, -1517197, 17008608, 6937983, 8197482, 19327, -9098351, -1546725, --4471061, -2006287, 12707734, -2027761, -14108431, -1174674, 2709588, -8983998, -1534377, 5728950, -4488778, -6051072, -3191698, 6122476, 8102993, -2407866, 8443369, 113817, 2084670, 3141769, -668941, 3300146, 5043902, 4894652, 4747013, -2561411, -10252087, -11304354, 2757906, -2299955, -8005282, -1478006, 9509594, 3200825, 4395899, -5128191, -4598300, 3374234, -230318, 664109, -839129, 390842, -4626217, -2128156, -761820, -3831111, -166430, -3295314, 533113, -1874753, -1353989, -491237, 2385854, -31139, 1280974, 400506, -1283122, -1098975, -1526324, 2994666, -291521, -921807, 904628, 1536525, 1250909, 268972, -2292976, -6277632, -3600793, 1074, --3082176, -97174, -558346, -624918, 3704409, -635118, 6110128, -957241, 5689221, -11860015, -4032438, 3162707, 1557463, -7823283, -6569690, -8323110, 6200322, 3146601, -5992553, -5983963, -7836705, 2436857, -802622, -5063230, -8256001, -3468186, 3127810, -5348308, 453656, -9884330, --2885681, 966905, 3162170, 6178848, -1192390, 3879966, 5363878, -5816460, -13674639, 9118752, -256087, -2326262, 8677445, -1551557, 180389, -6150930, 7604777, -5159330, -6487548, -2659122, -6203544, 9484362, 7956427, 2332704, 1464584, -17278116, 7588671, -1236951, 3090766, -6103149, --1290638, -6807523, -2469069, -1824824, -8950712, -4627291, -3771518, -5012764, 8921184, -3136400, -11655467, -1623498, -840740, 7211787, 8290898, 14055817, 9608916, -409633, -4801237, -755377, --153545, -7057705, 1553704, -4633733, -7681549, 14367739, -9436580, -10055055, -1600412, 5264020, -632971, 1540820, 556198, 5953362, -252329, 1520955, 2025077, -2535641, 208306, 3601330, --2244657, 1391033, 2565169, 2051921, 4568772, 896574, -60666, 2429878, 329102, -1032403, -1614908, 2520072, 931471, -154082, 696322, 281320, 5320391, 293132, 4307852, 2801393, -545998, 4503810, 4984847, 367757, -261456, 545998, 592169, 478889, -553514, -751619, -1177358, 147103, -3008088, -4388920, -17980880, 4206384, -12315819, -7298223, 12013560, 9383430, --20555714, -18833968, 828929, 8300561, -4638028, 5192079, -6660421, -586800, -11855183, -2965138, --10684268, -599148, -2790118, 527207, 4362076, 3601330, 6953015, -663036, -5586679, 5192079, --6698002, -2583960, 2394444, 609885, 3694209, 7355669, -974958, 1078037, 1838246, -2744484, --576063, -10352482, -12276627, -11897059, 198642, -11970611, 4253628, 1762010, -4609574, -5482526, --2241973, -1859184, -856846, -7066295, -11227045, -490700, 18305150, 10139881, -2370285, -10673531, --10995653, 12655658, -11557757, -3726958, -1906429, -7692824, -5763846, -7845295, -9167071, -12866111, --17415556, -2390686, -2655901, -2367064, 6076305, 5714991, 1640678, 5022965, -3816079, -4755603, -16448651, 7015292, -4166118, -11871290, 3896072, -6976638, -8249559, 88047, 13820668, -2597918, -53150, 9501541, -892279, -6149320, 430570, 2344515, -30065, -2457795, -2309619, 32749, -2467996, 1226213, 1700807, 1045288, 4825396, -1273995, 2667175, -6642704, 3272765, 1725503, --1054415, 1522029, -1260573, 2569464, -1065152, -1873143, -976568, 2339684, 2100776, 344134, -2760053, -3738232, 3982509, -1822677, -2158221, 395137, 1018981, -15089831, 1525250, 7344394, -7983808, 7401840, 3011309, 14768782, -6092948, -11049340, -3042984, 1745904, -2404108, 4585415, -9739912, 19909320, 12419972, 7196755, 9141838, -7914014, -15037217, -5251135, -11321534, 12428562, -2629594, -2825015, -9232032, 14129906, 12048994, -4715337, -1147293, -227096, -7650411, -6344741, --11390253, 3147137, 3591130, 6183143, -10788958, 803696, 2747705, -4953171, -10496900, 146566, -5687074, 7710540, 1061931, -20187420, -7431367, -10036265, 3827890, 11795591, -287226, -11389716, -2396055, -10997264, 5727876, -2779381, 673236, -7838852, 15868830, 12622372, -4297115, -3876208, --9626632, -764504, 12617003, 2839510, 15571941, 15181636, 12451110, 7379828, 2305861, -10337986, --6010807, -13713294, 15382962, 15670188, -1578401, -12118787, 7420630, 18228914, -541166, 2249489, --4740570, -500901, -12341052, 1848983, -9801652, 6447820, 1969779, 9098888, 8792872, 4900021, -439160, 772020, 5312875, 2028835, -1639604, -3736085, -1538135, -5680631, 662499, 4373888, --4052302, -2112587, -4592931, 3092377, -1292785, 6618008, -6617471, 1696512, -550293, 6311992, --3388729, 2103460, 3484292, 718333, -547608, 261456, 774168, -2859375, -1508607, 3813394, -4322348, -10351945, -2937758, 6800544, 12182138, -13701483, -16549046, -14354318, 14834280, -6800544, -9762461, -613107, -296353, 24154360, -3432216, 1351841, -11359652, -17442936, 3777424, -2991982, -4118874, 2529736, -1824287, -10173167, 2288144, 3176128, 1241782, -9628243, 5612449, 3969087, -17490718, -8731132, 763967, 9364639, 9570261, -57445, 9666898, -3004867, -66035, 8612483, -7178501, 1608465, -4430259, -14891725, -11439109, 8040179, -720481, -3745748, -3357591, 1714766, -18919330, -1632088, -7274064, 9450539, -5263483, 8910447, 1744831, 27571006, -6005975, -1331440, --593242, 3733937, 9032853, -2294586, -3796214, 5801964, -13680545, 10293426, 19161996, 5414343, --4682588, 10575283, -4744865, -1003949, 21735756, -13298829, 4374424, 8337069, -4307852, 18148922, -3879966, 3568044, -7704635, -11111080, 1324997, 4440996, -12057047, 11256572, -599685, 2536178, --527744, 2988760, 10171019, -2863133, 10262824, 4740570, 2974265, 5643050, 4789426, -3574487, -6234145, 5964636, -6214818, 1698660, 4087735, 8283382, 1424319, 2092186, 3700651, 4678293, -7083475, 375273, -392990, -878321, 4631586, 4074313, -5543192, -492848, 2823941, 4531728, -3198140, -3321084, 6674916, -620086, 1852742, 489626, 5374615, 2687039, 2119030, 2500208, -3482682, 2576981, -1338419, -841277, 825707, 5517423, 1078574, 568546, -828929, 752693, -1746441, 2200097, 409633, 2586644, 3024194, 5087926, -13772350, -3765076, 9818832, -4396436, --7083475, -6264747, -6470368, 1470489, 9862319, -952946, -21185464, 294205, -16048145, 6612639, -7211250, 425739, 3520263, -6859063, -705448, 8948564, -20298016, 5522791, -4269198, 11756936, -8132521, 5463736, 1102733, -7855495, -18311594, -659814, -15981573, 10335839, 337692, -4553739, -17245368, 9181029, -6599218, -5050345, -3351148, -2250563, -4566087, -8827768, 1851668, 2992519, -24841554, -468688, -17434882, 355409, 12229919, 1258425, -8888435, 6102612, -13507135, 9524090, --5603859, 6442988, -7794292, 4072166, -13828721, 37261524, 1565516, 25869124, -2298344, -6584722, -6777996, -7816304, -7914551, 14602889, 13963476, -11684459, -31928786, 30955976, -10566693, -7954280, --3868692, -3864934, 4182761, -2382633, 2499671, 13591424, 3280818, -10211285, -8485782, -6011881, -4048007, -6298033, -871878, 6570763, -16550120, -980863, 1144072, -2151779, -4809290, 2332167, --3393024, 9543954, -3537443, 4512400, -4011500, -2476049, 258772, -3736622, 2478196, 2646774, --1721745, 2780455, -3863323, 2400350, -1016297, 212601, -1740536, 566936, -6959995, -4570919, --998580, -2306934, -5711233, -7009387, -4267587, -1294933, -3046743, -85362, -5090610, 559956, --4532801, -720481, -5899138, 3723737, -3309809, -1939715, -1714766, -15661598, -5507759, -4703526, --13457743, -23756000, -5804649, 464930, -12585328, 6282464, -5341329, 10690174, -9061844, -3732327, --12945568, 31122944, 26322780, -5800354, 5925445, 18122614, -18890876, 19317690, -7930120, -7919920, -6995428, 2632278, 3350075, -2733210, -4117263, 637803, 6284611, 5474473, -8370892, 9757629, --9026411, -15013595, 11022497, 9754408, -12533788, -15534360, -18026514, -2544231, -2945274, 5165772, --11758010, -14685567, -7509214, 24867324, 8710194, 8533563, -10562398, 9661529, 13072270, -10058277, -24365350, 4628364, -8664560, -11293617, 6548752, -9466645, -20765630, 5180268, -202400, 581431, -11404212, 10704669, -9110699, 1853278, -26630408, -3195993, -10486700, 22180822, 1342714, 3229279, --12835510, 10555419, -22626424, -2634426, 8880382, 2674154, -2444373, -2464238, 2761127, -924492, -2568391, -3265249, 648540, 2003065, 5398237, 1462973, 1725503, -1104880, 3204583, -3195456, -1032403, 10182831, -1975148, 583042, -3218004, 4611721, 2083059, -403190, 5259725, -5405217, --5266704, 5850283, -4807679, -1643899, -4407710, 2559801, -6442988, -2761664, -2110440, 5304822, -5160940, -8126078, 1283122, 4374424, -2864743, -9178882, -4527433, 7055021, -2143726, -1024887, --4493073, -11515344, 14629732, 15419469, 13950054, 9421548, -106300, 12786118, 11586211, 1959579, --2181307, 5168993, 43487, -12986907, -1540820, 4969277, -10167798, 14562623, -15146739, 12165495, -13218836, -3768834, -2978023, 5636608, 17635136, 13246216, -15935402, -3441343, -4265440, -1232119, -3981972, -7393250, -7786776, 17341468, 430570, 24886652, -16227997, -15341086, 12501576, -8238821, -4504884, -9700721, 8342974, 9580998, 6282464, -3840238, -14263050, 1466195, 4734128, -11799886, --21787832, -693637, 1978369, -12795781, 23524072, -2622615, -6677601, 31328028, 29438780, 3007551, --4099546, -1029182, -6291590, 7159711, -15448997, 14546517, 1906429, -8323110, 17477832, 2883534, -3536369, -4908611, -9504226, -23397908, 5144834, -7912941, -3881577, 10917807, 4379793, -5064304, --15357729, -4151623, -17487496, 7561827, 15707232, -2123325, -11887396, -8202314, -11855720, 236223, -6366216, 7748658, -1632625, -8276402, -4384625, -4463008, 1084479, -2425583, -4043175, 3493419, --656056, -2355253, 4112431, -9353902, 2682744, 2579128, 14624364, 1461363, -3280818, -7363722, -6429566, -7694971, -1060320, 5628555, -10447508, 9853192, 2036888, -263604, 1948305, 6720550, --3352222, -10122701, 200253, -2888903, -1344862, 10060961, 9376450, -1028108, 2878702, -25773562, --59732796, 20059108, 19007378, -6653978, 4264903, -14360760, 25814900, 16521129, -14593225, 4195110, -3535295, 399969, -6552510, -4713190, -30793842, 13066364, 15243376, -3486440, 17717, -1698123, -10267119, -7698192, 19568944, 5821828, -23201414, -13133473, 29525216, 19395536, -19196894, -4492536, --6806450, -11742441, 1866163, -4671851, 4234838, 38352448, 10475425, 40182640, 22966800, 25907242, -23613194, 46278272, -3003793, -4262218, 11093901, -3236795, -38762616, 31482110, -13595182, 18067316, --25611964, -20361366, -38269232, 7638063, -3495030, -12827457, 9377524, -17972290, 100932, -25688200, --25655450, 7238094, 15036681, -20841866, -5504001, -14440754, -20063402, -22534620, -16179679, 12374875, --9759776, -28143310, 40499396, 25390772, 40832792, -5295158, -8752606, -8090645, -14368276, -23111220, --1450625, -5055177, -17482664, -5814849, 5182952, -12374875, -11159399, 1323924, -1805497, -5498095, --4510253, 10099079, 10754598, 369367, 2734821, 7660074, 9587978, 1976222, -774705, -1441498, -4523675, -1884954, 1151588, -1731946, -6701760, -152471, 6376416, -6581501, 8700530, 10988137, -4654671, 384400, 1814087, 1183800, -7286412, 628139, 4184372, -3735548, 76236, -1694365, -1217086, -2583960, 992137, 4100083, -5582384, -4744865, 8836358, 3619584, -1101659, 1365800, --4890357, -21755084, -57050052, 24711632, 29519310, -13357348, -5815386, -1476932, 33427730, 1083406, -7153268, 7058242, -7853348, 6649683, 15576236, -3113851, -14966350, 3739843, 28434294, -15058155, --9417790, 6235756, -3960497, 21287468, -5319317, 9599789, -10958609, -13166759, -13146895, 13955422, --4190814, 12388833, 14447733, -3724274, 1912871, 93416, -11783243, 3914863, -10686952, 12635794, -30949534, 50818052, -620623, -1446330, -21505438, 11629698, 16640314, -497679, 18686866, 26708792, -11242614, 15188078, -23417772, -14066018, 19474456, 50774028, -9291088, -29802778, 7604777, -9906342, --528818, 13766444, 267362, -13593571, -6492917, -7015829, -34524020, -14433238, 234076, 5729487, -12051678, -1983201, -13271449, -7648800, 3265249, -5383742, -13328357, 13741748, 33229088, 14373108, -17902498, 1832340, -4529043, -27021250, -5968931, 7674033, 5983427, -6052683, 15334644, -4336307, -8584029, -18915036, 1102196, -6524592, -5438503, 178778, 5255966, 5143224, -5331128, -10292889, -9963250, -3905736, 8186745, 731218, -2062121, 671089, 1759863, 7567733, 254477, -1205812, --3913789, -4340602, 6521371, 2156611, 6010270, -12874164, 8960376, 5174362, 2439005, -4669167, --1705102, 9343164, -1125281, 363462, -7204271, 668404, -11053635, -2341831, 3198677, 9362492, -4648765, 8269423, 1904281, -1410897, -8090108, 18234820, 6133214, 9613211, 3829500, 27430882, --8506183, -3311957, -10631118, 6452115, -6565395, 6123013, 31095564, 6237367, -32742146, -7900056, --9484362, -27981176, 17947594, 8543764, -3161096, 4081830, 1841467, -12504260, -26844, -785979, --12439299, -3649112, 27138288, 39873940, 18845242, -13760538, -21842056, 10449119, 18252000, 2131378, -14615774, -10021769, -6935299, 15032922, 4793721, 307627, -33302640, -43418900, -1335735, -25352656, --14705431, 9197672, 36479840, 7988103, 1876364, -10457708, -12530030, -18153754, -15983721, 3082713, -11045582, -3802120, -18023830, -29027536, 11632382, 857383, -16154983, -27052388, -18325014, -29787208, --53864260, -32449552, -4810900, -6366216, 64874408, -7837779, -2390149, 37436544, 4418985, 2193118, -22502944, -13319767, -32749662, -38021196, -5885179, -18162880, -20177220, -21393768, -23480586, 4687957, -21260624, 33820184, 20067698, 4233764, 2214056, -8576513, 17428440, 3685082, -5264020, -21654152, -4501663, 15927886, -753230, 37044, -7795366, 4469451, 8796093, 14577656, 4095788, 6259378, -5564130, 7348689, 8996883, 9481140, -2627983, 7243999, 1466195, -4873178, -11375221, -13462038, -1385664, 3385508, -13553843, -6495065, -13037373, 4420058, 6723235, 10525891, 15201500, 25825638, -19092740, 19742354, 11642046, 7822746, -4680441, 2270427, 102005, -11754252, -18406620, -13622563, --17818746, -11115912, -15484968, 20488604, -29073170, 7343321, 4614406, -12658879, -40772660, 27740120, -8229694, -2618856, -41285912, 10988674, 6400038, -21794274, 3637837, 19126026, 11743514, 5572720, --18696530, -3804804, -6984691, 3298535, -7046431, 1735167, -14486925, -20817170, 22826678, -15767899, -34694208, -21406654, -19407346, -13131326, -24394340, 2150705, -486942, 36465884, -27034672, -28483686, -14668924, 9394704, -23608898, -31361314, -3503620, -17668958, 20302310, 4335233, -25997438, 16864726, --4464619, -39917964, 26182658, -17802102, 17077326, -29699162, -7305203, -821949, -12528420, -5116380, -3382824, 37499896, -10161893, -3505230, -10821707, 10712722, -17792976, 13886166, 29255170, -1797981, -29414620, 23142358, -3568044, 47227460, -2817499, 5462662, -1440425, 13334263, 47554952, -3911642, --13220983, -50888920, 39368208, 14066018, 33603288, 11459510, -26491896, 11774116, 7506529, 4854924, --23526758, 13420162, 2699387, 3877819, -12670690, -3675955, 16026670, 13772886, 561030, -1651952, --1689533, -1841467, 3888556, 10096394, -20672752, -6082748, -2903935, 3301219, -4264903, 4590247, -4399657, 6513855, -4863514, -10953777, 16982300, 26666378, 9290014, -13664975, -11787001, -5043902, --4045859, 7228430, 3587908, -2655901, -16874926, -12048457, -13677323, -1323924, 13042205, 5758478, -10994043, 4225174, -18387292, -3280281, 8008504, 17870286, 11158325, -7488813, -5634460, -4292820, -2563559, 3117610, -389231, -1067836, -3511136, 28094992, -53687628, 2218888, -60441464, -20150376, --10134512, 18600430, 56120728, 47718696, 17679696, 28236726, -18087182, -15220827, 2868501, -3974455, -13114683, 4257923, -12491912, 18925236, 27804544, 23124104, 17332878, 14667850, -314606, 2737505, --9249212, 26309896, 12369506, -4863514, -15977815, 5541045, 10890426, -2711198, 34393560, 35906464, --20533702, -15155866, 913754, 27924804, 17471926, 4591857, 3554622, -6500433, -12381854, 7058242, -42863772, -17165374, -21002390, -22879290, 22463752, 9252433, -12667469, -19771882, -31762894, -37644316, -4282083, 8410620, 6953552, -8201777, -2660195, -10263898, 7588134, -30002494, -49376016, -22189412, --3321084, -8292508, -19206020, 24899536, 41525356, -9189619, 21482890, 45832668, 29943438, 10713259, --31403190, 5217312, 5792837, -27772870, -15300821, -4338991, -22085796, 24358370, 34662532, -1971390, --7852274, -4168803, -9960029, -5522254, -13993540, -13738527, -4973572, -6777996, 5084168, -3007551, --3715684, 6890202, -20848308, -2457795, 1832877, 21366926, -21677774, -3467649, -4855461, 4116189, --13763760, -4799626, 4345433, -7519951, -12714714, -2037425, -872952, -12504797, 14912126, -20219096, --2175938, -7421167, 4614943, -2092186, -5859946, -11788075, 499290, 6003291, -4110821, 2827699, --34241088, 27611272, -3508452, 23722714, 14389751, 546535, 15731928, -6903086, -1768453, 13547401, -16604880, 2558190, 83752, -545998, -15119895, -9822590, 4040491, -21075404, 565862, -7924215, -510027, -17869748, 3043521, 994822, -16260746, 13574244, 5770289, 9186935, -20421496, -5513665, -3845606, -1072131, 1473711, 11710228, 2587181, 3278134, -2349347, -4529043, -3202972, -1678795, -7554848, -3424163, -13042205, 10557030, -17932562, -5632850, -6156299, 2146947, -8781598, -10401874, -13644037, -1743220, -13698798, 8366060, -19102404, 15295452, 4752382, 718333, 15749108, 17533668, -2428267, 4995047, -13174275, 17008070, -8332237, -11639361, -1012539, 2514167, 32148368, -14453102, --23757074, 20344724, -7751342, 20328618, -3452080, 1333051, -8899709, 12312061, -20648056, -17121350, --6788733, 8087424, 4820564, -1250909, 9880035, -12275017, -12431783, -8250096, 2925410, 3592203, -723702, -533650, -3768834, 2130841, -17149268, 3471407, 3483219, -4132296, -1599875, 5168993, --2762738, -7323456, 8848706, -4423817, 1080721, -375810, -2261300, 5983963, 2571612, -6213207, --729608, -1475858, -5577015, -1196148, -2078764, -11410654, 3461744, 6973417, 5549635, -5179194, -5178657, -8324721, -2625299, 209380, -5418638, 17029008, -7153268, -88985816, -169941648, -60316372, --133006008, -151604832, 37460704, -4872641, 51227148, 197127184, 213702544, 150970240, 215222960, 176933328, -58897424, 62124556, 46027552, -118398824, -121929288, -67728416, -118351584, -127957816, -42705932, -37557880, --107821392, -81184008, -12982612, -48010220, -58766428, -14440217, -44924820, -79646408, -45259292, 15089831, --31822486, -39283380, 47145856, -7773354, -44203268, 40669584, 75154952, -17148194, 18944028, 116335632, -16208670, -37056976, 77280424, 67519568, -66566624, 38422240, 85146656, -26311506, 9481677, 147371072, -112496464, 56756384, 206929376, 230348224, 117882896, 212154736, 273915840, 171976928, 162282656, 225223792, -144879440, 92214560, 102109088, 53202832, -61710092, -119579944, -162224672, -277040960, -337111968, -382238656, --432253024, -426240608, -461988160, -412734016, -306328352, -306341216, -241457152, -21568788, -12390444, 6324340, -173333072, 136924624, 45683420, 90886880, 135238864, 50106700, 60397976, 137297760, 100008312, 20435454, -82429552, 116239528, 50026168, 62649076, 142983760, 53582940, -22580254, 65940096, 46171972, -31615254, -62284004, 138097152, 65064460, 101812200, 220379072, 183271616, 173681504, 258810976, 239046608, 164758704, -143289776, 128441000, 48124572, -1900523, 6903623, -27049704, -86038392, -85689432, -98371392, -168444864, --188407328, -180655456, -202628496, -243159040, -212962192, -205905568, -219639792, -170103792, -114982720, -90008016, --56703768, 2044404, 22759032, 19047106, 31616328, 34708168, 17814450, 16254304, 31880468, 27560268, -18758270, 22564684, 26389890, 19977504, 25969520, 39737036, 43741556, 42039676, 49045304, 52041580, -43067784, 49382460, 45434848, 28339268, 14612552, 6326487, -397284, -5661841, -4162897, -4232691, --8332774, -8964670, -3345243, 4051765, 14475114, 20694764, 24975772, 25930328, 23259396, 23247584, -28804736, 27916214, 27014270, 31185220, 29529510, 21956410, 22815404, 21766358, 13243532, 10821707, -13297756, 6174553, -708133, -2150168, -9614821, -20323248, -21838298, -24748138, -34369404, -38190848, --35816808, -40867152, -43764644, -38876972, -38421704, -40087616, -35231616, -28348394, -26904748, -23046258, --16352014, -16281147, -15825881, -11970074, -8026757, -6051609, -550830, 4383014, 6077379, 8376797, -13872207, 18928458, 21829708, 25740812, 25997974, 23320062, 20241644, 18300318, 16487306, 14206141, -11686069, 9198746, 7044820, 5297306, 4930086, 4467303, 3384971, 2837363, 2339147, 1272921, -561567, 102542, -360240, -734439, -869194, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --4409858, -3595961, 3853123, -1881733, 3867081, -2391223, -550293, 5157719, -2161979, 2434173, 1473174, --5794985, -2631204, 4287988, -1717450, -861141, 2688113, 1765232, 1906429, 483721, 6626061, -1101122, -1742146, 1456531, -2331630, 4088809, -1217623, -2304787, -1015223, -5427765, -1854889, --4008278, 1274532, -105227, 1430761, -1628866, 2233383, 1030255, -274341, 653909, 336618, -483721, 703301, -2889439, 7094212, 1012002, -2619930, 5236102, -1293859, -4591857, -5017059, -4830228, -994285, -428423, 3197066, 323196, -863288, 2480344, -295279, 1420560, 396211, -1815697, -991064, 1980517, -934692, 2360622, 3462281, 1857037, -2085207, -2156611, -1064615, -898722, -2225867, 1514513, -1104344, 1889786, 2490007, -3156801, -1781875, 2680597, 787590, --898722, 4172561, 2391760, 1981054, -248034, 1085016, -123480, 540092, -523986, 619012, -208843, 284542, -992137, 1535988, 470299, 93416, -308701, 614180, 976031, -549756, -1053878, -78383, 4519916, 853088, 993211, 3787624, 1074, 2722473, 1269163, -354872, -246961, -3033858, 1351841, 200253, 4646081, 1622424, 1491964, 172336, 1340030, 5112085, --4908611, 2714419, 679142, -3244848, -1484985, -2024003, -698469, -1879585, 1255741, 5912560, -3694209, 4408247, 3479461, 6029597, 4367445, -5529771, -10024454, -1292785, 419296, -2461553, -5208722, -250719, 7825431, -3703336, -3736622, 3368328, 137439, 256624, 3068754, -5776194, -1428614, -4142496, 5401458, 3187403, -68183, 8256001, 320512, -813896, -1073742, -1475321, --2101850, 3899294, 2046552, -2036351, -708670, -5783174, -2582349, -780073, 5994701, 4107599, -692027, 3024194, 66572, 3222299, -41339, 1323924, -3507378, -2248952, 796180, 436476, --227096, -1767379, 1578401, 1896228, -530965, -1814087, -373662, 1912871, -347892, 1014149, --965831, -544387, -770947, 604517, -680752, 102005, -89657, 965831, -852014, 933082, -1411971, -694711, 300111, 114354, -75699, 1746978, -608275, 441308, -700080, 693637, -467615, 296890, -251256, 1537061, -122407, 76773, 607201, 1730335, 3673271, 8293045, -2466922, 408559, 304943, 2369211, 2216740, 537408, 1352378, 1912334, -76773, -129923, -2409477, 9375914, 3173444, 7324530, -4074313, -3323768, -1313723, -4330401, -5066988, -2001992, -3842922, -6273337, -828392, -700080, -9879499, 2041720, -9980430, -3292629, -1279363, 2429341, -91268, 2138357, -1899986, -54224, -6713571, 2536178, -2184528, -3738769, 777389, 1950989, --251792, 543313, 2963528, 5184026, -8584566, 2412698, 654446, -2510945, -2687576, -513785, -1264331, -1112933, -5134097, -1181116, 1488206, 2756832, -284542, 6500970, 644782, 329639, -2716030, -4095251, 6192806, 1990717, 3712462, 1661079, 3120294, -600222, -500901, 1845225, -1143535, -817654, -1764695, -1464047, -2969433, -52076, -4012573, 306016, 2472828, -181999, --1658394, -3180960, 2939905, -1680406, 1245541, 462783, -416612, -3027415, 345745, -264141, -842350, -912144, -792958, 281320, -891206, -1657857, -807454, -682900, -69256, -1087164, --91805, -612033, 1536525, -252329, -676457, -246424, 868120, -295279, -1196685, -1378685, -1590212, 35970, 237297, -869194, 4882841, 5339718, -209380, 5895380, 335007, -807991, -690416, 462246, -1136556, -90194, -4176856, -2393908, 3659312, 4318053, -5127654, -1243930, -2079301, -3422552, -9776956, 2396592, 3565897, 4207458, -2274185, -2608119, -3509525, 5287642, -6021008, 1014149, 2354179, -4780836, -3888019, 4477504, 1665374, -3588445, 6216965, -6291054, -1005559, 577673, 5827197, 2134599, -1334661, 936840, -2069637, 3199214, -7686918, -2285460, --11058467, -4829154, 5542656, -483721, 8519605, -1183264, -7182259, 4507568, 957778, -2936684, --376883, 332323, -2930242, 1883880, 5087926, 5760088, 121333, 2746095, -302258, 6556805, --3382287, 2828236, -654446, -127775, 177167, 2261837, -709207, 8208756, 789737, 733366, --1305670, 4832375, 1624571, -1644436, -3492345, 64961, 3279208, 1135482, 941135, -2156074, --141197, 656593, -359167, -578747, -619012, -1154273, 868120, 69256, 365072, 694174, -1709397, -685584, -1821066, 1975685, -557272, 193810, 13959, -237834, -257161, 783295, -695248, 957241, -369367, 893353, -46171, 517007, 867047, -205622, 90194, 759136, -1129576, 629750, 704912, 231928, 68183, 5929739, -8257612, -1213865, -5624797, -5835787, -1974611, 1032403, 11812234, 538482, 4293894, -10012106, -2460480, 2113661, -5244692, 3331284, -909996, 763430, 2818036, 3282429, 7721278, 3400004, -1319092, 2394981, -3973919, 1060320, -3066070, -289373, 570157, 3388729, 4392141, 10726144, 2029909, -1678795, -7471633, -383326, -5529234, -8817568, 886911, -713501, 2669322, -4454418, -5246840, 9283035, -6054830, 1861332, --454193, -5924908, 13437879, 3423089, 7009924, 3753265, 7672959, -1487669, -2990908, 4877472, --4627291, 3736085, -3702262, 2006287, 5268315, 2891587, -2467459, -465467, 2656974, -4782983, --3570192, 219580, -630823, 7942469, -4466766, -7538742, -1190780, 4099546, 6667937, -4232691, --7148436, -1611687, 9777493, 1245541, -77309, -3573950, 412317, -260919, 2972117, 3070902, --267362, 1440962, 1606318, -4854924, -1174674, 1600949, -303332, 2752000, 1050120, 229781, --2101850, -265214, -345208, 1025423, -393526, 2876018, -636729, -353798, -1520418, 273804, --1904281, 33823, -270046, 681289, 1637993, 10201, 1360431, -140123, -1791001, -391916, -98784, 936840, -3098819, 3641596, -12882754, 7384660, 2209761, -2842195, 3990025, -10522133, --8767639, 1195612, -4299799, 10058277, 8948027, 9500468, -6250251, 3723200, 199179, 9469329, -726386, 6708202, 2728378, -2771865, -8419210, -7641821, 2514703, -10198937, -91805, -2375654, --4915053, -6798933, -3956739, 102542, 8305393, 71941, 3277597, -11678553, -6481643, -1206349, --7282654, 550293, 7420093, -7918309, 3351685, -61203, -2653753, -704375, -1639067, 8132521, -4413616, 4069482, -1876364, -2434173, 11220065, -3342022, -2974802, -9165460, 6782290, -13025562, -1854352, -4265440, 2106145, 4664335, -3077344, -6941204, -4240744, 499827, 9530532, -4733054, --979789, -6120329, -4880694, 3082713, 3354370, 7497939, -8670465, -52076, -4561256, -3033858, -1899449, -3436511, -6796786, -3903052, -541166, 6299644, 6466074, 2229088, 407485, 945430, -2984466, 259846, 516470, 1336809, -1749125, 194884, 2712809, -784368, 374736, 3242164, --734439, -115964, 580357, 2360085, 46171, 370978, 919123, 404264, 2039573, -2332704, --2523293, -172336, -881542, 26844, 1502702, -630823, 2723546, 1773285, -11988864, 3309272, -1187022, 2097018, -16535624, 14922327, 379031, -249108, -219580, -5315022, 1818382, 269509, -5388574, -4575214, 6032819, 1780801, -3640522, -6315750, -7926362, 4092567, 782221, -612570, -621160, -4534412, 5054640, 3801046, 9266392, 5544266, 3707094, 5152350, -1128503, -4997732, --3732327, 382252, -2602750, 4053912, -4419522, -6717866, -7380365, 511638, -10122164, 4727149, -5400922, -6019397, 6283537, -7285339, 3762928, -10783052, 1529008, -1924145, 860067, -2816425, --97711, -10027138, -1626182, -3406983, -6342056, -1650341, -4940823, 1659468, -4446902, -2531346, --6411850, 2928631, -6128919, -388158, 9987946, -1625108, 357556, 3289408, -2146410, -10014790, --11440719, -1851668, -7981660, 463856, -2134599, 7566122, 605590, 2888366, -7518341, 735513, --1651952, -1311576, 5532455, 1423245, -597000, -2916820, 1543504, 2192044, 824097, 2953864, --68183, 1678259, -813359, -231928, 478889, 571231, 1080184, -209917, 3230889, -836982, --2668249, 1183264, 9127, 887985, 1096290, 746251, -351114, -1327682, 852014, -2384244, -991064, 4900021, 3397856, -10203232, -221191, 1941862, -9490804, -10819559, 6082211, -10619844, -2190970, 7256884, -5090073, -12221866, -5169530, 398895, 8250096, -3194919, 14467060, -881005, --1014149, -8176544, -5767604, -871342, 3017752, 914828, -2843268, -2384244, -551366, -2986076, --6030134, 5167920, -4976257, -3020973, 5504001, 1695975, -8559870, -9135395, -8377334, 7444789, --7783555, -8434242, 14039711, -8643085, 6260452, -1124208, 3872450, -12466679, 5859946, 813896, --1932735, -526134, -2344515, 4150012, 3081639, 11923903, -2879776, -2160369, 5719823, 11523934, -3247532, 2389613, -5315559, -3495030, -9329206, -1923072, -140123, -21475, 6932614, -2074469, -3753265, 12053289, -1743757, -365609, -1298691, -163209, -12079596, -13846975, 807454, 9255118, -212601, -18406620, 4928475, -6400575, 3202972, -11471321, -7082938, -1736241, 432718, -4166118, -1956358, 4323422, -423054, -515396, -308701, -1921998, 1997697, -2200634, 1988570, 331249, -711891, -1917166, -1255741, -2697776, 1373316, 241592, -763430, -2589865, -496069, -752156, --1602023, -1909650, 1273995, -2177549, -766115, 1918240, 649614, -1042066, -81068, 82141, --2738579, 322659, -1707250, -2245194, -162672, -576599, 5097590, -863825, 6038724, -930397, --2567854, -3707094, 5122286, 3160022, -2865817, 2324114, 5212480, -2744484, -17769354, -7734163, --3494493, -1983738, 7922604, -13931263, -10229538, 8537321, 5291937, 21496312, 6054294, 4949950, -5905043, 2719251, -3861713, 422517, -4067334, 6842957, 299037, 6907918, 201327, -205085, --9447854, 4887136, -6412386, 4963372, -992674, 5206037, 2056753, 6991133, -10931766, 1269163, --7586523, 9104257, 547608, -9154723, 12078522, 8930311, 5732708, -5487895, -18417894, 5293011, --2007360, -2291365, 9012989, -878321, 4167729, 8713415, -1933272, -11064373, -98247, 4955856, -3221226, -2973728, -1236951, -8109972, 3008088, 1106491, 1709934, -1219234, 1143535, 6975027, --4350802, 3182571, -1152662, -265751, 12562779, -3377455, 5767604, 4145717, -3969087, -4420058, -1560147, 948114, -2123325, 1059246, -2210835, 2025614, -1976222, 4785668, 425202, 4575751, -868120, -115964, 5748814, 2044941, -1717987, 1619203, -1362578, -1794760, 822486, 2294586, --2192044, 1464047, -1138703, -2235531, -116501, 2289755, -1068373, -2488934, 751082, -1162862, --3871913, 1670742, -5906, -1968169, -1180579, -645856, -2201171, -179852, 2836289, 4100620, --3893388, 530965, 4539244, -5114769, -20094542, 4049617, 4835597, 20276004, -4303557, -3308199, -9574019, 12583180, -20623360, -11783243, 11207717, -5883032, 339302, 4572530, -13148506, -28760712, --11312407, 16285979, 12945031, 10945187, -3371013, 6119792, -3386045, 5632850, -6017786, 1959042, --14522358, 3513283, -5144834, 7391102, 7191386, 215822, -6869800, 6726456, 4235912, 11640972, --1235340, -7285875, -3635153, -18435610, -9431748, 4474819, -1255741, -12361453, 8341900, 11429445, --16274168, 15678241, -1523103, -1767379, 9860708, 1994476, 9322763, -1267552, 3320547, -3595961, --1920387, 4690105, 18756122, -6832219, 11934640, -1046898, 1097901, 4455492, 10390600, -9667435, -1098438, 15211700, 4531191, -7038915, 4045859, 5979668, 1387811, 11943230, 8643622, 15024869, --1384053, 4274566, -157840, 475668, -8402567, -5869610, -6684580, -3281355, -33823, -1453310, --2716567, -2440615, 4482872, 6465000, 2969433, -3413425, 5229660, -1584306, -856846, -3204046, --2544231, 3253975, 1083406, -1258962, 197569, -3550864, -2975339, -3495567, 67646, -1979980, -3049964, 1817308, -1303523, 1292248, 3575024, -2252174, 1643362, 2026151, -1912871, -1793149, --2035278, -399432, -581431, 2157684, -752156, 304406, -934155, -13071733, -3333432, 13481902, -8565775, 10162966, -6597607, -3332358, -1059783, -1428077, 14446659, 1860258, -14860587, -6632503, --4543002, 9525701, 1862942, 2043331, 8099772, 17718350, -26203596, 17369384, -3449933, -3112778, --6772090, 5158793, 5349382, 10201084, 1591285, 9720585, -1006633, -2614561, 3023657, -1644436, -4976794, 8934606, 1063004, -692027, 11774116, -8771934, -1624571, 2854006, -1023276, 10356777, --12247099, 1096290, -10479720, 1683627, -11110544, -1591285, 345208, 6071473, 15053324, -8804683, --4836133, -9127879, -528281, -13331042, -8644159, -8775155, 5907728, 10842645, 140660, 21508122, --13653164, 19216220, -13566191, -3204583, 5942624, 4344897, 19082002, 10963441, -14284524, 7431904, --5987722, -19788524, -493921, -12559021, 15785615, 23941222, 15262166, -3017752, -8492224, -3170223, -13418552, -2037425, 6995428, 769873, 3102577, 4694936, 1503775, 1842541, 1586454, -5898064, -4068945, 25233, 1719061, -2306398, -1926293, -5603322, -3106335, -1962263, 3417183, -1751810, -2291902, 2837363, -1090922, -761283, 79994, 3237332, 2091649, 1167157, 6135898, -145492, -6410776, -5751498, -2512019, 4068945, 3976066, -2440078, 1362578, -2056753, -4159676, 435939, --1474784, -13663902, -8779987, -344671, 16441135, -3273839, 7224672, 15262703, -13073344, 5506148, --20855288, 12444131, -12837120, -6340446, 20004348, 6707665, 21573620, -9386114, 38655, -9943386, -6160594, 27683748, 7034620, 9298604, -14161044, -2826625, 583042, 10570451, 9344775, 17666274, --14589467, -5168457, -15867220, -13503914, 881542, 953483, 9219147, -9262097, 6421513, -21532282, -13302051, 10042707, 4720706, -3769908, -2647847, 1246077, 6248641, 1960116, 1676111, -255551, -14432164, 12320651, 5270462, 970126, -11133629, -10995116, 29908542, 964757, 3629247, 16590385, -7289633, -4886599, -3656091, 10500658, 21501680, -15816754, -6648073, -17805324, -16532403, 21007222, -9343164, 73551, -4276714, 6869264, 15963857, 10124849, 16474958, 4495220, -7534983, 11887396, --8717710, -22146998, 6386080, 649077, 246961, -85362, 9096204, 15791521, -3372086, 8294656, -9252970, 8393440, 882616, 1757179, 8092792, -30602, -2675765, -1934346, -3583077, 7894687, --4801237, -1472100, 1881733, 4397510, 516470, -879931, 8433705, 1658394, -1963874, 6323803, -8058433, 3644817, -3571265, -168041, -1685238, 2391223, -73551, -104690, -380105, -2024540, -2703682, 969589, 569083, 2653753, 3499862, -776852, -4135517, -1670205, -668941, 4711043, -1544578, -3517041, 1048509, 1822677, 5025649, 2179159, -437013, 4702989, 76236, 2425046, --1969779, -64961, -185220, 813359, -685047, 6516539, -14008036, -10451266, -4101157, -13019656, -14673756, -1640141, -3744138, -12393128, -2069101, -11535745, -28617368, 4987531, -3531000, -9008157, -6460168, -15155329, -930934, -8272644, -22950158, -5233418, -9965398, -10844256, 18315888, -4883915, --6637335, -3310883, -443992, -4628364, -6499896, -1016297, 4810364, 15538118, 11662984, -420370, --934155, -26011932, 1557463, 3578782, 10637560, -5988258, -5448703, 39522288, -6827388, -19288162, --18808198, 16405701, -11019275, 4752918, -22289270, 5559299, -6292664, -11873437, -10345502, -25267292, -4003447, 7292855, 17923972, 5323612, -9808632, 14208289, 1606318, 13368623, 14747844, 42739756, -11376295, 3002719, -16688632, -18570902, -5089000, 2025077, -2464238, -16801912, 7472170, 19580220, -4417374, 13940927, 21428666, 19338628, -8295730, -15397995, -10667088, 1408749, 3308199, -1843078, --16510391, 3212099, -13453985, 4128537, -6045704, 923418, -7494181, 4886599, -1360968, 3128347, -255551, -3086471, -7669738, -1672353, -340376, 4460324, 5945309, 4877472, 6871948, 463856, -5850819, 10579041, 74625, 2054605, 5735929, 2105071, -5518496, -2983392, -9272298, -2622078, -5251135, 3144990, 462783, -1138166, 3239479, 2001992, -2143189, -4180077, -8163659, 1103270, -1009317, -1068373, -2845953, -537408, -3060164, 1596117, -5761162, -17280800, -7495255, -2703682, -5287105, -6337761, 10224707, -5359046, -7093139, 19887310, 10326175, 22620520, 259309, -6611566, --8969502, 23985782, -20657182, -7727183, 27999428, -16940962, 5575405, 5805185, 7245073, 1618666, -15723338, -4942434, 14148159, -5405217, 3074123, 3359201, -7317014, 10502269, -15982647, -11138461, --10380936, -4789426, -14209899, -26171384, -4786741, -7858180, 4131759, -6767258, -34764540, 9626632, -21794274, -1290638, -4669703, 34121904, -42335492, -9186398, 23572928, -5814849, 18287434, -13483513, --8376260, 6326487, -40404904, 13032541, -13776644, 20163260, 14810658, -21497386, 42349988, 6225555, -2222109, -2199560, 16672526, -30687542, 12526809, -1468879, -4893042, 8191040, -19842748, 28026272, -25438554, -47084652, 6737193, -9392020, -44196824, -7630010, -19746112, 10847477, 2761664, 7633768, --17860622, 27698780, -2741263, -7463580, 12779138, -553514, 9069897, -1959042, 14334990, 325881, -7132330, 2210298, -660888, -1547262, 7999914, -5830418, -6556268, 126165, -7697119, 11462731, --2539936, -5968931, 584116, 5265630, 2503429, 5431523, 2078227, 13303661, 3119220, -7259569, -13774497, -7508140, 7819525, 11876121, -3358128, 2658048, 8303783, -5761162, 435402, -7509214, -8118025, 1165010, 25794500, -11758010, -33597380, -33707976, 2518462, 4023311, -14899778, 8623221, --18816252, 5856725, -8607114, 17134772, 21986474, 585726, 21267604, 19339700, -10965588, -409096, --13988172, -3610994, -3390340, 7385733, -1497870, -2269890, -2459406, -22560926, -34053720, -13768591, -17564806, 13553843, -14688788, -16874390, 9641665, 9774809, -22193706, 10997801, -14810658, -2864743, -16935592, 23570780, 37581, -14173929, 8943733, 1681480, 14642080, 2435783, 12197707, 12599287, --3718368, -48724256, 5383742, 1153736, 19543174, -7280507, 19934016, 19759534, -13418552, -65978212, --8951786, 2579665, -8031052, 39494372, 41441064, 28875066, 41178000, -10798622, 19301584, -16407312, -27484032, 19230716, -32639604, 40980968, -42603928, -36303212, -34227668, 10732586, 25551834, 21257404, -7056095, -26759794, 24490440, 3317325, -8945880, -11521787, 1341104, 23117662, -18083422, -7301445, -35374424, 6451041, 16115791, 3003256, 1611687, 8633421, -13521631, 7115150, -5595269, 164283, -3519189, -3533148, -7067369, -4689031, -6203007, -13587129, 2898566, 12389907, -2615098, 12670154, -9772124, -8296266, -6608344, -6181532, 7768522, 4842039, -16576426, -9645423, 718870, 687195, --2593087, 2063732, 10637023, -384936, 8424041, 766115, -6505265, 4085588, 14106820, -26162256, --49355616, 10287520, 18090402, -2727304, 24896314, 9489730, -31164820, -7918846, 6529961, 7573638, -8476655, -6358699, 14327474, 1151051, -9356586, -4330401, 5049271, 20422032, 26665304, 20138564, -31994822, -30923764, -8646843, -8083129, -31637802, -7646653, 5343476, 1526324, 3425773, -12657269, --14315126, 15959562, 35963372, -17148730, 18521510, -12265890, 4751308, -11320460, -2014877, -28193240, --10325101, -1699196, -39023000, -22859964, -38194072, -32266478, 21225728, 50140520, 39994736, 1073205, --2619930, 29528, -9134322, -17384954, -61022896, -20473036, -8842264, 4860829, 2502892, -21609592, --15130096, 7787313, 26702886, 15877420, 8533026, 17415018, 29959008, 11655467, -30211336, 22908818, --17942226, -9460739, 17721036, 40022116, 8522289, 51348480, -12399034, -53645752, -6317897, -17404818, --32945620, 49359376, 13907104, 15967615, -238908, -4540854, 14175540, 11681774, 538482, -2145336, --8741332, -1875827, -2705830, 13379360, 16175384, 19366008, -2379949, -871878, -952409, -863288, -12621298, -5647882, -4460861, -7675107, -6071473, 7102802, -1671279, -401579, 1979980, 4462471, -7331509, 9126269, -1491427, -5708549, -9866077, 4649839, 1613297, 4369056, 11875048, 10394895, --5574331, 2471217, 5231270, -9597641, -3101503, -2371896, -9245991, -4376035, -620086, 7954817, --13295071, -20837570, -34230352, 21442624, -3180960, -20610474, 10181220, 22728966, 19699942, -40018356, --34553548, 8820252, -15973520, 4264903, 19795504, -10531797, -7730405, 32627256, 8960912, -4376035, --10186589, -9072045, 12333535, -7161321, -1290638, -812823, -13079786, -4967130, -21860846, -29147796, -10597295, 16129750, -18362058, 13660680, 9383967, -6252936, -12699681, 2113124, 23284628, 13466870, -4301947, -23033910, -25784300, -12493523, 7133404, 29148332, -21614960, -11380053, -9757092, 17459578, -46875808, 12505334, -45589468, -10028212, -5251135, 23609972, 657667, 12291660, -5843840, -10714870, --10001905, -25759066, 24254218, 25691958, 10426570, 27155468, -8338142, 17607756, -7975755, -19379966, --21468930, -22956064, 4202626, -43091408, 45439680, -2005750, -17088602, -24861956, -20327544, -1258425, --13269301, -3922379, -23667418, -14567455, -42147588, -11638288, -27728846, 10389526, -9771051, 8351564, -9594957, 10279467, -6867653, 23480586, -5187247, 17042430, 744103, 4193499, -1202591, 7481296, --3494493, -9243306, 2037425, 2805151, 8815420, -13860933, -4770098, 3730716, -13673028, 160524, -5170067, -17110612, -7430294, 4228932, -2280628, -13085692, -20287278, -12146168, 7562364, -3775276, -9475235, 2359548, 474594, 13939853, 1072131, 12001212, 4721243, 7512972, 27880780, 16729971, --7697655, 4320200, -9594957, 470836, -4495220, 35093104, 26348550, 10092099, 5232344, 16529719, -14982993, -23772108, -34270616, 11697343, 26826366, 38359428, 244276, -8560407, -23914914, -14054744, -16135655, -447213, -20411296, -41206988, -41181220, 8695698, -12362526, 23124104, -47449724, -15676631, -9261560, 6840809, 9066676, -15022185, 6925635, -1272384, -8887361, -1767379, -22248468, 20557860, -25393458, 18847928, -29963302, -16036871, -678605, 10173167, 15130096, 16151225, 12999255, -3395172, --2087354, -4067871, 21517250, 59540056, 37665788, -31010200, -30431990, -19396610, -39217884, 46275052, -24761560, -14352170, -40678172, -39060580, 44493712, 27307938, 6037651, 34160024, -35403952, -3940633, -2299418, -9161165, 3565360, -13244605, -35804996, 8900246, -27338004, 36685464, 34827352, -13277355, --6046777, 370978, 4109210, 39037496, 40109624, -63418952, -35214972, -20404852, 8138426, 17770428, -17388176, -24598888, -26175142, -31156230, -3681861, 32219234, 894427, 6375879, -7181186, -34462816, -8118025, -14479945, -17818746, 7814156, 60477436, 20329690, -11082626, -15495705, -14236206, -11976516, -16041166, 18769544, 21984864, -3970161, 14267881, -21384642, 5383205, 7721815, 9944997, -7736310, -4385699, 17765058, -4385699, -5110474, -2741800, 17532056, 11678016, 27328876, 7149510, -9809168, --7109782, 10080825, 34120292, 27504970, 6009196, -20379082, -24721294, -8115341, -5741298, 5845988, -2683281, -10107669, -12418898, 23341536, -38104948, 33253784, 49027052, 53202832, -59936804, 11034308, --1861868, -5133023, 25401510, -10813117, -17797270, 17588428, 8965207, 36461588, -3714073, -28852516, -873489, -13163001, 21538188, -33155536, -11742441, -15579994, -22094922, 30280056, -22143778, -3144990, -20852604, 12106976, -7350300, -11582990, -31032750, 4011500, 40881648, 24897388, -1756642, 12156905, --9220758, 33390686, -22506702, 15422691, -12422119, 20740398, 34473020, -7662759, -22389664, 11050414, --30534534, 50571092, 5932961, -26847304, -9189083, -41884520, 5342403, 59974924, -10921565, -35302484, --24649892, 36764384, 10985453, -19320374, -978716, 9465034, 20638392, 50527604, -41229540, 18353468, -41436232, -6295349, -48959944, -47436304, -27755690, 83027624, -60772176, 20567524, -64005212, -30798674, -133728640, 12826920, -58290224, -56055764, -64561948, 81420768, 10511932, -15443092, -64689188, -15585363, -20245402, 65876744, -23607288, 7126962, -28483686, 9749039, 40065604, 24366960, -35791036, 16853452, -6603512, 15461882, 13814762, -36435280, 1279900, -8696235, -13726715, 7145215, -13307956, -26882738, -10330470, -7979513, 34929360, 5116380, -32044214, -36728412, -11617887, 936303, 28182502, 21070572, -5007932, -17192754, 7307350, -799401, -13540421, 881542, 17980880, 15646029, 3974455, -27116276, -6837588, 10430865, 17226576, 15097347, 11129871, -5366562, -17428978, -6731288, -4053912, -5556614, -8462696, -14344117, -3867618, -5180268, -6699612, 21807696, -56304872, 9904731, -50585588, 22379464, -23964306, 47298328, 20949776, 10868952, 12394739, -14703821, -36109400, -25110526, -23703924, 10161893, -5915781, -6132140, 21636972, 33363306, -14892262, -20917028, 23177254, 4140349, -30816928, -7071664, -13991393, -25420838, -4473209, 5642514, 12974559, 6925098, 18340584, 31426276, 5566278, -20007032, --2294586, 6070400, -15889232, -7092065, 14701136, -11135776, -20124070, 28033252, -6742562, -6921340, --11132555, -10992969, 18175764, 4645007, 4166118, 24195698, -11540577, -18660560, -1068910, 1816771, --7907035, 6200859, -1300838, -6634651, -1188632, -23536958, 5267778, 4630512, -3992709, 12709882, -8585103, 4453881, 5689758, -24310588, 28819768, -10770704, -10408853, 8842264, -26331908, 8594766, --19716584, 2313914, -15595563, 5087926, 6896644, 10682657, 965831, 9477382, 14283451, -5492190, --3207804, 7931731, -470836, -5003100, 4361540, 1024887, -3275986, -5034239, -4574677, -3016678, -10314901, -9833864, 10005663, 703301, 2720862, 5015985, 2988760, 7298223, -394063, -181999, --4440460, -966368, -6124624, 12402792, 919660, -5538897, -9051644, -2946348, 4810364, -8841190, -11753178, -5687611, -14908368, 864362, 6334003, -848793, -430034, 1547262, -7047505, -4254702, --26296474, 42213088, -2301029, 23848342, -21853868, 2581275, -4047470, 7456063, 6730214, 12729209, --6668474, 9337259, -5986648, 5093295, -1056025, 4005057, 10096931, -1380295, 15720117, -6478422, -11849815, 510564, -619549, -4595078, 7547332, -6219113, 6806987, -4193499, 371515, -3499325, -3675955, -2879239, 8891656, -2930242, -6422050, 14314052, -10095858, 7427072, 5963025, 2100776, -6883759, -8967892, -6255620, 6505265, 6084358, -4013647, -942208, 6944962, -744640, -9967008, -4221953, -5123896, 4954782, 6739878, 3121904, 2229088, 2110977, -10719165, 5069672, 2866354, --3312494, 3758633, -5102958, 2298881, -2596308, -602906, -1449552, 3579318, 7020661, -10007274, -8710194, -1866163, -3598109, 4952634, -6995965, 3142306, 4734665, -1316944, -2611877, 3266323, --1466195, 1868848, -1043677, -3641059, -661425, 3662533, -1122060, 1341104, -898185, -2703682, -1552094, 1405528, 2547453, -3866008, 2884608, -380641, -1669669, 3425237, -4087198, 6073621, -3031710, -2446521, 6199249, -609885, -2621004, 126702, -2618856, 3655017, -4262218, 4210679, -1627793, 2208687, 969052, -2618320, 1970316, 851477, 370441, 270583, 51540, -1138703, -1015760, -2731599, 3048890, 1146219, -3105261, 10505490, -35705136, -111235896, -16381005, 53992572, -27906550, 131262256, 24379844, 28213104, 17726940, -35378184, -49851148, -35498980, -63896764, -54886996, --31175556, -12775917, 36496484, 99694248, 79027400, 68106904, 38662220, -30687004, -49984292, -36739688, --68867120, -65174520, -20052128, -9148280, -15282031, 25267830, 39439076, 26139170, 48110612, 37243808, -11314018, 34258808, 6896644, -5091684, 3068217, -20649666, -54427972, -46187540, -39347268, -55077048, --23168128, 16093779, 10959146, 35275640, 39829916, 34910568, 35717484, 36592048, 23077396, 22679038, -2370822, -20318954, -38086696, -25915296, -35862440, -47240884, -23390928, -21665962, -17772574, 6702834, -17804250, 17169132, 33282776, 41767484, 20075750, 29451128, 24999930, -6954089, 2790655, 11319386, --13993540, -12533788, -22375706, -39969504, -40281960, -31855772, -33148020, -6450504, 13770202, 9309878, -26182120, 39493836, 30984430, 28775208, 29407642, 19753628, 6371047, 1910724, -9266929, -17143898, --18609556, -27480812, -34964256, -37014028, -32044214, -28596430, -16495359, 3760244, 17976586, 41459320, -54621784, 48119204, 39703216, 33872796, 19422378, 4161823, -17011292, -34704408, -47583404, -49632104, --54958940, -40343700, -17002164, -4183298, 11357504, 32729798, 41998336, 45558328, 46680924, 39243116, -16462610, -1105954, -12227772, -26508538, -34762928, -32407138, -29035052, -20714090, -8677981, 1166621, -11362336, 15033459, 11312407, 12700218, 9842454, 6940667, 5160940, 5612449, 1630477, 1927904, --704912, -2715493, -3616363, -2928631, -4643397, -5155572, -5890011, -4970351, -4926865, -3838090, --2816962, 416612, 1785096, 3362423, 4625143, 6303938, 5869073, 5486821, 4158602, 3415036, -1660005, -222801, -2260764, -3211025, -4683125, -5371394, -5515812, -4553202, -4558571, -2728378, --954020, 1069447, 2522220, 4196720, 4169876, 4653060, 4553202, 4736275, 4203699, 2286533, --846645, -2369211, -4050154, -4757213, -4413079, -3476239, -3455301, -2323577, -1741609, -461709, -772557, 2214056, 3180960, 4277251, 4177393, 3694209, 2515240, 1178432, -209917, -959925, --2129767, -2925410, -3491809, -3375844, -2894808, -1573032, -515396, 761820, 1632088, 2141578, -2193118, 1863479, 1089311, 905701, 479426, 188442, -266288, -522375, -768262, -783832, --811749, -644245, -504659, -276489, -158377, -15569, 23622, 133144, 138513, 161061, -100395, 93416, 76236, 71404, 74088, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --3562139, -2681133, 1685775, -3515968, -622233, 4472135, 1325534, 1097364, 2467996, -594316, 673773, --1175747, -4686883, -1853278, -233002, -1045825, 1347009, -1463510, -453656, -3983045, -3758, -669478, -2800319, -625455, -3535295, -1275068, -1124208, -4299799, -1963337, 1344862, 1869921, -4780299, 2845416, 6111202, -661962, -1021129, 901943, -2137820, 5334887, 290984, 2522757, -4202626, 745714, -1737314, 1734093, -2285460, -2998961, -783295, -1294396, -1692754, -5543192, --1826435, 30602, 833224, 1659468, 428960, 2825015, -3183645, 2493229, -57982, 624381, -1721745, -2185065, -4944044, -2108292, 2047626, 3071439, 2283312, 202400, 2327336, 1804423, -3179887, 1627256, 1347009, -2121177, 120796, -336618, -474594, -1803886, -2288681, -958851, --566936, -193810, -1777580, 25770, 197032, 686658, 109522, 1254667, -723702, 578210, --1134945, -1621350, 755914, -224949, -95563, 1149978, 738734, 1009854, 13959, 110059, --1004486, 577673, 116501, 349503, -200253, 1555852, -392453, 99321, -725850, -522375, --809601, 671089, -570157, -1389959, -891206, -2522757, 2493766, -3905736, -2381559, 6417755, --983011, 5679558, -2831457, 597000, 2833605, 1289027, 234613, -3730179, -5312875, -5543729, -651224, 193810, -1534914, 809601, -4902705, 9912248, 1163399, -5434744, 1508070, -2822867, --3081102, 2992519, 4229469, -11274, 988916, 2048163, -255014, 72478, 3330747, -1749125, --754841, 247497, 6025839, -67646, -652298, -2208150, -3485366, 1893007, -824634, -3575024, --1591285, -4314295, 632434, -3908420, 135828, -2947421, -944356, -2586107, -5442261, -2199023, --299037, 5231807, 807991, -1448478, 2870112, 4794794, 761283, -6410776, 3020973, 33286, -1252520, 2173254, -1458141, 4146254, -1998770, -3606699, -3768297, -6702297, 675384, -2255395, --2353105, -2993055, -3143916, -135291, -3433826, 1150514, -500901, -1926293, -689879, -2182380, -89121, -49929, -2515240, -1015223, 1078037, -324807, 206158, 621697, 280247, 485331, -364535, -648003, -2250563, -366146, -820339, 690953, -254477, 316217, -400506, 64425, -2147, -451508, -1400696, -1136556, -158914, -476741, -518617, -419296, -1042603, -354872, --4859756, 8383240, -1984812, -7423851, 673236, 2673080, 335544, 2472828, 2030446, -5852967, -2225867, -1279900, -144418, 352724, -992674, 4661650, -1308891, -2842195, -162672, 3750580, -2384781, 1465658, 2233383, 8931921, 2421288, -2907156, 4075387, -3573413, 1315871, -2859375, -8380018, 1413044, -2607045, -1503239, -2614561, -815507, 5587753, -4266513, -3612604, -1003949, -4641249, 2735357, -4127464, 1315871, 1034013, -2340757, 204548, -8900783, 3085397, -1953136, --1643899, -5596343, 8754217, 612033, -4447439, -3428995, -4364224, 467078, -884763, 610959, -45097, -5078799, 6941204, -3754875, -3490198, 2847027, 803159, 2829847, -1861332, -276489, --4162360, 513249, 988916, -5241471, -3944928, 525060, -3679176, 1483911, -3285113, -813896, --882616, 2524904, -4262755, -4358318, -858993, -577673, -1013612, -153008, -1879048, -353261, --1352915, -1023813, -857920, -1260573, -1639067, -11274, -2220498, 747324, -1456531, 139050, -197569, -401043, -805306, 30065, -552440, 1323924, -128849, -840740, -9664, -1600412, --295816, -920197, 133681, 392453, -1156957, -1351841, -337155, 7232188, 261456, 1592896, --5911486, 1866163, 3460133, 2530810, -208306, -2950643, 7779260, 1378148, -1497870, 3743601, -3076270, -3585224, 4786204, -3156801, 7864622, 1138166, 7024956, -732829, 1279363, -2708514, --7851737, 882079, 212064, 297427, -1314797, 1651415, 4223564, -1022739, -4005057, -2662880, --5717675, -1573569, -2787434, -3030636, 586800, 2009508, 3191161, -3690988, 2647311, -2464774, --3027952, -398895, 2709051, 514322, 717796, -5754183, -5505611, -1039919, -1588601, -4204773, -9259949, 4282083, -516470, 1785633, 3761855, -9264781, -4626217, 6233608, -3400004, 5847061, -1394254, -1205812, -6154688, -4585952, 7475391, 3930432, 7073275, -7345468, -435402, -5093295, --331249, 1818382, -2641405, 869731, 622770, -4574140, 4191888, 462783, 703301, -745177, --8070781, 885837, -1879585, -2566243, -2467459, -494995, 1503775, -1315871, 719407, -2871723, --518617, -1318555, 1923072, -358630, -129386, -937377, 158914, -980326, 721018, -1627793, --679679, 525597, -363462, -111669, -2684, -24159, 854699, 457414, -32212, -1149441, --1076426, -1246614, 1168768, 468688, 1657321, 796716, -574989, 673773, -12133283, 627602, --1573569, 3263102, -7349226, 2326799, -2490544, 12228846, -3266860, -6365679, -2340757, -5342940, -1641751, 4526896, -1468342, 8541079, 858993, -2546916, 2045478, 1023276, 2211908, -3054796, --552440, 3165391, 5007395, 1968169, -1021129, 2390686, -4505958, -1421634, 6301791, 4496831, -7402913, 5244155, -142808, -3798362, -7933342, 5440650, -883690, -5795522, 2978560, -1548336, --8883603, 208306, -7408819, -610422, 6664716, -1158567, -4988068, -2313377, 6364605, -5556077, --9069360, 9164386, -1748052, -2258616, 2137820, 1141388, 1073205, 2184528, 2199560, 1197222, --6686191, -2560338, 5140539, -722091, -1992328, 1533303, 8835285, -4512937, -4924180, -2268280, -3611531, 1815161, -7987029, -3571265, -2754148, -3504693, 2611340, -498753, -612570, -2990908, --2358474, -6336688, -3639985, 1496259, 201863, 977642, -260919, 3712999, 3864397, 651224, -1408749, -1969779, 441308, 159988, 1578401, -2420214, -1097901, 272194, 55298, 1091995, --46708, -1386201, 1391569, 491237, -2654290, -545461, 771484, 450435, 456877, -692564, -357556, -1320166, -1270237, -1131187, 680215, -595390, -644782, -221191, -10695005, -296890, -2770254, 10158135, 10498511, -3476239, 5191542, -6869800, 2164127, 4425427, 6717329, -2049236, -10110890, -1985886, 8564702, -4791573, 7163469, -3708168, -12112882, -2804077, 2930778, -4225174, -4571993, -2676838, -2968359, 1232119, -13271986, -4336843, -350577, -2364916, -872415, -6448357, --2282775, -2346663, 2018098, 13380434, 7672422, -7893613, 4195646, 10686416, 2585570, -3844533, -2598455, -2909304, -3286724, 7674033, 5304822, -5455146, -808528, 5451924, 11454678, -3782256, -6192269, 17063368, 7286412, -7961796, 3105261, 1925219, -9629854, 1364726, -7973070, 3460133, --8681203, -2088965, 271120, 4002910, -5695664, -1613297, -2866891, -5159867, 6505802, 5603322, --395674, -3796751, 935229, 949188, 847719, 1535451, 4810900, 908386, -6597607, -164819, -7827041, 202937, 1691680, 1551020, 2313377, -2509872, -1235877, -4006668, -1772748, -3688840, --388695, 2138894, -561030, -2101313, 1073742, -449898, 370441, -1149978, -860067, 1446330, --198105, 3499325, 774705, -772557, 1771674, -62277, -918586, -1345399, -1885491, 770410, --1041530, -494458, 828392, -99858, 1556389, 90194, -2253247, 4655208, -2326799, -10760504, -2470143, -8645769, 1383516, -2870649, 11156178, -5678484, 1563905, 2929168, 1095217, 4045322, --1654099, 12215424, 945430, -7935489, -1488206, -5853504, -950798, -1910187, -5486821, -6879464, --1778653, -4433480, -2106145, 7813083, 2892661, -6619619, 2564096, -7904351, -1512902, 5737003, --10794327, -9522479, 5397164, 5077725, 2618320, -333397, -6564321, 2583423, -3247532, -6193343, --2877628, 322659, 1935957, 10222559, -4057670, -1171452, 519154, 4758824, 2490544, -3560528, --4599910, -8222178, -2529199, -1834488, -4539781, -5280663, 3329137, 6822019, -59593, -4388383, -7545721, 1438814, -3765076, 913217, -1136019, -1001264, -2637110, -1494112, 4887136, -3927748, --5891085, -3397856, 3037616, -4552129, 7973070, 3565897, -1354525, -3304977, -3757023, 2255395, -4939750, 10167798, -2977486, 5193689, 140123, -39192, 523986, 1615445, -1911261, 26307, -1224066, 2123325, -1380295, 1479616, -1191317, 4916664, 1848983, 3691525, 7516, 2501819, --171799, 2217814, -482647, -226023, 2572686, 966368, 278099, 1361505, 267362, 2558190, --1954747, 581431, 1722819, 2348810, 2003602, -813359, -2666638, -67109, 1605244, 332860, -255014, 2105071, 5546414, 10596758, -7931194, -293132, 7211250, -3474629, -5203353, 6629819, --10501732, -657130, 1922535, -1380295, -3927748, -4632122, -2236067, 1799054, -578747, 5004711, -2513093, -1694902, -4010963, -2932389, 8247411, 307627, -10117332, 4694400, -6405944, -6279242, -3823595, 7260642, 7402376, 5614596, -194347, 3789235, 2573759, 3576634, -3326452, -183073, --3000572, -7288560, 3043521, -1893007, -412854, -1619740, 693637, -1217623, 8020315, 14931991, -2448668, -2607582, -57445, -10692858, 10349261, -7296076, -4737349, -7021735, -8596377, 14514305, -782758, -8091719, -2936684, 10010495, 5158793, -7614977, -5690295, 11476689, 918586, 1171452, -14849849, -7113003, 4073240, -5346161, -14755360, 6914898, 7092602, 1170916, -8521215, -1210107, --1855963, 1747515, -3701725, 5384815, 3318936, -11675869, 4945655, 5573794, 7117298, 1218697, --6240588, 10415296, 1764158, -937914, -805843, -3507915, -3682398, -1331977, 655519, 3137474, --11811, 246424, -339302, -2813741, 1176284, 1253594, 553514, -1296006, -775778, 2097555, -751082, 2390686, -1569274, 556735, -3656628, 405874, 3448859, -4632659, 640487, -3631395, -4217658, -1765232, -97711, -2829310, -17180, 2433099, -290984, 3321084, 11274, -952946, -2408940, 5088463, 6485938, 11972221, 10969346, -375273, 9361955, 4240207, 9545565, 9224516, --15173583, 5579163, -4867809, -6529961, -4745939, -1379221, -9652939, -1975685, 2439005, -8246337, --16988206, 3959960, -1136019, -15300821, -11210938, -10002442, -5557688, 608812, -2820720, 3709778, --1962800, 6168647, 11978127, -6758668, 4117800, -2619393, -5391795, -3909494, 792958, -1105954, --426812, 8938364, -300648, 9009768, 11659226, 3527779, 5057324, 7738994, -938987, 1619203, --11380590, 10766946, -9269613, -3219078, -2908767, 1015223, -2515240, -8840653, -7784628, -17142826, -15659988, -17512730, -16976932, 2950643, 16419660, 5872294, -2048163, -4043712, 7587060, -8184060, -9473624, -2676838, 1262184, 1040456, -6178848, 6626061, -7311645, -5955509, -643171, 2433099, --6982006, -1040456, 3847754, -496606, -1869921, 5109938, -3274913, -6264210, -1398549, 3257196, --4137127, -2389613, -2814814, -578747, 1963874, -1297617, 628139, -989990, -2245731, 716186, --1425392, 1525787, -1493038, 2182380, -588411, 4021163, -518080, 1591285, 2210835, -1315871, --2631204, -224412, -609349, -99858, -781147, 1898912, 141197, 2438468, -2087891, 897111, --4531191, 259846, 241592, -1625108, 1303523, 7084012, 9243306, 9242233, 10062035, 23796266, -10657961, 13580687, -6788196, 22025130, -12656195, 561030, 4813048, -144955, -8355859, 2712809, --2348273, -18858664, 7076496, -4780836, 1966021, -1803349, -6289443, -27380, 5540508, -7636989, --4000762, -1221918, 4368519, -11514270, 7215545, 2710124, -10579041, -856309, 4231617, -9565966, -3512747, -11464878, 5217312, -1011465, -3759707, -474057, -7530689, 9576166, 11288785, -10849624, --6247567, 4882304, -3918621, 2994666, 2674154, 702764, 299037, 13073880, -3369939, -8777839, -8043937, -355945, -6959995, -5810017, -10951630, 2078227, 2898566, 5421860, 5154498, -5048197, --8527121, 4713727, 2292439, 16354162, 1651415, -2046015, 338229, 1078574, -4908074, -2176475, --6134287, 6692096, 3797288, 4354023, -1364189, -10478110, -9621800, -3139084, -930934, -3770445, --6695854, 1850594, -2980707, 4310537, 673773, -709207, 2598992, 2777233, 4345970, 4148402, -3258270, -33823, -1090922, 1176821, 2887292, 2297808, -1426466, -1264868, -936840, 756451, --107911, -827318, -48318, -5155035, 530965, 3361886, 2476586, -4015795, -2992519, 5752572, -2974802, 5705327, 2148021, -4171487, 3854733, -1019518, -3264175, 614717, -4612795, -2472828, --1260036, 1725503, -1017907, -12868796, -14463839, 24157580, 16847010, 21597244, 1386201, -13846438, -4889821, 11275900, 8028368, -3525631, -8759586, -2570538, -3216394, -4244502, -7541426, -3018288, --6333466, 16109349, 2579128, 2668785, 127238, 948651, 1714766, -5941551, 10660646, 6027450, --631360, 3885872, -1513976, 10979547, 2025614, -959925, -17941152, -1316408, 1131187, 1721745, --3357591, 2257005, -8497056, 14579266, 11802570, 11400991, 9942849, -7802345, -10818486, 8317741, -2562485, 4074313, -708670, -12583717, -9109089, 743029, -7100655, 99321, -5963025, -2580202, -7561827, 2421825, -5391258, 1948305, -13923747, 443992, -23608898, -11981885, -22305376, 19282792, -17367774, 18551574, 22465364, 10896332, -3710852, -9942849, -3016678, -531502, 3230889, 17813914, --5870147, -13498008, 10319733, -8582418, 4498978, -1948305, -1938104, 4195646, -4000225, -7289097, --2061047, -8979703, -1902134, -8071854, -1852742, 1159104, -705985, -951335, -2190433, -2799782, --5581847, -59056, 2944200, 484258, -2805688, 1010928, 4895726, -631897, 3277597, 1817845, -1945083, 1399623, -6451041, 5688148, -2485712, -2024003, 3813394, 1338419, 4214974, 457951, --5363878, -970663, 134755, 966368, -3274376, 184684, -213675, -8565239, -11525545, 10165114, -13189308, -6476811, 12245489, 1728188, -5199058, 4925254, -17747342, -5505611, 5006858, -5653788, --10883447, -20512764, 10079215, -8814347, 2373506, 13289166, 3190087, 15495705, 11854110, 6739341, -2544768, -9149354, -2684355, -4789426, 839129, 8629663, 4498978, 1782411, 7368017, 21066814, --1099512, -17916456, -7866770, 2895882, 4302484, -1025423, 445066, 1697049, -7642358, 471373, --16863652, 3793530, -17641578, -6432788, -13661217, 6726456, -6815040, -11209328, 17105780, 4797479, -1394791, -7698729, -10261751, 2562485, 4067334, 1506997, 5573794, -8746701, 19230716, -23350664, -6074158, -9733470, -14173392, -7941932, 12239046, 3687230, -13287018, 9385577, -10581189, 25934624, --2418067, -2848637, -12617003, 1508070, -16831440, -9031779, 22453552, -9041980, -10197863, -6662031, -6713571, 840203, 9517111, 4740570, 4975183, 6933151, 3769908, -641024, 715649, 3304441, -1416802, -1839320, 5573794, -1756105, -1943473, -4207458, -3774203, -1701344, 2056753, -3314641, -243203, 1610613, -1365800, 1403381, 260382, 5493263, 2882460, -15569, -1123134, 537, --401043, 3278134, -2923799, 2972117, -825707, 1309428, 4609037, -1471026, 241592, -648540, --2319282, 5632313, -794032, 4390531, 24475408, 25183540, 23757074, 5132486, -6271189, -3880503, --15176804, 12467216, 442382, 7348689, -4487167, 2416993, -5500780, -4210679, -8744017, 4846871, --9108015, 15163919, -39289288, -11380590, 358093, -11829414, 8536248, -12161737, 2593624, -4649302, -12455405, 2285460, 11992086, 946503, -2739652, -108985, 4435628, -13708999, -9836012, -10645076, --1446867, 13506062, -26407070, 9270150, 23097260, 2913599, -16871706, -584652, -14199699, -13596256, -9540733, -1709934, -11589432, 6562173, 1035624, -4264366, -6520834, 3849901, 9637907, 5896453, --13475997, -9804873, 7807714, 11753715, -9470403, -12517682, 6270116, 13158169, -15845745, -471910, --14141180, -19412178, 23242216, -3782256, 3638374, -4273493, 14425721, -3313567, 3572876, -7648800, -12553116, 7008313, 11552388, 13367549, -13197361, -14552960, -5908265, -2731062, -8732205, -21934934, -2473901, 1268089, 35433, -1551557, -3526168, -2892124, 6367289, -488016, -2684892, 5905043, --6395743, -3359738, 2432025, 11529303, -3440806, -3476776, 599685, -1387274, 3998078, -1327145, --603980, -1960116, -3189550, -7995619, -11525008, 2100239, -789200, -8750459, -4376035, 2368675, --3043521, -9924596, -5530308, -622770, -1716913, 841277, 2851858, 1233193, -7516, 8216810, -2835215, 12907987, -4124779, 23085, -18434000, -8367670, -3927211, -15562814, -22544284, -3870303, --7266548, 22038550, 6895570, 32567126, 6206765, -8811125, 4645007, 6525129, -25877714, 1932735, -23463944, 15083388, -14912663, 2532957, 11926587, -20669530, -2988760, -10126459, 9366250, -7827041, -6309307, 1876901, -3769908, 1592359, 348966, -6338298, 7595113, -13889387, -5198521, -5705864, --17601312, -3327526, -1969779, 740882, 1697586, -4453344, -5268851, 33293512, 10281078, -12296491, --22840100, -7969849, 2760053, 24194624, -5352603, -2630131, -12868259, -3078955, -8937290, 19922742, --15428059, 17824114, 22405770, -21784610, 15083388, 6010270, -9050033, -7946227, 5776194, 10760504, --48153564, -5975374, 296353, -6213744, 13172665, -6117107, -35900020, -13675176, -10196789, -15957414, --15610059, 3253438, 3500398, -8859444, -7880191, -14687714, 1927904, -5181341, 1659468, -6145025, --7305203, -8273718, 2372970, -1342714, 5650030, -7106024, 4041564, -511638, -7328825, -15626702, --3654480, -529355, 5555004, -1847373, -20975546, 4785131, 10708427, 4549981, -112743, -7069516, -7965017, -652835, -2089502, -12475806, -1828582, -4032974, 11050414, -1211181, 2094333, 483184, -2682207, 7199976, -4555350, 830002, 744103, -1932198, 969052, 3350075, -14879914, -12688407, --4611721, -10173704, -7010997, -2503429, -6332393, -8022462, -7760469, -1890859, -1880122, -3196530, --5609228, -2151242, -3857954, -677531, -1861332, -6859600, 5530844, 32288490, -934692, -37592240, --21012590, -23256712, -4326643, -12854837, -504659, -19080930, 31369904, 18647138, -3313567, 24663850, -771484, 26590142, 6418292, -15315317, -20860120, -13160317, -16820166, -7519951, 4173098, 11477226, --3686693, 3767760, -13884556, 2397666, -20052666, -1805497, -1101122, 6916508, -7501161, 32217086, -4208531, -833224, 21422224, -8296266, -15107547, -8891656, 13150653, -1002875, -8556112, 3585761, --68183, 27395986, 6815040, 75162, -10582799, -16550656, -41731512, 2694555, -33142652, 16802448, -56989920, -40707164, -8654896, 9206799, -6962142, -7184944, -11353746, 9505299, -11656004, -39384852, --10413685, -39274256, -8162586, -1176284, -24557550, -3514894, -35362076, 15332496, -3499325, -22491670, -55253680, 4247723, 22567368, 18831284, 30515206, -18747532, -1188632, -11325829, -4010963, -7684770, -14535243, 9130564, 13068512, -26889716, -5322538, -14662481, -18785650, -15869367, -9611063, -2192581, -10574746, 8597451, 6098854, 7580618, -2049236, 2384244, 15106474, -2878702, 14951855, 4271882, --12790949, -3646964, 4719632, -5701569, -2080375, 17337710, 397821, -5439039, 19683298, -9194988, --1240709, -16243029, -3788698, -11384885, 8592619, -8747238, -3687766, -3433826, 3381750, -3988414, -7787313, 3221, 8051453, 2014877, -2801929, -5648956, -7410966, -5829881, -11323144, -65821448, --6505265, -16522202, -18129056, 24529632, 19534586, -22802518, -17948132, 45893336, -4756140, 15167140, -2743410, -1966021, -4849555, -4533338, -14376329, 249108, 5646809, 8559333, 5893232, 16674674, --12382391, 104153, -12058121, -7002944, 5430986, 23486492, 15220827, 20787642, 18664318, -3687230, -7001334, 11378442, 414464, -18286360, -3018288, 26321170, -4250944, -36592584, -15920907, 4468914, --30976914, -13154411, -31755378, -21677774, -19704236, 30100742, 20689932, -6052683, 20707112, 8216273, -29053844, 19662898, 9597641, -50067508, -10893111, 2656974, -43976708, -32054952, -12090333, -8244190, --51574504, 11574937, 29087130, 38887172, 46501076, -15145665, -29714732, 42413, -29984240, -22195318, --41779296, -46483356, -32743756, -27518930, 31389232, 1717450, 6578816, -27999428, -29393682, -26304528, --2335925, 41049148, 51970180, 1706713, -18642842, -14245333, -20527796, -53919020, -23935852, -23854786, --6390375, -1794760, -12030740, 14464913, 198105, -3981972, -19080930, -24967182, -12947716, -13989245, --22028350, -4734665, -5459441, -1984812, -5778879, -10006737, 13653164, 8483097, -1227824, -12110734, -9053254, 14852534, 1271847, -12436615, -6458020, 10438918, 2958159, -2652679, -11934104, 10426570, --2299418, -3797825, 1322850, 8126615, 2185065, -2159832, 1376537, 6339372, 1163399, -21005612, --50077172, 18849000, 1924145, -34216932, 31049392, 15170898, 9258876, -7835094, -30604326, -8049843, -466004, 28925530, 38632692, 1844152, 10146323, 2090575, 814433, -2274722, 4879620, -16775605, -54586888, 12775917, -18345952, -18389976, -8384313, 1997160, 26486526, -13436268, -4465156, -419296, -13217225, -13482439, 6783901, 497142, -3415573, -45828912, -14607721, 14148159, 23157390, 7948374, --5442261, -13508209, -30353608, -3680787, 4529580, -7530689, 153008, -8225399, -19693498, 19067508, --4857608, 6565932, -21028160, -4727686, 52505440, 3580929, -6222334, 5784784, 6544457, 4595615, -26268556, -10147934, -12390981, 19466940, -2595771, 11386495, 7009387, 16915728, -7022809, -20040318, -9611600, -9458592, 1237488, 74327632, 71615896, 31935766, -6723772, -4076998, 8792335, 33474438, -15356119, -10458782, -1416802, -4852776, -19387482, -20683488, 10852309, 5201206, 2612414, 16524350, --2523830, -9834401, 9791989, 3857954, 14583561, -21976810, -17828946, -22325240, 3022583, -10253698, -998043, -4800163, 7706782, 8447664, 18188112, 10269804, -19751480, -14819785, 6813966, -12435004, --7055021, 1083942, 6166500, -8506720, -19420232, -2577517, 483184, -2093260, 8356396, 1839857, --15698642, 4351876, 24938190, 28423020, 21343840, 24191940, 17468168, 21774410, -6153078, -1810866, -8445516, -2864206, 8318815, 7372848, 11233487, 20685636, 37041408, 5350456, -38277824, -9739912, -8956081, 6206765, -8902393, 29645474, 14874009, 11817603, -9309878, 34627636, -1713155, 1326071, --8854612, 18706194, 12394739, -25654914, -37876780, -10170483, 6715182, 2735357, -7002408, -34561064, --3213709, 13083007, 3129958, -11256036, -4571993, -9988483, -13209709, 8826695, 10278930, -21930104, --24940338, -8179765, -31009128, 9092446, 27727236, -23475218, 26664230, -11804718, -14276471, -26412438, --37343132, -41752452, -39775156, -20025822, 261993, 15796890, 7296076, 15737297, -20854750, -46612744, --18339510, -44772348, -79296368, -29702920, 64397128, 110442936, 64655900, -26297012, -21351356, -96963720, --87351584, 61601644, 10943040, 80726056, 83250960, 86900608, 29351270, -33718176, -42375220, -46963856, --54166516, -7223598, 54649700, 92560304, 29736742, 10272488, -3818226, -45057964, -66756140, -44533444, -9162776, 64173792, 30021284, 41842644, 33851860, 13041131, -23641110, -25941602, 1598265, -14016626, -5617281, 31841276, 33404108, 25069188, 5313949, 13177497, 1007170, -20070920, 4960151, 9397388, --2773475, 4464082, -5438503, 45871860, 26668526, 29421600, 17790828, -14629195, -39026756, -55195160, -9059160, 20496658, 38507604, 39103528, 49707804, 24854438, -35660576, -44328356, -54477904, -8723079, -616328, 30920006, 17915920, 10460930, 16879222, -26473104, -80688480, -53451404, -49435072, -10372883, -7256884, 19934554, -4209605, -9821516, -17898740, -21132312, -3553012, 7644505, -24987582, 34979824, -16791712, 31067646, -68302328, 15490873, 9204115, -20984674, 15274514, -15690052, -7792682, -4664872, --9807558, 29436632, 54138064, -15710453, 10833518, -7511898, 12919798, 27597312, -8500277, -4983773, --15080167, 7967165, -9602473, -29840896, 21736292, 36910412, -4945655, -19242528, -17781164, -38767984, --10790568, 29493004, 19891604, 10315975, -42862700, -24755654, -18751828, 37896644, 32730336, 28858422, --83591336, -55498492, -6870337, 41342280, 88025352, 423591, -106110392, -38858716, 3423089, 35824860, --3040300, 19704236, 14709726, -46208480, -20402168, -12715251, -27893128, 2018098, -52262236, 8253854, -20512764, -62909460, -40467180, -19550154, -8197482, 69835096, -547071, -106938240, 10154913, 15187004, -16211354, 42273752, 19535658, -45624364, 2170032, -1650341, 91450592, 64717104, -53832048, 49052284, --28759638, 19583978, 50443316, 18299782, -27886686, 25522306, -11233487, 6641630, 17407502, -1756642, --18924162, 34761856, -22406844, 25512642, -12021077, 13785771, -4292283, 28000502, -9881109, 22032646, --38301980, -6462852, -566936, -4887673, 12163884, 23871966, -24387898, 49081276, -19276350, -16724066, --33494840, 24570972, 51354388, 10296110, -67914704, 5607617, -15362561, 33090576, 16105054, 14991046, --27365920, -1750736, -17463338, 16549046, -7181722, -10755135, -4101157, 22396644, -5481989, -13582297, --16898012, 12759274, 1847910, 12165495, -7617662, 439160, -13035226, -827318, -2851322, 6250788, -1789391, 13773960, -3000035, -4007741, -14442901, 9823664, 3364033, 8747238, -48855, -8228621, --10762114, 3240553, 2488934, 7453916, 23659364, -56435332, 8038568, -41430864, 7578470, 35223564, -31142808, 10218264, -20151986, 4067871, -11965779, -2939368, -14853608, -10964515, 7663296, 2086280, --21633750, -2465311, 11287174, -2377801, 1291711, 4109747, -13793824, -13653164, -338766, 9082782, -1221381, -21990770, 1855426, 11323144, 3565360, 2654827, 23054310, -2508798, -6124624, 8288213, -8837432, -15551003, -17260936, 12841952, 2495913, -13236552, 8924942, 3889093, 4332012, -9250823, -3754875, 10472741, 1275068, -13029857, 17733920, -2120640, -19850266, 631360, 15558519, 4879083, --12986370, 11861626, 3933653, -18090940, 7465727, 966368, 18518288, -16738024, 1523640, 12783970, --29355028, 972810, 12693239, -452582, 8801462, -4847408, -18788334, 2532420, -19881940, 18711562, -9655086, 5302137, -7380365, -7758322, 15440407, -13259101, 13779329, 15160698, -21613886, -6980396, -937914, 16784196, 274341, -9666898, 6213744, -11716134, -693637, 1744294, 9897752, 718333, -1636919, -6032819, 10300405, -3401077, -11997454, 10964515, -4839892, 4754529, -2711735, 7919920, -9954660, -11376295, 2006287, -6142877, 2698850, -6242198, 22124988, -6203544, -12402792, 10028749, --5583995, -1828046, -6308770, 6576132, 6026376, -8892730, 5009006, 8765491, -4506495, 636729, --12344810, -28123982, 45632416, 6292664, 20543902, -17999134, 7747048, -4031901, 5373004, 4839892, --7807177, 2913062, 8238284, -4992363, 18112950, 664646, 452582, 6055367, 5832029, -833224, --4789963, 7644505, -1342714, -5535139, -1236414, 7683697, -8582955, 1662689, 3701725, -10902774, -13322989, -2814814, -6595459, 20503638, -8614094, -12288975, 9368934, 5113696, -5811091, 8826158, -7055021, -2611340, -3013457, -1724966, 2583960, 5033165, 2909304, -145492, -3668439, 10521596, --11425687, 10085657, 1491427, -1345935, 2743410, 3128884, 3207267, 362925, -10178536, 2733210, -8588861, -6277095, -127775, -84826, 6519761, -756451, -2668785, 9908490, -5176510, 5281736, --10454487, -3918084, 9938554, -9628780, 9552007, -2583960, 6257231, 7672422, -8893267, -3067144, -10793790, -9170292, -574452, 1066763, 3198140, 738198, -1336272, 329102, 716723, 4954782, --4387846, 1036161, 3106872, -392990, -2317672, 489089, 1784022, -504122, 549219, -1967632, -2166811, 3065533, -5578626, -941135, 9383430, -4659503, 2608656, -767189, 5305359, 1464047, --3088618, 539555, -689879, -3223910, -2291902, 11116449, -2003602, -2632815, 1501091, 1180042, --972273, 2310156, 4507032, 79994, 1097364, 361314, -1083942, 623844, 1251446, -2197413, -1383516, -204548, 10712722, -37781216, -120830312, -6137509, 65150360, 29242822, 138766640, 11844983, -29326574, 1230508, -40429600, -50955492, -34489660, -62100396, -43421044, -27322434, 1022202, 47426104, -93452584, 68751688, 59871308, 19489488, -32482300, -47766480, -42903504, -50617800, -56092808, -22756348, --10721312, -4909685, 27436788, 36352068, 27464168, 50821812, 32866164, 12167105, 34153044, 788127, --14770929, -9808632, -30570504, -62799940, -38118908, -36770824, -37430640, 1947768, 17513266, 12055973, -46198280, 37827388, 26135412, 37204616, 39633960, 11201275, 11922829, -4231080, -34029024, -47392816, --36145908, -47502340, -33709052, -11810086, -8295730, 2909840, 25917444, 20222316, 18330384, 36489504, -30241402, 22165252, 37768868, 10313290, -7672422, -1582696, -15066208, -32786706, -18986440, -41472740, --52320756, -30908196, -26004954, -11354283, 30480846, 41019084, 38348152, 44130252, 36408436, 20629264, -19986630, 9625559, -4202089, -11263015, -21001854, -31178242, -31107912, -35283156, -36934572, -31688268, --10715943, -3779034, 12526809, 31780074, 35502200, 35008816, 41030360, 32531692, 24472186, 20244328, -6736656, -15875273, -28122908, -45986216, -58580668, -54976656, -43457016, -21962316, 5632850, 29387776, -40496708, 46462420, 48568564, 41781440, 29655138, 15029701, -9559523, -23853174, -31381716, -36566276, --31868120, -24114630, -16514686, -6933151, 7757248, 10098005, 13931800, 15859167, 14251238, 11206643, -9087614, 5993090, 5408975, 2290828, -1725503, -3134253, -3041374, -5001490, -5328444, -7093676, --8138426, -9179419, -7223598, -5677947, -2936684, -325881, 4667556, 7592429, 9059160, 8913131, -10022306, 8800925, 6479495, 2731599, -1291175, -5437966, -6752763, -7977365, -7904351, -8789651, --7717520, -5583995, -1465121, 1134408, 3344169, 5185100, 6529424, 6298033, 6855842, 6331319, -5337571, 3164854, 974958, -2584497, -4889284, -6817187, -6794102, -6506339, -5331665, -3772592, --938450, 598611, 1988570, 3254512, 4522064, 4980015, 4960151, 3805878, 2895882, 1393180, -163209, -1280437, -2283849, -3639985, -3945464, -4173635, -3545496, -2755759, -1115081, 220654, -1824824, 2705830, 2957622, 2472828, 2287070, 1906429, 1676111, 916976, 188979, -734439, --1352915, -2070711, -2260764, -2221572, -1614908, -959388, -178241, 202400, 667867, 842887, -1013075, 921807, 784905, 541703, 404264, 157303, 9127, -141197, -185757, -218506, --226023, -214212, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --2823404, -606664, 3182034, -341450, 234076, -4857608, -2471217, 653372, 6309844, -4161287, 1273995, --6667400, 6730751, 391916, 2432025, -835371, 1020592, -1329292, -2384244, -5803038, 2379412, --5817533, -2747169, -3305514, 3218541, 2547453, 1200443, 2657511, 5061082, 282394, -4692789, -3001645, 447213, -268972, 2451353, -972810, -1733556, -6835441, 1051730, -1993402, 1435593, -2801393, -3730716, -1514513, 3303904, 1005022, 350040, -3503083, 8666170, 5204964, 806380, -4169876, 3418794, 3316789, -8010651, 452582, -819265, -2152852, 1908039, 1278290, -1322850, --1530082, -472446, -2425583, 2306398, -941135, 4591320, -212064, -1227824, -2240362, -4099010, --781684, 3079492, -175020, 671626, 3635690, 960999, 4211753, -127238, 605590, -481036, -4531191, 4014721, 4060355, 849867, -42950, 1780801, -129386, 521302, 48855, 164819, --379031, -1311039, -1114007, -277025, -1270774, 543313, 586263, -567473, 1302449, -570157, --427349, -316754, 512175, 112206, 1160178, 62277, -20938, 55298, 1516124, 723165, --156229, -459025, 33823, -259846, 836982, 395137, 1617055, 363998, 2059437, 7208566, --3514357, 2400350, -2006287, -3139621, -1298691, -2176475, 3928285, -3266323, -6060199, -1553168, -1575716, -5046587, -3061238, 5681705, 9813463, -1664837, 3740380, -3378529, -3566970, -164283, -1018444, -439160, -119722, 3642669, -6251862, 2028298, -478889, -1311039, -5274220, 453119, -103079, 2957085, 865973, -4115116, 5402532, -4319664, 5039608, -571231, 896574, 2055679, --616865, -2534031, 3934727, 971200, 5264556, 803696, -4685273, 8453569, 6698002, -2343979, --713501, -1628866, -5900212, -3177739, -992137, -1011465, 2348273, -3234110, 235686, 2318209, --14496, -88047, -399969, -554588, -3233574, 5113159, 140123, -109522, -1636383, -568546, --4714801, -4169340, 1356136, 3413962, -453656, -883153, -27380, -33286, -2426657, 4583267, -603443, 1518271, -1214402, 1252520, 762357, -187368, -105227, -198105, 40802, 1088774, --624381, 690953, 713501, -138513, -206695, 572304, 1203665, 1097901, -804233, 307627, -355945, -600759, -362388, 1724429, -263067, -79994, -1370632, -1235340, -2093797, -762894, --7494718, 9299141, -1989107, -1057099, 6652368, -2556579, 3445101, 14747307, -1735704, 470836, --5600101, -4514548, -6984154, 4097399, -2867965, 2018098, 3892851, -4384625, -3744675, -2734284, -344134, 1482301, -5425618, -2105071, 2410014, 2076617, -2135673, -855235, 3358128, -3406446, -563178, -1676111, -594853, -2361158, 2069101, -2163590, 933619, 1986959, -874026, 6219650, -287763, -805843, -4546223, 579284, 6641630, 947577, 2260227, -6019934, -8616241, -3106872, --7408819, -6533719, -145492, -2800319, -230854, -7932805, 6842420, -7341710, 1111860, 5090073, --4537633, -7672422, -5454609, -1583232, 5146982, 4578435, 6878927, -3996467, -3511673, -2799782, --2400350, 4992900, 1305670, -2012192, -1067299, 2396592, 2715493, 854162, 1269163, 1758252, --340913, -2811056, -430570, -1846836, 747861, 287763, 660888, 609885, 185757, 1240172, -196495, 1439888, 176094, -1006633, 1462973, -1603097, -1034550, 379568, -392990, 1475858, --826781, -604517, -243203, 238908, -518080, -939524, 957778, -260919, 718333, -784368, --756988, -937377, -1100585, -667331, -996969, 1552094, -1285806, 8017094, 829466, -3230352, -451508, -2675228, -597537, 5607617, 9413495, -3226057, -3296924, -8551280, 1079647, 2137283, -4859756, -3230889, 5240934, 820876, 8071854, -6487548, 1037235, -12242804, -1348083, 1450625, --2990371, -2763275, -1081258, 4495757, -3693135, -6443525, 1823751, -9448391, -2057826, -4546223, -2080375, -1018981, 3191161, 404801, -7193534, -7784628, 212601, 4122095, 7691213, -1544041, --3130494, 6425271, -7104950, -3881577, 3428458, 3045132, 5090610, -4876936, 180926, 1950452, --3065533, -1051193, 3006477, -4429185, 5745593, -2518462, -1068910, -6150393, -5096516, 2443300, --12885, 96637, -867047, -3782793, 3558381, -2385318, 4425427, -96637, -5855114, -6163278, -2246805, -3110093, 1096827, -8765491, -8351027, -1353989, 7859254, 33823, -1621350, 369367, -1132261, 817118, -361314, 1232119, -4099010, 741956, 690416, 1219771, 1576790, 1728188, -921807, -2321967, 165893, 2001992, 933082, 521302, -1147293, -1429150, 323196, -29528, --474057, 1876364, -41339, -159988, -1324461, 2347200, 1954210, -144955, 166967, -1198296, -679142, 711354, 324270, 76773, 775778, -1087701, -565325, 4747013, -13127031, 2973728, --5735392, 4745402, 5432060, -6237367, -11515881, 1551557, -1588601, 7200513, -4419522, 10453950, --4486094, 6896644, -8662949, -3249143, 3536369, 5112085, 1391033, -97711, -5336497, -754841, --4211216, -5253819, 2821257, -4493073, 1676111, 955093, 2078764, -2581812, 4835060, -981400, -4153770, -1013612, -8119099, -1408749, -2636036, 751082, 7993471, 443455, -749472, -483184, --3319473, 2721399, -3132642, 4186519, 4543539, 1606318, 1713692, 8046621, -2063732, -1530082, --6544457, 4556961, 4022237, 793495, 995896, 789200, 286152, 2309619, 4888747, 3237869, -1831804, 1736241, -1311039, 6380711, 2146947, -1393180, -5004174, 2451353, -1522029, 9346386, -5291937, 1124745, -4388920, -1683627, 7122130, -2849711, 892279, 4093641, -2359548, -2951716, --5740224, 658741, 2036888, -514859, 2694555, -2293513, -879395, -1802276, 1966021, -238371, --674847, -2797098, 615254, 634045, 1600412, 1867774, -692564, 252866, 2098629, -232465, -2130841, -220117, 620086, 3120831, 626528, 3208878, -281857, -787590, -237834, -358093, -78920, 159988, -2504503, 844498, 1951526, 133144, 769873, -671089, -16847010, -9156333, -3373697, -3299609, 6764037, 6745246, 10189810, 4206921, 4117800, 2502355, -12279311, -2761127, --1705102, 1085016, -1236951, 3802120, 2705293, -4734665, -3774740, 3133716, 5967857, 7518877, -6491843, 8542690, -4700305, -4705137, -6230924, 6580964, -3825742, 5433134, -1388348, -307090, --5835250, -3515968, -3340948, 4931160, 6101001, 1052804, 6099391, 8713952, -3479461, 2183454, -10250476, -5185636, 3323231, 3451006, 378494, 7683697, 9877888, 7486128, 17136382, 3154654, --2439005, -3204583, -2943663, -217433, 3012383, 5165772, -952946, -1712081, -1817845, -4627291, -1925219, 2448668, 4438849, -10735808, -1472100, 2670933, 7096360, 4914517, -9142912, -6808597, -1724966, 1672353, 7405598, -6561100, 410169, -697932, 783295, -9320616, -2512556, -3236795, --2253784, -3854733, -1603097, 251792, 3563749, -48318, 201327, 1348083, 1705639, -3587372, --558883, 222801, 16643, 1224066, -1220845, -2360085, -1568737, -1812476, 2526515, -2469606, --1165010, -2836289, 704912, -642635, 1799054, -2600603, 1078574, -910533, 1060320, 912144, -187368, 2170569, -2097018, 1046898, 1225676, 324270, 2589329, 4055523, 8126078, -1059783, -1654099, 6947647, 10201621, 5743445, -11275900, 31675, -11996381, -8507256, -5157719, -1000727, --7344394, 8753680, 3230889, 5180268, -14922327, -1073205, 9745818, 4958540, -4385699, -6272263, --3838627, 3801583, -11419244, -667331, -7342247, 11225971, -1489280, -3284039, 1186485, -402116, --1935420, 1981054, -2977486, 5213017, 3697430, 7493644, -566399, 382252, 11556146, -3660386, -7731478, -1257889, -1372242, 20376398, 2415919, -2185065, -4613332, -15762530, 1649804, -16154983, --2731062, 17009682, -4812511, -3307125, -11833172, -3467112, 408022, -6354941, 3404299, -618475, --8676371, 9204115, 3280818, 2996277, 2520072, -6411313, 7018514, -10988137, 3164317, 4218732, -449898, -1456531, -4460861, -3495567, -4543539, -1454920, 3635153, 4693863, -1198833, -3843459, --2288681, 5232344, 2134062, 10017474, -190052, 753767, 4064650, -418222, -1860258, -1389959, --1280974, -1108102, -1667521, 1174674, -1902134, -75162, 2027761, 747324, 2067490, 2008434, -1599875, 177167, 3008088, 2183454, 1288490, 924492, 899796, -3164854, -2699387, 2288144, -310311, -1954747, 330176, -2222646, 624381, 2524904, 906775, -434865, 913217, 2163053, -469225, -1768990, 854699, 6581501, -13445395, 5712307, -4782446, -6828461, -6511708, 5026723, -6440841, 3729642, 11212012, 8255464, 1622424, 3332895, -8894340, 1732482, 3919695, 8681740, -1633161, -4253092, 3135326, 4024384, -7977902, 1097364, -8181376, 6280316, 5719823, 7378217, --7286949, 4359929, 7907572, -3658775, 1997697, 10514080, -382789, -6601365, -5267778, 2300492, --1807108, -6707665, -2793876, 70330, 1494112, 3557844, -4641786, 7323456, 4428112, -1740536, -8848170, -1152125, 3320547, 11619497, -12461311, 22841710, -10593000, 3095598, 6847789, -2440615, --1331977, 2847563, 15451682, -896038, -2201171, -512712, -3736085, 7484518, 8398272, -2755222, -3562675, 2955474, 2703145, 5125507, 6603512, 500901, 7145752, 1504312, -6233072, -9562208, -2223719, 890669, 4314295, 1816771, 14303852, -1494112, 7968238, 6419903, -4496294, -8223252, --1006096, 883690, 2075543, -2263985, 3647501, 1695438, -3569118, -1007170, -3408594, -1279900, -2052458, -1122597, 3051038, -824097, 1067836, 753230, -1478543, 1599875, 1837172, -2894808, -1877975, 1238024, 560493, 638876, -136365, 515933, 3398930, 1032940, -1251983, 585189, -911607, 1664837, 2083596, -683974, -2405719, -720481, -2104534, -1590212, 2512556, 2302639, -2961917, 7598334, 10007274, 6150393, -10654203, 20393578, -6428493, 3860102, -14981383, 5942088, --13251048, 10246181, 1049583, -2855617, -7504382, 9686762, 1283658, 6177774, 6373732, 3269544, --11165841, 5694590, -6765111, -1243930, 5015448, 5465883, 1257352, -2079301, -11190000, 1552631, -10275172, 1146219, 6645388, 7448547, -11685532, 6424198, -5951214, -5859409, 8590471, 9535901, -4935455, 5366025, 1466731, 5144297, -12046310, -5364951, -3862249, 346282, 12779675, 6146098, -5048734, -944893, 5603322, -285078, 14075682, 5207648, 5321465, 2159295, -816044, -20859582, -7706245, 4936528, -1961190, -1473711, -15610596, 148176, -5987185, 3728032, 13536126, -2274722, --7798587, 15825881, -742493, 8939438, -5307506, 57982, -9905268, -910533, 155693, -17095044, --5120138, -2946885, -7724499, -3564286, -1547799, 1080184, 8531416, 635655, -238908, -1652489, --4452808, -708670, 758062, -1622961, 575526, 212601, 2261837, -4008815, -1612223, -534723, --3725884, 202937, -2426657, -1508607, -1240172, -2982855, -1566589, 3500935, -1199907, 625455, --985695, 3795141, -199716, 1720671, -2492155, -5549635, -1712618, -240518, 2371896, 1002875, -3390340, -226560, -1109712, 2905009, -3567507, 4238596, -115427, 13352516, -11515881, 1670742, -4852776, 6036577, -19982336, 13251048, 3699041, -14209362, -9088151, 7742216, 17794050, -6276021, --3240553, -12303471, 25478282, 9891310, 1581085, 4237522, -13386876, -8672613, -567473, 1104344, -13214004, 2859911, 10186052, 11449309, -504122, 703838, 7975755, -2109903, -8515310, -8145943, --2074469, 11335492, -6131066, 14341970, -6658810, 21064130, 9367861, 16988206, -4605279, 2743410, -13635984, -10622528, 6355478, 6149320, 5783174, -6085432, 7261179, 1753420, 2314987, 6195491, -12968117, 10900627, -11066520, -2592550, 5697811, -10797548, -6857989, -2854006, -22090628, 5908802, --10919954, -6849399, 2130304, -2740726, 7561827, 14078366, 9025337, 5691369, -7603703, -1798518, --461709, -14947023, 2732673, 1269163, 18476950, 3976066, 4157528, -4003983, 14276471, -127775, --406948, 44023, -4641786, -2122251, 601832, -850404, -5029407, 467078, -1290638, 913217, --5997922, -6508486, -2132451, 5196374, -854699, 2027225, 1975685, 1610613, -416612, -1370095, --1785633, -3600256, -6008659, 2079301, 331249, -1461900, -7098507, 5258114, 3593277, 2045478, --566399, 462783, -2399276, 1807644, -1252520, -2318746, 864899, 3063386, 1872069, -1850594, --421981, -730681, 2279554, -15912317, -23484882, 12710956, -9561134, 10422812, 3410741, 5047661, -6172405, -15775415, -28704340, 2546379, 4154844, 16180216, -15946677, -17482664, 15093589, -6023692, -6866579, -3294240, 3595425, 2397129, 3980898, -7960722, 3848291, -1144609, -2493229, 9975598, -3724811, -1430761, -12950400, -1764695, -370441, -2382633, -617938, -7005629, -17178258, -7632157, -12610024, -5368172, 6218039, -9735617, 7215008, 3720516, -129386, -4901095, -21307332, 11781632, -11433740, 14703821, -10281615, -4355097, 19981798, 17663590, 8159901, 3799972, 11293080, 4158065, -10147397, -5443334, 8814347, -16843788, -1070521, 4704600, -4386236, 20053740, 781684, 10967736, --6537477, -10771778, 23172960, -386010, 9198746, -3061775, 328028, -27249956, -2294050, 5802501, --10517301, 12845173, 9738301, 2404108, -5576478, -20755966, -442919, -4216584, 5174362, 6313602, -1053878, -2522220, 4884452, 222801, 2399813, -1312649, -6279242, -2290291, -5733782, 10051297, -3082713, -198105, -208843, 1263257, 9279814, -1598802, -2223183, 1439351, -727997, 123480, -4162897, 2277407, 3741990, -2673617, -350577, -4286378, 834834, 75699, 3918621, 3923990, --4342749, 7012608, 7122130, -5553393, 433792, 921271, -805843, -11775190, -15426449, -4479114, --3613678, -26416196, -24779814, -6492380, 120259, 18651432, 15171972, 15015743, -5807333, -2414309, --3759170, 16033113, 6889128, -6727530, -1190243, -5356361, 11595875, 9000104, -6694244, -9374303, --8603893, -17573396, 7339026, 489626, 497679, 3835406, -2628520, 6663642, 24712704, -14068165, -7450695, 1474248, -9526237, -5455682, -11310260, 4287451, -5027259, -5683316, 12795781, 1570884, --4269198, 12919798, -1758252, -5705864, 4495757, 9425843, -5190468, 10129680, 18196166, 17549236, --11997454, -168577, 4383551, 9888625, -15193447, -3167539, -4196720, 18927920, 8065949, -2043331, --11514807, -12779675, -11361262, 17093432, 14156212, -27087284, -22599044, -17140678, -12072079, 4083440, --10888279, 6607271, 1802813, 2683818, -21791054, -6988449, 19696184, 15189689, -6602439, -13987098, -13605383, 7126425, -1640678, 221191, -1739462, -3320547, 7730941, -6943352, 1689533, 1182727, --292595, -5019743, -9154186, 1760937, 7431367, -736587, 812823, -3204583, 7057168, 7721815, -754841, -1033477, 2600066, -286152, 3118683, 3360275, 4860829, -6545530, -636729, 2382633, --8053, -4067334, 1080184, 8182450, 7617662, -2918967, 5835250, -8961986, 2232846, -2901787, --2493229, -3599183, -5601711, 2080912, 21873194, 17247514, 10717017, 1695975, -14231911, -7374459, --2170569, 5906117, 9100499, -12587475, 3317325, 823560, -10752987, -5064304, 8721468, -6372121, -6937446, 3011846, 8152922, -10031970, -13959, -22449258, 3396246, -28404766, 11726334, 11602854, --11025181, 13095892, 15592342, 495532, 4453881, -18301392, 10836202, 1116692, -7594039, 9978283, --2330020, 179315, -161598, 1254667, 19178640, -2128156, -17180, 23549306, -224949, -10824928, --31052614, -25511032, 28399934, 17710834, 7005092, 7176891, -11868605, -23907936, -11751031, 3820910, --9185324, 18748606, -994285, 2516851, 20205136, -4116726, -6265284, -4512400, -12713640, -21579526, --17149268, 48868676, -23711440, -10711648, 14021458, -24707336, -17805860, 17744658, 24852828, 8212515, --4511327, 29261612, 14130442, -23488102, -8149164, -13103945, -12800076, 26607322, 1933272, -17674328, --12222403, -13749264, 3889630, -2811056, 8115341, -165893, -4076461, -6430640, 608275, 7390565, --3948149, 3434363, -3845606, 3699578, 3346317, 10280541, -3978750, -1457605, 8803072, 737124, -4505958, 4615479, 6287296, 1214939, -3655017, -2022930, -926102, -1432909, 3861713, -1153199, --4094715, 8298951, 8553964, -4669703, 2196339, -5322002, 1962263, 2046552, 5288179, -1294933, --500901, -2607045, 2531883, 5944772, -20065550, -14812268, -10340134, -18363670, -1665374, 17376364, --1271847, 3565360, 8546985, 5670431, -14784888, -7162395, -12220793, -6547141, 15646566, -4793721, --1719598, -2157147, 9482751, 9458592, 28247464, 4492536, 20790326, -1225139, 7008313, -11340324, --8544837, 7445326, -14430016, -16039018, 513785, 5041755, -8238821, 6572911, -9643812, 2930778, --25355876, 14139569, 7905424, 11563663, 1430224, -10313290, -21246666, -7581691, -1905355, 17498770, --13347148, -7901129, 4878546, 40029096, -11078331, 40693204, -24980604, 9852118, -9218610, 17853106, --7095823, 30873298, -29057602, 44217764, -4195110, 9088151, 19128710, -32804960, 29229936, -35038880, -23630910, -57089780, 30933428, -29351806, 25990458, -38290172, 33642480, 1125281, 21802864, 9434433, --17863306, 15518254, -12794708, 38670276, -17630840, 6358699, -23091354, 6240588, -1558536, 4230006, --8266739, 10726681, -10612327, 7595650, -3768297, 2440615, 3243237, 3406446, 4467840, -2644089, --6110665, -4960687, -5855651, -13434658, 7741679, 1974611, -9237401, -4304631, -2800856, 5963025, --10281078, 9750650, -7878044, 1932198, -4230006, 4734665, 1573569, -107911, 14814953, -13153874, -8011188, -12709882, 19110456, -3655017, 18670222, -7377680, 5822902, 8425652, 2814277, 2894271, --28454, 8929237, -13362180, 14619532, -10191957, 9615358, -2174327, 57445, -3871376, 134755, -790811, -3788161, 1775432, 3494493, 1713155, -17594334, -15943455, 18514530, 31947040, -26500486, -40503688, -2368138, -27917, -1571958, 7014219, -12072616, -8883603, -18079128, -4063576, 566936, -16643, -106837, 15905875, 2715493, 17440252, 17083770, -10897943, 6279779, 36400384, 11890080, -7777112, 5453535, -31619550, 1599875, -5146445, -3969624, -29001230, -6138582, 16627429, 4694936, -5512054, 8366060, 21072720, 5495948, -6535330, -2170569, -1844152, 7905424, -14384919, -8843875, -21758842, 13512504, 10117869, 16832514, 12412455, -7336878, -3703873, -25127706, -11064373, 10215580, -8033737, 18966576, -13700946, -6812355, -4825396, 13943074, 8132521, 12517682, 5138392, -9912785, --9231495, 31367220, -9624485, -30476552, 7015829, 22050898, 15079093, -397821, -2667712, 2727304, -5019743, 3122441, 27986006, -33738580, -28847684, 3357591, 11348914, -14515916, -7526930, 2464774, --11462194, 5424544, -5617817, -1429687, 2981244, -2179696, -7711077, 296890, 6351720, -4094178, -35970, -11158862, -1981591, -9816148, 7201050, -3112241, 6602439, -3989488, 4116726, 1735704, -5568962, 8762270, -8895951, -3966402, -2673080, 6912213, -4327717, -8002598, -14717779, -36507, --5895380, -2179696, 2209761, 1484985, 394600, 2900177, 4789426, -930397, 14799384, 1847373, --1210644, -11454678, 1963874, -2094333, -668941, 2820720, -12044162, -6117107, -12439836, -64132988, -17700098, -7830799, -4088809, 15709380, -10886131, 16858284, -2290291, -27804008, -5084705, 2681133, -9736691, 12388296, 2870112, -19710678, 19470160, -7665443, -1789928, -12121471, -5458904, 10428181, --2105608, 9300215, 15697032, -3659312, -20308216, 4480725, 22253300, -20755966, 7612830, 17265768, --3159485, -13736379, -25604984, -17288318, 18038326, 46244448, -14259828, -18477486, 52114060, -3427384, --7518341, 37495600, 21831318, 18620830, 15052250, 6162205, -11040750, 19039590, 17741974, 12212203, -5653788, -34514896, 21537114, 19051938, -36427764, -21079700, -13093745, -10217190, -10041097, 39726300, -19835770, -22739168, 21235928, -8427263, -21254182, 9239548, 10805601, -9402757, -9010305, -33350422, -3745212, 5681168, 24380918, 11668889, 3016141, 20376398, -16203301, 42165304, -44836236, -52312164, -36922760, -22582938, -1400159, 25888990, -16319265, -11241003, -3228742, -3091840, 3221762, 15881715, -7803419, -13018046, -796180, 6181532, -1553704, 8822937, -347355, 4876399, 956704, -6910066, -3709778, 14097156, 9714679, -617938, 1891933, 9427453, -1511829, -1122597, 2396592, 21837762, -11213623, -3505767, 4780836, -19362786, -840740, 5115306, -8910983, -12001212, 11337103, -5184026, --325881, 11656541, -10100689, 4491462, -1716376, -2881923, 14467060, -8159364, -1939178, -16961362, --69671888, 21549462, 39443368, -24302536, -4992900, -18877992, 40577240, 27322434, 17179870, -3136400, --14079440, 3002719, 16400869, 7693360, -6966437, -1454383, 22404160, -1373853, -8151311, -29822106, --14111652, 25334938, 14744086, -15823196, 12822625, -11430519, -3585761, 7669201, 7171522, -6846715, -4653597, -26128970, 7573101, 35555888, -4443144, -6810208, -34783868, -20844550, 16962436, -27385248, --14874545, 6388227, 7047505, -8400419, 22892176, 21654152, -22140556, 8388071, 12425340, 35831300, -32785096, -5073967, 10761577, -770947, 37474664, 16367047, 15229417, 35561792, -15780247, -23062900, --11814381, -29552060, 25062208, 11901891, 12270722, 6600291, 42492796, -27993524, -6509023, 18232136, --9970767, 20222316, -920734, 2463164, 9412958, -24426552, -37155224, 4799089, 7217693, 41036264, -31191664, 865436, -30138860, -4659503, -32923072, -76236, -987843, -9146133, -8393440, 4593468, --2793339, -2365453, -8305930, -5319854, -7370164, -4311611, 1201517, -8713415, -8005282, -1222455, -8294656, 4326106, -10657961, 9868224, -5367636, 18210662, -5595806, -15954193, -5829345, 8134668, --4919348, -12069395, 14010183, -2870649, -12643310, -19553376, 3121368, -3031710, 2397666, 4486094, --7479149, -6331319, -17144436, -3688840, -4460861, 1351304, 3287798, 6488622, 5608154, -12985834, -155693, -16462073, -5974300, 1804423, 1871532, 16173236, 27514098, 24012088, 24739548, 31856310, --18404472, 25082072, -49142480, -21498996, 18538152, 4370129, 35813048, 16326244, 30533996, -13353053, -4000225, -26593364, 17969070, 29698088, 27006754, 2680060, 19126026, -47201152, -30757872, 29222958, -8472897, -29438780, -15236396, 3546032, 43193948, 13305272, -17655000, -22260816, 4347581, -6535330, -26543972, 28666222, -2896419, -4723927, 5645198, -8206072, 34345244, 9828496, -8222178, 6869264, --16437914, -9783399, -77154792, -26273388, 13678397, -12130598, -11602854, -450972, -13973139, -14002667, -35268660, 23564338, -17862232, 32142462, 66728760, 13649406, 47511464, 6490233, 9604084, 34812856, -22990960, -18892488, -21387864, -37625524, -23393614, -2564632, -37090264, 13623099, -4522601, -35953172, --25775710, -25757456, -32297618, -19670950, -13019120, -17254494, 5005785, 30474404, 37281388, 19574850, --3950833, -27354110, -3541201, 949725, 2253247, -13385266, -2441689, -9078487, 7227893, 10402948, -1096290, 7585449, -317291, -5413270, 8857833, -9761387, 1145683, 8368207, 18219788, 2388539, --244276, 12209518, 5147519, 32960652, -8369281, -27060978, -1466195, 18036178, 3162170, -7468948, --8287140, -22037478, -20784958, -11877732, -8323110, -3965329, -12511777, -18112950, -19178640, -10628970, --1626719, 2464774, 25210384, 18130130, -6870337, 29255706, 52244520, 36021352, 25398826, 15727633, -9918690, -13072807, -8424578, -13052942, -11729019, -3267933, -941135, 30181272, -3629247, 25592100, --17056388, 6598144, -57732412, 15876883, -9024263, 29219736, -7641284, -34653408, 34242700, -13281113, -4992363, 19360102, 14408542, 31321586, -5119064, 4519916, -6309307, 35752380, -7949985, 6553047, -24813100, -29217588, 24464134, -7525320, 14855218, 23728620, -6749004, 5115306, 3735011, 2209224, --8025684, 10432476, 10101226, -4487704, -14386530, -2855080, -16722992, -5630702, -3402688, 13213467, --7179038, -26423712, -17500382, 27329414, 27628450, -26602490, -22326314, 32775432, 38587060, -15256798, --4089883, 27726162, 894427, 14143327, 20127290, -47261284, -14130442, -3441880, 45324252, 3929895, --3465502, -45048840, 8669928, 17350058, 11312944, 1343788, 11835319, 4383551, 6002217, 56865904, --1971927, 2744484, 33413772, -20403242, 22130356, 3923990, 16647830, 10738492, -26125750, -8806830, -30611306, 20147154, 11599096, -7573101, 10567230, 5119601, -216896, 3833795, 7646653, -4009889, -13231720, -9100499, -2574833, 13604846, 7997229, 2549600, -29268054, 2352568, 14164265, -11176579, -4921496, -26076894, -16561931, 17875118, 8621073, 14653892, 12814572, -10539313, -28471338, -8135742, -9506910, 24390046, 14795089, -3908957, -5615670, -8889509, 20096688, -617938, -4246112, -8507793, -10571525, 4299799, -4588636, -20786032, -13181792, 12797392, 12812424, 9045201, -14327474, -20063402, -9780714, 26007638, 12029667, 1598265, -13335873, -3355980, 5909338, -498753, 285615, 1308891, --3463354, -6214281, 1961190, 6644315, 1867237, 988379, 3077344, 816581, 714038, 1209570, -3242164, 362388, -286689, 2496987, 33086818, -55910812, -3810173, -47302624, -43822088, 11062225, -9314710, 8067023, 1168231, 41771240, 23858544, 53768160, 58893664, -6450504, -28849832, 6162205, --7774428, -5360119, 12829067, 5708012, -4628901, -27067420, -29523606, 32097902, 14921790, -3645354, -5011153, 5221607, 3043521, 5912023, -2935610, -7684770, -43681428, 956704, 25221658, -7373385, --33648384, -11078331, 27795954, -51409148, -17586280, 32489280, 19760070, 38800196, -1032940, 2819109, --35701380, -36151276, -45436996, 38318624, 54368916, -71502616, -35535484, -3754875, 36395552, -28375776, --4532801, 65544960, 26758720, 16615081, 43486008, 31690416, 47730508, -17223892, 47458852, -7234336, --37059664, -54662048, -12716861, 20907364, -43190192, -8500814, 9415105, -9162776, -15144592, 9206799, -8458938, -29800630, 22287122, 10824391, 32342714, -7792145, -31485332, 39361228, 8069170, -35945120, -307627, -8389145, 15075872, -15934329, -16203838, -8407935, -1557999, -557272, -12254079, -15016279, -11750494, -15666430, -10737, -15484431, 8617852, 14634564, 2441689, 21898428, 15193447, -22138946, --8093329, -32212, -19741818, 3287798, -3220689, 7858180, -5091147, 6922951, 19359028, 13959, -3866008, -13509283, 20819854, 13104482, -14447733, -4329864, 14904610, 13817447, -1868848, -21288006, --2580739, -41360000, 32074278, -2589865, 9890236, 12487617, 12095165, 511638, -13862007, 22782654, -5800890, 21994528, -4589173, -46287400, -4097399, 13516262, -15140297, -16871168, -10283762, -15542413, -19022948, -4741107, -16377784, -820876, 17706002, -23523000, 16678432, -8085813, 8931921, -23170812, --5680094, 9555228, -1873680, -2029909, 3002182, 13189308, -2186675, -1996623, -16143708, 8231842, --4335770, 2740189, 5168457, 1836099, 12199318, -17534204, -13353053, 18623516, 16087874, -22048752, -10714870, -17794050, 20811800, -17187922, 7938174, 5466420, -14521284, 32621888, 3300682, -36022428, -16805670, 4506495, -27816892, 15818901, -10120554, 16839494, -24095840, 12571906, -25531970, 11920145, -18421114, -16409996, 9638443, -17444546, 766115, 729071, 1833414, -11416560, 380641, 8935679, --335544, -15733539, 12133819, -9806484, -21201570, 9341554, -9323300, 4791573, 10109816, -7419556, --4404489, 1928440, -1237488, 6597607, -3222299, -2217814, 5929739, 7465727, 2630668, -7226283, --4227859, 7215008, 4406637, -16530792, 15393700, -2043868, -5521181, 2263448, -1017907, 3739843, -8340827, -1875827, 15641197, -4424353, -6545530, -7396471, -2844879, 1628330, -7129109, 2089502, --2298881, -2838437, 2052994, 2641405, -2851858, 70330, -667867, -3092913, 3356517, 2266132, --3375844, 9809168, 20000588, -10193568, -111706192, -201515040, -67036924, -156194000, -154528624, 83120504, -17218524, 115629112, 261337488, 235485536, 193056096, 235827520, 144277616, 32201518, 45320496, -33617784, --175205680, -173144096, -129608688, -168237632, -115404160, -23932632, -77922520, -107443976, -46699180, -13472776, --55904904, -26603028, -1181653, -27955942, -49770080, 10402411, 42821896, -14577119, 59461676, 88911192, -2092723, 17135308, 120197880, 59584620, 636192, 112688128, 92080880, -21654688, 43554728, 105212200, --2103460, 8578123, 148440512, 79753784, 33079838, 179580096, 197829952, 97299800, 187543504, 233316576, -61098056, 31294206, 94934344, -38032472, -113018840, -65927748, -147030688, -260668544, -260181072, -295284896, --393307872, -396089408, -380151840, -388895872, -348046976, -298370304, -239091696, -156690608, -79844512, 38310036, -171604352, 226413488, 276238336, 374259168, 329042272, 294158016, 328540288, 242524448, 113074680, 133015672, -150251376, 55391656, 72312216, 150549872, 73711304, 13664975, 64360620, 57960584, -33617244, -429497, -40072044, -60286308, -76906224, 16911434, -15777025, -25393994, 83626768, 71807560, 6933688, 65237868, -94745368, 16280610, -7783555, 4870493, -98256504, -177180288, -185147456, -236020272, -297016864, -281414848, --251886416, -229454336, -204745392, -150393648, -142765792, -155847184, -104554000, -34390876, 8930311, 38075420, -101494912, 121813328, 137777184, 247362192, 288292160, 266512928, 245753728, 195856416, 123822296, 106148504, -90205584, 55292336, 39353712, 36453536, 14416595, -3268470, -4954245, -10351945, -21728240, -26823682, --22114250, -30316026, -41684268, -39770324, -38636452, -43732968, -44300976, -37630892, -39605504, -37008124, --28435368, -27448062, -29050086, -24123220, -19923816, -19261318, -13589813, -7288560, -5177046, -5042292, --6925098, -7172596, -7733089, -7992934, -6492917, -5804649, -11095511, -17236778, -22021372, -25350508, --27209692, -22492206, -17958332, -17541720, -14499810, -8620536, -6453725, 1058173, 12206297, 18081276, -19878720, 26056492, 29393146, 28156732, 31595390, 36076652, 32991792, 33191508, 37349036, 36407900, -34822520, 35712652, 30326228, 21599928, 15795279, 10532334, 2860985, -3503083, -7540889, -13227962, --18807662, -20139638, -20585242, -21851720, -20174536, -19476066, -21349746, -20744156, -19586124, -18283138, --16120086, -13944685, -11451457, -9069897, -7029788, -4107599, -2130304, -979789, 294742, 1420560, -1697049, 2155000, 2633889, 2876018, 2913062, 3060701, 3073586, 2917894, 2745558, 2698313, -2647311, 2597918, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --8483634, -933082, 5575942, 1903744, 3631932, -5309117, -2911988, 236223, -944893, 1418413, 4414690, --10631655, -79994, 3491272, 2092723, 3217468, -3083250, -4298189, 4639102, -80531, 1288490, -2893734, 3837017, 1415729, 795106, 3455838, -518080, -1108638, -2995203, 1607928, -848793, --487479, -1559610, 1986422, 5048197, 20401, -1059246, 2379412, -3243774, -4839892, -2684355, --980863, -3148748, 282931, -735513, 2033130, -1968706, 565325, -3937948, -376883, -3240553, --153008, -1489817, -1273995, 1633698, -1861868, -200790, 2660732, -1409286, 3172907, 3830574, -281857, 5181341, -2653216, -189515, 2486786, -911070, 1679332, 2347737, 1279363, -2745021, -1080184, 1236951, 883690, 153008, -2279017, 3016678, -812286, 1433982, -492848, -642635, -197032, -3169149, -253940, -2465848, -1136019, -123480, -420370, -99858, -236760, -1333587, -1575716, 166430, 447213, 92879, 883690, -551903, 1115081, -99321, 480499, -199179, --471910, 605054, 70867, -204011, -3221, 861141, 199716, -173409, 554588, 264677, --101469, 14155675, -3929895, 1413044, -3022583, -197569, -1232656, 1678259, 1146756, 4889284, -1537061, 899796, 1923072, -1116155, -9695352, -9273371, -2864743, 1300301, 2904472, -2312840, -580894, -2978560, -1032940, 206158, 1700807, -4083977, -4457103, -1278827, -239981, 2483028, -846645, -959388, -3204583, 626528, -1744294, 143881, 2323577, -3246995, 1631551, 2983392, --2243047, -6004365, -1534377, 2253247, -314069, 1839320, -249645, 1599339, -235149, 1752347, -377420, -5600638, 1159104, 2363843, -846645, 1618666, 311922, -275952, -1073205, 108448, --3282966, -245350, -867047, -4152160, -661962, -80531, 3780645, -3641596, 6188511, 7195144, -5668820, -2384781, -1093606, -1245541, 2772402, -982474, -1494649, 1756642, -3998078, -3624953, -497142, 3314641, -54224, -1598265, -3570192, -2081985, -2710661, -1400159, -2497524, 1006096, --1476395, -352187, -1551557, -783832, 136902, 905701, 120796, 930397, -539555, 122943, -741419, 420907, 595390, 612033, 374199, -611496, 743566, -13307956, -85899, -2052458, -919660, -460635, -6888591, -1319629, -1452773, 2151242, 3350611, -4615479, 3686693, -1177895, -2541010, 2545305, -1384053, 5536213, 339839, 240518, -959925, 956704, -1373316, 1016297, --1542967, 199716, -3616899, 381715, 3994857, -8053, 1685238, 4195110, -4129074, -4365298, -1823214, -1988570, 3368328, -3412352, -1021665, -7123740, -5478231, -4765266, 2080912, 600222, -2535105, -2597382, -1833414, -551366, 4470524, -4953171, 2046552, 846109, 374736, 2487860, --1715839, -2279554, -2964064, 1797981, 974421, -4387309, -4806606, -5618891, -154082, -1222992, -1833951, -275415, -1047972, 503048, 763430, 2483028, -6682432, 805306, 3821984, 5631239, -5818070, 4774393, -834297, -3563749, 5216775, 1563905, 1022202, -2625299, 1516124, 1047972, -171799, -672162, -1526324, -256087, 1793686, -1404991, -2261837, -960462, -965294, 352724, --176094, -585726, 1566589, 91268, 1996623, -217433, 585726, 1292248, 1261110, 936303, -719944, -825707, -859530, -320512, 802085, -190052, 783832, -577136, 1359357, 1087164, --1151051, 30602, 110595, -1949915, 1461363, -7878044, 4720169, -4225174, 5645198, 7381975, -4563403, -186831, 2117956, 405338, 6027987, -3449396, -3462281, 1653562, -1036698, 2407866, -4616016, -6847252, 2042257, 5949604, 2753074, -542777, -151934, 628676, -2916283, -149787, --2760590, -3814468, -1069984, 5630166, -2254321, 2558727, -2090039, -3610994, 6768332, -6096169, -4510790, 4936528, 897111, 3089692, -4537633, -1322850, -1858110, -1510218, 3102040, 858457, --4872104, 666794, -562641, 794032, -1130650, 1607392, 1548873, 5610838, -6088653, 2771328, -2175938, -717260, 2160906, 518080, 3420405, 3180423, 1987496, -2050310, 2704756, 4838281, --226023, 2786897, -2198487, 5756867, 5961415, 6536940, -2014877, -4779225, 1402844, -768799, -2272575, 1593970, -127238, -472983, -6768869, -1865090, -1648194, -649077, -1468879, -2122788, -2188286, 755377, 621697, 2561411, -260919, 2590939, 1612760, 754304, -481573, 342524, --695785, -1264331, 702227, 76773, 1214402, -523449, 215285, -215822, -988379, 1350230, --157840, -1399623, 416612, 1067836, 38118, -1784022, 309775, -896038, 2170569, 1532230, -1554778, -319438, 409633, 1163399, 30602, 533113, 1062468, 531502, 10890426, -1012002, --3415036, 10357314, -4105452, 4646081, -2501282, -9918690, 1760400, -2860985, 307627, 11866458, --4604205, -5633387, 452045, 6233608, -10048613, -3737695, 7534447, -2658585, 2433636, 3554622, --2689723, 3234110, -2102387, -3488587, 700617, -988916, -1220308, -1296543, 4202089, -3374771, -8181913, 2030983, 179315, -4699231, -1387811, 4992900, -5734855, 1213328, 1993402, -904091, --7997229, 5466420, 1462436, 1338419, 717260, -1111323, 4138738, -2460480, 5656472, 3206730, --2186138, -9762461, 4350265, 2608656, -231391, -2770791, 2367601, 6288906, 6407555, -708670, -3796214, -5758478, 4192962, -1025960, -1970316, 2480881, 4962298, -3482145, 4912906, 869731, --2054068, -1737314, 4012036, -3352759, 9504226, -4889821, 3945464, -3288334, 871878, -2939368, -3815542, -3412352, 190052, 2153926, -636192, 405338, -2908767, -1008780, -380105, 6442, -824097, -1284195, 1671816, -173946, -1122597, 1667521, -3337727, -3404299, -1911261, 47782, --304943, -688805, 125628, -2324651, 2863670, 173946, -156766, 1977833, -1599339, -338229, -2270427, 954020, 817654, 3512210, 3137474, 10137733, 1253057, -2680060, -13184476, 3950296, -7326678, 4347581, 2805151, -1198296, 3679713, 14147085, -1829656, 6488622, 545461, 3590056, -1304060, 170725, 2756295, -1280974, -6183679, -1789391, -4622996, -1264868, -6480032, 2214056, -86973, 7384660, 1364189, -3562139, 2369211, -1145683, -1927367, 4702989, 1618666, 3493956, -1989644, -2152852, -8436390, 431644, 4748087, -414464, -1698660, 2092723, -4504347, -1955821, --7865696, -9701794, 4886599, 5468567, 4236985, -1440962, -1677185, -7516, -259309, 2759517, --586800, 3030100, 2690260, -170725, 2776160, -2749853, 678605, -1487132, 1609002, 2013803, -8942659, -49929, 7300908, -2851322, -7699266, -762894, -1120450, -2963528, 5969468, -555125, -2415382, 494995, -4416300, -5268851, -1924145, -1166084, 495532, 5283884, 1672890, 508954, -2179159, 3524558, -1596654, 2644626, -400506, 2243584, 1364726, 526670, 3112778, -396748, -1785633, 1016834, 883690, -631897, -925029, -1911797, -927713, 1829656, 2807298, -759672, -169651, -1669132, -317291, 71941, -1696512, 1110786, -3119757, 79457, -235149, -45634, -1862405, 1999844, -308701, 4710506, -11614128, -382789, 11820287, 16256988, -6761889, 1825898, -2573222, -5647882, -3304977, 639950, -4722317, -4908611, 11368242, 1593433, -7563438, -1200980, --4942971, -2804077, 7385197, -2323577, -3301219, 6722698, 4129611, 6793028, -2906082, 1403381, -6600828, 299037, -4003447, 1822140, -602906, 834834, -8417599, -5710159, 2478196, -587874, -1966558, -7715909, 3594888, 2834679, 1773285, -13607530, -8007430, -3441880, -1737851, 1945620, --5991480, -3973382, 1296543, 10446971, 6838125, 3707094, -1889249, -1134945, -3987877, 3025268, --1185948, -7711077, -5942624, -703301, -162135, 10945724, 6014565, -5405217, -6094559, 7571491, -1467805, -4548371, 2147, 6796249, 2529736, 213138, -8875550, 9738301, -3467649, 6496675, -8460549, 8962523, 748398, -3291556, -2730526, 4611185, 5225902, -4597226, 3660923, 5011153, -3486440, -1512902, -1231045, 721018, 2989834, 2499671, -2686502, -4077535, -3897146, 1915555, --1895691, -1201517, -2721399, -519154, -1965484, 1001264, -1631551, 1191853, 881542, -297963, --49392, 2206003, -1652489, -3246459, -643171, 3010772, -1861332, -1600949, -1765232, -1206349, --271657, -51003, -2076080, -45634, -1528472, -699543, 494995, 2019172, -1380295, -43487, --491774, -875636, 1792612, 2185065, -3198140, 4770098, -6204081, 6983080, -693100, -1948841, -3690451, -7144141, 2374580, 3820374, 727997, 2655901, 3300146, -1964948, 7784628, -3731253, --13418552, -7998303, -1808181, 480499, -2881923, -5755256, -6296959, -4282620, 13082470, -3687230, --1086090, 1853815, -2779381, 1526324, 10723460, -5224828, 5063767, -3401077, -6976101, 6164889, -4431870, 2822867, 9605157, 177704, 4497368, -460635, 1102733, -416075, -3221762, 2090039, --784905, 6956774, 1348083, -4855998, -1289564, -1427003, -380105, -7891466, 3107946, -7780334, -1833414, 10384694, -6844568, -13062069, 2974802, 1771137, 5925445, -2675228, -169651, 6062347, --3809099, 2954401, 4446902, 1228361, -2780991, 5986111, 1250909, 7697119, 1593970, -4831302, --4595078, 4991289, 8399882, 2939905, -125091, -6977711, -1450625, -2263985, 4964982, 1240172, --9537512, 1466731, 2474438, 670015, 917512, 3664144, -1712081, 1532230, -2633352, 1600949, -1441498, 1168231, 1902671, 827318, 1245004, 1155883, -2234994, 695785, -708670, -364535, -2112587, 884763, 1160715, 2407866, -774168, -7633768, 703838, -525060, 529892, -705448, --497679, 2113661, 1370095, -1238561, -1468879, -10373420, 23951422, -5589363, 10761577, 1015760, -4493073, 3253438, -62277, -13418552, 11422466, -16729434, 5414343, 4018479, 15081241, -7066295, -6794102, -10641855, 6949257, -3440269, -11469173, -5490042, 2694555, 2940442, 4182761, 2135136, -6017249, 3948686, 9124121, -2827699, -7486128, -6736120, 2617246, -78383, -3703336, 6113886, -2658048, -1250909, 3634079, 7567733, -708133, 1960116, -1141924, 3743064, 2189360, -9683541, --4225711, -12688407, -2935073, -2152852, -307627, 6094559, 5407901, 809601, -3519726, -67109, --1924682, -3011309, 1678259, 17858474, 1589138, -388158, 5658083, -424665, 6485401, -2788508, -63888, -4236449, 17892834, 4227859, -7386270, -8422968, -5654325, 706522, -401043, -11450920, -621160, 2368138, 767189, 12506408, -3261491, 1844152, -7767985, -2535641, -21078626, -3637301, -1078574, 810138, -8107288, 2122788, -3906273, 2647847, 1212255, -3823595, -484794, 2775086, -4264366, 7960185, 2082522, -2887292, -2734821, -6391448, -2498597, 608812, 1056562, -3671660, --1418950, 3477850, 1220308, -945967, -893890, -2716567, -2558727, -1224603, 718870, -5316096, --3780108, 1010928, 2122251, 36507, -1384053, 1337346, 4358855, 747861, 341450, -350577, --1923072, 150861, -6245420, 2656437, 1444183, 12532178, 1087701, 10433549, 6334540, 10231686, -3433826, -10344966, 10155450, -6618545, 17566416, -11345156, -3352222, -15694347, -3309809, -1661079, -6986301, -7298223, 10248866, 8265128, -4969277, 586263, 11717745, 16490527, -5248450, 419833, --2150168, 5171141, 80531, -1925219, 2392834, 4521527, -7856569, 5928129, 1127966, 6796249, -2594160, 1039382, -13418552, -2166274, 15571404, -1861868, 5211406, 11938398, 3445101, -926102, --4166655, -5497558, -3293166, 547608, -5118528, -3069828, 9025874, 8346195, 2618856, 13859859, -9207336, -2900714, -1382443, 1899449, 3212099, -4233764, -11047193, 14413373, 6344741, -2955474, -13188771, 13793824, 15369540, 6668474, 2318209, -5571110, 388158, -7796977, -6256694, -3979287, --15417322, 6193880, -1954747, 13151727, -3119757, -10330470, -1946157, 992674, -1533303, -13780403, -2203855, 3678103, 6276021, 6644852, -4655745, 2138894, -3177739, -8961449, 1764695, 3471407, --685584, -2649458, -6760279, 7094212, 4010963, -6322729, -7172059, -4019016, 4124242, -730144, --2033130, 1919314, -3183108, 1990181, -811749, 1227824, 3111167, -4572530, -2122788, 2051921, --963683, 85362, 9201967, 3012920, 626528, -619549, 2197413, -3052111, -1722282, -292058, -3024194, -1898912, 13769665, 851477, 2552284, -2020782, 1179505, -1721208, -20752746, 2449742, --154082, -3700651, -1503239, -10184978, 11777874, 12066711, 13499619, -21789980, 7097434, 4549444, -598611, 21561810, 8890582, -10673531, -1194538, 21286932, 2564632, 3825742, 4394289, -6211597, -3607773, 4414153, 13256953, 6730751, -10030896, -16568910, 6343130, 3967476, -8303246, -1542430, -873489, -10175851, 1229971, 12490302, 5375152, 7014219, 10190884, 16422881, 1620813, 14468134, -2924873, -5704254, -761820, -8516920, -4399121, 3605088, 4964446, 3769371, 7334731, -10247792, --4566624, 18429168, -1283122, -3929358, -10204305, 8752606, 7988639, 2763275, 3386582, -119722, -5157182, -7979513, 13226352, -6600291, -7757248, -6369437, -4306242, 17838610, 4889821, 3731253, --19302656, -10641318, -15852724, 1178969, -1620813, -1561221, -15033996, -20987894, -521839, 9451612, --5104569, 2702608, -1299765, -1427003, 5353677, -7304129, -3052111, -3325379, 6449967, 1066763, --4603131, -66035, -675384, -111132, -2142115, -4397510, 1176821, 7029788, -3338800, -2302103, --4421132, -2044404, -3071439, -1543504, 3159485, -1032403, 4947266, -1600949, -964757, -2784213, --1975148, 7388418, -671089, -494995, -3401614, -559420, 4460324, 1196685, -5274757, 1214939, -511101, 1561758, 19444928, 22871238, -5832566, 6438156, -1647120, -6665253, 1343251, -15292768, --9436043, -657667, -3059091, 30666066, -13768591, 3940096, -19450296, -2844879, 11912092, -4979478, --10814191, -11357504, -4132832, 4705137, 6083821, -746251, -946503, -12768401, 3044595, 8964134, -4549444, 5501853, 1668058, 2016487, -7431367, -2428267, 5036923, 1851668, 20401, 580894, --8970039, 4027069, -9441412, -1520418, -216896, 2771865, -10487236, -1067836, 5189394, 7565585, --11954505, -6271726, 21316460, -8163122, -16748225, 14117021, -13620952, -4289062, -6009733, -2436857, --10450729, -7255811, -2172180, -10544682, -15042586, 24317032, 13438416, 10845329, 7440494, -9426916, --3661460, -6354404, 6857989, -11425687, 8134131, -6091338, 3514357, 8156680, 5339181, 1664837, --15493021, 15224585, -18513994, -4852240, -17948132, -7285875, 11863773, -675921, 6743099, 13615583, -4352950, -1369558, 2677375, -4740034, 290984, -1437203, -5117991, 6156836, -2112050, -2833605, -7051800, 3738232, -1840930, 493384, 346282, 1131724, -3145527, 3075197, 985158, 1664300, --3769371, 2602213, -1739999, 6678138, -2964601, 4724464, -1407676, -2311229, 7079717, -4709969, --2038499, -4212289, 2862596, 7001334, 3236795, -1978369, 3317325, -2803540, 3388192, 4878009, --5263483, -12696460, -812286, 32272922, -14238353, 14120242, -28556700, 8054138, -18099530, -3262028, -10325101, -748398, 6669548, 10821170, 8649527, -12360379, 9479530, 2090039, 7042136, -2527052, -9715753, 9047349, -1824287, 2032056, 5890548, 6666326, -9091909, -2993592, -13319767, -1490891, -11975979, 493921, -5512591, 1398549, 4502737, 1007707, -4776541, -9405978, 2553358, -6301254, -6311992, -5942088, 22959284, -1961726, -12315282, -13837848, 3270081, -7515119, 7301445, -15539729, --12199318, -15789374, 3782793, -13306346, -3110630, -19175956, 13945222, 3022583, 9417253, 5927055, --20777978, 1784559, -1762010, -7639673, -11566347, -3011309, -9834401, -12354473, -6812355, 5992553, -8364449, 12202539, -6828461, 1863479, 5309654, -17361332, 8155606, -11836393, -993748, 10081899, -4312684, 4184372, 1939715, 20517596, -11548630, -4092030, -4333622, 5520107, -17249126, 1563368, --1310502, 16106, 11360188, 6727530, 5667746, 2201171, -4130685, 874026, -2000381, 8378408, --3063386, -869731, -4519916, 9476845, 3819300, -3071975, 2645700, -8040179, 5760625, 3076807, -4552666, 908386, -1548336, 5401458, 9564355, 3416110, -4504884, -6091338, -2470680, 2593624, --6307697, -1265405, -9642738, -6906308, -3736622, 194347, -5258114, 4116189, -4121558, 9760850, --7431367, 49929, 60666, -26827440, -7793755, 30001420, 26545046, 14891188, -12911209, 13119514, -19846508, -13215077, 17529372, -14221174, 16183974, 3770981, -1122597, 5290863, -382789, 8480950, --12848395, -3700114, -5813775, 6444599, -12181601, -10976326, 17057462, -1707250, -3591130, 1553168, --16542603, -429497, 26538066, 14423574, 2994666, -316217, 5634997, 25069724, 10702522, 318364, -4212289, -7021735, -3008625, -6054294, 10776610, -5666673, 7191386, 1292248, 12877923, -15353434, --340913, -989990, 374736, -4380330, 7180112, 11512660, -2748242, -3368865, 11674258, 1268089, -1432909, 26418880, 4151086, 286152, -12155294, 5284958, -9045201, 12193412, -14203457, -12646531, -1910724, -12459700, -13253195, -20292110, 5401995, -6824703, 10416906, -3504693, 5872294, -29604672, -6003828, -10065793, -17923436, 9250823, 12352863, 6396280, 3814468, 2166811, 5175436, 7815767, --3833258, -4651450, -5447629, -428960, -5973226, 3652870, 772557, -8608188, -5905043, 4815195, -2903398, 310311, 8715562, -3127273, -920734, -7023882, -1480690, -27917, 3608310, 2214056, --5845988, -3646427, -1621350, -7114614, -1336272, -6686191, 2655364, 1719598, 7850127, 5283347, --559956, -3252364, -6442, -20938, -2244121, -559420, -8209293, -1534914, 3359738, 3570192, -1038308, -1459215, 7907572, 1242319, 22466438, -34221224, 14556718, 15164456, -24284818, -2356327, --20787642, -6772627, -18646600, -8365523, 21636434, -7227356, -1429687, -14984604, -2787971, 3599183, --22258132, -746787, 14457397, -27538256, 1161789, -18764712, -10050760, 501437, 2183991, -12388296, --9900973, -10362145, -2873870, -8893267, -431644, 4917738, -2570538, 7133404, -13345000, -8490077, -18178450, -8321499, 9914395, -10616085, 10309532, 9406515, 1739462, 2590402, 9614821, 557272, -13637058, 17170742, -3061775, 2633889, 25506738, 1612223, 13183939, -810138, -9932112, -19883014, -3515968, 13984950, -21894670, 393526, -12808129, -6711424, -28436978, 12459700, 19032610, -4832375, -9255118, -4532264, 20685636, 22811646, -1661616, -22393960, -21689048, 31265214, -24110336, 9188546, -3765076, 3332895, 23487028, -9836549, 38160784, -541703, -8447664, -9810242, -6684580, 6167036, --2211908, -2808909, -60130, 9902584, -2265595, -6082748, 8398809, -2877091, 4323422, -7467875, --4381941, 7270306, 731755, 10821170, -3364033, 4654671, -7719667, -2173254, -10629507, 2320356, -4588636, 5446019, 1225139, 5591511, 711354, -1606855, 6045167, -9077950, 6248641, -7688529, --2582886, 4793184, -9352828, -2333778, -5285494, -15939161, -4099546, 1126355, 5979668, -7749195, --3883187, -6808060, -2047626, 1748589, 12221866, 6307697, 37322728, 42058468, -2474438, -31711354, -31336618, -34671124, 4898410, 14705968, 3657165, -3711389, -15984258, 18014166, -8049843, -6458020, --16275242, -9480067, -5062156, -20341502, -11170673, -9096204, -5066451, -3349538, 14143864, -215822, -12229919, 80531, -5252745, -17825188, -19490024, -4941897, -686121, -276489, -2935610, -7311645, --8402567, 9320616, 22507776, -12231530, 7773354, -7645579, -7827041, 8908836, -8673150, -14127221, -31591632, -3508988, 2938295, 1523640, -17593796, -3904125, -3659312, 8910983, -22737020, -10117332, -24137180, 3843459, -10200547, 13062606, 24533390, -13963476, -17201344, 8925479, -14573361, 200253, --27315456, 8796630, 23317914, -2420214, 12186970, 7045894, 4122095, 26650272, 8431021, -161598, -15445239, -2278480, -2078764, 9374303, 10150618, -38756712, 3596498, -16882980, 13748190, -680752, -586263, 9578314, -2851858, -3748970, -5029407, 5133560, 2041183, -3839701, 5236639, -5593658, -629750, -2995740, -7401840, 3379603, -3670050, 8309688, 4674535, -193274, 113280, 2241436, --2143726, 4895726, 2507187, 1491964, 2103460, -1460289, 1915019, -3405372, -6405407, -3621194, --1599875, 832687, -8354249, 6808060, 4704063, 279173, 2598455, -5733782, 8003135, 899259, --4607963, 2806761, 3508452, -10183367, -1998770, 944893, -716723, 73014, 1941862, -1726577, -1583769, -50870128, -35539780, 15261093, -14882599, -14006962, -43226700, -12256226, 9593346, 3906273, --8265665, -23899882, -1611, 12584791, -587337, 1979980, 13026636, 22894324, -19275276, 51721608, --12920335, -16755741, -4884989, -2574296, 544387, -20031190, 776315, -3266323, 11171210, -6555731, -15681999, -6048388, -12768938, 5679021, 6648073, -11366094, 13061532, -38842612, 622233, -2818572, -15939161, 19210852, -13378823, 17935784, -6455336, 5354214, -8116415, -2510945, -4873178, 14413910, --1580011, 18877992, 29307784, -24927990, -6751152, 13924821, -16702054, 10605885, -19015968, -10350871, --9314710, -11008001, -19419694, -9807558, 9491341, 7810935, 15426986, 19934016, 14561013, -23480050, -3269544, 4701379, 5955509, 5104569, 15495168, -7143068, -15788300, 9503152, -3894999, -12273406, -2741800, -21239150, -8624831, -18464064, 2000918, 11350525, -6550899, 10919954, 5984500, -348429, --3795141, -24159, -16440061, -5983427, 5813238, 3073049, 3923990, 1444183, 2147484, 1780264, -5464272, 1693828, -10959146, -1291175, 1954210, -853088, 3162707, -4867272, -4444218, -10699300, -3077881, 9980430, -10768557, -7481296, 5915781, -2525441, -10997264, 7672422, -5233955, -4244502, -6965900, -250719, -1868848, -3187940, -4760971, -6416145, -6824166, -1581085, -5777268, -3347390, --2870649, 5069672, -118648, 52613, 7655243, -10128070, -34349000, 26819924, -44115220, 31874026, --4000225, -19435800, -16535624, -18483392, -12383464, -9494025, 1442035, 23518704, -1382980, -18738942, -20948166, 29549374, -44055092, -11352672, 3572339, -3143379, -6483790, -1686312, -5719286, -7367480, --12489228, 17068736, -5342940, -11810086, -20740398, -20503638, 21189758, 5960341, -3360275, -1735704, -452045, -4083440, -5221070, 5136781, -18213346, 10721849, 21630530, 16404628, 10292889, 20825222, -23976118, -12973486, 5427765, -18924162, 21485038, -11490111, -3073586, 457414, -30365418, 10559714, -25707526, 4890357, -10030359, -7882876, 33480880, -12749610, -13927505, 9872519, -33406256, -3363496, --16392816, 1311039, -32666984, 14388677, 6086506, 14116484, -53234508, -45356464, 7848516, -15461345, --10440529, -6055904, -35555888, 12479027, -20892868, -22535694, 17771500, -14966350, -8883066, 8055748, --3455301, -6396280, -993211, -1328756, 7806103, -17076790, -8062728, -16451872, 322659, -6878390, -3710315, -1820529, -13219909, -4905390, 5025649, -246961, 1239635, 4239670, -14520748, 2522220, --18474264, 9265318, 3087545, -12952548, 4569845, -15524696, -3251827, -5273683, 1442572, 9217000, --6160594, 9517648, -4516158, 15750182, -6700686, 10142565, -5093831, -1020055, -291521, -1176284, -3252364, -898185, 171799, -572841, -3259343, 697395, 5581310, -846645, -2182917, -1217086, -1875827, -1247688, -1905355, -772557, -846109, 1142461, -854162, 19327, -763430, -1169305, --718333, 1716376, 36507, -1829119, -5906, 554588, -2441689, 2180233, 38620884, -55790016, -55032488, 15551003, -2736431, 3743064, -41195716, 7463580, 18114024, -7969849, 46769508, -14440217, -19760070, -17637284, 51616380, -2761127, -7890929, -20927228, -8160438, 6783364, -6106907, 20395726, -15697569, -6453725, 605590, -21508660, 7058779, 20180440, 20526186, -24129664, 8924942, -5493263, -21979496, -7078106, 14011794, -14668924, -11592654, -31910534, 1290101, -20560546, -29819958, 40257804, --19071802, -4565550, -8658117, -10821170, 4763119, 2468533, 13753022, -7827578, 21563420, 1151588, -39793408, 14639396, 44136696, 37234684, -4619774, 24573118, 18700288, -7695508, 22145388, 30236570, --14212584, -32146756, 16938814, 10521059, 24705726, 12108050, -3321084, -1307818, -34138548, -4163971, --10632192, -13104482, 43521976, -6090264, -1306207, 54050016, 36010616, 18814642, 23789286, 11637214, -766115, 5275831, 31143344, -632434, -9181566, 8453569, 26048440, 11603391, 14508400, 6538551, -17786534, -2025077, 4560182, 5889474, 12227235, 3405372, 2524367, 1289564, 700617, 9483825, -15046344, 5680094, 20139102, 465467, 12144557, 11752104, 22815404, -1411971, 15388868, 13264470, -2324114, 11021423, -55298, 1632088, -4708895, 3932580, 5842230, 2193118, 2691334, -192737, --3511673, -377420, 4831838, -3968550, 2320893, 9666361, -3028489, 18865644, 1493038, 4214974, --2047626, -8981313, 4846871, -3552475, 5571110, 16944720, -38510824, 73568496, -10142028, -8298414, --4857608, 53516904, -33087892, 26810260, -36222144, 34083788, 6721087, -6715718, 671626, 19958176, --8807367, 18615998, -8889509, -188979, 37422052, 11535745, -9888088, -150861, 9145059, 7390565, --36792300, 9750113, -13580687, -3306588, -19534586, 18629420, 17402134, 2776696, 8086887, 31463320, --10743861, -50015432, 11647414, 32804424, -13029320, -32869384, 8407935, 23508504, 7601555, 57445, --39764956, -18869402, -23694798, 21946746, 8526584, 22611392, -47822852, 3080029, -9124121, -52397528, --13968844, 7760469, 23374286, 33078764, -17960480, 61746596, 11622718, 1122597, -13113072, -24846922, --17623324, 11687680, -28993714, 58226872, -19029390, 2452963, 34005940, -22606024, 20586316, -22075058, --13107166, 48331804, -24866250, 31720480, 28739236, 10680510, 12848395, -41722924, -5455146, -2113124, --15080167, 19768660, 17296370, 7295539, 4941360, 19252728, -5034239, 7576323, -2789045, 5828808, --8725226, 6904697, -1917703, 5855114, 3946538, 1387811, -14764487, -2317135, 1437203, -4991826, --2212982, 10294500, 5102958, 16894790, -8153459, 3665755, -27998354, -22923852, -3891777, -1261647, -15781320, 12444131, -8368207, -5582921, -22487376, 106837, 6955163, -3347927, -638876, 5436355, --7516193, 5137855, -16780974, 1144072, -6065568, -6079526, 9997610, -43248172, 24785720, 15886547, -24789478, -9801652, -6967511, 10084583, 126702, 2922188, 978179, 4961761, 1219234, -6739341, -32040456, -7391102, -22010634, 9403294, -534723, -19346680, 6806450, 4566087, 13245142, -8883603, --14656576, 15880642, -12668006, -1658394, -3748433, 13049721, -22337588, 7714835, -13845901, 11417634, --19676318, 7083475, -6577743, 3470871, 43231532, -29633664, 5660230, 9583683, -26751740, 9793599, -12369506, -19767050, -4109747, -7523709, 35954780, 3102577, -41536092, 24958592, -33572684, 6186364, -17412334, -16047608, 19913078, -23995446, -19830400, 27400818, -4628901, 11690364, -40929428, 7747584, -8868034, -2095944, -6300717, -263067, 16632798, 705448, -54439784, 33066954, -3416647, 12749074, --14292041, -16569984, 51939576, -1302986, -33201708, 2957622, 16779900, 3913252, -50483044, 1877975, -46845208, -8492761, -21658446, 5212480, 22664542, -2943126, 83752, -3905199, -2335925, 3324305, --8189966, -4706211, 15390478, -6597070, -415001, -8967892, 9029632, 13813152, -2457258, -1978369, -14544370, 4846871, -9984725, -2292439, 6271189, 4280472, -8480413, 4638028, 10010495, -8258149, -2156611, 2595771, 6455336, -15448460, 998580, 9837086, 3688840, -10734734, 623307, 7759932, -1279363, -7940321, -5406290, 8698383, 21048024, -6551436, -106514112, -227261216, -90339808, -170964928, --208346176, 74546672, -296890, 76447200, 289189824, 252627296, 143950128, 276778432, 154566208, 17940078, -95986616, 59269476, -103961296, -73320464, -21233782, -115290880, -139544032, -46102180, -70414376, -110349520, --27364848, -4532801, -140662864, -96759704, -14258218, -85299664, -110590040, -31887984, -54039280, -120263376, --22720914, 12764106, -67253280, -51162724, 51511152, -17904644, -72162968, 15705085, 48518636, -35364760, -29916594, 106194144, -15094126, -27753542, 105079056, 56315076, -25705916, 174244144, 236658608, 147485952, -249518816, 373060320, 287053056, 273210912, 399023936, 345994528, 254754912, 312487872, 284094912, 180900800, -160053568, 86361056, -29238526, -124050464, -222340800, -316038176, -376195104, -471784992, -504119104, -531599904, --602326720, -601882752, -454811808, -465380640, -423807520, -190611184, -147416160, -143347216, 64187212, 122146184, -3046206, 127283504, 176451216, 60701848, 84324704, 165521600, 123800288, 72280008, 116941760, 144709792, -61733176, 90252296, 179455552, 106909256, 70509408, 165423344, 124139584, 50385872, 107630272, 122924648, -16128676, 63675576, 147852640, 84950160, 101817568, 208285520, 195940704, 206478944, 267224272, 269111904, -215923040, 204262736, 174369760, 106613976, 76947024, 41098544, -6082748, -41659572, -113491288, -155152480, --209835456, -279681824, -311481760, -351964512, -409767808, -390216576, -350481152, -309506624, -226271232, -148282128, --78575352, -28872918, 12364674, 26057030, 31842888, 41044320, 43493524, 36816460, 39323648, 43449500, -42179264, 47282760, 61100740, 68599216, 73390792, 81787992, 84344568, 85528368, 89899568, 83154328, -71506376, 53586696, 33440078, 21274584, 5987722, -3935801, -6850473, -10212358, -14584635, -14309757, --12278238, -6786585, 812286, 8786966, 17835388, 20947092, 22754736, 26548804, 28432684, 28261422, -29658360, 32751810, 31223876, 28227062, 31469762, 28022514, 20662014, 25450366, 26267484, 17830556, -17988934, 15598784, 4242354, 1209033, -210453, -12014097, -19874962, -22814866, -28948616, -35170952, --36511516, -39032124, -44935020, -45916960, -45435924, -48728552, -51187956, -48898204, -47878684, -48764520, --44014288, -37648072, -34082176, -27918362, -17423072, -9823127, -3357591, 5983963, 14271103, 18410914, -22398792, 27732604, 29164976, 28369870, 29122562, 28196998, 25244744, 23264764, 21437792, 18597746, -15851651, 13785234, 11205033, 8602283, 6847789, 5546951, 4046396, 3058017, 2118493, 1206349, -641561, 303869, 10201, -122943, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --7136625, -232465, 5719286, 3935801, 3961034, 2498597, 1589138, -2220498, 112206, -2531346, 6118181, -3750580, 1489817, 903554, 906775, -54224, -1899449, 3012383, 4218732, 4048544, 2495913, --3048353, -4396436, -4825396, -4569845, -466004, 2430415, -4718022, 3980361, -936840, 6936372, --1136019, 4417911, 72478, -5698348, 1653026, -706522, 4647155, 351114, -528818, -2306398, --3910568, 384936, 2227478, -4998268, -6865505, 4835597, -3972308, -3639448, -3454228, 2739652, --2723009, 1184337, -1211718, -306553, -4040491, -1190243, -2746095, -3994320, 1336272, 3158949, --1151588, -4396973, -855772, -870268, -2214593, -3796214, -286689, -3081639, -3660386, -629750, -261993, 897648, -1235340, 573378, -671626, -5143760, -1134945, 672699, -1423245, -1294396, --1617592, 1691680, -1977296, 1740536, -135291, 330176, 660888, -1231582, 1250909, 46708, --687732, 344134, -335544, -1040456, 179315, 842350, -550830, -434329, -47782, 1338956, -591095, 219580, 202937, 739271, 476741, 852551, 231928, 1087164, -876173, -349503, --396748, 13454522, -4745939, -3119757, -4234301, -2921115, 282931, -9060234, 1492501, -4512937, --8866960, -1923609, 7543573, -5482526, 1447404, -679679, 2512019, 3789235, 4064650, 6578280, --1445257, -3828963, 1659468, 1559073, -3066607, -478352, -2080375, -1376000, 787053, -3512747, --2197413, -545461, -4398047, -5173288, 2596845, 3925600, -2377801, -5939940, -1058710, -1425929, -810675, 4721243, 291521, -2018098, -340376, 6334540, 772557, -3948686, -3786014, 1605781, -1185948, 5044976, 2869575, -381178, -4882304, 224412, -307090, 4130685, -4494684, -1551557, -2438468, 4807142, -1388885, 381178, -3697967, -2116882, 2236067, 88584, 457414, 1266479, --1448478, 1715303, 506806, 2109903, 1314260, 782221, 8427800, 2531346, -361851, -1194538, --2504503, 3564286, 2231773, 3856344, 2773475, 923955, 1024350, -876710, 761820, -1641214, --1701881, -1357210, 431107, -659814, -425739, -318364, 1350767, 162135, 1769527, 103616, --574989, -288300, -180926, -312996, 570694, 350577, 710817, -9887015, -2312840, -4658429, -4546760, 1162326, 124017, 3239479, -1898912, -7638063, -4020626, 5102958, -262530, 5257040, --373662, -2947421, 5823439, 2200634, 12746389, -2376728, 5543192, 826781, -5981816, 1531156, --5078799, 3320010, 1184337, 1319092, -5428302, 2746095, -933082, -1901597, 2250026, 8689256, -3237869, -26307, -6939057, 6054830, -1255741, 51003, 4282083, -6302328, -1168231, 4388383, --2573222, -2232309, -7126425, -7773354, -579284, 4749160, 2794950, -3102577, -73014, 3103651, -3868155, 1561758, -779000, -1475858, -6830072, 3245385, 8524973, 3898757, -2443837, -1173600, -2705293, 4089346, -309238, -1240709, 1023276, -5603859, -1034550, -3918621, -1835562, -337155, --2415919, 6516003, 5663452, -1661079, 2845416, 2128693, -1076426, -3804267, 908386, -2938295, --1118839, 905164, -3821447, -787590, 385473, -1081795, 1090385, 1666447, -2445447, -848256, --161598, 194884, -1919850, 536334, -889058, 1475321, -1703491, 1627256, -1166621, 414464, -258772, -801011, 640487, 315143, -624381, 590558, 622233, 677531, -1268626, -563178, -19864, -1759326, 227633, 1090385, -362925, -7386807, 8371428, -7109245, 7649874, -14496, --5997385, -14223321, -5565741, -4042101, 2197950, 7542500, 5918465, -1745904, -1087701, -1683090, --4035659, -1122597, -4542465, 1636383, 1756105, 2894808, 4770098, 2849174, 9068287, 86973, -1882806, -3113315, -677531, -2088965, 3374234, 1060857, -4123169, -5998996, 316217, -4289599, -613107, 4179003, -6788196, 4893579, -11467026, -3111704, -8487929, 1530082, -456340, 213138, --3282429, -4453881, 1672353, 4160213, 3004330, 1153199, -6802692, 2171643, -4674535, -1734630, --1287417, -9297530, -3580929, 2884071, 3704946, -244276, -6374805, 1190780, 2534031, -1168768, --1199370, 855772, 5707475, 2100776, -1174137, -1721208, 1079647, -13276818, 1051730, 3470871, -3271155, 9498320, 1395864, -5194763, 6007586, -1985886, 983548, 2164664, 2053531, -1277753, --4306242, 332860, 2679523, 2552821, 4096325, -1170916, -1217623, 783295, -669478, -422517, -730681, -1057099, 469762, 1000191, -456877, -2068564, -1556389, -2684, 345745, 645319, --937914, 2116345, -970126, -508954, 1406065, 1611687, -355409, -2302639, -1160715, 1026497, --1117765, -572841, -643171, 587874, 1946694, -269509, 471910, 2009508, 9548786, -2421288, -137976, 6301791, -3248069, -3030636, 9418326, -7169374, -16976396, -11135776, -6564321, 10206990, -4340065, 1420560, -9834938, 10416369, -4491462, 2927020, -2697240, 4097936, 5006322, -402116, -124017, -81604, -1697049, -5369783, -4346507, -1309965, 559420, 4737886, 2670933, 7394860, -3517041, -3207267, -1727651, 6584722, -4740034, 8077223, -6459094, 1750199, 3529390, 2302639, --5241471, 7123740, -705448, 7653632, 10050223, 1561758, -4034585, -3878356, 4239670, -4818954, --10241350, -2614561, 2130841, -6539625, 3727495, 3062312, -2197413, -4055523, -1760937, -1534377, -1947768, -760746, -5778879, -2163053, 9920838, 8024610, 4279935, -11813844, -11659762, -6323803, -11139535, 5695127, -903017, 1594507, -5535139, 7095286, -345745, -5446019, -1936493, 773631, --572304, -2706903, -432718, -2133525, -1185411, 2135673, 3047279, -1755568, -64425, 324807, -484794, 493384, -3092913, 3569655, -278099, -3441880, -2101850, -430570, -1122060, 116501, --289910, -380105, -400506, 893353, 139050, -1552094, -140123, 681289, -428423, -2441689, --1738388, -2272575, -853625, 1757715, 4894115, 7155953, -287226, 2822867, -10989211, -3641059, -1920387, 3899294, -13653701, -1420560, 6027987, -4042638, -8846559, 5679558, -10306848, -7537668, --4023311, 1011465, -3675955, -2470143, -234076, 7837779, -6470368, 1815697, -1981054, -2635499, --5430450, -1431298, -7975218, -2310693, -136365, 1637993, -5545877, -1097364, -3461207, 607738, --1715839, -2412698, 1585917, 6460168, 1720671, -3226057, 3267396, -4770635, -1105954, 1954747, --1748589, 3263102, -933619, -268435, -22308598, 1576790, -7665443, 3881577, 3344706, 5038534, --12232067, -12497281, 1801739, 525597, 3042984, 167504, 6810745, -2635499, 3750043, 4598300, --2047089, 10612327, -3189550, -6775848, -1356136, -5595806, -91268, -11150809, 272194, 5633387, -2709588, 8458938, -2216203, -2218351, 3809099, -4358318, 1157494, 2801393, 5519570, -2827162, -3213173, -4328790, 980326, 243203, 692027, -2100776, -922881, -1550483, 1837172, -1946694, --3087008, -2684, -1398549, -1937030, -606664, -1505923, -571768, -926639, 1027034, -1510218, -1020055, -3107946, -224949, -1839857, -690416, 304943, 325881, -398895, -1398549, 186831, --1002338, 520765, 170188, 8673150, -17505750, 4679367, 744103, 4849555, 7044283, 1266479, --6788733, -14921253, 1064078, -6041409, 11326903, -4626217, 2341294, 806380, 2425583, 8524973, --3765613, -281320, -3954591, -2254321, 2242510, -2177549, 8028368, 5947456, 1726577, -1725503, -126165, 5340255, -535260, 2563559, -104690, -4452271, 3930969, -1167157, -3291019, 4708358, -8051990, -10201, 3164317, 528818, -5300527, -3357054, 9776956, -4745402, 4693326, 7063611, --9389335, 6681359, 3627637, 3371549, -4147328, 6850473, 2021856, -1234803, 8853538, 281320, --68719, -4177393, -2312303, -51540, -3815542, -9477919, -2439005, 9580998, 7307350, 7872138, --839666, -8409546, 3514357, 10049150, -1838246, -7210713, -316217, -5112622, -1246077, -898185, -7921531, -813896, 4094715, -1096290, 423054, -5609228, 1525250, -1018981, 2236604, 2088965, --3757560, 2527052, -5981279, 526670, 2244657, 88584, -1490891, -175557, 1271310, -4263292, --699543, -4017942, 1304060, -2569464, -1490354, -2493766, -3963718, -2747705, -952409, 504659, --1152125, -180926, 1370632, 344671, -965831, -836445, -1117228, 2233383, 176631, 750009, -1605781, 845035, 1162862, -632971, 2088965, -392453, 158914, 731218, -660888, -1184337, -638876, 1992865, -8324721, -2466385, -13412109, -3933116, -7786239, -9179419, -8703751, -3093987, -11673721, 12702903, 17509508, 3901978, -6702297, -4131759, 14490146, -71941, -3398930, 11095511, --1180579, 466541, -17380658, 7834021, 4350802, -11605539, 16038482, -2255932, 7195681, -1968706, -3753802, 7117835, -2147, 12598213, 4820564, 3560528, -1479079, -4494684, 1192927, 7624104, --2068564, 2250026, 3563212, 10103911, -491237, -3085397, 6509560, -7688529, -4834523, 3446175, -11158325, -4975720, -6006512, -1912334, 9193377, 62277, 1286880, -3462281, -1588601, 3282429, -4842576, 408559, -3987877, -12758737, 1496796, 3731253, 12112345, 3502546, -991601, 9292162, -16630113, -3448859, 5818070, 3906810, 6883222, -1363115, -5864241, 3409130, -13809930, -3772592, --2103460, -4496831, -2800856, 7164543, 2469606, -8952859, -5281736, 235149, -2927020, -338766, --6845104, -227096, -2350958, -1741609, -948651, 667867, -1912871, -493921, -936303, 1446330, --543850, 1325534, -1875290, -73014, 282931, 605590, 2768107, 67646, -1068910, 2573759, -3779571, -317828, -2325725, -1480690, -3274376, -2873870, 3926137, -680752, 1057636, 1427540, -1389422, 1289027, -3014530, 1461363, -1095754, -15311022, 21101174, -10850698, 4680978, -927176, --7468948, 16051903, 3670050, 1869385, -17257716, 4302484, -6969658, -7929584, 1757715, -7742753, -8514773, 5101348, -1600412, 1597191, -4338454, -2032056, -6365679, -4137127, -7616588, -11673184, --2988760, -8209293, -2313914, 4253628, -3409667, -4482335, 8986145, 5602785, 9019431, -7654169, --997506, -1647657, -8407935, -55835, -4541391, -20694226, 1648731, 234076, -3330747, 6995428, --897648, 7732015, 6513318, 2323041, 12214350, 10866804, -11020886, -3115999, -64425, -539018, -3711926, 1342177, 10358924, -2383707, 16638166, -160524, -10063645, -8176544, 1126355, 2893197, -3275450, 12069932, 3046206, 2917357, 11314554, 15143518, 462783, -9515500, -9044127, -980326, --3144453, -2306398, 19578608, 1275068, -9135395, 6273874, -8020315, 7364795, 1069984, -1700270, --2518462, -6174553, 1507534, 1853278, -1066763, 1621350, 3156801, 1709397, 2094333, -1032403, --1015760, 71941, -1281511, -1077500, 2058900, 736050, 1407139, 1847373, 3357054, 50466, --1845762, 3143379, 1688996, 483721, 566936, -836445, 311922, -280247, 3335579, 5345087, --3161633, 2466922, -843961, 2128156, 103079, 325881, 4496831, -408022, 256624, 237297, -3655554, 2391760, 2619393, 1690070, 273267, 12633109, 865436, 8479339, -9513353, 4095788, -638340, -805843, 5556614, 13369159, -3835406, -1330366, 12288438, -16514686, -9266929, -7270843, --18919330, 3588982, -6085969, -2752000, 2130841, -12931610, 13929116, 10499584, 14802605, 6597607, --9427453, 776852, 463320, 11070815, -2200634, -462246, -571231, -7039452, 419296, -4181688, -6106907, -7461432, -2925410, -2583960, -3324842, -8720931, 3911105, -12742631, -2075543, -991601, -7794829, 4600984, 909459, 36507, -2364916, 825707, -30602, 6493454, 1373316, 1813550, --1208496, -19888382, -9359271, 2199023, 8045548, 9739912, -15665356, 10281615, 2917894, -6199249, -1329292, 3265249, -3839701, 14930380, -26844, 2791192, -3711389, -21015812, -7349226, -9617506, --2654827, 300111, -5982353, 2928631, 4279398, -4379256, -1077500, 13378823, 197569, 6779069, --8438537, 966368, -322123, 7670275, 6651831, 4856535, -2056753, 1528472, 5422396, 3342558, --446677, 5854041, 5547487, 6221260, 612033, 2332704, 1948305, 959388, -1026497, -867047, -5217849, 963683, -3084324, 427349, -638876, 2934537, -2310693, 895501, 2604361, -2260764, -4172024, 1473711, -840203, 317828, -4045859, 2751464, 2578054, -500901, -1094680, -2375654, --3405909, 868657, 19536196, 3223910, 7976828, -11555073, -10446434, 6215892, 10205916, 1308891, --3427384, 18749680, 5995238, 200253, -5020817, 4178466, -1306207, -1937030, -555661, -3080029, -1007707, -6075231, -14630806, 4986994, 1658394, 4622459, 1607392, 8327942, 2641405, -8718784, --17839146, 586263, 1488206, -1328219, -15592342, -7562901, -2223719, 4523675, -3291556, 1877975, --13618804, 785442, -2929705, 202937, 1525787, 3934727, -1338419, -12838194, -11766063, -7310571, -5150740, 3810710, -3027415, -2577517, -20618528, -11640435, -271657, -20141250, 18788334, -19011136, --5104032, -12272332, 20140712, 6517613, -13935021, 7188702, -1485522, 7663296, -11849815, -3869766, -673236, 8235600, -11241003, -4452808, -3721589, -11481521, 974421, 7794829, -1298691, -2027761, -14011794, -21862458, 17447230, -2771328, 3807489, -9807558, 7106561, -1017370, 5694053, -4931696, -439160, 4483946, 4932233, -1283122, -2247342, 116501, 649077, 665183, -1455994, 5500780, -5843303, 4097399, 1206886, 4151086, -224949, 5082557, -1680943, 1001801, -54224, -1799591, --1763084, 426812, -3961034, -4911295, -1284195, -230854, 5221607, -227096, -660351, -1306207, --3318936, 2531346, -950798, -1748589, -1082869, 2679523, -379568, -5588826, -585189, 2081449, -652298, -471373, 17247514, 37541236, -4869956, -11497091, -10769630, -9480603, -13683766, 2449205, --23404350, -43487, -18062484, -8253854, 5755256, 11593727, 6695854, -8029442, -986232, 11039140, --608812, 12716324, -7342784, -7381975, -6527814, 6088116, -4257387, -5557688, 2142115, -6695854, --6867116, 8680666, 20217484, 7754027, 8719320, 3978750, -11704323, -2630668, -9475235, -8899709, --1318555, -1469416, -7421704, -11904039, -24143084, -2092723, -8689256, 3318936, -4363150, 9266929, -8547522, 4961761, 8939974, 6385543, -816044, 17172890, 24363202, 5978058, -28277528, 5962489, --4971962, -16444356, 2431488, 8311299, 4151623, 908386, 7916162, -281857, -13414793, 1013075, -6527814, -13371844, -7008313, -12516072, -23437636, 18725520, 2677912, -1183800, 13054553, 10295037, -836982, 943819, 12903155, -17185238, -7448547, 2152852, 9549860, 8167417, 12243341, 8942122, --7045357, -3946001, -1463510, -2545842, -911070, -1522029, -3353833, -4338454, -6941204, -6902013, --4967130, -2498597, -631360, 3738232, -1789391, -1214939, -7968238, -5310190, 975494, 4489852, -3068217, 1991791, 1850057, 1455994, -1000191, -3896072, -1872069, -2336462, -2157147, 1053341, --4317516, 1177358, -3036542, 3640522, -235686, -909459, -2899640, 3061775, -2653753, -622770, -5776731, -2051384, -24159, 27737972, -20232518, 24002962, -1823751, -2677375, -11956115, -4295504, --11878269, -10050760, 12894029, -11129871, 6745783, 28760712, 10788421, -4037806, -12728672, -10625749, -12907987, -10217190, -17468706, -7059853, 1970853, 1890323, -19969450, 1637456, -5947456, 10712185, --6200859, -79994, 2491618, 30255360, -7107097, -9374303, 14727443, -11375221, 17659294, -10009421, -12971338, 2378338, -9106404, -8240969, 16422344, -20781200, 16158204, -8822937, 1789928, -4794257, -8893267, -7029251, -3565360, -45634, -6329171, 30878668, -8666170, 21150030, 8252243, 9832791, --8590, 8157754, 13550622, 15276662, -3990025, -14329085, 211527, 12661027, 5130876, -1963337, --18206366, 24766928, -5005248, -15969225, -4371203, -9695352, 7793755, 10839424, 551903, 18002892, --4676683, 9359807, -20049444, -3305514, -21402896, -6440841, -7758322, -226023, 1308891, -3884261, -7795366, 2790655, -5697811, -9635222, -7242926, -1858647, -812823, -4690105, -963146, -1480153, -6181532, -1519882, 360240, -2021319, -9218610, -2530810, -3648038, 1433982, -1456531, -4939750, --8046085, 3522410, -5411659, 2842195, 3702262, -5391795, -13864691, -3025805, -2103460, -3410741, --4898410, 884226, -2250563, 1819456, 1711008, -6016176, -750546, -6054294, 5987185, 3963181, --3282429, 1934883, -5521718, -31294742, -13383655, 19131932, -3827890, -7894150, 22250614, 2094333, --11609297, 8411693, 12102144, 10248329, 1581622, -19270982, -7966628, 2896419, 2820183, 10010495, -6634651, 11296838, -9837623, -7798050, 3795677, -2709051, 9285182, -18122614, -3067144, -19600084, --6328098, 3499325, -2698313, -2498060, 20924544, 4317516, -15507516, -2394444, 1247151, -15888158, --2145336, 735513, 9528385, 24019604, -8534637, 8001524, -13424457, 1979980, -7895761, -10216117, -9814000, 20998632, -16671452, 1566053, 18753974, -8513699, -1723356, -7085623, 12279311, 2910377, --15232638, -238908, -5316096, -5000416, -1506460, -7543573, 11368242, -27006754, 5720897, 2200634, --11320997, 15038828, 23167054, 16285442, 44119516, 13314399, -11294690, -15727633, -12931073, -7136088, -16210817, -5907191, 22505092, 1995012, 27401354, -32610076, -20845086, 9729712, -5319854, -3441880, -13160854, -8940511, -979789, 13888850, 6257231, 10280541, 15335181, 11870216, -2554432, 4795868, --9319005, 248571, -320512, -6658810, -7144141, 4697084, -9858024, -939524, 15024332, 1269163, --8891656, -11777874, 2224793, -14775224, -5346698, 15686831, 8264591, -2689187, -3554086, 2932389, --2861522, -5093295, 1132261, -3751117, -5539971, -1080721, -7631083, 5334887, 4818954, 5101348, --2779918, -2181307, 3434363, 7946763, 21740050, -51583632, -2232309, 29113972, -39231840, -1967095, -7495792, -40524628, 17874580, 4730370, 32141924, -3418257, 11240466, 9343701, -35674000, -29577830, --11625403, -3036542, -17945984, -22035330, -11737072, 19996830, 13974750, 12040404, 1125281, 2084670, -6199786, 1060857, -25945898, -9838159, -33256468, -10761041, 18320184, 5311264, 12320651, 41408316, -10645613, 15528454, -828392, 8131984, 36468032, 27359478, 7512972, 17884244, 16426102, 36363340, -29867740, -40028020, 24780350, -2420751, 23709294, 24107114, 9961103, 43695924, 38613368, -21555368, -19031000, -459562, 18131204, -32247688, 2972654, 3286724, 1048509, -7433515, 20174536, 21828098, --21461414, -7388418, -12664248, 7563438, -17812304, -22112102, 20485384, 35009352, 12770548, 36441724, --10688026, 49579492, 48577152, 13451301, 25412784, -7622493, -12921409, 11287174, 11169062, 5302137, -3742527, 2818036, 6439767, -7107097, -12690555, -9169755, -23723252, -24917252, -10108206, 11363410, --433255, 9999758, 1674500, 6023155, 14916421, 18261664, -6082748, 8283382, -1001264, -7795366, --6431714, -5592585, -15651935, -7326141, 142808, -13616657, -4868346, -12274480, -6795712, 2441152, -16807818, -8149164, 5986111, 4598836, -2957622, 9163313, 5356898, 6953015, 106300, 12224551, -7866770, 5226439, -5053566, -7693360, -3312494, -16594143, 23670638, 42750492, -6043556, -58822800, --18911278, 5793374, -4759361, -9910100, -13050258, 18254, -33720860, -20289962, -28028956, -4667556, --8314520, 9120900, -20058572, -5878200, 5186710, 9159018, -404801, 10210748, 20093468, 4038343, -29066728, -18983218, 6874632, 1031329, 27721330, 7175280, -5640903, -28236726, 18502182, -4974109, -25273736, -21501680, -17140140, -16316044, -8802535, -26015690, -3734474, -4596152, -24546274, 13315472, -27581744, -13530758, 3943854, -36135708, 34476776, -11020886, -19036368, 15737297, 13668733, -20684026, -1630477, -12911745, 4367982, -9466645, 43202004, -1646583, -3887482, -10726144, 76389216, 1932735, --10560251, 32787244, 26161182, -27827630, 21546778, -34085396, -19116900, -35612796, 27041650, -24500104, -12960064, 18727132, 14722611, -31552978, 39679056, -7161858, -52382496, -59499792, -23643794, -7285875, --17481054, 13926431, 13480829, 23608898, 3666292, 2117956, -17901424, 17864380, 27713276, 41012644, -10572062, -11649025, 3767760, 34923988, 5580773, -19132468, -4984310, 37277096, 8293582, -21876952, --5938866, 18463528, 10361072, 16829830, 10997801, 23670102, -58519, 13066364, 4336843, 16801376, -7623030, 26637924, 8533563, 16889422, -3558381, 5408975, 964220, -1810866, 6770479, -2183454, -8865886, 16691854, 2200634, 9775882, 908922, 12661027, -28516436, -6349573, 21442088, 1961190, --16522202, -78857208, 5629092, 50667728, -30623116, -20429548, 40692668, -29619706, -1924145, -8421357, -39058968, -67092220, 37499896, 22244710, -18928994, 6990596, 36637680, 26148298, -12825846, 14957760, -6724845, -10232760, 17234094, -383863, 10451803, 15843597, -6757058, 3817689, -1703491, 7549479, --9698573, -7829726, -611496, 13594645, -39766564, -19705846, 19796578, -4483409, -26360362, -31166430, -5409512, 38743288, -16798690, -24778740, 19077170, 28894930, -6303938, 7252589, -5087389, 26912266, --14601278, 40360880, -5435281, 57445, 22154516, 449361, 5124433, -28702192, 45106284, -23322210, --28193240, 21381420, -29853780, -9904195, 5090073, 14880451, 41685880, -14804752, 26010322, -5319854, -13640279, -70565240, -53900764, -9942312, -20978230, 10736344, 9802189, 26743150, -4168803, -5652177, -32003948, -35020088, -709743, 22332220, 22165790, -8181376, 24692304, 3059627, -5169530, -169651, --5385352, 23533200, -13018046, -1388885, 23070416, 5231807, -5121212, 9010841, -11319923, 2892661, --770947, 341450, 9391483, 4292820, -12951474, -3044058, 4155918, -10217727, -14795089, -263067, -11026255, 19115288, -16067473, 18673980, 6540162, -18797462, 15663746, 17709224, -8819715, -21288006, -19649476, -9767829, 3744675, 10662256, -10537165, -28176596, 9343701, 7467875, -15385647, -14788109, -1260573, 10525354, -12160663, 4465692, -5252208, -25849260, -11890617, 19741818, -32350230, 32572496, --27478664, -34584688, 20266340, -16494285, -11000485, 20691542, -14766634, 17352204, -11517492, 8298951, -39908300, -34892316, -2122788, -4973572, 33683280, 4910222, 3558381, -31197032, -29256244, -10137733, --8253317, -4206384, -9154723, 6273337, 2145336, -2831994, 5335423, 7531762, 3830574, 5935645, --5692979, 15945066, -9681393, 15273977, -27705224, 1394254, -22365506, -29133836, -17003238, 39661340, --16513076, -16879222, -12429098, 9419400, -7414724, 17869748, 25870198, -26317412, 24329380, 4674535, --36509368, -18103288, 76741400, 39979704, -57437672, -10503879, 37172404, -18251464, -20699594, 15182173, --17832704, -39594228, 29127394, 13480292, -53949084, 22772990, 27973658, -31584652, -20682952, 32844688, --7520488, -24033026, 6001680, 16491064, -38977364, 7845832, 7384660, 11713986, -29653528, -8576513, --2197950, -9269076, -1661079, 2323577, 3753802, -18040474, 3306588, 27535036, 9818295, 2073396, -9354439, -115964, -4110821, -14574972, -4236449, -7727183, -10579578, -25217364, 7210177, -14238890, --3668439, 31750008, -27381490, -17787608, 23516020, -16363825, -5697274, -6876780, 10802916, -17754858, --6206765, 29306710, 15701864, -13761075, 16642461, 9494562, -11679627, -7271380, 39763344, -31082142, --24082418, 42306500, 144955, -33065880, 4965519, 21026550, -19434728, -41378252, 28256590, 3843459, --45949172, 8370355, 13303661, -33428268, -352187, 23130010, -5953899, -14636712, 12332999, 9922985, --22917408, -1946694, 17573396, -12840342, -16414291, 11803107, 1065689, 47661788, 67630704, -27452358, -75749800, -6299644, -21081846, -16404628, -26006564, -2481954, 12510703, 44523240, 1290101, 13481365, --11636677, -39021388, 488553, 1071594, 25258166, 4490389, -29472066, 54006528, -23452132, 9788767, -24206436, -27467926, -22218940, -39045548, -17157858, 23500450, 29549912, 36381056, -14099841, -90383288, -19737522, 46577308, 60018948, 51359220, -1014149, -26181046, -32134946, 10459319, 30505542, -20030116, --10581189, -80161808, -49060336, 42406360, 71888088, 14339822, -2197413, -17960480, -31764504, -7857106, -19786378, -28388124, 10724533, -4443144, 45371496, -2433099, 17567490, -89640800, -11539503, 602906, -54550916, 41939280, -1358283, -27210228, -7574175, 64639256, 29239600, -76978160, -94932200, -37516004, -18836652, 146545360, 15694347, -26080116, 20058034, -39910448, 104294152, 31352724, -83384640, -52591336, --10557030, 73229728, 10901164, -31287764, -28654948, -26902064, 20842402, 39155608, 19754702, -43373800, --3711926, -15298674, 35173096, -4421669, 21220896, -8106214, -9138080, -28991030, 10932839, -9308805, --3148211, 21456582, -34799436, 19651622, -5347235, -5925445, 51003, 15376520, 34307660, 16739635, -2246268, -7451232, 7201587, -964757, 13888314, 3922379, 15339476, 3149285, 3831648, -18130668, -8039642, 8494372, 6217502, -585189, 5113159, 2524904, 15222438, 17691508, 14202920, 1298154, --10040023, -15431817, 4350802, 6841346, -8898635, 7502234, -12367895, 31361314, -36153960, 1126355, --14556718, 8357470, -22401476, 21018496, 5786395, -11906723, -22601728, -11073499, -4313758, 6595459, --30842160, 7133941, -15126875, -5842766, -24164560, -11325829, 19512036, -20537996, -7321846, -2785823, -9509594, 6515466, -8068096, 11129334, -17712982, -1347009, 158914, 9542344, -11627550, 16844324, -12463995, -12692702, -14840186, -5573257, 23795730, -17102560, 7467338, 17812304, 3882651, -17192754, --6691022, 7530689, -10923712, 8150774, 708670, 3998615, -16040629, 3461744, -13062069, -452045, -11981885, 15354508, 11774653, -8693551, 11228118, 1559073, -14281303, -1974611, -128849, 17088602, --4748623, 3714610, 14642617, -3034395, -19292994, 26964878, -10992432, 16015396, 11537356, 2889439, -3652870, -11172284, -14000520, 18636400, 2755759, 16418586, 4843113, 9022653, 4446902, -345745, --915902, -14040785, 1546188, 3970161, 4952098, 5786932, -1816234, 6714108, 1063541, -683974, -1736241, 1003412, 6699612, -1680406, 5208722, -6356552, -1733556, 166430, 448824, -3499862, --2158758, 12724914, 7831873, -1961190, -9066676, -9990094, -3856344, -3925600, 11394011, 1333587, --3560528, -7405598, -4006668, 1260573, -6411850, 13424457, 1113470, -5184026, 2138357, -56371, --2527588, 3935801, -4012036, 11694122, -10950556, 8098161, -10666014, -29316374, 54380192, 4793184, -2824478, -22190486, 12495670, -2015413, 14158897, 10750303, 16597364, 1690070, 4114042, -9583683, -2560874, 15194521, -1659468, 8243116, -1489280, 2517388, 3243237, 6070937, -6659884, 11465415, --8068633, 913754, -1429150, 3788161, -1191853, 2184528, 8683887, 9542880, -4837207, 4126927, -1736777, -2319282, -4318590, 12761422, -4123169, 2583423, -3826816, 6604049, -194884, -6333466, -12823699, -8213588, -2945811, 3295851, -6258304, -3839164, -2049236, 395674, -2490007, 79457, --1397475, -3493419, 4258460, -8491150, 5116917, 3437585, -3009162, 5405217, -4357781, 6428493, --3527779, 1132798, 1137630, -4073240, 6316287, -115427, 756451, -2160906, 8557185, -10448045, -10871636, -7918309, 1182727, 1782948, -443455, 1926293, -1893007, 6264210, -6122476, 319438, -5345624, -6707129, 4011500, 3635153, -1103807, 714575, 3607773, 1677722, -1864553, 2392297, -548145, -943819, 384936, 2090039, 128849, -2872260, 627602, 1045825, -1552094, 3106335, --831613, 2537252, -1820529, 343597, 1945083, -1442572, 208306, 1340030, -2188823, 3418794, --464930, 1647657, -580357, 3605088, -1436667, 357556, 3329137, -3116536, 3871376, -2391760, -1606855, -2456185, 3797288, -673773, 10441602, -49767932, -123915712, 19270444, 94399624, 87701088, -152145456, -38821672, -40707164, -103574744, -141405360, -29154774, 51162724, 54731304, 103092104, 55992952, -4440460, -26766236, -71937480, -51158428, -8811662, -8011188, 25665650, 23781770, 13775571, 8771397, -6939057, -3802120, -17655536, -1380832, 20453708, 145492, 4326643, -1182190, -15287936, -11740830, --26020522, -25537338, 11604465, 10664404, 23705536, 35984848, 27007292, 13160317, 4800700, -38884488, --27454504, -21288542, -21274046, -23790898, 4998805, 15133317, 26389352, 33639256, 27888834, 6044093, --3251290, -22356916, -22755810, -13575855, -6558952, 2158221, 3799972, 7518877, 710817, -7324530, -2521146, -11673184, 6123550, 9859634, 1185948, 19770808, 23997592, 7370701, -4495757, -26379152, --34640520, -14010183, -6344741, -4088272, 17709224, 13634911, -3538516, 15467788, 16899086, 9376987, -11696270, -6487548, -12441447, -10103911, -14322642, -11471321, -2054605, -11016054, -4267050, 543850, -8865886, 12368432, 17988934, 15412490, 14331769, 11264089, -5810017, -13492103, -22464290, -27848568, --16089484, -12125230, 1646046, 13182328, 19610820, 22568442, 17982492, 16413218, 10714870, -14107357, --24949466, -22682260, -10966662, -3314104, -928787, 1613834, 9666898, 8343511, 4134443, 1832877, -7934952, 4354023, 6920803, 1810329, -10374494, -11609833, -7459822, -3148211, 3732864, 2458869, --3670587, -2245731, 3725884, 1773822, 1695438, 4695473, 7846369, 3408594, 345208, -3952444, --4258460, -3828427, -4348655, -6011881, -4258997, -450972, 3551938, 4544613, 6331856, 6458557, -3845606, -332860, -2737505, -3791383, -3174518, -3306051, -2165737, -1748589, -288837, 1487669, -2672007, 1889249, 1401770, 854699, 1426466, 652298, -390842, -2512019, -2100776, -912144, -949188, 1065152, 516470, -1080184, -647466, -289910, 143345, 0, 756451, 957778, -641024, -492311, -200790, 83752, 599685, 225486, -157840, -796180, -796716, -895501, --185757, 229781, 344671, -29528, 395137, 705985, 1163936, 606664, 3758, -780610, --862752, -899259, -387084, -205085, 3221, 118648, 578210, 399969, 267362, -62277, --8590, -107911, -31675, -82678, 110059, 4832, -104153, -298500, -116501, -40265, -102542, 5369, 39728, -20401, 34360, 12885, 81604, 35433, 49929, 9664, -9664, -28454, -39192, -47245, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --5833103, --75162, 1282048, 973347, 4169340, 551366, -506806, -2681670, 6125160, 3785477, 202937, --750546, 6084358, 2068564, -1939178, -5328981, 3406983, -1532230, 2646237, -5071820, 330712, --1210107, -3767760, -1018981, -1894618, -699006, 292058, 27917, -2746632, -1685238, -434329, --526670, -1707250, 1833951, -173409, -1826972, 3263638, -5421860, -2570538, 2592550, -3255048, -451508, -2019708, -2975339, 2027225, 1840930, -1596117, 2039036, 3926674, 2211908, -2034204, --2379949, 430034, 773631, -2398739, 2602213, 4329864, -3689914, -1178969, 2132451, 1595044, --877784, -1129040, -1801202, 2386391, 727997, -2858301, 3253438, 1583769, -2668785, -2002529, -3420942, -2579665, -3294777, -6212134, -5399311, 2939905, 3402688, 272194, 1494649, -590558, -1224066, -2301566, 3490198, -291521, 1615982, -1600949, 901943, -1458678, -1136556, 52613, -2236604, -496069, -568546, -1003949, 333934, -759136, 155156, 258772, -461172, -547071, -71941, -33823, -180926, -600222, 302795, -224412, 7785165, -754841, -1580548, -3195993, -4980552, -2660732, -290984, -4058207, -4331475, -5443871, -2566243, 4258997, -4421669, -1655710, --1561221, 1473174, -1107565, -6063420, 3148748, 1512902, 11769284, -1207423, 5501316, -1103807, --300648, -537945, 599148, -2487860, 4551592, -1202054, -929324, -2756832, -514859, -988379, -7057705, 1308891, -726386, -6628209, -688805, -1277753, 1987496, -4213363, -1177358, 1136556, -937914, -1167694, -723165, -2618856, -997506, -3147137, -1428614, 6101001, -1809792, 1930051, -3393561, -826781, -3331284, -4355097, 1116155, 1020055, 1300301, 2704219, 3192235, 2639794, -1511829, -1210644, -1188632, -1400696, -6144488, -1466731, -639413, 2967823, 2514703, -1515050, --165356, 3259880, -3417183, 1340030, 79994, -849330, -1984812, -2996814, -54761, 1784022, -1785096, 1900523, -812823, 781684, -729071, 159988, 2652679, 1084479, 187368, 24696, --427886, -62277, 150324, 533650, -360240, -371515, 1138166, 595927, 1159104, 1212791, -226560, 675384, -195958, 197569, 64961, -539018, -1395328, -246424, -10292889, -2487323, --173946, -2175401, -1500017, 3646427, -7222525, -6047851, -3530463, -2342905, 1060320, 8180839, --1742683, 11274, 1007170, -5815386, -1503239, -4852240, -730144, 8662412, -642098, -4172561, --2707440, 136365, 1785633, 1757715, -2398739, -10909217, -5211943, -1436130, -4198868, 416075, -221191, 4456566, -2836289, 3961571, 983011, -1997697, -5835787, -4879083, 6804839, -5578626, -3748433, 1117228, -3572339, -1320166, -3187940, -2276870, 3215857, -5994164, 3135863, 1085553, --74088, 1036698, 444529, -572841, 156766, -3023657, -4162360, 328028, -1253057, -3062312, --1226750, -4750234, 5577015, 3831648, 982474, 4575751, 561567, -1905892, 5666136, -2951180, --1846836, -1889786, 4317516, -4166655, 1887638, 3048353, 191126, 1899449, 4699768, 1743220, --119722, 326418, 1018444, 807991, -900333, -530428, 80531, -210453, 1523640, 760209, -1609539, 1211181, 474594, -1402844, -1660005, 1045288, -38655, -66035, 1556926, -1041530, --834297, 4832, 388695, 534723, -132607, -1697049, 1455994, 415538, -1267552, -7022809, -8428873, 9573482, 2566780, 2516851, -2840584, 4423280, 2180233, -5721434, 1691143, 3555696, --6818261, -5965173, 5847598, -5236102, -821413, -3402151, 5895380, 1227287, -753767, -2271501, --114354, -3943317, 3523484, -2006287, 2107218, -1006633, -98247, 3806952, 1460289, 470836, --1568737, 3728032, 2352032, 1056562, -390305, 3858491, -369367, 642635, -2544231, 4719096, -1017370, 1835025, 3451006, -9713069, -3188476, -1978906, -3507378, -3433826, 921271, 5295158, --2376191, -1515587, -2998424, -1399086, 1108102, 2282775, -6683506, -481573, 2265595, 186831, --576063, 2798171, 1827509, -6300180, -1788317, -1437203, 3798899, -4174171, 5386963, 5793374, -3031173, 1126892, -2787971, -231928, 423591, 3842922, -1100585, 384400, 426812, 505732, -5763846, 544924, 6145562, 2194728, 44023, -3058017, -1741609, 2443837, -565862, -97711, -201327, 56908, 520228, 2486786, 692564, 911607, 54761, 875636, -2107755, -275415, -608275, 720481, -572841, -434865, -30602, 716186, -658204, -560493, 819265, 722628, -1519345, 615254, 1402844, -970126, 71404, 57982, -613643, 1253057, 1928440, 10733123, --1941325, -107374, 3946001, 2573222, 1933809, 3651796, 9534291, -2601140, -830539, -9098888, -221191, -7810935, -9931575, 405338, 4287451, -12827457, 4409858, 4264366, 2347200, -3858491, --3054259, -4211753, -1581622, 301721, 307627, 4150012, 5445482, -685584, -5290326, -3175055, -4038880, -5665599, -2814277, -4778688, 1076963, -7758322, 3928285, 678605, -497142, 1318555, --220654, -1726577, 37581, 5096516, -5779416, 7100655, -5313949, -557809, 1326071, -3478387, --2868501, 2820720, 1383516, -1053878, -2690260, 5319854, 2216740, -3590593, -7307887, 921271, -1721745, 4363150, -154082, -1825361, 393526, 2346663, -1723893, 10273562, -3391951, -1582696, --7254737, -4744865, 11527155, 4748623, -2537252, -580894, -3983045, -4400731, -340376, 1680406, -322659, -2093797, 2500208, 1449015, 3458523, -282394, -2477123, 1087701, 115427, -1053341, -1019518, 1056025, -250182, 534187, 1371705, 536334, -313533, -945967, 578747, 446140, --955093, 1982127, 1602560, 609349, -934692, -2331094, 178778, -96100, -89657, 1167694, --1195612, 878858, 1275068, 404264, -728534, 2997887, 6936372, -9137543, -5376762, 6484327, --4763656, -5074504, -5579163, -6677064, 4891968, -1646046, -148176, -1493575, 304943, -7435126, --1444183, 3483219, 3798362, 907312, -3905199, -5693516, -4721243, -6010807, 1279363, 7291781, -1023276, 2396592, 2528662, 2469069, -4205847, 4514548, 2821794, -3130494, -2516314, -9766756, -1557463, 2246805, -7668127, -558346, 2418067, -1394791, 998580, -643171, -8231842, 7091528, --7665980, 6115497, 370441, 3107409, -8635032, -4803384, -7728257, -6075768, 1174137, -2134062, --2719251, -3403225, 16643, 3917010, -7149510, -73551, 2127083, -2273112, -7977365, -4971425, --1639604, 1559073, 3928285, 1738388, -6565395, 7094749, -2234994, -1491964, 7039989, -9141301, --2989297, -1785096, -1609002, 11045045, -3978750, -141197, -4130685, -3403762, 2028298, 1560684, --223338, 1223529, -852014, -1505386, 2079838, 74088, 863825, 925029, 2681133, -995896, -796716, 636192, 205085, 742493, -3003793, 3985193, 3597035, -1175210, -598074, 606127, --499827, 721018, 132070, -231391, -1437203, 937377, -735513, 390842, 3497177, 2267206, -1884954, -1389422, 2497524, 1035087, -992137, 1174137, 390305, 879931, 295279, 14107357, --12709882, -6732898, -8490077, 6011344, 2221035, -4371203, 2786897, -139050, 8365523, 458488, -15032, -8210904, 5675800, 9242233, 9700721, 8051990, -4600984, -767725, 1184337, -5268851, --3624953, 1290638, 519691, -7559680, -3738769, -3228742, 3588445, -639950, -5725192, -2675228, -1789928, 4424890, 486942, -1641214, 3221, -4048007, -179852, -319975, 544924, -8635032, -4933307, 5821828, 1149978, 2966749, 3446175, -7004018, 9858024, 8865349, 1593433, -6242735, -3489124, -2253784, -9220758, -2399813, -2943126, -206695, 515933, -238371, -5586679, -5011690, --11438035, -9561134, 92879, 5696201, -5258651, 2365453, 707596, -3585224, -9321690, -980326, -5395553, -3660923, 4839892, 9527848, 2882997, -4015258, 5501316, -75699, -607738, 2566780, -4278325, -428960, -772557, 1140851, 2755222, -1586454, -6265821, 310311, -196495, 612570, -755377, 2042794, 4551592, -1687385, -822486, 3404835, 3118146, 625992, 437013, -2269890, -4387846, 449361, -314606, 2594160, 809064, 916439, 429497, 2335389, 2101850, 2323041, -3875134, 264141, 2305324, 284542, 2568927, 1186485, 1449552, 963146, 2430952, 2117956, -1740536, -13553843, 1387274, -5086852, -18141404, -13965086, 3439732, 88047, -3163244, 3185255, -8663486, -1424319, 5174362, 4583267, 2644089, -1426466, -4754529, 3809636, -4056060, 448287, --3489661, 5405753, 9911711, -8989903, -2623688, 521302, 3573950, 933082, -2834142, -1660542, --3381750, -290447, -4175245, 5231807, 1111323, -6327024, 6959458, -7053410, -2294586, 8571144, -7531225, 6365142, -7352447, -4822175, -6593312, 7556458, 10228465, -180389, -2184528, 8129300, --12068858, 1451699, 3162707, -1185948, -10152766, 9057549, 3122978, 4591857, 8464307, 430034, --12241731, 3175055, 4936528, -3140158, -972273, 8374113, -8769249, -8188892, -7117298, 832687, -10751377, 5830955, -1633698, 12370580, -16557099, -6099928, 120259, 7912404, 3617436, -2400887, --13178570, -2062658, -5334887, 1442035, 4902169, 12749610, 2094333, -3621194, 1588601, -2189360, --934692, -4237522, -67109, -3493956, 1104880, 3468186, 1885491, 3191698, 3529926, 1136556, -685047, 15569, 549756, -1762547, -1925219, 153008, 3722663, 1432372, -565325, 667867, -1437740, 3059627, 308701, -1034013, 420907, -1009317, 2361695, -4571456, -2873870, -2024540, -2752537, 2468533, -4107063, 887985, -14602889, 14660334, 5929203, -408559, -1544578, 1187559, -2477659, 7919920, -1561221, 831076, -2598455, -1889249, 4446902, 2268817, 5171141, 2248952, -2965675, -9989557, -4168803, 16632261, 1641214, 4909685, 6960532, 2583423, -5701569, -10535018, -3217468, -4423280, 346282, 3641059, -5268315, -6186901, 7431367, 8731132, -4621922, -3297461, -6751689, -8403640, 3610994, -6478958, 2846490, -6271726, 8985608, 1211181, -1246077, 3131031, -15473157, 4234301, 5963562, -1800665, 739271, 2597918, 11412802, -1042066, 16378858, 440234, -7754564, -332323, 14779519, 5201743, 11016054, 8351564, -1920387, -5011690, -1393180, -5718212, --6311455, 8646843, -1813013, -3447248, 1291711, 77846, -4505958, -2215666, 1295470, 3843459, -1017370, -7488813, -7432978, -3878892, -7588134, -245887, -221191, -2260227, 2022393, -196495, -2996814, -496069, -3132642, 587337, -1359894, -5716602, -3640522, 766115, 7521562, -3241627, -2744484, -900333, -146566, 3474629, -2703145, 1153736, 1657857, -1967632, -1380295, -987306, --2237141, 1030792, -2780991, -3578782, -1416802, -3873524, 4743792, -1386738, 226023, -447750, --353798, 476205, -1661616, 679142, 1148904, 595390, 1891933, 2574833, 391379, 1913408, --1520418, -4176319, 756988, -1173063, 1668058, -1719598, 17145510, -4397510, -66035, -20947092, --664109, 11317239, -5799817, 9842991, -13291313, 2018635, 1428077, -312459, -17652316, -726386, --29469382, 1466195, -3174518, -12307766, -2073932, 1727651, -6400575, 1192390, 7556458, 1214939, --6680285, 1321776, -2009508, 6617471, -7188702, 485331, 9563282, 2196339, 871342, -1354525, -7349763, -4617627, 848793, 27917, 5661841, 1134408, -9887015, -5257577, -6947647, 8301098, --18594524, 9096204, 7524783, 6439767, 3656628, 1444183, -8088497, 5878200, -12021077, -2818572, --2455111, -2463164, -444529, 815507, 3981435, -9267466, -3566434, 15760919, 6678138, -5683316, --6567542, 1755568, -2673080, 4835597, -3099893, -924492, -4990215, 14292577, 7354595, -4846871, -989453, -7213935, 1781338, -5436355, -1794760, 5698885, 5378373, -1606318, 10499048, -4045859, -5260261, -6774774, 7362648, 1097901, -4121558, -5701032, -8435316, 2200097, -835371, 3925063, --989453, -2491618, 1671816, 1626719, 2689187, 2113661, 4872641, -153545, 1639604, -3653944, -3081639, -2616709, -1221918, -1957968, -284005, -4662724, -697932, 1853815, 4342212, -4006668, --1836099, -2891050, 3014530, 2255395, -1751273, -348966, -3020436, 2425046, 399969, 10776073, -10889890, 6299644, 5622112, -5371394, 6260452, 10463614, -7860327, -333397, -20323248, 11562589, -7881265, -2944200, 4651450, -1360968, 1576253, 7176354, -4584341, 11257109, -10245644, 926639, -12698608, 5521718, 743029, 9774809, -3518652, 4458176, 2553358, 5209259, 8667244, -5203890, --1079647, 15995532, 7991324, -412317, 2181307, -10939819, 14741938, -12502650, -817118, 12876312, -3984119, 13867376, -8774081, 2170569, -595927, -3473018, 1839320, -13521094, -9468255, 12618614, --6345278, -2782602, -4316442, -14376329, 10137197, -3440269, -2394981, -6407555, 6228240, 14472966, --11486353, -2401961, 9782862, -10837276, -4718559, 8690866, 12202539, -20272782, -5407364, -1803349, -8603893, -376347, 10051834, -2516851, -7392176, 418759, 5345087, 12974022, 6566468, -8840653, --468688, 6346351, -13016435, -8035347, -2500208, -6733972, -6781217, -869731, 6164352, -5910412, -1438277, 6359236, 1782411, 1080184, 4494147, -1185411, 2893197, 2723546, 2739652, 1503775, --513785, -3988951, -1334661, -1161789, -3568044, -1684701, 556198, 389231, -532039, 488553, -3941169, -3316252, -1046898, -2480344, 1893007, 1780801, -766652, -2757369, -5944235, 2934000, -2274722, 3803194, 1066226, 879931, -412854, -3761318, 1500017, -1548873, -1683627, -1137630, -1032403, -727460, 10566156, 22397718, 4325569, -13252658, -4725001, 4389994, -29392072, 917512, -176631, -4612258, -1444183, 13564044, -22180822, 4865661, 10368588, -8170639, 9190156, 17127792, -4252018, -15855946, 4291209, -4005057, -284005, -15544560, -4685810, 14146012, -1585917, 12968117, --3412352, -4571993, 2131915, -11011222, -6171868, -7933342, -5859409, -4346507, 10606959, -11732777, -1913408, 20431160, 13821205, 4587025, -20783884, 3429532, 13656385, 5681705, 824634, -7446400, --9016210, -22231288, -15322833, 3139621, -7574712, -7622493, -421444, 9451076, 6734509, -6710350, -308701, 13459354, -5178120, -2321967, 631897, 17703856, 694174, -932545, 9043591, 2784750, --20172388, 5621576, 5870147, -142271, -16700980, 7013145, 9817758, -7396471, -5220533, -13760001, -3674345, -5082020, 5215164, 2559801, -3206193, -5862094, 3809636, 1686848, 5870147, -2958696, -9141838, 3173444, -6230387, 701153, -299037, -8642011, 186831, 643708, -3758, -228707, --4502200, -3972308, -1797981, -163746, 5742372, 1840930, 3015067, 4571993, -2088428, -2804077, -2223183, -4531728, -3981972, -228170, -197032, 1333587, -1299765, 949725, 2838437, 2931315, -398358, -1840930, -402653, -301721, -479963, -35433, -719944, 286152, -77846, 3819837, --2214593, -2872260, 7117298, 5000953, -663572, 1889786, -3189550, 1360968, 99858, -1345399, --6765647, 22994182, 1116155, -4823785, -473520, 10078678, -5087389, 2668785, -2643016, 2266132, -8622147, -16147466, 16747688, 18991272, 5236639, 7953743, -6635188, 10708427, 25054692, 676457, --3033858, -4782446, 10582799, -3939559, -6243272, -2262374, 3660923, -12685723, 5442798, -11188390, -12506408, 2746095, 12595528, -8120173, 11468636, 3331821, 15055471, 2393908, 3060701, -5560909, -9324911, 2250563, -3138547, 13531294, -5455146, -9844065, 19174882, 15285252, 5557151, 14442364, -20994874, 25490630, -8096014, -8141648, -9167608, 3089692, -11891154, 13763223, -1846299, -1377611, --19817516, 4465156, 22213570, 22645752, -1006633, -3088082, -15741592, 140123, 14705968, -7677254, --9375377, 8286603, 1195612, -8190503, 2750390, -1414655, -5058935, -1215476, -4355097, -269509, -8486855, 6302328, -1868311, 1443109, -2195802, -8690329, -11317239, -2181844, 5469104, 2168422, -7788387, -1682554, -7556995, -2126546, 8082055, -3938485, 4552666, 7458211, -7699803, -2106145, --846645, 1845762, -517007, 4954782, 3585224, 1739999, -7670812, 1837172, 4038880, 1179505, -1599875, 2657511, -6815576, -3212636, -96100, -419833, -3662533, -8790187, -2925410, 696322, -4418985, 924492, -3670050, -4232154, 1566589, -30114164, -20984674, 11334419, 4515085, -15690052, -1830193, 7226283, -14301167, -8913131, -6063957, 17476758, 7923678, 5727876, -5313412, -4012036, --4188667, -10550050, -14178761, -25070260, 13344463, 11494406, -5190468, 28767154, 13889924, 27632746, -18985902, 1978906, -8606578, 7493108, 3540127, 12699145, 14494978, 16063178, -2105071, -2545842, -6915971, -6914898, -1488743, -6063957, -11669426, -19209242, -5505611, 20059644, -4744328, -7660074, --11051488, 8135205, 12157442, 8239895, 948651, 11933567, 22917946, -13314935, -6036040, -10186589, --7425999, -21663816, -5209796, 5813775, -9826885, -7536594, -25104620, -35691180, 4092030, -23420456, --37141804, -26702886, -11205033, 24420110, 8489003, 15015206, 11187853, -24571508, -10355703, 2437394, -12600897, -12059194, -14512694, -13864691, -4275640, 7692824, -8291971, -30681636, -19374598, -4158065, --6155225, -1927904, -4476430, 17799418, 16085726, 16856672, 16994112, 5926518, -28991, 6658273, -1882269, -213138, 5098126, -13638132, -5287642, 6386617, 8278550, -47782, -4445291, -4714801, -2151779, -7264937, -10953240, 10495289, -8139500, -3828963, 1005559, -9263708, -8978629, -16045461, --6315750, -3497714, 1248762, 14055280, -3442953, -1667521, -4267050, 7352984, -3614215, 750009, -6740415, 917512, -4648229, 3449396, 6715718, -3698504, -943282, 181462, -2265059, 4105989, --57084948, -8475581, 19116362, -19057844, 8643085, -7079180, -30697206, -9179956, 34087544, 42752640, --21809844, 1343788, -7125351, -33865816, -26820460, -25352118, -27051852, -14232448, -17458506, -945967, -6504191, -4272419, 7647190, 7035157, -10719165, -2567854, -14931454, 7046968, -23851564, -21507586, -5883569, 4314295, -6063957, -7566659, 19779398, -5145908, 27235462, 6386617, 25290914, -16222628, -11353746, 7464117, 30509838, 16462073, 11089069, 3331821, 5130876, -3077881, 9392557, 12780749, --9067750, -13042742, 21539798, -2448131, -25663504, -49961208, -60017336, -43275016, 7850664, 352724, --55848532, 18759344, 10203769, 14545980, -18657338, 2850248, 7231115, 2915209, 29549374, 29908004, -59574956, 19983946, -30867394, -40006008, -24235964, -21937082, -25232932, -22607098, -217970, 12943958, -17514876, -10550050, 22873922, -18774376, -26103200, -20423644, -13211856, -10049150, -20272246, 13389024, --870268, 12815109, 10172093, 1751273, 22475564, -11192148, -4444218, -21511344, 7907572, 11892228, --1256815, -1701344, 7155953, -20665236, 1330366, -7206955, 4558034, -9849434, -13806709, 8926016, -140123, -5762236, -1724429, 10443750, -7501698, 5493263, -6945499, 6222871, 5790153, -2772938, --6892349, 4870493, 5682242, -15242839, 6964290, -3766150, -4002373, -4584878, 3849365, -10273025, --4702453, 32338956, -8652212, -61108796, -17459042, 50303192, -6958384, 11214696, 7183870, 9385577, -17638894, 14417131, 5058398, -9982578, -3674882, 2483028, -10845866, -2550674, 18516678, -16564615, --9809705, -16608639, -3927748, 2826625, 2177549, 4363150, 8698383, -12646531, 11304891, 27509266, --427886, -16115791, 1544578, -10561325, -3543885, 16292958, -17146584, 1901060, 5544803, 19927038, -29042568, -18459770, -10390063, 11149198, 1664300, 3098819, 3485366, -12276627, -31047782, -5647345, --14372571, 28292024, -53727892, -35509180, -14426795, -5964099, 15729781, 3162707, -18849538, -3310346, --21736292, -23780698, -8290361, -17233020, 3311957, 13921063, 64969432, 11870216, -9425306, -41816340, --34053720, 10013716, -836982, -39276404, 21336324, 20838108, -39567388, -919123, 10581726, 11310260, -43146704, 18659486, 9205726, -42606612, -21622476, -29468308, 26886496, -2895882, -8473434, -4959077, -8572218, 27867358, 24114630, -12797392, -24894168, -37015100, 9196599, 21503290, -7395397, -4026532, -19443316, 10687489, 16987670, 3954591, 6242735, -14445049, -3936338, -6985228, 7521025, 7239168, --1685775, -3588982, -1810329, 9846749, 11713986, -17002164, 9977746, 6998113, 14101988, -9178345, --5820755, 8303246, 3382287, -12410845, -932008, 13791677, 3015604, -10851235, -3557844, 1433982, --20789252, -71877888, 10918344, 11826729, -1828582, -586263, -5012764, -20276004, 8753680, -4013647, -37523520, -37562712, -7225209, 39516920, -1240172, -25755308, -2685428, 23547158, 28492276, 17730162, --4474819, 20562156, -14578730, 14071387, -5602248, -4620311, -12545599, 22469122, 15446850, -13757317, --6054830, -1544578, 22757958, -1557463, 2885144, -13740137, 15502148, 10264435, -15950435, 30406220, -1849520, -26334592, 24240258, -28656022, -14889578, 27108222, -56219512, -35625144, 31346818, -19063212, -23368380, -35435628, 8522289, 13721884, -19272056, 1285269, -1058173, -36588828, -8114804, 38863548, -40960568, -45502496, -14783277, 14583025, -36410584, 48192216, 48227652, 7372312, -67815920, -35321276, -73147048, -37837588, -7154879, 59464360, -34069292, -69990248, -15323370, 64256468, -13205951, -45951856, --10916733, -84339736, -3360812, 69333656, -24545202, -68061272, -6453189, -18706194, -8722005, 21000242, --1914482, -230318, -24476482, -15781857, -7435126, 28083180, -34372088, 2304787, 6149320, -10345502, -1780801, 33321966, -20389284, -25722560, -2926483, 9819906, 21096342, -7568269, 10901164, 16252156, -2367064, -23157926, -12101607, 1146219, -18358838, -8595303, 36826124, -13065291, -34768836, -8868034, -21218212, 9146133, -2075006, 5200132, -31369904, -17821966, 24967718, 36698348, 5000953, -26138098, --12434467, 1769527, 10190347, 18702972, 2509335, -10253161, -39760660, -37519760, -836445, -47367584, --13868986, -20135344, -18868328, -14310831, 30993020, -3370476, -9681930, -13002477, 6220724, -16640851, --39335456, 30629022, 9853729, 26456998, 8511551, 27359478, -10654203, -16908212, 6304475, -28616294, -22472342, -25920128, -5234492, 17077326, -19412178, -4155918, -11683922, -31386010, 4993437, -23700704, --16829830, -20682416, -15046344, -9459665, -20763482, 3704409, 23614804, -15791521, -5331665, 2873870, -21794274, -9804337, 7915625, -22055194, 36110476, 11192685, 15663209, 9800042, 34656092, -2027225, --40044128, 8893804, 14980309, -11229729, 195958, 21235392, -27744952, -27858768, -32248226, 28123446, -8679592, -40097816, 15962246, -26473104, -4821101, -37424196, 16904454, 26547192, 5856725, -41459320, -23625542, 19199578, -4928475, -36449240, 10193568, -22005802, -7159711, -1614908, -10755135, 18009334, --15913391, -29578902, 15041512, -6635725, 12782360, -208843, -729608, -243203, -7644505, -9254044, -6623377, 26313654, -2830384, -37318432, -9923522, 15433965, -18025978, -7924215, 18274012, -6824703, --2176475, -14987288, 29614874, 17067664, -8216273, 13037373, -1932198, 5796595, 24113020, -4412005, --20348482, 8556649, 13950591, -10838350, 17506286, -2895345, 10969883, 1080184, -7289633, 14118094, -21196738, -12034498, -21407190, 8404177, 13895830, -10937134, -1717450, 12311524, 4791573, -8567386, --8574902, 10903311, 35111356, 66104916, -16107738, 32705640, 6230387, -15805480, -29783450, -17409650, -38371776, -12775917, 6985228, 14817637, -4070555, 35391068, -5406290, 27748174, 28959354, -35898412, -18249316, -9492415, 681826, 12998182, 10697153, -1336809, 5619965, 10506564, 35481260, 36575404, -28105730, -20820928, -7264401, -48864916, -1670742, 11421392, 21807696, 4984847, -40550396, 17588428, --24422794, 31221192, -28480466, -19854024, 1833951, -23736674, -4269198, -13732084, 47976932, -26403312, --13107703, -50567336, -16645146, -26572962, 71096208, 43301324, -15247134, -48091824, -51731808, -30656402, -35254164, 46252504, 23248658, 6791417, -62035972, -28731720, 20091320, 17322676, 2462627, 22339736, --13052942, -40708236, 19031536, -69045360, 74855912, -7029251, -48767208, 112939384, 15968688, 39305932, -67460512, -112114216, -81013824, 22391276, -6891812, 17160542, 24319716, -70070240, -5426155, 14178224, -1174137, 58756228, 3930969, -30707942, -3448322, 31609886, -18556406, 13842143, 15984258, 702227, --13079786, 15501074, -41049688, 31221728, -8201777, -12924093, 17346300, 4763119, 1014686, 18540300, --4597226, 11144903, -2497524, 7190849, -5564130, -21336324, 12776454, 9169755, 12071006, -12348, -134755, 8549132, 4462471, 3396246, 24730422, 27850716, 1370632, 18301392, -17300128, 2721399, --11431592, 21155398, 18960134, 3118146, -5743445, -12458626, -29805462, -12890271, 2354716, -29436632, -19801410, -41559176, 25612500, -17151952, 42075112, -19087908, -2014340, 23916526, 4217121, 2017024, --10909754, -9495636, 1052267, -16230145, 17738214, -2167885, 18842558, -14900852, -14627585, 4867272, -715649, -15111842, 9434433, -1997697, 8234526, -4715874, -4074313, 7778723, -7542500, -725850, -5873368, -3175055, -3598646, 29778082, -2055142, -10131828, -5351530, 14072997, -1289564, -16410533, -8656507, 17365626, 3551938, 287226, -10334228, 3542274, -8361765, 7882876, 21285322, -7686918, -9752797, -8157754, -2351495, -8925479, -4110284, 5456756, 6921340, -12575664, 7537131, 2065342, --1524177, -12581033, 2190970, 4351339, -9141301, 13180718, 11267310, -22610856, 5805722, -20772072, --23332410, 15919833, -8251706, 19261854, 10679973, 401043, 10056666, -3301219, -11978127, -3085397, -830539, 13348221, -5999533, 3943854, 5701032, -8001524, -1293322, 4487167, -2222109, -1728724, -7980049, -321049, 3151432, -6700686, 2850248, -907312, -6507949, 12374338, 1276142, 10048613, --4862440, 8199630, -4057670, 324270, -6455873, 5379984, -3030100, 12214350, -3688303, 11527155, --11939472, 2389613, 1024350, -2865280, 655519, 1165547, 9647033, -744103, -10801306, 6971806, --5965710, 829466, 6982543, -7211250, 12010339, -24503862, 51458540, 9631464, 12569759, -6653441, -4619238, -1599339, 9671729, 2981244, 21876952, 1411434, -12016245, 7136088, -7873749, 3288334, -4405563, -10183367, 440234, 2335925, -10994043, 9841381, 2456721, -4570382, 13271986, -4873714, -5188321, -4183298, 2395518, 2455111, 1127429, -1773285, -4046933, -1916629, 1776506, 239981, --2322504, -6591164, 4758287, -4454955, 2326799, 4181151, -4542465, 857920, -4249334, 1105954, --6685117, -10768557, 10937671, -6009733, -2954401, 4598836, 2057826, -1966021, 1158567, 9403831, --10553272, 4445828, -4038343, 8137890, -8886287, 4923643, 2364916, -1625645, 1823751, 133144, -18790, 3947612, -5658620, 3058554, 2653216, -1577864, -646929, 7110319, -1208496, 2377265, --8436926, 11171210, -8820252, -200253, 5516886, -5138392, 3731790, 1190780, 1248762, -5368172, -4174171, 4391067, -2906619, 1700807, 2103460, -3841312, 1219234, 1797981, -930397, 3850975, -60666, -147103, -534723, 3452080, 2591476, -2285460, 2935073, -1626719, 1249836, 1489280, --501974, 4311074, -2088428, -21475, 2664490, -3503620, 153008, -402116, -2565706, 294742, -2368138, -788127, -2179159, 4298726, -2907693, 607738, 9752260, -45808512, -113716240, 24562918, -94565520, 63920388, 133380744, -43626668, -37286220, -76741400, -122638496, -12127914, 38233260, 50383188, -65773128, 33148020, 3645890, -10761041, -28424630, -40565968, -6133214, -10844792, 4006131, 9296994, --468688, 2325725, 4918812, 2160906, 16077136, 19055696, 11869679, -2203318, 2222109, -14130442, --29593398, -31575526, -15454366, -20717312, 17067664, 31399432, 33369212, 36590436, 20088098, -5943161, --14434311, -26931592, -28403156, -19776714, -11089606, -1302449, 7204271, 13779866, 14846628, 12440910, -10768557, -1869921, 2915209, -3203509, 1453310, -2414845, -1439351, -882079, -10048613, -10591926, --7620346, -15950972, 54224, -3027415, 2040110, 27055610, 35716412, 12016782, 12128451, -9816148, --19572702, -13584982, -23575076, -18994492, 6724845, -1657857, -11406359, 8770860, 9468792, 11212012, -26750666, 11085311, 11760694, 2887292, -14333916, -14200772, -11553999, -12688407, -15981573, -13714904, --8104604, 2495913, 17887466, 26856430, 25225416, 10181220, 5139465, -6580964, -12132746, -10984916, --12022687, -13974213, -6322729, -5831492, -418222, 4684736, 3676492, 10821707, 14454176, 10388989, -7161321, 2479270, -843961, -6837051, -6983617, -11012833, -12304544, -9743133, -8606578, -2209761, -9312026, 13800804, 14954539, 13212930, 5462662, 2441152, -6564858, -10540923, -5542119, -7788923, --10510859, -8010114, 1541893, 7206419, 6845641, 3811247, 4391604, 3900904, 3070902, 907849, --648003, -1088237, -2707440, -3576097, -3234110, -3854733, -4467840, -2411624, 2134062, 3740917, -4836133, 4030827, 2955474, 1007707, 134755, -1179505, -1682017, -2179696, -2368138, -2689723, --1528472, -598611, 963146, 1566053, 1571958, 1340567, 1220845, 251792, 40265, -292058, -193810, 183610, 629213, -887448, -1576253, -1376537, -751619, -707059, 336081, 965294, -1271847, 751082, -404264, -536871, 740882, 1180042, 1013612, -317291, -1243930, -1464584, --526670, -38118, 273804, -170188, -271657, -355409, 91805, 351650, 860067, 669478, -655519, 456340, 129386, -431107, -631897, -853625, -719407, -745177, -435402, 155156, -786516, 755377, 723702, 434329, 302795, 181999, -110059, -589484, -540629, -440771, --238371, -86973, 122943, 4295, 20401, 77309, 208843, 239444, 201863, 39728, --55835, -110059, -84826, -52613, -22549, -25770, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --6444599, -798327, 2026688, 1962800, 10102837, 2733210, 2121714, -3013457, 372052, -5147519, 1188632, -4697084, -2405719, 208843, -1010391, -2541547, -4082367, 3124052, -6818261, -3449933, -3429532, -3672734, 4026532, 2113124, 951872, 2910377, 2401424, 4817880, -1694902, 1676111, 2991982, -621697, 975494, -3542274, -1534377, -1490891, -1342177, 3251827, -6272263, 1030255, -2182917, -6541235, 141734, -1197222, -1660005, -2719788, -915365, -2837900, -8267812, -2628520, -1631014, --1349694, -1866163, 836982, -1561758, -405338, -546535, 2873333, 1277753, -390305, 1831267, --1633698, 3528316, -2338610, -3856881, 3694746, 3876208, -1698660, -3704946, 337155, 2006287, -1508607, 1741609, -1764695, 6442, 1409286, 1909650, 823023, -544387, 217970, 2376728, -4591857, 2216740, -587874, -71404, -1111323, -1171452, 944356, -1537598, 916976, 1122060, --466004, -166430, 483721, 426276, -483721, 367757, 243203, -2133525, 315143, 148713, -636192, 360240, -831076, 748935, 583579, -71404, 9132174, -1735167, -898722, 960462, -2503966, -6768332, 4179003, -8029978, -383326, -3898757, -592169, -2584497, -626528, -646393, -4002373, -3415036, 4336843, -4567161, -4985920, 2081449, 6640557, -7876433, -2202781, -3821447, -33823, -1998770, 2101850, 2794413, 1403381, 2847027, -4584878, 143881, 6385006, 2493766, -795106, -4672925, -6663642, -4020626, 998580, -3421478, -1939178, 1275068, 4293894, -3911105, --3850438, 1529545, -2820720, 4931160, 1639604, -533113, 3473555, 3294240, -24159, 5544803, -2734821, 1720134, 1455457, 3626563, 5727876, -3809099, 1079111, 1555315, -4061429, 335007, -3263102, -1301912, 8281234, -2588255, -2222646, -1753420, 3040837, 4198868, -5403606, -2218351, -1445793, -1002875, 1301912, 494458, -2379412, 1026497, 483721, -1764695, -2873870, 1148904, -779537, 2590402, 199716, 780073, 1181116, -144955, -877247, 1890323, 93952, -36507, -1632625, -926102, 780073, 2175938, -206695, -506806, 396748, -359704, 660351, -1381906, --444529, -660351, 68183, -236760, 842350, 59593, -866510, 5369, -11746736, -1891396, --2608656, -2083059, -1039919, -1426466, 6268505, 7490960, -1695438, 6114423, 2340757, -3361349, -1603097, -5100274, 914291, 1093606, -6860137, -1005559, 1080184, 1212791, 4765803, -903554, -4141422, -2755759, -5259725, -5555004, -1580548, -2805151, -4210142, 4381404, -1701344, -834297, --753230, 923418, 2391223, -6732361, 38118, 951335, -3184182, 8046085, 641024, -1971927, --1729798, 8590471, -601295, 1100049, 5087389, 160524, 3114388, 1217623, 299574, 4744865, --14496, -3303367, 4263292, 2289755, 2743410, 3862249, 1286880, -3118683, 2240899, 3170760, -3083250, 4752382, 42413, -4383014, -3497714, 5571647, 7755101, -7056095, 1433445, -1860795, --1231045, 1631014, 2970507, 2846490, -2245194, -899796, -2168959, -3635153, -3171297, -1161252, --2010582, -3123515, 729071, -846109, 1204202, 1020055, -957778, 570694, 207232, -2536715, -874563, -1712618, -3075197, 214748, -896038, -1291711, -1372779, -387621, 574989, -463320, -906775, -587337, -1027571, -1427003, -1308354, -563178, 253403, 1028108, -1989644, -8659191, -9226127, 8546985, 6443525, -4497368, 5036923, 9095130, -2289218, 7107097, 2674691, 1066226, --1108102, 7836705, 3704409, -1836635, -5622112, 3258807, -2330020, -3007551, 3175055, 3748970, -1644973, -5582384, 905701, 5010080, -2444910, 1698123, -10977936, 1580548, -883153, 5288179, -1293859, -2278480, -3309809, 6768332, -5826660, 471373, -4705674, 549756, -1440962, 3780645, --787590, -1233193, -5765994, -1384053, -1016297, 7160784, 358093, -6550899, -241055, -361851, -2240899, 3424163, -2913062, 12885, -3717294, 3969624, -868657, 4798016, -2586644, 7143068, -3550327, -7883413, 8356396, -1204202, -5768678, 983011, 7636989, 1551020, 1178432, -6174016, --399432, -2391760, -3332895, -3234110, 297963, 2911451, 3763465, 2043331, 2059437, -2409477, -1818919, -2088428, -231928, -111669, -958315, -401043, 2179696, -3432216, 942745, -335007, -309775, 1153736, 947577, -92342, 1502702, 163746, -2249489, -2446521, 1449552, 662499, --85899, -1615445, -306553, 390305, -204548, -705985, -1560147, 993748, -11274, -981400, -1109175, -653372, -413927, -1257889, -754841, -474594, -1573032, 1119376, 912144, 10045392, --3352759, -7137162, -298500, -10743324, 64425, -9220221, -3156801, 6471979, -6557878, -7241315, -2268280, 687195, 731755, -1635846, -2323577, -5218922, 3661460, -10288594, -3114388, 1132261, -6503118, 459562, 6596533, 2400350, 14404247, 5571110, -75699, 712965, 6899865, -1547799, --1967632, -1199370, 1206886, -4433480, -2168422, -7531225, -456877, -3414499, -2021319, 9464497, -228707, 5953362, -2274722, 2478196, -515396, 3586835, -1094680, 3345243, -3145527, -3904662, --565325, 1214939, -3950833, -3941169, 433255, 2159832, 4437238, -540092, -1960116, -799401, -4214437, 7140383, 466541, -4713190, -6791954, 188979, 1965484, 810675, 9454834, -5785858, --240518, 4290136, -1473174, -4830765, 6687264, 3119757, 1252520, -3177739, -3450469, -5779416, --2222109, -534723, -2966749, -1430224, -2558727, 598611, 762894, 1566053, 268972, 533113, --3194919, -1597191, -3430605, -1121523, -932545, -2576444, -1618666, 1022202, -228707, -1029718, --220654, 973347, -2115272, 1205812, -1501628, -76773, -576063, -1096290, -336618, 77309, -1078037, -1443109, -2217814, 1949915, 1191317, 635118, 8924942, -6823630, -1378148, 584652, --518080, -236760, -5617817, -4317516, -595927, 3755412, 1370632, 1519345, 1584843, 3946538, --795643, 3611531, 2922188, -9246528, -3549791, -10854993, 2830920, -3810173, 5481989, -3503620, --4793721, -3500935, 2852395, -7226820, -6018860, 8443906, -4593468, 9153649, -2153926, 2769180, --3211562, -6128919, 6780680, -5194763, -5854578, -564788, -3183645, -6860137, -5298379, -8655970, -359704, 5601174, 3212099, -3350075, 9639517, 3557307, -3543885, -4456029, -6976638, 327491, --2616709, -4855998, -2464238, -2046015, -3441343, 1860258, 7706782, -442382, 499827, -5199595, -2446521, 2636573, -4553739, -3583077, 1834488, 9401683, 3725347, -2300492, -1254131, -1944010, --9668508, -7574175, -6424734, 6736120, 7114077, -1008780, -3350611, 3146601, -2146410, 2766496, --1442572, 1326071, 198642, 171262, -3155727, 2127620, -1858110, -1283658, -521302, 1908576, -1376537, -153008, -2646237, 1694902, -415001, 1254667, -921807, -545461, -2345589, -971200, --126165, -245350, 403727, 486405, -339839, 433792, -1961726, 902480, 139050, 320512, --744103, 2421288, 1458678, -56371, -995359, 279710, -1515587, 2735357, 558883, 12694850, --2521683, -124017, -2199023, 8227547, 7798050, 2625836, -13258564, -2289755, -16081431, 9363566, -3903052, 164819, 16414291, 7709467, -1542430, -7496329, 6714108, -3264175, 1599875, 2211908, -985695, 5310727, -4893579, 9149354, 3433826, 802085, -2884608, -4802847, 6189048, 5189394, --1100585, 3340411, -7953743, 1378685, -10592463, 4189204, 513785, 5265093, -8710731, 1693291, --2896419, 1809792, 9745818, 8223789, 317828, 2309082, -6178311, 7924215, 154619, 16975322, -17977122, -2495376, -4886062, -5017059, -3977677, -10565083, -2995740, -13766981, 759672, -1243393, --827318, -2887829, 4735202, 7978439, 12596065, 11666742, 9000104, -15005005, -10693395, -568009, -686658, 15532749, -11070278, 8298414, -646393, -3259880, -1671279, -485331, -3153580, -8762270, --5719823, -1734093, 2479270, 710280, -271120, -2464774, 1313723, -3172907, -348429, -1735167, -3267933, 3598109, -942745, -807991, 3404835, 2528125, 397821, -616865, 1221918, 116501, -476205, -781147, 1449552, -223338, -911070, -1500554, 397821, 1372779, 2173790, 4663261, -3678103, -1918240, 412854, -3502546, -674310, 1406065, -310311, -783832, 61203, 580357, -742493, -4709969, 9103720, 1893007, -6867653, -3828963, 17166448, 16886738, 18927384, -1942936, --886911, -3311420, 3113851, 9228274, 10616622, 3036005, -4682588, -9222369, -18701362, 5452461, --11099269, -2482491, -1209033, -2448668, 1171452, -619549, -3501472, -472983, -10876468, -4336843, -564251, -2056753, -12145094, -5145908, 949188, 8706972, -2560338, 197032, -9686225, -3294240, -33286, 6306086, -3979287, 3857418, -10816338, -3040300, 2414309, 4022237, -3024194, 14364518, --3045132, -1875827, -7589207, -2523293, 5720360, 1928977, -742493, 7473780, 10331007, 12104828, --2225867, -6126771, -6981470, 54224, 1353989, 2807298, -4980552, 3877282, 5086852, 4311611, -4159676, 12110197, 8111583, 5389110, -740345, 2694555, -12186433, -2305861, 1184874, 6156299, -9707163, -1894618, -5622649, 1690070, 3281355, -2865280, 4928475, 3995393, 5334887, 808528, -2279554, -292058, -526134, -3960497, 2976949, -1258962, 1921998, 1764695, 472446, 2849174, -155693, 4605279, 3173444, 2069101, 1207960, 1277753, -89657, -623844, 273804, -1958505, --240518, -2441689, -3995930, -1571958, 700617, 658741, 1585917, -818191, 1006096, -1621350, -622770, 2035815, -195958, 350577, -17642652, 21931714, -627065, 3214783, 11991012, 202400, --4217658, 619012, -21415244, -13037373, -6129992, 3410741, -4224637, 2435783, -10018011, 6920803, --3504157, -103079, 13202193, -12890271, -8575439, 12349105, -3880503, -18121540, 1278290, -11178189, -2302103, -940061, 6778532, 2908767, 3415036, 1366873, -2191507, 8036421, -901406, 10328859, -6318971, -3692598, -6208912, -5833640, 2813204, -2875481, 2831457, 1984812, 6087580, 1760400, --11431055, 657667, 3884261, -3969087, 486405, -7901666, -1749662, 676457, 517007, 18080202, --3158949, 12840878, 15394773, -4255239, 8243653, -2556043, -447750, -8585640, 5444408, 13067975, -9156870, 2009508, 3604015, 8089571, -521302, 6699612, -2727304, -3783866, -6521908, 3535832, -16738561, 3713536, -2150168, 1298691, -11747809, -4008278, 295816, 11041287, 8096014, 3459059, -7191923, -2091649, 7065758, -109522, 4453881, 522912, -319975, -885300, 4936528, -562104, --3069291, -1944010, -1203128, -791348, -1218697, -2513093, 3577171, -2338610, -3039226, -932008, --4000225, -2815351, -3408594, -2017561, -2368675, -3129421, 1083406, 679142, 1355599, 1057636, --1787780, -994822, -3135326, -4192425, -333934, -2352568, 1396938, -1150514, 398358, 1983738, -2172180, 1422708, 3699578, -1023813, -274878, 2734821, 21058224, 3080565, 5266167, -4956393, --2501282, 14307073, -9410273, -2160369, -18539226, 17405892, 9105868, 1270237, -6282464, -17502528, -1797444, -4644471, 2171643, -19628538, 7033546, 10393284, -11389180, -2714419, 1736241, 1225139, -3828427, 11278584, 13889387, 60666, 1611, 2613488, 561567, -8384850, -9575093, -6350109, --12628278, -6213744, 10825465, 5040144, -3998615, -5329518, -3499325, -22239340, 4874788, 5361730, --10378788, 17068736, 652835, 12735115, -4538707, 8266202, -2680060, -10991358, 1037772, 10147934, --5543192, 5578089, 6552510, 18127984, 5064840, 5706938, 17412334, 9925133, 6626061, -24006182, -5025112, 3692061, 4713190, 505196, -9747965, 17426830, -12878996, 9946607, 10464688, -15654619, --3367254, 21455510, -19040664, 3255048, -4416300, -2053531, -6819335, 8360691, -3515968, -7116761, --6024766, 3744675, 8179765, -7562901, 9490267, -7806103, -3350075, 10727755, 4020626, -876710, --4641786, -5010616, -59056, -1984812, -8076686, -932545, -1655173, -2280091, -657667, 6444599, --459562, -5936719, 641024, 2517388, 6240588, 3848828, 4981089, -1960116, 2678449, -3543885, -278099, -1204738, 2677912, 5116380, -3671123, 2353642, 2534031, -275415, -3156264, 1756105, -1498407, -10980084, -16589311, -7285875, -6890202, -22287660, 15271830, 2438468, 16299401, 984621, -2405719, -7675644, -3949223, 7968238, -518617, 8237748, -8036958, -2531346, 1548336, -3612068, --6560563, 9812927, -9846213, 11678553, -3970161, 3843996, -2410014, -7821136, -6988986, 3455838, --2467459, -21475, 6087043, 23314156, 1772211, -2907693, -7740068, 3410741, 18872624, -3381750, --2956548, -10852845, -3660923, 1644436, -10220412, -3700114, -14628659, 9567040, -17933100, -32564442, --3294777, 1132261, 15699179, -16028281, 15080704, 9829033, -7519951, -15124190, -2294586, 2598992, -4592394, 649614, 9595494, -6213744, -2216203, -32118840, -4158602, 33378876, 3406983, -5482526, --4265977, -17137994, 13131326, -5428302, -4744865, -4138738, -2324651, -7346542, -10945724, 3459059, -6573448, -198642, 5057324, -9241159, -16978542, -477815, -8858907, -2448131, 501974, -8798777, -2271501, -6372658, -11314018, -8359080, -3949223, 3874061, 5469104, -836982, -13414793, -3238405, -1066763, -6536404, -2780455, -396748, -6032819, -3486440, 1880122, -95026, -4695473, -1772748, -2464774, 1020055, -6307697, -2400887, 359704, 6206228, 6884833, 1989644, -1796907, -2228014, --566936, 4689568, -745714, -227633, 578747, 1908039, -5243082, 5314485, -890669, 3661460, -605054, -3637837, 15421617, 13775034, -4468377, -5697811, -1419487, -22228604, 14570677, -14069239, --11621108, -9009768, 5444408, 2199560, 13498545, 1612223, -7482370, -8728447, -9052180, 6944425, --3529390, -4863514, 12321187, 13800804, 4631049, -9360881, 11343009, 18377092, -7124277, -4070555, -15855409, 4063039, 3095598, -10431402, -118112, 15124190, -22466974, 15365246, -3457986, 2055679, -9121974, 11111080, -206695, 5537287, -10650982, -8629126, 5669894, 21160766, 5555540, 5143760, -7896834, -10714333, 2117419, 9383430, 5309117, -1782411, 7435126, 4687957, -12846784, 10306311, --12527883, 2769717, 8908836, -9856413, 7340636, -12023224, -4938139, 2186138, 278099, 7663833, --5083094, 6572911, -5197984, 916439, 2284386, -2248952, -5105106, -9719511, 25772488, 2763275, -7595113, -11322608, -26674432, 18679886, -18203146, -7818451, -314069, -4170413, -2920041, -1578937, --7665443, 4628364, 3510599, 1993402, -7111929, 8494908, 6293738, -2852395, -3170223, 2502355, --2656437, 2357400, -2683281, 9019431, 3041374, 843424, 6111739, 6752763, -4206921, 42950, -2933463, 4697621, 1612223, 2253247, -4560182, -5553930, 4162897, 5833103, 8093866, -1149441, --7992934, -1067836, 394063, 3805878, -12133819, 4472672, -4270271, -1705102, 2409477, 2791729, --3258807, 4126927, -5906, 3287261, -2243584, 7810935, 2325725, 3264175, -1458141, 4451197, --14687178, 15363635, -5776194, -15374909, -19902342, -5637145, -2099165, 11547556, -17526688, -2903935, --2130841, 9074192, 17250736, 14258755, 8857833, 1267552, -4519916, -2776160, -1858110, 12096239, -9943923, -2459943, 1511829, -2758980, 7776575, -19053548, 11235634, 6129992, 8780524, 2902861, -1970316, 16231218, -6507949, -14006962, 8053, -4680978, 884226, -19390166, -10741713, -1239635, -16054051, -10998874, -3507915, 2545305, -715649, 361314, 15779173, 6272263, -2521683, 1289564, -7688529, 5011153, 18395882, -5537824, 8369281, 9283035, 4959077, -3100430, 2959233, -20202990, -8528194, -3868155, 851477, -4722854, -11119670, -14977088, 2962454, -7203197, -20249160, 4732517, --17214228, -12738336, -3028489, -25982404, -15733002, 3752728, 10972031, -13038447, 2725694, 906775, -29651380, 28061706, 26535918, -933082, 1431298, -14121316, -8502962, 10969346, -6067178, -4073240, -1771137, -3697967, 6172942, -7793218, -3872450, -425739, 2303176, -4745402, 5654325, 5598490, -193274, -2610803, 1517197, 5462662, -4624606, -6176700, -1605244, 4893042, -6914898, 11421929, -6595996, -703301, 5190468, -2024540, -4874788, -7814693, -4212826, -6953552, -3737695, 3784403, -630286, 11510512, -2792266, -3925063, -1844689, -26360898, -29148870, 17122960, 15370614, 5066988, -16666084, 28007482, 7866770, -10867878, 8944806, -4410395, -8082055, 12734041, 787590, -11661373, -6935299, 9128416, 1999307, 3124052, 565862, 1294933, 25630218, -689879, 5376226, 2267743, -15850577, 808528, 25421912, -253940, -11394548, 20315732, 4037269, -9175124, -3338263, 10695542, --2388002, -321049, 8329552, -15676631, 15369004, -3407520, -22868016, -6492380, 2084133, -22843858, --2693481, -2499671, 9842454, 9529996, 16941498, -12109660, 2461553, 2595771, 3408594, 7181186, --11028939, -12386149, 6285148, -421981, 12916577, 10503879, 3136937, 27170500, -4695473, -4307852, --18797998, 27729382, 4776004, 19209242, 11684459, -31175556, 4311611, 2721936, 18901614, -10203769, -7975755, 75699, -8408472, -1124208, -6823093, 15250892, -29542396, -3665218, -2253247, 28454, -1186485, 4636954, 7051263, -188979, 13428752, -612570, -2087891, -4436165, -2965138, 802085, --4865661, 1526861, -1433982, 4028143, 2727841, -1465121, 988379, -1652489, -8346732, -503585, -263067, 2024003, -8522289, 4432406, -1870995, 4662187, 3572876, 6612102, -6932614, 7738458, --4373888, 2478733, 5464809, 5044439, -1888712, 158914, -3207804, 4377109, -409096, 2132988, --251256, -909459, 11171210, 6352794, 13422, 5264556, 1425392, 5478768, 1060857, 17191144, --36191540, 21551072, 21920440, -9299141, 5235029, 3085397, 5953362, 194884, 17453674, -12659953, --2716030, -13583371, -87510, -7656853, 1252520, 3708704, -19850266, 8987219, 21615496, -14811732, --14216342, -14489609, 28769838, -12513387, -7037841, 2723009, -9832254, -29743186, 5255430, 21678310, --29680372, -13404593, 10276246, 15985331, 4338454, -4463008, 6889128, -10482405, -4926865, -495532, -14715632, -20151450, -16061567, 11463805, 18477486, 7331509, -23073638, -7412040, 577673, -1010391, --4008278, 12111808, -3578245, 18252000, -14804215, -3165928, -25233, -16885664, 10744398, -19666118, --13571560, 6364605, -8826158, 19251654, 27738510, 16440061, -18353468, 9794136, -5401995, -5425081, --12958453, -3955665, -21116206, 16219407, 11873974, 5823439, 626528, -9903121, -5614059, 6609418, --22046604, 17871896, -4215511, -2942053, 9294846, 1749125, 8462696, -2308545, -1345935, -7430294, --2190433, 817118, 1487132, -5802501, -2092723, -2709588, -2144799, 10102837, 1040456, -50466, --4806069, 4176319, 3952444, -3430068, 2171643, 4699768, 994285, 7832410, -2791192, -5299453, -1079111, -8718247, 4533338, 3430068, 1100585, -140660, 3478387, -615254, 5707475, 1984812, -4047470, -6859063, -2166274, 6669548, 304943, 2803540, 3279208, -6380174, 885300, 6725919, -21095268, 35125316, -193810, -26490284, 5682779, -31620086, 5484673, 14443438, 6822019, 1966558, -19104552, 14139032, -791885, -2848100, -26127360, -14058502, 449361, -12202002, 35535484, -6416681, --7981123, -15261093, 1972464, 13397077, 9398999, -430570, 6922414, 10448582, -15670725, 5440650, -30502320, 10833518, -20823076, -14671071, 9950902, -10274099, -1343788, 7471096, -4561256, -17183628, --4048007, 2149631, 29072096, -6219650, 6514392, -7658464, -23361400, 4160213, 29495152, -7853348, --17563196, 5202279, -10725607, 7266011, -6095096, -7114614, 20298552, -5104569, -2226404, 9961103, --17343078, 6362457, 21481278, -8779450, 1925219, -12463995, 37711960, -6763500, 4574677, 12297028, --8650064, -2004676, -9955734, 5368709, -11260867, -9483825, -8862665, 14512158, -19466940, 2974802, --2800319, -5727876, 15303505, 453119, -5094905, -6342593, 894964, 5827734, 4540854, -8587250, --1482838, 519691, -2327336, -10648298, -6378027, -1825898, 2673617, 1007707, 976031, 1654099, -8888972, -8715026, 9341017, 1977296, 2777770, 779537, 7431904, -3985730, 12133283, -2473901, --71404, 9388262, 12192338, -6139119, 8012799, -3760781, 2766496, -6811818, 6226092, 5329518, --10295037, -313533, -4043712, -1212255, -5082557, 3992709, -6281927, 6004901, -1140851, -2063195, --10433549, -58262304, -20553030, -1269700, 18335216, -9952513, -29265370, -11164231, -4468377, 14010720, -3492882, -4100083, -14578193, 14952392, 26734024, -12454331, 20160040, 4886599, -38779796, 14165339, -17898740, -6578816, -15890305, -3164854, 23566486, 25143276, -2305324, -19463182, 1140851, -2423435, --2690260, -16259672, 3762391, 7086696, -25636122, 17329120, 14725295, -18168248, 3127810, -20355998, -6932614, 48959944, -44144212, 45248016, 20382304, 1825361, 27624156, 13595182, -28639916, 16874390, --21580600, -5027259, 23190140, 866510, 6514929, -12177306, -21016886, 63149440, -15070503, 688805, -24793772, -12290586, 4697621, 1680406, 15254113, 35474820, 33753076, 31883152, 1831267, -855772, --5333813, 1401770, -8843875, 2181307, 27081380, -7447474, -9616432, 2493229, 3607236, 15586973, -18266496, 5021891, 5008469, 12860206, 5405753, -10233296, 3107409, -5392869, -14957760, -6883222, -7628399, -11392401, -16221018, -12440373, -710280, 1234803, -9360344, 4490389, 10280004, 1382443, --3516505, -861678, -11884711, 13675713, -2185602, -3275450, 9499931, -8209293, 6417755, -6207302, --4904316, 16134582, -186831, -12404939, 15399605, -9780714, 9237401, 4137664, -6210523, 4427575, --2257005, 11057930, -5294621, 3695283, 448287, 692564, -1306744, 11781095, -6285148, -1668595, --970663, 1883343, -1844152, 4988068, 9135932, 14837501, -3950833, -42844448, 19428822, -31130460, -43725988, 5146982, -38075420, 8566312, 308164, 17850420, 8396124, -9223979, 32341104, 7890392, -1609002, 21607980, -17321604, -24044838, 745714, 12576738, 43589624, -6144488, 68719, -4574140, -31399432, 3422552, -25025164, -14763413, 4678293, -2763812, 13868986, -24268712, 11606075, 3965866, -7132330, -2163590, -9543954, 5531918, 9694815, 108448, 29151554, -47097000, 4052302, -16603807, --10394895, -6066105, -34515432, -50039592, -51883740, -37650756, 3921842, 205622, -30129732, -228170, --5556614, 3256659, -18731962, -48205640, 47435228, -833761, -7107097, 9700721, -47234976, -3219078, --11832635, 8869107, 13749264, 64755760, 48143900, -5387500, -698469, -1503775, 12606803, 19596862, -11764452, 8954470, -1928977, -7792682, -45984068, 8689256, -1069447, -17861158, -8148090, 29989072, --4343286, -5438503, 14166413, -1184337, 15549392, -6075231, 7736310, -848256, -3425237, 11110007, -13387413, -6149857, 1748052, 6028524, -2690797, 2857764, 537408, -137439, 9078487, -3895535, --4871567, 7681549, -9113384, 11874511, -242129, 6437619, 9687836, -4923643, 2263985, 8625905, --2250563, -5618354, -2279554, 998043, -1756105, 2384781, -11854647, -707596, -9434433, 9749576, -1241782, 6576132, 4428112, -1357210, 77309, -602906, 4219806, 6087043, 4743792, -729071, --5887327, -836982, -12341589, 58750856, -56296284, 9513889, -10931766, 2066416, 23664732, -17459042, -5834713, 789200, -60898880, 1392643, -6926709, 2836289, 6921877, -27276264, -10231686, -45079440, --11694122, -2314451, 2353642, -17140678, -12897787, -19708532, -8269960, 19305878, 4129611, 39119100, -9503689, -13402445, -14030584, 23984708, -26934276, 46032384, -36181880, 10370199, -29213294, 462246, -27661736, -50591492, 47418048, 8252780, 5380521, -34788700, -7041599, -6716792, -114354, 16479790, -16476568, 20779588, -40120364, -1160178, -15850577, -13780403, -15522549, -21718040, -15042049, 599148, -22783728, -24626806, 6459631, -45212048, -15207942, 11232413, 13281649, 2273112, -51394116, -27902256, --18405008, -26280904, -21770652, 1647120, -17185238, 27101780, 8038032, 13493177, -9611600, -14310831, -45556720, -15507516, 12130061, -9368397, 3398393, 34153044, 4435628, 6016713, -19394462, 19324668, -11164231, -8254927, 17947058, -13792751, 4822712, -5241471, 12088185, 2260764, -4276714, 6455336, -15436649, -5545877, 4810364, 5349919, 4483946, -2065342, 4009889, -2446521, 10517838, -3772592, -1576253, 9921374, -2319282, -4181151, 2907156, 4157528, -7212861, -1785096, -19638202, 11918534, -8057359, -177167, -11013907, -4661114, 703838, 3798362, 14533096, -2697776, -4327717, 4876399, -3514894, -2515777, 14671608, 2532420, -18569292, 4457639, 17725866, -2360085, 25269976, -47755740, -72659032, -54796268, -5830955, -33084134, 6443525, 656593, -20035486, -28305446, 32976758, 22152904, -10305774, -14474577, 14505715, 4473209, 31126702, -24748138, -16401943, 19342386, 32357210, -41443752, -16623671, -1540283, 19578072, -14981383, 5650567, -18406082, 3662533, -34430068, 11156714, 36796596, --1355062, -2893197, 45674292, 7917772, -21253108, -44801876, 38128572, -20284056, 17119202, -16482474, -45601280, 20124606, -5175973, 4645544, -26626112, 3480534, 11237245, -12845173, 12623983, -55409908, -21565030, 50153944, 39099236, -21780852, -22706956, -22711250, 25249038, 2006824, -8215736, 2010045, -64677912, -31680216, -14931454, 25066502, -21759914, -58583352, 24705188, 13053479, -42004780, 23443006, -40360344, 35721780, -11091216, -16018617, -28706488, 15274514, -17781164, -11308112, 25832618, 17674864, -7871602, 22789634, 12707198, -8858370, -8394514, -29473140, 6706055, -12397423, 10035728, -10939819, -20837034, 14480482, 3039226, -3970161, 19801410, -10946261, -1720134, 2552821, 7494718, 4603668, -9052180, 8441221, 514322, -4848481, -3045669, 7082938, 3571265, 2831994, 798864, 11165841, -35999344, -1119376, -3042448, 5381057, -12757663, 4430259, 12836584, -18676666, 8017094, 9616969, --7332583, -5258114, 8311299, 4756677, -10959683, -46898360, 25070798, -2731062, 6548752, -17177722, -15026480, 332860, 8246337, 2514167, 2739652, -9758166, 7482370, 25409026, -32405528, 27880244, --4751845, -17097192, 5735392, -11624866, 7548405, -11909944, -9797894, 8259222, -25849798, -2639258, -34438660, -49707268, 14027900, 2384244, -8318815, -15270219, -18077518, -11744588, 36133024, -29743722, --4262218, 11691975, -30232812, 7684770, 16594143, 11112154, 5682242, 5243082, -17055316, 13442174, --44475996, 637803, 38938712, -16267726, -4376035, -8722005, -10985453, -295279, -31481036, 16701517, -12650826, -26013006, 24422258, 6820408, -29673930, 12224551, -5762773, 21544092, 18762028, -27579058, -9638443, 30680562, -28879896, 16183437, -20565914, 16218870, 18753438, -29297582, 16513076, -2090039, --15543487, 22402550, 1174674, -35239132, 10836739, 15723338, 4732517, -9773198, 1705639, 26776974, --12370043, -24957518, 26601954, -1078037, 2010582, -1106491, -3363496, 16426102, -12227772, -5795522, -11569568, 4500589, -2866891, -11911555, 17648020, -6638946, -11600707, 1040993, 9272834, -5463199, --4316442, -2676302, 13774497, -10678362, -5604933, 1090922, 7461432, -6538551, 5339718, -154619, -13649406, -8552890, 2129230, 1264868, 1305133, 12124693, 22726282, -9742060, -107778984, -235927392, --93603440, -156848992, -213573696, 80554256, 28566902, 69540352, 317378208, 264364896, 174210848, 272515136, -185121680, 21909166, 45882060, 33170032, -145693888, -94066224, -64885144, -166638288, -170088224, -47278464, --47776144, -105819944, -31785980, -23027468, -127413424, -109594144, -35851704, -60446832, -120363776, -29632590, --20510080, -94363112, -11270531, 65066608, -28760712, -23274428, 96199216, 58896348, -39800388, 85205168, -140754672, 15393700, 79008608, 172852032, 84334904, 43409236, 186479424, 136257840, 101245264, 226518192, -306565632, 242429968, 281605440, 365037856, 238260624, 155841808, 204504336, 131644504, -37111200, -9382893, --91223496, -225601216, -318817024, -342947232, -458939264, -522025888, -554204864, -536141312, -515258112, -512292960, --427953760, -327641568, -307483680, -200805296, 15673946, 84666688, 109923784, 333779104, 327557280, 225815952, -332813248, 305007648, 165339056, 160667216, 212138640, 128190280, 60155312, 148279984, 151293984, 67783176, -122181616, 184613264, 122301880, 72661720, 157024544, 129997920, 25854092, 79507360, 115389664, 12598213, -21614422, 126342904, 77158016, 41384156, 133992776, 132815424, 48302276, 105766792, 91292216, -24161338, --66640176, -69076496, -158614752, -214687168, -211965232, -244640800, -269623008, -279608288, -273707520, -280787232, --312185600, -322973472, -308976192, -344664160, -295132448, -201167136, -153895664, -52661668, 88653496, 185942016, -272508160, 351890976, 357875456, 306459872, 278437888, 228783776, 173322864, 139827488, 117795920, 95318744, -74786656, 67928664, 63155884, 47057272, 40037684, 35871568, 19665582, 944356, -9678172, -26363046, --44558140, -56114284, -59055264, -64900712, -62697396, -51506320, -38879116, -28726352, -16068546, -8058970, --1786170, 5812165, 10996190, 10759430, 11323144, 7328825, 823560, -2627446, -5781026, -12096239, --14780593, -16276315, -20671140, -21386790, -18957448, -22625888, -25163140, -22430466, -24363738, -27937152, --26048976, -31117038, -37219648, -35335232, -35476968, -37627672, -32907502, -28376312, -25067040, -17754322, --8554501, -3359738, 2591476, 11011759, 18143016, 24471114, 31445604, 37023156, 39361228, 42083164, -45114872, 46407660, 47404092, 48569636, 46903728, 43354472, 38542500, 32251446, 24950002, 15705622, -6451578, -2192044, -11038066, -16878684, -19400368, -20314658, -19907710, -17541720, -15591805, -14633490, --13009993, -11562052, -10954314, -10108206, -8999567, -8184060, -7532299, -6605660, -5648419, -4878546, --4104378, -3309272, -2682744, -2281165, -1988570, -1767916, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --3986804, -2424509, 3884798, -1372779, 3452080, -563714, 3643743, 1831804, -803696, -1430224, 3690988, -309775, 734439, -4200478, -674847, -304406, -189515, 5737540, 2802466, -211527, -4308389, --3133716, -1854352, 523449, -100395, 1241246, 2637110, 801548, 971736, -4348118, -670552, --4232154, 168577, -2341294, 2768643, 2763812, -1104344, -2284386, 2894808, 618475, -1087701, --3912715, -532039, -2509872, 701153, 2390149, -3968550, -1938104, -664109, -1553704, 10126996, -2411624, 5845988, 424665, 1917703, -45097, -2927020, -2716030, -3455301, 1631551, -2850785, -2049773, 63888, 2502892, 2560874, 6218039, 1876364, -516470, -315143, -3694209, 6023155, -5541045, 969589, 1708323, 1569811, 1714766, -350577, -3092377, 921271, 1788317, -1161252, -517544, -951335, -2825552, 1345399, -2356863, -1600412, -733903, 188442, -1054415, -1144072, --1342714, -28991, -73551, -210990, 272194, -471373, 900333, -500364, -839129, -81068, -1129576, 425202, -461172, -1515587, -445603, 1403917, 96100, 634045, 557272, 394600, -14017700, -3288871, -2905546, -1114544, -2749316, 664109, -6631430, 540629, 1347546, 359704, -4544613, 539018, -911070, -3974455, 2581812, -5611375, -4832912, 1774358, -2344515, -1111860, --816044, 959925, 3820374, 5216238, 415001, -785442, 6200322, 2247342, -334471, 245350, --2499671, 98247, 6804302, 23085, -3125663, -2528125, -706522, 2320356, -3111704, -3847217, --3923990, -3212099, 3120294, -3020436, 1183800, -3674345, 1327145, 4492536, 319438, 3198140, --1323924, -2502355, -1220308, 2224793, -106300, 3432216, 5019206, 751082, -1481764, -2562485, --100932, -362388, 257698, 178241, -4371203, -445603, -2027225, -2219424, 2162516, 471373, -1398549, 1639604, -5205501, -2899640, 2201171, -960462, 3900904, 722628, 3291556, -646929, --799401, -881005, -1864016, -424665, -2055679, -819802, 92879, 3071975, -702764, -48318, --494458, 987306, 7516, 1197222, 270046, -236760, -734439, 968515, -1462436, 27917, -114890, -830539, 739808, 919123, -1227824, 445603, -586263, 566936, 568546, 18254, -938987, 118648, -426812, -9847823, -4792647, -2021319, -6691022, -2237678, -6417755, 2050847, --450435, -3951370, -4575751, -576063, -3715684, 30065, 3315715, -117575, -5717139, -2046015, -209917, -2163053, -1769527, 1811939, 5627481, 7175280, -1013075, -1762547, 4086125, 4626217, --1280437, -923955, -773631, -3060701, 1093069, 1589675, -2742874, -2026688, -543313, 2841658, -6146098, 514859, -1904818, 124017, -2912525, -998580, -4703526, -2151242, -2018098, -7514582, --687732, -3345243, -2281702, -8261907, 5327907, -3528853, -3111704, 1611150, -397284, -483721, -1222455, -6844568, -1684701, -2376191, -426812, -3901441, -424128, -1774358, 1971927, 2538326, --2141578, -1090385, -3202972, 1300301, -370978, -560493, 137439, -5036923, 5906, -4540854, -843961, -195958, -1339493, 1495722, 5796059, 2821257, -1203128, 428423, -860604, -2083059, -349503, 998580, -976568, -37581, -1240709, 158377, -433255, -1586454, 820339, 780610, --1666984, -720481, 622770, -634045, 379568, -1052267, -781684, -832150, -1547799, -1699733, --5906, 586800, -795106, -977642, 133681, -397284, -96637, -471373, 123480, -214212, --478352, -1381369, 942208, -407485, -588411, -607738, -1139777, -77309, 269509, -932545, -177167, 193274, 183610, -735513, 344134, -18544596, -1514513, -9170292, 8131447, -4803384, -14680735, -9485435, 9237401, -8414915, -549756, -184684, -6484864, 4947803, 139586, -2461553, -1466195, -2163590, -884763, -6336688, -97711, -4798016, 3711389, 1244467, 4553202, -2758443, -6811818, 6093485, -6014028, 1614371, -5116917, 5343476, 20938, -3854196, 289373, -605054, --221728, 3899294, 558346, -5979132, 2413772, 4174171, -302258, 4941360, -2353642, 4013647, --6140730, -3194919, 3999688, -3602404, 1001264, 5320928, -4931160, 7900056, 3146064, -7970923, -1906966, -7683697, 2724083, 4146791, 2856153, 3987877, 5861020, 1887638, -725313, -566936, -386547, 1762547, 4216048, -1553704, 7968238, 1446867, 5462125, 2864743, 1590749, 289910, -5484137, 885300, 1367947, -3243237, -4263829, 2075006, 2967823, 215822, 4723391, -665183, --22012, -979789, 5609228, 1580548, -1979443, 1156957, 975494, 693100, 1928977, 178241, -3505230, -661425, 1225676, 540629, 1359894, -1000191, 694711, 207769, 111132, 186294, --1151051, -1193464, 477815, -1442035, -545998, -1554778, 951335, -151934, -424665, -594316, -12274480, 128849, -3262565, -1054951, -4492536, -5379984, 8981850, -1672890, -1234803, 8243116, --569620, -1523640, 3685082, 6426345, 1883343, 3220152, -96637, -6895570, -1775432, 5281199, --7856569, -7792145, -2874944, 1774895, -5519570, -3302830, 179315, -728534, 5558225, -2062658, --1135482, 5842766, 8121247, -6924561, 1893544, -1610613, 3007551, 855772, -3026878, -622233, -3419331, 5186710, -1308354, -7195681, -1560147, -588411, -1841467, -3566434, 597537, -410706, -1392643, -949725, 1080184, 6820408, -4935455, 695785, -3741454, -3045669, -5169530, -1535451, --2955474, -7203197, -185220, 540629, -2746632, -513249, -2911451, 2838437, 3598109, -513249, -1124745, -2570538, -648003, 8790724, -1081258, -3591667, -11805254, -5374615, -79457, -4025458, -2819646, -1118839, 1100049, 18254, -2310693, -420370, 3538516, -2894271, 758062, -796716, -415001, 33286, -2409477, -1817845, -968515, -1897302, -304406, -3019362, -554051, -1704565, -417149, -1184874, -312459, -1622961, -1684701, -1722282, -363998, -172872, 705448, 457951, --155156, 504122, 488016, -87510, 1782411, 1477469, 62277, 875636, -615254, -922344, -295816, 15694884, 17655000, 3248606, -6606734, 3915400, 6881075, 6898255, 3838090, 5176510, -2248952, 8563091, -1011465, -1203665, -3676492, 5323075, -3328600, -7798587, -10681047, 1077500, --5186710, -4494684, 3610994, -1247151, -2929705, 8748848, -758062, 10902238, -2147, -4498442, --3101503, 3738232, 2455648, -2309619, -8855149, 12470438, 7173669, -61203, 6720550, 3947075, -4332012, -4267050, 4906464, 2427194, 900333, -1655710, -2357400, -5691369, -7948911, 2086280, -3693135, -6242735, 2351495, 5149666, 7774428, 1955821, 7014756, 3174518, 5963025, -9035001, -2551211, 694174, 1695438, 99321, -701690, 3658239, 3346853, 3217468, 4769025, -1728724, -2272038, 1272384, 6902013, 8436926, -4413616, -5194226, 683974, -2190970, -4631049, 1785096, -4658966, -3049964, 1929514, -8684961, -6365679, 1327145, -4415764, -2165737, -1476932, -4014184, --57982, -176094, 424128, -216896, 1632625, 1893007, -201327, 895501, 286152, 1402307, -1559073, -102542, 60130, -227633, 1713155, 773094, 921807, 2066416, -434865, -1242856, -1597191, -599685, -57445, 2390149, 1502165, 2255395, 3210488, 381715, 1415729, 751082, -2114198, 447213, 871342, 1056025, 14501420, 4559108, 6386080, -5355824, 2076080, -13198971, -679142, -9546639, 7175280, 4807679, -4032438, 6024229, 3421478, -6478958, -1621350, 9271761, --325881, 6371584, -1776506, 1248762, 7407745, -9276592, -729608, 1472100, 2698313, 577136, -2971581, 347892, 8993125, -4217121, -2601677, -2763812, 6798933, 822486, -3209951, 4092030, -11475616, -8063801, 1410897, 1501091, -704912, 4590783, -2328946, 8727910, 2944200, 2174327, --7198902, -760209, -1911261, 4021163, 3056406, 4346507, -4944044, -3274376, 4178466, -8665633, --4827543, 1906966, 9266929, 5568962, 8195872, -8986682, -2829847, -9132711, -2352568, 2705293, --774168, -8621073, 1125818, -5303211, -73551, -9430674, -11364483, -4693863, -8202314, 417686, -2903398, 1581085, -3506304, 4481262, 7289097, 1990717, 2154463, 4136591, -1313186, -7041062, --421444, -4861366, 2519535, 744103, -466004, 1245541, 658204, -5175436, -2611340, -1512902, -2573759, 313533, -1789391, -673236, -149787, -806917, 430570, -1101122, -468688, 301185, -2346126, 534187, 767189, 469225, -447750, 630286, 1570884, 745714, 2041720, 547071, -1061931, 59593, 1619740, -2568391, 1601486, -16980690, -15298137, -10963441, 3534221, 3577708, -12969727, -5523865, 12324409, -4834523, -19958176, -1649268, -1729798, -7636989, -12865038, -4610111, --147103, -7878581, 67646, -12196097, 1037772, -12865038, 7580618, -3137474, 5558762, -2415919, --97711, -3907347, -4560719, 8163122, 1706176, -2207076, 9239012, 1151051, 1595580, 3258270, -8511551, 7492571, 5742372, 270046, -9795747, -908386, 4893579, 1571958, 6207839, -2791192, -2835215, -14446659, 4730907, 8910447, -10912438, 6616934, 2392834, 10516227, 8072928, 93952, --2626909, -145492, 7174206, 3587908, -9183714, -7460358, -12744779, -6121939, -8519068, -1855963, --10568304, -2175938, -3473555, 10980084, -4970888, 5475010, -2716030, -1495186, -3442953, -7428683, --3919695, -2323577, -2403571, 6946036, -20488604, -4296041, 9729712, 533113, 1946694, 5245229, -9850507, -6030671, 1262184, 2678449, -358093, -5906, -1333587, 2756295, 4129074, -1677722, -421981, -308701, 4601521, -1586990, -42413, 4624606, 1020592, 1683090, 2192581, 2216203, --656056, 465467, -1124208, -1679869, -909459, -3041911, 994822, 2134062, 1507534, 906238, --3976066, 100932, -448287, -105764, -1814087, 1216013, 1914482, -897648, -103616, 2240899, -2383707, -2399276, -22849226, 17104708, -5131412, 10014790, 5719823, -657667, -15202037, 11541114, -1351841, -1276142, 7186554, 5036923, -6433324, -345745, 12429098, 3969624, -5995775, 8764955, --5196911, -4205310, -2989834, 2649458, -212064, -1885491, 946503, 3622268, 3175592, 3311957, --9624485, 5534602, -8046085, 10324028, -6856379, 10274636, 3094524, 763967, -10604811, -10719701, --3769371, -3731253, 11936788, 3220152, 9484898, 3865471, -9044664, 95563, -2296197, 3957812, --69793, 3456912, -1404991, -6119792, -3759170, 5972689, 15185931, 10941966, 934155, 3604551, --1451699, -2411087, 7624104, 6436546, -3185792, 9583683, 13516799, 19131394, 73551, -11337640, --13718662, 4430259, 2080912, -793495, 3017215, -163746, -4634807, -728534, 11352135, -2360085, --5465883, 20614770, 4911295, -3751654, 5775658, -80531, -571768, -878858, -3659312, -688269, -5983963, 2927557, -2389613, -3267396, 4089346, 3386045, -648540, 8252243, 2093797, 1386738, -566936, 3592203, 1110786, 3353833, 2105071, 1042066, 362388, 4281546, 2140504, 2190970, -317291, 4250944, -910533, 1548873, 2312303, 1652489, -687732, 4775467, 5354751, 1571421, --1238561, 5749888, 150324, -2905546, -778463, 4161287, -64425, -512712, -1205812, -927713, --68183, 986769, 2520072, 3858491, 1116155, 4081830, -1226750, 10491531, -15344308, 12918188, -5310190, -10470057, 24532316, 3701188, -12527346, 2918967, 6830609, 674310, 4932770, 17629768, --16842714, 11017665, -6813429, 9778567, -3718905, 2114735, -15603079, 2688650, -1697049, 6310381, --5983963, 915365, 1193464, 208843, -9162776, 8836358, 920734, -901943, 4136591, -1701344, -4074850, -2125472, 12383464, 9833328, 12257300, 12259984, -1979443, 4324495, 5280663, 605054, --6416145, 8694624, -10237055, 3227668, 10139881, -5963562, 5369783, -11263552, 3616363, -914291, --2703145, -903554, 863825, 3580929, 3367254, 12021613, -7838852, -300111, 7898982, 17098802, --15089294, 3951370, -3711926, 5259188, -2779918, 24939264, -15302968, 5549098, -8530879, -4635344, -2214056, 2694555, 1369558, -21635898, -11462731, 18054432, 9836549, -1874753, -9714679, -11136850, --4458176, 4116189, -12090333, -6493454, 5947993, 3435974, -247497, -237297, -8461622, 1691143, --2462090, -3078418, 3872987, -1968169, -2609730, -882616, -7402376, 2625299, -1917166, -2399813, --2691871, 3483219, -3570192, 4220342, -642098, -942745, 1408749, 1564979, 5316096, -5365488, --1165010, -4057134, -886911, 2765422, 2018098, 7079717, -2282238, 3951370, 865973, -2452426, --1670205, -593242, 2639258, -318364, 1353452, 11513734, -15075872, -3175055, 21392158, -6382859, --398358, 11476153, 2716567, 7094212, -15914464, 15327665, 1024350, 1174674, -4019553, -9559523, --1293322, -1452236, -10246181, -6166500, 11418707, -3588982, 2214056, -5559835, -25022480, 8514236, -1164473, -7704098, 4809290, 9736154, -884226, 1106491, -1934883, 2474438, 6599754, 2127620, -10589242, 7270306, 1677185, 9271761, -7419556, -7295539, -10416369, 3978214, 6055367, 1789928, --16536698, 4729833, -14127221, 20533164, -4840428, 7319698, 17508434, -6859063, 11131481, 2807835, -12117176, 4905927, -5819681, -17919140, -12868259, -10010495, -1365800, -10509785, -2087891, -9183714, --5965710, 18089328, 3931506, -7667054, -6817724, 3674345, 6724845, -1538135, 2636573, -32801738, -13232794, 2267206, -10516227, -12916040, -3360812, -21655226, 2357400, 10807748, 1207423, -9289477, -5772973, 4880157, -7641821, 3860639, 2295123, -1883880, 270046, -4878009, 1305133, 1729798, -1284732, -6366216, -3484829, 2651069, -3991098, 947577, -2405719, -1521492, 1553168, 5410585, --6819335, 2404108, 5322002, -6338835, -5980742, 812286, -5488968, 1286880, -3642669, 3815542, -2061584, -6351720, 3578782, -4166118, -2705830, 4415764, 1023813, 9913321, 3068217, 0, --617938, 790274, -2592550, 1111323, 7341710, -20116016, -24706800, 15188615, -12053289, -14048301, --3903589, 9599252, 19579682, -12613245, 1194538, 9419400, -2631204, -3854733, 5148592, 3424700, -14751065, 5062693, -13900125, -357019, -6981470, -306016, -8204462, -10823318, 1833951, 11188927, --668941, 5091684, -8993662, 2860448, 11023034, 8620536, 1413044, 1043140, 6937446, 6638946, -4247186, 10143639, -12470438, 13997298, 10069014, 3584150, -10287520, 949188, 8156143, -8053064, -9453760, -6356552, 10690174, -2634963, 13917842, -21495774, 23134842, 5577015, 21822728, 1581085, --4474282, -1335735, 7956427, 694711, -18003430, 888521, -1171452, -18621904, 6053757, 13536126, --17729088, 15042586, -15595563, 5069672, 6169184, 3433826, -19545860, -9313100, -9543417, 2066953, -1565516, -11308649, -16727287, 3458523, -14701136, 10265509, -7046968, -3711926, 5186710, -9070971, --7026030, -9311489, -3801583, -5120138, 391379, -7415798, -5551245, -6752763, -10128070, -4824322, --2040110, -2158758, -2490007, -2831994, -1888712, -4722317, -5236639, 3684008, -6287296, -3327526, --1540283, 5083094, -2309619, 308164, -8058433, -5735392, -2563559, -6442, -1756642, -6824166, --868120, -451508, 5763309, 3794067, -4490925, -4159139, 1025960, -2152852, 4279398, -2193118, -2341294, -4165045, -11730629, 17230336, 3302293, 11268384, 10906533, 2914135, -8813273, 1686848, -29219736, -20458002, 4645544, -3767760, -11288248, 454193, 3722663, 4550518, -374199, -127238, --6037651, -8702677, -13476534, -6886443, 9761387, -8581882, -13543106, 7458748, -5010616, 2746095, --2005750, 5758478, -5910412, 12345347, -4769025, 1175747, -535260, 1146756, 11291469, 3752728, --5614596, 5982890, -5161477, 9289477, -5948530, 3712462, -13798656, -10060424, -7514582, 2202781, --7029251, -11969537, 4706748, 8596914, 2299955, -6436009, 3774740, 6031745, 6757058, 18777060, -25844966, 35340600, -3868155, 5514201, 8320426, 4876399, 4545149, 5566815, -7496329, 13946833, --2220498, 18252000, 22455162, 16514149, 6524056, 9242770, 2916283, 31610960, 8914741, -5930276, --5237713, -4628364, -2021856, -2156611, 1490891, -2644626, -6119255, 5199595, -9576166, 2687576, --2301029, 2844879, -4840965, -3832185, -3090229, 7100655, -7161858, -6832219, -650151, 2878165, --3679176, -8738648, -3023120, 416612, -4257387, 4541928, 8629663, -5071820, -693637, 1793149, --999117, 2881386, 4971962, -2433099, -6154688, -1052267, 2837900, -2996277, 7844221, 9419937, -5693516, -2740189, -6476811, -860067, 9185324, 1046898, -323733, 4132832, 1240172, -82678, --1610613, 2318209, 2300492, -6255083, -4630512, -241055, 35455492, 28388660, -12352863, -5672578, --14739791, 8517457, 4153770, 17372606, -3047816, -7504382, -3395172, -11234561, 2539936, 446677, -16374563, -6114960, 6105296, -22020834, 12141336, -1710471, 8543764, -88047, 7740605, 1342177, --12548284, -6451578, -10766946, -8147553, 9057012, 21876416, 9510131, -2571075, -6785512, -266825, --1848447, 5480915, 7370701, -13940390, -290447, -4837207, -4691178, -15137075, -11734388, -24551644, -434329, -1195612, 8842801, -7329899, 15741592, -11931419, -5294621, 31596464, 31222264, -21561272, -4802311, 18169322, -10541460, -4967667, 9293235, -3430068, -13236015, 35148400, -8766565, -53255984, -17708150, -626528, -27515172, 21088826, 22414898, -7898982, 15682536, 20043002, -9477382, 770410, -12634183, -13660680, 5711233, 11083700, -19694572, -2632278, -6520834, 1145146, -7233799, 186294, -2716567, -8232379, 6660421, -9555765, -4478041, 4774930, 9459129, -5393405, 502511, 1995012, --1469416, 3319473, -6981470, 10304700, -5231807, 10880226, 10408316, -156229, 500364, 7187091, --5226975, 1637456, -318364, 8984535, -6690486, 5490042, 1602023, -20691542, 3984656, -2483028, --3946538, 1242319, -622770, 2345052, -11778948, 1726040, -3093987, -10243497, 1744831, 17923436, --16766479, 5638219, 9733470, -14149770, -95563, 8048232, -12870406, -6191196, 2864743, 6593312, -12154221, 6095633, -9163313, -1409823, 9085466, -9659918, 10390600, -4643934, -12461311, 11875585, -6309307, 6077379, -2858838, -2900714, -4193499, -308164, 10049150, -19741280, 10311680, -109522, -17074106, -10251013, 375273, -12822088, 6056978, -21061982, 2700998, 1257352, -8160975, -6135898, -3765613, -14083735, -24519968, 15364709, -1059783, 4831838, -14367739, 9316321, -2048163, 9988483, -10711648, 5454609, -10037875, 8875013, -4643397, -1970853, -18882286, 3068754, -13345000, -14695231, --21556978, -8682813, 3832722, 6368900, -22262426, -10866267, 1545115, -7791071, -30010010, -23762444, --24406152, -4833449, -14460618, 13396540, 18781892, 5352066, -17960480, -20917028, -24405078, -2027225, --1508607, 13776644, -11615202, -20336670, -9815611, -13452911, 4990752, 529892, 5200132, 2735357, --6490770, 1735167, 5345087, -5065914, -1944010, -4253092, -2542084, -3003256, -6300180, -48318, -8460549, 535260, 2677375, 2638721, -1127966, 6389838, -3700651, 9739375, 8797704, -3111167, --7358353, -132070, -2650532, -4026532, -4523675, -4022774, 7128035, 543313, 6730751, -6483253, --7013682, -1097364, 3838090, -11450920, 2294586, 1404454, -8270497, 2100776, -6757058, -15043123, -9698036, -3424700, 1457068, -2318209, 1889786, -7595650, -1746441, -562641, -15952045, 26459682, -29443612, -7537668, 19724100, -6065031, -8259222, -8170639, 19186692, -17398376, -4297115, -8447127, -30651034, 863288, 10969346, 3778498, -3288334, 15191836, 8287140, 12393128, 3616363, -2243047, --5811628, 11861089, -2401961, -12146168, 14458471, -651761, 12611098, -14770929, 9744207, 3366181, --15173046, -11635066, 26584236, 17296908, -2053531, 9458055, 7684234, -17364016, -11651709, 5470715, -3913789, 11796128, 1090385, 2439542, 4276714, 14450417, 5616744, 3574487, -15002858, 40170292, -26671746, 2940979, -18571976, 8862128, -6534793, 4866735, -4586488, 8490613, -6376953, 1217086, -21821656, -15564961, -7889318, -20866024, 5340792, -5772973, -4097936, 18827526, 5506148, 2283849, -1167694, -7937637, -15934866, 11069741, -500901, 107374, 11530377, 11814918, -1447404, -8884140, --10681584, 19498078, -2553895, -1254131, -4330938, 14638859, -1712618, -10411001, 6225555, 5375689, -8698919, 4105989, 2718714, 13532905, -3336116, -5076115, 4200478, -437013, -6979, 1104344, -5692443, -3611531, -605590, -4576288, 898722, 6473053, -3637301, 1471563, 7633768, -2986076, -1160715, 5903970, -195421, -1699196, -13317620, 8182987, -7734163, 5344013, -9123047, -1921461, -2780455, -5411659, -2782602, 12038256, 8127152, 987843, -2551211, 11258183, 1565516, 5359046, -4317516, 2508261, -2739652, 4835597, 1855963, 4788352, -9891847, -21233782, 54554676, -61572116, --7256884, -32489816, 39528732, 10519986, 6854768, -15600395, 3576097, -12764643, 35408248, -6440304, --2413235, 3483219, -1889249, -14062260, 5191005, 7916162, 10631655, -24158654, -12713103, -12523051, -4813585, -7431904, -6567005, -939524, -325881, 15575699, -8223789, 608812, 11800960, -1656247, --15920370, 1815697, 12432320, -1676648, -25035902, 18469970, 2160906, 159988, -115964, -10717017, -8154533, -46359876, -32307280, -4689031, -11610907, 1905892, 3469260, -21818434, 33940444, -13663365, -46781856, -6808597, -16451872, 15842524, 2633352, 14117021, 21643950, 6678674, -22320946, -6376416, -25003152, 57920320, 1897302, -15064061, 24194624, 1894618, 28544352, 4420595, 38654704, -10185515, --1569811, -1246614, 9017284, 1131187, 14847702, 26977764, 1602023, -5954436, -4858145, 8452496, --7386807, -3381213, 17738752, 12758737, 1947231, -3525095, -6693170, -7726110, -4597763, -6324876, -12793634, -8129300, -5509370, 6118718, 2282238, -2649458, 5733245, 6300180, -3621194, 5371394, -9092983, -4925791, 605054, -13100187, 16269336, -304943, 13086228, 642098, -13634374, -142808, -1420560, 3353296, 1465658, -237834, -11712376, -11093364, -649077, -6555731, 8652748, 2924873, --3998078, -645319, 6810208, 1146219, -3921842, 137976, 4938676, -195958, -2368675, -751082, -2681670, 80351856, 25131464, 9139690, -2240362, -8318815, -11217918, 26422102, 24250996, -27343910, -16669842, 12723841, 3097208, -8061117, -14415521, -37394668, -13876502, 12329240, 4161287, -11836930, -22991496, -7109782, 9448391, 9389872, -5262409, -5049271, 23982024, 903017, -8805220, 15106474, --12701829, 29418916, -14054744, -8403104, -1357747, 11639361, 6260989, 29748554, -8840116, -17360794, --6041945, 8062191, 2249489, 16061567, 4561256, 1652489, -6198712, 12992276, 55558624, 23785528, --20343112, 18014704, -10565620, -16540993, 13873281, -355409, 4202089, -863825, 10056129, -14417668, --22081500, -58877024, -15343234, 21326660, -7594576, -20062866, 9087077, -4504347, 9051644, -23460722, --20538534, -9565966, 9123584, 9635759, 28421410, 5172751, -1772211, -21871048, -31028454, -3684545, --13834090, 2924336, 11478837, -14694157, -15095736, -3098282, -18832894, -31596464, -10357851, -8251706, --16782584, -3768297, 9658845, -8676371, -4465156, -10004589, -2159295, -22454090, -14210973, -14228690, -631360, 2297271, 8414378, -12471511, 7355132, -16887812, 940061, -9861782, -1078037, 5493800, --5050345, 8233989, -22235582, -4257387, 7881265, 3402151, 7264401, -2654827, -5902896, 11204496, --1951526, -2088965, 7911867, -11027865, -8689793, -1452773, 2347200, -14694157, -6856379, -7910793, --4308389, -1058710, 34897, 1480690, -6493991, 891206, -1840394, -12930536, 17361868, -14618458, -48495548, 40635224, 18845780, -11605539, -17566954, 28929826, 24776592, -33342904, -7031399, -20583094, -27977954, -5190468, -40513352, -17898740, 13996225, 24742232, -46773804, 18258442, -32475322, 11531987, --19296752, -5299453, 22060026, -7915625, 3113315, 13899051, 29504278, -19881940, -32994476, 6941741, --2855080, 3177739, 30263414, 7309498, 22519050, -29265908, -5601174, 8879845, -26033944, 41718628, --5176510, 24842628, -3781719, -6306086, 20442970, 20300700, -12151536, 45982456, -11106785, -20576652, -22134650, 39451960, 2026151, 6824166, 1702418, 17178796, -18972482, 13701483, 60260000, 27423366, --2105608, 26020522, 32339494, -24509768, -74196632, 5208722, 44423920, 50040664, 13606993, -5257040, --21989696, 25791278, 55530704, 25616796, 13409425, -54976656, 10133975, -31309238, -19425600, -48513804, -40754944, 8527121, -14257681, -19523848, 14241575, -14211510, 7653632, 5124433, 7129109, -18200460, --3920768, -2573759, 9410273, -6497749, 7945153, 6688338, -8231842, -5599027, 11092290, 150861, -11921219, -5437966, 4380330, -8204462, 4187056, 22347788, 4204773, 3937411, -2941516, -24680492, --12390981, -15350213, 8000451, 40784472, 38674568, 34717832, -2775086, -25749402, -24136106, -11750494, -16237124, 17886928, -1370632, -8728447, -13050795, -19236622, 5005785, 10362145, 8833137, 8056285, -6501507, -91805, 662499, -3671660, 3773129, -5313949, 3642132, -1408212, -781147, -191126, -4734665, 1115081, 2039573, 311922, 2244121, -4032438, 440234, -1891933, -607738, 34152508, --67017596, 51501488, 10842645, -30612380, 617402, 28893318, -18913426, 1014149, 16102906, -19805704, -1886028, -17777406, -11236708, 19202262, -16137266, -9074192, -34091304, 15038291, 33469606, 9564355, --14811195, -25224342, -3901441, 19298898, 10493679, -21518324, -421981, 26353920, -3310883, 1974611, --8774618, -6212670, 61610768, -29314226, -7388418, -6670621, 10465762, 28731184, -30217780, -16860430, -40571336, -4608500, -2472828, -48237852, -39896488, 16906602, 27313308, 15017353, -49457624, 34127272, --805306, -7444789, 7201050, -35306780, -9728101, -4467303, -17476758, 32009318, -24808804, -13706851, --26686242, -15346455, -35217660, 10759430, -55111408, -15364172, 6534256, -27370216, 6847789, 15384573, -6765647, -300111, -9842991, -19753628, 29250874, -6251862, -2777770, -10419591, 17719962, 35504348, -5350993, -47785808, 4251481, -21246130, 3215857, 4501663, -8717173, 3408594, -14322105, -4777614, --1206886, -10799158, 204548, -3052648, 8409546, 7552700, -2631741, 3830037, 15648713, -7024419, --5649493, 16062641, -11660299, 10677826, -5677410, -5355824, 1145146, -6770479, -3335579, 9790378, --19051938, 5764383, 4418985, 7085086, 13549011, -9540733, 1569274, 10203769, 3635690, -3437585, --9048422, -1753957, -2246268, 266288, -9287867, 2789045, -1697049, -3736085, 2181844, 1238024, --4356171, 9782862, -4249870, -2964601, 155156, 2586107, -443992, -38739532, 23372138, -799401, -30278982, -6342056, 31326954, 3840775, -4070019, 13940390, 36368708, 17342004, 9286256, 7170985, -4609037, 14215268, -18373870, -1606318, -13785234, -14563697, 22369800, 13811541, 8544837, -6579890, --5655398, -2793876, 23409182, 3445101, -10389526, -17089138, -786516, -4159676, 17611514, 2523293, -14730664, 27520002, -7718593, -70289824, 4604205, 56820808, 5946382, -41978472, -5412733, 15924128, -12646531, 22207128, 20358144, -1849520, -13223131, -13747653, 17822504, -11030550, 1996623, 6038724, --72815800, -12827457, -13999446, 11356430, 57235272, -1258962, 4600447, -13498545, 3893925, 11582453, -24015310, 12315819, -14185740, -7693897, -35348656, -2377265, 24312736, -10962367, -5039608, 8708583, -24701430, 19765440, -5314485, -25381646, 166430, 8919573, 2815351, -16957604, 2083059, 1763621, --1242856, -14683956, -18665390, 15960635, 13358959, -949725, -2891050, -14379551, 11221676, 4344360, -2590939, 4063576, 3613678, 6192269, 471910, -15915538, 8796630, 139050, -913217, 600759, -4227322, 1683627, -2042257, -328028, 688805, -5432060, -2944200, -21919902, 3489124, 14962592, --10640781, 5141076, -17397302, 9546102, 4666482, -2915746, -4731980, -2079838, -1606855, 1752884, --3728032, 19725174, -2285460, -114974128, -216266096, -86909736, -146375712, -168225808, 104614128, 36575404, -96118680, 289042720, 189186864, 152665680, 228787008, 114221432, 7376607, 90491736, 22529788, -91556352, --64340756, -72960760, -167657808, -136184288, -58856620, -121946472, -134399728, -55560772, -82726976, -138758576, --71731856, 10737418, -87282864, -79863840, 17602386, -17298518, -79598096, 89179624, 58194124, -66844188, -66133908, 100366944, 15184857, 57383448, 201639056, 95770792, 60429116, 237221248, 166195904, 96238944, -233818560, 313495040, 194053072, 281115264, 364082240, 260193952, 172519168, 227442672, 119684632, -115854592, --76347336, -153031296, -356576768, -357509312, -362166144, -546620480, -539802752, -542292224, -564992768, -533350656, --518883040, -408425088, -326990368, -247233344, -101946416, 29992294, 79237312, 201849504, 350595488, 297107584, -398215424, 566326848, 475965600, 444584416, 541227072, 401013568, 205641968, 222919536, 209086528, 78510392, -55818468, 112277424, 41457708, -9803263, 37524056, 13407277, -78087336, -69707856, -42112692, -139520400, --160383200, -69931728, -122039888, -167891344, -69459288, -44569412, -91621856, -1279900, 29465624, -30203284, --4640176, -22274774, -128250408, -184597696, -207071648, -258466832, -304471840, -273139520, -249846832, -232501072, --174679008, -111100600, -79272752, -14313515, 61551176, 95938832, 138836432, 228888464, 278005728, 324459552, -347487552, 329436352, 293428960, 224679408, 153418912, 85848344, 11886322, -14376866, -24871082, -40209484, --45617920, -46239080, -53912040, -56945896, -51776368, -46379740, -51896628, -55413132, -53262428, -55683176, --61290792, -58942520, -56664576, -44727252, -30185030, -23958938, -15392089, 850404, 6777996, 14328011, -30232274, 39797704, 41323492, 40657772, 31958314, 21353504, 12538083, -404801, -11883638, -17962090, --29010356, -37242200, -40296456, -47302624, -49655192, -45314052, -42583528, -39825620, -33300492, -29113972, --23296976, -16974784, -12474733, -6114960, -579821, 6496675, 10862509, 15374372, 20226612, 25370908, -28627568, 33884608, 39545376, 43643848, 45848776, 47496968, 48521320, 47852380, 46573016, 46170900, -41958072, 36586144, 29709900, 21926344, 14084808, 5937793, -3006477, -10468983, -18383534, -24939802, --31581968, -37468220, -43444132, -45805828, -47371340, -46968688, -43336756, -39413840, -34636764, -27095874, --19742890, -12797392, -4628364, 2423435, 7080254, 11267310, 14266271, 14582488, 13673028, 12974022, -11217918, 8858907, 7205345, 6215892, 4965519, 4001836, 3454764, 3042448, 2530273, 2335389, -2358474, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --6914898, --610959, 6533719, -5777805, 2272038, -9754408, 127775, -3511136, 3959960, -3275450, 920734, --2211371, -4068408, -1021665, -366683, 3001109, 3742527, -3497714, -6128382, 3254512, 1122060, -2284923, 1380295, 2579128, -3542811, -2644089, 659278, -647466, 3227668, 2342905, -2705830, --554588, 2463701, 4567161, 2809982, 67646, -3541201, 1946157, -593779, -1861868, 2518998, -1116155, -3252901, -2701535, -2203855, 1860795, -3187403, -1687922, 2703682, 1071594, -84826, --3316789, 1245004, -2847027, -7419556, 768799, -2519535, -4759361, 2211908, -1329292, -1360968, --1609002, 111669, 3689377, 2209761, 1267552, 1673964, 2794413, -5589900, 2951716, -2219961, --2112587, -1231582, 1894618, 361851, 3964792, 5720897, 2269353, 446677, 686658, -81604, -3693135, -1541356, -94489, 1789928, 166967, -1511292, -1511292, 521302, -2147, -1707250, --817118, 537408, -47782, -226023, -639413, -845572, 610422, 366146, 658204, -252329, -258235, -175557, -1540820, -613107, 766652, 1264868, -668404, -842350, 332323, 800475, -14845554, -1257352, 2717641, 3264712, -1525787, 1536525, 5910412, -4616553, -821949, 1688459, --2300492, -454730, 4339528, -1406602, -986232, -303869, 1677722, -832687, 2085744, -1470489, --1451162, -666794, -3379066, -5759015, -1092532, -1848447, -780073, 3389803, -6106907, 7496329, -37044, 129923, 249108, 1415192, -189515, -2881923, 444529, 2310693, 5648419, 282394, --50466, -861678, -1917166, 3761855, 1776506, -1373316, 2065342, -3745748, 629213, 1196685, --2845416, -9739375, -3059627, -242666, -583579, -462783, -868120, -1239635, -717260, -1850594, -2375654, 7178501, 4056060, 315680, -24159, -190589, 2497524, -1466195, -6556268, -224949, --3420405, 2146947, -3879429, 2189360, -9456981, -56908, -1357210, 3209951, 5135171, -786516, --1238024, 775242, -34360, 2769717, 1002875, 465467, 3734474, -2759517, -377420, 478352, -1327682, 8590, 1353989, 78383, 862215, 402116, -194347, 282394, -350040, -37581, -774168, 1194001, 129386, -323733, -478352, 159988, -219580, 678068, 469762, 332323, --235686, 128312, 440771, -13082470, -12614856, -4750771, -1873143, -1804423, 5369, 3184718, -755377, 2586107, -5927055, 2924336, 3684008, 3561602, 4175245, -3238942, 892816, 9836012, --6092411, -218506, -4342212, -6291054, -759136, -449898, 5444945, -2647311, 566399, -4699768, -3003793, 1877975, 2356327, -10531260, 1615982, -1927904, -3700651, -996432, -59593, -7813620, --5066451, -4364224, -359704, 6524592, 2255395, 2159832, 3127273, -2921652, 1837172, -2621541, -5571110, 8584029, -813359, -790811, 2432025, 599685, 2210835, 4823249, -2273112, 4990215, --790811, -154619, 2943663, 4041564, -1540283, -5841156, -5383205, 2074469, -744640, -1003949, --2378338, 2650532, -4484483, 1662152, 3343095, 5665599, -3305514, 5432597, 3536906, 1766305, -2703682, 655519, -931471, -3659849, 2592013, -1722282, -3429532, -4317516, 1778653, -1423245, -2590939, 457414, -1675574, -2014877, -1040993, 858993, -1078574, -379568, -1382980, -605054, --96100, 1328219, 683974, -42413, 756988, 2617783, -266825, 8053, 1514513, -825707, -415538, -575526, -462783, 753767, 1085016, 1108638, 693100, -15032, -359704, 818191, -372588, 1793149, 2129767, -1707786, -193810, 943819, 278099, -972273, 307090, 1227287, -1050120, -556735, 129923, 690953, -624918, -14268418, 6223408, -6368363, 11526082, -10666014, -8441221, 4320737, -4410932, -5521718, -3059627, 2227478, 2010045, -2965138, 6811282, -2401961, --6442988, -1284732, 7043210, 4842039, -7056632, 1171989, -854699, -7388418, -3042984, -4738423, --1083406, -5646809, -1478543, -2332167, -7801271, -2753074, 4010963, 5748814, -1068373, -6672769, --1324997, 4802311, -1429687, 209380, 357556, 151398, -6643778, -153545, -766115, -1648731, --280247, 1224603, -4748623, 2777233, -5086315, -66035, -1611, 152471, 3832185, 125091, --1732482, 1595044, 2667175, 6324876, 2900177, 1473711, -1785096, -3847754, -3636227, -1481227, --3974455, -2833068, 2396055, 4155918, -2990908, -5019206, -3430605, 1652489, 920197, -4705137, --1595044, 637803, -3956739, -1790465, 587874, 1269163, 1657321, -1798518, -2171106, -2987687, -150324, -326418, -1127429, 981937, -962610, -299574, -2275259, -473520, -740345, 2073396, -1038308, -784905, 1032940, -81068, 352187, -949188, 153008, -547608, -11274, -783832, --1502702, 1147830, -69256, -1431298, -882616, -104153, -1306744, -1525250, 1478006, -881005, -17473000, 6942278, -1186485, 3949223, -2825552, 9788767, 4129611, 17643726, 319975, -17097192, -4367445, 10349797, -6174553, 1804423, 7120519, -5494337, 5017596, -4456029, -977642, -5491653, --5233955, -1662152, 1438814, -577136, 2354179, -2359011, 7560216, -4536559, 2128693, 1388348, -4915053, -9037148, -4718022, -3568044, -1078574, -3204583, 840740, 5502927, 3922916, 8744553, --1291711, -657130, -4997732, -1646583, 5513128, -5397164, 4551592, -5049271, -2130304, 8027294, -11590506, 8309151, 1449015, -6126234, 4282620, 3184718, -3269544, 6749541, -4467303, 1328219, -1056025, -12343736, -119185, -11701102, -4720169, 1861868, -3106872, -5586679, -4780836, 972810, -8023536, 2001992, -3295851, -4082903, -3603478, 806380, 1290638, 3841848, -6099928, -5484137, -361851, -1059246, 351650, -1577327, -918049, -980326, -540092, 1822140, 457414, 836445, --806917, -1267015, -1251446, 359704, 3190624, 1069447, 2314451, 742493, -3690988, 2771865, -1230508, 506806, 524523, 1603633, -382789, 1382980, 255551, -31675, -1162326, -843424, --1600412, 470299, 1511829, -292058, -769873, -858457, -5232881, -583042, -656593, 180926, --839129, 10790032, 21914534, -9630390, -7174206, -1986959, -2647311, 7599945, -7382512, -13390097, --4689031, 872415, -3334505, 3768297, 1739462, 6583111, 2712809, -2719788, 9483825, 8898635, --4202626, 591632, -6239514, -1106491, 263604, -3855270, -813359, 6627135, 9516037, 326418, -1500554, 3888556, 2445447, 1485522, 576599, -3688303, -6972880, 737124, -9995463, 301185, -2195802, -3215857, 3811784, -2567854, -5564667, -483721, 5252208, 2305861, -2476586, 16137803, --133144, 5168993, -9725953, -2203318, 6526203, -3153043, -7225209, 4145180, -8452496, -7554311, -1619203, 9132711, -7607461, -4281009, -2311766, 328028, -3495567, -3444564, 12301860, 7195681, --1214939, 637803, -5927055, -4232154, -2466385, 3673808, 4806069, 377420, 3833795, 2488397, --891743, 3597035, -3449396, 12323872, 6915434, 1313723, 299037, 1091459, -2189897, -848793, --2180770, -2245731, -165893, -128312, -2104534, 1021129, -3125126, -957778, 2255932, -892816, -2313914, 1333587, 2182917, 51540, 1474248, 1758789, 1530619, 266825, 2608119, 849867, -272730, -2005750, 91805, -769336, -134218, 93416, 870268, -172336, 782758, -1911797, --187368, 739808, 931471, 1421097, 8759586, -15546708, -2042257, -11663521, -6615860, -10561325, --2643552, -1576790, -1535451, -4028143, 4805532, -14906221, 7755101, -5049808, 4639102, 2051384, -6308233, 401579, 2656974, -5979668, -2489471, 2844342, -5936182, -4309463, 7423851, 2077690, -3402688, 3003256, -678068, 2026688, 11019275, -3874597, 1130650, -4885526, 8878771, -5266704, --19470698, 6101538, 3157875, 8276939, 4531191, 11388106, -7575249, -2988224, 6931004, -2797634, --6462852, -3047279, 3649649, -9453760, 9477919, -282394, 6348499, -7974681, -3429532, -2865280, --8603893, -1722819, -6820408, -3103651, 830539, 10062035, 8159364, -862215, -12183748, -6953015, --2163053, 9773735, 8144332, 5907191, 5520644, -3400004, -14114873, -3590056, -315143, 3375844, --4387846, -1351841, 7375533, -1344325, 8699993, 154082, 6059662, 2324651, 390842, -2150168, --123480, 3285650, 971200, -1465121, 402653, -3884261, -566399, -183610, -5146445, -3105261, --3249680, -1597728, 1147830, -2072322, 962073, -2792803, -256624, -789737, -1423782, 2340757, -1227824, -447750, -3461744, -1349694, 1544041, 2382096, 157840, -3442953, -1724429, 825171, -1913945, 530965, 988379, 299574, -1717450, -20419348, -24676198, -13923747, 10191957, 864362, --4564477, -5191542, -7848516, -789200, 2730526, -13745506, -1265942, 8759586, -5269925, -3739843, -9787694, 2608119, -6359236, 2500745, -6150930, 14484777, -4602595, -3386582, 4733054, -7463043, --4643934, -4358318, 2508798, -5168993, -1886028, 2463164, 1812476, -16908212, 7650948, 7432441, --4811974, 13172128, 5119064, 1297617, 12664785, 7231651, 2325188, 1809255, 13689671, -1311039, --2240899, -871878, 8446053, 4725001, -12250320, 4826470, 3950833, -46171, -6481643, -19859928, -8873939, -1265942, -4809290, -12439299, -6949794, 7712151, -1529545, -3593277, -8211978, -16146930, -1742683, -2199560, -8485782, -3576097, -15196131, -2404645, -3329137, -2852932, -541703, 5531918, -11868605, 5080410, -3814468, -8363912, 3379603, 630286, 5023501, 3126199, -1774895, 3623879, -1430761, -347355, -4431333, 459025, -7290170, -404264, -1503775, 1270774, -2738042, 3542274, -2195802, -780610, -478889, -669478, 636729, -1644973, -299037, 2051921, -663572, -702227, -3968550, -1474784, -846109, 3111704, -2229625, 1892470, -6067178, -4002910, -2141578, -3267933, --192737, -3248069, -4226248, -3230889, -780610, -650151, 1619203, -131533, -2525441, 1571421, -726386, -1401233, -21228950, 16979080, 898185, 8653822, -1613834, -758599, 1542430, 9356586, -870805, -1214939, -12851616, 4510253, -1465658, -9922985, 2521146, -6495601, -5028333, 18306762, -5150203, 5614059, -4023848, 6538014, 7864622, 7636989, -4516695, 6666326, 3405909, -7747048, -4962298, -7532836, -2664490, 4777614, 2202781, -795106, -4239670, -3932043, 12125766, -3562675, --5430986, -3440806, 2417530, 2641942, -5904507, -9847286, -793495, -10563472, -1323924, -9523016, --3671123, -2262374, 1793686, -4852240, -8320963, 10411538, -4383014, -11463805, 7253663, 12240657, --6003828, -3915937, 6114423, 4503273, 12052215, 7854959, 1149978, -106300, -12548821, 3024731, -11872363, 9626632, -8567923, 9180493, 9841381, -6618008, -18600966, -5954436, -16669842, 2811056, -9436043, 4823249, 1069447, -4955319, -6794102, -721555, 791885, 2908767, -1599339, 5457293, --2517925, -1881196, 2043868, 5779952, -8544837, -1091459, -1156957, -2545305, -25233, 2347737, --559956, -229244, -1421097, -128849, -1435593, 512175, -194884, -141734, 719944, 3045132, --2692408, -1454383, 1631014, 1975685, 6231998, -568009, 2554969, 2543695, -2806761, 2306398, -928787, -2319819, 532039, 988379, 657667, 2624762, 5426155, 1236414, -1939178, 3754875, --1239635, -1997160, 226560, -3512210, -1607928, -186831, 106837, 3991635, -33833068, 16094316, -4501663, -1666447, 22688702, -1423245, 11446625, -10254771, -2460480, 1718524, 68183, 12937515, -8200703, -17751100, 10960757, 755914, 6551436, -15996606, -697395, 9122511, -15702937, 19476602, -5222144, -286689, -7061463, 1091459, 8393440, -14097693, 1217086, 3504157, 2403571, -8722542, --3278134, 8102456, 4552129, -957241, 1140314, -5763846, -9802726, 3946001, -16519518, -759672, -23477902, 22917946, -7439420, 2772402, -1090922, 6504191, 16469589, 1314797, 7834021, 2550137, --8779450, -732829, -1746978, -25058450, -11370389, 15381352, 622770, 4687420, -6125697, -1612760, -5404680, 7405598, -776315, 19162534, 181462, 14929306, 1772211, 3084860, 1862405, -9905268, --12442520, 15120432, 3421478, -8009041, 10930692, -9118752, 717260, 9254044, 1410360, -2471217, -4243428, -4090956, -3955128, 4592394, 6301791, 376347, -8703751, -4218195, -9369471, -3389266, -2180233, 2901787, 1382980, -3664681, -1794223, -6743636, 4696547, -159988, -2807298, -1299228, -1906429, 1040993, 5848672, 5265630, 3340948, 3397319, 1057099, 4168266, -2970507, 1878511, -2153389, 2099702, -2612951, 4213900, 2132988, -709207, -904628, -1185948, -1194001, -2026151, --4821101, -1427540, -204548, -1952600, -3566970, 11307038, -24597814, 9886478, 15495705, -2140504, -4605816, 6979859, -3767223, -2374580, 9557376, -3593814, 14504641, -13804025, 7539815, 17954038, --19239306, 791885, -9157944, 11348377, 4768488, 9416179, -9745818, -7582228, -129386, 24267102, -260382, 12288975, -5462662, 765578, -1691143, -2130304, -10786810, -390305, -3045132, 4966593, --4832375, -6953552, -5892695, -415001, -2072859, 10985989, 1853815, -6024229, -5524939, -5542119, --2073932, -2621004, 17847736, 816044, 8945880, 653372, -4332012, -3873524, 14834280, 11137387, --4321274, -13968307, 7872675, 5487895, -30929134, 1840394, 17385490, 17045114, 3920232, 13565654, --18680424, 30586610, 2633352, 5896990, 5994164, 14621142, -1190780, -13001940, -4019016, -15370077, -17507360, -7702487, -5254356, 15382962, -511638, -5963562, -4716948, -11457899, 10863583, -18741090, --2816962, 1880122, -517007, 2748779, -3959423, -8000451, -5199058, 2585034, 2009508, -3738769, -919123, -3560528, -3987877, -2816425, 3394635, 1890859, -4520990, 4238596, 779537, -5337571, -2394981, -904091, -1973001, -4048007, -4763656, 984084, 2218351, 9831180, -4333622, 5863167, -640487, -1845225, -767725, -1049583, -2635499, 1589675, -345208, -2798708, -1041530, -1905355, -711891, 2081449, 1520955, -4003447, 9460739, -18210662, -14552960, 13073880, 11008538, 26833882, --9422621, -7057705, -4738423, 5083631, -11339787, -1340567, 4486630, -770410, 14440217, 9308268, --11501386, 1071058, 3408594, 8351027, -13103945, 13823352, -200253, 6138045, -2298344, -6270653, --13748190, 4888747, -2357400, -5791227, 2801929, -8436390, -8193724, -1825898, 4350265, 16737488, --24860344, -15040975, -13397077, -15065672, -4252018, 17353278, -10228465, -461172, 17093432, -2493766, --7675644, -14788646, -3973382, -6366752, -30588220, -23749558, -6685654, 5375152, -2905546, 5358509, --6781754, -4895189, 14553497, 8782671, -15289547, -7901666, -17114908, -6807523, 1418950, 6856379, --3055869, 1836099, -14603426, -11694659, -10662793, -300648, 2506650, 921271, -13822279, 451508, -18615462, 8027294, 21248276, -16732119, 25966298, 2296734, -16131897, -2685428, 750546, 4553739, --2703682, 7066832, -9865003, 4683125, -8738111, 4122095, 5975910, -1886028, 13293998, -1114007, -3138011, -3587908, -4801774, -2711735, 384936, 3002182, -5082020, -907312, 1706176, -1133335, -5107253, -1531693, -2557116, -8586176, 3794604, 548682, 4491999, 1909650, -2880849, -8078834, -2603287, -10327249, 2619393, -2683818, -430570, 1102196, -2224793, 818191, 1621887, 7178501, -2803003, -3099356, -13096966, 2528662, -1422708, 30231202, 3311957, 14570677, -12584791, -8538395, --3084324, -14206678, -9025337, -13719736, -6382859, -8880919, 16401943, 4147865, 4145180, 16924318, --442919, -932008, 7638600, 15236396, 23772644, 17416092, -3565360, -6410776, -27364848, 7586523, -8582955, 3386045, -17064442, 19781008, 7872138, 11644730, -3234647, 1151051, 11214696, 24704116, -24004036, 13900125, 2904472, 25688200, 664646, -7587060, 8319352, 15606301, 12625593, 23118736, -12178380, 585726, 2774549, -13838385, 6031208, -34692060, -5961952, -3416110, 7707319, 27407260, -15374372, 4111358, 19853486, -14337675, -13078175, 2895345, -33749852, -7977902, 1388885, 6562710, -7813620, 9016747, -2033130, 14905684, 1849520, 7755637, 27345520, -16743393, -8761196, -4555350, -5207111, -3107946, -25820806, -4776004, 17596482, -1175747, 22318260, -11878806, 605590, 9345312, --2172717, 2701535, -9329743, -4452808, -7247221, -4712116, -8040716, -6472516, 1729798, 1495186, --16121697, -7364795, -9092983, -2304787, 2944737, 4987531, -7206419, -176631, 2126009, -11206643, -1656247, -4432943, -7456063, -3763465, 542777, 2898029, -5129802, -1158031, -7829726, -485331, --2132988, -2400887, -5727876, -8209830, 2060511, 2901787, -4601521, -3033321, -3395709, -2396592, -1453310, 5651103, 1492501, 1888712, -1818382, -23300734, -7351911, 4222490, 17595944, 32337346, --13018046, 560493, 5331665, -5941551, 29965450, 5306969, -14786499, 26261578, -5434744, -8822400, -18785114, -17069810, -9997610, 1141388, 1628330, 2335925, 12295954, 6583111, 9974525, -3064459, -5280663, 15056008, 897111, 10264435, 1861332, 391379, 16617228, -21737904, -7924215, -7374459, -14458471, -11083163, -2908230, -6531035, 14316737, -6091338, 31884764, 23337242, -21777632, 10652056, --26162256, 3748433, 9404905, 5083631, 5610838, -33301028, -6500433, -32116692, 4219806, 2649458, -3874597, -5072357, -5865315, 15362024, -27780922, 9539122, -12055973, -52245056, -19610820, -17099338, -8549669, -7610145, 7898982, 26150446, 27827094, 15793132, 14615774, 13616120, 3906810, -20774220, -21758842, 37581, -24186572, -19201726, -30383672, -40170828, -20776368, -4066797, 32071058, 11582453, -1895691, 12309376, -9877351, -230854, 6117644, 5134097, -2651606, 4706748, 1455457, 3263638, -1279363, -9936944, 7945690, 5317170, 3866544, 1589675, -5262946, 2812667, -7791608, -2764348, --12065100, 9977746, 7466264, -1660005, 1013075, 7978439, 12612171, -5723044, -12460237, -3770445, -10001368, -2255395, -7473243, 10754061, -1015760, -6279779, 7349226, 2959233, 399969, -1876901, --363462, -5344013, 3543348, -3423626, -1617592, 8269423, -41307920, -19126564, -14265197, 7780334, --31483184, 11448772, -18772766, 27026618, -31308700, -39730060, -8513699, -5612449, 31379032, 15400679, -14041859, -7887171, 3761318, -19186156, -15416785, 3752728, 6672769, -24766928, -23051090, -16102906, --1952063, 12706124, 9161165, -17343614, -21948356, -12645994, -12910672, -29764660, -17157320, 13395466, --8213051, -35433, -4000225, 9876277, 15551540, -3898220, -44693428, 19079318, 37609416, 14146549, --694174, -44800804, -10598369, 19793356, -5462125, 50438484, -5228586, -40345848, 6830609, -6653978, -3501472, 1293322, -7956964, 11058467, 13623099, -42571716, -11261404, 2527052, 15302432, -7764227, --21618718, 19585588, 2110440, -14317810, -42436960, -49234284, -25267292, -2974802, 3824132, 39770324, -56098180, 28998008, 22124988, 9772661, -32233192, 12034498, 60666, -16757889, -4657892, -53228604, --11024644, -143881, 645319, 2096481, 23553600, 8963597, 7202660, -9374840, -2816962, 20468204, --13543106, -8053, -580894, 4146791, -9977746, -16631187, -18587544, 8596377, -8523363, -2840047, -11320997, 639413, 2073396, -14135811, 5158256, 4898947, 2790118, -11582990, -5694053, -7538205, --12132209, 1939178, -6910066, 13662828, 5561446, -8862128, 2058363, -3100967, 9567040, -12282533, --1331977, -251792, 6900939, 6222334, 3368865, 7463580, 233002, 4238059, 3481608, 75240848, -69099048, -29091960, 35857072, 31799938, -8902393, -5312875, -16469052, -8854075, -19366544, -13554380, -57309896, -3044058, 33389076, 481573, 1631014, 524523, -22610856, 5477694, 4683662, -49612240, -7399692, 12128451, -26157962, -5370857, -8072391, -3466576, 7343321, -1379758, 1501091, 21998286, -8859444, -10542534, 6728067, 35012036, 555661, 16201690, -885300, 13248363, -19267224, -23102092, --13036836, -42518028, 11378442, 4921496, -18997178, -51681880, -33903400, -48300664, 35256312, -24996172, -5461588, 8914741, 7969312, 6914361, 37616936, -36055712, 155693, -20118700, 39816496, -89248344, -18292802, 7126425, 28550258, 26262652, 66035, -8023536, -13758928, -3715147, -26066156, 19335406, -52617644, -3752191, 10799158, 33535642, -23308250, 13495324, 16130287, -28971166, -20378546, -53961432, -44858784, -8415452, -39687108, 26895086, -6752763, 17695802, -1317481, 15396384, 2449742, -11265162, -18500572, 18221936, 2774012, 10617159, 16808354, 10481868, -11517492, -4461934, -11254962, -4473746, -14136885, 27779312, -1343788, -4579509, -1273458, 18029736, -27825482, 16367583, -7669738, 37486476, -7158637, -21471616, -4646081, 16960288, -8765491, -10976863, -8806830, -6078990, -8660802, 9615358, -6226629, 24271398, -19931870, 1885491, -2436320, 13610214, 689879, -955093, 7534447, 10077604, -7059316, 16152298, 1800128, 18536542, 9991168, -249645, -26069914, -24720758, 30581778, -62266824, -42949136, -25680146, -17935246, -11290932, 3926137, -18034030, -14020921, 19519552, -5977521, -42599632, -14712410, -2621541, 7556995, -9605157, 37884832, -30912490, 1335198, 15698105, -10705743, 11883638, --25191594, 2052458, -21672942, -11014981, 23616414, 3001645, 9477382, -13434121, 22830972, -6599218, --10620917, 8716099, -13944148, -11660299, -7440494, -7720741, -23526758, -31578748, -8756365, 17470316, -300111, -9916006, -31471372, 1171452, -24870544, -1703491, 10047539, -24678882, -6041945, 18080738, -18429168, 13310104, -30550640, -14534169, 21090436, 6792491, -572304, 16999480, -100317016, -23293756, --11173894, -45668924, 4498978, 12429635, -2665027, 8309688, 21519934, -12511777, -21322366, 5318244, --19360638, -5992553, 20884278, 32989106, -12567611, -40137008, -24138790, 2434173, -21347062, 3168612, --16566763, -15809238, 4151086, -32231582, 361851, -20199232, -6167036, -11173894, 4460861, 7870528, --3210488, -20089710, 4356171, -1571421, -12566537, 15256261, -698469, -14906221, -5086315, -4130685, --5574868, -10450192, 5437429, -9587441, 7522635, 10164040, -4205310, 849867, -6238440, -14239427, --19675782, 3110630, 2530273, 8676908, -22775674, 4338454, -177167, -15096273, 11198590, -6528887, -7987566, 17965312, -41304700, 7818451, 5698885, 11417634, -6949794, -4749697, 13501767, -1441498, -999654, 67515816, -8414378, -18512920, 2677912, -7360500, 33494302, 6432251, -2726231, 31854698, -32259500, 10717554, 12534862, 17797270, -39561480, -21769042, 32964410, -4337917, -32472638, -16313360, --14704357, 22587770, 12075837, -11783243, -46945068, 14778982, 7421704, 6403260, 7757785, -5500780, -4805532, -35079684, 31550830, 22060026, 11651709, -17486960, -14979772, 108985, 15795816, -3273302, -16420734, 7332046, -37170796, -16356309, 5878200, -37244344, 2218351, 7337952, -32932198, -46206868, --6504728, 14190572, -26980448, -56141128, -24686936, -14554034, 36550172, -22014928, 41244572, -8301635, -1918777, 17845052, 2391760, -62909996, -4233764, 2859375, 29459718, -55954832, -77683072, 5861557, --5104569, -49247704, 27888834, 13408351, -1906429, 96637, 45638860, -65133180, 53613004, 11624329, -7116761, 22050898, -23616952, -21037286, -4164508, 10450729, -13475997, -666794, 27469538, -23029614, --18815178, 24709484, -13887240, -6521908, 10116795, 7074885, -27434104, 14287746, -9264781, -2106145, -9550934, 9885404, -29234232, -4334159, -22764938, 13082470, 17495012, 1593970, -37595996, 26966490, --6634651, -147103, 15880105, -3566434, -13810467, -1989644, 21016886, -31448824, 21638046, 1693291, --2609193, 8537321, 4005594, -19449760, 8997956, 454193, 682363, -25480968, 17649094, -16473347, -19493246, 3552475, -24140400, 2580202, 2683281, -6205154, 11002096, 2648384, 30775052, 11538967, -73584600, -31986768, -33311766, -14300094, -2018098, 69823824, -10501195, 57686780, -41697688, -16901234, -24049670, -45417132, -15395847, -42787000, 6266894, 41865732, -59332824, -22318798, -5665062, 16976932, --1111323, 5702106, 15650324, -4975183, -37813964, -35203700, 1136019, 23432268, 64639256, -15332496, -17110612, -19621022, 31625992, 231928, 3200288, -9887015, -39060580, 402653, 34947076, -6975564, --2629594, -14128832, -34130496, 43350180, 16300475, 28624346, 38987564, -2834142, 1792612, 23646480, --63666984, 20924544, -32399086, 73843912, -7568806, 6453725, 10714870, -22714472, -22517976, 6600828, --32287954, 46512884, -28224378, -35869420, -35850092, 48668420, 16332150, 27807228, -6874095, 27773406, -28631326, -30646202, -9054865, -28497644, -15008763, 50731080, 36125508, 3892851, 9548249, -79189536, -53160420, 69468952, 7621420, -6622303, -13851806, -42946452, 60323888, -4488241, 3637301, -12913356, -1287953, -27477054, 56438016, -14547591, 27268210, 3467112, -10346039, -4279935, 54352812, -31264678, -26549340, 8038032, -23727546, 2246805, -7939247, 14141180, 3902515, 21219286, -9699647, 1342714, -3736622, -1243393, 21551072, 36678484, -12057584, -2914672, 3867618, 19692962, 5480915, -29970282, --19866372, 39767104, 7514582, 18981608, -40438728, -49093088, 43976708, 28455768, 13431436, -4446902, --37666864, -1839857, 33430952, 9824201, 1459752, -3656091, -6631967, 5748814, 4498442, 6989523, --5551782, 3664681, 7174743, 4686346, -3106872, 1026497, 1371168, 6929393, 17611514, 6583648, --55529632, 37969660, -39504036, 4795331, -18224084, 14663555, -1572495, 20898238, -3406983, -18044768, -31062814, -10899553, -4413079, 4820564, -13128641, -11310796, 35850092, -8429410, -5013301, -4152697, --1930588, 16543140, -12660490, 3949759, -9295383, 8302172, -8134668, -6040335, -19380504, 28268402, --17524004, 9438728, 4397510, 19624242, -22065932, 5013838, -9106404, 22260278, 2767033, 1877975, -17379048, 5345087, -29203094, -4167192, -5140002, 8205535, 12553653, 10772852, -26581552, 11455215, --20128902, 14260902, -11557757, 3156801, -6717329, 14092861, -5648956, 4205310, -29748554, 7157026, -14142254, -13360570, 13215077, 2021319, 4718022, 8561480, -12139188, 20618528, 7828115, -944356, --6665253, 10133438, -6467147, 18741626, -15760919, -4404489, -15019501, 19412178, -19246822, 17660906, --16095390, 21432960, -18301392, 11362873, -18053896, 15845208, -1508070, 1886028, -5436892, 1116155, --3395172, -2457795, -5771363, 9554155, 3318399, -975494, 2721936, -2516851, -5320391, 9618042, -1102196, 3856344, -6350646, 709207, 8949638, -10371272, -2965675, 6582038, -219580, -2837363, --7269232, 17219060, -5706938, -8114804, 4001299, 1906429, -3069291, 2194192, -1372779, 2047626, --3283503, 2833605, -5391795, 8690329, -7283728, 9965935, 3722663, -6702297, 2074469, -1003949, -604517, -407485, 4083977, 464930, -3260954, 2867965, -3521873, -23032836, 46790984, 3981972, -5957120, -18597208, -13677860, -29577292, 19966230, -8242042, -5976447, -12811351, -428423, -11414412, --1353989, -1443109, 5288716, 5903433, -840740, -1307281, -8359080, 7930657, 7417946, -6922414, -3367254, -15806553, 6397354, 3154654, -2711198, -2398739, -5230734, 5122286, 1181116, -11239393, --2970507, -3250753, -9316321, 15455440, 1680943, -9767829, 1570347, -3790309, 13476534, -4589710, --6205154, 2663417, -7935489, 15715285, 517007, -8592619, 2544231, -3465502, 7721278, -9810242, --1892470, 3318399, -3522410, 6939057, -3850438, 2053531, 3185255, -8843338, 1312113, 8912594, --13464186, -826781, 4170950, -12495670, 22943178, -20868172, 10513006, 3847217, -11890617, 23715198, --16027744, 3859565, 3084324, -9941239, 7863012, -4024921, -7653095, 7607461, -9130564, 6044630, --4160213, -3053722, 6863358, -5593658, 2251100, -2230699, -3221, 1389959, -3027952, 1516660, --105764, -2954401, 6491843, -5406827, 4854387, 243203, -4432406, 4462471, -7868917, -699543, -2152852, -1240172, -1031866, 1185948, -4062502, 5120138, -2502355, -1730335, 597537, 592169, --3157875, -419296, -1800665, 1815161, 2594697, -3561065, 3224984, -3396246, -617402, 3419331, --2448668, 10912438, -50017580, -115480400, 30313342, 106902808, 90390272, 121278600, -59773060, -77473696, --116496696, -119083336, 8209293, 88786104, 98046584, 107383848, 35735740, -23368380, -85169736, -141049408, --77248208, 35879084, 55619828, 94067840, 71339944, 19478750, -12603045, -29717952, -70616240, -45784888, --43523052, -7991324, 37272800, 57067232, 30090004, 38094748, 19321448, -21476448, -3297998, -45917496, --63851132, -10945724, -14848776, 11258720, 60349660, 34729104, 29989072, 8827232, -22520124, -23269060, --19972672, -33112050, -8603356, 1449015, 14264660, 17296908, 28907278, 8201240, -943282, -14581414, --26775900, -2319819, 9740449, 9897752, 16986058, -4338454, -13405667, -6497749, -13421773, -10620917, -2956011, 7577933, 21742198, 18338436, 17631378, 986232, -9338333, -35228396, -32640140, -13368623, -2181307, 27158688, 29251948, 11998528, 12454331, -1420024, -23435490, -14434848, -1609539, -5552856, -1353452, 2436320, 5747740, 4683662, -2949032, -7722351, 4635344, 7045357, 5909875, 6000070, --455803, -4470524, -2658048, -11990475, -4819490, -6641093, -11135240, 6594386, 16412144, 18976776, -6403260, 6808060, -3605625, -4509716, -16949014, -25388626, -9667435, 2836826, 8017630, 9776419, -20874614, 19251654, 9467719, -7726646, -16153909, -18402324, -17064442, -12763569, -759672, 15333570, -23947128, 18835042, 5586679, -9067213, -10700374, -10858214, -6147172, -4194036, -4590247, 4595078, -11019812, 7967701, 1839857, -1497870, -746251, -2891050, -3097208, -4609574, -1896228, 2537789, -2284923, 1255741, 1578401, 1206349, 1132798, -2383170, -2913599, -942745, 1337346, 981937, -406948, 405874, 486942, -950262, -707059, -392990, 235686, 255014, 717796, 611496, -458488, -226560, -814433, -1455457, -126702, 246424, 128312, 375810, 1008244, 306016, -312996, 819265, 107911, -2259153, -1759326, -574989, 489626, 965831, 1487132, 491774, -172872, -100395, -37581, -596464, -501974, -308164, -151398, -493921, -73014, 44023, -466004, 667331, 784905, 386547, 340376, -267899, -661962, -1149441, -758062, -419296, -221728, 833761, 1273458, 831076, 170725, -435402, -548682, -841814, -622770, -64425, -352724, 328565, 312459, 92342, 56908, -45097, 2147, -67646, -55835, -78383, -6979, -20401, -32749, -75699, 4832, 40802, 45634, 24159, 37044, -6442, --17180, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --5501316, --4846334, 6116571, -1204202, 4890894, 1455457, 7255274, -1642825, -3696893, -2532420, 4446365, -163209, -1569274, -387084, 5022428, -1286880, 940598, 1791001, -3316252, -2508798, -1058173, -961536, -3444027, 926102, 738734, -3986804, -1278827, -2368675, 370441, -1719061, 673773, -6613176, 3397319, -1879585, 339839, -3078418, 2421288, -797253, 3908957, -8016020, -860067, -1288490, -2844342, 558346, 3928821, 3023657, -3605625, -2640331, -2894808, -499290, -2290828, --1130650, -3520800, 1394254, -295816, -4051765, -2105608, -1610076, -192737, 887448, -881542, --381715, 1772748, 740345, -1921998, 1056562, 4371740, -2195265, -569620, -4646081, -1780264, --321049, 1948305, -1939178, 570694, 834834, 657130, 1557463, -3618510, -77846, -2038499, -1762010, -1304060, -3451006, -991064, -66035, -57982, -1500017, -1623498, 1744831, -766115, --270046, 630823, 1037772, 47782, -185220, 193274, 635118, 38655, -343597, 775242, -184147, -678605, -575526, 723165, -213138, 260382, -419296, 651761, -559420, -395674, --54761, -135828, 276489, 7499550, -2850248, 2417530, 6265821, -5143224, -5794985, -880468, --1471563, -102542, 3176128, 1754494, -8043400, 1219234, -4628364, -6356552, -439697, 2286533, -2476586, -2095944, -299574, -709207, 3410741, -746787, 2799782, -1356673, 298500, 587337, -831076, -4038880, 1654636, 3063386, -1482301, 3913789, -2216203, -464930, -4962835, 3472481, -856309, -1338419, -3854196, -3826816, -1749125, -1330903, 1888712, -454193, 1627256, 1599875, --3419868, 2078227, -4584878, 1594507, 2630668, 4996121, 4823249, -4215511, 2047626, -306016, --1127429, 2907693, -2270964, -2723546, -2041183, 2362769, 1176284, 3091303, -3134789, 4675072, --1549410, -280247, 1401770, 739808, 2748242, -2136746, 3923990, 4933844, 8690329, 3999688, -2753074, -5187247, -956704, -3401077, -2443837, 3119220, -430034, 3863860, 1583769, -357019, --795106, -725313, 2244657, -1757715, 1787780, 2082522, -1692754, 971200, 768262, 177704, -1277216, -845572, -246961, -1735704, -99858, 93952, 870805, -9277666, -9980430, 1080721, --867047, 2310156, 2151242, 6506876, 2913599, 3082176, 1534377, -3256659, 1184337, 8235600, --5587753, -668404, 204011, 6602976, 3948149, 881005, 2897492, -571231, 2226404, 3020436, -6762963, 3732864, 3775276, 2013803, 1589138, 3279745, 1153199, -4791036, 2865817, 3883187, --1446330, 2813204, 3715147, -1351841, 1135482, 4665945, 1688996, -1169842, 1641214, 4764193, --294205, -86973, -994285, 1283658, 4449049, -1361505, -2583960, 1268089, -1605781, 2346126, -2775086, -3377992, 671626, -2192044, 126165, 1342714, 3736622, 3087008, -8010651, -43487, -3851512, -2052994, -3367254, 422517, 561567, 3897683, -376347, -8518531, -3762928, 2729452, --2411087, 3981435, -1161789, 1611, 966905, 5000416, 3098819, 2110440, -2633352, 4105452, --543850, 2508798, 1190780, 483721, 813359, 845035, -114890, -673236, 501437, -369367, --2111513, -885837, -898722, -272730, -526670, -17717, -674310, -1499481, 688805, 306016, --810138, 161598, 1349694, 1018981, 432181, -204548, -289373, -153545, -128849, 1323924, --16643, -16726213, 2426657, 1808181, 7906498, -228707, 6188511, 3215320, 1627793, -9767829, -81604, -73014, -7570954, 1301912, 5776194, 1165010, -45097, -640487, -2982855, -3412889, -1622424, 2335389, -207769, 1586454, 1817308, 6944425, 847182, 3122978, 3263102, -3513820, -836982, -762894, -934155, -373662, 2585034, -304406, -1662689, -2662880, -1590212, 968515, --4829154, -3382287, 2113124, -3797288, 1324461, -6293738, -7590818, -1860258, 9505836, -2408940, --506806, 5670968, 1920387, 503585, 6018323, -753230, 715649, -664109, 1797981, 3929895, --1454383, -5873905, 3859565, -3384434, -6578816, -2543695, -1808718, 89121, 2479270, 7270306, -91268, 26307, -2765422, -166967, 4273493, -1901597, -2148558, 5217312, -4283156, -229781, -2379412, -5128728, -987843, -1709397, -1733556, 689879, -2767570, -3840238, 277025, 2557653, --1105417, -1594507, -2204929, -2149631, -285078, 1744294, 765041, -108985, -633508, -1644436, -110595, -472446, -2122251, -3041374, -2671470, 82678, -322659, 1398012, -2075543, 22012, --285078, 1140851, -144955, 562641, -610959, 127775, 343597, -945430, 14867029, 397284, --1002338, -5767068, -3359738, 7803419, -3292093, 6072547, 5207648, -6112812, -1078574, 4532801, --3469797, -1715839, -1674500, -2271501, 892816, 1572495, 184147, 2801393, -1413581, 368830, -988379, -1293322, -2932926, -3034931, -3438121, 184684, 3791919, 1615982, -3396782, 229244, -1433982, 7353521, -2303713, 6576132, -6159520, 2668249, 4693326, -3237869, -2034204, -6251325, -2814277, -132070, -4440996, 4228932, -5481989, 5963025, -434329, 8469139, 1857573, 865436, -1959042, 3490198, 1789928, -2821794, 4103841, -845572, -4603131, -7093676, -2024003, 2924336, --3635153, -2345589, 2633889, -3991098, 7602092, -7477001, -149250, 4906464, -4351339, -1736777, --7899519, -636192, -3166465, -1759863, -2455111, 6682969, 2529736, 635118, 156229, 5760088, -452582, -548682, 4532801, 3783329, 3366718, 7169374, -1666447, 656593, -2160906, 1992328, -2250563, 438624, 566399, -1264868, -180389, -1771137, -993748, 122407, 519154, 1102733, --704375, -296353, 2180770, 1034013, -1006633, 4430259, -386010, -1156957, -1980517, -1246614, -1494112, -1580548, 5906, -230318, -1720134, 648540, 326418, -470299, 978716, 1137093, --1349157, 1181653, 1974611, 7182796, 12743168, -3771518, -5601711, 1430224, -2309082, 3491272, -11596412, 39728, -2715493, 3660923, 1964411, 3414499, 2051384, -6361384, 199179, -5679558, -3112778, 2705830, 1627256, 10610717, -546535, 7904888, -246424, -219580, 2375654, -89657, -8308078, 1081795, 5216775, -1962800, 7080254, -3230352, 3757023, 14084808, -2346663, -3579318, -9903121, 2075006, 6437082, -175020, -6224482, 1911797, -3608846, 4247723, -7492034, -1009854, --3914863, 4189741, -675384, 855235, 7638600, -3744138, -7767985, 2154463, -711354, -372052, -6202470, 1201517, 843961, -2823404, -5127117, -5389647, -1847910, -4449586, -3406983, 4602595, --2366527, -439160, -1731946, 542240, -25233, 4112431, 2522220, -4704600, -6845104, -1584843, -167504, 1879048, -1903207, -1660542, 5533529, 3193845, 2699924, 821949, -4600447, -2090039, -2409477, 120796, -1554241, 2005213, -679679, 1230508, -1531693, 138513, -900869, -2560874, --3116536, -790274, -2763812, 741956, -456340, 293132, 1803349, -466004, -1507534, 2313914, -438087, 1488743, 799401, 177704, -904091, 1164473, -338229, -222265, -139586, -209380, -43487, -427886, 580894, 1491964, -1829656, 527207, -2147484, 371515, -1068910, 2673617, -17445620, -9300752, 6061810, 145492, 2941516, -4332012, -3410741, -2026151, 3723200, 4814659, -953483, -2790118, -5188858, 2567317, 4760435, -1047972, 1433982, -2695092, 5198521, 1858110, --10021769, -3365107, 3111167, -682363, -4309463, -302795, 4434017, -3421478, 1448478, -6564321, -3684545, 8064338, -3467112, 8535711, 208843, -1681480, 5672578, -357019, 360240, 5097590, --11329050, 1578401, 3325915, 4672925, 3150896, 3624953, -5128728, -4026532, -258235, 1678259, --5546951, 1690070, 5231270, 4651450, 1686312, 14442901, -4667019, -1946157, -6671695, -2946885, --4400731, -6184216, 7425462, 3006477, 7250979, -1271310, -11805254, 6701223, -4217121, 3624416, -3286724, 1508607, 1947231, -9393630, 10900627, 2263985, -5162551, -9021579, -5644661, -5703717, -704375, 4402342, -4212289, 207769, 2717641, 2244121, -68719, -2070711, 383326, -337692, -1660542, 1701881, 1912871, 1235877, 1240709, 535797, -3302293, -3049427, 70330, -1217623, -987306, 1165010, -1571958, 1949378, -579821, 610959, 1671279, 592169, 1282048, 240518, --3505767, -401579, -113817, 1047435, 825171, 249645, -845035, -1095754, 1792075, -715649, -4460861, 607201, 1891396, -20812338, -17487496, -16105590, 3848828, 3562675, 1574106, 944356, --957778, -1057636, 643171, -2570001, -5714991, -3901441, -10159208, -4363687, -4826470, 6409702, --7762617, -3310346, -4306779, 1554241, 292595, -1848983, 2524904, -472983, -8070244, 51540, -7789460, 1200980, -7178501, -6300717, 3049427, -2415382, 6568079, 4701916, -6773164, 7105487, -11060078, -8882529, -9131100, -4763119, 3622805, 8861591, -5956583, -6134287, 3462818, -3445101, -867047, -588947, -598074, -9676561, 2086280, 6229313, -2886218, 3666292, -4733591, -5624797, --5623186, -2644089, -9826348, 17393006, -3446711, -921271, 3187403, 2104534, 3845606, 2575907, -5543192, 2684355, 4837207, 10860899, -13517336, 9833328, -3081102, -2362232, -282394, -15052787, --512175, 4927401, 612033, 850404, 4461398, 1813013, -192200, 2793339, -4985384, 6239514, --1978906, -3233037, 3435974, -1866163, -1727651, 868657, 2838437, -1789928, -3062312, 1363652, -2759517, 361851, -919123, -2568391, -1372242, 654446, -3818763, -2408403, -1213328, 2176475, --722628, 412854, 2292976, 307090, -3804267, -635118, -3212636, -2745021, -2665564, -1481764, --2964064, 2943663, -758599, 456340, 5898064, -856846, -1560684, -1261110, 3273839, 1063004, --881542, -852551, -20667382, 15853261, 4202089, 3463891, -3825742, 15520938, -2441689, 7320772, --24159, 6589554, -9235253, 3670587, 3615289, 1431298, -4549444, 13826573, -3752728, 4230543, -3164854, 14352707, -9681930, -602906, 3970697, -2463701, -7111392, 4311074, -6692096, 1757715, -1806034, -7802345, 3010235, 677531, 368830, 15797427, 9826885, -1280437, -6477885, -4998805, -3486440, -795643, -9483825, 2727304, -865973, 2830920, 7080254, 10531797, -7237557, 7179575, -3528316, -4672925, 3364033, 2797098, -7490423, -3971771, -4714801, 7563438, -8163122, -6831683, --18648212, -13565117, 3723737, -2495913, -2731062, -7097971, -14487462, 5602785, 1051193, -356482, -7006166, 6091874, 8436926, 5121749, 1990181, -167504, 1291175, 9687299, -7169374, 13239237, --4911295, -3645890, -12095165, 2004139, -2284923, -6037651, -1165547, 1556926, -3105798, 3597572, --1537598, 251256, -1565516, -376347, -1359357, -186294, 2080375, 3554086, 182536, 2956011, --3302830, -2165737, -1724429, 1302449, 2372433, -3148211, -1334124, -1400696, 372588, -1697586, -1362578, -200253, 1168768, 2308008, -80531, -3347927, 4810364, 4874251, 1851668, 175557, --2252174, 12885, -1235877, -363998, -276489, 5388037, -25176562, 22930294, 16418586, -6961605, --5907191, 6054830, -132607, 380641, 10844256, 7621420, 132070, -1811939, 4254165, -2751464, --1785633, 2927557, -5134634, 6025302, 4068408, -5347771, 6507413, -904628, 1617055, -671089, --11201812, -797253, 7828115, 8126615, 3072512, 3377455, 4267050, -5312338, -6678674, 2621541, -4804995, -389231, -2694018, -5839008, 2163590, -1839857, 6891275, 8155069, -1118839, 9429064, --5186173, 10528575, 5614596, 12727062, 744640, 1706713, -3902515, -5450851, -1186485, 9727564, -15988016, 803696, 12141873, -5491653, -12013024, 1407139, 4279935, -10514080, 10590316, -3737159, -3623879, -22950694, -9981504, -319975, -5658083, 4239133, 7348152, 15649787, 3112778, -51003, --7932268, -13916768, 3365644, 424665, -11720429, 4563403, 2315524, -8493835, -2547989, 1825898, -8936753, 42950, 2574833, 2627983, 4570919, 3739843, -7898982, 2586644, -318901, -1695438, --12885, -540629, -1420024, 3122978, 2923262, -3376381, -1507534, -203474, 2035278, -1390496, -2980707, 315143, 2121714, 1899449, -2696166, 1739462, 2127620, 5795522, 359167, 3245385, -3541738, 766115, 4189204, 1434519, 2072322, 853625, 368830, 1432909, 4952634, -2345052, --4916664, 1006096, 5745056, -10121090, 16269336, -7567196, 1600949, 12050068, 12498355, -1369558, --7811472, -4394289, -4328254, 535260, -9976672, -8024610, 7632694, 1591285, 4768488, 5860483, -7043210, -3753802, 4434554, -2254858, 5388037, 23613730, 5281199, -12030203, 10878078, 12490302, -184147, -2575370, 306553, -6841346, -9192304, -5062156, 12812424, 8405788, 6930467, 10762114, -1903744, -2387465, -5523328, -14702210, 6235756, 7052337, 3807489, -2721399, -2125472, -5380521, -1621350, 11126113, 7632694, -13760001, 8420820, -11678016, 11456288, 2041720, 4068945, 4798016, --2327336, -6817724, -2275796, 4265977, 20087026, -3745748, 9861782, -5034776, -9584756, 10351408, -9425306, 1976222, 1894081, 9333501, 3103114, 69793, -1458678, -6769406, -2264522, -9695352, -2614561, -7646653, -3898757, 13957033, -1096290, -135828, -40802, 6146635, -2509335, 1455457, -4096325, 6185290, 6949257, 5517959, 2054605, 2635499, 3005403, 5538361, -1261110, -5426155, -6571300, 2171106, 3483219, 3612604, -136365, -1061931, 119722, -3619047, 1582696, 5945309, -426276, 245350, -1680943, -3025805, 5152350, 5264556, 836982, 9793062, -1592359, 3871913, -7664906, -115964, 1914482, -1785096, -3344169, 180926, 1437203, 2236067, 5444408, 1846299, -4007741, 933082, 743029, 5299453, -1248225, 469762, 4264903, 708670, 1113470, 229244, -1831267, 5906, 2610803, -595390, 1875827, 231928, 8437463, -4363687, 8580808, 10967199, --12723841, 8449811, 4881231, -3145527, 739271, 5780489, -5346161, -11280195, 16764331, 3536369, -3180423, 3040300, 9942312, 2802466, -10069014, 10616622, -14422500, -16932908, 1474248, 1905892, --9304510, -3166465, -27521614, -19604378, -14676440, -5086852, -15094663, -7566122, 5724655, -13705778, -9525701, 8613557, -11040750, 14119705, 7625715, -2943663, -1417339, -7540352, 343061, -13346074, -28962038, 8295193, 4540854, -14612016, 3554086, -4633733, 19228568, -4038880, -454730, -17695802, -17187386, 957778, 6766721, 5368709, 10054518, 5466957, -3816079, 5527086, -8464844, 8454643, --3058017, 4893042, -13581760, 30722974, 4804458, -14566918, 7874823, 8809515, 7157563, 10298258, -9086540, -14169097, 11214696, -518080, 9069360, -7296613, 2778844, -18180596, 7663296, 7557532, -2396055, -4565550, -13427678, -1145683, 9422085, -12309913, -1498407, -1699733, 93416, 3398930, -2951180, -3001109, 5380521, -597537, -2386928, 3823595, 3347927, -4073240, -2855617, -8175470, --302258, -7633768, 4591857, 903017, 939524, 5423470, 9084393, 5287642, 4394826, 2476586, --2927557, -1584843, 328028, -6068789, -4473746, -1675574, -1657321, 2717641, 7467875, 1896228, -4830228, -1422171, 193810, 1889249, 71941, 1541356, 5760088, -22425634, 6215355, -3121904, --2236067, 13221520, -2502355, -2319819, 1228361, 11832635, -3156801, 6878927, -5866926, -6897718, --8809515, -11143293, 19202798, 9992778, 6927246, -6102612, -17707076, -21701396, 10361072, 7133404, --7746511, 5111548, -5284958, 468688, 19108310, 8328479, -5498095, 10296110, -3554086, 5322002, --6449967, 6446209, -14222247, -20855288, -8150774, -9325985, -1641751, 24314884, -19889994, 11424613, -6524592, 4938676, -4444755, 9548786, 4217658, -19073412, -24276766, -8653822, -11106785, 27382028, -19812684, -6675453, -12290586, -1052804, -12611098, -2683818, 19894826, 18452254, 10423349, -16335908, -3459059, -12766790, 19945828, 9473087, -2178085, 40802, 6673843, -11848204, 2595234, 17625472, -9526774, -15994995, 17287244, -8879845, 10306311, 27521076, 10454487, -6509023, -8218420, 23551990, -2538863, -1457068, -10769630, 4134443, -5108864, 1498944, -3212636, -572304, -759136, -11756399, -1421634, -1475321, -3407520, 5151814, -971200, -4163971, 688805, -2477659, 593242, -3071439, --4633733, 4064650, -5130339, -3246459, 2342368, 6128919, -365609, 4330401, 3510062, -811749, --78383, -5897527, 750009, 2007897, -5060545, 6718403, 3250753, -4076998, -2804614, -2838974, --1331440, -6570763, 3841312, 6275484, 229781, -4879083, -2907156, 3280818, -1480153, 3160559, -4352413, 364535, 1571421, 61740, -15569, -18072686, -7261179, 29464550, 13480829, 16852914, -3885872, -25027312, 7343321, -20361366, 12896713, 36901824, 12926778, 23042500, -10806138, 6442988, -10544145, -1415729, 2499671, -9839233, 2134599, 14332306, 475131, -4195646, -13504451, 6975564, -5158793, -13752485, 6724308, -5405753, 10002979, 14409078, 15336254, 18539226, 1596654, -14900852, -3657702, 8604430, -457951, 25348360, 1963874, -29770028, -18787798, 8092256, -7792682, -35081292, -970126, 14532559, 5180268, 1260036, -3457449, 18028126, -14689325, -18146236, -3740380, -6687801, --17668422, -1261647, 978716, -10418517, -15254113, -9461813, 444529, 1866700, -21905406, 6154152, --9303973, 4954245, 24656870, -3709241, -8966281, 17083770, -3316252, 14172318, -14002667, 9043591, -319975, -16173236, -18009334, 31670016, 2820720, 4011500, 1224066, -275415, 31768262, 25885232, -7987566, -2723009, 12279848, -6470905, 3999688, 7180649, -1676648, 9534827, 3945464, 2553895, --14896020, 8374113, 4373888, -1138703, 1037772, -5265630, 3917547, 10991895, -2161442, -3997004, --6568079, -7178501, 6517076, 7700340, 147103, -294205, -6475200, -6973417, 900333, -9872519, -1068910, -3508988, 9714679, 3226057, 145492, -6645388, -11317776, -2851858, -5639292, -7773891, -4000762, 4100083, 8291435, 3042984, 978716, 9425843, -1443109, 25322054, 3419868, -34316788, --15446313, 21547314, -30687004, 17681844, -29036126, 2535641, -4520990, -42033772, -5424544, 19164680, -38973072, 12542378, -5512054, 9603547, -14769319, -4818417, -33757908, -1706176, -22891638, -3133179, --4920422, -15721728, -16761110, -5419175, 9812390, -15097884, 10644003, 19588808, -19885162, 7442105, -6559489, 3628711, -21175800, -3050501, -123480, -22086870, 5905580, 28591598, -2065342, -41008884, -14683956, -24685862, -63466196, 18132278, -26201984, -32469952, 1817845, -14751065, 4610111, 11452530, --6192806, 16954920, -13921600, 14840186, -11479374, -28216324, 225486, 20577726, 19565724, -36727340, -5488432, -4188130, -27464706, -7124277, -6773701, 48110076, 23940148, 28322088, 12829604, 12455405, -29657822, 42805792, -9689983, -19918448, -21982716, 4112431, -27321360, -8160438, 14165876, 23245974, -3238942, 2344515, 19966766, -4363150, -11331197, -15149960, 12021077, 13907104, 13390634, 3396246, -15357729, 6645925, -9453760, -1823214, -9163313, 14297946, 2230162, -1363652, -15770046, 5050882, -12557411, 1665374, 184684, 12600360, -9890773, -6288906, 6750078, 984621, -5034239, -9176198, --3104188, 14788109, -788127, -31790274, -3075197, -492848, -7453916, -5952825, -8585640, -4888210, -6876780, 6568079, 3598646, 2534568, -5408438, -628139, -6645925, 55730420, 60240136, -35342748, --14003741, 26911192, -12198781, 10869488, -16782584, 5043902, -17246442, -32266478, 43992276, 6445136, -13805636, 11348377, 4104378, 5814312, 1302449, 8953396, 10909754, -31209380, -25789668, -22528714, --21340082, -15919833, -10095858, -8293582, -16793322, -9444633, -14242648, 16194711, 12227772, 6258841, --7877507, 3332895, -33121178, -16558710, 8931384, -29992830, -2845416, 14682883, 25868588, 3860639, -4949413, -11038603, -19487340, -22826140, 18297634, -2426120, 18108656, -64107756, 3908420, -7397008, -7282117, 39302708, 4707284, 6614787, 4308926, -11426760, -13341779, 427886, -2740189, -35959076, -7592966, -13145284, 32172526, 2224256, -35558036, -48127792, -30106110, -6016176, -34013992, -33076080, --20740398, 23444616, -6238977, -22758494, -30971546, 25789668, -3510062, 15287399, -17527224, 9405442, -25141128, -16777752, -24651502, -10194642, -12850005, 26586384, 5340255, -11571716, 10190884, 7839926, -22810572, 14381698, 6436009, -20444582, -20726438, -4440996, 2087891, -5316096, 3376381, 14262513, --3441880, -1152125, -10721849, -7563438, -6019397, -10758356, -2410551, 4465692, 6134824, 33549600, -1835025, -8382166, -3085934, 4503273, 10042170, -594853, 16136192, 6962679, 37832220, 5933498, --786516, 1391033, 6489696, 1879585, -1802813, -10962367, -16832514, 62400508, -36721972, 23473070, -44129716, -21665962, 5994701, 35179540, -45254460, 1464584, 4764730, 21551072, -50709068, 2473901, -3134253, 16253767, -22271552, -54224, 8781598, -30004104, 4164508, -2592550, -5792837, 15993921, --5152350, -4821101, 6662031, -4236449, -5286568, 15673409, -15208479, 4065724, -6403260, 3739306, --9823664, -5673652, -11927661, -192200, 2050847, 30991410, 10201621, 14872398, -3390877, -10201, -23021024, -1351841, -9007083, 12662100, 9392557, -10848014, -30633318, 27504434, -30529702, 4583804, -14351633, 18733574, -30043296, 31495532, 51034948, -28397786, -52266532, 69302520, 24443196, -34812320, -15729244, -33530810, -41322416, -20912196, -7703024, -43380244, 34613680, -60317448, 17818746, 28182502, --23953570, -80507552, 75587128, -13598403, -19697794, 50057844, -50485728, 25574382, 42925512, -13356275, --11979738, 12938589, 14642617, -8533563, 5181341, 3966402, 13506598, -7198365, -5118528, 14823543, --186294, 2954938, -1767916, 2393371, 12082280, 8562554, -1805497, -11410654, 17777944, 18882824, --3810173, -17168594, -1910187, 7701413, 1639067, 11420318, -79457, 9919764, 4293357, 14787572, -11197517, 12328704, -19254338, 4363150, -501974, 216359, -56371, -12241194, -20783346, 29647622, --5007932, -28541132, 10035728, 6178311, 2797634, -5219459, -19429358, -15075872, 34979824, -22874996, --18271864, -36584532, -16787954, 21935472, 17039210, -9671193, -12106976, 11741904, 29027000, -12305618, -21922050, 26248692, -18438832, -2538326, 16057272, -4008278, -537, -5151814, 1470489, -26561152, -7385197, -5792301, 972273, 6556805, -5302137, 5635534, -11011222, -22222698, -10516227, -38788388, -4929012, 48318, -5748814, 7354058, 3765613, -2400887, -8816494, 15782931, 24774446, -25840134, -38036768, -4142496, 5121749, 5646809, 33625836, 15552077, 24617142, -30688078, -7600482, -5636608, -43814036, -40697500, -13911399, 20118164, -1430761, -47016472, 3235184, -9577777, -8028368, 21689048, -23638426, 1813550, -17678622, 38270844, -16022912, 63719060, 871878, -29329794, -9127, -4959077, --33339684, 64020784, 12860743, -9359807, -75572632, -37613176, 21323438, -27660664, -25024090, 29773250, --110795120, 2964601, 21859236, 16205448, -8944806, 31338228, -19050864, -2299955, 163746, 16407312, --4595078, 3492345, 22100828, -1365263, -5555004, -6812892, -7932268, -173409, 2488934, -1293859, --3333432, 14448270, -19973208, -4304094, 2384781, 3512747, -11964168, -20069846, -5148055, -6037114, --2894808, -1508607, 3922379, -22284438, 1726577, 17216376, -10616622, 13205951, 9984725, -9613211, -606664, -6991133, 2830920, 4967130, -10479183, 29603062, -14297946, -13012140, -17047262, -15463493, --7722888, 13899051, 18979998, 11448235, 47673600, -9571335, 10555956, -4927401, -25082072, 12076374, --16097537, -9233643, 9587978, 21185464, -23011898, 24459302, 2546379, -1598802, 50272592, -10623065, --5919002, 37553584, -24533926, 33130840, 14156749, -8296803, 13064217, 13743895, 30954366, 32119376, -9150965, -26744224, 54912232, -55746528, 1583232, 50013820, -27403502, 10781442, -6259915, -6911140, --58653148, 39257612, 10212895, 17210470, 18321256, -12519293, -29327648, -22245246, -17973902, 2367064, -55206436, -26844, 43247636, -14880451, -33742336, 1431298, 12257300, -27917288, 44395468, 17742510, -21691732, 43670152, 28307056, -47604880, 17755932, -68102072, -83837224, 1314797, 70164736, 43707196, -5465346, -50248432, -178121424, -33159296, 54786064, 62402652, 88866096, -4987531, -113190640, -64191508, --59064392, 89855544, 68834904, -12940736, -45348948, -26896158, -55100136, -7493108, 70536248, -7354058, -16355772, 11316702, -11784317, -26124138, 38368016, -16149614, 21330418, 15255187, -1633161, -36316096, -48924508, -19881940, -9429064, 13684303, 12583180, -27105538, 294742, -8869107, -10166724, 2836826, --1090922, 19102940, -35236448, 18044232, -42374684, -7246147, -7159174, 49661096, 1389959, 13050795, --30758408, 15442555, -11616813, 21604222, 26476862, -13448079, -30566208, 10376641, 7842074, 25085294, -21161840, -5706401, -8346195, -4319664, 17398912, 2731062, 17534204, 7287486, -43545600, 36702108, --27358942, -4665945, -17697412, 17106318, -19891068, -762894, -2046552, -5321465, 4139812, 18850074, --19769734, 8815420, 1593970, -4486094, 311385, 13332115, -16717086, -4472672, -2427730, 27584428, --27796492, 7494718, -12173548, 18324478, -20295868, -5653251, 6975027, -3805341, 3862249, -13007308, --2321430, 12017855, -3610457, 4729833, 3764539, 2629594, 14854681, -13622563, 9313637, 10869488, -13253195, -1708860, -30802432, 4101694, 3638911, 12700218, 11431055, -2078227, 3046206, -5020280, --14024679, -2214056, 6386080, -2466385, 18664854, -15047955, -5076652, -30197378, 9030169, 3464965, --4835597, 6972343, 5878737, -249645, -15742129, 5080947, 15273977, -2790655, -2295660, 6223408, --6251325, 11650099, -7131257, 2148558, -14477261, 7024419, 2646774, -2079301, -4023311, 8557185, --4076998, -5832029, -8776229, 9298067, -459562, -4330938, -2040110, 9262634, -3673808, 4226248, --5111548, -2780991, -579821, 564788, -206695, -4725001, 427349, 403190, -4307316, 4531728, --4098473, 12063489, 1743220, 1845762, -16481937, 4883915, -468688, -6246493, 7259569, 14136348, --10194642, -1973001, -540092, -6930467, 10819023, -1523640, 1399623, -6933151, 3613141, -1231582, -1166621, -4300336, 4214437, -4287988, -24865176, 60288456, 16434692, 14898168, -7972533, -19297824, --18568218, 5274220, 11705396, 1850057, -687732, -61203, -8807367, -1598802, 4233227, -2330557, -1822677, -938450, -8823473, -454730, 4369593, 6891275, -6141803, 1696512, 4410932, -8787503, -14430553, -8756365, -7647190, -7589207, 1970853, 4227322, 6694244, -7300371, 9339943, -13451838, -8916889, 7963406, -5929739, -602906, -432181, -1537598, 6948184, -7475391, 2178622, -2382096, --9689446, 13734232, -7672422, -247497, -5686000, -1763621, 9560597, -12475269, 5077188, 3476239, --5462125, 4602595, -10662793, 3106335, 4424890, -7900593, 181999, 4268661, -7330436, 7366943, --10116259, 2821794, 10347650, -15143518, 4352413, -5775658, 1035624, 5973226, -4538170, -2301566, -1060320, 1315871, -917512, 4275640, -3249680, -2775086, 2065879, -2479270, 1350230, -943819, -1778653, 1698660, -2460480, 1245541, -476741, 2221035, -2033130, -550830, 1473174, 65498, --1181116, -3506841, 2218351, 2354179, -540092, -2419677, 2311229, -103616, -1107565, 2409477, --5032628, -1004486, 2825015, -3604551, 5251135, -3213173, 233002, 8750459, -2554969, 6307697, --3592203, -335007, 6932077, -4855461, -1849520, 9045201, -46580532, -109298864, 30946314, 107009648, -73595872, 116361936, -64772400, -68946576, -94017904, -108833936, 2345052, 83985400, 86769080, 90589984, -17790828, -29925184, -59389196, -85243288, -72248864, 5636608, 56138980, 66588636, 59915332, 14341970, --16546362, -10331544, -46770048, -52313776, -22064858, -1418413, 20133732, 44126492, 21559126, 16010027, -22106196, -11028402, -26233660, -4290673, -41945188, -19674708, 469225, 6664716, 31980864, 37235220, -3310883, -5636071, -3490735, -27469538, -7437273, -381178, -5710159, 9514963, 18402862, -3919695, --1453310, -7217693, -11481521, 2359011, 1140314, -1251446, 20763482, 14055280, 5196911, -526670, --19572166, -28302760, -22379464, 1618129, 21070036, 18087182, 23737748, 3230352, 620623, 5399848, --29453276, -16764331, -13848585, -2516851, 22604950, 5113159, 7585449, 21088290, -12167642, -17702782, --4119411, -3020973, 6539088, 7603703, 2379412, 4246112, 1860258, -10866267, -11260331, -2744484, --2147, 8100845, 11720966, 3848291, -1654636, -2542084, -3333968, 2939368, -3287798, -13817447, --2168422, 3262028, 6405944, 13765370, 3352759, -2849711, -6612102, -11311870, -2474438, 1145146, -3689914, 6477885, 8087961, 6374805, -3264175, -9800578, -10334228, -9014063, -1032940, 4493610, -4971425, 13299366, 13650480, 6658810, -2946348, -16777216, -17749490, -8223252, -6220724, 6276021, -16569984, 12283070, 5309654, 72478, -1319092, -2157684, -5069135, -8332237, -8016020, -3419331, -1175747, 3473555, 5557151, 8075613, 7699803, 2952790, -2989834, -6476811, -7013145, -5205501, --1972464, 1068373, 2479270, 2449742, 2974802, 3425237, 2632815, 74088, -2011655, -3477313, --2837900, -1035624, 598074, 1379758, 238371, -153545, 243739, 357556, 1023813, 1087701, --36507, -1146756, -477815, 893353, 228707, -1025960, -842350, -139050, -695248, -1144072, --183073, 2070711, 2803540, 870805, -689342, -1047972, -746251, -474057, -807454, -1125818, --443455, 791348, 1271847, 716723, 583042, 700080, 132070, -448824, -947577, -966905, --679679, -226560, 466004, 782758, 572841, 466004, 233539, -126165, -473520, -655519, --499290, 16106, 340376, 379568, 280784, 84289, -178241, -394063, -279173, 42413, -195421, 209380, 202400, 88584, -103079, -182536, -114354, -53687, -13959, 30065, -41339, 28991, 13422, -5369, -20938, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --4407710, --2930242, 1226213, -1134408, -1394791, -2151242, 518080, 4252555, -1371705, 9127, 431644, -7286949, -147103, 1388348, -3003256, -2093797, -747861, -1973001, -2112050, -1990181, -1347546, --1891933, -2486786, 2080375, 3466039, -1915555, 527207, 130460, -3935264, 100395, -87510, --2804077, 5268851, -2704219, 2996277, 1130113, -807454, -3036005, -2792266, 2697240, -1408749, --1034550, -4160750, -1074816, -384400, -1978369, 5558762, -1228898, -346819, 2306934, -402653, --4646618, -2376191, -4099010, -2738579, 6317897, -1776506, 7027640, -25233, -310311, -1273458, -801548, 300648, -4209068, -4460861, 3231963, 375810, 2190433, -293668, 2553895, 1586454, --4081830, -20401, 1329292, 2196339, -29528, 1855426, 3342022, -4479114, 1159641, 1161789, --2270964, 8053, 994822, 3229279, 2094333, -2234994, -706522, -112206, 725850, 1034550, -750546, 853625, -619549, 449898, -1251983, -770410, -49929, 1652489, 688805, -35433, --151398, -1097901, 617938, -70867, -415538, -79994, 544924, 261456, 380105, 1073205, --390305, 481573, 1231582, 9575630, -804770, -1217086, -2520072, -5318780, -6548752, -5996848, -609349, 5242545, 1801202, 7016903, 2377265, -3263638, 802085, -8471823, -7182259, 3257733, --2557653, 4611721, -490163, -3795677, -1916629, 9212168, 2015950, 3862786, -231928, 2944737, --1436130, -1194538, 1781338, -1333051, -4101694, -354335, 1428077, -527744, -296890, 5839008, -3593277, -6393596, 91268, -4076461, 6624987, 3892851, 225486, -2428804, -2493229, 3017215, -1660542, 4927401, -4682051, 7854959, 9652939, -2730526, 9403294, -69793, 4902705, 3024194, --1802813, 1582696, 7526394, -943282, -5169530, 4323959, 1359894, -113280, -642098, -957241, -270583, 4366908, -2896419, 1549946, 1132261, 2284923, -3721589, 4112968, 911607, -425739, -1264868, 549219, 350577, -235149, 887985, 2392834, -1784022, 929860, 595390, 972273, --1633698, 52613, -2588255, 380641, 1133871, -1524177, -992137, 275952, 642635, 762894, -172336, 689342, -59056, -48855, 1484448, -208306, 329102, -8319889, -6500433, 2073932, --3670587, 2658585, -4592931, -6533182, -6037651, 868657, -4504347, 4168266, 3060701, -5793374, --1174674, 2393371, 578747, 2938295, -1692217, 3039763, 3735548, -5137855, 1675574, 1727651, --4125316, 2465848, 449361, -4865124, 3655554, 3533148, -1717987, 3858491, 571768, 3155190, -2851322, 1213328, -1818919, -426276, -5846524, -1737314, -2895882, 3121904, 3274376, 1316408, --9380745, 1829119, 3981435, -2091112, 6629819, -5370320, -7151121, 581431, -2108829, 2328946, --5101348, 9372156, -473520, -3087545, 931471, 153545, 5332202, -265751, -3085397, -168577, --2090575, -2830920, -3618510, 1746978, -6553047, 712965, 252866, 1967632, 4399657, 1483374, -3133716, 4876399, -3297461, -543850, 1090385, -4097936, 2836289, -1370095, 2418067, 1962800, --1275068, -937377, 3553549, -1109712, -3228742, 499827, -339302, -79457, -1742146, 2624762, --1990181, 1024350, 968515, 1359357, -514322, -494995, 156229, -949725, 386547, -636729, -59593, -378494, -978716, 1309428, -501437, 321586, -180389, 124554, 10201, 273267, --1670205, -19943144, -286152, -2399276, 14120779, 348429, 891206, 3042984, -1921998, 7130720, -1790465, -7545721, -4037806, -8859981, 1620276, -588411, -3014530, -2540473, -3219615, -2044404, -10995116, -5007932, -2449742, -2822867, -8308078, -326418, -2010582, 2879239, 4182225, -1327145, --16643, 2467459, -2520072, -671089, -1050120, -2996814, 3386582, 6775848, -769336, -1091459, -5375689, -7036767, 4625680, -5613523, -11333882, -7183333, -11287711, -1700270, -6418829, -4314295, -1233193, 4545686, 2334852, 3256659, -1628866, 3944928, -4769561, -1058710, 4150549, 11811, -5747203, -2350958, 1803886, -3968013, -2972654, 2994666, -6874095, 1886564, 5248987, -6716255, -757525, -1755031, -3069291, -4394289, -3927211, -1291175, -1686848, 1102196, 4922033, -2308545, -1597728, -4027069, -4264903, -3373697, 1736777, 2352032, 700080, -1032403, -1175747, -1783485, -1098975, -1506460, -1270237, -585726, -1170916, -121333, 341450, -2164664, -413391, -224412, --1568200, -393526, -642635, 47245, -179852, -2972654, 479963, 1307281, -460098, -1146756, --8590, 1908576, 1081795, -692027, -2003602, 1187559, -144418, -657667, 12809203, 95026, --7132867, -6852084, -2345589, -4993973, -1923609, -3751654, 984084, 632971, -5642514, -3308199, --6198712, 11773042, 4989679, 1101122, -664109, 6393059, -9514426, -132070, -200790, -5994701, --8007430, 7187091, 144955, 5134097, -8033737, -3493419, -2800319, 2812667, -288300, 3453691, --5543729, 1697049, 2265595, -5974300, -5773510, -5195300, 1245004, -1695438, -1618666, 5091147, --1489280, 585726, 89121, -975494, -5731634, -3466039, -663572, -8580271, -5628018, -4507568, -2391223, 1675037, 3436511, -822486, 1501091, -68719, -885300, 4033511, -3113851, 7005629, -973884, 2141578, -924492, -2274185, 2771328, 2188286, 5505075, -1633161, 856846, 3395709, --1995012, 99321, -7286412, 3461207, -5611375, 3583077, -4150012, -3997541, -7858180, -1498407, -1981591, 894427, -1331977, 1864016, 784905, 3622805, 576063, -1054415, 3131568, 1752884, --2806224, 721555, -2284386, 2506114, -1009317, 455803, -635655, -245887, -2018635, -35433, -98784, 418759, -1191317, 977105, -1701344, 703838, -324807, -800475, -1512365, 429497, --1023276, 2158221, 575526, -522912, -952409, -813359, 1620813, 1140314, 1547262, 201863, -146566, 862215, -1800128, 15177878, 14371497, 10742787, -3550864, 3974455, 5467494, 3233574, -3112778, -5251135, -4575214, -6892886, 6250788, -6464463, -743029, -4687957, 8273181, -9056475, --6745246, -3340411, -1413581, -4964446, -7487739, 2204929, 452045, 492848, -9091372, -4990215, -2443300, 1966021, 2650532, -2432025, -3580929, 335007, 2803540, 3560528, -2522757, 3387656, --4803921, -1245004, -11834246, 4399657, 1481227, -2005213, -2203318, -8725226, -3956739, 1142998, --2078227, -12272332, 6690486, 2777770, 31139, -3289945, -2539400, -5175436, 1635309, -1817308, -3589519, -745177, -1728188, -6972343, -1314797, -675921, -3819300, 7712688, -5538897, 127238, -4600447, -1896228, -5994164, -3369939, 5221070, 7533910, 3748970, -557272, -190052, 3992709, --8071318, 3316252, -826781, -380641, 406948, 1758789, -435939, -326418, 435939, -1575179, --4864051, -1312649, -1467805, 1499481, 1071058, 572841, -1868311, -989453, -2162516, -2692945, --646393, -98784, 3255585, 309238, 465467, 401579, -1101122, -653372, 1511292, -1696512, --239981, 581968, 954557, -2027761, 48855, -181999, 1215476, -1459215, -324270, -862215, --1391569, -3118683, -1408212, -156766, -1333051, -3758, 182536, -157840, -1698123, -688269, -18285286, 6129992, -2680060, -2138357, 6415071, -12362526, -2334852, 10004589, 5009543, -6979322, --163746, -4736275, 1923609, 7694971, 18894634, 6238977, 14714021, -5217849, -1104344, -14327474, -4852240, -4180077, 4022774, -6274947, -340913, 606127, -2244657, 5144297, -2315524, 2457795, -6318971, -4847945, 2844879, 8087424, -2215666, 2707440, -2684, 3253438, 4415764, 4554813, --24318642, 8892193, -2822331, -11377905, -2002529, 6956237, 2113124, -8787503, 4730370, 6937446, --14329085, 1156420, -4055523, 8429947, 1908576, 6965900, -1715839, -5000416, -10068477, 625992, --6096706, 18988050, 3490198, -3106872, 6308233, 809064, 6103149, -14919643, -1984275, 2318746, -4609574, 1114007, -7005092, -1085553, 2532957, 6661495, 5587753, -4617090, 104153, 6556268, --306016, 3098282, -2301029, -1103807, 4561792, 468151, -381178, -602369, 206158, 2272575, --2189897, -932008, -302258, 1774895, 1666984, -192737, -631360, 4552129, -1468342, -741956, --2414309, 350040, 1195612, -1149978, 51540, 1430224, 1812476, -1571421, -769873, -2634963, -164283, 2164127, -1051730, 441845, 942208, 1148904, 3606162, 520228, 1745904, -56371, --1622961, 2436857, 542240, -21708376, -23809152, -8151848, -1858647, 437550, 5057861, -10167261, -3207267, 11988327, -6878927, 6382322, 8297340, -5780489, 176631, -2814277, 10147397, 14159970, --6784438, -7989176, 7116761, 688805, -6800007, 3223373, 110595, 1780264, 2021319, -3628174, --2651069, -15121506, -781684, -4319127, -352187, -439697, 10281078, 3062849, -18467822, 319975, -8898098, -10086731, 2653753, 10872710, -2394981, 3835943, 213675, -2835215, -7023346, 13976897, -11742441, -8919573, 4670777, -3306588, -471910, 4363150, -3109556, 3663607, -5538361, -610422, -11785390, -3330210, 2485176, 5592585, -4039417, -9672266, -426812, 3353296, 1710471, -4634270, -602906, 2639258, 4181688, 8652748, 5324149, 9519795, 5002027, 1864016, 4399121, -1527935, -8544837, -248571, -6781217, -9074729, 1101122, 2990908, -1613297, 6844568, -3539053, -3641596, -2685965, -820876, 707596, 384400, -4234301, -549219, -2561411, 3136937, 1363652, 2531346, -4833449, 649077, -1748589, -7005629, -571768, 1681480, -1831804, -681826, 680215, -1521492, -1473174, 1615982, 166430, -1611687, -1219234, 3502546, -523986, 1672890, 820339, 1171452, --2511482, -2565169, -1585380, 658741, 1148367, 2124398, 1491964, 1071594, 921807, 2658048, --722628, -2492692, -23599772, 25866440, -1731409, 16564615, 1064078, -9953050, -3133179, -5854578, --7050189, -1104880, 251792, 11924440, -2134599, 8127689, -8603356, -654446, 1860795, 1716376, -746251, 10339060, 10310606, 3639448, 1472100, -1532767, -2251100, -805843, -1951526, -17770964, --6187438, 7897371, 5036386, -2157147, 700617, -8514236, 4019553, -10394895, 2042794, 16007343, -1575716, 3322694, -13660143, 7002944, 6096706, 1536525, -9222905, -4148402, -4394826, 548682, --8295193, 8104067, 9958419, 5927592, -1071594, 15000173, 5214627, 22042846, 8519068, -6133214, -18354542, 232465, -6919729, 13223667, -2347200, 4242891, 8289824, -6284611, -5382668, 12219719, -13174812, 7694434, -10972568, 3927748, -259846, -5178120, -9038222, 6411850, 11646341, 6951405, -16980690, 2184528, -3926137, -3995930, -10707353, -4179540, 6394670, 846645, -2080912, 246961, --6732361, -4784594, 779000, 1518808, -363998, 6920266, 5458904, 2319282, 86436, 1910724, -3221226, 1568200, -3423626, -1493038, 826781, -916976, -1266479, 2823941, 133681, -1002338, -2266669, 757525, 635118, 784368, -2303176, 395137, 6070400, -2966749, 3779034, 1668058, -33286, -2946348, -3231963, -1741072, 1185411, 5758478, -12549358, 16703665, -4818417, -10961293, -3675418, 7270306, -7277285, -3679713, -15371688, 6449431, -5637145, -1843615, -14093398, -6182606, --4782446, -2398202, -6358699, 3338800, -2857764, -3457449, 3308199, 4672388, 8198019, 8059506, --3489661, -2889976, -11368778, 4494147, 203474, 7495792, 2036888, 2024003, -2592550, 3013457, --7119982, -5990943, 3318399, 1726577, 3367254, -13829795, 4609574, 9086003, -60130, -12176769, --12772159, -9904195, -29412472, 4177930, -3420942, 14244259, -6998649, 11839077, 3751117, 830002, -15189152, 2345589, -1803886, 10972031, 4006668, -14903000, -7468948, 1809255, -4811974, -8448201, --5206037, 19270444, 8797704, -9032853, -1157494, -5062156, -2547453, 2840047, 13530221, 274341, --3712999, 18009872, -6511171, -16307454, -15655156, -18458158, -3355980, 1444183, -558346, -3222836, --2339147, -7874286, -1634772, 2345052, -2535641, -2308008, 1475321, 1546188, -11713450, -4745402, --9195525, 469225, -3180423, -2914135, -4971962, -1489280, 1201517, 7096360, -32212, 8695161, -4151623, 6397354, 562641, 3034395, -3085397, 5838471, -156229, -4130148, -6352794, 3631932, -440234, 2030446, -1762547, 1186485, -2100776, 2051384, -849330, 2423435, -646929, -971200, -1380832, -277025, 7275138, -12087112, -3051038, -3249143, -1599339, -853088, 32056026, 5239323, -11708081, -5702643, 10222022, 20656108, -17733920, 26838714, 15896748, -7194070, 220117, 1617592, --9676024, -16204375, 1092532, -9399536, -14471892, -6487548, 1261110, 13422, -1799591, -6505802, --1110786, -6334540, -465467, -7321309, -558883, 5000953, -11381663, 6229850, 9536438, -7453379, --6947110, 4927938, 3702262, -656056, 28770912, 2534031, 19168976, -13808320, -1369021, -16740709, --12316356, 2953864, -12353937, -16922172, -11314018, -12853763, -2836826, -3425773, -14304925, -15511274, -20201378, 3175055, 1235340, -2745021, 10445360, 5818607, 12606266, -1255204, 11912092, -6684043, -2681670, -22363358, 18227842, 8834748, 1391033, -12281459, -972273, 5547487, 1116692, 2138894, -8977019, 12592307, -9803263, -12534862, -8305393, -1959579, -263067, 1374926, -7421167, 843961, -2052458, 5191542, 6684580, -849330, -4230006, 7032472, 3408057, -5242545, -427349, 2543695, --3204046, -5539971, 931471, -1876364, -1899449, -164819, -2506650, 6448357, -6875706, 3744675, --273804, 7132330, -7526930, -1802276, 1166084, -1884954, -2924873, -1192390, -5992553, -6483790, --1321239, 685047, 1818382, 2357937, -4503810, 4469451, 3274376, -2651606, 3885335, -783295, -2183991, 198642, 2157684, -1801202, -1527398, 614180, 1067836, 2618856, -442919, 3592740, --1770063, -1241246, 537, -1301375, 2267206, 2306398, 15679315, -6322729, -5145908, 17498770, --14630269, -11142219, -2691334, -8851391, -1371168, -17428440, 3972308, -10710038, 8311836, 1219771, -2866891, 10049687, 2922188, 7109245, 9740986, 9256191, 7646653, 12948253, 1578401, 8819715, -7903277, -9352291, 16326781, 4043712, 7572028, -8726837, 12750684, 5783711, 8966818, 2316598, -3227131, -1591822, -11675869, 3040300, 6670084, 7871602, 8578123, 1893544, -14208826, -8953933, -10293963, 5636608, 2374580, -5357972, 7138773, -5122286, -14241575, 21032454, 12849468, 9424232, --8028905, -3910568, -10598369, -33097018, -961536, -4566624, 4323959, -7682623, -8282845, -14558865, -2629057, 4755066, 18602040, -14570140, 5981279, 340376, 8589935, -12817793, -15770046, -9563282, -10267119, 3190624, 3246995, 5507222, -4290136, 1889249, 12030203, 4341675, 6120329, 7728257, --2997350, -2699924, -4963372, 212064, 5294084, 6577743, 304406, 2782602, 1372779, 1148904, -4984310, -2943126, -2546916, -4189204, -2343442, -4336307, -66035, -6638409, -2648921, -7020661, --323733, -4175782, -1155346, -860604, -2393371, 2178622, -1700807, -9034464, -1286880, 3805341, -4095788, 7693897, -1039382, -4343823, 2234457, -1620813, -6582038, 6309844, 5300527, 5164162, -11772505, 7816304, -543850, 583579, -2516314, 3272228, 1048509, -27091580, 15087146, 16077673, --8443906, 13667660, 4504347, -22891638, -4293894, 29402272, -4524211, -20046222, -3387119, -2189360, --17462800, 11729019, 2198487, -8943196, 12654584, 8309151, 30327838, 17666274, 179852, 1971390, -28595356, -7690676, 7016903, -12082280, -17282948, -5343476, -11835856, 2324651, -1137093, 5549098, --1176821, -2345052, -5181341, 22502408, 811212, -18216030, -14530948, -3511136, -3985193, -908386, -7144678, 20518670, 12993887, 4127464, -12903692, 15904264, 29258390, -6511708, 13133473, 12299713, -35315904, 6513318, 6503118, 10509785, 14890115, 8158827, -12505871, -12006581, 7910793, -22082574, --13430363, -15896211, 14555644, 12732431, 8790724, -3795141, 10657424, 22601192, -13312251, 17954574, -17843442, -2680597, 17535814, -16988744, -7670812, -6080600, 37044092, -18456548, 18067316, 11238319, -6484327, 4984310, -16790638, -1865626, -13261248, 13721884, 12984760, -433792, 713501, -6889128, -9642738, -4099546, 729608, 3517578, 3801583, -243739, 5785858, -4381404, -2500208, -1870458, --4407174, 1678259, 3392487, -3284576, 1413581, 4090956, 7314330, 963146, -7227356, 2761127, --7813083, 1161252, 6567005, 4256850, 6961068, -1436667, 11378979, -4792110, 8334384, -2432562, --3039226, -1707250, 228170, 9205726, -7074885, 4333085, -457951, 4395899, -5811091, 1297080, -2000918, -2697240, 12066174, -6914361, 5221070, 5700496, 20216948, 36251136, 3677566, -3995393, -3623342, -2172717, -6247567, 875100, 3565897, -9111236, -12115566, 3830037, -6411850, -3556770, -9043054, -651761, 18004502, -9790915, 17644262, 8616241, 1505386, -10565083, 3122978, 17683990, -4910222, -9233106, 3269007, -2316598, 242666, 10332081, -14790257, -7833484, 15948824, 200253, --4271882, 13939316, -963683, 4847945, 2930242, -13604309, -24834038, -5325760, 8247411, 15623480, -3128884, -12195560, 15444702, -5260261, 31614180, -16252693, 21179558, -12639015, 7397545, 18313204, --27481348, -28198608, -475668, -8039642, 6977175, 8886287, 1004486, -4211753, -16919486, 11142756, --2700461, 19893752, 8728447, 18524194, 4777078, 10762114, -4829691, 14217415, 4857071, -8585103, -1436130, -288837, -41419592, -1258962, 6931541, 9910637, 17083232, 14711874, -5114769, 1210107, --3368328, 2731062, -327491, -4595615, -11221676, 4716948, -6685654, 14244796, 1352915, 2771865, -6674916, 4141959, -4821101, 4113505, 9996536, 9065065, -3427921, -1633161, 1137630, -2177549, --1843615, -6427419, -1522029, -13483513, -2239289, 4666482, -11635066, 7857643, -8876624, -6860137, -1647657, -6971806, 6769406, 2831457, -3073586, 4728759, -932008, -703838, 2597918, 9997073, --7300908, 1627256, 1076426, 4471061, 2778844, 2094870, -4131759, 23893976, 30876520, -6633577, --1109175, 10950019, 40814000, 1231045, -24016384, -9549323, 4977330, 4728222, -7543037, 7882339, --5428839, 12720083, -20362440, 1173063, 12799003, -8432095, -9149354, 1879585, -20131586, -6120329, --6514392, -32052804, -27091044, -15628312, 11915850, 14059039, -2385318, -22774600, 2636036, 926102, --751619, 4702453, -11435350, 27592480, -7788923, 3619584, 30493730, -26525182, 12899397, 4630512, --9246528, 11198053, -7153805, -21476984, 492848, 18824842, -8321499, -13439490, 7826504, 2658048, -17861158, 276489, -27435714, 2343442, -16207596, 27214524, -9787157, 4243428, 6684580, 3400004, --3860639, -17414482, 7362111, 18592376, 5377299, 19180788, -27834072, -15167140, -4573067, -79457, -3015067, -21322366, 19262928, -2468533, -20478404, -6655589, 12968117, 12243341, -11340324, -15569256, -15567109, -12351789, -7856032, -93416, -1926830, -1513976, -1017370, -4381404, -871878, 8020852, --1777580, 7392176, -8228621, 5924371, 7490423, -1788317, 4042101, 1453310, -1526324, 337155, -1013075, 13612362, 694711, -2306398, 1134945, 3229816, -6681359, 2659122, -8543227, -405874, -9873056, -3267396, -7784092, -2587718, 4423280, 444529, 319975, 6137509, 459025, -7479686, --4058744, 14519674, 10362682, -3089155, -615791, -146029, -21130702, 31061204, 885300, -53202296, -21311090, -7313256, 4146254, 5427765, 7143068, 13059385, 4760971, -9633075, -2326799, 13151727, -8892730, -10564546, -565325, -8382166, -4345970, -26132728, -3335042, 12576201, 15618649, 3510062, --6199249, 17301202, -17823578, 19713364, -11359115, -6381785, 2349347, -6118718, 5255966, -15728707, --21233244, -23763518, -7606387, 12303471, -4752382, 118648, 14471355, 4017405, 2528662, -455803, -491237, -5006322, 194347, 15595026, 9601399, 16457778, 13960254, 16510391, 11236708, -9819906, --6261526, 4054449, -1052267, -18977312, 12759274, -3436511, -17927730, 22502408, -254477, 3655554, --626528, -8188355, -2702071, 9448391, 13690745, 11385421, 348966, 6972343, -22963042, -3264712, --8183524, 12492449, 4313758, -6403796, -7304666, 28913182, -8815420, -9910100, -3133179, 4659503, --7159711, -19059454, -1075352, -3269007, -10296647, 17854180, 3644280, 6717866, -5488432, -961536, -4159676, 1067299, 5253282, 5659157, -1855426, 3467649, -3438121, 3930432, 1500554, -3165391, --2390686, 2908230, 4110821, 1109175, -3629247, -3021510, -3262028, -2419140, 88584, 2033130, --2953327, -3593814, 858457, -294205, -635118, 3089692, -1442572, 4900558, 1502165, 14375792, --1203665, -1818382, -3156801, 1750736, 89657, -6059662, -7962333, 72469520, -71069360, -3511673, --77274512, -11915313, -29359860, -3527242, 18913426, -9533754, -21363168, 33789580, -9092446, -5825050, -1149441, 10451266, -1175210, 28092308, 18592914, 11178726, -16525960, 1155346, -11267310, -11438035, --7656853, 468688, -3511673, -3049427, -9327595, -2033667, 15519327, 1955821, 10276246, 10288057, --807991, 13717589, 19937238, 1112933, -4070019, -10354629, -12409771, 5006858, 5450314, -10263898, -16893180, -22274774, -22566832, 2525441, -7894687, 12108050, -20924006, 8966818, -40242232, -21417392, --32216550, -2765959, -15901580, -1415729, -9706626, -12080669, -10530723, -940598, 2728378, -31457952, -3587908, -6874632, 3611531, 161598, -14553497, -25591026, 17707076, -15394237, -2751464, 15859167, --1606318, -4954782, 10482405, 13146895, -2710124, 13095892, 8567386, 15822123, 8720931, 16010027, -7577933, -9472014, -2639794, -8342974, 381715, -6906845, 1479616, 5806796, 8195872, 8987756, --3984656, 4182225, 2996277, 5897527, -1396938, -2237141, 3075734, 7066832, 930397, 1651415, -7783555, 4002373, 8012262, -1133871, 369904, -818728, 3908420, 5555540, -1008780, -9212705, -5055714, -1531156, 1963874, -2886755, 1281511, -2612951, -1364189, 491774, -7684770, 133144, -10522670, -6570763, -6940131, 914828, 3591667, 3673271, 1241782, -7271917, 58631672, 29427506, -14221174, -14234595, -7376070, -30670362, 6722698, 24515674, -4820027, -5890548, 40206800, -7261716, --8966818, 19858318, 29431800, 5036923, 30019138, -7577933, 4356171, 17673790, 20013474, 31561568, -25556666, -1420560, -11434277, 9433896, 11502996, 10817412, 13526999, 23580444, 11549167, 30007862, --11697880, -882079, 8767102, 8081518, 25447144, 14725832, 27275190, -19775640, -6226092, 10808285, --21246666, 17044040, 17370458, 16577500, 7068980, -21477520, -7843684, 40459664, 10409390, 27245126, -22651658, 24773908, -5137318, 32866700, 51583096, 17675402, 4519380, 36107792, 24982214, -14044006, --8619462, -17635672, -14056891, 15134928, 17677548, 1429150, -14963666, 198105, -13383118, -735513, --5998459, 8618926, -31428960, -3702262, 3136937, -16025060, 11964705, 1999844, -9841918, 8267275, --19792284, -12974559, -21923660, -7444789, -10590852, 7618198, 2382096, -10305774, 2281165, 14183056, -4198331, -4809290, -8713952, -13637058, -5242545, 4356708, -19148574, -9045201, -1650878, 15249818, -5142687, -6657736, 3204046, -10437844, -2835752, -3295851, -8551280, -5639292, 14368813, -3444564, --1017370, -3634616, 3394635, 9061844, 6539625, 7746511, 19828790, -103079, 15988016, 618475, -1650341, 9886478, 8588324, -13291313, -7611756, -1160715, 3101503, 1269163, 138513, -1452236, -6278706, -18450106, 9327058, -22260816, 39296268, 55759948, 32500554, -14155138, -30470108, -11139535, -27617714, -8026757, -22693534, 41603200, -28653874, 24900072, 14070313, -32446868, -13418552, -3286187, --53692996, 2275796, 6261526, -25792890, 53061100, -18057654, 49284748, -36715528, 5546951, 2518462, -36053028, 53149148, -4287451, 18157512, 25099252, -29134910, 19740206, -39491688, -10860899, 75533440, --4167729, -20614770, -3996467, -41995652, 1899449, -13095355, 47230144, 18119394, 22027276, -7036767, --12383464, -23279796, -21642878, 5669357, 3085397, 325881, 31471910, -7414188, 6066105, -32363652, --16814796, 21985938, -48455284, -18903224, -14523432, -16356846, 45387604, 3539053, 49031884, 35349192, -15680926, 19030464, -10907606, -25618406, 21996138, -34956200, -21451752, 43719544, 13265006, -25899726, --43102144, -25845502, -30656940, 24954296, -26457536, 14041859, -19093278, -1379221, -16391206, 17805324, -10268193, 1831267, -14215805, -2347200, -9802189, 3195993, -19353122, -13151190, -7263327, 4574140, -10875931, -86436, -7864622, -10747082, -17987324, -12592307, 11487427, 15963320, -4894652, 11111080, -21977348, 10805064, -20350628, -5682242, -7464653, 13198971, -12411382, -7868380, -2909304, 5069672, --16324097, -21756156, -15682536, -4917738, 9084930, 34360, 2061047, -2790655, 12432857, 4223027, --761283, -11124502, -3783329, -6764037, 8746701, -2146410, 2098092, 35140884, -58771260, 62159988, --1738925, 4619774, -20148766, 50156628, 11641509, 32234266, 12073690, -21434034, 7068980, 17819820, --30988726, 21369072, 203474, 14114336, -41306312, -3398393, 9904195, 37673304, -15975131, -31427350, --1551020, 37465000, 19693498, -14583025, -32647658, -1797444, 27012124, 3361886, 1716376, 7341173, -19592030, 49715320, -70536248, -11802570, 6626598, 38938712, 8590471, -21517786, -5450314, 14713484, -35651988, -3812857, 1578401, -67676336, 19376208, 10353556, 18249316, -49156976, 43146704, 37093484, -13886166, -22344030, -2401424, -24702504, 18175228, 31739808, 13256953, 14750528, -2924873, 24012626, --35414152, 33250564, -10034117, -12125230, 39187280, 32203128, 1969779, -12440373, -32441498, 23476828, -25793962, -69422776, -5599027, 39617852, 9810779, -631360, -24863566, -10847477, 67572720, -5375152, --23243290, -3121368, -12574591, -15248745, 22414898, -19216758, 6781217, 10084583, 13651017, -9692667, -1268626, -9838159, -11662984, -7910793, 10298258, 10205379, -10674604, -2301566, 5121749, -8603356, -20415054, -19841676, 5069135, -3716221, -6422050, 7100118, 33864744, 2051384, 24159, -5616744, --11971684, -116501, 18433462, 4231080, -878321, -3745748, -8705362, 15554224, -4064650, -1080721, --9227737, 8855686, -1446867, -4320200, -52583820, 25236690, 4634807, 15960635, 19322520, 28213640, -9839770, 8872329, -13859323, 14404247, 2446521, 33532420, -4146791, -10390600, 26332982, 20113868, --4715337, 1470489, -11606612, 62277, 8185134, -2913062, -7021735, 14871324, -12305081, 1270237, -20307142, -4726612, 11630235, -21220360, -4482335, 2502355, -8830453, -3630321, 2187212, 14669461, --4014184, -25324200, 780610, 49613316, 10144713, -27336394, 7887708, -27865748, -19073950, -14524506, --4052839, 31568546, -3646427, -25652766, 51322712, -55997784, 9286793, 56615724, 5847061, 39721468, --30724048, -57285736, 18242336, 1688459, 45283988, 2139431, -25773562, 20834886, -5886253, -4986994, --11040213, -2082522, -16083042, 7701950, 2086280, 11885248, -19600084, -17010754, -6784975, 19889994, -25796648, -8912594, 13682692, -2348273, 21585432, 15088757, -27385248, 21529060, -5682242, 2962991, --4708895, -8747775, -165893, -396211, 2891587, -2361158, 2236067, 1677722, 1498407, 2850248, --9044127, 171799, 4976794, -7816841, -1009854, 4502200, -4844723, 5993090, 6929930, -10586021, -12380780, 4735739, 12829067, -3174518, 5944772, 10023380, -19584514, -569083, 5989869, 11091216, --6999723, -5535676, -6729677, -5217312, 11402064, 22564148, -9731859, -106081400, -243754432, -96599184, --146715008, -214809568, 115480400, 31938450, 66448512, 305956288, 235827520, 137586064, 251857424, 187937568, -32114544, 62139048, 51692616, -119334592, -102132176, -50017580, -182538800, -174536192, -66845796, -89669792, --126631744, -52927420, -45485852, -128869960, -107575512, -8918500, -61281132, -104482056, -35891968, 33348810, --75902808, 22875532, 112980192, -8585103, -16192564, 153461328, 122539712, -5336497, 179270320, 207756688, -84367656, 195198752, 273861088, 163419744, 141948128, 328678272, 262294192, 197233488, 233786880, 310098240, -110869752, 44022876, 129827736, -102349608, -293803136, -212952528, -324941664, -526171072, -471316832, -500182752, --581717376, -592851008, -511226752, -445141696, -446453792, -313833248, -139023792, -94118304, -14260902, 152336048, -279900864, 282594880, 350785536, 504700544, 441149504, 403304960, 557276864, 442954464, 250352576, 365381472, -255838848, 99365680, 89894200, 118074560, 12171937, -37207840, 22928682, 3420405, -82732344, -44043280, -7373922, -65840776, -122082832, -58566176, -83759912, -177770304, -112099184, -43255152, -132912056, -89288072, -17914846, -42174432, -62072476, 30514668, -36720896, -146380544, -112213536, -179693920, -303886112, -286110336, --274438208, -285029056, -250571616, -168308496, -131546256, -79125112, -15362024, 67011692, 118789672, 182319216, -229953088, 285655584, 297182208, 315216224, 351171008, 333135904, 305451616, 288976128, 191427760, 67463736, -6396280, -28631326, -81791208, -96422016, -84175456, -95040112, -106743360, -94031864, -94978904, -93069792, --78594680, -76689328, -80470504, -77655696, -67998456, -56378424, -48183092, -31522912, -19556596, -3972308, -2241973, 14318884, 21761526, 27354646, 28386512, 30036316, 29775934, 23423142, 13696114, 10580115, -5338108, -1497333, -7163469, -9122511, -20160040, -26324928, -32513976, -43333000, -51040856, -47828220, --46061912, -41101228, -30829276, -21849036, -16048145, -4029753, 8537858, 16728898, 25423522, 39543764, -42771968, 42411728, 45886356, 50422916, 46664284, 48507360, 50929724, 48279728, 46437188, 46646028, -41264436, 35532800, 31338228, 24085102, 13677860, 6203544, -2624225, -14336064, -26169236, -34802120, --45135812, -51350092, -54061292, -53309136, -52699248, -48287244, -41787348, -35224100, -28522878, -19915764, --14063334, -7572028, -2129767, 3038153, 7327751, 10848551, 13807246, 15938087, 15619185, 15316927, -13914620, 12097849, 10292889, 9065602, 7478075, 6085969, 4820027, 4054449, 3210488, 2785823, -2450279, 2230162, 1970853, 1804423, 1735167, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --8537321, -5090610, -6489159, 817118, -2736968, -835908, 2556043, -4011500, -7315940, -1848983, 641024, --4179540, -2405719, 3586298, -2092186, 1675037, -9168681, -760209, 6233072, 3339874, -10261214, --3510599, -2680597, -2700998, 3486977, -1469953, -5339181, -3332895, -3813394, -3865471, 6786585, -2148558, 4374961, -2795487, 5741835, 5240934, 3723200, -2028835, -4852776, -3787088, 413927, -1003949, 7804493, 2798171, 1491964, -3637301, 855235, 372588, 899259, 3126199, 1836635, --5255966, -4494684, -2288144, 2853469, 701690, -993748, -5619965, -1726577, 2259153, 2565169, --2243584, -861678, 166967, 2714419, -544924, -2994666, 44560, 431107, -3819300, 8218957, -558883, -5580773, 33823, -862215, 5319854, 420907, 3614752, 4927401, 1892470, -340913, -281320, -1796907, -1124745, -1197222, 3176128, -1016834, -362388, -1421634, 1123671, 370441, --564251, -137976, -775778, 155693, -76236, 625992, 680752, 1036698, 1330366, -5672578, --5135707, 5773510, 5294084, -4325032, 3179350, 296890, 1628330, -14149233, 5442261, -2124398, --9665824, -12602508, 319975, 9068287, 531502, 5870684, 202400, -11401528, -3942780, 1285269, -3962644, -2029372, -988916, -4815732, 619549, -896038, 8025684, 4060355, 1694902, 1416266, -2171106, 2765422, 7317551, 4416300, -6489159, -576599, 1493575, 1540283, -7714835, 2479270, --2302103, -4899484, -1390496, -233539, 5258651, 1327682, -2956011, 5309654, 8308078, -1789928, --3166465, 1984275, -606127, 4520453, 4627291, 3602941, -5572183, -4262218, 3979824, -1712081, --1406065, -4294431, 453119, -6364605, 3764539, 3371549, 4457103, 1119376, 5181341, -5644661, --3536906, 7262790, 373662, 2675765, 8601209, 3299072, 839666, -3495567, 5042829, 579284, --2569464, 1416266, -6094559, 145492, -648540, 879395, 1627793, -722091, -2719788, -1514513, --448287, 1298691, 1236414, 392453, -755914, 715649, 1713155, 275952, -574989, -555661, -7516, 7188702, 636192, 2783676, -6051609, -5139465, 2942590, -1424319, -2213519, -2810519, --2630131, 2185065, -7003481, -4013110, -8648990, -10387915, -1924145, 8650601, 5574868, -3490735, --974958, -1198833, -2015413, -7480223, 5388037, -1875290, -1924682, 476205, 3520800, -1682554, -309775, -255014, 5099737, -4713190, 5115306, 2798171, 6133214, -2088965, 4744328, 2115272, --2940442, 4284767, -2907693, 2469069, 4545149, -3427921, 4773320, -2847563, -2308008, -716723, --1419487, 2411624, -1397475, -3628174, 1454383, -3148748, 685584, 435402, 484794, 7211250, -1393180, -1650341, 33286, -2947958, -4130148, 2137283, -1001264, 6884833, 7005092, 2851322, --1955821, -1075889, -59593, -2756832, -3208341, 3545496, 5549098, 186831, -615254, 3427384, -3678640, -473520, 1292248, 1193464, -2692408, 2551748, -498753, 3659312, -1822140, -690416, --150861, -1510755, -179315, 2668249, -595390, 814433, 766115, -1871532, 574989, -336618, --394063, 768799, 681289, -1194538, 1356673, -455803, -605590, 109522, -170725, -216896, --1114544, -805306, 353798, 13716515, -5801427, 5624260, -6991133, -5879274, 29528, -1630477, --1486596, 1912871, -2940979, 5932961, 5788006, 4959614, -1487132, -644782, -2581812, -6328635, -990527, -3801046, -702227, 696322, -2119030, 3608846, 1365800, -431107, -10448045, -4359929, --6584185, 249108, -4307316, -6621766, -2901787, -3658239, -4047470, 6595459, -5267778, 4649839, -404801, -1868848, 2604898, 2238752, -4721780, -1292248, 99321, 5093831, -483184, -6960532, --8831527, -9193377, 2393908, -3357591, 203474, -727460, 1331440, 3109556, 5112085, -3529390, --1868848, 1683627, 1758789, 656056, 6410239, -3585224, 3964255, -7362111, 14432164, 1775432, --1535988, 2806761, 1381906, 2760053, -4012036, -706522, 1095754, -444529, -863825, -7282654, --2421825, -4949413, -1473711, -578747, -3569655, -3488587, 2592013, 3028489, 922344, 595927, --333934, 2558727, 1503239, 2937758, -1472100, 259309, 89657, 2699387, -1083942, -158377, --165893, 301185, -2138357, 526134, -1548336, 780610, 1075889, -511638, -1801202, 359704, -551903, -555125, -622233, -1934346, 507343, -226560, -991064, 1221381, 1401233, -179315, --413927, -6754373, 930934, 1198833, 401579, -1105954, -4059818, 2343442, 1870458, -6107981, -7076496, -8924942, 10910291, -1123134, 3614752, 1564979, -264141, -1229971, 2213519, 10213432, -11474542, -2259153, 2034741, -1440962, -1672353, 1472100, 2407866, 7839926, -1037772, 2336999, --4030827, 4272419, 926639, 6168647, 2981781, 5774047, -8439074, 3488050, 3033321, -2704219, --117575, 6272263, -1611, 438087, 1897839, 3792993, -1333587, -606127, 12183748, 5752035, -1056562, 1052804, -2576444, 5484673, -7402376, -10872710, -13113072, -865973, 6860137, -272730, -3409667, 9244380, 3656628, -1709934, -3293703, 4898947, -983011, 11902965, 5359046, 1711008, -1654099, -6595459, 1370632, 4866198, -2527588, -7419019, 1275605, 2579665, -335544, -2621004, --952946, 1184337, -2403034, 1315871, 1349157, 1181653, -486942, 1373853, -2355790, -2253247, --730681, -1455994, 740345, -2262374, 1258962, 2081449, 1406065, 1552631, 1618129, 441308, -1036161, -3095061, -2558727, -1023813, -1345399, -1651952, -332323, 940598, 557272, -182536, -1891933, 954557, -147103, 2315524, 1483911, -80531, -16011101, 1646046, -1265942, 10876468, --8249022, 4736812, -16945256, 6581501, -1649804, -8674760, -9511205, -6684043, 4990215, 3870839, -12767864, 1631551, 4220342, 12199855, -2180770, -8998493, 1293859, -6951405, 1636919, 9931575, -1817308, -2878702, -1233193, -1989107, 2901251, 3799436, -863825, 2514167, 5116917, -3294777, -1596117, -6127845, -504659, -7650411, -1221381, 953483, -3623879, 5506685, 3783866, 4679904, -9461813, 524523, 11457899, 8711804, 4224637, -6059125, 13146895, 5583995, 2287607, 11460046, --1292785, 170188, 936840, 3742527, -2432562, -3463354, -7936026, -7749732, -6271726, -24696, --4953171, 10036265, -6129455, 4095251, 6302865, -3649112, 303332, -3002719, -1720134, -10053445, --11413876, 5109938, -2006824, -3924526, -3398930, 870805, 1313723, 666794, 2211908, -4086662, -9299141, 549756, 2784213, -2017561, 500901, 2666101, -4559108, 1422171, 158377, 1459752, -2096481, -124017, 1634772, 3070365, -7516, 803159, 2279554, 2415382, 3284039, -256087, -552977, -1806571, -481573, 48855, -798864, -2509335, 160524, -811212, -1040993, 137976, --972810, -1393180, 13328894, 486405, 140123, -1257352, -2630668, 2375654, 534187, -6835441, --8750996, -11855183, -6221260, -12403329, -7892540, -4241280, -9181566, -5818070, -4028143, -4786741, --12404939, 8468602, 5298916, 288300, 4454418, 2029909, -3462818, 15348066, 921271, -5340255, --2815351, -10449655, -4508642, 11421929, 530428, -9635222, -9630927, 1371705, -9748502, 3087545, -3381213, -7601019, 271120, 2338073, 508417, 11240466, 3346317, -5174899, 1108638, -6198712, -5658620, 780610, 2488934, -13809394, 9473087, -4765266, 3928821, 289910, 1811939, 2232846, -323733, -4043175, -348966, -5411122, -20938, -10894721, -92879, -11751031, 15418933, -2658585, -9797357, -7260642, -3414499, -1584306, -7494718, -4198331, 6002217, -249108, -266288, 4442070, -5767604, 897111, 9440875, 8169565, 11360725, 6036040, 2385854, 1356673, 5137855, 2729452, -1684701, 2070711, 1134408, 2505577, -754304, 4115116, 687195, -302258, -911070, 3197066, -1276142, 2265059, 1115081, -1555315, 1064615, 1239635, 1030792, -2540473, 4733054, 2536178, --505732, -3684545, -442382, -587874, -2665564, 915365, 430570, 2676838, -2281165, -5076115, --6799470, 20938, 5088463, -13105019, 45634, -5637145, -4502200, 9364639, -15122580, -14282377, -3786014, 19159312, 540629, 1866700, 1520418, -2863133, 10515691, 10210211, 5921150, 2932389, --2704219, -15484431, 9259413, 128312, -12394202, -3965866, 2937221, -579284, 155156, 1321776, --2945811, -12205223, -639413, 550830, -2189360, -5070746, 3728569, 10678899, -13662828, 8581345, --5090610, -2532957, 865436, 6819335, 22333830, -14361297, -3581466, 1464047, -1378685, -2588255, -787053, -5475547, 1973001, -4940286, 15370614, 5317707, 2920578, 4277251, -3187403, -834834, -8159901, -1224603, 3575024, -6693170, 11811697, 572841, -8274792, 16498580, -10430865, 7623567, -2209224, 3785477, 12013560, -4718022, 5144834, -532039, 74625, 1492501, -749472, -8024610, --4226248, -468688, -3517578, -1216550, -1893544, -4902169, -5009543, -3750580, 2412698, -4286378, -2552284, -1108102, -124017, -3754338, -2549600, -2756295, 2292976, -5202816, 583042, 561030, -3245922, 5044976, -1901597, -897111, -4437775, -3785477, 326418, -3324305, 1008244, -572841, --2931315, 110059, -847182, 1414118, 1857573, -1200443, 16273094, 1248762, 4224637, 4810900, --2753611, -9407052, -7383049, 1103270, 16278463, 9218610, 1981591, -14602889, 2075543, -8041790, -22549, 16290274, 15662672, 7902740, 10579041, -9589588, -19841138, -10397042, -14307610, 7897371, --168041, -2435247, -81604, -10828686, -3235721, 3322694, -2058363, -4127464, -4022774, 11537893, --774705, 3124589, -3313567, 7558069, 1578401, -4392678, -9220221, -7081328, 20895552, -920734, --4759361, 6665789, -11985106, 3730179, -6871948, -20910586, -4715874, -2737505, 6293738, 2403034, -5525476, 1744831, 8237211, 290447, 544387, 4557497, -20448340, -3244848, -5515275, -1477469, -1952063, 11705933, 12923020, 4649839, -3420942, -8950712, -11764989, -3958349, -6935299, 1460289, --3466039, -3677029, -8113730, 12072079, 8681203, 3523484, 11085847, -2666101, 4407174, 6801081, --4376572, 4043712, -2831994, 870805, 4021163, -1252520, -2724083, -1136019, -1520418, -1074279, --129923, 256087, 3981972, 143881, 442382, 1217086, -2270427, -6198175, 210990, -1458678, --841277, -1136019, -3676492, -430034, 1171989, 5479842, 4476967, -2567317, 593242, 3600256, --807991, 816044, -1343251, 813359, 3426310, 420370, 3762928, -23602992, -15431281, -3570192, --5617281, 12064026, 8288213, -1974074, 20772610, -20986284, -4890357, -7917772, 22187264, 10647224, --7285875, 8182987, 3115999, -8629126, 15324980, -16891570, 8370355, -7776039, 1326608, 1847910, --5634460, 14799384, -10391673, 9090298, -4324495, -21759914, -3605088, 15210627, -9199283, -14854681, -209380, -1846836, -22230214, -4151623, 8928700, 3790309, 11865384, 8727374, -2506114, 21395380, --5112622, -6580427, -10513543, -9788767, -9468255, 5877126, 7992934, -6880001, -7761543, 2567854, --6731825, 8973797, -2465311, 4873178, -3637837, -5556077, -4264903, -118112, -12583180, 3412889, -9080098, -2118493, 3928821, 5458367, 6447820, 11623255, -8313983, 3740917, 9062918, -1165010, --19299972, -20543366, 2263448, -1950989, 1527398, -7517804, -3122978, 1516124, -7442105, -13500693, --4125853, 10190884, 8266739, -4060892, -1647120, 3136400, 2793339, -1607928, -3282429, 244276, --435402, -5309117, -1970316, 5641440, -1626182, 4532264, 814970, -1411971, -2782065, 3639985, -3586298, 4212826, 500901, -2368138, 2442226, -6326487, -3799436, 3115462, 1450625, 2672544, -4919348, -2518998, 1014686, 1930051, 2394981, 456877, -2895345, -4154844, 1848983, -2264522, --1392106, 16779364, -10826002, -27066884, -24696, 19059454, 24366424, 4444218, -9178345, -6915971, -2377265, -4509716, -4013110, 10636487, 10784126, -5487895, 10400800, -13496398, -1775969, 9511742, --4845797, 11545946, 5355824, -1750199, -16204375, 6016176, -3899294, -3947612, 684510, -1328756, --1851131, 21912386, -10976326, 11121818, 18748070, 12972949, 6753836, 118112, -12625056, 12361453, --7131793, 11771968, -6854768, 2622615, -13266617, -2653753, -12547210, -8272107, 1733019, -11669963, --3343095, -4148939, -624918, 10155450, -12261058, -10540923, -3952981, -6106370, -2609730, -10450192, --13494787, -16822314, 1532230, 12829067, -1052804, -8353175, 1232119, 2638721, 10137733, -11447698, --6637335, -3737695, -442919, 7597261, -17180, 2041720, -7963406, -3376381, 3923453, 15522012, -6862284, 10692321, 12419972, 16222091, 6217502, -2314987, -5879274, 3884261, 4911832, 7115687, -2988224, 607201, -74625, 9820443, 3468186, -3747896, 714575, 5476620, 2172717, 1271310, --3704409, -3629247, -2602213, -5019206, 271657, 4605816, 4431333, 919660, -2723009, 6455336, -3712462, 8196408, 4263292, 178778, 5484137, 4295, -4349728, 6271726, -99858, -925565, --2466922, 1189706, -1566589, -192200, 5496485, 3192235, -45167488, -21471616, 15071577, -36884104, --25564182, -1650341, -15044197, -10320806, 11260867, 12869333, 3950296, -2369211, 4669703, 36830420, --4506495, 5888937, 14190035, 16156593, -16787416, -8721468, -7943542, 13595719, 14858439, 7453916, -2747169, 13898514, -4070019, -6971269, 9780714, 18811420, 1358283, 6076305, 19157164, 14113799, -11532524, -8593693, 3648038, 5794448, -12885, -318364, 12308839, -4030290, -167504, -1245541, -8231305, 304943, -13407277, -8994735, 2724083, -18245558, 13852343, -4054449, 30569430, 1215476, -16781510, 3320547, -697932, -9848897, -439160, 3913789, -12879533, -6648610, -15050639, -1907502, -7754027, 10512469, -4549444, -24551644, 8930848, -3902515, 8413304, -8804146, -10479183, 7707319, --15865609, -12170327, 23738284, 354872, 10952703, -2233383, -10224707, 2850248, 13997298, 3401614, -11140071, -17984638, -854699, -1217623, -2942053, -15460809, 15136538, -9001178, 1146756, -1760400, -1861868, -5731097, -521839, 3176128, 4667556, -3823058, 9932112, -2433099, -3119757, -5788006, --4901632, -4993437, 4798552, -1916629, -3451006, -1459215, 1304060, -3796214, 6962679, -2058900, -7875360, -4895189, 3373160, 1221918, 3178276, 5082020, 1084479, 18233210, -8434779, -21275120, -9006546, -11151346, 4552666, -365072, -10632728, 19417548, -26162794, -1159641, -31565326, 685584, -25360708, 35512936, 16758962, -6195491, 16375637, -1331440, -2362769, 1687922, -2870112, 8671539, --1161252, -16740709, 897648, -23232552, 8074002, -7246147, -5240397, 15444702, -392453, -17883170, --19979650, 4533875, 2672007, -9998684, -8339753, 14825690, -21652540, -197032, -4430259, 7533910, --5867999, -4760971, -17337172, -7417946, -7697119, -3302293, 12365211, -14840723, 5235029, -1880659, --2637110, 1856500, 5286031, -25065966, -2736431, 3307125, -2284923, 9163850, -7949985, -11121818, --5114233, -28038620, -12412455, -12269648, 504659, 11855183, 17892296, -8583492, 13518946, -23393614, -37286220, 2482491, -6794639, 19469086, -23270670, 19541028, 8684424, -5328444, 320512, 6466610, -431644, 3054259, 17783312, -7724499, 7536057, -4220342, 5426691, 8832600, 8685498, 10646687, --3791383, 8964134, 2037962, 1275605, -1598802, -12120935, 359167, -8624831, 3837017, 5462662, --1952600, -1420560, 1505386, 1136019, 5919002, 2698313, -4466766, 6450504, -186831, 687195, -7966628, 5435818, 3125126, 14571213, -12145631, 8053, 5255966, -66035, -9564892, 2214593, --6120329, -5758478, 22950158, 1328219, -16338592, -337692, -2447058, 10660109, 7039452, -9957882, -11565810, 239444, -25729538, -28026272, -2650532, -8422431, 7037841, -1176821, -9868761, -25258702, --22018686, 12059194, -18727668, -4184372, 1231045, 5967857, 1448478, 18056580, 1557999, -9088688, -12127914, -1578937, 1816234, 11180337, -14646375, -938450, 3238942, -14972793, 9148817, 12487617, -5487895, 11114838, 5847598, 17200270, 4744865, 12528956, -17510582, -5459977, -2745021, -23556286, --67646, -2524904, 9931038, -1553704, 11375758, -1860795, -13626857, -9293772, -645319, -21786222, -9625022, 627602, -4175782, 12779138, 8142185, 10619844, 11057393, 3389803, -1256815, 9276592, --29510720, 8995272, 3787624, 13266080, -5165235, -20855288, 13212930, -3130494, 22662394, -33308546, --11803107, -23319524, 16037408, -6783901, -21391622, -23895588, -15692200, -7055021, 7687455, 6023692, --6499360, -6776385, -3506841, -409633, -7184407, -2726767, 12265353, 1914482, -1103807, 3604551, -2731599, 2258616, 6687801, -5116917, -6743099, -153008, -11761231, 17180, -4089346, -1669669, --7570954, -2041720, -10354629, -9308805, 11864847, -6582038, -366146, 3985730, 5745056, -986769, -9965398, -8230231, -2607045, 4110284, -9656160, -2650532, 11423539, 4095251, 2601677, -3878892, --5818607, 4402342, 15609522, 14469745, 53059488, 40082784, 5384815, 11589969, 3317862, 30787936, -795643, 14964740, -14058502, 36475008, -14519137, 33075544, -1544041, 21114596, -2517925, 14890652, --14905147, 3540127, 7401840, -8177081, -2718714, -4409858, -3484292, 9842991, 180389, -8559333, --11797738, -17757006, -22594212, -10871636, -3850975, 104153, 7037841, -19020800, 7994545, -10481331, --16175921, -3382824, -11833709, 5352066, -2925410, -24736328, -5932961, -12589623, -14944339, -15660525, -14147085, 18948858, -39731132, 8979166, 3473018, 11123965, 3879966, -5021891, 23953032, 13487808, -12509629, -33221036, -14912126, -449898, 8136279, 27480812, 979253, -3728032, 1280974, 23281408, -20871394, -19833622, 22338662, 1654099, 4976794, -3792993, 13087302, -28261422, -9951439, 29123636, --4523675, -1894081, -11271068, 19421842, 12637941, -10040560, -17048872, -2928094, -784368, 1729261, -199716, -3630321, -15897821, -5413807, 12299176, 16203838, 9987410, -8936216, -2420214, -2607582, --7718056, 2499671, 2507187, 7501161, -1701344, -5274220, 4629975, 1829119, 2769180, 14680735, -1936493, -4060355, -5628555, 2543695, 5208722, 11441256, 2239289, -11078331, -5989332, -8311299, -3254512, 4282620, -9239012, -19532974, 6273337, -1570884, -3344706, -6806450, -12103218, 14621679, --5729487, 12746926, 19800872, -22284438, 6972880, -12713103, 37272264, -22003118, 21073794, 19435800, --7346005, -34740916, -20212652, -2248952, -9224516, -988916, -15918759, -25294136, -33687040, -19276350, --22422414, 9737765, -19174882, 8046085, 2308545, -2157684, -1962263, -15761456, -4865661, -16193100, -4790499, 14566382, 19033148, 397284, -5317170, -16622597, -3954054, 1712618, -9894531, 2884071, --13656385, -8862128, -1937030, -13527536, 10768020, -11941083, -35391604, 1368484, -1074816, -11642046, -15114527, 11877732, 17219598, 6652905, 13553843, 27431956, 4627291, -27183384, -6194417, 12869870, --5968394, -22586696, 12674448, 18000208, 6070937, -72478, -30600032, 27413166, -1281511, 22384832, --18507550, 22668300, 55438900, -4849555, -1563368, -27012124, 14604499, -21962852, 18606872, 9496173, --12090870, -2654827, -29895120, 6952479, -16288127, 314606, 11549704, 11596949, -375810, -7677254, --6645925, 8286603, 20290500, -9773735, -1540820, 3173981, -8786429, -2509872, -2743410, 4313221, --934155, 8570070, -3844533, -9652402, -5345624, 3008088, 7714835, -9553081, -2942053, -81604, -1379221, 7219840, 1604170, -2349347, 2611877, -16255914, -9291088, -915365, -1432909, 3485366, -1037772, 1423245, -226560, -2719251, 8420283, -339839, 6302328, -292595, -1705639, -5915781, --4044786, -43641700, 14730664, -57222388, 37679212, 13447006, -9831180, 40156332, -3929358, -20559472, -35617628, -13809930, -2004139, 7472706, 12420509, 32911260, 1285806, -2754685, 23229868, 9815074, -19500226, 23869818, 17703318, 1572495, 12359842, 1895691, -1297617, -13174275, 8341900, 12496207, -2989834, -817654, -14195404, 6730751, -13299903, 15896211, 15706695, 2679523, 18566606, -11516955, -12247099, 19237696, 12274480, -26089778, -28015534, 32831804, -3216394, 20517596, 31906776, 707059, -8590, -3373160, 6259378, 18402862, 17510582, 1784559, 14545980, -35970, -16625282, -20780662, --30726732, 497679, -12480638, 398358, 17405892, 16262357, -28737626, 2424509, 11145977, -25245818, -4187056, 35022772, -15204184, -17534204, 18825916, -20270636, 4665945, -5726802, 36781564, -10732586, -22724672, -11310796, 19102404, -1835025, 7107634, 15215459, -24008868, -7358353, 9167608, -15954730, -11684995, -14324253, -3935264, -8107825, -7330973, 988379, -3926137, -6590628, 3875671, 10889890, --5474473, 2945274, 4023848, -9528922, 1713692, 1253594, -2400350, -6751152, -2725157, -5224291, --15386183, -6171331, 3362960, -20309826, 7393250, -10429791, 7881802, -4762045, -1899449, -14256070, --7359964, 130460, 4000762, -6318971, -13785771, 2267743, 1024887, 7398081, 3280281, -24696, -9104257, 7191386, 858457, 6171868, 4281009, -19846508, 4566624, -23011898, 47649976, 11774653, --25269440, 9771587, -5779416, -22487912, -26513370, -26914412, 8115878, -1219771, 23961622, 35475892, -17111686, 8678518, -4169876, 11853573, 1236414, -44398152, 19632832, 46335180, -30154966, -31705986, --27368606, -38779260, 28230820, -38185480, 17340394, 340913, -4683125, -159988, -12330851, -14721537, -19102940, -39296268, 40587976, 23311472, 5476620, -25832080, -19478214, -17085916, 3729105, 6833830, --16662862, -2253784, -12277701, 27941446, 12736189, -4974109, -744640, 11520713, 2674154, 13139379, --22698366, -8978629, -2086280, -3992172, -21107616, -14879377, 12694850, -40288940, -23697482, 3107946, -47246788, 22786412, -14272176, -932545, -35750772, 17470316, 54786064, 1961190, -11669963, -8196408, --25740812, 33711736, -10744398, -12994424, -1046361, 19989314, 12630425, -17301202, -15531675, -5563057, -17678086, -4676146, 5237176, -1357210, -13882408, -4514548, 22374096, 12776991, 1908576, -10332081, --1569811, -1557999, 17464410, 14166413, 7163469, 6404333, -20536922, 7895224, 7503845, -3077881, -4758287, -3218004, -2868501, -18046916, -1838783, -918586, -2477659, -5755793, 4919885, 6626061, -3554622, -21229486, -18193482, -9000104, 16106, 1295470, -21343304, 7641821, 27001922, 5428839, --7392713, 506806, 4250944, 85362, -11605002, -8902393, -2975339, 3651796, 192200, -21986474, --15107547, -44088912, 9799505, -32446330, -48593260, 11592654, 27072790, 6776385, 7363185, -20477868, --25669408, -6556268, -38094748, -18635864, 10107132, -31839130, 50512572, 9960566, -12262132, 10985453, --24031952, -47579648, -15895674, -36354212, 5906654, 10817949, -13282723, -25811680, -13062069, -15865609, -14106820, -18893562, -6851010, -2317672, 21661668, -15442555, -2756832, -7139310, 5601174, 9168145, -1729261, -6292664, 22333830, 29251412, 18687940, -14740865, -12127914, -42636676, -23739358, -9625559, -11408507, 72058280, -12214887, 1003412, 32079110, -2748242, 13698798, -16197395, -16963510, -13609678, -15247671, -40434968, 362388, -5224828, -465467, 35283692, -15396384, 53331684, 4752918, 40453760, --51315732, -15247134, 14900852, -862752, -22246856, -18618684, 41720240, -42811160, -35415228, 51302848, -9043054, 44564580, -17609902, -2797634, -3058017, 14449881, 6136972, -3914326, 15144592, 15306727, --797253, 7283728, 4793184, 1760400, -5238250, -9405978, -2163590, -6169721, -8463233, 8055211, -4599910, -7019051, 5158256, -15522549, -1538135, 11244761, 19357954, -1387274, -12191802, -758599, --13880797, 8108362, 13298292, -9108015, -7631620, 7639136, 8864276, -19654308, 7086696, 1046361, -12923557, -8258685, -8704825, 76773, 4085588, 6199249, -22328462, 3799972, -9474698, 17872432, --6196564, -3979824, -2586644, -44065828, 21050708, 32422708, -23440858, -19246822, -6563247, -21143588, --25508348, 6878927, 7583302, 19905026, 899796, 17403208, 30877594, 32261646, 21386252, 7461969, --23589572, 2390686, 12291123, 16357383, 25044492, 338766, -12946105, -18772228, -7112466, 25463788, --10410464, 10064719, 22058416, 2253784, 43338368, 5078799, -27662274, 23990614, 23605678, 6896107, -10175314, 21995064, 3494493, 1947231, -25395604, 54934780, -58472760, -42884712, -49882824, -16415365, -10305237, -29219200, 15044197, 32807108, -9717900, 3303904, 28823526, 9315784, -31272730, -10747082, --24209656, -3365107, 1776506, 1695975, 27860916, 27524298, -6331319, -6815576, 17488034, 42329052, -7295539, 34845608, -29327648, 30987652, -13581223, 10347650, -6213744, -19585050, -13748727, -3007014, -13934485, 8679055, 34406448, -44464724, 22641994, -17524540, -11064373, -8571144, 16457241, -7738994, --1609539, 3709778, -17941690, 11317776, -8816494, -486942, -13642964, 4314295, -2822867, 716186, --15362024, 2387465, -1486059, 3172370, -1582696, -16539382, 6562710, -9368397, -8734890, -3809636, -12320651, 14505715, 15789910, -13511967, 27215598, -20467130, -6322729, 1684701, -2343442, -15093052, --8299488, -755914, -11534135, 3386582, -1067836, -369904, -1488743, -11151346, 1319092, -1755031, --651761, -24976846, -50236620, -50563040, -36600100, 7493108, 93889592, 23718956, -12969727, -28406914, --67874976, -95463704, 21531744, 39517456, 47437912, -10000831, 4094178, -28003186, -48711908, 14024679, -8820789, 15829102, 2268817, -40850508, -12498355, 9961640, -8232379, -1627256, -7748658, 53191024, -46698644, 31488552, -2908230, -22855132, -38813620, -25693032, -23237384, 36327372, -6049999, 26577258, -11999602, 12436615, -16379395, -88428544, -60899416, 30038464, -47927004, -16365436, 101971648, 70115880, -52668112, -39968964, 28832652, -27690192, 1990717, 2004139, 14769856, 43245488, 76219024, -29218126, --2755222, -50303732, -40660992, -66566624, 7184407, -2771865, -71687296, -17188996, 46111304, 17221746, -32171452, 43636332, 78636560, -57342108, -34443492, 4522064, -46828564, -6058588, 26114474, 61256972, -31111132, 9538585, -37447820, -35890356, 24157044, -10244034, 36069136, 31721018, -8625368, 14512694, -5791764, -6148246, -12071542, -7036230, -4588636, 10745471, 3071975, -319438, 3697430, -1166084, -5153961, 94489, 22796076, 18743238, 29731912, 5315559, -16437377, -34528316, -28229210, 11402601, -26704496, 30609696, -3914326, -19665044, -79362408, -40818296, -37608344, 827318, 3945464, 8025684, --355945, 5823976, -9054865, -128849, -13365938, -11973832, 16689706, 14697915, 8519605, 8581882, -4282620, 1866163, 3726421, 23226646, -37755984, -124970128, -116288920, -66763656, -72597296, -18122078, -120341224, 61127584, 123814240, 109859896, 172228720, 122986392, 105804368, 17047798, -45941656, -103872712, --166413872, -141344160, -142329312, -74412456, -35712116, -8413304, 1186485, 4064113, 29382946, 39241504, -99039264, 60117732, 116878408, 76107896, 100190312, 36218384, 96810712, 33601676, 23689428, 22880902, --5750961, -27207008, -65523484, -75654240, -140379392, -96204048, -177887888, -140784736, -215903168, -128044784, --101562552, -24544128, 59351080, 31523450, 5348845, 59198072, 126626376, 169092864, 221765808, 264282224, -226193376, 165184976, 206066096, 169965808, 95326800, 42820824, -10539850, -70924944, -163972192, -194827776, --260823696, -336830656, -389721024, -351761056, -309951680, -220660384, -150590688, 46105936, 145321824, 177027808, -272721824, 227629504, 284420256, 298820192, 293228160, 337933408, 221921504, 57591752, -55796992, -108360952, --134006736, -86852832, -125495184, -107690400, -125592360, -170099488, -171936672, -200292576, -118501368, -92356832, --78626352, -44029320, -2595771, 11770895, 48714592, 131985952, 139207936, 197487968, 172036528, 225870720, -166221136, 110969072, 114644488, 43630424, -29942364, -49080200, -217787056, -280961728, -261463120, -230867376, --135031088, -106107704, -57873612, 5050345, 59042380, 89746560, 122198264, 145674560, 173430240, 164499392, -155720480, 136929456, 76744624, -300111, -38511360, -90315648, -94247152, -80909664, -65776888, -68793032, --69345472, -54661512, -38881804, -23109072, -9186935, -8630737, -5681168, 2371359, -5889474, -7402376, -10667625, 23259396, 26505854, 17559436, 13641890, 20933134, 26779658, 21045340, 25551834, 33587180, -41008348, 34887484, 8455180, -4130148, -1467268, -1749662, -11314554, -9800042, -6849399, -15786152, --25914758, -32639604, -30975304, -27277338, -21926344, -18196166, -10467909, -4167192, -2336462, -1035087, -4993437, 10080825, 13377749, 14493904, 15471009, 12569759, 10346576, 10069551, 6594386, 1457605, -3268470, 4005594, 1468879, -1540820, -2433636, -119722, 4810900, 6691022, 5814849, 5041755, -7487739, 5913633, 1737314, -2017561, -4309463, -6175626, -7748121, -12868259, -15598247, -14781130, --15588584, -18523658, -14382235, -5492727, 603443, 1969779, 5387500, 9977209, 12601434, 11283416, -11292543, 12510703, 11515344, 8492761, 6075768, 3447785, 1685775, -354335, -1882806, -2112050, --1903744, -2341294, -3115999, -3331284, -2873333, -2536178, -2312303, -1957431, -1450088, -1095754, --820339, -676994, -520765, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --11935714, -4490389, -6781217, 3733400, -3810173, -7852811, -13598940, 2443837, 442919, 3472481, 3055869, --909459, -964220, 1072131, 8282308, -5812165, -10409927, 3504693, -4285304, -6958384, 159988, --1002875, 4361003, 1584306, 3120831, -3104188, -746251, -2021319, 7058242, -1874216, -2805688, --2459943, -1205275, -1656247, -2787434, -2450816, -1696512, 1430761, 627065, 958851, 270583, -1868311, 3011846, 1553168, -2624762, -7891466, -49929, -5475547, 830002, -336081, -2484639, -3586835, 268435, 63351, -7875897, -3190087, 1083942, -581431, 2785823, 239981, 2480881, --2255932, 1042603, -956704, 4898410, -1690070, 2589865, -4323959, -4321274, -5452998, 293668, --1264868, -1581085, 74625, -1898912, 4295, -2218888, 513785, 117575, -904091, -3440806, -384400, 376347, 2028835, 1767916, 56371, 1881733, -157840, -1433445, -437550, -670552, -768262, -1611, 142808, 1064615, 805306, -122407, 1000191, -630823, 237834, -8562017, --1758789, -1114007, -2418067, -1086090, -2916283, 2851858, -1145683, -987306, -230854, 73551, --159451, -2054068, 7613367, 4900021, 7956964, -3707094, 7920457, -4671851, -3271691, 3085934, -8769786, -181999, -5294621, -7826504, -5616744, -1073742, 6256157, 2462090, 2126546, 2778844, --2729989, 4256850, 554588, 3182571, -1535988, -7133941, 1956895, -4934381, -3371549, -3460670, --811749, -9060770, -406948, 433255, -3775813, 8475044, -1593970, -2733747, -3391951, -81068, -946503, -3626026, 136902, -4448513, -1662152, 125091, -1822140, 6091874, 201863, -1639067, -3425773, 2189360, 5655398, 2268280, 6796249, 1671279, 5559835, -6324876, 1657321, 5056250, --1714766, -4518843, -6205691, -122407, -471910, -1244467, 1546188, 1829119, -1304596, 4846334, --4154307, 1608465, 1709397, -3108483, 2285460, 508417, -2255395, 1215476, -555661, 477815, --2112050, 659814, 285078, 394063, -219580, -151934, 1073742, 271120, 1970316, -398358, -193274, 9673877, -4444218, -3427921, 937377, -2198487, -1644973, 4835597, -3824132, 4655208, -2116345, 70330, 2359011, -3174518, -3027952, -5543192, -5972152, 7789997, 3663607, 2720325, -4148939, -2767570, -1860795, -2043868, 9844602, -3852049, 10778757, -392990, -2786897, -2631741, --5761162, -6186364, -7507603, -488016, -1917166, 1326608, 7186554, -640487, -3419331, -10094784, -316217, 7976828, 11709155, -5534602, 2996814, 2141041, -3023657, -2679523, 3027952, 11106249, --2691334, 1731409, -991064, -1643899, -1079647, 5318780, 7666517, -5851893, -3202972, 2371896, -10063108, 1669132, 7116761, -5861557, -5458367, -312996, -934155, 2032056, 1496259, -145492, -595927, 1033477, -2669322, 1213328, 3231426, 2496987, -2015950, 6442988, -1684164, 4044786, --2158221, -2238752, 2387465, 2027761, 2154463, 480499, 2248416, 425739, -3394098, -2291902, -615791, -173946, 1199907, -643171, 1811403, -93952, 994822, -1013075, -223338, -100932, --529892, -1176821, -143345, -722091, -215822, -865973, -768262, 1813550, -63351, -889058, -1944010, 27380, -1050120, 15985331, -10943040, -2396055, -4531728, 1276142, 4276177, 7693360, --7635378, 5282810, -1975685, -8078297, -13088376, -2658048, -5545340, 960999, -1225676, -5515812, --2806224, 3088618, 3265249, 10283762, 5717675, 5248450, 566936, 1656784, -5283884, -3563212, -8269423, 6343130, 4313758, 2020782, 3984119, 882616, 67646, -6842957, -9700721, 6551973, --2562485, -6512244, -3090229, -4078072, 3517041, -3585761, 8308078, 1952600, -4732517, -2280091, --3616363, -3120831, 4076998, 6123013, -485868, 4143033, -2968359, -3303904, 59593, 870268, --3166465, -1195612, 4813048, 108448, -1935957, -2297271, 2638721, 2954938, -332323, 3561065, -523449, -2426657, 8289287, -1118302, 945430, 456340, -9905805, 3940096, 3154654, 5221607, -3398393, -3577708, -796716, -8905078, -4088272, -8165807, -2986076, -3624416, 66035, 850940, --5392332, 304406, -1278290, 84289, 2344515, -752693, -969589, -110595, -1471026, 339302, --735513, 693100, -893890, -1949915, -991064, -438624, -3365107, -233539, -129386, 779537, --184147, 494995, -159451, 161061, -1788854, -2267743, 260382, -260382, -1024350, 523449, --2614025, -10934987, 2757369, 63351, -3273839, -6012954, 2443837, -5749351, -1093606, 9795747, -14874009, 7293392, 8155069, -668404, -4189741, 6111202, 5473399, 2274185, 2901251, 7296613, --1131187, 5289789, 5141613, 7571491, 7268696, -6051072, 4857071, -447750, 1673964, -5643587, -1653562, -811212, 4952634, -2001455, -1463510, -4007205, 3590593, -6177237, -5013838, 425202, -5204427, 2799782, -3215320, -1713155, -1024887, -2166811, 3124589, -7424388, 6714108, -107374, -8364449, -12020540, 793495, -10835129, -3445638, -3507378, 2885144, -1205275, -2500745, 2280628, -840203, 2817499, 4597763, 7544110, -995359, -6212670, 1268626, 10192494, 2049773, -3063386, --801011, 6249715, -3391414, 3767760, -3277597, -11073499, 6301791, 6640020, 6197638, -5520644, --8191577, -5968394, 6860674, -835371, -1099512, 4791573, 1764158, 1109712, 799401, -442382, -1860258, 2448668, -889595, -1490891, 1396938, 50466, -520228, 762357, -1415192, 295279, -2181844, -1024350, 2294586, -1085553, -1764158, 712965, -85899, -98247, 1146219, 792421, -1165010, 826781, 828392, -180389, 1124745, -838056, -16366510, 290447, -3617973, 1519345, --9159555, 1131187, 1529545, 12173011, -9716290, 133681, -13038984, 2985002, -7872675, -1912871, -496069, -4265440, 3790846, 1680406, -6818261, 135828, -86973, 6329171, -4114042, 10189810, --106300, -8816494, -4486630, 10842645, -1024350, 4345433, 2902324, -1781338, 6497749, -7163469, --6766184, -5272609, 761283, -6861211, 7320235, -4015795, 4704063, -6644315, -55835, -8074539, -5330592, 715112, 6381248, 5684926, -5358509, 10685342, 9134322, 8603893, 1727114, 9033390, -7448010, -7661148, 6605660, 3143916, 634581, -7113003, 3308199, -6053757, 6033356, -2602750, --4745939, -581431, 8988293, 3187403, -10280541, 9830643, -779000, -3479461, -5860483, 10012106, -8696772, -7468412, 7422777, -538482, -8864812, 105764, -5022965, -2780455, 4929549, -4293894, -3530463, -363998, 1583769, -2060511, 2698850, -373662, -237297, -600759, -948651, 937914, -554588, -2497524, 926639, 1233729, 35970, 917512, 1126355, -2346126, 543850, -288837, -88584, -1980517, 740882, -817118, -1152125, -2633352, 3061775, 621160, -1387811, -416075, -846109, -320512, 23376434, 3971234, -935229, -8063264, -15147276, 3864934, -2233383, -22231824, -19500226, -9450539, -14110041, 2979634, -903017, 2626373, -913217, 3779034, 5622112, 73551, --360777, -11361799, -945967, -1079111, 13393856, -2448131, 346282, 4929549, -2352568, -1650341, --5452998, 11438035, -8584566, 8264591, -2041720, -6854768, 1280974, -7663296, -3897683, -12445741, -2189897, 5712844, -3367254, -6209986, -4916664, 7521562, -11667816, -2759517, -5755256, -163746, --1675037, 1517734, -10123238, 9858024, -13820131, -9449465, 3744675, 1667521, -527744, 3689377, --7170448, -10313290, 1274532, -2805688, -476741, 5061082, -6169184, 4588099, 3190087, 11374147, --3156801, 1630477, -882079, 162672, 15767362, 1320166, 15611132, -3772592, -5871221, 1778117, --8039105, -718333, 7974681, 639950, -9352828, -8182987, 2287070, -871878, 28454, 8013872, -616328, -1510755, 3322157, -460635, -331786, -3748970, 1378685, 1749662, -1891396, -55835, --934692, 3091303, -1409823, -631360, 1580011, 406948, 955630, -299037, 1762547, -588411, --1611, 940061, -1973001, 2431488, -1556926, 896574, 2036888, 1109175, 1923072, 525060, --17115982, -2209761, -3451543, -13877039, -23921894, 7427072, 12480638, -8741869, -4184372, 7077569, --2545305, 14967424, -1622961, -7934415, -4712116, -22289270, 7590818, 2563559, -1992865, -15643345, -3751654, -8680666, -2255395, -7614440, -3876208, 11193759, -10653666, 4659503, -15796353, 10190347, -2066953, 249108, -4524211, 1245541, -2022930, -8807367, -16633871, 3287261, 76236, 3622268, -7041599, -4002373, -1288490, -10678899, -5470178, -2822331, 4593468, 3125126, 7959648, 12683575, -9927280, 5134097, 7586523, 2343979, 7905424, 7121056, -6836514, 8149701, 9197672, -1826435, -12301323, -1222992, 14424111, -6305012, -15391015, -2469069, 9903658, 10896869, 12511777, -2349884, --21494700, -2109366, -1091459, 872952, -673773, -5242545, 3146601, -15665893, 12297028, 7778186, -7479149, -8174934, -7720741, -1657857, 4609574, -498216, -8643085, 135828, -4192962, -7014756, --2784750, -1111323, -3329137, 377420, -2805151, 1493038, -1728724, -917512, 2327872, 488553, -1092532, -1066763, -3052111, -3386582, 2466922, -2688113, -40265, -942208, 1539209, -1059246, --647466, -1047435, 3673808, 1979980, 1162862, -1060857, 22939958, -5050345, -5513665, 7649337, -12348031, -888521, 5743445, 14304389, 10328323, -23488640, -21589190, 176094, -2083059, 3165928, --9655623, -17134236, 4058744, 13738527, 9064528, -9944997, 16148540, 13059922, 12244415, -20583094, -5816997, 10800769, 541166, 1647657, 9177271, 21214990, -4114042, -9688372, 6418829, 4815195, --2905009, 11472395, 17098802, 3205656, 17714056, 7761006, -13326747, 1511292, 14685567, -1575716, --6056978, 7629473, 1210107, 2910914, 15412490, 9924596, 5229660, 1846836, -17939542, -18236432, --1548336, 2910914, 4745402, -5613523, -817654, -4698694, 1578937, 2298881, -6861211, 2612414, --4221953, -1040993, -5834713, 680752, 11378979, -6718403, -16501801, -2546379, -14039711, 3115462, --5027259, -335544, -1906429, 6647536, -2501282, 4822712, -86973, 4141959, 1917166, -1874216, --2259690, -2822867, -8153459, 2993592, 1035624, 2071785, 248571, -6251325, 3137474, -4881767, --4158602, -1396401, -5333276, -1082332, -1757715, -1944547, -1691143, 3491272, -1545115, 2341831, --233002, 1893007, 311385, 4500589, -1939715, 1249836, -3610994, -869194, -3098282, -2774012, --598611, -2032593, 6841883, 2936684, 249645, -907312, -972273, -38156488, -23741506, -7078106, -7122130, -2193118, -9407589, 1868311, -9165997, 26980448, -10713259, 17362942, 26623966, 14504641, -13189308, -10210211, 9522479, -4994510, -12141873, 10835666, 12620761, 8415988, 17969070, 244813, --801548, -7747584, -7948374, -6769406, -10993506, -10700374, -7311645, 4282083, 1610613, 27917, --6878927, -3686156, -10669236, 4617090, -9204115, -8337069, -3683471, 4638565, 39728, -5585605, --15585899, 2004676, -4552666, 5806259, -18402862, -14191109, 16295643, -2353105, -3058017, -7379291, --4525822, 12277164, 4011500, -2395518, 6732898, -1698123, 7001871, 5625871, 7978976, -5553393, --9266392, -23389318, 1697049, -22680648, -1488206, -19180788, -2726767, 18372796, -2247879, 3353296, --12965969, -5520644, -6665789, 1577327, -8310225, -4747013, 8273181, 10327786, -1010391, -924492, -1209033, -4548371, 1778117, -416612, -4530117, -1762547, -3871913, -1429150, -2183991, -10467372, -1886028, -1663226, -1334661, 764504, -2855617, -3316252, -7241852, -1593433, -4174708, -4918275, --904628, -6222871, -2913062, 1160178, -3937948, -4505421, 611496, -3748433, 1324997, 1618129, -4592931, -2640868, 3221762, 1627793, -4120484, -1452236, -963146, -1808181, 868657, -801548, --1170916, 26387742, 520228, -19105626, -16199543, 16553878, 12982612, -12230993, -11812234, 22193706, -14108431, 813896, -13166759, 1589675, -5532992, 10523207, -8167417, 1248225, -3455301, -2427194, -22956600, -3250217, -6238977, 4250407, 3916473, 6854231, 7101729, 771484, -9043054, 6846715, -3484292, 7845832, 17766132, 8114267, -25538412, -7329362, -4147865, -19580220, 7595113, -3415573, -421444, -10925323, 9239548, -4260608, 1786706, -14205067, 9643275, -11578158, 976031, 11355357, --1799591, 11978664, -9347996, 14945412, -19171660, 9556839, 249108, -6956237, 25153476, 6659884, --5189394, -15022722, 6554120, -3124052, 2105071, -2324651, 9230422, 13655849, 18509698, -11740830, -8345659, -4689568, 16564078, 5996311, 2409477, -1583232, 9953587, 1701881, -6510634, 7976291, --5662915, -9739375, -4133906, -13222594, 228707, -14807437, -1191853, -10007811, 11416023, -3685082, -7363185, -8035347, 364535, -4540854, 6956774, -2281165, -591095, -4504884, 2398202, -3406983, --5254893, -3172370, 2378875, -5246840, 3197603, -4183298, 1993402, -2752000, -2479270, -2753611, --5591511, -3426310, 224412, -4265440, -3676492, 5107790, 4631586, 2335389, -2543695, -6802692, --617402, 2756832, -147640, -5317170, -2988224, -521302, -38352984, -24823838, 20703890, -15126338, --14192183, 7992934, 18130668, -29774860, -4910758, 7146289, 1964948, -15524159, -23287312, 43855376, --18845242, 5995775, -21432424, 11883101, -7436736, 20531018, 18247168, 1886028, 3272228, -24286966, -13959, 11554536, -9814537, -14460618, 11580842, 3315178, 12483322, 9935333, -2017561, 4201552, --2689723, -1497333, 18387828, -15537581, -9113921, 14765024, -550293, -11715060, 15624017, -415001, --3369402, -10464151, -4591320, 5806259, -8164196, -877784, 5537824, -10380399, -10642929, -6899865, -7953206, -22601192, 10887205, -973347, 21619254, -20191716, 6803765, -15340013, 5755256, -9182640, --11729556, 19508278, -10674604, -4664872, -10389526, 8473434, -11893838, 7145752, -3999688, 14288282, -14649597, -1758252, -22660248, 9154723, 9527311, -1016297, -654446, -12902619, -8903467, -2079838, --11116449, -8917426, -3097745, -190589, -5498095, -7315940, 8526047, 2915209, -5210869, -4337380, --5326297, -5625871, 6219650, 2352568, 1551557, -8494908, -3207804, 7461432, -4221953, -5179731, -3528316, -3683471, 95563, 2775086, 4368519, -1668595, -7029788, 1509681, 4304094, -9390409, -288300, 2554432, 295279, -4902169, -2784750, 342524, -2185065, 19370840, 9450002, -21666500, -7482370, 23446226, -1988033, 115427, 10865730, -6933688, 16471736, 14894410, -19536732, -11973295, --3536369, 10413685, 18804978, 3376918, 10032507, 21181704, 15901580, -22180284, -2301029, 35364224, -8809515, -2308008, -4080756, -6602976, -10282689, 3156264, 8749385, 9685151, 9073118, -6277095, --14982993, 4093641, -7741142, 8320426, 24484534, -6445672, -24372866, 29336774, -8723615, -16109885, -23848880, -4248260, -6963753, -25378424, -4457639, 10534481, 5129265, -5492190, -10606422, 9844065, -1167157, -11746199, 10217727, -2336462, 23291608, -17024176, 2546916, -3307662, 26672284, 9065602, --37567544, 11841225, -15617575, -6595459, -13337484, 16328392, 54111756, 19732154, 3281892, 12503724, -15861314, -19887846, -8289287, -5586679, -11206107, -6861747, -12416214, 11890080, -27550604, -7335804, -2672007, 3325379, -8913668, 1736241, 5061082, -2702608, -3341485, 9439801, 1913945, 6305549, -5418101, -5674189, 1797981, 4671851, 1971927, 3908957, -2647847, 2403034, -5182415, 729608, --1424855, -5142150, -2506114, -1157494, 8665633, 480499, 2415382, 358093, -1528472, -1722819, -944356, -741956, -7591892, -934692, 1515587, -1847373, -5783711, -14068702, -4853850, -4255776, -8562017, -1425392, 1565516, -8256001, -28592134, -12182675, 1928977, -11627013, -35980552, 31149788, --6016176, 14023068, 2626909, -16516297, -28393492, -27364310, 30625264, 18635864, 7005629, -10842645, --20532628, -15395310, -24376624, -6292127, 9050570, -3824132, 1959579, 3848828, -4026532, -12651363, --12158516, -20736102, -7457674, -4015258, 10146860, 7064685, 11158325, -5589363, -9296994, -3922379, -14593762, 2041720, 12917114, -43314744, -10227928, -97711, 9463960, -13846975, -641024, -16021839, -12489228, 10984916, 2073396, 53414896, 811749, 16664473, 21959630, 913217, 7066832, 292595, --3886946, -6471442, 11046119, 16231218, 21242908, -520765, -4061429, 1418950, 13940927, 12663174, -409633, 10256919, 8853538, 6888054, -2893734, 20876226, -6083285, 26801670, -26589068, -13320841, --32692754, -10220412, 5787469, 731218, -8512088, 1688459, -166430, 14555644, -3020436, 17449378, --8072391, -6573448, -8864812, 4451734, 9784472, -1677185, -4842039, -5395016, 6017249, 2684, -20364050, -3328600, -1460826, 3568581, 5675263, 8319352, -7119445, -732829, 2680060, 4048544, --9805410, 3279208, 3661997, 12408161, -12449500, 6927246, 4670240, -5404143, 10574209, -6124087, --7337952, -88584, -2524367, 5310190, 2674691, -4513474, -183073, 4329864, 989453, 10760504, --561567, 6980396, 19997368, -4032974, 603443, 5050345, -28056336, 870805, 3695283, 17184164, -26374320, -22986128, 4738960, -14600741, 18718542, 16934520, 1896228, 32782948, 10034654, 12877386, --12340515, -2235531, -21395916, 32752346, -19487878, 4867272, 19942606, -5109938, -13283260, 9914932, --3250217, 4868346, 21434034, 264141, -7156490, -2298881, 3798899, -985158, -13150116, 9240085, --1500554, -3955128, 36795520, -28783260, 26548804, 17011292, 33198486, 13333189, -23921358, 18008798, -108985, 16712791, 43805984, -32087164, -13429289, -4392141, 598611, 29658896, -18030810, 1257352, --19342922, 1196685, 33527052, -4108136, 34803732, 9579388, 5744519, 15636365, -21664888, -3846143, -15165530, 21515102, -35694936, -1567663, -30617748, 13302587, -16038482, -827855, 6942815, 9588514, -511638, -11110544, -8847633, -33515778, -4016868, -23900420, 18897856, 1348620, -1729798, 14591615, -599685, -386010, 14078903, 10373957, 6964827, -135291, -5055714, 6439767, -11446625, -1151588, --7923141, 7379828, 7781944, -7094212, -1528472, -14727443, 6169184, -1212791, -234076, -712965, --14206678, -17181480, -5795522, 5132486, 12574054, 6179921, 5559299, -2362232, 10502806, 7124814, --678068, -5782100, 9116068, -13608604, -3933653, 2434173, 14827301, 12087112, 2495913, -5904507, --21328808, 6174553, -37430104, -32960652, 610959, 597000, -20898774, 17206712, 5057324, -5594732, --19390704, 26674968, -6074695, 39637180, -5663452, 8635032, 14355928, -19107772, -6323266, 6142877, --22828288, -12789876, -19956028, 17329656, -15973520, -4255239, -5193153, 15016816, -13460964, -22762252, --31823024, -837519, 26593364, 1678795, -14559402, -6141267, -18454400, -6120866, 213675, 11142219, --20798380, -2254858, -4494684, -14791330, -20446728, 1054415, 3468723, 13327820, 4583267, 22848690, -6353867, 28813862, -11955578, 23804320, -6019397, -18450106, -4806069, 38667592, -16641925, 17665200, --12195560, 28394028, -14957760, 9635222, 17984638, -990527, -7394860, 3511673, -10233296, 25833692, --23587424, -8808978, 25712896, -3078418, -21437256, 1101122, 19654308, 11011222, 19653234, -19747722, --16858820, -10620917, -2170569, 19468014, 23429046, -41373420, 2196339, 12103755, -22759032, 3857954, -14374182, 11293617, 10543608, 10404021, 6882148, -3066607, 754304, 8002598, 8821326, 7306813, -17709760, -5262946, 9305047, 4056597, 19167902, 11540040, -14821395, -18596134, 5944772, 20277614, --5755793, -5451387, -12858595, -21748104, 2498597, -18538152, -5891622, 4412005, -12456479, 11736535, -3292629, -3740917, -10295037, -1830193, -10672994, -719407, 5877126, 2945274, 1637993, -1705639, --2644089, -36128728, 38774964, -13493177, 32952600, -7407208, 26386132, 1818382, -8820252, -18771692, --13394929, -2856153, -23622, 19272592, -7927973, -1947231, 5230197, -18360986, 28537374, 10391673, -663036, -24259050, 15936476, 8186745, -19427748, 18182208, 1213865, -3336653, 4285841, -986232, -24036784, -6005438, -31130996, 32798518, -17526688, -3102577, 24282672, -11302743, -5799280, -15159624, -38562364, -17869212, -5218922, -24780350, -5138929, 2565706, 34430068, -16722992, 6152004, 10684268, -20308752, -5858873, -22499186, 23665270, 14207215, 19134080, -9942849, -5097053, 2066416, 21241834, --12410308, -25817586, -28747290, 14680735, -20252918, 4664872, 20788716, 19247360, -14246407, -5162014, -28120762, -45898168, -1476932, 5858336, 15331423, -2527588, -16998944, -3735548, 25613574, -5475547, -53013856, 20474646, -15672336, -2489471, 1181116, -6862821, -19733228, -24125906, -17739288, 14422500, --11622718, -5037460, -840740, 22858352, 9710384, -8509404, 9897752, 7079180, -701690, 2986613, -3944928, -726923, 2854006, 23409720, 19272592, 18539226, 12565464, 1374926, -12116640, 5885179, --9547175, 10983842, -14482630, 14886357, 22045530, 6994891, 28025198, 30152282, 12063489, -748398, -15714748, 5065377, -3282429, -10215043, 16356309, -4817880, -13706851, -649077, 7754564, -4294431, -6710350, 12661564, 4657892, -16997870, 13267154, -7965017, -9024800, -50678468, 16782584, 9417790, -44518948, 38933340, -6155225, -14898168, -46563888, 971200, 15152108, -20182588, 14797773, 26678726, -26025354, -12602508, 31398896, 27939836, 1066226, -17507360, -18607946, 28529320, 24475944, -35576824, --48210472, 63318556, 3061238, -4929549, 8132521, 4301947, 23420456, 23081692, -9667435, -8470749, -33001992, 15363098, -6138582, -22510998, 13205414, 2222646, 1617055, 11391864, 1496796, -1478543, --13407277, 6995965, -4111358, -16688095, 29690036, -47916264, 32982128, 27014270, -45065480, -3586298, -22814866, 5323612, 26052734, -6594386, 3588445, 23482196, -3237332, 11756936, -22239878, -35590784, -98782640, -40916544, -56910464, -12920872, 110034376, 47040092, -46969224, -11117523, 19403588, 12944495, --1034550, -28845538, 41366440, 22652194, 17346300, 3575024, -55889872, -9689983, 9090298, 16117939, --22948548, -38489348, 3359201, 11476689, 5264020, -18450642, -18947786, 8593156, 5132486, 13222594, --2516851, -5158256, -1339493, 14156212, 18734110, 12357695, -28078348, -11430519, 19913078, 14082124, --14105746, -497679, 16263431, 28195386, 11316702, -15729781, -20444044, -27409944, 12767864, -9162239, -11889543, -23266374, 12866648, 6029597, 14490683, -10974715, -5353140, -18803904, -7603166, 17390322, -3444027, -15527917, 8415452, 26571352, 1834488, -2347737, 8236674, -4297115, 7337415, -19539416, --12279311, 24871618, 43006580, 3105261, 71341016, -31465468, -11997454, 41420128, 2188823, -2230162, --21094732, -42324756, 35420596, -22000434, -23912230, 18416282, -26557394, 13378823, -25169046, -27953258, --4558571, 6265284, 4154307, -6493454, 33915748, 8573292, 20755966, 9996000, 764504, 640487, --15047418, -32280438, 10558103, 32415192, -26185878, 22668300, -26693222, -2697240, -1269700, -41507100, -29828010, -14325327, 11747809, 906775, -12027519, 797253, -29871498, 30993020, -21563420, 10408316, --34805340, -21215528, -45721536, 17432198, -21250424, -24095304, -19297288, -9982041, 261456, 48963700, -17731772, 24237038, -6453189, -22823994, -28701118, 7691213, 2015950, -49812492, -22962506, -87629144, --41020696, -33876016, -4846871, -40376452, -33024004, -7312182, 32327146, 36575940, -29508572, -37627672, --43013560, 21775484, 51991116, 2624762, 41865732, 1043677, 25389700, 10060424, 3303904, 12087112, -4727149, -1038308, -14748918, 21441014, 18029736, 9496710, -17667348, -7169911, -2120103, 9136469, -9953587, -3641596, 10783589, -4715874, -11775190, -21134998, 2903398, 29175712, 10832444, -3580392, -8545374, -9569724, 15982110, -5877126, 20804822, 19729470, 2640331, -21547850, 3849365, 4603131, -23554674, 5487358, 26734560, -17888002, -10583873, 24174224, 25593174, 6531572, -6282464, -4851166, --24688546, 17993228, -11470247, -49838800, 12098386, 18000208, -43118788, 24362666, 5085778, -12295418, -2886218, -11973832, -926639, 9646497, 12958990, 22520662, -25864294, 2851858, 30434138, -3043521, --14092861, 27425514, -11638288, 2209761, -15779710, -6205691, -31787052, 8671539, 1047972, 18429168, --12380243, 1659468, 22796076, -10344966, 631360, 23560044, -45356464, 3287798, -51962660, -16295643, --34726420, 28258200, 10141492, -1726040, 11981885, -9925133, 13046500, 35829692, 9808632, 55450176, --30459908, -34912716, 32728188, 9170292, -23577760, -22041236, -8883603, 20687246, -19315542, -421444, --16673600, -21514564, 13066901, 16378858, -32333588, -18604188, 28241020, -159451, 10121090, -5732171, -15579457, 7150584, 28499256, -16127602, -11993696, 7507603, 6742562, -7835631, -29323890, -21265994, --23156854, 31617402, -14322642, -23871966, 7233262, -5995775, -7767449, -15621333, 6227703, 7497403, --2451353, -4408784, -8482560, -14369350, -2376728, -2996814, -10532334, 732292, -5061619, -9753871, -6311992, -5617817, 5820755, -5538897, -4807142, 15108084, -5676336, 7318625, 5349382, -13732084, -6454799, 2198487, -5515275, -16726213, 23370528, 15579457, -6409702, 3930969, -11242614, -8344048, -7235410, 124554, -14492830, 5455146, -5711233, 13629542, -3408057, -2152852, 2713883, 6519761, -8381092, -33928096, -68576672, -34293168, -13076028, 29952566, 39062192, -74859672, 12891344, -29748554, --40581000, -8353175, 46842524, 29925722, 25537338, -16174310, -18064632, -21615496, 23625004, 16641388, -36460516, 4725538, -47383152, -18593988, 35606888, -5507759, 10442676, 31857384, -15253576, -22127672, --34655556, -34747360, 215822, 22571126, 48830020, 36111012, 23973970, 9766756, -49953156, -53273164, -18612778, -36773508, 8677981, 46838764, 18660022, 3122978, -23653996, -42508364, -7263864, -18355080, -14259828, 11025718, 7975218, 29329258, -4568772, -5757404, 7742216, 21263846, 34607772, 35764728, -12168179, 31839666, 10747619, 11387569, -7007776, -35820564, -14020384, -15582678, -29295436, 21986474, -20639466, 15253039, 15274514, -6892886, -35170952, 5742372, 10529112, -643171, 23439248, 14978162, -12297028, -2877628, 1631014, 3353833, 24140938, 24198920, 18474264, 5256503, -4424353, -17930952, --3274376, 10296110, 3058017, -5377836, -61740, -14273787, -6562173, -8306467, -9278740, 7235410, -26382374, 12830141, -4784057, -2774012, -19658602, -2153389, 6944425, 13178033, 14820322, -4787278, --6254546, -30813706, -17675938, -4577899, 272194, 12191265, 10321343, -6188511, -7329899, 4824322, -2022930, 3027415, 7627862, -8720931, -2981781, -1874753, 5102958, 8010114, 874026, -3031173, --2198487, -13007845, -5825587, 21246130, -60298656, -121356984, -62639952, 11775727, 47407848, 115528712, -113026360, 47100220, 48099876, 34542276, 1888175, -57513908, -97473744, -146879296, -43836048, -61434676, --10685342, 59969556, 106871136, 89865208, 79356504, 43751760, -963683, -27954332, -37512780, -8003135, --64978024, -51590072, -49019536, -32106492, -26359824, -12210055, -2287607, 22411676, 52709988, 54291072, -53351548, 39080444, 50827716, 26985280, 29081224, -9468255, -2100776, -23938538, -62933620, -91154776, --110159472, -53336516, -21460878, 17191680, -2813741, 11686606, 25649008, 33550138, 71507984, 82467128, -109258600, 69724496, 7063074, 31891742, -16476031, -60276108, -52747568, -104989936, -122523608, -91559040, --56610892, -24296630, -19173808, 44158168, 49837728, 138264128, 113198160, 82869248, 81096496, 38896836, --4933844, -54839216, -79366160, -57891328, -69492032, -95386928, -45322644, 2703145, -9317932, 2779918, -41749228, 58230628, 42998528, 22492744, 21738976, 37132676, 15833397, -2680597, -4431870, -18102214, --3052648, -16143171, -42760156, -22537840, -31886910, -51730196, -9114457, -8914741, 41417444, 37811280, -22722524, 40674952, 70277480, 50368156, -12336757, -8404714, -33891052, -30090004, -70749920, -73300600, --35496296, -14901926, 6094559, 24972550, 29474750, 44007844, 50051400, 48461728, 50813220, 13042205, --5191542, -26972394, -33055678, -43559020, -48322140, -48409652, -20918638, 10942503, 14495515, 21116744, -21966610, 15342697, 16250009, 17115982, 5413270, 4038880, -5794448, -6003291, 10212895, -6893960, --16899086, 960999, 3591667, -2177549, -5310190, -7254737, 11274, -2099702, -11901354, -5335423, -3399467, 752693, 692564, 6895033, 8669391, 6432788, 5888937, 5429376, 2017561, -860604, --650151, -1150514, -3672734, -3991635, -4283156, -3984656, -3019362, -1461363, -1915555, -720481, -561567, 1687922, 3562139, 2763275, 512175, 661425, 1385664, -231391, -2813204, -3082176, --1744294, 266288, 1528472, 2936147, 4476967, 4264366, 3550864, 2758443, 570694, -1788317, --3802120, -5407364, -6338298, -7009924, -6852084, -4414153, -1014686, 2203855, 5254893, 7446400, -8196945, 8385387, 6798397, 3476239, 151398, -3175055, -5397164, -6725382, -6990060, -5210869, --3149285, -1306744, 863825, 2181307, 2552284, 2306398, 1945620, 1531693, 1122060, 799938, -294205, 93416, 91805, 32212, -193810, -270046, -304406, -267362, -273267, -213675, --190589, -200253, -191663, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --4538707, --7080791, -5145908, 2013266, -771484, -12128451, -6881612, -520765, 1748589, -3726958, 1291711, --4499515, 894427, -3251290, 8531416, -6935299, -3031710, -3047816, 5442798, 3751654, 8687645, -2291365, 1818919, -3963718, 4108673, 522912, 1126355, -483184, 3301219, 4501663, 353798, -4486094, 4277788, -2073396, 2400887, -2535105, -2803540, 314069, -2287607, 1440425, -3599183, --6558952, 1788854, 2335925, -1606318, 1818919, -3109020, 2945811, 4042101, -6930467, 1373853, --389768, 2627446, 2218351, 386547, -6842420, -2026151, -3012920, 2290291, -91268, 711354, --2204929, 1290638, -3517578, 193810, 3790309, 2453500, 243739, -1918240, 1243930, -5563057, --3154117, -4079145, 727460, 734439, -366683, 5935645, 10201, 5178120, 55298, 576599, -460635, 13959, -2810519, 2124935, -191126, 1069447, -620623, 702227, 952946, -343061, --998580, -342524, -319438, -257698, -189515, -1458141, 229781, 1588601, 863825, 59593, -143345, -377957, -710817, 699006, -464393, -14031121, -466004, 717796, 178241, 2277943, --4967130, 3607773, 2017024, -2619393, -8371428, 5466957, 5609764, -1351304, 4663798, 3358128, --4650913, 9170292, 1892470, -4188667, 4919348, 329102, 4595078, 651761, -8034273, 3017215, --1542967, -2992519, -3134789, -2459943, 5220533, 4037806, 304943, 4225711, 1515587, -4049081, --5002027, -482647, -1187559, 2113124, 1431835, -3943854, 911070, 2009508, 1902671, -3471407, --2909840, -4590783, -1624035, -1167694, 892279, -1147293, 6099928, 2590402, -970663, -3133179, -1125818, 2517388, 1298691, 6560563, -1120450, 3288871, -412854, -2199560, -4025995, 2791729, --928250, -1889786, 3845070, -1226213, 1266479, -897111, -821413, -4482872, 956167, -1295470, -5210332, 6439230, -3916473, -3997004, -2804077, 1054415, -2518462, -1311576, -1632088, -1646583, --1760400, 999117, 2393371, -194347, 604517, 681289, -272194, 38118, -1161252, -2619393, --4123706, -9509594, -5674189, -2056216, 6857452, 892816, 1293859, 4199405, 1147293, 1814087, --9963250, -9154723, -5822365, -1526324, -19327, 4230543, -2978560, 3310883, -1694902, -6156299, -1940788, -900333, -4201015, -66572, 5930813, 8600672, 3916473, -3937411, 2326262, 275415, -6216965, -27917, -4916127, -168577, -2861522, 6096169, 2685428, 2859375, 6189585, -1066226, -471910, 8281771, 7257958, -271120, -12348, 570157, -436476, 2204929, 628676, -6031745, --7989176, -2824478, -994822, 28991, -2632815, -8923868, -926639, 2477659, -4840965, -2368138, --3145527, -2701535, 968515, 1148904, 2967823, -6218576, -4957466, 4803384, -2008434, -1082869, -1012539, -366683, 3151432, -5988795, 2397129, 2225867, -2358474, -2280091, 2415382, -2614561, -3837553, -1495186, 58519, 3221, -1480690, 760209, 2842732, 1571958, 341987, 1717450, -507880, -777389, -1515587, -840740, -864362, 353798, 454193, -253940, -202937, 424665, --115427, 12823162, -4811437, -3796214, -540629, 295816, -4685810, 120259, -3253975, 6206765, --1418950, -7504382, -10476499, -2635499, -6912213, 9820980, 874026, 6990596, 5909338, -9166534, --436476, 3952981, 2889439, 4986457, 998580, -521302, -753767, 2377265, -2977486, 3601330, -2035278, -3224447, 2126009, 221728, 2468533, 5370320, -2774012, 2175938, -250182, 3098282, -2694555, -1014686, 3680787, -948114, 3214246, -2318209, 2939368, -7416872, -3090766, -2665564, -2197413, 6541235, -4662187, -3075197, -1661616, 461172, -2079301, -2801929, -1424855, 2687039, -2219424, 3809636, -1146219, 2198487, -2108292, -2259690, -120259, -1332514, 2689187, 28991, --3811784, 2262911, -2183454, -3786551, -1329292, -2332167, 1794223, -2747169, -7521562, -1018981, --3192771, -3187403, 1757179, -2042794, -4484483, -874026, 1075889, -269509, 382789, 13959, --2775086, 150861, 1629403, -1031329, -1095754, 363998, 51540, 607738, 599685, 1552631, -546535, -1241782, 974958, -174483, -346819, -446677, -1175210, -1154809, -1200443, 2279017, -3459059, -1179505, 5185636, -7807714, 3675955, -4616553, -5103495, 7796977, 2985539, -8926553, -1074816, 182536, 2862596, -6389301, -4035122, -443992, -5142150, -9497783, -9180493, -6023692, --9161165, 4119948, -831076, 1535988, 5176510, -8041790, 5522254, -2183991, 2660732, 1783485, --688269, 966905, -1037235, -1052267, -5178657, -3067144, 7100118, -2443837, -5638755, -5201743, --371515, -2270427, 2314451, -4968204, -7730405, 1324997, 7470559, -995896, 4587025, -2415919, -2568391, -3817689, 3134253, 1338419, -5235565, 8031589, 1559073, -1552094, 1997697, 7392713, -6864432, 3643206, -571231, -8009577, -1222992, -6658810, 2097018, -1378148, 1276679, 1278827, -2035815, -6046240, 97711, -354335, 3119757, 6387153, -7718056, 1146756, -2154463, -7270306, --682900, 2246805, -601832, -84826, -555661, 2516314, 628676, -2048699, -1312649, -1459215, --787590, -2459406, 243739, -128312, 1583232, -2985002, -1996623, -154619, -251256, -302795, -301185, -158914, 653909, -1037772, -988379, -222801, -30602, -737124, -41339, -146566, -1531156, 1341104, 144418, 100932, -1250372, -2234994, -649614, 181999, -1923609, -1172526, --819802, -686121, -692564, -8863202, -8484171, -5458904, -9358734, -11124502, -10591926, 4708895, -5137318, -6764574, -1669669, -6110665, -10057203, 5621039, -2518462, -8715562, 3206730, -456340, -612033, 1046898, 3171297, 1132798, -159451, 2427730, 3227668, -4954245, -4738960, -1177358, --5813775, -282394, -6206765, -10878078, -716186, 6810745, -7819525, -5977521, 4481262, -4072166, -656593, 1832877, -3954591, -3179887, -3329674, -11737609, -4991289, 2683281, -3244311, -3803194, --7333120, 3471407, 6828461, -2287070, 10449119, -5575942, -2540473, 77846, -2338073, -8582955, --466541, 2115272, -140660, -1713692, -7453379, -1135482, 7629473, 3888019, 2354716, 3994857, -2922725, -1857573, 14457934, -4387309, -5407364, -5182952, -6197638, 2631741, 8281234, 5657009, -774705, -1217623, -3953518, -1367410, 30065, -1825898, 499827, -2485176, 1152125, 6058052, -4011500, -2834142, -467078, -967978, 2308008, -1144609, 2499134, -2388539, -1093069, 459562, -633508, -530428, 956167, -1347546, 1706176, 142808, 1378685, 1083406, 887448, -619549, --985158, -221191, -995896, -1271310, 15904264, 10783052, -620623, 9838696, -962610, 1341104, -1779190, -5559835, 8952322, -15569, 7881802, 7566122, -6340983, 9862319, 19327, -7715372, --12682502, 11347304, 5414880, 11273752, -9679783, 6431177, 3402688, -10611790, -10521596, -6250251, --3093450, 10864657, -10594074, 9147207, -1047435, -1141388, 6512244, 6180458, 8410083, 3045132, --4840965, 4079145, 7892540, -4986457, 7888781, 12135967, 5042292, 7323456, 2920578, 1993402, -1919314, 209917, -6835978, 2359548, 506269, 386547, 5445482, -4071092, 3178813, 3651796, --1801202, 10587094, -6442988, -3905199, -2590402, 9134322, -1856500, 7529078, 3676492, 5060545, -4445828, 804770, -13223667, -2112050, -10637560, -5764920, 13404056, 7004018, -6245956, -447750, --7657927, -6772627, -3672734, 11220602, 825707, 3813931, 2024003, -1842004, 2137283, 3976066, -6901476, -2074469, 3962107, 2916820, 2384781, -2499671, -1729261, 1060857, -1439351, -116501, -1753420, 2559264, 909996, 1078037, 2972654, 3031710, 973884, 44560, 1336272, -705448, -2495376, 4038343, 1763084, 76236, 4301947, 469762, -2141578, 1840930, -14089640, 8873939, -8522826, 25238302, 981937, 2165737, -1275605, -3488587, -1657321, 8516920, 7778723, 6754910, -9813463, 3950833, 15501611, 4503273, -6147709, 1444720, 13512504, 5296232, 1370095, 2055679, --6950868, -10046465, 6410239, -5018133, -9791989, -20797306, -326954, 8192650, -629750, 4803921, --7177964, -3868692, -2677912, 1480153, -2267206, -6291590, -3026341, -16779900, -4350265, -14257681, -1208496, -7556995, 5710159, -8222178, 3111167, -7910793, -2699924, -588947, 253403, 1107565, -1603633, -10458245, 5027796, -1668058, 2318209, -5522254, 168577, 8152922, 3354370, 11308112, -6426882, -3608846, -648003, -2479807, -1137093, -2808372, -3605625, -308701, 4724464, 2904472, -3522947, 2107218, -16305843, 10653666, 10631118, -4102768, 6108517, 4605279, -8593693, 4024921, -2638721, 410706, -1784559, 1369021, 5635534, -5048734, 3309809, -1524177, 341450, -521302, -1291711, 2845953, -2433099, -1259499, 4210679, -3077881, 277025, -9664, 1644436, -2061047, --3396246, 1981591, 212601, -1228361, -958315, 383326, -42413, 1835025, 2379949, 2426120, -123480, -2894271, 622233, 27145804, 9736154, -4624069, 13368086, -8908299, 9299678, 6161668, --12891344, 2657511, -16197395, 253940, -5555004, -11425150, 5995775, 131533, 4571456, 6582575, -8180839, 13179644, 5457293, -1014686, -3497177, -9096741, -16327855, 5696201, 6295349, 1695438, --5746130, 8713952, 1075352, 9211094, 5449777, -17023640, -6506339, 2214593, -12545599, 574452, --964220, -2437931, 3604015, 2687576, -3008625, 12433393, -7290707, 428423, 6941204, -6228240, -4746476, -2756295, -7648263, 5017596, -127775, -1045288, 7135552, 4701379, 202937, -3803194, -14842333, 602906, 8322036, 781684, -4705137, -5230197, -12556337, -4889284, 5158793, -391379, -4394289, -1474248, -9795210, 3831648, 3160559, -14332306, 4096325, 7306813, -3864934, 7798050, -1797444, -8157217, -8300025, 9309342, -238371, -18798534, 2300492, 1969779, 753767, -1955284, -1069447, -2623688, 435402, 5551245, -1749662, 850940, 1377074, 1607928, -4754529, 1381369, --1720134, 1258425, 3454228, 3645354, 2627446, 1239098, -3131031, 1367410, -302258, -321049, -1221918, -3496104, -73014, 2330557, 3216931, -2196339, -1344325, -4086125, 688269, 4213900, --4207458, 1668595, 1467268, -28348394, -9454297, 29496762, 8142721, 4657355, -4514011, -857383, --4609037, 5967320, -9622874, 12861816, 7327751, 5998459, 6160057, -4637491, -514859, -592169, -4089346, 8639327, -13156022, -7827041, -4249334, 9888088, 3523484, 5490579, 5901822, -1422171, --9453223, 3019899, 664109, 18001282, 14141180, 3680250, 10722386, 534187, -5273146, 2182380, --1563368, -2532420, 6885370, 8498130, 6969122, 17418776, 8369281, 6801618, 7603703, -7976828, --13053479, -6140193, 5846524, -11120744, -5548561, 10710038, 11401528, 6243809, -5262409, 10103911, --4071092, 1059246, 2357400, 5784247, -3059627, -6380174, 3555696, -5757404, -17980344, 733903, -5715528, -9804873, 1199907, -1802813, -2606508, -1829119, -5871221, 14527727, -1598265, 8287677, --20965346, -19907174, -16905528, -7712688, 1634235, 2006824, -628139, 1114544, -435939, -4473209, -2097018, -4913443, -1520418, -2172180, 5010616, 776315, 1758789, -3950296, -809601, -3519189, --1352378, 2739652, 4313221, 4697621, 4451197, -91268, -3129958, 2443300, 3908420, 2449742, -3889630, 1367410, -474594, 1657857, 475668, 798864, -1295470, -2753611, 3116536, 3569655, --1286880, -1051193, -899259, -620623, 14702747, 23036058, -33592548, -4643934, 2147484, -128312, --3906810, -8283382, 9373229, -10670309, -17022030, -1620813, 16893180, -2275796, -9658845, 3234110, --13567265, -7322383, 682900, 8919573, -14226542, 1716913, 15816217, 16205985, 557809, 5816460, -14192183, -7916699, -12412992, -17430052, 1842541, -17374754, -3595425, 7482370, 7068443, -15362561, --14463302, -8763344, 6433324, -3998078, -2585034, -3950833, 14099304, -20620674, -5920076, 3338800, --11035382, -3745212, 184147, -12970801, 753767, 5490042, -565325, 17257716, -1013612, -6838125, -1603633, -761283, -5483600, 3396246, 8588861, -7704098, 12185359, -5841693, -22255984, 1155346, --8594230, -4697084, -471373, -2296734, -29407642, -4862977, 13703093, 11800960, 8338679, 17743046, -18127984, -24224690, -2578054, 1665374, 5210332, -6971269, -11958263, -130997, 5646809, 6578816, -5696737, 4415227, 2215130, 3579318, -6342056, 130460, 4034585, -1952600, -1353452, 816044, -1410897, 3595425, -3727495, 805843, -1422171, 1732482, 2426657, -5101885, 891743, -442382, --3425237, 1609002, -679142, 770947, 300648, 0, -4369593, 2389613, 451508, 1287953, --2867965, -2166274, -1857573, -1904818, -32270236, 8995272, -6011344, 10983305, -10332618, -125628, -16866874, -5662915, 23968602, 5493263, 4616016, -10329396, 4533338, 11861626, -7322919, -1512902, -15506443, 9966472, 11674258, 1623498, -17919678, 11370926, -11565810, -1110786, -6966974, 1744831, --8896488, 5153424, -2308008, 5020280, 4829154, 8542153, 8717173, 9615895, -11418707, 2698313, -18298708, 3866008, -3253438, -3700651, -9146670, -7436736, -6442, 638876, 3323768, 15337865, -1363115, 8444443, 8260833, -616865, -3876208, -3779034, 13997835, -16335371, -3498788, -14461692, --11832635, -3379603, 150861, -24239184, 6343667, -7650411, 14875082, -3114388, 704375, 10238128, -2164127, 24798604, 20584704, 29546690, 11258183, 1207960, -3371549, -3051574, -4922033, -1503239, --5864778, -16345035, 11112154, 13456133, 6514929, -2258079, 1586454, -11528766, -15532212, 7199976, -2011118, 2106145, -4950487, -2204929, -5376226, -3005940, 4875325, 1536525, 6365679, -463320, -1473174, -3650722, 4464082, -12984760, -3341485, -506269, -446677, -2484102, 2345052, 540092, -905701, -945430, -3081102, -685047, -1241782, -916976, 4103841, 427886, 573378, -2709588, -938987, 597000, -131533, -5820218, -4121021, -4535486, -9561671, 12636331, -3831111, -2887292, -29624536, -6236293, -6636798, 32947230, -569083, 18701898, 13780403, 999117, 7690139, -4548371, -6010270, 5626944, 3545496, 4544613, 15179488, -10644540, 18312666, -10252624, -406411, 3656091, --2580739, -13466333, -12016782, -473520, -19449222, -6305549, -21237540, -1580548, -12652974, -9521942, --6969122, -6164352, 3064996, -17133162, 19652696, 2973191, -12910135, -9699647, -696858, -2609193, --3227668, 4980015, 2624762, 19284404, 2142115, -348966, -10003516, 1506460, 3936875, -857383, --10664404, -4713727, 12097849, 13153337, -871342, -11415486, 4532264, -2353642, 17243756, 19165754, --7619272, -5125507, -3647501, 2058900, -7494181, 7668664, -24099062, -2387465, 28307056, -25747256, --12705587, -6069326, 1759326, 2134062, 3307125, -2451890, 7521025, -4674535, -1360431, 13688061, --2258079, 9883257, -6861211, 9956808, -8915278, 6777459, 5552319, 13584445, -367220, -2455648, -5711233, 8895414, 720481, -2297808, -1502702, 783295, -4989142, -1631551, 4539244, 5959267, -1835562, -2112050, 5836324, -4760435, 4780836, 3927211, 4355634, 2308545, 78920, -7345468, -7167227, 4149475, 3273839, 1457068, 3338263, 6207839, 1378148, -5111011, 2401961, -4189204, --3205656, 5116917, -1357747, 4413079, 4846334, -2053531, -3617436, -3609383, 1999307, -17324288, --9508521, -2730526, 13357348, 16112570, 11028939, -10291279, -26385058, 45602888, 11445014, -28652800, --28760712, -4323422, 6921877, 19413790, -25028386, -4428648, 4631049, -376883, -3631395, 26131118, -5572183, -15362561, 8157217, 1067299, -773094, 13754633, -2551748, 7513509, -17081622, -5781563, -29903172, 11054709, 23571854, 7445863, 21306796, 3728032, -7884486, 15007689, 13637058, 21441014, -10515691, -24218246, -9227737, 5238250, 12472048, -9726490, 3646427, -9370545, -15705622, 1586990, --1857037, -9364102, 7237557, 10153303, 8761196, 6443525, 5990943, -4607963, 16158741, -117575, --16151225, -11679627, 14527190, 7916699, -25338696, 11013907, 4440460, 8148627, -22147536, -15085536, -14159433, 21971978, 12359305, -4910758, -23680840, 5372467, -1095217, 20178830, -6777996, -27064736, -11306501, 15836618, -6040335, 16483011, 13488882, 5617281, -10871099, 1457068, -191663, 3203509, -1137630, -692027, -5806259, -2375117, -7274601, -702227, -1475858, 3826279, -4461398, -2596308, --1529545, -3252901, -2064269, -1700807, -2062121, 8457864, 2481417, 163746, 8127152, -1963337, --7748658, -5106716, -4170950, -3259343, 316217, -5544266, 2323577, 3497714, 2852932, 2234457, --7435662, -2790118, 6181532, 5215701, -794032, 4033511, -884226, 10644003, 21030308, 7952669, -22215182, 3515431, 10053445, 7428683, 37172940, 50676320, 3726421, 9943923, -32666984, -10545755, -19346680, -16762184, 38293392, -7917236, 5817533, 10139881, 22317724, 12278775, -5640366, -16601659, --19435264, -6570226, -3417720, -24285356, -11660299, -9809168, 15160161, -9188546, 4326643, -15660525, -1785096, -6303938, -22767622, 23140746, 15946140, 18582712, 8018704, -11719892, -11389716, -26425860, -208843, -23842974, -7446400, -2252710, 2835215, 11836930, 9247601, -7907035, -5714454, 9762998, -21831318, 5692443, 8172786, 15891379, -20847234, 14323716, -11964705, -11046119, -21048024, -9347996, -9210020, 7778186, 1037235, 24025510, -5602785, -9256191, 3430068, 6099391, 33058900, -11223823, -13077639, 12917651, -32349694, -217433, 3712462, -7318625, -5018670, 10829223, -6657200, 689342, -13287555, 6766721, -20026896, -23933706, -23166516, -10958072, -8811662, 18817326, 16322486, -4811437, --7570417, 723165, 1807644, 12328167, -1723893, -4187056, 7495792, -1685238, -1608465, -3547643, -5342940, 7501161, -4417911, 7169911, 6674379, 6927782, 950798, -3264712, 6007049, -4602595, -3472481, 7829189, 278636, 4578435, 6128919, -11171210, -795106, 5105106, 5639829, 7801808, -624918, 6960532, 57982, 238371, -2790655, 3899830, 5719286, -21352430, 5792837, 32262184, --7211250, 5024575, -13913547, -3723200, -18668076, 15478525, -27014270, 1626719, -21687974, 4732517, -9777493, 3798899, -12847858, 45575508, -2837900, -5698885, 4439923, -25339234, 1809792, -16994648, -928250, 5274757, -4882304, -198642, 10970957, -9048422, 730144, 14078903, 1439351, 3863860, --21815212, 3224984, -1554778, -970126, -5292474, -27046482, -14971182, 7203197, 2554969, 12613245, --31512176, 3893925, -29309394, 15444702, -19894826, -31876710, 16661789, 30225832, 5434208, 15092515, --22017076, 22540526, -5184563, 3747359, -13393856, 18857054, 7704098, 19567872, 6288906, 23649164, --20719996, 4478577, 1443646, -3130494, -16373489, -13107703, -15375446, 18249316, -4456029, 24634322, --14731201, -11027865, 2976949, 3712462, -13151727, 7472706, -7627325, -30947386, 14090714, 21350282, -34866008, 12618077, 24805584, -13660143, 303869, -15461345, 26551488, 9400073, -4785131, -9936944, -12736189, -8442295, -2281165, 1887101, -7686381, -12830141, -8680129, -5780489, -5078799, -17258252, --7520488, -14282377, 11694659, -2247342, 7042673, 13946296, 3753802, -9509058, -747324, -9507984, --4124242, -14503031, -8138426, -15378130, -2586644, 26863410, 5563057, -1359894, 6100464, 8521752, --14957224, -6306086, -673236, -1354525, -6083285, 7350837, -2778844, -22499724, -1787780, -4619238, --16712255, -52698712, 6593312, -16765405, 48978196, -9096204, -24561844, 9909563, -1298691, -24491514, --4090420, 4184372, -14683956, 36981280, 5359583, 3625489, 16864726, -20664162, -31808528, -19602230, -45151380, -3516505, -9450539, 29828010, 16905528, -14121316, -13986024, -7882339, 35824860, 5070209, --8590471, -13901199, -6621229, -27829240, 18937048, -3192771, 7749195, 17994840, -6219650, -28831578, --3411278, 37297496, -1470489, -9244917, 18081812, -8114267, 22410066, 14665166, -1755031, -27486180, --13885092, -3739306, -25333328, -14916958, -14527727, 2026688, -3340411, 21535502, -14799920, -5164162, -82141, 55319716, 19405200, -9499931, 11383811, 6538014, -3054259, 28097676, 13859859, -10616085, -4614943, 22714472, 25872882, -15649250, -10945724, -37547676, -29917668, 17164836, -11020886, 18527416, --256087, -22081500, 5659693, -1753420, 7274064, -14698452, -10936060, 20779052, 5538897, 2743947, --1773822, -2445447, 14103599, -6644852, 7416872, -3555159, 8927626, 17441862, 4966056, -12652974, -2412698, -4882841, 9858024, 7824894, 2954938, 11333882, 18041010, -6985228, 14632417, -1424855, --18552112, -4942434, 995359, -10635413, 4663798, 13739064, 152471, -7034083, 1278827, -2636036, -18421652, 15361487, 2021856, 7238631, 9731322, 4781373, 12492986, -15475841, -10975789, 5451387, -3610994, -3342022, -839129, -2523293, -5751498, -5671505, -59665684, 20492900, -12767864, 31759672, -32293860, -18711026, 15251429, -31954556, -47979616, 1174137, -33742872, 4438312, -4220879, 26109106, --19382114, 18627810, 15987479, 26184804, -39866960, 4347044, -24399172, -22367116, 2421825, -28874528, --18619756, 26197154, -7647726, 9942312, 30600032, -6078453, 10077067, -25223270, 2901787, -27810986, -25773562, -23057532, -15301358, -17025250, 28747826, 23024246, -16502338, 31487478, 20863340, -6682969, -31263604, -1762547, -33080374, -9163313, -3900904, -25800406, 5804112, -54563264, 5469641, -13903883, --26179974, -21169894, 24373940, -14595373, 50538880, 37524592, -56516936, -16106, -1485522, 2669322, -26112864, -44410500, -30953830, 30469572, -25446608, -31831076, -36612984, 2421288, 75145824, 37306084, --34999688, -22077206, 3025268, 27300960, 10436234, -36634996, 5411659, -24497420, -14388140, -1362042, --4436701, 1343251, 24091008, 5633924, 14267881, 9411884, -28178206, 7481296, 12586402, -4059818, --10187662, 1398012, -24061480, 21279416, 7706245, 5742908, -31903018, 5207648, 16364899, 4520990, --7588671, -6077916, 14052059, -23363548, -1570347, -17464410, -9659381, 22618908, -24142012, -1140314, -14258218, -12239046, 11157251, 13484587, 3465502, 1860795, 9933186, 3079492, -12901008, 18486612, --14527190, -11521250, -6650220, -19979650, -6320581, -17973364, -17215840, 6936372, 28186260, -31224412, -15722265, -52467856, -7862475, -20404852, -17782238, 27810450, -35842040, -55927452, 32715302, 49251464, -11962558, -9517111, -44678396, 3056406, 17539572, 17523466, -7461432, -17907866, 2278480, -4409858, --5819144, 5711233, -6555194, -14999636, -29249264, 3723200, -17586818, 4376572, -15762530, -33386928, -20784958, 15277199, 25548612, 904091, 27628450, 15466714, 4189741, -8943733, -14064407, -22987202, --16363825, -9241696, 6570763, 15865609, -10587631, -5178657, -38012072, 35737884, 42378980, 23569170, --21518860, 22617298, -29403882, -441308, 6848862, -64404108, 5340255, 6442988, 30535606, -38409892, -49718540, 19549618, -35465692, -20085952, 15052250, -6129455, -25956098, -31865436, -34314640, -46848428, -34652868, -14681809, 5547487, -71670120, -28448252, 4539244, 897111, 16594680, -11325829, 3046206, -12363063, 13018583, -34179348, -7727183, 5688148, 19157164, 13906567, -2807298, -13063680, -5470178, --2743947, 17903572, 3129958, -10949482, -1216550, -8471286, -3234647, 16576963, 7633768, -7954280, -17629230, -17282948, -10117332, -12849468, 17044578, -6559489, 2147484, -7610682, 7517804, -24097988, -3720516, 10353019, 3958349, -4052839, -10492068, -8917963, -12298639, 12526809, 2765422, -3882114, --14103599, 14939507, 927176, 1306744, 2188823, -24512452, -12061879, -15955804, 2180770, -7946763, -185757, -305480, -5672041, -13698261, -4964446, -48968532, -6461779, 17964238, -22956600, -21367462, -20340428, 20637318, 4254165, -19288162, -66320200, -9660455, 13062069, 8020852, 28865938, -525597, -16806744, -4223027, -358093, -8247948, 1300301, 17693118, 2083596, 835371, 17126718, -4440460, --4077535, -22327388, -2033130, -3488050, -2481417, 3986267, 13652090, 18741090, -3633006, 134218, -14622216, -3173981, -28127204, -1800128, -24974162, 3774740, 3404299, -32613298, 23746874, -44986024, -10093173, 12565464, -19809462, -1245004, 58496916, -16416976, 19724638, -12202002, 10418517, -43676060, -4681515, 25816512, -739271, 22301618, -5212480, 2472291, -1493575, 28464896, -18279380, -21698712, -25027848, -23018340, -28726352, -190589, -45835356, 30701500, 25271050, -8977019, 9685151, 4409321, --392453, -38765300, -6542309, -2784750, 17029546, 6638946, -16574816, 15669651, -1271847, -19637664, --13624173, -12128988, 2462090, 2908767, -2892661, -227096, 12251394, -12068321, -3743601, 8808978, --13330505, -6842957, 9867150, -13207561, 647466, 12184822, 499827, -3078418, 4922033, -181462, -910533, 10698764, -4084514, -2860985, -8252780, 3790309, -5334350, -4467303, 4236449, 6054830, --11534135, 2179159, -10808285, 10498511, -12272332, 7036767, -476741, -1708860, 779000, -2166274, --1817845, -19864, 7777112, -23987930, -73078328, -34213708, -11205570, 24230594, 54320600, -49236432, -11104638, -14062260, -49634252, -6721624, 45150844, 12339441, 37249176, -30925376, 9575630, -10531797, -2485176, 22080964, 3997541, 12121471, -6751152, -63351840, 19178640, 3396782, -26688926, 28000502, -21489868, -18956376, 19893214, 2624225, -20390358, 6627135, -12470438, 40068824, 5220533, 16392816, -1110786, -40548788, -32353988, -10740639, -23882702, 26847840, 38522636, 39523364, 31940598, -10652593, -4764193, -31805844, -4480188, -2950643, -13143674, -16631187, 3091840, 3376381, -43731892, -12639552, --16874926, -937377, 20117090, -21425444, -4640712, 7899519, 414464, 22970558, -24782498, -756451, --28121836, -14709189, -20691542, 11868605, 7949985, 22938884, -2694555, -2100239, -26480084, -7798050, --12378633, -3128347, 11713986, 15781857, 32285806, -20228760, 6183679, -17497160, 6742562, 12199318, -3706557, -9525164, -3624953, -3194382, -3624416, -1213865, 8793946, 9095130, -2153389, -814970, --3900367, -6059125, 4465692, 9046812, 3358128, 1204738, 2756295, -7220914, -8301098, -7890392, -13771813, -163746, 9642202, 7866770, -909996, -10231686, -10834055, 1880659, 3506841, -8456791, --2400350, -7334731, 5953362, -5258651, 2281702, 1792612, 6211597, -2743410, -3054259, 1633698, -2497524, -4263829, 7110319, -2177549, 19105626, -30830348, -121703264, -64164664, 13172665, 51219632, -114591872, 87570624, 49325016, 16630650, 25727928, -8135205, -48189532, -93174480, -123993024, -31337156, --35940824, 1897839, 60385092, 86178520, 57752816, 77220288, 17756468, 16400333, -9041980, -39003136, --44241384, -35714264, -38022272, -46937552, -37701760, -16054588, -2447058, -521839, 30089468, 39140572, -74691088, 35370668, 11591043, 30744986, 47650516, 15270219, 9059160, -38408280, -52714280, -86009944, --39831528, -45074072, -32727650, -19371914, -15324443, 6454799, 10546292, 36277440, 74050072, 59708100, -65000036, 48262548, 58961848, 44014824, -35582192, -32464048, -82111720, -63447404, -46581604, -104387032, --80897320, -49344880, 3835406, 63433444, 60270740, 71427992, 89089968, 76366128, 40976672, 49604724, -1864016, -19270982, -52425980, -75872744, -76413912, -62860068, -37953016, -8052527, 10757819, 18524730, -21046950, 35385160, 25367150, 41372884, 25989920, 10437844, 6619082, -1466731, -4181688, -868120, --28667296, -19815906, -4160213, -13150653, -34224984, -9456444, -12373801, -12564390, -2500208, 25604984, -48035452, 40076876, 4064113, 39395588, 27524298, -5022965, -32482838, -51059644, -47750908, -21428128, --23732916, -14615237, -8351027, 13702556, 29678224, 41531796, 46878496, 34027416, 13070122, 14641544, --9213779, -25589952, -43557948, -38709468, -17411798, -1605244, -12922483, -4015258, 12237972, 15978889, -16116865, 15695421, 3747896, 6608344, 9700184, -1612223, -9331890, 394600, 2905009, -6543383, --7796440, -976031, 2539936, 2194728, -5126044, -2423972, 1670205, 823023, -4494684, -7101192, --5733245, 2141578, 367220, -326418, 4235375, 7963406, 5893769, 6070937, 4129611, 3320010, --449898, -2192581, -3786014, -5168993, -4513474, -1536525, -3647501, -3114925, -2700998, 2882460, -3309809, -974421, -1578937, 3125663, 1773285, -330176, -514322, -775778, -2226404, 1753957, -2387465, 1235340, 2127620, 4174708, 4228396, 3777961, 288300, -1224603, -2450816, -3696893, --7072201, -8356933, -7110319, -4737349, -3775276, -171799, 3756486, 6982543, 8635569, 9871445, -8543227, 6291054, 2726767, -198105, -3752728, -6447820, -7882339, -7201050, -7425462, -5027259, --2384244, -386547, 1818382, 4675072, 4961224, 4671851, 4155381, 3485903, 1632088, 64425, --1084479, -1148904, -1413044, -1456531, -1502702, -1081258, -809601, -424665, -227096, -66035, --11811, 140660, 194884, 243739, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --1551020, --2209224, -4245575, 2480881, 3969624, 7040525, 1901597, -4946192, -8794482, 1906966, -4108136, -347355, 2762201, 1071594, 7117835, -5888937, -1448478, -804233, -464930, -5056250, 3114925, -1314797, 651761, 132070, -2465311, -1902671, -1784559, -581431, 250182, 1185411, -1858110, -2705830, 6375342, -208843, 2834679, -4523675, -2618856, -5413270, -2604898, 5737003, 279173, --1178432, 1025960, 6085969, 661962, 3057480, -763967, -2866354, -890669, 3470871, -2982855, -5450851, 3367791, 6146635, 3045132, 383326, -1876901, -4088809, -2254858, -3555696, -540092, --2597382, 1031329, 219043, -1386738, 893353, -1190243, 2193118, -542777, -615791, 3118146, --318364, -214748, 406411, -3003256, 1362578, -2196339, -3561602, -2038499, -1571421, 1553704, --302258, -238908, -4039417, -661962, 1041530, 801548, -1610613, 159988, -1592359, 718333, -1122060, 853088, 308701, -269509, -654446, 196495, -1256278, -663572, 264141, 196495, -542777, 549756, 488016, 121870, 1145683, -12268574, -2776160, 5037997, 885837, 6866579, -3664144, -5645198, 1493038, -118648, 2251100, -2019172, -9420474, 5443871, 3335579, 6237367, -7793218, 6711960, 2353642, 94489, -9598715, -986769, 4410395, -4374424, -3796751, -10022306, --671626, -1674500, -1158567, -2549063, 1189169, -5981816, 2731062, -1046898, 2534031, 747861, --4022237, 3107409, 2592550, 6955700, -808528, -5567888, -2876018, 3016141, 1213328, -1392106, -289910, 2221035, 289910, -4068408, -37044, 858993, -432181, 259309, -2567854, -1125281, --3419868, -703301, 4212826, 1506460, -1438277, 1800128, -546535, -216359, 639950, -4886599, --448824, -242129, 2734284, 5291937, -1564442, -533650, -3413425, -2643552, 1351841, 6021544, --5328444, -834297, 1368484, -289373, -1446867, -92879, -1410897, 1960653, 2058363, 1087701, -3346317, -1591285, -1029182, -343061, 787053, -765578, 139050, 541703, 452582, -404264, --1431835, 1040993, -1426466, 6778532, 2537789, 2284923, -2285996, 170188, 628676, 641561, --11665131, -6311455, -538482, -2907693, -3617436, -187368, -3047279, -11868605, 7058779, 1618666, -3189550, -1255204, 2423972, -3142306, 139050, 419833, 6099928, -2179696, -1298691, -1028108, --1044751, -983548, -443992, 6616397, -1293859, -105227, -3783866, -217970, -1832877, 2145873, -1077500, -6423124, 4963909, -6501507, -136365, 5688684, -828392, 205622, 421444, -139050, --3992709, -2836289, 6526740, 3773666, -8117488, -4338991, 1268626, -4766877, -3466576, 3460670, --5846524, 1125281, 1398549, 3326989, 6950868, 5331128, 3251827, 2487323, -4760971, -4956393, --4252018, 1368484, 6045704, 2334315, -1054951, -2715493, 1971390, -2297271, -1014149, 1402844, --2263448, -3414499, -475131, 2721399, -512175, -2333778, 292058, 13422, 2642479, 1098975, -2440078, 550293, -1144609, -1165010, -942745, -492311, -328028, 780073, 1526324, 1826972, -1912871, 8913131, -2177012, -2272575, -2666101, 2516851, -2983392, 4360466, -8446053, -1078574, -6272800, 3285650, -6351183, 4706211, 7723425, 7289097, 4649839, 894964, -285615, -4760971, --6140193, 2609730, -586800, 6161668, -479426, 3686156, -3834332, -2550674, -2055679, 613107, -1966021, -346282, -7499550, 1585380, 2602750, 1890323, 3238405, 1987496, -4068408, -10023917, --3224984, 1470489, 1937030, 474057, -426812, 1904281, -4110284, -65498, -7467338, 3492882, --7704635, -2030983, -3265249, -5070746, 3703873, 1637456, 1571958, -4427575, -2151242, -1302449, --4439386, 420907, -374736, 2374580, -1901597, -3739306, -2852395, -8871792, 2820720, 1028645, -3813394, 5620502, 7179575, 2801929, -2826089, -4226785, -1993402, 3900367, 3892314, -4405026, -4806606, 204548, -3122978, 6928319, -1342177, 1562831, 1176821, 2032593, -122407, -1547799, -450435, 2153389, 774168, -340376, 2333241, -1221381, -955630, -1692217, 800475, 210453, --864899, 1275068, -1236414, -2229625, -935229, 1690070, -406948, -388695, 608812, 4382478, -4043712, -784368, 2841121, -8684961, 946503, -4186519, 385473, 1208496, -5479842, 1901597, -15779173, 1657321, -1464584, -8994735, 12690555, -103616, 5293547, 558883, -329102, -7007776, -6670084, 1652489, -3782793, 804233, 448287, -2843805, 2661269, 7019051, -2125472, 7468412, --2294050, 3150359, -179852, 4897874, 4361540, 4876936, -4832, -2778844, 3823058, -2924336, -3360812, -1057636, 3388729, 3272765, 3153580, -497679, -1046361, 1207423, -2847027, -4112431, --10363219, 6653441, -6721087, 4578435, 537408, 1880659, -1259499, -12372727, -2719251, -3400540, --6045167, 731755, 3668439, -7977902, -2554969, 3480534, 600759, 5501853, 9692131, -349503, --2695629, -2414845, -10190347, 3025268, 1904281, -2348810, 476205, 3940633, 4072166, 1111860, -997506, 2829310, 280784, -530965, 4292283, 2477123, -2443837, 4363687, 3198140, 4282083, -1287953, -827855, 261456, -368830, -345745, -1697586, 519691, -1064078, 962073, -1322850, -1985886, 647466, 146566, 1603097, 100932, -595927, 427886, -448287, -193810, -663572, -1979980, 1158031, 369367, 1362578, -502511, 2218351, 257161, 654446, -275952, 549756, --376883, -1408749, 541166, -4469451, -5405217, -499827, 2949032, -1711545, -2596308, -3929895, -1180579, 7228430, 3253438, 1162326, -16343961, -7483444, -2257542, 3378529, -1930588, 5567888, -18703508, 5841156, -6836514, 1097901, -8092792, -2597918, 5709622, -6429029, -1619203, 8366597, -2032593, -2051921, 1205812, 4748087, -2814277, 2321430, 2496987, 2484102, -4617090, 2157147, --2152316, -2610803, -6832219, -2626909, -3987877, -7589207, 3352759, 305480, -505196, 7746511, -5638755, 2019172, 6197101, 82678, -7824357, 6643778, -738198, -5319317, -4224101, -7743826, -361314, 9432285, 646929, -4081830, 3992709, -6937446, -4371203, 3668976, -5652177, -7473243, --3951370, -2318209, 4242891, -6594923, -2055142, -3039226, 8548059, 1290638, -2970507, 4253628, --2572686, -3058554, 477278, 6833293, -1282048, 511638, 3738232, 2209761, -8657580, -264677, -5260261, 2574296, 3058017, -636729, -1695438, 3947075, -2332704, 738734, -1917703, 1176821, -1433982, 2077154, -4407174, 99321, 428423, 1177895, 237834, 122943, 2018635, -307627, --425202, -1855426, 1471026, 2113661, 5730560, 4150012, -10581189, 10111964, -3759170, 966905, --4605816, 8666170, -1188632, -5775121, -18924162, -2491081, 9874130, 2475512, -14746770, 6777459, -23622, -2987687, -4706748, -3801583, -1427003, -8752070, -1450625, 7147900, 9287330, 11054172, -6718403, 10084046, -3258807, 7952132, 3843996, -15571941, -337155, 4105452, 5575942, 2746632, --5353140, 348966, -1094143, 5552856, -9329743, -3322694, 6986301, -2254321, 3940633, 2097018, --6206228, -6881612, -3548180, -10333154, -2926483, -3143916, 4287451, 1588601, -5976447, -1336272, --12793097, -3188476, 5259725, -3703873, -12642236, -147103, 7219303, -15326591, 4481799, 2599529, -4908611, -7245610, -3365107, -6884296, 558883, -2039036, -7825431, -2024003, -1298154, 4760435, -2683818, 11532524, 750009, 161598, 1852205, -832150, -5804649, 7304129, 2551211, -2952790, -6383932, 1192390, -3147137, 1086627, -182536, 3908420, 903554, 796180, 2426657, -2028298, -102005, -2181307, 8590, -1731409, 1784022, -688269, 779537, 2204392, 320512, -1347009, -2028835, 534723, 2157684, 608812, -612033, 812823, 209917, 2910914, -11826729, 2573222, -9378598, 12101607, 9004399, 9200357, 3519726, -6466610, 6425271, 11181410, -16678432, 8288750, -8281234, -17857400, -4728222, 4328254, 19149112, -1545115, -1278827, -4622996, -5439039, 23715198, -11723113, 3258807, 2913062, 12278775, -284542, -1920924, -4667556, 1796907, -10748693, -9694278, --2264522, 2942590, 7088844, 3200288, 1560684, -3686156, 628676, -7891466, 3201898, -11674258, -11330661, -1319629, -5741298, -6730214, -7694434, -11776800, 1963337, -11400991, -3884798, 7751879, --1876901, -3933653, -3805341, -1861332, -9780714, -6792491, -4445828, -4182761, -2286533, 3528853, -1924145, 549219, 448287, -8625368, 14706505, 8451959, 134755, -1128503, 19363860, -2384244, --3431679, -4811437, -9924596, -2738042, 6422587, 6209986, -1037772, 7565585, -15194521, 4432943, --5844914, 1410897, 5738077, -2063732, -215822, 910533, 412317, 1831267, -2462090, 2781528, -3535832, -3437585, 1315871, 1873143, 2273648, 6144488, -4736275, -457951, 562641, -148713, -1352915, 652835, 1415192, 1914482, -1784559, 1219234, -625455, 118112, -3411815, -747324, --882079, 2786360, -2900714, 21989696, 7572564, 4727686, 10721312, -11898133, -7123740, 6956774, -7391102, 16348256, 2444373, 4629975, -10849087, -527744, 5491653, -14244796, -4536559, 5866389, --4705674, 297427, 4014721, 10730976, -3515968, 4265440, 2255932, 2452426, 9143985, 8011188, -9738838, -7488276, -5009543, 10582263, -13202729, -4294431, -4330401, -775242, -3524558, -8371428, -8326868, -181999, -9091372, 547071, -3544959, -9428527, -11825656, -6499896, -7066295, 14161581, --4416300, -3463354, -8266739, -578747, -4180614, 2284923, 16624745, -2993592, -5363878, 2931315, --927713, 9669045, -11038603, 18884972, 3818763, -17955648, -13079249, 4873714, -12106439, 308701, --12966506, 169651, 2837363, -1556389, 14117558, 17738214, -8330089, 2247342, -3404835, -12934831, --4821101, -6994891, -8460012, -1848447, 6457484, -4318053, -9980430, 6751152, 484794, -5324149, --4542465, 2299955, 3770981, -1506997, -1003949, -5005785, 324270, -4613332, -902480, -2253247, -3341485, 3835406, 936303, -4578435, 544387, 417149, 3073586, 47782, -1119913, 368830, --5848672, -532039, -3280818, -2242510, 498216, 1444720, -3055869, 2522757, -1762547, -1569274, -4039417, -1480153, -3863860, -19381576, 7057168, 39479876, -7059316, -652298, -17563196, -7504382, -11592654, -1912871, 22565222, 13470091, 12440910, -112206, 9558450, -18823768, 16758962, 8580808, -619012, 2013266, -10980084, 4489315, -342524, 17069810, 9454834, 11305428, -4367445, 916439, -2823941, -11810086, -9542344, -4472135, 5121212, 19939922, -5765994, -7011534, -7039452, -4049081, -2440615, -13023415, -3898220, -1059783, -7035157, -13775571, -3043521, -17418776, -6432788, 9909563, --12140262, -5442798, -2533494, 749472, -19563040, -11904576, -2703145, -2240362, -3875134, 12014634, -5204964, 599685, 7204808, 12381854, -7923678, -3423626, -10743861, 4603131, -8485245, 6874095, -7968238, 9565429, 17602924, 4828080, -13542032, -2386928, 29615410, 9492951, 16579648, 7865696, -4922570, -1360431, 1874216, -7257958, -9168681, 3854733, 2809446, -9156870, 2221035, 6039798, -5494874, -8803072, 6566468, 2078764, 4688494, 5411659, -198105, 2502355, 4527970, 1714229, -5343476, -770410, 1031329, -1949915, -3875671, 583579, 4645544, 496606, -2249489, 7523709, -4786741, 3994320, 15569, -1159641, -1427540, -426812, 108985, -1488206, 2564632, 1894081, -1986959, 2124398, 1037235, -4359392, 20432770, 22394496, -22674742, 5512054, 16582869, 9996536, --6342593, -12089259, -10448045, 23333484, 1894081, 8750996, 12240120, -7028714, 3441343, 5084168, --14323716, -15254650, 12343736, 4149475, -22149146, -5163625, 28765544, 13741748, -65498, -16474421, -5379447, 4256850, 17494476, 5721434, -8534637, 11388106, 2026688, -4887136, -1661616, -3532611, --13647259, -6524592, 2097555, 2283312, -16287053, -17663054, -10399726, -5123359, -19339164, 11423539, --1195075, -13824426, 2638184, 246961, -5943698, -1746441, 4176319, -193274, 4398047, 4991289, -7824894, -7737384, -9050033, 11909944, 24358370, 10925323, 6678674, 17652852, -3291556, 9576703, -23684598, 14364518, 2270427, 2544768, -7347079, -14569603, 14115947, -13885092, 6246493, -5623186, -4357245, -18149994, 8714489, -341450, -5839008, -3512210, 10323491, -9840844, -4828080, -2633889, -1633698, -353798, 3112778, -3979824, -406948, -7070590, -1676111, -533113, 1366873, -2211908, -2498597, -2738042, 2183454, -2467996, 7970923, 2323041, -1914482, -3797288, 3091840, 186831, -2850248, 2326262, -1755031, 2078227, 3027952, -2091112, 897648, 3424163, -937914, 1110786, -4086662, 3981435, 7350300, -4584878, -21204254, 5995238, -10207527, -4686346, -7884486, -1298154, -18207440, 18042620, -36399848, 11308112, 11586211, -11278047, -18508088, -24123220, 4284767, -7059853, -4494147, -8393977, -6614787, -3883187, 22566296, 5750961, -1946694, -347355, -3576634, -6698539, -5717139, 3792993, -93416, 9088151, 1977296, -1865090, 3231963, 8254391, 23279260, 2385318, -2871723, -11453604, -4917738, -5397700, -5786395, -657667, -1936493, 7756174, 11133092, 576599, -12859669, -2938831, -2178085, -2586107, -1438277, -22506702, 25433722, 707596, 1794223, -1819456, --6623377, 6805913, -1755568, 10383083, 572304, -9820980, 2659122, 11007464, -7805566, 10228465, -2455648, -15496242, -2675765, -3265786, -28316182, -9598715, 7212324, 7374996, -11586211, -6580964, -6728603, 1009317, 18884434, -14996952, 6834904, 8516383, -1254667, 7459285, 6824703, 8446590, -3188476, 3804804, 3347927, 2855080, -1297617, -1460289, -4924717, 2032593, 7024956, 1344862, --5230197, -1929514, -2976412, 1765232, -2320893, -1830730, -3505230, 4670240, 2542084, 3216394, -278099, -8137890, 3230352, -8270497, 580357, 1438814, 2888903, -3867618, -1982664, -1136556, -2640331, 5118528, 2193655, 2221572, 628139, 2327872, -5692979, 18739480, 5530308, 5904507, --13409962, 10324028, -5258651, 9846213, -7410966, 12643847, -11165304, -9066676, 17302276, 2316598, -4554276, -10019622, -22647900, -2005213, 6841346, 1951526, 9963787, -7974144, 1437203, 63888, --16869020, -12108587, 5811628, -19071802, -12439836, 6311455, 251792, -19950124, -2707440, -9854802, -12996034, 7865159, 2484639, -4520990, -12435541, -26617522, 9617506, -11829951, 14832133, -4254702, --4731444, -2312840, -6940131, 4247723, 4007205, -21242908, -9284646, 21250424, 18601504, -18868866, -24904904, 1451162, 18381924, -4193499, -4209068, -2123861, -7027640, 9641128, -6924024, -19801410, --10449119, 23913842, -5157182, -4595078, -1169842, 7532836, 4866198, 12173011, -27117350, 8230768, -18721226, 14817637, -5826123, -1342714, -5733782, -12158516, 1538672, 11523934, 17736604, -10613938, --10805601, -12196097, -1123134, -1828046, 1287953, -5746130, 3211025, 3297998, -1967632, -667867, --2529199, -5208185, 5406290, 321049, 924492, -8008504, -6798933, -1631551, -8854075, -3278671, --4383014, 1220845, -3070902, 231928, 7025493, -2578054, 2994666, 128849, -6338298, 1490354, --3143916, -610422, 2883534, 6293738, 963683, 2776160, 5769752, 5867999, 7573638, -2131378, --1929514, -1114544, 7761006, -941672, -12277164, -450972, -9428527, 12812961, 9947681, -9658308, --16456704, -13810467, -8101382, -16007343, -875636, 7579544, 17592722, -3042448, -820876, -29420526, -17640504, 21940304, -3459059, -11936251, -12102144, -7519414, 33051920, -20122996, -47782, -2384781, -8939438, -1492501, 38075960, 913754, -20683488, -5467494, -19654308, 25670482, 22363358, -18045842, -21039434, 5243618, 16943110, 6305549, -31735514, 9940702, 17024714, -22026202, -6075231, -24990804, --12446278, 838592, -22968948, -19652160, -529892, -15928960, -192737, 5560372, -5661304, -15802795, -12981002, 11707007, -25934624, -19881940, 10887742, 4544076, 7010461, 13128641, 17234630, -6367289, --9302362, -573915, -6017249, -369367, -1894618, -8753680, 3493956, -36092220, 12319577, 17489644, --18558016, -15367930, 11665131, -11780022, -10595684, -5119601, 6545530, 869194, 22411140, 122943, -13111461, -1335198, -9070434, 4802847, 6791417, 6949257, -5835787, 98784, 769873, -877247, --3728569, -8982387, 5942624, 9339943, -4763119, -15769509, 4054986, 1290101, 16703128, -1662152, --6453189, 5077188, 1911797, 8253854, 51003, -5149666, 184684, 6715182, 5122822, 1617055, --1726040, 1204738, -3033321, -2687039, -7753490, 3836480, 3807489, -5433134, 2650532, 2270427, -1500554, -996969, -2564632, 588411, -7430831, -5622649, 158914, 7973607, 19931332, 37561636, -59353764, 1653562, -24172612, -31091806, -7395934, 1087701, -7523172, 28744606, 21522618, 14840723, -24967182, 18128520, 14630806, 850404, 11760694, -15610596, 21607444, 25007448, 1564442, 26023206, --10919417, 2002529, 5927592, -24555938, -16553878, -5931350, -14661408, -17253958, -2675765, 26752278, --503048, -5328981, 3213173, 5609764, -3781719, -36601176, -5131949, 9403294, -5515812, -11306501, -4366371, 13970992, 24903830, 6045704, 12631499, 17591650, 21698712, -30274150, -21038360, 11732777, --8891119, 38230576, -4106526, 32855962, -26715234, 15612743, 26762478, 903017, 4260071, 16011101, --29186988, -13626857, 657667, 16497506, 372052, 19007914, 7660611, 7080791, 19391778, 6930467, --2670933, -8308078, -23105850, -5428302, 1256278, 6011881, 386010, 410706, 439697, -12644921, -6459631, 4292820, 10808822, -3833795, 8116415, 13290239, 7885560, 3300146, -104153, -1683090, -2764348, -4712116, 2685428, -4506495, 83215, 2674154, 2676838, -3993246, 5961952, 5743445, -7267622, 741419, 541166, 2982318, -2659659, 4908611, -3752728, 4959614, 11518565, -1476932, --2245731, 813359, 10018011, -6248104, 2342905, -1271310, -1510218, -1976759, 1362578, 2702608, -4507568, 3368328, 3439195, 9243306, -6562173, 10981695, -5387500, -12763032, 3711926, 42625404, -14179298, 14972256, 31066036, -2276333, 6567542, 13543642, 19942606, -22196928, -17850420, -7551090, --19581830, -3397856, -26301306, 13538274, 20915954, 15353971, 20766704, -13981192, -7845295, 16142098, -12436615, -8734353, 21047488, 12753369, -4927401, -25759604, 14277008, 15785615, -13214541, -1887101, -7454453, 3794067, -20914880, 24075976, 6323803, 25843356, 13970992, 10177999, -14094472, 12104828, --7534447, 39359080, -31040802, 3480534, 11754252, -5782637, -20079508, 12848395, 12404402, -2355253, -12200391, -11871826, 31915902, -14737107, 8330626, 7073275, -20447266, -8710731, -28193240, 12053289, -8101382, -20770462, 19375134, 16795470, -14579803, 12081743, -1686312, 32614372, 10484015, -16128139, --12051141, -11507828, 10093710, -6649683, 8581882, -4021700, 1777043, 11011222, 6727530, 5560909, --10845329, 28065464, 2942590, -10704132, -16038482, 13627931, 6558415, 12872017, -7442642, 3861713, -9951439, 21209622, 5193689, -3346317, 17380122, -4612795, -5263483, -2361158, 1540283, 4864051, --10674604, -9077413, 3803194, -7829726, -5042292, 1119913, -4022237, -981937, -1559610, -7679402, -5233955, 3256659, -15313706, 3751117, -11507291, -6907918, -3819837, 5657546, 2725157, 10512469, -4315369, -196495, 2705830, 3938485, 4185983, 517007, 993748, 2505577, 8582955, -2763812, --1557463, -38234872, 16403017, -32672890, 32918240, 39659192, -2594697, 6596533, -33058900, -702227, --7750269, 2931315, 18468896, 19010062, -6226629, 9679246, 15267535, 2126546, 6126234, 4182761, -6038724, -4482335, 22473416, -3557307, 4725538, -13154411, 25350508, 5261872, -2913599, -1177895, -22767622, 8589398, 10493679, 25400974, -6214281, -16189342, 31088048, -33844344, -14968498, -6102075, -6967511, 21938156, 4698694, -9392020, -9846213, -16461536, -796180, -3204046, 5998459, 35372812, -34161096, 21764210, 30779884, -3063386, 46573016, -15915001, 12680891, -11349988, 694174, 14617921, --7655779, 1583232, -14524506, -18349174, -96637, -11570642, 9206799, -15662135, 22817550, -17566954, --28535226, -11729019, -7627325, -2623688, 33441690, -20509006, -5126581, -2948495, -21667036, -5413807, -11956652, 26572426, -2769717, -1187022, 601295, -8745627, -18697066, 732292, -1233729, -2782065, --2340757, 12348, -11000485, 8515846, -9488120, 10525354, -4626754, -8011188, -9298604, 2222646, -7877507, -5821292, -8044474, -2603287, 6437619, 7745437, -6033892, 3690988, 4121021, 2835215, -4100083, -4271882, -4471598, 2270427, -64961, 4964446, -6481106, 4392141, 7141994, -176631, --3070365, -3782256, 6168110, -13471165, -7017440, 13700946, -8749385, -733903, -2748242, 2847563, --9000104, 6330782, -3299609, 12369506, 10722923, 167504, -13350369, 58546308, 81283864, 24924232, -63361504, -13878650, -44084080, -30889404, -21603148, 10691247, 11642583, -14693620, -23684060, 20514374, -27575838, 16120623, 27511950, 21232708, 5229660, 8450348, 4146254, -1373853, -18122078, 7998303, --21472688, 15131170, 125091, -20076824, 23271744, 14095009, 11125039, 40230420, 24704116, -11519102, --7779797, -14462765, -17176112, -20997558, -8309151, 848256, -16638166, -5138929, 34727496, 52724480, -38807176, 5339718, 26480620, 28291486, 43193412, 19819664, -22915262, -37562172, -23464480, -23952496, -14181982, 11966853, -51412368, -35205848, -9089225, 21720724, 46760920, -34976604, -1396401, -30346628, --3958349, 38296076, -21052320, 14473503, -30534534, -4909148, -9126806, 25859462, -28618440, -16229071, -464393, 11469173, -23230942, 53437448, -12562779, -743029, 30337502, -13231184, 22810034, -7170985, --18832894, -14536854, 8868034, 983548, 7563975, 4845797, -16807818, 582505, -7090454, 20557324, -11971684, 3735548, 11176579, 12865575, 721555, -24696, -4030827, -12599287, 26066156, -7909183, -5480379, 362388, -15075335, 766115, 1677722, -4603668, -9897752, -1988570, -5797132, 1615445, -3910031, -4244502, 919123, 17945448, 12713640, -2090575, -2809982, 17027934, -6996502, -1919850, --14156212, -20248624, -7619809, -5183489, -2153926, -5493263, -22952306, -44629544, 5543192, 24983824, --20621212, 38662220, -15307800, 15425912, -5060545, -44480828, -22752052, -2069637, -26147760, -60079076, --16802986, 21801254, 33458332, -16203301, -25689810, -53601728, -15891379, 15940771, -10604811, -15470472, --26610006, 6425271, -5956046, -4431870, -4939750, 10940355, 21640730, -16691317, 16747151, 14305462, --16884054, -48914308, 4083440, 4060892, 12731357, 6004901, 32145146, 3332358, -48633524, 417686, --53565760, -151398, 18712098, 22558778, -4073240, 3072512, 25020868, -12943958, -9411347, -16707423, -16229071, 11841225, -7635915, 19335406, -5909875, 8195335, 9050033, 31585190, 4291746, -11090142, --33620468, -11526618, 17588428, 15270219, 26866094, 39090108, 67614600, 33693480, 16339666, -17510044, --67699424, -18512382, -9690520, 51909512, -8613557, 3292629, -125628, -16296717, 2323041, 15258408, -7353521, -304943, 839129, 332323, 190052, 25189446, -8981313, -7442642, -8246337, 17484274, -6774237, 8865886, -6762426, -21398600, 7166690, 9106941, -9663140, -1404454, 5556614, -1198833, -1766842, -3775276, -30728880, -10082973, -2368675, 14174466, 22291954, 2664490, -18336826, -17974976, -8350490, 3016678, -1575179, -3030636, 1141924, -1891933, -780073, 16494822, -17983564, 2320893, --15430207, 16496969, -8908299, 369904, -22265648, -3500935, 15278272, -4699768, 8325257, -12875775, -6524592, -6766721, 10585484, -10336376, 3622268, -43694312, -13301514, 30392800, -14965814, -12551505, --3236795, -9801115, -35033512, -38947836, -56984016, -17984638, 108985, -4405026, 37298032, 10270341, -48715668, 30066382, 15082315, -6795712, -18009872, -3345780, 68314136, 4254702, 19681688, 11113228, --8591008, 34056944, -14219563, 27494234, -30023968, -2964601, -21644488, 25879326, -36455684, -7652558, -11106785, 11496017, 11663521, -31814970, 22625888, -36415952, 7368554, -17825188, -12265890, 36298916, -2103997, 2418067, 12439836, -13729937, -857383, 9517111, -44278964, 1234266, 10148471, -6391985, -28436442, -12706124, -5633387, 47974784, -18219252, -39830452, 35970, -15012521, 3156801, -2968359, --2172717, -31955094, 17033304, -5158256, -43739948, 26334592, -54157392, 10557030, -12487081, -21351356, --34275988, -4347044, 9147207, 15784542, 1290101, 12794708, 15657840, -18597746, 32824824, -7556458, -8681740, -373125, 15592879, -649077, -1914482, -5285494, 9153649, -19615652, -2693481, 6514392, -4100083, -7580081, -294205, -8492224, -11576547, 5945309, 4483409, 8745627, 5360119, -2408940, -6491843, 19669340, -9903121, -10111427, 3195456, -873489, 3603478, 14613626, -2320356, 8004209, -7148436, 7594576, -10130754, -11739219, -3202972, -861678, -12684649, -615791, -2757369, 5337034, --13855028, 4152160, -6316287, -18211736, -66019552, -67869072, -57827976, -28811714, 121719912, 38592964, --14414984, -15098421, -59186796, -126135136, -13606456, 34724812, 43202004, 18913426, -18838264, -13971529, --36706400, -40537512, 31615254, -29038810, 76972792, 57817240, -88354456, 29372744, 12336757, -18079128, -7558069, 64468532, 9785009, 44642428, 88111792, -18503256, -71200896, 3904125, -11621645, -66418984, --17630840, 32865090, -2321967, 40329208, 64939368, 6256157, -55132348, -108657304, -93103616, -83282104, --8181913, 81680080, 23767812, 22153978, 12833362, -21584358, -108793136, -67981280, -34421480, -12866648, -7345468, 25201794, 24659018, 31329638, 32268090, 39784820, -46500536, -16515223, -37956236, -2822331, --41571524, 26718454, 26898306, 54240068, 60403884, 28984050, 1585380, -15480136, -10340671, -73189464, --57916024, 51911124, 81225344, 55280524, 65054796, -15043660, -28013924, -57836568, -32435594, 17637820, -884226, 4405563, 18850612, 6493454, 5335960, -13707388, -17958332, -8858907, -13367549, 931471, -14988362, 4436701, 6304475, -2834679, 9091909, -15002858, 11142219, -4197794, -13493177, -13643500, --3416110, -22959822, -6352794, -13879187, 15664283, 17131550, 8950175, 6880001, -14359149, -30822832, --30037390, 8628052, -2017561, 14460618, 13261785, 6999723, -21617108, -11052561, -20527796, -32662152, -10863046, 20321638, 8810052, 1084479, 23236846, -8564702, -121478856, -136009808, -92463128, -95071784, --25318832, 106888848, 71987944, 115320944, 128342216, 194982928, 129461592, 134080288, 86467352, -6446209, --96225520, -166293088, -196590320, -170504832, -134602672, -97228936, -23539106, -4771172, -14062797, 5133023, -42340860, 69911328, 96726960, 84296784, 114632144, 110943304, 143096496, 131110320, 36754184, 88077968, --19095962, 24250996, 17674864, 5193153, -12201465, -127351152, -153203632, -195563280, -229735120, -208578640, --116133768, -102908488, -84935664, -106050792, -123098056, -26108032, 30003030, 77491408, 113074144, 164089232, -195616976, 251539056, 331466240, 322256224, 244416928, 198680352, 164984192, 87617872, 138521824, -55948392, --113233592, -270337600, -310058528, -384979936, -370304576, -338228128, -320975776, -309581248, -191002560, -117922088, --64536180, 173354544, 176082928, 269805024, 345939744, 300434560, 270885728, 274561696, 215232080, 164620720, -90018216, 12222403, -1600412, -50475528, -62078920, -89314920, -116449984, -159233760, -172790288, -156720672, --181334064, -139595568, -128784056, -120947352, -106844824, -54617488, -11215233, 57024816, 116462872, 109955992, -170410336, 189064992, 207725552, 245982448, 198327632, 116371600, 57514444, -34862248, -90875064, -90157272, --175452640, -161788736, -222478768, -176447456, -184501056, -117841016, -124088584, -71914392, -9755481, 62812288, -93288304, 165746544, 191935648, 187154816, 180894896, 177157200, 135281264, 48853104, -31757526, -44409424, --59139552, -64231236, -74052752, -86395952, -81425600, -59232968, -65551940, -58145804, -51692080, -36058396, --17180942, -10616622, -9047885, 3011309, 10104984, 7806103, 9222369, 26364656, 32622960, 35412004, -31867584, 24916716, 25358560, 39643084, 27535036, 23075786, 21747030, 20582020, 8086350, -1201517, --11122892, -7786239, -10921028, -13195750, -19601156, -15087146, -13738527, -15794205, -21553220, -15860240, --14785425, -16709033, -17986786, -9490267, -7452842, -3631395, -2892661, 1125281, 7455527, 13902272, -11474542, 10853919, 10727755, 13270912, 10580115, 7481833, 4056597, 6192269, 4230006, 3400540, -1859721, 1094143, -2631741, -915365, 2554432, 3977677, 1229434, 790811, -453656, 1171989, --922881, -4952098, -7539278, -6331856, -7327751, -7242389, -7329362, -5734855, -5889474, -4484483, --2426120, 54761, 214748, 1267552, 653909, 1577864, 1887638, 2950106, 3305514, 4301410, -4082903, 4379793, 3459596, 3042984, 1957968, 1447941, 607738, 249645, -272730, -357019, --622233, -659278, -707596, -646393, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ -13325673, -1492501, -5924371, 1986422, -3758633, 944893, -2459943, -1562831, -3277597, 2268280, 3934190, -1120450, 1202054, -7319698, 1398549, 99858, 2235531, 2755222, 1493575, 4161823, -917512, --2368675, 408559, 4980552, -2147, -3859028, -419296, 4237522, 2282238, 436476, 8053, -1177358, -141734, 304406, 791885, -155693, -1554778, -199716, 4832, 1654636, -2528125, --5887864, 4299799, 4308926, 3749507, 3525095, -214748, 1916092, 3351148, -3576097, -832687, --108985, -4767414, 1054951, 317291, 4272956, 415001, 2389613, 43487, 5377836, 2709051, --802622, 3759707, 2278480, -1257352, -4415764, 1074279, 1137093, -1190780, 318364, -2528662, --665720, 2225330, 1559073, 1844689, 4436165, -764504, -1411434, 580894, 2634963, 6077916, --3598109, 1602023, 1641751, 1753420, -192200, -435402, 1877975, -1077500, 43487, 869731, --1156957, -223338, 165893, 295279, -756988, -1156957, 706522, -301185, 134218, -438624, -1110249, -165356, 1322313, -340913, 1176284, -52076, 1112397, 11312944, -7581154, 2542621, -6362457, 1480153, 4480188, 5431523, -4958003, 1029182, -464930, 2108292, -6283537, -4985920, --942208, 4867272, 6593312, -2541010, -2203318, 3160559, -5381057, -7182796, -1341104, -8445516, -2872796, 2793339, 746787, -5249524, -5352603, 1890323, -3124052, 715112, -177704, 5555004, -5849746, 5296232, -883690, 3710315, -5831492, 2523293, -3448859, -319438, 283468, 4533875, --4924180, -4355097, 6442, 5965710, 2433099, 2328946, -3643743, 2019708, 1450088, -1762010, --7490423, -1211718, -2561948, -3279745, -2983929, 3419868, -3172907, -1015760, 743029, 2123861, -5322002, -2053531, -162672, -4041564, -1995012, 838056, -5636608, -346282, 1490891, 3831648, --1255204, -2901787, -1506460, -5828271, 2720325, 1712618, 297963, -472446, -5079873, 2077690, -375810, -1792075, 1790465, -712965, 403727, 1675574, 121870, 351650, 1899986, 872952, -356482, 57982, 1512902, 581968, -340376, 651224, 866510, 1803886, -3874061, -7121056, --1682554, 1371168, -2110977, -3543348, -1909113, -7098507, -3943854, 7757785, -183610, -3260954, -4170413, -5992553, -1278290, -7504919, -1463510, -5888400, -3020973, 7183870, 492848, -1315871, --7845832, -4848481, -1675574, -3293166, 1470489, -4121021, 537945, 2760590, 8570070, 4265440, -3291019, 3779571, 6961068, -5623723, 55835, -1599339, -4306242, 1950989, -782221, -1602023, --4512937, 2541547, 4998805, 635118, -3416110, -2144263, 12601971, 177704, -3460133, -4868883, --7356205, -9844602, -1118302, -5043902, 1323924, -886374, 2912525, 644782, 1474248, -4454418, -812286, 876173, 6164889, 2167885, -4387846, 381178, -1276679, -1213865, -948114, 2285996, -3366181, 3298535, -2828236, -2752537, 1946694, 991064, 1318555, 1434519, -1020055, -4293894, --5062156, -485331, 1068910, -1110249, 672699, 165356, -572841, -965294, -1495186, -502511, --179852, -848256, -1675574, 283468, 723165, -848793, 477815, -730681, 305480, -947577, --405338, 343061, 418759, -1168231, 328565, -363462, -2198487, 373662, -684510, 1442572, --880468, -571768, -221728, -17494476, 6842957, -3179350, 2860448, -7277285, -2960306, -5712307, --5219996, 286689, -1678795, -3606162, 8831527, 2234994, -872415, -5456219, -1751273, 2428267, --6216429, -3338800, -5921150, -3343632, 8445516, 753230, 5618354, -616865, -98247, -1502702, -1564442, 1490891, -4543002, -23085, 1311039, 2458869, 9175661, -4897874, -5619428, -1187559, -10154913, 3122441, 10810970, 874026, 965294, -2003602, 5324686, -1018444, 7866770, -892279, --950262, -1510218, -3316252, 3265786, 990527, -2910914, 2268817, 2881386, 5457830, -3264712, --302795, -1079647, 4860293, -2092723, -846645, -1937030, -1271847, 1076426, -1620276, 467078, -805843, -1294933, 1190780, -8193724, 758599, 5153424, 1829119, 6936909, 557809, 641024, -1683090, 4379256, 7173669, -4862440, 679142, -484258, 1687922, -336618, -186831, 2040646, -4652524, 1678259, 2281165, 135828, -812823, -1330366, 629750, 2244121, -827855, 954557, -1080184, 997506, -41876, 362388, 1985349, -469225, 527207, -199179, 2293513, 1207423, --732292, -260382, 2469606, 1131724, -725850, 1678795, 1018981, -2318209, -3625489, -1736241, -26844, -8514236, -1333051, 185220, -4182225, -15150497, -3590593, -3186866, -6538551, -1195075, --1599875, 9654013, -3204046, 7325067, 3494493, 5311264, -9697499, -4307316, -9799505, -9109626, -104153, 1831267, 5879274, -2683281, -4219806, -2567317, -6589554, 1530619, 3164317, 3604551, -2275259, -1937030, 2612414, -4378183, 597000, -7974144, 3028489, -1988033, 1219771, 1869921, -3129958, 3307662, -2966749, 212064, 7930120, -4098473, 3904125, 4063576, -142808, 2468533, -3961034, -1499481, 1631014, 3874061, 324807, 6764574, -3380676, -4539244, -2120103, 2267206, -98784, -8796630, -4387309, -9756018, -10590316, -1744294, 3015604, -8647917, 4009889, -1339493, --35433, -2911451, 3042984, -5116917, -711354, -1739999, -7208029, -6387153, -2020245, 3908420, -244276, 3360275, -1263794, 2199023, 1824824, -3987340, 143881, -737124, 2415382, -2668785, --4452808, -1431835, 745714, 58519, -1638530, 839129, -969589, -356482, 853088, -186294, -175557, -38655, -914828, -172872, -883690, -623307, -526670, 27380, 597537, 104690, -1427540, 547608, -502511, 5014911, -14106283, -595927, 4504347, 2871186, -7441031, -832150, --4699231, 1317481, 1537598, 1112933, -8131447, -10937134, -7409893, 1369558, -5901822, 6649683, -2183991, -10532334, 7771207, 6797323, 5425081, 4838281, -5163625, 8713952, 2391760, 7516, --3251290, 2990908, 5290863, -4675072, -6853157, 2647311, -2512019, -8567386, -1035087, -8266739, --2917894, 15158013, -3904662, -6718403, -8288213, 533650, 1500554, 6067715, 2518998, -5464809, -5157182, -581968, -4211753, -5687611, -5971615, 9356049, 4294968, 5916318, -4294431, -6009196, -2875481, 1557463, -6102612, -264677, -3686693, 6061273, -1016834, 583579, -7231651, 4756140, -4089346, -4152160, -2552821, -2561948, 8499740, 140660, 1377611, -2373506, 5874979, -5807870, --9782862, -4400731, 1018981, -1871532, 5573794, -1082869, -465467, -5765457, -2898566, 2535105, -492848, -4099546, -2530810, 3541201, 2062658, -1099512, 318901, 69256, 166430, -1120450, -1695975, 690416, 2544768, 387621, 584116, 91805, 1201517, -480499, 1660542, -1946157, -2212445, -223338, -1101122, -7836705, -548145, 1662689, -2126546, -6310381, -9254581, -7463043, -7077569, 626528, 8725226, 10449655, 10150081, 1347009, 14012868, 3190087, -1791001, 6354404, -4812511, 12920872, 1686848, 7333120, -10581726, 16850768, 12357158, 5847061, -5388574, -4336843, -5965710, 1198296, 4223027, -2765422, 7162395, -2426120, -2112050, 6397354, 5181878, -6971269, -4343286, -2031520, 6975027, 7564511, -15479599, -3045669, 9229348, 2614561, 4939213, 3812857, -9139154, -4734665, 3554086, -52613, -8041790, -4057670, -401579, 1410897, -11718281, -1203665, -7112466, -5989869, 12064563, 8952322, -3878892, -333397, 2170569, 4368519, 6973417, -2994129, --2484639, 11360725, -2911451, -463320, 4871030, 12885, 6607807, 5172215, 2061047, 3505230, -3739843, 3500398, 1559610, 1358283, -1778653, -2931315, -1300301, -2690797, -453656, -1948305, -1122597, 931471, -2616172, -2168959, -451508, 1641214, 3631395, 2935610, 1637993, 131533, -1728188, -3490735, -1626719, -1981054, 571231, -1500017, 1538135, -4022774, 263604, -296890, -3124052, 1077500, 15032, 336081, 3245922, 808528, -3071439, 738198, -413391, 560493, -2719251, -314069, 754841, -275415, 29577830, -15651398, 2049236, 12123082, -1290638, 318364, -16097001, 17642652, 2001992, -1480153, 3633542, -980863, 3913252, 4976794, -6594386, -2120103, -10393284, 9133248, -4424353, -8577050, -9125195, -9504763, -5153424, 7656316, -6088116, 3280818, -328565, -11091216, -826244, -7419556, -962610, 2999498, 4720169, -14348949, -6760816, -11455752, --3597035, 16991964, 2387465, -1693291, 1441498, -1704028, 766652, 4910222, 2892124, 8403640, --535260, 6238977, 3734474, -6123013, 3712462, -9238475, 186831, -9280887, -9577240, 3431679, --10528575, 4236449, -185757, 5162014, 4177930, 3673808, -5645735, 6339372, -9546102, -372588, --4427038, -1656247, 11859478, 246424, 5912023, 5725729, -1260573, -2448131, 4560719, -10035728, -3900904, 9182640, -14001057, -10450192, -2887292, 6892886, -692564, -8776229, 3205656, -1450625, -3648575, -3361349, 1101122, -1999844, 6133214, -1356136, 5640366, 2923799, 5268851, 1620813, -1449015, -2996277, 3566434, 1378685, -134755, 1885491, 1804423, -1250372, 2665027, 1873680, --1305670, -1628866, -4566087, -1180042, -2605435, -323196, -110059, -1780264, 2355253, -1042066, -1387274, 259309, 4778688, -4011500, 1793149, 561567, 216359, -601295, -17520246, 3508452, -4491999, -11767674, 5619965, 127775, 12763569, -3105261, -6175089, 5521181, -15307800, -5129802, -13296682, 5949604, -7758322, -18956912, 8739722, -2458869, 4892505, -12020003, -16000364, -10790032, -14227079, 1357210, 7939784, -1139240, -7221988, -10810970, 5401458, -2730526, -9386651, -11004243, -1015223, -9800578, -7493644, -3992172, -1777043, -10635950, 6278706, 7458211, 10009421, -4483409, -8920110, -6813429, 13998372, -2359011, -533113, 10718091, 5612449, -2396592, -6862821, -3334505, -10353556, 2552821, -7336341, 3810173, 10986526, 10397579, 4588636, -12252468, -13549011, -1026497, -2881923, 1059783, -9693741, 3172370, 11140608, 3368865, -4447976, -17415018, 4921496, -7461969, --16973174, 739808, 1131724, -9509058, 14183056, -807991, -5530308, -18847928, 98784, -5405217, --667331, 7352447, -4046933, -7084549, -269509, 1839857, 1946694, -5575942, -5633924, -5615133, -2369748, -4820564, 540629, -708133, 1045825, -1198296, 1634235, 2756832, 2503966, 3122978, -1678259, 5457293, 6920266, 573378, 2199560, 1423782, -2375654, -532039, -1892470, 1014686, -967441, 589484, -6263136, 963683, -316217, -2174327, -73551, -1934883, 2196876, -2408403, --2494302, -1831267, -21760988, 13952201, 10799695, 11878806, 1843615, 12546136, 1438814, -7718056, --8976482, 1590749, 10091563, -6627135, 2490007, -14579266, 10333154, 10983305, -5233955, -2829847, -2675228, 12013024, 8784819, -5854578, -5252745, 8295730, -9481677, 3591130, -13033078, 234613, --3706020, -17471390, -18092550, 3814468, 10761041, 5164162, -15416785, -8151311, 12154757, -12962748, --5283884, 10895795, -2648921, 13554380, -4452271, -8973797, 3704409, -13178570, 15729244, -1349694, -2962991, -6961605, -3475166, -323733, -14344654, -8579734, 1379758, -2048699, 1661079, -4393752, --15242839, 3234110, -12586402, 6043019, -3021510, 9573482, -15216532, 7282654, 2836289, -4041027, -11687143, -1098975, -7705172, -14794015, -1851668, 3690451, -12036109, 9394167, -8075076, 6225555, --15912854, -16091632, 8005282, 6608881, -6407555, -4813048, 5398774, 3935264, -3333968, -2563559, --4270808, -5341329, -367220, -8809515, -819802, -961536, 836982, 2909304, -1555315, 2940442, --1628330, -204011, -4824322, -2093797, -1214402, -276489, 7455527, -1804960, -900869, 4602058, --4453881, 3541201, 1947231, -1403917, -993748, -4233764, -4150012, 184147, -2383707, 1025423, -396748, -1677722, -2929168, 7162395, -6970195, 2381559, 8523899, 12586402, -3326452, 1396401, --4467840, -16807280, -3590056, -3597572, 7302518, -14762876, -43487, -8516920, 9162239, -10327249, --14083198, 9367861, 4300873, 6094559, 19396072, -3197066, -5562520, 5474473, -12424267, -14489072, -1193464, 18564460, 5645735, 10423886, -7406671, -9109089, -14759655, 2953327, 18846316, -8442832, -9850507, 2268280, 14653892, -22416508, -7129109, -371515, 2632815, 12774843, 6158983, -17082158, --4629438, -7925289, -679679, -19668802, -3095598, -7076496, 1357210, -10348724, -690416, 2409477, --28724742, 3297998, -9008694, 1770063, -11372000, -612570, 7060390, 3615826, -3870303, -3632469, --15151034, 15235323, 14627048, 4833449, 3643743, -13133473, 20059108, 6997039, 10337986, -3940633, --31590558, 12321724, -1088237, 23707146, 22252762, 7033546, -2865817, 9819369, 512712, 8601746, -455803, 998043, -5596343, 2688650, -5113159, -2713346, -1431298, 10346576, -155156, 639950, -2645700, -638876, -5586142, -2852395, 942745, 4206921, -1981591, 2103997, -3283503, 4378183, --3435437, -5248987, -2690260, -742493, 2451890, 972810, -1140851, -897648, -1167157, 6836514, --1500017, 411780, 1117228, 3419331, 27197344, 9589588, 18613314, -18063558, 4197794, 18979460, --5704254, -6840273, 2682744, -11737072, 8961986, 2270964, -13707388, -17948668, -1348620, 15223512, --394063, -1226750, 9960566, -14872935, -3789235, -12243341, 6876780, -20864414, 344134, -4460861, -7588134, -21791590, -15055471, -9522479, 6386617, 7012608, 4853850, -7069516, 5295158, -5259725, -6460168, -4314832, -1909113, -1501091, -6119792, 4145180, 9643275, 5740761, 9708237, -800475, --9418326, 1341104, -9378061, 24981140, -6314676, -24575802, -7656853, 6715718, 21344376, -21365852, --8809515, -1393717, 13724568, 877247, -30235496, -3714073, 13952738, 28815472, 1066763, 20060182, -28903520, -2152852, 9303973, 13654775, -3780645, 24630026, -3310883, 29743722, 4736812, -8175470, --25797722, -16162499, 191663, 7756174, 3706020, -3929895, -5013838, -8019241, -10941966, -9727027, -11832635, 3457449, -144418, -16965658, -1916629, 620086, -3096672, -9650792, 2517388, 5101885, --1461363, -5004174, -3648038, -9455907, -5707475, -2784750, 5953362, -1173063, -5145908, 5150740, --7392713, 5308580, 5365488, -4638565, -8959839, 8181376, 12164421, 1855963, 373125, 733366, -7088307, -2121177, -8473434, 992674, 8216273, 6799470, -8412767, -7150047, 1312649, 1342714, -122407, 2427194, -1313723, 11399380, 13807246, -23792508, -23147190, 6088116, -5429376, 698469, --9234717, 21537114, -9724880, -6226092, 7458748, 5371931, 171262, -9892383, -7255274, -12031277, -4800700, -724776, -5840082, -987306, 14305999, 21508122, -23328652, -1517197, -22757958, -2450816, --5908802, 22494354, -9546639, -9120900, -4411469, 13677860, 4517769, 3751654, 5713380, 5454072, --4103305, 238371, -2982855, 3628711, -2722473, 21054466, -5525476, 5565204, 14816027, -7764764, --17071958, 3759707, 5776731, -6026913, -6565395, -1457068, 3475166, 10663867, -14625974, 19531364, -28742994, 19297288, -8104067, -11674795, -26667988, -34410204, -12676059, -164283, -6247567, -1775969, --3942780, 8185671, -741419, -13312251, 6944425, -5914707, -1293859, 12581033, 21013664, -5187247, -5884642, -3737695, 1123671, 19122806, 9648644, 16349330, 16650514, -13365938, -4130685, -3090229, -443992, -341987, 5907191, 373125, 3609920, 16763794, 670015, 7813083, -3590593, -3724274, --6911676, -2149094, 948651, 7616051, -2154463, -6404870, -3025268, 3648038, -2675228, -1463510, --2003065, 2291365, 576599, -2507187, -1364189, 1683090, 820876, 844498, 9659918, -4001836, -209917, 1223529, 110059, -5379984, 2414845, 2984466, 6156836, -12347494, 23041962, 10311143, -13066901, 19665582, 30434676, -11826729, 15701327, -31532040, -3968550, -14196478, -30990874, 12410845, -7218230, 9316321, 4032974, 12154757, 3638374, -22325240, 18624052, 32986960, -5049808, -5412196, -7999914, 3195993, -7010997, -29579976, 2314451, 13959, -2784213, 308164, 9929964, -21172042, -4460324, 5898064, -4440996, -12249784, -6033892, -13641890, 13696114, -30361124, -4496294, -19559282, -10706817, 4289062, 10858751, -3940633, 2877628, -7827578, 18417894, 5492190, 15099494, -13922673, -14839649, -423591, -14748918, 30151744, -5123359, 3619584, 20307680, -19704236, 22775674, 13597866, --18053896, 7488813, -6972880, 9979357, -24968256, 18088254, 2460480, 6306086, -2448131, 5806796, --20299626, 12775917, 22803592, -45610944, 4537096, 43848396, -28486908, -9178882, 2983929, 21338472, -15065672, 5211406, 13147969, -6056978, 7880728, -3398393, -9834938, 4741644, -2293513, -1697049, -8138963, 11922292, -1149441, -4719632, -4119948, 3488587, 7521562, -10198937, -3925063, -6994891, --4443144, -9121437, 8946417, 11932493, -2653216, 5469641, -3536369, 2196876, 7499550, 8567923, --10041634, 806380, 3542811, -5238250, 7752953, 376347, -287226, 7114077, 3519726, -8607114, --7314330, 2423972, 1013075, -2605435, 1329829, 18446348, -11157788, -13433584, -424128, -12860206, --5848135, -33989836, -29018946, -4002373, -16648904, -19978040, -14416058, 8876087, -5135171, -10113574, --16248935, 15007153, 1004486, -24539296, -3875134, -137439, -11684995, -3672734, 9956271, 7162932, --1732482, 93416, 459025, -6156299, 5228586, 11462731, -4305168, -2729452, 17582522, -33043868, --5395016, 9308805, 35229468, -14585709, -9155797, -13139916, -17898202, 7808788, 37381248, 6954626, -23148264, 4793721, -3822521, -1944010, -2787434, -18033494, 3934190, 4095788, -14712947, 3268470, -29185376, -4724464, -9034464, 4913443, -10515691, -2390686, 25738128, 38109244, 10251013, 22885734, -26400628, -9361955, -11070815, 3031173, -8767102, 1522566, -26181046, -213138, -20411296, 6216965, -4212826, 12435541, -21251498, -7904888, -7278896, -8288213, -6687801, -7414724, 11764989, 2569464, -15175730, -3842385, 5752572, 15246597, -2850248, 564251, -2264522, -6017786, -4919348, -801011, --3733937, -5528160, -159451, 2333241, -2942053, 1056025, 7041062, -7100118, -6561637, 521839, -5256503, 2800319, -3503620, -10531797, -10359998, -1223529, 2330557, -6230924, -3579318, 2257005, --2216740, 1150514, 661425, 7271380, 2334315, 1883880, -8013872, 8814884, -3785477, -8501888, -26737246, 30245696, -12577812, 68828464, -9819906, 1272921, -13112535, 7831873, -5732171, 7726646, -17435420, 4725538, -16884590, -9300752, -17628694, -592169, -12074227, -21740588, 2551211, 13606993, --2677375, 3746285, 6276021, 7856569, -452045, -6483790, -8406862, 3808562, -380105, -10984379, -3867618, 29426432, 20679730, 11647414, -25535192, 17805860, 13821205, -6940667, -8021389, -8005282, --10413148, -4632659, 7839926, -18540836, 1415192, 1982664, 10621454, 28045062, 5142150, 5583458, -1211181, -3680787, -6065031, 12000139, -7781944, 28326384, 8873939, -3054259, 12202002, 2095407, --19617800, -14159433, 15935402, 18470506, 6638409, -4976257, 12140799, 13134010, 18784040, 37072012, -3679176, -11020349, -19534048, -13109851, 9377524, 1831804, 2816962, -2055142, 12813498, 1118302, --1921461, -17710298, -8915278, 17883706, 20045150, -7531762, -14159433, -16798154, -5108864, 8599061, -5264556, 1365263, -5908802, 1171989, -319975, -7582228, -243739, -16425029, -4513474, -877247, -11292006, -2347200, -3817689, -168577, 9103183, -5887864, 6439230, -3753802, -7891466, 6324340, -8996346, 5739687, 6277632, -1087701, 6743636, 13111461, 5531381, 5465346, 3532074, -5162014, --2521683, 138513, -1480690, 3783866, -4051765, 6325950, 8170639, 4778688, 332860, -6649146, -2250026, 2123325, 6577743, 10770167, -11177652, 48993764, -7785165, 1646583, 5051956, -4188130, --1111860, 11940546, -9613747, -11333345, -6120866, 15535970, 13879724, -38677256, 6968048, 6083285, -15235860, -10230075, -15476378, -14821932, 10545755, 9440875, -15795816, -8871792, -6707129, 25275346, -12568148, 6785512, -5357435, -27084600, 7185481, 6267968, 13376676, -3739306, 6945499, -7828652, -2246805, -23584202, 9266392, 9031779, -2684, -6174553, -14856292, -29223494, 18335216, -12561169, -9269076, 9416179, 16167868, 1869385, -17864916, 28766618, 5400922, -28971702, -13555454, 16653199, -3753265, 21934398, 9151502, 3263102, -20646444, -10477573, 11056320, -35807144, 37807524, -27637040, -1248225, 22441740, -6434935, 44905492, 6508486, 7797513, -16702591, 52381960, 5228049, 33933464, --23597088, -10855530, -7609072, 12990129, -1687385, -5765994, 23698556, -20206748, 22852448, -27833536, -5669894, 2403034, 4774930, -5698885, 20132660, -2829847, 10158671, 8766565, 13308493, 7306276, -3765076, 9086540, 10358924, -8053, 3692598, 791885, -7312719, 8667244, 106837, 5838471, -12604118, 6018860, 659814, -1036698, 9623948, 10119480, 5114233, -6383932, 21254720, -1372242, --4418448, -4581657, 13601625, -10849087, 4642860, -2731062, 7258495, 29528, 2943126, 3612604, --3048890, -2795487, 1978906, 3643206, 3438121, 3825205, 5404143, -5700496, 17769890, 41198936, -13955422, 26038240, 33046016, -956167, 37830072, -28387586, -9922448, -10406169, -9133785, 4456566, -6509023, -2017024, -12343199, -24342800, 24184424, 22916334, 9916006, 20744692, -32855962, -28322088, -10086194, 14206141, -14988362, -21119964, 14166413, -6347425, -30610768, -10931229, -5532455, 15786152, --28120762, 16225850, 11067594, 12953621, -12966506, -334471, -12824772, -5324686, -37592240, -8781061, -18743774, -59665148, -18709952, -1832340, -1006096, 2556579, -35840428, -8523899, -54151484, -4058744, -11095511, -15028627, -16723529, -6563247, 16710644, -5044976, -19329500, -21905944, -56537876, -19771346, -26916024, -24657408, -37961068, 32544040, -9763534, -42507828, 13303661, 39371428, -20490216, -8903467, -4984847, -27689118, 35281544, 16059420, 22680112, -11198590, -2216203, 12043625, 33600604, 16068010, -5513128, -10141492, -2077154, 38371776, 3927748, 6437619, -2539400, -21755620, -9667971, 18315352, --162672, 1669669, -3388729, -19365470, -1291175, 9174050, -12139725, 15221364, -18843096, -11663521, -4129074, -6121939, 10103911, 4586488, -17143362, 7698729, 8904541, 5267778, 3498788, -6453189, -4337917, 418222, -4056060, -11703786, 6295885, 5601174, -1259499, 9886478, -13477607, 2146947, --12902619, 966905, 3620658, -4006131, -2112587, -33286, 5304822, 1380295, -3763465, 839666, -46835008, 64849712, -10444287, -2272575, -25769266, -25910464, -44499084, 18507014, -7785702, 64788508, --14010183, -28383828, -39448200, 2017024, 11893301, -14731201, 11982422, 42276972, -17161078, -7836705, --30015378, -13770739, 28451474, 32921998, -33745020, -9729175, 16775069, -7475928, 7223598, -10239739, -41421200, 33230162, 70853536, 22953378, 31132070, -14270029, 22217328, 47900160, 15252503, -3320547, -10853382, -1867237, 31006442, 16179142, 45388140, 12664248, -46557984, 15989626, 17440252, 37810744, --21677236, -18336290, 21648246, 23683524, -11775190, 38026568, -13762149, 15476378, -42409044, 26403312, --10234370, 14397267, 14588930, 33339684, 28675886, -23283018, -24487220, -7926899, 34781720, 35372812, --13761612, -19881404, -38217692, -4458713, 26309896, 30093762, 19787988, -8977555, -25399362, -23825794, --4399657, 16337519, -16694538, 22835268, 5383742, 15915538, 2573759, -8296803, 17929340, 11381663, --2991445, -7843147, 5457830, 15358803, -22635552, 8925479, 10983842, 14978162, 8038568, 21221434, --7247758, 7429220, -10190347, -14696841, 8257075, 17874044, 15590731, 24028194, -419833, -386547, -7068980, 6338298, 42849280, 8184597, -1976759, -18867792, -46171, 27441620, 13845364, 21189222, -12249247, -668404, 260919, -4828617, -290984, 26409218, 21859236, 2240899, 8118025, -2738579, --4440996, 907312, 11099269, 8420820, 7353521, -5776731, -5647882, 6358162, -16513076, -53391276, -3159485, 80406080, 47834124, -11876658, -119198768, -17558364, -12576201, 8683887, -14024142, 1639604, -11864847, -5152350, 4839355, -26446798, 15992848, 19201188, 36190468, -27167816, -33984464, 34008088, -54432268, 13172128, -24862492, -33183992, -7436736, 7478075, 2632278, 7978439, -224412, 11368778, -4446902, 35115652, -11858942, -49969796, -21731998, 15076946, 5407364, -17792976, -21922586, 2085744, -22853520, 40438192, 37483792, -1618666, 293132, 14699526, -14958297, -43319040, 12592844, -27349278, -50707456, 55093156, -1430761, 14933601, 7715909, 10280004, -25013352, -4450123, 52930640, -20941724, -237834, -73186240, -9845139, 7255811, 16489453, 14805826, 14746233, -18837190, -11457362, 31765578, -47707424, -9422621, -2253784, 3672734, 19116362, 22385370, -11026255, 6859600, -26218628, -31802086, -3019899, 7410966, 11279658, -4809290, -4925254, -6897181, -6719477, 19946364, -205085, -5043902, --11135776, -1999844, 12939663, 10642929, -6346351, 14955076, 3663070, 23338852, 2007897, 3134253, -809064, -9842454, -7338489, -5563057, -5689758, -2945811, -7354058, -6462315, 1929514, 19061064, -23140210, 5494874, 12066711, 3123515, 4285304, 18516140, -14285598, 13682692, 5575405, 23336704, --6523519, 4956393, 4720706, -11654394, 8035347, -6405944, 8215736, -4458713, 13911399, -6526740, --8333847, 5064840, 3215857, 1539209, 5658083, 1589138, 9998684, -9664, 3915937, -173409, -3714073, 1387811, 3233037, 4275640, 4912369, -1441498, 1176284, -804770, 6467147, 2259690, -4908074, -1056562, 1348620, 826244, 3666828, 151934, 4112431, -1610613, 5600101, -6168647, --53310744, -22055730, 42681776, 47029892, 44675712, 60555816, 10432476, -26050588, -79852032, -60630980, --11390253, 16936666, 50661824, 55089936, 26081726, 1238561, -26783416, -23202488, -10268730, 17208324, -47295644, 26858578, -6196027, 1731409, -3818226, -25942676, -35476968, -29058674, 5488968, 43528956, -32728724, 65451008, 42599632, 42150808, 59340880, -17268990, -40935872, -46612208, -61869004, -76235672, --28739236, -8992051, 22681722, 41977936, 60658360, 56651692, 46071040, 29126320, 58273044, -11395085, --36785320, -1733019, -9344775, 15404974, 17656074, 69517264, 60742648, -22585086, 10924249, -15822660, --46452220, -13728326, 12379169, -27996744, 43246024, -17317846, 14401025, 3665755, -4891968, 37368364, -51979840, 41401876, 29185376, -21603686, -52487184, -59805808, 17111150, -25232396, 4650913, -2909840, -33795488, 5238250, 19152870, -16166257, -36753108, -34202972, -53565220, -46677168, 19877646, 11101954, -27087284, 40603012, 31722628, 1155346, -23861228, -38671348, -52279416, -28724204, -13282186, -19350976, -8746701, -7086159, -5971615, -6295349, -15790984, 53150, -6943352, -10669236, -12500502, -8146479, --1556926, 8252243, -15132244, -9682467, 3118683, 9179956, -3872450, 22256520, 2180233, -119514448, --125791000, -130835976, -134110888, -177188336, -19280108, -50153944, -12178917, 16506096, 80646064, 91672856, -94774896, 132698384, 183441280, 175785488, 172740896, 138797232, 100224136, 72837816, 21857088, -83758840, --40227200, -49497888, -30683246, -100583304, -16734803, -41647224, -45894948, -83232168, -63997160, -65076808, --58986544, -61582316, -108239080, -95819112, -56584584, -51129976, -64265060, -88972928, -13573170, -77911240, --147706608, -126525440, -111132816, -58563488, -75517336, -13486734, -152885264, -67681704, -67752032, -31289374, --22870164, -78702592, 3431142, -78851304, -9579925, 12279311, 36891084, 3305514, 37915436, 56691956, -89081920, 95020248, 130666328, 85416696, 205079856, 129629632, 238718048, 162337408, 237816096, 275922656, -327574464, 269124800, 270882528, 305371648, 273936768, 278276288, 270760096, 234825184, 135795056, 108569256, -76540616, 55870544, 65320548, 97582728, 53716620, -19820738, -34046204, -39198020, -67407368, -87371448, --106606992, -98105640, -161306624, -156182192, -160951216, -194863744, -171694544, -216455616, -191758480, -224902208, --231070320, -217597536, -240194432, -217130464, -242545392, -192454256, -188666640, -156304592, -166918000, -171956528, --121000504, -108269680, -82844552, -42172284, 14019310, 46000172, 40226664, 51495048, 45999636, 52050708, -59733332, 85480584, 102659384, 92863096, 83463560, 102145056, 94983736, 117499568, 106909256, 78176992, -71108016, 61879740, 54460184, 34305516, 25991532, 24237038, 15188078, 16736414, 6582575, 10861435, -9470403, 6522445, 9510131, 6947110, 4096325, 1489280, -3804804, -588947, -148713, -10206453, --16306380, -9359807, -8235600, -10747082, -10559177, -6575595, -7858180, -11259794, -15076946, -11584601, --7606387, -6247030, -4045322, -4896263, -3707094, -650151, 3100967, 5426691, 4970351, 2710661, -2294586, 5697811, 8583492, 6097243, 5935108, 2856690, 1320703, 3639985, 3057480, 3113315, -2414845, 2506650, 1003412, -1867237, 2601677, 6408628, 6189585, 7444789, 8042327, 11662984, -13684840, 13884556, 14847165, 15737834, 17164300, 18609556, 18673444, 17501992, 16856672, 18556406, -15053324, 13044353, 11529303, 9912248, 6659347, 5365488, 2188823, 1528472, -294205, -3491272, --6594386, -9566503, -10395431, -13165149, -13584982, -13288629, -13372381, -14816563, -15610059, -14462765, --14071387, -12804908, -11777337, -10839961, -9656160, -7499013, -5458367, -4122095, -3292629, -2326262, --1780801, -1297617, -1126355, -866510, -812286, -743029, -675384, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ -17017198, -2232309, -5614059, 2633889, 2989834, 1023813, -7104413, 3218541, 5006858, -5430450, -1642825, --6649683, -1478543, -2834142, -2451890, -970663, 346282, -245350, 653372, 2370822, -2976949, -1307281, -6817724, 2325188, 4154844, 874563, -1809255, -5523865, 3578782, -2434710, 5802501, -4955856, -237297, -2326262, 4725538, 5523328, 4429722, 4489852, 1095217, -3467112, 1058173, -4246649, -1812476, -3621731, 3216394, 5122822, -2281702, 2668785, -5871757, -496069, -5153961, -3485366, -6852084, -1857573, -1299765, 2323041, 3374234, 2397129, -223875, -3631932, 413391, --5019206, -3333968, 902480, -650151, -3031710, 1618666, 1682017, 399969, 3145527, -2843805, -1346472, -3830574, -1520955, -1648194, 2079838, -2001992, -4034585, -1835025, -1511829, 5500243, -4743792, 1174137, -2538863, 295279, -307627, 933619, 1897302, 317828, 94489, 302795, --91268, 46708, -724239, 518080, -2131378, 64961, -174483, 837519, 443992, -689342, --939524, 156766, 369904, 367220, -179852, 19327, -428423, 9742060, -9768903, 396211, -197569, -2454574, -2915209, -3105261, 1038308, -5493800, -5420786, 795643, 2668785, -176094, -3157875, 2469069, -2969970, 1260573, -10718628, -2601140, -2377265, -2472291, -3362960, -3707094, --9444096, -7327214, 1033477, 2245194, -484794, 5155035, 4123169, 1754494, -1800128, -991601, -4825933, -1823751, 619549, -668404, -5019206, 1719598, -1663763, -3403762, -1303523, 4156992, -9988483, -3766150, 1137630, 2459406, -1817845, 3171297, 1427540, -3447248, 2055142, -8199093, --3787088, 128312, 3393024, 5266704, -3180960, -1451162, -333397, -11897059, 2063732, 6207302, -357556, 933619, 3400540, -1903744, 5294084, 7144141, -875100, 2057826, 4294968, 4093641, -830002, 260919, -1957968, -2811593, -1757715, 1298154, -2690260, 5974300, 4010963, -92879, --2877628, -1445793, 3441343, 4060355, -1990181, 3160022, -1877975, 889058, -1915019, -1132798, --1306207, 415538, 111132, 271657, 287226, -180389, -623844, -462783, -2564096, -8380555, -1950452, 314606, -8106751, 1250372, 4553739, 6700149, 1725503, -4804995, 11347840, -1513439, --2228014, 5340792, -3289408, -3199751, 551903, -4131759, 5060545, 5063230, -2039036, -7619809, --3765613, 3808026, -4908074, 10800769, 9315784, -7431367, -9102646, 338229, 1707786, -8654359, --563178, 3593814, 2434173, -4230006, -2464774, 9960566, -1052804, 6860674, -676457, -2209761, --2310156, -5108327, 894427, -712965, 5369246, -4565550, 1243930, -1184874, 999117, -2681670, --352724, 4545149, 3599720, -5652714, 8834748, 747861, -39728, -121870, -808528, 2415919, --1217623, -7888245, -1122597, -4155381, 6888591, 2907156, 179315, 8483634, -4682051, 5682779, -5565741, 534723, -4118874, -818191, -877784, -65498, -1173063, -1682017, 2338610, 2505577, --3741454, 1819992, -222801, 2651069, 2315524, -738198, 360240, -1131724, -1759863, 1282585, --1620276, -1335198, 690416, 1804960, -1636383, -1186485, -2128693, -880468, 1274532, -778463, --313533, 59056, 644782, -1143535, -673773, 1672353, 539555, -312459, -520228, -1806571, --78383, 965294, 552977, -20148228, 4707821, 1150514, 14471892, -712428, 5855651, -7682086, -1735167, -5740224, -1322850, -2779381, -848256, 2712272, -1490354, 2537252, 4923107, 3774203, -13743895, 9504763, -6140730, 3201898, -264677, 2590402, 1682017, -1679332, -13519483, 3507378, --625455, -66035, 5226439, -743029, -3721589, -2569464, -572841, -4153770, -2199023, -10792179, --2478196, 352724, -3766150, -614717, 4570382, 6508486, -2013803, 8026757, -5885179, 1377074, -2789045, 1109712, -1777580, -4123169, 3033858, -986232, 1895691, -3046206, -4360466, 893890, -2649458, -4405026, 4336307, -2988224, 10229538, 10847477, -3206730, 4003983, 4209605, -490163, --1327682, -1377611, -13097503, 5573257, 5422396, 232465, -2145336, -5429913, 649077, -1544041, --6638946, -14960445, 1058173, -3655017, 3927748, 70867, 10737, -2439005, -1627793, -2757369, --209380, 1614371, -1889786, 2363306, -2343442, -1325534, -947577, -526134, 1301375, 1096827, --741956, 548145, 410706, 901406, 1413581, 1114007, -631360, -1516124, 1203665, -594316, --1117228, 517007, 461172, -622233, 910533, 1442035, 537945, -103616, -4363150, -6641630, -6558415, 3723200, -610959, 7588671, -4124242, 6804839, -7738458, -7425999, 3562675, -11830487, --4217121, 2944737, 7145215, 9357123, -1677185, 6977175, -282931, 6644315, 2427730, 1055488, --1138166, 336618, 6619082, -3202972, -741956, 1184337, 536334, -6589554, -858993, -3586835, -13526463, -6512244, -6616934, -1621887, 6352257, 6411313, 5482526, 7369627, -1324461, 1334661, --1685238, -3692598, 2753611, -353261, -745177, -4218732, 10596758, 6541772, -3335579, 2007360, -3098819, -5633387, 1145146, 4117263, -1094680, 7964480, -3271691, -1053878, -8726300, -3291019, --7427072, 313533, 10128607, -4021163, 2824478, 1728724, 301721, -2791729, -993211, 77309, --2538863, 4874251, -5073430, -2380486, -498216, 10719701, 1647657, -74625, 3336653, -2931852, --8104604, 1987496, 757525, -1290638, 529892, 1970316, -586800, 399969, 3859028, 734976, --369904, 925565, 1611, -528818, -991064, 3629784, -234613, 302258, -3379603, 2013803, -456340, 2005750, -550293, -1366337, -467615, 1020055, 1585917, 1066763, -2767033, 135828, -1858110, -590558, -3475702, -2298881, -19144280, 13739600, 1370632, -7095286, -16918950, -1759326, -341450, -10041634, -985695, 4555887, 3864934, 282931, -2967286, 3590593, 11943230, 12124693, --5318780, -5818607, -13326210, 2565169, -2476586, 12778065, -5331128, -364535, -3109020, 4760435, --1534914, -13259638, 4235912, -697395, -7904888, -70867, 1139777, -1148367, -1425392, -5495411, --7638063, 4508105, 1039382, 5920076, -5308580, 10016937, 4694400, -2161442, -9039832, -1851668, -3135326, 9795747, 2964064, -5658620, -2644089, 4511863, 2863133, -2942590, -1498944, 4760971, -3860639, 5029944, 9681393, 10843182, 5234492, 5738613, 6610492, -4005057, 872415, -7300371, -7124814, 1065689, 3549254, -5236102, -8130373, 1761474, -10365904, -3771518, -4580046, 7460895, -7791608, 8193724, 2066416, -2415919, -2726231, 7649874, 1462973, -1152662, 1836099, -2505040, -4822712, 184147, -184684, 1549410, 1913408, -839129, 3929895, -73551, 570157, -2011655, --1283122, 1043140, 3038689, -264141, 1025960, 1756105, 933082, 538482, -1071594, 1439351, --1384590, -2007360, 1589675, -6840809, -392990, 12840342, 7898982, 10858751, 2076617, -11848204, --3898757, 12610024, -3620658, -7961796, -8301098, -8167954, -8648454, 4779762, 4849018, 3124589, -2855080, 2957085, 12126303, -1478543, 5267778, -10387378, -11702175, 7862475, -409633, -6370510, -464930, -16291885, -5320928, -5474473, 2008971, -551903, -1501091, -11454678, -7508677, 1296006, -7929047, 12902082, -5105643, -5029944, 6864969, -8820789, -632971, -427886, 2961380, 5659693, -4597763, 8952322, -4792647, 12968117, 6104759, -13960254, 6986838, -7747584, -9278740, -7690139, --11224360, 10184441, 2383707, -11933567, 1364189, 2552284, 1104880, 1923609, -2198487, 8453033, --4893579, 6505802, -10413685, 7923678, -5288179, -4779225, 1020592, 3535295, -414464, 5735929, -16328929, -1337882, -8772471, 5211406, 10696616, 890669, -1175210, -8452496, -3716221, 7924215, --1353452, -492848, 255014, 1632625, -2226404, -1228361, -210990, 2369748, -1364189, -236223, --1566053, 4493073, -3278134, 732829, -3082713, -3782256, 988916, 1283122, -1218160, 647466, --1133335, -788127, -265214, -379568, -117575, -1567663, -982474, 4620311, -261993, 90194, --464930, 1762547, 968515, 1586454, 26386132, -24171002, 10882910, 11365020, -10976326, -2146410, -15703474, 5565204, 9899363, 2819109, -3703336, 23728084, -1164473, -4678830, -229244, -120259, -11282342, 17799418, 6611029, -324807, 157303, 2501819, 5980205, -286689, 3076807, -12781823, -5751498, 9606768, -2262374, 3800509, -204548, 1621887, -8316131, -6528351, 250719, -477815, -10901164, 5287642, 4387846, -4877472, -5959804, -5946382, 6186364, 9093520, -129386, -3187403, -17942226, 9202504, 11920682, -6736120, -13750875, -2777233, -14390288, -9529459, -4482335, -6112276, --1024350, 10417443, -3569118, 210990, -8894340, -9470940, 10366977, -732829, 4723391, 5083094, --5728950, 9963787, 2434710, 711891, -3743064, -7004555, 7764764, -2643552, -14337675, 7965554, -6687264, 8338679, 3637837, -10151692, -2300492, 726386, -10603201, 5735929, 5743982, -1174137, -4284230, 3559454, 3806415, -1177895, 6140730, 741956, -467615, -3427921, 1361505, -269509, -4845797, 885837, -360240, 828929, -268435, 3517578, -1805497, -668404, -2689187, 1056025, --879395, -2144263, 198642, 309775, -957778, 364535, 3878892, 2884608, -1998234, -1370632, --2871723, 474057, -795643, -570694, 227633, 286689, 1162862, -1991791, -18442590, 2422899, -6278169, -8990977, 7757785, -15636902, 3749507, 4943508, -1926830, -6114423, -7864085, -9216463, --15670725, 2148558, 18151606, -5793911, 8837432, 4950487, 13543106, 7233262, -4895726, -11369315, -6085432, -2779918, -3919695, -11789685, -1611687, -1480690, -4581120, -4982699, -2566243, -8252780, --10820096, 12940736, -1082869, -7328288, 10242960, 3666292, -8597988, 1434519, -461709, 5839008, --11479911, 3400540, 4197257, -17115444, 5944772, 5738613, -8679055, 2662880, 865973, -2675765, -6562710, 701153, -1002338, 872952, 4513474, 11733314, 9453760, 11970074, 8397735, 4335233, --2862596, 17761300, -4277788, -8939438, 19794430, 1406602, 12050068, 2644626, -3577171, -18080202, --16580184, -4081293, 1286343, -6548752, -2990908, -5124433, 11781632, -10029822, -2715493, -1633698, -3054796, -9791989, 7364795, -702764, 2493766, -772020, -3587908, -6350109, -4065724, -4987531, --3850438, -1148367, 906238, -3043521, -1954210, -1670205, 4482872, -4850092, -4063039, -3472481, --3899830, -116501, 3657702, -1446330, -1389959, 2479270, 869194, -1177895, 1935420, -3025268, --3095598, 2634963, -3653407, -6300717, 2519535, 5727339, -2729989, 654983, 4113505, -1267552, --2841121, -3171833, -30862024, 15214922, 26735098, 1933809, -15051713, 6977711, -2719788, -974958, -4443681, 2661269, 6934225, -7986492, 1002875, 23971824, 18423262, 16136192, -17452600, -658204, -4372277, 9253507, -8340827, -9329206, -2334852, 3111704, 8366597, 4217121, -22470196, -25482040, -8018167, -751619, 14472429, 14868640, -9473087, 12324409, 9899900, 13159780, -833224, -7681549, --8047158, 6346888, -8526047, -3182571, 49392, -258235, 7864622, 16715476, 9387725, -4429185, --3868155, -8102456, -2047089, 853088, 4540854, -1646583, -2878702, 8287677, 5185100, -12409771, --123480, 651761, 15116137, -7450695, -8610873, -16299401, -5537287, 2955474, 1141924, 8633421, --1791001, 2270427, -7312719, -10773925, -9867687, -9856950, -5720897, 4930623, -20589000, 2620467, --2854543, -3077344, -4327717, 4242354, 11330124, 8395050, 1339493, -1680943, -10446434, -3171297, --936303, -1956358, 6950868, 3710852, 2141041, 1705102, 3625489, 4384625, -1578937, -1568200, -131533, -1710471, 390842, 658741, 1406065, 2507724, -6678138, 1238024, -844498, 5291937, -1401770, -6529424, -355945, -4052302, -3250753, -1462436, -1486596, -1565516, -833224, -640487, -1789391, -133681, 3681324, 3361349, 2813741, 4912906, 15463493, 1144072, 13401909, -1982127, -17434346, 8631274, 13566191, 8287677, 3861176, -6913287, -814433, -4376035, 9258339, 2633889, -8115341, -8002598, -1504312, 14432701, -18080202, -10166724, 13866302, -23812910, -10567767, 1633698, --4647155, -11857331, 23722714, -4394826, 16347719, 6476811, -14478872, -2328946, -5524402, -17486422, --22667226, 17870822, -289910, -6693170, 4327717, 193810, -3118146, 6422587, 2448131, -2458869, --8417599, 1457068, 16884054, 14285598, -12020003, 4584341, 809601, 13318157, -6249178, 8982387, --19463718, -4817880, 13080860, 4299263, -4550518, 15620796, -5136244, 10910291, -21593484, -24894704, --9048422, 346282, -17661442, 18813568, 13252658, 19113678, -8949101, -6637872, -6797860, 861141, --9885404, -242129, -15044734, -13688598, 499827, 3677566, 13707388, 6395743, -1575716, -5239860, -4232691, 7841537, 5115306, 3049964, -5033702, 5629092, 5039071, 6361384, 4702453, 3378529, -5099737, -7306813, 5922760, -4479114, -2311766, 9317395, 8254927, 5477694, -1108638, 186831, --2639258, 4702453, 1411971, -2145336, 2526515, 4770098, 635655, 3671660, 3614752, -5090073, -1531693, -3888019, -1195075, 1006633, 21640730, 15575699, 24380918, -21556978, -16186121, -36965172, -16002511, -4074850, -31572304, -6089190, 3058017, 4702453, -11759620, 12918188, 10937671, 1263257, --82141, 2050847, -5178120, -10973641, 2491618, -6225018, -10241350, -97711, 24044838, 780610, --3571265, -19139448, 8158291, 15175730, -7763154, -23102630, -4124779, 7830263, 2840047, -4879620, -5116917, 1678259, 8399345, -2310156, 13804562, 21005074, 8016020, -13920526, 15890842, 7144678, --17781702, -18985366, 20750598, 10019622, -7960722, -9252970, -369904, -16827682, 12425877, 16273094, --294742, 937914, 4186519, -2059974, 17881022, 6000070, 4721780, -7355669, 2974265, 6024229, -22064858, -5254356, 8519605, -16998406, -19276350, 17300128, -2499134, -1600412, 1896228, 16489453, -473520, -760746, 10510859, -4961761, 2189360, 9554155, 11763915, -5557151, -7133941, -15618649, --7588671, 5117454, -6781754, 5451924, -46708, 5784247, -2997887, 4268124, 1014686, -2398202, -2011118, 8749385, 2290828, 8709120, 2762738, -5498632, 494458, 3637837, 3154117, -5396627, --4807679, -5257040, -2111513, -4129074, -3896609, -6422587, -2615635, 3586298, 2430415, -649614, --889058, 1962800, -4110821, -99321, 5661841, -1545115, -726923, -2642479, -2063732, -1150514, --7979513, -1140851, -2988760, -3249680, -4851166, -7015292, -24796456, -1812476, -16137266, -32996086, --34013456, -14559939, -25910464, -11610907, -3973919, 4951024, 14884746, 16575889, 1924145, -8581345, -17835388, -8688182, 8918500, -32575180, -2976949, -22268332, -14861661, 15503758, 10961293, 10669773, -3717294, 22215182, -1968706, -1124745, -15569256, -5235029, -2934537, -10518912, -10624138, -26725434, --10356240, -2729452, -4098473, -16440598, 15009837, 6125697, 9057549, -7099581, -2578054, -40687300, --11548093, -11035918, 9730248, 21226802, -12674985, -1735704, -23598698, -1475858, 12524662, -3663070, --7804493, 5610838, 17854180, 30284352, 6564321, 1197222, -1410897, -7815230, -11774653, 8275865, --7673496, 27491012, 5608691, 11973832, 55818468, -10817412, -9207873, -13797582, -19227494, -2402497, -19233400, 8784819, 2964601, 6555731, -7778186, -5986648, -16703128, -3822521, 9782325, -1320703, --3498251, -1356673, -3702262, 2232309, -374736, 3929358, 3995930, 4052839, 5265093, 5721434, -14405320, 8871255, -4995047, 8467528, 31675, 753230, 6172405, -6622303, 380641, -7676181, --4527433, -10591389, -7781407, -11058467, -9110163, -6052683, 12620225, -7480223, -4092567, -8864276, -819802, 2910377, -1711545, 3937948, 1753420, -22012, -7418483, -27755152, 15832860, 26058104, --15337865, 822486, 5890011, -8959839, -2110440, -19419158, -345745, -10886668, 28308130, 8053, --5269388, 22687628, -5701032, 6597070, -25957708, 13498008, 4090420, 17584132, -8143258, 13088913, -23191212, 24829206, 14014478, 22377854, 11549167, -3585761, 21844204, -10561861, -14249628, -4621922, -8823473, 14725295, -35337380, -2456721, -22810572, 18131204, 8324184, -496069, 6353867, 25401510, -1194538, 22662394, 9809705, 34343096, 3207804, -3973919, 15182709, 4920422, -17416092, 3710315, --1918777, -23591182, 16641925, -14256070, -22828288, -47029356, 3787624, -5858873, 27768038, -15455977, -37115496, 12127914, -462783, -5726802, 14578730, 15129022, -26873610, -11625940, -19810536, 6888591, --8839580, 20226074, 6644315, 6750078, 10004589, -4754529, 1939178, -7188165, -2266669, 492311, --2465848, -20970714, 8470212, -115964, 6414534, 125091, -5921150, 592706, 8780524, -13980119, -12232067, -5172751, 219043, 1284195, -11409044, -1074816, 7328288, 3493419, -8104067, -3543885, --1736777, -9913321, 3604551, -2878702, 14644765, -11569568, 5428302, 9918690, 3914863, -4311611, --2801929, 4789426, 2738042, 2947958, -2175401, 4970888, -14954002, 4041027, 4071629, 6528887, --4248260, -7226283, 966368, 6394133, 1330366, 17534204, -12265890, -13685376, -13470628, 16850230, -8584566, 22040162, 5881958, 68863896, -20874614, 49929, 193810, 31883690, 13008382, 14590541, --21453898, 8957154, -8657580, 277562, -10100152, 1830193, 22948548, -6444599, 7054484, 44659068, -13791140, -20691004, -24182276, 2456185, 29004452, 14979772, 5245229, -11667816, 24641838, 3922379, --4034585, -27757836, 8059506, -4676683, 11496017, -25226490, -15534897, 983011, -6667400, 2962991, --23559506, -1116155, -14499810, 6267431, 20264730, 16149077, 5057324, -32185948, -62277, 2837363, --29052232, -25965224, -17331266, -14337675, -14333380, 22420266, 4861903, -963146, 14491220, 23325430, -5975910, 20159502, 223338, 13241384, 90058488, -20936354, 14563160, 10064719, -16213502, 3053185, --60559576, 901943, 29577830, 7517804, -16900160, 22716618, 5221070, 8449811, -15357192, -3722126, --13167296, 4201552, 791348, 834297, 4831302, -18972482, 6583648, -10547366, -7771744, -25862146, -6019397, 5560909, 4771709, 6272263, 31662498, 4522064, 3102577, 3364570, 2184528, 18809810, -1929514, 7765301, 6372121, 14276471, 5549635, -1184337, -3543348, -2961917, 2110440, 8939974, -10734197, 2957085, -17096118, -8024073, -4024921, -4032974, -5851893, -17848274, -4561792, 5880884, -13155485, 36283884, -17322140, -1185948, -24855512, -18153216, 5515275, 15715822, -20608326, 23929410, -9881646, -32161252, 19298898, -13220446, -16049219, -1651415, -19346680, 4150012, -8810052, 24270324, --14449344, -1465658, 13284334, -47862580, 6546604, 14396730, -14595373, 11346767, -28963648, 28341952, -2888903, 4581120, -54575076, 48668960, 20786032, 15731928, 840740, -31355946, 28164784, -2194192, --14305462, 49760416, -10216117, -22410066, -11827803, 5661841, 14287746, 13340168, 3437585, -8858907, --59261960, -7079180, 14554570, 446677, 21465710, -31412854, 31777390, 2822867, 10608032, -31933618, --9310952, 4634270, 40568652, -17399986, 9327058, -29635274, 25617332, 14014478, 24166170, -9856413, -10601590, 3743064, -32091996, -30939334, 16564615, 13211319, 25799868, 5082020, 33165738, -50752016, --65947076, 10001905, -14059575, 36653252, -24426016, -5764920, 4102768, -28524488, 1205812, -17246442, -14385456, 20117626, 1887101, 16214038, 18264348, 4926328, -16830904, -8971113, 29492466, 14871324, -3678103, 4613332, -9069360, 127238, 17891760, 9534291, -14792941, -8866423, 16637093, -2986613, -10303627, 9910100, -6632503, -9210557, -8841190, -562104, 8800925, 3417183, 11305428, 15796353, -1183800, -1183264, 13253732, 158377, 2531346, 3562139, -5782637, 3903052, -9987410, 4884989, -1844152, -490700, 4165045, -4853850, -45926084, 41895260, -9034464, -10115185, -16340203, -4774930, --36211944, -67626408, 23363548, 19417548, -2970507, -13943611, -27540940, -4553202, -8535174, -14653892, -26658862, -60483340, -25834228, -31933618, -9511742, -46055472, -4234838, -6944425, -1642288, -7722351, --9330816, 7410429, -448824, -20391968, -6377490, -473520, -27886686, -14913200, -8225399, 2020782, -21472688, -11033234, 43035572, -22501870, -3224984, 18078592, -19197430, 11650636, 2441689, -29521458, --44141528, -10843182, 11259794, 40223980, 17443472, -30862562, -13063143, -88550952, -29646012, -6421513, -18597208, 48029544, -2579128, -51536388, 2826625, 27919434, -10331544, -2487860, 29606284, 31149250, -71547176, -79177720, -15399068, 11144903, 19955492, -25046638, -29721710, -42385960, -42083164, -23584740, --19617800, -5595806, -3104725, -48978196, -20365124, -18022756, 17976586, -9342628, -4945118, 43898324, -33204930, 2542084, -6437619, -2160369, -27355184, -1360968, 9513889, -19807852, -10712722, 3554086, -12221329, -8508867, -9844065, -6706055, 13631689, -9375914, 14279693, 825171, 14738717, 10434623, -10532334, -8502425, 5173825, -20846160, 10308995, -2973728, 5926518, -18488224, -14462765, -2335925, -4321274, -10561325, -140123, -23405424, -4480725, -3111167, 9421011, 11864847, -15181636, 29759828, -106300, 10787884, 6152541, 21418466, 21298206, -1498944, 13295071, -25519622, 6718940, -10059887, --62293668, 14647449, -10263898, 18991272, -16876000, -17424146, 1804960, -25824564, 4948876, -26047366, --57982, -4191888, -9900436, 13153337, -19279572, -25356414, -23046794, -29853244, -4582193, -2906082, -34029024, 7820599, -23992224, -35992364, 5264556, -381178, 9152038, -6704444, 20820928, -23548232, --9015673, -33229088, -21013128, -9293772, 1611150, -13824426, 35506496, -11878269, -29420526, 9646497, -36841156, 26714160, 11274826, -25355876, -16223702, -2285996, 33510408, 63504312, -54761, 12758737, --11587822, -61495880, -13045963, 5934034, 23854786, 53064856, -28672128, -35470524, 21540872, 10261214, --11865921, 1964948, -19096498, 12433393, -51688856, -5731097, 3567507, 12970801, -30928596, 36621040, --50523848, -57897232, -53111564, 27376122, -10424959, 51448340, -70762272, -30838402, 6340446, 73117520, --5233955, -12728136, -39464844, -14439680, -4050154, 35377108, -2338610, 75162, 2749316, 6330782, -1352915, -302258, -14512694, -12715788, 17435956, 7610682, 2709051, -37958384, 10248329, -9616969, --3827353, -19564112, 1582696, -1586454, -2913599, -44727788, 4854924, -9763534, -4436701, -3723737, -8323647, 7516, 3491272, -154082, 984621, -537, 923955, -16245177, -2454037, -10413685, --8324721, 7936026, 8860518, -13030931, 1221918, -9261023, 12949863, -4433480, -20117626, 3221762, -36753644, 10874857, -67126040, -12328704, -46494096, 19996294, 3267933, -92053496, 5662915, -28657632, --59905668, -46626700, -68291056, 41427644, -21265994, -53739704, -24575266, 16864190, -32395864, -27855010, --22036940, -13134547, -24240796, -23848880, -43906912, -31700080, -59998544, -33870112, -30866856, -10361072, --28639916, -6109054, -13778792, -1169305, 1558536, 7542500, 15915538, -16716013, 13105556, 1343251, -29730300, 12941273, 18282066, 18879602, -56392384, -14949171, 43914428, -7984881, -28452548, -31519692, --23904714, 17580912, 71293776, -5097590, -1902671, -48678624, -50183472, -10730439, 9330816, 42789148, --3839164, 38970384, 13657459, -47837344, 84849760, 1315334, 65802120, -164819, -17995912, 35498980, --49028124, -62414464, -40786620, -137842144, -84461608, -27719182, 61938796, 38279968, -56251724, -36674188, --85418848, 41411536, 54633056, -43482248, -44268764, 9478993, 35647156, 52038360, 13466333, 29637958, --29263222, -15882252, -22403086, -32563368, -14468671, -3441880, 1737314, 743566, -18888192, 2141578, -10527502, 3282966, -4211216, -13356275, -10078678, -15161235, -6913824, -22111028, -6151467, 12411382, --22416508, -34600256, -6620155, -23023710, -16834124, -3502546, -30329986, -22987738, -7592966, 12671227, -12261595, 14719390, -2282238, -13287555, -4053376, 3940633, -9367861, 19947976, -1129576, 14305999, --1293859, -1436130, 13304735, 10633802, 15129559, 36419176, 21452824, 26664768, -23364622, -56738128, -65994856, 63124744, -39915816, -51758652, -255014, 56654912, -6158446, -3252364, -17667884, 49557480, --5521181, -13168907, -1242856, 13728326, 25380036, 740345, -19138374, -21662742, 30499100, 2339684, --13190381, -32599876, 18514530, 10334228, -3786014, -25667262, 8022462, 11175505, 9116605, -16190953, --9863929, 2982318, 25114284, -7304666, 8955007, -36968396, -10424959, 180389, 24311662, -51495048, --9339406, 5154498, 37034428, -17721572, 5633387, -26234198, 3461207, 11068668, -18284212, -13677860, --2297808, 6194954, 11178726, -11602854, 637266, -45838040, 24732570, -7518341, 42928736, -26546656, -19050864, -18006114, 19808390, 3924526, 13217762, 11559368, -33680596, 38067904, 7283191, 22050362, --37165424, 10477573, -9616432, 6085432, -10757282, 1682017, -2787971, 5258114, 12319577, -1748589, --15014669, -8559333, 3528853, -1760400, 674310, -5519570, -14651744, 5062693, 3557844, -4224101, --4347044, -24696, -4791573, 923955, -8113730, 0, -4115653, 6720550, 3478924, -2426657, --6113886, 2270427, -149787, -4847408, 3419868, -15526844, -462783, -1586990, 6708739, 537, -17865454, -11809013, -12611098, -3914863, 9269613, -12809203, 19178640, -16135655, 7939784, -7779260, -17451526, -15664283, 19235548, -10870562, 14966350, -13581760, 23455354, -22157200, 16898548, -4927401, -12643310, -11843909, 12430172, -13454522, 14077292, -13554380, 11254425, -9014599, 12492986, -9713605, -10415296, -9676561, 2931315, -3140158, 6311455, -4794794, 5186173, -4241817, 4224637, -3034931, -5826123, -3564823, 2267206, -2790118, 3100430, -2425583, 1115081, 488553, -19240916, -42899744, --57077968, 41793788, 27759984, -32510218, -46368468, -22673670, 21611738, 11380053, 28716688, 30903900, -6133750, -15440407, -4431333, 10873247, -10497974, -772557, 6470905, 1842541, 17344152, 12152073, -5326297, -15427523, -477815, -9517648, 10104984, -16167868, -13992467, 11905112, -3656628, -6525129, --6404870, -11210938, -15403363, 1281511, 12758200, 11649025, 9782862, -3583613, -12685186, -11005854, --7668664, 13904420, 18874770, -8654359, -13030931, -5579163, 15677704, 8149164, 20941724, -14636175, --5512054, 8338142, -3837017, 789737, -2142115, 7503845, 4528506, 6082211, 1345399, -13996762, -5927592, 2731062, -433255, 11032160, -5586142, -2680060, 1973001, -1901060, 1486596, -3970161, -18591302, 4769025, -1412507, 17750562, 17745732, -17830556, -27095338, -9838159, -18532784, 681826, -12393665, 3645354, -11053635, -13303124, -3503083, -2461553, 10778757, 5239860, 6747394, 10157061, -6195491, -5456756, 6271726, 4530654, -13006772, -17394618, 5326297, -4483409, 8797704, 6546067, --9542880, -2427194, -3193845, -3379066, -11101954, -5983427, -623844, 3680787, 5406827, 15012521, --7329899, -5383205, 3876745, -3296388, -4307316, 8843875, 368293, 19603304, -47634944, -125403920, --46101644, 22486302, 65233036, 137773424, 92197912, 23722714, 34942244, -18420578, -56082608, -93145496, --81036904, -64435784, -18580028, 2469606, 44824428, 49407156, 105197704, 51060180, 33675764, -2652679, --22422950, -50646256, -26291642, -40956808, -47215648, -29086056, -24336896, -1829656, 13157632, 39343512, -24333674, 28236188, 25683904, 25941602, 39046084, 3353833, 27056146, -5033702, -12139188, -32964948, --19625316, -49154292, -72321880, -63218160, 753767, -10768557, 19844360, 33960308, 18643916, 52395916, -45781132, 66227320, 37723236, 44907640, 2237141, 2187212, -35413616, -57905824, -67627480, -81226960, --53359600, -66387308, -5566278, -288837, 31961000, 33481954, 80232136, 62986768, 89620936, 36341864, -41909756, 17443472, -358093, -53494892, -87195888, -58430884, -69655776, -43438764, -47158740, -4438849, -7319161, 27814208, 36553928, 49466212, 50548008, 48551384, 31836446, 34757560, 9083856, -6337224, --11926050, -39210368, -35694936, -46939160, -33120104, -46922516, -35701380, -3764002, 8404177, 24684250, -37347960, 33252174, 34338800, 56484724, 20500416, 34473556, 26528402, -35676684, -64471756, -28008556, --56842280, -35904316, -19477140, -4107599, 5111011, 18074296, 32869384, 22803592, 35358856, 22369264, -19273666, 7709467, -2115272, -20561082, -6688875, -9667971, -35938140, -33678448, -9214315, -3845070, -1974611, 11789685, 13902272, 17510044, 14091788, 13838921, 5286568, 4650376, -111132, -7901129, --3817689, -2899103, -7912941, -12837120, -4249334, -6426345, -7367480, -877784, 3577708, 3899830, -6002754, 7105487, 8892730, 5690832, 4224637, 1312113, -700617, -2229625, -3507378, -4809827, --5105643, -3714610, -2746632, -2067490, -1822677, 41876, 975494, 1110786, 1637456, 1739462, -2630131, 3909494, 3933116, 1130113, 780610, 1054951, -507880, -2042257, -2685428, -3712462, --3187403, -2237141, -657130, -887985, -36507, 1539746, 1659468, 1575179, 2268817, 1816771, -1059246, 74088, 63888, 117038, -257698, -1005022, -863288, -1021665, -999117, -1023813, --650688, -391379, 114890, 441308, 841814, 932545, 733903, -30602, 353798, 511638, -343061, -132607, -598611, -794032, -656593, -408559, -60666, 222265, 530965, 369904, -141734, 164819, 227633, -165893, -328028, -277025, -264677, -208843, 12348, -11274, -26307, 100932, 104690, 48318, 19327, 10201, -9664, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ -7642895, -806917, -2076080, -2172180, 1324997, -3704409, -62277, -7210177, 5160403, 6544994, 4571456, -6441377, -7742216, 619549, 1764695, -2765422, -2129230, -1893007, -9066676, -1531156, 5382668, --9283572, -7543573, 4381404, 3972308, -5967320, -2084133, 3939559, 501437, 4790499, 2051384, -4990215, -3142306, 949188, 688805, -1334661, 2323041, 1822140, 3388192, 1416802, -1501628, -318364, 3786014, -1031866, -1727114, -649077, -4586488, -10122701, 6010807, 2911451, -3168075, -4429722, -1780264, 483184, -158377, 2053531, -2672544, -702227, 5973763, -5637145, -2259690, -1946157, 972810, -879931, -280247, 2610803, 296890, 2310156, -4014721, 4072703, 2097555, --5239323, 4163434, 359704, 1506460, -634581, -1557463, -6114423, -1891396, -467615, 3134789, --816581, 2563022, -1545115, 302258, 753767, 304406, 1809255, -327491, 114354, -224949, --1248225, -566399, 231391, -666257, 75162, -33286, -293668, 1666447, 1666447, 871342, -687732, 606127, 204011, 3758, 211527, 89121, -267362, -747324, -851477, -191663, --88584, 11988327, -6839199, 2134062, -7562901, 949725, 1812476, -7624641, -9651328, 2455111, --10474351, 2351495, -2705830, -689879, -6410776, -898722, -7203197, -3685082, 63888, -7622493, -8172786, 2901251, -12666395, 1242319, -665183, -2264522, -5403069, 2767570, 6623377, 166967, --452045, 6221260, -3600793, 114354, -2280628, 4134443, -4769025, 1443646, 5814312, -4997732, -5088463, 1813013, 5500780, -434865, 1271847, -793495, -2279017, 7199439, -8863739, 2085744, --3907347, -1676111, -1131724, -3204583, -2366527, -7056095, -4428648, -1074816, 4642860, -360777, -1759326, 6492380, -126165, -5569499, -696322, 234613, 1776506, -2703145, 31139, -5478231, -138513, -2212445, 1842541, 2894271, 4233764, 1531693, -2357937, -3064996, 4154844, -1354525, --1874753, 801548, 2318746, 4793184, 598611, 1395864, -293132, 2821794, -525597, -2184528, --1115081, -1067299, -83752, 1921998, 386010, -97711, -991064, 1862942, 10737, -660351, --498753, -442919, -520228, 899259, -353261, -64961, -1046898, -2835215, -9854266, -76236, --5921686, -1842004, -928787, -6916508, -909459, -1581622, 3495567, 8149701, 8203388, 1007170, --3442416, 3298535, -7857643, -1094680, -2978560, 2790118, -11731166, 4192425, 2041720, -396748, --3341485, -5044439, -2273112, -4156455, -3554622, 2234457, -739271, -4484483, -1267015, 943819, -7740068, -268435, -7718593, 636192, 3396782, -69793, -2393371, 671089, 2978560, -8417062, --603443, -3646427, 5985574, 3635690, 1060857, -7781944, 938450, 3028489, 4842576, 4499515, --5072893, -2391760, 290984, -1583769, -1549410, 4190814, -2528662, 2571612, 760746, -3263102, --678605, -4490389, 5491116, 2054068, -5300527, -3685082, 970126, 2859375, -4190278, -5354751, --847719, 278099, -3502546, 778463, -1397475, 1820529, -3333432, 5066988, 2779381, 3820910, -1160715, 509491, 3502546, 4647155, 614180, 1323387, -369904, 663572, 153545, -191126, -593779, 391916, 614717, -733366, 104153, 355409, -180926, 79457, 1626182, -903554, -433255, -1082869, -782758, -729071, 241592, 578747, 478352, 44560, -918586, -674847, -1672353, -16796006, 5485210, 4909685, 8195335, -2076080, 5162014, -14483167, -3929895, 4588099, -580357, -7146289, -1830730, -2354716, -12679817, -5120675, 1330903, -549756, -9028558, 5698885, -8092256, -8235063, 6316823, -10795400, -3642132, -940061, 3768297, -27917, -4349728, 3000572, -1522029, -694174, 4879083, -2313377, -3076270, -945430, -1738388, -3177202, 4800700, -3630858, -1389422, 3589519, -683974, -2807298, -5275831, -621697, -3752191, -1135482, -4372277, -1171989, -9862319, 222265, 6013491, -5459977, 5053029, -1546188, -7981123, -4714801, 4486094, -2898566, --4037269, 2947958, -4754529, 4012573, 1118839, -1459752, 5268851, 4733054, 2126546, -5167383, --5821828, -391379, 7856569, 1567126, 1230508, -4414690, 1200443, 2819646, -5912023, -2168422, -1984812, 4173098, 2112050, 3534221, -150861, 45097, 1345935, 177167, -621160, 223338, --460098, -742493, -2586644, -2098092, 692027, -1258962, -704912, 897111, 450972, 658741, --114354, 1087701, -647466, 60666, -876173, 18254, -1073742, 571231, 245887, 779537, --1415729, -8842801, -8396661, -5494874, 1229434, -1279900, 3675955, -2939905, 173946, 784368, --2387465, -807991, 2327872, -2371896, 10190347, -6412386, 4810364, -1564979, -515933, -4507032, --1113470, -488016, 7477001, -4834523, 824634, 1570884, -6996502, -4228396, -4725001, -4008815, --8137353, -2711198, 3160022, 5785321, 3741990, -6483790, -9184788, -1906429, 459562, -4616553, -1046898, -3089692, -4707821, -11436424, -5648419, -7973070, 4853313, -1955284, 3977140, -4519380, --11117523, -5844914, 734976, -2157684, -3528853, -1543504, -4269735, 6173479, 718870, 3652870, -4877472, 1330366, -15569, -3776887, 353261, 5245229, -701690, -3642669, -5060545, 8542690, --6811282, -9626095, -6714108, -3834869, -5240934, 6249715, 9940165, -7641284, -5180268, 1333587, -4918275, 7408282, 5938866, 4625143, 4617090, -1436130, -1749125, -2080375, -2103997, 1933272, --1215476, 621697, -1523640, -2627983, -933619, -1855963, 1650878, -1110249, -2266132, -1305670, --1226213, -2341294, -2537252, -1580011, -493384, 676994, 690953, 1416266, 363998, -4115653, -704912, -523986, -1505386, 628676, -539018, -1153736, -2578591, -2165201, 283468, 135828, --728534, -945967, 209380, -1174674, 935229, -1007170, -470299, -374736, -1768990, 2319819, --18468360, 5707475, -1298691, 3273302, 10144176, 3978750, -2495376, 3428458, -7611219, 4712116, -5548561, -10071161, -2132988, -5104569, 5697274, 4930086, 7726110, 8924942, -11587822, -5995775, -1940252, 9959492, -3757023, 4619774, -11071352, -3374234, -3861176, -2377801, -6686727, 1641214, --10954314, 7589744, -2119030, -1978906, 5606543, -362388, 1314797, 5881958, 207232, 4807142, -3292093, -1406065, -1856500, -691490, -7663833, -5697274, -6995428, -486942, 14720464, 3361886, -2896956, -389768, -1984275, -170188, 8827768, -1923609, 2810519, -16957068, 15627239, -3823595, --2704756, 837519, 9603547, 3409130, -1516124, -5857799, 16749299, -3277060, -119185, 5274757, --4136591, -94489, 2478733, -3825205, 3383897, 3196530, 13859859, -6925635, -8525510, -1662152, -4219806, -5260261, 1257352, 3477850, 1243930, -3111704, 1472100, 3563212, -2191507, 237834, --3824669, -1328756, -1040993, -3310346, 4345970, -3155727, -2471217, 1831804, 4832, -3729105, --197569, 773631, 1693828, 72478, 1973001, -1423782, -983548, -1182727, 1377611, -1454920, -2340220, 124017, -774168, 885300, 2443837, -4173098, -163746, -1162862, 7885560, 4374424, -8788040, -3671123, -2227478, 5017596, -8319889, 7280507, 8323647, -4335233, -820339, -13362180, -519154, 4453881, 3582540, -2914672, -9126806, -18401250, 185220, -3216931, -8791798, 1918240, -5727339, -8049843, -3494493, -8769786, 4273493, 390842, -1399623, -2986613, -3866008, 9233643, -10788421, 4132296, 5083094, -2534031, -5581847, 15090904, 3669513, -2697240, -9035001, 6472516, -164283, 8633421, -881005, 10693395, 5293011, 7451769, 6283001, 3153043, 8298414, 10387378, --410169, 1835025, -3460133, -213138, 5617281, 2292439, 3004867, -9382893, -3515968, -2061047, --8188892, -7829189, -5198521, 4225174, 8810052, 11558294, 15149423, 3295314, 1225676, 12193412, --5009006, -9367324, -3336116, -4792110, 7849590, 6404870, 2384244, -8875013, -2499134, 1470489, -1166621, -1802276, -4153234, 1145683, 925565, 4985920, -1324997, -2899103, 481573, 897648, -1138166, 7516, -32749, 921271, 2221035, -1729261, -1706713, 69793, -305480, -2390686, --634581, -3025805, 3113851, 955093, -2317135, -173409, 2078764, -1222455, -297427, -1828046, -863288, 1071058, -875100, 2712272, 2017024, -384936, 14025753, -13481365, -6387153, -1893544, -5318244, -12620761, 7829726, -12436615, 5983963, -136365, 6356015, 10102837, -4262755, 9217537, -10106058, 9586904, -5700496, 8070244, -8883066, -7121056, -1171989, -5528160, -166430, -4769561, -7927973, -6034429, 1683627, -5959804, -10350871, -4897874, -2239826, 12306692, -10486163, 9669582, -4231617, -14532559, 16467978, 3962644, 1773822, 11504070, 1992865, 409096, -6648610, -147103, --3741990, 13130789, 5527623, 9168681, -3681861, -2307471, 6328635, 10915123, -11595338, 11314554, -2027761, -1977296, -2209761, -10983842, 5179194, -5247913, 2155537, 361314, -9903121, 3203509, -8285529, -7698192, 5237713, 3339874, 11621645, 1115618, -836982, 6957847, 10160282, 702764, --5902359, 6725382, -7947300, -4246649, 2064806, -3331284, 2092186, -2697776, 975494, 4279935, -3186866, -3359738, 2781528, -1795833, 2237141, -2401424, 7074885, 578747, 6755447, -954020, -1671279, -1574642, -616328, -2308008, 4275640, 1664300, -3569118, 3563212, 4288525, -622233, --613107, 2485712, -205622, -370441, 3572876, -258235, 867047, 2167885, 1503775, -707596, -2731062, -2419677, -425202, 376347, 736587, 456877, -157840, -478352, -2730526, 1142998, -4062502, 1005022, -11422466, -8178155, 12395276, -15913928, 3994857, -8480413, 9436580, -10118943, -15422691, 5330592, 1486596, -13409425, 6818798, 11314554, 2991445, -6904697, -4478041, -3962644, -10521596, 5701032, -14687178, 2054068, -10389526, -597537, 1191317, -8905615, 11645804, 11659762, --5301064, 2535105, 7933879, -9709847, -1466195, -3010235, -8009041, 17019344, -6187438, -3845070, --8575976, -14374719, -2263448, 231928, -4942434, 2096481, -11855183, 1010928, 854699, -2415919, -9400610, -1993402, -7279433, 3761318, 15032, -5502390, 4708358, 20171850, -4019553, 4770635, -1127966, -13771276, -2204929, 12206834, 5552319, 12117176, -1214402, 6986301, -9654013, 4303557, -4318053, 1385664, -8196408, 7567196, 2732136, -21410412, 1708860, -3907347, 14332843, -5534602, -11141682, 10225243, 8309688, -1073742, 3221762, 433792, 886911, -1444183, -2297271, 5528697, -2312303, -129923, -3641596, -5230197, -1141388, 2162516, 3692061, 2541547, 4720706, 106837, --1186485, -1976759, -1423782, 1624571, 2859375, -315143, 2275259, 1380295, 489089, 1953136, --300111, 2043868, -3402151, -4381404, -5594195, -331786, 2683281, 1112933, -2572149, -1033477, --1768453, -2133525, 3581466, 997506, 1657321, 1402307, -25104620, 28077812, 3183645, 10995116, --20620674, 11034308, 14405320, -16913044, 6245956, 8156680, 6280853, -10980621, 1279900, 1766305, --3798899, 6179921, 12890271, -10608569, -8846559, -3331284, 10906533, 9407052, 13370233, -798864, -5566815, -10215043, -2776696, -2763275, 2070174, 6203007, 17130478, 10134512, 6140193, 3135326, --710817, 8100845, -3191161, -14967961, -3014530, 4207458, 4596689, -8822400, -6703907, -10890426, -1939178, -1003412, 3636764, -7191923, 12474196, 12175159, -10806675, 25227564, 1031329, -2483565, --276489, -5435281, -1273458, -1777043, -10392747, 18254, -98247, 6584722, -21485038, 5079336, --7697655, 15360414, 18607946, 7956427, 7657927, 3346853, 1125281, 16760036, -3296924, -12661564, -10580115, -5787469, 2747169, 8201240, 15117211, 1986959, 1382443, -12354473, -650688, 3413962, -9554155, -4358855, 5136781, 2378338, -3819300, 9667971, 1542430, 4248260, -2976412, -1061931, --2949569, 323733, 1018444, -1653562, -195958, 2803003, -1743220, 2842732, 1911797, -2248416, --329102, 1237488, -989990, 83215, -2116345, -6781754, -2006287, -1163936, 6827388, 8420283, -743566, 1107565, -2560338, -3022583, 627602, 782221, -3678640, -2937758, -1954210, -1775969, -2214593, -4123169, -278099, -3069828, 10419054, 2117956, -6991133, 6806450, 10147397, 8825084, -5636071, 10497437, -12432857, -7890929, 1562294, -11251741, -2681133, -1803886, 2669322, -2821794, --7232725, -9165460, -5426155, 4669167, 7965017, -13595719, 3043521, -1344325, -221728, -16405701, --14670535, -2497524, -11345693, 5506148, -12957379, 923418, 7159174, 10162966, -8786966, 12059731, -3207267, -1111323, -2493229, 17844516, -4801774, -810675, -14127758, -7955890, 11794517, -815507, -4561792, -13673028, -14890652, -4045859, -8333847, -1413044, 815507, -5486821, -6957847, 4297652, --6446209, 644782, -9574556, -5202279, -85362, -15986405, 1642288, 10622528, 2179696, 5607617, -11669963, 19772956, -18854370, 3525095, -11567958, -11355894, -6211060, -8616778, -5397700, -5063767, -19466402, 10669236, 10856067, 2271501, 3316789, -13894756, 863825, -4860829, 2415919, -6005975, -8723615, 11319386, 1291175, -5055714, -3274913, -9577240, 1066763, 5964099, 3472481, -2284386, -6301254, 2986613, 6660958, -1345935, -986232, 1101122, 4406637, -2642479, 1998770, -3906810, --5275294, 3998615, 1633698, 851477, 1091459, -7435126, -4231617, -6442, 5953899, -4804995, -3088618, -6451041, -1950989, -1009317, 2513630, 1582159, -1710471, -1557999, -8391829, 3684008, -20176146, 21372832, 23446226, -16902306, 1559610, 12788802, 10126996, -9744744, -18935974, -1930588, --2570001, -14818711, -8452496, 29025388, 2554432, 2275796, 11039140, -929324, 4887136, -3642132, --11099269, 7822209, 6563784, -15098958, -21626770, -16660178, -13208635, -12530567, 1522029, 4065187, -6805913, -8221105, 8661338, 2338610, -3912715, -8716099, -23085, 838592, -13688061, -10598906, -1881733, -2185602, 2182917, -8123394, 7116761, 2472291, -7696045, -16747688, -6487011, -5423470, --22464290, -6817724, 2390149, 11585674, -826244, 13656922, -2090039, -765041, -19113678, -3760781, -7868380, 3992172, -32160178, 9652939, 3059091, -8672613, -5247913, -9059697, -10394358, -54761, -735513, -9907416, -3070902, 6938520, 9693204, 15266461, -11142756, 927713, 8639864, 8053, --24551644, -19368156, 4295, -4835597, 6437082, 214748, -5868536, -8473970, 4322348, -2151242, -3945464, 10541460, -52076, -4597763, -8224326, -15075335, -5068599, 1367410, -2348810, -2186138, -1230508, 1446867, 7100655, -3093987, 931471, 3031173, 1574642, -5151814, 853088, -969589, --13276818, 1835562, -4786204, -5622649, 2388539, 2128693, -3886409, -805843, 5053029, 1897302, -1484985, -4490389, -5454609, -1486596, -237297, 801548, 3643743, -5913633, -520228, -3706557, --2312840, -4874788, 8249559, -6431714, 22857280, -18993420, -11588896, -3609383, -36208720, -18747532, -188442, -22945326, 18351858, -7857106, -7260642, 2397666, 41649372, 20299090, 1551557, 8831527, --1655710, -10764799, -841814, -16837346, -12174622, 6260989, 6259915, 7773354, -11688753, 15649787, -9608379, 17663054, -17343078, 3187403, 25884694, 2762201, 1285806, 5429376, -24363738, 6649683, --5989869, 4420595, -9681393, -22840636, -1205275, 9766219, 11649025, 3347390, -3419331, 2076080, --861141, 8087961, -17336636, -25121264, 4758824, -8913668, 15422154, -5691369, -6157910, 20306606, -4658429, 8970039, 1763621, -16405164, -6729677, -1591285, 9244380, 26671746, 20360830, -5598490, --23046794, -46171, -2518462, 9031242, -14159433, -17484274, -10037875, 8935679, -18030272, -2386391, --15111306, 550830, 12410308, 84826, -22724136, -4559108, 3149285, 6481106, 2961917, -13768055, --9493488, -14762876, 2467996, -2712272, -6524056, -4595078, -6524592, 1789928, -2669859, -5822365, --1707250, 4977867, 58519, 310848, -7673496, 337155, -653909, -4406100, 477278, 10063645, -3249680, 2275259, -9753871, 4362076, -1032403, -578210, 1583769, 327491, -155156, -1450088, --5807333, -5937256, -5319317, 7193534, 5791764, -2094870, -14555644, -4799089, -5400922, -589484, --7751342, -41739028, 15823196, 12939663, -6300717, -27665494, -6257768, -10795937, -11325829, 11880953, -14763950, -1759326, 3899830, -31416612, 10800769, -39266200, -10057203, -3621731, 7599945, 19407346, -31022548, 12710956, -18225694, 3959960, 21629992, 2659122, 6469295, 11582453, -18512920, -7329899, --3052111, 5319317, -13083544, -7208029, -4070555, -9969156, -7556458, 12991739, 12860743, 3078418, -941672, 22165790, -4357781, 10207527, -25495462, 16546898, 4678830, -23267448, 2221035, 7090991, --21740050, -3070365, -21262236, 6788196, 8785356, 9209484, -14349486, -1513439, 14096620, -12137578, -56371, -2207613, 23347980, -14188961, 17176112, 8449274, -21955336, 18877456, -16189879, 12032888, -16175384, -16755204, 9181029, -14347875, -17535278, -26627186, -22025666, -24383066, -5827197, 3948686, --7320772, 20680268, 21757768, -9585830, 19168440, -3310883, -4130148, 24109798, -5516349, -16771847, -11344082, -2838974, -12874701, -10239202, 9613211, 1328756, 4955856, 7263864, 1298154, 5899138, -9680319, -3008088, 10863583, 7089918, 5396090, 5783174, 866510, 3382287, 9233106, 7036767, -9364102, 964757, 7771744, -1906966, 508954, 6354404, -3403762, -12702366, 5766531, 1484448, --9664, -224412, 5510980, -11323681, 5546414, 7129646, 6176700, -7689065, 6323803, -33299956, --15965467, -16601659, 28340342, 443992, 10331544, -5106716, 40367324, 6009196, -27659052, 1563905, -29551522, -11533061, 6261526, -5384279, 2185602, -17951890, -24041080, 37048924, 26269630, -10706280, -20068772, 7607998, 26230440, 29845728, -9261560, -7597261, 26526254, 19296752, 1782411, -8966818, --13793824, -14499810, 12063489, 23298050, 10759967, -4793721, 15560130, -8860518, 14748381, -7243999, -21692270, 38679940, 29402272, -32351304, 14162655, -5906117, -13396540, -897648, 10698227, 10253698, -71093520, -7701950, -1160178, -12123619, -13106093, 13443248, 25419228, -6813966, 19223736, 16281147, --2665564, 106300, -14333380, 13686450, 11499238, 37549288, 38270308, 46488728, 19100794, -12494060, --10143102, -22093312, 20662550, -32440962, 22684406, -30483530, 17199734, -11081552, -18454938, 12527883, --48966384, -38911328, 6571300, 7028714, -14317810, -13986561, 22214644, 10766409, -21254182, 2573759, --5172215, -11928198, 3304441, 5311264, 1352915, 5386963, 6525666, 11698954, -6091874, 1851131, --7276749, -12673375, -7842074, 2368138, 629213, 16232829, 3155727, -4601521, -14018236, 1610613, --5813775, -4922033, -6470368, 4140885, 9692667, 3029026, 8357470, 6801081, 11186779, -5443334, -8424041, 605590, 2159832, -1364189, 341450, -7396471, 7740068, 18891414, 10034654, -2639258, --2581812, 16175921, 13660680, -11278047, 4492536, 8491687, -5342940, 23117662, 5710696, -51896088, -12696997, 7584912, -38488276, 3005403, -6087043, 2328409, 14945949, -1187559, -35544612, -5705864, --10922639, -1306207, 26192322, 31453120, -16901770, -3678103, -14099304, 8301635, -27125940, -52989160, --18685256, -15482283, 3379603, 1631014, 24984362, -35976256, 18045842, -7784628, -3524558, 15848429, -7615514, 26311506, 6344741, 10604811, 27843200, -30455076, 39475044, 31717260, 16631724, 29801168, --10779294, 11804718, -26700202, -4622459, -13206488, 24835648, -20839718, 5939403, -45296336, -55945172, -38339564, -950798, 24892020, -16428787, 16622597, -10450192, 3945464, -5646809, -36751500, -10941429, --24434068, -10984916, 13873281, 55938728, 20082730, -47818556, -10610180, 13696114, -10882373, -6466610, --31753766, -15802258, 25200720, -8477192, 6379637, 5705327, -19667192, 13497472, -2570001, 1804960, --40760852, -11142756, -533650, -17957258, -10324565, 2392297, -27494770, 3737695, 6545530, -21674552, --17402134, -30943628, -23399518, -1366873, -12833899, -5450314, 1080184, -8261907, -8705362, -2889439, --13771276, -5887327, 2061047, 10398116, -12133819, -3579318, -20961588, 8341364, 5435281, 13324062, --8561480, 13824426, -27222040, -769336, 189515, -1071058, 4371203, -3601330, 3073049, -11870216, --13200582, 968515, 5485210, 489089, -10383620, 3747359, 3213173, -32349156, 17044578, 16993574, -30245696, -14798847, 11097659, -17011292, -19687594, 8731669, 40186936, 65001644, -4016331, -4385162, -1415192, -1523103, -28939490, 45441828, 21932250, 24123758, 18740016, -13285944, 15887621, -25774636, --36856724, -6500433, 27763742, 17863842, -13113609, -8672076, -1719598, 22237194, 1068910, 16161425, -16115791, 26341034, 8976482, -16850768, -15687368, 14972793, -17669496, -13486734, 8016557, 28913720, -27017492, -30879742, -23540178, 15600932, 19066434, 57007100, -13082470, -31402116, -32087700, 27143656, --20448340, 25586730, 29451664, 58629524, 125220848, -28218472, -15677168, -47116864, -74298104, -24069534, --37274948, 4002373, 52123188, -7930120, 27749246, 38837780, 25971668, -14803142, -45863808, -75967768, -42547020, -3322694, 48361332, -25037512, -65227132, 22519588, -38500088, -52144124, -26193394, -16866874, -16884590, 15849503, 29901562, -2608656, -13931263, -2707440, -769873, -27220428, -25503516, 12761422, --8725226, 26002806, 24590298, -11999602, 24501178, -19402514, 1036161, 23164906, 3068217, -37358164, -10371272, -19084688, -2671470, -6511171, -4364761, -27721866, -21641266, 3748970, 32841468, 33950644, --31709744, -4433480, 40008156, 37050000, 734976, 7307350, -34916472, -19571092, 6017249, 20143396, --30034706, 7180649, 24789478, 11335492, 9904195, 1985886, 15991237, 22781580, 12150999, -3463891, -4209068, -24753508, 5171141, -22518514, -62959924, 16456704, -26035018, 26817238, 4336307, 15193447, -13346074, -57531088, -40653476, -19862076, -12330851, -12984223, -23265300, -6868727, -38953204, -24584392, -19397146, -25140054, 49272940, -35811976, 4175782, 10588168, -3427921, 4823249, -1664300, 12200391, --10896869, -11669963, -1688459, 9283572, -1116692, 21487722, -19349364, 5008469, 31016106, 10358387, -4999879, 16138876, 2339147, -11904039, -7537131, 25398290, 5970005, -38679400, -17005924, -31272194, --14105209, 42787000, 39747236, -40070436, -4110821, -45635100, -10757819, -3247532, 11041824, 23779086, --37491308, 25869124, -31864900, -4841502, -21471078, 49216032, -9458055, 34901440, 32422172, 71979896, --32508608, 30062624, 5145908, 28601260, 10115185, 21978958, -35405564, -32185948, 48010220, 2987687, --1455457, -33085206, 38821672, -12351789, 20077362, -34843996, 75006232, -39321500, 41868952, -49400176, -20114942, -37055368, 21178484, -34076272, 26107496, -21314312, 15460809, -11572253, 8649527, -18011482, --11293080, -8134668, -2043331, 7382512, 1447404, 6107444, 723165, 6024229, -2551748, -8794482, --14889041, 7664369, 7811472, 2979097, 7173133, -4862977, 2953864, -3676492, 3087008, 26501558, --6230924, -17594870, 2837900, -9599252, -19441170, 7099044, -10524280, 8709657, -8797704, 7395397, --16978006, 7854422, -22016540, 14797236, 32257888, 5945846, -56051472, -24031952, -34308736, 3098282, --7174206, -76059040, -33950104, -19098646, -40024800, -24470040, -76687176, -64516852, -10896332, 29090350, --41765872, -24464670, -5238787, -35352948, -7376070, -1854352, -34250752, -8333847, 8187282, 2809446, --45778984, -25529822, -25697864, -13743358, -15586973, -3696893, -31488552, 28142774, 18603650, 39716636, -57140780, 49953692, 13443785, 52759916, 21669720, 10316511, -21991844, 19209242, 19781546, 16005732, --5021891, -16565689, -7233262, 14075145, 23949812, 119257824, 16995186, 25492778, 18344880, 49469432, -19685982, 43604120, 78221016, -36071284, -74626664, 10613401, 49328236, 87534120, 39274792, -73326904, -11101954, -17354890, 109931832, 81397144, 98470712, 90629712, -76586248, -49923628, 64742872, 77786688, --21246666, -43140264, -52604224, 121950768, 81408424, -3844533, -102709312, 26230976, -2865817, -21717502, -29727080, 9084930, -7928510, -20881594, 738734, 17762910, 45991048, 33282238, -25531970, -9330280, --5955509, -4284230, 26549340, 19869592, 20897164, 1758252, 11818676, 42812772, 29296508, 7332046, -17835388, -9767293, 21947282, 28271622, 36383204, 46302432, 36264020, 28407988, 1777580, -4354023, --7570954, -1293322, -18269180, -9139154, -7845832, -22765474, -30268246, -34422552, -60958472, -33574832, --21412022, -35668092, -67876056, -46369004, -39075076, -45615772, -54954108, -57827976, -18354006, -20566450, --30636002, -15802258, -17985712, -10758356, -16540993, -15659451, -15633681, -11038603, -14913737, -8804146, --11905649, -8205535, -9474161, -4892505, -10787347, -661962, -10654203, -14405320, -19047644, -55984900, -89550072, 72307384, -62753768, 13925358, -1546725, 10008884, -2543158, -6264747, 22971632, -23256174, -22428856, -9247065, -38118, 8860518, 7140920, 7996156, -199179, -13190918, -8543764, 14376866, --11996917, -1560147, 13755707, -7628936, -8087424, -11083163, -20382842, -20350628, 14702747, -7445326, -5375689, -12809203, 2393371, -27133456, -5058398, 7393786, 17279190, -11119670, 3637301, 11929809, -18932216, -4608500, 15640660, -12875775, 50216220, -18745922, 17194364, 2291902, 9654550, -9469329, -13170517, -5383205, 35715336, -5887327, 10922639, -25099788, 32743756, -17348446, -1553168, -4888747, -4581120, -9846213, 19566798, -22836878, 18367428, -20927766, 26931056, -28410672, 34207268, -22895396, --12613782, -14349486, -7482907, 1384590, -22939420, 14784888, -13721347, 12975096, 746787, 17931488, -6430103, 12414603, 21478594, 9452686, -7908646, 5922223, 4978404, -3047816, 3550864, -6754373, -7500087, -3754875, -358093, -6590628, 14937359, -15068356, 1003412, -1265405, 12009802, -2247342, -2114735, -2768643, 4540854, -7035157, 5053566, -5982353, -3716221, 11911018, 10077067, -3005940, --11156714, 7070053, 8821326, 10283225, -9771051, 8068633, -6952479, 6138045, 825707, 2535105, --10517301, 10877005, -4558034, -12102681, 9652402, 10157061, -9035001, -1322313, -2520072, 3102040, --8841727, 11764452, -11287711, 4388920, -12305618, 10839961, -9156870, 9398462, -7572028, 11461120, --12918725, 13728326, -12785044, 7002408, -10838350, 10714870, -12283070, 9883257, -8145406, 12229919, --13602698, 13637058, -12063489, 11424613, -9146670, 10601590, -9862319, 9051644, -7923141, 7361037, --8099235, 7096897, -7517267, 7987029, -8238821, 7865159, -6879464, 6964290, -7106561, 6679211, --6463389, 7480223, -6381785, 7296613, -5342403, 6330245, -5215164, 5325760, -5482526, 6524056, --4828617, 4996121, -3924526, 5651640, -4201015, 4116189, -3739843, 2783139, -2858838, 3567507, --2429878, 3813394, -2928631, 3885335, -2945274, -21910238, -45354856, -49906448, 42559904, 10810970, --13088376, -67655400, -27162984, 37809132, 7754564, 27328876, 30455076, -10899016, -19043884, 975494, -7259032, 5662915, 5093295, -11908871, -8752606, -6583111, 82678, 18394272, 9949829, -820876, -4166655, -5215164, -8819178, -5595806, -4598836, 392990, 5452461, -4105989, 7022809, 7395397, --24838332, -10992969, -10972568, 13338558, 9273908, -781147, -11548093, -15604153, 13670344, 3064459, -9175124, 12779675, -23041426, -15304042, 4233227, 18629420, 9403294, -26199300, -16156593, -21276194, --10155450, 5537824, 4832375, -8736500, 9660455, -3918621, -9192841, 4158065, 8800388, -6527277, -2096481, -217970, -8220568, -716186, -2906619, -18599356, -18821084, -1126355, -20080046, -15022722, -625455, 6118181, -4388383, 22174916, 16340740, 9344238, 683437, -2095407, -9873593, 12294344, -5990943, 7183333, 6892886, -6178848, -2633352, -443992, 3496104, -11581379, -14153528, -1923072, -6191732, 942745, 7841000, 5509906, -7399692, 2448131, 4297115, 3075197, -2406256, 7894687, --9844602, -5825587, 18009334, 10392210, -11149735, -8324184, -5698885, -9886478, 10912438, -350040, -1522566, 5050882, 3205656, -98784, -472446, -7366406, 4648765, 2833068, 6404870, -3626563, --1137093, 4216584, -467078, -4865124, 17603460, -43889732, -119597656, -45456860, 27228482, 57605176, -135826192, 79844512, 21707302, 28443420, -23544474, -43951476, -96218544, -64855080, -49749144, -16258599, -19710678, 52969832, 41136660, 51425256, 49648212, 33692944, -11370389, -39173324, -33960844, -34847216, --28055264, -40397924, 12395812, -25528212, 1855963, 18830210, 34720516, 19644644, 32497334, 42927660, -779537, 12829067, 925565, -629750, -23997592, -3140695, -21357798, -41599980, -65758096, -36571648, --20083268, 5340255, 4970351, 39119100, 54206244, 52197812, 62039192, 9082782, 40701256, 16194711, --3710852, -38144680, -37465536, -50746112, -66733592, -45414448, -51722680, -32668058, 150324, 16078747, -37087580, 60052232, 88310968, 70868032, 64095944, 34803192, -13290776, -13013751, -34743064, -73721504, --56751552, -93176096, -61374008, -27088358, -20738786, 29219736, 55914568, 76793480, 54081156, 41544680, -25140054, 28824062, 25190520, -3951907, -29118804, -27618250, -43774308, -48277044, -38566120, -26242788, --24559160, -23181012, 10590316, 22772990, 40052716, 47722992, 38987564, 34430604, 19511500, 789737, -912681, 4541928, -29020558, -48980880, -20198158, -42761232, -48688288, -1525787, 12060805, 27204860, -27924266, 18027588, 29516088, 17330730, 23592792, -4872104, -601295, -20654498, -12605192, -10909217, --13858786, -15613280, -12814572, 2238215, -5405217, 174483, 14308684, 20166482, 12486544, 11132018, --2901787, -3350075, -312459, -137439, -6236830, -7050726, -1332514, -4100620, -4500589, -2435247, --46171, -4284767, -1619740, 9019968, 3000035, 4254702, 5668820, 4853850, 1740536, 1660005, --1074816, -3818763, -5586142, -4014721, -6545530, -5371394, -1459215, 1023276, 2261300, 4454418, -3533148, 3265249, 4241817, 2949032, -1825898, 780073, 1706713, -1261647, -3488587, -3667365, --2982855, -232465, -1333587, -2130841, -1321776, 1217086, -141197, 1245541, 3205656, 3160022, -2630668, 1465658, 234076, 48855, -992674, -945430, -1580011, -1459215, -1132261, -970126, --1589138, -840203, -823023, -603980, 463320, 1924682, 1089311, 1620276, 1845225, 1533840, -927176, 237297, -589484, -1021665, -1619203, -1198296, -1356136, -1244467, -443455, -28991, --504659, 249108, 1144072, 1394791, 908386, 567473, 618475, 690953, -158377, -599685, --666794, -564251, -517544, -256087, -206158, -27380, 44560, 108985, 33823, 61740, -52076, 56371, 16106, 21475, }, -{ -8093329, -5188321, 158377, 290984, 6376416, 1604707, -3152506, 2183991, 4246649, -2122251, -3498788, --12596602, 684510, -4220342, 8437463, -4155918, 4235375, 3432216, -430034, 2780455, 4671314, -1301375, 1097901, -2270964, -2764348, -2117419, -3485903, 3074660, 1821066, -1617055, 2748779, --1864553, -2786897, -3300682, -1604707, -2600066, 228707, 76773, -486942, 5808944, -3336653, -4758824, -1703491, -1164473, 3172907, -1926830, 993211, -1926293, 3477850, -987843, -9861782, -2971581, 346819, 1249299, 4962835, 2603287, 359167, -1086090, -3260954, 8484171, -4465156, -3324305, 1719598, -3452617, 3555696, 1623498, -4126927, 3314104, -4256850, 285078, -440234, -3766150, 613107, 3935264, -1501091, -8671539, -1864553, -2060511, -4140349, -3666292, -3674345, -3051038, 1324461, 1097364, 1826972, 1868311, 363462, 909459, -1021129, 654983, -753767, --300648, -2127620, 17180, -707059, 1657857, -157840, -463856, -325881, 217970, -1103270, -425739, -479426, 645319, -352724, 159451, -1271847, -108448, -1589138, -926639, -907312, -1342177, 15291157, -7649337, 782221, -528818, -517544, 3424163, -2832531, -11099269, -10234370, -4713190, -3285650, -1014149, 2525441, 490700, 2491618, 2786360, -4913443, 2541010, 1733019, --3505767, 3942780, 5973226, -4023311, -1376000, 225486, -6606734, -3027415, 577673, 7722888, --1339493, -517544, -6583648, 3767223, -79994, -5911486, -2576444, 1946157, -970126, 1050656, --5129265, -204548, 257161, -2139431, 5301064, 1279363, 1121523, 5119601, -630286, 6673843, --2361158, -8679055, 3381750, 3277060, -3115462, -1406065, -1144609, 979789, 293132, 2308008, --2060511, 1497870, -4779225, -297427, 2987687, -4570382, -618475, 2550674, 746251, -2431488, -1451699, -1862405, 394600, 4313221, 1492501, -6133750, 7256884, 2672007, 2616709, -712428, -4141422, 4611185, -2122251, -374199, 957778, 1124745, 1392643, 1899449, -279710, 82141, -1399623, -292058, 136365, 845572, 2214593, -447213, 2257005, -167504, 488553, 1114007, -239444, -754841, -264141, 737124, 720481, -214748, -1112933, -3708704, -8958228, -1068910, -965294, 9891310, -3767223, 8477729, 2126009, -287226, 526134, 7584912, -1762547, -2072859, --2194192, 5346698, 10856604, 2845416, -7485055, -10155987, -14450954, 1896228, -3774740, -6073621, --3334505, -9418326, -44560, -4369593, 710817, 4526359, 4765266, -5368709, -4810364, -3413962, -604517, -7990250, -871878, 2488934, -3619584, -1314260, 840203, 3227131, -4490925, 1176821, -10566156, -433255, -512712, -3889630, 4400731, -1955284, 389231, 3363496, 4376035, 6505265, --1037772, 964757, -1957968, -82141, -1110786, 865436, 10151692, -11273215, 252329, 2198487, -5998459, -2488934, -2985002, -657130, -2818036, 8116952, -4468377, -10625749, -736050, -3166465, --4451197, 2645700, -10523744, 3894999, -1125818, -2916283, 212601, 7438347, -2202245, -2789581, --2866891, 3568581, -3341485, -901406, 627602, -299574, 1282585, 123480, 501437, 2211371, -179852, 581968, -551366, 1778653, 390842, -348429, -2000381, -1070521, -150324, -1046361, -2057289, 1257352, -1172526, 1539209, 155693, 231391, -1089848, 576599, -478352, 52076, -531502, -16510928, 6165426, -5166309, 6919729, -6222334, -563714, 4786741, -9547712, -1644436, -2912525, -2604361, 13914083, -5843303, -1760937, -5574868, -4654134, 7141457, 7952132, 3069828, --9362492, -11311333, 10456098, 1745367, -10590852, 3949223, 392453, 5004174, -3139084, 4773856, --6335614, 3080565, 10235444, 4218195, 4386236, 2313377, 182536, -2615635, 2141041, 787590, --6978785, 106300, -2210835, -5140539, -5115843, -1955284, 4046933, -7373385, 1008244, -5337571, --543313, -825707, 2433099, 4355097, 9248675, 3252901, -50466, 3961571, -4938676, -7283728, --126702, 1682017, 759136, 8773544, -1995549, -1086090, -2805688, -1254667, 1253057, 4254702, --1153736, 1771674, -4354560, 7097434, -1861332, -2496450, -1636383, 2291365, -3854196, 108448, -4402342, -325881, -1256278, 637266, 3499325, 2739116, -537945, 2205466, -1883343, 1391033, --1136019, 532576, 2508798, -895501, 1077500, 1050120, -1697586, 1698660, 1059246, 367220, --722091, -1567126, -360777, 1901060, 1286343, -685047, 782758, -388695, 3156264, -301721, --863825, -8252780, -1925756, -5356898, -547071, 10960220, 7005629, 4894652, -833224, -9647033, -1345935, -6347962, -10225243, -3394635, 7358890, -5775658, -9066676, 2368138, 777926, -4517232, -968515, 5159330, 1421097, -12085501, -3425237, 7594039, 8945880, 4460861, -10015864, -3634079, -4563940, -1707250, -2156611, 649077, 3352759, 539018, 1239098, 10277320, 19327, 6216429, -4818417, -79457, -4628364, -113817, -2731062, 6127308, -3504693, -5846524, 13422, 9614284, -539018, 9550934, 5147519, 926102, 6170795, -1040993, 13260175, 1069984, 6560026, 7473780, -691490, -6179921, -948651, -7393786, 3773666, -5298379, -2972117, -4885526, -3222299, -2344515, -2426657, 820876, 3653407, -151398, -4224637, -3677029, 1373316, 6831146, -2024540, 1690070, --7332046, 2323577, 6334540, 9727027, -3351148, -723702, 1610076, -3344169, -253940, 3211562, --984621, 5899675, 388158, 1343251, 147103, 281320, 2175401, -1436667, -934692, -765578, --443992, 597000, 730144, -1109712, 964757, -337155, -1177358, -1432372, 485868, -1359357, --896574, -1705102, 831076, 1183800, -246961, 3328600, -2157147, 588411, -234613, -1883880, -3167002, -911607, -448824, -1653562, 1797981, 1185948, -289373, 482647, 1586454, 10007811, --14944339, -2750390, 12524125, -6211597, 2292976, -9658308, 4259534, 17617418, -2379412, 934155, --741956, -12441447, 1007707, -789737, 18693308, -5895380, -912144, 8173323, -5149129, 11587285, --7808788, -1163936, -11807402, 13354664, 185220, -5251135, 170725, 4894652, -6207302, 9285719, --986769, 8230231, -58519, 4313221, -12906914, -8303246, -6022081, -1931125, 7780870, -11693048, -6252936, 4835597, 1631551, -4838818, -7053410, 16087874, 3194919, -1819456, 6238977, -5678484, -3381750, -7561290, -7431367, -3092377, -4990215, 17374754, 5186710, -3446711, -5163625, -6621766, -5459441, 4515621, 1641214, -6106907, -748398, -2471217, 7420093, 675921, 6001680, -14021458, -7627325, -1224603, 374736, -1555315, 2465311, -6185827, -2881386, -9721658, -3186866, 3544959, -5932424, 6279779, 2317672, 2292976, 1462436, -3474092, 2072322, 1435593, -261456, -2326799, --3887482, 2083059, 1934883, -2959233, 1527398, 220654, -2454574, 1619203, 441308, -1036161, --586263, 168577, 469762, -1790465, 1247688, 709743, -2828236, -641561, -1456531, 249645, -1977833, 1384590, -308701, 106837, -1320703, 3173981, 258235, -1082332, 6433324, 3219615, -5320391, 1645509, 161061, -1884954, -7908109, -2392297, -5066451, 3248606, -204011, 12134893, --10022306, -12938589, -3205119, 4145717, -3979824, -3068754, 10330470, 2138357, -5581310, -6444599, --6685117, 11283953, -5573794, 7650948, -3580929, 8362838, -8196945, 1893544, 12793634, 4428112, --17270064, 4062502, 455267, -2151779, -1480153, 1847910, -2008971, 1750736, -2768107, 1454920, --643708, -7683160, 7821136, 8026220, -2313914, 8883603, -7465190, -1240172, -2108292, -3520263, -9767293, -6924024, -12322261, -6876243, 2388539, -10035728, -9349070, -4641249, -3117610, -6405944, --479426, 8346195, 8785892, 1398549, 9467182, 3004330, 1323387, 7192460, -7565585, -1277216, -63888, -6203007, -537, -6007049, 7407208, -2047089, -1278827, 6172942, -1058173, -1858647, --1200980, 7357816, -829466, 2611340, -7037841, -2452963, 4034048, -4540854, 401043, 194347, -852014, -3444564, -2362769, -1781338, 178778, -1857037, -2224256, 798864, -285615, -1992328, --838592, 336081, -153545, -573915, -634045, -1117765, 442919, -3745212, -2588255, -2500208, --2477659, 100932, -77846, -836445, 994285, -1886564, 19265612, -9606231, -9250823, 6163278, -15644418, 2994666, 14082661, 8016020, 12782896, 5634997, -2469606, -5891085, 4534412, -9659918, --7373922, 10667625, 8899709, 22352620, -647466, 3064996, -8370355, 8602819, 3849365, -10037339, --2440078, 12640626, -114354, -14030048, -5721434, -7938174, -2752537, 7752953, 7088844, -5347771, --2646774, 9684614, -9502078, 4286914, 8121247, 9755481, -5305359, 8392903, -3638911, -12773770, -4423280, 11653320, -3201361, 3339874, 2781528, -3997004, 1355599, 3470334, -3706557, 1272921, -9395241, -5604396, -3017752, 8709120, -1946694, -1792612, -14561013, -5153961, -8820252, -14402636, --9754408, 7195144, -4783520, -6168110, 12387759, 12436615, -3214246, 13378823, 5304285, 8784819, --2537789, -6943352, 5726265, -7198902, -14416595, -8658117, -3752728, 7070053, 3204046, 11860552, -2035278, -2567854, -1983738, -12885, 2000381, -3696893, 179852, -2149094, -369367, 2080912, --418222, 332860, 3783866, -1394791, -751619, 3818763, -2862059, -1433982, -1913945, 1132798, --2127620, 1398549, 801011, 602906, 1957968, 2576444, 1116692, 4644471, 518617, 3179350, -1031866, 2393908, 2690260, -2387465, 2133525, 2354179, -1729798, -506269, -280247, -3338263, -930934, -1723893, -9765145, -10446971, 14132590, -2364916, 32294932, -13312788, -6259915, -752693, -7878044, -4515085, -4402342, -13318694, -15398531, 6942278, 1336272, 21243446, 6886980, -2182380, --2425046, 14106820, 14416595, -11923366, 8654896, -11390790, 2995740, -4913980, -5860483, -3506304, -2426657, -1865626, 7493108, 3737695, 8384313, -1059246, -3991098, -7881802, -1515587, 9140764, -828392, -12181601, -1521492, 2944200, -5185636, 9621264, 8153996, 1677722, 2845416, -26582090, --10162966, 9267466, -607738, 14894410, 4177393, 16790638, -1871532, -9109089, 8992588, -5100811, -6140730, 1075352, 24506010, 20234128, 2411087, 5715528, -3315715, 8038568, 8564702, 9222369, -10008348, 16226386, -273267, 2902861, -6200322, -5436892, 5113696, -7606387, -18807124, -13978508, --299037, 11688217, -5875516, -10663330, -6089727, -5755256, -607201, -12728672, -479963, 2352568, --53687, -1722819, -1218160, 1310502, 2780991, -354872, 2105608, -9506910, -5789616, -3041374, --6699075, 588411, -2396055, -3932043, -2602213, -1607928, 3884261, 1564979, -3570192, 1174137, -8546985, 4371203, -1757179, -3039763, -3832722, -2260227, -3080565, -6659884, 2487323, -2573222, --491237, 4824859, 1624571, -962073, 976568, 1850057, -28014998, 22151294, -610959, 2541547, --7742216, 12429635, -26597122, -17041356, -5355824, -6812892, -620086, -23845658, 4697084, 513249, --616865, -10877542, -11069741, 4537633, 15235323, 2379412, -20275466, -4377109, -16597364, 13153337, -8499203, 682363, -7335268, -3459059, -3732864, 10842645, -1518271, -197032, -2318746, -14685567, -7668127, 10331544, -6140730, -3271691, 8045011, -15988016, -11641509, -17641578, -5959804, 4463008, --11240466, -5360656, -454193, -18271328, 5615133, 11301670, 19998978, 2893734, -1957968, 1243930, --13111461, -10285910, 15316390, -1075352, -5789079, -3598646, -23387170, -12548284, 4605816, -4933844, --2706903, -1814087, 15341623, -2646237, -14534706, 1177358, 11365020, -284005, -7118909, -133681, -804770, -6009733, -10188199, 8025684, -18750216, -9286256, -120796, 9075803, -11454678, 7258495, -4824859, 6612639, 7060926, -7208029, -1807108, 8642548, 1668058, -5287642, 4972499, 7150047, --6676527, 2480344, 6426882, 6053220, 9528922, 633508, -2902861, -1636919, 1567126, 118112, -4189204, 3513820, 325881, -881005, -3040300, -1051193, 2093797, 4233227, -7041062, 891206, --1342177, 2895882, 6783364, 317291, 4747013, -2557653, 3148211, 3863860, 5712844, 4440460, -5572183, -438624, 3191161, -1056025, 2428804, 14551349, 13335337, 4656819, 22800370, -10614475, --5114769, 3457986, -6347425, -2064806, 7244536, 24464670, -4292283, 4748623, -455267, -1797981, --710817, 27015882, -13526999, 13889924, -449898, -18164490, 5626407, -18018998, -11155104, 9994926, --9659381, 6997576, 83215, 724776, 11920145, 9541270, -15013595, -16919486, -12835510, -4446902, -4454955, 4565550, 1485522, 3055869, -20339892, 2825015, -11067594, -25463250, 16860430, -5204427, -15834471, 17026860, 678068, 6213744, -9540196, -11466489, -20185810, 4328254, 17885318, 2978560, --8319352, 843961, -4350802, 2558190, -11026255, -8986682, -11011759, 1613297, -1625645, -3718368, -11403138, 10321880, 6021544, 16861504, 1592896, -18206904, 22900228, -17197586, -5557151, -4482335, --4823785, 19240916, -3444564, -28104656, 23383412, -9488656, -6009733, 6277632, 5682242, 18055506, -11336029, 7430294, 8596377, 7857106, 5770289, 130460, 7336341, 9012452, 2111513, -93952, -9548249, -1974611, 806917, -9305047, -2527052, -3113315, -5067525, 540629, -1079647, 5744519, -3993783, 1554241, -1090922, 2653753, 889058, 1874216, 3672734, -1463510, -1893544, 621160, --1872069, 2771865, 1044751, 1174137, 2021319, 1143535, 8774618, 6447820, 1546725, 1625108, -20946018, 23699630, 5369246, -45204532, 1411434, 12499429, -15059229, 8834211, 17796196, 674847, -4692252, 11153493, 8543227, 3182034, 15983184, 3463891, -2429341, 30180198, 11124502, 3773129, -12957379, -10237591, 15938624, -11485279, -1156420, -1466195, -3893388, -16852378, 5419712, -11977590, -21484500, -2115272, -4418985, 31636730, 4089883, 4471061, 10430865, 1018981, 5946919, -7319698, --14024142, -1757715, 9205726, -16602196, 18907520, 17026860, 12548284, 3150359, 7412577, -11528229, --11937862, -18882824, -8407935, -10272488, -9761387, 4271345, -1957431, -18496814, -8264054, 15930034, --411780, -15292231, 8432631, -1018981, -10426570, -24718610, 1580548, -37370512, 21490942, -12845710, -19538344, 766115, 5362267, 454730, -7426536, 9701794, 33135672, 2861522, 9363566, -6009196, --26030186, 2101850, -2907156, 18767934, 10931229, -4662724, -1020592, -4126390, -2150705, 6247030, --7516730, 5851356, -969589, -6723772, -6659347, 6796786, -8132521, -8126615, -11236171, -2461553, --8100845, 2309619, 6931004, 265214, -2107755, -5412733, 10164040, -9818295, 2452963, 1031866, -793495, -5851893, 4010426, 9864466, -508954, -5223217, -1284195, 8980777, 9487583, -7861938, -9084393, -874026, -2437394, 1244467, -634581, 9906879, 2581812, -5603322, -4772246, -263604, -1086627, 5719823, 12628278, 9450539, 24738474, -33488934, 13514651, -19526532, 17049410, -8167417, --13940927, -3854196, -16088947, -6653978, -3424163, 6091338, 7726646, -4560719, 23771570, -913217, --3842385, -2971044, -21124260, -2173790, 302795, -17770428, 5973226, -15130633, -19087908, -6070400, -11839077, -31793496, -21484500, -14334990, 1861332, -22248468, -18820010, -15261629, -7531225, -6099391, --2726231, -14996415, 16407849, 2920578, -1360431, -11163157, -11408507, 22031572, -18835580, -12898861, -5969468, 5963562, 8085276, -10944650, -15175193, -6381785, -2640331, 7282117, -10836739, -4326106, --4306242, -13093745, -22290880, -28348394, 27139362, -29381872, -1418950, 2191507, -4924717, -5352603, --26144540, 10308458, -6101538, -27562952, -410706, -5982353, 26253524, 6534793, 18748606, 17714592, --5028870, 6985765, -2674691, -4952098, 13257490, -3215857, 7714298, -9916543, 1005559, -9991705, -8815957, 6784438, 1452773, 6211597, -2400350, -896038, 6745783, 3172370, -6140193, 4767414, -10856604, -1590749, 2683818, -5738613, -13371844, -1392643, -964220, -420370, -9211094, -2021319, -1744831, -1342714, -4800700, 6469832, -948651, -3627637, -10775536, -11129334, 398895, 6124624, -3839701, 2369211, -510564, 8024073, 9345312, -4093104, 2201708, 2198487, -368830, 2703682, -6856379, -29885994, 34816616, 5600638, 3618510, -5915781, 17742510, 314069, 29138668, -7818451, -20032802, 10817949, -28481002, 12488154, 4828617, 13666049, -2202245, -7544110, -11256572, -4121558, -14117558, 30826054, 3398393, -4428648, -19311784, 7409356, -20896090, -3270618, 21396454, -19135690, -188979, 1402307, -3151432, -7194607, -7998303, 34133180, -7194070, -8330089, -3958886, 7770133, -11611981, 4321274, 746787, -6914898, 85362, 5129802, 20899848, -4730370, 29822642, 17338246, -9028021, -7106561, 26029650, 29361470, -2206540, -7764764, -1322313, -9533217, 3142306, -9443022, -15030775, 5047124, 21560736, 16481400, -25882010, -29431264, 35539780, 26225070, 4414690, -4998268, --13747117, -19392314, -7319161, 19866372, -18437758, -20247012, -2579128, -5471789, -32095216, -7221988, -7472170, -12552042, 2025614, -91805, 2013803, 2622615, 5688148, -9554692, -5572720, -9820443, --3235721, -52076, 1776506, -5363341, -2217277, -955630, -15639587, -5327907, -7265474, -3526705, --77309, 1404991, 1017370, 2667712, -667331, 584116, -8039105, 4829691, -6863358, -8366060, -6331856, 2549063, -14595373, -1634235, -4292283, 7391102, 14685030, 304406, -11764989, 9769977, --2360622, 2552821, 3848291, -3956202, -2414845, 891743, -6063420, -8587250, 15626165, -12324409, --3815005, -2384781, 3300146, 748935, -18656802, -54557896, 27734752, -26096222, 11011759, 39393440, -6242198, -16124918, 11559368, 13908178, -5424544, -12130061, -2307471, -26734024, 9186398, -27795954, --16779900, 11547020, 1431835, 5137318, -25096568, -4886062, -18041010, -15268609, -22323630, -7606924, -8008504, -13176423, -13388487, 13555454, 2103997, -833224, 4491462, -25706454, -1330366, -19929186, -17575006, 5056787, -49199924, 12743168, 26780194, -5381594, 16083579, 13594108, 9250286, 7487739, -25587804, 20138028, 998043, -17832704, -3565897, 20352776, 13286481, -16505559, 1474248, -19327890, --6057515, 1614908, 14495515, 19346144, -34727496, -27378270, -15224585, 3240016, -10139344, -3552475, -32817308, 5652177, 7970386, 25651156, -10027138, 5530844, -6206765, 26242788, -12945031, 1363115, -2848100, 19522774, -5092758, -1733556, 7295539, 8196408, -740345, 4161823, 12813498, 813896, --133144, -199179, 12483322, -5876589, -3698504, 3259880, 5549098, 3911105, 1872069, 6086506, --2421288, 347892, -5336497, 167504, -3905199, -290447, -5475010, 9701794, -6813966, -10058277, -10057203, 6765647, 7002944, -6997576, -9182103, 332323, -16670916, -4301947, -8472360, -8524436, -3689914, 245350, -8783745, 3380676, 3919695, -651224, -5100811, -4808753, 4168803, 2797098, -8304320, 18163954, 17556752, -30617212, 6405944, -6596533, -8051990, -7117298, 20540144, 10905996, --14979772, -8551280, 15676094, -28164784, 1601486, 10241886, 15707232, -3349001, 3481071, -32869384, --117038, -14564771, 11000485, 4034585, 18248780, -28910498, -14570677, -4212826, 3576634, -2496987, -5657546, 2057289, 15779710, 29704530, -18799072, -24315958, 6419366, -25340308, -7450158, 10593000, --18393198, -17901424, 1512902, 11005317, 15488726, 10960220, -6889128, -1571958, -32225676, -21760988, -28654412, -19888382, 38671884, -16406775, 7893613, 5639829, -278636, -28423556, 35612796, -16595217, --3345780, -6419903, 13921063, 26782342, -27086212, -15440407, 31850940, -23576150, -23622, -8913131, -6525129, 36813776, 228707, -2732136, -22771380, 28154584, -9161702, 7305203, 9337796, -17842368, --21467858, 2079301, 12416214, -6455336, 6374269, -51006496, -23756538, -7321309, -25978110, -12841415, -4366371, 16872780, -3537979, -4663261, -13271449, 327491, -1245541, -9741523, -3329674, 5941551, -521839, 7970386, 3773129, 7552163, -10001905, -1453846, -2079838, 10515154, 8364986, -6347425, -19362786, 7106561, -7768522, 11704323, 3235184, -1185411, -6108517, 4413616, -4414690, -4185446, -8661875, 709207, -3787088, -3431679, 7262253, -2036888, 6567005, -1520955, 11932493, 2452426, -1748052, -4836670, -3517578, -4327717, -1576253, 1433982, 17452600, -20203526, 5455682, 16485158, -16296180, 37155224, -23849954, 34119220, -6178311, -22578644, -22099754, 5499706, 14170171, -10062035, --4722854, -15586973, -6498823, 28887414, -20621748, -2041183, 23199266, -7684234, 13790603, -9457518, --4584341, 24610700, -1014149, 1123671, 23742580, 16413754, 5707475, -3080565, 20030654, 27392764, --28198070, 25734908, -24925306, 12973486, -18033494, 3601867, 21188684, 7155953, -48588964, 21366926, -13608604, -299037, 24413668, -38595112, -7575249, 26013544, 22111566, 3584687, 34833796, -18746996, -257161, -4611185, -5555540, 14869177, 6051072, 26074746, 21690658, -16518444, 14339822, -30549566, --9576166, 2297271, -1703491, -2497524, -5101885, -47737488, -26424786, -36901284, -25121800, 27202176, --17162152, -4257387, 2961917, 44624172, -10871636, -15902116, 35765268, 21865142, -1213328, 28949690, -4243428, 5373541, -13771813, -79994, -11549167, -12156368, -6369437, 9295920, -11674795, -6146098, -5390184, 2010582, 8824547, -3739306, -1698660, 11495480, 6585796, 563178, -9392557, -7561290, --1331440, -2989297, 6736120, 11470247, -1051193, 1937567, 2496450, -4823785, 28707024, 8805757, -1865626, 1041530, -9637370, 7565585, -17074642, -1371705, 14360760, -1132798, -4040491, 10435160, -5850819, 3118683, -444529, -9532143, 6075768, 6723235, 2069637, 3628174, 4841502, -3396246, -3700114, -11531450, 11919071, 29963840, -15919296, 11816529, 14984067, -20887500, 3122441, -25780004, -10350334, -2380486, -13580150, 21173116, 988916, 32794760, -1610076, -23800024, 41344964, -6933688, -4458176, 6090801, -38088844, 12016782, 33464774, 12248173, -14030584, -24732570, 2979634, 6593849, -28663002, 18713710, -8875013, -5044439, -21703006, 678605, 32378684, -43060804, 13560822, 30913564, --27035208, 10532870, 3188476, 11041287, 32381370, 11194832, 12706661, -5432060, -31120796, 33081448, --5710159, -16139413, 68638408, 34127812, 17760226, 3517041, 1882269, -31608274, -26024818, -11413339, -20409684, -133144, -18320720, -12610561, 25656524, -14909442, 17772574, 10469520, -12184285, 19214610, -8859444, -26473642, -13192529, -15282031, 4777614, 17535814, -33524904, 11735461, -34359740, -43203076, --27235998, 42651708, -14214194, 9320616, -9511742, -13956496, -1782948, -16749836, -11739756, -8606578, -2457795, -16011101, 2276333, 10445897, 299037, -13996762, -10591926, 5827734, 1972464, 19368156, -2815888, -20768852, -8034273, -11589969, 17952426, -2857764, -6822556, -16258599, 95563, 10959146, -4972499, 12394202, -5577552, -1136556, 3757023, 12634183, 7866770, 471910, -6400038, 9636833, --7906498, -28454, 5109401, -6819335, 122407, 14112726, -100395, 3340948, -14238890, -9352291, --10752451, 7515656, -11457899, -2715493, 41467372, 69389488, -12017318, -2712809, -57597660, -19587736, --42449308, -28430536, 38613368, 2381023, 10222022, -32771138, 10129680, -28819768, -64383708, 8956081, -30392262, -2911451, 3619047, 32741072, -44250512, 49737868, 24620364, 15277736, -25183004, 33328410, -64608120, -13269301, 19735912, 48978732, 41313292, 73156712, 15637439, 26048976, 19671488, 17562658, -62809600, -16751446, -7814693, 22951768, 13517336, -7168838, 34421480, 1791538, 7023882, -20893942, --56661892, 1904818, 37350648, 5452998, 22529788, -40961104, 2285996, -54369456, -129386, -58402428, -3783866, 40553080, -5382131, -17566416, -55649892, 72410464, 13012140, 4665945, 75044888, -1100585, --17357036, -12881144, 3731790, 14875619, -4297115, 107911, -6097243, -39922256, 23456428, 9022653, --25039122, -15403900, 19594714, -24139864, -41683196, -20394652, 8964670, 39687108, -41710576, 33041184, --1723893, 17608292, -7363185, 14375792, -10065256, -1491427, 3520263, 4035122, 13267154, 12101070, -2431488, 25438554, -1391569, 10475962, 13331042, 7859254, 5808407, 6136972, 21915608, 16437377, -7869991, -8475044, -3629247, 19198504, -25393994, 9952513, -15151034, 3838627, -5637145, 17431662, -19866372, 40568112, 22573812, 38325604, 21862458, 8337606, 40043592, 41837276, 39577048, 23044110, --6623377, 24152212, 26394184, 16724066, 31776316, 24426016, 288837, 7927436, 5723044, 6016176, -9651865, 7635915, -7613904, -7096897, 938987, 7793218, -1304596, 72478, -1750199, -3510062, --7530152, -6583648, -2582886, -1536525, -2612414, 256624, -4154307, -1818919, -23005992, -73950208, -2588255, 97692792, 13424457, -21066278, -19979114, -45880988, -30280594, 397284, 60686816, 9905805, --42030012, -3903589, 15891379, 3099356, 351650, -4996658, 9839770, -30334818, -11893301, 14081050, -33267742, 33486786, -33342368, -13422847, 1636383, 3661460, 7836705, -38296612, 2776696, 5170067, --10661719, 25949656, -1094680, 30086246, 45892800, 21424908, 8879308, 19410030, -27286464, 23159000, --22178138, 35101692, 62894428, 20028506, -35133368, -30596274, 28119150, 9601936, 53538916, 39857832, -11763915, -11104638, -12853763, 746787, 2155537, -19804094, 20439212, 17547088, 2872796, 48103096, -32937568, -5424544, 23317914, 25750476, 11841225, 25752088, 550830, -47531868, -6350646, -12145094, --11349988, 52108692, 23870354, 7689602, 41628972, 24056112, 26349624, 32082332, 10881837, -34615288, --17233556, -1728188, -1101122, -12824772, -10372883, -21378736, 12236899, 7262253, 19349902, -10245644, -21658984, 5252745, 22457848, 14362908, -5485210, -12653511, 3036542, 5205501, -163209, 1646583, -16401406, 635655, 25883084, 34127272, 9740986, -3965866, 2274722, 24222004, 5530844, -9031242, --6971269, 18902152, -1284195, -7267622, -4096325, 5506685, 13954349, 27139898, -15050102, 1161252, --9795210, 1204202, 1003412, 21900038, -12458626, 10216653, 13895293, 7144141, -10516227, 2028835, -16244103, 831613, 503585, 14470819, 2211371, 8209830, 6039798, 282931, -2898566, 1518808, --2018635, 2243584, 1360431, 2449205, 1202054, 6250251, 2486249, 1668595, 2013803, 4089346, -1886564, 4476967, 1817845, 2188286, 2381559, 1879585, 2505577, 1246614, 2321430, 3185255, -3619584, 3489661, 3929895, 3124052, 4154307, 3079492, 3386045, 1430224, 3447785, 1434519, -3176665, 1060857, 3202972, 2174327, 2936147, 703301, 2934000, 1887101, 3121904, 2040646, -3516505, 1085553, 3760781, 1134945, 3362423, 1868848, 3333968, 1303523, 3750580, 1237488, -3053722, 1740536, 3280281, 1610076, 3871376, -38655, -14081587, -68940128, -14582488, 39197484, -21342766, 85219664, 5021891, -11812771, -37606732, -73895984, -81333792, -13109314, 35575752, 40088152, -25715580, -40754944, -54193896, 135828, -6355478, 22294638, 57204132, 29500520, -5035849, -33568392, --45985676, -28538448, 2183991, -27938762, 11383811, -23284092, -11507291, 38487740, 31632972, 28477780, -11165304, -38400228, -10616622, -36703716, -28427314, -14418205, 22240414, -3572876, 23598698, 58106076, -60240676, -24459838, 7126425, -43731892, -30084636, -20582020, -3637837, 8844411, 35003984, 37702832, -51382840, 36966248, 13254269, -24768540, -23172960, -5017596, 16626892, -41225244, 3211025, 49463528, -39138428, -9630927, 52977884, 47743932, 26752814, 49873696, -93256624, 22799834, -26418880, -28207734, -16152835, -14857902, -1223529, 94795832, 79817136, 28852516, -24511378, -1591285, -37365680, -6765111, --50287624, -17289390, -8380018, 20045150, 61794916, 32938104, 13019656, 11607149, -9867687, -30354682, --39806292, 730144, -26260504, 21706764, -2233920, 478352, 23727010, 19984482, 7357816, 20679730, -7136625, 31955094, -21799644, 208306, -24043764, 10672994, -20910048, -18547280, 3401077, -5131949, -16693464, 30273076, 1851131, -26746372, -46154256, -13225278, -26739930, 3776887, 12043625, 22594212, --17824114, -5616207, 836982, -303332, 23430658, 1884417, -120120568, -136177312, -146416512, -147928336, --200539008, -12016782, -71917080, -23322210, 26450020, 66853312, 93842352, 96807488, 197941088, 212262112, -172776864, 128502736, 136121472, 129802504, 49961744, -19432580, -89388472, -89544696, -137370768, -44703092, --74490304, -55554328, -5288179, -116609432, -33606508, -104162624, -28414430, -119672288, -112831472, -52136608, --93168576, -9587978, -47098076, -43528956, -69690136, -46149424, -105185896, -74370040, -39560944, -36257576, --55682104, -34133180, -4170413, -45059040, 15071577, 67177584, -52459804, 79484272, 47600584, 106120592, -106574248, 93070328, 114757768, 96970160, 160101888, 159068944, 126811056, 169737648, 145504368, 222319312, -218885488, 258002976, 200749456, 216142624, 235490368, 212766768, 254358704, 188517920, 275440544, 220178816, -83845280, 107652280, 28298466, 42632384, -149148112, -125123136, -139748576, -148664928, -156815696, -202507712, --190747008, -209578304, -230199504, -270528192, -226192848, -207038368, -230220992, -250978032, -299321632, -240025856, --265865984, -267515792, -203067664, -228821360, -132118024, -163864816, -112246288, -104118064, -55229520, -40295384, --57180512, -9807558, 26863946, 130009200, 123085176, 89468464, 101032664, 108820512, 147383952, 151100176, -163283376, 172350064, 148109264, 150632016, 110566952, 156735168, 160133568, 122129008, 85784992, 66388920, -96192768, 95333240, 74068856, 44545792, 24536612, 37553048, -9813463, 5218386, -17602386, -13796509, --71155264, -64961380, -47498044, -32694902, -43337292, -33020782, -15898895, -12899397, -17221746, -31849866, --29491392, -14448807, -18996640, -12357158, -10623065, 2296734, 4966056, 1094143, -5065914, -1152125, -2566243, -1563368, -1621350, 1913408, 3468723, 7017977, 1906966, -1779727, -331786, 2392834, -1999844, -1588064, -683437, 3801583, 2393908, 2012729, 2217814, 4051765, 3341485, 928787, --318901, 2863133, 2729989, 3012383, -668404, -3170760, -1611150, 1130113, 3907883, 4661650, -2579665, 967441, -2382633, -3772055, -2808909, -2777770, -5510443, -9002251, -11369315, -11647951, --12056510, -13174812, -14428943, -16759499, -18712098, -20225538, -20037096, -18172544, -16728898, -16773995, --16254841, -15315853, -9931038, -6803765, -4958540, -1067299, 2647847, 5661841, 8704288, 11909407, -13696651, 15919833, 15829102, 15282567, 15201500, 13640816, 11307038, 8756365, 7007239, 5683316, -4191888, 2874407, 1736777, 1038308, 485868, 367757, 228707, 165893, 110059, 60666, -56908, 104690, 176094, 213675, }, -}, -{ -{ --2786897, -5300527, -159988, 2206003, 885837, -4539781, -3401077, 1249299, -3059091, -4565014, 2684892, --495532, 739271, -2598455, 1998770, 239444, -4037806, -134755, 4772246, 3886409, -2884608, --5123896, -4663798, 744640, -1035087, -874026, -3961571, 4417374, -1109712, 1280974, -1778653, --1060857, -348966, 1706176, -1136019, -2248952, -8756901, 3045669, -617402, 2896419, 1741072, -1246077, -177167, 5922223, 1154273, 1222992, 870268, -2955474, -1870995, -229781, 482110, --2959233, -661425, 1219771, -362925, -2793876, -1445793, 153008, 2830384, -4304094, -5851893, --7267622, 2640868, 4239133, 475131, 3514357, 2594160, 534723, -6655052, -127238, -1704028, --2305861, 167504, 421444, 2829847, -551903, 4005594, 2846490, -1199907, -3969624, -1902671, --671089, 1076963, 353261, 1347546, 1550483, 2812667, -12885, -213138, -1254667, -1075352, --1031329, -428423, -2195802, -1007170, -1222455, 748398, -103616, -230854, -644245, 1101659, --1533303, 3186866, 4162360, -942745, -40265, -5920613, 5307506, -6783901, 2641405, 11454678, --2435783, -4251481, 666257, 5979132, 651761, -1692217, -810138, -1705639, -1064615, -5373541, --2076080, 2655364, -4251481, -2439005, 262530, -234613, 4741107, -2880313, 903554, -1114544, -1054415, -599685, -2733210, 5226439, 8913668, 2251100, -481036, -1667521, 9646497, 446677, --3996467, 267362, -7146826, 24159, 3773129, -5509370, -670015, 1178432, -4367445, -1326608, -5098126, 717796, -511638, 4885526, -3219078, -5145908, 2944737, 1925756, -3555159, -1784559, --3808026, -4510790, -4810364, -2687039, -2733747, 3924526, 2834142, 763967, -70867, -2733210, -2568391, -597537, -1818919, 3322694, 3722663, -2633352, -480499, -1249836, -1629940, 507880, -4261682, -2137820, 991601, 4008815, 2705830, -932008, 1068910, -713501, -60130, 1692217, --190052, 15032, 1787780, -1867774, 806380, 368830, -539018, -1723356, 1365263, 135828, --706522, 387621, 246424, -628676, 255014, -330712, -508417, -1016834, 5873368, -8497593, --5601711, -2003065, -1214402, 314606, 1121523, -8101382, 5669357, -2540473, 1869385, 1190243, -1903207, 3577171, -1074, -1149441, -2680597, 5878200, -438624, 3830574, 7249368, -1540820, -6167036, 5268315, -4520453, 3064459, 3095598, 3324305, -7994545, -769336, 501437, -2492155, --5020280, 106300, 5905043, -1353452, -2498597, -1950989, 1820529, 5483600, 2714956, -2758443, --26307, -2269890, 251792, -702764, -2699387, 5123896, -6565395, -5411122, -4978941, 1574642, --683974, -149787, -6125160, -6456947, 1598265, -106837, 384936, -609885, -327491, -4811974, --2849174, -5264020, 1054415, 4568235, -1398012, 4057134, 769873, 3610994, -7716983, 64425, -1132261, -2547989, -1152125, 1064615, -2740726, -307090, 2039573, 2220498, -1701881, -5140002, -4566624, 746787, 124554, -1109712, -648540, -4108136, 194884, 319438, -717260, 781684, -144955, -1427003, 635118, 705448, -407485, -560493, -196495, -211527, -270583, 264141, -2188823, 72478, -646393, 1840930, 812823, -105227, -594316, -141734, -296353, -3000035, -641561, -665720, 4940286, 7902740, 428423, -3115999, -6866042, 3025268, 1939178, 1802813, -8379481, -5609764, 119185, 948114, -1608465, -2847563, 1175747, 450972, 5022965, 11164231, --1064078, 1864016, 4628901, -2122251, 4122095, 7226820, -5173288, -273267, -1972464, -188979, -3190087, -5777268, 6081674, 1288490, 2147, 3159485, -602369, 4407174, -2502355, -1118302, --1331440, 6970732, 3221762, 4408784, -917512, 3617973, -6912213, 7830799, -3128347, 3028489, --7271380, 2824478, 5170067, 9562208, 3479997, 1717450, -6408628, -2515240, 1693291, -4889284, --5775121, -1439888, 11339251, 13114683, 2474438, 3020973, -3821984, -1757179, 7325604, 1355062, -3177739, -531502, 2193655, 1893544, -1027571, 1603097, -1130650, 1187559, 839666, 4577899, -3745212, -5939403, 5169530, -1797444, 2636036, -1928977, 1926830, -1641214, -2220498, -126165, --3517578, 460635, 2501819, 493921, 1271310, -1319092, -1574642, -876173, 598611, 24159, -544387, -309238, 368293, -1066226, 333397, 290447, 1820529, 25770, 1231582, -677531, -1101659, -1386738, 128849, 131533, 1312649, 5473399, 60666, 602369, 7714298, -6667937, --7840463, 11981348, -3223910, -2019172, 7793755, 4638565, 484258, -13930726, 14859513, -2821794, --1991254, -1651415, -916976, 515933, 821949, 4600447, 6874632, 4522064, -1105954, 7755637, -4861903, 2443300, 2000918, -2951716, 3467649, -5697811, 4387309, -926639, 1773285, -4831302, --7034083, 824634, -986232, 2477659, 4066260, -2118493, -6740415, -3927211, 1519345, -8012262, -5029944, 1542967, -12799003, 5678484, 762357, 3226594, 707059, 1923072, 2037962, -565325, --3694209, -3151969, -8775155, -6404870, -3651796, -4463008, -1093606, 476741, -6456947, -9006546, --1457068, 5797669, 9931038, -545998, -6813429, 1080184, -10646150, 692564, -840740, -4167729, -8756365, 8322573, 2686502, -347892, -2271501, -656593, -4791036, 2171106, 8385924, 4531728, -6906845, 1400696, -3341485, 3253975, 1569274, -255014, 539555, 366683, 71404, 1504849, -1429687, 1493575, -615791, 2634426, 574989, 5216775, 1898376, 1388885, 100395, 437550, -1232119, -387621, 2303176, 893353, 797253, -1408212, 2895882, 753767, -1246077, -464393, -2230699, -13598940, 7016903, -2600603, -4843113, -3840238, -4634270, -6466610, 12447889, -15867757, -3733400, 3830037, 5181878, 7749195, 1264331, 2151779, 2909304, 2098629, 1604707, 2625299, -6811282, 1231045, -3767223, -7516, -671626, -4883915, -4431333, 2261837, 4556961, 4919885, -652298, 3508452, -8280160, -958851, -133681, -453119, -7848516, -4689031, -2837363, 5122286, -4575751, -77846, -8591008, 50466, -4662724, -3320010, -1706176, -2303176, 5362267, 7329362, -2201708, 7625178, -12218108, -8515310, 4032438, 2494839, 389231, 1618129, 771484, -3948149, --7697655, -5294084, 4038343, -3427921, 6189048, 6129992, -2261300, 5809480, -9262097, -4556424, --2629057, -3105798, 642098, 16821240, -2450816, 4764730, -2717641, -2423435, -1748589, 3578782, -3788161, -434329, 3049964, 2122251, -5283347, 1458141, 361851, 2263985, 448287, 289373, --2685965, 1708323, -153008, 1731409, 505196, 904091, -534723, -987843, 455267, -1515587, --2254858, 766652, -1257889, -1880122, -611496, 585726, 697932, 768262, 770410, -91805, -536871, 1209570, 937377, 353798, 233002, -373662, -695785, 1131187, 563714, -89121, -772020, 13896367, -2681670, 372588, 5847598, -13243532, 9090298, 4606353, -7467875, 8273718, -9257265, 3102577, -14297946, 8827232, 376347, -1355599, 7226820, 7807714, -451508, -2315524, -220654, -5553930, 5182415, -3040300, -5292474, -11125039, 2588792, -12091407, 3236795, -2969433, --1359357, 3476776, -9853729, -4053376, 8178692, -722628, -3829500, 5002027, 324807, -4305168, -3700114, 1336272, 356482, -1850594, 2820183, -6002217, -636192, -8761733, 8274792, 8272107, --10316511, 6881075, -7362111, -2784750, 7110319, 9945534, -730144, -4967130, 3001645, -634045, -1427540, -12175695, -9627706, 1912334, 1718524, -2639794, -2508798, 3147137, -383326, -4321274, -5135171, -4980015, 1734093, 3712999, -861141, 5828271, -5858873, 5893232, -49929, 9382356, --3230889, 2841658, 5291937, 591095, -3376918, -967978, -359167, 2745021, -930397, -4429185, -3714610, 799401, -1864016, 1636383, -1257889, -65498, -1750736, -508417, 1261110, -1490354, -941672, 2564632, -1347546, 616328, 165893, -863825, 1615982, 425739, 1373316, -2085744, -829466, -2135136, -2444373, 893890, -402116, 977105, 1009317, 295816, 2963528, 3869766, -1698123, -5041755, 9782862, -3321084, 4770635, -9836549, -678068, -2581275, -8928163, 332323, -6341519, 11255499, 14719390, -8351564, -214212, -10414759, -760209, -6625524, 5953899, -6201933, --12285754, 817118, -7867307, -718333, 10223633, -6029061, -6016176, 10970957, 358093, 1902134, --1125818, -6419366, 2754148, 2356327, 13215614, -9085466, 6491306, -7702487, 1944547, 2581812, --7601555, -4671851, 12690555, 3485366, -9407052, -2414309, -3430605, -7548405, -300648, 12441447, -6672232, 8663486, 1993939, 3475702, -11318849, -1620813, 14435385, 1161252, -8942659, 4813585, -4784594, -6556805, -5709086, -3150896, -14794015, -2265595, 4415764, 7336878, 13021804, -3241090, --7097434, -2039573, -4411469, 10576894, -3911105, -9199283, -6264747, -2704756, -1241782, -2837900, --5311801, 11512660, -6571837, -782221, 1077500, 568009, 3769371, 2357937, -3369939, -4529043, -3432216, 4119411, 4354023, -975494, 1978369, -1184874, -700617, 1956358, -410169, -1999844, -2059974, 974421, -42950, -1304060, -425739, -3343632, 330176, -817654, -2872260, -1459215, -1330903, 1159641, 70867, 1358820, 6372658, -21907018, -15086073, -9651328, 1205275, -18346490, -2796561, 13724568, 4571456, 14130442, -7509214, -3433826, -1483374, -7267085, -2693481, -10934450, -19572166, 11200738, 7829726, -16444893, -3144453, -5257040, -10689637, 3765613, -1085553, 3535295, --13288629, -862752, -1151051, -9520332, 5612986, 1640678, 9827422, 3991635, -8140037, 12947716, --6053220, 5288716, 2757369, -51540, 10243497, 9539122, 2433636, -12243341, 15047955, -7537668, -10801306, 4964982, -5527086, -6132677, 12106439, 1831804, -1365263, 3202435, -10151692, -3591130, -5917928, -790274, 10710038, -6105296, -9606768, 4018479, 2769717, 392453, 10650982, 4638565, -2197413, -6703907, 7762080, 3095598, -5879274, -746787, -595390, -3334505, -2435783, -2800319, -4684199, 11725261, 19680078, 9199283, -3273839, 1068910, -4469451, 4592394, 6082748, -21475, --4978941, -2876018, -6511171, 4116726, -3539590, 1037235, -3055332, -769336, 4398047, -438087, -512175, -3906273, 4301947, -2167885, -1872606, 2423972, -3879966, 4379793, -2963528, 2385318, --2083059, -313533, 1002338, -2836826, -2040646, -1192927, -4728222, -4697621, -2062121, -158377, --1649268, 3887482, 3541201, 2142652, -14136885, 18362058, 7453916, 21036750, -9826885, -11717208, -20034948, 415538, -2364916, 4180614, 1290101, 11616276, 15571404, 1796370, -14976551, -23830626, -3044058, -6772627, 1177358, 398358, -10458782, -920734, 12575664, 10226854, 7994545, 16258062, --3990025, 13734769, -10093173, 12132746, 3825742, 9340480, -6695854, 16658568, 9491341, 12091944, --19870130, -362388, 17595408, 9893457, 2990908, -4501663, 26596584, 11064373, -10773389, -6755984, -6300717, -10508174, -1241246, -5183489, 1141388, 22275312, 23368380, 16879758, 6056441, -69256, -8648454, -8102993, -2218351, 9407052, -10260140, 23604066, 14646375, 11449846, 4383014, -1184337, --11505681, 13907104, 282394, 12097849, -5754720, 4539244, -8184060, -4824322, -432181, 5971615, --9583683, 21959094, 9352828, -2706366, -11112691, -21203180, 10084046, 1574106, -7029788, -901406, -2378338, -5152887, 2828773, 7824894, -1611687, -3038689, 42950, -1970316, -2292976, 1570347, --2735894, -2109903, -3670050, 3367254, 1863479, -5516349, 2757369, 3119757, 3073586, -365072, --1753957, -849330, -235686, 1491427, -642635, 1035624, -3306051, 4873178, -6629819, -150324, -2034741, 5495411, 558883, 23314694, -1057636, -11086384, -4847945, -8625905, -62814, -14014478, -3987877, -12032351, 7253663, 1889786, -3060164, -9400610, -11329050, -17272748, -17969070, -5103495, -16073378, -871342, -10062035, 4571993, -9586904, 7865159, -8158291, 15134391, -14978162, 3881040, --10558103, -10725070, -1796907, 2208687, -2996277, 7325604, -21679922, 9155260, 2328409, -4940823, --1302986, -1114007, -10631655, -17038136, -18424872, 13749264, 6825777, -6936372, 11795591, 722091, --4650913, -13354127, -28621126, -23363012, 13614509, -3788161, 477815, -2490544, -1185411, -1012539, --19346144, 7782481, -22888954, -11928735, 1211181, -355945, -4780836, -2728378, -2928631, 24146306, --7219840, -7377143, -6319508, 25251724, -4363150, -9611600, 15880105, -11987254, -7756174, -9809168, --8484171, -31694174, 6524056, 5524939, -10660109, -1171989, 7581691, -3796214, -2811056, -5588826, --5414343, -382252, -2806761, -2447595, 11252277, -529355, -1155346, 7886634, 8949638, -4003983, --3193308, -329102, -1542967, 2676838, -5413270, 1022202, 647466, 1422708, -3221226, -3578782, --1632088, 4064113, -1488206, -2550137, -415001, 2731062, -7024956, -688269, 3954591, 682363, --2819646, 4192962, -2470680, 3768297, -51003, 3625489, 3356517, 3919158, -6183143, -182536, -35433, -33804612, -25476136, -14501957, 29873108, -1335735, -4746476, -3454764, -2135673, -9613747, -10712722, 8281234, 26775900, -24355148, -4559645, 7701413, -17707076, -7028714, -6114960, 30738008, --214748, 7190849, 15812459, 1541893, 15232638, -16056735, -20095078, -13491029, -3491272, -3342558, -2686502, 9673877, -207232, -17027934, -11556146, -774168, -8875550, -19126564, 17436494, -2775623, --9306657, -33823, 5797132, 5533529, 3498251, -8609799, 2048163, -17804250, -7523709, -26444114, -12766253, 8071854, -2822867, -8267275, 10117332, -13158169, -3052111, 28647432, -2683281, 24279986, -11176579, 6534793, -6008659, -30413200, -12317429, -5831492, -16040629, -12236362, -7458211, 13640279, --5869610, 318901, -11868605, 25960930, -8911520, 10704132, 7640210, -17721036, -6745246, 3890704, -16800838, 29945586, 25324200, 10774462, -1302449, 10255308, 481036, 854699, -5466420, 2981781, --5658620, -4277251, 310848, 1705102, -3238942, -4934381, -8342437, -7064685, 4170950, 2801393, -3488050, -3320547, -904628, -17534204, 119185, -8143795, -3322694, 3051038, 2881923, 892816, -7677254, 55298, -544924, 587337, -2429341, -12793634, -712965, -7340099, 4096325, -6538551, --6450504, 648003, 8578660, 3508452, -1787780, -4908074, -3855807, -2268280, 4867272, 939524, --1416266, -3340411, 17053704, -1409286, -10591389, 10312216, 5663452, 36283884, 712428, -125628, -12427488, -17137994, -12017318, -3817689, 2472291, 5448166, -5021891, 15075335, -10123775, 1670742, -14091788, 6106907, 4870493, 4947803, -11382737, 1571421, -887985, -5762236, 1681480, -8315594, --14530948, -7750806, 540092, -14206141, 17221746, -1741609, 1216013, -2878702, 11675332, 13374528, --3172370, -10617696, -1500017, -3672197, 15722802, 20487530, -15425375, -10620917, -8078297, 4827007, -14963129, -14281303, 4077535, -999117, 2696166, -7606387, -10232760, 2652679, 9675488, 1530619, --13217762, 11089606, 33087892, -11257109, 5703717, -2896956, 2042257, 12635257, 3115462, 14963129, -12246562, -3723200, 19066970, 35333624, 884763, -13541495, 34376920, -1046361, 32843614, -11907797, --16914654, 15061913, 5377299, 22980760, -4355097, 32506996, 9809168, 7273527, -10401337, 15218143, -1246614, 1218697, 3088082, 12369506, 2105608, 14177150, 1198296, 3269544, -70867, 1852742, -1753957, 4309463, -2044941, 4873714, 11642046, 4798552, 5015448, 1418413, 2700461, -7107634, -5390721, 1997697, 2150168, 4093104, 1744294, -723702, -674310, 3139084, -4017942, 905701, --431107, 2773475, 8120710, 2867965, -886374, -4675609, 3990562, 540629, 499290, -1071058, -3871913, 2379412, -7354595, 6473053, -23526758, -7851737, 35677220, 5652177, -17086454, 4591857, --13051869, 4307316, 6490770, -3291556, -19525996, -7534447, -28981366, 11499238, 9343164, -11310260, -10166188, 16245177, 2947958, -4773856, -17137994, 3487514, 26195542, -13067438, 15524696, 14986215, -1927367, 11206643, 10164040, 213675, 12792023, 8590471, -25909928, -3867618, -10752451, 25696790, -16695075, -18360986, 10612327, -2330020, 13168370, 43045236, -4632659, -7554848, 3781182, 38730404, -15444166, -2616172, 4424353, 6844568, 21923660, 19640348, -14148159, 23626078, 10350871, 21893058, --16227460, 2186138, 3839701, 4520453, 13056701, 20095078, -13798656, -10654203, 15441481, 7863012, --6078990, -5894306, -576063, 24182276, -46522548, 10659035, -16960826, -12184285, 1557463, -15855409, --15269146, -2230162, -25761214, 17991082, -6012954, 19022948, -1377074, 16633335, -11747809, 6634114, --297427, 5447629, -1227824, -6540699, 4351339, 3493419, 3322157, 8098161, -4725001, 4071092, -4888210, -4750234, -317828, 7758859, 2134062, -4243965, 7938710, -5765994, 389768, 4515621, --6389301, -4240744, 979253, 1730872, 8904004, 8040179, 4944044, 2928094, -1755568, 6288369, -575526, 2787434, 1923072, 5239323, 5478768, -5214627, -5262946, -8449811, 5815386, 2706903, --348429, 2182380, -777926, -9096204, -8728447, 5849209, 7644505, 8098161, -10313827, -12261595, --31546534, 1356136, -17670032, 28520194, 3343632, -7484518, -4398047, 17100412, 4788352, 27810450, -11086921, -7276212, 996969, 5846524, 12520367, 20926154, -23614268, -20323248, -4430796, 35226248, --11033771, 4484483, 9875740, 15435039, 18551574, 26786638, 22956064, 2037962, -5705327, 25027312, -1753420, -15930034, 8288213, -14773077, 10488847, 2688650, -13383655, 12091407, 46852724, 26247082, --16825534, -12545599, -1921461, -13011067, -13150653, -11135240, 7865696, -6317360, -11228118, 2508261, -12725988, 7802882, 4067871, 18559628, 4731444, -4402342, 19296214, 16527571, -14348412, 9667435, --16170552, -12358768, -14368813, 58519, -34367256, -10000294, 23494544, 17631378, -8376797, 11880416, --3125126, 964220, -21234318, 4840428, 12315819, 20115480, 10963441, 13373991, 6979859, 6480032, --9231495, -7736847, -9804873, 5497022, -2353105, 908922, 3745748, 4347581, -744103, 10506564, --3567507, -4383551, -5258114, 7431367, -9820443, -3673271, -12042015, -452045, 1962800, -4872104, -109522, -2609193, 6954089, -1211181, -15794742, 434329, -1425392, 4808216, 5668283, 2170569, -6486475, -213138, 10777684, 2512019, -1270237, -61740, 826244, 717796, 171262, 4553202, --2916820, -13058848, 10343892, 8306467, -16524350, -7197292, -35637492, -3055869, 29253560, 132607, --21879638, 3266323, 753767, -14742475, 19407884, 11160473, -8170639, 5390721, 8647380, 11938398, -6479495, 1900523, -9007083, 4559108, 6724308, 18601504, 27819576, -7915088, -19197966, -10159208, -5075041, 5653788, 22836342, -9036611, -18405546, -14304925, -14788109, 27788438, 50987168, 18436684, -2270964, 56071872, 3077881, 23138600, 13001403, -4920959, -12108587, 9816148, -16286516, -10829760, -11085311, 585726, -34220688, -35291748, -9108552, 14487998, -18646064, -23154706, -12982076, -17187386, --14339285, 11690364, -10091563, -26225608, 11371463, 858457, -7943005, 5926518, -6222334, 12969727, -52432424, -32502702, 26252450, -36930812, -21211232, -12351252, -8687645, 20279224, 7887171, 9642738, --4348655, 11199127, 23308788, 5769215, 168577, 153008, -7263864, 3104725, 6099928, 18829136, --1541356, -9556302, -1809255, 14351096, 8910983, -4245575, 5085242, 6435472, -5654325, -325344, --2663954, 18053896, 6162741, 8486855, 5968394, 5067525, -7934415, -5448703, -1626182, 4534949, --9622337, 1214402, -9502078, -6371047, 1008244, 838056, -10865194, 10068477, 13453985, -1491427, --2260764, 8350490, -369367, -3763465, 11833709, -5181878, 8051453, 658741, 28432684, 18239116, -16426639, 24199456, -28543816, 10787347, -29891362, -1326071, 38728256, 34442952, 14589467, 406948, -6576132, 4264366, -11301670, 8883603, 11039677, -49111340, 2847563, 7078106, 14739254, -18072686, --27741194, 20112794, 9411884, 5029944, -11951820, 23881092, -3535832, 18540300, 15336254, -1962263, -2200097, -5531918, 18723910, -11319923, 5597953, 11259257, -1161789, 24036784, 13806709, -1455994, -12212740, 13972602, -901943, -10998874, -36922760, -6875169, 3746822, -21857626, 1925219, 17268990, --33573760, -14909442, 4941360, -14446123, -2507724, 17535278, 838056, -12554189, -16456167, 7160248, -6874632, -33843268, -11446088, -2884071, -49929, 21126408, 10197863, 2294586, 36852968, -4743255, --1396401, 1389422, -21328808, 19944754, -28454, 32778116, -12934294, -5560909, 9680319, 4896263, --28203440, 847719, -4071629, -11264625, -9256728, 3440269, 952409, -7962333, -912144, -4967667, --3673808, 962610, -12191802, 3400540, 1430761, -1728724, 4367445, 1207423, -8126078, 1561758, -2043868, 2052458, -7872675, 11128797, 1973538, 14495515, -10951093, 1308891, -9265318, -3235184, --1892470, -16145856, 3192771, 1451162, -907849, -2223719, -3144990, 5920613, -7494181, -5644661, -6769942, 9327595, -7330973, -9433896, -34801048, -30345018, 5407364, -15677168, -4999342, -23408108, --29140816, -30641908, -20190642, 21656836, 29590714, 682900, -24603184, 1830193, 1012002, 222265, -11166915, 18863496, 18835580, 370441, -12428025, -30560302, -17599702, -26761942, -5857262, 19864, -2114735, 2659122, 3615289, 7253663, 9385040, 17855790, -28314572, 12278238, 4784594, 6131066, -14973330, 26641682, 29868276, -17375828, 13229036, -23983634, -7612293, -21769578, -2263985, -8537858, -49743776, 17616882, 35791036, 1428077, -19437412, -8370355, 22862110, 24830280, -14800994, 45943804, --19443854, 2786360, 1860795, 7910256, 16742319, 51122460, -3751117, 12456479, 28344100, 6430103, --22765474, 14277008, 52220360, -9643275, -12854837, -30981210, -2753074, 19251118, 11750494, 1545115, --29849486, -22551262, 3591130, -23527830, 6877317, 965294, -29723322, -3419868, 2850785, -4714801, -21139292, 19965156, 250182, -5918465, -12920335, 13801877, -6081674, 24037858, -5696737, 248034, -16309601, 16509317, 23380192, 18155364, -13518410, -5280663, 2968359, -4467303, 1400696, -10208600, --9967545, -9942312, 4952098, -12161737, -14313515, 8307004, 10711648, 930397, -12329777, 7654169, -4080756, -3038689, -3300682, -8296803, -380641, 4654671, -2300492, -7421704, -9814537, -1879048, --6522982, 7833484, 4205847, 666257, -8991514, -3904662, -5105106, 10270877, 46714748, -2253784, --106837, 19912542, 3987877, -64086280, -20041392, 45782204, 15329275, -13230647, -25444460, -3435974, --16761647, 23685134, 12366821, 4576825, -13416404, -30251602, 6665789, -52223580, -6261526, 25777320, -35103840, -3877282, -29555818, -20063402, -61172684, 18158048, -10513006, 24172612, 18277770, -17260936, --12552579, -54239532, -40736692, 21438866, 58096948, 23313082, 27658516, -19145354, -34338800, -32903744, --13744969, 49437756, 66489852, 34781720, -77027552, -28115930, -59001040, -31444530, 73402064, 18033494, -16364899, -9564355, -70466992, -57622892, -57881664, -10613938, 5731097, 36719824, -13463649, 27974732, --55866788, 34969088, 14025753, 4415227, 70473432, 4692789, -6403796, -3192771, -95377264, -28996398, --6391985, 30246770, 15774341, 13923210, 42227044, -44870596, 2991445, -29632054, 32593434, 23658290, -2334852, 6670084, 7004555, -5141076, 19411642, 10541997, 5214091, 16641925, -11152419, -20802138, -5172215, 15239081, 22935126, 19027242, 12502113, -15573015, -25477746, -35610112, -3140158, 2742337, -29017872, 36072356, -5350456, -27150098, -46930032, -22374096, 3395172, 36087388, 57683020, 15197742, --56352120, -57702348, -59046136, -474057, 48216912, 42601244, 44790068, -14867566, -21791590, -41854992, --42407432, 15713138, 28675886, 37548216, 18976776, -29475824, -28012314, -15680926, -4445828, 34849364, -18371722, 5884642, -1602560, -21129628, -15385110, -3030636, -4180614, 9211094, 11464878, 5239323, -4615479, -27239756, 53290880, 23077934, 24608016, -65233036, 13487808, -91008208, -19867444, 90194, -13226352, 5600101, -58241904, 32060858, -15947214, -10200010, -10742787, -12110734, -14082661, -17761838, -38596724, -10621454, -32687386, 10864657, -9078487, 4382478, 18730890, -36845988, -13076565, -1938104, -15834471, 1959579, 42407972, -3224447, -23906324, 56048248, -46903728, 27908698, -43485472, -14085345, -21537114, -35128000, 2808372, 26113938, -13223131, -2684355, -2438468, 33524368, 50768660, 29641716, --16814260, -6615324, -7707856, 3598646, 16436840, -6307160, -9868761, 10233296, 5398237, -91276648, --3508988, -2989297, 13523778, 11799349, 773631, 556198, 26252450, -28447180, -7249368, -2400350, -20038706, -73185168, -10160819, 66932772, -16894254, -26414586, -93416, 50757924, -9122511, -11628624, -13852343, -19397682, -20609938, 31518618, 48287244, -17023640, -24343874, 8721468, 14564234, -7212324, --25679610, -127238, 3860639, -4828617, -3643206, -7650411, -11126113, 5702106, 470836, -9902047, --1761474, 24159, -280784, -9088688, 5572183, -12309913, -13413183, -7478075, -8167954, 12928388, --1743220, -2208687, -219580, -6699612, 10394358, -13081934, 3959960, 818728, 1026497, 9808632, --395137, -15795279, 1903207, -3847217, 3080565, 2665027, -14588930, 23462332, -6046240, -1725503, --2204929, 2570538, 5830418, -73551, -5392332, -2516314, -11572253, -21657910, -66476432, -54484880, -48830556, 41736880, 4399121, 44547936, -47473884, -2257005, -92125976, -32373316, -15919833, 45387604, -41322416, 25562572, -36812164, -12296491, -1170916, -17245904, 9258339, 16762720, 21530672, 28676960, --21004000, 16313896, -39622684, -24810416, -5898064, -7974681, 1509144, 27077084, -31198642, 27879706, --11789148, -17018808, -6559489, 3138547, -39291436, -304943, -35536024, -12849468, -13545253, -33601676, -47419660, 22169548, 11090679, 12080669, -8680129, -47343960, -70626976, -40920836, -41371808, 28955596, -7183333, 31165894, 43028056, 35733056, -11104638, 9038222, -24138254, -18235894, -22020834, 18198850, --23366770, -517544, -22287660, -22832046, -14368276, 28296318, -21906480, -5653251, 2620467, -2552284, --31772020, -33970508, -20613158, -11770895, -46262704, -27113054, 7408282, 28709708, 29656750, 38010460, --2097555, -29827474, -39128764, -29717952, 15811385, 5600638, -4571993, 18835042, 46377056, 12879533, -12597139, -11003169, -8440684, -14511621, -8960912, -4234301, -14388677, -2740726, 17751636, -3100430, --7465190, -13542569, -15513422, -17118666, -5046587, 9334038, -4535486, 4385162, 2367064, -31362388, -3672734, -14596983, 13604846, 26434450, -12789876, 18473192, -2093797, 5024575, 760209, -24661702, --3889630, -7570954, -6455336, 4281009, -369367, -2128693, -5326297, -10835666, -14931991, 22695144, --15149423, -100402912, -135906720, -128478576, -122177328, -146450336, -24801288, -40819908, 25547540, 40857488, -130397888, 83534968, 110505752, 152294704, 167635792, 114194056, 145602080, 82574504, 38400228, -6334003, --27712202, -37737732, -61915176, -60994440, -83861920, -35861904, -31026306, -79158928, -58980640, -56760140, --64197412, -104579232, -71108552, -55106040, -44048648, -80627808, -11391864, -24554328, -33509334, -78111496, --71816688, -59626496, -50673636, -37251324, -15095199, -49894100, 14090714, 24966644, -38748660, 42645804, -59950764, 57115548, 104666744, 84530328, 65482144, 71559520, 72537704, 71439264, 110112224, 123354680, -121789704, 82737712, 131375000, 129120672, 135171216, 136827456, 156103808, 137915696, 146334912, 193519408, -99061808, 99345280, 101407400, 93784904, -4450123, 42459508, 54347980, -31834298, -16733729, -54354960, --98310728, -89765888, -93943816, -170107008, -124235152, -76359688, -132355856, -140955456, -115643608, -124078384, --121998008, -147392544, -134264976, -136454864, -126863672, -119285200, -107925552, -100832944, -100014752, -84030496, --69956968, -111758808, -16709033, -50682760, -57084948, -13713831, -6819871, -56958244, -6801618, -22485228, --7712688, 19907710, 25228102, 64398204, 39109972, 53710176, 60916060, 64998424, 60213296, 82573432, -81871744, 85804320, 81385336, 96174520, 100190848, 96978216, 79714592, 101453568, 108108624, 82597592, -56949656, 53679040, 33806760, 27865210, 8673150, -4153234, -2279017, -18347564, -14887967, -12766790, --5909875, -16281684, -15689516, -16205985, -5979668, -16128139, -18576270, -12018392, -2333778, -13930190, --17022030, -15061377, -10547366, -20949776, -23746338, -25207164, -16034724, -15262166, -17452062, -15959025, --1612760, -4128001, -9527311, -6589017, 717796, -3256122, -5669357, -5511517, 849867, -3455301, --6259378, -7389491, -2920041, -4607963, -1489817, -2822867, -3737159, -5906654, 1062468, 3002719, -2395518, -584116, 1726040, 691490, 2755222, 1588064, 4084514, 3581466, 4337380, -1472100, --1341640, -2199560, -1031329, -5332202, -5424544, -5737003, -5866926, -9413495, -6891812, -6757058, --4715337, -8159364, -7850127, -7976828, -4916664, -6114960, -6930467, -5021354, -624381, -1067299, --1709934, 722628, 4239670, 3132642, 3107409, 3051574, 5226975, 5849209, 6051609, 4989142, -6340983, 6592238, 6068252, 5852967, 6135361, 5804112, 4858682, 3695819, 3623342, 2841121, -2245194, 1187559, 1009854, 587337, 433255, 83752, 54761, -17180, -79457, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --6262063, -8022462, -569620, 3258807, 1661616, 3830037, -6724845, -3609920, 4388383, 2147484, 88584, --3718368, 812286, -10456635, -6720550, -320512, -3990025, -4514011, 1911797, 8252243, 1416802, -6294812, -1408212, 6221797, -3649112, -3246459, -372588, -5529234, 1145146, 2816962, -1977296, --89657, 1484985, 308164, 2552821, -253403, -5929739, 2180233, -3661997, -2742874, 1710471, --3629784, -5531918, 5584531, -5806796, 5316633, 4955856, 3285650, -233002, -6809671, -3957812, -814970, -1264868, 8863739, -5371931, 2188823, -670015, 1209033, -6649683, -11104638, -1941862, --3304441, -3695819, -835908, 4733591, -980863, -5003637, 4450660, 1895154, -2194192, 3704409, --678605, 1125281, -5090073, -403190, -1240709, -64961, 2005213, -2332167, 1632088, -4677220, -3208341, -721018, 375810, -1701881, -1513439, 29528, 1963874, 713501, -27917, 747861, -4295, -2819109, 855772, 234613, 1815697, -282394, 100395, -4832, 80531, -178241, --973884, 4328254, 4318053, 651224, 7749195, -41876, 3374234, 4183298, -1074, -3714610, -442919, -5296769, -6789807, -2553358, -7743826, -8002598, -2569464, 5330055, -1839320, -1791538, --4137664, -1020055, -7272990, 3619584, -1999844, 1847373, 4449586, 1529545, -1489280, 3060164, -2920578, -3538516, 2538326, 366146, 718870, 2715493, -6334003, -2722473, 4582730, -2867428, --154619, -1811939, 5080947, -6404333, -477278, -5359583, 3554622, -288837, -336618, 4902169, --2045478, -2310156, -1622961, -4523138, 387084, -2033130, -299574, 329639, 3161096, 3176128, -1123671, -1371705, -5310190, -8765491, -2661269, -585726, -2107218, 4749697, -1840394, -2686502, -3839164, -2406792, -3703873, 8366060, -1745367, -4645544, -350577, 786516, -1329292, 4134980, --463320, -3659849, 125091, 179852, -721555, -1090922, 3345780, 755377, 535260, -1937030, -481573, -580357, 296890, 1290101, -210453, 736587, 1595580, 203474, -230318, -316217, -722091, -1845225, -614180, -362388, -775778, 779537, 720481, -297427, 8885750, -5735392, --2732673, -4163434, 3266860, 592706, -452582, 6397891, 1497870, 1841467, -9397388, 1676648, --4410395, -5117454, -6642167, -153008, 187368, 7781407, -6446209, 2916820, -2733210, 9633612, --3540664, -3248606, 6833830, -2674691, 2324651, 998043, -508954, 1097364, -4669167, 710817, -164819, 1913408, 9041980, 3131568, 795643, -3921842, 3128347, -7105487, -2015950, -1389959, -3816079, 3273302, 5439576, 3569118, -4176319, -6095096, -2700998, 4596689, -625455, 2370822, --1031866, -701153, 9188009, 2149631, -760209, -11067594, -4982162, 257161, 3779571, 5876589, -8249559, 4626217, -2067490, 1462436, -2097555, -2850248, 5900212, -3782793, 6075768, 255014, --5606006, 1974074, -2920578, 4767951, -4178466, -493384, 4099546, 4758287, -4859756, -1859721, --970126, -1984275, 2811593, -664109, -2118493, 1308891, 624918, 712428, 737661, 1140851, -556198, 675921, 235686, -360777, -490700, -1789391, 2686502, -120796, 90731, 303332, --33823, 427349, 1396938, 1422708, -143881, -386547, 1758252, 1390496, -191126, 1161252, -4728222, -1080184, -744640, -1686848, -5445482, 256624, 3979824, 3969087, 7381975, 3410204, --9603547, -8009041, -6951405, 335007, -1146756, 557809, -3770445, -2319282, -556198, 2974265, --3758, -6129992, 6710350, -905701, -6167573, 1318555, 1498944, -77846, -562104, 2733210, -3567507, -2161979, 5434744, 318901, 3196530, -7316477, 5272609, 1916092, 3052648, -5018670, --527207, 3760244, 3201898, 8099772, -272194, -11057930, -3011309, -5268315, 2631204, 1854889, --433792, -2911451, 874563, -4501126, -1589675, -8241506, -4859756, -222801, 4644471, 5214091, --3700114, -3129421, -3240553, 5358509, -1788317, -593779, -7948374, 4861903, -7845295, -2671470, --323196, -1602560, -2119030, 8427800, -695785, -1883343, -2223719, 1722282, -5028333, 643708, --8731669, -6966437, 2575370, -2389613, -1293859, 3190087, -1571958, 4235375, 832687, 1981591, -2946348, -717796, 1427540, 1025423, 550293, -548145, 1080721, 502511, 271120, -580894, --682900, 241592, -2557653, 23085, 1611687, 456877, -96637, 377420, -1570884, -435402, -960999, 595390, 2575370, 751619, -321049, -331786, 2371359, -2760590, 4246649, -3163244, -144955, 5805185, 10460393, 7275675, 1675037, -7943005, -5919002, 2304250, -1243393, -5046050, --1556389, -6539625, -2725157, 13545253, 1695975, -1294933, -2351495, 141197, -2973728, -2025614, -9215389, -9277666, -961536, 1060857, -1863479, 2492692, 5634460, -2390149, -2947421, 1517197, --3702262, -3630858, -8596914, -3111704, 2509872, -7704098, -1159104, 4014721, 6055367, 2226941, --12130598, -3580392, 2625299, 6319508, -4663261, 10813654, -1087701, -5298916, -2867428, -2188823, --4063576, 5934034, -4184909, -1035087, -5576478, -4378719, -1944010, -4454955, 6306623, -2138894, --12152610, 4826470, 8429410, 231928, 3152506, -14847702, 11848741, 332323, -9647033, 1110786, --6460705, -1286880, 1206886, -7004018, -8186745, 5669894, 2767033, -7118909, -323733, 297963, --4306779, -448824, -1482838, 1230508, -3801046, -1935957, -613107, -1864553, -832687, -2808909, -1133871, -82141, 1678259, -3064996, 923955, 1903744, 133144, -1695975, 1341640, -1643362, -1846836, 1466731, -1163936, 1432909, -66572, -820876, -250182, 568546, 824097, 489626, -472446, -10926934, 2651069, -8005282, 8872329, 2372970, -3158949, -6433861, -11377905, -4863514, --8192113, 3037079, 16302085, 2906619, -4020626, -91268, -2037425, -2330557, -7093139, -4627828, --7306813, 2182380, -382789, 1797981, -2437931, 1396401, -7727183, -389231, 1995012, -5226439, --1795833, 831076, -2746095, 927713, -2511482, 12066174, -14372034, -2444373, 1372242, 4065724, --1311039, -5835250, -8738111, -6189585, 4985384, -1130113, 5510443, -4390531, 14002667, 1952600, --2479807, 6979, -8002598, -10344966, -5096516, 4117800, -8750459, -402116, 10715943, -153545, --4776004, -9841381, -16669305, 838592, 8861591, -2260227, 10139881, -763430, -2907156, -6098317, --5305895, 1101122, 4153770, -3049427, 14617921, 4484483, -4417911, 2347737, -5710696, 2305324, -2936684, -1854352, 3336653, 5965173, 2697240, 393526, -3652333, -10469520, 930397, -2287070, --848256, -1499481, 983011, 342524, 84826, -4569309, 963683, -2575370, 1105954, -2537789, --650688, -585189, -12885, -136902, -279710, -1800128, -1467805, -1983738, -2825015, -3162170, --1124745, 258235, 1097901, -1620276, 191126, 185220, 562104, -1217086, 1405528, -2199560, --89657, 9384504, -4245575, -11045582, -3080565, -8274255, -4341138, -3648575, 11524471, -3012383, --3963718, -4996658, 7384123, 6602439, 5848672, 16266115, 17079474, 7835631, 10592463, -4123169, --4999342, 6981470, 10454487, -4679904, 4562866, 3133179, -9193914, -8764955, 5049808, -1386738, --166967, -8750459, -11013907, -2732136, -8935679, 9932649, 18751828, 3755949, 7373385, 2033667, --2255395, 6587406, -12883828, -3563749, 2631204, 7023882, -4267050, -10506027, 15108621, -165356, --4685810, -3838627, 6182069, -1996086, 5509370, -3927748, 8666170, -870268, -254477, 10598369, -3313567, 4810900, 1906429, -1782948, 8000987, -12367895, -4922033, 4423817, 13807783, -8561480, --996969, -1867237, -1965484, -5917391, -1285806, -3145527, -3978214, -722628, 917512, 3749507, --1635846, 10940355, 4036196, -6533719, -1544578, 666794, 4232691, 1335735, -1930051, -4011500, --841277, 2284386, -2473901, -2336462, -1891396, 2103460, 1422171, 2072859, 1177895, -2221572, --803159, -112743, -2054068, -537945, 1625108, 816581, -242666, -2478733, 3046206, -602369, -1903207, -1468879, 944356, -2857227, -237834, -585726, 150861, -1973538, -565325, 6774774, --6793028, -2677375, 6107444, -4885526, 2600066, 4589710, -9245454, -9851044, 2717641, 7439420, --2626909, 6786585, -5057861, -2259153, 12965433, -14845018, 8836358, -4265440, 25233, 345745, -16025060, -3633006, 3099356, 5071283, 8790724, 5142150, 7689602, -1340567, -1335198, 2491618, -1164473, 1247688, -7863012, 12039867, -16206522, -3593277, -4332549, 8960376, -1905355, 10930155, --595927, 993211, -19271518, -5303748, 11599633, 19838454, -275415, -9904731, -8405788, 8127152, -6471442, 4902169, 4589173, -8492761, -3968013, -4930086, 2485176, 327491, -5295158, 3030100, -2571612, -2455648, -2761127, -11602854, -3152506, -4274030, 16442209, 1489817, 3016678, 6247567, -394600, -12975633, 542777, -7820062, 6363531, 15426986, -8294656, 4757750, -2462090, -8035347, -3770981, -6737193, -1269700, 2790118, 1970316, 3523484, 1384053, -571231, -3047816, 3336116, -7131257, 1209033, 3476776, 5950141, 2539400, 6730214, -2148558, 6367289, 204548, 148176, -1272384, 712428, 1713692, -193274, -3249680, -1738925, 15569, 1711545, 1675574, -1217086, -2966212, 2935073, -2586107, 4148402, 7115687, -11887933, -4494684, -4392678, 2418067, -565325, -18011482, -2120640, 755914, 11475079, -9990094, -7228430, -9357123, -9814537, -2278480, -243739, -4597763, 19245748, -1619203, -10889353, 19937776, 443992, 5673115, 13654238, 9467719, 12750147, --3173444, 10095858, -6313065, 13340168, 11696270, -3022046, 6158446, -5210869, -4809827, 5107253, -15269682, 6927246, 6117107, 2253247, -4697621, -8255464, -8380555, 1489280, 10540923, -5950677, --7158637, -8850854, -3269007, -17649094, -4032974, 3508452, -12914967, 6412386, 1059246, -5849209, --15192373, -10142565, 148176, -20224464, 6502581, 4600447, -321586, 5763846, 3811247, -1883880, --10460930, -6316287, -1066226, -6611566, 6386080, -6933688, 16959752, -11237245, 725850, 7487739, -777926, -4972499, -19298362, 3479997, 9647033, 2399813, 682900, 10630044, 5938866, -5945309, -133144, -609349, 914828, -337155, -3231963, -6750615, -1917703, -7301445, 541166, 1941325, -1030792, -1823214, -3694209, -1679869, -2423435, 3302830, 1097364, 4292820, 3124052, 2504503, -1056025, -256624, -1326608, -1210107, -3219078, 1633161, 348966, 1626719, -1488206, -133681, --2672007, 267899, -2061047, 955093, -24850144, 8686571, 11303817, 19910394, -88584, -14839649, -4150012, 7107097, -15364709, -15974594, -9996536, -421444, 8484708, -467078, -6276021, -352724, --5495411, -3704946, -9916006, 16483548, 12865038, 4830765, -20273320, -6089190, 3227131, -1174674, --4536559, 25604984, 9361418, 8032126, 7515119, 12144020, 9099425, 2204392, 9528385, -669478, --15935939, 8592619, -16392280, 4984847, -16229071, 13670881, -4311074, 16511465, -9044664, 4002910, --7320772, 5944772, 9640054, 25212532, 5305895, -32085016, -1725503, -4473209, 6861211, 14006962, --2863670, -6237367, 10274099, -1827509, -5083631, 13799730, 849330, -617938, 674847, 5908265, -11018202, 8741869, -9517111, -7059316, -6013491, -9631464, 2232309, -892816, 10893111, 7846369, --14757508, -3554086, -8359080, 7148973, -4082367, -3935264, 2554969, 480499, -5699959, 4870493, -1164473, 811749, -861141, 2771865, 2844879, 460635, -8362302, 2333241, 1435056, -1067299, --1492501, -2768107, 85899, -3704409, 1700270, 4191351, -1293322, -1236951, 4087198, 648540, --3848291, -2928631, -709207, 2007897, -1687385, -390842, -2374043, 640487, -1593433, 28991, -3928821, -2633889, 620623, 27079768, -10191421, -17959406, -5683853, 7089918, -4404489, 13042742, -18842022, -7504382, 17284022, 11147051, 8711804, -2791729, -2030983, -3416647, 16765405, 3114925, -2059974, -9674951, 4282620, -5027259, -381715, -16015396, 10938745, -14690399, 111669, -10343355, -17484274, -8850317, 433255, 17295834, 13142600, 8920647, -1010928, -6773701, 8052527, -183610, --1505923, -21936546, -6492917, -13221520, -10756746, -8358007, -3932043, 11514270, 7232188, 6745783, -69793, 16914118, -8877697, 17894982, 15708843, 16885128, 29445758, -11290395, -8829379, 13006235, -2476049, -11330124, 17783848, -5757404, -8524436, 5837398, -2152852, -6072010, -5037460, 7701413, --10248866, 4748087, -6334540, 16377247, -6891812, 337155, 4796942, 11964705, 16190416, 1376000, --14064944, -15242302, 5048734, -10127533, -32846300, -17227650, 5286568, -289373, 9550397, 1297617, --5353677, -542777, -3092377, 1479079, -5666673, -2428267, -3877819, -1565516, 487479, -627602, --10233833, -2616172, -6689412, -5961415, -4707821, 2170569, -438087, 499827, -7440494, -5132486, --242666, -204548, 1497870, 3937411, 3206730, 2434173, -5341866, 343061, 1267552, -6878927, -2492155, 491237, 3068754, 1457605, 3904125, 2258079, -1536525, 3348464, -2454574, -1780264, --726386, -24799678, -20899848, -621160, 4884989, -14141180, 1053878, 1695438, 23841900, -14877230, --17080012, 6075768, -6962679, 379568, -12371116, 12580496, -12575664, -16985522, -10117332, 20509542, --13306346, -10794863, -2176475, 8569533, -5607080, -14010720, 4877472, -5431523, 488553, 6969658, --18615462, -1025423, 10937134, 17336098, -2168959, 26283590, 11747809, -2540473, 1553168, 12176232, --4443144, -10112500, 2399276, 14426258, 1964948, 7138773, 717796, -11068131, 4370666, -24787866, -2696703, 1779727, -2806761, -14431090, -13070122, 2047089, -5742372, -9779104, -6422050, -7792145, -10049150, -16184511, -9068823, -4373351, 7626252, -9352291, 20755966, -2651069, -16699370, -1068910, --9777493, -26721676, -7710540, 2209224, -419833, -17214766, -9006546, -3610457, 4424890, -10062572, --4793184, 17806934, -5779952, -23322746, -7943542, 3488050, 2226404, 8216810, 7008850, 5338645, --5104569, -6480569, -1232119, -4401805, 3877282, 1461363, -2630668, 5498632, 2531883, 3405372, --1636919, 2866354, 2250563, 405338, -594316, -1337346, -1786170, 464393, 1795833, -8016557, -2228551, -4432943, 5844914, 2431488, -5820218, -5103495, -59593, -3950296, -216896, 2207613, --1157494, -2527052, -4204236, -3091303, 2867428, 1332514, -4815732, 2389076, 974958, -3058017, --2539400, -5567352, 18974092, 16934520, 4880157, 34952444, -6824166, -12560632, -11308649, -5417028, --19262392, 25382182, -15650324, -5850283, -12737262, -6657736, -6150930, 2789045, -18351858, 51003, --105227, -2714419, 4810900, -19294604, -5166846, 12867185, -13313862, 501974, -17137456, 15925739, --236223, -28861106, -15206869, -5387500, -955093, 7776575, -17750026, -9948218, 11603928, -2227478, -7903277, 7415798, 7138773, -10618770, 805843, 12508019, 4323422, -23822572, 14885820, 10853919, --13157095, 36181340, -1016297, -26229366, 6859600, 8096014, -940598, 19252728, -6307697, -32533840, -8773544, 4517232, 9342628, 11376295, -15178951, 23323820, 8454106, 7176891, -5944235, 35392680, --3097745, 508954, 23851564, -4237522, 10672457, 19085224, 6191196, 2773475, -4990215, 9135395, -8053, 16138340, -7517267, 15712601, 14083198, 817118, 13925895, 8516383, 11010149, -5871757, --442382, 13050795, 9032853, 6993818, 3803194, 4445291, -9069897, -1045825, -3758, -4064650, -117038, -1486059, -4138738, 7577396, -8234526, -1486059, -8092792, 6614787, -3704946, 7934415, --7209640, 1116155, -5165772, -6657200, 4176319, -2521683, -639950, -6482717, -10152766, -7140383, -7003481, 765041, -3572876, 846109, 8820789, 6826314, -3324842, 3352759, -386547, -2533494, -9113921, 434329, 5782100, 7078643, -25146496, -24675660, 50556596, 16301548, -31624918, -15902653, --14525043, -28945932, -2185602, -15280420, 21030844, -11919608, 62814, 26272314, 521302, 4361003, --19399294, 24226836, 18008798, -317291, -5896990, -1889786, -15100031, 1144609, 1854352, 3077344, --20735028, -3004330, -1258962, -6215355, -4669167, -14241575, 13434658, 26760868, 32060858, -2601677, --13088376, -5412196, -6731288, -4482872, -19798726, 6732361, 7625715, 7099044, -20634096, -27404038, -29566554, 11229192, 16518981, 21572010, 20107426, -8719857, -13901735, 19528680, -19929186, 10103911, --14942191, -11344619, -6722161, 23236846, -7791071, 4762045, 7867307, -4175782, -18861886, 38832408, --23555748, 2464774, 27979028, -25368224, -11618423, 3053185, 10162429, 28943784, 5061619, -16681116, -365072, 3591667, -4039417, -6958921, 4041027, -11653320, 8872329, -9630390, -13755170, 7439420, -4015258, 10481331, 4556424, -289910, -4854387, 1267015, 2786360, 3304441, 10994043, -541166, -1412507, 7012608, -16588237, 2476049, -7546795, 1920387, 1703491, -2542084, -6365679, -7601019, --2025077, -7624104, 2901251, 4338454, 9368934, -703301, -6510634, 6205154, 7223598, 4630512, -4356171, -11694659, 261456, 3142842, -3093450, 10355166, -3983045, 936303, 922881, 9588514, --4656282, 3000035, 13113609, 13173202, -8402030, 8269423, 33724084, 20332912, -3025805, -21566642, -2278480, 34583612, 27539330, 5816997, -27341224, -10517301, -23602456, -1741072, 18504866, 22857816, --1656784, 8702677, 27160836, 28908888, 44841068, 45142792, -22509924, 9841918, -24308442, -4375498, --19702088, -7060390, 15570330, -3455301, 6828461, 6140193, -13993003, -10238128, 11464878, 12787191, -16575889, 11795591, -536871, 12160663, 18294950, -9642202, 9277666, 10808822, 3234110, 10557566, -34984120, -26237956, -22592064, -5057861, 21628382, 20735566, -12270722, -120259, 33214592, 26877906, --18775450, -12503187, 11435350, -22925998, 6420439, -11010149, -20799990, 6775311, -24443732, 25475062, -9378061, 28215788, -11793980, -16430934, -31786516, -6841346, 10435697, -27837830, -23816130, -13013751, -12503187, 7428683, 5907191, -12232067, 5375689, -8738648, 3428995, 25959856, -10979010, 3095598, --14645838, 11179263, -6008659, -12285754, 8763881, 12150462, -6674916, -3419868, -3929895, 8745090, -19377818, -6127845, -12932683, 345745, -179315, -4748087, -2004139, -17942226, 2557653, -9501541, --4225711, 6592238, -5814849, -3133179, -467615, -4920422, 8004209, -7837242, -12410845, -11231876, --9460739, 10208600, 5404680, -2238215, 4556961, 3101503, -8007430, -8738648, 3365644, -9320079, --996432, -16200080, 12858058, 33444910, -2618856, -10919417, 21319144, 4041027, -1684164, -32685774, -27900644, -14415521, -31077846, -10842645, 1644973, 34898756, 2955474, 24887724, 9835475, -30410516, --6947647, -26990112, 3835406, -26903676, -19467476, -11794517, 903554, 5140539, -20950314, 19713364, --6928856, 11812771, 12727062, 12596602, 24002962, 44144212, 25723096, -8929774, -22354768, -1190780, -46498388, 28813324, -16410533, 22939958, -9432822, 28115392, -14608794, 2348810, -11045045, -5688148, --2029909, -8440684, 70099768, -13838385, -19899658, -22924924, -32079648, -12596602, -24823838, -1507534, -26825828, -11275900, 7618735, -9495099, -14343043, 24377698, -7330436, 41355168, 7307350, 32996624, --41250476, 16396575, 71271760, 25678536, -40425304, 23396298, 21372294, 902480, 4196183, -12668543, -13230110, 62536336, 33044942, 13718126, 18663780, -20097762, 36005248, -4218195, 5174362, 5375152, -8570607, 3820374, 23540716, -20203526, -5363878, 1321776, 30130270, -5558225, 7074348, 34983044, --3200825, -20090246, -4966593, 12611635, 1735167, -8726837, -20369420, 11212012, 7918309, -14141717, --8480950, 9126269, -17291002, -14445049, 4162897, 6629282, -459562, 4483409, 2919504, 5308580, --6585259, 5569499, -4163434, -5442261, 5116917, 1959579, 7233262, 1270237, 49086644, 22958210, -5514201, -1468342, -53490060, 25012278, 33659660, -24167244, -17597554, 41599980, 27117886, -33199024, --35286376, 1295470, -20618528, 9035001, 3438121, 8628589, -33172716, 8730595, -6437619, -16474958, -29504814, -1993939, -4900021, 9976135, 24739012, 22286048, 15211700, -28338194, 624381, -13793824, --30271466, 11098732, 8571144, 18717468, -6397354, -14049375, 38737384, -27742804, 12277164, 13527536, -10941429, 8389145, -4818954, 22969486, -21242908, -36604396, -6169184, -41938744, 36870148, 22737020, -36178120, -2849711, 7109782, -29143500, 30376694, 38402376, 13732084, -16221555, -42973296, -9803263, --56688200, 911607, -10579578, -38356204, -32639604, 15006079, 2353105, 23721104, -18323404, 27182312, -22767084, -32075890, 6772627, -19127636, -5478768, -28967406, 3647501, 84664544, 21050172, 24902758, -30935576, 13914083, -24062554, -3207804, -402653, 20162724, -4671851, 20718922, -9413495, -12613245, -428423, -1336272, -23790360, 20496658, -3852049, -5706938, -7442105, -16502875, 2297271, -7728257, --10705743, -15320148, -12251394, 7660611, -8880919, 7510287, 8304856, -5780489, -10000831, -13190381, -5989869, -2254858, 5564667, 20565914, 12589623, -59593, -1822140, 6717866, 12619151, -12421582, -11109470, -12517682, -9677635, -6501507, -34489124, 14126684, 10612864, -16615081, 4898947, -8913131, --51514912, -14174466, 11923903, -6641630, 4959614, -29046864, 36325760, -49384608, 3209951, -36374616, -24137716, 26567594, 8295730, 22110492, 1924682, -24241332, 39485780, -19462644, 3626026, -131533, --23657754, 37287296, 2057826, 9114457, 7752953, 11120744, 5755256, 27750858, 33030446, 10596758, -38691748, -34850440, -3179887, -719407, 49633180, -10327249, 39464308, 21613886, 54438712, 10096931, --13014825, -18253074, 21309480, -41828148, 38262252, -24119462, -14373645, -7216619, 7292318, 28703266, --7417409, -54010824, -15349676, 85661512, 5865315, -55067924, 12903692, -36701032, 10173704, 84393424, --23939074, -23976654, 58525908, -64404644, 31655520, 13942538, 18722836, 54732380, 34507916, -49932752, -60109676, 39291436, 1305670, 64012728, -27099634, -9491878, 46292232, 30275224, 5084168, 12001212, --568009, -1190243, 5151277, 15524696, -15023796, 16444893, 16928614, -15033459, 7057705, 11306501, --21284784, -2423972, 7280507, -2430952, 3460670, 25904022, -54224, 17108466, -9767293, -209917, -12269648, -8435316, -7130183, -17749490, 2492692, 15392089, 10087268, 14481556, -28314036, 15183783, -17725330, 7885023, 2720862, 7182259, -1742146, 16224239, 29122562, 6929930, 13814762, 13231720, --7295002, -8043937, 13629542, -17837536, 6533182, 21031382, 28759638, 55328304, 27262842, -27252104, -35153232, 10227928, 31649614, -9737765, -60189672, 60170344, 52056076, 31911070, 98784248, -9691057, --83984328, -43519292, -39964672, 87743496, 64167348, 15281494, -6236830, -16480863, -58941448, -28051506, --19541564, -33848100, 89034672, 72438920, 100494184, 1557999, -116409184, -180537344, -88581016, 100124280, -134815808, 138098768, 55082420, -114971976, -211450896, -129483600, -65932580, 96991632, 164600320, 93664648, -50338628, 13450764, -75295072, -100406136, -75722960, -5835250, 57402236, 117700896, 140162496, 24905978, -26817238, -111965504, -186105760, -98952824, 91629368, 154969392, 146244704, 91710440, -54681376, -180370912, --117513528, -151249424, -196495, 102584224, 110147656, 55569896, -44787384, -94945080, -84919560, -66521528, -18937048, 63230508, 43695924, 127927208, 45457932, -28587302, -76354856, -28027346, 84505632, 124579824, -41313828, -4802847, -76911592, -15412490, -17837000, 49240188, 17942762, -12469901, -53335440, -15726023, -2281165, -8392366, -16450262, -3366181, 11846057, 26725970, 44409424, 21805012, -44923212, -39390220, --37584184, 8978629, 46812996, 52789444, 23822572, 5743982, -34235720, -14410689, -66530656, -58237608, --5582384, 17456894, 72030896, 109260208, 40970768, -37848324, -90406912, -111916112, -47491064, 88172456, -144818240, 99920800, 29904246, -72689640, -119256208, -57994408, -702227, 21912924, 21101712, 50888920, -25439628, 11517492, -30572114, -63838248, -48721036, 7090454, 32094680, 64072860, 29829084, 11056856, --12150999, -31938450, 37855840, 5827734, -53692460, 7426536, -13616120, -21278342, 16786342, -16189879, --6130529, -28504624, 2188286, -10580652, -21129092, 9181029, -1918777, 7778723, 4045859, 18529562, --17121350, -5411122, 6003291, 2517388, 8926553, -6978785, 18712636, -12224014, 13084081, 6497749, --5253282, -12865575, -5164162, -24596740, 28038620, -1894618, 1584843, -4172561, -5863704, 2108292, --115427, 1313186, 11278584, 6924561, 386010, 15977815, -12577812, 5355824, -11904039, 14426258, -9150965, -9822053, 8051453, -12125230, -13627931, -11005854, -21403432, -1803349, 17364016, -14576045, --29368450, -20046760, 2523293, 18916110, 1098438, 14237817, -27907086, -6989523, -2609193, -2087891, --27269284, -6515466, 1651415, 4568235, -9313100, 29637958, 12458090, -9006010, 27602682, -2261300, --47400868, -1620276, -6295349, -3956739, 9984725, 6454262, 13495324, -14696304, 21387326, -35038344, -10917807, 6569690, -781684, 301721, -1591822, -2139431, 12566537, -1938641, 2807835, -5047661, -187905, -10106058, 3364033, 326954, 21368536, 66035, 9873593, -9291625, 1882806, -4565014, --11463268, 3988951, 433255, -5847061, 15475304, -2610266, -3069291, -5787469, 11564199, -3934190, --19683836, 4363687, -3278671, 6480032, -7937100, 1064615, -1750199, -12363063, 12310450, -10934450, -8729521, -10452340, 6394133, -869194, -3150359, -6048925, -28829968, -47554952, -74947176, 3175055, -62592704, -23360864, -37768868, -40370008, -38153268, 8489540, 8391829, 72116792, -9980430, -9842454, --31503048, 4024921, 10085120, 23025320, -23592256, 12603045, -17058536, 28530394, 9323300, 9658308, -3749507, -16996796, -9134322, -10910291, -3395709, 10637560, -10170483, -8799851, 20153598, -17597018, --10926397, 16844324, -15226196, -5239323, -13024488, -21328270, 8052527, 14805826, 2968359, 13981729, --20184736, -4730370, -278636, 12395276, 15060303, 18757196, 1598802, -1411971, -30537754, -31205622, --11414949, -9778030, -6629819, 15065672, 20251308, 28673202, 3409130, -12346420, 28532542, -19661286, --8725763, 13080860, -8551280, 37593848, 2174864, -5658620, 6565395, -13025025, 11034308, 26209502, -21325586, -7075959, 8238284, -24429774, -16023449, -8732205, -5896453, 19041738, -2136209, 18606336, -5063767, -5427228, 2428267, 3768834, -21383568, 13401909, -15765751, 10484552, -7104950, -3987340, --884226, 12331388, -11001559, 1928977, 2220498, 10837276, 18317498, -8680666, -2469069, -13859323, --5554467, 5487895, -5433671, 4468377, -4202089, -5373541, -9772124, -15185931, -8433168, 14825690, --5407901, 7559680, -10084046, -1882269, -615254, -2758980, -9024800, -3653944, 1245004, -573915, -326954, 517007, -13766444, -1792612, -2968359, -2401961, -18254, -331786, -458488, 19676856, --48499844, -113441360, -86673512, -9976672, 37591164, 97933304, 82705504, 78947408, 80641768, 53213572, -22452478, -29025388, -51478940, -98328984, -72421736, -71191768, -70950176, -44144748, 42890616, 57752816, -84897544, 65158412, 54626080, 18022220, 36456756, -8178155, -9375377, -11425150, -19862614, -37238976, --30461518, -62727996, -22797150, -49818400, -23684598, -11780022, 16371878, 3266323, 23402740, 5402532, -32754494, 24040542, 39611948, 52576844, 65375844, 41773924, 28128814, 46410344, 3648038, -15801722, --57268556, -67242544, -92423936, -82455320, -77014136, -29546154, -50523312, -26491358, 3172907, 13933411, -32726578, 62279172, 66469452, 74185896, 112173272, 63084480, 85959472, 59528248, 13653701, -9144522, --35116728, -89731528, -98018672, -93437552, -103546296, -76134200, -52995064, -42642584, -11571716, 21776022, -36666136, 46416784, 69224672, 73356968, 77413024, 72982232, 45637784, 31731218, 15218680, 1593433, --84289, -22115860, -35942972, -52172580, -61844308, -65848292, -62116500, -43814572, -19519552, -17706002, --6530498, 11581916, 31139050, 38534984, 73295224, 51481088, 40880036, 40605696, 14847165, -1808718, --10393284, -13100187, -13606993, -35614944, -31688806, -23176718, -23957864, -17803176, 2532420, 5350456, -7217156, -4462471, 11850352, 140660, 13989245, 14011794, 4878009, -5135171, -357556, 2819646, -2206003, 1956895, 6767795, 1156957, -3025268, -10609643, -2102923, 1983738, 8053, 6002754, -5268315, -1473711, -657130, -4804995, -3190087, -2823941, -1261110, -2446521, 1765232, -1743757, --617402, -950798, -2094333, -4354023, 29528, -464393, 2777233, 5421323, 4323959, 2544231, -3782793, 185220, 380105, 331249, 1015223, -1130650, -767725, -1467268, 365072, -576063, --2053531, -2494302, 231391, 163209, -239444, -2229625, -2304787, -2415919, -2183991, -1312649, -1249836, 1064078, 2116345, 2105608, 2078764, 129923, 1161789, 821949, 1349694, 1102733, -2400887, 1823214, 1890859, 54224, -1342714, -2214056, -1748052, -2559801, -2193118, -2351495, --1880122, -2445984, -1537598, -900869, 12348, 423054, 1247151, 1659468, 2736431, 2810519, -3400004, 2326799, 1705639, 797790, 542777, -890669, -1589675, -2235531, -2376191, -2357937, --1411971, -1159104, -619549, -324270, 166430, 182536, 581431, 563178, 661962, 550293, -535797, 281857, 249108, 101469, 90731, -9127, -37581, -84289, -87510, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --9311489, -7208566, 353261, 3310883, 3283503, 9331353, 4386772, -3447248, -4356708, -6072010, 4347044, --5311801, -3867618, 869194, 1332514, 577136, 5469641, -1786170, 5111548, -1307818, 4587562, --4346507, 2007897, -1918240, -4655208, -323733, -8873939, 1334661, 2167348, 3969624, -3246995, --47245, 3449933, -2540473, 3876208, 3664681, -2207076, 2633889, -2954401, -1363115, -2188286, --3172907, -4052302, 3625489, 5332202, -3991635, 2359011, 4305705, 3464428, 5269925, 647466, --781147, 3049427, 2334852, -5576478, -202400, 628676, 364535, 1750736, 3616363, 792958, -1318555, -1946694, -1210644, 2535105, 3594351, 1980517, -1886028, -3339874, 3706557, -3017215, --961536, 2049236, -609885, -154082, 1588064, 353261, 114354, 3328600, -3263102, 2473901, -1372779, 1614908, 3107946, -1266479, -343061, -1067836, -417686, 104690, 1530619, -1225676, --202400, -854699, -461709, 26307, -100395, -508954, -324807, 315143, 467078, -35433, --177167, -361851, 68719, -134218, 72478, -508417, -86973, 453119, -1046361, -518617, -3697430, -1941862, 2712809, 270046, -215822, -7494718, 1218160, 6404870, -3911642, 2652142, --7956964, -8054675, -2643552, -6548215, -5709622, -852551, 1197759, 4515085, 732829, -2161979, -1036161, 3075197, -3948149, 5501853, -3705483, -4017405, 4671314, -2308545, 5379447, 6822019, -962073, -4908611, 3457986, 2254858, 1397475, -2494839, -1794223, 2868501, 2409477, 492311, --5536213, -1597728, -5112085, 4641249, -4611721, -3016141, 3433826, 166430, 2983392, 852551, -1158567, 5049271, 875636, 5662378, -7272454, -3741454, -1663763, 3619047, 5135171, 5845988, -7973607, 866510, -2241436, -757525, -1043140, -240518, -5143224, -2260227, -2223719, -627065, -822486, -4189741, -2456721, -944893, -1759326, -3275986, 3963181, -3938485, -1317481, 2623151, --6722698, 2040110, 3706020, 4081293, 2174864, 1182727, 2473364, -1199370, -2590402, -661425, -732829, -282931, 733366, 127238, -699543, 49929, -1020592, -1235877, 1531693, 673773, --110059, -13959, 17717, 1137630, 559956, -448824, -436476, -469225, 115427, 839129, --970663, -173409, -25233, -190589, 587874, -32749, -374199, 8527658, -6336688, -2383170, --1255204, 5239860, 4730370, -4791036, -442382, -8886287, -1945083, 10754061, 4049617, -4339528, -7722888, 2512019, 2967823, 779000, -2595771, -8482024, 1134408, -3825742, -2418067, -1558536, --5166309, -1837709, -3999688, 2778844, -1811939, -2349347, 4831838, -9128953, 8387535, -2967823, -1190780, -2866354, 2616709, -351114, -840203, -236760, 3569118, 165356, 2255932, -3270618, -6283001, -4899484, 7316477, 1546725, -726386, -4109747, -4809290, 9935333, 1713155, -9337796, -9534827, 8975945, -4883378, -1801739, 2820720, -3694209, -688269, -2281702, 2254858, 5720360, --3490198, 1297617, -2614561, -2401424, 937377, 7704635, -7080254, 4280472, -7297687, -5623723, --5271536, -944356, 141197, -18790, 4411469, 6818261, 1779727, 1642825, 3333432, 2690797, -1490891, 1680943, 1996623, -756451, 2150168, -1001801, -2121714, 3620658, -188442, 484258, --666257, -1096827, -638876, 6979, 1531693, -406411, 338766, 136902, -1374926, -4832, -751082, 950262, -118112, 662499, 2240362, -3468186, 197569, -6659347, 6029061, -9280351, -188442, 9354439, -17450988, 11879343, 4650376, -4753455, 3629247, -506806, 10331007, -1250909, --8837432, -6215892, 3369402, 3915400, 1012539, 137976, 4303021, 1187022, 579821, 5902359, -2324114, 1585917, 4208531, 2993592, 14799384, -4249334, 3830037, -352724, -2602213, 3743601, -2263448, 1383516, 1750736, -2583423, -4285841, 141197, -153008, 81604, 2017024, 4430796, --4800700, -5073430, 1988033, -1314260, -2038499, -3089155, 5936182, -4495220, 8644695, 4003447, -240518, 1936493, 594316, 2276870, 11023034, 9258876, 565325, 404801, 1998234, -2371896, -4032438, -1045288, 3621731, 1038308, 96637, -117038, -4914517, 4441533, 3342022, -1140314, --2888366, 259309, 4242891, 311922, -1382443, 133681, -3475166, 2291902, 759136, 2953327, --962610, 795643, 1139777, 1167694, 929860, 1729798, 727997, 709743, -4203699, -345745, -1432909, 2166811, -1538135, 1369021, 1211181, 1107028, 1217086, 477278, 907849, 1220845, -1334124, 131533, 418759, 325344, 527744, 113280, 228170, 823560, 204011, -278099, --1053878, 461709, 1211181, -1126355, 2188286, -1037772, 4825933, 97174, 5572720, -2154463, -4939213, -3765076, 10352482, -7946227, -2984466, -3797825, 10672994, 6044630, 3907347, 6781754, --6163815, -1249299, 9843528, 5594732, 4603668, 4786741, 2527588, 3287798, -1162326, 9463424, --1016834, -4361540, -3274376, 3317862, -3606699, 2169495, -8990440, 3317862, -1755031, 178778, --9659918, 4152697, -2105608, 9037148, -1516660, 2866354, 2433099, -3796751, -992137, 4125316, -518617, 2833605, -2085744, 5022428, 7050189, 913754, -5006858, 1918777, 4939213, 3588982, -605590, -3374771, -7038915, 5872831, -7832410, -3266323, 4299263, -10284836, -2422362, 6419903, --4825396, 1372242, 24696, -550830, -1444183, 2631741, -5207648, 317828, -8652212, -4409321, --11802033, 923418, -3362960, 296890, -2346126, -324270, -3058554, 2731062, 2494302, 1082869, --1932198, 2528662, -360777, 1017907, -3462818, 913217, 609885, 1137093, 656593, 2377801, --385473, 2677912, -1236951, -115427, 1730335, 2521146, 291521, 1424855, -1676111, -533113, --543313, -546535, -1234803, 834834, 1818382, 595390, 1921998, -1846299, -1257352, -1000191, --2771865, 357556, -498753, 1336272, -477815, -446140, -2903935, 2960843, -18807124, 3463354, --5826660, -3331284, 4493610, 3433826, 2462627, 964757, -13776644, -1342177, 4487167, -7358353, --1810329, -10113574, -5060545, 2399813, -1066763, -9307731, 9963250, 6032819, -2851322, 1165547, -7871065, -4887136, 2225330, -3315715, -5235565, -3580392, -9591199, -3546569, 7498476, 3548717, -9539659, -4670777, -15213311, -6562710, 3904125, -4857071, -9866077, -1624035, -1738388, 9206799, -4804458, -10597832, 7259032, -7486665, -325881, -5395016, -5120675, -4939750, -11667279, -6932077, -986232, 7632694, 11559904, 7379291, 2247879, 4604205, -5115306, -8710731, -5299453, 5585605, --2575907, 6019934, -1703491, -5524402, -175020, 551366, -2586107, -6231998, 489626, 4760971, --15236396, -10098005, 14413910, -4610111, 389231, -7856032, 3878356, 2157684, -830539, -579821, -5335423, 3904662, 1276142, -1606318, -1855963, -326418, -2084670, 1260036, 1636919, -2998961, --1430224, 1148904, 437550, 28454, 993748, 3002182, -3083250, -1439351, -5717675, -2345052, --781684, -1067836, 383326, 843961, 1741072, 134218, 2207076, -2499671, -1715303, 460098, -601295, 858457, -2028298, -1159104, -2830384, -124554, 1053878, 7065221, -380641, 3485366, --5144297, 3461207, -6963753, -663036, 11621108, -5742908, 10970420, 11110007, 13757854, 3296388, -5407364, 11821897, 9239012, 6730751, -9473087, 1021665, 2785823, 7861938, -1742146, -7102266, -8789114, 8872866, -2724083, 5845451, -3159485, -3357591, 5539971, 4711579, -833761, 5626407, -371515, -9730785, -7756711, 8035347, 11816529, -1145683, -4275103, 2318209, 235149, -5907191, --10815265, 5367636, -10231686, -5131412, 7599945, 1421634, 6711424, 75162, 10822781, 1301375, -11899207, -14200236, 12565464, -2685965, -592706, 3595425, 6593849, -5604396, -11675869, -3512747, -10506564, -2296734, -12481712, -7549479, -7682623, 1816234, 4389457, -11021960, 5364951, 6000070, -11118060, 3207267, 3447248, -204548, 3074660, 334471, 2391223, 1449015, -8241506, -1156957, -3823058, 2480881, 6546604, -4588099, -1396938, -327491, 475668, 2898566, 347892, 2347200, -1001801, -1527398, -615791, 2220498, 2230162, 613107, 2438468, 426812, 1047435, 3009698, --12348, -2036351, -965294, 444529, 1551557, -500901, -809601, 2370822, 1321239, 306553, --2759517, -1160715, -1595044, -1643899, -166430, 2539936, 120796, 2399276, 1904281, 1509144, --226023, 115427, 3729642, 12017855, 1519882, 5000953, 14299020, 15403900, 4580583, 3850975, --11428371, -5792301, 12590160, -9393630, 12869333, 3606699, -67646, -2598455, -4519916, -7478612, -1353452, 5678484, -13872744, -6309307, -5905043, 3044595, 2777770, 3006477, 423054, 2323041, --510027, 4146254, 3394098, -3710852, -6502044, -12020540, 2114198, -6511171, 10824391, 398358, --6003291, -7577933, -2299418, 4988605, -9403831, 5852967, -3139084, 1904281, -97174, -6742562, -6670621, 8387535, -5763309, 7050726, 2040646, -585189, 20230370, -5124433, -13090523, 2444373, -4951561, -3318936, 1117228, -5746666, 13748727, 7941395, -1336272, -2976949, 9774272, 9271224, --1920387, -7982734, -5737003, 19049790, -1725503, -2671470, -7664369, -5040144, -1500554, 1814624, --1959042, -5123896, 8265128, -2648384, 9802726, 2786360, -3032247, -1122597, 1793686, -100395, --1622424, -1751273, 3490198, -4388920, -1012002, -1212791, 5696737, 468151, -1169842, -192737, --2813741, -2734821, -292595, 517544, 5981279, -1443646, 3576097, 1287953, -1850594, 1158567, -317828, -2922188, 2287607, -1484448, 3132105, -356482, -3033858, -2354179, -1692217, -2369211, -55835, -791885, -889595, 998043, 1187559, 1591285, 716723, 5102421, -10403485, -2849711, --3186329, 1008780, 4613332, 10517301, 9204652, -14371497, 461709, 1839320, -1340030, -4195110, --9863392, -888521, 3498788, 6073084, 4956929, -9039296, -1472100, -11494406, 11025181, 613107, --956167, 5374078, -5056250, -813359, -12262669, 2213519, -7271917, 5239860, -846109, -1941325, --4067871, -8089571, -7875360, -816581, -9743133, -15947214, -2871723, -7197829, -15336791, -1127966, --1213865, -8329552, 5652177, 8614094, -942208, 4170950, -959388, -1219771, 2412161, 2630131, --12406013, -3567507, 6972343, -5908802, 15077483, 2826089, 4100620, -9539122, 12348, -4241280, --9752797, -930397, 14000520, 6565395, 10662256, 5985037, -4498978, -11084774, -17411260, 11877195, -12152073, -1315871, 6328635, -13535053, 6638946, 5713917, 9912248, 1599875, -11588359, -1381906, --10795937, -3657702, 1004486, -3415036, 2408940, -2302103, -3518115, -817654, 1151051, -419833, --1086090, 3332895, -904628, 1367410, -7814693, 265214, -556198, -1130113, -3495030, -1403381, -2466922, -3210488, -3786014, -1273458, -1305670, -1477469, 69793, -824634, -4203163, -3337727, --2055142, 1333587, 1516124, 2635499, 1275605, 2429341, 868657, -2977486, 703838, -387621, --1833414, 1272921, -3524021, 1653026, -1878511, -204548, 2496987, -26996016, -6667937, 21667574, -7321309, 8902930, -5499169, 8989367, 15148887, 1213328, -2411624, -24930138, -5721434, -1070521, -14475650, 4144107, 5877663, -18654654, -4926865, -6873559, -4341138, 11761768, -6455336, -2184528, -2150705, 3437048, -5794448, -2493229, 3143379, -5145908, 11598022, -12759274, 1527398, 8563091, --10879689, 9131637, 15506443, 17986786, 8732742, 8847633, 11887396, -7967165, -14631343, 5983427, -6564321, 9854802, 7915625, -16611860, -4605279, 8857833, 5217312, 3273839, 10627897, 2435247, -12356084, -4460324, -2479270, 7063074, 6609418, 2025077, -10598369, -5672041, -11395085, -13153337, --611496, -14394046, 927713, -8351027, 762894, -7590281, -4361540, -18514530, 12986907, 3449396, --2598455, -3266860, -1924682, 2549600, -6707129, -902480, -16000901, -8801999, 5798743, 7376070, -3184182, 2513093, 803696, -8426189, 4055523, 3927211, 3186329, -8051453, 2027761, 365072, --6274411, -2129230, 1300838, 1063004, -3144453, -4799626, 1777043, -2337536, -2786360, -693637, -884226, -563178, -180926, 1682554, -1321239, 2325725, -203474, 3300682, -1255741, 2952253, -4763656, -3210488, 2741800, 256624, 1969243, -1967632, 3221, 2670933, 2323041, -3964792, -2328946, 2127083, 17065516, -8222178, -7027640, -6220187, 11768210, 14925011, -9272298, 23913842, -5065377, -10137197, 12264816, 3540127, -9884330, -11620034, -9375377, -704912, -5012227, -3414499, --15512348, 6295885, 6528887, 21571474, 2959769, -3617973, -9667435, -10120554, 2618856, -1151588, --13568875, 2464774, -5007932, 704912, 10547366, -8079371, 13935558, -12149389, -10218264, -641561, --15928423, -19046032, 3131568, -2137283, -22009560, 1576790, 282931, -10437307, 5534602, -5043902, -2808909, -14843944, -24295020, 16020228, -14856829, 24790552, 13526999, -17629230, -2246268, -17864380, --4813048, -2219961, 7452842, -6402723, 11364483, 14360760, 13600551, -9756555, -7980586, 1321776, --12015171, -1072131, -3911105, -15822123, 9498320, 7078643, -8445516, 12542378, -18553722, -1734093, -1120987, -4813048, -3122441, 16173773, 11918534, 7977365, -967978, -8372502, -6817187, -6300717, -2794950, 2644626, -512175, 1870995, -490700, -701153, 340376, -633508, 648003, 3259880, --3835943, 1571421, -277562, 3583077, -2071785, -327491, 2038499, 4772783, 1867774, 3859565, --4562329, -4927401, 2348810, -3268470, 784368, 19327, -5322002, -2921115, -3185255, 95563, -1716376, 1613297, 1040993, 1282585, -765041, -14761266, -11299522, 6895033, 8423505, 9339406, -16013249, -6328098, 29722248, -1238024, -15840376, 6482180, 14503568, 3753802, 7483981, -6880001, --16939888, 24739012, 13613973, 9963250, 4575214, -8965744, 7779797, 20554640, -7947300, 4176856, --488553, 4095251, 3313567, 14561013, -4554813, 4757750, -5518496, 4224101, -1686312, -1091995, -8955007, 1667521, -18685792, -12651900, -17525614, -12121471, -9418326, -4846871, -13474923, -7776575, --6747931, -11758010, -8218420, 4758287, -12215961, -4425964, -9538585, 21910238, 11048803, 19035296, --17764522, -1947768, -16251083, -3686156, 17693118, 9563818, 20890184, 9772661, 12838731, -14199699, -6038724, 5857799, 19332184, 19561966, 5716065, 17669496, -15716896, -7707856, 11298985, -40936408, -499827, 6364605, 618475, 9772124, 6284074, 22593138, -2000918, -3484292, 24592446, 7180649, --2428267, -11434277, -448287, -128849, 20117090, 2378875, 328565, 1320703, 3893925, 6017786, --1352378, -1481227, 6347962, 2826625, 1921461, 3140158, 4552666, 3354906, -455267, 476741, -440771, 6458557, -1409823, 3250753, 6348499, 4500589, 7108171, -3532611, -2630668, 1402844, -2169495, -2800856, 9127, 3879966, 6592238, -754304, 1832340, 697932, 17507898, 11383274, --11445014, 22373558, 13288092, -1123671, -5568425, -2806224, 13444858, 33039036, 17666274, 4751308, -1395864, 10853382, -2635499, 26665842, 15094126, 16653199, 697395, -8496519, 5672041, 1999307, --14161581, -3506841, -874026, -3365107, -4020090, 5397700, 2974802, -11653857, -5551782, -20580946, --2080912, -6416681, -26422102, -11908334, 837519, 9868224, -13577465, 16990354, -4676146, -4104915, --2276870, -4198868, 12428562, -8379481, 8703214, -27171036, 8443369, 11780558, 9181029, 18017924, --17792976, 15418396, -15963857, -12027519, 13452374, -7911867, -2319282, 11172284, -18103288, 16041703, -25898652, -601295, -3681861, 32876364, -7022272, 6263673, 18655728, -39695700, -20198158, 1258425, -1289027, 5283347, 9614284, 19175956, 11677479, -15245523, -12046310, -3695283, -4235912, -20565914, --1901597, -4184909, 5146445, -21490942, 344671, -6555731, 8798777, -3344169, 11178189, 2853469, -205622, -6455873, -4538170, -6080600, -6192269, -4962298, 4476430, -13131326, 9439801, -1686312, -5313949, 177704, -701690, -9016210, 5005785, -6448357, 1748052, -6845641, -3512210, -198642, --2816962, -7839926, 718333, -2568391, 1002875, -5394479, -5611375, -6317897, 1273995, 1148367, -7955890, 8143258, 106300, 10737, -9960566, -5936719, -31372588, -18854906, 23170812, 23038204, -2513093, -5401458, 19544786, -31470836, -16874926, -34055332, 14954539, 4176856, 1556389, 6649146, --15470472, 7894687, 10833518, 14186814, 24017994, 24679418, 20742008, -797253, 4723927, 309238, --8965744, -1823751, -7479149, -3846680, 28615220, -6634651, -26226680, -6601902, -5361193, 2386928, -41210212, -14846628, -14714021, 13967771, -22250078, 7744900, -24693914, 32352378, 9176198, -871342, -8334921, -12437152, -15735686, 22174380, -26884884, -21482890, -19307488, 5395016, 8135205, 10103911, --17909476, 18447958, -5644661, 1414118, 28427852, -1913408, -4779762, 8381092, 22952306, -14803142, -38034084, 1433982, -43725988, -5301601, -1635846, -14593225, -4168266, 15032, -4046933, -11915313, --9993852, 21559126, 14482630, -5280663, 14016626, -25121800, 7108171, 11290932, 7064148, 835908, -13503377, -2195265, -542240, 5057861, 13204340, -5424007, -5680094, -4463008, 662499, 4991826, --2474438, -10349797, -11089606, 569620, -5172215, 3891777, -70867, 2753074, 5984500, -7232725, --4727149, 12559558, -2826089, 2289755, -893353, 353798, -4204773, -4746476, -2336462, -1578401, --6582575, 3244311, 6177237, 3434363, -30065, 589484, 2838974, -5094368, 1266479, 5856725, --488553, 5027259, -2736431, -9073655, -12213276, 314069, 5277441, -9043591, -4212289, 41611792, -24591908, -33838972, -27376658, 33463700, 31887448, 19898046, 22870164, -40256728, -8965744, -11210402, -10414759, 3738232, -16353088, -29773788, -45028976, 12970264, 11674258, 3325915, 12173011, -6280853, --2419677, -10799695, 8740258, 15377594, 13770202, 3491809, 18350248, 5790690, -2267743, -7699803, --27441620, -1615445, -11645267, -9657771, 9313637, -29404956, 2448668, 1033477, -13825500, 11803107, -10778220, 5268315, -19862614, -18459770, -48438104, -12428025, 165356, -15604690, 2546379, 10052908, -9975062, 26846766, 13063143, -12064563, -8541616, -18073222, 22515830, -9681930, 39105140, 32694364, -8913668, -21115670, 43190728, 19822884, -17762910, 2557653, 21604222, 50334868, -21047488, -38707856, --20096688, 399432, -14108968, 5960878, 13721347, 11493869, -10324565, -15902116, -8919036, -13254806, --14621679, 3880503, 15479062, 12407087, 6843494, 6123013, 2080375, 10420128, 1224603, 1578937, -15122580, 11906186, -911070, -5147519, 3255048, -8097624, 8317204, -3150896, 8516920, -4580046, -3280281, 2176475, 5554467, 7330436, 4162360, 3357054, -7454990, -14355391, 1471026, -7334731, --3887482, 4205310, 1066763, -2201171, -2989834, 10210748, 3170223, 13849122, -4694936, 7373385, --7218230, 7154342, -9867687, 9516037, 128849, -8303783, 16362215, 5645735, -6147172, -16498580, -13246753, -27743878, -25694104, -9438728, 19360638, -11578695, -14742475, -435402, 22354232, 2105071, -23110146, -8121783, 27962384, 2981244, 14840723, -10188199, -6930467, 8671002, -29458644, -8397735, -10700911, -5457293, -4215511, -23720030, -22455162, 10046465, -13808320, -9949292, 17897666, 24694988, --3946001, 16165720, -29767344, 1575179, -8281234, 38078644, -16065862, 12538620, 23205172, 22134114, -6278169, -15787226, 9683541, 6937446, 6546604, 12179990, -37963216, 69450696, 22033182, -6286759, -3446175, 7646653, 19123342, -5529234, 14675366, 40447856, -2518462, -50347756, 20783346, 17328582, --18025440, 23449984, -5388574, -10650982, -27106076, 51892868, -26978838, 57794692, -38331508, 14203457, --918586, 62804768, 27736362, -27005144, 25626996, 1016834, -16889422, 12538083, 1787780, 5586679, -13909252, 5889474, -16340203, -4305168, 19026706, 5048734, 10699837, -8928700, 11844446, -20391968, -7390028, -1234266, -6710350, 12539157, -7164006, -4035122, 8942122, -1632625, 1213328, -1685775, -15137612, -10087804, 14770393, -8886287, 13655312, 19216220, 7034620, 5153961, 10537165, -2854543, --7721278, -7463043, 9077950, 3118683, -1654636, -201863, -2523293, -13932874, -10774999, -2219961, -319975, -3225521, -8215199, 47862580, 5806796, 26023206, 13331042, -26200912, 1743757, 15671799, --4588099, -22813792, -4276714, -49846852, -13864691, -18528488, -10653666, 10961830, -1348083, 17928804, --8643622, 1994476, 17521320, -15455977, 1795296, 9978283, -859530, -16969416, 91268, -11644193, -34564288, -5993627, 20084340, 3276523, -213138, 35358856, 25565792, -15511274, -18130130, 8992051, -16112570, 19419158, 23662048, -403190, 8429947, 22351010, -1086090, -8954470, 7117298, 804770, --19656454, -430034, 13165149, -19449760, -26097832, -2465311, -1456531, -2797634, -8671002, -9461813, --31117038, -4295, 30814242, 9463960, 17202418, 10098542, -3983582, -40372692, -29484414, 7975218, -26275000, 8548596, 13348221, 53069688, 55234352, 46629924, -3563212, 23182622, -14635638, -39127152, --65112240, 11361799, 8188355, -2894808, 9208410, -20623896, 4573067, -5012227, 24068460, -1781338, -19358492, -23625542, 11797201, -29016800, -5476620, 12276627, 2238752, -14766098, 3625489, -12159589, --13018583, -5604396, 3651796, 11110007, 14496588, 18853832, -4369056, -1004486, 5046050, -5151814, -6238977, -19510426, -16470663, -11573326, -15395847, -15022722, -15720654, 10365367, 7740605, -2641405, --10230612, -15908559, 9905268, 183610, 15527917, -3724811, 13798656, 10008348, 870268, 4323959, -16514149, -19417548, -17979806, 11209328, -1350230, -3846680, -8477729, -15013595, -31344672, 8661338, --18883898, 8934069, -8324184, -22174380, -7012071, -317291, 10695542, -9466645, 5345087, -32454920, -30012158, -67833104, -6964827, -17070884, -14056891, 8912057, 38540352, 6072010, 13865765, -33478196, -7285339, 12144020, 26436060, -13992467, -21729850, -15095736, -7489886, -1153199, -753230, 15968152, -11543261, -9622874, -49052820, -23337778, -39921184, 4491999, 69927976, -49710488, -19812148, -7740068, -40345848, -13660143, 16965120, -13057237, 19364396, -7837779, -11988327, -25268904, 12826920, -29266980, -26834956, 48631376, 6113886, -9084393, -9259413, 40321688, 10579041, -459025, 21223044, 6919729, -7582228, -7873212, 46588048, -73550776, 53046068, -44850732, 21104396, 52428664, -42284488, 85072024, -57886496, -21922586, -7431904, 58480276, 21240224, -5647882, 38427608, 34481608, -45117020, 60339996, --36705328, 10664941, 11431592, -16288127, 11508902, 19660212, -12360916, -22203370, 7031399, -12006581, -4977330, 4984847, -6227703, -17426830, 6761353, 6104223, -7243999, 7202660, 5719823, -14043469, -34078956, 3628711, 563178, 625992, -7082938, 5133560, 4463545, 1707250, -11301133, 5691369, -1422708, -4985920, -9928354, 21020644, -8149164, 17073568, 19471234, -2110440, -7416872, 5057861, -4677757, 7484518, 23499376, 20217484, -18413598, 8354249, -7568806, -1220308, 26863410, -5374078, -7395934, 10456635, -1822140, 49576272, 47245712, -40379672, 39336532, 36202816, -34082712, -51423644, --75990320, 17662516, 113978768, 46814068, 150324, 23501524, -109073376, -45059040, -3927748, 16583942, -81948512, 80216032, 13782550, -30966714, -60473676, -35437776, 4018479, 25885232, 39133056, 63073744, -38016368, -50876572, -120268744, -97982160, -9711458, 108990704, 118508888, 74907984, 22803592, -25206626, --48505752, -73189464, -41815264, -44527000, 87150792, 72575280, 45768244, 40587976, -61814244, -86485072, --100442104, -89874872, 34507916, 121685552, 149747792, 50645180, -45512696, -106705776, -128080216, -34835404, -20484310, 13207561, 79959408, 31400506, -30369176, -17949742, -61758408, -13471165, -70592080, 30496416, -83406120, 156241776, -9626095, -83560200, -181633088, -7111392, -61508228, -6534793, 86851752, 17223356, --8134668, -38827580, -81912544, -53602804, 39107824, 63381368, 20696374, -11084774, -28018220, -33360084, -32327146, 37343668, 22903450, 19995220, 8762270, 18644990, -1986959, 1766842, -18341658, -8407398, -1874753, 47131896, 41020696, -2130841, -17879412, -4583267, -42286636, -28260348, -1284732, 16073378, -43290048, 33538862, 23566486, 2179159, -58849104, -52795348, -35974648, 13852880, 56315076, 109620448, -66880156, -50539416, -91258392, -80380848, -32638530, 2295660, 74815648, 94476936, 70224864, 12411382, --56346748, -127380680, -80533856, 25942140, 78785272, 90319944, 26107496, -13225815, -35366908, -41518912, --24072754, -7653632, 8575439, 19859928, 24829742, 19891604, 4555887, -1738388, -17478906, 871878, --10297184, 51507932, 30177514, -4413616, 11043972, 5681705, -36484672, -3705483, -2859375, 4110821, -1257889, 3047279, -13268765, -5235029, -4822175, -3251290, -5973226, 22024592, -7754027, 9530532, --16372952, -1541356, 6923488, -660351, -4894115, 37953552, 5352603, -21298742, -24774446, 5354751, -5348845, -14506789, 4174708, 19125490, 9986336, 18008798, -18191334, 5663988, -532039, 4420595, --12771085, 2574833, 14413910, 20368882, 5240934, -5148592, 6051609, 2412161, -4600984, 13927505, --20278688, 4728222, -33102924, -10278394, 13832479, -11151346, -13238700, 18183280, -11409581, -30884036, --23891830, 21380884, -2544768, -4093104, 4993437, 10893111, 27042724, -17440788, -22771916, 1095217, --3037079, 18361522, 237834, 10786810, 4982162, -1682017, 28082644, -36326832, -5242545, -5023501, --21310554, 5607080, 12079059, 656056, -12657805, 5787469, -2785823, 3767760, -10934987, 8227010, --484258, 1453310, -892279, -2564096, 14275398, -14126147, 1189169, -2296197, -5052492, -4417911, -1733556, -6028524, 6583111, 8505109, -8617852, -2049773, -3256122, 7811472, 8545374, -4113505, -10515691, 1190243, -1445257, -6877854, 7595113, 2778844, -2931852, -11474005, 5551245, -10389526, -6856916, -5526013, -5083631, 9842454, 9669045, -12957379, 1610613, -2879239, -12864501, 4384088, --7513509, 8663486, -7409893, -29948270, -33041184, -78792784, 22955526, 22704270, -1470489, -66405028, --42877196, -6198712, -10778220, 44588740, 30128658, 14552423, -29318520, -12032888, -7669738, 27964532, -3194382, -7810398, -17151416, 11538430, 5207111, 13970992, -622770, -5538361, -6939057, -15808701, --7815767, -9521406, 26732950, 14331769, 3269007, 4101694, -17376364, -826244, 2266669, 24391656, --1617055, 11426760, -8885750, -6180458, 5086315, -9901510, 6752226, 3010235, 7252589, 23788750, --1933809, 20886962, -134755, 13448079, -10184978, 975494, -15042586, -19559818, -20539070, -17606144, -5973763, 3163780, 1665911, -25976500, 13023951, -22599044, -2416993, 1269163, -14068165, -15307263, --7983808, 365609, -26951456, -18251464, 16982838, -8100845, 15822123, 2571612, -4198868, -14575508, --16769163, -1023813, 24155970, 29824252, -7262790, -2976412, -11040750, -14843407, -10144176, 9552007, -5191542, 3714073, 9458592, -1778653, -6017249, 6508486, 3705483, 5424544, 8294656, -4510253, -2896419, -850940, 339839, -6155225, 10910828, 3456375, 2605435, -3183645, 1709934, -188979, -16924318, 2179159, 5182415, -9370545, 785979, -6056978, 11129334, 790274, 322659, -3835943, -2703145, -1238024, 294742, 5276368, 654446, 6905234, -4527970, 2251100, 881005, -8817568, --322659, 5054103, 2094870, -1815161, 3047816, 17723720, -38173668, -94637456, -90706488, -13784161, -27418534, 91231544, 78849696, 74319040, 79846664, 44433048, 10749766, -40340480, -40510668, -84208736, --65376380, -57342644, -36359044, -45762340, 62986232, 51788716, 68209448, 39307004, 55752432, -2051384, -14689325, -8987219, -21741124, -12471511, -25994216, -30281666, -30121680, -29758218, -35175244, -25796110, --20907900, -2409477, 5558762, 49413060, 41520524, 21835076, 23523536, 32582158, 30298310, 14542222, -70420280, 9116605, 946503, 13167296, -26269094, -80809808, -23079006, -64787436, -69409352, -73409048, --51866560, -46264312, 2342905, 38280508, 39135204, 47711180, 86914032, 62480500, 76279160, 74880608, -47847008, 51355996, 17595408, -18140332, -58650464, -77061912, -87944824, -57293788, -78923248, -66415764, --75776112, -44302052, -5233418, 20716238, 61411052, 58494772, 59500868, 98931888, 69027640, 81767584, -51027968, 8414378, -9553081, -24856050, -40918152, -45957224, -48565344, -47449188, -54562728, -46885472, --34193844, -21117280, -10838350, -8318278, 23771570, 22441740, 31803160, 51208360, 57856432, 36569500, -44219908, 27145268, -1612223, -12094091, -26584236, -33415920, -28511066, -24772834, -29803852, -11020349, --7330973, 563714, 8502425, 9269076, 2427194, 1168768, 8331163, -1321239, -7137699, 6499896, -3978214, 4599910, 7376070, 2050847, 2012192, 4327717, 10233833, 8596377, 4054986, 726386, --2181844, -8805220, -6536940, -8018704, -6817724, -2864206, -5253819, -4750234, -2521683, -2150168, --2786360, -880468, 3349001, 3157338, 4093104, 6346888, 4387846, 3020436, 4216584, 1497870, -1838783, 1742146, 1230508, 1025960, 469225, -1191317, -2535105, -4860293, -3694209, -3993783, --3145527, -1690070, -645856, -1548336, -908922, -1285806, 239981, 1104344, 1921461, 3629784, -3621194, 1396401, 1500017, 648003, -507343, 899259, 720481, 197032, 1230508, 347355, --456340, -1083406, -893890, -1092532, -867583, -961536, -305480, -587337, -673773, -2194728, --2478196, -2471217, -1744831, -421444, 755914, 2049236, 2652679, 2731062, 2934000, 2322504, -2564096, 1744831, 843961, 139050, -344671, -1328756, -2025614, -2451353, -2190970, -2312303, --1879585, -1832877, -1534377, -729071, 135291, 536334, 1236951, 1797981, 2083596, 2003065, -1743757, 1179505, 708670, 124017, -86436, -444529, -532576, -588411, -524523, -495532, --375810, -284542, -155693, -93952, -46171, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --4386236, -7451232, 2618320, -1320703, 1911261, 2416456, 4479651, 7463580, -3540127, 2500745, -3012383, --2331094, 1519345, 49929, 646393, -5214091, -2524367, 1883880, 3725884, -459562, 3142842, --5591511, -4968204, 3177739, 2032593, 899796, 2309082, -1884954, 4053376, 4549444, 4401805, -6320581, -3464428, -2841658, 244813, 836982, -6004901, -341450, -503585, 1694902, 611496, --3728569, -910533, 5172751, -2724083, 1047972, -3127810, 1549946, 1601486, 1069984, -4668630, -3825205, 360777, 897111, -630823, -1495186, -1928977, -3149822, 6810208, -1151588, -1240172, --1476932, 3031173, 752156, -6415608, 1682017, -2924336, -4361003, 2614025, -2676838, -6948184, -2827162, 1031329, 356482, -6402723, -7723425, -3167539, -3779034, 3613678, -991064, -2147, --1703491, -2095944, -1693828, 59593, 3242164, 585189, -1363115, -110595, -1426466, -654983, -1472637, 433792, -1284732, -1817308, -568546, -743566, 762894, -454193, 327491, 259309, -827855, 200253, 1159641, -455803, 324807, -250182, 838592, -45097, 776315, 898185, -4294431, 464930, 321586, 3815005, -5825050, 915365, -4869956, -6148246, 1705639, 5669357, --3590056, 2665564, -2715493, -1335198, 1098975, 238371, -2885144, -8456791, -8404177, 102005, --2168422, -123480, 4313221, 652835, 5293011, 7179038, -3863860, 6193880, 724239, 6287832, -345208, 7470559, 901406, -4250944, -1212791, 378494, 3367254, -970663, -1186485, 702227, -2541547, -3167539, -246961, -1007170, 2240899, 2757906, 96100, -2888366, -260382, -557272, -1585380, 2900177, 5210332, -1879585, 3359738, -1581622, -4646081, -4133906, -2829310, 2555506, -2754685, -1587527, 4497368, 112206, 1593970, 200253, 5480915, 3638911, 4022237, 1623498, -2342905, 1449552, 2169495, 4494147, -1024350, -268435, 6334003, 1250372, 120796, 1297617, --2443300, 323196, 1822677, -176094, -6044093, 1842541, 569620, -990527, -2141578, 1351304, -341450, 3226057, -1269700, -622233, -1314797, -1042066, 754304, 207769, 1235877, 588947, -231391, -1204202, -1004486, -577136, -650688, 486405, -1626719, 1343788, -631897, 379568, --450972, -579284, -938450, 504122, -772020, -548145, -1768990, 6516003, -6558952, -4404489, --3609920, -5301064, 1738925, 2354716, -4255776, 1046898, 8883066, -6387690, 4526896, 7670275, -7581691, -4598300, -1226750, 3785477, 762357, 1209570, -3336653, 1907502, -11421392, 9057012, -14154602, 2551211, 4799089, -2239289, -144418, 7546795, -3890704, -8994198, -1457605, 191126, -21475, -7254200, 590558, 1876364, -8640400, -4024921, 4081293, 1427003, -3041911, -745177, -3060701, -4177393, 9046812, 2868501, 466004, -5713380, -520228, 3166465, -1910724, 254477, --2012192, -52613, -810138, -4562866, 339302, -4409858, 6802692, -6458020, -4292283, -1395864, --7762080, 5303211, -4153234, -10806675, -1949915, -4621922, 1377611, 5068062, -5032091, 701690, --3401614, 3620658, 539018, -3521336, 3130494, -3820910, -5100274, 5806796, -3656628, 1711545, -185757, 597000, 2049236, -1054951, -1705102, -1877438, -3090229, 1130113, -4386236, 332860, --853088, 1474248, -1274532, -26844, 49392, 202400, -2309619, 2191507, 143881, 482647, --1225676, -804233, -909459, -135291, 1372242, -5099737, 3213709, -175557, -1017370, 3814468, --3660923, -12812424, -2517925, -816581, 5566278, 7881265, 6990596, 3339874, -2770254, -894427, --7900056, -6715718, 2291365, 8956081, -2588792, 9175124, 5844914, -5718212, 3041911, -910533, -3182571, -6388764, -4296041, 1009854, 4577362, -619012, 2725694, 3782256, -7190312, -1481227, --3321084, -9820980, 6075768, 928250, 2203318, 4198331, 7751879, 2662880, 361314, 6041945, --1423782, -3155190, 6256157, -3338800, 10574746, 4829691, 4206384, 176631, -3039763, -3744138, -5187247, 6999723, -5231807, 1227824, 6731825, -1240709, 2193118, 14814953, -4487704, -1837172, -2896419, -7497939, -292595, 1285269, -3312494, 3570729, -2395518, 2182380, 7388955, 208306, --1685775, -5073430, -398895, -6289443, 2653753, -2367601, -3049427, -1331977, 1202591, -1848983, --1779190, -1567663, 359704, 2241973, 1722819, 411243, -508417, -753767, -504122, -404264, --1009317, -1896228, -328565, -629750, 999654, -56371, 518617, -1919850, 819265, 917512, --661425, -1691680, -569620, -1771674, -864899, -826244, 1299765, 70867, -229244, -197569, -338229, 135291, 707596, -2681133, -639950, 787590, -3327526, -18369576, -1552631, -454193, --3729642, -5743982, -1927367, 9753871, -7029251, -10482405, 3843996, -4298189, 1422171, 1786706, -6522982, -4564477, -1423245, 1228898, 6060199, -2935610, -4090420, -1272921, -3528316, 4447976, -8205535, 4095251, 7516, -751619, -4806606, -351650, 12947179, 2223183, -1683627, 14971182, --966905, 11117523, -3446175, 23085, 7523709, 2238215, 1821066, 2643016, 1264868, 4110284, -2365990, -7207492, 13211319, 8004209, 10836739, 7246147, 4747550, -7331509, 3147137, 3635690, -493921, -4519916, 12261058, 7398618, 11070815, 1920387, -2285460, -2807298, 8135742, -4060355, --8532489, 9899900, 3052648, -5533529, -3237869, 434329, -2624762, 915365, -1223529, 1347546, --3521873, -1005559, -8078834, 3018825, -1052267, -264677, 2880849, -1042066, -1564979, 4658966, --376883, 3608310, 4842576, 3969624, 2527052, 2524367, 971200, 1454383, -40802, -1069447, --1000191, 2102387, -670015, -1368484, -1438814, 974958, -1614908, -449361, -371515, 2636573, -1055488, 1877438, -1865090, 526134, -1508607, -550293, 1789928, -292058, -818191, -635655, --551366, -1103807, -783832, 744640, -111132, -507880, -4725538, -749472, -12080132, -4822175, --13499082, -9278740, 909459, -8800388, -6934762, 725850, -1605781, 8899172, -6052146, 9870909, -12145094, 1169842, -10455561, -7382512, 10903848, -5657546, -3073586, 6069863, -8106751, -14358613, -5651103, 12227772, -6403260, 3057480, -295279, 5281736, -14951318, 2877628, -6044093, 3506304, -238908, -6337761, 10320270, 4651450, 4325569, 13728326, 6386617, 2761127, 7777112, 1472100, -2482491, 3848291, 1265942, 530428, 2087354, 1786706, 15693274, 8749385, -84289, 13102871, -8226473, 9643275, 15199352, -7902203, -6553583, 13242995, -4699768, -627065, -7973607, -3471407, -4707821, 6968585, -6083285, -830539, 1972464, -1830193, 3639985, -6518687, -1240172, -7522635, -14339822, -4773320, 7814156, -2360085, -3878356, 10443750, 1817308, -3228205, 3402688, -1440425, -266288, -3126199, 3965866, -889058, 1407139, 4145717, 2424509, 1141388, 2383170, 47782, --414464, 1576790, 407485, -3072512, 602906, -758599, -1395328, 2507187, -28454, 1149441, -1061394, -745714, 482647, -1870995, 335007, -1723893, 111132, -796180, 1898376, 355945, -1629403, 287763, 1977296, 382789, 897111, 1034550, 181462, 4510253, -4903242, 1527398, -659278, 1515050, -7026567, 9043591, 5226975, 12301860, 2345052, -1703491, -13968844, -7474317, --5265093, 3525631, -7279970, -12083890, -3405372, 3063386, 1293859, -13487808, 10878615, 817654, --868120, -11489574, -6647536, 2684892, 1362578, -12759811, -4014184, 4639639, 463320, 1270237, -6477348, 7616051, 4403415, -1984275, 3791383, 1179505, -4626217, -9438728, 16192564, -4086125, --7970386, 149787, 3973919, 5247913, 12090870, 1995549, -279173, -4566624, -195421, 6738804, --911607, 8421357, 16072304, 1360431, -3559991, 495532, 13827110, 17380122, -8720931, 2434710, -2361695, 9404368, 4899484, 1670205, 2823404, -6900939, 4243965, 4497368, 4406100, -2969970, -187368, 3432753, 5104032, -705985, 1706713, 1221381, -5946919, 2862059, 205622, -5268315, --3923990, 5651103, -2597382, 3921842, -5713380, -4270808, -1999307, 1318555, -164819, 5111011, -2237678, 951872, 169114, 2580739, 2259690, 783832, -4362076, 237297, -1881196, 738198, --1438277, -988916, -137976, -373125, -695785, -1397475, -4283156, -1103270, 367220, -2762201, --1891933, -1723893, -16106, -1723356, -3051038, -617938, 1308354, 2359548, -879395, 736587, --1214939, 877784, -4599910, 6318434, -5774047, -10417980, 7093139, -915365, -2588255, 2649458, -6029597, -17430052, 1000191, 13227962, -1611150, 23856932, 11372537, -7383586, -5428839, -2319282, --6977175, -3147137, 10621991, -4187593, -3566434, 10631118, 8630200, 2792803, 4923107, 9931038, -6563247, 7412040, -5548561, -3831111, 9443022, -1944547, 8543227, -22012, -10332081, -6682432, -2723009, 8042327, -11231339, 620086, -6023155, 3051574, -6874632, 9418326, 9414568, -9323837, --1039382, 2623688, -354335, -12581033, -5659693, 2066953, 8237748, 13565654, 4585952, -10185515, --2282238, -2537252, -1237488, 8503498, 1313186, 6798397, -10388452, 4563403, 656056, -8275865, -9659918, 4047470, -1359894, -2254858, 1628866, -444529, -8409546, 6220187, -1982127, 3676492, --6544994, -11571179, -6418292, 2638184, 5082020, 42950, 2786897, 10234907, 61740, -2718714, -6442988, -2090039, 6062883, 278636, 1940252, -5322538, 493921, 56371, 2760053, 2998424, -4286914, 2667712, -1105417, -1349157, -2052458, 5048734, -2441152, 2589865, 521839, 1529008, -2068027, 2790118, 1231045, -1069447, 2553358, 933082, 833224, -1079647, 3449396, 1562831, -698469, -3545496, 1228361, -1448478, -66035, 2283312, 667331, 10992432, -13732621, -2251100, --4443681, 13919452, -6337761, 11456288, -3682935, 10691247, 14513231, -6546604, 4519380, -3787624, -8229694, -3233037, 6837051, 5677410, 5329518, -1310502, 5609228, -2944200, -7332046, -3546569, -7996692, -9527848, 1405528, -98247, 7111929, 14523969, -13441637, 408022, 12979928, -380105, -11857868, 1573032, 5156645, -1707786, -1110786, 3169149, -18537078, 1760400, -541166, -7391102, -4779225, 2965675, 13281649, 6605660, -1431298, 25362318, 6229850, -13446469, 3439195, 1233729, -8770860, -5823439, 1597728, 7448010, 483721, 4517232, -1444183, -14679124, -15093589, -20401, --5177046, 11988327, -20475720, 26131118, -268972, 14526653, 16556025, 3959960, -4534412, -3379603, --7950522, -10424422, -1008780, 3297998, -2753611, 5192616, -3626563, -8402030, -5401995, -4270808, -1377611, -1354525, 792958, 5557688, 2689723, 2610266, 1923609, -2389613, -3011846, 117575, --744103, 1558536, 248034, 600759, 1629940, 3206730, 1803349, -6534256, 1044751, -1272384, -4581657, 4715874, 2613488, -484794, -1525250, 1824287, 1343788, -2337536, -2565169, -641561, --1801739, 414464, -1916092, -3180960, 1102196, 5209259, -1504312, 2079301, -4176856, 488016, -2164664, 2376191, -274341, 1516660, 3224984, -2515240, 1094143, -24186572, -1684701, 8273718, -1385127, -9063992, -22463752, 22549, 2593087, -3911105, -918586, -6588480, 3506841, -5478231, -11602854, 4124242, -6884833, -8593156, -14767171, 11108396, -4700842, 797790, 14424111, 19859928, -12094628, -1796370, 1049583, -13544179, -5800354, -5417565, 3660923, -19232326, 5048734, 5319317, -1112933, -9860171, 9527311, 14860587, -2378875, -201863, 1733556, -8533026, -9077950, 5288716, -3584150, 11260867, -12307766, 13426068, -7034083, 7430831, -11396159, -8930848, -4506495, -223875, --1349694, 4947803, -2458869, -19857782, -14947560, -4133906, 528281, -19908248, 275415, 9959492, --5293011, -2232309, 3023657, 8483097, -17588428, 9064528, -3099893, -2564096, -94489, 7265474, -8964134, -10479720, -5402532, -7018514, -3460670, -2481417, 5204964, 1816771, -6387153, -2774549, --4902705, 3477313, 11670500, 7789460, -80531, -250719, -6546067, 336081, -4008815, 5590437, --1022739, 9685688, 3179350, 3439195, -3471944, 293132, 85362, -7582765, 8164196, 706522, --1478006, 4366371, -1547262, -1202054, -425202, 725850, -6694244, 3024731, 4014721, 4395899, --736050, -1474784, 1414118, 2530273, -2430415, -1312649, 2310156, -4962298, 505196, -22549, -4698694, -260919, 21725018, 508417, -4434554, 16894790, -3718368, -6895570, -1843078, -1570884, -20951924, 23975044, -3147137, 5092221, 6089190, -3073586, -11415486, 5599564, 22279606, 17006460, -14522358, -5287105, 6279242, 11973832, -15572478, -11580842, 13552769, -6930467, -7634841, -522375, -16949552, -2553895, 15600395, 1030792, 13996225, -8390219, 19241454, 5869610, -6004365, -9820980, -3491809, -13895830, 1643899, -16489453, -5655398, -5905043, 9421011, -9432285, 15538655, -19036368, --32992866, 20620138, 9193914, -4029216, 147640, 22746146, 10644003, 1830730, -5989869, 4936528, --2671470, 302258, -14791867, -14948634, 8791261, -4995584, 4846334, 28246926, -7406134, 6106370, --18443664, 21838834, -7321309, -9695352, -4690105, -3002719, 9079024, -18428630, 15423764, -18059800, -13035763, -9272298, -12650289, 12654047, -568546, 4184909, -5141613, 7511361, -4111894, -5638219, --2570538, -8575439, 5928666, -216896, -5646809, -2323041, 2079838, 9285719, 1725503, 1388348, -2440078, -156229, -1591822, 4756677, -2650532, 2195802, 1934346, -2310156, -694174, -448824, -6600828, 5873368, -2144263, -3109556, -6935836, -35433, -1427003, -897648, -1141388, 306553, -6331856, 2010045, -775242, 8113730, 3900367, -24705726, -18361522, -17799956, 24890410, 853625, -10689637, 6382859, -21904334, -19138912, 12891881, -34163244, 9996536, 10177462, -2191507, -13577465, --12506945, 21325050, -11452530, -1477469, -3582003, -11011222, 16197395, 5188321, 14652818, 8554501, -10106058, -3174518, 16448651, -1482301, -10772315, -12640089, -2929168, 7176354, -9621264, 12814572, -8188892, -9596568, -34629248, -2869575, -2864206, -818191, 25126096, 609885, -19724638, -11647414, --12073690, 10369125, -7623030, -16362215, -18341120, -11346767, -8937290, -40766756, 941135, 5136244, -13368086, -21272436, 6937446, -17568026, -14456323, -4886599, 17013976, 4412005, 15785615, 29953638, -8946417, 6912213, 19447612, -15154792, -1999844, -7171522, -8403640, 15676631, 14386530, 23005992, -11214160, -20968568, -14072997, 16559783, -24905978, -27302570, -8679055, 19983946, 3079492, -4821101, -13507135, 11143830, -205085, 3217468, 11432129, -7489886, 6720550, -5506148, -1165010, -5739687, --1184337, 1572495, 7961796, -5071820, -6599754, 37581, 4434017, 1511292, 4015258, -592169, --6613713, -1497333, -4432406, 390842, -3732327, -651761, -659278, -7239168, 5756330, 957778, -5855114, 7621420, 10287520, -3873524, -5746130, -389768, 821949, 601832, 11457362, -11159936, --23000624, 5937256, -629213, -739271, 529892, 2863670, 4508105, 9655086, 2925947, 8078834, -4301410, 9628243, 25414932, 544387, -33864208, -12600897, 8166881, 13422, -7312182, -21874806, --14539538, 4217658, 17129404, 6451041, -17056926, 8617315, 6734509, -19216758, -3929358, -23688892, -17974976, -10063108, -12560095, 16608102, -16784732, 4252018, 34917012, -4476967, 5357972, 10083509, --458488, 4803921, -21091510, 4693863, 3248606, 3008088, 45970644, 31060666, -3877819, -16523813, --11128260, 14229764, 16485695, -18936510, -10791642, -25295746, 39153996, 10562935, 4144644, -6730751, --4763119, -9185861, -5340255, 28113782, -8074539, 7341710, 27977416, 4412542, -8489003, -21479668, -74625, 8069707, -42915852, 8851928, 4162897, 28635620, 19339700, 15081241, 25419764, 14254460, --5625871, 2155537, 8538932, -3335042, 765578, -2246805, 3610994, 1869921, 23698018, -1122060, -9430674, -4694400, 9088151, -1240172, 12300786, 2279017, 3052648, 11229192, -1476395, 4393215, -7338489, -249645, 5827734, 8520678, 3418257, 6695854, 9914395, 5541045, -4452271, -1231582, -1755568, 2089502, -464393, -4675609, 1519882, 2254858, 672162, 5072893, -1351841, 8231842, -4155918, -4068408, 8487392, -1738388, 725850, -5950677, -27174258, -3922379, 18653042, 10456098, --30447024, -40096740, 4557497, 27181238, 10944114, 16608639, -9509058, 12829067, 2088965, 337692, --14612552, -5203353, -22721988, 33647312, 11200201, -27302034, -18818400, 12243341, 1216550, 6760816, --8260833, 16807818, 9714679, 11583527, 21929030, 19542638, 3925063, 19112604, -10135586, 10994579, --153008, 13358959, 6011344, -3141769, -8127152, 9245454, -12020540, 31448824, -8541616, -5866926, -6325950, 15587510, 15228880, -10315438, 26920318, 26872000, 15465640, 6566468, 2130304, -8531416, --20479478, -34745748, -5779952, 12483322, -871342, 15259482, 16403554, 17816598, 6048388, 9975598, -57727580, -28337658, -12548821, 5840082, 11053098, -1354525, -45290968, 10709501, -7149510, 6883222, -7883413, 20130512, 3889093, 456877, -18283676, 18955838, -6868727, 2838974, 16377247, 7618735, --17727478, -3681861, -10014790, -3249143, -7716983, 1366873, 576599, 7225209, -1816234, 8788577, -8378945, 11363410, -228170, 37581, -6937983, -2933463, -9248675, -6025839, -2838437, 12084964, -3708704, -1742683, 693637, -4541391, 1612223, 10627897, 11652246, -2199560, -10978473, -52613, -550293, 5235029, -3113315, 3670050, -5272073, 8125542, -15315853, 1701344, -4776541, -5206574, --110059, 3181497, -9907416, 4902705, -1969243, 4859756, -5122286, -8972187, 3365644, 15103789, -14874009, -8262444, -11212549, 3281355, -10773925, -34467648, 35560720, -10430328, 9980967, 3251290, -29826938, 23751706, 14938433, -14283987, -2370822, 20367808, 10818486, 23980414, 64035280, -4016331, --25259240, -6633040, 19137300, -2912525, -29829084, 45507864, 23601920, -16121160, -24972550, -3136400, -5593121, -7993471, 18093624, 15316927, 17755394, 33952252, 5695127, 9545565, 6081674, -13241384, --31660352, 18548354, -21541408, -16254304, 24998320, 13029857, 14105209, 7326141, 5158793, -1505386, --31253940, -27829778, 531502, 16524350, -20654498, 19502910, -9152038, -23263154, 7331509, 20262582, --3738769, 3834332, 20226612, 19827180, 20695836, 1438814, -12588549, 11696270, 49145164, 5835250, -20004884, 27969364, 1404454, -8987756, -24648818, -10074920, -38863548, -13435195, -9698036, -4896800, -8883066, 1412507, -1725503, -11282342, -7321846, -6597607, 9656697, -10109816, -1950989, -8934069, -2925947, -5716065, -9532143, 268435, -13740674, -4978404, 292058, -12577812, -2298881, -10976326, --6210523, 1076426, -19859928, -2055142, 996969, -352724, 9475772, -12813498, -4112431, 13459354, -330712, -5497022, -523449, -4720706, 2684892, -5990943, -4351876, 6615324, -400506, 302258, --10672457, 17734456, 14541686, 98247, -12157442, -17811766, -31265214, 5257577, 18748606, 25761750, --22424024, -23875186, 28662464, 12732431, -1429687, -3205656, -12303471, 5245229, -5894843, -12805982, -12977244, 15916612, 10899016, 807991, -2662880, -9324911, 1639067, 6530498, 3805341, -10498511, --36461052, 7796977, -8536784, -11117523, 1691680, -4943508, 2710124, -36293012, 16472810, 12901008, --26263726, 17886928, 23779086, 19906100, -5741298, 3117610, -3555696, 12889734, -3306051, -337155, -64063732, -19600620, 5019743, -17526688, -10359461, 36106716, 12967580, 12160663, 22924388, -29873108, --24858734, 36309116, -23491860, 18406620, 22742388, 1951526, 5813238, 8530342, 41132900, -14354854, --16194174, -38325068, -8508330, -16651051, 12540768, -24079198, 39960376, 21684754, 24269250, 11874511, -21165598, 11033771, 38124276, 9217000, 18156438, 13880261, -19276886, -9312563, -7679402, 3106872, -1828046, 18596134, 7856569, -272194, -1251446, 4044786, 1387811, -7589744, -14785962, -7953206, --11195906, 13355738, -5166846, -8021389, 4018479, -3267933, 16427176, 7505456, -3369939, 9171366, --11196980, 4930623, 8076149, -3321084, 15887621, 16358457, 10719701, -8060580, 13349832, 7641284, --13948980, -2873870, 1009854, -8463233, 519691, 11605539, -14044006, -16027207, 6539625, 2858301, --1929514, 14907295, -10647224, 26356604, -15699716, 13799730, 45004816, 22192632, 16873316, -25592100, -6884296, 24917790, -21778706, 35394824, 12563316, 18794776, 16869020, -11283953, 17489644, 14942191, -6211597, 35070556, 26617522, -2352568, -60740500, -7421167, 27943058, 26814018, 27715424, 6358162, -15400142, 1045825, 7677791, -2340757, -18903224, 38436736, -1155346, 36603860, 16505559, 26318486, --37420440, 24959666, 12491912, 11042898, -9885941, 8445516, -7049652, 8043400, 37034968, 14457934, -48359720, 2050847, 10638097, 27965606, -5784247, 44152800, 21872658, 3558381, -29518236, -18764176, -16184511, 1527398, -4947803, 638340, -5055714, 3158949, -21490942, 14020384, -22874996, -34382824, --12749074, -2238752, -11372537, -9109089, 28860570, -3779034, 26294326, -25354266, 28900298, 3540664, --31923418, 31303332, 26467736, -10238665, -4409858, 7214472, 13940390, 8571144, -1264868, -14853071, -9230422, -6609418, -834834, 17907330, -3629247, -3343632, -14650133, -4294431, 4212289, 2506114, --849330, 13373991, 12314208, -9947144, 3461744, -580357, 698469, 12270185, 4066797, -14114336, -9489730, -12125766, 6212670, -9877888, -3557844, -3377992, -1877438, 1253594, 2942590, 1317481, -1040993, -3093450, 2648384, -6979322, 4932233, 4884989, -748935, -5791227, 4428648, -1598265, -7259032, -4215511, -2838974, -9907416, 49392, -9802189, 2735894, -8174934, -26835492, -25633976, --10226317, -10992432, 21060372, -33607584, -41972568, -45594836, -55173148, 24924768, 27270894, -1363115, --4332012, 51540, -13046500, 3435437, 6977175, -11425687, 37751152, 35714264, 23265300, 25624312, --23286776, 15784542, 1351304, 18755048, -7226283, -9255655, -34489660, 31182536, -31168578, -37525668, --9898289, -7650948, 40605696, -21998286, 5475547, -20741470, -5873368, 39434780, 7262253, 12697534, -19368692, 36256504, 2202245, -3689377, -43910672, -7759932, -3542811, -898722, 24019068, 13285408, -81702088, 4457103, -2572149, -26740466, -2232309, 32873142, 29746944, -2299418, -14433774, -39992052, -10016937, 25968446, -13176423, -29043642, -12564927, 25614648, -7786776, 18920942, -58613956, -32313724, --46881180, -12221329, 18682034, 10422275, -20490752, -19002010, -23019414, 9652402, 48085916, 15061377, --339302, -16627429, -1524713, -12839268, -3788161, 6194954, 5543729, -14840723, -7096897, -864899, -10288594, -25558814, -17921288, -5567888, 12630962, -1253594, 16669305, 5935645, 1788317, -5345087, --3121368, -11183021, -2705830, -17124572, -4163971, 20001126, 6745783, 9426916, -13807783, -23871428, -11860552, 12084964, -7348152, 594853, -10361072, -1270237, 2780455, -703838, 8869644, 6316823, -5692979, 12275017, 6149857, 9838159, 9606231, -1319092, 7639673, 4940823, 7391102, 1028108, -974958, -7493108, -17147656, -9284109, 38961260, 502511, -564251, 69577936, 6173479, -52925272, --40817760, 48548164, 43017856, 1982127, -35507568, -43927852, -25520696, 7810398, 41829760, 37194952, -24671366, -16269336, 4257923, -16338592, 13166222, 31553514, 49100604, 53692460, -7544110, -29788282, --46672872, -69393784, -1434519, 35943508, 148089936, -20109036, -8658117, -72577432, -30464740, 5410048, -16464757, 87914224, 63194000, 38834556, -45712948, -26132192, -44678936, -3295314, 73482592, 67915784, -82915952, -23762980, -83034600, -60622388, -83832392, 20118164, 75577464, 66357244, 122959008, -59761248, --72546296, -63690608, -11209328, 53978612, 72197328, 101204464, 45437532, -22145388, -40375912, 8663486, --3747359, 28272696, 80843632, -18671834, 49967112, -18829136, -47652664, -50466, 6602976, 43435004, -1371705, -4844186, 3477850, -12302397, -41315436, 16198469, -6327024, 13099650, -12213813, -34143916, --8835285, -8619462, 3029026, 21449604, 2355790, -7152195, 7786776, -8850317, -11152419, -2697240, -31594316, 7471096, 28950228, -2911451, 2639258, -9236864, 3115462, 2676302, 5245229, 22195854, -38927436, -1913945, -11475079, -37085968, -48740364, 1157494, 2135673, 57339960, 36692980, 5558225, --20871394, -82568064, -46816756, -7783018, 36295696, 71694816, 36848136, -22648974, -27771258, -85564336, --32265404, 39723616, 73784320, 59448788, 3158949, -39122320, -44204876, -5039071, -2310156, 34473556, -20503100, 18569828, 464393, -18114562, -10634876, -867583, -8346732, 10545218, 11232950, -6197101, --36202816, 47808892, -10914586, 56429428, -51686172, 770947, -22523346, -53636088, 39473972, -28079422, -36541580, -28712394, -11057393, -2415919, 18844706, 4367982, -20554102, -10821707, -829466, 29341070, --27041650, 33636036, 24040542, -18030810, 4228396, -22683870, -22994182, 39157216, -38394324, -19151260, -25879862, 59716152, -415538, 8278550, -5453535, -25819732, -7289633, 24519432, -8428336, -39065412, -5542656, -8351027, -6679748, 12105902, -35869420, 18307298, -148713, 12628278, 27576912, -62209380, --46295988, -15062450, -1462973, 64590940, -34189012, 23587424, 50485192, -27471148, -16501801, -1458141, -27329950, 40269076, -21956410, 11866995, -8160438, 16146930, 62124016, -22781580, -70293584, 15269146, -31993212, 8708583, -37646464, 23756538, 9662066, 23857470, -7510824, -676457, -26368952, -20416128, -15237470, 4319664, -28111634, 8611409, 19088446, -8935679, -352187, -30540976, 4321274, -7259569, --34280820, -725313, 14994805, 13683229, 5245766, -438087, 8179765, -22784264, -6015639, 8736500, --11561515, 18376554, -11173894, -4041027, -10591926, 547608, -11275900, 17633526, 2800856, -12986907, --11915313, -6979, -821949, 28776818, -10196252, 10567230, -5473936, 29528, 5796059, -11615739, --11166915, 2447058, -24264418, -6029597, 6606734, -19722490, 555661, -3163780, -7449621, 4993973, -12863964, 621697, 1518271, -7373385, -4748087, -72331008, -22880902, 31184684, 42675868, 35436164, --36015448, 11604465, -100738456, -65499324, -55613920, -8797704, 47310676, 30447560, -2026688, -22102976, --27278948, 13429289, -16653199, -1650341, 36195836, 9893457, 1788317, -35692252, -17112224, -3587372, --16822314, 10974178, -2883534, 19428822, -4977867, -150324, -6244346, -1110249, -4509716, -20368882, --15338939, -34217468, -24073828, 17532056, 33645164, 36564668, 20448340, 31868658, -4714801, 27120570, --6193880, -12361990, -42633456, -1606855, -23483808, 18353468, 7155953, 54140748, -43528956, 15556372, -30484604, -16671989, -23054848, -13419088, -10661183, -11057930, 4088809, 38460896, 24863028, -10206453, --1266479, 27614492, -31745714, -35240744, 14747844, -40910636, -31341450, -27452894, 3615826, 13326747, -16086800, 47546360, 32479616, -5116380, 24230594, -13798119, 1169842, 5971615, 18016314, 28865402, -31363462, 21961778, 18408230, 14666240, 1474784, -39897024, -11070278, -20594368, -4927938, 23329188, --769336, 3548717, -8450348, -17762910, 2230162, -8774618, -7001334, -19353122, 8807904, 14532022, --6194417, 5601711, 13143674, 7081328, 8673150, 1464047, 8549132, -5731097, 5976984, -2715493, --9874130, 7745437, 10056666, -8037495, -11391327, 989453, -7586523, -13699872, 10872710, 11288248, -4770635, 14552423, -966368, -13556527, -16328392, 23159000, -9245454, -86307368, -127586832, -156639072, --123756264, -184650304, -32617056, -67411656, 20483772, 38822208, 133734544, 78127064, 138536320, 140867952, -192839200, 140769696, 143104016, 105419976, 4572530, -30490510, -55767464, -34280280, -115110496, -78654808, --62636192, -64014340, -63341104, -63219236, -61358976, -66215512, -72668696, -54158464, -84501872, -69092064, --60207388, -27007828, -70999032, -21901112, 26184804, -52735220, -25451976, 14255533, 11640972, -44635984, -37302864, 47924856, 60673392, 82284056, 83635896, -6500433, 49751828, 80886048, 114770656, 90471336, -180754240, 169766640, 149949664, 121518584, 153840896, 76409616, 122494080, 149097104, 114839376, 73462728, -124544928, 40452148, 41875396, 76536856, 76781128, 54542328, 15852187, 44595720, -14775224, 2711735, -39039104, -44336948, -111518824, -166684464, -65842384, -228228656, -199635984, -175569136, -203042976, -225897568, --189345776, -163884144, -158103120, -108952584, -143297824, -73540040, -90969016, -96690992, -146673136, -118504592, --85458040, -69969312, -59240484, -55510840, -34786012, 13907104, -102542, -3287798, 41375032, 86380920, -72036800, 72976328, 116295904, 99461776, 103333688, 131209640, 123719216, 105299176, 100138240, 120137216, -102278200, 99191192, 105231528, 109214040, 92870080, 81237696, 74721696, 69875360, 91282552, 71633616, -53712860, 56191056, 41994580, 24545202, -14550812, -30216168, -39633960, -70972184, -60789356, -62906240, --74956840, -79199736, -72963976, -47556024, -53443352, -48326972, -49255220, -25448754, -28331752, -33957624, --23489176, -7790534, -8927626, -16285979, -10781442, 183610, -6806450, -9193377, -8538932, -3248606, --5095979, -7385733, -5835250, 3609383, 5513128, 1544578, -3471944, 149250, 4469987, 1070521, --3996467, -734439, 1762010, 949188, -1082332, 1695438, 1512365, 2489471, 2152852, 118112, -74088, 2058363, 2199560, 4771172, 2962454, -974958, -3105798, 1211181, 2410551, -1263794, --2437931, -1414118, -3338800, -2516851, -2779918, -4188130, -3579855, -3551938, -4393752, -2779918, -184147, 2433099, 1624035, 3780645, 5678484, 5562520, 4446365, 6312528, 8870181, 8296803, -7861938, 9255655, 9115531, 10865730, 9685688, 8902930, 10469520, 10480257, 7837779, 4392141, -4481799, 3311420, 125091, -1080184, -2151779, -3193845, -4639102, -5245229, -5329518, -5064840, --5197984, -4807142, -4381941, -4062502, -3435974, -3059091, -2345052, -1722819, -1393717, -1169842, --885837, -612570, -547071, -446140, -383863, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -}; -const Word32 CRendBin_Combined_BRIR_coeff_im_48kHz_fx[15][BINAURAL_CHANNELS][2955] ={ -{ -{ -5294084, -2538326, -3474629, 5252208, -3056406, -1127966, 133681, -1877975, -1990717, -4176856, 1038845, -6187438, 693100, 1060320, 2706903, 584116, -2163590, -748935, -1264868, -1388885, 3839701, -979253, 550293, -1351304, 752156, -217433, -1385664, -2418067, 3723200, 2762738, 577136, --842350, 4309463, -5984500, -2153926, 2461553, -2401424, 5037997, 574452, 3537979, 515933, -354872, 2382633, -2103460, -798327, -131533, -4832, -1655710, -1222455, 2188286, -60130, --5524939, 5177583, -782221, 924492, -4676683, 2245194, -2105071, 1868848, 77309, -106837, --1795833, -126165, -2731062, 2806761, -5251135, -534723, 3732864, -2956011, 1352915, 5713380, -1661616, 619549, -2879776, 350040, 1449015, -1017370, 1831267, -1140314, -881542, -1546725, -1650878, -1812476, -3036005, 995359, 437550, -697395, 3586298, -876710, -848256, -841814, -1151588, 1376000, -154082, 193810, 600222, -682363, 593779, -1360431, -639950, -185757, --353798, -713501, -85899, 1074, -216359, -401579, -93952, -716723, 343061, -339839, -817654, -532039, 593242, 935229, 555661, 10934450, 2017561, -1526861, 3339874, -1648194, --1367947, -1745904, -711891, -4099546, 5811091, 3362423, 2509335, 2706903, 2570538, -2687039, --3627100, 4898410, -1048509, -3787624, -7222525, 1190780, -2135673, 2276333, 49392, -604517, --1612760, 2283312, -2672007, -1342714, 3576634, 6794639, 1773285, 3097745, 594853, 3423089, --700080, 3642132, 2297808, 422517, 2038499, 193274, 605054, 200790, 4967667, 1064615, -1314260, -1105417, 744640, -336081, -682900, 4039417, 4617090, -1639604, -1683627, 945430, -4250944, -6881612, -348966, -1855963, -5093295, -2059437, 724239, -2158221, 2284386, 1859184, -166967, -3093450, 1464584, -642635, -2962454, 3842385, -5257040, -2471217, -5607617, -2761664, --781147, 860067, 5692443, -2429341, -1460289, 1778653, -876710, -1324997, 2706903, -419833, --91268, -1201517, -1882269, -2333241, -608812, 2032056, 819802, 1002338, 951872, 739808, -93952, -306553, -122943, 190052, 1438814, 719407, 769336, -453656, 141197, 518080, -426812, 32749, 117038, 37581, -81604, -161061, -962610, -725850, -486405, 582505, -486942, -185757, 922881, 3372623, 1386738, -6590091, -694174, 1054415, 4669167, -1360431, --8325257, 6721087, -7870528, 480499, -3472481, -2638721, -8342437, -5436892, -3291556, -2022930, -3346853, 1219234, -5513665, 836445, -2976949, 106300, -252866, 2309619, 398358, -2317135, -328565, 645319, 1278290, -1620813, -1224603, -442919, -2758980, -4035659, 5486284, 2633352, -690953, -704912, 4664335, 4145180, -4723927, 1363652, 383326, -832150, -2779381, 672162, --4879620, 1138166, -979789, -3880503, 4795868, 135828, -441845, 6135361, -5349919, 4836670, -1701881, -660351, -3982509, 1188095, -632971, -4089883, -3517041, 79457, -1578937, -1811403, --5789616, 311385, 1151051, 2726767, -1731946, 2538863, 686658, -968515, -870805, -3337727, -2847563, 639950, 353261, -5575405, 2870112, -453119, 323196, -2863133, 12885, -5120675, -548682, 1139777, 616328, -411780, 427886, -68719, -41876, -867047, 201327, -238371, -1053878, 678068, 389768, 1076426, -66035, 384936, 970663, 658741, -812823, -271657, -1588064, -567473, 246424, -551903, 539018, -1896765, -564788, -565325, 699543, -325881, --12291123, -11610370, 4491462, 7709467, 4645007, -10456098, 7444789, -2517388, -965831, 675921, --4862440, -3665755, 8787503, -105764, -25233, 686121, -219043, 2890513, -4385699, 2676302, --2326799, 2401424, 4019553, -2649995, -731755, 2353642, -678605, 4220342, -1315334, 1846299, -358093, -405874, 345745, -3557307, -4983773, 4723391, 608812, -882079, 35433, -4642860, --5813775, -137439, 106837, 3049964, -5404143, -4577899, -986232, -9569187, 3721589, -730144, -1954210, -710817, -2312840, 1494649, 12291123, 6851010, 3566434, -3656628, 4843650, -27380, --6314139, 46708, -6589554, 5629092, 772557, 690953, -3753265, 64961, 3833795, 1432909, -768799, 510027, 431644, 4146254, 2873870, 558883, 2800856, 1692754, 2238215, 6055904, -2507187, 2995203, -2786897, 2295123, 1695438, -690416, 4757213, 1472100, -4832, -396211, -1427540, 2556579, 319438, -537, -926639, 638340, 2096481, 1181653, -462246, 236223, --1698660, 522375, 445603, -732829, 181999, -75162, -16643, 1197759, -208306, 1249299, -1691680, 635118, -963683, -1859184, 331249, -1160178, 933082, 854699, -1177895, 525060, --2746095, -17623324, -1351841, -4232154, -627065, -2937758, -10013179, -417149, -2700998, -4115116, --9388262, -1148367, 6646999, -4645007, 4368519, -768262, 6163278, -2085207, 5005248, -1646583, --4980015, -1326608, 521839, -2173254, -4479114, -3583613, -4403415, 147640, -4019553, 1465658, -460635, 405338, 1882806, -3009698, -4049617, 5828271, -544387, 1730872, 47245, -4569845, --2914135, -3225521, 143345, -2315524, 4047470, 4129611, 667867, -5600101, -1849520, 10304700, -2550137, -4358318, -3481071, -2207076, -3833795, -2019172, 8036421, 4897874, -5858336, 3574487, -4734665, 7008313, -1822677, 2847027, -444529, 59056, -2851858, -5840619, -1069984, 4302484, -429497, 8336532, 5905043, 390842, 1923609, 7029251, -5616207, -2573759, -1665911, -3457986, -2467459, 1083406, 1125281, -3032784, 2042794, -2206003, 2265595, -4310000, -212601, -406411, --1699196, -114354, -380105, 2102923, 567473, 463320, -1854352, -1258962, -604517, -1749662, --83215, -2518998, -1467805, 88047, -203474, 1547262, -1073742, 411780, -523449, 833224, -607201, 2143189, -1792612, 22574348, 15197205, -4696547, -823560, 33823, -586800, -2606508, -3185792, 7715909, 6561637, 3371549, -11825656, -5288716, 1555852, 670015, 5070209, -8943196, -1836635, 12083890, 8178155, -1406065, 2936147, -1079111, -4051228, -5594732, 346819, -4768488, --2738042, 1378148, 3794067, -3498251, -6452115, -3097208, 1153736, 5947456, 8360691, -1596117, --8761733, -1873680, -3107409, -8841727, -491774, -277025, -4197794, 1451162, 2420214, 5152350, --7365332, 3017752, 3862249, 825171, -7120519, -5328981, 2483565, 306553, 1903207, -787590, --656593, -254477, -3925600, 1951526, 2119030, -2778307, 5018133, 5876589, 8089034, 1926293, -649614, 7572564, 12399571, 1969243, 1738925, 2102387, 7312719, 820339, 4348118, 12192338, -3669513, 2244657, 388695, -2305324, -10370199, 1392643, -226560, -1694365, -1942399, 1280974, --1393180, 2575370, 1198833, -1379758, -705985, -353261, 2156611, 1337882, -526134, -405874, -1486059, 3098282, 78920, -776315, 1138703, 119185, -1390496, -2880849, 2149094, -2712272, -1713155, 1147830, 2071785, -134218, -276489, 43487, 716723, -3783329, 169114, 553514, --298500, 439697, 11954505, 202400, 2539936, 2832531, 5797669, -2296197, 3714610, -3150359, --1909650, -9857487, 3972845, 6637335, -6000070, 5024038, -2445984, -8643085, 9006010, 5253282, --1529545, 5312875, 10536629, 7291244, -5338645, -3061775, 5343476, 1626182, -1128503, 4023311, -3795141, 5398774, 409096, -2422899, -4605279, -8334384, -207232, -6924561, 912681, -2281702, -3911642, -5513665, -12526809, 2732136, -3058017, 5775121, 1531156, 419833, -3419331, -7454453, --6158446, -622770, -570694, -5629092, 7944616, 10159208, 10648298, 4245039, -7510287, -699006, -10093173, 933619, -1661616, 4637491, -1244467, -2557116, -9450002, 5213554, 2825552, 13764833, -6444062, -9401147, 3214783, 3493956, -924492, -201327, 3416647, -2309082, 835908, -4044786, --9802189, 8893804, 1700807, 5290863, 2645700, -4679367, 7621420, -1702418, 1869385, 382789, --1600949, 264141, 300648, 577136, 4021163, 1285806, 824097, 318364, -1280437, -1610613, --1994476, -1241246, 1432372, -674310, -33286, -807454, 1318555, -1175210, -534187, 102005, --81068, 513785, -2106682, 2514167, -994822, 2211371, 805306, -1177895, -1366337, 3128884, --2801929, 2510409, -627065, -3639448, -6136972, -1626182, -1588064, -10528575, 499827, 1314797, -5251135, -1976759, -4576825, 1910187, 544387, 2512019, 49929, 5745593, 2267743, 3971234, -640487, -431644, 3370476, 2002529, -10425496, -3202972, -14889041, 678605, -2808372, 1720134, -2592013, 201327, 7056632, 1807644, 10091563, 1245004, -12091944, 243739, -4893042, -1997160, --618475, -1813013, -666794, -9558987, 2030446, -4607426, 11457362, -11955578, 6577743, -2607582, --10257456, -1922535, -7230041, -1559610, -2240899, -10873783, 3059091, 3307662, -2047626, -1816771, --753230, 3820910, -8686571, 196495, 8024073, 1469953, 11186242, 18347026, 7524783, -16668231, --22276384, 10742787, 4755603, 16554951, -3507915, 7926362, 1627793, 7869991, 10994043, 14217415, --7654706, 4072703, 10528575, -8725763, 1536525, -1158567, -1173600, 753767, 7489886, -1200980, -2501819, -4954782, 1687922, -3833795, -4081293, -1815161, -3426310, 494458, -2059974, -5660230, --304406, 3657702, 2214056, -1104344, -1139240, -897648, -22549, 1663226, 1712081, -1517197, --2294050, -1039382, 3109556, -862752, 3006477, 417149, 342524, -872415, 637266, 841277, -141734, 777389, 27380, -2739652, -2709051, -1769527, 697932, 2581812, -3905736, -2607582, --1327145, 1462436, -1913945, -1530082, -20474646, 15324443, 2649995, -2547989, -442382, -9075266, --7693897, 8050380, -2280091, -2463164, 8064338, -5996311, -6735583, 476741, 8012262, 3585224, --2798171, 345208, -4840428, -532039, 478352, 4475893, 25770, -10300942, -10500658, 2408403, --1557999, 2570538, -1211181, 4227859, 7846369, 15040439, -419833, 9351754, -2473901, 2682744, -6209986, -6174553, 12026982, -1708323, -7795366, -10689100, -2253784, -8866423, -11435350, -3076807, -4964982, -3446175, -8936753, 4376572, 6000070, 9731859, 12331388, -10229001, 3678103, -2849174, --9644886, 3531537, -10757819, -1940788, -17423072, 6857452, -5367099, 2535105, -3338263, 2695629, --18726594, -18440442, -11431055, -4346507, 9970767, -9937481, 19150722, -6872485, 1672353, -1837172, -3357591, -1804423, -13995151, 1952600, 1336272, 3708704, 2917894, 1566053, 5046050, -3100430, --4989679, -34360, -66035, -4644471, 1799054, -5965710, 3052648, 1912871, 2415919, -941672, --287763, -1882806, -4860829, -3400540, -2176475, -2149631, 2723546, -2139431, -5826123, 1805497, -2039036, -1123134, 3416647, -427886, -1430761, -141197, 551903, -1731946, -1908039, 1857037, -2370822, 1892470, 571768, -4156455, -3219078, -1020055, -3537979, 1023813, -60666, -201863, --4974646, -2498060, -1000727, 1029718, -43487, -3867081, -805306, -96637, -3048890, 17433810, -731218, 6748468, 4251481, 2077690, 9735617, 1649268, -14278619, 7017977, 1740536, 6712497, --906238, -10107132, 14573898, 8292508, 5826660, -1140314, -4773320, 2173254, -1353989, -7968238, -5059472, 3980361, -4849555, 6223408, 9174587, 506806, 3285113, 9657234, -10509248, 2707977, --3720516, 4468914, -19528680, 6128919, 8995809, -2990371, 2195802, 9529996, 4693863, 389231, -2797098, -9402757, 2210298, -5438503, 161061, 3027952, 1255741, -4170413, 18175764, -3089692, --3768297, -4089346, -16363825, -6315213, -10131291, -11215233, -2471217, 16068010, 17135846, -1510218, -5107253, 7164543, -14810121, -4505958, 11545409, 9948755, -6044630, -3890704, -14590004, -4472672, --5687074, -6724845, -8346732, 2330557, -14878840, 2580202, 13449690, 19340238, 5633924, -5470178, --660351, 10335839, -3823595, -6751152, 407485, -722628, -3306588, -4480188, 421444, -315680, -2007897, 3196530, 1499481, -1496259, 623844, 1777580, 1005022, -113817, -3061238, -5975374, -1488206, -227633, -2762201, 4801237, 1198296, 2758443, -2866354, 4098473, -3052111, -1995012, --3402688, 3277597, 367220, 2457258, 4358855, -256087, -2633889, -1140314, 2060511, 1178969, --454193, 261456, 386547, 802085, -518617, -793495, 2098629, 3286187, 8127152, 3955665, --1531156, -5450314, 3411815, 862215, -7165616, -10698764, -11438035, -4617090, -11185705, -4699768, --4527433, 137976, -10646687, 2344515, 4501663, 454193, -12161200, 3742527, -15091978, 4622459, -8436926, 194884, 13107166, 351114, -3894999, -2439542, 8838506, -3228205, 12162274, 4280472, --4209605, -4218195, 2139431, -6251325, -3353296, 408559, 11496017, -435402, 6072010, 3408057, -1034550, 8020852, -3629784, -7450695, 3268470, -5352066, -2473364, -14510547, 8126615, -5135707, --4291746, -2988760, -15957951, 19004694, 4922570, -2335389, 8278550, 2651069, 4015258, -8509404, --12719546, -14509473, -7002408, 679679, -14621679, 5366562, 10537702, -16441672, -6012418, 5921150, --7573638, 3866544, 18140868, 494458, -2991982, -4924717, 4057134, -9981504, 6415608, 3394635, --8979166, 2825552, 6280316, -3706020, -10628433, -9141838, -4795331, -448824, 2821794, 2352032, -1903744, -1957968, -2720862, -1434519, 2251100, 537, -1579474, -6102075, -7210177, -2081985, -395137, -5225902, -6198712, -4357781, -2667175, -2476586, -5458367, -4766340, -2596308, -3484292, --6947110, 1027571, 6291054, -814970, -728534, -2743410, -2071785, 1960116, -2544231, 306553, --5525476, 12348, -1707786, -3086471, -162135, -2911988, 1523103, 2309619, -2424509, 3590056, --2820183, -1250372, -2914672, -426276, 256087, 5172215, 11348377, 29120416, 30107184, 9424769, -18599356, -12650826, -13251048, -2786897, -2142115, 1343251, 4060892, 9928891, 17203492, 5958731, -15908559, 2029372, 4672388, 2643016, -4655208, 7597261, -390842, 3171297, 1050656, -7974681, --1212255, -4171487, -9089761, -5312875, -48855, 1116155, -11989401, -4635344, 14681809, 10937671, -7543573, 12814572, -7987566, 303869, -21799644, 1224603, 18376018, -3404835, -3874597, 2445984, --2169495, 14738717, -1329829, -2210298, 11024107, -13151727, -21825414, -8519068, 1764695, -11436424, -8441221, 12256226, -17219598, -6253473, -22012, -115964, -24634322, -15384036, 7684234, 3583613, --1988033, 8075613, -10835129, -6357089, -15265924, 3789235, 4707284, 1448478, 901943, -9849971, --16807818, 13975824, -22800908, 6809134, -8440148, 21824876, 2118493, 9206799, -6298570, -8362838, -6156299, 3105261, 9580998, -9055402, -1785096, 6754373, -546535, -4938676, -4882841, -4852776, -376883, 5230197, 5459977, -6051609, -2691871, -840740, -8382166, -2773475, 1416266, -738198, -637803, -4172024, -7361037, -865973, 105227, 5869610, 1689533, -3360812, 4328790, 920734, -2169495, -7854422, 1572495, -4624069, 3740380, 874026, 3966402, 6613713, 1934883, -4359392, --9090835, 2997887, 2978023, -28127204, -20318954, 14090714, -2976412, 25578140, -6272800, 21067352, --16956530, 561567, 7504919, -1621887, 860604, 2520609, -1363652, -12635257, 4404489, 4826470, -5506148, 6375879, -3950833, 10481868, -9525701, -6944962, -5466957, 14722611, -8147553, -2675765, -1264331, -252866, -7668127, 6595459, -8550743, -10062035, -19122806, 1794223, 3441343, -12896176, --6097780, 6293738, -2677375, 3389266, 978716, 15116137, 990527, 11391327, 4996658, 544924, -9023726, 2121177, 3085934, -17024176, 17531520, 6289980, 13721884, -8317741, 3596498, -9108552, -14235669, 10910291, 17380658, 2843268, -4635344, -12619151, -855772, 2298881, -10861972, 15396921, -2404108, 2449205, 16441672, 3760244, -5018670, -6526740, -608812, 9882720, 11775190, -3784403, -14701673, -17609366, -18596134, -8035347, 4231080, -5575405, 8001524, -1941325, 4259534, 14228153, --708670, 7100655, -5973226, -5312338, 6107981, -467078, 9844602, -2988760, -148176, -2967286, --6217502, 1324997, -3695819, -1351304, 4000762, 1475858, -5665062, -5021354, 2887829, 7603166, -7703024, -699006, 6290517, 7024419, -9822053, 4628364, 9091372, 7324530, 3973382, -7164543, --8904541, -9075803, -9357123, -9079024, 654983, -3100967, -1404454, 1145146, -6883759, 4909685, -4228396, -3368328, 5050345, 1956358, 2314451, -6316823, 5252745, 12986370, -30633318, -1399623, -15949361, -10207527, -3418794, 11747809, -12771085, -25919054, 5129802, 4382478, 3990025, -3401614, --15348603, 3841312, 4322348, 1126355, 8471286, -27485644, 12559558, -6413997, 6514392, -15684147, -12682502, -19839528, -12692165, 7637526, -5239860, -2355790, -15105937, 11768747, 15502684, -100395, -1670742, -7222525, 23277112, 5724655, 6294812, -4308389, -20273856, -4414153, 11080479, -2105608, -16617765, 64961, -6134824, 3951370, -1253057, 10392210, -20075214, -2498060, -15420543, 16490527, --6267968, 5468567, -562104, -682900, -18215494, -6456410, 15809775, 4986994, 1316944, -4894652, -360240, 1930588, -23329188, -24143084, 25479894, -11469710, -27916214, 11201812, 13012677, -22490596, --29405494, -20547660, -19754166, 3368865, 7650411, -2571075, -19001472, -734976, -10242423, -4878009, --13824963, -892816, 1218160, 1242856, -2891050, 12811351, -7196755, 4953708, -6139656, -437013, -3373697, -3441343, -685584, -7803419, 9926743, -2510945, 3359738, -5765994, -8378408, -1852205, -3765613, 4382478, 1220845, -8134668, 4518843, -1305133, -6620155, 6097780, -9917079, -2100239, --6222871, 9562208, -4507032, -10963441, 4466766, -4451734, -4890894, -14515379, -996969, 3032784, -11775727, 4734128, -7350300, -3826279, 930934, -2118493, -4045322, 2019708, -825171, -2945811, --2974265, -1147293, 11783780, -16585553, -9580998, -17351132, -1839857, 3799436, -23800562, 3972845, --11749957, 32993402, 1510218, -29324962, -6999723, 14496051, 8536784, 7161858, 14654428, 15123117, --21512418, -5259725, -8451422, 20146080, -7231115, 23490786, -238908, -13303661, -10936060, -20684026, --24107652, 1577864, 2580202, -3755412, -12517682, -5097053, 1413581, 3933116, 8011725, -11551851, -5748277, -13612362, -16357383, 3292093, -3634079, -4177393, -17045114, -15867220, -7875897, -4815195, -22736484, 2240899, 7529078, 12992276, -561030, 28921772, 11513734, -9487583, 1329829, 14940581, --5948530, 18884434, -5085778, 2457795, 1153199, -25391846, -26229902, 3949759, 18100066, 481036, --5822365, -28424630, 1701344, 9827422, 5990406, -9701794, -8096014, -5588826, 3358665, -12237436, -30158186, 17156784, 18446884, 3762928, -21500070, 7851200, 9635222, 30230128, 6837051, 3155190, -11995307, 5244692, -5034239, 346282, 9168145, -791348, 1154273, 3071439, -7761543, -5299453, -8918500, 322659, -7392713, 9562208, -5990943, -2119566, -4611721, -4315906, 8346195, -5388574, --2536178, 4536023, -9190156, 3885335, -920197, -5140002, 11041824, -3956739, -86973, -14144938, -8589935, -4282083, -3784403, -9102646, -13088376, 2113661, -5324149, 9208947, -373662, 5485210, -3425237, 257698, -5489505, 200253, 8207146, -41876, -14249091, -12852690, 27230630, -8389145, --10176388, -1370095, -7587597, -18519362, 338766, 12933757, -31958314, -476741, 8223789, 10253698, --10930692, 7301982, -18314814, 1474784, -4761508, 5784784, -16404628, 10253698, -27899034, 4635881, -723702, 15850577, 14804752, 7458211, -10441602, 11668352, -3428458, 13026636, -14139032, 2302103, -16485695, 13165685, -7784628, 2764885, 387621, -3586298, 7987029, -3040300, -9640591, -10641855, -7618735, -19285476, 12770548, 3064996, -20781736, 19640348, 18708878, 17696876, 6342593, -9077950, -22650046, 2801929, 9726490, -13838921, -12087112, -13262322, 4133369, 5249524, 8114267, -18634790, -1811403, 13841069, -35929548, 1424319, -11800960, 22592602, 14520211, 11382737, -3179350, 15001247, --14088030, -667867, -9808095, -21531744, -903554, -19822348, -16639240, 9812927, 26552562, -24879134, --5913096, -4488778, 26658862, -6519224, 11667279, -7571491, -4665945, -952409, 9440338, -5504538, --2311766, 838056, 6438156, 4799626, 3393561, -3483219, 991601, 2851322, 13218836, -10377715, -11034845, -2328946, 8078834, 84289, 2162516, 2876554, 5094905, -6841346, -1542967, -1270237, --8564702, -7606387, -7596187, 5355824, 4274566, -1496796, -3395709, -4355097, -5983427, -3654480, -527744, -2602750, -36507, 8020852, -158377, -14479408, 6859600, -8443369, -1267015, 6205691, --2373506, 24075976, 4817880, 12357695, -34540128, 16193637, -19452980, 26235808, -2880313, 10408853, -19347218, -20878910, 37514928, 27428734, 20173998, -8981313, 5251135, 26218090, -6755984, -8032126, --6293738, -1071058, -19822884, 5476084, -10658498, -23460186, 22758494, 7894150, 6087043, 3165391, -5100811, 9185324, 23973970, 5366025, -15316927, -1011465, -15884400, 3376918, 2044941, -27268210, --1388348, 15272904, 878858, -1696512, -8619462, 29554206, 5823439, 12744242, 6238440, -15533823, --11502459, -8364986, 17988396, 11016591, -3849901, 11316165, -1829119, -19667728, 19145354, 2630131, -21976810, 2729452, 2079838, 716186, -29642254, 4290136, 580357, 3535832, 18104360, -6959995, -28606630, -43498892, -7975218, 32927904, -13422310, 11080479, -15106474, -23023710, -18971944, 13804025, --13030931, 12890271, -20368882, -4035659, 3197603, -4684199, -8128226, -2268280, -2572149, 9083856, -20082730, 2427194, 11837467, -3649112, -2219424, 15078556, -2348810, -3937411, 3898757, -7107634, -6381248, 13169980, -8801462, -1028108, -3549791, 2649995, 2224793, 6405407, 22713398, -3866008, -7876433, 708670, 5312338, 8623221, 3986804, 1586454, 12559021, 14090714, -4041564, -1636383, -5505611, 3296388, 4739497, -17439714, -1662152, 17162690, -3968550, 3809099, 6423124, -630823, -17476222, 6051072, -35367980, -42494408, -3671123, -19964082, 2765422, 11987254, -16901234, 4865124, --25855166, 11187853, -14212047, -70972720, -4499515, 43148852, -18577882, -8108899, 43509092, -10291279, -2400350, 51958904, -12401181, 11413876, 4920959, -7700340, 41970420, -33853468, -4310000, -1021665, --5893232, -6893960, -6867116, -940598, 13693966, -7785702, -22835268, 156766, 492848, 6657200, -8372502, 1410897, 18855444, -823560, 8690329, -5242008, -22670448, 15716359, -2764885, -23469848, -915365, 13373454, 41306848, 20783346, 34724812, 625455, 8557185, 16464220, 3922379, -2131378, -32453310, -1816771, -12641162, 37880536, 6635725, 6606197, 269509, -5468030, 21697102, -117038, --12634183, -14362371, -2963528, -2932926, 32846300, -22405234, 2859375, 4116189, -5865852, 38477000, -296353, -24805046, 4114579, 12492986, -18168248, -988916, 18441516, 15128485, -9366787, 1345399, --10584947, 8783208, -2889439, 1100585, -10426570, 9524627, 67646, -1177358, -15138686, 6118718, -5086852, -9951439, 705448, 3447248, -5152887, -3473555, 11573326, 1697586, 6416145, -4402879, -3332358, 20061792, -18413062, -8477729, -6103149, 21701396, 8039642, 11429445, -13285944, -12172474, --5004174, -1574642, -16103443, -18087718, 21430276, 8580271, -12753369, -11904576, -7322383, -250719, --12659953, -11115912, 47245, 3205119, 8053064, -2232846, -4130148, 6560026, -1720671, 2057826, -24157044, 19389092, -39687644, -19478750, 30592516, -5669894, -29731374, -319438, 663036, 10741713, -32350230, 28685012, -17646410, 5274757, -3971771, 212064, -258235, -18644454, 28067612, -8361228, --18335752, 6500970, -13152264, 15887084, 1431835, 22609782, -6941204, -21518324, -19381040, 17125108, --8223252, 22306450, -5961952, 14439680, -14654965, -11449309, -6950868, 1573032, -18402862, 4496294, -1012002, 278636, 18061412, -230854, 6059662, -12542378, 8973797, -19779936, 21194590, -19027242, -12615393, 6376953, 17825188, -29766270, 1059246, 2494839, -8949101, -21506512, -36374616, -6100464, --31031138, -11954505, -24822764, -11587285, -45403708, -14124537, 20674362, 26122528, 14269492, 15213311, --2403034, 16530792, -32328756, -7388955, 5082020, 20936892, 5829881, -44518408, -1697049, -19553912, --12973486, 52110300, 35067336, -24656870, -9983651, -17299054, 5873905, -45858976, 2892124, 9629317, --13048111, -13565117, 8426189, 2742337, 522375, -8748312, -7655779, -7477001, -7566659, 14405857, -13234942, -854162, -3590593, -14038637, -16121160, -3347927, -3963181, 5565741, 14116484, -27251568, --1968706, 13811004, 52613, 17648020, -6003291, -16648367, 9182103, 19083076, 9693741, -11227045, -1518808, 17689896, -22189948, -15728170, 29731912, 1808181, -879395, -2820720, 4833986, 7023882, -9139154, -3510062, -7055558, -8283382, -52170432, 15090904, 8403640, -27776090, 11055783, 10031433, --19832012, -15577310, 23704462, 2708514, 12703976, -6543920, 15721191, -5170067, -2294050, 12030203, -6086506, 3794604, 498753, -8501888, -14063870, -8895414, 22404160, -8075613, -19146964, 32571958, -20418274, 2361695, 15113990, 4206921, -16806744, -50337552, 20657182, -1910724, -26940182, 22490596, --2274185, -36760624, -30590904, -16209207, 24097988, 9380745, 24970402, 31071404, 9474698, -25551834, -8126615, 8857833, -32113470, -5448703, 18276696, -10307922, -35006668, -26890254, -42700028, -27542552, --6078990, 26805964, 39276404, 18624052, -2483028, 26721676, -6624450, -66376036, -52327196, 11267310, --26310432, -31592706, 45035952, 5690295, -60327112, -46961708, 16069620, 2549600, 10459319, 22232898, -54244364, 30802968, -4424890, 60029148, 19348828, -63471564, 700617, -13719199, 32830730, 9578851, --20612622, 9920838, -15436112, -9489730, -13408351, 20318954, -3652870, 14792404, 12763569, 16039018, --3487514, -16565689, -5143224, 10997801, -6878927, 9208947, 6247030, 6570763, -14015552, 1466731, -5891085, 59056, 25636122, -1098438, 11476153, 2274722, -4063039, 13390097, 3439195, -2257005, -15298674, -7468412, -2158221, 9043054, 3959423, -1665911, -5993090, -8815957, 1124208, -10092636, --7181722, 5061619, 7434589, -7795903, 49400712, 48193828, -15229417, 16869558, -19812684, 12176232, -564251, 7101729, -23592792, 2005750, -20167018, -17775796, 99858, -41248328, 951872, -17477832, -4544613, 12302397, -384936, 14229227, -20403242, 30963492, -15302968, -426276, 21268678, -19963008, -7792145, 15508590, 18865644, 2837900, 6781754, 4793184, -29773250, -16440598, -4840428, 4487167, -4556424, -4327180, 19679540, -6267431, -300111, -3674882, -8562017, 7056095, 3898757, -23428510, -6896644, -18814642, 5150740, -45315664, -2224256, -1058173, -126702, 18610094, -7507066, -16478716, --7424925, 17099338, -87510, -43803836, 61351996, -5299453, -11776263, 13443785, -2717104, -8968429, --11547556, -12159589, -13201119, 42168524, -16326781, -24327768, 20822002, 2101313, -33279018, -7778723, -13837848, 11113228, -11010149, 22771380, -4061429, -6168110, 20946556, -15405511, -14270566, 26626650, --11822971, -4138201, -1515587, 11319923, 5370857, -212064, -1940252, 724239, 4950487, -5392332, --493921, 5270462, 5438503, 6669011, -16387448, 4274030, 8133058, -15782931, 1245541, 3391951, --2914135, -6343667, 6300180, 1893544, -5834176, 995359, -650151, -2594160, -20084878, 11429445, --11933567, 3663607, 3265786, -17988934, -1127429, 970663, -232465, -166967, -6231998, -799938, -4992900, -641024, -39080980, -57623428, -55455008, 122781304, 101855688, 116037672, 262088032, 68655592, --65648040, 20816096, -210177984, -222760096, -55123756, -139942384, -108257872, 66411468, -34378528, 13975287, -167072080, 83068424, 123875448, 237941728, 158567504, 41640244, 34587372, -69844760, -216312272, -165144176, --126436856, -255467344, -103314904, 6411313, -45091252, -20077898, 129559296, 34613140, 17584132, 160551776, -20074140, 38659536, 227867872, 167700224, 106213464, 215572992, 107469744, -37389300, -2970507, -67716064, --334947328, -292135616, -236071808, -366940000, -279588960, -98735392, -132268352, 30363808, 255468416, 228307040, -315713920, 398616992, 296617408, 231549744, 225137360, 124840744, -41691784, -79621176, -182415312, -260505872, --255969856, -221628896, -254082752, -259896528, -208974848, -116569168, -84466976, 32179506, 200041328, 288338880, -411251712, 462615744, 276290944, 67536752, -39064876, -277811360, -264469056, -201281488, -156429696, -57802744, -29885994, 22371948, 28801514, 36064304, 17029008, 42369316, 59176060, 44150652, 71372152, 40873056, --17703318, -21584896, -62223876, -113985208, -31006980, -35326108, -40931040, 36417564, 31215286, -38414188, --49750216, -92739616, -151871648, -63468344, 87251184, 148390576, 287313440, 346670432, 235777600, 146572736, -39529268, -129344016, -189536912, -214430000, -250881920, -235670224, -180812752, -146375168, -121126664, -73237248, --18156438, 63735704, 219578048, 306405120, 272004032, 195751728, 121012848, 26828514, -46658376, -71418864, --90714544, -64438468, -16832514, -2421288, -18158584, -30495342, -49466748, -79549776, -103589240, -99981472, --100369088, -58452356, 10364830, 38043208, 69184408, 90896544, 91934848, 71729712, 48964776, 28124520, -15826418, 22891102, 31132070, 31839666, 28161026, 16952236, -6439230, -37280852, -62181464, -76198088, --77845744, -62555124, -49427556, -39984536, -20632486, 5682779, 22249004, 28858422, 33149094, 35403416, -42133628, 46341088, 41539848, 23870892, 10438918, 3092913, -6102612, -8810589, -5403069, -8459475, --4842576, 1653026, -2673617, -11917461, -14500883, -23751170, -33704220, -32192928, -28791314, -21981642, --3300146, 12139725, 19881404, 28233504, 32287416, 23257248, 17863842, 9987410, 2796561, 2595234, -9167608, 8540542, 7665443, 4325032, -5967320, -13225815, -20402168, -27709518, -27945742, -21998822, --11977053, -1756642, 9164386, 16327318, 19455664, 15980500, 10468983, 4713190, 1666447, 667331, -505196, -666794, -1643362, -2986076, -3389266, -3277597, -2282775, -1489280, -335544, 37044, -511638, 29528, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ -8932458, --1172526, 709207, 7030862, -908922, -324807, -2050847, 7669738, 445603, 3730179, 2262374, -2258616, -3167539, 1592359, -4903779, -531502, 3795677, 772020, 2221035, 3579318, -6054830, --4224637, 1436130, -299574, 4486630, 2735357, -237297, -2491618, -1571958, -3082713, -494995, --410706, -466541, 854699, 1170379, -2682744, 4497368, -1033477, -705985, 1538672, -5740761, --1323387, 2479807, 878321, 5658620, -21475, -417149, 1105954, 383326, 2357400, 3917547, -4984847, -290447, -514322, 87510, -2867428, -3641596, 2009508, 3248606, -2281702, -2190433, --1479079, 4144107, 2441689, -572304, 646393, -4889821, -1408212, 2539936, 2107218, 3613678, --5255430, 1192390, 1988033, -1096290, 3707094, -239444, 3231426, 1537061, 1039382, 4098473, -2034741, 1034013, 33286, 483184, -977642, 344134, 569620, -323196, -1456531, 719944, -708670, -1078037, -150861, -727460, 761283, 1178969, 47782, -150324, -66572, -1093069, -536334, -386010, 907849, 428960, 279173, 194884, -488553, 296353, 134218, 466541, --868657, -413391, -192200, 119185, -1183264, 11647951, 3206193, -2667712, 5936719, -2886218, -6178848, -2055142, -2819109, 3143379, 5777268, -177704, -2859375, 1542967, 1211718, -237297, --8229694, 1927904, 2408403, 660351, 5137318, 6918656, 3711389, 6812892, 4629975, 4151086, --1109712, 4610111, 2218888, -3495567, 1307281, 2129767, -4503810, -5716602, -880468, 2253247, -87510, -2063195, -2767033, -2692408, -1337882, 3084324, 6179921, 5236639, 1975148, 4022237, --6493991, 409633, -1658394, 63351, -7453379, 2763275, -718333, -1757179, -292058, -2022930, --3685619, -2588792, 2611340, 625455, 2002529, -2716567, 5081483, 1306744, -5888937, 2432025, -745177, 1636383, 3223373, 978716, 5917391, -1888175, 646929, -6912750, 1312649, 666257, -195958, 163746, -1303523, 4917201, -1505923, -2285996, 3728569, -3864934, -1888175, -1596654, --721018, -1802813, 1244467, 329102, 648540, -51003, -172872, 63351, -708133, 423054, -644782, -250719, -304943, -34360, -1281511, -2087891, 766652, 253940, -1649804, -220117, --185220, -360777, -1998234, 509491, -12885, -66035, 133144, 345745, 212601, -758599, --32749, -1377611, -160524, 572304, -2352032, -2378875, -762357, 2155537, -3982509, 1155346, --7871065, 1467268, 1493575, -928250, 5634997, 345745, -620086, 494458, 2987687, -4840965, -696322, 1466731, 3090766, -6882148, -3472481, -2604898, 2526515, 1017370, -2149094, -6955163, -1690607, -6918656, -415538, 2727304, -1271310, 2073932, -1185411, 4639102, 6907918, 3631932, --3563212, 655519, 5237176, 3215857, -3225521, 2701535, 817654, -5396627, 1900523, 7383049, -3477313, 2465848, 8259222, 725313, -3122978, -6329171, -267362, -3559454, -4242891, -2029372, -4545149, -4322348, 1511292, -2586107, -2396592, 5272073, -684510, 861141, 4223564, 5727876, --2542084, -5288716, 6717866, 5133023, 3294240, 296353, -4024384, 628139, 5310190, -5392869, -1646046, -3519726, -108448, 3266323, -3071975, -188979, -5919539, -1580011, -513249, 884226, --307627, -2259153, -259846, 1117228, -1742683, -469762, 819802, 661962, 515933, 471910, --83752, -449361, -2331094, 1240172, -121333, 1278290, -898722, -1556926, 551903, 1211181, --800475, 1067836, -179315, -89121, -91805, -259846, 1306207, -775778, 510564, -783295, --15601469, -5712307, -2401961, 8535711, -3239479, -1284732, -5043366, -4269735, -728534, -11254962, -6307697, 2081985, -319438, -4159676, 6209986, -1750736, 3154117, -2517925, 1992328, 3956739, --4947266, 519691, 5459977, 3083250, 2199023, 5836324, 5223217, -3280281, -4179003, -5216775, --86436, -6857452, 1636383, -9057012, -1733019, 6664716, 3506841, -2299955, -704912, -6815040, -3093987, -2916283, 6004365, -3462818, -6162741, -1270237, -2539936, -5068062, 1961726, -1165010, --3223373, -3289408, -10916733, 1487132, -3274376, -8094940, -2152852, 4983773, 2558727, -4189741, -3456375, 4439386, 4292820, 1589138, -5581310, -936303, -1239635, 3860102, -3922916, -1513976, -2035815, 2062121, -6109054, -7283191, -13066901, -2242510, -7589207, 2491081, -293668, -1819992, -3842385, -819265, -1749125, 1668058, 2620467, 2509872, 1958505, 4540318, -1941862, -1609002, --1228898, 659814, 228707, -1043140, 1253594, 1796370, -401579, 415001, -797253, -1043140, --193274, -681289, 187905, 386547, 53150, -1156420, 177167, -783295, -296890, 642098, -1465658, -662499, 1755568, 2129230, 336618, -630823, -1859184, -386547, 1249836, 820876, --809064, -13579076, -5430986, -2433099, -4020626, 4620311, 6041945, 5694590, -11335492, -8465381, -3263638, 13814225, 8170102, -5369, 1969779, 3936338, -4961224, 3278134, -4598836, 3325379, -4911832, 759136, 3942243, 1230508, -270583, 2045478, 1217623, -3701188, -4684199, 6483253, -2633889, -4729833, 4647692, -2578591, -471910, 11144366, -5310727, 6310918, 12463995, 5086852, --702764, 483721, -4483946, 5828271, -5939940, -3248606, -9990094, 1888712, 7721815, -188979, --7068443, -2517925, -10024991, -5091147, -1852205, -14268955, -7756174, -1405528, 1524713, -6244346, -3178813, -1650341, -4921496, 5349382, 15792058, 1473711, 8056822, 5463199, 4743255, -4988605, -2114735, -8504572, 923418, 2454574, 1923072, -3299072, 92342, -8634495, -2994666, -3024731, --598074, 4207994, 4518306, -193810, 1770063, 2456721, -1218697, -935766, -777389, 817654, -119722, 614180, 492311, 1389959, -711354, -37044, -2051921, -245887, -300648, 1491427, -869194, -899259, -1229434, -1196685, -1152662, -384400, -1420560, 529892, 2685965, -2093797, --248571, 923955, 1539209, 21209622, 13402982, -7292318, 2720862, 6827388, -2817499, 3908957, --1327145, 6369437, 3190087, 2040110, 5776194, 3269007, 2857764, -1799054, -14192719, 6797323, --2417530, -3227668, 11103027, 6875169, 3836480, 5123896, 3802120, 2828236, -2172717, 1648194, -450972, -3629784, 2935073, 4806606, -8006356, 1537061, -5181878, 3834332, 4431870, -12511240, --206158, -14889578, 255551, 1865626, 1263257, 4070555, 10160282, -1237488, -5267241, -2575907, --2828236, -3911105, 2923799, 3155727, 982474, -1647120, -1828046, 9881109, -3277597, -1969779, --5392869, 8777839, -1334124, 7377680, -3471944, 7884486, -7589744, -15947750, -4744865, 1005022, -3226594, 5398774, -5374078, -3995930, 2183991, 1445257, -2492692, -4155381, 9970767, -3897683, -9484898, 2513093, 6701223, 2646237, 4881231, 4123706, -1720134, -639950, 1915019, -277025, -5171141, 138513, -1719598, 477278, -5806796, -1145146, -1348620, 407485, -1945620, -738734, --659814, -133681, -675921, -3038689, -2476586, 744103, 202937, -3411815, -213675, 507880, -494458, 1398012, 583579, 3364570, 140660, -1130113, -146029, -452582, -1567663, -1833414, --737661, 508954, 9931575, -3797288, -6589017, -308701, 1055488, -9432285, -7364259, -2354716, -2572686, -1410897, 12249247, 7340099, 332323, 11682311, 4224101, 3415036, -10008884, 9393093, --1749662, -2364380, -8440148, -3822521, 7509751, 7401840, -2102923, 4907537, -10151692, -1433445, -6833830, 5134634, -3789772, -7218767, -4043175, -4462471, -5557688, -4635881, 1119913, -7586523, --723702, 10478646, -5037997, 1209033, -388158, -2413235, 4095251, -1671816, 6857452, 8590, -9668508, -2479807, -6077916, 3495030, -4800163, -4764193, -4800163, -13712757, 1601486, 5680094, -8176007, 5889474, 10741713, -1097364, -4116726, 6206228, -7614977, 1777580, 1189706, -1140851, -6965363, 6493454, -1658931, -8278550, 1668595, -4272956, -7876970, -7304129, 4044249, 7091528, -4453344, -15315317, 3469260, 1641751, -747324, 7239168, 3919158, 5926518, 2255395, -562641, -7780334, 1056025, 3546032, 2833605, 633508, -3470871, 589484, -1928440, -4246649, 828929, -1319629, 2043331, -486942, 569083, 503585, 395674, 1545651, 1009317, 1075889, -140660, --2667712, 1928977, -1060857, -1188632, -984084, -1896228, 3550864, 4003447, 3410741, 1387811, -406411, 605590, -775778, 2745558, -12242804, -6895570, 1102733, -6724308, -18039400, 13711146, --469225, -717796, 1542430, 1241782, -11990475, 8436926, -12493523, 1270774, 5463736, -1448478, -1881733, 2160369, -13428752, -4290673, -6077379, -1053878, 2551211, -4183298, -2933463, -364535, --947040, 1388885, 5381057, 3144990, 11763915, -4155381, 16209743, -972810, 280784, -10533407, --1752347, 8132521, -1743220, -16295106, 6488085, 7830263, -5062156, 4224637, -6313602, 11586211, -6154688, -151398, -832150, -7152195, -4832375, -7843147, 7348152, 7580081, 3099356, 1016834, -3223910, -6290517, -17152488, -6043556, 5802501, 2782065, -12759811, 490163, 1338956, 1897302, --6196564, 4507568, 8807904, 4794794, 40802, 3796214, 6017786, -3308736, 9032316, 312996, --382252, -8922795, -11747272, 7627325, -3674345, 3866008, 3638911, -468688, -2619393, -2382633, --2071785, 1342714, -2985002, 3922379, 747324, -891206, 836982, -1189706, 31675, -4598300, -1072668, 514859, -941135, -2501819, 775778, -2199560, -238371, 890132, -591632, -1398012, --133681, -1404454, 5634460, 4493073, 1529545, -543850, -589484, -1535988, -62814, -534723, -3572339, -1116692, -582505, 3614215, 730144, 1574642, 2474438, -1686848, -1057099, 2725157, -1492501, -629750, -491774, 3854196, -18882824, 10179072, -2623151, 3777961, -5628018, -2997887, -7866233, -9117142, 8852464, -5496485, -10740103, 4884989, -5813775, 22822382, 3326452, -7922067, --11127187, -1947768, -13786308, -6269579, -14844481, -833761, 9822053, -6973417, 6034966, 10011032, --9311489, 63888, -10858214, 6086506, 2064806, -367220, 6294812, -6702834, -9747428, -8149164, -492311, 1851131, 8062191, -11684995, 8266202, 1656784, -17365626, -9491878, -14031121, -5710696, -5231270, -4684736, -4731980, -26548804, -628676, -5814849, -2508798, -17024176, -6009733, -2236604, -1243393, 13914083, 12588549, 10733660, 6088116, 13412109, -14500883, 11255499, 1482301, 5257040, -3697967, -10285910, 15939697, 9947681, 6236293, -7026030, -9540196, -6791417, 9216463, 1086090, --44023, 5053566, 2345589, 5312875, -4751845, 14093935, 7308424, -1493575, -2386391, 3174518, -2752000, 1735167, -933619, -842350, 1216550, -205085, -340376, -5816997, 250182, -3353833, -116501, 1873680, 550293, -335544, -67646, 1174137, 919123, -5532455, -1570884, 1984275, --1708323, -2150168, -234076, 763967, 812286, 1096290, -910533, -1131187, 858993, -2403034, --4223564, -1022202, -1127966, -1326071, 655519, -302258, 3568581, 1742683, -1588064, 1638530, -1107565, 951335, -1639067, -2870649, -164819, 459562, 3029026, -1060320, -826244, 7132330, -13219909, 14334453, 5860483, 10033044, 8120710, 4861366, -2618856, 1087164, -3905736, 350040, --1342714, -8640400, 11034845, 17511118, 6982543, -4763656, 7853348, 7477001, -290984, 4655208, --8235600, -15877420, -10565620, -7210177, 4620848, -1894081, -8291435, 6247030, -2835752, -7399692, --70867, 12926241, 6519224, 9589588, 3369939, 7072738, 7835631, -1742146, 7180112, -2732673, --8145406, 3501472, -9436043, 3587908, 3802120, -13869523, -9011915, 5769215, 14467060, -7418483, -10095321, 14098767, -11561515, 545998, 12840878, 1452773, -4632659, -1006633, -6518687, -11399380, -186294, -3406983, -5971079, 7961259, 445066, -13052942, 16879758, -6875169, 13701483, -16068010, --10988137, 7969849, -9875204, 5567352, -6621766, -4790499, -9269613, -5630702, -7534447, -18975702, -3201361, 11724724, -5315022, -785979, 8137353, 8692477, 6179384, -1126892, -636192, -4865124, --1486596, -2096481, -2522757, 2120640, -461709, -1741609, 2855080, 2594160, -1132261, -184684, --3354370, 1560147, -2943126, -5400385, -324807, 5166309, 102005, -2793339, -700080, 8493298, -4278861, 355409, -2469606, -2991982, -2173790, 580357, 643171, -2499134, -897111, 167504, -1061394, 3428458, 872415, 5370857, 3253438, 3868692, 1521492, 1773822, 2123861, -642098, -142271, -11761768, 7498476, -4958540, -13073344, 18779208, 9423695, -12867722, 9157407, 8608188, -2337536, 15865609, -32198832, 2532420, 13101798, 4751308, 1100585, 14225469, 466541, 7887708, --18647674, -2285996, 4980552, 455267, -9368934, 3844533, 7400766, 3835406, 3469797, 10118943, -8166881, 13375602, 10271951, -3835406, -4291746, 10402411, -6323803, 7364259, -11588359, -6038724, --14806900, -6495065, 8078297, 3067144, -3459059, 12353400, -14440217, -19204946, -31515396, 9994926, -10815801, 8745090, 6601902, -7194607, 4952634, -4079682, 11834782, 31970126, -4994510, -6467147, --13861470, -4156992, 11838004, -7875897, 6762963, 11931956, 1860795, -34360, -9271761, -2442763, -4321811, -21767968, -20367272, 2268280, 2698850, -7580618, 11101417, 8746701, 16001974, 26216480, -10302016, -5814849, -3217468, 5709086, -196495, -14115410, 6763500, 6237903, 5068599, 1919850, -6627135, -54761, 3646427, 3294240, 2010582, -3047279, 216359, -125091, -500364, 5526549, -1526324, 120259, 2727304, -5494337, 1578937, 1220308, -768799, 5807333, 1064078, -1446867, --1001801, -3277060, 9910637, 853625, 1663226, 4369593, -1512365, -1298691, 5562520, -5888937, -5532992, -4257387, 4580046, -127238, -433792, -890132, 1843615, -747861, 4737349, -3742527, --1651415, 1648731, -912681, -1166621, -3035468, -4446365, 3326452, 47582332, 26924614, 17141752, --4380330, -4859219, -579284, -4064113, -4883915, -7391639, -8882529, -15279346, 688805, -1087701, -3743601, 6651294, 12700755, 19182934, -2550674, -24974162, -9746355, 21420612, -3325915, 8022999, --2761127, -367757, 14289893, 4936528, 10854456, 6369974, -433255, -651224, -187368, 7201050, -9222905, -3580929, -14049912, 18409840, 13211319, 9370008, 3463891, 4770635, -7464653, -13943074, -19210852, 10707890, 4954782, -8913131, -9897215, -13911399, -8551817, -2477659, -8687645, 4814659, --17778480, 2456721, 13138305, -8544301, 4640176, 791348, 1932735, -20308216, 7203197, -8722005, -14821395, -32612760, 5602785, -8524973, -11006391, 2698313, -6639483, 6706592, 6363531, -21246666, -235149, 14852534, 2225330, 4355634, 9346386, 3813394, 15499463, 6322729, 3280818, 1039382, --2245194, 9982578, -19716584, -373662, -1149978, -1808181, 777389, -564788, -149787, -1713692, --2901251, -3789772, 6135898, 5140539, -2697776, -437013, -9443022, 930397, -590558, -9315784, --44560, -13819057, -10504953, 4662724, 1758252, 7281580, -8215736, 3536906, 7153268, 1585917, --309775, 1863479, 3833795, 331786, -2062121, 7586523, 52613, 2474975, -4450660, -3329674, -3150359, 4554276, 801548, -29248190, -15021111, 2158221, -25696790, 5891085, 18658412, -8981313, -22680648, 26597122, 3389266, 13286481, 16411070, 7353521, -15735686, 10268193, 12524125, -619549, -3169686, 8828842, 7815767, 18770618, 3208878, -7240241, 11992086, 4294968, -1858647, 270046, -8041253, -10976326, -4957466, -4646618, 6709813, 3473555, -15472083, 4568235, 12934294, 342524, -15587510, -14741402, -27836756, 2222646, 12497818, 18887118, 17526688, 9040906, 8319352, 6658273, --18913426, -5539434, -787590, 14191646, 22445500, -7758859, 4837744, -8261907, 5311801, 3566970, -13664975, 21153788, -8152385, -9273371, -1839320, 11589432, 14892799, 20848844, 515933, -22537840, --21251498, -3471944, 2753611, 64961, -9740986, 217970, -25624312, -16544214, -15140833, -17241610, -7351911, 2643016, 20651814, 16498580, 6226092, -9874667, -9850507, -9179419, -8329552, -14323716, -6760279, 4483409, 2654827, 9627706, 10713259, 57982, 9140764, 1874216, 9760850, -3397319, -8096550, -2589865, -729071, 2399276, -2969970, 13533442, 6102075, 8033737, 3638374, 9635222, -2162516, 4618164, 13829258, 11984032, 6424734, -775778, -5297842, -4549981, -9775346, -5496485, --6415608, -3837553, -5916318, -7182259, -4146791, 4173635, 9218610, 2552284, -2155537, 332860, --1360431, 5751498, 6811282, 5643050, -594853, 2536178, -10414759, 12358768, -27339078, 2462627, --5461051, 14973330, -8023536, -1259499, 4639102, 11340324, -15260019, -25704842, -4459787, -10079215, -724239, -11605539, 6832219, 6731825, 678068, -13872207, 8660802, 856846, 23163832, -3708168, -12688407, -10711648, 23924042, 6888591, 14933064, 10016937, 16291885, 23941222, -5830955, 9286793, --16748762, 17663590, 17183628, -402116, 5590437, 17298518, -11066520, -10701448, -1756105, 34830576, -5674189, -9742060, 17308718, 2262374, 13278428, 19071266, 5574868, -1291175, 1810329, 2975876, -12600897, -4403952, 13513041, -9316858, 13192529, -7292855, 29753922, -4320737, 25589416, -23192286, --25449292, 35442608, -29653528, -15880105, 1216013, -9557913, -18399104, 16193100, -2139968, -22834730, --10785200, -11728482, -33570000, -12458090, 4165582, 7550016, -25894358, -6619619, 15746961, -3140695, -9055402, 15512348, -11057930, -2529199, 2552284, 10127533, 7297150, 7641821, -2486249, -1462973, -6294812, -543850, -4143033, 3445638, 7256347, 1374390, 5053566, -146029, -4628901, -9664, -6698002, 2520609, -3365644, -8381629, -5032628, 9833864, -4480188, -13207024, 3185255, -7577396, --14344117, 16643, 5463199, 515933, -3679713, -1058173, 4005594, -3005940, 246961, 5182952, --223338, -2396592, -3032784, 9336185, 17965312, 989453, -6230387, -5216775, -2838974, -8434779, --1731409, -3527242, 3536369, -22944790, -15306727, 4464619, -30002494, -17502528, -20847772, -21212306, -25851946, -638340, 891206, 7698729, -7537131, -32988570, -24677808, -24171540, -49287972, 3561065, -5596880, 21298206, 12449500, 7380365, 10628433, 7371238, 2305324, -15557982, -22859964, -13167296, -17767206, -2248416, -13371844, -5399848, 17403208, -21047488, -13581223, -21619792, -10748693, -1848983, --20739860, 7713762, -17222282, 18632106, 13068512, -2895345, 12891881, -12681428, -26067768, 11387032, -15202574, -13458817, -29913910, 22533546, -1945083, 16319802, 13707925, -42788076, -30398704, 284005, --6942278, 27853400, -15981036, -18475876, -4964446, 10270341, 1569274, -2581275, -9707163, 36984500, --18153754, -30131880, -40740988, 29203630, -6984691, -33550674, 15621333, 15902116, 9427990, 33706368, -36063768, 37026376, 15841987, -8418136, -3412889, -5757941, 12287365, -23721642, 15229417, 2893197, -2967823, 11542188, 11164767, -9801652, 14301167, -11253351, 4764730, -15972447, -9111236, -6219113, --8290361, -3318936, -8929774, -2241436, 6101001, 16711718, 19448148, 784905, 15249818, -9169755, -2183991, 8996346, 1180042, -16986596, 2043331, 4119948, -4737886, -12630425, -8107825, -7784628, -20161650, 12549358, 6491306, 9483288, 16997870, -2725157, -20375862, -12802761, -11742441, -14624364, --18944028, 3291019, -15903190, -27742268, -599148, -4926865, -6595459, -5277441, 4193499, -27051852, --10775536, 12608413, 20512226, 41771240, 6848326, 21850646, 10589779, 10550050, -9528922, -3053185, --8123931, -22912576, -26921928, -37798396, -13760001, -34051576, -13387413, -17824652, -6658273, 18300856, -4498978, 12454868, 21521544, 33823, 14540075, 4233227, 741956, -490163, -2840584, -28724204, -10459319, -3581466, -32460826, -20092930, 9483288, -20823612, -7991861, 7591892, 23567560, 28603946, -9950902, -5936182, 3938485, 19152870, 10247255, 4046933, -563178, -56612500, -11417634, 12539694, -14375256, 5747740, -2163053, -19079856, 13244605, -17019344, -12834973, -3338800, 3481071, -9458055, --30238718, 16179679, -3868155, 37638408, 14315126, 12871480, 14464376, 27673012, 62048320, 962610, -1063541, -2592013, -18471580, 11040213, -12814035, 45129368, -4009352, -16170015, -14554034, 19080392, --24467892, -16513076, -3216394, 38604776, 1297617, 18426484, 28516436, 5771899, 23087596, 17511656, --3183645, 16057809, 17401596, 591632, -11876658, -12794171, 3593814, 4419522, 14601815, 9385577, --617402, -2172180, 2602750, 5948530, -10812043, -2249489, -2643016, -1410360, -16963510, 10707353, --12307766, 4322348, -2484639, -7356205, 2068027, 20688858, 18098456, 50466, -1199907, -13140452, --5357972, -13060459, -1933272, -15201500, -21674016, 6379637, 15054934, 1051193, 879395, -7479149, --11350525, 31688806, -4294968, 5756867, -34678640, -11731703, 40614284, -27066348, -7399692, -23437100, --69262256, -9828496, 21223044, 17540110, 3343095, 5050345, -3766686, 38821136, -41842108, -21475, --12064563, -27939300, -23699092, -3506304, 7916162, 6986301, 9330280, 25072946, 16227997, -17723182, --18075906, 49854908, 40691056, -3255585, 4741644, -5448166, 13247290, -177704, 29036126, 10599442, -15424301, 4369056, 2226941, -51511152, 21339546, -2196876, -29708826, -15094663, 2919504, -7977902, --29566018, 28467580, -5041755, -21010444, -4421132, 3129958, 25189984, 28261958, 21449066, 8315057, -25123412, 26897770, -20198694, -22022444, -14120779, -3569118, 26035018, 34873524, 5956046, 12598213, -33385854, 20112258, -31328566, 23190676, 8410620, -6846715, 1227824, 64297808, -42545948, 32794222, -37486476, -37685116, -2213519, -24474334, -7918846, -54159536, 15598247, 24036248, -32646046, 19754702, --28247464, -20349556, 24699820, -15326591, -2277943, -9192841, 1199907, -13516262, 4181688, 6315213, --10285373, -14486388, -1138166, -15738908, 20696374, 3773129, -19433654, 4304631, -3264175, -10506564, --10201084, 6736656, 13197361, 16611860, 6793565, -14847165, 38121056, -6997039, 3799436, -2417530, --20171314, 7759396, 11009612, -10180146, 16265041, 4205310, 12153147, -2779381, -19509888, 6643778, -29405494, -19008988, -27253714, -44530220, 8914741, -8654896, -14027900, -18108656, 9941776, -11056320, --5035313, 29023778, -9028021, -1806571, -22821308, 1699196, 14682346, -32249836, -20189030, -19366544, --9386114, 11491185, -43206836, -24242406, -62382788, 10679436, -591095, -16042777, -6921877, -9405442, -13374528, 19857244, -22145926, 643708, -7716446, -7700877, -38979512, 8383776, 29956860, 7721278, -22663468, 28232968, 25484188, -34398928, -10453414, -10532870, -16012175, 28563144, -29403346, -17162152, -1028108, 41566692, 9433359, -14881525, 42089604, -23888072, -22246856, 49998252, 48077328, 4418985, -12237436, -13890998, -45577656, -14243722, 45886892, -22474490, 41586556, -15232638, -65504692, -17491792, --30641908, 34699576, 303332, 7603703, 31286152, -5219996, 25792890, -33903936, -39712880, 30317100, --7975218, -67115840, 41303088, -21519934, 11260867, 13340705, -23408646, 44161928, -30317638, 15880105, --476741, 11600170, 44941464, -11637214, -14214194, 1539209, -9371082, -12409771, -10169409, 4922033, -10095858, 2317135, -6460168, 5513665, -21422760, 19134080, 13481902, 10713259, 4275103, -2147, --10028749, -11017128, -10433549, 8959839, 17541720, -17318382, 15209553, 35362612, 11895449, -30495878, -2923799, 10985989, -11304891, -20182052, 18871550, -17113834, -403190, -1611687, -18178450, -23511188, --257161, 13186623, -7773891, 30407294, -10256382, -20320028, 14097156, -9087614, 1040456, 11794517, -23278722, 1546188, -41477572, 24374476, 28457380, -34591128, 18947786, -383326, -12322261, -14918569, --49515604, -22099754, 17547088, 2934537, 45647448, -36786932, -20591684, 8350490, -4945655, 28989956, --40511204, -169114, 4241280, -34520800, 34375308, 18591302, 10534481, -16308528, 23552526, -28030568, -15424838, 11725798, 7279433, -2204392, -15487652, 6214818, 31242128, -16640851, -5939940, 5867999, --24403468, 24685862, 1002338, 6289443, -33458332, 17816598, 4452808, 5888937, -78553880, 10522670, --22319334, 36463200, 30423938, 32012002, 16513076, -64174328, -11205033, 13422847, 1376537, 3964792, -45018772, -6994354, -27090506, -32789928, 1316944, -36442260, -31723166, -28398860, 13529684, -53036940, -37473588, 71392024, -18808736, -8905078, -55977384, -12510166, 21430814, 12925704, -18629420, -4131759, --67732704, -24094230, 67977520, 28648506, -21118892, 19597936, -38431368, -28678570, 7476465, 1220845, -4573604, -26318486, -9058086, -5742372, -49929, -38022808, 8094940, -5126581, -11862700, 4745939, -15560667, -20886426, -10358924, -3504693, 7392176, -16108275, -4271882, -2997350, -15016279, -46171, --27772870, 35944580, 11634530, -9756018, -3717831, -10912975, -1559610, 22975390, 6892886, -4551592, -12074764, -7794829, -34581468, 1332514, 1504849, 7031935, 15229417, -9293772, -6581501, 14795625, -18089328, 7510824, -16724066, -37165424, -51835424, 14500346, -23047332, -14730664, 15010374, -11988864, --18591840, 14840186, -24266566, -886374, -27581206, 39594228, 128849, -27958626, -8979166, 1224066, --3421478, 9642738, -19608136, -12635794, 3730179, 8425652, 4032974, 4387309, 14265734, -16603807, --7129646, -38916700, 14110578, 4238059, -12592307, 29050622, 15062987, -11161546, 43116640, 10191421, --27957552, 21219286, 3063386, 13977971, 28302224, -2199560, -7569343, 4974646, 23247584, 13878650, -42413, -1974611, 24914032, -1815697, -29982092, -4673998, 4975183, 23726474, -10796474, 40537512, -43865036, -27735826, 22692996, 50219980, -13892072, 76042936, 42273216, -18558016, -17646410, -28126668, --32674500, -17862232, 9672266, -5275294, -6134824, -634581, -5310190, -52510272, -20875152, -51841864, -11842299, 47150152, -17890150, -2483565, -25829934, 13028783, 2795487, 9368934, 12694850, 39613556, --2297271, 18188650, 17893908, -29139742, 909996, 284542, 6093485, 13252658, -2011655, -6629819, -11928198, -1466195, -7117835, 1899986, -12539694, -2589329, 8675834, 2030983, -5558225, -27880244, -1142998, -12666932, -1362042, -10624138, 23304492, -7585449, 11223823, 14533096, -11527692, 17467096, -10718091, 497679, -6352794, -10463077, 2405182, -910533, -6420439, -776852, 11491722, -8750996, -4866198, -2972654, 8232916, -21994528, 66778688, 17631914, -23911156, 2666101, -31402116, -4121558, -11013370, -13045963, -16690243, -18615462, -7055021, 7150584, -4110821, -5988795, 8481487, 4882841, -11496554, -11882027, -7456600, 8546985, -3082713, 1514513, -17359720, 11759084, -20322174, 9735080, -6700686, -4395362, -919123, 726386, -11803107, 1959579, 2391760, -9422085, 16974248, -9161165, -4096325, 70867, 572841, 8563091, -8401493, -13056701, -3936875, 19605988, -14591615, 9589051, --26737782, -15917686, 5043902, -5808944, -452045, -1799054, -16110959, 17024176, 13596256, 1205812, --11806328, -621160, -7193534, 3471407, -8970039, -324807, -8612483, 6383932, -2405182, 1631014, -21572546, -18327700, -1598802, 3198140, 1283122, -4015258, 477278, -8724152, 458488, -7322383, -4410395, 8475044, -13129715, -10927471, 6230924, 754304, -3142842, -10420128, 4432406, 1321239, --482110, -2423972, 52076, -2450279, 7174743, -4879083, -1378148, 3280281, -2465848, -469762, -5737540, -3953518, -2589865, -1571421, 1183800, 5884642, -2085744, -6815040, 355945, -4423817, -15503758, -6379100, 1860795, 3455301, -4005594, 12306692, -1837172, -10864120, 3802657, -6253473, -7594576, 3652870, -1764695, -770410, -2918430, -3049427, 7495792, -5120138, -2347200, -938450, --6673306, 8371965, -32304596, -47041168, 32691680, 151848576, 66105988, 69747048, -741419, -140010560, --101835824, -52546240, -110857400, 53950696, 65667904, 34561064, 142689008, 64560336, -6498823, 47680044, --92813704, -117711632, -67628552, -82389824, -18107046, 64149096, 65147136, 27655832, 109642464, 54808076, --7933342, 53119620, -48947596, -83262240, -48168060, -62583580, -98865312, 36531920, -1126355, -35172560, -105900472, 64144264, 35721780, 108895672, 26029112, -54998668, 53286584, -78509320, -89974200, -18178450, --94619200, -95583960, 37650220, -15666430, 22939958, 120918360, 82505248, 86261200, 81024024, 10018548, --45732276, -52470540, -88294864, -115444960, -60819960, -32796908, -24109798, 44282188, 68644848, 64775624, -91349656, 82804824, -12934294, -14492830, -15042049, -84778360, -25633976, -41703060, -63255740, 14209362, -25702158, 4279935, 58628452, 26322780, 374199, 36899136, -28492814, -31132070, 703301, -20214800, --6543383, 15431281, -3323768, 17119740, 22646826, -12503724, 17783848, 7350837, -27704150, 2658048, --13289166, -52288544, -887985, -13265543, -22468048, 50538880, 14995341, 18995566, 66194036, 26320634, -19333258, 14615237, -33026688, -48110612, -44724032, -74898864, -61368104, -27285390, 2449742, 33668784, -76915352, 81548008, 74795248, 66334160, 40880036, -16388521, -47108812, -93791888, -118867512, -91750168, --55139864, -19489488, 49873696, 92463664, 106277888, 108948824, 52465708, -13139916, -36048196, -44297756, --57130580, -41292352, -42426224, -34329136, -5100811, 10273025, 16789564, 28822452, 30978526, 28351616, -25851946, 14023605, 3661997, -4414153, -14708116, -22870700, -22622666, -19403588, -13933948, -8004746, -2718178, 8898098, 12319577, 12787191, 12302934, 7923141, 4788889, -47245, -448824, -2206003, --3201898, -4710506, -2464774, -3774203, -4188130, -4038880, -2665027, -5740761, -2375117, 66035, -2941516, 6598144, 9072045, 6065031, 8182987, 5013301, 1560147, -2833605, -6347425, -10062572, --8756901, -8764418, -4068408, -513785, 4300873, 5161477, 7738994, 6389838, 5264020, 1903207, -897111, -2472291, -2388539, -3947612, -3363496, -3054259, -768799, -1487669, 806380, -236760, -1251446, 922881, 920197, -337692, 2000381, 937914, 2284923, 625992, 963146, 33286, -119722, -2251100, -1434519, -2835215, -1533840, -1693828, 87510, -198105, 1779190, 962073, -2161442, 957241, 1504312, -88047, 602906, -891206, -107911, -1233729, -44023, -1045288, -266288, -641024, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ -4847408, -2728378, -4322348, -1034013, -1574642, -177704, 6568079, 336618, -2756832, 3404299, 738734, -314069, 1185948, 685584, 95563, 4875325, 2806761, -3362423, -1244467, -419296, -1131187, -1340567, 2134062, 1371705, -1387274, -2160906, 853625, -4315906, -1908576, 3176128, 319438, -2550137, 1360968, -2124398, 1618666, -9127, -1805497, 4474819, -2981781, -1456531, 613107, -1515050, -2027225, -579821, -2927020, -5905043, 5526549, -1138166, -3023120, 286152, 5083631, --32212, 1989644, -2545842, -1429687, -1072131, 1588601, -2021319, 4073240, 600222, 3679176, --5324149, 2274185, -1411434, 921807, 2208150, -874026, -626528, -3868692, -10201, 2149631, -441845, -1050656, -221728, 1917703, -1032403, -1002875, 2924873, -1313723, 903017, -525597, --215285, -3608846, -1536525, -956704, 1292785, -235149, -1663763, -242666, -369367, -987843, -932008, -1189169, 42413, 311922, 585189, 1026497, -471910, -846645, 889595, 223338, --707596, 157840, 1542967, -177167, -192200, 668941, 15569, 247497, 217433, -448824, --896574, -456340, 637266, -126165, 36507, 366683, -499290, 474594, -30065, -246424, -1692754, 13801877, 4707284, -1073205, 3714073, 208843, 6782827, 4291746, -972273, 3514357, -6088653, 8005819, -4733054, -4596152, 1944547, -1843615, -1561221, 5730023, 4597763, 4415227, -3120831, 609349, -198642, -1976222, 2161442, 1540283, 7258495, 754304, -176094, -3200288, -1496796, 2149094, -432718, -973884, -1156420, 1991254, -307090, -1154809, -2683281, 2844342, --966905, -938450, 3999688, 5719286, -1488743, -680752, 3277597, 2967823, 5204427, 3253975, -1416802, 555661, 4428112, 2534568, -6150393, 24696, 1862405, -3514894, 72478, 595927, --4393215, 2245194, -2143189, 3297461, -726923, -548145, 1744831, 585726, -3037616, -251256, -1655173, -574452, -767189, -857383, 304943, 3508452, 595390, -3496640, -856846, 844498, --1069984, -428960, 5141613, -1027571, 605590, -587337, -1342714, 1185948, 1898376, -479963, -850404, 958851, -979789, 474594, 836445, 219580, -659814, -1794760, -587874, -1072668, --532039, -113280, 551366, -317828, 667867, 398358, -182536, 4761508, -364535, -9010305, --4183298, -1753957, -1941325, -4908074, -4494147, -2833605, 4886062, -5368709, -2496450, -2553895, -988379, 8131984, -1215476, -653372, 1997160, 4650913, -7116761, -1169305, 1460289, -3151969, -2521683, 3974992, -4385699, -278636, 572841, -2561411, -6458557, 1117765, -2716030, 869194, --2500208, 3693135, -4457103, -4174171, -10254234, -2772938, 3535295, -579821, -3930432, -1947231, --489089, -4134443, 214748, -702764, 2842195, 2234994, -1056025, 121333, -1043677, -4364224, -5327370, 919660, 3602941, -1327682, 19327, 928250, 1562831, 4114042, -1314260, -1002875, -1225139, -123480, 4505958, 2397129, -3883187, -1551557, -963683, -6166500, -685047, -589484, -3670587, -2368138, 3345780, 565862, -110059, -350577, -580894, -672699, 719407, -2493766, -1161789, -1441498, 1262184, 1061931, 490700, 299037, 3594351, 2623151, -651224, 3256122, --435939, -1109175, -1029182, 629750, -225486, 2225330, -569620, 1385664, 1141924, -208843, -958851, -11274, 1003949, 973884, 297427, 327491, 1086627, 707596, -1464047, -822486, --145492, 1803349, 2031520, -5906, -204011, 1085016, 19864, -686658, -19837380, -6172942, --1780801, -1571958, -1686848, 7673496, -7086159, 3421478, -1677722, 1578401, -2047089, -1614371, --5711770, 954020, -2102387, 450435, -8277476, 185220, -874026, -1458678, -164283, 1567126, -1219771, -765041, -594853, -3291556, 991064, -2640868, 1716376, 9664, 1461363, 5162551, --1378148, -5890548, -2553895, -6900402, 927176, 1255204, -656056, 1205812, -2443837, 2323577, -1160715, -3053722, 234613, -8300561, -1800665, -5550172, 3011309, 5499169, -4869419, -374199, -1546188, 847182, -7954280, 1326071, 4044786, -3801583, -1840930, -9040906, 3040300, -1305670, -3709241, 6700686, 3790309, -5383742, 1112933, 1273995, 267899, -5987185, 1518808, -2552821, -3959423, -1612223, -220117, 1870458, 1599339, 4711043, 5334350, 3665218, -297427, 1354525, -3168075, 1613297, -3183645, -652298, -2131378, -2119566, 941135, -92879, 493384, 50466, --650688, -178778, 1907502, -636192, -654983, 54224, -568546, -1420560, 1728724, 66572, -808528, 2120103, -284005, 235149, -1688996, 1075352, 721555, 170725, -1697586, 554051, -4832, 1122060, -12294344, 1388348, 2157147, -4355097, -580357, 12023761, 9273908, 5092221, --1376000, -2136209, 5927055, 3780108, 1873143, 2298881, -4847408, 1686312, 427349, 5676336, --5417565, -2418604, -1065689, 750009, -1140314, -6166500, -4248797, -4327717, -5203353, 2900177, -3421478, 2267743, 1494649, 154082, 1458678, -738198, -712965, 435939, -1920924, -494458, -2675765, 2164127, -4263829, -4663261, -484794, -4677220, 2779381, -1389422, -8028905, 1008780, -4009889, 5796059, 3929895, 269509, 3709778, -5648956, -1881733, -2496987, -451508, 448824, -2500745, -1914482, -5271536, 6400575, -5820755, -2712809, 3870839, 9233106, 2112050, 1866163, --9027484, 9750650, 1098438, 6811282, 10349261, -2247342, 1046898, 1265405, -4327717, 8676371, -1952600, -2775623, 2312303, -1154273, 4187056, -7041599, -3851512, -7196218, -1479079, -3162707, -2833605, -1786170, 1162862, -3345780, -945430, -610959, -2258079, -95026, -898185, 943282, --237297, -896574, -583042, -376883, 1633698, 515396, -1388885, -2898566, 1567126, 1690070, -215285, 49929, -135291, -1171989, 433792, -767189, 1700807, 387621, 917512, -974958, --1279363, -2290291, 1267015, 18491982, 13105019, -4699768, -6756521, 10250476, 6760279, 10792716, -15961709, -8057896, 5572183, 2628520, 4679904, 2050847, 2838437, 6559489, 1702955, 6700149, -288837, -4310537, 1873143, -1401233, 2335389, -812823, 12414603, 2072322, 2791192, 1661079, -559420, 4308926, 1907502, 242666, -721555, 3082713, -2314987, 5897527, -4532264, 7103339, --3286724, 4293894, 2324651, 2622615, 2160906, 10435160, 8056285, 496606, -2172180, -5664525, -6262599, -6903086, 1809255, -3019899, 3121904, 6534256, 865436, -10942503, -8800388, 916976, --5444408, -5991480, -3374771, -6907918, 2545842, 11975443, 6091874, -4409858, 360777, 1382443, --3053722, -3528853, -498753, 5881958, 6626061, -6937983, 3375308, 7677791, 1615982, 2527052, -3794067, 5983427, -941672, -4083440, 1680406, -1757715, -258235, -3917547, 3714073, 5657546, -957778, 1014686, 875636, -3964792, -481573, -65498, -347355, 403190, -529355, 654446, -582505, 1940788, 300648, -31675, 277562, 1248762, 2237141, 1118839, 2364380, 1241246, -515933, 670015, -381715, -3689377, -3729105, 783295, 2921115, 727997, -738198, 693100, --390842, 1786706, -1316944, -1303523, -2293513, 1053341, 8210904, 1506460, 11864310, -1090385, --95563, -3973382, -3121368, 3914326, 8987219, -2659659, 2414845, 590021, 9731859, 3958886, --4468377, -4216048, 676994, 1982664, 8846022, 8582955, 13183402, 2340220, 3698504, -2354179, -5398774, 6044630, -2324651, -3063386, 4762045, -3670050, -4994510, 4684736, 1466195, -5873905, --7109782, 10826002, 5488968, -408022, 6972343, 1314260, -4831302, 10281078, -2382096, 276489, --214748, 2641405, -3723737, 2641405, -3730179, 2570538, -3462818, 3125126, -2826089, 4265440, --3572876, -3699041, 9645960, -12071006, 710280, 1395328, -4101694, 772557, -13493714, -6680822, -6497749, -5426155, 4004520, -1470489, 2712272, 1144609, 2329483, 1393180, -6102075, 3268470, --3534221, -440234, -7761543, -4253092, -1920387, -1893007, 2250026, 7314330, 4280472, -5946919, -2312840, 1127429, 80531, -2873333, 431644, -567473, 1469416, 657130, -1476395, -2030983, --759136, -580357, -1115618, 4225711, 812286, -1647657, -890132, 996969, -1720671, 164283, -877247, 39728, 255551, -4502737, -1795296, -1133871, 700080, -1262720, -158914, 2826625, --227633, -767189, -811749, 290447, 898722, -9637907, -8232916, -68183, 3626563, 6692633, --7795366, 2220498, -7001334, 5782100, 4495220, -9711458, -1966558, 1006633, -11308649, -6488085, -6948720, -927713, -452582, 1603097, -676457, -11914776, 10903311, 667867, -7657927, -3777961, -1483374, -1028108, -7359964, -2247879, -4214437, 1198296, -333934, -2388002, 2408403, -10332081, --4543002, 2632815, 13507672, -2281702, -7881802, -5628018, -4373888, 9141838, -9734543, -1981591, --644245, -10467372, -12975633, 3173444, -8983998, -1460826, 1380832, 6832219, 3869229, 535797, -1520418, 8163659, -3503620, -2582886, 12174622, -8135205, 6357626, -2807835, -3000572, -1260036, --1432372, 12934294, 335007, 5015448, -13303124, -9700184, 357556, -1955821, 14936823, 460098, -10195179, 4258460, 12741020, 7689065, -1893007, -8866423, -3293166, 5925981, 2624225, 3995393, --4878009, -5554467, -1501628, -1883880, 2662343, -1386738, -3548180, -668941, -843424, -56371, --413927, 458488, -1435056, -1999844, 2449742, -199716, 176631, -703838, -1054951, -867583, -680752, 2041183, -2150705, 463320, -1313186, -1999307, 1414655, -614717, -1822140, -2177549, --403727, 1990717, 223875, 229781, 775778, 3616899, -3073049, -2595771, -1560684, 264677, -1481227, -16028818, 1590212, -1646046, 10969883, 1185948, -11524471, 13729937, 4494147, -8193187, --17735530, -7493644, 17609902, 785442, -2189360, -3029563, 1848983, 489089, 5455682, 2777233, -5841156, -1353989, 10402411, -5448703, -12185359, 420907, 600222, -3008088, -411780, 4479114, --3106335, -1970853, -1033477, 9667971, 7616588, 3822521, -690953, -13412646, -226560, -802622, --525597, -2320893, -186294, -5933498, -10824391, -1812476, 7493108, 7148973, -2705830, 7688529, --2491618, 3255048, 8601746, 8086887, -18089866, 6095096, 6559489, 2592013, -4393215, -16005732, -9658845, 5568425, 3101503, -5788542, -3148211, -6540162, 3579318, -7243463, -1303523, 2684, -6500970, -4148402, 3317862, 1668058, -11601244, -1727114, -7750806, 12602508, 5917928, -15084999, --3160559, 11724187, 5917391, -6289443, -3067144, -6934762, -2290828, 3411815, -2071785, -949725, --2593087, -3398393, -5685463, 973347, 449898, -1956895, -579821, 2785823, 1963874, -3722126, --1276679, 2508261, -704375, 1887101, -2375117, -1777580, -471373, 399969, 3039763, -3374234, --2314987, 1500554, -3693135, -424665, -2611340, 1437740, -2078764, 3392487, -1267015, -769873, --1838783, 2110440, 1493575, 3880503, 1133871, 9986336, 12135430, 12493523, 9516037, 12251931, --15390478, -10020696, -5324149, -4956929, -7379291, -5608154, -12352863, -4151086, 812286, 7386807, --24696, -7025493, -347355, 7383586, 343061, -6056441, -2873333, 16752520, 1609002, 6322192, -1914482, 6947110, 1395328, 2281702, -10294500, 5775658, 373125, 2414845, -10788421, 3768834, --16563005, 32212, -5246303, 4143033, -1525787, -12052752, -302795, -11995844, 2196339, -9960566, -9123047, -5141076, 14347875, 490163, -272730, 7277285, 1547799, -2231236, -2118493, 2972654, --4912369, 3435974, 8854075, 4578972, -6593849, -3401077, 18983218, 1504312, 15142444, -13986561, --2952253, -1433445, 11017665, -12194486, 1733019, 5927055, -12182138, 8571144, -7649337, 2290828, -11850352, 1343788, 6678674, 3223910, 15485505, 6768869, -6414534, -4987531, -6178848, 1006096, -599148, 6582038, -3862786, -663572, 4258460, 374199, 3287261, 4536023, 630286, -3510599, -4297652, 3365644, -405338, 1413044, 1451699, -1500017, -1271847, -4999342, 3409667, -2350421, --2265595, -912144, -2627983, 2576444, -1785096, -523986, -2815351, -607201, -623844, 3668439, -2570001, -28454, -559420, -121870, 2047089, 2545305, 2171643, 4690105, -511638, -1702418, --4510253, -15489800, 2456721, 14837501, 11341935, 12103755, -3919158, -3267396, 3210488, -2243047, -15291157, 4951561, 7366406, 12644921, -767189, 4667019, -8506183, 12599287, 6510634, -3300146, --7630547, -7347079, 8689793, -14841796, 5924908, 8396124, -5996311, -8322573, -4535486, 7830263, -3127273, -3073586, -5237713, 25770, -8925479, -13743358, 2650532, -13191992, -19387482, -2530810, -916439, 19738596, -8385924, -6820408, 8979166, 14529337, 14766098, 7718593, -732292, 3328063, --6143951, 1070521, -6447283, 16261283, 14548665, 9280351, -511638, -16732656, 47245, -14296336, -15868830, 12168179, 7734699, -11870753, 9904195, 5516349, 6899865, -2249489, -9885941, -7325067, --7881802, 2691334, -11136313, -20672752, 4183835, 13971529, 7531762, 13719199, -4066260, -3808562, -14005351, 4606353, 1991791, 9212168, 3168612, 252329, 8064875, 4989679, -626528, 3621194, -3559991, 2081985, -2523830, -4563940, -5916318, 1610613, 3992709, 2257005, 8129300, 209917, -5823976, -1799054, 2450816, 4536559, 728534, -2064806, -1133335, -6645388, -5611375, 2026688, -1554778, 2675765, 7071664, 1054951, 5401995, -1974074, -1054415, 947040, -4998268, -3983582, --1373853, -4273493, 2155537, -1386738, 1767916, 3933116, 5571110, 7875897, 12444131, 26910654, -11894375, 9415642, 8695698, -16604344, -2662343, -6053220, 21210696, -21572010, -20540144, 5902359, -13826037, -361851, 16920024, 15422691, -789737, 5950677, -10239202, -7323993, 16080894, -6339909, -11031623, 3945464, -7235946, -3729642, -3240016, -3537443, -7547332, 6286759, 6636798, 5615670, -464393, -8362302, -10834055, 13965623, -13780403, 10817949, 935766, -16893716, 8461622, 16136729, --389768, -4360466, -2107755, 1327145, 864899, 11014981, -642635, -8249559, -3512747, 9374840, --17116518, 4133906, -2924336, 13881871, 14562087, 9783399, 11383811, 15090904, 10766409, 3956739, --9865540, -11028402, 5271536, 7370701, -598074, 6387153, 8621073, 22991496, -13033615, 14554570, --8686034, -5490579, 15738908, 2426657, -9507984, -8210367, -8777839, -14155138, -4908074, -6910066, -11276974, 297427, -9134859, 4988068, 3084324, -1915019, 5258114, -10788421, 6996502, 483184, --1075352, -1139777, 5936719, 1059246, 1517197, 6285148, -2666638, 1046898, 4513474, -6897718, -4819490, 304943, 1757715, -3070365, 3831111, -1358283, 397284, 5367099, -39728, -1264331, -1303523, 3628174, 4485557, 7611756, 6124624, 2280628, -3572339, -2896956, -10849624, 2410014, --9045738, -2636573, -3972308, -3676492, 4199941, 1643899, -4349728, -17884244, -3197603, 10413685, --12848932, 411780, -8085813, -14127758, 20549272, 17574470, 14686641, 6967511, 3824669, 5784784, -15084999, 8338142, 15465103, -5726802, 12952548, -9760850, 15687905, 21079162, 13211319, 10537165, -5360119, 10883447, 10958609, -3257733, 21811454, 5238250, -13164075, 6241661, -13327820, -9163313, --2736431, -20721070, 349503, -4419522, -5624797, -10075456, -5245229, -2896419, -653372, -2046552, -892816, 863288, -11899744, -7858180, 2457795, -6284611, 4932770, 20401094, -10294500, -835908, --1945620, 748398, -9760850, 5250598, -4692252, 15789374, 3355980, 9427990, 14766098, 2514167, --986769, -9751186, -21696028, 2855080, 16140487, 11710765, -3060164, -14464913, 12175159, 1272921, -7332583, -18517214, -13290776, -12197707, -18356690, -11374684, -13430900, 6242198, 1982127, 4685273, -6123013, 8460012, -4146791, 8610873, 9804337, 295816, 5270462, -3161633, -6513318, -6717866, --7051263, -2836289, -5141076, -328028, 1549410, -693637, 464930, 1292785, -5965173, -5530308, --9444096, -3250753, -2190433, -5268315, 2077154, 769336, -2789581, -8556649, -3929358, -3167002, --2202781, 7113540, 2180233, -3126199, -3937948, -1449552, -10248866, 2784750, -2085207, 5284958, -609885, -3240016, -6039798, 6295885, -4139812, 9009768, -30701500, -19654844, -9352291, 21930640, -15969225, -11892764, 13681618, 12348031, 10527502, 10308995, -10309532, 1038308, 5938329, -10254771, --30947924, -5662378, -8601746, -18981072, 1693828, -6489159, -4876399, 5778342, 3424700, -4242354, -883153, 14472966, 15475841, -28539520, 6747394, 1423782, 13156559, 4461398, 682363, -17789218, -5381057, -4587025, -4975720, -12247636, -9129490, 22808424, -10421201, -449898, 2668785, -6080063, -25210384, 11955578, -11310796, -6848862, -19837380, -2898566, 18830748, 5501316, 5645735, -6253473, -11470784, -2769180, -5060545, 10580652, -6376953, 17574470, -4225174, 13079249, -26850524, -9117679, -15244986, 3716757, -2554969, 4259534, -29707752, -14057428, 4401268, -11871826, 4421669, 1147830, -3182571, 18107582, -6907918, 7273527, -1552631, -14816027, -2683281, 11119670, 16057272, -575526, --6910066, -12570832, 212064, -17528298, -5823439, 1453846, 20411832, 18281528, 2357937, 7645579, -2156074, -3133716, 10030359, 7631083, -4199405, 8381092, 6217502, 3318936, -7244536, -562104, --3840238, 6095096, 4132296, 5413270, -634581, -8449274, 7708393, 286152, -4088272, -8232379, --583042, -736587, -7896298, 5322538, -5797669, -8979166, 9846749, -4100620, -3608846, -4579509, -2030983, 1349694, 7841000, 1689533, -1591822, 3256122, 4763656, -9100499, 2259153, 2474975, --3701188, 5568425, -13370770, -38436736, -3257196, -4641249, -4161823, 5878737, -15334644, 30113626, --5499169, 1320703, 33229088, -39130372, -4067871, -7676717, -3728569, -44818520, 2499134, -6965900, --8659728, 15152645, -15379204, 2319282, 2937221, 7199976, -1408212, -16369194, 11169599, -10769094, -23280334, -4058744, -26388280, -1999844, -886911, -13375602, -26585848, 11883101, 13543106, -22324704, -18185966, -20197620, -15653545, -9700721, 1763621, 1549946, 3006477, 12786118, -2430952, -12331925, --28983514, 5836861, -39183524, -20908974, -13464186, -31493922, -18590766, -9140227, -1913945, -14833206, -22468584, 23010824, 5151277, -7052337, 25527138, 11411191, -2889439, -5846524, 18389440, 13449153, --6240051, 24193014, -20359756, -10549513, 26591754, 12395812, 37288908, -20441360, -22858352, 5832566, --17370996, 18662170, 2062658, 6436546, 35458176, -19607062, -20866024, -7788387, 7416335, 7998303, -8980240, 8986682, 10324565, -10970957, 4385162, 1602023, -699543, -1323924, -7224672, -5881958, -10413148, -11235634, -476205, 2209761, -5314485, 1346472, -5449777, -447750, -502511, 2278480, --8852464, 4525822, 11281268, 3266323, 2799245, 12308303, 9186935, -905164, -11800423, 10880763, -2885144, -4164508, -8764955, 11297375, 1812476, 317291, 7020124, 8749385, -11190537, 5836861, -3802657, -8138426, -3234110, -12627741, 8066486, -1536525, -14253923, -7118909, 3527779, 29916594, -16939888, -2763812, 40373228, -4658966, 16525960, -19099720, 23525146, 22255984, -2118493, -17865454, -1790465, 6454262, -10075993, 10555419, -14660334, -242666, -4578972, -4786204, -16650514, -12108587, --7636452, -1021129, -5469104, -13008382, 19192598, 13236552, 3467649, -5407364, 3175055, 18575734, -8634495, 13647795, 8476118, -10179072, -15855946, 31769336, -4285841, -17381196, -7368017, -7471096, --4280472, 22989886, 860604, -17735530, -6900939, -44074956, -10983305, -5173825, 27018028, 18740552, --53691388, -23076322, -13164075, -279710, 2552821, -21389474, 15606837, 8412230, 13563507, 26854284, --35273492, 34366716, 24542516, -11177116, -23737748, 1495186, -6030134, 9143449, 31148714, -16221555, --18292266, 25511032, -30205968, -33647312, -13702019, 3437048, -9794136, -36872296, -15070503, -11926050, -401043, 2015413, -10722386, -748935, 1414655, 438624, 2962454, -23309862, -8370892, -7725573, -1313723, 6507413, -1919850, -7457674, -4532264, 2472291, 11695733, 12703976, -1969779, -11044508, --3075734, 16164109, 752693, -4217121, 3161096, -21951040, -6675453, -10360535, 1232656, 3784403, --21505438, -21700860, 5184026, 18857590, -8332237, 12338367, 3580929, -6088653, -2005213, 5002027, -3552475, -1794760, 3526168, -632971, 28068148, 3775276, 10559177, -21904870, -34579320, 49984828, -25046638, 2274722, 3297998, -11239393, -29407104, 10333154, -2265595, 25245280, 5671505, 9377524, -27699854, 15315853, -279173, -2936684, 4713190, -16852914, -13835163, -17918604, -9968619, 16623134, --4502200, 1068910, 20812874, -3547643, 9160628, -28822452, -25859998, -17561048, 15039902, 6118181, --898722, 6885907, -9108015, -25912612, 32813014, -31081068, 14404247, 14813879, 11719355, 5223754, -19903952, -12765180, -31738734, 23548768, 66781908, -11733851, 32350768, -38788388, -20854214, 24015846, -14133664, -36010616, -10060961, -3018288, 31381178, -7759396, -3293703, -48974440, -31392990, -11236171, --35878548, 30100742, 32163936, 50610284, -44697724, 19278498, 5721970, -24899000, -1321239, -1167694, --51644296, 36929740, -15251966, 17441862, -5189394, 2883534, 70182448, -18914500, 24434606, 16068010, --16836808, 30540976, 92342, -5873905, 2002529, 7885560, 19870130, 12083354, 7992934, -687732, -18822694, -17503602, -8477192, 1480153, 4823785, 8674223, -4643934, 15089831, 2187749, 6706055, --2782602, 11432666, -803159, -16752520, 9793062, -20580410, -11992086, -4787278, 8987756, -2201708, -10700374, 24064702, 37354940, 26823682, 7563975, 17251274, -9786083, 8768176, -447750, -768799, --1395328, 3582003, -7514582, 10538776, -10030896, -44479220, -25451976, -774705, -6907918, -14810121, -5273146, 14535780, 1343251, -15662135, -943282, -15008226, 40893996, -12462384, 794569, 31255550, --1894081, -31774168, -22350472, -21674016, -9809168, -11474542, 34046744, 3684008, 5495948, 17182016, --9513889, -9403831, -5887327, -9590125, -20993800, -4762582, 39050916, 12783970, 9175661, -25910464, -9470403, 2175938, -18690088, -2031520, -9433359, 42661372, -33772940, -28905130, -10368051, 5435818, --10154913, 1426466, 11349988, -22011170, -6077916, 36153960, -29159606, 5225902, -7402376, -17522930, --30917322, -23404350, 1017370, -42753716, -51969640, 12426951, 10499584, 8444443, -46448996, 35894116, -43343736, -14642080, -12703440, 2824478, -1926293, -9686762, -24185498, 17548700, 65471944, 17133162, --16317118, 423054, 10303627, 21982716, 5816997, -38712688, -34720516, 37596532, -7285875, -15250892, --22715008, 7877507, 42765528, 13217225, -13653701, 7988639, -1761474, -7551090, -3844533, -2214056, -18876382, 10563472, -6537477, -10419591, 8499740, 5049808, -1676648, -4275640, 6862284, -10084583, -6229313, 16497506, -1583232, -9038222, -2799245, -5803038, -10011569, -18358838, 2628520, 14092325, --9449465, -11570105, 5689758, -14454712, 46708, -23540716, 11285027, 14723148, 37531036, -11932493, --5134634, -15531139, -15964393, 4523138, 8271570, 15637439, -1877438, -3370476, -15736760, 6341519, -3897683, 4731980, -4646618, -982474, 9900973, 11458973, -14221710, -37426344, 10340134, 14659797, --55488292, 30403536, 1290638, -15786152, 5302137, 20260434, -28684476, 17723720, -26636850, 7205345, --1557999, -13402445, -7469485, -3618510, -19615116, 14056354, 12276627, -558883, 6765111, 865436, -10858214, 14191646, 13704704, 20348482, 17464410, -10805064, 2710661, -22185654, 23516556, -18188650, -5749888, -3502009, 4785668, 1156420, -16820166, 15290084, -8531953, -16244640, 34068756, -27269284, -8178155, -7863012, -13565117, 13755170, -3561602, 4081830, 21223044, -25671020, 1026497, -31454192, --61982820, -1581622, 19732690, -7444252, 79639432, 16215649, -31143344, 8749385, -43444132, 15079093, -31051002, 36697276, -12637941, -7243999, -48299056, -55346024, -4677757, -34506840, 8151848, -2183454, --30138860, -7057705, -14936823, -32971390, 26984206, 53130892, -14940044, 3741990, 11436424, -14103599, -16412681, 20941724, -14585172, 2424509, 20938, -26468272, 13182865, 2221035, 8000451, 9668508, --18728742, 7306276, -9953587, -15015743, -17027934, 14433238, -10581189, 5925981, -16463147, -5941014, --1157494, -20051054, 19586662, -12716324, 3887482, 5974300, -18708878, -3058554, 14354854, -1719598, -2012192, 3188476, -5492727, 8827232, 18541910, -2240362, 10754598, 12703976, -15914464, -30154428, -10158671, 4199941, 17368310, 20832738, -27278948, -26776974, 4653597, -7870528, 4741644, 9076340, -4943508, -39546448, 8159364, -2888366, -23034984, 10358387, -14954539, -10118943, -18592376, 9470940, --20248624, 25924422, -2752537, 9588514, -5976447, 34825744, -9465034, 19117974, -311922, 22795538, --6367826, -11540040, 7449084, -13058311, -13779329, 1852205, 25956634, 16672526, -17676474, 18856518, --13260175, -20321638, 5719286, 27742804, -10687489, -11338714, 14843944, 6640557, -13841069, 1525787, -18882824, -7901129, -18187576, 9878425, 7563438, 11585137, 21260624, 4436701, -12855374, -4248797, -46719044, 49070000, -13590350, -40687836, 31162672, -13623636, 8775155, 4394826, 52605832, 7207492, --27340152, -10009958, -6644852, 1454920, 8119636, 12677133, 17078400, -20345260, 6501507, 4596689, -30485140, -7635915, 21470004, 23105850, 12776454, 11008001, 6637872, 18395882, -17683990, 19797652, -25190520, 18174154, 3047279, -35755604, -5367636, -23066658, 1042603, 15457587, 5173825, -7895224, --12584254, -7367480, -2032593, -927176, 6521371, -7420630, 1977833, -787053, -5639292, 10869488, -4206921, -9774272, -4642860, -2521683, 13258027, -22012, 2684892, -12816719, -9204652, -16997334, --8036958, -1051730, -1660005, 215822, -3009698, -15235323, 3875134, -5215164, -2545305, 2247342, --4301410, -227633, -13244069, -3153580, 500901, 194884, 227633, -3376381, -3379603, -1166084, --5284421, -7432978, 55439436, 23372138, -25103546, 6090801, -26223996, -14164265, -1843078, 9511205, --4227859, 20367808, -24256902, -715649, 9503152, -777926, 9884867, -1408212, 3437585, 2359011, --17396766, -5414343, 4512937, -16155519, -16352551, 1405528, 4151086, -11479911, 8196945, 7994008, --4897874, -8105677, -1343788, 1796907, -2893197, 6872485, 1714766, 5419712, -7189776, -3000035, -12649216, 40265, 613643, 6161131, -4137127, 6813429, -6514929, -11993159, -7846905, 12444668, --9904195, -7223598, 733903, -9751186, -10598906, 15133317, -15064061, 23905252, 5204427, -10557566, -10426033, 1687385, -17727478, 1575179, -3196530, -3075734, 8376797, -244276, -10412611, 20339354, --12210592, -4702989, 10492605, 3406446, -4450123, 548682, 3230889, -311922, -876710, -2075006, -4650913, 8464844, -345745, -14053670, 10059350, -7236483, -1108638, 12071006, -814433, -3662533, --513249, -10386305, 5016522, 3626563, -1178969, 253403, 4227322, -10113574, 718333, -3451006, -1001264, 4215511, 1054951, -4286914, 9917616, -15090904, 1957431, 1807644, -1097364, 1892470, --2248416, -8512088, 9386651, -4347581, 6698002, 133144, -1125281, 8888435, 3285650, -7402913, -2776160, -3722663, -3259880, 1722819, 5586679, 5735392, -2270427, -7308424, 3721052, -4150549, -5055714, -33692408, -40260488, 33934536, 138030048, 53842784, 63384592, 744103, -129016520, -95211368, --49600968, -75897440, 34105260, 65138012, 27015882, 115242024, 65383896, -4460324, 27218282, -58446452, --117563992, -47079284, -81627464, -13187697, 56721484, 47576428, 43279848, 71779104, 44463112, 12072616, -19850802, -5484137, -83632680, -37132140, -30062086, -115817552, 21548924, 15032922, -51282984, 83194056, -82553032, -2950643, 104424616, 51164336, -48380124, 32235340, -48099340, -100430296, -7873749, -60723860, --87679608, 15362024, 9467719, -5390184, 81905560, 78754128, 47201152, 70086888, 42762840, -27472222, --30714384, -54899884, -93744640, -69385736, -32965484, -31121870, 16892644, 52811456, 36272608, 58036284, -87954488, 34027416, -11503533, -11170136, -60749628, -49274548, 4553202, -56537876, -25542170, 30397094, -7582765, 38094212, 30831422, -15880642, 10304163, -3355443, -20959440, 4452808, -9340480, -9687836, -19468550, 6544457, 8259222, 25673704, -14840723, -5976447, 14081587, -19501300, -15810848, 7119982, --46176804, -7902740, 15870978, -37455872, 18251464, 23038204, 2499134, 58191440, 55586540, 12547210, -22572738, -16465831, -49649284, -25152940, -66085052, -75278432, -42556684, -18362596, 14221710, 71278200, -82874616, 86561304, 77101640, 43761960, -9618579, -48790292, -76794016, -107399952, -91669096, -50736448, --13107703, 42878268, 77457048, 77020040, 69096896, 44627396, -8495445, -14242112, -22263500, -33864208, --23936390, -21363168, -24946244, -13806172, -7085086, -6381248, 4862977, 14090714, 19130322, 24723442, -23032298, 17706540, 7861938, 628139, -9373766, -14001057, -18262200, -19474456, -19316616, -8223789, -614717, 6662568, 6604586, 9985262, 10718091, 11385421, 8237748, 2327336, -1110249, -702227, --4121558, -3486440, -3197603, -6143951, -7156490, -1592359, -2497524, -1760937, -1137630, -843424, -2638721, 7115150, 5375152, 5545340, 5408438, 3035468, 875636, -1122597, -5516349, -6068252, --6627672, -4920959, -2943663, -189515, 726923, 3082176, 4450123, 4684199, 2326799, 1520955, -382789, 314606, -493384, -860604, -1682017, -575526, -962610, -799938, -1381906, -1335735, --1725503, -949188, -1247151, 622233, 1688996, 3003793, 2822331, 2683818, 1402844, 962073, --914828, -1541356, -2136209, -2368138, -2803540, -1040993, -769336, 215822, 470836, 1174137, -947040, 1707786, 819265, 982474, 197032, 193810, -653909, -222801, -752693, -134755, --380641, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ -547608, -3428458, -4665408, -3816615, -642635, 3676492, 5444408, -2568927, 3183645, -1767379, -4513474, --1250909, -2518462, 1476932, -612033, -2196876, 2015950, 3032784, 693100, 3668439, -6729677, --7293928, -4668630, 667867, -6979, -1255204, 362925, 2213519, -717260, 2992519, 2491618, --3192235, 1222455, -248034, 3899830, 3576097, 1364189, -3820374, 2509335, -2279554, 1281511, -2490007, -6076305, 6642167, 9780714, 1269163, 4438312, -3607236, -715649, -3386582, -1743757, -3016678, -1000191, -3502009, -914828, -2208687, 1694902, -2153926, -1938104, 186294, 1797444, --1787780, -1996086, -879931, 3482682, 3115999, -2629594, -981400, -3109556, 708670, 4134980, -1136556, -1498407, -1979980, 1562831, -563714, -2797634, -1035624, -1884954, -282931, -1005022, -1620276, 1538672, 810138, -890669, -1255741, 2792266, -387084, 769336, 1431835, -401579, --49392, -563178, 837519, 125628, 202400, -799938, 104153, -244276, -819265, 53687, --136365, 614180, 1452236, -799401, 329102, -143345, 700617, 887448, -223875, -344671, --195958, -29528, -794032, -312459, 337155, -283468, 134755, -1074, 637803, 157840, -72478, 15035070, 6910603, -514859, 3140158, 2863670, -3610994, -1760937, 4161823, 1902134, -4530117, -3291019, 6590091, 2484639, -6516539, 5173288, 268435, -110595, -3442953, 3787088, --7044820, -6032282, -1301375, -2140504, -1176821, -2150168, 806917, -1302449, -2934537, -2108292, -2439542, -2665027, 1700807, 1087701, 675921, -2942590, 4130148, -8657043, -1534914, -40265, --1530082, -1081795, 734439, 1624571, -2792266, 2217277, -3380676, 3229816, 1006633, 711891, -3309809, -2338610, -579284, 1353452, 5186173, 1293859, 2166811, -1192927, -4529580, -6298570, -1143535, 3428458, 4452271, -1826435, -7065758, 1053878, -2899103, -1961190, -1648194, 1959579, -189515, 6897718, -222265, 2325188, 1334661, -1038845, -1811939, -1917703, -7218767, -2110977, --1195075, -974958, -1395864, 1344325, 3590593, 1012002, 3405372, -33823, -340913, -1089848, -923955, 1251983, -361314, -1391033, 1196685, -714038, 460635, -605054, 614180, -1029718, --655519, 981937, 300648, 556198, -390305, 344134, -676994, 8123931, 1855963, -6810208, --7783018, 2151242, -2389076, -6400038, 7269232, -3557307, -1216550, -972273, 5695127, 1226750, --3338263, 4035659, -3134789, 6087580, -8407935, -5510980, 6653978, -6947647, -7059853, -2804614, -5682779, 2520072, 2706903, -652298, 5088463, 3114388, -559420, -6738804, 1797444, -1863479, -2400350, 2157147, 1809255, 5875516, 1539746, -5764920, 498753, 4031901, 5873368, 2000918, --3268470, -755914, -4805532, 2048163, -8498130, -323196, 9105868, 497142, 944893, -4682051, --5839545, 896574, 1231045, 6728603, -1500017, 583579, 671089, -989990, 653909, 2238752, -362925, 4733054, -1320703, 3144453, 427886, 851477, 530965, 5550709, 193810, -772020, -987306, -1182190, -3790846, -1997160, -3907347, -88047, 6946573, 1466195, -2326262, -784368, --4027606, 2268280, -3162707, -2192581, 717796, 116501, 193274, -1800665, -2589865, -527207, -589484, -857383, 1420024, -163746, -45634, 1430224, 852014, 1440425, 1147830, -17180, -429497, -1171452, 20938, -1039919, -1160178, 781147, 891743, 1650878, 1154273, -803696, --251792, 871878, -689342, -1266479, 667331, 177704, 9664, 161061, -18677202, -12108587, --2736968, 2077154, 2938831, 365609, -83215, -7059853, -498216, -1500017, -1248762, 204011, --1868848, -772557, -5318244, 2775086, -11124502, -4000225, 932545, -2177549, -3441880, -1894081, --6356015, -3150359, -2676302, -2946885, 1332514, -4833986, -2741800, 6080600, 3876745, 448824, -2840047, 2171643, -2039573, -4007741, 2340757, 9058086, 961536, 1170379, -3616899, -3138547, -2589865, -7684770, -4173098, 8600135, -7889318, 2404108, -1928977, -3907347, 1745904, 616328, --2240899, 547071, 1249836, -2669859, -39192, -496606, 5216238, 4725001, 626528, 1302449, -2224256, -114890, -1096827, -1782411, -10932302, 5301601, 3213173, -2918967, -187368, -4507032, --1307281, 687195, -3395709, 1549410, -4105452, -2203855, -4768488, -6926172, 4510253, -1284732, -132607, -5847598, -1544041, 802622, 902480, -1510755, -346282, -283468, -1700270, -3006477, -411243, -1523640, 1235877, -201327, -845572, -586263, -396748, 1531693, 180926, -2216740, -348966, -639413, -266825, 765041, 258235, -548682, 452582, -1733019, 869731, -1572495, --583042, -2055142, -16143708, 2534568, 3719442, -957778, -1463510, -8850854, -3696893, 2500208, --8004746, -7565048, 1508070, -7192997, -3781719, -126702, -4424890, 2529736, -3496640, 5499706, --2915746, -1825361, 1673964, 3864934, 6995965, 4459787, -7885560, -365072, -622233, 3928821, -5761162, 9916543, -4417911, -3812320, 5071283, -5322002, 1214402, 1607928, 8293045, 3114925, -4614943, -6133750, -2770791, -8397198, 6663642, 7072201, 8027831, -63888, -1759863, -5334887, --1158031, 5480379, -2536715, -3413425, -3227131, -4174171, 894427, 1061394, 1251446, -5735392, --96100, -5617817, -324270, -785442, 2299955, 2066416, -1758252, -2513630, -7215008, -355945, --588411, 4503810, -2791729, 7441568, -4213363, 985158, 3412889, 6767795, -5188858, 1617055, -3508988, -5956583, 3015067, 66572, 7416872, 2541547, 1661616, 4627828, -459562, 1316944, -3511136, 1487132, 43487, -1227824, 64961, 1547799, -470299, 1947768, 2882997, 2420751, --1075889, 1374390, 195958, -709207, 1164473, 1583769, 15569, 763967, 1857037, 1423245, -1502702, 782758, -701153, -1124208, 1440425, -1211718, 1436130, -668941, 130460, 1844152, -1376537, -348966, 1018981, 20033874, 16944182, -488553, 383326, 9005473, 1087164, 4474282, --2786897, 4999879, -3879429, 9090298, 2945274, 139586, 1706713, 751619, 11224897, 7788923, --7562901, -6069863, 2289755, 1325534, -2507187, -1489817, 1316408, 5567352, 3918084, 2609730, -461172, 2998424, -2017024, -24159, 6130529, -6743636, 2636036, 8475044, 6141803, 11476689, --1238561, -1601486, -1110786, 841277, -3744675, 12461311, 11187316, 8204998, -3881577, -1000727, -4688494, 4042638, -3572339, 894964, 6352257, -2295123, -3149822, 4241817, -12111808, -1270237, -543850, 1887638, -4178466, -7716983, 3082176, 5485747, -6496675, -2252174, -7054484, 2707440, -368830, -1337346, -1609539, -5929203, 10019622, -2547989, 1245541, -10191421, -2566243, -4804458, -11937862, -2009508, -1773285, 5486821, 2364916, 83215, -3964792, 3684545, -2648384, -3477850, -5472862, 5320928, -194884, 3365644, 1611, -1371168, 2849711, -349503, 1041530, -850404, --1424855, -221728, 2192044, -1603097, -1422708, 32212, -1864553, 731755, -1692217, -805306, -35433, -182536, 2178622, 175557, 558883, 1566053, 1357210, 490700, 647466, 1310502, -2942590, 680215, 2767570, 585726, 1314260, 2194192, 13122736, -518080, 8298414, 11312944, --5966784, -13950054, 599685, 10597832, -8193187, 7439957, -2200097, -10096394, -4640712, 10156524, --9910637, -8769786, 6402186, -10139881, 3395709, 4828617, 3995393, -2880313, 6158983, 1725503, -1174674, 3944391, -6451578, 8818105, 4365298, 3826816, -1797981, -988379, 16469589, -5762236, -1045825, 4276714, 8301098, -11250667, -9233106, -8628052, 359167, 634581, -550293, 5231270, -1656247, 9340480, 3788161, 5473399, -851477, 731218, -4589173, 8348880, -3751117, 8236137, --4461934, -7103339, 12283606, 9953050, -14059039, -12435004, -8143795, -6391985, 4468914, 704912, --2820720, 6486475, 7183870, -8578123, 5086315, -690953, -17143898, -5671505, -8626979, -7853348, -3011309, -2669859, 5679021, -1293859, 885300, 10282689, 10504953, -964757, 2791729, -904091, -1668058, 1487669, -3500935, 2955474, 900333, -125091, 8872866, 2664490, -22012, 274878, --1535451, 2621004, -246424, 1730335, -1868311, -91805, -1972464, 551903, 2342905, 740345, -37581, -259846, 2055679, 1312649, -1225676, 192737, -10201, 322659, 1067299, 470836, --794569, -963683, 330176, 597537, -71941, -7409893, -10473815, 6300717, -6036040, -4371740, --3761318, -12099997, -1306744, 5452998, -3313567, -696858, -4463008, 10037875, 1516124, 6407018, -4836133, -8022999, 8251169, 12431246, -3824669, -5026723, 1307818, -2116345, 5327370, -15292231, -5848672, 13313325, -1788317, -4308389, -3806952, 5811091, 11869679, -2784213, 2981244, -5268851, -8125542, -9780177, -3782793, 1946694, -1555315, -7580618, 14006962, 9927280, 7388955, -3085934, --10587094, -1263794, -15031849, 2631204, -1109712, -442382, -330712, -2226941, 8120710, 6928319, --10447508, 5868536, -6262063, 8665097, -807991, -1712618, -732292, -9102109, -1761474, -8301098, --18473728, -802622, 2145336, 1493038, -7101192, -205085, -2041720, -13753022, 265751, 12009265, --7580081, 3169686, 3894999, -1483911, 836982, -3509525, -2109903, 2845953, 3395709, 3789772, --966368, -2370822, -930397, -2550674, 2101313, 1070521, -2189360, -596464, -2014340, -2148021, --301721, -1927904, -2988224, 1863479, -632434, -2249489, 1794223, -1566589, 1477469, 2306934, -948651, 2217814, 1536525, 4295, 1451699, 4971425, 2370285, -2429878, -1701344, -2794413, --2147, -3624416, 1919850, -186831, 2813741, -723165, 2190970, -351650, -1566053, 4692789, -2236067, -19389092, 1363115, 11301670, 6173479, -8837432, -7182259, 14168023, 3275450, 3180960, --2792803, 3662533, -144955, -9483288, -2471217, -9960029, 4708358, -5936182, -906775, -9705552, --10737418, -14440217, 9030169, 6089727, -4632122, -5153424, 4053912, -13262322, -1212255, 991064, -3199214, 5818070, 2842195, 364535, -4590247, 1920387, -4215511, 3489124, -4044249, 2301566, -1222992, -4207994, -5457830, -10397579, -6858526, 2617783, -17732846, -4843650, 9721122, 5164698, --2144263, 23131620, -3357054, 10708964, 10598369, -16881368, 1093069, -2254858, -14253923, -7467338, --7847979, 233539, 1661616, 15978352, -2580739, 1521492, 10834055, 8024610, -1898376, 10779831, --5127117, -3980898, -7221988, -9587978, -13942001, -5312875, 7943542, -15195057, -7748121, 11710228, -8545374, -5132486, 10714870, -4792647, -746787, -496069, 5152350, -3373160, 5134634, -3231963, -4392141, -1290101, 1812476, -2082522, 3553549, 3394635, 1475321, -617938, 4011500, -2612414, --2945811, 3120831, -881542, 3407520, 2492692, 1683627, 2305861, 1392643, 653909, -5864778, --1084479, -68183, 1630477, -1569274, -2474975, -2076617, -5603322, 2114198, -117038, 3525631, -1994476, 3431679, 2618320, 723165, 1057636, 13383655, -2374043, 4353486, -6565395, 3896609, -5534602, -3355980, 4725538, -7326141, -8162049, 12418898, 6686727, 8040716, 9808095, 15032, --8165270, 10733123, -9398999, -12497818, 128312, 11840688, -1743757, -10145250, 1343788, 13923210, --2050310, 3865471, 1290638, 19506668, 1177358, 4219269, 9544491, -1165010, -5019206, -9262634, -1264868, -1239098, -9006546, 344134, -5327907, 3622805, 13134010, 181999, -8004746, -2309082, --7426536, -3876745, -1200443, -3065533, 1732482, -9786620, 10506027, -5532455, 17784386, -4453881, --13012140, 785442, 577136, 6372121, 2649458, 3467112, -13346611, -10735271, 7734699, -11181947, --15682536, 4525285, 3049964, -3512747, 16842714, -13711146, -19108846, 7167227, -13065827, 1286880, -1742146, 409096, -12567611, -7581154, -16329466, 5615670, -1692754, -862752, -2568391, -7212324, --3315178, -5463736, -2771865, -2100776, 6156299, -4720169, 4714801, 1769527, 4869419, 856309, -581431, -6611566, -2479270, 1832877, -2194192, -7220377, 1373316, -1148367, -2885144, -2525441, -2251100, -2887829, 3058554, -1644973, 3725347, -704912, 1869385, -3760781, -3770445, -103079, -221728, -1329292, 5652177, -4977330, -4816806, -3115462, 2708514, 3019899, -3917010, 2921115, -807991, -10356777, 5744519, 595390, 14147085, 14857366, 21424908, 9796820, 4553202, 2993055, -7072201, -7259032, 8176007, -12885439, 6300180, -1241782, -1078574, -24719684, -9557376, -4036733, -8443369, -1031866, 2062121, 2709051, 2262911, -12619151, 13103945, -466541, 5346161, 464393, -12232604, -13092671, 9141838, -6420439, -293132, 9926206, -11214696, -4989142, -12222403, -4840965, --13612362, 12451110, 9149354, 16716013, -797253, 3980898, -15173583, 3494493, -15730855, 15342160, -4354023, -2454037, 14521821, 14828375, 7584912, -8781598, -13137231, -18922016, -816581, -6677064, --9529996, 10322417, -2806761, 23988466, -17719962, -6436009, 13720273, -14250165, -5654325, 3327526, -277025, -2048163, -13687524, 6296422, 2357937, -7425462, 6813966, 14474040, -12382928, 13972065, -17381196, -5160940, -9161165, 7183870, -7023882, 6640557, 4253628, -7228967, -5626407, -1404991, --2229088, 10213969, 3465502, -1690607, -4908074, -8042327, -4536023, 2596308, -5134634, 2514167, -4937065, 3183645, -3440269, 2700461, -2808372, 3924526, 2562485, 4374424, 2662880, 245350, --4522064, 3030100, 4591320, -4554813, 227633, 1637456, 1736777, 3977677, 401043, -458488, -4374961, 5370857, 1085016, -2376191, -4107063, -48855, 3733937, 4537633, 3105798, 22315040, --5108864, 3167539, -1207423, -7323456, 9985799, -3636764, 3693135, 1224603, 14313515, -4481799, -16694538, 307090, 8309151, 7412040, -1321239, -5384279, -16268799, 7755637, 16933982, 922344, --112743, 11786464, 9972377, -686658, 1845762, 20195474, 12636331, -3614752, 4398584, 13292924, --3331284, -14641007, 361851, -10619307, -1668058, -6716255, 636729, -20263118, -6048925, -7355669, -359704, 4293357, 4292283, 19796578, 21845814, 11558831, -15082851, -8860518, 12288438, 17263084, -3661460, -15669651, -2561948, -3671660, -16372415, -10299868, -12389907, 15228880, -5645735, 2137820, --15406048, 22512608, 16600049, -1802813, 6881612, 37332928, -1853278, -7577396, -14294725, -803696, -9940165, 7909183, -5731097, 11302743, 22340272, -9488120, 14264660, -6411850, 4698158, -8884140, --4818417, -7654706, -10076530, -5131412, 6670621, 46708, -2179159, 1689533, 2796561, 12104828, --1286880, 1274532, -94489, -5484673, -554588, -1911797, 1163399, 4944044, -3102577, -1416266, --3855270, -1775432, 1418413, 1560147, -1360431, -7866233, -7365332, -2463701, -9081708, -7900593, --1396938, 7165616, 6327024, 5496485, 1272921, -1169842, 381715, 3102040, 2583960, -898185, -1799591, 1331977, 11480448, 1174674, -6896107, 6821482, 2638721, -9543417, -16157130, 20975546, --13175886, 15832323, -11581379, -17215302, 788663, 21728776, 13895830, -15985331, -10769630, 3750043, -3142842, 7380902, -1318018, 14507326, 7652021, 19102404, -7001334, -3144990, -726386, -3643206, --18414136, -13489419, -4292820, 19207630, 3935264, 1552631, 595390, -17806934, -20381768, -15665356, -8066486, 9326521, -7004555, -4538170, 1724429, 2253784, -10892574, 3174518, 20156282, 3595425, -12607876, 12494597, 8892730, 21741124, 31085362, 10277320, 491774, 4535486, 12246562, -6446209, --3505230, 8323647, -2851858, 4476430, -2922725, 13499082, 4723927, 9577240, -2688113, -3525631, -6790880, 18020072, -1347546, -14677514, 9390946, -22999550, -26776436, -9104257, 13798656, -8879308, --26477400, -16117402, -6759742, 9706626, 6564858, -14251238, 25636660, -8200167, -18017924, 4747013, -6999186, -5869073, 8896488, -9235790, -3674345, 3372623, 2392834, -4835060, 4518306, 896038, -8083129, -4445291, -9696962, -5602785, 1605781, -2110440, -1967632, -741956, 62277, -754841, -6566468, -1106491, 1088774, -2641942, 3029563, 5447093, 1061394, 5221607, 1621887, -8075613, --3569118, 46171, -6983617, -8251169, 3990562, 5818607, -4516695, -8805220, -9672803, 3970697, -1636919, -420907, 6283001, -3624953, 2302639, 8591545, -37467148, 2164664, 18742164, -3341485, --4600447, 23095650, -12475269, -12576738, -16376710, -5242545, -5648956, -10672994, 3027415, 5384279, -8669928, 6371047, -5363341, -3973919, -2010045, -4470524, 1354525, 4433480, 18501646, -7903814, --24395414, 13045963, -88047, -615254, -20326470, 9071508, 3714073, -1993939, 22738094, -6478422, -2295123, -2041183, 9913321, 12281996, -13623099, -1242856, -7734699, -801011, 6652905, -5005248, -10296110, -16313896, -13889924, -8587250, -14827838, -2477659, 1112397, 2327872, -20657182, -13375065, -9509058, 16542603, -8050380, -9164923, 8442295, -18651432, -17183090, -16362215, 17807472, -30393872, -9652402, -1600949, -18195628, -5692979, 14921253, 38732016, -5429913, -10658498, 12508555, 29700772, -10410464, -6674916, -7450695, -1342714, 7868380, -543313, 3531000, 17679160, 897111, -6598144, --12747463, 10358387, -14993731, -10040560, -7605850, 5204964, -6351183, -10668162, -7035694, -6492917, --379568, -7873212, 2410551, -6104223, -840740, -2004676, 7192997, -5674726, -4757750, -11623255, --3772055, -2075543, -4227322, 11020886, -8454643, -10453414, -991064, -9176734, -8705362, -3846680, -912144, 8253854, -1416802, -3554086, -1931125, -5493263, 3526705, -11065983, -1296543, 11403138, -5089536, 7455527, -3230352, 2816962, 3312494, -2763275, -4690105, -6252399, 1868848, 2938295, -4656819, 5179194, -2184528, -21028696, -33427194, -1998770, 38429756, -6198712, -2700998, -25429428, --1868848, -1751273, 2690797, 8338679, 1204738, 6923488, 551366, -473520, -18028126, 2517925, -16505559, -11166915, 20459614, -8658654, -1206349, -18148384, 11647414, -9070434, -5794985, -20933134, --28236188, 14397267, -13748727, -13658533, 5032628, 2845416, -6024229, 1331977, 16098074, -4814122, --15215995, -9556839, -19502910, -2460480, 5681705, 13495861, 2866354, -4053376, -3266860, -8173323, -4791573, 14022531, 2428267, -8876624, 16121160, -15404974, 1749125, -26502096, -7680476, -5242008, -32704028, -20662550, 6774237, -6752763, 4400194, -3856344, -3518115, 571768, 13380971, 3962107, --23924042, 26390426, 8212515, 9390409, 3551938, -10593000, -7917236, -3069828, 3482682, -634581, -5424007, -14347338, -14756434, -2473901, 7405598, 16031502, -9808632, 13594645, -3207267, 5279589, --10624675, 6109591, -17408576, 19617264, 1008780, 2164127, 6597070, 8838506, 1009854, -12279311, --5767604, 3288871, -11480984, 3141232, 5616207, 4901632, -6766721, -4306779, 11924440, 2143726, --11801496, -1730872, 10362682, -3853123, -14551886, 16647293, -4372277, 6433324, -2658048, -4781373, --7683160, 5120138, 1569274, 5328981, 962073, 8947491, 1218160, 6437082, -2962991, 445603, -4185983, -2266669, -3377992, -16360604, -9920301, 35788888, -4542465, 3236258, -18604188, 16852378, --9686762, 12483859, -9773198, 21734682, 2054068, 2473364, -10510859, -8245264, 12426414, 28088550, --11644730, -16649978, 7927436, -6376416, 18278308, 23459648, 11375758, -3179887, 14289356, -9218074, --8890045, 19761144, 26759794, -29674466, 2436320, 4780836, 5061082, -9836549, -719407, 12416750, --30313342, 9419400, 17701170, 6978248, -13487271, -3412889, 21740588, 18127984, 5920076, -9918690, --13368086, -25907780, 37416680, 7095286, 19240916, -2476586, -7961259, 4514548, 11205033, 678068, --594316, -30154966, 4732517, 29080150, -5124970, 27881318, -16516834, -7094212, -11511586, 6757058, -25936234, -7833484, -730681, 23778550, 28651726, -9006010, -20900384, -18329846, -16247324, -7241315, --6846715, 16809966, -20138564, 11325292, 12452721, -4243428, 1459752, 13250511, -2462090, -7097434, -7805030, 5829881, 4182225, 12213276, 2654290, -1789928, 10801843, 4171487, 4596689, 5782637, --1801739, 972273, -2400350, 4980552, -19723564, -5177046, 888521, -3544422, 7760469, -14542222, --1625108, 484794, 5327370, -56371, 8434242, 6128382, -3937948, 12173011, 6120329, -3836480, -8635569, 9580461, 155693, -5703717, 4588099, 9334038, 5556077, -1053341, -8651138, -3945464, -2354179, 1671816, 1472637, -8082055, 14144401, 10433549, 24978992, -7530152, 18096844, -9542344, --3810173, 16859358, -550293, 22972706, -27645094, 17391396, 3191161, 7762080, -11092827, 8461086, -20685100, 40215388, -9190693, 10275709, -507880, -26552024, 24481314, 2561411, 9612137, -4774930, --12399034, -4536023, -947040, -10233833, -6419366, 34188476, 2465848, 13217762, -9667435, 24273008, -223875, 11839077, 5046050, -14008573, -2916283, -8589398, 361851, 4498442, 28666222, 14672145, -1313723, 3528853, -900869, -2229625, 4796942, 2995203, 18006114, 14712410, 7452842, -8358543, -12545063, 26276074, -24547886, 23052164, 3799436, 7042673, -24664924, -11615202, -31022548, -24977382, --4835597, 16925392, 14111652, -43020540, -191663, -19313394, 10358387, 43272332, 21760988, -27563490, -15283641, -11241540, -14179835, 23920284, 12125230, -12041478, -6681896, 21074330, 17242146, 9531606, -26718454, -6999723, 16437377, 14533096, -16834662, 23920820, 6642704, 27737972, 8523363, -2382096, -16356309, -1509681, 4359392, -19185618, 14696841, -9262634, 7714298, -6842420, 3481071, 9163313, -22091164, 5936719, 13482976, 3556770, 4401805, -7031399, -1489817, -2397666, 1936493, 11200201, -9556839, 16750372, 6272263, -1814087, 2797098, -3704409, -2032593, -16464757, -2646237, 4325032, -5423470, 14474040, 12906377, 11731166, 13532368, -35762044, -56166360, -14093935, -6754910, -13314935, -2611877, 19226958, -20106352, 28782186, 9895605, -40417788, -31819802, -5850819, 21879638, 1239098, -1410360, -3841848, -13406204, -39110508, 1175210, -32789390, -27972586, 13929116, 10268730, 10199474, --5091147, -12451647, 29531122, 18396956, -13146895, -25478820, 19360638, 10435697, 4241280, -11756399, --30758408, 11973295, -14654428, 4988068, -26250840, 31854162, 383863, -12152073, 2675765, 8340827, -25530896, 16632798, -7016903, -865973, 8703214, 9409200, 9619653, -5471252, -40896140, -31450972, -6094022, -3960497, 23379118, -4124242, -10521596, -28174986, 32889786, 13174812, -23480050, -23464480, -33760052, 32370094, -649614, 23860154, -3438658, 1231582, -9986873, -5463736, -18600966, 23012972, --4464082, -4702453, -10063645, 9739912, -29078540, 14016626, -8699456, -4993437, 20205136, -24159, -2986076, 5563594, 18541910, 10029286, -7897371, 14367202, -4384625, 17258790, 6432788, -18479096, -4487167, -9172976, 8770860, -7359964, 537, -12125230, -6640020, 7342784, -12612708, 5732171, -4085051, 5880347, -11275900, -7499550, -14455249, -12071542, 16535087, -5552856, 10632728, 7246684, --10348187, -967441, -9055939, 843961, -5778342, 21584896, 17689896, 12546673, 16529182, -3581466, --18530100, -20622286, -3092913, 6910066, 30692910, 19304268, -7136625, -5214091, -8308614, -14775761, --955093, 7501698, 10664941, 7296613, 3417720, 19219442, 2226404, -14074608, -35051764, 55455008, -1720134, -43441984, -2949032, -16364362, 7611219, 21095268, 19757386, -24302536, -38190312, 6273874, --18111340, 5570573, -3434363, 16676821, -5252208, 2127620, 10410464, -16032576, -18967112, 1738925, -5389110, 16512539, -59056, -27194660, 18019536, -15298674, 14232985, -13334800, -8546448, -1763621, --3937411, -29211146, 5764920, 7785165, -27624156, 11533061, -10653130, 5308580, -8993125, 26720066, -21369610, -27526982, -14118094, 18313204, 23650238, -28159416, 37135360, 2099165, 29969208, 21238614, -35305168, -11100880, -14492293, 7565048, -28663538, 4146254, 4014721, 50655920, -15443629, -48166984, -81187768, -38475928, -29027000, 46323908, 21405580, -27473296, 45641544, 4759898, -36528160, 45593224, -5896990, 3828427, -7657927, 6461242, 30800822, -7724499, -10253161, -16125455, 23027468, -8534100, --5450314, -3464428, -8790724, -10052371, -13857175, 13326747, -1677722, -1552631, -4800163, -3788698, -2066416, -6420976, -10329933, 1075352, -8295730, -16297790, -16321949, 20421496, -8666170, 1638530, -19447612, -9485972, -8435853, 1059783, 9807021, 3792993, 4359392, 18098992, -11035382, 2371359, --8053064, -5510980, -3373160, 30123826, 15403900, -5231270, 4631586, -16406775, 5470178, -15039365, --8859981, 6846178, -3606162, -30733712, 19065360, 7385733, -5363878, -386547, -15346992, -2378875, -513785, -50184544, 6932614, 15055471, -37681896, 17246442, 9946607, -13197898, -3782793, -654446, --9256191, -3024731, -5435818, -16786880, 442382, -8373039, -1879585, -4122632, 8145943, 29993904, -25074020, -23145042, -2594697, 31559956, -5570573, -5929739, -32329292, 3728032, 10552735, -5285494, -27463094, 65950296, -22240414, -27804544, 46902652, -3144990, -25379498, 29291140, 19229642, -15213848, --22811108, -28128814, 8504035, 15063524, -12594992, 44227424, 28794534, -55212340, -53039088, 30852360, --25007984, -32309428, 41790568, 6709276, 55968256, 26870926, -6890738, -7577396, -40542344, -31581968, -91973504, 25376814, -19856708, -44604308, 1134945, -18206904, -39904540, -6259915, 46504832, 19768660, -475668, 38308424, 33425046, -10704132, -42849816, 6549825, 25485800, -10687489, -10123775, 53393960, -30613454, 5225365, -5757404, -27593018, -27100170, -7059316, 25317222, 10160282, -10493679, -5013301, --12125230, 9901510, -7854959, -10426033, -6806987, -1403381, 7486128, 10160282, 8967355, 3686156, --24635932, -8696772, -4964982, 9076340, -9687299, 1529545, -2707977, 22329534, -14695767, -10267656, -23051090, 6310381, -11938935, 18124762, -6571300, 5162014, 1258962, 3976603, -14217415, -3991098, -18920942, 18522584, 7580081, -7640210, 4807142, -8747238, -7072201, -5471789, 9824201, -15921981, --3515431, 12217034, 49428632, 42068668, -11613055, 30040612, 2559801, -22433688, 14198088, 25730612, -7941932, 11409581, -33535642, -6231998, 3384434, 7181186, -5354751, -28244242, -10841571, 10853919, --7488813, -2565706, -24805584, 37810208, 4182225, -30315490, 16953310, 44301512, -23107998, -12705587, -5920076, 14924474, -14628122, -27131308, 23177792, 40321152, -3688303, -15217069, 4682051, 11739219, -17661442, 25987774, 1183800, 46933792, -1539209, -51327544, -96637, -5388037, 16384763, -4980015, --42777876, -732292, -18765248, -17395154, 24866786, 13776644, 13961865, 18663244, -38401840, -19383188, --7170985, -74088, 14778446, 966905, -8268349, 1498407, -13497472, -25390772, 1975148, 40592808, --21180094, 4257923, -16581258, -11055246, 26925686, -33349884, -920197, 15275051, -12496207, 5974300, -3662533, 8837969, 9180493, -17413944, -21935472, 36384816, -8041253, -11238319, 17952964, -18030272, -10986526, 2736968, -8167954, 6086506, 14975477, -2536715, 1509681, -7250442, 3143916, 1389959, --1639067, -6430640, 7890929, 4670240, -1473711, -313533, 6506339, 6341519, -7272454, -11550241, -5900212, -313533, 2681133, 1101659, -3760781, 6574521, -494458, 5523328, -2658048, -567473, --4162360, 1374926, 5082557, -891206, 13702556, -5449777, -5087926, 1059246, -7004555, 4403415, -8941048, -43456480, -61774516, -55067924, 110521320, 105046312, 105297568, 296404288, 105611096, -12462384, -19736986, -205365472, -249640672, -84194240, -139990704, -194542160, 25186226, -11039140, -32314798, 213711664, -130798936, 54295904, 334333664, 157492160, 29353954, 152088544, -35952096, -182061520, -173921472, -166131488, --229686800, -225322032, -52682604, -81506128, -132346200, 154469040, 71421008, -55996172, 223621760, 71910640, --26088706, 252391072, 230351440, 52754548, 239036400, 242117504, -9156333, 59913184, 27577448, -233574288, --270684416, -201976736, -381123040, -361348480, -216721904, -289900096, -217735520, 24393804, 179225760, 202946864, -436866880, 396795936, 350273920, 376967136, 278385824, 140979616, 43250856, -30924302, -212477936, -256613024, --274256736, -309524864, -293268416, -250400896, -161514928, -117741696, -114722336, 21585968, 69672424, 136331392, -325111296, 337201632, 230875968, 288127872, 122037200, -40197136, -95472288, -148344944, -202755744, -147261008, --98185640, -98156112, -33674692, -9592273, 839666, 51626580, 66114044, 62568008, 96487512, 60329260, -39298412, 48235704, -28786482, -27060978, 8172249, -78685952, -55397560, -20859582, -75618264, -47160352, --5304285, -76572288, -80418968, -53872312, -78929152, -52296060, 59260348, 110400520, 176386256, 259783776, -242857312, 207364240, 195342096, 105098920, -32502702, -163337600, -288167616, -342635296, -308623456, -250413232, --188777232, -89234392, 27912992, 110945448, 156483376, 168397616, 149017648, 132417600, 123573192, 124018256, -86437824, 40044128, 18291192, -12176769, -36501316, -33727304, -59032176, -64124936, -45552424, -35300336, --45694692, -44913548, -56786448, -65630320, -64938832, -56726316, -46354508, -15621333, 23014046, 52843132, -70893800, 90907280, 89882928, 74788264, 53563076, 32307280, 12123619, 9306120, 1151588, -12102144, --22018686, -24888798, -32581622, -36738076, -40644348, -44139916, -46322296, -31825170, -17904108, -5712307, --137439, 6755447, 12523051, 22112640, 22662932, 15803869, 7158637, 11808476, 17511656, 18367964, -17174500, 16449725, 14377403, 16482474, 14841796, 7766912, -1653562, -6953552, -18049600, -22174380, --23832774, -24934970, -28201292, -24932822, -25971668, -23615878, -14461692, -2006287, 9957345, 26101590, -36421860, 42974368, 40807560, 31504658, 14549739, -217433, -12787191, -17411260, -20653960, -17745194, --14516453, -9337259, -6227166, -3047816, -2709588, -244813, 470836, 2520609, 2251637, 3777961, -2629057, 3165928, 1622961, 1675574, -47245, 306553, -886911, 117038, -667867, 397284, --485331, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --3626026, -13776108, 7361037, 6051609, 3442416, -1507534, -387084, -1458141, -2828773, -4032438, -2775086, --4118874, -1673964, 3842922, 1374926, -241592, 47782, 2507187, 1237488, -1647657, -1679332, --1341640, -7150584, 2951180, 811212, 35433, -1429687, 901943, 185220, -2024540, 1098438, -2605435, 49392, -3321084, -776852, -1452236, -1469416, 376347, 3233037, -849330, 812823, --3794604, 2483028, -4680441, 3031710, 631360, 242129, 11274, 3017752, -3597035, -2584497, --4892505, 1360968, 853088, 309238, 2757906, -2933463, 628139, -340376, 60130, -2119030, -1910187, 952946, -1632625, 3074123, -4804995, 2266669, -2629594, 4952098, 2206003, 932545, -333397, -900869, -5987722, 4624606, -1447404, -74088, 767725, 1345935, 1072668, 1278827, -1427540, -358630, 407485, -588947, 1394791, -27380, 789737, -1735167, 607201, -207232, -385473, 801548, 1937030, -32749, -340376, 736050, 762357, -709743, 999117, -1110786, -976568, 288837, 869194, 147103, 560493, -229781, 219043, 844498, 374736, -46708, -578747, -45634, 388158, 420370, -50466, 548682, -155693, 13286481, 6214281, 8701604, -2284386, 3011846, -578747, 3453691, 277025, 3078418, -2288144, 5927055, -1560684, -6602439, --1908576, 216359, 290984, -2042794, 5048197, 362388, 1926293, 5030481, 2348273, 135828, --81604, 1258962, -4591857, -2909304, 1721208, 2233920, -1717987, 550293, 2135136, -4401805, -6245420, -569620, 857920, -923955, 2273648, 3338263, 90731, -3347390, -3568044, 6933688, -80531, -1925219, -362925, 4027069, 2846490, -1961726, -2824478, -5968394, -1950452, -2401961, -178778, -2161979, 467078, -5796595, -2473901, 759672, -2467459, 1370632, 2296734, -1112933, --230854, 1190780, -1565516, 2391760, -242666, 2988760, -36507, -922881, -3452080, 461172, --4264903, 1397475, 4832, 2452963, -28454, 2516851, 3069828, 2755759, 31139, -1658931, --203474, -556198, 3396782, -855235, 374199, 2297271, 2249489, -81604, 1238024, 548682, -1125281, -408559, 1377611, -467078, 2064269, 569620, 339302, -94489, 122407, 298500, -1003949, 2779381, -8902393, -2887829, -2025614, 1540283, 1760400, -6102075, -2729989, -1217623, -1462436, 3228742, 1019518, 4430259, -3665218, -5308043, 1534377, 169651, -951872, -3639448, -11770895, -623844, 3131031, 693100, 366146, -274878, -1814624, -4485557, -3514357, -1110249, -3007014, -2510409, 6162741, -2097555, -576063, -5062156, -6013491, -528818, -3835943, -2143189, -8197482, -4492536, -1243393, -4362076, 1593433, 196495, -1579474, -4583267, -872415, 26844, --5191005, 600759, -2794950, 4140885, 2728915, -2401424, -1273458, -1332514, 1271310, -237834, -3296924, -1716913, -2167885, -2236604, 7475391, 6740951, -2318209, -6514392, 881005, 2000918, --209380, 1900523, -2702071, 520765, -3133716, 2225330, 170188, 7168838, 4426501, 6815040, --6215892, 2680597, 4159139, 149250, 3156264, 2263448, 469762, 4685273, -864362, -509491, -1202054, 642098, -1929514, 1862942, -1478543, -1276142, -133681, 467615, -211527, 701690, --1104880, 540092, -141734, 136365, 607738, 854162, 411780, 991601, 938450, -725850, --946503, 734439, 274341, -1698660, -690416, 1348620, -828392, -29341606, -4699231, -8488466, --9533217, 2529736, -3198140, -8375186, -6860137, 1109712, -6758668, 919660, 10182294, -2566780, -4393752, 3252901, 8591545, 2176475, -5915781, 1320166, 9333501, -4384088, 4665945, -6903086, --6211060, 2004676, 2704756, 7259569, 467078, -4524748, 4278861, -3049964, 3292093, -420907, -4646618, -3951370, -2498597, -4402342, 92879, 750546, -1672353, 3307662, -7658464, 949188, -7794292, 1640141, -2166274, 2947958, -3933653, -2051921, -9680856, -2918430, -289910, 1480153, -197032, 5179194, -7767449, 717796, -1039382, 3889093, 2131915, -1548336, 5587753, -4913980, --625992, -3951370, -7465190, -3197066, -1695438, -2158758, 5665062, -5086852, -8069170, 279710, -2680597, -850940, -2308545, 2745558, 3122978, -2304787, -1800128, -3187403, -1272921, 6478422, --3000572, 3554622, -1050656, -152471, -574452, -257698, -3352222, 788663, -1997160, -135828, --214748, -525597, 104153, -816581, -1034013, -1076426, -261456, 290984, -629750, 1043677, -504122, -14596446, 8338142, 9349607, -484258, 5240397, 2416993, 11050414, 14737107, 1875827, -1953673, 4208531, 1857573, 2434710, -2060511, 2901251, -2393371, 3856881, 4533875, -12610024, -6564858, -1389959, -2301566, -3906273, -5068599, 2052994, 3617436, 5731097, 1156957, 970126, --7321846, 315680, -2109903, -2464238, -1051193, 978179, 464393, -569083, 7274601, -382252, --2360085, 2384781, -2770254, 3702799, 4930086, 5463199, 2883534, 595390, -3001109, 6103686, -1983201, 818728, 682900, 801011, 484794, -3536369, -4933844, 4517769, -4595615, 4328254, -3997004, 2901251, -596464, -3279745, 3003256, 3846680, 8578123, 3939559, 3265249, 1999844, --8303783, -2567317, 1069447, -1363652, 3636227, -7230041, 406948, 2390149, -6722161, -635655, -2312840, -1638530, 910533, -3964255, 1539746, 510564, -1649268, 3120831, 1878511, 125628, -3464428, -1548336, -1464584, -342524, 754841, 1400159, 5230734, 848793, 1815697, 1225139, --1074, 1134945, -808528, -982474, -1347009, 916976, -718870, -661425, 631897, 553514, --586800, 1762010, -981400, 1233193, 1181653, -513785, 1752884, 493921, 775242, 853625, -163746, 186294, 2029909, -139586, 27090506, 8092256, 2059437, 5229123, 13574244, 5388037, -16355772, 3934190, -3532074, -1225676, -1304060, -1611687, 4484483, 6928319, -3182034, 1445257, -4932233, -1864016, -6708202, 5327907, -572841, 2505577, -2241973, -3451006, 5602785, 1240172, --442919, -1626182, -6103686, -3100967, 3408057, 789737, -2055679, -1130113, 1002338, 2276333, -6274947, 1916092, -5652714, -1357747, 438624, -1840930, 2127083, 2900714, -5695664, -7001871, --334471, 1705102, -668404, 5339718, -9852118, -2144263, -4430259, -5620502, -542240, -467078, -1537061, 5280663, 18790, 767189, 1788854, -890669, 7158637, 4491999, -5746130, -5133560, -3956739, 8556649, -670552, -4044786, 8540006, 4450660, 2034741, -3749507, -3966939, 4160213, -288300, 3141769, -1845225, -6172942, -3318399, -4207994, -2581275, 2407866, -3358665, 452045, -1537598, -1253057, 1493575, 1015223, 1282585, 695248, -2147484, 1215476, -630286, -1184337, --468688, 1641214, 1366337, 206695, -1835562, 1682554, -684510, 2915746, -390305, 392990, --2721936, -3597572, 1262720, -3386045, -589484, -528281, -1843615, -923418, 477278, -3036542, --1199907, -312459, 400506, -636192, 2199023, 300111, -745714, 13365938, 6340983, 12045773, --4131222, 198642, -3139621, 12135430, -12481712, -1656784, 3069291, -2270427, -2552821, 4130685, --1492501, -3714610, 10457172, 6069326, 1115081, 17941690, -4975720, -1085016, -3877282, 238371, -2845416, -4502200, -693100, -2287070, 6707665, -5653251, 1431835, 504122, -1909650, 725313, -3901441, 2833068, -5516886, -9342628, 122407, 2049773, 7722351, 9285719, 9037685, 939524, --5368709, 6681359, -16047608, -2516851, -6364068, -9174050, 6393059, -2026688, -3106335, 5171678, --1938104, -2609193, 13816373, 276489, -4206921, 4958003, 273267, 3800509, 2617246, 1927904, -8331163, -4941897, -3201898, 609349, -7339026, 56908, 1269163, -1721208, 2382633, 4284230, -8764418, -3227668, 2856153, 7774965, 4549444, 2388002, 1345399, -2518462, -5697811, 2984466, -4170413, -810675, 327491, -763967, -815507, -3064996, 524523, -853625, 446677, -2852932, --1600412, 134755, -622770, 2883534, 1098975, 137976, -3935264, -1611150, 1802276, -2109366, --142271, 1606318, 1401770, -2459406, 2306398, 2010045, 515396, 2614561, 2133525, -4307316, --895501, -1575716, 1101122, 2537789, 2825552, -477815, -1739462, 517544, -994285, -20691004, --31077846, -5250061, 1542967, -550293, 861141, -1467268, -6233072, -3526168, -4969814, -1352378, -5051419, 6012954, -5476620, -8090645, 6899865, 1411434, -4437238, 340376, -741419, -4944581, --4135517, 11442867, 5829345, -6189048, 3125663, 1271847, 4897874, -6007586, 6649146, -6680285, -4566087, 2960843, -1418413, -3134253, 2944200, -12435004, -6168110, 7563975, 12222940, 6755984, --8578660, 164283, -6088116, 8098161, 1666447, 2070711, 561030, -6746857, 3237869, 9912248, -1105417, 7481833, 5309117, 3401614, 5735929, 12164421, -3410204, -12342662, 5938329, -15032, --2935073, 574989, 10544145, -4370666, -7370701, 3548717, -1971390, -1307281, -2807835, -1708860, --3333968, -5806259, -2918430, 7026030, -9688909, -6121939, -3593814, -7000260, -6781754, -467078, -4159676, -6426882, -149250, -2419140, -2721399, -5799280, -3659849, -6650757, -388695, -5129802, --429497, -192737, 4590783, 3224984, -2385854, -2576981, -3403762, -1083942, -2420214, -2340220, -2765422, -4552129, 1654636, 325344, -2897492, 248571, -1911261, 1021129, -1009854, -3732864, --4534412, -102542, 1136556, 1802813, -896038, 729608, 1374926, -61740, -2390686, -380105, --3049964, 251792, 1348620, 1030255, 1279363, -11861089, -7886634, 2116345, 1819456, 16039555, --14032732, -9439264, -5478231, -2538326, -1823751, 5253282, 4887136, -7282654, 7488276, -1660542, -3343632, -5217849, 11209865, -2101313, -4354023, 7404524, 5175973, 4348118, -7783018, -7136625, -9474698, -4915053, 2729989, 2435247, -3560528, 8229158, 2382633, 86973, 1716376, 6065568, -7572028, 2456185, -6903086, 1679869, -9812390, 5895917, 2447058, -10792179, 7631083, 1889249, --5747740, 10063108, 3085397, -2608656, 5730560, -811212, 10926934, -2426120, -2840047, -2243047, --1524177, 14415521, 2944200, 335544, 3818226, -11949136, -7598871, -8092256, 818728, 7710003, -937914, 9540733, -12295418, -4939213, -7829189, -7101192, 17755394, -1730335, 6298033, 4654671, --3896072, -811749, -2552821, 1432372, 871342, 4948876, 2901251, 9830106, -5323612, 889058, --1733019, 2197413, -133681, -113817, -95026, -2002529, -9270150, 3502546, 2083596, 1438814, --2509872, -794032, -1246614, -5065914, -391916, -1769527, -3403762, 1938641, -2881923, 1269163, -1581085, 1358820, 2047089, -3510599, -2008971, -2359548, -2263448, 1345399, 2494839, 1560684, --906775, -426276, -696858, -1057099, 3654480, -1223529, 2583960, 1706176, -1069447, 1168231, --794032, 49929, 868120, 1042066, -16153372, 5048734, -6943352, 3936875, -4860293, 13048648, -2188286, -9134859, 1427540, -9313100, 7548942, 14420890, -12305081, 8123394, 2995203, -358630, -5933498, 15370077, -5888400, -14496, 4688494, -16779364, 972273, 7634305, -4676683, 5471789, -5946382, -3061238, 15046881, -7505992, -13633837, -5859409, 1628866, 363998, -2799782, -5873905, -4093641, 3802120, -5906, -9591736, -2263448, -2430415, 6396817, -4201015, 25241522, -3176128, -3602941, -1161789, -1086090, -12253542, 1245004, 9088151, 7339562, 24630564, -2661806, -2384244, --5114769, -971736, -6948184, -525597, 9862856, -5259188, -1036161, 1788317, 2314987, 9709847, -7885560, 2233920, 19050864, -3607773, -17677012, -17680770, -12486007, -2569464, 5560372, -1745904, --4660040, 8409546, -530965, 7466801, -4623533, -878321, 6046240, 5143760, -1891396, -1809792, -598074, 1572495, -1983738, -4132832, -5956583, -2006287, -2544768, -753767, -4254702, 3157338, --1296543, 944356, -2167348, -3049427, 4051228, 1820529, -2108829, -571231, -1734093, -1823751, -1750736, -1139240, -2047089, -4025995, 3144453, 1248762, -1755568, -3052111, -4075924, -767189, --2813204, -2820720, 3383361, -2031520, 646929, 129386, -1505386, 1458141, 634045, -563714, --788127, -905164, 28686086, -20657718, -15741592, -4974109, -9954660, -11293080, 13909252, 5714991, -2774012, -4312684, -2794413, 16980154, -4916127, -7027640, -20225538, -2835215, -486942, 9640054, -3541738, -4011500, 1270774, 8474507, 3815005, 5345087, 12984223, 16372415, 4547834, -5935108, -4231080, -9636833, 6741488, 5614596, -3440269, 465467, -7507603, 3195456, 264141, -14519674, -14355928, -1136556, -6583648, 8975945, -13494787, -2979634, 15003931, 8676908, -108448, 725850, --18707804, 6768869, 10591389, 6167573, 3585224, -847182, -13770202, -40575092, -3146064, 8501888, -11566884, -848793, -11838540, 20340966, -9205189, 9400073, 15375446, 12777528, 2471217, 15417859, -1869921, 5643050, 3362960, 9454297, 1966558, 3164317, 19516332, -6249178, -4063576, 16615618, -8704288, 4691715, -6585796, 1902134, 13496935, -1183264, 10857677, 2719251, 2517925, 6990596, --3415573, -51003, 917512, -419833, -2803003, 5523865, 2646237, -6991133, 4220342, 3018288, -4078072, 2202781, -1862942, 300111, -2086817, -2356327, 3464428, 4417374, 1952600, 2806224, --1920924, -1791001, -1188095, -2272575, -3164317, -4796405, 1017907, -2952253, 2720325, -864362, -1701881, -4389994, -2840047, -646393, -1265942, -1047972, -1870995, 974421, 4855998, 5126044, -2088428, 751082, -2355790, 4140349, 14743549, 13261248, -3218541, -7385733, -966368, -4516158, -16099685, 9822590, -27028766, -3392487, 2595234, -13246753, 5461588, -19145354, 14611479, 3068217, --1857037, 7407745, 4221416, -4326106, -5954972, -4979478, 20483772, 431644, 185757, 4079145, --2385854, 7696045, 24068996, 9297530, -3129421, -4560719, -3151969, 13379360, 5218922, 13553306, -9959492, 6582575, 4338991, -6420439, -6341519, 5850283, -13764296, 2052994, -7160784, -6611566, -799938, 9379135, 1684701, 434329, 3806415, -3408057, 16595754, 20769924, 24477556, -456877, -11343009, -14683419, 5853504, 7972533, -6264747, 11958263, -9525701, -19979114, 2920041, -10626286, --1231045, 598611, -10130217, 2301566, 14587320, -8994735, -8156680, 6874632, 13536126, -903554, --4559108, 11853573, 1389422, 2418067, -8049306, -2029372, -266825, 9739912, -4785668, 522912, --2052458, 1911797, 111132, 1662152, 2849711, 1506460, 317828, 715649, 2489471, 2554432, --1990717, -4816806, -523449, -942208, -3930969, -5412196, -104690, -2624225, 3976603, -3735011, -3088082, 4628901, -62814, -8291971, -594853, 1351841, -2602750, -4023848, 775778, 2022930, -12766790, 3978214, 4076998, -587337, 495532, -1277753, 3864934, -1084479, 4100620, 10338523, -9780714, -1414655, -372052, -1971390, 664109, 3083250, 3913252, 5421323, 1213865, -17067126, -31088048, 1981054, 8065949, 23797876, -8814884, 2441689, -4564477, 6280316, -6886980, 6870874, --16770774, -19845970, -639413, -11753715, -933619, -1095754, -1369021, -3354906, 1232119, -5506148, -4920959, -15784542, -6349573, -21295522, -1119913, 4878009, 10166724, 22986128, 12703440, 3966939, -2888903, 6593312, 5048734, 3868692, 9237401, 9721122, -3140695, -19467476, -19337016, -13242995, --7955890, 1912334, 6448894, -7147900, -11359115, -19758998, 515933, -7566122, 17955648, -8062191, -4470524, -13727252, -6664179, -2435783, -5688148, -26501022, -27628988, 7521025, 2761664, 672699, -14076218, 8022462, 11286637, 9098351, -17238924, -3788161, 32156958, -6021544, -12254615, 4680441, --7157026, 3233574, -19954954, 7996692, -9191230, 1294933, -1376537, 13007845, 705985, 5174362, --11384885, 2074469, -6451041, -2948495, -7833484, -5952825, 3986267, 4469451, -10417443, -3555696, -677531, 1870458, 2501282, 1279900, -4084514, 4436165, 1793686, 1463510, -612033, -382789, -1349157, 4487167, -4996121, 4531191, -1305670, -258235, -1828046, 2838974, -2971044, -1795833, -3994857, -7777649, -233539, 1387811, -4750771, -1720671, -10834592, 7619809, 9050033, -740882, -2074469, 2306398, 3032247, -4923107, 5006858, 3119757, 3890704, -3631395, 2087891, 2921115, -4613869, 18566070, 13973139, 1933272, 14853071, -2698850, -6172405, 8281234, -11466489, -22173842, --33356326, 2891050, 647466, 12973486, 9350144, -12307229, -6405944, -32421098, -2238215, -15044197, -3482145, -7518877, -3690988, -6153615, -2463164, -2429341, -11348914, -4976257, -13217225, 10610717, --2695092, 9096741, 23251342, -12198781, 6653978, -1802813, -5836861, 6113886, -12518756, -21093122, -10127533, 5092758, 10073309, 6445672, -44467408, -20049982, 5867462, -14671608, -1306207, -12518219, -18536006, 22504018, -1150514, 24864102, 3438658, 11358041, -3321084, -703838, -13895830, 8884140, -17840758, 3993783, 29742112, 820876, 4050691, -8631274, -13146358, 17752174, 27911382, 9877351, -5382131, 2873333, 10528039, 1031329, 1976222, -26048976, -19236622, -1869385, 1353452, 3586835, -19634980, 21278878, -3936338, 1508607, -7301445, 4524748, -13588740, 464930, -14376866, -12032888, -6241661, -236223, 1549410, -7949985, 5151277, 6452115, 4235375, 6532109, 7552163, 773631, --4320737, 3440269, -5892695, -1318018, -3641059, -8494908, -2486249, -4647692, -3844533, 7259032, -3938485, -2433099, -5666673, -8414915, -5586679, 5864778, -5666136, -450435, 459562, 4046933, --8039642, -6318971, 2860448, 10097468, 6381248, 2675228, 1074, -5907728, -715112, -3554086, --6944425, 11997991, -17316234, -8686571, -32442572, -40658308, -29970282, -13834627, 9296457, -366683, --7033546, -14920716, 130460, 26661010, 13204877, -23513872, -3754875, -4942971, -16446504, -3054259, -1319629, 11163157, 8395587, -17570174, 12648142, -9971840, 5424544, -9296994, 2879776, -13486197, --4906464, 6524056, -24082418, -4725538, -9021579, 7836705, -5924371, -22442814, 26373246, 25239912, -435939, -10341744, 14407468, -34336652, -10635413, 10096394, -11431055, -7374996, -795643, -11165841, -2281165, -2949569, -22863722, 9750113, -2839510, -7153805, -7766912, -6161131, -1352378, -6383395, --9648107, 18945100, -8984535, -9099962, 9139690, -339839, 31330712, -6351183, -19292994, 10981158, --10037875, -8692477, -15036144, 10385231, 19351512, -37701224, 3027952, 31647466, -5088463, -2063195, --12483859, 21544630, -1456531, -11858942, -1492501, -11139535, -8793946, 15581604, -9345849, -887448, --5156645, -6649146, -10934450, 4558034, 3747896, 5638755, -1244467, -8967355, -6019397, 225486, -1622424, -13607530, -3807489, -8789114, 13507672, -4592394, 1023813, 1814087, 1726577, 1327682, --10868415, 7277285, 430570, -4275640, 9867687, 1417339, 12892418, -2375117, 14886357, 3336653, -6044093, 7159174, -9538585, -6431714, 4746476, -7997766, -6104223, 2242510, 93416, -5652177, --12916040, 6238440, -1804423, -25639344, 51239496, 36588288, -730144, -9760313, 8099235, -30726732, -471373, 38268160, -6787122, -13293461, 580894, 43364136, -6257231, 9520869, -9274445, -19610820, --15913928, -4014721, -7304666, 7984881, 11024644, 594853, -16382616, -22856742, -21086678, -3405372, --4691178, -11348377, 10544682, 8579197, -9264244, -11225971, -12312597, 6867116, 2316598, 8442832, -21591874, -147640, -18580566, 12549358, 4875862, 4224101, 1238561, -368293, -9001178, 16015933, -8130910, -6446209, -7744363, -5108864, -21111374, 5773510, 15322833, 4650913, -14813342, 17202418, -12542915, 7098507, 1828582, -9082782, 4646081, -30010010, 4590783, -1899986, 26644904, -9645423, --13340705, 5636608, -7012071, -601832, -19431506, -3545496, -5291400, 25923886, -16995722, -31537944, --20646444, -40970228, 7909183, -8381629, -2840047, -21896818, -14069776, -36223756, -16156056, -12707734, --2010045, 8806830, -11822434, -2107755, -2358474, -1907502, -3374234, 7686381, -13728326, 5823439, --5497558, -10629507, 1466195, -3119220, 9543417, 4951024, 20938, -5373541, 12363063, 11632382, -6882685, -4614943, -6448357, -6283537, -5919539, 13079249, 21321292, 2439542, 19570556, 21658984, -7036230, 297963, -19663434, -2172180, 3403225, 2758443, -2057826, -5433671, -16702054, -465467, -10810970, 1684164, -12614319, -3231426, -9555765, 48660904, 1969779, 8034273, -8090108, -16030965, --21452824, -7159711, 6118181, 14218489, 11858405, -10372883, -15032, -21548924, -7814693, 7655243, --18065170, -9762461, -6817724, 26239028, 13769128, 14421963, 13722957, -15284715, 2852395, 5481989, -6263136, -1516124, 17790828, -3951907, 7864085, 13713831, 5327907, 3777961, 11683385, 15924665, --9354439, -18816252, 12604655, -2080912, 112206, -19883552, -18414136, 4203699, -9185861, -7230578, -16275779, -16760036, 21508122, 13807783, -9472550, 11254962, -12523588, -12718472, -15295989, 22119082, --15482820, 6941204, 6818798, -25438018, 2462090, 2896956, -19993610, -34592740, -30835718, 22454090, --23164906, -476741, -20824148, -4874251, -14875619, -1311576, 9707163, 5850819, -15140297, 15686294, -18337900, 38159172, 10060961, -25773562, 9125195, -15890842, 8629126, -22679574, 12198244, -9754944, -1770063, -4716948, 9326521, -2872260, -9118216, -21773336, -21553756, 2329483, 2164664, 13618268, --9681930, -1007707, 21450678, 5980205, 14895483, 4424353, -3790846, -1700807, -4999879, -14370424, -5213554, -17321066, -10110353, 3648038, 14384382, -18898930, 10580652, 1910187, 13606456, -4641786, -7654706, 13602698, 15112379, 15069966, -6800007, 7329899, 11865921, 12677670, 2571612, 7553237, -4052839, -5842230, 23527294, 10828149, 11904576, -10129143, -11198053, 2925410, 3961571, 4523138, --9756018, 804233, -21365852, -421981, 3660923, 4101694, -18845780, -19755776, -31079458, 21531208, -2255395, 7348689, -5089536, 11368778, -8499203, -8471823, 6454262, 16367583, 3869766, 10730976, -33520072, -4942434, -20231444, -43077448, -6127308, -16704738, -8184597, -10334765, -19985020, -14163728, --29850022, -3565897, -490700, 10339597, 30896920, -25853018, -9953050, -4343286, 10089415, 10846403, -30597348, 4058207, -35047472, -8149701, 7127498, 27261768, 7128572, -42506756, -17058000, 38252052, -3429532, 38156488, -22588306, 1119913, 2924336, 23047868, -2231773, 20960514, 31685048, 4373351, -26866094, 18779744, 4485557, 37196564, 31801548, 10219875, 49638012, 38070052, 23858544, -40424232, --2712809, 15657303, 9070971, -603443, -29313152, -35058208, -18170932, -50125488, -8003672, -37313064, --14287746, -9699647, -53630184, -50922208, -35444756, 17313014, 433792, -11880416, -745177, -4000762, --1197222, -10027138, -5354751, 12302934, 4844723, 2008434, -1807108, 1829119, -2553358, 7561827, --1416802, -13515725, 23111220, 3599183, 5475010, -7057168, 1008244, -974421, 12054899, -789200, -6978785, -4350265, -12829067, 4931696, 9715216, 25542708, 22720376, 1351841, -350577, 16246251, -8046621, 19003082, 15811385, -5252745, 18252538, 10122164, 3591667, 11383274, 7355132, -6713571, --3091303, -14862197, 8882529, -13284334, -5952825, -23219130, -14104673, 6804839, -27217208, 29079612, --12339978, 18874770, 9918153, -25286620, 4086125, 14969572, -9364102, -26396870, 17564268, -7487739, -15074261, -9163313, 4124242, 5539434, -15606837, -2347200, -6678138, -798864, -25778930, -21007222, -25777320, 708133, 10633802, -20519744, 21134460, 18116708, -13638669, 11376295, -19957102, -4819490, --11034308, 14279693, 36479840, -1089848, 44188772, -11549704, -1778117, 1654099, 4800163, -3436511, --24437290, 42608224, 28365038, -3781182, 23868744, 18020072, 24761560, -9702331, -281320, -44136156, -20046760, 20189568, -5420249, -7874823, 27633282, 14069239, 14690936, 33666640, 5948530, -17884244, --20851530, 6005975, -6383932, -25534654, 21052320, -29518774, 1473711, 6088653, -20496658, -32748052, --21800180, -8623757, 2517388, 25753698, 17722646, 7965017, -49431316, -14326937, 30090540, -2749316, --10616622, 8452496, -26709328, -17146584, 22805202, -488016, 503048, -9940165, 319438, 13380971, --4097399, -10529649, 7984881, -3894462, -18966576, -10786810, 2046015, -1824287, -1010928, -88047, --8235063, -380641, -12982612, -18071074, 2538326, -2046015, -28912646, -3677566, -17451526, -10576894, --3077881, 3979824, 5458904, 15518791, -14551886, -10437307, 3368328, 15100568, -16124918, -17855252, -24656870, -4270808, -1233193, -5134634, -9127, -10733660, 4516158, 11017665, 6458020, 9523553, -860604, 3273839, 399432, 947577, 3810173, 7858180, -6274947, -2044941, 3435437, 5571647, -3225521, -37112276, 21213380, 32320166, -384400, 37285684, 11595338, -32851132, -19841676, -2818036, --11106249, -20078436, 21206938, 24283208, -2128693, 16827682, 23235774, -18405546, 16458852, 27332636, --1440962, -37476276, 14862197, -1295470, -7152195, 10041097, 28357522, -9213242, -13928042, 6670621, --12093017, -16374563, -891206, 24489366, 21336860, -35319664, 11397769, 14807437, -23333484, -15272904, -28689308, -7950522, -41137196, -5483600, 35034048, -11545946, -59541668, 62517008, -17594334, -7412040, --30665530, 40338332, 13449153, -14125074, 29724932, -17490180, -12700218, -7716983, 75688600, 25034290, --31323196, -28082106, 29192356, -6836514, 42378444, 650688, 31873490, -43638480, 35034584, 59826212, -5925981, -6561637, -10297184, -10570451, -23658290, 56450364, 38283728, -33935072, 9762461, -35661112, --5823976, 3745212, 7679402, 4909685, 10760504, 907312, -38716444, 18162342, 2643552, -4119948, --577673, 17854716, -7509214, 3905736, -5429913, 9232569, -3430068, 2342368, -5968931, 11650636, -730681, -2406256, 6923488, 9354976, -21080236, 2536178, 13703093, 5076652, -15119895, 8176007, -24430310, -23716810, -36514200, 7192997, 4823785, 14368276, 14370424, -1965484, -32960116, -11262478, -9342628, 4575751, 9602473, -5029407, 1648194, -1351841, -10834055, 9663676, -8422968, -4042101, -27074400, 61814244, 11985643, -23951958, -5672578, -5903970, 10870025, 9266929, -19291920, -27580132, -7364259, -23348516, 4649839, -14553497, -16672526, -3676492, 2834679, 7853885, -18589156, -7565585, --7369627, -23199802, 19412178, -7338489, 1249836, -3494493, -15443092, 6062883, 4338454, 472983, --3343632, 105764, -576063, -9197136, -19655380, 8329552, -9766219, 8447664, 5972689, -19708532, --15915001, -1882806, -2306398, -2316598, -4243428, 15924128, -11100343, 1555315, -20881058, 17719424, --20461224, -10900090, 10125922, 199179, -16408923, 12928925, -22053046, 1586990, 6590628, -673773, -2368675, 10458782, 4966056, -22780506, 11438035, 1517197, -13735305, 19366008, 7618735, -21627844, --2406256, -17265232, -2312840, 6895570, 5701569, -22021372, 27869506, -14862197, -8169028, 15446313, -10257993, 2449205, 10320806, -958851, 14464376, -6558415, 2913062, -1893007, 6966974, 5398774, --4234301, -5131949, 5523328, -7063074, 674847, 1118302, 857383, -4185983, 620623, -3911105, --6370510, -3507378, -6927246, -445066, 5070746, 8888435, 3259343, 985158, 4667019, 5794448, --8247948, 12504797, 3217468, -471910, -8373039, -4784057, 3852586, 9878962, -2032593, -274878, --4989142, 1568737, 1327145, -4170413, -5679558, -5013838, -13074417, -4795868, -5172215, -37270652, --46196668, -17137994, 140181296, 111932216, 74486544, 135393472, -53650048, -128351336, -40929428, -207361552, --80572512, 5742372, -48380660, 94933272, 130046776, 21129628, 82752208, 141669504, 3310346, 38977364, --9000104, -166731712, -137624176, -104264088, -103234904, -51078972, 79307648, 42402064, 61435748, 173954768, -74080672, 10727755, 104480984, 48369920, -59404768, 20262046, -49780820, -168939312, -40350144, -88296472, --173680960, -28976534, 4323422, -42566884, 118004760, 135805248, 53891104, 159705136, 161977168, 30131344, -62635120, 28004260, -101885752, -114612280, -106918912, -192938528, -170141376, -64991980, -78841640, 16670379, -103666016, 141468176, 117253680, 180717728, 134419056, 71949832, 10296110, -22557168, -103901704, -126967824, --93415000, -111559088, -92699352, -4059281, -4912906, 21184926, 100746512, 48422536, 61683248, 96221224, --1659468, -29931090, -15545097, -60267516, -34130496, -20172388, -21897354, 24756728, 51219096, 19784230, -28519656, 32111322, -22996328, -8253854, -9575093, -61426084, 8858370, 25792352, -66283692, -704912, --5792301, -67152352, 25383794, 11486353, -75803488, 48258252, 72078680, 17015050, 144827904, 90020368, --1432909, 77054936, 14229227, -97466232, -80732504, -126968360, -180053088, -135258720, -87785912, -47177532, -61988728, 133791456, 156934352, 195139152, 191397168, 135486352, 30331060, -13999446, -96536904, -176648784, --171616160, -152574960, -127942240, -27273042, 14398878, 22842784, 89078696, 94531160, 65950296, 67800888, -52951580, 23376434, 32805498, 23974508, -4731980, -10854456, -26884884, -55110872, -59734944, -59287192, --60063508, -45511620, -9881109, 2686502, 19469624, 40834940, 49560164, 52799108, 52614960, 38297148, -12673912, 86436, -14816563, -26673358, -30714922, -23895050, -24931212, -19400368, -6634114, -4094715, --6136435, 509491, 1262720, 1978369, 15060840, 16094853, 7620346, 10130217, 8276939, 4808753, -10649371, 8918500, 1738925, 609349, -7515119, -13951128, -12724377, -12803834, -13896904, -10638097, --6460705, -1726040, 4377646, 10545218, 12138651, 12225088, 11315628, 7940321, 3300146, 998043, --3935801, -7623567, -6795712, -5242008, -4534949, -571231, 1367947, 2940442, 2141041, 1300301, --1304060, -2422899, -4431870, -4017405, -2769180, -553514, 440234, 2940979, 4458176, 6529961, -6132140, 4676683, 2588792, 1676111, -1213328, -2881386, -4314832, -4791036, -5034239, -3559454, --2879239, -1054951, 143345, 1454383, 1560147, 2246268, 1554778, 1308891, 200253, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --5080947, -15756088, 6017786, 3842385, 1228898, -3318936, 29528, 3036005, 5667210, 95563, 539555, -350040, -2090575, 571768, 1917166, -369904, 1873143, 2923262, 3861713, 1644973, 1580548, -2058363, 1801739, -3539053, 3601330, 6796249, -3220152, 1944547, 1058710, 1910187, 344671, -4031364, -2618320, -914291, -2356327, 2333778, 6717329, -1115081, 3258807, -73551, -1520955, --5522254, 2071248, -2853469, 2552284, 1310502, 2851858, -301721, -1715303, 917512, -1181116, -3865471, 498216, -3033321, 3908420, -839666, 3051574, 2367601, -120259, 2273648, 4407174, --1224603, -1539209, -1235340, 2196339, -1786706, -2369748, 2755222, 38118, 1853815, -2927020, -4347044, 263604, -1206886, -500364, -466004, 1733556, -1609002, -2590939, 1550483, 2335925, -2216740, -2051921, -3065533, 1249299, -94489, -357019, -1173063, -1114544, 1555852, -390842, --213138, -942745, -1118839, 237297, -801011, 365072, 251256, 1156420, 806917, -324807, -423591, 665720, -675384, -270046, 56908, -296890, -514322, 415001, 1119376, 651761, -839666, 35433, -64961, 305480, -689879, 16643, 266825, 12268037, 9552007, 4851166, -664646, -1774895, 5521181, -3218541, -3528316, -770410, -6137509, 3718905, 212601, -2499671, -1410360, 3575024, 6055367, -2794950, 3478924, 7940858, -2290828, 83215, 1780264, 4139812, --1067836, 4507568, 3140695, 4559645, 1013612, 3487514, -3553549, 6068252, -751082, 5855651, -2863133, -619012, 697395, -942745, -161598, -2085744, -1022202, -2582349, -1945620, 2053531, --572304, -5627481, -1293322, 617402, -183073, -3132642, -3280281, -1634772, -1432909, 4434017, --1793149, -4835060, -6504191, -7118372, -2485712, -3127273, -281320, 1113470, 3420405, -4652524, --2144263, 558346, -497679, -2078764, 493921, -4898947, -489089, -5776194, 3066607, -3140695, --1561221, 4022774, -609885, 2763812, 768799, 1012002, 3081639, 782758, -2528125, -1139240, -221728, -2433636, 1271847, 2490544, 1179505, -1906429, 1408749, 2083059, 378494, 1131187, --638340, -1118839, -813359, -1118839, 771484, -112206, 705448, -934692, -725313, 801011, -1125818, 6493454, -14061723, -3764002, -7129646, -1315334, -15569, 7743826, -3774740, -12590160, --4449049, -316754, 4784057, 1499481, -4685273, -10931766, -2826625, 3000035, -1239098, 6161668, -228707, 2700461, -623307, -4852240, -5295158, 3183645, 3869229, 455803, 1246077, -192737, -2359548, 551366, -6511708, 345745, 9134859, 1231045, -2288144, -845035, -2445447, 559956, --2112050, -3976603, 6110128, -1905892, -2566243, 5558762, -2924336, -4937602, 209917, 31139, -144418, -7121593, 5771363, -2208687, -154619, 5337034, 4838818, -7636452, -1953673, 1474784, -1835562, -678605, 4162897, 1148904, 2057826, 2894808, 413927, 2312303, 3483219, 759136, -537, 3263638, -8728447, -1933272, 198105, 4432406, 2439542, -1077500, -903554, 3221762, -2982318, -3478387, -520228, -1243393, 81604, 1902671, 2406256, 478352, 2979097, -311385, --2181844, -1026497, 213675, 215285, 256624, -818728, 2063195, -439160, 721555, -328565, --985158, 607201, -62277, -426276, -815507, 162672, -770410, -132070, -1355599, -1029182, -233539, -212064, -1071058, -2044941, -785979, 432718, 1677185, -27995670, -10999948, -5665062, --7897908, 2476049, -2705293, -2696703, -292058, 3513820, -3163780, -3840238, -5513665, 1097364, -5032091, 1095754, -3766150, -4748087, 1455457, 4146254, 3897146, -5394479, -7880728, 582505, --7364259, 3934190, -4832, 2741263, -163746, 2644626, -2870649, -1239098, 7794829, -9390409, -4359929, 2174327, 1095217, -3338800, 2119030, 4605816, 1278290, -5725192, 1199907, -3636227, -2841658, -7809861, -248034, -7075422, 5486821, -587874, -1352378, -2015950, 3043521, -11865921, -5517959, -3428995, -7126962, 2860448, 5826660, 6521908, 3901441, 1386201, -410706, 768799, --539018, 4207458, -2350421, 1187559, 3371013, 8157217, 1358820, 156766, -5805185, 3733937, --2856153, 664109, 223875, 4342212, -3794067, 224949, 4052839, -357019, -4672925, -6522982, -5454072, 452045, 1074816, 2718178, -495532, 1322313, 1228361, -39728, 1040456, -454730, -230318, 1449015, 1410360, 1428614, -2297271, 933082, -1707250, -768799, -1427003, 1403381, --1627793, -15898358, 7781407, 12417824, 2408940, 983011, 6897181, 2332167, 2107218, 3775813, -514859, 3950833, 3966939, -3202972, -592169, 539555, -3905736, -2417530, -54761, 1919850, --2305861, 12911745, 6854768, -1883343, 918586, 4100083, 5157719, 5893232, -2471754, 4150012, -4828080, 272194, 1404991, 1393180, 2747169, 1994476, 1209033, 2728378, 2600603, -5586679, --4323422, -8600672, 925029, -3047279, -4305168, 4423817, -1263794, 2784750, -10661719, 11733314, --857920, -5580773, -1042066, 9300752, 6725382, -1483911, 234613, 4503273, -2148558, 1935957, --3436511, -7323993, 855772, 683974, -5892159, -2329483, -5807870, 1035087, 2137283, 1311039, --2827699, -5127654, -7820599, -9310415, -6701760, -2609193, 528281, -2265059, 899259, 3091840, -2736968, -3870303, -423054, -4220879, 1532767, -1471563, 1204202, -56371, -1731946, 1233193, -1401770, -1242856, -594316, -1617592, 2173790, -2587181, 555661, 828929, 759672, -261993, --609349, 552977, 1152662, 1159104, 942208, 728534, 970663, 321586, 1853815, -427886, -2054605, -1285269, 645856, -381715, -534723, -1479616, -1149978, -984084, -1345399, 529892, --1080721, -143345, 978179, 328565, 29336774, 7753490, 2197413, -1105417, 17694192, 2056753, -8421357, 1717450, 5611375, 9189619, 3276523, -5120675, 5461051, 6315213, 1029718, -471373, -1382443, 11572789, 835908, -3964792, -7007239, -2073396, -178241, -8048232, 1385664, 2384781, -4653597, 1966021, 3296924, 8869644, -2730526, -1409286, 5490042, -850404, -2362232, -456877, --7890392, 5134634, 3403762, 186831, 5149129, -2545842, -6901476, -15010911, -5451924, 5553930, -6179921, 201327, 4353486, -4233764, -4555350, 12228846, -7018514, 5547487, -6172405, 1311576, --9022116, -9519795, 10401874, -3940096, -3660923, 14283451, 1134945, -1591285, -6643241, 5244692, -8306467, 415538, -4378183, -8392903, -1254131, 6124087, -1889249, 2085207, -3646427, 3023120, --1344325, 988379, 6581501, -7010461, 2268817, -1974074, 508417, 823560, -734976, 7538205, -2429878, 1121523, -2160369, 91268, -1694902, 3184718, -1458678, 2528662, 2599529, -2628520, -92879, -409096, -1636383, 3590056, 680752, 1686848, 213138, -1248225, 804233, 29528, -146029, 1037235, 1666447, 603980, 2161442, 667867, -76773, 1181116, 876173, -796716, -336618, -337155, 540092, 1867774, 2146410, 345208, -102542, 15027554, 4868346, 12473122, --7672959, 2595234, 6829535, -9307731, -3307125, -3562139, 899796, -4642323, -2985002, 7445863, --2305861, -1255204, -595390, 9288404, -3422552, -4122632, 9713069, 1710471, -6993281, 3045132, --1589138, 1692754, 3629247, -5486284, -1364726, -4090956, -7636989, 1047435, 124017, 1564979, --7514046, -7631083, 2937221, -547071, 2857227, -188442, 4186519, 1374926, -257698, -4830228, --4860829, 1452773, 4719632, 2445984, -1458678, 14168023, 3274913, 2524367, 6324876, 2484102, -4689031, 4953708, 3104188, 2061584, 2366527, -1920924, -1166084, 1187022, -6017786, 1695438, --9663676, 2742337, -6415608, 5097053, -3632469, 2852932, -1297617, -4540318, 1512365, -1112933, -4959077, -4248797, 13358959, 11423539, 5163088, -9546639, 2984466, 4416300, -4179540, 1905355, -1144072, 6698002, 6200322, 2742337, -192200, -777926, -1394791, -3702799, 5777268, -322659, --752693, 134755, -1723356, 752693, 1896765, -1484985, 2988760, -1038308, -2545305, -2498060, --137976, 1903744, 1689533, -362925, -668941, -1947231, -934155, 1207423, -2521146, 2882460, -2818572, -1700270, 473520, -2183454, -797253, 506806, 894964, -1635846, 2995203, -18505940, --35602596, -1523640, -7136088, 6169184, -1838246, -9866077, -960462, -7992934, -8810589, -7559143, -11635603, 6031745, -7787313, -4486630, 8849780, 5114769, 7895224, -5459977, 5099737, -4846871, --4892505, -1524713, -2149094, -15081778, 4093641, 8576513, 3681324, -8977555, -2081449, 1561758, -2268817, -8014409, -1806571, -11492259, 2501819, -5464809, -537408, -4025458, 2163053, 12234214, --1353989, -2312840, 6113349, 8932458, -5458367, 2410014, 3353833, -7599945, 4014184, 3736622, --8919573, 1357210, 5708549, -1398549, -9393093, -5935645, -6074158, 8450348, 3250217, 8273181, --4964446, -9657771, 2236067, 4748087, -2088428, -6928856, 4527970, 6674379, 6327561, -7940321, --4147865, -1690070, 12700218, -2761127, 7561290, 2185065, -9020505, -7363185, -1446330, 4948339, --8552354, -559420, -1633698, 4618701, -1075352, 10482941, 1268089, -2473364, -3202972, -2732136, --3092377, -2031520, -1085553, 905701, -82141, -1302986, -3921305, -439697, -3815005, -1711545, -1486059, -1382980, 553514, -1161789, -2901251, 1643899, -520228, 4441533, -941672, -3740917, --2641942, 1365263, -753230, 85899, -1088774, -2435783, 737124, 2451890, -2316061, -789200, -3381213, 1516124, -2196876, 103079, 2654827, -18009872, -220117, 709743, 10302016, 2750390, --4389994, 6419366, -3185792, 2925410, -10065256, -2696703, -6448357, -3262028, -12672301, -4529043, --7644505, 17415018, 9697499, 10695542, -12431246, -10272488, -5203890, 6073084, -747861, 69793, -171799, 3730179, -1018444, 5207648, -7305740, -5910949, -296353, -1531156, -8968965, -8640400, --7250442, -4921496, -3990562, -3317325, -11311870, 5317170, 13483513, -2755759, 6232535, 8982387, --6594386, 7801808, 4647155, 2013266, 12304008, -389231, 10280004, 4081830, 1192390, -9594957, -3778498, 5048734, -2724620, 14567992, 11310796, 2438468, -4402342, -6951942, 4017942, -6830072, -2723546, 66572, 8371428, 185757, -12773770, 1118302, -5102421, -1809255, -9596568, 11290395, -5640366, 4224101, 2529199, 12578349, -3666828, -12758200, -2134599, 8358007, 123480, -6471979, --1818382, 1133335, -2984466, 1786706, 3825205, 166967, 29528, -628676, 1180579, -10201, -4630512, 1646583, 1316408, -908386, 1737314, 2698850, 4197794, -3395709, 2284386, 2684892, --119722, 984621, 4230006, 2594697, 1030255, -2417530, 3582003, -872952, -2216740, -2273112, --250719, -6235219, 3985193, 2279017, 651761, -2841121, 3503620, 3808026, 6295349, 4199405, -999117, 1320703, 239981, 5511517, -16430397, 7373385, 5509370, 6992744, -7643968, -13730474, -4014184, 4044786, 738734, -11586748, 11074573, 3101503, -5829881, -10210748, 4633196, -4549981, -17699560, 20491288, 3086471, -3348464, -7617662, 11611444, -13229573, -4811974, 16441135, 4017942, --3136937, -8921184, -8118025, -4675072, 339839, -10896332, 2493229, 11494943, -1420560, 4284767, --8416525, -7785702, -2572149, -6445672, 16834124, -6213207, 7587597, 6148783, 6861211, 1746978, -3396246, -11689827, -11623792, -11241003, -2446521, 8351564, 19402514, -7845295, -13932337, -3277597, --6393596, 3536369, 3052111, 10732050, -6534256, -180926, -8674223, -1703491, 15549929, -2021856, --8391292, 11051488, 3685082, 1755568, 5874442, -12474196, 1950452, -4247186, 1254131, 5659157, -13678934, 3779571, -15785615, 5758478, 1437740, -2485176, -6549289, 282394, -1636383, -890132, --374736, 2212982, 3701725, 4367445, 1505923, 280247, -2505040, 811749, -741419, 3135863, --5324149, 1999307, 2143726, -126165, 525060, 893890, -4017405, -115427, -2648921, 4429185, -4167729, 1022202, 4994510, -1929514, 734439, 3775813, -745177, 2995740, 784905, 2776160, -981400, -6242735, -332860, -2221572, -305480, 867047, 418222, -2184528, 260382, -2573759, -50466, -1236414, 26800060, -11648488, -9126806, -2790655, 5648956, -15674483, 6277632, -4230006, -7917236, -7034083, -3205656, 9725953, 7211787, 2749316, -4891968, -1770600, 13312251, 13096966, --2718178, 11436961, -3316789, 16814796, -7857643, -4126927, 3019899, 17616346, 12866648, 4261682, --9437654, -657667, -19559818, -2952253, 3060164, 9002788, 10488847, 18567680, 4867809, -334471, --894427, -7120519, -12197707, -870805, -10579041, 7658464, 2403571, 11840151, 6590091, -4036196, -11734388, -13959717, 6318434, -3107409, 1015760, -2421288, 14936823, 8758512, 4280472, 2671470, --27096412, -4303021, 16081431, 8126078, 1005559, -492848, 824634, 12974022, 5509906, -20484310, --6674379, -7895224, 1931662, 454730, -20351702, 811212, -19021874, -12607340, -1636383, -8164733, --8849243, 11918534, 15044734, -1595044, -7280507, -779537, 4638565, -1816771, 3962644, 6180995, --469225, 6865505, 10040023, -3165391, -5543729, 965831, -2343979, 3073049, 2008971, -1532230, --1359894, 181462, 190589, 2881923, -262530, -3387656, 747861, 3469260, 1315871, 3092913, --2582349, 4661114, 52613, -1618129, 1185948, -2828236, 1224603, -5742372, -3668976, -4471598, -2417530, 312996, -4261145, -769336, 3777424, 2536715, 3290482, -2028298, 1848447, 142271, --638876, -5456219, -2777233, -5786395, 9901510, 18722300, -4597763, -7885560, 1248225, 7125351, -4355634, -11758010, -567473, -9562745, -362925, -12948253, -1257889, -11156714, 650688, 11163694, -1026497, 24877524, -10392210, -5224828, -8818105, 10045929, 16823924, -13548474, -4353486, -20913270, -4019553, -346282, 5785858, 4940286, -11497627, -7057705, 9186398, -3567507, -2453500, -11451457, -22864796, -3200288, -24242406, 6689949, -6307697, -7391639, 8871255, 6671695, -6930467, -7907572, --2247879, -14221710, -8351564, 4549981, 3253975, 4754529, -4188130, -10312216, -11704323, -11972221, -9876277, -17519172, 375273, 4076461, -5268315, 343597, -15032, -2469069, -13710609, -2662343, --5516886, 8681740, 11334956, -2189360, 17568026, -1099512, -86436, -5460514, -1024350, 25025700, -2526515, -11451993, -4442607, 9666898, 7368554, -14058502, 372052, 1879585, -9372156, 7773891, -1939715, 8712341, 1452236, 1224603, 1442035, 568009, 3937411, 5190468, 557272, 2535641, -8633421, 534187, -2969433, 1355062, 4185983, -3386582, -850404, 346282, -3937411, 3568581, -3505230, 4143033, 920197, -4812511, 1146219, -1753957, 841277, -1141388, -794569, 243203, --2549600, 3542811, -1858110, -2745021, -3053185, 7326678, 136365, -8332774, 6011344, 4464619, -2074469, -738198, 4610648, 3229279, -9005473, -2236067, 513249, 196495, -2720325, -12203076, -30816928, -7924752, -2703145, 2740726, 13140452, 9443559, -20007032, -8159364, -19006304, 4175782, -1096827, -5876589, -20918638, 874563, -9762461, 4354023, 4614943, 10572599, 543313, 7699266, -36214628, 7880728, 9045738, -5674189, -2003065, 15822660, -1371168, 1256815, 4202626, 1047435, --2310693, -8249022, 14599668, -15464567, 6459094, -22996328, -6990596, -10750840, -14191109, -12190191, --7516, -25124484, -8540542, 3470871, 14415521, 8302172, -24682640, 14032195, 9343164, 10232760, --15663746, 11555073, -7334194, -17962626, -6093485, -17870822, 8773544, 21420612, 5444945, -2025614, --13927505, 11340861, -14833206, 22372484, -4084514, -2381559, -13394929, -14687178, 2257005, 17480516, -5846524, -11981348, -4765803, 2953864, -2369211, -4777078, 11562052, 5935108, -5200669, 14808510, --1063541, -20938502, 26436598, 14031658, 10978473, 5002563, -3389266, -1253594, -2034204, 7897371, -1947231, 1199370, 17468706, 6803228, 480499, 876710, 2633352, 9086540, -7063074, 5148055, -680215, 1758789, 1842541, 5877126, 3036542, 421444, 9942849, 7521025, 848793, -3344706, --3262565, -1213328, 8185671, 4060892, 4689031, 4373351, 5521718, -6529424, 6818261, -1680943, --1539746, 6189048, 9815074, -1321239, -2438468, 12348, 9361418, 10587631, 4263829, 6551973, -5017059, 16853452, 3207804, -10853919, 4951024, -3165391, 5101885, 18496276, -26025892, -11846594, --20913270, 11899744, -4165045, 2049773, -6859600, 15101642, -14805826, -14999636, -6761889, -3495567, --10641855, -18558554, -8890582, 3486977, 12259447, -17072496, 11337640, -6417755, 1423782, 22146462, -17016124, -264677, 9005473, 4301410, -3444027, -2651069, -29967598, 4194036, -2967823, 2990371, -5935645, -2329483, 903017, 30394410, -27169964, 2601677, 32971928, 4329327, 9169218, -12856448, --3434363, 17235166, 30277908, 1573569, 26862336, -10392747, 24310052, -8462696, 18017924, 18233210, --4409858, 35487704, -5806796, -1445257, -10433012, -15956877, -16877610, -7726646, -10094247, -24592982, --11416560, -5167383, 9211094, 9087077, 1248762, -12593381, -2022930, -3503083, 15950435, 4996658, --8176007, 13664975, 3150359, -1598265, -1824824, -9803800, -1430224, -3842922, 4229469, -9918153, --4696010, -6884296, -6857452, 12740484, 4968741, -4086662, 3904125, -3114925, 2501819, -7486665, -11410654, 659814, 3260417, -166967, -7554848, 7129109, -849330, 2710124, 8123394, 5726265, -3503620, 784368, -11809013, 5836861, -4486630, -381178, 10287520, -50466, 3849365, 2628520, -4940823, 7059316, -2425583, -5349382, -3623879, -4236985, 2175401, 6383395, 10563472, 6305012, --12258910, -1326608, -13317620, -11544335, -38907572, -27769648, -19495394, -2006287, 26577258, -17432198, --2100239, -13427142, -19217832, -16048145, -19634980, -20636780, -8037495, -24346022, -26336202, -23048406, -6620692, -15933792, -8185671, -19847580, 18974628, 30826054, 2794413, -3630321, -10770704, 2464238, --1808718, -884226, -2362769, 9663140, 2171106, 21000242, -18248242, 1538672, -15504832, 31956168, -7981123, -18856518, 14884746, -13533979, 12117176, -18147310, 10726681, 1480153, -10686416, 9639517, --16981226, -5787469, 5566815, 17435420, 7792145, 31001610, -6826314, -20109036, 2028835, -5789616, -2515240, -13348758, -11351599, -21454972, 2860985, -22804666, -4411469, -3626563, -19771346, 13246216, -17026324, -9882720, -908386, -29382946, 33864208, 40806484, 6714108, -16195248, 5749351, 35903780, --16712255, -7729331, -19083614, -11281268, -20963198, 8617852, -840740, -11984032, 9403294, -12002823, -5146445, -7491497, -3236795, 4830228, 2747169, -149787, -7737384, -1636383, 7125888, 3992172, --13019656, 10378252, -9013526, 4756140, 6224482, -4208531, -7579007, 4127464, -6092411, 5098126, -3903589, -8255464, 3201361, -1156957, 3364570, -4934381, -13116830, 3591130, 2527588, -5508296, -3648575, -4937065, 9685151, -181999, 4080756, 1059246, 12531641, 1605781, -16320876, 9287867, -6350646, 2791729, 10566156, -31547608, 57684632, 21738976, -4657355, -17424682, -4771709, -18500034, -19904490, 49933288, 1164473, -33216204, -15098421, 17983564, 6790344, -6648610, 23910082, -4653597, -3080565, 13617194, -1345399, -13793824, -4386772, 11212549, -14314052, -13139916, -5220533, 4646081, -816581, -2530810, -5945309, 10572062, 1212255, 15664819, 12505871, -16201154, 8063801, 19265612, -10912975, -14970645, 5898064, 3184182, 13137231, 312996, 4664335, 3490735, 5497558, 27182848, -25877178, 15939161, 35028144, -17201880, 18126372, -20719996, 13363791, -238908, 12228309, 15143518, -5035313, 3935264, 18549964, 8548059, -4741107, 11676405, 230854, 15664283, -16446504, -9495636, -1616518, 37764572, -25877178, 2526515, -32580548, -3883724, 3986267, 12916577, -15751256, -3138547, --16234976, 4265977, 20455318, -12407624, -29091424, -6226629, -2674691, -7937637, 7323993, 5114769, --8074539, 2949032, -6871948, -6912213, 6795712, -1030792, -3723737, -13211319, 7419556, -541703, --8141648, -6689949, 6501507, 17853642, 1981591, -5089000, -2114735, 6521908, 16267189, 3223910, -1656247, 13370770, -118112, 3663070, -966368, -2590939, -330712, 4873178, 7867307, 4590783, --1850057, -2792803, 7054484, 4853313, -9735617, 9586904, 2898029, 18588618, -4293357, 4756140, -11495480, -7606924, -4356708, 6340446, -10189810, 48321604, 3855807, 3575560, -10726144, -6692633, -7858717, 7428683, 4271882, 18661632, 7619272, -7804493, 9683541, 19889456, -985695, 21792664, --2318746, 10586021, -22377316, 40164924, -6207839, -4712116, 6494528, -30413738, -8073465, -14660334, -21159694, 11734388, 11855183, -14246407, 4887673, 5070209, -19200652, 5178120, 15877957, 13684840, -4420058, -4767414, 1614371, -9203578, 30191472, 4508642, 13451838, 11130945, 16114180, -27303644, --2538863, -8327405, 4688494, -10236518, -12303471, 22347252, -21862994, 16324097, -14034343, 17181480, --4341675, -18387292, -2170032, -27543626, 16475495, 15464030, 18524730, -56768732, 15829639, 9965398, --17869212, -11894375, -16658568, 28858422, -42154032, 24721294, 58041116, 825171, -28491202, -11511586, -16450262, 34058552, 8943196, -12063489, -25757992, -42685532, -3981972, -593242, 16245177, -13037373, --6299644, -10088878, 28438590, 1478543, -1439888, -8716636, 5440113, 1257889, -636192, 723702, --932008, 5011690, 17883706, 22164716, 11302743, -3834332, -2463164, 8517994, 1631551, -6067178, -2024003, -9482214, -6084895, -11458973, -16591996, -33999496, -13911399, 4611185, 956167, 18276696, --14085882, -10099079, 23441932, 8382703, -6973417, -10557030, 7138236, -3053185, -9940702, 23247048, -2062121, -1782411, -8240432, 32212, -10275709, -8312909, -12672838, -3721589, -5532992, -4511863, --13456669, 8755828, -28032178, 4583804, -17058536, 25371446, 1421097, 7271917, -14486925, 11508902, --4307316, -9556302, 4334696, -9851044, -6436546, -8290361, -22517976, -12333535, 15898895, 13945222, -10035728, 11937325, -27172110, -7343857, 4887136, -7489349, 15306727, 11500312, 538482, 9878425, -26244398, -7604240, -27805082, 52455508, -23207856, -28736552, 31771484, -15229954, -9673877, 7575249, -16058346, -19020800, -6589554, 2360622, -13255343, 68165960, -1098438, -10707353, -4793721, 982474, -16359530, -32825898, -25765508, -13796509, -13800804, -775778, -29123100, 316754, -3049427, 10885595, -42423004, 43710956, -17296370, 33866892, -33372432, -28931436, 17218524, 27475980, -9769440, 7859790, -2985002, 18938122, 22575958, 384400, 1058173, 30650498, -27540404, -53417584, -6437619, -21082384, -11508902, 25661892, -2951716, -16650514, 34051036, 10567230, 6503654, -8990440, -28768764, -15559593, -2618856, -11951820, 15822123, -1148367, -10619307, -1150514, -11958263, -11536282, 15709380, -4893042, -6087580, -11552925, 16757352, -1207960, -1454920, 11307575, 16050830, -1536525, -3855270, -11021960, -1039382, -9446781, -9261023, -6584722, -3278671, -16692927, -413391, -7468948, -3292093, -16758962, -4534412, 19821810, 7062000, -11769821, -25214142, -1642825, -2609730, 13557601, -33829848, -6686727, -7484518, -6657200, 15214922, -96637, 9102109, -449898, -2965138, 2155537, -19232864, 20821464, -571231, 12622909, -13023951, -20717848, 19287088, -20509542, 6567542, -4924717, 18148922, -161598, -4220342, -11006391, 3708168, -7842611, -26098368, -21046950, 9123584, -1840394, -432718, 4121021, -19905026, -8997420, -5764920, -16691854, 7358890, 5896453, -1806571, -3408594, -44005700, 1889249, -12652437, -15943455, 11220065, -24626268, -4406100, 1513976, 15525233, 19285476, 2528662, -9338333, -6337224, 34828964, 30638150, 30225832, -1214939, -2848637, 6624450, 3573413, -13782550, 8955544, -38451232, -27369142, -8767102, -7966091, 193810, 1407139, 5079873, -20354386, -30873298, -11675332, --1760937, 62358632, 31797790, 21154862, -2845953, -5487895, -15831786, 27111444, 4004520, 17348446, --6355478, -8439074, -12533788, -11152956, -46061376, -20445118, -24282672, 19120658, -1742683, -9004936, --1406602, -18938658, -8810589, 20045150, 30217242, -4715337, 26651346, 14332306, 11196980, 1610076, -12658342, 15926812, 13457206, -3393561, -790811, 198642, 18190260, -14372571, -18457086, -8964670, -10002979, -1734093, -12966506, -8482560, -12987444, 7693897, -2895345, 16504486, 32969780, 6177237, -20356534, 26382910, 12913893, 16370268, 8311299, 5201206, 7355669, -12071006, 17447230, -14308147, --9535364, 3839701, 1554241, -10200547, 5323612, 9424769, 17519172, 7148973, -19928648, 11025718, -8506183, 2189897, 9369471, -5370857, -10468983, 5842766, -447213, -7681012, -4370666, -7175280, -2833605, -42541652, 23841364, 21033528, -1260573, 34512208, 15362024, -23399518, -23269596, 10135049, --9624485, -20871394, 1244467, 2141041, 9270150, -5152887, 12132209, -2985002, 11482058, 14855218, --13772350, -55166172, 29548302, -8286603, -17407502, 12632573, 19485192, 745714, -37196564, -4806606, --1602023, -38114612, -23925116, 20163260, -5907728, -15453292, -13218299, 8694088, -37247032, -26308822, -50103476, -4216048, -29207388, 11471321, 27187142, 11754252, -41332080, 59040232, 23776938, -36294620, -20138564, 26725434, 4191351, -24561308, 25498684, 28616830, 17301738, -22632330, 21385180, 40059696, -2098092, 40467720, 49927384, -26686780, -16003585, -18563922, 47175384, 30146376, -20565378, 11589432, --12454868, -29985314, 25818122, 58959700, 8451959, -17636746, -14842870, 35451196, -3356517, -39533028, --28399398, 7279970, -1516124, 32876900, -5893769, 25415468, -49270792, -7466264, 1929514, 8538395, --10286447, 10536092, -499827, 1100585, 5612986, 1489817, -12895639, 3999152, -6152004, 8038568, -3088082, -17824114, 15648176, 5209796, -14952392, -10555956, 2821794, -12837657, 2515777, 11941083, -12997645, 1955821, -12248710, -3869229, 4006668, -16661789, 9778030, 12520367, 4024921, 1139240, -12400107, 4648229, -5583995, 6156836, -4498978, 1140314, -8567923, 5508833, 19872814, -14003741, -34641060, 55766392, 22407918, -23067196, -8576513, -19346680, 11796665, -9395778, 15216532, 10124312, --25665650, 13046500, -26156350, -8754217, 119722, -9569187, 1374390, 13626321, 10548977, 768799, --20885890, 4702453, 16596291, -6309844, 2377801, -7517267, -24423868, 24612846, -14800994, 17044040, --25157770, -14758044, -3655017, -20560008, -6241125, 20896090, -20512764, 27546310, 1646583, 22461606, -8719320, -11193222, -30280594, 24707336, 15169824, 10281615, 6180995, 25465934, -19046570, -9614284, --11098732, 7944079, 9384504, -2521683, -23972896, -1104880, -3477313, -24055038, -9723269, 3765076, -6303938, 18924162, -2463701, -16917876, 22300008, -4378183, -4118874, 27033062, 12663174, -22257058, -6979859, -13660143, 8398272, -7186017, 10370199, -19237696, 10502806, -6706055, 21007758, 3590593, -7916162, -7267085, -296890, -15634218, 5986111, 945430, 443455, -476205, 4200478, -6349573, --6099391, -832687, 2252174, -1828046, 3809636, -8008504, -1807108, 5987722, -1760400, -383863, --1575716, 60130, 64961, -12603045, 2060511, 9919764, -111669, -1571958, -3016141, -1343788, --9613211, 549756, -2655901, -1277216, -5167383, -7793218, -2073396, 7387881, -4701916, -2438468, -3151969, 1455994, 5375689, -5868536, -2591476, -1009854, -4951561, -6837588, -7843147, -41640244, --48217988, -26410290, 144568592, 126372432, 77091440, 167812432, -35464080, -126732672, -44047036, -238599936, --124497680, -2845953, -61275760, 84818088, 156533312, 21539798, 92134568, 178530512, 30404074, 62055836, -6347425, -184122560, -153127936, -135909952, -148932288, -90863792, 74494600, 31044560, 74587472, 192991664, -116892904, 29837138, 143829872, 65157340, -87529288, 47414292, -63781340, -168611824, -20396262, -104369312, --190898416, -86628416, -19494320, -100617128, 112244136, 120065272, 57353920, 191414880, 216989808, 81883552, -107474576, 100755104, -112354200, -73753176, -143782080, -225494912, -206753280, -133095128, -132979168, -38582228, -86915640, 111749680, 150107504, 210751904, 189911648, 110514880, 81228568, 14274861, -87531968, -128021160, --93284008, -121904592, -149878784, -51133732, -56393996, -27842662, 94016296, 64648384, 69548944, 145502752, -37513320, -6682432, 24363202, -40537512, -62716188, -35311072, -63382980, -19347754, 41139880, 15328201, -22800370, 51437064, -11841762, 10591389, 28456306, -47748224, -4473209, 59612536, -56296820, 4752918, -9776419, -112960328, -5456756, -2314987, -134481328, 10644003, 47728360, -17399450, 139083920, 126039040, -23375896, 134887200, 66851704, -5939940, 22679038, -36436356, -145301424, -151742272, -187413584, -213618784, --107399952, -17459578, 43456480, 134022304, 223099392, 255558064, 203649088, 150502640, 69067368, -28129352, --84687632, -186703840, -233564624, -172125104, -137888848, -131442640, 8584566, 64535640, 79239464, 129522792, -115795000, 76182520, 75110392, 53983444, 17331266, 21529598, -229781, -40977748, -46860776, -59445568, --76106824, -68073088, -49179524, -36851356, -13717052, 18241262, 27545236, 44781476, 54664196, 47046536, -34440804, 26370562, 11695196, -2129230, -12050604, -17695266, -23966992, -19036368, -13921063, -11141145, --8855686, -2153926, -3183108, -2690260, -518617, -2390686, -5903433, -65498, -1461363, 1200980, -9239548, 14740328, 18321794, 26564910, 19847044, 9956271, -288300, -9264781, -16722455, -18027052, --24420110, -24440512, -19173808, -8459475, -1445793, 9253507, 15159624, 20631950, 19844360, 18417356, -9459129, 2334852, -5022965, -8725763, -12387223, -9847823, -8704288, -3854733, -242129, 4481799, -4603668, 6265284, 3293166, 1909650, -2919504, -4812511, -7317014, -4618701, -3829500, 725313, -2287070, 5556077, 5341329, 6820408, 3973919, 3745748, 464393, -156766, -2880313, -2028298, --3720516, -2219961, -3064996, -989990, -1648194, 496606, -511638, 932545, -616865, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --517007, -6449967, -663036, 1957431, -1178432, 8610873, -3382287, -837519, -304943, 1064615, -1521492, -3942780, -681826, -2662880, -471910, 5392332, 400506, -2732673, 2529736, 1861868, 3552475, -1452236, -2704756, -1791001, 6029597, 836982, -1543504, -1194538, -1228898, 1183264, 1283658, --779537, -7676717, -1924145, 370441, 5297842, 1894618, -659278, -22012, -3059627, 4220342, --4312684, -5733245, 740882, 55298, -1944010, -1320703, -1603633, 820339, 520765, 505732, --2008971, 5005785, 151398, 6709276, -1082332, -3196530, 1469416, -356482, 957241, 1557463, -3388729, 2306398, -868657, -1842541, -1571421, 4352950, -4433480, 172872, 123480, -778463, --3802657, 3352759, -1918240, 442919, 2909840, -2050310, -2748779, -2285460, 2950643, -272194, --920734, -820339, 96100, -553514, -1199370, 1465658, 1500554, 1096290, 682900, 375273, -2051384, 331249, -44023, 431644, -202400, 73014, -475668, -255014, -246961, 1386201, -333397, -933619, 1164473, -2544768, 2225330, 1342177, -2998424, -1645509, -230854, 284005, --153008, -437550, -1514513, 2723009, 529892, -1163399, -1582696, -73014, 5628555, -777926, --2630668, 3608310, -1389422, -3378529, -330712, 2889976, 2165737, -1844689, 523986, -2308008, -1368484, 1332514, -1089848, 2888903, -765578, -5179194, 986232, 2704756, 2535105, 367220, --360240, -3750043, -1243930, -481036, -1622961, 3413425, 4800700, 2238215, -6481643, 2219424, -7692824, 3186866, -343061, -33823, 3561602, -1727651, 1188632, -3213173, -2888366, 2985002, -3387656, 1636383, 934155, 612570, 711354, 1604170, 339839, -282931, -1116155, 825707, --2236604, -406948, -940598, -4626754, -2282775, 996969, 1771137, 1450625, 3189550, 2505577, -2656974, 3787088, -2355253, -1488743, -651224, 1221381, 1423245, 2246805, -431107, -717260, --374736, 1383516, -940061, 1255741, 352724, -482647, -366683, 435402, -180389, 777926, -354872, 150861, -261993, 445603, 423054, -131533, 652298, 184684, 200790, -458488, -157840, -104153, 64961, 824634, 142271, 371515, 344134, 147640, 4491462, -351114, -1873680, -2907693, -4248260, -2714419, 2361695, -1985349, -1955821, -2150705, -2795487, 2684355, -414464, 1958505, -853088, 547608, -5783711, -3776887, -2626373, 3685619, 737124, 787590, -2062658, -2100776, -1022739, -507343, 695785, -4449049, -828929, -3016141, -3218541, 141734, --2837900, 1875290, 1828582, 7634841, -1892470, 3859565, -2581812, 1567126, -1766842, 354335, -6733972, 1029182, 2925947, -3230889, 2062121, -2911988, -1345935, -493384, 4281009, -2157147, --1084479, -3848291, -2005750, -4535486, -591095, 4185446, 1023813, 262530, 744640, 3832185, --3821447, -6773164, 1565516, 2061047, -4378719, -377420, 596464, -1142998, 1777580, 5197448, -1104880, -1391033, 126702, -1927904, 353798, 261993, -1495186, -508954, -472983, -2182380, --495532, -1271310, 454193, -519691, -832687, 1679332, -326418, -1771137, 736050, -1279363, -56371, -1379221, -1918777, 1058173, -346282, -198642, 612570, 757525, 249108, 1720134, --846109, -209380, 298500, -701690, -274341, -262530, -887985, -526134, 1463510, 428960, -2085207, 194884, 933619, -890132, 2430952, -6821482, 1104880, -2362232, -5087389, -3615289, -2018098, -973347, -267362, 5046050, 1630477, -661425, 404801, 4297115, -2037425, 3182571, --1459752, 977642, -4539244, -757525, 3022583, -989990, 3762928, 4293894, 1369558, 2719788, -5543192, -1266479, -7883413, 1823214, -3525631, 282394, -9648107, 300111, 3055332, -1890859, -3558381, 546535, -3500398, 1284195, -7263327, -4590247, -1794760, -1740536, -6032819, 3078955, -3296924, 232465, 3066070, 274341, 810138, -1910187, 2777233, 2174864, -1152662, 6658810, --1276142, 5506685, 4657355, -235686, -791885, 47245, 1472100, 2268817, 683974, 2535105, -804233, 882616, 7300371, 2829847, -3230352, -1439888, -73551, -1734630, 1058173, -1246614, -7363722, 1265405, 3444027, -2625299, 2971581, -3221, -1486596, 664646, -2422362, -1529545, --440234, -1689533, -1086627, -1012539, 877247, -1584306, -406411, -1108102, -615254, -526134, -2001992, -839666, 1029718, -265751, -1758252, -262530, 1039919, 454730, 159988, 689879, --1074279, 918586, 557809, 547608, 973347, -552977, 209380, -1668595, -149250, 1319092, -1135482, 302795, 190589, 183073, 922881, -13136157, 91805, -79994, 3408057, 5705864, -2067490, -2936147, -4734128, -804770, 6273874, -1221381, -1135482, -4651450, -56371, -1958505, -4659503, 5439039, -9351754, 6097243, 3971234, -3603478, -710817, -4969277, 83215, -1525787, -169651, 3193845, 6307160, -2385318, 1499481, -1674500, -2085744, 2283849, 4369593, 2872260, --2656974, -4488778, 3157875, 2115808, -1547262, -847182, 599685, -5774584, 2142115, 1698660, --2239826, -3872987, 1540283, -2951716, 5160403, 2208687, -8902393, 4053912, -3779034, -9905268, --2802466, -774168, 2039573, -4083440, -127775, 2141578, -4298189, -4329327, -4424353, -1407676, -1184874, 9331353, 1534914, 1746441, -1953673, -4930086, 6444599, -1970316, -7429757, 336081, --7498476, 537408, -668404, -2790118, -8218957, 2492692, 178241, -1854352, 2091649, 4992900, -2372970, -986769, -790811, -56908, 2809446, 411243, 739271, 1510218, 2738579, -263604, --1183264, -1631014, -1585917, 609349, -60666, -1335198, -1260573, 1181653, 1239635, 2303176, -561030, -85362, -63351, 842350, -339839, -71404, -302258, 1444720, -98784, 756988, --146566, 1984275, 8191040, 2139968, 1808181, 3518115, 5169530, -1184874, 12572443, -1875290, -9006010, -10630044, 3679176, 6128919, -2203318, 809064, -2944200, -337155, 4865661, 8762807, --2463164, -4432406, -1257889, 4054986, 905164, 8910983, 4269735, -1020592, 1318018, -118648, --4162897, 781147, -906775, -1351841, 3946001, 5094368, -8094403, 9328132, -7113540, -3937411, -1622961, -2945274, 4752918, 69256, -2686502, 6573985, 9316858, -6972880, -1220845, -729071, -2905009, -6605123, -10765336, -5088463, -3272228, 3122441, -7457137, -4376035, -843424, 7700340, -4905390, -5459441, 3892314, 1998234, -2914672, -4497368, -674847, -2789045, -3140158, 266288, --2079301, 5742372, -4358855, -971736, 4940823, -3951370, 5338108, 6287296, 895501, -714575, -589484, -7897908, -6927246, -1797444, 4401268, 129386, -3016678, 2828773, 6473590, -4353486, --1966021, 1693828, -546535, -3111704, 18790, 765041, -2922725, 98784, -779000, 1265405, -428960, 2268280, 360777, 1767379, -1126355, -545998, 124017, 149787, -82678, 1575179, -740882, 1847910, 1864016, 117038, 585189, -339839, 1219234, 1884954, -958851, 4788352, -3872987, 5229660, -5054103, -6660958, -3618510, 4541391, 192200, 18772766, -1446867, -456877, --4552129, -8478802, -12486544, -2750390, 4082903, 6600291, -4150549, -7981123, 998580, 71404, -7962333, -2677912, -3318936, 9877351, -5424007, 642635, -7660074, 4879620, -1571958, 37581, --1738925, -11602854, -7326141, 615254, 6390375, 4303021, 475668, -12023224, 7934415, -4860293, --5008469, -5189394, -6924561, -1079111, 6484327, -5331128, -5919539, 4030827, -1970316, 2313377, -11978127, -5256503, 206695, 593779, 5055177, -3565897, -3315715, -1666984, 7590818, -1728724, --4089346, -716186, 5905580, 7740605, -7743289, -8747775, -3030636, -1300301, -2985539, 1853278, --6196564, -2175401, -5852430, -11557220, -4623533, -2675228, 1476395, -10629507, -3007014, 159451, -7454990, 220117, -6600291, -128849, -338229, -2005750, -3682398, 159988, 1482301, -695785, -1080184, 1053878, -1510755, 2158758, -962073, -2158758, 2276870, 2871723, -1315334, -2758980, --156229, -543850, 411780, 2298881, 788127, 39728, 1549946, -878321, -1459215, -1111860, --1594507, 2281702, -6159520, 5224828, 6305549, -4629438, -5682242, -4741107, 2550674, -449361, -9153649, 16037945, -9019431, 623844, -407485, -1086627, 1457605, 4660577, -13178570, 11833709, --9296994, -4555887, 11848204, -2722473, -5715528, 3964255, 4356708, 292058, -698469, -9144522, -5690295, -1282585, 1953673, -6044630, 7532299, -669478, -12685186, -13481365, 4478577, -2454037, --7012071, 3448322, -615791, 20946018, 3473018, -3803194, -6267431, -12313671, -4414153, 2419140, --3041911, 9658308, -2079301, -14345728, -1431298, 9903658, -4357245, 1318555, 8496519, 5789616, --4886062, -881542, 6871411, 9259949, -4255239, 1829119, 1276142, -4430796, 1958505, -2028298, --661962, 1400696, -2193118, -2577517, -8946954, -9713069, -8275328, 8233989, 4540318, 5372467, -2216203, 86973, 3229816, -7080254, -3973382, -9918690, 4889821, -1232119, -1420560, -1998234, --1530082, -5047661, -3059627, 1064078, -2110977, 330176, 333397, 381715, 1901597, 278636, -2291365, -230854, 1675574, -2284386, 1272384, -3438658, 239444, -1618666, 2835215, 168041, --1885491, -512712, 856846, -1461363, -1740536, -4020090, -4126927, -2221572, 4079145, 308701, -1400696, 2636036, 767725, 3193845, 1175747, -2578054, -10765336, 4109747, -11618960, 490163, -4169876, -1830730, -8706972, -4035659, -1811403, 7796977, 6117107, -4580046, -4827007, 8310762, -3405372, -4753455, -5216238, -3995930, -594316, 8035347, -1404991, 762357, -493921, -62277, -10226854, 5128191, 6838662, -447750, -543313, 3579318, -5353677, -8910983, 7268696, 11795054, --7993471, 10144176, -3002719, -992137, -4569309, 5242545, 285615, -5630166, 3414499, 9592809, -7448547, 3485903, -7213398, -2914672, -14570677, 2445447, 7543573, -4643934, -1197222, -5727339, -1477469, -3398393, 5615133, -3562139, 1854889, 6763500, 3814468, 12717398, 6612639, 4318590, -8091719, -6783901, 12158516, 3797288, 7383586, -2408940, -8419747, -12926241, -2482491, -2148021, --3401614, -3015604, 4803384, -8879845, 13447543, -2285996, -10909754, 6229313, 10048076, 4201015, -1281511, 2126546, 3762391, 1302986, -2246268, 2609730, -2058363, -10737, 4214974, 8053, --170725, 4648229, 652298, 2557653, -395137, -2150168, 697395, 475668, -1854352, 1464047, -1889786, 522912, -1321239, 1133871, 383863, 3600793, 790811, -635655, 2268817, -3054796, -901943, 716723, -3343632, -4875862, -1362042, -1898912, -1249836, -2410014, -1701344, -1006096, --408022, -4194573, 5928666, -12702366, 9327058, 3338800, -2005750, 13963476, 10668162, -17534740, --11868605, 11210402, 19021874, -1669132, 2756832, -1527935, -2465848, -1808181, -845572, 4932770, -2822331, 11640435, 2791729, 11145977, 3071975, 4914517, -1542967, -6125160, 2636573, 980863, --5129802, 8568997, 833761, 3511136, 1940788, -1622424, -7868380, 1149441, -8919573, -2869038, --10315975, -6749004, -4185446, 8784282, 1213865, 4400731, 10566693, -4435091, -901943, 1390496, -3787624, 1296006, 246961, -2820183, 7826504, 17426292, 8301098, -13590887, -9808095, -10014790, -11924440, -1646583, -11051488, 6618545, -6193880, -507343, -1806571, -597000, -847719, 552440, -10464688, 17468168, 6546067, 15072651, 9560060, 5013838, 1950989, 3939559, -4779762, 16041166, -5146445, -8121247, -11116449, 5115843, 3683471, -2849174, 7965017, 15193984, 3483219, -5579163, -9366250, -663036, -6838662, 1641214, 5268851, 1071058, -875100, 818191, 2912525, 5281199, -2282238, 2470143, 615791, 3532611, -1353989, -410169, -1899449, -316754, 6962679, -3426847, -2609730, -835371, 1702418, 421444, -1787780, 1287953, 2509335, 3271691, -1369021, 1498944, --2728378, 192737, 1454383, -4723927, 2190970, -1402307, -6971269, 1814087, 17370996, 3103114, -6213207, -5700496, 4579509, -8656507, -14811732, 159451, 8139500, 2203318, 6561100, 8839580, -10069551, 398895, -10712185, -9406515, -14235669, -22440668, -259309, -2876554, 9962177, 7113540, --8227547, -4853850, 5890548, 11435350, -14443438, -9599789, -2682744, -8182987, -5320928, -3188476, -4619238, 8827768, 517544, -5699959, -6635188, 8919573, -7187628, -3285650, -114354, 12637941, --801548, 836445, -20078436, -1743220, 5022965, 10146323, 13567802, 2680060, -12905840, 5908802, -348429, 5878200, 8568997, 1199370, 4345970, 9517111, 17111150, -11558294, -4399657, -1231582, -5289789, 17886392, 7699803, 5815923, 10231149, -3728569, -5924908, -11121818, -13645111, -8377871, --473520, 8549669, 20232518, -12832289, -9197136, -1541356, 19835232, -11329050, -6386080, -10147934, --1776506, -9123584, 2878702, 1435593, 4748087, 10251013, 1976222, 6471442, -4335770, -4596152, --5570573, 187905, -2799782, -6824166, -5857262, -3140158, -1527935, -1633698, 6698002, -5279052, --1498944, -2160906, 4787815, 924492, 3488587, -2537789, -2279017, 4496294, 1588601, 977642, --3997541, 5870147, -3117610, -456877, -2182917, 1663763, -2268280, 343061, 4035659, 4595078, -785442, 8810589, 5194763, 12465606, -14782741, -10794327, -1532230, 21734146, 8974334, 398358, -11963095, -7532836, 17886928, -4335233, -15487115, -3190624, -15393163, 12434467, 7636989, 4772783, -5009543, 115964, -4875325, 5922760, 9176198, 4392141, -3076807, 7951595, 10963978, 9554155, --1133335, -8648990, 14818174, 3274913, -829466, -2672544, 1840930, -9820980, 9630390, -2016487, --2592013, -12469901, -6616397, -7781944, 17249126, 5914707, 232465, 2049236, 8933532, 12545599, -6556805, -16738024, 15066745, -2002529, 8727374, 3472481, 13235479, -3265786, -17259862, 5182415, --767725, 6910603, -3051574, -7315403, 6445136, -3005403, 4374424, 21512954, -2636573, -10275709, -56371, 2604898, -10562398, 17278654, -7804493, -10843182, 15471546, -9276592, 7884486, 777389, --11226508, -8242579, -11232950, 3264175, 9381282, -5873905, 5426155, 10139344, -5810017, 7070053, --2419140, 12043088, -4401268, 3396246, 3988951, -3668976, 14496, 197032, -5625334, -1008244, -5065377, -8128763, -1554241, 5476620, 2910377, -110595, -4842576, 2107755, -1337882, 1651415, --5070746, -5158793, -2778307, 739808, 1188632, -6156836, -3718368, 5180805, 660888, 2092723, --6019934, 2423972, 461709, -3007014, 1122597, 534723, 1867237, -3486440, 168041, -1864553, --403190, -5010616, -2018098, -712428, 3131568, -1147293, -3257733, -2005750, -714038, 689342, -547608, -1221918, -41339, -6713571, 5143760, -14874009, -2648384, 7292855, 2028835, -14554034, -3954054, -5403069, 10606959, 2054068, 5551782, -23993298, 7436736, -14496, 9376987, 14725295, -1043677, -2370285, 1505923, -8106751, 15644955, -15094126, 5008469, 8813273, 6573985, 8080981, --3652870, -7507603, -7951595, -15602542, 6248641, 1857573, 9069360, 15639587, -5829881, 13347148, -7757785, -13760538, -7332583, -657130, 1695975, 258772, 122943, 6376416, 12089796, 10510859, -4878546, -28257664, 7122667, 7809325, 8475581, -18776524, 11332808, -9860708, 9866614, 694711, -5328444, -2949569, 7462506, -2681133, 23885386, 10893111, -10334765, 863825, -29477972, 4529580, --8521752, -9461813, 8586713, 5537287, -14695767, -30041148, 18942954, 11061688, -27533424, 10409927, --6043019, 10187126, -2091649, 2116345, 4586488, -137976, -18471044, -7418483, -2473364, 5509906, -61203, -5153424, 8106751, -10424422, -3706020, 9977746, -660351, -1319629, 3856881, 1753420, -4326106, 1453846, -5331665, 1902671, -8094403, 4776541, -3403762, 2558190, 2462090, -2615635, --1018981, -1898912, -2712809, 1136019, -4534412, -1156420, -3799972, -3393561, -6433861, 3052648, --1735167, -2161979, -3586835, 1393180, 3603478, 1832340, 2077690, 279173, 1258425, 2157147, -107911, 2373506, 2576444, 6027450, -3139084, 9024800, -3244311, -6220187, 11126113, -8541616, -300111, 1421634, 28242632, -4010426, 20457466, 4787815, 15460809, 772020, 4577362, 4755603, -27245662, 26883810, -13761612, -12972949, 15693274, -19806242, 243739, 5115843, -19326280, 10948409, -1807108, -1748589, -3318936, -6146635, 2597918, 1924682, 3908957, -12199855, 343061, -3114388, --15555298, 7882876, 11256036, -17834314, -12893492, -6633577, 9773198, 9069360, 9106404, -1129040, --3323768, 8127689, 28389734, 14990510, -5277441, -3838090, -3571265, 18818936, -14922327, 6845104, -4292283, -23856396, -9548249, -1234803, 3495030, -20243792, 14099841, 8838506, 4304094, 3656628, -9866077, -19176492, -2026151, -15933255, 979789, 9627706, 16748225, 9978283, -10136660, -5698885, --544387, 394600, -11684459, 26616450, -1841467, 3409130, -6025839, 9030706, -1749662, 5219996, --2135136, 3189013, 2811056, 5677410, -387621, -47245, -1888712, 1237488, -117575, -1649804, -8195335, -2497524, -5526013, -475668, -350577, 3901978, -5633387, 1219234, -4617627, -7860864, -5077725, -1566053, -4968741, 300111, 208843, 789737, -4332549, 6047314, 1917703, 7456600, --9050033, -768262, 4714801, -2480344, -7284265, -254477, 8522826, 3590056, -4947266, 5064304, --2439542, 12828530, 20110110, -1480690, 1387811, -12489228, 1126892, -632971, -8781598, -14897094, --2759517, -6944962, -11014981, -8200703, 12633646, -10726144, 9184788, -3294777, -2457795, 17489106, --12087112, -6877854, 2767033, 7002408, 1112933, -23343684, -14214194, 2571612, -3671123, 3684008, --3179887, -7388418, 14898168, 3086471, -1208496, -6178311, -33374044, 19994684, -5982890, -454193, --2780991, 1189169, 9652402, -5659693, -9061307, -15699179, -1409286, 6802155, -9574556, -12458090, -5160403, 19548006, -3273839, 18173618, 13506598, -13458817, 24646670, 16164109, -16157130, -25142738, --7148436, -11008538, 1399086, -8028368, -1890859, 11910481, -20893406, 10172093, -3350075, -11861089, --13092134, -13220446, -15858630, 3226057, 9604621, -8638253, 13701483, -1865090, -7913477, -16500727, -319975, -1928977, 6397354, 19497004, -7030862, -14929306, -5128728, 343597, 5086852, 13316009, -3575560, -1748589, -10935524, -170725, 459562, 4898947, 2122788, -60130, 3752191, 5404680, --4068945, 6769406, -3905199, 3053722, 8005282, 7089918, 482110, -11305965, -4566624, 1625108, -2811593, -7885023, 12706661, -7760469, 5830418, 6764574, -5156645, 601295, 1431298, -3047279, --10697690, 2203318, 4858682, 775778, 9057549, 6215355, -6099391, -5926518, -1561758, -21211770, -38613904, 54385024, -5261872, 6642704, 3474629, 13187160, 26347476, -25144350, 288300, 4379793, -485868, -9054865, 1347546, -11191074, 13221520, 32408212, -6848326, 717796, 1838246, 9833328, -890669, 3825742, 12447352, -24930674, -1867237, 24507620, 25149182, -29377040, -6245420, 4254165, -4134443, 8776229, 22136262, 6254546, 44656924, 7459822, 13779329, 6605660, -7019051, -9240085, --536334, -31314070, -45086420, -15237470, -14632954, -46942920, 7352447, -1090385, -26234198, -12774306, --43947180, -4779225, -6050535, 29981556, -29350196, 18337900, -20055350, -1605781, -13189308, -10380399, -11783780, 26948772, -20744692, -7753490, -1881196, -6109054, -2201171, 11387569, 21583822, 23077934, --16444893, 46385648, 31091268, 4086662, -17579302, -38101728, -8653285, -14157823, -10411538, 2556579, -12247636, -7963406, 4567698, 14432164, 2334315, -4522601, 14619532, 9781251, 5012764, 6461779, -15348066, 15531139, 119722, 1316408, 6207302, 5855651, -2528662, -4559645, -2652679, 2887292, --382252, -1894081, 966905, -3022046, 2138357, 10157061, -436476, 3626026, 12323872, -3157338, --4420058, -4649302, -525597, -6774237, -1380295, 5917391, -3207267, -1795296, 1178969, 119185, -1049046, -891206, 4846871, -3200825, -3400540, 8069707, 5644661, -6136972, -326954, -3239479, --1338956, -19384262, 35533340, 59230820, -13942001, -2991982, 10507637, 26533234, 8917426, -15357192, -9636296, -13113609, 3410204, 8415988, -3176128, -17702244, 5338645, 18909130, -4704600, -26976690, -21142514, -6163278, 17257716, -6347425, -4265977, -6624450, -10926934, -397821, 19166292, 10748156, -3170223, 15540265, -7364795, -6105296, 5905043, -8241506, 10725607, 6294275, 16408386, 28161026, -24640228, -17710834, -33050310, -12032351, -2084133, 25891674, -9910637, 4631049, 10417443, -10222559, --15241228, -24334210, -25034828, 19740206, 21006148, -16763257, -60244432, 5005785, -4258997, -8231305, -4657892, -5981816, -24184960, -11258720, -5691369, -16769163, -7210713, 25654914, 9681930, 14795089, --5822902, -8369281, -5473399, 14266808, 2363306, 2684355, 12221329, 35568236, -3138011, -5213554, --17995376, -16977468, -24837796, -2663417, 13990319, 9579388, -10166724, 7421167, -4723391, -5892695, --10394358, -9415642, 8512088, -7292855, 8300025, 3918621, 4660040, -5314485, -7797513, 8704825, -5333276, -2200634, 6519224, -9131100, 3757560, -1258962, 5349919, -3035468, -5290326, -2970507, --2670933, 6102612, 2946348, -314606, -6498823, -1546188, 12715251, -9218074, -341987, -8957154, -10885595, -5970005, -2587181, -8283918, 1058173, -3577171, 1051730, 9261023, 9250823, 1882269, -6442, -3643743, -7090454, -7795366, -988379, -12766790, -1695975, -10555419, 5692443, -14934675, --24370182, -5350993, -4024384, 4525822, -8276939, 18822158, -11135240, -38323992, -20713554, 13285408, --18001282, 21321292, 19088446, -8385387, -2826089, 2788508, -11620034, 90194, 6303402, -1632625, -3464965, 27009976, 22555558, -5953899, -35655744, -27057220, 2094870, 18977850, -14283451, -6123550, --16797080, -21575232, 2071785, -6052146, -25267292, -27555436, -40414568, 16338056, 5664525, 943819, -23439784, 31389768, -1148904, -23371602, -17701170, -18894634, -10625749, -6659347, 7212861, 12182138, --10741713, -17199734, -20960514, 11203422, 9904731, -20641612, -19621558, -7879118, -3349538, -12037720, -7556458, 50834160, 30593588, 59361280, 19929186, -31523986, 37056440, -1610613, -18835580, 1832877, --17727478, -38924752, -16008954, 8913668, 18655190, -4403952, 17193828, 9849971, 37875704, 41193032, -34015068, 11216307, -9435506, -6018323, -5499169, 7136625, 9680856, -14381161, -5208722, 2305861, -30904974, -4361003, 2753611, -3428458, 11237782, 11137924, 13264470, -752693, 349503, 129386, -2954401, -1300838, 1953136, -11329050, -3507378, -3947612, -10436234, -10982231, -4940823, 3840775, -13117367, -8535174, 2053531, 4458713, 14892799, 19931332, 13809394, 12696997, 14358076, 3031710, --5276368, -11153493, -15815143, -19906100, -15502148, -9334038, -18699750, -19221052, -7318088, -3510599, -1841467, 8356396, 35492536, -20204064, 2423435, 10290205, -4346507, -26334056, 26638998, 25226490, --14461155, -20158430, 2857227, 34974992, -18282602, 9899900, 22591528, 6784438, -8348343, -16852914, --10901701, 7693360, -2556579, 5844914, -9716290, 6465000, -21656298, 31768800, -2971044, 7077033, --1395328, -40217536, 12617540, -11184095, 20809116, 12399571, 22226456, -8704288, -38603168, 27733140, -12622909, -13224741, -23991688, 19866908, 10787884, 21132312, 21505438, -18723910, 8696772, 22307524, --32681480, 29990682, 14898705, -1010928, 9666898, -17061220, 37749004, -4299799, 24880746, 11065446, -43815644, -3120831, -7553237, 6099928, 17890686, 11747809, 12486544, 44095892, 2703682, 10738492, -25913686, -17113834, 17818208, 2042794, -29250874, 10880226, -9783399, 33158222, -24348170, -29445222, --30478162, 26079578, 43011948, -13744432, 11033234, -50634980, 4936528, 2389076, -1818919, -23738284, -4074313, 9978820, -7708930, -6558952, -6246493, 15980500, 7626788, -10152229, -10790568, -6335614, --2461016, -3208878, 4711043, -17479980, -10341744, 9230958, 3941169, 3262565, 674310, 7951058, --1247688, -956704, -10130754, 13709536, 17252346, -7354595, -26554710, -18046916, -78920, 9127, -5232344, 1330903, -8292508, -13127031, -7080254, 4931160, 7823820, 21364778, 7351374, 1110249, -481036, -15941845, -3146064, 16558710, 9915469, 3756486, -17255032, -10561325, -1842004, 2396592, -3142306, -2857227, -3169149, -3046743, -1017370, -64887292, 3540127, -7940858, 2005750, 50253264, -41349260, 59509456, 31411780, -15817291, -12132746, -24645596, -32875828, 11576011, 2872260, 8637716, -10438918, -9566503, 14949707, 25380572, 4654671, -6784975, -8606578, -17961554, -11959336, -10851772, -4950487, 8092256, -25818122, -15255724, -3569655, 17326434, -7825968, 11164231, 13845364, -36658620, --36141076, 6867653, 10464688, 8060043, -27282170, -12526272, -24504400, -11843909, -11222750, 23639500, --31056372, -43218108, -16258599, 8590471, 7347079, -33331094, -26781806, -21029770, -15944529, 18034030, -25396678, 1160178, -8630200, -10538776, -5892159, -5612986, -11478300, -36998996, 12175695, 27821724, -25271050, 7880191, 34517580, 46693272, -4066797, -5992016, 35743792, -8644695, -21752936, -49155900, --16746614, 6709276, -26980984, -18053896, 12642236, -4408784, 17529372, 30673046, -18663780, -28956670, --9588514, -12419972, -7188702, -7852274, -7793755, 3271691, 4451734, 3593814, 6244346, -10396505, -9086540, -14364518, -1719061, 8947491, 11985643, -12834436, -17912162, 10271951, -4075387, 672699, --12499429, 14795625, -8651138, -3105798, -3437585, 13695577, -11574400, 14857366, -6580427, -6920266, -9833864, 2600603, 7835631, -6186901, 705448, 2921115, 16018081, -1863479, 3813931, 2448668, -42769820, 14813879, 3596498, 15415174, -17520782, 1008244, -8879845, -13342316, 8027294, 2972117, --10880226, -18460306, -10392747, -17144436, -13696651, 5446019, -10536629, -5333276, 8138426, -5406827, -1950452, -6001143, 21330418, -16691854, 17512192, 6194417, 2095944, -16146393, -6771553, 12683038, -5322538, -399969, 10357851, -1920924, -4105452, -6672232, -5405217, -4505421, 2047626, -187368, -2279017, -18889804, 10004053, -7958038, -7237020, 6451578, 4621385, 2357937, -3422552, 13086228, -11469173, -16542067, 14839112, -2157147, 10103911, 19757924, -4051228, 10649908, 10351408, -9970767, --6922414, -13256953, 1291175, 2168959, -20989506, 8614094, 3314104, 16335371, -6360310, -37526204, -23579908, 1327682, 791348, 387621, -16413218, -5316633, -4243428, -5683853, -23972896, 13621489, -7009387, 14697915, -10621454, 6414534, -11927661, -11082626, 614717, 9292699, 7692824, 147103, --1272384, -3479997, 943819, -5626407, -1027571, 15858630, -6376416, 3068754, 1843078, 4429185, --9685151, 10519986, -282931, -2129230, 2601140, -1165010, 2543695, 3451006, -8799314, -1337882, -266288, -1784559, -1524713, 4756140, -5583458, 6991133, 10435160, 3777961, -6332393, -443455, --1237488, -6128382, 7640210, -2215666, 4224101, -21919366, -62270584, -92581776, 19445464, 72807752, -3032784, 199248368, 183653872, 126211376, 217002144, 166987792, 22740778, 3670050, -22470732, -159005056, --162226288, -123272000, -212496192, -198096784, -56603372, -66004520, -66791036, 16040092, 40320616, -33024004, --10969346, 63917704, 40711460, -2005750, 47518444, 33067490, 2600066, 39894876, 94101120, 62035972, -21686900, 96520800, 71417792, 5821828, 82902536, 112423992, 27103392, 12426951, 114599928, 31636730, --44354128, 57919244, 88340496, -44715980, 20807506, 123517888, 11934640, 20704964, 148954304, 117231672, -10130754, 93106304, 123263952, -42315628, -25018184, 35402340, -100315400, -167685728, -113138568, -184944512, --275041664, -252482880, -282558368, -359865632, -379836704, -335857312, -355050464, -334266560, -250948496, -200242656, --104154568, -25547002, 59547036, 206740400, 240424752, 261096432, 404728192, 395810752, 265839680, 342253600, -267487872, 106807248, 117899000, 166618432, 81725176, 53551800, 124588408, 89133992, 34897, 43069932, -96990560, 24721294, 7309498, 72571528, 17215302, -74132208, 24845848, 59620052, -16561931, 53494356, -141102560, 56387552, 32256278, 124423056, 68181536, -23490250, 15188615, -31150860, -147449456, -180670480, --179578496, -226562752, -256128768, -211626464, -203476224, -232034000, -209368912, -172856864, -199311712, -182270352, --122523608, -97215512, -93071408, -37611028, 23305030, 27693412, 84810568, 142653040, 149935168, 148343344, -167416752, 154850752, 111055504, 94422168, 84240952, 58566176, 48063368, 58958628, 52546240, 35993972, -37462316, 40967544, 34855808, 34154116, 43625592, 38706784, 27765352, 22590992, 20430622, 4173635, --489626, -4534949, -23651848, -31689342, -29700772, -24758876, -20713554, -12610561, -6129992, -4858682, --1035087, 8396661, 15714212, 20591146, 20397874, 15481746, 10465225, 3863860, 504659, 2094870, --646929, -7282117, -7663833, -11727408, -21264384, -23551454, -22730040, -30462056, -33054606, -29459180, --33467996, -40246528, -38121592, -39270496, -43537008, -39448736, -32984276, -34570192, -31143882, -21017960, --16655346, -15013058, -4287451, 1824824, 3566434, 10093710, 18613852, 20052666, 20989506, 25605522, -24881820, 22650046, 25964688, 28469728, 28781112, 29753922, 31833224, 28978144, 27445914, 27710592, -27968828, 23694798, 20343112, 14875082, 7696045, 2243584, -348429, -2251100, -4105452, -5951751, --6847252, -7295002, -6856379, -6018860, -4859756, -5222144, -4800700, -4476430, -4283693, -4244502, --3267396, -2863670, -1982127, -1400159, -297427, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ -3746822, -5185636, -3051574, 214212, 162135, -3712999, 4958003, -1981054, -1947768, 1418950, -5130339, --2297808, 5481989, 1245541, -2247342, 3900367, 1198833, 832687, -814433, 1899986, -43487, --6572374, -324807, -2441689, -307090, -148176, -6301254, 92342, -4056060, 214212, 621160, -2801393, 3343095, 1101122, 818728, 609349, 2885144, -1596117, 975494, 177167, 438624, -597537, -888521, 2583423, 3859028, -7456600, 3441880, -1957431, -4498442, -2874944, 5695127, -2855080, -1950452, 3234647, 923955, -2059437, 1992328, 32212, -24159, 287763, 368293, --788127, 20938, 410169, -352724, 2443300, -1551020, -3453691, -3357591, -34360, 1096290, --225486, 134218, 1864016, -766115, 3282429, -3511136, -1055488, 2655364, 2879776, -2019172, -3247532, 1119913, -862752, -2231773, -1039382, -970126, -896038, -902480, -453656, -155693, --499290, -950798, 259846, 627065, -1331977, -376347, -443455, 646929, -1162862, -294742, -139586, 2728378, 236760, -2245731, 1416266, -1228361, -1732482, 394063, -3686156, -486405, --2755759, 934155, 1767916, 1629403, 1357210, -2946348, -179315, -2450279, 2598992, -5007395, --2791729, 2456185, -5415417, -663036, -338229, 1337346, 1212791, 2621541, 5661304, 2551211, --686658, -71941, -2003602, -1628330, -9951976, -9232032, -601295, 6734509, -1675037, 5366562, -485868, 1491964, -1677722, -7774965, 3998078, 1159641, -2313914, 1838246, -4083440, -896038, -2321967, 956704, 7238631, -5028870, 4392678, -2341831, -5695664, -2713883, -1552094, -1633698, -2018635, 1633161, -4594005, -2119566, -2617246, -1047972, 4434017, 4662724, 5090073, -3805341, -634581, -2414845, -310311, -2043868, -2515240, -3126199, -3427921, 1814624, 535260, -604517, --1248225, 374736, 1923609, -2041183, -1728724, -959388, 2202245, -846109, -426276, -1044214, --1123671, -359704, 476205, -110595, -193810, 285078, 475668, -227096, -222801, 1328219, --1125818, -790811, 530428, -770947, 1078037, -773631, -772020, -240518, -154082, 594853, --375810, -435939, 390842, -2684, -1130650, 266825, 238371, -933082, 3661460, -3466576, --4581657, -3891240, 70867, -1512365, -1299765, -3069828, 631897, -3434363, -294205, -1388348, -5291937, -3389803, -3803731, -8351564, -10936060, -2594160, -4897337, -4424890, -1106491, 2298344, --2805688, -6495601, 4015795, -9439801, 2811593, -1550483, -1741072, 6174016, 4287988, 2310693, -813359, -1014149, -1010391, -2263448, 959388, 4203699, -3380676, 3988414, 3615289, 1102196, -511638, 1685238, 2764885, -6123550, -2699924, 5921686, -4582193, 427349, -114354, 3639448, --471373, -1326071, 661425, 6143414, 3360275, 2166811, 1952063, 3443490, -5400385, 4205310, --4409321, 3897146, 2526515, -1097364, -782221, -1787780, -2421825, -3876208, -206695, -1178432, --3132105, -3414499, -1953136, -1967095, -354872, -186831, -952946, 4678293, -1915555, -820339, --3149822, 3257733, 16643, -662499, 682900, -1301375, -2267743, 98247, 1282585, -104153, --217433, -1424319, 428960, -438087, -1320703, 135291, 301721, 779000, -159988, 528281, -412317, 1136556, 386547, -1137630, 61740, 663036, -160524, -991601, -638876, 1575179, -804233, -774168, -344671, -277562, 2230699, -5818607, -93416, -2754685, -5258651, -2512556, --943282, -3744138, -1206349, -3458523, -1289027, 2637647, 3655017, -6039261, -3367254, 1912334, --1153199, -6595459, 4392678, 7744900, 1672890, -1888712, -3606162, 810138, 3803194, 6999186, --3548717, -1547799, -4484483, -3679713, 3934190, 3857418, -5451924, 3167539, -1719061, -3557307, -5579163, -71941, 3058017, -7654169, 555661, -4929549, 1134408, -6111202, -3768297, -1049046, --1381906, 12560632, 4036733, 3211025, 2493229, -9460202, 5284421, 3592740, -2047089, -300111, -4125316, -646929, 4356708, 4945655, 5011153, -2958159, 391916, -1681480, 2678986, -2437394, --2480881, 1581085, -2329483, 1042603, 1584306, 15032, 2959233, 1091995, -5550172, -746787, --688805, 1677722, -6295349, -2105608, -1582696, 4378183, -1336809, -817118, -3395172, -980863, -241055, -399969, -1572495, -33823, -1015760, 1070521, 424128, -72478, 200790, 341450, --802085, -2434710, 1260036, 439697, -1338419, 565325, -726386, 192737, 302795, 753230, --177167, -373125, -578747, 447213, -961536, 824634, -1096827, -151934, -81604, 636192, --725850, -382252, -1059246, -715649, -977642, -7853885, -4316442, 3153580, -3380676, 9120900, -4070019, 8927626, -99858, -4430796, -4638028, -6342593, 9614284, -2393371, 4410395, 4844723, -1045288, 3396246, 3157875, 2997350, 1243930, -6375879, -331786, -2495376, -919123, 4285841, --366146, -440771, 3048890, 1855426, 3155727, -2804077, -9953587, -6008123, -3757560, 7290707, --6617471, -2066416, 4519916, -565325, 855772, -5628018, 9678172, 467078, -3746822, 7568269, --4671851, 11756936, 6121402, -2729989, 1381369, -3430605, -2289755, -10951630, 3870303, -5024575, --760209, -491237, -2374043, 4599910, -1811939, -4820027, -4625143, 1011465, -4225711, -4730370, -2669322, 344134, 3366181, -1889786, -9934259, 3364033, 4323959, 5486284, -5344550, -6088653, -786516, 9781788, 1588064, -5164162, -2332704, -934155, 2702071, 421444, 2876554, -2970507, --1100585, -641561, -3566434, -2990908, 4376572, -802085, 1714229, -453119, -1251983, -2859911, --273804, 37581, 1082332, -592706, 1005022, -794569, -2276333, -981937, -323196, -124017, --420907, 1634235, 84289, 1774895, -636192, -203474, -301185, -2081985, -21475, 970663, -1024350, 628139, 7793218, -7162932, 3532074, 9347996, -6763500, 1925219, -3839164, -7182259, -10679973, 4118337, 9920301, 9311489, 1272384, -7259569, -4581120, 3911642, -555125, 1687385, --8031052, 928250, -14210436, -5844377, -11099806, 6896107, -6336688, -129386, 1959579, -1726040, --2924336, 3443490, 3287261, 9875204, -1428614, -2070711, -7552163, -6295885, 6181532, 1443646, -2091112, 11794517, -3599183, 183073, 6164352, -2691334, 2819109, 2247342, 6170795, 5708549, --3937948, -503585, -7994008, 8364449, -5476084, -7058779, -6944425, 4469451, -2608119, -3668439, -8079907, -2423972, 8378408, -5077725, -3994857, -967441, 5472325, 7270843, -588947, -7618735, -2748779, -4828617, 10020696, 2200634, 5869610, -7982197, -3617436, 2285460, -2117419, 4996121, -681289, -2638721, 2881386, 6586333, 9084930, 7158637, 70330, -1529545, -144955, 1643899, -107911, -1458141, 1038308, -1207423, -255014, 2727841, 106300, -1152662, 2755222, -763967, --1513976, 857920, 945967, 79994, -1780801, 776852, -1234803, 384936, -2411087, -2805151, -707059, 1248762, -113280, 2422362, -853625, 1174674, 4718022, -12399571, 4350265, 3636227, -2503966, -9381819, 7175817, 11732240, -11435887, 4339528, -7015829, 4594542, 665720, 4125853, --3360275, -287763, 2754685, -7842611, -3831648, -3396246, 6229313, 6469832, -2087354, 3025268, --1542430, 4775467, 6175626, 2363843, 1899986, -6237903, -2282775, -7783555, -8545374, -6035503, -628676, -2901251, -350040, -3615826, -8506720, -2923262, 1796370, 754304, -467078, 12933220, --10432476, 3845606, -5168457, -1532230, -3200288, -3321084, 5561446, -3305514, 476741, -3999152, --2600066, -4853850, 6666326, -6096169, 5479842, -1429687, 5475010, -508954, 878858, -577673, -5295158, 3010772, -91805, 11223823, 507343, -5644661, 3021510, -5078262, -6158446, -7509214, -7353521, 2567317, 6558415, 6611566, 7828115, 4553739, -870268, -1401233, -1337346, 7461432, --1031866, 8368207, 1852742, -365609, -1211718, 2866891, 4333622, 1109712, 1821603, 583042, --498753, 830002, -1337882, 2248952, 172336, 1928977, -503048, 1831267, -126165, -2927557, -1522029, 2013803, 69256, 1639067, -444529, 93952, -1620813, 1417339, -332323, 695248, -3179350, 3192771, -13077639, -939524, 1593433, -2913599, -10316511, 11792906, -846645, 523986, -9853729, -2688113, -10320806, 3703336, 6620692, 12789876, -899796, 5460514, 1015760, -11077794, --3364033, -5712307, 5610838, 3340948, 2895345, -4082367, -839666, -370441, 949188, -3676492, -5227512, 1574106, -4567698, 6663105, 856309, -7232725, -6230924, 1823214, 7870528, 7232725, --10009421, 19568944, -1027034, 479963, 5293011, -658741, -2612951, -57445, 12450573, -6140193, -6131603, -1387811, 8605504, 2732673, 7710003, -2823941, -6150393, 4435091, 6589554, -3161633, --7462506, -7933342, -7145752, -3079492, -1472637, 7536594, 147640, 6571300, -805306, -1977833, -6350646, -5422396, -10789495, -2712272, -6896644, -6316823, -11989401, 9082782, 7766912, 3359738, --18576270, 4524748, 3893925, -1224603, -557272, -6306623, 8857296, 4711043, 3503620, 2341831, -8137890, -532576, -586263, 780073, -84289, 2073396, 925565, 220654, 2500745, -1317481, --330176, -1731946, 566936, 837519, 2762201, -1729798, -287226, -559420, 2136209, -782221, -807991, 1456531, 1719061, -1265942, 4094715, 197569, -96637, -1287417, 1620276, -2335389, -933082, 322123, -622233, 1110249, 2019172, -169114, -3582540, -1018981, -475668, -7545184, --358093, 430034, 5530844, -7934952, 535260, -1342177, -3111704, -16325708, -1822140, 7502234, -6043019, 7690676, 1042603, -8839043, 23117662, 9528922, 15764141, 1494112, -6710887, -2869575, --2088428, -9892383, -483721, -3965329, 5028333, -109522, 635655, -3262028, -4043712, -8386461, -2907693, 678068, 532576, 4122095, -226023, 1672890, -697932, -7304666, -5442261, 4202626, -149250, 10306311, -13073344, 10427644, 6600828, -4792647, -9420474, -15036681, 3272228, 11629161, --5900748, 11252277, -774705, -641561, 2734821, -3476239, -13110925, 1454383, 6370510, 2655901, --5630166, -1637456, -3489661, 2792803, 6529424, -469225, 1751273, -1003949, 6288906, -2899640, --1997697, 4080756, -3544422, 9586367, -2487860, -5058398, 3722663, -8935679, -4382478, -60130, -3588982, -3949223, 1741609, -1523103, 2042794, -69793, 2406256, 1864553, -684510, 1059783, --4072703, 2126009, -472983, -5769215, -1864553, -1732482, -3300146, -136902, 1072131, -2771328, --1799054, -260382, -3486977, 120259, 996432, -915365, -3699578, 199716, 20938, -2994129, -1251983, 1975148, -2250563, -287763, 750009, 90194, 1169842, 3200288, 2842732, -3000572, --2234457, 3721052, 2508798, -17737142, 12673912, 11525545, 13497472, -4332012, -12140799, 4262755, -4802847, -18053896, -16489990, 15939161, 1683090, -7770670, 5968394, -11281268, -12897787, 1835025, -33378338, 15531139, 6144488, -9084393, 86436, -3241090, 198642, -3816079, -1925219, -4239670, -1137093, 9514426, 1819992, 11730629, -4719096, -3898220, 2078764, 8192650, -1639604, -1194001, --17558364, -755914, -9921911, -539018, 13482976, 9658308, -3660923, 9438728, 18736794, -8975408, -5355824, 15568183, -11525545, 16454557, -1453846, 6758131, -3987877, 676457, -2309619, 2268280, -3733937, 16318728, -6347425, -2081985, 4162360, -7635378, 4716411, 2502355, -4472135, -7442105, -16004659, -1089311, -8929237, -2946348, 9888625, -4222490, 6681896, -69256, 392990, -10642392, --11654931, -5586142, -9956271, -8938364, -9757629, -614180, -2400887, 4675609, -706522, 824634, --981937, 5888937, 3663070, 399432, -7426536, 245887, -1475321, -5473399, -1662152, -2831457, -2755759, 1064078, -3831111, -1273995, -2964064, -2268280, -373662, 2014877, 1885491, 2059974, -3471407, -2235531, 340913, 2216203, -1674500, -2181844, 2516314, -3744675, -1577327, -1178432, -1541356, 668941, 2546379, 421444, 151398, 2150168, -1123671, -2604361, 21620328, 3959960, -2995740, -11220065, -6612102, 633508, 2428804, 4454418, 4962298, -21456582, 900333, 1418413, -15470472, 2545305, 3881577, -1420560, 14066018, -23051090, 636192, 11890617, -13839458, 3496640, -2623151, 11198053, 2115272, 1238024, -3861176, 408559, -11895986, 4052302, -3030100, 2141578, -3135326, -1977833, -9044664, 3326452, -7157026, -12268574, 6869800, -6919729, 4490389, -11535208, --7381438, -1185948, -3674345, 2801393, -5004174, 12724914, -232465, 12133819, -12859669, -10764799, --3551401, 208843, -300648, -3725347, 10800769, 8920647, 22622666, -3619584, 14437533, -8486855, --1548873, 4402879, -17330730, 19696184, -619549, 12270185, -577136, -17157320, -10448582, 7248831, --23084912, 11987254, 3207804, 17489106, 21927418, 2879239, -16427713, -12339978, -5192616, 12556337, --1634772, -3029026, 588411, -4591320, 559956, -3360275, -5058398, -1706713, -8072928, -388695, -243203, -3693135, -3439195, -4509179, -3333968, -1549946, 1876901, 3825205, 1297617, -643708, -3369939, -2411087, -1468879, 803696, 1716913, 2221572, -2373506, 2812667, -3053185, -1387274, --4395362, -7454990, 4454418, 771484, -4371740, -4283693, -966905, -5930813, 651761, 27380, --2119030, 4322348, 11087458, 16983912, 5907191, -7101192, 16158741, -17376900, -1824824, -5381057, -2119030, 13770739, -12542378, 31110596, 4100620, 7651484, -9223442, -12652974, 4306242, 25770, -26439282, -3884261, -9225053, -15228343, -10260140, 7289097, 4677757, 4221416, -1973001, -15002321, --23047868, 1620813, -13923747, 18327162, 2332704, 14860587, -9325448, 6147709, -6061810, 7642358, -21536040, -3707631, -2373506, -3386582, 5556077, 7064148, 3605625, 1457068, 2137820, 9252970, -8340290, -4995047, -7521562, -6814503, -7536057, 24578488, 9654013, -14644765, 11068131, -3446711, --11977590, -8666170, 4248260, 8893267, -17032230, -22228066, 2339147, -10018011, 28858960, 14894410, --5111548, -3465502, 6003291, 12901008, 3204583, -2394444, -4000225, -20190642, -1089311, -5083094, --21881248, 8042863, 13521631, -2410551, 6688338, 3599720, 13785234, -7865159, -2235531, 4812511, --2356863, -6502044, -7299297, -398358, -4486094, -10810433, -2379949, -5099200, 4414690, -2276333, --6059662, 3837017, 1409823, 359167, -3843996, 3818763, 892279, -6889128, 2086817, 2406792, --3339874, -9483825, -4789963, -1939178, -1242856, -367220, -3736622, -719407, -2843268, 1019518, -832687, -2080912, 154619, -411243, -3038689, -6002754, -1036698, 945430, 3041911, 1398012, --4617090, -116501, 3068217, 1240709, 1174674, -4787815, 1394791, -2016487, -2319282, -2550137, --2859375, 251256, -55835, -3093450, 1384590, -8476655, -13437879, 7614440, -4278861, 11682848, -5711233, -13160854, -5178120, -6776385, 3051038, -17642652, 12058658, 16238734, -6437082, 10042707, --2226941, -4765266, 8289287, -12424804, 7863012, 13151727, 3967476, 22850300, 11494406, -9891310, -10153840, 3966402, 8958765, 180389, 12706124, 10573136, 16924318, 6049462, -6228240, -8019241, --10018548, -1197759, 26097832, 336618, 11202885, -16464220, 34006476, -10217190, -26148298, -12707734, -21575232, 1474248, -2684355, -3128884, -1279900, 15657303, -11373610, 8980777, -2088428, 19771346, -30798674, 15503758, 14994805, -11052561, 17635672, 10286984, 10589242, 11597485, 17635672, -3813931, --30023432, -19641422, -21735218, 5513665, 8123931, 6087580, -4828080, 10054518, 27039504, 1681480, -2360085, 6329171, -1217623, -23666344, -24966644, -8829379, 5301601, 2502355, -790811, -14627048, -3959423, 528281, 1478006, 7397008, -1385127, 4636954, 1940252, 9176198, -2066416, 6068789, --4657892, 941672, 1272384, 10681584, 5277978, 10663330, 1513976, 5346161, -1647657, 1047435, -4939213, -3173444, -6762426, 1457068, -3912715, -8118025, -5974837, -1900523, -1426466, 10406706, -2507187, -191126, -2918967, 1490891, 351650, -3973382, -4029216, -3324842, 2690797, 6597607, --558883, 469225, 1149441, 2877628, 2430415, 7043747, -6949794, 4421132, 11141145, 13085692, -4728222, 6146635, 10188199, -8028905, 23695334, 9350144, 4577899, -6760816, -18182208, -7331509, -9912785, -985695, -25766582, 34693672, -12187507, -6795712, 10684805, 527744, -3468186, 2516851, --6741488, -8141648, -1785096, -18872624, 4660040, -20280836, 551903, -16077136, -18116708, -3628711, --3863860, -3968013, -13258027, 5815386, 14165876, 3806415, 10842645, -18821620, 18547816, 33830920, -3484292, -13578539, 21114596, -17328582, -27481348, 45726368, -4711043, 3251827, -3205119, -20438138, -15749645, -18526878, 7997766, 27944130, -585189, 38378216, -29971356, 28914256, 8394514, -18976776, --9980967, 3634079, -18278308, -9081171, 20293184, -19921132, 13201656, -13391171, 7308424, 21250962, --46662136, -20532092, 21430814, -39996884, 14099841, 12427488, 22846004, 20262046, 9067750, -1604707, -13387950, 20101520, -21850646, 21810918, -457414, 7565585, -1202054, 6865505, 1711008, -4111358, -1445793, -6292127, -2136209, 1671816, -1190243, -10929618, 6841883, -1893544, 8929237, 5431523, --7838316, 6182606, 7434052, 5507222, 2182380, 3959960, 2274722, 5034776, -15319075, 8608725, --2081985, -4086662, 10732050, -8617315, -7163469, 3722663, -9099425, -7247758, -2958696, -6587943, --8923868, 4964982, -13497472, -40039832, -10497974, 13196824, 30895310, -9804337, 15568720, 483184, -7320772, 16088947, 10321343, 27824408, -7243999, 1226750, 7569343, -24559696, -15884937, -7292855, --8019241, 5701032, 359167, 2124398, -12884365, -2084133, -17038136, -13768055, 6578816, 34343096, -19677392, -8983461, -11041824, 16386374, 19529216, -11632919, 5109938, 15109158, -6031745, 32848446, -11105175, 4854387, -25376278, 15653008, 3149285, 12341052, -2659659, 3209951, -4239670, -5422396, --39979168, 10613938, 27544162, 13670344, 3632469, -741956, 13859323, -22422414, -41531796, 3115462, -54919748, 13261785, 43555800, 41386304, 487479, 3639448, -26365194, -23529442, -2576981, -20180978, -27474368, -59989956, 11278047, -22457310, -47996796, 10678362, 22375706, 47951164, 4236449, 2422899, --30601642, 10004053, 14366666, -21322902, -2055142, 1537598, 22332756, -5977521, -14347875, 33927020, -7116761, -12090870, -493921, -19597936, 2532420, -18548354, -3804804, -613643, -9132711, 2850248, --7387344, -7761006, -4310000, -56908, -3758097, 6303402, 17521856, -966905, 157840, 6577206, --15949898, -9585830, -1956358, 4843113, 4988605, -13821742, -7878044, 11032160, 6448357, 3863323, -2617783, 11652783, -472983, 237297, 1166084, -7805566, 1394254, 11148124, -5698348, -10584947, -29414620, 51126216, 1430761, 13908715, 9332964, -26996554, -7531762, 26765162, 8563091, 11755325, --6633577, 7721815, 4678293, -9600326, 526670, 13849122, 14870787, 17920752, -7851737, -2299418, --39681204, -37410776, 5252208, -23163832, 903017, 19931332, 4949950, 2294586, -6807523, -4549444, -12947179, 31241056, -22654342, -13158706, -2868501, -22214644, -1510218, -21414706, -6526740, -22729504, -20102058, -27524298, -2131915, 4844186, 13391171, 47869556, 64063732, 16468515, -16716550, -34219616, --2910377, -23438174, -9060770, -36391256, 5532455, 34897684, 25919054, 20903606, 2629057, 4990752, -35961760, 34726420, 25693568, -2193655, 16256451, 5866389, 8086350, -41384696, 12557411, 4469987, --9416179, 24793772, 33907692, -4800163, -466541, -16702591, -70427264, -1468879, 20969640, -10352482, -48935248, 34578780, -16013249, 3120831, -17864380, 12036646, 3482682, -6654515, -10644003, -5023501, --884763, 7471096, 9554692, 14329085, 525060, -8816494, -18687402, 974421, -8748312, 7059316, --8246337, -11592117, -2728378, -3100430, 8647380, 3441343, -3093450, 4354023, 2605435, 3427921, -979253, -6650220, -10245644, -5395016, 4071629, 8572755, -601832, 6964827, 69256, -10550587, --10671920, 2879776, -13091597, -7606387, 202400, -5970005, -1443646, 3587372, 5621576, -5092758, --8760660, -12652437, 32117228, 22590454, -15025943, 15244450, 23911694, 2504503, -29519310, -35640176, -33332704, 11114838, 7868380, 25924960, 785979, -11516955, 28208272, 7225209, -21029770, -10929081, --7486128, 9304510, 807454, -12862890, 5138392, -14211510, -1191317, -6484327, -6621229, 18943490, -35785668, -12233141, 7607998, 16633335, -8094403, -7274601, 7111392, 20128902, 6719477, -15654619, --19427748, -23786602, 12955769, 13240847, 32530082, -15392626, -14235669, 11237245, 19491636, 29994440, --589484, -55823836, -11662447, 17884780, 18196166, 7984344, -10609643, -496069, -22009024, 3272765, --9349607, 23094576, 33498060, -10114111, 1023276, -19523310, -20777442, -8207146, -42379516, -8659191, --21392158, 18858128, -17054242, 19567334, 24675124, -49461380, -3797825, -20964272, 21492554, -8768713, -7800198, -15425912, 2852395, -13148506, 14926622, 16174310, 28385976, 26998702, 13769128, 25975426, -12452721, 1490891, 14148159, 8799851, -3501472, 11533598, -12483859, 6151467, -6185827, 5318780, --15823196, 9564892, 494458, 7563975, -11529840, -6850473, 8185671, -3180960, -3569655, 13915157, --10558640, -2588255, 11770358, 5531918, -7141994, -2463164, 5083094, 25732222, 14332306, 11184095, -15690589, 971200, 17025788, 5508296, 5563594, 8580808, 523986, 13808320, 4371203, -23925116, --10611790, -6439230, -7676181, 2974265, -4665945, -11514270, -16417512, -26583700, -6292127, -14698452, --27400280, -40860708, 19863150, 21465710, 12312061, -27240830, -37575060, -28481002, -16492674, 6924561, --1455457, -36183488, -21942988, -24739012, 35083440, 11179263, 15161235, -10923712, -20310364, 44937168, -10852309, 14141180, -8778913, 2830384, 13014288, -8976482, 10300942, -3122441, 21136608, 30328912, -1123134, -24166170, -19736986, 24055574, 16172162, 21090974, 5854578, 5412196, -10975252, -4568235, -3275986, 14780056, 31408558, -110595, -59106804, -54470924, 619549, -13196287, 35198332, 36126044, --40185324, -26892938, -16986058, 49964428, 44231720, -23902030, 6945499, -31348430, -30488900, 18635864, --14097693, 335544, -4790499, -21713744, 15485505, 16173773, 12632573, 50592032, -37096708, -9808095, --3540664, 13073344, 3995393, 20893942, -73938936, -42777876, 15350750, 23302346, 22782654, 6626061, --24464670, -24789478, 352724, 14857902, 42601780, 10497437, -14273787, 4490925, -27698244, 17256642, -14865419, 973347, 23839752, 51328616, 12240120, -37507948, -19775104, -2581812, 4267050, 24816858, -21452824, 10262287, -11377905, -4554276, -7853348, -8832063, 22231824, -2578054, 1998770, -8836895, -21556978, -9989557, -4210142, -537945, 18700288, 8238821, 6620155, -3956739, -23638426, -8438537, -7610682, 18815714, 3192235, -26186416, -36371392, -30287036, -787590, 4379793, 5537824, 3620658, --9974525, -7541963, 49510772, -32897302, 30923228, 30684320, 19726248, -71683008, -28685550, 23968602, --19394998, 13857175, -5036386, -29787746, 19139448, 5711233, 5763309, -13179107, -47350940, -4519380, --1360968, 158914, -6684580, -34581468, 25924422, -21377126, 44214004, -4678293, -3768297, 21474836, -16094853, -21116744, -1865626, -15989626, 23669564, 37119256, 28360742, -31344672, 7117835, -20981988, -18996104, -18227304, -7379291, 3080565, -1497870, 20167018, -18444738, -43514460, 11287174, -15575699, -16344498, 16945256, -54945516, -9359271, -10395968, 1992328, 61061552, -16452946, -44256416, -11805254, -38851200, 18584324, -23915988, -7902203, 24144158, -118648, 29783988, -44649408, -23460186, 26838714, --27901718, -68066640, -19958176, -9295920, 77772192, -21206938, -39999568, 21325050, -46161236, 122080688, -11686606, -113466056, -30079266, -20056424, 80652504, 43567612, -50491636, -26745836, -525060, 59485296, -47591460, -7427609, -37176700, 14595909, -12483859, 53643068, -5054103, -26989038, -22176526, 35128536, --27991912, 18186502, -53733800, -278636, -1911261, -3176128, -3008088, 11288248, -29672318, 28848222, -2558727, 21147346, 1020592, -34072512, -25972740, 19340238, 23105850, 35985920, 13623099, -3720516, --23346906, 3089692, 6033356, -6259378, 1724966, 23567560, 3862249, -1169842, -26721140, 5125507, -19306414, 7009924, 981400, -7924215, -19158238, -21267068, -9867150, 6493454, -6277632, 9400610, --8863202, -5409512, 3647501, 707596, 284542, -65521872, 18358838, -1025960, 22378390, 54216984, -17355962, 7482907, -30563524, -12655121, -30544196, -36544804, -12259447, 7208029, 20888036, 27675696, --3111167, 16105054, 19474456, -16950626, -34417184, 18247168, 6538014, -27941984, -9515500, 26582626, --9051107, -2954938, 24295556, 13644037, 10793790, 3403225, 13806709, -13208098, -31971736, -13880261, -9095130, -13077102, -7565585, 11726334, 773094, -22493280, 23454816, 5086852, -20861730, 2692945, --5044439, 20216948, 11230266, -8128226, 9474161, -12425877, -28029494, 3778498, 6806987, -2521683, -54224, 5953899, -12251931, 3897146, -10492605, 6320045, 19977504, -2090575, 8725226, 9274445, --7742216, 532039, -19090056, 6562173, 11240466, -34631932, 20113868, -21585432, 6805913, 1042066, --113280, 9592273, 3855807, 22668300, 4116189, 6439767, -3283503, 11619497, -12179454, -7966091, -2789581, 1983738, -10659572, 3879966, -964757, -3050501, -6163278, 2242510, -1227287, 12294344, --3153043, 1509681, 8754754, -6106907, 6078453, -3743064, 2123325, -6109054, -5386963, -6100464, --1632088, -2715493, 4616553, 3357054, -14369887, -3872987, -4209605, 10048613, -5939403, 3791919, -1701344, -15935402, 5304822, 10435697, 665720, -3839701, 1714766, -4642323, -2385318, 3501472, -53103512, -1974611, -1726577, -14778446, -14455249, 10877005, -608812, 9408126, 195958, -5235565, --6985228, 3544422, -9790915, 9900973, -9221832, 14448807, -11715597, 8394514, -9916543, -2271501, --1590749, -9306657, -7061463, 2027761, -4169340, -2984466, -68719, -7018514, 920197, -1449552, -2214593, -1705639, 4051228, -14010183, 12690018, -4846334, -4168266, 9546102, -7732552, 437013, --9656697, -8529268, 6137509, 5335960, -6791954, -4465692, 2716567, -525060, -11814381, 2930778, -2057826, -101469, 7729331, -2968896, -3349001, -3278671, -8078297, -2291365, 8430484, -9092983, -2292439, -4463545, -1131187, 469225, -2760053, 1873143, 22549, 5797132, -8618389, -856309, -5515812, -11206643, 6429566, -5114233, 40802, 4946729, -2493766, -5177046, 2250026, -1021665, --1488743, -502511, -3650185, -220654, 3703873, -378494, -1806034, 519691, -3174518, 2024540, -1530619, 781147, -2576981, -900333, 3193845, -4296578, 4086662, -2047089, 1744831, 4454418, --5604933, 1169305, 311922, -7153268, 1208496, -2390149, 2815351, -1156420, 142271, 4071629, --2866354, 643708, -4576825, 600222, 573378, -1300838, -1165547, -721018, -1704565, 134218, --904628, -3221, 3033858, -4752382, 1906966, -25081536, -41907068, 15437723, 134908688, 33542620, -74461312, -3099893, -72216656, -23687282, -71062920, -61036316, -21361020, -14854681, -4823249, 40169756, -54351200, 71464496, 90659784, 38878044, -23036594, -42120744, -88750128, -84697832, -34316788, -28434830, --18692234, 36309652, 49912352, 29553670, 46285252, 55148452, 18859738, 14976551, 10475962, -28886876, --13069049, -20744156, -44627932, -24908662, -33125472, -49488224, -26693758, 5906117, 5406827, 27330488, -66918812, 45488000, 38154880, 36848672, 11532524, 2540473, -3667902, -19423990, -27302034, -34915936, --49502720, -44076564, -24404542, -7891466, -16632798, 13653164, 25862146, 21672942, 37857452, 41861972, -27134530, 24269786, 24041616, -3911105, -11590506, -6076305, -34097208, -28540058, -7118909, -28249074, --29894046, -19194746, -26875220, -13300977, 7854422, 17096118, 31374200, 49896244, 31187906, 28610388, -31982474, 11615202, -3650722, -5971615, -16962436, -28450938, -29235306, -28164784, -30578020, -21518324, --19514720, -16485695, -6593312, 7524783, 19127100, 29263760, 44532368, 46589120, 45706504, 38570952, -12400644, -10231149, -20601884, -33546378, -44077100, -50093816, -49730352, -39632884, -22121766, -5448703, -13857175, 40861780, 45739792, 45540612, 47982300, 39427264, 20939576, 6495601, -11060615, -32013076, --44484052, -39504036, -36698884, -29142426, -13357348, 1131187, 11069741, 21948894, 25113748, 24494736, -19714974, 8796093, 4284230, 1563905, -3399467, -4204236, -3983045, -5583458, -6677064, -5368172, --7371775, -5134097, -3984119, -2903398, -3385508, -1179505, -172872, 2091112, 2563559, 4687957, -5692979, 6900939, 5105106, 5247377, 3579855, 2268817, -804233, -1753957, -3803194, -4087198, --5884105, -5468030, -5403606, -3854196, -3432753, -1069984, 374199, 2193655, 3015067, 5350456, -5149666, 5622112, 4379793, 3543885, 1340567, 1013612, -961536, -1573032, -4227322, -5602785, --6182606, -4447439, -3918621, -1227824, 38655, 1388885, 1663226, 3213709, 3008625, 4273493, -3606699, 3796214, 2310156, 1578937, -874563, -1637456, -3441880, -3321620, -3776350, -2857227, --3117073, -1535988, -957778, 1004486, 1697586, 3135863, 2666638, 3160559, 1772211, 1504849, --61203, -348966, -1237488, -654983, -1475321, -850404, -1444183, -568009, -930397, 16106, --350577, 532576, 37044, 731218, 77846, 665720, -14496, 563178, -163209, 400506, --289910, 349503, -307090, 331786, -312996, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ -3051038, -3178813, -2868501, -430034, 4394826, 1531693, -2373506, 547071, -2615098, -2204392, -1890859, --3933116, -1454383, 2503966, -261993, 1416266, -739808, -1068373, -1173600, -419833, 3295851, --2057826, 144418, -85899, 82141, 2733210, -153008, 1901060, 5783711, 4626754, 4521527, -2442763, 976568, -674847, -5471789, 2285460, -2082522, 3533684, 1166084, -1770063, 1568200, --2348810, -4751308, -1379221, -1875827, -4373351, 125091, -479963, -698469, -2014340, 218506, -4698158, 1990181, 3213709, -112743, 2001455, -1874753, -65498, 2359011, -1936493, 1559073, --2416456, -2704756, 333934, 5390184, 3658239, 2029909, -996432, 847719, 650151, 251792, --919123, -2158221, -3137474, -2386391, 137439, -2052458, -929324, -2204929, 774168, 262530, -1172526, -695785, 976031, 1224066, 1124208, 74088, 729608, -556735, -469225, -81604, --1268626, 1340567, 1218160, -199716, 1521492, 364535, 357019, -723165, -351114, -906238, -343597, 405874, 48318, -331249, 566936, -388695, -1173600, -416075, -764504, -116501, -306016, 238908, -1232656, 164819, 887448, 1994476, 1034550, -3459596, 8165807, -180926, -499827, -868657, -4301947, 3180960, -2240362, -2157147, -5013301, -3872987, -1619203, 3114388, -4491462, -909996, 2660732, -1034013, 4873178, 5044976, -10065793, 1843615, 57982, -988379, -3419868, 5361730, -1643362, -782221, 120259, -329639, -2547989, 2108829, -2568391, -2038499, --195421, 2688650, -1505923, -5665599, -2504503, -3850438, 466541, 345208, -5014911, -594853, --2179159, 1046898, -132607, -756451, 1254667, -1673427, 1725503, -2692945, 2665027, 3876745, -5967320, 2474438, -2577517, 2136209, 2517388, -929324, -6709813, 445066, 3529390, -2698850, -2046552, -3897146, -18790, -2484102, -6813429, -2076617, -3549791, 1741072, 2570538, -2299955, -1118839, -1076426, 3258270, 261993, 1921998, 2713883, -1120987, 1125818, 581431, 1151588, -2362769, -535797, 823023, 2920578, 1691143, 401579, 1775432, 320512, 790274, -112743, -537, -1572495, 884226, 1008244, 1362578, 910533, 340376, 433792, 86973, 511101, --162135, -434329, -76773, 1080184, 950262, 286152, 857383, 200253, 985695, 811749, -6718403, 1789391, -9036611, 3184718, 4697621, 1662689, -746787, 2328946, -5661841, 767189, -2570001, -1315871, 2487323, -426812, 3022046, 681289, -3806415, 2381559, 3562675, 3439732, --966905, 1624571, 1946157, 1283122, -10230075, 1407139, -4327180, -1329829, -1407139, 2365453, -1159641, -8420283, -2972117, -1912871, -1543504, 3377455, -3073586, -5900748, 1497870, 2689187, -1745904, -5869610, -2694555, 1841467, -5459441, -474057, -6037651, 866510, 3040300, -3148748, --895501, 3459059, 4493073, -10377178, -710280, -2899640, 3191698, 1261110, 572841, 873489, --2857227, 2615635, 2338610, -8059506, 6234682, -847182, 1579474, -4119948, -1655710, -3486440, --372052, 887985, -3157875, -4482872, 4027606, -1453846, 1696512, -234076, -745177, 1138703, -1409823, -1640141, -4069482, 2292976, 2150168, 523986, 1032940, -135828, 377420, 685047, -33286, 683974, 546535, -95026, 1656247, 226023, 1285269, 1449015, 150324, 2043331, -12885, 403190, 619012, 920197, 804233, 1022739, -1457068, 701690, -622770, 318364, -748935, 507343, 1272921, -399969, -289373, 914291, 1717987, -4269735, -4184909, -3311420, --2248416, 6873559, -2459406, 1014686, -5600101, 5934034, 302258, -3870303, -1131187, 3476239, --7144141, 2486249, -2170032, 1682017, 1052267, -3138547, -2379412, -8301098, -2345589, -9359807, -1138703, 2224256, -1099512, -1191853, -948651, 1522029, -3784403, -6643241, -3215857, -2383707, --1124208, 2570001, -1635846, 4108673, 1698660, 3171833, -4258997, -138513, -289910, -3395172, -887448, 2850785, -354872, -1643362, -4175782, -3687766, 2469069, 3913789, -204548, 7653095, -5909338, -5309117, -1457605, 115427, -5789079, -6430103, 9792525, -58519, 191663, 3199214, --6352794, -1960116, -4143033, 9853192, 2556043, 611496, -7841000, -6058588, 751082, -2434173, -4960687, -2478196, -132607, 1489280, -3123515, 1214402, 2964601, -4457639, -25233, -7173133, -719944, 2853469, -2179159, 1176821, 801011, 3685082, -586263, 688805, -779000, -22012, -1473174, 1705639, 1411971, -981937, 402116, 47782, 594853, 170188, 581968, -941672, -2228551, 143881, 588947, 472983, 656593, 666257, 595390, -485331, -664109, -389768, -439160, 1673427, 1750736, 455267, 758062, -1364726, -610422, -11350525, 5664525, 3270081, -5777268, -3077881, 3151969, 3374234, 5939403, 1459215, -11402064, 2885681, 459562, 4566087, -8223252, 481036, 3555159, 3187940, -6838125, 2440615, 602906, 992137, -1877975, -896574, -4199405, 2850785, 146029, -4114579, -75699, -1935957, -2181307, 6864969, 3123515, -231928, --935766, -8177618, -7084549, -8031589, 2129230, 2241973, -8404177, 651761, 546535, -8249022, -501974, 1341104, -1130650, 9606768, -1196685, -4632659, -1199907, 5543729, -472446, -8443906, -9224516, 4850629, -5898064, 4561256, 878858, 928250, -169114, 583042, -2299418, -4205847, --4057134, 7454453, -505196, -2090575, -357019, 5381594, -4935455, -8625368, 299574, 2050310, -1619203, -7529078, -3947075, 2998424, -693637, 4321811, 1610076, -1275605, -1278827, -1086090, --611496, 224412, 6746320, 4012573, 2435783, 2239289, 2604898, 4011500, -1882806, -547071, --2132988, -566936, 746251, 277562, -1180042, -1817308, 1984812, 388695, 895501, 54761, --1212255, 522912, 1051193, -2312303, -404264, 2014340, 420370, 206695, -876710, -170188, --566936, -946503, 265751, 1073205, 787590, -603443, 804233, 170188, 3456375, 13121125, -3940096, 10517301, -11575474, 416075, -5703717, 155156, 3873524, 4409858, -5938329, 2572686, --3431142, -3087545, -4122095, -6769406, -968515, -15902116, -131533, 5206574, -680215, -1114544, -1764158, -8360691, 2949569, -7975218, -2487860, 8141111, 1675037, 2785823, 212064, 2369748, -6991133, 6271726, 12167642, 6273337, -9171366, -804770, 10252624, -1472637, -7474317, -1178969, -965831, -3463354, 6874095, 5042292, -5876589, -1762547, 6592775, 6959458, -2477659, -4491462, -11112691, -4615479, -14944876, -10151692, 3311957, -15090904, -285078, -4547834, 88584, -1439888, --4191888, 5593658, 1626182, -1516124, -4904853, 4260071, -2932926, 7934952, 5465883, -2225330, --5276904, 1090922, 2100239, 697395, 312459, 1840930, -1088774, -5912560, -1686848, 8121783, --933082, -3368865, -870805, -1763084, -4209605, -4148402, -2262374, -2018098, 496606, -85899, -4103841, -405338, -1464047, 525597, 1474784, -1031866, 865436, -1457068, 2792803, -139050, -1719061, 205085, -2665564, -322123, -280247, -2862596, -748398, -1762547, 1290101, 31675, --423591, 913217, 443455, -334471, 511101, -3197603, 692564, 872415, -12783970, 6045704, --1086627, 3218541, 4296578, 6913287, 1601486, -6115497, 8329552, -3102040, 3732327, -3722126, -3117073, -578210, -15025943, -3136937, -2534031, -1788317, 1076426, -3634079, -2444373, 2000381, -3351685, 1126892, 8185134, 3742527, -7825968, -593242, 61203, -4445291, 9410273, -5614059, --5370857, 9848897, 10430328, -1302986, -77846, -6476811, 2375117, 1394791, -3329137, 1713692, -6475737, 3962644, 7778723, -1935420, -6032819, 3768297, 945430, 1847373, -7199439, -3762928, --4213363, 1695438, 4185446, 1505923, 1149978, 7421704, 8949638, 1318018, -4194573, 5058935, -4193499, -6293201, 915902, 1076426, -679679, 719944, -105227, 5305359, -543850, -4169340, -2156074, 6997576, 3154117, 4101694, 8725763, -5941014, 1094680, -2033130, 8281234, 4705674, -8866423, -4269735, -1095217, 1450088, -3104725, 440234, 903017, -1022202, 41339, 2026151, -2396055, -907849, 1323924, 895501, 3097208, 2680597, -331249, -251792, -1346472, 367757, --1357210, 707059, -2413772, 2397129, -10201, -964757, -6979, -231928, 126702, -889595, --1874753, 2666638, -308701, 417686, -2983392, -2500745, -637803, 2558190, -248034, -308164, -279173, -331786, 5341866, -11116986, -6671695, 4438849, -2615635, -10383620, 5277978, -5427765, --4759898, 6718403, -2044404, -2208687, -1673964, 1741609, 4956929, 2590402, 2662343, 2759517, --4146791, -2462090, -872415, 6053757, 3102040, -10612327, 3373160, 3324305, -4465156, 10006200, -9160092, 4946192, 345208, -3618510, -2362232, 549219, -3126736, -3724811, -6164352, 906775, --7037304, 5113696, 1950989, 75162, 1102733, 2704756, 2319819, 5473399, 8512088, -3216931, --13509283, -2340757, -9203041, 3181497, 1264868, -12210055, 4427038, -5118528, 15341623, 5107253, --9675488, -318901, 9758703, 5104032, -8012262, -4755603, 10209674, 5879274, -7100118, 8739185, --7286949, -9590125, 1480153, -14526653, 8769249, 9452149, -2171106, -8739185, -1575179, 3452617, -1774358, 1479079, 876710, 6778532, -9511742, 3073586, 10584410, 191126, 361314, -9314710, -4638028, 2619930, -8616778, -2135136, -4352413, -2046015, 335544, 2708514, 2152316, 319975, --2596845, 278636, -2782602, 1166084, 1649268, -338766, -1349157, -912144, 1691680, 554588, --550293, -1437203, -2779381, -299574, -2713883, 5420786, -5071820, 3221, -543850, 2090039, -1390496, -2899640, 882079, -885300, 4588099, -558346, 1291175, 156229, -2651069, 1100585, -548682, -312459, 2965138, -46708, -8703751, -6455873, 224412, -10485626, 49929, -24634858, --7730405, -2842195, -13434121, -4722854, -2796561, -5909875, -4538707, 3202435, -6462852, -12321724, -3302293, 7720204, -12553116, -3483755, 3901441, 6308233, 10875394, 6921877, 6417218, 7007239, -2561948, 12423193, -7366406, -3166465, 2659122, -6149857, 2368675, 3521873, 6534793, 856309, -10667088, 2236604, 2653216, 7347079, -3213709, -6293738, 144955, -9650255, -6141267, -11138461, --433255, -506269, -14616847, 5290326, -6603512, 3006477, -13802951, 1665374, -10437307, 15635828, -820876, -13917305, 16749836, 20484846, 5784784, -6849936, -5048734, 5326297, -1746978, -661962, -6085432, -9762461, 6407018, -10081899, 5383742, -4009889, -5652714, 2423972, 5407901, -2901787, --273804, 6320581, 1688996, -3093987, 3584150, -1540820, -5741835, 776852, 5434744, -1019518, --2096481, 2163590, 1606855, 4416837, 917512, 170188, 1932735, -1454920, 3104188, 796180, -2578054, 900333, 2056216, 1654099, 1684701, 1347546, -1843078, 2142115, -2492692, -2324651, -268972, 1415729, 495532, 723165, 1561221, 1033477, 157840, -791885, -1864016, 52613, --1961726, 5373541, -2612951, 4846871, 7318088, 988379, 6759742, -3856881, 10522133, -8200703, --7488276, -19982872, -4348118, -10400800, -24208584, 6011881, -13929653, -8585103, -11217918, 3017752, --21803402, 5768678, 1850057, -4283693, -424665, -6374269, -2161979, 5160403, -7394323, -5398237, -345208, 3913252, -6462852, -591095, 7533373, -12087649, -2724083, 6918119, -6611029, -493384, -113280, -1984812, 10194642, -8957691, 6074158, -4122632, 8300561, 8618926, -8810052, -11916924, -11118597, -1282585, 2459943, 2807835, 1043140, -2625836, 6281927, -3464965, -13635447, 3484292, -2834142, -11940009, -1277753, -4328790, 7171522, 8587787, 4340602, 1377074, -3366181, -8507256, -8664560, 5244155, 7754564, -614717, -12093554, -2923262, -1785096, -5383205, -2946885, -1498944, -3553012, 5325760, -4643397, -4067334, -12016245, -5807870, 2374580, 4896800, 1391569, -1101659, -5572183, 5130339, 3163780, 6317897, -1917703, 4939213, 2321967, 3355980, 626528, -28991, --3278134, -2610803, -562104, 1547262, -743029, -2895882, -3498251, -179315, -535797, 685584, --2363306, 512712, -2827699, 848793, 4860293, 1037772, -2706903, -2880313, 6172942, 3440806, --706522, -412317, -7693897, -916439, -38655, -6595459, 220654, -2695092, -1979443, 1527398, -2095407, 463320, -697395, -6038724, 29615410, 17015586, 1191853, -9438191, -22330072, -2783676, -10462540, -4956393, -8989367, -16837882, -926639, -3677029, 596464, -5812702, 5436892, -149250, -14666240, 5738077, -6103686, -490163, -2602750, 1051730, -3009698, 2970507, 9096741, -10698764, -2073932, -6470368, 4243965, -4626217, -7742753, -15220290, -1210107, 8618926, 2924336, -1954210, -3216931, -1183800, 8293045, 13034689, -4553739, -3044058, -15154255, -16506096, 4562329, 2380486, --6940667, -6074158, -13645111, -9448928, 5426691, -1831267, 39728, 636192, -1043140, 6183143, -3585761, -11304354, 485331, -10307385, -877247, -5587753, -3168075, 10825465, 22452478, 36903968, -1407676, 11832098, -11137924, -14263050, -19945292, -1109175, -53150, 3990025, 4245575, -2786897, --25216290, 10417980, -4273493, -3539590, 1603633, -6672232, 777926, -3653407, -10262824, 74088, --4097399, 41876, 1043677, 338766, 7317551, 1005022, 850940, -447213, 321586, -360240, -3154654, 6827388, 2056216, -297963, 1493038, 6185827, 192737, 25233, 2371359, -2119566, -798864, -5756867, 1976222, 2934000, -5335960, 5433134, 357556, 426276, -1560147, -6016713, --1893544, 2624225, 57982, -653909, -1457605, 3609920, -996969, 228170, 10808285, 18023830, --8914741, 36507, 3462281, -14695231, 135291, -9486509, -9197136, 13849122, -4075924, -3473018, --7442642, 15904801, 13973139, -1074, 22957674, 2586107, 7169374, 5055714, -6401649, -7495255, --11951283, -6291054, 2798171, 113817, 10287520, 803159, -1123671, -1872069, 7269232, -10506564, --25680684, -9001715, 7572564, 2376191, -2111513, -7649874, 454730, -12353937, -1858110, -11254962, --780073, -1408749, -7933342, 7603166, 3774203, 14441291, -11929809, 22370338, 6003291, -4351339, --7919383, -4064650, 3521873, 12905303, -3973919, 7384123, -11404749, 9215389, -10357314, -11651709, -11487964, -16665010, 10920491, 9178882, 17725866, -18050136, 13715441, -1711008, 12227235, 4778151, --18975702, -3317862, -4462471, 5291937, -10071698, 29869350, -1475858, -10542534, 4230006, 13805636, -9369471, 6467684, 7121056, -940598, 3388729, -1219771, -3966402, -2517388, 1044751, -130460, --3935801, 1129576, -1162326, -6056441, -1268089, -2311766, 2538863, 3197066, 1730335, -834297, -5886790, -955630, 3253438, 1307818, 4161823, 1570884, -2119030, -2622615, 703838, -311385, -2864743, -1163936, 263604, 2444373, -1491427, 4185446, -1990717, -2306398, 1154273, -1728724, -4354023, 1584306, -1295470, 2629594, 1289027, -12488691, -16746077, -34305516, -10530723, -20143396, -5616207, -916976, -6861211, -9975062, -9495099, -8581882, -9299678, -9110163, 957778, -7426536, --1336272, -16145319, -24774982, 30357902, -9457518, 16451335, -3142306, 4249870, 5243082, 8870181, -5850819, -1545651, -495532, -13103408, -2961917, -3115462, -8811125, -13741211, 5371394, -1547799, -19433116, -13450227, 360240, 26882200, -6475200, -22330072, -7201050, 890132, -10118943, 15731391, -7232188, -8632884, 6385006, 8454106, -5203353, -168041, 4252555, 10519986, -386547, -10351945, --10189273, 12590697, 9004399, -6607271, -14337138, 9160092, 10599442, -9447854, -12899397, 9052717, --16360067, 31329102, 6745246, -2551211, 1284732, 7669738, 1736777, -5506148, 515933, 2260227, -11257109, -7370701, 2261300, -22246320, -20037096, -2230699, 1206886, -2176475, -9719511, 7095286, -16565689, -449898, 4254702, -1541356, 3550327, 5020280, 5985574, -6384469, 7194607, -3301219, --1894618, 4775467, 8855686, -2590939, -8856759, 2550137, -802085, 1502702, -790274, -4735202, --1304060, -4893579, -3029026, -6044630, 6270653, 6426345, -3816079, 20938, 7713762, 2470680, --3233037, 1643362, 9660992, 6370510, 6976101, 7038378, 6217502, 2337536, 8863739, 4701916, -3714610, 3322157, 8345659, -12987444, 115964, 4706748, 3766686, -8523899, 20491826, 14322642, -29458644, 16161962, 11044508, 4205847, -25549686, -2153926, 3628711, -15164993, -3892314, 29000692, -2373506, -16864190, -16451872, 15015206, -22719840, -5960341, 1170916, 6107444, 2800856, -4380330, -7607461, -10343355, 167504, -2099165, -6317360, -1438814, -4332549, -14941117, 8076149, -12945568, -7803956, 6775311, 9056475, 1612760, 6081674, -5400385, 24382530, 3256122, -25416006, -22535694, -2311766, 10143102, 19881940, -6450504, -15153181, -6802155, -1778653, 2245194, 11799349, 2542084, --8819178, 26603028, -32285270, -5381594, 6456947, -22613002, -11438572, -5912560, 3653407, -36658084, --17074106, 26350162, -9648107, 7741142, -8221641, -29574072, -10889890, 14349486, -4042638, 5641977, -9423158, 18833968, -8588861, 2158221, -5252745, 11837467, 5676873, 5159330, 1107028, -355945, -668941, 10344429, 5612449, 6174553, -1217086, -98247, 4159139, -6717866, -5904507, 2878702, -12222403, 5711770, 4988068, -11396696, 7198365, 21809308, 290447, -56371, -7903814, 6049462, -1370632, -4839892, -6330782, 1111860, 6828461, 7727720, 5857262, -6476811, 4929549, -4262755, -5544266, -8390219, -4317516, -1496259, -4104915, -5358509, -1265942, -13783087, -12893492, 2469069, --502511, -1920924, 5220533, 132070, -821413, 433255, 5661304, 4986994, 2007897, 75699, -2788508, 3191161, 2444373, 3829500, -973884, 5212480, 14566918, -6051072, -47710644, -11932493, -2303713, 13532905, 12593381, 12041478, 11480984, 21609592, 38002408, -21669184, 15709380, -5261872, --1058173, -5339181, -31868120, -23235236, -4849018, -1108638, 6392522, 12671227, 15789910, -4759898, --910533, -7992398, -307090, -1156420, -537408, 17009144, 8541616, 5905580, 12441447, 15526844, --26999776, 13551159, -15850040, -19277424, -6187974, 13038447, 3266323, -12895639, 3997541, 1979443, -9104257, -529355, -26252450, -18153754, -21837762, -20970178, 2407866, 18074832, -3705483, 64472828, --42294692, -31180926, 18894098, -5240397, -13260712, -3919695, -3920232, 1118839, -39659728, 4562866, --3306588, 5821828, 29571386, -1663226, 10053445, 12036646, 13864154, 49753976, -18761490, 62801012, -16886738, -1234803, 7747048, 4044786, -26075820, -22229676, -874563, -5091684, 2736431, 10117332, -7196218, -3951370, -22427782, -17613660, 6781217, -11719355, 7488276, 9185324, 18992346, 19379966, -16850768, 3867618, 5584531, 243739, -1300301, 13266080, -2552821, -608812, 3643743, -17947058, --4831838, 8319352, -446677, -1338419, 11335492, 4990752, -17626008, 12403329, -10046465, -12869333, --7917772, -3598646, 2907156, 6154688, 5425618, -6587943, 8032663, 4151086, 5018670, 2973728, -6743636, -2352568, 3913789, -10511932, -2739116, -5480379, 1969243, 4513474, -28000502, 10099616, -45172856, 1161252, 47141024, 24688546, -2729989, -18278844, 53160956, 7851737, -8812736, 6759205, --11965242, -3655554, -1700807, -3348464, 6812355, 14722074, 10428181, 1879048, 6923488, -10719165, --10182294, 3156264, -3024194, 17383880, 19030464, 11989938, -4742181, 1153199, -22871774, -14462765, --4148939, -15807627, -24745990, -14829448, 11971684, -14457397, -43736188, -20288888, 13524315, -17718888, --12378633, 639413, -3097745, 20656646, 30472792, 39903468, -20987358, 11375758, -169114, 1357747, --8445516, -26316338, -52490944, -34585760, 18408766, -35037808, -18270254, 9665824, 17991618, -12910672, -20276004, 57814556, 12311524, 11298448, -43454332, -58369144, -12494597, -18074832, -31030602, -8766028, --25887378, 18770618, 10792179, 52479132, 21772262, -5883569, -10368588, -17986786, 12591770, 23968602, -47620448, 33354716, -22574884, -47667156, -23141820, -15051176, -28086938, -5051956, 24408836, 11824045, -30136712, 1534914, 21509196, 8723615, -6634114, -8674760, -9980430, 6053757, 13269301, 3520263, -17181480, 21361020, 13033078, 15326054, 7222525, 23067732, 20309290, 1151051, -107374, 10311680, -22897544, -1873143, -5716602, -3031710, 19591494, 6282464, 1254131, -5352603, 12386686, 9632001, --2608656, 8072928, 9889699, 5139465, -1728724, 2525441, 7191923, 1284732, -374736, -10878615, -23513336, 48384416, -26116622, 36764384, 28444494, -4330401, -8177618, -15928423, 4215511, 32801202, -23302882, 38398620, -17343614, -7206955, -8571144, -2063195, -11056320, 10242423, -13400298, 28217936, -11028402, -45676440, -20688858, 627065, 6027450, 20052128, -10358924, -17156246, 4263829, 5625871, --8284455, -8377871, 4247186, -12860743, -20928302, -8890045, 42348376, 18106508, 6392522, -21783538, --8045548, -18464602, 9939628, 21154862, 6106370, 1550483, 11435887, -7206955, 26648124, 15829639, -665720, 9314173, -1993402, 54861764, 10322417, -23171348, 7916699, 9585830, 4458176, 12511777, --275952, -22127672, 25370908, 5922760, 3517041, 10451266, 3791383, 62277, -17366164, 18954764, -20463908, 11205033, 60641716, 43933220, -24701430, -47524888, -34357592, -3201361, 3105798, -4798552, --41525356, -20019380, -15404974, -16606491, -17653390, 15101105, 10739029, -4205847, 1461900, -3585761, --23737748, 6581501, -5236102, -1209570, -24308978, -22334904, -5082557, 9515500, 10043781, 1394254, -10772852, 5082020, 13863081, 2173254, 1912334, -25370908, -16154446, 10798622, 1868311, -7039989, -12224014, 5626407, 1287417, -12236899, 10722386, 16186121, 10321343, 11730093, 13780939, -3338800, -15381352, 32955820, 24932822, 5809480, 2500745, -4306242, -6874632, -17066590, -22584012, 5521718, --8447127, -537945, 1131187, -1773822, -6098854, -3007014, -8282308, -56507812, -6669548, 13226352, -16296180, -13495324, 20214800, 5330592, -7386270, -21660594, 5182952, -5886253, -30549028, -10743861, --10503879, 1432909, -42267312, -34360276, -5185100, 20155744, -2303176, -7384123, -25360708, -391916, -22701586, 138513, -14851997, -9791989, -2783139, -9623411, 6040872, 6439767, -21384106, -25368224, -4351339, -1767379, 5807333, 39404716, -24117316, -3478387, -1009854, -40218612, -11303280, -29669634, --3961571, -3323231, 28372018, 30452392, 38933880, 10108206, 7054484, -15454903, -33043868, 481573, -14206678, -12525198, 47704200, 109369728, 106433584, 14601815, -67194760, -63053880, -23835994, -39957692, -130440840, 79513264, 51035484, 64786896, -485868, -35603668, -91963304, -60108604, -22393960, -5757941, -37867652, 74628816, 67759552, -8768713, -54933168, -34412888, -49687404, -40308268, 7617662, 53860500, -80249320, 30114700, -3718368, 3715147, -29950418, -36881420, -35334696, 11844983, 6228777, 8681740, -32613298, 16402480, -2624225, -21176336, -17140678, -12378633, -27453430, -6238440, 13059385, -11085847, -1387274, -4451734, 20159502, 14089640, -25433186, -16814796, -52072720, -43009264, -37019932, 23604066, -43419436, 15726023, 11795054, -16002511, -26593364, -83255792, -60437708, -37234144, 7901129, 22505628, -15557445, 2966212, -29560112, -25854630, -47259672, -80293880, -30499100, 8877161, 24329916, 40490804, -19937776, -402116, -21438330, -8649527, -13824963, 580357, 30331060, -29701310, 34021508, 5187247, -4750771, -53274776, -15759846, 44768056, -29563334, 11606075, 1184337, -11398306, 15284715, 4235375, -25607668, 37629820, -21502216, -31319438, 9114994, -19464792, 25403658, -32678258, -15462956, -21034602, -3543885, -6428493, -17157320, 7310035, 38056096, -29918206, -30762166, -24652038, -6182606, -7956964, -50694036, 1975148, -202400, -49718004, -11264089, 3499862, 42815456, 16955458, -6055367, -71229888, --48875656, 46486040, 53251152, 49058192, -21610128, -118124488, -21605296, 51280836, 45289892, 5395016, --12019466, 6108517, -45676440, -29492466, 17540110, -15276125, 16041703, -10050760, 3574487, 48091824, --35149476, -20815560, 42736536, 30862562, 63643900, 24783572, -80986976, 24381992, 91071024, 17687212, -46989088, 9865003, -23313082, -2295123, 58636504, 37513856, 77306728, -100787312, 15403363, -2249489, --9389335, 37713572, 2371896, -53191560, 6266358, -3894999, -8895951, 5958731, 1482301, -33224794, -29317984, -14723148, 950262, -301185, -5753109, -342524, 5890011, -10501732, -9714679, -18964428, --23472534, 23034984, 537945, 7329362, 22932442, -25945360, 13296682, -2748242, -42030012, -1692754, -15444166, 45407468, -10680510, -67647344, -5948530, 29444148, 10231686, 25780004, -19894288, -20286204, --22069152, 9056475, -2352568, 14934675, -23378580, 10574209, 8338679, 5568962, -26137024, 841814, -7994545, 17801566, -5888937, 2112587, -14991583, 4180077, -8034273, 14867029, -864899, 11423002, --2007360, 3389266, -16766479, 521302, 81068, 17936320, -8945343, 5769215, -18122078, 978179, --449898, 14801531, -3222836, 5930276, -58283780, 6589017, 10420664, 5558762, 57459684, 9682467, --4315369, -36682240, -6273874, -3606699, -8597451, -363462, -6944962, 14704357, 6860137, -10812580, --1854352, 22820234, 70330, -1282048, 2423972, -5710696, -9794136, 12806519, 11321534, 8595303, --14266271, 7502234, 21348134, 8374113, -1225139, 13772350, -2505577, -16336982, 4322348, 4144107, --13159780, -14302241, 14252312, 13879724, -13697188, 8782671, 8478802, -117038, -4988068, 106300, -10836739, -594316, -12098923, 6302865, 7384123, -22471806, 5750425, 16626892, 5439576, -14607721, -2279017, 10322954, -18931142, 5151277, 8875013, 3754338, -4922570, -18043694, 21252036, -22992570, --2029372, 22145388, 361851, -3806952, 490163, -20792474, 9210020, -295279, 11885248, 22024592, --9959492, -1571958, -12721156, 16848620, -3526168, -1868311, 17262548, -22526566, -9910637, 12528956, -10212895, 4495757, -18326626, 6351720, -4027069, -1135482, 8790187, 6698002, 1259499, -4649302, --2346126, 868657, 4974109, -15981573, 11658152, 2397666, -2223183, 4536559, -2097018, 10142565, --15050639, -2706366, 311385, 907849, 1502702, 6988986, 4612795, -25538950, 13518946, -2706366, --2971044, -1038845, 5202816, 7016366, -6333466, -2530273, 11894912, -10147397, -1304596, -7755101, -5657009, 53880900, 4692789, -6545530, -18042084, -11944841, 6274411, -8003672, 6908455, -10691784, --891743, 8551817, -4868346, 4028143, 3886946, -14914811, 4077535, -4877472, -3299072, -12293807, -3421478, -3477313, -7812546, -3613141, 5890548, -5367636, -5375152, 7592429, -8492761, 4267587, -7157563, -14960982, 14680735, -3738769, -17662516, 9329743, 9219684, -8215736, 2782065, 5312875, --7506529, -6671695, -30602, 977105, 4715874, -2437394, -985695, -7422241, 6707665, -5820755, --1960653, 8497593, -10381473, 2943663, -1960116, 537, -4941897, -6669011, -2804077, 11552925, --8022999, -3050501, 1767916, 2426657, 226560, -7057705, 5236102, -3185792, -6171868, -214212, --11223823, 16199006, -7291781, 3245922, 3467649, -3388729, 5512591, -9710921, -8002598, 9837623, --4982699, -6755447, 6498286, -497679, 1719598, -4524748, 1048509, -1047435, 2896956, -3624953, --2923262, 3686693, -2313377, -2662343, -837519, 2300492, -1682017, -285078, -1394254, 560493, -2109903, -3238405, -3337190, 9229885, -2887829, -3404835, 2763812, -1144072, 2557116, -7543037, -348966, -1321776, -383863, -2059974, 8568460, 32212, -7832947, 2430952, 689879, -416075, --95026, 3307662, -2353642, -2296197, -1138703, -2080912, -1166084, 871878, -2570538, -149250, -550830, -426276, -26924614, -43533252, 19808390, 150964880, 22950158, 75496400, -17844516, -76489072, --28005334, -74539160, -49331456, -15467251, -8367133, 3696356, 44215076, 53475564, 73899208, 73679624, -23216446, -28929290, -47203840, -86189256, -66285304, -34646964, -13700946, -8682813, 26505316, 44884556, -34419868, 47284904, 45532560, 16986058, 14657650, 5738077, -33583960, -12269648, -28896540, -49605800, --30228516, -28915868, -43283068, -9030706, 20010252, 15474767, 43853764, 57821536, 29873646, 38567732, -28762322, -3905736, -1402844, -2551211, -31161062, -38048040, -34211024, -51158968, -43852688, -15299747, --2707977, 6361921, 35465692, 32928978, 31448824, 39946416, 29573534, 10370735, 18640158, 10455024, --11716134, -5360656, -21543020, -44891000, -27226872, -25402048, -35612796, -16935592, -11501386, -19787452, -16739098, 32068910, 36714456, 58931784, 55248312, 23538568, 13623099, -607201, -20195474, -23659902, --24696598, -35616552, -32888712, -29924648, -27705760, -17071422, -6964827, 114890, 13319230, 31664646, -39142184, 36679020, 43939664, 30680026, 14680735, 6418292, -5219459, -22428856, -25631828, -35418984, --46540804, -46643344, -37297496, -30897994, -4825933, 18759344, 41471668, 55892020, 60211684, 46755552, -30258044, 13627931, -3714610, -23162758, -34282964, -46044196, -45962056, -32665910, -21626770, -6379637, -8260833, 16751446, 21894670, 27651536, 23643258, 14987825, 12470974, 4644471, -334471, -4184372, --5699422, -7177427, -7224672, -10187662, -8482024, -6447283, -5515812, -5310727, -3599183, -3301756, --688269, 1966558, 5734318, 7007776, 9283572, 9989557, 10385768, 6591164, 3959960, 852014, --1174137, -5822902, -8022462, -10578504, -10247255, -8760660, -5264020, -3508452, -652835, 1043140, -5143760, 7254200, 9100499, 7361574, 7191386, 4971962, 3288334, 725313, -238371, -3233037, --4668093, -6922951, -7361574, -7902203, -5450314, -3702262, -180926, 1221918, 3981972, 5010616, -6284074, 4776541, 5083094, 3544422, 2928631, 493384, -738198, -2879239, -3099893, -4439386, --3847754, -4268661, -3074660, -2729989, -552440, 130997, 2287607, 2762201, 4207458, 3472481, -3717831, 1727651, 1124745, -486405, -272730, -1509144, -1328219, -2576444, -2024540, -2629594, --1525250, -1627256, 6442, 179852, 1654636, 1283658, 1989107, 1042603, 1538135, 414464, -799938, -340376, 139586, -752156, -92342, -883690, -73014, -737124, 133144, -539018, -293668, -394063, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --1142998, -6171331, -3469260, 1033477, -5156645, 1442572, 577136, 7864085, -4713727, 13959, -2481954, -3939559, 4020090, -2570001, -493921, -2209761, -1271310, -2583423, -3217468, 2364916, 768262, --2105608, 4383014, 3991635, 6824703, -208306, 2579665, 1351841, -122943, -6180458, 1596654, -2563022, -2446521, 1535988, -1806571, -2101850, -3398393, 1750199, 4350265, 441845, 5077188, --2086280, -445066, 5122286, 2673080, 405338, -75699, 4864051, 7308961, -5454072, 1206886, --1890323, -857383, -8485245, -3022046, 3415573, -2646774, 2363306, 1082332, -1255741, -2071248, -1188632, -719407, 2631741, 1417876, 1219771, 1337346, -4412542, 150324, -2128156, 2690260, -4475893, 3131568, -652835, 4845797, 18254, 2045478, -658741, -1098438, 245350, 2420751, -2796024, -937377, -1933809, -3979824, -527207, -1766842, -1890859, -1076426, -1611687, -1161789, --1895691, -1006096, -63888, -47245, 25770, 1539746, -1099512, 794032, -409096, -783832, -23622, 690953, 242666, 544924, -19864, -550293, -10737, 704375, 221191, -1103807, --857383, -69793, -11811, 407485, 394600, 30065, 875100, -1112397, 3733400, -4562866, --4649839, 118112, -6283537, 1104344, -1937030, 3022583, -1639604, -5091684, 632434, 4873178, --694174, 110059, 6927782, 8572755, -3665218, -4021163, -1065689, -6477348, 2801929, 526134, -1660005, -2316598, 3486440, -4531728, -754304, 3002182, -2456185, -977642, 529892, 5502390, -418222, 3964792, -5244155, 5151814, -507880, 693637, 3434900, -2971581, 2876018, -1381906, --1286343, 2364916, 3260417, -602369, 1890859, -7096360, 4315906, 4069482, -7397008, -6625524, --1793149, -5505075, -1464584, 2015950, 1416266, 1922535, 176094, -1875290, 4651450, -1597728, -230318, -1895154, 1143535, -2839510, 3967476, 897111, -2942590, -1740536, -1127429, -1802276, --1478543, 3894462, 5244692, -307090, -993211, 141197, 1722819, -1138166, 3684008, 1995549, --1415729, -338229, -860067, 1512902, -1452773, -103079, -335544, 179315, 638876, -149787, --380105, 921807, -694174, -312996, 270046, 594853, 118112, -1374390, -840203, 193274, --798864, -785979, 936303, -520765, -1538672, -1094680, -1224066, -403727, 273804, 1484985, -11079942, 2135673, -4117263, 5160940, 641024, -3474629, 10121627, -6782290, -9753871, -5690295, --5917928, -1968706, 2871723, 3575560, -3376918, 5137855, -6428493, -3478387, -784905, 2150705, -1593970, -1932198, -2529736, 5748277, 1096290, -365072, -3214783, 4299263, -3129958, -696322, --10737, -334471, -452045, 1692217, 886374, -852551, 3565897, -1652489, 2174327, -122407, --5820755, -2252174, -2324651, 6222334, -3430068, -4139275, -7556458, -8798241, -1611687, 484794, --3523484, 6738804, 909459, 3636764, -2702608, 5839545, 2480344, -3325379, 9361418, -4199405, --4522601, 764504, 5871757, 8637716, 6096169, 2057826, -2985002, -6722161, 2705293, -38655, -6678674, 2726231, -1893544, -184684, 3412889, 2778307, 63351, -588947, 294205, -1282585, --2793339, -215822, 899796, 747324, 2444373, -33823, 1489280, -461709, 1180042, -241592, -240518, -194884, -1623498, 210990, -279173, -2049773, 1714229, -330176, 1059246, -512712, --1109712, 217970, 225486, -19864, -716186, 844498, 339302, -491774, -143881, -1555852, -237834, -847719, 846109, -236223, 1782948, -30065, -872415, -711354, -10559177, 1709934, --3875134, 2504503, 643708, 7614440, -9768903, -5473936, -7183333, 3889630, 3120831, 4655208, --5137855, 1822677, -1559073, 719944, -7973607, -6687801, -5006858, -4840428, 7962333, -3151432, --1005559, -70330, 2686502, -1200443, -8465917, 3627637, -3391414, -1024887, 3859565, 3005403, -4436701, 366146, 2355790, -5825587, -2477123, 5372467, 8757438, 5238250, -416612, -6635725, -4754529, -2084133, -5833103, 8093866, 2347737, 2838437, -4961224, -2791729, 2720325, -1729261, --2774549, 4312147, -3359738, 1556389, 184147, -5498632, -1210644, -3608846, 5842230, 3075734, --838056, 1089848, -2721399, 3564823, 559956, -9664, 1010391, -6593849, -3504157, 3864934, -1800128, -998043, -882079, -4660040, 7775502, 9742060, 5309654, -4328254, 3937948, 777926, -3358665, -1374390, 2758443, -2023467, 1779727, 3623342, 1883343, 1789928, 1263794, 168577, --1203665, -295816, 3439732, 281857, 213138, -1196148, -264141, 827855, 2062658, -155693, -2426657, 505732, 47245, 15032, 1967095, 2543695, -1080184, -358630, -289373, 488016, -1727114, 9664, 455267, 241592, 402653, -762894, 2910377, -15850577, 5289789, 799938, -3943854, 4263292, -3092913, -11213086, 8637716, 3662533, 8498667, -1570347, 4504884, -96637, --3060164, -219043, -7924215, 9683004, 2210298, 907849, -4992900, -2877628, -3383361, 2883534, --4454418, 7410429, 320512, 2541547, 4130148, 2270964, -483184, 2381559, 2282775, -1751273, -1919850, -8271570, 2137820, 3744675, 3841848, 7393250, 2564632, -4970351, 2471217, -2515777, -5030481, 955630, 3656628, 5620502, 912681, -1258425, 4409858, -3067144, -4818954, -1801202, -3070902, 7794292, -1868848, 466541, 124554, 908386, 1519882, 3248606, 1096827, -2085207, --385473, -2803540, 1997160, 619012, -4974109, -4394289, 1722819, 2719788, 2740726, 4879620, --7587597, -4106526, -5536750, 6455873, -2882997, -4064650, 2083059, -3750580, -5415417, -1987496, -129386, 5737003, -2063732, 1828046, -2321967, -1389959, -358630, 1717987, 741419, -1088774, --900333, 1064615, 2844879, 927713, 1629940, -841814, -569620, 1899986, -102005, 85899, -705985, -1405528, 2537252, -850404, -204011, -1250909, -3294240, -560493, -746251, -296890, --62814, -1285269, 102542, 2870649, -757525, -341987, -585189, -1144609, 3825742, 16178068, -8454643, 7730405, 11063836, 3117610, 1950989, -6735583, -309238, -12669080, -2383707, 4941360, -3439732, 2349347, 2863133, 3593277, -2840584, -1782411, 7223062, 6675453, 5567352, -345745, -704375, -9025337, -7978976, -2904472, 5675263, 1948305, -1287417, 3214246, -5397164, 584652, --2829310, 6424734, 4889284, 11221139, -1198296, 4284230, 3408057, -1710471, -5935645, 10561325, --6187974, -1301375, 4650376, 308701, 2602213, 7635915, -2509335, 2898566, -7402913, -15537044, --8759586, -5101885, -2195265, 804233, -722091, -3947075, -8493835, -1669669, -6127308, 1931125, --239444, 823560, -9567577, -4230543, 6036040, 2199023, -470836, -10415833, -9599252, 5731097, -913217, 3519726, -7062000, -5474473, 269509, -2755222, -6040872, -4141959, 3229816, -1210107, -1430761, 517007, 4064113, 3133179, 1324997, -2043868, 1021129, -302258, -2634963, -2418604, -2291902, -950262, 602369, -1537061, -2548526, -350040, -303869, 2243047, -349503, -2035815, -462783, 886911, 2288144, 544924, 469225, -940061, 2891050, -1065152, 3306051, -1808718, -2423972, -2165737, 282394, 1401770, 8590, -89121, 439697, -533650, -865436, -8164196, -6182606, -3642669, -280247, -21214454, -4984847, -7856032, -5162551, 840740, 7015829, -1414118, -9270150, 4879083, -529355, -9134859, -3757023, 13543106, 2284923, -8138963, -5917928, -2700998, -6374805, -4977867, 91268, 4354023, 6933151, 7787313, -8545911, 5740224, 793495, 1609539, -2458332, 3143379, 2765422, 7807177, 227633, 2355253, -6848326, 9572945, -4809827, -2281165, -1622424, -7986492, 9861782, -1582159, -19248970, -6389301, -15454366, 922881, -218506, -4694936, -20974472, -3690451, -10377178, -3544959, -2549063, 9613211, -1316944, 4574140, 5652714, -3956739, -7197829, 9908490, -5044976, 3758633, -8827232, 4283156, -3165391, -2517388, 10196789, -3755412, --976031, -4555887, 270046, 151398, 3889093, 5735929, 6101001, -1648731, -1731946, 219043, -7901666, 3726958, 4107063, 136902, -6455336, 2571612, -3135863, -3532074, -1931125, -84826, --182536, 399969, 1432909, 1487669, -381178, 4275640, 693637, 1859184, 745177, 832150, --1203665, 1121523, 432181, -1285806, -1883343, -1236414, -3237332, -2543695, 2224793, 1781875, --2741800, 734976, -153008, 759672, 3088082, 648540, -1214402, 329639, 991601, 63351, --2506650, 1103807, 9598715, -13419088, 2649995, 2782602, -4299263, 1836635, 10096931, 10895258, -3987340, 3913252, 5137318, -8383240, -1510755, -8954470, -238908, 5756867, 3578245, -1870458, --7157026, -2282775, 4742718, -9290551, 257698, -649614, 4233764, 8877161, 775778, -4765803, --3706020, 9494562, -6163278, -2934000, 5389110, -3389266, -11283953, -4056060, 2477659, 1902134, --4559108, 1053341, 5762773, 4033511, 5553393, -660351, 4165582, 8061117, -3637301, 4015258, -3380676, -5514738, 11872363, -11498701, 6765111, 3013457, -16069083, 15287936, -9987410, 2166811, --1861332, 12196633, -5276904, -8659728, -1939715, 67109, 2113124, 9364639, -8071318, -403190, -464930, 535797, -1540283, 2761664, -6589554, -966368, -4732517, -8645769, -9673340, 5134634, -4060892, 3965866, -23085, 6032282, -2908767, -7017440, 1700270, -12411919, -10452340, -1969779, -2905009, -133681, -2036888, -1629403, 1358283, -6812892, -2390149, -1461363, -1230508, 3113851, --455803, 483184, 128312, -2266669, 986232, -2544768, 58519, 1149441, -2845953, -624381, -2166811, -1839857, -120259, -1307281, -238908, 797790, -54224, -3775813, -723702, -107911, --323196, -702764, -2415382, -3892851, -1060320, -305480, -673236, 3038689, 2160906, 352187, --856846, -10872173, 8650601, -24715390, 13598940, -9931575, -6567005, -12163884, 1469416, -1599875, -2229088, 8413841, -7089918, -2930778, 6943889, 6081137, -1949378, 2267206, -3211025, -11413339, --988379, 2671470, -5688684, 8916352, 1601486, -1220845, -5327907, -5469641, 1293859, 13826573, -635655, -2126546, 3874061, -12252468, -2051384, 4257387, -8160438, 11592654, 7495792, -581431, --3572876, -4097399, -4507032, -8198019, -9912785, 8194261, 639413, 14680198, 1366337, -926639, --6651294, 1078037, -2596845, 3177202, -191126, -9504763, -7297687, -9681930, -16037408, -2388539, -14165339, -13684303, -818728, -14321568, 2276333, 3841312, 3308736, 9963787, -1098975, -14716705, -10468983, -1160178, -7038378, -6025839, -12577812, -4457639, -9561134, 5103495, -14688788, -2595771, -5791764, -256624, 1132261, 6888591, 3594888, 8302709, 47245, -4711579, -1792075, -3272765, --143345, 2977486, -848793, 406948, 440771, 199716, -2441689, -3716757, 2269353, -2643552, -1104880, 317828, -500901, 986769, 386010, 338766, 5083631, 788663, -290984, 839129, -1612223, 999117, -2548526, -509491, -5371931, 1898376, 2786360, 4092567, 1516124, 1334124, --83752, -2836289, 1635309, -232465, 10553808, -3863860, 9383430, -9159018, -4854924, 6412923, -2057289, -12361990, 801011, 16071768, -18518288, 1088237, 8651138, 20808042, -8899172, -5300527, --2281165, 16109885, 15822660, -16734803, -787590, -12859132, -6155225, 8360154, 8415452, 11012833, -6256157, -2199560, 7745974, -9598178, -5173288, -976031, -1479079, -13889387, 1222992, -334471, -18347564, -2856690, 9039296, 2163590, 5355824, 12267500, -7445863, -3340948, -18134962, 12461848, --15984258, -2868501, 3661997, -2191507, -9236327, -2351495, 2612414, -6600291, 1789391, -1110786, --1408212, -20414516, -14442364, 965831, -10474888, -14350559, 2626909, -13273060, 4199941, 8557722, --7779797, 14731201, 3090766, 9433359, 10165651, 2556043, -7565048, -9012989, -11155641, 5664525, --11575474, 6890738, 8344048, 11461657, 2022393, -8281771, -5289789, 156766, 1101659, -15374372, --391379, -9985799, -1700807, -2884608, 601832, -7337952, 936303, -1747515, -122943, -4801237, --3454228, 1035087, 7614440, 711354, -751082, 938987, -1109712, -2929168, -2804614, -3164317, --1369021, -3739306, 3914326, 2770254, -297963, -3120294, 4653060, 6894497, -1588601, -1338419, --1688996, -841277, -268435, 1597728, -2696703, 2654827, 2551748, 1638530, -2571075, -523449, -1421634, 1896765, 4790499, -9854802, 25435334, 10605348, 4418448, 13080860, -4990215, 2753074, --13493177, -17392470, 10977400, 22362820, 6674379, -103616, -22079354, 26670136, 3875134, 3285113, -3846143, 989990, 4842039, 1523640, -3800509, -163209, 6755447, -4133369, 8483634, 1626719, --6642704, -9243843, -2503429, 8447127, -2292976, 2757906, -3798899, -3388729, 163746, 23929948, -3892851, 3462281, 3253975, 2020245, 14363444, -5343476, 4148402, -9266929, 17108466, 23803246, -6226092, -1371168, -8450885, 24872156, 11711302, 366146, -9603010, 3637301, -5752572, -892816, --11020886, -4149475, -7347616, -10126996, 16391206, -4912369, 12084964, 2530273, -9387725, -140123, --20113332, 19137838, -1367947, -9156333, -7132330, -11668889, -14361834, -7865159, 22288196, -6941741, -8039105, 10117869, -8985072, -8563091, -16054588, 2423972, 10846403, 3721589, 10370199, -2385854, --2035815, 469225, 2954401, -4415227, 1247151, -7997229, 2608119, -366146, 9091909, 6416145, --4909148, 502511, -266288, 5414880, -1836099, -7189239, 1596117, -213138, -587874, 2688650, -490700, -1114007, -3616899, -4021700, -787590, -944893, 4262755, -141197, 4272956, -5860483, -1403917, 4468377, -8371428, -6052683, 2172717, -4483409, -1199907, -2640331, 6253473, 7545184, --5621576, -5942624, 23659902, 23226646, 28656558, 17270064, 5679021, -7276212, -7584376, 4305168, -8315057, 10205916, -15249818, -435402, -1828046, 7659001, 6023692, -10558103, -13050795, -34897, --4952098, 12446278, 14615774, 10737, 7742753, 2570001, 3088618, 16909286, -10327249, -13656385, -10773389, -17889076, 1537061, -5500780, 9873593, 5062693, 171799, 11579232, 10602127, -9628780, -12013560, -6442, -5155035, 2865280, 13051869, -5028870, 5577552, 9706626, 4372814, -20851530, --12079596, 2078227, 1092532, -14169097, -9707700, 4736812, 6742025, 5762773, -19346680, -13482439, --13467407, -1043677, 8370355, 12247099, -30727806, -22550188, 3745212, 4745402, 17730162, 6281927, -6494528, 12944495, -1403381, -3288334, -4702453, 31741956, 10950556, -4976257, -16609712, 15190762, -9891310, -4930086, -4523138, 2369748, -4582730, 8128763, -2941516, -1704565, 4751845, -1150514, --1919850, -2469069, 4989679, 13032541, 71941, 957241, 434865, 5686537, 7239704, -1817845, --4592394, 1997160, -449898, 1495722, 826781, 1147293, -6191732, -3331821, 4342749, 477278, --2537252, 2166811, 6051609, 4769025, -8188892, -1797444, -5456219, -5187784, 3837553, -6200322, -2409477, -3326989, 6020471, 4733591, -7230041, -10070625, -19499688, -18974628, -15600932, 6022081, --2011655, 8806294, -17200808, -2833068, 801011, -6634114, -8050380, 13983877, -5358509, 2833068, --214748, 974958, -14025216, -5157719, -11993696, 1597728, 1580548, 3118683, 33149094, -12911209, -9153649, 13959181, -7085623, -6680285, -10033044, -2023467, 15483357, -15796890, 10816338, -1031866, --2636036, 1457068, 1584843, 8494908, 951335, -16757889, 12819404, -10436771, -24060406, -19468014, --9758703, 32571958, 27630062, -15014132, -4325569, -20613696, -17211008, -6788733, 20116554, 530428, -13874355, 7261179, -9466108, 10586021, -7207492, -21453898, -1821066, -13005161, -2655901, -6964827, -42362872, 396748, -35072704, 27543626, -11114838, -7808251, 27814746, 28284508, 89657, -12369506, -5511517, 6926709, -38087232, -16372415, 1005559, -5586142, 19932944, 8454106, -28896004, -4308926, --2325188, 13111998, 8325794, 5717675, 5171678, -5999533, 1022202, 2314987, 12079596, -1478543, -1653026, 2393371, 2054605, 7128035, 3357591, 184684, -8268886, 10473815, -960462, -23085, -470299, 40802, -4478041, -6929393, -4787278, 977105, -1741609, 3072512, -496069, -3050501, -3297998, 7743289, -10283762, -3299609, -3158412, -1433982, 2892661, -160524, -2965675, -5742372, --2204392, -1452236, 5313949, -16953846, -10395431, 5033165, 4089883, 9079024, 28953986, 4885526, --646929, 6662031, 1599339, -12095702, -7283191, 6373195, 1575716, 23472534, 5655398, -1563905, -8615168, 12556337, 12913356, 13707388, 833761, -9782862, -2600603, -22221088, -2920041, -25078314, -14017163, -15302968, -5800354, -30065, 20307680, -11829414, 11336566, -8340827, 6901476, -10434623, -12989055, 19398220, 1409286, -4235375, -10418517, -15247671, 8547522, 9587978, 24815248, -3467649, -1316944, 10784126, 39697844, -9365713, 6013491, -6534256, -21996138, 15372762, -3088618, 10894185, --1298691, 2605972, -13226889, 36556076, -54951424, 40371620, -63061932, 27084600, -32500554, 9986873, --25471840, 9061307, 16990354, -4182761, 12638478, -6610492, 46104328, -28071906, 30629560, -47521664, -23957328, -18728204, 23049478, -15605227, -16677358, -8342974, -4188130, 11450920, -3138011, -2215130, -1201517, 539555, -5873905, 8086350, -8883603, 8552354, -6410776, 2488934, -10225243, -5936182, --7546795, 1162326, -6937983, 8425115, 9234717, -8929774, -111132, 3276523, 8474507, -1495186, -3054259, 6696928, -6464463, 11214696, -3163244, 14901389, -9004399, 17890686, -12919262, 4414153, --1048509, 9856413, 8407935, -1874216, 4925791, -14250701, 15940234, -11229729, 3876745, -11414412, -8055748, -15137612, 5097053, -1559610, -5443334, 5290326, -10698764, 1620276, -5255430, 5214627, --5200132, 2987687, 1881733, 1400159, -4005594, 13980655, 11272142, 44399224, -30859340, 12913356, -8177081, -26672820, -691490, -5250061, -7529615, -13709536, -686658, 1566053, 17726404, 6584185, -9299678, 13278428, 10803453, 395674, 14787036, -17003776, -2401961, 20476794, 2328409, -28113246, --6416145, -36786932, -6831146, 6411313, -6772090, -8578660, -1557463, 32875290, 8354785, 2515240, -4058744, 8227547, -2437931, -18864034, -5733782, -2096481, 3544422, -4351876, -8770323, 23805930, -12858058, -4925254, -1092532, -5119601, -21489868, -17675938, -12872554, -10734734, 24067922, 5785858, -8907225, -14484240, -14026289, 4521527, 9818295, 9019431, -4033511, -2849174, -16294569, -10792179, -14294188, 643171, -39494372, 13903346, 21599390, 6900939, -17194364, -10597832, -8551817, 2831994, --12372727, 6123550, -29065654, -38890392, 16123844, 14026826, -7746511, -14299557, 10936597, -6403796, -2850248, 3376381, -5705327, 6222334, -3526168, -3660386, -2085207, 9346386, -6630893, -1967095, --7256884, -106300, 630286, 6248104, 6493991, -731755, 3833795, -4599373, 7583839, -5276368, -6197101, -14310831, -6497749, -1977296, 4147328, -4681515, -9319005, -7162932, 3423626, 7368017, --264141, 9521406, 2688113, 3764002, 596464, 6199249, -3499325, 5925445, -1421634, -11787538, --9059160, -3474092, 5374078, -6626598, 3905736, -9889699, -4350265, 4523138, -36686000, 32114008, -39024608, -3651259, 28363964, 1160178, 4306779, 12372190, -25116968, 9124121, 18529026, 18318036, -7648800, 5673652, -18174154, 13267154, 7766375, -11005854, 5817533, -2190433, 21590800, 5960341, -5489505, 12780212, -5174899, -14738717, 4211216, 27551678, -9921374, -5370857, 24841018, -9154723, --11187853, -9078487, 8520141, 32004486, 44471700, -2781528, -28937342, 43663176, 14986752, -28777354, -32518808, 12461311, -8133595, -8367133, -12271258, -20282984, -1207423, 10633265, -17444546, -11398306, --36788004, -5001490, 21328270, -44511432, -24158654, 7015829, 7119982, 8767639, 26941792, 23878408, --39602820, 314069, 1461363, -28002114, 7761543, 13306346, -14415521, -10263898, -12180527, 8097624, -31026306, 9711995, 16109349, -21268678, 10776073, -24081882, 2050310, -16202227, -65805340, 50267760, -12868259, -18373334, 33983392, -11766600, -15567109, 9132711, 6899328, 8732742, 13252658, 5356361, --13429826, -4274566, 12999255, -459025, 4964982, 2074469, -2203855, 3173444, -5925445, 4309463, -12139188, 4369056, -7261179, -5362804, 3662533, -3305514, -6595459, 2449742, 7547332, 4382478, --22805740, -6920266, -16813186, -8733279, 9695352, -7511898, -9427990, 8864276, 5689221, -9863392, -12400644, -9257265, -4100083, 4430796, -7299834, 8149164, -3718368, -13539884, 11138461, -20889110, -24067386, 79678088, -25418154, 678068, 6154688, 35963908, 31936304, -10464688, -13820668, -20120848, -889058, 15223512, -473520, -10294500, -10533944, 14367739, -7813083, -19350976, -17248052, -3506304, -29326574, 20529944, -23252416, 1553168, 464393, -10165651, 11587285, 4263292, -8269423, -2751464, --6494528, -3129421, 37431712, -13926968, -24785720, -17383344, -14067092, 33063196, 961536, -7667054, -30494804, 20930986, 8367670, 15497316, 29988536, -18204756, 4665945, 29135448, 17082158, 22260816, --25229174, -7118372, -893353, 10669773, 10094784, -23917600, 2335925, -31425202, -47231220, -2478733, --12455942, 21973590, 24472724, -6387153, -1884417, 4977330, -17137456, -45779520, 30880278, -22172232, -4822175, -8522289, -15431281, -8960912, -17903034, -36279052, 21499532, 19110994, 23211078, 4499515, --28795608, -50658064, -14993194, -13990856, -6142877, 16058346, -10311143, -2500208, 3119757, 2188286, --8004746, -3649112, -6418292, 825171, -2826089, 5401458, -3120294, -3890704, 5941551, 7694971, -6120866, -12218108, 4078608, 746787, -1045825, 198105, -26884348, 1358820, 3790846, 4020626, --17691508, 11616276, -2482491, -14724759, -12031277, 7243463, 9572408, -1713692, 5712307, -9050570, --6345814, -6146098, 790274, 11084237, 2858838, 10591926, -189515, 4948876, -15590194, -2356863, --3685619, -2876554, 12297565, 5901285, -366683, 3959960, 1898376, -12279848, -3957276, -38960724, --22618908, -18070002, -46261628, 53382684, -1402844, 28199682, -6578816, 1569811, -32300838, -17389248, --16756278, 3883724, 24978992, -982474, -26388816, -19425600, -37643776, -41528040, 35574676, 13363791, --32647120, -9906342, 15824270, 29950418, 3980898, -36793376, -22665616, 7452305, 10146860, 9342628, -21383032, -22814330, -22003654, -3183645, -7936026, 3209951, 6229313, -44248900, -8384313, -30813170, --20039244, -41150620, -15862388, 56761216, 9558450, 1953673, 13680545, 14198088, 4230543, 42223824, -33093260, -10842645, 11107322, 56994216, -15093589, -13108777, -13780403, -42169064, -1840930, -23012972, --52796960, -54985780, -29125784, -28303834, 12672301, -21154324, 1651952, 11355894, -37687264, -13561896, -21475, 11274, 9456444, 24678346, 16076063, 29724394, 39798240, 29210072, -3796214, -20953534, --30878130, -2424509, 12465069, 3925600, -4537096, -190052, 8467528, 7217156, 18623516, -1921461, -2779381, 539018, -6507949, 6371047, 747324, -2822867, 15880105, 7185481, 3428995, -14875082, -9932112, -5191542, 7435126, -14093935, -39982924, -1625645, 15472620, -2723009, -21327196, -13293461, --15667504, -11388643, 4815732, 7201050, 7665443, 2429341, -1627793, 6204617, 15347529, 26271242, -24325084, 30815316, 25914758, -2175401, 17366700, 40119828, 2638721, -17110612, -25095494, -24720758, --34323768, -27347130, -13429289, -14477261, -2214056, -4151086, 35050692, -22859964, 6781754, -26508002, --9223442, -28928216, 3548717, 35430260, -1003412, 21950504, -43813500, 38483444, 12647605, -7721815, -30185030, 4391604, 13613973, -12030203, -14565308, -153008, 9088688, 7252053, -30684320, 28070296, --33983928, 4240207, 9207336, -11357504, 19650012, -20883204, -12166569, -2225867, -7740605, -10534481, --2604361, 4581657, -15851114, -18294414, -6223408, -3144453, -4787278, 11227045, 5783174, 4608500, --22572738, 5985574, 26818312, 35990752, -26812944, -13313325, 30254824, 41834056, -25651156, -15637439, -17308182, 7427609, -20447802, 16733193, -47601660, -9290551, 18930068, 37804840, 4577899, -23433878, --21544630, 5739687, 44940392, 3947075, 6432251, 1352915, 14666776, -2913062, 33291366, -385473, --37615860, 23480586, -24679956, -7477538, 9919227, -14251238, 3007551, -30353070, -11696270, 28069222, -12543452, -12641699, -18416282, -9903121, 1937567, -14672682, -4831838, -3284576, -9383967, -5558762, --4756140, -19047106, 11582453, -7168838, -8863739, -27567248, -7379828, 20133196, -14442901, -7812009, --7750806, -15792058, 29765198, 12311524, 696322, -1096290, -17263084, -25268366, 1138703, 22395570, -17996986, 6083821, -19404662, -11176042, -8938364, 10859288, 1519345, -16952772, -4663261, 967978, -6137509, -15095736, -10578504, -8957691, 22959822, 11909407, 1003949, -14666776, -13122199, 13036299, -27690728, -404801, -12677133, -17481590, -6432788, 7741679, 68183, -4097399, 447750, -3543348, --3233574, 2617783, 8378945, 125091, -1859184, 48855, -76773, -2177549, 519154, 75162, -191663, -3031710, 1941862, 419833, -57321708, -15415711, 9221832, -18843096, 55827596, 41513008, -26599270, 14685030, 37533184, 27132920, 8519605, 18585398, -45026828, -59628104, -8739722, 894964, --15833934, 8340827, -3267933, -15341623, -20066088, -15717970, 30667678, 27357332, -22049826, -2464774, --3418794, -5121212, -8097087, -10966662, -16786342, -22630182, -4780836, 40842992, -13355738, -22192096, --11145440, 38356204, -18158048, -17158932, 58474368, 21268678, 9524090, -13990856, -32719598, -22251152, --33735896, 9353365, 27151710, 74674448, -65690452, -27365920, 37956772, 53410604, 8895414, -2776696, -67768680, 33017024, -21860846, 22087944, -8207146, 647466, -47544216, -23404350, -16848082, -76951320, --33165200, -12060805, 41294500, -22103512, -13389561, 31493384, -2421825, -3690988, 7082401, 22299470, --21486110, 15897821, 23305566, 1000727, -4853850, -43220256, 19803020, 16124381, -50836308, -3177202, -5117991, 3758097, -4643934, -21925272, 5622649, 4302484, 5957657, -3048353, -6825240, 16648367, -3101503, -2864743, 10788421, 5122822, 29329258, -3553012, 9390409, 2387465, -23907398, -20018306, -14072997, -10914586, 8422431, 11599096, 6535867, 7361574, -141734, 20131586, -6596533, -4389457, --8074002, 6151467, 14944339, -22482006, -8893267, 11575474, 4802847, -12507482, -23797876, -5470715, -6116571, 49370112, 18023294, -4037269, 12719546, -2421288, -4625680, -18086644, 8655970, 7608535, --14391899, -6896107, -52210160, -2034741, 21417392, -4948339, -21804476, 9610526, -4941897, 23556286, -4633733, -11270531, -235686, 25215216, -14352170, 4140349, 9021579, -7541963, -272730, -13486197, -27685896, -1561758, 4079145, 550293, 13356811, -5961952, -5266704, -8560407, 5499169, 10536092, --4612795, 12497818, -5404680, 7746511, -13052942, -10131828, 15756088, 20378546, -26212186, 1345399, --1611, 2577517, 8214125, -16341277, 25228638, -22499724, 20300162, 2976949, -35357244, -1793686, -27542552, -35822176, 17129940, 294205, 4621385, -8493298, -5410048, 7408819, -10453950, 36969468, --27264452, 4219806, -7330973, -3155190, 9063455, 667331, -4488241, -691490, 11119133, -190589, --12795244, 3760781, 6471979, -21231634, 16630113, 7678328, 771484, 15512348, -5628555, -4576825, -7214472, 3526168, 4573604, 2784750, -4242354, 8842264, 3722126, 824097, -9366787, -1360431, -4566087, 8492224, -14210973, 7625178, 8845485, -12359842, 5952288, 2040646, 2134599, 6827925, --3738232, 1685775, -2343979, -18001282, -276489, -4190278, 7953743, -4912369, 3036005, 2219961, --752156, 2655364, 4609037, -2786897, 4832, 1056025, -130460, 1557999, 5534602, -5399311, -5185100, -3871376, -26125212, -74351792, -105827456, 35454956, 94358288, 20614770, 261303120, 214914256, -145441008, 245756960, 128209072, -8976482, -30627948, -97371744, -224212320, -185459376, -180080992, -250747712, --185156576, -54676008, -40101572, -6868190, 87144888, 40252432, -10856067, 54944444, 91399592, 44422308, -42788076, 82849384, 49507552, 37850472, 75315472, 117999928, 49192944, 69087232, 111020608, 18638010, -7406134, 97752920, 57919244, -38123204, 47185584, 60537564, -63869384, -19506130, 70173864, -14703284, --42353748, 90369336, 47950088, -56962540, 48535276, 64142652, -86594056, -81399832, -34810708, -209069888, --276921248, -174123344, -244870048, -326615072, -227492608, -233121168, -300910240, -238358880, -165195712, -179405616, --107215808, 9454834, 66267588, 144245936, 236810000, 294972992, 363720928, 403843968, 441564512, 467922176, -420399456, 330134816, 305214336, 195104256, 58661736, 45617384, -31954020, -151459344, -118860000, -51153060, --112661824, -116146120, -25021942, -82155744, -156194000, -94966024, -68860672, -140171088, -119204136, -42999600, --106066368, -126192584, -10868952, -7496329, -57249228, 21065740, 12053826, -91968672, -68215352, -40386652, --130109056, -179216096, -146507248, -200056896, -247487824, -184275568, -148000272, -140817488, -62255552, 26839788, -72679976, 108129024, 150285744, 169405856, 152055264, 198335680, 255121600, 264124912, 246830160, 251007552, -242315616, 195974528, 221865120, 199703088, 84766008, 8872866, -51882668, -112039592, -118010672, -98192080, --115197464, -113159504, -98137856, -97368520, -103357312, -86001888, -77017352, -74287904, -70239896, -55718612, --52980032, -55573120, -45278084, -32722282, -30918932, -25280178, -14262513, -8874476, -7583839, 3173981, -4186519, 2573759, 5940477, 11767137, 10277320, 12956843, 15501611, 13358959, 8629663, 5589900, -3449396, 3947612, 2647847, 3586298, 2702071, -984084, -5224828, -3391951, -157303, 5545340, -13037910, 21184390, 21923124, 24856586, 30047054, 32565516, 34510600, 40690520, 38627864, 32845762, -29588030, 28043988, 19981798, 17135846, 15855409, 9361418, 2532957, 3197603, -2459406, -9362492, --13837311, -20078972, -30206504, -33157684, -34616900, -36128728, -37577204, -34288872, -32960652, -30710626, --26059714, -19342386, -16582332, -11716134, -8262444, -7092065, -5049271, -410706, 1660542, 5151277, -6913287, 9184788, 9975598, 11004780, 11106785, 11664057, 9825275, 9531069, 8243116, 7568806, -5897527, 5883569, 4462471, 4192425, 2918430, 2924873, 1637993, 1674500, 719407, 1017907, -98247, 421981, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ -4089346, -9670656, 198642, 363462, -4604205, -3747896, 2832531, 1675037, 285078, 3923453, -5948530, --2070711, 9721658, 619549, 1917166, -2590939, -3243774, 4515085, 3839701, -1640141, 3779034, -116501, 638876, -3739843, 1357747, -3409667, -2600603, -3349538, 1151051, 89657, -1051193, --416075, 1158031, 2838437, -1352378, -5312875, 115964, -3800509, -4776541, -1304060, 2189897, --783295, 1956895, 1182727, 1795833, -801548, -651224, -948114, -752693, 1577327, -31675, -3289945, -424128, 4084514, 711354, 889595, 3953518, 1355599, 1030792, 5037997, -2042257, -1635846, -1742146, -3639448, 3323768, -1236951, 33823, 1173063, -578747, -3030100, -896038, -2102923, -1367410, -121333, -2873870, 1353989, 217433, -1979980, 257698, -3131568, 487479, --3005940, -242666, -86973, -374199, 1665374, 848793, 403190, 964757, -369367, 1751273, -1207960, -119722, 338766, 407485, -109522, 84289, 527207, -703301, 350577, -904628, -745177, 106837, -192737, -18790, 607738, 190052, -652835, 230854, -79994, -328565, --962610, -12741020, -6609418, -2979634, -2759517, -16106, 37581, 943282, 185757, -717796, --5212480, -2369748, -5341329, -8377334, -6990060, 3947612, 4878009, 4926328, -1933809, -584652, --547071, -1101122, 1822677, 758599, -1772748, -3795141, 2743947, 2335389, 3426310, 895501, --1138703, -2076080, 980863, 1634235, -376883, 3473555, -1675574, -93416, 3386045, -2576444, --4082367, 331249, 5680631, 1307281, 1269163, 798864, 65498, 732292, -859530, 1014686, --4458713, 737124, 4663798, -1056025, 87510, 469225, -1566053, -878321, -623844, -746251, --1221918, 2852395, -2645700, 2799782, 2398202, 5228586, -339302, 2944737, 6684043, -1216013, --5344013, -6003828, -264677, -772557, 350040, -5092221, 1507534, -3570192, -2640868, 1243393, -3754875, -1517197, -2816425, -3387119, -636192, -355409, 967978, 320512, 2172180, 1287417, --88047, 1102196, 343061, 2135673, 1631014, 1028108, 492311, 484794, -337155, 1438814, -102005, 449361, -138513, 55835, -1031329, 26307, -169651, 8912594, 6919729, 3031173, -3518115, -2247879, 1559610, 6182606, 2946348, 6653978, -2619393, 2720325, 3726958, -126702, -4793184, -2442763, 2978560, 615791, -3145527, -723165, -632434, -129386, -926102, 426276, --1601486, 551366, -1184337, 6093485, -1433445, -267362, -62277, -2654827, -7711614, 4427038, --1865090, 1750199, -3090766, -2814277, -3302830, -2092723, 1946157, 5850283, 4516158, 1988033, --375273, -1175210, 1788854, 4224637, -969589, -1297080, 5101885, -2212982, 2418604, -2497524, --2059437, -1161252, 1869385, 2108829, -3665218, -2420214, 51540, 3939559, 4964446, 2790655, -3859028, -467078, 3611531, 1510218, 3795677, -2092186, 1493038, 8865349, 4049081, 3804804, --951872, -2399276, -6045704, 3554622, 1449552, -2400350, -2534568, -740882, 1779727, -1746441, --891206, -1563905, 4832, 1334124, -585189, -2392297, 663572, 928787, 1366337, 1540283, -148713, 2149631, 969052, 940061, 588947, -599685, 1409823, 215285, -56908, -630286, --1133871, -1105417, 236760, 932545, 299574, 136365, 210453, 10737, 1260573, -1712618, --479963, 626528, -769873, 801548, 2697240, 10166724, 1447941, 3688303, 7362648, 137976, --4211753, -1808181, -1266479, 286689, -2655901, -7231651, 2896419, 237834, 151398, 3014530, --4800163, -2222646, 7542500, -1858647, -2858838, -4481799, 144955, -4236985, -715112, -1421634, --1281511, 529355, 6088116, -210453, -1925756, 1774358, -4861903, 6489696, -843424, -1479616, -8118562, -4704063, 371515, -5556077, -2547989, 451508, 241592, 2107218, 2549600, -4963372, -1453310, 2047089, 1665911, 449898, 2312840, 1668058, 3385508, -3154654, -1692217, 6390375, --2692408, 2423972, 588947, 1814087, 1634235, -577673, -2199560, -369367, 4508642, -2732673, --325881, -1469416, 1023813, 4010963, -2301566, -5086852, -9780714, 570157, -431107, -879931, -9127, -3791919, -2658048, -5482526, -2173790, 2663417, -122943, 1639604, -679679, 3342022, -2314451, -79457, 1725503, -185757, -244813, 1125281, -2151242, -1182190, -1753420, -64961, --2087354, 1168768, -111669, 527207, -799401, -715649, -124554, -796180, 433255, 713501, --1939178, 846645, 729608, 386010, -1851668, 898185, 601832, 1648731, 1763621, -228707, --666257, -1012539, 858457, -544924, -376883, 268972, -295816, -1200443, -4437775, -10857677, -5470178, -3547106, -6245956, 315680, -11696270, 2549063, 3526168, -1253057, 8476655, -3228742, --10295037, 2490007, 3851512, -3540664, -7296076, 12425877, -820876, -714038, 3107946, -2715493, --1631014, 1291711, -6113349, 3583077, -688805, 1777043, -1316408, 5822365, -1512902, 3274376, -2809982, -5704791, -2857227, -3205656, 5906654, -2942053, -1828582, 4546760, -1628866, -3344706, -2573222, 8320963, -4268124, 4066260, -4408784, 5478231, -3064459, 2897492, 496069, -2913062, --8551817, 4773320, 6061273, -549756, -2011655, 3540664, 4229469, 4187593, -5907728, -643171, --5219996, -450435, 1751273, -3576097, 1320703, 4072166, -4373888, -66572, 759672, -4094178, --3076270, 3888019, -2831994, 3080029, -1869921, -5265630, 1000727, -5104032, 1254131, -1911797, -1714766, -5623723, 5132486, -4230006, 448824, -3929895, -222801, -209380, 978716, -382252, --120796, -1202591, 1278290, -3794067, 1245004, -3100430, -2627446, 112743, 2204392, 1137093, -322659, 761283, 41339, 1418413, 2829310, -2423435, 2332704, -1549410, -442919, 1601486, -1125281, -1705102, -132607, -4410932, 5568425, -6135361, -6083285, -10435697, 4391067, 11014444, -1675037, -1986959, -956704, -1866163, 9593883, -5768678, -5251672, -1251983, -5790153, -1790465, --6291054, -2727304, -4418985, -8743480, -2459406, -1939715, -316217, -974421, 2254858, 5191542, -1848983, 2562485, -8031589, 977105, -142808, -2529199, 2769717, 1466195, -2353105, -1051730, --5724118, -6349573, -940061, 7001334, -2073396, -3628711, -789737, -2360622, -4948339, 64425, --5167383, 10513543, 8865886, 2279017, -2733210, -2486249, 909996, 1565516, 1799054, 1714766, --662499, 3899830, -3740917, 1713155, -3294777, 79457, -61740, 2179159, 1515050, 4920959, --2166811, -3059091, -2796024, -11462731, 329639, 2360085, -1184337, 4123706, 1764158, -3466039, -964757, -6029061, -2263985, 473520, 4566087, 1934883, 6258841, 1239098, -790274, 10737, -2295123, -2632278, -368830, 574452, -1120987, 1582696, -2298881, 1158031, -1762547, -1433445, --325344, -1956358, -1935420, -2388002, -1290101, -717796, 1720671, 1443109, -1799054, -2528125, --811749, -1940788, 1272921, -2161979, 993211, -1270237, -406948, 2097018, 91805, 1749125, -1155346, -1144609, -1114544, -10872173, 1846836, 10875931, 10450729, -11224897, -10047539, 2519535, --7974681, -4393752, 1258962, -671089, -3202972, 8227547, 3784940, -11851425, -862752, 593242, --20938, 7398618, 2877628, -5563594, 7988103, 2838974, 1123671, -4342212, -4428112, 3274376, --2812667, -8062191, -1370632, -1143535, -3476776, -4854387, -6340446, 6726993, 557809, 905701, --4369056, 6442, 4922570, -3924526, -7998303, -8288213, 8665633, 1826972, 8184597, -1394791, -2398739, 5869610, 12230456, 3820910, -1452236, -6307697, -2591476, -3195993, 1919850, 555125, --4767414, -2068564, 7140920, 4889821, 9676024, 4393215, -6570226, -6458020, 8017630, 4123169, --4106526, -54761, 8256001, 536871, -389768, -6460705, 7094749, 5161477, -1181653, 9676024, --1395328, -2921115, -10153303, -1452236, 577136, 5340255, -6987912, -538482, 3212636, -1825361, --5010080, -4864588, -578210, -576599, -864899, -6055367, -5200669, -3223373, 1964411, -213675, --2359011, -914291, -264677, 425202, 558346, 785442, -442919, 1906966, -1587527, -516470, -112206, -1283658, -3874061, 164283, 2350421, -812286, -3412889, 200790, -773094, 1141924, -268972, -536334, -244813, 1046898, -468688, 2019172, 1161789, -163209, -1855426, 1334124, --1447941, 1348620, 1791538, -4408247, 1742683, -1649268, -892279, 5393942, -8991514, 5403069, --5897527, 1061394, 4706748, -63888, -2401424, 1758789, -6177237, 242129, -4814122, -13953812, --4277788, 5894843, 3806415, 2141578, -3406446, 2836826, 1260036, 14880988, 2541010, -5057861, -5521718, 1074279, 1159104, 9884867, -2877628, -2808909, 3418257, -7006166, 8370355, 7730405, --215285, 4361540, -1666984, -4301947, -594853, -5400385, 411243, -5289252, 2013803, -104690, -1477469, 576063, -9067213, -1889786, -1207423, 469225, -4592394, 1936493, 1957431, -1767379, -11857868, -5233418, -10628433, 6281390, 10362145, 2327872, 2642479, -4632659, 8883066, -3084324, -1452773, 3975529, 1122060, -4086662, 4211216, 1806571, 461172, -66572, -8210367, -2921652, -3953518, 7207492, -2860448, -5401995, -7476465, -2461016, 2447058, 1328756, 3661460, -9199820, -1672890, 6126771, 760746, -396748, 2311766, -1952063, -1092532, -296353, -549219, 3194382, --962610, 987843, -1015760, -711891, -759672, -2383707, -1372242, 1068910, -1695975, 2185065, --408022, -443992, -1132261, -1359894, -7008313, 611496, 3662533, -230854, 1240709, -713501, -2247879, 731218, -1418950, -1649804, 1232119, 30340186, -8278013, 134755, -3016678, -1991791, --6721624, -200790, -17757006, 9200357, -6351183, -498753, 10353019, 5041218, -6790344, -7387344, --2699924, -6324340, 5713380, -14777372, 2766496, 6051072, 8474507, 1607392, 2558727, 289373, -1419487, -1998234, -4583804, -13511967, -1943473, 1653562, 6236830, -4903242, 6015639, 2274185, --2406256, -920734, 4668630, -4931696, -4566087, -2711198, -3479461, -583042, -11873437, -5634460, --2801929, -394063, 9482751, 2050847, 9048959, 3040300, -370978, -5719823, 731218, 498216, -1414118, 3054796, 12668543, 1413581, -11779485, 2989297, -4594005, -392990, -4417374, -5054103, --2297271, 4773320, 3172370, -21000242, -7815767, -6292664, 4008278, -964757, -4453881, -2948495, -11860552, -4918275, 9123047, -8619999, -6390375, -9328669, -5011690, -9912248, -1499481, 13092671, -3119757, -1651415, 1613834, 5528697, -73014, 6830072, -3841848, 2593087, 3895535, 4613332, -1887638, -890132, -9086003, -3449396, -4647692, 2684, 2996814, 2488934, -1806571, -722091, -3889630, 1536525, -2971581, -1327682, -2071785, -995896, 208306, 1922535, -1559610, -1629403, -4940286, 4071629, 1347546, -641024, 1817308, 3322157, 294742, -3058554, -250182, -3118683, -830539, -2805151, 1671816, 5027259, -1581085, -4653597, -5139465, 3844533, -9520332, 592169, --22202296, 5401995, -7279970, 2170032, -7567196, -16367583, -2536715, -3808562, 11603391, 4926865, -4168266, -391916, 15403900, -11589432, 2815351, 4378719, 11897059, -13727789, -7847979, -2721936, -1117228, -923955, -3913789, -1280437, 4099010, -7397008, 1493575, 4364761, -863825, 588411, --5982890, -6840273, -4247723, 18428094, 149250, -4492536, 7153268, -4438849, -9295920, -7610682, --5047661, -1343788, 3250217, 671089, 616865, 10225780, 9337259, -1701881, 3313031, 2245194, --11849815, -8131984, -537408, -960462, -3121368, -8082592, 9885941, 11955578, -9841381, 6447820, -6041945, -1935957, -9409200, -15160698, -14708652, -11339787, -6699612, -13087839, 1158567, -10719165, -6381248, 5751498, 919123, 105227, -18296560, 1170379, 302795, 1320166, -9398462, 3117610, -10336913, 1369021, 2591476, -8299488, -5168457, -1044751, -8761196, 1999307, 5378373, -2605435, --3285113, -4037806, 3337727, 5492190, -9728101, -5332739, -532039, 6418829, 2336462, -2853469, -2208150, -378494, -164819, 2863670, -1923072, 3700651, -4357781, -1555852, 3067681, 2684892, --1136019, 7205345, 393526, -4592931, -3935801, -699006, -3256659, -2925947, 310848, 1994476, --1431835, -1533303, -9078487, -7632157, -5282273, -5974837, -1884954, -13559212, 589484, 14780593, --5228049, 7776039, -3131568, 14734422, 12481175, 5137318, -15354508, -3969624, 20463372, -5334887, -15163382, 2335389, -14585172, -7426536, 17134236, 320512, -11568494, 220117, -9868224, -1405528, -3452617, 1356673, -1999844, -17161616, -15228880, 4142496, 10964515, -9826348, -893890, 4233764, --767189, 1626719, 18234284, 3310346, 2627983, 1529008, 6005975, -8140574, -5763846, -4203699, --19286014, -6585796, -7258495, -5036386, 5048734, 3345780, -1250909, -1966558, -7649337, -11589432, -15032386, -3293703, -13269838, -6249178, 2660195, 10044855, -8029442, -2550674, -8519605, -1640141, --10173167, -1998770, -2190970, -20428476, 1840930, -6910603, 14091788, -3682398, -11502996, -21665426, --14283987, -2739652, 1768990, 7551626, -5617817, -5155035, -11804181, 10750303, 18205830, 1895691, --2181307, 6172405, -4780836, 6829535, -5158793, -2514167, 2331094, 5216775, 3769371, -6395743, -209380, 1301912, -94489, -481036, -1608465, 1697586, 6465537, -2738042, -5694053, -272730, --1278290, 2940979, -46171, 6268505, 439697, 2277407, 228170, -3882114, 1019518, -1569811, -6766721, 367220, -4292283, -842350, -1029718, 4492536, 466541, -4979478, -739808, 3453154, --1586990, 817118, 7108708, -24982214, -12676059, -8630200, -13579076, -7350837, -5524939, -14191646, -14915885, -4357781, 22486302, -11377905, -16869020, -3350611, -11305965, 19247360, -6586333, -10237055, --4655745, 5119601, 9874667, 8371965, -1977833, -2322504, -4363687, 2071785, 15976205, -479963, -1581085, -5180268, -1946157, -8390219, -2659659, 3641059, 2806224, -6945499, 397284, -10251013, -2113124, -3100967, -2982855, 4110821, 2008971, -4801774, -1832877, 8661338, 3346317, -7269769, --9425306, 15800648, -682900, -25295210, 13204877, -2851322, -10652593, 5035313, -1485522, 1108102, --2388002, 8731132, 3466039, 850404, 24320790, 23890756, -8378945, 2565706, -17926656, -3872450, --3390340, 7596724, -2685965, 1195075, 7460358, -5492190, 13920526, -5901285, 1592896, -18807124, -7862475, -4929549, -13059922, 6548752, -2966212, 26368414, 6362457, 4989679, 9845676, 1047435, --9147207, -780610, -3728032, -2313377, 2723546, -3316252, 5458367, 3254512, -3958349, 6686727, -3895535, -4461398, -1077500, 358630, 763430, -1856500, 1522566, 2317135, -549219, -2023467, -548145, 2055679, 1332514, 1546188, -4155918, 4268661, -8412230, 7514582, -4903779, -2967286, --479426, 3897683, 5729487, 1464047, -6357626, 19864, -2503966, -1593970, 1656247, -6252936, --11169062, 3275450, 30045980, -22536230, -7105487, -14271639, -9365176, 11325829, -12837120, 27477590, --3127273, 8386998, 1628866, 6669548, -16990890, 3126736, 4595615, -1269700, -2462627, -1505923, -5163625, -10506564, -6257231, -1491427, -2859375, -12983686, -11415486, -3093987, -5215164, 15683073, --3965866, -7434589, -5251135, 5392869, -7932805, -3409130, -13818520, 6531035, -5201743, 5756330, --4808753, 7319698, -3606699, -24046448, -12123082, 3554622, -1746441, -1468342, -7371238, -14318884, --692027, 6313602, 4375498, -3252901, 4855998, 7371775, 22940494, -9778567, 10940892, -25661892, -1755568, 3773129, -2910377, -7369090, 5346161, 968515, 1331440, 5768141, 18272402, 12305618, -9434969, -4855998, -5704254, 8977019, -10779831, 2695092, 9322227, -6492917, 22830436, -342524, -7191386, -6180458, 13234405, -12441983, -12108587, 408559, 4746476, -5615670, -1217086, 14176613, -287763, 12909061, 4873178, -1983201, -1880122, -7348689, -432718, -377420, 3801583, -464930, --5752572, 1041530, 2825552, 7328288, -10509785, 1858110, -5250598, 2272038, 6267968, -2070174, -5906, -5556077, 2011655, 2100239, -3434900, -12836047, -7870528, -5059472, 2677375, -6770479, --3674882, -4531728, -3895535, 2612951, 5157719, -112743, 4314295, 1613834, 2391760, 785979, --9096741, 7920994, -6659347, 12236899, 35274568, 25327422, -6951942, -15535434, -10862509, 21734146, --25802552, 1564979, -6694781, -6085432, 10261214, -18573050, 2294050, -9408663, -446677, -12867185, --10283762, 1710471, 471373, 712428, -12822625, 20286204, 3857954, -8807904, 3428995, -2472291, -1548873, 30151744, 9250286, -8184597, -7582228, 1635846, 9077413, 2688650, -22629646, -5337571, --15713675, -4995047, -7475928, 7747048, -4403415, -1952063, -374736, -595927, -11214160, -12582644, -8081518, -4658429, 2019708, -425202, 10924249, -8886824, -6711424, 3011309, 4426501, -11822434, -13151727, -8218957, -19769734, -18041010, -6750078, -5057861, -8139500, -3912178, -28010702, 9971303, --13421773, -4012573, -11247446, 15561740, 4749697, 7532836, -258235, -2196339, -13683766, -3894999, -17871896, -14762876, 21709450, 16938814, 5636608, -3791919, 500901, -2937758, 2897492, -9543954, --8068096, -4680441, 1076426, -1165010, 1130113, 4265440, -7317551, -1590212, 6831683, 7562364, --3179350, 4762582, -4202089, -6176163, -3070902, -1831267, 4425964, 1417876, 1494112, -6107981, --4382478, 2313914, -2598992, 2161979, 2332704, 4600447, 8518531, 3650185, 4658966, -5772436, --3684008, -1885491, 2313377, -2736968, 911070, -2523293, 963683, 9074192, 3937411, 2563022, --1992865, 5759551, 1501628, -2201708, -35114040, -4214437, 23206246, -28475096, -11485279, -570694, --8849780, 10491531, -6037114, 32450626, -3329674, -6900939, -5426691, -1300301, 9401147, -6294275, --6300717, 26508538, -19383188, -2218888, 6091874, -4139812, 16460999, 9441412, -1189169, -1936493, -6971269, 9512816, 10176388, 8504035, 17431124, 5701032, 7488276, 4681515, -5685463, 29353954, -3661997, 5593121, 7371775, 4487167, 21081310, -1369558, 5197448, 7408282, 6091338, 3584150, -13910862, -8100309, -6648610, 13990856, -2549063, -13846438, -3593814, -24312200, -8317741, -4554813, -23147190, -21770652, -2834142, 1093069, -752156, -1118302, 13651017, 37536940, -6526203, 4835060, -4276714, 5817533, 17840758, -19186156, -19849728, -17893370, 31844498, 2508261, -11976516, 29390998, --11148124, 25645250, -13721347, 9936944, 1081795, -33741264, -4923643, -8315594, 9715753, -540092, --2916283, 382789, 6110128, -743566, -10275172, 5708549, 158914, -4627828, -88047, -8850854, -12140262, -1132261, 4364761, -5583995, -5192079, -4970888, -6878390, -469225, 207232, 11756399, --512712, 1467268, -4622996, 1480153, -10961830, 3685619, -10564546, -1764158, -2275796, -9249212, -5017596, -7279433, -7509214, 1858110, -10478110, 3431142, 8396661, 8038568, -3938485, -3479461, -2031520, 3391414, 7302518, 9520869, 545461, 20874614, 1749125, -20756504, -61588756, 12452184, --14897631, -23613730, 26482768, -15803869, -8343511, -23251880, 5937793, -4486630, -22993108, -7257421, --13706851, 6557342, -12703440, 785979, 4769025, 10454487, 5104569, 17587892, 2617783, 51003, --1932735, -14482630, -11378979, -10260677, 8322036, 13194676, 5930813, 4806606, -497142, 5207648, -10085657, 23977192, -11390253, -6085969, 4052302, -10630044, 11330124, 2671470, -10536629, 24401320, -8721468, -20201378, 7933342, -19425600, 2201708, 3931506, 10205379, -5388037, -6744710, 30976914, -11843909, -13054553, 7920457, 16475495, -12751221, -26660472, 14793478, -1970316, -420907, 2394444, -6425271, 41853384, -3986267, 5401995, 7873749, 59056, 9469329, 5789616, -22213034, 4886062, --11866458, -10087268, -6294275, 5234492, -35806604, -4151086, 11046119, 1962263, 17650704, -12850005, -12475269, -8326331, -3831111, -4602595, 5535139, 2667175, -4465692, 229781, -99858, -6131603, -4958003, -7791608, 8310225, 1320166, 5761699, 5177583, -3699041, -2774012, 1383516, -2030446, -1132798, 2143726, -3594888, -1073742, -4118337, -2633889, -2733747, -6966437, 44560, 1188632, -4075387, -2117419, 3921842, 9906879, -5184563, 1778117, -5202279, 2754148, 2993055, -7999914, --6979, 2811593, -7828652, -3664144, 6634651, 244276, 1242856, 1668595, 158377, 183610, --19000398, -21881784, 46933792, 10034654, -3016141, -5646809, 10602127, 42410656, 19473918, 5087389, --1202054, 14232985, 35439384, 8833137, 12241194, 11068668, 25282862, -16245714, 16391743, 7303592, --48431660, 14398341, -6809134, 14414984, -15045270, 11447698, 7623030, 15109158, -62814, 6442451, -2420751, -13697724, 6922414, 13702019, -11376831, 6921877, -11041287, -6613176, 34827888, 3626563, -30849140, -21818434, 9664213, -1038845, -4319664, -602906, -2586107, 4871567, 11370926, 7917772, --761283, 17679696, -27928024, -26318486, 19268834, -14932528, -3768297, -3412352, -18014704, 9247601, --4663798, 5271536, 2928094, 29902636, 14586246, 15817291, 6019934, 4336843, -26961120, -6109591, -13458817, -125091, 476205, 106837, -8551280, -23431730, 4655208, 2316061, -17493938, 2634426, --8324721, -6828461, 7562901, 5133560, 26894012, -3681861, 6962679, 6540699, -4978941, -6750615, --579284, -6405944, -2355790, 15911780, 6760279, 3015067, 970126, -124017, 563178, -28991, --747861, -10517838, -3074123, 6710350, -1671279, 840740, -3763465, -5213554, -1997697, 1926830, -12991202, -8322573, -8021389, 7719667, 3904662, -9363566, 6975027, 4283156, -6559489, 8755291, -938450, -4898410, -2149631, -3322157, -1367947, -1410897, 4486630, 2374580, 2370285, 5102958, -7320772, 5495948, -1112933, 3987340, 12480101, -42824584, 36589900, -15580531, 7480223, 23197656, --33683280, -1162862, -2409477, 8018167, 13283260, 14513768, 26002268, 4047470, -15828028, 8788040, -27671938, -38747048, -22075596, 25621628, 1915555, -431644, 1817845, 1988033, -93952, -885837, -13828721, 7893613, -17876190, 965831, -4579509, 31957778, 20080582, -6773164, 2581812, 3674345, -4644471, -399432, 12338904, 991064, 9636833, 32650878, 5194763, 3287798, -4294968, 8264591, --30544196, -13678934, -12442520, -1551020, 3988951, -27696634, 11502996, -24593520, 8915278, 25208774, --4912369, -22953916, -11615202, 9313637, -3852586, -46733540, 13348758, -32648194, -6500970, -4153770, -1655173, -13145284, 3887482, 16331076, -12919798, -31003222, -45891188, 36230196, 11610907, -5759551, -10925860, -11046119, 11644193, 20083268, -20358144, 36045512, 5540508, -3873524, 17335024, 9491341, --5237713, 9302899, 1266479, 10051297, -9194451, -5210332, 3315178, 7276749, 13128104, 3740380, -11901891, -7446400, 7029251, 11762305, 11038066, -1701881, 10113037, -10131291, 4679904, 1021665, -5014911, 19622094, -12401181, 7849590, 1736241, -657667, 15941308, 4263292, 20585242, -2517925, -10525891, 2715493, 8460012, 2341831, -3376381, 6087043, -9557376, 9016210, -3076270, 7500087, --1019518, 2132451, -81604, 1650878, 613643, 7875897, -987306, -1721208, -265214, 3483219, -405874, -643171, 1158031, 1830193, 1909113, 1568200, -148176, 1577864, -307627, 1513976, -1713155, 1671279, -1826435, 695248, 1162326, -867047, -756988, 52357260, -56314000, 23052700, -27836756, -34473020, -11329050, -18347564, -10924249, 51939576, -23744726, 36981816, -17730698, -4483409, --9882183, 12399034, 3861713, -44104484, -9131100, -11382737, 18454400, 1389959, 7284802, 15874736, --22543746, -3647501, -14715632, 8180302, 17289928, 11665131, -28959890, -4509179, 4706748, 4145717, --2695629, -12846247, -6423124, -24957518, -5611375, -3149285, 22341884, -20323248, 49937584, 11581379, --15893526, 22829362, -217970, 29534342, 14907295, 28037546, 5764920, 25633438, 19598472, 25075092, -25057912, 4280472, 24202140, -32051730, -6662031, 7088307, -22412750, -3416647, 12320651, -24831354, --37869800, 15036681, 22753126, 1011465, 4388383, -25493852, -8047158, -21299280, -1965484, 24805584, -905164, 46148348, 19698868, -11417634, 47347184, 25839060, -15440944, -5379447, -11370389, -15247671, --10941966, 12025908, -8081518, -23726474, 2738042, 16829830, -561030, -7726646, -7464117, -4884452, --9226127, -14384382, 1323924, -3286187, -3135863, -11111080, -2265595, -3895535, 3651796, 7985418, --3686156, 1599339, -4486630, -8716099, 4368519, -2346126, -8055748, -16503949, 6324340, -22748294, --4516158, -15796890, -10960220, -12873091, -4693863, -2099702, -6051072, -9062381, -5835787, -10342281, --3338263, -1315334, -2234994, -7013682, 8944269, -8454106, 3434900, -1864553, -15435039, -4323959, --15734613, 2036888, -1555852, -1671816, 1411971, -73543800, 67153424, -16085726, -20800526, -20407000, -46883864, -35847408, -4414153, -11083163, 788663, 23398444, -26119844, -3615826, 12037183, -9357660, --2412161, -489089, -14249628, 20794084, 2527052, -36979668, -7754564, -9844065, 3499862, -40424232, -954020, 3498251, -6505802, -845035, 12016245, 23040352, -8740258, -7307350, 6467147, -17411260, --49223008, 3180423, 41392748, -21653614, -29800630, 940598, 33644088, -16299401, -8362838, -43101072, --5514738, -348429, 31159988, 12653511, 5086852, -32804960, -16801912, 23665270, -28571196, 9330816, -50616188, 26717918, 39531416, -19672560, 23563264, 13015362, -41653668, -16960288, -21807160, -6848326, -26466126, -2371896, 28519656, 20993800, -41390064, 46308876, -27696634, -1300301, 3626563, -22995254, -48095044, -4354560, -9716290, 36486284, -29459718, -6478958, -42536284, -16093779, 21137144, -7420630, -19232326, 18213882, -3362423, -8862665, 4463545, -11922829, -11235098, -4690641, -7970923, -6701223, --6242198, 1914482, -8042327, 586263, -10445897, -12644921, -9004936, 7282654, -4849555, -2244121, -7046431, 209917, -959388, -13704167, -18338436, -13786308, -24252606, 17426830, 8860518, 14917495, -6928319, -15014132, -12912282, -8573292, -852551, 19267224, -3175055, -1352915, 3842922, -4519916, --2261300, -2984466, -6601902, 13044353, -7898982, 17081084, 956704, 43047920, 30766462, 4390531, --8134668, -22554484, 13266080, -1886564, -1873680, -1549410, -609349, -28991, -8442832, 10747619, --78383, -38651484, 9812390, 3330210, -13181792, 386547, 16792248, -5735392, 1262720, -27982248, -20435992, -10035191, -2855080, -2930242, 11698954, -15219217, -407485, 3314104, 610422, 3070902, --7009924, 20514912, -10660646, 36254356, -22226456, -23980950, 22645216, -25332254, 1484448, 18680960, --17248588, -7887708, 10183904, 11587822, 15664819, -55601572, 17836462, -642635, -12523588, 35070020, --17486422, 2044941, 353261, -29991756, 38467336, -1939715, -1496259, -20243792, -3456375, 31472984, --7188702, -1300301, 1433445, 8995809, 5429376, -39115340, 19412178, 34647500, -18079128, 13817984, --27025544, 45458472, 2230699, -42633992, 754841, 23616952, -2216203, -26524644, -5766531, 61977452, --9489193, -25675314, 4478577, 27284854, -6906308, -8661875, -3046743, -1315871, 1784559, 1136019, --6783901, 17980344, -2756295, -4345970, 1186485, 6077916, 15321222, -4619238, -7228430, 8250632, -2052458, -14105746, -4951024, 7426536, 1888712, -5945846, -2981781, 11986717, -10817412, -2300492, -2044404, 1648731, -10209137, -4276714, 13582297, -814433, -9501005, -4175782, 9885404, -2945274, --7098507, -6241661, 8653822, 312996, -24137180, -80315888, -121575488, 8157217, 105322800, 1617055, -275393824, 249498944, 149507808, 288050560, 189140704, -31216896, 11079405, -36935108, -226605696, -128738960, --99614784, -221445296, -181962736, -53674744, -106732088, -122728152, -9800578, 7394323, -51723756, 11486890, -47224240, -59903520, -50765440, 80549968, 16712255, -19353660, 56404196, 75478680, 185757, 77430744, -131104416, 47055124, 36187784, 133553080, 90469192, 11099806, 98249528, 144686176, 63817844, 74103752, -165003520, 62769872, 22846004, 157509872, 155164288, 48111688, 186821408, 265388720, 99241664, 109132432, -185290800, 56713432, -59399936, 10937134, -61011084, -222400928, -211984016, -226544496, -364027456, -393633760, --420839136, -497922528, -520774976, -508773760, -495030944, -435869376, -390986976, -319718432, -210956976, -150524640, --51541220, 144380688, 234030624, 231056896, 427587616, 455805536, 355032736, 432375968, 453050336, 243413520, -254064496, 311265408, 151546848, 122590176, 202374032, 146934592, 69485592, 95880848, 128271344, 54910620, -45063872, 128782448, 68520296, -10893111, 71021576, 55562920, -39104068, 6358699, 51419884, -32484448, --13596793, 95555504, 38420092, 4472135, 92121144, 60800632, -7881802, 5903970, -38792680, -133077952, --181334592, -200714016, -263445776, -282010240, -281600064, -305200928, -307943776, -322619680, -323467936, -295656416, --293510560, -246217056, -189722672, -150026960, -61830888, 56574920, 119971320, 199026096, 248752160, 263293840, -251236256, 229293264, 195175664, 158732320, 138620608, 121420872, 100011536, 90243704, 87873960, 80201000, -75511968, 78748760, 73841224, 62264676, 53991496, 43466144, 27806692, 17667884, 430034, -20055886, --35674000, -48369384, -49075908, -46751256, -43804372, -32229972, -24158118, -18305150, -10721849, -646393, -6825777, 15379741, 18723374, 21505438, 18105434, 13107703, 10822781, 8510478, 3307662, 555661, --1480690, -5490579, -12683038, -13191992, -16574279, -24925306, -23792508, -21573084, -32232118, -35022772, --34983584, -43440908, -46119360, -41661720, -47543676, -50061064, -44430364, -41337448, -40223980, -34121904, --28613608, -26669600, -21786758, -13529147, -10304700, -6244346, 1504312, 9378061, 13028246, 21094196, -30012694, 34809636, 38812008, 46237472, 49088792, 48464412, 49065708, 48834852, 43484932, 38159712, -34451008, 28992102, 20841328, 16304233, 11589432, 6009733, 1833414, -226023, -3367254, -5420786, --6754373, -7386807, -8560407, -8055748, -7638063, -6938520, -6677064, -5528160, -5246840, -4026532, --3346317, -2114198, -1563368, -288837, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ -2902861, -9578851, 2103460, 1420560, -2200634, -753230, -4744865, -165356, -1236414, 3570729, 3101503, --3121904, -2304787, -1870995, -1840930, -2211908, 215822, 2851322, -2265595, -2362769, -7897371, --5752572, -4285841, -158914, 394063, 5810017, -3208341, 2901251, 1740536, 1511829, 318901, --4267050, 1076963, -9144522, 1093606, 328028, 406948, -586263, -5692443, -2538326, -4910222, -345745, 289373, -2908230, -7609609, 5260798, -390842, -4392141, -45097, 3007014, 620623, --1482838, 1054951, -2479270, -1112397, -2336462, 1815161, -2489471, 3554622, 2942590, -594853, --5002563, 243739, 749472, -469762, -1799591, 1260036, 951872, -1171989, 2784750, 2956548, -2107218, 178778, 68183, 934155, -2689187, 363998, 4281546, 477815, 864899, 766652, -3179887, 1184874, 1039919, 2787434, -632434, 2192044, -802085, 1427003, 1072131, -397284, -659814, 801011, -186294, 1017907, 1640678, 365609, 98247, 1107565, 1551557, 1177895, --112743, 442382, 554051, 572304, 238371, 86436, -46708, -377957, -1104880, 759136, -156229, -10119480, -11412265, -783295, -4526359, 3502546, -5604396, 1426466, 2556579, -3780108, -3087008, 11418707, 616328, -1024350, 6222334, 870268, 6248104, 120259, 2839510, -4461398, --5966247, -298500, 2233383, -4110821, -1352378, -397284, -1188095, 1153736, -1236951, -2161442, -2043331, -1007707, -887985, 4497368, 6362457, -1970316, -3453154, 1291175, 5088463, 1959042, -6527814, 293668, -940598, -149250, 5822902, 394063, -4199405, -2277407, 4568235, 3345243, -3549791, 988379, -2295123, -4704600, 915902, 2238752, 2740726, -1001264, -2490007, 5119601, -3412889, -832150, -2871186, 185757, -2002529, 5334350, 1618666, 989453, 1687922, 607738, -1093606, 3281355, 569083, 3295851, -644245, 5245766, 634581, -5168457, -2054068, -1794223, -2568927, 3208878, -517544, 863825, -3626026, -1309428, -3376918, -1017907, -2201708, -1868311, --794569, 1105954, 48855, 36507, 143345, 1454383, 231391, 335007, -179315, -1549946, --438624, 85362, -150861, 631360, 240518, 271120, -588947, 5945846, 4226248, 6262599, -6587406, -1604170, 3318399, -1437203, -3678103, -379031, 9742596, 4217121, 2203855, 3421478, --4009352, 6887517, 3005940, 4604205, -1328756, -7714298, 3269007, -12018392, 2472828, -3093450, -2450816, 1857037, -183610, -4158065, 1037772, 2660195, -1561221, 2492692, 6120329, -467615, --4994510, -6899328, 1116692, 3037616, -6276558, 3483755, -5895917, -3907883, 4358855, -2538326, --4976257, -2479807, -3497177, 5516886, 7664906, 4283156, -2694018, 1611, 4115653, 2399276, --298500, -3145527, -1432372, -2764348, 2947421, 9390946, -28454, -5141613, -3988414, 2154463, -813896, -1946157, -5531918, -134218, -4731980, -1908039, 799401, -850404, 3839701, 677531, -4809290, 5510980, -4814122, -1820529, 319438, -3825205, -4506495, -759136, 69793, -2818036, -2719251, -2563559, -267362, 2078227, 472983, 120796, 2132988, -2592550, -836445, 576063, -1013075, -1190243, 881005, 424128, 988916, -172872, 30065, 930397, -1257889, 1644973, --1260036, 790274, 307627, -402116, -52076, 715649, -486942, -902480, -1427540, 896038, --1034013, 377420, 1465121, -223875, -848793, 13383655, -3600793, 1312649, 1903207, -8813810, --7523709, 205622, 8737037, 6680285, 10562935, 3496640, -2987150, -4535486, 775778, -2597918, -2080375, 1022739, 3568044, 6578280, 2089502, 4854387, -137439, 2884608, -2913062, -6099391, --3205119, -4664335, 64425, -1290101, 1428077, -7432441, -3717294, -979253, 2758980, -3664144, -7722351, -8679055, 1869921, -5457830, -4438849, 2549600, 2221572, 7468412, -821413, 1903744, --2120103, 5238250, 5519570, 1555852, -1181116, -5581310, -769873, 1958505, -4288525, 4332012, --4721243, 2054605, 7830799, 6580427, 107374, -2499134, 1235877, 7845832, -965294, 1950452, -1227824, 6417218, 76773, -1676648, -3954591, 2816425, -5965173, 2207076, 12452184, 3088618, -5871757, 612033, -8212515, 3007014, 1545115, -3214246, 3374771, -1009317, -877784, -4070019, -1734093, 4072703, 1822677, 812286, -1855426, -4003447, 954557, -767725, -608275, 297963, --182536, -725850, 1324461, -1338419, -1229434, -1147293, 1855963, 773094, 1466731, -772020, -1355599, 115964, -1284732, 1449015, 795106, -1120987, -2196339, -768262, 1859184, 158914, --452045, 964757, 862215, 2034741, -62277, -733366, 1304060, -973884, -4821101, -8396661, -4263829, -6002217, -6075768, 1210107, -2915209, -19677392, 1959042, 2979634, 18020610, 5768141, -1388348, -8206072, 7544110, 3195456, -3201361, 3875134, -622770, 6481106, -3882114, -2068027, --1268089, -1779190, -2646774, -1217086, 4697084, 4014184, 7077033, 2466922, 3502546, -111132, --4508105, -4979478, 6707665, -3678640, 1537598, -636192, -4633733, 6707665, -1065689, -2957085, -1235877, 4874788, -3205119, 7420630, -9386114, -7850127, -9519795, 2288681, -5335960, -8232379, --1826435, 7634305, -3187940, 2269353, 4609037, -3327526, -4264366, 318901, 767725, 2534568, -529892, -2421288, -214748, 9849434, 4251481, -4056597, -12372727, -9962714, 3694209, 11724187, -9943923, -7737384, 258772, -5057861, 2288144, 1924145, -8364449, -699006, 1731946, 955630, --2224793, 474594, 566936, 227633, 2920041, 2586644, -1620813, -2081985, 1464047, -1025960, -718870, -2966212, 1269700, 852551, -4628364, -1081795, 1071594, 687195, 450435, 897648, --225486, 318364, 411243, 443992, -1648731, -261993, 667331, -567473, -2015950, -1062468, -345745, 304943, 2330557, -3466576, 5776194, -9733470, -1663226, -12071006, -3544959, 1839857, -4235912, -10996727, -2737505, 7610145, -898185, -11003169, 5743445, -3488050, -6303938, 3513820, -5818070, 1364726, 1235340, 2052994, 7598871, -3540664, -3124052, 2037962, -3731253, -1855963, -126165, -366146, 279173, 6135361, 3143379, -642635, -503048, 3614215, 1518808, 4425964, --348966, 4989679, 5240934, 2146410, -5655935, 892816, -765041, -3972845, 5508833, -3030100, -2327872, -3682398, -1346472, -13456669, 1273995, 11066520, 1007170, 11761231, -2118493, -2542621, --11989401, 14198088, 6688338, 8127689, 1356136, 6679748, -34360, 38118, 5541582, -3124052, -2032593, 70867, -13442174, 3189013, -3119757, 3660386, -1986422, 3314641, 12563853, 3875671, -3346317, -49392, -7553237, 5809480, -3036542, 1250909, 2913599, 3870303, -4134443, -995896, --1680406, -2153926, 2497524, -1311039, -1037772, -1663763, 344671, 575526, 242129, -3381213, -1459752, 730144, -729071, 1134945, 546535, 1008244, 789200, 1793149, 75162, 486405, --151934, -670552, 2159832, -258235, 3019899, 598074, 1296543, -769336, 1693828, 689342, -1391569, 1453846, 1224603, -15435039, -619012, 11789148, -2667712, 7020661, -7563975, -5039071, --13532905, 7769596, 3871376, 9003862, 4052839, -4288525, 7395397, -1798518, 7071664, -4629438, --4480725, 641561, -1713155, 6315213, 1196148, 5340255, 5755793, -3419331, -3105261, -1981054, -3753802, -703301, -2600603, 887448, -5389110, 2818572, 1762010, -2690260, 3799436, 6951942, --2854543, -3027952, -935766, -5099200, -2626373, 7975218, 965294, -4801774, 9484362, -10462540, -1563368, 5732708, -2521683, -3389266, -882079, 4586488, -8152385, 4113505, -3371549, -6830609, --5282810, -4096862, 49929, -1895154, -4505421, 1977833, 11807402, 6647536, -1714766, -4017405, --11611444, 1292248, 6309307, -3683471, -12821014, 410706, -2084670, 707596, 1521492, 5908265, --424128, -2905009, -1210644, -4584341, -2823404, -2135136, 3428995, -2823941, 3177739, -6724845, -498753, -3055332, -2144799, 4189204, -2036888, -1890859, -2439542, 901943, -4401805, -1676111, --1060857, -113817, 866510, -3023120, 810675, -2388002, 1289564, 1666984, 3507378, 722091, -1232119, 1930051, 1381369, -970663, 524523, 274878, 2600066, 1586990, -322659, 1641214, --181999, 190589, -1138166, 214748, -38118, -1828582, 511638, -1247688, -1038845, 183610, -1365800, -346819, 5165772, -2273112, 1310502, 7646653, 491237, 8957691, 9700184, 21662204, -14763950, 9060770, -2308545, -11471321, -4009352, 10513006, 4537096, -11081016, 8260296, -1933272, --5508833, -6781754, 1001264, 18725520, -12703976, 13540958, 5272609, -2920041, 4434554, -3663607, -9677635, -3724274, 5104569, 1015223, -6740415, -4715874, -6568079, 245887, 5527086, -1607392, --3710852, 3564823, 444529, -1126355, -12685186, 3826279, -7114614, -5378910, 3476776, 8341364, --6185290, -8891119, 296890, 7528541, 602906, -5073967, -1906966, -3025268, 3417720, 2494839, --2933463, -4798016, -7210713, 4435628, 11515881, 7055558, 3624416, -6706592, 3451006, 7288560, --8214662, -10714870, 1853278, -8850317, -4245575, -17337172, 205622, -11911018, -6215355, 3184182, --1512365, -1160178, 5248987, 879931, -9723806, -6750078, 4359392, -1361505, 512712, -3039226, -269509, 2815351, -439160, 1859184, 1874753, 368830, 162672, 1373316, 1615445, 1061394, -112743, 313533, -993748, 2541010, 53150, 2335925, -435402, -1595044, 751082, 2171106, --2768107, -4075387, -2077690, -613107, -1279900, 4576825, 1722282, -1477469, 2036351, -1196148, -299037, -3741454, -341987, 237834, -1707250, 23685670, 542777, -9291625, 10457172, -11442867, -13233868, 1055488, -8047158, -13813689, -3336653, 6750078, -10963441, 9714679, -1550483, 6254546, -7477001, -6438156, -2669322, -3884798, -5112622, -2011655, -4778151, 771484, -5840619, 6046777, -3830037, 5070746, 10333691, 5295158, -1549946, 12305081, 6277095, 2249489, -6630893, -7249368, -3687230, -5557688, 1256815, 3865471, -8252243, 7017977, 18773302, 1398012, 13345537, 6291054, -6445672, 9504763, 534187, 5019743, 5317170, -12202002, -8274792, 8352638, 534723, 7880191, -1382443, 8273718, -1373316, 2948495, 2037962, -17468706, -1180579, 4433480, 11624866, 2558727, -10189810, 994285, -2448668, 3308199, 4548907, -9829033, -16581258, -8777839, 2232309, 4023311, -508954, 12091944, 4234301, -19079318, 4795868, -2811593, 51540, 5424007, -7689065, -312459, --4168803, 3450469, 4865124, 245887, 1005022, 3506304, 85362, -86973, -1711008, -1879585, -583042, 304406, 55298, 2916283, 2088428, 692027, 1719061, 1097364, 10737, -2973728, -2257005, 1850057, -1221918, -314069, -479963, 84289, 1625108, 1355599, 4430796, -3847217, --1158031, 1633161, -1008780, 2308008, -1966021, 3897683, -1025960, -1265942, 474057, 2206003, -1521492, -616328, -346282, -1624571, -381178, -11573326, -903554, -10314364, -4720706, 4226785, --5085242, 2222109, 3584150, -6212670, -15153718, 4818417, -15012521, -17440252, 3861176, -8609262, -7755637, 10865730, -2709588, 12690555, -3001109, 12537010, 17264158, -38655, 1100049, -17409114, --3194382, 1825361, 3054259, -2082522, -11345156, 743029, -9594957, 1180042, -2526515, 2582349, --3634079, -6466610, 1538672, -1197759, -3451543, 4014184, 488553, -2702608, 12491912, 4551055, -9398999, -5945846, 1800128, -5023501, 3631932, -1169842, 4963909, -1699196, -3598646, -4823249, --10897943, -6543920, 17795124, 7105487, 11829951, -13662828, 2944737, 9984188, -8483634, 7516, -6650220, -3630858, 6672769, 868120, -11790759, -3160559, -18194018, -2336999, 7452842, 3732327, -12349105, 1309428, 8230231, 8610873, 3099356, -627602, 15975131, 1262184, 493384, -2811056, --1492501, 8331700, 5008469, 7964480, -881005, -1744294, -1986422, 5792837, 1269163, -1313723, -1661079, 3946538, -896038, -2462627, -4610648, 77846, -3667902, -1742146, -3121904, 2593624, --326418, -5552856, -964757, 321049, 444529, -352724, -2545842, 3635153, -2979634, 864362, -1437203, -4213363, -740345, -2845416, 585726, 3213173, -2917894, -2487323, -1809792, -1889249, -1862942, 961536, -11258183, -10040560, -10662793, -15539729, 10599442, 6869800, 942208, -10457172, -9447317, -86436, -13205951, -10795937, -3776887, -2690260, -8460012, -3330747, -5021354, -4249334, --3136400, -12207371, 6099928, 7151658, -646929, -1135482, -2240362, -4509716, -14512694, -15815680, -471910, 6867116, -4189204, -9739912, -5484673, 7419556, 5442798, 362925, -3059627, -4183298, --4251481, 9383430, -4786741, 6597070, -4529043, 198105, -15779710, -3432216, -1252520, 11909407, -3263102, -2783139, -8876624, -6160594, -12419972, 20036560, -9220758, 19029390, 2415382, -8192113, -12540768, 12364674, 21346524, -20936892, 8661875, 3491809, 2814277, -4151086, -6029061, 9266929, -4782983, -1585917, -9839233, 10932302, -5749351, 11752641, 9687836, 9197672, -8332237, 18147848, --13405667, 7466801, 11683385, -6728603, 1451699, 341987, 10150081, -2695629, 4505421, -5294621, -10847477, -339302, 1895691, -6227703, 4947803, -338766, 5104569, -1479079, 6883759, 3375844, -2166274, -4065724, 1295470, -3403762, 190052, -2897492, -3921305, -782758, -3463891, -2301029, --375810, -1752884, -3451006, 2367601, 2862596, 4225711, 977642, -3941169, 367220, -2659659, -2666101, 1121523, -1941862, 525060, 1862942, 1126355, -4444218, 875100, 4452808, 1753957, --704375, 1287417, 17064978, -28491740, -30508226, -19234474, -3156264, -13420699, 8271034, -11043972, -1192927, 5446019, -758062, 20083268, 14567455, 5100274, -5833103, -4519380, 14152991, -2388539, -2252174, -5798743, -12499965, 9127, 5163625, 3345780, -6835978, 6068789, 948114, -841277, -12011950, 16411607, 1260036, -10524280, -4442607, -20170240, -7726646, -5226439, -5966247, 893353, -3612604, -7341173, -2843268, -10261214, 11132555, 13238700, 11134703, 12361990, 9819369, 16181826, -2077690, 5548561, 3937948, -2946885, 6336151, 9644886, -9587978, -33474976, -7696045, 11115375, --17245368, 8838506, 11033234, 3952444, -5177046, 838592, -4068408, -13440026, -3559991, 8749922, --10650982, -9094593, 3330747, -7382512, 21891986, 22167936, -8106751, 14277008, 3871376, -2090575, --9600863, 6830072, -12986370, -10816875, 12011950, 9004399, 6410776, -833224, -1042603, -15942382, --11361799, -2095407, -3520263, -2964601, -2276870, -4710506, -3797288, -4390531, -2090039, 586800, -3880503, 2983392, 5107253, -414464, -2257542, -2383707, -1508070, 7204271, 6808060, 3464428, --494458, -450972, -1410360, -2684892, -4057134, -1840930, 890132, -1231045, 3044595, -1535451, -1231582, 1395864, 1372779, 2758443, -3061238, -50466, 794569, 2339684, -3712462, 6647536, --2599529, -1671816, 27492622, -23165442, -261456, 3730179, -21843130, -6661495, -9127879, 3151969, --6556805, 18938658, 2616172, -396748, 23998666, -1508070, -20987358, -17104170, -10229001, 8011188, --1093606, -20644298, 5383742, 5551245, 10897406, -12342662, 6315750, 10215043, 9143985, 7097434, --2380486, 12239583, 13500693, 4377109, -29717952, 21661130, -10588168, 8259759, -2067490, -3235721, -5819681, -13353053, -7451232, 13887777, -6314139, -1961726, 12777528, -14317810, 12848932, -5059472, -11936251, -15756088, 20946556, -9400073, 32355600, -4348118, 2113661, 8180302, -7057705, -5418101, --3843996, 2514167, -1578401, -16354162, -20331302, -5745593, 11915850, -6219650, -7344931, -20890720, -9643275, 2047626, -28347858, -503048, 438624, 4109210, 14672145, -10008348, 4621922, -12829067, --11101417, -16988206, -16816944, -3070902, -9818295, 12133283, -1986959, 11851425, -5769752, 6721624, --915365, -7703024, -10578504, -1289027, 1304060, 5124433, -2490544, 2219961, 1079111, 4183835, --390305, -5702106, -785442, -8593693, -363462, 1322850, 1921461, 422517, -3204046, -4196720, -4723927, 2116345, -1381369, 5281199, -6682432, -8995809, -136365, 7890392, 212064, 2251100, -3168612, 5383742, 350040, 6031745, -4925791, 1909113, 1239635, 4899484, 8400956, -5251672, -1376000, -1264868, 1395864, 10546292, 31698470, 15849503, -9683541, 21887154, 7175280, -13930726, -5357972, 14156212, -2204392, -4776541, -19500762, -5247377, 12000139, 7888781, 5701032, 3573950, --3531000, -7780334, -18408766, 9829033, -6287296, 4918275, -14139032, -7603166, -369904, -2132988, -18066780, 5494337, 2864743, 13891535, 6629819, -20904680, -2467996, 7707856, -3946538, 482110, -17849348, 5928129, 20725364, -12029667, -7638063, -3356517, -7762080, 8188892, -8090645, 15674483, -15533286, -6792491, -15222975, 25509422, -13125420, -5240397, -3076807, 7633768, 3854196, -14150307, --4262755, 9139690, -6779606, 11579232, -5480379, 16384763, -8512625, 3739306, 24946780, -451508, -17566416, 30518964, 3826279, 15011984, -7758322, -36599564, -24865714, -4707821, -1595044, 20876226, --706522, 7014219, 1742146, -5131949, -17008608, -37775312, 28594282, 2025077, 817118, 9409200, -4431333, -9178345, 21126408, 1105954, 4434554, -217433, 1390496, -18609556, -6965363, -12253542, --7459285, -558346, -6973417, -6902013, 4292283, -1467805, -4815732, 13691282, -2586644, -13841069, --9968619, 3527242, 638340, -3986804, 21087752, 6419903, -7118372, -8133058, 2145873, -1862942, --4431870, 726386, 1891933, -4723927, 4961224, -127775, 7187091, 9433896, 1781875, -854699, --2899103, 6332930, 6044630, 5534066, -41399188, -9911711, 43236900, -16597364, -18539764, 38176352, --24495810, 21512954, 28750512, 11362336, 3950833, -21836688, 8356396, -38305204, -18872624, 8381629, -19913078, 2252174, 4592394, 14516989, 38744364, 26191248, 8184597, 1445257, -46171, 4310537, -3198677, -15036681, 318364, 9587978, 12119324, 51707648, 29142964, 19925428, 37335612, 15256261, --5352066, 11217381, -710280, 35773320, 12942347, -2923799, -5972689, 14946486, -2310693, 17162152, --53348324, 2300492, 18355080, -1105954, 22217328, -8319352, 5860483, 11838540, -49676664, -19197430, --3910031, -15910169, -20592758, -24256364, 22673132, -14842870, 4503810, -4549444, 22749368, -37323804, --10271951, -5272073, 11681237, -188442, -3471944, 27494770, 47937740, -257161, 14882599, -9108552, -3990025, 33539936, -35756140, -21246666, -29940754, -37740416, -3366181, -1549946, -14934675, -16040092, --15208479, -14434311, -18618146, -26958972, -11832635, -17515950, -10783589, 4607963, 23531052, 7468412, -3456912, 3454764, -2481417, 5158793, 2151779, -16926466, -15290084, -4490389, -21489332, -8621073, --9582609, -7486665, -8595840, 9582609, -7970923, 419833, 1224066, 4015795, 11500312, 17702244, --462783, -4741644, 12732967, -6841883, 7999914, 2922188, 1503239, -3772055, 2043868, 1358283, --7991861, -10423886, -11302206, -1845762, 3518652, 22456774, 19781546, -18626200, -65901440, -11943767, -27025544, 6101001, -7342784, -5346161, 2058363, -9251896, -12082817, 14387604, 10853382, 29822106, -10917270, 17867064, -6748468, 39727912, 7219303, 25129316, -3543348, 36633388, -13947906, 23811836, --23324894, 51540, 2605435, 16966732, -6720550, -12929462, -30861488, 17047262, 2288144, 3373160, --14910516, -27855548, -1678795, 3065533, -3394635, 8341900, 17858474, 2547453, 12773770, 45420888, --19161460, 4421132, -14998026, 23386634, 20437066, -23011362, 21606370, 24493662, -17592722, 6108517, -5817533, 16925392, 8453033, 34544960, 10948945, -12461848, 2098629, 44689136, 14227616, -51430084, -15146739, 9023726, -44113072, -12426951, -14119705, -31334470, 2265059, 19080930, 21109764, -12680891, -37950332, -9931038, -16460462, -8660802, 20073604, -74634720, -9079561, 907849, 60073172, 7781944, -50936700, 24283208, 35751844, -1189169, 12276090, -7035157, 30295626, 30535070, 27582280, -6867116, --18365280, -7707856, 30262876, -3757560, -19765440, -8792335, 35851164, 4796942, -22301080, -7832947, -32340566, 9039296, 13467407, -647466, 12216498, -9456981, -639950, -918049, 5290326, -1085553, -5718212, -4721243, -10500121, -12655658, -15195594, -2238752, -11096048, -245887, -1985886, -4575751, -10722386, -12473122, -5009006, -12375411, -4499515, -22502408, -16582869, 22199076, 392453, -25942140, --41120552, 33393908, 71165464, 5036923, -39891656, 61815316, -14074071, -642098, 8582955, 35170952, --20275466, 1753420, 69709464, -34401076, 16453483, 23812372, 22406308, -30739618, -3317862, 5815386, --15381352, 2910377, 7097971, -12340515, 12220793, -21107080, -6248641, -8293045, -1803886, -12566001, --11417097, -3878892, 6546604, -23041426, -21971442, 33021320, 5761162, -20249698, -5561446, 19750944, -47105592, -3853660, -23242216, 24943560, 36084168, -10266582, -2877091, 1214939, 12947716, 372588, --148176, 16765405, -40242768, 27758910, -23294292, 570694, -32942936, 18662706, -2748242, -48656612, -23967528, -3216394, -19121194, 33299418, 3694746, 32930052, -27806156, -10298795, -11346767, -25268366, --39832600, -52162376, 44318156, 18476412, 32573568, 30495878, 18504330, 7576323, -19053012, 28893856, --14416595, -11757473, 38534984, 13219909, -7489886, -3189013, 11608223, -27169426, 6875706, -10562398, -17979806, -6695317, -11938398, 17637284, 2748242, -20117626, 1447404, -9378598, -5883569, 4612258, --4652524, 4029753, -1313723, -14404783, -7629473, 6657200, -5089536, -8972187, 8992588, 14765561, -14010720, -11120744, -4873714, 16932372, -28404230, 8768176, 10139344, -11783243, -28227062, 14407468, -1566053, -12336220, 8572755, -13225278, -22016002, 6048388, 19385872, -15893526, -7186554, 7242926, -16896938, -4373351, -2320893, 15206332, 876710, -11671037, 38693896, -15724949, 11434277, 9001715, --40221832, 36177048, 12600897, -10282152, 30994094, 2641942, 2045478, 15216532, -13498545, 39639864, --31800474, -16958678, 14743549, 13689671, 6724845, -29496224, -18004502, -32872070, 18194018, 4436701, -16621523, 90194, 17854716, 7270306, 5978058, 783295, 15226196, -6800007, 8385387, -14986752, -11295227, -13846438, -115964, -18300318, -13048648, 840740, -16335908, 7727183, 38970924, 9385040, --29192356, 15307800, 11734924, 20734492, 597537, 34431680, -29511794, 4589173, 13727252, -28418724, --6627672, 57563300, 32387274, -76017160, -32284732, 40545028, -11028939, -36032628, 14260365, -3628711, --27831388, 20498806, 34629248, -46843060, 9302362, 41726144, -28204514, -25269976, 34089692, 4632122, --28010702, 5045513, 22169010, -24442122, -3383897, 26925686, -3926674, -11914776, -19222664, 24637544, --6477348, 13762686, 3207267, 13977971, -9527311, 9066139, 24820616, 9841381, -18259516, 1544041, --13059922, -8806294, -18394808, -1621887, -4896800, -1262720, -12358768, 12693239, 10912975, -4279935, -28369332, -7138773, -30123826, 36319856, -4287988, -6863895, 6705518, 12742094, 1720134, -3335042, -30640296, 16865262, -21497386, 1852205, 8727910, -15584289, -12885976, 22179212, -11398843, -41981156, -40494024, 5190468, -40929428, -1176284, 21581674, -15360414, -34417184, 19892678, 26538602, -42432128, -6263673, 31998580, -18727668, -3255585, 35013112, -2565706, -14283987, 8231842, 14798310, -19153944, --5233955, 20548198, -4677757, -17899814, 15079630, 9008694, -10432476, 33817500, -72796472, -4968741, --13060459, -80502184, -14667850, -24700894, 7685844, 14063870, 23643794, -10467909, -31723166, -11716134, --45676440, 6263136, 16009491, 9582072, 6958921, -36368172, 22161494, 3729105, -44180180, 32247152, --47493212, -19149112, -17987324, 12985297, 33897492, 39797168, -3528853, -8759586, -76707040, 32981054, -77098424, 28368796, 1487669, -42359652, -62595928, -25436944, -5561446, 32692754, -39325796, -23165442, --40396316, -12628278, 71970232, 78084120, -13906030, -35798016, -31295280, -16356846, -8570070, 39391828, --19005768, 11877195, 7833484, 26243324, -7537668, -17477296, -45886356, -19628000, 68978248, 29819422, -45777372, -42215232, -23855322, -19492172, 46774880, 1078574, -77120432, -73900280, 41049148, 71474696, -119288424, 21051782, -102062384, 17125108, -27262304, 34685084, 32915018, -124450976, -40134320, 24441586, -65226596, 16067473, -63809792, -14101451, -6751152, 36954436, 31049930, 8503498, -51196548, -7856032, -10740639, 22727894, 10869488, -13160317, 1779727, -28023588, -3954591, -405874, 26778584, -18537078, -35845796, -23067732, 9954124, 21086678, -9059160, 17496086, 15058692, 28490128, 1087164, -13766981, --16768089, 2600603, 1016834, 4839355, 2607045, -927176, -2278480, -10285373, -11227581, -2157684, -17609366, -4625680, 135291, -3760244, 5647882, 1342714, 9659381, -9139154, -12228846, -23537494, --12025372, -1400696, 12847858, -12597139, -1161252, -36853504, 31479426, -32895154, -6950868, 1021665, -8443369, -6367826, 7588134, 12518219, -20935818, -18314814, -253940, 4582193, 13682155, -15464567, -2295123, 11450383, -8908299, 7060390, -4559108, 35471600, -371515, -5610838, 20650202, 11009075, -18364744, -9450002, 11774116, -3936875, -358093, 14800994, 10821170, 2268817, 4618164, 20038706, --18780818, -5946382, 2155537, 27117350, -308701, -6396280, 25569014, -6703370, -10929081, -11244224, -21206402, -5235029, 9333501, 5405217, 3334505, -7634305, 3912178, 7988103, 3027415, 23578296, -11938935, 6542309, -10189810, -1767916, 9200357, -17196512, 6240588, 6260452, 17658758, 39192, --1967095, 9727564, 2305324, -19921668, 22314502, 6593312, -5070746, 18246632, -12407087, -1739999, --9233643, -8360691, 18253074, 13094282, -1154809, 6463389, -10741176, 2347200, -14518063, -1569274, --13290239, 2811593, 8731132, 2972654, 1697049, -3074123, -1770063, 2384244, -7919920, 2157684, --3394098, 3623879, -5201743, -2025614, -4812511, -6386080, 3069291, -1248225, -361851, -2461553, -8647917, 3158949, -10851235, -11541651, -7722351, 2232846, 3599183, 8143258, 4963909, -10646150, --1520418, -4108673, 9661529, -2571075, 10415296, 4147865, -8475581, -95026, 4639102, -5007395, -6655589, -4053376, 7519414, -5425081, -1663763, 2269353, -4206921, 57456460, 4631586, -21241834, --17581448, 2838437, 12993350, -812286, 11859478, -4535486, -3181497, -15960635, -3510599, -11186779, -17732846, -11127723, -913217, -7038915, -3316252, -4145180, 1932198, -11827803, 1797981, -5120138, --8320963, 2399276, -1335735, 625455, -2262374, 4109747, 1989644, -9907953, -6350109, -53687, --6702297, -5867462, 4876936, -1648194, -10095858, 617402, -5622112, 4243428, -14907295, 7385733, --6489696, -11359652, 3417720, -5240934, -5877663, 1465658, -116501, 636729, -2497524, 2431488, --4575214, 4966593, -3147137, 460635, 8280697, -6069863, 2763812, -1656784, -903554, 2185065, --6889128, 6163815, -7242389, 6152004, -1534377, -387084, -4648229, 5807333, -6962142, 368830, -2419140, -9203041, 9059697, -5640903, 3825742, -4295504, 3652333, -3332895, -4061965, 6662568, --4277788, -932545, 6605660, -4387846, -102005, 453119, 1009854, -4844723, 335007, -524523, --2117419, -1431835, 1094143, -1591822, -2604361, -1372242, 2847027, -2751464, 2120103, -855235, --355409, -956167, -2017024, 1741072, -1381369, -1654636, 1933809, -2192044, 1516660, 619549, --1312649, 195958, -383863, 434329, -4072703, 3728569, -4188667, 593242, -672162, -2284386, -489089, -1316408, 2746632, -7047505, -27831924, -44482976, 47165184, 164634688, 31381716, 49520972, --101457328, -140728368, -58997280, -73630768, 56807920, 132200168, 75782016, 51109572, 4956929, -72663864, --64581276, -64316600, -26499948, 36672580, 31037044, 33432026, 29799556, -886911, -4992900, -7531225, --10527502, -15168214, -2208687, 20304458, -1937567, -11630235, -4743255, -16850230, -9677098, -2850785, --4358318, 32511828, 29995514, 17922362, 18992346, 1075352, -23549306, -23776938, -43928388, -29080686, -3883187, 3661997, 8807367, 25928180, 36674724, 22175990, 18408766, -764504, -20969640, -28922310, --25163140, -20928302, 2884071, 7567196, 13360570, 9390409, 6072547, 1416802, -7711614, 3047816, -617402, 3242164, 18176838, -1648194, 7987566, 8383240, -13717589, -25666188, -26598196, -23826332, -6236830, 19640348, 14091251, 21483426, 18787260, -6287296, 4645007, 11732777, -7635378, -7014219, --16572668, -21185464, -8349417, -4975183, -2307471, 9026411, 4100083, 4889284, 14212047, 13642427, -13989245, 8070781, 3497714, -7027104, -8839580, -21785684, -24016920, -16933982, -12532715, 5419712, -15528991, 19682224, 26285736, 18868866, 11944841, 196495, -8269960, -12884902, -27352500, -28896004, --10289131, 5180805, 13753022, 11052025, 9550397, 11061151, 7910256, -528281, -2126009, 1175210, -233002, -4793721, -4367982, -14606647, -9654550, -404801, 5229660, 7198902, 5647882, -2178622, --299574, 5305359, 4131759, 314606, 2860985, 2558727, -1737851, -6886443, -6230387, -5964099, --1406602, -1578937, -137976, 1261110, 6087580, 6774237, 6088116, 2902861, 1948841, -2887292, --5279052, -6484327, -3827890, -2286533, -19864, 338229, 2238215, 1950989, 3643206, 2470143, -1488206, -625992, -281857, -881005, -558883, -2234994, -2036351, -1742146, 1205812, 1414118, -1750736, -423591, -638340, -1029718, 936840, 202400, 922344, 183073, 1057099, -472983, --454193, -1007707, 549219, -186294, 288837, -1067836, -392990, -907849, 355945, 93416, -1283122, 228170, 585189, -88584, 916976, -12885, 129923, -1384053, -779000, -1236414, -123480, -155156, 932545, 87510, 847719, 146029, 672699, -518617, 111669, -633508, -279710, -474594, 361851, -360240, 394063, -543313, 209917, -392453, 561030, -222265, -479426, -379031, 417686, -370978, 435939, -354335, 414464, -418222, 367220, -443455, -350040, -446140, 369904, -405874, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ -2206540, -6285148, 561030, 4196183, -944356, -649077, -2254858, 4476430, 2872796, -2681670, -3471407, -2238752, -867583, -5404680, -6200322, 1443646, 332323, -2133525, -2099702, -4221953, 2697240, --4960687, 1282585, -518617, 1138166, 372588, 1077500, -2247342, -301185, 841277, 1437740, --539018, 1755031, 1231582, -2165201, 1614908, -1301912, -4234838, 5987722, -1179505, 293132, -1387811, -726923, 3257196, 4228396, -936303, 1600412, 3128347, 287226, -3390877, -2547989, -807991, 2022393, -1052804, 1115618, 3846680, -3395172, -3113851, 3246995, 579821, -1257352, --2115808, -68719, 701690, 2469069, -3951370, 1947768, 962073, -3033321, -3339874, 2842195, --1833414, -4026532, -1765232, -358630, 6077916, 7081864, -644245, 1193464, -913754, 1107028, --1198833, 1897302, 1105954, -1143535, -425739, -1215476, 570157, -1627793, 1522566, 1410360, -282394, -1909650, 196495, -69256, 809064, -477278, 1273995, -655519, 200253, 106837, -778463, -157840, 249108, 260382, 805306, -17180, -7763154, -3356517, -5355824, 3508988, --2597918, -3639448, -2464238, -3263638, -648540, 1201517, 5872831, 1012002, -3138547, 4955319, -192737, 5108327, -4912369, 7912404, 3672197, 8583492, -1541893, -2925947, -591632, -4728222, --403190, -340376, -1713155, 1602023, 157303, -3755412, -911607, -17180, 1160178, 3721589, -857920, -5613523, -4674535, -1776506, 3149285, 205622, 152471, -2847563, 4668630, -131533, -339302, -2018635, 592706, -1221381, 2448668, -798864, 7784092, 61740, -1028645, 2946885, --1970853, -3508452, -1454383, 2633889, 4695473, 775242, 2873870, 703838, 481036, -2478196, --2421288, -3966939, -182536, -4112431, 1014686, 3340948, 3564823, 2505040, -1278290, -1825361, -3199214, -2280628, -957241, 1997697, -1838246, -326418, -959925, 2068027, 3679176, 1898376, -1073205, -936840, -422517, 661425, -376347, 2465848, 410706, -1208496, -723165, -556198, --175557, 343597, 297963, 37581, -392453, 1142998, 717796, 54761, 433792, -893890, --578210, -713501, -842350, -296353, -943282, -915902, -208843, 1173600, 5421323, 5880347, -3093987, 18254, 4782446, -2571612, -4079682, 3986267, 4121558, 5254356, 7703561, 762357, --4914517, 2887829, -4686346, -271120, 1564442, 1170916, 8582955, 729608, -6913287, -264141, -1233193, 2962454, -499290, -2286533, -7609609, -1431835, 6459631, 2298881, 4249334, 5042829, -4137127, 1221918, -717260, 4491462, -5649493, -102005, -3839701, 10385768, -554588, 360777, -4596152, -3752728, -595927, 1685775, -572304, 6225018, -943282, 1931662, 5894306, -1071594, -1853815, 562641, -277025, 15569, -765578, -1627793, 2553895, 3490735, -817118, 3475166, -1250372, 6804302, 7702487, -335544, 2068027, 1346472, -3872450, 3886409, -938450, -3164854, -1369558, 3829500, 1074816, -905701, 6830609, -894427, 1866163, 2120103, 1025423, -3387119, --184147, -631897, 566936, -1752884, -359704, 281857, 742493, 805306, 1273458, -366683, -632971, -1622961, -1132798, -2030446, 1624571, 606664, -292058, 714038, -267899, -1652489, -1109712, 242666, 810675, -452582, -580894, 379568, 2050847, -2025614, 1176821, 8617852, -8350490, -3259880, -4856535, -4156455, -2934537, 2204929, -9232032, -843424, 1220308, -4342749, --8185671, 7949448, -1760937, -1932198, 1209033, 3695819, 3185792, -3971771, -1660005, -104153, --497679, 1959579, 2720862, -1468342, 3359738, -2497524, 5182415, -562641, 153008, -2616709, -2709051, 1089311, -858457, -2605972, 1209570, -1450088, -2401424, -1896228, 408022, 1796907, --5018133, 496606, -9416179, -5338108, 3306051, -1337882, 1058710, 2161442, 6101538, -1912334, --3162707, -143881, 136902, 2663954, 2434710, -2812667, -1326608, 6876780, 201863, 1110249, -521302, 3099893, -5733245, 263604, 2816962, 5359583, 1050656, 2343979, 7982734, -1908039, --817118, -4283693, -2684, 1393180, 2755222, 60666, -1795296, 2524904, -272730, 4532264, --18254, -113280, 486942, -5586679, -2973728, -3282429, 3086471, -490163, -972273, -4295, -353798, -177704, 1591285, -478352, -1002875, -1198833, -673236, -1716913, -1202591, 1350230, -18790, -450435, -951872, 435939, 284542, 139050, -845035, 1476932, 559956, 935229, --279173, -75699, -1082332, -1103270, 673773, -526134, 933082, 1314797, -51003, -5516349, --8425115, 3569655, -2695092, 92879, -4296578, 3330747, -9736691, -8129300, -9176734, -3184718, --1876364, -6530498, 3390340, 8790724, -6428493, 1304596, 10487773, -2467459, -2743947, -4844723, -938450, -88584, 4701379, 1445793, 3406983, 2261300, -3287798, -6665789, -3047279, 3884798, --2142652, -4100083, 1118302, 1609002, 1397475, 779000, 9148280, -4332012, 5026186, -2417530, -2573222, -2694018, 7629473, -5664525, 3173981, -521302, -4373888, 4110821, -1559610, -1540820, -4591320, 2328946, -284542, -2042794, 4183298, 1952063, -4096325, -5091147, 3547106, 5504538, -3235721, 67109, -2319819, 220654, 3652870, -1592896, 4393752, -1072668, -8633421, 212064, --3733400, 12377022, 4447976, -7144141, -3883724, -1461900, -3101503, 3143916, 3215857, 2292976, --1420560, 2662343, 2301566, 705985, -418222, -3721589, 828929, 1190243, -938450, 774168, -1378685, -556735, -47782, 736050, -125091, -1154273, -799938, 18254, 1063541, -1059783, -1013075, 995896, -1259499, -1817308, -2092186, 537, 1420560, -670015, 1275068, -1017907, -22549, 812286, -512175, -2043868, 427886, 3212099, -7188165, -8878234, 7659538, -1634235, --7150584, 603980, -1799591, 7390565, 3732327, -1872069, 1433445, -356482, -1041530, -1304060, -8646306, 1699733, 526670, -5838471, -2611340, -1348083, 3077344, 3795677, 11623255, 315680, -451508, -326954, 858993, -5051956, 302795, 2128156, -6242198, -4431333, -4015795, -488553, -8520141, -6839199, 1246614, 3885872, 1748052, -3181497, 3593814, -8542690, 7088307, -1486596, -78920, 3837553, -4257387, -5049808, -7798587, 1700807, -2498597, 7493108, 2673080, 214748, -1501628, 2301029, 5934034, -2558190, -1208496, 6143951, -1176284, -3457449, -47782, 6148246, -6281390, 5684389, 3142842, -3737159, 3712999, 5144834, -5961415, 7763154, -4646618, -4394289, -7094749, 761820, 10200547, -105764, -5595806, 2520609, -2446521, 6725382, 3282966, 1867774, -536871, 2318746, -1097901, 4233764, 1553168, 1693291, 1357747, 2486249, -111669, -191663, -2015950, -57445, 1504312, -742493, 2423972, 4790499, -2692945, -1263794, 929860, 610959, -395137, 1226750, -151934, 394600, 1071594, 2352568, 260919, 4409858, 1138703, 521839, --1886028, 508417, 1546725, -1969779, 522912, 870805, -26307, 569620, -39728, -15794742, --10497437, 2861522, 5035313, 10889890, -6662031, 5867462, 1025960, 6175626, -370978, -2809446, --3782256, 3830574, 11167989, 995896, -1044214, -10666551, -9022116, 101469, -6648610, -3832722, -321586, 1391569, -6813966, -1980517, 1576253, 4003983, 2052994, -4329864, -75699, 5076115, -4041564, 887985, -4204236, 799938, -2596845, 1254131, 1350767, 2343442, -3252901, 4032974, -9715753, -964757, -792421, 1926293, -5515275, 2601140, 7811472, -7736310, -9220221, -4711579, -694174, -11832098, 231391, 362388, 1591822, 137439, -236760, -5608154, -3096672, -3636227, --561567, 8085276, 11846057, 355409, 721555, 5827197, -2497524, -980326, 2633352, 13413183, -1630477, 4829691, 9345849, 1731409, -6169721, 2544231, 2748779, -2809446, 2830384, 2428804, --693100, -2908230, 1308891, 861678, -696858, -4976794, 2130841, 4571993, 1644973, 3330747, -1793686, 4017942, -935229, -1511292, 3634079, 3069291, -1019518, -210990, -1172526, 2639258, -2804077, -2324114, 2784213, 757525, 284542, 705448, 1480153, 2128156, 209917, 1856500, --1336809, -693637, -79994, -353798, 694174, -1267552, 117038, -397284, 476205, -1705102, --1554241, 8089034, 5182952, -7596187, -259309, 16112570, 14360223, 2966212, 8689256, 10610717, -2762201, -204011, 7072738, -3214783, 150861, -6401649, 5268315, -483184, 332323, 2291902, -2840047, 8747775, -7342784, -6817724, 6800007, 1324997, 3145527, -5333813, 1027034, -1901060, -3533684, -3758, 4930086, 4716411, -4785131, 3985193, 3446711, -5643587, 14409078, 2450279, -2860985, -11180874, -3500398, -951872, 9362492, 8606041, -817654, -9606231, 6300717, -8360691, --2516851, 7214472, -149787, -5946919, 7162932, 8868034, -2212982, 2950643, -3532074, -12573517, -133144, 7964480, -3629784, -4340602, 5338645, -6062883, -9056475, 2205466, 6241125, 11203422, -5965173, -8500814, 3594888, -9976135, -11625940, 10722923, 5131949, 3884798, -7200513, -7900593, --1116692, 8067023, 2774012, 11551315, 5215164, 2867965, -12279311, 1931125, -3373697, 404801, --2815888, 2503429, 842887, 3043521, 5282810, 2655364, 533650, 2232309, -1984275, -1085553, --2022393, -100932, -1887638, -656593, 847182, 3818226, 756451, -1697586, -619549, 1167694, -252866, -425739, -3889630, 138513, -1948305, 672162, -2739652, -3191698, 2155537, 2368675, -3970161, -3899830, 139586, 1925219, 16725140, 10822244, -7333120, -1937567, -336081, 2988760, -2306398, -1009854, -6622840, 1638530, -4561256, 7028714, 153545, 2736431, -2348810, -994285, --6914361, -3601867, 14358613, 4810900, -8866960, 4204236, -8665097, -6031745, -13515188, 5881958, -150861, 244276, 3109556, -339302, -6172405, 10167261, 5720360, -2207613, -10293426, 10254771, --7093139, 2725157, -346819, 3375308, 1935420, 6522982, 7411503, -1728188, 4064650, 11900281, -1436667, -3708168, -3489124, -2084670, 1755031, 7947837, -2271501, 3240016, 530965, -7249905, -183610, -1773822, 3447785, -10913512, -281320, -18203682, -11143293, -10151692, -2673080, -10032507, -6651294, -2499671, -8417062, -2226404, -1039382, -6724308, -3031710, -230318, 567473, -4031364, --8845485, -8741869, 359167, -1893544, 2022930, 4912369, -898185, 2459943, 1104880, -34897, --264141, -4760971, -326418, -93952, -3950296, -310848, 3479997, 6935836, -1327145, -3311957, -2467459, -4289062, 3498251, -3580392, -1471026, 694174, -2745558, -3217468, -159451, -2007897, -360240, -747324, -3383361, 1597728, -277025, 4046396, 2575907, -2850248, 2291902, -1591285, -2118493, -1305670, 1388348, 1424855, 945430, 85899, 1459752, -1883880, -1174674, -2093797, --4394289, 563178, 1367947, -436476, 749472, -3314641, -11494406, -14307073, -6784975, -9501541, -24708410, -11928198, 5608691, -11260331, -3236258, 1256815, -1818919, -16809428, -339302, -7953206, -614180, 19937776, -6343130, 8404714, 10954314, 4019553, 4464619, 12018929, 3575560, -4584878, -3416647, 4755066, 5063767, 2210298, -2463701, 13979582, 551903, -1047972, -2309082, 3842385, --1166084, -4770635, 4729833, -1720671, 3399467, -13401909, 585726, -2531883, 12214887, -4737886, -3957812, 18351322, -1567663, 456877, -4436701, -7480223, -408559, -1164473, -7704635, 9785546, --2066416, 7121056, 773631, 6730214, -3835943, -641024, 14636175, 7226283, -11322608, -5862094, -3117610, 3591667, 1762010, 3193845, -3291556, 4214437, 5382131, 12217571, -15567646, 1018444, --6645925, 3259880, -264141, 1865090, 5756867, 8420283, -5550709, 5973763, -4014721, -2653216, --2236067, -1994476, 4713727, -10522670, -2071785, -4810900, 6096169, 5006322, 2109903, 2621541, --3544422, 4152697, 1873680, 3015067, -407485, 2410551, -3143916, -1678259, -3944928, -240518, --640487, -3456375, -56908, -273267, -952409, 47245, 4202089, 2676838, -2324114, -3701725, -1976222, 1537061, 4820027, -3626026, 286152, -1245004, 2160906, 2559264, -1269163, -1939715, --3917010, -8115878, -7351911, -7850127, 8508867, -16513076, -4915590, -10331007, 5126044, 17203492, --9376987, 547071, 454730, -3320010, 6585259, -5483063, 2627446, -1673427, -7100118, 15350750, -729608, -4951024, 185757, -2197413, -6808597, 5385352, -5225365, 5057861, -9729712, -4462471, -6499360, 4844186, -16233366, -2863670, -13830332, 4155381, -2352032, -13217762, 16125992, -4476430, --361851, -12224551, -13503914, 830539, -12181064, -1537061, -10531797, -8900783, 10536092, 1219234, --13686450, 4524748, -12256763, 10929081, 3877282, -5223217, 360240, 3548180, 11371463, -8792335, --12570296, 12708808, -8900246, -4991289, 6572911, 9605694, -17793512, -8673686, 10018011, 7544110, -3844533, -882616, 1181116, -12691091, 4306242, 4291746, 6956237, -2199560, -13548474, -9728638, -4696010, -11586211, -10256382, 4330401, -750546, 198105, 4167729, 9858024, -66035, -376347, -9064528, 884763, -1572495, 1600412, -1332514, -1828582, 1883880, -2374580, -1786170, -4587562, --4509179, -3124052, 720481, -2596845, -54761, 1893544, 1394254, -233539, -151934, 2021856, --2413235, -3642669, 1003412, -102542, 3400004, -3358128, -1065689, -3810710, 4337917, 4700842, -907312, -223875, -3000572, -1166621, -4177930, 354335, 549219, -2279017, 599148, 926639, -884763, -1012002, 8381629, -12964359, -21272436, -17088064, 7670812, -20440286, -1042603, 15564961, --1425929, 1154809, 11089069, -7355669, -6351720, 24713242, -9822590, 5811091, 9338870, -1705102, --22418656, -1824287, 2309619, -5588290, -3149822, -5170067, 20822002, 235149, 187368, -993211, --15083388, 2785823, -8705362, -4316979, 887448, 2546916, 4407174, 12152073, 2644089, -3092913, -23800024, 2540473, -5945309, -21777632, -3229816, 16025597, -3518652, -9978820, -13466870, -11793443, --10140418, -6324876, 16917340, 6621766, 929860, 9453223, 14127221, 7927973, -3132105, -2462627, -14604499, -2869038, -4536559, 4277788, 11158325, 1617592, -11555073, 2667712, -1204738, -17187386, --1342714, 13712220, -6824166, -7893076, -1967632, 18427020, -14693620, -2921115, -8216810, 8425115, -4838818, 3911642, 5847598, -2399276, -3197603, 6248104, 4936528, 3455838, -1044751, 781684, -3877282, -10805064, -2037962, 1428614, -5638755, 154619, 5876589, -588947, 1054415, -2316598, --711354, 3249680, 4140349, 6278169, 3485366, -1043677, 2193118, -3579318, -4608500, 1315871, --932008, -3713536, 4101694, 2205466, 3093987, 668941, 1480153, 3220152, 1744831, -927713, --2336999, -604517, 1268089, 6979, 1285806, 268972, 1603097, 992137, 2768107, 354335, --2732673, 5949604, 4836670, -4594005, -1590749, -2208150, -1572495, 2280091, -2792803, 1640141, -17357574, 1746441, -15511274, -575526, 4643934, -564788, -7078643, 6723235, -5242008, 13795435, --10634876, 9475235, 20720532, -5624797, -5542656, -4903779, -4335233, 18494666, -13743358, -15100031, --11530913, 4177393, -6030134, -9732396, -4495757, 6623377, -9337259, 5117991, 1185948, 7231651, -10748156, 1292785, -1416802, -2107218, 10588705, -2778307, 3712462, -13071196, -162672, -4684199, -10315438, -13893145, 11318849, -4832375, -7191386, 11397769, 19779398, -11203422, 5585068, -2517925, -3960497, -29841970, -23681912, -14385993, 1996086, -9150965, 3852586, 907312, -11141145, -8806294, -882616, 23673322, 5515275, -14865419, -22204980, -11744051, -8254927, 14475114, -10176925, -14485314, -3355980, 3084860, -13422847, -917512, -317828, -6691559, -1618666, -433792, -658204, 6437619, -1503239, -7747048, -6905234, -3824132, -9910637, -5426155, 1519345, 10947872, 1745367, 1978369, --3307662, -9149891, -1515050, 7326678, -467078, -4307852, 6704981, -10425496, -5195837, 1458141, -1516660, -267362, 1023276, 630823, -3618510, -7333120, -2732136, 5420249, -3344169, -2676302, --3030636, -6559489, -7286412, 2570538, -2711735, -1666447, -6881075, 1557999, 4265977, 5238250, --386010, -3321084, -3914326, 3743064, 1171452, 3374234, 29998736, 19393924, -4978404, 1845762, -19464254, -7742216, 812286, 8180839, 21060910, 12154757, -3492882, -4767414, -7078643, 1778117, --3831111, 225486, 680215, 21925272, 36575404, -2225330, 25277494, 15781857, 3401077, 3855807, --17759690, -17847736, -1870458, 4628364, -1130650, 4282083, -6534256, -13375602, -22293564, -2001455, --14290430, -12284143, -7938710, -12710956, -8931384, -560493, 20996484, -722628, -15666967, -1388885, -4656819, 15418933, -4704063, -3979287, -9292162, 6973417, -28214178, -25538412, -12110734, -12760348, --13472776, -8309688, 9200357, -11505681, -15740518, -13406204, -23620172, 12161737, 6685117, -21161304, -10994579, 21325050, 42012296, 23067732, -105764, 7623567, -23929948, -9870372, 13124346, 10946798, --6014565, -16305306, 2277943, 3413425, 14972256, -1887638, -15053860, -2660195, 24415816, 15498389, -17722108, 13975824, 24627880, 23050016, 7074348, 6278706, -5228049, -9661529, -2535105, -820876, --8119099, -1611, -9408126, -7107634, 11274289, 4969814, -2856153, -9608379, -3511136, -1111860, -15032, -10693395, 10877005, 186831, -8813273, 5433671, -5366562, -4596152, -1201517, 3411815, -14946486, 7294465, 17849884, 144418, -3305514, 2090039, 6922951, 4571993, -2093797, 9405442, -633508, -2929168, 1566589, 7805030, -3616363, -3175055, 3064459, -563178, 2764348, -30735322, --3057480, 49740016, -3751117, 1918240, 12272869, -17998060, 10052908, 35306780, 32371168, -32686312, --31549756, 107911, -34215320, -12798466, -155156, 4055523, 12341052, 18851686, 16429324, 29336774, -6803765, 11626476, 11545946, -4818417, -2176475, 3303904, 3767223, 8753680, -15757161, 35243964, -14985141, 16522739, -3136937, 35793184, 4348655, 21628918, 8837432, 6858526, -8468602, -5319854, -18119930, 7128035, 8391829, -19031536, -10312216, -15867757, -9401147, -11502459, -108448, -23062364, --25253870, -1330903, -9754944, -47398724, -35431868, -31897648, 9099425, 34802656, 44843216, -24641838, -30909270, 48266304, 8181913, 4218195, -3088618, 33266670, 2507187, 30113626, 12869333, 14187351, --19976966, -65906272, -52331492, -11652783, -1785096, 1568737, 2322504, 24588688, 23085450, 20265804, --12514998, 1778117, -6531035, -33894808, 3447248, 2880313, 17131014, 2822331, 25192668, 22925998, -5647345, 19965692, -8369818, 13576928, -11884175, -13212930, -4929549, 5486284, 21898964, -4756140, --6155762, 3398393, -10821707, -5132486, 11091216, -2979097, 7667591, -13623636, 18796388, 5859409, -200253, -1125818, 14459544, -3385508, 1017370, 2527588, -282394, 9990094, -7092602, -3459059, --96100, 9608916, -14055280, 2044404, 5017059, -6694244, 1053341, 2728378, 1746978, -3176128, -23669564, -4863514, -43943420, -3386582, 68867120, 13110925, -13361106, 18311056, -6111202, 12073690, --5927055, -7070053, -23191750, -8140574, -2858838, -3377455, -11296301, 16825534, -15173046, -15465103, --1459215, 2981244, 14150307, 6965900, 3632469, 6632503, -6280316, 569620, 21314312, -10627897, --26176216, -4728759, 1917703, -8279087, 17686676, -8986145, -6420976, 15639050, 3929358, 11918534, --27025544, -29609504, 9659381, -5355288, -10554882, -12426414, -16206522, -32648194, -233002, -2455648, -10729365, -20742544, -44506060, 33549064, 8797167, 31562640, 3156801, -9590125, -9671729, 8549669, --16941498, 26248692, 4833449, 31415538, 21311090, 46426448, -4844723, -43704512, -34622268, -19069118, -25105694, 25976500, -19705846, 20718386, 39908300, -23250268, -3954591, 43672300, 6419903, 33647312, --5236639, -16536698, -45283452, -17054778, 4764193, 29130616, 24717000, -14354854, 12256226, 12244415, -23420994, 8611409, -23991688, -27582816, -11370926, 19772956, 40770512, -623844, -4052839, 21801254, -10923712, 2357937, -3908957, -8592082, -11483132, -8560944, 6638409, 4707821, 12643310, -5055177, --1900523, 1643899, 7483981, 10555956, -13420699, 629750, 14327474, -1273995, -4705674, -15947750, -11449846, 367220, -7451232, -4628364, 16007343, -387621, -10980621, -5261335, 8462696, 643708, --36536748, 37886980, 51390356, 8968429, 2338610, 11438572, -7833484, 22450330, 12558484, 23466090, --4729833, -24713778, 55013164, 357019, -20640540, 2588792, 37217504, 17076254, 7330973, -23504208, -2598455, -12553116, -9162776, 3752728, -17474074, 1551557, 4773320, 21211232, -29949344, -5028333, --3532611, 17935784, -6719477, -10997264, -10477573, -48318, 11458436, -23240604, 1784022, 6251325, --47659640, 6687801, -12851616, -33543158, 22218940, -24758876, -43531104, 57724896, -352724, 3457449, --4446902, -15897285, 34862788, -24463596, -2209761, 5309117, -15766288, -1162862, 44038448, 22854594, --38643968, -41789496, 41472204, -19595252, 24211804, 39855684, -35520992, -61179660, -42343544, 70968968, --4089346, -55370180, 50883016, -36863168, -70312912, -955093, 60852172, -2467996, -72969880, -885837, --24482924, 831076, 90236192, -13587666, -66230544, 9798431, 35434016, 923418, 41419592, 2581812, -942745, -12884902, 1806571, 9634149, 33467458, -6779069, -8865349, 33203856, -4282620, 8074002, -23255638, -3753802, -33530272, 22181896, 16064251, 25949656, -7843147, -377420, 9292162, -7180649, --24636470, -10686416, 10372346, 1017370, -4728222, 32904818, -828929, -36074504, 8642548, 29953102, -17371532, -12370043, 1791001, -14208289, -7912941, 36298380, 30371324, -7572028, -34454764, -10790568, -14383845, 11898133, 9604621, -6208375, -23099408, -865973, -24871082, 37891276, -7846369, 11621108, -23794656, 17420388, 17964774, 44548476, 18911278, -10712722, 6730751, 11111617, 14197551, -15897285, -42395084, 40499932, 5330592, 14137422, -10142565, 150861, -43841952, 20200842, -23276038, 15704548, --2044941, -15827491, 23347980, -9208410, -17883170, 9648644, -25143276, 16718697, 455803, -4531191, -6628745, 10526965, 15209553, 16031502, 14818711, 45392436, -4669167, 5140002, 14055817, 30660160, --3213173, 8316668, -99858, 24036248, 28048284, -8975945, 6601365, -1019518, -4801774, -51383916, -3950833, 22255446, -12520367, -12380243, 11268920, -21254182, -32172526, 3117610, 18009334, 38408280, --49146236, 19025632, -2651606, -1094680, 83752, 19444390, 40939628, 1018444, -30094298, 10233833, -33207076, -17757006, -26481158, 2855080, 14508400, -13823352, 26284662, -4821638, 20182052, 2085744, --20331838, 25210384, 19912542, 3731790, 15692200, -8564702, 9768903, -4499515, 5128191, 8486855, -23964306, -4755066, -29228864, -3400004, 33697240, 2973191, -4365835, 30380452, 6200859, 233002, -7157563, 21205864, 30906584, -19491636, 7578470, 4633196, -1529008, 15614354, -4478041, -22141094, -7366943, 21922050, -9244380, 6040872, 7282117, -6551436, 8335995, -13902272, 10187662, 9636296, --12530030, -26551488, 11501922, 15827491, -7144141, -9378598, 14322105, -610959, -8735427, -9632001, -10185515, 5950141, 23521926, -44414256, -34582004, -641024, -53369264, -18355080, -19752554, 41069016, --1199907, -15250892, 18901078, -9744207, 10467909, 2632815, -20392504, 24274082, -55030880, -5287642, -3317325, -13827647, 10116259, 2377801, -10763725, -2041720, 1585380, 13771276, 799401, -16222091, --53414896, -39026756, -29697014, -14851997, 33047626, -6811282, 1202591, -53562000, 3960497, -3840238, --7286412, 1564979, -51726976, 27548994, -25139518, 12603582, -10321880, 35059820, -19270444, -34222300, --16450798, -436476, 25467546, 46392628, 48831632, -60488172, -44716516, -30959734, 20734492, 49416284, -59925532, -10624675, -15136002, -52979496, -19665044, 46845208, 28648506, -738734, -67109, -1298154, --44707924, 29676614, -9048422, 28633474, 69687992, -78142632, 94392640, 26504244, -51270100, 14124000, --102700720, -100463040, 73913704, 31380104, 7200513, 21873732, -38075420, -18445810, 68868728, -2833068, -46279884, -4763119, -37398964, -12380243, 40865004, -13849122, -1014686, 13079786, -3406983, -24108726, -13191455, -19618874, 8849780, 25898652, -27290222, 25501906, 8519605, -3684545, 9618042, -1813550, --6237903, 4041027, -9553081, 4601521, -19424526, 16872242, 17725866, 3393024, 474594, -6197101, -9024800, 3087545, 3531000, 8588861, 17034378, -21556440, -7330436, -20034412, -15219217, 1281511, -631897, 16689706, -22185116, -17183090, -21386790, -13724568, -5844914, 31291522, -44745508, 37023156, --22278532, 22789634, 11832098, 14405320, 8254391, -28432684, 31008054, -4572530, -11275900, -10168335, --12492449, 9597104, -6632503, 13629005, 7927436, -1733556, -3411278, -23803246, 13706851, 5689758, --6276021, 5348845, 12427488, -3548717, 6987375, -12085501, 14164265, -5304285, 1686848, 5847598, -5937793, -6349036, 21917218, -839129, -20886962, -1357747, 9420474, 4735739, -16012712, 7727720, -18328236, -3461744, -9120363, -8753143, -1360431, 5095442, -2385854, 21705690, -14743012, -5581847, --5332202, -10895795, -1071594, -3321620, 7806103, 5759015, -9117679, -1347009, 8194798, -8766565, --4658966, -2614025, 13269301, -8290898, 5607080, 9021579, -20939040, -8368207, 6513855, -21678848, -32749662, 8805757, 10322954, 15190762, -9772124, -241592, -2992519, -14925548, 2856690, 4949413, -11866995, -2363306, -5197448, 7343321, -7735236, -3102040, 7059316, 101469, -1912334, 6106907, -1715839, -3867081, -317291, -4272419, 9460202, -9062381, 14428943, 669478, 3069828, -6054830, --682900, -2189897, -4691715, -2375654, 3332895, 1776506, 4061965, -64961, -3561602, -2281165, --11410117, 11416560, -9184788, 5181341, -2273112, 6673843, -3842922, -10511932, 588947, 5484673, --8744017, 12977781, -10396505, 5687611, -4029216, 51434916, 6777459, -17522930, -13492640, -10230075, --926102, -1729261, 1183800, -1476395, -1939715, -29199336, 682900, -5874979, -6678674, 3620121, --11392401, -5267241, 5346161, -8052527, 2310693, 8959302, -12179454, 7621420, -4485020, -6564321, --999654, -6565932, 3067144, -6100464, -3174518, -7174206, -1351304, -186294, -133144, -4341675, --4395362, 1260573, 2353105, -5175973, 6924024, -8570070, -724239, -3467649, -1053878, -1675037, --6710350, 9154186, 5692443, -9343164, 11295764, -1225139, 2429878, -5170604, 10838350, -10885058, -837519, 849867, 2882997, -1864016, -2774012, 7991861, -5328981, 1122597, 452582, -1720134, -2604898, -3588982, -463856, 4430259, -2243047, -2135673, 5130876, -2066953, -2207076, -4820564, -2488934, 2246805, -10494753, 12514461, -7086159, 2771328, 886911, 95026, -4055523, 1662689, -5197984, -3920768, -1930588, 2695629, -3855270, -328028, 3187940, -1387811, 1278290, 609349, --2856153, 416612, 383863, 2494839, -4648765, 297427, -515396, -1925219, 1956895, -2382096, -1129576, -1576790, -4070555, 2189897, -3528853, -2128156, 1315871, -2310693, 822486, 1955284, -229781, -3185255, 3277597, -731218, -2018635, 2614561, -25311852, -40808096, 45587856, 153940752, -15510738, 35470524, -83812528, -127807488, -32293322, -66685808, 51938504, 107368816, 56363928, 35893580, --8152922, -41436772, -41041632, -30617212, -28708636, 10369125, 18151606, 10737955, 19548006, 2770254, -1436667, 7938174, 2092723, 8989903, 6896107, -5080410, -19727322, -14324790, -17403208, -23146116, --12449500, 13309567, 16827144, 31665720, 44355200, 16292422, 6305012, -14610942, -35401268, -33961916, --23968064, -16374026, 3258270, 13308493, 18749142, 20313584, 16850230, 11624329, 1200980, -1168768, --11339251, -7574175, -5077188, -5436355, -2315524, -6166500, -1953673, -7343857, -7470022, 2888366, --719944, 9913321, 15884937, 9688372, 23689428, 21388400, -10335302, -20747376, -21086678, -31029528, --8912594, -7337415, -1806571, 19376208, 16993574, -2848100, 14761266, 18743238, 6174016, 13148506, --1291175, -14810658, -10987063, -25549686, -16323023, -5927055, -1723356, -1733556, 4519380, 12313134, -19130322, 24458228, 20431696, 7028714, -11336566, -18204218, -17701170, -19444928, -8920110, -4823249, --2145336, 4500052, 9558450, 7844758, 13418015, 7553774, 8776229, 8237748, -40802, -6533182, --8851391, -10786810, -10867341, -9427453, -5194226, -5129265, 2955474, 5675263, 11014981, 16288663, -15468862, 6079526, 993211, -8732205, -10902238, -12576201, -12862353, -3593277, -667867, -2312840, -2954938, 10053982, 12829604, 6526740, 1337346, -562104, 106300, -2474975, -3004867, -4756677, --3081639, -3589519, -2698850, -1492501, 6979, 150861, 2847563, 5741298, 5909338, 3084860, -1373316, -1497870, -2365990, -3412889, -2589329, -2882460, -1435593, -1340030, -52076, 670552, -2371896, 2166811, 2591476, 874026, 609349, -394063, -562641, -1258962, -447213, -590558, -93416, -536871, -700617, -1874216, -93952, 217433, 1098438, 847182, 1804960, 550293, -418222, -1115081, -427349, 282931, 1009317, -414464, -926639, -1939715, -679679, -47245, -1105417, 333934, 458488, -354335, 437550, 180926, 964757, 359167, 608275, -461172, --30602, -949188, -596464, -1083942, -207769, -437013, 479426, 171262, 1191317, 792958, -948114, -140660, 126165, -692027, -127775, -828392, -420370, -726923, 266288, -111669, -583042, 45634, 489089, -213675, 448824, -116501, 422517, -300111, 140123, -502511, -136365, -368830, 285078, -274878, 301185, -293132, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ -3990025, -6490770, 1706176, 5731097, 100395, -5911486, -4074850, -4305705, -668404, -2956548, 6933151, --5183489, -1315871, -2353642, -827318, -4157528, 3999152, -2451353, -1918240, 3362960, 5578089, -6310381, 973884, -451508, 1314797, 335544, 892816, -2854543, -3071439, 1504312, -2784750, --2790118, -3737695, -3931506, 1202054, -2603287, 3482682, -4339528, -587874, 1917166, 1824824, -1607928, -6729677, -1206886, -3731253, -647466, -1563905, -4104378, -80531, 4904853, 1496259, -2384244, 2259153, 2653216, 342524, 3328063, 2096481, 3714610, -2094870, 2480881, -1213328, -1715303, 202400, -3420942, 4012036, 4534949, -2421825, -3036005, 1343788, 4168266, 1000191, -1117228, -1387274, -268435, 2265059, 1416266, 370978, -819265, 282931, 1911797, 2327872, --275952, -3615289, -2211371, -1214402, -1537061, 846645, -340913, -324270, 1726040, -1263257, --419833, -2147, 308164, -854699, -241592, 133144, -1367947, -153008, 1691143, -245350, -896574, -1216550, 709743, 362925, -78920, -798327, -10161893, -2645700, -4594542, 3375308, --9528385, 2101850, -4211753, -2196339, 1327145, 205085, 1040993, 1437740, 1049583, 4141422, --1857573, 446677, -440234, -5005785, 3677029, 6197101, -5055714, -4709969, 3565360, 936840, -4406637, 1417876, 5928129, -813359, 1980517, -3139084, -985695, 6082748, 459025, -3947075, --4911295, -5264556, 196495, 4382478, 2191507, -16643, 4946192, 3976066, 128312, -4054449, -6332393, 1635846, 4876936, 4998268, -900869, 3189013, 3725884, -443455, 2189897, 2584497, --2502892, 522375, -796180, 2456721, -5617817, -3566434, 1774358, -3448322, -1363652, 4803384, --1969779, 2644089, -1153736, -7510287, 1238561, -25233, 3922379, -6183679, -3362423, 2811593, -677531, -584116, 1567126, -2908767, 817654, 755914, -925565, -1829656, 2501819, 2314451, -1561758, 300111, -985695, 623307, -738734, -1104344, 801548, 727997, -1544041, 1101122, --878321, -630823, 1326071, -966905, -2045478, -19327, -784905, -235149, -987843, -1036161, -385473, -67646, 576063, 5369, 564788, -1471563, 393526, -421444, 6355478, 6758668, -2939368, 5005248, 3867618, 6769406, 7664906, -2835752, -848256, 2611877, -7703561, -233002, --2554432, -1440962, 3494493, -4446902, -544924, 5708012, 1028645, 3667902, -1823751, -1291711, --1935420, -7197292, -1204738, 517007, 3798899, -1135482, 6553583, 2616709, -1155883, 2654827, -1342714, 3405372, -2462627, -482647, 7656316, -999654, 7232725, 3431142, -3201898, 789200, -6367289, 3353296, -4231617, 5850283, -1616518, 421981, 283468, -1146756, 1098438, 675384, --5283347, 3387119, 2436320, -425739, 172336, -1146219, -4773856, 33823, 2655364, -515933, --578747, -3173981, -7010997, -2375117, 2585570, 5898601, -8934069, -4726612, 1650878, -3863860, -2268280, -152471, -57445, -5338645, -4088272, -2356863, -3500398, -1692754, 182536, 630823, --1264331, 2049773, 1595044, 357556, 1469416, -1603633, -617402, 68183, -2415919, -498753, -225486, -3022046, 1267552, 763430, -596464, 115964, 624918, 1491964, 153545, 233002, -14496, -1458141, -198642, -423591, 1078037, 779537, 1479079, -1030255, -242129, 9422085, -10018011, -2003065, -4195110, -4587025, 9605694, -8333847, 230318, -1360968, -3882651, -5276904, -1878511, -1451162, -7183870, -8745090, 334471, -658741, -4566087, 1653026, 2426120, -3215857, --4842039, -4520453, 6388227, -6894497, -831613, -8056822, 95563, 4485020, 1530082, 767725, --4517232, -4345970, 3955128, -3052648, -4617090, 573915, -1679869, 2827162, 57445, 1142998, --4604742, -1701344, -1298691, 4422743, 3031173, 3076270, -9118216, 1444183, 2541010, 2084670, -2569464, -2597918, -1661616, 329639, 1846836, 3609920, -626528, 2386391, -2640331, 7043747, --12773770, 4490925, 361851, -6791954, -294205, 7516193, -2275796, -3518652, -6851010, -2306398, -529892, -1897839, -11274, 3085397, 3917010, 3280281, -974958, -536334, -4033511, -816581, --1037772, -2022930, 551366, -818191, -805306, 1643362, -2044941, -936303, 1957968, -974958, -1261110, -293668, -821413, -701153, -552977, -2942053, -1854352, 1291175, 1435056, -1392643, --1144072, -945430, 1073205, -688805, -436476, -1150514, 742493, 812823, -1395328, 559956, --212601, -1248762, -316754, -703838, 790811, -410169, 1185948, 1713155, -807454, -4472135, --14133664, 2576444, -6442451, 1410897, 1185411, -819265, 10035728, 554588, -6413460, 8570070, -4134980, 2943663, -1283122, 1777580, -2604361, 6721087, -1109712, 767725, 10126996, 9882183, -4234301, 4527970, 4358855, 4922033, 3291019, -9758703, -3041911, -131533, -2559264, -8304856, --907849, -1965484, -2187212, -4458713, -77846, -1305133, 7157563, -2288681, 12543452, -69793, -1066226, -2317135, -1805497, 101469, -351114, -997506, -2181844, -1462973, -6132140, 1502165, -1016834, -726386, -3164854, 4297115, 3188476, 3725884, -1292785, -2682744, 85899, 3248606, -3522410, -2815351, -8009577, -4089346, 881542, 6699075, -908922, 5478768, -4328254, -6299107, -4728759, -2196339, -5164698, 3022046, 3159485, -5797669, -4576288, -6380174, -2106682, -2189897, -3689377, -1986959, 1136556, -397821, 2466922, 1527935, 1375463, -1193464, -663036, -3313031, --1651415, -874026, -19327, 1490891, -263067, 116501, 2786897, 1095754, -113280, 44023, -1799591, -1152662, 503585, 528818, -914828, 1088774, -807991, 723165, 576063, 806917, --478352, -2049773, 2034741, 278099, -3428458, 5092758, -6049462, -6832219, 3344706, -2029372, --456877, -3634079, -1912334, 3350075, 5012227, 2456721, -993748, 651761, -442919, -1216550, --4510790, 1479079, -12396349, -3725884, -3847217, 3379603, 4453881, 279173, 2289218, -7889855, -2287607, 1126355, 2279554, -7119445, 13459354, -674847, 2631741, 1671816, -6126234, 919660, --8853001, 5719286, -1758252, -7616588, 1686848, 508417, -3619584, 343061, 992674, 5893769, -10896332, 4578435, -2003065, 3409130, 4576288, -10049687, -3499862, -4639102, 2949569, 2221035, --1488206, 1518271, 3649112, 2151779, 4651987, 8306467, 368830, -3177739, -684510, -419833, -6749004, -4790499, 201327, 2970507, 9041980, -30065, -5720360, -5818607, -332323, -7132330, --781684, 2614025, 11038066, 9285719, -909996, -5030481, 4181688, 230854, 1348083, 944893, --195421, 1302986, -200253, -1440962, 1364189, 1490354, -1355062, 2115272, 2204392, 1902134, --391379, -1675037, 1441498, 1684701, -109522, 447750, -1181116, 139586, -120259, 2477123, -1103807, 1517197, 1401770, 320512, 996432, -89657, 1171989, 2206003, 650151, 859530, -1803349, 2143189, -891743, -637803, 706522, 580894, 1851668, 2529736, -1135482, -12997108, --3577708, -4811974, 5539434, 189515, -2709051, -16712791, -2237678, -2246268, 6891275, 16533477, --4799089, 11101417, 1875827, -9798431, -10031433, 1721208, 2502355, -5704254, 6226629, -4514011, -5009006, -6244346, 2971044, 2126546, -5959267, -5000953, -3843459, 1944547, 6428493, -8462696, -268435, -8898098, -542777, -3400004, 2115272, 6452652, 631897, -2830384, -2530810, 6984154, --73014, 10660109, 3230352, -4059818, -3932043, -3126199, 1475321, 6675453, -194884, 11084774, --19854024, -14634027, -11872363, -2769180, -10136123, 617402, -3853123, 3546569, 8930311, 1575179, -3659312, 5725729, 9454834, 4851703, 1392106, -6608344, -16452409, -17314624, 9201967, 580357, -11698417, -8428873, -6100464, 5106179, -12198781, 190052, -4402342, -509491, -7893613, 255014, -2538326, 7013145, 1204738, 1087701, -2328946, 2490544, -591095, 783832, 1898912, 3140158, -4044249, -1179505, -1807644, 2937221, 1441498, -1206886, -2251637, 390842, -442382, -330176, --1001264, 395674, -49929, -1249299, -483721, 1160715, 2144799, 1715303, 1446330, 725313, --5109938, -2840584, -2007897, -1863479, 2611877, -497142, -920734, -57445, 680215, 117038, --177704, 7740605, 3535832, -6360847, -64961, 14834817, 12774843, -1282048, -10847477, -18590230, --2005213, -6600291, 6711424, -5651640, -5350456, -21040508, -8878771, -18858664, 7016366, -730144, --4469987, 4876399, -559956, -4832, 1453310, -6135898, 626528, -7031399, -1133335, 4078072, -3218004, -7171522, 2632278, 7074348, 11805254, -1895154, -1547799, -4020090, 756451, 5957657, -8724152, -1364189, 1365263, -1986959, -1408212, 10161356, 7573638, 175020, 7808788, 2109366, --9377524, 1658931, -867047, 12114492, 4870493, 1413044, 5993090, 7813620, 2270964, -7119445, --11885785, -2894808, 2579128, 6288369, 3361349, 267362, 2588255, 9360344, 2172180, 2952790, -4452808, 2418067, -6024229, -7036230, -5916855, -6953552, -6162205, 10415833, 1562294, 8010651, --7092602, -6468221, -1143535, 6669548, -4192962, 3484292, 2156074, 938987, -3553012, -2450279, --3278671, -2441152, -3747896, 1367947, 1296543, -1196685, 2570538, -1808718, 1243393, -824634, -336081, 985695, -3316789, -2258616, -3329674, -2356327, -4070555, -1350767, -3367254, -1804960, --1930051, -2772938, -118648, 2822331, 1027571, 1076426, -1023813, -464930, -327491, -887985, -2377265, -1280437, -587337, -896574, 26119306, 5835787, -8172786, 4774393, -4795868, -15447387, --3231963, -15152108, -8438000, 7981123, 10435160, 4156455, 2094333, 982474, 1880659, 10065793, --7138773, 14202920, -9173513, -9192841, 11220065, 5095979, -18210662, 8044474, 4613869, 5857262, -11961484, 6003291, 8897562, -512712, 4825396, -2754685, 7603166, 2089502, 1633698, 5167920, --10234907, -5446019, -3128884, 6655589, 2873333, 2445984, 5242008, 1611150, 1877975, -9168681, -122407, 10114111, -1767379, 1329292, 1300838, 1387811, 12024835, 4715337, 16165720, 3820374, --2256469, 15429670, -13147432, -1614908, -2041720, -5163088, -1156957, 3315178, 15244450, 1562294, --3175055, -5800890, 3193845, -6105296, -2602213, -3892314, -8265128, -1231045, 2282775, 13103945, --1022739, -12454331, -3418794, -7435662, -3722663, 9181029, 7383586, 8606041, -6708739, 1506460, --7471096, -1036161, -2493766, -4438849, -2480344, -6125160, -3565360, -1066763, -2600066, -8072391, --3169686, -2244657, -1602560, -1749662, -2807298, 462783, -1319092, -6332930, -272730, -2996814, --1798518, -439160, -21475, 1237488, -157840, 2989834, 2884071, 592169, 555661, -1964411, --1759863, -383326, -2136209, 3054259, 1801202, 2872796, 2668785, 1225139, 3721589, 2535641, -962073, 1806034, -468151, -1418950, 2639794, 3818763, -9434969, -14543833, -5251672, -14319958, -10283225, -12218108, -8992588, -7195681, 6499896, 16383690, -16624208, -5901822, -18735722, 5366025, -2614561, 1756642, -5382668, 1461363, 21092584, -11039677, -1853278, 7984881, 5455146, 4175245, -7419556, 4938139, -6939594, -11729019, -2191507, -6498823, -8850317, -10829760, 172336, -2531883, -2664490, 13932337, 8824547, -7836705, -4231080, -884226, -4045322, 3403762, 26508002, -9008157, -18490908, 5782100, 3106872, -1223529, -2998961, 3115462, -10155450, 4846334, 14391899, 595390, -2297808, 11504607, 7474317, 4442607, -9714679, 8107825, -5793911, -8670465, -23414552, -7385733, -15209553, -8666707, 3941169, -16496969, 11790759, -6222871, -6495065, 10284299, -16430934, -12164958, -18611168, -13283260, -12493523, 7450695, -8571144, 1716376, 28454, 5313412, -13477071, 4226248, -352187, 13427678, -10004589, 3326452, -1421097, -7613367, 9962714, 2010045, -8293582, -6021544, --5714454, 870268, -22012, -4181688, 111669, 5193689, -435939, 3679713, 4144644, 3285113, --7467338, 4147328, 3804267, 5992016, -151398, 440234, -5429913, -2171106, -2672007, -2817499, -1255741, -628139, 3475702, -4940823, -3114388, 1861332, -4777614, -4030827, -5089536, 1750199, --10600516, -7868380, -1085553, 12059731, -5711233, 21181704, 19697256, 3893388, 6306086, -11421392, -1414655, -9242770, 14790794, -2938831, 4358855, -7041599, -4569845, 2542621, 1998234, -6757594, -11340861, -3178813, 2409477, 4258997, -7421704, 2842732, -9470403, 74088, 5398237, 6492917, -159451, 8574365, 10782515, -768262, -20170778, -3356517, -5961415, 14489072, -12181601, -15103789, --10793790, -7184944, 2116882, -8534100, -6726993, -4267587, -1224603, 2714956, -29563334, 18738942, -14583561, 21358336, -6747394, 3484292, 14295799, -13574781, -12614319, 2573222, 9352828, 6200859, --1575179, 2952253, -7441568, -8826158, -11335492, -3258807, 39383240, 3247532, -21767968, -3816079, --11906723, 7592966, 5925445, -13429826, 2943663, -4057670, 1166084, -6577206, 8469676, 8678518, --1224603, -4256313, -5105643, -17032230, 5224291, 2868501, -627065, 7185481, -3353296, 1242319, -2816425, -8015483, 3187403, 4973572, 11303280, 6088116, 779537, -9538585, 151934, 8934606, -601295, 122407, 6681359, 262530, 2343442, 6626598, 5601711, -876173, 3112241, 5633387, -5183489, -2292439, 2327872, 6742025, 8204998, 6122476, -71404, -4111894, -861141, 331786, -5184026, 132607, -1341104, 491237, 1977296, -3027415, 1990717, 3304441, -2975876, 2172717, --7428683, -783295, -5305895, -11642583, -21354040, 1371705, -17777944, 8165270, 3303904, -15001247, -8617315, 9094056, 13593571, 3432216, 5596343, -15559056, 60666, -3419331, 14488535, 6176163, -984084, 12808666, 15075872, -2172717, -6692096, 1279363, 18503256, -12221866, -9010305, 8945343, -5457830, -12429635, -2323041, -11534135, 21103322, -18130668, 5258114, 10624675, -6347962, 9729175, -3985193, -5485210, -5058398, -5874442, -8133058, 11192685, 15976741, 2694018, -11700028, 811749, --12958453, -5494874, 8935679, -2084133, -6293201, -5287105, 2505040, -18097382, 816044, -2304787, --9898826, 13324599, -13300440, -1376537, -2863670, -10505490, 10898480, -1309428, 6409165, -5577015, --801548, -1076426, -6191196, 4477504, -5689221, -1578937, -5600638, 15455977, 7078643, -19412178, --3933653, -31675920, 18219252, -541703, -13848585, 12112345, 1567126, 1372242, 4811974, -273804, -7422777, 8332774, 2183991, -2794950, 5052492, 8992051, -5246840, -3856881, 4032438, 862752, -2513630, 2282775, 4988068, 5953899, -4058744, 2858301, 2210298, -5637682, -4519380, 3583077, -1015223, -1058173, -3264712, -3637837, -5431523, 4996658, 5862094, 423054, -3580929, -12309913, -403190, 513249, 3981435, -8111583, 980863, 5418101, -3126736, 6350646, 3273302, -1027034, -2068027, 3183645, 478352, 783295, 2234994, 4030827, -3915937, -839666, -2222109, 1087701, -18823768, 913754, -14681272, -6030134, 8354249, 14049912, 14648523, 727997, -3695819, 21070572, -8878771, 23396834, 2614561, 2158758, -11394011, -4412005, -6846715, 6379637, 3136937, 12738336, --14607721, 1159641, -8788040, 7884486, -12696460, 4921496, 13575855, -1895691, -653372, -7034083, -1717987, -7081864, -25035902, 3583613, -4056060, 1901060, -11322608, -2259153, 9432285, 18895172, --2193655, -6626598, 10644003, 5294084, 2403571, 13058311, 4234301, -6712497, -3544959, 8489003, --1400159, 7762080, -9319542, -7913477, 2549063, -7427072, -14797773, -6557342, -16819092, -3534221, -5330592, -12851079, -2120103, -14785425, -6789270, 55835, 5630166, -17652852, 7543573, 1484985, --10850161, 13437879, -4983773, 3678103, 23278722, 26803818, 1459752, 9529996, 19229642, 23461796, -22870700, -2119566, -15675557, -23475754, -8850317, -15510738, 14537927, -3028489, -7242389, 3944928, --645856, 1772211, -545461, -6849399, 7250442, 2278480, 2550137, 699543, 9892920, -5534602, --380105, -2971044, 6777459, -6394133, -3060701, -545461, 9758703, -2467996, 5784247, 8424578, --7875897, -1481227, -3489661, -8456791, -3757560, -1829119, 3431142, 438624, 11464878, 3329674, -7665443, -616328, -7856032, 2252710, 1815161, 78920, 31988916, 36668820, 1926293, 11732777, -11247982, -1569811, -26395796, -725850, -1065152, -10040560, 7435662, 6869264, -14376866, 7789997, -10045392, 1620813, -3839164, 5419712, -3685082, 18634790, -3226057, -8802535, 100932, 4182761, --1781875, -1300838, -359167, -29861296, 8575439, -757525, -20603494, -8617852, 3533148, -2024003, --14051522, 4778151, -16579648, -1594507, 1597191, -26665842, -4782983, 11293617, -8558259, 1128503, -16724066, 10156524, 12785044, 3873524, -7252589, -12527883, 12722230, -6709813, 7111392, -11916387, --6192806, 8334921, 14289893, 1965484, 17124034, -11641509, 14809047, -12705587, -15169288, -10952703, -14758044, 15341086, -14346801, 7256347, -39549132, -3762928, 11573863, 3517041, -6240588, -15906411, -7210713, -22419192, 3549791, -11641509, 10511396, -17358110, -11009612, 17063368, 346282, 8489003, -1916629, 7373922, -3920768, 2939368, -1996086, -13065291, -2374580, -6194954, 3965866, -4343823, -2245731, 320512, 2099165, 839129, -2881923, -4115116, 501437, -8358543, 2865280, 2108829, -4639102, -5436355, 4607426, 4112968, 2810519, 3503083, 2698313, -5837398, 551903, 2496450, --4185446, 7262790, -717260, -3147674, -4327717, -287226, 630823, 3315178, -2767033, 3124589, --2673080, 7617662, 3432216, -6923488, -1762547, -1938104, -3163244, -3093450, -6977711, -29153702, -2304787, 35713728, -24088860, -2441689, -1934883, 1745367, -9429064, 4420595, -15134928, -15830713, --5002563, -4440996, 3955665, -4103305, 8330626, -11907260, 554588, 22916334, -18748070, -16852378, --3883187, 20033874, 2985539, -25446070, 10928007, -9542344, -10654203, 2353105, 34917548, -19713364, --10741713, 24583320, 18485002, 1435056, -10075993, 520228, -3649649, -8017094, 7235410, 6304475, --4059281, -20208894, 25839060, 11906186, 5012764, -27453968, -4028679, 8323110, 9594420, -3552475, -14502494, -2473901, 5029407, -6415608, -16295106, 10558103, -11586211, 6881612, 3795141, -14565308, -27358942, 4029753, 19742354, 19494320, 3649112, -29719026, -5528697, 124554, -11598022, -6111739, -1262184, -1099512, 12984223, 23979876, -6831683, -2517388, -10508174, -4913980, 10171019, -6925635, -5969468, 17790292, -15549929, 17682380, -3365107, 5205501, -6644852, -3792993, -5558225, 615791, -3466039, 3782256, -2851858, -57445, 4202089, 2164664, 9558450, 4271345, -4634807, 250719, -981937, 8449811, -4648765, 2350958, 4088809, 1190243, -224949, 152471, -11112691, 5363341, --4027606, 5248987, 7137162, 797253, -1044751, 3433290, -281320, 2594697, 1013612, -1313723, --4068408, -4358855, 8433705, 1288490, -1896228, 2207613, -5153961, -1118839, 8573292, 11231339, -1503775, -10260140, -51596516, 3425773, -13478144, 1816234, 25801480, 2504503, -5000416, 4741644, -978716, -17479444, -18920404, -16994112, -16362752, 21306260, -4276714, 25422986, 2238752, -23954106, --857920, 2677375, 20534776, 4077535, -3335579, -4054986, 5855651, -12887586, -4962835, 22755274, --4647692, -29487098, -22557706, 13498545, -2944200, -6109054, 6771016, -2092723, -15218143, 4608500, -8918500, 20486994, -4135517, -16965658, 220654, -21404506, 8232379, 24275692, -3893925, -29750164, -9361418, -322659, 1664300, 7193534, -9387188, 18337900, 1365263, -12344810, 9601936, -6677601, --4146254, 26193394, -13420699, -4490389, -4412005, 16506633, 6619082, -28947542, 14681809, -23325968, --5578626, -12582107, 2998961, -7670812, -7087233, -2402497, 13288629, -4315906, -8207146, 15744813, --9188546, 16161962, -96637, -8531416, -5148592, 4023311, 4436165, 3205656, -9722732, -3211025, -2376191, -541703, -6364068, 143881, 5983427, 9225053, 3833795, 4745939, 743566, 9067213, --5142687, 2944737, 7161321, -2724620, 891206, 2922725, -1801202, 1429150, 2831994, -8886824, -7497403, 3195456, -8946417, -7330973, 512175, -10519449, 908922, -7754027, 10028749, -18149994, --45097, -3845070, 1905892, -4728222, 5658620, -3029563, 2634426, 2026151, -3741454, 816581, --25115896, 5081483, 41649372, 27008902, 12453795, -20714628, 15521475, 19465866, 28983514, 13884019, -3473018, 936840, 18173618, 31188978, -7010997, -3907347, 17761300, -35121560, 12788802, 31145492, --6438693, -10927471, 8149164, 24154896, 19575924, -13173202, -22348326, -1427003, 11289322, -3906273, -2740726, 244813, 26276074, -15107547, 16840566, 25274272, -10142028, -3192771, 17945984, -2810519, -62878320, -26487064, 11333345, 42899208, -24764782, 7991324, 2890513, -35014184, -1073742, 6380174, --15377057, 33986612, 2586107, -4821638, 2656974, -14329085, 46782396, 12765180, -37497748, 36042292, --15126338, 1202054, 11097122, 13296682, 24004036, 11564736, -6496138, -23584740, -31542776, -11984569, --12652974, -2316061, -9691594, 19672560, -12074227, -21056614, 2321967, 5617281, 4238596, 7452305, --11850889, -11694659, -7019587, -7794292, -24879134, -10676215, -8485782, -17345226, -8276939, 5967320, --7326678, -16283832, -796180, 6072547, 10788421, -2739116, 5061082, 11581379, -704912, -8196945, --524523, -5055714, 6526740, 9182640, -13203803, 11374147, -6856916, -75699, 1708323, -6339372, -12143483, 4469451, -17137456, 10294500, 1563905, -6318971, 12598750, -14621142, 5732708, -2942053, -6140730, -3686693, -4031901, 2135136, -2385318, -1728188, 4412542, -2876018, -9834938, 4268124, --943282, 2702608, -460098, 7910793, -4518843, 10077067, -48168060, 27967216, 1482838, 16822314, -28275918, -46601468, 10806675, 23665270, 5608691, 17605070, -17666812, 19401978, 5917928, -18395882, -467078, -11671037, -33773476, 18435610, 10778220, 30854508, -16989816, -22963042, -7763691, 7080254, --4540854, -38720740, -18820546, 11635603, -2689187, 5558762, -16074452, -5242545, 12994960, -11060615, --5242545, -16644609, -3673808, 5789616, -18044768, 1722282, -39620000, -32942400, 10291279, -34258268, -3132642, -35831300, -24816322, -17385490, 16927540, 33075006, 41113576, -9882183, 18356690, 22017076, -10904385, 9443022, -15743203, 45414448, 46631532, -31768262, 31827856, -25029996, 16086263, 32539746, -31214748, 37734508, 45349484, 31899258, -35837744, -25702694, -128849, 747861, 13743358, -8714489, --6777996, -21700322, -11811697, -32119912, 7164006, 26717380, -10709501, 6449967, 28170154, 13082470, --19063750, 21415244, -1190780, 7494718, -1971927, -3923453, 6353331, -6892349, 9669582, 7940321, --7016903, -8759049, 8362302, -6001143, 423054, 157303, -545998, 2252710, 945430, -11621645, -10861435, -4984310, 5259725, 6076842, -4152697, 6554120, -8106214, -6119792, 5581310, -6688338, --8378408, -3837553, 3502009, -3409667, 2222109, -7765838, 386010, 2756295, 7190849, 10536092, --2408403, 5907191, -6914361, -61740, -1199907, 3149822, 2548526, -696858, -5332739, -7654706, --1719061, 1583232, 59855736, -43806520, -22310744, 23627688, -14063334, 22574348, -17590038, -19587198, -6614787, -46321224, -2102387, 31189516, -7525857, 16045998, -26584774, -6502581, -10495826, 1090385, -33244658, 10089415, 7392713, -5893769, 18253612, 5912023, 45426796, 11216844, 26527328, 1934346, --20720532, -19558744, 26444114, -12800613, 12239046, -202400, -34088620, 24647744, -30368104, 59077276, --43972948, 26917634, 24068996, -25196962, -21205328, -15617575, 21824340, -1597191, 22840100, -217433, -3007014, -40284644, -21654688, 9465034, -19802484, 6644852, -12060805, 11933567, 6769942, 31076772, --18380850, -6260989, -7815230, -15108621, 42066520, 7867307, 4000225, -39049844, -12632036, 21144660, -12473122, 13503914, 36450852, 23395224, 32240708, 37250788, -1030792, 16556025, -15396384, 49520972, -3776350, -8047695, 18066244, -4109210, 37982544, 803696, -7573101, -7714298, 4608500, 26786100, --20157892, 13900662, -6368363, -2062658, 7983808, 5432060, 10452877, -6387153, 6832756, 12582644, --3192235, -4600984, 8508330, -1236951, -1241246, -811749, 2348273, 1517734, 4140349, -8909373, -11946988, -6848326, -3785477, -1771674, 7341173, -10095858, 1123671, -7181186, 10008348, 18115636, --5921150, -4817880, -2296197, 12491912, 6161668, 13043816, -940061, -7330973, 5992016, 6351183, --1744294, 6295349, 4891968, -17339856, 2822867, 20202452, -2569464, -9381819, -90555624, 63006096, --39123392, -27054536, 505732, 13085692, 16056735, 3117073, -14629732, 49086108, 24639154, 7021735, --24630026, 16230145, -987306, 18423800, -23528368, -15963320, 12351252, 36740760, -42074572, 1902134, -13424994, 4642323, -10477573, -6014565, -5443871, 1867237, -2296197, 9648107, 45913736, 3151432, --20999706, 31172872, -7412040, -29780766, -38834556, 36990944, 11855720, -4938139, 13523778, 8684961, -30436822, -41394896, -4600984, -20970714, -6207302, 23929948, -17724256, 9426379, -20410758, 9913858, -63308892, 4968741, -36581312, -40655088, -2747169, 19594178, 18846316, -16209743, 3712462, 31061740, --13225278, -59706488, 33872260, -20497732, -34300684, 15078020, 56489020, -39085276, 28323698, 39699992, -13361643, -34152508, -28898688, -17497696, 13977434, 12493523, -12140799, 35634808, 17035988, -2115272, --1323387, 2245731, -29962766, -11215233, -21301428, 10913512, 9265318, 7158637, 9358734, 7378217, -21533356, -10831908, -5659693, 4283693, -243203, -16786342, 14246943, -556735, 8806830, -4138201, -6551436, -10788958, -3663070, -6480032, 9940702, 2019708, 1780264, 355409, 5850283, 16098611, --6680285, -30559766, 2173790, -15065672, -3292093, 9192841, -13297219, -8385387, 17052094, -16238734, --3970697, 159988, 8000987, -17396766, 886911, 51881056, 17078400, 3438658, -3800509, 8222715, -14602352, -4653597, 6814503, -7860864, -69793, -6213744, 24371792, -27349814, -3067144, 16341814, --37976636, 12285754, -9263171, 2855080, -4440460, -10639708, 6797323, -2946348, -15461345, 41605884, --31753230, -8949101, 29557428, -18953154, -2886755, -5988795, 6513318, 29217052, 2288144, -28536836, -39106216, -21139292, 13945222, 24340116, 10870562, -9120900, 2176475, -21499532, 5268851, -13032005, --10209674, 52329344, -12145631, -20900922, 6842957, -9778030, 12456479, -8168491, 13675713, 33658048, --18502720, 11120207, 25760676, -30289720, 13885092, 16430397, 7556458, 20572894, -23463944, -6224482, -36018668, -24877524, -5452461, 10242423, -10050223, 34304976, -34092912, 5763309, 12319577, -15799574, -11983496, 13089450, -32468342, 11528229, 27710056, -336618, -8313446, -1344325, 17828946, -3718368, --30491046, 24762634, 11771968, -13440563, 5092221, -7423314, 11009075, -4327717, -13645648, 16037945, -900333, -3533148, -11864847, 11134166, 2124935, -15852724, 5657546, 10567767, -2188823, -5210869, -2317135, 9766756, -1450088, -10211822, 10406169, 6777996, 1270237, -548682, 8699456, 1642288, -3050501, -12132746, 15373299, -8501888, 16394964, -10829760, -29272350, -79017200, -124175024, 11244761, -118921200, 9714142, 269223584, 277875808, 138346272, 290901344, 194031056, -40325984, -4212289, -64085208, --233616688, -205110992, -126789584, -238713216, -186827312, -54391464, -117102824, -98085240, 34651260, 58589796, --28486370, 15241765, 52328808, -40500468, -23728620, 73723648, 65488052, 7392176, 73199128, 124958856, -41676752, 90340344, 171029360, 82029040, 43244416, 153177856, 128028680, 16895328, 91884384, 179509776, -35380328, 42089604, 144956224, 62307092, -15951509, 102373232, 96621728, -9345312, 85252416, 110114912, --2163590, -81248432, -38059316, -190421136, -314287456, -279601824, -298102944, -455097952, -408842784, -382656896, --465287232, -452123680, -371037920, -334665984, -301154528, -174696720, -67630704, 58051316, 124479424, 239014400, -356793664, 389540640, 434030592, 566548608, 559120448, 439674720, 481080352, 425180288, 175382848, 191153968, -162276752, -8012799, -27868970, 46160160, -7788923, -74445744, 8225936, 47942036, -48818208, -20209968, -42142756, -24434606, -94445256, -32204202, -26680336, -136161200, -96990024, -27353572, -107255536, -121290952, --10044318, -44222056, -122783992, -60032904, -56684980, -172022560, -163262448, -148197840, -265502000, -286903808, --239680656, -255543568, -275618784, -198210064, -169496048, -147489184, -107604504, -59253368, -28294170, -9793062, -19046570, 90465432, 124541168, 193751344, 317908640, 359896800, 398432832, 465948128, 455149504, 400463840, -340593056, 237868176, 100573640, 22897008, -27807228, -80320184, -93940064, -92386896, -93635656, -95720864, --89842128, -81698328, -87977576, -89980640, -85673320, -91633128, -100242392, -95832528, -92408368, -90067072, --79397304, -60669096, -45656040, -30153354, -9175661, 6481106, 13610214, 18625662, 19735912, 16254841, -14357002, 10757819, 2500208, -4358855, -10530186, -18099530, -20423644, -20269024, -22377854, -21937620, --18388902, -17877264, -15977278, -10517838, -10438918, -11436961, -6577743, -4523138, -6694244, -2720862, --1421634, -3080565, 4247723, 11662984, 14088030, 21960704, 30303142, 34162708, 39686036, 45851996, -46901580, 46369540, 48393008, 48171280, 45485852, 42730092, 38726648, 32052268, 25676926, 21016886, -14746233, 8097624, 1962800, -5575405, -14497125, -21969294, -29196650, -34973920, -40098352, -43163348, --43328168, -41832980, -37799472, -30536680, -23768886, -17652316, -12147241, -7795903, -6109054, -4038880, --2404108, -1554778, -1009317, 251792, 747861, 1286880, 1642288, 2337536, 2318746, 2529199, -2358474, 2331630, 1730335, 1425392, 785442, 409096, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ -1612223, -6466610, -3228742, 1795296, -682900, 381178, 286689, -2597382, -2976949, 1945083, -557809, --2367601, -3052648, -1862405, 2657511, -272194, 3572339, 760746, -4572530, -4698694, -3358128, -1378685, 1145146, 2444373, -382252, 2796561, -2152316, -389768, -4944581, -752693, -937377, -1021665, 1834488, 1864016, 3619584, -1807644, -2455111, 1972464, 1091995, -2371896, -2442226, -116501, 1673427, 813896, 4020626, -1534914, -1300301, 4581120, 1379758, 8586176, 3628711, --2408940, -103079, -5284421, 78383, -6023692, -418222, -2253784, 4140885, 438624, 2212982, -3047279, 1628330, 2921652, 1922535, 413391, -5075578, -563714, -2554969, 3482145, 5063230, --3569655, -2561948, -1536525, -2081985, -2694555, -4355634, -986232, 1275605, -2556579, -2135136, --902480, -3585761, 410706, -740882, -2407329, 743566, 125628, -39192, -1187022, 186831, -221191, 1298691, -370978, 828929, -442382, 592169, -175020, -826781, 215822, 1013612, -172872, -960462, -963146, -126165, 1770600, 383326, -346282, 257698, -524523, -600759, --10133975, -10829223, -862752, -3104188, 414464, -2347737, -640487, 6029597, -1079647, 3242700, --1491427, -2894808, -4006131, 737661, -830002, -4779762, 5510980, 1658394, 376883, 2940979, -2801929, 4547834, 3200288, -299574, -3384434, 3160022, 733903, -4558034, -2016487, -2054605, --1367947, 4078072, -1398012, -6951405, -2356863, -793495, 1450625, -2159832, -4525822, 149250, --442919, 5257577, 777389, -40802, 1918777, -119185, 7090991, -1222455, 651761, -1566589, --2814814, 3758, 3045132, 1377611, 830539, 2878702, -2641405, -4399657, -3148211, -633508, -578747, -1027034, 125628, -3302830, -731218, 1730335, -1053878, 3444564, 1797981, -195421, -639413, -3231426, -2750927, 5344550, 1214939, 2275796, 1551557, -952409, -313533, -4063039, -287226, -2322504, 998043, -794032, 1035087, 1098975, 3144990, -330176, -1097364, 181999, -674847, 417149, 114890, 106837, -945430, -750546, 383863, -347892, -813896, 1271847, --643708, 649614, 974958, -927176, -271120, 727997, -274878, 1309965, -789737, 645856, --628139, -468688, -1643899, 1539746, 6983080, -362925, 3574487, 2136746, 4774930, 5900748, --1351841, 507343, 3607773, 3600793, 2382096, 6752226, 1357210, -2172180, 287763, 5913633, -2068564, 2807835, 5101885, 6892349, 4528506, -1527935, -4701916, 3339874, 2258616, -2689723, --4538707, 276489, -2647847, 1240172, 1745367, -1627793, -2259690, 2313914, 1813013, 4084514, --2702608, -5495948, -2762201, -2361695, -3673271, -1248225, -4196720, 2551748, -5748277, 2505577, -506269, 1362042, -2545305, 5532992, 4214974, -3860639, 4854387, 1848447, -694711, 1623498, --3482145, -1088774, 3330210, 1207423, 1410897, 898722, 3975529, 1633698, 4910222, -2362769, --264677, -281857, 1926830, 2863670, -1093606, 1918240, -2528125, 1334661, 1751273, 1582159, -5395016, 239981, 4036733, 4522601, 2556043, -4036196, -740882, -590021, -1022739, 411780, -2316061, -892279, 119185, -118112, 309775, 877247, -614180, 1023813, 1618129, -1037772, --529355, 1547262, 108985, 75699, -16643, -784368, 432718, -346282, 184684, 1220308, -1947768, 152471, -189515, 1023813, 796716, 374736, 506806, 441845, 533650, 10201, --187368, 920734, 1097364, -859530, 615254, -251792, 892279, 1095754, 162135, 274341, -1155346, 66035, 23085, -146566, 545461, 19514184, 16643, 17294760, 1235877, 11005317, --2477123, -1729261, 2830384, -7968238, 8720931, -4900558, 5803575, 4524211, -3387119, 2726767, --380105, 466004, -1640678, 2602213, 3361886, 4479114, 7020124, 1880122, 2144799, -147103, -8281234, -9541807, 95563, -610959, 2181844, 4232691, -5227512, 2073396, 2158221, 1306207, -3229816, 1945620, -4066260, 1991791, 7397545, -1293859, 2167348, -1155346, -1311576, -245887, --5551245, 8457327, -268972, 921807, 6101538, -769873, 342524, 7846369, -11497091, 3219078, --352187, 3497177, 9052717, 2839510, 2083059, 3279745, -1135482, -2478733, -1878511, 2335389, -700617, 5021354, -1924145, 4140349, 1753957, -1303523, 695248, -3167539, -2243047, 505196, --1088774, -4405563, -2983929, -4510790, 2574833, 4112968, -1227287, 1311039, -1086627, -2982855, --264141, 1734630, 1552631, -5404143, -360240, 562641, -972810, 360240, -1257352, 161061, --1341640, -2580739, -183610, -1693291, -1533840, -2127620, -37044, -2080912, -790811, -2018635, --1700807, -24159, -877247, -1056562, -249108, 317291, 867583, -1066226, -112743, 385473, --7794292, -9462887, -3825742, -1376537, -3612604, 7668127, 3205119, -6025839, 6728603, -896038, --4990215, 1529545, 2904472, -2698313, -4563403, -4014721, -8633958, -4281009, 3663607, -5389647, --8765491, 2514167, 3485366, 756988, -3251827, 6591164, 765578, 6098317, -420370, -1335735, -3411278, 5781026, -8182450, -3824132, 2180233, -1771137, 1957431, -5270999, -425202, 1490354, -1893007, -4490925, -8305930, -2275259, 2378875, -1346472, -1076426, 555661, 2641405, -765041, -1452773, -2733747, 4766340, -6243272, -4737886, -1593433, -4641249, -1329829, -1274532, 1891396, --3410741, 2610266, 5182952, -397821, 1198833, 1457605, 2475512, 5140539, -1956358, -922881, --985695, -2056753, 5275294, -2099702, -9240622, -5834713, -3913789, 8914205, 137976, 5137318, -2317672, 824097, 1359894, -558883, -209917, 4320200, -1428077, -917512, 1372779, -692564, -679142, -1855963, -1165010, 1032403, -263067, 1130650, -279173, 690416, 1597728, 1203665, -1494649, 65498, 1041530, -175020, 1533840, 1738388, 2735357, 1767379, 2172717, 571768, -1452773, 1302449, 904091, 1353452, 1804960, -754841, 148713, -292058, -755914, 803696, -1073205, -2150705, -8431558, -19400368, -1874753, 1404991, 147640, -6252936, -2855080, -7105487, --1908039, -8392366, -9736691, -7508140, -1817308, -4958003, -10966662, -6773701, 2191507, 3419868, --3078955, 6604049, 3561602, -2383170, 8019778, 1774358, 598611, 1341104, -11142219, -368293, -1771674, 4206384, -3553549, -3047279, 6521908, 12868796, -9678172, 3487514, -2902324, -464930, --8541079, -716186, -176094, -4288525, -5556614, -3950833, -4740570, -2455648, 2685965, 9446781, --4487704, 3555696, 6280853, 5784247, -2034741, 671089, -2153389, -1813013, -8779450, -4285304, -4830765, -3119220, 974421, -2978560, 2386391, 1328756, -1056025, -319438, -4152697, -3335579, -661425, -1200980, 1682554, -10275709, -10978473, -1167157, -1694902, -4670240, -130997, 3449933, --5453535, -4116189, -4667556, -7915625, 5485747, -578210, -1296543, 2142652, -421444, 1920387, -3578245, 1272384, 1937030, 1162862, 2596308, -823560, 370441, 426276, 501437, 883153, --825707, -689342, 32212, 819802, 928787, -687732, 738734, -993748, -1983201, 990527, -608812, -758599, 2304787, 1076963, 35970, 912681, -1600949, -1619203, -547071, -872952, --794569, -2159295, -448824, -1709397, -12221329, -2243047, -14688251, -3126736, -10445360, -1095217, -1808181, 2760053, 11057393, -6847789, 2369211, 3156264, -6205691, -2606508, 8870718, 1089848, --2763275, 1265405, -7548405, 6862821, -9634685, -3004867, 4104378, 2770254, -1121523, 1756105, --2009508, 3245385, -4187593, -7004555, 354335, 3585761, 2694018, -5575942, 1450625, 6547678, --6729677, -8230231, 6533182, -5571110, 4219269, -3973382, 2295660, -38118, -6066642, -7591892, --4888210, 2233920, -441308, 3014530, -4166655, -3805341, -9990631, 5268315, -7198902, -3101503, -3704946, 8876624, -1268089, -1687385, -13036836, -10038949, -3521873, -3496640, 4719096, -1247688, --7693360, -1085016, 265214, -4078608, -1167694, -8904004, 5883032, 2464238, 7453916, 9392020, -4750234, 504122, 3902515, 8390755, -821949, -1782411, -699543, -2405182, -8351564, 580357, -473520, 1892470, 4269198, -1668595, 839666, 117038, -3366181, -1629403, 2872260, 3011846, -2602213, -1985886, 691490, 1258425, 910533, 1131187, 1070521, 515396, 2154463, 2391223, -1414118, -343061, 922344, -271120, 773094, 1757715, 450972, 778463, -91268, -449361, --643708, 83752, -1557463, -545998, 1469953, 7139310, 3801583, 20806970, 10125385, 13468481, --4136054, -548145, -181999, -20591146, 1123134, 8853001, -4029216, -1614908, 752156, 12947716, --2150168, 7495255, -1490891, 7179038, 4000762, 8870718, 12538083, 1594507, 8389145, -2593087, -7268696, -987306, 13418552, 7102802, -170188, 7597261, 6196027, -2258079, 5919002, 3522410, -5119601, -4006131, -3150359, -10806675, -601295, 7655243, 1534914, 972273, -2451890, -4042101, --3162170, -3563212, 18873696, -12097312, 4861366, 5715528, 3307125, 1627793, -7153268, -9600326, --2388539, -1427540, -376883, -16634945, -8184060, -8548596, 478889, -387621, 5018133, -540092, -4466766, 5904507, 10728828, 1964411, -2671470, 3592740, -6634651, 1843078, -4846334, 1801739, -4198331, 2340757, 6864432, -4575751, -5134634, 24427090, 3420942, 4440460, 3167002, 8296803, --5788542, -3024731, 5295158, -597000, -64961, 969052, 1795296, 4795331, -2297808, -356482, -981937, 2764348, 708133, -2516314, 4715337, 180389, -1015760, 114354, -457414, -2474438, --2245731, -1081258, -2506114, 1074, -933619, 1135482, 3402688, -300648, -245350, -3650185, --689342, 1814087, -323196, 224949, 418222, 2885144, -1410897, -426276, 1009317, 1090922, --3107946, -2690260, 32094144, 3280281, 4908074, 3449396, -1850594, -13100724, 8880382, 9079024, --5037460, 3891240, 4285841, -7915625, -958315, 7453379, 4494147, -13829258, 3604015, -3852049, --6885370, -266825, 4136591, 985695, -15569, -355945, 6023692, -1945083, 3444027, -10785737, -4394826, -1192390, 4314832, 2324114, -1842004, 7524783, -10285910, -4567161, -10159208, 8839043, -4328254, 14477261, 7303055, -135828, 3225521, -11904039, -9127, 3360275, 3856344, 3507378, -874026, 1991791, -3044595, 3275986, 10545218, 14001057, 6175626, -6506339, -3462818, -1540283, --2714419, 5155572, 7190312, -5030481, 4278325, 7784092, 2478196, -10951093, -21386790, -10675678, -4358318, 9298604, -3992172, 2732136, -765041, -2054068, -32212, 9709310, 1835562, -8158291, -13287555, 5920613, -15329812, 640487, -1817845, -5012764, -1695975, -2403034, 12885, 5260261, -2260764, -4207458, -2183454, 3089155, 5741835, -2609193, 4369593, 1066763, -3559991, -980863, -579284, 86973, -661962, 253940, -1766842, -1347009, 1275068, 308164, -1573032, -1744831, -102542, -1139777, -2616709, 1578937, -914828, -1413581, 738734, 2682207, -2935610, -4679367, --41339, -718870, -6808060, -1216013, 1686312, -42413, -4116726, -526670, -1529008, 1280437, -954557, 2109366, 1677722, -678605, -748398, -1305133, -3361886, -19872814, 6162741, 9026948, --10209674, 6508486, 11719892, -28165858, 6300717, 927176, 6397354, -10670309, 16034187, -22277996, -78920, -1837709, -1531156, -2517925, -6138582, -8581882, -1095754, 7632157, 1077500, -38118, --3932580, 5297306, -600759, -2973728, 4454418, 9483288, -6191196, 6770479, -1012002, 4013110, -2402497, 6346351, 10379862, -2584497, 2926483, -13345537, -6297496, -2947958, -4697084, -12174622, -1548873, -4584341, -7499013, 11223286, -10475962, -3815005, -4800700, -6039261, 8094403, -9120363, -5243618, -3336116, 8310225, -4468914, 9075266, -11853036, -3041374, 1285806, 10934987, -18999862, --6821482, 492848, 255014, -3541738, 7737921, -9944460, -18856518, 3954591, -16528645, 8318278, --5753109, -131533, -17293686, -7043747, 19133006, 10509785, -13996762, -12076911, -9851581, 412317, -5949604, -2658048, -6152004, 12115566, 4599910, -2338610, -2473901, -4793184, -761283, 4647155, --4314832, 5009543, -420907, -3764539, 841277, -2918430, 2080912, 4205847, -2432562, 1768453, -3382287, 2101850, -215822, 4917201, -4672388, 4633196, -1196148, 4055523, -5463736, -3085934, -994285, 202937, 5982353, 1796907, 3655554, -2134599, -3193308, 1764158, -6287832, -790811, --1208496, 2523830, -1194538, -1457605, -1956895, -14485851, -6203007, 18226768, 779000, -15046881, -14167486, -6634114, 950798, -15688442, 2420751, 6213207, -13826573, -3382824, -12355547, -90194, -795643, -4169876, -3425237, 12069932, 1865090, -8178155, 2058900, -17520246, 10537702, 16695075, --5390721, 6972880, 11851425, -882616, -2410014, 1459752, 1447941, 6941204, 1194001, 1607928, -3652333, -9789304, -694711, -11253351, -11493869, -4713190, 4847408, 6839199, -348429, -13537737, -2682207, 3561065, 6678674, 14492830, -14835891, 21745420, -18009334, 806380, -3616363, -3111704, --8700530, -16712255, -22548578, -8738648, -2567317, 5761699, -1695438, 950798, 3337727, -149787, -15909633, 7533910, -16286516, -2528125, -314606, 10421738, -11250130, 769873, -22692460, 4273493, -17762374, -15841450, -6208375, 2266669, -154082, 4459250, 24883430, 394063, -3261491, 1316944, -12678207, -8572218, 3409130, 4652524, -1860258, -894427, -148713, -308164, 5653251, -1816771, --1276142, -4851166, 8223789, -1750199, 2433099, 854699, 1461900, 2079301, 5983427, -4123706, --1051730, 6355478, -4574140, -6436009, 5350456, 291521, 2618320, 3631395, 2040646, 6576132, --5076115, 3080029, 3626563, -2229088, 9264244, 3213173, 5669894, 2112587, -5568425, -1998234, --940598, -932008, -985158, 2724083, -9254044, -18939732, 22632868, 9592809, -11002632, 14606647, -14726906, 20782274, -7618735, -7235946, 15269146, -2277943, -2940979, 5260798, 6829535, 2662880, -3304977, -20753282, -2127083, 32749, 249108, 1117765, -2265059, 8763344, 17120276, 1705102, -1246077, -308164, 898185, 15681462, 4254702, -1118302, -3341485, 4009352, 3560528, -2469606, -1891396, -8961986, -1778653, 13647259, -13452911, -6584185, -11587822, 15253576, -13880261, 7009924, --5625334, 4493610, -2938831, 3627100, -11128797, 2582349, 17052630, -11143293, 989990, -29573534, --1211181, -10438381, 906775, -27597850, -1114544, -1341640, -8410083, -5913633, 22652194, -24172612, -4146791, -6518150, -8915278, 6532109, -8074002, -18873160, -13142600, 1861332, 1112397, 3930432, --9248138, -12694313, 7363722, 643708, 1534377, 8509404, -13991393, 10610180, -10144176, -4781909, --4291746, 2551748, 487479, 3057480, -1701344, -3561602, 1003949, -2007360, 3096135, 6626598, -3960497, 2466385, 1985886, 1826435, 1869921, -665183, 7286412, 1400696, -1249836, 5388574, -5613523, 2098629, -2925947, -261456, -4323959, 7183870, 2655901, 5787469, -2688113, 5939940, -5373004, 7762080, 3913252, -2129767, -3907883, 6535330, 1437740, 5661841, 1393180, 1566053, -1596117, 1727114, 19176492, 6420976, -2261837, 3851512, -9249212, -10238128, -7961796, 18200998, --16253767, -20737712, 10049150, -19313394, 7305740, 498753, 5428839, -8768176, -1830730, -10621991, --4179540, -8256538, 4082903, 9239548, 6762426, -15651398, 18126910, 1924682, 6471442, 1386201, -8835285, -2106145, 8492761, 1779190, -3495030, 5032628, 2128693, 6750615, 5021891, -11955041, -4889821, -3693135, 3488587, -2650532, -4170950, -3888556, -8022462, 7374459, 8369818, 8284992, --1424855, 15384573, 18891950, 7205345, 2621004, 8208220, 19568408, 9285719, 21328270, 13302587, -15937013, -17258252, -16917876, 3168612, -3315715, -4904316, 1476932, -8857833, 7240241, 4992363, -3475166, 15797427, -3653407, -10755135, -8609262, -8042863, 2002529, -4014184, -34492344, -15400142, --13354127, -5242545, -6882148, -3986804, -5140539, -10183367, 467078, -6267968, -5556614, 1931125, --5579163, -2152316, -8633421, 142808, 543850, -1753420, -12350715, 4756677, 44023, 216896, --9278740, 2448668, 3393024, 3227668, 1086090, 10476499, -6958921, -3059627, 2270964, 805843, --743566, 4089346, -4925791, -4606353, -868120, 7310571, -759136, 5209796, 6406481, -1764695, --8003135, -7583839, -856846, 7631083, 625992, -6155762, 813359, -1673964, -3918621, -3335579, --1256815, 40265, -6014565, -5513665, 5204427, 15183246, 10672994, -33934000, -24689082, -7968775, --109522, 10900627, -4420058, -1003949, -26631482, 3589519, -13852343, 9830643, -1751273, 13093745, --11207717, -3046743, -13339095, 2143189, 11223823, -5486284, 3402688, -7949985, 756988, -18326088, --4856535, -1074279, 1467268, 13240847, 17647484, 410706, -15903727, -11494406, -5040144, 1453846, --4098473, 4918275, -18311594, -5920076, -2394981, -4981089, -10235444, -2619930, -4651987, 12378633, -18357228, 12118250, 4613869, 7333657, 7757248, -8971113, 30573724, 18295486, -23917600, -20952462, -22481470, -17770964, -10063645, 3282966, 2566780, -17251810, 16640314, 915365, -51509544, 13649943, -32451700, -22568442, 22378928, 29700236, -9886478, -3249143, 16003048, -18796924, -12301860, 6069863, --10111964, -11811160, 13569412, -22769232, -6847789, 2757369, 547608, 1137093, -2158221, 8141648, --5904507, 3396246, 1234266, -6156836, 11984032, 5968394, -383863, -7784628, 9243843, -5949067, -7133404, -6322729, 8675834, 751619, 1798518, 8638253, -6810208, -7794292, 2305324, -7202124, --4345433, -483721, 752156, -4845260, -8462159, 3860102, -19864224, -162672, 9142912, -7486665, -5382668, -2401424, 2700998, -8473434, 193810, 4405026, -3901441, 2834142, 17825724, -8088497, --7478075, 17395154, -12688944, -2272038, 14743549, -10485089, -6685117, 11100343, 6804839, 7299834, --1808181, -10803990, -8680666, 10267119, -8159364, -710817, 3040300, -15282567, 9983651, 8198556, --6197638, -4968741, -11953968, 377420, -7385197, 10405095, -16781510, 1343251, 6473053, -826781, --7960185, -17348446, -3879966, -7502771, -1649804, -13399761, 18434536, -17868674, 3198677, -6438693, -4683125, -25332254, 26272852, 5082020, 2690260, -10383083, 6049999, 4378183, 1226213, 2496987, --4595615, -19945828, -3388192, -8563091, -12773233, -17110612, -6123550, -4213900, -17022030, -6418829, --694711, 11978127, 5564667, -15358266, -13437879, 8502962, -3441880, -19525458, -8371965, 5000416, -16325171, 16270947, 16496433, 26306138, -4894115, -17540110, -16801912, -889595, 11615739, 20544440, -9290551, 4570919, -20612084, 11888469, 4500052, 20061256, 13943074, 9209484, 6957847, 222801, -1921998, 11909944, -2613488, 1046361, 2234994, 3609920, 4186519, 3997004, 5819144, 14272176, -4589710, 1264868, 5007395, -97711, 4686346, 1540820, 1015760, 8963060, -10391673, -7275138, --2606508, 4189741, -5160403, 3728569, -2138894, 11230803, 614717, 2087891, -5522791, -6864432, -834297, 6660958, -5820755, -414464, 7640747, -5847598, -128312, 3757560, -10388989, 13245142, -7205345, -2027761, 3352222, -200253, 113280, -2824478, 7601555, -1976222, 12601971, 32409824, --28541668, -1304060, -11122355, -15807627, -8764955, 14567455, -7818451, -9408126, 8109435, 18887656, -12588012, -15023796, 9783936, -15744813, 11602854, 136902, -1341640, -7874823, -11009612, -9669045, -2294050, 1594507, -17639430, 10924249, 2238752, -2123325, -6486475, -8138426, 13123273, -17972290, --491237, 18505404, 22681722, -20543366, -1018981, -4489852, -12663711, -17294760, 18671296, 3668976, -11975979, -4112968, 1723356, -2101313, 11912629, -5043902, 912681, -14912663, 20921322, 16695075, --24896852, -31287226, -6256694, -153008, -9868761, 510027, -7274601, 1832340, -15371151, 16030965, --19838454, -18110266, -6327561, 2379949, 14082661, -7762080, 20298016, 1596654, -6958921, -7384660, --5063767, -13160317, 12434467, 8617852, -3131568, 7207492, 6255620, -10415833, -9708774, -8906688, -15737297, 3596498, -10970957, 961536, 4549981, 4789426, -16456167, 8103530, 6783364, 2764885, --32749, -5024575, 2347737, -5461051, -14651207, 2726231, -1845762, -3018288, -1617055, 1126355, --4373888, -5974837, -208306, -2375654, 7476465, -4263829, -1966558, 3943854, -1897839, -7283728, -5902359, -7261716, -2200634, -12410308, 6522982, 977642, -1672890, 1837172, -5377836, 10452340, --644245, 1531156, 12181064, 8410620, -3339874, -4253092, 5868536, 2983929, -4150549, 2053531, --3813394, -3813931, -732829, 2443837, -2261300, -834834, -44958108, 66379256, -45756436, -11115912, -11451993, 36049272, 28450938, -10239202, -12060805, 2322504, 1173600, 18792092, 6289443, -23874650, -6811282, -4838818, -9018358, 2792803, 9458592, 264677, -18697066, -15662672, 8015483, 7335268, -10771241, -5773510, 13448079, 3631932, 15855946, -1318018, -6065031, 12471511, -1953673, -12558484, -1763084, 15391015, -1136019, -16779364, 8019778, 20331838, -18895708, 7624641, -20262046, 8182450, --25473988, -15961172, 27009438, 26002806, 11554536, 33753076, -6911676, 40223980, 14325863, 15724412, -20919712, -35763120, 29955250, 10746545, 11822971, 14401025, 2868501, -17287780, 2381023, 33985540, -37830608, -121870, -43876848, 21655762, 687195, 9400610, -1989107, 1352378, -9938017, -32384590, -6119255, -5119601, 6885370, -5783174, 15715285, -18076444, -20195474, -13566728, 2386391, -5680631, --9346386, 10848014, 3687230, -13827110, -15415174, -11531450, -9262634, -1301375, -2798171, 8070244, --659278, -11830487, 9128416, 2150168, -3413962, 780073, 4293357, -5786932, -3382287, 6241661, --11010686, -4276177, -7645579, 6447283, 7425462, -8680129, 2312840, -23663122, 165893, 1394791, -1021129, -4448513, -4752382, -10563472, -8354785, 5684389, 3288871, 5458367, 8143795, -7747048, -463856, 3445638, 1960653, -7590281, -107374, 2158221, -412854, -6195491, -1049583, -1458141, -43478492, -1488206, -51951924, -26083336, -30622580, -11529840, 176094, 17238924, -44283260, -9762998, -6870337, -20462834, -23801636, -21463026, -23757074, -3673808, 26074210, 13571023, -10429254, 12708271, -5089000, -11830487, 13431973, -14979772, -3404299, 6457484, 8876624, -29897268, 15049565, -14632417, -8562017, -5762236, -24175834, 6852084, 7461432, 3877819, 3933116, -9878425, -34291556, 1533303, -7043747, 7605850, 314069, 4415764, -14250165, -27917, -1240709, 31250718, -4815195, -51019916, --23142894, -5416491, -42530376, 9819906, -13013751, -10705743, -20513838, -9030169, -30625264, -29848948, --36822364, -3520263, 38703560, 5462662, -24538222, 11430519, 314069, -2577517, -13812615, -19236084, -8110509, 16089484, 12120398, 6737193, -7363185, -31237298, -22405234, -31448288, 4626217, 3589519, --1122597, 11360188, -16655346, -19997904, -2852932, -7352447, -20572356, 4575214, 11827803, 1717450, -4325032, 19841676, -3564823, -4037806, -3383897, 1353452, -7092065, -3886946, 8834211, 13552769, -14770929, 9987410, -4080219, 700617, 2314987, -6136972, 13686450, -5573794, 19969988, -6993281, -9386114, -9498857, -2633352, 20282446, 6743099, 2796561, -70330, -7915625, 8012262, 1753957, --9828496, 4480188, -8399882, -10835666, 3183108, 3261491, -6653441, -6504191, 6966974, 386547, -9776956, 2112050, 6685654, -3590056, 2992519, 2758980, 1052267, 28945396, -3593814, 23230404, -29528438, -24960202, -31704912, -33000382, 8519068, 11777337, -45669460, -26124138, 713501, 1443646, -13498008, -52762600, 5452461, 12355547, 36477156, -42252276, 4806606, 7064148, -5497558, 23477902, --13675176, 41055056, -2478196, 3707094, 12119324, 15998216, -15714748, -32990180, 19033148, 23435490, -5139465, 29625074, 5483063, -3685619, -11307575, -24930674, 38428684, -17249126, 36402532, 14542222, --2981244, 10904922, -15778099, 19877646, 19324668, -13632763, 14297409, 7490423, -38726108, 28065464, -28230284, -3553012, -19893214, 3759707, -1240172, 1294933, -7213398, 52978960, -1282048, -30678952, --17511118, 6046777, -44637596, -58034136, 7648263, 72688024, 15753403, -5093831, -46707232, -11740293, --8016020, 49543520, -34178812, -21665962, -81878720, -11784317, -15246597, -19189914, -15614890, 29994978, -31680752, -31862214, -12701292, 10537165, 4115116, -5814312, 12823162, -5594732, -10388452, -10019622, -11004780, 4529580, 3359201, -4054449, 10780905, -11458436, -4211216, 9788230, 4202089, -652835, --760209, -8557722, 3829500, -5683316, 20831128, -5798206, -11809013, -9440875, -18402862, -6157910, -13642964, 15742666, 42696808, 16344498, -5192616, -32828046, -45671072, -21268678, 370978, 18526342, -14706505, -12135430, -18372796, -9210557, -7712688, 11208791, 19205484, 4272956, 787053, -2496987, --7282654, -5946382, -5589900, -1055488, -2608656, -2786897, 2295660, -4957466, 1655710, 656056, -1206886, -3776350, -786516, -2832531, -2594697, -3693135, 2165737, -2356863, 3976066, -72847480, -21467320, 34605624, -46181100, -4420595, 26592290, -11473468, -20524574, 18532784, -19784230, -11276437, -2001455, -15416785, 25052008, -8472897, -10763188, -4467840, 13462038, 44313860, -6455336, -20653960, --22404696, 8089034, 21743808, 12562779, -19740744, -3332895, 24686936, 511101, -17842368, 5937793, --15870441, 40999220, -18116172, -44704168, 15876883, -7628399, 21758304, -29985314, -28885802, 29368450, --1887101, -38337416, -19827716, -36632312, 47774532, 22690312, 13242458, -49919868, 9345849, 20463372, --34442416, 1966558, -24604258, -19112068, 20002200, -16998944, 22881438, -14051522, -29857538, -6919729, --7027640, -4553739, 10925860, 3582540, -18469970, 58872728, -6772090, 26100516, 27261768, 16291348, --7556995, 6190122, -12910135, 33123324, 8623757, -8361228, 4417374, 14079440, 23446764, -5710159, --49555868, -3381750, 16030965, -4955319, 26846230, -11165304, 9546639, -3992172, 1118302, 10909754, -3062312, 6657736, 13898514, 8023536, 16066399, -3716221, 5502390, 8317204, 1503239, -16024523, -19671488, -7948374, 529355, 3026341, -9214852, 5005248, 1402844, -2511482, 13804025, -5997385, -1394791, 19404126, 205622, 10832981, -9054328, -6047314, 10851772, -2401424, -6793028, -10078141, -932008, 1428614, 2826625, -3336653, 2882460, 6082748, -1782411, 4168803, 5487895, -2671470, -6606197, 1219771, -6497212, 4431870, 2718178, 1354525, -351114, 52712672, 10596221, 22933514, --2121177, 5672041, 8130373, -18933826, 8221641, 18505404, -15569, -21816286, -11954505, -16144782, --6878390, -21869436, -21465710, 2815888, -17151416, 25031606, 7857643, -5648419, -18215494, -8495982, --6127308, 13546864, -4337917, -20687784, -17398912, 4495220, 4272956, 12074764, 4329327, -4466229, -5344013, -18032958, -55507084, 2434173, 66901632, -1849520, -48987324, -7813620, 31736050, 9007083, -5010616, -793495, -21393768, -26300770, -15995532, 6115497, -1823751, -24325084, 8820252, -49027052, --8988830, 45591616, 13193603, 58618252, -7893613, -23008140, -7167227, -5069135, 15479599, 3490198, --629750, -31842888, -16249472, -15190762, -2345052, 37121940, -5171141, -8990440, 12001212, 15074261, -2214593, -19654308, -30964030, -2165201, 12284680, -1312113, -15462419, -3859565, 8418136, -6426345, --5932424, -10030359, 18400176, 19659676, -10042170, -5128728, -9241696, 8013872, 11392401, -5333813, -1494112, -2028298, -1792075, -3641596, -14894947, 1641214, 8225399, -8904541, 2024003, -2132988, -485868, -7977365, -2867965, -3354370, -5417565, -6056978, -6404870, -1766842, 26103738, -13047574, --23085, -5141613, 1265942, 14535780, -9999221, -1386201, -2991445, 4575214, -860067, 4159139, --7723425, -23335632, -77349680, -119533232, 28228672, 106943072, 33788508, 261635984, 246497840, 109606488, -254168112, 107329088, -46032924, -778463, -76384920, -209089744, -114103856, -109488384, -214237264, -156017904, --89550608, -134979552, -90709176, 19754166, -7822746, -43185360, 51223928, 47837344, -150324, 51286740, -139244992, 58450748, 26275000, 133257264, 119276072, 40073120, 142080736, 173792096, -214212, 102969696, -175247008, 66381404, 70100848, 178624464, 106760536, -14097156, 139450064, 97872640, -37932616, 54760832, -110939544, -49594524, -87913152, -19827180, -185880272, -312124928, -302142912, -335987232, -537495296, -465254464, --383784864, -497411424, -426440864, -274030720, -324816576, -248250720, -68639480, -22129282, 105247640, 195800576, -322770016, 432374880, 471657728, 550104256, 597494912, 558134784, 528687936, 560846464, 426725408, 338336576, -401393696, 218952608, 35086124, 50626928, -80950472, -296396224, -248829472, -184104848, -265709760, -271743104, --169476192, -192939056, -243306672, -178327584, -162139840, -228902960, -205345072, -133903120, -170331424, -182976352, --59811716, -57549340, -107942192, -11280195, 41246720, -30848066, 5945846, 40933724, -58194660, -75332656, --71488656, -156803888, -173153216, -121218472, -91039888, -66340064, 22643068, 106434656, 144649136, 204889264, -262537392, 274130592, 290806336, 321578176, 305036096, 277293280, 288833856, 261546864, 194545920, 133432824, -35226248, -51449412, -132254928, -192621232, -215822640, -227415840, -202896944, -155451504, -136138656, -114747032, --93809064, -80983216, -71295384, -53454628, -41395968, -38137700, -37186900, -25935160, -19567872, -15622407, --5378910, 8182450, 20080582, 35090956, 36464808, 37493992, 43423192, 42872364, 35161288, 37822556, -31475130, 16682190, 1272384, -12828530, -27831924, -33510408, -40012452, -43001748, -40049496, -37157372, --36057324, -25798258, -20160040, -12216498, 435939, 10737418, 15800111, 24293408, 29350196, 33176474, -37527812, 39187820, 40920836, 42649024, 42935716, 42518564, 39662412, 39084204, 36958192, 34553548, -31209380, 29785598, 24390582, 18534394, 11311870, 5504538, -2037425, -8892193, -15265924, -22412750, --31423054, -37441916, -43879532, -47260748, -50237696, -51478940, -51516524, -49303004, -47184512, -42711304, --38785164, -32626182, -25567940, -15730855, -8205535, 2355253, 10057740, 17258252, 23497766, 29421600, -30994632, 33355252, 32648730, 30091078, 25649008, 22355304, 16324097, 11494406, 7216619, 4673462, -1080721, 195421, -782221, -639950, -1612760, -823023, -1232119, -561567, -988916, 27917, --376347, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --512175, -11112691, -5488432, 399969, -3257733, -293668, 4756677, 2197413, 3000035, -2619393, 3706557, --3826816, 4156455, 2018098, 5000953, 2055679, -899796, -5635534, 6063420, 4114042, 1569811, -672162, 602369, -2414845, -2681133, 3077881, 1950989, 1999307, 3032247, -3072512, -190589, -2771328, 3365107, -467078, -2437394, -4746476, 59056, 847719, -2807835, 1034013, 799938, --4280472, -2256469, -354872, 2199560, 17180, -2029909, 3936338, 780073, -1371705, -2896956, --682900, 387621, -5576478, 2600066, 3448322, -1890859, 4424353, 3683471, -604517, 3053185, -1756642, 5931887, 1831804, 1139777, -940598, 2256469, -4765266, 646393, 2252174, -2314451, -2582349, 3174518, 3428458, 2186138, 4512937, -938987, -2771328, -1395328, -1182727, 634581, --1066226, -3488050, 1653026, -1628330, -1869921, -2103460, 798327, 30602, -1097901, -820876, -1389959, 137439, -174483, -344671, -150861, 694174, 930934, -119722, -65498, -766115, -214748, -1404454, 129386, 994822, 1266479, -875100, -971200, 254477, 824634, -809064, --10548977, -7434589, -1020592, -4799089, -4045322, 1973538, -5994164, -5844377, 1704565, -2666101, --2330020, 2384781, -1870995, -4150549, -418222, -345208, -1133335, -1917166, -1082332, -4755603, --265214, -3439195, -2434710, -163746, 4249870, -972273, 6128382, -3205656, 3693135, 4176319, --4701379, 1614371, -1171452, 882079, -3321620, 1624571, 2190433, 3213709, -1643899, -4003447, --1357747, -2210835, 1293859, 1506997, -4790499, -639413, -3282966, -2689723, 925565, -3976603, --6293738, -1216013, 6220724, 1339493, 2189897, 306553, 1444720, 817118, 2301029, 2420751, -6972880, 491237, -3073049, -4020626, -840740, -1930051, -497679, -8100309, 1688996, -602369, -2592013, -1107028, 730681, -1953673, -931471, 7873212, 1598265, 7217156, -2445984, -1347546, -565862, 2034204, 714575, 2430415, -2398739, 2641405, -2798708, -1767379, 1450088, 1016297, --96100, 102005, 67646, -632971, 206158, -1096290, -91805, -392453, -169114, 446140, -554588, -616865, -1017370, -657667, 71941, 17717, 178241, 317291, -421444, -489089, --430034, 89121, -163746, 568546, 8607114, 9916006, 7635915, 5663452, 8026757, 3251827, -3489661, -734439, 2281702, 8442295, 903554, 2573222, -3136400, -2095407, 6474127, -4345433, --7916162, 2392834, -6613713, 5706401, 1348083, 6847789, -2180233, -434329, -1687922, 2247342, -2745021, -100932, -6738267, -1394791, 5775658, -3848291, 2604898, 1522566, -1300301, -1666447, -6417755, 4832375, 11194295, 4473746, 930934, 2674154, -944893, 673236, 3526705, 2094870, -9541270, -4093104, -2721399, 656593, 2457795, -1510218, 4422743, -4150549, 860067, -281320, --3179887, 979789, 958315, -4320200, -5832029, -3619584, 4618701, 2227478, 19864, -386010, -3485903, 252329, 1155883, 6033356, 2982855, -1453310, -962610, 5361730, -4660577, 604517, --4201552, -1903744, -5430450, 1466195, -1130650, -3233037, -2109366, 3136400, 1942399, 549219, -1850594, -3030100, -506806, -272194, 2335925, 53150, 166430, 417149, 697395, 1703491, -1927904, 1505923, 117575, 797790, 1744831, 83215, -1586990, 1453310, -805306, -329102, -357019, -282931, 1282048, 1150514, 584116, -18254, -445603, -477815, 550830, 718333, -267899, 1104344, -2266669, -1465121, 1135482, -96637, -893353, -126165, 1211718, 95026, --835908, -1069447, 714038, -1055488, 90194, 18685256, -325881, 9153112, -1654099, -1434519, -9827959, -9615358, -3322157, -750009, 4859756, 3370476, -2049773, 1872606, 918049, -8706436, -2212982, 4661114, 4148402, -9757092, -3420942, 1104344, -6987375, -1921461, 547608, 319438, -964757, -1072131, 4471598, -3148748, 3558917, 7322383, 7323993, -2119566, -4179540, -744640, -8249559, -466541, -428960, 66572, 824097, -4272956, 745714, 3471407, 533650, 828392, -3331821, -2191507, 2247879, 1304060, -891743, 5797669, 583579, 4611185, 923955, -1535451, -2024003, 3085397, 2669322, -126165, -4513474, -4114042, -5437966, -2420751, -177704, 13959, --623307, 4064650, 3501472, -2628520, -5332739, 180926, 2791192, 3350075, -3256659, -599685, -3173444, -273267, -422517, 4209068, 1981054, 2000381, -1551020, -1340030, -235686, 1821066, -2712809, 71941, 2057289, 746251, 183610, 405338, 693637, 2522220, 1899986, 2837900, --1419487, 1344325, 204548, 367757, -398358, 306016, 432181, 136365, 379568, -451508, -1363115, 1336809, -1219234, 337692, 765578, 844498, -392990, 2627446, 1023813, -379031, --4952098, -14006962, -3583613, -4789963, 946503, 2252174, -2333778, -2864206, -26261040, 453119, -8477729, -6213207, -9817221, 7290707, -11116449, -1765232, -4966593, -5937793, -3627100, -3760781, -403727, 4385162, -814433, 2406792, -2844342, 3284576, -2585034, -4072166, 1749662, -1581085, --6296422, -8119636, 3828963, 294742, 3778498, 1072668, 8467528, 1109712, 2926483, -4164508, --7078106, -2138357, -3524021, 6963216, -3313031, 92879, 1810866, -3593814, 9841918, 6444062, -116501, -7950522, -9996000, -3476239, 3291556, -9087614, -253403, -4468377, -8590471, 702764, --13435731, -3058017, -1458141, -5078799, 8981313, -649614, -1453310, -239981, 5611912, 7112466, -2130304, -7306276, -2369748, -1918777, 3848291, 1727651, 2192581, -4145180, -5206037, 3960497, -2721399, 926639, 1322313, -345208, 2273648, 552440, 3446175, 899259, 770410, -386010, --146029, 466004, 2204929, 3114925, 1923609, -874563, 1233193, -4099010, 2027225, 2296197, --717260, -425739, 689879, -994822, -298500, -311922, -1280974, -1386201, -754841, -471910, -706522, 1502165, -297427, -1938641, -60666, -2700998, 840740, 3492882, 1488206, 2026151, -1447941, 5503464, -14974403, -22257594, 2765959, -5159330, 4986994, -6305012, -10969346, 172336, -10168872, 1966558, 6255620, 4857071, 3886946, 2358474, -3506841, 2607045, 6772090, -10645613, --4890894, -3612604, -2317672, 3755949, -822486, 1222455, 7027104, 5974837, -2422362, -6052146, -1445793, -3436511, -2486249, -5870147, -3949759, -8883603, 2168422, -3387656, -12885, 7689065, --1498407, 1388348, 2122251, -5696737, 4761508, 4539781, 6560563, -5804112, 10323491, -1774358, --7444789, -6444062, -8149701, 7549479, -2829310, -8824547, 2711198, -1443646, -6088116, 6447283, -8854612, -3135863, -7285339, 5352603, 1787780, 4175245, -579821, 11732777, 7011534, -7000797, --3368328, -3354906, -2634426, 3853660, 5470715, 6924561, 42950, 834297, 2749316, -2881923, -2617783, -861678, 4590247, 6352257, -8691940, -3998078, -4356708, -2841121, -4452808, -439697, --3142306, 1384053, -146029, -370441, -345745, 1083942, -2125472, 5383742, -658204, 2246805, -848793, 1053341, -1045825, 132070, 169651, 244276, -1826972, 309775, -1183264, -1992328, --2868501, -926102, -158377, -550293, 120796, 273267, -574452, -456877, -1074279, -1071594, -1726040, -65498, 584116, -1258425, -20787104, 60666, -3834869, 1449015, -108985, 7893076, -5662378, 8173860, -1381906, 11122355, -5200132, 7590281, 9126269, 1777043, 9097278, 2063195, -2318209, -2483565, -998580, -3765076, 7202660, -360240, -886374, 10321880, 6122476, 188442, -2699924, -776852, -399432, 6749004, -3859028, -6485401, -60130, -814970, 3326452, -18514530, -11142756, 12175695, 4715874, 2451353, 270583, -5815386, -12461848, 8304856, -5049808, -5539971, --3826279, 7467338, -5228586, 4648765, 4566087, -4301410, -2962991, -10611790, 4894652, -6863895, -4097936, 802085, 3666828, 6628745, 10365904, 4576288, -4837744, -11331734, -2054605, 7118372, -11431055, 8723615, -1772748, -2158758, -7405598, -12138651, -1330903, 8597451, 3751654, 2793876, --2750927, 11373610, -413391, 3905736, 1060857, -2058900, 1036698, -5625334, -2824478, -2785823, -1888175, -1323387, -4129074, -2301029, -2859375, -2945811, 1205812, -4242354, -1838783, 964757, -732829, 3501472, 159988, 605054, 561567, -789200, 2739116, -740882, 3118683, 1262184, --913754, -2277943, -139586, 3155727, 2138357, -248571, -2958696, -643708, 2594697, 2470143, -322659, -397284, -364535, -1648731, -1334661, 2077690, 7845295, 27154394, 14717242, -1217086, -2554432, 2506650, 5954972, 10805064, -1500554, 2214593, 18107582, 1966021, -788127, 11042361, -7626788, -7416872, 4505958, 1220845, 7298760, 5143760, -12563853, 9704479, -5807333, -695785, -1096290, 7630010, 1363115, 2168959, 5721970, 6679748, -6214281, 6859600, 20031728, -3384434, -9133248, 9489730, -4948339, 7476465, 1968169, -4662724, -5180805, 3707094, -4626754, -12288975, --1578401, -428423, 1312113, -15770583, -3855807, 5051419, -10041634, -6628209, -16560320, 5644124, -7670812, -11191611, -4012573, -5317170, 12048457, 447213, -6837051, -4655208, -7617662, 4002910, -10089952, -6987375, 3911642, -2879776, 4884452, 11525545, 4811974, 9114457, 9140764, 11511586, -1774358, -6204081, -6315213, 4712653, 7230578, 1201517, 4870493, -4926865, 2072859, -460098, --1542967, -5178657, 771484, -2206003, 344671, 4512400, 1878511, 1999844, 1509144, 4968204, --2939905, 341987, -765041, 1598802, -524523, 336081, 2091112, 715112, -1651415, 2744484, --521839, -3515968, 2338073, -2460480, -2070174, -2556579, -5496485, 3172370, -1226213, 2712272, --248571, -344671, 788127, 4300873, 2822331, 3857954, 1760937, 132070, 1557463, 4421669, --1673427, 4008278, 27974196, 7341710, 1273995, -1705639, -3891240, 74625, 5348845, -3476776, --6295885, -9623411, 854699, 6706055, -8338679, 4073240, 5709086, -2483565, 18923090, 6548752, --4543002, -3301756, -1279900, 6655589, -2649995, -6358699, -6766184, 4227859, -14924474, 440771, --4122095, -5589363, 4938676, 976568, -5398237, -3495567, -5184563, 7423314, -2362769, -12006044, --1334661, 188442, 999654, -6998649, -9616969, 834834, -1712618, -1403917, 3406983, -2144263, -9210557, 1799591, 5533529, -5897527, 13359496, 3771518, -6529424, 8699456, 16872242, -4894115, --4037806, 8518531, 8021925, 3230352, 4913980, -10428717, -2677912, -11268384, 3374234, 10428181, -4829691, -13196287, -2592550, 4090956, -12896176, -20410758, -1690607, 604517, 5849746, 18413062, -1544041, -2165737, -5704254, -4433480, 2959233, 4624069, 3995393, -344134, 2143189, 121333, --4022237, 2472828, 3244311, -5258114, -4918812, 5552319, -1826972, 3241627, 2552284, 1607928, --1366337, 1152125, -96637, 1889249, 513249, 2899103, 116501, 2556579, 1858110, 536334, --2370822, 5379447, 1755568, 4908611, -1016834, -1700270, 1829656, -3361886, -546535, 2316598, --3105798, 765041, 1813550, 1065152, 1188095, 2617246, -1038845, -4866735, -62277, -539555, --5127654, 723702, -2156074, -637266, 2048163, 1656247, 1856500, -21657372, 10212358, 28646358, --11752104, 20084878, -4503273, -4406637, -6259378, -10474888, 7765838, 227096, 5313412, 5146982, --18817326, 178241, 8804683, -7718056, -4014721, -11950747, 21041044, -13184476, 10392747, 9706626, --12488691, -5233418, -4346507, 8736500, -9990094, -4165045, 10204305, -1858647, -2711735, -5047124, -12439299, 2103997, -1997160, -5196911, 340913, -9543417, 10254234, -1306744, 4722317, 25450902, -17154636, -14803142, -10396505, 3915937, -1318018, 10587631, -5866389, -8725226, -3057480, -16134582, --6180458, -2008971, -12304008, -7144141, 27313308, 6404870, 102542, -1453310, -296890, 7923141, -9624485, -2145336, 9505836, 645319, -5216775, 908922, -14566918, -1218697, -13499082, -7413651, -8136279, 11793980, -17901960, 7137162, -4589173, -5812165, 8671002, -1402307, -8243653, -603443, --3234110, -6591701, 3305514, 2259153, -4511327, -11248519, -5359583, -1250909, -885837, 8645232, -2597918, 2059437, -4792110, -54761, -1981054, 4573067, 5254893, -2950106, 2237141, 3839164, -4318053, 3270081, 4910758, -2085744, 326418, -3522410, 251256, -4081293, -2121714, 1374390, --1114544, -3320010, -778463, 1556926, -5294621, -2727304, -2886218, -1714766, -2042794, -2527588, --333934, 2835752, 189515, -369904, 3373160, -23025320, 4034585, 21110838, -5476084, -5546951, -4694400, -6721087, -5275294, 5864778, -700080, -1323387, -163209, -14542222, 24553792, -26131654, --2412698, -725850, 8997956, 5230197, 406411, -10001905, -7010997, 2980171, 19187766, -1684164, --8339753, -5890548, -13475997, -1055488, -7882876, -6467684, -2713346, 4119411, -374736, 504122, --9104794, 1714229, 2681670, 5738077, 4958540, 5778342, -12387223, -75162, -2470680, 8058433, -2146410, 16485695, 3663070, -3978750, 1539209, -9169218, 1611, 7126962, 9435506, -14394046, --10995116, -1166621, 14952392, -23412940, 6184753, 26756036, 14850386, -7312182, 2555506, -14570677, -6165426, 13159780, -22660248, 4966056, -11004243, -3244848, -30746060, 44560, -12911745, 11902428, -901406, -14430553, 9594420, -1024887, -18396956, -2572149, -11606075, 7514582, -6432251, -9753871, -13214004, -2641942, 2407329, -4479651, -5616744, -1658931, 5694590, 4097399, -3073586, -896574, -320512, -3351685, 2126009, 3092377, 4730370, -4794257, 1939715, 2392834, -5487358, 254477, -2542084, -4093641, 476741, -2683281, 6263673, 3212099, 7603703, -3651259, -2709588, 2422362, --7058242, -852551, -1956895, -1214402, -274341, 1429687, -3914326, 170188, -433792, 1317481, -1483911, 167504, -3946001, -2408403, -6229850, -17361868, 27473296, 8081518, 14374182, -16176994, --18252000, -3233574, 4815732, -4937065, -2457258, 9371619, 2517388, 3019899, 8137353, -20071992, --2226404, 431644, 5132486, -13905493, 1840930, 2563022, -9796820, -5233418, -13491566, -9965935, --75699, 4507032, -10916196, 993211, -4947803, -9525701, 3770981, 153008, 7750269, -21265994, --22388054, 4819490, -1920924, 8578123, 18781356, 2255932, -11812771, 16940424, -8363912, -15625091, --12147778, -5047124, 1350767, -16602733, -6466074, 16595217, 22348862, 9554692, 6264747, 4784057, --2572686, 14355391, 8057359, -16504486, -9055939, 202937, 1672353, 15700790, 10034117, 2607045, --2383707, -1823751, -7635915, 10457708, 8138963, 18105972, 4134443, 5348308, 2208687, 32430224, -3687230, 12626130, -13356811, 1254131, 12313671, -29195578, 2426657, 3974992, 8279087, -2938831, -4415764, -3728569, -965294, 5127117, -2403571, 15628849, -6205691, 9178882, -2368138, -5410585, --2924336, -5859946, 199716, 2532957, 3078418, -1138166, -2969970, 6576669, -1911261, 4435628, --2275259, -2377801, -4694936, 4967130, 5341866, 1232656, 537945, -3872987, -6830609, 3296924, --569620, 310311, 8181913, -2208150, 7171522, -1016297, 4202626, 2915209, 5529771, 1326071, --5063230, -883153, 18686328, 1072131, 23179938, -991064, -10548440, -11817603, -21633750, 3754338, --9109089, -834297, 1884954, 7561290, 11385421, 18956376, 19914152, -3316252, 17728552, -1557999, --1522566, 6455336, 14939507, 6254010, 4190278, -23995446, -12182138, -19558744, 9799505, 19105088, -3768297, -8602283, 13519483, 19164144, -2617246, 2769717, -4535486, 16073378, 13797582, 11460046, --6920266, -12551505, -1952600, -3438121, -27386858, 4535486, 3752191, 2197950, -6961068, -3879429, --30544196, -11054172, -27723478, -5097053, -20761872, -11005854, 20029044, 5071283, 21100638, 1160715, --17272748, -8644159, -17973902, -34580392, 4851166, -21459804, -6190122, 20022600, 8455180, 7738994, -1672890, -4075387, -1479616, 3764539, -14783814, 11644730, -25222732, -26214870, -1441498, -2421288, --3246995, -19304804, -4342749, 25081536, -1378148, 1397475, -6736656, -22023518, 11116449, -14856829, --5778342, -14788109, -9058623, -6985228, -4675072, -5413807, -3258270, 216359, 2595771, -13834627, --5907191, 2528125, 2455111, 7556995, 3587908, -4669167, -5780489, 4904316, -9269613, -1504312, -2867965, -7197292, 2250563, 2066953, 5163625, -4941897, -1690070, -2675765, -376883, 3349538, --2030983, -384400, -2725157, 5379984, 7540889, -2560338, -1216013, 1965484, 2532420, 4671851, -6682432, 1163399, -1137630, -1671816, -1585917, 10853919, 21787832, 19012746, 20429548, -11764989, --20550344, 15808164, -9356049, 16337519, 4874251, -26181046, 6579890, 4905390, -29532732, 15887084, --13463649, -13712757, 8042863, 9001715, 1403381, 10681047, 800475, 554588, -6928319, -3974992, -6475737, -4076998, -10125922, 701690, -19022948, 6896107, -24181202, -14676440, 898185, 9617506, --3301219, -9973988, 3750043, 7591355, 5630702, 468688, 19473918, -44736916, -10165114, -12233677, --14868640, 19446002, -15658914, -2114735, -36107792, -10073846, -4290673, 1910187, 24074902, -5781026, -3042984, -14510547, 12208981, -18060874, -11719892, 9431748, -41926396, 6132677, 22403624, 29135984, -22225918, 14107357, 32724430, 18108656, -396748, -8062728, -8408472, -12625593, -28227598, -3025268, -2631204, -39877696, -15800111, -12030740, -9016210, 12814035, 33429878, 39101920, 25865904, -13070122, -10666014, -8411157, -1840394, 8886287, 6003291, -3365107, 2103997, 2954401, -787590, 1389422, --6152541, 3560528, 10958072, -5114233, 1453846, -9627706, 2367601, -4485020, -670552, -428423, -8459475, 15068356, -5400922, 991064, 3640522, 6167573, -9102646, -14009646, 250182, 10999948, -3164317, -8915815, 8382703, 4475356, -9134859, 6444062, 4060355, -3450469, -2819646, -915365, --1726577, 1709934, 3388192, -3137474, 6109054, -38489888, 119185, 6360310, 27023398, -8819178, -12537010, 11294690, 6050535, 6155225, -41941968, 33122250, 18154826, 41051836, 15176267, -1802276, --15173046, -9707163, -9463960, -14892262, 10719701, 7801808, -15010374, -17186848, 9186398, 12321724, -21563958, 6011881, -13220983, -19906100, 4329864, 3374771, 1488743, 2393371, 38221452, 12902082, -7401840, 12553116, 13907641, 15519864, 481036, -24169392, 17143898, 53159884, -5303748, -14799920, --32219234, -6948184, 42991548, 5017059, 17869748, 5946382, -59122908, 12233677, 10774462, 1255204, -6229850, -4134980, 1050120, 12103218, -31758598, -13227426, 27217208, 10059887, 3858491, -24003498, -17314086, 6386080, -21495238, -23477364, -15617575, 21536576, 44900124, 41663332, 46028628, 46547780, -2018635, -20691542, -16874390, -40647032, -13166222, 12895639, -32833952, -257698, -26718992, 404801, -36338108, 14137422, 15082851, 18002356, 11399380, -10976863, -3469797, -13545790, 19855096, -11832098, --10287520, 3606699, -2072859, -7010461, -12786655, -3714073, 13606993, 12682502, -5668820, 19578072, --681289, 568546, -8614631, 2954938, 10309532, -2468533, -7428683, -7364259, 5270999, -4037806, -11252277, 7027640, 9163313, 13087302, -12999792, 3465502, 1414655, 6052146, -2487860, -5583995, -11969000, 2898029, 9824201, -5054640, 3769371, -7704635, -2285996, -11889006, 19034758, 38774428, --78578576, -27715960, 6136435, -45901388, -42101952, -18212808, -25567404, 2929168, -18826990, 49820548, --5297842, -17626008, -7151121, -38094748, -10564546, -30731564, -12809740, 5417565, -39675296, -6604049, -30729418, -25687126, -7409356, 8917963, -152471, 12885439, 2690260, 110059, 11461657, 4320737, --19713900, -3622805, 17548162, -8797704, -24554864, -7990787, -29777008, -14581951, -52161304, 5174899, --35532800, 17249126, 6345814, -12934831, -46012520, 4361003, -4903242, 56802552, 22531936, 1154809, -30766998, 13450764, 284005, 25130390, -29513942, -13921600, 2204929, 22240952, -24447490, -14734422, -82184736, -7753490, 42569032, -33089502, -81068, -23611582, 17865454, -8319352, 27870042, 43858596, -1162326, -30967788, 26590142, -32999308, -15007689, 11155104, -34294240, -22908282, -10935524, 24923696, -47547972, -56572772, 47668768, 9543954, 13936632, 5266704, 6692096, 5080410, -7039989, 8616778, -24693378, -12486544, 4334696, -2426120, 3226057, -26801132, -4811974, -8214662, 8082592, 8262980, -26381300, -16485158, -9550934, -12854300, 18306224, -23401666, 5632313, 8602283, 7942469, 8674223, --38513508, -9199283, 13893682, -6659347, -16456704, -2194728, 4549981, 939524, 16330539, 8227547, -12965433, -13020730, -11560978, 13093745, 3874061, 8783208, -8665633, 8834748, 6081137, 1622961, -3328600, -3706020, -3988414, 108985, -19028852, -18533858, -29606284, 61269856, -35167728, 22497576, -20187420, -31967442, 17576080, 9595494, 6972343, -5711233, 24314346, 12493523, -30752502, 21843130, -25536802, 4926328, 4403952, 15374909, -310311, -30677340, 39950176, -22765474, 9117679, -16930224, --3799436, 5006322, -7358353, 32476396, 7411503, -4291746, -7694434, -1695975, 6483253, -33049774, -10604274, -17128330, -11450920, -7923141, 56908, -16206522, -7576859, 3955128, 34461744, 386010, --7046431, -21846352, 9290551, 6060736, 1177358, 26659398, -6311455, -2746095, 31857920, 9997610, -2024540, -30537218, -15814070, 19770272, 11226508, -28596966, 1111860, -65038688, -32032402, 58401356, --13461501, 31618476, 41566692, 11822971, 7261179, 18781356, -7751879, -22788022, 12516608, 3920768, --1237488, 26405458, 17375290, -18835042, -45175004, -9322227, 18788872, 5988795, -818728, 14825153, --16876000, 25588342, -12188043, 9641665, 12212203, 5321465, 17816062, 13382581, 21541408, 2523293, --5161477, 7796440, 20921860, -5264556, 18379238, 10925860, -11249056, 3764002, 9982041, 6578280, -4379256, 13055627, 11265699, 4880157, 22042310, -6688875, 2983929, -2959233, -851477, -5328444, -19699942, 15977815, 13294534, -5825050, 3061238, 22707492, -5202816, 16690780, 15553150, 199179, -26611618, -23225036, 4100620, 35631048, 5399848, 10209137, -6466610, 25121800, 5789616, 9629854, -34842384, -10768557, -58167280, 9878425, -6992207, 20031728, 6152004, -19738596, 10251013, 12007118, --22466974, -24697136, -16506096, -41233832, -41475964, 28566364, -6589554, -42634528, -13049184, 4384625, -14139569, 13525389, -26096222, -28303298, 2813204, 39438536, -18822158, 15240691, -26489748, 9456981, --29887604, 19518478, 20595978, -14630269, -30758946, -21143588, -3400540, 12128451, -13183939, -8664560, --10970957, -39120172, -33819648, 17804786, -28387586, -5753646, 10162966, -23408646, -37869800, 14540612, -19926500, -2467459, -45597520, 20491826, 17945448, 57795764, 303869, 15243376, 11334956, -24551106, -9476845, -7554848, -49842560, -7525320, 30524870, 7379291, -25200184, -62459560, 39560944, 50662896, --14993731, 41015328, 47590920, 2610803, 2175401, 37760280, -24330990, 2069101, 62978716, -46225660, -27008364, -39557184, -10908143, -3017215, 27118960, -8971113, 3940096, 15458124, -479426, -34931504, -38763692, -6755984, -4560719, 6256694, 16173236, -26141856, 11563126, 7144678, -4020626, 8419747, -9391483, -24145770, -3365644, 6116571, 12834436, 27194122, -2320893, -23051626, 11873974, 27946816, --21949430, 27295590, -12792560, -2335389, -9533754, 30771830, -21023328, 7738458, 18751290, -12465606, -4590247, 3962644, -17594870, 4473746, 7329899, -2618320, -13440026, 9334038, 10749229, -5385889, -21580064, -32021128, 7811472, 10424422, 146029, 2864206, 4154844, 22796612, -5309654, 12883828, --26446262, -82738784, 22180822, -9375377, 61703112, -21123722, -13872207, -24698210, -71238472, 32631550, --41631120, -24023900, 987843, 61740, 54465016, -39031052, -27709518, 36183488, 21171504, 18918258, --7095823, 18072686, -12996571, -17952426, -16931834, 42378444, 34855808, 55059332, -17807472, -20495584, -652298, -3558381, 19858856, -33033130, 6766721, -34731252, 18250390, 34170760, 11373610, -28059022, -18804978, -24739012, 55433532, 28432684, 7538742, 7536057, -8982387, -43734580, 24354612, -59338732, -12021077, 11054172, 28614146, 23010824, -51654496, 15452755, -32688996, -19184008, 13560285, -5110474, -18724984, 12228846, -47286516, 19128174, 42640972, 56893820, -16945256, 16780974, -23678692, 39906688, --57200912, -3051038, -10785200, 17864380, 36893232, 53561464, -43386148, 10619307, -57908508, 36845988, -75211320, -19312858, -52052320, -4246649, -39381092, 49588620, 12124693, -25489558, -7672959, 2763812, --8999567, 35358320, 12858058, -20198158, 18585398, -28549722, 1328219, 26478474, -6089727, -32901596, -35751308, -52405044, 14595373, -8072928, 20325932, -1514513, 12410845, -12249784, -7008850, 5093831, -4015258, 5311264, 24193014, -25580826, -21875342, 929324, 5123359, -6117644, -27030376, -19605452, -38100120, 10151692, -17823040, -20142322, -44806708, 52586504, 40779640, -16448651, -14816027, -31188442, -523986, 39176544, 6932614, -16959216, -6606197, -9154186, 5728950, 3877819, 1476395, -5181878, --2567317, 7073275, -1131187, -4376572, -3366718, 4583804, 1416802, 9460202, -4684736, -66025460, -47392816, -6887517, -975494, 14627048, 13820131, 17579302, 5956583, 8176007, -22106734, 20938502, -6767258, -24191404, 16583942, -10105521, 426812, 20453708, 13108240, -34077880, 19489488, -16546898, -28512678, -20983062, 7806640, -11110544, 13691819, -10626823, 6720550, -15436112, 32673964, -3612068, -1657321, 8701067, 11476153, -16936666, -2579128, 6507413, 11420855, 8931921, -10427107, 3265786, -1250372, -33170570, -1910724, 7632157, 12701292, 4417374, 8422431, -29917668, 5424544, -2461016, -3723737, 5942624, -4986457, 5577552, 5646809, 1985349, -6263136, -7348152, -1462973, 32981054, --11077258, 5951214, 13331042, -7831336, 12725451, -14331769, 12294344, 5203353, -8289287, -14418742, -9376987, -9160092, 7528004, -13051869, -9797357, -5640903, 16310675, -4791036, 2298881, 2305324, --312996, 2892124, -11470784, 8485782, -7109782, 19600084, -18173080, 8049306, -10507101, 9322227, --8426189, 7282117, 1060857, 12947179, -11110007, 5584531, -5270462, -175020, 3288334, 7257421, --7727183, 1115081, -8400419, 12192338, -10120554, -3979824, 7504919, 1777043, -4483409, -2537252, -8376260, 3994857, -17219598, 9157407, 1796907, -870268, -1003949, 2674691, -1345399, 934155, --478889, 1340030, 1538135, 3704946, -4183298, 11914239, -15506443, 4250407, -2011655, 2531883, --2132988, 3706557, -1333587, -2991445, -562104, 1373316, -3438121, 51835424, -3731790, -16790100, --25591026, -11638825, -14362371, 18807124, 10884521, -13673565, 1147830, 1612760, 6152541, 845572, -13032541, 4497905, 10267656, -3514357, -358093, -3074123, 4820564, 11123965, -10310606, -60130, --5095442, 369367, 13571023, -7682623, 1337882, -3467112, 5358509, 2766496, -7418483, -2747169, -7999377, -2440615, 13031468, 9266392, -13553306, 4364761, 2902861, 7136625, 3036542, -12816719, -8711804, -2386928, 8474507, 6774237, -15289010, 4220342, 75699, 3467649, -1677722, -6708739, -10954851, -2663954, 4991826, 282931, -3244311, 5078799, -6483790, -891743, 9147207, -6233608, --7470022, 15209553, -9762461, 14191646, -1432909, -11445014, 23520852, -21525840, 18786724, -6614250, --11185705, 11904576, -10987063, 3304441, 3875134, -10765336, 9146670, -1909113, -643171, 5844914, --7455527, 9865003, -3128347, -716723, 2479807, -1636383, 3511673, -1604170, 616865, 2909304, --2704756, 4627291, -471910, -2565706, 5703180, -8694624, 4712116, -3840238, -1726040, 5498632, -526670, -1593433, 2901251, -2024540, 2882997, 1483911, -3974455, 2766496, 629213, -865973, --610422, 2506650, 609885, 4582730, -3483755, 1345399, 668404, -2498597, 5105643, -1392643, --704375, -25298432, -43661564, 55049668, 157315520, 24978456, 15157476, -114990768, -142377088, -45506788, --28068686, 96324304, 146695680, 75618808, 21789980, -49328772, -106307416, -96799976, -81243600, 6495601, -121512680, 101782136, 58229556, 19874424, -52140368, -67434208, -53709640, -51753284, -18371186, 24640764, -33679524, 69919920, 49918796, 12196097, -17032230, -9906342, -56323128, -27259620, -28508382, -38434052, -22825066, 43255152, 24890410, 62943284, 16614007, -14875619, -24247238, -41751376, -33130304, -5116917, --10304700, 12896176, 25936234, 23242216, 16481937, 11341398, -5804112, -22898082, -16314970, -19034222, -6067178, 22327924, 7266548, 5529234, -9746891, -19909858, -3813394, 10201, -367757, 16230681, -14410152, 16268799, 6324876, -5528160, -17451526, -25116968, -25837450, -16699907, 17784922, 26491896, -32720134, 22734872, -5778342, -12766253, -13680545, -26926224, -11989938, 9904731, 5115306, 4945118, -7796977, 3835943, 2946348, -4123169, -5485210, 4315906, 9302362, -140123, -880468, -6396817, --8946417, -4558034, -5461588, -3112241, 6880001, -1168231, 14466524, 18000744, 10307922, -6157373, --10259066, -11367705, -14500883, -10495289, -14350559, 7701950, 19622632, 18016314, 10569915, 11274826, -4184909, -10974178, -21633750, -22013854, -11273215, -2219424, 6925098, 15789374, 23040888, 19011136, -3513820, -12138651, -20381230, -14836965, -4997732, 207769, 5508833, 3605625, 8662949, 11211475, -3253438, -4759361, -6631967, -3634616, -2797098, -2614025, -810138, 856846, 5131412, 3191161, -310311, -6979, -373662, -967978, -2421825, -2735894, 886374, 2241436, 1613297, -320512, --107374, -259846, -778463, -897111, 475131, 438087, 727460, 233002, 355945, -464930, --589484, -1054415, -642098, 246424, 1287953, 281320, 518080, 476741, 131533, -660351, -18254, -678605, -1860795, -1241782, 1226750, 1447941, 1504849, 761283, 38118, -990527, --404264, -636729, -335007, -603443, 261993, 47245, 219580, 94489, 739271, 363998, -710817, 58519, -84289, -674847, -530428, -1053878, -476205, -245350, 821413, 700617, -1255204, 605054, 204548, -974421, -830539, -923955, -242666, -271657, 722628, 524523, -583579, -68719, 97174, -347892, 54761, -282394, 124017, -255551, 161598, -164819, -217970, -199179, 176094, -146566, 273267, -143345, 193274, -186831, 167504, -221728, -181999, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --2850785, -10916733, 1292248, 2952253, 1063004, 1553168, -2618320, -6614787, -1257889, 3488587, 1264868, --3275450, -440771, 2668249, -670015, -3941706, 1207960, -4541928, -2793339, -142271, 1270237, --1291711, -1003949, 2814277, -3893388, -93416, 519691, 1894618, 1524713, 1442572, 4807679, -2161979, -5923297, -1514513, -2679523, 755377, -129923, -446677, -3719979, -4877472, 6490770, --2980707, 1606318, 1886564, 1646583, -6131066, -3461744, -1602023, 703301, -475131, -164819, --557272, 1061931, 2346663, -3180423, -537, 1748589, 2009508, 2418604, 887985, 74088, -2321967, 851477, -995359, -264141, 3765076, -2756295, -2939905, -1559610, -1173600, 3241090, -1906429, 797253, -1188095, 3125663, -1368484, 1636383, -3645354, -314069, 292595, 795106, -769873, -2916283, 810675, 2124935, 1063541, 390305, -252866, 2770791, 1315871, -237834, -1766305, 1079647, 470299, -361851, 603443, 510564, 397821, -481036, 683974, 228707, --530965, -395674, 966905, 250719, -71404, 54224, 59593, 202400, -860067, 676457, --223338, 541166, -668941, -6176700, -3781182, 2685965, -6119792, -8559333, 1632088, 776315, -1020592, 1293859, 1169842, -7354058, -1248225, 2182380, -4728222, 4960151, 4745939, 4143570, --1703491, 412317, 1069447, 3180960, 674847, -73014, 576063, -2105071, 1941862, -739271, --823023, -972810, 6028524, -3590593, 2057289, -2255395, -2014340, -2022393, 1566053, 3352222, --3590056, -1736777, -1966558, 2461016, 2241973, 3722663, 2462627, 522375, 3188476, -2727304, -1897302, 767725, 796716, 6804839, 1554241, 3377992, -5611375, -1475321, 2244657, -2756832, -2589329, -1177358, -2097018, 750009, 4016331, 2767033, 1824824, -971200, 781147, 3054259, --3719442, 4861366, -711891, 3987340, -1663763, 3293166, 3852586, 3310346, -1890859, -4859219, --7256884, -4845797, 415538, -2533494, 4702989, 807991, 689879, 1291175, -3452080, -1034013, --1583769, 1725503, -976031, -637266, 2038499, -2544231, -962073, 1028645, -1479079, 132607, --1644973, -1253594, -1064078, -271657, 933082, 284005, 117575, -1731409, 10483478, 7463043, -6187438, 5075041, 5805185, 2392834, -417686, -171262, -2105071, -683437, 7623030, -3357054, --3378529, 5189394, 3920232, 4986457, -3486440, 1475858, -1298691, 1088237, 2273648, 3092913, -490163, -2345052, -1675574, -3003793, -1026497, -1876901, -5354214, -705985, 4558034, -3581466, --587874, 1620813, -2748242, -2567317, 2587181, -1440962, -3571265, -1983738, 2070711, -3129421, --3933116, -1862405, -1153736, 1275068, -2739116, -5777805, 424665, -1002875, -782221, 1595044, --4675609, -2347200, 103079, -2020782, 2603287, -719407, 1132261, -8485245, -2538863, 4708358, --1864016, -4699231, 1396401, 762357, 1320166, -1787243, -6669548, -3093987, 7530152, 450972, -2782602, 1529545, -1069984, 2230699, 3142842, 1255741, -1547262, -3659312, 1074, 834834, --2717104, 1170916, -3525095, -424128, -2246268, -1163936, -2976949, -630286, -1700270, -2226941, --1667521, 266825, -741419, 321049, -814433, 233539, -1504312, 1012002, 576599, -477278, --278636, 1334661, -36507, -568009, -1341640, -751619, -612570, -166430, 120796, -32212, --1549410, 14756971, 9152038, 8559333, 212601, 813896, 747861, -3572339, -7780334, -3004330, -5980205, -4515621, 2741263, 7962870, 707059, -2573759, -939524, -1657321, -786516, 3201361, -4663261, 131533, 1418413, 1846299, 3061775, 150324, -4150012, 1269700, -6725919, -2072859, --796716, -1914482, -1171989, 820339, -1563368, -3586835, -2716030, -1305670, 353798, -1551020, --4056597, 4873178, -1777580, 337692, -1213865, -3226057, 4075387, 11166915, 2749853, -3904662, -6665253, 1499481, -1988570, 2002529, -1097364, -4318590, 64961, -1816234, 1714229, -3741454, --6417755, 245887, 1116155, -7844758, 2383170, 1613834, 4420058, 2480344, 5827734, -1966558, --3865471, -2299418, -1175210, 2813741, -991064, -5042292, 3475702, -2460480, -4543539, 3126199, --4538707, -2508798, 1487669, -1657857, 1626719, -1093606, -1849520, 1518808, 3926674, -898722, --1872069, -695248, 38655, 1363115, 2773475, 787053, -754841, -1016297, -957778, -329639, -690953, -1973538, -649614, -578747, 3038153, 1526324, 2163053, -351650, 209917, 1644973, -1147293, 797790, -46708, 283468, -299574, 854162, -511101, -406411, -7558069, -12109660, --3636764, -6091338, 8691940, -2035278, -996432, 3166465, -7908646, -5680631, 4840428, -3928285, --3527779, -266825, -268972, 780073, 3206193, -1395328, 1488206, -2148021, -1491427, -219580, --1314260, -3563749, -261993, -823560, 3697430, 3617436, 3288334, -4400194, 2057289, 1388348, -6096706, -3125126, -178241, -2151242, -4581120, 6512244, -6206765, -3148748, -2390149, 1475321, -5513128, -5142687, 5701032, -693637, 3092377, 4634270, 806917, 3553012, -6694781, 1402844, --2500208, 266288, -7094749, 51540, -2420751, -6470368, -4870493, 300111, 4750234, 163746, --3399467, 5281736, -1808181, 3020973, -388158, -6716792, 9313637, -5879274, -1115618, -3382824, -2351495, 3678103, 2526515, 3386045, 7544647, 5644661, -928250, 1107565, 3578245, 2143726, --2645163, 3723200, 3002182, -656056, 1718524, -3839701, -5136244, -649077, -1637456, 2803540, --3001645, -729071, -2885144, -773094, -1312649, -535260, 894964, 974958, 616328, -233002, --709743, 1637456, 906775, -1908576, 1322313, -24159, -4452808, -510027, -1591285, 2444910, --666257, -416075, 948651, -605590, 904091, 1888712, -120796, 1182190, 1400696, -389768, -528818, 2706366, 467615, 3145527, -8428336, -12265353, 1467805, 920734, 787590, 7741142, --2435783, -8636642, 1008244, 894427, -2148558, -590558, -7402913, -1582159, 1040456, 1016297, -8506720, -1569811, 7634305, -1919314, -1837709, 529892, -7366943, 3089155, -2711198, 4451197, --1154273, -2022930, -2670933, -1457605, 371515, -5688148, 9766219, -6797323, -10759430, 3146064, -603980, -7732015, -2150705, -14745160, 357019, -5318244, 32749, -5765994, -4489315, 689342, -623844, 2417530, -4527433, 3591667, -5122286, -10217190, 1308354, 2691871, -2960843, 3204583, --1630477, -5719823, -4838818, -6932077, -3135326, -838056, 1220845, -2153926, 6432788, -93416, --1874753, 435939, 484794, 1202054, 1087164, 627065, -5972152, -5797132, 1305133, 3905736, -2478733, 546535, -1239635, 4878009, 2849711, -2452426, -1620276, -5719823, -2212982, 2371896, -1275068, -3177202, 1326608, -978179, -806917, -1559610, -1672890, -741419, -2238215, -1899986, -1053341, 329639, 1487132, 2269353, 279710, 1972464, 193810, -1529008, 2085207, 1111860, --316754, 151398, -1056025, -1285269, 53687, -41876, -1194538, -88047, -306553, -207769, -70867, -428423, 1384590, -2243584, -250719, -777926, 188979, 566936, 1416802, -105764, --18823768, -4697621, 721018, -4778688, -3532611, -5983427, 1520418, 2124398, 4248260, -3215320, --4041027, -4523675, 2234457, 5068062, -2552284, -2152316, -1321776, -767189, 2362769, -10472741, --2625299, 5932424, 1893007, -3061775, 1083406, 5254356, -554588, -1330903, 1795296, -323196, -12826383, -5529771, 3106335, 1041530, -5461051, 1788854, 1167694, -6159520, 4309463, -8754754, --896038, 7756711, 1658931, -221191, -1677722, -5984500, -5217849, 1385127, 3286187, -2251100, -1575716, 6425808, 3134789, -2664490, 3910031, -5698348, -13460428, -1772748, -5940477, 3732327, --3824132, 9526237, 4717485, -437013, -1615982, -12349642, 3842385, 4721243, -3841848, 7547868, --5917928, 2303176, -9881109, 4560182, 3393561, -11192148, -7176891, -2296197, 2710661, 3716757, -8102456, -1133335, -447750, 5293547, 1173600, 26307, -2416993, 1210644, 1173063, 1588601, -1682554, 431107, -271120, -1021129, -1212791, -3022583, -2562485, 2005750, 1371705, 1030255, -2441152, -1016834, 1151051, 1264331, -688805, 2139431, -340913, -27917, -565862, -2438468, --585726, 2786360, 574989, 2065879, -826244, 751619, -1154809, 3311957, 262530, 2775086, -1177358, -1381369, 673773, 4627291, 8022999, 18249852, 19654308, 3840238, 5960341, -23622, -2896956, 98784, 2167348, -5307506, 2537252, -3327526, 4443681, 4030290, 10181757, 1481764, --1920924, 6241661, 4669703, 7523172, 494995, 4656819, 2867965, -2405719, 2486786, 11236171, -1923609, -4939750, -2502355, 8302172, 5300527, 3964792, 7907035, -6036577, 2467459, 9212168, --9096741, -11087995, 3785477, 5864778, 9762461, -4219806, -7039452, 5776731, 2255932, -919123, -3764539, -1503775, -730681, -97711, 13846438, -4994510, 2929705, -3344169, -1967632, -1651952, -7298760, -981937, 16099148, 7610145, -7492034, 8876087, 2106682, 4122095, 2081985, 1906429, -2341831, -2945274, 5549635, -12634720, -3157875, 5747740, -12666395, 4376572, -10199474, 2418604, -11636677, 2815351, 106837, 3132642, 1277753, -3097208, 962073, -3289408, 569083, 2630131, --7524783, 4416300, -1206886, -1842541, 718870, 2391223, -1823214, -3078955, 1242856, 2782602, --1263794, -2600603, -2353105, -1501091, 1283658, -1832877, -1431835, 1742146, 2640331, 1142461, --1059246, 1590749, -918049, -3963718, -1571421, -46171, -1793149, 1153199, 1058710, 1685238, -2946885, 3993246, -1638530, 5625871, -1717987, -3249680, -867583, 2013803, 680752, -3300146, --1905355, -2389076, 30449708, 5063230, 4958003, -9058086, 13241384, -4532801, -370978, -3629784, -924492, -8679592, -445066, 3811247, 1151051, -7107634, 8804146, -2269890, -4271345, 1051193, -2893734, -9092446, -12312061, 4999342, -4970888, -7576859, 1647120, -226023, -3602404, 6331856, --6373195, 1981054, 6534793, -1307818, 9433896, 2727841, -11515881, -12422656, -5040681, 610422, -2421288, -9854266, 3690451, 3338800, 2033667, 2932389, 4463545, -10234907, -4823249, 2736968, --11017665, -4234838, -73551, -11789685, -6025839, -4149475, 2546916, -6125697, -12426414, -6162741, --6548752, 14446123, 7260106, -1371168, 2197413, -4095788, 11824045, 13777718, 1765232, 9176198, -7017977, 2517925, 1880122, -5575405, -973884, -4945655, 6976638, -9099962, 502511, -2327872, --13488882, -4329864, -1771137, 7248831, -6572374, 3542811, 3402151, 1209033, 919660, 3037079, --3067144, 2385318, -1767379, 2668249, -517007, 4035659, 1444720, 171799, -2007360, -1014686, --5138929, 2673080, -531502, 4350265, -4153234, -204548, -238908, 2512556, -263067, 2222646, -1242856, 1117765, 1505923, 482647, -2709051, 3180423, 4522601, -2394444, -2884071, -3840775, --1287417, -444529, -1086090, 160524, -755377, -20623896, 13919989, 22358526, -16778826, -9985799, -4594005, 4010426, -3416110, 7342784, 1981591, -6255620, -7655779, -163209, -2474438, -5462125, -2769717, -2517388, 333934, 6171331, -8342974, 1737851, 1089311, -4954782, 680752, -7861401, -1503239, 11498164, 5843840, -1173600, -3733400, -965831, -6607807, -7022272, 3408057, 5799817, --1874216, -3249680, -2332704, 3456375, 5764383, 2756832, 10593000, -5754183, 4334159, -2790655, -1003949, 6600828, -2431488, -2134599, -12702903, -1976759, -9848360, 4888747, 3314641, 12563853, --10854993, -4024384, -10509785, -17253958, -2947421, 7134478, -11944841, 2588792, -1377074, -8723079, --10288594, -12942347, 17243220, 598611, 10212895, 7500087, 8664023, -4012573, -11584601, -8776766, --10848014, 3701188, 8369281, -8134131, 3730716, 8941048, -6178311, 962073, 7221451, 8322036, -1932735, -3082713, 3511673, -1582696, 1831267, -9029095, -912144, 3351148, -3131568, 1060320, -459025, 294742, 1902134, 3280281, -3643206, -1361505, 1949378, 2906082, 736050, 1357210, -2825015, -739808, 3058554, -2783139, 2055679, 3095598, 3457449, 278636, -1480153, 2673080, --2406792, 565862, -649077, -2070174, -1097364, -2048163, -660888, 758062, -2511482, -6682969, -2154463, 3420405, -16327855, 11842835, -1662152, -5870684, 9785009, 3703336, -9924596, -13749264, --5585605, 205085, 73014, 831076, -5178120, 15977815, 6336151, 4930623, 3427921, 5120675, --5043902, 1337346, 2910914, 2448131, 13975287, 1611150, -21422760, 2733210, 8568460, -7781407, --12159589, -2406792, -6721087, -3710315, 732292, 15081778, 8706436, -1417876, -611496, -4420595, --13388487, -4345433, -11110544, 7820599, 10300405, 216359, -6162741, -2065342, -2719251, 4923643, -6443525, 7215008, -16821240, 3250217, 268972, 1517734, 11183558, -6650220, 4394826, -6068789, --4723391, 1257352, 7199976, 13573170, -2469606, -8716636, 2506650, -15724412, 12253005, 6820408, --1895154, -6486475, 3060701, -3621731, -8124468, -6455873, -7402913, -3357054, -1836099, 483184, -6306086, -5092221, 17968532, 766652, -3154117, 1049583, 5096516, 239444, -586800, 5932961, -3709778, 3048890, -159451, -2907156, -2624225, -715112, -803696, -2695629, -7841000, 3898220, -3336653, -2856690, 625992, -4180614, -3496640, -1484448, -1220308, -170725, 6142877, -1420560, --2477659, -1139777, -808528, 3947612, 6871948, -2472828, 3658775, -1200980, -5007932, 5180268, --5392869, -4106526, -3093987, -4151086, 401043, 2988224, 1121523, 3059091, -425202, -1333051, --776315, -3413962, 1472100, -2027761, -4248797, 2659122, -1977296, -2020782, -1938641, -261993, --1565516, -128849, -1367410, -1098438, -215285, -514322, -7397545, -1302449, 7330973, -13463112, --4345970, 9386114, -11687143, -751082, -1532230, -1096827, -13545790, 13460964, 5247913, -8683887, --1976759, -3491809, -3744138, -19554450, -3214783, -8714489, -22944790, 5219996, 3070365, -9842991, --8891119, -11672110, -14166413, 12123082, 6194954, 12741020, 18254, 26292180, 797790, 13925895, -18188112, -1753957, 5267241, 19573776, -13337484, 6315213, -8206609, 13590350, -4568235, 26086020, -11243688, -7594576, -12504797, 2406256, 5524939, 11113765, 2448668, -8890582, -2575370, 8903467, -18651970, -7573101, 12364137, -4264903, 7373385, -14545980, 5459441, -7727183, 5467494, 1373853, -1524177, -2314987, 11351599, 16869020, -30378840, 9480603, 5783711, 4846334, -5913633, 4338454, --21928492, 2230699, -76236, -2948495, -8664023, -6729677, -7558606, -1667521, 14852534, -8424041, --5648956, -12013024, -17180, 11407433, -5987185, -5759015, 8051990, 85899, 5714991, 1770063, --1995549, 545998, 2248952, -5532992, 2516851, 1591285, -5587216, -3874597, -2986076, 1888712, -2957085, 3948686, 9881109, -704912, 7358890, 4261145, 2054605, -4791573, -2126009, -7437273, --4053376, -908922, -3146064, -3322157, 3827890, 2921652, 4670240, 7064148, 715649, -1107028, --1387811, -3863323, 2044941, -797790, -521302, 2615635, -3500935, 14851997, 15925202, -3527242, -16555488, -915365, -3370476, 1233729, 9338333, -3539590, -4131222, -1994476, -11651709, 1854889, --3291019, 18392660, 12219719, -8868571, -9255655, -17595944, -6350109, 12658879, 22997402, -10504416, -7150047, 1466731, 3084324, 12422119, 9006546, -18025978, 3633006, -6480032, -3583077, -7477001, --3982509, -7887171, -17242146, 2963528, 11639361, 4368519, 27174258, -6658810, -3673808, 18765786, --6802155, -1118839, -4138738, 4921496, -20621748, -13344463, 7252053, 15406048, 22613540, 26847304, --19717122, -10330470, -975494, 8936216, -825171, 30472256, 8562017, 4497905, -23633058, 1577864, -235686, 11391864, 15015206, -11209328, -3631932, 4607963, -4795331, -66572, 17051558, 6063420, --16732656, 4317516, 8922795, -8130373, 26483306, -9201431, -14063334, -19896436, 14724222, -3237332, --16581258, -13258027, -2957085, -677531, -6558415, 333397, -7145752, 1343251, -9973988, 644245, -4971962, -3520263, 3929895, 711891, -6004901, 624918, -28454, -1218160, 715649, -4174708, -5055714, 2147, -2477123, 5658083, 5860483, 217433, -1528472, 2508798, -5388037, -2308008, --4314295, -862215, 4576825, -3580929, 2044404, 4412005, -8135742, -2961917, -1618129, 1330366, --1476395, 3519189, 8025684, -2261300, -4674535, -2327336, 5212480, 1451699, 563178, 4115116, --2304787, -1703491, -1415729, -2309082, -1845762, 3610457, 31375272, 14790257, -8170639, -2705293, --28840706, 2190970, 7700877, 1955284, 43151536, -5511517, -3215320, -18996104, -16313896, 6650757, --13333726, -8236674, -8931384, -6102612, 10744934, -7062537, -12263742, -10678362, 992137, 10733660, --13878650, 3060164, 6315213, 1321239, 15575162, -1880659, 1241782, -15883326, -22229140, -9240622, -10210748, -12354473, 2991445, -10388452, -38830264, -20998632, 11651173, 745177, -22251152, 3342558, -31005368, -1523103, -804770, -12199855, 6780680, -13455059, -23950886, 505196, 3630858, -9393093, -4586488, 8909373, -2232846, -7936026, 6445136, 8273718, 15538118, -9061307, 11669963, 14870787, -6291590, 25944286, 2900714, -16320876, 18977312, 1028645, 3153580, -3584687, -3855807, 11620034, --11652246, -1791001, 28880434, 22553948, -14070850, 14390288, -4229469, 26707180, 11266236, -9431211, --21472688, -1060857, -7880728, -9432822, 5998459, -8513162, -302258, -2277407, -7541426, -12681965, --2510409, 10489384, -11485816, -71941, -7157563, 954557, 4414153, -4760971, -13437879, -2494302, --6398965, 8006893, 4859756, -3397856, -8925479, -3815005, -9601399, 5592048, -4759898, 2972117, -3654480, 5320391, 4271345, -7547332, -5341329, -8462159, 2360622, 5192616, 593779, 10480257, -11164767, 5973763, 4466229, -3062312, 5901822, -854162, -3010772, -22802518, -23571318, -28825674, -39631812, -22069690, 5479305, -1500554, -12195560, 19677930, -23171348, 9870372, 42135776, 25455734, -6284611, -34190088, -1591822, -22652194, -11033234, -20706574, -1622424, 5532455, -3357054, 15793668, --7399155, 2403034, 8268886, 22185654, 3453691, 2836826, 27507654, -18149994, -2200097, 11727945, --4903779, -14129369, -8879308, 13440563, -11592654, 5493263, 23609436, -6721087, -41589780, -2806761, -10850161, -51756504, 31440772, 23732378, -19185082, 31712428, 22014392, 14023605, 33504504, 483184, -17393544, 1736241, 2374043, 11715060, -20699058, 20798380, 28924458, 21755084, -22306450, -4654134, -31758598, -15447924, 25262460, 22605486, 53716084, 31967978, 2214056, 3485903, -6514392, 6489696, -9675488, -31117574, -43856984, -15606837, 4237522, 1458678, -5967320, 34433828, 16717623, 6336688, --14826764, 13546327, -10387915, -13856638, -6582038, 15497316, 18669150, 3348464, -2875481, -3687766, -962073, -21617644, -4660577, -5703717, 7362111, 3825742, -10703595, -8637179, -89657, 16756815, --4277788, -6667937, 888521, -6896644, -16691854, 8433705, -3246459, -6843494, -9594957, -75699, -6150393, 988379, -30000884, -1854889, 15482283, -2403034, 1077500, 2388002, 4835597, 12662637, -10656351, 336618, 355945, -5012227, -1077500, 2487860, 24160802, 29552060, -58117888, -53505628, -23430658, -15476915, -16644609, -7133941, -20145544, 7080791, -32732482, 41408316, 15786689, -17435956, --199179, -17054778, -12557948, -13767518, -15444702, -10241886, -39502960, -35770100, -6467147, -8207146, -2456185, 3282429, 7089918, -2605972, 5254893, 6548752, 17853106, 19462644, -7177964, -9969693, --11379516, -9906879, -22253300, 33341832, -11597485, 8076686, 25026238, 23387708, -8693014, -10118406, --18484466, -12341589, -15137075, 25626460, 2954401, 3113315, -31567472, -11327439, 46167676, -4505958, -42999600, -8687645, -15800648, -10151155, -17888538, -18593450, -3173444, 170188, -25279640, 2112587, -12430172, -1060320, 9823127, -58910844, -23557358, -16505022, 31515396, -7486665, 5393942, 10674067, -49342196, 13923747, -4272956, -5000416, 42529304, 25540024, 6493454, 8259222, -1903207, 33581276, --13727252, -19119046, 10615012, 15803332, 28287192, 26098906, -15002321, 17728552, 13508209, 14300094, -4520990, -10140955, -19847044, -17034914, 10933376, 14817637, 8171176, 5375152, 17715666, -1641214, --4524748, -913754, -1153736, 9164386, 5751498, 11939472, 21006686, 14718853, 23989002, 6506876, --20981452, 6881612, 6005975, 18639084, -27917, 14643691, 6514392, 14097693, 653909, -26616450, --3124052, -5712844, -1455994, -11895449, -6794639, -30775588, 63933808, -20638928, -12850542, 37904160, --24039468, -36267240, 33628520, -48824652, -14139569, 11512660, 8366060, -34060700, -13379360, 29234232, -167504, -5767068, -19037980, 22939958, -22787486, 1498944, 18041546, -6041409, 16563005, 103079, --8217346, 5538361, 3914863, -9912248, 15745887, -8702677, -3544422, 4683662, -338766, 950798, --2990371, 4649839, 9981504, 16145319, 23265838, 11385421, -9649718, -2728378, -14803679, 13610214, --4942434, -21399674, 4985920, 33823, -12189654, -29242284, 20522428, 1494112, -13531831, 32920924, -1872606, -10280541, -5975910, 48783848, -45727980, -49279916, 29979946, 46747496, -86427624, 333397, --32003948, -29131690, -12872554, 31343598, -24303610, 41507100, -5904507, -1136556, 55906516, -15904801, --43300788, 53631792, 63303524, -61614528, 68728064, -23294292, 1692754, 56680148, -19014358, -21891986, -15587510, 15118285, -7297687, -3032247, 10560251, 1932198, 1364726, -13699872, 18711562, -74088, --1193464, 166967, 2543695, 8244190, 5149129, -7024419, -7405598, 7644505, 18689550, -16358994, --14894947, -4253092, 19583440, -926102, 10502806, -3080029, 4434017, -181462, 4545686, -2495913, --3318936, -23337778, -9562745, 5485747, -8196945, -2626909, -8048769, -12774306, 19644644, 11850352, --33735356, 13194140, 17779554, -3806415, 76773, -12319577, 17642116, 37699612, -17431662, -24453396, --6270116, 5694590, 39033736, 28547038, -9734543, -3416647, 12443057, 31134754, -10113574, -2096481, -19674708, -25067576, -20893942, 16629576, -10914049, -8752606, -10018011, -1259499, -16749299, 1053878, -12137041, -7517804, 9465034, -8374650, -4671314, -5388574, -23300734, 3236258, -9197136, 14240501, -31432182, 1427540, 15870441, 12545063, 1594507, 5587216, 10124312, 32648194, -22874996, 15638513, -14412837, -17128866, 11708081, 10720238, 3934727, -15227807, -29488708, -30523796, 10420128, 10590852, --10982768, -50831476, 41575284, -14107894, -21700860, -13056701, 41829760, -19717658, 45705432, -253940, -15668578, -42838540, 40727564, -18694382, 18316424, -5702643, -57773216, -18615462, 11973832, -36244156, -37511708, 3722663, -52907556, -60317448, -30389042, 41502804, 10838887, -37536404, 45989972, -49138184, --1865090, 88028040, 13760538, 4771172, 9336722, 6446209, -22603876, 23884850, 2365990, 12086575, --14967424, 22951768, -12219719, -12456479, -9632001, -1540820, -24696, 6787122, -1705102, -3648038, -5187247, -8319889, -16075526, 14976551, -4960151, -2848637, -19174344, 8834748, 5086852, 8375186, -3050501, 9701257, -6658810, 2114735, 28169080, -3420942, 1023276, 14326400, -14851460, -3508452, -1570347, -1782411, 11458436, -11259257, 12785581, -4406637, -30219390, 1795296, -7277822, 13682155, -10668699, 9286256, -10496363, 12161737, -19442244, -36686536, -17180, -38984344, 10567230, -3352222, --7178501, 13211319, 21432960, -13737453, 2917894, 23875186, -18803904, 32335198, -4489315, -35330936, -30212410, -14518600, -6703370, 27182848, -34892852, 9247601, 383326, 12687333, -5658083, -12640089, --53157736, 12234751, -22067542, -53097608, 64071784, -43198780, -18251464, -8515310, -14861124, -32594506, -18104360, 44438952, -27692876, 12518219, -40069360, -22473416, -22935126, 20107964, 3368865, 58271968, --10261751, -4810900, -17618492, -50180788, -194884, 24453934, -18818936, 20527260, 24390046, -20775294, -1814087, -17717814, -74457552, -38903276, -23104240, -77945064, 49556408, 65650184, 30598958, -66100084, --53413288, -118582976, 16860430, 140959216, 64918432, 24890410, -37352256, -130084896, -29840896, 30083562, -88599272, 89115200, -60890288, -51290500, -24110872, 11587285, 5825587, 96792992, 1307281, -11864847, -7558069, -9669582, -23977192, 33994128, 5781563, -7390028, 18513994, -15539729, -26720066, 18599356, -15831786, -45024144, 29896194, -6838662, -10256919, -24058796, 25040734, -24317568, 28708098, -14458471, -29386704, -35260072, 13656922, -9981504, 70867, 25193204, 41103372, 11565810, -15835008, -11174968, --3003256, 22719304, -4092567, 32751810, -26232586, -20557860, 9051107, 32434520, 3394098, 19652696, --26386668, -7839926, -8767639, 20141250, -1759326, 2996814, -6166500, -56150792, 40827960, -8283918, --8521215, 667331, 18577344, 9664, -3149822, 13157632, 4984847, 4160213, 21857088, -13964012, -195958, 10838887, -3546032, -2360622, 13912473, -12922483, -2705293, 3486440, 21672404, -14422500, --9652402, 11608760, -210990, 6374269, -20767778, 27378806, -6250251, 9024800, -5700496, 3245922, -15451682, 6321655, -3192235, 12666932, -4593468, 12807056, -9992778, -1094143, 13901199, -3440806, --5284958, -27668716, 3122441, 20823612, 2560338, 9592273, -13499619, -4709432, -7945690, -9012452, --3223910, 14980309, -5240934, 9007620, -11709155, -14710800, -5837935, 3113315, 28308130, -11037529, -13059922, 531502, 3124589, -13979045, 7813083, 14210973, 1124745, -13522705, 10558103, -9111773, -7191923, -5676873, -3545496, -5442798, 2240899, 9882720, -4783520, -2911451, 5056250, -907312, --7387881, -1952600, 7947837, 6153078, -6357089, 845035, 7296076, -6442, -3867618, 827318, --6394670, 4765266, -59593, 2295123, -2704219, 1029182, 4786204, -2495376, 5546951, 704375, -5094905, 3319473, -7257421, -8031589, -2245731, 13263933, -8242579, 9130027, 7917772, -5782100, --13598403, 10324565, -8588861, 11703249, -723165, -2263985, -4529580, 1722282, 2397129, -1000727, --1192390, 746251, 1615445, -5630166, 53195316, 10498511, -28427314, -20284594, -31403190, -10028212, -6105833, 16653736, -5167920, -6804302, -5766531, -5656472, -5250598, 7585449, -3828427, -1117765, --1634772, -5584531, -1275068, 8344048, 1248225, -2475512, -8342974, 9584220, -12445741, 7296613, --4416837, -12305081, 95563, 5544803, 6328635, 4876399, -7201587, 1572495, -2281702, -4007205, -14805289, -13187697, -2360622, -573378, -870268, 1347009, -2162516, -7759396, 6538014, -12275017, -11709691, -1743757, -8163122, 2799782, -4194573, 10354629, -6039261, -3701725, 11246909, -10075993, -3529926, -4836133, -1070521, 8575439, -6107444, -2464238, 7742753, -5312338, 2062658, 773631, --6225018, 15206332, -13263396, -1152662, 5895380, -3398930, 9764608, -4428648, -2110977, 2530810, -3248069, -1063004, 2194192, -874563, -4274030, 3854196, 34897, 366146, 2159295, -288300, -3076807, -3075197, 932008, 600222, 723702, -387084, -1853815, 2474975, -316217, -664109, --1756105, 2187749, 3620658, -1221918, -1791001, 1108638, 2133525, -2644626, 2224256, -1996623, --1672890, 5722507, -834834, 2107755, 3062312, -3971234, 9790378, -3207804, -467615, -498753, --5581847, 5814312, -3591130, -5836861, 5229660, -25178172, -37771016, 49514532, 154568896, 13208098, -13481902, -105378096, -133237400, -27790050, -28198070, 78477104, 133639520, 68540696, 13228499, -48365628, --94039384, -66421668, -47443820, -2485176, 65125664, 95101312, 51438140, 11759084, -33318208, -59299004, --33160906, -31955630, -29876866, 18885508, 38789996, 38180648, 38517268, 9234717, -16648367, -6863895, --25319906, -39709120, -4362076, -11852499, -7974144, 35823248, 20744692, 29925184, 18197240, -13589813, --32622960, -7880728, -21189758, -3293166, 14886894, 4536559, 8062191, 16183437, -8170102, -11503533, --2603824, -6763500, 6578280, 10446434, 609885, 12898861, 7703561, -13562970, -12993887, -20784958, --17721572, 780073, 21479132, 32480690, 15695958, 4101694, -7505456, -21755084, -3684545, -24528558, --14996415, 11540577, 9108015, 27460948, 9303436, -6994891, 8144332, -14243722, -24656870, 4345970, -6318971, 8282308, 7711614, -1548336, -3033321, -2365453, -10218264, -7874823, 5445482, 8382703, -8489540, 8555038, -2311229, -8268349, -5420249, -3173981, 280784, -170188, -9290014, 2398739, -11843909, 6359773, 7396471, -2178085, -11785390, -6881075, -6928319, 2743947, 8384313, 5492190, -5209259, 2232846, -1621350, -8979703, -11766600, -5408975, 804770, 7337415, 11763915, 7169911, -7284802, 4563403, -7343857, -13770202, -17611514, -11453067, 5042829, 9943386, 12964359, 17875118, -5523865, -5325760, -8915815, -7279970, -5322002, -5087926, -5100274, -1471026, 4103305, 7919383, -7060390, 5502927, 3918621, 926102, -4853313, -8600135, -8225399, -4184909, -49929, 3730179, -5093831, 4672925, 2487860, 1524713, 624381, -717260, -3099893, -3832185, -3122978, -1045288, -1347546, 2326799, 1929514, 481036, -499290, 372052, 323196, 528281, 221191, -743566, --1465658, -465467, 770947, 235149, -1199370, -609885, 351114, 301185, -155156, 956167, -2083059, 1921998, -816581, -2188286, -1661079, -549756, -84826, -14496, -187905, 651761, -1414655, 1401233, 214212, -270046, -246424, -579821, -1079647, -862752, -547071, 243203, -555661, 992674, 790274, 294205, -211527, -266825, -624918, -544924, -489089, 25233, -382789, 657130, 253940, 87510, -261993, -265214, -382252, -9127, 214212, 388695, -97711, 89121, -155693, -163746, -266825, 10201, -2684, 128312, 16106, 113817, --43487, 49929, -78920, 36507, -69256, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ -1235877, -3443490, 2669859, -881005, 2043868, 987843, 5901822, -1023276, -165893, 752693, 4316979, --847719, -4520453, -2091112, -4339528, 1061931, -1549946, -355409, -554588, 1052267, 410706, -885300, 2502355, 4618164, -2057289, -1129576, 914291, -2172180, -307090, 3602941, -1961190, -4452271, 452045, -1592359, 2947958, -4029753, -1038845, -2806761, 3937948, -114890, -1461363, --1069984, 42950, 3667365, 143881, 4413616, 1690607, -3623879, 2932926, -1583232, -2711735, --2211371, 3015604, -627602, 9616969, 1022739, 2415919, 1752347, -4485557, 68183, -663572, -1175210, -2547989, -1719061, 5011153, 4108673, 369904, 1709397, -460635, 2558190, -4137127, -424665, 3104725, 1960653, 315143, -316217, 2212445, -3505230, -1618666, 3739306, -2457258, -798864, 1817845, 2213519, 677531, -2801393, -1871532, 1482838, 325344, 1470489, -446677, -426276, -1402307, -74088, -699543, -408022, 797253, 1542430, 645856, -888521, -348429, --599685, 360777, 945430, -557809, 699006, 507880, 983548, -140123, 1178432, -477815, -298500, 719407, 924492, -7346005, -6619082, -4129074, -3748970, -3259880, 1252520, 4624069, -9445170, 1802813, 2439005, -27917, -6735583, -2829847, -2500208, -6063420, 9423695, 2494302, -3744138, 2576981, -2081985, 949188, 9021042, 3590056, -2121714, -184684, -2188286, 178241, --4174708, 2499671, -1317481, -1882269, 356482, 4781373, 505732, 1660005, 3002719, 4143033, --7447474, 83752, 1890323, 4320200, 6657736, -3717831, -752693, -1808181, 5552856, 2995203, -3580392, -606127, 1659468, 11094437, -7017977, 1393717, 652835, -4704600, 1997160, -6567542, --883153, 1668595, -1420024, -9895605, 2769717, 669478, -2673617, -2752537, -459025, -1500554, -3335042, -3148748, -1391033, 959388, -107374, -3063922, -150861, 2484639, -4141959, 352724, --1133335, -1006633, -1292785, -744103, 625992, -2427730, -1823751, 343061, -1450625, -1924145, --1970316, -688269, -1311576, 2384781, -2123861, -613643, 331249, 1190243, -148713, 66035, --747324, 129923, -1278290, 937377, -859530, -852014, -255014, -1868848, 9994389, 833224, -3610994, -456340, -2632815, 171799, 7033546, 3537443, 4552129, 7188165, -3155727, 31139, -7058242, 2202781, 3121904, 357556, 901406, 4072166, -3686693, -1138703, 5257577, -3594888, -2077154, 2930778, -2188823, 2143726, 7036230, -3358128, 2621004, 515933, 308164, 50466, --1422708, -4816269, -1445257, -4041027, -387621, 1636383, 3386582, 3506841, -605054, -6029597, --517007, 8713952, -3213709, 1731409, -1541356, -9240622, 5405217, 1317481, 4020090, -701690, -4573604, 4399121, -7808788, 3097208, 259846, 2905546, -560493, -5521718, -243203, -802085, --991601, -1062468, 3521873, -41876, 700617, 7087770, 1393180, 5631239, 197032, 527744, -1097364, -3121368, -4870493, 3325915, -3682935, 2180770, 1385127, -208306, 2342368, -2483028, --1391569, 1549946, 93416, -4730907, 1533303, 544924, 623844, -966368, 2058900, 183610, --804770, 2268280, -507880, -206695, -1885491, 668941, -935229, 318901, 25770, -288837, -466541, -729071, 1242319, 276489, -472983, 349503, -279173, 127775, -45634, -762357, --61203, 16333761, 9126269, 13981729, 4495757, -5750425, 2934537, -2556043, 366683, 1388885, --11916387, -3135326, -3297461, 3106872, 4651450, -1889249, -294742, 1608465, 357556, 8549669, --956167, -8884677, 2890513, -5119064, 3950296, 4566087, 3595425, 5313949, -1280974, -1777580, -2126009, -1533303, -2086280, 1565516, -1395864, 3212636, 4522064, -1905892, -6879464, 2267206, --6689949, -4250944, -846645, -13848585, 132070, -2290291, 5449777, 5260798, 2512019, 8579197, -8570607, 3860102, 1909650, -556198, 419296, 549756, -3884261, 8023536, -1057099, 2836289, --2517925, -2961917, -1087701, -4472672, 4017942, -2027225, -1673427, 7879118, -6488622, -1915019, -1664837, -2899103, -889058, -156229, 2749316, 3313567, 2183991, 5644124, -1801202, -1421634, --786516, -3403225, 1869385, 3664144, 4922570, 9664, -715112, -936840, 88047, 1163936, -1063004, -1360968, 1661079, 92342, 1209033, 1114544, -162672, -266825, 2143189, -484794, -1103807, 991064, 1021129, 998580, -556735, 920197, 3602404, -129386, 227096, 556198, -2676838, 612033, -532576, -1722819, 1433445, 1159641, -570157, 617938, -6043556, -14448270, --4947266, -1644973, 2185602, -1925219, 4480188, -1099512, 7138773, -6440304, 3846680, -1700270, -13003550, 5251135, -2677912, -5647345, 3106872, -7975218, -4066260, 2889976, -2638721, -4808216, -9028558, 3583613, -393526, -4238059, -5446556, 3651259, 3019899, 2696166, -129923, -1503239, --3323768, 5124433, -6729140, -3047816, -208306, 4751308, 3830574, -459025, 5470178, 569083, --2400887, 986232, -2391223, -2705830, -2911988, 3675418, -2663417, -188979, 5099200, 7358890, -7737921, 3032784, 2810519, -586800, 4428648, -1824287, 6323266, -1164473, 4070555, 2974802, --2453500, 240518, -2697776, 2946885, 2746632, 983548, -852551, -5299990, 3801046, -5760088, --572304, -6225018, 2378338, -520765, -471910, 1108638, -5108327, 181462, 1484985, 8433705, -2881386, 1374926, 2141578, 3260954, 1590212, 1670205, -2399813, 1858647, 1577327, -3524021, --161061, 146566, 875636, 1450088, -1582696, 1067836, -976568, 205622, -74625, 2114735, -362388, 241592, 396748, 695785, -307090, 1919850, -922344, 707059, 897648, 1852742, -1035624, 2581275, -1737851, 949725, -297963, 2981244, 1298691, 1053341, -239444, -435402, -385473, -598611, -472983, -1997697, -6672232, -13990856, -11310260, 716186, -9664750, -4745402, --13684303, -7269769, -8343511, 3330747, -4461398, -5910949, -2035815, 340376, -3524558, -13267154, -3561065, -2333241, 1329829, -5995775, 5990943, 2238752, 132607, -5331128, -2384781, 6816650, -4634270, 321049, -1012539, -4540854, 2844879, 1495722, 2946885, -5439576, -505196, -4414153, --3976603, -4316979, 455803, 8829916, -7177427, 177704, -6836514, 724239, 3194382, 4019553, --7207492, 7283191, 8822400, -2880849, -2085207, -1512902, -336081, 2827162, 3569118, 906775, -2433636, -4269735, -820339, -1568737, 7598334, -2347737, 8408472, -187905, -2558190, 6722161, --680752, -3977140, 1451162, 7282117, 8374650, -598611, -2593624, -4521527, 2900177, -6044093, --579284, 4094178, -3087545, 1860795, -190589, -8053, -2475512, 84826, -1912871, -3009162, --282394, 2601140, 1387811, 2592013, -1117228, -797253, -2019708, 833761, -1625108, 2699387, -1388348, 3759170, 385473, -834834, -297427, -624381, -1284195, 1743220, -1130650, -634581, -737124, 610959, -1796907, -600759, 531502, 97174, -972273, -1735167, -68183, -1596117, --1088237, -643171, 2191507, -112206, 789200, 690416, 139586, -1234266, -334471, -105764, --10721312, -10856604, -12337294, 3559991, -9973988, -4287988, 9772124, 4621922, -10835129, -832150, -200253, 4704600, 7238631, 12108587, -3210488, -4486630, -11909944, -14829985, -8613557, -3063386, -6096169, -6075768, 2979097, -8588324, 8910983, -6470905, 7172596, -3388192, 1078574, 1747515, --1340567, -6385006, 10037875, -8696772, -354335, -4687957, 1296006, -5444945, 1305670, -21628918, -423054, 9918153, -12741020, 2826625, 8824547, 3044595, -6604586, -840740, 10605885, -13084618, -20938, 5218922, 5162551, 4900021, -1813550, -1976222, -8339753, -4264903, 3500398, 5634997, -9183177, 11033771, -16334834, 6139119, -4892505, 1103807, -11502996, -4796405, 9568650, 2225867, -1358283, -6445672, 56371, 6039798, 4515621, 2639794, -5675263, -3798899, 6003291, -1682554, --2479270, -1390496, -4169340, 3489124, -653909, -3432216, -1235877, -1246614, 897648, -2257542, --2252710, 686121, 849330, 810138, -1271310, -2009508, 1656247, -1324461, -4322885, -492848, --1269700, 2527588, -1995012, 25233, 230854, 942745, -2704219, -1643362, -967441, 175557, -2905546, -453656, -676994, 1665374, 42413, 1634235, -819802, -2057289, -725850, -3406446, -745177, -148713, -2285996, 1273995, 12867185, 21449066, 11940546, 13977971, 2133525, 4956929, -18820546, -599685, 565862, 12869333, -6294812, 19864, 3706557, 6409702, 10627897, -8659191, --12328704, 6785512, 3776887, -7172059, 1537061, 4385162, -2745021, 2514703, -6637335, -1513439, --7752953, 2372433, 8450885, 2614561, 7402376, 5710159, 6024229, -14676977, 769336, 17055852, --2030446, -317828, 15907485, -2109366, -562641, 2343979, -2096481, -479963, 8805220, 13817984, --13587666, -2228014, 2711735, -4184372, 6414534, -2173254, 630823, 994285, -2962991, 12162811, --1560147, -4449049, 4562329, -4613332, -7597261, 2605972, 8296266, 3121904, -923418, 1666447, -7937637, 4132832, 7110855, 2130841, 883153, -96100, -6978785, -1459215, -5468567, -1265942, --2298344, -12444131, -5385352, 785979, 8011725, -3310346, 3094524, -2146947, -6577206, 2900177, -707596, -2106682, 1025423, -4019553, 192737, 978179, 2447058, 3479997, -847182, 2236067, --3029026, -4487167, -5363341, -584652, 4823785, -892279, -399432, 1598802, 243203, 515396, -2582349, -1282048, -508954, -1442035, 3719442, 68183, -590021, 421444, -985158, -2018635, --2441152, 972810, 2086817, 2632815, 1416266, 1031866, -519154, -191126, -15569, -886374, --3751117, 1180579, 36203888, 5024575, -781147, -216896, -17388712, -5083631, 1665374, -4055523, -7653632, 3369402, 12412455, -1588601, 537, -2689723, -5274757, 8327942, 1545115, 3177739, -4657355, 6513318, -6165963, -6199249, -7174743, -4992363, -4124779, -1815161, -9849971, -1949378, -15817291, 7448010, -3053722, -1099512, -1904281, 1293322, 5573257, -2778307, 22609782, -3972845, --664109, -10319196, 4060355, 9845139, -1751273, -7607461, -1035087, 3764002, 7531225, 3231426, -10607495, 15883326, 5129802, -389231, 9401147, 7679402, 2825552, 5921150, -19924890, 4552666, -455267, -17630304, 6382859, -472446, -7645042, 4889821, -8105140, -7878044, 9240622, 7264937, --4220342, -15616501, -7119445, 3664144, -9022116, -1894618, 3821447, 15198816, -2566243, 3011846, --8052527, -16857746, -9104794, -8120173, -3738769, 7935489, 998580, -5651103, -1788317, -3555696, --3489124, 5041218, 4162897, 1560147, 3537443, 4236985, -3750580, -2764348, -2816962, 491237, --3081102, -4501126, -4394289, 1765232, -1569811, -727460, 485331, 1488206, -3757023, 1965484, --908922, -536871, -1738388, -689342, -2415919, 5624260, -3669513, -1337346, 881005, -3782256, --3680250, -2803540, 79994, 2804614, 2273648, -19421842, 12317966, -2452426, -12167642, -718870, -11476689, -13088913, -2496987, -10595684, 7091528, 2006824, -3602941, -4638028, -1376000, 6685117, -5494874, 2746632, 7395934, 6089190, 854162, 7399692, 8949101, 3399467, 5046050, -9121437, --4151086, -6415071, 5717675, 6973417, 2771865, 2011655, -4022237, -3307662, -2387465, -2506650, --7362111, 6717866, 1792075, 243739, -7893076, -2623688, 13060459, -9463424, -9681930, -15358266, -5492190, -11568494, 16695075, 18886044, 13347685, 7497939, 931471, 14721000, -7693360, 11528229, --1333587, -8560944, 809601, 488553, -17757542, -8182987, 6926172, 833224, -2850248, 2517925, -15243376, 10102837, -17112760, -4570382, -73551, -651761, 5173288, 7172596, -166430, -14067629, -5764383, -8244190, -25554518, -7681549, -5055177, 7796440, 13178033, 4197794, 830002, 474057, -575526, 970663, 9441412, -154082, 1561758, 1005022, 4863514, -8374650, -246424, 2331094, -6298570, 7173669, 2798171, 4185983, 6710350, 8410620, 11276437, 4050691, 5683316, 5235565, -474057, -682900, -1806034, -1543504, 260919, 2084670, -6272800, -1777043, 3985193, 5900212, --441308, 1532767, -618475, 2380486, 256087, 3725347, -412317, 3566434, -2563022, 4615479, -314606, 4350265, -16077136, 1586454, 1808718, 10050223, 2187212, 25704842, 4113505, -10632192, --3416110, -8954470, 16273094, -20867098, -1844152, 14398341, -31477278, -12445205, -10609643, -11025181, --20871394, 1961726, -3643206, -8972724, -1122597, 9870372, 1262720, 1299228, -6142877, 2439005, --2065879, 2425046, 32212, 1553168, 8077223, -1966021, -479426, 16383153, -10581726, -2141578, -2851858, 14112189, -7392713, 20153060, -6082748, -8146479, -17237852, -22458384, -6532646, -16716013, -8172786, -5072357, -12530030, 1714766, 2047626, 9248138, 7840463, 3272228, -1568737, 28533078, -15808164, -1795296, 2802466, 9776956, 7323456, 4753992, -3843996, -546535, -5100274, -6639483, --6133750, 4313221, 22267794, -15540802, -3791383, -8842801, 16051903, -4206384, 4986457, -2268280, -7546258, -17597018, -13160854, -4526896, 7505992, 2398739, 6483253, -3870839, 4005594, 6060736, -5312875, 2543695, -1035624, -7482907, 4748623, 1802276, -6363531, -4438849, 4008278, -4156992, --3163780, -92342, 4313758, -3952981, 5194226, -3198140, 7413651, -4072166, 841277, 2632278, -1359357, -3515431, -6748468, 5295695, -2019708, -1462436, -517007, -644245, -2127620, 5034776, -6212670, 4372814, 3804804, -668941, 2196876, 7192460, -3832185, 2889976, 1242319, -88584, -1573032, -378494, 389231, -2488397, 3307662, 1048509, 3155727, -929324, 1383516, -538482, --2585570, 1888712, 479426, 2225330, 3221762, -478889, -12877386, -12272869, 6895033, -5475010, --23144506, 11484206, -6934225, 9179419, -6692633, 11541114, 7781407, 9601399, 15262703, 2518462, -12907450, 5242545, 3302830, 8826695, 2993592, 2442226, 587337, -338766, -8269960, 7357816, --16749299, 7335804, 1705639, -4763119, -9044664, -213138, 6419903, -7439420, -3156264, -11135776, --4361540, -13713831, 830539, 7577933, -176094, -1762010, -8753680, -15145665, -11049340, 11869679, -3920232, -4923107, -8747238, -2117956, -732829, -14809047, 12518219, 11441256, -14637785, -14175003, --23289460, -3524021, -27858768, 7512435, 10803990, 5717139, -1766305, -3537979, -2905009, 11434277, -11515881, 13335337, -8706436, -6886443, 8880382, -3834332, -4184909, -16304233, 7218230, 13343390, -15238007, -3585761, 8333847, -4684199, 2484639, 8361765, 4281546, -5873368, 2736968, -10062572, --6158446, -4168803, 1471026, 4262755, 3621731, -3981972, -3686156, -1479079, -4542465, -882616, --6248641, -7739531, -4095251, -3221762, -2404645, -1025423, -2283849, -3073586, 646929, -135828, -4460861, -1548873, 5705327, -1505923, 4547297, 314069, -2621004, 1173063, 11563126, 3594351, -5877663, -2670933, -4725538, 956704, 4179540, -4050691, 8366060, 8453569, 2374580, 3968550, -1713155, -9673340, -5144834, -4734128, -690953, -260919, -4231080, 22275312, 25614112, -10101763, --637803, 6977175, -20840256, -3810710, 25755308, 940598, -28213640, 3124052, 8565239, -642098, -9687836, 23136988, -9571335, 20912196, 11220602, 17849348, 4894652, -13631152, -14652818, 11674795, --13312251, -20713016, -6139656, -24616068, 5295695, -1648731, 8615704, 7522635, 5242008, 2783139, --1133335, 693637, 12369506, 6107444, -24297166, -2831457, 7929584, 15515032, 8486855, 19219978, -17177184, 13572097, -6598681, -2335925, 3413425, 34992172, -14848239, 2543158, 7228430, 13707925, --5858873, -19491098, -4289599, -4939213, -11931419, -21561810, -23725936, 6415608, -13410499, -9995463, -5851356, 18465138, 22567368, 381178, -1535451, -330712, 17265232, -11940546, -6331856, 20673826, --22869090, 2442763, -18130130, -12046310, 1050656, 23972896, -4189741, -16524350, 21150566, -22033720, -590558, -26586384, -2647847, -3416110, 7488276, 14650133, -11236171, -6298570, -8047695, 1884954, -203474, -8312373, 4313221, -2535105, -2676302, -3611531, -3194919, -9834938, 1814624, -4799089, -3063922, 2503429, -1101122, -2272575, 5504001, -122407, -322659, -11595338, 1296543, -1109712, --812823, 10560788, 631897, 2882460, -4920422, 1587527, -3044058, -6376416, 2254858, -12848932, -3747896, -4530654, 9011915, -7712688, -1544578, 1598265, -1590749, -2137283, -4501126, 6902013, --5230734, 7526930, -3307662, -4931696, 4837207, 4159139, 12458626, -14579803, -31368830, -7891466, --10696616, -10864657, -6188511, 1070521, -10509785, -9616969, 3405909, 6665253, -6467684, 16398722, --1463510, 10847477, -5332202, -1089311, 10052908, -14280229, -8327405, -5142687, 14816563, -3917547, --15547782, -6433861, 2740189, -8141648, 6935299, -11092290, -10380936, 15131170, 4854387, -12783970, -7820062, -1935420, -9401683, -1394791, -15804406, -14321032, 3069291, 23721104, 10063108, 7073811, --19065896, 14464376, -1406602, 10970420, -6447820, -13959717, 6862821, -25356414, 21086142, -34167000, --21056078, 7325067, 18843632, 954557, 22501870, -10202158, 6113886, -15902116, 21120502, 6206765, -15778099, 6638946, 3919695, -5389110, -4914517, -10676215, -3278671, -1114544, -17683454, -11229192, -1839857, -27727236, 1796370, 30048664, 9373766, 10488310, 3202435, -14388140, -10181220, -3353833, --3093987, -1515050, -5141076, -7828115, 6334003, 3459059, 5767068, 8092792, -8483634, 5121749, --3078418, -5262409, -3325379, 7134478, -2372433, -8948027, -12482786, -651224, -7430294, -4170950, --7626788, -2752000, -4929549, -3668439, 12173011, -7116224, 2941516, 3120294, -9396315, 10357314, -300111, 5950141, 8818105, -4612795, 4454955, 1324997, -201863, 2051921, 7399155, -4801774, --3911642, 6021544, 743029, 2619930, -1847910, -2542084, 391379, 5025112, -23607824, -22515292, -2454574, 8915815, -10996727, -50611356, -10268193, -515396, 6838662, -17290464, 1729261, -9755481, --1723356, -13827647, -14894410, 13201656, -14477798, -18337362, -2800856, -12912819, -13659607, 4533338, --19959250, -6950331, 12453795, 27674622, 22818088, -1336809, -13508746, 4568772, 20564304, -1198296, -13762149, -4136591, 17268990, 9306120, -17220672, 27553288, -20944408, -11456825, 18977850, -20890720, -6481643, -5001490, -15271830, 1569274, 23788750, -5144297, -13577465, 8551280, 11803644, -593242, -5034776, -34106872, 8427800, 1154273, 17331266, 8006893, -14591615, 14484240, -7655243, -1546188, --13504451, 7050189, 20086488, -4347581, -3670050, -20589536, -28496034, 16093242, -1826435, 12914967, --15469935, 11700565, 9813463, -20726438, 1432909, 17954038, 10660109, -9819906, -16199006, 14633490, -2681133, -13052406, 12384538, 1735167, 5660767, 1172526, 5277441, 673236, 13806709, -82678, -4917201, -1190243, 811749, 11763915, -3631932, 22549, 2985539, -3434900, 2443300, 796180, -8560407, -712428, -9009231, -1427003, 1421097, -5797132, -1396938, 297427, -3454764, 12165495, --2701535, -7456063, 1029718, 7621420, 3965329, -739808, 4755603, 314606, -4955856, -979789, -13329431, 8607651, -8630737, -6831146, 2116882, -3081102, 19081466, 18939196, -51244328, 19255950, -26126286, -6725919, 18205292, -285615, 9482751, -4271882, -10459856, -6924024, 11019275, 2472291, --14733885, -9739375, -1273995, -7061463, -3700114, -1699196, 31858994, 6279779, 7130183, -19755776, -13772886, -14098230, 303869, 2353642, -21374978, 9920301, -7864085, 1010928, -8597451, -15632070, -518617, 10195179, 29527364, 10474888, 3154654, 18094698, 7802882, -2308545, 3087545, 347355, -5234492, 2870649, 20059644, 8624294, 6130529, 3180423, -2464238, -6319508, -19557670, -16616155, -2388002, -2474975, -12030203, 1605781, 14838575, -22605486, 21822192, 5480379, -7905961, -1022739, --5720897, -1923072, 13256953, 5632850, 4384625, -15403363, -3010772, -21008832, -6346351, 5691906, -7733089, 7484518, -8946954, -7386807, 16284369, -2036351, -26138634, 3641059, -382252, -416612, --15394773, 4947266, 11682848, -1732482, 16773458, 11110007, -5511517, -444529, -7136088, 8869644, --681826, 2829847, 1464584, -3931506, -3072512, -836445, -3187940, 3509525, -7089381, -849867, -521302, 3738769, -3606699, -4459250, -5033702, 129386, -1154809, 2709051, 1745367, -306553, --3107409, 3316789, 2726231, 353261, 3901978, 530965, 2819646, 2353105, 3709778, -1166084, --13058311, -667331, -3650185, 2625836, -6031208, -45653892, 70745624, -69940856, -31597538, -15992311, --4745402, 40897216, 12052215, 45788108, 11468100, -9368934, 36118528, 15610596, -12178380, 16915728, -15350750, 8564702, 14367739, 13897440, -12337294, -19988240, -14190572, 2317135, -13043279, 6921877, -4157528, 8973797, -1343251, 6208375, 2146410, 22505628, 5389110, 2136746, 6979859, -5220533, --256087, 7961796, -14047764, -20037096, -13577465, -11643656, 2061584, 5983427, -14078903, -2268817, --8442832, -34745748, 17590038, -6247567, 8939974, -18253074, -6139119, -16901234, -23147190, 8822937, -6239514, 22652732, -890669, 19967840, -8344048, 16738561, 2055679, 23868208, -16770774, 14795625, -17790292, 9859634, 10362682, 942208, -7130183, 27952720, 18757732, -1769527, 33735896, 8138963, -4047470, 14484777, 21790516, 353798, 10082973, 12611098, 5838471, 5564130, -2392297, 1204738, --19532438, -4927401, -2524904, 3229816, 4254702, 3995393, 13202193, 5888937, 6798397, -5006858, --578210, 5252745, 685047, 549219, -4529043, 5495948, 4704600, 2711198, -3497177, 6958921, --885837, 1349157, -5142150, -4784594, -1816234, 679142, 770410, -3078418, -10645076, 2653216, -2517388, -2779918, -367757, -2619393, 994822, -3801583, 2846490, -3650185, 351114, 9862856, --2565706, -9434433, 6433324, 4698694, 3994320, -2128693, -1080721, 43309376, 3600793, -25885768, --38356744, -20151986, -16094316, 5238250, 31480500, -420370, -13535589, 28391344, 2166274, -22780506, -20400020, 22397180, -4265977, -347355, -2349347, -20177756, 22306450, 1324997, 12578885, -7087770, --18209588, -31436476, 5526549, 4010963, 4653060, -4414690, 9673340, -10447508, -353798, -20162724, --25376814, 8835285, -3424700, 8000987, -3881577, -9336185, -23021024, -35350804, 17858474, -19770808, -7835094, 16962436, -1465121, -9137006, -17631914, -12549894, 40396316, 9190156, -2151242, 5223754, --5677947, -16520055, -5708012, 23512262, -23130010, -38470560, -13733695, -12280922, -54114976, -42126648, --22967338, -23483270, 5427765, -368293, -19071802, -36010080, -14560476, -17097192, -12549358, -9964324, --7607461, -21618718, -20960514, 16103980, -18665390, 980326, 2367064, -22671522, -4351339, -16602733, --20982526, -5194226, -3777424, 9334038, 3575560, 12615393, -13579613, 3157338, 7103339, -285078, --18128520, -10235981, -12322798, -1395328, 5294084, -6260989, -9081708, 15062450, 8636105, 10760504, --18563922, 2801393, -9297530, -1285269, 250719, 1516124, -2685965, 17959942, 908386, -3513820, -1770063, 6087043, 8668318, 7261179, -1763084, 10489384, -8355322, -4488241, -3930432, -14491220, --988916, -4673462, -18782966, -15582141, 2022930, 389768, -921807, -5043366, -4634270, -1770063, --3324305, 29300266, -3157875, 27896886, 42199664, -8069170, -45041324, -44302052, -9141838, 20718922, -3200288, -34840236, 27388470, -6248104, -22297860, 27443230, -51920248, -11312944, 544387, -9582072, --7738458, 63009856, -26286810, 59029492, -2683281, 12168716, -4144107, -23760296, 38261716, 9781788, -39771396, -27390618, -26458610, 8331700, -42825656, -13196287, -6693707, -30231738, 62512712, -5711233, --64409476, -1264331, -28599650, 8142185, 16119012, 25637196, 21243446, -25793962, -15779710, -39980776, --11444477, -18655190, 17207786, 10994579, -1973001, 11457899, -7770133, -28421410, -11364483, -33121714, -33890512, -25658672, -17403744, 30039538, 7325604, 50947440, 24971476, 4268124, 27173184, -36393944, --13348221, -37563784, -36154496, -5783711, -5127654, -45771468, 47159276, -8439611, -36323076, -54466628, -3711389, -10923712, 39942660, -2675228, 2217277, 5214091, -6982006, 7425999, 9101573, 18568754, --12364137, -12708808, -7919920, 472446, -2146410, -2704219, -11678553, 13111461, 8293045, 15663209, --3564286, -8572218, -7154879, -2839510, 3081102, 21028160, 22519050, -3685619, 1358820, 12140799, --3267933, -28072444, -13502303, 1743220, 3974992, -2202245, -17769890, 6277095, -2013266, -4233227, --20375324, 8057359, 7038915, 24445344, 4098473, 6066642, -1103270, 10104447, 1856500, -5737003, --10763725, -775242, 1302449, 7991861, 3744675, -4575214, 782221, -84434760, 43488692, 10273562, --18504330, -13590350, 26776974, 15047418, -16578037, -4284767, -40075804, -16505559, 16706886, -34283504, -1088774, 6333466, -10759967, -22826678, -15916075, 31071404, 12182675, -6082211, -44712220, 15182173, -27733140, 16270410, -34684008, -22826678, -110595, 37582576, 3081639, -8965207, 5643587, 1306207, -18884972, -49845780, -43468292, 53557168, 8024073, 22453552, -51133196, 11160473, -2567854, 37359772, --33709588, -6316823, -51270100, 17907330, 36462660, 8688182, -22941030, 14676977, 53043384, -23835994, --25733296, -19894826, 7286412, 2287607, 46485504, -13911936, 3287798, -25169046, 7975755, -27608050, --1212791, 17812840, -34864932, 33095944, 9721658, -23953570, -37696928, -22649510, -2201171, 33381022, --60625072, -13094282, 54263692, 7233262, -24935506, -11534672, -17682380, 51445656, -6015639, -53846540, --6578280, 9127, -13604846, 21997748, -4088272, -7529615, 16347719, -1480153, -11375221, -14105209, --1801739, -12437688, 3461744, 9165460, 11780558, -10826002, -8304320, 11217381, -7674570, 10621991, --5957120, -10802916, 14484777, -8129300, 13009456, 18369038, 849330, -26625040, -2152852, -15873662, -6263673, 9824201, 6074695, -18613314, -159988, -14060112, 12781286, -3962644, -8410620, -5381057, -2484102, 4488241, -10306848, 4556424, 55711096, 28860032, 12746926, 13153874, 13305809, -8687108, --8934606, -18665928, 2246268, 6271189, 4806069, -928250, -32294932, 15577310, 6179921, -22185116, --19105626, -9525701, -11227581, 8484171, -8422968, -9334038, 2624762, -640487, -17211008, 22029424, --15842524, -4948876, -16457778, -14679661, 10521059, -6187438, -2276870, 5625871, 6822556, -1672890, --21863532, 5291400, 33774012, 7344394, -53298932, -3263102, -11668352, -16432545, 11075647, 12087649, -27400818, 13341779, -34810172, 37702296, -9444633, -25994752, 78216184, -15711527, -6830072, -25767120, --62407484, 28594282, 31506806, 10505490, 11813844, -53179212, 15348603, -4099546, -13036836, -9315247, -1996623, -5002563, 8195335, 10195179, 2061047, -7841537, -15383499, 16208133, 20143396, 28309204, --14120779, -2812667, 5855114, -4108136, 14658723, -36499704, 3384434, 6511708, -17286706, 2876554, --14431090, 5635534, 94489, 4525285, -2527588, 1044751, 1236414, -705985, -667331, -4838818, --3968550, 9786620, -5580773, -347355, 7037841, 1619740, 140660, 11949673, -10036802, 7320772, -8381629, -528281, -1913408, -10110353, 7987566, -18905910, -5505611, 12326019, 3360275, -5169530, --12990129, 3852049, -3179350, 15328201, 1974074, -32019518, -75758392, -128835600, 10741713, 130523520, -12851616, 277747488, 281244672, 101683352, 282243776, 163164736, -47176456, -4716411, -25176024, -213886688, --176745424, -124573376, -221391600, -212068848, -60050624, -133543952, -115755272, 26121454, 37507412, -28927678, -41635412, 60364692, 316754, 4109747, 120961848, 80277768, 31115964, 89006216, 167162816, 78376712, -92341800, 206156816, 82069312, 37010808, 178858000, 171901232, 8021389, 109941496, 195097280, 333934, -49908056, 115344032, -4023311, -94321776, 47221016, -19685446, -180954496, -169230832, -154954896, -302198208, --446173024, -310969600, -434073568, -579060928, -408065920, -331177952, -447165152, -285944416, -137048656, -132619464, --24606942, 133470400, 269739520, 304795584, 408446016, 555062272, 545955328, 515991456, 581759744, 580354240, -474490816, 381565984, 409119808, 271596000, 97252552, 129553928, 32440424, -238121584, -152527168, -161809664, --331832928, -280684160, -201229424, -236272064, -272879680, -170083920, -148028736, -206746304, -169966352, -88458072, --141257184, -186792960, -111631032, -79064440, -147512256, -83426520, 20434918, -46120968, -52147884, 59876676, --1134945, -74912816, -8647917, -47011100, -169132048, -117944632, -88434448, -157402496, -69536056, 39788040, -76739792, 140245184, 233785808, 270999552, 285020480, 318847648, 340082496, 334289120, 308949344, 286983808, -244514640, 193994544, 120013200, 89642944, 12015171, -75082472, -131315944, -211596928, -303880736, -296107936, --251233040, -228165312, -197125584, -135089072, -112981800, -101404712, -72184440, -47499652, -41632728, -17080548, --9271761, -6615860, 2203318, 19368156, 32132260, 40164924, 47959752, 54702852, 53946400, 52291764, -45088568, 44095892, 31992674, 25121264, 12984760, 7540889, -5583458, -14230837, -19115288, -18086644, --23982024, -23631984, -23475754, -23972360, -27299886, -19643032, -20133196, -12510703, 391379, 16029892, -23229868, 37631428, 44074956, 48703320, 51840792, 59017144, 55560232, 53575424, 51616380, 45845556, -30826054, 26853210, 21355652, 13776108, 4422206, 4271345, -6287296, -12198781, -18655728, -24482388, --35243428, -37953552, -45371496, -50705312, -55515672, -54788212, -59144920, -57855356, -54980952, -47741784, --41799160, -28247464, -18182744, -5893769, 2178085, 14578730, 20051054, 26979910, 29865592, 33560876, -31608812, 33571612, 29987462, 30001420, 25057376, 23674396, 18112950, 15127949, 8839580, 7357279, -2134599, 1916629, -1234803, -295279, -3041374, -1414118, -3238405, -1148904, -2823404, -493921, --2150168, -537, -1699733, 513249, -1098975, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ -10289668, --462246, -504122, 3228205, -1289027, 3693135, -1934883, -4823785, 1726577, 4772246, 752693, --782221, 6429566, 181462, 307627, -2214056, -1171452, 9918690, 1428614, -6790344, -4952098, -6986301, -595390, 7246684, 555661, -1416266, -640487, 5465883, 1133335, 11511049, 5128191, -3146601, -576063, 2533494, 5267241, -1314260, -3846143, -4918812, -891206, 4378183, 3836480, -5851893, 1698660, -3316789, -3374234, -1451699, 2502892, -815507, 1398012, -696858, -5187247, --4066260, 1648731, 3795677, 2399276, -1918777, -2112587, -170725, 5754183, 2879239, -578747, --1300838, 2693481, 1762547, 1182727, -2933463, 1510755, 2714419, -303332, 4158065, 4980552, --8637179, 3212636, 1739999, 5672041, 1677185, 495532, 2547453, -1091995, -4035659, -1444183, --2438468, -759136, -516470, 2494839, -140660, -1909650, 13422, 337155, 1444720, -1222992, -222265, -197569, 507343, 796180, 508954, 1013612, 84289, 645319, -1299765, 2907156, -4461398, 9722732, -7909183, 1799054, -1756642, 134218, -10155987, 1039919, 6067178, -8987756, --1894081, 6041945, 15949361, 2311229, -135291, 1157494, -10033044, -301721, 7349226, 6568079, -152471, -187905, 580357, 3456375, 5726802, 6083821, 6527814, -2909304, 1389959, -380641, -2500745, 726386, 1602560, -10136123, -2810519, 1600949, 802085, -5598490, -207769, 3847754, --4494684, 3543885, 3228205, 6026913, 2787434, -2283312, 2972654, 6732898, -3790309, -6052683, -2007897, 1421097, 1156957, 3197603, -2718178, -4893042, -7340636, 5918465, -1116155, -1370632, --2407329, 2603287, -119185, 3841312, 7543573, 1542967, 486405, -397284, -1856500, -5896990, -9156870, 2269890, -1125281, 4756140, -775242, -5436892, -4816269, -1056025, 1778117, -7933879, -625455, -4701379, -918049, 2428804, -166967, 1278827, -1450088, -2593087, -580894, 1315334, -1769527, 1335735, -305480, -795106, -76773, 1298691, -714038, -1321776, -1017907, 252866, --529892, -4781909, -4100083, -5185636, -7303055, 4075387, -68719, -3529926, -1368484, -1817845, -1615982, -2937758, -5007395, 1116155, -3247532, 8567923, 11451993, 9008694, -6229313, -269509, --388695, 2388002, -3447248, 7060926, 4469987, -1042066, 3456912, 5347771, 458488, 1273458, -1899449, 5194763, -476741, 1913408, 6275484, 606664, -48855, -2761664, 4521527, -6825777, -2767570, -982474, -1374390, 4497368, -4353486, -583579, 176094, -5937793, 2476049, -1222455, -2757369, -222265, -2531883, 1762547, 1900523, -343061, 5268851, -406411, 6074695, -122943, --4003447, -1823214, 252866, -2779918, 5419175, 2784750, 4654671, 5223754, -2277407, -5236102, --3380139, -39192, -945967, -1142461, 4303557, 5372467, -788663, -2995203, 1900523, 1441498, --2051921, -2860448, 989453, -4093641, 1008780, -112206, -108448, -1121523, -3825205, 834297, --1495186, 124017, 1738388, -35433, -1945620, 950262, -2675228, -83215, 190052, -652835, -243203, 481573, -1455994, -9127, 195958, -1780264, 386010, -559956, -91805, -952946, --9664, 451508, 1542967, -15125264, -3554086, -4716411, -8164196, 2778307, 2152316, -981400, -3813394, -533113, 3220689, 4525285, -1978906, -5291400, -6649146, -2546379, -6190659, 482110, -701153, -2706903, 3538516, -3040300, 1905892, -1390496, -3522947, -9411884, -3644280, 836445, -1498407, 2471217, -3479461, 2496987, 3802657, 1251446, 8604967, 2135673, -198642, 6646999, --4676146, 3839701, 654446, -2234994, -3158412, 4287988, 600222, 1356673, -10109816, -1866700, --3324305, 10184441, 4389457, 3670587, 4158065, 4677757, 3725347, 5187247, -2716030, -1107565, -3204583, 5096516, -657130, 5952288, -3172907, 1306744, -1261110, 5043366, 7573638, -11778948, -3118683, -2909304, 406948, -5553393, -2828236, 936303, -1657321, -2381023, -4686346, -2119566, -2253247, -106837, 5077725, -523449, 1977833, 4381404, 6983617, -251792, 1869385, -805306, -3269007, 527744, 1608465, -2148558, -724239, 239981, 1513976, -954020, -1540820, 86436, -123480, -1210107, 221728, 716723, 66035, 2037425, -853625, -936303, 268435, 1777580, --676457, 51540, -602906, 1064078, 1666447, -214748, 1596117, 1715303, -372052, -719407, --263067, 5914707, 3607236, 2151779, -1136556, 496606, 625992, 7631083, -6069326, 7654169, --1032940, 4174708, 7817378, -4897874, 6051609, -3789772, 3095598, 1192390, 9190156, 4077535, --5151277, -8440684, 1900523, -6328635, 5183489, -1298154, 6761353, -5057861, -848256, -4051228, -2313377, 1504849, 1913408, -511101, -750009, -7375533, -3262028, 6054294, -4860293, -988379, -3908957, 178241, -3813394, 1223529, 307627, -858993, -3311957, 6613176, 2078227, -9447317, --4292283, -7630010, -1369021, -6749541, -11649025, -2661269, 5030481, 14289356, 3090766, 1163399, -6703370, -197032, -5316633, -4633733, 3725347, 1446867, 2501819, 4107599, -10161893, -2510945, --9350681, -2068564, 2570538, -3713536, -8647380, 846645, 3684545, -1866700, -3241090, -1542430, -1455457, -1305670, -402116, 1858647, -1222455, -1301375, -1777580, -1292248, -3984119, 1383516, --1069984, 1787243, -710280, 1034013, 2447058, 321586, -715649, -261456, -2146410, -1423782, --3374234, -3056943, 417686, 333397, -44560, 1156420, 1904818, 1332514, -44560, 1210107, -1004486, -942208, 718870, 761283, -1782411, -753230, 16357920, 4006668, 11818139, -5493263, --867583, -3882651, -1009854, 12744242, -10887742, 3712462, 1132261, 16661252, 8731132, 11086384, -1915555, -2647311, 5096516, -3530463, -13835163, 2700461, 686658, 1698123, 10733660, 1115618, --6458557, -475668, 188979, 3519726, 3652333, -241055, -1514513, 4504347, -5273146, -1343251, --2718178, -1245541, 1239635, 280247, 9442486, 1455457, 7393250, 8716099, 2292439, 7696582, --662499, 2600603, 4531728, -4919348, -7562901, 1014686, 7419556, -11933030, 3476776, -9139690, --8710194, -5206037, -2486249, -8033737, -7953206, -8239895, -4362613, -1995012, 5482526, 208843, -6587943, 1085553, -5607617, 8505646, -8868034, -3254512, -3729642, -3530463, -4748087, -6051072, -8652748, 6879464, -3926137, 3413962, 2654827, 6987375, -73014, 5065914, -2556043, 6349573, -3073586, -3639448, 115427, -3282429, 3901441, -3754875, 325881, 3157875, 137439, 2431488, --771484, 446140, 1547799, -486942, -1777043, 1624571, -547071, 335007, -3326989, -2616709, --2673617, -1953673, -433792, -1064078, -2326799, -40265, 375273, -988379, 171262, -14496, --1392106, 348429, -8904004, -8906688, -5283347, -5457293, -2950643, -2230699, -10675678, -8531953, --7262253, -1078037, -650151, -1309428, 7362648, 775242, 3788161, 5702106, 6606197, 1075889, -12940200, 16269336, -365072, 4734665, 3634616, -1939715, 7072201, 3882651, -14623827, -455267, --5079873, 877247, 11254425, 4523138, -11700565, -3068217, 5160940, 5184026, 681289, 14971719, --6222334, 6055904, 6063420, 6686727, 3860639, 7783555, -13182328, 4848481, -5165772, 7842611, -256624, 3396246, -9906342, 7278896, 5215164, -1243393, 5048197, -821949, 1382980, -66035, --5185100, 1369558, -3328600, 3253438, -4098473, 5084168, 1552631, 12687333, 9426916, -2954401, -3343632, -10409390, 9050570, -2827162, 5535676, 9843528, 9607305, 477278, 9813463, 6828461, -4620848, 5020817, 9013526, 918049, 1916092, -7373385, -1321776, -2103997, 1658394, -5314485, -759136, -3868692, 1170916, -3854196, 1145146, -1407676, -2462090, -2269353, 1558536, 180389, --1262184, -901406, -3183645, -1005022, 513249, -903554, -2308545, 347892, 2306398, -5385352, --3381750, -2967823, 2133525, -3299072, 1990181, 32749, 1123671, -2731599, -4085051, -900869, -747324, 8596377, -7664906, -1971927, 6791954, -3610457, 11656541, -3705483, -8295193, 15561740, -21082920, 4718559, -8373039, 5857262, -4433480, 8698919, 5009543, -1868311, -8879308, -5760625, --15072651, 3959423, 6370510, -13240310, -1619203, 7732015, 1970853, -621160, 274341, -1603633, --7223062, 1767916, 8865349, 386010, 1883880, 3245385, 12574054, -8289824, -268972, 9188546, --8421357, 12334072, 606127, 17325362, -14431090, -12952548, 7107097, 664646, -1758789, 3743601, --1220845, 4842039, 2928631, 9647570, 9139690, -7551090, 1358820, -4925254, -3015604, 5785858, --742493, -2935610, -1307281, 302258, 8583492, -16413754, 12506408, -3896072, -5622112, 9328132, --7529078, 7485591, -10121627, -5640366, -1896228, -7467338, -2615635, -5262409, -8419747, -5622112, -1813013, -1878511, -2039573, -86436, -3932580, -1213328, -602369, 5243618, -288837, 793495, -2076080, -2155537, -877247, -1818382, 1243393, 2587181, 676994, -1007707, 6098317, 76773, -4519380, -4887136, -3205656, -2883534, -2127083, 2379949, 1115081, 213675, 3538516, -2602213, -2696703, 1124208, 2506650, 1481764, 335544, -3075197, -10413685, -8028905, -3461207, -7532836, --11357504, -2441689, 4192962, 13958107, 2319282, -8495982, -15612743, -3311957, 4900558, -2782602, -16855600, 5245766, -5903970, -11934104, -14817637, -28192702, -2255932, -3149822, 10827076, 7934952, --5723044, 688805, -4418448, -2479270, 10164040, -310311, 581431, -1276679, 11525545, 1901597, --3402151, -613643, -381178, 3063922, -10405095, -3335042, -4065724, 16488916, 3899294, -17431124, -4529043, -9067213, -5034776, 2517388, -16137803, 4992363, 11710228, 10302553, 8113193, 1926830, -3303904, -566399, 1763621, -10247792, 3752728, -16019691, -3020973, 9108015, 3390340, 9331890, -9292162, 7602629, -5186710, -11834782, -10268730, -8018704, 2637110, 3150896, 5504538, 5385889, -1222992, 3586298, 11579769, 16111496, -3830037, 5717675, -3975529, -4382478, 4982162, -7125888, --2464774, 255014, -4452808, 4167729, -3863860, -3435437, -1833951, 975494, -986769, 2254858, -78383, 3279208, -746251, -2043868, -892279, -2001455, -5068062, 1333051, 2778844, -279173, -1838783, -525597, 2502355, 4671851, 4544613, 3477850, -3577171, -1862942, 3503620, -1087164, --1352915, 296353, -548145, 3456912, -753230, -229781, -503048, 8207146, 14605573, 16855062, -12236362, 20843476, -9737228, 14806900, -12678743, -9988483, 11016054, 14021994, 16616155, -17139604, --69793, 4293357, -12651363, 5987185, -5545340, -9002788, 10274099, -13346074, 14492830, -13717589, -13579076, -9849434, -3593277, -914828, -17889076, -2501282, 19790136, -5065377, -14089640, 3010235, -9206262, -10307385, 5134097, 21356188, 11521250, 4318053, 9484898, -11308112, 7580081, -6794639, --19430968, -5909338, -5058398, 1440425, 8858370, 10901701, -4798016, -8536248, 7802882, 53150, -5979668, 3713536, -3139621, 1064078, -7710540, 1178432, 2493766, -103079, 2572149, 17577690, --2146410, 1739999, 5058935, 1050120, 2194192, -8938364, -9750113, 6799470, -11612518, -15819975, --16563005, 12911209, 8393977, 2489471, -860604, -1917166, 6203007, -973347, -4616553, 5919002, -16297253, 10992432, -4255776, -2759517, 5078799, 2914672, -1095754, -2572149, 1884417, 2296734, --635118, 670552, 8873939, 2117419, 1312113, 3463891, -2820183, 650151, 2861522, 5890011, --512712, 428960, -5696737, 1872069, -2937758, -2178622, 6067715, 4833986, 372588, 3791383, --3202435, -1564979, 1867237, 45634, -1668058, -3302830, -3515431, 2303176, 1096290, -1542967, -2126009, -13518410, -21475374, 7644505, 27878096, 13653164, -5236639, -21563420, -7502771, 1376000, -2998424, -4190814, 10574209, 7141994, -7849053, -4055523, -1066763, -14272176, 19808390, -9035001, -7044283, -1660542, -4693326, -17391396, 5676336, 3604015, -2188823, 2093797, 7765301, -2849174, -19364934, -4351339, -2981244, 16159814, -1829119, -11621108, -10405095, -20068234, 2733210, -4467303, --6254546, -4388920, -14737107, -6179921, -13802951, 1451699, -12152073, 10939282, -6878927, -247497, -3383897, 1337882, 6305549, -5848672, -14913200, 6455873, -1739462, 3678640, -3353833, -1529545, -417149, 14313515, 21435644, 5802501, -6760279, 7388418, 7767449, 8496519, -3528316, -7203197, -10921028, 5152350, 14602352, 3373160, 3885335, 386547, 4377109, 13138842, 17960480, 8818642, -3017752, 6726993, 2825552, -3786551, -12334072, -7840463, 1384053, 5939403, 924492, -339302, --4629438, -1739999, 2511482, 1686312, -9751723, -1876364, 2182917, -437550, -4863514, -4083440, --5434744, 998580, -970126, 3666828, 6884296, 4028679, 213675, -2326262, 4207994, 5046587, -328028, 1664837, -6808060, -282931, -2312303, -7001334, 1458678, 1234803, -6232535, -676994, --1464584, 2310693, -2423972, 5819144, 27917, -1424319, 7854959, 41753524, 924492, -11023034, -34548716, 17670032, 15231565, 30259656, 29904246, 8709120, 9466645, 7661148, 32508070, 1792612, --11556683, 14183593, 2944737, -12614856, -14381161, 12640089, 12089259, 23517094, -2351495, 1800665, -258235, 3306051, -13966697, 15752329, 10835129, 4902169, -10861972, 16664473, -5080410, -787590, --22064858, -4716948, -1723356, -1312113, -11666742, 7685307, -10856604, -6095096, -6386080, 3220689, --7541963, -10056129, -14111652, 14921790, -10757282, 15863999, 6914361, 13041668, 3935801, -13117367, --737661, -21135534, -9901510, -11489574, 4352950, -14659260, -8122857, -2610803, 3221, 15342160, -1472100, -2330557, -24581172, 9752260, 8143795, -519691, -378494, -12320114, 9326521, 1086627, --10792179, 29006062, 6332393, -3721052, -534723, -11620034, 1745367, 14553497, -4031901, -1157494, --16294032, -9491878, 5640366, -2215666, -7852811, 9431748, 5537287, -9549860, 8320963, -3286187, -2488397, -3177739, 8134668, 1832340, -1537061, 261456, 1797981, -11518565, -103616, -4239670, -3190624, 3983045, 5410048, -4717485, 3879966, 3123515, 2232846, 4262218, 4749697, -341987, -3599720, -5538361, 9506910, -4400194, 8000987, -5699422, 3394098, -12678743, -23252416, 7141457, -7002408, -7194070, 15134391, -16734803, 18177912, -13114146, -7638600, 5851356, 4205847, 46917148, -18330920, 7028177, -29279328, -779000, -6950868, -15518254, -4510790, -5672041, -5138929, -1737314, --24349780, -468688, -9214852, 301721, 11850352, -12915504, 15378130, -5042292, -17027398, -15187541, -12182138, 9347996, -3811247, -8385387, 15538118, -8386461, -7925289, 12217034, -354335, 3759707, --12592307, -424128, -7406134, 15669651, -2368675, 22478248, -8414378, 3378529, 6766184, -642098, -852014, 6857989, -14500883, -2323577, 18462454, 1498944, 5061619, -171262, -14987825, 6403260, --10465762, 5325223, 16137803, 20950314, 22836342, 24054502, -5201206, 8442832, -205085, 12908524, -29139742, -32017370, 24879672, -14802068, 6677064, 20012400, -12641162, 1289027, 6269579, 5457830, --1509144, 13929116, -5412733, -4404489, 5874979, -3340411, 13402982, -1990181, 5070209, -10815801, --1774895, -323196, -8730058, -3665218, -11008538, 114890, 3160022, 1068373, 12184822, -4028679, -804770, 1316408, 5168457, 1275605, 5213017, -7233799, 5423470, 1671816, -326954, 3877819, -5316096, -6082748, 5522254, -11696270, -10357314, 7212861, -3487514, -8297877, -1215476, 3395172, --5355288, 9415642, -11256036, -24722368, -4832375, 5019743, 322123, 5819144, -18398030, -2472828, --3786014, -26129508, -20268488, 10424959, 10835129, 5050345, 7463043, -13359496, -6593312, -9458592, -28570122, 6903623, 763430, 21461952, 12298639, 10814728, 9666361, 8469676, -15126875, 10907606, -4371740, -4587025, 8497593, -7557532, -7555921, 14997489, -6529424, 9476308, 19683298, 757525, -3738232, -278099, 1238024, -4218195, -11613592, -14539001, -23801098, 9817758, -20168092, 7640747, -7787313, 10214506, 23085, 706522, -2864206, -15391015, -7396471, 7963406, -5416491, 8216810, -19689204, -5964636, 15050639, 7023882, 1629403, -752156, -5432060, -14230300, -652298, -19266150, --6779606, 20881058, -11143293, 3414499, -34302832, 16380468, -6392522, 5362804, -26480084, -23386096, -2174864, 6436546, 12046310, -27154394, -2936684, 478352, 18549964, 15372225, 17164836, -5348845, -317828, 2756832, 8953933, 2289755, 4903242, 14374719, 8031052, -5272609, 5114769, 1541893, -970663, -151934, -3069828, -11585137, 4079145, -5524939, 1709397, 4821101, -197032, 1216013, --206158, 4839355, -2946348, 19360102, 5162014, -576063, 10650982, 6664716, 841277, 3398393, --377420, -8373039, 11195369, -3492345, 1460289, 13643500, 7417409, -3997541, -2684, -5157182, -8799851, 6343130, 7504919, 6675453, 20433844, -48400524, -11907797, -28752122, 9699647, -25822954, --8657580, -29264834, 7824894, -15265924, -11705933, -2510409, -24850680, -9047885, -26626112, -13458280, --30828738, 6635188, -28522878, -11290932, -14820858, -8318278, -7836168, -6676527, -27227946, -15583215, --20715164, -10644540, -5985037, 11740830, -1705102, 8759586, -16946868, -2775086, 975494, -19541028, -3773666, -1385664, 1654099, 5096516, -19764366, -1134408, 7289097, -2462090, 8216810, 16393353, -29733522, -24717536, 1518808, 33031520, 160524, 16204912, -11584064, 20462298, 3743601, -4909148, --27478664, -16199543, 22818624, 14068165, 22282290, 797253, -15542950, 5659693, 8051990, 15916612, --29880624, 196495, 5661304, -16512539, -5496485, -7148436, -10002979, -23964844, 37035504, -6822019, --11898133, -7617662, 7679402, 8875550, -20929912, -19472844, -771484, 6180995, 971736, 48318, --4081830, -7085623, -89657, 18644990, 11563126, -136365, -15367393, -10649908, 1727114, -5942624, -4072166, 4912906, 2512556, -1633161, -7926899, 3229279, 3930432, -2205466, 5950141, -3473018, --13646185, -6495065, -779000, 3951907, -1013612, -4401805, -19968376, -7995619, -4572530, 1497870, -2506114, -8642548, -15467788, 6047314, 9290551, -8218420, 372052, -7226820, 7824357, -2532420, --13719199, 20590074, -34749508, -365609, -6883759, 15025943, -7646116, -21415780, 18715856, -37593848, --32413582, -26754426, 15353434, -7954280, 871878, -14585172, -13802414, -16129750, 9084393, 7867307, -26230976, 12353400, 5324149, 24424942, -6468758, 8869644, -8777839, 7652558, 4440996, 14565308, -23536958, 12304544, -4861366, -14352170, -8548059, -2908767, 13234942, -4325569, 3716221, 530965, --6033892, 12520903, -756451, 10286984, 7646116, -19981262, 16547972, 30373472, 4763656, 25415468, -24601572, 11182484, 8172249, 102005, 13019120, -8036958, -29461328, -9558450, 21953188, 264141, --10806138, 11337103, 31161062, -7051800, 2426657, -22462678, 22228066, 19946902, -1400159, 6461242, --10116259, 51125144, -31996432, -27755690, -26209502, 2295660, 981937, -7656316, 22814866, -31894428, --496069, -20355998, 7864085, 9140764, -1386201, 22272626, 5167920, -1787243, -11958263, -52076, -5657546, 16263967, -11023034, -14159433, 6007049, -8392366, -2177549, 2087891, 3938485, 1436130, -154082, -949725, -13351443, 1398012, 3282966, 9342091, -7873749, -4373351, 5264556, 2581275, -3683471, 455803, -8699456, -858457, -9883793, -7444789, 10085120, 5217312, 5710696, 4057134, --269509, 2084133, -2641405, 6208375, 906238, -2583423, -514859, -8602283, -3212099, -5665599, -3605625, 56146496, -12625056, 31411244, 53327388, -17985712, 25399362, 11656004, -34111704, 31150860, -4365298, -14500346, 22434762, 9965935, 21057688, 82678, -18367964, 17329120, 5544266, 350040, -5047661, -4907000, -19415936, -11125039, -9469329, -16264504, -12593381, -2874944, 12362526, -11120744, --7166153, -16020228, 3109020, 1644436, 2267206, 22584012, -13710072, 5632313, -12745315, -6760816, -12476880, -9992241, -23264764, -29204168, 33566244, 15311558, -8761733, 23624468, -21853868, -18596134, --11800960, -1647120, 3084860, 398358, -20370494, -14485851, -16006806, -34186864, -21858162, -18311594, -6294812, 11781095, -1302449, 20218022, 3444564, -20365124, -18120468, 27194660, -23479512, 3471944, -23272818, -2894271, -41038412, 28625420, -15358266, 4714801, 1478006, 23708756, -6008123, -8886287, --1547799, -13346611, 6708739, -23123568, 7558606, -29774860, -19503446, 11691975, -13033078, -3546032, --1990181, -17641578, 5471789, -10264435, 8157217, -2611877, -670552, 1002338, 10723996, -7900056, --6704981, 2035815, -11565810, -4872641, 1366337, -7247758, -8202851, -5325760, -3684545, -8471823, --5118528, 12148315, -10158671, 4735739, 6947647, -1694365, 7453379, -10319196, 812286, -7234336, -14847165, 2913062, 5126581, -10562398, 12998719, 9233106, 9871445, 4376572, 971736, 3330747, -7089381, -7229504, 462783, -6010270, -27130772, 16314970, -7689065, 27520540, 18867254, -43670692, --5509370, 4770098, -26657788, -4217121, -4362076, 32467268, 23342074, 21734682, 26920318, -872952, --18862960, -14475114, -15014132, 844498, -41787348, 5149129, 35786204, -32488744, -58886148, 6129992, --22035330, 43576200, -289910, 1557999, 29127394, -13215614, 5984500, -1218160, -7913477, 25426744, --7298760, 12927315, 42526620, -31168040, -17861158, -28397250, 14199699, 2493229, 28470802, -16203301, -11216844, 1640678, 25930866, 15396384, -12681965, -8321499, 9810242, -4573604, -1155883, -18204218, --18068928, 9596031, -4034048, -5216775, -10275172, 23589572, -8908299, -9327595, 39385388, 42210940, -27274652, -35679904, -3176128, -11144903, 13903346, 52536040, -6633040, -39860516, -2617246, -16363289, -23542326, 10631118, -26780194, 14205067, 10404021, 13858786, -25838524, -9215389, 1923072, 22985592, -1417339, -3588445, 3760781, -7751879, 1811403, 22969486, 11118597, -9435506, -11438572, -2512019, -7219303, 9240085, 12096239, -11334419, -4328254, -20850456, -4380867, 13345537, -13136694, -1977833, --8109435, -7439420, -12338367, -2498597, 8424041, -1793686, -881005, 2195802, 5374615, -5466957, --15742666, -16254841, 9879499, 7677791, 13798656, -6793565, 10131291, 29702920, 1570347, -17627620, --2833605, 1699733, -1573032, -10991895, -4508642, 3362960, 8637716, -1745904, -25593710, 3745212, --20978768, 19320910, 11311333, -20750598, 35316980, 53223772, 1644973, -2583960, -18114562, -18559090, -3244311, 2984466, -8855686, 48147120, -4208531, 35892504, 28975996, -36424008, -1000191, -12262132, --38730404, 9731859, 9159018, 21166136, 36531380, -1169842, -10241350, 11902965, 13345537, 28579786, -12150462, 2569464, 23732916, 24759412, 8697846, -5761162, 21783000, 9586904, 26146688, 5515812, -7659001, 16210280, 27688580, -4635344, -21644488, -25259240, -8056285, -8807367, 43465068, 23686744, -66998804, -3149822, -33499672, 29620778, -9991168, -11569031, -9909563, -22759568, 3549254, 12744242, --296890, -12756053, 47674136, -9496710, 56225952, -15357192, 30354682, 2626373, -9249749, -30579630, --43438764, 40928892, -3741990, -6990596, -12320651, 38045356, 209917, -39908836, 73418168, 23024246, -8203925, -8383240, -30487288, 15413564, 1064078, 15518791, -14041859, 11082089, 5806259, -6869800, --10308995, 1935957, -12509092, -5940477, -14241038, 1744831, -2298881, -136902, 5051419, 12015171, --11915313, 4743255, -5690295, -295279, 16317118, 10782515, -5494874, -20033874, -389768, -1115618, -2930778, 18445810, -11654931, -6956774, 4871567, 11612518, -16460462, 1205812, 11288248, -162135, --1020592, -17368848, 9325448, -455267, 8520678, -18144626, 2344515, 7844221, 6395743, 9140227, --17220672, 14839112, -18262738, 11761768, 49823232, -29701846, -18738942, 3798362, 9163313, -5839545, -35314296, 27115202, 27821724, 9104794, 13835700, 23009214, 14544370, -8632884, -13648332, -31413928, --4858682, 16925930, 6054830, 3489124, -11434814, -29721174, -8429947, -4351339, 30272540, 205622, --3413425, 22612466, -3444564, 6106370, 5048734, -51025284, 13212930, 13524852, -8701067, -21929566, -4309463, -28862180, -14412837, -44098576, 13450227, -36851356, -72482408, 8237748, -820876, 50969452, --1585380, 17184164, 42418708, -7118909, -10780905, 18575734, -202937, -37058588, -12712029, 4650913, -6308233, 27004070, 11489574, 24026584, 21150030, -15280957, -11125039, 10128607, 31042950, -13049184, --6311992, -28541668, -19413252, 7337415, -38112468, 10910828, -42829412, 7982734, -11178189, 30330522, --13170517, 21446382, -45916960, -9570261, 6446746, -27599996, 7078643, 4678293, 4886062, -20859582, -11006391, -20427938, 5921686, -1724429, -8484171, -3874597, -1890859, 6306086, -6922414, -3397319, --5527623, 13016972, -8446590, 7541426, -19325206, 10089415, -1000727, -1717987, 2914672, 18697066, -6675990, 7908646, -22431540, 2794950, -9130564, -27991376, 11301670, -9058086, -6976638, -10421201, -10487236, -5143224, 5110474, 5720897, -2592013, 1108638, -6732361, 1850057, 5794985, -1439888, -964220, -845035, -10672994, 39035884, 41475964, 97137664, 11383811, -54258320, -40846748, -29954712, --34712464, 68021544, 90636160, 30826590, -8702141, -28438052, 960462, -34431144, 37940132, 35999880, -10612864, 5289252, -22541598, -3168612, 41758892, 9838159, 16755204, 14244259, 43823700, 36998996, --14261976, -32519344, -43154756, -28964722, -4356708, 12117713, 39400420, 23753316, -8260833, 21475374, --29958470, -10083509, -67331128, -10523744, 66218196, 51307680, -10334228, 134342816, 42083700, 4050154, --73618424, -12426951, -6335614, -17147120, 18778134, 10555956, 15909096, 28294170, -60071560, -64566780, --32520418, -43515536, -6243809, 14910516, 54322208, -32366874, 19867444, 84825064, 42330124, 14881525, -23735600, 17421998, -51163796, -84526568, 43301860, -20802138, 18643916, 45486924, 50162532, 4575214, --30338038, -39827232, -32590748, 35201552, 20269562, 6260989, 34992708, -34722664, -6054830, -5431523, --15431817, -17894444, -1533303, -360240, 11359115, 3684008, -4997195, 258235, -430570, 743566, -3006477, 6647536, 10118943, -9945534, -13794361, -47216188, -25915832, -23255638, 27986006, 16722455, -10014790, -38626252, -37971804, -61038464, -16681653, 24223078, 30775588, 40193376, 15720654, 11870753, -4691178, 4038343, -1125818, 9148817, -2125472, 28835874, 20327544, 4234838, 251256, 362388, --4901632, 95026, -3437585, -20665772, -88855360, -21197812, 49562312, 94849520, 83600464, 200366672, -104897600, 71143448, 62631896, 28474022, -11193222, -101255464, -127066608, -189608304, -145167216, -148958592, --56646860, 721555, 57047368, 106081400, 87547536, 90435904, 62362388, 85089744, 66643396, 94214400, -44893684, 35119412, 16821240, -24260660, -37267432, -57130580, -34507916, -124069256, -52380348, -117431920, --84691384, -134404016, -79864920, -125110784, -44407816, -62033824, -20174536, 9552544, 63513440, 166483664, -158586832, 222144304, 150401168, 102548784, 133221296, 181897776, 160131952, 134443216, 93853088, 11283953, --90948616, -90345176, -111925240, -213090512, -235185424, -256234528, -255807712, -280960640, -242934624, -204712096, --180480976, -117586008, 13536663, 133675488, 232635824, 307434304, 383318304, 426441920, 297354016, 283510240, -184050080, 111439368, 105385616, -6365142, -34787624, -163440688, -313117088, -337312768, -273761760, -211687120, --124660352, -100955352, -102715752, -56740812, -88209504, -35779760, -9798431, 67680096, 128664872, 105603584, -137536656, 147721104, 157682752, 139170368, 185894240, 138049920, 113196544, 58380416, 12022150, -31498216, --144003808, -127659312, -170960640, -226791984, -205370304, -235537088, -241945712, -70679056, 7909719, 122815664, -150490288, 160145376, 186028992, 194166352, 164831712, 143226960, 109942032, 83212304, 30141544, -21665426, --64131916, -115826144, -169924480, -159350272, -142110272, -106482976, -50061600, -22230750, -10474351, -6448357, -15658914, 32527934, 39698384, 42518564, 35276712, 28041304, 30631170, 24751360, 18669686, 33991980, -38386808, 29316374, 14464376, 7485591, 12199318, 15668041, 6249178, 3095061, 6237903, 836445, --11827266, -35400196, -42541116, -28210956, -21598854, -24828670, -23589572, -14520748, -20495584, -23381266, --20064476, -8260833, 1870995, 10173167, 14108431, 18976776, 21678310, 20010790, 17019882, 19320374, -19576998, 17012902, 11996381, 8338142, 2926483, -1067299, -2303176, -3824132, -7774428, -4822175, --2280628, -4078072, -5760625, -3799436, -747861, 3356517, 2638721, -446677, -3553012, -2975339, --5353677, -9904195, -12313671, -11530913, -10953240, -9507984, -10278394, -8945343, -3889093, 282394, -1404991, 7608535, 16209207, 19364396, 16056198, 14565308, 14669461, 12628278, 7373385, 3803731, -2605435, -46171, -4412005, -6541235, -7711614, -7814156, -7621420, -7081328, -5683853, -4032438, --3651259, -3367254, -2847027, -1453846, -804770, -248571, -53150, 542240, 504122, 650688, -344134, 396211, 47245, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ -12934294, -573915, 2186138, 1808181, -5255966, -2726231, 7173133, 12464532, 2024003, 6643241, -2678986, -1261647, -326954, 5629092, -4437238, -10154376, 4129074, 4765803, -5904507, 6880001, 3404299, -6278169, 2005213, 1502702, -2713883, -863288, 351650, 4191888, 402653, -6275484, 303332, --493384, 1388348, -859530, 1149441, 1527398, 3778498, 2739652, 925565, 1192927, 403190, -1860258, -1905355, -3115999, -6935836, 1369021, 1565516, 587874, 5372467, -1866163, 4183298, -1171989, -1620813, -3264712, -2094870, 7504919, 1637456, 4201552, 732292, 1675037, -1398549, -286152, 538482, 2180770, -607738, -2754148, -1468879, -5766531, 683974, 1167157, 5000416, --1558536, 3832185, -624918, 2523293, 80531, 2277407, 1773285, 1084479, -890669, 2613488, -3586835, 2520072, 2357400, -37581, 542240, 622770, -1917166, 867047, 484258, 1768453, -932545, 754841, 962073, 1278290, -650151, 790811, -484794, -24159, -203474, 4871567, -4546760, 2192044, 1811939, 2607045, 2979097, 4603668, -2053531, 4774930, -27917, 5095979, --1180042, 9010841, 2954938, 3030100, -6167573, -775242, -1460826, -7841537, 4248260, 3725347, --2581275, -10297184, -4804458, -1481764, 4975720, 7031399, 4306242, -2704756, 1404991, -4372814, -132070, 461172, -3701188, -1727651, -9464497, 849330, -1257352, -3854733, 328565, 615791, --1352378, -223338, 8902393, -2085207, 7236483, 1498407, -5735929, 493921, 468688, 4188667, --1928440, 1241782, 893890, 389768, 5521181, 2018635, 5670431, 4304094, -3033321, 5318244, -2471754, 3903052, 278636, 1324461, -1425392, -2421825, -4818417, -5759015, 5992553, -5986648, --4757750, -4939750, 2726231, 2610266, 1034013, 1172526, 3477313, -2223183, 2596845, -1661079, --2509335, 3958349, -3661460, 673773, 1736777, -2943663, 646929, 507343, -552440, -402653, --348429, 2109366, -752156, 829466, -987843, 1635846, -520765, 945430, -1167694, -1118302, --1125818, -8057359, -7562364, 1656784, 112206, -1597191, 4471598, -560493, -824097, 4712653, --5193153, 1040456, -4539244, -2883534, -1665374, 78920, 7605850, 8715562, -4078608, 3431142, --6301791, -571768, -2495376, 8465917, -2542084, -452582, 836445, -11860015, -2115808, -5845451, --1983738, -1433982, 4377109, 5903970, 2358474, 7971460, -1069984, -3598646, -3725884, 4611721, -11876121, 8360154, -4706748, -5421323, 5913096, -5334887, 964220, 1922535, 9718974, -3579855, --4872641, 1082332, -3044058, 1886028, 2434173, 6229850, -6861747, -4398584, 3933116, 7521025, --747861, -3470871, -4480725, -10601053, 3971234, -6979, 3106872, 507343, 219043, -1658931, -1890859, -2700998, 1624035, 2301566, 2254858, -3760244, 2709051, -683974, -2704219, 259846, --5633924, 3498788, 466004, 446677, -2276333, -757525, -1936493, -3884261, -3013993, 2068564, -130460, 837519, -788663, 272730, -284005, -1112933, -942208, -1626182, 104153, -934692, --762357, -231928, 299037, -292058, 465467, -305480, 1885491, 748935, -1203128, 1320703, -732292, -1536525, 1013612, -19744502, -6420439, -1104880, 3418794, 2192044, 4958003, -9465034, --2754685, -492848, -9687836, -7031399, 2507724, 5828808, 3519189, 6439230, -773094, 3669513, -8722005, 7577933, 7242926, 4074313, -2712272, -2272038, -4394826, -2040110, -4415764, 9179419, -4356708, -1488206, -4043175, -2567317, -4129611, -6162741, -6520297, -8328479, 5034776, 3500398, --9115531, 2094333, -431644, 6262063, 1012539, 3048890, 4145717, -8731669, -1309428, -385473, -1185411, 4481262, 6940667, -2831457, -965294, -2093260, -5421860, 1612223, 1122597, -639413, --1457068, 5172215, 316754, -2956011, -949188, 2420214, 3377455, -1412507, -120796, 815507, --4714264, 3460670, -337692, -7187091, 848793, -8759049, 1410897, 6410239, -2130841, -318364, --9743670, -4827007, -7232725, -4463008, -575526, -806917, 4537096, 824097, 5322002, -3230889, -1810329, 2821794, 984084, 2776696, 352187, -1951526, 1120450, -898185, 932545, 37581, -399969, -402116, -1320703, -538482, 1214402, -1334124, 908922, 2199560, 1163399, 540092, -74625, 37044, -457951, -906238, -1433982, 1043140, 1444720, -882079, 952946, -928787, --671089, 10902238, 3976603, 1923609, -2797098, 8056285, 2988224, 4594542, 12513924, 13753022, -424128, -2123861, -4941360, -7330436, 2627446, 5490042, -2892661, -462246, 671089, -1209033, --4461934, 5211406, -5111011, 2452963, -14558865, -1998234, -3622268, -3423626, -7247221, -1402844, --1029182, 197032, -3767223, -5143760, -4227322, 657667, -2837363, -5464272, 3209951, 4850629, -280784, -4469451, -5218922, 1958505, -4045322, 4576288, -5735392, 3704946, 1198296, 9664, --8127152, -7340636, 1604170, -5298379, 8607114, 1635309, 7202660, -3718368, 7248831, 1510755, -4622459, 1687922, 4371740, -4066797, -6046777, -48855, 9349607, -855235, -6513318, -3315178, -3999688, -2581275, -3781719, 1029182, -10313290, 6942278, 8143258, -449361, -7202660, -8847633, --415538, 7562364, 5272073, -4182761, 5607617, 661962, -986769, -1059783, -746251, -421444, -1430761, -2455111, -2331630, 251792, 701153, -1832340, 529355, -829466, -427886, 2046015, --964757, -378494, 154619, -3089155, 1494649, 467615, 115964, 777389, 821413, -86436, -91268, -568009, -787590, -425202, -542777, -820339, 15410343, 3307125, 8416525, -3224447, -6278706, 4887673, 9838159, -7234873, -5367099, -1551557, 470836, 7208566, -3428458, 10874320, --902480, 6240051, 5167383, -2865817, 2065879, 6321118, 5616744, 1602560, 1479079, 5771363, --11744588, 2042257, 8905078, 7176891, -6395207, 7997229, -9383967, 5777268, -8289287, -3994320, --2255395, 8665097, -1849520, 9066676, 1874216, 2060511, 330176, -165356, 3421478, 5377836, -11520176, 1964411, 9926206, -4804458, 7224672, 9800042, -419833, -1598265, -3602404, 3872987, --13925358, -1010928, 1245004, -5035313, -8310762, -324270, -637266, -970663, 3500935, -8300025, -4151623, 3858491, 5246840, -13165685, 4464619, 3337190, -7980049, -785442, 4220342, 9930501, --12520367, -1397475, 837519, -11584601, -1146219, 1863479, -3367791, 7847442, -1835562, 811749, -2056753, -1207423, -496069, -383863, 1267015, -2892124, 347892, -1431298, 827855, 420907, --1831267, -44560, 2029909, -800475, -528818, 199179, -2579665, -795106, 384936, -804233, --1228361, -207232, 377957, -1225139, -675384, 1882806, 2240899, -2854006, -171799, 642635, --68183, -341987, -13764296, -16957068, -13506062, -12271795, -380105, 8580271, -17816062, 12673912, -8256001, -20086488, 12663174, 5322002, 4354560, 1956358, 1975685, 4508105, -3117610, -3301219, --6556805, -223875, 7726646, 6476811, 3823595, -11445551, 7837242, -8187819, 256624, -7202660, -8990977, -4771172, -3670587, 2804077, -13394929, 1317481, -4414690, -4038343, -1398012, 938450, -13242995, -6251862, -1988033, -5049808, 10080288, -6131603, -3258270, 3073586, 3055869, 2811056, -3590056, -4190814, 4880694, 1213865, -10980621, 15122580, 6060199, 2425046, 1614908, -98784, --7021198, 8645769, 7298223, 3012920, 9753334, 1013075, 4312684, 9746355, 5009543, 2079301, --6699075, 8026757, -3500398, 15354508, -1644436, 386547, -4165582, -16153909, 2137283, -3934190, --1890859, 8256001, -676994, -8773008, -4959077, 7093139, 5978595, 906775, 6922951, 1796370, --5046587, 2384244, -466004, -1718524, -1388885, 539018, 4103841, -1952600, 522912, 703301, -2315524, 850404, -1839857, 2964064, 451508, 774705, -161598, 751619, 384400, -1188632, -1723356, -1200980, 1421097, 1081258, -857920, 3343095, -445066, 809601, -1132261, -781684, -9854802, 6717329, -1141924, -6180458, 16196859, 25755308, -3401077, -3573413, 12453795, 3032784, -4108673, 3307662, -18547280, 2047089, -11992622, 9599789, 13684303, -3585761, -6606734, 2241973, -8668855, -5195300, 10471130, -4101694, 20207284, -5900748, 3912715, -983011, 5486821, 14401562, --5430450, 1426466, -1266479, 4172561, -5333276, -2567317, 8198019, 17667348, 1480690, 12937515, --4780836, 1793686, -2425583, 4321811, 9454834, 14103062, 10991358, 10449119, 10857140, 6877317, --1975685, 1688996, -1487669, 288300, 2161979, -7033009, -2024003, 11369852, -9966472, 3992172, --4378719, -2609730, -5177046, -20533164, 2305861, 11165841, 7061463, -2513093, -9739375, -23666880, --3808026, 9665287, -1984275, 3830037, -7374996, 5537824, -6800007, 6284611, 13443248, -5867999, --7252589, -13373991, 4056060, 1686848, 2213519, -10565620, 778463, 98247, -3195456, 645319, -5014911, 256624, 3452617, 1562294, 2241973, 2760590, -454193, 4321274, 1039382, 475668, --872415, -1349157, -1163399, 4123706, 1393717, -97711, 2757906, 1483911, 1996086, -335007, -2286533, 2809446, 3762391, -1517734, 419833, -1475858, -17674328, -14102525, 1854889, 8262980, --7931731, -5248450, 1060857, -4314832, -26476326, -22897544, 9995463, 9153649, 1722819, 1321239, --9674414, 15176804, 18510772, 11363947, -9496173, 8866960, 12164958, -1919850, -15354508, -6972880, -21303574, -6349036, 2168422, 1263794, 11984569, -9617506, -17047262, 3677029, 7885560, -4232691, -5058935, 11036992, -5335960, -4283693, -468151, -23893440, -6875706, 8176544, -4498978, -15977278, -2921115, -456340, -4983236, 3135863, -1473174, -15151034, -12782360, -22661858, -17952964, 3474629, -7960185, 705448, -5353140, -7587060, 216896, -5199058, 4857608, -10906533, 399969, -3885872, --3109020, -3717831, -953483, 4212289, -4913443, -21743808, 3287798, -3160559, 5389647, 5916318, -436476, 4100083, 5058398, 1563905, -1214402, 2610803, -3059627, 1185948, -6742562, -3617973, --3011309, -3753802, 1565516, 5948530, -3106335, 912144, -7669738, 856309, -747324, -5730023, -2511482, -1844152, 1461900, 2306398, 1360968, 1013075, 4869419, 1030255, 650688, 1588601, -31139, 635655, 688805, -1414118, -3651796, -758062, -3698504, 1724966, -2810519, 4134443, -58519, 5936719, 2762201, -3623879, -2361695, -1989644, -209380, 8647380, 27790050, 24688008, -19298898, -2054605, 18871012, 6125160, 26335128, 11160473, -521302, 32126892, -6662568, -1663226, --20424180, -5373004, -390305, -14397804, 8660802, 12914967, -4159139, -151398, -11577084, -19879256, --11714523, -15146202, -4393752, -9133248, -2849711, -1403381, 9162239, 2357400, -1857573, -8159364, --2791729, -5428839, 2956548, 266288, -8086887, 4351876, 5451924, 2193118, -6237367, -8194798, -2804614, 7693360, -1038308, -217970, -14545444, 26248156, 4444755, -4905390, -660888, 2398739, -11259794, 9593883, -9791452, 5633387, -3794604, 1275605, -1605244, -2398739, -14905684, -13265543, --17859548, 2804614, -692564, -3690988, 11307038, -3483755, 31814970, -3032784, -1654099, -7723962, --3435437, 4221416, 5522791, 3941169, -206158, 13771813, 9859634, -1914482, -6549289, 1920387, --3879429, 95026, 1349157, -4285841, -1388885, 234613, -1413044, 2269353, -5346161, 3345780, -6113886, -1724429, 3240016, -1737851, -1423782, -2310156, 1064615, 3485366, -1356136, 4634270, -920734, 1726040, 6284074, 2816962, -755377, 6666863, 3013993, 4668630, 5958194, 4682588, -574452, 131533, 4432406, -3858491, 208306, 2808909, 1530619, 3195456, 2891587, 1675574, -3689377, -16760036, -24307904, -13240847, 17748416, 14292577, -12521440, -12585328, 19045496, 11782169, --12375411, -16461536, -2948495, 2974265, 1612223, 2495376, -9925669, 10280541, -7466801, 19990388, --3332358, -13820131, 2996814, 5217312, -377420, 1657857, -6408091, -8936753, -766652, 8211441, --5211943, 6287296, -10026064, -25928180, -21421150, 13535053, -16747151, 13349295, 3580392, 1684701, --5784784, 7901129, 2208687, -1923072, -4059281, 3776350, 7660074, -7023346, 21783000, -5425081, -7141457, -6510634, 1660542, -1725503, -8932458, 21446382, -16953846, 23318452, -1123671, -11377905, --17804250, 9100499, 2854006, 3052111, 744640, 9566503, 6029597, 8684424, -18319646, -5319854, -198642, 395137, 4268661, -13517873, -6905771, -4365298, -2623688, -16959216, -3773666, -5610301, --19521164, -923418, -11190537, 2908767, -5398774, 1559610, 2205466, 8527121, 4709969, -3122441, --813359, -6978248, 3627100, -408559, 3112241, -8208756, 183610, -3242700, 1737314, -7561290, -1233729, 1818919, 113280, -1625108, 2407329, -4414153, 3158412, -6928856, 2416456, -4947266, -2182917, 1398012, 3169149, -2535105, 8533026, 3528316, -132607, -5237176, -4638565, -769336, -5611912, -1145146, -3138011, -2676838, 3763465, 337692, 3548180, 41249940, 13763760, -9197672, -21196200, 19740206, -10204305, -13003013, 31870804, -2852932, 7012608, -18897856, 46393700, 1622424, --12985297, 6737193, 2325188, 22528178, 395674, 28450938, -20438138, 443455, -22325240, 1727114, -15707769, 736050, -13675176, 19397682, 10373957, 5717675, 4678293, -6769942, -6527277, 1772748, --9674414, 12704513, -11310796, -15086073, 13337484, 5057324, -17498234, 9516574, 1162326, -12722230, --7130183, -4247723, 6703370, -1497333, -7661685, 9356049, -11310796, -4484483, -3875134, 15656230, --10269804, 7568806, 12026982, 5568962, -7103876, -14620069, 9277129, -12501576, 16916802, -21299280, -28106266, -8314520, -3947075, -3991098, 12799539, -920197, 4647155, 7652558, 4610111, 10875394, --10609643, -20207822, 1421634, 17179332, -11458436, -5424544, -11976516, -7185481, 3163244, -1182190, --3442416, 7434052, 5352066, 3932043, -1883343, 11332271, 6941741, -5255966, -2766496, 2239289, -610422, 9598178, 6086506, -772020, -3115462, -2425583, 10480257, 978716, -5362267, 6642704, -1996086, 287226, 5541045, 2522220, -967441, -5633387, 1585380, 6898255, -5100274, -1258962, -7854422, -490163, -1611150, -1956358, 4640712, 916976, 141734, -2064806, -24671902, -3053185, -22560926, -6585796, -14068702, 6243272, -6604586, -1202591, 10230075, -24492052, -14393509, 9487046, -12611635, 17207786, -1213328, -3230352, 6932614, -1641751, -24222004, -16572668, 28501940, -2144263, --24960202, -14474577, -10041097, -8237211, 2325188, 8404714, 461172, -4146791, -12452184, -19035296, -2573759, 2559264, -659814, 15608985, -10627897, -29871498, 12133283, 8821326, -34909496, 20877836, --5639829, -17607218, -14521284, -1285806, 19881940, 4779762, -6573985, -7170448, 5684389, 10473815, --14696841, 11286637, 1822140, 8322573, -6359236, -15267535, 13578539, 73551, 15226733, -47229608, -6015102, 7329899, -6983617, 13166222, 15261629, 44960792, 1279900, -29634200, -13671955, -7716983, --28827820, -28271086, 1474784, -16039555, 212601, -10645613, 10593000, -10833518, -10681047, 18997178, -4657892, -602369, -1041530, 11167989, -2350421, -1069447, 6444062, 5335960, -4093104, 3661460, --10141492, -2186675, 2822867, -1867237, -2949569, -4836133, -5203890, -2616172, -6416681, 2622078, --8154533, 1816771, -1418413, 7693360, -1810329, -3936875, -3401077, -4543539, -4930623, -1263257, --3451006, -5930276, -4437238, 4437775, -5939940, -2997350, -10612864, 3328063, 4243428, 11002632, -2454574, -1345935, 660351, -20680804, 3349538, 12650826, 11389716, -18362596, 32622960, 22632868, --10400263, 13508209, -26326538, -5923297, -8793409, 41566692, 26720066, -9985262, -15843061, -19507742, --4275640, 1032940, 7692824, 27860916, 5985574, 4675609, 6085969, 700617, -9168145, 1052267, --1700807, 12800076, 17416092, 21952652, 14380087, 9269076, -2120103, -4140349, 3548180, 19894826, -3208878, 3473018, -20248624, -10388452, 34331284, 13843753, 10361072, 184147, 20594906, 10899553, -43336756, -2495376, 44681620, 3097745, -13777718, 14370424, -11984032, -9086003, -1505923, -8310762, -568546, 8208756, 17928804, 3029563, -3719442, -19625854, 6392522, 1540283, 12984223, -15410880, -4180077, -6849936, 2406256, -19582904, 10001368, -17241072, -1984812, -23440320, -32027572, -5439576, --4914517, 26377004, 7236483, -903554, 5068062, 8172249, 10424959, 1665374, -278636, 346282, --18502182, 5819144, 387084, 17272748, -6922951, -930397, -4514548, 12250320, 2586644, 11182484, --1074, -13173738, 6518150, -762357, 4470524, -10035191, -4362076, 2305861, 2891050, -7482907, -857383, 6699075, 4372814, -6594923, -7079717, 12664248, -12680354, 5261335, -3801583, -10557030, -3479997, 2306398, 3511136, 4263292, -4626217, -699543, 6295349, 399969, 4438849, -1905355, --4718559, -5093295, -10979547, -16604880, 5011153, -19061602, -107911, 23138062, 7170985, 19724638, --22937272, -10519986, 11118060, 2317135, 32620814, -16612397, 19469086, -7394323, -9995463, -24376086, --9569187, -13107703, 16246788, 3814468, -21824340, 27200564, -14175003, -13107703, 2529736, 10581726, --8069707, 18797462, -9249749, -13112535, -6866042, 6217502, -2428804, -3630858, 1905355, 18722300, --12853763, 34298000, -13474386, -491774, 31673774, -6441377, 5451387, -43455404, 1773285, 7700340, --9956271, 19084150, -34985728, -42661372, 15999827, -7628399, 23384486, -17659832, -16785270, 1819992, --5645198, 36131948, -4594542, -1742683, 7878044, -33727304, 1720134, -34084860, -13818520, 1865090, -7919383, -42536820, -19153944, -5310190, -2285460, 13634911, -18425946, 21625698, -9147207, 2334852, --28111634, -1522029, -24867860, 9197136, 5099200, 18223546, 23134304, -8824010, 15086073, 1955821, --5261335, 7715909, 4651987, -7648263, -7873749, -13599477, -740882, -8143258, -8640400, 2775623, --2238215, 11484743, -15862925, -2852395, -10073846, 3732864, 5415417, -5558225, -995359, -8444443, --8562017, 9169755, 15006079, 17052094, 3256122, 963683, -4904316, 3112241, 2563559, -6654515, --10638634, 3390340, -5740761, -7749195, 11341398, 7944616, 6500970, -10801306, -12592844, -26562226, -21714818, -19069654, -5097590, 16913044, 39598524, -11381126, 32511828, 11286100, 8617852, -15130096, -35989680, 5456219, 16963510, 1428077, -20605642, 7492034, -20691004, -21036750, 13389561, -20954608, --4160750, -4987531, 21472688, 1710471, -6761353, 6750615, 9742060, -4452271, -19598472, -4769561, -15675020, 37051608, 8898635, -21009906, 2642479, -4102231, 9243843, 11193222, 19171660, -8405251, -770947, 12113955, 3147674, -715112, 25182466, 22364432, 27059904, 9144522, 22789634, 3001109, -13799730, -10640245, -1562294, 2913599, -20567524, 1509144, 35651448, -4554276, -7430831, 7372848, --222801, 9439801, -20742544, 27787902, -17175574, -7864622, -4486630, 1368484, 3573413, 3525631, --30314952, 38556996, -8085276, -12410308, -4291209, 32735704, -3452080, 6774237, -25654376, -18098456, -805843, 13597330, 12820477, 20919712, -33416994, -10594074, 32529546, -11628087, 3834332, 27565100, -6847252, 6000606, -1526861, 913217, -10271951, -855235, 2905009, 7844758, -4501663, 6526203, --11894912, -6866579, 925029, -3466576, -1829656, -28330678, -21661668, 1765232, 14504105, -13389024, --22605486, -9374303, -18524194, 5238250, 1066763, -7218230, 18238042, -5212480, 7588671, 8214125, --9570798, -6940131, -1412507, 2187212, -503585, 13572097, 14496, 842887, -6361921, -1498407, --10139344, 63247152, -3848828, 12773770, -676457, -6373195, 1629403, -29083372, -12619151, -8870718, -11188927, 8201240, 14116484, 1730335, -15532749, 16188805, -13223667, 18645526, 13478144, -14939507, --16280610, 1990181, 22513682, -23211078, 9554155, 10793790, -13502303, 5982890, -1926293, 8184060, --1245541, -33891052, 18817862, 11742977, -28823526, 34548180, -18518826, -4357245, -11556683, 27886686, --5761162, -23665806, -287226, 383863, 22775674, 23434952, 1302449, -18036716, 25997438, -4223027, -4378719, -33288144, 25962540, 10703059, 1320166, -19098646, -14740865, -2028298, 8855149, -15352897, --27721330, -11683385, 21410948, 13440026, -3485903, 35202624, 1819992, -5720360, -25675314, 31061740, --29156386, -9321153, 31431644, 10023917, 3819837, -11933567, 4632659, 31272730, 6644852, 13711146, -19501300, -51172924, -11514807, -8502425, -4545149, -21223580, -4072703, -2515777, 30773978, 8425652, -1785633, 15803869, 21894132, 15559056, -11328513, 5930813, 12969727, -2631204, 4815732, 5737540, -6771553, 4595615, 21747566, 11956115, 1044214, -6422050, -10278394, -19116900, 2453500, 26844, -4831838, 6283001, 2649458, 33239826, -4897874, 12027519, 6865505, -9039832, -26721140, -4260608, --10110353, -16423418, -18060338, 3066070, -3271691, -21378736, -277562, 8162049, -2461553, -2078764, -7122667, -5255966, -16708497, -7258495, -25813290, 1306207, -28842316, 26996554, 40889164, 19717658, -23030152, -35667020, -32758252, -24847996, 1882806, 45280228, -8855686, 17118666, 28572270, 15135465, --16669305, 1404991, 20693690, -27013196, -23529442, -19256486, 21698712, 15965467, -29385092, -40220220, -54492936, 34398392, -39927628, 18195092, -5232344, 16697759, 1098975, -11498701, -27946278, 25313464, --1329292, -19853486, -30957588, 8129836, 6411850, -7283728, 127238, -2436857, -15632607, -6207302, --8565239, 14416595, -27242978, 29641716, -20732880, 1430761, 45373644, -44108240, -11445014, 42304356, -2344515, 10151692, -6955163, -12810277, 12443057, -4559108, -19233938, 2714956, -42931956, 71854264, --7779260, -78614008, 29118268, 78124384, 45175004, -95924872, -28742458, 18473728, 6195491, -14388677, --22950158, 12259447, 28631862, -35952096, -10768020, -62918048, -11674795, 22043382, 7175280, -19077170, --32399086, 12652437, 26910654, -381715, -9338870, -14947560, 21213918, 13286481, 8141111, -1667521, --7463580, 2802466, 11475079, 9731859, -3076807, -25144886, -16608639, 26491896, 10432476, -13421773, --10063645, 19034758, 5450851, -2507724, -39269424, -17477832, -20031728, 21667574, 5014375, 4818954, --4890357, 642635, 20051054, -4175245, -4649839, -18222472, 2694018, -5851893, 28325310, 6269042, --7507603, 3606162, 28581396, -3812320, -12253542, 2431488, 222265, -1478006, -20315196, 4955856, -19278498, 46232640, -19572702, 15311558, -24610700, -63960116, 34389804, -15836081, -35511864, -24021752, --36293548, 17613660, 11678016, -48030620, 30767536, -16503949, -1515050, -226023, -25130928, 19524384, -18801756, 17199196, -1873680, 22388054, 11233487, -12990665, 946503, -27229556, -10261214, -24116242, --17338246, -836982, 39537320, -32873680, -7350300, -6800007, -30032022, 17827336, -33840048, 17770964, -14852534, -22439056, 17743046, -36293548, 10299868, -31507880, 20454782, -11576547, -17073032, -17108466, --26200374, -6642704, 12865038, 23010824, -26584774, 17986250, 9662066, 27944130, 33709588, 20024212, --28392956, -12731357, -53213036, -13040594, -15592879, 17987324, -62064424, -11382200, -36991480, -2840584, -36721972, 34324304, 22138408, 8258149, 49518288, 54789824, 48275432, -16302085, -21966074, 18768470, -47255916, 88065080, 6159520, 20883742, 10519986, -4351339, 16039018, -15468325, 9387725, -3768834, --403190, -9848897, 16280074, 19371914, -6811818, -15400142, -12107513, 14754286, 6209449, 16685411, --9133248, 6672769, -3412352, -6916508, -4840428, 16569447, 31927714, 15664819, -16816408, 8791798, --5922760, 11815992, 4976794, 6002754, 15530602, -9796820, -21299280, 2069101, 16080358, 13052942, -4207458, -2850248, -7449084, -28726888, 28350006, 8272644, -6891275, -29887604, -7232725, -20448340, -10166724, 11840688, -10009958, 7344931, 57498876, -33996812, 21504902, 26100516, -12069395, 2357400, -10023380, -3221226, 27901182, 1413581, 20207284, -25830470, -3631395, 22431004, 3719442, -35041564, -22697828, -14003204, -11379516, -13389024, -3452080, -13058311, 13309030, 18547280, 9067213, -3252901, --9716290, 16091632, -5216775, -25739740, 21104932, -43448428, -10904922, -8956617, -9504226, 24773372, -27171574, 48645336, -14224932, 20805896, -722091, 9374303, 31952946, -2334852, 3467112, -21279416, --66959612, 33179160, 6455873, -32360432, -22107270, 3273839, 17592722, -3084324, -18916110, 9854802, --19395536, 25617870, 14366129, -11153493, -23273890, 46437724, 5191005, 2483028, -4170413, 6459094, -3369402, 2051921, -15517180, -32963874, 9219147, -4796942, -11645267, -30369714, -7380365, -857383, -27224188, 11233487, -34064460, 19973208, 3660386, -1243393, -3678640, 11173357, 14354318, -2756295, --6268505, -2354716, -5923297, 5333813, 8586176, -295279, 4980552, 9583146, -3376381, 13803488, -5964099, 4306779, 7342784, -3762928, 17313014, 3005940, -3495567, 11324755, -13412646, 4482872, -7949448, -3088082, -5646272, 15600395, 22446572, -19815368, -3535832, -6886980, -6675453, 8121783, -7074348, -12377022, 7111392, 5739150, 5145908, 6007049, -11075647, 8224326, -679142, 4932233, --13851806, -3422552, 2910914, 64133524, 32263258, 64531884, -59616832, 5420786, 30535070, -11669426, -34820372, 68070400, 36894844, 2450279, -18564996, -18545668, 3211025, 29662654, 31154082, 7432978, --383326, -46496244, -9947144, 46417324, 14956687, -12585865, 25172266, -21395916, -30631170, -8048769, --2333778, 35947804, 46275588, 42129872, 15546708, -15948287, -25254408, -45995880, -46323908, 40350144, -16492674, 3557844, 61577484, 4022237, -19267760, -25056302, -26050588, 12788265, 26124676, 21314312, -40279276, 3150896, 28892782, -1648731, -5571647, 15064061, 26725434, 20050518, 16865800, -15164993, --6168647, -11906723, -27760522, -21719650, -40309880, -13123809, 10392210, -6306623, 28760174, 35225712, --898722, 586800, -14647449, -25308094, 4941897, 34042448, -2279017, 18953690, 7869991, -2203855, --10919417, -4619238, 2756832, 12045236, 8862665, -8784282, -19252190, -23138600, -22279070, -8259222, -8575439, -2042257, -14127758, -6815040, -9906879, -7850127, 4185983, -985158, 12613245, 18771154, -3821984, -22304838, -11926587, -13270375, -3405909, 15436649, 3330747, 3969087, -18773838, -17231946, --20237886, -9991168, 17029546, 12057047, 14653892, 8276939, -7595113, -8762807, 6024766, 5970542, --1891933, 4114579, -7946227, -5912023, 4182761, 3383361, 5924371, -3460670, -7898982, -3286724, --6131603, -900869, 11530913, -33986076, -66058208, 26021060, 107920720, 109580184, 92893704, 67180808, --41432476, -47412144, -51079508, -68108520, -104039144, -83944600, -72773392, 33749852, 78339128, 58133992, -125942400, 97210144, 50799264, -18786186, -33848636, -84683336, -65983044, -65478924, -13300440, -40149356, --32476396, 9636296, 17781702, 35581120, 35854388, 49021684, 48766132, 62751620, 36711232, 16045461, --9070434, -10677826, -27572080, -41895796, -50438484, -61814244, -40372692, -75906032, -50458348, -37990060, -38028176, 71904728, 77682536, 53626960, 36652716, 57239568, 43916576, 54932632, 43290048, 15088220, --20346334, -96369936, -68038728, -69489888, -107670000, -67655936, -58430344, -56837988, 20706038, 57052736, -90764472, 74615928, 106691280, 95626912, 93638880, 66646080, -36340792, -33020782, -74828528, -99111200, --109069624, -89577448, -42900816, -12264816, -22553948, 29467770, 78161424, 54994372, 37258304, 62573380, -52706764, 18752364, -12335146, -12559558, -4006668, -15394237, -41972568, -26475252, -29975650, -16293495, --13418015, -31374200, -11548093, 10727755, -10448582, 34622804, 45832668, 50224272, 53252224, 3255048, -15931107, 15470472, -4490925, -72931232, -58095876, -45493904, -40524628, -32009854, -30252676, 33497524, -50167364, 54412940, 52183316, 42931956, 29529510, 26482768, -347355, -7900593, -42089604, -56925496, --50884088, -42523396, -27047556, -17671642, 2111513, 25613574, 52068964, 38919920, 24835112, 17923436, -4974109, -355409, 85362, -10384694, -13491566, -11211475, -13181792, 3173444, -4919348, -18185966, -2458869, 8731669, -3183108, -4514548, -3712999, 2094870, 3476776, -4705674, 1084479, 11889543, -7484518, 3519189, 7367480, 7103876, 1269700, -1352378, -2207613, -4722317, -6667400, -4943508, --3567507, -4542465, -3773129, -1718524, -672162, 1036698, 2218888, 2260227, 2063195, 3573950, -2892661, 3187940, 1329829, -1216550, -1475321, -122407, -1378148, -2658048, -1705102, 1177895, -2739652, 3427921, 2703682, 2628520, 653909, -1366873, -2885681, -4315369, -5814312, -5432060, --4786204, -2977486, -1274532, 1124745, 4128001, 7341710, 8199093, 8187819, 6595459, 4103841, -905701, -2011118, -5883032, -7658464, -8315057, -7165616, -5158793, -2477123, 567473, 3425773, -4170950, 4918812, 4330401, 3130494, 1515587, 643708, -164819, -436476, -811749, -824634, --1003949, -541166, -633508, -495532, -646393, -278099, -359704, -59056, -209380, 69256, --157840, 78920, -113280, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --3398393, -3420942, 2815888, 6496675, -8848706, 1939178, 5733245, 10643466, -1203665, 6017786, -310848, -5468030, 1248762, 8361228, -228707, -2647847, 5538361, 8014409, 7487739, 4502737, 1158567, --3027415, -2483028, 794032, 3792456, -1911797, 1731946, 519691, 4320200, -2074469, -179315, -1135482, -5282810, -2995203, -1592896, -5414880, 1250909, -1499481, -100932, -701690, -4596689, -3576097, 5362267, -1081258, 382252, 536871, -917512, 5785321, -7026030, 16106, 2834679, -810138, 870268, -1639604, -5826660, -1441498, 2197413, 2691334, 2904472, -491237, 53150, -71404, 1123134, -949188, 6001680, 200790, -578747, -3934190, 489626, -2809446, -2235531, -2416456, 2554969, 6265821, 175557, 6161131, 652298, 693100, 368830, -3212636, 156766, --1124745, -1691143, 690953, 1919850, -1211181, 750546, -1254131, 1516124, -1598802, -545998, --807991, 860067, -492311, 801011, -700080, 951872, 1771137, 829466, -824634, -268435, --411243, -464393, 525597, 332860, -396211, 6951942, 11244761, 1516660, 5592048, -2024003, -3316789, 4354560, -1348083, -3474092, 5890548, 10189273, -2007897, 1139777, 3926137, -4864588, -3022583, 4355634, -8910983, 2512556, 857383, -1992865, -10737, -9257802, 365609, 2605435, --4417374, 824634, 144418, 5945309, 4228932, -2219961, -645319, -555125, -6321118, -4233764, -682363, 2557653, 559420, 2840584, -4180077, 637803, 2070711, 438624, -3870839, -2817499, --866510, 1351304, 3111167, 3237332, 2142652, 3777961, 3679176, -4134980, -1278827, 175020, -5234492, -791348, 3752728, -2468533, -2573222, -786516, -4725001, -2168959, 955093, 2757369, --4034048, 3944391, -1124745, -1169842, -796716, -1589138, -2045478, 819802, 3053185, 1147830, -5102958, -7088307, -5729487, -1254667, 2109366, -70867, -1176284, 1088774, 149250, 1319629, -2148558, 3618510, 54761, -209380, 846645, -332323, -61740, 560493, -1669669, -868657, --3443490, 1372242, 6522982, 9238475, 5347235, -2310693, 3956202, -2407329, -1631014, -7881802, --6287832, 2857764, 6038187, 5924371, 6156299, 1388348, 328565, 3831648, -5092221, 5134634, -4142496, 398895, 3558381, 9164923, 6220187, 1761474, -6576132, 209917, 2207613, 1437740, -1083406, -7182259, 1723356, 1345935, 4819490, 5341329, -1672353, 3438658, -2591476, -2854006, -3874061, 2220498, -6894497, -6501507, -2858301, -3642669, -2728915, -2888366, -7964480, -7183333, --652298, 2626909, -45634, -734976, -5366025, 741419, 6370510, -1761474, -2011655, 2426657, --11811, 4635344, 2317135, 2382633, -2971044, -3639985, 6841883, 3159485, -2736431, 4536559, --598074, 3543885, -2968896, 584652, 5051956, -1886028, -1634235, 3673271, 448824, 1482838, -2170569, -2479270, 2835215, -1146756, 2323577, 2371359, 1810329, -1576253, 593779, -767189, --1366873, -1717987, 101469, 245350, 1145146, 1016297, 268972, -52613, 899796, 317291, -627602, -12730283, -7526394, -2330557, 2397666, -5235565, 1583769, -1417876, 3650722, -870268, --7157563, -5657009, 4920959, 4063576, 10197863, 9043054, -1388348, 6549289, -9838159, -1575716, -7617662, 2323577, 1754494, -983011, -3224447, -1472637, 1040456, -852014, -313533, 3888556, --4830765, 1099512, 1735167, -90194, 3025268, -3284039, -2726767, 1775432, -2123861, 2745021, --5395553, 920197, -3246459, -1244467, -3613678, -2667175, -4103305, -6038187, 3707094, -10737, -6329171, -5900748, -5088463, -12348, 1203665, -667331, -1229434, 449361, 3809636, 1859721, -812823, -2578054, -2525978, -1396938, -4745402, 784368, -1235340, 586800, -230854, -5066988, --435402, -372052, -5406290, 181462, -1024887, 660351, -916439, -5979668, 537408, 2735357, --1199370, 4006131, 1095217, -2090575, 1670742, 4202626, 1369558, 754304, 941672, -848256, -517007, 3296924, -255014, -481573, 1201517, 1376537, 519691, 1117765, 234076, 491237, --2178622, 280784, -170188, -1030255, -780073, -747861, -1107028, 210990, -907312, 4509716, --6888591, 2850785, -7693897, -1252520, 339302, -5571110, 5283347, 4139275, -11403138, -1067299, -1875290, -966905, -5008469, -6582038, 1340030, -3270618, -5581847, -2649995, 3253975, 3003256, -8028368, 10574209, -945430, 9459129, -5780489, 3774740, 4050691, -744103, 3990025, -2216740, -57445, -521839, -1959579, -912681, -2189897, 7897908, -465467, -5729487, -1416802, 4001299, -2405182, 3218004, 599148, -2629057, 5681705, 11716671, 702227, 1264868, 659278, -772020, -1819456, -687195, 6622303, -4985384, 6334003, 4499515, -4057134, 2165737, 4119411, 2929705, --4857608, -5143760, -10375567, -1596117, -996969, 1413044, 3985730, -874563, 2589329, -780610, --2769180, -2641405, 5331665, -1118302, 5657009, -8266202, -3318399, 2028835, -5323075, 1485522, -5692443, 649077, -54761, 528281, 1204202, 893890, -3228205, -918586, -535260, 580894, --581431, 1160178, 1454383, 869194, -940061, -2045478, 2359011, 1029718, 914828, 736587, -682363, 290447, 55298, -924492, 983011, 585726, 382789, 293132, 1034550, 817118, -1241246, -1319092, -878858, -1568200, -1573569, -293132, 1246614, -861141, -591095, 814970, -274878, 638340, -265751, 230854, 2898566, 1447941, 42950, 4161823, 11630771, 13954886, --3699041, -200790, 2812667, -1971927, 8861591, 8868571, -5606543, 8697846, 6642167, 2720862, -3813394, 3620658, 1692754, -625455, 532576, 1279900, -4821638, -5660230, 1430224, -1490354, --158914, 1132798, -5202279, 5296232, 10282689, -189515, -6302865, 10271951, 1151051, 447213, -3899830, -1642825, -3118683, 1613297, -3889630, 1661079, 10275709, 4575751, -150861, 3842385, -5553393, 14752139, -2461553, 6447283, -1325534, -6208375, 4104915, 523449, -2180770, 3018825, -8890582, 2444910, 1526324, 14496, 3522947, 13079249, 5735929, 1763621, 1250909, 3551938, --3789235, 6764574, -1764695, -12652437, 1503239, -1224603, 7657927, 9232569, 3877282, -3734474, --3580929, -3163780, -506806, 2975876, 216359, 2063732, 1256815, 2156611, 5746130, 2656437, --4640176, -1844152, 593242, 1752347, 252866, 35970, 131533, -2371359, 2627983, 780073, -501974, 440771, 502511, 397821, 1960116, -662499, 1420024, -1304060, -464930, -2145873, -428423, -730144, -158914, 287226, 929324, -15742666, -1642825, -6752226, -7714298, -2199023, --5472325, 139050, 4903779, -7465727, 7703024, -16360067, 2406256, -4937602, -8550206, -11741904, -12208981, 5911486, 871342, -10423886, -6637872, 3700651, -13270375, -9481140, 3255048, 2692945, -13648332, -1906966, 1209570, 9904731, -5901822, 9724343, 3463354, 3467112, -1851131, -6099928, --624381, 8067559, -4365298, 542777, 10394358, -3928285, -2978560, -5157719, -6068789, -5465883, --3912715, -8504572, -957778, 2338610, -2796024, 1665374, -2672544, -4439386, 5862094, -7619272, -4583267, -6504728, -7922604, 208843, 6619619, 246961, -1923072, 2422362, -5270462, -2868501, --7406671, -13482976, -6231461, 1701344, -3981435, 14994268, 6088653, -10795937, -5297842, -1770063, --3778498, 4677220, 10340671, 6564321, -4943508, 4560182, -5871221, 3349001, 572841, 4567698, --5196911, -1453846, 501437, -2520072, -4430259, -3955128, 729071, -464930, -1005559, 2121714, -932008, 139586, -1446330, 1174674, -260919, -1379758, -3220689, -306016, -1642288, 49392, -1474784, -1308354, -3587908, -660351, -1509144, -6090264, -842887, -1889249, 16748762, 11166915, -11409581, -3229816, -16617765, -1168231, -8597451, 2251637, 3473555, 8986145, -4330401, 4016331, --6939594, 1287953, -6142877, -15156940, -8428873, 5982353, -5763309, -11984569, -11578158, -10462003, --16729434, 2188823, -5980205, -12463458, -11518565, 2118493, 15743203, -2000918, -2844879, -5198521, --9845676, 2121177, -4030827, 1184337, -12236899, 894964, -12738873, 1877438, -1207423, 6869800, -5040144, 5738613, 2700461, -352187, 4476430, -2958159, 8985072, 2700998, 4457639, 2905546, --3182034, 3386045, 9055939, -1086090, 4978941, -1192927, 14347875, 1990181, 5279052, 828392, --8325794, -6116034, 108448, -2770791, 1700807, -1992328, 4638028, 4408784, 5420249, -2457795, -3016678, -11031623, 5756867, 16409996, -8032126, -1540820, 4159139, -9270687, -813359, 5983963, --3854196, -469762, -2119030, 5218386, -5408438, -1136556, 1253057, -2815351, 1253594, -904628, -1990181, -2598455, -2868501, 3119757, -1520418, -2866891, 1942936, -1066763, -97711, -4097399, -3054259, 1184337, -857383, -590558, 1672890, 756988, 1618129, 1399086, 160524, -1699196, --3334505, -825707, 1726577, -8201777, -23663660, -3953518, -8244727, -12499965, 6735583, -23829552, --3066607, -8499740, -4590783, 6834367, -7558069, 10027138, 8694624, 1343788, 7841000, 653372, -4151623, -6243809, -10933376, -12094628, -6731288, -11089069, 8621610, 11237782, -475131, -5989869, -3265786, 3205656, -4147328, 781684, -18813030, -10001905, 8757438, -4848481, 258235, 8536784, --812823, 5260261, 4547834, -2503429, 5202816, -115964, -10032507, 11113228, -7853348, 481036, -614717, -6221260, 4102231, 6600291, -3930969, 7548405, 852551, -654983, -6959458, 8533563, --52076, -7027640, -2310693, -14015552, -5856188, -8031052, -1012002, 9526774, 2765422, -980326, -155693, -9097278, 2026688, 6874632, -9112310, 452582, 13942538, -5813238, 1364189, 984084, --9919764, -6038724, 6340446, 5239860, -16138876, 3175055, 12061342, -136902, 1435593, -6442, -2903935, -1000191, 7611756, -1824824, -321049, 893890, 1458141, -3537443, 871342, 2599529, -822486, 4441533, 1658394, -183073, -1668058, -3653407, -1035624, 1605244, -2213519, 1511829, --2269890, -156766, 3131031, 1591822, -2216740, -3093450, 150861, 6442, 6669011, -2789581, -540629, 3555696, 1471026, 3506841, 42270532, 9308268, -5456756, -8546985, -751619, -2759517, -7545184, -1750199, 6386080, 11881490, -4765803, 517544, -7860327, -5507759, 2601677, -1393180, -6204081, -11916387, -6880538, 5495948, 11905112, 7737921, -320512, 2719251, -2859911, -7213935, -5193153, 9175661, 9759776, 11635603, -9673340, -2393371, -5533529, -12140262, -1486059, 532039, --2604898, 5442798, 7339562, -112206, 3638374, -2258079, -12770012, -7063611, -17090748, -17469780, --5042829, 5722507, -2514167, -7792682, 14586246, 5408975, -569620, -13754096, -601832, -4305168, --9744744, 23085, -4448513, -6426345, -13504451, -1833414, -4977867, -14968498, 13422, 11276437, --7627862, -3724811, 4216048, -6495065, 2558190, -6436546, 9277666, -3064459, -8941048, -13997835, --22817014, 4413616, 3869229, 17353278, 7033546, 5950141, -74625, 5206037, -4097936, 5523328, --510027, 1890859, 2801393, 6569153, 3054796, 183610, -1211718, -415001, 2643552, 1563905, -6922414, 5345624, 3636227, 1100049, -1403917, -3736622, 2000381, 4407174, 404801, 207769, --838592, -3312494, -554588, -556735, -1548336, -1227824, -2494839, 2006824, 3055332, -2934000, --2909840, -235686, -379031, 1527935, 9427453, -33365454, -19110994, 17790292, -4665408, 1208496, --9241696, 7803419, -3224447, -12825846, 6146635, 17991082, 2250026, -15598784, 4376572, -3334505, --3630321, 10396505, 10655814, -1359894, -2216740, 22643604, 5003637, -3156801, -13900125, 6228777, --19918448, -16273631, -15113990, 6212134, -2882460, -1522566, 12933220, 5266704, -13190918, -10903311, -2840584, 12902619, 4361540, -1358820, 707596, 8639327, -6185827, -13798119, 18128520, -5223754, -1868848, 7436199, 1118839, 2626373, 18648212, 438624, 11876121, 652835, -12512850, 1928440, -2663954, -2472291, 2378338, 8613557, -6328098, -1796907, 2167348, -24592982, 6554120, 5179731, --144955, 6058588, 4620848, -9042517, 4347581, 34076808, 14593762, 8518531, 2463164, 8377871, --26096758, -12237436, 13212930, 664109, -114890, -9877351, 8834211, 10823318, 8955544, 1632088, -1886028, -3440806, 155156, -6065568, -2243047, 5048197, -1091459, -2983929, 2564096, 348966, -2462090, -3470871, -1517197, 1366873, -641561, 2627446, -4312147, -1343788, 3104188, -3302293, -2514703, 1060857, 341987, 251792, 50466, -2644089, 1421097, 2744484, -1277216, -1144072, --2980707, 1475858, -162672, -22269942, 15607374, 16975858, 5301601, 9422621, -6357089, 27016954, --3290482, 10385768, 6886443, -12272869, -5214091, -5595269, 15497316, -9163850, -3017215, 9968082, -8153996, -9006010, -2600066, -26275000, 4814659, -2803540, -7872675, 2408403, 593779, 2071785, -2306934, 9060234, 244813, 9912248, 1044751, 4893042, -2650532, -8386461, -9190693, 17177722, --6198175, -12235288, -10520522, -4596689, -5843303, 7518341, 4469451, 5816460, 7421704, 2377801, --9472550, 5473399, -15370614, -4876399, -13447006, 9280351, -16205448, -11429445, -3538516, -5304285, -4677757, 10929081, -8722542, 10323491, 16686485, 8458401, 16069620, -6684043, 21614422, 2099165, -18292266, 10555419, 2164664, -9711995, -24832428, -16577500, -13699872, -7596187, -7736847, -2309082, --11633993, 8783208, 14315126, -5444408, -11207717, -9987946, -8126078, -14916958, 9334038, 6961605, --4128537, -3759707, -5972152, 886911, -3442953, 8216810, -114354, 2193118, -4456029, -3590593, --6226629, -1005022, -7431904, -6887517, 7040525, -389231, 738198, 295816, 2492692, -2747169, --411243, -4186519, 3758, 142808, -329102, 2333241, 93416, -3405372, -2455648, -2411087, -565862, -3668439, -4264366, -5088463, 1265405, -1293322, 12483859, 6360847, -7101729, 21014202, -2376191, -20516522, 25617332, 1713692, -10912438, 9037148, -21041582, -4032438, -13397614, -4188667, --2374580, -4117263, -9578851, 2675765, -18182208, -7039452, -6558952, -24539832, 2975876, -17800492, --12650289, -19969988, 4000225, -15071577, -4551055, -5003100, 157840, 7577396, -6126234, 10671920, -547071, 14164802, -3308736, 12317429, 15537044, -18673444, -285615, 4984310, 11404212, 424665, -13713294, 4572530, 13222057, -301185, -10114648, -6380174, -979253, 8535174, -1978369, -3965329, --867047, 15825881, 10001905, -3800509, -13075491, 4348118, 7170448, 5070746, 14050449, -18864570, --13938243, -4016331, 1318555, -5340255, 142271, -5446019, -11782169, 32991792, -16325708, -18979998, -14126684, 8095477, 12271795, 3719979, 4506495, 2491081, 7171522, -6838125, 18967650, -3373160, -4646618, -3725347, 2532420, 1079647, -1047435, 12036646, 1508070, 995359, -11934104, 5334887, -1777580, -1819456, -9720048, -1066226, -2015413, 182536, -3099356, 8638790, 2010045, 2356863, --7025493, 4712653, -3341485, 891743, 4198331, -261993, -2080375, -2344515, -6250251, 3540127, -6382322, -3134789, -709207, -2354716, 947577, -3727495, -8409009, -2648384, -284005, -5867999, -5970542, -629213, -811749, 1903744, -5651640, -6518150, -1808718, 2513093, -4290673, -5714454, -16763257, 12151536, 19800336, -6670084, -4769025, -27159762, 31510028, 14279156, -41722388, -22502944, -13506598, 18501108, 18832894, -12148852, -9664213, 22543746, 5476084, 5081483, 15811385, 12579422, --23029614, 6965900, 9843528, -1853815, 11010686, 1975685, -2877628, 2137820, -7437810, 38487200, -10201084, 4903779, -971736, -4902169, -2507724, -22029424, 4286378, 6308233, -5071820, -7310035, --35372276, -17069810, 7503845, 6051072, -11556146, -11513734, -1527935, -17012902, 7059853, 6133214, --2381559, 6916508, 14053670, 566936, -656056, -4614406, -7402376, -2579128, 1322850, -26271242, --3412889, 6000606, 15999290, -28423556, 6346888, 9998147, -2163053, -13457206, -11960947, 21215528, -21169894, -3230889, -13121662, -25151328, 5322538, 9884867, 5305895, 270583, -27210766, 11355894, -24870008, -8549132, 2854006, 7648800, -10160819, -16438987, -8565775, 2335389, -5008469, -1444720, --7635915, -6768869, -5567888, -2529736, -2169495, 3164317, -559420, -650688, -6962142, 2731599, --3254512, 1349694, 83215, 2107755, 4269198, 4787815, -7788923, 2984466, -6015639, -10322417, --5319854, 1303523, -1009854, 4286914, -969589, 2737505, 6017786, 145492, -265214, -5426691, --2931852, 7794829, 4041564, -3481608, -2027225, -927713, -5054640, 12414066, -9137543, 3364570, --7613367, -6766184, 1189169, 8399345, 16850768, -31044024, -40450000, -28159416, -36188856, 31392990, --20959440, 12615930, -3539590, -25469156, 4552129, -6942815, -9450002, -33057290, -30247844, -22629108, --8625368, 1134945, -17508972, -5113696, 4611721, 14172855, 1112933, -8891656, 18254, -9506373, -13622563, -17210470, 23696946, 20388210, -4915053, -6556268, -28156194, -16458315, -17136920, 2004139, -3747896, -4640176, 22950694, 6492380, 18595060, 3614752, -2237678, -8514236, 16720308, 11515881, -5215701, -16899086, 8968965, -28535762, -3229279, -3088082, -18954228, -3177202, 179852, 21705690, -14370424, 346819, 10011569, -469225, -21527986, 10865730, 2972117, 17834852, -10205916, -20729660, -12252468, -37194952, -8589398, 13062606, -5650567, -5987722, 9013526, -2498597, -7402913, 6795712, --3182571, -23901494, -21035140, -3548180, 9710921, 15762530, 22198538, 22247930, -9567040, -7679402, -4294968, 8009577, 7198365, 2963528, -10032507, 8636642, 55298, -1935420, 1013075, 5321465, -8941585, -2735894, 1409823, 8475044, -2108829, -260382, -8769786, 4228932, -2014340, -688269, -6992744, -1484448, -3322157, 3111167, -9969156, -3723200, 9846749, 2775623, 3090766, -3619047, --2485176, -1561758, -7996156, -1117228, -4531728, 5864241, -17204566, 203474, 12631499, -40703404, --3524021, -26000658, 1832340, -19209778, 17517560, -13785234, -1189169, 3167539, 6699612, 20590610, -7236483, -9647570, 22739168, 6786049, -38009924, 6104759, -22702124, -1828046, 4632659, -3396246, -19152870, -5784784, 3697967, 4602058, 1930588, -12448426, 19441706, -11272142, -784368, -22593676, -253403, 3641059, -3273839, -8048769, -10014253, -11872363, 29344290, 1012539, 15329275, -26034482, -3199751, -469762, 9166534, 15309411, -17522392, 31481036, 45806364, -2214593, 4672388, -16026134, -7564511, 10467372, -8517457, 2142652, 8848706, 17545478, -302795, 920197, -5206574, -15489263, --22818088, 11648488, -17045652, -7430294, -11072426, 4903242, 15819438, 13838921, -2493229, 5133023, --31068720, 20604032, -3591130, 4407174, -8937827, 20134270, -27858232, 33455110, 24676198, 27859842, --11034845, -760746, -27302570, -15035607, -9994389, 8971650, 7914014, -22905598, -16486232, 551903, --5570573, -16731045, 179315, -11604465, -13449690, -5199058, -1826435, 976568, -8819715, 1542430, -3267396, 13753022, 12589086, -1992865, 11878806, -5810017, -14357002, -8124468, -2916283, -7404524, --919660, -5515275, 8442832, 2443837, 32020592, 4162360, -10769630, -3805341, 3039226, -16668768, --10202695, 3929358, 845572, -4335233, 1836635, -8053, -17992154, -1918240, 12324946, -8970576, -12924630, 51155208, 14185740, 37294276, 11464341, -38196756, 15151034, 11038603, -13156559, 2942053, -24559696, 1422708, 23493472, 21415244, -25062208, 13935021, -25072408, -16407849, -2670396, 50070728, -14973330, -22153442, 20886962, 13966160, -27711666, -11782169, -2194192, 28156194, 3794604, -25177636, --14652818, -493384, -7297687, 15766288, 21990232, -7763691, 19303730, -12335683, -17420388, -286152, -40104256, 4065187, -23523536, 13509283, -1403917, -2002529, 11001559, -26036092, -23075786, -21307870, -15529528, -13847511, 4799089, 7052337, 23855858, 12267500, 24533926, 2960843, -1381369, 20574504, -36887328, 22422414, -37096168, 1081258, 3271691, -5913096, 6793565, 10526428, -28715614, -3962107, -5325760, 5244155, -34142844, -31752156, -18285286, -19165754, 33302102, 12753369, 1260573, 15148887, --27712740, 11641509, 7295539, 5337034, -2720325, -5950677, 22920092, 14276471, -9581535, 4292283, --7297687, 15477452, -4663798, 1386738, 2891587, 2569464, 11005854, -1467805, -18637474, -450435, -3151969, 5135171, 9150428, -2238752, 557272, 7385733, -14510547, -8108899, -1607392, -25556130, --4255239, 7493108, -2201171, 3125126, 14525579, -1794223, -10613938, 2530273, 3304977, 9945534, -11198053, -10752451, -7124277, -411780, -9701257, -5804649, -18331458, -21149492, 5673652, 674847, --9971303, -7773891, -10172093, -19220516, 14369887, -38513508, 27851252, 31336082, 8556112, 34117608, --34939024, -16935056, -9517111, -49957448, 28131498, 2942590, 17387102, 23087596, 22385370, 1855426, --775778, 22958748, -3680250, -26988500, -28215250, 17171816, -31868120, 31176094, -8965744, 6941741, -30701500, 27875412, -14009110, 42377904, -24532854, 2880313, -25504590, 4264366, -8743480, 16779900, -5611912, -17908404, 16167868, 24788404, 36149664, -20759188, 7710003, 22376780, -30547418, 1575179, --12290586, -43963824, -19010598, 11956652, -24260122, 8811662, -20366734, -310311, 29706142, -13919452, -12578885, 34432752, 24447490, 9356049, 45526116, -70727912, -13370233, 23879482, -2734821, 14003741, --21963390, -38120520, 46563888, -456877, -23451058, 10265509, 29473140, 73338712, 27699854, -55071680, --30172682, 19071266, 20464446, 9103720, -38606924, -3127273, 8488466, -11691438, 26100516, 9581535, -16670379, 20072530, 14891725, -9882183, 11506217, -30419106, 4442607, 16662326, -1948305, -16008954, -9535364, -9664750, 16298327, 18267570, -7673496, -14698452, -4012573, 33495376, -5920076, -3607773, --12990665, 15308337, -12899397, -7675107, 9621800, -5904507, 31309774, -2090039, -7729868, 31768262, --2794413, 7653095, 19289772, -1160178, -1628866, 2155537, 2879776, -14490146, 6743636, 1127966, --21453898, 14914811, -6645925, 28001040, -15062987, 8657043, 2605435, 37443524, -32885490, -2972117, --15693810, -19490562, 30054034, -11652783, 39454108, -3876208, -30338576, 47305844, 68390376, -9703405, --21748640, -32952600, 7925289, 36361192, 7224135, -7580618, -22552874, 5454609, 5443871, -4931160, -5699959, -3141232, -11020886, -11259794, 10573673, 15021111, -1029718, 20274394, -19321448, 41473816, -31286152, 18085570, -1373853, 2585570, 6027450, -21751324, -19012210, -21072720, -11003706, -5662915, -13404056, 11796665, 22602266, -10672994, -2510945, -9431748, 25703232, 50020800, -11589969, -31872952, --20458002, -1110786, -43212204, 33949568, -58757300, 17219060, 25186762, 25882546, -25489020, 6221260, -26230976, -59463284, -28002650, 12492449, -6091874, -29669098, -26176752, -3168075, -13600014, 44654776, -19284940, -15992848, -14715095, -24372866, 68266360, 14901926, 35793720, -2259153, 10647224, 13156559, -15526844, -21938692, -2566243, 28562070, 19757924, 11973832, -9037148, -11788611, 303869, 9146133, -13334800, 9183714, -17234630, 2857764, 502511, 4905390, 12968117, 13045963, -18042084, 8929774, --10986526, -13511430, 1802276, 14756971, 6191196, -8267275, 2333778, -852014, -2262374, -7000797, -27529130, -7645042, 452582, -15857019, 4201552, -5615670, 18300856, 6193880, -3434900, -9167608, -10593537, 8862665, -12081206, 1285269, -19918984, -7588671, 5256503, 8810589, 11940546, 315680, -12495134, -2455648, 2433636, 6405407, -25191594, 7248294, 39902392, 820339, -12960064, 32602560, -24004572, -7215545, -20787642, -32471026, 6532109, 62753768, 14273250, 31999654, -2442226, 2465311, --2155537, -7779260, 396211, 2542621, 15684147, 4701379, -11870216, 10159208, -10342281, -12150462, --12968117, -5906, 13051332, 2413772, 10509785, 10537165, 9159555, -9202504, -15287936, 4646081, --10481868, -27456116, -7672422, 5847061, -9105331, 31404800, -32369022, 26338350, -8094403, -97174, -39766028, -6475200, -736050, 51197620, -7569343, -21237540, 4118337, -18234284, -3746822, -17227114, -57671212, -16491064, 14154065, -14044543, -5862094, -8121783, 9836549, -14688788, -34846680, 15266998, --3730716, -39242580, 20704964, -10459856, 22005264, 48744656, -24249386, -756451, -2226941, -7469485, --26117696, -4821101, 24470576, 9499394, 15125264, -22426708, 6881612, 3762928, -21201570, -6024229, -5068062, 10886668, 14068702, 980326, 2914672, 8851928, -1873143, -10829223, 15824270, -6269042, --4439386, 14023068, 2185065, -4020626, 21348672, -1519882, -1333051, 72478, 7146289, -6425808, -10901701, -8304856, -3856881, -6574521, 5793911, -251792, -520765, 2990908, 10037339, -11698417, -2774012, -1618129, 7270306, 2044404, -1997160, 11974369, -7075959, 6451041, -1828582, 3531537, -1071594, 8979166, -1068910, -13750338, -186294, 65972308, 33182918, 69208568, -38788924, -9780177, -22610318, -21328808, 16328392, 71198208, 16683264, 10512469, -18850074, -17389786, 20213726, -10492605, -28637232, -4458176, -6665253, -8075613, -40876276, 10092636, 48962628, -25632364, 29582660, 26149908, --16674137, -4718559, 20343112, -32304060, 16201154, -2017024, 24526410, 8621073, -20441896, -6269579, --41064720, -20732880, 19182398, 14774687, 31829466, 50044960, 5268315, 1103807, -43105904, -25997438, --25753698, -20858508, 11243151, -17246442, -5058398, -3707631, 12868796, -32565516, -5339181, 17369922, -8768176, 27461484, -3653944, -12649752, 26960584, -4544076, 16520055, -20430622, -12556874, -2865817, --6952479, 13585518, 19620484, 28103582, 7830263, 2644626, -19170050, -5034776, -9840307, 23600308, -254477, 35189740, 6053220, 26598732, -25512642, -8776766, -177704, -252866, 18997714, -2646774, --9438191, -4760971, 4672925, 1695975, 4948339, 9164386, 7864085, -4440460, -5669357, 748398, --3345780, 7794829, 7926362, 2245731, -6602439, 682900, -8660265, -3241090, -1881733, 15369004, -5386963, -1552094, 3923453, -9613747, -11806865, -7598334, 3777961, 8626442, -7018514, -284542, -157303, 6542846, 3442416, -518080, 6568616, 1445793, -293668, -6021544, 3139621, 2318209, --2585034, 1101122, 2016487, -8922258, -17722646, -67881960, 2110977, 108304040, 98347768, 91809760, -39410620, -39497056, -53908284, -54155780, -47757888, -88673360, -62717796, -61828200, 47894256, 72704672, -59939488, 94730336, 79441328, 16435766, -3339337, -34368328, -65949760, -39905080, -69315944, -38170984, --22984518, 34897, -8981850, 17134772, 30221538, 50466404, 32288490, 53041772, 40955196, 42075112, -3617436, -35254164, -15589658, 882616, -37835976, -50724636, -65216932, -64749316, -45383308, -6761889, -32287416, 12309376, 46832860, 32585916, 53370336, 46923056, 51760260, 59367724, 32424856, -4908611, --9334038, -39297340, -31593242, -105557408, -83882320, -67791224, -52431352, 5820755, -22719304, 1173600, -72179608, 88445728, 121742992, 76478336, 46470472, 31098248, 7633768, -46848968, -42348376, -65186868, --83562880, -71349608, -65961032, -31414464, 5057861, 33250564, 55479704, 54183696, 46675020, 28934658, -31419834, 13048648, 8674760, -1823214, -25482578, -22770842, -20219096, -23164906, -11874511, -25852482, --17977660, 5998996, 2468533, -15163382, 8352101, 20716774, 12235288, 23682450, 37696392, 38603168, -17457432, -24376624, -10121627, -3684545, -48795124, -52086144, -44863616, -19155554, 14295262, 21858700, -18776524, 30779346, 35443144, 43070468, 29066728, 17439178, -6361384, -29384556, -29272886, -33239826, --44056700, -31784906, -17182016, 14857366, 24358908, 15302432, 9760313, 27823872, 19276350, 11260331, -2960306, -4459787, -8688182, 659814, -10488847, -13080860, -4423817, 4080756, -7173669, -5834176, -1503239, 5574868, 1040456, -3068754, -3556233, 4147328, 283468, -2434710, -4254165, 1362042, -6297496, 7384660, 1348083, 6340983, 6000070, 3050501, -1664837, -1547262, -5073967, -4910758, --7512435, -4217658, -4878546, -1313186, 649077, 1353452, -466004, 2975876, 3819300, 5734855, --1509144, -677531, 1962800, 2957622, -2404645, -217433, -770947, 363998, 1316944, 4271345, --274878, 1339493, 771484, 955093, -2640868, -3868155, -6614250, -4076461, -5286568, -3925063, --4258460, 1277216, 3405372, 6363531, 6594923, 10074920, 7926362, 7090454, 2738579, 459025, --4954245, -6372121, -9303436, -8071854, -8845485, -5111548, -3101503, 838592, 1890323, 6354941, -5394479, 6966437, 5550709, 5234492, 962610, 907312, -1959042, -1920387, -4365298, -2586644, --3185255, -829466, -1946157, 120259, -849867, 1138166, -242666, 1372242, -259846, 1190243, --397284, 1078574, -589484, 840740, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ -1065689, --1229434, 4410932, 5027796, 2650532, -1900523, -7579544, -6891275, 2477123, 4005594, -1500017, -7452305, -1469953, 4458713, -5304822, -4618164, 1994476, 215285, -1401770, 1992865, 4778688, --2063195, 634581, -2719251, -308164, 287763, 1938641, 1867237, 2437931, 441308, 1438277, -5528160, -2154463, -2540473, -2809446, -4947803, 1399623, -1015223, 9075266, 1802813, -718870, -749472, 5493263, -477815, -1237488, -1376537, -3273839, -561567, 4216584, -620086, 1729798, -4330401, -1381369, -275415, -6943889, -4028679, -6335077, -1199370, -1862942, 964757, 311922, -942745, 2216203, -1476932, 1054415, 104690, 525060, 995359, -2332167, 2210835, -776852, --2585034, -364535, -2607045, -836982, 282394, -4150012, 1126892, 155156, 3210488, 301721, --19327, -1923609, 461172, 3132642, 1583769, -819265, 388695, 672699, 806917, 2382633, -325881, 119722, -545998, -394063, 280247, 64961, -209917, 1563368, 906775, 916439, -711891, 467078, 243203, 451508, 893890, 5130876, 12100533, 4779762, 2863133, 3364033, --7110855, -833761, 3068754, -961536, 1200443, -6485938, 6378564, 8642011, 1490354, 3861713, --1819456, -5059472, -7841000, -8583492, -5708012, 6807523, -6423661, -4079682, -5436355, 1745904, -4521527, 856846, 613107, 2530273, -256087, 1599875, 5572183, -779537, 4632659, -4409321, -4226785, 2944200, 2687576, -2321430, -7206419, -1530619, 4126390, 2447058, -2014340, -237834, -1427540, -301185, -3477313, -725313, 2948495, -1007707, 326954, -1713692, -381178, 218506, -985158, 5093831, 2128156, -2603824, 439697, 425739, -1728724, 933082, -2517388, -289910, -4128001, 1348620, 4631586, -3303904, -2840584, -1693828, -732829, 2363306, 5250598, -3023657, --3799972, 4525822, -425202, -81604, 156229, 1565516, 1116692, 3804804, -1069984, 1777043, --2317135, -2163053, 170188, 1033477, -160524, 83752, 872415, 957241, 740882, -1972464, -2214056, -467615, 3553012, 1503239, -3976066, -3757560, -4261145, -670552, -3477313, -7337415, --6982006, 7212861, -151934, 1518808, -47782, 4393752, -6493454, 9657771, 8582955, 444529, -463856, 13422, 261456, -953483, 3365107, 2613488, 219043, -5496485, 2389076, -1705102, -2649995, -765578, 5864241, -1364189, -3402151, -1544041, -912681, 2171106, -30065, 3622268, --5808407, 3136400, 1021129, -3227131, 9158481, -1453310, -1303523, -191663, -136365, -2412161, --772557, 4885526, 4005594, -8577050, -4039417, 4361540, 1262720, -2050847, 7470022, 273804, -1679869, 7348689, 3041374, 5769752, 1636919, -2214593, -2989297, -5771363, -5586142, 813896, -2983392, 7151658, 279173, -2914672, -3642132, 1245541, -60130, -1996623, 2327336, -805306, --1828582, 1674500, 3882114, 1257352, -1937030, 1944010, 2025077, 2532420, 1630477, 129923, -248034, -2399813, -498753, -31675, 1236951, 1038845, 1980517, 1910724, 1592359, 603980, --149787, -9793599, -3407520, -4766877, 4450660, -3257196, 2892661, -3521336, -1449552, 8297877, -4063039, -5514738, 2518998, 7914551, 1166084, -2779918, -5555004, -6684043, -4574140, -6720550, -4465156, 1010391, 2460480, -1293859, -3033858, -3211562, -5910412, 303332, -176631, 1401233, --1435593, -5385889, 95026, 5743445, -1265942, 61740, -2856153, -5735929, -8472897, -734976, -6120866, 2216740, 652298, -2880849, 791885, -4606890, -1497333, -3467112, 450972, 777389, --5229660, 5910949, -3320010, 7522099, 2858838, 710280, -3408594, -1800128, 1946694, -436476, -1843078, 4036196, 834297, 1597728, -4459787, 2636036, -2234457, 6914898, 8584566, 3926674, -5774584, 2676838, -863825, -6016713, -3866544, 491237, 4446365, 4460861, -3555696, 463856, -4227322, -5510980, 5455146, 344134, -2771328, 1787780, -1152125, -267899, -3083250, 604517, -899259, 530965, -2469069, 654983, -1738388, -2340220, -794032, 161061, 1053341, -1528472, -399432, -665183, -2142115, 227633, 1808718, 744103, -1525787, 999117, -1141388, 3279745, --7905424, 1040456, -8454106, -35433, 1292248, 787053, 3808562, 382252, 601295, 14948634, --1878511, -6604586, -7125351, 7506529, 5026186, -5668283, 1364726, -6322192, -2713346, 206695, -7144678, -8870718, 2578591, -352187, 1406602, -683437, 9070971, -4702453, 2552284, -1428614, --2411624, 1371168, -444529, 2712272, -2787434, -2589329, -7691213, 1194001, -2561411, -1664837, -598074, -2732136, 2254858, -4345970, -2590402, -7638063, -241592, -6783364, -2869575, -8065949, -5970542, 1200443, -2481954, 5244692, -6114423, -46171, -11639361, -641561, 4006668, -333397, -3433290, 7381975, -2610266, -1058173, 9244380, 3889630, 3561065, 5635534, -2938831, -8574365, --920734, -5141076, 3725884, 8506183, -1547799, 2482491, 4524211, 3799972, -466541, -734976, -1043140, 144955, -1589138, 2277943, 2045478, -3568044, 1168768, 2980171, -1518808, -1100049, --5284958, -1241246, -2230699, -746787, -2313914, 446677, -570157, 396211, -249108, 342524, -1349694, -1569811, 539555, -654446, -1595580, -229244, -280784, -497142, 106837, 887985, -1484985, -1488743, 506269, -1262720, 210453, -161061, -1666447, -673236, -1275068, -252866, --2020245, 475668, 98784, -1154273, 4301410, 4698694, 1806034, -2951716, 2145336, 1178432, -9172440, -1453310, -1875827, -12335146, -3389266, 9158481, 9084930, 5728413, 4643397, 13066364, -889058, -15743739, -3942780, -2675765, -3720516, 8297877, -1247688, -3102577, 9824201, 1461900, --3940633, -1455457, 3969624, -3520263, -1287953, 1129576, -1166621, -5522254, -2398202, -316217, --5199595, -2478196, -2137283, 3626563, -2398202, 7041599, 6983080, 613107, 6646462, 4548907, --2883534, -1066763, -2168422, -10247792, 1229434, 2049773, -9611600, -1446330, -2663954, 3418794, -8944269, 1296543, -8898635, 1268626, -3376918, -6105296, 4990215, -1466195, -6347425, 2870649, -2566243, 7066295, -478352, -926102, 5330592, 6153078, 6906308, -7039452, 5032628, -933619, --1095754, 1801202, 7450158, -365609, -1870458, 2294050, 1215476, -6271189, -728534, 8537858, -1985886, -577673, -978716, -3893388, 2857227, -1443646, -1661079, 271120, -155693, 1964948, --31675, -2674691, -1808181, 3557307, -343061, 1399086, -1509681, 1720134, -1228361, -997506, --1213328, 898185, 2007897, -935766, 6285685, -16067473, 6701760, -1772748, -3632469, -3316789, -2780991, -1543504, -9484362, -10152229, 1268089, 15788837, 4387846, -11516418, 2627983, 9363566, --6713571, 1202591, -1669669, 5578626, -1074, 5148055, 13863081, 10057203, 6323803, -246424, --1104880, -6402186, -6808597, 2715493, -17874044, -2841658, 8532489, 942208, -864362, -8587250, --3016678, -372052, -346282, -4175245, -8827232, 9935870, -3391414, -2183991, -1557999, -8222178, --9198209, -293668, -4464619, 639950, 4447439, 3367791, 3771518, -7337415, -1858110, -3604551, --2245194, 11800960, -1196148, -5386426, 428423, 15134928, -8024073, 2546379, 11189464, 350577, --2507187, -5610838, 3441343, 648003, 8074539, -4309463, 6841346, 5516886, 10561861, 5094368, -7924752, 842887, -5099737, 1117765, -157303, -2962454, 4811974, 6784438, -5561983, 3709778, -2083059, -5037997, 720481, 1809255, 1474248, 1852205, -2828236, 1655710, -3104725, -936303, --815507, 241055, 652298, 1381369, 1791001, -336618, 2654290, -170725, -1095217, 921807, -1788317, -560493, 1110786, -2677375, 1137630, -853625, 1772748, -1963874, 9264244, 13196287, -8126615, 1307818, -2802466, -4997195, -10958072, -3225521, 7289633, -14999636, -6102075, 13581760, --18846854, -3460670, 10586021, 13210246, -1332514, -13356275, 1872069, -5139465, 17830556, 7846905, --12203613, -7920457, -1856500, -7595650, -15366319, -7751342, -6805913, -5622112, -12440910, 6218039, -2234994, 7645042, -4723391, -2354179, -10942503, -1177358, -9492415, 935766, -6303402, 1344862, -3346317, -14745160, -4803921, -5648956, -3879966, 3107946, 3154654, -4747550, 14498199, -997506, --3768297, -2775623, 1416266, -3459596, -1178432, 5327370, 4607426, 5970542, 7962870, 7479149, -613643, 4883915, -2396055, 11234561, 12099997, -6139656, -3145527, 7353521, -197569, -18391050, -858457, -9371082, 5696737, 5732708, 10378788, -7927436, 4425964, -11098732, -1059246, 6241661, --2681133, 9785009, -2553358, -1264331, 1990717, 581968, 1394791, -716723, 592169, 4124242, --3092913, -857920, 4038343, -684510, 3173444, -4777078, -4085051, 2709051, -647466, 805306, -449361, -625992, 736587, -2882997, -726386, -553514, -1216013, -1969243, -652298, 1433982, -1808181, -151934, -1903744, -10231149, -12224014, -6091338, -11806328, -17017734, 12065100, 1119376, -6784438, -9433896, -9672803, -13507672, -9018358, 4085588, -9892920, -9016210, 12271795, -3115999, -652298, 2887292, 7045894, -5477157, -4028143, 1952063, -3208878, 1846836, -537945, -6077916, --11439645, -18094160, 6043556, -13011603, -11796128, 570157, -3047279, -886374, -6601902, 2970507, -3523484, -14755360, -235149, -3279745, -5668820, -8224863, 4735739, 945430, 14783277, 1704565, --8156680, -559420, 1455457, 6015102, 2628520, 12985834, -1027034, -14223858, 6162205, -3051574, -6498823, -8520678, 1944010, 4770635, -24975772, -11949136, 8960912, -808528, -2592550, 3813394, --1175747, 15796890, -455803, 9992241, 8816494, -12868796, -14790794, 833761, -16395501, -411780, --707596, 303332, 2507187, 10312216, -252329, -6524056, 6040872, 7754564, -7150584, 1248762, -2454574, 7802882, -3709778, 250719, -3761855, 2624762, -94489, 1636383, 2725157, 4197257, -4392678, -148713, -3976603, 165356, 3162707, 936303, 766115, -3762928, 539555, -3767760, --417149, 2019708, -467615, 3677029, 2877091, -167504, 920197, 2978560, -2630131, 5260261, -35433, -2314451, 2512556, 8653285, 35062504, -8604430, -23681376, -2064269, -10405095, 25585120, -1889249, 14346265, 7643968, -4416837, -11390790, -5035849, -12405476, -3137474, 17100950, -19131394, -714575, -15605227, 4143570, 1323924, 7532299, 1788317, -7602629, -12648679, -14874009, -2721936, --14596446, -11325829, 1742683, 3389266, 10656351, -10060961, -21122650, -4388383, -7414724, 2531346, --9999221, -6662568, 2901251, -5250061, -8486319, -564251, 780073, -4269735, 20333986, -4194573, --3497177, 5171141, 5207111, -6074695, -2724620, 15142981, 12556337, 8334921, 15824807, 12505871, --126165, 5235029, 8919573, -6752763, -6501507, 1859721, 6378564, 10619844, 4192962, 21554830, -2197950, 14450954, -4268124, -8354249, -5552319, 30588758, 5260261, -3978214, -3869766, -10995116, --10696616, -7583302, -7559143, -8807367, 3323231, 7037841, -7686918, 2394444, 7408282, 3762391, --7119445, 1383516, 7553774, -1964948, 4084514, -3899830, -1301912, 1708323, -1533840, -901943, --2550674, -4982699, -999654, -4519380, 2142652, 3710852, 1677185, -3780645, 4722854, 3176128, --2993592, -3315715, -5317707, -1561221, -1655173, 1277753, -1366873, 2300492, 1491964, 377420, --763967, 18790, -4316979, 1615982, 6535867, -30669824, -11547020, 15553150, -3797825, -15606301, --14873472, -4849555, 16595217, 9032316, -13569949, 7575249, -18018998, -7213398, -2290291, -11621645, --16205448, 13635447, 7274601, -14178761, -5195300, 30988190, 7009924, -13498008, -18942954, 524523, -9948755, 1925756, 1564979, -21304112, -810675, -2214593, -15637439, -8788040, -6422050, -12148315, --6054830, 3824132, 284005, -12834436, -13269301, 1908576, 8004746, 26307, 10794327, 18671834, --13174275, 11664594, 8393977, 3876745, 2261837, 14136348, 4101694, 8810589, 5494874, 7964480, --2840047, -1427540, 15611669, 25038586, 3856881, -5524939, 2786897, -3323768, -9649718, 16021839, --7974681, -13059385, -21296596, -6987912, -24774982, 12494060, -10268193, -3989488, -1706713, -3285650, --9091909, -1228361, 9470940, -10917270, -1275068, 5390184, -3500398, -10640781, 5165235, 1132261, -2737505, -482110, -1597191, -3650722, -736050, -1775969, 5519570, 1777043, 1297080, 1190243, -1586990, 321586, 2647847, 2255932, 4843650, -6994891, -1180042, 840740, 4463545, -1738925, -3660386, -4120484, 1166084, 1308891, -1290638, -2171643, 3845070, -1665374, -686121, 2661806, -388695, 481036, -6238977, -13614509, 11578158, 6879464, -2004676, 7671349, 5765994, 16375637, -12691091, -26703422, -8808441, 29626684, -23325968, -6931541, -14113263, 21106544, 9455907, 9715216, -4149475, 3076807, 8507793, 22396106, 10719165, -9889162, -143881, 726386, -576063, 8858370, -10027675, 1199370, 5957120, 5630702, -5088463, 6933688, 4228396, 13840532, -6593312, -13328894, --11381663, -8920647, 2698313, -1166621, 5349919, 6000606, 6100464, 12193949, -5285494, 2571612, --5327370, -9512816, -3787624, 1010391, -10897406, 14008036, 17016660, -18418968, 6345278, -12757663, -10489384, -2081985, 4118874, -1394791, -10129680, -2479270, 11798275, -9169755, -2754148, 2082522, --18737868, -7181722, 4010963, -14540612, -939524, 23284092, 11646878, -1560684, -5255966, 18582712, -4950487, 13386339, -4133369, -5991480, 19466402, -6571837, 6127845, 2593624, 2829310, -3980898, --2850248, -3556233, -2394444, -6511171, -3954591, -4531728, 729608, 4215511, -1468342, -9145596, --2867965, -1242856, 1114007, -257161, -2203855, 65498, 2665564, 4504347, -3493419, -78383, --9804337, 1706713, -1151588, -1831804, 6750615, -79457, -560493, -3893925, 4162897, 1165547, -6125160, -2015413, -268435, -3999152, -357019, -5777268, 18556406, -1540283, -4289062, -15425912, -691490, 1438277, -4113505, -353798, -7119445, 2682744, -22095460, 20171314, -4054986, -7164006, --13973676, -15825344, -1606318, 19247896, -3464428, 5326297, -11873437, -6886980, -3291019, -11596949, --13953275, 12779675, -7867307, -6442451, 11370926, 11018739, -15549392, 5430450, 5934571, 13498545, -11191074, -4070555, -9822053, -6220187, -15111842, 16682190, 11016591, 5543192, 11943767, -12309913, -8485245, -1778117, 7784092, 8580271, -8012799, -623844, 27199492, 22767084, -17143362, 6905234, -14151917, -10811506, 3416647, -25346750, 7663296, -13703630, 11411728, -7939784, -8702677, -6175626, -30351998, 1758252, -8749922, 2714419, 10259066, 1369558, 6135361, -16285979, -1778653, 27231704, --811212, -10644540, -16549583, 552440, -12226161, 7727183, 7933342, 9548249, -16898548, -17699560, --4643397, 3033321, 5930813, 1901060, 190052, 485868, 6568079, -4300873, -1643899, -1293322, --2755759, 3244311, 2807835, -5368172, -3629247, -8276402, 5209796, -2995203, 2341831, 3716221, -5482526, 4334696, 1960653, 8444979, 652835, -1880659, 4133906, -6150393, 3601867, 2486786, -1831267, 5621576, 6070400, 1180579, -691490, 3585224, 534187, -453119, -6415608, -8501888, --1486596, -573915, -923418, -16651588, -701690, -1897839, -2915209, 5122822, -24552180, -11016054, --13860396, 11731703, -6007586, 17339320, 10186052, 22010634, -11014444, -664646, -17293148, 14754823, -26230440, -7995619, -21180632, 2296734, -4476430, 32670206, -8171712, -12479564, 12180527, 7058242, -4997195, 12460774, 3982509, -40511204, -23622, -2486249, 15748571, 28881508, -27212912, 1323924, -7947837, -12719009, -2792266, -36702108, -8528194, 19106162, -30575872, -17942226, -9494562, -11639898, -11969537, -7104950, -10994579, 16553878, 4796942, 6207302, 16638166, 2118493, -5932961, 12219182, -17467632, -16867948, -12925167, 26492432, 17877802, 6361921, 8179229, 6475200, -11949673, -16755741, --169651, 510027, -3651259, 5654325, -10460930, 7610682, -14430016, 6085432, 33195802, -15226196, --12967043, 18633178, 5140539, -5946382, 11458973, 16417512, 11837467, 14545980, 6915434, -6933688, -5734855, -17269526, 9256728, 4294968, 4828080, -8605504, -2803003, 2183991, -969052, -1461900, --2815351, 6093485, 11155641, -4086662, -11046656, 7249368, 12923557, 7152731, 4999879, -15130096, -9228811, 1343251, 4931160, -2138894, -5432060, -891743, 7758859, 1066763, -1596654, -6323266, --686658, -3537979, -2060511, -2727304, 3374234, 7821136, -4628364, 658204, 4568235, -1477469, --962073, -3706557, 600222, -2358474, -3188476, 7044820, 2369211, 9690520, 8708046, 14256607, --33018634, -60918744, -28118614, -4267050, 20696910, 1467268, 22822920, 21118892, -6441377, 3411815, --5231807, -11605002, -19112604, -11110007, -13819057, -8026757, 21653614, -28272160, -4986457, -23574538, --29272886, -5156645, -29547228, -23753854, 2809982, -6257231, -3497177, 5298916, 25751550, 1737314, --18868866, 996432, -2363306, -5724118, -24480776, -1682017, 28919088, 2595771, -623307, 11669963, -22428320, 15084999, 3808026, -9296994, 7723962, -7832947, -20827370, -38044284, 35921496, -4693863, -29893510, -2663954, 236760, -10939282, -17532594, 31532576, -18174690, -14779519, -1699196, -23241678, --21870510, 17864916, 13035226, 6767258, -2495913, 9006010, -16212965, 6044630, -13200045, -18538690, --20232518, -15815680, -6652905, 15307263, 767725, 5361730, -9488120, 5272073, -12349642, 8603356, -6624987, 6056441, -4187593, -743029, 7571491, -2371359, -9705015, -7384660, -9614284, -1067836, --7167227, -1865626, -2690797, -2790118, 2494839, 853625, -3988951, 1316944, 4639639, -1588601, --3406983, -7634305, -341987, -5347235, -979789, -1132798, -3776887, 8240969, -8338142, -7863548, --3859028, 4210142, -7425462, -7512972, 714038, -6344741, -359167, -1427003, 3033858, -1148367, -803159, -5211943, 1625108, -10408853, -5389110, -1904281, -21522082, 4497368, -5136781, -15904264, --23083838, -656056, -22068078, -26506390, -4021700, -12342662, -28266254, -40101036, 4875862, -15446313, -7691213, -3300146, 15244986, 32977296, 2051921, 3011309, -16601122, -18600430, 15460272, 7985955, --11936788, -394600, 10193568, -23071490, -17059074, -1686848, 29009282, -25132538, 643171, 119722, -13515188, -21543020, 22259742, 11051488, 6517613, -1055488, -8857296, -24937654, 33286, -6340983, -9118216, -13763223, -32176822, 26239028, -19287088, -9217000, -1107565, 25657598, -19649476, 8668855, --16102369, 9615895, -5684389, -24579560, 11740293, -31179852, -6543383, -9325448, 10927471, 24599962, --14330158, 8769786, 25667798, -20928838, 3562139, 5608691, 6172942, 6978248, -36967856, -11674258, --6114423, 12818330, 2977486, -619012, 6944962, -7095286, 14979235, -3271691, 3519726, -14858976, -12509092, 2601140, -22774064, -11028939, 10901164, 12912282, -1803349, -4021163, -8859981, 12053289, -1684164, -386547, -23740968, 3288871, -11390790, -18636400, -5397700, -4240207, -2275259, -11222213, --13629005, 4296041, -3121368, -7344931, 3946001, -2000381, -1955821, 166967, -3668976, 664646, -7350837, -14533096, 1367410, 1967095, -4624606, 9358734, 9263708, 9949292, 4187056, 5735392, --6778532, 2104534, 240518, 2359011, -3162707, -556735, -342524, 3736085, -2858301, -6923488, -5850819, 43455404, 4551055, 18290656, 50070728, -23477902, -13014288, -19696184, -7191386, 22890566, -1617592, 28220082, 7726110, -1172526, -10484552, 21282100, -13258564, 4718559, -8829379, 8688182, --14055817, 16169478, -7859254, -3984656, -9242233, 12386686, 8697846, -14011257, -3203509, 13045426, -4083440, -9066139, 971200, -11609833, -37448356, 16082505, -19637664, -29064044, 17920752, 7700877, -19374060, -2024003, -18717468, -7246147, -4958003, 10984379, 15048492, 16424492, 27850716, 27174794, --12089259, 3546569, -28939490, 57445, -21055004, -37981468, -3649112, -31013958, 10045392, -24821152, --16115791, -16525960, -22986664, 2027225, -5404143, 1681480, -6801081, -3173444, -1953673, -40176196, -6433324, 5796059, 9163850, 18886044, -3561602, -32007170, 18435610, -20830592, 11936251, 11430519, -25977572, -14354318, -12825309, -8812736, -4967130, -18714246, 7460895, 3962644, 2411624, -4705674, -6606197, -9494025, 9429601, -1830730, 2033130, 2472291, -11282342, -356482, 4560719, 10970420, --2854006, -7082401, 5057324, 7505992, 9774272, -6336688, 190589, 5106179, -530428, -1342714, --3458523, -7468948, 5192616, -437550, 3367254, -4305705, -420370, 6284611, -4226785, -7042136, --3730179, 760746, -2731062, -12145631, 19203336, -5141613, -3779571, 1353452, 3797288, -3485903, -3655554, 4274030, -1717987, -651224, -2441152, -4014184, 31324808, 58100708, -31830540, -26038240, --45010184, -92026120, -22582402, -9822590, 20653424, 12198781, -7822746, -17932562, 25207700, 30448634, -2767570, -1702955, 280784, -24450712, -14184129, -17410724, -13098040, -25858924, -255551, -6710887, --3007551, 17340394, -23983098, 19042274, 18174154, -5896990, 9391483, -1311576, -42754788, -30771294, --16962436, -15861314, -7122667, 3114925, 16564615, 5078799, 8926553, 41076532, 37650756, 8235063, --27896886, -14820322, -1180042, -14654965, -26461294, -66420596, -55541444, -25296284, -5934571, 2424509, -14494978, -46180564, -26417806, 23475218, 27612882, 32822676, -30198452, -36992016, 11951283, -22696754, -54415624, -27768038, -3131568, -16481937, -8740795, 7176354, 16088411, -8373576, -21521008, 19628000, -19360638, -4744865, 22175990, 19367082, -43130600, 38206956, -25023016, -250719, -7388418, -26145614, --7269769, 12667469, 9685151, -2483565, 4992900, -16110959, 310848, 7499013, 10604274, 16411070, --12694313, 2139968, -3679713, -7283191, -17961016, -2627446, -17311940, 14759118, -2893734, -18760954, -2820720, -21433498, -1509681, 2063195, -4983773, -9550934, 498216, 1192390, 2068027, 6345278, --1435056, -833761, 12090333, 3466576, -12500502, -14688788, 3692598, -9939091, -20141250, -7421704, --18968724, 5592048, 5738613, 14154065, 1994476, -15187541, -10915123, 10807211, 54783380, -18240726, -17663590, -747861, -24378772, 3789772, -49221400, -11060615, 10596758, 998580, -28638842, 16996796, -50210852, 35243428, -15504832, -31388158, -13352516, 3573950, 52774412, 7138773, 1369021, 247497, -24429774, 25121264, 6604049, 19219978, 15599858, 29528438, -8341364, 3420405, 18895708, -17129940, --26094074, 14755360, 43347496, 9438191, 21050172, 2071785, 12959527, -57863948, 10810433, -2200634, -13179107, 56854628, 23017266, 7744900, -5532992, 25518012, -5701032, -11866458, 9112310, 15884937, -33548526, -10704669, 20904680, 3854196, 5900212, 13222594, 17056388, -456340, -21985938, -13666586, -5332739, 42908332, 29506426, 22866406, 24852828, 20736638, -5744519, -52968220, -37918120, -72688024, --826244, 22259204, 42084772, 6594386, -30348238, 10165651, -18696530, 6142877, 14688251, 4446902, --8629126, -4843650, 390305, -4034048, 11979201, -7976828, -20906290, 472446, 7306276, 9478456, --13415330, -6146635, -25172804, 6373195, 11365020, -9717364, -8482024, 6424198, -4679904, -6233608, --5188321, -19730542, -3920232, 20461224, 13121125, 18527416, -9611063, -20868172, -15142981, 13616657, -11084237, -4887136, -538482, -1239635, 4204236, -5855114, 12674448, -13930190, -7453379, 991601, -2765422, 8052527, -16781510, 3571265, -12186970, 33643552, -9374303, 7330436, -10465225, 3866008, -338766, 3142306, -1240709, -7994008, -20573968, -9014063, 45056356, -2102387, -20656646, 4842576, --3775813, -17294222, -13547937, 2222109, 23850490, 63986960, 29004988, 56686052, 29939144, 25029996, -24244016, -17215840, -14037564, -16482474, 7260642, 46409804, 15155329, -39294656, 16957604, -42225436, -21122650, -26881664, -5524402, -23631984, -24974698, -1486059, 3359201, -650688, -31275414, 40626096, --8180302, 15091441, -39584028, 10354092, -9102646, -12511240, 20723218, -17141752, 41315436, 4576288, --16103980, 1843615, -12096775, -17145510, 11726871, -28178744, -5851893, 34803192, -7518341, 14090177, --1753957, -25677462, 28002650, -15269682, -57723824, 6955700, 4488241, -479426, 6522445, -8223252, --11128260, -3478387, 26345330, -49971408, 29541858, -11961484, -6768869, 32489816, -19981262, 9390409, -12232067, 47279536, 16702054, 20775294, -3205656, 28167470, -22513682, 22299470, 3869766, -8919036, -6207839, 1140314, 1115081, -12478491, -2997887, 1980517, -5033165, -9389335, 19504520, 119185, --1180579, -5896453, 6647536, -7776039, 17426292, 9807021, 9476845, 1932735, 146566, -1834488, -14641544, -11738146, -14543296, 5493800, 7805030, -900869, 13192529, -5742908, -2325188, 462246, --4125316, -14577119, -14105746, -1546188, 5123359, -7338489, 2808372, 4418448, 5466420, -4065724, --6442, 9257265, -4025458, -13540421, -24250996, 39779452, 36911484, 128837208, 51993264, -70030512, --32937030, -34240552, -53868552, 37693168, 115778360, 46476376, 22010096, -28870234, -7926362, -1789928, --1294933, 55736328, 38149512, 24421720, 83715352, -99963216, 6622840, 52552684, -12574591, 10972031, -54986856, 9834938, -15528991, 29815662, -55083492, -110566952, -10413685, 11131481, -42799884, -4621385, -59557776, 10274636, 3689914, 22839026, -46672336, -95190432, -87005296, -39399884, 29081760, 57043608, -125942936, 31885300, -15817828, -15492484, -33801928, -74854840, -22569516, 55337968, 55642912, 58409944, -56922276, 35897872, 29797946, 8899709, 13211856, -47943648, -29352880, 7558606, 13852880, 25149182, -30700426, 75093744, 19917374, 43878996, -28251222, -27827630, -50319300, -10608569, -38385732, -8828842, -78288128, 100456064, 2567317, -3612604, -61887256, -71380208, -40036612, -16617765, 40329744, 21715892, --3935801, 15300284, -5082557, -9789304, -18341658, -17297444, -1921461, 5022428, 4160750, 22493280, --1113470, 42950, -10758356, 907849, -13500156, -4167192, 559956, -20095616, -8768713, 999117, --5093295, -882079, 12641699, 11317239, 25805238, -10518375, -3981435, -24958054, -20084878, -15082315, -26768384, 17208860, 8853001, 9331890, -7428146, -22049288, -17620640, 1497870, -12192875, 22908818, -33711200, -528281, -7171522, -22667226, -7802345, -92177512, -56281788, 32668058, 86888800, 100357280, -210000816, 127497176, 87159920, 76317808, 60034516, -10698227, -90412816, -99729144, -192505264, -205443312, --194047696, -124608816, -42981884, 42912092, 75094816, 124100936, 122654600, 85487032, 85157928, 108008760, -104366632, 92957048, 59581932, 40830108, 36735928, -3994857, -5866389, -120255864, -85031224, -107628120, --129500240, -54943368, -126447056, -102744744, -186508960, -163917968, -115524960, -77787224, -11062225, 96962648, -118286080, 98985576, 106548472, 97919352, 182476512, 236658064, 212241712, 209745264, 185847536, 178668496, -133554696, 132726304, 29045254, -90016608, -186213136, -178899888, -266694928, -223225024, -324016096, -386887968, --343030432, -326582880, -195870912, -137057776, 25600690, 64553360, 153186448, 226628240, 350367328, 302690496, -437952448, 377502944, 271227712, 265872976, 121760712, 8508867, -23691576, -95106144, -164907952, -198085504, --235736256, -205097040, -184948272, -179319712, -144844016, -150151520, -122494616, -108622408, -32347546, -23364086, -30482994, 69508680, 80850072, 104324216, 149424592, 179727744, 192560032, 200594304, 148203760, 121882048, -119082264, 43663176, 29694868, -67014376, -159148400, -213157072, -217159984, -244045408, -154161408, -176853328, --117088864, -85226112, -22772454, 42069204, 84035328, 126450816, 132184600, 197736000, 204031344, 195104800, -166320992, 148402928, 59906204, 14995878, -36223756, -84079888, -159335776, -188798176, -155959920, -106448616, --93170192, -65768296, -59151900, -31368830, -2874944, 8151848, 6787659, 28993176, 33787432, 51832204, -45134736, 41385768, 39642548, 44386340, 32503238, 30578020, 35675072, 37160592, 22272090, 14761803, -2409477, 1009317, 6252399, -2629057, -19440632, -14954002, -20917028, -26305600, -34731788, -30588220, --25763898, -16822850, -20348482, -15826418, -13462575, -3526168, -7865159, -5773510, -2894271, 6385543, -1772748, 6390375, 10907606, 17753784, 13412646, 17358110, 14151380, 19922206, 16814796, 13439490, -4458176, 6264210, 2451353, 2217277, -5274757, -3982509, -5122822, -1787780, -6752763, -3617436, --6681359, -4328790, -5618354, 1537598, -1545115, -2152852, -6394133, -3369402, -5775121, -3454764, --9378598, -6380174, -5711770, -981400, -3026341, 1549410, 632434, 4584341, 2607045, 7270306, -5428839, 7226283, 3569655, 5640366, 2413772, 5518496, 2407866, 4931696, 1526861, 3433290, --510027, 1289027, -2632278, -290984, -3603478, -694174, -3555696, -360240, -2972117, 301721, --2369748, 894427, -1761474, 1389959, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --5146982, --13877039, -1143535, -2240899, -1867774, 176631, -2287070, 833761, 1379758, 5645735, -1895691, --259846, -5215701, 353261, 5281736, 332860, 3821984, -1156957, 1613834, -2233920, -3289945, -75162, 3631395, -501437, -4517232, -224949, 4400194, 1392106, -1868311, -1605244, -195958, --642635, -1015760, 12885, -733903, -1549946, -185220, 860067, 620086, -241592, -3446175, -5090073, 6995965, 183073, 817118, -2867428, -1603097, 512175, -3650185, -4093641, 2421288, --3333968, 2391760, 3058554, 3087008, 1115618, -470836, 793495, 641561, 2289218, -5029944, -390842, -654983, -3700651, -4955856, 102005, 2463701, -1927904, -271120, -617938, -359167, -3445101, 1718524, 424128, 1353989, -1181653, -4085588, 1539209, 645856, 3444027, -4202089, --3216931, 2346663, -1917703, -889595, -3163244, 688805, -1877438, -1721208, -2147, -1385127, --1531156, 387621, -849867, -398358, -1738388, 1021665, -257698, 74088, -499827, 828392, --210453, 250182, -351650, -294205, -30602, -581431, -79994, -12768401, -2916283, 4861903, --682363, -3982509, 1676648, -9486509, -3616363, -1436130, -1690070, -4940823, -5133560, 2710124, -4281009, 3600256, -4800700, -7156490, 811749, -4219269, -7556458, 1662152, -471910, 2072322, -8513699, -2869575, -888521, -5440650, 7357816, 498216, 3675955, 2462627, 6042482, 2998424, -1875290, -6056978, -669478, -5574868, -1508070, 170188, -2301566, 1779190, 1573032, -2674154, --5098663, 3184182, 5338108, 1428077, -2524367, -4016331, -2434710, 1192927, -4427038, -5697274, --1585380, 2713346, -1537061, 1301912, 3554622, 2163053, -2608119, 5056787, 479963, 4296578, --3636764, -3151432, -1760937, -2222109, 3073586, -1786706, 207769, 5106179, 1869385, 59056, --4871030, 1264331, -1924682, 3561065, 5306432, -979789, 469225, -2478196, 2033667, 4573067, --1611687, 2823941, 1350767, 545998, 2428804, 883153, 157303, 1839320, 765041, -221191, -54224, 775778, 816044, -927176, 687732, 576599, 1024887, -665183, -2612951, 3293703, -4502737, 1845762, -2834142, 1992328, -1334124, 1387811, 8481487, 5259188, -7174743, 4891968, --3949223, -1919850, -1040456, 171262, 3607236, 165356, 9927280, 2899103, -3810173, -2471754, --2471217, 7024419, 1647120, 6767795, 2212445, 4568772, 7028714, 8093329, 3069828, -871878, --799401, 1254667, -6449967, -5967857, 1927367, -4519380, 2601140, 1288490, -1535988, -629213, -1904818, 6768332, -2190970, -2238215, -3444564, 8636642, -1147830, -10663330, -5328981, -4197257, --3880503, 4475893, 4270808, 3792456, 5617281, 2538326, 3529390, -101469, -314606, -102005, -5653251, 1887638, 3327526, -7396471, 513785, 404264, 430570, 554588, 3272228, 2336462, -969589, -3547643, -3566970, 2158221, 1773822, -995359, -190589, -2840047, -3663607, -2951180, -2094870, 3654480, 476205, 282394, 1289027, -959925, -88584, -740882, 692027, 714575, -418759, -411243, 1121523, 1804423, -205085, 257698, 430034, -184684, 506269, -618475, -1307818, 103079, -187905, -714575, 1164473, -2063732, 1276142, 456340, 976568, -56908, --1222455, 352724, -561567, 18983756, 4050154, 3003793, -2382096, -1180579, 1745904, 1446867, -4946192, 6780143, -389231, 9922448, 3824132, -3331284, -3318936, -124554, 4603131, -430570, --2642479, 5307506, 644245, 14250165, 3615289, 2916820, 498216, -1245541, 581968, 2256469, -2655901, -523986, -55298, 7698192, 976031, 8462159, -4282620, -3896609, 2669322, 12646531, -3546032, 3141769, -1171452, -5306969, -2215130, 1806571, 287763, -12885, 374199, -7580618, -459562, -3274376, 2995203, 2535641, -3121904, 1877975, 2612951, 1920387, -3699041, -3605088, -798864, 1418950, -73551, -4666482, 1163399, -1752884, 2976949, -336618, 511101, 2046015, --820339, 1176284, -1787780, 625455, 10915659, 1347546, 3813394, 231928, -3114388, 1907502, -572304, 3507378, -6203544, -4165045, 2007897, -798864, 1172526, -1496259, 2245731, 2051384, -161598, -2613488, -1109712, -3591130, -741419, -753230, 2284386, -1606318, -535797, 494995, --410706, -793495, -972273, 781684, -1027571, -1147293, -99321, 136902, 579821, -2406256, --1054951, 719944, 277025, -2629057, -745714, -95026, -3578782, -1388348, -459562, 2841121, --4218732, -656056, 4169876, -2075543, -6615860, 25770, 10764799, -682363, 8441221, 4420058, -11699491, 1484448, 1048509, 4341675, -3350075, -6941204, -9258876, 2237678, -4733591, 10901701, -6159520, 7721815, -1472100, -3119220, 928787, 1785096, 3555159, 10209674, 1191853, 4293357, --4656819, 3298535, -3308736, 1453310, -1791538, 3406446, 5791227, 851477, 5533529, 2101850, -2763812, -1539746, -1352378, 7486128, -1743220, -1790465, 5580773, -3278671, -323196, 864899, --2454037, -3178276, 2469606, -3654480, -716186, -4683662, -10138270, -1070521, -1542967, -199179, --10561861, -3967476, -3223910, -2670396, 3971234, 10470593, -2649458, 3408594, 5444408, -1453846, -1027571, 985695, 622770, -3725884, 4144644, -4743255, 1263257, 3520800, 9759239, 3113315, -2896956, 951872, -118112, 3007551, -3513820, 35970, 2024540, 1019518, 186831, -3882114, -2370822, 2944200, 2909304, -481036, 2171643, 1239635, 627602, 2029372, 1155346, 302258, -1132798, -204548, 885837, 624381, 751619, 1203128, 1447404, 1748052, 1193464, 1196148, -1292785, -677531, 1174137, -13617194, 1096827, 7455527, 3787624, -7599945, -669478, 449361, -1724429, 2905546, -530965, -5897527, -5820755, 976568, 9625559, 4703526, 5673115, 9859097, --6702834, 7057705, 12816182, -1107028, 2822331, -7240778, 2427730, 2716030, -6362994, -3308199, --1438277, 3041374, -6426345, -8304856, 1523103, 981937, -7259569, 629213, 2190970, -1412507, -15219217, -822486, -10908680, -695785, 3674345, 8651675, 3107946, 3897683, -7016366, 1952600, -2128693, -6168647, -470836, -1030255, 10555956, 6521908, -1825361, -3627637, -8286603, 3562139, -3238405, -4843113, -225486, 1983201, 3161633, 3316252, -4245575, -108448, -969589, 9971303, --8428873, 1035624, -2235531, 8978092, -697395, -2190970, -3815005, 1126892, -3945464, -9136469, -203474, 6948720, 2030446, 4355097, 1037772, -3293703, -1355599, -1663226, 5871757, 2347200, --1652489, -224412, 5330592, 4013647, -1559073, 571768, 805306, 1153199, -143881, 2147484, -1453310, 1310502, 99321, -759136, -380641, 420907, -806380, 249108, -1109175, -363462, -847182, -2802466, -692027, 5303748, 4654671, 1755031, -3578782, 1050120, 2174327, 16126528, -10557566, 8049843, 11200201, 4626754, -1087164, 1655173, 4069482, -11362336, 5730023, 200790, -6165426, -4571456, -2455648, -7329362, 1954747, 12961674, -12802224, -8031589, -13605383, 6825777, --3218541, 426276, -6280853, 783295, -2442226, -6144488, 2180770, 2989297, -9738301, -1327682, -1561221, -2134062, 4879620, -13907641, -6901476, 14171781, 1240709, -280247, -1593433, 468151, --7406134, -7695508, 257161, -11183021, -2772402, 1082869, 2783139, -4835060, -1309428, 13790603, --1102733, 4808753, 10081362, -9639517, -3548717, 2200634, 2220498, 1792612, -3160559, -6911140, -7635915, -926639, -7539278, 5313949, -1540283, 1197222, 1821603, -4013647, -2617783, -1739999, --3214783, -4349728, -5377299, -5019206, -6544457, -1986959, -2901787, -703838, -1048509, -159988, -602906, -2681133, -2294050, 1405528, 1524713, 2801393, -392453, -1264868, -3955128, -1146756, --4537633, -2842732, -814970, 746787, -548682, 484794, -1326071, -738734, 2965138, 1137093, -1983201, -2262911, 328028, 419296, 598611, -4483409, 85362, 1197759, -235149, 2225867, --610959, -790274, 237834, 623307, -26830660, -14705968, 11905112, -4511327, -5820218, 7429757, -6207302, -11276437, -15547245, -4813585, -5646272, -5671505, -1181116, -10480257, -7777112, 3995393, -282394, -14142790, -15851114, -8695161, -4440460, -684510, 7919383, -471373, -6002217, 4526896, --13216688, 500364, -743029, 660888, 4439923, 2612414, -9664750, -7073275, 5592048, 2100776, -21144660, 5313949, -7212324, 1052804, 565325, 302795, 5491116, 1156957, 2221572, -2107218, --4799626, 1463510, -12355547, -2212445, -5454609, -6400038, 1291711, -9665824, 11225434, -1393717, -4624069, 8181376, 2291365, 4366908, -644782, -5203353, -336618, -614717, -6660421, 8578660, --3638911, 15217606, -606664, -287763, 600222, -3876208, -8312373, 2615635, -6543383, -2554969, -8779450, -11410654, -11370389, 7610682, 7092602, 6220187, -9646497, 6947110, 2782602, 4073240, --377957, 1814087, 1789928, 5413807, 2204929, 1371168, 3896072, -475131, -323733, -3206193, --2610266, -468688, 2633352, -3447248, 409096, -347892, -2127620, -1213865, 832687, -4452271, --2816425, -3307125, -650688, 1510218, -79994, 3397856, -1174137, 3551938, 252866, 1356136, -506269, 2763812, -2149094, -1646583, 3073586, -1362042, 380641, 291521, 5387500, 19833622, --11080479, 9474161, 3858491, 7077033, -2828773, -10711112, 1522566, -2757369, -10084046, 20471962, --1450625, -5596343, -20121384, 12437688, 3423626, -144955, -7522635, -8617315, 224949, 20798380, -7706245, -721018, -2049773, -8801999, -7242926, 6069326, 2642479, -6862284, -4897337, 7321309, -1803886, -205085, 6211060, 9659918, 1502165, 12723304, 14319958, 8791261, -3304441, 3257196, -1168768, 2465848, 7472170, -10510859, 11166915, -665720, -5677410, -8499203, 52076, 7439420, -5136244, -10047002, 2227478, 8135205, 1235340, -7244536, -15862388, -14318347, 3808026, 6495601, -1077500, -5480915, -740345, 11643119, -5282810, -8580808, -16747151, 1890859, 3260954, -12378633, -4705137, 12619151, -5675263, 9844065, 3389803, -11450920, -8568460, 1024887, 11903502, -1107565, -12505334, -2040646, -4362076, 2758980, 6385006, 1826972, -2114735, -3221762, 2159832, 5777268, -4601521, 908922, 7438884, 1509681, 5343476, 1459215, 7299834, 1236414, 4516695, 64961, -3614215, 2075543, -1773285, -5179731, 481573, -6078990, -846109, -2402497, 999654, -668404, --214748, -5376762, -493384, 2734284, -2675228, 511101, -629213, 545461, -340376, -3840238, -636192, -689342, 23946590, 15640660, 3629784, -4846334, -2500745, -3403762, -16343424, -6692633, --155693, 10410464, -7480760, -4278325, -3467112, 119185, 17334488, -13489955, -3537979, -804233, -8172249, -2868501, -9857487, -16668768, 6008123, -11536282, -5185100, -7219840, -7678328, 2373506, --12939126, -6381785, 11610370, 17220134, 867047, -10880763, -9568113, 15876347, -1702418, -8698383, -16721918, 453656, 1107565, 638876, -18061948, 7321846, -6635725, 6535330, 6191196, -12401718, --1251983, -12578885, 4959077, -12200391, -1969779, 5022965, 7000797, -4117800, 4295504, -14791867, -10242960, -1208496, 7022809, 5744519, 4307316, -3333432, -2975339, 14618995, -10043781, 7228967, --2379949, -12564927, -7427609, -898722, 13314935, -7617662, 6305012, 1709397, -3941706, 104690, --14574435, 18524730, 11559904, -2261300, -4922570, 9045201, 4088809, -2747169, -4628364, 965294, --3035468, 4629975, -830539, 2403571, 7866233, 2708514, 6262599, -74088, 2326262, 841814, --976031, 97711, -403727, 5216238, 2250026, 7263327, 1401233, -4173098, 5519570, -2205466, -24159, 3947612, -3680787, -1341104, -1854889, -1712081, 3497714, 1955284, 1909650, 2859911, --152471, -891206, 7030325, -2370822, -2157147, 9166534, 1962263, -6359236, -14010720, -950798, --18262200, 2998424, 1817845, 8843338, -7188165, -1934346, 4957466, 3804804, 5435818, -12651900, -17819820, 12341052, 2480881, 9079561, -3996467, -17948132, 4371740, -7657390, -8150238, 8204462, -20625506, 3408057, -5465346, -7585986, -16228534, -134755, 938987, 25054692, -9752260, -563714, -931471, -934155, -15020038, -17314086, 13749801, 368830, 7889855, -2370822, -19246286, -11349451, -1726577, -3412352, -3932580, -5708549, 12886513, -2845953, 8432631, -9069360, 17880486, -21069498, -10525891, 10683731, 6643778, 5575405, 5416491, 16384763, 8675297, -1357747, 3704409, -25770, -16519518, 24408836, -2659122, 1808718, -7045894, 10125922, 16667157, -11434277, 3638911, -28576564, -18751290, 19038516, 12976707, 17702244, -7965017, -14394046, -851477, -2211908, -4039954, -3131031, --8376260, -6078990, -2989297, -885300, -4610111, 2733210, 5393405, 1901060, -7861938, 1479616, --4292820, -4816269, -2797098, 3233574, 3262028, -1518808, -1831267, -811212, -1225676, 766115, --7603703, 2492155, 1292248, 4942434, 1291711, -421444, -60130, 1022202, 4569845, 1444720, --3857418, 3136937, 168041, 396211, -20685100, -3058554, -26454852, -13572097, 10397042, -10828686, --23527830, 2183991, -12691091, 583579, 447750, -15084999, -14345191, 6483253, 13839458, 4177930, --16109349, 7702487, -18118856, -6351183, -6679748, 5668820, -7449084, -3393024, 8697846, 1487132, --5966784, -12894029, 13646722, 13237626, 17199196, 2246805, -1919850, 608812, 5508833, -1300838, -7051800, -7762080, 9273371, -3651796, 10683731, 8571681, 6448894, -3105261, 441845, -16626892, -5657546, -4185983, 12505334, 2275796, -29072634, 4466229, 14328011, 19275276, -11088532, -15146202, -18127984, 8230768, 12745315, -22705882, 11225971, 28426242, 29940754, 1906429, 710817, 17038672, --11792906, -15712601, 10065256, -17396228, 6531572, -8101382, -6847252, -3841848, -37473588, -21638046, --18250926, 13464722, 5107790, 3786551, -13312788, -5413270, -10057740, -1902671, -5403606, 14716705, -3496640, -5851356, -13074954, -2909840, 8465381, -1350230, -3616899, 2601677, 8861591, -3154117, --5237176, -2509335, -1943473, -601295, 6892349, 6925635, 6016176, -6077379, 7885560, -399969, -2253784, 9015673, -4050691, -4065187, 7859790, 14110041, -3299609, -4605816, -2246805, 1698660, --2543695, -9718974, 1569811, 7099581, 1915019, -9786620, -9374303, 4422206, 3178813, -522912, --599685, -1709934, -6970732, -4772783, -15569256, -29901562, 22863184, 2387465, 7682086, -3882651, -16193637, 419296, -13795972, 10670309, 4355634, -4900558, -8324184, -6543383, 2065879, 3888019, -14343043, -8175470, 11257646, 3569118, 20447802, -29343754, -7864085, -4662724, 3783866, 11959336, -17380658, 3930969, -14103062, 9513353, 13675176, 11491185, -3212099, 3999152, 834297, -4833986, --1967095, 816044, 4428648, 1574642, 10110890, 1648731, -12745315, 11892764, -13215077, -16895328, -2626373, 12181601, -5931887, -4399121, 4436701, 5934034, 10518912, -6028524, 4987531, 23732916, --9479530, -25266218, -32697050, -16547972, -22155052, 10038412, 19226422, 12272332, 4698158, 11541651, -6796249, 12758200, -10947872, 14424111, 7504382, 5835250, 15056008, 19541564, -6095096, -4400194, -5342940, -1317481, 17608830, 6789807, -2697240, 2937221, -21496312, -15065135, 2970507, -884763, -3812320, 1410360, 4507032, -4057670, 11316165, -6026376, -6924561, -6722161, -11314018, -4146254, --2247879, 3666828, 3004330, -1739462, -9722195, -614717, 3200288, 1031866, -3912178, 2247879, -119185, 3699578, -4079145, 1615445, 765041, 4470524, -2180233, 6908455, -4329864, -5024038, -1457068, -904091, -3652870, 1092532, 4793184, 349503, -761820, 29894046, 2917357, 4668093, --6183679, 10839424, -34195456, -15135465, -23363548, -24169392, 9609452, -21096342, 20732344, 23538568, -1058710, 5076115, -3605088, 4277251, -22357990, 9160628, 24790552, -14150843, -28792388, 3769371, --10814728, -9235253, -28085864, 4821101, 10343355, -159451, -3793530, 8988293, -16010564, -2724620, -10447508, -5807870, -14189498, 1660542, -7074348, 14624364, -9713069, -5465346, 13769128, 11866995, -25411174, 3295314, 6145562, -2407866, 6832756, 8972187, 15701864, -4599373, -503585, -9831180, -20709258, -26169772, 28037546, 915365, -11164767, 13047574, -10180683, -7589207, 25784836, -37305012, -6076305, -7944616, 7285339, -14533096, 6955700, 14665703, -7644505, -1464584, -3928821, -6266358, --3308199, 27327266, -31120796, -10734734, 52306260, -19803020, -23095650, 22532472, 13540421, 15000173, --13182865, 925029, -13105556, -7450158, -2068027, -15075335, 3260417, 1896765, -3913789, 5261872, -4799089, -6903086, -12742094, -3401077, -1091995, 4869419, -11250667, -8016020, 273804, -1260573, -2809446, 6867653, 16632261, -7719130, -404801, -1968706, -1768990, 4642860, 1853278, -10058813, --7504919, 7806103, -6481106, 2850248, 2025614, -6193880, 2268817, -1547799, -10162429, -8475581, -4940823, 3095061, -1563905, -361314, 6300180, -14996415, -22873922, 2122251, -8605504, -7895224, --12830141, -16316581, 20547124, 8688182, 1404991, 9488656, 24317032, 14203994, -1554241, 4838818, -16383153, 20671140, -18332532, 8511551, 17495012, 7470022, 6478958, 23891292, 11668889, 4910222, --622770, 10700374, -1097901, 12122008, 10201621, 5432060, -11122355, 21128554, -17331804, -2269890, -26671746, 26175678, -6142340, -23369990, 8877161, -440771, 22899692, 39134132, 8876087, -6090801, -2887829, -22585086, -2543695, -6027450, -4722854, 371515, 20129438, -8667244, 8923868, 24005110, -4205847, -22353158, 14856829, -1213865, 9493488, 22554484, 31983010, -9062381, -8333311, -2804614, --25125558, -37031208, 1129040, -16878684, -2601677, -20446728, -1972464, 590021, 2897492, 15063524, --302795, -10596758, -17390322, 12736726, -5278515, 10890963, 529892, 20338818, 7691750, 7472170, -204548, -6396280, 11586748, -8793946, -9994926, -3102577, -7481833, -2998424, 715649, 762357, --2601677, 3093450, 4629975, 330176, -1022202, 5898064, -4968741, -7274601, 4561256, 5193689, -1182727, -6290517, -7386807, -4421132, 6201933, 8127689, 1209033, -1177895, 9175124, 2450816, -4451197, 3726958, 6601365, 1801202, -1050120, -4788889, 2736968, 5133023, -10448582, 8371428, -24996710, -46860776, 25793426, -19752018, -46162308, -13705778, -11622182, -1668595, -10639708, 5572183, --12761422, -28644748, -17273822, -8591008, -2604898, 3242164, -11775727, 11475616, 22421340, 791885, --1409823, 6103686, 1374390, -4226785, -8329016, -4739497, 6057515, 6618545, -2001455, 6288906, -27528592, 7530689, -8069707, -27379342, -4383551, 19246286, -23528904, -11113228, -8979166, 220654, --1823214, 14762876, -4924180, 1708860, 20378010, 7216082, 22607098, -3261491, -10729365, -4986457, --5851893, -5951751, 10877005, 1101659, 7336878, 13715441, -24322936, 3476776, -6479495, -15197742, --11453067, 23614804, 17019344, 767189, -11643119, 4697084, 9944460, 940061, 6857989, -16396038, --40341016, -18757732, -14819785, 14642617, 1416802, -1960653, -6882685, 2783139, -4625680, -12832825, --13283797, -6987912, 16207059, 12203076, -18283676, -22841710, -8980240, 1479079, 13701483, 5479842, --4502737, -6208375, -4780836, 3107946, -10190347, 1396938, -6995965, 471373, 10300942, 11003706, -2832531, -5861557, 3470871, 7897908, -382252, -1833414, 5811628, -8275328, 11241540, 10078141, -3838627, -303869, -598611, -1261110, 9398462, -3854733, -5163088, -5862094, -8310762, -8139500, -2443300, -3079492, 3325379, -2421288, 1588064, 5893232, -3096135, -5920613, -8577050, -2461553, -3763465, -6118181, 13143674, -18101676, 21843666, -1401770, -35512936, 7548405, -17321066, -3134253, --2928631, -3788698, -22760106, 7406134, 780610, 18095234, -38646652, 979789, 18466212, 2627983, --9475772, -19005768, -1906429, 11451457, 16109349, -13369696, -5297306, 9255655, 18461380, 17567490, --17047262, -3064459, -27383100, 12896176, 13273596, 8797704, -8105140, -1794760, -7761006, -2557653, --9416179, 2900714, 19243600, -6993281, -8179229, -6458557, -11591580, 22619446, 18757732, -1593433, -26589606, -950798, 9161165, -23596014, 19144280, 8971650, -27295590, -8424041, 30273076, 12993887, -7862475, 6222334, -14933601, -11160473, -15983184, 26912266, -14287209, 20834350, 20842940, -23986318, -55497956, -11787001, 34226596, 1716913, -8371428, -14806900, 25577604, 10255845, -20764020, -12193949, --44030396, 17569638, -6509023, 20170240, -27324582, 30086782, -23494008, 8978092, -9454834, -6732361, -19127636, 1968169, 1259499, 11084237, 7097434, -4934918, 12328704, -1493575, 3190087, -8934069, -1148904, -1165010, -6327024, -8999030, -302795, -10004589, 4181151, 4368519, -2997887, 8719320, --3775276, -5207648, -7956964, 5129265, 394063, -1216550, -15091978, 6514929, -3557844, -17388712, --6218039, 4944044, -5624260, -9036074, 5303748, -4943508, 4244502, -9221295, 3582540, -9409200, --2360622, -1510755, 4296578, -2321430, 156229, -3167002, -3990025, 12985834, 23484344, 1470489, --18865106, 8924405, -36849208, -10324565, -33428268, -47303696, 2077154, -18418968, 6514929, -3854733, --6869264, -18218714, -11788075, 10128607, 28740310, -23895050, -4552129, -40904732, -35100084, 9472014, -14777372, -22609782, -22796612, 1130113, 5683853, -38008312, 2531346, 479963, 20110110, -17234630, -1275605, 15913928, -10040560, -19930258, -21405044, -10918344, -19467476, -16711181, -20343112, 28943248, --36629092, -23355496, 34160560, -1379758, 10030359, -28439126, -4363687, -8321499, 1293859, 47091632, --6164352, -1225676, 5236102, 21910238, 1074279, -21280490, -8743480, -15423764, 5663988, 56417616, -11592117, -20272246, 43300248, 30594126, -26865020, 31565862, 52837760, 168577, -19825032, 35291748, --5606543, 37146100, 34299072, 2559801, -1175747, -10321343, 24124832, 18878528, 11482595, -20241644, --6066642, -13156559, 30407832, -4035122, -19925964, -10238128, -20032802, -9119289, 20990042, 2077690, --10176388, -3892851, -12585865, -2442226, 18830748, -9027484, 5069672, -2047089, -16832514, 18647138, -2863670, 7363185, 9735617, -12355010, 4348118, 17134772, -2504503, 501437, -8702677, -214212, -2020782, -5875516, -4639102, 3111704, 13490492, -8422431, 5716602, -11186779, -4633196, 513249, --3036542, 12521440, -4224101, 416075, 1862942, 4501663, 1076426, -6158983, -765041, -3537979, -26796300, -67444944, -40074192, -43944496, -14557255, -29390462, 36430448, 13323525, 29928942, -4732517, --56892212, -9068287, 9577240, 39005284, -1331977, 8790724, 36429376, -13873818, -25883084, 2313914, --1478006, 45304924, 29987998, -15294915, -20471962, 48132624, 3668439, 23882166, 11953431, 44857176, -39344584, 29730838, 3421478, -25992068, -13691282, -19972672, 38042672, -18632106, -25650618, -14587856, -1574106, -1578401, 16920560, -16952772, 6195491, -77420008, 8806294, 11380053, 12811351, -32731408, --29650306, 8594230, 27237072, -33798172, 13069049, -19497004, -14576582, -22927610, -1875827, 22982906, --15723875, 25302726, -6503654, 9496710, -47841640, -31508416, -1127429, 24770688, 17877264, -35578436, --37526204, -18174154, 3579318, 39118024, 16450262, -4585952, -27969900, -33065880, -10971494, 5969468, -28192166, -3275986, 9337259, 18080202, -7246147, 6001680, -18722836, 10755135, 6607807, -12404402, --9664750, 163746, 14413910, -14781667, -633508, 22169010, 3526705, 2467459, -99858, -7492571, --15796890, 3082713, -17546552, 19498078, 17382806, 12362526, 1410897, -2607045, -20580410, 11901891, --4324495, 22823994, -5997385, -27972048, -16841640, -4389994, 25966298, 6321118, -5907728, -3760781, --21430814, -11297375, -8847633, -2396055, 11494406, 10273025, -21691732, -12921409, -13466333, -13953812, --5084705, 2784213, -2289218, -8521752, -13506062, -14590004, 1213865, -1995549, -7152731, 12634720, -86019072, 9521406, -47151760, -103507104, -10263898, 62524524, 14716169, 27675158, -3683471, 38301444, --7168301, 17229798, -9568113, 21999360, 29198798, 16716013, -15426986, -33726768, 39638252, 46649788, --11205570, -44850732, -28569048, 5425618, 25645250, 9469866, 8639864, 2340220, 5912023, 3690451, -5848672, -8310762, -53594748, 325344, 31754840, 25697326, -11230803, 3153043, 19218904, 44557064, -26146150, 22149146, -26749056, -17500382, -5272073, -4190814, -40153112, 28413894, 15686294, 29487634, -58237608, -29826938, -20313584, -2168959, -17196512, -13642427, -26633630, 46336792, -28581396, -29423210, --31601296, -10215043, 57713088, 15481210, 22011708, -744640, -5680631, -13040594, 35605816, 29879550, --15819438, -33681672, 11070815, -3999688, 13358959, -31568010, -13201119, -18178986, -24992414, 15239618, -23444078, 4949413, 234613, -12477417, 6503118, -4628901, 21750788, 2201171, -8360691, -4049081, -6809671, 14777372, 15181099, -8827768, 9188009, 5501316, 4461398, -383863, -17499844, -1875827, --14310831, -5134634, 180926, 2597918, 4024921, 5187247, 5062693, 14981920, 21153250, 19714974, --2328946, -4551055, 1945083, -9306657, 11443403, -13191455, -2119566, 11074573, -1151051, -2486786, --22238804, 11025718, -22178674, 7364795, -5333813, 3550864, -2349347, 2570538, -1466195, -13424457, -7122667, 6719477, -1548873, 4524211, -1181116, 3849365, -2185065, -3568581, -1045288, -1199907, -387621, -792421, 440234, 380105, -4894115, -2135673, -1187559, 2762738, 629750, -1434519, --2834142, -2985002, -149787, 681826, -1438277, 53150, -1887101, -578210, -2106145, -24770150, -1938104, 66831840, 50955492, 8282845, 3606162, -35897336, -69956968, -60684668, -30140470, 50235548, -54354420, 57013008, 31121870, -8089034, -36495948, -33167884, -22290880, 14517526, 21804476, 39082592, -3182571, -29329794, -25402048, -5237713, -25453586, -11440719, 5067525, 40457520, 56983480, 37417220, -17310866, 16508244, -36407364, -4042638, -72764800, -80631032, -51093468, -24177444, -22660248, 38006164, -58741732, 65831648, 58848032, 51592220, 20809654, 3673271, -25298432, -6621229, -40463960, -70664024, --6369974, 6812892, 6381248, 23736136, 13510357, 24078124, -79897128, -43162272, -28910498, -45767708, --20062866, 34269544, -20870856, 23153632, 2603824, -20726976, 16339666, -17280800, 18434000, 22385370, --17477832, -33833604, -70900784, -67900208, -51468740, 25156160, 8156143, -9502615, 12512313, 3926674, --397284, -32276680, -23509040, -60274496, -20738250, -22057342, -3107946, 44515188, 46649252, 7189776, -23750096, -14395120, -33512556, -58617176, -39511552, -36106716, -1994476, 18281528, 9568650, 14955613, -15053324, -10565083, 8825621, -9943923, 9176734, 2786897, -1125818, -1843078, 7432978, 7566659, -14878840, -3244848, -4487167, 15001784, 12927852, 2964601, -5480379, 11759620, -119309360, -60833916, --31849866, 40246528, 9195525, 153073168, 156662160, 118302728, 152738160, 160276368, 145409344, 104582456, -94716912, 105336760, 41785736, -6118718, -65190088, -100480760, -139128480, -134955392, -201452224, -122057064, --79568568, -63006632, -89864136, -47113644, -13028783, -67160944, -52323976, -55054500, -12548284, -33013266, --11874511, -44739064, -22854058, 26861800, 27622546, 8393977, -8352638, 29263222, 23536420, -67754184, -14044543, 46009300, 100413648, 73819752, 95597920, 39356932, 37953552, 159487168, 86237040, 163203392, -54554676, 153072640, 105552040, 133657768, 180063280, 170729248, 138299024, 155481568, 172550304, 187961728, -160385888, 185284352, 126290832, 187939712, 150763552, 133922984, 142627808, 78012176, 159681520, 77401216, -46859704, -58645096, 3831111, -86686936, -97592928, -149089584, -176182784, -270648448, -264419120, -249642288, --233574816, -220045136, -186074096, -226881648, -279401056, -275435712, -228578704, -241840480, -227540928, -228216304, --194886832, -212116624, -203505744, -151722944, -167687328, -128749696, -120354648, -110850960, -70779984, -91317448, --20917564, -33929168, 15564961, 21195664, 66430796, 98413808, 103022840, 119105888, 105656192, 159401264, -180569552, 179025504, 206770464, 216062624, 213958096, 163228080, 145611200, 127885872, 118441776, 115426712, -118368224, 111352392, 84659712, 54601920, 61908732, 47909824, 37137508, 24814710, -19449222, -25184078, --26603564, -32422708, -39746700, -44625784, -31571768, -34623340, -27844810, -28302224, -24712704, -17761300, --21416318, -17484812, -17161616, -20827370, -19353122, -21348134, -17069274, -14030584, -18937584, -21628918, --9842454, -4809827, -6780680, -6110128, -1192390, -1637993, -3699041, -3831648, 1607392, 7614977, -8061654, 8319889, 8273718, 7771744, 11042361, 11637751, 11705933, 8059506, 5695127, 4402342, -7358890, 7926899, 4695473, 1319629, 1571421, -1038308, 3386582, 2667712, 2806761, 2032593, -2815351, 2374043, 2372433, 5411659, 10991358, 7640210, 8026757, 7113003, 8857296, 8302172, -6351183, 3989488, 3930432, 1739462, 1496796, -2151779, -4176319, -7874286, -7199439, -11671574, --14554034, -15828565, -16342887, -18933826, -18862422, -19845434, -19585588, -19192598, -20475720, -20874078, --19996830, -18028662, -15984258, -14809584, -10718628, -9844065, -8116415, -7822209, -3862249, -2450816, --21475, 1051193, 2760053, 3244311, 5326833, 5631239, 6084358, 4725001, 4923643, 3707094, -3661460, 2369211, 2406792, 1288490, 1366337, 364535, 533113, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ --7670275, --15194521, -2656437, 201327, -3478924, -7151121, -2356863, 5238787, -8405788, -4646081, -2781528, --1647657, 2672544, -1202054, 2975339, 1359357, 2605972, -291521, 3225521, -2813741, 526670, --1235340, 611496, 8109435, -1724429, -500901, -4019016, 5012227, 3113851, 2411087, 6257231, --3199751, -1816234, 2138357, 5602785, -1512365, -372052, -4522601, -4952098, -3314104, 3539053, --4398584, -3769371, -476741, 5040144, -6818798, -1448478, -5697274, -2761664, -1630477, 785979, --513249, -4081830, 5235565, 895501, 4711579, -1902671, -1194538, -5867999, -127238, -2056753, --2213519, 3385508, 1901597, -1049046, 1821066, 3746285, -1065689, 1611150, -2680597, -1545115, --648003, -2525978, 2246268, 784368, 1710471, -4008815, 2880313, 1660542, 6496675, 3866008, --1063004, -4125316, -336081, 901943, 514322, 1286343, -190052, -1395864, 57445, -947577, -9127, -1147293, 411780, -1116155, -73014, 1254131, 424128, 648540, -798864, -559956, -594853, 862215, 392453, -125628, 65498, -16106, 539555, -12516608, -4474282, 3587372, --3293703, -1498944, -1384053, 1686848, -621697, -3308199, 5222680, 4647155, 1571421, -593779, -2429878, -6427956, -922881, -6352257, -3178276, 4671851, -762894, 827318, -622233, -734439, -125091, 9783936, 8982924, 3997541, 4804995, 5666136, -1074279, -658741, -1932735, 4999342, --466541, -1904281, 1428614, -2920578, 2023467, 3597572, -1818382, 4056597, 4611721, 8948027, --3477850, -4227322, 3858491, -2317135, 154082, 1882806, -5177583, 309775, -2695629, -3055869, -6924561, 4050154, 4992900, -2840584, -3712999, 2625836, -4326643, 3056943, 13338558, 749472, -944893, 2987687, 1331977, 1224603, 7607998, -4056060, -994285, 1387811, 1022739, -3775813, --2736968, -3854196, -1793149, -1410897, 3519189, -596464, 3535295, 3582003, -3559454, -3852049, --953483, 2426657, 3412889, -4038343, -744640, -1202591, -2732136, -341450, -2585034, 681289, --132070, 1400696, -759672, 535797, -975494, -262530, -738734, 613643, -3633542, 3935801, -6391985, -3081102, 3173444, 10011032, 3366718, 2273648, -7006166, 5792301, 1538672, -9052717, -3838090, -2557653, -5412733, 2160906, -745714, 2081449, 5254356, -5534066, -5782100, -2599529, -7880191, 197569, 3914863, 8128763, -12116640, -9802189, 1598265, 5951214, -4374961, 363998, -8100845, 2065342, -1037235, -2455648, 9692667, 1164473, -2349347, 1335198, -8777303, 978716, --4836670, 4456566, 792421, 4734665, -2384781, -1210644, 2158758, 125091, 634581, 256087, -4571456, 3654480, -4994510, 2847563, 4047470, -6887517, 828929, -3113315, 1300301, -1592896, --5299453, 68719, 4589173, 3961034, 8844948, -5489505, 6851010, -4540854, -899259, 4039954, --4417374, -6616397, -2374580, 295816, -405874, -353261, -701690, 1291711, 2827162, -3855270, --38118, 1813013, -341450, 1554778, -3134789, -1821066, -1236414, -2327872, 690416, -515933, --1800665, 979253, 1039919, -1532230, -2311229, -137439, -529355, 2381023, -108448, -405874, -449898, 500364, -406411, -732292, 1622424, 521302, -1277216, -665720, -975494, 130997, -1660542, 148713, -566399, 20186346, 9036611, 12232067, -998043, -3371549, -4415764, -4409858, -2397129, -3701725, 5620502, -627602, 7715372, 477815, 4079145, 5081483, 3913789, 3367254, -4439386, -14977625, -4436701, -1397475, -3163780, -2761664, -4722317, -10664941, 477278, 7328288, --4505958, 4405026, -3618510, -5315559, -4023848, 621160, -3395709, -1246614, -3481608, -227633, -8822400, 485331, 3966402, 5592048, 7254200, -3392487, 1700270, -1606855, -5596343, 6373732, --3555159, -242666, -5538361, 4067871, -51540, 110059, -1526861, -2561411, 1879585, 5698348, --2379412, 3219078, 3034395, 2567854, 9770514, -9807558, -4150549, 258235, -5407901, -6992744, --2778307, -8562554, 1291175, 10084046, -6938520, -3291556, -7924215, 533113, -2492155, -3771518, --9290014, 5484137, 7137162, 2844342, 4989142, -2508798, 806917, -1853278, 2072322, 110059, -4938676, -1254667, 2128693, -77846, -1257352, 1741072, 1185948, 2284923, 1902671, -300111, -460635, 1261110, 506806, 989453, -76236, -919660, -1775432, 911607, 471373, -1195612, -885300, 995896, -294742, 448824, 1179505, -331786, -1052804, -370978, -319438, 6200322, -9011378, -5025112, 4716411, -4115116, -1906966, -1676648, -11041287, 7993471, -2298344, -1253594, -12850542, 7889855, 8604430, -3552475, 374736, 1454383, -1925756, 2775086, -6482717, -247497, --4422743, 5151814, -5036923, -3575560, -491237, 814970, -6230387, 1130650, 705448, 8161512, -98247, -11336566, 6525666, 5999533, 8697309, -1455457, 2216740, -6307160, -4659503, -2047089, --4523138, 1707786, 1225676, -1782948, -650151, 4626754, 7370701, -10129143, -2137820, -90194, --4086662, -4377109, 6669548, -5430450, 2537252, -5332739, -6916508, -5261335, -3401614, 2310693, -1006096, 12332462, -2071785, -3425237, 3734474, -3823595, -1060857, -3405372, 3493419, -3159485, -4493073, -2326262, -2023467, 2972654, 7492571, 1977833, -6975564, -55298, -3422552, -7203734, -2046015, 4930086, -1640678, 1063541, 1783485, 147103, -734976, 2487323, 82678, -2983392, -51540, -1141924, -507880, -1603097, 2392297, -665720, -1909650, -2185602, 319438, 2076080, --950798, -258235, -2884071, 161061, 551366, 870805, -499827, -2579665, -1256278, 2048699, --855772, -2778307, 1103270, -15467788, 14878840, 7931194, -8822400, -8968965, 3695819, 11745662, --137976, 3418794, 13755170, 4562866, 4162897, -2358474, 7183333, 6496675, 7563975, -13623636, --8313446, -8281771, 6535867, 5572183, 7184407, 300111, -8264054, 3366718, -1231582, 3708168, --11893301, 4562329, 7246147, -5635534, 3147137, 5797669, 1660005, -220117, 1275605, -1919314, -10456635, 7044820, 5604396, 162672, 3646964, 8006893, -7169911, -3915400, 373662, 10601590, -6831683, 4142496, -8004746, 248034, 5469641, 6310918, -2222646, 1923072, 6226092, 7643431, -2442226, 7063611, 2835752, -844498, -6552510, -91268, -10921565, -4527970, -5234492, 865973, -3613678, -6382322, -2557653, -11612518, 5036386, -3260954, -77846, 6084358, 8948564, 10755672, -1345935, -1174674, -6701760, -2054605, 3426847, 3640522, -7113003, 2182380, -3201361, 2556043, -475668, -2454574, 43487, 1218160, -2258616, 956704, -600222, -2746095, -1389422, -1749125, -1690607, 2015413, -370441, -1617592, 1108102, -1255741, -872952, -2150168, -301185, -505732, --2452426, 1886564, 1528472, 1941325, 13162464, 4014721, -2131915, -6011344, -15408732, -7595650, -9595494, -3405372, -14154065, -3878356, -2160369, 2106682, 7983271, 11971148, -601295, 3476776, --2652679, 5932961, -6613176, -7221451, -7593502, -13749264, 7417946, 4101157, -11323144, 288837, --8239895, -3248606, 7483444, 4113505, 6127845, -1754494, -1474248, -2024003, 13109314, 10060961, -10835129, -4937602, -9061844, 7194607, -1126892, -3308736, 9351754, 1588064, 9202504, -348429, -5191542, -6450504, -228707, 4514548, -19392852, -3000035, 1043140, -14332306, 3806952, -3696893, -13424457, 8434779, -8059506, 586263, 12265353, -1319092, 6299107, -4143033, 8461622, -3945464, -1750736, -3285113, 303869, 5797132, -7823820, 8492224, 4482335, 4852776, 1495722, 11305965, --4365298, -13059922, 2348273, 8959839, -4170413, -8133058, -5733245, -4181688, 9424769, 144955, --3900904, 332323, 322659, -1869385, -1690607, 529892, 1892470, -1098438, -1125281, -734976, -2097018, -1100585, -3409130, 926102, -3784403, 3495567, 2406792, -100932, -300111, 892279, --1032403, 1517734, 250719, 1034013, 306016, 428423, 4221953, 1384053, -2065879, 1109175, -583579, 1890859, -512712, 421981, -31396748, -6652368, 16855062, -13612899, -4920959, 14300094, -5397700, -4552666, 1518808, -11865384, 10577431, -1357747, -19100794, 1349694, -1002338, 7201587, -7084549, -3816615, -14967424, -6434398, -5718749, 293668, -7986492, -4410395, -10183367, -2952253, -11080479, -9137543, -4585952, -3532611, -5937256, -6287296, -8505646, 5764383, 1161789, 7175817, -1243393, -5357972, -8247411, -8160975, -1694365, 5367636, 7959648, -2861522, -7297687, 7595650, -3152506, -11483669, -12773233, -26038240, -2327872, -8352101, -5054640, 3803731, 3918084, 2327872, -11641509, -1270774, -5612449, -758599, -6047314, 13258027, 7037841, -2648384, 7074885, -7552700, -3689914, 3001645, -7368017, -3281892, -6614250, 4628901, 3252364, -12158516, 7922604, 12158516, --855235, -659278, -12433930, -4894652, 5393942, -3921842, 3541738, 12045236, -4119948, 2586644, -1161789, 859530, -3904662, 629213, -692564, -5150203, -3120831, -549756, 1726577, 204011, -1341640, -5373541, 551903, -2922188, 1262720, -3154117, -3037616, -1898376, -263604, 567473, --2345589, 595927, 1207960, -419296, 450435, 2143726, 1176284, -4304631, -2854543, -1422708, -352187, 1453846, -765578, 1473711, 228170, 1232119, -1049046, 213138, 5405217, 21036750, --9923522, 8122857, -5292474, 157840, 11756936, -3237869, -5503464, -2606508, -1294933, 2312840, -7938710, 27663884, -1690070, 1870995, 7439420, 1993939, -47782, -12623983, -13536663, 2276870, -1655173, -8175470, -4456566, -1714229, 7437810, -3149285, 1308354, 49929, 3154654, -3211025, -15862388, 9128416, -7652558, 9044664, 7821136, -9467719, 1533840, 4360466, 3049964, -2464774, --3445101, 13583908, -11846057, 5181878, 14609868, -4911832, 1683627, 9700721, -1186485, 8467528, -4377109, 362388, 4373888, 7299834, 9568650, 6347425, 643708, -121333, -6843494, -7177427, -135291, 1059246, -23440858, 15452755, -3717831, -6968048, -8237748, -16844324, -19439022, -12293807, -2203855, 9794136, -3636764, 1422171, -1695975, 9735080, -3680250, -7442105, 4233227, 2524367, --3337727, 1411971, 6340983, -6016713, 1116692, -7716446, -2799782, -3328600, 1778117, -682900, -3963181, 2787434, 737661, -905701, 1955821, 3041911, -192737, -5521718, 3107946, -39192, -4800163, 4946192, 2222109, -2121177, 4145180, 1172526, -791885, 90731, 134218, -3614215, -4164508, -156229, -2947958, 4356708, 8116415, -1393717, -1866700, 4461398, -1774895, -2709588, --1207423, 3881577, 28335510, 28196460, -676457, -23565412, 4705674, 4680978, -2565706, 6024229, -3650185, 1933809, -141734, -4079145, 23013508, 4122095, -3552475, -25600690, -14202383, 5917928, --1454920, -8966281, -15158550, 2039036, 2721936, 3831648, -3681324, -16854526, -17751636, 19291382, -18477486, 5635534, 16980154, -14491757, 2091112, 7460895, -2903398, -9218074, -16290811, -8206609, -3036005, -778463, -7574175, 7848516, 282394, 7616051, 6374269, 350577, -17524540, -10341744, --8171712, -1502165, 1949915, 2258616, -2870112, -5073430, 1349157, 2775623, -15657303, -4053376, -2715493, 3475166, -7036767, -19828790, -4478577, -5041755, 14719390, -643708, 6697465, -6681359, --4878009, -8919573, -9747965, -5865315, 1728188, -818191, 12378096, -7355132, 2257542, 14072460, --854162, 6990060, 6466074, 13668197, 3186329, -4073240, -6908992, -6270653, -2291902, 8230768, -1417339, 8297340, 4587025, -738734, -93952, 328028, 809601, -3819300, -4555350, -69793, --1031866, -534187, 1488743, -992674, 1193464, -5527623, -1139777, 3257733, -70867, 2028298, --9192304, -1131724, -252329, -1907502, 2027225, 1363652, 1315871, 1533303, 2246805, 2283312, -2588792, -907849, -4195646, 5014375, -3198140, 12199855, -6236830, 2063195, -4680978, 866510, -3302293, -7814693, -5155572, -13885092, -15183783, -10108742, -3852049, -788663, 452582, -8533563, --7752416, -15912854, 7679939, -15949361, -20336670, 13084618, -12164958, -15666967, 14569603, 2656974, --3205119, 15456514, 9045738, -12188580, 11242077, -30922690, -2018098, -8024610, -3223910, -14595373, -25427818, 11769284, -7362648, 3614752, 8058970, -5420249, 8890045, 19864, 456340, -7362111, -8634495, 9757629, 13412109, -21026550, -662499, -264677, 6255083, -9601936, -3553549, -9773198, --9419937, 16492674, 5436355, -12577812, 6478958, -7832410, -8106751, -13501230, -24237038, 6211597, -16116865, 952409, 16233903, 21822728, -1247151, -9138617, -20761336, 1479079, -2609193, 1184874, --5138929, 4153234, -9092983, 19512036, 10944114, 17046726, 3542811, -2276333, -5177046, 6863895, -8173860, 3499862, -1428077, -2624225, 824097, 9088688, -1578937, 3711926, -5783174, 2348810, --9592273, 766115, 1242856, -4421132, 9145059, 5082020, -2287607, -6164352, -5182415, -1912871, --434865, 2732136, -6076305, 1390496, 1145146, -645319, -4184372, 1402307, -9133785, -2063732, --2130841, -2771328, 1633698, -379568, -17723182, 2486786, -39373576, -26235808, -19029926, 10357851, -19335942, -27634894, 6311992, 19812684, 12028056, -151398, 7075959, 18687940, -8653822, -979789, --5534602, 677531, -12188043, 8703751, 48855, 1144072, 3038689, 25006910, -1389422, -10844792, --10819559, 6060199, 18184892, -7266548, -18679350, 5636608, 18455474, 10980621, -2638184, 9155797, -5965710, 8826158, 1801739, 7496866, 12476343, -1442572, -21388938, 1197222, 6424198, -19789598, --14675903, 19619410, 15158550, -14914274, -9990631, 4892505, -1140851, 9691594, 23567022, -4961761, --4719632, 4639639, -1358283, 8907225, 4250944, -8505109, -6919729, -3126199, 6808060, 6440841, --6440841, -17040282, -3164317, -25710212, 24321326, 4259534, -4622459, 2463701, 9999221, -388695, --11494943, 4356171, -5074504, -7231115, 5621039, -1408212, -11376295, -18350248, -6174016, -7400229, -15133317, -2296734, 4903242, 3044595, 1732482, -1297080, -1461900, 2522757, -4234301, 807454, -5395016, -525060, -3026878, -1513439, -12738873, -3748970, -471373, -2222646, -9309342, -8095477, --3590593, -1739462, -956704, -2550137, -615791, 302795, 6783901, 2594697, -1264868, -2656974, -960999, -2331630, -2217814, 4638028, -2383170, -5206574, -1694365, -3883724, 364535, -4811437, -23622, 3444564, 921271, -4720169, -1640141, -15107547, -701153, 2681133, -18628346, -4822712, -13935021, 18241262, 12828530, 33986612, 20427402, 30806726, 11444477, 8173860, -15906411, 17327508, --5830418, -1861868, -12736726, -8383240, 16649978, -5371394, 37788196, 17678622, 10897943, -1929514, -8733279, -5852967, -17651778, -8826158, -10955388, 8068633, -10327786, -129923, -11048803, 6577206, -15385110, 13993540, -905701, 20190642, 16782584, 902480, -5826660, -7548942, -13740674, -4606890, -31669478, 12401181, 36456756, -11614665, 209380, -1104344, 8523363, 29377576, 10050760, 839666, -18832894, 21684216, 22789634, -1917703, -13407277, -4796405, -3671660, -3731790, 15129022, 10448045, -14362908, 22004728, -13575855, 33206540, -22143778, -41496900, -6385543, -12832825, 8551280, 20269024, -9903658, -11081016, -1082869, -12044699, -9063455, -5873368, 227096, 16809966, 2881923, -4529580, -2682744, 1427540, 5068062, 5491116, 3704946, 6700149, 1857573, 4286914, 1587527, 4738423, -385473, -13220983, -5085778, 59593, -12422119, 1584843, -12970801, -6666863, -7829189, -7126962, --6083821, -4322348, -1633161, 981400, 3877819, 14001593, 1995012, -8483097, 4121558, 1054951, -12586402, -2112587, 5510443, 147640, 297963, -6426882, 1716913, 19982872, 31828392, -15721191, --12902619, 11791296, -9932112, -1508607, -4858682, 4558034, 13676786, 15358803, 21943524, -24266566, -27139362, -9729175, 1983201, -12513387, 10930692, 21055004, 7953206, 4052302, 845035, 25595320, -5626944, -660351, -9030169, -3700114, -26756572, -3353833, -13357348, -31251256, 2003602, -1722282, -12142409, -32559074, -7115150, 7839389, 11390253, 27404576, -8217883, 8091719, 14138495, 2398202, --4537633, 7854959, -7992934, -1713155, -41634876, 3736085, -18165028, -20330764, -23561654, 9363029, --37369972, 12216498, -14449881, -18254148, -25650082, 22672058, 23783382, 24173150, 4414153, 4530117, -22290880, -31423054, -3368865, -9609989, 12516072, -37360308, -13175349, -3762391, 11743514, 9636833, -7443179, 15243913, -14278082, 5648419, -17180406, -4881231, -10402948, -3861713, -3706020, 573378, --16291885, 7432441, 9817758, -1625645, 454193, -7749732, -2711735, 7823820, -10595684, -97174, -4836133, -12696460, 5629092, -11365557, -88047, 7305203, 1486059, -9296994, -6402186, 3755949, --5452998, 5956583, 3884798, 6854231, -1072668, -8128226, 15528991, -7351374, -3966939, -10051834, -6829535, -3342558, 816581, -9316321, 1085553, -11344619, -1989107, 8534637, -2820720, -4742718, --12187507, 1519345, 1455457, -1466731, -15936476, -29631516, -566399, -10595147, 35036732, 7285339, -24768002, -8164733, 33820720, -21329344, -39936752, 8947491, 6708202, 4489852, -19885162, -22652194, --17756468, 6554657, -17887466, 7763691, -9522479, 26505316, -8741869, -4092030, 19090056, 514322, --47813724, -19918448, -728534, 31368830, -3701725, -9953587, -27460410, 4661650, -6849936, -23642722, --27991376, -3327526, 5005785, -9696962, -10729365, -28007482, 18166102, -7021198, 6452652, -13993540, -492311, 8182987, 4929549, 24539296, 119185, -8579734, -32165546, -11397233, 15342160, -22030498, --11322608, 8018167, 17475686, 13650480, 34979824, 26708792, 348966, 20243792, 20699058, 7003481, -658741, 12104292, -10582263, 52926344, -24559696, -58015880, 15224585, -49399104, -2086817, -38689604, --450435, 47105052, 5727339, -22594750, 7291244, 7923678, -14892799, -12177843, -16829830, 3508452, --5234492, 15027017, -12158516, 10011569, -20225000, 5496485, -895501, -3374771, -4776541, 13610751, -25993142, 8109972, 10418517, 18034030, 5283347, -18200460, 5028333, -6805913, 11860552, -3859565, --5898601, -783295, -1492501, -4955319, -15187004, -9877351, -6884296, -907312, 1846836, -1165547, --9745281, -21423296, -13638669, 3136400, -4061429, -448287, -8468602, 2806761, 15115064, 5932961, -21872120, -33318746, -22703198, -13570486, -12137041, 13856101, 20679730, -12028593, 1075352, 19071266, --38273528, 3131031, 8569533, -28302224, 14503568, -9206799, 12757127, 5248450, 14418205, 1923609, --18878528, 19538880, -24505472, -4941897, 46498928, -18888192, 16828218, -10822781, 18953154, 17899814, --6470905, -20214264, 21494164, 57082800, -31427886, 8403640, -41603736, 21203180, 12233677, -22041772, -24448028, 2646774, -49890340, 7435662, 2109366, 22945326, -6397354, -3196530, -26367878, -25032680, --13334800, 62192200, -9773198, 31712964, -27917288, 20956220, 9798431, -5417028, -21536576, -3673808, -17139604, 35065188, -12927315, -11431055, -4002910, 7071664, 29976724, -7450695, -7477001, -22258668, -6597070, -33634424, -15385110, 24383604, 28949154, 3506841, -2731062, -15676094, -26328686, -75346072, -46840912, 18115636, 26777510, 2854543, -24873766, 27224188, -15516643, 11619497, 15809238, 15855409, -36103496, -516470, 8218957, 10228465, -4353486, -15769509, -5558762, 26753888, 16138340, -14745160, --3520263, -9978820, -2859911, 12578885, 3427384, -17285096, -11519102, 16848082, 3651259, -5114769, -8421357, -14593225, -9222905, -2905009, 7068443, 11944304, 7431367, 2420751, 9090298, -7330436, --10072772, 1932198, -1159104, -13086228, 1424319, -13501230, -685584, -8189966, -2150168, 2305861, --7177427, -12912282, 4239133, -31490700, 21914534, 22075058, -43397424, 4384088, -22937272, 3014530, --47735340, 47912508, 41202160, -4039417, -21922050, -7297687, -8946417, 23368918, -23998130, 30079804, --39932996, -22775674, 11060615, 14282914, 2975339, 13801341, 37550900, 11118060, 17198122, 4872641, -17886392, 13120051, -8713415, 4009889, 15123654, -830002, -1510755, 30421790, 13346611, 39854612, --3819837, 22821846, -128312, -28724742, 29442538, -15071040, -3504693, 9378598, -27645094, -18328772, -10496900, 43349640, 23381266, 15810311, -55707872, -12692702, -39105140, -143881, 62143880, 41208064, -46982112, 3918621, -45871324, 14442364, 46248208, 9957882, -11747272, 41509248, 4330401, 27821188, --71246528, -58780924, 42280732, -2847563, -19261854, -44978508, -9963787, -16752520, 19219978, 18137110, -21059836, 21960704, -9077950, 7001334, 39189428, 36526548, 37853156, 3377455, 54439248, 27445914, --9752797, -21362094, 256087, -10403485, 3167539, 27975806, -4442070, 1460826, 20124606, 22513144, -2080912, 362925, 8564165, 24921010, 8625905, 11828877, 16726750, 6256157, 13004087, -351114, --7415798, -2930242, -2863670, 1322850, 17300666, -6340983, 3014530, -13906030, 20949240, 10486700, -9130027, 61740, 10547366, 324270, 35930084, 9573482, 36888400, -9663676, 32260036, 15156403, -4719096, 14405857, 13845901, 16122770, -4279398, -2550137, 22033720, 7139847, 18525268, -41124848, -24249922, 32445256, 2443837, 11089069, -29350196, 22928682, -13357348, 10997801, 1052804, 112206, -19386946, -5982890, 12626667, -4043175, -23532662, 6302328, -1617592, 26338886, 23008140, 32748588, -10931229, -25036438, -20655034, 21264920, 23898272, 11063299, 2137820, 7566122, -6476811, -20521890, -3544422, -7591892, 29123100, 20326470, 17796734, 23057532, 23702314, -32618666, 36005248, 35342212, -25969520, -17528836, -15527381, -22675280, 31397822, 18321794, 51510080, -31284542, -30878668, -23931020, --45346264, -11834782, 49250928, 7839389, 38713760, -41129680, -43861280, 9617506, 28093382, -38461968, -6190659, -30630634, 12384001, -35358856, -2617246, 16824998, 17969606, -32151052, 12888660, -24455544, --48531520, -1603097, 57926224, 29894582, 23602456, -16118475, -41059352, 62746788, 50983408, 14263050, --56140592, -2200634, -12989592, 40186936, 20795694, 24910810, -29034516, 22036940, -12863964, 14433774, --19996830, 7186017, -22392886, 32828582, -6168110, 5391258, -38852812, 11338177, 5248987, -1832340, --8432095, 7943542, 4479651, 4075924, -23880556, 10182294, 25111600, 1530619, 15272367, 12559021, -10781979, 1605244, 5319317, 471373, 1784022, 1038308, -7266548, -937377, 8268349, -194884, -16056198, 13109314, -6513318, -1448478, 7728257, 3000572, 12580496, -22695144, 15319075, 1519882, --92879, -79750024, -15636902, -2177012, 1543504, 27562952, -73362872, -8558259, 34040836, -54659364, -12866111, -12533251, 64100240, 33501818, -38308960, 9473087, 43291660, 4255239, -16501264, 13994614, -10777684, 5531381, -310311, -4344897, 3787624, 6914898, 15143518, 43945032, 35716412, 38424388, -26741540, 48410188, 24024436, 49504328, 20820928, 43912284, 1017370, 27255862, 24948928, 27014270, -21085606, -2024003, 8473434, -33770256, -19749334, 64188824, 1191317, -25689274, -6806450, 20138028, -34220152, 69094216, -8957154, -38048580, -18766860, -28047210, 39756900, 45035952, 50838456, 15668578, --1447404, 34148748, -57629336, 52824340, 20401632, -27834072, -129923, -90240488, 2531346, -59635620, --82346872, -20569672, -48237852, -21075404, 94121520, 85565416, 80816792, -63240708, -6090801, -7168301, -63634772, 99160056, -21683680, -27908698, 55310588, 56473988, 48929340, -5698885, -7415261, -27361626, --34130496, 5109938, -12289512, 15294379, 24261734, 20833276, 14802605, 1506460, 9739912, 26627186, -4964982, 248034, -7089918, 1605244, 2236067, 7321309, 5886790, 5523328, 27881318, -2291902, --15923054, 16924318, 20379082, 4780836, 32296006, 7654706, 15844671, 34979288, 47050828, 34227668, -25371982, 10218264, 5117454, 13727252, 32372780, 14201846, 33170570, 24432996, 16136729, 22995254, -8818105, 31176630, 27511414, 22228066, 34080564, 19495930, 6674916, 9526774, -22592064, 57437136, -68490768, -56627532, -53075596, 18249852, 59802052, 2095407, -28900298, 795643, 15794742, 18722836, --50549616, 19173808, -7266548, 26969710, -28028956, -12595528, -32743220, 34541200, -5234492, -14388140, --30662308, 22635014, 12383464, -4582730, -26017838, 12505334, 10625749, 6627672, -23072564, -2603824, --1759863, 26592290, -20202990, -4121558, -29255706, -6876243, 9245991, 23440858, -30429306, -10701985, -31060130, 27838904, -9010841, -18521510, -804770, -9106404, 25811680, -14449881, -9059160, 13534516, -8914741, 16911434, -15268609, 5327907, -20777978, 23900956, 26659936, 13748190, 3526705, -20674362, -23585812, -16462073, 36915244, -26767846, 29508036, -46688980, 31302796, 4876936, -3532611, -32564442, --10738492, 11734924, -9315784, 4132832, -9051107, 10355703, -4980552, 11502996, -11217381, -13360033, --9934259, 11021960, -96100, -252866, -3362423, -6890738, 4056597, 12807592, -6988449, -425739, --188442, 2705830, -1565516, 3224447, -3045669, 9681930, -724239, 12236899, -11044508, 3077881, --5670968, 12411382, -13108240, 12282533, -13518410, 8698383, 2527052, 15285789, -4452271, 14583561, --13324599, -8260296, -3228742, 22899156, -11700565, 18038862, -7256884, 3830037, 983011, 13263396, --6516539, 7536057, 780073, 1729798, -2309619, 5686000, -2847027, -5694053, 13309030, -7097434, -749472, -5251135, 3009162, -4782446, 5880884, -8202314, 10023380, -7387344, 8101382, -10732050, -9461813, -14097156, 13513578, -7526930, 8747238, -9209484, 9279277, -9168681, 9538049, -8071854, -8538932, -11131481, 9348533, -9041980, 9575630, -10489921, 11053635, -10041097, -1828582, -12332999, -55098524, 58624692, -34492344, -20437066, 11632382, 55987584, 34792456, 20863878, 20076288, -8913668, --23419382, -7088307, 13166759, -199716, -5508296, 16707423, 302258, 11777874, 1455994, -6255620, --20979304, -5564667, -1214402, 1558536, -816581, -17047262, 19055696, 3187940, -7649337, -418759, --572841, 281320, 12308303, 22591528, 9645960, 2297808, -8112657, -11670500, -3013993, 7352447, -15152645, 20397336, -11356430, -11215233, 2561411, 20621212, 9311489, 4614406, -9288941, -18676666, -15967078, -3267396, 468151, 1105954, 5157182, 4949950, -2247879, -657667, -12171400, 1897302, -10770704, -5080947, 6443525, -3576634, -8667244, 5545877, -1629403, 3013993, -643171, 9378061, -6361921, -13908715, 4132832, 697395, -25266218, -33571076, 984084, 2000918, 7677791, 20496120, -2263448, -8974334, -8798777, 8096550, 8822400, 13393856, 9126269, 610422, 3905736, -1391033, --10123775, -4174171, 1567126, -13880261, -13303124, 8626979, 9133785, -169114, 10270341, -14482093, --2617246, -631360, 744103, -4438849, 2323577, 7903277, 10914586, 5368172, 9194451, -5747740, --11377905, 6742562, 1085553, -2739116, 7810398, 4391067, -5354751, -19363324, -72814728, 30981746, -112008992, 103488848, 88138632, 35310000, -83840448, -52303576, -75383656, -84247928, -75528072, -21863532, -16202764, 63683628, 66120484, 79417168, 52431888, 53088480, 1212791, -55625732, -53327388, -65519728, --51432232, -28475096, -2025614, -18309982, 19849728, 24687472, 39764956, 43875240, 44372380, 26589068, -2144799, 11865384, -9889699, 6399502, -30531848, -22035330, -28242632, -45919104, -36596344, -27888834, --19845970, -32626720, 4450660, 55927452, 63005560, 35310000, 65884260, 16436840, 38409356, 19883552, -11217918, -16508244, -35313220, -48192756, -67894840, -51918100, -77440408, -31957242, -34529928, 22273164, -22141630, 64768644, 74465608, 66464620, 59034864, 57873072, 36075576, 4503810, -20329690, -61770756, --38885024, -80710488, -68968048, -95735360, -15601469, -8522826, 23514410, 30368104, 54506356, 64295660, -53657564, 48058000, 35497904, 21053930, 2867428, -17790828, -25806310, -34571804, -53561464, -37509024, --46648176, -32327146, -16708497, -4747013, 10441602, 10313827, 50965692, 47128676, 46549928, 36436356, -26584774, 3225521, 16485158, -18457622, -30777736, -23852100, -66495220, -77350752, -15051713, -5177046, --3471407, 37786048, 30787400, 41234372, 28753732, 37683508, 11363410, 9766756, -3040300, -15916612, --20639466, -26479010, -29490320, -18043158, -3933653, -22881976, -12215961, 18338974, 25977036, 17541720, -22480932, 15463493, 11075110, 2938831, -2190433, -7938710, -11372537, -8688719, -14183593, -7342784, --2923799, -5259725, -7289097, 1619203, 5247913, 1210644, 8076149, 10526428, 7740068, 5596343, -4801237, 2540473, -843424, -4862977, -4938139, -6886980, -5145371, -5315559, -3452080, -2793876, -455803, 1325534, 2407329, 2004676, 3343632, 3434363, 2711735, 2054605, 2003602, 1465121, -1769527, 362388, -2085207, -3311957, -1641751, -2939905, -3384971, -2922725, -1828582, -803159, -1318018, 2040110, 2360622, 1582696, 3055869, 1952063, 1197759, 665720, 360240, -1198833, --1299765, -1545651, -597537, -1179505, -1069984, -1098975, -169651, -463856, 324807, 254477, -1044214, 762357, 1269163, 671089, 807454, -110059, -280247, -572304, 315143, -583042, --417149, -1090922, -371515, -380641, 491237, 285078, 807991, 301185, 447750, -395137, -53687, -317828, -108448, -675384, 62277, -245887, 280247, -6979, 428960, -128312, -376883, -137439, 236223, -261993, 207769, -248034, 214748, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ --5177583, --5267778, -4377109, 1221381, -2516851, -390842, -728534, 2542084, 10096394, -2692408, 1004486, --9618579, -5273683, 2947421, -4591320, -3559991, -1364189, -4056597, -1090922, 8399882, -3616363, --5360656, 9051107, 7267085, -2574296, -1671816, 8283918, 2371359, 3204046, 1612760, 392453, --2112587, -3510599, 3299609, -2618856, 2468533, 878858, 957778, -1175210, -2841121, -2251100, -2036888, -2589329, -4057134, -1848447, -1807644, -5195300, 5874442, 9046812, -5201206, 2943126, -261993, -2048163, 1447941, -238908, 86436, -3048890, 5616207, -3339337, -4095251, 4649302, -1435593, -258772, -512175, 2547989, 174483, -88047, -1596654, -822486, 4937065, -7208029, -2460480, 1307818, -1737851, -1735167, -2499671, -3676492, 40265, 3516505, 3621194, 1035624, --56908, 801548, -1993402, 2612414, -984621, 1530619, -1107028, -737124, -528818, -672162, --511101, 1196148, -45097, 483721, 746251, 428423, 1272921, 1574106, -513785, -384400, --700617, -510027, -1000191, -317291, -663036, -572841, -1017370, -424128, -103079, 618475, --387084, -15932181, -2506114, -5825587, -1422171, 1280974, -4331475, -9711995, 7125888, -2388002, -1667521, 4758824, -1502165, -488553, -581431, 2190970, -1671816, 8011725, -319438, 6180458, -9076340, -10878078, 2293513, 7558606, 534187, 1507534, 5245766, 9670119, 1396938, -2172180, -4881231, -1291175, -2505577, 2183991, 1735704, 2160906, -2707440, 9856950, -4531728, 2491618, -3691525, -38655, -465467, -4800700, 798864, -5563057, 4695473, -5682242, -4352413, 3160022, --5287642, 3647501, -3686693, 1538135, -2972654, 2032593, 4305168, 8406325, 2594160, 962073, -4103305, 74625, -7239168, 976031, 2055679, 2775086, -1808718, 394600, -983011, 1394254, -4063576, 2456721, 5545340, 1924145, 751082, -3352759, -1706176, 3275986, 2553895, -3208341, -3882114, 1909113, 4243965, -1302449, -1002875, -1305670, 207769, -799401, -3382287, -603980, -570694, 587874, 2202781, 266288, -641561, -812823, 936840, 491774, -1649268, -223338, --114890, 40265, 677531, 209380, -760746, -79457, -719944, -5772973, 4298189, 2821794, -869731, 5475547, -290447, 3076807, 7434052, 4623533, 9749039, 1902671, -1435056, -9962177, -1577327, -6100464, -2039036, 789737, 2258079, -3811784, 7516, 9620727, -4901095, -234613, --4893579, 2355790, 58519, 1887638, 3930432, 4646618, -2898029, 3492882, 3593814, 6969658, -277562, -6786049, 674310, 7387344, -710817, -432181, -1003949, 4977867, -5749351, 514859, -3794067, 4982699, 5946382, -2202245, -3872450, -465467, 8541616, 830002, 3093987, -6902550, --3089155, 1719598, 1445257, -1150514, 4532801, -274341, -924492, 2574833, -4349728, 316754, --671626, 3020973, 4590783, -6700686, -1499481, 2225330, 4525822, -2843805, -2757369, 1915019, -5361193, -427349, 3606699, 2597918, 3697967, 1596654, 4124242, 6247030, 253403, 1786706, --1700270, 2574833, 1815697, -1130113, -2780455, -473520, -1966558, 703838, -1796907, 840740, --811749, 491774, -1454920, 93952, -130460, 364535, -868120, 1439351, -1302449, -513785, --573915, -646929, 185757, 837519, 821949, 505732, -380105, -230854, -598074, 1927367, -357556, 17353816, 8363375, 6865505, -6477885, -1096827, -9024263, -6380174, 9610526, 914828, --6108517, -2785286, 2039573, -5708549, -542240, 9847823, 3900904, -360777, 3127810, 14421963, --9589588, 2341831, -1810866, -4603131, 8250632, 4247723, 4274566, -3170760, 3689914, 4794794, --1472100, 3094524, -980326, -4050154, 844498, 1589138, -720481, 4918275, 1195075, -1708323, -5381057, -2410014, -2542621, -3069291, 1509144, 2117419, 389768, 3920232, 517544, 12221329, -799401, 45634, -2826625, -2486786, 2920578, -9003325, 377957, 5486821, 4320200, -4835060, -7174743, 176631, 3212636, 5784784, -1619203, 4491462, 3448859, -1519345, -5159330, -3888019, -3248606, 8200167, 2332167, -3483755, -1731946, -1949378, 5614596, -4690641, -258772, 4682588, -5374615, 800475, 687732, -1423245, -2231236, 156766, -508954, -1823751, -375810, -797253, --920734, -1386738, -714575, 1967095, 1308891, -317828, 2484102, 793495, 1012539, -254477, -857920, -368830, -198642, -33286, 303332, 373125, 709743, 1410897, 360777, 224412, --390305, 4216584, 1078037, 11373610, 2795487, 6800544, -326954, 1548873, 1879048, 1935957, --1890859, 6959458, -2922188, 7526930, -3679713, -2832531, 1952063, -4875862, -1416266, -1490891, -2105071, 3172370, -1976222, -7161321, 3295314, -8671002, -3517578, -1414118, -187905, -1297617, -1727651, 7907035, 4446902, 608275, -8120710, -7747584, 297427, 5362804, -2759517, 909996, --966905, -3386582, -5197448, 628676, 3582003, 7643431, 6855842, -782221, 2232846, -9378061, -3281892, 6389838, 7196755, -783832, 6568616, 1496796, 9541807, 5716602, 1867774, 4399121, --377957, -2374043, -1632088, -854162, 6014028, -2174327, -3312494, -4041027, 6006512, -1324461, --10386305, 2194192, 4012573, 5971079, 7630547, 13066901, -5374078, -4320737, 7716446, 8220031, -6436546, 2862059, -1290101, -1347009, -4999342, -5534602, -1530619, -1913945, 1745367, -97174, --1600412, -95026, -3085934, 812823, -373125, 1613834, 246424, -2254321, -150861, 398358, --353798, -73014, 1180042, 2268280, 2182917, 1897839, 513785, 590558, -3155727, 302258, -2281702, -1296006, 1275068, 430570, -855772, -602906, -357019, 2370822, 1700270, 503585, --158377, 1378148, 146566, 985158, 523986, -573915, 744103, -276489, -292595, -14833206, -7100118, 10510859, 1185411, 8783745, 1007707, -7482907, -899259, -3382824, -2066416, 8125005, --10481331, -2669859, 3434363, 4254702, 9157944, -1634235, 3866008, -14416058, -7607461, 3948149, -8482560, -5488432, -4253092, -5898064, -7525320, 4056060, -1075352, 280784, 2575907, 1542967, -2695092, 11552388, -7037841, 11216844, -779537, 2459406, 2272575, 2601140, -3491809, 4037806, --7960185, -1273995, -4413616, -613643, -5956583, 7223598, 1069984, 19636590, 452582, -1036161, --5086852, 1068910, -4287451, 10362682, -6436009, 1555315, -11533598, 8733816, 7676181, -9200894, -5582384, 6050535, 2266132, -4889821, -5353677, 8763344, 2046552, -12167642, 5770289, -5666673, --3351148, 3009698, -3250753, 1318018, 2344515, 3546032, -6602439, -15471009, 2126546, 3730179, --637803, -3159485, 6034966, -2458869, -2160369, -2692408, 3964255, -4863514, -2155537, -2673080, --2284386, 1487669, -2084133, 2902861, 242666, -4300336, 3161633, 646929, -2458332, 73014, -2836826, 1183264, 1074, -188979, -960462, -2179159, 60130, 875100, 163746, -28454, -1229971, -2492692, 158377, 725850, -3147674, -2078764, -2679523, 6600291, 1284195, -133144, --5574331, -9376987, 3321620, -5033702, -2024003, 9067750, -12355010, -5153961, -9103720, -933619, -7809325, -732292, -6441377, -8948564, -10038949, 3903052, 10617696, -3053722, 6632503, 9976135, --2768643, -2317672, 3907347, 5540508, 11851425, -1734093, 6659347, 950262, 14090177, 10349261, -2829310, -3338263, 1415192, -7834557, 13677323, 3160022, -6048388, -6723772, 7881265, 6643241, -4786204, 3393024, 2330020, 7060390, -3077881, 3099356, -4704063, 648540, 366146, -7146289, --9526237, -3404299, -6735046, 4284767, -4119948, -3079492, -10392210, -6560563, 1966021, -3580929, --1266479, 4946729, 10365904, 13063680, 6788196, 5382668, -4856535, -10712722, 158914, -7511898, --17278116, 105227, -1242319, 6388227, 4310000, -4270808, -9642738, -5274757, 4616016, -281320, --1104880, -4032438, 2092186, 2138894, 1700807, -1080184, -5509906, 1096827, 681826, 475131, --1276679, -734439, -780610, 620623, -2720862, -2821794, -332860, 269509, -2272038, 127775, --490700, 1990717, 2706366, -3045669, -155156, 2084133, -413391, -1324461, 453656, 235149, -2934000, -1006096, 1867774, 1426466, -1336272, -1206349, -20002736, -6047851, 983011, 9792525, --7092602, 4828080, 2989834, -318364, 14486388, -1875827, 13624710, -8016020, 3914326, 4424890, -47782, -12484396, -5317170, -4618701, -14388140, 4935991, -3677029, 3093450, -1021665, 5237176, --151398, -5516349, 2842195, -9117679, 6638409, 4023848, 15497853, -606664, 333397, 14337138, --12760348, 11141145, 13448079, -8448738, 8608188, -3605088, -4252555, -7086159, 1653026, 1686848, -9516037, 6255083, -2643016, -3987340, -8369818, 4534949, 4970888, -9397925, -4395899, 8843338, --15620796, 1463510, -12104292, 6760816, 496606, -220117, 3447248, -4046933, 1206349, 14251775, --6042482, 3118146, 6763500, 4374424, 589484, -7514046, 3145527, 2780455, -4548371, -12179990, --47782, -2786360, -9831180, 7309498, -2813204, 2689187, -573378, 1382980, 2882997, 2982855, --5583458, 1357210, -732829, 1228361, -628676, 3633542, 1620276, -907312, -870805, -5266167, --412317, -3604015, 422517, 585189, 3601867, -5572720, 1855426, 2990371, -2322504, -3468186, -1021129, -517544, -2261300, 1653026, -664109, -2177549, 542777, -750546, -2725157, -719407, --1848447, -3367791, 1344862, -1047435, 71404, -1858647, -627602, -1901597, 646929, 3554086, --723165, -2209224, -8232916, 23741506, -8893267, 4671851, 3296924, 8520141, 2551211, 5199595, -11705933, -9050570, -5711770, -674310, 16324097, -6263673, -7095823, -8075613, 3955665, 2818036, -8885214, -18680960, 71404, 469762, -1380295, 9711995, -2445984, 7505456, 13681618, -9950902, --4605816, 4000225, -7630010, -9388799, 6252399, -8717173, 12856985, -2144263, -13460964, -1695975, --7777112, 4310000, 10464688, -135828, 5237176, -586800, 1942936, 12669617, 273267, 9207873, -3496104, -6778532, 7016903, 6169184, 726386, 5192616, 17965312, -2933463, -8251706, 4363150, --10413148, 871342, 17153026, 5930813, 2604361, -3227668, -5070209, -3265786, -6235219, 10477573, --6965900, -1760937, -4389994, 11879880, -21849572, 7493108, 7531225, 13135621, 2975876, 1056025, -11392938, -3198677, -5109401, -6463389, 36507, -5367099, -670552, -4610111, 3652333, 406948, --4288525, -4328254, -3801046, 1454383, 4377646, 3668976, 650151, 318364, -2048699, -4694400, --1712618, -1174137, 1829119, 2051921, -923418, -1121523, 803159, -2799245, -136902, -2716030, --1522566, -3591667, -5032091, -1321776, 1548873, 5493800, 749472, -1473711, -1584843, 2177549, --654446, 5265093, 2234994, 945967, 604517, 2026151, 34920768, 10443750, -6388227, -8471286, --7170985, 25326348, -21838834, 1746978, 8518531, 1272921, -11854647, -2668249, 5907728, -1262184, -1347546, 10503879, -10900090, -9127342, 4445291, 13686450, 8399345, 3532074, -6670621, -6486475, --6280316, -7276749, 6737193, 2683818, 9670119, 7781944, 4394289, -10323491, -4949413, -10998874, --2228014, -7223062, -16641925, -3110630, 7363185, 1627256, -7749732, -7782481, 141197, 3988951, -10330470, 1292785, 5209259, 1475321, 20010790, -17446694, 11333345, 2102923, -17834852, -3245922, --5421860, -4434554, 2663954, -7820062, 4627291, 3372623, 7888245, -9746355, 3365644, 15490336, -7204271, 24637006, -5596880, -665720, -6144488, -3158949, 593242, -548682, -23488640, 10375567, --1066226, -1431835, 6267431, 6221260, -6722698, -10036802, -10997801, -4123169, 7655243, 3229816, --2637647, -6516539, 5591511, -10206453, 5209796, -1739462, -4684736, -5807870, -6316823, -2327336, --2174327, 897648, -2699924, -1844689, 1179505, -1953136, -1848447, 980863, -5191542, -2413772, --467078, -1829656, -3023657, -1401233, -5276368, 623307, 3742527, 5097053, 5986648, -4549981, --5558225, -3970161, -5039608, 65498, -139586, -3136400, -3560528, 1191317, -589484, 3264712, --1190243, -382789, 2495376, 2498597, -2259690, -11547556, 2700998, 6511708, -383863, -7034620, --5125507, -15379741, -18593450, 3986804, -8313446, -3738769, 2586644, 4832, -2058900, -8075076, --4213363, 84289, 6358699, 7074348, -10260677, -5649493, 6266358, -8915815, -4578972, -14708116, -14291504, -1701344, 12866111, 1311039, 4758824, 13967234, 10314901, -5943161, 3036005, 7193534, --7467875, -2814277, 6729677, -2348273, -16627966, -2884608, -11677479, 17182016, -1889786, -4318590, --9805410, -13979582, 4991289, 3201361, 3257196, 7192460, 79457, -2383707, 7236483, 2071785, --1477469, 2779381, -4167192, 11435887, -2726767, 7293928, 20891258, 4885526, 3869229, 5122822, -7669201, -18031346, -14832670, 5840619, -16180752, 11383811, -2333778, 13013214, 3324305, 25161530, -9740986, 1924682, -7295002, -2985539, -12869333, -632971, 3958886, 2738579, 2687576, 4644471, -11344619, -4493610, -9261023, -2966749, -2593624, 3826279, 10302016, 3899294, -2510409, 3227668, -3012383, -279710, -2399813, -5755256, 395674, 935766, -2937221, -3716221, -758062, -6110128, -4476430, 2805688, -2987150, -701153, -6316823, -2829310, 2947421, 5819144, -2757906, -2291365, --85362, -4802847, 5432597, 33286, 3929895, -4970888, 53150, -5156645, 3249680, 5780489, --6316287, -1620276, -29613262, -20998632, 7899519, -8448738, -17052094, -26277146, -466004, 1948841, --4893042, -4306779, 25107842, 6413460, -17843978, 3647501, -10813654, -9373766, -8742406, -16215112, --2464238, 1372242, -21970906, -21101174, -7772280, 3368328, 2274185, 12619151, 10976863, 6592775, --5122822, -299574, 5139465, -11457899, -6115497, -3963181, 3992709, -10761577, -6292664, 7224672, -4657892, -361314, -1399623, -2062658, 6329708, -15445239, -8516383, -7631620, 10457708, -11977590, -8362838, 13615046, 18983218, -1291175, 5654325, -4480725, -8660802, -11761768, -2883534, 11526618, -4629438, -21017960, 1215476, 21698174, -14134201, 682900, -2782602, 1143535, 5465346, 11068131, --1989644, 3514894, 13608604, 9145596, 6173479, -10169409, -11924977, 8959302, -8534637, -16757889, --15780247, 17573396, 7019587, 9721122, 4504884, -2734284, -3035468, 8410620, 6287296, 1619203, -8426189, -3171297, -10208064, -5408438, -6997576, 3018288, 11069741, 5271536, 1677185, 6398965, -3902515, 5976984, -732292, -2949032, 4035659, -1233193, -3685619, -3393561, 3233037, -9667971, -2570001, 5833640, -3015067, 7198365, 5295158, -290447, -329102, 6805913, 1279363, -1413044, --3797288, -4042638, 1636919, 3667365, 1278290, 2988760, -3757023, -2913599, 1850594, -2455648, -2002529, -1439888, -17039210, 9243843, -13720810, -25462176, 4897874, -15615964, -8501351, 29322278, -2387465, 21872658, 20364050, -4347581, 21429202, 28795072, 21094196, -26385058, -3095061, -12437152, --11881490, -7827578, 912681, -11061688, 23125714, 6439230, 12870943, -10958072, 12340515, 8884140, -3460133, -13863618, -10142565, 21339546, -3544959, -20484310, -964757, -23658828, -2956548, 6213744, --7961796, 238371, -18649284, 8485245, 17712446, 9097278, -2120103, -9620190, -3064996, -2612414, --2811056, -9018894, -22991496, 15580531, 9341554, 8027831, 10359461, -13549548, 21114596, 2368138, --5795522, -4832375, -16032039, -7485055, 11132555, 6394670, 18135500, -2116345, -19786914, -35738424, --1634235, -449898, 602369, -13001403, -17439714, -3601330, 12317429, -6433324, -6773164, 4530117, --1124745, 17874580, -3084324, -16224776, -5264556, 16641925, 1560147, 3033858, -15866683, -5969468, --2592550, 6610492, 9252970, -4474819, 3548180, 526670, 7063611, 4142496, -148713, 2785286, -9302899, 2008971, 371515, -3048353, 1522566, 5679558, 341450, 2829847, 10588705, 1360431, --2903398, -7550553, -259309, 5286031, -4591320, 2649995, -1745904, -1690607, -2855617, -4566624, --2793339, -21475, 6946573, 4860829, -6131066, -12479564, -3045132, 4549444, 2302103, 1596117, -1280974, 38182796, 23584740, -3087545, -22368726, 4945655, 10692858, 6640557, 15768436, 24429774, --10956462, 2287070, -21876416, 6405944, 1468879, -8071318, 38551088, 15023259, 33220498, 14137959, -8337069, -28924994, 137439, 16588774, 2656437, -15263777, 6260989, -23487566, -9598715, 1921461, -6849399, -6835978, -4940286, 5437966, 3884261, 1999844, 20734492, 13362180, 3144453, -8148627, -14179298, -9149891, -7093139, -13584982, -4939213, 18362058, -28893318, -161598, 12496207, -13979045, --4809290, 5713380, 4494147, 26656178, -1848983, -24696, -12643847, 26066694, -11821361, 3528316, -2376191, 18131742, -4499515, -6180458, 16668231, -28419262, 7142531, 3016678, -12228846, 23205172, --29008210, -3372623, -9924059, -18986440, -9974525, -1445793, 7820599, 18283676, 29378650, 14762876, -19295678, 30176978, -12519830, 5774584, 7176354, -12524125, 16947940, 601832, -23257784, 12275017, -5998996, -8131984, 447750, 17945448, 13021804, 4199405, 10200010, 3392487, 3090766, 9964324, --2091649, 4379793, 8321499, -1866163, 1554778, -1342177, -841277, 6366216, 861141, 895501, --5707475, -2944200, -4062502, -7332046, 1296543, -3943317, -12462921, 4884989, 6914898, -2270964, --482110, 3483219, -4543002, 84289, 12436615, -1709397, -3937948, -7864622, -36939404, 10394358, -1699196, 44554916, 9885941, 8546448, -1463510, 21830246, 5585605, -32303522, -5247913, 34968548, --10567230, -7134478, 2663417, -2222109, 513249, -6154688, 35931696, 41371272, -22442814, 10167261, -10797548, 6184216, 11402601, -17978196, -25356414, 19430432, 4984310, -13710072, -24267638, -7050189, --8458938, 22039088, 17569638, 10177462, -20614770, 11273752, -9130564, 7227356, 865973, 9523016, -20293720, 4860829, -46538120, -14047227, 8109972, -18400714, 5246303, 19683836, 6198712, 34203508, --11681237, -51166484, -1583769, -20354386, 17425220, 15547245, -6003828, -10834592, 15415174, -24550570, --4822175, -13241921, 11186779, 16076063, 13241384, 14933601, -11552925, -20815560, -62539556, -29644938, --36595804, 5737540, -24962886, -11841762, -5472325, -26910654, 13942001, -48469244, 14593762, -34856344, --25778930, 24870008, 28849832, -9028021, -1726577, 15907485, 20166482, -28467580, 63351, 4644471, --4658966, 4999879, 14722611, -1979980, 6178848, -1325534, 5380521, -12619151, -7204808, -5781026, --8902393, -1849520, 11373073, 4933307, 10164040, 346282, -12086038, -10448045, 1140314, 6230387, --3045669, 6615324, 6288906, 16775605, 947577, 5712307, 1113470, 3925600, -8159364, -2372433, -2337536, -6135361, -455803, -2873870, -67646, 3013457, 16813724, -1741609, -11258183, -11708081, -319438, -1149441, -17904644, -11280732, 8134131, -12583180, -75699, -624918, -47482476, -7521562, -32510754, -38400228, 4379256, 13750338, 1069984, 9520332, -2159295, -30485678, -1823214, 15982110, -6212134, 24017458, 17257178, -26181584, -27191438, -4089883, -11347304, -4337380, -45268420, 16842178, -18985366, 31831076, 15389405, 28950764, -11913702, 3684545, 30866320, -9839233, 33533494, 8800925, -18104898, 5546414, -7563975, 15896211, -19105626, 675921, 42209864, -32439888, 3759707, -42098732, --18037252, -30344480, -19651086, -5527623, 3009698, -10138270, -31061740, -6006512, -52124796, 59558312, -21804476, 121870, -7268159, -14678588, 4153770, -26532160, 5705864, -39642548, 1749125, 1813550, -9668508, 25086904, 37267968, 1080184, -60203092, -28225988, 27047556, -13473849, -11314554, -14934675, --7229504, 30005178, 7168838, -17048872, 13564044, -28403156, 5848672, -5462662, -11632382, -28650654, --15235323, 17990544, -7648800, -6985228, 10683194, -10676752, -2338073, 17942762, -20051592, -14297409, --5145371, -4404489, 23597624, 10528575, 7157026, 13373454, 6288906, -2190433, 11479911, -197569, -8724152, 10962904, 18101140, -6559489, 975494, -1820529, 13671955, 19163608, 8221641, -4469451, --202400, -5660767, -12648679, 24525338, -5934034, 12729746, -5959267, 4058207, -6385543, -5319854, -7525857, 13320304, 660351, -4360466, -2358474, 11683922, -24481850, 17531520, 26642220, 10716480, --13151190, -15962246, 7283728, -20801064, 33268280, 28914794, 42342472, -30051350, -38480760, -8866423, --1555315, -18501108, 24613920, 31313532, -23390928, 530965, -41170484, -11344619, -19864224, -35945120, -10864657, 30759482, 17579302, -23163296, -9903658, 3372623, 19634442, 3626026, -2157147, 8215199, --2979097, -9703942, -33434710, -21638046, 7762617, -2490544, -18500572, 19910932, 16525960, 11530913, --34207268, -30011620, 28239946, 18021146, 20819854, -21270288, -56540024, -9999221, 22846542, 23904178, --6396280, 57054344, -7695508, 57346940, -86078120, -105357160, -44179644, -63266480, 77846, 25384868, -12419972, 69508144, -8512625, -4004520, 12177843, -13285408, -55110872, -47995724, -54646480, 43627740, -34652868, -12877923, -4333085, -89792200, 24465744, -717260, -40975060, 17175574, 25131464, 40329208, -30596810, 14896557, -3474629, -26395258, 99858, 1737851, -8214662, -11138461, 31139050, 20025822, -11683922, 32851668, -25730076, 6351720, -7732015, -15135465, 19598472, -2835752, -36245764, 107374, -10445897, -12392054, 16086800, -6429029, 3738232, -7526394, 38631084, 31090732, 35724464, -30472256, --7784628, 38113540, 27158152, -26531624, -17396766, -26736172, -16752520, 22339198, 24228984, -8544301, --3398930, 42409580, 914291, 4160213, -6412386, 7767985, 6387690, -1183264, -21705154, -5304285, --5213017, 6811282, 12234214, -41001368, 35798552, 27214524, 11224360, 33700996, -19766514, 12422119, --55763172, -26965952, 14719390, 20619602, 9507447, 7216619, 6988449, 14461692, -6733435, 63525252, -5775658, 39574904, 11410654, -19037442, 48440252, -6540162, 19056234, 1053878, 17398376, -1776506, --984621, 10684268, 24340116, 7137162, 17798882, 1311576, -3595425, 38268160, 4412005, -7979513, -724239, -2928631, -19160922, -5422396, 10830297, 7189239, -43027520, -10443750, 5521181, 10061498, -45146548, 36820216, -44486736, -24466282, 3766686, -9767293, 49715856, 4944581, 45864884, -32123134, -23138600, 4753455, 2640331, 21369072, 47143708, 30637612, 6386617, 41704132, 16456167, -19463718, --41819560, 36884104, -33324114, 22349936, -43920336, 303332, -69720208, 72599440, -17799956, 2604361, --48775260, 44112000, -16940962, 14033269, -35745940, 42616276, -22017612, -19889456, -14391362, -26627724, -8465917, -14875082, 12838194, -13782013, 23453206, -25996364, 23501524, -27372900, 15315853, -32067300, -25900800, -11008001, 28732258, -9859634, 15154255, -12033961, 9853729, -13741211, 711891, -15024869, -17536352, 7195681, 5123896, -5921686, 1896228, -11967389, 9542880, -12294881, 22080964, -17964238, --21314848, -9589051, 8958228, -25463788, 20010252, -6191732, 11107859, -7144141, 6437619, -11637214, -5773510, -5937256, 6866579, 8506720, -1548873, -70432096, -16990890, -5887327, 7875897, 5825050, --43038256, -25747792, 39869644, -15700253, 15041512, -17843978, 4381404, 49015776, 80228376, 5113159, --2284923, 39621612, 17999134, 16183437, 49905372, 724776, 30443266, 35861368, 35366372, -14004278, -15625091, 30966714, 44198972, 35341140, 54230404, 29953638, 69093672, 72351408, 53135724, 57632556, -40112312, -4633196, 19969988, 9976135, -14370424, -15120969, 12035035, 33556580, 8358007, 1290101, -461709, 16463147, 51023136, 38911868, 85249736, 16821240, -43246024, 17306034, 1530082, 17711372, --21876416, 33414846, -60647624, -79304960, 22815940, 79352208, 35310000, 15714212, -97885528, 403727, -38199440, 59411744, 80742704, -34151968, 5693516, -138068704, -90195920, 36730560, 52434572, -76937360, --64770792, -40973452, 76203992, 50211924, -89407800, -116577760, -22760106, 47378856, -54930484, 26477400, --7719667, -20205674, -29280940, 4129074, 12811351, 19589882, -2648921, -48232484, -40833328, 5142150, --12108587, 20242718, 3650185, -4990215, -17424682, -12110734, 8543227, -1036161, -39133056, -20125680, --29372744, -15625091, 6459631, -15387257, -10361609, -35792108, -46693272, -65610456, -64578056, -55283208, --45997488, -51809116, -50516868, -39297340, -53311820, -57550416, -47942572, -55251532, -34628712, -9359807, --30546882, -46035072, -29348586, 1824824, -15487115, -8813273, -9610526, 24503326, 27148488, 1336809, -13028246, 13716515, 9131100, 8070781, 1649268, 6434935, 6009196, 5952825, 4459250, 6941741, -2534031, 5660767, 2572686, 2167885, -310311, 1459752, -12943421, -2404645, -25675314, 65765612, -74876312, -84359064, -34395172, 31914292, -22994718, 15774341, -30278982, 27632208, -25573310, 6174553, -391379, -12712029, 6827925, 1298154, -7561290, -6074695, -20365124, -5682779, 4956393, 2397129, --20762408, 19978578, -19014894, -6851547, -16440061, 1775432, -15721191, 32702418, -382252, 8525510, --8529805, 8489540, -9090298, 9176198, 20387136, 27124330, -7111929, 8966818, 10376641, 23766202, --14687714, 15200426, -13070659, 28575492, -7339562, -16670379, 9633075, -7504919, -8452496, 2955474, --2267206, 12031814, -6322729, -16831440, -15697032, 2097018, 3382287, -29058138, 9007083, -4886599, --2561948, 4472672, -7775502, -5375152, 3226594, -5093295, 4267050, -15950972, 18381386, -51746304, -27348204, -22405234, 34631396, -23582054, 31047782, -1002338, 17023640, 9042517, 13912473, 5577015, -2631741, 5229660, -727997, -22255446, -4138738, 304943, -8348343, -4792110, -4181688, -3042448, -1611150, -8953396, -260919, 2325725, -358630, -14208826, 14861124, -3189550, 8157754, -15114527, -7394860, -9665824, 6400038, -11170136, 12424267, -15986405, 22042310, -4964446, 3543885, -23101018, -15986405, -2017561, 11810623, -22043920, 5985037, -9810242, 3955128, -5355824, 2721399, -14941654, -7624104, -3933653, -7808788, -295279, 18016314, -20656646, 2084670, -8868571, 10980084, -14946486, -13836774, -12307766, 4398047, -9276056, 10880763, -5180268, 6365679, -5686537, 7032472, -9357660, -5451924, -5226975, -601295, -2597918, 4673998, -3182571, 2500208, 151398, 3530463, -4391604, -1714766, 573378, -2002529, 2812130, -2643552, 1512365, -3767223, 3187403, -4074850, 2299418, --3038153, 2733210, -2217814, 2360622, -2996814, 3821447, -3767760, 3324305, -3528316, 4008278, --3062312, 4036196, -4028143, 4740570, -4981625, 4315906, -5147519, 4202089, -4096862, 4968204, --5756867, 5255966, -4980015, 4649839, -6388227, 5134634, -6193343, 5432597, -4622459, 4992900, --4686883, 4253092, -4955319, 4454955, -5487895, 3221762, -13464722, 63453848, 38643432, -21047488, --23996520, -2203855, 79073032, 32902134, 11183558, 21771190, -19033684, -24256364, 6852084, 15247134, -4117263, 1310502, -8288213, -6629819, 7553237, 7500624, 18508088, 8108899, -9783936, -4439923, --4771172, -10057740, 20938, 1697586, 5030481, 6171331, 326418, -2711198, 7475391, -21252036, --7914551, 9374840, 13662291, 16711718, -9291088, -5538361, -9884867, 17099876, 12009802, -3289408, -5598490, -19855634, -16995722, 15784542, 12459700, 3847217, -29873646, -15471009, 1392643, 4974646, -19925964, 14105209, -2056753, 5789079, 7186554, -9406515, 8749385, 9294846, -2585570, -5741298, -5703717, -10060424, 1113470, -1725503, -6878390, -10770167, 15116674, 3054259, 3487514, 20583094, -25215752, 8870181, 20442970, 18976240, -2811056, -5111011, -5517423, -3642132, 8096550, 12958990, --4835060, 4006668, -11427297, -4197257, -380105, 2794413, -6142877, -7531762, 8024610, 15016816, -6677064, 4199405, 6475200, -7150047, 791348, 7180112, 1603633, -2179159, 2007360, -669478, --8511551, 17827872, 6003291, -14135274, -13202193, 5481452, -2439005, 14089640, 7638063, -1700270, -5460514, 1895691, -2664490, -543850, -3811247, 4213363, 6663642, 1112933, -1439888, -5438503, -5007395, -972810, -4417911, -43487, -22725208, -62944356, 21849572, 115550192, 90984584, 86991880, -27906550, -80997176, -48477296, -71810240, -71901512, -65655556, -22823994, 35314296, 45668388, 71666896, -64316060, 38640748, 6570763, 6266358, -31016106, -49197776, -70275328, -27097486, -19026706, 6283537, --3895535, 35668628, 24186034, 10222559, 47805132, 26771068, 20501490, -4198331, 17996986, -32443646, --24368570, -20238960, -23535884, -31121334, -18668612, -12433930, -31561030, -21907018, 8463770, 46511812, -44990320, 51003812, 40143448, 58319752, 10157598, 14919106, -38726648, -28741384, -24566676, -58217208, --57895084, -52022256, -24525338, -30494804, 7199439, 22542672, 32538672, 65272228, 64191508, 61373472, -55128588, 48183092, 10341744, -28356448, -46116136, -82468200, -70792336, -51678120, -70365520, -32692218, --14664092, 3085397, 69113000, 54127324, 79495016, 78480864, 57379688, 16035797, -15830176, -23491324, --27196270, -24291798, -46761992, -57884884, -40415104, -27639726, -24408300, 3055332, 16263431, 25849798, -22287122, 46531140, 50889456, 38444788, 30588758, 5098663, -10771778, -21965536, -35923644, -30869540, --21909702, -34474628, -46715284, -4944044, 2673080, -7691213, 40192840, 53087944, 33940980, 29841432, -2181844, 8434242, -5580237, -9351218, -23276576, -27288074, -17978196, -20396800, 2832531, -8140574, -2553895, 403727, 18234284, 9860171, 9364102, 17135308, 17386028, 35433, -4702989, -12428025, --12525198, -3532074, -2925947, -5995775, -6067178, 1192390, 1365263, -1463510, 2862596, 3314641, -2930778, 927713, 11160473, 4163971, -426812, 1773822, -621160, -4090420, -4307852, -4912369, --5885179, -5176510, -1663226, -890669, 318364, 4896263, 6327561, 4913980, 4652524, 2456185, -427349, 69256, -807991, -4698158, -2812130, -33823, -3035468, -4320200, -2272038, -503048, -1955284, 1388348, 41876, 1182190, 3136400, 2243584, 1388885, 3139621, 1510218, -199716, --1432909, -2407329, -1995549, -2024540, -1692754, -1196685, -916976, -79457, 227096, -11274, -542240, 1161252, 1073742, 1734093, 2356327, 1202054, 314069, 637803, -437013, -1038845, --1635846, -1818919, -1676111, -1313186, -657130, 46708, 64961, 932545, 1189706, 718333, -846109, 1579474, 1020055, 208843, -450435, -348966, -376883, -853625, -1220308, -637803, --333397, -4832, 125091, 314606, 209380, 341450, 147640, 158914, -8053, 117038, --33823, 57982, -71404, 66035, }, -{ --3223910, --4303557, -6033356, 1952600, -2881386, -6213744, -3766150, 2638184, -7556458, -4388383, -9270150, -3137474, 4329864, 5217849, 3046206, -3418794, 7251516, -5004174, 1568200, 19864, -894964, --5280663, -2509335, -5794985, 351114, -2537252, 3302293, 1971927, -2573759, -992674, -488553, --5328981, -87510, -1284195, 2440615, -220654, 4833449, -1802276, 6081674, -2705293, 205622, -830539, -4217658, 2893734, -1204738, -1796370, 620623, -1303523, 2406256, -9237401, 4348655, -5360119, 894427, 2991982, 1796907, -4159139, -439160, -4502737, 6066105, -1702418, -3636227, -3477313, -5398237, 118112, 2195265, -6342056, 810675, -1575716, -2306934, 2027761, 525060, -458488, -2887829, -1989107, -9951439, -1324997, 2210298, -1696512, 528281, 1162862, 5369783, -4478577, 306016, 1443109, 679679, -908386, -706522, -1383516, -676994, -466004, -986232, --955093, -6442, 941672, 680215, 627065, -1513976, -28991, -18790, -457951, -75162, -350040, -189515, 35433, -714038, -609885, -634045, -46708, -592706, 915365, 1206349, -1236414, -14256070, -8574902, 1585917, -4634807, 883153, -4781909, -8189966, -5459441, 9297530, -5405217, -1440962, 6291054, 1481764, 1541356, 1765768, -3058554, -832150, 5111548, -4123169, -2317135, 3732327, -4002373, -6320045, 2887292, -5166846, 566936, 2957622, 7577396, -1712618, --3666292, -3203509, 1173063, 4123169, -5614059, -49392, 4602058, 1813013, 476205, -308164, --441308, 5986111, -238371, 5483600, 3596498, -1397475, 3583077, -1269163, -337692, -565325, --10028749, 3462281, 5651103, -3282429, -1879585, 1374390, 1529008, 1602023, 871878, -551366, --1222455, 331786, -2533494, 6851547, -3089692, 790274, 3710852, 2969433, -2467459, 2700461, -841277, 1756105, 3747359, 3312494, -4991826, 5143760, 5692979, -1945620, 79994, -369367, -3711389, -4573067, -2392834, 994285, 634581, 166967, 228170, -979253, -1553168, 911070, --744640, -398895, 246424, 1300838, -989990, -235686, 9127, -1797444, 590558, -1068373, --1120987, -867583, 648540, 90194, -536871, -1076426, 232465, -5650567, 7225746, 4728759, -11179263, -1854352, 1204738, 3424163, -5425081, -1125281, 2172180, -2241973, -7369627, -436476, -804233, 4953708, -5950141, -14557255, -11745662, -7238631, 2811593, 6925098, -6956774, 3922379, --3405372, 5351530, 4168803, 3628174, 6424734, 3575024, -5015448, -4638565, 883153, 3432216, --252866, 295816, 8982924, -67109, 1573569, 4469987, 4726075, 785442, 145492, 11095511, --765578, -4162897, -1242319, 2523293, 3246459, -2148021, 5974300, 1173063, 3212636, -4264366, --3769908, -1453846, -2488397, 1447941, -1971390, 6497749, -7483981, -6688338, 8116415, -847182, --327491, -9418863, 2939905, -4566624, 5095979, -3917547, -10423886, -476741, 5380521, -4465692, -6951405, -4172024, 3207267, 6485938, -1823214, 2714956, 6536940, -424128, -4807679, 406411, -3198677, 1480690, -2321967, 4498442, 308701, 2373506, 902480, 648540, 1711545, 311385, --668941, -44560, 245887, 690416, -1804960, -919660, -936840, 1729798, 217970, 1763084, -1840930, -1699733, 428423, 449898, -972810, -726386, -340913, 335007, -881542, 367220, --921807, 17395154, 4096325, 4641249, 1990181, -3970161, 8346732, -3944928, -2364916, 10625212, --800475, 8546448, -902480, -9758703, 3453154, -3305514, 10772852, 5680094, -752693, -9637907, --6747394, 8920110, 10567767, -12328704, 6180995, 4954782, 3715684, -798327, 1196685, 1037772, --937914, 12225624, -556735, -2085744, -3370476, -4090956, -5231270, -1717450, -280247, -7033546, --2509335, 1844152, -4907537, 279173, 280247, 7317551, -2744484, 235149, 3398930, 294742, -6987375, 3161096, 7264937, 3599183, 2210835, -7679939, 805843, -5689221, -5326833, 1279363, -7408819, -284005, 6362457, -2662880, -4815195, -1112397, 302795, 1878511, 4367445, -2015413, --42950, -2385854, 2438468, 1676111, -6271189, 1224603, 1297080, 836982, -1768453, 6562710, --700617, -1277216, 697932, 3081639, 1346472, -2150168, -701690, -869194, -1582159, 1291711, --1890323, 3097208, -1872069, -365072, 370441, -1459752, -425739, 1722282, -2031520, -460098, --2186675, 849867, 905164, 1757179, -2388002, 475131, -981400, 1206886, -819802, -2849174, --923418, 4906464, 3438121, 3945464, 11186242, 5852967, -4854924, -4340602, -12040404, -782221, --267899, -6425271, 2442226, 9662066, 1170916, -7612830, 7068980, 6717329, -700617, 2685428, -6808060, 1613297, -6186364, -955093, 14424648, 7095823, 1491427, -9516574, -3406983, 8680666, -2986076, -1297080, 4887673, 4370129, 4576288, -37044, 8952859, -81604, -1149441, 2255932, --4449049, -5828808, -295816, 985695, 3327526, 1827509, -5447629, 5530308, 9706626, 4982162, --268435, 7208566, -8210904, 4680978, -4893042, 5143224, -1373316, -5908802, -302795, -7697119, --12600360, -4600447, -5009006, -616328, -56371, -6598144, 1276142, -2029372, 3823058, 2522220, -4528506, -725850, 1820529, -6353867, 1097364, 1002875, 8847096, -3422552, -282394, -3076270, -1865626, 7956427, 4087198, -4626217, -7397545, 2333778, -2961380, -1017907, 3843996, -548145, -1289027, 900869, -4407174, 206158, -3364033, 951335, -3195993, -2153389, -1167694, -137976, --434329, 576599, -2049236, -216896, -693637, -1634772, -1381906, 486405, -363998, -849867, -212601, 752693, 2442763, -872415, 1426466, -1064615, -2472291, 1822677, -2704756, 2588255, --251256, -1746978, -302258, 858993, 1893544, -1408749, -192737, 403190, -485331, -11795591, --7793755, 16679505, -3645890, -3663607, 984621, -587874, 17891224, -5231270, -9644349, 233002, --9513889, 2370822, 7598871, 8159901, 2587181, -16603270, 13653164, -10744398, 5714454, -7346005, --5574331, -4113505, 6820945, 7323993, -10976863, 867047, 4805532, -3411815, 2208150, 3221762, --3962644, 505196, -9038759, -6082748, -13955422, 8266202, -1944547, 14074071, -6549289, 3052648, -9409200, -2351495, -2783139, -4164508, 10782515, 7863548, -13219372, 3770981, -7472706, -2515240, --2896956, -7432441, 4472135, 2363843, 11659226, 8196408, -14624364, -2401961, -6276558, 8546985, -2984466, 732829, -8529268, 1276142, -889595, 7182259, -1191853, 896574, -9811853, -227096, -6980933, -6433324, 1087164, -2032056, -1909113, -5200132, 1053341, -687195, 12368969, 5448166, -5660767, -2266132, -1374390, -2150705, -3361349, -1809255, 2763812, -3786014, -1198296, -3713536, -2811056, 2353642, -2013803, -1138166, 2613488, -3496104, 1736777, 529355, -935229, -1112397, -940598, -99321, -314069, -672162, 2284386, -3372086, 450972, 302258, 1710471, 1845762, -1850594, -1711545, 507880, -1207960, 2470680, 678068, 586800, 1806571, 4070019, -4483946, -307090, -9453223, -1181653, -10908680, 1707786, -2732673, 6262599, -440771, 5313949, -7471633, --14066555, 2986076, 9467719, 1237488, -1139240, 7384123, 4971425, -11502996, -181462, -4335233, -14567992, -644782, 1699733, 1147830, 153545, -452045, -5221070, 11547020, -976031, -16356846, --3067144, 9921374, -6383395, 1660542, -255014, 1332514, -2042794, 1586990, -3003793, 3919158, --6269579, 5919539, 8298414, -6491306, -1650878, -3838627, -11387032, 4571993, -8082055, 7051263, --7102802, -12284143, -3352222, 7319161, -2275259, -4380330, 4893042, 6769942, 3873524, 7419019, -12678207, 10218264, -649614, 2000918, 1736777, -6783364, 1305133, -7093139, -7736310, 4242891, --5899138, 1939178, -340376, 4472672, 4537633, -5861020, 6840273, -1851131, -2790655, -1241246, -4813585, -863825, -4424353, -3004867, -6270116, 7201050, -3592203, -922344, 1249299, -276489, --2648921, -2244121, 494995, 973347, 326954, -1233193, 1670742, 1242856, -1399086, 153008, -1080721, 677531, -846645, 4295, -1141388, 476205, -1919850, -1755031, 1109175, 580357, -2404645, 2643552, 239444, 1827509, 39192, -102005, -16072304, -13477607, 7867843, 14402636, -24696, -852551, 2774012, -6925635, -3330210, -16646219, -8836895, -4716411, -132070, -12108050, -17340394, 3441880, 9659381, -11038603, -13150116, -9907416, -3839701, 2636036, -14932528, -6694244, -6938520, -2965675, -18168786, -6167573, 2462090, 191663, 11288785, 3792456, -3534758, -8623221, -10737418, -6228240, -619012, 8085276, 2399813, -8806830, -4514548, -685584, -14711874, 3704946, -11451457, -4984310, -6310918, 1667521, -7442642, -2753074, 1487669, -4750234, -3621731, 3877282, --5545877, -11743514, 5813775, -6698002, -8747238, -12033961, -6004901, 1196148, -4793721, 1996623, -14811195, 8356396, -1787780, 14105209, 14343043, -6206765, 2009508, 3977677, -7406671, -4820027, --15704548, 1619203, -5017059, -12713640, -107911, 6693707, 11851962, 7281044, 3495567, 1320703, --10662793, -1339493, -2413772, 2800856, -4016868, -467615, 277025, -153008, 2601140, 499290, --939524, 2295660, -920734, -3367791, 2741800, -2257542, -2991982, 460098, 1142461, 1014149, -272194, 3281892, -301185, 2100776, 1263794, 251256, 696858, -18790, -2517388, 575526, --3473555, 814970, -5568962, -1394791, -212064, -3694209, -4356708, -575526, -4306779, -807991, --891206, -4952634, -10247255, 26097296, -1032403, 16005196, -8054138, -22831510, 6519224, 1985886, --907312, -10693395, -1053878, -7036767, 18090940, 13273596, 11837467, 8679592, -14194330, -63888, -1943473, 12617540, -21546240, -2424509, -5279052, -6275484, 3228205, -7077033, 2758980, 4816269, -3560528, 3852586, 4986457, -1480153, -2125472, -10457708, -2500745, -1583232, 10281615, 15569, --9422621, -2199023, 11188927, -1288490, 6507949, 8383776, -6072010, -3576097, -13879187, -8050916, -27151710, 7166690, 12081206, 6507413, 1570884, 1034013, -17212618, 10212895, 1610613, 3006477, -8784282, 9594957, 14918569, -17163226, -7094212, -9519795, -1205275, 2393908, -2269353, -4802311, --2819646, -14392972, -18103288, -11745662, -16966194, -2191507, -11089069, -18985366, -8029442, 6184216, -10406169, -3946538, -16245714, -565862, -2452963, 3859565, -4466229, 1057099, 9339943, 441845, --684510, -568009, 1190243, 1655173, -2757906, -2469606, -6527277, -7306813, 3900904, -1996623, -3491272, 3168612, -1188632, 2161979, 2880313, 5272609, 3735011, -2274722, 1159641, 6716255, -1294933, -6766184, -5601174, -3048353, -1410897, 523449, -2379949, 3894462, 4286378, -1016834, -6466610, 865436, -1796907, -1372242, 1507534, -3733400, 35032436, 7936026, -5062156, -7266548, -1120987, -11239929, -21977884, 16181826, 68719, 10417443, -7873212, 7539278, 17986786, -1770600, -2006824, -4520990, 15656230, 13191992, 5115306, -21204790, 1535988, 3132642, 13112535, 19092740, --5631776, -3893388, -2522220, 5128191, 6815040, 5677410, -9648107, 4422743, -11121281, 8522826, -11363410, -5417565, -11247982, 7116224, -12239583, -11187316, -467078, 3265249, 15953119, 1938104, --2182917, 13601625, -2517925, 12219182, 22558778, 11318313, 260382, -14310294, -1359357, -8237748, --6683506, 14423574, 5634997, -14512158, -165893, -11091216, -2811056, 19117974, 8791798, 2798708, -8185134, 11520176, 5971079, -15391552, 7945153, 12866648, 4412005, -10514080, 4346507, 1235340, -2209224, -8224326, 12712566, -3484292, -3047816, 15292231, 16200617, 2401961, 4615479, 17620104, -1042603, 8706436, -6167036, -173946, 10149545, 5890011, -4483409, 5250061, 9162776, -2463701, -83215, 11684995, 2420214, 4984310, -3443490, -5815386, -1758789, 3275986, 1707786, 2704756, -2771328, -1888175, -1810866, -1495186, 913754, 3519726, 4242354, -2815351, -838592, 7295539, -1082869, 9774272, -1736241, 2680597, -1305670, 1275068, 4409858, 2709051, 375810, -39192, --4108673, -2869038, -2067490, -4385699, 5634997, 5064840, -8513162, -440771, -10876468, -25597468, -8840653, -10202695, 2830384, 896574, 17935784, -12366821, -10931766, -4601521, -5004174, -6615860, -13245679, -11752104, -16581258, 4945118, -30982820, 897648, -5842230, -13113609, 16653736, -1079111, --994822, 7000260, -6614787, 5258114, -1686848, -18512382, -20208358, -213675, 4251481, 11825656, -5704254, -1360431, -2144263, -11646878, -5526549, 11669963, -18285824, 25195352, 14955076, 3356517, -18622978, -12455405, -5349919, -11404212, -11668889, -5050345, 8492224, 23791972, 191663, -12311524, --2092186, 1147293, -1352915, -1287417, -7586523, 6405407, 5871757, 16034187, -321049, 18131204, -9324911, 4971962, -482110, 3856344, -27131846, 14277545, -3478924, -15875273, 11286637, -28991, -14865956, 6596533, -25149182, 19472844, 15180562, -13158169, 21120502, 8126615, 15769509, 6250788, --2234994, -896574, -702227, -2975876, -5571110, -1712081, 2299418, -5550709, -8457864, 61740, --5531918, -9906342, -5947456, -7423314, 4655745, -4568772, 5734855, 1530082, 5851893, 2773475, --690416, -3169149, 973347, 548145, -488016, 808528, -1784559, -4118874, 1940252, -389231, -2376728, 2599529, 69793, 2195265, 993748, 3795141, 3236795, -5971615, -3610457, -5356361, --9992778, -7022272, -48070348, -3587372, 28226526, -5126044, 673773, 24903294, -5932424, 382789, -2855617, 6708202, -7636452, 6691559, -2743947, -8194261, 7817378, 9510131, -28175522, 3388192, --25096568, -597000, -13092134, -13999446, -3273302, -4156992, -13858786, 6921340, 2071248, 8710194, -11593727, -16922172, 21184926, 1543504, -20194400, 1708860, -14001593, -6912750, -15046881, -13462575, --6030134, 14230300, -12401181, 6808597, 14149233, -8545911, -15495705, -14061186, -20884278, -22264574, --13302051, -6306086, 1542430, -3329137, 5951751, 4270271, -13429289, -927176, 14682346, 8586713, --22192096, 8672076, -1875290, -6089190, -20580410, 13789529, -7517804, 19017042, 23802708, 660351, -22626962, -12537546, 13033615, -9863929, 14029511, 18163416, 1355599, -23848342, -956704, -32556926, -10330470, 7078643, 12716861, 6161131, -12992276, -11081016, -432718, -7426536, 7144678, -8036958, --499290, -486405, -8235063, -6259915, 5278515, -3127810, -9289477, -852551, 2598992, 6765647, -3400004, 14664092, -1746441, 1242319, -4589173, 10286447, -1680943, -2223719, 8792335, -493384, -1121523, 2149094, 11928735, -1952600, -5177046, 1262720, 8165270, 7936026, -8224863, -775778, -5312338, -9257265, 4938139, -1494112, 6391448, 392453, -8115341, -4387846, 3613141, 4138201, -4905390, 3743064, -22801444, 18434536, -43478492, -2560338, -4169876, -3614752, 4002910, -24934432, -1716376, -4902169, -2164664, 11402601, 4448513, 13265543, -10270341, 9393093, -4920959, -22145388, --8965744, -16249472, -10151155, 10748693, -19391240, 2558190, -7205345, -14634027, -2651069, 14361834, --19276886, -18478560, 7544110, 11154030, -656056, -8722005, 10343892, 11003169, 13392782, 11608223, -4763119, 15877957, 18735722, -10039486, 2781528, -8847096, 23514946, -1865626, -16324097, 19685446, -8584566, 4766340, -9360881, -12345883, 2864743, 7525857, 7488813, -613643, -10283762, 7841537, --11970074, 391379, -11812771, 36424544, 5582384, -10408316, 29843580, -3608846, 9107478, -7693360, -14973330, 22360136, -13892072, 21363168, 22586696, 29582660, 22646826, 2167885, 16810502, -13151727, --2639258, 3219615, -7350300, 13088376, 552440, -792958, -1335735, -3750580, 6320045, 3255048, -17863842, -5822902, 6579353, -3892314, 79457, 3417183, 5244155, -7499013, 2748779, 7536594, --3287261, -8422968, -1676648, -13539348, 4667556, 4275103, 3650722, -3537979, 2217277, 7173133, -3991635, -1680406, 6815576, 3118683, -4488778, -2228551, -1458141, 11232950, 14530948, 7793218, -3338263, 2663954, 4958540, 8696235, -5807870, -2282775, 3892314, -863825, 780610, 4040491, --3461744, 44935560, 11553462, -7482907, -6664716, 10554882, 2873333, 4584878, -1170379, -17749490, -14952392, -40715216, 4407174, 9126806, -1868848, -7318625, -15724949, -7046968, 1821603, 12267500, -18485540, -10820633, -23837068, -19084150, -2779381, 854699, -14069776, 28985124, -13498545, -8667244, -11863237, -3910031, 2098629, -2443300, 24705188, 4273493, -24856586, 9971840, 3103651, 17313014, --6171868, 1999307, -10302553, 8669928, 3741990, 21787296, -5313949, 9907416, 10233296, -12949863, --14463839, 1163399, 13109851, -25349970, -30175366, -8737574, -12411919, -1495186, -4403415, 3129958, -6805913, -5980742, 1005022, -34675956, -29591250, 23640574, 24950538, -30020210, -23194970, -28889024, --15211164, -11889006, 15017353, -15716359, -27998892, 943819, 1187559, -16995186, -3665218, 24488830, --3693672, 1474248, 7818451, -130997, 1376537, -956704, -8644159, -10586021, -593242, -2922188, -6995965, -1014686, -690953, -7634841, 3869766, -11874511, -297963, 3775276, 3963181, 5874979, -6514929, 1321776, 3685082, -2559264, 606127, -5996848, 2209761, 720481, -6900939, 7169911, -7055021, -10987063, 679142, 8196408, 6681359, 12611098, -2597918, -14446659, 4041564, 4846871, --7176891, 4709969, -7989176, -3673271, -1235877, -2441689, -6781754, 2551748, -24827596, -3143916, --5927055, 7402913, -11701638, -3310346, -38659000, 34237332, 22174380, -3817152, 47195248, -4711043, --25704306, -2464774, 10687489, -16042777, -20939040, -4506495, -14253386, -754304, 4127464, -21711060, -31878858, 986232, 3543348, -20032264, -5625334, 2083059, -5575405, 5026186, 7364259, 26037166, -4809827, -1397475, 21229486, 17342542, -6029061, 10205379, -13183939, 3701188, 11942693, 11416560, -29656750, -29233158, 18080738, 54069880, 543313, 8834748, 18670222, 2067490, 3837017, 8696235, -6896107, -18133888, -21398600, -7883413, 17497696, 5124970, -22238266, -12177843, -816044, -10801843, -20088098, 1789928, 15555298, -34207804, -20995410, 9927817, 23613194, 14321032, 9620727, 32458678, -19160386, -13678934, 22565758, -16895864, -3249143, -2454574, 12771085, -2679523, -13777181, 12104292, -5472325, 1135482, -15822660, 11071889, -48855, 193810, -6950868, 9330816, -7429757, -6176700, --5647882, 4440460, -5899675, -11748883, 4145180, 811749, 128849, -6397354, -1028108, -8006893, --6630893, -6403796, -3813931, -2473364, -2782065, -2436857, 1360431, 228170, -14920180, 10183904, -4248797, -4785668, -10969883, -15966004, -141197, -8691403, -5610301, 5783174, -3952444, 9912785, -5201743, -3469797, 2001455, 9279277, -3878892, -1513976, -4154844, 7831336, 2143726, 3276523, --7584376, 16019691, -45107896, 959388, -308164, -1445793, -5730023, 21066278, 1656784, -12120935, --22626424, 22896470, -20347408, 531502, 14673219, 11829414, -16007343, -4274030, -25764436, -106837, -7328288, 8987219, 10375030, 2750390, -16799764, -20876762, 17131550, 8881992, 8504572, 3380139, -8651675, 2625299, 12597139, -22512608, -38186556, 10590316, -5818607, -8102456, 21208012, -3710315, --11403675, 18824304, 17671642, 14749991, -1427003, -9571335, -16472810, -4219806, -21766358, 51015620, --4421132, 18382996, 3868692, -16916802, 13830868, -6459094, -16309601, 15950435, 12570832, -28033788, -19486804, -2972117, 27059368, -27431420, -20794084, 27704150, -1210107, -22395034, 22818624, -8382703, -39030516, -16583942, -13514651, -23592792, 14919106, 2793876, -19287088, 7683697, -25045564, -18210124, -1571421, 16216723, -14395657, -8743480, -28436978, -25687126, 30107720, -3458523, 13086228, 21195126, -28566364, 164283, -2956011, -2193655, 7504919, 11523934, 2092186, 5304822, 17577154, 7756174, -9666898, 5797669, 4377646, -3417183, -1676648, 10882910, 8223789, 14253923, -6764574, 9409736, -9860708, -15477452, 3929895, 3947075, -8483634, -4279935, -47782, 3954054, -6894497, 11230803, -596464, -2532420, -3209414, 9543954, 343061, 3016141, 852014, 2719788, 2139968, -8626979, --4333085, -6433324, 782221, -75162, 4756677, 6197638, -5541045, -12905840, 33430952, -7626252, -22633404, -35421132, -6245420, -822486, -42293080, -9296994, 6096169, 20762946, -10429791, -9920838, -893353, -3270081, 29644938, -2834679, -14949171, 31459024, -3935264, -1634235, 5907191, -12582107, -27166206, 1787243, -5582384, 13019120, 11131481, -14853608, -5120138, -6898255, 21146272, -42341936, --756451, -8220568, -14972256, 7237557, -15222975, 24634858, -6494528, -30515742, -3196530, 46335180, --28142774, 20296942, -31372588, -9035001, 31181462, 22795002, -16859894, 7905961, -20555714, -26996554, -5722507, -11879880, 11742977, 3386582, -1907502, 4578435, -39545376, -15469398, -20169704, -28904594, -13403519, -10982231, -8064875, -16034724, -28101972, -23629300, 18482854, -3709778, 57686780, 10104447, -5310190, 20593294, 36273148, 4734665, -26200912, 31826782, 24077050, -20378546, 5369783, -5178657, --20304458, -16004659, -13727789, -1593970, -12533788, 4679367, 8475044, 2937221, -9771051, 16919486, -2618320, 7793755, -2345052, -3001645, 8006893, 4873714, -8149701, -7355132, -7048042, 7729868, -3680250, 9347996, 9939091, 327491, -5374078, 7504382, -4343286, 16165720, 7662222, -19564650, --3879966, -14453639, 1710471, -4792110, -6980933, 20237350, -1121523, -6424734, 5171678, 6274947, --7439420, -1611687, -10222022, 4406637, 7323456, -1548873, -3256659, 1018444, -6892886, -1950452, --1102196, 9410810, 22501334, -13341242, -16915728, 19013284, -30223684, -3605625, -6158983, 1739462, -21436718, -14017163, 23783382, 10110353, 5483063, 7039452, -38565048, 26234198, 5011153, -27226872, -10755672, -28876138, 5035313, 38679400, -4684736, -22938884, -24263880, 10386842, 17708688, 14176613, -7698729, -25550760, -17351668, -7927973, -4602058, 33048700, -20787642, -12575664, 49386220, -27374510, --1949915, 19502910, 259309, 20547124, -2829310, -16590922, -10934987, -30141006, 15573015, 21423296, --31957778, 48063368, 16201690, -36254892, -32861868, -31532576, -37575596, -30562450, 1793149, 15093589, -3190624, -25464862, -9406515, 16997334, -219043, -15952582, 17799418, -34273304, 2433636, -7890392, --31425738, -29571386, 5387500, -11766600, 22635014, -41004052, -5240934, -14523969, -29744260, 2052994, -48631376, 12399034, -21100638, 10391673, -26040386, 10690174, -10394895, 932545, 1757715, 13690208, --1148904, 4684199, 17551920, 183073, -9212168, -4390531, 14150307, 9782325, 6708202, 3382824, --26776974, -2756832, 2415919, 15202574, 7969849, -14057428, 114354, 1617055, 24091008, 1329829, -8010114, -7320772, -4261682, 3504157, 8152385, -964757, -6569690, -13294534, 2391223, -5031554, --8749922, 4543539, -5957120, -6561100, 9649718, -7358353, -10130217, -14671071, -12486544, -2388539, -4336307, 64425, -10765872, 9419937, 23890756, -59210420, -53983980, -47558172, -30081950, 11886322, --12504797, 60175176, 16362215, -6925098, -13562970, -8123931, 17485886, -39906152, 46476376, 60589640, -24577950, -4182761, 48570176, -15826418, 29474214, 54989540, -9870909, 2537789, 10646687, 73330128, --18495202, -5206037, 44123272, 16099685, 14326937, -12671764, -44817448, 2530810, -35489852, 16438987, --44033080, -52374980, -450972, -3576097, -35990752, -2539400, -17435420, -37691024, -29479582, -48998596, --2179696, 48686140, -15633681, -10130754, -45400488, -25074556, -16669305, -16319265, 15475841, -11871826, -82228760, -20180978, -1085553, -30746598, 62051540, 50191524, -36003636, 40662604, -14478872, -61022896, --10763725, -6590628, 12670690, -14817637, -13695040, -8398272, -24458766, 6229313, 30184494, -36581312, --5134634, 9476308, 6200322, -42374148, 26922466, 18172006, 62221192, -27435714, 17004312, 25428354, --1662689, 6375879, -916976, 8240432, -7030862, 19377282, 8438000, 15550466, 13837311, 435402, -14245870, 3770981, -5527623, 14439680, -1061394, 1847373, 1493038, 9872519, 7635915, -11862163, --8917963, -14872935, 21447456, -15336254, 3029563, 12566537, 5393942, 23354422, 20456930, 35152160, -24322936, 19665044, 1184337, 12704513, -19060528, 16595217, 12690018, -4949413, -18347564, -34833796, --13553843, 9183714, -19253802, -7859790, -14055817, -34166464, -29232084, -14479945, -21832392, -13649943, --18838264, -24445344, -25312926, -8628052, -7490960, -12050068, -18683108, -10973105, -16718160, -12257837, --13703093, -4560182, -6568079, -5917928, -7117298, -6387690, -9249212, -5163088, -18581640, 24885040, -104487968, 12195560, -65514896, -16246251, -23169202, 5046587, 32613298, 58655296, 16750909, -49192408, --950262, 34086472, 7393250, 770410, -1538672, 8917426, -4715337, -5952825, 40475236, 25402584, -22601728, -34395172, -22351010, 23452668, 9043591, 13856638, -11962558, 4336307, 45090716, 1083406, -38227892, 20122996, 20841866, 37402724, 5388574, -19834696, 4562866, -22719304, 5668283, 15835544, -3987877, 61139396, -20449414, -39417600, -38038916, 47212964, 21731460, 25138444, 17139604, -27072252, --34014532, -20715702, -1228898, 10255845, -7492034, 16633335, 31222802, -2196876, 22617298, 20567524, --31781684, -6337761, 8942659, -14926622, -13506598, -15674483, -52385180, -8929237, 22512608, 1894081, -45533632, 30320858, -22259742, 16029892, 126165, -15309948, -12950937, -25431038, -56633440, -30291330, -2166811, 862215, -12652974, -3546569, -6025839, 17902498, 18719614, 9584220, -3585761, 1175210, -14147085, -7321309, 8814884, -25704842, -12268574, -3599183, 13469017, -3806415, 5202816, 8636105, -8616778, 851477, 24211268, -19921668, -17880486, -18152680, 12519830, -11922292, -18668076, -18607408, -12677133, -6471979, -13660680, -7467875, 9476308, 1968706, 13974213, -24324010, -15863462, -3335042, --1761474, 4123706, 10830297, -5874442, -9630390, 15307800, -8556112, -10720238, -8988293, 14691473, --4293357, -9008694, 4414153, -1850594, -8582955, -799938, -11389180, -8104067, -5164698, -1768990, --3637301, 1419487, -2934000, 82678, -1082869, 716723, -5811091, -360240, -2148558, -273804, --3255048, -62277, -5091684, 467078, -3877819, 336081, -3296924, 321049, -1396401, 1210107, --2267206, 519691, -3026341, 12348, -3240553, -866510, -4192425, -593779, -3076270, -783832, --2767033, -638876, -1737314, -743029, -2878165, -489089, -1251983, -237834, -1704028, -77309, --2339684, -280247, -1575716, -784368, -981937, -636192, -1603633, -455803, -1211181, -1102196, --729071, -566936, -1012002, -377957, -969589, -6983617, -24307368, 1739999, 83454976, 20071456, -35704064, -18327162, -74075840, -39244188, -54263152, -19776176, 38222524, 84169544, 39097088, 8358007, --39521752, -39344584, 27919972, 41310068, 22078816, 50411640, -1153736, -34830036, -48302276, -25130390, --6586333, 37171332, 5720897, 21021180, 20746302, 2230699, 52177948, 34770444, -2919504, -5996311, --46127948, -12581033, 22012, -118648, 28041842, 47164648, 30562450, 22080964, 46337328, 25082072, --45988364, -38885560, -10770704, -30711164, 32465658, 20270636, 47538844, 35147864, 42174968, 11095511, -8332774, -34846680, -34272764, -34237332, 12771622, 15831249, 985695, -5566278, 74403328, 17506286, --3958349, -7986492, 51298016, -54562728, 12359842, -102933184, -21677774, 24439974, -34529388, 32212254, -19940996, -530428, 74345344, 33686504, -40446244, -83734144, -38656852, -38500088, -19218368, -14960982, --9553081, 35112968, 24101208, 47731044, 7010997, -36942624, -23586886, -38713224, -33911452, -35896800, -16564615, 2230699, 16401943, 19753092, -8633958, 18191334, 11360188, -14462229, -384400, -15909096, --3592740, -33177548, -32810328, -13776108, -13563507, -459025, -30644592, 15933255, -1050120, 4861366, -10190884, -22334366, -42841224, -40967008, -862752, 7711614, 10430865, 25202868, 7841537, -14225469, --23509578, 7208566, -8080444, -13438953, 6310381, -119384520, -72192496, -40111236, 35506496, 9510131, -162694432, 172609360, 105664784, 191458368, 157327872, 165532864, 115457312, 139977280, 114410416, 1617592, --53896472, -77961712, -74036112, -156113472, -186343600, -195622336, -135817600, -107627048, -41735808, 6955700, --54739360, 33214592, -69104952, -25645250, -4344360, -22010096, 16900160, -64315524, 88144544, 14474040, -80391048, 50872276, 30320858, 20380156, 44668196, 28321552, 45799920, 103909752, 99657200, 78623672, -97401808, 122196648, 112113680, 104817600, 193642352, 67280664, 136372720, 176667568, 122163904, 160429920, -85856936, 114169896, 90058488, 107139032, 116895592, 42634528, 75835160, 56688736, 71004936, 67791224, -19077170, -13871134, -73614664, -27907624, -98354216, -86814176, -145681536, -165876464, -166155104, -351912992, --297200992, -319987424, -316638400, -370377568, -373796384, -231253920, -268156288, -200403168, -236552848, -180594240, --170225664, -148993488, -148671904, -86150064, -37489696, -54989004, -54770496, -45528264, 8941585, 70666704, -37590628, 147844592, 128107600, 187028640, 193133936, 177332752, 222504544, 205272592, 238769584, 185783648, -228462736, 241082416, 270541600, 235679344, 141533136, 140538848, 141366160, 142544592, 132476656, 92199528, -87331184, 35435628, 25957172, -3813394, 4635344, 16865262, -48468168, -72948944, -77669112, -49035104, --42195368, -81222128, -92899072, -109922712, -78565688, -101880920, -92745520, -79727480, -83905408, -87261928, --85525144, -23619636, -19656992, -11857331, -18693846, 9898826, -1969779, -3438658, -17435420, -7825431, -7204271, 10196252, 4879083, 14689325, 12035572, 18049600, 1626719, 1876364, -1473711, 8926016, --681826, 2204929, 1800128, 5888400, 1277753, 1185411, -7686918, -220654, -1375463, 1868848, --4836133, -788663, 202937, 2099165, -3825742, -6979, -2946348, -535260, -6324340, -3790846, --4212289, -840740, -6054830, -4639102, -9749039, -3193845, -3563749, 140660, -4489315, -5297842, --10674067, -9229348, -12710419, -7653632, -10162429, -9287330, -13991930, -10663330, -11245835, -6436009, --8775155, -5345087, -7621957, -3775813, -4050691, 1909113, 3398393, 8987756, 7508677, 11869142, -11892228, 18670222, 19341848, 20696374, 19800336, 22946400, 20059108, 21065204, 17728552, 17413944, -12492986, 11454678, 5028870, 4989142, -250182, -1066763, -5357435, -3964792, -6171868, -4177930, --6397354, -3896609, -5478231, -2580202, -4044786, -1175210, -2981781, -365072, -2284923, 224949, --1702418, 750546, -1279363, 1044751, }, -}, -{ -{ -5495411, -107911, -2041183, -466004, -4917201, -3379603, 2188286, 194347, -3094524, 3853660, 2585570, --834834, 237297, -522375, 3105261, -4303021, 1620276, 3226594, 2850248, -6192269, -4335770, --3074660, 4167192, 1010928, 1365263, -1721745, 4445291, 1671816, -1093606, 122407, -1256278, -876173, 1671279, -980326, -1267552, -3723200, 3978750, 6618008, 791885, 4206384, -768799, -853625, 1518808, 1834488, -5004174, 361851, -5228049, -1193464, -731755, 1658394, -2631741, --76773, 1158567, 537408, -3043521, 130997, 357556, 2510945, -3236258, -4063576, -537945, -5541045, 8881455, 30602, 1464047, 629213, -1889786, -5317170, -1345935, 3732864, -1690607, -3718368, 1446867, 3787088, -193274, 1483374, 1347546, -3165928, -4292820, -434865, 1638530, -2491618, 1211181, 1125818, 753230, 853088, -1462436, -2328946, -1588064, -1257352, -600759, -68719, -871342, -96637, 802622, 1296006, 1137630, -151398, 94489, 781147, -1611, --903554, 2574296, -5616207, -1210644, -5328981, 3103651, 289910, -2379412, 11197517, -4343823, --8112657, 666794, 3681861, -628676, -6117644, -1675574, -2688113, -941135, -2928094, -893890, -4121558, -240518, -2774012, 4839355, 652298, 4702453, -1288490, -1090385, 1737851, 172872, -2032593, -819802, 4337917, 7223062, -2026688, -4769561, -3583077, 3010235, -58519, -10990821, --1098975, -4348118, -1687922, 5458904, -3823595, -2814814, 3679713, -2384781, -581968, 5011153, -1662152, -3856344, 1703491, -2762201, -6570763, 2139968, 2512019, -4897874, -2914135, -1376537, --2129230, 10201, 2076617, 3438658, 5075578, 5783711, -1413581, 643171, -2306398, 2527588, -1527398, -1214402, 2352568, 3737159, -3558917, -1733556, 548682, 129923, 1372779, 4285841, --577136, -1072131, 3788161, 622770, -2700461, -1603097, -244276, -1570347, 1130113, -615791, --1510755, 663036, -1708323, -1250909, 787053, -1612760, -1174137, 111669, 1071594, -2010045, -199716, -440234, -761283, -935229, -131533, -1553168, -497679, -1483911, -9034464, -4620848, -2804077, 3991098, 1585380, 4332012, -3701188, 4535486, 5610838, -1589675, 6207839, -862752, -4578435, -2184528, 162135, -1960653, 5849746, 2257005, -213675, 5188858, -2749853, -2218888, -3833258, -9060770, -1551557, 479426, -1902134, -8075613, -4900558, 3329674, -3134789, -2115808, -139586, 6292664, -1490891, -4427575, -324270, 1610076, 3590593, -554588, -5693516, -3698504, --1027034, -2942053, 976031, -4989679, 2498060, -4694936, -6858526, 209917, 2440078, 2789581, --2175938, -1591822, -4491462, 5835787, 3407520, 806917, 87510, -171262, -1956895, -1072131, -2005750, 2488397, 8849243, -1000727, 2250026, 572841, -234613, -4324495, -3251827, 5972689, --2540473, 583042, 1515050, 860604, -907849, 4514548, 271120, 161061, -4871567, 4735739, -2690797, -1835562, -1058173, -534187, -1391569, 652298, 3451543, -48855, 1391569, 1032940, --445603, 791885, 1800665, -185220, 37581, 542777, 858457, 707596, 1044751, 1827509, -720481, -1340030, 1442035, 652835, -949188, -771484, -122407, 211527, 27380, 2218888, -2672544, 2435247, 5738613, -3802657, -5739150, -4591320, 2859911, 6393059, -1224066, 4899484, --4384625, -5273683, 4329864, -2189897, 409096, 1639604, 5433671, 2040646, 8653822, -3784403, --4684736, 2035815, -2617783, -2420751, 4881231, -7691213, -4794794, 772557, -1538672, 3505230, --2665027, 964220, 6132140, -5761699, 4246649, -3479461, 2731062, -3260954, -983011, -530965, -6352257, 1199907, 169114, -4699768, 170725, -5592585, 2033667, 1369021, -3793530, -100395, --1607928, 9660455, 1238024, 606664, -8458938, -4935455, -7145752, 5513665, -3674882, -415001, -2845416, 12321187, 8640937, -3501472, -7662222, -3181497, -6663642, 6949257, -1410897, -1948841, --3125126, -2048163, -648003, -3209414, -2187749, -554588, -2662343, 1832340, -1887638, 2578054, --9677635, 629213, -875100, -3058017, -1506997, -3246459, -731755, -5063230, 323733, -2114198, --258235, 3032247, -1058710, -1104344, -2244121, -2419677, -765578, 658204, -230854, -231928, --954557, -396211, -1112933, -190589, 144955, 569620, -820876, -875100, -1246614, -1067299, --980863, -1584843, 540629, -534187, -130997, -1610613, -4788889, 3417720, -4958540, -9024800, -9200894, 4059281, -9511742, 9506373, -1469416, -631360, -13395466, 7943542, 5410585, -10960220, -3306051, -1868311, 4190814, 882616, 4818417, 2978023, 1277216, -5135707, 536334, 1793686, --6633040, -2924336, -7839389, -1425392, -4850629, -2699387, 957778, -6257231, -2219961, -9187472, -3506841, 836982, 844498, 732829, -3864934, -8007430, -2422362, 2724083, -1231045, -755914, -8368207, -12399571, 5236102, 6230387, -860067, 327491, -2346663, -1044214, -3945464, -6161131, --4103841, -4869419, -3161096, 2990908, 1741072, 2654827, 4207994, -1062468, -2172180, 5866389, -11385958, 7929584, -126702, -9725417, 2696166, -1552631, 1461900, 10155987, -26307, 10231149, -9233643, -1334124, -3045669, -2544768, 755914, 815507, 3461744, 10373957, 2818572, 342524, --1043140, -6550362, 798864, 1924145, -2166274, -393526, 355945, -158914, 1227287, 834834, -760209, -887448, 1284732, 1084479, 1148367, 1212791, -3492345, -637266, -2506114, 927713, --1956895, 754304, -551366, -979789, -2099702, 323733, 532576, -3148211, -975494, 644245, -88047, 14436996, 3812320, -2676302, -608275, 4376035, -1431835, 13982266, -1399086, -2257005, -17933100, 17180, 9114994, -3447785, 343597, -872415, 1563905, -2376728, 1334124, -374199, --414464, -9773735, -830539, -2401424, -1636919, -4128537, 6291054, 2801929, 3782256, -5524939, --506269, -8675834, -3339337, 1516124, -602906, -5312338, -1511829, 2771328, 6569153, 3821447, --1956895, -8074002, -183610, 2174327, -1244467, 4129611, 2904472, 5632313, 7995082, -2666101, -44023, -8616778, -10259603, 9675488, 5344550, -452045, -338766, -423054, -3680787, -4240744, -15032, 7725036, 4618164, 1320703, 9643812, -7418483, 2243047, -6103149, -4534412, 4006668, -4316442, 3373697, 14477798, -620623, -6401112, 1027571, -6272800, 2783676, 1775432, 5150203, --2738579, -19864, 746251, -4933844, -764504, 3276523, -406411, 772020, -1999844, -1175210, --216359, 2235531, -1137093, 1373316, -2126546, 103616, -2778307, 815507, -1428614, -1093606, -560493, 1347009, -1680943, 1819456, 1333587, 2244121, 245350, 1286880, -499827, 743566, -529355, 752693, -791885, -127238, -734976, -228707, 526670, 1106491, -959388, 383863, --206158, -7991324, -10699300, 4145717, -9999221, -10737, 11158862, -11675869, 4281546, 5221607, --3115999, -14408005, 202937, 8406862, -9300752, 5778342, -639413, -4141422, -12064563, -352724, --8701067, 1530082, -4412005, -6803228, -8464307, 3471944, -1190243, -508954, 8069707, -4888747, -6809671, -5175436, -2054068, 10402948, 3582003, -5569499, 4288525, 2502892, -4807142, 2529199, -2632278, -1860258, -2046552, 405338, -2311229, -2757906, 1717987, 1895691, 14186277, -13356811, -2170569, 840740, -4771172, 9585293, 5473399, -3303904, -10335302, 910533, -1035624, -3134253, --6518150, -7660074, 9346386, 6042482, 786516, -943819, 4985384, 2513093, -2246805, 3967476, -2871186, -2599529, 9944460, -3698504, 6088653, -4077535, 3036005, 3112241, 2252710, -311922, --5512054, 5269925, -4287988, -4489852, -3059091, 1527398, 5369, 643708, -5226439, 2836826, -2218888, -3330210, 358093, -142271, -1641214, 300648, -1081795, 2522757, -714038, 376347, -2138894, -974421, -1592896, 1396938, -1818382, 1472100, -310848, -32212, -2094870, -958851, --51540, -2321967, 2299955, 1279363, 536334, 1500554, -467615, 1018444, -555125, 4712116, --10787884, 7912941, -4505421, -1996623, -6185290, -4464082, 3792993, -3561602, 3105261, 12097312, -4160213, 6646462, -15420006, -10217190, -5484137, -3694209, 1687385, -72478, 2680060, -12957379, -6951942, 2888366, 1749662, 12359305, 226560, -7007239, 11621645, 4565014, -5159867, 2369748, --6636262, 6097780, 2893734, 8127152, -6947647, -4947266, 2078764, -7044820, 8904541, -8147553, --121870, 7895224, 7293928, -15038828, -403727, 734439, 1771674, 2485712, 16451335, 3792456, -1050656, -5028870, -4129611, -8882529, -4785131, 12144020, 319438, -14499273, 245350, 3355980, --8207683, -9062918, 1103807, -5878737, 2438468, 13310641, 6560026, 5601711, -5432597, -14223858, -1175747, -2434173, 6558415, -1278827, -11883101, -1448478, 3139084, 3282966, 3248069, -1004486, -10118943, 1905892, -6383932, 8323647, -581431, 4982162, -132607, -1240709, -4296041, 6152004, -4265977, 2407329, -3107946, -1225676, -789737, -2073396, 1205812, -10201, -2633889, 1334124, -849330, -1498944, -1948841, -824634, -1461900, -214748, 1912334, -1908039, 1007170, 2357937, -2861522, -718870, 1247151, -1493038, -19019188, -5684926, 5398237, 14697378, 2113661, 7620346, -26131118, 4335233, 4471598, -4043175, -12504260, 7092065, -6055904, 6535330, -1559610, 17273284, -12606266, -6667937, -14129369, -11250130, 8548059, -7494181, 10475425, 4595615, 3422552, -3616899, --1364726, 12430172, -2439542, 10969346, 10996190, 5672578, 7717520, -8543227, 8355859, 4494684, --4459250, 12147241, -5342940, 11035918, 843424, 1245004, -16186658, 9760313, 905164, -3048890, -8014946, -11294153, -4468914, 6762963, 5541582, -10406169, 1687385, -6657736, -3814468, 10301479, -1395328, 3107409, -1079111, -11870216, 7976291, 7560753, 527207, 5977521, 2692945, -5259725, --5513128, -448824, 6338298, -10749229, -379568, 688269, 475131, -103616, 4713727, 6179384, -12702366, 7123204, 428423, -17840220, -5858336, -6680285, -590558, 1319092, -5004711, -10576357, --3324842, -4766340, 2794950, 408559, -3008088, 1129040, -3085397, 4915590, -1763621, -2107218, --2911451, 53150, 1423782, -6361384, 3992709, -4093104, 1660005, -1054951, -2346126, 108448, --3917010, 1262720, -3534221, -2579665, -505732, -2046015, -1882269, 2178622, 3757023, 2246805, -3616899, 4704600, -981400, 693100, 23588498, 6888054, 3148748, -8753680, -21223580, 15345381, -4800163, -14102525, 4212826, -1545651, 3620658, 2961917, -10174778, -21792664, -17040820, 5723044, -13343927, -2678986, 14007499, -6528887, 10926934, 13305809, 18072686, -4028143, 13351980, -11904576, -4514548, -6516539, 1597191, 7155953, -324270, -3905736, 3236795, 8992588, -6468758, -12084427, --12194486, 25435334, 21475, -1332514, -11530913, 11758547, 3814468, -23592792, -13659607, 5208185, --3348464, -4238059, 9146670, 3034931, 22722524, 12494060, -855772, -13312251, -13036836, -7456600, --5393405, -15098421, 13818520, -10357851, 10919954, 9342091, -9567577, -12352326, -11909944, -17390322, -4138738, -396211, -6288369, -7933342, -12760885, -4657892, -12573517, 2511482, 1427003, -4374961, -1614371, 10111964, -26234734, -10285910, -21429202, 10635950, 7405061, -9299678, -3191161, 4238596, --4131222, -282394, 4946192, -4114042, -8656507, -1112933, -2580202, -2859375, -230318, -1282585, --3758097, -34360, 623844, 4378719, -6435472, 1482301, 3317325, -584116, -2753611, -4234301, --1326071, -820876, 740345, -1602560, -504659, -2663417, 1038308, -1203128, -4192425, 6931541, -565862, 1928977, -5702106, -12931610, -24124294, -5688148, -6049999, 1089848, -5376226, 802622, -2871723, -2874407, 10783589, -13760538, -3790309, -13066364, -313533, -6619619, 15174119, 16382079, -13597866, -18752900, 13469554, -6910603, 10313827, -4046396, 7707319, -6359773, -7577933, 2649995, --9884330, 6383395, 8280697, -1178432, 5117991, -9565429, -822486, 15688442, -12259984, 423591, --3379603, -5351530, -9805410, -738198, 16056198, 20500952, -12660490, 6087580, -1254667, -12693776, --12435541, -13922136, -5913096, 26017302, 16189879, -5028333, 8797704, -5685463, 7677791, -14441828, -8815420, -551903, -7418483, 19798726, 10675141, 3957276, 6923488, 5596343, 19061602, 2373506, --15407121, 6347425, 12492449, 9371619, -27194660, 16782584, -11298448, -10500658, -4731444, 1651415, --10405095, 11871290, 26903676, -4653060, 4225174, 13480829, 2742874, -2255932, 3666828, 1348620, -8170639, 6911140, 4631586, 12671764, 6969122, -3546032, 9102646, 5363341, -3346853, -7720741, -4832375, -1058173, 5196911, -2195802, 1894081, 3865471, 1998770, -1068373, -459025, 1777043, -6441914, 1348620, -899259, 1375463, 5073430, -1942399, 756451, 7773891, 3489661, -1961190, -4733591, 1420560, 1648731, 3273839, 453119, 2729989, -669478, -4778151, -3911642, 3959960, --1808181, 17306034, 10850161, 46470472, 12667469, -7461969, 2721399, 8075613, -48855, 15688442, -11208791, 10965052, -13970992, -22629646, 22713398, -12680354, 1953673, 8255464, 24952686, 10419054, --15466714, 14078903, -14007499, -2535641, -19174344, -24578488, -2998961, 7037841, 6502581, 5328444, -6142877, -1650878, -17292076, -5996311, 5290326, 6095096, -9247601, 19292994, 11836393, -11042361, -6096706, 9773198, 3510062, 909459, -10679973, -967978, -7544647, -4005594, 891206, 12139188, -29185376, -7632694, 2491081, 4672388, 10773389, -10165114, 37051072, -2870649, 3429532, 3461207, --17072496, -16216186, -26913876, -11004780, 14467597, -4771172, 7192460, 6286759, 25452514, 4458713, -4432943, 1719598, 20026896, 10117332, -8602819, 18898392, -17026860, 3078955, 16918950, 22396106, -20109574, 8369818, -11704860, -18459770, -8286603, -5638755, -13910862, -7275138, -7977365, -1782948, --11700028, 3313567, -4120484, -1498944, -10213969, -785979, -6419903, 10359461, 890669, 2582886, --9094593, -1319629, -12436078, 1267552, 5129802, 20938, 8869644, 6096169, -104690, 4143570, --1987496, -5122286, -3375308, -2062121, -10654740, 1408212, 1999307, 2951716, 3042448, -4768488, -7346005, 8512625, 3463354, -5800890, -4294431, -1630477, 1730335, 4919885, 2341831, -3720516, --2225867, -1619203, -4672388, -19415936, 11006927, 4938139, 13464722, -3782793, -29229936, 2122788, --19565186, -17711372, 5322538, 3946001, 8315057, -5349919, 6010270, -1287417, -9947144, 15759846, --2489471, -5566278, -6328635, -11508365, -9556839, 5553930, -12073690, 2687039, -7709467, -5626944, --3305514, 15423764, -3045669, 16571594, 10576894, -4728222, 5621576, 5528697, 11996381, -8589935, --11303817, 1381906, 7056632, 8878771, 15814070, -17790828, -16957068, 6927246, 5621576, 19176492, --9638443, -1743220, 9670119, -296890, 2692408, -3966402, 12745315, 15679852, 7334731, -2415919, -10042170, 33275796, -7475391, -10211285, 12461311, -1778653, 19618336, 4322348, 9127879, 10668699, --3647501, 7336878, 22692460, -6635188, -27390080, 18792630, 5552319, -9448391, 2553358, -42103564, -27706298, -734976, 17141214, -11404749, 8897025, 795643, -16704202, -16312286, -2282775, 2581812, --12386149, -433792, 1764695, -2763275, -4211753, -3074660, -13561359, -2755759, -8203925, -419833, --4366908, -1762010, -4988068, 7524783, -6164889, -5138929, -8840116, -4760435, -10070625, -2405719, -2019172, -6091874, -827855, -5107253, -5128191, -5935645, -549756, -5030481, -3516505, 954020, --1656784, 3651259, -3316252, -6972343, -7171522, -625992, 927176, -5033165, -1167694, -2654290, -1832340, -9995463, -167504, -18402862, -288300, 27136678, 14202383, -36327372, 6052146, -7053410, -3559454, 5229660, -1290638, -19032610, 3011309, -3470334, 16431471, 30404610, -4703526, 9363566, -20869782, -1545651, -5329518, -5884642, 8498130, 30348776, -235149, -2790655, 25870736, -11013370, -7253126, -583042, -45634, -7299834, 9956808, -29092498, 1252520, 8345659, 21139830, 21434034, --17829482, 107374, 20319490, -1870995, 37515464, -14155675, -17862768, 1830730, 27346594, 4097936, --20378010, -10390600, 6496675, -747324, 12103218, -30865246, 4042638, 685047, -5961952, -22575958, --19070728, 4487167, -5552856, -2020782, 1438814, -23477364, -23579370, 4414153, 4097399, -24848534, --7839389, -16387985, 14425185, -38896296, -14118094, 11868068, -22855668, 12028593, -5919539, -10006200, -13013751, -4599373, 19376744, 17370458, 4409858, 10509248, -4742181, 1566589, -13139916, 13863618, --10115722, 7955353, -13786308, 9710384, 1048509, 3920232, -885300, -673236, -7783018, 8906688, --10310606, 1088774, 1547262, 4672388, -11352135, 5304822, -4399121, -4041564, 4009889, -3257733, --5160403, 7078643, 3633006, 7613904, 4024384, -1660542, -3640522, -4810900, -750546, 766115, --5245766, 1152125, -3746822, 1150514, -10897943, -6675990, -4285841, 4918812, 6934762, -4519380, -1789391, -2505577, 3160559, -9727027, 20573968, -383863, 11556683, -21467858, -1189169, -20342576, -21296058, 8873939, 27741194, 18892488, -9322763, 3307662, 21989158, 10715407, 11377905, 6666863, --17981418, -5634460, 9396852, 1068910, 11028939, -23795192, -17005386, 10198400, 35422744, 4391067, --11232950, 21764746, 6669011, 13457206, 4016331, 2320356, -19434728, -20542828, 703838, -57982, --34301756, 2407866, -6777996, -2180233, 11299522, -13920526, 8620536, 26811334, 3189550, -44771276, --31572842, -5610301, -9494562, -11445014, -9664, 7661148, 7349226, -11297375, 12611098, 11235098, -10879152, -7288023, 9404368, -5435818, -11236708, -3162170, 10459856, -33546916, -7260642, -15388331, --16967806, -7313793, 4954782, -9237938, -617938, 36017596, 21028696, -14464913, 409096, -41876, --6005438, -6955700, 3483219, 23998666, 9217000, 3243774, -7311108, -5969468, -12419972, -15096273, --15326591, -4044249, 2266669, 4367982, -5199058, 3848828, -1038308, -4039954, -1092532, -4662187, --13440026, -3899830, 127238, -3952981, -11596412, 1007707, -4043175, 12416750, -6281927, 3874597, --1072131, 4828617, 176094, -10953777, 1129040, 12022687, 2151779, 10759967, -2873333, 5254893, --3376381, 3144453, -547608, -8280160, -3216931, -1353452, -1164473, -2065342, 166430, -2879776, --5530844, 7329362, 14439143, -20045686, -4927938, -8599061, 5401458, 41366976, 6672232, -20623896, -5510980, 18170396, -3838090, 16964584, 21929030, -11455215, 5255966, 10836739, 7614440, 302795, --3125126, -6941204, 3344169, 12761958, 6761889, 11905649, -18043694, -28125594, -2889976, 12276090, -11071352, 8760123, -3099893, -25963614, 8381092, 5526013, 38683160, 40399536, 9720585, -30392262, -21921514, -11693585, -30794916, -7407745, -36459976, -28024124, -12218108, -13602698, -28261958, 4742718, --11352135, -32633162, -29618632, 8381629, 19334332, -3375844, -24997246, 7250442, 775778, 7820062, -15829639, 15174119, -19333796, 24824374, 17243220, 1986959, 6961605, 17213156, -863288, 45338212, --32424856, -15722802, -1046361, -37243272, 30444876, 2019708, 38256884, 11600707, 8586176, -2132988, -7605850, 15998753, 666257, -15281494, -215822, -8250632, 6088116, 5635534, 10951630, -4784594, --13937169, -292595, 12986907, 5937256, -8262980, -4340065, 6834367, -9497783, -30065, 2684, -11921755, 4462471, -6483253, -3022046, -7369090, -12139725, -10334765, -768799, 2272038, -6115497, --4340065, 1197222, -5960341, 9167071, 4571993, -301185, 5630702, 18711562, -7185481, -3781182, -2135136, 4894115, -10192494, 10899553, -3731253, -515933, 1889249, 8034810, 14186814, -20491288, -5557688, -40672804, -10709501, -2757906, -9705552, 44122736, 14224932, -12043625, -27643484, -14392435, --11241540, -17920752, -12728672, 6526740, -40468256, -9023726, 30103962, -3798899, -3128347, -31360778, -29888678, 14436459, 892816, -12060805, 12864501, 6002754, -6861747, 13269838, -20795694, -5848135, --10515691, 5753646, -4691715, -13516799, 15250892, -11571716, 6485401, 155156, -20205136, -12995497, --2975339, -25837450, -24881282, -33880312, -8464307, 15122580, -11074036, -6444062, 19588808, -23934242, --19233938, 20662014, 33823, -1508607, 19072340, -20401, -15948287, -9574556, 6567542, 13349295, --20666308, -6856379, 25587804, 10669773, 24696062, 12394202, -4821638, 12597676, -792421, -33493228, -10617696, -25415468, 18386218, 2868501, 6863895, -10881300, -28512678, 5724655, -4093641, -25228638, --9796820, 10858214, -12455405, 200253, 4112968, 7814693, -7925826, 111669, 1395328, -2476049, -5386963, -4066797, 3097745, 9883793, -1704028, 3164317, 2868501, -6966437, 2273648, 4559645, -2975876, -5295695, 6910603, 4315906, -309775, -7283191, -13983877, 2559801, -11026792, 8746164, --11262478, 7143605, 9554155, 75162, 725850, -100395, 5509370, 453656, -4694400, 10645076, -9001715, -4752382, -2973728, -7070590, -11407433, 30144228, 10711648, 974421, 3835406, -8054138, -12144020, 18516678, 47413216, 41146860, 3704409, -18328236, 8542153, 23794118, 6974490, 18389976, -13502303, 8826158, -13885092, -18148922, -21498996, -1662689, 8161512, 15075872, 30838938, 16095927, -19821274, 11294690, 18385144, 9054865, 17713518, -11911018, 3437048, 33042258, -774168, 25381110, -6888591, 20493974, -32663226, -5498632, -9547175, -9827959, 7759396, 12596602, 23854786, 38235948, -32284196, -11578158, 5824513, -42827804, 10470593, 9644349, 37688876, -30054034, 23874650, -7937100, --20837570, 15866683, 5057324, 13210246, 23644868, -7845295, -30046518, 15417322, -19281718, -26768384, --12533251, 35369592, -30769682, -44008920, -22013854, -7454990, 23206782, -2609730, -15661061, -30440044, --22737020, 14259828, -1973001, -769873, 19680078, -21543020, 6191196, 21700322, 8622684, 14456323, -21307870, -14584635, -7154879, -12361453, 16316044, 3385508, 8441221, 5694590, -14522358, 17914846, -4564477, 2647847, -7074348, -26749594, -25254408, 2291902, -11979201, -5240397, -11359652, -10186052, --4289599, 4429722, -77846, -11433203, 14357539, 11719892, -1539209, -12953084, 2152316, 7386807, --9004399, -4375498, -5142687, -163209, 6240588, -3125126, -6206228, -5359046, 4406100, 3345780, -7027640, 8392903, -4490925, -4138738, -5113159, 4835060, 5505075, 29584808, -9236327, -32948842, -2442226, -13827647, -46790448, -23850490, 61696668, 8499740, -27649388, -30626338, 3588445, 443992, -12867722, 15882789, -21369610, -14388140, -34181496, 7907035, -12294344, -8330626, 52649856, 11188390, --7088844, -54248120, -3325379, -28999082, 28845000, 35342212, 3893925, 27485106, -32273458, -12832289, --20319490, -4901632, 53787488, 66693324, 10855530, -17866528, -23638964, -48237316, 862215, 6192806, -58472760, 32479080, -8304856, -95820184, -49402324, 8217883, -8977019, 84109416, 28424094, -40401148, --16572131, -72105520, -22581864, 2527052, 47390668, 48642116, 54863376, 2599529, 13190918, -5742372, -4972499, 67192080, -24533390, 49362596, -11685532, -50662360, -14900852, -53701588, -16979080, 70370352, -32269164, 50258096, -16358457, 39424580, -43807592, -6991670, 10788421, 21040508, 42091216, -14053133, --593242, 2689723, -3637301, 6514929, 11474542, -11890617, 2155000, -12501576, -22394496, 10297184, -18822158, 10381473, -2042794, -13566728, -30056718, -29867202, -15431817, 10235981, 28376312, 15880642, -22043382, -29340532, -38216620, -29665876, 3748970, 33943128, 37967512, 28981902, -16822314, -73403672, --46834472, 1574106, 37455872, 80064096, 31412854, 6726993, -35927940, -47772920, -16187732, -15082315, -42362872, 46466176, 17796196, -2554969, -39662948, -29931090, 9698573, 14046154, 34599184, 16772921, --17053704, -12094091, -20512226, -9796820, 10481868, 9293235, 10623065, 13127568, -2254858, -3598109, --42487428, 47144784, 269509, -12513924, -73339248, -19971062, -19661286, -33349348, 71384504, 592706, -32094144, -48824116, 27220428, 22523346, -21687974, 14086956, -4000225, 12579422, 202400, 36268316, -13074954, -35479116, 21553756, 17468168, 97174, 24453934, -17964774, -9466645, 31077310, 21508122, -20771536, 10146860, 18102750, -53372484, 46705084, -26839250, -16788490, 10069551, -37121404, 54458036, --15295989, 5390721, 39611408, 1308891, -5779416, 21369072, 22116398, 38574712, -9210020, -35883380, --36318244, 4037269, -12976170, 16910896, -21880174, -10757819, -14743012, 10932302, -68434400, 1122597, -51189568, 14113799, 20971788, -1906429, -5390184, 13448616, -17903034, -20720532, 13011603, 7121056, --22123376, -24813636, 94836096, -10197863, -30539364, 8637179, 44571560, -1192927, -34711388, 14432164, --6331856, -13180181, 28774670, 36295696, -26300770, -43349640, 10040560, 10508174, -9786620, -25898652, -1522029, 13157632, -3762928, -4151623, -1488743, -4407710, 7197292, 7808788, -8682276, 1057099, -4130685, 2026151, -5126581, 2079838, -60130, -11933030, 8897562, 3791383, 16993574, 8407935, --6118181, 6941741, -3069828, 9975062, -461709, -2457258, 13908715, -3274376, 9607305, -2618320, --10499048, -806380, 12545599, -3322694, 14246407, -13123273, 17824114, 4277251, -12386686, 5464272, -525597, 6625524, -1879585, -4919885, -1030792, 4426501, 14099841, -37022620, 13423383, 57549876, -91532192, -40630928, 30093762, -60501056, -17351132, -36971080, -4600447, 55722904, 59861108, 46959024, --1064078, -38007240, -22386444, 20273856, 1983738, 10044318, 31521302, -820876, 15926812, -39790724, --9617506, -23108534, -27382564, 15068893, 13227426, 649614, 28363964, -23864986, -340376, 6082211, --32840930, -1106491, 2867428, -21263846, -7422777, 7741679, -13540958, 31256088, -9718974, 47435768, -36550708, -23597088, -6010270, -32738388, -36688148, -48518100, 16070694, 22200686, 65293168, 49236968, -23664732, 31264140, 6627672, -35715876, -22926536, -20033874, -23622320, -5217849, 14230300, -1359894, --16012712, 4299799, -16151761, 10545218, 24781424, 4678293, -24456080, 19639812, -11356967, -12800613, --24453396, 13030931, 11879343, 5731097, 3816079, 57070452, 44334800, 35697084, 6805913, -8227547, --47555488, -10058277, -4279935, 47588776, 28008018, 12466143, 15153718, 41248328, -5760088, -16288127, --21423296, -18504330, -7946763, -4043712, 4575751, 638340, 1132798, 21506512, -1636919, -12595528, --6962679, -4205847, 1318018, 10748156, 19925428, 8536248, -1528472, 12000675, -18836652, 7929047, -19031000, 7627862, 36648420, -14412837, 1154809, 6361921, -13984950, 4158065, -22783728, -946503, -9247065, 579284, 10623065, 5844914, -1671816, -282931, -3534758, -369904, 5712844, -6225018, --99629816, -56693568, -33673616, 57530012, 26042534, 152055264, 141695808, 147659904, 148116240, 159964448, -111466752, 59090160, 84242560, 51567524, -26058104, -46632072, -73427832, -140927536, -128137128, -131635912, --96489128, -96582544, -72662792, -59163176, -32428076, 3716221, -56710748, -28170690, -12350178, -8388608, --31039728, 8251169, 37126236, 42950748, 15083925, 50655380, 63181116, 16254841, 11815992, 13049184, -62054760, 65847756, 81843824, 92858800, 80160192, 92209728, 138712416, 56902948, 108121504, 148969872, -94772208, 113148768, 87891136, 44741212, 52166136, 58911920, 51282448, 71094056, 68924560, 43574052, -7606924, 21791054, 40251896, -2325725, 3892314, -19532974, -23656142, -69901664, -32472100, -121322088, --153617552, -122124712, -140250544, -189429536, -184022176, -108413024, -205451904, -185438432, -170323904, -191462656, --162617120, -123230128, -155881536, -113927768, -32573032, -75659608, -94646048, -36992552, -38039452, -30433602, --34628172, -14936286, 8209830, 19231790, 36326296, 48377436, 54410256, 62463856, 63529008, 91105384, -54784992, 107318888, 119145080, 57133264, 110571784, 106077640, 66247724, 81231792, 117017456, 80155904, -132209296, 100470560, 125277752, 88282512, 79267920, 83147344, 76735496, 60887604, 68874632, 60604672, -46972984, 35913980, 34154116, 28337120, 11151346, -9550934, -8391829, -5737003, -43425340, -69110856, --67138928, -68184752, -74896176, -68870336, -77496776, -55952688, -58488328, -47590920, -36050880, -28045600, --32283122, -31396748, -24658480, -17442936, -19481434, -24896852, -13947906, -7675107, -15295452, -22257594, --13764833, -10359461, -13959181, -16862578, -8163122, -1174137, 4849555, -214212, 3379603, 10998338, -11212549, -1090922, 3333968, 7406671, 4938139, -1600949, 1415192, 4003447, 3063922, -3249143, -187905, 2680060, 4547297, 2450279, 4648229, 915902, 2747705, 5120138, 9188009, 2951716, -1758252, 781147, 3065533, 819802, 2236604, -123480, 1125818, -2683818, -4330938, -7386807, --2957622, -4794257, -3964792, -6763500, -1947231, -3599183, -2213519, -2121177, 2818036, 865973, -2314987, -579821, 4716411, 4029216, 7420093, 3398930, 8617315, 9112847, 11089606, 6109054, -10105521, 9527848, 9742596, 5087389, 7626788, 5652177, 8081518, 3922379, 4998805, 2237141, -4919348, 603443, 2341831, -515396, 1217086, -2415382, -983548, -3289408, -992674, -3783329, --1522566, -3686156, -732292, -2981781, -195958, -2371896, 531502, -1712618, 1080184, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ -10821707, -521302, -665720, -413927, -800475, -5559299, -5552856, 5318244, 1334661, -3243237, -4842039, --2394444, -3647501, -6410239, 8199093, 948114, 3001645, 4025995, 11791296, -338229, 1925756, --2865280, -992674, -2211908, -7601019, 1672353, -2288681, 720481, 5372467, -2135673, -469225, -1123671, 617402, -1298154, 303869, -7103876, 1522566, -202937, -2481417, 2179159, 1071058, --4791573, 7568269, 231928, 1137093, 6958384, -2655901, -3049964, -6833830, -3522410, 4817880, -268972, 5132486, -2515240, -5578089, 2423435, -5194763, -2379412, -10081899, 4141959, 3608310, -2134599, 3112778, 6931541, 1864553, -3082176, 3815005, 5753109, -3721589, 2835752, 38655, --1245541, -1901597, -1582159, 3954591, -812823, 4382478, -2209224, 1795296, -1372242, 1629940, -3126736, -1649268, 1125281, -1120450, 2523293, 2126546, 1722819, -817118, 583042, 127238, --1439351, 767189, 2466922, 498753, 824097, -1411434, 958315, -743566, 560493, -1068910, -229244, 1486059, -4308926, 1196148, -2683281, -5359046, -571231, -6338298, -7784092, -4845797, --3750043, -8494372, 303332, -3037616, -1758252, 2675228, 9059697, 881005, -2200634, -994822, -1424855, -128312, 3741990, 6509023, -583042, 7303055, -871342, -422517, -904091, 4183298, --5494874, 903554, 627602, -1286880, -345208, -3206193, -5458904, 7509751, -2568927, -498753, --1360431, 3345780, -3577171, -2995203, 1268626, 1163936, 5178120, -3513283, 4260071, -2447058, --4322348, -278636, -1801202, 1226213, 2310693, -32212, 3007551, 1504849, 2186138, -2811593, --3401077, -5532992, -4135517, 588411, 6659884, 907849, 5405753, 1473711, -2814277, 3797288, -1752884, -3965329, 7052873, 1246077, -6675990, 1803349, 3001645, 666794, 1989644, 1801202, --4731444, 1790465, 1639067, 1234266, -282931, 3544422, 1157494, -816044, -1148904, 48855, -1380295, 34360, 1878511, 15569, 85362, 1163936, -456340, -958851, -670015, 265214, --923955, -906238, 1212791, -36507, 1165547, 1103807, -282931, -20401, -7878581, -7091528, -1539746, 744640, 5942624, -4615479, 6111739, -3147137, -1331440, -9605694, -591095, 558883, --3256122, -649077, 5135171, 4744865, 7263327, -1855963, -1093069, 4433480, 2135136, 3970697, --9824201, 9646497, -2091649, -234076, 1551020, -1292248, -71941, -976568, -669478, 5938866, --174483, 7828652, -1364726, -3360812, -6602439, 658204, -2991445, -2733747, 4560719, 3411815, -4767414, 41876, 585726, -7150047, -5076652, -196495, 6395207, 2092186, -832150, 2019708, --2676838, 6694244, -374199, -6013491, -7485055, -2795487, 8367133, 6203007, 6459094, 2879776, -233002, -7136625, -3143916, -1116155, -4111894, 4196183, -747861, -2088428, 3685619, -10110890, -2980171, -1403381, 2363843, -890669, -2865817, 4427575, 1713155, -4847945, -5037997, 2449742, --1313723, 2874407, 804233, -2251637, 1548873, 1792612, -85899, 629750, 2147, 119185, --841277, -111669, -1387274, -81604, -1208496, 1886564, 1086090, -1602560, 758599, -482110, -528281, 435402, 694174, -1217623, -972273, 258772, 738734, -2157684, -1165547, 1946157, --2203318, -4399121, -665183, -3418794, 1593433, 5398774, 2188823, 141734, -2167885, -12720083, --8297340, -323733, 3722663, 4387309, 310848, 846645, -1732482, 4350265, 2005213, 3476239, --5466420, 5188321, 3063922, -6002217, 2288681, 5412733, -242129, 1717987, 947577, 4904316, --3789772, 2892661, -442919, -713501, -4675609, 244276, 5129265, -3277597, -2280628, -4479651, -6011344, -624918, 1220845, -4708895, -13237626, -3920768, 2018098, 1184874, 4979478, -3580929, --2120103, -2058900, -822486, -4316442, 200790, -3900367, 8784282, 3026878, 7178501, -7239704, --1349157, -3025805, 6732898, -2066953, -1157494, -5583458, 3513820, -151934, -3635153, 5636071, -1831267, 656593, 6580964, 1357210, -5629629, -832687, 766652, -1585917, -1848983, 8053, --4767414, 9580461, 4041027, 1364726, 6071473, 2568391, 2448668, 4371203, -1179505, 3694746, --2053531, 611496, 468151, 193810, -1028108, 644245, 373662, -381715, -564788, -650151, -548682, -518617, 130997, 3162707, 423591, -118648, 36507, -66572, -339302, 2506650, -746787, 1619740, 202400, -1641751, -310848, 3579855, -2858301, 2288681, 173409, -1411434, -5974837, 4620311, -499827, -8154533, -10976863, -8409546, 3098282, 52613, -4758287, -1184874, -523986, -1027034, 12284143, 2176475, -8924405, -2314451, -2685428, 500364, -4212289, 7018514, --5228049, -6767258, 6354404, -2624225, 1730872, 1750736, -2935073, -7973070, 1053341, -4220342, --3797288, -3872450, -505196, 6315213, -877247, -1353989, 9228811, 1760400, 1404991, -11857331, --1339493, 6425271, 7436736, -4050154, 2013803, 1086627, -11769821, -1505386, -724776, -1129040, -2961380, 204011, -6600828, 932008, -5277441, 5133023, -1794760, 6587406, 1301375, -7400229, -3315178, 14103062, -5444945, 198642, -10450729, 2609193, 8799314, -15686294, 2255932, -1044214, --1358820, 3995930, -2536715, -4037806, 7405598, 7151121, -6104223, -663572, 4642860, -1982127, -1105417, 2262911, 1384590, 528818, -1770063, 4025995, -88047, 2660732, 126165, 3607773, -2419140, 2307471, -166430, 844498, 3946001, 508417, -784905, 1464584, 1245541, 552977, -3286724, -1721745, 1063541, 609349, -697932, 325881, 1206349, 909459, 426812, -219580, -175020, 10685879, 1173600, 4871030, 7336341, -9069897, -2962454, -6885907, 3404299, 4227322, -7983808, 15858093, 2343442, -11829951, -1248225, -2859911, -1369558, -5027259, -105764, -424128, -5815923, 4884989, 1599339, -265214, 118112, -1684164, -1489280, 6967511, -2335925, -746787, -4970351, -472446, 2882997, -339302, 6360847, -4771709, -9895605, 12343199, -826244, 3063922, --9266392, 850940, -2892124, 13682155, 2024003, 6293201, -1380832, 5602785, 3547643, -12038256, --2025614, -6677064, -5997922, 1011465, 8517994, 1270774, -1824824, 13562433, -1509144, -7362111, --5860483, -3757560, 6473590, 20400558, -129386, 5806259, 1363652, -6236293, -1498407, 315680, -5912023, 9390409, 763967, 7590818, 6506339, -11884711, 323196, -1947231, -383863, 6278169, --2779918, 1793686, 2790118, -710817, -6282464, -4088809, -9142912, 2397129, 3549791, -228170, -1330903, 1566589, 1038845, 123480, -2879776, 833224, 1276142, 79457, 1178969, -1230508, -2359548, 35970, 1159104, -420907, -489089, -917512, 254477, -374199, 374736, 2254321, -3160559, 2913062, 354335, 956167, 1920387, 1358283, 17717, 1379758, 352187, -32749, -2383170, -3445638, -15752866, 3684545, -1730872, 5498632, 3274376, 14665166, 2765422, -2606508, -3321620, 11252814, 12138651, 5217312, 8500814, 8998493, -7036230, -5203890, -11300596, -11898133, -1148367, 5322538, -10348187, -7109245, -724239, -11645267, -9933186, 5077188, 1410360, -5105643, --3659849, -7600482, 6236830, 4807679, 10368051, 20169704, -2405182, -5566815, -2323577, -9764608, --301185, -7584376, -8705362, 10387378, 985158, 1525250, -13389561, 13743358, 2520072, -8382166, --2918430, 7124814, 279710, 1626182, -424128, 1245541, 3795677, -6400038, 7434052, 270583, --5552319, -1395864, -9375377, 1526861, -9621800, -8265128, 7027104, 7558069, -7696045, -11815455, -2829847, -5650567, -1064078, -3084324, 3799972, -3321084, 5079336, 1780801, 6191732, -1364189, -4570382, 2549600, -10901701, -3655554, 2415919, 1488743, -23085, -5203353, -3199214, -1499481, -3315715, -1963337, -1992865, 235149, 2610266, 2278480, -344134, -76236, -3288334, -1574642, -365072, -649077, -534187, 2587718, 48318, -102005, -2480344, 2241436, 464930, -750546, --666257, -1445793, -519154, -1609002, 2057289, -497679, 820876, -595927, 4031364, -6037114, --6407018, 7756174, -2333778, -1954747, 4625143, -6652905, -6808597, 7816304, 10678899, 63351, --566936, 3469260, -9043054, 15438797, -9475772, 1005022, 7518877, -3664681, 7018514, 8266739, -2836826, -8944269, 9570261, -1547262, 3637837, -7043747, -1227287, -13276281, 4585952, -7942469, -3072512, -13662291, 8000987, -10024454, -6847252, 5521181, 7896298, 2500745, 922344, 190589, --8451959, -8028368, -4992363, 20445654, 11341935, -3373697, -19026706, -2825552, 5402532, 10964515, --6242735, 769336, -13145284, -4663261, -1600412, 3295851, 1958505, -3089692, -214748, 5651640, --6502044, -489626, -7416335, 3917547, 4878546, 14093935, 6053220, -7037304, 2945274, -3974455, --10734734, -1483911, 6222334, 758062, 17712446, -10257993, -4939213, 2612414, -9221295, 4586488, -1480153, -1863479, 8996346, 2103997, 3973382, -53150, 326418, -1525250, 4446365, 6503654, -1597191, -2032593, 4856535, -2656437, 1522566, -4696010, -1532230, -133144, -6023692, -228707, --2348273, -1192927, -2345052, -4031364, -1814624, 1213865, 1512365, 922881, -1279363, -321049, -2647847, -4529043, 445603, 248571, -13652627, -1912334, 2703145, 8094403, 3820910, 10543071, -1827509, -12417824, 7882876, -10491531, -11398306, 402653, -1103270, 8704825, 10638634, 9942312, -14297946, 3604551, -14897631, 16325708, 8807904, -6465537, 12423193, -1519345, 1459752, -10858214, --3852586, -3061238, -4917201, 10569378, -17648020, -3877282, -8320963, -7756174, 1398549, 8582418, --4067871, -10048076, -10819559, -13918915, -14227079, -7097971, -2459943, 6222871, -11176042, -14321032, --8572755, -3527242, -7124814, -4625143, 12528956, -6958384, 1141924, 6781754, -11443940, -6665789, --7723962, 12492986, -5318780, 8176544, 17703856, -1611150, 3946538, 1846836, -5469104, -7013682, --4904853, 8494908, -1279900, 9710384, 547608, 7359964, 1659468, -12067784, 15064061, -6393596, --1952600, -12825846, 7915625, 17095044, 2842732, -2206003, 4482335, 2085744, -10893111, -4951561, -619549, -2450279, -1191853, -4562866, -4605279, -635655, 788663, 799401, 7872138, -792421, -983548, -3789235, 2980707, 445066, 5914707, 2697240, 2660732, 1243393, -728534, -2432562, --2168422, -3425773, -786516, -2550137, 1766305, 1032403, -71941, -1740536, -1587527, -1243930, --552977, 738198, -645319, 3370476, 25282324, 15727096, 11671574, -8471823, -17974438, -5019206, -11152956, -17281874, -9213779, 197569, 13600014, 9520332, 7955890, -10071161, 7626788, -2812130, -7624104, -2101850, 19604378, 11537356, -833761, -18051210, -1716376, 13438416, 11680700, 340913, -23737210, 10537702, -4615479, -151398, 1759863, -2935073, -6463389, -9235790, -1300301, -25673168, -7362648, -8902393, 1342714, -1044751, 6796249, 9351754, 368830, 2381023, -11264089, 7970386, --4011500, 16755204, 515396, 2265059, -41052372, -1920924, 11115375, 5521181, 11814381, -4159676, --11403138, 6253473, 2363843, -9599789, 9120363, 1668595, -8927090, -22549, 515933, 3002182, --3199751, -15233175, -14976014, -779537, -5305895, 4903779, 5452461, 2078764, 5794985, -18621368, --6200322, 787053, 4221953, 4291746, -7221988, 5631776, 1481764, -2809982, 2080375, 5061619, --3347927, 532039, -993211, 1991254, -3407520, -5706401, -1737851, 6405407, -4844723, 523986, --3586835, 2457258, -1406602, 2153389, 3925600, -639413, -3640522, 2904472, -505196, -4599373, --2681133, 1398549, 2175938, 53150, -1647120, 686658, -222801, 2528662, -1147830, 5081483, --1665374, -538482, 3202435, -17410186, -27923730, 4475893, 9709847, 10018548, 267899, 23198728, --16496433, 5413270, 3208878, -4748087, -14641544, -6215892, -8315594, 9817221, -4298726, -9072582, --14903537, -1417876, -5492190, -2891050, -11235634, 5965710, -681826, -5310190, 6089190, 7681549, -9162239, -11905112, 21698174, 1277216, -3093987, -13353590, -12492986, -2585570, -1622424, -13026636, --13515188, -10430328, 8749385, -6059125, 14495515, 4594005, 24174224, 8247411, 9187472, -3142842, -12969191, -2296734, 3132105, 18312666, -5581310, 6616397, -22059488, -28147068, 6137509, -1372242, --17830556, 1068910, 447750, -24299852, 6832219, -7189776, -4794257, -9517648, 9156870, -8895951, -506806, -1022202, 4414153, -20938, -13276281, 7747048, -1914482, 3058017, -16746077, -23159538, --20579336, 1099512, -4881231, -23448910, -4928475, 22442278, 11849278, 5172215, 4286914, -10436234, -343061, -2428804, 1005022, -3464965, -2770254, -163209, -256087, 854162, -33286, -7298223, --1746978, 1873143, -1363652, 3456912, 5733782, 4765266, -52613, -845572, -2493766, 7578470, -4387309, 4975720, 4177930, 3035468, -565862, -2937758, -2609730, 5907191, -4598836, 3510599, -4999342, 1920924, 2466385, 374199, 1478006, -4044249, 366683, -1187559, -3440806, 1631014, -2306934, 4565550, 16954920, 22275848, -664109, 5987722, 13997298, 11592654, -1199370, -28173912, -19332184, -1810866, 5254893, -5661304, 9911174, -591632, -12235825, 3556770, 22236120, 3523484, --14595373, 12987444, 9197672, 6150930, -10970420, 11971148, 8785892, 1185411, 14148696, -5487358, -3799972, 22925998, 16614007, 833761, 5272073, 11353746, -21469468, -4157528, -1348083, -3177739, --18802830, 5016522, 5722507, 1285806, -14569066, -20401, -24960740, 1550483, -17824114, -3313567, -9241159, -7399155, -10769630, -8466454, 5352603, 4600447, -9926206, 4194036, -3548717, 12570296, --6358699, -6993281, 6484864, 11772505, -1047972, 5276904, 4517769, -27034672, -559956, -1746441, --13843753, 1713692, 17850958, 5691369, -4905390, -1914482, 13074417, 9396852, 5768141, -3383361, -20702816, 499827, -17004312, 2594160, 20728050, 10997801, 10588705, 6499896, 1256278, -4773856, --5698348, 4041027, 3495030, 5224828, 7887708, -1585917, 6266358, 4062502, 767725, -705448, --462246, 3091303, -2614025, -716186, -2584497, 301721, -1119913, 3394098, -6025302, 1449552, -2318209, 1059783, 4950487, -8005819, -3296924, 1830730, 1828046, -425739, 5081483, -1362042, --1382443, -1896228, 796716, 3571265, 3929358, -4221953, 946503, 2631741, -4025995, -2244657, --2097555, -1680943, 11267847, -25412784, 11030550, -26303990, -30310658, -20287814, 1703491, -17374754, -16908212, -5622112, -20253992, -1145683, -4853850, 2354716, 4245039, -5269925, -2272575, 13167833, --3675955, 4739497, -7036230, -7853885, 22064320, -7763691, -2105071, -1117765, 5322002, 12891344, --26838176, -2314987, 14957224, 13597330, 13573707, 1262720, -4555887, 27522150, 9873056, 8339216, -11309186, 4485020, -3575024, -297427, 16866336, 4836670, -11286637, 5668820, 30741228, -16541530, -21358336, 7189776, -31695248, 7252589, 21902186, -2848637, 10053982, -632434, -23936926, 11768747, -30623116, 1195612, 20941186, -12979391, 18567680, 14542759, -127238, -3244311, 17070348, 8331163, --21617108, 21448530, -5076115, -5542656, 13688061, -6985765, -7550016, -10335302, 3779034, 607738, -4010963, -1459215, -4103305, 15966541, -14405320, 2000381, -2711198, -5366025, -11715597, -11988327, -7076496, -1423782, -7095823, -10762651, -8243116, -15100031, -10008348, -1138166, -6833830, -4848481, --750009, -8110509, 3482682, -7212324, -6543920, -2431488, 1986959, 1834488, -3148748, -1017370, --10428717, 3679713, -10957535, 7992398, -2598992, -1316408, -4652524, -3291556, -278636, 12253005, -6714645, -1935957, 3329674, 8233453, 5071283, -5475547, -2049773, 2844342, -4154307, 6588480, -1864553, -3426847, 2698313, -10006737, -17003238, 41217192, 20802138, -48654464, -19670950, 4861366, --7747584, 13703093, 16727287, 17382806, 20470352, -12683038, 38538740, -6033356, 1239098, -12800613, -14693620, 18941342, -13575318, -16071768, -3049427, -9373229, 1975148, 7388418, 1458678, -10220948, --3482145, 15481746, -979789, 7685844, 2200097, 18685256, 28699508, 10503879, -13386876, -32298690, --2406256, -5714991, 3886409, -7690676, 10846403, 17468706, 1888712, -6860137, -14345191, 34725884, -30898532, -4344360, 15234786, -8615168, -10900627, -34005940, 18927920, -16019691, -3338800, -1293322, --10251550, 5622112, 21002390, 2881386, -8849780, 9543954, -3939022, -14208826, 21470542, 4012573, --29061360, 37322192, -25188372, -13939853, 14836965, 14637785, 12803298, -78920, -31059056, -2990908, -3047279, -2115272, -10007811, 5778879, -5092758, 1925219, 4187593, -13310641, 15331423, 10177999, -5334887, 1722282, -5874979, -4869419, -10201, 5006322, 757525, 3791919, -2165737, -10383620, -3342558, -15080704, -4393215, 4395362, -4076998, 7776575, -6558952, -1320166, -5529771, 6131066, -851477, 7610145, 9497246, 6018860, 555661, -7289633, 5350993, 8251706, -1408212, -1319092, --8892193, -4369056, 10944114, -3964255, 7484518, -948651, -3720516, 3452617, 3864397, -547608, --5759015, 10679973, -5542119, -13366475, 1504312, 19072340, 5675263, -25914758, -20758650, -4989679, -32416266, 3370476, -15547245, -41812580, -11614128, -1916092, 9936407, 28748364, 22050362, -3095598, -284542, 18905372, 15411416, 697932, 4233227, -56419764, -35550520, -17348446, -27857158, 2401424, --15535434, 24936044, -5705327, -1978906, -114354, -10073846, -11469710, 18061412, 11275900, 6377490, --2550674, -8635569, -7707319, 8984535, -20205674, -7597797, 3579855, -7032472, -9838696, 8404177, --29209536, -40903120, 9725953, 12746926, 15868294, -23896662, -12690018, 13191992, 5020817, -39875552, --34997540, 2100239, -16936666, -17548162, 6518687, -32220308, 16338056, -12480101, 13427142, 12856985, --7986492, -18171470, -41929620, -14725832, -12597676, 23509578, -20344186, -13294534, 7175280, 24033564, -14024142, 108448, -8191040, -2719788, 7197292, -7240241, 24312736, -15090904, -11811160, -5731097, --2115272, 6662031, -17913772, 10526965, 8084739, -7525320, -12544526, 2896956, -729071, 12192338, --15666967, -20451024, -5185100, 3216394, -11305428, -1717987, -13670881, 577136, 3333432, -6163278, -9536438, -2580202, -6759742, 2953864, -4569309, 2776160, -3892314, -14204531, -623844, 1041530, -13558138, 10634876, -6523519, 53687, -727997, -8008504, -10253161, 4986994, -2601677, -3724811, -3103114, 16624745, 22834730, -3651259, -30718142, 13916768, -4612795, -12814035, -26491896, 7903814, -11315628, -39276404, 14817637, 13955959, 35404488, 3199751, -8900246, 2187749, -43376484, -12600897, --5299990, 551903, 7895761, -14835354, 26524644, 10618770, 32790464, -6622303, 28829968, 18517752, -11355357, 26294864, 13257490, 17335562, 22290880, 933082, -29382408, -27690192, 5531381, 31586800, -22746146, -42223288, -1335735, -7208566, -6058052, -4498442, -29348048, 7403987, -20952998, 18644990, --14072997, 42170672, -11275900, -60719028, -6614787, -20990578, 11882027, 8899709, 17089138, 39237748, -8604430, -5457293, 21349208, -12835510, 43761960, 7278896, 29204704, 13702556, 2465311, -11276437, --10308995, 72018552, 198642, -49946712, -10253698, 39663488, -24038396, 5073430, -11231339, 17323750, -36287104, 20947092, -42446624, -2883534, -41799696, 5604933, -6017249, -24749212, -3201898, -6818261, --11198053, -237834, -21582748, -23523000, 7750269, 8637179, -1496259, -26312580, 18530100, -23338852, --36207112, -15461345, 8559333, -9084930, -16354699, -20769388, 3390877, 8495982, -19064822, -14460081, -6505265, -8469139, -15483894, 12094091, 9384504, -1104880, -2333778, 487479, -3904662, -6382322, --7037841, 2171643, -14389214, 7929047, -5467494, 2865280, -18192944, 19422378, 9040906, -41660644, --15025406, -47251620, 7572564, 40818296, -29967598, -28954522, 27698244, 12372727, -46229956, -44668196, -14611479, 1893544, 6923488, 14606110, -1412507, -13726179, -6322192, 27808302, -19804094, 34442416, -6113886, -8623221, 7885023, 19706384, 357019, -6489696, -36916856, -16843252, 4572530, -20467666, -17692580, 25334402, 2287070, 3812857, -26293252, 31405338, -10765872, -14702747, 26409218, -10444287, -476205, -19098108, -1472100, -13564044, -45504640, 15302968, -4725001, 33676300, 44203268, -1103807, --7399692, -28215788, -8357470, -8189429, 42079944, -40075268, -27549530, -66123168, 1950452, -27648852, -7948374, 22312356, -11874511, -3895535, 45197016, 28418188, 20832738, 3057480, 2452426, 33520072, --36456220, -2080375, 10870025, -4831302, 20738786, 9280351, 86831888, 13186623, -23216982, -1809255, --15786689, -43084964, -16494822, 1098975, 7624104, -8694624, -8449274, -8556112, -30056182, -876710, --2126546, -16656957, 4687957, 10354092, -25720412, 1211181, -17332340, 6434935, -839129, -6650220, --3144990, 1010391, 15741592, 8468065, 1052804, 16522739, -10102300, -2717641, -4618701, 15515032, -11083163, 7110319, 16836272, 7151658, -11406896, -6167573, -1574642, 7642895, -14447196, -4340602, -826781, -17224966, 18562312, -5073967, 2954401, 40034464, -29463476, 10241886, -10197326, -14207215, --14024142, 60440928, -8245264, 29679834, -24107114, 41226316, -14467060, 611496, 22020834, 23795192, -56642028, 2697776, 9082245, 8321499, -24367496, 29311004, 8851928, -17289928, 28347858, -12002823, -35755604, 27462020, -8793409, 23878944, 820876, 22282828, 4196183, 37831684, -23467702, 18833432, --38643432, -9677098, 12528420, 40991168, -2152852, 3228742, 17333952, -230318, -14224395, -49555868, --30961346, 8349417, -21636972, -1050656, 15206332, -43218108, 25942676, -2017024, 30919470, -15059229, --29786672, -5259188, 80583248, 18252000, -74228312, 12829067, 18278308, 4425964, 79734992, -5027259, --59636696, 61138860, -21225192, -4155381, 66600448, -7428146, 43605192, 6898255, -40498320, 1466731, -68055904, -56271052, 28806346, -34587372, -39347268, 28446642, 16645146, -35699232, -13634911, -22287122, --12612708, -13157095, 5728950, -21995602, -5151277, 8342437, -22958748, -16289737, 10843182, -26426934, --7087233, 8874476, 2869575, -6365679, 18816788, -8835821, -7406671, -9836549, -18511310, 8218420, --12237972, -13571560, -3942243, 1875827, 25272124, -310848, 6526203, -22009024, 1326608, 27231166, --6080063, -3763465, -3121904, 870268, 979789, 18826990, -11206107, -12412992, -6934225, -19026706, --22984518, 5276368, -11991549, -9779104, 12961138, 3848291, 8131984, -3820910, -58302032, -5498632, -10304700, -23152022, -5318780, -63218160, 40555764, 59536836, -25441238, 7604777, -44894756, -135379520, --24564528, 5269925, 69392712, 56319368, -54955180, -50978040, -49257368, -42382736, -28075128, 34586296, --4995584, 77374376, 54227184, -16764868, -63642824, -163069712, -103739032, 6325413, 181086016, 135910480, -26263188, -71600864, -175885888, -182378800, -12018392, 104603928, 164545568, 178100480, 19654844, -58943596, --72132904, -98258648, -86379848, 4852240, 61733176, 111725520, 78820704, 61002496, -79630304, -100080792, --115169552, -141153568, 16868484, 166899744, 166695200, 32629940, -58611272, -158563744, -205415408, -70887360, -17037598, 75745504, 189576640, 68350648, 631360, -105001752, -83983256, -36880348, 43899936, 72644000, -130430104, 32771138, 68586872, -6544457, -85787680, -72896336, 5005785, 82432768, 92081952, -42650100, --78362752, -98303752, -23482196, 14754823, 23898808, 13685913, -47706888, -43186968, -16593069, 29883308, -772557, -683437, 7695508, 23654532, 20822002, 14307610, -7809325, -60369524, -38610684, 3206730, -31199716, 55274080, 28061706, -17208860, -36811628, -50813760, -30370250, -21180094, -25311852, 55392732, -59875064, 63684700, 54601384, -26386132, -103004056, -89175336, -46748572, 38631620, 131573640, 125579472, -7672422, -81559280, -124838056, -114272440, -6840273, 61240864, 59483688, 27192512, 26386132, 29528, --33195266, -41850700, -50584516, -9192304, 48083232, 56997436, 41795400, 3748970, -38836704, -36971080, --16478179, 29433410, 21726628, -50476604, 53150, 26752278, -21569862, 29518774, -1673964, -4786204, --2572149, 6376953, 21554294, -8125542, 25490094, 18197776, 10101226, 12293270, 8449274, -1706713, --15333033, 24830816, -788127, 15366856, -9293235, 13746580, -4989679, -1336809, 8522289, -11455215, --13110388, 2426657, -5883032, 20226074, 19002010, -17238924, 8465917, -10035191, 11803644, 831613, -7612293, 3630858, 10008348, -12098386, 8391829, -14008036, -6725382, -1437203, -2035815, 12376485, --22644678, -3803194, -9566503, -19219978, -2127620, -7189239, 4371740, 19479288, -6033892, -25567940, -3853123, 16851842, 31343060, -777389, 2445447, -16469052, -13325136, 15377057, 1002338, -4974109, -111132, 26499948, 11122892, 8795019, 13647795, 24476482, -27343910, 11422466, -4932770, -39674224, --5012764, 31838056, -6094022, 28401544, -1547799, 17888002, -20703890, 13269838, -14176076, -3462818, -27037356, -7192460, 2229625, 1242319, -405874, 10664941, -324807, -3416110, -2604361, -74088, --2208687, 5688148, 7566659, 12141336, 1027034, -9107478, -4684736, -11973832, 4501663, -12435541, -6833830, 6106907, -4317516, 8060580, 2086280, -12907987, -37581, 697395, 4089883, -22665616, -7916162, 5912023, 1790465, 91805, -6710350, 8387535, -12076374, 12667469, -1179505, -695785, -2963528, -4962298, 9835475, -10552198, 2920578, -5477694, 6081137, -19013284, 47965120, 81512576, -7423314, -53997404, 18413598, -4435091, 66858684, 30808338, 65733400, -6538551, -30572114, -8833137, -14940044, 27050778, 21933324, -12487617, 2577517, 11267847, 8936216, 25543782, -17642652, 3993246, --23955180, -4334696, 843424, 5908265, 13242458, 2425046, -9917079, 19487340, -1316408, -17914846, -24466282, -4457639, -8039105, 5997922, -3028489, 18283676, 30275762, 376347, 8311836, -10353556, --5693516, 16856672, 13014288, 13903346, 3386582, -9373766, -18132278, -19531364, -20288888, 16362752, -18923626, 17654464, 27404576, 28407450, 13015362, 1199370, -24495810, 15067819, -2088965, -23088670, -28744068, -2372970, 19117974, 9395778, -27579596, 7504382, -7751879, 5735392, 19703700, 3275986, --22933514, -17028472, -13259101, -24988656, 15696495, -1793686, 26620208, -539555, 4895726, 250719, --13364864, -9296994, 5596343, -21458730, 7079717, -475668, -3439195, 7389491, -11097122, 6922414, -5346161, -1197222, -9279277, 12840878, -2605972, 11367168, -18888192, -14666240, -7808788, -7823283, -9973988, -4125853, -1699196, -2716567, -9074729, -5544803, -5288179, -194884, 18903224, 2217814, --3863860, -496069, -9805947, 7501161, -5111011, -1227287, -3250753, 8437463, 36507, 959925, --1038845, -6425808, -3441880, 9241159, -2515777, 6572911, -1159104, 3429532, -5109938, -28552942, --65011308, 4744328, 89210768, 118767656, 101303248, 70457328, -3311420, 4706748, -52125332, -61282740, --103879688, -77898360, -83468928, -26594438, 6691022, 27429272, 45172320, 113286208, 93643168, 63633700, -20170778, -9615358, -41155988, -30057792, -42777876, -53644680, -30360050, -30530776, -38336880, -17348446, --25334402, 5649493, 17346836, 15196668, 47790636, 44765908, 39090644, 26130044, 29532196, 19139448, -35432408, 8970039, 30615064, 1728188, -8398272, -53625352, -23795192, -64705828, -75954888, -84239344, --66636956, -49464600, -17974438, 13127031, 48308180, 52161840, 40531608, 84412216, 67822904, 73169064, -67132488, 63282584, 24959128, 41055592, -16630650, -40123048, -42747808, -99572912, -100165080, -96122440, --102972912, -84306448, -29242822, -13888314, 22510460, 57677652, 62144956, 76663016, 91600912, 82349552, -63603096, 58426588, 42465416, 16350940, -1871532, -34019364, -50906636, -50676856, -58525908, -48484812, --55070072, -56734908, -48487496, -37178848, -19087372, 2595771, 24607478, 48290464, 44605920, 44634912, -51929376, 58048092, 44393856, 45098768, 19713364, -20613158, -15583752, -36516348, -47173236, -38810400, --32452772, -22283900, -28722594, -20259898, 2254321, 6353331, 9755481, 25691420, 22063246, 14522358, -3287798, 9918690, 9507447, 3262028, 12091407, -7295539, -8662949, -6455336, 4447439, -1017370, -48855, -303332, -1787243, -8840653, -6584722, -2343979, 8702141, 304943, 3943317, 1676648, --4942434, -5567888, -3158949, -3806415, 1180579, 121333, 1454383, 1299228, 2029909, -1902134, -2105608, -1127966, 479426, 1888712, 5562520, 2669322, 6485938, 1168231, -132070, -1556389, --1404454, -4114579, -375810, -2189360, -1153199, -3153580, -266825, -1472100, 671089, -2884071, --455803, -5906, 2117419, -1343788, -422517, -2056753, 1153736, 119185, 2778307, 2760053, -3805878, 1225139, 2491081, -123480, 122943, -1189706, 1217623, -846109, 855235, -763967, -435402, -2466922, -1672353, -4452808, -2128693, -2601677, -443455, -1707786, 783832, -439697, -1525250, 427349, 3149822, 1668595, 3381750, 1658931, 3090766, 1318555, 2245731, -209380, -202937, -2684355, -1382980, -3191161, -1843615, -3696893, -1268626, -2251100, 301721, -311385, -1885491, 256624, 2110440, 423054, 1921461, 91805, 1635309, -373662, 1122060, -771484, -727997, -1044751, 649614, -1047972, 668404, -1016297, 721555, -921271, 821949, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -{ -{ -10429791, -5484137, -584652, 3586835, 943819, 788127, -11341935, -4990752, -5599564, 4393752, -573915, --3737159, 4066260, 4121021, 308701, 3954591, -1634235, -178241, -200253, -2508261, -1250372, --5510980, 2859375, -8127689, 3409667, -4260608, 3475166, 6384469, 2966749, -1268626, -1785633, -4705674, -734439, 175020, 4526896, -4861903, -109522, -1675574, -2743410, 543313, -644782, -949188, 4638028, 7546795, -2384244, 89121, 6336151, 431107, 1687385, -2371359, -3506841, --568546, 1087701, -6007586, -1537598, 3063922, 431107, 1074279, 1875290, -906238, -1836635, --1813013, -2063732, 2253247, 1912871, -1151051, -3389803, -4250407, 2098092, -15569, -3461207, -3623342, -780073, -297963, 583042, 983548, -1716376, 2144799, -2319819, -846645, 2897492, --2042794, 1167157, -3419868, -2552284, -1295470, -813359, -272730, 474057, -1414655, -1679869, --229244, -949188, 320512, -341450, -367757, -446140, 298500, 116501, -417149, -678068, --479963, -243203, -126702, -360777, -303869, -516470, 423054, -763967, -545461, 627602, --3748433, -1012539, 16106, -3524021, -3592740, -2132988, 8575976, -6018323, -2493229, -4197794, --7683697, 2879776, 1302986, 313533, 6572911, 6249715, 6236293, 2033130, -1180579, 981937, -4698694, -1999307, 2020245, 2394981, -5567888, 7927973, 1524177, 2476586, 5840619, -2234994, --5848672, 409633, 3955128, -2779381, -1277753, -3710852, 3937411, -85899, -411780, -6460705, --289910, -771484, 3978750, 2052994, -3560528, 7101192, 2606508, 1490354, 2473901, -1139777, -3964792, -1531693, 188979, -4928475, -5914170, 4751845, 3701725, 6576669, 634045, 1786170, --5086852, -7847442, -3866544, -2343442, -2296734, -3616899, -3134789, 1637993, -915365, 2402497, --2956548, -1114544, 1292785, 1484448, -891206, 4019553, 1212791, -2988760, 6039798, -2353105, -1856500, 7640747, 1624571, 1062468, -2364916, 122943, -2596308, -3084860, -500364, 1771674, --34897, 242666, 95563, -824097, -267899, 93416, -760209, 1804960, 1148367, -651761, --162135, 68719, 472983, 270583, -1183800, -624381, -281320, 149250, 535260, -535797, --848793, 752156, -432718, 580894, -298500, -456340, -585726, -7383586, -6905234, 4051765, -908386, 5669357, -8756365, -1221918, -3488587, 951335, 10400263, 5954436, -9117142, 3456912, -852551, -3785477, -4235912, -5152887, -8396124, 309775, 993748, -3098819, 1478006, -1781875, -309238, 2538326, 1942399, 5414343, -4740034, 8519068, -5200669, 4950487, 3908957, -3179887, -2282775, 419833, 3525095, -1408749, 1836635, 3251827, 1072131, 511101, -1312113, 2535105, -747324, -1124208, 6043019, -7909719, 533113, -4789426, 9520332, 3371013, -8332774, 3239479, -10886131, -10238665, -4896800, 1238561, -854162, -3880503, 3235721, -1357210, 7243463, -6101001, --622233, -2015950, -437550, -367220, 6997576, -6504191, -2178085, -703301, -6739341, 3626026, -2784213, 7252053, 2931852, 6174553, 5543192, 916976, -2267743, 1749125, -219043, -773631, --1697049, -158914, -2587718, -1025423, -604517, -3588982, 2254321, 188979, -2530273, -426276, --2057289, 185757, -116501, 1377074, -513249, -815507, 140123, -1159104, -71941, 1185948, -405874, -268435, -843961, 3273839, -5071820, 622770, -3181497, 3349538, 1219771, -5153961, -14828911, -9452686, 2974265, 16015933, -11334956, 5248450, -301721, 5213017, -1399623, -9735080, --2131915, 7970923, 7167764, 1946157, -80531, 4013647, 1974074, 103079, 3340411, 3326989, --2803003, 4249334, -1211718, 6723235, -5476620, -8471286, 1775432, -7403450, 2514167, 83752, --2127620, -2408940, -3383897, -5060545, 942745, 1704565, 148176, 1211181, 1424855, -3148211, --6489159, 5011153, 1101659, 766115, -353261, 7391102, 1462436, 3053185, 7842074, -4914517, -1867774, 241055, 2334315, 5442798, 4279935, -7271380, -6349573, -1705102, -3649649, -910533, -206695, -3181497, 1593433, -5838471, 228170, -5622649, 2681133, 2619930, -3261491, -4301947, -410169, 2216740, 368830, -4961761, 624918, -2884071, 2029372, 1633698, 714575, -1014686, --1431835, 863825, -209917, -629750, -102005, -1362578, -1127429, -3449933, -901406, 2931852, -1255741, -987843, -682900, 2008434, -811749, 520228, -1024887, -82678, -321586, -9127, --1297617, -928787, -551903, -472983, -529892, -633508, 5369, -464393, -862752, -761283, -301185, 1420024, 461709, 4479651, -1802813, 4037806, -601832, 1913408, -2237678, 91805, --1402307, 1207960, -573378, -9445170, 7217693, 4306779, 11777337, -7800198, 4937602, -9603547, --1421634, 5535139, 6401112, -6801081, 2081985, -7847442, 759136, -9166534, 3129421, -6918119, --8140574, -7659538, 3935801, -6228240, 452582, -7269769, 1110249, 833224, -874026, -5377836, -3438658, 4334696, 2895345, 1908039, -5337571, 2800856, -5607080, -2041183, 3747896, -92879, --614180, -1770600, -34360, 3469260, -4087198, -8456254, -1553704, 2327336, -1553168, -6325413, --5993627, -8980240, 2285460, -2741800, -8020852, 5656472, -5073430, -5374078, 10109279, -3800509, --1770063, 596464, -1609539, -3452080, 988916, -5660767, -2509872, -4797479, -3424163, -1721208, -3142842, 7291781, 568546, 4294431, 564251, 3148211, 2527588, 5846524, -257161, -359167, -810138, 2019708, -1050120, 35433, -409633, 4211753, 10201, 1917166, 503585, 627602, --576063, 763430, -2540473, 2745021, 251792, -171799, -2043868, -796716, -2825015, 1194538, --1355599, 788127, -224949, 2765959, -1282048, 357556, -2434173, -2334852, -16106, -1151051, -907849, 1675037, 561030, 723702, -1136019, 242129, 7623567, -10997264, 1950989, 9698573, --3616899, 10619307, 2913599, 712965, -3098282, -7337415, -4887673, 12639552, -6790344, -6979, --2362769, 1037235, 7554848, 6863358, -4147328, 9891847, 9801115, -4569845, -2439005, 6042482, --5069135, -4360466, -330712, -6729677, -164819, -1938641, 867047, 11868605, 4020626, 707596, --5414343, -15622944, -1916092, 8894340, 2163590, -5805722, 4512937, 7247758, 6265284, 7655243, --12398497, 2590402, 609885, -6070400, 3345780, -5452461, 3956739, -3036542, 4907000, 11093364, -14556181, 9271761, 4234301, -5936182, -1645509, -7101729, -7547868, -1493038, 8549669, 2200097, -159988, 2112050, -8317741, 2275796, 1068373, 33823, -4191351, 2372433, 4602058, -4714264, --9063455, 20842940, 2717104, -3593277, 1320166, 2352568, 9487583, -1777580, 2644626, 3345780, -4736275, -3132105, -1548336, -3389266, 1726577, -840740, 1900523, 1856500, -1164473, -1787780, -3576634, 610959, 993211, -525060, 2190970, -3498251, -2531346, -1604170, -574989, 4205310, -1567126, 2865817, 2144799, 2283849, 231391, 634581, -818191, -2388539, 2585570, 772557, -1146219, -1607392, -521302, 49392, 1170379, 3338800, 915902, -5555004, -1760400, -3350611, --1491427, 2804077, -3757023, 16493748, -1769527, 4750771, 11575474, 1678259, -1907502, -7537668, -4155381, -4008815, -5342940, -15381352, -7096360, 3252364, -982474, -2874407, -11359652, 4038343, -6018323, -8696235, -4766340, -2248416, -9388799, 3796751, 498753, -4767951, -4169876, -1568737, --12634720, -4335233, 6025302, 10479720, -8015483, -9711995, -3011309, -470836, -8137353, -6453725, -2335925, 4468377, -8901857, 17599702, -76236, 7212324, -4145180, 6780143, -4692252, 2105071, --12586939, -2529199, 4908074, -12340515, 3248069, -2725694, -6492917, -14030048, -475131, 7907572, --47245, -14809047, -2410014, 2778307, 5825587, 10986526, -4180077, 4951561, 12589086, 4320200, -1396938, -5741298, -1262720, -3562675, 595390, -4260608, 826781, -8098698, -1242319, 6292664, -1621350, 1258962, -3710852, -6277095, 3345780, -1128503, 3456375, -1308891, 308701, -787590, --1992328, -1650878, 2183991, 942208, -639950, -810675, -93952, -2435783, 977642, -2491618, --3308199, -1960116, 929860, 158914, -164283, -2362232, 1680406, -294742, -1404454, -3349001, --1236414, 204548, 256624, 1349157, 3371013, 1115081, 636192, 1773822, -699543, -257698, --1118302, 2757906, 4655745, -1405528, -5005785, 6060736, 898185, -8923331, -14388677, -11488501, --14887430, 12830678, -7856032, -1763621, 4023311, -13815836, -5934571, -9574556, -4467840, -2978023, -6163815, -12094628, -6667400, 4009889, 4690105, 7162932, -258772, 350040, -2330557, 88584, --3021510, 1859184, -9839233, -5102958, -8672076, 6020471, 2782602, 4686346, 5783174, -11674795, --1004486, -1167694, 10559714, -3926674, 3216394, 5936719, -2355253, 6348499, -4254165, 7065758, -9614821, -3725347, -837519, 8484171, -7336341, 11694122, -5134097, -18355616, 2700461, 9647570, --3819300, 1191853, -489626, 7421167, 9016747, -9233643, -4238059, 2267206, 6152004, -10878615, --8504035, -6571837, 13108777, -229244, -15422154, -3221762, -6524592, 5293547, 500364, 4017405, --5910412, 9503689, 210453, 1770600, 2525441, -8631811, -3158949, 730144, -1285806, -2115272, --2730526, 2518462, -2611877, -2275796, 1644436, 2856690, 1225676, -5043902, -664109, -1966021, --1700270, 2196876, 1680406, 4372814, -799401, -2042794, 1436667, -4737886, -779537, 31675, --3351148, 498216, 81604, -1122597, 381178, -5401458, -1213865, -590558, 396211, 763967, -2072859, -227096, 2353642, 1527935, 1102733, 236223, -556198, -8592619, -3428458, 5845988, -2214593, 8391829, 2928094, 4091493, -16499654, -6508486, 6497749, -4382478, -3075734, -5534066, -1741072, 8596914, 2309619, 2034741, -11031623, -3765613, -1970853, 4093104, 9785546, -11833172, -5627481, -9646497, -2505040, -8873402, 1196148, 1220308, -391379, 3696893, -8213588, -2388002, --7691750, -3191161, 205085, -358093, -9672266, 5585068, 6320581, -2325188, 7489349, 14597520, -1567663, 11061151, 14250165, 1125818, 533650, 3432216, -2904472, 4713727, 1039382, -3086471, --4698694, 17826262, -1771137, 10427644, 4684736, -5226975, -6009733, -4217121, 5062156, -4039954, -6554657, 15715285, 8039105, -2051384, 343061, -13118978, -8972187, -7987566, 12438762, 19418084, --8412230, -33823, -7774965, -1255204, 11947525, -3702799, -622233, -18646064, -2401424, -3356517, --1882269, 7146826, 605054, 1528472, 2265059, -3695283, 3081102, 1644436, 2758443, -2178622, -3951907, -1786706, -317828, -4670240, -1010391, 4189741, -1408749, -52613, -695248, 4030827, --892816, -2793339, 1788854, 1836635, 1123134, 1465658, 1575716, -1470489, 518617, 2881386, -4956393, 4281546, 2837363, 1563905, 420370, 464393, -2896419, -173409, 2034741, -1750199, -2137820, -575526, 826244, 2738579, -1008244, 4908074, -399969, 11367168, 30846456, 13701483, --4393215, -897111, -5939940, 14479408, -14499810, -7958575, -22075058, -69793, 10625749, 13618268, -2246805, -5150203, -13301514, -9423158, 9504226, -1780801, 15197205, 140660, -5105643, 7438347, -2473364, 54224, -3990025, 10218801, -2032593, 8853538, -305480, -4536559, 18740552, -4333622, -7502771, 18774912, 6369974, -595390, -9248675, -1522029, -14960445, -17144972, 3610994, 11293080, --2827162, 1747515, -19083614, -7002944, 10799695, 6131066, -5064840, 3815542, -5773510, -2530810, --8788577, -14309220, 716723, -3229816, -10399190, -16543677, -14593225, -4507032, -13416941, 6295349, --6093485, 2297271, 1560684, 92342, 164283, -1953136, -3125126, 8781061, 16913044, -11309723, -1932735, -4639639, 6019934, -6226092, -403727, -4440996, -2244657, 15899432, 11263552, 2770254, --1914482, 357556, -6568079, 2419677, 6250788, -1016834, -5698348, -2972117, 5395016, -6506876, -471373, 3063922, 2543695, -2155537, -2281702, 2604361, 2878702, -2105071, 3455838, 2284923, -2843805, -111132, 3800509, -210990, 2354716, 1433982, 1330903, 1115081, -1001801, 4839892, --4683125, -463856, 861141, -1155346, -1286880, -1929514, 1932198, 397821, -4051765, -1260573, -2435783, -2605435, -12668006, -14573361, 3869766, 5441187, 17471390, -14773077, 4806606, 4401268, --24303072, -1231045, 304406, -20509542, -10986526, -7313256, 5346698, -1723356, 1375463, -5849746, -8745627, 13442174, 7277822, -2007897, -20576114, -9109626, -11115375, 4127464, 1427540, -9171366, --547071, 7062537, -5873368, 12259984, -10954314, -404801, -6315750, -20791936, 3701725, -8891656, --9777493, 7644505, 11613592, -12910135, 5140002, 15084462, -4776541, 6572374, 5371394, -3619584, -2239289, -16888348, 25640954, 9960029, 6208375, 24256364, -29501056, -2288144, -3927211, 3086471, -12293807, 12520367, 5015985, 5939940, 15736760, -1544578, -10384157, -18420040, 7296076, -7004018, -874026, 4907000, -3482682, 7445326, 20116554, -12355010, 9477919, -6020471, -5517423, 15008226, -1334124, 4640176, 14807973, 12002286, -5113696, -6169184, -12667469, -3306051, 260382, 6646999, -7231651, -41339, 1869385, 954020, -53150, 1346472, 1824287, 486942, 4179540, -2040110, -806380, 2803003, 1799054, 779537, -1568200, 3792456, 2723009, 532576, -1970853, -3127810, --7065758, 4302484, -66572, -710817, 2434710, -3547106, -189515, 2386928, 3579318, 4990752, -3073586, 1341640, 1631014, -96100, 1772748, 3711389, 15887621, 18747532, 4647692, 11571179, --7553774, 5458367, 5258651, -30715996, 8653822, 9973451, 2057826, -9781251, -271657, -18961206, -22273164, 13451838, -7062537, -7506529, -11145977, -5795522, 16099148, -16349867, -9417253, -2456185, --2782065, -3531000, 2298881, -10834592, -11099806, -6518687, -8563091, -2314451, -11123428, -1541356, --7483981, -24311662, -15561203, -6015102, -3913789, 3378529, 4003447, -151934, 657667, 7021735, -3330747, 3586298, 17046726, 3554622, 5723581, 10650982, 22913650, 19616190, 980326, -7790534, --15127949, 13700409, -3431142, 37055904, 7429757, 16598438, -1870995, 2090039, -14790257, -613643, -12808129, 7407745, 9694815, -11165841, -7420093, -14341970, -27216134, 15646566, -24026584, -2960843, -31547072, 2073932, 12607340, 5999533, 9257265, 245887, -17124572, 16552804, -344134, -15029164, --13472239, 450435, 5162014, 11116449, 2932926, -13188771, 629213, -2657511, 2604361, -5225902, --4372277, 2273648, 2054605, -4128537, 335544, -1373316, -438624, -5425618, -2030983, -1774895, -2429341, -1495186, -3347927, 4234301, -2714956, -1126355, -7663296, -8126078, -44023, 115427, --3387656, -2188823, 2572686, 1895154, -3440806, -5471789, -397284, -5686537, 3292093, -21721260, -6244346, 8502962, -14958297, -11145977, -9127, 9306120, 21220360, -862752, -16783658, -16463147, --1117765, -9214315, 2560874, 3277060, -18712098, -15701327, -30420180, -8681740, -8995272, -20312510, --14165876, 97174, -9798968, -5769752, -5653788, -1446867, -20553030, -10664941, -12731357, -5949604, -6010807, -17041894, 1039919, 14615774, 16866336, -3782256, 4428648, 10029822, -17193828, 9809168, --7592966, 15298137, -7550016, 1611150, -8117488, -1474248, 29644938, -5908802, 10994579, -21618182, --3881040, 224949, -21004538, 19602230, 471910, -6849936, 13625784, -5448703, 3302830, 27704150, --11167452, -14787572, 10077067, -2619930, -31124018, 12787191, -41171556, -21701396, 16128676, 13059385, -2349347, 8922795, -231391, 34897, -31130996, -16329466, -7547868, 3077881, -17817134, 4574140, -2150168, 7493644, -11734388, 943819, 8563628, 6985228, 4802311, 850940, 3901978, -9783399, --6716255, -6517613, -2183991, -1132798, -1180579, 8367133, -4451734, 4516695, 7802882, -3720516, -2209761, -6173479, -5194226, -40802, 1792612, -5519570, 2243584, -6984691, 6065031, -2288681, --1569811, 541166, 5412733, -1532767, 1988033, -4825933, 4276714, 3728569, 10249939, 2750927, -8368207, -8276939, -3154117, -9897215, -3158949, -5264556, -5113696, 41482404, 22677964, 60666, --21366926, 10994579, -22279070, -18077518, 3271691, 18443126, 36382132, -5699422, 18385682, -6551973, -13047037, 22093848, 12323872, 14132053, 7548405, -4103305, -18072148, -18656264, -5668283, -17629230, --5207648, -3214246, -3986804, 14146012, -2416456, -36244692, 2118493, 8778913, 8370355, 21726092, --2248416, -43259448, 24609088, -19343996, 6330782, -4211216, 14558865, 21238614, -23608898, -1626182, --11798812, -20553030, 14894410, -10208600, -25348896, 9974525, 14800994, 24392194, 6450504, -3771518, -2663954, 19975892, -16051903, 31518080, -9898826, -8747238, -2831994, 19217832, -19959250, 1867774, -2440615, -55533392, -8235063, 17231408, -7994008, 2915746, 7722351, 4066797, -2719251, 4555887, -19065360, 22797150, -18014704, 6537477, -13193066, -2215130, 22539988, -442382, -2333241, 871878, --1510218, -11639361, 3230889, 823023, -6804302, -17255568, 248034, -4089883, 5304822, -7944616, --7450695, -9352291, 7984344, 1887101, 4903779, 3973919, 353261, 2947958, -3809099, -7871065, -12140262, -1163399, -5845988, -129923, -4205310, -2594160, -4858145, 681289, 1524713, -650151, -3391414, 8891656, -297427, -2080912, -3568044, 872952, -4444218, -2470680, 5090610, -3787624, --3171833, -4649839, -11631308, -6454799, 1672890, 7646116, -6053757, -1717450, 23853712, 15663746, --44080860, -25212532, 30347702, 34966404, -18757196, -6487548, -49618148, -27577448, 7249368, -2357937, -6698539, -26526792, -16470663, -18214420, 26911728, 39755292, -1854889, 10653666, -6407018, -3600793, --425202, 9044664, 17354352, 4092567, -6072547, -3418257, -3978214, -23925116, -13428752, -24323474, --3144990, 7368017, -10104984, 14820858, -10990284, -4261145, 23250806, -11355357, 13096966, 8933532, --4183298, -22448720, -16097001, -13433584, 4087735, 41620916, 7411503, 22321482, 26517128, 20581484, -15390478, 13594645, -22971096, 423054, -3711389, 30770220, 14740328, 17941152, 32318018, -15972983, --21647172, 7831873, 27341762, -46374372, -779537, 3550864, 21561810, -37531572, -56298432, -10163503, -15846819, 3804267, 6442988, 17528298, 1184337, -12639015, -18442590, 472983, 2596845, 3515968, -17118130, 25147034, 12020540, 1730872, 147103, -423591, 2144799, 2393908, -6325413, 9178882, -1225676, -8687108, -14958297, 1704565, -6338835, 3066070, 1705102, -1516124, 1021129, -6386617, -6539088, -3506841, 4414690, -6859600, -4254165, -12106976, -11698417, 383863, 6278706, -5459977, -12494060, 151398, 3781719, -3928285, 13354127, 919660, 6172405, -6758131, -3491272, -2290828, --2301029, -8439611, -1422171, 8752070, -15288473, 11725798, -427349, -11541651, -19924890, 7368554, --9633075, -19796042, 14252849, 26984206, 8452496, -10507637, 16241419, 27141508, 10201621, 5527086, -2035815, -3119220, 12928925, -22842784, 1450088, -32816772, 17590576, -26501022, -2130841, 14142254, -7942469, -15149423, 3266860, -17518098, 35849556, 4562329, 11680700, 18578418, 39534636, -16361678, -12887049, -18951006, 6890738, 14127221, 31789200, 7422777, -6386080, 32448478, 4452808, -2345589, --18653042, 1176284, 20432770, -6961068, 19639274, -24173686, 37205692, 38470560, -46277200, -1274532, --2879776, 10053982, -7852811, -6146098, 19965156, -16887274, -49384608, 517544, 43971340, -34746824, -17435956, -8096550, -4373351, -21204254, 48527760, -3224984, 8046085, 4364761, -32613298, 42152420, -3314641, 37473588, -74335144, 6977175, -6987375, -22530324, -6021008, 12941810, -17315698, 11514270, --15611132, -10516764, -20548198, 25786984, -9974525, 1633161, -21919366, 803696, -16113644, -5638755, -7443179, -11253888, 5146445, 528281, -14889041, 13247290, -6134287, 1746441, -6403796, 11997454, --9217537, 1726577, 783295, -3584150, 16059420, -9516037, -11373073, -6743099, -12743168, -17840220, --8945343, 1491427, 1003949, -12914967, -7311645, -8752606, -12396886, -9950902, 4131759, 2630668, --509491, -5440650, 31035434, 4013110, -24242406, 2714419, -49017924, -10862509, 2187212, -9186935, --39129836, -4051228, -25780004, -6087043, 23127326, 5675263, 30405148, 12975096, 11307575, 7434052, --10738492, 24843164, -12757663, -15569, 11355357, 5580773, -15348066, 12444131, 4735202, 29352344, -11724187, -5018133, 17350594, -13795435, 23521388, 8368744, -26383448, -26696980, 13654775, 17667884, -7016366, 3032247, -12938052, -17025250, 5019206, -16751983, -25820806, -7677254, -4559645, -23342610, --8980777, 8964670, -16325171, -26351772, 7249905, 9989557, 699543, -3096135, -1772211, -4354023, -9297530, 45299020, 8985072, -1330366, -1933809, -15814070, -25979720, -11293617, 36958192, 40064528, -20255066, 3926674, 36040680, 17561584, -8402030, -50293532, -38647728, -31525596, -60428580, -34974456, -8332774, 49060336, -21872658, 16675211, -24430848, 8048232, -2165737, 16931834, -8034273, -2724620, --21808234, -12306692, -5435818, -19184546, 24483462, -3733937, -12989055, -5988258, 2405182, -13852343, -9880572, 7482370, 15820512, 3772055, 4395899, -15566035, -18403934, -2018098, -13612362, -8422968, --15844671, -22606024, 1122060, -5831492, 1358283, 1742683, 17347910, 17498234, -6528351, -3355980, --7745437, 16908750, 11103564, 7414188, 2589329, -3317325, 9593346, -13188771, -5311264, -2057289, --15226733, -29378650, 15488189, -433792, -9466645, -9113384, -5435818, -4094178, 11003706, 21037824, --9100499, 27067958, -30996778, 25014964, -3333432, 33350958, -21721798, 19294066, -31953482, 27738510, --25861608, -10781442, 38331508, 8935679, 30749282, 44257492, 4351876, -3528853, -18639622, -1444720, -27875412, 7098507, -10144176, -31065498, 2460480, 6164889, 14492830, 8997420, 12029667, 7650948, --18342732, -28918014, -12481175, 28027882, 10529649, 89391152, -28600188, -23873038, 28938952, 45893872, -9418863, -776852, 11861089, 3043521, 14522895, -13482976, 5109401, 21457120, 23491324, 15828565, -69159176, -8803072, -9168681, -4504884, 35582192, 21401822, -18354006, 18754512, -601295, 6120866, --15148350, 31771484, -31893354, 2214056, 48780092, -36066452, 104969000, -48281876, 50132468, 46167676, --45522360, -41430328, 46604692, 2018635, -27187142, -11419781, 25668336, -71017824, 10963441, -8351027, --45880452, 29927332, -35953172, 2842195, 2537789, -14421963, -35481800, 9599789, -2854006, -1580548, -6700149, -7295002, -11773579, 6346351, 14733885, -5623186, 2159295, 11536282, -10908143, 16052440, -12273406, -25566330, 3573950, -14359149, 6423661, -1012002, 1982664, -13081397, 5338645, 3427384, --171262, -6560563, 19665582, 4465156, -826244, 18877456, -13451838, -12186970, 1913945, 8150774, -1932198, 9081708, 4581657, -26317948, -13750875, 6788733, -15577310, 22651658, -10292889, -12859132, --617402, -8904541, 17933636, 22846004, -53821844, -23084912, 33314450, -69844224, -42980276, -29282014, -48949204, 103781976, 28929826, -81630688, -18192408, -83393232, -43268576, 67782104, 40773200, 63720136, -35303020, -48390324, -76418744, -58506044, -13807783, 34470872, 39504036, 23543936, 13463649, -20357608, --83552680, -100847440, -21598316, 77022720, 137754096, 93148176, -17364016, -64644628, -92390656, -68816112, --55351392, -73014, 22413286, 74995496, 80412528, -43557412, -26968100, -100986496, -93543848, -33860448, -9463960, 97219272, 143976432, 63656248, -42221676, -150803824, -111461920, -82071456, 39791260, 85651848, -53759032, 33743412, 29028610, -90038080, -16301012, -51408076, 19268834, -7254737, 53455700, 83532816, -66653596, -78270408, -157379952, -118611424, 13363254, 91975648, -2058900, 127596496, 5535139, -33045478, --38216084, -28374164, 584116, 92143688, 79881560, 14474040, -31492310, -11494943, -5621039, 48283484, -53680112, 6255620, 2550137, -8498667, -1190243, -10434086, -12810277, -8768713, -4514548, 18378166, -29136522, 23500988, -34645892, -39706972, -15007689, -16558710, -15432891, 35864052, 29676614, 37722160, -11368242, -16427713, -28223304, -55225764, -34846144, 22928146, 48846664, 73462192, 50680076, 4028143, --113313584, -100014216, -33769716, 40834940, 64117420, 85204096, 64638720, -5220533, -64335388, -95354176, --91603064, -16945794, 100217696, 103283760, 52864068, -25128244, -68827384, -48386564, -32146220, 2691334, -20949240, 27271968, 24539296, 14758044, 1286880, -15699716, -19223200, -20015084, -15890842, -18526878, -36842768, 11479911, -29845190, -28161026, 86973, -45373108, -5610838, 6722161, 5189931, -3945464, -1133335, -15258945, -1903207, -1793149, 7828652, -5265093, 20913806, -5552856, -4026532, -5840619, --6567542, 13037373, 3730716, -6289980, 20255602, 1281511, -36009004, -17981418, 9919227, 17621714, --5997385, 2146947, 24676734, -608812, 3368865, -20185810, -9015136, 6214281, -4386772, -4486630, --2678449, 16324634, 5912560, -6393596, -19314468, -7693897, -1131187, -17617956, 1688459, -20121922, --13463112, -9365713, -17878338, 28032178, -5048197, -12687870, 11862700, -197032, -27551678, -1614908, -27531278, 22321482, -12785044, 17282412, 2914135, 16488379, -18399104, -27151172, 10419054, 11964168, -10557030, 9130027, -10238665, 10078141, -20236812, 13707925, -27609124, -24322936, 17980344, -14235132, -12277164, 16813724, 1243930, -13016972, 4205847, 4747013, -1074279, -1076426, -420370, 10948409, --9172976, 7105487, -9586367, 12833899, -11221139, -6147709, 4759361, -3906810, -377420, 5061082, -1258425, 3375308, 9937481, -7920994, -4655208, 5654325, 3450469, 11294690, -9146133, 3121904, --1063541, -7101192, -7062537, 2881923, 1870995, -7027640, -10358924, 2974265, 194347, -1983201, -6706592, -9990094, 11587822, 3415036, -9897215, -11140608, 9350144, -15643345, 10761041, -1795833, -7481296, -843961, 2627983, 13962939, -22236656, 44463648, 67676872, -8779450, -25109990, -21449604, -62396212, 28306518, 60387240, 32675038, 45634, -27979028, -6304475, 15506979, 28346784, 13669807, --13183939, -3150359, 13529147, 20078972, 2442763, 4577899, -14013941, 2643552, -6781217, 9203578, -10187662, 26538602, 22749904, -12006044, 1951526, -13487271, 3513820, 12163347, 18000208, 1431298, --8600672, 64961, -15520401, 13031468, -3595425, 5433671, 12055973, 349503, 16066936, -7824894, --4432406, -3670050, -16567299, -9819906, -25258166, -4681515, -28798292, 2064269, -9917079, 23782308, -3506304, 7071664, -22268332, 9501005, 148176, -9807558, 16305843, -8708046, -4591320, 4147328, -10781442, -1205812, -5921150, 36781028, 11931956, 8577587, 13774497, -9839233, -491774, -3218541, -19178640, 26750130, 25608742, -15184320, -16706886, -2183454, -6644315, 6796786, 17262010, 18029198, -794569, 10148471, -1202054, -2644089, 5872831, 11533598, -1087701, 9084393, -7521025, 1724966, -135828, 3234110, -2579665, 10162429, 5850819, -964220, -2811593, 3146601, 1784022, 11043435, -619549, -6371047, -7025493, -3937411, 3087545, 3826816, 7016903, -8411157, 1189169, -2231236, -5639292, -4074850, 7955890, -2586107, 2973191, -4367982, -3711926, 2628520, -6932077, 142808, -7682623, 2030983, -3160559, 824097, -373125, -25181930, -55021752, -7299297, 72427104, 111955304, -93776312, 74310448, -5114769, 8835285, -54608900, -61691836, -100874824, -57897232, -63571960, -19874424, -7873749, 43988520, 31128312, 95633888, 83060376, 27586038, 5703180, -14711874, -32563368, -51214264, --18898930, -52499532, -14119705, -25489020, -16658031, -12164958, 2673080, 1013612, 17744120, 25927644, -39144868, 42632384, 50954956, 44176960, -5402532, 4395899, -641561, 8386998, -25370372, 10321343, --27109834, -67441184, -33259152, -50453516, -85051624, -24799678, -7480223, -34320008, 11566347, 26228292, -59229208, 70016016, 103106056, 65271692, 53030500, 52897892, 32757178, -10123238, 5277441, -51964272, --44936096, -75303664, -89720256, -103415296, -75458816, -57983132, -6136972, -2714956, 8129300, 30345554, -51123532, 92331600, 91140280, 90912112, 72744936, 31324270, 46906412, 7464653, -23668492, -35436700, --84074520, -76296336, -67724120, -58253180, -46796888, -28164784, -17231408, -5771363, 4124779, 28372018, -33469606, 44299368, 36536748, 52494164, 47364900, 31140124, 35687420, 24128590, -6616397, -19338090, --22496502, -53373020, -46432356, -41659036, -31359166, -16965120, -719407, -1985349, 13578539, 21104396, -16284369, 19581830, 12377022, 3981972, -493384, 5719823, 1248225, -6490233, 6966437, 8556112, -516470, 4623533, -1365800, -1854352, 707596, 3210488, -208306, -7208566, -9728638, -9415642, --11026255, -7376607, -2294050, -2502892, 3114388, 1289564, 856309, 3709241, 4181688, 3405909, -4519916, 7180112, 6049462, 3466039, 4128537, 1422171, -1560684, -492311, -1960653, -2914135, --1450625, -2626909, -2525441, -3056406, -3860639, -4205847, -4065187, -2284923, 1074, 207769, -2246268, 2316598, 1701881, 1283658, 2190433, 2204392, 3651259, 2461016, 3070902, 1580011, --697932, -1678795, -667867, -2088965, -296890, -114354, -942208, -558883, -700080, -2057289, --1542967, -1327145, -543850, -661962, -85362, -142271, 152471, -636192, -678068, -1054951, -811212, 1258425, 3054259, 3034395, 3484829, 2530273, 1742146, 650688, 0, -952946, --1112933, -2601140, -2313377, -2705830, -2338610, -2667175, -1591822, -1093606, 1611, 78383, -1122597, 906775, 2121714, 2124935, 2464774, 1824287, 2156074, 1105954, 827318, -354872, --548145, -1396401, -1118302, -1494112, -841277, -1156957, -347355, -623844, 66035, -290984, -325881, -119185, 389231, -160524, 290984, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -{ -7448547, -2763275, -3663607, -679142, 2626909, -504122, 2792266, -6819871, -4780299, -1229971, -5654862, -2344515, -1221918, -674847, -3804804, -1764158, 3631932, 3534221, -1354525, -1135482, -2328409, --5517959, 6151467, 3585761, 205622, 598074, -286152, 134218, 4963909, -2534568, 950798, --7904888, -6397891, -1655710, 632971, -5520644, -969589, 1906966, 519691, 57982, -2702608, --2156074, 5190468, -2421288, -2145336, -762357, -677531, 2226941, -1140851, -3406983, -71404, -2916283, -4160750, 144418, -4459787, 279710, -3253438, 4967667, -237297, -5310727, -720481, --548145, 675921, -7566659, -863825, 591632, -4988068, 2282775, 155156, -5836324, 2686502, -3534221, -3049964, -3587372, -6330782, 3307125, 1974074, 5885179, 2965138, -911607, 1195075, --852551, 1838783, 1850594, 4127464, 1009317, -1735167, -92879, 522375, -162672, 2376728, -576599, -760746, -1162326, 1178432, 879931, 1792075, 847182, 722628, 1021665, 993211, -366683, 631897, -135291, -258772, 349503, 290447, 421444, -204548, 501974, -668404, --18254, -5511517, 2505040, -6866042, -1879585, -986232, -3431679, 3262028, 7671349, -3158949, --998580, 329639, -3144453, 2167348, -458488, -2604898, -4352413, -2355253, 6918119, 6630893, -3761855, 7707856, 4571993, 2430415, 7304129, -4562866, 1618129, 3083787, -131533, 1222992, --2153926, 1363652, -10076530, 181462, -576599, 3608846, -2275259, -1316944, -695785, 2755759, --3186329, -550830, 914828, 1929514, 1919314, -572841, -3419868, 612033, 1203665, 2434173, -1869385, 2836289, -3216394, -1949915, -586263, -5750961, -673236, 1479079, 4912906, 5444945, --750009, 2985002, 2253247, -448824, 2037425, 2387465, 3544959, -1461363, -47245, -2697240, -459025, -2330020, 1575179, -3430605, -3202972, 1880122, -20938, -6373195, -594316, -4784057, --1287953, -717260, -802085, -6337761, 605590, 2176475, -1858110, -1841467, 1085553, 748935, -455267, -1293322, -3383897, -222265, -1482838, 1236951, 46171, 41339, -379031, -1448478, --1553168, -1807644, 124554, -811749, 762357, -1153199, 435402, 212064, -1004486, -75162, --1118839, -457951, 64961, -48855, -995359, -296353, -169114, -6964290, -6482717, 2384244, --724239, 5379447, 5493263, 409633, 172336, 10443213, -2793876, -286689, 8846559, 328028, --5050345, -7491497, 5451387, -2216203, 74625, -4651450, 1473174, -3331284, 3716757, 16336982, --5934571, -4840428, -5861557, -6417218, 1209033, -5237713, -12855911, -352724, 1335198, 4832, --5085778, -1104880, 4232691, -5292474, -3064459, 7626788, 2562485, -1970853, -1780264, 4904316, --2399813, 3505767, 3266860, -7003481, -4587562, -4154307, 4613869, -3559991, -2061584, -1942399, --2279554, -381715, -4663261, 24696, -1375463, 1151051, -605054, -10241350, 4791036, -5730560, -4559645, 833761, -8360154, 1699196, 5665599, 1726040, 9403831, -3963718, 558883, 1089311, -2234994, 3346317, -3646427, 1396938, 1279363, -5441187, 7502234, 536334, -1013612, 3167002, --1027034, 1420560, -1319092, -2838974, -154082, -1826435, 2493229, -632971, 508954, 2913599, -1050656, 1112933, -602369, 1589138, 325881, -420370, 1089848, 2123325, -1484985, 145492, --1568737, 1017370, -479963, 3149285, -4392678, 2094870, 2154463, -2287607, 1014686, -1100585, --9439801, 2950643, 8773544, 7397545, 8225399, 1506460, -1826435, -7041599, -3764539, -3279208, --2719788, 7396471, 10153840, 789737, -732292, 7324530, -11829951, 285615, -984621, -158914, --3875671, -3914326, 4267587, 5356361, 144418, -1129040, 2093260, -5686000, -4367445, 4438849, --4810900, 9201431, 8273181, 1430761, 5085242, 4358318, 850940, -3708168, 1275605, -164819, --6491306, 6311992, -581431, 2970507, 5079873, -6036577, -2381559, -7180649, -1655710, 1682554, -6745246, -6918656, -2785286, 5102421, -1093069, -4417374, 7401303, -6158446, -13022341, 2216203, --7346542, -3245385, 3511673, -3117610, 600222, 798864, -3198677, 5571647, -5106179, -5740761, --6952479, -745177, -3031710, 477815, 1811939, -4213900, 1090922, 1233729, 283468, -1999307, -1090922, 922881, 2866891, 453119, -962073, -1969779, -1309965, -865973, -550293, -686658, --1264868, 390842, 532039, 854162, 230318, -372588, -1019518, -379568, 1407139, -1456531, --1569274, -442919, -76236, -122407, 1067836, 1317481, 1187022, -749472, 394600, 275415, -447750, 257161, -446677, 2813741, -1386738, 153008, -11738682, 2488397, 11090679, 875100, -1744831, 3347390, 10387378, 1404991, -9972377, 11057930, 4874788, 3981972, 6750615, 5832029, -53687, -2091649, 6365679, 4844186, 1668058, -4596152, 5535139, 2583423, 8191577, 9532143, -3636227, -2378338, 219043, -92879, 3981972, 12103218, 7204271, -6754373, 11734924, 445603, --1449015, 1525787, -8660265, 9592273, -1287953, 146566, -1156957, 2425046, -1308891, 4938139, --6991133, 9796820, 8367670, -344134, -1578401, -5495948, -10427644, -3605088, 4115116, -2457795, --3924526, 5488432, 6461779, -4426501, -3932043, -13391171, -4656282, -1690607, -676457, -14982993, -7581691, 795643, -8928700, -7357279, 2422362, -3513820, 875100, -2254858, 444529, -3979287, --904091, -3556233, 2496450, 4941360, -1451699, 3746285, 408022, -1632088, 4425427, 1503239, -178778, 3627637, -474594, -1738925, -2367601, -2673080, -2779381, -2653753, -3242700, -2394444, -108448, -1352378, -3050501, -1546725, 242666, -708133, -1174674, 570157, 1150514, 512712, --1432372, -2025614, -2488397, 183073, -2366527, 2040646, -1334124, -1404991, -1320703, -39728, --966905, 122943, 493384, 936840, -1159104, 1153736, 5376762, -6827925, -192200, 202400, -120259, 11372000, 6045167, 29528, 13877576, 6600828, 12514998, 3142842, 4144107, 13624710, --5475547, -8879308, -5827197, 12744242, 2955474, -7006166, 9496710, -2520609, -5756867, 8720931, -20296942, -5160940, 893890, 3374234, 3774740, -5205501, 542777, 11355357, 1075889, 13937169, --3143379, 14956687, 10377715, 3659849, 8679055, 5679021, -5418101, 3791383, -1488206, -1226750, -1289564, 1102733, -1090385, 4010963, 2586107, 9687836, 6339909, -7934415, 2673080, 3700114, --6049999, 437550, -14099304, -18023294, 7122667, -4558034, -11957189, -2460480, -6495065, 7874823, -1587527, -3602404, -9056475, 7068443, -6587943, 4338454, -7377680, 1134408, -3044058, 11036992, -1922535, -4219269, 4101157, -9294309, 8397198, 1447404, -8169565, 424665, -956167, -2254321, --1090922, 1198833, 2253247, -2291365, 3797288, -823023, -1671279, -1737851, -1514513, -3422552, --411780, -1191853, -3489661, -1204202, 1074816, -2048699, 2013803, 362925, -1330366, 599148, --2369748, -389231, -1697049, -170725, -208843, 126165, 961536, 1359894, 1355062, 84289, -615254, -61740, 587874, -1096827, 811212, -770947, 543850, -8061654, 1202054, 181462, -2239289, -4967130, 5602785, 5897527, -515396, -4156992, -13776644, -12056510, -9041443, 4148939, -1377611, 2089502, -11271605, 7102266, 5235565, 8869107, -9644886, 9150965, 7266011, -5742372, --4526359, -2964064, 9578851, 6391448, -4022237, 809601, 14425185, 7117298, 3821984, 8156680, -5823976, 2101313, -4599910, 944893, 789737, -2139968, -5122286, 12569759, 6060199, -11942693, -8118562, 7818451, 8041790, 6075231, 1802813, -7492034, 355945, -1108102, 11202885, 1344862, -5080947, 9927280, -1669669, -11100880, 2571075, 5784247, 11317239, -15037217, -8276939, 3962107, -290447, 1251446, -8699993, -2307471, -8432631, -1315334, 4205310, -2943126, -4551592, -5820218, -2549063, -1537061, -2710661, -7168301, 393526, -9555228, -40802, -1040993, -4643934, -5440113, -6189048, -2209761, -1375463, -3138011, -5675800, 1928977, 2933463, 1811939, 2324651, 1462973, --3077881, -1873143, -846109, -919660, -2886218, -5790690, -2382096, -274878, -1792612, -300648, --2905009, 130997, -1518271, -1291175, -2078227, -2610803, -1174137, 2340757, -1665374, -999654, -496606, 864362, 777926, -1344862, 2005213, 2683818, 2972117, -928250, -52076, -200790, -466541, 351114, 5240934, 730144, -9293772, 9460739, 6007586, -2776160, 3697967, 5713380, --6300180, -2077690, 24055038, -752156, 9354976, 6609955, -20159502, -10661719, -1177358, -814970, --280247, 11454678, 2519535, -5531381, 11761231, 7281580, -1524177, -1912334, 3722126, -1896765, --4219806, -8940511, -10671920, 5901822, -2377265, -4984310, -566936, -16531866, -3125126, 1112397, -9086540, -10918881, -3211562, 1433445, 687195, 2401961, 767725, 11688753, -13651017, -4515621, -2979097, -430034, -8075076, -1683627, 10543071, 9114994, 7828115, -2163053, -13594645, -6176163, -4857071, -1538135, 9052717, -527744, -222265, -6752763, -4231617, 7945153, -9761387, 6652905, -5156645, -7007776, -3520800, -1632625, 1081795, -7547868, 3630858, 2606508, -3744138, -1162326, --10330470, 3721589, 7923678, 11373610, 962073, 3049427, 5359583, 1660005, -9028558, 6163278, --2190970, 1009317, -6979, -2899103, -3134789, -1675574, 4152697, 735513, 3464965, -393526, -541166, -5012764, -1737314, -2312303, 3745212, -395137, -1660005, 2601677, -1956895, 2034741, --1257889, 321586, -4168266, 953483, -998043, -875636, -2686502, 933082, -455267, -2353105, --4309463, -977105, 388695, -1741609, 1694902, -470836, -2839510, -18292802, -1086627, 2455111, -12315819, 1483911, -460098, 7374459, -5337571, 16050830, -16035797, -1592359, -3405372, 2640868, --747324, -1367410, 4166655, -3081102, -5429913, -3707631, -3195993, -9707163, -1493038, 6796249, --1542967, -4350265, 10237055, -223338, 12306155, -12074227, -6849399, 15125801, -1517734, -995359, -933082, -9637907, -1083406, -12015708, 3525631, -14409615, -334471, 10577968, -3452080, 7182259, -9576703, 5470178, 7545184, -9776419, 9685688, 989990, -25243134, -4332549, 3701188, -2150705, --2787971, -10921028, 8566312, -9322763, -1793686, -10562398, -9804873, -15299210, 13585518, 3758, -15830176, -7968238, 11935714, 15705622, -10364830, 12778601, -15823196, -13269838, -14323179, -5086315, --10089415, 3141232, 4779225, -656593, -1853815, -184147, -11329587, 785442, 137976, 6447283, -2601677, 2461016, 4670240, 2530273, -2458332, -205622, -4610648, -2859911, 128312, 1778653, -86436, 2023467, -1512902, 2182380, -691490, 1101659, -7028177, 315143, 2685428, 1928977, -3911105, -2337536, -3102577, -4239133, -98784, -469225, -3292629, -3702262, 368293, -701153, -597537, -100395, -1053878, 1743757, 5592585, -1497333, -1318018, -838056, -1539209, 4902169, -188979, 474057, -1755031, 2855080, -3279745, -766115, 2157147, 11860015, 20163798, 2813204, --5279589, -10926397, 6819335, 18451716, 245350, 5242545, 1026497, 7324530, 5167383, 5606543, -10160282, -12228309, -896574, -4582730, 15972983, 11742441, -510564, 18250390, 9746355, 1582159, --17153562, -8596377, -13063680, -6127308, 1401233, 4898410, -4642860, 651224, 18687940, -3531537, -83215, 912144, 19200652, -11731703, -4641786, -4798552, -1810329, -11477226, 13247827, 850940, -8908299, -13758928, 1938641, -1523640, -8107825, -3278671, -15081778, 4726612, 355945, 3165391, --1792075, -943282, -17518098, -6000606, 6940667, 11157788, -3173444, 2905009, 23451596, -1537598, -1426466, 4276714, 10611254, -9925133, 2345589, 11831561, -6953552, 8597451, 2600066, 8961986, --11858942, -6084358, 1694902, 2721399, 6121939, 6834367, 6630356, -4505958, 1976759, 4030827, -8007430, 12341589, 5804649, -5881958, -2653753, -4632122, 2075543, 2595234, 5465883, 4879083, -3040300, 5156108, -5485747, -1133335, -5595806, 4877472, -6422050, 6580427, 4831838, -4953708, -3007551, -614717, -2925947, 721555, 1086627, -1788854, 1596117, 8178155, -160524, -25233, --4942434, 2570001, -127775, -171262, -4476430, 4682588, -3792456, 1459752, 2121177, 3712999, --311922, -1777043, -10919417, -16663936, 4631049, -1799054, -16804596, 4591857, 1696512, 15220827, -13477071, -12516072, -14992120, 3337190, -11447162, -6053220, 474057, 22676890, 323733, -2918430, --20296404, -10198400, -1756105, -15174119, -23003844, 15742129, -5932961, -7304129, -1324997, 17072496, --5357972, 1828046, -3434363, -3482682, -9947681, -5352066, 1667521, -24077586, -15457050, -4493610, --8773008, -8191577, -2813204, -9483825, 8164733, 3683471, 2614561, -5808944, 4128001, -34745212, -32245540, 18866180, -3274913, -4466229, 18137110, 1025960, -10863583, -15526844, -1976222, -5495411, --6445672, -9373229, -9509594, 11792370, 11063836, -5096516, 24317032, -13610751, -11124502, -10112500, -48318, 7861938, -28508920, 8334384, -9024800, 14803142, -16161962, 6991133, -1480153, -5564130, -11133629, -21086678, 19710142, 1020055, -279710, -4550518, 565325, -396748, -9980967, 1846836, --2775086, 5091147, 6618545, -6206228, 3015604, 4120484, 9293235, 214212, -3063386, -644245, --857920, -3829500, 2700998, -1576790, -2262911, 2249489, -3731790, -1310502, 867583, 2543695, -3157875, -7583839, -5739150, -5078799, 797790, 2901251, -49392, 1860258, 1684164, 4833986, -2548526, -4201015, 3696893, 585726, -4687957, 16515223, 1363652, 38507604, 12546136, -780610, -1656784, -14899778, -19300510, 24050744, -7122130, 2726767, 31932008, -8319889, -1539746, -6830609, -24902220, 4789426, -10290742, 14699526, -5342403, 21835076, 11465415, 5440113, 3238405, -2418067, --8354785, -2724620, -2263448, -23407034, -5876052, -3769908, 12954695, -7248294, 2447595, 4308389, --16765405, -24981678, -885837, 21575768, -1434519, 19168440, -3313031, -26779658, -10365367, 1225139, -6077916, 4852776, -21780316, 192200, -6229850, 15832323, -16160351, 20013474, 29590714, 19193136, --6012954, 3588982, 11943230, -4243428, 23188528, 26836030, 23661512, 7744900, 25944824, -868657, --10438381, 3369939, -13551159, -17103096, 9355513, -7328288, 21205864, 10973105, 5632850, -7256884, --26086020, -23637352, 16618839, -10450729, -21105470, 14125611, 28168544, 16954384, -9016747, 13470628, -8266739, -2894808, -6641630, 8011725, -9997073, -3004867, -1060857, -6860674, 927176, -1449552, -5810017, 3551938, -1331440, -9137543, 5135171, 4707821, 3228205, -1938104, 313533, -8530879, -707059, -34360, 2241973, 2071248, 237297, 5170067, -1768990, 7134478, 8000987, 2131378, -6500433, 660888, -5117454, -12102681, 2770791, 369904, 2636036, -2009508, -8722005, -19463182, -11388643, 14221710, -220654, 6945499, 4683662, 6868190, 5716065, 2596308, -1562294, 3331821, --4099546, 7358353, -13241384, -36883032, -14809047, 20147154, 1131724, -6060736, -12374875, -124554, -16938814, 21629992, 4570919, -13372381, -2405182, 17284560, -21060372, 1935957, -2685965, 15454366, -17641042, -14278619, 26798986, 5139465, 981937, 37893960, 91805, -11990475, 13194676, -6422587, -1788317, -8195335, 2706366, 25145960, 2789045, 32053878, 13438416, -28158342, -30854508, -6810208, -7847979, 17067126, -23968064, -8529805, -3598646, 28829432, 26342646, -22807886, -1045288, -13966160, -8573828, -4902169, 30120068, 266288, -6847252, 19755238, -4239670, -23658290, -12068321, -3997004, -24226836, -21809844, 12903692, 37806988, 17759690, 25321516, -7043210, 10196789, -7101729, -15932181, --15389942, 7793755, -11017128, -903017, -4120484, 6747931, -437013, 15234249, -3731253, -7287486, --2796561, -3285650, 3508988, -2646237, 5645735, -10780368, 7512435, -7203197, -3503620, 1968706, --3097745, -3512210, 4609037, -4863514, -2096481, -1603097, -4177393, -13232794, -7684770, -1494649, --1882269, -4078072, -5463199, -1438277, 3498788, -2510409, 1896765, -2251637, -515396, 2698850, --10387915, 850404, -1817845, -7805566, -711354, -18296024, 13734769, 19252190, 16775069, -28921772, --13222594, 17627620, 54956792, 2926483, 12225088, -16229071, 5294084, -1166084, -2200097, -15263777, -4859219, -5614596, 26549878, 20393578, -27031450, -12512850, 29294362, 14315663, 10747619, 2697240, -15982647, 17856864, 6147709, 10526965, 10385768, -13593035, 2281702, -13319230, -5473399, 3194382, --2214056, 1832340, -10843719, -10388989, 8083666, -2425583, 11023034, 8069707, -24990804, 18557480, -4103841, 14872935, -16765942, 9449465, 15694347, -12265890, -19195282, -20006494, -21294984, -21984864, --17595408, 6102075, 32301912, 8148090, 10175851, 14840186, 1381369, -589484, -12156368, 21115670, --26844082, -54802708, 18988588, -12737799, 2689187, -46530600, 11738682, 14436996, 2837900, 8991514, -8102456, -7078106, -11510512, -18561774, 6127845, 3871913, -13677323, 10031970, -5010616, -23859080, --12609487, -446140, -3928821, 2331630, 1904818, 6857989, 3580392, 1110786, -155156, 5413270, --3120831, -7718593, -13125420, -8216810, -8376797, -3171297, -4491462, 4806069, 7892003, 5524402, --10402948, -1035087, -4207458, -81068, 6459631, 1723893, -9163313, -17668422, -1205812, 586263, -1751810, -6393059, -2347200, -6677064, -1030255, -8679055, -8679592, 5656472, -8475044, 3464965, -1769527, -4685273, -1493038, 5407901, -4751308, 1971927, -6474663, 13002477, 9284646, 12419435, --17715130, -9142912, -2535641, 11353209, -23627152, 39261368, 18585934, -3175055, 21344914, 12883291, -20337208, -10700374, -13785234, -13316546, 24642374, 8792872, 4400731, 22295712, -19567334, -63136020, --4270271, 4231617, 7449621, -35537096, 27484570, 20043002, -38237020, -29375966, 874563, 15736223, -1268089, 8939974, 20167018, -5364951, 12495670, -18439368, -21182778, -16834662, -22003118, -34149284, -9443559, 3534758, -22996866, 30260192, 11693048, -7401303, -7286949, -17873506, -13453448, -31140124, --16982838, 11059004, 27550604, -10537702, 2697240, 11347304, -24575266, 17661442, 23864448, 3507378, --6209449, 20434918, 5528697, 2276333, -14740865, -17183628, -1331977, 30554398, -9481140, -28264642, --570157, -36009544, -37541772, -39069172, -18787798, -20638928, -13223667, 16728898, -2430415, 15029701, --3190087, -5043902, -14192183, -3862249, -4232691, 8032663, -6276558, -9101036, -1855963, -3622805, -1255741, -13244069, 2421288, -6156836, -5337034, 6864432, -6372121, -2203318, 2211908, -4792110, -10185515, -6612102, 1471026, 16514686, 1978369, 9592273, -3776887, -5973763, 16802986, 2387465, --8988293, 181462, 117575, 1158031, 2342905, -4944581, 10485089, 471910, -839666, -5267241, -945967, -5352603, -13828721, -23897734, -12525735, -12841415, 15557982, 30622044, 11304354, -13973139, --29535416, 31671088, 17047262, -15290620, -8242579, -8165270, 1771674, 7444789, -9768366, 16449725, -15301895, 843424, -10301479, -9769440, -9197672, -1196148, 5939403, -4646081, -10183904, -24215026, -7435662, 21247740, -12238509, 18780282, 548145, 12593918, -10577968, 14003741, 40680856, -15294915, -17732310, 35327716, 6100464, -6235219, -9863392, 10210211, 717260, 18000744, -13861470, 48479444, --15076946, -32647658, 7425999, -14913200, 38343320, 12521440, -12080669, 2132988, -23244364, -31863288, -38920992, 4375498, -10580652, 38442104, -20045686, 4928475, -11366094, 22232362, -28586228, -32078574, --22923852, 6984691, 13639742, 25458418, 10810433, 26907434, 42249056, -5344550, 8400419, -5730560, -5223754, -1494112, 1571958, -31292594, 1020592, -43162272, -14507863, -8640937, 7459822, -1623498, -9256728, -3585224, -13032005, -13699872, -3272228, -9127879, -10097468, -17343078, -196495, -1998234, -12824235, 5345087, -10769094, 9429601, 4300336, 7735236, 10292889, -13937706, 3605088, -5931350, --2834142, 13499082, -4828617, 6597070, 9035537, -5808407, -15154255, -7869991, 5196374, -24809878, --7920457, 270583, -3732864, -5837398, 10815265, -11895986, -13093208, 8672613, 14623827, -7157563, -12163347, -8581882, 29442000, -4103305, 549219, 35958540, 3554086, -19211926, -22982906, -19735912, -36271000, -24326158, 14186814, 17411798, -12105902, 3740917, -20474110, -4370666, 15991774, -14409615, -11446625, -4728759, -25649008, -55358372, -5322538, 50044424, 20551956, 5224828, -10226854, -14917495, --3065533, -19614042, 6053220, -27694486, 32926294, 2529736, 3695819, 2790655, -11538967, -33433636, --13127031, 26941792, -22280680, -5585068, -15516643, 12053826, -11209328, 37245420, -6325413, 7706782, --13893145, -34710316, 7368554, -26499412, -6307697, -2311229, -48979808, -41021232, -39126616, 12895102, --7493644, -20995410, -14003204, -13431436, -12735115, -18744848, -12994960, -3253975, -44029320, 12200391, -4529043, 16100222, -10045392, 37945500, -4340065, 7311108, -13544716, -5242545, 20080046, -40531068, -16818556, 26535382, -27645630, -17661442, 1240172, 4274030, -7619272, -13125957, -21760988, -1341640, -56371, -12893492, 10495826, -9522479, -17446694, -9432285, -7764227, 10721312, -773094, 314606, --871342, 7985418, -21413634, -6051072, -3024194, -4130148, -1967095, 289373, -25601226, 722091, --8659728, -6692633, -2708514, -11315091, 2514167, -3280281, 1680943, 363998, -2772402, -2893197, --6861211, -1136556, -5755793, -1311576, 2867965, -5804649, -9832791, 154082, -2878165, -2187749, --6424198, -10318122, -7615514, -2766496, -2006287, -2012192, 2872260, -7604777, -8224326, 14804215, -9437654, 17977660, -6583648, -38278360, 11260331, 253403, 63377612, 64263448, 8114267, 347892, -15514496, 7342247, 16552804, 27575300, 10691784, 28645822, 44019656, -11158862, 6051072, -36174900, --4772783, 4434017, -4323959, -10948409, -21452288, -18571438, 10462003, 9822590, -47390132, 33793340, -9519258, 47798156, -2608119, -9751723, 16030965, -3561602, 50898048, 12650826, -2271501, 9503152, -10325638, -13787382, -30569430, -24434068, -11826192, 37549288, 819802, 41297720, 5417028, 40374840, --11390790, -56031068, -20577188, -16404091, 29214904, 3326989, -26819386, -39495444, -27150098, -5660230, -34249144, -29720100, -25419764, -17128330, 30594662, -15101642, -8531953, -39299488, -38641284, 12119324, -6865505, 52269752, 13762686, -5701032, -13906030, 16295106, 17297444, 55832428, 1286343, -18272402, --23978266, -1690070, -2236604, 1153199, 8961986, 7939247, -12789339, -3062312, 4468377, 11558294, --12283606, -10273562, 15960635, 23066658, 10992969, 6994891, 9224516, -9863392, -3951907, -6241125, --1076426, -1394791, 5279589, -13959, 30418570, 6270116, -1124208, -9309878, -15715822, 15111306, -24690156, -8938901, 539555, 913217, 3193845, 14015015, 6236830, 10410464, 10758893, 2692408, -8382166, 2712809, -455803, 2733210, -7423314, -2524904, 1866163, -4496294, -3022583, -9777493, --592706, 3172907, 652298, 38765836, 14474040, -18606872, 36184564, -2112587, -71667968, -21626234, -44863080, 50203336, -35452272, -35156456, -36086852, 20122458, 30429844, 61389040, 18308908, 8004746, --35204772, -3464965, -2414845, 13860396, 30408368, 22342956, 1530619, -37017788, -72307384, -19043884, --36729488, 54232016, 57090316, 100179576, -30302604, -96304440, -21304648, -33084134, 74538624, 25465398, -75594648, 19552302, -25718802, -73406896, -49974092, 2645700, 8777839, 82247016, 33056216, -2905546, --68097784, -118192672, -31272730, 2462090, 54187992, 124231928, 26691612, 37400576, -80514528, -122829088, -4883378, 28087476, 97311608, 57354456, 40635224, -22797150, -79533664, -64821792, -1080721, 18117246, --2157684, 49200460, -41206452, -38277284, -9920838, -87373056, 13148506, 4024921, 23313620, -17697950, --35748088, -19146428, -15400679, -40087616, 8671539, 11477763, -13265006, -2204929, -37957312, 5137318, -10348187, 12124693, 16938814, 5350993, -19686520, 6503654, -6568079, -3538516, 2312303, 30187178, -4733591, -1196685, -8268349, -23377506, -5034776, -9484362, 8440684, -4443681, 9414031, 6197101, --21691196, -48267380, -24155432, -35530116, 28311888, 28770912, 33978560, 19527606, -45287208, -40633076, --62951336, -15344308, 50108848, 55755116, 54089744, 2407329, -60765196, -45383308, -35624068, -1015760, -89338544, 62050468, 24930674, -48483740, -56547540, -42315628, 20157892, 21059298, 30641370, 16030429, --10039486, -14208289, -26972932, -11766063, 7537131, 919660, 9026411, 12805445, -850404, -41779832, -55261732, -1971927, 8709120, -23714662, -51065012, 30115774, -51425792, 54552528, 8752606, 4167192, -12364137, -34033856, 33675764, 2467996, 23613730, -32660006, 11939472, -482110, 40290016, -16528108, -10401337, 25672630, -29399052, -18092012, 3547106, -28169080, 45138496, -10720775, -17722108, 39288752, -46625092, -13033078, -33426120, -9114457, -29390462, -6249178, 19144280, -3598109, -36754184, 3764002, -20713016, -13843216, 23285702, -19480898, 9357660, 23633594, -9153649, 15350213, -41941428, -43483324, -44156020, 23612120, 67825584, -3421478, -16489453, 56419764, -32000190, -29631516, 20568598, 18635864, -32911260, -30005178, -13482439, 8082592, -5708549, 31717796, -25306484, -80679352, 21356724, 44205416, -1126355, -37685652, 7553237, 22228066, -8419747, -10266582, -29354490, -10204305, -24137716, 24275692, -6577743, -17970144, -4182761, 29109140, -20503638, -8017094, -18478024, -2760053, 14920716, -21414706, -11700565, 30462592, 12421582, -943282, -8283918, -2242510, -10915659, -14943802, 23978802, -10280541, -11199664, -3777961, -11398843, -581431, 3114925, 1736241, 9110699, 9845676, -17307644, -5926518, -9489730, 6988986, 18353468, -2823404, -14778982, 5615133, -17303350, 8101919, -15703474, -9630390, -926639, -3977677, -10305774, 24698746, -10332618, 4725001, 11633456, 1921998, 9277666, 16259672, -380105, -3404835, 1519345, -1395328, -21291764, -13073344, 81109384, 22217328, 22563074, -68700152, --17145510, -53813256, -45434848, 41050224, 43206296, 85499376, 39537860, -11342472, -16416976, -9836012, -27096948, 18900004, 709743, 41661184, 8240969, -16405701, -19488414, -15670725, 29998200, 212064, -26255672, 12386686, 15908559, 4141959, -6413997, 3250753, -31139, 4132296, -6657200, -1516124, -8697309, 7409893, 56121264, 45271104, 36972688, -3020436, 10206453, -22597434, -3637301, -13975824, --25566866, -26586384, 8226473, 14827838, 21414706, 26299158, 21645562, -13254806, -34232500, 52493092, --37219112, -16130287, -9441949, 18165564, 2454037, 25819196, 26780732, 23592792, -31354872, -11041287, -4372814, -12125766, -50639276, 34169148, -11824582, -8904004, 19246286, 39620000, 44754632, 32840930, -31970126, 27801860, -29335700, 4065187, -7481833, -8901320, 16814260, 13552769, 17908404, 8916889, --8151848, -14424111, -21202642, -22728430, -46074800, -18186502, 6791417, -2408403, 28066000, 173946, --12834436, -4061965, -18377092, 7182796, 2092723, -1138703, -297963, 12144557, 26262114, -3016678, -1238561, 14717779, 972810, 380641, -5362267, -1512365, -6358699, -5819144, 1467268, -12334609, -5464272, 7378754, -9357660, -13450764, 3637301, 2947958, -5108327, 13586055, 17816598, -2259690, -2538863, -5659157, -18329310, -7471633, 3639448, 3265249, -104901352, -52183316, -72059888, 52071108, -11438035, 148937120, 153804928, 153387776, 175138032, 172605616, 123903368, 77227272, 96633544, 42856256, -8967892, -81463184, -71035000, -178050560, -155815504, -139755552, -82431696, -103877544, -79259864, -6384469, --25336548, -10095321, -12509629, 766652, -203474, 4855461, 20315196, 21950504, 20830592, 61567284, -63050120, 66960688, 47747688, 133797360, 34961032, 56332256, 93586800, 104457896, 38800196, 105128992, -126355256, 99761888, 86526408, 88099976, 9723269, 52818436, 106365400, 105218648, 67760088, 88332448, -77139760, -867583, -28472948, -19908784, -52489868, -64666640, -8272107, -72696080, -111094160, -86439976, --103465760, -152930896, -69998840, -103335304, -114671872, -162318096, -132064336, -149668880, -171130832, -113867096, --193507600, -228822432, -229763040, -124867584, -155431104, -195800576, -38412040, -87065968, -40840308, -21749714, -64385316, 28841242, 94410896, 50309636, 89199488, 85028008, 55901684, 44205952, 69210176, 128147864, -130287296, 130842424, 133536440, 138847168, 168559216, 150701808, 125078576, 153855936, 173469968, 138782208, -104387032, 124616328, 104819752, 67877128, 85562192, 58022324, 28947006, 12674985, 26656178, 8070244, --10463077, -7090991, -13562433, -32936494, -50367080, -50033684, -54591180, -46575164, -58360552, -92010008, --82702280, -95079304, -107303312, -125062472, -124727464, -103203768, -103657960, -84851376, -53694072, -60605208, --41089416, -28736552, 3779571, 113280, 869194, 5590437, 19352586, 22138946, 7961796, 17643188, -27967754, 22295712, 10387378, 11760157, 21060910, 12521440, 5887327, 8785356, 12328704, 11211475, -7853348, 9605694, 15520401, 14835354, 7014756, 2393371, 5186173, 9203578, 5516349, 3758, -3732327, 6972343, 5464809, 2654290, 4760435, 5076652, 3954054, 3482682, 1747515, 1334661, -3897146, 3122978, 3411278, 1404454, -2167348, -2742874, 1567126, 3263102, -705448, -2262911, -617402, 2147, 659278, 1937030, 1363115, 2318746, 4214437, 3942243, 6271189, 8435853, -9817758, 7620883, 7777649, 8529805, 7134478, 5009006, 5712844, 6808060, 5264556, 2521683, -3285113, 1961190, 1528472, -106300, -2600066, -2378338, -3318399, -6832219, -9496173, -9353902, --8200703, -10675141, -10042170, -9166534, -8208756, -7983271, -6602439, -5299990, -3601330, -3008625, --1858110, -1100049, -278636, 94489, 845572, 851477, 1544578, 1047972, 1236951, 774168, -1088237, 488016, 637803, 130997, 282931, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, -}, -}; -const Word32 CRendBin_Combined_BRIR_coeff_re_32kHz_fx[15][BINAURAL_CHANNELS][2819] ={ -{ -{ --4883915, -5020817, -1855426, 3221, 4694936, -2680060, 1831804, -344671, 656593, -3192235, -6675990, --1378685, 2623688, -1717450, 1596117, 2311229, 1965484, -1469953, 1113470, -4134443, -757525, -1030792, 1708860, -143345, -93952, 510027, 1019518, -3462818, -2873333, 1208496, 2392297, --1198833, 2504503, 4777614, -6426345, 910533, -3075197, -2086280, 1433982, -801548, 3948149, --1226750, 3555696, 1866163, 581431, -256624, 1900523, 111669, -388695, -2005750, 5763309, --4003447, -1213865, 2024540, 2238215, -102005, -1949378, 1106491, -2156074, 2234457, 430034, -812823, -45634, -766115, -711891, 2985539, -7693360, 1804423, -989990, -4466229, -756451, -3760781, 1820529, 2334852, -3367791, 2707977, -1172526, 1702418, 1038308, 1324461, -1422171, -561030, 2026151, -1344325, -3005940, 1225139, -2790118, 537945, 2049236, -3221, -1008244, --1167157, 550293, 1094680, -452582, 1315334, 62277, 941135, 812286, -370978, -190052, -355409, -433792, -268435, -336081, 361851, -601832, 295816, -882079, -225486, -826781, --125091, -259309, -945430, -201327, -8958228, 6958921, -3354370, 1549946, 1292248, 210453, --1925219, -155693, -5038534, -6266894, 1705639, -1201517, 1949378, 1977296, 5639292, -4614406, -667331, 3847754, 3712999, -3741990, -4006131, -2110977, -3479997, 332323, -1169842, -2688650, --2089502, 30602, -6345278, -6032819, -1285806, 1224603, -556735, 522912, -732829, 1397475, --3337190, 3865471, -1363115, 2210298, -484794, 1568200, -3045669, 1053878, 2099165, 2564096, -1092532, 510027, 901406, -1065689, -2527052, 5142687, 3861713, 1645509, -1926293, 6372121, -4289062, -1784559, 4031901, -302258, -3171833, -756451, -1152125, -2801393, 1825898, 2136209, -1006096, -2145336, 4475893, -2945274, 2617246, 3815005, -740345, 412854, -5600101, -2454037, --6026376, 904628, 2848100, -2859911, -875100, 1147293, -2734284, -736050, 1313723, -131533, -938450, -594853, -1461900, -3931506, -1951526, -683437, -965831, -296353, -97174, 276489, --503585, -636192, -1466731, -630286, 28454, 351114, 299037, -766652, -149787, 13422, -198105, -143881, 205085, -44560, 385473, -31139, -728534, -1153736, -1250909, -82141, --748398, 257698, 7541963, 3467649, -2860448, 1309965, 1009854, 12002286, -3503083, 3456912, -5868536, -1104344, 5343476, 2189897, 3646964, -4718559, -1724966, -5533529, -2537252, 3766150, --74088, -2622078, 668404, -3874597, -270046, -2530273, 3594351, -1541893, -454730, -1387274, -1927367, 850404, 77846, -438624, 1589138, -5836324, -4474819, 2029909, 572841, -552977, --2932389, 6985765, 2037425, -884226, 2339147, 2773475, 40802, 1378148, 690953, -3434363, -3158949, -4090956, -3066070, 3687766, -4341138, 3785477, 1729261, -3300146, 5718212, 3075197, -2219424, -1545115, 5185636, 1204202, -667331, -1495186, 1605244, 601832, -863288, -6077916, --843424, -1190243, 1892470, -3574487, 4851166, -1684164, 3981972, -4136591, 175020, -442919, -4950487, -2304250, -1577864, 883153, 1864553, -72478, 1000727, -763430, -4488778, -519154, --284542, -247497, -581968, -99858, 56908, -630823, -834834, -942745, -1028645, 69793, --381715, 10737, 652835, -768799, 518080, 592169, 1373853, -1619740, 1089311, 474594, -853088, -107911, 1273458, 460098, -569620, -989453, -256087, -474594, 12512850, -10373957, --9105868, -2929168, 9582072, -1330366, -5182952, 6563247, -4362613, 3104725, -233539, -7130183, --4847945, 6025839, -3892851, 2989297, -4062502, 3984656, -1764695, -1094680, -446677, -3926137, -2085207, 2891050, -3947075, 979253, -2002529, 826244, 1816234, -566399, 2601140, 795106, -2130304, 3370476, -4299263, -3156801, 3905199, 213675, 3035468, 2963528, -2721936, -4056597, --1606855, 720481, 5374615, -5771899, 2407329, -6446746, -7858180, -1835025, -4485020, -734439, --5316633, -10131828, -5356898, 4733591, 4424890, 2879239, -3358665, 9741523, -2967286, 1661616, --5349919, -5047661, 1360431, 22012, -468688, -6376416, -2065879, -343597, -1269163, -1219771, --3421478, -2749316, 736050, -862215, -1864553, 239981, -3314104, 622233, 1928977, 3347927, -1880122, -2780991, 2977486, -1910724, -157840, 3333432, 1430224, 513785, -1056562, 1729261, -1977833, 1553704, 366146, -825171, 318901, 2381023, 1239635, 1545115, 676457, -852551, -1287417, 272730, -115427, 388695, -640487, 255014, 374736, -667867, 1321239, 1954210, -2295660, -116501, -143345, 361314, -1432909, 2144263, -112206, 1350767, 16019691, -5257577, -7490960, -1999307, 10068477, -1953673, -1570347, 1705639, 2020245, -1699733, -11601244, 1149441, --1138166, -3073586, -199716, -542777, 4097399, -1309965, 9833864, -1289027, 1086627, -691490, -5550709, -1080184, 1896228, -4594005, -206158, -3149285, -3336653, -925029, -990527, 61203, -3542811, -6309307, -1916092, 2170032, -777389, 4400731, 955630, -1087164, -2958696, -2864743, --3141232, -5768678, 2124398, 2475512, 2105608, -10070625, -1545115, 7147363, 3937948, -1595044, --382252, -3103651, -6997039, -7327751, 7264937, -2243584, -4992363, -2729989, 3915400, 3193845, -294742, 3577708, 1403917, 3460133, -1766842, -7186017, -2524904, -3228205, -3744675, 5319317, -3438658, -573915, 5836324, 8848170, -2171643, 3757560, -3481608, -423591, -7516, 3859565, --362925, 974958, 814970, 1205275, 2991982, -3026341, 2333778, -1568737, 185220, -1924682, -274341, 1027571, 2117956, 1584843, -96100, 572304, 86436, -230318, 1072668, -2856690, --448824, -2279554, 483721, -405874, -409096, -996432, -642635, -1188095, 1236951, 605054, --24026584, 13134547, 4753455, -1153199, -1114007, 18254, -3699041, -6726993, -1498407, 3219078, -10103374, 6775848, -9300752, -1811403, -5552856, 3720516, -518080, -12541305, -3735548, 7629473, -4691178, 2582349, 6456947, 3900904, -711891, -860604, 1874216, -4795868, -2858301, 1059246, -5626944, -2425583, -4818417, -6941741, -3524021, 3415573, 11130945, 744103, -2002529, 2338073, --2347737, -8317741, 573915, -5880347, -4646618, -5488968, 3359201, -362925, -7812546, 1421634, -2901251, 3009162, -8448738, -4693863, -3172907, -2117956, -958315, -3138547, -1545115, -4048544, --8201777, -984621, -6971806, -8352638, -5197984, -1504312, 1392106, -4985384, -7352447, 2122788, -5823439, -340913, -1120450, -730144, 4224101, -6415608, 4725538, 7498476, 7277822, 5735392, -9803263, 90731, -4101157, 2618856, 397284, -1075352, -960462, -22012, -2290828, 3224984, -123480, 213138, -2046015, -581968, 1027571, 1197759, -1210107, -1094680, 578747, 3330747, --482110, 1248762, 1088774, 2844342, -2375117, 120796, -93416, -2618320, 347355, 334471, -2151242, 215822, 408022, 1862942, 1148904, -3254512, 1165547, -1180042, -9922448, 3738232, --4909685, -850940, 1291711, 2923262, -413391, 5124433, 122943, -1037235, -13916768, 6445136, --2589329, -2960843, 4988605, -8069170, -11092290, 4519916, -3889630, -5204427, -1646046, 10005663, -6291590, -3669513, -2165201, 4651450, -1391569, -506269, 1343251, 4539244, 8338679, 5304822, -6746320, -1043677, -296890, 156229, -4453344, 1127966, -1879048, 11352135, -8690329, -5041755, --4598836, -4310000, 2728915, 1531156, 4065724, -686121, -5741298, -7692824, -2225867, -9575630, --13329431, -2683281, 357019, 10341208, 2048163, -8219494, -2111513, 7749195, -3294240, 2587718, -2332167, 4342749, -6172405, -9262634, -4096325, -4721780, 14924474, 1653562, -4791036, 3234647, -2486786, -1116155, 1877438, 3400004, -418222, 6610492, -8776766, -7873212, 2545842, -3645354, -7955353, -3696356, -208306, 4263829, -1315871, 3775276, -233002, -209917, -264141, -1309428, --140660, 3394635, 1265942, 3297461, 1860795, 1636383, 117038, -1233729, -542777, 1369558, --435402, 401579, -679142, 2361695, -1971927, 1366873, -1766842, 2381559, -2292439, 200253, --221191, -265214, 1709397, 2243584, -2398202, 1659468, 922881, -823023, 3521336, 8611946, -2764885, -642098, 5971079, -1056562, -7290170, -1306744, -586800, 7305740, -4025995, -918049, --2149631, 1229971, -2179159, 505196, 2434173, 3480534, 5008469, 3292629, 1632625, 12765180, -5079336, 4233227, -474594, -9969693, 726386, -8295730, 2617783, -5608154, 1453846, 75162, -3295851, 15685221, 4508642, -2378338, 5690295, -4371203, 4858145, -2694555, 8220031, -4405026, -22012, -6081674, 3793530, 6252936, -7208029, 14746770, -3545496, 1132261, -2199023, -3896609, -1640141, -4352950, -12537546, 2198487, -3097745, -631360, -7719130, 1917703, -2691334, -12898324, --5809480, -3548180, -11401528, 6584185, 16591996, 20103132, -19014894, -14494441, -8010114, 890669, -4824859, -5807870, 2803003, -6600828, 1832340, 9329206, 14334453, -9736691, 16042777, 5207111, -1947768, 2818036, 2962991, -3445638, 5560372, 5146445, 6186364, 4789963, 2051384, 7211250, -115964, 2333778, -46171, 85899, 3940633, -1031329, -4570919, -1154809, 3135863, 2470680, -1051730, 73014, -205085, -288300, 3162170, 2566243, 1176821, -2626373, 791885, 886911, -144418, 3393561, 1525250, 2153926, 84826, 2572686, 1517734, 2601140, 3533684, 3700651, -332323, 259846, -1692754, 4072166, 3631395, -282394, -976568, 526670, 2649995, 7444252, --13361106, 19958714, 639413, 11780558, 4411469, -3830574, -3963718, 10931229, -6081137, 6988449, -8567923, -852014, -5637145, 556735, 8855686, 5084168, 4663798, 4076461, -540629, 1611687, -3131031, 11162083, 7937100, -5623723, -4756677, -671089, -2296734, -993211, -5506685, -3611531, -5729487, 9865003, 2701535, 14769856, -3824132, 16129750, 961536, 7707856, 17770964, 12628278, -4221416, 3794604, 8164733, -1522566, -6844031, 164283, 7700340, -4093641, -7885560, 506806, --1046898, 16228534, 13122736, 39728, 18365280, -1412507, 9987410, 5341329, 7951595, -812823, --6006512, 8325794, -1391033, 9705552, 6761353, 20298016, -10993506, -1743220, -22450868, 5017596, --10910828, -1329829, 10700374, -4095251, 4546760, -1679332, 12470438, -3027952, -8256001, -453656, --2637647, 3845606, -287763, 6109591, 7209103, 2028298, -1564442, 5692979, -948651, 2570001, -296353, -3461744, 2777233, 2752000, 5104569, 2701535, 5689221, 2613488, 176631, 399432, --1395328, 251792, 5589900, -1710471, -3716757, 2488397, 1074, 973347, 4636954, 1176821, -1358820, 2002529, 3186329, -729608, -230318, 2110977, 3825742, 5852967, 5512054, 179852, -2778844, 238371, 72478, 2661806, 3980898, -13140989, -9638443, 4751308, -7782481, 4469987, --4685810, 1292248, 12120398, -2069101, -11393474, 3074123, -4769561, 11628624, -12171400, -8542690, -4996121, 5582921, 8538395, 265751, -810138, 5449240, -3305514, -8389145, 5220533, -3482682, --6616934, 1937567, 6560563, -4841502, 12299713, 4897337, -400506, 1538672, 6049999, 2550674, --20883742, 8474507, -2095944, -2296197, -3562139, 11046119, 117575, 11763915, 548682, 943282, -1360968, -3232500, -1216550, 5657009, -6645388, 1485522, 19090056, 1566589, 14057965, 973884, --2777770, -1647657, -9351754, -19687594, -14178761, 6353331, 9062381, -3998615, 15061377, 6277095, --10608569, -6359236, 13807783, 9615358, 9190156, 2653753, -4108136, -15032, -638876, -8572218, --2484102, -5075578, -22901840, -10053445, -405874, 15308874, 3576097, -3735548, 1796907, 13113072, --3153043, 507880, 225486, 3194382, -4209068, -2262911, -3102040, -2049236, -991601, 3010235, -10201, -756988, -31139, 2310693, 2175938, 3706020, -2578054, -4513474, 1742683, -4769025, --2330557, 370441, 1856500, 322659, -598074, 4562329, -2016487, -1639067, -5306969, 1879585, --4771172, 3716757, 1967095, 2386928, -3992709, 144955, -489626, 1821066, -2191507, 1362578, --1927367, 2382633, -4430796, -85362, -5232344, 6077379, 12774306, 5026186, 4454955, 14627585, -12272869, 10285910, 653909, 3990562, 1033477, -2075543, -2547453, 2613488, -889595, -8352101, -2136746, 8702677, 152471, -2178085, 2862596, -20781200, 7251516, -8123931, 5469641, 7383586, -6680285, -7645579, 4507032, -558883, 75162, 12711493, 9359271, 377420, 5130339, 3867081, --1437203, -6860137, 1987496, 6335614, 374199, 9128953, 2915209, 8281771, 16082505, 1080721, -6646462, 7031399, 8745627, -102005, -5172751, 13928042, -5028870, 11293617, -12738336, -10436234, -15249818, -496069, 5218386, 9091909, 13342316, 17169668, 7398618, 2586644, -7988103, 3981972, --1421634, -14858439, 13102871, 8256538, -12103755, -468688, 1044214, -15234786, 5485747, 12593918, -7559143, 164819, 5014375, 3643206, -6943889, 13760001, 1573569, -2372433, 7230578, 13614509, -5519570, -261993, -4381404, -3381750, -1320166, 2557653, 4044786, 5790690, 2080375, 1232656, -2005213, 6721624, 6038187, 7442105, 191126, -475131, 3127273, 6414534, 306016, 854162, --944356, 3118683, 789737, -418759, -2028298, 1751810, -4132296, -7594576, -73014, 4720706, -173409, 3425237, -3471944, 2700461, 458488, 3028489, 715649, -1831267, 2080375, -1138703, --875100, -202400, -4480725, 3686156, -1465658, 1705102, 2939368, 443455, -390305, -1902134, --2798171, -34899292, -21716428, 7033546, 7378754, 14271103, 23651312, -6576669, -3740380, -7604240, --7021198, -8963597, -9562745, 708670, 3796214, 2928631, 14922864, 579821, 14645838, -818191, -5028333, 6708202, 5199058, 10832444, 7767985, 464393, 9603010, -211527, -1146756, -5632313, -6499360, -972810, -14323179, -12484933, 7773891, -1898376, 17081084, 10089952, 10987600, 3952981, --21478058, 5063767, 13521094, -2191507, 3943854, -3414499, 2696703, 16843788, -572304, 14092325, -23728620, 1198296, -8924942, -392990, 275415, -15025406, 20154670, 9441412, -2640331, -1300838, -14616847, 6714645, -17634062, -14554570, 5712844, -6431714, 8493298, 5922760, 2724620, -7178501, --12503724, -793495, 3235721, 2165737, 13641890, -18446884, 2728915, -1458141, -15397458, -7592966, --15482820, 13353590, -4546760, 18541374, -14689325, 1135482, -7027640, 10424422, 4723391, -4866198, --807991, 9575630, 702764, 2808372, -5602248, -3297461, -4720706, 8440684, 4425964, -314069, -2418604, 2325188, -7883413, 245350, -2143189, 2499671, 1777043, -2037425, -8049843, -3164317, --5914170, 6877317, -5242008, 839129, -1321239, 6790880, -1386201, -1596117, -2413772, -4801774, --136902, -3315178, 2966749, 7493108, 6988986, -867047, -7049115, 8727910, 24712704, -29417842, --8232379, -14340896, -606127, 4663261, 775778, 19722490, -20357072, 9623948, -2783139, 3931506, --2468533, 10831371, -5976984, -10076530, -847719, -2935073, 7650411, -635118, 5170604, 11476689, --2393908, -8596914, -1156957, 12906914, -7598871, 3080029, 2895882, 515933, -1178969, 12819941, --491774, -3301756, -21413096, 6890738, -5304822, -13514651, -11771432, -3119757, -13048648, -7678328, --11332808, 5377299, -13372918, 13339095, -12275553, 8272644, -6348499, 16171089, -15671262, -9090835, --2371359, 9373229, 3843459, 86436, -6458557, -12823699, 1289564, 5022428, 18304614, 9613211, -3983045, -10469520, 6217502, -9286256, -10499048, 9155260, -10193568, 4857608, 11854647, 9913858, --2659659, -3776350, -8584566, 14294725, 1377611, 13681618, 22080426, -4315906, -11617887, -5170067, --3883187, -7953206, 3475166, -13206488, 5733245, 4320200, 3946001, 10460930, -7413651, 396748, --1371705, 2659659, 9477919, 286689, 7446937, -2702071, -208843, 948651, -4269198, -1506460, -4458176, 2382633, -6091338, -7903277, -3795677, 3500398, 3096135, -3467649, 11265699, 3318936, --8302709, 4172024, 6000606, 15074261, 12199318, 6871948, 2494302, 1460826, -6370510, -4948876, --255014, -5014911, 903554, -2907156, -9287867, 5100274, -3109556, -1285806, 1039382, 5026186, -63888, 16460999, 22759568, -23894514, 17719424, 12373801, 694711, 8930311, 30218316, -8390755, --8577050, 2938295, 8965207, 12586939, 4222490, -11680164, 13407814, -4813048, 26715234, -624918, --4290136, 8687108, 7098507, 6997576, -180389, 25057912, -20648592, 5140002, -270046, 6933688, --8550206, -17202954, 8704825, 6853157, 7121056, -5973763, -4489852, 20956756, 7943542, 26316876, -2510945, -9634685, -930397, 5905580, -2169495, 27314918, -3314641, 14905147, -2527588, 24515136, -9027484, 6665253, -5814849, -1302986, 13573707, 323196, 14527190, 10947335, 12852153, -16838420, -2834679, 12151536, 14649597, 10917270, 8441758, 19621558, 24119462, -18235894, -2069101, 36538896, --8642548, -9810779, 23732378, 31891206, 731218, -253940, -17090748, -14106283, -797253, 16046535, --2202781, -2949569, 862752, -1160715, -4297652, -12206297, -4341138, -867583, -7120519, 558883, -7572564, -4086662, 9646497, -9546639, 8522289, -1887638, 7442642, -7140383, 389231, 5468567, -3318399, 9308805, -1488206, -4811974, -2005213, 2819646, 8600672, 2570001, -2868501, 11738682, --3483219, 6221797, 6328098, -995359, -1148904, -2571612, 17195438, -6154152, 2346663, 4416837, -6496138, -3016678, -10890426, -6342593, -1765232, 12945031, 6398965, -900333, 932545, 4647692, --665183, 221728, 4719632, 2481954, 1327145, 178241, 10069551, 22585086, -1319092, 7094212, --19186156, 18393734, -9706089, -5943161, -16801376, -10853919, 34561600, 550293, -24283208, -10771241, --702227, 170188, -3193308, 26774826, 12479027, -2201708, -11146514, -980326, 7018514, -3224447, -35554812, 7645042, 15622407, 5478768, -8031052, -20048370, 4708895, -137976, 3122978, -15507516, --1691143, -10439455, 11948599, 173409, 1917703, 12553653, -11326903, -8152922, 2395518, 659814, -3631395, -17114370, -13612899, -29402272, -15524696, 1395328, -16947404, 2390686, -12327093, -7195681, -21825950, 7030325, -10766409, 6706592, 2377265, 52613, 20975010, -3468186, 25428354, 9925133, --11125576, -31033286, 5303211, 5128191, 17132088, -9174587, -22552336, -7820599, 6342056, 1282585, --5506148, -15955267, -5347771, -22610856, -26134340, 8290361, -1626182, 26781806, -8697309, -16022912, --14285061, -1110249, 18605798, -821949, 6719477, 12265353, 9027484, -3927211, 5909875, 8456791, -2528662, 8666707, 8067023, -5660230, -1091459, 12065100, -2594697, 1880122, 11014444, -1905355, -6426345, -8080981, 2986076, 6720013, -4074850, 4119411, 3427921, -7516193, 10040023, -9490804, -4696547, 5456219, 7895761, -1755031, -5954972, 11300059, -1781338, 8437463, -12088185, -5420249, --8974871, -6964827, 739808, -5674726, 4110284, 937377, 1496796, -11443403, 16091095, -18048526, --1185411, 27169964, -5976984, 7971460, 2727304, 3513820, -25668872, 21132850, -2232309, -20551418, --12105902, 10641318, -3185792, 5283884, -259309, -8568460, -6459094, 3600256, -6471442, -1558536, --500364, -29734596, -7899519, -19963544, 4251481, 6988449, -328028, -8832600, 3368865, -4267050, -11479911, -26321170, 1605781, 4496831, 14861124, -11506217, 13834090, -11335492, 8745090, 2302103, -10726681, -17214766, 5086852, -8570607, -18376554, 11758010, -14902463, -29705068, 4189204, -2861522, -23192824, -11357504, 3104188, 10648298, 15331960, 17457432, 1725503, -6098854, -11210402, 263604, -8193187, 11465415, -23249194, 25777856, -365609, -17555142, -13221520, -23329188, 9298067, 5549098, -9087077, 3996467, 24479702, -8849780, 26619670, -14634564, 6106370, -6007049, -12611098, -37428492, -20900922, 3930969, -10065256, -25444996, -1640141, 4592931, -2337536, 9164923, -7002408, -8258685, --1486596, 3835406, -7284265, -7140920, -4663798, -1433445, 3754338, -2331630, -2432562, -10177462, -7284802, 102542, -5675263, 4463008, -4167192, 7613367, -2578054, 3734474, 4964982, 9432285, --3486440, 8548059, 785979, 328028, -9576703, -7540889, 2113661, 3369402, 1113470, 328565, --2010582, -6325950, -3604551, -3098819, -6907381, -3270081, 11535208, -6061810, -6873559, 3454764, --14854681, -22018686, -138513, 12067247, -4871567, -23842438, -3847754, -34819836, 16785270, -38475928, -22879290, -26614302, -23251880, 6564321, 19836844, 14824080, -13280039, 13906030, 24968256, 4409858, -3664144, 5852967, 2179159, -14795089, 17881560, -30185030, -18815714, 1658394, -1953673, -1968169, --4096862, -7544110, 3933653, 27717034, 7082401, 3828963, 2505040, -13081397, 16015933, -2937758, --28015534, -4321274, 499827, 579821, -19200652, -13512504, 14592151, -4804995, 25112136, 4663798, --88047, -20532628, -11356967, 7554848, 3148748, -5601174, 21496848, -17104170, -10498511, -747324, --1374926, 20393042, 1547262, 23858006, -104690, -19485730, 4742181, -16609175, 12550968, -2319819, -17142826, 32658932, -50352048, 17135308, 6841883, 9223442, 18906982, 4742181, -23154706, -5317707, --2203318, -4135517, 11664057, -23562190, 2127083, -6141267, -3470334, -16217260, -8849780, -24552718, -2633352, -1500554, 2427194, 6828998, -10090489, -1749662, 11844446, -7297687, 2240899, -4033511, --12226161, 5701032, 7224135, -8427800, -995896, -13353590, -889058, -19348290, 6883222, 4850629, --2522757, 2164664, -5001490, 903554, 3853123, -3023120, -3724274, 11190000, 13465259, -2950106, -4401805, 2289755, 13823889, 6296959, -17620104, 2435783, 9962714, -5602248, 10067940, 3397319, -4584878, 41149008, 35566624, -10129680, -13700409, -778463, -26986890, 15818365, -1500017, 5988258, -2146947, -13632226, 41059352, -17591650, -72296112, -10558103, 14485851, -48673252, -8296803, 15269146, --41205380, 5750961, 26911192, -18939196, 26848378, -25706454, 23074712, 28584618, -18190260, 7800198, --2578054, 640487, -7674033, -11281268, -2028298, 17598628, -11275363, -18844706, -10246718, -15173046, --1550483, -11907260, -1890323, 6313065, -2778307, 17184702, -15093052, -18602578, 14894947, -19679004, --29152090, -37446748, -12989055, -881542, 7348152, 20881594, -8654896, 9364102, 9844065, -6863895, --3164317, 34400004, -22675280, -872415, 23606750, 7303592, 18577344, -4622459, 6816113, 26118232, -13494787, -1417339, -3116536, -16095390, 6670084, 26270168, -24356760, 18581640, -24102282, 7056095, -34249144, 7879655, -19127636, 19434728, 3159485, -12266963, -9504763, 23517094, 7814693, 10143639, --1343788, 1779190, 6525129, 7713762, -627065, -2356863, 10078141, 8724689, 1913408, -11625403, -12870406, 1580548, -4338991, 3144990, 4460324, -8466991, -2171106, 6524592, 1334124, 10869488, --13353590, 20192788, 15722265, -2785286, -12734578, -5207648, 13533442, 15388331, 24901146, -774705, -4845797, 4055523, 13676786, -20728050, -10995653, 20774756, 13057774, 1396938, -3307662, 1772748, -5789616, -10859288, -8471286, -7310571, 1555315, 6612102, -3320547, -11778411, -8421357, 36103496, -24460376, -34862248, -7054484, 31077846, -9496710, -19296214, -13625247, -19363324, -11431055, 31371514, -19133542, -2573222, 14236206, -3474629, 17359720, -10981158, -6096169, 34852584, -14549202, 6257768, --10124312, -3824132, -420907, 9492415, 28372018, 10887205, -19268834, -5701032, -909996, -2973191, -15961172, 2077690, 28572270, -8489003, 4920422, -3012383, 8327405, -24034100, 14386530, -22176526, -14955076, -1238561, 21959094, -5801427, 16280074, -7585449, 5116917, 9278203, -9500468, 9613747, -22173306, 27631672, -14689325, 28312962, 11923903, 33602212, -9684614, 6268505, -1271847, -4233764, --6473590, -2415919, -11169599, -55309516, -34782792, -10792716, -718333, 7738458, 3869229, 12659953, -20774756, -30488900, -1735704, -12378096, 45967960, -3324842, -14035953, -4107599, -40397388, -33872260, -50808388, 20566450, 11327976, -7955353, 15888158, 1203665, -37002216, 7437273, 2459406, -14179835, --14472966, 2202245, 153545, 3809636, -7792145, -4061429, -18166102, -15450071, 6427956, 7923678, -6944962, 5264020, -9486509, -13976360, -8507256, -18046378, 11247982, 3711926, -31913218, -3924526, --9318468, -2360085, 15477988, -14826227, -20692078, -4700842, 13204340, 4324495, -14405857, 8346732, -18289044, -34418796, -9330280, 12002286, -747324, -2803003, -6667937, -1588601, 5825587, 10022843, -2266132, 27487254, -39482560, 37381784, -10768557, -11015517, 9705015, 17462800, -30896384, -6095096, -653909, 6307697, 1778117, -773094, 15662672, -9324374, 2103997, 8286603, 9161165, 13083544, -10841034, 3697430, -16910360, -3318936, 23247584, -22371948, -19119584, 24091008, 8291971, 17052094, -26320634, 40758164, -9118752, -25750476, 34491272, -13784698, -5705864, 35949952, 11362873, -13051869, --37304476, -24588688, -3658239, -13710072, 17693654, 35431868, 18204218, -12021077, 36385888, 12312597, --13048648, 10115722, 40593348, 11825656, 7946763, -8435853, -32342714, -43443596, -34517580, -2388002, -26346404, 8136816, 16683800, 62194884, 30693984, -37044092, -24928528, 16589311, -51339892, -23514946, -44462576, 15970299, -57053272, -47575352, -22022444, -36393944, -34215320, -20412906, 31209916, -8729521, --6415071, 81292992, 13749801, -23234162, -6369974, -25113210, 43233140, -8964670, 9471477, 3110630, -718333, -23493472, -9036074, -1724966, -11869679, 2975339, 9343701, 21249350, 2838437, -14224932, --534187, 58519, -9386114, 4499515, 6207302, 7289633, -18640158, 4945118, -17265232, 3156264, -9169218, -880468, 13902272, -3211562, -843961, 14151380, -2814814, 7979513, 15589658, -5128191, -4677757, 10882373, 11724724, 9761924, 1964948, 2570001, 8160438, -8408472, -3275986, 5769215, --55371256, 38477000, 16551730, 12497281, 15498389, -5877663, 19000936, 15626702, 22262962, -4143570, -30507690, -19067508, 23152022, -8346732, -17648558, -5545340, -28981902, 3083250, -10618233, 10327249, --7328825, -11172284, 27877558, -31922882, 20670604, -1029718, -13910325, -5521181, 12360379, 14014478, -10096931, 26419954, 21264384, -15201500, -3172370, -13593035, 11854647, -12040404, 9245991, 12760348, -5818070, 7187628, 4724464, -7452305, 29097330, -2665564, 8648454, 2964601, 13404593, 7496329, --34799972, 2312303, -20823076, 5364951, 15349139, -2792803, -14752139, -13450764, 32409286, -34213172, --27737436, 50939384, -21643414, 13254269, 5033702, 16399796, -7708930, 8608725, -35449588, 2481954, -34360812, -18366354, -13947369, 29709900, -2068027, -24530706, -18252000, 10989748, -9692131, -5657546, -18340048, -13497472, 4521527, 22977538, -25880400, 1763621, 15048492, -8313446, -5207111, -6677601, -9227737, 2637647, 3674882, -3320547, 5200132, 4046933, -5163088, 468151, 823023, 13749264, -6794102, -12740484, 15579994, 4005594, -8090645, 4662187, 4677757, -1333051, -4793184, 11332271, --108448, 3882651, 1275605, 14634564, -6891275, -5373004, 8680129, -12954695, 16275779, -1130113, --9451612, -1422708, -1169305, 2087891, -374199, -6201933, -1145683, 8682813, 16917340, -33296198, --133538584, -144016688, -5728950, -82831128, 72360536, 262967968, 114325584, 158387664, 200176080, -76316736, --54129472, -21854404, -180769808, -126582888, -41391672, -198159056, -86655800, -18097918, -81309640, 18751828, -185025040, 168054560, 181899376, 235933824, 141960480, -13314935, 52640728, -53497576, -210872688, -114791592, --85074176, -175296400, -120353040, 6186364, -135085856, -44795436, 29203630, -134963440, -69459824, 100114080, -38526932, 108614888, 271280864, 220455296, 178168672, 320967744, 232829104, -4465156, 33058364, -60588028, --288547168, -275825472, -284534592, -442900256, -300178496, -185716528, -181822064, 1661079, 143129248, 161299648, -226247600, 342817856, 317198912, 267728400, 264304240, 151151712, 52784076, 7910256, -16838956, -120864136, --207668112, -254826848, -272832960, -368158144, -306171040, -236220512, -115888416, 122686816, 363162560, 338246400, -370649248, 259796128, 31206158, -35900556, -111983760, -153708288, -104126648, -51354924, -51825224, -23244364, --24068996, -37835440, -284005, 4848481, 26501022, 84107808, 76287744, 56124484, 77304040, -7900056, --50851876, -7302518, -59614684, -51641076, 31113816, 33757908, 7384123, 7334194, -90561000, -230745504, --218571424, -186180928, -140436848, 67604392, 209500448, 256379488, 323928032, 290386496, 178890752, 124091808, -43705588, -52121040, -108837152, -129674728, -168087296, -206096688, -232428064, -271307168, -241328304, -83675088, -58921584, 139241232, 180591568, 196377712, 147273360, 102186936, 51091856, -2022393, -6049462, 24994026, -39906688, 43802224, 47631724, 39638792, 3680787, -32318556, -70068096, -125386736, -120377192, -96618512, --78635480, -38289096, 3576097, 27172110, 24034636, 15705085, 9292162, 7614440, }, -{ --7769596, -3768297, -8835821, 1731946, 642635, 554051, -6028524, -2137283, 1660005, -1321776, 1964948, -3140158, 1896228, -82141, 2475512, -6815576, 165356, -265751, -166967, 3743601, 5696737, --5975374, -1340030, -3624953, -1181116, 2125472, 3909494, 631897, 970126, -1473711, -1946157, --1586990, -1208496, -2721399, 1487132, -2743410, -1851131, 3117610, -2664490, 2237678, 369904, --6746857, -2286533, -3719442, -891743, 2863133, -1995012, -592169, -1962263, -2030983, -1419487, -2798708, 4258460, 782758, 2367601, 1879585, -2263448, -4291746, 2301029, 1893544, -938987, --3693135, -3081102, 2777770, 561567, 2077154, 988916, -5676336, -1875290, -2114198, 3129421, -1264868, -5708549, 1500017, -3026878, -938450, -298500, -2070174, 1626182, -1889249, 435402, -2175938, 2246268, 1379758, 1548336, 1013075, -183073, 1081795, 1331440, 125628, -1109712, -1523640, 314069, 12348, -451508, -1023813, 489626, 960999, 171799, 788663, -305480, --521839, -13422, -801548, 840203, -148176, 993748, -192200, 191663, -96637, 923418, -485868, -49392, -389231, 584652, -10961830, 7269769, -5234492, 734976, -690416, -1993939, -5572720, -4885526, -3244311, 4832, 5890548, -2174327, -326954, -623307, 4875325, -2925947, --7783018, -1723893, -3996467, -5440113, 217433, -425202, 915902, 3160022, 5205501, 3245922, -517544, 7947300, 3106335, 278099, 5677947, 5947993, -461172, -3190624, 242129, 2632815, -2113661, -36507, -1129040, -4599373, -4048007, -1986959, 4558571, 1890323, 7839389, 4438849, --334471, 2628520, 3202435, 1075889, -4849018, 5274757, -2074469, 2762738, -195421, 1676648, --5784247, -915902, -1829656, 2061047, -1756105, -2179159, 6066105, -408022, -4529580, 1807108, --3443490, 2836289, -1935957, 4546760, 3925063, 4361540, 1480153, -4180614, 2321430, -624918, -2288681, -1802813, 664109, 5970542, -2281702, 2906082, 3935264, -576599, 254477, -166967, --698469, -1571958, 1005022, -81604, 1505386, -19327, 1219234, 89657, 114354, 872415, -1466195, 618475, 1408212, 1565516, -279173, -1118839, 2032593, 235686, -41339, 171799, -1245541, -315143, -1091995, 602906, -251256, 336081, 59056, 1227287, 410706, 675384, -414464, 2190970, 2462627, 124017, -2135673, 2296734, 897111, 693637, 1088237, -8685498, -2812667, -5537287, 917512, 1785633, 1883343, -2545305, 4609037, 723165, -1708323, -804233, -5379984, 3852586, -2343979, -3023657, -2473364, 2070174, 3817152, -2321430, -2524904, 732292, --9842454, -39728, -4201015, -1675574, -4179003, -5495948, -674310, 4967667, 1373316, -4483946, --1185411, 4248797, 1291711, -2760590, 4831302, -2124398, -6736656, -2029372, 3783866, -1694365, -4477504, 8532489, 6921340, 933619, -93952, 2393908, -1048509, -5074504, 54761, 1877438, --3615289, 3022583, -7171522, -1099512, 447750, -3073049, -2340757, 3096672, 6256157, -4928475, --5114769, 3151432, 3202435, 5858873, 1900523, -3468186, 4706211, 4029216, -1349157, 4495220, --5004711, 5040144, 1233729, 3405372, 698469, -2728915, -1541356, -522375, 1120987, 71941, --2459406, 813896, 29528, -1476932, -1178969, 296890, -361314, 1068910, 68183, 1806571, --1332514, -1014149, -64425, 198105, 1601486, -849330, -1591285, 685047, 62814, -377420, -1090385, -287763, 662499, -761820, 667867, 925029, 130460, 1524713, 14785425, -5742372, --2528125, -945430, 10660109, -1059783, 8062191, -5859946, 7104950, -7029251, -6167036, 1484985, -3365644, -4149475, -1018444, 2121714, -541703, 2766496, -4278861, 4942434, 1788317, -5296232, --199716, 2128156, 1661079, 949725, 10028749, 7994545, 6254546, 2147, 4060355, 383326, -1172526, 3005940, -9251896, -1411971, 5640903, 3672734, 4378719, -100395, -1637993, 2046015, --362925, 11312944, -1710471, 1910724, 1137093, 556735, -3343632, 6786049, -769336, 7055558, --3883187, -4070019, 2923799, -2710124, -9411347, -4332549, 1897839, -890132, -6731288, 1883343, -22012, 8766028, 769873, 764504, -2676302, 3194382, 3237332, -714038, -508954, 7700877, -5659693, 5623723, -3708704, -5277978, -4609037, -9019431, 753230, -6384469, -2155000, 407485, --3481071, -3970697, -2212982, -444529, -1354525, 2128693, 3963181, -736587, -456340, -1774358, -919660, -1283658, -1486059, 638876, 1087701, 22012, 1400696, -811212, 52076, -783295, --528281, -425202, 816044, -482647, -487479, -285615, -1280974, -1453846, 91268, -155693, --1763084, 1505923, 1504849, 1834488, -33286, -1271310, -746251, 1443109, 10844792, -8636642, --242666, -9032316, -5943698, -3533684, 7788387, 4560182, -10908680, -14902463, -5753646, 5224828, -3707094, -2254858, 5070209, 24696, -1293859, 554588, -7849590, 2330557, -1057636, 628139, -2444910, 504659, -55298, 3261491, 2857227, -5222144, -5209796, 5892159, -1901597, -2934537, -3596498, -10200547, 2398739, 2101313, -9404368, 3389266, 9678709, 5856188, 6635188, 1343788, -3649649, 9193377, 1703491, 1734630, -10597295, 5561446, 7943542, 6499896, 1227287, 6603512, --7558069, 7398618, -2252174, -7429220, -11444477, -131533, -7289097, -5877663, -2537789, -6979322, --17383344, 735513, 879395, -599148, 2676838, 8522826, 3186866, 3427921, 2252710, -6218576, -883153, 2884608, 2464774, 2186138, 2500745, -6381248, -1913408, -8039105, -3644817, -592169, -1848447, -2948495, 2827162, 556735, 481573, -2023467, -344671, -1080721, -2684, -1166621, -1056025, 335007, 796180, -307627, -1483911, -1236951, -1223529, 1220308, 776852, -14496, --580357, -1121523, -1217086, -1182727, -3629247, 533113, 493384, -2753074, -1443646, -1007170, --23475754, 11538967, 1474784, -9131637, 2201708, -1020055, -2704219, -1879585, -5178120, 2754148, --2661806, 524523, 3367254, 3096672, 10151692, -4131222, -9726490, 5262409, -12329777, -5334350, -1997160, 1669132, 1392106, 3963718, 4930623, 4231080, -101469, 5607617, 355409, -2268280, -7474854, 4608500, -2291365, 4421132, -7753490, 14598594, 542777, 2688650, -1381906, -12594992, --2184528, -4709969, -4409321, 1913945, 10460393, 259846, 431107, -1387274, -2895882, -6817187, -2138357, -1156957, 3741990, -8582418, 2876554, 4511863, 1997697, -6369974, -2252710, 1627256, -812823, 5086852, 1003412, 17746268, -5081483, -7623567, -8621073, -2649458, 178241, 6308233, --8586713, -1155883, -3682398, 3879966, -12534862, -588411, -3397856, -5290863, 1559610, -1566053, -3415573, -489089, 6278169, 3933116, -19864, 1292248, 484258, 748398, 7281580, 833761, -5207111, 1846836, -1316944, 92342, 186294, 1463510, -958851, 732292, -279710, 2164127, -408022, -1689533, -2396055, 1897302, -922881, -2895882, -1257889, -1541893, -663036, -913217, --53150, 3491272, 60130, 954020, 426812, 1387811, -1396938, -817654, -3034931, 10569378, --3438121, -2558727, 2251100, 3096672, -8580271, -8658117, -7921531, -7448547, -12162811, 7612293, --7131793, 2110977, 2912525, 10990284, -1858110, -2656974, 8600672, 1963874, 1773285, -10177999, --6680285, 4946729, 2128156, 3924526, 5925445, -10721849, 80531, 4518843, 10155450, -147103, -924492, -1579474, -32749, -7013682, -1359894, -2212445, -13003550, -1087164, 3921305, -7487202, -3144453, -8141648, -88047, -5648956, -1193464, -1797444, 688805, 10402948, -3091840, 86436, -5313949, -3049427, 3093450, -8730595, -15508590, -8456791, -4734665, -2247879, 1598265, 10256919, --4901095, 2705830, 2461553, -7484518, 2456721, -5779952, -2063732, 3711926, 10413148, -1674500, --615791, 3274913, -293132, -9899900, -9362492, -3976603, 9230422, -1192927, -13987635, 908922, --9211094, -4137664, -1960653, -1047972, 3032247, -3604551, -1128503, 3384971, -1043677, 3987877, -3461207, 2464238, -1716913, 3901441, -3620658, -2761127, -2585034, 512712, -480499, -856846, --908922, -779537, -1299765, 699006, -393526, 2474438, -1850057, -1228361, 1008780, -1645509, --985158, -4126390, -4944581, -535260, 309775, 2289218, 244813, 1337882, 34897, 10321880, -10834592, -3311957, 1009317, 11365557, -11555073, -10279467, 8696235, -2077690, 1189706, 7898982, --1559073, -2153926, 7886097, -14601815, 6223408, -652298, 2472291, 7117298, 7332046, -8172249, -1548873, -11230803, 3455301, -3374234, -1206349, -7812009, -404264, -11201275, 1082332, -9707163, -6801081, -3398930, 1283122, 12138114, 5619965, 5441187, -9686762, 1795833, 11238319, -2646774, --15984795, 8590471, -1957431, 1579474, -3150896, -7394323, 10549513, 3811784, 8594766, 2166811, -1239098, -7077569, -9217000, 3337727, 4304094, 4641786, 6120329, 14163192, -476741, -10944650, --7145215, 8535711, -1233729, -9403294, -2485712, -556735, -2576444, -11904576, 183073, 1655173, -2974265, -4297652, 6870874, -326954, 755377, 9806484, 4998268, 10210211, -10023380, -4163971, -1846299, -5480915, 4560719, 2829310, 2792803, -392990, -1276142, -813896, -156229, -3920768, -5044976, -1822140, 3093450, -790274, 3603478, -1411434, -1789928, 250719, 2070174, -1750736, --69256, -414464, -1990717, -971736, 912681, -2157684, -683974, -4613869, -3627637, 1996623, -3206193, 1702955, 1460826, -449361, -380641, -2137283, -349503, 2431488, -3102040, -401579, -1431835, -584652, 2509335, 2475512, -1736777, -657667, 2243584, 1602023, -1167694, 8219494, --10004589, 11718281, -2637647, 12395276, -10122701, 9174587, 1010391, -969589, 15439871, -8065949, -925029, -7829189, -2331094, 23530516, 11358041, 4996121, 3407520, 6692096, -3757023, -31675, --19889994, 3694746, -827318, -8603893, 9543417, 7155416, -293668, 1698123, -11491185, 10129143, --5363878, 10756746, 7054484, 5742908, -8242579, -1452773, -6929393, 10328323, 2384781, -3764002, -18315888, 8749385, -2058900, 958851, -15162308, 2572686, 710817, 12045236, -5405217, -15432354, --2647311, -4272956, -2991445, -21810380, -10858751, -23230404, -11823508, -8305393, 2742874, -5844377, -10975252, 1362578, -12530030, 7561290, -8380018, 11854647, -10562398, -8578660, 6190122, 10559177, -10416906, 30065, -9747965, -7792682, 4783520, -6391985, 250719, -3230352, 3941706, -4388383, --6434935, 11361799, 5281199, 1549946, -1799054, 4280472, 2432562, 5269388, -485331, 3568044, -1274532, 5917928, 125628, -280784, 343061, -2918967, 112206, 1511829, 734976, 647466, -166430, 4557497, 2098629, -3601330, 406948, 2072322, -1130113, -1376000, -863288, 273804, -877784, 2294586, -569083, 1564442, 2673080, -555125, -2699924, -238371, -2944737, -1296006, --2719251, -1755031, 2368138, 162135, -1519882, -14412300, -17111686, -11342472, -1632088, -220117, --2219961, 4067334, 6190659, 4298189, -2684, 2304787, -5430986, 3563749, -11024107, -15368467, -482647, 11781632, 2063195, -4150549, 9428527, 5578626, 9125732, 15359877, 1994476, -4745939, --9789841, -7841537, 4488778, -8987756, -6230924, 2309082, -7111392, -15677704, -8593156, -870805, --1819992, 3660386, -3526168, 8676908, 2521146, 3288334, 12015708, -1931125, 1424855, 2779918, --9591199, 11307038, 1862405, -10468983, -17119740, 4350265, 1538672, -12446278, 13166222, 8542690, --11532524, 3898220, 11067057, 6221260, 2966749, 9185861, -4206921, -3714073, 694711, -5097053, --8150238, 13941464, -12437152, -1393180, 5201206, 1188095, 21675626, -18824842, 5738613, -2412161, --91805, 6055367, 241055, 1292248, -5064840, 2862596, -11167989, -23679228, -1338956, -294742, --12175159, -7743826, -1702955, 4468377, 3894999, 1661616, 992137, -3950833, -130997, -5531918, --2795487, -1079647, -3218541, -4988605, 1694365, -956704, 835908, -2558727, -1881196, 1166084, --4076998, -8646306, -3037079, 571231, -2363306, -8338679, -4670240, 3441880, 2344515, 1625645, --1676111, -3212636, -4017942, -753230, -2033130, -4740034, -3946001, -5586679, -2941516, -3774203, --3800509, -125091, -955093, 1496259, -1509681, -1062468, 3049427, -4175782, -11172284, 9836549, --20196546, -14342506, 10631118, -497679, -18396956, 9430138, -10768557, 20817706, 4153234, -27399744, --3498788, 2491618, -6935836, 2062658, 4760435, 9727027, 8310762, -15913391, -715649, 1491964, --3319473, -14581951, -2275259, -3022046, -5031018, -4443681, -232465, 1086090, 12392591, 13608604, --4239133, 7333657, 6303938, 6193343, 13531294, 181462, 3621731, -15604153, -5390721, 5514201, --3111704, 7551626, 18582712, 2755759, -16310138, -36280124, -106837, -11173357, 10282152, -6842957, --3721589, -7112466, -19632296, 8555575, 26186416, 1558536, 6844568, -20537460, 4231617, -2304250, --9286793, 2390149, 10027138, 5259188, 8085813, -8820252, 12981539, 7665443, -15186467, -22479858, --1461363, -17082696, -16047608, -10166724, -11839077, 1587527, 21087752, 8159364, 750546, -2768107, -13568339, -6864432, -10149008, -1560684, 2090575, -1528472, 2477659, 2175401, 97711, 2204929, -5176510, 1988033, -589484, 467078, -2041720, -1919314, 5430986, -1564979, 5342403, 222265, --3069828, 755377, -1629940, -2167885, 6462315, -1461900, 3482145, -7869454, -1051730, 3993783, --70867, 1706713, 6599754, -4860293, 6027450, -483721, 639413, 1991254, -2075543, 4774930, -636192, 417686, 776315, 374199, 2075543, 6124624, -2536715, 2253784, 2300492, 2484102, -2593087, -39564164, -24974698, 17972828, 14476187, 23538032, -62277, 9288404, 2317672, 7446937, --277562, 4811437, -10397579, -12466679, -7733089, -11158325, -7195144, -7941932, 9589051, 22630182, -4959077, -27557048, -6531035, 4860829, -7303592, 6765111, -15746424, -1249299, -511101, 944893, -7708393, 5855651, 1101122, -1870995, -3502009, 6448357, 12498355, -9972377, -15495168, 10350871, -4934381, 13568339, 6200859, 19711752, -13598403, -4749697, 12584791, 18796388, 16323023, 9683541, -4605279, -3995393, 1249299, -2334852, 84289, 6534256, -24508694, 13211319, -1921998, 3601867, --1611150, 18650896, -5673115, -246424, -4075387, 11839077, 10033580, -20890184, 15015206, -17765596, --894427, -8994198, -8946417, 8157217, 1489280, -27710056, -2455111, -2157684, -5116380, -3198677, --650151, -3510062, 14413373, 1449552, 13786845, -4327717, 16302085, 7723962, -8420820, 3620121, --2104534, 969589, 1056562, 1570884, 2195802, 874563, -3163244, -5186710, 8105677, 3630321, -6651831, 1892470, -3963718, 7694971, 294205, 438087, 5769752, -16141561, -7505992, -7152731, -2266132, -180926, -10996727, 514322, 1838783, -469225, -2072322, 10737, 3769371, -3979287, --170725, 4419522, 2174327, 5378373, -4673462, -2244121, 1318555, 5832566, 21975200, -24447490, --562104, -13895830, -39199092, -4634270, -14467597, -30939870, 6183679, -199179, -6012418, 1946157, -16628503, -1074816, -17575544, 6033356, 710817, -5646809, -4227322, -3132105, 890132, 19164680, --4299263, -702764, 8702677, 6433324, -2756832, 9281961, 8493298, -4088809, -4021700, -7694434, -10666014, -2544231, -18357764, 2808909, -1212255, 6314676, 24064702, -16054051, -25756382, -16240882, --7518341, 3569118, 8600672, 4574677, 18321794, 9160628, -12899934, -7444789, -17597554, 15252503, -9388799, 1705639, 3247532, -10091563, 1075889, -10677289, 18474802, 18126910, 1306207, -8428336, --4679367, 1801202, 16822314, 33556044, 20659866, -3161633, -7475928, 478352, 10696079, 4651450, -9875204, 13607530, -13442174, -610422, -25943750, -17482128, -16661252, -11159936, 7009387, 15963320, -10980621, 1757179, -3147674, -1470489, -14425185, -18149458, -4556424, -9629854, -9073655, 2114735, --1809255, -2294586, 135828, 614180, 4191351, -4597763, 9330280, -9407589, 4032974, -11981348, --3980898, 12885, 2274722, -323733, 2164664, 4638028, -3206730, 578747, 11092290, 13513578, -16280074, 8943733, 10223096, 4641249, 1999307, 801011, 357019, 658204, -2765422, -8714489, --8507793, -1376537, 6752763, 44023, 1114007, -3532074, -2458332, 1083942, 8258685, 5206037, -9843528, 6957310, 8390219, -19150722, -2259690, -9921911, 14396730, -15912854, 3073049, 1387274, -28167470, -17437030, -5116917, -17934172, -3887482, -17714592, -14890652, -10747619, 5542119, -19054086, --13828184, -20718922, -5299990, -3126199, -6349036, -9368397, -23092428, 6023692, -16326244, 6584185, --17128866, 21088826, 3238405, 9446781, -4083977, -19912006, 10650982, 6164352, -6710350, 10648298, -14899242, -8067559, -21455510, -11492796, 28732794, -12289512, -947577, 734439, -4886599, 6313602, -18619220, 3300682, 7914014, -6003291, 13318157, 183610, 10489384, 3197066, 3555159, -326954, -1067836, 22790708, 6899865, 54564340, -33313914, 21263846, 29894582, -7899519, 674310, 15425375, --11184632, -3272765, 25029996, 9921374, -4181151, 13292387, -5694590, -24241332, -17942226, 6090264, -969052, -32388886, -9021042, -3306051, -16829830, 8652212, 5037997, -10930155, -8961986, -6597607, -943819, 2989297, 6853694, -5677410, 803696, 4013110, -1795833, -7191923, 1984275, 1521492, -2267743, 6747394, 1198296, -4091493, 545461, 7817378, 6918656, 3377992, -7744363, -155156, -14251238, -4052302, -3006477, 7923678, -7740068, -13383655, -3818226, 751082, -1741609, -6859600, --2112587, -395137, -7584912, -1552631, 814970, -2083059, -7870528, -12959527, 4940823, 13986561, -5057324, -260919, 511638, -2582349, -8253854, -6565395, 30640296, 34205120, 775778, 24771224, -24680492, -1058710, 11282879, -24239184, -7288560, 22007950, 2385854, 21731460, 30325154, 25001004, --4642323, 16411607, -24810416, -38918308, -16445430, -14384382, 9780714, 347892, 10443750, 11212012, -23963770, 18564996, 6718940, -18418968, -1927367, 18963354, 6364605, -8905615, 12378633, 26039850, --2548526, 9234180, -20676510, 10329396, -16246251, -4245039, -10183367, -21556978, 13732084, 1761474, -6881612, 26360362, -13763760, -15630997, 9783936, 27299886, -20903068, -13987098, 9155260, -6629282, -38579008, 28526100, -26533234, -9926206, -20899848, 1364726, 23678154, -10600516, -15836618, -7169374, -1790465, 5826660, -19025632, 4847945, 39319888, 3023120, -25690884, -39580808, 32455994, -38178500, --31853624, -18658412, -16116865, -27580132, 7765838, 7218230, 44971528, 11319923, 19958176, -9706089, -21672942, -2465848, -8800388, 8194261, 1301375, -1929514, 22218940, 2911451, 11522860, 14055280, -7858717, 16823386, -4439923, 4620311, -3310346, -1260036, -3289945, -13971529, -10085657, -11527155, -13693966, 4846871, 12230456, 14824616, -2945811, 8906152, 19452980, 6949794, -5874979, 9924596, -11800960, 3991635, -2383170, -13848585, -12151536, 12444131, 5567352, 8282845, 16671452, 36328980, -15936476, 9172440, 6987912, 10281615, -5104569, -1211718, 18622978, -11780558, 6689949, -6545530, -6323803, 3681861, -35524748, -20596516, -26735634, 6997576, 14719927, 5149666, 22632868, 20334522, -28725816, 8880382, 31373662, 13983340, 20218022, -10047539, -4019553, -10093710, -24332600, -17466558, --37592776, -22316114, -7303592, -21922050, 4730907, -905701, -665720, 8909910, 7274064, 3358128, -18061412, -4606353, -15148887, 21691196, 1911797, -28789166, -12495134, -3142306, -34647500, -26254598, --25585120, 2330557, 12226698, 3315715, -13361106, -1698660, 14352170, 8873939, 34299072, 6393059, --46342160, -15434502, -8088497, 7367480, 7131257, -5333276, -12358232, 17124034, -25706990, -4764730, --20628192, 15557445, -40454296, -25016038, -33006824, -26453778, 1180042, -14918032, -11600170, -26539140, -13269838, 47679504, -1312649, 30821222, -17182016, 7559680, -22717692, -92342, 33883532, 8096014, --16132434, 1800665, 12994960, -22937272, -35606888, -19127100, 9007620, -27635968, 11797201, -407485, --845035, 17737142, 9182103, -4734128, 20506322, 20498806, 16376173, -5407364, -5738613, -3591130, --320512, 14288282, 10195715, 7216619, 290984, 14901389, 8186745, 2298881, 1885491, 11040750, --4669703, -3772055, 7614440, -11471321, 10302553, -9963250, -9879499, -11725798, 20486994, 12801150, -19040664, 6997576, 7141457, 1697586, 1282585, 9338870, -14387604, -23070954, 1759863, 6452115, -5718212, -9440875, 26409218, 10785737, 26641682, -43562780, 18854370, 32673426, -3211562, 37637336, --19997904, -57510684, -29775398, -438087, -5767068, 6305549, -20622286, 19825032, 28047748, -25324200, -22271016, -13892609, -16986058, -40174588, -16421271, -23105314, -15263777, -18489834, 18066780, 2658048, --35997732, -46090368, 34748432, 7826504, 12432857, -10810433, 2750927, -12505334, 292595, 10537165, -16012712, 14506252, 38909720, 1208496, -27992450, 37738804, -4041027, -9855876, -17584670, 15904801, --31122944, -20912196, 17591112, -16203838, -24253144, -30419642, -26665304, -5723581, 3512210, 2842732, --8266202, 32724966, 27839442, -2724620, -15946677, -27426050, -31490164, 7728794, 6582038, -6216429, --3121368, 44939316, 2982855, -13147969, 19377282, 9306657, -29688962, 23557896, 42742976, -46947212, -75754632, 20233590, 21832392, 8289824, 21986474, -6037651, -46864536, 32044750, 2670933, -5830955, -33251636, -39536248, 6856916, 6934762, -289910, -3830574, 1594507, -3095598, -10995653, 5823439, -11614665, -9743133, -1326071, -14407468, -16596827, 21415244, -4829154, -10522133, 4825396, -5741835, --13234405, -23835994, -5574331, -8109972, 20753282, -20001662, -2128156, 24549496, -5315559, 19615652, --7131793, -17177184, 8803609, -3474092, -8289824, 10149008, 2262911, 27040040, -3764539, -435402, -17815524, 54350664, 23877870, 1275605, -18184354, 25967910, -421981, 1887638, -12452721, 23699630, --27472758, 20076288, 19294066, 20333448, 9842454, -7428146, 26949846, 33803540, -6877854, 13980119, --20928302, 34012920, 14521821, 11404212, -21656836, -47345572, 9460739, -14481556, -10803453, -19183472, --24204288, 14685030, 6595459, -11724187, 2736968, 1193464, -12772696, -57854820, -3583613, -12239046, --5909338, -832150, 40845676, 27924266, -13576928, 10577968, -26856968, 3062312, 20158430, -30668214, --28472948, -23376970, 36980204, -26500486, 7719667, 29717416, -39957156, -37104224, 34254512, 27263916, -28760712, 38416872, 14229227, -49066780, 11112154, 14552960, -4305168, 80217640, -8257612, -12183212, --36203888, -31303332, 16201154, -28853590, 18861886, 6577206, 21329882, 43945032, -28145458, -19209242, -53524956, -32567664, -35935456, 23518704, -46293840, 33704756, -35191352, 8033200, 12156905, -25511568, -10624675, -29619706, 20656108, 37780680, -1503239, 6550899, 7804493, 1393180, -11503533, -10896869, --2432025, 10937671, -4833986, 7371775, -7625178, -23453742, 10090489, 2047089, 15979426, 7868380, -13960791, -4776004, -4592931, -23270670, 16360067, -3175592, -21163452, 4918812, 43736724, 12039867, --11103564, 12798466, 23580982, -11707007, 2630131, 17987324, -8999030, 17931488, 6172942, -5702106, --28037546, 4708895, -10675678, -749472, 35101156, -16086263, 1921998, -9327595, 12139188, 40338332, -3468723, -34213172, 49101676, 12007655, -3158949, 35035660, 17417166, 28366648, 10663867, -41888816, --9134322, -15585899, 19874962, 49069464, -30921618, 8035884, -14788109, 21930104, 25152402, -32890322, -27672474, -26388280, -23760296, 12282533, 22798224, 1114007, 7641284, 17825188, -26629334, 23760296, -1967632, 28965260, -4993973, -7451769, 9513889, 42819212, -19031000, 34626028, -16555488, 7108708, -9140227, 34602940, -1896228, -2077154, 11982422, 52074868, 3553549, -40421548, -3163244, -48696876, -29477972, 266825, 80233744, 17309256, -23278186, -6947110, 17847736, -17564806, 28271622, 52427592, -35931160, 941672, 15352897, 22796612, -2434710, -24173686, -3199214, -5383205, -83471616, 52279416, -39040716, 36025648, 8806294, -36079336, -10699837, 27444304, 14287209, 23917062, 12958453, -79946520, --28492276, 49295488, 13651017, 15994458, 42474544, -29885456, -857920, -4115653, 24106040, 6161668, --2258616, -6444062, 19018652, -4878009, -21745420, 10911364, -10438918, -12457553, 11438572, 16696148, --12197707, -3793530, -352724, 13175349, -16713865, 13683766, -14755897, 7043210, -25575994, -26228828, -26139170, 3414499, 2390149, -2988760, -18873696, -5816997, 17535814, 1890859, 6019934, 29053306, --4404489, -22042846, -2029372, -12529493, 10005663, 10868952, -10400263, -8912057, 11556683, 24045374, -30529702, 31479426, -19498614, 32030792, -29353418, 4917738, 15315317, -15103789, 2131915, 5996311, --8042327, -15772194, -29687350, 45157288, -10150081, -8937827, -15096810, -2568391, -6244883, 14651207, --30408368, -8804683, -19035296, 6485938, -19133542, 18309982, -138513, 9414031, -21095268, -38458748, -1802813, -28123982, -29343216, 13242995, -22509924, -19087908, 37120328, -13785234, -21714818, 2735894, --22326850, 10429791, 14016626, -4130685, -18234820, -5365488, 10626823, 9309878, -8291435, -829466, -32737314, -5878200, -20204600, -25706990, -3690988, -11294153, -38632156, 36206576, 12538620, -44404592, -27318676, -2017561, -18596672, 85270136, 48050484, 39239360, 20856362, 11945915, -20247012, 3114388, -9390946, 10011569, 3826816, 37313604, 8377334, -11123965, -18391050, -75511432, 15407121, 9876277, --363998, -14769319, -28420872, -5659157, -18306224, -16436840, -1172526, 23791434, -16327855, 41187124, -6055367, -8264054, -2876554, -3548180, 3295851, 17305496, -6718940, 4309463, 12189654, 4160213, -2359011, 9447854, -15360951, 7440494, 2792803, 24079734, -8360154, -6066105, -6613176, -6134287, --19122268, -10473278, 7015292, -20956220, 15627239, -4278861, -9947681, 14317273, 9169755, 12032888, --4470524, -1950989, 1648731, 2246805, -13169980, 6876243, 998580, -685584, -1134408, 8560407, --39060044, 65988416, 8433168, 21641266, 11814918, -16337519, 12295954, 18600430, 4662724, -1872069, --15910169, -2775623, 4536559, -7435662, -5624260, 2785286, 7447474, 19210852, -13249437, 8091182, -826781, 15335181, -5362267, 3053185, 5095442, -17577154, 14358613, 2334315, 3595961, 5153424, -5341329, -11133092, 11944841, -9594957, 2494302, 11401528, -6140193, 11178189, -4758824, 14085345, -10976863, 6362457, -17383880, 13064217, 9975598, 7956964, 21811454, -20890184, -1762547, -173409, --4378719, 6414534, -10733660, -17304960, 11954505, 13456133, 6811818, -1640141, 2928094, -1846836, -7066295, -6060199, 2915209, -12848932, 11790222, -19958714, 18937584, 10534481, -6250251, -267362, -7912941, 569620, 7102802, 151934, 881542, -660888, -6688338, 9688372, 13208098, -11564199, --2570001, 2429341, 7371238, -5250061, -5422396, 1537061, 2490007, -1310502, 1410897, -4248797, -1704028, 5405217, -4107599, 1156420, 3278134, -4355097, 3833258, 4734665, -332323, -1521492, --2150705, 923418, 9903658, -3688303, 1373316, -9097278, 647466, 10098542, -7042673, 7517267, --3369402, 571768, 16824460, -2931852, 434865, -353261, -5054640, 8658117, 3650185, 3718368, -3651796, -2735894, 2340757, 9482214, -2659122, 6455873, -4103841, -719944, 12753905, -52625160, --122606824, -19586662, 71805944, 65180424, 160488976, 83813600, -43142408, -13246753, -88809720, -150803824, --10371809, -68522984, -9509594, 109915728, 46970836, 84924392, 130380712, -15144592, -19054086, -66186520, --112542104, -89491552, -5730023, -33614024, -12705050, 93552440, 29700236, 60861296, 110603464, 18134962, --413391, 11467563, -67214088, -101802000, 17530982, -105197168, -68800008, 23377506, -10547366, 17128330, -135453600, 15562277, 51946020, 110599168, -22000434, 3456375, 24684788, -106575856, -88871464, -31478352, --121298464, -46964392, 15484431, 22470732, 83584360, 117725056, 83919368, 59248536, 51615844, -19576460, --71051104, -58331560, -87848184, -92284888, -39557184, -23360328, 630286, 77509664, 92438432, 28973312, -72234904, 21104932, -22857816, 15239081, -50332184, -69939248, -13689135, -32464584, -21749714, 39495444, --1460289, 27559194, 49070540, -13415867, -1079647, 52076, -24839944, -7596187, -1713692, -18570902, -20781200, 7590818, -4843113, 34013992, 10826539, -4804458, 32625646, -11399380, -34973380, 758062, --53425100, -37321656, 11537356, -35474820, 7592429, 41255844, 30258044, 56211996, 61210800, 22373022, -21633750, -2493229, -50493248, -70471824, -72613400, -75746584, -48209936, -3548180, 24310588, 52456048, -90927144, 97675608, 80999328, 63506996, -3823058, -59535228, -85520312, -109204376, -111530640, -59366112, --17980880, 46760384, 98652176, 89492624, 53832584, 40014600, 11560441, -8215199, -13448079, -39270496, --45605036, -34097744, -28732258, -20415590, -4365298, 4234838, 16190416, 24474872, 24661166, 23924578, -20991116, 9780714, -1379758, -7547332, -7346005, -5318780, -2968896, -2348810, }, -}, -{ -{ --4409321, -4645544, 1169842, -2513093, -1113470, -5609228, -1494112, 4714264, -2479270, -1804423, 1459215, --723702, -166967, 308164, -1490891, -1195075, 5713917, 2785823, -683974, 290984, -838056, --1690607, 796180, 2050847, 3149285, -788663, 1211181, 1461900, -5037997, -1535451, 1074, --989453, 3107946, 294742, -1051730, 2800319, -2114735, 955093, 4337380, -2386928, 285615, -592169, 3295314, -1253057, 4540854, -6410776, -2333778, 2807298, -1263794, -5432060, 399432, -1105417, 1821603, 1874216, -580357, -2334315, 209917, -2117419, -1439351, 644245, 2703145, -2491081, -3621194, 3202435, -3963718, 3555696, 209380, 3118146, -1204738, -2568927, -1134408, -2098092, -397821, -522912, -623844, 2902861, -3117073, 1610613, 768262, 783832, 995359, -2321967, 745177, -1489817, -1682017, -930397, 1265405, -272730, -1234266, 238371, -1490891, --330176, -102005, -1525787, -607738, -860067, 202937, 821413, -1028108, -740882, 427886, --211527, -1471563, -15569, 804233, -573915, -73014, 300111, -135828, 576599, 420907, -41876, -1111860, -373662, 41876, -505732, 30602, -124554, -779000, 436476, -1320703, --15288473, 5019743, -5557151, -2214056, -4549981, -4671851, 2656437, -1557999, -3944928, -2119566, -5366562, 7975755, -4361540, -1623498, -387084, -5743982, -5397164, 404801, -545461, 3509525, -1182727, 2614025, -2302103, -1441498, -2982855, 840740, 5148055, 2234994, 1001264, -3318936, -2517388, 761283, 1540820, -2166274, 192200, 760746, 1156957, -2943663, -2152852, 805843, --4063576, -4154307, 1782948, 3151432, -3542274, -1782411, -1365263, 255014, 3141769, 2532957, -1096290, 477815, 8125005, 3190624, -2565706, 3163780, 2253784, -2257542, 3838627, -1430224, --962610, -21475, -1673427, 3411278, -1920387, 896038, 2056216, 1647657, -3036005, 1196148, -566936, 614717, -1061931, -1505386, -632434, 4765266, 317291, -1412507, -1021665, 1124745, --4287988, 830539, 2553358, -165893, 1653026, -944356, -1545115, 1036161, 944356, -399969, -1606855, 827855, -458488, 1140314, 1194001, 1996623, 259846, 6979, -141197, -600759, --849330, -85899, -152471, -531502, 587874, -188979, 1990181, 11633456, 4636417, -812286, -525060, 2665027, 1391569, -788663, -5030481, 161061, 4458713, -4577899, -513785, -8590471, -2252174, 3496640, 230854, -2047626, 6276558, 4413079, -4049081, 1954210, 235149, -3549791, -5600638, 3087545, -367757, 2261300, 5336497, -1656784, -1105954, 355409, 28991, 126165, -1279363, 6554657, 1317481, 977105, -10602664, -562104, 479963, 1264868, -4799626, 1108638, --3871913, -2971581, -4095251, -2675765, 21475, 1229434, -2503429, 2498060, -6092948, -3499862, --374736, -82678, 1950452, -2442226, -571231, -2211908, 1319629, 3296388, -1997697, 352187, --1729798, -316217, 5110474, 4003447, -1618129, 3751654, -1801739, -3202435, -4001299, -302258, --374199, -2698850, 2434173, -430570, 692564, -301185, -891206, 180926, -577136, -2188286, --141197, -3485903, 391379, -1717987, -1123134, -2928631, 3393024, -1043140, 1155346, 2317672, -917512, -1183264, -275952, -1328219, -98784, 583042, -1306744, 1346472, -111669, 146029, -192737, -481036, 790811, 458488, 248034, 99321, 1918240, 921271, -619549, -1308891, --1193464, 1159104, 1560684, -5906, 397284, 18367428, -7986492, 1513976, -667331, -3384434, -2921652, 5151277, -3338263, 5537824, -299574, 5906654, 1641214, 2087354, -2539400, 3349538, -1298691, 3430068, -7220377, 3874061, -4267050, 1340567, -3583077, 4536559, -1232119, 4569845, --2678449, 1684164, -1753420, -392990, -195958, -457414, 1801202, 9492951, 426276, 2789581, --2619930, -4395899, 192737, 88584, 193274, 1447941, -3041374, 6228240, -387621, 5221607, -371515, -2253247, -2845953, -7824894, 3854733, 2553895, -3651796, 411780, 3146601, 1670742, --9108552, 5449240, -297427, 3875134, -5466420, -5893232, -2851322, -5740224, -1043140, 6642704, -1392643, -2540473, 408559, 3759170, -1250909, -3010772, -1553168, -3376918, 2433636, -5121749, --889058, -3928821, -1488206, -14496, 4423817, 2076617, 499827, 1380295, 5551245, 2913062, -695248, 2028298, -1545651, -612033, 389768, 106300, 905164, 467078, -933082, 546535, -1974611, -130997, 444529, 733366, -920197, -1272921, 1249299, -1523640, 1841467, 1079647, -1708860, 45634, -617938, 1039919, 1693291, 441845, -665183, 550830, 4801237, -11261404, -2295123, -3550864, -10289668, -7931194, 4216048, 4702453, 6188511, -3063386, -1592359, 4260608, -2035815, 6367289, 2073396, -710280, 651224, 4064113, 7918309, -2027225, 2308008, -96637, -6416145, 1476395, -392453, -1286343, -4896263, -7444252, 80531, -1069984, 2237678, -420907, -1752884, 1305133, 454193, 478352, 1482301, -2541010, 285078, 3541201, 5538361, -2709051, -658204, -2387465, -3182034, 4576825, -3511673, -8744017, -3438658, -2238752, 4202089, 352187, -4636417, 4240207, -2246268, 188442, -3628711, -503585, -1557999, 5430986, -6838125, -196495, -2304787, -7240241, -8150774, 127238, 2518998, 5163625, -3598646, -8621073, 4501663, -7954280, -9303436, 5259188, 1531693, 3968013, -93416, -3828427, 11826192, -1073742, 5724118, -216359, -8272644, 5689758, 3024731, -840203, -1612223, -2772402, -1021665, 1253594, 300648, 2289218, --2338073, 1428077, -1241782, -843424, -877784, -952409, 1123671, -591095, -19327, -1748052, --79457, 1087164, 1996086, -1999844, -2450279, 351650, 1086090, -10201, 1305670, -725850, -154619, -953483, -308701, 683437, 1234266, 1519345, 906775, -1183800, -24921548, 5126044, -1252520, -12519830, -15799037, -2546916, -12199318, 9904195, 2830384, -7357279, 451508, -3427921, -1094143, -5025649, 634581, -294205, 49929, 6979859, -2505577, -1636383, -2922725, -2578054, --6598681, -4424890, 6602976, -2736968, 4172024, -3688303, 1800128, 104690, 3768297, -3850975, -2851858, -3868155, 1675574, -1483911, -2420214, 2386391, -6170258, 2362232, -3146064, -1132261, --4487704, 10817412, 5142150, 9484362, -4054449, 3998078, 3211562, -1887101, 1679869, -4496294, -4759361, 10401874, 8217346, -5731097, -1542967, 2436320, -4155918, -2787434, -7270306, -13591961, --4617627, 6969658, 2500208, -3353833, 1372779, 715649, -3709778, -6455336, -6522445, 4634807, -534723, -9989020, 1058173, 966905, -493384, -744640, 3311420, 7247221, -740882, -4832, -1012002, -3758, -1906429, -6601902, 2185602, 2230162, 1358283, 3090229, 1868311, -2822331, -728534, -1775432, 368830, -1500554, -606664, -1660542, 42950, 379031, -199716, -1200443, --1170916, -349503, 515396, -33823, 2428804, 873489, 2267206, 2458332, 2656974, -3177202, --3230352, -1205812, 2440615, -823560, 896574, -945967, 1348620, 1418950, 913754, -1545115, --874026, -9754408, -4061429, -2529736, 7379291, -1940252, 1758789, -7597261, -7928510, 406411, -2311229, -4633196, -2652142, -4345970, 9042517, 2008434, -3016141, -6573448, -6491843, -6340446, --1756642, 3076270, 9083319, 2965138, 5138929, -4049081, 9672803, 5541045, 1792075, 134755, -9948218, -5777805, 961536, 3173981, 6740415, -10850698, -5519033, 4777078, 1932198, -1470489, -11361799, -4924717, 3231426, 6874632, 2150705, 1185948, 5022428, 2068564, 2513093, 2584497, -1111860, 2973191, -139050, 4362613, -973884, 10638634, -7676181, 8763344, 6959995, -5994701, -6892886, 1312649, 5863167, 5947456, -12927315, -297427, -490700, -3855270, 2100776, -3472481, -3620121, -1423782, 8289287, -852014, 1324997, 3436511, 2348273, 3328600, -5243082, -1717450, --5359046, -4936528, -2837363, 8073465, 1221918, -2500745, 2392297, 2266669, 1043677, -1296006, -857383, -899259, 3182034, 1257889, 1023813, -1469416, 993748, -2950106, -258772, 3564286, -1843078, -505196, 1182190, 1305133, -963146, 1541356, 1009854, 3462281, 1887101, -1824287, --735513, -1054951, 1051730, -2953327, 895501, 13029320, -3384434, -1966558, -3135863, 9292699, -4901632, 1034550, 3574487, -6207302, 13874355, 4626217, -1044214, 5265093, 6726456, -11243688, --709743, 2717104, 1368484, 28991, 9601399, -4549444, -5753109, 13191455, 2035278, -889595, --1258962, 6913824, 574989, -955093, -1241246, -3149285, 3475166, -1937030, 4619238, 3257196, --8234526, -7808251, 1034013, 15560667, -134755, 3208878, -9523553, 4766877, 6424198, -3921842, -4776004, 5903433, -9656160, -5887327, -1168768, -12396349, -6548752, -7384123, 2233920, -2507187, --2706903, -1328756, 8796093, -11954505, 5348845, 2641405, -3839164, 7355669, -4634807, 737661, --10020696, -177167, 6140730, 5504538, 11514270, -13514651, -3316252, -15008763, -3177739, -275952, --3528853, 1714766, -686121, 13708999, 10671920, 6038187, -6761353, 372588, 2673080, 6691022, -8258149, -168041, 84826, -1150514, 222801, 4684199, -178241, -388695, -140123, 97174, -283468, 579284, 1943473, -1916629, -557809, 1960653, 374736, 1811403, -14496, 206158, --1524177, 2480344, 1576790, 34360, 2376728, -1179505, -99321, 2172180, 632434, -374736, --2646237, -185757, 658204, 386010, -911607, 2777233, 4720169, -861678, -78383, -2116345, -1595580, 8907225, -9888625, 377957, -6040335, 17067664, -7141457, -4081293, 14803679, 11172284, -2113661, -20521890, -4962298, 9516037, 821949, -937377, -2874407, -1569811, -1548336, 1488206, -3243237, 2957085, 2821794, 18278844, -3745748, -2595234, 73551, 2429341, -5374078, 3252364, -1995549, -632434, -5919539, -3711926, 6645388, 7096360, 13408351, 3458523, -5428839, 3418257, --107374, 3463354, 314069, 7449621, -6103686, -9160628, -9421011, 6255620, -2637647, 1341104, -2538863, -3349001, -561030, 15881715, 5478231, -13320841, 9572945, 3077344, 16108275, -8301098, --7793755, 4681515, 8704288, 6006512, 3395709, -1435056, 573378, 4167729, -5156645, -1460289, -241592, 6851010, -4867809, 13722957, -424128, -147640, -7004555, -7936026, 15715822, 4691178, --12769475, -2965138, 10854993, 7518341, 1562294, 2747705, -6465000, 2085207, 1813550, 2142115, -1268626, 2373506, -2931852, -3614752, 563714, -74088, -2936147, -962073, 2880849, 2789045, --3949759, 1102733, 79457, 1794760, 2499134, -634581, -619549, -956167, 1717987, 4848481, --3391951, 2687576, -132070, 153008, -1947231, -440771, -1423782, -993748, 2403571, -762894, --1241246, -3090766, -6979, -1735704, -12320114, -10470057, -4148402, 3668976, 3762928, 18720152, -18159658, -2238752, 1349157, 700080, 9664, -315143, -3912178, -12379169, -9547175, -4967130, -4209605, -3526705, -10814728, -3127810, 1889249, -893890, -16509317, -4911832, 3481608, -1773822, -1404991, 1032403, 4772783, 7109782, 1017907, -5318244, 5163625, 5442261, 3740380, -309238, -7019051, -14445049, 4655208, -12807592, 15695421, -11336566, 4173098, -12021077, -2139431, -13419088, --7209640, -8393440, -9156870, 6087043, -8073465, -1606318, 2616172, -178241, -4384088, -3112778, --1553168, -13117367, 257698, 780610, 6298570, -20432770, 307627, -599148, 9323300, 11348377, --7929047, -4829691, 253940, 8705899, -17016124, 10723996, -7752416, -5071283, 639950, -16445967, --1033477, -1387274, -2752000, -2990371, -2237678, 16369731, 6507949, 3317325, -4131222, -3748970, --4315369, 458488, 3831648, -6635725, -383326, -1199370, -1977296, 826781, 4645544, -1859721, --3323231, 3023657, 1671279, -112743, 3193845, 1799591, 2639258, -1781338, -2430415, 4093104, --3209951, 1025960, -4141959, -784905, -53150, -828392, -1716913, -3489124, -4039417, -4063576, -739808, -244813, -1120450, -2932389, -2995740, -1144072, -1698123, 893353, 3857418, 2967286, --9756018, -25290914, -10154913, -4878009, 4305168, 6730751, -8361228, -3208878, -10496363, -9257802, -4746476, -8142721, 8211978, 3306588, 5869073, -1073742, -8286603, 14220100, 5574868, 7928510, --10334765, 4254165, 1752884, -14981383, 9093520, 5432597, 426276, -10228465, -4028679, 4915053, -5181878, -333934, 1701344, 7132867, -7209640, -5323612, 8375723, -17062294, -16874390, -22086870, --5083094, 6968585, -19452444, -16210280, -9926206, 217970, 6789270, 2109903, 1799591, 228707, --5747203, -7807714, -18391586, 9513889, 2547989, 21988622, -5454609, 474057, -13852880, -16465831, -1903744, 10459856, 550293, -10428717, 6633040, 2654827, 14882062, 1372779, 1710471, -7397545, --1571421, 6280853, -14966887, -27712202, -7888245, -6999186, 1296006, 7153268, -13416404, -6795175, -4117263, -4720169, -1270774, 4220342, -2755759, -2315524, 5480915, 1306744, -716186, 2710661, -4207994, 4842039, 733366, -3390877, -8990440, -885300, -5571110, 1374926, 755377, 1047972, -3419331, -3216394, 3085934, 4457639, 2801929, 2498060, 2310156, -6565395, -6189048, -2311229, --5366025, 521839, 1228361, 1680406, 5859946, -1473711, 3635153, 2345052, -2811593, -1360968, --3985193, -5073430, -1625645, -6672232, -2418067, -1515050, -23607824, -18145700, -8351027, 12451110, --1092532, 21324512, 4210679, -1857573, -11978664, 4250944, 21978958, -23024246, -20717848, -6860137, --3445101, -14448807, 13673565, 3985193, 7410429, 8827768, -14452028, -1746978, 5805722, -9137006, -17059074, 217970, 3844533, -4999879, 4219806, -11307575, -6416681, -3915400, 6427419, 3000035, -10383083, -17040282, 1540283, -182536, -12641699, 13769128, -8243116, -20274930, 4020626, 7223598, -1497333, -6103686, -1439888, -8487929, 1420560, 6817187, 2962454, -13893682, 5448166, -3227131, --15312632, -9154186, -18818936, 335007, -2894808, -589484, 2491081, 11478837, 14426795, 11866995, --6069863, -10531797, 3502009, -2757369, -1702955, -8171176, 15021111, 12255689, -2594697, 22865332, --14593225, 7544647, 14559402, 15479599, 493384, 9793599, -6345278, -2660732, -12785044, -5575942, -7775502, -2754685, -9934259, 6110665, -5651640, 6424198, -2837363, -6984691, 3670050, -1504312, --3811784, -3133179, 2728915, -3481608, 2398739, 4475356, -4751308, 6122476, -649077, -3578245, -2467996, 591095, 537945, -3008088, 3809099, -5754183, 2049773, 1928440, 385473, -3904662, --234613, -2392834, 3003793, 5013301, 11426760, 5523865, 9168681, -644245, 102542, 4431870, --5545877, 1352378, -7587597, -3360275, 8602819, -20468204, 2574296, 220654, -12945568, 1864016, --28779502, -24899000, -5970005, -240518, 1058710, -649077, -10239739, -382252, -2937221, 9176198, -1783485, -605054, 1715303, -21757230, 7501698, 4028143, 12051678, 4978404, 5214627, 14142254, -7047505, 2022930, 35442072, 7554311, 13630079, 18781892, 870268, 13236552, 3315178, -7400229, -8605504, 577136, 4138738, -7250442, 529892, -4717485, 2998424, -4704063, 9964324, 1163399, --6212670, -7793218, 1059783, -21077016, 12220793, 8208756, -1079647, -1948305, 4799089, -5636608, --4647155, -6948184, -8339216, 6906845, -6653978, 11442867, 13366475, 13054553, 13932874, -3287798, --21129628, 284005, 8909910, 21248814, -4948876, -841814, 10086731, 14820858, 21915608, -2902861, -9651328, -6549825, -3766686, -17678086, -13743358, -6070400, -6241125, -5099200, 3670587, 693100, --7561290, 8483634, 5391795, 6648610, 12048457, 4747550, 4511327, -1518271, 6979, -1866163, --3458523, 17717, 2167348, -77309, 6353867, 4992363, 3101503, -457414, -5226439, 205085, --3757023, -4254165, 2644626, 3120831, 956704, -6612102, -1475858, -9569724, -2315524, 2967286, -4669167, -3154654, 3877819, -5535676, -6302865, -3316789, -3809099, 3354370, 1797444, -5680094, --3825742, 17408040, 22578644, -16698833, -17476758, -23106924, 20958366, -2110977, -8340827, 7339026, -7110319, 19632296, 16386374, 1173600, 17959406, 25475598, 7348689, -12779138, 12293807, -11814918, --6535867, -2331094, -8200167, -9891847, 5374615, -4915053, -4810364, -11962021, 27759984, 3612068, --14500883, 162672, -1804423, 12523588, 13251585, 5326297, -8400956, 13350906, -3379603, 8310762, --25031606, 1504849, 10693395, -10643466, 3833795, -11580306, -9382356, 26239566, 11033771, 8046621, --1606318, -22891638, -5392332, 6873022, 5191542, 3928285, -5254356, 18560164, -12691628, 10400800, --5845988, 6947110, 7661685, 14747844, 19885162, -22638236, -373662, 11939472, 5927592, 16702054, -16224776, -22571126, 287763, -6101538, -11577084, -539018, -12117176, 5281199, 9679246, -4399121, -17352742, -3653407, -10008884, -12219719, 10887742, 12443057, 12406550, -3147137, 2347200, -505732, --17455284, -16906066, -15823733, 10136660, 5220533, 3372623, 8206609, -335007, -4249334, 12269648, -1877975, 117038, 7613367, 11893301, 7297150, 1078574, 1498944, -3271691, 7326141, 3740380, -15179488, -1214402, 2025077, 10711112, 8744017, 3124589, -1278290, 6919193, -3758, -1201517, -12032351, -9279277, 717260, 7493108, 789737, -1994476, -3350611, -1609539, 187368, 8083666, -1697049, 770947, 8898635, 6541772, -5385889, 17271674, 34621196, 1280437, -16852378, 4491999, --11338714, 6994891, -9881109, -10639171, 31417686, -24217174, 39500816, 24108188, -6055904, 7795903, -18992882, 2576444, -30118458, 11553462, -24422794, 5568962, 1984812, -12176769, 343061, -1834488, -17151416, -8866960, -1030255, -870805, -5427765, 36383740, -2255395, -5704791, 4565550, 12115566, --12614856, -26539140, 20637318, -3535295, -1726040, 23473070, -14061723, -4067871, -16712791, 4220342, --11715060, 13159780, 12217034, 24988120, -7341173, 6825240, 16729434, -24120536, 2823404, -15451682, --24152748, -30967788, -16271484, -33467458, -37478420, -5460514, 2330557, -17825188, -19016504, 11491185, --1408212, -10855530, -20485920, 14487998, -10975252, 3592740, 18447958, -35144108, -10135586, -6659884, -15433428, 41492604, -19805704, 964220, -12586939, -18776524, 8938901, -22422950, 17820894, 30852898, --8907762, -14796699, -15436112, -4153770, -3707631, 31139, 10078141, 7153805, -8207146, 7967165, --1039382, 6205691, 373662, -7829726, -2144263, 8833674, -15115601, 6818261, -7908646, 1794760, --6430103, -2777770, -9076877, 1774895, -8716636, -13908178, -6501507, 2911988, -10047002, -335007, -3107946, 14602352, -8551280, -5355824, 4982162, 5821292, -10687489, -7051800, 3161096, -3263102, --5638219, 10072772, 1942936, -8488466, 7402376, 1711545, -12443057, 2116345, -10230075, 11168526, --5106179, -16229071, -23997056, -18205292, 20045686, -16488379, 8060043, 19100794, 8115341, 12255689, --22893786, 32797444, 20583094, 17875654, -13278965, 23500988, -2655901, 15534360, 10145250, 3435974, -8400419, 11400454, 6870874, -3855807, -5943161, -5255966, 2277407, -15830713, -18749142, 10481331, -4533338, 6080600, -15446850, 4171487, 4561792, 11482058, 17013440, 25756918, -14670535, 3894462, -36531380, 7901666, 3804804, 3541201, -7686381, 2689723, 36361728, 10588705, 23499914, 6740415, --25441776, -10535018, -18571976, 52997748, 21376052, -20480552, -12992276, -18265422, 2921652, -11984569, --28969018, 6617471, -21987012, 32454384, -2462627, -26859114, 35174708, 28676960, 3896609, -7791608, -4636417, -16345572, 21575768, 38924752, -10626286, 18463528, 43301324, -6846715, -7307350, -4952634, -26264798, -1920924, -14866492, -13732084, -14215268, -229781, -1976222, -12167642, 708670, -5098663, -13084081, 3335042, -13120588, -8084739, -14914274, -1580548, 1694365, -2371359, -10554882, -11412265, --8446053, 7168301, 11713450, 1893544, -12896713, -1815697, 15597174, 133681, 14251238, 7698192, --8584566, -725313, -13125420, 12506408, 5173288, -16387985, -31295816, 2844342, -2441152, -9350144, -9678709, -74088, -5866926, -4391067, 2665564, 842350, -1742146, -25120190, 9963787, -3449396, -24899000, -52100100, -35747012, 20605106, 9856950, 7452842, 17495550, -17781164, -23175106, -12764643, --19088446, 10777147, -20480552, 5966247, 13591424, 22327388, 737661, 18710488, 10897406, 3070365, --5974837, -19588272, -13820668, 11402601, -23949274, 12181601, 2814277, 20388746, 15560130, -7638063, --29806536, -19386408, -1803886, -1498944, -7883413, 20390894, -36029944, -2803540, 1257889, -37740416, --730144, -4657892, -3010772, 4027069, 22091164, -21537114, -59304372, 22126598, 24169928, 14394046, -46261628, -38096360, -4885526, 25685516, 19663434, -23917062, -11101954, -6608881, 36442796, 7157026, -34786552, -50331112, 7348152, -60038276, -35940824, -34813396, 41266044, 13054016, -26603564, 24202678, -2842195, -23365158, 23756538, -34943852, -36643588, 5457293, -38056096, 11274826, -65016140, 9907416, -20539070, -27724550, 30476014, -13836774, -7323993, 20340966, -7008313, -5623723, -14485851, -1089311, -4820564, 11204496, -1313186, 10409927, 20540144, -15468325, -1657857, -12307766, 7335268, -8053601, --2095407, 4436701, 2563559, 2707977, -2661806, 21087752, -6965363, 1665374, 9089761, -18697604, --16359530, -18158048, -8380555, -30549566, -13948980, -11202885, 26337276, 5151277, 23450522, 10020696, -4792110, 10575283, 7481296, 901943, 8927090, 1828582, 18282602, 44980120, 16646219, -16108275, --10515154, 6208912, -11420318, -13401372, -1590212, 20929376, -3628711, 3911642, -22243636, -4602058, -30741766, -22428856, 17009682, 40137544, 20080582, -1706713, -7650411, -13201656, -25658672, -18879066, -22130356, -12606266, 20767778, 14955076, 7136625, 974421, 8117488, -6406481, -32631014, -11331734, -23374822, 18503792, 19432042, -20663088, 35665408, -9185861, 13882945, -26358752, 24157580, 41525356, --8331163, -14808510, -1504312, 1509144, -9205726, 9059697, 18199388, -34099356, 22405234, 21680458, --5277978, 25134686, 13372918, 10831371, -15917686, 3268470, 22546430, -47553340, -42282880, -17661980, -11257646, -21911850, -64287608, 26923540, 17700098, -8383240, -10868952, 449361, -3725884, -22079890, --59044528, -3620121, 42016056, 10139881, -7412577, -5069672, 9118752, 34315180, 27427124, -40395780, --16588774, 26859652, -5641977, -10878615, -46061376, -2754148, 25361782, 8339753, -7041599, 15528991, --5738077, 1577864, -17310866, -2925947, 10633265, 15792595, -8952859, -3342558, 3330747, 9096741, --5617281, 5567888, 821413, -11356967, 6841883, 19211388, 3389803, 5674726, 3676492, 8623757, --9016210, -16028818, 1625108, 17147656, -14049912, 6099391, -4698694, 1453846, -13625784, -26483306, --14281840, 9738301, 32196148, -3372623, 15247134, -21363704, -9276056, -14473503, 8964670, 6155225, -10207527, -7346005, -10937671, -865973, 2374580, -1056562, 21913996, 29035052, 683974, -32659468, -43335148, -12127914, -30188788, 27120034, -4312147, -16409459, 20970714, 5637682, -4343823, 17692580, --24173150, 22996866, -8167417, 804770, -7002408, -5981279, -33714420, 13398150, -12846247, 5349919, --13493177, -1084479, -10049687, 9696426, -5872294, 36509368, 6484327, 23895050, -9247065, 5997922, -15123117, -6376416, 10463614, -2038499, 18258442, -887448, -6086506, 28834800, -25703768, 14389214, -19723564, -11528766, 22318798, -13615583, -520228, 11489574, -8684424, 26217554, 23488102, 4900558, -39064340, -24031416, -55079196, -9253507, -34044060, -22524420, 80519360, -2028835, 24725052, -3736622, --33938296, -854699, 33845416, 47907140, 29145648, 48257180, -25920664, -7744363, -11599633, -27524834, -18291192, -7715909, -16973710, -1758789, -33401424, -61081416, 15404437, 21524766, -18058726, 12191802, --3780645, -18212272, 19477140, 14341433, -7100118, 20055886, -7344931, -17882634, 9213779, -8873939, -23786066, 2247342, 1794223, 13437342, 4495757, -15131170, -6334003, 7803419, -4971962, 14804752, --20622822, 13326747, -21625160, -5501853, 5406290, -15348066, 9810779, 627065, -23043574, -3725884, -1493575, -6180995, -53150, -4298726, -16909824, 6935299, 5073967, -2681670, 16981764, 26045218, --14192183, -20293184, -1303523, -9671729, 28159416, 28940026, -17054778, -10782515, 24560234, -25841208, -31070868, -18720152, 4296041, -38118, 3242700, -23838142, -3670587, -21558588, -17835926, 87510, --7019051, -16256988, -6475200, 11965779, -13882408, 11029476, -6547678, 33411624, -15441481, 10000294, -2047089, -8271034, -26783952, -9804337, 20442434, 3719442, -6659347, 26798448, -19782620, -19965692, --2704219, 25591562, -23225036, -3220689, 4582730, 6966974, -25869124, 7823820, 9013526, -9226127, --27052926, 517544, -21003464, 8938901, 4800700, 8096014, -41362684, -17656610, 23620710, 63696512, --28806882, -3949223, 5145908, -10713259, -17961554, -320512, 53201760, 12291123, -5404680, -4638028, --14042932, -3230352, -10750303, 20668994, 1098438, -13131863, -14128832, 781147, 9556839, -21166136, -16577500, 4951024, 18071074, 765578, 22979686, 9694815, -15984258, 21609054, 20599200, 50972672, -16237124, 4003983, 5281199, -18542984, 6252936, 16714939, 17256104, 6007049, -1155883, 723165, --2025614, 6489696, 7221988, -1617055, 9317395, -2314987, -894964, 17666274, 7531762, 3102577, --5203890, 5290326, 13378286, 14099304, 16167868, 5932961, 5977521, -8937827, -1074, -433792, -3018825, 9197136, -304406, -7115687, 8336532, -7459822, 6950331, -232465, 8189966, 1319092, --6585259, -1743757, 623844, 1967095, 4119411, -856846, 2975876, 2301566, -20401, -40421012, -53762252, 7452305, 12267500, 12923557, -12372190, -14274324, 552440, -5484137, 7679402, 17725330, --24817932, 8253854, -5202816, 6487011, 6089190, 4234301, 14206141, 11108396, -10557566, 9988483, -8705362, -8578123, -14800457, 4558034, -5224291, -12291123, 7417409, 6074158, -997506, -8030515, -272730, -5849746, -2806761, 585726, 3246459, 5670968, -11054709, -1635309, 8937827, -3955128, -8027294, 1539209, 5805722, 11681774, 3502546, -11908334, 1298691, 11145440, -6270116, -576063, -5450314, -18940268, -1097364, -4680441, -17606144, 24427090, -6156836, -1018444, 14551886, 2486786, --10842108, 4301947, -10358924, -2104534, 8123931, -9767293, -3470334, 18054432, -19114216, 2046015, -1788854, 6558952, -8456791, 5804649, -2858838, 5408975, -7243463, 333934, -1698660, 18183818, --8230768, -827855, 4816269, -9199283, -810675, 12584254, -2582886, 8108362, -5464809, -5229123, -1019518, 4869419, -4716948, 9277666, 19327, -2048699, -1934883, -2949569, -2835215, 7909719, --6660958, 7741679, 4337917, -10218801, 2552284, -1052804, -770410, 5992553, -8392366, -3432753, -1348083, -5681705, 6002754, -5844377, -743029, 9589588, 1843078, -1820529, 4497368, -4849555, --3719979, -2364380, 4795331, 7993471, -2345052, -2331094, 1008244, 12678207, -53141092, -108196128, --13875966, 68014032, 52310556, 150069376, 72237056, -34910032, -30489972, -71061848, -124499288, -15686831, --48227116, -14926085, 88015152, 56127708, 59914792, 114534432, -3943854, -25276956, -43110736, -113146616, --62423056, -20043002, -20966956, 3214246, 51605104, 39977020, 42436960, 79962088, 46821584, -29311004, -42665668, -44688596, -104346232, 13426605, -70007432, -97436168, 38101728, -8307004, -17994302, 119955752, -39348344, 31936840, 103408856, -11025718, -20253456, 31518618, -69177424, -85980416, -23068806, -73613056, --65775812, 14023068, 14348412, 29837138, 90232968, 79915384, 48446696, 57337812, 11153493, -45105208, --48569636, -60146724, -82680264, -38579544, -20929376, -28058484, 25088514, 79808544, 52138220, 51483236, -42349988, -29742648, -248034, 8473970, -68223408, -28097140, -17042430, -19937238, 31403190, 16087874, --3851512, 25670482, -5867999, -5274757, 4455492, -18371186, -13819594, 9151502, -11340861, 18617610, -23424214, -8651675, 12737262, 23848342, -13800804, 15639050, 7873749, -46439872, 8305393, -15043660, --50401440, 828392, -28751048, -25751550, 36792836, 39786428, 38449620, 71159552, 22749904, 22677964, -24196236, -31077310, -62017180, -69293392, -88681408, -66090956, -19865834, 11611444, 53906136, 89234928, -98915248, 77219216, 56332256, 11134703, -52264384, -78809432, -96182032, -89429272, -46296528, -2950106, -25303262, 64063732, 59192164, 32273994, 32499480, 12581033, -866510, -256087, -9987946, -19697256, --16267189, -20473036, -24694988, -18291728, -13554380, -3812320, 6594923, 16110422, 19504520, 20598664, -16960288, 9419400, 2436857, -2137820, -2969970, -1813550, -957778, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --1056562, -2688113, 4654134, -3479997, -3011309, -4655208, 4212826, 2098629, 365072, 6233072, -625992, --79994, -1909113, -1544578, 1350767, -1669669, -3251827, 1826435, 525060, 5205501, 7114077, --1854889, -4189741, -5160403, -327491, -2951716, -2844879, -1952063, -398895, -4110821, 3954591, --1473711, -1555315, -2720325, -2006824, 756451, 4443681, -465467, -1285806, 1341640, -4370666, -3274913, -2727304, -9797894, 4855998, 3226594, 5394479, 5596343, 1063541, 2945811, -2925410, -828929, 4240207, 328565, -53150, -1023276, -565862, 2274722, -2071248, -1494649, 104153, -2162516, -1798518, -2238215, -3278671, 4190814, 1662689, 515933, -1023813, -4196720, -147103, -3134253, 1945620, -599685, -796716, 3139621, -383863, -231391, -1370632, -1294396, -1919850, --2271501, 139586, 477815, 1076426, -2337536, -927713, 1298154, -1620813, 1401770, 376883, -627602, -607738, -39192, 302258, 683437, 169651, -272730, 426276, -298500, -801011, --259846, -1324461, 877247, 448824, -378494, 16106, -598611, 785442, 811749, 259309, -80531, 302795, 287763, -825171, 29528, -163209, -200790, -324807, -111132, 457951, --14710800, 7640210, -745714, 195421, 2642479, 3732864, -5495411, -718333, -1006096, 3100430, -1164473, -3371013, 10423349, -1142461, -671626, 4625680, 3791919, 1225139, 2623688, 8505646, --4245575, 245887, -2176475, 832150, -2649458, 191663, 242129, 937914, -4759361, 386547, --1161789, -1801739, -227633, 2956011, -1665374, 2747169, 4002910, -6968585, 911607, -2844879, --793495, -4298189, 2109366, -2558727, -461172, -1453310, -4372814, 1642288, -2942590, 1963874, -1064615, -2170032, -3190624, 82678, 2913062, 2193118, 5315022, 2450279, -2335389, -6577206, --467078, 1138703, 8244190, -2582886, -1283658, -109522, -1639604, -4329327, -2084133, -4031364, --569083, 3312494, -781684, 3947075, 2525441, 2031520, 2850248, 501437, -5202279, -1226213, --3358665, -2134062, -5774584, -212064, -1666984, 757525, 1528472, 663572, -885300, -1187022, -166967, 1501091, -1326071, -373125, 5369, -485331, -151934, -547608, 578210, -1992865, --709743, -484258, 26844, -209917, -398895, -11811, -2814277, 10711112, 5579163, -1750199, --4333622, 6123550, -7182796, -1211181, 3971771, -2976949, -2149094, -3104188, 7067906, -2515240, -2173254, 572841, 2146947, 9653476, -9735080, 2869575, 4853850, -3264175, -9010841, -4716948, --629750, 536871, -1290638, -1654636, 3755949, 5453535, -466004, -3913789, 279710, -4952098, -1453846, -3121368, 1726040, 5825050, 2134599, -5913633, -166430, 329639, 8756365, 1609539, -4379256, -1291711, 1938104, 1506460, -10604811, 141734, 5015985, 2297271, 5611375, -5001490, --3059091, -4980015, 1341640, 3149285, -1014149, 1054951, 273804, -2512019, 943819, -1893007, -1688996, 1568737, -361851, 2569464, 536334, -409633, 1149441, 6279242, 1162326, 3266323, -4109747, 2245731, 103616, -120796, -5907191, -35433, 6307697, 2203318, 2801929, -142808, --427886, 3939559, -2952790, 306016, -262530, 1991791, 1080184, -2684, -2559801, 404801, --1287953, -401579, 448287, -845572, -594316, 603443, -62277, 2021856, 870805, 1846836, -911070, 551903, 1027034, -771484, -999654, 103616, 134755, 2313377, 1446867, 328565, -826244, 2198487, -352724, 206158, 709743, 22122840, -5714991, -2069101, -3358665, 4523138, -3019362, 7525857, 2987150, -1115081, 3606699, -164283, 4034585, 1556389, 5608154, 111132, -4706748, 6117644, -6795712, 1210107, 1756105, 1124208, 1069984, 1508070, -4039954, -20938, --4651987, -683974, -168041, -7893613, -5355288, 1961190, -33286, -289910, 3139084, 3062849, --1602560, -6809134, 2039573, 6111202, 4036733, 5698348, -1536525, 3072512, 5672578, -9459665, -2998961, 4136591, -4662724, 5825050, -4064650, -872952, 581968, 1132798, -3138547, 2745021, --823560, -1084479, -3265249, -2691334, 3279745, 3269007, 1488743, 3218004, 5042829, 2740189, -7008850, -1494649, -7875897, 7607461, 1252520, 3722663, 1592359, -1321239, 1999307, 1432909, -340376, 5213554, -1592359, 5143760, -7402376, -1726040, 969589, 2276870, 513785, -4074850, --1859721, 651224, 243739, -451508, 260919, 1542430, -1976759, -1158031, -1110249, -1471563, -860604, -462783, -535797, -1204738, -843424, 2223183, -523449, -770947, -14496, -819802, --637266, 1113470, -436476, 1190780, -241055, 68719, 969052, -304406, 9791452, -11266236, -7469485, 1568200, 7649337, 1762547, -4330938, 1403917, 5890548, -7066295, -1506460, 795643, --7967165, -1584843, -6126771, -3753802, -4467840, -4897874, 2060511, -7608535, -4731980, -6064494, --1557999, 5834713, 2094333, -7293392, -2851322, -7627325, -1898376, 1650878, 10919417, -8818105, -3595425, -2252174, -3245922, -6574521, 289373, 1109175, 6992207, 3674882, 863288, -5961952, --10353556, -161598, 3008625, 8106751, 2808372, 2594160, -6023692, 2179159, 5063230, 384936, -767725, -3220152, -3208341, -1082332, 2935610, 522912, -2087891, 55835, -6624987, -950262, --5587753, 3500935, -1194538, 3500398, -5475547, -4617627, -7529078, -874026, -4852776, -2080912, -1893007, -7284802, -3171833, 837519, 3984119, -8749922, 5075578, -4118874, -4446902, -4650913, --3913789, 2626909, -2639794, 1216550, 1480153, -2321967, 303332, 1819456, 1383516, 92879, --2107218, -311922, -1029182, -2348273, -444529, 1735704, 999654, -1162326, 1557999, -1361505, --1065152, -258772, 510564, -1749125, 90731, -213675, 1155883, 932008, 1927367, -1577864, -433792, -357019, -703838, 610422, -1848983, -638340, 894427, 497142, -27346056, 4402879, -3117073, -7897908, -1760937, -38655, 270583, -1517197, -2626373, -2026688, -8128763, 6248104, --3939022, 856309, -6770479, -2413772, 9789304, 8864276, -5629092, -3405909, 281320, -166967, --4620311, -5397164, -3820374, 629213, 418222, 150861, -556735, 2270964, -6672769, 2070174, -228170, -11784853, -1414118, -3537443, 5381594, 7847442, 1228361, -1400696, 376347, -6915434, --8638790, 4614406, 8547522, 9498857, -2566243, 1716913, 5553393, 5709622, -2966212, 5265630, -8614094, -381178, 7252053, 6124624, -7221988, 2344515, 420907, 7748658, -4760971, -5100274, -4481799, 5867462, -1807644, 504122, -8508867, 5969468, -4757750, 6302328, -10582263, 1125818, -2524367, 5028870, 352724, -4457103, -9024800, -5564667, 7605314, -7530689, -344134, 825171, -4108136, -2296197, -1593970, 3171833, -6027450, -5284958, 2167885, 1412507, -428423, 4292820, --1990717, 999117, 1127966, 1129576, 1648194, 325881, -1668595, 1022202, 2243584, -952409, -325881, -478889, -1105954, 880468, -2777233, -424128, -2995203, -606127, -550293, -1013612, --1526861, 596464, -873489, -71404, -2321967, 907312, -403190, 784905, 976031, 327491, -417686, -10597832, 3753802, -9365713, 11846594, 11392938, 347355, -15438260, 6389838, 873489, --2881386, 10650445, 43487, -9199820, -980326, 11578695, -14528264, 457951, -3636227, -11465952, --3190624, 207769, -2259153, -5872831, 3379066, -4865124, 3952981, -4144107, -7769596, 4140349, --583042, 5949067, -11567958, 4719632, 9099425, -3659849, 746251, 9149891, 13378286, -3558917, --2734821, -11275900, 657130, -9302362, -761820, -6475737, 319438, 907312, 5403606, 2590939, -4938139, -3565360, 906238, 3062312, -588947, 12349642, -8199630, -4048544, 16245714, 16319802, --3223373, -1029182, -10244034, -5235029, 519154, -2841658, -6780680, 9858024, 3037079, -2567317, -14462229, 2804077, -6942278, -191126, -13284334, -6661495, -7531762, -6453725, -1766305, -10369662, --7486665, 4274030, 3949223, -761820, 2329483, -3076807, 3471407, -2310693, -3395172, 587337, --4887136, -2232309, 6273337, 502511, 3125663, -1676648, 641024, 481573, 1471026, 1360968, --275415, -124554, -3106872, -35433, 661962, 502511, -876173, -880468, 2095944, 624918, --449898, 74625, -535797, 70867, 1161252, 13157632, -3456375, -113280, 9073655, -2124398, -5379984, -2894271, -11429445, -707059, 54224, -2320356, -6754373, -7546258, 3991098, -5970542, -10660646, -3228205, -7659538, 6606197, 13370233, -3276523, 3780108, -3548717, 7744363, 204011, --16151761, 5802501, 9042517, 931471, -2651606, -9385040, 7944079, 5319317, 5132486, 1069984, -3252901, 10604811, -7415798, 1353452, 2115272, -5848135, -11340324, 10880763, 6080063, 20221242, --983011, 8939438, -2921652, -6309844, 1123134, -958851, -242129, -1772748, -6533182, 14529874, -379568, 1165547, 2095944, -1989107, 11970611, 1548873, 10029286, 4203699, 1722282, 10711112, --4996121, -11934104, -2323577, 2246805, 1586990, -4915590, 5887864, -3508988, -16710644, 1551020, -3364570, -9216463, 4347581, -924492, 1843078, 58519, -3768297, -4168266, 15569, 1622424, -5144297, -424665, 1465658, -1935957, -1433982, 2347737, 1546725, -252866, 1592896, -1666984, --165356, 155693, -2267206, -3268470, 2090039, -3642669, -926639, -1567126, -3192771, -855235, --404264, -1155346, 1426466, -509491, -1331440, -360777, 6180458, 2455648, 2371359, -1202591, -901943, -1886028, -2483028, -780610, -843424, 1112397, -1637456, 3022046, -3843459, -1174674, -845572, 10630581, -17624936, 2893734, 7894687, 11751567, -12343736, -1778653, 8368744, 5832566, -7141994, 1261647, 15074798, 2794950, 6250788, -1874216, 892279, 6220187, 3411278, 7180649, -569620, -9969156, -14545444, 7714298, 3733937, -2769180, 1711008, 4338454, -13609141, 127238, --8587787, 4017942, -467078, 8920110, -2858838, 3984119, -2059974, 2310156, 1221381, -379568, -5023501, 6703907, 2403571, 3881577, -10661719, 4411469, -1877438, -18596134, -12352326, 3164854, --13576928, -937377, 11224897, -8191577, 22296248, 8056285, -4488241, 12095702, 569620, -3965866, --8995272, -8916352, -12377559, -1928977, 7239168, -8862128, -1097901, 8028368, 3670587, 4531728, -16338592, 2011655, 10683194, 75699, 2099165, -17541184, 4859756, 1314260, -15958488, -15116137, -8721468, -5769752, 1017370, 4583267, -2600603, -4115653, 925029, -920197, -1090385, 915902, --2852932, 2561948, -2050847, 566399, -5036923, 2731599, 849330, 1108102, -270046, 6214818, --5036923, 429497, -1409286, -1259499, 1260036, 1268089, 1741609, 2989297, 4999342, 3083250, --3208878, 775778, -402116, 4547297, -1495186, 2932926, -4657892, -3545496, -2682744, -2262911, --305480, -256087, 2318746, 2703682, -9143449, -222801, 5831492, -25770, 4108136, -9366787, -7373385, -522375, 2181307, 6878390, -12665859, -8686571, 2358474, -115427, 7026030, 14450417, --1288490, 3647501, 15506443, -5683853, -10430328, -543850, 11372537, -2395518, -12998182, 1105954, -4863514, -2505040, -4035122, -900333, 16811038, -3133716, 14477261, 10960220, 13212930, 784905, -1122060, 7750806, 2629057, -2611877, 2760053, -10365367, 7905961, 13245142, 8323110, 1191317, -7405598, -5725729, 5697811, -5568962, 8310762, -7394323, 188442, -536334, -535797, 23513872, --3466576, -1253594, -1999844, 3317325, 6510097, 12408161, 14143327, -7648800, 3420405, 14093935, --7830799, -9716290, 5919002, -4198331, 6100464, 26851062, -12622909, 1870458, 2543695, -6920266, -3056943, 8804146, 6167036, 784368, -5455146, -13141526, 6286759, -5699422, 7266548, -4903779, -1047435, -6478422, -1404454, -10874320, 962073, -3414499, -3838090, -1305133, 1352378, 2815351, -5446019, 2348273, -3084860, -724239, 5549098, -3209414, -2843268, 442382, 411243, -4925791, --46171, -2460480, -1217623, -888521, -877247, 1960116, 1210644, 3963718, -2491081, -2464774, -313533, -2962454, 1421097, 6195491, -3068217, -3240553, -6109054, 3176128, -1539209, -1550483, --9080098, -14316737, -11020886, -14898168, -5738077, 1674500, 11930882, 8838506, 3202972, 12563853, -3779034, 7675107, 7065758, -3406446, 10897406, 11810086, 8341900, -15939161, -8931921, -9230958, -3479461, -6365679, 445066, 4540854, -4629975, -11246909, 7279970, -5331665, 2586107, 2421825, -11479911, -11964168, 18611168, -18376018, 19012746, -38655, 9540733, -9219684, 3360275, -20540682, --11437498, -9992241, 9061307, 4175782, 13135621, -1301375, -42413, -6660421, -16465831, 10758893, --8989367, -4669703, 7841537, 18687940, 18083960, 8484171, -1198296, -12226161, 7204271, -18779208, --1452773, -10660646, 6062883, 20278688, -19444390, 7102802, 9044127, -12089796, -1185948, -2056753, -6798933, -8012799, -11536282, 2307471, -4656819, -16959752, 8630200, -1669669, -15921981, 11844446, -15672873, -5154498, 545461, 2219961, -6719477, 10176925, 4733591, -2869575, -2507724, -6665253, --3788698, 8165807, 4696547, 4663261, -328028, -7344394, -2188286, -2487323, -8140037, -1730872, -2485176, -482110, -2361158, -733366, -5791227, 773094, -1946157, 3974455, 2241436, 836982, --6711960, 5582384, 557809, -2907156, -1663763, -1098975, -293668, 3316252, -2443300, -1025960, -2580202, 6863895, 3493419, 2035815, -4095251, 5478768, -13685913, -15979963, -4518306, 10286984, --12236899, 8079907, -16807280, -3009698, -6467147, -5929203, -13325136, -1198833, -4975183, -8014409, -6407018, -8928700, 9601399, 2019708, 7500087, -11795591, -22046068, -1841467, 4548907, -9241159, --6757594, 3596498, 2878702, -10807211, -5120675, 15351287, 7462506, -2033667, 8409009, 22050362, -790274, 2787971, 2267206, -1685238, -354872, 3242164, 2962454, -16962436, -6155762, -20724828, --6539088, -19328964, -9098351, 1041530, 22581864, 10524817, -11161546, -13130252, 8425652, 17815524, -11280732, -7988103, 13675176, -5215164, -1020592, -23945516, -7108708, -3097208, -2944200, -16382079, --26220238, 8395587, -53687, -19202798, 4896263, 30008400, 3921842, 3384971, -18957448, -1721208, --268972, 4187056, -21287468, 19648402, 3112241, 5418101, 10878078, 4186519, 11799886, -916976, -5542656, -4643397, -9215389, -7693360, 4060355, -6201933, -1955821, -8281771, 2776696, 6736120, -129923, 5670968, 639413, -2302639, -99321, -4769025, 3301219, 3388729, 609349, 603980, --3236258, -1342177, 1807644, 4924180, 3591667, -4370666, -1546188, -1815697, -9956271, -13830332, --10165651, -3353833, -1278290, 1581622, -2376191, -3935264, -4238059, -30065, -2841121, -3706020, --6187438, -3384971, 9970230, -6197638, 12112345, -18402324, -3794604, 4327717, -8880919, 21087216, --17499308, -18014166, -14659260, 20390894, 9080098, -11905649, -10740103, -7184944, -2285996, -6481106, --6667400, 947040, 7574712, 20140712, -2297271, 8545374, 7434589, 7220377, -13550085, -16900160, --12159589, 14057428, -2511482, 17093970, 5635534, -1969243, -23534274, -19209778, -2042257, 1483911, --13674639, -8591545, -6455873, -6611029, -30848066, -6769942, -7578470, -11176579, -5491653, -7339562, --14186814, 9852655, 19157702, 10596221, 479963, 11261941, 14377940, -5225365, 4526896, 3586835, -1382980, -682900, -3715684, 10036265, 4038880, 16887274, -3982509, 1591285, 6017249, 33337536, --427349, 17681306, 22445500, -2045478, -19624780, 1602560, 19494856, 2782065, -16712791, -15042586, --19152332, 12392591, -15647640, -4326643, 22369264, -9716290, -15014132, 4544613, -4123169, 345745, -6105296, -9488656, -4226785, 1774895, -2814814, -4355634, -852014, 1623498, 11181410, -1142998, --5807333, -5094905, -48318, -4399121, -3528853, -3234647, -5634460, -2772402, 2127083, -2789045, --533650, -7765301, 1975148, -831076, 1552631, 7560753, 4800700, -4624069, 2097018, 1562294, --6753836, -10406169, 3855807, 4013110, 594853, -10635950, -11374684, -1906966, -7945153, -2702608, --1161789, 18866180, 13743358, -31657668, 10040023, 12627741, -5550709, 9171366, 30079804, 2473364, -6694781, -10508174, 6971269, -11105175, -7096897, -5916855, 2208687, 7740605, 10821170, -1551557, -4460324, -3273839, -1843615, -5806796, 7963943, 28395102, -9274982, -9153112, 10180146, 7181186, -1025423, -20649130, 13384729, -16462073, 9444633, 11853036, 1315871, 3013457, -3411815, 19537270, -14782741, 177704, 9942849, -7810935, 12538083, 2107218, 14158897, 20694226, -465467, 5255966, --2705293, -7616051, -533650, 9026948, 10160282, -19750944, -12014097, 4643934, 21459804, -10391137, -14241038, 9557913, 2760053, -23012972, 2787971, 3599183, -27473296, 16202227, -15381888, -18263812, --34772056, 8478265, 21081846, -9536438, -19407884, 4038880, 23365696, 14928769, 2593087, -3032247, -318901, 8262980, -7160784, 11020349, 17943836, 17127256, -1275068, 7269232, 17752710, -2780991, --247497, -1952063, 15284178, -2243584, 3750580, -7145752, 3877819, -4394826, 582505, 220117, --1209570, -3460133, 3340411, 9014599, 3028489, 2565169, -8148090, 2074469, -8412230, 2554432, -13226889, -4817343, 195958, 1746978, -6289443, -8185671, -9432285, -2138357, 5970005, -2768643, -1595044, -5701032, -590558, 217970, -17452600, -4476967, -748935, 3670050, 4442070, -3623879, -6182069, 3277597, 3299072, -5174362, -5073967, 7744363, 21812528, 15812459, -5468030, -42627552, -5005248, 21329344, 10177999, 4632659, -18700288, -118112, -12913356, 2996277, -1252520, 3528853, -6410239, 8930848, 3804804, -23178864, 13412646, -3231963, 4054986, 17591112, 6767258, 3282966, --6313065, 21821118, -784905, 21688512, -26375932, -7762080, 8392366, -15374372, -13292387, 917512, --3488587, -12037720, 1386201, 19160386, -663036, 1258425, -10104447, -20975010, -13389561, -6004901, -8653822, -2325188, 1988033, -10326712, -11247446, -5518496, 16634408, -11489574, 9562745, 6432251, -5363341, 1836099, -17293148, -24619826, -2046552, 16436840, -20478940, 9844602, -17639968, 10992432, --18555332, -961536, -18296024, 25848186, -23666880, -14134201, 6053220, 4223027, 11803644, 9840844, --6173479, -3288334, -6212134, 3186329, -311385, 15397458, -19212462, -7615514, -24672440, 12697534, --8806294, 933619, -1088237, 6689412, -5508833, 2487860, -10133438, -15351287, 9785009, -7950522, -188442, 2496987, 13016972, 5188858, -9455371, 1972464, -3242700, -12131672, -2299418, 2797634, -3751117, -10974178, -5399848, 12028593, -1290638, -10206990, -4520990, 14121316, -16687559, -5689758, -3335579, -3911642, 5865852, -1295470, -7369627, -9892920, -3211562, -4460861, -3119757, -3287798, -2638184, -819802, 6113349, -6569153, 3364570, 1135482, -3017752, 6594923, -36378372, -5168457, -10863046, 2648384, -8687645, -12991202, 1175747, -12349642, -1176821, -19063212, 17809082, -7144141, -11134703, -24783036, -14085882, -524523, 30325154, -24861956, -2195802, -19463718, -15515569, -4742718, -18979998, -4438312, 8398272, 8885214, -10147934, -21589726, 30345554, 13215614, -17446158, 3352222, -2178622, 8368207, -16980690, 15156403, -1403381, -31805306, 3299609, 6344204, 8134668, -26355530, --6371584, 3303367, 23134842, 4398584, 12859132, -33993592, -20724290, 10407780, -69793, 22159884, --6013491, -3758097, 1626182, 11258720, 10252624, 3929358, -43276092, 12160126, -5105106, 9876814, -22950694, -7293928, -2125472, -26323854, 8461086, 11891154, -13917305, -8225936, 23748484, 37620156, -9760850, 6126771, -10739029, -4422206, -20636780, 1563905, 166430, -25378962, 9164386, -767189, --7518877, -1938641, 11849815, -9721122, -6642704, -1133871, -2812667, -915365, 10448582, -4548907, -114354, 6073621, 2319819, 8355859, 6935836, 5354214, 3671660, 10004589, 11602854, -15658377, -4875862, -9771587, 7643968, 1169305, -10022843, -6715718, -3968550, -3273839, -6615324, 6027450, --3429532, -6415608, 10661719, -1688459, -3534758, 6160594, 10980084, -19327, -4109747, 3085934, -10233296, 11273215, 6952479, -3655017, 1762547, 2119030, 9188546, -31213674, -20424180, -7045357, --343061, -17786534, 14090177, -36881420, 1772211, -22646826, 11720966, -8405251, -25178172, -2239826, --6802155, -8875550, -28677496, -20924006, 5958194, 22577032, -15197205, 27873264, -23796266, -15640660, -5060545, -2340220, 12625056, -7919920, -8329552, -11551315, -3266323, -39170100, -11313481, 1110786, --1750736, -6548752, -15462956, 12270185, -13690745, 20885890, -6535867, -2630668, -14884746, -13676250, --25993678, -11311333, 9515500, 3926137, -1625108, 1689533, -9387188, -7055558, -12085501, -10101763, -5221070, 7688529, 3551401, -22537840, 25694104, 3474092, -11264089, 20601348, 14654428, 24556476, --4766877, 14318884, -33779916, -18231600, -31927176, 32350768, -10566693, -22610856, -21855478, -46147276, --19426674, 31893890, -2236604, -16213502, 11531987, -31499290, -21196738, 7876433, -2007897, -26288958, --25813290, -333397, -14909442, 3916473, 5316096, -19558744, 18866180, -11652246, -17250736, 1460289, --10305237, 27181238, -10671920, 12202539, 1760400, 16516297, -8613020, -4859219, 1396938, -7561827, --476205, -15881715, -12210055, -3082713, 6405944, 295816, 10790568, 4414690, 7949985, -7145215, --255551, -13823889, -3599720, -5000953, 3911105, 13151727, 5859946, 5265093, 6057515, 5430450, -1235340, -18007724, -5565204, -12440910, -3319473, 2055142, 8244190, 40263708, 51555176, -4908074, --22920092, -5462125, -8672613, -23157390, 9953587, 634581, -16785270, 49277232, 17088064, -11684459, --34186328, -3070365, 8228084, 8983998, 9998684, 23568634, -6796249, -11664594, 11061688, -42776800, --28592672, -11180337, -3081639, 4580046, -22851374, -20871394, 21984326, 17484274, -13466333, -25897042, -16415365, 471910, 28968480, -23604604, -5431523, -8058970, -1481764, -18664318, -27800250, 23328652, --17243756, -10902774, -21247740, -4769561, 14017700, 13160854, -8571144, 1834488, 2461553, 17592186, -26968100, 19840602, -34570192, -16634408, -20509542, -5158793, 11793443, 4286914, -23629300, -34002184, -28805272, 1795296, -28222230, -46882252, 23632520, -6136435, 12721156, 11707007, 12440373, 1614371, -9188546, -18459232, -6962142, 12591233, 2321430, -8672613, 5252208, -2250563, -24813636, 12470974, --31507880, -2124398, -1506460, -5559299, -11286100, -4476967, 13920526, -1023276, -3118683, 7038378, --10139344, 30637076, -2360622, 2660195, -2210835, 207232, 7734163, -578210, 7458748, -15783468, -3479461, -2984466, -10853382, 1006633, 5325223, 10115185, -5067525, 2736968, -26071526, -8690329, --1334124, -13841069, 11768747, -1708860, -3048890, -7514582, -10666551, -16053514, -22197464, 6603512, --2113661, 16189342, 19531900, 12187507, -13080860, -18549964, -23172960, -8922258, 21556440, 17293686, -3147137, 7977902, -7337415, -13643500, -10080825, -9829033, 4538707, 18041546, 22355842, -27849642, --23379118, 66219268, -5401458, -6535330, -10005126, -20970714, -2343442, 23861764, 38356744, -17742510, --10756746, -3944391, -17552458, -4395362, -9929964, 15231028, -15874199, 17442400, 8257612, -6038724, --22116398, -1651415, -9160628, 33042258, -18257906, -475668, -34360, -3325915, 14870787, -9557376, --1344862, 6853694, -4627291, -32322314, 16375637, -14758044, -17167522, -3948149, -18306224, -10590852, --33176474, 31623844, 1345935, -21095268, -38860328, 22546430, -22970022, -22334366, 188442, -17398912, -7727183, 14295799, 43957380, -12547210, 17139066, -3726421, -21434034, -18124762, -5413807, 66292820, --58612344, -4294431, 60764660, -55730960, -21268678, 31367756, -4765266, -25191594, 58751932, -29165512, --12250320, 27020714, 6563784, 11523397, -17599702, 19508278, 27315456, 12854300, -7172059, -1822677, -27582280, -4057134, 15712064, -391916, 10915659, -15895137, -2232846, 7300908, 4295504, 3047816, -564788, 1117765, 11364483, -5310190, 2800856, 4268661, 3719442, -24931748, -10451266, 7978439, --21306260, 6350109, 11849815, -8927626, -9616432, -7269769, 4838281, -10219875, 11865384, 10245644, --1557999, 5937793, -7735773, -15018427, -14874009, 29116120, 5005248, 18166102, 3488587, 3597035, -11260331, -9917616, -2607045, 18474802, -11244761, -25173878, 18605262, -2523293, 31513248, -39693552, -36044976, -5900212, -22044456, 19480362, 6985228, -3360812, 4257387, 2834679, -4086662, 7241852, --7487739, -9768366, -4326643, -13615583, -11306501, -25762824, -9727027, 22567906, 21289616, -32083942, -11024644, 17365090, 14585709, -5334887, -31675920, -2668249, -15569793, -37125160, 23773180, 60029148, --34112240, -3503083, 42722040, -11854647, -14936286, 34733936, 25851408, 12862353, -13703630, -27597850, -9503689, -11115912, -17353816, 62770412, 46261092, -37522444, -27560806, 34001644, -61391724, -21465710, --17221746, -10416906, 43313672, 28862180, 19074486, 20905216, -72164040, -25045564, 69226280, 40189084, -8418673, -18195092, 24009940, -24074902, -48948668, -32573568, 24240258, -17727478, -3613678, 28079960, -51845088, -5995775, -28815472, 3952981, 20653960, -34957276, -12774843, 36864240, 33224794, 33254858, -23200876, -6360847, -20667382, -10165114, 28285580, 8320963, 12061879, -5159867, 3435974, 12984760, -1414118, -4852776, -5669894, -7778186, 6535330, 4747013, 27165132, 7765838, -5003100, -10473278, -2966212, 1576790, -3627100, -9164923, 2994129, 21023328, -21756156, -6376953, 20318416, -4325569, --173946, 13515725, -4728222, 10064719, 4509179, 11780558, -21967148, -2954938, 5071283, 25691420, -6538551, 12456479, 11014981, 6131603, -4483946, 8659728, 12453795, -13324599, 7133404, -61268784, -26558468, 331786, -6247567, 31439160, -5307506, -23684598, 11960410, 10896869, 30750892, 17430052, --16571058, 918586, 4789426, 21067888, 4922033, -24199456, -889058, -1364189, 4986994, -22511534, --24526410, 35629440, -12783433, -37220188, 19207094, 33071248, -18544596, -6313065, 2224793, 22673670, --26982596, -35496832, 9802726, 29997662, -6442451, -12776454, -7353521, -7303592, 13107703, 5564667, -7857106, 75590352, 4239133, -9657771, 1095754, 2375117, 40890236, 1291711, -14443975, 9196062, --31845036, -18746458, 8345659, 158377, 35156456, 27849642, -17955648, -5283347, -16969952, 803696, -12655658, 3185792, 3980361, 12577812, -8958765, -37168648, 9540196, 25074020, -11777337, 22126060, --34324304, 16188269, 10459856, -30169460, 5247913, 587874, -13069585, 1369558, -5540508, 14986215, -14719390, -25281788, -15495168, 33709588, -25648470, 12390981, -2319819, -9901510, 7491497, -1014149, --15051176, 8614631, 5321465, 6164352, -378494, -2580739, 1774358, 4665945, -5672578, -5484137, -4685273, 3281355, -3089155, -281857, 7565048, 12550431, -7326678, -5079873, 1714229, -2248952, -4508642, -3113851, -1571958, 2907156, -32212, 7543573, -2264522, 3724811, -9645423, 5940477, --6689949, 6280853, 11167989, -974421, 338229, 1542967, -12567074, 21321292, -39366596, -129994704, --153868272, -13640816, -106646720, 42198052, 260760880, 140367040, 211834224, 223225552, -24021752, -64063196, -19283330, -162230576, -198335680, -61143692, -218355600, -175270096, 44725640, -126021856, -34170224, 251806416, -91316376, 178082768, 307539520, 183100896, 82037096, 62457952, 22011708, -136706128, -170201504, -56047176, --232546704, -232748032, 30930206, -174011136, -142734656, 86126976, -146353152, -150543440, 114015272, 46413028, --20571820, 268790336, 251757568, 160793376, 341240512, 321543808, 110016128, 128091496, 99921880, -161630896, --161975568, -204945632, -405914144, -479237824, -344579328, -343098624, -252981632, 8850317, 23626616, 167358240, -289322944, 356492480, 324891712, 376936000, 323047040, 190562336, 128242888, 42798812, -63411972, -142835040, --203224432, -174645712, -253262944, -283750784, -235234288, -275115200, -206328624, 32909114, 66457640, 160562528, -321951296, 256349952, 197674256, 149405808, 59020368, -48597020, -39573292, -80473192, -100683696, -76896024, --87436408, -84533544, -35874252, -34111704, 2164664, 52511344, 37479496, 73653856, 88517128, 15577310, -64287072, 61702572, -16800302, 20645370, 14656039, -46595564, 2299955, 15355045, -53863184, -58930708, --82276544, -169632960, -189603472, -147516016, -140883520, -46046344, 69653632, 125216016, 203660912, 307008032, -331532288, 307394016, 215565488, 65954056, -69013144, -148154896, -221248256, -273264064, -268667392, -209836000, --143895904, -68214816, -20581484, 9103720, 25472914, 63021664, 103716480, 106873280, 99418832, 101996344, -72934984, 65732328, 57207892, 23780160, 6444599, 15372225, 13837848, 9188546, 6893960, -11006391, --32198296, -46876348, -53939956, -44794360, -26738856, -17313550, -15388868, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --8929774, --10633265, 5459977, 321586, 8239895, 2979634, 3637301, 2328409, 3346317, -105764, -109522, --1868311, -5405217, -3132642, 1436667, -283468, -997506, -657130, 2874407, 2221035, 32212, -2575370, -2423435, -6164352, 1959042, -1449552, 689879, -3154117, 2460480, -2587181, -1283122, --1036698, 4407710, -1062468, -48855, -1864016, -506269, -5000953, 1677185, -868657, 2688113, --2393371, 317828, -1146219, -3995393, 1238024, -398358, -1110786, 1777580, 3253438, -681289, --2045478, -5842766, 499827, -3474092, 1578937, 56908, -2284386, -91805, -1000727, -817118, --4249334, 2725694, -3772055, 2064269, -1506460, -2495376, -2160369, -4489315, 2437394, 229244, -1195612, 2700461, -2916283, -4603668, 2913062, -4411469, 105764, -2939905, 901406, -2275796, -1966021, -1151051, 1020592, -1963337, 317828, -911070, 1141388, -941135, -1074279, -1002875, --987843, -1761474, 216359, 433255, -346819, -1387811, 920734, -1047972, 106837, -700617, --1241246, -442919, -470299, -193810, -306016, -176094, -1032940, -536334, 109522, -594316, --359167, -318364, -15739981, -189515, -2106145, 4116189, 59593, 1572495, -1318018, 2038499, -382789, 1780801, -1835562, 10130754, -2223719, -1445793, -4373351, 1442572, -5276904, -1706176, -379568, -2574296, -49392, 3707094, 2119566, 1398549, 2495376, 3600793, -4415764, -1697049, --97174, 2283312, -4166118, 4035659, -3488050, -1769527, 3235184, -630286, 740345, -2596308, -2988760, 3122441, 3357591, -5184563, -1584843, 5572183, -80531, -856309, -1257889, 6076305, -3966402, 4697621, 81068, -1116155, -1411971, -348966, -129386, 677531, 1820529, -5902359, --532576, -2756832, -3479997, -470299, 1003412, -3069828, 817654, -2349884, -853625, -959388, --68719, 2022930, 1891396, -1082332, -693100, -1350767, -4772783, -1148367, -2956011, 61740, --3900367, 1041530, 72478, 3930432, -1352915, 522912, -3412889, 278099, 493921, -1617592, --1628330, 1655710, 70867, 423591, -142271, 1153736, -289910, 465467, -178241, -296890, -1450625, 629750, 621697, 193810, -132607, 5335960, 6320581, -4410395, 558346, -3763465, -5790153, 1056025, -2406256, -3407520, -3016141, -638876, 725850, 1527935, 7705708, -4598836, --740345, -1832877, 3012920, -8627516, -1020055, 5484137, -163746, 4606353, 2029909, 3692598, -3841848, 1665374, -766652, -4057134, 1322313, -1143535, 500364, 6415071, 1606855, 5502390, --2910914, -1518808, 406948, -7429220, 854699, 5531381, -1643362, 505732, -4651450, 3490735, --92342, 1544041, -5502390, 3218541, -3700651, -2066953, -3864934, -4534949, 2592550, 874026, --1480153, -2326799, -2204929, -1621887, -1109175, 2550137, -2551748, -4606353, -7093676, 6540162, -5013838, 261456, -7096360, 2142115, -3409667, 2780455, -2308008, 498216, -4352413, -2742337, --5665599, -2565169, -802085, 5513128, 3278671, -6169721, 2662343, 129923, -544924, 2688650, --374199, 2134062, 4376572, 223875, 916439, 2902324, 593779, 576063, 2867965, -510027, --82678, 216359, 368830, 607201, 709207, -644245, 828929, -603443, 207232, 141197, -733366, 168577, 1815697, 1588064, 111132, -88584, 1782411, 910533, -1343251, 255014, -642098, 26761942, -9898826, 12004970, -9486509, 844498, 2871723, 2838437, -7826504, -2640868, --2609193, -13126494, -42413, 721555, -4711043, -741419, -27917, 9429064, 1767916, -6534793, -4819490, 5253819, 1196685, 9557913, -7059853, -2570538, -3759170, 2036888, 7666517, -530428, -511101, 2864743, -1336272, 3435974, 1570884, 8748312, -1287417, 3442953, -5686537, 5238250, --3972308, 5845451, -74625, -6067178, -884763, 8818105, -359167, 5973226, 3602941, 5745593, -540092, -4508642, -3655017, 115964, -2708514, 4720169, 3147137, -4629975, 672699, -3613141, -6234682, -1666984, 5008469, 5963025, 1072668, 6146098, -250182, -2949569, -977105, -3764539, -206158, 8069707, -5014375, -5148055, -1920924, 2305324, -3503083, -2171106, 1593970, 3886946, --1570884, 1440425, -7770670, 1941862, 542777, -538482, 2770254, 193274, 772557, 1876901, --200790, -991064, 878321, -1779190, 601295, -730144, 263604, 359704, -239444, -607738, --1522566, -105227, -1204738, -757525, -485868, -2671470, -22262426, 2440615, -6553583, -4685810, --7187628, -8713952, 3440806, 7796977, -1172526, 3033321, 1236951, 4005057, 909996, 295279, -2418604, -4770098, 11064373, -573915, -6438156, 7261716, -2217814, 3083250, -7257421, -4516158, --5142150, 2228014, 1352915, 5681705, 173409, -3529926, 594853, -3151969, -3464428, -3844533, --1335735, -5352603, -2712272, 4985920, -4642860, -330176, -3632469, -5681705, -2531346, 708670, -1818919, 3601867, -2860985, -2626373, 3562139, 617938, 1340030, 941135, 2204392, 3337727, --5437966, -1826972, -554051, -7627325, 2017024, -544924, 4459250, -4476967, -3415573, -4185983, -716186, 4714801, 3653944, 8324721, 5590974, -5166846, 2089502, -2349884, 3941169, 2454037, --5576478, 4000762, 1076426, -6200322, 792958, -1145146, 526134, -1179505, -4228396, 753230, --3034931, -3207804, 1163936, -1775432, 729071, 2244121, -1523640, -2049773, -2110440, -3174518, --590558, 2403034, -648003, 2499671, 16643, 1678795, 1155883, 859530, -1131724, -472446, -429497, -1129576, -1231045, 256624, -1188095, -489626, 318901, -2247879, 1240172, -1168231, --387621, 219043, -79994, 140123, 714038, -1024350, 635118, 1447404, -28349468, 7783555, --8455180, -7044820, -5066988, 955630, -1474248, 16699370, 1645509, 3995393, -1860258, 63888, --6859063, 6812355, 1991254, -993748, 1370632, 8893267, -4453344, -1541356, 2055679, 613107, -4467840, -3890704, -1745904, 4902705, 1804423, 4515621, 543313, -4804995, -3140158, 2697776, --464930, -1638530, -2994129, -1739999, -195421, 8419210, 2131378, -1537061, 179315, 609885, --2555506, 6059662, 4651987, -1462973, -6378564, 1580548, -3376381, 5761699, 4491462, -4523138, -1759863, -5852430, -5195837, -4593468, -5733782, -2007360, 1267552, -3476776, 286689, -3838627, --3227131, 6626061, 4234838, -5672578, -7614977, 821413, 6488085, -5043366, -3714073, 5443334, -4313758, 6212670, -4031364, -218506, 1767379, 2535105, 7026030, 1853815, -919660, -317291, --5120138, -818728, -93416, -4445291, 320512, -1347546, -2006287, 31675, -594853, 2110977, --521302, -903554, 1028108, -717796, -1831804, -1265405, 383326, 1686848, -839666, -720481, -51540, -501437, 3289945, 523986, 4265977, -3092377, 768262, 145492, -1782948, -119722, --151398, -2366527, 576063, -520228, -2535105, -2434173, -1233193, -2333778, -1722282, 503585, --1126892, -14919643, -1469953, 2524367, 7270306, -1403381, -3795677, 1713692, 10678362, -13425531, -3123515, -2714956, -2487323, -6036040, 3642669, -10755135, -7004018, 3716221, -5624260, 3420405, -15347529, -2699387, 6205691, -7199439, 7413114, -1909113, 2213519, -6454799, 3024731, 1854889, --3465502, 1542967, -697395, -3310346, -220117, 4233227, 6606734, -5152350, -8247948, -6516539, --6054294, 805306, 4843650, 12851616, -146566, 8662412, 9023726, -8373039, 6455336, -12324946, --4515621, 805843, -5493263, -5094905, 3424163, -11933567, -2364380, 8345659, -3591130, -3103651, -1096827, -3627637, 3399467, -3598646, 5833103, 7565048, -2091112, 2369748, 310848, -7605850, -653909, -4912906, -3409130, -6002754, 3427384, 2652679, -5796595, 498753, 4313758, 4041564, -5111011, 5300527, -809601, -4982699, 4151623, 2203855, 2485176, 1387811, 3001645, -310848, --101469, 470836, 1233193, 1486596, -2055679, -600759, -1658931, -1069984, 2408940, 2102923, -2325725, -4195110, 862215, -496606, -1744831, -2010045, 2178622, -1314797, -2311766, 618475, -545461, -727997, 5141076, 1740536, -1010391, -1104344, -2390149, -627065, 2101313, 3236795, -804233, 42950, 3222299, 35440460, -1652489, -13935021, -1694902, -555125, 1399086, 4517232, -1876901, -1561758, -1393717, -6986301, -3278134, 4010963, 8704825, -7023346, -4396436, 5834176, -529892, -2014877, 2374043, -500901, -8139500, -8287140, 11429445, -994285, -659814, -1833414, -5902359, -386010, 680752, 3784403, -6161131, 6674379, 2814277, 1145683, 2589329, 6672232, --15812996, -7038378, -3795141, 14705431, 1957431, 1167694, -4438312, -4893042, 4449049, -586263, -5147519, -1734093, -10080288, 1163399, 1309428, -1461900, 5001490, 2290291, 1393717, 8189429, -19844896, -1488206, -1602023, 7609072, 2357937, -2258079, 5243618, 15467788, -1658931, 3024731, -5640903, 4558571, 4072166, 4170413, 4641249, 3606162, -4000762, 6222871, 11043435, -2455648, -4275640, 142808, -1316944, -7512972, 4802311, 1876901, -554588, 2384781, 2697776, 712965, -368293, -2474975, -2882460, -1074279, -5804112, -2520609, -3913789, 5184026, 2558727, 2025077, --766652, -679679, 359704, -3284039, 66035, 1328756, -4600447, 4174708, -1973538, 817118, --1369021, 314069, 1603097, 1949378, -3576097, -3499862, -2937758, 498216, -566399, -902480, --224412, 2613488, -614717, 359167, -1442572, -3096135, -1692754, 7154342, 7966091, -10118406, --2925947, -8588324, 8529805, 15964930, -7626252, -1782948, -8750996, -3801046, -10591926, 7570417, --6460168, -2625299, -670552, 82678, -4205847, -5189394, 9540196, -8637179, -3177202, 994822, -6516003, 6945499, -9946071, -2923799, 3849901, -8564702, 4887673, -6794102, -2749853, 2509335, -221728, -3716221, -1013075, 2051921, 11155104, 1379758, 2537252, 4832, -9494562, 10401874, --5077188, -7797513, 6266894, -5558762, -6263673, 8198019, -3681324, 1049046, -1785633, 1101122, -10802916, -1844689, 2444910, -9423158, -710280, 10966125, 2483565, 10864120, 9335111, -3065533, --2349884, -12644384, 1974611, -2129230, 8413841, 10263898, -5869073, 2551748, -18533858, -5084705, -6187974, -6423124, 9659918, 638876, 2116345, -3416647, -681289, -4464082, 827318, -3080565, -6834904, 6671158, -263067, 2264522, -61740, 3764002, 1672890, 2722473, 5784784, -1743220, --6416145, 2950643, 1515050, 4078072, -1020592, 4327180, -841277, -1526861, 1142461, -2632278, --1687922, 424128, -4490925, 1248225, -1529545, 4004520, 1792612, -318901, -803159, -2678986, --3971771, -346819, 602369, 1610076, -1421097, 875636, -3729105, -78383, 287763, -2028835, -2601677, 227633, 122943, 1050656, -1174674, 167504, 90194, 6406481, -8133595, 2793339, --7605314, -823560, -10275172, 16896938, -4964982, 1155346, -5325223, -15400142, 8890045, 3117610, --11489574, 7125888, -5171141, -3806952, 4030827, 15993921, -7970386, 15451145, -293668, -10849087, -467078, 3615289, -9540196, 10550050, -5519570, 7814156, 16983374, 1666447, -7914551, -2211908, --890669, 3897683, -6728067, -3675418, -894964, 8371965, -2970507, -3352759, -11092827, -369904, --13117367, -2413772, 14901926, -3331821, 8494372, 812286, 2281165, -19498614, 289373, -12473122, -10077604, 17488570, 5417028, 4402342, 1110786, 2630131, -10167798, 3604551, 5473936, -4529580, --1242319, -4013647, -2534568, 7891466, 210453, 9569724, 29316910, 10710038, 2957085, -10044318, --9313637, -6044630, 5790690, -9944997, -828929, -892816, 2076080, 5650030, -5425618, -1014686, -5484673, 5995238, 1270774, 1036161, 4107599, 5164698, 4340065, -32749, -911070, -950262, -496606, -2111513, -2611877, 2348810, -1298691, 3642132, -4393215, -1388885, 3115462, 2625299, --217433, 2373506, -2237678, 1090922, 1663226, 2204929, -2460480, -2451353, 3523484, 2498597, -2000381, -882079, -1699733, 857383, -4892505, -1283658, 844498, -2619930, 1256278, -1814624, --1232119, 573378, 455803, -404801, -925565, -3669513, 30596274, -16569447, -454193, -8233989, --15529528, -20725902, 5737003, -6649146, 6075231, -19618874, 3841312, 6982543, 6282464, -8249559, --18012556, -14191109, -11917461, 131533, -6941204, -13160854, -9062381, -4624069, -10751914, -7514582, -1753420, 13515725, -403190, 1891933, -539018, -11967926, 7281580, -1132261, 2088428, -2710661, --7957501, 6660958, -9908490, -13807783, 12240657, -13472776, 2567317, -181999, -18891414, -11294153, -7256884, -400506, 8943733, -6073084, -20066624, -147640, 588411, 7382512, 7850127, 18589156, --10924249, -38511360, -13559749, -13182865, 8486319, -25117506, -8593693, -4250407, -23079006, -7725036, --519154, -4445828, -4436701, 4937602, -6322192, -620623, -5939940, 5321465, -13631689, 4793721, -10715407, -13739600, -7004555, 6657200, 5158256, 4468377, -14125611, 3251290, 33286, -2051921, -7289097, -1942936, 5971079, 5318244, -1342714, 1602560, 1044214, -1763621, -4789426, 7569343, --2639258, -5452461, 35970, -289910, 3961571, 1374390, -116501, 1198296, -4164508, -4201552, -334471, 1367947, 2324114, 4301410, -639413, 1923072, -561567, 1691143, -4825396, -2120640, --3385508, -3080029, -619549, -722091, 1604170, -5411122, -2542084, -4071092, -2951180, -5666136, --6978785, -6180995, -775778, -637266, 625455, -3834869, -4932770, -17763448, 6977711, 8732205, --2961917, -3444564, -8876624, -9779641, 22493280, 8185671, -21070572, 7260106, -11498701, -1108638, --10451803, -21618718, 6303938, -11269994, -4755066, 886374, 590558, -5505075, -18318572, -11333345, -8922795, -11203959, -352724, -9908490, -15253576, -5915781, 16844862, 2717104, 2962991, -14713484, --4982162, -3000572, -1964411, 6003291, 7358353, 9564355, 11767137, -5741835, 6612102, 2356327, --6868727, 4220879, -11512123, -9955197, -8681203, 3762928, -10022306, 523449, -15046881, -13111461, --6824703, 15603079, 12102144, 11871826, 12993887, -11944304, 16292422, 607738, 7481833, 22531398, --4662187, -4060355, 3613141, -10734734, 4414153, -4993973, -14013941, 1915555, 11365557, -13394929, --9669045, -1547262, 12214887, -10144176, 1119913, 3898220, 7320772, 1974074, -3110093, -6863358, -1817308, 5364414, -2936684, 810138, -3683471, 1309965, -3507378, 1534377, 149250, 2097555, --1384053, 1506997, 2398739, 6514392, -897648, 47245, 423591, 3144453, -4804458, -1758252, --5283347, -1241782, -1272384, -5718212, 1004486, 5602785, -603980, -6835978, -1327682, -401043, --6277632, -6670084, -10239202, -3929895, 3730179, 898722, 2593087, -1251983, -1966021, -3340948, --684510, -8582955, -1775432, 5633387, 8299488, -110595, 2378875, -4704063, -8392366, -19698868, -22737020, -17595408, 23542864, 13214004, 9028558, 5108864, 9311489, 10094784, 9351754, 25285546, --8720394, 1862405, -1582696, -4264903, -662499, 3206193, -2237678, 4928475, -1530619, 7960185, -6716792, -1342714, -4258997, -25041270, -8840653, -18145164, -733366, 9676561, 9798968, 3151969, -5046587, 7308961, 6094022, 7084549, 18100602, 26894012, 18112950, 3692061, -3299609, -5123896, --7589744, 9445170, 9676024, 10775536, -7857643, -6230387, -9773198, -1583232, 13191992, 175557, -15785615, -9454297, 8511551, 5099737, 14180908, -29350196, -20928302, -8580808, -11691975, -12046846, -3750580, -4898410, 18624588, 5524402, -20500416, -1670742, 33503430, -11224897, 10536629, -5018670, -13845901, -6367826, -4043175, 512175, -5537287, -7429757, -404264, 5625871, 8390219, 5769752, --2034741, 6502581, -1593970, 3010772, -8369281, -5783711, 5585068, 3466576, -8413841, -3727495, --3492882, -1150514, 2262911, -2257542, -4053912, 1921461, 518080, 1387274, -534723, -2433099, -3934727, 1219771, -2013803, 5001490, -564788, 1451699, -797790, 5895380, -4895726, 5243082, -2455648, -4997195, 3417183, 133681, 1015760, -5217312, -14954539, 5606543, 270046, 1036698, --1591285, 5690295, -1256815, -2759517, 1979980, 4421669, 3867618, -2306934, 4762045, -14501420, --7264937, 11994770, 5235565, 8841727, 23098334, 1956358, 15432354, 22551262, 15668578, -10241350, --22967338, -799938, -10548440, 24729884, 7120519, 19312858, -2771865, -10401337, -3828963, -11348377, -4457639, -8742406, 1042066, -9735617, 5039071, -7125351, -2989834, -15614354, -15440407, -1575716, --22115860, 12060268, 8332774, -6663642, 11311870, -5439576, 4393215, 12548821, -13986561, -18375480, -3248069, -4059818, 30746598, 13008382, -33765960, -9174587, -9594420, -17477832, -18447958, -37769944, -6632503, -13578539, -3553012, 5335423, 1355599, 7690676, -1513439, -4536023, -28594818, 3322157, --13009993, 3433290, 16738561, 3447785, 11218455, -17107928, -22619446, 4485020, 13996225, 9349070, -5247377, 8876624, 14552960, 18135500, 18727668, -16751983, -10042170, -12095702, -8595840, -14107357, -19761144, 11491722, 11138998, 2950643, 8517457, 7201050, -702227, 10230612, -15933255, -5709086, --1904818, 1202054, -3449396, -11403675, 644782, -2396055, 1471026, 3556770, 11551851, 528818, -5408438, 5301601, 871342, 5633387, 198105, -3601330, 714575, -8786429, -3510599, 4505958, -6673843, 1925756, 1234266, -10724533, -1011465, 246424, -5079336, -3661997, 1592896, 3267396, --9709847, -10903848, -4886599, 3514357, 3153043, 5356361, 1345935, -3579318, 2447058, -11290932, --9878425, 40805948, 26949310, 37439768, 2421825, -7427609, -25447682, -7508140, 4246649, 5900748, --6075231, -19662898, -7117835, 32349694, 13364864, -4477504, 9895068, -732829, -11901891, -3474092, --7772280, 22056804, -1712618, 1292785, 9502615, 623844, 10784663, -114354, 15273441, -14075145, -17600776, 3566970, -8230231, -4967130, -9114994, 15907485, -22069152, -23805930, 15027554, 24893630, -1140314, 17183628, 23605140, -26615376, 8826695, 5435818, -1494112, -245350, 3917010, -9992778, -18520972, -11265699, -8989367, 7492571, 905701, -2017561, -4357781, -5553930, 2633889, -17584670, --5309654, 14149770, -17388712, -4002910, -11762842, 431107, 35041564, -11033771, 2202781, 9379672, -118112, -8091182, -21978422, 21406118, 9931575, -44164076, 10878615, 11098195, 8150774, -9915469, --4679367, 22537840, 941672, 1644973, 5709622, -15705622, 523449, 9962714, -4158065, 5747740, --1337882, -5121212, -13165685, 1969779, -1810329, 12096775, -1223529, -543313, -8807904, 9574556, --3333968, -3371013, -13909788, -6973417, 4742718, -8924405, 619549, -4420058, 5401995, -5246303, --11228655, 5563594, -12090870, -3329674, -5571110, 505732, 588947, -4548371, 11777874, -1537061, -15926276, 9740449, -1773822, 1616518, 10123775, -7209103, 1672890, 1138703, 9696426, -9029095, --5483063, -17971216, -43437152, 39140036, 23439248, 12586939, 8933532, 19466402, -43833900, 18366354, -20631412, 8979703, -27964532, 15967078, 28809030, 13485124, 31739808, 11734924, 807991, -994285, --716723, -5107253, 13605920, 22611930, 21567178, 7695508, -6272263, -10858214, 2927557, -9864466, --11567421, 12702366, 8837432, 2616709, -11593190, -11302206, -2263985, -9795747, 5392869, 25938918, --4296578, -8070781, 8946954, 4893579, 7887171, 9209484, -1693291, -4954782, 20920786, 13891535, -7023882, 9339943, -1391033, -20293184, 5032628, 13885092, 2043331, -15050639, 20709258, 5548561, -28700582, 1272384, 25827786, 2946885, -8104067, -2509335, 6401649, 36588828, -4323959, 13283260, -9236327, 17393544, 9275519, 280784, -834297, 11412802, 52032456, 2617246, 21036212, -17355962, --12837657, 6765647, 8407398, 10275709, 4416837, 1839320, -25173340, -9883793, -26409218, 1632088, --4317516, -8637716, -7196755, -2796024, -10992432, 1580011, -907849, -11671037, 8719857, -13624173, --6437619, -12289512, -8252780, -669478, 1622961, -9808632, -11299522, 2917357, 7592429, 8709657, --1497870, -3153580, -14615237, -19303194, 2185602, 2495913, -8614631, 17792976, 17346836, 25424596, -9116068, -5470178, 3691525, 7915625, 9812390, 11592117, 1923609, -11916924, 3248069, 15453829, -8096014, 858457, 6368900, -28547038, 31158378, -542777, 27574764, 610959, 1822677, -25162602, --7761543, -11365557, 19126026, 4797479, 8457327, 4983236, -19299972, 1821603, 1515050, -17007534, --24244554, -24839406, 8362302, -9295920, 22528178, 1198296, -7162932, -5953899, 4855461, -8834211, -1452773, 6500970, -9483825, 5216238, 7604777, 2476049, 2180770, 16935056, 28682866, -5737003, --213138, 14281840, 11813308, 17127256, -12780212, -5147519, 5221607, -17288318, 1699733, 1356673, --22756348, 29233158, -1410897, 14685030, 12826920, 8835285, -17299592, 1501628, 14847702, -12193412, -26400090, 7099044, -9598715, 21656836, 16478179, 11323681, -36659692, -7622493, 7351911, -12678743, -2021319, -20617454, -5077725, -31171262, -8827232, -4893579, -8517457, -34529928, -3398930, -9538585, -51717848, -7591892, 10579578, -5460514, 8326331, -4491462, -8369281, 5428839, -7004018, -1246614, --3732327, 13723494, 5062156, 5945846, -22231824, -20113332, -14824080, -6365142, 4041564, -28210956, --4420058, -2416993, 2203855, 10109279, 7881802, -999654, 10998874, -9981504, 345208, 430034, --16027744, -22473416, 4537096, -6688875, -20559472, -5840082, -9601936, 1249836, -21977884, -2688113, --9501541, 12903692, 386010, -9609989, -3266323, 3907347, 5352603, -2280628, 10182831, -10269804, --6077916, 12779138, 12555800, 16088411, 14131516, 10531260, -7634841, 6588480, 17639968, 17034378, -7501698, -20534238, -23833848, 10620380, -3263102, 7690139, -4369056, 20272782, -15080704, -3087545, --5187247, 17689360, -13242458, 30986578, 38071128, 38845832, 2415919, -7154342, 6327024, -4997732, -9521942, -1609002, -187905, -11323681, -31118648, -10326175, -29801168, 17150878, 16124381, -18331994, --13730474, -18377092, -8584566, -2609730, 40699112, 529892, -20718386, -22239878, -1314797, 28491202, -13619878, -56948044, -11599096, -10022306, 7530152, 21482890, -24724516, -7783555, -14710263, 6535867, --33749852, 16864190, -5601711, -699543, 9409200, 1459215, -16510928, 33415920, -3308199, 15938087, -35736276, 73256576, 43923020, -992137, 24690694, 37403260, 48037060, 52111912, 14923401, 31957242, -9154723, 501974, 19604378, -15304042, 32139778, 13857712, -13915157, -47759500, -34778496, 4645007, --13567802, -9709847, -8788040, -5194226, -5828271, -19601156, -12853227, 852014, -2993592, -958851, --6147172, -1620813, -10211285, 12888123, -21213918, -8570607, 6233608, 4062502, 1989644, -5348308, --6581501, -3607236, 4366371, -3235184, 11048803, -12724914, -16093242, -16034187, -9908490, 12513387, -13919989, -5005248, -2330020, 5226975, -2559801, 23146116, 5062693, 2219961, 18473192, 11731166, -10605348, 26275000, 17219060, 19826642, 6203007, 9672803, 21604760, 8531953, 8972724, -7183333, --16262894, 18925236, -23647016, 39813272, -4610111, -7207492, 814433, 31722628, -21053392, -3650722, --843424, 510027, 11560441, -8108899, 16636556, 5829881, -3037616, 3925600, 1977833, 13088913, --39737576, -12475806, -1142998, 4292283, -3863860, -28936806, 23883776, -1243930, 3328063, 8697309, --18860812, -8556649, -43856984, 11707544, -10227391, 8485782, 32136556, -8734890, 6786049, -4072166, -15351287, -26169236, -35035660, 30798674, -2835215, 2699924, 5255966, 30976914, 22580254, 26891864, --419296, -35868884, 21356724, 10062572, -8449811, -12656195, 20412906, -3677566, 25798794, 42672112, -33166274, 5694590, 2921115, 31493384, -6172942, 9707163, 25901874, -17566954, 29943976, 18361522, -10693932, -21097954, -10419591, -28169616, -794569, 9733470, 42039676, 17747342, -38981124, -3551938, -25259776, -3651796, 12312597, 16950088, -27635430, -6794102, 13543106, 3301219, 7585986, -12040941, -9012452, 15269146, 2014340, 261993, 22326314, 4292820, -4770635, -5750425, 7434052, -1932735, -12012487, 1923609, 9099425, 10341744, -1531156, -10660646, 21976810, -3124589, -6702834, -1387274, --14870251, -14958834, -9811316, -10354629, 7159711, 13016435, -13034152, -11169599, 2629057, 19543712, --28168006, -6823630, 10910291, -3330747, 91805, -3827353, -3027415, -20253456, -265214, -5392332, -5631239, 1568737, 3388729, 237297, 1771137, -1603097, -55188184, 12604118, -9155260, -2200097, -43050604, 18478024, -13526463, -10499048, -180926, -27904940, -34149284, 2841658, 284542, -19253802, -20372104, 2421288, -19709068, 12400644, 37046240, -5018133, -21350282, 13350369, -12571906, -13759465, -6916508, 30032558, -9794136, 4344360, 8257612, -9346386, -22395570, -14767171, 29726542, 10386305, --29286308, 24990268, 9844602, -20153598, -10478646, 41195716, -13406740, -31755378, -16255914, 54774792, --54134840, -25187298, 32160178, -14632954, -17389786, -51697984, 40287332, -33138358, 11861626, 1618666, --6164889, -58376660, -17190606, 49777596, 31490700, -39532488, -10757282, -17182016, -8036958, 7973607, -10878078, 12873628, -68801080, 37543920, 28923920, 30187178, 521839, 15744276, -33634424, -30070676, -58980100, 24053964, 6586333, 23601920, -31656056, 6258304, -13969918, 15029701, -8500814, 41216116, --16789028, -14506789, 5805185, 4857608, -15569256, 9281424, 4619774, 3384434, -2873333, 1956895, -3405372, 3226594, -3793530, -2379412, 8741869, 354872, -4509179, 17947594, 5418101, -16232292, -1858647, 15370614, 4134443, -15451145, 20613696, 36699420, -18025440, -21283710, -5640903, -4922570, -12594992, 26840862, 8272107, -25148108, -8231842, -3797288, 3815005, 7435126, -4112968, 10880226, --7885560, -1122060, 6552510, -45426796, 7956964, 56883084, 17827336, 6168110, 1622961, 4337380, -24431384, 33423436, -7563975, 6298033, 8691940, -5677410, 20184198, -10543608, -2785823, -7964480, -15520401, 11540577, -6253473, 10615012, -15095199, -12290586, 15496779, -9866077, 17022566, -11251204, --4963909, -274878, 9330816, -524523, 6957310, 2849174, 17333414, -12307766, -2416993, 357019, --6818798, 16734803, 14526653, -11904576, -4189204, -7297150, 3888556, -15374372, 8375186, 4808753, -7691750, -6114423, -4625680, 19040664, -22769770, -3899294, 9681393, -6144488, -4099010, 9982041, --27996208, 6818798, -10101226, 1723893, -9890773, 24300924, -7845832, -10430328, 10008348, -5462662, --15849503, 30892626, -803696, 3206193, -6845104, -11833172, -13950591, 15608985, -17434882, -8382703, -17839146, -24237038, -10531260, 3180423, -2231236, 3029563, -335007, 3514894, 10860899, -3837017, -4285304, -4902705, 11394548, 6267968, -435939, 1013612, 6960532, -6022081, 5071283, 870805, -5573257, -2446521, 8637179, -4325569, 2357400, -7423851, -6406481, -10160819, 1953136, 651761, -3464965, -4952098, 11472395, -3719979, -1915555, 9851044, 8688719, 4683662, -3969624, -6525129, -5945846, 7866770, 4947803, 3426847, -56908, 7114614, 7710003, 3437048, 6556268, 905164, --5001490, 14734959, -42477764, -119853744, -98487360, 51880520, 14797236, 118887376, 212517136, 31457414, -66920960, 24263344, -169716704, -53757960, -115171696, -139164992, 3789772, 22075596, -58116276, 83915072, -109881368, 61611844, 175317344, 101045552, -22690312, -41772852, -81528680, -158582544, -125250376, -37015100, --111701896, -15683073, 96156800, 15943455, 22291418, 145415776, 74132208, 45796700, 151633280, 23246510, --42012296, 59192704, -79595944, -157556576, -65996468, -132951248, -166342480, -2565169, -34831648, -43888660, -110586280, 121865936, 77517720, 183938416, 148405616, 69927976, 63248224, 36550708, -123118992, -113288888, --143406816, -189333440, -151813136, -64151244, -44088912, 3741454, 108652472, 132120176, 138337136, 132578664, -122876328, 26090852, 2172717, -21033528, -93864360, -102871448, -59475096, -107861128, -45431628, 9248138, --23607824, 53902376, 97165584, 29590178, 40993852, 18125298, -26652956, -16721381, -40745280, -53049288, --6448894, 14721537, 325344, 43472584, 40182104, 4415764, 38681012, -145492, -49143552, 43142948, -12961674, -43791488, 30595200, -32478542, -65641596, 29792040, -46732464, -115732192, 1753420, -51037096, --33719788, 114390552, 51774220, 54308252, 163842272, 108506440, 60254632, 71389872, -17882634, -103752992, --131733088, -178965920, -197857872, -125675040, -80234824, -13973676, 75252656, 167494592, 185031488, 171438992, -178644336, 95409480, 4387846, -45678588, -117630568, -150588000, -97391608, -108795280, -86541984, -17474074, -3308199, 11541114, 42762840, 36324148, 31913218, 56554520, 56602300, 47831440, 56633440, 39530880, -14287746, -2864743, -21993454, -52027088, -54877872, -40637908, -32021666, -13900125, -4604742, -3220689, --3836480, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --10573136, --12868796, 6489159, -2356327, 5675263, -2819109, -2884071, -5756867, 1356136, 1220308, -258235, -93416, -646393, -4403415, -512712, -2517925, -2896956, -2744484, -106837, 330712, -221191, --495532, 2181844, -606127, -6664179, 4145180, 2057826, -2269353, 663036, -64425, 68183, -935766, 4279398, -2386928, 249645, -7549479, 3759170, 743029, 1695438, 2609730, 4236449, --2370822, -1807108, -857383, -3801046, 304406, -576063, 3281892, -1769527, -224949, -1842541, --2105608, 3991635, -3012383, -1461363, 375273, -2739116, 2282775, -107374, -1284195, 2466385, -4533875, 279173, -176094, -642098, 3876208, -3857954, 33823, -607738, 2028298, -954020, --1765232, 4211216, -74625, 884226, -1171452, 869194, 2267206, -1823214, -2542621, 122943, -2213519, 3712462, -1674500, -1139777, 914828, 195421, 568009, -1711545, -550293, 1011465, --230318, 709207, -1349157, -425739, -832687, -1169305, -842887, -788127, 591095, 98784, --590558, 587874, 407485, -539555, -166967, -137439, -731755, -1319629, -369904, -5369, -270583, 706522, -15343771, 2608119, 1813013, 5377836, -2108292, 1629403, 6252936, -2422362, -1708860, -3794604, -5567352, 2036351, -3790309, -4326643, -4340065, 1305670, 1655173, -7405598, -4352413, 2884071, -1260036, -2712809, 1731946, -675921, -1686848, 534187, 2454037, 1813013, -3920232, 754304, -1194001, 4033511, -2030446, 8799851, 1981591, 5420786, 2090039, 4755603, -2118493, 3276523, 1774895, 389231, 182536, 6658273, 1129576, -1072131, 440771, 3514357, -2605435, 380105, -297963, -1372242, 742493, 8123394, 2331094, 3752728, -3926137, -2024003, --4140885, -2622078, -4019553, 3015604, 1906966, -2573222, -1829656, 1805497, -1915019, 2015413, --900869, -614717, -2779918, -4693863, 2019172, -7620883, -1075352, -1632625, -1926293, 406411, --1777043, 348966, 2869038, 1380832, -1952600, 345745, -1548336, -3325379, -535797, 1581622, --161598, -2570538, 932545, 459562, 973884, 1742683, 70330, 234613, -1203128, -741956, --176094, -32749, 632971, -1398549, -1182727, 8637179, 11900818, -3645354, 3200825, -5910949, --311922, 353798, 15205795, -1554241, -4014721, -6551973, 156766, 4363687, 6997039, -1575716, --9173513, -2639258, -3494493, -2505577, 3124052, -672699, 5844914, 651761, -3297461, -7422241, -2232846, -695248, 1731409, -894964, 845035, 3638374, 1341104, -9339406, 1131724, 6009196, -2962454, 739271, 1445793, -1500554, 4170950, -5522254, -531502, 4555887, -3134789, 537, -7409356, -3418794, -341987, -2508798, 4561256, -4789426, -3546032, 2216203, -4958540, -2449205, -6470905, 3798899, -5767068, -2130304, -858993, -1433982, -2624225, 2073932, -2251100, 2378875, --62277, 353798, 1051193, 4877472, -545998, 6724308, 3484829, -5164698, -2370822, -2521146, -4049081, 1203128, -262530, -2075543, 5418638, 2083059, -90731, -117575, -1342177, -1241782, -1615982, 622770, 1791538, 4219269, 1544578, -228170, 287763, 340376, 1380832, -280784, -533650, 2017561, 451508, 2496987, 96100, 884226, 1291175, 1530619, 562641, 969589, -1124208, 914291, 1449552, -438624, 456877, 984084, 1484448, -125628, -1102733, -1314797, -339302, 28390270, -10488847, 5761699, -8010114, -831076, 283468, -581968, -4245575, 2327336, -3267933, 796180, -3088082, -6575595, -245350, 4020626, 2856690, -2890513, -4950487, -397284, -4435628, 8100309, -4367982, -586263, -3297461, -7087233, 794569, -3565360, 2152852, -2639794, -5515812, -9678709, 6536940, -428960, -5761162, 1403381, 2428267, -683437, -3049964, 188442, -7573638, -286689, 1249299, -1072131, 2900714, 1333587, -1785096, -2845953, -6221797, 4033511, --1299765, -1835025, 2397666, 38655, -10459856, 8036421, -11258183, -6504191, -7971996, 1714766, --930934, 4775467, -2607582, 2537252, -4796942, 2303176, -1251446, -1970316, -5292474, 3237332, -3735011, 6368900, -1544578, -618475, 1734630, -1946694, -1137630, 1218697, 3693672, -4888747, -2420751, 3494493, 3903589, -6193343, -5043902, 2107218, -3149822, 1600949, -43487, -382789, -553514, 765041, -252866, 1446330, -1789928, 862215, -548145, 3601330, 227096, 871342, -826244, 216359, -1410897, -139050, 367757, -411780, -22416508, 2263448, 216896, -1921461, --3474629, 3899830, -3058554, 2588792, -824634, -57982, 3600793, 4695473, -2919504, 3454228, --1032403, -1932735, -6302865, -325881, -8508867, -6249715, 7452305, 2649458, -2913062, -1074279, --896038, 5169530, 2717641, -2683281, 4709432, 3129958, 1835562, 1620276, 1994476, 3586298, -3081639, 3044058, 8336532, 7504382, 3230352, 819265, -5209259, 5767068, -7730941, 1511829, --2165201, 6248641, -4735739, -6153078, 10539313, -2471217, -5669357, -5055177, 7841000, 4810900, -274341, 4027069, 5688148, 2603824, 9207873, -561567, -1468879, 5220533, 3185792, 295279, -193810, -4809827, 2864206, 2980171, 7430294, 3017752, 4621385, -2873333, -3838627, -8139500, --1881196, -4408247, -3509525, -3714610, 4090956, -159451, 301721, -2393908, -2768107, -778463, --2437394, 737124, -1647657, -2707977, 1088774, -279710, 84289, -2535641, -384936, 89121, --3191698, -450435, -774168, 196495, -1444720, -1664837, -1040993, -627602, 37581, -545998, -483721, -759136, 867583, 197032, 764504, 1725503, -420907, 1822677, 356482, 1191317, --864899, 358630, -1612223, -609885, -290447, -1933809, -615791, -960462, -29869350, 7989713, --6392522, -9442486, -9336722, 5761162, -6935299, 5086315, -8706972, 4763119, 4065187, 2491081, --9164923, 6244346, -131533, 3772055, -7596724, 4198868, 8942122, 6830609, 227096, -3231963, -1240172, -1957431, -9684078, -1978906, -4664872, 2189897, -6098854, 5197984, 5098663, -2044404, --245887, 7160784, -1595580, 4851166, -3942243, -6283001, 3241627, -130460, 3354906, 8813810, -5356361, -352187, -15425912, -7408282, -2160369, 2115808, -2391223, 8461622, -13404593, 4214437, -1795296, -157303, 4174171, -1756642, 6478958, -14052596, -6570226, 5413807, -14122389, -2636573, -6558952, 2334315, -3136937, -9427990, 3470871, 6047314, 4431870, -1702418, -9890236, -874026, -52613, -1142998, -549219, -4855461, 2167885, -7753490, 4731444, 645319, -4608500, 883690, --5538897, 395137, -6620692, -1870995, 2290828, 2408940, 192737, -659278, -2296197, -1739999, -439160, -3901978, 3100430, 214748, -1898376, -12885, -3369402, -2665027, 724776, -1402307, -1793149, -1788317, -1005022, -1181116, -1290638, -2290828, -403190, -1290101, -523986, 607201, --549219, -1047972, 811212, -438624, -894964, -921807, -2027225, -1434519, 247497, 1033477, --324270, -14036490, 1513976, 2340220, 10994579, -10384157, 12004970, 3404835, -971200, -2818572, --1298691, 1116692, -8783745, -1677722, 2808372, -2880313, -5159330, -1387811, 8297340, -8573292, --1874753, 8601209, 29528, -3400004, 3020973, -4172024, 6313602, 2790118, -92879, 3173444, --3684545, -5768141, -427349, 454193, 4717485, -10121627, -5481452, -4458176, -3148748, -2987150, --3090229, 1537598, 477278, 861678, -7584376, -7747048, -6189048, 245350, -9739375, -5344013, -5794448, -3911105, 1259499, 645856, -210453, 2455648, 3423089, 3317325, 3877819, 5763309, --1045288, 6234145, -430034, 3169686, -552440, -3947075, -271657, -6386080, 3932580, -7479149, -6980933, -8348880, -167504, -8611409, 780073, -8651138, -8404714, 4002910, 11471858, 3522410, --7470559, 5345624, -46171, -3232500, -2006824, -3387656, 4532264, 4000762, 5583458, 1070521, -4341675, -3652333, -450435, 4363150, 454193, 1391569, 795643, -2029372, 2525441, -167504, -905164, 3882651, 1061931, -879395, -2337536, -975494, 1515050, 1633161, 1183800, 519154, --1837709, 217970, -440771, -3913789, 3817689, 534187, 1353989, 270583, -1015760, -1800665, -1297617, -1835025, -992137, 39034272, 471373, -11252814, 1777580, -6109054, 15565498, -2545842, -4383014, 1139240, 759136, -13675176, -7004018, 7583302, 6670084, -10776073, -1887101, -328565, -9596031, 4714801, 3655554, 9401683, 1486059, 614717, 8169028, -2857227, -12424804, 1836099, -9512279, 5624797, -3593277, 186294, 6635188, 4038343, 1818919, -358093, -6968585, 3389803, --7580081, 750546, -14276471, 3739843, 4405026, -1161252, -6566468, 9062381, 4774930, -1884954, -7058779, 3246459, -5939403, 10880763, 1180579, -3865471, 2534568, 11157251, 1745367, -294205, --9306657, -5439039, 1313723, 3779034, 12730820, -4200478, -5034239, 1097901, 6953015, -4491999, --5507222, -501974, 9256728, 6615324, -2295660, -7104950, -362388, 8072391, -3205119, 16769700, -3665755, 2502355, -8575976, 7283191, 451508, -1859184, -4352413, 426276, -2425583, 445603, -10386842, 4727686, 3792993, 1978906, 1214939, 170188, -658741, 959388, 2103460, 3741990, -595927, 673773, 1393717, -2841658, 79457, 1232119, -621697, 3258807, -2291902, -64425, --1112933, 1283658, 5529234, 1887101, -1702955, -408022, 1332514, 471373, 1859721, -351650, --2356863, 2203318, 1990181, -1854889, -483721, 4867809, 1681480, 8798777, 4672388, -13883482, --1445793, -7026030, 13937706, -5244692, 6491306, 1231582, 8724152, 3431679, 1285269, -732292, -3538516, -4003447, -5934571, -16429324, -12155294, 3998615, 10798622, 14486925, -5346161, -7103339, --6242735, 3218004, -3425237, -758599, -594316, 1934346, 2201708, 9664750, -5166846, 889595, -2379949, 4709432, -4689031, -3497714, -7733626, -5259188, -5392869, -9221832, -23351200, -293668, --3131568, -10055592, 2249489, -1154809, -12665322, 4231617, -10740103, 2731599, -1305670, -902480, -5447629, 7035157, -202937, -10494216, 3084324, -6595459, -7252053, 10059350, 9106941, 10132902, --3310346, 1624035, 1351841, -5202279, 808528, -2510409, 15909096, -2647847, -1631551, -1596654, --107911, -9730785, -12016245, 2838974, -870805, -913754, 2725694, 17285632, -2128156, -8128226, --3409667, 9065065, -1312113, -2967823, -2601677, -205085, -7357279, 1763621, -1400696, 1358820, --3707631, 144418, -4667019, -416075, -278636, 1875827, -1945620, -984084, -2841658, 3847754, -268972, -2860985, 657667, 1258962, -3011846, 753767, 1225676, 4707821, -954020, 1069447, -3381750, 2044404, -1697586, 1979443, -3564286, -5905580, 753767, 530965, -2182380, -5508833, --1081258, -1383516, 4900558, 1766305, 3304977, -595390, 4115653, 4501126, -15300284, 5615133, -1836099, 16104517, -10882910, -6174016, -3633542, 8587787, -8251169, -7925826, 7107634, 4779225, --8346732, -8412767, -8243116, -18403934, 12037183, 11305965, 11983496, -5194763, 3769371, 11900281, --17304960, 4295, 11312407, 10495826, 4742181, -45634, -5559299, 1138166, -2692408, -14964740, -1867237, 4079145, 2166811, 9898289, -8765491, 926102, -16358457, -2087354, 3200825, -8987219, -3442953, 2742874, 7277822, 8916889, 12396349, -2553895, -4904853, -15009300, -10731513, 4614406, -22005264, -6848326, -943819, -10166188, -5407364, -8067023, 4719632, 4871030, -1721745, 711891, --16152298, -2135673, 10886131, -8720394, -7580081, 6467147, -2938831, 9467182, 2314987, -6966974, -1093606, -10522133, -3060164, -2782065, 20258286, -2034741, -5971079, 4440460, 4110284, -1785096, --3482682, -1038845, -2806224, -3773666, -3544422, -2688650, 1392643, 1575179, 3238405, -845572, --84289, -1956358, 1948305, 513249, -5239860, 1393717, -80531, -563178, 1847910, -115427, --2877628, -2811593, -6762426, 2244657, -2152852, 1988570, 2534568, -3161633, 1410360, 921271, --709743, 2555506, -25233, 7296076, 987843, -1318555, 138513, -2114198, -417149, 1276142, -170725, -629213, 557809, -2843268, 2245194, -9569724, 21889838, -10900090, -5649493, -513249, --802622, -15664819, 927176, -11553462, 8222178, -21650930, -3221762, -6967511, 7290170, -7490423, --7546258, -18325552, 12228309, -7570954, 4980552, -5936182, 3603478, 9663140, -7139310, -12031814, --4098473, 8137353, 16927002, 5408438, 7043747, 788663, -17198660, -9222369, -9306120, -4799626, -2919504, 15473157, 6616397, 8990977, 8404177, -2424509, -3690988, -5271536, -14388677, 727997, --10063645, 15447924, -7161321, 10624675, 2211908, -5634997, 3504693, -3767760, -4927401, -8490077, -12658342, 3286724, 21437256, 4661114, -23225572, -5822365, 7349763, 5973763, 3314104, -1358820, -1980517, 24178518, 12045236, -4146791, 2534568, -6575595, 17485348, -724239, -762894, 6782827, --15541339, -6728067, -5334887, -16596291, -19673634, 3835406, 6915434, -1886028, -9737228, -2580739, --3156264, -7638600, 34360, -1602560, -6090264, 5916318, 9074729, -2068027, -1440962, -1440425, --3692598, 2570001, 519154, -1102733, -1949915, -1655173, -1184874, 2958696, -1872606, -4377646, --1161789, -272730, 1272384, 796716, -2750927, 6409702, -2243047, 3866544, -885300, 3216931, -1609539, -1116692, -4531191, -4299799, 1325534, -1222992, -6789270, -2521146, -1771137, 2373506, -483184, -574452, 1722282, 2976412, 891743, -1902671, -2887292, -13333726, 8060580, 17949742, --1707786, -722628, -362925, 16687022, 5202816, 4039954, 2891050, 2019172, 2876554, -6501507, -1266479, -20558398, 3001109, -9879499, 8652212, 21131776, -2699387, 1588601, -16593069, 22274774, -10814191, 9495099, -2732673, -12164958, 1504312, -4114579, 11307575, 8142185, -10071698, 595390, -5978595, 4261682, -7791608, -6886443, 32583232, -7493644, -5650030, 6920803, -8265128, -5986648, -10375030, 10200010, 422517, 3961571, 3707094, -12541305, -6249715, -477815, 4311074, 11092290, -2743410, 2666101, -14219026, -1283122, 4213363, -19366008, 4271882, -5341866, -1951526, -3520800, -5724118, -5716065, -10538239, -11210938, -17837000, 2319819, -7226283, -3419868, 11433740, -3808562, -3711926, -20064476, -35433, 18608482, 4337380, -9295920, -5571647, 11331197, 5772973, -12283606, -6930467, -8876087, -6897718, -2875481, -1734093, 4275103, -1200443, 796716, -1917166, -2394444, -1486059, 2313377, -3148748, 2741800, 8179229, 1337882, -1127429, 3572339, 5164698, -2134062, -3510599, -2238215, -3189550, 959925, 2330557, 6867653, 1783485, -599685, 2463701, -971200, -3498788, -1917703, 3214783, -2393371, 1059783, 2905546, 813896, -4640712, -2694018, 8698919, --3674345, -6840273, 3391414, 1870995, 2524904, -1753957, 11043972, 3293166, -10327786, -10369125, -24533926, -14740328, 3798362, -9434969, 28929826, 6121402, 5319854, -9293235, -10993506, 1022202, -8238284, -8913668, -14198088, -8448738, -20629264, -8055211, -12127914, -52613, -27713814, 1908039, -14954539, 9201967, 12215961, -8581882, 3157875, 13276818, -1580011, 9620190, 3549254, 15009300, --7581154, 12513924, 9934259, 7105487, 16256451, -9148817, 9668508, -5008469, -5832029, -3866544, -3564823, -31614718, -10141492, -19657528, 22695680, -14343580, -16210280, -3476776, 12790949, 344134, --5818070, 17867600, -6429029, -5681168, -13015362, -31967442, 1513976, 2961380, 13282186, -13407277, -2684, -8176007, -10816338, 17086454, -3487514, 8558796, -18622442, -18096308, -11322608, 14246407, --1504312, -9024263, -9614284, -380105, -15800648, -10759967, 1495722, -6607807, -11793980, 17344688, --23834922, -22669912, 5893232, 105227, 9980967, 1160715, -1131724, -7302518, -6497212, 1078574, --11289858, -4518306, 9549323, 1293322, 1605781, -5541045, 5638755, 2131378, -6183143, 2906082, --4593468, -904091, -4709432, 4096862, -6253473, -1525250, 4197794, 8283918, 886374, 377957, --9015673, -2674691, -650688, 1350767, -1361505, 7691750, -354872, -2873333, 4854387, -5640903, --5265630, 3280281, 6949794, -1901597, -4986994, -6662568, 5343476, 4397510, 8628052, -11963631, --165893, 15846819, 2007360, -4900021, 8134131, -13025025, 25678536, 16091095, -242129, -11865921, --13416941, 5478231, -3447785, -1287953, -795643, 23420994, -11631845, 353798, -8121247, 8569533, --14696304, -13468481, -26441430, 6026913, -10802380, -14892799, -1902134, -25133612, -12404402, 6994891, -5247377, -3514894, 12949863, 1140314, 15716896, -7056632, -21885542, -3387119, -16059420, -3118683, --4890357, -20968568, 2637647, 16950626, -48029008, 5999533, 24696, 11818676, -2473901, -14989436, --28538448, 11272142, -3585761, 10531260, 6252936, -3531537, 16506633, -20711942, 28855200, -7323456, -16056735, 33717104, 13423920, 23974508, 9358197, 6249178, -3372086, 12495670, -4760435, -13191992, --17796196, -11485279, -687195, 9912248, -1723356, -7783018, -11080479, -9882720, 13284334, -6007049, --4912369, 11946988, 2094333, 8988293, -1023276, -1352378, -3733400, 2084670, 4452271, -6172405, --1082332, -15044197, -10927471, 7342784, -3742527, -411780, -2273648, -314606, -5812702, -9011378, -6429029, -5433134, 8379481, -8665633, -4058744, -981937, -6140730, -3067144, 4180077, 1751273, -10178536, -2594697, -6204081, 3859028, -12330314, 192200, 1414655, -1913945, 718333, -1372242, -5951214, 8683350, 1400159, -313533, -4274566, -7268159, -3601330, 418759, 14148696, 7131257, --7256347, 40425304, 32943472, 29687350, -6747931, 89121, -25183004, 18844170, 23369990, 7960722, -22574884, 9023726, 7681549, 7935489, -3976066, 3136400, 6253473, -5738613, -24264418, -14722611, --888521, -16112033, -18786724, -44126492, 9707163, 7644505, 11514807, -8436390, -3011309, -5857799, -318901, -13788993, -389231, -10502806, 12226698, 10188199, -6299644, -8542153, -23272280, 39223252, --12239046, 7758859, -13422, 2542621, 6259915, -16189342, 19552302, -9841918, 6684043, 4401805, --14609331, -15036681, -2787971, -1297080, 9082245, 41401876, -3457986, 6175626, 1371705, 12503187, -8882529, 9321153, -7311645, -2157147, 3578245, -19975356, 4065187, -17090212, -27332098, 9549860, -867583, 2193118, -20010790, -48067128, 20797306, 21751324, 14969572, -27247272, 25967910, 27624156, -10208064, 8036958, 243203, -7917236, -18166638, 13631152, -12801687, 863288, 223875, -7174743, -5485210, -13009456, -1366337, -2512019, 6452652, -3577171, -6013491, -8065412, 12421045, -6769942, --2967286, 3286187, -11174968, 6257231, 5073967, -3815542, -3918084, 1137093, -10382547, 9650792, --3491272, -2536178, -878321, 872415, 7063074, -5512591, -13127031, 3968013, -7323456, -2201171, --7505456, -6575058, 1012002, -5302674, -2474975, -4933844, 16830904, -7394860, -13702556, 2233920, --4927401, -23708756, -47311212, 39245800, 6303938, 6959995, -15766288, -11353209, -50333260, 13904957, -35982700, 11028939, -31880468, -15953656, 5170604, -12414066, -7881802, 14744086, -16598438, 9262097, -8264054, 6834904, -18476950, 6594923, 5713380, -8673686, -17292076, -10012643, -6659347, -4479114, --16495359, -14228153, -7827578, -17009144, 13406740, -6352794, -21950504, -7583839, 13460428, -2789045, --15221901, -8382166, -7770133, -57445, -12066174, -7279970, -19992536, -18996640, 8085813, -6760279, -24937116, 16389058, 1601486, 14881525, -21805012, 14095546, -20697984, 17390860, -2982855, 8895951, --9233106, 30904438, -7708930, 17307108, -4431333, 25421374, 10234907, 6186364, -26240102, 28460600, -22778360, 9921911, 10583336, -20463372, -3908957, 8378945, 13981729, -3624416, 3374234, -22602802, -14503568, 24800752, -547071, -17748416, -1036698, -11734388, -10053982, 4862977, -59056, -4896263, -5729487, -12948790, -3048890, 507880, 3688303, -8923868, -12266427, 4731444, -5976447, -11565273, --20772610, -1511292, 6445672, -1713692, -10462003, -12592307, -3875134, 8048769, -8677445, 3354370, -4646618, 1338419, 3415573, -1038845, -5583458, -4676146, -1569274, 5834713, 1941862, -2205466, --7798587, 10728828, -6905771, -5983963, -5041755, 2202781, 12422119, -8340827, 12232067, 10393821, --4118337, 3838090, 6514392, -32829656, 28046674, -3228205, 13476534, -18068928, -5818070, -4432943, --4152160, -4145180, 16408923, 574989, -13533979, 11053098, 1952063, 8010651, 13916231, 14088566, -799938, -11951283, 49597744, -13458280, 38157564, 437013, 2347737, -21415780, -9365176, 3745748, -18513456, 9297530, -5922223, 15288473, 3160022, -20649130, 3567507, 3258807, 21537650, -574989, -12929999, -15590194, 96100, 14748918, 7313793, 12386149, 32314260, 26058640, -3930432, 13642427, --1918240, 25606058, -20231980, 17206176, 6979322, -624918, 15304579, -7708393, 39567924, -6499896, -19172198, -14031658, -12659953, 979789, 42146516, 14024679, -38912940, 34936336, -581431, 12472048, --29299730, 10350871, 3517041, -58573152, 24864102, 45370960, 17424682, -18463528, -11716134, 9481140, -44580688, 25617332, 34020436, -11945915, -16279537, -14637785, 7300371, 9583146, -1336809, -16569447, --7346542, 21420076, 3971771, 5182415, -7035694, 10060961, -2248952, 4790499, -4289062, -5302137, --6531035, 13103408, 21578990, 21049098, 4925254, 11370926, 19857782, 13379360, 14078366, 19195820, -10931766, 18353468, 13959717, 5349382, -26927298, -4909685, -12424267, 8023536, 16176994, -17756468, --6150393, 21809844, 12064026, 2841121, -4665945, 18527416, -13861470, 3689377, 19085760, 15127412, -8558259, 10288594, 11790759, 9917616, 11691975, 7698729, -8935143, -4364761, -15902653, 20333986, -3195456, 13576928, -10773925, 27122718, -9361955, 12703976, 4294968, 5734318, 4068408, 2486249, --28151900, -16248935, 287226, 2678449, 19429358, 16071231, -22943178, 2469069, -12589623, -11423002, -5798743, 1530619, -7787313, 9643275, 37418828, -24625732, -1858110, 57242252, -34665216, 4187593, -20517058, -10379325, -8296266, 11927124, 18963892, -20448876, 10239739, -37165424, -3885872, 55640228, -2567854, 15817291, -5739687, 30438970, 30665530, -8360154, -375273, -14353244, 3677566, -10598369, --26933204, -17365090, -32163400, -23809152, 36144296, 14508400, 10817412, 47889960, -33740728, -20047834, -6291054, 17951352, -13131326, 8735427, -14075682, 26503706, 16112570, 9170292, 19696184, 69403448, --16193100, -5451387, -19128174, -22376780, -1153736, 29152090, -22575958, -3010772, 21099026, 22258132, -26743150, 15352361, -17524540, 4524211, -9533754, -2194728, 15757698, 4918812, -946503, 11460046, --20647518, 1332514, 774168, 5618354, -4311074, -5493800, 13222057, -4812511, -2735894, 14055817, -18618684, 14423574, 6840809, 6060736, 12450573, 3466576, 1393180, 8200703, 1307818, -4860293, -4126390, -231928, -787053, -23785528, 6232535, 15133854, 25426744, -5943698, -6563784, -8369818, -13197361, 14173929, -31609886, 3661997, -13788993, -2244121, 2310693, 1867237, 5508833, -8137890, --16961362, 13558675, -4235375, 31180926, -28660854, 7038378, -2245194, -9283572, -8478802, -4261682, -9414031, 5774584, 6332393, -1646046, 17335562, 2938831, -23131620, -18190260, -2689187, -10736344, --13391171, 2892124, 14296336, -2149094, -3496104, -21130702, 10151155, -3473018, 21310018, -7414724, --41590852, 4975720, -12479564, -6320581, -148713, -33645164, -17870286, -28907278, 303869, -2164664, --8311299, -38237020, -15750182, -3393024, 19733764, 22016002, 1543504, 1641751, 10516764, 2405182, --26469346, 22968948, 31077310, -13619341, 4491999, -13641353, 5408975, -124554, 23609972, -26794690, --19691352, -61269320, -21992916, 15446313, 24427090, 17573396, 15673409, -15080704, -5281199, 12244415, -11454678, 26616986, 12328704, 11393474, 20183662, 5213554, -22837414, -24104430, -33050848, 13733158, --21235928, 1897302, -18662706, -28230820, -43188044, 6155225, -12736189, -13331042, 3501472, 4132832, --1953673, -6085969, 559420, 14229764, 9470940, 3728569, -5804112, 10333154, 22708566, -4967667, --12955232, -10207527, 10952703, -5874979, -5542119, -20426864, -20270098, -15154792, -34383896, -1716913, --284005, -13442711, 5645198, 9379135, 6319508, 17144972, 4292283, 20211042, 912144, 5727339, -21648782, -10515154, -1013612, 3539053, -597537, -15057082, -987843, -2687039, 26148298, -1423245, --11465952, 8616778, 2874944, 8086887, 16579648, 5830955, -49035104, 20628728, -14633490, 1868311, -34892316, 29226716, -11558294, -4854924, 17967996, -11154030, -11784317, -9771051, 2408403, -3332895, --1327682, 4211216, -3858491, 17234630, 40954660, -17258252, -32133334, 32104344, -24906516, -6670084, -192737, 40056476, 3042448, -12059731, 11718281, 11201812, -41925860, -12257837, 6834367, -1577864, --19958176, -1449552, 7779797, -61438972, -28543816, 30506078, -30431990, -33718176, -20955146, 24925842, --32408750, -50516868, 50806780, -14940044, -31976032, -1803886, 19771346, -19446538, -34319472, -800475, -15450071, -1715303, -44120052, 10403485, -766652, -19646792, 46141372, 43639016, -3425773, -17670032, --34454764, 53194244, 7274064, 9467719, 18226768, -12975633, -51650204, 23306640, 39278012, 31627602, --19633370, 11483669, 42862164, 25068650, -29845190, -6446746, -23435490, 10602664, 6339372, 27172648, -26594974, -31977106, -1213865, -3224447, 4716411, -12338904, 12792560, -8028368, 7369627, 6904160, -5368172, -8884677, 6940131, -13353053, 22276922, -11157788, -5796059, 14421963, 12328704, -12707198, -1983738, -5810017, -15137075, -7821673, 5987185, 12129525, 7199976, -11927661, 6781754, -7562901, --18801220, 1214939, 3301219, -2701535, -1584306, 13077639, 765041, 1741072, 5968394, -1384590, -3198677, -19746650, 15066745, -50758460, 5582921, 47869020, 26055956, 6707129, -625992, -8649527, -12422119, -16860968, 39728448, -3016678, 10570988, 14702747, -13710072, 555125, -1760400, -15123654, --96637, 5771363, 22261352, -51540, -13881334, 6908992, 17900350, -2938295, 28395102, -22056804, -4565014, 6446746, 7370701, 24697136, -13562433, 2212982, -989453, -32135482, 4508642, -10477036, --17647484, 7567733, -6760279, 25336012, 18147848, -13216688, -28933584, 13758928, 2710124, 5831492, -16034187, 35152160, -6075768, 7328288, -14350559, 20200842, 14317273, 15118285, -16834662, 23132156, --8027831, -10011569, -20298552, -1743757, -8085813, 29940754, -22377316, 1680406, 7279970, -6740415, --13702019, 41787348, -1930588, 9979357, -3935801, 5108864, -3574487, 11780558, -1562294, -4995584, --3462281, -4384088, 13840532, 9786620, 13022341, 7401840, 4107063, -8892193, 9605694, 870268, -5303211, 4722854, 11704323, -1550483, 365609, 2008434, 3714073, 4006668, 8707509, -7131257, -5474473, 4938676, 4259534, 3738769, 2937221, 8693551, 3264712, -11121818, 6773701, 7933342, -8121783, 3686693, 8727910, 2549600, -594853, 5101348, 2811056, 6453189, -558346, -5464272, -1341104, 8888435, -4483409, 3778498, 410706, 9669045, 8522289, 3463891, 5975374, 9006010, -4098473, 16758962, -44322452, -124505736, -118375744, 51528872, 5108327, 113922400, 241282672, 52872120, -97284768, 51912732, -178860160, -80035640, -120267672, -176675088, -11775190, 20932596, -83414168, 74243880, -126297808, 77334648, 217448832, 133450536, 1306207, -20072530, -76833208, -191960880, -155448832, -66990216, --147242752, -43445204, 84325776, 25062208, 21416318, 199131328, 76914272, 48517024, 184385632, 8739185, --9211631, 84969488, -42204496, -151926944, -73450920, -151816352, -221653600, -24566676, -100628936, -82245400, -71108552, 137661216, 63807108, 243256752, 193936032, 112380504, 147317920, 49868864, -72028216, -111203144, --148099056, -237423648, -190202096, -127729640, -108671264, -33877092, 82819320, 125566056, 140120624, 188135680, -158572336, 74216496, 27159226, 40767828, -63394256, -97437240, -69020664, -145565568, -109362216, -18890340, --65227668, 25909928, 106700944, 38029788, 54522464, 77349680, 8389145, 4588636, -18709952, -72961296, --38030860, 562641, -28956132, 22456774, 31050466, -12600897, 39333848, 33607584, -52625696, 40310416, -47283296, -33292438, 76962592, 11638825, -75373992, 52791592, -41255844, -147731312, -24206972, -89821728, --108755016, 67185096, 8735963, 17026324, 142314816, 90204512, 100758856, 161437088, 119086024, 39277476, -17263084, -112615656, -204296560, -203641040, -203811232, -193120528, -117455008, 5947456, 111295488, 162829184, -223603520, 207243984, 196269264, 154291872, 26627724, -71069896, -77388328, -163993664, -202383696, -122074784, --108815144, -60921964, 11917461, 29442000, 36089536, 69954816, 62122944, 57802744, 82423640, 67642512, -43942348, 37842420, 10064719, -22348862, -38424924, -44301512, -45687716, -26032334, -13195750, -9221832, --8396661, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --5057861, --1954210, 1161789, -951872, -2919504, -227096, 6715182, -3470871, 771484, -1473711, -89121, --2590402, 4829691, -2529199, -2690797, -3041911, 5757941, -3448322, -911070, -1639067, 1611150, -2646237, 3365107, -4782446, -23085, 4543002, 2006824, 762357, -263067, -588411, 2049236, -4631586, 1111323, -5990406, -3089692, -3231963, 5203353, -552977, 3968013, -2519535, 1833951, -5197984, -2552284, -3948686, 1386738, -1489280, -272730, -3535295, -1429150, -2646774, 989990, --4786741, -1582159, -1239098, -161061, 6432788, -2114198, -988916, -238371, -1709934, -676457, --628139, 3898220, 2002529, 2388002, -3374771, 2455648, 2567854, -2292439, 1051193, 1527398, --1745904, -2350421, 2725157, -4117263, 2887292, 1751273, 751082, -3815542, -1338956, 1417876, --354872, -794569, -1045825, -91268, -2062658, -2376728, -382789, -392453, 267899, -893890, -3221, 1407139, -70330, 523986, 183610, 278099, -2147, -275415, -1045825, -619549, -687732, -365609, 18254, -140660, -3170223, 3351148, 390842, -1446867, -2164127, -591095, --1102196, 3758, -2681670, -2057826, 1512365, -424128, -1034550, -4678830, -705985, 4351876, --2940979, -733903, 3270618, -1890859, -3519189, -2678449, 2226941, 19327, -352187, -674847, --3376381, 1133335, -1509681, -790274, 3794604, -2093797, -5169530, -1537061, 273804, 1546188, -1342177, 443455, -3931506, -904091, -4786741, -4336843, -1182727, 4545149, -801011, -8981313, --419296, 3026341, 2611340, -1853278, 1751273, 1933272, 164283, 2673080, -4855461, -3423626, --471910, 1406065, 204011, 1002875, -539018, 1268089, 1130650, 1870995, -300648, 1154273, -1077500, -901406, 1836635, -457951, -4738423, -3864397, -2525978, -1992328, -2139968, 646929, --1095754, 3658239, 3001109, -557272, -1480153, -1268626, -698469, 1100585, 1704028, 220117, --1031329, 186831, 219580, -997506, 1276679, 9664, -321586, -498216, -131533, -741419, -497679, -144955, 76236, -858457, 491237, -540092, -16643, 8053, 333397, -141734, --432181, -164283, -831613, -313533, 60130, -396748, 47245, -672162, 4108673, 2295123, -6155225, 405338, -1218697, -764504, 4352413, -1194001, 2331094, -3998078, -432181, -113280, -2280628, 1585917, 3901978, 2746095, -2021319, -3946538, -3228205, 2192044, -1382980, 2997350, -1877438, 392990, -207769, 2490544, 1745904, -1825898, 2044941, -4248797, -605054, -3939022, --3381750, -4738960, 1363115, 2688650, -518617, 3743601, -2935610, 3467649, -7058779, 2698313, -1180579, 5198521, 1506997, 1862405, 2789581, -133681, -1815697, 1937567, 4524748, 1538672, -2181307, -741419, -100395, -6452652, -449361, 1018444, 1219771, -952946, 3417183, 6453189, --2181844, -4655745, 3074660, 678605, -3315178, -59593, -1548873, -3323768, 386010, 4641786, -1140851, 1684701, 760746, -501974, 1744294, 1086090, -114890, 1523640, 72478, -427349, --367220, -882616, 876710, -1293859, -185220, 2154463, -493921, -54224, 799938, -512712, -1446330, -2060511, -951872, 28991, -847719, -900333, 192200, -506806, 679679, 1578937, --622770, 891206, 211527, 91805, -5906, 219043, -1804423, -459025, -430570, 347892, -1433445, 863288, 2265059, 3387119, 3258270, -3156264, 4973036, -1770063, -3306051, -4885526, -1132261, -6461242, -405338, 670552, 1785633, -4121558, 2661269, -67109, 591632, 1724429, -1058710, 1459215, -5562520, -374199, -1260036, -3629247, 2119566, 1066763, 832150, 3112241, -10954314, -808528, 562104, 1561221, 2706366, 1071058, -8993662, 1867237, -1494649, -1033477, -4924717, 143881, 2450279, 3551938, -4437238, -2477123, -1280437, -4305705, -9229885, 434865, --3479461, -557272, -804770, -191126, -2139968, -4518306, 1282585, -4323422, -1372242, 973347, --4818417, 4987531, 1722282, 1417339, -2024003, -370441, -788127, 991064, -1552631, 2560338, --3951907, 1312649, 6011344, 4977867, -1738925, 2531346, -2365990, 1072668, -4480725, -148713, -2790655, 3216931, 2880849, -497142, 5362267, 489089, 2681670, 2392297, -91268, 1114544, -587337, 199716, -903017, 537945, 838592, -323733, 98784, -605590, -1468342, -230854, -1012002, -789200, 2166811, -599148, -1117228, -958315, 764504, -541166, 952409, -181999, --902480, 541166, -244813, 1115618, 687732, 654983, 456877, -1937030, -448287, 263067, -839666, 29528, 171262, -519154, 7312719, -9306120, 379568, -5735929, 2913599, 4210142, -5136244, -813896, -4907537, 110059, 5059472, 1067299, 955630, -3830574, -526134, -6696391, -8864812, -486405, -6852084, 7387881, 1838783, 2179159, -497679, -2685428, -888521, -3541738, --3494493, 2720862, 3866544, -805843, 3647501, -3033858, -1902134, -14496, 5096516, 4825933, --1373853, -2742337, 3964255, 2525978, 357556, 3356517, 786516, -3973382, 4150549, 2586644, --328565, -1389422, 1134408, -4281546, 11356430, -601832, -422517, 8461086, -786516, -5196911, --2828236, -624381, 2049236, -5400385, 3671123, 1101659, 111669, -4903779, -4138201, -8657580, --779537, 4022237, 1991791, 4880694, -2726767, -1930051, 10227391, -2855617, 1697049, -1432909, --4259534, 318364, 1858647, -4438849, -7871602, 318901, -4859756, -4896263, -2404645, 2543158, -213138, -746251, -3019362, -1036698, 329639, -1131187, -850940, 796716, 2783139, 387084, -689342, -1987496, -1025960, -212601, -33823, -2800856, -2062658, -1780801, -119722, 670015, -258772, -916976, 53687, -184684, -296890, -1472100, -551903, -218506, -574452, -773631, --9816685, -150324, -4153234, -4692252, 1365800, -5627481, 113280, 3776887, 2036351, 7960185, --13394929, 8528731, -1467268, 3704409, -2603824, -1956895, -7062000, 6203544, 5465346, 1341104, --6283537, -388695, -3655017, -476205, 6445136, 4475356, 947040, 6142340, -137439, 272730, -557809, -261456, -4379793, 9205726, -977642, 40802, 10699300, -6981470, 2520609, -3353833, --749472, 3351685, -1518271, -5516886, 10296647, 8020852, -340913, 2573222, 4287451, 11131481, --1497333, -2059974, -6113886, 1017907, 2075006, -6462852, -6892886, -6065568, 7172596, 121870, --3008088, 4916127, 3482682, 22012, -1759326, 1573032, -3940633, -1036698, -4283693, -993748, -3971234, -7878581, 1822140, -1683627, -5463736, 3291556, 5196911, 2198487, 5413270, 4687420, --4023311, -6423661, -3216394, 2788508, -2543158, -4942971, 3170760, 5349382, -3920768, 646393, -1132798, 581968, -3661997, 2110440, -1636383, -1303523, -2353105, -1240709, -1843615, -195421, --213138, 695248, 1122060, -936840, -807991, -367757, -1464047, -858457, -399432, -588947, -1150514, 1443109, 367757, 2128156, -1977833, 1437203, -1716376, -781147, 1472637, 7350300, -7799124, 1292785, -6720550, -924492, -6382859, 2662343, 16794396, 4145717, 11637751, 4276177, -149250, -10854456, -2664490, 1788854, 10512469, -4647155, -2311766, -4047470, 1011465, 8449274, --6180458, 4137127, 7315403, 1626182, 2695092, -4783520, 9039296, -1934883, 11771432, -110059, --3593277, -11041824, 1358283, 41339, 13175349, -3973919, -1068373, 8352638, 67109, 1106491, --2709588, -8634495, 931471, 4973572, -6194954, -4889284, 1297617, -10355166, 5689221, 5748814, --1740536, -673236, 2927557, 5863167, -490700, -3608310, -130997, 8609799, -1093606, -1323924, --3250217, 11146514, 11292543, 763430, -2041183, 1758789, -476205, 2942053, 5222144, -431644, -7540352, -2935610, -4180614, -6099928, 2067490, -500901, -9272834, -6693170, -3847217, 7294465, --2130304, -3417183, -937377, 1074, -3143379, -4754529, -1665911, -1395328, -2834679, 462783, --1777043, -1564979, 1499481, -3022046, -3111167, 976568, 2498597, -1507534, -2003602, -1520418, --2613488, -1257352, 815507, -907312, 449898, 1374926, -459025, -778463, -2305324, 1421097, -200253, -7406134, 7508677, 5712844, 442382, -4913443, -5517423, -2401424, -10961293, 12730820, -9576703, -2052458, 3549791, 1148904, -2091649, 9652939, -774168, -4489315, 14289893, -15483894, -3999688, 6670084, -53150, -6332930, 6810745, 1051730, 9847823, -3811247, -1058173, 2623688, -3934727, 663572, -1345935, 14325327, 6180995, -6551973, -9891310, 6879464, -9895605, -2874944, --11392938, -1479616, 17057462, 6975027, 8246337, 56371, -9049496, -1510218, -4421669, -1970316, -12757127, -1991791, -14058502, -1139240, 2759517, -8948564, -1483911, 5763846, 4539244, -6016713, --3140695, 6156299, 8153996, -2374043, 8494372, 147103, 2136209, 3174518, 720481, 3332895, -5095979, 4926865, 4799089, -2529199, -10199474, -11272679, 2810519, -2268817, 8057896, -1447404, -9563282, 3231426, 4449049, -5098126, -4545149, 3403762, -176094, 693100, 893353, 419833, --4571993, -2100239, -707596, -3803194, -111669, -3267933, 587874, -1847910, 1409286, -464930, -2441152, -5369, 1336272, 426276, -1227287, -1074279, -1470489, 3018825, 347892, -898185, -960999, 1559073, 1307281, 291521, -2236604, -6256157, -3543885, 22012, -3025268, -76773, -6189048, -877784, 5767604, -11780022, 4110821, 3243237, 1635846, -7742753, -6492380, -8242042, -6278169, 3228205, -5915244, -5901822, 7913477, 2518998, -725850, -4980552, -8179765, -3384971, -3204046, -5264556, 529355, -9800042, -2809982, 1051193, 3237869, 6263673, -1116692, 3965329, -5439039, -5730560, -13600014, 9205189, 331249, -2238752, 8752606, -1464047, 255014, -6062347, -7679402, -5070209, -6412923, -2569464, 6277632, 9574556, 8030515, 2423435, 1538672, -17186848, -7662759, -1145146, 3164854, -6010807, -1216550, -6714108, -2394981, -1730872, -8876624, -4532801, --3697430, -4917201, 8995272, -3040300, 11729556, -1526324, -766652, 7309498, 8365523, 14154602, -9684078, -310311, -4726075, -655519, -78383, -6956774, 1629403, -4532264, -7605850, 14470282, --9360344, -9951976, -1524177, 5368172, 709743, 1646046, 633508, 6059662, -175020, 1628330, -2102923, -2427194, 286689, 3710315, -2165737, 1501091, 2645163, 2163053, 4648765, 1008780, -20401, 2543158, 410706, -918049, 1697049, 2635499, 1015223, -37044, 780610, 398895, -5405217, 412317, 4394289, 2921115, 633508, 4625143, 5073430, 490163, -171262, 669478, -683437, 603980, -461172, -624918, 1271847, -3187403, -4567698, -18160732, 4028143, -12496207, --7475928, 11832635, 9206262, -20737176, -19010598, 646929, 8124468, -4820564, 5017059, -6843494, --761283, -12038793, -3139084, -10868415, -772020, -2974265, 354335, 4176856, 3429532, 6767795, --834297, -5772436, 5021354, -6884296, -2754148, 2207613, 440771, 3506841, 7187628, -1162862, -910533, 1650341, -2910914, -765041, -10518912, -12465606, -12062416, 9127, -12134893, 4064113, -1598265, -4800163, -5645198, -2432562, -2020782, -1047972, -7227356, -11418171, -651224, 18113488, -9980430, -2562485, -10831908, -11188390, 12498355, -11750494, -3883724, -2099702, -7847979, -5957657, --7999914, -9361418, -13019656, -17609902, -2543158, -2850785, -2518462, 5881421, 5564667, 1445257, -4873714, -4011500, -4903779, 16252156, 6868727, -4362613, -12016782, 3699041, -7121056, -8446590, --55298, 13623099, -2739652, -144418, 9360881, -1090385, -6288906, 231928, 2206540, -228707, --2594160, -2508798, -102542, 2268280, 1092532, 1500554, 913217, 4625143, -1404991, 2466385, --6772090, 3071439, 1597728, -1255741, 1395864, -1462436, 2444910, -1267552, -1996623, -1179505, -2217814, 1897302, 223875, 2556043, -3856881, 3778498, -1939715, -2362769, 1159104, -14951855, -1668058, 7480223, 8129300, 7534983, 3158949, 14899778, -5942088, -10921565, -2890513, 1871532, --2248952, 4708895, 9898289, 20030116, 12580496, 7314866, 9305047, -7798587, -14871324, -5138392, --11153493, 12539157, 2799782, -2717104, -9059160, 14235132, 12224551, -4612258, -969052, -127238, --7470022, -6247030, -11207180, 3242164, 3776350, 6275484, -10601053, 893890, 2938831, -4865661, --10303627, 230854, 5882495, 7792145, 1260573, -20108500, -7230578, -9959492, 4031364, 11869142, --80531, -11318849, 2605435, -10929081, 5939403, -2713883, 887448, -7776039, 16085726, 12681965, --4077535, -3818763, -9404368, -710280, 12842489, 2890513, 15800111, 15229954, 12681965, 7425462, -2539400, -10295573, -5774047, -13674102, 15622407, 15706695, -1336272, -12084964, 7665443, 18259516, --293668, 2276333, -4489852, -477278, -12087112, 1869921, -9545028, 6465000, 2229625, 9113384, -9055402, 4910758, 704912, 779000, 5581310, 2032593, -1367947, -3736085, -1263257, -5683853, -940061, 4367445, -3771518, -2122788, -4308926, 3077881, -1005559, 6600291, -6327024, 1674500, --256624, 6286222, -3091840, 2073932, 3784403, 684510, -244813, 223338, 1080184, -2901251, --1199370, 3767223, -9881109, -2465311, 7269769, 12656732, -13233868, -16072841, -13888314, 15312632, --6336688, 10242423, -150861, 185757, 24614994, -2947958, 1810866, -10873247, -16985522, 4265977, --2536178, 4609574, 2984466, -1331440, -9720048, 2783139, 3627637, 1738925, -9177808, 6111739, -4417911, 17992692, -8283382, 1268626, 9810779, 10077604, 387621, 10176388, -2561411, 446140, -9054865, 7693360, 2049773, -3912715, -14452028, -10918881, 8479339, -197569, -3308199, -2831994, -2151242, 19448148, -1196685, -6742025, 9885404, -4728222, 9343701, 2282775, 28003724, -5464809, --899796, -48318, 4164508, 9580998, -1864553, -3244311, 6230387, -13125420, 10721312, 19720880, -5841693, -4119948, 11001559, -4179003, -578210, 22306450, -12873628, 4948876, 8761196, -3729642, -18572512, 4463008, 3991098, -7117298, -10688563, 1916629, 4862977, -11460583, 11678016, 1074, -2957085, 77846, 3409130, 10781979, -2443300, 10879152, 5160403, 3595425, 6062347, 5416491, --3155190, 6866579, 6383395, -5576478, 2117419, 4732517, 8702141, 2075543, 2510945, 4358318, -5097053, 7748121, 794032, 278099, -459562, 5310190, 4493073, -4856535, -73551, 3518652, -4951024, 3900904, -2900714, 7386270, -199179, 2573222, 911070, 6104223, 3109020, 2858301, -2923262, 4232154, 2381023, 2822331, 4878009, -13969918, -3978750, 9625559, -4614406, -7272990, --6487011, -6656126, 1244467, 9680856, -1183264, -21363168, 59593, -16221555, 6373732, 7042136, -182536, 3354906, -7106561, -866510, 8696772, -20455318, 5266704, -4422743, 11496554, 7982734, -5199058, 957241, -8125005, -18453326, -933619, -16119012, 10057740, 204011, -4836670, 17115444, -8893267, -6724845, -5342403, -3473018, -2547453, -4683662, -9129490, 1737851, 2685965, 24731496, --780073, -17540646, 39192, 12128451, 937377, -8986145, 5776731, -13600551, 9192841, -5693516, -6106907, -7879655, 3730716, -13909788, 36914708, 1488206, 25516938, -2371359, -6942278, 6709276, --8179229, -7978976, 14234595, 13902809, -12058658, -31984622, 30575872, -10618770, -8339753, -3915937, --4256313, 4139812, -2779918, 2461016, 13188234, 3246459, -10620380, -8515846, -6427419, 4022774, --6720013, -892279, 6142340, -16566226, -1415729, 1132798, -2593624, -4815732, 1883880, -3394635, -9088688, -3534221, 4050154, -4003447, -2945274, 272194, -4213363, 2496450, 2162516, -1698660, -2288681, -3834332, 1901060, -981937, -294742, -1700807, 52076, -6914898, -5093831, -947577, --2838437, -5654325, -7548942, -4204773, -1843078, -2978023, -642635, -5015448, -5906, -4451734, --1295470, -5811628, 3140158, -3215320, -1800128, -15748571, -5591511, -4791573, -13540421, -23845658, --5885179, 374199, -12664785, 6190122, -5419175, 10596221, -9138080, -3827890, -13020193, 31026306, -26249230, -5898601, 5853504, 18022756, -18961206, 19216758, -7998840, -8022462, 6928319, 2528662, -3284576, -2838437, -4181151, 531502, 6222334, 5366562, -8431558, 9648107, -9086003, -15124190, -10965052, 9642202, -12590160, -15648176, -18080738, -2659122, -2997887, 5049271, -11809013, -14803142, --7558606, 24748138, 8662412, 8412767, -10608569, 9539659, 13028246, -10181757, 24322936, 4503810, --8705362, -11419781, 6509560, -9594420, -20802674, 5051419, -237834, 450972, 11370389, 10573136, --9142375, 1720134, -26659936, -3330747, -10514617, 22044994, 1316944, 3091840, -12859132, 10416369, --22648436, -2774549, 8860518, 2532420, -2462627, -2607582, 2745558, -1069447, 2554969, -3411278, -636729, 1855426, 5388574, 1313723, 1717987, -1255204, 3199214, -3347390, 1029182, 10029286, --1975685, 427886, -3216394, 4454955, 2086817, -561030, 5265630, -5564667, -5258651, 5688684, --4796942, -1806571, -4394289, 2394981, -6427419, -2927557, -2092723, 5136781, 5181341, -8295730, -1305670, 4202626, -2839510, -9352291, -4500052, 6880001, -4510253, -11534135, 14614163, 15399068, -13935558, 9400073, -119722, 12763569, 11574400, 1935420, -2191507, 5143224, 34360, -13014288, --1548873, 4940823, -10174778, 14532022, -15152108, 12133819, 13215077, -3802120, -2980707, 5601711, -17633526, 13209709, -15935939, -3479461, -4264366, -1271847, 3984119, -7435126, -7784092, 17297980, -434865, 24841554, -16222091, -15387794, 12508555, -8287677, 4512937, -9751186, 8352101, 9528922, -6292664, -3893925, -14251775, 1410360, 4746476, -11857331, -21774410, -753230, 1992865, -12857521, -23539642, -2686502, -6660421, 31261994, 29456496, 2939368, -4080756, -1099512, -6271726, 7087233, --15428059, 14471892, 1928440, -8399882, 17501454, 2804077, 3560528, -4990752, -9478993, -23481660, -5171141, -7999377, -3854196, 10828686, 4408247, -5156645, -15328201, -4246112, -17457432, 7464117, -15738371, -2223719, -11855183, -8305393, -11821897, 130460, 6400575, 7639673, -1597728, -8389145, --4348118, -4578972, 1121523, -2544231, -4005057, 3371013, -616865, -2481417, 4152697, -9483288, -2723546, 2445447, 14666240, 1323924, -3237869, -7504919, 6473590, -7840463, -1015223, 5478768, --10401874, 9699110, 2083596, -421981, 1996086, 6557342, -3303904, -10290742, 250182, -3061775, --1294933, 9882183, 9427990, -25803626, -59762860, 20028506, 18977312, -6685117, 4234838, -14391899, -25785910, 16489453, -14622216, 4163434, 3506841, 367757, -6580964, -4744865, -30822296, 13034152, -15215459, -3518652, -9664, -1730872, 10239739, -7730941, 19542102, 5789079, -23227720, -13166759, -29498910, 19362250, -19222664, -4525822, -6831683, -11775727, 1840930, -4705674, 4210142, 38318624, -10451266, 40148816, 22943178, 25872882, 23590108, 46243912, -3026878, -4296578, 11071352, -3271691, --38784628, 31447750, -13616657, 18032420, -25632902, -20395726, -38289632, 7603703, -3514894, -12861816, -9358197, -18006650, 82141, -25722560, -25673704, 7203197, 15018964, -20876762, -5521181, -14475650, --20080046, -22569516, -16195785, 12339978, -9774809, -28177670, 40484900, 25356414, 40819368, -5328981, --8765491, -8124468, -14380624, -23145042, -1461900, -5089000, -17493402, -5848135, 5172751, -12408161, --11167989, 1291175, -1813550, -5530844, -4517232, 10066866, 10748693, 337155, 2729989, 7628399, -9584220, 1945083, -777389, -1472100, 4522064, -1915555, 1151588, -1762010, -6700686, -181999, -6379100, -6610492, 8704288, 10959683, 4660577, 357019, 1821603, 1156957, -7277285, 601832, -4195646, -3760781, 89121, -1719061, 1232119, -2607582, 1009854, 4076998, -5561983, -4766877, -8859444, 3598646, -1075352, 1345399, -21578990, -56873956, 24888798, 29694330, -13180181, -5640903, --1299228, 33602212, 1261647, 7327214, 7237020, -7679939, 6828998, 15749108, -2934000, -14794015, -3919695, 28606092, -14877767, -9246528, 6416681, -3790309, 21468394, -5149666, 9781788, -10789495, --12984760, -12978317, 14137959, -4022774, 12571906, 14615237, -3541201, 2079838, 277025, -11616813, -4098473, -10521596, 12819941, 31114354, 51002736, -456340, -1261110, -21341692, 11815455, 16802986, --312459, 18849000, 26894548, 11404212, 15374372, -23256712, -13879187, 19634980, 50960324, -9131637, --29615946, 7763691, -9718974, -370978, 13953812, 424665, -13405667, -6336688, -6827925, -34368328, --14245333, 388695, 5917928, 12206297, -1794223, -13118441, -7459822, 3417720, -5194763, -13176960, -13930726, 33380486, 14562623, 18052822, 2022393, -4379793, -26831198, -5820755, 7864085, 6131066, --5862631, 15481746, -4145717, 8730058, -18724446, 1247688, -6333466, -5294084, 369904, 5399848, -5334350, -5188321, -10101226, 10105521, -3714073, 8327942, 922881, -1921461, 863288, 1899449, -7759932, 393526, -1013075, -3775276, -4147865, 6658810, 2349347, 6147172, -12680891, 9097278, -5368172, 2575370, -4475356, -1569811, 9536975, -989990, 557809, -7070053, 863288, -10919954, --2145873, 3332358, 9558987, 4781909, 8466991, 18117782, 6019934, 9492951, 3718905, 27307402, --8613557, -3438658, -10735271, 6322729, -6666326, 5990406, 30998390, 6101001, -32836098, -8039105, --9575093, -28123982, 17859548, 8398272, -3245385, 3932580, 1760400, -12656195, -104690, -941672, --12513387, -3808026, 27067420, 39711804, 18777598, -13925895, -21905944, 10280541, 18191334, 1959579, -14558865, -10197326, -6988986, 14854144, 4743792, 125091, -33348810, -43604656, -1378148, -25542170, --14744623, 9004399, 36444408, 7791608, 1844152, -10657961, -12557948, -18357228, -16007880, 2875481, -11025181, -4013110, -18040474, -29242284, 11620034, 638876, -16163573, -27275190, -18329310, -30013768, --53864260, -32679870, -4807142, -6600828, 64882460, -8076149, -2377801, 37193880, 4435628, 1946157, -22524420, -13571023, -32723892, -38276748, -5855114, -18423262, -20141786, -21658446, -23440858, 4418448, -21305722, 33545842, 20117626, 3954054, 2269353, -8860518, 17488570, 3395709, -5198521, -21948894, -4572530, 15627239, -676457, -268972, -7713225, 4157528, 8884140, 14259291, 4189204, 5935108, -5663988, 7018514, 9102646, 9143985, -2515777, 6899865, 1584843, -5224828, -11250130, -13820668, -1517734, 3018825, -13414793, -6869800, -12890807, 4036733, 6877317, 10133438, 15362561, 25422986, -19261318, 19330038, 11818676, 7399692, -4495757, 1835562, 294205, -12201465, -18206366, -14083198, --15509664, 20462834, -29096256, 7315940, 4592394, -12686797, -40793064, 27710056, 8210367, -2649458, --41304164, 10956462, 6382859, -21827560, 3622268, 19091130, 11729019, 5536750, -18709414, -3841848, --6996502, 3260417, -7057168, 1695975, -14495515, -20857434, 22819162, -15809775, 34688304, -21449604, --19412178, -13175349, -24398098, 2105071, -489089, 36419712, -27035208, -28531468, 14669461, 9345849, --23606750, -31411244, -3500398, -17719962, 20306606, 4283156, -25990994, 16811576, -4457103, -39972188, -26191248, -17857400, 17087528, -29755534, -7293928, -879931, -12515535, -5175436, 3396782, 37440304, --10146323, -3566434, -10804527, 10650982, -17774186, 13823352, 29275034, -1861868, 29435558, 23077396, --3545496, 47161424, -2793339, 5396090, -1415729, 13266080, 47581260, -3980361, -13193066, -50958176, -39396660, 13995688, 33633352, 11388643, -26460756, 11701638, 7539278, 4781909, -23493472, 13347148, -2734284, 3803731, -12634720, -3750580, 16063178, 13697724, 598611, -1728188, -1651415, -1918240, -3927211, 10019085, -20633022, -6160057, -2863670, 3223373, -4224101, 4512400, 4440460, 6436009, --4822175, -11032160, 17023102, 26587996, 9330816, -13742822, -11746736, -5121212, -4006668, 7151658, -3626026, -2732136, -16838420, -12123619, -13642964, -1398012, 13073880, 5686000, 11023034, 4154844, --18362596, -3348464, 8028368, 27936078, -53846540, 2061047, -60601452, -20307680, -10295037, 18443664, -55959664, 47562468, 17518098, 28080496, -18249316, -15375983, 2704756, -4129074, 12950400, 4103305, --12656732, 18771154, 27638652, 22970558, 17165910, 14514305, -482110, 2584497, -9417253, 26157424, -12200391, -5015985, -16148003, 5389110, 10719165, -2863133, 34221224, 35754528, -20707112, -15307263, -739271, 27773406, 17296370, 4440996, 3377992, -6651294, -12559558, 6907381, 42684996, -17316234, --21182778, -23030152, 22282290, 9101573, -12850542, -19922742, -31947040, -37795176, 4096862, 8259759, -6766721, -8352638, -2848637, -10414759, 7398081, -30153354, -49567680, -22340810, -3513820, -8443906, --19400368, 24748138, 41329396, -9341554, 21285322, 45680736, 29744260, 10560788, -31604516, 5064840, -5589363, -27925340, -15505369, -4491999, -22292490, 24205362, 34453692, -2124935, -8063264, -4322885, --10173167, -5676873, -14208826, -13893682, -5191005, -6933151, 4864051, -3163244, -3937411, 6733972, --21072720, -2614561, 1605781, 21209622, -21907554, -3624953, -5087926, 3958349, -13998372, -4958003, -4107063, -7678865, -12955232, -2196339, -1116692, -12664785, 14664629, -20379082, -2426120, -7581154, -4361003, -2252174, -6117107, -11948599, 238371, 5842766, -4376035, -34298000, 27553288, -3564286, -23664196, 14334453, 487479, 15677704, -6963216, -1822140, 13486197, 16552267, 2495913, 32212, --609349, -15170898, -9886478, 3990562, -21139830, 516470, -7989176, 462246, -17935784, 2996814, -927713, -16306917, 13506062, 5725192, 9118216, -20465520, -5583458, 3802657, -1142461, 1431298, -11638825, 2545842, 3205656, -2389613, -4602058, -3242164, -1752347, 7516730, -3499325, -13079786, -10481331, -17969070, -5709086, -6191196, 2069637, -8815420, -10480257, 13611288, -1822140, -13730474, -8286066, -19133006, 15214385, 4722854, 636729, 15720654, 17450988, 2401424, 4911295, -13200045, -16923244, -8356933, -11725261, -1035624, 2427730, 32126356, -14540612, -23777476, 20256140, -7770133, -20238960, -3469260, 1242856, -8915815, 12220793, -20662550, -17213692, -6801618, 7993471, 4808753, --1345399, 9869835, -12370580, -12439836, -8346732, 2918967, 3494493, 718870, -632434, -3771518, -2030983, -17149804, 3371013, 3484292, -4234301, -1596654, 5066451, -2757369, -7427072, 8856223, --4528506, 1090922, -481573, -2248952, 5876589, 2586644, -6321118, -712428, -1584843, -5556614, --1306207, -2055142, -11521250, 3488050, 6862284, 5578626, -5291400, 5211406, -8437463, -2588792, -96100, -5378373, 16521665, -7661148, -89492088, -170450608, -60821568, -133515504, -152109488, 36950676, --5376226, 50716048, 196624672, 213190896, 150468816, 214711328, 176432432, 58385248, 61624728, 45514304, --118897040, -122442536, -68225552, -118865368, -128453344, -43220256, -38052336, -108335720, -81677392, -13497472, --48501992, -59281288, -14930380, -45439680, -80135496, -45774152, 14602889, -32337346, -39768712, 46630460, --8257075, -44718124, 40188008, 74639552, -17628156, 18429168, 115857280, 15693810, -37532644, 76766632, -67045512, -67080408, 37950332, 84633408, -26781268, 8968965, 146903984, 111984296, 56291452, 206418272, -229885984, 117372328, 211695184, 273406336, 171520048, 161774240, 224769600, 144372112, 91763584, 101602824, -52755084, -62214748, -120024472, -162727728, -277481184, -337613408, -382675680, -432752864, -426673856, -462485824, --413162976, -306823872, -306766432, -241950544, -21989158, -12880607, 5908802, 172845584, 136513920, 45199164, -90481000, 134757824, 49706732, 59921236, 136903696, 99535328, 20047834, 81960864, 115858888, 49562312, -62275416, 142525264, 53216792, -23032298, 65582004, 45725832, -31964758, 61845380, 137756784, 64633352, -101482024, 219956016, 182951648, 173267568, 258502272, 238642880, 164461808, 142896784, 128157528, 47743392, --2170032, 6535867, -27303644, -86391120, -85927264, -98708552, -168664432, -188726768, -180856784, -202928608, --243339424, -213241376, -206064480, -219896416, -170239616, -115214648, -90120224, -56909392, 1956358, 22580790, -18983218, 31466004, 34665756, 17690434, 16227997, 31777390, 27537720, 18664318, 22523346, 26280904, -19871740, 25792352, 39473972, 43389908, 41404560, 47466368, 46247136, 32323924, 26185878, 17865454, -13853417, 13482976, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --4371203, -3634616, 3891240, -1843078, 3905199, -2352032, -512175, 5196911, -2124398, 2473901, 1511292, --5755256, -2593624, 4327717, -1679869, -821413, 2725157, 1804960, 1943473, 523449, 6663105, -1141388, -1705639, 1496796, -2295123, 4129611, -1181116, -2263985, -979253, -5386963, -1818919, --3966939, 1309965, -64425, 1466195, -1587527, 2268817, 1071594, -238908, 695248, 371515, -525597, 738198, -2847563, 7128572, 1053878, -2585570, 5277978, -1260036, -4549444, -4983236, -4872641, -960999, -385473, 3230889, 366146, -830539, 2522757, -262530, 1463510, 428960, -1859184, -958315, 2024003, -902480, 2404108, 3494493, 1900523, -2053531, -2113124, -1033477, -942208, -2194728, 1558536, -1073742, 1933272, 2520609, -3112778, -1751810, 2724620, 817654, --854162, 4202089, 2436320, 2010045, -203474, 1114007, -78920, 568546, -478889, 646929, -253940, 312459, -947040, 1563368, 515396, 120259, -263604, 641024, 1021665, -523449, -1099512, -31675, 4567161, 899796, 1040993, 3833795, 49392, 2767570, 1318555, -309775, -296890, -2989297, 1402307, 243739, 4697084, 1665374, 1542967, 215285, 1391569, 5153961, --4856535, 2755759, 731755, -3204046, -1431835, -1983738, -644782, -1840394, 1309965, 5951214, -3748970, 4446365, 3534758, 6067178, 4423280, -5492727, -9968082, -1256815, 476205, -2426120, -5265630, -215822, 7882876, -3669513, -3678640, 3402151, 195958, 289910, 3127810, -5743982, -1488206, -4110821, 5461051, 3218004, -8053, 8286066, 381178, -784368, -1012539, -1446867, --2040646, 3927211, 2108829, -2009508, -646393, -5757404, -2519535, -754841, 6058052, 4131759, -755914, 3047279, 130997, 3244848, 23622, 1345935, -3442416, -2228551, 861678, 456340, --161061, -1748589, 1644436, 1914482, -463856, -1797444, -306553, 1928977, -280247, 1029182, --897648, -530965, -702764, 616865, -612033, 113280, -20401, 976031, -782758, 942208, -1481764, -686658, 369904, 120796, -5369, 1752347, -537408, 445066, -628676, 696322, -539018, 297963, -179315, 1536525, -50466, 74625, 679679, 3628174, 8248485, 2421288, -365072, 258235, 2326799, 2168959, 495532, 1303523, 1871532, -125628, -170188, 2359548, -9336185, 3122441, 7285875, -4126390, -3361886, -1366337, -4367445, -5120675, -2038499, 3788698, --6309307, -883690, -734976, -9935870, 2007360, -10037339, -3325915, -1337346, 2396592, 32212, -2106145, -1959579, -85362, -6774774, 2505577, -2246268, -3768834, 715112, 1921998, -315143, -514859, 2898566, 5156108, -8650601, 2385854, 587874, -2537252, -2755222, -539018, 1195612, --1137630, -5203890, -1204738, 1417339, 2733747, -356482, 6478422, 571768, 308164, 2641942, --4115653, 6117644, 1970853, 3636227, 1641751, 3042984, -619012, -579821, 1827509, 1063541, --834297, -1845762, -1480153, -3051574, -67646, -4096325, 290984, 2388002, -195958, -1744294, --3193845, 2852395, -1692754, 1156957, 450972, -506806, -3038153, 254477, -274341, 748935, --921807, -887448, 272730, -987306, -1665374, -905164, -689879, -168577, -1093606, -192200, --617402, 1434519, -256624, -780610, -249645, 762894, -297963, -1304060, -1380832, 1481227, -34897, 126702, -869731, 4925791, 5382668, -165893, 5937793, 379031, -766115, 734439, -504122, -1092532, -48855, -4132296, -2352032, 3703873, 4359392, -5083094, -1203128, 2124398, --3381750, -9731859, 2436857, 3611531, 4247186, -2228014, -2568391, -3463354, 5326833, 6067715, -1053341, 2400887, -4742181, -3840775, 4516158, 1712618, -3550327, 6264210, -6252936, 1053341, -615254, 5875516, 2171643, -1286343, 973884, -2020782, 3235721, -7638063, -2248952, -11009612, --4793184, 5592048, -448287, 8568997, -1147830, -7132867, 4542465, 1007707, -2901787, -326954, -366146, -2879776, 1917166, 5138392, 5793911, 172336, 2779381, -251256, 6589554, -3330747, -2860448, -602906, -96100, 228707, 2292976, -657130, 8239358, 842350, 763967, -1253057, -4862440, 1677722, -1614908, -3439732, 94489, 3332358, 1163936, 994285, -2128156, -87510, -684510, -305480, -551903, -564788, -1127429, 922344, 95563, 419833, 719944, 1764158, --660351, -1765768, 1999844, -501974, 217970, 69256, -214748, -201863, 805843, 750546, -979253, -313533, 914828, 9664, 537408, 922881, -185757, 146566, 778463, 1185948, -648003, 761283, 249645, 125091, 6022081, -8165270, -1122597, -5531918, -5745056, 2068027, -1122597, 11906723, 628139, 4388920, -9922985, -2364916, 2201708, -5148055, 3419331, 1007170, -850404, 2915209, 3368865, 7818988, 3485903, -1220308, 2480881, -3874597, 1145146, 3165928, --205085, 670552, 3472481, 4493073, 10809359, 2131378, -1596117, -7369090, -301185, 5632313, --8735963, 991064, -632434, 2774012, -4373888, -5141613, 9363029, -5948530, 1940788, -347892, --5845988, 13545790, 3500935, 7117835, 3831111, 7781407, -1410897, -2881386, 4953708, -4517232, -3811784, -3591130, 2081449, 5379984, 2966212, -2354716, -391379, 2770791, -4709432, -3455838, -292058, -515933, 8014946, -4350802, -7466801, -1074279, 4170950, 6785512, -4161823, -7029788, --1541893, 9896678, 1314797, 42950, -3505230, 533650, -192200, 3094524, 3138547, -143881, -1508070, 1730335, -4788352, -1049583, 1666984, -177167, 2816962, 1176821, 294205, -1973538, --201327, -215822, 1088774, -263067, 2938831, -505196, -291521, -1387811, 335544, -1770600, -95026, -134755, 741956, 1774358, 70330, 1497333, -81068, -1652489, -332860, 238908, --3153043, 3588445, -12938052, 7332046, 2153926, -2893734, 3933116, -10572599, -8825621, 1145683, --4358855, 10009421, 8888435, 9452686, -6310918, 3676492, 137976, 9423158, 664109, 6663105, -2665564, -2815888, -8483097, -7685307, 2449742, -10241350, -157840, -2416993, -4981625, -6839199, --4023848, 62814, 8236674, 33286, 3208341, -11716134, -6551436, -1242856, -7353521, 514322, -7348152, -7953206, 3278671, -95026, -2727841, -737661, -1713692, 8100309, 4337917, 4038343, --1953136, -2463701, 11142756, -3371013, -3053185, -9193377, 6703370, -13052406, 1774358, -4291209, -2025077, 4639639, -3159485, -6965363, -4323959, 477278, 9446781, -4754529, -1064615, -6140730, --4966593, 3063386, 3267396, 7479686, -8757975, -69793, -4649839, -3050501, 1809792, -3451543, --6887517, -3917010, -632971, 6286759, 6373195, 2217814, 313533, 934692, 2889439, 250719, -420907, 1328756, -1845762, 187905, 2615098, -790274, 275952, 3237869, -834297, -119185, -478889, 2357937, -56371, 370441, 815507, 404801, 1935420, -2330557, -2628520, -169114, --987843, 31139, 1394791, -624918, 2633352, 1682017, -12078522, 3218004, 1097901, 2004139, --16623671, 14829448, 291521, -343061, -306553, -5409512, 1732482, 174483, 5303211, -4671314, -5947993, 1684164, -3724274, -6413460, -8009577, 3994320, 699543, -711354, 539018, -4634270, -4974109, 3700651, 9185861, 5442798, 3627637, 5050345, -1206886, -5100274, -3810710, 278636, --2680060, 3949759, -4495757, -6822556, -7456063, 406411, -10196789, 4620848, 5326833, -6126771, -6209986, -7393250, 3690451, -10891500, 1457068, -2033130, 788663, -2926483, -168041, -10138270, --1695975, -3518652, -6410776, -1762547, -5009006, 1546188, -4514548, -2645700, -6477885, 2813741, --6194417, -503585, 9922985, -1742146, 293668, 3171833, -2209224, -10132902, -11502996, -1970853, --8042863, 343597, -2194728, 7444789, 546535, 2766496, -7576859, 612570, -1709397, -1435056, -5475547, 1298691, -652835, -3042448, 1488206, 2065342, 769873, 2826089, -120796, 1549410, --864899, -361851, 427886, 440234, 1030792, -341987, 3182571, -970126, -2715493, 1048509, --37581, 752156, 1050656, 609349, -395137, -1465658, 809064, -2523293, 949188, 4756140, -3252901, -10346039, -366683, 1800128, -9637370, -10960757, 5935108, -10760504, 2042794, 7117835, --5239323, -12360379, -5319317, 261456, 8099235, -3331284, 14315663, -1016834, -1167157, -8311299, --5921150, -1005022, 2863670, 781684, -2998424, -2516314, -707059, -3117610, -6186901, 5037460, --5134097, -3150359, 5345087, 1567126, -8719320, -9263171, -8537858, 7318088, -7944616, -8559870, -13877576, -8767639, 6097243, -1248225, 3708704, -12589623, 5695127, 692027, -2098629, -647466, --2510945, 4029753, 2914135, 11804718, -3048353, -2278480, 5550172, 11406896, 3077344, 2273648, --5486821, -3610457, -9501005, -2037425, -312996, -134755, 6759205, -2186675, 3578782, 11942157, --1919314, -476205, -1474784, -272730, -12256763, -13955422, 629213, 9147743, 33823, -18512920, -4748623, -6505802, 3022046, -11576011, -7264401, -1839320, 250719, -4268124, 1773285, 4222490, --606664, -615254, -493384, -2020782, 1811939, -2298344, 1802813, 234076, 525060, -2013266, --1443109, -2792803, 1184874, 147640, -952409, -2682207, -685584, -843961, -1792075, -2000381, -1083406, -2267206, -957241, 1829656, 457414, -1129576, -273267, -4295, -2931315, 237297, -5150203, -812823, 6092948, -881005, -2511482, -3659312, 5179731, 3205656, -2806224, 2368138, -5273683, -2702071, -17706540, -7693360, -3430068, -1944547, 7989176, -13894219, -10161356, 8572218, -5361730, 21530134, 6125697, 4981625, 5978058, 2748779, -3787088, 450435, -3990562, 6869264, -377420, 6932077, 281320, -182536, -9366250, 4907537, -6328635, 4982162, -907312, 5222680, -2143726, 7005629, -10843182, 1282048, -7496329, 9114994, 639950, -9145596, 12171937, 8937290, -5828271, -5483063, -18320720, 5295695, -1908039, -2290291, 9113384, -879395, 4269735, 8710194, --1828582, -11070278, 7516, 4948339, 3329137, -2983392, -1127429, -8121783, 3119757, 1091995, -1823214, -1235877, 1258962, 6955700, -4233764, 3161096, -1033477, -289373, 12684112, -3403762, -5890548, 4117263, -3844533, -4451197, 1686848, 914291, -1994476, 1022739, -2079838, 1986422, --1843615, 4743792, 559956, 4531191, 1005559, -163209, 5887864, 1995012, -1576790, 1566053, --1219234, -1851131, 967978, 2235531, -2044404, 1401233, -988379, -2301029, 35970, 2221035, --913754, -2561411, 907849, -1238024, -3712999, 1591822, 156229, -2050847, -1016297, -732292, --2034741, -270046, 3005403, 4006131, -3721589, 4614943, -5037997, -20020454, 4126927, 4909148, -20354386, -4231080, -3228742, 9645960, 12663174, -20552492, -11702175, 11277510, -5801427, 408559, -4655208, -13080323, -28676960, -11245298, 16370268, 13011603, 11030550, -3306051, 6205691, -3321620, -5720360, -5954436, 2047089, -14460081, 3601867, -5083094, 7480760, 7251516, 306553, -6810208, -6818261, 4294431, 11733851, -1177895, -7192460, -3578245, -18341120, -9376450, 4570382, -1200980, --12265353, 8395587, 11526618, -16221555, 15776489, -1472100, -1668058, 9911174, 2094870, 9371619, --1166621, 3368865, -3493956, -1873680, 4792647, 18801756, -6728067, 11979201, -941672, 1141388, -4561792, 10433012, -9560060, 1139240, 15319611, 4570919, -6929930, 4084514, 6089727, 1425392, -12054363, 8679592, 15137075, -1349157, 4388383, -124017, 590558, -8370355, -5753646, -6653978, --3164854, -4832, -1335198, -2688650, -2321967, 4509179, 6585259, 2994129, -3292093, 5252745, --1461900, -835371, -3080029, -2524367, 3379066, 1101659, -1132798, 214212, -3423089, -2960843, --3367254, 80531, -1850057, 3060701, 1948841, -1294933, 1424855, 3582003, -2117956, 1647657, -2161442, -1910724, -1656784, -2035278, -261456, -583579, 2297271, -756988, -860067, -12996571, --3260417, 13558138, 8637716, 10240813, -6526740, -3253975, -989990, -1348620, 14515379, 1940788, --14792941, -6550899, -4476967, 9608379, 1928440, 2127083, 8163122, 17803176, -26140782, 17455284, --3388729, -3025805, -6711960, 5246840, 5408438, 10290205, 1648731, 9810779, -949725, -2523293, -3078955, -1552631, 5031018, 9028021, 1115618, -597537, 11825656, -8676371, -1574642, 2950106, --974421, 10453950, -12199855, 1194538, -10433549, 1782948, -11065983, -1490354, 388695, 6172942, -15095736, -8702141, -4795868, -9023726, -489089, -13225815, -8606041, -8669391, 5944235, 10949482, -175557, 21616034, -13619878, 19325206, -13534516, -3094524, 5972689, 4456029, 19110456, 11075647, --14257681, 7545184, -5962489, -19673634, -470299, -12443057, 15807090, 24058260, 15282031, -2899640, --8473970, -3051038, 13435195, -1917166, 7010461, 891743, 3115462, 4817880, 1515050, 1966558, -1595580, -5772973, 4076461, 151398, 1723893, -2178622, -1923072, -5474473, -3105261, -1832340, -3416110, -1620276, 2288681, 2969970, -1096290, -627065, 72478, 3372623, 2081985, 1303523, -6123550, -7516, 6396817, -5611912, -2528662, 4209605, 3957276, -2297808, 1341104, -1912871, --4183835, 580894, -13309567, -8424041, 8590, 16798154, -2922188, 7582765, 15613280, -12713640, -5855114, -20494510, 12792023, -12474733, -5994164, 20367808, 7052873, 21938156, -9041980, 404801, --9600863, 6528351, 28025198, 7403450, 9638443, -13790603, -2487860, 955093, 10907606, 9717900, -18002892, -14214731, -4833449, -15490873, -13169980, 1258962, 1285806, 9598178, -8930848, 6802155, --21202642, 13684303, 10371272, 5104032, -3442416, -2262911, 1571958, 6635725, 2284923, 2064269, -67646, 14821932, 12642773, 5661841, 1291175, -10740639, -10675678, 30303142, 1283122, 4025995, -16907138, 7687992, -4571456, -3256659, 10814728, 21903260, -15504295, -6245420, -17493938, -16127602, -21316996, 9750113, 382252, -3868155, 7176354, 16374026, 10430328, 16887274, 4799089, -7120519, -12189654, -8302172, -21845814, 6803765, 948651, 666794, 213138, 9518184, 16088411, -2947958, -8589935, 9678709, 8686571, 1310502, 2048699, 8522826, 259309, -2243047, -1646583, -3148748, -8181376, -4364224, -1187559, 2320356, 4680441, 957778, -599148, 8877161, 1937030, -1517734, -6600828, 8506720, 3919695, -3120294, 104690, -1232656, 2661806, 381715, 163209, 77846, --1758252, 3164317, 1233193, 1031866, 2914672, 3964792, -518617, -3668439, -1414655, -199179, -4963372, 2016487, 831076, -663572, 6529961, -13982803, -10441602, -4072166, -13013214, 14706505, --1637993, -3707631, -12394202, -2028298, -11540577, -28572806, 4978941, -3482145, -9020505, 6512781, --15170898, -874026, -8291435, -22888954, -5255966, -9899900, -10870025, 18385682, -4913443, -6563784, --3343632, -365609, -4664872, -6417218, -1056025, 4897337, 15495168, 11754252, -467078, -838056, --26061862, 1658394, 3525095, 10742787, -6045167, -5338645, 39462160, -6713034, -19351512, -18688476, -16339129, -10894721, 4682588, -22159884, 5485747, -6158446, -11950210, -10205379, -25346750, 4148402, -7210177, 18074296, 5237176, -9652939, 14118631, 1767379, 13275744, 14914274, 42643656, 11548630, -2903935, -16510391, -18672908, -4905390, 1919850, -2274722, -16909824, 7668127, 19468550, 4619774, -13826573, 21637508, 19221052, -8080444, -15518254, -10445897, 1285269, 3536369, -1969243, -16275242, -3083250, -13211856, 3996467, -5796059, 788663, -7237020, 4748623, -1096827, 2988224, 527744, --3229816, -7389491, -1818382, -52613, 4312147, 6242198, 4726075, 7176891, 310311, 6164352, -10422812, 397821, 1896765, 6068252, 1945083, -5177046, -3146064, -8920647, -2786360, 5612986, -2978560, 835371, -1306207, 3623342, 1832877, -1748589, -4350802, -7757248, 931471, 1428077, --1240709, -2414309, -710817, -2615098, -5699959, -17220134, -7433515, -2644089, 5349382, -6278169, -10288057, -5299990, -7029251, 19945292, 10391137, 22677428, 324807, -6554657, -8902930, 24042154, --20590074, -7671349, 28067074, -16885664, 5644661, 5859946, 7314330, 1672890, 15794205, -4888747, -14219563, -5352066, 3146064, 3412352, -7243999, 10554345, -15908559, -11086921, -10305774, -4737886, --14133664, -26120380, -4709432, -7807714, 4209605, -6717329, -34685620, 9676561, 21874268, -1240709, --4589173, 34171296, -42253352, -9137006, 23656142, -5765994, 18371722, -13435195, -8290898, 6374805, --40318468, 13081397, -13689135, 20211580, 14899242, -21449066, 42439644, 6273337, 2312840, -2151779, -16764868, -30639222, 12620225, -1421097, -4798552, 8238821, -19746650, 28074054, 25535728, -47036336, -6835978, -9343701, -44096968, -7581691, -19645180, 10895795, 2864206, 7682623, -17756468, 27748174, --2636036, -7414188, 12885976, -503585, 9178345, -1908576, 14445049, 376883, 7243999, 2261300, --547608, -1495186, 8114267, -5777805, -6440304, 179315, -7579544, 11516955, -2420751, -5914170, -704912, 5320928, 2625836, 5487895, 2202245, 13361106, 3245385, -7200513, 13902272, -7448547, -7948911, 11937325, -3227668, 2720862, 8436390, -5696737, 8297340, 1344325, 25973814, -11578695, --33418066, -33528126, 2697776, 4203163, -14720464, 8803072, -18636400, 6036577, -8427263, 17314624, -22166326, 766115, 21447456, 19520090, -10785200, -228170, -13807783, -3429532, -3209951, 7567196, --1316944, -2088428, -2278480, -22378928, -33872260, -13586055, 17746804, 13736916, -14506789, -16690780, -9824738, 9958955, -22010634, 11182484, -14627048, -2679523, 17119740, 23756000, 222265, -13988172, -9128953, 1868311, 14828375, 2623151, 12384001, 12787728, -3531000, -48535276, 5571110, 1343251, -19731616, -7089918, 20123532, 19950660, -13228499, -65786016, -8760660, 2772938, -7839389, 39688720, -41633804, 29070486, 41371808, -10602127, 19496468, -16209743, 27679990, 19429358, -32442572, 41181220, --42405824, -36101884, -34027952, 10934987, 25752624, 21461414, 7258495, -26554710, 24693914, 3524021, --8740795, -11313481, 1547799, 23327578, -17875118, -7089381, 35584340, 6664179, 16327855, 3218541, -1825361, 8850854, -13305809, 7334731, -5377836, 386010, 3739306, -3309272, -6845641, -4463008, --5978595, -13358959, 3125126, 12620761, -2385318, 12903692, 10004053, -8060043, -6373195, -5942088, -8006893, 5084705, -16334834, -9399536, 963683, 936303, -2344515, 2316598, 10889353, -128312, -8680666, 1026497, -6244346, -25970056, -49162344, 10479183, 18284212, -2536178, 25090662, 9680319, --30969936, -7728794, 6725919, 7763691, 8673686, -6169184, 14525043, 1340567, -9157944, -4141422, -5248987, 20611012, 26866094, 20327006, 32196686, -30735322, -8444443, -7895224, -31434328, -7458211, -5548561, 1714766, 3631932, -12469364, -14107894, 16148003, 36172216, -16960288, 18731426, -12077448, -4962298, -11132018, -1802276, -28004260, -10111427, -1509681, -38807712, -22670448, -37977176, -32076426, -21443698, 50331648, 40214852, 1264868, -2398202, 221728, -8910983, -17191680, -60797948, -20279224, --8615704, 5055714, 2731599, -21413634, -14899778, 7984344, 26934814, 16076063, 8767102, 17614734, -30195230, 11856257, -29972966, 23111220, -17701708, -9256728, 17963700, 40227736, 8767639, 51556252, --12151536, -53436372, -6068252, -17193290, -32693828, 49573048, 14161581, 16183974, 18254, -4321811, -14434848, 11903502, 800475, -1920387, -8477192, -1648194, -2438468, 13610751, 16445430, 19600620, --2107218, -633508, -676457, -620623, 12899934, -5400922, -4179003, -7423314, -5786395, 7359964, --1383516, -139050, 2270964, 4730370, 7625715, 9400610, -1194001, -5427765, -9564892, 4937602, -1917166, 4664872, 12182675, 10699300, -5262946, 2784750, 5545877, -9273908, -2783676, -2037425, --8924405, -4029216, -295279, 8314520, -21051246, -34443492, 21228950, -3394098, -20825222, 9968619, -22514218, 19487340, -40233644, -34765612, 8604967, -16185047, 4049617, 19583978, -10747619, -7940858, -32411434, 8750459, -4591857, -10395968, -9287867, 12124156, -7377143, -1499481, -1028645, -13288092, --5183489, -22068078, -29364154, 10390063, 15913928, -18568218, 13444858, 9178345, -6468758, -12904766, -1897302, 23080080, 13251585, 4098473, -23249194, -25987236, -12708808, 6931004, 28933048, -21816286, --11594801, -9957882, 17245368, 46675556, 12291123, -45788108, -10241886, -5449240, 23396834, 460635, -12079059, -6039798, -10927471, -10197863, -25971130, 24059334, 25480430, 10232760, 26944478, -8530879, -17397838, -8167417, -19589346, -21659520, -23164906, 4013647, -43299176, 45251240, -2212445, -17275970, --25068114, -20513300, -1463510, -13454522, -4125853, -23851028, -14770393, -42330124, -11839614, -27910308, -10189273, -9950902, 8152922, 9416179, 10082436, -7044820, 23285166, -5363341, 16848620, 569620, -4001299, -1376000, 7291244, -3666292, -9431211, 1867237, 2619393, 8646843, -14044543, -4937065, -3549791, -13838385, -17717, 5006322, -17286170, -7592429, 4056597, -2440615, -13255343, -20445654, --12312061, 7405598, -3937948, 9320616, 2201171, 321586, 13785234, 921271, 11850889, 4572530, -7366943, 27734214, 16589311, -7842074, 4184372, 35009352, 26261578, 10012106, 5141613, 16452946, -14889041, -23845658, -34368328, 11627550, 26725434, 38292316, 139586, -8624294, -24023362, -14114873, -16023449, -504659, -20526722, -41261212, -41300944, 8644695, -12485470, 23076322, -47576964, -15721191, -9130564, 6799470, 8931921, -15060840, 6787122, -1307818, -9030169, -1800128, -22395034, 20528334, -25242596, 18821620, -30118458, -16060493, -838056, 10152766, 14966350, 16133508, 12831215, -3410204, --2259690, -4080219, 21340618, 59531468, 37484328, -31016106, -30618284, -19399830, -39408472, 46275052, -24566140, -14349486, -40878424, -39055212, 44288628, 27315992, 5827734, 34170760, -35618700, -3926674, -2079301, -9144522, 3340411, -13224741, -36035312, 8922258, -27573690, 36710696, 34586296, -13249437, --6293201, 401579, 3857418, 39071316, 39851928, -63382444, -35478040, -20365662, 7868917, 17812304, -17112760, -24553792, -26456998, -31108448, -3969624, 32270236, 600759, 6429566, -7481296, -34405908, -7811472, -14419816, -18131742, 7876970, 60157460, 20395726, -11409581, -15426449, -14570140, -11904039, -15700790, 18845780, 21637508, -3890704, 13912473, -21301964, 5020280, 7808251, 9575093, -7646116, -4008278, 17859010, -4770635, -5012227, -3134789, 17635136, 11276974, 27436252, 6740415, -9696962, --7526930, 10198400, 33694556, 27627914, 5574868, -20249698, -25163676, -7978439, -6192269, 5990406, --12450573, 23312546, -38139848, 33227478, 48988932, 53179748, -59977608, 11013907, -1905892, -5150740, -25354802, -10827613, -17847736, 17576616, 8912057, 36453000, -3770445, -28857886, 813896, -13165685, -21475374, -33155536, -11808476, -15576773, -22164178, 30285962, -22216256, -3135326, 20776368, 12119324, --7429757, -11567421, -31115428, 4030290, 40795748, 24919400, -1846836, 12182138, -9314173, 33419140, --22603876, 15454366, -12523051, 20775294, 34367792, -7624104, -22499186, 11092290, -30647276, 50616188, -5815386, -26798448, -9310415, -41831908, 5216238, 60031832, -11052025, -35242356, -24785182, 36828272, -10845329, -19252190, -1123671, 9537512, 20488604, 50604380, -41384156, 18434000, 41275708, -6209986, --49125836, -47346108, -27926952, 83122112, -60949344, 20666846, -64188824, -30693984, 133539120, 12936978, --58486180, -55940340, -64764884, 81541568, 10302553, -15316390, -64906084, -15452755, 20020990, 66015796, --23839752, 7272454, -28724204, 9900973, 39816496, 24526410, -36048736, 17019882, 6336151, 15636365, -13537737, -36253284, 993211, -8506183, -14024679, 7344394, -13616657, -26673894, 10009421, -7761006, -34596500, 5345087, -32389958, -36488968, -11977590, 1187022, 27808302, 21333102, 4618164, -16916802, -6901476, -510027, -13963476, 1184874, 17540110, 15965467, 3513820, -26780732, 6355478, 10784126, -16722455, 15469935, 10601590, 21766358, -56346748, 9863392, -50626928, 22338662, 23922430, 47257524, -20907364, 10828686, 12352326, -14744086, -36152352, -25150254, -23746874, 10122164, 5872294, -6171331, -21592948, 33324114, -14936286, -20955682, 23133230, 4101694, -30861488, -7109782, 13946296, -25458956, --4518306, 5604396, 12928925, 6887517, 18294414, 31389232, 5520107, -20044076, -2341294, 6033356, --15936476, -7128572, 14653892, -11171747, -20171850, 27997282, -6790344, -6956774, -11180874, -11028402, -18126910, 4610111, 4117263, 24160802, -11590506, -18694918, -1119376, 1782948, -7958038, 6166500, --1352378, -6668474, -1240172, -23570244, 5215701, 4597763, -4045322, 12677670, 8531953, 4421669, -5635534, -24342800, 28765006, -10801843, -10464151, 8811125, -26387742, 8564165, -19772956, 2283312, --15652471, 5057861, 6838662, 10653130, 907312, 9448391, 14223858, -5520644, -3267933, 7903814, --532039, -5030481, 4299799, 997506, -3338800, -5061082, -4638028, -3042984, 10249939, -9859097, -9939628, 678605, 2653753, 4991289, 2920578, 7274601, -463320, -205085, -4511327, -988916, --6196564, 12381317, 846109, -5559835, -9126806, -2966749, 4734128, -8860518, 11675332, -5706401, --14987825, 846109, 6252399, -865973, -513249, 1530619, -7132330, -26132728, 42376296, -2136746, -24011014, -21688512, 2743410, -3882114, 7617662, 6896107, 12890271, -6502044, 9497783, -5819681, -5253282, -888521, 4164508, 10264972, -1221381, 15888695, -6320045, 12018929, 668404, -449898, --4437775, 7717520, -6062347, 6977711, -4037269, 542777, -3343632, 3848291, -2724083, 9064528, --2775623, -6248641, 14468134, -9921911, 7580081, 6137509, 2253247, 7058779, -8815957, -6080063, -6656663, 6260452, -3862249, -765578, 7095286, -566936, -9816685, 4400194, -4974646, 5133560, -6888591, 3301219, 2376728, 2290828, -10572062, 5250598, 3013457, -3131031, 3904662, -4920959, -2444373, -2413235, -457951, -1265942, 3723737, 7204808, -9863929, 8894877, -1723356, -3412352, -5094368, -6809671, 3283503, 4922033, -1176284, -2423972, 3405909, -1277216, 2007360, -853625, --3503083, -470836, 3799972, -930934, 1478006, -705448, -2567854, 1745367, 1540283, 2741800, --3731790, 3080029, -247497, -1473174, 3557307, -3889630, 6204617, 3230352, -2316061, 6398428, --480499, -2420214, 255014, -2416993, 3782256, -4059281, 4336843, 1832340, 2333778, 1174674, --2493766, 2177549, 974421, 579284, 392453, 261456, -1018444, 1227824, -2612414, 3262565, -1263794, -2889976, 10449655, -35759360, -111293344, -16433619, 53932980, 27856084, 131200512, 24330990, -28149752, 17680232, -35443144, -49896244, -35565552, -63940252, -54955716, -31216896, -12846784, 36457292, -99621768, 78989816, 68032816, 38626788, -30762704, -50018116, -36817532, -68898792, -65253976, -20082194, --9229885, -15310485, 25184614, 39412768, 26053808, 48085916, 37156836, 11291469, 34170224, 6876243, --5182415, 3049427, -20742544, -54444616, -46282032, -39361764, -55173688, -23181012, 15995532, 10948409, -35175244, 39821328, 34808564, 35711044, 36487896, 23073102, 22573274, 2368675, -20426328, -38086696, --26024818, -35860828, -47352552, -23387170, -21779780, -17766670, 6587406, 17812304, 17051558, 33292976, -41648296, 20088636, 29329258, 25014964, -7077569, 2807835, 11193759, -13973676, -12661027, -22353694, --40098888, -40257804, -31987842, -33121178, -6584185, 13799193, 9174050, 26213796, 39355860, 31019328, -28635620, 29444686, 19611894, 6410239, 1766305, -9224516, -17289928, -18564460, -27628988, -34916472, --37164352, -31993212, -28748364, -16441135, 3605625, 18033494, 41303088, 54681912, 47960828, 39767104, -33712808, 19489488, 3999688, -16940962, -34868692, -47509316, -49798000, -54880556, -40511744, -16920024, --4352413, 11444477, 32559074, 42089604, 45386532, 46777024, 39070244, 16564078, -1279900, -12120935, --26682484, -34649112, -32581086, -28914256, -20886962, -8549132, 995359, 11500849, 14865419, 11462194, -12537010, 10005663, 6784975, 5341866, 5468567, 1833414, 1801202, -470836, -2814277, -3337190, --2980707, -4291746, -5121749, -5400922, -4730907, -3991635, -2706366, -787590, 926102, 956167, -603980, 410169, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --3556770, -2687039, 1690070, -3508988, -618475, 4480188, 1328756, 1105954, 2470143, -584652, 675384, --1165547, -4686346, -1841467, -233539, -1034013, 1345935, -1450625, -455803, -3969087, -6442, -684510, -2804077, -609885, -3539590, -1258962, -1129576, -4282620, -1969243, 1363115, 1862942, -4799626, 2837900, 6131603, -670552, -1000191, 892816, -2115808, 5325223, 313533, 2511482, -4226248, 733903, -1712618, 1721208, -2259690, -3012920, -756451, -1308891, -1665374, -5558225, --1797981, 14496, 862752, 1642825, 459562, 2807298, -3152506, 2474975, -25233, 604517, -1755568, -2205466, -4909685, -2129230, 2083059, 3048890, 2319819, 179315, 2365453, 1780264, -3218541, 1602560, 1387274, -2146947, 161598, -363462, -432181, -1831804, -2245194, -987843, --522375, -223875, -1731409, -4832, 244276, 654983, 157840, 1221918, -674310, 544387, --1083942, -1656247, 808528, -260919, -41876, 1112933, 793495, 971736, 70330, 70867, --946503, 537945, 176094, 308164, -139050, 1513439, -329639, 55835, -661425, -566936, --743566, 624918, -501974, -1437203, -2571075, 2444910, -3954054, -2429878, 6368900, -1031329, -5630702, -2879776, 548145, 2785286, 1240172, 186831, -3778498, -5360656, -5592048, 602906, -145492, -1582696, 760746, -4950487, 9863392, 1115618, -5483600, 1460289, -2871723, -3128884, -2944200, 4182225, -60130, 941672, 1999307, -302258, 23622, 3283503, -1797444, -802085, -199179, 5979132, -115964, -699006, -2257005, -3532074, 1844689, -871342, -3623342, -1637993, --4362613, 585726, -3956739, 89657, -2995740, -990527, -2634426, -5487895, -2247342, -344671, -5184026, 762357, -1496259, 2825015, 4747013, 716186, -6458557, 2976412, -14496, 1207960, -2125472, -1502165, 4098473, -2042794, -3653944, -3812320, -6749541, 631360, -2302639, -2396592, --3039763, -3187403, -181999, -3476776, 1103807, -543313, -1972464, -731755, -2228551, 47245, --96100, -2557116, -1061394, 1036698, -370441, 165356, 575526, 239981, 439697, 324807, --693637, -2289755, -411243, -859530, 646393, -293132, 271120, -438624, 19864, -35433, --495532, -1437740, -1180042, -195421, -520228, -554588, -462783, -1077500, -397821, -4952098, -8290361, -2076080, -7517804, 582505, 2578591, 245887, 2377265, 1941325, -5949067, 2137283, --1376537, -231391, 255014, -1079111, 4563403, -1394791, -2941516, -247497, 3650185, 2300492, -1364726, 2149631, 8829916, 2338610, -3009698, 3993246, -3677029, 1234803, -2964064, 8299488, -1307281, -2686502, -1609539, -2693481, -922881, 5509370, -4374961, -3690451, -1113470, 4564477, -2625299, -4203163, 1204738, 958851, -2452426, 129923, -9014063, 3011846, -2067490, -1716913, --5711233, 8682276, 496069, -4518843, -3546569, -4435091, 348966, -954557, 491237, -24159, --5199058, 6873022, -3876208, -3557844, 2724620, 736587, 2705830, -1927367, -401579, -4227859, -387084, 924492, -5369246, -4008278, 396748, -3741990, 1353989, -3346853, -944893, -943819, -2392834, -4322885, -4491999, -918586, -712428, -1072668, -289373, -1937030, -491237, -1409823, --1162862, -913754, -1401233, -1694365, -153545, -2275259, 603980, -1509681, -5906, 144955, --547608, -856846, -118112, -603443, 1174137, -178778, -992137, -58519, -1753420, -343597, --1075352, 86436, 235686, -1202591, 7194607, 223338, 1556389, -5951214, 1830193, 3419331, -2495913, -249108, -2984466, 7737384, 1344862, -1541356, 3710852, 3032247, -3616899, 4741107, --3187403, 7818451, 1108638, 6978248, -761283, 1231582, -2736431, -7900056, 855235, 162135, -271120, -1365263, 1626182, 4172024, -1046898, -4057134, -2685965, -5770826, -1596117, -2841658, --3052648, 532039, 1989107, 3134789, -3710852, 2589865, -2483565, -3085934, -416612, 2649995, -496606, 657667, -5770826, -5567352, -1055488, -1650878, -4219269, 9196062, 4268661, -580894, -1773285, 3696356, -9276592, -4692789, 6222871, -3468186, 5836861, 1324997, -1214939, -6225018, --4594005, 7403987, 3923453, 7000797, -7351374, -509491, -5098126, -406411, 1814087, -2717641, -867047, 545461, -4576288, 4112968, 461709, 623307, -745177, -8152385, 886911, -1962263, --2564632, -2551211, -492311, 1418413, -1312113, 632434, -2866354, -607201, -1312113, 1833414, --351650, -220654, -928787, 66035, -970663, 626528, -1617055, -775778, 537408, -461172, --98784, -102005, -10201, 753767, 472446, -134755, -1133335, -1181116, -1228898, 1062468, -487479, 1548873, 816581, 628139, -12179454, 582505, -1620813, 3218004, -7396471, 2282238, --2537789, 12184822, -3315178, -6409165, -2389613, -5386426, 1592896, 4484483, -1517734, 8498667, -809064, -2588792, 1995549, 981400, 2161442, -3095598, -603980, 3125126, 4955319, 1927904, --1073205, 2350958, -4558571, -1460826, 6248641, 4458176, 7349226, 5206037, -197032, -3835943, --7988103, 5403606, -938987, -5832029, 2923262, -1584306, -8939438, 172872, -7465727, -645319, -6607271, -1193464, -5045513, -2347737, 6306623, -5589900, -9127879, 9131100, -1807108, -2291365, -2078764, 1109175, 1013075, 2152852, 2138894, 1166621, -6747394, -2590939, 5078799, -752156, --2054605, 1503775, 8771934, -4541928, -4988068, -2296197, 3547106, 1787780, -8051990, -3598109, --2819646, -3531000, 2545305, -524523, -679679, -3016141, -2426120, -6361384, -3708168, 1472100, -132607, 954557, -330712, 3690988, 3794067, 629213, 1337346, -1990717, 369367, 139586, -1505386, -2439542, -1171452, 253940, -19327, 1074279, -122407, -1402844, 1314797, 475668, --2731599, -560493, 692564, 436476, 376883, -705985, 276489, -1331977, -1352378, -1142461, -596464, -605054, -729608, -229781, -10652056, -254477, 2814277, 10200010, 10543071, -3435437, -5237176, -6829535, 2210298, 4465156, 6763500, -2010582, 10158135, -1947231, 8612483, -4753992, -7212324, -3671660, -12063489, -2768107, 2981244, -4189741, 4622459, -2641942, -2916820, 1266479, --13219909, -4303557, -297427, -2332167, -818728, -6416681, -2228014, -2315524, 2073396, 13411035, -7728257, -7864085, 4252555, 10715407, 2643016, -3816615, 2656974, -2881923, -3227668, 7700877, -5364414, -5428839, -747861, 5477157, 11515881, -3758097, 6254546, 17087528, 7349226, -7938710, -3169149, 1947768, -9565429, 1385664, -7907572, 3480534, -8614631, -2069101, 338229, 4021700, --5627481, -1595580, -2797634, -5142687, 6575595, 5619428, -324807, -3781719, 1006633, 963683, -920734, 1549410, 4884989, 921271, -6522445, -153545, 7902740, 213138, 1768453, 1560684, -2391223, -2501282, -1156420, -3999152, -1692754, -3682398, -307627, 2144799, -478352, -2097018, -1157494, -446677, 455267, -1147830, -774168, 1447404, -110595, 3498788, 863288, -774168, -1861868, -64961, -826781, -1349157, -1792612, 765041, -946503, -501437, 924492, -107911, -1654099, 80531, -2153389, 4686346, -2295123, -10729902, 2501819, -8615704, 1415729, -2841121, -11188927, -5648956, 1597191, 2958159, 1129040, 4073777, -1620276, 12243878, 979789, -7907035, --1453310, -5825587, -915365, -1882806, -5450851, -6852621, -1742146, -4406637, -2069101, 7839389, -2930242, -6593849, 2602213, -7878581, -1474248, 5762773, -10755135, -9497246, 5437429, 5102958, -2659122, -308701, -6522982, 2607582, -3205656, -6169184, -2835215, 346819, 1978906, 10246181, --4014184, -1147830, 563714, 4782446, 2535641, -3536906, -4554276, -8198556, -2482491, -1811403, --4492536, -5257577, 3376918, 6845104, -10737, -4365835, 7595113, 1461363, -3715147, 935766, --1085016, -978716, -2585034, -1471563, 4939750, -3905199, -5837398, -3375308, 3091840, -4529580, -8028368, 3588982, -1298154, -3281892, -3700114, 2278480, 4997732, 10190884, -2918430, 5217312, -200253, -16106, 585189, 1639067, -1848983, 49929, 1287417, 2147484, -1315871, 1503775, --1125281, 4941360, 1915555, 3716757, 75699, 2527052, -102542, 2244121, -412317, -199716, -2644626, 993211, 351650, 1388885, 341987, 2586644, -1878511, 610422, 1800665, 2378338, -2082522, -782758, -2585570, -35433, 1687922, 365609, 339302, 2138357, 5562520, 10612864, --7915625, -276489, 7226820, -3457986, -5187784, 6646462, -10486700, -639950, 1937567, -1363115, --3912715, -4614943, -2221572, 1816234, -564788, 5021891, 2527588, -1676648, -3997541, -2914135, -8260833, 325881, -10103911, 4712653, -6392522, -6260989, 3836480, 7279433, 7415261, 5633387, --181999, 3808562, 2586107, 3595961, -3314641, -163209, -2989297, -7269232, 3054796, -1873680, --401579, -1599875, 704375, -1197759, 8031052, 14952392, 2458869, -2587181, -47245, -10672457, -10358387, -7275138, -4728222, -7000797, -8587787, 14535780, 791348, -8070244, -2928631, 10031970, -5166309, -7593502, -5683316, 11498701, 925029, 1193464, 14856292, -7090454, 4078608, -5323075, --14750528, 6937983, 7097434, 1194001, -8517457, -1186485, -1852742, 1771674, -3698504, 5408975, -3321620, -11651173, 4947266, 5598490, 7117835, 1243393, -6240051, 10440529, 1764158, -912681, --807454, -3481608, -3684545, -1305670, 652298, 3164317, -15569, 273804, -344134, -2786360, -1170379, 1281511, 546535, -1267552, -783832, 2126546, 741956, 2419677, -1579474, 586800, --3668439, 435939, 3435437, -4602058, 625992, -3600256, 4201552, -1733556, -115427, -2797098, --36507, 2465848, -312459, 3354370, -11811, 5010616, 6408091, 11894375, 10891500, -453656, -9284109, 4161287, 9468255, 9145596, -15250892, 5500243, -4944581, -6609418, -4822712, -1458678, --9729712, -2055142, 2362769, -8326331, -17064442, 3879966, -1212255, -15381352, -11286637, -10082973, --5633924, 528281, -2896419, 3629247, -2037962, 6088116, 11902965, -6839736, 4042638, -2700461, --5466957, -3990562, 718333, -1187559, -501437, 8856223, -375273, 8928163, 11584601, 3445638, -4983236, 7656853, -1013075, 1536525, -11454678, 10684268, -9343701, -3302293, -2982855, 932545, --2588792, -8923868, -7858180, -17226040, 15586973, -17596482, -17049946, 2866891, 16346646, 5788006, --2120640, -4128001, 7514046, -8268349, 9400610, -2761664, 1189706, 955630, -6251325, 6541235, --7384123, -6040335, -715649, 2347737, -7054484, -1125818, 3775813, -581968, -1942399, 5024038, --3346853, -6350109, -1470489, 3171297, -4209068, -2476049, -2886755, -664646, 1891933, -1384053, -556198, -1076426, -2317672, 629213, -1497870, 1439351, -1564979, 2095944, -660888, 3934190, --590558, 1504849, 2138357, -1402844, -2703682, -311385, -681826, -186831, -853625, 1811939, -68183, 2352032, -2161442, 810675, -4604742, 173409, 167504, -1711545, 1357747, 7137699, -9298604, 9294846, 10117869, 23848342, 10714870, 13631689, -6730214, 22075058, -12597676, 610422, -4872104, -96100, -8295730, 2760590, -2287607, -18811420, 7138236, -4734665, 2028835, -1757715, --6226092, 17180, 5604933, -7592966, -3935801, -1178969, 4434554, -11471858, 7282654, 2752000, --10510859, -815507, 4300336, -9526237, 3582003, -11425687, 5287642, -973347, -3688303, -436476, --7458211, 9613211, 11361799, -10813654, -6173479, 4917201, -3843459, 3029026, 2749853, 736587, -375810, 13106630, -3292093, -8745627, 8122320, -324807, -6880001, -5779416, -10871099, 2107755, -2980707, 5450851, 5237176, -5020280, -8443369, 4741107, 2377265, 16380468, 1737314, -2020782, -425202, 1103270, -4820027, -2152316, -6045704, 6715182, 3887482, 4376572, -1273458, -10456635, --9529996, -3118683, -837519, -3750580, -6601365, 1869385, -2885144, 4328790, 769873, -691490, -2696703, 2793876, 4444755, 4164508, 3358665, -18790, -989990, 1191317, 2989834, 2311229, --1322850, -1252520, -832150, 768262, -2147, -816044, 59056, -5144297, 639413, 3371549, -2586107, -4007205, -2881386, 5760625, 3087008, 5712844, 2261837, -4164508, 3969624, -1013075, --3147674, 620623, -4495220, -2467996, -1140851, 1729798, -897111, -12882218, -14477261, 24143622, -16834124, 21583284, 1373316, -13860396, 4876936, 11261404, 8016020, -3540664, -8771934, -2585570, --3228205, -4260071, -7553237, -3034395, -6345278, 16093242, 2567317, 2652142, 115964, 932008, -1703491, -5958194, 10649371, 6010270, -642098, 3868155, -1524713, 10961293, 2014877, -978179, --17951890, -1334661, 1120450, 1702955, -3367791, 2237678, -8507256, 14559402, 11792370, 11381126, -9932649, -7822746, -10828686, 8296803, 2552284, 4053376, -718870, -12605192, -9119289, 721018, --7110855, 77309, -5973226, -2602750, 7551626, 2398739, -5401458, 1925219, -13934485, 420370, --23619636, -12006044, -22316114, 19258096, 17357036, 18526342, 22454626, 10871099, -3721589, -9968619, --3027952, -557272, 3219078, 17787070, -5881958, -13524852, 10307922, -8609799, 4486630, -1976222, --1950452, 4167192, -4013647, -7318088, -2074469, -9009231, -1916092, -8101382, -1866700, 1129040, --720481, -981937, -2206003, -2830920, -5597953, -90731, 2927557, 452045, -2823404, 978179, -4877472, -664646, 3258270, 1784022, 1925219, 1365800, -6471979, 5653788, -2507724, -2058900, -3789772, 1302986, 4190814, 421981, -5390184, -1007170, 106837, 929324, -3303367, -8567386, --11528229, 10162429, 13186623, -6478958, 12243341, 1725503, -5201206, 4923107, -17749490, -5508296, -5004174, -5656472, -10885595, -20515448, 10077067, -8816494, 2371359, 13287018, 3187940, 15493021, -11851962, 6737193, 2542621, -9151502, -2687039, -4791573, 836982, 8628052, 4496831, 1780264, -7365869, 21065204, -1101122, -17918066, -7868917, 2894271, 4300336, -1027034, 443455, 1695438, --7643968, 469762, -16865262, 3792456, -17643188, -6433861, -13662291, 6725919, -6816113, -11210402, -17104708, 4796942, 1393717, -7699266, -10262824, 2561948, 4066260, 1506997, 5573257, -8746701, -19229642, -23350126, 6073621, -9732933, -14173929, -7940858, 12238509, 3688303, -13287555, 9386651, --10581726, 25936234, -2418067, -2847027, -12617003, 1510218, -16831440, -9029632, 22453552, -9038759, --10197863, -6658810, 6713571, 843961, 9517111, 4744328, 4975183, 6937446, 3769908, -636192, -716186, 3309272, 1417339, -1833951, 5574868, -1750736, -1942936, -4201015, -3773666, -1694902, -2057289, -3307125, 243739, 1618129, -1365263, 1411434, 260919, 5502390, 2882997, -6442, --1122597, 10201, -400506, 3288334, -2923262, 2983392, -825171, 1321239, 4609037, -1458678, -241055, -635118, -2319819, 5646272, -795106, 24395414, 25103546, 23678154, 5052492, -6350109, --3961034, -15255187, 12387223, 363998, 7268696, -4565014, 2336462, -5578626, -4291746, -8821326, -4765803, -9185324, 15083388, -39366060, -11461657, 281857, -11911018, 8460549, -12242804, 2517925, --4730370, 12380243, 2203855, 11917461, 864899, -2813741, -190052, 4362076, -13790066, -9909026, --10726681, -1519345, 13424994, -26479010, 9189083, 23025856, 2832531, -16943110, -665720, -14270566, --13677323, 9470940, -1790465, -11658689, 6481643, 967441, -4344360, -6588480, 3770445, 9570798, -5816997, -13542032, -9884330, 7742216, 11674258, -9535364, -12596602, 6206228, 13079786, -15908559, --549756, -14203457, -19489488, 23181012, -3859028, 3578245, -4350265, 14366129, -3389803, 3514357, --7724499, 12495670, 6933688, 11496554, 13293461, -13252658, -14626511, -5961952, -2803540, -8784819, --22006876, 2422362, 1196685, -14496, -1621887, -3575024, -2961380, 6320045, -556735, -2731062, -5837935, -6440304, -3426310, 2389076, 11464341, -3482145, -3540664, 559956, -1450088, 3960497, --1388348, -639950, -2019172, -3223910, -8053601, -11557220, 2043868, -819265, -8804683, -4403952, -2316598, -3068754, -9975062, -5553393, -670552, -1737314, 795643, 2834142, 1189706, -22549, -8176544, 2822331, 12869870, -4784057, -638340, -19092204, -9030169, -4583804, -16227460, -23199266, --4536559, -7920457, 21370146, 6243272, 31897112, 5556077, -9482751, 3995393, 5851356, -26526254, -1256815, 22816476, 14405857, -15559056, 1852742, 11281268, -21351356, -3632469, -10810970, 8723079, --8513162, 5667746, 1188095, -4410932, 901406, -291521, -7031935, 6956237, -14585172, -5836861, --6404333, -18239116, -4029216, -2607045, 37044, 1061394, -5159867, -5904507, 32584306, 9645960, --13008919, -23475218, -8685498, 2126009, 23475754, -5986111, -3351685, -13501230, -3804267, -9570798, -19194208, -16061030, 17091822, 21772800, -22520124, 14450417, 5270999, -9682467, -8689793, 5143760, -10013179, -48785996, -6726456, -336081, -6969122, 12539694, -6876780, -36532992, -14439680, -10830297, --16726213, -16244103, 2480344, 2866354, -9637370, -8514773, -15471009, 1292785, -5970005, 1023276, --6939057, -7942469, -9073118, 1735167, -2148021, 5011153, -7917236, 3401614, -1329292, -7969849, --16450798, -4297115, -1360431, 4910758, -2685428, -21621402, 3940096, 10060424, 3696893, -762357, --7930657, 7313256, -1522566, -2743410, -13354127, -2485176, -4919885, 10391137, -2108292, 1432372, --423591, 2017024, 6282464, -5224291, -98784, 71941, -2872796, 292595, 2397129, -15560667, --13654775, -5296769, -11154567, -7700877, -3499325, -7027640, -9034464, -7031935, 5352066, 32123134, --1119913, -37751152, -21204790, -23408646, -4525285, -13000329, -710280, -19219978, 31157840, 18515068, --3532611, 24538758, 545998, 26471494, 6186364, -15426986, -21099026, -13265006, -17065516, -7617662, -3921305, 11386495, -3945464, 3683471, -14149770, 2320893, -20324858, -1875827, -1380295, 6853694, --7786776, 32161252, 3915937, -881542, 21122650, -8337606, -15414101, -8926016, 12837120, -1029182, --8876624, 3566434, -395674, 27384174, 6480569, 71404, -10924786, -16546898, -42080480, 2705830, --33498598, 16821776, 56625924, -40679784, -9025874, 9242233, -7340636, -7141457, -11739756, 9556839, --12050068, -39325256, -10815265, -39206072, -8571681, -1099512, -24974698, -3428995, -35786740, 15426986, --3932580, -22388054, 54812372, 4360466, 22117470, 18953154, 30056718, -18616536, -1655173, -11185169, --4486094, -7534447, 14050986, 9290551, 12575127, -26718992, -5824513, -14481556, -19297288, -15677704, --10132365, -1990181, 10043781, 8810589, 5558225, 7805030, -2600066, 2619930, 14545444, -2631204, -14380624, 4531728, -13373454, -3374771, 4126390, -5417028, -2684892, 17635136, -217970, -5127654, -19055160, -8870181, -1880659, -15904264, -4441533, -11031623, 7926899, -8378945, -4366371, -3049964, -2689723, -3588445, 7080254, 419833, 7330436, 2449205, -3537979, -11910481, -66410932, -7089381, --17114370, -18710488, 23934778, 18955302, -23399518, -18524730, 45294188, -5330055, 14565308, 2172717, --2570538, -5417565, -5140002, -14942191, -360240, 5083631, 7947837, 5333276, 16060493, -12939663, --511638, -12612708, -7621420, 4879620, 22865870, 14672145, 20164872, 18118856, -4312147, 6459094, -10750840, -125091, -18916110, -3554622, 25688736, -4784057, -37227164, -16451335, 3832722, -31503586, --13793287, -32278826, -22318260, -20224464, 29457570, 20172924, -6698002, 20193862, 7569343, 28543816, -19013284, 9091372, -50719268, -11396159, 2003602, -44475460, -32711008, -12585865, -8902393, -52065740, -10915123, 28599114, 38225208, 46017352, -15809775, -30194156, -623844, -30459908, -22863184, -42250132, --47153908, -33210834, -28191092, 30926448, 1043677, 6120329, -28675886, -29847338, -26982596, -2784750, -40368936, 51525648, 1024350, -19082540, -14929306, -20962124, -54604604, -24365350, -24543054, -6814503, --2485176, -12449500, 13772886, -214748, -4675609, -19488414, -25662966, -13349295, -14687178, -22424024, --5434744, -5849209, -2686502, -6162205, -10710038, 13276818, 7777649, -1597728, -12817793, 8689793, -14143327, 915365, -13147969, -6806987, 9725417, 2616709, -3368328, -12268037, 9708774, -2625299, --4518306, 1005022, 7403450, 1875827, -2885681, 1075352, 5609764, -20352776, -49432388, 19510426, -2560338, -33547452, 31678068, 15848966, 9878962, -7148973, -29992294, -7355132, 1070521, 29628832, -39228620, 2556043, 10734734, 2811056, 1394791, -1545651, 5451924, -16037408, 55151676, 13523241, --17789218, -17634062, -7835094, 2762738, 27027692, -12662100, -3932043, 363998, 13742822, -12689481, -7301445, 1299228, -2905546, -45017164, -14105209, 14970109, 23652384, 8779450, -4955319, -12666932, --29874182, -2829847, 5001490, -6669011, 616865, -7354058, -19237158, 19949586, -4408784, 7458211, --20587388, -3824669, 52938692, 4495220, -5797132, 6709813, 6962142, 5531918, 26678190, -9199820, --11988864, 20426864, -2201171, 12358232, 7395934, 17898740, -6644315, -19044958, 9982578, -8450885, -1600412, 75348224, 71971304, 32968706, -6376416, -3030636, 9131637, 34534220, 15687368, -9385040, --1093606, -3765076, -19072340, -19581292, 11159936, 6317360, 2912525, 17655536, -2232309, -8687645, -10075993, 5020280, 14858976, -20798380, -17561584, -21130702, 3282429, -9041980, 1249836, -3571265, -7950522, 9693741, 18424336, 11534135, -19523310, -13536126, 7034620, -11132555, -6842420, 2406256, -6372121, -7164006, -19221590, -1213865, 673773, -707596, 8540542, 3247532, -15521475, 5783174, -25109452, 29877940, 21509734, 25671556, 17628694, 23279796, -5996848, -279710, 19184546, 35546760, -3842385, -39765492, -11254962, 7474317, 4684199, -10378788, 28115392, 13403519, 10279467, -10774999, -33080912, -3172907, -229244, -10309532, 17142288, 10944114, -27227946, -39323108, -11753178, 5272609, -1142998, -8441221, -36163624, -4648765, 11470247, 1698123, -12879533, -6000606, -11623255, -14635638, -7180112, 8855149, -23588498, -26361972, -9850507, -32429150, 7409356, 26308822, -25171192, 25247428, --13514651, -15692200, -28135794, -38758320, -43490300, -41189272, -21778706, -1152662, 14029511, 5881421, -13953812, -22269942, -48412336, -19755776, -46589120, -80714248, -31536334, 62977644, 108591272, 63234804, --28167470, -22775138, -98852968, -88778048, 59692528, 9513353, 78796544, 81817520, 84949624, 27913530, --35690640, -43817256, -48958868, -55614456, -9242233, 53196392, 90516976, 28276990, 8204462, -5284421, --47152300, -68229848, -46654620, 7681012, 62023624, 28530930, 39663488, 32351304, 10831371, -25151328, --28183038, 76773, -16291348, 4083977, 29532196, 31857920, 22724136, 3753802, 10795400, -567473, --22492744, 3369402, 6934762, -4381404, 1958505, -7064685, 43321188, 25021942, 26823682, 16122770, --17276506, -40717364, -57894548, 7343857, 17742510, 36765456, 36290864, 47937204, 21980568, -37462316, --47266652, -56312928, -11730093, -1255204, 27839978, 16005196, 7303055, 14925548, -29713658, -82689392, --56781080, -51486996, -13798119, 5148592, 16405701, -6380174, -13462038, -20138564, -3547643, 7641284, --24974162, 34968012, 16813186, 31047782, -68272800, 15462956, 9242233, -21020644, 15320685, -15734613, --7738458, -4717485, -9744744, 29375428, 54209468, -15779710, 10913512, -7589744, 13008382, 27511414, --8403640, -5077725, -14974940, 7865159, -9488656, -29951492, 21858700, 36791228, -4814659, -19370302, --17641578, -38903812, -10642392, 29348586, 20048370, 10162966, -42696808, -24917252, -18577344, 37725920, -32913946, 28679108, -83398600, -55686400, -6668474, 41145248, 88236344, 217433, -105890272, -39073464, -3652870, 35600984, -2801393, 19471234, 14957760, -46450608, -20144470, -12966506, -27625230, 1757179, --51984672, 7983271, 20800526, -63189708, -40169756, -19840064, -7889855, 69535520, -229244, -107248016, -10482941, 14867029, 16550656, 41944112, 19885162, -45964204, 2530273, -2000918, 91822104, 64355788, --53449256, 48680232, -28365574, 19200652, 50849192, 17905182, -27469000, 25116432, -10803990, 6223945, -17849348, -2186138, -18469970, 34320008, -21939766, 25058450, -11541114, 13318694, -3798362, 27520540, --9373766, 21539260, -37780680, -6969658, -31139, -5408438, 12714714, 23336704, -23822036, 48530984, --18694918, -17289928, -32896766, 23989002, 51968568, 9697499, -67282272, 4991289, -14711874, 32456530, -16773995, 14338211, -26677116, -2422899, -16753594, 15855946, -6449431, -11470247, -3345780, 21658446, --4701379, -14345191, -16090558, 11970074, 2684892, 11347840, -6748468, -409096, -12130061, -1708860, --1904281, 5333276, 2784750, 12815646, 23630374, -56464860, 8009577, -41460392, 7550016, 35193500, -31114890, 10187662, -20179904, 4037269, -11993696, -2969970, -14880988, -10995653, 7636452, 2054605, --21660594, -2496987, 11260867, -2410014, 1265942, 4076998, -13819594, -13685913, -364535, 9049496, -1196148, -22024592, 1830730, 11289322, 3541201, 2621004, 23030152, -2543158, -6148246, 8253317, -8814347, -15585899, -17283486, 12806519, 2473364, -13272523, 8902930, 3853123, 4310537, -9286793, -3733400, 10436234, 1253594, -13066901, 17713518, -2157684, -19870666, 593779, 15538655, 4840965, --13005698, 11823508, 3914326, -18129056, 7446937, 927713, 18500034, -16777216, 1505386, 12744242, --29372744, 932545, 12676059, -492848, 8784819, -4888210, -18804440, 2491618, -19897510, 18670222, -9640054, 5260261, -7395397, -7800735, 15425912, -13301514, 13765370, 15117748, -21626770, -7023882, -925565, 16740172, 261993, -9711458, 6202470, -11761231, -704375, 1699196, 9887015, 672699, -1626719, -6079526, 10291279, -3447785, -12005507, 10916733, -4847408, 4706211, -2718178, 7870528, -9948755, -11426224, 2001455, -6193880, 2695092, -6293738, 22121766, -6256157, -12404402, 9975062, --5584531, -1883343, -6307697, 6519761, 6028524, -8950712, 5013301, 8705362, -4500589, 574989, --12336757, -27938226, 45817100, 6478422, 20728586, -17812840, 7931731, -3845070, 5557151, 5027259, --7623567, 3100967, 8421357, -4804458, 18295486, 853088, 635118, 6243809, 6014028, -644245, --4607963, 7834021, -1161252, -5345624, -1055488, 7873749, -8402030, 1853278, 3882114, -10711648, -13502840, -2623688, -6415608, 20695300, -8434779, -12096775, 9548249, 5305895, -5632850, 9018894, -7233262, -2418067, -2835752, -1531156, 2761664, 5226975, 3086471, 48855, -3491809, 10716480, --11249056, 10281078, 1667521, -1150514, 2918967, 3325379, 3382824, 559956, -10003516, 2930242, -8763344, -6080063, 46708, 113280, 6693707, -557809, -2495376, 10107132, -5003637, 5480915, --10282152, -3718368, 10110890, -9429064, 9723806, -2383707, 6428493, 7873749, -8722005, -2865817, -10964515, -8968429, -404264, 1269163, 3368328, 941135, -1166621, 532576, 886374, 5158256, --4218732, 1240172, 3275450, -188442, -2149631, 694174, 1951526, -298500, 716723, -1761474, -2334315, 3272228, -5411659, -733903, 9549860, -4451734, 2774549, -559420, 5470715, 1672353, --2923262, 747861, -525060, -3015067, -2127620, 11326366, -1839857, -2422899, 1664837, 1390496, --809064, 2521146, 4670240, 291521, 1260036, 573378, -921807, 835908, 1413044, -1984812, -1545115, 8590, 10660109, -37832220, -120885072, -6185827, 65093452, 29196114, 138708112, 11800423, -29266444, 1187559, -40491876, -50996296, -34554084, -62139048, -43487616, -27359478, 954020, 47391208, -93382256, 68718400, 59799368, 19458886, -32556388, -47795468, -42979736, -50644644, -56171192, -22781580, --10801843, -4932770, 27354110, 36331128, 27379880, 50802484, 32779728, 12150462, 34064996, 773094, --14861124, -9822053, -30663382, -62810676, -38213396, -36779416, -37527276, 1941325, 17414482, 12051141, -46097348, 37824704, 26032334, 37204080, 39528732, 11202348, 11815455, -4227859, -34138548, -47387448, --36257576, -47494284, -33822868, -11800423, -8411693, 2922188, 25799332, 20236276, 18209588, 36506148, -30118458, 22183506, 37643776, 10334228, -7799661, -1559610, -15196131, -32760936, -19117974, -41445360, --52455508, -30878668, -26141856, -11322071, 30341260, 41053444, 38206420, 44167296, 36264020, 20668456, -19840064, 9667435, -4351876, -11218991, -21153788, -31132070, -31261994, -35234300, -37091876, -31636730, --10875931, -3725347, 12364137, 31836446, 35336844, 35067872, 40862320, 32592896, 24300924, 20308216, -6562710, -15809238, -28300076, -45917496, -58760520, -54905788, -43640624, -21888764, 5446556, 29463476, -40306656, 46540804, 48375292, 41862508, 29458644, 15112916, -9759776, -23766738, -31585726, -36478232, --32076426, -24023900, -16726750, -6840273, 7540352, 10192494, 13710609, 15955267, 14025216, 11304354, -8856759, 6091874, 5172215, 2390149, -1968706, -3034395, -3290482, -4902169, -5582921, -6993281, --8396124, -9071508, -7470022, -5532455, -3078418, 76236, 4412542, 5966247, 4590783, 2843805, -1946694, 1621350, 0, 0, 0, 0, 0, 0, }, -{ --2763275, -666257, 3242164, -281320, 294205, -4798016, -2411087, 713501, 6369974, -4101157, 1333587, --6607271, 6790880, 452045, 2491618, -775242, 1080184, -1268626, -2324651, -5742372, 2439005, --5757404, -2687039, -3244848, 3278134, 2608119, 1260036, 2718178, 5120675, 343061, -4633196, -3062312, 507343, -208306, 2511482, -911607, -1673964, -6774237, 1111323, -1932198, 1495186, -2863133, -3670587, -1452773, 3364033, 1066763, 410169, -3441880, 8726300, 5266704, 866510, -4231617, 3478924, 3378529, -7950522, 514859, -758599, -2090575, 1968706, 1340567, -1262184, --1467805, -411780, -2362769, 2367064, -878321, 4651987, -149250, -1167157, -2177012, -4037806, --718333, 3140695, -111669, 732829, 3699578, 1022202, 4275640, -66035, 670015, -419296, -4595615, 4076461, 4124779, 911607, 22012, 1843078, -64425, 583579, 113817, 227096, --314069, -1248762, -1048509, -214748, -1204738, 606127, 652298, -504659, 1368484, -507343, --360777, -253403, 579284, 175557, 1227824, 126165, 46708, 119722, 1584306, 787590, --88047, -394063, 102542, -194884, 410706, 1633161, 378494, 2076080, 7222525, -3497177, -2413772, -1988570, -3126736, -1280437, -2164664, 3947075, -3255048, -6040872, -1541893, 1596117, --5036386, -3040300, 5691369, 9834938, -1655710, 3762391, -3369939, -3543885, -156229, 1042066, --431644, -95563, 3649112, -6227166, 2034741, -453119, -1305670, -5247377, 457951, 129923, -2960843, 893890, -4111894, 5431523, -4316442, 5068599, -569083, 926639, 2057289, -586263, --2532957, 3966402, 971200, 5296769, 803696, -4651987, 8452496, 6731825, -2345589, -678605, --1631014, -5864778, -3180423, -956167, -1015223, 2385318, -3238405, 273267, 2313377, 24159, --93952, -360240, -561030, -3193308, 5106179, 181462, -117575, -1594507, -576599, -4671851, --4178466, 1400159, 3404299, -408559, -893890, 18790, -44560, -2379412, 4570919, 651761, -1505386, -1165010, 1239098, 812286, -201863, -54224, -213675, 93416, 1072668, -571231, -674310, 767725, -156229, -150861, 553514, 1260573, 1078574, -746251, 287763, 415001, --622233, -301721, 1701881, -201327, -103079, -1306744, -1259499, -2028835, -788127, -7576323, -9218074, -2070711, -1138166, 6571300, -2637647, 3364033, 14666240, -1817308, 389768, -5681705, --4595615, -7065221, 4016331, -2949569, 1937030, 3811247, -4466229, -3826279, -2815888, 262530, -1401233, -5506685, -2186675, 2328409, 1995549, -2217277, -936303, 3276523, -3487514, 481573, --1757179, -676457, -2442763, 1987496, -2245194, 851477, 1905355, -955630, 6138045, 205622, --887448, -4627828, 497142, 6560026, 865973, 2178085, -6101538, -8698383, -3189013, -7490960, --6615860, -227633, -2882460, -312996, -8015483, 6759742, -7424388, 1029182, 5007395, -4620311, --7755101, -5536750, -1666447, 5064304, 4495220, 6796249, -4079682, -3594888, -2882997, -2483028, -4909148, 1222455, -2095944, -1150514, 2312840, 2632278, 769873, 1185411, 1673964, -424665, --2895345, -513785, -1931662, 664646, 202937, 577136, 525060, 102005, 1154809, 112743, -1353989, 91805, -1092532, 1379221, -1689533, -1118839, 293132, -477278, 1388885, -911070, --691490, -327491, 151398, -602369, -1027571, 872952, -349503, 634045, -872952, -841277, --1026497, -1185411, -757525, -1081795, 8020852, 832687, -3226057, 453656, -2670396, -595927, -5613523, 9414031, -3219615, -3296924, -8543764, 1079111, 2145336, 4858682, -3221762, 5238787, -831076, 8069170, -6476811, 1034013, -12230993, -1351841, 1462973, -2995203, -2749853, -1086627, -4510253, -3699041, -6427956, 1817308, -9431748, -2064806, -4529043, 2072322, -1001264, 3182571, -423591, -7202124, -7764764, 202937, 4143033, 7681012, -1522029, -3140695, 6448357, -7115687, --3857418, 3416647, 3070365, 5078262, -4850629, 168041, 1978369, -3078418, -1022739, 2992519, --4399657, 5731634, -2487323, -1083406, -6118181, -5112085, 2476586, -28991, 131533, -883153, --3746822, 3542274, -2348273, 4408247, -57982, -5872831, -6123550, 2229088, -3069291, 1078574, --8722542, -8369281, -1309965, 7840463, 79457, -1640678, 416075, 1112933, 865436, -381178, -1282048, -4119411, 793495, 669478, 1272921, 1556389, 1782948, 900869, -2265595, 144418, -2059974, 911607, 581431, -1168768, -1366873, 301721, 34360, -496069, 1942399, -63888, --92342, -1346472, 2417530, 1931662, -73014, 144418, -1123671, 656593, 788127, 301721, -155693, 753230, -1006096, 4831302, -13042742, 3058554, -5651640, 4830765, 5515275, -6151467, --11433203, 1637456, -1505923, 7286949, -4337380, 10540387, -4403952, 6984154, -8581345, -3161096, -3617436, 5200132, 1471563, -9127, -5256503, -665720, -4131222, -5164162, 2900714, -4403415, -1755031, 1045288, 2157684, -2491081, 4913980, -890132, 4232154, -921807, -8041253, -1316408, --2558190, 843961, 8070781, 536871, -672162, -389231, -3242700, 2815351, -3055869, 4281546, -4619774, 1701344, 1789391, 8142185, -1988033, -1433982, -6468758, 4654134, 4097399, 891206, -1070521, 886911, 360240, 2408403, 4962835, 3337190, 1905892, 1836099, -1237488, 6481106, -2219961, -1292248, -4931160, 2552821, -1449015, 9448391, 5364414, 1227824, -4316979, -1579474, -7194070, -2745021, 963683, 4198868, -2288144, -2845953, -5668820, 765578, 2107755, -407485, -2765422, -2185602, -809064, -1693828, 2036351, -128849, -604517, -2686502, 685047, 745177, -1670205, 1979443, -622770, 365609, 2168422, -119185, 2200097, -105764, 688805, 3235721, -695248, 3324842, -213138, -670552, -169114, -240518, 147103, 278636, -2436320, 964220, -2019708, 253403, 837519, -549756, -16821240, -9130027, 3398393, -3272228, 6788196, 6773164, -10213432, 4235375, 4140349, 2531346, -12257837, -2731062, -1684164, 1115618, -1217086, 3833795, -2724083, -4702453, -3756486, 3166465, 5985574, 7552700, 6508486, 8577050, -4684736, -4669703, --6215892, 6616934, -3811784, 5469641, -1375463, -269509, -5822902, -3477850, -3329674, 4969814, -6111202, 1092532, 6108517, 8753680, -3471407, 2224256, 10257456, -5144297, 3329137, 3492882, -383863, 7726646, 9881646, 7529615, 17139604, 3198677, -2436857, -3160022, -2942590, -171799, -3012383, 5211943, -954020, -1665374, -1820529, -4580046, 1921998, 2496450, 4434017, -10687489, --1478006, 2720325, 7089381, 4964446, -9151502, -6757594, 1715303, 1723356, 7394860, -6509560, -398358, -645319, 769873, -9268003, -2527052, -3183108, -2269890, -3800509, -1620813, 306553, -3544422, 6979, 180926, 1403917, 1683627, -3530463, -582505, 279710, -8590, 1281511, --1248225, -2301566, -1597728, -1753420, 2496450, -2410551, -1197222, -2776696, 670552, -582505, -1762547, -2539936, 1040456, -848793, 1020055, 973884, 145492, 2232846, -2141041, 1109712, -1179505, 387621, 2540473, 4088809, 8159901, -1026497, 1688459, 6979859, 10236518, 5775658, --11240466, 63351, -11960947, -8476118, -5121749, -970126, -7307887, 8784282, 3267933, 5210332, --14884746, -1043677, 9783936, 4987531, -4347044, -6243272, -3799436, 3830574, -11379516, -639413, --7301982, 11253351, -1448478, -3256659, 1227824, -374736, -1893544, 2007897, -2935073, 5239860, -3740380, 7519414, -522912, 408022, 11600170, -3634616, 7776039, -1232656, -1326608, 20401632, -2462090, -2160369, -4567161, -15737834, 1697049, -16130287, -2682744, 17033304, -4764193, -3283503, --11783780, -3443490, 457951, -6331319, 3454764, -595390, -8625368, 9227200, 3332358, 3018825, -2572686, -6388764, 7071664, -10965588, 3218541, 4240744, 504659, -1434519, -4405026, -3473555, --4487167, -1432909, 3692598, 4715874, -1140851, -3821447, -2229625, 5254356, 2193655, 10038949, --129386, 775778, 4126390, -396211, -1797981, -1368484, -1217086, -1086090, -1603097, 1196685, --1836635, -53150, 2094333, 769336, 2135136, 2030983, 1668595, 199716, 3077881, 2206540, -1359894, 948114, 972273, -3141232, -2625836, 2312303, 385473, -1930051, 406411, -2197413, -701690, 2551211, 985695, -408559, 993211, 2190970, 551366, -1740536, 1008244, 6735046, --13292387, 5866389, -4629438, -6674379, -6358699, 5180805, 6593312, 3884261, 11364483, 8410083, -1774358, 3487514, -8742406, 1887638, 4071629, 8836895, 1784559, -4097936, 3286187, 4179540, --7827041, 1253057, -8031052, 6435472, 5870147, 7533373, -7137162, 4515621, 8056822, -3503620, -2146947, 10669236, -233539, -6445672, -5119601, 2456185, -1658931, -6551973, -2646237, 226023, -1641214, 3713536, -4494684, 7479149, 4574677, -1584843, 8994198, -996432, 3466039, 11775190, --12316356, 22997402, -10448582, 3251290, 6992207, -2284923, -1188632, 3003256, 15595026, -740882, --2058363, -357019, -3593814, 7639673, 8539469, -2600066, 3703336, 3110630, 2843268, 5280126, -6743099, 655519, 7284802, 1658394, -6094559, -9408126, 2361158, 1044751, 4451197, 1970853, -14440217, -1340567, 8103530, 6572911, -4361540, -8070244, -872415, 1035624, 2208687, -2112050, -3779571, 1846836, -3437585, -855772, -3278671, -1129040, 2181307, -972273, 3179350, -674847, -1194538, 901943, -1352378, 1748052, 1961726, -2747169, 2001455, 1385127, 682900, 784905, --15569, 661425, 3518652, 1177358, -1133871, 727997, 1028108, 1806571, 2199023, -543313, --2291902, -580894, -1992328, -1451699, 2622615, 7561290, 9972377, 6111202, -10686952, 20352240, --6459094, 3816079, -15010374, 5896453, -13277891, 10197863, 1024887, -2906082, -7526930, 9634149, -1263257, 6123013, 6355478, 3212636, -11181947, 5634997, -6779606, -1305670, 5003100, 5401995, -1246614, -2146410, -11198590, 1483374, 10268730, 1074816, 6640557, 7374459, -11688217, 6347425, --5951751, -5938329, 8591545, 9454297, 4939213, 5281736, 1472100, 5057324, -12039330, -5454609, --3853123, 253940, 12790413, 6051072, 5061619, -1042603, 5618354, -385473, 14092325, 5104032, -5340255, 2052994, -795643, -20969104, 7728257, 4824322, -1936493, -1589138, -15584289, 29528, --5958731, 3606162, 13566191, -2399813, -7766912, 15697569, -708670, 8807904, -5272073, -77309, --9867687, -1049046, 195421, -17236778, -5078799, -3092913, -7681549, -3713536, -1502702, 926639, -8578123, 478352, -190052, -1813550, -4402342, -874026, 810675, -1792612, 629750, 38655, -2318209, -4186519, -1554241, -717260, -3665755, 16106, -2364916, -1700270, -1176821, -3179887, --1501628, 3299072, -1132798, 418222, -916976, 3582540, -128849, 1502165, -2420214, -5773510, --1638530, -470299, 2447595, 766652, 3467649, -469225, -1030255, 2655901, -3527242, 4278861, --75162, 13392782, -11476153, 1711008, 4892505, 6077379, -19942606, 13291313, 3738232, -14168560, --9048959, 7782481, 17833242, -6235219, -3202435, -12263205, 25516938, 9931575, 1619203, 4277788, --13349295, -8632884, -530428, 1144072, 13250511, 2899103, 10222559, 11488501, -468688, 742493, -8010651, -2071785, -8480950, -8108362, -2040646, 11373073, -6097780, 14379014, -6626061, 21100638, -9399536, 17024176, -4574140, 2779381, 13666586, -10587631, 6385006, 6183679, 5811628, -6051609, -7289097, 1786706, 2341831, 6227703, 12993887, 10931766, -11041824, -2561948, 5721970, -10767483, --6834904, -2825015, -22069152, 5936719, -10899553, -6822556, 2149631, -2714956, 7579544, 14103062, -9041980, 5714454, -7588134, -1775969, -448287, -14926085, 2745021, 1289027, 18487686, 3994320, -4166118, -3987340, 14283987, -112743, -401043, 57445, -4638028, -2110440, 603443, -840203, --5029944, 474594, -1292785, 919123, -6002754, -6504728, -2139431, 5197984, -863825, 2026151, -1963874, 1607392, -431107, -1376537, -1803349, -3608846, -6029061, 2068027, 308164, -1476932, --7125351, 5239860, 3563212, 2024003, -600222, 437550, -2436857, 1778653, -1294396, -2351495, -818728, 3025805, 1821603, -1893007, -477815, -777926, 2218888, -15928960, -23499376, 12692702, --9574019, 10402411, 3399467, 5025649, 6163278, -15799574, -28711856, 2520072, 4148939, 16152298, --15950435, -17512192, 15091978, -6055367, 6866579, -3328063, 3597035, 2361695, 3984119, -7998303, -3853660, -1184337, -2486249, 9933722, 3733937, -1474248, -12939663, -1810329, -357556, -2430415, --602906, -7056095, -17161616, -7684234, 12628814, -5422396, 6238440, -9792525, 7237557, 3661997, --105227, -4962298, -21281562, 11718281, 11461657, 14638322, -10251550, -4422743, 20014010, 17593260, -8193724, 3726958, 11329050, 4082903, 10185515, -5520644, 8854075, -16923782, -1028645, 4621922, --4342212, 19968376, 827855, 10879689, -6489696, -10862509, 23222888, -479426, 9251360, -3158412, -382789, -27349278, -2237678, 5699959, -10458782, 12739947, 9799505, 2295660, -5513128, -20868172, --376883, -4331475, 5242545, 6194954, 1124208, -2644626, 4957466, 97174, 2474975, -1441498, --6201396, -2423435, -5653251, 9914395, 3165928, -339302, -122943, 1118302, 9368934, -1748052, --2131378, 1285269, -633508, -35433, 4260071, 2113661, 3842922, -2842195, -246961, -4459787, -942208, -103616, 4029216, 3739306, -4228932, 6822019, 7239704, -5749888, 555125, -11770358, --15421617, -4474282, -3608846, -26411364, -24774982, -6487548, 125091, 18656264, 15177341, 15021111, --5802501, -2408940, -3753802, 16037945, 6893960, -6722161, -1185411, -5350993, 11601244, 9006010, --6688338, -9368934, -8598525, -17568026, 7344931, 495532, 503585, 3841312, -2622078, 6670084, -24719148, -14061723, 7457137, 1480690, -9519258, -5448703, -11303817, 4294431, -5020280, -5675800, -12803298, 1578401, -4261682, 12927852, -1750199, -5697811, 4504347, 9434433, -5181878, 10138807, -18205292, 17558364, -11988327, -158914, 4393215, 9898289, -15183246, -3157338, -4186519, 18938122, -8076686, -2032593, -11503533, -12767864, -11349451, 17105780, 14168560, -27074936, -22586160, -17127256, --12058658, 4096862, -10874320, 6621229, 1817308, 2698313, -21776022, -6972880, 19712290, 15205795, --6585796, -13970455, 13622563, 7144141, -1622424, 239444, -1720671, -3301756, 7750806, -6924024, -1709934, 1203128, -271120, -4998268, -9131637, 1782948, 7454990, -713501, 837519, -3180423, -7082938, 7747048, 781684, -1007170, 2627983, -258772, 3148211, 3389266, 4891968, -6515466, --603980, 2414309, 25770, -4034048, 1116155, 8216810, 7655243, -2882997, 5874442, -8923868, -2274185, -2862596, -2449742, -3557844, -5556077, 21782464, 17156784, 10626823, 1605244, -14322105, --7465727, -2260764, 5814849, 9010305, -12679280, 3227668, 731755, -10842645, -5156645, 8631811, --6464463, 6847789, 2918967, 8063264, -10124849, -103616, -22543210, 3307125, -28498718, 11636677, -11508365, -11114838, 13000866, 15502684, 400506, 4363687, -18396956, 10746545, 1020055, -7684234, -9881646, -2420214, 81604, -251792, 1156957, 19087908, -2226404, -108448, 23449984, -316217, --10924249, -31144418, -25611426, 28308130, 17609366, 6912750, 7075422, -11961484, -24010478, -11843909, -3717831, -9279277, 18644454, -1088237, 2412161, 20110110, -4221953, -6360310, -4618701, -12809740, --21686364, -17245904, 48760228, -23808614, -10820633, 13923210, -24817394, -17904644, 17633526, 24753508, -8100845, -4611185, 29148870, 14029511, -23601920, -8251169, -13218836, -12903155, 26491358, 1829119, --17791366, -12327630, -13867913, 3783329, -2930778, 8007967, -286689, -4184909, -6552510, 498216, -7266548, -4059818, 3309272, -3958886, 3573413, 3231426, 10152766, -4095251, -1586990, 8684424, -606664, 4386236, 4482872, 6165426, 1080721, -3779034, -2158758, -1052267, -1570347, 3733400, --1292248, -4225174, 8157754, 8420283, -4813048, 2059974, -5466957, 1823751, 1899449, 5146445, --1443646, -645856, -2757906, 2590939, 6003828, -20007032, -14753750, -10281078, -18305150, -1606318, -17434882, -1212791, 3623879, 8606578, 5728413, -14725832, -7104413, -12161200, -6489159, 15705622, --4736275, -1660542, -2099702, 9541807, 9515500, 28307056, 4549981, 20849918, -1168231, 7067906, --11283416, -8485782, 7502234, -14370424, -15982647, 573378, 5097590, -8179765, 6628745, -9584756, -2986613, -25296820, 14194867, 7964480, 11618423, 1488743, -10258529, -21187610, -7527467, -1846836, -17552994, -13289166, -7847442, 4937065, 40082784, -11020349, 40746892, -24922622, 9904731, -9161165, -17905718, -7038378, 30925376, -29000692, 44269300, -4138201, 9139690, 19185082, -32753420, 29286308, --34988416, 23686744, -57039312, 30988726, -29301878, 26045756, -38240780, 33697240, 1174674, 21857088, -9482751, -17809618, 15566572, -12741557, 38717520, -17578228, 6405407, -23039278, 6287296, -1506997, -4275640, -8216273, 10771778, -10562398, 7640747, -3719442, 2484639, 3291556, 3449933, 4515621, --2601140, -6064494, -4918275, -5810554, -13393319, 7785702, 2014877, -9194451, -4265440, -2759517, -6001680, -10240813, 9788230, -7838852, 1969243, -4192962, 4771172, 1609539, -73014, 14848776, --13120051, 8042863, -12677133, 19139984, -3623342, 18697604, -7347079, 5847598, 8455180, 2835752, -2922725, -10201, 8956617, -13347685, 14645302, -10181757, 9639517, -17569100, -15916612, 18538690, -31975494, -26477936, 40533216, -2346663, 2684, -1552094, 7046431, -12053826, -8850317, -18061948, --4028679, 582505, 52613, -92342, 15943455, 2728378, 17478906, 17095044, -10858214, 6289980, -36441724, 11898670, 7820062, 5460514, -31575526, 1605244, -5101348, -3965866, -28954522, -6136435, -16675211, 4694936, 5561446, 8364986, 21123186, 5493263, -6483790, -2175401, -1791001, 7898982, --14330158, -8852464, 21814676, 13502303, 10174778, 16820702, 12470974, -7350300, -3643743, -25143812, --11002632, 10197863, 8096550, 18946712, -13636521, -6833830, -4759361, 13919452, 8200167, 12491912, -5207111, -9940702, -9161165, 31337156, -9552544, -30508764, 7089381, 22016002, 15154255, -434865, --2590939, 2688113, 5098126, 3080565, 28066000, -33782604, -28766080, 3310883, 11432666, -14565308, --7441568, 2412698, -11375221, 5369783, -5528697, -1487669, 3073049, -2240899, -7617662, 233002, -6447283, -4161287, 133681, -11229192, -1881196, -9889699, 7304129, -3189013, 6707665, -4070019, -4224637, 1651952, 5680094, 8674760, -8782134, -4057670, -2556043, 6817187, -4207458, -8101382, --14593762, -139586, -5767604, -2287607, 2341294, 1372779, 530428, 2783676, 4930086, -1051193, -14944876, 1721745, -1060320, -11585137, 2120103, -2229625, -506269, -12412992, -64105608, 17726940, --7802882, -4062502, 15737834, -10860899, 16887274, -2265595, -27775016, -5060009, 2710661, 9760313, -12417824, 2893734, -19680078, 19492710, -7634841, -1767916, -12090870, -5437429, 10459319, -2084670, -9331353, 15717433, -3627637, -20288352, 4512937, 22272090, -20723754, 7631083, 17297980, -3141769, --13703630, -25588342, -17255568, 18054432, 46277200, -14244259, -18444738, 52128556, -3394098, -7504382, -37528352, 21844204, 18653580, 15064598, 6195491, -11029476, 19072876, 17752710, 12245489, 5662915, --34482144, 21545704, 19084688, -36420248, -21047488, -13086765, -10184978, -10035191, 39758512, 19840602, --22707492, 21239688, -8395587, -21251498, 9271224, 10807748, -9371619, -9009768, -33319820, 3744675, -5710696, 24379844, 11698417, 3013993, 20405390, -16207059, 42193760, -44841068, -52284784, 36916316, --22556094, -1407676, 25914758, -16327855, -11215770, -3238942, -3067681, 3209951, 15905338, 7791071, --12995497, -810138, 6202470, -1569274, 8842801, -364535, 4894652, 937914, -6892886, 3689377, -14112189, 9692667, -603980, 1867774, 9439264, -1537061, -1112397, 2369211, 21845278, 11184095, --3499862, 4749697, -19359566, -874026, 5115843, -8946417, -12002823, 11300059, -5188321, -365072, -11649025, -10142565, 4480725, -1760937, -2895882, 14420353, -8177081, -17141752, -69851200, 21368000, -39265128, -24485072, -5171141, -19061064, 40400072, 27138288, 17003776, -3321620, -14254996, 2816425, -16225850, 7505992, -7140920, -1642825, 22230214, -1563905, -8324721, -30012694, -14283987, 25142738, -14571750, -16016470, 12650826, -11625403, -3757023, 7473243, 7000797, -7043747, 4482872, -26327612, -7402376, 35355632, -4613332, -7012071, -34953516, -21048024, 16792786, -27590334, -15044197, 6181532, -6878390, -8609262, 22723062, 21443698, -22309670, 8176544, 12256226, 35617628, 32615982, -5289789, -10592463, -988379, 37305548, 16147466, 15060303, 35340064, -15949898, -23286776, -11984569, -29778618, -24892020, 11673721, 12099997, 6369437, 42322072, -28226526, -6680822, 17996450, -10143102, 19984482, --1093069, 2222646, 9240085, -24669756, -37329172, 4553202, 7043210, 40787692, 31016644, 614180, --30314952, -4913980, -33100240, -333397, -1166084, -9406515, -8572755, 4329864, -2974265, -2632815, --8487929, -5589900, -7553774, -4585415, 1016834, -8990977, -8192113, -1503775, 8106214, 4041027, --10847477, 9579388, -5559299, 17918066, -5789616, -16251083, -6025302, 7833484, -5117454, -12374875, -13809394, -3180960, -12846784, -19867982, 2915209, -3351148, 2188823, 4161287, -7691750, -6660958, --17360258, -4023848, -4680441, 1010928, 3064996, 6142877, 5380521, -13336947, 16343424, 27683212, -24183350, 24907590, 32028644, -18237504, 25256018, -48977124, -21324512, 18702436, 4546223, 35976256, -16503412, 30696668, -13174275, 4161287, -26414048, 18129056, 29879014, 27166206, 2862059, 19284404, --47017544, -30601106, 29408178, 8628589, -29252486, -15081241, 3733937, 43348032, 13494250, -17501992, --22070226, 4499515, -6343130, 26694832, 28860032, -2746632, -4528506, 5793911, -8009577, 34492884, -10027138, -8075613, 7069516, -16291885, -9581535, -77009840, -26069378, 13822279, -11924977, -11460046, --243203, -13831405, -13793287, 35409320, 23775328, -17722646, 32356136, 66867272, 13865228, 47648904, -6707665, 9740449, 35032976, 23125714, -18670222, -21254182, -37401112, -23260470, -2337536, -36958732, -13852880, -4392141, -35721244, -25646324, -25522306, -32169306, -19433116, -12891881, -17013976, 5131412, -30718142, 37405408, 19821810, -3827890, -27103392, -3419868, 1203665, 2373506, -13127568, -2322504, --8817568, 7345468, 10667625, 1212255, 7854422, -202937, -5140002, 8971113, -9483288, 1256815, -8650601, 18329846, 2675765, -136365, 12502113, 5253819, 33258616, -8265128, -26756572, -1363652, -18346490, 3263102, -7152195, -8188355, -21713744, -20688320, -11546483, -8228621, -3626026, -12419435, --17765596, -19087908, -10272488, -1538672, 2831994, 25296820, 18508088, -6786049, 29644938, 52326660, -36423472, 25478820, 16143708, 9997073, -12641162, -8347269, -12603582, -11652246, -454730, 30668214, --3143379, 26079578, -16570521, 7086159, -57247084, 16365973, -8539469, 29709362, -7157563, -34163244, -34726420, -12790413, 5475547, 19851338, 14891188, 31813360, -4636954, 5012227, -5827734, 36245228, --7468412, 7046431, 25294136, -28723668, 24944634, -7030862, 15335181, 24223616, -6269042, 5610301, -4214437, 2704756, -7546795, 10929081, 10580115, -3991098, -13907641, -2357937, -16244640, -5133023, --2924873, 13711683, -6701223, -25924960, -17022566, 27828166, 28106266, -26103200, -21849036, 33274722, -39064340, -14756971, -3612604, 28225988, 1371705, 14643691, 20604568, -46760920, -13652627, -2940979, -45802068, 4430259, -2987150, -44548476, 9148280, 17850420, 11791833, 1844152, 12314745, 4883915, -6482180, 57365732, -1491427, 3244311, 33894808, -19903952, 22612466, 4423280, 17130478, 11237245, --25642028, -8309151, 31096100, 20644298, 12085501, -7077033, 11054709, 5614596, 272194, 4327717, -8137353, -3517578, 13724568, -8609262, -2080375, 14093935, 8494372, 3036542, -28768764, 2837363, -14666776, -10694469, 5427228, -25597468, -16052977, 18351322, 9134322, 15126875, 13331578, -10070625, --27949500, -7671886, 10033580, 24849608, 15327665, -3455838, -5076652, -8442832, 20642686, -178241, --3692598, -8076149, 11134166, 4722317, -4016331, -20374788, -12597676, 13196824, 13409425, 9430138, --13715978, -19694572, 10409390, 26356604, 12678207, 1924682, -12663711, -3056943, 6609418, -233002, -1020592, 1533303, -2685428, -6043019, 33007898, -55984360, -3893925, -47370804, -43910672, 10998874, -9220758, 8008504, 1068910, 41718628, 23753854, 53720376, 58784144, -6492917, -28964722, 6124624, --7894687, -5392869, 12703440, 5680094, -4759898, -27089970, -29659970, 32080722, 14780593, -3657702, -4864051, 5214091, 2891050, 5909875, -3093450, -7681549, -43845172, 964757, 25052544, -7360500, --33822868, -11060078, 27615566, -51386064, -17772038, 32517734, 19568408, 38833484, -1229971, 2857227, --35903780, -36107792, -45645300, 38366944, 54154704, -71448928, -35755604, -3696356, 36169532, -28311888, --4764730, 65614216, 26520886, 16689169, 43242268, 31769336, 47480864, -17139066, 47202764, -7144678, --37321656, -54567024, -12985834, 21007222, -43465068, -8395587, 9133785, -9052180, -15432354, 9322763, -8165270, -29679298, 21986474, 10950556, 32035624, -7660611, -31799400, 39497592, 7748121, -35803384, --19327, -8242042, 14741402, -15782394, -16545288, -8250632, -1906429, -394600, -12608950, -14848776, -11387569, -15493558, -380105, -15306190, 8240969, 14817100, 2057826, 22086332, 14801531, -21946210, --8492761, 165356, -20148766, 3490198, -3634616, 8065412, -5513128, 7134478, 18928994, 229244, -3428995, -13289703, 20374788, 13327820, -14900852, -4103305, 14443975, 14047764, -2336999, -21055004, --3056943, -41513008, 31920734, -2742337, 9736691, 12335146, 11941083, 359704, -14016089, 22631256, -5645735, 21843666, -4744865, -46437724, -4253628, 13365938, -15296526, -17021492, -10440529, -15691663, -18865644, -4890357, -16535624, -970126, 17548162, -23671712, 16520055, -8233989, 8772471, -23318988, --5839545, 9408126, -2033667, -2177549, 2841658, 13042742, -2347737, -2143189, -16304770, 8085813, --4497368, 2594160, 5005785, 1690607, 12036109, -17679696, -13516799, 18478560, 15923591, -22193706, -10550050, -17938468, 20645908, -17331804, 7772280, 5322002, -14687714, 32478006, 3133716, -36166308, -16637630, 4363150, -27986006, 15675557, -10289668, 16696685, -24266028, 12429098, -25702694, 11777874, -18249316, -16552267, 9466108, -17586280, 593242, 587337, 1659468, -11557757, 206158, 8794482, --511101, -15874736, 11957189, -9947681, -21378736, 9200357, -9501005, 4650913, 9930501, -7560216, --4584341, 1788317, -1418413, 6457484, -3404835, -2357937, 5746666, 7325604, 2445984, -7366406, --4413079, 7074885, 4219806, -16670379, 15205258, -2183454, -5710696, 2123861, -1209033, 3600256, -8149164, -2015413, 15447924, -4563940, -6740415, -7536057, -3041911, 1488743, -7327751, 1949915, --2499134, -2978023, 1851131, 2501819, -3056406, -69256, -874563, -3232500, 3147137, 2126546, --3587372, 9670119, 20732344, -9463960, -110973368, -200787040, -66302484, -155467616, -153792576, 83845280, -17956184, 116351736, 262075680, 236206560, 193795904, 236546928, 145019040, 32918776, 46062988, -32902134, --174462112, -172430592, -128863512, -167526272, -114657912, -23223426, -77175192, -106736376, -45950780, -12767864, --55155432, -25900264, -431107, -27255862, -49018460, 11100343, 43574052, -13881871, 60214904, 89604296, -2846490, 17825188, 120952720, 60271812, 1391033, 113373176, 92836792, -20972862, 44311176, 105891344, --1346472, 9254044, 149197504, 80427024, 33837364, 180249584, 198587472, 97966056, 188301568, 233979616, -61855584, 31953482, 95691872, -37376952, -112261320, -65275448, -146273168, -260020544, -259424080, -294641184, --392551424, -395449440, -379395936, -388260736, -347292128, -297739488, -238337936, -156064624, -79091824, 38930120, -172355424, 227028752, 276987808, 374867968, 329790144, 294760928, 329285472, 243121456, 113817704, 133605696, -150991728, 55975236, 73049880, 151125936, 74445208, 14232985, 65090768, 58520540, -32891396, 121333, -40793064, -59744604, -76190576, 17442936, -15067282, -24873766, 84329536, 72316512, 7628399, 65733936, -95432024, 16763257, -7106561, 5338108, -97590248, -176729312, -184493536, -235586480, -296375840, -281000928, --251261488, -229061888, -204137648, -150024288, -142177376, -155504656, -103988136, -34077880, 9470403, 38356204, -102005472, 122057064, 138254464, 247564064, 288730240, 266666464, 246146720, 195955200, 124162672, 106183936, -90483688, 55253144, 39558796, 36326832, 14534169, -3498788, -4943508, -10708964, -21847424, -27338004, --22399328, -31034896, -42196980, -40799504, -39538932, -44727252, -42505680, -32320166, -25908316, -19180250, --15596100, -14795625, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --8479339, -937377, 5580773, 1907502, 3636764, -5305359, -2907156, 239444, -940061, 1421097, 4420058, --10628970, -74625, 3493419, 2098629, 3220152, -3077344, -4296041, 4645544, -78920, 1294933, -2895345, 3843996, 1417339, 802085, 3456912, -510564, -1107565, -2987687, 1609002, -840740, --486942, -1551020, 1986422, 5056787, 20401, -1050656, 2378875, -3234647, -4840965, -2675228, --981937, -3139084, 281857, -725850, 2031520, -1958505, 563714, -3927748, -379031, -3229816, --155156, -1479079, -1276679, 1644436, -1864553, -189515, 2657511, -1397475, 3169686, 3842385, -278636, 5193689, -2656974, -177167, 2482491, -898185, 1675037, 2360622, 1275068, -2731599, -1074816, 1250372, 878321, 166430, -2284923, 3031173, -818191, 1448478, -499290, -627602, -190589, -3153580, -260919, -2450279, -1142998, -107374, -427886, -83752, -244813, -1316944, -1567126, 183610, 438624, 110059, 875100, -534187, 1105417, -81068, 470299, -180926, --482110, 623844, 60130, -184684, -13959, 880468, 188442, -153545, 542777, 285615, --113817, 14093398, -3992172, 1350230, -3084860, -259846, -1294933, 1615445, 1084479, 4826470, -1474784, 836982, 1861332, -1179505, -9757629, -9336185, -2927020, 1236951, 2842732, -2376191, -518617, -3041911, -1095217, 142271, 1639067, -4147865, -4518843, -1342714, -301721, 2419140, -784905, -1023276, -3266860, 562104, -1806034, 79457, 2261300, -3311420, 1569811, 2918967, --2304787, -6068789, -1596654, 2188823, -376347, 1774895, -311385, 1534377, -297427, 1687385, -315680, -5666136, 1096827, 2298344, -908922, 1553168, 250182, -341450, -1135482, 42413, --3344706, -311385, -929324, -4218732, -723702, -147103, 3718368, -3708168, 6126234, 7128035, -5606543, -2452426, -1155883, -1313186, 2710124, -1050120, -1556926, 1688996, -4060892, -3693135, -434329, 3245922, -117038, -1666984, -3633542, -2151242, -2773475, -1469953, -2560338, 936303, --1539746, -422517, -1614908, -854699, 73551, 834297, 57445, 858993, -602906, 51540, -677531, 348966, 531502, 539555, 310311, -684510, 679142, -13308493, -86436, -2052458, -918049, -459562, -6890202, -1318018, -1455457, 2153389, 3347390, -4612795, 3682935, -1174674, -2536715, 2549063, -1388885, 5540508, 334471, 245887, -965831, 962610, -1379758, 1022739, --1549946, 206695, -3624416, 389231, 3986804, 537, 1676648, 4204236, -4138201, -4355634, -1813550, -1977833, 3358128, -3401077, -1031866, -7111929, -5489505, -4752382, 2069101, 613643, -2522757, -2583423, -1846299, -536334, 4457639, -4937602, 2033130, 862215, 360777, 2505040, --1730335, -2261300, -2979097, 1816771, 958851, -4367445, -4822712, -5598490, -170725, -1201517, -1816771, -252866, -1065689, 526134, 745177, 2507187, -6701223, 830539, 3802657, 5657009, -5798206, 4800700, -854162, -3535832, 5195837, 1592359, 1001264, -2595771, 1494649, 1078574, -149250, -640487, -1548873, -223338, 1770600, -1371705, -2284923, -926102, -989453, 388158, --200790, -549219, 1541893, 129386, 1971390, -178241, 559956, 1332514, 1234803, 977642, -693100, -783295, -886911, -276489, 774168, -144955, 755914, -530428, 1330366, 1135482, --1180042, 80531, 81068, -1899449, 1431298, -7771207, 4826470, -4118337, 5751498, 7489349, -4669167, -79457, 2223719, 512712, 6133750, -3341485, -3356517, 1761474, -931471, 2516314, -4721243, -6738804, 2146947, 6058588, 2857764, -433255, -47245, 738198, -2811593, -40265, --2656437, -3704409, -965831, 5740761, -2150705, 2669322, -1986422, -3500398, 6871948, -5985037, -4614406, 5047661, 1000191, 3201361, -4434554, -1211181, -1755031, -1398012, 3204583, 971200, --4769561, 779537, -460098, 907312, -1028108, 1721208, 1651415, 5724655, -5986648, 2885681, -2278480, -602369, 2263448, 633508, 3522410, 3295851, 2089502, -1934346, 2806761, 4954782, --124554, 2903935, -2097018, 5873905, 6062883, 6654515, -1912871, -4661114, 1504849, -650151, -2374043, 1712618, -25770, -353798, -6667400, -1745367, -1546725, -528818, -1367410, -2002529, -2289755, 876173, 723165, 2682744, -159451, 2712809, 1714229, 877247, -380105, 465467, --594316, -1140851, 803696, 200790, 1315871, -398358, 316754, -90731, -886911, 1475858, --55835, -1272921, 518617, 1195075, 140123, -1656784, 412317, -768262, 2273112, 1661079, -1657321, -190589, 512712, 1293322, 133681, 663572, 10902238, -999117, -3404299, 10370735, --4095251, 4660577, -2492155, -9903121, 1768453, -2844342, 315143, 11884175, -4597763, -5615133, -457414, 6252936, -10044318, -3717294, 7537668, -2637647, 2435783, 3576634, -2688650, 3257196, --2101850, -3464965, 700080, -964220, -1222455, -1271310, 4198868, -3348464, 8177618, 2058363, -174483, -4670777, -1393717, 5021891, -5742372, 1243393, 1985349, -873489, -8006893, 5498095, -1452236, 1370632, 705448, -1078037, 4125853, -2426120, 5642514, 3242164, -2201708, -9726490, -4334159, 2645163, -249108, -2733210, 2348810, 6327024, 6387690, -668941, 3775276, -5718212, -4170413, -985158, -1993939, 2522757, 4937602, -3439195, 4887136, 913217, -2081449, -1692754, -3983582, -3307662, 9474161, -4843650, 3913789, -3241090, 839129, -2891587, 3781182, -3364033, -154619, 2203318, -673236, 455267, -2947421, -957778, -420370, 57982, 782221, -1231582, -1628330, -120796, -1167157, 1721745, -3383897, -3349538, -1959579, 103616, -354872, -632434, -74088, -2267743, 2810519, 231391, -212064, 2035815, -1656247, -279173, 2211908, 1013612, -756988, 3615289, 3241090, 10240813, 1357210, -2577517, -13080323, 4052302, 7431367, 4449586, -2910377, -1096290, 3785477, 14248554, -1723893, 6589554, 651761, 3690988, 1410360, 271120, -2863133, -1180579, -6076305, -1689533, -4515085, -1165547, -6371584, 2313377, 195421, 7483444, -1473174, -3463354, 2478733, -1047435, -1817308, 4801237, 1729261, 3591667, 2100239, -2055679, --8324721, 528818, 4859756, -317291, -1586454, 2189360, -4392141, -1859721, -7752416, -9605694, -5000416, 5564667, 4350802, -1345399, -1562831, 87510, -144418, 2854543, -470836, 3125126, -2806761, -76236, 2892661, -2655901, 795643, -1393180, 1726577, 2107218, 9061307, 43487, -7420093, -2757906, -7579544, -670015, -999654, -2870649, 6090801, -462246, 2536715, 587337, --4293894, -5176510, -1801202, -1074279, 619012, 5375689, 1797444, 600759, 2304250, 3615826, --1470489, 2736431, -273804, 2334852, 1491964, 617402, 3241627, -306016, 1915019, 1107565, -1014149, -541703, -794032, -1821066, -795643, 1919850, 2940442, -669478, 303869, -1579474, --182536, 161598, -1560684, 1200443, -2982855, 169651, -96637, 44023, 4712116, -11611981, --382252, 11824045, 16256451, -6757594, 1824287, 2578591, -5650030, -3298535, 636729, -4715337, --4912906, 11376831, 1588064, -7554311, -1207423, -4932770, -2811056, 7396471, -2332167, -3288871, -6713571, 4142496, 6782827, -2892124, 1392106, 6615860, 286689, -3987877, 1808718, -586263, -820339, -8399345, -5725192, 2496987, -604517, 1985886, -7733089, 3615826, 2816425, 1795296, --13626857, -7984344, -3462281, -1714229, 1924682, -5966784, -3995930, 1322313, 10423349, 6864969, -3682935, -1861868, -1160715, -3959423, 2998424, -1155883, -7738458, -5911486, -731755, -130460, -10915659, 6047314, -5436355, -6060199, 7539278, 1502702, -4581657, 38118, 6761889, 2566780, -177167, -8837432, 9701794, -3428458, 6458557, 8500814, 8923331, 789737, -3331821, -2688113, -4569845, 5269388, -4639639, 3705483, 4967667, 3532611, -1557999, -1184337, 674847, 3038153, -2451890, -2637647, -4126390, -3847217, 1865626, -1844152, -1253057, -2668249, -571768, -1911261, -947040, -1576253, 1136019, 937914, -354872, 8053, 2147484, -1593433, -3306051, -583042, -2949569, -1799591, -1663763, -1702418, -1270237, -207232, -115964, -2010045, -112743, -1461363, --768262, 563714, 1949378, -1309965, -114890, -420370, -948651, 1841467, 2233920, -3149285, -4818954, -6154688, 7031935, -644245, -1900523, 3739306, -7095286, 2423972, 3869229, 777389, -2704756, 3349538, -1916092, 7834021, -3682398, -13369159, -7949448, -1758789, 528818, -2832531, --5706401, -6247030, -4234301, 13132399, -3638911, -1036161, 1902134, -2729452, 1574642, 10773389, --5175973, 5113696, -3352222, -6925635, 6213207, 4482335, 2871186, 9655623, 226023, 4547834, --412317, 1153199, -367757, -3171297, 2138357, -733903, 7005092, 1399086, -4807679, -1238561, --1378685, -329102, -7843147, 3159485, -7732015, 1884954, 10433012, -6793028, -13013751, 3026878, -1818919, 5977521, -2627446, -117575, 6110665, -3757023, 3002182, 4499515, 1276679, -2728378, -6034429, 1304060, 7744900, 1647120, -4783520, -4541391, 5039071, 8453569, 2987687, -70867, --6929930, -1396401, -2216203, 5019743, 1287953, -9482751, 1514513, 2529736, 717260, 972810, -3711389, -1656247, 1579474, -2577517, 1648194, 1497870, 1214939, 1959042, 874563, 1301912, -1202591, -2177549, 742493, -650688, -318364, 2170569, 930934, 1219771, 2454037, -714575, --7588134, 763967, -479426, 590558, -660351, -437013, 2158758, 1431298, -1194001, -1406602, --10411538, 23913842, -5627481, 10725070, 976568, 4457103, 3213709, -97711, -13458817, 11387032, --16770237, 5379984, 3977140, 15047418, -7108171, 6760816, -10684268, 6915971, -3483755, -11501386, --5534066, 2662880, 2895882, 4151086, 2090039, 5986648, 3902515, 9094056, -2873870, -7516193, --6782827, 2588255, -126165, -3731790, 6065568, 2629594, -1299765, 3606162, 7517804, -735513, -1909650, -1168768, 3692061, 2163053, -9735617, -4252018, -12741020, -2960306, -2206540, -332323, -6040335, 5383205, 754841, -3543348, -122943, -1948305, -3067681, 1655173, 17801028, 1566589, --446140, 5636608, -484258, 6463926, -2848637, 42950, -4297115, 17872432, 4166118, -7406134, --8485782, -5674189, 642635, -419833, -11515344, 602369, 2302639, 749472, 12439836, -3279208, -1776506, -7785165, -2604361, -21095268, -3707094, 1062468, 739271, -8123394, 2050847, -3921305, -2574296, 1197222, -3897683, -499290, 2699387, 4250407, 7883413, 2069101, -2965138, -2748242, --6470905, -2510945, 527744, 1044214, -3753802, -1430761, 3394098, 1208496, -1031329, -904628, --2803003, -2569464, -1312649, 708670, -5406290, -3790309, 919123, 2112587, -56908, -1393180, -1242319, 4349728, 650688, 332860, -449898, -1931662, 49929, -6254010, 12577812, 1133335, -10479720, 6379637, 10278394, 3477850, -10297721, 10199474, -6571300, 17609366, -11297375, -3309809, --15646029, -3268470, -1612223, 7027104, -7249368, 10289131, 8314520, -4929549, 636192, 11756936, -16540456, -5210332, 469762, -2113124, 5221070, 117038, -1874753, 2428267, 4572530, -7822209, -5979132, 1161789, 6847252, 2626909, 1090385, -13386876, -2115272, 15602006, -1810329, 5240934, -11989938, 3473555, -874563, -4139812, -5446556, -3267396, 598611, -5093295, -3018288, 9049496, -8397198, 2641405, 13910862, 9228274, -2849711, -1363115, 1950452, 3230352, -4182761, -11031087, -14464376, 6359236, -2905009, 13202193, 13844290, 15380815, 6718403, 2327872, -5521181, 396211, --7747048, -6250788, -3929895, -15413027, 6242735, -1953136, 13200582, -3119757, -10282152, -1948841, -1040456, -1537598, -13733158, 2196876, 3725347, 6266358, 6691022, -4667556, 2185065, -3192771, --8915815, 1746978, 3515968, -705985, -2605435, -6783364, 7137699, 3984119, -6280316, -7201587, --3977140, 4090956, -689342, -2070174, 1959579, -3223910, 2029372, -856309, 1266479, 3061775, --4535486, -2175938, 2088428, -1021665, 120259, 9139154, 3046743, 558346, -586800, 2123861, --3020436, -1801202, -261993, 2939368, 13697188, 780073, 2478196, -2090575, 1103807, -1789391, --20830054, 2383170, -233539, -3766150, -1584306, -10248866, 11695733, 12003897, 13415867, -21851182, -7011534, 4489852, 511101, 21503290, 8801462, -10730439, -1285806, 21231098, 2471754, 3771518, -4299263, -6264747, 3511136, 4362613, 13158169, 6680285, -10131828, -16618302, 6240588, 3919695, --8407935, -1589138, 766652, -10220948, 1120987, 12446278, 5264020, 6971269, 10077604, 16381005, -1505386, 14427332, 2806761, -5744519, -881542, -8555575, -4521527, 3567507, 4839892, 3732864, -7207492, -10283225, -4696547, 18394808, -1415729, -3962644, -10339060, 8720394, 7851200, 2732136, -3245922, -149787, 5014375, -8008504, 13080323, -6628745, -7905961, -6396817, -4458176, 17811766, -4735202, 3705483, -19459960, -10666014, -16013786, 1154809, -1785096, -1583769, -15201500, -21009906, --693100, 9430674, -5279052, 2682207, -1477469, -1446330, 5172215, -7322919, -3237869, -3343632, -6260989, 1049046, -4796942, -82678, -872952, -127238, -2343979, -4412542, 970126, 7015292, --3549254, -2316061, -4636417, -2057826, -3291556, -1556389, 2934000, -1044214, 4716948, -1612223, --1200443, -2794950, -2216203, 7378217, -918586, -504659, -3654480, -568546, 4200478, 1188095, --5541045, 1206886, 237834, 1553704, 19372450, 22798760, -5905580, 6365142, -1720134, -6738267, -1270237, -15365246, -9509058, -730144, -3132105, 30593588, -13841606, 3867618, -19523848, -2917357, -11838540, -5051956, -10887742, -11429982, -4206384, 4633196, 6009733, -818728, -1020592, -12840342, -2970507, 8892193, 4475356, 5429913, 1593433, 1944547, -7505456, -2500208, 4962298, 1779727, --54224, 508954, -9044664, 3955128, -9516574, -1592359, -291521, 2699924, -10562398, -1139240, -5114233, 7494181, -12029667, -6343667, 21240760, -8235063, -16823924, 14045617, -13697188, -4361003, --6085432, -2508261, -10526965, -7327751, -2248416, -10616622, -15118822, 24245090, 13361643, 10773389, -7363722, -9498857, -3738232, -6426345, 6781217, -11497627, 8056822, -6163815, 3436511, 8084202, -5261335, 1592359, -15570867, 15152108, -18591840, -4924717, -18026514, -7358890, 11785390, -748935, -6664179, 13542569, 4274030, -1442572, 2598455, -4813585, 212064, -1510218, -5197448, 6082748, --2192044, -2907693, 6971269, 3664144, -1920924, 418759, 265214, 1057099, -3226594, 3000572, -903554, 1589138, -3850975, 2526515, -1821603, 6601902, -3046743, 4647692, -1490354, -2388002, -6997039, -4787278, -2121177, -4289599, 2779381, 6922951, 3153043, -2056753, 3233037, -2882997, -3303904, 4798016, -5348308, -12776454, -1011465, 32073742, -14435922, 13919452, -28753732, 7852811, --18295486, -3464965, 10129680, -951872, 6475200, 10616622, 8456254, -12565464, 9286793, 1883343, -6849399, -2734821, 9524627, 8838506, -2014877, 1822140, 5700496, 6455336, -9281424, -3206193, --13508746, -1704565, 11787538, 279173, -5700496, 1182190, 4315369, 790274, -4963372, -9625022, -2367601, -6521371, 6126234, -6163815, 22774600, -2184528, -12499429, -14062260, 3085934, -7741142, -7117835, -15767362, -12382391, -16018617, 3600256, -13537200, -3293166, -19408958, 13763223, 2788508, -9235790, 5690832, -20959440, 1546188, -1942936, -7879655, -11747272, -3253438, -10014790, -12598213, --6992744, 5746666, 8184060, 11955041, -7008850, 1613297, 5129265, -17613660, 7975755, -12091407, --1173600, 9824738, 4132832, 3924526, 1759863, 20255602, -11728482, -4356708, -4514011, 5252745, --17429514, 1293322, -1491427, -257161, 11179263, 6452115, 5486284, 1921998, -4312147, 591632, --2182380, 8093329, -3245922, -1158031, -4702989, 9184788, 3635690, -3368328, 2461553, -8340290, -5575405, 2772938, 4366908, 600222, -1734630, 5089536, 9376987, 3099356, -4693326, -6412923, --2660195, 2267206, -6498286, -1597191, -9834938, -7243999, -3929895, -148713, -5452998, 3766686, --4318053, 9404368, -7629473, -312996, -139050, -26712550, -7680476, 30117384, 26656714, 15009300, --12801150, 13238700, 19954954, -13094282, 17636746, -14099304, 16289737, 3894999, -1017907, 5415954, --279710, 8607651, -12746926, -3572339, -5713917, 6574521, -12083354, -10844792, 17154100, -1574106, --3495567, 1687385, -16448651, -293668, 26630408, 14561013, 3085934, -177167, 5724655, 25210384, -10790568, 460635, 4298726, -6877854, -2923799, -5908802, 10859825, -5519570, 7272990, 1440962, -12958453, -15203110, -262530, -837519, 451508, -4226248, 7255811, 11668352, -2674154, -3212099, -11746736, 1427003, 1503775, 26579406, 4220342, 448824, -12087649, 5449240, -8978629, 12359305, --14139032, -12479027, 1973538, -12290049, -13191992, -20120312, 5461588, -6651294, 10474888, -3329674, -5928666, -29427506, 6058588, -9886478, -17870822, 9432285, 12403866, 6579890, 3863860, 2352032, -5223217, 8003135, -3787088, -4461934, -5403069, -237297, -5930276, 3847217, 813359, -8412230, --5865852, 5013838, 2940979, 511101, 8750996, -2923799, -886911, -6817724, -1449015, 180389, -3638374, 2424509, -5817533, -3433290, -1595044, -6898791, -1311576, -6467684, 2677912, 1940788, -7871065, 5507222, -541166, -3025268, 10737, 208843, -2229088, -326954, -8196408, -1299765, -3370476, 3808026, 1047972, -1218160, 7915088, 1486059, 22325776, -34360812, 14414447, 15025943, --24427626, -2493229, -20931524, -6908455, -18792092, -8500277, 21489868, -7360500, -1577327, -15117211, --2937221, 3468186, -22408992, -876710, 14305462, -27666568, 1008780, -18891950, -10204842, 374736, -2028835, -12513387, -10057740, -10486163, -3031710, -9016210, -591095, 4795868, -2731062, 7013145, --13507135, -8608725, 18015240, -8439611, 9749576, -10733123, 10143639, 9291088, 1571958, 2476049, -9446244, 443992, 13466870, 17059074, -3233037, 2523293, 25334402, 1502702, 13009993, -918586, --10107132, -19989852, 3338800, 13879187, -22072910, 288837, -12987981, -6815040, -28618440, 12357158, -18850074, -4933844, 9071508, -4632122, 20500416, 22713398, -1848983, -22491134, -21877490, 31169114, --24300388, 9093520, 3573950, 3239479, 23294292, -9928891, 37965900, -632971, -8644159, -9900436, --6882685, 6078453, -2411087, -2896419, -260919, 9816685, -2468533, -6167573, 8194798, -2960306, -4117800, -7550016, -4589710, 7189239, 522375, 10741713, -3574487, 4576825, -7932268, -2249489, --10843719, 2245194, 4372814, 5371931, 1007707, 5519033, 492311, -1677185, 5824513, -9146670, -6026376, -7756174, -2806761, 4727149, -9578851, -2398202, -5512591, -16001438, -4328254, 1065689, -5749888, -7808251, -4114579, -6864432, -2280091, 1694365, 6299107, 37312528, 42050952, -2485712, --31717260, 31323734, -34675420, 4884452, 14702747, 3642132, -3712999, -16000901, 18013630, -8068096, --6457484, -16294569, -9477919, -5083094, -20337744, -11193222, -9090835, -5090073, -3343095, 14119168, --207769, 12203076, 89657, -5280663, -17814450, -19519552, -4929549, -716723, -263067, -2967823, --7297150, -8435853, 9336722, 22472880, -12214350, 7737384, -7626788, -7864622, 8929237, -8712341, --14105746, 31550830, -3485903, 2896419, 1547799, -17637284, -3878356, -3703873, 8937827, -22783728, --10088878, 24089398, 3874061, -10249939, 13094282, 24482388, -13930190, -17253958, 8959839, -14627585, -236760, -27371290, 8833674, 23261006, -2381559, 12128451, 7086159, 4061429, 26692148, 8369281, --118112, 15381888, -2233383, -2143726, 9421011, 10084046, -38708928, 3528316, -16833588, 13677860, --629213, 514859, 9630927, -2925410, -3694746, -5104569, 5189394, 1964411, -3782256, 5158256, --5534602, 549219, -2935073, -7483981, 3441880, -3753802, 8373576, 4589173, -127775, 25770, -2308545, -2232846, 4964446, 2416456, 1562294, 2011118, -1388348, 1821066, -3331821, -6501507, --3545496, -1697586, 909996, -8453569, 6887517, 4603668, 360240, 2496450, -5651103, 7899519, -983548, -4712653, 2892661, 3402151, -10095321, -2105608, 1034013, -824097, 164283, 1833951, -1286343, -51167020, -35837208, 14963666, -15180025, -14304389, -43524124, -12553653, 9295920, 3608846, --8563091, -24197308, -299037, 12287365, -884763, 1682554, 12729209, 22596896, -19572702, 51424716, --13217762, -17052630, -5182415, -2871186, 246961, -20328080, 478889, -3563749, 10873783, -6852621, -15384036, -6345814, -13066364, 5382131, 6350646, -11662984, 12764106, -39139500, 324270, -3115462, -15641734, 18913426, -13676786, 17638894, -6753299, 5057324, -8413841, -2807835, -5170604, 14117021, --1877438, 18581102, 29010356, -25224342, -7048578, 13628468, -17000018, 10309532, -19313394, -10647224, --9612674, -11304354, -19717122, -10103911, 9193377, 7514582, 15129022, 19638202, 14263586, -23775866, -2971581, 4405563, 5657546, 4808753, 15197205, -7438347, -16086263, 9207336, -4192962, -12568685, -2443837, -21533892, -8922795, -18758806, 1702418, 11055783, -6848862, 10625749, 5686000, -642635, --4093641, -317828, -16738561, -6277095, 5515275, 2779918, 3625489, 1151588, 1848983, 1487669, -5165772, 1401233, -11257646, -1582696, 1655710, -1144609, 2864206, -5158256, -4743255, -10989748, -2778844, 9690520, -11067594, -7770133, 5616744, -2814277, -11296301, 7384660, -5532992, -4531728, -6666863, -536871, -2168422, -3473018, -5060009, -6700149, -7123740, -1864016, -6076305, -3629247, --3169686, 4789426, -417686, 7146289, -10640781, -34854732, 26303454, -44617196, 31354336, -4498978, --19958714, -17031156, -19010062, -12875238, -10023917, 953483, 22985054, -1867237, -19275814, 20467130, -29008746, -44532368, -11896523, 3098819, -3690451, -6953552, -2237141, -6185827, -7921531, -12952011, -16510928, -5801964, -12371116, -21195664, -21068426, 20738786, 5392332, -3808026, -2306934, 8053, --4658429, -5661304, 4558034, -18649284, 10139881, 21198348, 15819438, 9865003, 20236276, 23552526, --13566191, 5007932, -19520090, 21068962, -12089796, -3485366, -145492, -30772904, 9953050, 25303800, -4279935, -10429254, -8496519, 33086280, -13367012, -14317810, 9251896, -33792264, -3987877, -16774532, -682900, -33043330, 13756780, 5714454, 13480829, -53601728, -45995880, 7486128, -16103980, -10798085, --6702297, -35908612, 11828877, -21240760, -23189602, 17428978, -15624017, -9220221, 7394323, -3787088, --7060926, -1319629, -1997697, 7485055, -17749490, -8377871, -17128330, 13422, -7558606, 3406983, --2505040, -13517336, -5593121, 4734665, -938987, 955093, 3543885, -14799384, 1822677, -18745922, -8562017, 2822867, -13659607, 4312684, -16235513, -3502546, -5988258, 1199907, 8498130, -6395743, -8795019, -4743255, 15023796, -6919729, 9412421, -5304285, -1753957, -493384, -1913945, 3059091, --1639604, -11811, -1317481, -3433290, -51003, 5417028, -1598802, -2336999, -1972464, 1732482, --2006824, -2037425, -1535451, -967978, 375810, -964757, -751619, -862752, -1945620, -807454, -933082, -42413, 3280281, 39715024, -54683524, 56120728, 16663399, -1654099, 4861366, -40119288, -8587787, 19184546, -6839199, 47834124, -13303661, 20818780, -16494822, 52669184, -1612223, -6844031, --19772418, -7119445, 7944079, -5071820, 21562884, 16727287, -5280126, 1628866, -20329154, 8076686, -21366388, 21538188, -22936736, 9931038, -4294431, 22979686, -5872294, 15006079, -13456669, -10604274, --30691836, 2272575, -19334870, -28843390, 41489920, -18101140, -3326989, -7693360, -9575630, 5721434, -3720516, 14705968, -6568079, 22509924, 2418067, 40734008, 15912317, 45071388, 38515120, -3691525, -25861072, 19622632, -6400575, 23061290, 31538482, -13302587, -30837328, 17842368, 11838004, 25603374, -13432510, -2429878, 24159, -33253784, -2823941, -9753871, -11756936, 44394392, -4734665, -440234, -55413132, 36870148, 20185810, 24641838, 13016435, 1612223, 6663642, 31982474, 763430, -8349417, -9858024, 26874148, 13016435, 15327128, 7960185, 18598282, -594853, 5364951, 7328825, 13024488, -4853313, 3314641, 2747169, 1483374, 10950019, 15821586, 7155953, 20906828, 1950452, 12904229, -13246753, 23567560, 92342, 16132971, 14777909, 3060164, 12545063, 672162, 3165391, -3989488, -5475547, 6553047, 3746285, 3393561, 1370632, -2818036, 1196148, 5516886, -2384244, 2996277, -11260867, -2362232, 17067664, -38375532, 73679088, -9994926, -8200167, -4698158, 53602804, -32916092, -26883810, -36037996, 34144992, 6917045, -6666863, 879931, 19994684, -8586713, 18639622, -8656507, --177704, 37667400, 11534672, -9630390, -164819, 9415105, 7364259, -36509908, 9710921, -13285944, --3358128, -19226958, 18564996, 17721572, 2698850, 8419210, 31372588, -10398653, -50119048, 12005507, -32687386, -12658879, -32999308, 8791261, 23365158, 7998303, -99858, -39355860, -19039590, -23272280, -21762062, 8961986, 22413286, -47374028, 2867965, -8662412, -52623548, -13493177, 7519951, 23863376, -32824288, -17457968, 61477624, 12139725, 838592, -12582644, -25145422, -17078938, 11374147, -28434830, -57898308, -18456548, 2108829, 34593276, -22965728, 21188684, -22450868, -12490302, 47940424, -24234352, -31312996, 29386704, 10256382, 13510357, -42163692, -4777078, -2570538, -14386530, 19293530, 18006114, -6803228, 5667210, 18742700, -4291746, 7047505, -2029909, 5281736, -7948911, 6338835, -1124208, -5269925, 4757750, 783295, -13935558, -2941516, 2284386, -5636608, -1347009, 9628780, 5987722, -16208133, -7249368, 2957085, -27074400, -23654532, -2947958, -2015413, 16746077, 11667279, -7383049, --6383395, -21480742, -718333, 7984344, -4198331, 413391, 4560719, -6441377, 4235375, -15681999, -214748, -4942434, -7036767, 11146514, -43320652, 24714852, 15812459, 24719684, -9877351, -7035694, -10007811, 59593, 2843805, 912681, 4881767, 1155346, -6820945, 31977642, -7473780, -22071836, -9319005, -594853, -19432580, 6747394, 4478577, 13187697, -8972187, -14712947, 15789910, -12723304, --1750199, -3801583, 12956306, -22390202, 7619809, -13896904, 11320997, -19726248, 6985228, -6626598, -3370476, 43184284, -29735132, 5614059, 9480603, -26796300, 9688909, 12326019, -19873350, -4152160, --7632157, 35913444, 2992519, -41576356, 24846922, -33611876, 6072547, 17374216, -16162499, 19876034, --24112484, -19866372, 27282170, -4663261, 11569568, -40963252, 7625178, 8835285, -2219961, -6332393, --388695, 16602196, 577673, -54469312, 32937030, -3445638, 12617540, -14319958, -16703665, 51912732, --1438277, -33228014, 2820720, 16754667, 3774203, -50507204, 1737314, 46821048, -8635569, -21681532, -5067525, 22641994, -3090229, 61740, -4053912, -2356863, 3173444, -8210904, -4859219, 15370077, --6752763, -435402, -9125195, 9010305, 13653701, -2476586, -2140504, 14525043, 4683125, -10004053, --2458332, 6251862, 4112431, -8499740, 4467840, 9991168, -8431021, 2136209, 2420751, 6434935, --15626165, 977642, 9657771, 3666828, -10916733, 600222, 7575249, 1255204, -8127152, -5432060, -20485920, -7113540, -107075680, -227823856, -90900832, -171527568, -208907216, 73983496, -857383, 75884016, -288629856, 252064112, 143390704, 276215776, 154007856, 17377438, 95428808, 58706836, -104518568, -73883104, --21790516, -115852984, -140099680, -46664284, -70968968, -110911088, -27918898, -5094368, -141215296, -97320736, --14810121, -85860152, -111140872, -32447942, -54588496, -120822264, -23268522, 12206297, -67799816, -51719996, -50965692, -18460844, -72706280, 15149960, 47976396, -35919348, 29376502, 105641160, -15632607, -28304908, -104542192, 55764780, -26240640, 173695456, 236126032, 146938880, 248988384, 372514848, 286524800, 272667072, -398497792, 345453344, 254232000, 311948832, 283574688, 180363936, 159536016, 85826328, -29753386, -124581968, --222852432, -316567552, -376702976, -472311104, -504623776, -532122816, -602827648, -602401344, -455308416, -465896032, --424299808, -191122816, -147904720, -143854560, 63703492, 121643136, 2567317, 126785824, 175977696, 60209536, -83857088, 165034656, 123339112, 71798968, 116486496, 144235744, 61284888, 89785216, 179014240, 106449688, -70076152, 164971312, 123714384, 49942416, 107213656, 122490856, 15721191, 63251448, 147455360, 84536768, -101431024, 207883392, 195565424, 206089712, 266861344, 268735552, 215572992, 203900896, 174033680, 106267152, -76625440, 40767828, -6388764, -41973104, -113781200, -155447744, -210108720, -279958848, -311737856, -352222752, --410007232, -390456000, -350705024, -309728896, -226481680, -148488832, -78776144, -29069950, 12165495, 25860534, -31632972, 40833328, 43250320, 36562520, 39009040, 43104828, 41725072, 46758772, 60379188, 67723584, -72143104, 80195096, 81867984, 80804440, 77153720, 57716844, 36150740, 23155780, 19529216, 19545322, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --7162395, -207232, 5693516, 3911105, 3934727, 2473901, 1562294, -2245194, 85362, -2554969, 6091338, -3726958, 1462436, 880468, 879395, -77309, -1927367, 2989834, 4190814, 4025995, 2467459, --3070365, -4425427, -4846871, -4598836, -487479, 2400887, -4738960, 3950833, -957241, 6906308, --1156420, 4387846, 52613, -5728413, 1633698, -737661, 4628364, 319975, -547071, -2337536, --3929358, 353261, 2209224, -5029944, -6883222, 4803921, -3989488, -3671123, -3470871, 2707440, --2739116, 1151588, -1227824, -339302, -4056060, -1223529, -2761127, -4027606, 1321239, 3125126, --1165547, -4430796, -869194, -904628, -2227478, -3830574, -299574, -3115999, -3672734, -664109, -250182, 862752, -1246614, 538482, -682900, -5179194, -1145683, 637266, -1433445, -1329829, --1626719, 1655710, -1985886, 1705102, -143345, 294205, 653372, -1268089, 1243930, 10201, --694174, 307627, -341450, -1076963, 174483, 805306, -555125, -471373, -52076, 1301912, -587337, 182536, 200253, 701690, 475131, 815507, 230854, 1049583, -876173, -386547, --396748, 13487808, -4713727, -3085934, -4202089, -2887292, 314606, -9025874, 1523640, -4478041, --8836358, -1888175, 7573638, -5447093, 1476932, -643171, 2541010, 3825742, 4093104, 6615324, --1416802, -3790846, 1687385, 1597728, -3038689, -439160, -2053531, -1336272, 813359, -3473018, --2171106, -505196, -4372277, -5131949, 2622078, 3967476, -2353105, -5897527, -1034013, -1382980, -834834, 4764730, 315143, -1974074, -317291, 6379100, 795106, -3903589, -3764002, 1651415, -1207960, 5091684, 2891050, -333934, -4861366, 272194, -286152, 4179003, -4474282, -1502702, -2457795, 4857071, -1369558, 431644, -3679176, -2065879, 2254858, 140123, 475131, 1319092, --1430761, 1768990, 523986, 2164127, 1330903, 836982, 8444443, 2587181, -346282, -1138166, --2489471, 3621731, 2246805, 3914326, 2787434, 982474, 1037772, -817118, 775242, -1581085, --1688996, -1296006, 443455, -597537, -413391, -255551, 1362578, 226023, 1780801, 168577, --564251, -222265, -170725, -245887, 580357, 418759, 719944, -9894531, -2320356, -4665945, -4539781, 1154273, 117038, 3230889, -1905892, -7646653, -4027069, 5094368, -268435, 5247913, --380105, -2957085, 5817533, 2190970, 12741020, -2386928, 5537824, 816044, -5986648, 1520418, --5083094, 3309272, 1180042, 1308354, -5432597, 2734821, -936840, -1913408, 2246268, 8677445, -3234647, -38655, -6942278, 6041945, -1258425, 38118, 4279935, -6315213, -1170379, 4374961, --2574833, -2246268, -7128572, -7787313, -580894, 4735202, 2793876, -3117073, -74088, 3088618, -3867618, 1546725, -779537, -1490891, -6830072, 3229816, 8524973, 3882651, -2443300, -1189706, -2706366, 4072703, -308164, -1257352, 1024887, -5621039, -1032403, -3936338, -1833414, -354872, --2413235, 6497749, 5666136, -1679332, 2848100, 2109903, -1072668, -3823595, 912144, -2957622, --1114544, 884763, -3817152, -807991, 390305, -1102733, 1095754, 1645509, -2439542, -870268, --155156, 172872, -1912871, 513785, -882079, 1452236, -1695975, 1604170, -1158031, 390842, -267362, -825171, 649614, 290984, -614717, 565862, 632434, 652298, -1257889, -588947, -31139, -1785096, 239444, 1063541, -350577, -7442105, 8316131, -7164543, 7594576, -69793, --6052683, -14278082, -5621576, -4096862, 2142115, 7487739, 5862631, -1800128, -1143535, -1737851, --4092030, -1176821, -4598836, 1582159, 1699733, 2840584, 4713190, 2795487, 9011915, 32749, -1825898, -3167002, -734439, -2142652, 3317325, 1007170, -4180077, -6052683, 258772, -4343286, -555661, 4125853, -6845641, 4840428, -11525008, -3164854, -8545374, 1477469, -513785, 160524, --3340411, -4506495, 1614371, 4107599, 2946348, 1101122, -6861211, 2119566, -4733054, -1786706, --1345935, -9349070, -3639985, 2832531, 3645890, -295816, -6433861, 1139777, 2474975, -1219771, --1258425, 804770, 5647882, 2049773, -1234266, -1772211, 1020055, -13327284, 992137, 3420405, -3210488, 9447854, 1335198, -5244692, 5946919, -2035815, 922881, 2114735, 1992865, -1327145, --4367445, 284005, 2617783, 2503966, 4034585, -1219234, -1279363, 734976, -731755, -470836, -668404, -1104880, 406948, 952409, -519691, -2115808, -1619740, -49929, 281857, 598074, --1001801, 2069637, -1034550, -555125, 1341640, 1565516, -420370, -2348273, -1226750, 980863, --1184337, -617402, -709743, 543313, 1879585, -313533, 9509594, -2461016, 99321, 6261526, --3285650, -3071975, 9380745, -7211250, -17013440, -11178189, -6600291, 10164040, 4304094, 1377074, --9869835, 10371809, -4525822, 2882460, -2731062, 4052302, 4973572, -447750, 91268, -128312, --1728724, -5417028, -4377646, -1357747, 528818, 4689568, 2640868, 7345468, 3487514, -3257196, --1756642, 6534256, -4768488, 8025684, -6487011, 1698123, 3502009, 2250026, -5268315, 7070590, --731218, 7599945, 10024991, 1506997, -4059281, -3934190, 4214974, -4875325, -10264972, -2671470, -2107755, -6597070, 3704946, 3003793, -2219424, -4114579, -1781875, -1593970, 1927367, -821413, --5799280, -2224256, 9901510, 7962870, 4261145, -11876658, -11678016, -6387153, 11121818, 5630702, --920197, 1529008, -5551782, 7029251, -361851, -5512591, -1951526, 705985, -586800, -2775086, --446677, -2202781, -1198296, 2065879, 3034931, -1826435, -76236, 252866, 473520, 420370, --3103651, 3495567, -288300, -3516505, -2111513, -506269, -1131187, 39728, -297963, -457951, --408022, 814970, 132070, -1631551, -146029, 600759, -433792, -2523293, -1743220, -2355790, --857920, 1651415, 4787278, 7050189, -394600, 2717641, -11097122, -3745748, 1811939, 3795141, --13762686, -1524177, 5918465, -4145717, -8956617, 5577015, -10417443, -7639136, -4134443, 909996, --3787088, -2570538, -346282, 7737921, -6583111, 1716376, -2093797, -2734284, -5543729, -1529545, --8089034, -2408403, -250719, 1540820, -5660230, -1194001, -3576097, 511638, -1831804, -2507187, -1469416, 6366216, 1604170, -3319473, 3150359, -4862977, -1222992, 1862405, -1866163, 3171833, --1051730, -359167, -22427246, 1487132, -7784628, 3792993, 3224984, 4950487, -12351789, -12584254, -1681480, 439160, 2922188, 82141, 6689412, -2720325, 3628174, 4514548, -2168959, 10530186, --3312494, -6857452, -1479079, -5676336, -214748, -11230266, 148176, 5554467, 2585034, 8381629, --2340757, -2295123, 3684008, -4433480, 1031866, 2727304, 5393405, -2900177, 3086471, -4400194, -853088, 172872, 564788, -2170032, -1050656, -1618129, 1708860, -2012729, -3215320, -67646, --1527398, -2000381, -736050, -1567663, -701153, -986769, 896574, -1568200, 889595, -3164317, --355945, -1894618, -821949, 252329, 193810, -449898, -1531156, 137976, 8677981, -17501992, -4685810, 746251, 4857608, 7044820, 1275605, -6789270, -14910516, 1061931, -6029061, 11323144, --4612795, 2335925, 821413, 2418604, 8541616, -3774203, -263604, -3964255, -2234994, 2231236, --2157147, 8015483, 5969468, 1712081, -1701881, 110059, 5365488, -552977, 2589865, -124017, --4424353, 3910031, -1137630, -3313567, 4738960, 8027831, 22012, 3138547, 562104, -5327907, --3322694, 9747965, -4708895, 4662187, 7100655, -9422085, 6720550, 3593277, 3411815, -4183835, -6891812, 1983738, -1191317, 8813810, 325881, -110059, -4131222, -2355790, -4295, -3861176, --9429601, -2486249, 9630927, 7258495, 7923678, -890669, -8356396, 3461744, 10103374, -1893007, --7154879, -373125, -5055177, -1305133, -839129, 7859790, -753767, 4031364, -1035087, 357556, --5545877, 1457605, -954557, 2166274, 2155000, -3829500, 2594697, -6055904, 595390, 2167885, -158914, -1570347, -104153, 1189706, -4190278, -783832, -3943317, 1217086, -2493229, -1580011, --2415919, -4056060, -2668249, -1047972, 585189, -1250372, -98784, 1269163, 428423, -1069984, --751619, -1224066, 2319819, 66572, 838056, 1492501, 934155, 1046361, -542240, 1969243, --300648, 34897, 824634, -788663, -1089311, 507880, 2088965, -8311299, -2452963, -13399224, --3919158, -7773354, -9165460, -8690866, -3080029, 11686069, 12716861, 17521856, 3916473, -6689949, --4117800, 14502494, -57445, -3387119, 11110007, -1168768, 481573, -17368848, 7849053, 4362076, --11590506, 16049756, -2240899, 7206419, -1953673, 3764002, 7132867, 8053, 12613245, 4830228, -3576097, -1469416, -4479651, 1202591, 7639673, -2059437, 2265595, 3572339, 10119480, -482647, --3069828, 6518150, -7672959, -4826470, 3461744, 11166378, -4960151, -5999533, -1896765, 9200357, -77846, 1293322, -3446711, -1582159, 3297998, 4848481, 423591, -3981972, -12743705, 1502165, -3746285, 12117713, 3517578, -986769, 9307194, 16634408, -3434363, 5822365, 3921842, 6886980, --1348083, -5860483, 3423626, -13806709, -3758633, -2100776, -4482335, -2798708, 7177964, 2471217, --8939438, -5280126, 248571, -2925947, -325881, -6844568, -214748, -2350958, -1728724, -948651, -680215, -1912871, -482110, -937377, 1457605, -544924, 1336809, -1876901, -62277, 280784, -615791, 2765422, 77309, -1072131, 2582886, 3776887, -309238, -2329483, -1472100, -3278134, --2866354, 3921842, -673773, 1053341, 1433982, 1385127, 1294396, -3019362, 1466195, -1100585, --15169824, 21242908, -10710038, 4822712, -786516, -7327214, 16192027, 3812857, 2009508, -17114908, -4442070, -6826314, -7789997, 1901597, -7603703, 8658654, 5240397, -1455457, 1735704, -4193499, --1894081, -6219650, -3999152, -7470022, -11535208, -2842195, -8071318, -2166811, 4391604, -3262028, --4344897, 9134859, 5740761, 9168145, -7516730, -847719, -1510218, -8257612, 81604, -4390531, --20556788, 1800128, 371515, -3178813, 7132867, -744640, 7868917, 6666863, 2460480, 12368432, -11004243, -10865730, -2978560, 91268, -401579, 3868155, 1479616, 10516227, -2245731, 16796544, --22549, -9904731, -8038568, 1286343, 3031173, 3436511, 12208981, 3207804, 3056406, 11477226, -15282567, 625992, -9376450, -8879845, -840740, -2979097, -2166274, 19745038, 1415729, -8967892, -6415071, -7851737, 7506529, 1239635, -1558536, -2347737, -6032282, 1679332, 1996623, -893890, -1765232, 3330747, 1853815, 2269890, -886911, -839129, 217970, -1103807, -930934, 2238215, -884226, 1588064, 1996623, 3539590, 200253, -1662152, 3294240, 1873680, 635655, 753230, --682900, 500364, -125628, 3525631, 5501316, -2970507, 2624762, -651224, 2287607, 297427, -487479, 4692789, -244813, 454730, 402653, 3855270, 2558727, 2820720, 12743168, 976568, -8587787, -9400610, 4203163, 752156, -699543, 5671505, 13474386, -3719442, -1226750, 12406013, --16411607, -9148280, -7169374, -18799072, 3689377, -5964099, -2652679, 2253784, -12833362, 14053670, -10596758, 14928233, 6693707, -9300215, 871878, 592169, 11164767, -2070174, -369367, -439697, --6947647, 552440, -4090956, 6241661, -7371775, -2788508, -2495376, -3186866, -8633421, 4050691, --12656195, -1934346, -906238, 7937637, 4685810, 1054415, 119722, -2218351, 907849, 117575, -6574521, 1523103, 1894081, -1056562, -19809462, -9205726, 2277407, 8201240, 9817221, -15507516, -10357851, 3077881, -6124087, 1490891, 3339337, -3675955, 15003395, 139586, 2863670, -3542811, --20944408, -7179038, -9547175, -2481954, 369367, -5806796, 2996814, 4456566, -4312147, -897648, -13444858, 380105, 6844031, -8253317, 1030255, -134218, 7733089, 6842420, 4918275, -1863479, -1589138, 5618354, 3402151, -247497, 5912560, 5749351, 6278706, 817654, 2389076, 2157147, -1014686, -814433, -813359, 5433134, 1016834, -2865280, 478889, -416612, 2984466, -2084670, -944356, 2834679, -2212982, 4406100, 1519882, -601832, 362925, -3803194, 2794950, 2825015, --459562, -843424, -2335925, -3149822, 19393388, 3082176, 7833484, -11696270, -10590852, 6075231, -10060961, 1169305, -3572876, 18610630, 5848672, 62277, -5168457, 4041027, -1454383, -2073396, --704912, -3215857, 857920, -6209986, -14781667, 4852776, 1506997, 4488778, 1454920, 8195335, -2487860, -8850854, -17993228, 455267, 1333587, -1458141, -15748034, -7692287, -2380486, 4395362, --3448859, 1750199, -13777718, 658741, -3089155, 76773, 1365263, 3809636, -1499481, -12962748, --11928198, -7434052, 4988068, 3688303, -3191161, -2699924, -20783346, -11761768, -437550, -20261508, -18621368, -19130858, -5272073, -12390981, 19972134, 6400038, -14104673, 7072201, -1656247, 7547332, --12022150, -3984656, 500364, 8121783, -11415486, -4566087, -3896609, -11593727, 797790, 7683697, --1476395, -2137820, 13833016, -21971442, 17267380, -2879239, 3626563, -9914932, 6924024, -1123134, -5510443, -5036386, 253940, 4379793, 4745402, -1386201, -2435247, 14496, 459562, 564788, --1646583, 5401458, 5651103, 3999152, 1013075, 4054449, -420370, 4986994, -1877975, 907312, --252866, -1892470, -1963337, 335544, -4163434, -5000953, -1488743, -319438, 5015448, -314069, --868657, -1392106, -3529390, 2447595, -1163399, -1830730, -1298154, 2598992, -597000, -5667746, --805843, 2004676, 428960, -546535, 17034378, 37327024, -5081483, -11712913, -10979547, -9698036, --13892072, 2230699, -23611582, -263604, -18268106, -8475581, 5550709, 11370389, 6492917, -8254391, --1188095, 10812580, -809601, 12488154, -7541963, -7612293, -6725919, 5856188, -4454418, -5791227, -1946694, -6931004, -7061463, 8443369, 20024748, 7515119, 8527121, 3738232, -11894912, -2872796, --9664750, -9143985, -1506997, -1715303, -7609072, -12152073, -24329380, -2342905, -8874476, 3066607, --4547297, 9012452, 8364449, 4705137, 8757975, 6126771, -996969, 16912508, 24182814, 5714991, --28456842, 5697274, -5150203, -16711718, 2253784, 8041790, 3975529, 636729, 7740605, -556198, --13589277, 736587, 6353867, -13651017, -7181186, -12797392, -23609972, 18440978, 2506114, -1471026, -12883291, 10005126, 666794, 651224, 12734041, -17480516, -7617125, 1854889, 9381282, 7866233, -12075301, 8638253, -7212324, -4252555, -1630477, -2856153, -1078037, -1835562, -3519726, -4655208, --7107097, -7221988, -5133023, -2821794, -796716, 3411815, -1954210, -1545115, -8133058, -5644124, -810675, 4152697, 2903398, 1650341, 1685238, 1110786, -1165010, -4245575, -2037425, -2689723, --2322504, 695785, -4483409, 815507, -3202435, 3273839, -402653, -1279900, -3067144, 2686502, --2821794, -1002338, 5608154, -2435783, -193274, 27567248, -20399484, 23830090, -1989107, -2851322, --12119861, -4471598, -12040404, -10229001, 12733504, -11309723, 6586869, 28579250, 10631655, -4221416, --12883828, -10810970, 12754442, -10404558, -17621178, -7248831, 1819992, 1699196, -20118700, 1444183, --6094559, 10516764, -6346888, -277025, 2347737, 30056182, -7249905, -9575630, 14586783, -11578695, -17520246, -10215043, 12833362, 2170569, -9242770, -8451422, 16287590, -20993264, 16025060, -9037685, -1658394, -5011153, 8762807, -7248294, -3694209, -267362, -6455873, 30654256, -8791798, 20923470, -8128226, 9604084, -130997, 7926362, 13429289, 15042586, -4109210, -14565845, 93416, 12421582, -5014375, -2205466, -18321794, 24522116, -5118528, -16217260, -4482872, -9945534, 7683160, 10586021, -442919, 17746268, -4784057, 9100499, -20155208, -3568044, -21507048, -6706592, -7860864, -494995, -1207423, -4156455, 7696045, 2515240, -5795522, -9914395, -7339026, -2141041, -907312, -4976257, --1055488, -1770063, 6090264, -1813013, 271120, -2318209, -9306120, -2831994, -3733400, 1129040, --1540283, -5248987, -8127689, 3208878, -5490579, 2524367, 3624953, -5713917, -13939853, -3352222, --2175938, -3741990, -4968204, 548682, -2317672, 1478543, 1646583, -6361921, -811749, -6405407, -5928666, 3607236, -3337190, 1573569, -5572720, -31242128, -13332115, 19185618, -3777961, -7838852, -22299470, 2151242, -11562052, 8469676, 12147778, 10307922, 1626182, -19210314, -7924215, 2958696, -2861522, 10073846, 6674379, 11361262, -9798968, -7732015, 3832722, -2641942, 9320616, -18054432, --3033321, -19530290, -6295885, 3570192, -2667712, -2425583, 20953534, 4391067, -15479599, -2319819, -1272921, -15811922, -2120640, 812823, 9550934, 24098524, -8513699, 8081518, -13405130, 2061047, --7878044, -10133438, 9829570, 21082384, -16656957, 1651415, 18766322, -8426726, -1712618, -6997576, -12287365, 2999498, -15226196, -148176, -5311264, -4908611, -1504312, -7450158, 11368778, -26912266, -5719286, 2296734, -11324755, 15135465, 23161148, 16384226, 44111460, 13414257, -11305428, -15626702, --12943421, -7033009, 16195785, -5803038, 22487376, 2100776, 27381490, -32503238, -20867636, 9838159, --5345087, -3331821, 13132399, -8829379, -1010391, 14001057, 6223408, 10394895, 15298137, 11985643, --2594160, 4912906, -9362492, 367220, -367220, -6538551, -7194070, 4818954, -9911174, -816581, -14967424, 1394254, -8952322, -11651173, 2159832, -14646912, -5415417, 15817291, 8191577, -2557116, --3631932, 3066070, -2943663, -4957466, 1045288, -3613141, -5632313, -941135, -7728794, 5476620, -4715874, 5245229, -2888903, -2035278, 3319473, 8095477, 22090090, -51231980, -1883343, 29466160, --38884488, -1613297, 7842074, -40169756, 18219252, 5086315, 32485522, -3061238, 11582453, 9701794, --35333624, -29218662, -11286100, -2676302, -17608292, -21674016, -11400991, 20359218, 14309220, 12403329, -1458141, 2448668, 6530498, 1425929, -25616796, -9472550, -32928978, -10394358, 18646064, 5678484, -12644384, 41776612, 10967736, 15897285, -508417, 8501888, 36786396, 27730456, 7829189, 18255222, -16740172, 36735392, 30179662, -39654896, 25089588, -2047089, 24016384, 24480776, 10266046, 44070660, -38915624, -21180094, 19331110, -83752, 18428630, -31871342, 3267933, 3664144, 1340567, -7055558, -20463908, 22206592, -21174726, -7009387, -12380780, 7943005, -17531520, -21731998, 20762946, 35389992, -13044889, 36823440, -10416906, 49961208, 48845588, 13833553, 25677462, -7239168, -12659953, 11671037, -11426224, 5687074, 3996467, 3203509, 6689412, -6721087, -12444668, -8782671, -23481124, -24529632, --9870909, 11751567, -199716, 10388989, 1903207, 6412923, 15140833, 18652506, -5863167, 8675297, --786516, -7402376, -6222334, -5198521, -15447924, -6929930, 340913, -13219372, -4675609, -11875585, --6608881, 2841658, 16988206, -7746511, 6160057, 5003637, -2789581, 9570261, 5517423, 7363185, -259846, 12637404, 8012799, 5642514, -4915053, -7272990, -16315507, 23956254, 43021612, -5750961, --58559196, -18611168, 6049999, -4451197, -9660992, -12735115, 260382, -33398202, -20054812, -27698780, --4439386, -7976291, 9341554, -19712826, -5664525, 5539971, 9365176, -43487, 10409927, 20462834, -4230543, 29444148, -18798534, 7259569, 1209033, 28114856, 7346005, -5239323, -28073516, 18911814, --4817880, 25691958, -21352430, -16713865, -16174310, -8367670, -25881472, -3291019, -4469451, -24093692, -13434658, 28043452, -13418552, 4414153, -36031016, 34956740, -10923712, -18547280, 15826954, 14166950, --20602422, 2138357, -12837657, 4885526, -9400610, 43729748, -1588064, -3349538, -10675678, 76937360, -1975148, -10001905, 32821604, 26730266, -27801324, 22126060, -34067144, -18526342, -35603132, 27643484, --24499030, 13573707, 18719614, 15347529, -31569084, 40315784, -7187091, -51733416, -59533616, -22982370, --7329362, -16806744, 13873818, 14168560, 23546622, 4366908, 2046015, -17186848, 17782238, 28441810, -40920300, 11315091, -11751567, 4525822, 34810708, 6353867, -19256486, -4195646, 37141804, 9098351, --22024056, -5117454, 18305150, 11199664, 16659104, 11853573, 23487566, 815507, 12870406, 5229660, -16592532, 8535711, 26415122, 9465571, 16652662, -2605435, 5157719, 1938641, -2077154, 7767449, --2465311, 9885941, 16393890, 3244848, 9460739, 1978369, 12328704, -27420144, -6700149, 22565758, --16466905, -78799232, 5681705, 50727860, -30573188, -20366198, 40739912, -29553670, -1879048, -8352638, -39101384, -67020816, 37539624, 22318260, -18891950, 7067369, 36672040, 26227754, -12794171, 15039902, -6753836, -10147934, 17260936, -296353, 10475962, 15933792, -6736120, 3911105, -1685238, 7645579, --9682467, -7730405, -598611, 13696651, -39756364, -19601156, 19804094, -4375498, -26356066, -31055834, -5411122, 38857104, -16799764, -24661702, 19072876, 29015188, -6310381, 7376070, -5097053, 27038430, --14614163, 40490804, -5450851, 190589, 22136262, 585726, 5102958, -28562070, 45081588, -23178864, --28221156, 21527986, -29884382, -9753871, 5056250, 15034533, 41648296, -14646912, 25969520, -5157719, -13595719, -70398808, -53948548, -9772661, -21029770, 10910291, 9747428, 26921392, -4227322, -5469641, -31942208, -34833260, -775778, 22523346, 22095996, -7985418, 24618216, 3260417, -5247377, 35970, --5467494, 23744190, -13104482, -1173063, 22980222, 5452461, -5216238, 9237401, -11419244, 3124589, --875100, 579284, 9282498, 4536559, -13065827, -2794413, 4036733, -9962177, -14919106, -1074, -10896332, 19384262, -16203301, 18949396, 6398965, -18515068, 15516643, 17998598, -8973260, -20991116, -19488950, -9463424, 3577708, 10974178, -10710575, -27857158, 9162239, 7794829, -15574625, -14453102, -1063004, 10867341, -12366821, -5913633, -26510148, -12553116, 19080930, -33013802, 31912680, -28142236, --35243964, 19601694, -17153026, -11665668, 20032802, -15432891, 16694001, -12184822, 7641284, 39239896, --35549980, -2791729, -5630702, 33013266, 4253628, 2886755, -31853624, -29928406, -10794327, -8927090, --4862977, -9829570, 5616744, 1469416, -3488587, 4657892, 6875169, 3151969, 5279052, -6372658, -15288473, -10362682, 14617384, -28388124, 737124, -23050016, -29791504, -17689360, 39003672, -17200808, --17536888, -13117904, 8761196, -8105140, 17211008, 25177098, -26976690, 23634668, 4014721, -37205692, --18763638, 76042936, 39318816, -58137752, -11165304, 36469640, -18913962, -21403970, 14519137, -18539226, --40258340, 28418188, 12815109, -54660440, 22106734, 27259620, -32251984, -21399674, 32176284, -8239358, --24702504, 5280126, 15820512, -39701604, 7173133, 6657736, 11040213, -30383672, -9251896, -2930778, --9946071, -2396592, 1644436, 3015067, -18721226, 2564632, 26852136, 9072582, 1387811, 8605504, --803159, -4863514, -15264851, -4992900, -8419747, -11339251, -25912612, 6446746, -14936823, -4436165, -31048856, -28153510, -18491982, 22740242, -17071422, -6477348, -7588671, 10018548, -18469970, -6995965, -28587302, 14908368, -14484777, 15844134, 8766028, -12482786, -8005282, 38955892, -31820876, -24895242, -41561860, -673236, -33816424, 4142496, 20269562, -20263118, -42142220, 27422830, 3071975, -46788300, -7590818, 12459700, -34216392, -1202054, 22332220, -6809671, -15444166, 11470784, 9104794, -23787140, --2774549, 16692927, 48168596, 68131600, -26939108, 76244800, -5781026, -20592758, -15879568, -25523380, --1951526, 12987981, 45060112, 1762010, 14024679, -11171210, -38472708, 948651, 1626719, 25712358, -5051956, -29023242, 54573464, -23009214, 10362145, 24643448, -26888106, -21787832, -38459820, -16732119, -24092620, 29969744, 36980204, -13685913, -89778240, 20145544, 47188804, 60421600, 51977156, -617402, --25556130, -31743566, 11090679, 30891016, -19391778, -10202158, -79516488, -48686676, 43058656, 72255848, -14999100, -1835562, -17294760, -31408558, -7183870, 20136954, -27708444, 11068668, -3755949, 45710264, --1738388, 17899814, -88938576, -11212549, 1312113, 54871428, 42656004, -1043677, -26485452, -7266011, -65371548, 29542396, -76237816, -94635848, -36768140, 19127100, 147301808, 15978889, -25315074, 20336670, --39137352, 104565808, 32133872, -83118352, -51801600, -10297184, 74028592, 11154567, -30480310, -28407988, --26085484, 21082920, 39981312, 19989314, -42538428, -3484292, -14453639, 35394288, -3566970, 21435108, --7241315, -8930311, -28116466, 11134166, -8423505, -2953864, 22352084, -34612068, 20557860, -5166309, --5007932, 225486, 16305843, 34474628, 17680232, 2406792, -6498286, 7354595, 0, 14033806, -4900021, 15477988, 4139812, 3962644, -17127256, 8163659, 9511742, 6334003, 446140, 5221607, -3570729, 15323370, 7540352, -12324409, 31393526, -36105104, 1153736, -14501957, 8379481, -22341346, -21034602, 5851893, -11895449, -22530862, -11068131, -4236985, 6595459, -30760018, 7129109, -15038828, --5853504, -24071144, -11341935, 19611358, -20558934, -7216619, -2812667, 9620727, 6483253, -7951595, -11092290, -17590038, -1389959, 287226, 9493488, -11493332, 16790638, 12604118, -12751758, -14694157, --5638219, 23948200, -17172352, 7625715, 17736604, 4047470, -17273822, -6520297, 7443715, -10746008, -8058433, 892816, 3900367, -15850577, 3358128, -12865038, -561567, 12185359, 15239618, 11985106, --8814347, 11445551, 1432372, -14057428, -2107218, 102005, 16950088, -4510253, 3570192, 14887967, --3184718, -19040664, 26808112, -10732586, 15852724, 11805254, 2720862, 3928285, -11347304, -13717052, -18455474, 3046743, 16231218, 5142150, 8828842, 4754529, -546535, -599685, -14248017, 1870995, -3756486, 5285494, 5566278, -1474248, 6487011, 1414655, -918049, 2096481, 761820, 7069516, --1928977, 5588290, -6612102, -1344325, -96637, 848793, -3770445, -1748589, 12446815, 8252243, --2246805, -8635032, -10283762, -3412889, -4227322, 11848741, 1024350, -3094524, -7723962, -3527779, -934155, -5921150, 13089450, 1617592, -5527086, 2655364, -408022, -1996623, 3574487, -3467112, -11324218, -10391137, 7719667, -10091563, -29118804, 54577760, 4990215, 3022046, -21992916, 12693239, --1817845, 14356465, 10947335, 16795470, 1887101, 4312147, -9386651, 2758980, 15391552, -1460826, -8440148, -1291175, 2714419, 3441880, 6267431, -6461242, 11661910, -7869991, 1110249, -1229971, -3984656, -992674, 2380486, 8883066, 9738838, -4638028, 4322885, 1936493, -2123325, -4118874, -12956843, -3922916, 2779381, -3626563, 6799470, 5906, -6138045, 13024488, -8018167, -2745021, -3491272, -6056978, -3643743, -1847910, 590558, -2288144, 274341, -1195075, -3298535, 4460861, --8296266, 5319317, 3632469, -2806224, 5599564, -4154307, 6622840, -3323768, 1326608, 1341640, --3878892, 6520834, 78383, 960999, -1967095, 8762270, -10254234, 11077258, -7725036, 1388885, -1976222, -236760, 2119030, -1685775, 6456947, -5914707, 511638, 5553930, -6514929, 4220342, -3826816, -894427, 906238, 3817689, 1868848, -1654099, 2582886, 759672, -753230, 597000, -2280091, 341987, -2682207, 841814, 1235340, -1337346, 3295314, -615791, 2726231, -1604170, -531502, 2163053, -1255204, 427349, 1526861, -1969243, 3605088, -243739, 1832877, -358093, -3789772, -1212791, 541703, 3554622, -2933463, 4097936, -2209224, 1835562, -2274722, 4027606, -10452877, -49754512, -123906584, 19286014, 94407136, 87718264, 152150832, -38801808, -40703404, -103553272, --141403744, -29131152, 51161652, 54757076, 103089416, 56020332, 4435628, -26736708, -71944464, -51126752, --8820789, -7977365, 25654376, 23817742, 13762686, 8809515, 6924024, -3762391, -17673254, -1338956, -20434380, 189515, 4305168, -1136019, -15311558, -11693048, -26046292, -25486872, 11576547, 10716480, -23675470, 36039072, 26975078, 13216688, 4766340, -38825432, -27491012, -21227876, -21312702, -23728084, -4958003, 15198279, 26346404, 33705828, 27843736, 6113349, -3298535, -22285512, -22805202, -13502303, --6611029, 2233920, 3745748, 7596724, 653909, -7244536, 2462090, -11591043, 6062347, 9943923, -1122060, 19857244, 23931558, 7459285, -4563940, -26288422, -34711924, -13916768, -6418292, -3992709, -17632988, 13733158, -3617436, 15568183, 16818018, 9479530, 11612518, -6382859, -12527883, -9996536, --14411226, -11361799, -2145873, -10903848, -4361540, 658204, 8768176, 12484933, 17889076, 15531675, -14228690, 11385421, -5916318, -13368623, -22573274, -27722940, -16201154, -11996917, 1531156, 13312788, -19492172, 22701050, 17861158, 16547972, 10589779, -13969918, -25078314, -22542672, -11098732, -3172907, --1065152, 1757179, 9526774, 8489003, 3990025, 1979980, 7786239, 4502200, 6767795, 1959579, --10533407, -11460046, -7624104, -2997887, 3562139, 2608656, -3848291, -2097555, 3539590, 1918777, -1499481, 4835597, 7638063, 3541201, 120259, -3833258, -4506495, -3730716, -4631586, -5951214, --4598836, -458488, 3103114, 4300873, 4996121, 4050154, 1229971, 60130, 96637, 234076, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --5836861, --78920, 1278290, 969589, 4165582, 547608, -510027, -2685965, 6121939, 3781182, 199716, --754304, 6081137, 2064269, -1942399, -5333276, 3403762, -1536525, 2643552, -5076115, 328028, --1214402, -3770445, -1023813, -1896765, -703301, 289910, 23622, -2748779, -1690070, -435939, --531502, -1708860, 1829656, -175020, -1831804, 3262028, -5426691, -2572149, 2587718, -3256122, -446140, -2020782, -2980707, 2026688, 1836099, -1596654, 2034204, 3926137, 2206540, -2034204, --2384781, 430570, 768799, -2398739, 2596845, 4330401, -3695283, -1177895, 2127620, 1596117, --882616, -1127966, -1806034, 2387465, 722628, -2856690, 3248069, 1585380, -2674154, -1999844, -3415573, -2576981, -3299609, -6209449, -5404680, 2943126, 3397319, 275952, 1489817, -586800, -1218697, -2297808, 3485366, -287226, 1611150, -1596117, 897111, -1453310, -1141388, 58519, -2231773, -490163, -573378, -997506, 329102, -752693, 150324, 265751, -466004, -539018, -67109, -25233, -185220, -591632, 298500, -215285, 7792682, -747861, -1573032, -3189550, -4988068, -2654290, -282931, -4051765, -4323422, -5437429, -2558190, 4265440, -4413079, -1649804, --1552631, 1479079, -1098975, -6058052, 3157875, 1518271, 11778948, -1202591, 5510980, -1098438, --290984, -533113, 608812, -2483028, 4561792, -1197759, -918586, -2752537, -504122, -984084, -7068980, 1312649, -715112, -6624450, -676994, -1273995, 1998770, -4210142, -1165547, 1139777, -950262, -1164473, -710817, -2616172, -985158, -3144453, -1415192, 6103686, -1796370, 1932735, -3407520, -824634, -3317325, -4352950, 1130650, 1021665, 1314797, 2705830, 3207267, 2641405, -1526861, -1209570, -1173063, -1399623, -6128382, -1465658, -623307, 2968359, 2530810, -1514513, --148713, 3260417, -3400004, 1340030, 97174, -849330, -1967095, -2996814, -37044, 1783485, -1803349, 1899986, -794032, 781147, -709743, 158914, 2672544, 1083942, 207232, 23085, --407485, -63351, 170725, 532039, -339302, -373125, 1159641, 594316, 1181116, 1210644, -248571, 672699, -173409, 194884, 88047, -541703, -1371705, -249645, -10328859, -2523830, --209917, -2211908, -1535988, 3609920, -7258495, -6084358, -3565897, -2379949, 1024350, 8143795, --1778117, -25233, 971736, -5852430, -1538672, -4889284, -765578, 8625368, -676994, -4210142, --2742874, 99321, 1750736, 1720134, -2433636, -10946798, -5246303, -1473711, -4233227, 379031, -186831, 4419522, -2870649, 3923990, 949188, -2035278, -5869073, -4916127, 6771553, -5616207, -3715684, 1079647, -3605088, -1357747, -3220152, -2314451, 3183645, -6031208, 3103651, 1048509, --106300, 999654, 412854, -609885, 125628, -3061238, -4193499, 290447, -1283658, -3099356, --1256815, -4787278, 5546951, 3794604, 952409, 4538707, 532576, -1942936, 5637145, -2987687, --1875827, -1926293, 4289599, -4203163, 1859721, 3011846, 163746, 1862942, 4672925, 1707250, --146029, 289910, 992674, 771484, -926102, -566399, 55298, -246424, 1498944, 724239, -1585380, 1175747, 450972, -1438277, -1683090, 1009854, -61203, -101469, 1534914, -1076426, --855772, -30065, 367757, 499827, -153008, -1731946, 1436667, 380641, -6940667, 8510478, -9656697, 2647847, 2600603, -2760053, 4507568, 2260764, -5636608, 1770600, 3641596, -6739341, --5878737, 5925981, -5149129, -743566, -3314641, 5972689, 1315334, -676994, -2182917, -38118, --3854196, 3599183, -1916092, 2182917, -915902, -23622, 3898220, 1534377, 562641, -1495186, -3820910, 2425046, 1149978, -317828, 3952444, -297427, 737661, -2472828, 4814659, 1088774, -1931125, 3521873, -9615895, -3118146, -1881196, -3437585, -3335579, 990527, 5394479, -2307471, --1415729, -2929705, -1298154, 1176284, 2384781, -6616397, -378494, 2332167, 290447, -509491, -2902324, 1893544, -6194954, -1722282, -1331440, 3864397, -4066797, 5451924, 5901285, 3095598, -1235877, -2724083, -122407, 487479, 3953518, -1037235, 496069, 489626, 618475, 5826660, -658204, 6207839, 2309619, 106300, -2942053, -1680406, 2560874, -504659, 19864, 262530, -176094, 580894, 2607045, 752693, 1032940, 114890, 998580, -2047626, -151934, 667867, -845572, -513249, -308164, 28991, 843961, -599148, -431107, 878321, 853088, 1578401, -747324, 1461900, -836445, 130460, 193274, -554588, 1389959, 10682121, -1991254, -159451, -3896609, 2520609, 1884954, 3598109, 9487046, -2655364, -877247, -9154186, 175020, -7867307, --9976672, 347892, 4242891, -12885439, 4366371, 4205310, 2304787, -3918084, -3096135, -4272419, --1622961, 239981, 267362, 4087735, 5405753, -748935, -5328981, -3239479, 4001299, -5731097, --2851322, -4845260, 1040993, -7825431, 3892851, 610422, -531502, 1249299, -253940, -1796907, -4832, 5025112, -5811628, 7028177, -5345087, -631360, 1296006, -3552475, -2898029, 2745021, -1355062, -1130650, -2718178, 5242545, 2189360, -3669513, -7334194, 841277, 1696512, 4282083, --178778, -1907502, 369904, 2263448, -1746441, 10189273, -3413425, -1669132, -7275675, -4831838, -11507291, 4660040, -2556579, -670552, -4000762, -4491999, -357556, 1588064, 306016, -2187749, -2485176, 1353452, 3444027, -379568, -2490007, 989453, 103079, -1152662, 1008244, 955093, --260382, 431644, 1362042, 431644, -322123, -1052267, 571768, 338229, -960999, 1872606, -1597728, 497679, -938450, -2444910, 176094, -211527, -91268, 1050656, -1195612, 759672, -1276142, -782758, 2943126, 6882148, -9192841, -5430986, 6428493, -4817343, -5130339, -5632313, --6733435, 4838818, -1702418, -200790, -1550483, 252329, -7492034, -1496259, 3425773, 3746822, -849867, -3956202, -5750961, -4772246, -6068789, 1228898, 7233262, 973347, 2338073, 2478733, -2410551, -4255239, 4455492, 2772938, -3189550, -2564632, -9826348, 1509144, 2187212, -7715909, --618475, 2370822, -1454920, 951872, -703301, -8278013, 7030862, -7712151, 6054830, 324807, -3046743, -8680129, -4864588, -7772817, -6137509, 1129576, -2195802, -2763275, -3464965, -26844, -3854733, -7192460, -135291, 2084670, -2335389, -8019241, -5033702, -1680943, 1496796, 3887482, -1675574, -6605660, 7031935, -2275259, -1554778, 7000260, -9204652, -3028489, -1847910, -1647120, -10981695, -4016868, -204548, -4168266, -3467112, 1991254, 1497333, -259309, 1159641, -887448, --1568737, 2044941, 10737, 829466, 861678, 2647311, -1059783, 763430, 572841, 172872, -679142, -3035468, 3921305, 3565897, -1239098, -628676, 542240, -529892, 657130, 103079, --294742, -1466195, 874026, -763430, 327491, 3469260, 2204392, 1858110, -1452236, 2471217, -972273, -1017370, 1111323, 365072, 817118, 14220100, -12597676, -6620155, -8378945, 6125160, -2331630, -4256850, 2896956, -23622, 8475044, 574452, 124017, -8094403, 5784247, 9359807, -9808632, 8169565, -4493610, -649077, 1290638, -5149129, -3519189, 1411434, 625455, -7438884, --3634079, -3106872, 3693135, -517544, -5621039, -2551748, 1894081, 4549444, 590021, -1516124, -106300, -3921842, -77309, -192737, 646929, -8507256, 5035313, 5950677, 1251446, 3096672, -3547643, -6873559, 9958955, 8996883, 1693828, -6110128, 3589519, -2120640, -9120900, -2265595, --2843805, -71404, 615254, -102005, -5487358, -4874251, -11339251, -9423158, 191126, 5835787, --5159867, 2505577, 805843, -3443490, -9223442, -837519, 5493800, -3517041, 4938139, 9672803, -2981244, -3869229, 5599564, 71941, -509491, 2714956, 4376572, -279710, -674310, 1291711, -2853469, -1434519, -6167573, 463856, -97711, 767189, 854699, 2198487, 4650913, -1530619, --723165, 3562675, 3218004, 785442, 537408, -2108829, 4488241, 611496, -213138, 2757369, -911070, 1081258, 532039, 2500745, 2204929, 2490007, 3979287, 432181, 2410014, 454193, -2674691, 1357210, 1556389, 1134945, 2538863, 2290828, -13496935, 1444720, -5030481, -18082886, --13909788, 3498788, 142808, -3102577, 3239479, 8724689, -1371168, 5236639, 4635344, 2706903, --1374926, -4690641, 3860102, -3991635, 498216, -3423626, 5455146, 9978820, -8941048, -2556043, -569083, 3642669, 980326, -2764348, -1613834, -3310883, -244276, -4103305, 5277441, 1184337, --6281927, 7034083, -7008850, -2219424, 8614631, 7607461, 6408628, -7275138, -4779762, -6514392, -7598334, 10308995, -139050, -2102923, 8170102, -11986180, 1491964, 3246995, -1146219, -10067403, -9096741, 3209414, 4630512, 8552354, 468151, -12152073, 3212636, 5027259, -3102577, -879931, -8410620, -8674760, -8152385, -7021735, 868657, 10849087, 5866389, -1534377, 12405476, -16456167, --6065568, 222801, 7946763, 3722126, -2367064, -13072270, -2029372, -5226975, 1474784, 5012764, -12782360, 2206540, -3588445, 1702955, -2157147, -818191, -4205847, 51540, -3462818, 1225676, -3498788, 2008971, 3222299, 3656091, 1167157, 813896, 45634, 680752, -1733019, -1791538, -182536, 3859565, 1461900, -425739, 696858, 1580548, 3088618, 454193, -1005022, 570157, --981400, 2514167, -4543539, -2718178, -1996623, 2912525, 2496450, -14540075, 14723148, 5992016, --345745, -1481764, 1250372, 2541010, 7982734, -1497870, 893353, -2535105, -1826972, 4510790, -2330557, 5235029, 2310693, 3029026, -9927817, -4104915, 16693464, 1705102, 4970888, 7024956, -2644626, -5637682, -10474351, 3281355, -4363150, 410706, 3701188, -5203890, -6126771, 7495792, -8791261, -4557497, -3238405, 6816113, -8344585, 3675418, -6419903, 2911451, -6213207, 9050570, -1269700, -1181116, 3189013, 15538118, 4291746, 6027987, -1743220, 804233, 2654827, 11477763, --985158, 16443282, 496069, 7819525, -276489, 14843944, 5257040, 11081016, 8406325, -1855963, --4956929, -1328219, -5663988, -6246493, 8700530, -1748052, -3394098, 1356673, 130460, -4440996, --2163590, 1360968, 3894999, 1082332, -7437810, -7368017, -3828963, -7522635, -195958, -155693, --2211371, 2087891, -148176, 3062312, -448824, -3067144, 634581, -1294396, -5670431, -3575024, -811212, 7587597, -3197066, 2810519, -856846, -79994, 3517041, -2636573, 1195612, 1724966, --1926830, -1313186, -947577, -2169495, 1069447, -2713346, -3541201, -1348620, -3837017, 4812511, --1351304, 295279, -413927, -284542, 508954, -1591285, 710280, 1219771, 624918, 1963337, -2602750, 463856, 1939715, -1447404, -4151623, 831076, -1150514, 1743220, -1698660, 17060146, --4481262, -151934, -21030308, -751082, 11235634, -5887864, 9762461, -13380971, 1938641, 1337882, --391379, -17743584, -804233, -29561724, 1389422, -3267933, -12383464, -2168422, 1653026, -6496138, -1118839, 7459822, 1142461, -6777996, 1249836, -2108292, 6547141, -7288560, 416075, 9462350, -2128156, 768799, -1421634, 7246684, -4683662, 744640, -37044, 5556614, 1069984, -9993315, --5320391, -7055021, 8239358, -18703508, 9035001, 7414724, 6380174, 3546032, 1385664, -8200167, -5820755, -12134356, -2875481, -2568927, -2518462, -559956, 761283, 3864934, -9320616, -3684008, -15708843, 6559489, -5734318, -6687264, 1705639, -2794413, 4787278, -3222299, -971736, -5113696, -14246407, 7229504, -4891968, 863825, -7257958, 1654099, -5479305, -1923072, 5657546, 5248450, --1646046, 10368051, -4085051, 5127654, -6812355, 7228967, 1061394, -4256313, -5735929, -8571681, -2166274, -972810, 3892314, -1127966, -2522757, 1531693, 1596654, 2547453, 2085207, 4729833, --180389, 1495186, -3679713, 2936147, -2641405, -1369021, -1981054, -432181, -4684199, -847182, -1833414, 4191351, -4025458, -1988570, -2908230, 2860985, 2239826, -1905892, -362925, -3176665, -2412698, 10828149, 10940892, 6352257, 5672578, -5318244, 6309844, 10517838, -7812009, -278636, --20275466, 11618423, 7928510, -2887829, 4697621, -1303523, 1621350, 7234336, -4539781, 11315628, --10202158, 985695, 12741020, 5581847, 784368, 9835475, -3477850, 4519916, 2593087, 5270999, -8705899, -5141076, -1042066, 16058883, 8028368, -348429, 2217277, -10875394, 14776835, -12437152, --783295, 12942347, 4016868, 13933948, -8742406, 2237678, -565325, -3405372, 1869385, -13452911, --9439264, 12687333, -6317360, -2713346, -4290136, -14306536, 10162429, -3369939, -2370822, -6336688, -6251325, 14544907, -11464341, -2330020, 9803263, -10764799, -4698694, 8763881, 12220793, -20199232, --5390184, -1729798, 8619999, -302258, 10066866, -2441689, -7378754, 493921, 5357435, 13049721, -6577206, -8764418, -459025, 6422587, -13007845, -7958575, -2492692, -6657200, -6775311, -792421, -6168647, -5833103, 1441498, 6437082, 1784022, 1158031, 4494684, -1107565, 2892124, 2801393, -2736968, 1581622, -518080, -3910568, -1340567, -1083406, -3575024, -1606318, 547608, 467078, --542240, 566936, 3929895, -3238405, -1060320, -2403034, 1877975, 1858110, -783295, -2680597, --5962489, 3010772, 2255395, 3878892, 1045288, 955093, -435402, -3686693, 1475858, -1475321, --1708860, -1065152, 10573136, 22405770, 4331475, -13243532, -4720169, 4399657, -29387776, 928787, -179852, -4599910, -1442035, 13577465, -22179748, 4880157, 10369125, -8155069, 9189619, 17144436, -4250407, -15838229, 4288525, -3986267, -287226, -15524696, -4690105, 14166950, -1591285, 12990665, --3418794, -4548371, 2125472, -10986526, -6179384, -7907572, -5867999, -4319127, 10597295, -11704323, -1903207, 20461224, 13810467, 4618164, -20795694, 3461744, 13644037, 5715528, 811212, -7410966, --9030169, -22194780, -15337328, 3177739, -7590281, -7582765, -438087, 9492415, 6717866, -6667400, -290984, 13503377, -5196374, -2276333, 612570, 17751100, 674310, -883153, 9023189, 2835752, --20193326, 5674189, 5848672, -88047, -16723529, 7068980, 9795210, -7338489, -5243618, -13699872, -3650185, -5019743, 5190468, 2623688, -3230889, -5796595, 3784403, 1755031, 5843840, -2888903, -9114994, 3245922, -6257231, 776315, -326418, -8564702, 159451, 723702, -31675, -146566, --4530654, -3887482, -1826435, -75699, 5713380, 1931662, 2986613, 4665408, -2117419, -2706903, -2194728, -4431333, -4010426, -124554, -225486, 1440425, -1328219, 1060320, 2810519, 3045669, -370441, -1722282, -429497, -178241, -506806, 92342, -745714, 418759, -103079, 3958349, --2238215, -2728378, 7094749, 5151277, -685047, 2047089, -6592775, 23167054, 1289564, -4651450, --300648, 10251550, -4913980, 2841121, -2469606, 2438468, 8795556, -15975668, 16921098, 19163070, -5410048, 8125005, -6461779, 10879689, 25228638, 847182, -2859911, -4611721, 10756746, -3769371, --6069863, -2092186, 3834332, -12516072, 5616207, -11018739, 12679280, 2915746, 12768401, -7951058, -11641509, 3500398, 15228343, 2561948, 3233574, -5393405, 9497246, 2418067, -2966212, 13698798, --5282810, -9677098, 19346680, 15451682, 5728413, 14608258, 21166136, 25655988, -7924752, -7976828, --8996883, 3253975, -11720966, 13927505, -1676111, -1213865, -19648402, 4627828, 22382686, 22808424, --838056, -2925947, -15573551, 301185, 14873472, -7516193, -9207873, 8447127, 1362042, -8031052, -2916283, -1255204, -4893579, -1056562, -4190278, -111132, 8650601, 6460168, -1705102, 1600412, --2033667, -8533563, -11155641, -2025614, 5630166, 2324114, 7948374, -1527398, -7398081, -1971927, -8240432, -3784403, 4709969, 7611756, -7543573, -1953136, -692027, 1998234, -362925, 5106716, -3737695, 1891933, -7519414, 1988570, 4189204, 1330903, 1749125, 2808372, -6667937, -3062312, -49929, -268972, -3517578, -8639327, -2782065, 847182, 4560719, 1075889, -3529926, -4080219, --30380452, -21248276, 11064909, 4254165, -15961709, 1571421, 6951405, -14556718, -9190693, -6317360, -17196512, 7673496, 5445482, -5561446, -4297652, -4434017, -10838350, -14420890, -25361246, 13104482, -11200738, -5427765, 28470264, 13655312, 27333708, 18753974, 1676648, -8835821, 7188165, 3313567, -12391518, 14271639, 15752866, -2326262, -2859375, 6697465, -7231115, -1704565, -6382859, -11882027, --19531364, -5716065, 19734838, -4951561, -7987566, -11256036, 7804493, 11955578, 7905961, 750009, -11596949, 22721988, -13654775, -6229313, -10529112, -7616051, -22009560, -5397164, 5464809, -10011569, --7888781, -25286620, -36046588, 3912715, -23778550, -37317896, -27064200, -11378442, 24055574, 8318815, -14646912, 11020886, -24943022, -10519449, 2062658, 12439836, -12437152, -14670535, -14246407, -4430259, -7307350, -8443369, -31070330, -19522774, -4549981, -6300180, -2323577, -4618164, 17399986, 15947214, -16453483, 16858820, 5519570, -161061, 6247030, 1753957, -628139, 4973036, -14056891, -5408975, -5964099, 8160975, -474594, -4559108, -5145908, 2041183, -7700340, -11060078, 10055592, -8242042, --4272956, 907312, -9711995, -9073118, -16498580, -6405944, -3955665, 1161789, 13593035, -3525631, --2135136, -4344897, 6880538, -3687766, 272194, 6671695, 433792, -4712653, 2960306, 6656663, --4193499, -997506, -319438, 3524558, -57669064, -9054328, 18529562, -19633906, 8053601, -7653095, --31289374, -9751186, 33492692, 42184096, -22407382, 777926, -7725573, -34428996, -27423366, -25912612, --27657442, -14790257, -18066780, -1501628, 5893232, -4825396, 7033546, 6484864, -11336029, -3115999, --15550466, 6501507, -24473798, -22049826, 5258651, 3774203, -6691559, -8104067, 19149112, -5680631, -26601954, 5854578, 24654722, -16752520, 10714870, 6936909, 29868276, 15937550, 10444287, 2809982, -4482872, -3597035, 8741869, 12264279, -9721122, -13556527, 20883742, -2959769, -26322780, -50470160, --60679296, -43781288, 7185481, -150861, -56516400, 18258442, 9532680, 14047227, -19331648, 2354179, -6553583, 2422362, 28869160, 29417304, 58891516, 19495930, -31553514, -40491340, -24925306, -22419192, --25925496, -23087060, -913754, 12466679, 16816408, -11024644, 22172232, -19246286, -26808112, -20893406, --13919989, -10515691, -20983600, 12924630, -1584843, 12353937, 9454834, 1292785, 21755084, -11647951, --5167920, -21964462, 7181186, 11441256, -1986422, -2149094, 6423661, -21110302, 595390, -7649337, -3820374, -10289131, -14547054, 8489003, -602369, -6196564, -2469606, 10012106, -8249022, 5063767, --7694971, 5796595, 5039071, -3196530, -7645042, 4450123, 4928475, -15661061, 6209986, -4181688, --4756677, -4997195, 3095598, -10262824, -4698694, 32355600, -8655433, -61085172, -17468706, 50333796, --6975027, 11251741, 7160784, 9429601, 17609366, 14468134, 5022428, -9925133, -3717294, 2547453, --10895258, -2479270, 18460844, -16486232, -9871982, -16522739, -3995930, 2919504, 2102387, 4463008, -8616778, -12539694, 11216844, 27623620, -522375, -15993921, 1443646, -10432476, -3651259, 16429324, --17260400, 2044941, 5424544, 20078972, 28915868, -18300318, -10523207, 11316165, 1524177, 3273302, -3338800, -12093554, -31200790, -5456756, -14532559, 28490666, -53893788, -35302484, -14599668, -5748814, -15549929, 3386582, -19035832, -3077881, -21929030, -23539642, -8489540, -16983374, 3105261, 14179298, -64756296, 12138114, -9644886, -41539312, -34280280, 10299868, -1070521, -38981124, 21095806, 21143050, --39814884, -603980, 10327249, 11635066, 42885248, 18994492, 8937290, -42261404, -21898428, -29112362, -26603564, -2529199, -8763881, -4582193, 8274792, 28255516, 23810224, -12397423, -25206090, -36603860, -8877161, 21926344, -7722351, -3591667, 19108846, 11135240, 16645683, 4414690, 5892695, -13971529, --4293894, -6498286, 7155953, 7739531, -2058900, -3074660, -2191507, 10375567, 11324755, -16457778, -9580998, 7557532, 13696651, -8602819, -6234145, 8894340, 2960843, -11802033, -1361505, 14417668, -2577517, -10206990, -21426518, -72515688, 10282152, 11188390, -2464774, -1225139, -5648419, -20915954, -8118562, -4654134, 36888400, -38203736, -7859254, 38875360, -1874216, -26397406, -3318936, 22903986, -27858768, 17086454, -5107790, 19917374, -15211700, 13426068, -6235219, -5266704, -13178033, 21821656, -14814416, -14405320, -6687264, -2193655, 22125524, -2207613, 2252710, -14391362, 14869714, 9612137, --16582869, 29752850, 1217086, -26988500, 23607288, -29311542, -15522549, 26451630, -56852484, -36283348, -30713312, -19721952, 22734872, -36095980, 7888245, 13060459, -19906636, 622770, -1693291, -37252936, --8749922, 38198364, 40324376, -46169288, -15420006, 13915157, -37047852, 47522740, 47589848, 6701760, --68454264, -35993436, 72507640, -38511360, -7794829, 58788976, -34710852, -70666704, -15966004, 63578400, --13849659, -46630996, -11561515, -85021024, -4006668, 68650760, -25192668, -68745784, -7102266, -19391778, --9372692, 20312510, -2566780, -919123, -25130390, -16472273, -8091182, 27391154, -35029752, 1611150, -5489505, -11040213, 1118839, 32625108, -21053930, -26421028, -3593277, 9120363, 20426864, -8269423, -10228465, 15549392, 1691143, -23861764, -12780212, 441308, -19040664, -9301825, 36140004, -13772350, --35458712, -9576166, 20524574, 8437463, -2772938, 4490925, -32072132, -18531174, 24260122, 35989140, -4288525, -26847304, -13152264, 1061394, 9466645, 17995376, -10561325, -40075268, -37822020, -1156957, --47663936, -14195941, -20425790, -19201188, -14594836, 30654256, -3648575, -10026601, -13274133, 5869610, --16906066, -39692476, 30370250, 9490804, 26204670, 8142721, 27113592, -11029476, -17147656, 5923297, --28849832, 22085258, -26147224, -5627481, 16857210, -19811074, -4370129, -12088722, -31593242, 4582193, --23901494, -17246978, -20876226, -15469935, -9646497, -21192980, 3524021, 23179402, -15964930, -5772973, -2707440, 21346524, -9963787, 7461969, -22207666, 35650376, 11047193, 15197205, 9662066, 34183644, --2158221, -40523016, 8770323, 14494978, -11345693, -295279, 21126944, -28242094, -27959700, -32752346, -28030030, 8169565, -40183176, 15445239, -26550950, -5344550, -37493992, 16374026, 26485452, 5319854, --41512468, 23082228, 19154480, -5478768, -36486284, 9636296, -22034256, -7723425, -1634772, -11326366, -17997524, -16491601, -29581588, 14456323, -6629282, 12189117, -193810, -1329829, -219043, -8252243, --9220758, 6008123, 26356604, -3453154, -37266356, -10554345, 15495705, -18664854, -7852811, 17627082, --6743099, -2831994, -14895483, 28951300, 17169132, -8888435, 13149579, -2613488, 5918465, 23422604, --4279398, -21048024, 8699993, 13241921, -10684805, 16787954, -2731062, 10241350, 1255204, -8028905, -14304389, 20447266, -11836930, -22167400, 8612483, 13123809, -10718091, -2500745, 12541305, 3995930, -35314832, 66304096, -15899969, 32900524, 6442451, -15614890, -29567092, -17223356, 38592428, -12593918, -7210177, 14994805, -3841848, 35563404, -5173288, 27916214, 29196650, -35734664, 18490908, -9333501, -926639, 13152800, 10946261, -1187022, 5873368, 10650982, 35738960, 36715528, 28367186, -20685636, --6999186, -48734456, -1401770, 11547020, 22080426, 5105643, -40273372, 17703856, -24142012, 31331786, --28195924, -19748260, 2122251, -23636278, -3977140, -13636521, 48272748, -26313118, -12808129, -50482508, --16342351, -26494042, 71402760, 43375412, -14936823, -48023640, -51418276, -30593052, 35571456, 46309948, -23569170, 6842957, -61711700, -28685550, 20418812, 17362942, 2793339, 22374096, -12719009, -40679244, -19368692, -69022808, 75196288, -7012608, -48423608, 112950120, 16315507, 39310224, 67810016, -112115824, --80661632, 22382686, -6536940, 17146046, 24677808, -70092256, -5065377, 14149770, 1537061, 58721328, -4296041, -30749818, -3080565, 31561030, -18187040, 13786308, 16355772, 639413, -12706661, 15431281, --40674952, 31144418, -7825431, -13008919, 17723720, 4670240, 1392643, 18439906, -4218195, 11036992, --2118493, 7074885, -5185100, -21460340, 13155485, 9037685, 12448963, -151934, 511101, 8400419, -4837207, 3239479, 25103010, 27685896, 1739999, 18127984, -16934520, 2539400, -11070278, 20964272, -19316078, 2918430, -5394479, -12666932, -29463476, 2429341, -29357712, 19871204, -41475964, 25678536, --17064978, 42136852, -18996640, -1957431, 24012088, 4270271, 2116882, -10860899, -9392020, 1096827, --16121697, 17779018, -2055142, 18879066, -14783814, -14595373, 4989142, 743029, -14985678, 9458055, --1867237, 8253854, -4581120, -4059818, 7918309, -7531762, -582505, 5879274, -3026878, -3597035, -29931090, -2057826, -9973988, -5358509, 14235669, -1301375, -16243566, 8639864, 17537426, 3531000, -464393, -10359998, 3723737, -8391829, 8069707, 21250424, -7495255, 9713069, -7960722, -2396055, --8723615, -4159676, 5663988, 6867116, -12362526, 7477538, 2283849, -1588601, -12357158, 2121177, -4580583, -9216463, 13415867, 11187316, -22369800, 5719823, -20525112, -23423678, 16173236, -8348880, -19521164, 10576894, 666257, 9947681, -3029026, -12093017, -2806224, 709743, 13633837, -6126771, -4236449, 5567888, -7701950, -1432909, 4794257, -2368675, -1414655, 7826504, 537, 2990908, --6371047, 2682744, -569083, -6683506, 12720619, 1093606, 10403485, -5053566, 8563091, -4256850, -696858, -6663105, 5762236, -3246459, 12606803, -3913252, 11929809, -12173548, 2802466, 780073, --2441689, 401043, 1600412, 9381819, -296890, -11077258, 7431367, -6252936, 1301375, 6683506, --6725919, 11698954, -24361592, 51601348, 9773198, 12713103, -6512244, 4763656, -1458678, 9816685, -3121368, 22022444, 1550483, -11870216, 7274601, -7727183, 3426310, 4552666, -10045929, 587874, -2472828, -10845866, 9977746, 2605435, -4434554, 13421773, -4738423, 5338645, -4048544, 2546916, -2589329, 1279363, -1639604, -3894462, -1784022, 1929514, 372052, -2168422, -6459094, 4912906, --4323959, 2481954, 4312147, -4386772, 987843, -4092567, 1235877, -6527814, -10639171, 11095511, --5880884, -2795487, 4727149, 2217277, -1838246, 1319092, 9530532, -10392210, 4571993, -3876745, -8263517, -8723615, 5049271, 2528125, -1501091, 1988033, 257161, 183610, 4071092, -5493263, -3181497, 2819646, -1455457, -479426, 7232725, -1040456, 2498597, -8267812, 11292006, -8650064, --79994, 5688148, -5018670, 3903589, 1309965, 1421634, -5249524, 4348118, 4509179, -2732136, -1818382, 2279554, -3724274, 1395864, 1914482, -752156, 3966939, 239444, -31675, -354872, -3566970, 2772402, -2171106, 3117073, -1512902, 1432909, 1602023, -317291, 4423280, -1902671, -90194, 2851322, -3392487, 340913, -291521, -2376191, 404801, 2558727, -679142, -1986959, -4407174, -2714419, 9754408, -45804752, -113715168, 24567750, 94564976, 63926832, 133378600, -43619152, --37289444, -76732808, -122642792, -12117713, 38227356, 50395000, 65765612, 33160906, 3637301, -10746545, --28434830, -40550396, -6144488, -10827613, 3993783, 9315247, -483184, 2345589, 4903242, 2182380, -16060493, 19078244, 11851425, -2179696, 2202245, -14105209, -29614336, -31549220, -15476915, -20689932, -17043504, 31428424, 33343978, 36621040, 20061256, -5910949, -14462765, -26898306, -28432684, -19742354, --11120744, -1266479, 7172059, 13817447, 14812805, 12479564, 10733123, -1829656, 2878702, -3161633, -1415192, -2371359, -1479079, -837519, -10089952, -10545755, -7662759, -15903727, 9664, -2978560, -1994476, 27105538, 35668628, 12068321, 12079059, -9762998, -19623706, -13530758, -23627152, -18938658, -6671158, -1599875, -11461657, 8829916, 9411347, 11272142, 26692148, 11147588, 11700028, 2950643, --14396194, -14135811, -11617887, -12621835, -16047072, -13647259, -8172249, 2565706, 17818208, 26927298, -25154012, 10253698, 5066451, -6506876, -12207371, -10909754, -12099997, -13897440, -6401649, -5753109, --498753, 4764730, 3593814, 10902774, 14368813, 10471667, 7074348, 2563559, -933619, -6751689, --7075422, -10926397, -12399034, -9655623, -8703214, -2121177, 9212168, 13889924, 14851997, 13303124, -5356898, 2531883, -6673843, -10450192, -5654862, -7698192, -10627360, -7919920, 1420024, 7295002, -6718403, 3897683, 4257923, 3983582, 2929168, 984621, -800475, -1020592, -2873870, -3522947, --3422015, -3826816, -4690105, -2426120, 1854352, 3567507, 3937411, 2598992, 1114007, 340376, -282394, 299574, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --6425271, -817654, 2046015, 1981591, 10121627, 2752537, 2140504, -2994129, 390842, -5127654, 1207423, -4716948, -2387465, 228707, -991601, -2522220, -4063576, 3143916, -6799470, -3429532, -3411278, -3693135, 4044786, 2133525, 970126, 2930778, 2420214, 4838281, -1676648, 1696512, 3010235, -642635, 993748, -3521336, -1516124, -1469953, -1323924, 3272765, -6254546, 1051193, -2165201, -6562710, 159988, -1175747, -1641751, -2698313, -897111, -2816425, -8250096, -2607045, -1612760, --1327682, -1847910, 858993, -1543504, -382789, -528818, 2895882, 1295470, -367757, 1848983, --1610613, 3546032, -2315524, -3839164, 3717831, 3893925, -1675037, -3687230, 360777, 2024540, -1532230, 1759863, -1740536, 24159, 1433445, 1927367, 847182, -526670, 242129, 2394981, -4616553, 2234457, -562641, -53150, -1086090, -1153199, 970126, -1519345, 942745, 1140314, --440234, -148176, 510027, 444529, -456877, 386010, 270046, -2115272, 342524, 166967, -663572, 378494, -803159, 767189, 612033, -53150, 9155797, -1711545, -875100, 984084, -2527052, -6744710, 4202089, -8005819, -360240, -3874597, -569083, -2560338, -603980, -622233, -4025458, -3390340, 4359929, -4542465, -4963372, 2106145, 6663105, -7851200, -2180233, -3796214, -56371, -1973538, 2124398, 2819646, 1425392, 2872260, -4562866, 169114, 6407018, 2519535, -817118, -4647155, -6641630, -3994320, 1020592, -3395172, -1917703, 1301375, 4315369, -3884798, --3828963, 1555852, -2799245, 4958003, 1661079, -506269, 3495030, 3321620, -2684, 5572183, -2756295, 1747515, 1476932, 3654480, 5748814, -3781182, 1100049, 1583232, -4039954, 363462, -3284039, -1273458, 8302172, -2559801, -2201708, -1724429, 3062312, 4227859, -5382668, -2189360, -1466731, -973347, 1322850, 523986, -2358474, 1056562, 504659, -1734093, -2852932, 1179505, -801011, 2621004, 220654, 811212, 1202054, -113817, -856309, 1921998, 114890, -4832, -1653562, -893890, 801011, 2208687, -185757, -474057, 417686, -326954, 681289, -1348620, --423591, -626528, 89657, -202937, 863288, 93952, -845035, 40265, -11768747, -1913408, --2631204, -2105071, -1063004, -1448478, 6245956, 7468948, -1718524, 6092948, 2317135, -3382287, -1579474, -5121212, 890669, 1073205, -6884296, -1025960, 1056025, 1192390, 4741644, -923955, -4116726, -2776160, -5284421, -5574868, -1605781, -2825015, -4235375, 4362076, -1727114, -853625, --779000, 904628, 2364916, -6751689, 11811, 932545, -3211025, 8027831, 614180, -1990181, --1757179, 8572218, -628676, 1081795, 5060009, 142808, 3086471, 1199907, 271120, 4727149, --42950, -3320547, 4234301, 2272575, 2714419, 3845070, 1257352, -3135326, 2211371, 3154117, -3053185, 4735739, 11811, -4399121, -3528316, 5555004, 7724499, -7072201, 1402307, -1876364, --1262720, 1615445, 2938831, 2830920, -2277407, -915365, -2201708, -3650722, -3204046, -1176821, --2043868, -3138547, 695785, -861141, 1169842, 1005559, -992137, 556198, 172336, -2551211, -839129, -1727114, -3111167, 200790, -932008, -1305670, -1409286, -401579, 537945, -477278, -869731, -600759, -1065689, -1439888, -1347009, -576599, 214212, 1015223, -8646306, 9238475, -8559870, 6455336, -4484483, 5048734, 9108552, -2277943, 7121056, 2685965, 1080184, -1097364, -7850664, 3714610, -1822140, -5612449, 3273839, -2320356, -2992519, 3184718, 3764539, 1654099, --5566815, 914291, 5025649, -2436320, 1714229, -10969883, 1596654, -875636, 5304822, 1301375, --2261837, -3302830, 6784975, -5820218, 488553, -4699768, 566936, -1435056, 3798362, -782221, --1215476, -5761162, -1365800, -1011465, 7178501, 362388, -6532109, -237297, -343597, 2244121, -3442953, -2910377, 31675, -3715147, 3988951, -867047, 4817343, -2585570, 7162932, 3550864, --7863548, 8356933, -1184337, -5769215, 1002875, 7635915, 1571421, 1176821, -6153078, -401579, --2371359, -3336116, -3213173, 294742, 2932389, 3759170, 2064269, 2054605, -2388002, 1813550, --2066416, -238371, -89657, -964757, -379031, 2172180, -3410204, 934692, -312459, 300648, -1176821, 937377, -69256, 1491964, 186831, -2260764, -2423435, 1436667, 686121, -99321, --1591822, -320512, 413927, -219580, -681826, -1576790, 1017907, -28454, -956704, 1090922, --628676, -433792, -1232656, -775778, -449361, -1595044, 1145146, 9941239, -3456375, -7241852, --402116, -10848014, -38655, -9325448, -3259880, 6366216, -6660958, -7347079, 2166274, 580894, -629213, -1742146, -2425583, -5325760, 3559991, -10395968, -3215320, 1024350, 6401649, 351650, -6495601, 2291902, 14303852, 5462125, -176094, 603980, 6799470, -1657321, -2068027, -1309428, -1107028, -4544076, -2268280, -7642358, -556735, -3526168, -2120640, 9352291, 129386, 5840619, --2374043, 2365453, -614717, 3473018, -1193464, 3230889, -3244311, -4019016, -664109, 1099512, --4049617, -4057134, 334471, 2043331, 4338454, -657130, -2058363, -917512, 4116189, 7021735, -368293, -4832375, -6890202, 68719, 1867237, 689879, 9356049, -5907191, -338766, 4168266, --1571421, -4953171, 6588480, 2996277, 1153736, -3301756, -3549791, -5904507, -2321430, -660888, --3066070, -1556926, -2658585, 470836, 663036, 1437203, 169114, 403190, -3295314, -1727651, --3531537, -1253057, -1033477, -2709051, -1720134, 888521, -330176, -1164473, -322659, 837519, --2217814, 1068910, -1604707, -214748, -679679, -1235340, -440234, -63351, 973347, -1585380, --2323041, 1159641, 602369, 8894340, -6857452, -1407676, 549756, -547071, -272730, -5645735, --4354560, -622770, 3717294, 1344862, 1480153, 1559610, 3906810, -819265, 3570729, 2899640, --9287867, -3571265, -10897406, 2810519, -3853660, 5462662, -3548180, -4811974, -3546032, 2835215, --7272990, -6034429, 8396661, -4608500, 9105868, -2167348, 2720325, -3223910, -6178311, 6769406, --5245229, -5864778, -616328, -3192771, -6912750, -5305895, -8709120, 353261, 5547487, 3207267, --3405372, 9635759, 3501472, -3546032, -4512937, -6977711, 270046, -2616172, -4914517, -2462627, --2105608, -3438121, 1800128, 7711614, -503585, 505732, -5261335, 2454037, 2573759, -4544613, --3646964, 1845225, 9336722, 3737695, -2365990, -1240172, -2010582, -9652939, -7641284, -6407555, -6667937, 7133404, -1078037, -3329674, 3076270, -2124398, 2695629, -1417876, 1254131, 224949, -98247, -3127810, 2054068, -1828046, -1358283, -489089, 1832877, 1410360, -229244, -2610266, -1617592, -376347, 1176284, -881542, -624918, -2303176, -1051730, -80531, -326954, 451508, -403727, -289373, 350040, -1909113, 817654, 194347, 234613, -686658, 2334315, 1519345, --144418, -932008, 191126, -1449015, 2645163, 12802761, -2414845, -15032, -2092186, 8337069, -7903814, 2735894, -13153337, -2179159, -15977278, 9475235, 4006668, 277025, 16517370, 7822209, --1439888, -7382512, 6815040, -3149822, 1700270, 2327336, 1085553, 5426691, -4794257, 9265855, -3532611, 919660, -2786360, -4684199, 6286222, 5308580, -1004486, 3460133, -7858180, 1499481, --10497437, 4311074, 607738, 5387500, -8617315, 1816234, -2804077, 1933809, 9837623, 8348880, -409096, 2434710, -6088116, 8050916, 244276, 17102560, 18066244, -2367601, -4797479, -4888210, --3890167, -10435160, -2909304, -13636521, 845572, -1111860, -741956, -2755759, 4820027, 8111583, -12679817, 11800423, 9082782, -14870251, -10611254, -432718, 768262, 15669114, -10989748, 8435853, --566399, -3121368, -1592359, -346282, -3075197, -8622147, -5641977, -1593433, 2556043, 852014, --194884, -2321967, 1388885, -3029026, -273804, -1590749, 3341485, 3743601, -870268, -661425, -3477313, 2675765, 469225, -468151, 1292785, 266288, 545998, -630286, 1518271, -71941, --842887, -1348083, 465467, 1526324, 2240899, 4817880, 3744138, -1762547, 478352, -3346317, --609349, 1563368, -246424, -625455, 124554, 740345, -4617627, 9197136, 1984812, -6772627, --3738769, 17262548, 16975858, 19024558, -1854352, -788663, -3223910, 3213173, 9314710, 10716480, -3120831, -4581120, -9138617, -18598820, 5535676, -10995653, -2400887, -1104344, -2367601, 1277216, --539555, -3394098, -394600, -10768020, -4258997, 673773, -1980517, -12034498, -5070746, 1060857, -8781061, -2447595, 270046, -9572408, -3221762, 148176, 6376953, -3863323, 3927748, -10699300, --2971581, 2532420, 4089883, -2904472, 14431090, -2924336, -1810329, -7466801, -2458869, 5843840, -1992328, -617938, 7536057, 10456635, 12166032, -2099165, -6067178, -6853694, 112743, 1483374, -2864743, -4850092, 3933653, 5218922, 4366371, 4292820, 12163884, 8245801, 5441724, -603980, -2746095, -12048994, -2255932, 1323387, 6205154, 9847286, -1846836, -5480915, 1736777, 3424700, --2820183, 5072893, 4039417, 5480915, 850940, 2426657, -250719, -377420, -3920768, 3127273, --1220308, 2073932, 1801739, 625992, 2885144, 310848, 4639639, 3330210, 2101850, 1366337, -1309428, 70330, -593779, 435939, -1930051, -76773, -2414845, -3830574, -1546188, 868120, -682363, 1755568, -796180, 1177358, -1600412, 795643, 2054605, -17603998, 21971442, -589484, -3256122, 12027519, 244276, -4182225, 661962, -21380884, -12993350, -6096169, 3455838, -4191888, -2481954, -9986873, 6968048, -3474092, -54761, 13231184, -12840878, -8548059, 12399571, -3853660, --18070538, 1303523, -11126113, 2326262, -886911, 6801618, 2962454, 3437048, 1421634, -2170569, -8092792, -882079, 10385768, 6337224, -3634616, -6191732, -5774584, 2828773, -2815351, 2845416, -2045478, 6100464, 1822140, -11419244, 720481, 3894462, -3905736, 494995, -7837242, -1742146, -741956, 523449, 18146236, -3154117, 12907987, 15397995, -4187056, 8245264, -2486786, -447750, --8515310, 5442798, 13138842, 9153649, 2081449, 3599183, 8162586, -527207, 6773701, -2735357, --3709241, -6531572, 3610994, 16727824, 3790309, -2162516, 1376000, -11762305, -3929895, 279710, -11120207, 8077760, 3539053, 7172059, -2011118, 7043747, -27380, 4430259, 605590, -345745, --801548, 4908611, -477815, -3099356, -1859184, -1234803, -705448, -1253057, -2426120, 3540664, --2251100, -3077881, -843424, -4041027, -2726231, -3451543, -1927367, -2414309, -3038689, 1035087, -770947, 1305133, 1149441, -1840930, -901943, -3191161, -4099010, -392990, -2258616, 1335735, --1056025, 333934, 2078764, 2104534, 1518271, 3628711, -928250, -348966, 2830920, 21039434, -3062849, 5246303, -4973036, -2522220, 14292041, -9432285, -2174327, -18562848, 17392470, 9081171, -1258425, -6308770, -17513266, 1770063, -4654134, 2142652, -19637128, 7003481, 10385768, -11420855, --2720862, 1703491, 1219771, 3794604, 11274826, 13853954, 57445, -34897, 2611877, 523449, --8385924, -9614821, -6349573, -12669080, -6212670, 10783052, 5042292, -4042638, -5326297, -3544422, --22234508, 4827543, 5367636, -10427644, 17075716, 602369, 12743168, -4590783, 8275328, -2733747, --10981158, 983011, 10159208, -5600101, 5590437, 6493454, 18141404, 5004174, 5721434, 17350058, -9941239, 6562173, -23989002, 4959077, 3710315, 4645007, 525060, -9818295, 17447230, -12950937, -9968619, 10390600, -15631533, -3443490, 21480206, -19119584, 3280818, -4497368, -2026688, -6903086, -8389145, -3601867, -7087233, -6113349, 3775276, 8089034, -7530689, 9396852, -7772280, -3446175, -10763188, 3921305, -839666, -4743792, -4972499, -164283, -1945083, -8184597, -891206, -1766305, --2237141, -772557, 6489159, -577673, -5890548, 519691, 2565706, 6114960, 3898757, 4851703, --1908039, 2545842, -3489661, 141197, -1148904, 2536178, 5174362, -3817152, 2413772, 2383707, --212601, 1374926, 1117228, -11361799, -16969952, -7668127, -7270843, -22669374, 14890652, 2056216, -15918759, 602369, 2025077, -8058433, -4329864, 7584912, -898722, 7854422, -8417062, -2915209, -1168231, -3996467, -6941204, 9427990, -10226317, 11293617, -4350802, 3458523, -2790655, -8207146, --7369627, 3069291, -2848637, -408559, 5706401, 22926536, 1391033, -3295851, -8121247, 3022046, -18490908, -3770981, -3338263, -11242614, -4042638, 1254131, -10602664, -4091493, -15011448, 9175124, --18316424, -32956894, -3678103, 738734, 15315317, -16422881, 14696841, 9433896, -7904351, -15520401, --2679523, 2202245, 4206384, 251792, 9209484, -6612639, -2602750, -32518808, -4545686, 32977832, -3018825, -5884642, -4654671, -17541184, 12742094, -5832566, -5135171, -4544076, -2716030, -7753490, --11337640, 3051038, 6180458, -607738, 4663261, -9651865, -17373680, -890132, -9255118, -2861522, -104690, -9213779, 1872606, -6789807, -11714523, -8777303, -4350802, 3453154, 5065914, -1259499, --13819594, -3662533, 660351, -6962679, -3189013, -825707, -6443525, -3917547, 1467268, -528281, --5109938, -2208687, 2047089, 581431, -6727530, -2842195, -62814, 5761699, 6459094, 1541893, --2225330, -2678449, -998580, 4234838, -1181116, -686121, 139586, 1445257, -5686000, 4847945, --1338419, 3190087, 15620259, 13969381, -4265977, -5506685, -1213328, -22041772, 14780593, -13886166, --11407433, -8830453, 5662915, 2374580, 13720810, 1783485, -7256347, -8560944, -8821863, 7108171, --3295314, -4703526, 12559558, 13956496, 4873178, -9208410, 11589432, 18525804, -6873559, -3925600, -16110422, 4204236, 3354906, -10294500, 145492, 15257334, -22199076, 15494631, -3185792, 2181307, -9398462, 11232950, 74088, 5654862, -10365904, -8515310, 5959267, 21270826, 5849746, 5250061, -8195872, -10612327, 2420751, 9482214, 5617281, -1687922, 7748121, 4778688, -12529493, 10392747, --12205760, 2851858, 9235790, -9777493, 7672959, -11948599, -4600447, 2256469, 620623, 7729868, --4735739, 6635188, -4845260, 974958, 2642479, -2194728, -4741644, -9669582, 26141318, 2808909, -7969849, -11281268, -26294326, 18716930, -17817672, -7785702, 77309, -4141959, -2522220, -1554778, --7261716, 4647692, 3920232, 2008434, -6696391, 8505646, 6715718, -2846490, -2741800, 2503966, --2221035, 2353642, -2241436, 9011378, 3490198, 830539, 6567542, 6735046, -3744138, 20401, -3403225, 4670240, 2090039, 2220498, -4074850, -5591511, 4655745, 5790153, 8594766, -1197222, --7483981, -1121523, 911070, 3747359, -11607686, 4408784, -3735548, -1774358, 2952790, 2717104, --2705830, 4046396, 556735, 3201361, -1671279, 7718593, -14532559, 15519864, -5622649, -15217069, --19750944, -5477694, -1948841, 11708618, -17377974, -2741263, -1983201, 9238475, 17396766, 14425185, -9002251, 1435593, -4376572, -2606508, -1715839, 12268037, 10084583, -2286533, 1651415, -2583423, -7915088, -18875844, 11372537, 6309844, 8916352, 3084324, 2105071, 16414828, -6374269, -13821205, -140660, -4493073, 1015760, -19200114, -10611254, -1047435, 16183437, -10803990, -3379603, 2742337, --587874, 561030, 15905875, 6474127, -2395518, 1494112, 7813620, 5218386, 18520436, -5327907, -8492761, 9495099, 5082557, -2885144, 3081639, -19985020, 8650064, -3646964, 972810, -4498978, --10998874, -14750528, 3082713, -6973417, -20129438, 4965519, -17094506, -12502113, -2908767, -25742960, --15613817, 3995930, 11091216, -12791486, 2844342, 1156957, 29770566, 28315646, 26654568, -675384, -1550483, -13859323, -8383240, 11235634, -5947456, -3803194, 1890859, -3423626, 6293738, -7514582, --3751654, -142808, 2424509, -4457639, 5776731, 5891622, 316754, -2312840, 1641214, 5765994, --4499515, -5867999, -1479079, 5207111, -6787122, 11741904, 6725382, -376883, 5321465, -1691680, --4741644, -7475391, -4077535, -6607271, -3600256, 4137664, 770410, 11870753, -2648921, -3556770, --26189100, -28976534, 17293148, 15544024, 5236639, 16840566, 28176060, 8041790, -10699837, 9120900, --4243965, -7905424, 12899397, 965294, -11497091, 7114077, 9291625, 2179159, 3286187, 746251, -1455994, 25811142, -530428, 5558225, 2426120, 16033113, 965831, 25605522, -97711, -11210402, -20470352, 4221953, -9021579, -3152506, 10847477, -2201171, -170188, 8516383, -15527381, 15556372, --3259343, -22679574, -6345814, 2273112, -22698902, -2503429, -2356327, 10032507, 9671729, 17132624, --11969537, 2653216, 2734284, 3600793, 7318088, -10836202, -12251394, 6478958, -288837, 13110388, -10635413, 3331821, 27299886, -4500589, -4180077, -18602040, 27854474, 4971962, 19332722, 11880953, --31054224, 4508642, 2841121, 19099182, -10087268, 8173860, 190052, -8209830, -1012539, -6623914, -15359877, -29343216, -3558381, -2054068, 131533, 1386201, 4737349, 7251516, -91268, 13629005, --518080, -1887101, -4344897, -2763812, 890132, -4664335, 1611150, -1232119, 4108673, 2929705, --1388885, 1190243, -1580548, -8144869, -435939, 464930, 2087354, -8320426, 4490389, -1669132, -4715874, 3774740, 6659347, -6730751, 7780334, -4172024, 2514703, 5666136, 5073430, -1687385, -180926, -3007014, 4391067, -208306, 2138894, -51003, -912144, 11370389, 6339909, 212064, -5240934, 1623498, 5443334, 17149804, -36230732, 21507048, 21883932, -9345312, 5200669, 3036542, -5921686, 143345, 17424682, -12713640, -2742874, -13639742, -111669, -7715372, 1231045, 3647501, --19869592, 8923331, 21599390, -14877767, -14230300, -14558329, 28758564, -12584791, -7046431, 2649458, --9838159, -29819422, 5251672, 21599928, -29680908, -13485124, 10277857, 15902116, 4343286, -4548907, -6896107, -10570451, -4916664, -586263, 14728517, -20244866, -16045461, 11368242, 18496276, 7233262, --23052700, -7512972, 601832, -1113470, -3981435, 12006044, -3548180, 18144090, -14771466, -3277060, -10201, -16998944, 10783589, -19782082, -13529684, 6245956, -8781061, 19130858, 27786828, 16316044, --18302466, 9667971, -5347771, -5553930, -12900471, -4087198, -21055540, 16085189, 11938398, 5686537, -694174, -10042170, -5542656, 6467684, -21971442, 17726940, -4137127, -3089155, 9376987, 1599339, -8548596, -2461016, -1256278, -7585449, -2097018, 659278, 1584843, -5963025, -1990717, -2872796, --2039036, 9936944, 1150514, -219043, -4691178, 4005057, 4071629, -3603478, 2295660, 4523675, -1122597, 7653632, -2657511, -5480379, 1218160, -8901857, 4677757, 3243774, 1250372, -328565, -3634079, -805843, 5869073, 1792075, 4214974, -7053947, -1991791, 6473053, 486405, 2605435, -3467649, -6579890, 1081258, 6652368, 21021718, 35051764, -267362, -26563836, 5609228, -31694174, -5411122, 14369887, 6747931, 1892470, 19030464, 14064944, -865973, -2922725, -26201448, -14133127, -374736, -12277164, 35460324, -6492380, -8056285, -15336791, 1896765, 13320841, 9322763, -507880, -6846178, 10371272, -15748034, 5362804, 30425012, 10755135, -20900922, -14749991, 9872519, -10354092, --1422708, 7390565, -4640712, -17265232, -4128001, 2067490, 28991030, -6303402, 6432788, -7742753, --23443542, 4074850, 29412472, -7939784, -17646946, 5114233, -10810433, 7176891, -6180458, -7204808, -20212652, -5196374, -2313377, 9867687, -17431124, 6267431, 21392158, -8876087, 1835025, -12562242, -37620692, -6863358, 4482872, 12195023, -8743480, -2108829, -10050223, 5262409, -11356430, -9592273, --8959302, 14401562, -19565186, 2861522, -2900177, -5843840, 15202574, 334471, -5197448, -6464463, -791348, 5702643, 4435628, -8715562, -1589675, 388158, -2435783, -10783589, -6488085, -1964948, -2561411, 864899, 862215, 1506997, 8773008, -8866960, 9222905, 1820529, 2657511, 617938, -7310035, -4152697, 12009265, -2646774, -198105, 9209484, 12062953, -6324340, 7881265, -3952444, -2632278, -7010997, 6089190, 5122822, -10434623, -528281, -4185983, -1436130, -5228586, 3759170, --6431177, 5761699, -10212358, -58040576, -20332376, -1046898, 18554796, -9729175, -29046326, -10940355, --4250407, 14235132, 3709778, -3875134, -14361297, 15178414, 26949846, -12227772, 20374788, 5113696, --38565048, 14393509, 18112414, -6350109, -15677704, -2935610, 23778550, 25373594, -2094333, -19232326, -1351304, -2191507, -2480344, -16026670, 3971234, 7319698, -25428354, 17563196, 14932528, -17933636, -3333968, -20120312, 7138236, 49196168, -43939664, 45485316, 20586316, 2063195, 27827094, 13834090, --28437516, 17113834, -21379274, -4787278, 23390392, 1107565, 6714108, -11935177, -20818780, 63392644, --14872935, 932545, 24989730, -12046310, 4893042, 1925756, 15448460, 35720708, 33946348, 32130650, -2023467, -607738, -5143224, 1650878, -8653822, 2430952, 27269822, -7196218, -9429064, 2745558, -3793530, 15839839, 18451180, 5275831, 5192079, 13115220, 5588290, -9976672, 3288871, -5135707, --14778446, -6624987, 7806640, -11132555, -16044387, -12179454, -534723, 1496796, -9186398, 4753992, -10452340, 1647120, -3346317, -595390, -11716134, 13943611, -2018635, -3006477, 9665287, -7938710, -6580964, -5935108, -4743255, 16408386, -27380, -12129525, 15556372, -9503689, 9392020, 4416837, --6058052, 4708358, -2107218, 11340861, -5147519, 3980361, 593242, 979789, -1165010, 12070469, --6146098, -1377074, -834834, 2177549, -1711545, 5284958, 14854681, -3930432, -42831024, 19451906, --31119722, 43751760, 5154498, -38045896, 8571144, 340913, 17852032, 8432095, -9225053, 32379758, -7885560, 1651415, 21600464, -17275970, -24055574, 794569, 12562779, 43641700, -6161131, 124017, --4594005, 31457952, 3399467, -24962886, -14789720, 4743792, -2792803, 13937706, -24300924, 11678553, -3930969, 7208029, -2201708, -9464497, 5490579, 9778030, 63888, 29237990, -47144784, 4142496, --16654809, -10300942, -6120329, -34417720, -50096500, -51782272, -37710888, 4027069, 142271, -30020748, --294742, -5443871, 3186866, -18615462, -48278652, 47556024, -909996, -6982543, 9620727, -47106128, --3302293, -11699491, 8782671, 13886703, 64666100, 48285632, -5480915, -552440, -1600949, 12757127, -19496468, 11919071, 8850854, -1770063, -7900056, -45820320, 8578123, -900869, -17976048, -7974681, -29870424, -4165045, -5560909, 14350023, -1311039, 15737834, -6205691, 7930120, -982474, -3226594, -10971494, 13591424, -6292664, 1957968, 5881421, -2476049, 2706366, 758062, -293668, 9305047, --4055523, -4639102, 7516193, -8875013, 11704323, 2147, 6262599, 9938554, -5103495, 2520609, -8441221, -1987496, -5808944, -2009508, 802085, -1479616, 2182917, -11571179, -914828, -9144522, -9535901, 1538672, 6356015, 4731980, -1583769, 387621, -836982, 4537096, 5845451, 5068599, --12159589, 58932320, -56114284, 9695352, -10749229, 2247879, 23847806, -17277580, 6018323, 971200, --60714732, 1574642, -6742025, 3018825, 7107634, -27093190, -10044855, -44895832, -11506217, -2130304, -2542621, -16955458, -12707734, -19522774, -8078834, 19492710, 4322348, 39307004, 9698036, -13213467, --13834627, 24175298, -26736708, 46224584, -35982164, 10564009, -29011430, 657667, 27865748, -50394460, -47623672, 8451959, 5588826, -34587908, -6830609, -6513855, 98784, 16685411, 16692390, 20987358, --39901320, -949725, -15628849, -13567265, -15297600, -21502216, -14813879, 817654, 23015656, -24405078, -6694781, -44987100, -14969572, 11461120, 13524315, 2505577, -51147692, -27666032, -18154290, -26040924, --21515638, 1891396, -16925392, 27350352, 8302172, 13746043, -9342628, -14053133, 45830524, -15244986, -12409234, -9100499, 3682935, 34426312, 4726075, 6295349, -19098108, 19609210, 11467026, -7963943, -18255758, -13495324, 5137855, -4937065, 12410845, 2572149, -3947075, 6773701, 15773804, -5219459, -5155572, 5684389, 4837207, -1722282, 4371740, -2094870, 10888816, -3411278, 1956358, 10292352, --1929514, -3799972, 3307125, 4548907, -6802155, -1381906, -19216220, 12332999, 8491150, 249645, --10568304, -4221416, 1162326, 4252018, 15005005, -2229625, -3841312, 5360119, 4015795, -2015950, -15188615, 3049964, -18036178, 4992900, 18277234, 25606596, -47421808, 72998336, -54465016, -5488968, --32755032, 6787659, 983011, -19688130, -27981712, 33326262, 22473954, 10657961, -14156212, 14860587, -4788889, 31484258, -24435142, -16042240, 19652696, 32720134, -41135588, 16988744, -1235340, 19945828, --14679124, 6021544, -18105972, 4036196, -34132640, 11533061, 37091336, -976031, -2601140, 46056008, -8207146, -20868172, -44515188, 38516192, -20000588, 17509508, -16201690, 45994268, 20402706, -4779762, -4920959, -26227218, 3752728, 11639361, -12575664, 13029320, -55143620, 21973052, 50417548, 39510476, --21520470, -22292490, -22454090, 25666724, 2260764, -7794829, 2261300, 65102040, -31431644, -14504105, -25311316, -21328808, -58341764, 25138980, 13291850, -41567232, 23678154, 40801116, 35953172, -10646150, --15790447, -28258200, 15499463, -17329120, -11087458, 26288422, 17892834, 8331700, 23003308, 13171054, --8648454, -7926362, -29266980, 7177964, -12195023, 10512469, -10741713, 21318070, 14674830, 3524558, --3780108, 20291572, -10760504, -1225139, 2734284, 7994545, 4780836, 9557376, 8614094, 1024350, --4680441, -2530273, 7246147, 4092567, 2990371, 1325534, 11318849, 36531920, -971200, -2503966, -5523865, -12212203, 4567698, 13388487, -18544596, 8575976, 9743133, -6766721, -5137855, 8884140, -4871567, -10378788, -46938624, 25035364, -2776160, 6518687, -17227650, 15001247, 278099, 8225936, -2454574, 2724083, -9822590, 7472170, 25339234, -32410896, 27805618, -4752382, -17176648, 5740224, --11709691, 7558069, -11999065, -9783399, 8164733, -25829934, -2738042, 34463892, -49811420, 14057965, -2274722, -8283382, -15384573, -18036716, -11864310, 36178656, -29868276, -4210679, 11562052, -30175904, -7549479, 16656420, 10972031, 5749888, 5097590, -16981764, 13291850, -44397076, 481573, 39023536, --16429324, -4285841, -8888972, -10889353, -468151, -31378494, 16523276, 12759274, -26196616, 24536612, -6630893, -29553134, 12029667, -5635534, 21342766, 18895708, -27786290, 9778567, 30467424, -28732794, -15964393, -20412368, 15993384, 18914500, -29529510, 16680579, -2327872, -15368467, 22157736, 1357210, --35490388, 11026792, 15465103, 4930086, -10038412, 1910724, 26504780, -12156368, -25236690, 26823144, --1364726, 2240899, -1401233, -3124589, 16123844, -11980274, -6105833, 11826192, 4182761, -2600066, --12237972, 17923972, -6973953, -11314554, 697395, 9569724, -5816460, -4009352, -3038689, 14093398, --11050414, -5274220, 709207, 7803419, -6930467, 5694590, -557272, 14017163, -8966281, 2510945, -839666, 1700807, 24089398, -8378945, -106415864, -234564272, -92240864, -155486400, -212211120, 81916304, -29929480, 70902392, 318740256, 265725872, 175572896, 273875584, 186482656, 23269596, 47242492, 34529388, --144333984, -92707408, -63526324, -165281072, -168730480, -45921792, -46419468, -104464880, -30429844, -21673478, --126058904, -108241232, -34498788, -59095528, -119012472, -28282896, -19160386, -93015032, -9922448, 66413080, --27414776, -21930104, 97543536, 60239064, -38458748, 86545200, 142094160, 16731582, 80344880, 174187232, -85668488, 44741748, 187810336, 137587664, 102572944, 227844800, 307889568, 243753360, 282925600, 366358016, -239577040, 157158224, 205816976, 132957152, -35803384, -8074002, -89920512, -224297152, -317518880, -341648000, --457647008, -520731488, -552917952, -534852288, -513977664, -511009856, -426680320, -326364352, -306217760, -199535056, -16931834, 85929944, 111173616, 335034304, 328798016, 227063104, 334043776, 306245664, 166558832, 161895568, -213347136, 129408440, 61351996, 149486880, 152477248, 68977712, 123349848, 185794384, 123454536, 73828344, -158160016, 131148976, 26970784, 80641232, 116485952, 13713294, 22687628, 127436512, 78206520, 42454676, -135013376, 133860168, 49293340, 106783624, 92249456, -23176718, -65720516, -68127312, -157736432, -213777696, --211134144, -243776432, -268844544, -278795456, -272988672, -280032416, -311534912, -322285760, -308402816, -344053184, --294648704, -200646384, -153515552, -52246128, 88911728, 186234080, 272623584, 352035936, 357820704, 306426592, -278176992, 228533056, 172809088, 139306192, 116966992, 94453312, 73554000, 66612260, 61385820, 45123464, -37513856, 33026152, 15964930, -3494493, -15859704, -34508452, -52265992, -54976120, -43868260, -32267016, --24082956, -21229486, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --3984119, -2426657, 3886946, -1370095, 3454228, -561030, 3645890, 1834488, -801548, -1427540, 3693135, -312459, 736587, -4197794, -673236, -301721, -187368, 5740224, 2804077, -208843, -4306242, --3131031, -1852742, 526134, -98784, 1243930, 2638721, 804233, 973347, -4345433, -668941, --4229469, 169651, -2338610, 2769717, 2766496, -1103807, -2281702, 2895345, 620623, -1087164, --3910031, -531502, -2507724, 701690, 2392297, -3968550, -1935957, -664109, -1551557, 10126996, -2413235, 5845988, 426276, 1917166, -42950, -2927557, -2713883, -3456375, 1633161, -2851858, -2051384, 62814, 2503966, 2559264, 6219113, 1874753, -514859, -316754, -3693135, 6021008, -5542119, 966905, 1709397, 1567663, 1715303, -353798, -3091840, 918049, 1788854, -1165010, -517544, -955093, -2826089, 1341640, -2357400, -1604707, -734439, 183610, -1054951, -1148904, --1343788, -34360, -75162, -216896, 270583, -477278, 898185, -506806, -841277, -88047, -1126892, 417686, -463856, -1523640, -448824, 1395328, 92342, 624918, 552977, 13995151, --3311420, -2928094, -1137093, -2772402, 642098, -6654515, 518617, 1324461, 338229, 4521527, -517544, -934692, -3995930, 2557653, -5632850, -4856535, 1752884, -2369211, -1132798, -840203, -938450, 3795677, 5195300, 389768, -806380, 6175626, 2226404, -360240, 224949, -2524904, -77846, 6778532, 2684, -3151432, -2548526, -732829, 2299955, -3138011, -3867081, -3950833, --3231963, 3092913, -3040837, 1156420, -3694746, 1299228, 4472672, 291521, 3178276, -1352378, --2522220, -1248762, 2204929, -135291, 3412352, 4990215, 731755, -1510755, -2582349, -130997, --382252, 227633, 158377, -4401805, -464930, -2057826, -2238752, 2131378, 452045, 1367410, -1620276, -5237713, -2918967, 2168959, -979789, 3868155, 702764, 3258807, -666794, -833224, --900869, -1897839, -445066, -2090039, -840203, 57982, 3051574, -738198, -68719, -529892, -966905, -28454, 1176284, 233539, -257161, -772020, 947577, -1500017, 6979, 76773, --851477, 701153, 897648, -1267015, 424128, -626528, 545461, 528281, -3758, 897648, -96100, -469225, -9992241, -4937065, -2165737, -6834904, -2381559, -6562173, 1906966, -594853, --4095788, -4720169, -720481, -3859565, -113817, 3171297, -261993, -5861020, -2190433, 66035, --2306934, -1913408, 1668058, 5483063, 7030862, -1156957, -1906429, 3941706, 4482335, -1424855, --1068373, -918049, -3205119, 948651, 1445257, -2886755, -2171106, -687732, 2697240, 6002217, -370441, -2048699, -20401, -3056406, -1142998, -4847945, -2295660, -2162516, -7659001, -831613, --3489661, -2426120, -8406325, 5183489, -3673271, -3255585, 1466731, -541166, -628139, 1078574, --6988986, -1828582, -2521146, -571231, -4046396, -568009, -1919314, 1828046, 2393371, -2285460, --1235340, -3347390, 1155346, -514859, -705448, -6442, -5182415, -137976, -4686346, 700080, --341450, -1483374, 1350230, 5652177, 2675765, -1347009, 282931, -1003949, -2228551, 206158, -852551, -1119913, -183610, -1384053, 12348, -576599, -1733019, 676994, 634045, -1809792, --867583, 479963, -780610, 236760, -1199370, -923955, -979253, -1690070, -1847910, -148176, -438624, -936840, -1125818, -8053, -545998, -237834, -620086, -17717, -363462, -619012, --1530619, 802085, -557272, -727997, -758062, -18480170, -1451699, -9104257, 8192650, -4735739, -14740328, -9415642, 9295383, -8344048, -493921, -112206, -6430103, 5021891, 192737, -2385854, -1517734, -2085744, -834834, -6257231, -49392, -4717485, 3757560, 1327145, 4597763, -2674154, -6855305, 6179384, -5972152, 1701881, -5076652, 5432597, 59056, -3762928, 326418, -512175, --186831, 3993246, 591632, -5883032, 2445447, 4271882, -272194, 5041218, -2325725, 4115116, --6114423, -3091840, 4024384, -3497714, 1024350, 5427765, -4909685, 8008504, 3165391, -7860864, -1924682, -7571491, 2740189, 4261145, 2870112, 4103841, 5873368, 2005750, -714575, -447213, -395674, 1884417, 4223027, -1430224, 7973607, 1571958, 5465883, 2992519, 1592359, 419296, -5483600, 1016834, 1365800, -3109556, -4267587, 2210835, 2961380, 353261, 4714801, -525597, --32212, -838056, 5597416, 1724966, -1993939, 1303523, 958851, 841277, 1910724, 328565, -3484829, -508417, 1203128, 695785, 1335198, -842350, 667867, 367757, 82141, 348429, --1182190, -1028645, 443992, -1275068, -581968, -1385127, 913217, 20401, 12213276, 68719, --3323768, -1114007, -4555350, -5438503, 8919036, -1730872, -1298691, 8186208, -634045, -1579474, -3619584, 6371047, 1816771, 3165928, -163746, -6949257, -1843078, 5228586, -7924752, -7844221, --2944200, 1723356, -5589363, -3353296, 108448, -777926, 5486821, -2111513, -1207423, 5794985, -8048232, -6971806, 1819992, -1656784, 2933463, 810138, -3102577, -666794, 3343632, 5143224, --1385127, -7238094, -1637993, -630286, -1919850, -3607773, 518080, -450435, 1312649, -988916, -999654, 6782290, -5017059, 658741, -3823595, -3082176, -5252745, -1570347, -3039226, -7237557, --270046, 507343, -2832531, -544924, -2997887, 2807298, 3510599, -542777, 1036698, -2599529, --736587, 8763344, -1170916, -3617973, -11895986, -5399848, -170725, -4049617, 2727304, -1141388, -1006633, -3221, -2404645, -440771, 3443490, -2913062, 662499, -814433, 317828, 16643, --2507187, -1832877, -1067299, -1911261, -403727, -3031173, -654446, -1715303, 315143, -1194001, --415001, -1630477, -1788317, -1727651, -468151, -177167, 600222, 455803, -261993, 503585, -380641, -86436, 1673964, 1480690, -47245, 881005, -725850, -914828, 184684, 15832323, -17791902, 3386582, -6470905, 4053912, 7016366, 7037841, 3972308, 5317170, 2382633, 8703751, --878321, -1061931, -3544422, 5465883, -3197603, -7655243, -10550587, 1221381, -5056787, -4349728, -3739843, -1101659, -2801393, 8894877, -630823, 11048803, 124554, -4350802, -2975876, 3886409, -2580739, -2160369, -8731132, 12620225, 7297150, 89121, 6842957, 4097936, 4453881, -4115116, -5027796, 2580202, 1020592, -1502165, -2237678, -5536750, -7830263, 2241436, 3810710, -6087043, -2468533, 5305895, 7890392, 2113124, 7130183, 3332358, 6077379, -8876087, 2664490, 853625, -1808181, 259846, -590021, 3819300, 3457449, 3379066, 4878546, -1566053, 2381023, 1436130, -7010461, 8600672, -4306779, -5029407, 789737, -2025614, -4525822, 1951526, 4763119, -2882997, -2032593, -8517457, -6263673, 1495722, -4314832, -1996623, -1377074, -3843996, 40802, -4832, -521839, -45097, 1729798, 2065879, -105764, 1068910, 380641, 1576253, 1652489, 72478, -152471, -52076, 1804423, 950262, 1012002, 2244121, -346282, -1064615, 1684701, -420907, -28991, 2570001, 1586990, 2436320, 3294240, 563178, 1497870, 933082, 2195265, 14540075, -4598836, 6422587, -5314485, 2110977, -13156022, 712965, -9502078, 7206955, 4853850, -4001836, -6072547, 3449933, -6429029, -1593970, 9322763, -300111, 6424734, -1752347, 1302986, 7430294, --9220758, -708670, 1530082, 2717641, 636729, 2989297, 409096, 9009231, -4154307, -2587181, --2699387, 6811818, 888521, -3198140, 4160213, 11485816, -7994545, 1419487, 1572495, -697932, -4664335, -2323577, 8803072, 2947958, 2251100, -7196755, -681826, -1910724, 4101694, 3055869, -4429185, -4946192, -3190624, 4174171, -8579734, -4833449, 1994476, 9259413, 5658620, 8186745, --8894877, -2840584, -9038759, -2364380, 2800856, -788127, -8523363, 1110786, -5203890, -90194, --9329206, -11382737, -4590247, -8222178, 523986, 2881386, 1688996, -3529926, 4591320, 7264401, -2102923, 2127620, 4251481, -1341640, -6924024, -451508, -4742181, 2487860, 865973, -499290, -1369021, 623307, -5049271, -2647847, -1384053, 2535641, 444529, -1829656, -539555, -191663, --670552, 387621, -962073, -513249, 442919, 2299955, 678605, 719407, 616328, -497679, -780073, 1519345, 898185, 1989107, 702764, 1007170, 218506, 1563905, -2406792, -17141752, --15458661, -11124502, 3373697, 3416647, 12809203, -5685463, 12164421, -4996658, -20118164, -1811403, --1889786, -7799124, -13024488, -4772783, -306553, -8041253, -91805, -12359305, 878858, -13028246, -7421704, -3301219, 5399848, -2580202, -256624, -4071629, -4719632, 7998303, 1547262, -2371896, -9080098, 985695, 1437203, 3092913, 8353175, 7326678, 5583995, 103616, -9954124, -1075352, -4735202, 1404454, 6049462, -2959233, 2676838, -14614700, 4573067, 8741869, -11070815, 6448357, -2234457, 10347113, 7914551, -75699, -2785286, -315680, 7015829, 3417183, -9342628, -7631620, --12903155, -6293738, -8677981, -2028298, -10727218, -2348810, -3632469, 10806675, -5129802, 5301064, --2875481, -1669669, -3602404, -7603703, -4079682, -2499134, -2563559, 6769942, -20649130, -4473209, -9569187, 355945, 1785096, 5066988, 9689446, -6209449, 1100585, 2499134, -520228, -186294, --1496259, 2575370, 3965866, -1859721, 258235, -491237, 4437238, -1770600, -207232, 4440460, -855235, 1497870, 2026151, 2029909, -823023, 278099, -1292248, -1868311, -1078037, -3231426, -825171, 1942936, 1336809, 714038, -4147865, -92342, -621697, -300111, -1988570, 1020592, -1738925, -1094143, -280247, 2042794, 2205466, -22512608, 17440252, -4793184, 10349261, 6059662, --324807, -14860587, 11872900, 1694365, -945967, 7530689, 5365488, -6087580, -17717, 12776454, -4296041, -5647345, 9089761, -4846334, -3881577, -2637647, 2972117, 141734, -1564442, 1301375, -3942243, 3532074, 3630858, -9265855, 5851893, -7685844, 10640245, -6494528, 10590316, 3457986, -1078037, -10239202, -10406169, -3402151, -3419331, 12306155, 3531000, 9855876, 4175245, -8672076, -404264, -1921461, 4265977, 306553, 3764002, -1026497, -5813775, -3378529, 6277632, 15568720, -11245835, 1319092, 3907347, -1064615, -2109366, 8012799, 6737730, -2794413, 9883793, 13909788, -19430968, 469225, -11039140, -13320841, 4728222, 2480881, -496606, 3419331, 132607, -4230006, --432718, 11759620, -2065342, -5056250, 20908974, 5323612, -3457986, 6190122, 212064, -154619, --586800, -3239479, -396748, 6406481, 3218541, -1964411, -2976949, 4517769, 3676492, -217970, -8542153, 2527588, 1676111, 1003949, 3881577, 1551020, 3642669, 2547989, 1330366, 809064, -4570382, 2590402, 2479807, 770410, 4539244, -454193, 1837709, 2772402, 1941325, -224412, -5064304, 5821828, 1860795, -767189, 6039261, 624918, -2615635, -299574, 4451734, 418222, --221728, -718870, -635655, 423054, 1279900, 3015604, 10501732, -15330886, 12924630, 5326297, --10466835, 24552180, 3701188, -12504797, 2915746, 6856916, 667331, 4961761, 17619566, -16809966, -11004243, -6777996, 9761924, -3680250, 2094333, -15560667, 2665027, -1651415, 6283537, -5935645, -884763, 1245004, 175020, -9107478, 8799314, 978716, -943282, 4197794, -1745904, 4139812, --2173790, 12451110, 9781788, 12328167, 12204686, -1904818, 4265440, 5357972, 541703, -6335077, -8628052, -10153303, 3156801, 10227391, -6038187, 5460514, -11341935, 3710315, -996432, -2605972, --989990, 964220, 3490735, 3470871, 11927124, -7732015, -398358, 8009577, 16996260, -14975477, -3844533, -3594351, 5148055, -2659122, 24823838, -15178951, 5428839, -8403104, -4759361, 2345052, -2565706, 1504312, -21769578, -11324218, 17916456, 9978820, -2017561, -9569187, -11285027, -4308926, -3963181, -11937325, -6650757, 6105296, 3272765, -86973, -405338, -8296803, 1517734, -2293513, --3257196, 4045322, -2152316, -2433099, -1072668, -7221988, 2429341, -1732482, -2601677, -2502892, -3275450, -3376918, 4006668, -445066, -1162326, 1610076, 1338956, 5522254, -5598490, -954557, --4297115, -671626, 2518998, 2237678, 6825777, -2057826, 3690451, 1095217, -2720862, 11457899, --15131707, -3231426, 21337398, -6439230, -452582, 11418707, 2662880, 7036230, -15968152, 15269146, -971736, 1116155, -4072166, -9618579, -1344862, -1511829, -10297184, -6226629, 11368242, -3649649, -2163590, -5620502, -25071872, 8452496, 1115618, -7765838, 4760971, 9673877, -932008, 1043677, --1981591, 2411624, 6553047, 2063732, 10543608, 7206419, 1632088, 9207336, -7464653, -7360500, --10460393, 3912715, 6012418, 1724429, -16579648, 4663798, -14169097, 20467130, -4881767, 7253126, -17467632, -6925635, 11091216, 2740726, 12077448, 4838818, -5858336, -17986786, -12905840, -10078141, --1403381, -10578504, -2124398, -9252433, -6001680, 18020610, 3896609, -7735773, -6852084, 3605088, -6691559, -1607392, 2603824, -32871532, 13201119, 2197413, -10547366, -12986370, -3391414, -21725018, -2327872, 10737418, 1178969, -9359807, 5745593, 4809827, -7668127, 3790309, 2269353, -1953673, -245350, -4947803, 1280974, 1660005, 1261647, -6436009, -3506304, 2581275, -4012036, 878321, --2425046, -1590749, 1534377, 5341866, -6837051, 2335925, 5305895, -6407018, -5995775, 745177, --5502927, 1220308, -3655554, 3750043, 2050310, -6416681, 3568581, -4230006, -2714419, 4352950, -1016297, 9852118, 3062312, -60130, -622233, 731755, -2595234, 7099581, -20359218, -24948392, -14945412, -12293807, -14292577, -4144107, 9353902, 19340238, -12859132, 955630, 9172976, -2869575, --4102231, 4910758, 3176665, 14513768, 4813585, -14136348, -607201, -7217156, -556735, -8439074, --11075110, 1599875, 10936060, -902480, 4838281, -9226663, 2605972, 10790568, 8365523, 1180579, -787053, 6705518, 6381785, 4015795, 9885404, -12701292, 13737990, 9838696, 3324305, -10517301, -688269, 7926899, -8315594, 9225053, -6619619, 10461467, -2899103, 13690208, -21760988, 22907208, -5310727, 21595096, 1313186, -4701379, -1604170, 7730405, 425202, -18229452, 617402, -1396938, --18894098, 5828271, 13262859, -17954038, 14768245, -15819975, 4793721, 5945309, 3156801, -19770272, --9591199, -9766756, 1787243, 1342177, -11589432, -16950626, 3176128, -14923938, 9982041, -7269769, --3997004, 4963909, -9357123, -7248831, -9599789, -4024384, -5409512, 169114, -7706782, -5773510, --7045357, -10349797, -5117991, -2261837, -2454037, -2711735, -3129421, -2110440, -5021354, -5458367, -3383897, -6509560, -3629247, -1762010, 4779762, -2531883, 3221, -8280697, -6041945, -2786360, --315143, -1978906, -7133941, -1090922, -763430, 5539971, 3481071, -4714801, -4474282, 801548, --2469606, 4054449, -2511482, 2115808, -4485020, -11515344, 17443472, 3520263, 11479374, 11126650, -3122978, -8591545, 1893007, 29444148, -20253992, 4872104, -3565897, -11059541, 653909, 3953518, -4748087, -140660, 67646, -5801964, -8509941, -13238700, -6695854, 10001368, -8393440, -13300977, -7644505, -4766340, 2929705, -1759326, 5939940, -5661304, 12524125, -4517769, 1352378, -281857, -1321239, 11547020, 3924526, -5356361, 6152541, -4901632, 9456444, -5686000, 3877282, -13533979, --9898289, -7247221, 2362769, -6759742, -11812234, 4978941, 8751533, 2574296, -6284074, 4051228, -6180995, 7036230, 18924162, 26126822, 35485020, -3584150, 5655935, 8607651, 5015448, 4834523, -5703180, -7204271, 14081050, -1925756, 18382996, 22752590, 16642461, 6823630, 9368397, 3219078, -31733902, 9219684, -5810554, -4929549, -4511327, -1711008, -2042794, 1804423, -2533494, -5802501, -5307506, -9256191, 2792803, -1978906, 2946885, -4515085, -3733400, -2761127, 7196218, -6830072, --6739878, -315143, 2967286, -3340948, -8652748, -2681133, 498753, -3911642, 4621385, 8978629, --4996121, -340913, 1865090, -642635, 2950106, 5332202, -2368138, -5790153, -991064, 3206730, --2938831, 8217346, 9473624, 6070400, -2690260, -6095096, -814433, 9571871, 1088774, 67646, -4170413, 1636919, -49392, -1208496, 2347737, 2708514, -6229850, -276489, 35423280, 28350006, --12381854, -5713917, -14765561, 8472897, 4130685, 17324824, -3068217, -7555385, -3412352, -11288248, -2525978, 389768, 16363825, -6175089, 6097243, -22084184, 12136504, -1777043, 8541616, -157840, -7741679, 1268626, -12544526, -6527814, -10759967, -8227547, 9066676, 21792664, 9523016, -2658048, --6769406, -357019, -1829656, 5387500, 7392176, -14038101, -265214, -4938139, -4663261, -15241765, --11703786, -24659554, 468151, -1307818, 8879845, -7445326, 15781320, -12051141, -5251672, 31473520, -31267898, -21688512, 4851166, 18037788, -10489921, -5102958, 9347996, -3569655, -13178033, 35005056, --8705899, -53404160, 17772038, -778463, -27448062, 20932596, 22484690, -8059506, 15755551, 19877108, --9401147, 600222, 12713640, -13835163, 5793911, 10903848, -19608674, -2816962, -6431714, 955630, --7141457, -8590, 2812130, -8432095, 6759205, -9761387, -4375498, 4563940, 9564892, -5609764, -610959, 1772748, -1357747, 3091303, -6866042, 10070625, -5113696, 10640245, 10530186, -403190, -625455, 6933688, -5098663, 1377074, -186294, 8717173, -6555194, 5215164, 1740536, -20973400, -4126390, -2772402, -3801046, 944893, -474057, 2039573, -11627550, 1411971, -2938831, -10566693, -1903207, 17591112, -16605417, 5296769, 9898289, -14501420, 71404, 7590818, -13328357, -6648073, -2406256, 6136972, 11695196, 5639829, -9622337, -1865090, 8625368, -10114648, 9930501, -5098663, --12921946, 11421392, 5848672, 5623723, -3320547, -3353833, -4655208, -760746, 9586904, -20193862, -9848360, -561567, 16610786, -10701985, -88584, -13273060, 5592585, -21512418, 2236067, 807454, --8626979, -6585259, 3299609, -14532559, -24986510, 14916421, -1527398, 4384088, -14835354, 8869644, --2516314, 9541807, 10242423, 5009006, -10507637, 8429947, -5113159, -2415919, -19353122, 2624762, --13816910, -15138149, -22028888, -9125195, 3359738, 5927055, -22736484, -11307038, 1070521, -8231305, --30485140, -24201604, -24881820, -5272073, -14937359, 12958453, 18304076, 4915053, -18438832, -21352966, --24884504, -2462090, -1989107, 13342853, -12096775, -20769388, -10297721, -13885092, 4507032, 99321, -4715337, 2305324, -6976638, 1306744, 4858145, -5492727, -2432025, -4679367, -3031710, -3427921, --6790880, -471373, 7968238, 113817, 2183454, 2218888, -1623498, 5972152, -4197794, 9323300, -8298951, -3525095, -7859254, -544387, -3153580, -4436701, -5028333, -4430259, 6621229, 138513, -6221260, -6885907, -7525857, -1497333, 3323231, -11847667, 1777043, 1011465, -8791261, 1711008, --7281044, -15429133, 9170292, -3806415, 925565, -2695629, 1353452, -7968238, -2287607, -15480136, -26925150, 29920890, -7077569, 20207284, -5610301, -7770133, -7721815, 19681688, -16955458, -3796214, --8009577, 31157304, 1295470, 11481521, 4204773, -2769717, 15612743, 8811125, 12808129, 4146254, --1833951, -5275294, 12264816, -1860258, -11747809, 15006616, -259309, 13165685, -14384382, 10304700, -3747359, -14606647, -11259794, 27157616, 17666274, -1474248, 9822053, 8269960, -17005924, -11059541, -5822902, 4512400, 12142409, 1695438, 2779918, 4888210, 14784888, 6235219, 3903052, -14377940, -40492952, 27303644, 3257733, -17933100, 9172976, -5888937, 5171678, -3933653, 8789114, -5716602, -1509681, 22489522, -15278809, -7214472, -20585778, 6023155, -5499169, -3408057, 19094888, 6203544, -2545305, 1872606, -7683160, -15221901, 11317776, 220654, 348966, 12259984, 12050068, -709743, --8655970, -9934796, 19719806, -1798518, -1039919, -3566970, 14846091, -939524, -10210748, 7007239, -5568962, 9490804, 4291746, 3519726, 13711146, -2525441, -4905390, 5021354, -273804, 824097, -1259499, 6533719, -3464428, 246424, -4436701, 1762010, 6604049, -2762738, 1593970, 8519605, --2872260, 2058363, 6008659, 714575, -1603097, -12395276, 8269960, -6798933, 5421323, -8174397, --1853815, 3743064, -5353677, -1806034, 12085501, 9118216, 1024887, -1545115, 11283953, 2588255, -5373541, 5356361, 2510409, -1683627, 4825396, -9709847, -21046950, 54731840, -61380452, -7084549, --32293322, 39696772, 10720775, 7017440, -15394237, 3734474, -12553653, 35561256, -6224482, -2265059, -3703873, -1745367, -13836774, 5330055, 8146479, 10765872, -23923504, -12583717, -12282533, 4938139, --7186554, -6447283, -689342, -210453, 15831249, -8113193, 869194, 11906723, -1391033, -15819438, -2086280, 12528420, -1400696, -24944634, 18751290, 2247342, 446140, -34360, -10425496, 8231305, --46062988, -32235878, -4387309, -11544335, 2213519, 3531000, -21505438, 33996812, -13345000, 46833396, --6484864, -16405164, 16172162, 2674691, 14452565, 21680458, 7019587, -22289806, -6030134, 25028922, -58273044, 1918240, -14705431, 24210194, 2259153, 28554554, 4791036, 38659536, -9808632, -1570347, --863825, 9011378, 1520418, 14835891, 27373438, 1584843, -5552319, -4880694, 8861054, -7415261, --2966212, 17704392, 13180718, 1906966, -3096672, -6739341, -7290707, -4649839, -5881958, 12735115, --7679402, -5573794, 6576132, 2211371, -2184528, 5655935, 6772090, -3704946, 5851356, 9002788, --4437775, 507880, -12604118, 16165720, 199179, 12975633, 1154809, -13751948, 378494, 1296006, -3883187, 1333051, 301185, -11851962, -10545218, -796180, -5997922, 8497593, 3492345, -4161287, --68183, 6638946, 1734093, -4101157, 736587, 4750771, 413391, -2565706, 2226404, 79898200, -24674588, 8687108, -2698313, -8769249, -11677479, 25972740, 23789824, -27792196, 16206522, 12277164, -2631741, -8507256, -14882062, -37839200, -14345191, 11885785, 3690451, -12279848, 22519050, -7551626, -8973797, 8949101, -5739687, -5489505, 23502598, 464393, -9286256, 14668387, -13185013, 28981366, --14540612, -8839580, -1845762, 11203422, 5770826, 29313152, -9332964, -17795660, -6537477, 7627325, -1750736, 15627239, 4060355, 1218697, -6702834, 12558484, 55051816, 23351738, -20852604, 17580912, --11078331, -16974248, 13357348, -788663, 3683471, -1297080, 9534291, -14851460, -22606560, -59310816, --15871515, 20892332, -8126615, -20497732, 8551817, -4939750, 8512088, -23896662, -21081846, -10002442, -8576513, 9198209, 27870580, 4734128, -2326799, -22310208, -31587336, -4124779, -14396730, 2483028, -10911364, -15137075, -15667504, -3542274, -19408958, -32042604, -10938208, -8699456, -17367774, -4217658, -9068287, -9128416, -5060545, -10458782, -2759517, -22910430, -14816563, -14687714, 20401, 1835562, -7798050, -12936441, 6732898, -17355962, 311922, -10333154, -1712081, 5018133, -5690832, 7754564, --22882512, -4741644, 7227893, 2913599, 6605123, -3148748, -6569690, 10705206, -2625299, -2594160, -7231115, -11539503, -9378061, -1970853, 1651415, -15219753, -7559680, -8444443, -5019206, -1601486, --683974, 928250, -7220914, 328565, -12486007, 17802640, -14169634, 48931488, 41087804, 19277960, --11148661, -17138530, 29390462, 25200184, -32877974, -6611566, -20114406, 28394028, -4718022, -40101572, --17421998, 14403710, 25223270, -46370616, 18743238, -32076426, 12021077, -18902152, -4806606, 22450330, --7418483, 3499325, 14400488, 29885456, -19376744, -32617592, 7450695, -2482491, 3691525, 30631170, -7827041, 22881976, -28744606, -5242545, 9405978, -25680146, 42248520, -4827007, 25376814, -3437048, --5767068, 20782810, 20844014, -11816529, 46530064, -10777147, -20024748, 22459458, 40008156, 2346126, -7384660, 2017024, 17744120, -18663244, 14271103, 60564408, 27997282, -1807108, 26599806, 32632624, --23926190, -73909408, 5797132, 44705776, 50633908, 13882945, -4658966, -21719650, 26394722, 55794848, -26225070, 13667660, -54363548, 10385768, -30690762, -19180250, -47889960, 40993852, 9156333, -14025216, --18888730, 14467597, -13571023, 7872138, 5770289, 7341173, -17548700, -3716221, -1916092, 9607842, --5833640, 8135205, 7358890, -8049843, -4922570, 11266236, 833761, 12087649, -4748087, 4538170, --7508140, 4336843, 23051090, 4345970, 4648229, -2808909, -23962160, -12268037, -14624364, 8114804, -41517840, 38778724, 35459248, -2680060, -24999394, -24051280, -10991895, 16312286, 18654116, -1305670, --7952669, -12996571, -18451180, 5049271, 11157251, 8866423, 8861591, 6523519, 723165, 33820184, --67343480, 51163260, 10522670, -30957050, 303869, 28542206, -19221052, 657130, 15801722, -20168630, -1591285, -18146236, -11525545, 18826990, -16419123, -9455907, -34367256, 14650670, 33199560, 9170292, --15074261, -25624848, -4158602, 18891950, 10243497, -21931176, -665720, 25934624, -3548180, 1549410, --9005473, -6644852, 61385820, -29752850, -7606387, -7115150, 10254771, 28280212, -30421790, -17318382, -40373768, -5072893, -2663954, -48708688, -40080636, 16428787, 27136678, 14533632, -49627272, 33636572, --967978, -7942469, 7045357, -35811436, -9876277, -4978941, -17617956, 31491238, -24943022, -14232448, --26812944, -15878494, -35336308, 10219875, -55222544, -15911243, 6431177, -27924804, 6752226, 14822469, -6678138, -869194, -9921911, -20330228, 29180008, -6835978, -2840584, -11011759, 17665738, 34904124, -5305359, -48394080, 4214974, -21862458, 3188476, 3877282, -8735963, 2775623, -14331232, -5419175, --1206349, -11449309, 214748, -3711926, 8429410, 6884833, -2601677, 3152506, 15688979, -7711077, --5598490, 15366319, -11598559, 9971840, -5604933, -6072010, 1229434, -7496866, -3239479, 9053254, --18944028, 5017059, 4538707, 6326487, 13681618, -10311143, 1715303, 9422085, 3795141, -4231617, --8875013, -2560338, -2058900, -552977, -9085466, 1956358, -1478543, -38579544, 23527830, -635655, -30430918, -6174016, 31474594, 4013110, -3926137, 14116484, 36508296, 17521856, 9422085, 7355132, -4740570, 14403173, -18246094, -1414118, -13661754, -14367739, 22489522, 14011257, 8660802, -6375879, --5543729, -2585570, 23516556, 3657165, -10285910, -16872780, -687195, -3939559, 17706540, 2747705, -14821395, 27748710, -7631620, -70057360, 4686883, 57057568, 6024766, -41737420, -5338645, 16169478, -12716324, 22456774, 20423644, -1595580, -13161927, -13489955, 17879412, -10768557, 2048699, 6305549, --72768024, -12556874, -13955959, 11631308, 57273924, -979253, 4634807, -13214541, 3923990, 11871290, -24040542, 12608950, -14164802, -7396471, -35332548, -2075006, 24324010, -10655814, -5033165, 9020505, -24703042, 20081656, -5317170, -25060060, 158377, 9245991, 2802466, -16626892, 2065342, 2099702, --1265942, -14343043, -18692772, 16306917, 13326210, -598611, -2928631, -14023068, 11178189, 4706211, -2542621, 4430796, 3560528, 6564858, 412854, -15537044, 8732205, 523449, -983011, 990527, -4152160, 2079301, -2123325, 73551, 602369, -5024038, -3036005, -21505974, 3391414, 15382962, --10743861, 5567888, -17506824, 9979357, 4551592, -2474975, -4852776, -1632088, -1733556, 2207613, --3860639, 19588808, -2420214, -115112640, -216399248, -87050400, -146506704, -168368080, 104485280, 36430988, -95991448, 288896672, 189061776, 152517504, 228663520, 114071112, 7255274, 90339272, 22410066, -91710440, --64458332, -73116984, -167773776, -136342656, -58970436, -122106456, -134511936, -55723444, -82837032, -138922864, --71840304, 10570988, -87389696, -80032960, 17497696, -17469242, -79701168, 89006752, 58093192, -67019208, -66034584, 100189776, 15087146, 57204132, 201543488, 95589328, 60335164, 237037104, 166104096, 96052648, -233728368, 313306592, 193965024, 280924672, 363995808, 260001216, 172434352, 227247264, 119601416, -116052160, --76428408, -153231552, -356656224, -357711712, -362243456, -546825600, -539878976, -542499456, -565066816, -533560576, --518955008, -408637152, -327060672, -247448096, -102014600, 29774860, 79170744, 201628848, 350529984, 296884768, -398152064, 566101376, 475904384, 444356256, 541167488, 400782176, 205583984, 222685472, 209030160, 78274168, -55764244, 112037984, 41405096, -10045929, 37473052, 13161927, -78136192, -69956424, -42159936, -139772192, --160428304, -70185672, -122082832, -168148512, -69500088, -44829260, -91661048, -1542967, 29429116, -30469034, --4674535, -22543210, -128282080, -184868816, -207100096, -258740112, -304497088, -273414944, -249868848, -232778096, --174697264, -111378704, -79285632, -14591615, 61543660, 95661272, 138835888, 228612512, 278014304, 324187360, -347507424, 329170592, 293462752, 224423312, 153472064, 85607824, 11964705, -14595373, -24757802, -40394704, --45456860, -46375448, -53682260, -57008176, -51444044, -46326592, -51407000, -55174760, -52517248, -55126444, --60093572, -57780732, -54537496, -42010684, -24932286, -15557982, -3936338, 4896263, 3944391, 1649268, -438624, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --6948184, --644245, 6500970, -5812165, 2239826, -9788767, 96100, -3546569, 3928821, -3310883, 889595, --2247879, -4098473, -1058173, -396748, 2964064, 3712999, -3535295, -6157373, 3216394, 1093606, -2246268, 1352378, 2540473, -3570192, -2683818, 632434, -687732, 3200825, 2302103, -2732136, --595390, 2437931, 4525822, 2784750, 25770, -3565897, 1903744, -618475, -1904818, 2495376, -1072668, -3275986, -2745558, -2226941, 1816771, -3209951, -1732482, 2681670, 1025960, -105764, --3362960, 1224603, -2893197, -7439957, 721555, -2539400, -4807142, 2193118, -1377611, -1379758, --1657321, 93416, 3640522, 2192044, 1218160, 1656784, 2744484, -5606006, 2901251, -2236067, --2164127, -1247151, 1842541, 346819, 3912178, 5706938, 2216203, 433255, 632971, -94489, -3638911, -1553704, -149250, 1778653, 111669, -1522566, -1567126, 510564, -59056, -1717450, --874026, 528281, -105764, -234613, -697932, -853625, 550830, 359167, 598611, -258772, -197569, -181462, -1602023, -618475, 704375, 1260573, -730681, -846109, 268972, 14862197, --1241246, 2734284, 3280281, -1508607, 1551557, 5928129, -4601521, -803696, 1702955, -2282238, --440234, 4358318, -1392643, -967441, -290447, 1697049, -819802, 2105608, -1457605, -1431298, --654446, -3358128, -5747203, -1071594, -1836635, -759136, 3401614, -6085432, 7507066, 59056, -140660, 271657, 1425392, -166967, -2872260, 468151, 2320356, 5672041, 291521, -26844, --852551, -1893007, 3769908, 1801202, -1365263, 2090575, -3738232, 654983, 1203665, -2819109, --9732396, -3033321, -236223, -556735, -456877, -840740, -1233729, -689342, -1845225, 2404108, -7183870, 4084514, 320512, 4832, -186294, 2527052, -1462436, -6526203, -221191, -3389803, -2150168, -3848291, 2192044, -9425843, -54761, -1325534, 3211562, 5167383, -784905, -1205275, -776315, -1074, 2770254, 1036161, 466004, 3768834, -2759517, -342524, 477815, 1363115, -8053, 1389959, 77309, 898185, 400506, -157840, 280247, -312459, -40265, 811749, -1190780, 168041, -326954, -439160, 156229, -179852, 673773, 510027, 327491, -194884, -122943, 482647, -13077102, -12610024, -4745939, -1867774, -1799591, 10737, 3189013, 761283, -2590402, -5921686, 2928631, 3689914, 3565897, 4181688, -3235184, 899259, 9839770, -6085969, --214748, -4335233, -6287832, -752156, -446677, 5451924, -2644089, 573915, -4696547, 3011309, -1880659, 2364380, -10528575, 1624035, -1925756, -3692598, -994285, -50466, -7811472, -5057324, --4362076, -350577, 6526740, 2264522, 2161979, 3136937, -2920041, 1846836, -2619930, 5581310, -8585640, -803159, -789737, 2442763, 600759, 2222109, 4824322, -2261837, 4991289, -779537, --153545, 2955474, 4042638, -1527935, -5840082, -5370320, 2075006, -732292, -1003412, -2365453, -2651069, -4471061, 1662152, 3356517, 5665599, -3291556, 5432597, 3551401, 1766842, 2718714, -655519, -916439, -3659849, 2607582, -1722282, -3413425, -4317516, 1794760, -1423245, 2607582, -457414, -1658394, -2015413, -1023813, 858457, -1060857, -380105, -1364726, -605590, -77309, -1327682, 703301, -42950, 776315, 2617246, -246961, 6979, 1534914, -826781, 436476, --576599, -441308, 752693, 1107028, 1107028, 715649, -16643, -337155, 816581, 395674, -1791538, 2153389, -1709397, -169651, 942208, -14339285, 6152541, -6439230, 11455215, -10736881, -8369818, 4249870, -4482335, -5592585, -3130494, 2157147, 1938641, -3035468, 6739878, -2472291, --6514392, -1354525, 6972343, 4772246, -7127498, 1102196, -926102, -7458211, -3114388, -4807679, --1154809, -5716602, -1549410, -2401424, -7872675, -2821794, 3939559, 5679558, -1139777, -6741488, --1396401, 4734128, -1500554, 141197, 286689, 83215, -6714645, -221191, -836982, -1716376, --351114, 1156957, -4818954, 2710124, -5157182, -133144, -71941, 85899, 3761855, 58519, --1802813, 1528472, 2597382, 6258841, 2830384, 1408212, -1854889, -3913252, -3705483, -1546188, --4043712, -2898029, 2326799, 4091493, -3059627, -5083094, -3499325, 1588601, 852014, -4768488, --1663226, 574452, -4024921, -1853278, 520228, 1206886, 1590212, -1860795, -2238215, -3049427, -83752, -387084, -1194001, 921271, -1028645, -359704, -2340757, -533113, -805843, 2013803, -973884, -843961, 968515, -139586, 288300, -1007170, 89657, -605054, -73551, -840740, --1564979, 1091995, -130460, -1487132, -943819, -158914, -1367410, -1579474, 17548162, 7016366, --1110249, 4022237, -2747705, 9860171, 4207994, 17714056, 399969, -17027934, 4449049, 10417443, --6091874, 1870995, 7204271, -5428839, 5102958, -4392141, -890669, -5428839, -5145908, -1600412, -1527935, -516470, 2444910, -2299418, 7652021, -4478577, 2222109, 1445257, 5009543, -8981313, --4621922, -3513820, -981400, -3151432, 939524, 5555540, 4022774, 8795556, -1189706, -607738, --4894652, -1598265, 5617817, -5349919, 4657892, -5003100, -2022393, 8072391, 11699491, 8353175, -1559610, -6083821, 4394826, 3226057, -3155727, 6789807, -4351876, 1366873, 1173063, -12306692, --537, -11664594, -4599373, 1896765, -2984466, -5552856, -4657355, 1005559, 8149164, 2033130, --3168075, -4052839, -3474092, 834834, 1421634, 3869229, -5966784, -5458367, 497142, -1034550, -488553, -1554241, -779000, -958315, -398895, 1842541, 600222, 855772, -661425, -1249299, --1103807, 375810, 3339874, 1084479, 2466385, 755914, -3536369, 2784213, 1387274, 517544, -683974, 1612760, -221191, 1390496, 419833, -25233, -995359, -839129, -1430761, 472983, -1684164, -290984, -594853, -858457, -5054640, -585189, -475131, 177167, -654446, 10864120, -21988622, -9557376, -7099581, -1914482, -2571612, 7671886, -7306276, -13318694, -4612795, 943282, --3257196, 3838627, 1817308, 6652905, 2791192, -2650532, 9562745, 8967355, -4123169, 659814, --6158983, -1038845, 344671, -3788161, -731755, 6693170, 9598715, 391916, 1583769, 3954054, -2528662, 1549946, 660888, -3624416, -6888054, 800475, -9910100, 363998, 2281702, -3153580, -3898757, -2505577, -5477157, -421981, 5340792, 2367064, -2387465, 16197932, -43487, 5228586, --9635759, -2144263, 6617471, -3093987, -7133404, 4203163, -8360154, -7496866, 1713155, 9189619, --7512972, -4224637, -2216740, 384400, -3399467, -3389266, 12398497, 7250979, -1117228, 692027, --5828808, -4178466, -2367064, 3726958, 4905927, 430570, 3934727, 2541010, -790274, 3648575, --3346853, 12374875, 7019051, 1364726, 403727, 1141388, -2084133, -799401, -2074469, -2196876, --57982, -79994, -1996086, 1068910, -3015604, -910533, 2366527, -846109, 2425583, 1379758, -2295660, 96637, 1588064, 1803349, 1645509, 310848, 2724620, 893890, 390305, -1962263, -210453, -726923, -13959, 135291, 991601, -130997, 905701, -1870995, -62814, 8677981, --15627775, -2124398, -11744051, -6699075, -10641318, -2727304, -1655710, -1619740, -4106526, 4720169, --14983530, 7669201, -5126581, 4552129, 1975148, 6221260, 325881, 2568927, -6054294, -2578054, -2770254, -6025302, -4383014, 7333657, 2004676, 3311957, 2931315, -769873, 1955284, 10926934, --3944928, 1037772, -4955319, 8785356, -5335960, -19565186, 6032819, 3062849, 8209293, 4435628, -11320997, -7671349, -3054259, 6833830, -2863133, -6560563, -3112241, 3551401, -9517648, 9378598, --345745, 6248104, -8036958, -3529926, -2927020, -8705362, -1784022, -6922951, -3164317, 727460, -10002442, 8055211, -921271, -12288438, -7010997, -2268817, 9716290, 8038032, 5850819, 5413270, --3455301, -14222784, -3645354, -424128, 3321620, -4497368, -1404991, 7264937, -1396938, 8588324, -102005, 5947456, 2273648, 278099, -2200634, -237297, 3236258, 856309, -1513976, 286689, --3931506, -683437, -230318, -5264020, -3150896, -3368328, -1642825, 1028108, -2116882, 841277, --2835752, -378494, -832150, -1546725, 2299418, 1104344, -488553, -3586835, -1389422, 1417876, -2342905, 30602, -3481071, -1852742, 788127, 1784022, 494995, 857383, 264141, -20565378, --24823300, -14068702, 10043781, 720481, -4713727, -5334350, -7999377, -930397, 2579128, -13886166, --1418413, 8620536, -5423470, -3878356, 9633075, 2470680, -6514929, 2364916, -6307697, 14350023, --4760435, -3519726, 4574140, -7595113, -4803921, -4489315, 2348273, -5298916, -2048163, 2334852, -1649804, -17035988, 7486665, 7306276, -4976794, 13047574, 4953171, 1174137, 12497818, 7109245, -2157147, 1687922, 13521094, -1430761, -2411087, -989990, 8274792, 4608500, -12422119, 4711043, -3777424, -160524, -6656126, -19972672, 8698919, -1377074, -4985384, -12548821, -7126962, 7604240, --1707786, -3699578, -8391292, -16251619, 1562831, -2302639, -8667244, -3677566, -15378667, -2504503, --3512747, -2950643, -726386, 5435818, 11682848, 4985920, -4000762, -8455717, 3191698, 540092, -4835060, 3037616, -1964411, 3537979, 1240172, -431644, -4623533, 376883, -7482907, -483721, --1697586, 1192927, -2932926, 3467112, 1999844, -853625, -675384, -739808, 438624, -1712618, --498216, 1986959, -863825, -764504, 3767223, -1533840, -1048509, 3055869, -2433099, 1839857, --6271189, -4052302, -2346663, -3313567, -398895, -3290482, -4433480, -3269544, -988379, -685047, -1410360, -162135, -2734821, 1545651, 515933, -21169356, 17037598, 959925, 8710194, -1549946, --704375, 1607928, 9409200, 938450, -1164473, -12781823, 4558571, -1394254, -9876277, 2595234, --6450504, -4952634, 18349710, 5227512, 5655398, -3944391, 6577743, 7946227, 7674570, -4432943, -6702297, 3491809, -7713225, 5050345, -7501161, -2574833, 4807679, 2294586, -766652, -4145180, --3905199, 12221866, -3537979, -5332202, -3417720, 2518462, 2663417, -5801427, -9827422, -688269, --10545755, -1216550, -9507447, -3561065, -2248416, 1905892, -4839892, -8206072, 10422275, -4265977, --11455215, 7372848, 12247636, -5882495, -3911105, 6238440, 4506495, 12178917, 7856569, 1279363, --106300, -12416750, 3022583, 12007118, 9622337, -8430484, 9174587, 9981504, -6626061, -18458158, --5964099, -16524350, 2799782, 9584756, 4809827, 1220308, -4970351, -6639483, -738734, 949188, -2889439, -1438814, 5436355, -2354716, -1904281, 2210298, 5755256, -8375186, -1117765, -984084, --2573759, 150861, 2317135, -380641, -261456, -1238024, -163209, -1248762, 476205, -4295, --179852, 913754, 3004867, -2494839, -1496259, 1832340, 1931125, 6437619, -613643, 2764885, -2495913, -2593087, 2256469, 1146756, -2371896, 754304, 934692, 884763, 2568927, 5657546, -1178432, -1702955, 3695283, -998580, -2058900, 472446, 4145717, -33678988, 16247324, 4655745, --1513439, 22843320, -1270237, 11601244, -10102300, -2305324, 1870995, 223875, 13089450, 8356396, --17599702, 11116986, 907849, 6707665, -15845745, -541166, 9273371, -15546171, 19626926, 5379447, --136365, -6903623, 1241782, 8551280, -13947906, 1374926, 3653944, 2561948, -8572755, -3119220, -8251706, 4711043, -807991, 1299765, -5615133, -9642738, 4094715, -16358994, -611496, 23638426, -23065584, -7278359, 2920578, -929324, 6651294, 16631187, 1461900, 7996156, 2697240, -8616778, --586263, -1584306, -24911884, -11206643, 15527381, 787053, 4833449, -5961415, -1466731, 5569499, -7551090, -610959, 19308026, 347355, 15074261, 1938104, 3229816, 2028835, -9760850, -12275553, -15264851, 3588982, -7864622, 11098732, -8974871, 885837, 9397925, 1579474, -2327872, 4413079, --3947612, -3784940, 4735739, 6472516, 519691, -8532489, -4075387, -9197672, -3246459, 2353105, -3044595, 1555852, -3522947, -1620276, -6601902, 4871030, -18254, -2631741, -1157494, 2082522, -1182190, 6025839, 5406827, 3518652, 3538516, 1235877, 4308926, -2791192, 2019172, 2333778, -2240362, -2431488, 4354023, 2315524, -569083, -721018, -1046361, -1009317, -1886564, 11305428, --24597814, 9882720, 15497853, -2145873, 4609574, 6972343, -3761855, -2383707, 9564355, -3605088, -14513768, -13816910, 7550553, 17939542, -19226958, 775242, -9143985, 11330124, 4784057, 9396315, --9728638, -7604777, -110059, 24242942, 281320, 12263205, -5440113, 737661, -1666447, -2160369, --10761041, -422517, -3017215, 4932770, -4802311, -6989523, -5861557, -453119, -2039573, 10945724, -1888712, -6066642, -5488432, -5586679, -2035815, -2667712, 17888002, 767189, 8987756, 602369, --4287988, -3927211, 14879914, 11082089, -4274030, -14025753, 7921531, 5427765, -30878130, 1777580, -17438640, 16980154, 3974992, 13498008, -18624052, 30516816, 2691334, 5824513, 6054830, 14545980, --1128503, -13079249, -3955128, -15450608, 17573396, -7785702, -5186173, 15297063, -441845, -6052146, --4645544, -11549167, 10937134, -18835580, -2740726, 1782411, -438624, 2648384, -3879429, -8104067, --5116917, 2478196, 2093797, -3848828, 1006096, -3673808, -3898757, -2933463, 3485903, 1770063, --4427575, 4114579, 875636, -5465346, 2493766, -1035624, -1872069, -4183298, -4660040, 844498, -2324114, 9687836, -4224637, 5715528, 752156, -1997697, -653372, -1206886, -2517925, 1427540, --224412, -2965675, -917512, -2077690, 839666, 1903744, 1651952, 9299678, -18372260, -14714558, -12912819, 10846940, 26673358, -9584756, -7218230, -4900558, 4923107, -11501922, -1500554, 4323959, --929860, 14277545, 9148817, -11664594, 912144, 3245385, 8192113, -13267154, 13664975, -363998, -5979668, -2462090, -6428493, -13911936, 4731444, -2521146, -5948530, 2638184, -8592619, -8357470, --1982127, 4186519, 16581795, -25024090, -15196668, -13560822, -15220827, -4415764, 17198660, -10392210, --615254, 16929688, -2647847, -7839389, -14941654, -4136591, -6519761, -30751428, -23902030, -6848862, -5223217, -3068754, 5207111, -6944962, -5046050, 14390288, 8632347, -15452219, -8051453, -17277580, --6957310, 1256815, 6707129, -3218004, 1687385, -14765024, -11842299, -10823854, -448287, 2345589, -774168, -13982803, 304943, 18455474, 7881265, 21088826, -16877074, 25807384, 2151779, -16289737, --2829847, 593242, 4409858, -2860985, 6924024, -10021232, 4540318, -8893267, 3979824, 5820755, --2027225, 13140452, -1255204, 2985002, -3728569, -4953708, -2851858, 234076, 2862596, -5231270, --1046361, 1557999, -1271847, 4959614, -1669669, -2703145, -8723615, 3650185, 411243, 4349192, -1772748, -3022046, -8215736, 2464238, -10464151, 2482491, -2820183, -565325, 965831, -2357937, -681826, 1491427, 7042136, 2674691, -3236258, -13123273, 2500208, -1446330, 30200062, 3290482, -14537391, -12603582, -8574365, -3100967, -14245333, -9039296, -13761075, -6394670, -8924942, 16392280, -4101694, 4137664, 16875464, -448287, -983548, 7635378, 15181636, 23771570, 17358648, -3564286, --6470905, -27361626, 7523172, 8587787, 3319473, -17056926, 19712290, 7881265, 11572253, -3223910, -1075352, 11228118, 24625732, 24019068, 13817984, 2921652, 25603374, 683437, -7675107, 8339753, -15514496, 12647605, 23023172, 12202539, 486942, 2800319, -13940390, 6059125, -34798360, -5932424, --3525631, 7738458, 27293980, 15407121, 3994320, 19887846, -14459007, -13041668, 2770254, -33712272, --8107288, 1428614, 6429029, 7854959, 8879308, -1990181, 14763413, 1893544, 7609072, 27391154, --16894254, -8713952, -4711043, 5255966, -3268470, -25770340, -4941360, 17648020, -1345399, 22371410, --12053826, 660351, 9164923, -2116882, 2516314, -9272298, -4643397, -7188702, -4908611, -7981123, --6674379, 1791538, 1287417, -16058883, -7577933, -9029095, -2523830, 3010235, 4761508, -7139847, --408559, 2193655, -11445551, 1725503, -4678293, -7385197, -4015258, 614717, 2639258, -5056787, --1424319, -7755637, -759136, -2057826, -2682207, -5651103, -8499203, 2138357, 2604361, -4522601, --3338800, -3314641, -2710661, 1535451, 5328444, 1575716, 1557463, -23238994, -7289097, 4283156, -17659294, 32396938, -12953621, 619549, 5397164, -5883569, 30032022, 5364414, -14718853, 26317948, --5366025, -8767102, 18854906, -17015586, -9927280, 1195075, 1700270, 2389076, 12368969, 6635188, -10048076, -3013457, 5355288, 15105937, 972810, 10313827, 1938104, 440234, 16695075, -21690122, --7845295, -7327751, 14539001, -11036992, -2826625, -6485401, 14399415, -6046777, 31968516, 23381802, --21692806, 10695542, -26075820, 3791383, 9492415, 5125507, 5699422, -33259152, -6410776, -32075890, -4311074, 2689723, 3966402, -5032628, -5771899, 15401216, -27685896, 9578314, -11959873, -52206940, --19513648, -17061220, 8648454, -7572564, 7998840, 26186952, 27928024, 15829639, 14718316, 13652627, -4010963, -20738250, 21864068, 73014, -24079734, -19166292, -30275224, -40135932, -20666308, -4031901, -32182190, 11616813, 2008434, 12344273, -9763534, -195958, 6233072, 5168457, -2534568, 4741644, -1574106, 3298535, 1399623, -9901510, 8067023, 5352603, 3990025, 1625645, -5137855, 2849174, --7665443, -2727304, -11936788, 10015864, 7596187, -1621350, 1144609, 8018167, 12745315, -5682242, --12325482, -3728569, 10137733, -2211908, -7335268, 10799158, -875636, -6232535, 7490960, 3008088, -542777, -1825361, -219043, -5290326, 3689377, -3366718, -1469953, 7741142, -41836204, -19655918, --14792404, 7250442, -32010392, 10918344, -19299436, 26495654, -31834834, -40261560, -9039296, -6145025, -30853972, 14867566, 13516799, -8420820, 3237332, -19720342, -15940234, 3218004, 6149857, -25302726, --23574002, -16639240, -2474438, 12169253, 8639327, -17881560, -22470196, -13185013, -13431436, -30304216, --17678086, 12855374, -8733279, -576599, -4520453, 9334038, 15031849, -4440996, -45212584, 18534932, -37090800, 13601625, -1213328, -45346800, -11116986, 19246286, -5980205, 49890340, -5746666, -40895068, -6313065, -7204271, 2983929, 741419, -8474507, 10505490, 13106093, -43126304, -11777874, 1971927, -14785425, -8321499, -22135188, 19027242, 1593970, -14877767, -42953432, -49795852, -25783762, -3537979, -3307662, 39205536, 55581708, 28431072, 21608518, 9204115, -32749662, 11463805, -455803, -17330730, --5174899, -53803592, -11542188, -721555, 127775, 1516660, 23035520, 8380555, 6684043, -9960029, --3336116, 19879794, -14062797, -599148, -1101122, 3552475, -10499048, -17229262, -19109920, 7994545, --9046275, -3445638, 10796474, 29528, 1547262, -14750528, 4631049, 4279398, 2261837, -12207371, --6225018, -8167954, -12665322, 1302986, -7445326, 13020730, 5023501, -9511205, 1517734, -3757560, -9023726, -12947179, -1879048, -925565, 6349573, 5539434, 2813204, 6769942, -328028, 3410741, -75163000, 69035160, -29177324, 35800700, 31707060, -8952322, -5412733, -16511465, -8961449, -19402514, --13669807, 57280904, -3167002, 33367064, 351114, 1615445, 386010, -22619982, 5331128, 4681515, --49766860, 7403987, 11965779, -26147224, -5542119, -8055211, -3645890, 7366943, -1567663, 1531156, -21801254, 8895951, -10748156, 6770479, 34797824, 604517, 15978352, -830002, 13015898, -19206020, --23344220, -12969727, -42769284, 11451993, 4660577, -18917720, -51952460, -33818036, -48581984, 35347580, --25287694, 5558762, 8613020, 8072391, 6602439, 37725384, -36378908, 270583, -20452634, 39936752, --89593552, 18418430, 6769942, 28681792, 25893820, 202937, -8404177, -13616120, -4108136, -25918518, -18930068, 52771188, -4170413, 10958072, 33103998, -23144506, 13049721, 16298864, -29430726, -20204600, --54435488, 45037564, -8904004, -39502960, 26390964, -6564321, 17175574, -1124745, 14860050, 2647311, --11817603, 18701898, 17651778, 2979634, 10029286, 17017734, 9875740, -11304891, -5087926, -11039140, --5119601, 14355928, 27113054, -1122060, -5267778, -1049046, 17319456, -27598922, 15633681, -7442105, -36727876, 7387344, -22255984, -4416837, 16149077, -8536248, -11816529, -8579197, -6948184, -8434779, -8714489, 6449431, 23337242, -19713364, 915902, -2223719, 12603045, 894427, -2003065, 7729868, -8986682, 7242389, 15014669, 1968169, 17348446, -26094610, -24743306, 30555472, -62287228, 42921220, --25697864, -17964774, -11305965, 3894999, -18046916, -14053133, 19509352, -6011344, -42606612, 14678051, --2625299, 7521562, -9605694, 37848864, -30909806, 1298691, 15705085, -10742250, 11894375, -25228102, -2067490, -21709986, -10996190, 23579908, 3024731, 9441412, -13405667, 22795002, -6566468, -10656351, -8753680, -13978508, -11617350, -7474317, -7672422, -23559506, -31524524, -8788040, 17530982, 270583, --9849434, -31499290, 1244467, -24896852, -1624035, 10022843, -24592446, -6063957, 18174690, 18409304, -13411572, -30567820, -14425185, 21076478, 6910066, -584116, 17125108, -100325064, -23159000, -11178726, --45525580, 4497905, 12582644, -2661806, 8472897, 21527450, -12338367, -21310554, 5502390, -19343996, --5797132, 20905754, 33195802, -12540231, -39917964, -24106040, 2665564, -21307870, 3412889, -16521665, --15550466, 4203163, -31958852, 420907, -19912006, -6100464, -10870562, 4535486, 8189966, -3127810, --19753092, 4447976, -1217086, -12465606, 15629386, -587874, -14513768, -4965519, -3717831, -5443334, --10015864, 5581310, -9130564, 7678328, 10644540, -4036196, 1355599, -6056441, -13706851, -19479288, -3670587, 2742337, 9266392, -22547504, 4959077, 68183, -14442901, 11462194, -5840619, 8270497, -18691698, -41000832, 8584566, 6024766, 12226161, -6600291, -3896072, 13875966, 766652, 67275296, --8640400, -18760418, 2459406, -7614977, 33282776, 6170258, -2930778, 31585726, 32061930, 10441602, -12344810, 17514340, -39743480, -22058952, 32789390, -4634807, -32640140, -16617228, -14864345, 22276922, -11922829, -12101607, -47090560, 14453639, 7283728, 6070937, 7627862, -5840082, 4683662, -35426500, -31435940, 21705690, 11545409, -17847736, -15078556, -259846, 15705085, -3649112, 16338056, 6948720, --37245420, -16746614, 5812165, -37642168, 2160906, 6933151, -32981590, -46619724, -6544994, 13770202, --27012660, -56569016, -24710020, -14989436, 36535676, -22457848, 41239204, -8752606, 1923072, 17386028, -2405182, -63376536, -4211216, 2384781, 29492466, -56438016, -77640664, 5370320, -5052492, -49746996, -27951110, 12900471, -1833414, -419833, 45722612, -65658240, 53707492, 11090679, 7221988, 21508122, --23500988, -21588654, -4036733, 9890236, -13336410, -1236414, 27620934, -23608362, -18651432, 24120536, --13711146, -7120519, 10305774, 6466610, -27231704, 13669270, -9048959, -2734821, 9780714, 9245991, --28990492, -4984310, -22505628, 12421582, 17768816, 921807, -37306624, 26282516, -6328635, -842887, -16202764, -4274566, -13470091, -2710124, 21374978, -32182190, 22014392, 946503, -2212982, 7776575, -4421669, -20224464, 9434433, -335544, 1140851, -26286810, 18130130, -17295296, 19997904, 2712809, --23610508, 1722819, 3238942, -7082401, 3506841, 31629750, 12401181, 74435544, -31120796, -32464048, --13430363, -1174137, 70697312, -9660455, 58564564, -40860172, -16019691, 24883966, -44531296, -14565308, --41896868, 7094212, 42760156, -58508192, -21420076, -4843113, 17880486, -292595, 6609955, 16465831, --4062502, -37001144, -34286188, 1946157, 24354612, 65446712, -14405320, 17915382, -18688476, 32428076, -1169305, 4000225, -8944269, -38263328, 1350767, 35741644, -6022081, -1837172, -13169443, -33340758, -44314936, 17088064, 29595010, 39773008, -1857573, 2575907, 24628954, -62885300, 21913460, -31619550, -74839272, -6791417, 7455527, 11490111, -21706228, -21744346, 7616051, -31516470, 47535088, -27454504, --34840236, -35081828, 49705120, 17098802, 28851442, -6109054, 28825136, 29395294, -29586956, -8291971, --27430346, -14247480, 51806432, 36885716, 4977330, 10307385, -78096464, 53918484, 70570608, 8378408, --5511517, -13095355, -41826004, 61079804, -3358665, 4392141, -11774116, 2042257, -26327612, 57191784, --13387413, 28021440, 4637491, -9592809, -3098282, 55106040, -30071750, 27302034, 9242770, -22974854, -3463891, -7186017, 15370077, 4656282, 22461068, -8945343, 2597918, 4491462, 25770, 22306450, -37961068, -11301133, -1617055, 4625143, 21005612, 6239514, -28642064, -19106162, 41111428, 8276402, -20342576, -39675296, -47714404, 44741748, 29852170, 14198625, -3032247, -36896992, -405874, 6597070, --55509768, 37976636, -39477192, 4795331, -18190798, 14657113, -1532230, 20884816, -3359738, -18065170, -31116502, -10926397, -4352413, 4786741, -13061532, -11351062, 35924180, -8476118, -4932233, -4206384, --1842541, 16482474, -12566001, 3882114, -9193914, 8227547, -8026220, -6121402, -19265076, 28180354, --17401596, 9343701, 4526896, 19522774, -21929566, 4905390, -8963060, 22144852, 2917357, 1755568, -17536888, 5215701, -29038274, -4303557, -4967667, 8062191, 12733504, 10621991, -26394722, 11297375, --19934554, 14095546, -11355894, 2984466, -6507949, 13913547, -5432060, 4018479, -29524142, 6962679, -14374182, -13562433, 13455059, 1812476, 4965519, 8345122, -11884175, 20394116, 8091182, -1176821, --6394133, 9893994, -6187438, 18494130, -15473157, -4659503, -14723685, 19149112, -18942954, 17389786, --15782394, 21153788, -17979806, 11075647, -17724256, 15549929, -1169305, 1582159, -5089536, 804233, --3038689, -2778844, -5405753, 9224516, 3693135, -1313723, 3105798, -2863670, -4926865, 9262634, -1505386, 3491272, -5937793, 335544, 9372692, -10754061, -2532957, 6189585, 223338, -3238942, --6816113, 16808354, -5243082, -8535711, 4475893, 1476395, -2584497, 1753957, -877247, 1597191, --2777233, 2373506, -4874251, 8220568, -6754910, 9485972, 4262755, -23131084, 46692200, 3883187, -5858873, -18696530, -13776108, -29676614, 19868518, -8341364, -6074158, -12911209, -525597, -11514270, --1451162, -1542967, 5192079, 5803575, -937377, -1407139, -8455717, 7830263, 7321846, -7023346, -3271155, -15906948, 6301791, 3054259, -2806761, -2499671, -5325760, 5021354, 1086090, -11340861, --3064996, -3352222, -9410810, 15353971, 1586990, -9869298, 1476932, -3892314, 13383655, -4691715, --6298033, 2561411, -8027831, 15613280, 424665, -8695161, 2452426, -3568044, 7629473, -9912785, --1983201, 3215320, -3613141, 6835978, -3940633, 1950452, 3095598, -8946954, 1222455, 8809515, --13553306, -929860, 4082903, -12599287, 22855132, -20971788, 10425496, 3743064, -11977590, 23611046, --16114180, 3755412, 2998961, -10045392, 7777649, -4129611, -7737384, 7502771, -9214315, 5939940, --4243428, -3158949, 6781217, -5698885, 2169495, -2335925, -84289, 1284732, -3107946, 1410897, --185220, -3060701, 6413460, -5513128, 4777078, 136902, -4509179, 4355634, -7944079, -806380, -2078227, -1347546, -1104880, 1078574, -4134443, 5012764, -2573759, -1838246, 528281, 484258, --3226594, -527207, -1867237, 1706713, 2529199, -3670050, 3161096, -3505230, -679679, 3310346, --2508798, 10911364, -50020264, -115479856, 30309048, 106904424, 90385440, 121281824, -59779504, -77469400, --116504208, -119077968, 8200167, 88793080, 98035848, 107392440, 35723928, -23358716, -85183160, -141038144, --77262704, 35891968, 55603720, 94081792, 71322224, 19494320, -12621835, -29701310, -70636104, -45766636, --43544524, -7971460, 37249716, 57088168, 30065844, 38117296, 19295678, -21452288, -3325379, -45891724, --63880124, -10918881, -14878840, 11286637, 60317984, 34758632, 29956324, 8858370, -22555020, -23236310, --20008642, -33078228, -8640937, 1484448, 14226005, 17333952, 28867012, 8239895, -985695, -14541149, --26819386, -2278480, 9695352, 9941239, 16939352, -4293357, -13453448, -6451041, -13471702, -10572599, -2904472, 7627862, 21689048, 18389976, 17576616, 1039382, -9394704, -35173096, -32698660, -13311714, -2121177, 27216670, 29190746, 12058658, 12390981, -1358283, -23500450, -14370961, -1676648, -5487358, -1284732, 2503966, 5677410, 4752918, -3021510, -7650948, 4561256, 7118372, 5833640, 6075231, --534187, -4393215, -2738579, -11911018, -4902169, -6559489, -11219528, 6678674, 16325171, 19062676, -6314139, 6896644, -3696356, -4418985, -17041894, -25295746, -9762998, 2932926, 7919920, 9874667, -20774220, 19352586, 9365176, -7623030, -16259136, -18296024, -17172352, -12654047, -869731, 15446313, -23834384, 18951006, 5470715, -8948027, -10819023, -10735271, -6268505, -4066797, -4714801, 4726612, -10892574, 8103530, 1710471, -1356673, -878858, -2743410, -3231963, -4454418, -2032593, 2703145, -2148021, 1435056, 1441498, 1399086, 956704, -1888175, -1979443, -308701, 120796, -30065, --62814, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --5540508, --4885526, 6077916, -1243393, 4852776, 1415729, 7217693, -1682554, -3734474, -2572686, 4409321, -122407, -1605781, -427886, 4985920, -1328219, 904091, 1749125, -3351685, -2550674, -1093606, -919123, -3478924, 883153, 703838, -4029753, -1313186, -2411624, 336618, -1762547, 639950, -6569153, 3364033, -1924145, 307090, -3122978, 2389076, -842350, 3876745, -8061117, -891743, -1243393, -2876018, 512712, 3897683, 2977486, -3636227, -2687039, -2925410, -545998, -2320356, --1177895, -3550327, 1347009, -324807, -4099546, -2134599, -1658394, -221191, 839129, -909459, --430570, 1745367, 691490, -1948305, 1006633, 4345433, -2245194, -595390, -4696547, -1805497, --371515, 1923609, -1990181, 545998, 783295, 633508, 1505386, -3642132, -129923, -2061047, -1709397, -1326071, -3504157, -1013075, -119722, -79457, -1554241, -1643899, 1690607, -785979, --324270, 611496, 982474, 28991, -240518, 175557, 579284, 21475, -399969, 758599, -127238, -694711, -632971, 707596, -271120, 245887, -477278, 637803, -618475, -409096, --114354, -148176, 216359, 7539815, -2809982, 2458332, 6305012, -5101348, -5756330, -838056, --1433445, -59593, 3213709, 1797981, -8005819, 1263257, -4591857, -6311992, -403727, 2331630, -2512019, -2050310, -264677, -662499, 3445101, -699543, 2833068, -1308891, 331786, 635655, -863825, -3990025, 1686848, 3113315, -1451162, 3963718, -2185602, -414464, -4932770, 3524021, -885837, -1286343, -3825205, -3774203, -1720671, -1277753, 1916092, -399969, 1654636, 1654636, --3393561, 2133525, -4559108, 1650341, 2655901, 5052492, 4847945, -4158602, 2071785, -247497, --1103807, 2966749, -2248416, -2663954, -2019172, 2422899, 1197222, 3152506, -3113851, 4736812, --1529545, -217970, 1421097, 802622, 2767033, -2072859, 3942243, 4998268, 8708046, 4065187, -2769717, -5120675, -941135, -3333968, -2428804, 3186866, -416075, 3932580, 1597191, -287226, --782221, -654983, 2257005, -1686312, 1799591, 2154463, -1682017, 1044214, 777926, 251256, -1285806, -770410, -239444, -1660005, -9224516, -9926743, 1133335, -812823, 2362769, 2205466, -6558952, 2968359, 3134253, 1589675, -3205119, 1240172, 8286066, -5531918, -617938, 260382, -6652905, 4005057, 930397, 2954401, -521839, 2283849, 3069291, 6820945, 3781182, 3833258, -2061584, 1647657, 3326989, 1212255, -4744865, 2924873, 3928821, -1386738, 2858838, 3775276, --1306744, 1195612, 4710506, 1749662, -1125818, 1701881, 4807679, -233002, -44023, -933082, -1326071, 4510790, -1319629, -2521683, 1308891, -1543504, 2386391, 2837363, -3338263, 734439, --2152852, 189515, 1381369, 3799972, 3125126, -7946763, -6442, 3915400, -2015950, -3302830, -458488, 625992, 3933116, -311385, -8483634, -3697430, 2763275, -2345589, 4014721, -1096290, -34360, 1032940, 5032091, 3164854, 2141578, -2566780, 4135517, -477278, 2538326, 1257889, -512175, 880468, 872415, -47245, -646393, 569083, -343597, -2043331, -860604, -830539, --248571, -457951, 5906, -605590, -1477469, 758062, 326954, -740882, 181999, 1418950, -1038308, 501974, -186294, -219043, -136902, -58519, 1340030, -16789028, 2364380, 1744294, -7845295, -293668, 6127845, 3149285, 1568200, -9834938, 23085, -140660, -7628936, 1233729, -5719286, 1095217, -100932, -710817, -3038153, -3484292, 1568200, 2262911, -261456, 1512902, -1764695, 6870337, 795643, 3047816, 3212099, -3590056, 787053, -839666, -983548, -451508, -2536715, -383326, -1709934, -2742874, -1636383, 887448, -4874788, -3463891, 2068027, -3879966, -1280437, -6378027, -7633768, -1945083, 9463960, -2494839, -547608, 5583995, 1880122, 415538, -5979132, -842350, 677531, -754304, 1760400, 3838627, -1490891, -5966247, 3823595, -3477850, --6613713, -2638184, -1842541, -6442, 2446521, 7173669, 59593, -71941, -2796561, -266288, -4243428, -2001992, -2177012, 5115843, -4311074, -332860, 2352568, -5232881, -1013612, -1814624, --1758789, 583579, -2791192, -3948149, 254477, 2448668, -1126892, -1704565, -2225330, -2261300, --304943, 1631551, 746251, -223338, -650688, -1759863, 94489, -589484, -2137283, -3160022, --2685428, -37581, -335544, 1276679, -2086817, -100932, -295279, 1016297, -153545, 436476, -14968498, 497679, -900869, -5666673, -3257196, 7902740, -3189013, 6171868, 5311264, -6014565, --974421, 4631049, -3364570, -1618129, -1569274, -2174327, 999117, 1669132, 290447, 2897492, --1306207, 464930, 1096290, -1197759, -2824478, -2939905, -3328600, 279173, 3901978, 1709934, --3286187, 322659, 1545651, 7446937, -2190970, 6668474, -6046777, 2760590, 4807142, -3145527, --1919314, -6159520, 2929705, -40802, -4324495, 4319664, -5364414, 6053757, -316217, 8559333, -1976222, 955093, 2079301, 3579855, 1910724, -2732673, 4225711, -756451, -4480188, -7004555, --1900523, 3012920, -3510599, -2257542, 2759517, -3903052, 7728794, -7388955, -21475, 4993973, --4222490, -1649268, -7769596, -548682, -3035468, -1672890, -2323041, 6770479, 2663417, 722091, -290984, 5846524, 588947, -461709, 4670240, 3870303, 3505767, 7255811, -1525787, 743029, --2019172, 2078764, 2393908, 525597, 711354, -1177895, -33823, -1683627, -846109, 209380, -668404, 1190243, -552977, -208843, 2334315, 1121523, -851477, 4518306, -229244, -1068373, --1821603, -1157494, 1655173, -1491427, 169114, -140660, -1554241, 738734, 494458, -379568, -1148904, 1228898, -1176284, 1273995, 7224672, 12786118, -3730716, -5558225, 1470489, -2265059, -3530463, 11642046, 77846, -2669859, 3698504, 2011655, 3451006, 2098629, -6325950, 248034, --5645198, 3162170, 2739652, 1677722, 10643466, -495532, 7936563, -194884, -188979, 2428267, --60130, 8361228, 1110786, 5270999, -1934883, 7135552, -3204046, 3812857, 14110578, -2290291, --3554622, 9960566, 2098629, 6495601, -152471, -6165426, 1933272, -3549254, 4268124, -7431367, --990527, -3853123, 4207994, -613107, 872415, 7701950, -3728032, -7704098, 2168959, -646929, --358630, 6267968, 1213865, 909996, -2812130, -5060009, -5379984, -1780264, -4440996, -3338263, -4610111, -2297271, -432718, -1661616, 547071, 46171, 4115653, 2594160, -4702453, -6772090, --1583769, 241055, 1878511, -1829119, -1662689, 5609228, 3190087, 2775623, 816581, -4523675, --2097018, 2487323, 112743, -1475858, 1995549, -599685, 1219234, -1451162, 125628, -819265, --2575370, -3033858, -806917, -2680597, 723702, -372052, 273267, 1888712, -488016, -1421634, -2289755, 525060, 1462973, 887448, 149787, -814970, 1134408, -248034, -254477, -47782, --243203, 135828, -464393, 674847, 1453310, -1734630, 486405, -2051384, 328565, -971200, -17539572, -9206262, 6154688, 240518, 3033858, -4235375, -3319473, -1928977, 3813394, 4912906, -1043677, -2691334, -5099737, 2666638, 4848481, -947577, 1521492, -2593624, 5285494, 1960116, --9936407, -3261491, 3195993, -577673, -4225174, -197569, 4517232, -3315178, 1531156, -6457484, -3766686, 8172786, -3385508, 8644695, 289373, -1571421, 5752572, -245887, 439697, 5209796, --11250667, 1691680, 3404299, 4787278, 3228205, 3740380, -5052492, -3910031, -182536, 1795833, --5471789, 1808718, 5305359, 4771709, 1759863, 14564234, -4594005, -1823751, -6599218, -2822867, --4328790, -6059125, 7496866, 3132642, 7321846, -1144072, -11735461, 6830072, -4147865, 3754338, -3355443, 1640141, 2015950, -9260486, 10968273, 2398202, -5095442, -8886287, -5578626, -5566278, -770410, 4540854, -4147328, 347892, 2782602, 2385854, -4295, -1927367, 447213, -192737, -1723356, 1848447, 1975148, 1384053, 1302449, 686121, -3241090, -2897492, 131533, -1063541, -1047972, 1320703, -1511829, 2106682, -520228, 770410, 1730335, 753767, 1340567, 404264, --3447248, -235686, -55835, 1215476, 882616, 419833, -788127, -923418, 1848447, -541166, -4517232, 784368, 1947231, -21022254, -17696876, -16316044, 3640522, 3351148, 1365800, 732292, --1165010, -1270774, 436476, -2783139, -5920613, -4115653, -10364293, -4578435, -5031018, 6193880, --7966628, -3526705, -4510253, 1336809, 90194, -2067490, 2323041, -692027, -8271570, -168041, -7588671, 980326, -7378754, -6522445, 2849711, -2638184, 6368900, 4478577, -6971806, 6881075, -10861972, -9107478, -9328669, -4989142, 3426310, 8635032, -6152541, -6361921, 3266860, -3673808, -671626, -818728, -792958, -9907416, 1891933, 5997385, -3080029, 3433826, -4926865, -5858336, --5815923, -2878702, -10018548, 17157320, -3638374, -1158567, 2995740, 1866163, 3654480, 2336462, -5352603, 2443837, 4647155, 10619307, -13706851, 9590125, -3270081, -2606508, -471373, -15298137, --700617, 4680978, 424128, 602906, 4274030, 1563905, -379568, 2543158, -5172215, 5987722, --2165201, -3486440, 3250217, -2120640, -1913408, 612570, 2652679, -2047626, -3247532, 1104344, -2574833, 100932, -1103807, -2830920, -1556926, 390305, -4002910, -2674691, -1397475, 1908576, --906238, 143345, 2109366, 35970, -3987877, -908386, -3396246, -3019899, -2849174, -1758789, --3147674, 2664490, -941672, 175020, 5714454, -1140314, -1743757, -1546725, 3090229, 775242, --1065152, -20672752, 15845208, 4198331, 3453691, -3827353, 15509127, -2441152, 7306813, -22012, -6573985, -9230958, 3652870, 3621731, 1411434, -4541391, 13804562, -3743064, 4206921, 3176665, -14326937, -9667435, -630823, 3986267, -2493766, -7093676, 4278861, -6672232, 1723356, 1828046, --7838852, 3033858, 638876, 395137, 15756624, 9854802, -1323387, -6447820, -5043902, 3518652, --842887, -9450002, 2677912, -830002, 2778844, 7118372, 10478110, -7197292, 7123204, 3570729, --4730907, 3408057, 2736431, -7443715, -4034585, -4666482, 7498476, -8112657, -6898791, -18595598, --13634911, 3778498, -2568391, -2674154, -7173133, -14428406, 5525476, 1112397, -436476, 7069516, -6009733, 8502425, 5037460, 2057826, -255014, 1360968, 9597641, -7096897, 13146895, -4836670, --3740917, -12018392, 1906429, -2206003, -6138045, -1084479, 1453846, -3022583, 3491809, -1451162, -142271, -1477469, -488016, -1268626, -301185, 2173790, 3435974, 278636, 2835215, -3204583, --2289218, -1623498, 1175210, 2475512, -3278671, -1228361, -1533840, 481573, -1834488, 1473711, --340376, 1283122, 2164127, 36507, -3495030, 4930623, 4723927, 1974611, 21475, -2126546, --145492, -1107028, -526134, 5576478, -24987582, 23119272, 16607565, -6772627, -5717675, 6243272, -56908, 569083, 11033771, 7809861, 321586, -1624035, 4444218, -2563022, -1595580, 3115462, --4944044, 6213207, 4258460, -5159867, 6698002, -716723, 1807644, -483184, -11011222, -609885, -8018704, 8313983, 3263638, 3564823, 4458176, -5124970, -6487011, 2808909, 4997195, -202400, --2501819, -5652177, 2355790, -1653026, 7083475, 8341900, -926102, 9615358, -4992900, 10715407, -5807333, 12913356, 937914, 1893007, -3709241, -5264556, -992674, 9913858, 16181826, 989990, -12336220, -5305359, -11818676, 1592896, 4474819, -10327786, 10785200, -3550864, 3819300, -22764400, --9785546, -134218, -5462125, 4424890, 7544647, 15835544, 3309272, 134755, -7735773, -13731010, -3563212, 610422, -11522860, 4749160, 2513630, -8308078, -2349884, 2011655, 9135395, 228707, -2774012, 2813204, 4770098, 3925600, -7699266, 2771865, -118648, -1510218, 187368, -354872, --1218697, 3308199, 3124589, -3191161, -1305670, -17717, 2237678, -1205275, 3183645, 500364, -2325725, 2084670, -2492155, 1924682, 2332167, 5980742, 564251, 3430605, 3747896, 951335, -4396436, 1619740, 2280091, 1038308, 577136, 1618129, 5162014, -2160369, -4706748, 1190780, -6153078, -9710384, 16675211, -7154879, 2004676, 12465069, 12899934, -952409, -7412040, -3974992, --3930432, 956704, -9581535, -7600482, 8025684, 2017024, 5159867, 6288906, 7432441, -3322694, -4821638, -1821603, 5773510, 24049670, 5664525, -11592117, 11259257, 12931073, 563714, -2131915, -683437, -6395207, -8817031, -4613869, 13186086, 8857296, 7301982, 11216307, 2273648, -1930588, --5155572, -14242648, 6601365, 7514582, 4171487, -2255932, -1763621, -4912906, 1981591, 11596949, -7990787, -13285944, 8777303, -11201275, 11810623, 2522220, 4421669, 5281199, -1976222, -6330782, --1926830, 4755603, 20434380, -3252901, 10206990, -4538170, -9241159, 10851235, 9766756, 2479807, -2233920, 9840844, 3441343, 580894, -1122597, -6255083, -1930051, -9176734, 2947421, -7124277, --3568044, 14483703, -767189, 395137, 286152, 6681896, -2183991, 1995012, 4420058, 6729140, -7271380, 6066642, 2374580, 3188476, 3323768, 6096169, -944356, -4862977, 6885907, 2739652, -3795677, 4185983, 174483, -482647, 428960, -3034395, 1890323, 6535867, 731755, 842350, --1377074, -2422899, 5454072, 5873905, 1137093, 10409390, -1293859, 4494684, 7961259, 514322, -2208687, -1147293, -3051574, 826781, 1728188, 2889439, 5733245, 2508798, 4294968, 1604707, -1028645, 5980205, 8505109, -4292283, 8644159, 11042898, -12664785, 8529805, 4935991, -3061238, -789737, 5868536, -5299990, -11187853, 16806744, 3633006, 3218541, 3141232, 9976135, 2907693, --10039486, 10726144, -14397267, -16819628, 1495722, 2024003, -9287867, -3044058, -27509266, -19477676, --14668387, -4955856, -15090904, -7430831, 5724118, -13566191, 9520869, 8757438, -11049877, 14268418, -7611756, -2790655, -1435593, -7383049, 320512, -13184476, 28934658, 8461622, 4509179, -14441291, -3518115, -4458176, 19187766, -3858491, -499827, -17511118, 17137456, 1147830, 6711960, 5563057, -9994926, 5666136, -3880503, 5731097, -8534100, 8664023, -3132105, 5107253, -13661217, 30942018, -4720169, -14343043, 7785165, 9038759, 7063074, 10532870, 8986682, -13929116, 11109470, -272730, -8958765, -7045894, 2662880, -17923972, 7541426, 7819525, 2268817, -4298189, -13561359, -872415, -9283035, -12030740, -1643362, -1414655, -57982, 3690451, 2793339, -2704219, 5216238, -294205, --2557116, 4133369, 3170760, -3757023, -3039226, -7852274, -492848, -7304129, 4394289, 1239635, -733903, 5767604, 8871255, 5638219, 4173635, 2834679, -3156264, -1219234, 91268, -5695664, --4719632, -1293859, -1911797, 3106872, 7204271, 2294050, 4556961, -1016297, -89121, -22364432, -6277095, -3061238, -2173254, 13280576, -2439005, -2260764, 1292785, 11890617, -3091303, 6936372, --5800354, -6841346, -8742406, -11087458, 19270444, 10047539, 6996502, -6048925, -17637284, -21648782, -10431939, 7185481, -7675107, 5163088, -5212480, 519154, 19181860, 8377871, -5424007, 10344429, --3478924, 5369783, -6373732, 6493454, -14145475, -20809116, -8072928, -9280887, -1562831, 24359444, --19810536, 11468100, 6605123, 4981089, -4363150, 9590662, 4300336, -19033148, -24193014, -8614094, --11022497, 27420682, 19898584, -6637335, -12204150, -1016297, -12523588, -2648384, 19983410, 18487150, -10513006, -16302085, 3549791, -12734041, 20037096, 9504763, -2085744, 71404, 6767795, -11819213, -2690260, 17653390, 9622874, -15968152, 17384418, -8854612, 10404558, 27545236, 10553808, -6485938, --8118025, 23574002, 2640331, -1436667, -10667088, 4153234, -5005248, 1516660, -3106872, -556735, --652298, -11742441, 1529545, -1462973, -3298535, 5163088, -860604, -4154844, 799938, -2470143, -705985, -3066070, -4519380, 4067871, -5014911, -3245385, 2459406, 6127845, -247497, 4326643, -3629247, -817654, 42413, -5906654, 871342, 1996086, -4938139, 6703370, 3374771, -4095251, --2679523, -2860448, -1205275, -6596533, 3968550, 6245420, 357556, -4913443, -2778844, 3241627, --1351304, 3115462, 4481799, 313533, 1700807, -17768280, -6956774, 29768956, 13785771, 17157320, -4190814, -24723442, 7648263, -20057498, 13202193, 37205156, 13232257, 23345832, -10500121, 6746320, -10850161, -1112397, 2806224, -9535364, 2441689, 14636175, 782221, -3891777, -13196824, 7279433, -5466957, -13448616, 7032472, -5101348, 10312216, 14713484, 15645492, 18844170, 1906966, -14596446, -3968013, 8909373, -146566, 25653840, 2275259, -29464550, -18475876, 8398272, -7480223, -34775276, -1283658, 14839112, 5493800, 1567126, -3142842, 18335752, -14374182, -17838072, -3424700, -6379100, --17351668, -952409, 1296006, -10108206, -14936286, -9150965, 763430, 2178085, -21585968, 6466610, --8983461, 5267241, 24977382, -3395172, -8644159, 17398376, -2993592, 14487998, -13678934, 9360344, -644245, -15855409, -17683990, 31988916, 3147137, 4331475, 1551020, 46171, 32096828, 26208428, -8316668, -2398739, 12610561, -6145025, 4331475, 7508677, -1344325, 9863929, 4278861, 2885144, --14561550, 8706972, 4709432, -803159, 1374926, -4927938, 4255776, 11331734, -1822140, -3654480, --6227166, -6833830, 6859063, 8047695, 490700, 56371, -6130529, -6619619, 1246614, -9515500, -1416266, -3148211, 10063645, 3590593, 496069, -6277095, -10966125, -2479270, -5286031, -7397008, -4355634, 4482335, 8647917, 25170656, 3271691, -34470872, -15591805, 21391084, -30829812, 17522930, --29176250, 2374043, -4658429, -42198052, -5558762, 18997714, 38841536, 12372727, -5640366, 9431748, --14894410, -4993437, -33880312, -1883343, -23010824, -3313031, -5036386, -15904264, -16874390, -5603859, -9701794, -15285252, 10537165, 19398756, -19989314, 7249368, 6458557, 3433826, -21272974, -3248069, --217970, -22286586, 5814849, 28389196, -2152852, -41213968, 14599668, -24893094, -63546724, 17922362, --26278758, -32682554, 1744294, -14965814, 4539781, 11235098, -6259378, 16734803, -13984414, 14618458, --11537893, -28440736, 170725, 20351166, 19514184, -36956584, 5441187, -4420058, -27507654, -7358353, --6812355, 47873852, 23905252, 28083180, 12799003, 12213813, 29631516, 42561516, -9711995, -20164872, --22000434, 3863860, -27334246, -8411157, 14157286, 22992570, 3235184, 2088428, 19967840, -4621922, --11324755, -15411416, 12031814, 13643500, 13406740, 3129958, 15379204, 6376953, -9426916, -2094333, --9130564, 14024679, 2268280, -1639604, -15726023, 4772246, 12607876, 1384053, 241055, 12316356, --9827959, -6575595, 6819335, 695248, -4958540, -9468255, -3020973, 14492830, -697932, -32087700, --2977486, -793495, -7348689, -6256694, -8472360, -5194763, 6998649, 6258304, 3729105, 2221572, --5268851, -6656663, 55716464, 60232084, -35359392, -14008573, 26891328, -12200391, 10846940, -16780438, -5019206, -17241072, -32293860, 44000868, 6415071, 13817984, 11316165, 4120484, 5779416, 1322313, -8916352, 10933376, -31249108, -25761750, -22570590, -21308406, -15963320, -10060424, -8339216, -16753057, --9491878, -14198088, 16145319, 12277164, 6207839, -7823820, 3280281, -33063196, -16612934, 8994735, --30048664, -2777233, 14625437, 25942140, 3802120, 5028333, -11098195, -19403052, -22886806, 18387292, --2488397, 18204218, -64170568, 4009352, -7460895, 7389491, 39237748, 4820564, 6549289, 4429185, --11492796, -13215077, 361314, -2607045, -36026184, 7733089, -13212393, 32319628, 2156611, -35403416, --48195440, -29943976, -6083821, -33843804, -33143188, -20561620, 23378044, -6052146, -22824530, -30775588, -25724170, -3305514, 15222975, -17313014, 9342091, 25365004, -16840030, -24417426, -10255845, -12605729, -26527328, 5595269, -11629161, 10457172, 7784628, 23088670, 14328548, 6725919, -20495584, -20424180, --4488778, 2403571, -5360656, 3705483, 14220637, -3098282, -1189706, -10363219, -7597261, -5645198, --10787347, -2019708, 4441533, 6542846, 33530810, 2261300, -8395050, -2640331, 4496831, 10507637, --594316, 16623134, 6971269, 38341708, 5950677, -252866, 1417876, 7049115, -10610180, -16483011, -62755376, -36376224, 23831700, 44472776, -21304112, 6334540, 35544612, -44917304, 1833414, 5098663, -21923124, -50377820, 2849174, 3462818, 16632798, -21945672, 328565, 9104794, -29617558, 4484483, --2202245, -5475547, 16387985, -4837207, -4423280, 6974490, -3834332, -4976794, 16079284, -14900852, -4475893, -6098317, 4153770, -9520869, -5254893, -11627550, 230854, 2348810, 31419296, 10496900, -15304579, -3097208, 426276, 23312008, -910533, -8718247, 13108240, 9679246, -10397579, -30348776, -27960238, -30246770, 5044976, 14632954, 19199578, -29764660, 31967442, 51311976, -27921046, -51991652, -69785168, 24716464, -34323768, 16000901, -33036888, -41052372, -20412368, -7434589, -42874512, 34879968, --59804736, 18083422, 28701118, -23690502, -79981952, 75848584, -13065827, -19437948, 50596864, -50227496, -26120380, 43182676, -12802224, -11724187, 13499619, 14897094, -7964480, 5434744, 4543002, 13758928, --6613176, -4867809, 15416785, 63351, 3557307, -1519345, 3004867, 12329777, 9183177, -1559073, --10780368, 18023294, 19523310, -3565897, -16517907, -1666984, 8362838, 1881196, 12092480, 161598, -10603737, 4533338, 15483894, 11436424, 13037373, -19016504, 5084705, -265751, 951872, 178778, --11491185, -20550344, 30412664, -4776541, -27759984, 10264435, 6976101, 3023657, -4403415, -19206556, --15238544, 34819300, -23038742, -18430242, -36750424, -16944720, 21767968, 16884054, -9840307, -12259984, -11571179, 28875602, -12477954, 21772800, 26074210, -18585934, -2714419, 15911780, -4185446, -143881, --5330592, 1328756, -26742076, 7245610, -5974300, 834834, 6373195, -5437429, 5450314, -11144903, --22409528, -10647224, -38976828, 4799626, -141734, -5875516, 7162932, 3641059, -2593624, -8938901, -15588584, 24654186, -26035554, 37918656, -4339528, 5006322, 5448703, 33512020, 15352897, 24506010, --30888868, -7709467, -5838471, 43707736, -40900436, -14015552, 19913616, -1532767, -47222092, 3136400, --9784472, -8124468, 21481278, 23544474, 1604707, -17770428, 38060928, -16111496, 63508072, 785979, --29541858, -92879, -5171678, -33420214, 63807644, 12782896, -9574019, -75647256, -37828460, 21251498, --27875948, -25092810, 29556892, -110861160, 2748242, 21796422, 15988553, -9004936, 31120796, -19107236, --2517388, 110059, 16189879, -4645544, 3274376, 22053584, -1583232, -5598490, -7030325, -7972533, --390305, 2451890, -1510218, -3366718, 14232985, -20003274, -4518843, 2359011, 3299072, -11986717, --20281910, -5166846, -6248104, -2909840, -1717450, 3911105, -22491134, 1719598, 17011828, -10619844, -13004624, 9985799, -9811316, 611496, -7185481, 2839510, 4777078, -10466835, 29417842, -14281840, --13191992, -17027398, 14239427, 19317152, 11791833, 48008072, -9225053, 10887742, -4577899, -24752970, -12429098, -15771657, -8877697, 9910637, 21544092, -22691922, 24821152, 2863670, -1233729, 50586660, --10255308, -5608154, 37924560, -24225764, 33504504, 14461692, -7919920, 13366475, 14124000, 31253404, -32502702, 9447317, -26357140, 55205364, -55356224, 1873680, 50407348, -27116276, 11178189, -5975910, --6510634, -58372364, 39660800, 10490994, 17617418, 18596134, -12108587, -29055990, -21831318, -17705466, -2784213, 55472188, 394063, 43509628, -14455786, -33483566, 1859721, 12512850, -27485106, 44647796, -18178450, 21940840, 44110388, 28552942, -47160888, 17997524, -67653784, -83598856, 1767379, 70399344, -44163540, 5696737, -49787796, -177893792, -32693828, 55009404, 62872416, 89085672, -4512937, -112974816, --63712620, -58852864, 90339808, 69042672, -12451647, -45145476, -26402238, -54900956, -6994354, 70731136, --6849936, 16546362, 11826192, -11598022, -25608742, 38548944, -15628849, 21506512, 15781857, -1462436, --35782984, 49090404, -19342386, -9268539, 14230300, 12738336, -26553098, 443455, -8309688, -10023917, -3403225, -954557, 19676318, -35107064, 18625662, -42251740, -6657200, -7043747, 50258096, 1497333, -13655849, -30659088, 16056198, -11526082, 22226992, 26558468, -12816182, -30494268, 11018202, 7902740, -25736518, 7217156, -43612172, 36628016, -27421218, -4743792, -17755932, 17024176, -19945828, -848793, --2097555, -5411122, 4093104, 18756660, -19812148, 8717710, 1555315, -4587025, 276489, 13226889, --16747688, -4581657, -2454574, 27471148, -27819576, 7377680, -12191802, 18203682, -20310364, -5778342, -6964827, -3934727, 3856344, -13140452, -2323577, 11880416, -3608310, 4589173, 3770981, 2484639, -14865419, -13771813, 9328669, 10715943, 13272523, -1866163, -30778272, 3940096, 3666828, 12534325, -11463805, -2248416, 3083787, -5194763, -13982266, -2392834, 6432788, -2649995, 18716394, -15235323, --5020280, -30389578, 9091372, 3267933, -4769561, 6771016, 5950141, -455267, -15666430, 4870493, -15355045, -3005940, -2209224, 6003291, -6159520, 11424613, -7034083, 1918777, -14374182, 6789270, -2755222, -2319819, -3909494, 8311299, -3956739, -6083285, -8650064, 9041443, -327491, -4592931, --1901597, 8994198, -3528853, 3951907, -4960151, -3061238, -421444, 278099, -41339, -5017596, -599685, 103616, -4126927, 4225174, -3911105, 11749957, 1938641, 1525250, -16278463, 4555350, --256624, -6583111, 7480760, 13791677, -9964324, -2326262, -300111, -7292855, 11069204, -1895154, -1660005, -7314866, 3884798, -1623498, 1449552, -4704063, -24839406, 60313152, 16461536, 14921790, --7944079, -19275814, -18538690, 5295158, 11735998, 1869921, -656056, -41876, -8774081, -1581085, -4267587, -2313914, 1858110, -922881, -8786966, -440234, 4407710, 6904160, -6102612, 1708323, -4451197, -8776766, 14472429, -8746701, -7604240, -7581154, 2015413, 4234301, 6739341, -7294465, -9386651, -13447006, 8965207, 7967165, -5879810, -600759, -381178, -1536525, 7000260, -7474854, -2232309, -2383170, -9634685, 13732084, -7616051, -250719, -5628018, -1768453, 9619653, -12481175, -5137855, 3469260, -5399848, 4594005, -10599442, 3096672, 4489852, -7911330, 248571, 4256850, --7262253, 7353521, -10046465, 2806761, 10418517, -15159624, 4425427, -5793374, 1110249, 5954436, --4461934, -2321430, 1138166, 1294396, -838056, 4253092, -3168075, -2799782, 2149094, -2504503, -1435056, -970663, 1865090, 1670205, -2371896, 1215476, -386010, 2189897, -1940252, -584116, -1568200, 30602, -1083942, -3543348, 2317672, 2316598, -438624, -2458869, 2414309, -144418, --1001801, 2366527, -4924180, -1049046, 2935610, -3650722, 5364414, -3260954, 348966, 8699993, --2436320, 6255620, -3470871, -389231, 7056095, -4911295, 9025874, -46599860, -109318192, 30926986, -106989784, 73576544, 116342072, -64791728, -68966440, -94036696, -108853800, 2326262, 83965536, 86750288, -90569584, 17772038, -29945586, -59407988, -85263688, -72267656, 5616207, 56120728, 66568236, 59896540, -14321568, -16564615, -10351945, -46788300, -52334176, -22083112, -1438814, 20115480, 44105556, 21540872, -15989626, 22088480, -11049340, -26251914, -4311611, -41962904, -19695646, 451508, 6643778, 31963146, -37214280, 3293166, -5657546, -3507915, -27490476, -7454453, -402116, -5727339, 9493488, 18386218, --3941169, -1470489, -7239168, -11498701, 2338073, 1123671, -1272921, 20746840, 14033806, 5180268, --548145, -19588808, -28324236, -22395570, 1596654, 21053930, 18065706, 23721642, 3208878, 604517, -5378373, -29469382, -16785806, -13864691, -2538326, 22588844, 5091684, 7569880, 21066278, -12182675, --17724256, -4134980, -3042448, 6523519, 7582228, 2364380, 4224637, 1845225, -10887742, -11274826, --2765422, -16643, 8079907, 11706470, 3827353, -1668595, -2562485, -3347927, 2918430, -3301756, --13837848, -2182380, 3242164, 6392522, 13745506, 3339874, -2869575, -6624987, -11331197, -2486786, -1126355, 3678103, 6459094, 8076686, 6357089, -3274913, -9817758, -10344429, -9030706, -1043140, -4477504, 4962298, 13284871, 13642427, 6645388, -2953327, -16789028, -17755394, -8233453, -6224482, -6267968, 16568373, 12277701, 5311264, 70867, -1313723, -2155000, -5058398, -8322573, -7997766, --3400540, 1205812, 3506841, 5606006, 8131984, 7780870, 3052648, -2842195, -6265284, -6518687, --4183835, -918049, 641024, 546535, 176631, 75699, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --4398047, --2920041, 1234803, -1123671, -1386201, -2139968, 525597, 4264366, -1364189, 21475, 438624, -7299834, -140660, 1401233, -2997887, -2079838, -742493, -1958505, -2107218, -1975148, -1343251, --1876364, -2482491, 2096481, 3469797, -1898912, 529892, 147640, -3933116, 118112, -85362, --2785286, 5270462, -2684892, 2997350, 1149978, -806917, -3015604, -2792266, 2718178, -1409286, --1012539, -4161823, -1052267, -386010, -1955284, 5557151, -1205275, -349503, 2331094, -405338, --4621922, -2379412, -4073240, -2742337, 6344204, -1781338, 7054484, -30065, -282394, -1278827, -830002, 294742, -4179540, -4466766, 3262028, 368830, 2221035, -301185, 2585034, 1578937, --4049081, -28454, 1362578, 2187749, 4832, 1846299, 3376918, -4488778, 1195075, 1152125, --2234457, -2684, 1031866, 3218004, 2132451, -2246268, -667331, -124017, 765578, 1022202, -791885, 840740, -577136, 435939, -1209033, -784368, -5906, 1637993, 733903, -50466, --105227, -1113470, 665720, -86973, -367220, -96637, 594316, 244276, 430570, 1055488, --338229, 463320, 1284732, 9656697, -723702, -1136019, -2439005, -5237713, -6467684, -5915244, -690416, 5323612, 1881733, 7098507, 2458332, -3182034, 883153, -8390219, -7101729, 3339874, --2477123, 4693326, -409633, -3714073, -1836099, 9294309, 2096481, 3944928, -151398, 3026878, --1355599, -1112397, 1861868, -1250909, -4021163, -272194, 1508607, -445603, -216359, 5921686, -3673271, -6310918, 171262, -3993783, 6704981, 3975529, 305480, -2346126, -2413235, 3099893, -1740536, 5010616, -4602058, 7938174, 9732933, -2647311, 9483825, 13422, 4982699, 3107946, --1722819, 1665911, 7606387, -860067, -5089536, 4407710, 1439888, -29528, -562641, -873489, -350577, 4450660, -2816425, 1634235, 1212255, 2369211, -3641596, 4197257, 991601, -341450, -1344862, 633508, 430570, -150861, 967978, 2477659, -1704028, 1014686, 675384, 1057099, --1553704, 137439, -2508261, 466004, 1213865, -1438814, -912144, 361314, 722628, 848793, -252866, 774705, 21475, 37044, -8361765, -6541235, 2030983, -3710315, 2615098, -4632122, --6577206, -6075768, 823560, -4541928, 4122095, 3024194, -5840619, -1210107, 2345589, 543850, -2889439, -1726040, 2989834, 3702262, -5188321, 1643362, 1676648, -4156455, 2413772, 418759, --4917738, 3626026, 3479461, -1746441, 3803731, 543850, 3099356, 2824478, 1156957, -1844689, --483721, -5871221, -1795833, -2920041, 3062312, 3250753, 1256278, -9402757, 1767916, 3960497, --2153389, 6608881, -5433671, -7170985, 517544, -2127620, 2263985, -5119064, 9306120, -490163, --3154654, 915365, 85899, 5317707, -334471, -3099356, -238371, -2103460, -2901787, -3630321, -1675037, -6563784, 640487, 242666, 1893544, 4391067, 1408212, 3125663, 4800700, -3304441, --620623, 1084479, -4175782, 2831457, -1449015, 2413772, 1882806, -1277753, -1018444, 3551938, --1192390, -3229816, 416612, -338766, -163746, -1740536, 2539400, -1987496, 937914, 972273, -1271310, -510027, -584116, 161598, -1039919, 393526, -728534, 67646, -471373, -969589, -1215476, -490700, 226560, -169114, 28454, 22549, 175020, -20105816, -448824, -2561411, -13957570, 186831, 727460, 2881386, -2086280, 6970195, 1625645, -7705708, -4203163, -9019431, -1454383, -747861, -3180423, -2699924, -3386045, -2203318, 10827613, -5166309, -2617246, -2980707, --8476118, -483721, -2179159, 2722473, 4013110, -1483911, -186294, 2311229, -2690260, -826781, --1220308, -3151969, 3215857, 6620692, -941135, -1246077, 5203353, -7190849, 4452808, -5767604, --11507291, -7336341, -11461657, -1853278, -6593312, -4466766, 1058173, 4393752, 2159295, 3104725, --1804423, 3793530, -4945655, -1210107, 3973382, -139050, 5569499, -2500745, 1625645, -4117800, --3151969, 2845416, -7053410, 1737851, 5069135, -6864969, 577136, -1903207, -3250753, -4541928, --4109210, -1438814, -1869385, 955093, 4738423, -2455648, 1413581, -4173635, -4449586, -3519726, -1551020, 2206540, 513785, -1177895, -1362578, -1928440, 911070, -1650878, -1458141, -729608, --1359894, -265214, 151934, -2308008, -603980, -367220, -1759326, -536334, -834834, -95026, --373125, -3114388, 286152, 1165547, -654983, -1287417, -204548, 1767916, 884763, -832150, -12785581, 69256, -7154342, -6878927, -2365990, -5022965, -1941862, -3782256, 967441, 600759, --5657009, -3342022, -6211597, 11737072, 4978404, 1064078, -673773, 6354404, -9521942, -172872, --206695, -6036577, -8011188, 7143068, 142808, 5088463, -8033737, -3540664, -2798708, 2763812, --284542, 3403225, -5538361, 1644973, 2273112, -6027987, -5763846, -5250598, 1256815, -1752347, --1605244, 5032628, -1473711, 525597, 106837, -1037235, -5711770, -3529390, -641561, -8645232, --5603859, -4574140, 2417530, 1606855, 3464965, -892816, 1532230, -140123, -852551, 3960497, --3078418, 6931004, 1011465, 2065342, -884763, -2352032, 2813741, 2108292, 5549635, -1714229, -904628, 3313031, -1945083, 15032, -7233799, 3374771, -5556077, 3495567, -4092567, -4087198, --7797513, -1589675, 2044941, 802085, -1266479, 1769527, 853625, 3526705, 647466, -1152125, -3205656, 1653562, -2728378, 620623, -2203855, 2403034, -925565, 351650, -548682, -352187, --1928440, -142808, 192200, 309238, -1094143, 865973, -1600949, 591095, -220654, -914828, --1403917, 313533, -911607, 2040110, 690953, -642635, -832687, -934692, 1744831, 1017370, -1675574, 76773, 279173, 735513, 15052787, 14245870, 10618233, -3677566, 3850438, 5340255, -3110093, 2985002, -5374078, -4704063, -7014756, 6121402, -6586333, -872952, -4808753, 8142185, --9176734, -6876780, -3460133, -1545651, -5083631, -7620346, 2086817, 318901, 374736, -9225053, --5107253, 2308545, 1849520, 2514703, -2547989, -3717294, 219580, 2666638, 3445638, -2660732, -3273302, -4942434, -1358820, -11973295, 4286378, 1341104, -2117956, -2344515, -8836895, -4097936, -1031329, -2221035, -12383464, 6547141, 2667175, -112743, -3400004, -2684355, -5284421, 1489817, --1925756, 3442953, -853088, -1875290, -7079717, -1462973, -782758, -3968550, 7606387, -5688684, -21475, 4449586, -2001455, -6146098, -3475166, 5068062, 7429757, 3594888, -661425, -345208, -3889630, -8227010, 3213709, -983548, -482647, 249108, 1656784, -594853, -427886, 275952, --1676111, -5025112, -1413044, -1629403, 1400159, 907849, 474057, -2032593, -1088237, -2327872, --2791192, -812823, -196495, 3087545, 212064, 296353, 304943, -1271310, -749472, 1339493, --1792075, -412854, 486942, 780073, -2122251, -126702, -275952, 1038845, -1552631, -502511, --955630, -1570884, -3211562, -1589138, -249645, -1515587, -96100, -1611, -250182, -1883880, -18321256, 6164352, -2642479, -2105071, 6453725, -12330851, -2294586, 10035191, 5050882, -6950331, --120796, -4708358, 1967632, 7721278, 18940268, 6263673, 14761266, -5194763, -1056562, -14305999, -4901632, -4160213, 4073777, -6256157, -288837, 622770, -2190970, 5159867, -2260764, 2471754, -6374805, -4836133, 2902324, 8097624, -2157684, 2716030, 56908, 3260417, 4476430, 4559645, --24256364, 8895951, -2758980, -11376295, -1938104, 6955700, 2178622, -8789114, 4796942, 6933688, --14260902, 1150514, -3986267, 8422431, 1978906, 6956237, -1644436, -5012227, -9995463, 612570, --6022618, 18971944, 3565360, -3125126, 6385006, 788663, 6180995, -14942191, -1905355, 2293513, -4690105, 1087164, -6923488, -1115081, 2615635, 6629282, 5671505, -4651450, 188979, 6519224, --220117, 3058554, -2214056, -1146219, 4650376, 423054, -291521, -650151, 297427, 2221572, --2097555, -985695, -208843, 1717987, 1761474, -252866, -535260, 4488778, -1371168, -808528, --2316061, 280247, 1295470, -1223529, 152471, 1352378, 1914482, -1653026, -666794, -2720862, -268435, 2074469, -945967, 347892, 1049046, 1050120, 3714073, 416612, 1854889, -164819, --1512365, 2323577, 653909, -21703006, -23802172, -8147016, -1851131, 441845, 5066451, -10164577, -3216394, 11990475, -6868727, 6383395, 8308078, -5780489, 188442, -2814814, 10160282, 14158360, --6770479, -7991861, 7131793, 685584, -6784438, 3218541, 127238, 1774895, 2039036, -3634616, --2632815, -15128485, -762357, -4327717, -331786, -448824, 10302553, 3052648, -18445810, 308701, -8921184, -10099079, 2677375, 10859288, -2369748, 3821984, 239981, -2850785, -6996502, 13960791, -11770358, -8936753, 4699768, -3324842, -441845, 4343823, -3078418, 3642669, -5506685, -632434, -11818139, -3352759, 2518462, 5568962, -4004520, -9697499, -391379, 3326989, 1746978, -4661650, -640487, 2611340, 4220342, 8623221, 5363878, 9489193, 5042829, 1831804, 4440996, -1560684, -8587787, -282931, -6737193, -9110163, 1146219, 2954401, -1566589, 6806987, -3491809, -3680787, -2734821, -861678, 756988, 342524, -4183298, -592169, -2509872, 3092377, 1416802, 2485712, -4887673, 601832, -1692754, -7054484, -514859, 1631551, -1773285, -733366, 739271, -1575179, -1533840, 1561221, 228707, -1668058, -1155883, 3444564, -459025, 1613834, 886374, 1110249, --2443837, -2627983, -1516660, 594316, 1218697, 2058363, 1563368, 1003412, 994822, 2588255, --648003, -23369454, 26096758, -1501628, 16796006, 1293322, -9721658, -2904472, -5622649, -6821482, --871878, 479963, 12157442, -1906966, 8361228, -8376260, -419833, 2087354, 1950989, 972273, -10574209, 10536629, 3875134, 1697586, -1296006, -2025614, -569083, -1726577, -17533668, -5963025, -8135742, 5260261, -1918240, 924492, -8274255, 4242891, -10154913, 2266132, 16248398, 1798518, -3564286, -13437879, 7245073, 6318434, 1779727, -9001178, -3904662, -4173635, 793495, -8074539, -8349954, 10179072, 6174016, -851477, 15247671, 5434744, 22291418, 8739185, -5883569, 18574122, -482647, -6700686, 13474923, -2128693, 4495220, 8508330, -6031208, -5164698, 12474196, 13392782, -7949985, -10755135, 4184372, -42950, -4920422, -8821326, 6671158, 11862700, 7211787, 17196512, -2445984, -3710852, -3732864, -10492068, -3915400, 6609955, 1112397, -1866163, 514859, -6518687, --4515085, 992674, 1789391, -150861, 7192997, 5672041, 2593624, 299037, 2186675, 3432753, -1846299, -3212099, -1212255, 1037235, -634581, -1056025, 3108483, 343061, -715112, 2475512, -1046898, 843961, 1076426, -2094870, 689879, 6278169, -2669322, 3985730, 1968706, 239444, --2642479, -3026878, -1433982, 5740224, -12565464, 16683264, -4832912, -10983842, 3663607, 7245610, --7286949, -3707094, -15379204, 6420439, -5641977, -1874753, -14096620, -6215355, -4783520, -2433099, --6357089, 3301756, -2853469, -3496104, 3314641, 4631049, 8207146, 8016557, -3478387, -2934537, --11355357, 4447976, 220117, 7446937, 2055679, 1973538, -2571075, 2961380, -7095823, -6045167, -3345243, 1670742, 3396246, -13887240, 4641786, 9026948, -25233, -12237972, -12735115, -9967008, --29372208, 4113505, -3377992, 14178224, -6952479, 11770895, 3800509, 760746, 15241228, 2274722, --1748589, 10899553, 4064650, -14977088, -7407745, 1733556, -4747550, -8525510, -5138929, 19191524, -8868571, -9113384, -1083406, -5143760, -2470143, 2756832, 13611288, 190052, -3628711, 17923972, --6423124, -16394427, -15563888, -18546742, -3260954, 1354525, -459562, -3313567, -2237141, -7966628, --1528472, 2251637, -2425583, -2402497, 1589138, 1450088, -11595338, -4842576, -9073655, 370978, --3053722, -3012920, -4841502, -1589138, 1336272, 6995428, 107374, 8593693, 4295504, 6294812, -710817, 2931315, -2932389, 5734318, 1074, -4234301, -6190659, 3527242, 607201, 1925756, --1590749, 1081258, -1923609, 1945620, -667331, 2318209, -460098, -1076426, 1572495, -382252, -7329362, -12034498, -2995203, -3197603, -1542430, -802622, 32114544, 5288179, 11767674, -5654862, -10283225, 20702280, -17671106, 26883810, 15961172, -7150047, 285615, 1660005, -9608916, -16163036, -1161252, -9359271, -14401562, -6447820, 1333051, 51540, -1726040, -6468758, -1035624, -6298033, --388158, -7286412, -480499, 5034776, -11301133, 6262599, 9618579, -7421167, -6862821, 4958540, -3787624, -626528, 28858422, 2563022, 19258096, -13780403, -1277753, -16713865, -12222940, 2980171, --12258374, -16897476, -11216307, -12829604, -2737505, -3402688, -14203457, -15488726, 20304994, 3196530, -1341640, -2724083, 10553808, 5838471, 12716861, -1236414, 12025372, -6665789, 2797634, -22345642, -18345416, 8851391, 1511292, -12265353, -849330, 5563057, 1242319, 2153926, 9105331, 12606266, --9672266, -12521440, -8171176, -1946694, -126165, 1387274, -7281580, 855772, 2195265, 5203353, -6830609, -838056, -4080756, 7043747, 3560528, -5231807, -271120, 2553895, -3044595, -5530308, -1094143, -1866700, -1733019, -155156, -2336462, 6458020, -6701760, 3754338, -96100, 7142531, --7345468, -1792075, 1352378, -1874216, -2734284, -1181653, -5797669, -6472516, -1122060, 696858, -2022393, 2370822, -4295504, 4483409, 3487514, -2636573, 4103841, -766115, 2407329, 217433, -2386391, -1780801, 15586973, -6415608, -5237713, 17405892, -14721537, -11235634, -2782602, -8945880, --1461900, -17523466, 3882114, -10805601, 8221641, 1123671, 2777233, 9952513, 2833068, 7011534, -9651328, 9157407, 7556995, 12848395, 1489280, 8719320, 7814156, -9453760, 16237661, 3941706, -7482907, -8830453, 12661564, 5679021, 8877697, 2211371, 3138011, -1698123, -11764989, 2932389, -6580427, 7762080, 8487929, 1783485, -14299020, -9065602, 10203769, 5523328, 2283849, -5472325, -7047505, -5238250, -14333380, 20914344, 12757127, 9304510, -8121783, -4031901, -10691784, -33219962, --1055488, -4691715, 4229469, -7809325, -8377871, -14687714, 2533494, 4624069, 18505404, -14703284, -5883569, 204548, 8491687, -12955769, -15869367, -9703942, 10166724, 3047816, 3145527, 5361730, --4392678, 1741072, 11926587, 4190814, 6015639, 7574175, -3104188, -2856690, -5071283, 51540, -5185100, 6413997, 193810, 2615635, 1260573, 978179, 4869956, -3117610, -2662880, -4367982, --2461553, -4518843, -186294, -6825240, -2771328, -7212324, -448287, -4371740, -1282048, -1061394, --2522757, 1972464, -1833414, -9245991, -1422708, 3587908, 3957276, 7470559, -1181116, -4573067, -2088965, -1856500, -6730751, 6067178, 5147519, 4913980, 11615202, 7558069, -705985, -26699128, -15480136, 16469052, -8049843, 14057965, 4898947, -22501870, -3898220, 29790966, -4128001, -19658066, --2989834, -1802276, -17064978, 12115029, 2597382, -8557722, 13054016, 8694088, 30728344, 18050136, -580894, 2354716, 28998008, -7308424, 7420093, -11700565, -16878684, -4962298, -11430519, 2704219, --731218, 5928666, -769873, -1967095, -4773320, 22879828, 1220308, -17839684, -14121316, -3135326, --3573950, -533650, 7556995, 20892868, 13407277, 4500589, -12489765, 16276852, 29673930, -6140193, -13550085, 12670154, 35733592, 6882685, 6921877, 10878615, 15310485, 8526047, -12084427, -11639898, -8333311, -21716966, -13006235, -15531675, 14980846, 13095892, 9218074, -3433290, 11085847, 22962506, --12882218, 18314814, 18274548, -2321967, 17968532, -16631187, -7235946, -5724655, 37480568, -18101676, -18505940, 11591580, 6924024, 5336497, -16348793, -1514513, -12817256, 14071387, 13430363, -85899, -1161789, -6542846, 10093173, -3754875, 1181653, 3860102, 4256313, 97174, 6242735, -4042101, --2040646, -1533303, -3944928, 2013266, 3857418, -2951180, 1881733, 4421669, 7785702, 1291711, --6753299, 3087008, -7335268, 1484985, 7048042, 4577362, 7445863, -1118839, 11867532, -4476967, -8827232, -2120640, -2542084, -1398549, 730144, 9511205, -6568616, 4634270, 53687, 4693326, --5294084, 1590749, 2522757, -2408403, 12593918, 5956583, 20477868, 36502928, 3943854, -3748433, -3893925, -1930588, -5972152, 1112933, 3846143, -8878234, -11830487, 4058207, -6122476, -3333432, -9337796, -432718, 18304076, -9576703, 17948132, 8825621, 1814624, -10359998, 3437048, 17884244, -5229123, -9037685, 3592740, -2126009, 571768, 10518375, -14456323, -7652558, 16287590, 376883, --3928285, 14111115, -614717, 5014911, 3284576, -13441637, -24474334, -5168457, 8611946, 15775952, -3498788, -12047920, 15819975, -5117454, 31994822, -16115254, 21566104, -12505871, 7789460, 18440978, --27084064, -28075664, -72478, -7922067, 7386270, 8999030, 1418950, -4103841, -16499117, 11245298, --2273648, 19990926, 9160628, 18616536, 5215701, 10848551, -4384625, 14299020, 5308043, -8508867, -1893544, -217970, -40955196, -1193464, 7402376, 9970230, 17560510, 14766098, -4631049, 1258425, --2877091, 2774012, 170725, -4558571, -10716480, 4748087, -6172942, 14270029, 1873143, 2791192, -7202660, 4155381, -4285304, 4121021, 10540387, 9066139, -2876018, -1638530, 1698123, -2189360, --1274532, -6445672, -944356, -13508209, -1651952, 4634807, -11038603, 7819525, -8270497, -6905234, -2263448, -7023882, 7395397, 2772402, -2437394, 4662724, -284542, -777389, 3256122, 9916006, --6630893, 1539209, 1758252, 23791434, 30776662, -6739341, -1206349, 10842108, 40719512, 1120450, --24107652, -9663676, 4888747, 4611185, -7628936, 7762617, -5512054, 12597139, -20443508, 1047435, -12721156, -8560407, -9225053, 1748589, -20204600, -6254546, -6584185, -32190244, -27158688, -15768972, -11850889, 13915157, -2447595, -22921166, 2576444, 776315, -808528, 4549444, -11489574, 27436788, --7840463, 3460133, 30444338, -26687854, 12853227, 4464619, -9290551, 11028402, -7195144, -21649856, -454193, 18648212, -8357470, -13619341, 7793218, 2474975, 17830556, 89657, -27464168, 2153389, --16233366, 27020176, -9810242, 4045859, 6664179, 3198140, -3878356, -17620104, 7347079, 18382996, -5364951, 18967650, -27843736, -15384036, -4580046, -301185, 3010235, -21547850, 19260780, -2698313, --20477868, -6889128, 12971338, 12004970, -11334419, -15812459, 15575699, -12599287, -7844758, -345745, --1912871, -1770600, -1000727, -4642860, -852551, 7754027, -1755568, 7121056, -8203925, 5647345, -7517804, -2070174, 4072166, 1166084, -1493575, 44560, 1048509, 13314399, 733366, -2610266, -1176284, 2920041, -6637335, 2343442, -8496519, -727997, 9922448, -3595425, -7731478, -2922188, -4478577, 103079, 377957, 5789616, 520228, -7834557, -3994857, 14157286, 10429254, -3458523, --546535, -21110302, 31081604, 905164, -53181896, 21330956, -7292855, 4165582, 5448703, 7162395, -13080323, 4780299, -9612137, -2308008, 13172665, 8911520, -10543608, -547071, -8361228, -4327717, --26111254, -3316789, 12597676, 15636902, 3531537, -6181532, 17322676, -17805860, 19735374, -11341935, --6359773, 2366527, -6096706, 5272609, -15706159, -21216602, -23740968, -7590281, 12326019, -4737349, -141734, 14486388, 4040491, 2543158, -432718, 505732, -4983236, 208306, 15618649, 9614821, -16481400, 13972602, 16534550, 11248519, -9795747, -6250251, 4079145, -1040993, -18952616, 12769475, --3411278, -17918604, 22527640, -245350, 3681324, -618475, -8162586, -2695092, 9474698, 13697188, -11412265, 353798, 6999186, -22958748, -3237332, -8180839, 12520367, 4315369, -6375342, -7304129, -28942174, -8815957, -9880572, -3135326, 4689568, -7162932, -19028852, -1080721, -3237332, -10303627, -17886928, 3635690, 6750615, -5499169, -927176, 4146791, 1102196, 5238787, 5694590, -1872606, -3504693, -3457449, 3968550, 1478006, -3126199, -2415919, 2949032, 4082367, 1151051, -3660923, --2978023, -3296924, -2374043, 49929, 2079838, -2996277, -3545496, 810675, -244276, -687732, -3141769, -1500017, 4954782, 1439351, 14432164, -1272921, -1759326, -3232500, -6194417, -8096550, -72334768, -71203576, -3646964, -77408192, -12050604, -29493004, -3663070, 18780282, -9669582, -21496312, -33653752, -9224516, -5961415, 1017907, 10315438, -1306744, 27955942, 18461916, 11042898, -16656420, -1018981, -11397233, -11573863, -7786239, 332323, -3640522, -3185792, -9455907, -2170032, 15392089, -1819992, 10149008, 10152229, -934692, 13581760, 19811610, 977105, -4195110, -10490458, -12533788, -4871567, 5326833, -10399190, 16770237, -22409528, -22688702, 2391223, -8016020, 11973832, -21044266, -8832600, -40361956, -21551072, -32335198, -2899103, -16019154, -1548873, -9822590, -12213276, -10646150, --1072668, 2614025, -31589484, 3474629, -7005629, 3499325, 31139, -14664092, -25720948, 17597554, --15523622, -2859911, 15730318, -1713692, -5083094, 10376641, 13019656, -2814814, 12969191, 8463770, -15695958, 8618926, 15884937, 7477538, -9596031, -2739116, -8466991, 284005, -7029788, 1383516, -5684926, 8101382, 8866960, -4076998, 4061965, 2905009, 5778342, -1486596, -2355253, 2987687, -6950331, 844498, 1535451, 7699266, 3887482, 7930120, -1247688, 289373, -930934, 3830037, -5444408, -1085016, -9322763, 4981625, -1640141, 1891396, -2994129, 1211718, -2719251, -1431835, -386547, -7750806, 29528, 10459319, -6672769, -7001871, 813896, 3532611, 3573413, 1184337, --6903086, 58997280, 29798484, 14583561, -13860933, -7016366, -30294014, 7078643, 24894704, -4467303, --5508833, 40556304, -6877317, -8620536, 20244866, 29774860, 5426155, 30358976, -7187091, 4692252, -18067316, 20345260, 31957242, 25885232, -1022739, -11110007, 9833328, 11823508, 11218991, 13843753, -23983634, 11861626, 30413200, -11389716, -475131, 9070971, 8490077, 25746182, 15136002, 27569932, --19363860, -5935645, 11221676, -20961052, 17458506, 17651242, 16993574, 7344394, -21060372, -7573638, -40877888, 10674604, 27664422, 22911504, 25193742, -4883378, 33287608, 51831664, 18097382, 4762045, -36530308, 25218974, -13620952, -8389145, -17212082, -13832479, 15559056, 17895518, 1853815, -14752676, -623307, -13178570, -310848, -5800890, 9043591, -31238908, -3277060, 3319473, -15600395, 12139725, -2424509, -9674951, 8691403, -19632832, -12551505, -21772800, -7022272, -10448582, 8040179, 2515240, --9884867, 2405182, 14602352, 4313221, -4391067, -8608725, -13220446, -5147519, 4771709, -19063750, --8631811, -1576790, 15661061, 5205501, -6248641, 3255585, -10031970, -2796024, -2892661, -8524436, --5238787, 14383309, -3047279, -1016834, -3241090, 3381750, 9451076, 6512781, 8131447, 19786378, -277562, 15930034, 993748, 1576790, 10256382, 8497593, -12927852, -7720741, -803696, 2974265, -1619203, -8053, -18720152, 9063992, -22537840, 39040180, 55475408, 32251446, -14447196, -30711700, --11438572, 27382564, -8332774, -22921166, 41289668, -28874528, 24579024, 13856101, -32774896, -13625247, --3621731, -53893248, 1932198, 6068252, -26144002, 52874804, -18416282, 49105436, -37081672, 5374078, -2144263, 35887136, 52766896, -4446902, 17767742, 24946780, -29532732, 19594714, -39897560, -10999411, -75120048, -4299799, -21036750, -4122095, -42425688, 1780801, -13533979, 47118476, 17672180, 21922050, --7492571, -12481712, -23744190, -21734146, 5196374, 3000572, -155693, 31394064, -7904351, 5994701, --32862942, -16879222, 21477520, -48512728, -19420768, -14573898, -16884054, 45344116, 3002719, 48994840, -34803192, 15650861, 18474802, -10930692, -26183732, 21980032, -35531192, -21460878, 43133820, 13262859, --26495116, -43097312, -26451630, -30645128, 24337970, -26438208, 13414793, -19066970, -2017024, -16357920, -17156246, 10308995, 1170916, -14168023, -3018825, -9747428, 2513093, -19290846, -13845901, -7193534, -3867081, 10953240, -805306, -7780334, -11478837, -17894982, -13336410, 11587285, 15206332, -4787278, -10340671, 22092238, 10021769, -20227686, -6480032, -7334194, 12387759, -12272332, -8694088, -2762201, -4228932, -16168941, -22611392, -15518791, -5788542, 9257265, -852551, 2241973, -3693672, 12622372, -3303367, 35417376, -58496380, 62438088, -1465658, 4899484, -19877108, 50437948, 11911555, 32517734, -12341589, -21149492, 7334731, 18105972, -30724586, 21656298, 466004, 14403173, -41045928, -3107946, -10162429, 37965364, -15719043, -31134218, -1296543, 37759740, 19945828, -14286672, -32397476, -1500017, -27260158, 3660386, 1962800, 7641284, 19835770, 50016504, -70294656, -11500312, 6866042, 39242044, -8827232, -21212844, -5215701, 15018964, 35883916, -3505767, 1808181, -67368176, 19603304, 10662793, -18474264, -48847200, 43368432, 37404872, 14105209, -22032108, -2185065, -24389508, 18388902, 32053878, -13467407, 15065135, -2717104, 24328306, -35209068, 33567316, -9832254, -11807939, 39385924, 32521492, -2165201, -12121471, -32249298, 23796266, 25982942, -69102264, -5413270, 39938900, 9992778, -310311, --24684788, -10525891, 67747744, -5052492, -23072028, -2798171, -12407087, -14925548, 22578106, -18893024, -6940667, 10408316, 13806172, -9368934, 1420024, -9513889, -11515881, -7586523, 10440529, 10529649, --10536629, -1977833, 5254893, -8279623, 20543366, -19517942, 5192616, -3393024, -6303402, 7422777, -33978024, 2373506, 131533, -5295695, -11869679, 204011, 18530100, 4549981, -787053, -3427921, --8619999, 15870441, -3985193, -766652, -9154723, 9167608, -52147884, 25677462, 5065914, 16405701, -19749334, 28663002, 10262287, 9326521, -13441100, 14863271, 2859911, 33996276, -3737695, -9921911, -26737782, 20587388, -4314832, 1948841, -11210938, 545461, 8576513, -2424509, -6634114, 15364709, --11922292, 1768990, 20685636, -4223027, 12004434, -20711942, -4111894, 3016678, -8464307, -3111167, -2549063, 15193984, -3656628, -24794310, 1133871, 50149112, 10494216, -26795228, 8232916, -27318676, --18733036, -13971529, -3715684, 32126892, -3313567, -25088514, 51651276, -55427628, 9611063, 57191784, -6167036, 40303972, -30407832, -56697328, 18554796, 2283312, 45592152, 2741263, -25469156, 21442624, --5586679, -4372277, -10744398, -1460826, -15791521, 8330089, 2374043, 12520903, -19316078, -16368120, --6505265, 20540144, 26072062, -8254927, 13954349, -1683090, 21852794, 15761993, -27122182, 22209812, --5422933, 3651796, -4453881, -8050916, 85362, 309238, 3138547, -1646583, 2479270, 2401424, -1737314, 3583077, -8808978, 914291, 5208185, -7064685, -782758, 5264020, -4621385, 6765111, -7148973, -9803800, 12596065, 5528697, 13040594, -2370285, 6152004, 10838887, -19380504, 258772, -6189585, 11931419, -6803765, -4683125, -6537477, -4351876, 22156126, -10135586, -106493176, -244153856, --97014720, -147111216, -215228864, 115087944, 31514860, 66060356, 305528928, 235443664, 137154944, 251477312, -187502704, 31738198, 61700428, 51320564, -119776976, -102499928, -50463720, -182902800, -174986624, -67205504, --90123984, -126987152, -53385368, -45837500, -129331664, -107922864, -9384504, -61624192, -104951824, -36230732, -32875290, -76236744, 22398254, 112650016, -9066139, -16517907, 152976000, 122218664, -5825587, 178953568, -207263840, 84055728, 194702144, 273553440, 162918848, 141645344, 328174144, 261996224, 196725072, 233493216, -309586080, 110580912, 43506408, 129544264, -102869296, -294081792, -213476512, -325214912, -526698816, -471585248, --500714272, -581980416, -593386752, -511484448, -445680704, -446705600, -314376576, -139270224, -94665376, -14501957, -151785216, 279665184, 282040288, 350556320, 504142176, 440926720, 402742848, 557059968, 442388608, 250142112, -364811840, 255635376, 98792840, 89697704, 117497960, 11982422, -37787660, 22746684, 2836826, -82906288, --44630080, 7207492, -66430260, -122240672, -59158880, -83909168, -178365696, -112239304, -43852688, -133041984, --89887760, 17794586, -42775728, -62180924, 29912300, -36818072, -146983984, -112297824, -180297360, -303956992, --286713216, -274494048, -285630368, -250611344, -168907104, -131568272, -79719424, -15364172, 66423280, 118810072, -181738864, 229998720, 285086496, 297256832, 314661664, 351279456, 332600672, 305599808, 288465568, 191623728, -66986456, 6649683, -29064044, -81466936, -96795144, -83759912, -95332168, -106209712, -94211184, -94285808, --93087512, -77677168, -76464376, -79218528, -77041512, -66199404, -55065240, -45322104, -28477780, -13413720, -3209951, 10022306, 13147432, 9614284, 5858873, 4073777, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --8562554, -5064840, -6513318, 790274, -2760590, -862752, 2532957, -4039417, -7337952, -1877438, 619549, --4208531, -2426657, 3556770, -2112587, 1644436, -9188009, -791348, 6214281, 3308199, -10279467, --3543348, -2697776, -2734284, 3470334, -1503775, -5354751, -3367791, -3828427, -3900904, 6772090, -2113124, 4361540, -2831994, 5729487, 5203353, 3711389, -2066953, -4863514, -3825742, 403727, -964757, 7794829, 2758443, 1483374, -3677566, 847182, 331249, 891743, 3083787, 1830193, --5298916, -4500052, -2331630, 2849174, 657667, -996969, -5664525, -1729261, 2213519, 2563559, --2289755, -862752, 119722, 2714956, -592169, -2993592, -3758, 433255, -3868155, 8221641, -509491, -5576478, -16643, -857383, 5268851, 426812, 3562675, 4934381, 1839857, -333397, -228170, -1787780, -1178969, -1187022, 3121368, -1005559, -417686, -1409286, 1067836, 383863, --621697, -122943, -833224, 171262, -134755, 643171, 621160, 1054951, -5645198, -5108327, -5800890, 5320928, -4297115, 3205656, 324807, 1654636, -14120779, 5468030, -2095407, -9640591, --12573517, 344671, 9098351, 555661, 5900748, 226560, -11370926, -3919158, 1316408, 3986267, --1998234, -965831, -4784057, 642635, -864362, 8048232, 4092567, 1716913, 1449015, 2193118, -2798171, 7339026, 4449586, -6467684, -542777, 1514513, 1574642, -7694434, 2513630, -2282238, --4864588, -1370632, -198105, 5277978, 1363115, -2936684, 5345624, 8326868, -1753957, -3147674, -2020782, -587874, 4558034, 4645007, 3640522, -5554467, -4224101, 3997004, -1673964, -1389422, --4255776, 469225, -6325413, 3780645, 3411278, 4472672, 1159641, 5196911, -5604396, -3521336, -7303592, 388158, 2716567, 8616241, 3340948, 853625, -3453691, 5056787, 621697, -2556043, -1459215, -6081674, 188979, -635655, 923418, 1640141, -678068, -2706903, -1469953, -436476, -1344325, 1248225, 438087, -744640, 761820, 1723893, 322659, -564251, 7201050, 649077, -2796024, -6038187, -5127117, 2956548, -1412507, -2199560, -2798708, -2615635, 2196339, -6988449, --4002373, -8633421, -10377178, -1908576, 8660265, 5590974, -3481071, -958851, -1189706, -1998770, --7471096, 5405217, -1866700, -1907502, 484794, 3538516, -1674500, 328028, -247497, 5117991, --4705674, 5134097, 2805151, 6152541, -2082522, 4763656, 2121177, -2920578, 4290673, -2887292, -2474438, 4565550, -3423089, 4794257, -2843268, -2286533, -712428, -1397475, 2415382, -1375463, --3624416, 1477469, -3145527, 708670, 438087, 508417, 7213398, 1416802, -1648194, 57445, --2946348, -4105452, 2138357, -976031, 6885370, 7030862, 2851858, -1930051, -1075889, -32749, --2757906, -3180960, 3544422, 5576478, 185220, -587337, 3425237, 3706557, -476205, 1321239, -1190243, -2663417, 2548526, -468688, 3655017, -1792075, -694711, -119722, -1516124, -147640, -2662880, -563714, 807991, 798327, -1878511, 608275, -343597, -360240, 760746, 715649, --1203128, 1391569, -464930, -570157, 99858, -134755, -227096, -1077500, -816044, 13702019, --5815923, 5609764, -7005092, -5894306, 15569, -1646046, -1500554, 1897839, -2953864, 5917391, -5774584, 4944044, -1500017, -660888, -2594160, -6344741, 978179, -3817689, -714038, 679679, --2130304, 3592203, 1354525, -447750, -10458782, -4377109, -6594923, 231928, -4317516, -6638946, --2911451, -3675418, -4057134, 6578280, -5276368, 4632122, 396211, -1886564, 2596845, 2221035, --4729833, -1309965, 91805, 5076115, -490163, -6978248, -8837969, -9211094, 2388002, -3375308, -198105, -745177, 1326608, 3091303, 5107790, -3547643, -1872606, 1665911, 1755568, 637803, -6408091, -3602941, 3962644, -7380365, 14431090, 1757179, -1536525, 2788508, 1381906, 2742337, --4010963, -724239, 1097364, -462246, -861678, -7299834, -2418604, -4966593, -1469953, -596464, --3564823, -3505767, 2597382, 3011309, 928787, 578747, -326418, 2542084, 1511292, 2921115, --1462436, 243203, 100395, 2683281, -1072668, -174483, -153545, 285615, -2124398, 510564, --1533303, 765041, 1091995, -526670, -1784022, 344671, 570157, -569620, -602369, -1948305, -528818, -239981, -967978, 1207960, 1425392, -192200, -6662568, 1022202, 1291175, 492311, --1013075, -3969624, 2436857, 1960116, -6014028, 7165616, -8830453, 10998874, -1028108, 3702262, -1661079, -176631, -1133871, 2300492, 10310069, 11560978, -2161979, 2120103, -1343251, -1587527, -1570347, 2491618, 7939247, -954557, 2436320, -3947612, 4372814, 1008780, 6269042, 3063386, -5874979, -8358007, 3590056, 3113315, -2601677, -38118, 6374805, 77309, 541166, 1976222, -3896609, -1256278, -501974, 12261058, 5856725, 1132798, 1158031, -2501282, 5590974, -7327751, --10766409, -13038984, -759136, 6933151, -165356, 3482145, 9352291, 3728569, -1601486, -3222836, -5007932, -913217, 12012487, 5428302, 1821066, 1722819, -6484864, 1438277, 4977330, -2461016, --7307350, 1341640, 2691871, -270583, -2508261, -888521, 1297617, -2339684, 1429687, 1411434, -1296006, -425739, 1488743, -2295660, -2137820, -671089, -1340030, 798864, -2145873, 1316408, -2199023, 1462436, 1670205, 1673427, 559956, 1090385, -2976412, -2506114, -904628, -1293322, --1532230, -281320, 1060857, 606664, -61203, 1940252, 1075889, -99858, 2437931, 1530082, --15933792, 1724966, -1189706, 10956462, -8174397, 4817880, -16872242, 6664179, -1577327, -8591008, --9440338, -6598681, 5060009, 3957276, 12836047, 1719598, 4287451, 12288975, -2114735, -8908299, -1358820, -6859063, 1700807, 10024991, 1879585, -2784213, -1171989, -1893007, 2961380, 3897146, --804770, 2612951, 5174899, -3194382, 1652489, -6025839, -449361, -7546795, -1167694, 1058173, --3570729, 5612986, 3835406, 4787815, 9511742, 634045, 11507291, 8822937, 4272419, -5946382, -13193603, 5698348, 2333241, 11575474, -1248225, 287763, 979789, 3861713, -2390686, -3342558, --7895224, -7626788, -6231998, 99858, -4914517, 10162429, -6092411, 4223027, 6338835, -3519189, -338229, -2871186, -1686312, -9919764, -11381663, 5245229, -1975685, -3787088, -3368865, 1010391, -1342177, 807991, 2239289, -3942780, 9324911, 695785, 2809446, -1869921, 524523, 2815888, --4536559, 1574106, 179315, 1614371, 2115808, 32749, 1653026, 3229279, 9664, 964757, -2295123, 2579128, 3297998, -89657, 565862, -1637456, -469762, 220654, -788127, -2334852, -169114, -634045, -1033477, 317828, 13381507, 539555, 192200, -1204202, -2579128, 2429341, -585189, -6781754, -8699993, -11800960, -6170258, -12348568, -7842074, -4186519, -9131637, -5762773, --3978214, -4730907, -12355010, 8524973, 5348845, 345208, 4503810, 2087354, -3413425, 15406048, -970126, -5281736, -2765959, -10390600, -4459787, 11481521, 579284, -9575093, -9582072, 1432909, --9699647, 3148748, 3429532, -7538742, 319975, 2400887, 557272, 11303817, 3394635, -5110474, -1157494, -6133750, 5707475, 846109, 2537789, -13743358, 9521942, -4698158, 3978214, 357556, -1861332, 2301566, 373125, -3973919, -299574, -5341329, 28991, -10823854, -42413, -11679090, -15469398, -2586107, 9848360, -7187091, -3363496, -1509681, -7443179, -4122632, 6054294, -172336, --213675, 4519380, 5820755, 975494, 9494025, 8249559, 11414949, 6116571, 2440078, 1438277, -5193153, 2812130, 1740536, 2154463, 1191317, 2590939, -696858, 4201552, 745177, -214212, --852014, 3286187, 1336809, 2355253, 1176284, -1464047, 1126892, 1332514, 1094143, -2446521, -4798016, 2631741, -439160, -3587372, -374736, -489089, -2596308, 1015760, 501437, 2778844, --2208687, -4973036, -6855842, -35433, 5032091, -13160854, -10737, -5692979, -4558571, 9308268, --15178951, -14338748, 3729642, 19103478, 484258, 1810866, 1464047, -2918967, 10458782, 10154376, -5864241, 2876018, -2761127, -15540265, 9202504, 71941, -12451110, -4022237, 2880313, -635655, -98247, 1265405, -3003256, -12261595, -696858, 494458, -2246805, -5127117, 3670587, 10622528, --13720273, 8524973, -5148592, -2589865, 807454, 6762963, 22275312, -14418205, -3639985, 1407139, --1437203, -2645163, 727997, -5532455, 1913945, -4997195, 15311022, 5260798, 2860985, 4219806, --3247532, -892279, 8099772, -1282585, 3514894, -6750615, 11751031, 514859, -8335995, 16441135, --10492068, 7565585, 2147484, 3727495, 11951820, -4776541, 5082557, -590558, 12348, 1433982, --812823, -8083129, -4289599, -527744, -3581466, -1275605, -1957431, -4961761, -5074504, -3810173, -2347200, -4345970, 2486786, -1167694, -190052, -3814468, -2616172, -2816425, 2225330, -5263483, -514859, 500364, 3177739, 4983773, -1970853, -958315, -4507568, -3847217, 255551, -3385508, -936840, -634581, -3003256, 47782, -920197, 1351304, 1783485, -1262720, 16307991, 1283122, -4259534, 4844723, -2718178, -9373766, -7347079, 1136556, 16314433, 9251360, 2018098, -14571213, -2113124, -8010114, 60130, 16321413, 15700790, 7933879, 10617159, -9558987, -19801946, -10366977, --14267881, 7927436, -128312, -2405719, -40802, -10799695, -3194919, 3351148, -2016487, -4099010, --3980361, 11566347, -732292, 3152506, -3270081, 7585449, 1622424, -4365835, -9176198, -7054484, -20940650, -894427, -4714264, 6691559, -11938935, 3755949, -6825240, -20885352, -4668630, -2712272, -6342056, 2428267, 5574331, 1769527, 8286603, 315143, 594853, 4581120, -20397336, -3221226, --5463736, -1453846, 2004676, 11729556, 12975633, 4672925, -3367254, -8928163, -11710765, -3935801, --6880001, 1482301, -3409667, -3655554, -8056822, 12093554, 8739185, 3544959, 11144366, -2644626, -4466229, 6822019, -4316442, 4064113, -2770791, 891206, 4082903, -1232656, -2661269, -1116155, --1456531, -1054951, -64961, 275415, 4048007, 163209, 509491, 1235877, -2202245, -6179384, -280247, -1439888, -770947, -1117765, -3604551, -412317, 1245004, 5497558, 4551592, -2550137, -668404, 3617436, -731218, 833224, -1264868, 830002, 3506304, 437013, 3844533, -23621784, --15449534, -3588982, -5636071, 12045236, 8269423, -1992865, 20753818, -21005074, -4908611, -7936563, -22169010, 10628433, -7303592, 8164196, 3098819, -8647917, 15307800, -16910360, 8353175, -7794829, -1309428, 1829119, -5651103, 14781130, -10408316, 9072045, -4340602, -21777632, -3620658, 15192910, --9214315, -14872398, 194347, -1864553, -22244710, -4168803, 8914205, 3773129, 11851425, 8710731, --2519535, 21378736, -5124970, -6596533, -10525891, -9804337, -9480067, 5862094, 7981660, -6894497, --7772280, 2553358, -6742025, 8959839, -2474975, 4859756, -3646964, -5568962, -4272956, -130997, --12590697, 3401077, 9073655, -2129767, 3922916, 5447629, 6442451, 11613055, -8318815, 3731790, -9059697, -1174137, -19302656, -20551418, 2261837, -1957968, 1526861, -7524246, -3122978, 1510218, --7441031, -13505525, -4124242, 10187126, 8269960, -4063576, -1642825, 3134253, 2798708, -1609002, --3275986, 244276, -427349, -5308043, -1961190, 5644124, -1615982, 4536023, 826781, -1407139, --2768643, 3646427, 3600793, 4220342, 517544, -2359011, 2460480, -6316287, -3779571, 3127810, -1472100, 2686502, 4942434, -2503966, 1039382, 1947231, 2421825, 476205, -2866354, -4134443, -1879585, -2241973, -1359357, 17055852, -10550587, -26788784, 249108, 19338628, 24639154, 4725001, --8906688, -6634114, 2647847, -4226248, -3743601, 10921028, 11052025, -5201743, 10668162, -13208635, --1509681, 9801652, -4580583, 11837467, 5619965, -1457605, -15941308, 6310381, -3637301, -3651796, -945430, -1030792, -1590749, 22212498, -10717017, 11423002, 19006304, 13276281, 7011534, 423054, --12368432, 12669080, -6875706, 12081206, -6599218, 2934000, -13012140, -2340220, -12293270, -7956427, -1986422, -11352135, -3090766, -3828427, -373125, 10478110, -12009802, -10216117, -3702799, -5778879, --2360085, -10120554, -13245679, -16489990, 1781338, 13163538, -804770, -8015483, 1480153, 2979097, -10384694, -11104638, -6390375, -3391414, -196495, 7946763, 228707, 2394444, -7718056, -3020973, -4168266, 15881178, 7107097, 11054709, 12664248, 16587701, 6461779, -1945620, -5635534, 4256850, -5155572, 7492571, 3231426, 987306, 169114, 10204842, 3710852, -3359201, 957241, 5869073, -2415382, 1668595, -3461744, -3227668, -2360085, -4612795, 514322, 5017059, 4673998, 1335198, --2480881, 6876243, 3954591, 8622684, 4505421, 610422, 5726802, 441845, -4107063, 6714645, -142808, -476205, -2224256, 1645509, -1324461, 269509, 5739150, -45168560, -21471078, 15068893, --36881956, -25567940, -1646583, -15049565, -10315438, 11253888, 12876312, 3941169, -2360622, 4659503, -36840620, -4518306, 5900748, 14176076, 16169478, -16802448, -8706972, -7960722, 13611288, 14839649, -7471096, 2726231, 13917305, -4092567, -6950868, 9756555, 18832894, 1332514, 6099391, 19129784, -14137959, 11502996, -8567923, 3616899, 5821828, -46171, -289373, 12273943, -4000762, -204011, --1213865, 8192113, 337692, -13447543, -8960912, 2681670, -18210124, 13807783, -4017942, 30522722, -1253057, 16732656, 3359738, -748398, -9808632, -491774, 3955128, -12933757, -6606197, -15107011, --1864016, 7695508, 10557030, -4610648, -24506010, 8868034, -3855270, 8347806, -8755828, -10546292, -7756711, -15935402, -12119861, 23666344, 406411, 10878615, -2180770, -10300942, 2903935, 13918915, -3455838, 11058467, -17929340, -938450, -1161789, -3028489, -15403900, 15047955, -8943733, 1055488, --1702418, 1767916, -5672041, -617938, 3235721, 4568772, -3762928, 9830643, -2372970, -3224447, --5727339, -5008469, -4932233, 4688494, -1854889, -3563749, -1397475, 1188095, -3734474, 6844568, --1997697, 7753490, -4833986, 3248606, 1282048, 3050501, 5141613, 953483, 18333604, -8333847, --21175800, 9108552, -11052561, 4655208, -266825, -10529112, 19515258, -26058640, -1062468, -31460636, -782221, 25466472, 35609036, 16865262, -6099391, 16483011, -1235877, -2254321, 1782948, -2760590, -8766028, -1050656, -16646756, 1008780, -23138600, 8186745, -7152731, -5126581, 15538118, -277562, --17790292, -19863686, 4626217, 2789045, -9906342, -8221105, 14918032, -21532818, -105227, -4308926, -7625715, -5745593, -4669167, -17213156, -7326141, -7571491, -3210488, 12492449, -14748918, 5363878, --1788854, -2507187, 1948305, 5418101, -24974162, -2602750, 3398930, -2149631, 9255655, -7812546, --11029476, -4975183, -27946816, -12271258, -12177306, 648003, 11948062, 18037788, -8490613, 13666586, --23300734, 37436008, 2575907, -6642704, 19563040, -23116050, 19634980, 8841727, -5233418, 479963, -6561637, 594316, 3149822, 17948668, -7627862, 7704098, -4123706, 5597416, 8929774, 8859444, -10744934, -3614215, 9062918, 2218888, 1375463, -1414655, -12020540, 547071, -8523363, 4028143, -5565204, -1757715, -1317481, 1704565, 1240172, 6121939, 2803540, -4259534, 6557342, 24696, -794569, 8183524, 5544803, 3346853, 14681272, -11919071, 119722, 5487895, 46708, -9327058, -2329483, -5876589, -5642514, 22841172, 1219234, -16447577, -446140, -2556043, 10551661, 6930467, --10066330, 11456825, 131533, -25838524, -28133646, -2759517, -8530342, 6929393, -1284195, -9977746, --25366076, -22127672, 11952357, -18836652, -4290673, 1122597, 5862094, 1340567, 17950816, 1450088, --9193914, 12020003, -1683627, 1708323, 11076184, -14753750, -1042603, 3131568, -15076946, 9041980, -12384538, 5381057, 11012296, 5741298, 17098264, 4639102, 12427488, -17616346, -5560909, -2850248, --23656142, -172872, -2624762, 9826348, -1652489, 11271605, -1959042, -13730474, -9390946, -748398, --21882322, 9522479, 532039, -4277788, 12684649, 8040716, 10525891, 10956462, 3297461, -1357210, -9184788, -29610042, 8904541, 3689377, 13176423, -5263483, -20943872, 13115756, -3217468, 22566296, --33394444, -11898670, -23404350, 15942919, -6866579, -21485038, -23977192, -15784542, -7135015, 7596187, -5945309, -6589554, -6852621, -3595961, -484794, -7271917, -2799782, 12178917, 1843615, -1188632, -3535832, 2647847, 2192044, 6605123, -5181341, -6823630, -215285, -11840688, -42413, -4166655, --1726577, -7646653, -2095944, -10428181, -9359807, 11793443, -6629819, -435402, 3941169, 5677947, --1028108, 9900436, -8267812, -2669322, 4076461, -9715753, -2680060, 11366631, 4070019, 2547989, --3898757, -5869073, 4386772, 15659988, 14518600, 53112104, 40129492, 5439576, 11634530, 3374234, -30830886, 854162, 15005542, -13998372, 36513664, -14457397, 33112588, -1480153, 21149492, -2451890, -14923401, -14837501, 3570192, 7471096, -8149164, -2647847, -4384088, -3411278, 9866614, 255014, --8537858, -11722039, -17737678, -22516366, -10854993, -3771518, 119185, 7118909, -19008452, 8077760, --10471130, -16091095, -3375308, -11747809, 5357435, -2837363, -24733642, -5843840, -12589086, -14853608, --15662672, 14239427, 18943490, -39637180, 8971650, 3568581, 11113765, 3976603, -5034776, 24051280, -13471702, 12609487, -33239826, -14810658, -471373, 8238821, 27456652, 1083942, -3755412, 1386738, -23251342, 20978768, -19866908, 22447110, 1617592, 5086315, -3832722, 13198435, -28304372, -9838696, -29078002, -4409858, -1943473, -11155641, 19369766, 12754442, -10096394, -16931298, -2987150, -665183, -1666984, 319975, -3696356, -15776489, -5483600, 12421582, 16130287, 10110890, -9012989, -2296197, --2688113, -7592429, 2414845, 2633889, 7413114, -1573569, -5366562, 4758287, 1732482, 2898029, -14580340, 2066416, -4164508, -5497558, 2434710, 5339718, 11328513, 2371359, -11195369, -5856725, --8432631, 3387119, 4157528, -9105868, -19662360, 6407018, -1704565, -3211025, -6943889, -11969537, -14304389, -6045704, 12428562, 19485730, -22603876, 6658810, -13034152, 36959804, -22325240, 20762408, -19112068, -7656316, -35065724, -20521890, -2575370, -9532680, -1316944, -16225850, -25623238, -33993056, --19607062, -22727356, 9405442, -19478750, 7712688, 2005213, -2492692, -2264522, -16098074, -5166846, --16530792, 4489852, 14227079, 18733574, 56371, -5616207, -16965120, -4251481, 1367947, -10191957, -2538326, -13952738, -9209484, -2232309, -13876502, 10473278, -12291660, -35685808, 1015223, -1368484, --11996917, 14821932, 11521250, 16927540, 6294275, 13262322, 27071178, 4336307, -27545236, -6484864, -12505334, -6258304, -22952842, 12385075, 17631914, 5782100, -442919, -30888332, 27040578, -1569811, -22010096, -18795850, 22291418, 55151676, -5228586, -1850594, -27393838, 14317273, -22346714, 18319646, -9109626, -12377559, -3043521, -30181808, 6561100, -16574816, -79457, 11263015, 11200738, -663036, --8076149, -6933151, 7885023, 20003274, -10178536, -1828582, 2766496, -9074729, -2920578, -3031710, -3899294, -1223529, 8153459, -4134443, -10072772, -5636608, 2584497, 7423314, -9979893, -3234647, --512175, 1085553, 6785512, 1308891, -2787434, 2315524, -16697759, -9589051, -1361505, -1732482, -3034931, 736050, 968515, -529892, -3179350, 8114804, -804233, 5994164, -762894, -2016487, --6390912, -4358855, -43503188, 14866492, -57081724, 37812356, 13590350, -9700721, 40301824, -3801583, --20410758, 35742716, -13659070, -1881733, 7626252, 12540231, 33066954, 1402307, -2596308, 23343684, -9976135, 19611358, 24033026, 17811766, 1738388, 12465606, 2064269, -1195075, -13004087, 8441758, -12669080, 3086471, -642635, -14101451, 6908455, -13208635, 16076063, 15794742, 2861522, 18651432, --11332271, 12329240, 19424526, 12352863, -25900800, -27939836, 33022930, -3143916, 20710870, 31976032, -902480, 74088, -3175055, 6321655, 18603114, 17570174, 1986959, 14601815, 168577, -16572668, --20574504, -30677878, 705985, -12435004, 608812, 17448304, 16474958, -28699508, 2639258, 11180874, --25028922, 4218195, 35241280, -15177341, -17313014, 18849000, -20047834, 4685273, -5502390, 36797668, --10506027, 22736484, -11082089, 19110456, -1604707, 7111392, 15447924, -24008868, -7124277, 9163313, --15719043, 11676405, -14086419, -3948149, -7868380, -7348152, 1229434, -3948149, -6347962, 3849365, -11134166, -5505611, 3191161, 3988414, -9281424, 1673427, 1502702, -2445447, -6500970, -2775623, --4972499, -15440944, -5918465, 3302830, -20055350, 7327751, -10174778, 7810935, -4505958, -1975148, --13998909, -7441031, 388158, 3913789, -6060199, -13878650, 2527052, 926639, 7657927, 3175592, -235686, 8994198, 7451232, 741956, 4134980, -19990388, 4418448, -23153632, 47499652, 11634530, --25421912, 9633612, -5933498, -22623740, -26669600, -27048094, 7957501, -1351841, 23801098, 35346508, -16949552, 8551280, -4334159, 11728482, 1069984, -44521632, 19464254, 46213848, -30325154, -31825170, --27540404, -38896296, 28056336, -38300372, 17164300, 228707, -4861366, -270046, -12510703, -14829985, -18920942, -39402028, 40403832, 23207318, 5290863, -25933550, -19666118, -17185238, 3539053, 6736656, --16854526, -2348810, -12471511, 27849104, 12540768, -5064304, -942745, 11432666, 2474975, 13053479, --22899692, -9062381, -2289755, -4073240, -21312702, -14958297, 12487617, -40365712, -23906862, 3034395, -47035260, 22715008, -14485314, -1001801, -35965520, 17403744, 54569172, 1897302, -11889006, -8257612, --25961466, 33652680, -10966662, -13050795, -1270774, 19935090, 12403866, -17352742, -15759846, -5611912, -17448304, -4722317, 5005785, -1400696, -14115947, -4555350, 22138946, 12739410, 1671279, -10366977, --1808718, -1590212, 17223892, 14136885, 6920803, 6377490, -20781200, 7872138, 7257958, -3098282, -4510253, -3235721, -3118146, -18060874, -2089502, -929324, -2729989, -5763309, 4665408, 6622303, -3299072, -21230024, -18451180, -8997420, -242666, 1302449, -21604222, 7652558, 26739392, 5443871, --7656316, 526134, 3985193, 108985, -37044, -22217866, -15334644, -44321916, 9574556, -32682016, --48816060, 11355357, 26852136, 6536940, 7144141, -20718922, -25885768, -6799470, -38308960, -18880676, -9895068, -32085554, 50302656, 9711995, -12469364, 10735271, -24237038, -47831440, -16098611, -36607616, -5706401, 10562398, -13480829, -26068840, -13257490, -16124918, 13914083, -19154480, -7041062, -2580202, -21473762, -15706159, -2942053, -7404524, 5418638, 8901320, 1549410, -6561100, 22157200, 28980828, -18514530, -15013058, -12299176, -42909944, -23907398, -9900436, 11244224, 71781792, -12376485, 725313, -31920734, -3027415, 13543642, -16478179, -17115444, -13892072, 15098958, -40718436, 216896, -5509906, --607201, 34997540, -15534360, 53043920, 4618164, 40164924, -51446192, -15537044, 14774151, -1154273, --22369800, -18911814, 41601592, -43105364, -35529580, 51007568, 8932995, 44268228, -17715666, -3095061, --3158949, 14151380, 6040335, -4214437, 15052250, 15005542, -884226, 6981470, 4711043, 1457068, --5315022, -9710921, -2234994, -6475200, -8529268, 7748121, 4539244, -7327214, 5103495, -15831786, --1586454, 10934450, 19315542, -1698123, -12227235, -1070521, -13909788, 7795366, 13276818, -9422085, --7646116, 7324530, 8857296, -19969988, 7087770, 729608, 12932683, -8576513, -8687108, -241592, -4112431, 5879274, -22292490, 3479461, -9429064, 17550846, -6140730, -2648384, -44131324, 20992726, -32353452, -23495618, -19319300, -6614787, -21219822, -25556130, 6799470, 7539278, 19821274, 858993, -17316234, 30840012, 32170378, 21351894, 7367480, -23620172, 2292439, 12263742, 16255377, 25020868, -232465, -12967043, -18882286, -7130183, 25349434, -10424422, 9946607, 22047678, 2131915, 43330852, -4952634, -27666032, 23860690, 23605140, 6761889, 10177462, 21856552, 3500398, 1804423, -25386478, -54788212, -58460412, -43036108, -49867256, -16571058, 10324028, -29379186, 15066745, 32642826, -9692667, -3135326, 28851980, 9142375, -31241056, -10925323, -24174224, -3547643, 1814624, 1508070, 27902792, -27331562, -6286222, -7013145, 17536888, 42126648, 7347616, 34637836, -29272350, 30775052, -13522705, -10129680, -6152004, -19807852, -13683229, -3235721, 14003204, 8445516, 34478924, -44704168, 22717692, --17769354, -10984916, -8821863, 16540456, -7995619, -1522566, 3447785, -17851494, 11049340, -8722542, --761283, -13544716, 4032974, -2720862, 428960, -15256261, 2093260, -1376000, 2871723, -1468879, --16846472, 6681359, -9682467, -8612483, -4131222, 12447889, 14176613, 15921981, -13848048, 27352500, --20811264, -6180995, 1333051, -2196339, -15452755, -8147016, -1123671, -11375758, 3010235, -903554, --755377, -1317481, -11545409, 1496796, -2158758, -24957518, -50216756, -50544248, -36580236, 7511898, -93910536, 23737210, -12948790, -28388124, -67853504, -95444912, 21553756, 39535712, 47460464, -9982578, -4117263, -27984934, -48688288, 14042932, 8844948, 15847356, 2294050, -40832256, -12472585, 9980430, --8205535, -1608465, -7721815, 53209812, 46726560, 31507880, -2878702, -22835804, -38783556, -25672630, --23206246, 36347772, -6017786, 26598196, 12032888, 12458090, -16345572, -88406536, -60863980, 30061012, --47890496, -16342351, 102009232, 70140040, 52707300, -39944268, 28872380, -27664422, 2032056, 2030983, -14812805, 43272868, 76263584, -29189672, -2709588, -50273664, -40613748, -66535484, 7232725, -2739652, --71636832, -17155174, 46163384, 17257178, 32225140, 43673376, 78692392, -57303992, -34386044, 4562329, --46768972, -6016713, 26175678, 61300996, 31173946, 9584220, -37382320, -35842040, 24224690, -10193568, -36138392, 31774168, -8553427, 14567992, 5865852, -6090264, -11994770, -6975027, -4509179, 10809896, -3153580, -251792, 3781719, -1094680, 5240934, 169114, 22886270, 18822158, 29824790, 5398237, --16342351, -34441344, -28130962, 11494406, 26805964, 30706332, -3809636, -19563040, -79255032, -40711460, --37497212, 940598, 4059818, 8144869, -238371, 5950141, -8933532, 4295, -13240847, -11832635, -16818018, 14847165, 8651138, 8740258, 4418448, 2033667, 23262616, -37721088, -124932008, -116255640, --66723928, -72566160, -18080738, 120370752, 61170536, 123842160, 109904456, 172254496, 123032560, 105828528, -17095044, -45919104, -103823320, -166393472, -141293680, -142310528, -74359840, -35695472, -8359080, 1201517, -4119411, 29395830, 39298412, 99050000, 60176248, 116887536, 76168024, 100197296, 36280124, 96815544, -33664492, 23692114, 22945326, -5750425, -27140972, -65525096, -75586592, -140383152, -96135328, -177893792, --140714944, -215911760, -127972848, -101573296, -24471114, 59337656, 31598074, 5333276, 59273768, 126608120, -169169632, 221744864, 264361136, 226169760, 165264976, 206039776, 170046880, 95297272, 42902964, -10572062, --70841192, -164007616, -194742944, -260862352, -336744224, -389762912, -351673536, -309996768, -220571808, -150638992, -46195056, 145269760, 177118016, 272665984, 227720784, 284360128, 298912544, 293163744, 338026272, 221853312, -57685704, -55870008, -108266464, -134084048, -86757800, -125577328, -107594840, -125680408, -170003392, -172029552, --200196480, -118600688, -92260192, -78731584, -43933756, -2707977, 11866458, 48595408, 132080448, 139081776, -197581376, 171901776, 225963056, 166077792, 111059800, 114491480, 43718472, -30105036, -48995912, -217961008, --280880672, -261649952, -230791136, -135231344, -106036840, -58089432, 5114233, 58809912, 89801320, 121946472, -145718576, 173156432, 164531072, 155421984, 136944496, 76417128, -304406, -38872676, -90344104, -94649272, --80968720, -66227320, -68890736, -69854960, -54808076, -39465380, -23320062, -9865003, -8927090, -6482717, -1961190, -6857989, -7970386, 9463424, 22465900, 24951076, 16435229, 11529303, 19292456, 23252416, -17068200, 15530602, 14453102, 9055402, 6154152, 5211943, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --12016245, -4409858, -6861211, 3652333, -3889630, -7934415, -13678397, 2362232, 363998, 3390340, 2976949, --992137, -1042603, 989453, 8204462, -5894843, -10487773, 3422015, -4362613, -7042136, 82678, --1086627, 4284767, 1500017, 3044595, -3188476, -822486, -2105608, 6982543, -1959042, -2880849, --2545305, -1279900, -1741609, -2862059, -2536178, -1770600, 1344862, 553514, 872415, 197569, -1781875, 2938831, 1466195, -2696703, -7978439, -121870, -5563057, 758599, -423054, -2555506, -3499325, 198105, -24696, -7945690, -3278134, 1014686, -669478, 2716567, 151398, 2412698, --2345052, 974958, -1045825, 4831302, -1779190, 2522757, -4413616, -4387309, -5542656, 228170, --1355062, -1646583, -15569, -1963874, -86436, -2282775, 423054, 54224, -995359, -3503083, -293132, 314606, 1937567, 1706713, -34897, 1821066, -249645, -1493575, -529892, -729608, -675921, -60130, 50466, 1007170, 712965, -179315, 907312, -687195, -8598525, -1796370, --1148904, -2456185, -1120450, -2956011, 2819109, -1186485, -1018981, -272730, 42950, -202400, --2083596, 7569343, 4871567, 7911867, -3734474, 7873749, -4698158, -3319473, 3060701, 8721468, --206158, -5344550, -7849590, -5668283, -1095754, 6203544, 2441152, 2072859, 2759517, -2784750, -4238059, 498753, 3164854, -1592896, -7150047, 1898376, -4949950, -3431142, -3474629, -872952, --9073655, -469225, 421444, -3839164, 8463770, -1658931, -2743410, -3457986, -89657, 879395, --3633542, 68183, -4454955, -1732482, 119722, -1893544, 6087580, 129386, -1642288, 3352222, -2187212, 5580237, 2267206, 6719477, 1671279, 5481452, -6323803, 1577864, 5058935, -1796370, --4514548, -6288369, -117575, -556198, -1238024, 1460826, 1836635, -1391569, 4854924, -4242891, -1618666, 1619203, -3097208, 2193655, 520765, -2349347, 1228898, -651224, 492848, -2209224, -675921, 185757, 411243, -320512, -133681, 970663, 290984, 1865626, 9737765, -4380330, --3363496, 1000727, -2134062, -1581622, 4900021, -3761318, 4720169, 2179159, 135291, 2421288, --3108483, -2966212, -5477157, -5910412, 7856569, 3724811, 2786897, 4209605, -2700461, -1800128, --1976759, 9905268, -3784403, 10838887, -325344, -2726767, -2563559, -5701569, -6118181, -7448010, --419833, -1858110, 1395328, 7245073, -571231, -3360812, -10025527, 374199, 8046621, 11767137, --5464809, 3054259, 2211371, -2966212, -2608656, 3084860, 11176579, -2634963, 1802813, -934692, --1572495, -1023276, 5390721, 7722351, -5779952, -3147674, 2443837, 10118406, 1741609, 7171522, --5788542, -5404143, -239981, -879931, 2105608, 1550483, -71941, 649077, 1107565, -2616172, -1287953, 3284576, 2571612, -1963874, 6518150, -1632088, 4120484, -2106682, -2163053, 2438468, -2103997, 2205466, 557272, 2298881, 502511, -3343632, -2215130, 665720, -96100, 1249299, --565325, 1860258, -15569, 1043677, -934155, -175020, -22012, -481573, -1097364, -96100, --642635, -168577, -785979, -721555, 1894081, -16643, -807991, 1990181, 108448, 15882252, --11045582, -2500208, -4633196, 1171452, 4175245, 7587597, -7735236, 5176510, -2074469, -8185671, --13186623, -2765959, -5643050, 852014, -1322313, -5625871, -2902324, 2978023, 3170223, 10172093, -5623186, 5135707, 472983, 1542967, -5376226, -3678103, 8177618, 6227703, 4222490, 1904281, -3893925, 765041, -22012, -6961605, -9789841, 6432251, -2650532, -6633040, -3177202, -4199941, -3430605, -3708704, 8221641, 1828582, -4817880, -2404645, -3701188, -3246995, 3993246, 5995775, --569083, 4014721, -3050501, -3433290, -22012, 739808, -3247532, -1327145, 4733054, -24159, --2014877, -2431488, 2559801, 2819109, -410169, 3424163, 446677, -2564632, 8213051, -1257889, -869731, 315680, -9980430, 3797825, 3080565, 5078262, 3325379, -3722663, -869194, -9051644, --4160213, -8313983, -3056943, -3774203, -3758, 700080, -5461588, 151934, -1346472, -70330, -2276870, -908922, -1036698, -268435, -1537061, 179852, -801011, 532039, -958851, -2113124, --1054415, -603980, -3427921, -400506, -191663, 610422, -245350, 323733, -219580, -12348, --1847910, -2442763, 202400, -438087, -1081795, 343597, -10811506, 2880313, 187905, -3151969, --5887864, 2564632, -5623186, -973884, 9922985, 14992657, 7421704, 8273181, -540092, -4072166, -6241125, 5589900, 2404645, 3016678, 7428146, -1016297, 5422396, 5255430, 7705172, 7381975, --5916318, 4969277, -312459, 1785633, -5507222, 1764158, -673236, 5062156, -1862942, -1354525, --3867081, 3699041, -6036577, -4905927, 566936, 5310727, 2942590, -3109020, -1569274, -920197, --2021856, 3228742, -7277822, 6817724, 40265, 8466991, -11872363, 895501, -10685342, -3344169, --3356517, 2985539, -1053341, -2400887, 2433636, 938987, 2971581, 4696010, 7699803, -898185, --6055367, 1364726, 10350871, 2145336, -2903398, -706522, 6410776, -3297461, 3930432, -3184182, --10909754, 6394670, 6805376, 6288906, -5353677, -8100845, -5799817, 6950331, -665720, -1009854, -4962835, 1852742, 1283122, 886911, -267362, 1947231, 2624762, -803696, -1313186, 1482838, -230318, -435402, 943819, -1330903, 478352, 2265059, -839129, 2376728, -898722, -1682554, -901943, -5369, 92879, 1225676, 986232, 1243930, 1022739, 906238, 17180, 1202054, --16406238, 251792, -3659312, 1482301, -9201431, 1095217, 1486596, 12137578, -9760850, 99321, --13084618, 2951716, -7919383, -1945083, 448287, -4296041, 3741990, 1650878, -6868727, 107374, --138513, 6301791, -4166655, 10163503, -159988, -8841190, -4541928, 10819023, -1081258, 4322348, -2844342, -1803349, 6438693, -7183870, -6826314, -5292474, 699543, -6879464, 7257421, -4033511, -4639639, -6660421, -121870, -8089571, 5263483, 701153, 6313065, 5671505, -5428302, 10673531, -9063455, 8592619, 1654636, 9023726, 7374459, -7669738, 6529961, 3136400, 557809, -7119445, -3229816, -6059125, 5953362, -2607045, -4827007, -584652, 8905615, 3184718, -10364830, 9829033, --864899, -3479461, -5947993, 10013179, 8607651, -7466264, 7332046, -535260, -8957154, 110059, --5116917, -2775086, 4833986, -4287451, 3432753, -356482, 1484448, -2051384, 2597382, -363998, --340376, -589484, -1053341, 949725, 447213, -2484102, 817654, 1248225, -75162, 933082, -1013075, -2329483, 428423, -271120, -28991, -1961726, 621160, -797253, -1273995, -2612951, -2937758, 642635, -1514513, -392990, 23383412, 3978214, -927713, -8056822, -15139760, 3870839, --2225330, -22225382, 19507742, -9444096, -14101988, 2985539, -894964, 2632278, -904628, 3784940, -5630702, 78920, -351650, -11356430, -936303, -1073742, 13403519, -2442226, 356482, 4934918, --2341831, -1644973, -5441724, 11443403, -8572755, 8269960, -2029909, -6849399, 1293322, -7657927, --3884798, -12439836, 2203318, 5718212, -3353833, -6204081, -4902705, 7527467, -11652783, -2753611, --5740224, -157840, -1659468, 1524177, -10106595, 9863929, -13803488, -9443022, 3762391, 1673964, --509491, 3696356, -7151658, -10306311, 1293859, -2798171, -456340, 5069135, -6148246, 4596152, -3211562, 11382200, -3134789, 1639604, -858457, 171799, 15791521, 1329829, 15635828, -3762391, --5845451, 1788317, -8012799, -707596, 8002061, 651224, -9323837, -8171176, 2316598, -859530, -59056, 8026757, 648003, -1496796, 3354906, -446140, -297963, -3733937, 1413581, 1765232, --1854889, -39192, -897111, 3108483, -1371168, -613643, 1620276, 425739, 996969, -279173, -1805497, -568009, 42950, 961536, -1926830, 2454037, -1508607, 920197, 2086280, 1133871, -1974611, 551366, -17235704, -2330020, -3570729, -13998372, -24041080, 7305740, 12361990, -8863739, --4301947, 6955163, -2662880, 14843944, -1739999, -8057896, -4828617, -22413824, 7474854, 2438468, --2108292, -15768436, 3636764, -8806830, -2370285, -7741142, -3990025, 11066520, -10767483, 4531728, --15909096, 10062035, 1954747, 120796, -4636417, 1116155, -2134062, -8937290, -16744467, 3156264, --34360, 3491272, 6931541, -4133906, -1398012, -10810970, -5579700, -2955474, 4484483, 2991445, -7851737, 12548821, 9819369, 4999342, 7479149, 2208150, 7798587, 6984154, -6942815, 8012262, -9091909, -1964411, 12196097, -1361505, 14319421, -6444062, -15495168, -2609193, 9799505, 10755672, -12408697, -2491081, -21597780, -2251637, -1193464, 729608, -775778, -5386426, 3045132, -15810311, -12196097, 7632694, 7378754, -8321499, -7821136, -1805497, 4510253, -646929, -8742406, -13422, --4291746, -7165079, -2882997, -1262720, -3426847, 224949, -2902324, 1340030, -1825361, -1071594, -2231236, 333397, 996432, -1222992, -3147137, -3543885, 2371896, -2847027, -134755, -1102196, -1445257, -1220308, -741419, -1210107, 3580929, 1816234, 1069984, -1226213, 22947474, -5043366, --5505075, 7654706, 12358232, -884763, 5754720, 14307073, 10340671, -23487028, -21575768, 176094, --2068564, 3164854, -9640054, -17136382, 4075387, 13734769, 9082245, -9949829, 16167331, 13053479, -12264279, -20591146, 5837398, 10791642, 563178, 1636919, 9199820, 21203180, -4090420, -9702331, -6443525, 4800163, -2879776, 11455752, 17125646, 3187403, 17741436, 7741679, -13298829, 1490354, -14714558, -1598265, -6026913, 7605314, 1240709, 2885144, 15444166, 9896678, 5262409, 1817308, --17906256, -18267570, -1514513, 2878165, 4780299, -5648419, -782221, -4735739, 1615445, 2260227, --6823630, 2572149, -4184372, -1083406, -5796059, 636192, 11418171, -6765111, -16462073, -2594697, --13999446, 3064996, -4986457, -388158, -1865090, 6592775, -2459406, 4765803, -45097, 4082367, -1959579, -1935957, -2216740, -2886755, -8109972, 2927557, 1079647, 2003065, 293132, -6322192, -3182571, -4955319, -4113505, -1472637, -5288179, -1161252, -1712081, -2026151, -1646046, 3406446, --1500017, 2254321, -187368, 1802813, 357019, 4407174, -1894081, 1153199, -3565897, -968515, --3053185, -2877091, -554051, -2138894, 6885907, 2827699, 293132, -1020055, -929324, -38486128, --24070608, -7408819, 6793565, -2524367, -9735080, 1536525, -9492951, 26647050, -11039677, 17029008, -26298622, 14170171, 12864501, -10545755, 9198746, -5331128, -12465069, 10497974, 12298102, 8077760, -17646946, -94489, -1123134, -8087961, -8268886, -7110319, -11313481, -11042361, -7630547, 3939022, -1292248, -315680, -7196755, -4030827, -10987063, 4271345, -9520869, -8683887, -3999688, 4290673, --275952, -5934571, -15901043, 1654636, -4867272, 5455146, -18716930, -14543296, 15982110, -2706366, --3371013, -7734163, -4838281, 11921755, 3699578, -2752000, 6421513, -2056216, 6691022, 5266704, -7668664, -5914170, -9576166, -23751170, 1387811, -23044110, -1796907, -19545322, -3034931, 18006650, --2555506, 2985539, -13273596, -5889474, -6972343, 1206886, -8616778, -5119064, 7967165, 9954660, --1315871, -1299765, 904091, -4925254, 1473174, -795106, -4834523, -2142652, -4175245, -1810866, --2486786, -10850698, 1583769, -2048699, -1636919, 377420, -3157338, -3706020, -7543037, -1984812, --4475356, -5311801, -1205275, -6618545, -3213173, 762357, -4236985, -4905390, 312459, -4150549, -1027034, 1213328, 4295504, -3047816, 2924873, 1218697, -4416837, -1864553, -1258425, -2223183, -573915, -1219234, -1464584, 26376468, 506269, -19113678, -16217260, 16549046, 12962211, -12232604, --11835856, 22194780, 14081587, 818191, -13196287, 1597191, -5565741, 10533407, -8203388, 1262184, --3494493, -2410551, 22914188, -3230352, -6284611, 4273493, 3867618, 6880538, 7049652, 800475, --9097814, 6878927, 3426310, 7880728, 17704928, 8152922, -25602836, -7287486, -4215511, -19535658, -7524246, -3367791, 347355, -10874320, 9162239, -4206384, 1706176, -14147622, 9559523, -11517492, -889058, 11419244, -1890323, 12045773, -9441949, 15015743, -19268834, 9630390, 148713, -6879464, -25049860, 6739878, -5296232, -14939507, 6442988, -3037616, 1990717, -2233920, 9112847, 13749801, -18388366, -11644193, 8221105, -4589173, 16435766, 6100464, 2277407, -1475321, 9818295, 1813013, --6649683, 8091182, -5805722, -9621264, -4279935, -13101261, 78920, -14682346, -1345399, -9878962, -11258720, -3552475, 7202124, -7898982, 199716, -4401268, 6788196, -2137283, -763430, -4357245, -2222109, -3255585, -5434744, -3017215, 2195265, -5087389, 3009698, -4020090, 1801739, -2584497, --2674691, -2581812, -5790690, -3250217, 21475, -4085588, -3883187, 5291937, 4421132, 2523830, --2758443, -6609955, -835371, 2953864, -369367, -5115306, -3213709, -38540888, -25012816, 20515986, --15315853, -14379551, 7802882, 17943836, -29964914, -5097053, 6955700, 1779190, -15715285, -23472534, -43664248, -19029926, 5804112, -21616570, 11690901, -7620346, 20338818, 18064096, 1692754, 3089692, --24480776, -167504, 11360725, -9995463, -14654965, 11400454, 3120831, 12303471, 9739912, -2196876, -4005594, -2867965, -1693291, 18210124, -15734076, -9291088, 14567992, -726386, -11912092, 15448460, --612570, -3543885, -10662256, -4765266, 5608154, -8337069, -1076426, 5366025, -10580115, -10813654, --7099581, 7783018, -22801444, 10718091, -1174137, 21451214, -20393042, 6636798, -15541339, 5589363, --9385040, -11894375, 19305342, -10838350, -4867809, -10551661, 8269960, -12054899, 6941741, -4159676, -14083735, 14490683, -1963874, -22817550, 8948564, 9371619, -1222992, -808528, -13109851, -9055939, --2288144, -11267310, -9126269, -3246459, -400506, -5645735, -7526930, 8380555, 2703682, -5354214, --4549444, -5467494, -5839545, 6080600, 2138357, 1414118, -8710194, -3342558, 7244536, -4354560, --5397164, 3398393, -3902515, -31675, 2554432, 4243965, -1890859, -7151121, 1285806, 4185446, --9615895, 172872, 2326799, 183610, -5131412, -2893197, 110595, -2289218, 19300510, 9376987, --21734146, 7406134, 23381266, -2067490, 53150, 10783589, -6993281, 16386374, 14837501, -19625316, --12028056, -3627637, 10362145, 18709952, 3327526, 9934796, 21134998, 15800648, -22224308, -2405182, -35322348, 8701604, -2347200, -4191888, -6640020, -10397042, 3121368, 8630737, 9652402, 8951249, --6307697, -15108621, 4065187, -7870528, 8294656, 24350854, -6469832, -24510304, 29314762, -8864812, --16129750, 23703924, -4266513, -7113003, -25393994, -4611185, 10520522, 4970888, -5504001, -10769094, -9833864, 1000191, -11754789, 10045929, -2343442, 23115514, -17029008, 2365990, -3310883, 26485990, -9063992, -37758668, 11841225, -15813533, -6593849, -13538811, 16331613, 53905060, 19736986, 3069291, -12510166, 15643345, -19879794, -8512625, -5577552, -11435350, -6851010, -12651900, 11901891, -27792196, --7322919, 2423972, 3339337, -9168681, 1751810, 4799626, -2685965, -3609920, 9456981, 1638530, -6323803, 5135707, -5655398, 1508070, 4691715, 1673964, 3929895, -2953864, 2424509, -5496485, -751082, -1747515, -5120138, -2837363, -1134945, 8325257, 503048, 2065342, 380641, -1888712, --1699733, 574452, -718870, -7971996, -912144, 1124208, -1824824, -6185827, -14047227, -5267778, --4234838, 8135742, -1405528, 1656247, -8164196, -28502476, -12089796, 2018098, -11533061, -35893040, -31244814, -5929203, 14119168, 2712809, -16419123, -28308130, -27266064, 30709554, 18735722, 7088844, --10741713, -20450486, -15293305, -24295020, -6189048, 9131100, -3719979, 2039036, 3954054, -3947612, --12544526, -12080132, -20627654, -7380365, -3905736, 10223096, 7175280, 11234024, -5477157, -9221832, --3809099, 14668387, 2157147, 12990665, -43198244, -10154913, 20401, 9536438, -13727789, -569083, --15900506, 12560095, 11107859, 2143189, 53539452, 881005, 16790638, 22028888, 1040993, 7135015, -421981, -3819300, -6339909, 11113228, 16364899, 21309480, -385473, -3995393, 1556389, 14005888, -12802224, 474594, 10397579, 8917963, 7030862, -2829847, 21021718, -6019934, 26948772, -26526254, --13171591, -32630478, -10068477, 5849209, 885300, -8450348, 1845225, -105227, 14715095, -2959769, -17610976, -8012262, -6409165, -8804683, 4618701, 9844065, -1507534, -4782983, -5222680, 6076305, -178241, 20422570, -3149822, -1402307, 3750043, 5733245, 8504035, -7062000, -544924, 2737505, -4240744, -9748502, 3474629, 3718368, 12606803, -12393128, 7130183, 4726075, -5197448, 10629507, --5913096, -7282654, 126702, -2469606, 5529771, 2728915, -4289062, -129386, 4558571, 1042603, -10994579, -508954, 7219303, 20288888, -3740917, 894427, 5343476, -27765890, 1164473, 3984656, -17478370, 26663156, -22691386, 5027259, -14305462, 19005768, 17230872, 2182917, 33079838, 10320806, -13174812, -12054899, -1937030, -21111374, 33051384, -19203872, 5166846, 20225538, -4809827, -13001403, -10215580, -2968896, 5170067, 21714280, 566399, -6876780, -1996086, 4077535, -681826, -12872554, -9543954, -1223529, -3650185, 37071472, -28477780, 26824218, 17317308, 33472828, 13639742, -23648090, -18315888, 381178, 17020956, 44077640, -31778464, -13159243, -4082903, 867583, 29968672, -17762910, -1568200, -19075560, 1508070, 33793340, -3796214, 35068944, 9891847, 6008123, 15949361, -21402896, --3532611, 15426449, 21829708, -35435092, -1252520, -30359514, 13618804, -15781320, -511101, 7198365, -9905805, 766115, -10792179, -8594766, -33196876, -3765613, -23580444, 19147502, 1669132, -1481764, -14913200, 846109, -63888, 14323716, 10697153, 7207492, 188979, -4815195, 6764574, -11207717, --825707, -7685844, 7706782, 8016557, -6766184, -1296006, -14398341, 6399502, -883153, -5906, --382252, -13981192, -16849694, -5572183, 5465346, 12794708, 6514392, 5777268, -2026688, 10717554, -7461432, -466004, -5444408, 9324911, -13269301, -3727495, 2774549, 15030238, 12429098, 2695092, --6045704, -21467320, 6030134, -37565396, -33108292, 478352, 446677, -21028696, 17053168, 4930623, --5751498, -19514720, 26515518, -6195491, 39475044, -5781563, 8469676, 14241038, -19276350, -6434935, -5971615, -22937810, -12964359, -20062330, 17151952, -16077136, -4436165, -5293011, 14833206, -13558138, --22949084, -31917512, -1027034, 26502096, 1485522, -14647986, -6337761, -18539764, -6320581, 130997, -10939819, -20877836, -2460480, -4571456, -15000173, -20520280, 842350, 3397856, 13112535, 4515085, -22630182, 6288906, 28592134, -12017855, 23579370, -6078453, -18678276, -4861903, 38435664, -16695075, -17430052, -12246026, 28155658, -15004468, 9393630, 17940616, -1235340, -7435662, 3263102, -10271414, -25581898, -23622320, -9064528, 25680684, -3337190, -21466246, 838592, 19628000, 10744934, 19630148, --20017232, -16879222, -10894185, -2187749, 19190988, 23415088, -41653668, 2185065, 11819213, -22767622, -3569655, 14368813, 11001559, 10540923, 10108206, 6882685, -3366181, 758062, 7698729, 8828305, -6999186, 17719424, -5574331, 9317932, 3740917, 19183472, 11220065, -14803142, -18919868, 5966247, -19949586, -5731634, -5784247, -12831215, -22084722, 2528662, -18879602, -5858336, 4066260, -12420509, -11385958, 3331284, -4096325, -10253698, -2190433, -10628433, -1084479, 5924908, 2574833, 1688459, --2081449, -2590402, -35620848, 39280696, -12983686, 33457258, -6896644, 26889180, 2330557, -8318815, --18257906, -12894566, -2340757, 475131, 19789598, -7430294, -1428614, 5725729, -17840758, 29032368, -10914049, 1156420, -23735064, 16428250, 8712341, -18937048, 18709414, 1702955, -2807298, 4774393, --455267, 24523726, -5472325, -30645128, 33333778, -17041894, -2565169, 24765856, -10763725, -5317170, --14618458, 39043400, -17326434, -4738960, -24235426, -4660040, 3113315, 34907348, -16173236, 6628745, -11236171, 20784420, -5304822, -22025130, 24221468, 14680735, 19692426, -9470940, -4536023, 2537252, -21805548, -11940009, -25251724, -28278602, 15249281, -19785304, 5236102, 21255794, 19821274, -13780403, --4585415, 28585692, -45318884, -1013075, 6440304, 15794742, -1942936, -16536698, -3148211, 26074746, --4884989, 53473952, 21068426, -15213848, -1893007, 1639067, -6262599, -19276886, -23523000, -17283486, -15029164, -11167989, -4427575, -387084, 23471460, 10162429, -7892540, 10348724, 7699266, -251792, -3610457, 4393752, -98784, 3301756, 24041616, 19718194, 19174344, 13010530, 2014340, -11673721, -6528887, -9105331, 11631845, -14042932, 15538118, 22483616, 7650948, 28461138, 30813170, 12497281, --83215, 16146393, 5735392, -2852932, -9540196, 16782584, -4138201, -13283260, 36507, 8174397, --3604551, 7126962, 13357348, 5070209, 13629005, -7598334, -8668318, -50306416, 17134236, 9794673, -44865764, 39315056, -5813238, -14511621, -46227268, 1362578, 15483894, -19785840, 15124727, 27080306, -26346940, -12196097, 31715650, 28351616, 1377611, -17090748, -18301392, 28950764, 24777666, -35150012, --47914120, 63750200, 3352222, -4493073, 8418673, 4743792, 23700704, 23528904, -9392020, -8018167, -33272038, 15820512, -5873905, -22048214, 13464722, 2690797, 1870995, 11864847, 1745367, -1000191, --13164612, 7479686, -3874061, -16199006, 29921964, -47421272, 33208150, 27514634, -44844828, -3081102, -23029614, 5834176, 26262114, -6077379, 3791383, 24004572, -3040300, 12284680, -22048214, -35057132, -98967856, -40377524, -56731148, -12375411, 110207248, 47591460, -46802260, -10560251, 19564112, 13507672, --880468, -28275918, 41514080, 23228256, 17487496, 4156992, -55755116, -9101573, 9218074, 16712791, --22827752, -37888056, 3473018, 12084427, 5371394, -17835926, -18847928, 9214315, 5225365, 13851270, --2431488, -4522601, -1261647, 14798847, 18803904, 13007308, -28016072, -10773925, 19967840, 14746770, --14059575, 174483, 16301548, 28875066, 11346230, -15042049, -20422570, -26714696, 12780212, -8458938, -11893301, -22555020, 12861280, 6749004, 14475650, -10247255, -5377299, -18067854, -7636989, 18134426, -3400540, -14775761, 8361228, 27331562, 7212861, -19659676, -12409234, 24756192, 42871828, 2995203, -71201432, -31570694, -12141873, 41319732, 2040110, -2325725, -21248276, -42415488, 35262220, -22085796, --24075440, 18336290, -26725434, 13303661, -25341918, -28023588, -4735739, 6200859, 3971771, -6553047, -33728916, 8519068, 20564304, 9947144, 568546, 597000, -15248208, -32318556, 10351945, 32382442, --26396332, 22640920, -26908506, -2718714, -1489817, -41523208, 29603062, -14335527, 11518565, 902480, --12261595, 798864, -30110406, 31000000, -21806622, 10421738, -35053912, -21196200, -45974940, 17457968, --21508660, -24063628, -19560892, -9943923, -6442, 49008260, 17459042, 24288040, -6731288, -22766012, --28984050, 7755637, 1727651, -49741088, -23255100, -87550760, -41318660, -33790656, -5150203, -40284108, --33332168, -7212324, 32013612, 36683316, -29827474, -37512780, -43337292, 21898428, 51662016, 2755222, -41530724, 1182727, 25049324, 10207527, 2958159, 12242804, 4376035, -874026, -15106474, 21613886, -17666812, 9679246, -18035642, -6978785, -2494839, 9337259, 9572945, -3431142, 10396505, -4495220, --12168179, -20904142, 2503966, 29417304, 10426570, -3328063, 8132521, -9306120, 15562814, -5602248, -20378546, 20016696, 2207076, -21248276, 3408594, 4915590, 23106388, 5813238, 26278758, -17548700, --11048266, 24528022, 25120190, 6900402, -6764037, -4466229, -25179246, -11764452, -50134616, 11805254, -17702782, -43410844, 24063628, 4795331, -12596065, 2597382, -12275553, -1213865, 9343164, 12673375, -22216256, -26148834, 2545842, 30151744, -3350611, -14374182, 27116812, -11917997, 1899449, -16057809, --6517613, -32063542, 8358543, 772557, 18115098, -12654047, 1343788, 22523346, -10662256, 360240, -23241678, -45625976, 2967823, -52231096, -16616692, -34992708, 27935542, 9876277, -2049773, 11718281, --10249939, 12784507, 35503272, 9547175, 55122684, -30719216, -35241280, 32469952, 8840116, -23834384, --22372484, -9139154, 20354924, -19569482, -755377, -16925930, -21849572, 12815646, 16042777, -32583232, --18941342, 27992450, -497679, 9874130, -6071473, 15333570, 6810745, 28254980, -16468515, -12236899, -7166153, 6500433, -8178155, -29564408, -21609592, -23396298, 31272730, -14561013, -24217174, 6996502, --6341519, -8003672, -15967615, 5992553, 7150584, -2684892, -4756140, -8715562, -14717242, -2608656, --3345243, -10763188, 383863, -5291937, -10102300, 6082748, -5966247, 5592585, -5887327, -5034776, -14760192, -5903433, 6971269, 5122822, -14078903, 6228777, 1852205, -5740761, -17071958, 23145042, -15234786, -6635188, 3587372, -11468100, -8685498, 7009924, -214748, -14718316, 5117991, -5937256, -13294534, -3635153, -2484639, 2485712, 6191196, -33851860, -68504192, -34213172, -13007308, 30036316, -39127688, -74772696, 12953084, -29657822, -40523016, -8258149, 46896748, 30023968, 25588342, -16072841, --18017388, -21510270, 23667954, 16750372, 36499704, 4838818, -47347720, -18477486, 35639100, -5387500, -10470593, 31981400, -15229417, -22000434, -34635152, -34616364, 231928, 22705882, 48842904, 36250060, -23983098, 9909026, -49948860, -53127136, 18613852, -36623188, 8674760, 46992312, 18653042, 3280281, --23665270, -42347304, -7279433, -18189724, 14239964, 11194832, 7951595, 29502130, -4596689, -5580237, -7710003, 21444234, 34571804, 35949412, 12127377, 32028108, 10702522, 11580306, -7057705, -35624068, --14074608, -15381888, -29353954, 22191560, 20575578, 15462419, 15206332, -6679748, -35243964, 5959804, -10451266, -421444, 23356570, 15203647, 12209518, -2647311, 1538135, 3587908, 24042690, 24437828, -18371186, 5499706, -4532801, -17683454, -3388729, 10548440, 2938295, -5121212, -187368, -14012868, --6693707, -8040179, -9415642, 7505992, 26239028, 13105556, -4933844, -2494302, -19814832, -1868848, -6781754, 13467407, 14651207, -4493073, -6431177, -30515206, -17859548, -4274030, 81068, 12499965, -10123238, -5875516, -7536057, 5142687, 1808718, 3350075, 7405061, -8393440, -3212636, -1542430, -4862977, 8346732, 624381, -2689723, -2457795, -12662100, 21192442, -60351268, -121411744, -62691492, -11719892, 47356848, 115472344, 112976432, 47042240, 48051020, 34483756, 1840394, -57573500, -97520456, --146939952, -43881680, -61496416, -10729902, 59907276, 106827112, 89801864, 79313552, 43687332, -1005559, --28019830, -37553584, -8069707, -65017752, -51657720, -49057652, -32174674, -26396870, -12279311, -2324114, -22341346, 52674552, 54220204, 53317188, 39007968, 50794432, 26911728, 29049548, -9542880, -2131915, --24014236, -62963148, -91231008, -110187920, -53413824, -21487722, 17113298, -2839510, 11607149, 25624312, -33469606, 71484360, 82386064, 109236048, 69641824, 7041599, 31807990, -16495896, -60360396, -52765820, --105075304, -122541320, -91645472, -56626460, -24384140, -19188304, 44069584, 49824840, 138174464, 113186344, -82778512, 81086296, 38805028, -4942971, -54932096, -79373144, -57985280, -69497400, -95481952, -45326400, -2607582, -9320079, 2682744, 41748692, 58132384, 42999600, 22393422, 21742198, 37032280, 15838229, --2781528, -4425427, -18204218, -3043521, -16246251, -42748884, -22641994, -31874026, -51835424, -9098888, --9021042, 41435160, 37704980, 22743462, 40567576, 70300560, 50260244, -12310987, -8513699, -33862060, --30198988, -70717176, -73410120, -35460860, -15011984, 6133750, 24862492, 29518236, 43898324, 50099184, -48352740, 50866372, 12934294, -5132486, -27078696, -32990180, -43663712, -48249664, -48510580, -20837570, -10845329, 14587320, 21026012, 22070764, 15260019, 16369194, 17044578, 5551782, 3984119, -5629629, --6033892, 10413685, -6889128, -16646756, 1023276, 3924526, -2014340, -4838818, -6873022, 720481, --1183800, -6866579, -1421634, 733903, 66035, -76773, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --4551055, --7092602, -5158793, 2002529, -785442, -12138651, -6896107, -530428, 1733556, -3736085, 1276142, --4507568, 877784, -3258270, 8514773, -6942278, -3049427, -3053722, 5424544, 3746285, 8668318, -2287070, 1799054, -3967476, 4088272, 520228, 1105417, -485331, 3279745, 4500052, 331786, -4485557, 4254702, -2073396, 2377265, -2534031, -2828236, 315680, -2312303, 1443109, -3624953, --6555731, 1762010, 2340220, -1633161, 1823751, -3136937, 2951180, 4013647, -6924024, 1344862, --382789, 2597918, 2226404, 356482, -6833830, -2056753, -3003256, 2258616, -80531, 679142, --2193655, 1257889, -3505230, 160524, 3803731, 2419140, 257698, -1953136, 1259499, -5598490, --3138011, -4115116, 744640, 697395, -348966, 5898064, 28991, 5140539, 75162, 537945, -481573, -25233, -2788508, 2085207, -168577, 1028645, -596464, 660888, 978179, -384936, --972810, -384936, -292058, -300648, -161598, -1502165, 258772, 1544041, 894427, 15032, -175020, -423054, -678068, 653372, -14011257, -446140, 738198, 198105, 2298344, -4947803, -3628711, 2035815, -2598455, -8352638, 5488432, 5628018, -1329292, 4682588, 3380139, -4632659, -9192841, 1910187, -4166118, 4936528, 352187, 4612258, 674847, -8017094, 3040837, -1525787, --2968359, -3118146, -2435783, 5237176, 4062502, 321049, 4250944, 1531693, -4023848, -4985920, --456877, -1171989, 2139431, 1447404, -3917547, 926102, 2035815, 1917703, -3444564, -2894808, --4562866, -1609002, -1139777, 906775, -1118839, 6113886, 2618856, -956167, -3104188, 1139777, -2547453, 1312649, 6590628, -1107028, 3319473, -399432, -2168422, -4012573, 2823404, -914828, --1857573, 3858491, -1193464, 1279363, -864362, -808528, -4449586, 969052, -1261647, 5223217, -6473590, -3904125, -3962107, -2791729, 1089848, -2506114, -1275068, -1619740, -1610076, -1748052, -1036698, 2405182, -156766, 616865, 719944, -259846, 77309, -1187022, -2645700, -4149475, --9535901, -5700496, -2082522, 6831146, 867047, 1267552, 4173635, 1120987, 1788317, -9989557, --9180493, -5848672, -1552094, -46171, 4205310, -3005403, 3285113, -1721745, -6181532, 1914482, --925565, -4227859, -91805, 5904507, 8575439, 3889630, -3962644, 2299418, 250719, 6190122, --52613, -4942971, -193274, -2888366, 6072010, 2658585, 2835215, 6163278, -1090385, 445066, -8257612, 7231651, -295279, -38655, 546535, -463320, 2181307, 602369, -6055367, -8015483, --2848100, -1021129, 5369, -2659122, -8946417, -952409, 2455111, -4866735, -2390686, -3171297, --2724083, 942745, 1126355, 2942053, -6240588, -4983236, 4781373, -2034204, -1104880, 986769, --388158, 3126199, -6010270, 2371896, 2204929, -2384244, -2301029, 2390149, -2635499, 3812320, --1515587, 33286, -17180, -1505923, 740345, 2817499, 1552094, 317291, 1698123, 483184, --796180, -1540283, -860067, -888521, 335007, 430034, -272194, -226560, 406411, -139050, -12744779, -4890357, -3874597, -620086, 218506, -4765803, 42950, -3334505, 6130529, -1500017, --7580618, -10558103, -2711198, -6993818, 9745818, 791348, 6915971, 5826123, -9241159, -520228, -3879429, 2805688, 4912906, 914291, -594853, -838592, 2304787, -3063386, 3529390, 1948841, --3295851, 2039036, 150324, 2381023, 5299453, -2861522, 2105608, -338766, 3027952, 2605435, --1084479, 3591130, -1017370, 3123515, -2386928, 2848637, -7485055, -3182034, -2733210, 2105608, -6473590, -4755066, -3142306, -1755031, 394600, -2173254, -2867965, -1519345, 2621541, 2123861, -3744138, -1242319, 2134062, -2205466, -2324114, -217970, -1396401, 2590939, -34360, -3910568, -2199560, -2283312, -3849365, -1429687, -2394444, 1693291, -2808909, -7623567, -1080184, -3295851, --3248606, 1653562, -2103460, -4589173, -933619, 970663, -329102, 276489, -45097, -2881923, -92342, 1521492, -1089848, -1204738, 306016, -58519, 550830, 489089, 1495722, 434865, --1298154, 862215, -230318, -460635, -501974, -1290101, -1209570, -1315871, 2166274, 3345243, --1291711, 5071283, -7919383, 3560528, -4727149, -5219459, 7687455, 2869038, -9036074, 957241, -74088, 2743947, -6497212, -4154307, -550830, -5261872, -9604084, -9301289, -6129455, -9282498, -4015258, -953483, 1431835, 5053029, -8144869, 5398237, -2286533, 2536178, 1682017, -813896, -865973, -1163936, -1152125, -5306432, -3166465, 6971806, -2542084, -5767604, -5299453, -501437, --2367601, 2183454, -5064304, -7861938, 1229434, 7337952, -1090385, 4453344, -2509335, 2433636, --3910568, 2998961, 1246077, -5371931, 7939784, 1421634, -1642288, 1859721, 7303055, 6725382, -3554086, -711354, -8097624, -1364189, -6746320, 1955284, -1464584, 1133871, 1193464, 1891396, --6131066, -47245, -438087, 2973728, 6304475, -7865159, 1064615, -2302639, -7351374, -832150, -2166811, -752693, -164283, -707059, 2437931, 475668, -2126009, -1466731, -1535451, -943282, --2534568, 86973, -202400, 1425392, -3058554, -2155537, -227096, -411780, -373662, 139050, --228707, 490700, -1106491, -1153199, -290447, -196495, -803696, -209380, -212064, 1362042, -1277216, -26307, 37581, -1422708, -2296734, -823560, 121870, -9019968, -8642011, -5614059, --9517648, -11278584, -10752451, 4555887, 4975720, -6916508, -1832340, -6261526, -10220948, 5471789, --2683281, -8863739, 3040300, -602906, 444529, 901406, 3002182, 988916, -329102, 2284923, -3056406, -5095979, -4911832, -1317481, -5987185, -421444, -6381785, -11015517, -892279, 6673843, --7997229, -6112812, 4303021, -4205847, 477278, 1700270, -4135517, -3311420, -3512210, -11867532, --5174362, 2554969, -3428995, -3929895, -7518877, 3345780, 6641093, -2411624, 10260677, -5698885, --2729989, -43487, -2529199, -8702677, -658741, 1996623, -333934, -1830730, -7648263, -1250909, -7433515, 3773666, 2157147, 3882651, 2724083, -1968706, 14258218, -4496294, -5608691, -5290863, --6400038, 2525441, 8077223, 5552319, 569620, -1320703, -4160213, -1468342, -178241, -1925219, -290447, -2582886, 941135, 5961952, 3799436, -2928094, -680752, -1060320, 2092723, -1234803, -2282238, -2477123, -1311039, 372588, 413927, -615254, 734439, -1430224, 1483374, 61740, -1154273, 1004486, 661425, -696322, -1212791, -295816, -1225139, 16069083, 10945724, -454193, -9999758, -794032, 1500017, 1949378, -5402532, 9124121, 139586, 8055211, 7719667, -6165963, -10014253, 196495, -7565585, -12503724, 11494943, 5595806, 11419781, -9497246, 6575058, 3586835, --10469520, -10335302, -6110128, -2905546, 11002632, -10405095, 9283572, -856309, -1007707, 6704981, -6312528, 8604967, 3175055, -4644471, 4207458, 8090108, -4860293, 8088497, 12259984, 5243618, -7444789, 3123515, 2113124, 2123861, 327491, -6629282, 2474438, 714575, 499290, 5655398, --3960497, 3390340, 3759707, -1588064, 10693395, -6228240, -3801583, -2373506, 9235790, -1638530, -7627862, 3896609, 5156645, 4667556, 898722, -13000329, -2020782, -10412611, -5676336, 13630616, -7090454, -6017786, -364535, -7428146, -6691559, -3441343, 11298985, 1058710, 3889630, 2258616, --1768990, 2374043, 4045859, 7139310, -2007360, 4201552, 2980707, 2626373, -2439005, -1486059, -1118839, -1195075, -61740, 1999307, 2610803, 1157494, 1126355, 3221762, 3076807, 1224603, -85899, 1588601, -667331, 2749316, 4072703, 2018635, 106837, 4559108, -14037027, 8929237, -8573292, 25295746, 1030255, 2224793, -1229434, -3426847, -1613834, 8580808, 7820062, 6820945, -9852655, 4019553, 15538655, 4574140, -6112812, 1517734, 13545253, 5371394, 1400696, 2132988, --6922414, -9966472, 6436546, -4935991, -9768366, -20712480, -305480, 8279623, -610959, 4893042, --7161321, -3776887, -2663417, 1574642, -2254321, -6194954, -3016141, -16681116, -4342212, -14156212, -1213865, -7453379, 5713917, -8115878, 3112241, -7802345, -2701535, -477815, 250182, 1221381, -1597728, -10342281, 5019743, -1548873, 2307471, -5400385, 155693, 8276939, 3338800, 11435350, -6409165, -3478924, -668404, -2347737, -1159641, -2673617, -3630858, -170725, 4697084, 3045132, -3492882, 2251100, -16338592, 10799695, 10596221, -3953518, 6070937, 4757750, -8633958, 4180077, -2595771, 569083, -1829656, 1530619, 5587216, -4883915, 3258807, -1356136, 287763, -350040, -1235877, 3020436, -2492155, -1081795, 4149475, -2896956, 212601, 174483, 1576790, -1872606, --3466576, 2173254, 140123, -1032940, -1034013, 582505, -121333, 2037962, 2298344, 2633352, -38655, -2683281, 27225798, 9816148, -4545149, 13449153, -8829379, 9381282, 6239514, -12809740, -2734821, -16114717, 331249, -5471789, -11348377, 6079526, 207232, 4655745, 6657736, 8266202, -13254806, 5542656, -940598, -3410741, -9022653, -16240882, 5769215, 6383395, 1768453, -5658083, -8786429, 1163936, 9283035, 5539434, -16952772, -6416145, 2285460, -12454868, 644782, -872415, --2368138, 3696356, 2757369, -2915746, 12502650, -7196755, 497142, 7035694, -6160057, 4842039, --2688650, -7552163, 5084705, -30602, -978179, 7233799, 4767414, 301721, -3737695, 14941654, -668404, 8422968, 846645, -4604205, -5165772, -12453795, -4825396, 5261872, -327491, 4498442, --1410897, -9689983, 3894462, 3266323, -14270029, 4203699, 7368554, -3757023, 7859254, 1906429, --8096014, -8189966, 9370008, -127238, -18738406, 2412698, 2029909, 867583, -1895691, 1184337, --2564632, 551366, 5610301, -1632088, 909459, 1495722, 1665911, -4634270, 1439351, -1598802, -1315871, 3577171, 3702262, 2752000, 1295470, -3004867, 1423782, -174483, -264677, 1351841, --3440269, 58519, 2385854, 3350075, -2141041, -1209570, -4031364, 825171, 4268661, -4068408, -1723356, 1608465, -28284508, -9389872, 29560112, 8208220, 4720169, -4447976, -795643, -4541928, -6029061, -9555228, 12922483, 7395934, 6058588, 6228777, -4577899, -445066, -533113, 4159676, -8697309, -13085155, -7770133, -4177393, 9944460, 3595961, 5546414, 5975374, -1366873, -9379135, -3074660, 738734, 18054968, 14216879, 3732864, 10798085, 586263, -5196374, 2233920, -1485522, --2481417, 6963753, 8548059, 7048042, 17468168, 8449274, 6850473, 7683697, -7929047, -12971875, --6092948, 5928129, -11074573, -5465883, 10755672, 11485279, 6288906, -5178120, 10147934, -3986267, -1102196, 2443300, 5827197, -2972654, -6338298, 3643206, -5716602, -17891760, 773631, 5805185, --9765682, 1290101, -1764158, -2515777, -1791538, -5779416, 14564234, -1505386, 8323647, -20871394, --19872276, -16811038, -7678328, 1729798, 2040110, -531502, 1147293, -338766, -4441533, 2195265, --4882304, -1420560, -2142652, 5111548, 805306, 1860258, -3922379, -706522, -3491809, -1248225, -2765959, 4418448, 4722854, 4558034, -67109, -3022046, 2466922, 4017942, 2472291, 4000762, -1389422, -361851, 1678795, 589484, 818191, -1179505, -2735357, 3234647, 3587372, -1167157, --1034550, -777389, -604517, 14556181, 22890566, -33740188, -4788889, 1999307, -272730, -4055523, --8426726, 9223442, -10812580, -17172352, -1762547, 16741783, -2416456, -9810242, 3093987, -13719736, --7461969, 529892, 8780524, -14380624, 1578937, 15661598, 16069083, 402116, 5680094, 14035953, --8051990, -12569759, -17564806, 1684701, -17508972, -3754338, 7349226, 6909529, -15495168, -14623290, --8894877, 6272800, -4128537, -2746632, -4080756, 13936632, -20750060, -6083285, 3210488, -11199664, --3872450, 19864, -13096966, 588411, 5364414, -731755, 17133162, -1180579, -6962142, 1436130, --884226, -5652177, 3273839, 8419747, -7825431, 12015171, -5961952, -22426708, 1035624, -8766028, --4815195, -643708, -2414309, -29580514, -4980015, 13529147, 11684995, 8164196, 17628156, 17952426, --24338506, -2754685, 1552631, 5033165, -7082938, -12135967, -242129, 5468030, 6469295, 5516886, -4306242, 2034741, 3471407, -6523519, 23622, 3852049, -2058363, -1536525, 711891, 1227287, -3491809, -3912178, 703301, -1607928, 1631014, 2240362, -5201743, 704375, -541166, -3613678, -1511292, -868657, 674310, 110595, -95563, -4560719, 2295660, 259846, 1195075, -3060701, --2258079, -2051384, -1905892, -32273458, 8995272, -6016176, 10984916, -10339060, -122407, 16858284, --5657546, 23958938, 5499706, 4604205, -10320806, 4519916, 11871290, -7338489, -1501091, 15489263, -9979357, 11654931, 1637993, -17940616, 11387032, -11588896, -1093069, -6991670, 1763621, -8923331, -5173825, -2336462, 5042292, 4798552, 8565775, 8684424, 9640591, -11453604, 2724620, 18262200, -3893388, -3292629, -3671660, -9187472, -7406134, -49392, 671089, 3278671, 15371151, 1315334, -8479339, 8210904, -580894, -3928285, -3741454, 13943611, -16296717, -3555159, -14421426, -11891691, --3338263, 89657, -24196772, 6279779, -7606924, 14809047, -3069291, 635655, 10284836, 2093260, -24845848, 20510616, 29595546, 11181947, 1257889, -3451006, -3000572, -5004174, -1451162, -5949604, --16291885, 11024644, 13510357, 6424734, -2202781, 1493575, -11472395, -15628312, 7257421, 1912334, -2164664, -5052492, -2145873, -5481452, -2945811, 4766877, 1597728, 6254010, -401579, 1357747, --3587908, 4345433, -12921409, -3463354, -441845, -571768, -2419140, 2216203, 605590, 773094, --878858, -3217468, -618475, -1381906, -849867, 3959960, 495532, 425202, -2641942, 787053, -664646, -287763, -5752035, -4281546, -9451612, 12746926, -3721052, -2775623, 29734058, -6124624, --6527814, 33059974, -460635, 18814642, 13888314, 1112933, 7797513, -4434017, 6117107, 5741298, -3651796, 4660040, 15285252, -10528575, 18417894, -10136123, -301721, 3772592, -2476586, -13349295, --11913166, -355945, -19345606, -6186901, -21134460, -1461363, -12550431, -9402757, -6867116, -6044093, -3166465, -17012366, 19753628, 3094524, -12809740, -9577777, -597000, -2487323, -3127810, 5102958, -2723546, 19407884, 2240899, -224949, -9905268, 1631014, 4034585, -732292, -10567230, -4588099, -12194486, 13279502, -774705, -11288785, 4628364, -2226404, 17339320, 19293530, -7524246, -4997195, --3553012, 2188286, -7400229, 7798050, -24005110, -2257542, 28399934, -25616796, -12612708, -5938329, -1851668, 2265595, 3399467, -2319819, 7612830, -4541928, -1269700, 13821205, -2167348, 10016937, --6771016, 10091026, -8825621, 6911676, 5641440, 13718662, -278636, -2320893, 5799817, 9030706, -808528, -2162516, -1415192, 919123, -4902169, -1495186, 4625680, 6095633, 1921998, -1975685, -5922223, -4624069, 4866198, 4063576, 4440460, 2444910, 163209, -7209640, 7250979, 4285841, -3357054, 1592359, 3421478, 6343130, 1460826, -4976257, 2484102, -4055523, -3124052, 5250061, --1276679, 4545149, 4926865, -1922535, -3582540, 2027225, -17297980, -9479530, -2705830, 13387413, -16136729, 11059541, -10268193, -26353382, 45624364, 11477763, -28632400, -28727426, -4304094, 6956774, -19432042, -24992952, -4412005, 4667019, -361314, -3594351, 26146150, 5610301, -15349139, 8195872, -1079111, -733903, 13765370, -2511482, 7522635, -17040820, -5773510, 29944512, 11061151, 23613730, -7451232, 21349208, 3731790, -7841537, 15009837, 13681081, 21442088, 10559714, -24218784, -9183177, -5235565, 12517682, -9730248, 3692598, -9375914, -15658914, 1580011, -1810329, -9373229, 7284802, -10142565, 8808978, 6431177, 6039261, -4622459, 16207059, -133681, -16102369, -11697880, 14576582, -7896834, -25289842, 10991895, 4489852, 8124468, -22097606, -15111842, 14209362, 21943524, 12409234, --4941360, -23630910, 5339718, -1045288, 20143396, -6728067, -27101780, 11356430, 15796890, -5990406, -16441135, 13538811, 5572183, -10821707, 1409823, -142808, 3153043, 1186485, -745177, -5757941, --2430952, -7226820, -760746, -1428077, 3764539, -4414690, -2660732, -1483374, -3321084, -2019172, --1772211, -2018098, 8383240, 2524904, 85362, 8169028, -2044941, -7707856, -5192079, -4131222, --3348464, 354335, -5637682, 2360085, 3400004, 2887292, 2132988, -7403450, -2896419, 6211597, -5105643, -766652, 10897943, 21285322, 8205535, 22471268, 3767760, 10310069, 7679939, 37430640, -50927036, 3984656, 10193568, -32407676, -10296647, 19607062, -16514149, 38554848, -7670275, 6080063, -10386305, 22580790, 12524662, -5376226, -16356846, -19170586, -6326487, -3151432, -24041616, -11393474, --9566503, 15428059, -8946954, 4595615, -15420006, 2055142, -6063957, -22496502, 23380192, 16217797, -18821084, 8291435, -11482058, -11115912, -26188564, 483721, -23606750, -7170448, -2017024, 3112241, -12071542, 9525701, -7672959, -5435818, 9996536, 22111028, 5924908, 8454106, 16123307, -20565378, -14555107, -11681774, -10815265, -20764020, -9117679, 9495099, 8007967, 1323387, 24254754, -5315559, --9028021, 3718368, 6327024, 33348274, -10996727, 13368623, 13144211, -32058172, 8590, 4005594, --7093139, -4724464, 11054172, -6362457, 913754, 13583371, 6990596, -19729470, -23710366, -22867480, --10735271, -8512088, 19040126, 16623134, -4589173, -7268159, 944893, 2110440, 12549894, -1419487, --3965866, 7801808, -1464584, -1301375, -3326989, 5651103, 7721815, -4109210, 7391102, 6984691, -7148436, 1262184, -3043521, 6319508, -4381941, 3786014, 8050380, 593779, 4800163, 6445136, --10949482, -477815, 5327370, 5957657, 8024610, 944356, 7184407, 378494, 462783, -2469606, -4125316, 6041409, 31903554, -7567196, 4663261, -14266808, -4087198, -19018652, 15111306, -27362700, -1257352, -22033720, 4359929, 9433896, 3423626, -13188771, 45197016, -3176128, -6080600, 4103841, --25724170, 1475858, -17381732, 597000, 4884452, -5211943, -592706, 10644003, -9445707, 405338, -13678397, 1116692, 3460670, -22136262, 2818036, -1873143, -1380832, -5609228, -27460410, -15285789, -6785512, 2242510, 12191802, -31822486, 3469260, -29617558, 15015743, -20201378, -32309428, 16357383, -29788820, 5131412, 14652281, -22317724, 22095996, -5484137, 3298535, -13691282, 18403934, 7408282, -19110456, 5994701, 23186918, -21012590, 4012036, 1152662, -3601867, -16663399, -13583371, -15663209, -17768280, -4742718, 24148454, -15016816, -11518565, 2692945, 3216394, -13434658, 6971269, -7908646, --31454730, 13810467, 20837034, 34586296, 12099460, 24527484, -14184666, 26307, -15992311, 26275000, -8862665, -5061082, -10480794, 12460774, -8993125, -2555506, 1329292, -7960722, -13394929, -8953933, --6352794, -5352066, -17838610, -7793218, -14870787, 11421392, -2843805, 6769406, 13340705, 3479997, --10123238, -1021665, -10131291, -4399121, -15136538, -8413841, -16021839, -2863670, 26208428, 5284421, --2025614, 5820218, 7844221, -15239618, -6995965, -958315, -2057826, -6371584, 6633040, -3070902, --23232014, -2084133, -5367636, -52807160, 6482180, -16870094, 48863844, -9197672, -24679956, 9811316, --1419487, -24587078, -4214974, 4092030, -14811732, 36892160, 5228586, 3539053, 16729971, -20747376, --31947040, -19682224, 45009648, -3593814, -9596031, 29753922, 16756278, -14192183, -14139032, -7950522, -35668628, 5004711, -8750459, -13963476, -6785512, -27888834, 18769008, -3249143, 7577396, 17940616, --6395207, -28882582, -3590593, 37249176, -1654099, -9290014, 17893908, -8156680, 22217866, 14625974, --1951526, -27523224, -14085882, -3773129, -25538950, -14948097, -14737643, 1998234, -3554622, 21510270, --15018964, -5186710, -142271, 55300388, 19175956, -9516574, 11149735, 6524056, -3293166, 28085864, -13615583, -10624675, 4365835, 22708566, 25617870, -15652471, -11206643, -37548216, -30183956, 17166984, --11292543, 18532248, -534187, -22073984, 5375152, -1743220, 6983080, -14685567, -11233487, 20794622, -5235029, 2762201, -2084670, -2424509, 13785771, -6620692, 7091528, -3528316, 8595303, 17470854, -4625680, -12620761, 2064269, -4847945, 9501005, 7862475, 2589865, 11373610, 17666812, -6942815, -14249091, -1379758, -18945100, -4895189, 592169, -10585484, 4250407, 13791140, -272194, -6979322, -843424, -2579128, 17974438, 15420543, 1561758, 7299297, 9258339, 4843650, 12006044, -15411953, --11476689, 5516349, 3095061, -3275450, -1370632, -2537252, -5765994, -5684926, -59680720, 20480014, --12782896, 31747324, 32278290, -18722836, 15235860, -31965294, -47995724, 1163936, -33758980, 4429722, --4236985, 26101054, -19398220, 18620830, 15971910, 26178900, -39882528, 4342749, -24414204, -22369800, -2406792, -28876138, -18634252, 26196616, -7661685, 9943923, 30586610, -6075231, 10064182, -25218438, -2889976, -27804544, 25761750, -23048942, -15311558, -17015050, 28738164, 23036058, -16511465, 31501438, -20855824, -6666326, 31257162, -1743757, -33085744, -9141838, -3904662, -25776246, 5801427, -54536956, -5468567, -13874355, -26179436, -21137144, 24375550, -14559939, 50542100, 37563248, -56511568, 25770, --1478543, 2714419, 26121992, -44361644, -30942556, 30522186, -25433186, -31774704, -36597952, 2481954, -75163536, 37371048, -34979288, -22007950, 3047816, 27374510, 10460930, -36557152, 5439039, -24414204, --14358076, -1273458, -4403415, 1437203, 24127516, 5733245, 14307610, 9516574, -28135794, 7592429, -12632036, -3942780, -10138807, 1521492, -24008868, 21409876, 7762080, 5880884, -31843424, 5352603, -16428787, 4673998, -7521562, -5916855, 14122926, -23194434, -1495186, -17286706, -9580998, 22805740, --24059334, -943819, 14344654, -12032888, 11247446, 13701483, 3558917, 2088428, 10030359, 3318399, --12801150, 18737332, -14424648, -11258720, -6545530, -19704774, -6808597, -18464602, -17700098, 6441377, -27705224, -31722628, 15244986, -52969832, -8336532, -20909512, -18252538, 27302570, -36308580, -56439092, -32251984, 48736604, 11502996, -10035191, -45134200, 2535105, 17087528, 16998406, -7909183, -18435610, -1834488, -4940823, -6259378, 5177046, -6991133, -15537044, -29681446, 3182571, -18014704, 3833258, --16186658, -33934000, 20365662, 14726906, 25133074, 351114, 27217208, 14911053, 3783329, -9503152, --14465987, -23549842, -16761110, -9807021, 6177774, 15297063, -10975789, -5750425, -38395396, 35163436, -42000484, 22991496, -21893058, 22036404, -29772714, -1025423, 6485401, -64990908, 4981625, 5852967, -30182346, -39003136, 49371184, 18953154, -35807680, -20685100, 14715632, -6731825, -26287348, -32471026, --34639448, -47457240, 34333432, -15293842, 5234492, -72285376, -28754806, 3920768, 597000, 15973520, --11619497, 2421288, 12075837, 12390981, -34459596, -8358007, 5414880, 18523120, 13640816, -3445101, --13322452, -6110665, -2994666, 17259326, 2886755, -11596412, -1451162, -9121974, -3461207, 15923054, -7415261, -8611409, 17419850, -17943836, -10317585, -13514115, 16853452, -7227356, 1965484, -8281771, -7346542, -24772298, 3558917, 9674951, 3807489, -4734128, -10632192, -9602473, -12427488, 11839077, -2647311, -4573067, -14209362, 14245870, 833224, 609885, 2107218, -25211994, -12131672, -16657494, -2123861, -8650601, -5191005, -49203684, -6680285, 17721036, -23166516, -21619254, 20138564, 20377472, -4060355, -19556596, -66505420, -9937481, 12884902, 7735773, 28697360, -818728, 16646219, -4524748, --510027, -8558259, 1156957, 17374216, 1948305, 507880, 17000018, -4776004, -4195110, -22671522, --2142652, -3841312, -2582349, 3624953, 13560285, 18371186, -3715684, -244276, 14548128, -3562139, --28192702, -2196876, -25030532, 3368865, 3357591, -33028298, 23708756, -45410152, 10064182, 12132209, --19828790, -1687922, 58486716, -16869020, 19724100, -12663711, 10427644, -44146896, 4700305, 25335476, --710280, 21810380, -5173288, 1971390, -1444720, 27953794, -18219788, -22220014, 25097642, -23550380, --28645822, -733366, -45744624, 30147986, 25373056, -9541807, 9797894, 3833795, -268435, -39352636, --6406481, -3383361, 17177184, 6027987, -16414828, 15046881, -1100049, -20272782, -13440026, -12776991, -2659122, 2247879, -2682744, -900869, 12474196, -12755516, -3506841, 8107825, -13079786, -7558069, -10132365, -13937169, 927176, 11440182, 794569, -3838627, 5232344, -957241, 1236951, 9906342, --3741990, -3670587, -7893076, 2964064, -4956929, -5311801, 4631586, 5192079, -11119670, 1296543, --10375030, 9596031, -11818676, 6113349, -2147, -2654290, 1276142, -3134253, -1298154, -1010928, --24344412, -73437496, -34567508, -11567958, 23879482, 53955528, -49584324, 10736881, -14407468, -50005232, --7064148, 44777180, 12000139, 36872296, -31261994, 9196062, -10866267, 2102387, 21749178, 3611531, -11792906, -7140383, -63677724, 18786724, 3073586, -27084600, 27679454, 21090974, -19274202, 19491098, -2308545, -20795694, 6314676, -12878459, 39758512, 4809290, 16085189, 696322, -40853728, -32772212, --11042898, -24304146, 26548266, 38097972, 39226472, 31512712, -10946798, 4332549, -32097902, -4915590, --3239479, -13582297, -16917876, 2649458, 3092377, -44178572, -12920872, -17325362, -1216013, 19662898, --21701932, -5098126, 7625715, -47245, 22699440, -25248502, -1024887, -28591598, -14975477, -21165062, -11605002, 7471633, 22677428, -3177202, -2358474, -26966490, -8054138, -12869870, -3382287, 11218455, -15530602, 31785442, -20477330, 5679021, -17743046, 6232535, 11955041, 3192235, -9766756, -4144644, --3433290, -4148939, -1451162, 8264054, 8860518, -2688650, -1047435, -4440996, -6289443, 3919695, -8818642, 2806224, 978716, 2199023, -7445326, -8864812, -8112657, 13202193, -383863, 9066139, -7648263, -1492501, -10449119, -11423539, 1665374, 2910914, -8671539, -3003256, -7547868, 5342940, --5470715, 1664300, 1581622, 5586679, -2953864, -3687230, 1423245, 1856500, 19069654, -30870078, --121735480, -64207612, 13144211, 51173460, 114566640, 87520696, 49303540, 16576426, 25710212, -8192650, --48204028, -93235152, -124003760, -31402116, -35947804, 1829656, 60381872, 86106576, 57753352, 77144592, -17760226, 16320876, -9034464, -39085812, -44229572, -35800700, -38006704, -47027744, -37682432, -16148540, --2424509, -619549, 30116310, 39039104, 74721696, 35265440, 11625403, 30636002, 47688632, 15158013, -9101036, -38524248, -52668648, -86129664, -39782136, -45198088, -32673964, -19499688, -15266461, 6323266, -10608032, 36142148, 74115568, 59569048, 65069828, 48119204, 59035400, 43867724, -35504348, -32614908, --82030120, -63602560, -46495704, -104545944, -80806592, -49507552, 3929895, 63265944, 60369524, 71256728, -89193584, 76190576, 41084584, 49425408, 1976222, -19454592, -52309480, -76060648, -76292576, -63052268, --37826852, -8249022, 10888279, 18323942, 21182778, 35179540, 25507274, 41162968, 26134876, 10223633, -6768869, -1685238, -4026532, -1090922, -28506772, -20043538, -3994320, -13382581, -34053720, -9693204, --12197170, -12805445, -2317672, 25358560, 48223356, 39826156, 4258460, 39140036, 27724550, -5282810, --32276680, -51323784, -47537772, -21697102, -23513336, -14889041, -8125005, 13423920, 29911762, 41248864, -47119012, 33740728, 13318694, 14351096, -8957154, -25884694, -43292196, -39007428, -17136382, -1905892, --12637404, -4318590, 12534325, 15674483, 16426102, 15391015, 4071092, 6305549, 10040023, -1909650, --8971650, 105764, 3290482, -6816650, -7377143, -1222455, 3005940, 1996086, -4589173, -2531883, -2313377, 876173, -3190087, -4255239, -1751810, 462246, -71941, -90194, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --1562831, --2220498, -4257923, 2469606, 3956739, 7029788, 1888712, -4956393, -8808441, 1897302, -4122095, -338229, 2747705, 1063004, 7102802, -5896990, -1464047, -811749, -481036, -5063767, 3098282, -1307818, 635118, 125628, -2482491, -1908576, -1802813, -586800, 231928, 1180042, -1876901, -2700998, 6356015, -213138, 2814814, -4527433, -2638721, -5416491, -2625836, 5734318, 258235, --1180579, 1004486, 6084358, 639950, 3055869, -786516, -2866891, -913754, 3470334, -3006477, -5450851, 3343632, 6147172, 3020436, 384936, -1902134, -4087198, -2280091, -3553549, -565862, --2594697, 1005022, 222265, -1414118, 897111, -1218160, 2196876, -571231, -610959, 3089155, --312996, -244276, 412317, -3033858, 1369021, -2226941, -3554622, -2069637, -1563905, 1522029, --294205, -271657, -4030290, -695248, 1050656, 767725, -1600412, 125628, -1581622, 682900, -1133335, 817118, 320512, -306016, -641561, 158914, -1242856, -701153, 278099, 157840, -557272, 510027, 503048, 81604, -12274480, -2782065, 5031554, 879395, 6860674, 3657165, --5651103, 1486059, -124554, 2244121, -2024540, -9427990, 5438503, 3328063, 6231998, 7785702, -6707129, 2346126, 89657, -9606768, -991064, 4402342, -4378719, -3805341, -10026601, -680215, --1678259, -1167157, -2552821, 1180579, -5985574, 2721936, -1050656, 2524904, 744640, -4031364, -3104188, 2582886, 6953015, -817654, -5570573, -2885681, 3013993, 1203665, -1394254, 279710, -2218888, 279710, -4070555, -47782, 856846, -442919, 257698, -2578591, -1126355, -3430605, --704375, 4201552, 1505386, -1449552, 1799591, -558346, -216896, 628139, -4887136, -460635, --242129, 2721936, 5292474, -1576790, -533113, -3425773, -2643016, 1338956, 6022618, -5341866, --833224, 1355062, -288300, -1460826, -91805, -1424319, 1962263, 2044404, 1089848, 3332358, --1589138, -1043677, -340376, 772020, -762894, 124017, 544387, 461709, -395137, -1422708, -1050120, -1416802, 6787659, 2547453, 2294050, -2276333, 178778, 638340, 650688, -11654931, --6302328, -528281, -2899103, -3607236, -178778, -3037079, -11860015, 7068980, 1626719, 3199751, --1246614, 2434710, -3134253, 150324, 428423, 6111202, -2171106, -1287417, -1019518, -1032940, --975494, -432718, 6624987, -1282585, -97174, -3772055, -209917, -1821066, 2153926, 1089311, --6415071, 4976257, -6493454, -124017, 5696737, -815507, 213675, 434329, -130997, -3979287, --2827699, 6539625, 3781719, -8104067, -4330938, 1282585, -4758287, -3452617, 3468723, -5832566, -1133871, 1413044, 3335579, 6965363, 5339718, 3266860, 2495376, -4745402, -4947803, -4236449, -1377074, 6061273, 2342905, -1039382, -2706903, 1987496, -2288144, -997506, 1411971, -2246805, --3405909, -457951, 2730526, -494458, -2324651, 309775, 22549, 2660732, 1108102, 2457795, -559956, -1126355, -1155346, -923955, -482647, -308701, 790274, 1546188, 1837172, 1932735, -8908836, -2181307, -2276870, -2670396, 2512556, -2987687, 4356171, -8450348, -1082869, 6268505, -3281892, -6355478, 4702453, 7719130, 7284802, 4645544, 890669, -289910, -4764730, -6144488, -2605972, -591095, 6158446, -483721, 3682398, -3838627, -2554432, -2059974, 609349, 1961726, --349503, -7503845, 1582159, 2598455, 1887101, 3234110, 1983738, -4072703, -10027138, -3229279, -1467268, 1932735, 470836, -431107, 1901060, -4114579, -68719, -7471633, 3490198, -7708930, --2034204, -3269544, -5073430, 3699578, 1634772, 1568200, -4430259, -2155000, -1305133, -4443144, -418759, -378494, 2371896, -1905355, -3741454, -2856153, -8873939, 2816962, 1026497, 3809636, -5618354, 7176354, 2799782, -2829310, -4228932, -1996623, 3898220, 3889093, -4407174, 4803921, -202937, -3125126, 6926709, -1344325, 1561221, 1174674, 2031520, -124554, -1548873, 448824, -2151779, 772557, -341987, 2331630, -1222455, -957241, -1693291, 799401, 209380, -865973, -1274532, -1236951, -2230162, -935229, 1689533, -406948, -389231, 609349, 4460324, 4121021, --706522, 2918430, -8606578, 1023813, -4108136, 462783, 1286880, -5402532, 1980517, 15855946, -1736241, -1387811, -8915278, 12767327, -24159, 5370320, 638340, -252866, -6927782, 6745783, -1731946, -3707094, 884226, 523986, -2763812, 2736431, 7099044, -2049773, 7548942, -2218888, -3230889, -104690, 4978941, 4436165, 4958003, 69793, -2697776, 3897683, -2843268, 3434900, --976031, 3462818, 3354370, 3227668, -416075, -972810, 1289564, -2773475, -4030290, -10290205, -6735583, -6648073, 4661114, 610422, 1963337, -1187022, -12290049, -2646774, -3317325, -5972689, -814970, 3740380, -7894150, -2483028, 3564286, 672162, 5585605, 9763534, -265214, -2624762, --2330557, -10119480, 3109556, 1975148, -2264522, 546535, 4025458, 4142496, 1197222, 1067299, -2914672, 350040, -445066, 4361540, 2563022, -2374580, 4449586, 3266323, 4368519, 1356673, --741419, 329639, -281857, -278099, -1611150, 586800, -977105, 1029182, -1235340, 2052994, -734976, 212601, 1691143, 166430, -507880, 493384, -360240, -128849, -574989, 2044941, -1247151, 433792, 1451699, -439160, 2307471, 319975, 743566, -4495220, -5429913, -526670, -2924873, -1739462, -2619393, -3958886, 1158567, 7198902, 3231963, 1131724, -16364362, -7515119, --2277407, 3346317, -1949378, 5535139, 18685792, 5807333, -6853157, 1063004, -8108362, -2633889, -5695127, -6465537, -1633161, 8329016, 2019708, -2090575, 1194001, 4708895, -2825015, 2281165, -2487323, 2442763, -4626217, 2114735, -2159832, -2654290, -6839199, -2670933, -3993783, -7633768, -3347927, 259309, -508954, 7699803, 5635534, 1971390, 6194954, 33823, -7825431, 6594386, --737661, -5369783, -4223027, -7794829, 363462, 9380209, 650688, -4134980, 3997004, -6991670, --4365298, 3613678, -5645198, -7529078, -3943317, -2375654, 4252555, -6652905, -2044941, -3098282, -8559870, 1230508, -2957622, 4192425, -2558727, -3120294, 492848, 6770479, -1265405, 447213, -3755949, 2144263, -8638253, -330712, 5280663, 2507187, 3080029, -704912, -1671816, 3877819, --2308008, 668404, -1891396, 1105417, 1461900, 2004676, -4378183, 25770, 459025, 1103270, -270046, 46708, 2051921, -384400, -389768, -1933809, 1508070, 5688148, 4107599, -10622528, -10069014, -3799972, 923418, -4646081, 8622684, -1228898, -5819144, -18964428, -2535641, 9834401, -2430952, -14785962, 6731825, -15032, -3033321, -4744865, -3847754, -1464584, -8798777, -1487669, -7101192, 9250823, 11006927, 6681896, 10036265, -3294777, 7903814, 3809099, -15620259, -372052, -4056597, 5541582, 2697240, -5386963, 299037, -1127429, 5502927, -9362492, -3373160, 6954089, --2305324, 3908957, 2046015, -6237367, -6933688, -3578782, -10385231, -2956548, -3196530, 4257923, -1535451, -6005438, -1389422, -12821014, -3242164, 5231807, -3757560, -12669080, -201327, 7192997, --15381352, 4456029, 2544231, 4883378, -7300908, -3389803, -6940667, 534723, -2095407, -7849053, --2080912, -1321239, 4702989, 2661806, 11475079, 728534, 103616, 1831267, -890669, -5824513, -7245073, 2531883, -3012383, 6365679, 1132798, -3164854, 1026497, -199179, 3848291, 887448, -735513, 2411624, -2090039, 87510, -2243047, -5369, -1794223, 1771674, -751082, 767725, -2141578, 309238, -1410897, 2018635, 470299, 2148558, 543850, -620086, -11756399, 2643016, -9449465, 12170864, 9075803, 9268539, 3591667, -6398965, 6498286, 11249056, -16604344, 8355322, -8355859, -17791366, -4653060, 4393215, 19224810, -1480153, -1202054, -4559108, -5361730, 23778550, -11800960, 3321620, 2991982, 12341052, -205085, -1859184, -4587025, 1858110, -10667625, -9633612, --2182917, 3002719, 7170985, 3259880, 1643362, -3627637, 712428, -7832947, 3286187, -11616813, -11416023, -1262720, -5655398, -6673843, -7607461, -11720966, 2050847, -11345693, -3796214, 7806640, --1787780, -3879429, -3714610, -1808181, -9688909, -6739341, -4353486, -4130148, -2193655, 3580929, -2018098, 600759, 542777, -8574902, 14802068, 8501888, 231928, -1079111, 19461570, -2335389, --3332895, -4763119, -9824738, -2690260, 6522982, 6257231, -936303, 7612293, -15091441, 4479114, --5741298, 1455994, 5843303, -2018635, -110059, 955093, 519691, 1874753, -2353642, 2824478, -3645354, -3395172, 1426466, 1915019, 2385318, 6185827, -4622996, -417149, 676994, -108985, -1468342, 692027, 1532230, 1953136, -1665911, 1256815, -505732, 155156, -3291019, -710817, --759672, 2822331, 21895206, 7478612, 4633196, 10627360, -11993159, -7216619, 6861211, 7298223, -16252156, 2352032, 4533338, -10940892, -624381, 5399848, -14341970, -4627828, 5768678, -4796405, -199179, 3923990, 10632192, -3606162, 4166118, 2166274, 2353105, 9054328, 7910793, 9649718, --7588671, -5098663, 10481331, -13291313, -4395899, -4418985, -877247, -3612604, -8473970, 8238821, --285078, -9178882, 443455, -3631932, -9532680, -11912629, -6604586, -7152731, 14056354, -4502737, --3569655, -8352638, -685047, -4266513, 2178085, 16538845, -3100967, -5449240, 2822867, -1013075, -9560060, -11123965, 18775450, 3733937, -18065706, -13163538, 4763119, -12190728, 197569, -13050795, -57445, 2753074, -1669132, 14033806, 17624936, -8413841, 2133525, -3488050, -13049721, -4904316, --7110319, -8543764, -1964948, 6373732, -4435091, -10063645, 6633577, 401579, -5442798, -4625680, -2180770, 3687766, -1627256, -1086627, -5126581, 241055, -4734665, -985695, -2376191, 3258270, -3711926, 853088, -4702453, 461172, 292058, 2990371, -78383, -1203665, 241592, -5931887, --659814, -3364570, -2371896, 414464, 1314797, -3139621, 2391760, -1846299, -1701344, 3955128, --1613297, -3948149, -19105626, 7332583, 39757440, -6784975, -373662, -17289390, -7225209, 11864847, --1632088, 22836878, 13751412, 12711493, 170725, 9828496, -18539764, 17027398, 8865886, 886911, -2299418, -10713259, 4776541, -76236, 17358110, 9720585, 11595338, -4102768, 1207423, 3088082, --11517492, -9278740, -4177930, 5383742, 20235202, -5504001, -6715182, -6778532, -3751117, 2700998, --12724377, -3638374, -758599, -6775848, -13473312, -2784750, -17114908, -6175089, 10215043, -11882564, --5135707, -2276870, 1058173, -19306952, -11593727, -2447595, -1927904, -3620121, 12328704, 5459441, -915365, 7459285, 12699681, -7669738, -3103651, -10490994, 4924717, -8232379, 7197292, 8220568, -9890773, 17854716, 5156108, -13290776, -2056753, 29866666, 9825275, 16830366, 8200167, 5172751, --1023813, 2123861, -6919193, -8919036, 4196183, 3059091, -8812736, 2470143, 6386617, 5743982, --8453569, 6815576, 2430952, 4937602, 5767068, 50466, 2860448, 4776541, 2075543, 5592048, --406411, 1279900, -1582696, -3627100, 954557, 4894115, 870268, -2000381, 7901666, 5035849, -4375498, 264677, -774168, -1177895, -38118, 359167, -1095217, 2815351, 2291902, 2237678, -2526515, 1288490, -3952981, 20482162, 22446036, -22628036, 5566278, 16626892, 10053445, -6300717, --12030203, -10408853, 23395224, 1930588, 8814884, 12274480, -6962679, 3473018, 5152887, -14294725, --15183246, 12370043, 4222490, -22125524, -5087926, 28786482, 13820131, -47245, -16393890, 5395016, -4340065, 17507360, 5806796, -8524436, 11476153, 2034204, -4796942, -1656784, -3440269, -13645111, --6429566, 2096481, 2380486, -16290811, -17563196, -10406706, -5021354, -19348828, 11527692, -1207960, --13717589, 2622078, 355945, -5962489, -1635309, 4154844, -79457, 4372814, 5107790, 7796977, --7618735, -9081171, 12030740, 24324010, 11048803, 6640557, 17779018, -3332358, 9705015, 23640036, -14495515, 2222109, 2678449, -7398618, -14433774, 14060649, -13747117, 6187974, -5482526, 4294968, --18006650, 8648454, -195958, -5908802, -3364033, 10249403, -9689983, -4905927, -2480344, 1551557, --197569, 3026878, -3820910, -497142, -6909529, -1770600, -369367, 1268089, -2045478, 2395518, --2568927, 2076080, -2296197, 7858717, 2497524, -2031520, -3619584, 2969970, 367220, 2723546, -2509335, -1887101, 2263985, 2890513, -1902134, 754841, 3616363, -1086090, 1305670, 3933116, -4179540, 7190849, -4619774, -21237540, 5958731, -10239739, -4723927, -7915088, -1336809, 18177912, -18002356, -36427764, 11266773, 11559368, -11320997, -18533320, -24167780, 4261145, -7105487, 4471598, --8441221, -6635725, -3931506, 22546968, 5701032, -1965484, -398358, -3593814, -6751689, 5701569, -3738769, -107374, 9032853, 1964411, -1921998, 3220689, 8195872, 23269596, 2325188, 2863133, --11515344, -4924717, -5460514, -5791764, -722091, -1940252, 7690139, 11130408, 509491, 12859132, --3007551, -2177549, -2656437, -1436130, -22578644, 25437480, 634045, 1799591, -1894618, -6616397, -6729140, -1746978, 10304700, 582505, -9900973, 2670933, 10925860, -7792145, 10144713, 2470680, --15581604, -2659122, -3352759, -28297392, -9687299, 7232725, 7284802, -11563663, -6673843, 6752763, -914828, 18910204, -15093052, 6862821, 8418136, -1224603, 7358890, 6856379, 8344585, 3221762, -3700114, 3383897, 2748779, -1259499, -1569274, -4884452, 1921461, 7067369, 1231582, -5185636, --2045478, -2930242, 1647120, -2272038, -1951526, -3454228, 4546760, 2595771, 3090766, 333934, --8266739, 3288871, -8402030, 641561, 1304596, 2952790, -4005057, -1916092, -1277216, 2709588, -4974646, 2266132, 2074469, 703838, -5935108, 18496276, 5288716, 5660767, -13650480, 10079215, --5499169, 9600326, -7650411, 12397423, -11404212, -9314173, 17064442, 2068564, 4316979, -10268730, --22884660, -2255395, 6605123, 1700270, 9728101, -8225936, 1202054, -188979, -17103634, -12362526, -5578089, -19327352, -12673375, 6054830, 19327, -20207822, -2939368, -10113574, 12764106, 7605314, -2253784, -4781909, -12665859, -26879516, 9387188, -12093554, 14601815, -4519380, -4960687, -2578591, --7169374, 3980361, 3778498, -21511344, -9512816, 20980378, 18373334, -19140522, 24677808, 1177895, -18154826, -4468377, -4435628, -2399813, -7253663, 9363029, -7150047, -20081120, -10675141, 23631984, --5382668, -4878009, -1395328, 7247758, 4641249, 11886322, -27341762, 7941932, 18496814, 14526116, --6049999, -1635846, -5957120, -12453795, 1315334, 11226508, 17513266, -10913512, -11028402, -12498355, --1345935, -2132451, 1065152, -6053220, 2988760, 2988224, -2189897, -980326, -2751464, -5523865, -5184026, 2684, 702764, -8330089, -7020661, -1955821, -9075266, -3606699, -4604205, 889595, --3292093, -102542, 6804839, -2916820, 2774012, -213138, -6558952, 1144609, -3364570, -960462, -2663417, 5938866, 744103, 2417530, 5549635, 5504538, 7354058, -2499671, -2148558, -1488206, -7541963, -1320703, -12496207, -835371, 12792023, 9925133, -9677098, -16480863, -13827647, -8127152, --16022912, -903554, 7566122, 17563196, -3054259, -852551, -29430190, 17607756, 21932250, -3493956, --11941620, -12138651, -7523172, 33014340, -20125144, -87510, -2384781, 8898635, -1490354, 38033548, -918049, -20727512, -5461051, -19699942, 25679072, 22316114, -18035104, 20990578, 5256503, 16892644, -6320581, -31787052, 9958419, 16971564, -22006338, -6129455, -24968792, -12502113, 863288, -23026394, --19625316, -588411, -15899432, -252866, 5592048, -5723044, -15768972, 12918188, 11743514, -25999048, --19842748, 10822781, 4585415, 6943352, 13172665, 17166984, -6320045, -9371619, -524523, -6087580, --317291, -1966021, -8698383, 3421478, -36034240, 12246026, 17550310, -18632642, -15303505, 11588896, --11712913, -10672457, -5049808, 6467147, 942208, 22331682, 199716, 13031468, -1255741, -9151502, -4885526, 6709813, 7035157, -5918465, 188442, 686658, -784368, -3812857, -8885750, 5857799, -9440338, -4849018, -15665893, 3968550, 1397475, 16616155, -1551020, -6540699, 5192616, 1823751, -8373576, -37581, -5025649, 95563, 6843494, 5033702, 1749125, -1815697, 1341640, -3122978, --2545842, -7843147, 3982509, 3717294, -5282273, 2560874, 2425583, 1410897, -836445, -2653753, -753767, -7519951, 8381092, 20337208, 37970196, 59759100, 2063195, -23768886, -30681098, -6992744, -1499481, -7121593, 29157460, 21923124, 15254650, 25366614, 18543522, 15028627, 1266479, 12157442, --15193447, 22003118, 25425132, 1958505, 26441966, -10526965, 2421825, 6318434, -24135568, -16163573, --5509906, -14272713, -16831976, -2288681, 27174794, -117575, -4904853, 3597035, 6034429, -3399467, --36175972, -4751308, 9829570, -5136781, -10879689, 4744328, 14398341, 25280178, 6474127, 13005698, -18020072, 22071300, -29844654, -20667382, 12162811, -8522289, 38661148, -3738769, 33287070, -26349624, -16044387, 27125940, 1335198, 4621922, 16443819, -28827284, -13193603, 1015760, 16930762, 727997, -19442244, 8013872, 7515656, 19743428, 7365332, -2321967, -7872675, -22759032, -4992900, 1600412, -6447283, 727997, 846645, 779537, -12208981, 6797323, 4728759, 11143830, -3397856, 8448738, -13726179, 8214662, 3736085, 222801, -1247151, 3088082, -4276177, 3006477, -4071092, 401579, -3109020, 2991982, -3558381, 6274411, 6177237, 7576859, 1174674, 846645, 3414499, -2357937, -5340255, -3454228, 5390184, 11813844, -1047435, -1954210, 1241246, 10305774, -5821292, 2626909, --846109, -1230508, -1553704, 1638530, 3123515, 4779225, 3787088, 3706557, 9659381, -6299107, -11395622, -5129265, 42939472, 14498736, 15281494, 31390842, -1972464, 6897181, 13842143, 20277614, --21904334, -17510582, -7263327, -19236084, -3115462, -25950730, 13815299, 21271900, 15625628, 21127480, --13714904, -7479686, 16402480, 12807592, -8479339, 21423296, 13003013, -4546223, -25515864, 14663555, -16023449, -12823162, -1654099, 7851200, 4020626, -20513300, 24297166, 6730214, 26058640, 14382772, -10387378, -13677323, 12308303, -7111929, 39556648, -30613990, 3672197, 12186433, -5597416, -19642496, -13027710, 12847321, -2181844, 12647605, -11704323, 32368484, -14576045, 8788577, 7227893, -19983946, --8562554, -27725088, 12195023, 8574902, -20635170, 19854024, 16924318, -14095546, 12203613, -1196685, -32729798, 10979010, -16019154, -11551315, -11406359, 10598906, -6554657, 9092446, -3933653, 2292976, -11092290, 7249368, 5634997, -10318659, 28132036, 3474629, -10645076, -15500537, 13679471, 7101729, -12916040, -6893960, 3898220, 10506027, 21238614, 5753646, -3325379, 17945984, -4599373, -4691715, --2355790, 2117419, 4861366, -10091563, -9088688, 4392141, -7849590, -4447439, 1092532, -3422015, --1018444, -952946, -7724499, 5846524, 3202972, -14695231, 3688840, -10882910, -6979322, -3189013, -5577015, 3361886, 10423349, 4958540, -295279, 3355443, 3830574, 4842039, 399432, 1655710, -2379412, 9250823, -2899640, -38056632, 16586627, -32500554, 33107218, 39826156, -2399813, 6757594, --32858648, -545998, -7544647, 3081639, 18680424, 19154480, -6010270, 9818295, 15489800, 2260227, -6354404, 4311074, 6272263, -4359929, 22712860, -3440269, 4970888, -13042742, 25601764, 5367636, --2657511, -1078037, 23030152, 8683887, 10761577, 25489558, -5940477, -16106664, 31367756, -33767568, --14682346, -6030671, 7259569, 22003654, 4996658, -9332427, -9542344, -16407849, -485868, -3156801, -6314676, 35414688, 34484292, 21799644, 31108984, -3034395, 46909096, -15891916, 13022878, -11333345, -1043140, 14628122, -7299834, 1587527, -14162118, -18351858, 272730, -11579769, 9583146, -15677704, -23200876, -17589502, -28144384, -11758547, -7228967, -2660195, 33847028, -20552492, -4713190, -2998961, --21246130, -5471252, 12385612, 26507464, -2332704, -1259499, 1046361, -8825621, -18243410, 644782, --771484, -2877628, -1869385, -91268, -10519986, 8404177, -8998493, 10405632, -4128001, -8139500, --8789651, 2085744, 8396124, -5967320, -7515119, -2757906, 6977711, 7581691, -5483063, 3517578, -4683125, 2652142, 4673998, -4465156, -3885335, 2067490, 533650, 4751308, -5869610, 4168266, -7767449, -411243, -2430952, -4028679, 6822019, -13728863, -6347425, 13431436, -8063801, -1015223, --2045478, 2553358, -8279087, 6023692, -2559801, 12380243, 10734734, 176631, -13336947, 58553288, -81298896, 24929600, 63377612, -13875429, -44066900, -30888332, -21584358, 10690710, 11662447, -14696304, --23663122, 20509006, 27597312, 16113107, 27533962, 21223044, 5252745, 8438000, 4169876, -1388885, --18097918, 7980586, -21447992, 15110769, 150324, -20100446, 23296976, 14068702, 11150272, 40200356, -24729348, -11551851, -7755101, -14499273, -17150878, -21036750, -8284455, 805306, -16613470, -5185100, -34751656, 52674016, 38830800, 5285494, 26502632, 28233504, 43215424, 19757386, -22894860, -37628744, --23444616, -24022826, 14200236, 11891691, -51395188, -35285840, -9073655, 21636434, 46774880, -35065724, --1384590, -30440580, -3948686, 38196756, -21044802, 14368813, -30529164, -5019206, -9123584, 25743498, --28618440, -16350940, 461709, 11341398, -23236846, 53303764, -12572443, -883153, 30324616, -13377749, -22793392, -7324530, -18853832, -14697378, 8842801, 816044, 7533910, 4670240, -16842178, 399969, --7130183, 20366734, 11926587, 3536906, 11125576, 12658342, 664109, -240518, -4095251, -12824235, -25995290, -8143258, 5401995, 118648, -15161771, 512175, 1582696, -4867809, -10001368, -2263985, --5910412, 1329292, 3786551, -4542465, 784368, 17635672, 12567611, -2412698, -2968359, 16693464, --7168301, -2268280, -14341970, -20610474, -7820599, -5559835, -2439005, -5774047, -23241142, -44906032, -5250061, 24711094, -20918638, 38393788, -15609522, 15161771, -5366562, -44740676, -23061826, -2325188, --26461830, -60330868, -17121350, 21553756, 33135672, -16447040, -26016764, -53841172, -16222628, 15705622, --10940355, -15701864, -26949846, 6198175, -6300717, -4654671, -5288179, 10722386, 21288006, -16905528, -16389595, 14095546, -17246442, -49119932, 3716757, 3859565, 12359842, 5808407, 31768800, 3140158, --49014168, 229244, -53951232, -335007, 18321256, 22379464, -4468377, 2897492, 24620364, -13113609, --9816685, -16872780, 15818901, 11680164, -8051453, 19179176, -6331319, 8043937, 8623757, 31438624, -3860102, -11231876, -34057480, -11663521, 17145510, 15138149, 26417270, 38963408, 67159864, 33571612, -15878494, -17626546, -68166496, -18624052, -10163503, 51803212, -9092983, 3191698, -612033, -16391743, -1830193, 15168751, 6853694, -388695, 332323, 254477, -324270, 25117506, -9503152, -7508140, --8775692, 17424146, 6236293, 8812736, -7308424, -21445846, 6612102, 9066676, -10226854, -1437740, -4984310, -1225139, 1184874, -3794604, -31321050, -10095321, -2971044, 14170171, 21678310, 2667712, --18961744, -17963700, 7713762, 3036542, -2224793, -3001645, 479426, -1853815, -1456531, 16542067, --18675054, 2378338, -16137803, 16565152, -9633075, 449361, -23008140, -3409667, 14515916, -4595615, -7541426, -12758200, 3543348, -43776992, -13377749, 30306362, -15038291, -12641162, -3306051, -9893994, --35098472, -39043936, -57045756, -18084496, 51003, -4508105, 37243272, 10164577, 48664664, 29956860, -15035070, -6908455, -18053358, -3461744, 68274408, 4135517, 19645718, 10991358, -8622684, 33931852, --14247480, 27365920, -30048128, -3096135, -21664352, 25744570, -36471788, -7789997, 11094974, 11355357, -11656004, -31958852, 22622666, -36563056, 7369627, -17974976, -12261058, 36145372, 2113661, 2262374, -12453795, -13888850, -839129, 9354976, -44255880, 1068910, 10176388, -6560026, 28469190, -12876849, --5596343, 47800840, -18176838, -40007620, 83215, -15192373, 3209414, -3151432, -2114735, -32141388, -17096118, -5347235, -43671764, 26142930, -54083840, 10362145, -12407624, -21548924, -34190624, -4547834, -9238475, 15581068, 1387274, 12588012, 15761456, -18807662, 32934346, -7769059, 8797704, -588947, -15715285, -867583, -1785096, -5506685, 9290014, -19840064, -2550137, 6287296, 4250944, -7809861, --135828, -8725226, -11410654, 5709086, 4657355, 8506720, 5542656, -2650532, 6682432, 19424526, --9703405, -10358924, 3403762, -1124208, 3821447, 14360760, -2092723, 7747584, 7386270, 7335804, --9882720, -12000675, -2943663, -1126355, -12414066, -882616, -2474975, 5066988, -13559749, 3879429, --18924700, -66735200, -68579352, -58546308, -29519310, 120998896, 37888056, -15138686, -15801185, -59913720, --126835216, -14335527, 34027416, 42469712, 18218714, -19573240, -14664092, -37444060, -41227392, 30874372, --29726006, 76229224, 57132192, -89101248, 28690918, 11587285, -18758806, 6805376, 63791540, 9029632, -43967580, 87352656, -19175418, -71963248, 3234647, -12386686, -67085780, -18399104, 32200444, -3093987, -39667244, 64164128, 5596343, -55910812, -109313896, -93885304, -83936544, -8967355, 81027776, 22978612, -21504364, 12040404, -22231288, -109589312, -68625528, -35221416, -13508746, 6541235, 24562382, 23851028, -30692910, 31455804, 39150776, -47317116, -17146584, -38776576, -3451006, -42396696, 26091926, 26068840, -53616224, 59569584, 28363428, 746787, -16098611, -11184095, -73804720, -58764816, 51298552, 80371720, -54670640, 64195804, -15650861, -28877750, -58440548, -33304788, 17036524, 8590, 3807489, 17969606, -5898064, 4449049, -14299557, -18851686, -9447854, -14267344, 345745, 14082124, 3854196, 5390721, --3413425, 8171712, -15578920, 10214506, -4769561, -14428943, -14212047, -4359392, -23524610, -7304129, --14440217, 14703821, 16574816, 7981123, 6327024, -15337328, -31370978, -31025234, 8084202, -3015604, -13921600, 12253005, 6466074, -22636626, -11580306, -21558052, -33183992, 9820980, 22939420, -8871255, --121768232, -136324944, -92743376, -95395520, -25590488, 106556528, 71724880, 114979496, 128088272, 194632880, -129216240, 133721656, 86231136, -6813429, -96453152, -166669424, -196809360, -170889776, -134812576, -97623000, --23740432, -5173825, -14254996, 4721243, 42157252, 69490424, 96552472, 83866752, 114467320, 110504136, -142940272, 130662032, 36607616, 87620552, -19233938, 23784456, 17546552, 4716948, -12320651, -127836480, --153313696, -196057744, -229834976, -209082768, -116224496, -103421736, -85016728, -106574248, -123169464, -26641146, -29941290, 76948632, 113022600, 163536784, 195575088, 250975872, 331434560, 321683392, 244395984, 198096784, -164973456, 87024624, 138521280, -56552908, -113223392, -270952320, -310038112, -385605376, -370272896, -338864864, --320932832, -310228704, -190948336, -118580824, -64470680, 172683984, 176159696, 269123200, 346027808, 299740928, -270986144, 273855712, 215344288, 163902928, 90142776, 11492259, -1463510, -51218560, -61929132, -90070296, --116286776, -160002560, -172614192, -157502896, -181144544, -140391200, -128580584, -121756952, -106627392, -55441584, --10983305, 56186224, 116709296, 109102368, 170671264, 188196336, 208002048, 245097680, 198619696, 115471272, -57822608, -35779224, -90550256, -91090888, -175111184, -162739536, -222120144, -177416512, -184124176, -118828320, --123693448, -72920488, -9342091, 61786324, 93720480, 164700192, 192387696, 186087504, 181366800, 176068960, -135773584, 47742320, -31244814, -45542760, -58606440, -65387656, -73498704, -87575992, -80851688, -60436096, --64958696, -59369868, -51081120, -37298568, -16554415, -11860552, -8407935, 1801202, 10766409, 6766721, -10054518, 25705916, 30918932, 27554362, 18340584, 12511240, 9405442, 9110163, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ -13406740, -1573569, -5842766, 2067490, -3676492, 1025423, -2377801, -1482301, -3195456, 2348273, 4016868, -1200443, 1285269, -7240241, 1482301, 179315, 2319282, 2834142, 1577327, 4240744, -833224, --2290291, 493384, 5058398, 82678, -3781182, -334471, 4315369, 2367064, 513785, 93952, -1254667, -56371, 381178, 877784, -79457, -1468342, -123480, 91268, 1730335, -2441689, --5812702, 4386772, 4384088, 3836480, 3599720, -127238, 1990717, 3438658, -3501472, -744640, --34897, -4678830, 1128503, 405874, 4346507, 503585, 2462627, 132070, 5450851, 2798171, --730144, 3849365, 2350958, -1167694, -4343823, 1163936, 1209033, -1100585, 389768, -2437931, --594853, 2316061, 1629940, 1935957, 4505958, -673236, -1341640, 672699, 2704219, 6169721, --3528853, 1693828, 1710471, 1845225, -123480, -343061, 1946157, -985158, 111132, 962610, --1089311, -130460, 233002, 388695, -690416, -1063541, 773094, -207769, 199716, -344671, -1175747, -71404, 1387811, -246424, 11334419, -7558606, 2563022, 6385543, 1499481, 4504347, -5449777, -4932770, 1046898, -439160, 2124935, -6256694, -4970351, -914291, 4881767, 6622303, --2527052, -2173790, 3173444, -5350456, -7170985, -1309428, -8434779, 2905546, 2803540, 780610, --5240397, -5318244, 1898912, -3088618, 722628, -140660, 5561983, 5887864, 5302137, -845035, -3715147, -5791764, 2527588, -3408057, -316217, 325344, 4536023, -4881231, -4353486, 51003, -5966247, 2478733, 2328409, -3597035, 2018098, 1497333, -1764158, -7442105, -1214939, -2512556, --3283503, -2932926, 3414499, -3120831, -1021665, 796180, 2116882, 5376226, -2061584, -107374, --4050154, -1938104, 828392, -5578626, -356482, 1550483, 3820374, -1194538, -2914135, -1444720, --5841156, 2783676, 1698123, 362388, -487479, -5013838, 2061584, 442919, -1808718, 1859184, --731218, 473520, 1656784, 193274, 331786, 1972464, 852014, 431107, 36507, 1588601, -558883, -263067, 627065, 945430, -4001836, -7248831, -1810329, 1243393, -2238752, -3671123, --2036888, -7226283, -4072166, 7630010, -311385, -3388729, 4042638, -6120329, -1406602, -7632694, --1591285, -6016176, -3149285, 7056632, 364535, -1443646, -7974144, -4975720, -1804423, -3420405, -1342177, -4248797, 409096, 2632815, 8441221, 4137664, 3162170, 3652333, 6832219, -5751498, --73014, -1726577, -4435628, 1823751, -911607, -1729798, -4642323, 2413772, 4868883, 507343, --3545496, -2272038, 12472048, 50466, -3590056, -4996121, -7486128, -9972377, -1248762, -5171678, -1193464, -1014149, 2782065, 517007, 1343788, -4582730, 681826, 748398, 6034429, 2039573, --4519380, 252866, -1407676, -1342177, -1079647, 2157684, 3234647, 3169686, -2960306, -2880849, -1814624, 862215, 1186485, 1305670, -1152662, -4422743, -5194763, -614180, 935766, -1239635, -539555, 35970, -705985, -1095217, -1628866, -632434, -313533, -978179, -1809792, 153545, -588947, -978716, 343061, -861141, 170188, -1077500, -540629, 212601, 282931, -1298691, -192737, -494458, -2334852, 242129, -821413, 1311039, -17431662, 6905234, -3114925, 2921115, --7211787, -2900714, -5645735, -5162014, 354872, -1621887, -3536369, 8887361, 2305861, -818191, --5383742, -1698123, 2501819, -6164889, -3263638, -5871221, -3267396, 8494908, 830539, 5666136, --537945, -52076, -1422171, 1609539, 1572495, -4498978, 59593, 1353452, 2543158, 9216463, --4811974, -5579163, -1100585, 10193568, 3211025, 10848014, 963683, 1001264, -1912334, 5359046, --925565, 7900056, -797790, -918049, -1414655, -3285650, 3362960, 1019518, -2812130, 2296734, -2981781, 5484137, -3162707, -277562, -976568, 4883915, -1988570, -824097, -1830730, -1250909, -1184337, -1600949, 576599, 823560, -1184337, 1207423, -8081518, 773631, 5267778, 1843078, -7052337, 569620, 758599, 1693828, 4497905, 7182796, -4741644, 687195, -362388, 1693828, --212601, -182536, 2166274, 4655745, 1806034, 2282238, 265214, -812823, -1198833, 628139, -2376728, -831613, 1089311, 1074816, 1134408, -48855, 500901, 1976759, -328565, 517007, --56371, 2281165, 1352378, -746251, -113817, 2454037, 1280437, -744103, 1829656, 999117, --3731790, -1841467, -79457, -8618926, -1440425, 81068, -4290136, -15254113, -3699041, -3289408, --6647536, -1297080, -1709934, 9552544, -3314104, 7224672, 3383897, 5211406, -9808632, -4406637, --9911711, -9207873, -8053, 1733556, 5765994, -2780455, -4333622, -2663417, -6703907, 1435056, -3049427, 3510062, 2159832, -2030983, 2495913, -4471598, 480499, -8066486, 2910914, -2079301, -1102196, 1779190, 3011309, 3218004, -3085934, 122943, 7810935, -4186519, 3783866, 3976603, --263604, 2382096, 3840238, -1584843, 1509681, 3789235, 202937, 6680822, -3503083, -4621922, --2243047, 2185602, -24696, -8877697, -4511327, -9836012, -10714870, -1823214, 2890513, -8725763, -3884261, -1416266, -161598, -2987150, 2916283, -5191005, -838592, -1813550, -7335804, -6459094, --2148558, 3837553, 115427, 3291019, -1393180, 2130304, 1695438, -4054449, 13959, -803159, -2284923, -2733210, -4583804, -1495186, 613643, -3221, -1770600, 779000, -1102196, -415538, -719944, -243203, 41876, -93952, -1049046, -227096, -1018444, -675384, -661425, -23085, -462246, 55835, 1291711, 500364, -638876, 4925254, -14198088, -684510, 4411469, 2784213, --7536057, -917512, -4795331, 1234266, 1439888, 1030792, -8230768, -11017665, -7510824, 1290638, --6004365, 6572374, 2079301, -10608032, 7665443, 6723235, 5317707, 4765266, -5273146, 8643085, -2281165, -61740, -3363496, 2923262, 5177046, -4741107, -6968585, 2582886, -2629594, -8630737, --1153736, -8327942, -3038689, 15098421, -4027069, -6776385, -8412767, 477278, 1374926, 6012418, -2391223, -5518496, 5027796, -633508, -4342749, -5737540, -6104223, 9308268, 4160213, 5869610, --4430796, -6054294, 2736968, 1514513, -6242735, -306016, -3828427, 6021544, -1160715, 545998, --7377143, 4720169, 3941706, -4185983, -2702608, -2594160, 8347806, 110059, 1224066, -2402497, -5719823, -5834176, -9940702, -4425427, 858993, -1894618, 5411659, -1103807, -629750, -5784784, --3064459, 2518462, 324807, -4114579, -2701535, 3528316, 1889786, -1110249, 143881, 60666, --10737, -1127429, 1516124, 686121, 2362769, 385473, 399432, 91805, 1014686, -478352, -1470489, -1941325, 2020245, -7623567, -335007, 1877438, -1915019, -6095096, -9043591, -7246684, -7286949, 843961, 8934069, 10668162, 10357851, 1566589, 14219563, 3410204, -1585380, 6575595, -5017059, 13143137, 1890323, 7556458, -10378788, 17075180, 12559021, 6072547, -5187784, -4110284, -6165426, 1425392, 4422206, -2537252, 7360500, -2196876, -1915555, 6627672, 5377836, -6739878, -4538170, -1799054, 7168838, 7797513, -15286862, -2811593, 9421548, 2849711, 5130339, 4049617, -9329206, -4497368, 3743064, 186294, -7854422, -3818226, -214748, 1651415, -11533061, -962073, -7297150, -5746666, 12248173, 9196062, -3696893, -88584, 2351495, 4614943, 7153268, -2747169, --2305861, 11609297, -2733747, -214212, 5047661, 263067, 6782827, 5424007, 2234994, 3758097, -3912715, 3754338, 1731409, 1613297, -1607928, -2674691, -1130650, -2433099, -285615, -1689533, -1289564, 1191317, -2450279, -1907502, -287226, 1903744, 3794604, 3199751, 1800128, 397284, -1889249, -3223910, -1467268, -1713155, 729608, -1229971, 1695438, -3751654, 419296, -24159, -3278134, 1351841, 168041, 611496, 3397856, 1086090, -2921115, 1016834, -264141, 840740, -29695940, -15530602, 2165201, 12246562, -1177358, 445066, 16207059, 17772038, 2109903, -1348083, -3738232, -846109, 4015795, 5114769, -6495065, -1979443, 10490458, 9276592, -4329864, -8431021, --9033390, -9356049, -5064304, 7808251, -6001680, 3435437, 412854, -10933376, -744640, -7259032, --883690, 3162707, 4796405, -14181982, -6687264, -11286100, -3526168, 17164836, 2455648, -1517197, -1507534, -1524713, 829466, 5092758, 2952790, 8588861, -477815, 6427956, 3789772, -5931350, -3764539, -9043054, 236760, -9082245, -9529996, 3633542, -10484015, 4442070, -143881, 5370857, -4216584, 3886409, -5609228, 6555731, -9512279, -153008, -4396436, -1432909, 11887933, 474057, -5937256, 5956583, -1238024, -2213519, 4580046, -9796820, 3917547, 9425843, -13987098, -10203769, --2876018, 7143605, -684510, -8521215, 3211025, -1191317, 3651259, -3097208, 1100585, -1731409, -6129992, -1083406, 5633924, 3201361, 5258651, 1903207, 1436130, -2709051, 3550327, 1670742, --154082, 2182380, 1781875, -948114, 2638721, 2181307, -1335198, -1315871, -4598836, -861141, --2641405, 1074, -149787, -1449552, 2312303, -705448, 1340567, 602369, 4728222, -3662533, --17729088, 3300146, 4282620, -11975443, 5409512, -78920, 12553116, -3311957, -6386617, 5315559, --15519864, -5334887, 13084081, 5745056, -7971460, -19160922, 8525510, -2662343, 4678293, -12222403, --16215649, -10991895, 14011257, 1155883, 7723425, -1340567, -7439420, -11011222, 5183489, -2930778, --9605157, -11203422, 795643, -9999221, -7713762, -4190278, -1997697, -10833518, 6056978, 7261179, -9787694, -4679904, 8697309, -7009924, 13775034, -2554432, -757525, 10522670, 5387500, -2591476, --7088307, -3528316, 10126996, 2359011, -7563975, 3617436, 10758356, 10204842, 4359929, -12444668, --13778792, -1218160, 2651606, 868657, -9925133, 2981244, 10908143, 3178276, -4680978, -17605070, -4687957, -7652021, -17207786, 550830, 896574, -9698036, 13946833, -996432, -5767068, -19035832, --139050, -5593121, -906238, 7165079, -4286378, -7271917, -510027, 1653026, 1705639, -5762773, --5876052, -5801427, 2126546, -5006322, 296890, -893890, 801011, -1384053, 1388885, 2571612, -2257542, 2937758, 1430761, 5272073, 6671695, 388158, 1950452, 1239098, -2625836, -717260, --2143189, 830002, 715649, 404801, -6515466, 778463, -570157, -2359548, -328028, -2120103, -1941325, -2593624, -2750927, -21936008, 13775034, 10627360, 11699491, 1673427, 12364674, 1270774, --7902203, -9142375, 1404991, 9928354, -6815040, 2328409, -14769856, 10174241, 10790032, -5390721, --3025268, 2520609, 11815455, 8632884, -6054294, -5402532, 8093866, -9629317, 3387119, -13178033, -27917, -3849365, -17680770, -18233210, 3602941, 10622528, 4949950, -15553150, -8367670, 12021077, --13181255, -5415417, 10674604, -2777770, 13331042, -4578972, -9199283, 3580392, -13406740, 15607374, --1580548, 2843268, -7194607, -3592203, -559420, -14459544, -8818105, 1267552, -2289218, 1551020, --4636954, -15349676, 2988224, -12691091, 5794985, -3123515, 9322227, -15316390, 7029251, 2739116, --4297115, 11592654, -1357747, -7796977, -15055471, -1940788, 3426310, -12122545, 9127342, -8158827, -5956046, -15993921, -16364362, 7926899, 6332930, -6482717, -5091147, 5326297, 3653407, -3403762, --2848100, -4337380, -5628555, -431107, -9099962, -880468, -1255204, 779537, 2612951, -1610076, -2640868, -1679869, -506806, -4873178, -2399813, -1259499, -586263, 7413651, -2117419, -940061, -4285841, -4489315, 3221762, 1915555, -1726577, -1022202, -4559645, -4175245, -145492, -2405182, --2910914, 7178501, -6950331, 2396055, 8545911, 12598750, -3302830, 1407139, -4442070, -16798690, --3562139, -3591130, 7332046, -14758044, -11811, -8513699, 9195525, -10325638, -14047764, 9367324, -4338454, 6091874, 19435264, -3201361, -5521181, 5468030, -12381317, -14496588, 1238561, 18554796, -5692979, 10412074, -7357279, -9122511, -14708116, 2937758, 18900004, -8460012, 9906342, 2249489, -14711337, -22437446, -7069516, -394063, 2694555, 12750684, 6222871, -17108466, -4563403, -7953206, --610959, -19698868, -3024731, -7108171, 1430224, -10382547, -615254, 2374580, -28646894, 3260954, --8928700, 1731409, -11289858, -653372, 7144678, 3572876, -3783866, -3677029, -15061913, 15188615, -14718853, 4785668, 3737695, -13183939, 20155744, 6945499, 10436771, -3994320, -31489090, 12266427, --984084, 23649700, 22359600, 6974490, -2756295, 9758703, 624381, 8538932, 570694, 933619, --5478768, 2622078, -4992900, -2782065, -1307818, 10276246, -28991, 568546, 2774549, -712428, --5454609, -2928094, 1077500, 4130148, -1844152, 2025077, -3142842, 4298189, -3291556, -5331128, --2543695, -826244, 2602213, 887448, -987306, -984621, -1010391, 6748468, -1340030, 322123, -1280437, 3328063, 27215060, 9607842, 18631568, -18045306, 4216048, 18997714, -5686537, -6822019, -2700998, -11718818, 8979703, 2289218, -13689671, -17930414, -1330903, 15242302, -376347, -1207960, -9978283, -14854144, -3772055, -12224551, 6894497, -20845624, 361314, -4442070, 7605850, -21772262, --15038291, -9503152, 6403796, 7031935, 4871567, -7049652, 5312338, -5239860, 6477885, -4294968, --1891933, -1481227, -6102612, 4165045, 9660455, 5761162, 9724880, -780073, -9401147, 1361505, --9360881, 25001542, -6298033, -24554864, -7639673, 6736656, 21361556, -21344914, -8792872, -1372779, -13741211, 898722, -30218854, -3692598, 13969381, 28837484, 1083406, 20082194, 28919626, -2130841, -9320079, 13677323, -3764539, 24652576, -3294777, 29766270, 4752918, -8152385, -25782152, -16138876, -207769, 7779797, 3721589, -3905736, -4998268, -7995619, -10926934, -9702868, 11847667, 3482145, --129386, -16940962, -1902134, 645319, -3082176, -9625022, 2531346, 5127654, -1447404, -4977867, --3634079, -9429601, -5694053, -2757369, 5966247, -1145683, -5133560, 5178657, -7380902, 5337034, -5377299, -4610111, -8949101, 8210367, 12175159, 1884954, 382789, 762357, 7097434, -2091649, --8464844, 1022202, 8223789, 6829535, -8405788, -7119982, 1318018, 1372779, 127238, 2457795, --1310502, 11460583, 13868449, -23730768, -23086522, 6149857, -5368709, 760746, -9174050, 21599928, --9664750, -6162741, 7518877, 5435281, 230854, -9828496, -7195681, -11967389, 4859756, -660351, --5781563, -922344, 14365055, 21573620, -23269596, -1451699, -22699440, -2384781, -5850819, 22560926, --9488656, -9053791, -4353486, 13744969, 4575214, 3819300, 5771363, 5522791, -4045859, 307627, --2925410, 3698504, -2665027, 21124260, -5468567, 5635534, 14872398, -7693360, -17015586, 3831648, -5833640, -5954436, -6509023, -1384053, 3531537, 10737418, -14570140, 19605988, 28798830, 19372450, --8048232, -11599096, -26612154, -34333432, -12620225, -86973, -6191732, -1697586, -3887482, 8265128, --686121, -13231720, 6999723, -5833103, -1238561, 12663711, 21068962, -5102958, 5939940, -3652870, -1178969, 19208704, 9703942, 16436840, 16705275, -13277355, -4075924, -3000035, 499290, -250719, -5962489, 466541, 3664681, 16858820, 724776, 7909719, -3535832, -3626026, -6856379, -2048699, -1003949, 7718593, -2099165, -6300180, -2969970, 3754875, -2619930, -1353989, -1947231, 2403034, -632434, -2392834, -1308354, 1800665, 877247, 964757, 9716290, -3877819, 266825, 1350767, -167504, -5248987, 2472828, 3119220, 6215355, -12217571, 23172960, 10440529, 13198435, 19793894, -30566746, -11698954, 15834471, -31405338, -3834332, -14070313, -30856118, 12535936, 7353521, 9440875, -4169340, 12278238, 3775276, -22202296, 18762028, 33108830, -4911295, -5291400, 8138963, 3316252, --6871411, -29460792, 2454574, 132070, -2643016, 425739, 10071698, -21056078, 4603131, 6013491, --4298189, -12135430, -5890011, -13528610, 13840532, -30248918, -4351339, -19448148, 10852845, 4399121, -11005317, -3831648, 3025268, -7719667, 18566070, 5598490, 15248208, -13817447, 14988899, -319438, --14598594, 30254824, -4971962, 3721589, 20459614, -19603842, 22928682, 13697188, -17900350, 7587060, --6818798, 10075993, -24813636, 18183280, 2616172, 6399502, -2291365, 5898601, -20142322, 12866648, -22961432, -45521820, 4696010, 43935904, -28326920, -9093520, 3144990, 21422224, 15227270, 5293547, -13310104, -5976984, 8043937, -3320010, -9670656, 4817880, -2128156, -1622961, 8304856, 11994770, --982474, -4649839, -3951907, 3556233, 7690676, -10133438, -3754875, -6932077, -4272419, -9060770, -9118752, 11989938, -2479807, 5524402, -3361886, 2248952, 7675107, 8616778, -9864466, 852014, -3721589, -5195837, 7932268, 415538, -106300, 7148973, 3702262, -8575439, -7130183, 2451353, -1198833, -2582349, 1517734, 18386754, -11215233, -13495324, -479963, -12923557, -5901822, -34055332, --29070486, -4070019, -16698296, -20047296, -14463302, 8805220, -5180805, -10186589, -16292422, 14931991, -963146, -24616068, -3914326, -215822, -11722039, -3752728, 9921374, 7080254, -1765232, 9664, -428423, -6242198, 5200669, 11375221, -4330938, -2818572, 17558900, -33135136, -5416491, 9215389, -35210680, -14680735, -9172440, -13236552, -17912162, 7710540, 37369436, 6854231, 23139136, 4691715, --3829500, -2047626, -2791729, -18138720, 3932580, 3988414, -14711874, 3159485, 29189672, -4835060, --9028021, 4800700, -10506027, -2505040, 25750476, 37993280, 10266046, 22768158, 26418344, -9481677, --11049877, 2909840, -8743480, 1399623, -26154204, -337692, -20381230, 6090264, 4245575, 12306692, --21214990, -8034810, -7239168, -8420283, -6644852, -7548942, 11811160, 2433636, 15225659, -3979824, -5806259, 15107547, -2793339, 423054, -2203318, -6161131, -4854387, -945967, -3665218, -5675263, --86973, 2184528, -2865817, 905164, 7122130, -7253126, -6476811, 367220, 5346161, 2643552, --3409667, -10690174, -10261751, -1384053, 2433636, -6394133, -3471407, 2091649, -2103460, 983011, -779537, 7101729, 2457258, 1712081, -7885560, 8640400, -3651796, 27110370, 30617748, -12203613, -69198904, -9444096, 1641751, -12735652, 8199630, -5354214, 8093329, 17814988, 5090610, -16503949, --8936216, -17246978, -229244, -11690901, -21378736, 2936147, 13967234, -2291365, 4105989, 6663105, -8214662, -63351, -6127308, -8016557, 4163971, 11274, -10630044, 4260071, 29779692, 21074330, -11999602, -25139518, 18156974, 14218489, -6591164, -7623030, -7656853, -10013179, -4285304, 8241506, --18195092, 1818382, 2327336, 11025718, 28388660, 5548024, 5925981, 1618129, -3339874, -5655935, -12340515, -7371775, 28665148, 9285719, -2716030, 12615930, 2432025, -19202798, -13824426, 16352014, -18804978, 7056632, -4643397, 12560632, 13465796, 19206020, 37402184, 4102768, -10691247, -19108846, --12781286, 9804337, 2158758, 3245922, -1729261, 13244069, 1443109, -1489817, -17387102, -8481487, -18205830, 20481088, -7210713, -13721884, -16478179, -4669167, 8917426, 5705864, 1682554, -5465883, -1487669, 125091, -7267622, 203474, -16111496, -4064113, -564788, 11742977, -2036351, -3364570, -141197, 9557913, -5579163, 6896107, -3446175, -7432441, 6630356, 9456981, 6044630, 6740415, --783832, 7208566, 13413720, 5997922, 5766531, 4000225, -4862440, -2051384, 437013, -1008780, -4080756, -3578245, 6621229, 8645769, 5072357, 809064, -6356552, 2727841, 2414309, 7021198, -11217918, -10737955, 49445812, -7349226, 2102387, 5483600, -3728569, -684510, 12404939, -9190156, --10865194, -5701569, 16008417, 14295262, -38200512, 7379291, 6563784, 15643345, -9745281, -15073188, --14333380, 10945187, 9933722, -15400142, -8374650, -6315213, 25776246, 12955769, 7291244, -4974109, --26574574, 7565048, 6782290, 13752485, -3221226, 7317014, -7306276, 2614025, -23056996, 9629854, -9563818, 355945, -5638755, -14500883, -28682866, 18685792, -12016245, 9615895, 9965398, 16510391, -2423435, -17526688, 29325500, 5734855, -28408524, -13225278, 17221208, 4079145, 22507240, 9473087, -3840775, -20329154, -9895605, 11368778, -35219804, 38115688, -27044872, 1552094, 23038742, -6135361, -45507324, 6803765, 8404714, -16412144, 52993992, 5514738, 34550864, -23315230, -10232760, -7332046, -13617731, -1414655, -5132486, 23966454, -19568408, 23115514, -27189828, 5928129, 3052648, 5028333, --5043366, 20381230, -2168959, 10402948, 9433359, 13547401, 7978976, 3999152, 9765145, 10588168, -676457, 3916473, 1482301, -7093676, 9364102, 320512, 6541235, 12812424, 6727530, 863288, --321049, 9822053, 10841571, 5306969, -5655398, 21442088, -637266, -4236985, -3839701, 13778255, --10100152, 4813585, -1975148, 7423851, 792421, 3103114, 4382478, -2894808, -2018098, 2127620, -4427575, 3581466, 4617090, 5541582, -6131603, 17343614, 40761924, 13534516, 25595858, 32631014, --1403917, 37420440, -28841242, -10326175, -10865194, -9532143, 3991635, 6116034, -2487323, -12730820, --24819006, 23802708, 22434762, 9539659, 20257214, -33226940, -28815472, 9720585, 13707388, -15348603, --21624624, 13812078, -6857989, -30959734, -11447698, -5876052, 15263777, -28458454, 15697569, 10735271, -12418898, -13292924, -874563, -13145284, -5871221, -37906844, -9333501, 18434536, -60224032, -19013284, --2397666, -1303523, 1984812, -36131948, -9102109, -54437100, -4643397, 10815801, -15620259, -16996796, --7161321, 16443282, -5649493, -19590956, -22517976, -56792352, -20389820, 26667452, -25283398, -38203196, -31911070, -9999221, -43147780, 13074417, 38723964, -20712480, -9558450, 4769025, -28352152, 35072704, -15388868, 22478248, -11876658, -2411087, 11356967, 33413234, 15373299, 5332739, -10844792, -2250026, -37660420, 3762391, 5717675, -2697240, -22484154, -9817758, 17577690, -304406, 922344, -3522410, --20121922, -1416266, 8407935, -12256226, 14445586, -18951006, -12449500, 4030290, -6918656, 10014253, -3779034, -17223356, 6880538, 8834211, 4438849, 3438658, -7293928, 4288525, -434329, -4094715, --12568148, 6267968, 4723927, -1276142, 8996346, -13481902, 1242856, -12894566, 49392, 3642132, --4937602, -2078227, -979253, 5354214, 418759, 47595752, 65606164, -9679246, -1520955, -24999930, --25162602, -43725988, 19250044, -7008313, 65527244, -13229036, -27649926, -38662220, 2746095, 12682502, --14006962, 12775917, 42996380, -16363825, -7122130, -29214368, -13060996, 29255706, 33626372, -32937030, --9030169, 17586818, -6782290, 8038568, -9550934, 42239928, 33913060, 71675488, 23630910, 31957778, --13597866, 23045720, 48566416, 16084653, -2659659, 11688753, -1212791, 31845036, 16827682, 46229416, -13306882, -45714020, 16625818, 18287434, 38440496, -20827370, -17713518, 22501334, 24299852, -10919417, -38636452, -12903692, 16079284, -41548440, 26998702, -9371619, 14985678, 15454903, 33921116, 29543470, --22709640, -23616952, -7361037, 35653596, 35930624, -12887586, -19331648, -37341520, -3917547, 27187680, -30626338, 20667920, -8454106, -24517820, -23310934, -3517041, 16843252, -15810311, 23331336, 6269042, -16401943, 3460133, -7821136, 18816788, 11847130, -2103460, -7388955, 6346351, 15801722, -21746494, -9357123, 11872900, 15397995, 8927090, 21628918, -6359773, 7823820, -9302899, -14316200, 9143985, -18240726, 16476031, 24380918, 463856, -49392, 7950522, 6659884, 43728672, 8489540, -1100585, --18580028, 826781, 27710592, 14714558, 21438866, 13114146, -439160, 1119913, -4620848, 562104, -26593900, 22705882, 2400887, 8956617, -2604898, -3611531, 1012539, 11918534, 8495982, 8160975, --5734855, -4853850, 6363531, 1636919, -15897285, -52763136, 3762928, 81046568, 48425220, -11223286, --118620016, -16892106, -12009802, 9363029, -13470091, 2331094, 12406550, -4447976, 5369246, -25729538, -16510928, 19931870, 36696200, -26423712, -33491082, 34765612, 54913304, 13943074, -24392730, -32399622, --6979322, 8275865, 3077344, 8790187, 208843, 12194486, 4867809, 35955856, -11449846, -49115100, --21335250, 15945603, 5792301, -16909824, -21549998, 2983929, 23213762, 41351408, 37831684, -690416, -629213, 15643345, -14635101, -42359652, 12904229, -26373784, 51005956, 56084220, -1144072, 15940771, -7989713, 11304354, -24751896, -3409130, 53179212, -19883552, 473520, -72110888, -9622337, 8348880, -16698833, 15917149, 14942728, -17707614, -11274289, 32913946, 47877076, -8254927, -2097555, 4859756, -19259170, 23591718, -10897406, 8086887, -26103738, -30554398, 3120831, 8680129, 11366094, -3518652, --4853313, -5583995, -6662568, 21282100, -162672, -3685082, -11108396, -616328, 12951474, 12050068, --6350109, 16387985, 3643743, 24797530, 1972464, 4619774, 756451, -8329552, -7407745, -4021700, --5776194, -1375463, -7457674, -4861366, 1807644, 20692616, 23000086, 7159174, 11908334, 4820564, -4107599, 20248086, -14483167, 15450608, 5357435, 25141664, -6761889, 6800007, 4460324, -9771051, -7753490, -4480188, 7911330, -2489471, 13583908, -4511863, -8684961, 7127498, 2840584, 3651259, -5258114, 3753265, 9573482, 2208687, 3465502, 2101313, 3238942, 3721052, 2735357, 6669011, -4394826, 1012002, 645856, 1705102, 5940477, 4809827, 4429185, 5477694, -6285685, -53438520, --22168474, 42549168, 46921980, 44537736, 60453276, 10289131, -26148834, -80000208, -60723860, -11544335, -16848082, 50502372, 55006184, 25916906, 1159641, -26953604, -23276576, -10444824, 17138530, 47114180, -26793616, -6383932, 1670742, -4011500, -25999048, -35676144, -29110214, 5283347, 43481176, 32517198, -65407520, 42381664, 42112156, 59117004, -17303350, -41166724, -46642272, -62105764, -76261976, -28982976, --9013526, 22431004, 41960756, 60401200, 56638272, 45806364, 29117194, 58001924, -11399917, -37063420, --1733556, -9630927, 15408195, 17362942, 69524784, 60442000, -22573274, 10616085, -15806553, -46768436, --13708462, 12054899, -27972586, 42913704, -17289928, 14060649, 3697967, -5240934, 37404332, 51622284, -41442140, 28819230, -21559126, -52861920, -59757492, 16726750, -25179246, 4257387, -2852932, 33392834, -5299453, 18740016, -16101296, -37175628, -34133716, -53997404, -46603616, 19435264, 11180337, 26633630, -40685688, 31258772, 1242319, -24336358, -38580080, -52765820, -28628104, -13780403, -19250044, 8237211, --6980396, -6493454, -6185290, -16325171, 168577, -7490423, -10548977, -13060459, -8020852, -2130304, -8383776, -15719580, -9545565, 22308060, 2232846, -119464512, -125736776, -130787120, -134055592, -177140560, --19223200, -50107236, -12120398, 16551193, 80706192, 91716880, 94836632, 132741872, 183504624, 175827904, -172805856, 138838576, 100291248, 72878080, 21925808, -83719112, -40156332, -49458696, -30610768, -100545184, --16660178, -41609644, -45818712, -83195664, -63918776, -65040300, -58906012, -61546344, -108156400, -95783680, --56499756, -51095080, -64177548, -88938576, -13483513, -77876880, -147614272, -126491616, -111038328, -58529668, --75420160, -13453448, -152784864, -67647880, -67648960, -31255550, -22764400, -78668768, 3539590, -78816944, --9468255, 12314208, 37006512, 3340411, 38034084, 56727928, 89203784, 95056216, 130791416, 85453744, -205208704, 129667208, 238850640, 162376064, 237952464, 275961856, 327714592, 269165056, 271026944, 305413504, -274085472, 278319776, 270913120, 234870288, 135953424, 108615968, 76703288, 55919400, 65488588, 97633736, -53890028, -19767050, -33867964, -39142184, -67223216, -87312928, -106416944, -98044440, -161110672, -156117232, --160748816, -194795552, -171485152, -216383680, -191542656, -224826512, -230847520, -217517552, -239963584, -217045632, --242307024, -192364608, -188419680, -156209568, -166662992, -171856144, -120736360, -108163384, -82571280, -42059004, -14302241, 46119896, 40519260, 51621748, 46302968, 52185464, 60047400, 85623392, 102984728, 93013960, -83799640, 102304512, 95332168, 117667608, 107268952, 78353624, 71478992, 62064424, 54842976, 34498788, -26384520, 24437290, 15589658, 16940962, 6990596, 11067594, 9880572, 6725382, 9915469, 7137162, -4484483, 1649804, -3459596, -496606, 87510, -10295573, -16087337, -9226127, -7261179, -6651831, --4581657, -3251827, -2968896, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ -17045114, -2260227, -5585605, 2661806, 3018288, 1051193, -7075959, 3245922, 5035849, -5403606, -1613834, --6622840, -1449552, -2807835, -2422362, -944356, 375810, -219043, 683437, 2396592, -2946885, -1333051, -6787122, 2350421, 4185446, 900333, -1778117, -5499169, 3610457, -2409477, 5833640, -4980552, -205622, -2302103, 4757750, 5547487, 4461934, 4514011, 1127966, -3442953, 1090922, -4270271, -1779190, -3598109, 3249680, 5146445, -2247879, 2691871, -5837935, -472983, -5120138, -3508452, -6817724, -1834488, -1264868, 2345589, 3409667, 2419677, -188442, -3609383, 449361, --4996658, -3297461, 924492, -613643, -3009162, 1655710, 1704028, 437013, 3167539, -2806224, -1367947, -3792456, -1499481, -1609539, 2101313, -1963337, -4013110, -1795833, -1490354, 5539971, -4764730, 1214402, -2517925, 335544, -286689, 974958, 1917703, 359704, 115427, 345208, --70867, 89657, -703838, 561567, -2110977, 108448, -154082, 882079, 464393, -644782, --919660, 201863, 389768, 413391, 9718437, -9793062, 372052, 173946, -2478733, -2938295, --3129958, 1015223, -5518496, -5443334, 770410, 2645700, -201327, 3135863, 2443837, -2991982, -1234803, -10740639, -2626909, -2399276, -2498597, -3384434, -3733937, -9465571, -7354058, 1012539, -2218351, -505732, 5128191, 4102768, 1727114, -1820529, -1018981, 4806069, -1851668, 599685, --696322, -5039071, 1691680, -1683627, -3432216, -1322313, 4128001, 9969693, -3795141, 1118839, -2429878, -1836099, 3142306, 1409286, -3476776, 2037425, -8228621, -3804804, 98247, 3375844, -5236102, -3198140, -1481227, -350040, -11927661, 2047089, 6176163, 341450, 902480, 3384434, --1935420, 5278515, 7112466, -890132, 2026151, 4279935, 4061429, 814970, 228707, -1972464, --2844342, -1771674, 1265405, -2704219, 5941014, 3997004, -126165, -2891050, -1479616, 3427921, -4026532, -2002529, 3126199, -1890323, 854699, -1927367, -1167694, -1318018, 380641, 99858, -236760, 275952, -215822, -634581, -2573222, -8390219, 1941325, 304406, -8115341, 1240172, -4545686, 6689412, 1717987, -4816269, 11340861, -1524713, -2234994, 5328981, -3295851, -3212099, -545461, -4144107, 5054640, 5050345, -2044941, -7633231, -3770981, 3794604, -4912906, 10786810, -9310952, -7445863, -9107478, 323196, 1703491, -8669391, -567473, 3578245, 2430415, -4245575, --2467996, 9944460, -1056025, 6844031, -679679, -2226941, -2312840, -5126044, 892279, -731218, -5367099, -4584341, 1242319, -1204202, 997506, -2701535, -354335, 4524748, 3599183, -5673115, -8834211, 726923, -39728, -143345, -809064, 2393908, -1217086, -7910793, -1122060, -4178466, -6889128, 2883534, 180389, 8459475, -4680441, 5658083, 5567352, 509491, -4116726, -843961, --875636, -91805, -1170916, -1708860, 2341294, 2477659, -3738769, 1791538, -220117, 2622078, -2318746, -768262, 363462, -1161789, -1756105, 1251446, -1615982, -1366873, 694174, 1772211, --1632088, -1219771, -2124398, -914291, 1279363, -813896, -308701, 23085, 649614, -1180579, --668404, 1634772, 544924, -351114, -514322, -1845762, -20218022, 4638028, 1080184, 14401562, --782758, 5785858, -7752416, 1665374, -5810554, -1392643, -2849711, -918049, 2641942, -1560147, -2466922, 4853313, 3703336, 13674102, 9433896, -6211060, 3131031, -335007, 2519535, 1612223, --1750736, -13589813, 3435974, -695785, -137439, 5156108, -814433, -3791919, -2641405, -643171, --4225174, -2269890, -10864120, -2549063, 280247, -3837017, -687195, 4499515, 6435472, -2084670, -7953743, -5956046, 1304060, 2717641, 1036161, -1848983, -4196720, 2962454, -1059783, 1823751, --3120294, -4432406, 819802, 2577517, -4479651, 4263829, -3063386, 10157061, 10772315, -3279745, -3928285, 4136591, -566399, -1400696, -1454383, -13171054, 5496485, 5348845, 155156, -2219424, --5507222, 574989, -1621887, -6713571, -15038828, 983011, -3733937, 3852049, -8053, -64961, --2518462, -1704028, -2837900, -286152, 1533840, -1966558, 2281702, -2420751, -1407676, -1025423, --608812, 1222992, 1013612, -820876, 464393, 331249, 816581, 1334124, 1028645, -711891, --1602560, 1122597, -681289, -1198833, 429497, 379031, -711354, 827855, 1352378, 454193, --4327180, -6606734, 6594923, 3757560, -574452, 7622493, -4086662, 6838125, -7700877, -7393250, -3600793, -11798275, -4178466, 2976949, 7184407, 9388262, -1637456, 7007776, -242129, 6674379, -2469069, 1085016, -1096827, 365609, 6661495, -3174518, -699543, 1211718, 579284, -6562710, --815507, -3560528, 13570486, -6486475, -6572374, -1596654, 6396817, 6435472, 5528160, 7393250, --1278290, 1357747, -1638530, -3670587, 2800319, -331786, -697932, -4197794, 10645076, 6562173, --3287261, 2027225, 3147674, -5614596, 1194538, 4135517, -1045288, 7981660, -3221226, -1037235, --8675834, -3275450, -7376070, 328028, 10180146, -4007205, 2876554, 1742146, 353798, -2779918, --940061, 88584, -2485176, 4884989, -5019743, -2370822, -443455, 10728828, 1702418, -67109, -3391951, -2924873, -8048769, 1993402, 813896, -1285806, 586263, 1974074, -529892, 403190, -3916473, 737124, -311922, 926639, 59593, -528818, -932545, 3628174, -175557, 299574, --3320010, 2010045, 515933, 2000918, -489626, -1372779, -407485, 1012539, 1647120, 1057636, --2705830, 125628, 1919314, -601832, -3413962, -2212982, -19057844, 13824426, 1457605, -7010461, --16831440, -1675037, 428960, -9957882, -897111, 4639102, 3954054, 365609, -2877628, 3672734, -12033425, 12206834, -5228049, -5737540, -13234942, 2646237, -2384781, 12858595, -5238250, -284005, --3015604, 4839892, -1440962, -13180181, 4330401, -618475, -7809325, 7516, 1235877, -1069984, --1328756, -5417565, -7540889, 4585415, 1137093, 5996848, -5209796, 10093710, 4793721, -2085207, --8939438, -1775969, 3236258, 9871445, 3066070, -5583458, -2542084, 4587025, 2966212, -2867965, --1395328, 4835060, 3965329, 5104032, 9787157, 10916733, 5340792, 5812165, 6717866, -3931506, -980863, -7227893, 7233799, 1138166, 3659312, -5163625, -8019778, 1833414, -10254234, -3699041, --4467303, 7532836, 7905424, 8265128, 2181844, -2344515, -2610266, 7720741, 1580011, -1081258, -1954210, -2434173, 4941897, 255014, -64425, 1619740, 2034741, -768799, 4052839, -3221, -694711, -1940788, -1157494, 1113470, 3164854, -194347, 1154273, 1826435, 1062468, 608275, --941135, 1509681, -1252520, -6855305, -406948, 12825309, 7885560, 10842645, 2063732, -11864847, --3910568, 12592844, -3631932, -7980049, -8311836, -8186208, -8658654, 4760435, 4839892, 3104725, -2846490, 2936684, 12118250, -1500017, 5260261, -10409390, -11709155, 7839926, -415538, -6394133, -459562, -16316044, -5325760, -5499169, 2005213, -577136, -1504849, -11480448, -7511361, 1269163, -7927436, 12874701, -5106716, -5057861, 6864432, -8849243, -632971, -457414, 2961917, 5629092, -4598836, 8921184, -4790499, 12936441, 6107981, -13993003, 6990060, -7781407, -9274445, -7723962, --11219528, 10149545, 2389076, -11969537, 1370632, 2515777, 1111860, 1886564, -2190433, 8414915, --4884989, 6466610, -10404558, 7884486, -5277978, -4820027, 1031329, 3493956, -403190, 5693516, -16340740, -1381369, -8759049, 5167383, 10710038, 845572, -1161252, -8498130, -3700651, 7876970, --1337882, -540629, 271657, 1583769, -2208687, -1277753, -192737, 2319282, -1345399, -287763, --1546188, 4439923, -3257196, 678605, -3061238, -3837553, 1011465, 1227287, -1195612, 590558, --1109175, -846645, -240518, -439160, -92342, -1628866, -956167, 4558034, -235149, 26307, -26589068, -23968064, 11085847, 11567421, -10772852, -1944010, 15906948, 5767604, 10102837, 3021510, --3499862, 23929948, -960999, -4476967, -25770, 81604, 11486353, 18001282, 6815040, -122943, -361851, 2703145, 6184753, -84826, 3281892, -12579959, 5956583, 9808632, -2056753, 4001836, -1074, 1823751, -8110509, -6326487, 456877, -276489, 11107322, 5488968, 4594542, -4676146, --5753109, -5744519, 6393596, 9295383, 78383, -2985539, 18149994, 9403831, 12128451, -6534256, --13542569, -2575907, -14181982, -9327595, -4272956, -5910412, -814970, 10619307, -3359201, 412854, --8684424, -9269076, 10577431, -530428, 4933844, 5285494, -5517959, 10166188, 2646237, 914828, --3531000, -6801618, 7977365, -2440615, -14125074, 8169565, 6900402, 8542153, 3850975, -9947681, --2086280, 930934, -10388989, 5940477, 5959267, -969052, 4500052, 3764539, 4022237, -972273, -6357089, 948114, -250719, -3221762, 1579474, -62814, 5064304, 1093069, -141197, 1036698, --48855, 3725884, -1585380, -459025, -2468533, 1265405, -658204, -1933809, 420907, 520765, --734976, 576063, 4102768, 3097208, -1773822, -1156957, -2646774, 688269, -570157, -355409, --18583786, 2284386, 6135361, -9127879, 7612830, -15771657, 3602941, 4810900, -2075543, -6245420, --8014946, -9344775, -15823733, 2021856, 17996450, -5918465, 8680666, 4828080, 13383655, 7112466, --5056787, -11488501, 5922223, -2896956, -4085051, -11905112, -1779190, -1593970, -4750771, -5093831, --2738042, -8361765, -10994043, 12833899, -1258425, -7432978, 10064719, 3563212, -8778376, 1333051, --644245, 5739687, -11664594, 3303367, 4010426, -17210470, 5755256, 5645735, -8870718, 2571612, -672162, -2764885, 6366216, 614180, -1200980, 787590, 4312684, 11650099, 9250823, 11888469, -8192113, 4255776, -3070365, 17683990, -4488241, -9014599, 19581292, 1333587, 11834246, 2573222, --3795141, -18149458, -16800838, -4148402, 1063004, -6613713, -3216931, -5187247, 11553462, -10091026, --2946885, -1692754, 2820720, -9848897, 7128035, -757525, 2254321, -825171, -3830037, -6400575, --4311074, -5035849, -4099010, -1195075, 654983, -3087545, -2208150, -1712618, 4225711, -4890357, --4323422, -3510062, -4162897, -152471, 3390877, -1480153, -1659468, 2448131, 595927, -1206886, -1658931, -3052111, -3375844, 2610266, -3936875, -6323266, 2232846, 5706938, -3020436, 636729, -3819300, -1283658, -3139084, -30940944, 15134391, 26657252, 1851668, -15128485, 6893960, -2794413, --1060320, 4370129, 2574296, 6862284, -8075076, 932008, 23882166, 18354006, 16044387, -17520782, --751082, 4305168, 9158481, -8406862, -9425843, -2399276, 3013457, 8303246, 4117263, -22531936, --25583510, 7957501, -855235, 14412837, 14763413, -9531069, 12217571, 9842991, 13050795, -889058, --7792682, -8101382, 6234145, -8579734, -3297461, -2684, -374736, 7813620, 16596827, 9337796, --4549981, -3917010, -8225399, -2094870, 728534, 4494147, -1773822, -2924336, 8158291, 5140539, --12541305, -166430, 518080, 15074261, -7587060, -8652212, -16438450, -5577552, 2814277, 1102733, -8490077, -1829656, 2124398, -7349763, -10922639, -9904195, -10008348, -5756330, 4776541, -20623360, -2463164, -2887829, -3236795, -4359929, 4079682, 11298448, 8229158, 1309428, -1849520, -10476499, --3342558, -964757, -2131378, 6922951, 3533148, 2114198, 1523640, 3599720, 4199941, -1604170, --1756642, 107374, -1902671, 367220, 462783, 1383516, 2308545, -6700149, 1034550, -865973, -5084168, 1381369, -6740951, -375273, -4268124, -3269544, -1683090, -1504849, -1791001, -850404, -3810710, 3490735, 2943126, 5042292, 15592342, 1273995, 13530221, -1851668, 17562658, 8761733, -13695040, 8418136, 3990025, -6782290, -686121, -4245039, 9386651, 2764885, 8243653, -7871065, --1376537, 14564234, -17952964, -10034654, 13993540, -23680840, -10440529, 1766305, -4520453, -11725261, -23849416, -4262218, 16474421, 6609955, -14352170, -2195802, -5397700, -17352742, -22541062, 18005040, --163746, -6558952, 4453881, 328028, -2992519, 6557342, 2573222, -2324114, -8291971, 1592359, -17009144, 14421426, -11894912, 4720706, 934155, 13454522, -6124624, 9119289, -19339164, -4680441, -13204877, 4437238, -4426501, 15759309, -5012764, 11048803, -21470004, -24755654, -8925479, 485868, --17538498, 18953690, 13375065, 19254876, -8827232, -6496138, -6676527, 1002875, -9764071, -99858, --14923401, -13545253, 620623, 3821984, 13827110, 6540699, -1455994, -5094368, 4351876, 7987566, -5234492, 3196530, -4915590, 5776731, 5157182, 6510097, 4819490, 3528316, 5216238, -7155953, -6038724, -4327180, -2196876, 9469866, 8368744, 5631239, -995359, 341987, -2527052, 4858682, -1523640, -1987496, 2637110, 4929012, 744640, 3832722, 3722663, -4927938, 1637993, -3723737, --1089311, 1172526, 21589726, 15525770, 24328306, -21605832, -16239808, -37012416, 15947750, -4121021, --31628676, -6134824, 3000572, 4658429, -11818676, 12875238, 10877542, 1221381, -143345, 2010045, --5240934, -11013370, 2427194, -6263673, -10307385, -135291, 23977728, 744103, -3639985, -19174882, -8088497, 15141370, -7834557, -23135916, -4197794, 7798050, 2765422, -4911295, 5041218, 1647657, -8321499, -2339684, 13725105, 20976084, 7934952, -13947906, 15808164, 7117835, -17865454, -19011672, -20664698, 9994389, -8048232, -9277129, -459562, -16851304, 12334609, 16250546, -387621, 915902, -4091493, -2081449, 17784386, 5979668, 4622996, -7374996, 2873333, 6005438, 21961778, -5272609, -8414915, -17016124, -19383188, 17282948, -2608656, -1616518, 1784559, 16473884, 360240, -775778, -10395431, -4975720, 2071248, 9540733, 11643656, -5570036, -7256884, -15631533, -7714298, 5105106, --6909529, 5440113, -177167, 5772973, -3131031, 4257387, 878858, -2408940, 1872606, 8738648, -2149631, 8698919, 2618320, -5508296, 347355, 3628711, 3004330, -5405753, -4961224, -5266167, --2268280, -4138201, -4056060, -6431177, -2778844, 3577171, 2263985, -658741, -1059246, 1953673, --4284767, -108448, 5484673, -1554778, -907849, -2652142, -2248952, -1160715, -8168491, -1151051, --3182034, -3502546, -5104032, -7267622, -25049324, -2065342, -16390132, -33248416, -34266860, -14812268, --26163868, -11862700, -4227322, 4699231, 14631880, 16324097, 1671279, -8833137, 17581986, -8939974, -8665633, -32826436, -3229816, -22519588, -15115064, 15252503, 10707890, 10419054, 3463891, 21964462, --2221572, -1374926, -15822660, -5485210, -3187940, -10769094, -10877005, -26975078, -10609106, -2979097, --4351339, -16689706, 14756971, 5877126, 8804146, -7348152, -2831457, -40935332, -11800960, -11283416, -9477382, 20979304, -12927852, -1982664, -23851564, -1722282, 12271795, -3908957, -8056822, 5365488, -17601312, 30039002, 6311992, 952409, -1663226, -8058970, -12026982, 8032663, -7925826, 27247810, -5356361, 11731703, 55566140, -11059541, -9460202, -14038637, -19479824, -2643016, 18981608, 8544837, -2712809, 6316823, -8029978, -6225018, -16954920, -4059818, 9530532, -1556926, -3750043, -1591822, --3954054, 1997697, -625992, 3695819, 3744675, 3820910, 5013838, 5490579, 14153528, 8641474, --5246840, 8238821, -220117, 526134, 5920613, -6847789, 128849, -7900593, -4779225, -10814191, --8033737, -11279121, -9361955, -6271189, 12367895, -7697119, -4345433, -9079024, 566399, 2698313, --1964948, 3728569, 1499481, -228707, -7672959, -27808840, 15775415, 26007638, -15397995, 775242, -5826123, -9003862, -2177549, -19459960, -416075, -10924786, 28234042, -26844, -5347235, 22655952, --5782100, 6568079, -26042534, 13472239, 4001299, 17561048, -8236137, 13069049, 23095112, 24812026, -13914083, 22363358, 11445014, -3597572, 21735756, -10570988, -14361834, -4628364, 8706972, 14721537, --35458176, -2457795, -22935126, 18132278, 8194798, -492311, 6220187, 25407952, 1056562, 22670984, -9666898, 34354368, 3060164, -3959960, 15030775, 4936528, -17572858, 3728569, -2080375, -23570780, -16474958, -14233522, -23000624, -47004660, 3610457, -5831492, 27585502, -15426986, 36927592, 12159052, --656593, -5693516, 14379551, 15164456, -27078696, -11588896, -20021526, 6927782, -9056475, 20266876, -6420976, 6792491, 9774809, -4710506, 1702955, -7142531, -2509872, 539018, -2715493, -20922396, -8213588, -66035, 6150930, 176094, -6192269, 644782, 8501351, -13926431, 11945378, -5118528, --75699, 1339493, -11712376, -1018981, 7016903, 3550327, -8424578, -3486977, -2066416, -9855876, -3265786, -2821257, 14296336, -11511586, 5069672, 9976135, 3546032, -4254165, -3182034, 4846334, -2346663, 3003793, -2578054, 5025649, -15369004, 4094715, 3644280, 6580964, -4689031, -7176354, -511638, 6441914, 861678, 17859010, -11941083, -13361643, -13145284, 17173964, 8909910, 22363358, -6208375, 69186552, -20547660, 372052, 520765, 32205276, 13335873, 14911590, -21125870, 9278203, --8329552, 598074, -9771587, 2150705, 23277112, -6125160, 7383586, 44978508, 14120779, -20371566, --23852100, 2774549, 29334626, 15298137, 5576478, -11349988, 24973088, 4239670, -3703336, -27440546, -8391292, -4359929, 11828340, -24910274, -15202574, 1298691, -6334540, 3278671, -23226110, -801011, --14166413, 6582575, 20598126, 16464220, 5391258, -31871342, 271657, 3151432, -28718298, -25651156, --16996796, -14024142, -13998372, 22733798, 5196374, -650151, 14826227, 23638426, 6310918, 20472498, -558346, 13554380, 90393496, -20623896, 14898168, 10377178, -15879031, 3365107, -60224568, 1214402, -29912300, 7829726, -16565689, 23028540, 5555540, 8761733, -15023259, -3409667, -12833899, 4514011, -1124745, 1146756, 5164162, -18660022, 6915971, -10234370, -7439957, -25549150, 6350109, 5874442, -5101885, 6585796, 31991600, 4836133, 3430605, 3679176, 2511482, 19124952, 2255395, 8080981, -6696391, 14592688, 5872831, -867047, -3222299, -2644089, 2429341, 9259413, 11050951, 3277597, --16782048, -7702487, -3713536, -3710315, -5543192, -17524004, -4256850, 13467944, 36599564, -17013440, --865973, -24550570, -17829482, 5816997, 16043850, -20310364, 24260660, 10175851, -31825708, 19589882, --12880607, -15761456, -1307281, -19062676, 4497905, -8528731, 24622510, -14171781, -1109175, 13558675, --47501264, 6817724, 14761803, -14327474, 11716671, -28698434, 28716688, 3150896, 4960151, -54316304, -49052820, 21041582, 16120623, 1094143, -30962420, 28414966, -1795296, -14057965, 50164144, -9971303, --22001506, -11586211, 6075768, 14526653, 13759465, 3673808, -8434242, -59027884, -6648610, 14785962, -882616, 21693880, -30971546, 32003412, 3270081, 10831908, -31479962, -9089761, 5093831, 40787156, --16934520, 9543417, -29163364, 25831544, 14492830, 24378234, -9371082, 10811506, 4234301, -31884764, --30440580, 16770237, 13716515, 26003342, 5594195, 33367600, -50232328, -65747896, 10528575, -13861470, -37187976, -24230058, -5222680, 4297115, -27974196, 1398549, -16688095, 14576045, 20684562, 2076080, -16789028, 18452254, 5509906, -16644609, -8378408, 29677150, 15473157, 3861713, 5224828, -8886824, -747861, 18073222, 10165114, -14612016, -8225936, 16816944, -2335389, 10482941, 10572062, -6453725, --8538395, -8662949, 121333, 8978629, 4112431, 11483132, 16503412, 1361505, -463856, 13431436, -890669, 2709588, 4306779, -5603322, 4661114, -9807021, 5657009, 2026151, 295279, 4126390, --4891968, -45965276, 41857140, -9073655, -10152766, -16379395, -4811974, -36250596, -67662376, 23325430, -19382114, -3008088, -13977434, -27577986, -4585952, -8570607, -14685030, 26623966, -60512868, -25867514, --31961536, -9543954, -46081776, -4265440, -6968048, -1671279, -7743826, -9358197, 7391102, -474057, --20408610, -6400575, -487479, -27907086, -14924474, -8243116, 2012192, 21457656, -11038603, 43023224, --22504554, -3233574, 18079664, -19202798, 11655467, 2440078, -29512868, -44139380, -10830834, 11265699, -40240084, 17454210, -30842160, -13048111, -88525720, -29626148, -6391448, 18622442, 48063904, -2548526, --51496656, 2863133, 27963996, -10289131, -2437394, 29654602, 31205622, 71602472, -79115984, -15336791, -11212549, 20024748, -24972014, -29644402, -42304892, -41997800, -23496692, -19524384, -5500780, -3002182, --48875656, -20253456, -17913234, 18097918, -9224516, -4813048, 44024488, 33347736, 2676838, -6283537, --2017024, -27189290, -1207960, 9692667, -19645180, -10521059, 3726421, 12426951, -8326331, -9623948, --6512244, 13866839, -9170829, 14531485, 1041530, 15007689, 10663330, 10819023, -8260833, 5479842, --20591684, 10634339, -2705293, 6273337, -18205830, -14093935, -2039036, 4714801, -10248329, 278099, --23076860, -4035659, -2764885, 9894531, 12228309, -14678051, 30142080, 642098, 11189464, 6722698, -21840446, 21905406, -1055488, 13941464, -26118232, 6114423, -10652593, -62904092, 14060112, -10879689, -18409840, -17497696, -17999134, 1177895, -26393648, 4315906, -26610544, -696858, -4748623, -10545218, -12602508, -19929186, -25901338, -23702314, -30391188, -5243618, -3438121, 33362770, 7295002, -24664386, --36511516, 4587562, -893890, 8469139, -7211250, 20133196, -24048058, -9709310, -33721936, -21711596, --9780714, 907312, -14304389, 34797288, -12351789, -30135638, 9179956, 36121212, 26254598, 10549513, --25808458, -16953846, -2731599, 32774896, 63065688, -795643, 12327630, -12333535, -61920008, -13796509, -5516886, 23099408, 52655764, -29432874, -35872640, 20775294, 9867150, -12636331, 1578401, -19871740, -12054363, -52468932, -6102612, 2782602, 12607876, -31718334, 36265632, -51318416, -58244588, -53910428, -27036820, -11228655, 51117092, -71570264, -31161062, 5528160, 72803992, -6050535, -13033615, -40285720, --14736570, -4875325, 35089344, -3168075, -203474, 1916629, 6060736, 516470, -563178, -15352897, --12967580, 16591996, 7368554, 1861868, -38190848, 9397925, -9840307, -4680441, -19777788, 726386, --1789928, -3772055, -44921600, 3993783, -9947681, -5298916, -3898220, 7459285, -156229, 2625836, --308164, 118648, -143881, 57982, -16378321, -3319473, -10536629, -9189619, 7823283, 7997766, --13133473, 361851, -9353902, 12093017, -4516695, 37345816, 11457899, -66524748, -11754252, -45882600, -20562692, 3889630, -91495152, 6295349, -28106266, -59261960, -46082852, -67636608, 41965052, -20599736, --53208740, -23896124, 17389248, -31704374, -27335320, -21332028, -12619688, -23522462, -23338852, -43174084, --31194884, -59251220, -33368674, -30104500, -9862856, -27861990, -5614059, -12984223, -676994, 2369211, -8032663, 16743393, -16227997, 13951664, 1830193, 30594126, 13427142, 19165218, 19365470, -55489904, --14463302, 44837312, -7498476, -27509266, -31032750, -22939958, 18069464, 72281080, -4606353, -892816, --48185240, -49149996, -10233833, 10388989, 43290048, -2755759, 39475044, 14766634, -47327320, 85985784, -1830730, 66966056, 357019, -16802986, 36027796, -47805672, -61877056, -39533028, -137296144, -83176336, --27164058, 63257352, 38845296, -54899344, -36097588, -84030496, 42000484, 56057912, -42880416, -42805256, -10095321, 37150392, 52669720, 15010374, 30285962, -27676232, -15216532, -20771536, -31878322, -12790413, --2736431, 3463891, 1471563, -17111150, 2892661, 12356621, 4059818, -2326799, -12552042, -8136816, --14327474, -4912369, -21245592, -4086662, 13310104, -20285668, -33665028, -4420595, -22049288, -14561550, --2485712, -27980638, -21925808, -5163088, 13782013, 14776298, 15883863, 322659, -12066174, -1352378, -5224291, -6565932, 21299816, 1780801, 15731391, 1731409, 69793, 16452946, 12228309, 18410914, -38111392, 24876988, 28465970, 24698210, -23368918, -56748868, 65997004, 63108100, -39907224, -51781200, --240518, 56625924, -6137509, -3287798, -17640504, 49516140, -5487895, -13216151, -1203128, 13674639, -25426744, 680215, -19085760, -21729314, 30558692, 2267206, -13124883, -32678258, 18586470, 10249939, --3707631, -25757992, 8107825, 11078868, 9207873, -16294032, -9765682, 2873333, 25218974, -7420093, -9066139, -37089192, -10307385, 53687, 24436216, -51628192, -9208410, 5015448, 37171868, -17866528, -5777268, -26385594, 3612068, 10911364, -18126910, -13841069, -2133525, 6026376, 11349988, -11777337, -814433, -46018964, 24916716, -7704635, 43119860, -26738856, 19248970, -18204218, 20012936, 3721052, -13429289, 11349451, -33462628, 37852620, 7508140, 21829708, -36934036, 10251550, -9378061, 5853504, --10512469, 1445257, -2536178, 5015448, 12577812, -1996086, -14749455, -8812199, 3800509, -2018098, -952409, -5782637, -14367202, 4795331, 3848828, -4496294, -4049617, -301185, -4488241, 643171, --7803956, -285078, -3800509, 6431714, 3799972, -2718714, -5787469, 1974611, 181999, -5145908, -3756486, -15827491, -121333, -1889786, 7054484, -303869, 18214956, -12114492, -12257837, -4220879, -9625559, -13114683, 19536732, -16440061, 8298951, -8081518, 17810692, -15962783, 19593640, -11164231, -15322296, -13869523, 23807004, -22436910, 17243756, -5196374, 12979928, -12099460, 12754442, -13692893, -14385456, -13771813, 11541114, -9204652, 12751758, -9868761, 10635950, -9786083, 3100967, -3188476, -6408628, -4757750, 5177583, -4076998, 4045859, -2652142, 5296769, -19353122, -43012488, -57189100, -41679972, 27649388, -32624572, -46478524, -22788560, 21502216, 11264625, 28607704, 30787400, 6025839, --15557445, -4538707, 10755672, -10604811, -891206, 6365142, 1723356, 17238924, 12031814, 5222144, --15548318, -581431, -9638980, 10001905, -16290274, -14095009, 11782169, -3758633, -6648610, -6505802, --11335492, -15503758, 1156420, 12658342, 11522860, 9684078, -3710315, -12783433, -11133629, -7766375, -13776108, 18778134, -8783745, -13127031, -5709086, 15582678, 8018167, 20847234, -14767708, -5606006, -8206072, -3930432, 656056, -2234994, 7369090, 4436165, 5946919, 1254131, -14133127, 5837398, -2594160, -522912, 10894721, -5674726, -2818572, 1884954, -2040646, 1399623, -4110821, 18504866, -4627291, -1498407, 17608292, 17660368, -17973902, -27180164, -9982578, -18616536, 536334, 12310987, -3498788, -11135776, -13450764, -3584687, -2610266, 10698227, 5090073, 6667400, 10006200, 6116571, --5608691, 6193343, 4377646, -13084081, -17548700, 5249524, -4639102, 8722005, 6388764, -9618042, --2585570, -3268470, -3538516, -11176042, -6143951, -696858, 3518652, 5334887, 14849313, -7401303, --5548024, 3805878, -3462818, 19608136, -47631188, -125398016, -46098956, 22492744, 65234648, 137780944, -92198456, 23731304, 34942244, -18410914, -56084220, -93134752, -81039592, -64423972, -18583786, 2482491, -44819596, 49421116, 105191800, 51074676, 33668784, -2637110, -22430466, -50629612, -26300232, -40938556, --47225848, -29067264, -24348170, -1809792, 13145821, 39364448, 24320790, 28258200, 25669946, 25964688, -39031052, 3377992, 27039504, -5008469, -12156905, -32939178, -19644106, -49126908, -72341744, -63189708, -732829, -10739566, 19822348, 33990372, 18620294, 52427056, 45756436, 66259536, 37698000, 44940928, -2210298, 2221572, -35442072, -57870388, -67656472, -81190992, -53390200, -66349728, -5597953, -250182, -31928250, 33521146, 80197776, 63027036, 89585504, 36383204, 41872708, 17485886, -396748, -53451404, --87235080, -58386324, -69696584, -43393128, -47201152, -4392141, 7275675, 27861990, 36508832, 49514532, -50501300, 48601312, 31788126, 34808024, 9033927, -6285685, -11977590, -39158292, -35747548, -46886012, --33174864, -46868832, -35757212, -3709241, 8346195, 24740086, 37287832, 33309082, 34276524, 56542172, -20436528, 34531536, 26462368, -35618164, -64539936, -27949500, -56913148, -35844724, -19550154, -4046933, -5035313, 18134962, 32790464, 22864258, 35276712, 22429930, 19188304, 7769596, -2204392, -20501490, --6782290, -9608916, -36036388, -33621540, -9318468, -3789772, 1864553, 11841225, 13784161, 17557826, -13964012, 13880797, 5147519, 4683662, -265214, -7879118, -3991635, -2893734, -8113730, -12856985, --4488778, -6484864, -7667054, -1001801, 3180423, 3663070, 5330055, 5941014, 5523328, 2313914, -1056562, 714038, 734976, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ -7651484, -815507, -2067490, -2163053, 1333587, -3695283, -53687, -7201587, 5168993, 6554120, 4579509, -6449967, -7733626, 628676, 1772748, -2756295, -2121177, -1883880, -9058086, -1522029, 5391258, --9273908, -7535520, 4391067, 3980898, -5958194, -2075543, 3948686, 509491, 4800163, 2059437, -4999879, -3133716, 958851, 696858, -1324997, 2331094, 1831804, 3396246, 1426466, -1493575, -328028, 3794067, -1022202, -1719061, -638876, -4578435, -10112500, 6018323, 2921652, -3160022, -4439923, -1772211, 493384, -150861, 2064269, -2664490, -692027, 5981279, -5626407, -2252174, -1956895, 980863, -869194, -272730, 2621541, 304406, 2320893, -4006668, 4083440, 2105071, --5228049, 4170950, 370978, 1514513, -623307, -1549946, -6102612, -1883880, -455803, 3142306, --804770, 2571075, -1533303, 309775, 765578, 312459, 1821603, -319975, 126702, -217433, --1235340, -558346, 243739, -658741, 88047, -25233, -280247, 1674500, 1679869, 878858, -700617, 613643, 217433, 11811, 224949, 97174, -253403, -739808, -836982, 11946988, --6880538, 2092723, -7604240, 908386, 1771674, -7665980, -9692131, 2413772, -10515154, 2310693, --2746632, -731218, -6451578, -940061, -7243999, -3726421, 23085, -7663296, 8131984, 2859911, --12707198, 1200980, -705985, -2305861, -5443334, 2726231, 6583111, 125628, -492311, 6179921, --3641059, 73551, -2320356, 4093641, -4808753, 1402844, 5774584, -5038534, 5048734, 1772211, -5461588, -475668, 1232656, -834297, -2318209, 7158637, -8902393, 2045478, -3946001, -1716376, --1170379, -3244848, -2404645, -7096360, -4466766, -1115081, 4604742, -400506, 1721208, 6452652, --163746, -5609228, -733903, 194884, 1738925, -2742337, -5906, -5517423, 102005, -2251637, -1805497, 2855617, 4197257, 1493038, -2393908, -3103114, 4119411, -1392643, -1910724, 763430, -2283312, 4755603, 563714, 1358820, -328028, 2784750, -559956, -2221572, -1148904, -1103807, --117575, 1886028, 352724, -133681, -1023813, 1826972, -21475, -695785, -531502, -477815, --551903, 864362, -384936, -99321, -1078037, -2876554, -9896678, -117038, -5964636, -1882269, --972810, -6955700, -953483, -1620276, 3450469, 8112120, 8157754, 970126, -3489124, 3262565, --7904888, -1130113, -3026341, 2755222, -11779485, 4158602, 1992328, -430034, -3391414, -5077188, --2323577, -4188667, -3606162, 2203318, -791348, -4514548, -1320166, 914291, 7686918, -296890, --7772817, 608275, 3342022, -97174, -2449205, 644782, 2921652, -8442832, -660888, -3671123, -5927592, 3611531, 1001801, -7805030, 878858, 3006477, 4782446, 4478577, -5133560, -2412161, -229244, -1603097, -1611687, 4172024, -2592013, 2553895, 697395, -3279745, -743029, -4505958, -5425618, 2039036, -5366562, -3699041, 903017, 2846490, -4257923, -5366562, -915902, 266825, --3571802, 768262, -1467268, 1811403, -3404299, 5058935, 2707977, 3813931, 1088237, 503585, -3429532, 4642323, 540092, 1319629, -444529, 660888, 77846, -192737, 517544, 391379, -537408, -732292, 25770, 357556, -259846, 82678, 1546188, -899259, 352187, -1076963, --864362, -721555, 158914, 587337, 394600, 54761, -1002875, -663036, -16843788, 5437429, -4862440, 8147016, -2122788, 5113159, -14529337, -3979287, 4542465, 530428, -7191386, -1881196, --2399276, -12731357, -5164162, 1279363, -593242, -9080635, 5655935, 8039642, -8277476, 6263673, --10837276, -3695283, -981400, 3714610, -68719, -4403952, 2960306, 1466731, -733903, 4823785, --2352568, -3132105, -983548, -1794760, -3215320, 4743792, -3668439, 1331977, 3552475, -741419, --2843268, -5333813, -657130, -3811247, -1170916, -4431333, -1206349, 9802726, 188442, 5953362, --5493263, 4992363, -1578401, -8041790, -4747013, 4424353, -2929705, -4099010, 2917357, -4816806, -3982509, 1056025, -1488743, 5205501, 4704600, 2063195, -5195300, -5885716, -418759, 7792145, -1540283, 1165547, -4440460, 1134945, 2794413, -5977521, -2193118, 1918240, 4149475, 2045478, -3511136, -217970, 23085, 1278290, 155693, -689342, 202937, -528818, -762357, -2655901, --2117419, 622770, -1277216, -774705, 879395, 381178, 641561, -185220, 1071594, -718333, -45097, -947577, 4295, -1145683, 557809, 173409, 766652, -1488743, -9048422, -8603356, --5699959, 1022202, -1484448, 3468186, -3143916, -34360, 580894, -2596308, -1010928, 2118493, --2574296, 9979893, -6614250, 4599373, -1766305, -727460, -4707821, -1325534, -687732, 7263864, --5034239, 610959, 1371705, -7210713, -4426501, -4939750, -4206921, -8352638, -2908767, 2944200, -5588826, 3525095, -6679748, -9402220, -2101850, 241055, -4811437, 827855, -3284576, -4927401, --11630235, -5868536, -8166344, 4632659, -2148021, 3755412, -4711579, -11339787, -6036577, 511638, --2348810, -3752728, -1734093, -4494147, 5982890, 493384, 3462818, 4651450, 1141388, -242666, --3965329, 125628, 5057324, -929860, -3830037, -5289789, 8355322, -7041599, -9812390, -6944962, --4021163, -5472862, 6064494, 9707700, -7826504, -5413270, 1148904, 4684199, 7224135, 5703717, -4441533, 4381404, -1619203, -1985886, -2262911, -2341831, 1750736, -1453846, 439697, -1763084, --2809446, -1174137, -2037425, 1409823, -1291175, -2508261, -1486059, -1468879, -2521146, -2781528, --1759326, -737661, 497679, 445603, 1237488, 117575, -4293894, 457414, -701690, -1753957, -451508, -788127, -1330903, -2828773, -2342368, 32212, -40802, -980326, -1122597, -43487, -2309082, -18480708, 5698885, -1313723, 3266860, 10126996, 3974455, -2514703, 3426847, -7633231, -4712653, 5524939, -10069014, -2159295, -5099737, 5668820, 4937065, 7695508, 8934069, -11621108, --5984500, 1904818, 9972914, -3794067, 4635881, -11111080, -3355980, -3903052, -2357400, -6730751, -1663763, -11001022, 7614440, -2167885, -1952063, 5555004, -332860, 1261110, 5913096, 151398, -4840428, 3233574, -1370095, -1917166, -653372, -7727183, -5657009, -7061463, -444529, 14652281, -3406446, 2826089, -342524, -2057289, -120796, 8752070, -1871532, 2732136, -16902844, 15546171, --3767223, -2788508, 896574, 9517648, 3470334, -1605244, -5793911, 16658031, -3211025, -213138, -5343476, -4233227, -23622, 2378875, -3751654, 3281355, 3272765, 13754096, -6847252, -8633421, --1581085, 4108673, -5177046, 1143535, 3563749, 1126355, -3022583, 1352378, 3654480, -2314451, -332323, -3950833, -1231582, -1170379, -3211025, 4213363, -3053722, -2607045, 1937030, -134755, --3621194, -340376, 884226, 1547799, 185757, 1823214, -1307281, -1137093, -1063541, 1220308, --1332514, 2179159, 249645, -938450, 1013612, 2275796, -51003, -1050120, 7998303, 4487167, -8900783, -3558381, -2114198, 5130339, -8207146, 7393250, 8436926, -4223027, -707059, -13249437, -632434, 4566624, 3696356, -2801929, -9012989, -18289044, 299037, -3104725, -8677981, 2030983, -5841156, -7937100, -3380139, -8657043, 4387846, 503048, -1285269, -2874407, -3751654, 9346386, -10902774, 4245039, 5197448, -2421825, -5466957, 15203647, 3784403, -2584497, -8919573, 6585259, -279710, 8745627, -765041, 10806138, 5408438, 7564511, 6398965, 3265786, 8414378, 10500121, --294205, 1947768, -3343632, -100395, 5733782, 2405182, 3121904, -9270150, -3398930, -1948305, --8071854, -7716446, -5080947, 4337917, 8927626, 11671037, 15267535, 3408594, 1344325, 12306692, --4890357, -9254044, -3216931, -4679367, 7969312, 6518150, 2503966, -8761733, -2378338, 1583769, -1287417, -1688459, -4031901, 1259499, 1046898, 5099737, -1202591, -2785286, 603980, 1011465, -1261110, 121870, 90731, 1035624, 2345052, -1614908, -1581622, 184147, -179852, -2276333, --508417, -2911451, 3240553, 1069447, -2189360, -58519, 2207076, -1107028, -168041, -1712618, -993748, 1186485, -744103, 2827699, 2149094, 14127758, -13378823, -6286759, -1789391, 5417565, --12514998, 7927973, -12329777, 6081137, -28991, 6451578, 10211822, -4168266, 9327595, 10198937, -9698573, -5608154, 8182450, -8792335, -7007239, -1082332, -5413270, -78383, -4653597, 8014946, --5917391, 1768990, -5841693, -10266582, -4778151, -2157147, 12427488, -10404558, 9790915, 4311611, --14409615, 16546898, 4086662, 1851668, 11629161, 2069101, 535797, -6573448, -19864, -3668439, -13259101, 5599564, 9298604, -3611531, -2177012, 6397354, 11047193, -11527692, 11447698, 2093797, --1843078, -2145336, -10848551, 5242008, -5111011, 2216740, 499290, -9843528, 3342558, 8343511, --7558069, 5294084, 3481608, 11676405, 1257889, -783295, 7101729, 10211822, 847719, -5852430, -6871411, -7898982, -4099546, 2111513, -3183108, 2136746, -2548526, 1018444, 4430796, 3227668, --3207804, 2820720, -1642825, 2274185, -2246805, 7110319, 734439, 6788733, -797253, 1702955, --1416802, -587337, -2149094, 4302484, 1824287, -3544422, 3724274, 4311074, -459562, -592706, -2648921, -187905, -205622, 3588445, -92342, 880468, 2334852, 1514513, -539555, 2739652, --2250563, -419296, 546535, 739271, 628139, -157303, -306016, -2733210, 1316408, 4057134, --11404749, -8158827, 12411382, -15892990, 4009352, -8457864, 9449465, -10094784, 15433965, 5356361, -1496259, -13382044, 6826851, 11343545, 2997887, -6874632, -4473209, -3930432, 10524817, 5734318, --14685567, 2088965, -10390063, -560493, 1189706, -8866960, 11642046, 11700028, -5306432, 2576981, -7926899, -9666898, -1474784, -2965138, -8019241, 17065516, -6199786, -3796751, -8589935, -14324790, --2279017, 283468, -4960151, 2149631, -11874511, 1065689, 833224, -2359548, 9377524, -1935420, --7304666, 3821447, -11811, -5440650, 4679367, 20234664, -4050691, 4836133, 1095217, -13704167, --2239826, 12275553, 5515275, 12187507, -1253594, 7058779, -9695352, 4377109, 4274566, 1461363, --8242042, 7644505, 2683818, -21330956, 1658394, -3825742, 14280229, -5451387, 11086384, 10310606, -8252243, -986769, 3162170, 522912, 824634, -1352915, -2362232, 5621576, 2244657, -34360, --3711926, -5133023, -1214939, 2261837, 3615826, 2643016, 4641786, 210990, -1268626, -1870995, --1508607, 1733019, 2770791, -204548, 2183454, 1493575, 393526, 2068564, -398895, 2161979, --3504693, -4260608, -5699959, -208843, 2573222, 1238024, -2686502, -905701, -1887101, -2002529, -3458523, 1131187, 1529545, -24959128, 28223304, 3328600, 11141145, -20476256, 11180874, 14549202, --16765942, 6389838, 8303783, 6423661, -10832981, 1422708, 1914482, -3656628, 6328098, 13032541, --10459856, -8705362, -3182034, 11047730, 9556302, 13510893, -649077, 5706938, -10065256, -2637647, --2612951, 2209224, 6353867, 17268990, 10285373, 6277632, 3286724, -573378, 8252780, -3054796, --14816027, -2878702, 4359392, 4731980, -8669928, -6569153, -10737955, 2073396, -850404, 3769908, --7038378, 12607340, 12328704, -10674604, 25381110, 1162862, -2329483, -145492, -5280663, -1143535, --1622424, -10263898, 172872, 30065, 6739878, -21357262, 5234492, -7570954, 15516106, 18734110, -8112120, 7783018, 3503083, 1249836, 16916266, -3173981, -12504797, 10702522, -5630702, 2868501, -8358007, 15237470, 2143726, 1502165, -12197170, -532039, 3571265, 9671193, -4201015, 5252745, -2536178, -3704409, 9825811, 1656247, 4406637, -2864206, -903554, -2838437, 482110, 1127966, --1495186, -87510, 2961380, -1635846, 3001109, 2017561, -2090039, -224949, 1395864, -887448, -241592, -2015413, -6623377, -1907502, -1005559, 6924024, 8578660, 838592, 1265942, -2467459, --2864206, 718333, 940598, -3590056, -2779918, -1867774, -1618129, 2298344, -3965866, -196495, --2913062, 10264435, 1964948, -7147900, 6655052, 9988483, 8675834, 5475010, 10350334, -12595528, --8036421, 1397475, -11395085, -2847563, -1945620, 2500208, -2961380, -7403450, -9302899, -5599027, -4533875, 7790534, -13729400, 2866891, -1475858, -400506, -16535087, -14850923, -2624762, -11528229, -5381057, -13142063, 799938, 6972343, 10041097, -8975945, 11940009, 3016678, -1228361, -2685965, -17729624, -4996658, -923955, -14324790, -8067023, 11595338, -925029, 4361003, -13780403, -15093589, --4150549, -8538932, -1515587, 608275, -5587753, -7167227, 4198868, -6657736, 548682, -9788230, --5296769, -301185, -16078747, 1424319, 10532870, 1959579, 5519570, 11447698, 19687056, -19079318, -3441880, -11794517, -11436961, -6440304, -8695698, -5629092, -5140539, 19232864, 10594611, 10619844, -2199560, 3078418, -13964549, 623307, -4928475, 2172717, -6070937, 8478265, 11256572, 1043140, --5116380, -3525631, -9635759, 813896, 5908265, 3216394, -2338073, 6043019, 2935610, 6400038, --1394791, -1249836, 1054951, 4140349, -2686502, 1729798, -3948149, -5546951, 3959423, 1359357, -814433, 814433, -7470022, -4511863, -38655, 5670968, -4835060, 2803003, -6478422, -2239826, --1034550, 2222109, 1559073, -2005213, -1579474, -8690329, 19815906, 21010444, 23088134, -17266306, -1203665, 12422656, 9773198, -10113037, -19287624, -2301029, -2920041, -15191299, -8800388, 28651190, -2208687, 1898912, 10695005, -1308354, 4545149, -4022774, -11439645, 7438884, 6225555, -15484431, --21962852, -17047798, -13542569, -12920335, 1189706, 3672734, 6475737, -8615704, 8333311, 1941325, --4238596, -9114994, -347355, 437013, -14010183, -11002632, 1561221, -2592013, 1864553, -8532489, -6800544, 2060511, -8010651, -17161616, -6799470, -5840082, -22774600, -7237020, 2081449, 11163694, --1132798, 13232257, -2394444, -1192390, -19415936, -4190814, 7568269, 3558917, -32458678, 9217000, -2762738, -9111236, -5541582, -9501541, -10686416, -499827, 445603, -10355703, -3358665, 6487011, -9408126, 14811732, -11426224, 469762, 8359080, -453119, -24830816, -19833086, -272194, -5303748, -6162741, -257161, -6140193, -8949638, 4052839, -2630668, 3678103, 10058277, -316217, -5085242, --8486319, -15567109, -5327907, 871342, -2605435, -2686502, 976031, 941672, 6849399, -3603478, -682900, 2516851, 1328756, -5670968, 610422, -1494112, -13516262, 1306207, -5022428, -6157910, -2156074, 1587527, -4115653, -1352915, 4827007, 1343788, 1263257, -5050345, -5672578, -2053531, --450972, 227633, 3434900, 7945153, -6739878, 22556632, -19305342, -11885248, -3925063, -36501316, --19067508, -100395, -23269596, 18067316, -8185134, -7541426, 2065879, 41372348, 19963008, 1278290, -8491687, -1925219, -11108933, -1107565, -17185774, -12436615, 5908802, 6001680, 7416872, -11943230, -15289010, 9358197, 17297980, -17589502, 2818036, 25642028, 2389076, 1046898, 5051419, -24598352, -6267431, -6220724, 4034048, -9909026, -23232014, -1428614, 9370545, 11429445, 2946885, -3635153, -1671279, -1073205, 7678328, -17544404, -25535192, 4554813, -9332964, 15222438, -6115497, -6353867, -19877646, 4466766, 8536248, 1575716, -16843788, -6913824, -2035278, 9063992, 26222922, 20184736, --6053220, -23218594, -505732, -2685965, 8566312, -14323179, -17954574, -10197326, 8459475, -18185428, --2867965, -15262166, 63351, 12263742, -408559, -22866406, -5058398, 3011309, 5975374, 2828773, --14279693, -9622337, -15280420, 2343979, -3236795, -6643778, -5126044, -6640020, 1252520, -2780455, --6366752, -1813013, 4426501, -42950, -247497, -7769596, -228707, -745177, -4978941, 390842, -9482751, 3168612, 1686312, -9829570, 3765076, -1102733, -1183264, 1518808, -285615, -214748, --2071785, -5861020, -6568079, -5367636, 6553583, 5749351, -2744484, -14592151, -5457830, -5430986, --1258425, -41510860, 16047608, 13171054, -6079526, -27430346, -6040335, -10557030, -11111617, 12123082, -14975477, -1513439, 4107599, -31166968, 11005317, -39012800, -9855876, -3364570, 7798050, 19668266, -31217432, 12975633, -18034030, 4229469, 21818434, 2932389, 6654515, 11860015, -18330384, -7048578, --2872796, 5604933, -12906914, -6918119, -3897146, -9674414, -7385733, 13290239, 13028246, 3381750, -1106491, 22473416, -4195646, 10519986, -25336012, 16864190, 4835060, -22945862, 2374043, 7417946, --21589726, -2738579, -21114596, 7125351, 8929774, 9552007, -14207752, -1165547, 14235669, -11784853, -192737, -1849520, 23481660, -13824963, 17306570, 8818642, -21827560, 19252728, -16064251, 12414603, -16297790, -16367583, 9300752, -13953812, -17418240, -26227218, -21911312, -23976118, -5715528, 4362076, --7211787, 21100638, 21864068, -9158481, 19272056, -2876018, -4029753, 24551644, -5418101, -16322486, -11439109, -2381559, -12782360, -9774272, 9702868, 1802276, 5042829, 7745437, 1382443, 6389301, -9761387, -2508798, 10941966, 7597797, 5471789, 6300180, 938987, 3909494, 9302362, 7573638, -9430674, 1511829, 7835094, -1349694, 569083, 6922951, -3346853, -12123082, 5820218, 2075543, -40802, 378494, 5557688, -10708427, 5589900, 7757785, 6216429, -7048042, 6820945, -32802276, --15469398, -16103443, 28835336, 943282, 10826002, -4606353, 40860708, 6510097, -27166742, 2065879, -30043296, -11030013, 6751689, -4880694, 2675228, -17447230, -23551990, 37554656, 26757646, -10200010, -20556250, 8115341, 26716308, 30354144, -8776229, -7088307, 27011050, 19807316, 2266132, -8455180, --13310641, -13987098, 12545599, 23811836, 11241540, -4279398, 16040629, -8345122, 15227807, -6727530, -22171158, 39197484, 29880088, -31832686, 14639396, -5386426, -12920872, -376883, 11173357, 10775536, -71567576, -7178501, -686658, -11599633, -12633646, 13968307, 25890600, -6287296, 19694572, 16809428, --2196339, 635655, -13864691, 14216879, 11966853, 38081328, 38737384, 47022376, 19566798, -11959336, --9678172, -21556978, 21126408, -31903018, 23147726, -29944512, 17661980, -10540387, -17993766, 13070122, --48506288, -38367480, 7030325, 7574175, -13859323, -13438953, 22671522, 11315628, -20798380, 3124589, --4716948, -11375221, 3758633, 5866389, 1806034, 5944235, 6977711, 12258910, -5640903, 2413235, --6826851, -12109123, -7393786, 2935073, 1076426, 16802448, 3601867, -4029216, -13573707, 2186138, --5369783, -4343823, -6027987, 4722854, 10133975, 3614752, 8797704, 7390028, 11625403, -4850629, -8861054, 1202591, 2595234, -762357, 775242, -6789807, 8172249, 19503446, 10465225, -2021856, --2152852, 15508590, 12999792, -11950747, 3837553, 7813083, -5992016, 22433152, 5067525, -52586504, -12059731, 6888591, -39119636, 2302639, -6713034, 1619740, 14326400, -1902134, -36158256, -6426345, --11530913, -2032593, 25589952, 30720828, -17498234, -4416837, -14689862, 7556995, -27710592, -53739704, --19263466, -16238734, 2807298, 868120, 24417962, -36745592, 17485348, -8560407, -4079145, 15066745, -7066832, 25523380, 5802501, 9810779, 27307402, -31255550, 38945152, 30910342, 16108275, 28987808, --11296838, 10984379, -27211302, -5449240, -13711683, 24001888, -21338472, 5099200, -45788648, -56791816, -37853696, -1804423, 24412594, -17289390, 16149614, -11317776, 3479997, -6521371, -37211060, -11822434, --24886652, -11872900, 13427678, 55043228, 19643570, -48721036, -11041824, 12786118, -11307038, -7384123, --32171452, -16727287, 24790552, -9409736, 5976984, 4765266, -20062330, 12549358, -2958159, 849330, --41140956, -12105902, -905701, -18928458, -10689100, 1413044, -27851252, 2750390, 6197101, -22669912, --17741974, -31947578, -23730768, -2379412, -13156559, -6470905, 766115, -9291088, -9010305, -3927211, --14067092, -6934225, 1774895, 9342628, -12410845, -4643934, -21228412, 7267622, 5178657, 12241731, --8807904, 12732967, -27457726, -1869921, -34897, -2180770, 4158065, -4720169, 2871723, -12998182, --13390097, 3850975, 3308199, -32236414, 17130478, 17114908, 30323006, -14668924, 11165841, -16872780, --19628538, 8879308, 40237400, 65157876, -3975529, -4220342, 1447404, -1349694, -28916404, 45624364, -21946210, 24314884, 18744848, -13086765, 15882789, -25566330, -36870684, -6283001, 27740120, 18089328, --13146895, -8437463, -1762547, 22480932, 1015760, 16413754, 16053514, 26602490, 8904004, -16580721, --15770046, 15252503, -17762374, -13197898, 7913477, 29211146, 26903676, -30572650, -23664196, 15917149, -18931142, 57332444, -13228499, -31067110, -32244466, 27487790, -20616380, 25941066, 29272350, 58992988, -125030256, -27844810, -15879568, -46733004, -74512312, -23676008, -37502044, 4406100, 51884280, -7515656, -27497454, 39262444, 25706990, -14367739, -46141372, -75521096, 42256036, -2865280, 48056924, -24568824, --65544960, 22999550, -38831872, -51652352, -26540214, -16362752, 16522739, 16365436, 29525216, -2080375, --14323716, -2166274, -1177895, -26666378, -25928180, 13328894, -9167071, 26584236, 24131810, -11404212, -24024436, -18792630, 541703, 23789824, 2554432, -36718212, 9838159, -18428094, -3224447, -5838471, --4938676, -27031988, -22236656, 4456566, 32223530, 34676492, -32350768, -3688303, 39342976, 37815576, -44560, 8093329, -35633196, -18763102, 5273146, 20973936, -30807800, 8035884, 23985782, 12215961, -9068823, 2893197, 15121506, -25233470, 4694936, -23002234, -63432372, 15969225, -26503706, 26326002, -3870839, 14697915, 12883828, -58030376, -41111964, -20365662, -12785581, -13492103, -23716272, -7380365, --39400956, -25100326, 18953154, -25660282, 48831632, -36335960, 3738232, 10059887, -3861713, 4290136, --2095407, 11662984, -11324218, -12212203, -2112587, 8737037, -1537598, 20936354, -19766514, 4452271, -30601642, 9797357, 4589173, 15573015, 1931662, -12475269, -7940858, 24821690, 5568962, -39260832, --17403208, -31859530, -14499810, 42194296, 39355860, -40668508, -4498442, -46238544, -11142219, -3856881, -10660646, 23163296, -37868728, 25246892, -32239636, -5469641, -21842594, 48581448, -9825811, 34259880, -32057636, 71331888, -32869922, 29407642, 4787815, 27939300, 9760850, 21310018, -35756140, -32862942, -47662864, 2303176, -1799591, -33777772, 38481296, -13052406, 19740206, -35553204, 74673376, -40039296, -41539312, -50127100, 19789062, -37791416, 20855824, -34821984, 25789132, -22069690, 15146202, -12338367, -8338679, -18787798, -11599633, -8921184, -2346126, 6584185, 1148904, 5297842, 428423, 5202279, --2842195, -9628780, -15175193, 6816650, 7529615, 2117956, 6896107, -5738077, 2681133, -4566087, -2818036, 25597468, -6494528, -18514530, 2578591, -10534481, -19695646, 6146635, -10773925, 7740605, --9042517, 6408628, -17218524, 6849936, -22252226, 31101468, 4785668, -57204668, -25195888, -35458712, -1929514, -8322036, -77232104, -35095788, -20277078, -41168336, -25653840, -77829104, -65706556, -12037183, -27894738, -42905648, -25666724, -6378027, -36561984, -8515846, -3070365, -35390532, -9557913, 7046968, -1577864, -46920372, -26770532, -26840862, -14992657, -16732119, -4955319, -32635308, 26874148, 17453674, -38438348, 55988120, 48664664, 12287365, 51459612, 20509006, 9004399, -23156854, 17885318, 18611168, -14668924, -6197638, -17915382, -8414378, 12712029, 22761716, 117880208, 15800111, 24100672, 17142288, -48061220, 18474802, 42179800, 77001248, -37512244, -75856104, 9154723, 48088600, 86057184, 38024420, --74822624, 9839770, -18871012, 108656768, 79860624, 97182224, 89071720, -77888696, -51504176, 63425392, -76182520, -22580790, -44769128, -53954988, 120296664, 80039400, -5525476, -104097656, 24522116, -4274566, --23455354, 28296318, 7315940, -9382356, -22682796, -739808, 15927886, 44486196, 31411780, -27064736, --11237782, -7518341, -6230387, 24954834, 17882096, 19268298, -272194, 10153840, 40736692, 27593554, -5207111, 16091095, -11943230, 20159502, 26041998, 34547644, 44014824, 34377992, 26060250, -163209, --6766721, -9570261, -3775276, -20331302, -11695196, -9976135, -25400436, -32472100, -37142876, -63242856, --36386428, -23783918, -38579008, -70343512, -49387828, -41647760, -48752172, -57642220, -61092688, -21170430, --23972896, -33595772, -19364934, -21106544, -14496588, -19844896, -19596326, -19148038, -18945638, -55890948, -89661200, 72392208, -62634044, 14002130, -1418413, 10076530, -2406256, -6205691, 23117124, -23205708, -22583474, -9205726, 124554, 8892730, 7312719, 8019778, -18790, -13176423, -8354249, 14382235, --11798275, -1564442, 13962939, -7642895, -7870528, -11106249, -20156818, -20383378, 14937896, -7488276, -5619965, -12861816, 2647311, -27196270, -4794794, 7320772, 17552458, -11202885, 3920768, 11835319, -19225884, -4713727, 15945066, -12992276, 50530828, -18873696, 17519708, 2152316, 9991168, -9621264, -13518410, -5546951, 36074504, -6063957, 11293617, -25289304, 33127082, -17550846, -1156957, -5105106, -4989679, -10077067, 19988778, -23081692, 18802830, -21187610, 27380416, -28686086, 34670588, -23186918, --12135430, -14657113, -6988986, 1059783, -22429392, 14442364, -13194676, 12614319, 1290638, 17551384, -6991133, 12015171, 22058416, 9032316, -7310035, 5480915, 5597416, -3511673, 4190814, -7241315, -8161512, -4265977, 326418, -7126962, 15644955, -15631533, 1736241, -1856500, 12768938, -2867428, -2901251, -3419331, 5355824, -7717520, 5899675, -6699075, -2837900, 11158862, 10989211, -3795677, --10209674, 6240588, 9806484, 9411884, -8745627, 7152731, -5884642, 5175436, 1939178, 1522566, --9356049, 9811853, -3345780, -13223667, 10919954, 8975945, -7709467, -2566780, -1132261, 1789928, --7387881, 10380936, -9762998, 2929168, -10705206, 9300215, -7476465, 7775502, -5807870, 9751723, --11068131, 11932493, -10848014, 5125507, -8821326, 8772471, -10209137, 7920457, -6080063, 10378252, --11773042, 12176232, -10335302, -21983790, -45426260, -49982144, 42490112, 10733660, -13156022, -67734320, --27228482, 37728068, 7690676, 27246198, 30393336, -10982768, -19103478, 889595, 7201587, 5575405, -5037997, -11997454, -8805757, -6673843, 31675, 18301930, 9901510, -914828, 4120484, -5310190, --8862665, -5691906, -4639639, 295279, 5413807, -4204773, 6986838, 7295002, -24871618, -11094974, --11003169, 13235479, 9245991, -885300, -11573326, -15709380, 13648332, 2957622, 9155797, 12671764, --23057532, -15413027, 4220342, 18519362, 9393093, -26310432, -16163573, -21388400, -10159208, 5424544, -4832375, -8850317, 9663676, -4034048, -9186398, 4042101, 8810589, -6643778, 2110440, -335544, --8202851, -834297, -2885144, -18718542, -18795850, -1246077, -20050518, -15142981, 658741, 5996848, --4350802, 22053584, 16383153, 9222369, 730144, -2218351, -9822053, 12171400, 6047314, 7059853, -6954089, -6302328, -2566780, -568009, 3567507, -11705396, -14076755, -2047089, 6274411, 818728, -7929047, 5385352, -7305203, 2324114, 4397510, 2951180, -2299955, 7771207, -9731322, -5949067, -18129594, 10269267, -11022497, -8446590, -5564667, -10008348, 11054172, -470836, 1672353, 4930623, -3363496, -217970, -306016, -7483981, 4823785, 2716567, 6590091, -3741990, -942745, 4103305, -17636210, -43859132, -119562760, -45428944, 27266064, 57630408, 135865920, 79868136, 21749714, 28464358, --23499376, -43932684, -96171832, -64838972, -49699752, -16244640, 19762218, 52981104, 41190884, 51434380, -49704584, 33699388, -11311870, -39169028, -33899640, -34845608, -27991912, -40399000, 12461848, -25531434, -1924682, 18824842, 34791384, 19636590, 32570884, 42917460, 855235, 12816182, 1003949, -645319, --23916526, -3158412, -21274584, -41620380, -65672196, -36594732, -19995220, 5314485, 5061082, 39090644, -54299660, 52166672, 62135292, 9049496, 40799504, 16158204, -3609920, -38183868, -37361384, -50787988, --66627292, -45459008, -51613160, -32715302, 261993, 16028281, 37202468, 59999084, 88428544, 70812200, -64216204, 34744136, -13167296, -13075491, -34616900, -73785928, -56622700, -93243736, -61241940, -27159226, --20604032, 29145648, 56052008, 76715632, 54221816, 41464152, 25283936, 28739774, 25337622, -4039417, --28968480, -27709518, -43621300, -48371532, -38409356, -26340498, -24399172, -23283018, 10753524, 22667764, -40219148, 47613472, 39157752, 34317324, 19684908, 672162, 1089848, 4420058, -28839632, -49107044, --20013474, -42891692, -48499844, -1661079, 12253005, 27064736, 28120224, 17882634, 29715804, 17179870, -23796266, -5028333, -393526, -20816632, -12393665, -11077258, -13642427, -15788300, -12594455, 2056753, --5181341, -15032, 14536317, 19968914, 12717935, 10924786, -2667712, -3567507, -76236, -367220, --5999533, -7295002, -1095217, -4362613, -4267587, -2720862, 178241, -4603668, -1415729, 8649527, -3157875, 3783866, 5685463, 4010963, 1215476, 197032, -997506, -1186485, -715112, -471373, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ -8075613, -5168993, 141734, 270583, 6361384, 1582696, -3165928, 2160369, 4234301, -2147484, -3509525, --12622909, 675384, -4248260, 8429947, -4185446, 4228932, 3401614, -435402, 2748242, 4667556, -1267552, 1095217, -2306398, -2765422, -2153926, -3485366, 3036542, 1823214, -1656784, 2752000, --1905892, -2782065, -3343632, -1598802, -2644626, 236223, 30602, -478352, 5761162, -3325915, -4709432, -1691143, -1215476, 3186329, -1978906, 1007707, -1980517, 3493956, -1043677, -9844065, -2914135, 366146, 1190243, 4983236, 2542621, 381178, -1148367, -3237869, 8419747, -4439923, -3258270, 1745904, -3520263, 3583613, 1553704, -4097399, 3242700, -4225711, 212064, -407485, -3690988, 647466, 3857954, -1465121, -8750459, -1826972, -2141578, -4101694, -3748970, -3633542, -2966212, 1366873, 1010391, 1870995, 1779190, 409096, 818191, -974421, 562104, -704912, --396211, -2077154, -80531, -654446, 1557463, -103616, -565862, -270046, 113280, -1045825, -318901, -420370, 535797, -291521, 47782, -1209033, -222801, -1524177, -1043677, 15338402, --7602092, 830002, -481573, -469762, 3471944, -2784750, -11052025, -10186052, 4760435, -3237332, --966905, 2573222, 537945, 2539936, 2833605, -4865124, 2587718, 1781338, -3459059, 3991635, -6019934, -3974455, -1329292, 274341, -6560026, -2978023, 623844, 7772280, -1293322, -468151, --6536940, 3816615, -33823, -5861557, -2530273, 1996086, -923955, 1101122, -5083094, -154082, -302795, -2088428, 5347235, 1330366, 1167694, 5170604, -584652, 6725382, -2315524, -8627516, -3427384, 3329137, -3069828, -1353989, -1098975, 1031866, 338766, 2360622, -2014340, 1550483, --4733591, -244276, 3033321, -4517232, -572841, 2604361, 791885, -2377801, 1497333, -1808181, -440234, 4367445, 1538135, -6078990, 7303055, 2727304, 2662343, -657130, 4187056, 4667019, --2076617, -318364, 1003412, 1181116, 1438277, 1955821, -234076, 139050, 1445257, -234613, -181999, 903554, 2260227, -389231, 2302639, -108985, 534187, 1173063, 285078, -695785, --218506, 796716, 766115, -154619, -1067299, -3751117, -8999567, -1111323, 923955, 9847823, --3808026, 8434242, 2085744, -331249, 486405, 7540889, -1802276, -2117419, -2232846, 5301601, -10817949, 2800319, -7523172, -10201621, -14488535, 1850057, -3811784, -6119792, -3371013, -9465034, --80531, -4416837, 675384, 4479114, 4730370, -5416491, -4844186, -3462281, 570694, -8039105, --905164, 2440078, -3652333, -1363652, 808528, 3177202, -4522064, 1126892, 10535555, -483721, --542777, -3940096, 4371203, -2006287, 360240, 3311957, 4348118, 6454262, -1065152, 913217, --1984275, -133681, -1136556, 813359, 10126996, -11325292, 227633, 2145336, 5974837, -2542084, --3007551, -710817, -2840047, 8063264, -4489852, -10679973, -756451, -3220689, -4471061, 2591476, --10542534, 3840238, -1143535, -2971044, 195958, 7383049, -2217814, -2844879, -2881923, 3513283, --3355443, -956704, 615254, -354872, 1270774, 67646, 490700, 2155537, 170188, 525597, --559420, 1722282, 383326, -404801, -2006287, -1127429, -155156, -1102733, 2054068, 1200443, --1174674, 1482301, 155693, 174483, -1088774, 519154, -475668, -5369, -16508244, 6166500, --5163088, 6920266, -6218576, -564788, 4792110, -9549323, -1638530, 2910377, -2597382, 13910325, --5835250, -1765232, -5566278, -4659503, 7151121, 7945690, 3080565, -9370008, -11300059, 10448045, -1757715, -10599979, 3962644, 382252, 5018670, -3150359, 4789426, -6347425, 3097208, 10222022, -4235912, 4371740, 2331630, 167504, -2595771, 2124935, 807991, -6995965, 127775, -2229088, --5117991, -5135171, -1931662, 4026532, -7348689, 986769, -5311801, -565862, -798864, 2409477, -4383014, 9223979, 3281892, -76236, 3991635, -4965519, -7252589, -154619, 1714229, 729608, -8806830, -2026151, -1051193, -2837363, -1219234, 1220308, 4291746, -1188095, 1809792, -4389994, -7136625, -1897839, -2456185, -1674500, 2333241, -3893388, 151398, 4362076, -281320, -1298154, -682900, 3455838, 2786360, -583042, 2253784, -1929514, 1440962, -1183800, 584116, 2459406, --842887, 1026497, 1104880, -1750199, 1755031, 1005022, 424665, -777926, -1508070, -418222, -1962263, 1226750, -622233, 721555, -324270, 3092913, -235149, -929324, -8236137, -1909113, --5340255, -530965, 10976326, 7021735, 4910758, -817118, -9630927, 1362578, -6331319, -10208600, --3378529, 7375533, -5759551, -9050570, 2384244, 794569, -4501126, 985158, 5175436, 1437203, --12069932, -3409130, 7609609, 8961986, 4476430, -9999758, -3619047, 4580046, -1692217, -2140504, -664109, 3368865, 554051, 1254667, 10292352, 34897, 6231461, 4833986, -64961, -4613332, --99858, -2715493, 6141803, -3489661, -5832566, 27917, 9627706, 554051, 9564355, 5162014, -939524, 6185290, -1027571, 13274670, 1082869, 6573985, 7486665, 705448, -6167573, -934692, --7381438, 3787624, -5286568, -2958696, -4873714, -3209414, -2333241, 2439542, 832150, 3665755, --140660, -4212289, -3666292, 1385127, 6840809, -2012729, 1699733, -7321309, 2332704, 6345278, -9735617, -3340411, -715112, 1619740, -3336116, -244276, 3219078, -975494, 5906654, 396748, -1350230, 155156, 287763, 2182917, -1431298, -927713, -760746, -437013, 601832, 736587, --1105417, 970663, -333934, -1172526, -1429687, 490700, -1357747, -892816, -1703491, 833761, -1184337, -244813, 3328063, -2155537, 587337, -234076, -1886028, 3166465, -914291, -449898, -9999758, -14951318, -2758443, 12517145, -6220724, 2287070, -9667971, 4254165, 17607218, -2384244, -923418, -745714, -12453258, 1004486, -802085, 18690088, -5907728, -914828, 8159901, -5151277, -11573326, -7809861, -1178969, -11807939, 13339632, 185220, -5267241, 171262, 4878009, -6206228, -9268539, -985158, 8211978, -56371, 4294431, -12904229, -8322573, -6018323, -1951526, 7784628, --11714523, 6257768, 4814122, 1636919, -4861903, -7047505, 16064251, 3201361, -1844152, 6245956, --5703717, 3389803, -7587060, -7423314, -3119220, -4981089, 17347372, 5196374, -3475166, -5153424, --6650757, 5470715, 4485557, 1652489, -6138045, -736050, -2503429, 7432978, 643171, 6015102, --14055280, 7641284, -1259499, 389231, -1591285, 2480881, -6222871, -2864743, -9759776, -3169686, -3505767, 5950141, 6239514, 2336462, 2251637, 1481227, -3516505, 2092723, 1392106, -240518, --2371359, -3866008, 2036888, 1957431, -3007014, 1551020, 171799, -2430415, 1569274, 466004, --1087701, -560493, 115427, 496069, -1845225, 1275068, 653909, -2799782, -699006, -1427540, -190052, 2007897, 1323387, -277025, 44023, -1287953, 153545, -1187022, 6329171, 3114925, -5215701, 1541356, 56371, -1989107, -8012799, -2496450, -5171141, 3144453, -308701, 12030740, --10127533, -13042742, -3310346, 4041564, -4085051, -3172907, 10225243, 2034204, -5686537, -6548752, --6790880, 11180337, -5679021, 7546795, -3686693, 8259222, -8302709, 1789928, 12687333, 4323959, --17376364, 3958349, 348966, -2255395, -1586454, 1743757, -2115808, 1646583, -2874944, 1351304, --750009, -7786776, 7714298, 7922067, -2420751, 8779987, -7572028, -1343788, -2215666, -3624416, -9659918, -7028177, -12429635, -6979859, 2281165, -10139881, -9456981, -4744865, -3225521, -6510097, --587337, 8242042, 8677981, 1294396, 9359271, 2900177, 1214939, 7088307, -7674033, -1381369, --45097, -6307160, -109522, -6111202, 7298223, -2151242, -1388348, 6068789, -1167694, -1962800, --1310502, 7253663, -938987, 2506650, -7147363, -2557653, 3924526, -4645544, 290984, 90194, -741956, -3549254, -2472828, -1885491, 68183, -1961726, -2334852, 694174, -396211, -2097018, --949188, 231391, -264141, -678605, -744640, -1221918, 332323, -3849365, -2698850, -2604361, --2588255, -3758, -188442, -940598, 883690, 19327352, -9545565, -9188546, 6222871, 15707769, -3053185, 14147085, 8074002, 12848395, 5691906, -2403571, -5835250, 4601521, -9605157, -7306276, -10721312, 8968429, 22405234, -577673, 3116536, -8299488, 8653285, 3920768, -9987946, -2367601, -12688944, -41339, -13982803, -5647345, -7892003, -2677375, 7798050, 7164543, -5304285, -2570001, -9727027, -9424769, 4328254, 8199630, 9795747, -5226439, 8432095, -3558917, -12736189, 4504347, -11689827, -3119757, 3375308, 2863133, -3962644, 1438277, 3503083, -3622805, 1304060, 9479530, --5574331, -2932926, 8737574, -1860795, -1765232, -14474040, -5128191, -8732742, -14377940, -9666898, -7218230, -4694936, -6146635, 12477417, 12456479, -3124052, 13397077, 5395016, 8801462, -2446521, --6928319, 5818607, -7184944, -14323716, -8645769, -3659312, 7080254, 3297998, 11869142, 2129767, --2561411, -1888712, -8053, 2095944, -3693672, 275952, -2148021, -272730, 2080375, -321049, -330176, 3881577, -1399623, -653372, 3811784, -2763812, -1443109, -1815161, 1121523, -2028298, -1385127, 900333, 586800, 2057289, 2558190, 1216550, 4624069, 619012, 3156264, 1132261, -2368138, 2790655, -2415919, 2233920, 2322504, -1628866, -540629, -179315, -3375308, 1031866, --9757629, -10438381, 14139032, -2354716, 32300302, -13302051, -6255083, -740882, 7881802, -4502200, --4399657, -13305272, -15397458, 6956774, 1336809, 21259552, 6886443, -2165737, -2427194, 14124000, -14413910, -11905112, 8651138, -11371463, 2990371, -4893579, -5866389, -3484829, 2419677, -1843078, -7484518, 3761318, 8375186, -1035087, -4001836, -7856569, -1526861, 9167071, 815507, -12154221, --1535451, 2972654, -5200669, 9650792, 8137890, 1708323, 2827699, -26550950, -10181220, 9299678, --627602, 14927696, 4156455, 16824998, -1893544, -9074192, 8968965, -5064840, 6116034, 1112397, -24480240, 20272246, 2384244, 5754183, -3344169, 8078297, 8534637, 9263171, 9977209, 16268799, --305480, 2945811, -6234145, -5392869, 5078262, -7561827, -18843632, -13932874, -337155, 11735461, --5915244, -10615549, -6130529, -5706401, -649077, -12678207, -523449, 2403571, -98784, -1670742, --1264868, 1363652, 2732673, -300648, 2055679, -9451076, -5840619, -2985002, -6751689, 646393, --2450279, -3873524, -2658048, -1547799, 3826816, 1626182, -3629247, 1236414, 8486319, 4435091, --1818919, -2974802, -3896072, -2193655, -3146064, -6591701, 2420214, -2503429, -559956, 4895726, -1554241, -889595, 904628, -28055264, 22111028, -651224, 2501819, -7783018, 12390444, -26637924, --17080012, -5396627, -6851547, -660888, -23883776, 4656282, 475131, -657667, -10914586, -11110544, -4500589, 15194521, 2342905, -20316270, -4413079, -16638166, 13117904, 8458401, 647466, -7375533, --3493419, -3773129, 10808822, -1558536, -230318, -2359011, -14718316, 7628399, 10299332, -6179921, --3302830, 8005819, -16018617, -11680164, -17671106, -5998459, 4434017, -11278047, -5388574, -491237, --18298172, 5578626, 11275363, 19962472, 2868501, -1993402, 1219771, -13146358, -10308995, 15282031, --1097364, -5822365, -3619584, -23420456, -12568148, 4574140, -4952098, -2738042, -1831804, 15311022, --2662880, -14564234, 1162326, 11336566, -297427, -7146289, -146029, 778463, -6020471, -10213432, -8016557, -18774376, -9293772, -143345, 9069897, -11475616, 7254200, 4804995, 6609418, 7042673, --7209103, -1823751, 8643085, 1653026, -5285494, 4959077, 7153805, -6687801, 2486249, 6417755, -6061273, 9521406, 643708, -2908230, -1625108, 1563905, 132070, 4188130, 3529926, 327491, --862752, -3036005, -1030255, 2100776, 4256850, -7031399, 916976, -1329292, 2924336, 6799470, -348429, 4765803, -2524367, 3170760, 3899830, 5738613, 4479651, 5602248, -396748, 3224984, --1011465, 2741263, 14862197, 13649406, 4966056, 23115514, -10306311, -4798016, 3764539, -6029061, --1759326, 7564511, 24768540, -3971234, 5051419, -132070, -1496259, -386010, 27315992, -13200582, -14188961, -121870, -17865990, 5956583, -17722108, -10823854, 10290742, -9325985, 7292318, 418222, -1018444, 12256763, 9833864, -14674830, -16627966, -12494597, -4156455, 4797479, 4854924, 1830193, -3344169, -19993610, 3112778, -10719165, -25176562, 17211008, -4918275, 16187195, 17311940, 1032940, -6497749, -9183177, -11183021, -19826642, 4611185, 18246632, 3260417, -7955890, 1125818, -3984656, -2838974, -10657424, -8706436, -10640781, 1893007, -1252520, -3439732, 11778948, 10600516, 6400575, -17140140, 1974074, -17929340, 23284092, -16920024, -5170604, -4204773, -4434554, 19517942, -3052648, --27828166, 23778550, -9212168, -5611912, 6554120, 6083285, 18331994, 11739756, 7706782, 9003325, -8133595, 6180458, 406948, 7750269, 9289477, 2528125, 183073, 9968619, -1697049, 1231045, --9026948, -2099702, -2834679, -4636417, 820339, -644782, 6025302, 4432406, 1835562, -648003, -2936147, 1335735, 2157684, 4123706, -1178432, -1438814, 907849, -1412507, 3059627, 1508607, -1464047, 2489471, 1435593, 9247601, 6742562, 2024540, 21172042, 23928874, 5592585, -44973140, -1632088, 12733504, -14840723, 9071508, 18011482, 914291, 4905390, 11395622, 8753680, 3427384, -16190953, 3711389, -2223719, 30430918, 11326903, 4026532, 13157632, -9980967, 16136192, -11225971, --961536, -1204202, -3700651, -16587164, 5609764, -11709155, 21671868, -1844152, -4234301, 31911070, -4272419, 4748623, 10611254, 1299228, 6124624, -7036230, -13849122, -1470489, 9378598, -16311749, -19077170, 17319992, 12715788, 3446711, 7577396, -11228118, -11775727, -18579492, -8247948, -9965398, --9604084, 4581657, -1802813, -18182744, -8111583, 16247861, -261993, -14971182, 8580271, -694174, --10281615, -24389508, 1722819, -37037652, 21630530, -12509092, 19675246, 1107028, 5496485, 799938, --7295002, 10050760, 33265058, 3215320, 9490267, -5651103, -25906706, 2464238, -2785823, 19134616, -11049877, -4291209, -905164, -3749507, -2037425, 6628745, -7406134, 6237903, -862215, -6332393, --6554657, 7194070, -8030515, -7723962, -11137387, -2053531, -8004746, 2724083, 7024419, 685584, --2017024, -4986457, 10251550, -9385577, 2537789, 1471026, 875100, -5405753, 4088809, 10318122, --433792, -4762582, -1212255, 9449465, 9556302, -7385733, 9150428, -389231, -2374580, 1738388, --575526, 10409390, 2637110, 12400107, 9224516, 24508694, -33712808, 13282723, -19748260, 16815870, --8387535, -14176076, -4072166, -16325708, -6869800, -3662533, 5877663, 7486665, -4772246, 23529978, --1122597, -4085588, -3177739, -21369610, -2377801, 56371, -17972290, 5725192, -15329812, -19337554, --6267431, 11588359, -31987842, -21736292, -14527190, 1607928, -22437446, -19075024, -15448460, -7786776, --6283001, -2983392, -15176804, 16149614, 2742337, -1619740, -11338177, -11668889, 21859236, -19096498, --13067975, 5706938, 5798206, 7822209, -11107322, -15439334, -6540699, -2905546, 7126425, -11102490, --4478041, -4572530, -13242458, -22557706, -28493350, 26871462, -29523068, -1687385, 2054068, -5193689, --5486284, -26413512, 10179072, -6371047, -27688580, -680752, -6103686, 25983478, 6417755, 18478024, -17601850, -5299453, 6877854, -2945274, -5055177, 12986907, -3314104, 7443715, -10009958, 734976, --10080288, 8545911, 6701223, 1183264, 6133750, -2669859, -967978, 6476811, 3105798, -6408628, -4706748, 10589242, -1644973, 2416993, -5786395, -13637595, -1433982, -1229434, -454730, -9474698, --2048699, 1482838, -1363115, -5061619, 6456947, -1207960, -3632469, -11033234, -11126113, 143881, -6135898, 3586298, 2389613, -761283, 8053601, 9096741, -4053912, 1955821, 2247879, -611496, -2763812, -29996052, 34702264, 5495411, 3499862, -6017249, 17619030, 217433, 29011430, -7911330, -19900730, 10729365, -28617368, 12403866, 4687420, 13586055, -2348273, -7619809, -11406896, -4192962, -13962939, 30758408, 3238405, -4491999, -19476602, 7350300, -21065204, -3325915, 21221970, -19186692, -9664, 1355599, -3335579, -7237557, -8187282, 34093988, -7388418, -8364986, -4158602, 7738994, -11407433, 4294431, 536871, -6937446, -129923, 5111011, 20679194, -4744865, 29596620, 17327508, -8796630, -7113540, 25792352, 29358786, -2449205, -7763691, -1570884, -9528385, 2887829, -9433896, -14770393, 5060545, 21293910, 16498580, -26154740, -29410326, 35261144, 26250304, 4129611, -4968741, --14038637, -19359028, -7617662, 19903416, -18742164, -20205136, -2890513, -5426155, -32413582, -7172596, -7146826, -12498355, 1692754, -33823, 1673964, 2684892, 5340255, -9488656, -5927592, -9750113, --3598646, 22549, 1405528, -5284421, -2596308, -872415, -16027207, -5239860, -7661685, -3434363, --482110, 1501628, 603980, 2768643, -1089848, 689879, -8471286, 4940286, -7305203, -8251169, -5879810, 2668785, -15057618, -1509144, -4765266, 7520488, 14201309, 439160, -12259447, 9909563, --2866891, 2697776, 3330210, -3804804, -2945274, 1048509, -6606197, -8424578, 15343771, -12607340, --4096862, -2668249, 3018825, 464930, -18937584, -54842976, 27453968, -26381836, 10731513, 39107824, -5962489, -16411607, 11279658, 13620415, -5703717, -12418361, -2586107, -27022324, 8907762, -28085864, --17058000, 11256572, 1154273, 4846334, -25374130, -5178120, -18318572, -15561740, -22601192, -7900593, -7731478, -13471702, -13664975, 13259101, 1827509, -1130650, 4214974, -26004416, -1606855, -20228222, -17299054, 4756140, -49475876, 12441983, 26504244, -5684389, 15807627, 13289703, 8974871, 7182259, -25312390, 19830938, 722628, -18141404, -3841312, 20042464, 13011067, -16816944, 1198833, -19641422, --6332930, 1299765, 14220100, 19028852, -35002908, -27697170, -15500000, 2919504, -10414759, -3875671, -32541894, 5327370, 7694971, 25323664, -10302553, 5201206, -6482717, 25910464, -13220983, 1028645, -2572149, 19185618, -5368709, -2073396, 7019587, 7853348, -1016297, 3816079, 12537010, 464930, --409633, -551366, 12206834, -6231998, -3974992, 2900714, 5272609, 3547643, 1595580, 5719286, --2697776, -23622, -5613523, -208306, -4181688, -670552, -5752035, 9316321, -7090454, -10449119, -9780714, 6369437, 6726456, -7399155, -9458592, -75699, -16946330, -4716411, -8747238, -8946417, -3415036, -183610, -9058086, 2943663, 3646964, -1096290, -5373004, -5262946, 3897683, 2333241, -8035884, 18126372, 17517024, -30652644, 6363531, -6629282, -8096550, -7147363, 20492900, 10878078, --15029164, -8576513, 15624017, -28187334, 1547262, 10222022, 15650861, -3366181, 3422015, -32883880, --178241, -14576045, 10937134, 4025995, 18183280, -28916404, -14638322, -4216048, 3506841, -2496987, -5585068, 2060511, 15705622, 29710436, -18875308, -24306830, 6340983, -25328496, -7530689, 10608032, --18475876, -17883170, 1428614, 11026792, 15402290, 10984916, -6977711, -1544041, -32316408, -21729850, -28561532, -19853486, 38576860, -16368120, 7796977, 5681705, -377420, -28377386, 35512400, -16545825, --3448322, -6366216, 13816373, 26840324, -27192512, -15378667, 31742492, -23510650, -134218, -8843338, -6412923, 36887864, 114354, -2654290, -22887344, 28237262, -9279814, 7392713, 9217537, -17750026, --21589726, 2175938, 12292196, -6353867, 6248104, -50899656, -23884314, -7209640, -26108032, -12723841, -4234838, 16995722, -3671660, -4534949, -13407277, 461709, -1383516, -9600863, -3469797, 6088116, -379568, 8123394, 3628711, 7711614, -10148471, -1287417, -2229088, 10688563, 8214125, -6165963, -19209242, 7295002, -7924752, 11901354, 3076270, -980326, -6270116, 4627828, -4578972, -3962107, -8494372, 941672, -3957812, -3189550, 7087770, -1784022, 6388764, -1256815, 11749957, 2728378, -1561221, 1737851, 17754858, -19897510, 5756330, 16793322, 16594680, 37465000, -23553064, 34431144, --5883569, -22265110, -21807160, 5815386, 14461155, -9744744, -4434017, -15267535, -6211597, 29208462, --20336134, -1717987, 23483270, -7358890, 14072460, -9130027, -4304094, 24939802, -736050, 1455457, -24018530, 16747151, 5981816, -2745021, 20303384, 27730456, -27927488, 26074746, -24656870, 13315472, --17766670, 3946001, 21453362, 7502234, -48325900, 21715354, 13870060, 52076, 24672976, -38241852, --7318088, 26368952, 22366580, 3942243, 35087200, -18386754, 508417, -4248797, -5305895, 15234249, -6298570, 26442504, 21936008, -16148540, 14583025, -30176978, -9335111, 2672544, -1464047, -2119566, --4864588, -47356848, -26189636, -36517960, -24888798, 27588722, -16931298, -3868155, 3190624, 45016624, --10645076, -15506979, 35989140, 22264036, -991064, 29351270, 4463545, 5778879, -13554917, 328028, --11333882, -11744051, -6156836, 9711458, -11464341, -5726802, 5597953, 2433099, 9029632, -3312494, --1496259, 11926050, 6785512, 998043, -9194988, -7122130, -1137093, -2545842, 6928319, 11918534, --862215, 2390149, 2682207, -4366371, 28890098, 9268539, 2045478, 1509144, -9460202, 8039105, --16900696, -892816, 14531485, -648003, -3873524, 10926934, 6014565, 3616363, -284542, -9027484, -6231998, 7235410, 2222109, -11940009, 11514270, 29552060, -16320339, 11400454, 14586783, -21307332, -2728378, -26204132, 9960029, -2808909, -13966697, 20740934, 605590, 32358284, -1990717, -24241332, -40967544, -7379291, 4083977, 5640366, -38459820, 11562052, 33097018, 11788611, -14395657, -25196962, -2617246, 6124624, 28303834, 18239116, -9231495, -5523865, -22056804, 193810, 32027034, -43550968, -13211856, 30418032, -27381490, 10031433, 2844342, 10534481, 32039920, 10681584, 12367358, -5950677, --31457952, 32556388, -6045167, -16670379, 68305552, 33590404, 17429514, 2973191, 1553168, -32159104, --26351772, -11971148, 20084340, -697932, -18644454, -13182865, 25334402, -15489263, 17452062, 9882183, --12503187, 18619756, 8542153, -27076548, -13508746, -15893526, 4463008, 16916266, -33838436, 11107322, --34672736, -43840340, -27547920, 42005316, -14525579, 8664560, -9822053, -14622216, -2092723, -17425756, --12048457, -9292699, 2149094, -16707960, 1968169, 9738301, -9127, -14716169, -10900090, 5096516, -1664300, 18625126, 2507187, -21524228, -8342974, -12358232, 17643188, -3638911, -7132330, -17053704, --215285, 10149545, 4660577, 11569031, -5891085, -1976759, 3441880, 11778411, 7549479, -401043, --6718940, 8746701, -8228084, -936303, 4785668, -7746511, -204011, 13166222, -430034, 2374043, --14571750, -10340134, -11089069, 6505802, -11798275, 41917808, 69837776, -11564199, -2267743, -57142392, --19145354, -41991896, -27991376, 39072928, 2817499, 10683194, -32337882, 10592463, -28390270, -63919312, -9381819, 30857730, -2489471, 4085588, 33158758, -43782896, 50151260, 25088514, 15686831, -24713778, -33732672, 65077880, -12869333, 20206210, 49373332, 41783588, 73546480, 16107738, 26433376, 20141786, -17941152, 63279364, -16378858, -7345468, 23318452, 13986024, -6808597, 34889628, 2145336, 7490423, --20547124, -56196424, 2244657, 37814504, 5785321, 22992034, -40636296, 2746095, -54053236, 328565, --58094264, 4239670, 40852656, -4929549, -17275970, -55199992, 72691248, 13458280, 4937065, 75487808, --840203, -16918414, -12631499, 4166118, 15114527, -3867081, 335007, -5672578, -39707508, 23876260, -9224516, -24625194, -15214922, 20002200, -23965380, -41282152, -20234664, 9358197, 39832064, -41324564, -33170032, -1346472, 17719962, -6994354, 14469745, -9706626, -1415729, 3868692, 4090956, 13604846, -12137041, 2756832, 25451976, -1079111, 10466835, 13629542, 7825431, 6091874, 6077379, 22182970, -16350940, 8120173, -8590471, -3397856, 19051938, -25183004, 9772661, -14962592, 3623342, -5472325, -17178796, 20004348, 40274444, 22683332, 37988448, 21940840, 7952669, 40088152, 41401876, 39583492, -22552874, -6658810, 23600308, 26312580, 16106127, 31643172, 23734526, 98247, 7155416, 5467494, -5153961, 9323300, 6672769, -8026220, -8174397, 430034, 6585796, -1926830, -21905944, -72838352, -3676492, 98816464, 14500883, -19930796, -18915036, -44733696, -29227790, 1556926, 61727808, 11077794, --41000832, -2719788, 16908750, 4295504, 1357747, -3788161, 10834055, -29113972, -10910828, 15314243, -34238404, 34732328, -32383516, -12163884, 2583423, 4932770, 8771934, -37012416, 3700114, 6467147, --9750113, 27260158, -195421, 31409632, 46779712, 22762252, 9754944, 20760798, -26423712, 24523726, --21327196, 36479840, 63733020, 21420612, -34307124, -29189672, 28933048, 11023034, 54339928, 41293964, -12552042, -9653476, -12078522, 2212982, 2917894, -18322868, 21188684, 19043884, 3608846, 49616536, -33660196, -3894999, 24027120, 27296128, 12536473, 27314382, 1232656, -45952392, -5683316, -10547903, --10696616, 53723600, 24508694, 9322227, 42252816, 25707526, 26958436, 33753076, 11475079, -32925220, --16655346, -18254, -539018, -11094437, -9826885, -19627464, 12766253, 9035001, 19862076, -8451422, -22153978, 7069516, 22935126, 16203301, -5025649, -10789495, 3477313, 7094212, 258235, 3561065, -16803522, 2575907, 26265336, 36094904, 10102300, -1970316, 2614561, 26246546, 5849209, -6976101, --6675990, 20987894, -1012539, -5149666, -3848828, 7658464, 14176076, 29327110, -14855218, 3385508, --9627169, 3466039, 1142461, 24202140, -12349642, 12560632, 13973139, 9532143, -10471667, 4462471, -16254304, 3314641, 477278, 17004850, 2146410, 10798085, 5934034, 2928631, -3047816, 4225711, --2214593, 5015448, 1114007, 5290326, 901406, 9165997, 2126009, 4663798, 1585917, 7167227, -1376537, 7495792, 1595580, -526134, -14556718, -69439960, -15044734, 38685308, 20892332, 84694608, -4583267, -12350178, -38033008, -74446816, -81748264, -13673565, 35172560, 39511016, 25324200, -41345504, --54573464, -468151, -6723235, 21676700, 56847652, 28869160, -5381057, -34214248, -46319612, -29198262, -1860795, -28612536, 11072426, -23972896, -11807939, 37783900, 31343060, 27759448, 10886668, -39133596, --10883984, -37452652, -28683940, -15182709, 21994528, -4352950, 23363548, 57309896, 60016264, -25272662, -6912213, -44560824, -30288110, -21428128, -3831111, 7981123, 34821448, 36822364, 51210504, 36068060, -13092671, -25684978, -23324894, -5952288, 16485695, -42178728, 3080029, 48491256, 39017092, -10623065, -52867288, 46732464, 26651882, 48841832, -93347360, 21747566, -26499412, -29281476, 16081968, -15953119, --1284732, 93679144, 79765592, 27713276, -24553254, -2753611, -37397892, -7951058, -50310712, -18499498, --8393440, 18810346, 61791156, 31678068, 13025025, 10321343, -9853729, -31667330, -39782672, -609885, --26227754, 20338280, -2193118, -919123, 23776938, 18556944, 7415798, 19222126, 7203197, 30465814, --21725018, -1313723, -23961086, 9117679, -20819854, -20136954, 3498251, -6757594, 16798154, 28609850, -1962263, -28447180, -46036680, -14965814, -26616450, 1995549, 12173011, 20769924, -17689896, -7483981, -23580444, 2032593, -119969176, -136030736, -146262960, -147783376, -200384384, -11873974, -71760848, -23181012, -26607860, 66992364, 94001800, 96944392, 198101616, 212397408, 172939008, 128635880, 136284688, 129933496, -50126564, -19303730, -89222040, -89418000, -137203264, -44578540, -74321728, -55431920, -5118528, -116489712, --33435246, -104045584, -28242094, -119557392, -112658064, -52023864, -92994096, -9478456, -46922516, -43421584, --69514048, -46044732, -105008728, -74268576, -39382164, -36158792, -55503324, -34037616, -3990562, -44966160, -15251966, 67266704, -52278340, 79570176, 47782584, 106202728, 106757320, 93149248, 114941376, 97045320, -160286032, 159140352, 126995744, 169804752, 145689056, 222382672, 219070176, 258062032, 200934672, 216196848, -235676128, 212816160, 254544464, 188563024, 275626304, 220218544, 84031032, 107686640, 28484224, 42661912, --148963424, -125099512, -139563888, -148647200, -156631552, -202496976, -190563936, -209574000, -230017504, -270531392, --226011376, -207048560, -230041136, -250996272, -299143392, -240052160, -265689360, -267551760, -202892640, -228866464, --131945688, -163920112, -112076632, -104183560, -55062556, -40372156, -57016764, -9896678, 27023934, 129907192, -123240864, 89353040, 101184064, 108689520, 147529984, 150953072, 163422976, 172185776, 148242400, 150448944, -110693120, 156531696, 160251136, 121903520, 85893440, 66139812, 96290480, 95058360, 74155832, 44241920, -24610700, 37218040, -9754408, 4849555, -17558900, -14202920, -71130024, -65409132, -47492136, -33187750, --43352864, -33563020, -15937550, -13494787, -17284022, -32502702, -29576756, -15161235, -19100794, -13125420, --10730976, 1491964, 4895726, 316754, -4364761, -1374926, 435402, -1043140, -1068910, -1057099, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --2838974, -5248450, -212064, 2153926, 833761, -4591320, -3453691, 1197759, -3111704, -4616553, 2632278, --546535, 686658, -2649995, 1946157, 187905, -4090956, -185757, 4719096, 3835406, -2937758, --5174899, -4716948, 694174, -1088237, -924492, -4014721, 4366908, -1163399, 1230508, -1832340, --1111323, -402653, 1656247, -1189706, -2298881, -8810589, 2995740, -671626, 2847027, 1686848, -1196685, -231391, 5872831, 1099512, 1173600, 815507, -3004867, -1925756, -278636, 427349, --3008088, -716186, 1170916, -418222, -2842195, -1501091, 104690, 2775086, -4351876, -5907728, --7315403, 2585570, 4191351, 419296, 3466576, 2538863, 486942, -6710887, -174483, -1759863, --2352568, 111132, 374736, 2773475, -598611, 3949223, 2799782, -1256278, -4016331, -1959042, --717260, 1020055, 307090, 1290638, 1504849, 2755759, -58519, -270046, -1300301, -1132261, --1076426, -485331, -2240899, -1064615, -1267015, 690953, -148176, -288300, -688805, 1044214, --1577327, 3165391, 4140349, -963683, -63351, -5941014, 5283884, -6803765, 2617246, 11435887, --2460480, -4269735, 641024, 5961952, 625992, -1708860, -836982, -1722282, -1091995, -5389110, --2103997, 2640331, -4280472, -2453500, 233539, -248571, 4711043, -2893197, 872952, -1126892, -1022739, -611496, -2765422, 5215701, 8880919, 2240899, -514859, -1677722, 9612137, 437550, --4031364, 258772, -7182259, 16106, 3737159, -5516349, -707059, 1171989, -4405563, -1332514, -5059472, 712965, -550830, 4881231, -3259343, -5149666, 2903935, 1923072, -3597035, -1786706, --3850438, -4512400, -4853850, -2688113, -2777770, 3924526, 2789581, 765041, -116501, -2731599, -2521683, -595390, -1866163, 3325379, 3674882, -2629594, -529355, -1245541, -1679869, 513249, -4211216, -2131915, 940061, 4015795, 2653216, -924492, 1015223, -704912, -114890, 1701344, --245350, 25233, 1731409, -1856500, 748935, 380641, -597537, -1710471, 1306207, 149787, --767189, 402116, 184684, -613107, 192200, -314069, -572304, -998580, 5847061, -8523899, --5627481, -2029909, -1240172, 287763, 1096290, -8128226, 5644124, -2567854, 1844152, 1162862, -1878511, 3549254, -25770, -1177358, -2705293, 5849746, -462783, 3802120, 7225209, -1569274, -6143414, 5239323, -4543539, 3035468, 3072512, 3295314, -8017094, -798864, 478889, -2521683, --5042829, 76236, 5883032, -1383516, -2520609, -1981054, 1799054, 5452998, 2693481, -2789581, --46708, -2301029, 230854, -733903, -2719251, 5092221, -6585259, -5443334, -4998268, 1542967, --703301, -182536, -6143951, -6489696, 1579474, -139586, 366146, -642635, -345745, -4845260, --2866891, -5297306, 1036698, 4534412, -1415192, 4023311, 753230, 3576634, -7733089, 30065, -1116155, -2582886, -1167694, 1029718, -2756295, -341987, 2024540, 2184528, -1716376, -5175436, -4552666, 710817, 110595, -1146219, -661962, -4144644, 181999, 282394, -729608, 744103, -133144, -1464584, 623844, 667331, -418222, -599148, -206695, -250182, -280247, 224949, -2179696, 33286, -654983, 1801202, 804770, -145492, -601832, -181999, -2920578, 720481, --586263, 5018670, 7982734, 506269, -3035468, -6788196, 3106335, 2015950, 1883880, 8456254, --5528160, 195421, 1030255, -1532767, -2765422, 1250909, 533650, 5097590, 11246909, -989990, -1947231, 4702989, -2038499, 4195110, 7310571, -5100811, -189515, -1900523, -104690, 3261491, --5692979, 6152541, 1373316, 72478, 3244848, -532576, 4492536, -2433636, -1032403, -1263257, -7056632, 3289408, 4495220, -850404, 3704409, -6845641, 7917236, -3062849, 3115462, -7206419, -2911451, 5234492, 9649181, 3543885, 1804960, -6345814, -2427730, 1755031, -4801774, -5713917, --1352378, 11399380, 13202193, 2533494, 3109020, -3763465, -1669132, 7383049, 1443109, 3234647, --442919, 2249489, 1981591, -972810, 1691143, -1076963, 1275605, 892816, 4665945, 3797288, --5851356, 5219996, -1709397, 2685965, -1840930, 1975148, -1553168, -2173254, -38118, -3471407, -548145, 2546916, 581431, 1315334, -1231582, -1532230, -788663, 639413, 111669, 584116, --222801, 406411, -979789, 369904, 376883, 1855963, 111669, 1265405, -592169, 1133871, -5567888, 156766, 695785, 7811472, -6576132, -7741679, 12072079, -3124052, -1929514, 7894687, -4726612, 586800, -13843753, 14963129, -2735894, -1886028, -1567126, -810138, 599148, 929860, -4682588, 6984154, 4602595, -995359, 7835094, 4974109, 2521683, 2114735, -2874407, 3582540, --5622112, 4503810, -852014, 1891396, -4757750, -6914361, 896574, -865436, 2548526, 4188667, --2048699, -6616397, -3858491, 1644973, -7945153, 5157182, 1609002, -12670154, 5743445, 892816, -3290482, 839129, 1985349, 2172180, -504122, -3558917, -3091840, -8637716, -6345814, -3512747, --4405563, -952946, 533650, -6314676, -8951249, -1313186, 5851893, 10077067, -493384, -6665789, -1132261, -10496900, 743029, -689342, -4118337, 8909910, 8370892, 2842195, -300648, -2114198, --610959, -4631586, 2215666, 8547522, 4575214, 7070590, 1442572, -3175592, 3295314, 1737314, --215822, 709743, 404801, 243739, 1541893, 1604170, 1529545, -438624, 2669322, 754841, -5250061, 2080375, 1421097, 285078, 468151, 1418950, -358093, 2492692, 921271, 989453, --1381369, 3091303, 779000, -1047972, -439697, -13585518, 7031399, -2587718, -4828617, -3828427, --4618701, -6455336, 12463995, -15857019, 3750043, 3840238, 5199595, 7758859, 1282585, 2160369, -2928631, 2106145, 1625108, 2632815, 6831683, 1237488, -3745748, -1611, -649077, -4878546, --4407710, 2266669, 4581120, 4923643, 677531, 3511673, -8254391, -956704, -107374, -450972, --7821136, -4687957, -2809446, 5122822, 4604742, -78383, -8560944, 49392, -4632122, -3321084, --1674500, -2305324, 5394479, 7326678, 2234994, 7621420, -12183748, -8519068, 4067334, 2490007, -425202, 1612760, 808528, -3954054, -7659538, -5300527, 4076998, -3435437, 6228777, 6121939, --2220498, 5800890, -9220221, -4565550, -2586107, -3115999, 686121, 16811038, -2405719, 4753455, --2671470, -2435247, -1701344, 3566434, 3836480, -447213, 3099356, 2108292, -5232881, 1444183, -413391, 2248952, 500901, 273804, -2632278, 1692217, -97711, 1714766, 561567, 886374, --476741, -1006096, 514322, -1534377, -2194728, 747324, -1195612, -1899986, -548145, 565325, -762894, 746787, 836445, -113280, 604517, 1187022, 1006633, 330712, 303869, -397284, --623307, 1107028, 13911936, -2665564, 388158, 5863704, -13227426, 9106404, 4622459, -7451769, -8289287, 9273371, 3118683, -14281840, 8843338, 392990, -1339493, 7242926, 7823283, -434865, --2299418, 236760, -5537824, 5198521, -3024194, -5275831, -11108933, 2605435, -12075301, 3253438, --2953327, -1342714, 3492882, -9837086, -4037269, 8195335, -707059, -3812857, 5018133, 341987, --4289062, 3717294, 1352378, 373662, -1834488, 2837363, -5986111, -619012, -8745627, 8291971, -8288750, -10299332, 6897718, -7344931, -2768643, 7128035, 9961640, -712428, -4951024, 3019362, --617938, 1445257, -12159052, -9609989, 1928977, 1736777, -2623151, -2490544, 3163780, -365072, --4304631, 5153961, -4963372, 1752884, 3729642, -841814, 5844914, -5840082, 5910412, -30602, -9398999, -3211025, 2858838, 5311801, 607738, -3357054, -950798, -339302, 2762201, -909996, --4411469, 3735548, 817118, -1843615, 1654099, -1236951, -48318, -1729798, -490700, 1282585, --1472637, 963146, 2582886, -1325534, 634581, 188442, -845572, 1639067, 443992, 1396401, --2067490, 853088, -2116882, -2420751, 912681, -377957, 995896, 1034013, 315143, 3847217, -1676111, -5063767, 9760850, -3343632, 4748623, -9858561, -700080, -2603824, -8950175, 309775, -6319508, 11232950, 14697378, -8374113, -236223, -10437307, -782221, -6648073, 5931887, -6225018, --12307766, 794569, -7888781, -741419, 10202158, -6052146, -6037651, 10947872, 336618, 1879048, --1147293, -6441914, 2732673, 2333778, 13194140, -9108552, 6469832, -7725573, 1923072, 2559264, --7622493, -4694936, 12669617, 3462281, -9428527, -2437394, -3451543, -7570954, -321586, 12418361, -6651294, 8640400, 1973001, 3452617, -11339787, -1643899, 14414447, 1138166, -8963060, 4790499, -4763656, -6579890, -5729487, -3173981, -14814416, -2288681, 4395362, 7313793, 13001403, -3263638, --7117835, -2062658, -4431870, 10553808, -3931506, -9222369, -6285148, -2727841, -1262184, -2860985, --5332202, 11490111, -6592238, -805306, 1057099, 544924, 3748970, 2335389, -3390340, -4552129, -3411815, 4096862, 4333085, -998043, 1957968, -1207423, -721018, 1933809, -430570, -2021856, -2039573, 952409, -63351, -1326071, -446677, -3365644, 308701, -839666, -2893734, -1481227, -1309428, 1138166, 49392, 1337346, 6324340, -21955872, -15133854, -9700721, 1158031, -18396418, -2749316, 13674639, 4524748, 14079977, -7555921, -3484829, -1529545, -7318625, -2739116, -10986526, -19526532, 11148124, 7784628, -16497506, -3189013, -5310190, -10734197, 3711926, -1130113, 3480534, --13332652, -918049, -1195075, -9575630, 5569499, 1584306, 9784472, 3934727, -8182987, 12890271, --6096169, 5230734, 2714956, -110059, 10201084, 9479530, 2391760, -12303471, 15006079, -7598871, -10759430, 4903242, -5568425, -6194954, 12065100, 1768453, -1406602, 3138547, -10192494, -3656091, -5877126, -855772, 10669236, -6171331, -9647033, 3951370, 2729452, 324807, 10610717, 4569845, -2157147, -6773701, 7721815, 3024731, -5919539, -818191, -635655, -3406983, -2476049, -2873870, -4644471, 11650636, 19640348, 9123584, -3313567, 992674, -4509179, 4514548, 6043019, -100395, --5018670, -2956011, -6550899, 4035659, -3579318, 954557, -3095061, -852551, 4357781, -522912, -471910, -3992172, 4261682, -2254858, -1912871, 2335389, -3920232, 4289599, -3003793, 2294050, --2123325, -406411, 961536, -2930778, -2081449, -1288490, -4769025, -4794794, -2102923, -257161, --1690070, 3787088, 3499862, 2041183, -13863081, 18636400, 7727720, 21311090, -9553618, -11442867, -20308216, 690416, -2091649, 4455492, 1562831, 11891691, 15843597, 2071785, -14704894, -23554674, -3315715, -6497212, 1448478, 673773, -10188199, -645319, 12846247, 10502806, 8264591, 16534550, --3720516, 14011257, -9824201, 12409234, 4094178, 9616432, -6427956, 16935056, 9759239, 12368432, --19602768, -86436, 17861696, 10169946, 3257196, -4225174, 26861800, 11340861, -10508711, -6479495, -6564858, -10231686, -978179, -4907000, 1403381, 22551800, 23629836, 17156246, 6317360, 207232, -8908836, -7827041, -1959042, 9683004, -10001368, 23880018, 14904073, 11725798, 4639639, -908922, --11250130, 14183056, 536871, 12373264, -5500780, 4814659, -7931731, -4548907, -180926, 6246493, --9333501, 22233972, 9601936, -2432025, -10865194, -20928838, 10329933, 1848447, -6784975, -627602, -2621541, -4879083, 3070365, 8098698, -1371705, -2765422, 281320, -1697586, -2056216, 1842541, --2500745, -1837709, -3437048, 3639448, 2094333, -5244692, 2986076, 3390877, 3300146, -93952, --1529545, -579284, -13422, 1761474, -423054, 1305133, -3089155, 5142150, -6415608, 118112, -2246268, 5763309, 22985592, -1382980, -11419244, -5169530, -8962523, -380641, -14354318, 3673808, --12376485, 6943352, 1541893, -3366718, -9752260, -11631308, -17627620, -18267570, -5462125, 15778099, --1233729, -10353019, 4206384, -9874130, 7495792, -8441221, 14761266, -15257334, 3504157, -10833518, --11105712, -2067490, 1824287, -3263102, 6937983, -21942988, 8763881, 2070174, -5335960, -1557463, --1512902, -10881837, -17440788, -18671296, 13342853, 6584185, -7346005, 11558294, 308701, -4884452, --13771276, -28849832, -23783918, 13390097, -4212826, 257698, -2918430, -1400159, -1444183, -19556596, -7346542, -23095112, -12368432, 1009854, -798864, -4977330, -3175592, -3120294, 23695334, -7406671, --7831873, -6501507, 24793236, -4540318, -10074383, 15708306, -12453258, -7923141, -10279467, -8645769, --32168768, 6367826, 5046587, -10810970, -1654099, 7436199, -4282620, -2950643, -6079526, -5548561, --877247, -2935610, -2946885, 11129334, -1032403, -1272384, 7378754, 8839043, -4516158, -3297998, --845572, -1641214, 2156074, -5505075, 497142, 562104, 892816, -3300682, -4113505, -1704565, -3524558, -1553704, -3094524, -473520, 2182380, -7076496, -1242319, 3910031, 122943, -2856690, -3628174, -2500745, 3198677, -73551, 3049964, 3342022, 3337727, -6189585, -769336, -33990908, --25667262, -14683419, 29677150, -1512365, -4947266, -3626563, -2340757, -9780714, 10502806, 8119099, -26560614, -24512988, -4779225, 7548405, -17931488, -7176354, -6344741, 30595200, -448824, 7052337, -15573551, 1408749, 14988362, -16185584, -20344186, -13614509, -3745212, -3461207, 2427194, 9560060, --471373, -17136920, -11825119, -878321, -9149891, -19225348, 17157320, -2869575, -9590662, -122407, -5507759, 5449777, 3203509, -8688719, 1748052, -17877802, -7829189, -26512834, 12455405, 8008504, --3138547, -8325257, 9796284, -13210783, -3379066, 28600188, -3016141, 24238112, 10838350, 6498286, --6352257, -30443802, -12666932, -5856725, -16396038, -12256226, -7819525, 13625784, -6236830, 310311, --12241731, 25958246, -9290551, 10707353, 7254737, -17711908, -7137162, 3905736, 16402480, 29967060, -24919400, 10801843, -1713692, 10289131, 62814, 894964, -5891622, 3027952, -6090801, -4224637, --128312, 1764695, -3685619, -4868346, -8796630, -6991670, 3709241, 2881386, 3018288, -3233574, --1381906, -17439714, -366146, -8042327, -3817152, 3159485, 2379412, 1008780, 7166153, 179315, --1065152, 719407, -2959233, -12653511, -1253057, -7191923, 3546032, -6381785, -7010461, 813359, -8007430, 3682398, -2370285, -4725538, -4450123, -2076617, 4260608, 1140314, -2036351, 17648558, --816581, -9993852, 10902238, 6263673, 36871756, 1315334, 459025, 13032541, -16555488, -11409581, --3237869, 3083250, 6025302, -4408784, 15650324, -9507984, 2243047, 14710800, 6676527, 5492190, -5515275, -10758356, 2136209, -260919, -5199595, 2311229, -7755101, -13898514, -7192997, 1175210, --13651017, 17860084, -1189169, 1857037, -2328946, 12319577, 13922136, -2525441, -10072772, -849867, --3129421, 16375637, 21027624, -14769319, -10083509, -7419019, 5361730, 15625091, -13748727, 4743255, --469225, 3365107, -7079180, -9561134, 3177202, 10350871, 2052458, -12539157, 11608760, 33770256, --10740639, 6389301, -2383707, 2731062, 13145821, 3808026, 15471009, 12942884, -3218004, 19767050, -35836132, 1588601, -13042205, 35084516, -550293, 33554968, -11414412, -16199006, 15552077, 6096706, -23467702, -3631395, 32990718, 10536629, 7754564, -9669045, 15695421, 1983201, 1692754, 3828963, -12839805, 2850785, 14643691, 1948305, 3732864, 684510, 2311766, 2513630, 4764730, -1279900, -5325223, 12412455, 5245766, 5791227, 1861332, 3481071, -6669011, 6177237, 2431488, 2942590, -4522064, 2542084, -299574, 129923, 3558381, -3207267, 1319092, 386010, 3180960, 8944806, -3269544, -55835, -4280472, 4828617, 929324, 1344325, -689879, 4725001, 2753074, 6876780, --23116588, -7454453, 36093296, 6043556, -16664473, 4976794, -12622909, 4685810, 6926172, -2918967, --19084688, -7168301, -28534152, 11859478, 9797357, -10956462, 10626823, 16592532, 3415036, -4432943, --16665010, 3822521, 26675506, -12738336, 16011101, 15308337, 2420214, 11522860, 10663330, 523449, -13297756, 8894340, -25397216, -3570192, -10232760, 25987774, 17220672, -18076444, 11144903, -2051384, -13707925, 43316892, -4086125, -7289633, 4334159, 38989712, 16004122, -2363843, 4991826, 7090454, -22498112, 19879794, -13566191, 23858544, 10939819, 22119618, -15631533, 2405719, 4443144, 4733054, -13667660, 20301236, -13180181, -10455024, 16068010, 8055211, -5445482, -5709086, 65498, 24360518, --45873472, 10830297, -16303696, -12020540, 2222646, -15698642, -14595909, -2080375, -25079388, 18133888, --5322538, 19158238, -678605, 16761110, -11040750, 6754373, 418222, 5560372, -503048, -6436009, -5085242, 3590056, 4065187, 8187282, -3972845, 4152160, 5650030, -4677220, 453119, 7823820, -2914672, -4187593, 8728984, -5718212, 1190243, 4554813, -5578626, -4210142, 1800128, 1752884, -9735617, 8053064, 5786395, 2932389, -901943, 6283537, 1440425, 2772938, 2798708, 5215164, -6366216, -5247913, -4363687, -8493298, 6726993, 2653753, 575526, 2119030, -8945343, -8573292, -5996311, 7803956, 8240969, -10150618, -12122545, -31379032, 1490354, -17498770, 28650654, 3519189, --7358353, -4218195, 17222282, 4971425, 27927488, 11274289, -7162932, 1188632, 5954972, 12715788, -21030844, -23415088, -20223390, -4227322, 35321276, -10826539, 4575751, 10086731, 15521475, 18766860, -26868242, 23175106, 2115272, -5481989, 25099788, 1979980, -15862388, 8519068, -14710263, 10723460, -2747169, -13144747, 12145094, 47095392, 26295400, -16579111, -12502113, -1671279, -12972412, -12896713, --11101954, 8123394, -6288906, -10966662, 2531346, 12991202, 7820599, 4337380, 18571976, 5004711, --4394826, 19573776, 16529719, -14067629, 9663676, -15886010, -12367895, -14079977, 42950, -34074124, --10021232, 23790898, 17604534, -8076149, 11847667, -2821257, 925565, -20925618, 4795868, 12627741, -20064476, 11279658, 13316009, 7299834, 6415608, -8907762, -7807714, -9477382, 5419175, -2021319, -824634, 4080756, 4255776, -404801, 10407780, -3223910, -4489852, -4910758, 7318088, -9469866, --3794604, -11687143, -581431, 2321430, -5009543, 471910, -2754685, 7320772, -1365263, -15424301, -271657, -1051193, 4636417, 6045704, 1990181, 6868190, -403190, 11162620, 2312303, -881542, --271657, 1218160, 497679, 566936, -12811351, 10594074, 8552354, -16271484, -6954089, -35381940, --2815351, 29511794, 370978, -21618718, 3502009, 1017370, -14508936, 19673634, 11391327, -7901666, -5618891, 8919036, 12164421, 6753836, 2124398, -8730058, 4780836, 7004018, 18821084, 28102508, --7698192, -18912352, -9944460, 5363878, 5866389, 23128398, -8826158, -18111340, -14097156, -14490683, -27994596, 51287816, 18640158, 2574833, 56273736, 3384971, 23337778, 13311714, -4723927, -11795054, -10011569, -15969762, -10636487, 11405823, 776852, -33896956, -35102768, -8781598, 14674830, -18315352, --22969486, -12648142, -17004312, -14001057, 11871290, -9750113, -26046292, 11716671, 1035624, -7593502, -6102075, -5869610, 13142600, 52789444, -32331440, 26613228, -36761160, -20846160, -12183748, -8318278, -20445118, 8260833, 9806484, -3970697, 11360725, 23691576, 5929203, 555661, 310848, -6872485, -3260954, 6496138, 18983756, -1140314, -9403831, -1403381, 14501957, 9322227, -4096325, 5500780, -6582575, -5232881, -179852, -2237678, 18197776, 6594923, 8628589, 6405944, 5207648, -7491497, --5310190, -1177358, 4671851, -9167071, 1349157, -9040906, -6237367, 1475858, 969589, -10391137, -10198400, 13934485, -1363652, -1773285, 8476655, 125091, -3638911, 12335146, -5059472, 8560407, -798864, 28574418, 18377628, 16569447, 24336358, -28398860, 10922639, -29744796, -1192390, 38876432, -34575024, 14739254, 537408, 6727530, 4393215, -11148124, 9010841, 11194295, -48985176, 3003793, -7202660, 14897631, -17949742, -27581744, 20234128, 9573482, 5149666, -11788611, 23999740, -3370476, -18656802, 15502684, -1846836, 2368675, -5418101, 18894098, -11207180, 5769752, 11369852, -987843, -24146306, 13981729, -1348083, 12389907, 14078903, -722628, -10893648, -36741836, -6771553, 3929358, --21755620, 2109366, 17369922, -33387466, -14810121, 5129265, -14348412, -2317672, 17631378, 1030255, --12459163, -16262357, 7253663, 7070590, -33750928, -11247982, -2792803, 149787, 21216064, 10399190, -2383170, 37056440, -4655745, -1190780, 1475858, -21121576, 20029580, 181462, 32861868, -12722767, --5477694, 9893994, 4978404, -27987618, 928787, -3853660, -11184632, -9036611, 3519189, 1174674, --7884486, -687732, -4890357, -3447248, 1039382, -11963095, 3476776, 1661616, -1653026, 4600447, -1282585, -7890392, 1636919, 2281702, 2127620, -7632694, 11203959, 2215666, 14570677, -10706817, -1384590, -9018894, -3159485, -1643899, -16069083, 3443490, 1529545, -654983, -2144263, -2889976, -6001680, -7237020, -5561446, 7028714, 9413495, -9306120, -34672196, -30218854, 5537824, -15552613, --4867272, -23284628, -29007136, -30520038, -20055350, 21777632, 29727080, 802085, -24465208, 1948305, -1151051, 338766, 11307575, 18978386, 18977850, 484258, -12284143, -30447560, -17454210, -26650808, --5710696, 129386, 2263448, 2767570, 3765076, 7360500, 9536975, 17961554, -28161564, 12382928, -4939750, 6234145, 15130096, 26743688, 30026116, -17275970, 13389024, -23884314, -7450695, -21671868, --2100776, -8441758, 49908056, 17711908, 35957468, 1521492, -19269370, -8278013, 23032298, 24921010, --14629732, 46033460, -19270444, 2874944, 2036351, 7997229, 16919486, 51208360, -3571802, 12540768, -28525026, 6512781, -22582938, 14358613, 52405044, -9562745, -12668006, -30902290, -2564632, 19328964, -11941083, 1621887, -29656750, -22476100, 3786014, -23453742, 7074348, 1037772, -29524142, -3348464, -3052111, -4644471, 21343304, 20033874, 455803, -5850819, -12712029, 13868449, -5871221, 24102820, --5483600, 311922, 16525424, 16571594, 23598698, 18216566, -13297219, -5221070, 3192235, -4408784, -1627256, -10151155, -9737765, -9885941, 5184563, -12106976, -14077829, 8361228, 10950556, 983011, --12087649, 7705708, 4326643, -2988224, -3051038, -8247411, -127238, 4702989, -2042794, -7374459, --9552544, -1832877, -6256157, 7879118, 4478041, -4090420, -5290326, 10084046, 46531140, -2442226, --289373, 19723026, 3806952, -64277408, -20220706, 45590004, 15151571, -13423383, -25621090, -3629784, --16936666, 23490250, 12192875, 4380330, -13588740, -30449170, 6495065, -52421688, -6430640, 25578140, -34936336, -4077535, -29721710, -20264192, -61336964, 17956184, -10675141, 23969676, 18116708, -17464410, --12711493, -54444080, -40893996, 21233782, 57941256, 23106924, 27504970, -19352586, -34490736, -33111514, --13894219, 49228916, 66342212, 34572340, -77173048, -28325846, -59144384, -31654982, 73260328, 17821966, -16225850, -9776419, -70604432, -57835492, -58016420, -10827613, 5598490, 36506148, -13593571, 27760522, --55994564, 34754340, 13900662, 4199941, 70351024, 4476430, -6523519, -3409130, -95494304, -29213294, --6505802, 30029338, 15663209, 13705778, 42119132, -45089104, 2886218, -29850560, 32491428, 23439784, -2236067, 6451041, 6909529, -5360119, 19319836, 10322417, 5125507, 16422344, -11236708, -21021718, -5091147, 15018964, 22858352, 18806588, 12429635, -15793132, -25545928, -35830228, -3204046, 2521683, -28958280, 35851704, -5405217, -27370752, -46979964, -22594750, 3350611, 35866736, 57643292, 14977088, --56385940, -57922464, -59074052, -694174, 48194900, 42381664, 44775036, -15087146, -21800180, -42074036, --42408508, 15494631, 28681792, 37330244, 18991272, -29693256, -27988692, -15897821, -4413079, 34633544, -18415210, 5669894, -1547799, -21342766, -15317464, -3241627, 4268661, -27590334, 52947284, 22723598, -24268712, -65591668, 13151727, -91370064, -20199768, -275415, 12898324, 5230734, -58566176, 31687194, --16267726, -10576894, -11059541, -12491912, -14395657, -18146774, 38287484, -11010149, -32992866, 10472204, --9380209, 3986267, 18432926, -37246492, -13370233, -2342368, 15544560, 1551557, 42121820, -3636764, --24188718, 55632176, -47182364, 27488328, -43759812, -14509473, 21266530, -35556424, 2542084, 25681220, --13485124, -3121368, -2696703, 33083060, 50514720, 29196650, -17063906, -7064685, -7953206, 3144990, -16195248, -6765647, -10105521, 9770514, 5165772, -91743720, -3737159, -3461207, 13299903, 11322608, -554588, 75162, 26038240, -28933048, -7458748, -2891050, 19834158, -73680704, -10360535, 66432408, --17089138, -26920318, -282931, 50247360, -9307194, -12144557, 13672492, -19918984, -20783884, 30992484, -48118128, -17555142, -24507084, 8184060, 14406931, -7755101, -25831544, -676457, 3715147, -5383205, --3782793, -8211441, -11259257, 5135171, 344134, -10475962, -1881196, -555661, -393526, -9674951, -5466420, -12903155, -13511430, -8078297, -8258685, 12321187, -1826435, -2823404, -294205, -7321846, -10328323, -13712220, 3901978, 180926, 978179, 9162239, -433792, -16449725, 1874216, -4510253, -3062312, 1992328, -14595909, 22780506, -6041945, -2416993, -2188286, 1868311, 5859409, -785979, --5348845, -12221866, -22310744, -67123360, -55140936, 48186848, 41077604, 3758633, 43885440, -48110612, --2922725, -92759480, -33041720, -16550120, 44715980, 40695888, 24888798, -37435472, -12973486, -1791001, --17926120, 8642011, 16079821, 20918102, 27991912, -21612812, 15625628, -40227736, -25500832, -6499896, --8668318, 911070, 26381300, -31792958, 27180700, -12379169, -17719962, -7145752, 2434710, -39873404, --1010928, -36114232, -13558138, -14119705, -34313032, 46849504, 21456046, 10524817, 11365020, -9241159, --48062296, -71184248, -41641320, -41924248, 28233504, 6635188, 30441654, 42484744, 35006668, -11643119, -8310225, -24672440, -18966576, -22550188, 17466558, -23891292, -1251446, -22807350, -23567560, -14883135, -27558658, -22415434, -6392522, 2116882, -3293166, -32270774, -34713000, -21106544, -12514461, -46750184, --27857694, 6926709, 27963458, 29180544, 37263136, -2567317, -30575872, -39592620, -30466888, 15353434, -4851166, -5023501, 18084496, 45932528, 12128988, 12159052, -11754252, -8871792, -15262703, -9385040, --4985384, -14805289, -3491272, 17342542, -3850975, -7866233, -14292577, -15906948, -17867600, -5431523, -8586176, -4911832, 3638911, 1998770, -32106492, 3314104, -15338939, 13255343, 25695178, -13129715, -17736604, -2423435, 4291209, 441308, -25391310, -4197257, -8295730, -6752226, 23113366, -14740328, --99975568, -135506752, -128042104, -121785944, -146004736, -24419574, -40365712, 25920128, 41320268, 130760816, -84006872, 110859552, 152775200, 167980464, 114683680, 145937088, 83072720, 38725572, -5827197, -27396522, --37221796, -61609696, -60469920, -83566104, -35329328, -30740154, -78617232, -58704688, -56209848, -63931660, --104020888, -70853000, -54539104, -43803296, -80052288, -11157251, -23970212, -33285460, -77518792, -71603544, --59025200, -50471236, -36640904, -14903537, -49276160, 14271103, 25593174, -38579544, 43280924, 60108604, -57759256, 104812768, 85182088, 65615824, 72219872, 72659576, 72108208, 110221744, 124031680, 121886344, -83422760, 131459288, 129814312, 135242080, 137529152, 156161792, 138625440, 146378928, 194237216, 99092408, -100071664, 101423504, 94518808, -4447976, 43201464, 54335096, -31084288, -16762184, -53597432, -98354752, --89000848, -94003952, -169333920, -124311920, -75579616, -132449816, -140167872, -115754736, -123284352, -122127928, --146591536, -134413680, -135646880, -127032248, -118471304, -108113992, -100013144, -100224136, -83204792, -70188352, --110928264, -16963510, -49847392, -57363584, -12874164, -7123740, -56115360, -7131793, -21639656, -8070781, -20755430, 24841018, 65246996, 38691748, 54559508, 60465088, 65846680, 59726888, 83419536, 81347752, -86646136, 80821624, 97010424, 99584184, 97806072, 79061224, 102270152, 107405320, 83400752, 56191596, -54465016, 32988570, 28629178, 7789460, -3415573, -3235721, -17642116, -15925739, -12101607, -7037841, --15665893, -16919486, -15651935, -7326141, -15650861, -20058572, -11640435, -3979287, -13694503, -18891950, --15096273, -12797392, -20027432, -20374788, -15313169, -9833864, -8535174, -8010114, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --6308233, -7975755, -615791, 3212099, 1615982, 3783329, -6770479, -3656628, 4343286, 2100239, 44023, --3766150, 767189, -10504416, -6765111, -368293, -4034048, -4562329, 1868311, 8203925, 1373316, -6246493, -1451699, 6172942, -3692061, -3295314, -415538, -5578626, 1102196, 2767570, -2019172, --139050, 1442572, 258235, 2510945, -303332, -5971079, 2130304, -3703336, -2793339, 1669669, --3680250, -5572720, 5533529, -5847061, 5265630, 4915590, 3234110, -272730, -6860674, -3997004, -763967, -1304060, 8812199, -5410585, 2136746, -708133, 1156957, -6687801, -11156714, -1979980, --3357054, -3733400, -887985, 4696547, -1032940, -5040144, 4397510, 1858647, -2246805, 3668439, --731755, 1089848, -5143224, -438624, -1293859, -99858, 1952063, -2366527, 1578401, -4711579, -3154654, -754841, 322123, -1735167, -1567126, -3221, 1910187, 681289, -82141, 715649, --49929, -2850248, 801548, 204011, 1761474, -312459, 46171, -34897, 26307, -207769, --1028645, 4281546, 4270271, 605054, 7701413, -87510, 3325379, 4138738, -50466, -3758633, -392990, -5340255, -6840273, -2596308, -7794829, -8045011, -2621004, 5288179, -1891933, -1832340, --4190814, -1060320, -7326678, 3579855, -2053531, 1808181, 4394826, 1490891, -1544578, 3022046, -2864206, -3575560, 2481417, 329639, 661425, 2679523, -6391985, -2757906, 4524211, -2902324, --213675, -1846299, 5021354, -6437619, -537945, -5391795, 3493419, -320512, -397821, 4871030, --2107755, -2340757, -1685775, -4552666, 323196, -2062121, -363998, 301185, 3096672, 3148211, -1058173, -1398549, -5376226, -8791798, -2727841, -610959, -2174864, 4725538, -1908576, -2710661, -3770445, -2429878, -3773129, 8343511, -1815161, -4667019, -421444, 766115, -1400159, 4115653, --535260, -3678640, 52613, 161598, -794569, -1108102, 3272228, 739271, 461172, -1952600, -406411, -594853, 220654, 1276679, -287226, 723702, 1518271, 191663, -308164, -327491, -643171, -1854889, -693637, -370978, -856309, 771484, 639413, -304406, 8938364, -5683316, --2679523, -4112431, 3321084, 643708, -398358, 6447820, 1553168, 1890323, -9341017, 1724966, --4353486, -5069672, -6584722, -105764, 245350, 7828115, -6387153, 2962454, -2673617, 9678709, --3480534, -3204046, 6894497, -2630668, 2386391, 1040993, -446677, 1139777, -4606353, 752156, -228707, 1954747, 9106404, 3171833, 861141, -3881577, 3194382, -7066295, -1949378, -1351841, -3883724, 3310883, 5507759, 3606162, -4107599, -6058588, -2631204, 4632122, -554588, 2405719, --960462, -666794, 9260486, 2183454, -687195, -11034845, -4908074, 289373, 3854733, 5907728, -8325257, 4656819, -1991254, 1492501, -2019708, -2821257, 5978595, -3754338, 6155225, 282931, --5525476, 2000918, -2838974, 4794257, -4096325, -468151, 4182225, 4782446, -4775467, -1836099, --884763, -1961190, 2897492, -642098, -2030983, 1330366, 712965, 732829, 826781, 1160715, -646929, 694711, 327491, -343061, -397821, -1772748, 2780455, -105227, 185757, 318364, -62814, 441308, 1494649, 1435593, -44560, -374199, 1858647, 1401233, 1119376, 4686883, --1122597, -785442, -1729798, -5486284, 213138, 3940096, 3925063, 7342247, 3365644, -9642202, --8054138, -6989523, 288837, -1184337, 511638, -3808026, -2365990, -592706, 2927020, -39728, --6177774, 6674916, -954020, -6202470, 1269700, 1464584, -127238, -595927, 2683281, 3534221, --2212445, 5401995, 267899, 3164854, -7368017, 5240934, 1864016, 3022046, -5071283, -557272, -3707094, 3172370, 8046085, -301185, -11112154, -3039763, -5323075, 2603287, 1799591, -461172, --2967286, 847719, -4557497, -1615445, -8298414, -4884989, -280247, 4619774, 5156108, -3724274, --3187940, -3263638, 5299453, -1810329, -653372, -7969849, 4801774, -7866233, -2732136, -343597, --1663763, -2138357, 8366060, -714575, -1945620, -2241973, 1659468, -5045513, 579821, -8748312, --7030862, 2559264, -2455111, -1308891, 3124589, -1586454, 4168803, 819265, 1914482, 2933463, --785442, 1415729, 956704, 539555, -617402, 1070521, 433255, 261993, -651761, -690953, -170188, -2565169, -48855, 1604707, 384400, -102005, 303869, -1575716, -509491, 957241, --471373, 2231236, -2899640, 4105989, -3301756, 3221, 5667210, 10318659, 7138773, 1532230, --8079371, -6062347, 2168422, -1387274, -5181341, -1701344, -6674379, -2870112, 13411035, 1549946, --1428614, -2498597, 8053, -3121368, -2158221, 9067213, -9409200, -1110249, 929324, -2013266, -2362232, 5484137, -2520072, -3098282, 1387274, -3854196, -3760244, -8749385, -3240553, 2356327, --7832410, -1313186, 3886946, 5900212, 2099702, -12286828, -3707094, 2468533, 6193343, -4820564, -10688026, -1246077, -5424544, -3026878, -2313914, -4224101, 5810017, -4345970, -1159104, -5739150, --4502200, -2107218, -4578435, 6142877, -2261300, -12317429, 4704063, 8262980, 110059, 2985539, --14969035, 11680700, 211527, -9816148, 989990, -6631430, -1406602, 1035087, -7124277, -8359617, -5550709, 2593087, -7238094, -498753, 179315, -4482872, -567473, -1660542, 1112397, -3979824, --2053531, -792958, -1982127, -1014149, -2925947, 950798, -199179, 1493575, -3181497, 738198, -1787243, -54761, -1811939, 1152662, -1759326, 1656247, 1351304, -1356673, 1317481, -260382, --936303, -446677, 453119, 625992, 374736, -11076721, 2500208, -8153459, 8719320, 2225867, --3313031, -6579353, -11533598, -5007932, -8348880, 2894271, 16143708, 2765422, -4180614, -230854, --2199023, -2468533, -7256347, -4764730, -7471096, 2047089, -548682, 1664300, -2604898, 1264331, --7895761, -520228, 1824824, -5355824, -1967095, 703301, -2918967, 801548, -2685965, 11941083, --14548128, -2567317, 1194538, 3944391, -1489817, -5955509, -8918500, -6308233, 4803384, -1247151, -5327370, -4505958, 13817447, 1838783, -2666101, -105227, -8190503, -10455561, -5286568, 4008815, --8941585, -509491, 10523207, -258772, -4970351, -9945534, -16865262, 736587, 8664023, -2360622, -9940702, -862215, -3107946, -6194954, -5508296, 1006096, 3949223, -3142842, 14412300, 4393215, --4625143, 2258079, -5920076, 2217277, 2725694, -1940252, 3124052, 5881421, 2482491, 311385, --3868155, -10549513, 712428, -2364916, -1067836, -1575179, 761820, 268972, -139050, -4640712, -738198, -2644626, 878858, -2604898, -879931, -650151, -244276, -199716, -512712, -1859721, --1702955, -2041183, -3062312, -3216931, -1364189, 205622, 856309, -1670205, -52613, 137976, -316217, -1261647, 9472014, -4160213, -10955925, -2996814, -8182987, -4258997, -3556233, 11605002, --2917894, -3884798, -4900558, 7461432, 6700149, 5923834, 16365436, 17153026, 7936563, 10664404, --4020626, -4928475, 7086159, 10523207, -4573604, 4629975, 3241090, -9128416, -8654896, 5113159, --1275068, -105227, -8637179, -10953777, -2616709, -8877697, 10049150, 18808198, 3875134, 7428683, -2153926, -2202245, 6709276, -12832825, -3439732, 2681133, 7149510, -4219269, -10378252, 15154792, --35433, -4641786, -3707631, 6224482, -1862942, 5550172, -3792456, 8704825, -733366, -217970, -10737418, 3348464, 4951561, 1939715, -1640141, 8032126, -12222940, -4892505, 4570919, 13835700, --8412230, -971200, -1716376, -1941862, -5764383, -1263794, -2990908, -3958349, -565862, 935229, -3908957, -1619740, 11101954, 4050154, -6370510, -1532767, 832150, 4242354, 1503239, -1922535, --3841848, -835371, 2456721, -2470143, -2161979, -1889786, 2280091, 1421634, 2252174, 1175210, --2040110, -807991, 71404, -2061047, -351114, 1615982, 1005559, -253940, -2287070, 3032247, --408559, 1887638, -1272384, 926102, -2657511, -257698, -383326, 128312, -1768453, 6856916, --6709813, -2596845, 6191196, -4805532, 2684892, 4668630, -9159555, -9773198, 2804614, 7516193, --2538863, 6862284, -4968741, -2184528, 13055090, -14771466, 8927626, -4192962, 117575, 416612, -16117939, -3563212, 3193308, 5140539, 8885750, 5209796, 7785702, -1273458, -1238561, 2557116, -1262720, 1312649, -7763691, 12103218, -16106664, -3531000, -4231617, 9021579, -1803886, 10990284, --492848, 1052267, -19167902, -5246303, 11704323, 19894826, -169114, -9849434, -8299488, 8180839, -6579353, 4954245, 4697621, -8441221, -3858491, -4880157, 2596308, 376347, -5183489, 3077344, -2684355, -2409477, -2647311, -11558294, -3037616, -4231080, 16557636, 1531156, 3133179, 6287296, -512175, -12936978, 661425, -7782481, 6482717, 15462956, -8174397, 4792110, -2340757, -8002598, -3893388, -6706055, -1146219, 2819109, 2094333, 3550864, 1509144, -545461, -2921652, 3359738, -7257958, 1231045, 3604551, 5970542, 2667712, 6748468, -2019172, 6383395, 335007, 162135, -1403381, 724776, 1845762, -183073, -3116536, -1730872, 149250, 1717450, 1809792, -1213865, -3101503, 2936147, -2449742, 4146791, 6984154, -12017855, -4626754, -4521527, 2284386, -693100, -17877264, -2247879, 620623, 11348914, -10126996, -7352984, -9495099, -9938017, -2417530, -366683, -4457103, 19123878, -1760937, -11010149, 19794430, 324270, 5528697, 13535589, 9321690, 12632036, --3320547, 9978820, -6461779, 13224204, 11546483, -3137474, 6007049, -5325223, -4962835, 4993437, -15115601, 6814503, 5961415, 2141578, -4854924, -8366597, -8539469, 1379221, 10380399, -6060199, --7320772, -8959302, -3432753, -17757006, -4198331, 3401077, -13081934, 6305549, 890132, -5954972, --15363098, -10247792, -24159, -20328618, 6328098, 4496831, -498216, 5660767, 3633006, -1986422, --10641318, -6418292, -1248225, -6712497, 6201396, -7034083, 16773458, -11337103, 537408, 7388418, -587337, -5070746, -19491636, 3381750, 9451612, 2302639, 485331, 10532870, 5738613, -6041409, --69793, -704912, 709207, -432181, -3439732, -6845641, -2128156, -7395397, 328028, 1847373, -814970, -1916629, -3913252, -1772748, -2645163, 3210488, 872415, 4201015, 2895882, 2412698, -824634, -347892, -1561221, -1301375, -3456912, 1542430, 107374, 1536525, -1733556, -223338, --2921115, 178778, -2313914, 865973, -24816858, 8718784, 11337640, 19942606, -54224, -14808510, -4185446, 7137699, -15328738, -15944529, -9960029, -391916, 8521752, -438087, -6238440, -324270, --5457293, -3677029, -9877351, 16510391, 12904766, 4857071, -20233054, -6063420, 3267933, -1149441, --4495220, 25629144, 9402757, 8055748, 7557532, 12167105, 9141838, 2226941, 9571335, -647466, --15891916, 8613557, -16347719, 5005248, -16183974, 13690745, -4265440, 16530255, -8998493, 4021163, --7274064, 5961952, 9687299, 25229174, 5353677, -32068910, -1677185, -4458176, 6910603, 14021458, --2813741, -6223945, 10324028, -1814624, -5033165, 13812078, 900869, -606664, 726923, 5918465, -11070815, 8751533, -9463960, -7050726, -5960341, -9623411, 2285996, -885837, 10947335, 7852811, --14702210, -3548717, -8303246, 7153805, -4025995, -3931506, 2611877, 483184, -5643050, 4872641, -1221918, 812823, -803159, 2771865, 2903935, 459562, -8303246, 2331630, 1494649, -1069984, --1431835, -2771865, 147103, -3709241, 1761474, 4185446, -1231582, -1243930, 4149475, 641024, --3785477, -2937221, -645856, 1998234, -1623498, -401579, -2309619, 628139, -1528472, 15569, -3993783, -2647847, 27016954, -10253698, -18022220, -5745056, 7026567, -4465156, 12978854, 18781356, --7568806, 17223892, 11082089, 8652212, -2857227, -2090039, -3482682, 16706349, 3048353, 2001455, --9742596, 4224101, -5095442, -439697, -16084653, 10880763, -14760192, 54224, -10413148, 17426830, --8921184, 375810, 17224430, 13085155, 8848170, -1067836, -6846715, 7995619, -257698, -1562294, --22011708, -6549289, -13297756, -10813117, -8434779, -3988414, 11436424, 7175817, 6667400, 13959, -16834662, -8933532, 17814450, 15653008, 16803522, 29389388, -11373073, -8885750, 12922483, 2419677, --11414949, 17727478, -5843303, -8580808, 5750425, -2209761, -6160594, -5094368, 7612293, -10305774, -4657355, -6391985, 16284905, -6949257, 243739, 4738960, 11870216, 16131897, 1279900, -14124000, --15340013, 4989679, -10226317, -32905892, -17328046, 5225902, -391379, 9489730, 1194001, -5414880, --648003, -3154117, 1372242, -5729487, -2536715, -3941169, -1676111, 423591, -739808, -10298258, --2730526, -6755447, -6077916, -4774393, 2052458, -505732, 379568, -7509214, -5254893, -311922, --329102, 1427003, 3811247, 3134789, 2304787, -5415417, 212064, 1192390, -7013145, 2415919, -355409, 2990908, 1319092, 3824669, 2116345, -1617592, 3204046, -2537789, -1927367, -25209848, --21310554, -1031866, 4474819, -14551349, 643171, 1285269, 23431194, -15287936, -17490718, 5665062, --7373385, -31139, -12781823, 12169790, -12986370, -17396766, -10528039, 20098836, -13717589, -11206107, --2587181, 8158291, -6017786, -14421963, 4466229, -5842766, 77309, 6558415, -19026706, -1436667, -10525354, 16924318, -2580202, 25871810, 11336029, -2952253, 1141388, 11764452, -4855461, -10524817, -1986959, 14013941, 1552631, 6726456, 304943, -11480984, 3957812, -25201258, 2283312, 1366873, --3220152, -14844481, -13484050, 1633698, -6156299, -10193031, -6835978, -8206609, 9634685, -16598975, --9483288, -4788352, 7210713, -9767829, 20340428, -3066607, -17114908, -1484985, -10193568, -27137750, --8126615, 1793149, -836982, -17631378, -9423695, -4027606, 4007205, -10480257, -5211406, 17388712, --6198712, -23741506, -8362302, 3069291, 1806571, 7797513, 6588480, 4918812, -5525476, -6900939, --1653562, -4823249, 3455301, 1039919, -3053185, 5076652, 2108829, 2982318, -2061047, 2442763, -1825898, -19327, -1019518, -1762547, -2211908, 38655, 1369021, -8443369, 1800665, -4860829, -5415954, 2003065, -6249715, -5532992, -490163, -4380867, -648540, 1775969, -1590212, -2959769, --4637491, -3525095, 2433099, 897111, -5251672, 1952600, 538482, -3496640, -2977486, 19248432, -17204028, 5158793, 35217660, -6540699, -12300786, -11020886, -5161477, -18969796, 25633438, -15352897, --5603859, -12435004, -6415608, -5843840, 3026341, -18039936, 283468, 211527, -2486786, 5132486, --19071266, -4840428, 13086228, -12982076, 716186, -16800838, 16135655, 104690, -28656022, -14860587, --5187247, -603980, 7971996, -17393544, -9757092, 11965242, -2040646, 8269960, 7597261, 7510824, --10441602, 1183264, 12680354, 4705674, -23655070, 15273441, 11016591, -12764106, 36339720, -617402, --26075820, 7263864, 8244190, -530965, 19396072, -5892159, -32395328, 9194451, 4650913, 9769440, -11504607, -14745696, 23447300, 8892730, 7295539, -5499169, 35505956, -2646774, 617402, 24308978, --4134443, 11135776, 19182934, 6660958, 2865817, -4513474, 9222905, 490700, 16219944, -7027640, -15788837, 14579803, 887985, 14429480, 8581345, 11520713, -5812702, 75162, 13104482, 9557913, -7041062, 4336307, 4486630, -8529268, -1010391, 544387, -4035122, 673236, -1462973, -3574487, -7594039, -7661685, -1475858, -7511361, 6618008, -3114925, 7930657, -6610492, 1105954, -4557497, --6675453, 4794257, -2546916, -12348, -6515466, -9514963, -7181186, 7651484, 716186, -2914135, -789200, 9490804, 6760816, -2643552, 3278671, 306553, -2617246, 9819369, 340376, 7093676, --25128244, -24663312, 50577000, 16311212, -31601296, -15896211, -14499273, -28941638, -2157147, -15278809, -21061982, -11921219, 97174, 26268020, 558346, 4354023, -19359566, 24217174, 18051748, -329639, --5851893, -1904818, -15052250, 1126355, 1905355, 3055869, -20681342, -3028489, -1202591, -6242198, --4609574, -14271639, 13496935, 26728118, 32125818, -2637647, -13020730, -5450851, -6660421, -4524748, --19725174, 6687801, 7701950, 7051263, -20554640, -27454504, 29648696, 11175505, 16603807, 21514564, -20195474, -8779987, -13811004, 19465328, -19835232, 10036802, -14845554, -11414412, -6622303, 23163296, --7687992, 4685273, 7973607, -4255776, -18752900, 38748660, -23443542, 2377801, 28094454, -25458418, --11499775, 2959233, 10284299, 28846074, 5186173, -16782584, 492848, 3486440, -3907883, -7067906, -4175782, -11766600, 9010841, -9747428, -13613973, 7318088, 4160213, 10355703, 4705137, -419833, --4702453, 1132798, 2941516, 3165928, 11152956, -684510, 1575179, 6864432, -16421807, 2323041, --7376607, 1762547, 1877438, -2705293, -6187974, -7769059, -1843078, -7797513, 3087008, 4159139, -9558450, -887985, -6316823, 6014028, 7421704, 4433480, 4558034, -11898670, 467078, 2932389, --2883534, 10137733, -3768834, 711354, 1141388, 9355513, -4432943, 2758980, 13125420, -8449811, -8221641, 33676840, 20285130, -3073049, -21614960, 2231236, 34534760, 27492086, 5767604, -27388470, --10566693, -23649700, -1791001, 18457622, 22807350, -1704565, 8651138, 27113054, 28856812, 44793288, -45090176, -22558242, 9788767, -24357296, -4429722, -19751480, -7115687, 15520401, -3511136, 6777996, -6083285, -14043469, -10296110, 11413339, 12728136, 16523813, 11735461, -589484, 12099460, 18241262, --9704479, 9222905, 10744934, 3178813, 10492605, 34927748, -26304528, -22648974, -5125507, 21570400, -20666308, -12330314, -191126, 33153926, 26804890, -18837726, -12577812, 11372000, -23002234, 6356015, --11088532, -20866024, 6694781, -24511378, 25392384, 9308805, 28131498, -11864847, -16517907, -31858994, --6930467, 10361609, -27929098, -23892366, -13107703, 12424804, 7332046, 5826660, -12331925, 5293011, --8841190, 3343632, 25854630, -11066520, 2987687, -14735496, 11067594, -6101001, -12400644, 8668855, -12032351, -6772627, -3541738, -4030827, 8619462, 19273666, -6257231, -13040058, 212064, -289910, --4886062, -2117956, -18084496, 2440078, -9648644, -4347044, 6440304, -5939940, -3289945, -597000, --5082557, 7871065, -8004746, -12548821, -11404749, -9603547, 10029822, 5257577, -2422899, 4405026, -2909840, -8164733, -8936753, 3203509, -15760919, 13298292, 33883532, -2178085, -10481331, 21760452, -4479114, -1242856, -32248226, 28342490, -13978508, -30634928, -10406706, 2087891, 35334160, 3398930, -25322590, 10278930, -29976188, -6503654, -26555782, 4279935, -26470420, -19022410, -11361799, 1349157, -5572720, -20504710, 20145008, -6482717, 12243878, 13173202, 13027173, 24449638, 44573708, 26169772, --8500814, -21907554, -762357, 46945604, 29241212, -15962783, 23367306, -8985072, 28542206, -14161044, -2775086, -10597295, -5262409, -1582159, -8015483, 70547520, -13414257, -19451370, -22500796, -31631360, --12173548, -24376086, -1084479, 27273580, -10853919, 8066486, -9073655, -13895293, 24799142, -6882685, -41775536, 7754564, 33416994, -40803264, 16816408, 71718976, 26097832, -39978628, 23815056, 21818434, -1321239, 4641786, -12250320, 13675176, 62954020, 33490008, 14135811, 19108310, -19680614, 36448704, --3800509, 5617817, 5792301, 9012989, 4237522, 23982560, -19786378, -4922570, 1739462, 30570504, --5140539, 7513509, 35401268, -2762738, -19672024, -4529580, 13030931, 2171643, -8307004, -19934016, -11632382, 8352101, -13719736, -8048232, 9549323, -16858820, -14020384, 4593468, 7055558, -30602, -4911832, 3347390, 5739687, -6158446, 6003291, -3737159, -5005248, 5542119, 2400350, 7657390, -1186485, 49008260, 22868016, 5441724, -1563905, -53556632, 24910810, 33598992, -24274618, -17652852, -41486700, 27067958, -33318746, -35330400, 1170379, -20656646, 8903467, 3405372, 8491150, -33199560, -8586713, -6458557, -16624745, 29488708, -2150168, -4909685, 9814000, 24734180, 22117470, 15212774, --28513214, 631360, -13975287, -30259118, 10910828, 8588861, 18523120, -6373732, -14250165, 38766376, --27950574, 12312061, 13313325, 10981695, 8167954, -4772783, 22741314, -21190832, -36839544, -6111739, --42180872, 36932960, 22488448, 36246840, -3105798, 7184407, -29407104, 30457224, 38131792, 13817984, --16499654, -42881492, -10088878, -56591024, 618475, -10476499, -38656852, -32530620, 14697378, 2467996, -23404350, -18202072, 26858042, 22893786, -32408750, 6905234, -19468550, -5340255, -29316910, 3792456, -84306984, 21201032, 24536612, 31092878, 13538811, -23898808, -3591667, -233002, 19769734, -4495757, -20316806, -9230958, -13024488, 617402, -1756642, -23594940, 20066088, -3650185, -6147172, -7233262, --16952772, 2512556, -8187819, -10483478, -15790447, -12021613, 7180112, -8644159, 7018514, 8548596, --6282464, -9749576, -13703630, 6248104, -2779381, 5830418, 20030116, 12863427, -606664, -1540820, -6158446, 12909061, -12992813, 11407433, -13100724, -5520644, -33506650, 15107011, 11596412, -15636365, -5883569, -7935489, -50529216, -13197898, 12910672, -5666136, 5947456, -28071906, 37314676, -48410724, -4200478, -35402340, 25129316, 27539330, 9288404, 23081154, 2918967, -23271744, 40480604, -18493592, -4622996, 836445, -22659710, 38253664, 3056943, 10080288, 8753680, 12085501, 6757058, 28714540, -34033856, 11559368, 39696772, -33888904, -2173254, 241592, 50641424, -9367324, 40473624, 22572738, -55449640, 11054709, -12002286, -17296370, 22323630, -40871984, 39278012, -23164906, -13355738, -6263136, -8311836, 29656212, -6395743, -53059488, -14325863, 86611776, 6890738, -54118736, 13931263, -35752380, -11202885, 85340464, -22907208, -23030688, 59559384, -63459752, 32691144, 14886357, 19760608, 55674588, -35548372, -48991620, 61152280, 40231496, 2350958, 64951180, -26051662, -8554501, 47342888, 31210990, -6138045, 12935368, 488553, -257698, 6210523, 16456167, -13961328, 17374754, 17993766, -14105209, -8126078, 12233141, -20213190, -1499481, 8355859, -1508070, 4539244, 26825292, 1028108, 18028126, --8681203, 707596, 13360033, -7519951, -6035503, -16836272, 3591667, 16302622, 11190537, 15389942, --27205934, 16089484, 18838264, 8788040, 3838627, 8083129, -619549, 17121888, 30251066, 7824357, -14948634, 14123463, -6155225, -7155953, 14775224, 21540872, 29281476, 55824912, 27797028, -26767846, -35700304, 10699837, 32209034, -9278203, -59617904, 60617556, 52640192, 32345398, 99380712, -9269076, --83374976, -43110196, -39342976, 88140248, 64801392, 15665893, -5589900, -16109349, -58282168, -27692876, --18869402, -33502356, 89719720, 72771776, 101192112, 1877975, -115698368, -180230784, -87856776, 100417944, -135552928, 138379008, 55832964, -114705152, -210686944, -129230200, -65155728, 97231616, 165390608, 93891208, -51142860, 13663365, -74477416, -100207496, -74891344, -5651103, 58247808, 117871080, 141021488, 25061672, -27691264, -111823768, -185217776, -98826120, 92532384, 155081600, 147162224, 91807072, -53748832, -180289312, --116565952, -151182848, 766652, 102634688, 111126376, 55604796, -43793096, -94926832, -83909168, -66519380, -19963544, 63216012, 44739064, 127896072, 46518252, -28635620, -75277352, -28093382, 85600312, 124496072, -42426224, -4904853, -75780400, -15532749, -16687022, 49100604, 19110994, -12628278, -52147884, -15904264, -3488587, -8591008, -15222438, -3584687, 13094818, 26485452, 45679660, 21543556, -43631500, -39674224, --36269388, 8672076, 48150880, 52459804, 25184078, 5390184, -32849520, -14789183, -65118684, -58641336, --4144644, 17026860, 73496552, 108803336, 42464340, -38333120, -88883808, -112429896, -45936824, 87628608, -146404704, 99345816, 31524524, -73296840, -117599960, -58635968, 991601, 21235928, 22835804, 50174880, -27216670, 10764262, -28748900, -64632816, -46846820, 6252399, -12566537, -32347010, 37434400, 5425081, --54120348, 7030325, -14050449, -21668110, 16345035, -16573205, -6578280, -28881508, 1734093, -10951093, --21590264, 8816494, -2385854, 7421167, 3571802, 18177912, -17601850, -5756867, 5516349, 2178085, -8432095, -7311645, 18211736, -12550431, 12576201, 6177774, -5768141, -13179644, -5686000, -24903830, -27509802, -2195802, 1048509, -4467840, -6407018, 1819992, -665720, 1031329, 10720775, 6648610, --179315, 15708306, -13150653, 5092758, -12483859, 14170171, 8563091, -10071698, 7456063, -12368432, --14230837, -11243151, -22014392, -2033667, 16745004, -14799920, -29995514, -20264192, 1888175, 18705656, -454730, 14034343, -28559386, -7186554, -3270081, -2277943, -27938762, -6698539, 973347, 4391604, --10000294, 29468308, 11761768, -9168145, 26897232, -2416993, -48115980, -1768453, -7020124, -4097936, -9250286, 6320581, 12750684, -14822469, 20633022, -35156992, 10152766, 6458020, -1557463, 197569, --2378875, -2235531, 11768747, -2027225, 1998770, -5128191, -632971, -10178536, 2530810, 262530, -20523502, 10201, 9015673, -9338333, 1012002, -4603131, -12348031, 3959423, -465467, -5867999, -14562087, -2621541, -3997541, -5789079, 10620380, -3926137, -20643760, 4381941, -4256313, 6509023, --8932458, 1104880, -2764348, -12311524, 11275900, -10870025, 7673496, -10375030, 5315022, -777389, --4255239, -29228326, -47957068, -75341776, 2769180, 62201864, -23771034, -38155952, -40783936, -38536596, -8071318, 8012262, 71694816, -10356240, -10268193, -31875100, 3595425, 9716827, 22591528, -23956790, -12165495, -17419314, 28088550, 8966281, 9212168, 3395709, -17447230, -9484362, -11365020, -3741990, -10178536, -10513543, -9263171, 19814294, -18064632, -11261941, 16372415, -15557982, -5716065, -13353053, --21809308, 7727720, 14320495, 2646774, 13491566, -20502564, -5224828, -593242, 11895986, 14749455, -18253074, 1291175, -1920924, -30842160, -31718870, -11715060, -10296647, -6926709, 14542222, 19957640, -28144384, 3118683, -12880070, 28245852, -20200304, -9009231, 12537010, -8830990, 37044628, 1898912, --6213744, 6292664, -13585518, 10764799, 25643640, 21059836, -7647190, 7975755, -25007448, -16282758, --9315247, -6152541, 18452790, -2388539, 18010946, 4814659, -6028524, 2182380, 3161096, -21626234, -12787728, -16005196, 9863929, -7341173, -4614943, -1116692, 11697343, -11230803, 1287417, 1994476, -10189273, 18094698, -9336185, -2688650, -14522358, -5770826, 4817343, -5646809, 3789772, -4412005, --6060199, -9978820, -15880642, -8637179, 14121852, -5608154, 6847252, -10281615, -2603824, -809601, --3489661, -9216463, -4394289, 1056562, -1324461, 141197, -243739, -13948980, 19636054, -48543868, --113477328, -86721832, -10009421, 37539088, 97904856, 82649664, 78922712, 80581640, 53192632, 22388590, --29042568, -51546588, -98342400, -72493144, -71200896, -71025336, -44149580, 42811160, 57751740, 84813792, -65161096, 54539104, 18029198, 36365488, -8167417, -9470940, -11410117, -19961934, -37220188, -30565134, --62704912, -22904524, -49791556, -23795730, -11748883, 16256451, 3301756, 23283554, 5441724, 32631014, -24084030, 39484172, 52624624, 65243776, 41826004, 27992986, 46466716, 3507915, -15741055, -57412976, --67177584, -92573192, -82385528, -77167680, -29472602, -50680616, -26412976, 3010772, 14016089, 32560148, -62366148, 66298188, 74277704, 111997712, 63181116, 85779088, 59629180, 13469017, -9038759, -35306240, --89620400, -98213016, -93321584, -103745472, -76013944, -53199076, -42516420, -11780558, 21907018, 36452460, -46553152, 69005632, 73498168, 77189152, 73128800, 45408540, 31883690, 14984604, 1750736, -324270, --21952652, -36188320, -52003464, -62095028, -65673272, -62372588, -43633648, -19781546, -17519172, -6798397, -11775190, 30865246, 38734700, 73016056, 51687248, 40594420, 40818832, 14555644, -1588601, -10691247, --12872554, -13911399, -35380328, -31999654, -22934052, -24275156, -17552994, 2208150, 5609228, 6886443, --4195110, 11512660, 416612, 13644574, 14296872, 4525822, -4839892, -716723, 3125126, 1840394, -2273648, 6394670, 1486059, -3404835, -10267119, -2488934, 2340220, -383326, 6375879, 4872641, --1081795, -1055488, -4389994, -3587372, -2379412, -1650341, -1961190, 1397475, -1194001, -930397, --272730, -2176475, -2898566, 275952, 583042, 886911, 636729, 428423, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --9297530, -7221988, 367757, 3323768, 3297998, 9343701, 4401805, -3434900, -4341138, -6060736, 4363150, --5300527, -3850975, 879931, 1349157, 587337, 5486821, -1776506, 5129265, -1298691, 4605279, --4337917, 2026688, -1909650, -4636417, -316217, -8854075, 1341640, 2187212, 3976066, -3227131, --40802, 3470871, -2535105, 3897146, 3669513, -2185602, 2638184, -2932926, -1358820, -2165737, --3169686, -4029753, 3628174, 5354751, -3989488, 2382096, 4307316, 3488050, 5270999, 671626, --780610, 3074123, 2334852, -5551782, -202937, 653909, 363462, 1775969, 3614215, 818728, -1315871, -1920387, -1213865, 2561948, 3590593, 2007360, -1890859, -3312494, 3701188, -2989297, --967441, 2077154, -616865, -125628, 1580548, 382252, 106300, 3357591, -3272228, 2503429, -1363115, 1644436, 3097208, -1236414, -354335, -1037235, -430034, 135828, 1517734, -1194538, --216359, -823023, -476205, 57982, -116501, -476741, -340913, 347892, 449361, -2684, --195421, -328565, 49392, -100395, 52076, -474594, -107911, 487479, -1068910, 3682935, --1955821, 2697776, 256087, -230854, -7508140, 1202591, 6391448, -3927748, 2639794, -7973070, --8067023, -2660195, -6560026, -5726802, -863825, 1180042, 4503810, 714575, -2172717, 1017907, -3064996, -3966939, 5491653, -3724274, -4027069, 4651987, -2317672, 5359583, 6813429, 941672, --4916664, 3437585, 2246805, 1376537, -2502355, -1815161, 2861522, 2388002, 485868, -5558225, --1603633, -5134634, 4635344, -4634807, -3021510, 3410204, 161598, 2959769, 848256, 1134408, -5045513, 851477, 5659157, -7297687, -3744675, -1688996, 3616363, 5109938, 5844377, 7947837, -864899, -2267743, -759136, -1069984, -241592, -5170067, -2260764, -2251100, -626528, 794569, --4188667, -2485176, -943282, -1788317, -3274376, 3934190, -3936338, -1347009, 2625836, -6753299, -2043868, 3675418, 4085588, 2143726, 1187559, 2441689, -1194001, -2622615, -655519, 700617, --276489, 700617, 134218, -733366, 57445, -1054415, -1227824, 1497333, 682363, -144955, --4832, -17717, 1147830, 523986, -438087, -472983, -457414, 78383, 851477, -1008244, --159988, -63351, -177167, 549219, -18254, -413391, 8549669, -6314676, -2361158, -1233729, -5261872, 4751845, -4768488, -421444, -8863202, -1924145, 10776610, 4070555, -4316442, 7743826, -2535641, 2988224, 802622, -2575907, -8458401, 1154273, -3801583, -2398202, -1534377, -5146982, --1813550, -3980361, 2803540, -1792612, -2325188, 4850629, -9104257, 8405788, -2943126, 1209033, --2841121, 2634963, -325881, -821949, -211527, 3586835, 191126, 2273112, -3244848, 6300180, --4873714, 7333657, 1573032, -709743, -4083440, -4792647, 9961640, 1729261, -9310952, 9550397, -9002788, -4867809, -1774895, 2835752, -3666828, -672699, -2254321, 2269890, 5747740, -3475702, -1324997, -2600603, -2373506, 951335, 7732552, -7066832, 4308389, -7284265, -5595806, -5258651, --916439, 153545, 9664, 4423817, 6847252, 1791538, 1671816, 3344706, 2719788, 1501628, -1709934, 2007897, -727460, 2160369, -972810, -2112050, 3649649, -178778, 513785, -657130, --1066763, -630286, 36507, 1540283, -376883, 346819, 166967, -1367410, 25233, 758062, -980863, -111669, 859530, 2437931, -3271691, 395674, -6462852, 6227703, -9084393, 387621, -9549860, -17251274, 12074227, 4850092, -4559108, 3829500, -312996, 10531797, -1057099, -8636105, --6022618, 3571265, 4108673, 1214939, 331249, 4505958, 1379758, 783295, 6094559, 2528125, -1777580, 4413079, 3185255, 15004468, -4058207, 4035659, -161598, -2395518, 3934727, 2471217, -1574106, 1959042, -2392834, -4076998, 331249, 56371, 271657, 2226941, 4620311, -4590247, --4884452, 2199560, -1125281, -1826435, -2900177, 6149320, -4306779, 8858907, 4191888, 455803, -2124935, 810138, 2464774, 11239393, 9446781, 783295, 592706, 2216740, -2184528, 4252018, --857383, 3842385, 1225676, 318364, 70330, -4691715, 4628901, 3565897, -952946, -2663417, -446140, 4468914, 498753, -1154809, 319975, -3246459, 2478733, 988916, 3140158, -731755, -982474, 1372242, 1354525, 1163936, 1916092, 963683, 896038, -3966939, -159451, 1671279, -2353105, -1298154, 1555315, 1452236, 1293322, 1460289, 663572, 1152662, 1407139, 1580548, -317828, 667331, 511638, 778463, 299574, 481036, 1009854, 459025, -91805, -796716, --1087701, 2228551, -1000727, 4868346, 132070, 5616744, -2121177, 4984847, -3733400, 10399726, --7916699, -2935610, -3769371, 10723996, 6070937, 3959960, 6806450, -6109591, -1226750, 9899363, -5615670, 4661650, 4806069, 2587718, 3305514, -1101122, 9478993, -953483, -4347581, -3209414, -3330210, -3539590, 2179696, -8921721, 3326452, -1684701, 185757, -9587441, 4158065, -2030983, -9040369, -1440425, 2867428, 2510945, -3797288, -912144, 4122632, 600222, 2829847, -2001992, -5016522, 7135552, 905701, -4919348, 1909113, 5028870, 3577708, 696858, -3388729, -6945499, -5857262, -7736847, -3284039, 4396436, -10304163, -2323041, 6398965, -4723927, 1348620, 128312, --576063, -1338956, 2604361, -5100274, 288300, -8542690, -4440460, -11689827, 890132, -3248606, -261456, -2230162, -361851, -2940442, 2691871, 2615098, 1040993, -1809255, 2485176, -235686, -971736, -3335579, 865436, 739808, 1086627, 788663, 2325188, -251256, 2623151, -1100049, --172872, 1869921, 2462090, 433255, 1363115, -1532230, -597000, -396748, -612570, -1085553, -766115, 1970316, 524523, 2076617, -1919850, -1100049, -1075889, -2611877, -3059091, 2805688, --18962818, 3308736, -5982353, -3485366, 4337380, 3279745, 2306398, 810675, -13933948, -1495722, -4329864, -7511361, -1967632, -10266582, -5218922, 2247342, -1224603, -9459665, 9804337, 5881421, --3010235, 1014149, 7712151, -5037460, 2065879, -3466039, -5395016, -3730179, -9750650, -3696356, -7337952, 3399467, 9379135, -4819490, -15374372, -6710887, 3743064, -5004711, -10027138, -1771674, --1899986, 9059697, 4642860, -10744398, 7096897, -7633231, -488016, -5541045, -5282810, -5085242, --11829951, -7077033, 823560, 7488276, 11396696, 7235410, 2084670, 4460861, -5279052, -8854075, --5463199, 5442798, -2739652, 5877663, -1867774, -5666136, -339302, 410169, -2750390, -6372658, -325344, 4620848, -15401216, -10237591, 14249091, -4749160, 224949, -7994545, 3713536, 2019172, --995359, -717260, 5170604, 3767760, 1110786, -1742683, -2021319, -462246, -2250026, 1124745, -1472100, -3133716, -1595044, 1015223, 272194, -105227, 828392, 2869038, -3248606, -1571421, --5882495, -2476586, -946503, -1198833, 218506, 714038, 1576790, 4295, 2042794, -2628520, --1879585, 331786, 437550, 731218, 7244536, -203474, 3666292, -4968741, 3644280, -6790344, --477815, 11792370, -5556077, 11140071, 11298985, 13925358, 3487514, 5572720, 12014634, 9402757, -6925635, -9310952, 1218160, 2945811, 8060580, -1584306, -6901476, 8945343, 9075803, -2570001, -6049999, -3007551, -3150896, 5689758, 4919885, -685584, 5836861, 517544, -9518184, -7612830, -8250096, 11958800, -929324, -4134980, 2536178, 372588, -5686537, -10679436, 5589900, -10098005, --4906464, 7731478, 1648194, 6840809, 303869, 10950019, 1532230, 12024298, -13967234, 12688944, --2450816, -471373, 3832722, 6712497, -5365488, -11559368, -3271155, 10620917, -2052994, -12369506, --7303592, -7573101, 2064269, 4496831, -10771778, 5470178, 6252399, 11221139, 3462281, 3547643, -52613, 3172370, 594316, 2486786, 1711008, -8148627, -892279, 3913789, 2747705, 6634651, --4319127, -1311576, -55835, 558346, 3172907, 427886, 2624225, 1079111, -1248225, -541166, -2502355, 2302103, 897648, 2507187, 714038, 1113470, 3300146, 51003, -1743220, -904628, -740345, 1608465, -201863, -755377, 2672544, 1372242, 611496, -2711735, -852551, -1550483, --1332514, -125628, 2854543, 158377, 2717104, 3763465, 12053826, 1552094, 5039608, 14328548, -15444702, 4607963, 3893925, -11403138, -5747203, 12613245, -9346386, 12890271, 3655554, -48855, --2547453, -4503273, -7425462, 1367410, 5733782, -13861470, -6251325, -5895380, 3104725, 2784750, -3068217, 427886, 2386928, -507880, 4212289, 3394098, -3642132, -6504728, -11950210, 2109366, --6438693, 10816875, 473520, -6012954, -7501161, -2311766, 5067525, -9418863, 5934034, -3156264, -1987496, -117575, -6657200, 6648073, 8475044, -5788542, 7140383, 2012729, -493384, 20199768, --5030481, -13123809, 2540473, 4915053, -3220689, 1078574, -5646272, 13706851, 8043937, -1380832, --2871723, 9726490, 9378598, -1971390, -7873212, -5790153, 19161460, -1782411, -2557653, -7724499, --4924180, -1563905, 1932735, -2025077, -5003100, 8195872, -2525441, 9730248, 2911988, -3107946, --995359, 1714229, 29528, -1705639, -1619203, 3403762, -4254165, -1102196, -1075889, 5602785, -607738, -1267552, -50466, -2915746, -2589865, -398358, 664109, 5871221, -1294396, 3462281, -1440425, -1968706, 1313186, 195421, -2764885, 2160369, -1324997, 3000572, -193810, -3170223, --2189360, -1833414, -2201708, -90194, -621697, -1040993, 1170916, 1031329, 1766842, 4924180, --10581189, -3029026, -3362960, 828392, 4437775, 10336376, 9029632, -14552960, 287763, 1656247, --1513439, -4378183, -10036265, -1073205, 3326989, 5887864, 4786204, -9225053, -1642288, -11681237, -10855530, 425202, -1124745, 5185100, -5223754, -1002875, -12429635, 2022930, -7437810, 5048734, --1011465, -2133525, -4232691, -8282845, -8039105, -1010928, -9905805, -16142098, -3033858, -7393786, --15498389, -1324997, -1374390, -8527658, 5492727, 8414915, -1101122, 3970697, -1117228, -1421097, -2254858, 2427730, -12562242, -3770981, 6817187, -6113349, 14922864, 2620467, 3946538, -9745281, --140660, -4449049, -9904731, -1138703, 13849122, 6356015, 10511932, 5774047, -4648765, -11296838, --17559974, 11664057, 12004434, -1530619, 6181532, -13750875, 6492380, 5497022, 9767293, 1381369, --11732777, -1601486, -10939282, -3878892, 861678, -3637837, 2267743, -2525978, -3658775, -1043140, -1011465, -646393, -1225139, 3104725, -1042603, 1138166, -7951595, 33823, -692027, -1363115, --3630321, -1637456, 2333241, -3446711, -3918621, -1511292, -1437203, -1717450, -61203, -1066226, --4332549, -3580929, -2183454, 1088237, 1388348, 2388539, 1148904, 2179696, 743566, -3229279, -579821, -641561, -1956358, 1017370, -3645890, 1394791, -1998770, -27109834, -6783364, 21555904, -7203734, 8792872, -5618354, 8880919, 15027554, 1106491, -2534568, -25035364, -5846524, -1173600, -14348412, 4042638, 5748277, -18754512, -5057861, -6971806, -4474282, 11665131, -6590091, -2279554, -2013266, 3343632, -5933498, -2584497, 3002182, -5235565, 11454678, -12847321, 1381906, 8476655, --11027329, 9046812, 15356656, 17903572, 8580808, 8766028, 11733314, -8047158, -14787572, 5905043, -6405944, 9777493, 7754564, -16687559, -4769025, 8784282, 5051956, 3201361, 10459319, 2364380, -12185359, -4529580, -2652142, 6995428, 6433861, 1959042, -10776610, -5737003, -11575474, -13216151, --794569, -14455786, 741419, -8411157, 573915, -7649337, -4552666, -18571976, 12792560, 3393561, --2795487, -3321620, -2124935, 2495913, -6910603, -954557, -16207059, -8852464, 5589363, 7326678, -2972117, 2465311, 587874, -8472897, 3837017, 3881577, 2964064, -8096014, 1802276, 322123, --6503654, -2171106, 1067836, 1022202, -3381213, -4839355, 1536525, -2376728, -3030636, -731755, -636729, -600222, -433255, 1646583, -1577327, 2290828, -463856, 3266323, -1520418, 2918430, -4494147, -3243237, 2467996, 224412, 1690607, -1999844, -280247, 2639258, 2034204, -3995930, -2034741, 2095944, 16995722, -8292508, -7096360, -6291590, 11700028, 14853071, -9339406, 23841364, -4999342, -10210748, 12199318, 3466039, -9948755, -11694659, -9438728, -780610, -5074504, -3490735, --15574088, 6219113, 6468221, 21494164, 2900177, -3696356, -9725953, -10199474, 2561411, -1231045, --13625247, 2384781, -5063767, 624381, 10493142, -8160438, 13882408, -12231530, -10270341, -724239, --15979426, -19129248, 3081639, -2221035, -22058416, 1492501, 235686, -10522133, 5488432, -5128728, -2763812, -14929306, -24338506, 15933792, -14899242, 24703578, 13485660, -17716204, -2285996, -17951890, --4851166, -2308008, 7416335, -6490770, 11329587, 14272176, 13566728, -9845676, -8012799, 1232119, --12045773, -1162326, -3940096, -15912317, 9470940, 6988449, -8471286, 12451647, -18577882, -1825361, -1098975, -4904316, -3142306, 16081968, 11900281, 7885560, -984084, -8464844, -6831683, -6393059, -2782602, 2551748, -522375, 1778653, -498753, -794032, 334471, -726386, 644782, 3167002, --3837017, 1478006, -276489, 3489661, -2068027, -420370, 2044941, 4679904, 1876364, 3767223, --4550518, -5019743, 2363306, -3360812, 802085, -72478, -5301601, -3012920, -3161633, 4295, -1743757, 1522029, 1071594, 1191853, -14448807, -10988137, 7209640, 8733816, 9655086, 16321949, --6010807, 30029338, -919660, -15534897, 6801618, 14807973, 4074850, 7787313, -6557342, -16638166, -25062744, 13914620, 10288594, 4874251, -8638790, 8077760, 20883204, -7650411, 4507032, -193274, -4427038, 3607773, 14893873, -4262218, 5092221, -5226975, 4560719, -1395864, -754304, 9243843, -2006824, -18398566, -12310987, -17239462, -11779485, -9133785, -4502737, -13191455, -7430831, -6465537, --11410654, -7937100, 5107253, -11936251, -4075387, -9259949, 22262426, 11325829, 19389092, -17488570, --1591822, -15976741, -3328600, 17966386, 9922985, 21161840, 10133438, 13109314, -13836774, 6308233, -6222334, 19600620, 19928648, 5982890, 18037788, -15451682, -7337415, 11563126, -40564356, 762357, -6738804, 879931, 10147934, 6544457, 22971096, -1742146, -3104188, 24850144, 7562901, -2172180, --11049877, -193274, 257161, 20370494, 2767033, 580894, 1711008, 4144644, 6410239, -1102733, --1086627, 6596533, 3223373, 2168959, 3539053, 4798016, 3755949, -210990, 879931, 683974, -6863895, -1168231, 3658775, 6588480, 4910758, 7346542, -3120294, -2393371, 1817308, 2405182, --2383707, 243739, 4299799, 6825240, -332860, 2064269, 17480516, 11359652, -11475079, 22353158, -13254269, -1140851, -5604933, -2820183, 13404593, 33028836, 17622788, 4744328, 1349157, 10849624, --2685965, 26665304, 15040439, 16655883, 639950, -8490613, 5611375, 2008434, -14226005, -3494493, --941672, -3349538, -4091493, 5416491, 2900177, -11631845, -5630166, -20555176, -2162516, -6387690, --26506928, -11876121, 748935, 9903658, -13669807, 17029008, -4772246, -4062502, -2376191, -4153234, -12324946, -8330626, 8596377, -27118960, 8332237, 11835856, 9066139, 18076444, -17911088, 15480136, --16086263, -11962021, 13326210, -7842611, -2449205, 11244761, -18236968, 16117939, 25760676, -522375, --3824132, 32959042, -7168301, 6350109, 18505940, -39605504, -20352240, 1351841, 1130113, 5380521, -9451612, 19276350, 11510512, -15141370, -12218108, -3587372, -4411469, -20454244, -2081985, -4070019, -4961761, -21371758, 155693, -6433324, 8604967, -3217468, 10980084, 2983929, 2147, -6321655, --4746476, -5943161, -6405407, -4820564, 4258460, -12985834, 9217537, -1536525, 5086852, 331249, --934155, -8858907, 4768488, -6286759, 1505386, -6679748, -3759707, -28991, -3069828, -7665980, -460635, -2390686, 740345, -5212480, -5879810, -6132140, 1000727, 1337882, 7677254, 8336532, --177167, 208306, -6032282, -31468688, -18950470, 23074712, 22943178, 2416993, -5496485, 19448148, --31565326, -16972100, -34149284, 14856829, 4082367, 1458678, 6555194, -15568720, 7800735, 10734734, -14092861, 23918672, 24586004, 20642686, -891206, 4623533, 215822, -9066676, -1917166, -7580081, --3940096, 28513214, -6727530, -26329224, -6695317, -5464809, 2294050, 41106596, -14939507, -14818711, -13874892, -22355304, 7651484, -24800214, 32258962, 9069360, -964757, 8227547, -12530567, -15844134, -22080964, -26994406, -21576842, -19418084, 5301601, 8024073, 10009958, -18021682, 18354542, -5757941, -1320166, 28313498, -2007360, -4895726, 8286603, 22835268, -14898168, 37915972, 1338956, -43845712, --5396627, -1756642, -14688788, -4290673, -81068, -4171487, -12010876, -10119480, 21463026, 14355391, --5377299, 13887777, -25218974, 6977175, 11193222, 6931004, 737661, 13368623, -2293513, -679142, -4958540, 13065291, -5523328, -5821828, -4563403, 518080, 4891431, -2621541, -10450729, -11238856, -467615, -5324686, 3788698, -226560, 2648921, 5826123, -7337415, -4889284, 12453795, -2991982, -2182917, -1063004, 245887, -4378183, -4855461, -2514167, -1688996, -6765111, 3132642, 5990406, -3321084, -222265, 474057, 2641405, -5211406, 1063004, 5737003, -698469, 4905390, -2952790, --9198209, -12437152, 186294, 5459441, -8862665, -4029216, 41791644, 24776056, -33660196, -27191974, -33641940, 32073206, 20075750, 23057532, -40080096, -8777839, -11034845, 10604274, 3912715, -16163036, --29599840, -44837848, 13143137, 11866458, 3497714, 12366285, -6110128, -2225330, -10629507, 8935679, -15546708, 13966697, 3659849, 18547816, 5957657, -2068564, -7533373, -27241904, -1449552, -11443403, --9492951, 9516037, -29241748, 2652679, 1196148, -13620415, 11964705, 10984379, 5429376, -19654844, --18299782, -48228724, -12269111, 375273, -15446850, 2757906, 10209674, 10188199, 27002460, 13277355, --11909407, -8325794, -17919678, 22733262, -9529459, 39323648, 32846300, 9133785, -20965346, 43412456, -19972134, -17539572, 2705293, 21829172, 50481436, -20820928, -38562364, -19868518, 543850, -13879187, -6103686, 13952738, 11635603, -10091563, -15761993, -8683887, -13116293, -14384919, 4017405, 15717433, -12542378, 7084012, 6256694, 2323041, 10551661, 1468879, 1708860, 15369004, 12033961, -663036, --5021891, 3505230, -7974144, 8569533, -3030100, 8771397, -4461398, 3536906, 2292976, 5812702, -7443715, 4422743, 3467649, -7192460, -14248554, 1735704, -7231115, -3621194, 4305168, 1335198, --2105071, -2719251, 10302553, 3442416, 13936095, -4421132, 7455527, 7542500, -9478456, 9903121, -519154, -7917772, 16753594, 6030671, -5754720, -16114717, 13639742, -27361626, -25299504, -9057012, -19756312, -11198053, -14345728, -55835, 22752052, 2483565, 23508504, -7744900, 28361816, 3357054, -15241228, -9813463, -6528887, 9045201, -29056528, -8025147, 11104101, -5086315, -3810710, -23350126, --22049826, 10415296, -13401909, -9581535, 18305150, 25061672, -3537979, 16530792, -29358248, 1939178, --7871065, 38441568, -15654619, 12899934, 23616952, 22494354, 6691022, -15428059, 10096931, 7295539, -6960532, 12536473, -37547676, 69806104, 22449258, -5932961, 3862786, 7999377, 19541028, -5178120, -15093589, 40797356, -2099165, -49999324, 21203180, 17675402, -17605070, 23795730, -4967667, -10306848, --26684632, 52235392, -26556856, 58135604, -37908992, 14543296, -495532, 63143000, 28159954, -26668526, -26051124, 1351841, -16464757, 12871480, 2212982, 5918465, 14334453, 6219650, -15915001, -3976603, -19452444, 5375152, 11125576, -8603356, 12270185, -20068772, 7815230, -912681, -6285148, 12858595, --6738804, -3717294, 9366787, -1316944, 1637456, -1371705, 15561203, -9776419, 15192910, -8577050, -14076755, 19523848, 7454990, 5458904, 10955925, -2551748, -7303592, -7162395, 9492951, 3416647, --1241782, 93416, -2113124, -13640279, -10368051, -1930051, 723165, -8450885, 47631724, 5566815, -25796648, 13086228, -26422638, 1494112, 15454366, -4842039, -23026930, -4536023, -50055696, -14128832, --18733036, -10922639, 10761577, -1622424, 17732310, -8923331, 1802276, 17236778, -15643882, 1504849, -9794136, -1155346, -17149804, -209917, -11820287, 34257196, -6166500, 19771882, 3107946, -531502, -35194036, 25242060, -15672873, -18460306, 8834211, 15776489, 19265076, 23320062, -554051, 8081518, -22203370, -1440425, -9098351, 6756521, 664646, -20024212, -567473, 12790413, -19583978, -26479010, --2596308, -1844689, -2925410, -9066139, -9586367, -31519154, -126165, 30404074, 9345312, 16785270, -9982578, -4408247, -40485972, -29917132, 7864622, 25834228, 8440684, 12899397, 52964464, 54776940, -46526844, -4029216, 23081692, -15110232, -39225400, -65594888, 11265699, 7696045, -2989297, 8706972, --20716238, 4061965, -5102958, 23547696, -1869921, 18827526, -23713052, 11256036, -29102698, -6027987, -12192338, 1676648, -14849313, 3052111, -12241731, -13603235, -5686000, 3054796, 11028939, 13887777, -18773302, -4990215, -1085016, 4412005, -5232344, 5591511, -19591494, -17132088, -11655467, -16071768, --15105400, -16411070, 10281078, 7034083, -2727841, -10952703, -15997679, 9166534, 92342, 14771466, --3819837, 13023951, 9909026, 76236, 4219806, 15699716, -19527068, -18815178, 11093364, -2208687, --14444512, -30776126, 9231495, -18315888, 9505299, -7756711, -21602612, -6445672, 255014, 11261404, --8893267, 5910949, -31880468, 30577482, -67258112, -6400038, -16494285, -13492103, 9489730, 39104604, -6650757, 14429480, -32898376, 7849053, 12724914, 26999238, -13409962, -21166672, -14511621, -6926709, --568009, -190052, 16554415, 12105902, -9035001, -48489644, -22748294, -39358544, 5083631, 70491152, --49117244, -19248970, -7145215, 40909028, -13063680, 17528298, -12458090, 19928112, -7237020, -11425150, --24665998, 13391171, -28661928, 27398670, 49238580, 6678138, -8474507, -8694624, 40933724, 11143830, -155693, 21788370, 7537131, 8148090, -7253126, 47153908, -72927472, 53613004, -44224740, 21671868, -53057880, -41717016, 85703928, 58454504, -21286932, -6863358, 59119152, 21809308, -5005248, 38997228, -35128000, -44546864, 60990148, -36134096, 11318849, 12003360, -15629923, 12081206, 20322712, -11787538, --21536040, 7605314, -11334419, 5551782, 5662378, -5652177, -16744467, 7337415, 6791954, -6667400, -7896298, 6296959, -13343927, 34656628, 4334696, 1141388, 1338419, -6503654, 5852967, 5043366, -2434173, -10720775, 6426345, 2003602, -4243428, -9346923, 21772262, -7567196, 17834314, 20053202, --1340030, -6834367, 5837935, 5260261, 8275865, 24082418, 21020644, -17830556, 9169755, -6985765, --390842, 10639171, -1634235, 49753440, 47438452, -40207336, 39534636, 36369784, -33879240, -51261508, --75781480, 17819282, 114192976, 46966004, 369904, 23648090, -108848432, -44917304, -3697430, 16720308, -82184200, 80347560, 14024142, -30840550, -60226716, -35316444, 4271345, 26001196, 39391292, 63184876, -38280508, -50770272, -119998704, -97881768, -9435506, 109086264, 118790744, 74998720, 23090818, -25121264, --48212080, -73109472, -41515152, -44451836, 87456808, 72645080, 46080704, 40652404, -61495880, -86425480, --100117296, -89820648, 34839164, 121734408, 150086016, 50689204, -45168024, -106667664, -127728568, -34802120, -20842940, 13234942, 80325016, 31422518, -29996588, -17933100, -61378304, -13459891, -70204464, 30502320, -83800720, 156241776, -9223442, -83566104, -181222928, -7122667, -61089468, -6551973, 87278568, 17200808, --7699266, -38856032, -81468552, -53637700, 39560408, 63340568, 21158082, -11132018, -27547384, -33413234, -32807108, 37284076, 23393614, 19929722, 9262634, 18573050, -1476932, 1687922, -17820894, -8492761, -2406256, 47040092, 41564008, -2229625, -17324288, -4689031, -41719164, -28373090, -704912, 15953119, -43882756, 33411624, 24173150, 2044404, -58228484, -52937620, -35339528, 13703093, 56965760, 109462608, -67546952, -50705312, -90574416, -80554792, -31936304, 2113661, 75537200, 94286344, 70966816, 12212740, --55582784, -127587912, -79746808, 25726318, 79597552, 90094992, 26947698, -13459354, -34496640, -41760504, -707059, -10460930, 51341504, 30015378, -4581657, 10883447, 5512054, -36643588, -3876745, -3017215, -3937948, 1101659, 2872796, -13423383, -5411659, -4975720, -3429532, -6125697, 21844740, -7904888, -9348533, -16522739, -1724966, 6774774, -846109, -5041218, 37766184, 5206037, -21488796, -24919400, -5163088, 5204964, -14700599, 4031901, 18929532, 9844602, 17810692, -18331994, 5463736, -671626, -4217658, -12910135, 2369748, 14276471, 20161114, 5104032, -5358509, 5915781, 2199560, -4736275, -13712220, -20412906, 4510253, -33236068, -10499048, 13700409, -11374684, -13370233, 17956722, -11540577, --31113280, -24021752, 21148956, -2673617, -4328790, 4865661, 10654203, 26914950, -17682918, -22899156, -849330, -3163244, 18112414, 112206, 10534481, 4857071, -1938641, 27958090, -36587216, -5366025, --5288179, -21434034, 5338645, 11956652, 382789, -12779675, 5510443, -2907693, 3485903, -11055783, -7940321, -605054, 1161252, -1012539, -2860985, 14155675, -14428943, 1069984, -2604361, -5171678, --4731980, 1614908, -6348499, 6464463, 8178692, -8735427, -2383707, -3373697, 7471096, 8428336, --4461398, 10399190, 834297, -1561758, -7242389, 7479149, 2405719, -3047279, -11856794, 5436355, --10782515, 6742562, -5929739, -5196911, 9426916, 9556839, -13385266, 1499481, -3320547, -12974022, -3927748, -7621420, 8190503, -7514582, -30088930, -33182918, -78932376, 22812718, 22565222, -1613834, --66542464, -43021612, -6335614, -10923176, 44452912, 29982630, 14417668, -29465624, -12166032, -7817378, -27831924, 3045669, -7941932, -17301202, 11407970, 5056787, 13841606, -773631, -5666136, -7090991, --15934866, -7968238, -9647033, 26579942, 14207752, 3114925, 3979287, -17530982, -947577, 2111513, -24271398, -1772748, 11308112, -9041980, -6297496, 4929012, -10016937, 6594923, 2895882, 7094212, -23676008, -2092723, 20775830, -294205, 13338558, -10344966, 867583, -15203110, -19666118, -20700132, --17710834, 5812165, 3060701, 1504312, -26077430, 12861280, -22698366, -2579665, 1171452, -14231374, --15402826, -8147553, 272194, -27115202, -18342732, 16818556, -8189966, 15657303, 2484102, -4364224, --14660871, -16935056, -1107028, 23990614, 29743722, -7428683, -3054796, -11206643, -14919643, -10310069, -9478456, 5025112, 3642669, 9292162, -1847373, -6183679, 6442451, 3539053, 5361193, 8127689, --4570919, 2729452, -908386, 173409, -6209986, 10744398, 3404835, 2438468, -3232500, 1543504, --234613, 16757889, 2136746, 5016522, -9409200, 620086, -6092411, 10963978, 758599, 157840, --3863860, 2538863, -1262720, 130997, 5255430, 491237, 6888054, -4690641, 2238752, 719407, --8826158, -483184, 5049271, 1935420, -1815697, 17746804, -38152732, -94612224, -90687160, -13756780, -27435714, 91260536, 78864728, 74349640, 79859552, 44466332, 10760504, -40305584, -40502080, -84171696, --65369404, -57303992, -36354212, -45721536, 62989452, 51831664, 68209984, 39351564, 55751360, -2004139, -14686104, -8937827, -21746494, -12420509, -26001732, -30228516, -30131344, -29702920, -35187056, -25738666, --20921860, -2350421, 5542656, 49473728, 41502268, 21897890, 23503672, 32647658, 30276298, 14609331, -70395584, 9185861, 920197, 13238700, -26297548, -80736792, -23109608, -64712272, -69442104, -73332272, --51901460, -46185392, 2305861, 38361576, 39095476, 47794396, 86872160, 62565864, 76235672, 74968120, -47801376, 51445120, 17547088, -18049064, -58700392, -76968496, -87997440, -57198228, -78978544, -66318592, --75833552, -44202728, -5293011, 20817170, 61349312, 58597848, 59436980, 99037112, 68961072, 81874424, -50959252, 8522826, -9623948, -24745454, -40991704, -45844480, -48641580, -47334836, -54641648, -46769508, --34274912, -20999168, -10922102, -8198556, 23685670, 22563074, 31714576, 51331840, 57765164, 36694052, -44125956, 27271432, -1708860, -11966316, -26683558, -33286534, -28613608, -24642374, -29909078, -10888816, --7439420, 695785, 8391292, 9402220, 2312840, 1302449, 8213051, -1187022, -7259569, 6633577, -3852586, 4733591, 7246684, 2183454, 1877975, 4459250, 10094247, 8725226, 3910031, 852014, --2333778, -8684424, -6696391, -7903814, -6986838, -2757906, -5435281, -4656282, -2718714, -2073396, --3004867, -828929, 3099893, 3169686, 3795141, 6293738, 4003447, 2831457, 3544959, 927713, -641024, 338229, 5906, 26307, 64961, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --4422206, -7414188, 2582886, -1357747, 1876364, 2378875, 4445291, 7424925, -3573950, 2461553, -3045669, --2370822, 1486596, 9664, 614717, -5254893, -2555506, 1842541, 3695283, -501437, 3112778, --5634460, -4997732, 3134253, 2003602, 855772, 2280628, -1929514, 4025458, 4504347, 4374424, -6274411, -3491272, -2888366, 218506, 789737, -6030671, -389231, -528818, 1646046, 586800, --3777961, -934692, 5122822, -2747169, 996969, -3150359, 1498407, 1579474, 1017907, -4690105, -3772592, 339839, 843424, -651224, -1549410, -1948841, -3204583, 6790880, -1206886, -1258425, --1533303, 3012920, 695248, -6433324, 1624035, -2941516, -4420058, 2597382, -2735894, -6963753, -2767033, 1015760, 295816, -6417218, -7785165, -3181497, -3841848, 3600256, -1054415, -15032, --1767916, -2107755, -1758789, 48318, 3176128, 574452, -1430224, -120796, -1494112, -664646, -1403917, 424665, -1354525, -1825898, -639413, -751619, 691490, -461172, 255014, 252866, -754841, 194347, 1085553, -461172, 249645, -255014, 762357, -49392, 699006, 4347044, -517544, 375273, 3867618, -5771363, 966905, -4815732, -6096706, 1760400, 5720360, -3535295, -2716030, -2660195, -1285269, 1154809, 288300, -2828773, -8406862, -8347269, 150861, -2111513, --75162, 4370666, 701153, 5350456, 7226820, -3805341, 6241125, 783295, 6335077, 403727, -7517267, 960999, -4204773, -1152662, 424128, 3427921, -925565, -1125818, 747324, 2602213, --3122978, -185757, -963146, 2302639, 2801929, 158914, -2845416, -197569, -514322, 1648731, -2942590, 5274220, -1837172, 3424163, -1539746, -4581120, -4092567, -2763812, 2596308, 2820183, --1547262, 4563403, 151934, 1660542, 239444, 5548024, 3677566, 4089883, 1661616, 2411087, -1487669, 2237678, 4531728, -955093, -231391, 6403260, 1286880, 191126, 1333587, -2372433, -358093, 1894081, -141734, -5972152, 1876901, 642635, -957241, -2068564, 1384590, 415538, -3258807, -1195612, -590021, -1239635, -1010928, 830002, 238371, 1312113, 619012, 308701, --1174674, -926639, -548682, -572841, 514322, -1547799, 1371168, -552440, 406411, -369904, --553514, -856846, 529355, -689879, -523986, -1686312, 6424198, -6649683, -4496294, -3700114, --5393405, 1649268, 2261300, -4344360, 953483, 8794482, -6482180, 4439386, 7575249, 7494718, --4693863, -1313186, 3688840, 675921, 1112397, -3422552, 1809792, -11506217, 8958765, 14070313, -2452426, 4715337, -2338610, -227633, 7446937, -3973382, -9095130, -1539746, 89657, -60130, --7356205, 509491, 1773285, -8720394, -4128001, 4001836, 1322850, -3120831, -849867, 2982318, --4283156, 8968965, 2762201, 388695, -5820218, -597000, 3058554, -1986422, 146566, -2087354, --161598, -884763, -4672388, 265214, -4520453, 6729140, -6569153, -4365298, -1507534, -7834557, -5190468, -4225174, -10920491, -2021319, -4736275, 1307281, 4953171, -5101885, 586263, -3470871, -3504157, 470836, -3638911, 3062312, -3939022, -5167383, 5687611, -3723200, 1592359, 119722, -476205, 1984275, -1176284, -1769527, -1999307, -3154117, 1007170, -4449049, 209380, -915365, -1349694, -1336272, -151934, -11811, 75699, -2369748, 2064269, 84289, 354872, -1284732, --933619, -966905, -108448, 1398549, -5071283, 3238942, -146566, -993211, 3844533, -3637837, --12781286, -2495913, -784368, 5587753, 7914551, 7010461, 3373697, -2750927, -858993, -7881802, --6679748, 2308008, 8993125, -2573222, 9212705, 5859946, -5679558, 3055869, -870268, 3195456, --6347962, -4284230, 1051730, 4588099, -576063, 2735357, 3826279, -7181722, -1436667, -3313567, --9774809, 6081674, 974958, 2208687, 4246112, 7756174, 2711735, 363998, 6091874, -1422708, --3104188, 6256694, -3286724, 10574209, 4882304, 4204236, 230318, -3042984, -3689377, 5182415, -7056095, -5237713, 1284732, 6724845, -1182727, 2185065, 14873472, -4497368, -1777043, 2885681, --7437273, -304943, 1347546, -3325915, 3634079, -2410551, 2246805, 7372312, 273804, -1703491, --5006858, -418759, -6221797, 2632815, -2298881, -3071975, -1262184, 1178432, -1777580, -1804960, --1495722, 332323, 2315524, 1693828, 485868, -539018, -678068, -536334, -326954, -1043677, --1817845, -364535, -550293, 962073, 24159, 479426, -1837709, 777926, 1001264, -704912, --1606855, -615254, -1685775, -912144, -738734, 1249836, 159988, -281320, -107374, 283468, --2547453, -505732, 920734, -3192771, -18236432, -1417876, -321586, -3594351, -5611375, -1791538, -9885404, -6892886, -10351408, 3980898, -4167192, 1559073, 1917166, 6660421, -4434554, -1285269, -1358283, 6198712, -2806224, -3951370, -1144072, -3389266, 4576825, 8345122, 4223564, 147640, --623844, -4665945, -224412, 13088376, 2349884, -1541893, 15097884, -824634, 11243688, -3303904, -149250, 7666517, 2363843, 1963874, 2768107, 1408749, 4234838, 2510409, -7083475, 13355738, -8128226, 10981695, 7369627, 4893042, -7208029, 3293166, 3758633, 640487, -4397510, 12408161, -7520488, 11218455, 2041720, -2137820, -2685965, 8284455, -3939559, -8383240, 10020159, 3201898, --5413270, -3088082, 554051, -2474438, 1034550, -1072131, 1466195, -3370476, -886911, -7926362, -3136937, -899259, -147103, 3033858, -924492, -1411434, 4776004, -222801, 3724811, 4997195, -4085588, 2682207, 2640331, 1127429, 1569811, 115427, -954020, -842887, 2217277, -512175, --1253594, -1280437, 1089311, -1455994, -335544, -212064, 2750390, 1216013, 1990717, -1704565, -639413, -1347009, -437550, 1952063, -179315, -654983, -523449, -387621, -4587562, -609885, --11943767, -4680441, -13363791, -9135395, 1043140, -8655970, -6802692, 872415, -1475321, 9047349, --5923297, 10020696, 12272332, 1321239, -10329933, -7229504, 11027865, -5502927, -2951180, 6226092, --7985955, -14200772, 5770289, 12387223, -6285685, 3218541, -179315, 5444408, -14836965, 3042448, --5931350, 3672197, 350040, -6170258, 10429791, 4821101, 4433480, 13899588, 6492917, 2934000, -7881802, 1647120, 2585570, 4024921, 1367410, 708670, 2186675, 1966558, 15791521, 8931921, -12348, 13287018, 8320963, 9829033, 15291694, -7714298, -6462315, 13432510, -4610111, -435939, --7885560, -3278134, 4793721, 7164006, -5999533, -632971, 2054605, -1630477, 3720516, -6317360, --1161252, -7319161, 14416595, -4567161, 7889318, -2152316, -3804804, 10654203, 1888712, -3015604, -3471944, -1226213, 333934, -2909304, 4031364, -670015, 1470489, 4366908, 2486249, 1365263, -2442763, 273804, -357556, 1805497, 462783, -2841121, 656056, -525060, -1344862, 2743947, -20401, 1388348, 1108102, -503585, 527207, -1626182, 376883, -1476395, 150861, -545461, -1935420, 609349, 1664300, 544387, 4553739, -4858145, 1569274, 706522, 1555315, -6977711, -9082245, 5277978, 12338367, 2397666, -1668595, -13914620, -7441568, -5209259, 3556770, -7222525, --12054363, -3346317, 3090766, 1354525, -13462038, 10940892, 841277, -803696, -11467563, -6581501, -2705293, 1430761, -12741020, -3944928, 4656282, 534723, 1284732, 6550362, 7628399, 4478041, --1973538, 3868155, 1188632, -4547834, -9432285, 16273094, -4081293, -7888245, 153008, 4057670, -5248987, 12176769, 1993939, -191663, -4569845, -105764, 6733435, -820339, 8413841, 16165183, -1350767, -3464965, 483721, 13924284, 17365626, -8622147, 2418067, 2462627, 9385577, 5002027, -1649268, 2928094, -6924561, 4350265, 4471598, 4515085, -2997887, 298500, 3402151, 5216775, --739271, 1822140, 1185948, -5829881, 2823941, 325344, -5309117, -3802120, 5607617, -2473901, -3875671, -5587216, -4320200, -1870995, 1266479, -33823, 5055714, 2370822, 893890, 304943, -2519535, 2397666, 719944, -4221953, 169651, -1737851, 667867, -1292785, -1063004, 10737, --450435, -544387, -1478543, -4129074, -1187559, 523986, -2850248, -1731946, -1816234, 147103, --1819456, -2885144, -718333, 1477469, 2254858, -4488241, 6431177, -5662915, -10304700, 7203197, --801011, -2478733, 2764348, 6138045, -17314624, 1108102, 13344463, -1503775, 23974508, 11478837, --7265474, -5323075, -2200097, -6871948, -3027415, 10726144, -4067334, -3463354, 10752451, 8732742, -2915209, 5025112, 10053982, 6664179, 7536057, -5448166, -3706557, 9542344, -1818919, 8641474, -104153, -10233833, -6555731, 2820183, 8170102, -11135240, 748935, -5927592, 3180960, -6780143, -9548786, 9508521, -9192304, -946503, 2755759, -261993, -12447889, -5568425, 2200634, 8328479, -13700409, 4675609, -10050223, -2193118, -2400887, -1149441, 8640937, 1400159, 6936909, -10302016, -4702989, 741419, -8135205, 9744207, 4188667, -1276142, -2112587, 1711545, -301185, -8327405, -6364605, -1901060, 3821984, -6465000, -11425150, -6339372, 2785823, 5160403, 191126, 2863670, -10384694, 137976, -2568391, 6518150, -1938641, 6136972, 431644, 2013266, -5168457, 565862, -210990, 2830920, 3154654, 4356708, 2825015, -1036698, -1190780, -1984812, 5208185, -2374580, -2750927, 587337, 1691143, 2131915, 2953327, 1293859, -904628, 2615098, 1098975, 893353, --912144, 3508452, 1731946, 756451, -3374771, 1284732, -1276679, -11274, 2456721, 11126650, --13597866, -2118493, -4307316, 14050986, -6200322, 11586748, -3544422, 10820096, 14653355, -6418829, -4660577, -3660923, 8371428, -3107409, 6979859, 5801964, 5473936, -1187022, 5754720, -2822331, --7185481, -3425773, 8143795, -9408663, 1554241, 19327, 7261716, 14640470, -13290776, 523449, -13131863, -266288, 12011413, 1685775, 5310727, -1596117, -955630, 3279208, -18380850, 1868848, --383863, -7284265, 4937602, 3071439, 13441100, 6710350, -1270774, 25465398, 6391448, -13344463, -3601867, 1333587, 8934606, -5724655, 1762547, 7545184, 649614, 4612795, -1277216, -14585172, --14925548, 71941, -5007932, 12079059, -20305532, 26220776, -97711, 14614700, 16728361, 4045859, --4361540, -3295314, -7776575, -10341744, -833761, 3379066, -2577517, 5271536, -3449396, -8324721, --5223754, -4195110, 1556926, -1280974, 973347, 5629629, 2870649, 2680060, 2105608, -2321967, --2829310, 183610, -560493, 1622424, 432718, 661962, 1815697, 3266323, 1989644, -6477348, -1232119, -1217623, 4769561, 4768488, 2801929, -434329, -1335198, 1872606, 1534377, -2292439, --2374580, -598611, -1610076, 454730, -1723893, -3143379, 1294933, 5244155, -1311039, 2110977, --3983045, 516470, 2358474, 2401961, -79994, 1539209, 3419868, -24267638, -1764695, 8190503, -1307281, -9148817, -22539988, -64425, 2518998, -3999688, -991064, -6678674, 3435974, -5570036, -11534135, 4030290, -6951942, -8688719, -14832133, 11011222, -4764193, 699006, 14362908, 19758998, -12035035, -1898912, 992137, -13648332, -5856188, -5523328, 3606699, -19340238, 4996658, 5209796, -1063004, -9971303, 9479530, 14747844, -2425046, -316754, 1689533, -8649527, -9119826, 5170604, -3544422, 11141145, -12345347, 13304735, -7070053, 7307350, -11429982, -9055939, -4538170, -350577, --1379221, 4818954, -2486249, -19988240, -14972793, -4265977, 505732, -20042464, 254477, 9823127, --5311801, -2370285, 3007551, 8342974, -17602386, 8922795, -3111704, -2707440, -103079, 7119982, -8957154, -10627360, -5406290, -7167764, -3462281, -2632815, 5205501, 1663226, -6383395, -2930242, --4896800, 3319473, 11679090, 7629473, -68719, -412854, -6531572, 171799, -3991635, 5424007, --1003412, 9517111, 3202435, 3268470, -3446711, 119722, 114354, -7758859, 8195872, 528281, --1443109, 4185983, -1509144, -1385127, -384400, 540092, -6649683, 2835752, 4062502, 4204236, --684510, -1669132, 1468879, 2332704, -2371896, -1513439, 2371896, -5166846, 571231, -230318, -4768488, -472446, 21748640, 530965, -4409321, 16915728, -3692061, -6875169, -1815161, -1552094, -20980916, 23992224, -3116536, 5107790, 6120866, -3059627, -11382737, 5612449, 22313428, 17017734, -14557255, -5277978, 6315213, 11981885, -15535434, -11574937, 13590887, -6925635, -7595650, -519691, -16989280, -2553358, 15641197, 1029718, 14038101, -8392366, 19284404, 5865315, -5960341, -9826885, -3536906, -13904420, 1689533, -16499654, -5609228, -5917391, 9467719, -9446781, 15586436, -19053012, --32944010, 20601884, 9243306, -4050154, 197569, 22723062, 10695005, 1805497, -5938329, 4908611, --2619393, 272194, -14739254, -14981383, 8844411, -5031018, 4900021, 28209346, -7351911, 6066105, --18388902, 21795886, -7266548, -9740986, -4634270, -3051574, 9134322, -18480170, 15480136, -18114024, -13092134, -9329743, -12593918, 12593381, -511638, 4121021, -5084705, 7444252, -4054986, -5708549, --2513093, -8649527, 5986111, -294205, -5589900, -2404108, 2136746, 9200894, 1782411, 1299765, -2496450, -248571, -1535451, 4660040, -2594697, 2094870, 1989644, -2415382, -639413, -558346, -6655052, 5759015, -2090575, -3228742, -6883222, -159988, -1375463, -1027034, -1090385, 171799, -6381248, 1869921, -726386, 7967701, -24724516, -18378702, -17820356, 24875376, 831613, 10676215, -6359236, -21916144, -19164144, 12881681, -34190088, 9988483, 10149008, -2197950, -13606993, -12511240, -21293910, -11455215, -1510218, -3583077, -11045045, 16199006, 5152887, 14656039, 8517994, 10111964, --3212636, 16456167, -1521492, -10762114, -12680354, -2917357, 7134478, -9607305, 12771085, 8204998, --9641128, -34610456, -2915209, -2842732, -864899, 25149718, 562104, -19698330, -11696270, -12044699, -10318659, -7591355, -16413754, -18306762, -11398843, -8900783, -40820444, 980863, 5081483, 13410499, --21327734, 6983080, -17624398, -14408005, -4944044, 17065516, 4353486, 15840376, 29894046, 9004399, -6852084, 19508816, -15215995, -1935420, -7233262, -8335995, 15613817, 14457934, 22942104, 11289322, --21032992, -13993540, 16494822, -24823300, -27368606, -8591545, 19917374, 3170223, -4888747, 13602698, -11076184, -105227, 3148748, 11536282, -7559143, 6829535, -5575942, -1051730, -5810017, -1065689, -1501628, 8085276, -5143224, -6470905, -34360, 4568235, 1438814, 4155381, -664646, -6468221, --1570347, -4279935, 317291, -3573950, -725313, -494458, -7313256, 5928129, 883153, 6033892, -7546795, 10473278, -3948149, -5552319, -464930, 1023276, 12047383, -10572062, -22408992, 6523519, --35970, -154082, 1124208, 3447248, 5104569, 10237591, 3524021, 8659728, 4901095, 10207527, -26016764, 1122597, -33260764, -12023761, 8772471, 588947, -6704444, -21300354, -13930190, 4790499, -17740900, 7022809, -16443282, 9188546, 7350300, -18647138, -3310883, -23119808, 18595060, -9495099, --11937325, 17175038, -16159814, 4817880, 35544612, -3911642, 5987722, 10647761, 173946, 5367099, --20456930, 5255966, 3885872, 3569655, 46610596, 31621696, -3234647, -15963857, -10482405, 14789720, -17134772, -18377628, -10139344, -24737402, 39808980, 11120744, 4802847, -6174016, -4101694, -8629126, --4675609, 28669980, -7406134, 7897371, 28649042, 4968204, -7813620, -20924544, 753767, 8624294, --42232952, 9405978, 4849555, 29189672, 20030116, 15635292, 26114474, 14807973, -4926328, 2709051, -9242233, -2781528, 1473711, -1693291, 4323959, 2423972, 24415816, -568009, 10153303, -4140349, -9816148, -685584, 13034152, 2833605, 3791919, 11783780, -731755, 4948339, 8089034, 306016, -6584185, 9076877, 4181151, 7252589, 10683731, 6098317, -3675955, -673773, 2538863, 2648384, -326418, -4115653, 2318746, 2815888, 1479079, 5634460, -536334, 8795019, 4981089, -3504693, -9321153, -1173600, -5903970, -27122182, -3881040, 18710488, 10491531, -30383672, -40066676, 4626217, -27205396, 11018202, 16627429, -9429601, 12842489, 2173790, 344671, -14522895, -5201743, -22626962, -33643016, 11300596, -27312234, -18712636, 12226698, 1327145, 6738267, -8145406, 16779364, 9835475, -11548630, 22054658, 19501300, 4056060, 19064822, -9999758, 10940892, -12348, 13298829, 6156836, --3208878, -7976291, 9171903, -11864847, 31368294, -8380555, -5954436, 6491843, 15493558, 15399605, --10416906, 27096412, 26763552, 15646029, 6451578, 2316061, -8653822, -20288888, -34875672, -5585068, -12345347, -671626, 15113990, 16608639, 17663590, 6258304, 9814537, 57942332, -28506772, -12329240, -5662915, 11277510, -1540283, -45061724, 10515691, -6915434, 6680285, 8121783, 19918448, 4132296, -236223, -18035104, 18725520, -6615860, 2599529, 16634945, 7369627, -17464410, -3940633, -9747428, --3517578, -7444789, 1088237, 853625, 6935836, -1534914, 8488466, 8665097, 11052025, 62277, --285078, -6642704, -3267396, -8949101, -6372121, -2534031, 11726871, 4017942, -2113124, 1007170, --4924717, 1930051, 10231149, 11973832, -2609730, -10652056, -476741, 881005, 4796405, -2778844, -3215857, -4933307, 7656316, -14973330, 1216013, -4430796, -5708549, 239444, 2662880, -9554692, -4365835, -1613297, 4304631, -5071820, -8919573, 3413962, 15158013, 14920716, -8206072, -11167989, -3339337, -10730976, -34408056, 35601520, -10368588, 10020159, 3314641, 29863444, 23816668, 14972793, --14216879, -2338073, 20437066, 10849087, 24050744, 64064268, -3943854, -25232932, -6558952, 19161996, --2836826, -29806536, 45585708, 23622320, -16041703, -24953760, -3055332, 5609228, -7910256, 18107582, -15401753, 17767206, 34038688, 5705327, 9634149, 6089190, -13151190, -31654982, 18640158, -21538188, --16160888, 24999394, 13124883, 14104136, 7422777, 5155035, -1406602, -31259846, -27728846, 523449, -16626892, -20664698, 19606526, -9164923, -23157390, 7316477, 20369956, -3755949, 3943854, 20207284, -19937776, 20674362, 1551557, -12612171, 11810623, 49118856, 5951751, 19975892, 28087476, 1373853, --8867497, -24682104, -9953050, -38898980, -13311714, -9736154, -4771172, 8842801, 1539746, -1767916, --11152956, -7366406, -6466074, 9610526, -9976135, -1999844, -8798241, 2874944, -5578626, -9584756, -408022, -13795435, -4836670, 235149, -12433393, -2356863, -10829760, -6270653, 1225676, -19921132, --1903744, 934155, -198642, 9411884, -12656732, -4177930, 13619341, 264677, -5334350, -590558, --4554813, 2618320, -5821828, -4418448, 6788196, -467078, 478889, 18168248, 14977088, 530428, --11720966, -17381196, -30827128, 5687074, 19188304, 26189636, -21982716, -23448374, 29105382, 13157632, --985158, -2782065, -11857331, 5667746, -5447629, -12385075, 13426605, 16336445, 11349451, 1226213, --2210835, -8908299, 2092723, 6946036, 4260608, -10084583, -36003636, 8209830, -8077760, -10705743, -2152316, -4533338, 3172370, -35884452, 16937204, 13308493, -25798258, 18293340, 24246164, 20311438, --5272073, 3521336, -3084324, 13292387, -2833068, 64425, 64538328, -19200652, 5496485, -17127792, --9880572, 36504536, 13448079, 12557411, 23407034, -29477972, -24373940, 36703180, -23004918, 18799072, -23230942, 2343442, 6303938, 8920647, 41626288, -13965623, -15699179, -37936908, -8011188, -16263431, -13040594, -23692650, 40462352, 22069690, 24773372, 12258910, 21671868, 11416560, 38633232, 9599252, -18668076, 14261439, -18762564, -8932458, -7162932, 3486440, 2347200, 18974092, 8378408, 105764, --726923, 4421132, 1915019, -7213398, -14256070, -7577933, -10662793, 13729937, -4631049, -7647190, -4558034, -2894808, 16969416, 7878044, -2824478, 9543954, -10647761, 5302674, 8628589, -2949032, -16443819, 16729971, 11279121, -7689065, 13913010, 8012799, -13382044, -2502355, 1581085, -8091182, -1095217, 11978127, -13464722, -15654082, 7122667, 3232500, -1341640, -10349797, 26659398, -15407658, -14107894, 45291504, 22506166, 17154100, -25273198, 7159174, 25241522, -21509734, 35723928, 12826383, -19128710, 17126182, -10945187, 17740362, 15285789, 6456410, 35418448, 26855894, -1999307, -60508572, --7063611, 28168544, 27176406, 27933930, 6724845, 15611669, 1417339, 7882339, -1965484, -18705656, -38816304, -964757, 36988260, 16689169, 26706644, -37244344, 25351582, 12659953, 11439109, -9725417, -8845485, -6897181, 8447664, 37179920, 14865956, 48496088, 2462627, 10766409, 28381144, -5665062, -44572096, 21983254, 3981972, -29416768, -18337362, 16276852, 1957968, -4864588, 1072131, -4982162, -3595961, -21427054, 14460618, -22820772, -33939368, -12705587, -1792075, -11339251, -8659728, 28883118, --3325915, 26305600, -24898462, 28900298, 3999152, -31935230, 31765042, 26444114, -9774272, -4445291, -7681549, 13892609, 9040369, -1325534, -14381161, 9156333, -6135361, -922344, 18384070, -3730716, --2865280, -14766634, -3813394, 4081830, 2988760, -995359, 13858786, 12152073, -9460739, 3283503, --92342, 503048, 12759811, 3854733, -13623636, 9259413, -11633993, 5964099, -9385040, -3825742, --2884608, -2165201, 1748052, 2634426, 1811939, 711891, -2598455, 2297271, -6484864, 4558571, -5379447, -1146756, -5297306, 4006668, -1105417, 6811282, -3723737, -3313567, -9417253, -452045, --8351564, -27005144, -25817586, -10389526, -11183021, 20903606, -33804076, -42122356, -45798312, -55315956, -24714316, 27135066, -1580011, -4461398, -172872, -13169443, 3205119, 6861211, -11662984, 37642168, -35469452, 23162758, 25373594, -23382338, 15526307, 1262720, 18489834, -7307887, -9527311, -34564288, -30903900, -31236224, -37811280, -9958955, -7943542, 40552008, -22297860, 5428839, -21048024, -5913096, -39121784, 7230041, 12377022, 19343996, 35929012, 2183991, -4023848, -43921408, -8101919, -3546032, --1247688, 24023362, 12928925, 81713904, 4093641, -2552821, -27111444, -2205466, 32494648, 29781304, --2685428, -14391899, -40385576, 10066866, 25567404, -13118978, -29452202, -12499429, 25198574, -7713225, -18496814, -58531816, -32745368, -46790984, -12661564, 18780282, 9974525, -20383914, -19457812, -22903986, -9188546, 48209396, 14589467, -206695, -17107928, -1383516, -13327820, -3637837, 5698348, 5703180, --15346455, -6927782, -1379221, 10466835, -26081726, -17733384, -6099391, 12828530, -1794223, 16877074, -5386426, 2005750, -5903433, -2893197, -11750494, -2466922, -17701708, -3914326, 19414862, 7006166, -8831527, -13535589, -24476482, 12144020, 11470247, -7051800, -29528, -10052371, -1904281, 3102040, --1348083, 9204115, 5662915, 6041409, 11611444, 6512781, 9163850, 9984188, -2003065, 8033200, -4246649, -6693707, -16349330, -8483097, 39759048, 1304060, 231928, 70380552, 6968585, -52121040, --40023728, 49353468, 43810276, 2788508, -34715684, -43120396, -24729884, 8619462, 42618960, 38004556, -25460030, -15458124, 5045513, -15526307, 13952738, 32366874, 49885508, 54507428, -6759742, -28972776, --45889580, -68576672, -652298, 36761700, 148871088, -19289772, -7877507, -71757096, -29685204, 6231461, -17242684, 88737248, 63971392, 39658116, -44936096, -25307558, -43903692, -2469069, 74257304, 68743096, -83689584, -22934588, -82261512, -59792924, -83060376, 20948702, 76348952, 67188856, 123729416, -58929100, --71775880, -62857384, -10439992, 54813448, 72966128, 102040368, 46205260, -21308944, -39608188, 9501005, --2980171, 29111288, 81609744, -17832704, 50732692, -17988396, -46887084, 790811, 7368017, 44277356, -2136746, -4001299, 4242354, -11458973, -40550932, 17042968, -5562520, 13944685, -11448772, -33298344, --8070244, -7772817, 3794067, 22296786, 3120831, -6304475, 8552354, -8002061, -10386305, -1848983, -32360968, 8319889, 29717416, -2062658, 3407520, -8388071, 3884798, 3525095, 6016176, 23044648, -39699456, -1065152, -10701448, -36237712, -47964584, 2005213, 2913599, 58187144, 37473588, 6404333, --20088098, -81723024, -46030240, -6939594, 37085432, 72536632, 37641632, -21808770, -26973468, -84726816, --31462246, 40558448, 74592848, 60280404, 3972845, -38293928, -43384000, -4215511, -1481227, 35291208, --6411313, -36407900, 47585552, -11111080, 56196964, -51873540, 529892, -22701586, -53886272, 39304856, --28339268, 36381056, -28980828, -11208254, -2694018, 18702436, 4080756, -20687246, -11118060, -953483, -29036126, -27156542, 33321430, 23934778, -18354542, 4131222, -23017266, -23081692, 38814692, -38472708, --19502910, 25810606, 59354836, -475668, 7907572, -5504538, -26199838, -7330973, 24129126, -8460549, --39464844, 5519570, -8760123, -6693170, 11686606, -35873176, 17877802, -143345, 12189117, 27591944, --62658204, -46271292, -15521475, -1428614, 64121716, -34144992, 23107998, 50538880, -27960774, -16438450, --1958505, 27403502, 39758512, -21873194, 11345693, -8067023, 15615427, 62227632, -23324356, -70180304, -14715095, 32116692, 8143795, -37512244, 23180476, 9806484, 23270670, -7355669, -1275068, -26203596, --21026550, 15413564, 3697430, -27924266, 7977365, 19286550, -9581535, -143345, -31199180, 4540854, --7930657, -34049428, -1408749, 15236933, 12986907, 5499706, -1147293, 8444979, -23506356, -5738613, -8000987, -11272679, 17627620, -10873247, -4804458, -10278930, -229781, -10951093, 16841640, 3138011, --13793287, -11565810, -828392, -459562, 27940372, -9821516, 9715216, -5085778, -838056, 6196564, --12499965, -10752987, 1546725, -23837068, -6947110, 7046968, -20656646, 1009317, -4115653, -6983080, -4023848, 13344463, -366683, 2011655, -7471633, -4850092, -72426568, -22986128, 31092342, 42567956, -35347044, -36126580, 11518029, -100852808, -65582540, -55731496, -8877161, 47190416, 30370788, -2150168, --22175990, -27405650, 13359496, -16783122, -1716913, 36062692, 9830106, 1651952, -35752380, -17251810, --3644280, -16964584, 10921028, -3029026, 19378892, -5126581, -197032, -6396280, -1153199, -4664872, --20408074, -15497316, -34252900, -24235964, 17499844, 33480344, 36536212, 20279762, 31843962, -4886062, -27099634, -6368900, -12379169, -42811696, -1620276, -23665806, 18343806, 6970732, 54135380, -43717400, -15555298, 30292404, -16668768, -23250268, -13411572, -10860362, -11046656, 3885872, 38477000, 24656334, --10186052, -1476932, 27639188, -31959926, -35211752, 14529874, -40876276, -31563178, -27413702, 3389803, -13370770, 15856482, 47595216, 32245540, -5062156, 23992224, -13738527, 927176, 6036577, 17769354, -28936268, 31111670, 22038014, 18152680, 14748918, 1214402, -39808440, -11335492, -20498806, -5197984, -23431194, -1044214, 3657702, -8730595, -17646946, 1945083, -8651675, -7292318, -19222126, 8511551, -14670535, -6496675, 5748277, 12835510, 7236483, 8359080, 1628330, 8229158, -5557688, 5650030, --2531883, -10207527, 7938710, 9716290, -7833484, -11739219, 1205275, -7941395, -13472776, 10509785, -11528229, 4399121, 14805826, -1346472, -13288629, 22968412, -9435506, -86497960, -127776888, -156829664, --123946312, -184840896, -32807108, -67602248, 20294258, 38631620, 133545032, 77936480, 138346800, 140676816, -192649680, 140579104, 142914496, 105228848, 4383551, -30681098, -55955908, -34471408, -115299472, -78845936, --62824636, -64205468, -63529008, -63410360, -61546880, -66406636, -72856064, -54349588, -84688704, -69283728, --60394220, -27199492, -71184784, -22092774, 25999048, -52927420, -25636660, 14063334, 11456825, -44828184, -37118716, 47732120, 60490320, 82091320, 83453360, -6693707, 49570364, 80692768, 114590264, 90278064, -180574384, 169572832, 149770880, 121324240, 153663200, 76215272, 122317448, 148902224, 114664352, 73267848, -124370440, 40256728, 41703060, 76340896, 76609872, 54346368, 15683073, 44399224, -14942728, 2514703, -38873212, -44534516, -111682032, -166882560, -66003448, -228427296, -199794896, -175768320, -203199200, -226096736, --189498784, -164084400, -158253440, -109153376, -143444384, -73741368, -91112360, -96892848, -146812176, -118706992, --85592792, -70172248, -59370944, -55713780, -34911640, 13703630, -222265, -3491809, 41261212, 86177448, -71929968, 72772856, 116196584, 99258304, 103241888, 131006704, 123636536, 105097312, 100065760, 119936960, -102216464, 98993088, 105182136, 109018616, 92835184, 81045496, 74702368, 69687992, 91281480, 71452152, -53732188, 56017112, 42037528, 24381456, -14480482, -30367030, -39531416, -71105864, -60648696, -63018444, --74770552, -79284024, -72722920, -47602732, -53134652, -48323752, -48862768, -25378962, -27830314, -33794952, --22845468, -7496329, -8087961, -15794742, -9655623, 993748, -5212480, -7736310, -5793374, -299037, --398895, -436476, 399432, 703838, 124554, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -}; -const Word32 CRendBin_Combined_BRIR_coeff_im_32kHz_fx[15][BINAURAL_CHANNELS][2819] ={ -{ -{ -5241471, -2590939, -3527242, 5304822, -3109020, -1074816, 81068, -1825361, -2042794, -4123706, 986769, -6240588, 641024, 1112933, 2654827, 637266, -2216203, -696322, -1316944, -1335735, 3787624, -1032940, 498216, -1298154, 700080, -164283, -1438277, -2364916, 3671123, 2816425, 525060, --788663, 4257387, -5930813, -2205466, 2515240, -2453500, 5091684, 522912, 3591667, 463856, -409096, 2330557, -2049236, -849867, -77309, -56908, -1600949, -1274532, 2243047, -112206, --5470178, 5125507, -727460, 872415, -4621922, 2193118, -2050310, 1816771, 132607, -158914, --1740536, -178241, -2675765, 2754685, -5195837, -586800, 3788161, -3008088, 1408749, 5661304, -1717450, 567473, -2823404, 298500, 1505386, -1069447, 1887638, -1191853, -825171, -1598802, -1708323, -1864553, -2979097, 943282, 494995, -749472, 3644280, -928250, -790811, -893890, -1209570, 1323924, -95563, 141734, 658741, -734439, 652835, -1412507, -580894, -237834, --294205, -765578, -26307, -51003, -156229, -453656, -33286, -768799, 404264, -391916, -878858, -584116, 654983, 883153, 10931766, 2019708, -1530082, 3341485, -1651415, -1366873, --1750199, -711354, -4104378, 5811091, 3357054, 2508798, 2700998, 2569464, -2692945, -3628711, -4891431, -1051193, -3795141, -7225209, 1183264, -2138894, 2267743, 45634, -613107, -1617055, -2274185, -2676838, -1352915, 3571265, 6783901, 1767379, 3086471, 588411, 3411815, -706522, -3629784, 2290291, 410169, 2030446, 180389, 596464, 186831, 4958540, 1050120, 1304596, --1120450, 734439, -351650, -693637, 4023311, 4605816, -1656247, -1695438, 928250, 4238596, --6899328, -361851, -1874216, -5106716, -2078764, 710280, -2177549, 2269890, 1838783, 151934, --3114388, 1449015, -664109, -2978560, 3820374, -5273683, -2493766, -5624797, -2784750, -799401, -836445, 5674189, -2454037, -1479616, 1753420, -896038, -1350767, 2687039, -446140, -111669, --1228898, -1903744, -2361158, -630823, 2003602, 797253, 973347, 929324, 710280, 70330, --336618, -147103, 158914, 1414118, 687732, 744103, -485868, 115427, 484794, 399969, --1074, 90194, 3221, -108985, -196495, -991064, -761820, -515396, 545998, 457414, --223338, 3299072, 1460826, -6663105, -619549, 981400, 4744328, -1432909, -8250096, 6648610, --7794829, 408559, -3396246, -2710124, -8265665, -5507759, -3214783, -2093797, 3424163, 1148904, --5435281, 766652, -2898566, 36507, -173946, 2240362, 477815, -2386391, 408559, 577136, -1358820, -1688996, -1143535, -510564, -2677375, -4103305, 5568425, 2565706, 773631, -772020, -4747550, 4078608, -4640176, 1297080, 467615, -898185, -2694018, 606664, -4794257, 1072668, --893353, -3945464, 4882304, 70867, -354335, 6070937, -5261872, 4772246, 1790465, -724239, --3892851, 1124208, -542777, -4153234, -3426310, 16106, -1487669, -1874216, -5697274, 248571, -1243930, 2664490, -1637993, 2476586, 781147, -1030255, -775242, -3399467, 2943663, 578210, -450435, -5636608, 2967823, -514322, 421981, -2923799, 112743, -5181341, 649614, 1079647, -718333, -471910, 530965, -128312, 61740, -927176, 306553, -297427, 1160178, 618475, -497142, 1017370, 41876, 326418, 1080184, 600222, -702227, -330176, 1699733, -625455, -359704, -609885, 653372, -1954747, -448824, -622770, 817118, -383326, -12273406, -11628624, -4508642, 7691213, 4661650, -10475425, 7460895, -2536715, -950262, 656056, -4846871, -3686156, -8801999, -126702, -10737, 664646, -205622, 2868501, -4372277, 2653753, -2314451, 2378338, -4031901, -2673617, -719944, 2330020, -667331, 4196183, -1304596, 1821603, 368293, -431107, -354872, -3582540, -4975183, 4697084, 617402, -908386, 42950, -4669703, -5806259, -164819, -113817, 3022583, -5397700, -4605816, -980863, -9597641, 3726421, -759136, 1958505, -740345, --2309082, 1464584, 12293807, 6820408, 3568581, -3687230, 4845797, -58519, -6313065, 15032, --6589554, 5596880, 772020, 658204, -3754338, 31675, 3832185, 1399623, 766115, 476205, -428423, 4111894, 2870112, 523986, 2796024, 1657321, 2232846, 6019934, 2500745, 2958696, --2793876, 2258079, 1687385, -727997, 4748623, 1434519, -14496, -434865, 1417339, 2517925, -308164, -40265, -938987, 598611, 2083059, 1141388, -476205, 195421, -1713692, 481036, -429497, -774705, 164819, -118112, -34360, 1154809, -227096, 1205275, 1671279, 590558, --984621, -1903744, 308701, -1205275, 909459, 808528, -1203128, 477815, -17632988, -1342177, --4241817, -616865, -2947421, -10002979, -426276, -2690797, -4124242, -9377524, -1156957, 6657736, --4653597, 4379256, -776315, 6174553, -2093260, 5016522, -1654636, -4968741, -1334124, 533113, --2180233, -4467840, -3590593, -4392141, 140660, -4007741, 1459215, 471910, 399432, 1894618, --3015604, -4037806, 5822902, -532576, 1725503, 59056, -4574677, -2902324, -3230352, 155693, --2319819, 4059281, 4125853, 680215, -5603859, -1837709, 10302016, 2561948, -4361003, -3469260, --2209224, -3821447, -2021319, 8048232, 4896263, -5846524, 3573413, 4746476, 7007776, -1810866, -2847027, -432718, 59593, -2840584, -5839545, -1058710, 4304094, 440771, 8338679, 5916318, -393526, 1934883, 7033009, -5605469, -2570001, -1655173, -3453154, 2477659, 1088237, 1135482, --3026878, 2052994, -2199560, 2275796, -4303021, -202400, -398895, -1689533, -105764, -370441, -2112587, 576599, 473520, -1845225, -1247688, -595927, -1737851, -75162, -2506650, -1459752, -101469, -195958, 1561758, -1066763, 427349, -516470, 849867, 613107, 2160906, -1786706, -22600654, 15170361, -4670777, -851477, 58519, -615254, -2582349, 3156801, 7739531, 6532109, -3394635, -11855720, -5266167, 1524713, 691490, 5038534, -8921721, 1804423, 12104292, 8145406, --1386201, 2902324, -1059783, -4085588, -5575942, 311385, -4750771, -2774012, 1395328, 3757560, --3481071, -6489696, -3081102, 1115618, 5963025, 8322036, -1581085, -8801462, -1859184, -3147674, --8827768, -533113, -264141, -4239670, 1463510, 2377801, 5164162, -7408819, 3029026, 3818226, -835908, -7165079, -5318244, 2437931, 316217, 1857037, -778463, -703838, -245887, -3973919, -1959579, 2070174, -2770791, 4968204, 5883569, 8038568, 1932735, 598074, 7579007, 12347494, -1974611, 1685775, 2107218, 7259032, 824634, 4293357, 12196633, 3613678, 2248416, 331786, --2302103, -10427644, 1395328, -285078, -1692217, -2001455, 1282585, -1453846, 2576444, 1137630, --1378685, -768262, -352724, 2093260, 1338419, -590558, -405874, 1421097, 3097745, 12885, --777389, 1071058, 118112, -1458678, -2881923, 2079838, -2713883, 1642288, 1145683, 2000381, --136365, -349503, 41339, 643171, -3785477, 94489, 551366, -374736, 11893838, 263067, -2478733, 2893197, 5735929, -2236067, 3652870, -3090229, -1971390, -9797894, 3910568, 6696928, --6062347, 5083631, -2508798, -8584029, 8943196, 5311801, -1592896, 5370857, 10473278, 7349226, --5401995, -3004330, 5279589, 1683627, -1192390, 4080756, 3730716, 5455682, 344671, -2365990, --4670240, -8278013, -272194, -6868190, 847719, -2225867, 3846143, -5458367, -12592307, 2787434, --3123515, 5829881, 1465121, 474057, -3485366, -7400229, -6225018, -569083, -637266, -5575405, -7878044, 10212358, 10581189, 4297652, -7577396, -646393, 10025527, 985695, -1729261, 4689031, --1312113, -2506114, -9518184, 5264556, 2757369, 13815299, 6376416, -9350681, 3146601, 3543885, --992674, -151398, 3347927, -2259690, 767725, -3995930, -9870909, 8942659, 1632088, 5339181, -2576444, -4631586, 7552700, -1654636, 1800128, 429497, -1670205, 310848, 231391, 623307, -3951907, 1331440, 754841, 363998, -1349694, -1565516, -2063732, -1196685, 1363115, -630286, --103079, -763967, 1249299, -1131724, -603980, 144955, -150324, 555661, -2175938, 2556043, --1064078, 2252710, 736050, -1136556, -1435056, 3169686, -2870112, 2550674, -695248, -3663607, --6111202, -1648731, -1560147, -10549513, 529355, 1295470, 5281736, -1994476, -4544613, 1894081, -578210, 2497524, 85362, 5732708, 2305324, 3959960, 679679, -441308, 3411278, 1995012, --10383083, -3208878, -14845018, 674310, -2762738, 1717450, 2639794, 200790, 7105487, 1808181, -10142565, 1247688, -12039330, 247497, -4838281, -1991254, -562104, -1804960, -608812, -9549860, -2090039, -4596152, 11518565, -11942693, 6640557, -2592550, -10192494, -1905892, -7162932, -1540820, --2172180, -10853382, 3129421, 3330210, -1975148, -1792075, -679142, 3847217, -8610336, 224412, -8102456, 1500017, 11266236, 18379238, 7606924, -16633871, -22192096, 10779294, 4842039, 16593606, --3419331, 7966628, 1717987, 7912404, 11086384, 14262513, -7559680, 4119948, 10625212, -8676371, -1635846, -1107028, -1072131, 807991, 7593502, -1144609, 2608119, -4896263, 1796907, -3772592, --3970161, -1751273, -3312494, 561030, -1944010, -5591511, -185220, 3729105, 2335389, -1029718, --1014686, -820339, 104690, 1743220, 1842541, -1434519, -2160906, -953483, 3245922, -773631, -3146064, 509491, 485331, -776315, 783832, 940598, 291521, 879931, 180926, -2633352, --2551748, -1660005, 858993, 2695629, -3740380, -2490007, -1157494, 1584843, -1739999, -20310900, -15164993, 2818036, -2702608, -270046, -9225590, -7517267, 7904888, -2098629, -2604361, 8250096, --6133214, -6544994, 344671, 8207146, 3456912, -2598992, 221728, -4636417, -651224, 686658, -4361003, 238908, -10411538, -10283225, 2302639, -1335735, 2469069, -984084, 4130685, 8078297, -14947560, -183073, 9263708, -2232309, 2598992, 6456410, -6253473, 12277701, -1783485, -7539278, --10759430, -1992328, -8932458, -11169599, -3138011, 5236102, -3503083, -8660802, 4324495, 6281390, -9684078, 12618077, -10271951, 3970161, -2887292, -9347996, 3498251, -10455561, -1969243, -17114908, -6833830, -5053566, 2516314, -3019362, 2681133, -18402324, -18449568, -11100343, -4350802, 10306848, --9936944, 19492710, -6866579, 2020245, -1825898, 3711389, -1788317, -13635447, 1974074, 1702955, -3735011, 3290482, 1597728, 5425081, -3063386, -4604205, 8590, 326418, -4596152, 2198487, --5912023, 3459059, 1972464, 2828773, -876173, 132607, -1811403, -4432943, -3323231, -1741609, --2066416, 3166465, -2050310, -5375152, 1900523, 2498060, -1021129, 3883724, -319975, -955630, --26307, 1035624, -1610613, -1415192, 1985349, 2872260, 2027761, 1082869, -4014184, -2698850, --870805, -3007551, 1180579, 479963, -37581, -2675228, 17060146, 1104880, 6374805, 4625143, -1704028, 10109816, 1275605, -13904957, 6644315, 2114198, 6338835, -532039, -10480794, 14948097, -7918846, 6200859, -1513976, -4399121, 1799591, -979789, -8341900, 5433671, 3606162, -4475356, -5849746, 9549323, 132607, 3659849, 9283035, -10134512, 2334315, -3345780, 4095251, -19153944, -5754720, 9371082, -3365107, 2571075, 9155797, 5069135, 14496, 3172370, -9777493, 2586107, --5813238, 536871, 2652679, 1631551, -4545686, 18552112, -3464965, -3392487, -4464619, -15987479, --6691022, -9754944, -11591043, -2094870, 15691663, 17512730, -1887101, 5484137, 6787659, -14432701, --4882841, 11922829, 9571335, -5667210, -4268661, -14212047, -4850629, -5309117, -7103339, -7968775, -1951526, -14500346, 2200634, 13828184, 18960134, 6012418, -5850819, -281320, 9955197, -3444564, --7132867, 786516, -1104880, -2927020, -4862977, 801011, -699543, 2388002, 2812130, 1879585, --1881733, 1003949, 1391569, 1386201, -500901, -2680597, -6362994, 1869385, -616865, -2381023, -4410932, 1580011, 2367064, -2484102, 3705483, -2669859, -2389613, -3020436, 2881386, 750009, -2059437, 4741644, -655519, -2250563, -1542430, 2443837, 774705, -70867, -144955, 770410, -392453, -134755, -1206349, 2483028, 2870112, 3998078, -1569811, -5404143, 3377455, 912681, --7196218, -10644003, -11464341, -4558571, -11208254, -4636954, -4545686, 204548, -10661183, 2415382, -4490925, 528818, -12167642, 3821447, -15094663, 4705674, 8438537, 281857, 13112535, 442382, --3885335, -2343979, 8851391, -3128347, 12179454, 4384625, -4188667, -4110284, 2164664, -6138582, --3324305, 525597, 11528766, -314069, 6109054, 3533684, 1075889, 8150774, -3584687, -7315940, -3317862, -5213017, -2420214, -14366666, 8184060, -4987531, -4230006, -2835752, -15892453, 19161996, -4992363, -2173254, 8352638, 2818036, 4093104, -8337606, -12636868, -14332843, -6915971, 861678, --14530411, 5553393, 10633265, -16250009, -5913096, 6118181, -7469485, 4068408, 18249316, 701690, --2879776, -4712116, 4174171, -9763534, 6536940, 3617973, -8853001, 3054796, 6410776, -3471944, --10493679, -8901857, -4655745, -202937, 2966212, 2603824, 2052994, -1700270, -2567317, -1170916, -2409477, 270583, -1416266, -5825587, -7042136, -1799054, 568009, -4936528, -6020471, -4061965, --2484102, -2174327, -5270462, -4457103, -2403571, -3168075, -6749004, 1350767, 6494528, -484258, --519691, -2405182, -1857573, 2305861, -2324651, 659278, -5300527, 373125, -1476932, -2717641, -74088, -2535105, 1764695, 2695092, -2176475, 3984119, -2566780, -848256, -2655364, -15032, -521839, 11679090, 28790240, 30438970, 9095130, 18931678, -12979928, -12918188, -3114925, -1808718, -1015223, 4394826, 9601936, 17538498, 5632313, 16244103, 1703491, 5008469, 2317672, -4318590, -7272990, -53687, 2847027, 1388885, -8297877, -874026, -4493610, -8750459, -5634460, 290984, -795106, -11649025, -4955856, 15022722, 10617696, 7885560, 12495134, -7645042, -15032, -21456582, -906238, 18720152, -3722126, -3529926, 2129230, -1823751, 14422500, -983548, -2525441, 11370926, --13466333, -21478058, -8833137, 2113124, -11749957, 8790187, 11943767, -16869558, -6565395, 328565, --427349, -24283208, -15694884, 8036421, 3273839, -1635309, 7766912, -10481331, -6665789, -14911590, -3481608, 5062693, 1141388, 1257889, -10156524, -16451335, 13669807, -22442814, 6504728, -8081518, -21521008, 2478196, 8903467, -5938329, -8665633, 6517613, 2803003, 9943386, -9356586, -1421634, -6453725, -182536, -5238250, -4517232, -5152350, 743566, 4931696, 5827197, -6349573, -2323577, --1138166, -8012262, -3070365, 1787243, -1034013, 1009854, -4467840, -6987375, -1161252, 479426, -5574868, 2065342, -3654480, 4706211, 627065, 2548526, -8147553, 1953136, -4916664, 4122095, -581431, 4350265, 6321118, 2319819, -4651987, -8703751, 2704756, 3367254, -28179818, -20266340, -14038101, -2923262, 25526064, -6219650, 21014738, -16902844, 508954, 7558606, -1674500, 914291, -2468533, -1309428, -12687870, 4458713, 4773856, 5561446, 6323266, -3895535, 10429254, -9469866, --6998113, -5410585, 14669461, -8090645, -2728915, 1321776, -306016, -7610145, 6541235, -8492224, --10116259, -19063212, 1739999, 3500935, -12950937, -6037114, 6238440, -2616172, 3333968, 1040993, -15060303, 1053341, 11334956, 5060009, 488016, 9088151, 2063732, 3151432, -17082158, 17598092, -6231461, 13789529, -8376797, 3665218, -9168145, 14305462, 10849624, 17452062, 2782065, -4562866, --12680891, -782221, 2236604, -10786810, 15333033, 2480344, 2384781, 16519518, 3694746, -4939213, --6592775, -527744, 9815611, 11857868, -3852586, 14785962, -17678622, -18510236, -8105677, 4319127, --5646809, 8091719, -2014340, 4351876, 14154065, -614180, 7025493, -5876589, -5389647, 6207302, --545461, 9946071, -3068754, -44023, -3048353, -6110128, 1242319, -3585761, -1436130, 4114042, -1389422, -5549098, -5109401, 3007551, 7512972, 7826504, -790811, 6417218, 6930467, -9691594, -4532264, 9226663, 7226283, 4112968, -7265474, -8760660, -9178882, -9208410, -9184788, 808528, --3209414, -1245004, 1034550, -6718940, 4796405, 4399121, -3484829, 5228049, 1837172, 2499134, --6438693, 12986907, -30627948, -1392106, 15961172, -10194105, -3400540, 11767674, -12746926, -25892748, -5160403, 4414690, 4027069, -3362960, -15305116, 3886409, 4372277, 1177895, 8527121, -27428198, -12621835, -6350109, 6583111, -15613817, 12757663, -19762756, -12610024, 7720204, -5151814, -2266669, --15010911, 11864310, 15604153, 1611, 1778653, -7114077, 23392002, 5839545, 6416145, -4186519, --20146080, -4286378, 11215233, -1970853, 16758962, 206158, -5986111, 4099010, -1097364, 10546829, --19912542, -2336462, -15251429, 16658568, -6091338, 5643587, -378494, -500901, -18024368, -6267968, -16007880, 5182952, 1523103, -4691715, 573915, 2140504, -23107998, -23926190, 25708600, -11245835, --27679990, 11433203, 13256953, -22252226, -29153164, -20301774, -19493782, 3622268, 7918846, -2310156, --18724446, -466541, -9957345, -4601521, -13530758, -608812, 1520955, 1534377, -2579665, 13111461, --6876243, 5261335, -5810017, -121333, 3712999, -3117610, -336618, -7471096, 10285373, -2170032, -3728569, -5416491, -7999377, -1494649, 4155381, 4749160, 1620813, -7759396, 4930086, -920734, --6197638, 6491306, -9482751, -1697586, -5776731, 9974525, -4048544, -10541997, 4938139, -4020626, --4406637, -14074608, -498753, 3483219, 12288438, 5194763, -6823630, -3355443, 1473174, -1637456, --3486440, 2510945, -249108, -2444373, -2380486, -635118, 12252468, -17054242, -9112847, -17820356, --1372242, 3329674, -23332946, 3503083, -11282879, 32523640, 1976759, -29795262, -6533182, 14025216, -9002251, 6691022, 15119895, 14651744, -21047488, -5731097, -7987029, 19674708, -6767258, 23018878, -223875, -13775571, -10473815, -21155936, -23645942, 1105417, 3041374, -4227859, -12057047, -5569499, -1873680, 3460670, 8470749, -12024298, 6206765, -14084808, -15899969, 2819646, -3177202, -4649839, --16589311, -16339666, -7421167, -5287642, 23190140, 1768453, 7982197, 12520367, -109522, 28449864, -11964705, -9959492, 1779190, 14468671, -5499706, 18412524, -4638565, 1985886, 1599339, -25863756, --25785374, 3478387, 18543522, 10201, -5379984, -28896004, 2142652, 9356586, 6429566, -10172630, --7658464, -6059125, 3795141, -12707734, 30592516, 16687022, 18879602, 3293166, -21068962, 7381975, -10064719, 29761440, 7264401, 2687039, 12420509, 4777078, -4611185, -121333, 9589051, -1258425, -1573032, 2604898, -7344931, -5765457, 9332427, -142271, -6980933, 9097814, -5581847, -2583423, --4205310, -4779225, 8749385, -5850819, -2135673, 4074313, -8792872, 3424700, -526134, -5599564, -11432129, -4415227, 300111, -14602352, 8973260, -4738423, -3404835, -9557376, -12712566, 1660005, --4952634, 8757438, -6442, 5034776, 3788161, -190589, -5130876, -245887, -14172855, -12931610, -27304180, -8470749, -10105521, -1454920, -7519414, -18606872, 404264, 12843563, -31894964, -569620, -8284455, 10157598, -10873247, 7203197, -18260054, 1372779, -4708895, 5680631, -16354699, 10146323, --27851790, 4525285, 768799, 15737297, 14846628, 7341710, -10401874, 11549167, -3391414, 12904229, --14104136, 2176475, 16517370, 13036836, -7755101, 2632815, 414464, -3721052, 8011725, -3178276, --9618579, -10783052, 7638063, -19429896, 12787728, 2916820, -20767778, 19488950, 18720688, 17542258, -6351720, -9236327, 22656490, 2640331, 9730785, -14003741, -12085501, -13430900, 4132296, 5077188, -8110509, -18810884, 1805497, 13661217, -35938676, 1240709, -11812771, 22405234, 14506252, 11191074, --3195993, 14805826, -14107357, -867047, -9830106, -21735218, -928787, -20030116, -16667157, 9600863, -26521960, -25094958, -5945846, -4708895, 26623428, -6744173, 11628624, -7800735, -4707821, -1186485, -9396315, -5742908, -2359011, 594853, 6387690, 4551592, 3339874, -3736622, 934692, 2593624, -13159243, -10640781, 10972031, -2597382, 8012262, -188979, 2093260, 2597382, 5021891, -7125888, --1619740, -1560147, -8644695, -7901666, -7679939, 5054640, 4187056, -1803886, -3486977, -4668093, --6078990, -3973919, 427886, -2928631, -140660, 7689065, -266825, -14817637, 6746320, -8787503, --1385664, 23739894, 5152350, 12020540, -34206192, 15855946, -19119584, 25897042, -2547989, 10069014, -19678466, -21219822, 37845640, 27086748, 20503638, -9324374, 5580237, 25873420, -6427419, -8377871, --5965710, -1417876, -19495394, 5128191, -10331544, -23809688, 23084376, 7543037, 6412923, 2813741, -5426155, 8831527, 24299314, 5011153, -14992120, -1367410, -15560130, 3018825, 2368675, -27627378, --1064078, 14911590, 1202591, -2059437, -8295730, 29190208, 6147172, 12378096, 6561637, -15901043, --11179263, -8734353, 18312130, 10645613, -3526168, 10943040, -1505386, -20042464, 19469624, 2253784, -22301080, 2350958, 2404645, 335544, -29317446, 3907347, 906238, 3150896, 18430778, -7347079, -28933584, -43888124, -7647190, 32536524, -13093745, 10686416, -14776835, -23419382, -18641232, 13405667, --12699145, 12489228, -20035486, -4438849, 3532074, -5089536, -7792145, -2676302, -2234994, 8673150, -20421496, 2013803, 12178380, -4065187, -1876364, 14659797, -2003602, -4358855, 4246112, -7532299, -6731288, 12742631, -8448738, -1458678, -3194382, 2216203, 2583423, 5968394, 23075786, -4306242, -8242042, 265214, 5681705, 8176544, 4360466, 1136019, 12937515, 13637595, -3658775, -2093797, -5893232, 2835752, 5132486, -17904108, -1262720, 16694538, -3563212, 3337190, 6835441, -1105954, -17394080, 6135361, -35447440, -42407972, -3748970, -19875498, 2690260, 12077985, -16974248, 4957466, --25926034, 11282342, -14280766, -70875552, -4566087, 43247636, -18641768, -8007967, 43447352, -10188199, -2341294, 52064132, -12458090, 11520713, 4866735, -7591355, 41918344, -33741800, -4359392, -908386, --5939940, -6777996, -6911676, -822486, 13652627, -7665980, -22874458, 278636, 456877, 6781217, -8339216, 1537061, 18824842, -695248, 8662949, -5111548, -22695144, 15849503, -2786360, -23335094, -897111, 13510893, 41291280, 20922934, 34712464, 767725, 8548059, 16608639, 3917010, -1984812, -32451700, -1667521, -12639552, 38031400, 6641093, 6760279, 278099, -5311801, 21709986, 41876, --12617540, -14201309, -2943126, -2768643, 32870996, -22238804, 2888366, 4285304, -5832029, 38649336, -333934, -24629490, 4156992, 12671227, -18121004, -807454, 18494130, 15312632, -9309342, 1532767, --10521596, 8973797, -2820720, 1294396, -10351945, 9722195, 148176, -977105, -15052250, 6322729, -5179194, -9743670, 804770, 3658775, -5046587, -3257733, 11686606, 1917166, 6536940, -4179003, -3461207, 20290500, -18276696, -8244727, -5958194, 21939230, 8193724, 11672110, -13123273, -11924977, --4831838, -1321239, -15921444, -17828946, 21622476, 8844948, -12550431, -11633993, -7108708, 26844, --12435004, -10832444, 284542, 3496104, 8302172, -1934346, -3868692, 2123325, 24089934, 19452444, --39756364, -19417010, 30521648, -5610301, -29804388, -261456, 588411, 10797548, 32273994, 28739236, --17724794, 5326833, -4051765, 261993, -340376, -18596672, 27983860, -8315057, -18421114, 6544994, --13239774, 15928960, 1342714, 22649510, -7032472, -21480742, -19473918, 17160542, -8317741, 22339736, --6058588, 14470819, -14753213, -11420318, -7050726, 1599875, -18504866, 4520453, 907849, 300111, -17955648, -211527, 5951751, -12525198, 8864276, -19765976, 21082920, -19015968, 12501576, 6385543, -17709760, -29759828, 941672, 2498060, -9068287, -21505974, -36495948, -6103149, -31155156, -11959873, --24948392, -11596412, -45532024, -14136348, 20544440, 26107496, 14136885, 15194521, -2537789, 16508781, --32465658, -7414724, 4942434, 20907900, 5688148, -44551160, -1841467, -19590956, -13120051, 52068964, -34918084, -24701968, -10136123, -17348984, 5719286, -45913200, 2734821, 9570261, -13208098, -13629005, -8262980, 2673617, 355945, -8822400, -7825431, -7556995, -7739531, 14320495, 13058311, -945967, --3769908, -14136885, -16304233, -3452617, -4150549, 5454609, 13925895, -27370216, -2163590, 13684303, --146566, 17513802, -6207302, -16791712, 8973260, 18930606, 9480067, -11389180, 1299765, 17517560, --22414898, -15911780, 29501056, 1613297, -1116692, -3028489, 4589173, 6802692, 8886824, -3745212, --7315940, -52413632, 15336791, 8163122, -27528056, 10817412, 10282152, -20067698, -15323370, 23471460, -2965138, 12473122, -6284611, 15493558, -4908074, -2519535, 12295954, 5863167, 4063039, 277562, --8230231, -14282377, -8621073, 22187264, -7797513, -19361712, 32852742, 20205674, 2645700, 14904073, -4494684, -17015050, -50046568, 20451560, -1615445, -27144194, 22789096, -2476049, -36458368, -30790620, --15903727, 23899882, 9690520, 24774446, 31384936, 9280351, -25234544, 7934952, 9179419, -32303522, --5122822, 18088254, -9977746, -35193500, -26555782, -42884712, -27203250, -6262063, 27149562, 39094940, -18972482, -2662343, 27074400, -6802692, -66017944, -52503292, 11630771, -26484916, -31224412, 44863080, -6064494, -60498372, -46582680, 15899969, 2934537, 10291279, 22623740, 54077932, 31199716, -4589710, -60432336, 19185618, -63061932, 539018, -13302587, 32670206, 10002442, -20771536, 10350871, -15593416, --9052180, -13564044, 20764020, -3806952, 15244986, 12610561, 16500191, -3638911, -16095927, -5293011, -11476153, -7027640, 9696426, 6099928, 7067906, -14161044, 1973001, 5746666, 576063, 25493316, --570694, 11334956, 2814277, -4203163, 13940927, 3300146, -1693291, 15161771, -6892349, -2294586, -9633075, 3824669, -1061394, -6126234, -8195872, 992674, -9456444, -7312182, 5714991, 7305740, -49609020, 47986596, -15019501, 16663936, -19601156, 11971684, 776852, 6898255, -23379118, 1803886, --19951734, -17976586, 316754, -41448044, 1169842, -17676474, 4763656, 12104828, -164283, 14033269, --20180978, 30768608, -15079630, -620086, 21493626, -20155744, 8018704, 15316927, 19093278, 2647311, -7010997, 4603668, -29542396, -16628503, -4607963, 4299799, 4789963, -4513474, 19914690, -6452652, --63351, -3859028, -8323647, 6873022, 4138738, -23610508, 7138236, -18995566, 5393405, -45496052, --1979443, -1237488, 119185, 18431852, -7259569, -16656420, -7175280, 16922708, 163746, -43979928, -61604864, -5474473, -11521787, 13269301, -2461016, -9141838, -11289322, -12332462, -12941273, 41996192, --16065325, -24499568, 21085068, 1930051, -33013802, -7949448, 14104673, 10943040, -10741176, 22601728, --3790846, -6337224, 21219286, -15574625, -13996225, 26458072, -11546483, -4306779, -1237488, 11151883, -5650567, -380105, -1658394, 556198, 5233955, -5560909, -207769, 5101885, 5726265, 6500433, --16097537, 4104915, 8425115, -15952045, 1539209, 3221762, -2618320, -6514392, 6598144, 1721745, --5534602, 822486, -348429, -2768107, -19780472, 11253888, -11627550, 3486440, 3573950, -18167712, --817654, 790274, 79457, -350040, -5917928, -985695, 5308580, -829466, -38969312, -57749592, --55357296, 122641184, 101938904, 115883584, 262156752, 68487008, -65593816, 20633022, -210137712, -222957120, --55097988, -140153376, -108246600, 66185984, -34381752, 13735305, 167053824, 82813952, 123842160, 237672752, -158519728, 41356240, 34524020, -70143792, -216390656, -165457712, -126530808, -255796448, -103424424, 6067178, --45216880, -20437602, 129417568, 34237868, 17426292, 160160944, 19899658, 38252052, 227676224, 167276624, -106005160, 215132768, 107243720, -37846180, -3214783, -68190120, -335209312, -292626848, -236352592, -367449472, --279888512, -99262600, -132587248, 29817274, 255129104, 227741712, 315354752, 398032352, 296237312, 230945216, -224735232, 124215288, -42115912, -80267568, -182861984, -261174272, -256440144, -222319312, -254577200, -260610032, --209494544, -117306296, -85012432, 31417686, 199468480, 287551808, 410650944, 461801856, 275661728, 66695472, --39724152, -278681088, -265160000, -202181296, -157153392, -58733140, 29127932, 21408802, 28007482, 35067336, -16197395, 41336912, 58304716, 43080132, 70458936, 39763344, -18660022, -22736484, -63227288, -115181360, --32059784, -36568424, -42036456, 35124780, 30054034, -39760124, -50971060, -94142464, -153156384, -64932928, -85897200, 146859968, 285884832, 345068416, 234268992, 144892864, 37933152, -131108168, -191228592, -216287040, --252678288, -237629264, -182725088, -148447488, -123167312, -75435728, -20340966, 61395484, 217233008, 303904896, -269475904, 193068448, 118275344, 23935316, -49637472, -74557944, -93976568, -67868000, -20431160, -6199249, --22164178, -34699576, -53975392, -84289808, -108737832, -105415144, -106363256, -64825016, 3194382, 30339112, -60224568, 79373680, 71092984, 40979356, 15219217, 4548907, 1192927, 832687, }, -{ -8950175, --1191317, 726386, 7012071, -891743, -344134, -2033667, 7650411, 461709, 3710315, 2278480, -2238215, -3151969, 1571421, -4888747, -552977, 3810173, 750546, 2235531, 3557307, -6040872, --4247186, 1449552, -322123, 4499515, 2712272, -224412, -2514703, -1560147, -3106335, -483184, --434865, -455267, 830539, 1181116, -2707440, 4507568, -1059246, -695785, 1513439, -5731097, --1349694, 2488397, 852014, 5667210, -47782, -409096, 1079111, 390842, 2329483, 3924526, -4956929, -284005, -542240, 93952, -2895882, -3635690, 1980517, 3253975, -2311229, -2186138, --1508607, 4147865, 2411624, -568546, 615791, -4886599, -1438814, 2542621, 2076080, 3615826, --5287105, 1194001, 1956358, -1095754, 3674882, -238908, 3198677, 1537061, 1006096, 4097936, -2000918, 1032940, -537, 481036, -1011465, 341450, 535260, -326418, -1491427, 716186, -673773, -1082332, -186831, -732292, 725313, 1173600, 11274, -156766, -103079, -1099512, -499290, -393526, 870805, 420907, 241055, 185757, -526670, 286689, 95563, 456340, --907312, -424665, -231391, 107374, 11616813, 3238405, -2698850, 5969468, -2916283, 6212670, --2084133, -2784213, 3114925, 5812702, -205085, -2823404, 1516660, 1248762, -263067, -8192113, -1902671, 2447058, 635655, 5176510, 6895033, 3751654, 6790344, 4670777, 4129611, -1068373, -4589173, 2261300, -3515431, 1350230, 2110440, -4460324, -5735392, -835908, 2235531, 132607, --2079838, -2720325, -2708514, -1290638, 3069291, 6227703, 5222680, 2023467, 4009352, -6444599, -397284, -1607928, 51540, -7402376, 2752537, -666257, -1766842, -238908, -2031520, -3631932, --2596308, 2665564, 618475, 2057826, -2722473, 5137318, 1301912, -5832029, 2428267, 803159, -1633698, 3282429, 976568, 5976984, -1889249, 707596, -6912213, 1373853, 667867, 258235, -165893, -1240709, 4920959, -1442035, -2281702, 3793530, -3859565, -1822140, -1589675, -654446, --1794760, 1312113, 338229, 716723, -40802, -103616, 74625, -637803, 435939, 716186, --236760, -233002, -19327, -1208496, -2071248, 840740, 271657, -1574642, -200790, -108985, --340376, -1920387, 531502, 65498, -42413, 212601, 370441, 293132, -732292, 48855, --1349157, 647466, -2427194, -2303713, -836982, 2230699, -4057134, 1230508, -7945690, 1542430, -1418950, -853088, 5560372, 420907, -694711, 570157, 2913062, -4765803, 622233, 1542430, -3016678, -6806450, -3546569, -2529199, 2452426, 1093606, -2222646, -6878927, 1617055, -6842420, --489089, 2804077, -1345399, 2150705, -1258962, 4715337, 6833830, 3708704, -3636764, 732292, -5163625, 3293166, -3299072, 2778844, 744103, -5318780, 1826972, 7460358, 3404299, 2543695, -8185671, 803159, -3196530, -6250788, -340913, -3481071, -4315906, -1950989, 4472135, -4243428, -1438277, -2507187, -2469606, 5351530, -757525, 940598, 4150549, 5807333, -2615098, -5208722, -6644852, 5213017, 3221226, 376883, -4096862, 709207, 5237713, -5311801, 1573032, -3438658, --181462, 3347927, -3144453, -106837, -5992016, -1497870, -586263, 966905, -380105, -2176475, --332323, 1200443, -1815161, -386010, 747324, 746251, 443992, 556198, -155693, -364535, --2403571, 1325534, -193810, 1363652, -970663, -1471026, 479963, 1297617, -872415, 1154809, --250719, -1074, -163209, -171262, 1234803, -686658, 439697, -693637, -15617575, -5695664, --2417530, 8552354, -3254512, -1267552, -5058398, -4252018, -743029, -11236708, 6293738, 2100776, --332860, -4140349, 6197101, -1730872, 3141232, -2497524, 1979980, 3977677, -4959077, 541166, -5448703, 3104725, 2188286, 5858873, 5212480, -3257196, -4189204, -5193153, -96100, -6833830, -1627256, -9032316, -1742146, 6689949, 3498251, -2274185, -712965, -6788733, 3086471, -2889439, -5996848, -3435437, -6169721, -1242319, -2546916, -5039071, 1955284, -1135482, -3229279, -3259343, --10922639, 1517734, -3279745, -8064338, -2157684, 5015448, 2553895, -4157528, 3452080, 4472672, -4289062, 1622961, -5585068, -901943, -1242856, 3894999, -3925600, -1478006, 2033130, 2098629, --6111739, -7245610, -13069049, -2204392, -7591355, 2529736, -295279, -1780801, 3841312, -779000, --1749662, 1708860, 2619930, 2552284, 1957968, 4583267, -1942399, -1564979, -1228898, 704375, -229244, -997506, 1254131, 1842541, -401043, 462246, -796180, -994822, -192200, -631897, -188979, 436476, 54761, -1105417, 178778, -731218, -295279, 695248, 1467268, -608275, -1757715, 2184528, 338229, -574452, -1857573, -328565, 1251983, 879395, -13560285, -5450314, --2414845, -4041027, 4637491, 6020471, 5710696, -11357504, -8449811, 3240553, 13828184, 8145943, -7516, 1945083, 3948686, -4986994, 3289945, -4625680, 3335579, 4883915, 768799, 3914326, -1239098, -299574, 2052994, 1187559, -3694209, -4715337, 6489159, 2602213, -4725001, 4615479, --2574833, -505196, 11147051, -5345087, 6312528, 12428562, 5087389, -738734, 483184, -4520453, -5826660, -5977521, -3250753, -10028749, 1885491, 7682623, -193274, -7108171, -2523293, -10065793, --5097590, -1894081, -14276471, -7798587, -1414655, 1481764, -6254010, 3134789, -1661616, -4966593, -5337034, 15745887, 1460289, 8009577, 5448703, 4695473, -5004711, 2066416, -8521752, 874026, -2435783, 1873143, -3318936, 41339, -8655433, -3046743, -3046743, -650688, 4184372, 4464619, --218506, 1715303, 2430415, -1273995, -963683, -834297, 788663, 62277, 584116, 433792, -1357747, -770410, -70330, -2112587, -280784, -361851, 1454920, 806917, -936840, -1292248, --1236414, -1216550, -425202, -1485522, 487479, 2619930, -2137820, -316217, 878321, 1471026, -21109228, 13502840, -7392713, 2820183, 6726993, -2718178, 3807489, -1227824, 6267968, 3288871, -1938104, 5874979, 3166465, 2955474, -1901597, -14095009, 6694781, -2320356, -3331284, 11200201, -6771553, 3933653, 5019743, 3898757, 2724083, -2076080, 1543504, 547608, -3735011, 3031173, -4700842, -7909719, 1430761, -5085778, 3727495, 4527970, -12618077, -110595, -14996952, 351114, -1757715, 1358820, 3962107, 10255308, -1346472, -5172215, -2685428, -2733210, -4021163, 3018825, -3045132, 1076963, -1758252, -1733556, 9769440, -3183108, -2081985, -5298916, 8665097, -1240172, -7264401, -3377992, 7770133, -7495792, -16062104, -4650913, 889595, 3320547, 5283347, -5280126, --4112431, 2277943, 1327682, -2399276, -4272956, 10064719, -4016331, 9578851, 2393371, 6794639, -2525978, 4974646, 4002910, -1626182, -761820, 2008971, -399969, 5265093, 15032, -1625645, -352724, -5712844, -1270237, -1254667, 281320, -1851131, -865973, -565325, -261993, -581431, --3168075, -2381559, 613643, 297963, -3542811, -118112, 375273, 590558, 1264331, 679679, -3229279, 236760, -1266479, -49392, -590021, -1470489, -1971927, -639950, 9893457, -3760781, --6628745, -274341, 1014149, -9398999, -7407208, -2323577, 2527588, -1381906, 12202002, 7368017, -283468, 11708618, 4173635, 3438658, -10061498, 9415642, -1803886, -2343442, -8496519, -3803731, -7452305, 7419019, -2162516, 4923107, -10212895, -1419487, 6770479, 5146445, -3854733, -7208566, --4110284, -4453881, -5626407, -4628901, 1048509, -7581154, -796716, 10481868, -5112622, 1210644, --464930, -2413235, 4016331, -1673964, 6776922, 5369, 9585293, -2485176, -6162741, 3487514, --4887136, -4773320, -4889284, -13723494, 1510755, 5667210, 8082592, 5874979, 10646150, -1113470, --4214437, 6187974, -7714835, 1757715, 1087701, -1162862, 6860674, 6469832, -1765768, -8304320, -1559610, -4300336, -7988639, -7333657, 3929895, 7059853, 4336843, -15348603, 3350611, 1606855, --868657, 7202124, 3794604, 5887327, 2128693, -603443, 7650948, 1013075, 3413425, 2788508, -498753, -3518115, 451508, -1977296, -4387309, 777389, 1175747, 1990181, -634045, 513785, -353798, 338229, 1392643, 949725, 919123, -202400, -2827699, 1865090, -1224066, -1255204, --1151051, -1964948, 3380676, 3933116, 3236258, 1314797, 228170, 529892, -958315, 2574296, --12070469, -7066295, 1275068, -6895033, -17866528, 13540958, -295816, -887448, 1716376, 1072668, --11815992, 8268349, -12318503, 1102196, 5639292, -1616518, 2057826, 1992865, -13251585, -4457639, --5900212, -1220845, 2729452, -4349728, -2755222, -530428, -768262, 1222992, 5560909, 2979634, -11944304, -4320200, 16390669, -1137093, 462246, -10697690, -1570347, 7968775, -1560684, -16458315, -6671695, 7667054, -4878009, 4061429, -6128919, 11424076, 6339909, -313533, -645856, -7313793, --4645544, -8004746, 7536057, 7419019, 3287798, 855772, 3413425, -6451041, -16962436, -6204081, -5993627, 2622078, -12568148, 329639, 1531156, 1737314, -6003291, 4348118, 9001715, 4635344, -235686, 3637301, 6213744, -3468186, 9229348, 154082, -184684, -9081708, -11548630, 7468412, --3474629, 3707631, 3839701, -627602, -2417530, -2541010, -1868848, 1183800, -2780991, 3763465, -952409, -1049583, 1043140, -1348620, 238908, -4756677, 1280974, 355945, -731218, -2660732, -986769, -2358474, -25770, 731218, -377957, -1557463, 81604, -1564442, 5850819, 4332549, -1747515, -704375, -369904, -1697049, 158377, -696322, 3795141, -1278827, -358093, 3451543, -956167, 1410897, 2702608, -1851668, -827318, 2559264, 1724429, -796716, -257698, -18791556, -10087804, -2531346, 3687230, -5536213, -3088618, 7958038, -9207873, 8944269, -5586679, -10648298, -4794257, -5721434, 22731652, 3419331, -8012262, -11034308, -2037962, -13692893, -6359773, -14751065, --923955, 9916006, -7063611, 6128919, 9920838, -9217000, -26307, -10763725, 5996311, 2159832, --457414, 6390375, -6793565, -9651328, -8239895, 588411, 1760400, 8158827, -11775727, 8363375, -1565516, -17267916, -9583146, -13932874, -5801964, 5330055, -4776004, -4633196, -26640072, -528818, --5906654, -2408403, -17115982, -5909338, -2328946, 1344325, 13821742, 12690018, 10640781, 6190659, -13319230, -14397267, 11162083, 1585917, 5163088, 3802657, -10380399, 16044924, 9853192, 6342593, --7121056, -9433359, -6886980, 9324374, 989990, 64425, 4956929, 2455111, 5215701, -4640712, -13996225, 7420093, -1591822, -2273648, 3075734, 2865817, 1635309, -818728, -942745, 1332514, --306016, -222801, -5918465, 368830, -3456912, 236223, 1770063, 671626, -440234, 54761, -1068373, 1043140, -5639292, -1445257, 1876364, -1581085, -2259153, -105227, 653909, 943282, -984621, -777389, -1243930, 993748, -2517388, -4086125, -1138166, -988379, -1443646, 797253, --421444, 3712999, 1621350, -1440962, 1515587, -820876, 7124814, 13223131, 14324253, 5861020, -10020696, 8119099, 4846334, -2623151, 1069984, -3912178, 330176, -1351841, -8662412, 11023034, -17486422, 6968585, -4791036, 7836705, 7447474, -310311, 4622996, -8257612, -15911780, -10589779, --7247221, 4594542, -1933272, -8320426, 6205154, -2867428, -7443715, -104690, 12879533, 6482180, -9540196, 3330747, 7021198, 7793218, -1795833, 7135552, -2789581, -8192650, 3442416, -9485972, -3526168, 3749507, -13933411, -9066676, 5702643, 14409615, -7487739, 10034654, 14026826, -11624866, -471373, 12774843, 1376000, -4701916, -1086090, -6590628, -11482058, 111669, -3492345, -6048925, -7873212, 364535, -13143674, 16796006, -6968585, 13614509, -16164109, -11077794, 7870528, -9968082, -5465346, -6717866, -4895726, -9368934, -5738613, -7636989, -19086298, 3095598, 11610907, -5424544, --903017, 8025147, 8573292, 6063957, -1249299, -755377, -4990752, -1609539, -2225867, -2649458, -1988570, -592169, -1877438, 2720862, 2455648, -1270774, -326954, -3496104, 1414118, -3089692, --5549635, -475131, 5013838, -52613, -2949569, -858993, 8333847, 4115116, 191663, -2638184, --3159485, -2347200, 409096, 464930, -2674154, -1080721, -11811, 872415, 3245385, 678068, -5182952, 3053185, 3676492, 1315334, 1577327, -921271, 420907, -12042015, 7776039, -5239860, --12796855, 18496814, 9699647, -13150653, 9432822, 8324184, 2611877, 15580531, -31925028, 2246268, -13374528, 4464082, 1372779, 13937169, 738198, 7598334, -18377092, -2576444, 5250598, 163746, --9099962, 3552475, 7669201, 3541738, 3737695, 9824201, 8434242, 13079786, 10538776, -4132296, --4025458, 10103911, -6058052, 7064685, -11323144, -6339372, -14542759, -6796786, 8342437, 2763812, --3195456, 12048457, -14177687, -19510962, -31252866, 9687299, 11077794, 8435853, 6863358, -7504919, -5213554, -4391604, 12095165, 31657130, -4734128, -6782290, -13601625, -4473209, 12097312, -8193724, -7022272, 11612518, 2119566, -355409, -9012989, -2765422, 4580583, -22092774, -20109036, 1941862, -2956548, -7908646, 11359115, 8417062, 16259672, 25884694, 10559714, -6147709, -2960306, 5374078, -60666, -14452565, 7020661, 5899138, 5325760, 1578937, 6884296, -397821, 3903589, 2949569, -2267743, -3394098, 474057, -474057, -243203, 5175436, 1784022, -233002, 2985002, -5849746, -1836635, 862752, -510027, 5447629, 1322313, -1808718, -743029, -3641596, 10169409, 486942, -1922535, 4000762, -1252520, -1670205, 5822365, -6262599, 5792837, -4633733, 4840428, -505196, --172872, -1270774, 2104534, -1130650, 4998268, -4128001, -1389959, 1261647, -651224, -1555852, --2774549, 3268470, 47640316, 26867168, 17199734, -4437775, -4800700, -636192, -4005057, -4940823, --7332583, -8938901, -15220290, 632971, -1028108, 3688303, 6710887, 12645457, 19242528, -2605972, --24914032, -9801115, 21481278, -3380676, 8083666, -2814814, -307090, 14236206, 4997195, 10801306, -6431177, -486405, -590021, -239981, 7262253, 9170292, -3519189, -14101988, 18471580, 13159780, -9431748, 3412889, 4832375, -7515119, -13881334, 19160922, 10769630, 4904853, -8851391, -9946607, --13849122, -8600672, -2415382, -8736500, 4876936, -17826798, 2518462, 13090523, -8482024, 4592931, -853625, 1886028, -20245938, 7157026, -8659728, 14775761, -32551020, 5557151, -8462696, -11050951, -2760053, -6684043, 6768332, 6319508, -21184926, 192200, 14914274, 2182380, 4417374, 9303973, -3874597, 15457587, 6383395, 3239479, 1100049, -2285996, 10043244, -19756850, -313533, -1189706, --1748052, 738198, -505196, -188442, -1654099, -2939368, -3730716, 6097780, 5199595, -2735357, --379031, -9479530, 988379, -627065, -9258339, -80531, -13762149, -10540387, 4719096, 1723356, -7337415, -8250096, 3591667, 7118909, 1640141, -343597, 1916629, 3800509, 384400, -2095407, -7638063, 19864, 2525978, -4482872, -3279745, 3118146, 4603131, 769336, -29209536, -15059766, -2196339, -25735980, 5928666, 18619220, -8943733, 22640920, 26633630, 3349001, 13322989, 16370268, -7389491, -15777025, 10304163, 12482786, -584116, 3128347, 8863739, 7773891, 18804978, 3167002, --7205882, 11949136, 4329327, -1901597, 303869, 7997766, -10943040, -5001490, -4613869, 6665789, -3506304, -15516643, 4600447, 12889197, 374199, 15542413, -14709726, -27882390, 2253784, 12452184, -18918258, 17480516, 9071508, 8272644, 6688875, -18960670, -5509370, -834834, 14221174, 22397718, --7729331, 4789426, -8233453, 5263483, 3595425, 13615583, 21182242, -8201777, -9245454, -1889249, -11616813, 14842870, 20876226, 465467, -22510998, -21301964, -3445101, 2702608, 90731, -9792525, -243739, -25675852, -16518981, -15193447, -17216914, 7299297, 2667175, 20598664, 16522739, 6172405, --9850507, -9904195, -9156333, -8383240, -14300630, 6705518, 4505958, 2600066, 9650255, 10657961, -79994, 9085466, 1895691, 9705015, -3375844, 8040179, -2568927, -785442, 2419677, -3026878, -13553306, 6045167, 8053064, 3580929, 9654013, 2105071, 4636954, 13771276, 12002286, 6366752, --758599, -5356361, -4532801, -9833864, -5480379, -6474663, -3821984, -5975374, -7167764, -4205847, -4187056, 9159555, 2565169, -2215130, 344134, -1420024, 5761699, 6751689, 5651640, -654983, -2542621, 12390444, -27371826, 2492155, -5495948, 15001247, -8060043, -1233729, 4600984, 11364483, --15300821, -25682294, -4502200, -10058277, 679679, -11586211, 6786049, 6749541, 629750, -13856101, -8610873, 871342, 23111756, -3695283, 12634183, -10700374, 23867670, 6898255, 14874545, 10024991, -16231218, 23947664, -5893769, 9292162, -16813724, 17666812, 17116518, -399969, 5520644, 17299054, --11138461, -10702522, -1830730, 34827888, 5596880, -9746355, 17229262, 2257005, 13196287, 19064286, -5490042, -1299228, 1722819, 2965675, 12510703, -4415764, 13420162, -9330280, 13096429, -7307350, -29655138, -4336843, 25487946, -23210004, -25553982, 35423816, -29761976, -15900506, 1104880, -9579925, --18513456, 16170015, -2258079, -22859426, -10907069, -11754789, -33695628, -12486007, 4036733, 7520488, --26026964, -6650757, 15610059, -3172907, 8914741, 15477988, -11202885, -2564632, 2403571, 10090489, -7143605, 7603166, -2644626, -1503239, 6132140, -585726, -4310537, 3402151, 7084012, 1329292, -4875862, -192737, -4812511, -57445, 6509023, 2471217, -3560528, -8433168, -5233418, 9780714, --4687420, -13261785, 2971581, -7633768, -14564234, -41339, 5236102, 456340, -3913789, -1118839, -3763465, -3068217, -2684, 5119064, -481036, -2462090, -3299072, 9269613, 17690434, 922344, --6514392, -5284958, -3132642, -8503498, -2034204, -3595961, 3519189, -22922240, -15318538, 4492536, --30008400, -17469242, -20848308, -21173116, 25856776, -594316, 901943, 7748121, -7520488, -32934346, --24656334, -24111946, -49260052, 3626563, 5630166, 21368536, 12488691, 7456600, 10673531, 7452842, -2356327, -15472083, -22803056, -13075491, 17830020, -2151779, -13303124, -5297306, 17478370, -20940114, --13500156, -21507048, -10660646, -1730872, -20645908, 7837242, -17121888, 18760954, 13175349, -2761127, -13005698, -12542378, -25947508, 11531987, 15329812, -13309030, -29779692, 22689238, -1803886, 16480863, -13856101, -42621644, -30243012, 455803, -6779069, 28031104, -15810311, -18293340, -4786204, 10458782, -1755031, -2387465, -9513353, 37184216, -17951890, -29926796, -40531068, 29415158, -6766184, -33333242, -15848429, 16124918, 9663676, 33935072, 36308044, 37260988, 16095927, -8177081, -3149822, -5510980, -12560095, -23468776, 15511811, 3152506, 3260417, 11807402, 11468100, -9529996, 14614163, -10975252, -5089000, -15687905, -8775692, -5927592, -7943005, -3020973, -8571144, -1937030, 6472516, 17023102, -19832012, 1103270, 15647103, -8844411, 2594697, 9328669, 1604707, -16646756, 2482491, 4466229, --4283693, -12276627, -7637526, -7423314, 20648056, 12918188, 6994891, 9859097, 17519172, -2341831, --19836306, -12412455, -11183021, -14226542, -18364206, 3695819, -15301895, -27330488, -6254010, -5621039, -4532264, -27398134, -10439455, 12259984, 20846160, 41420128, 7179575, 21497386, 10918881, 10194105, --9203041, -3411278, -7800198, -23272818, -26600344, -38160784, -13441637, -34416108, -13071196, -18191870, --6344741, 17930952, 4809827, 12082817, 21829708, -340913, 14845554, 3856881, 1044751, -868657, --2541010, -29105382, 10756209, -3964792, -32166620, -20478404, 9774272, -21211232, -7703561, 7201587, -23853174, 28212030, 10233833, -6330782, 4218195, 18756122, 10524280, 3648038, -289373, -57013544, --11146514, 12136504, 14642617, 5342403, -1898376, -19487340, 13506062, -17429514, -12576738, -3750580, -3736085, -9872519, -29987462, 15763067, -3619584, 37219648, 14559939, 12451110, 14705431, 27250494, -62286152, 537945, 1298154, -3019362, -18240726, 10611254, -12586939, 44697724, -3786014, -16603270, --14334453, 18644990, -24252070, -16950626, -3004867, 38165080, 1504849, 17984638, 28719372, 5327907, -23286776, 17065516, -2988760, 15609522, 17591650, 141734, -11690901, -13246216, 3774740, 3965329, -14777372, 8928700, -446677, -2631204, 2768107, 5487895, -10652056, -2712809, -2488934, -1875290, --16815334, 10239739, -12165495, 3852586, -2349347, -7828115, 2196876, 20214264, 18220326, -426276, --1085553, -13619341, -5252208, -13542032, -1835562, -15685757, -21585968, 5892695, 15132780, 561030, -946503, 31472446, -4080219, 5537824, -34466576, -11952894, 40824200, -27289686, -7191923, -23662586, --69057168, -10056129, 21425982, 17309792, 3543885, 4817880, -3568581, 38585988, -41646152, -258235, --11871290, -28178744, -23507966, -3747896, 8105140, 6742562, 9516574, 24826522, 16412144, -17971754, --17894444, 49604188, 40869836, -3508452, 4918275, -5703717, 13421236, -435402, 29207388, 10339597, -15592342, 4106526, 2392834, -51775832, 21502754, -2464238, -29548302, -15364172, 3077344, -8250096, --29410862, 28192702, -4889821, -21287468, -4271882, 2850248, 25336012, 27980102, 21592412, 8029978, -25263534, 26610544, -20061792, -22312356, -13987098, -3862249, 26166014, 34578244, 6083285, 12300249, -33509872, 19811610, -31208306, 22886270, 8527658, -7153268, 1341640, 63988032, -42436424, 32481764, -37592776, -38001332, -2111513, -24793236, -7820599, -54481660, 15692200, 23710904, -32556388, 19426138, --28161564, -20681878, 24780888, -15662672, -2201708, -9532680, 1271310, -13859859, 4248260, 5967857, --10223633, -14838038, -1082332, -16094853, 20747376, 3412889, -19389092, 3940096, -3225521, -10875394, --10168335, 6362994, 13223131, 16232829, 6812355, -15231565, 38132332, -7387344, 3803194, -2813204, --20175608, 7357279, 10996727, -10588705, 16242493, 3789772, 12120398, -3202435, -19552838, 6213207, -29246580, -18847390, -27409944, -44365400, 8761196, -8487929, -14178761, -17938468, 9793599, -10883447, --5180805, 29199336, -9170292, -1628330, -22961432, 1880122, 14544907, -32065688, -20323786, -19179714, --9517648, 11681237, -43335684, -24050206, -62508956, 10874857, -714575, -15844671, -7042673, -9204115, -13256417, 20061792, -22261352, 850940, -7829189, -7490423, -39089572, 8596914, 29849486, 7937637, -22559316, 28452548, 25382720, -34176128, -10552198, -10306848, -16108275, 28792388, -29496762, -16930224, -937914, 41802380, 9345312, -14642617, 42004780, -23645406, -22328462, 50244140, 47998408, 4668630, -12161200, -13638132, -45650672, -13987635, 45816564, -22214644, 41518912, -14969035, -65569120, -17223892, --30703648, 34971236, 244813, 7879118, 31230318, -4940286, 25740276, -33620468, -39762808, 30604864, --8021925, -66823248, 41259604, -21223044, 11220065, 13641890, -23446226, 44467944, -30351998, 16190953, --508417, 11915850, 44913008, -11316165, -14239964, 1865090, -9393630, -12077985, -10188736, 5259188, -10079751, 2660195, -6473590, 5862631, -21432960, 19489488, 13474386, 11075110, 4270808, 366683, --10030359, -10641318, -10433012, 9343164, 17544942, -16927540, 15214922, 35762044, 11903502, -30087856, -2934000, 11403675, -11293617, -19754702, 18884434, -16676284, -389231, -1162862, -18163954, -23050552, --243203, 13660680, -7761006, 30894774, -10246181, -19816980, 14103062, 11967926, 23112292, 1726577, --41636488, 24561844, 28305446, -34397320, 18802830, -181999, -12460237, -14710263, -49646600, -21885006, -17423608, 3156264, 45530948, -36558224, -20701206, 8586176, -5047661, 29232622, -40605696, 80531, -4154307, -34264176, 34295312, 18854906, 10462003, -16037945, 23487028, -27753542, 15366856, 12010339, -7229504, -1913408, -15530065, 6512781, 31207232, -16335908, -5966784, 6180458, -24422794, 25005300, -991064, 6615860, -33461554, 18149994, 4457103, 6229313, -78541528, 10870025, -22298934, 36817532, -30452392, 32373852, 16550120, -63805496, -11159936, 13799193, 1430224, 4348118, 45081052, -6604049, --27020176, -32392106, 1396401, -36037460, -31635118, -27986544, 13626857, -52617108, 37579892, 71818832, --18693846, -8470749, -55852828, -12068321, 21565030, 13375065, -18486076, -3674882, -67579160, -23629836, -68140728, 29120416, -20946018, 20077362, -38248296, -28191092, 7669738, 1715839, 4777614, -25815974, --8843338, -5231807, 176094, -37504728, 8331700, -4600447, -11614128, 5280126, 15820512, -20344186, --10087268, -2954401, 7675644, -15549929, -3975529, -2430952, -14707042, 528281, -27450210, 36527088, -11970611, -9165460, -3368328, -10313827, -1195612, 23582592, 7271380, -3935801, 12468827, -7170448, --34172372, 1965484, 1930588, 7673496, 15671799, -8644159, -6120866, 15454366, 18568218, 8178692, --16225850, -51269024, 13932874, -22482544, -15300284, 15573551, -12560095, -18030810, 14267344, -23707146, --1460826, -27023934, 39017632, 684510, -28536300, -8425652, 644245, -2869575, 9061844, -19058380, --13218299, 4278325, 7841537, 4578972, 3801046, 14810121, -17191144, -6587406, -39505648, 14650670, -3647501, -12054363, 28458990, 15598784, -11754789, 43650288, 9596031, -27425514, 20622822, 3593277, -13379897, 28829432, -2798708, -7044283, 4373888, 23770496, 13276281, 563178, -2578591, 25432112, --2420751, -29466696, -5280663, 5488432, 23118198, -10285910, 39927088, 44373456, -28347322, 23198728, -49606872, -13389024, 75428216, 42773580, -19173808, -17149268, -28744068, -32179506, -18481244, 10164040, --5895917, -5645735, -1256815, -4824322, -53134116, -20391968, -52467320, 12322261, 46523624, -17413408, --3112241, -25356950, 12398497, 3265249, 8737037, 13161390, 38980048, -1834488, 17553532, 18352932, --29777008, 1365263, -353798, 6544994, 12612171, -1564442, -7271917, 12371653, -2110440, -6678138, -1254131, -12104828, -3237332, 9106941, 1380832, -5131949, -28533078, 1564442, -13321378, -945430, --11281268, 23716272, -8244727, 11630771, 13871134, -11126113, 16802448, 11114302, -170188, -5961952, --11134166, 2790655, -1584306, -6040872, -1454383, 11865384, -9432285, 5233955, -3658775, 8594230, -66728224, 17685602, -23957864, 2723546, -31445066, -4060355, 10974178, -12981539, -16725676, -18547280, --7087233, 7221988, -4138738, -5913633, 8457327, 4961761, 11476153, -11799886, -7473780, 8632884, --3095598, 1604170, -17368848, 11851962, -20327006, 9831180, 6699612, -4295504, -916439, 830002, --11796128, 2066416, 2402497, -9311489, 16989280, -9047349, 4115653, 188442, 596464, 8683887, --8374113, -12932147, -3905199, 19734300, -14555644, 9721122, -26697516, -15782394, 5089000, -5669894, --403190, -1656784, -16057272, 17170206, 13654775, 1355599, -11744051, -467615, -7125888, 3628711, --8898098, -163746, -8535711, 6548215, -2323041, 1799591, 21659520, -18155364, -1506997, 3374234, -1380295, -3834869, 579821, -8540006, 565862, -7134478, 4523138, 8667244, -13011603, -10731513, -6354941, 954557, -3012920, -10215580, 4567698, 1530082, -340913, -2211371, 199179, -2232846, -7327751, -4657355, -1218697, 3506304, -2299955, -238908, 5909875, -3717831, -2411087, -1330903, -1369558, 6129992, -1893007, -6564321, 555661, -4168266, 15710990, -6117644, 2075006, 3722663, --3783329, 12579422, -1607392, -10585484, 4040491, -5967857, 7840463, 3944928, -1509681, -471910, --2654827, -2743410, 7767985, -4806606, -2065342, -616865, -6382322, 8702141, -32014150, -47329464, -32984276, 151562960, 66400732, 69463576, -443992, -140291888, -101536248, -52824876, -110555680, 53674208, -65971772, 34287260, 142995568, 64288680, -6190122, 47411072, -92502320, -117978456, -67315024, -82653960, --17791366, 63887100, 65465504, 27396522, 109962976, 54550916, -7610145, 52865140, -48622252, -83513488, --47840032, -62832688, -98535136, 36286032, -793495, -35416300, 106236016, 63903208, 36060008, 108657304, -26369488, -55233816, 53630184, -78741248, -89627912, -18407156, -94270240, -95809984, 38001872, -15889232, -23294828, 120698784, 82862808, 86045376, 81384800, 9805410, -45368276, -52679384, -87928184, -115650584, --60450056, -32998770, -23736674, 44084080, 69021736, 64581276, 91729768, 82614768, -12550968, -14678588, --14654965, -84959824, -25242596, -41880228, -62860604, 14037027, 26101054, 4112431, 59032176, 26160646, -782221, 36742372, -28080496, -31283468, 1120987, -20360292, -6120866, 15292231, -2895882, 16987132, -23080080, -12629351, 18223546, 7231651, -27258546, 2546379, -12837120, -52391620, -428960, -13360570, --22001506, 50452980, 15469398, 18919330, 66676684, 26255136, 19824496, 14560476, -32525788, -48153564, --44212932, -74928928, -60845728, -27301496, 2984466, 33668248, 77463496, 81564112, 75357888, 66368520, -41458784, -16333761, -46511812, -93714040, -118250648, -91647088, -54499912, -19357954, 50539416, 92627416, -106973136, 109150152, 53195856, -12895102, -35276712, -44001404, -56310244, -40934260, -41545756, -33894808, --4146254, 10802916, 17840758, 29476360, 32159104, 29174640, 27214524, 15092515, 5302674, -2956011, --12589623, -20225000, -17219060, -10948409, -3455301, -1072668, 845035, -561567, }, -}, -{ -{ -4808753, -2767033, -4361540, -995359, -1613297, -139586, 6528887, 375273, -2796024, 3442416, 699543, -352187, 1146756, 723702, 55835, 4913443, 2767033, -3324305, -1284195, -381178, -1170916, -1378685, 2094333, 1409286, -1427003, -2123325, 813896, -4277788, -1948841, 3213709, 279173, -2587718, 1320703, -2086817, 1577864, 28454, -1846299, 4512400, -3022583, -1418950, 572304, -1552631, -2068027, -542240, -2968359, -5867462, 5485210, -1100585, -3064459, 323733, 5042292, -5369, 1948305, -2508261, -1471563, -1034550, 1546188, -1983738, 4031364, 637803, 3636764, --5286568, 2231773, -1373853, 878858, 2245731, -916976, -588947, -3911642, 27380, 2106682, -479426, -1094143, -184147, 1874216, -994822, -1046898, 2962991, -1357747, 940598, -569620, --177704, -3652870, -1498407, -1001264, 1330903, -280247, -1625645, -287763, -331249, -1032940, -970126, -1234803, 80531, 266288, 623844, 980326, -433255, -892816, 928250, 177167, --668941, 111132, 1581622, -223875, -153008, 621697, 54761, 199716, 256624, -496606, --856846, -504122, 676994, -174483, 76236, 317828, -459025, 425202, 10737, -295279, -13784161, 4725538, -1090922, 3732327, 190589, 6801081, 4273493, -954020, 3496640, 6106907, -7987566, -4714801, -4614406, 1962800, -1861868, -1542967, 5711770, 4616553, 4396973, 3139084, -591095, -179852, -1994476, 2179696, 1522029, 7276749, 736050, -157303, -3218541, 1515050, -2130841, -414464, -992137, -1138166, 1973001, -288300, -1173600, -2664490, 2825552, -948114, --956704, 4018479, 5700496, -1469953, -699543, 3296924, 2949569, 5223217, 3235184, 1435593, -536871, 4447439, 2515777, -6131066, 5369, 1882269, -3533684, 92342, 576599, -4373888, -2226404, -2123861, 3278671, -707059, -567473, 1764695, 566399, -3017215, -270583, 1675574, --594316, -746787, -877247, 325344, 3488587, 615791, -3515968, -835908, 824634, -1048509, --448824, 5163088, -1047972, 627602, -607201, -1321239, 1165547, 1920387, -499827, 872415, -938450, -957241, 454193, 858993, 198642, -637266, -1815697, -564251, -1093606, -508417, --134218, 574989, -339302, 692027, 377420, -158377, 4769025, -371515, -9002251, -4190814, --1746441, -1948305, -4900021, -4501126, -2826089, 4879083, -5360656, -2503429, -2545305, 981400, -8140037, -1221918, -645319, 1990717, 4659503, -7123204, -1160715, 1453846, -3143379, 2515240, -3984119, -4392141, -269509, 566399, -2552284, -6465000, 1126892, -2721936, 878858, -2506114, -3702799, -4463545, -4164508, -10260677, -2763275, 3528853, -569620, -3936875, -1937030, -494995, --4123706, 208306, -692027, 2835752, 2246268, -1062468, 132607, -1049583, -4352950, 5320928, -931471, 3596498, -1315871, 13422, 940598, 1556389, 4126390, -1320166, -990527, 1219234, --111132, 4499515, 2410014, -3889630, -1538135, -970126, -6153078, -692027, -576063, 3664144, --2354179, 3339337, 580357, -116501, -336081, -587874, -658204, 712428, -2478196, 1154809, --1425929, 1255204, 1078037, 483184, 315143, 3586835, 2639794, -658741, 3273302, -443455, --1091459, -1037235, 647466, -233539, 2243584, -578210, 1404454, 1133335, -189515, 950262, -8590, 995359, 993748, 288300, 347892, 1077500, 728534, -1473711, -801011, -155156, -1825361, 2021319, 16643, -214748, 1108638, -19805168, -6204081, -1748589, -1602560, -1653562, -7642895, -7051800, 3391951, -1642825, 1549410, -2011655, -1642825, -5675800, 926102, -2065879, -423054, -8240432, 158377, -836445, -1484985, -125628, 1541356, 1258962, -790274, -554588, --3316252, 1031329, -2664490, 1758252, -13422, 1503775, 5140002, -1335198, -5912560, -2510409, --6921877, 971200, 1234266, -610959, 1184874, -2397666, 2303176, 1207423, -3073049, 282394, --8319352, -1752347, -5568425, 3060164, 5481452, -4819490, -391916, 1597191, 830539, -7902740, -1309965, 4097399, -3817689, -1787243, -9055939, 3094524, -1320703, 3764539, 6686727, 3846680, --5397700, 1169842, 1260573, 325881, -6000070, 1577864, -2565169, 4019016, -1624035, -158914, -1858647, 1661079, 4699768, 5397164, 3654480, -233539, 1344325, 3233037, 1603633, -3117073, --661962, -2064269, -2128156, 1009317, -101469, 562641, 42413, -579821, -186831, 1979980, --643708, -581968, 47245, -493921, -1427003, 1804960, 60130, 885837, 2114735, -205085, -229781, -1608465, 1070521, 803159, 165893, -1614371, 549756, 89657, -12217571, 1311576, -2234457, -4431333, -502511, 11948062, 9351754, 5016522, -1297617, -2211371, 6005438, 3704946, -1952063, 2224256, -4767951, 1611687, 507343, 5602248, -5337571, -2492692, -985158, 676457, --1059246, -6240051, -4167192, -4400731, -5121212, 2827162, 3503620, 2194728, 1576790, 81604, -1541893, -810675, -629213, 363998, -1837172, -566399, 2760053, 2092723, -4179003, -4734128, --399432, -4748087, 2865280, -1459752, -7943005, 938450, 4096862, 5725729, 4016868, 199179, -3797288, -5718749, -1793149, -2566780, -362925, 379031, 2589865, -1983738, -5181341, 6331319, --5730560, -2782065, 3962107, 9164386, 2203855, 1797444, -8935143, 9681930, 1191317, 6743099, -10442676, -2315524, 1140851, 1196685, -4233227, 8608188, 2047626, -2843805, 2407866, -1222455, -4283693, -7109245, -3754338, -7264401, -1381369, -3230352, 2932389, -1853815, 1262184, -3413425, --845572, -679142, -2157147, -162672, -796180, 875636, -134755, -964757, -479963, -444529, -1737851, 447213, -1284195, -2966749, 1672353, 1621887, 322123, -18254, -27917, -1240709, -542240, -835371, 1810329, 318364, 1027571, -1043677, -1168231, -2359548, 18537078, 13058848, --4655745, -6803765, 10293963, 6711960, 10834592, 15912317, -8016557, 5521718, 2668785, 4628364, -2090039, 2785823, 6597607, 1649268, 6737193, 234076, -4274566, 1817308, -1365800, 2278480, --779000, 12356621, 2105071, 2732136, 1693291, 499290, 4340065, 1846299, 272730, -784368, -3111704, -2378338, 5925981, -4597226, 7130720, -3352759, 4320200, 2257542, 2647847, 2092723, -10459319, 7986492, 519691, -2243047, -5641977, 6190659, -6881612, 1736241, -3000035, 3047279, -6553583, 789737, -10923712, -8877161, 934155, -5522791, -5974837, -3454764, -6892349, 2465311, -11989938, 6009196, -4395899, 277025, 1395328, -3139084, -3517578, -585189, 5892695, 6538014, --6928319, 3285650, 7686381, 1525250, 2534568, 3701725, 5989869, -1035624, -4078072, 1585380, --1752884, -355409, -3913789, 3615826, 5660230, 857920, 1016297, 774168, -3963718, -584116, --65498, -452045, 402116, -635655, 652835, 474057, 1938104, 190589, -35970, 165356, -1243930, 2123861, 1112933, 2248952, 1234803, 398358, 662499, -501437, -3697967, -3850438, -773631, 2797634, 717260, -863825, 681826, -518617, 1774358, -1446867, -1316408, -2425583, -1039382, 8117488, 1600949, 11772505, -994822, -185757, -3876745, -3211025, 4012036, 8899172, --2560874, 2327872, 690416, 9646497, 4060355, -4553202, -4112968, 593779, 2086817, 8763881, -8688719, 13102871, 2447058, 3619047, -2246268, 5320928, 6153615, -2401424, -2952790, 4686883, --3558381, -5068599, 4797479, 1393180, -5759551, -7181722, 10941966, 5418638, -290984, 6903086, -1432372, -4898947, 10400263, -2448131, 397821, -279710, 2763812, -3787088, 2765422, -3791919, -2695629, -3523484, 3251290, -2885144, 4393752, -3630858, -3569655, 9589588, -11940546, 655519, -1527398, -4155381, 906238, -13545790, -6545530, 6447283, -5289252, 3955665, -1332514, 2664490, -1284732, 2283849, 1534914, -6146635, 3411815, -3577171, -295279, -7802345, -4106526, -1960116, --1744831, 2212445, 7464117, 4245039, -5794985, 2279017, 1280974, 48318, -2717641, 401579, --410169, 1440962, 816581, -1502702, -1869385, -783832, -416612, -1138166, 4391604, 792421, --1479616, -908386, 1167157, -1736241, 337155, 863288, 214212, 244276, -4325569, -1803886, --954020, 693637, -1080184, -162672, 3011846, -9571335, -8298414, -1074, 3562139, 6760816, --7859254, 2289218, -7064148, 5851356, 4433480, -9641128, -2027761, 1077500, -11369315, -6416681, -6889128, -855235, -511101, 1676111, -733903, -11840688, 10846940, 742493, -7713762, -3702262, -1428077, -951872, -7413651, -2171106, -4267050, 1276142, -386010, -2309619, 2357400, -10253161, --4592931, 2712809, 13458280, -2201708, -7929584, -5546951, -4421132, 9223979, -9780714, -1899449, --689342, -10384694, -13019656, 3257196, -9026948, -1376537, 1338956, 6917582, 3828963, 621697, -1480690, 8250096, -3541738, -2495913, 12138114, -8047695, 6322192, -2719788, -3035468, -1171452, --1465658, 13023415, 303332, 5105106, -13334263, -9609452, 328028, -1865090, 14908368, 551903, -10168335, 4350802, 12715788, 7781407, -1917166, -8773008, -3315178, 6019397, 2603287, 4089346, --4897337, -5459977, -1519345, -1788854, 2646237, -1291711, -3562139, -573378, -855772, 39728, --425202, 555125, -1444183, -1903207, 2442763, -103079, 171262, -606127, -1058173, -769873, -679142, 2138894, -2150168, 561030, -1310502, -1901060, 1420024, -516470, -1814624, -2079301, --393526, 2088965, 236223, 328028, 790811, 3714610, -3055332, -2498060, -1539746, 361851, -1504849, -15947214, 1510218, -1562831, 10891500, 1270774, -11601244, 13816373, 4418985, -8105140, --17808546, -7403987, 17537962, 876710, -2259690, -2936684, 1780264, 583579, 5389110, 2873870, -5776194, -1256278, 10339060, -5348845, -12247636, 521839, 539555, -2905546, -470299, 4583804, --3163244, -1864553, -1089311, 9775882, 7562901, 3932043, -743029, -13301514, -277025, -689342, --573915, -2206003, -233002, -5816997, -10869488, -1694365, 7449621, 7269232, -2747169, 7809861, --2531346, 3378529, 8564165, 8212515, -18125836, 6222334, 6525129, 2720862, -4425964, -15874736, -9628243, 5701032, 3072512, -5654325, -3175055, -6403796, 3554622, -7104950, -1326608, 142808, -6480032, -4006131, 3298535, 1812476, -11618423, -1581085, -7765838, 12750147, 5905043, -14935212, --3171297, 11876658, 5908802, -6135361, -3073586, -6778532, -2295123, 3570192, -2073932, -789200, --2593087, -3235184, -5682242, 1138166, 454730, -1789391, -572304, 2955474, 1973538, -3550327, --1264331, 2682744, -689342, 2063732, -2357400, -1598265, -450972, 581431, 3063386, -3190624, --2288681, 1686848, -3663607, -235686, -2578591, 1629403, -2042794, 3586835, -1227824, -573378, --1796370, 2310156, 1539746, 4082367, 1271310, 9846213, 12270185, 12350715, 9648644, 12106976, --15260019, -10167798, -5196374, -5106179, -7253663, -5760088, -12229383, -4305168, 933619, 7230041, -93416, -7184407, -231391, 7221988, 456877, -6220187, -2762201, 16586627, 1717987, 6153078, -2021319, 6775848, 1499481, 2107755, -10193031, 5599564, 472446, 2236604, -10691784, 3587908, --16468515, -151398, -5154498, 3956739, -1436667, -12241731, -216359, -12186970, 2280091, -10154376, -9204115, -5337571, 14426258, 290984, -196495, 7075422, 1621350, -2435783, -2047626, 2765422, --4844186, 3226057, 8919573, 4365835, -6531572, -3616899, 19042812, 1286343, 15199352, -14207752, --2898566, -1657857, 11068668, -12421582, 1780801, 5696737, -12137041, 8338142, -7607461, 2054605, -11889006, 1104344, 6714645, 2981244, 15517717, 6522982, -6385006, -5236639, -6152541, 753767, -621697, 6325950, -3843996, -922881, 4274030, 111669, 3299609, 4269198, 638876, -3780645, -4302484, 3091840, -404264, 1135482, 1449015, -1781338, -1278827, -5284958, 3398930, -2639794, --2280628, -1205812, -2647311, 2277943, -1808718, -826244, -2843268, -914828, -656056, 3356517, -2532957, -345208, -601832, -443992, 1999844, 2218351, 2119566, 4357781, -569083, -4679904, --15323370, 2284386, 15000710, 11165841, 12264279, -4098473, -3110093, 3028489, -2088965, 15106474, -5102421, 7178501, 12792560, -958851, 4811437, -8701067, 12741020, 6313065, -3162170, -7830799, --7211787, 8486319, -14709726, 5717675, 8524973, -6206228, -8197482, -4749160, 7952669, 2910914, --2954938, -5457293, 141197, -9148280, -13630616, 2424509, -13082470, -19616726, -2425046, 683974, -19841138, -8621610, -6721624, 8740258, 14624901, 14523969, 7810935, -978179, 3417183, -6393059, -1155883, -6700149, 16342887, 14292577, 9358734, -770947, -16658031, -215822, -14224932, 15602542, -12235288, 7465190, -11807402, 9630927, 5576478, 6622840, -2193655, -10166724, -7272990, -8166344, -2739652, -11424613, -20628728, 3891777, 14011794, 7235946, 13755707, -4365835, -3776350, 13701483, -4634270, 1684164, 9235790, 2856690, 271657, 7748658, 5004711, -947040, 3631932, 3235721, -2087891, -2852395, -4562329, -6249715, 1607392, 3654480, 2248952, 7786776, 197032, 5476620, --1816771, 2098629, 4514011, 371515, -2092723, -1495186, -6678674, -5978595, 1988570, 1182190, -2632278, 6693170, 1005559, 5017596, -2029372, -1444183, 886374, -5393942, -4050154, -1775969, --4345970, 1746978, -1465658, 1352915, 3847754, 5149129, 7653095, 12665859, 26687316, 12115566, -9191230, 8915815, -16829292, -2442763, -6279242, 21429202, -21798570, -20322174, 5674726, 14042932, --590558, 17136382, 15193984, -574989, 5720897, -10024454, -7554311, 16294569, -6571837, 11244224, -3713536, -7024419, -3962644, -3029026, -3770981, -7337952, 6052683, 6845104, 5380521, 672162, --8598525, -10627360, 13728863, -13574244, 10580652, 1140314, -17131550, 8665097, 15897821, -186831, --4599910, -1906429, 1086627, 1065152, 10773925, -442919, -8491150, -3314641, 9132711, -16919486, -3890704, -2728378, 13638132, 14756434, 9538049, 11577084, 14845554, 10959146, 3710315, -9674414, --11275363, 5461051, 7123204, -409096, 6138582, 8807904, 22741852, -12847858, 14304389, -8501888, --5741298, 15921444, 2174864, -9326521, -8462696, -8597451, -14408542, -4729296, -7164543, 11453604, -42413, -8959302, 4731980, 3258270, -2171643, 5430450, -11046119, 7167227, 224949, -906775, --1399086, 6103686, 799401, 1682554, 6023692, -2503966, 784368, 4674535, -7160784, 4978404, -40802, 1914482, -3335579, 3985730, -1624571, 549756, 5099737, 110059, -1532767, 1451699, -3358665, 4631049, 7341173, 6266894, 2008434, -3432216, -3170760, -10712185, 2134599, -8911520, --2913062, -3841312, -3954591, 4327717, -17890686, -3190624, 10407243, -12841415, 405874, -8077760, --14133127, 20557324, 17569100, 14694694, 6962142, 3833258, 5779952, 15093589, 8333847, 15474230, --5730560, 12961674, -9764071, 15697032, 21075942, 13220983, 10534481, 5369783, 10881300, 10968273, --3259343, 21821118, 5237176, -13153874, 6241125, -13317620, -9163313, -2726231, -20720532, 359704, --4418448, -5614596, -10073846, -5235029, -2894271, -643171, -2044404, 903017, 865973, -11889006, --7854959, 2467996, -6280853, 4942971, 20405926, -10284836, -830539, -1935957, 754304, -9751186, -5257040, -4682588, 15796353, 3365107, 9435506, 14775224, 2522757, -977642, -9742060, -21686900, -2864743, 16149077, 11720966, -3052111, -14454176, 12182675, 1284732, 7340099, -18504866, -13283797, --12184822, -18350248, -11360725, -13424994, 6256694, 1988033, 4700842, 6127845, 8475581, -4141959, -8627516, 9808632, 312996, 5273683, -3143916, -6511171, -6699075, -7049652, -2816962, -5140539, --308164, 1548873, -673236, 463320, 1314260, -5967320, -5508296, -9447854, -3228205, -2195265, --5245229, 2070711, 792958, -2797098, -8533026, -3938485, -3142306, -2214056, 7138236, 2167348, --3100967, -3952981, -1424319, -10266582, 2810519, -2104534, 5310727, 587874, -3214783, -6065031, -6321118, 8983998, -30671436, -19676856, -9319005, 21912386, 16006269, -11907260, 13722957, 12337294, -10573136, 10302553, -10260140, 1035624, 5991480, -10253698, -30890478, -5658083, -8540542, -18973018, -1759326, -6477348, -4806606, 5793911, 3498251, -4223027, 961536, 14496051, 15558519, -28512678, -6834367, 1454383, 13247827, 4494684, 777926, -17751636, 5480915, -4546223, -4871030, -12203076, --9019968, 22856206, -10307385, -398358, 2787434, -6024766, 25333864, 12014634, -11182484, -6786049, --19704236, -2831994, 18968724, 5571110, 5789079, -6179921, 11618960, -2691871, -4907000, 10661183, --6218039, 17658758, -4061429, 13166759, -26681410, -9025874, 15420006, 3811784, -2374580, 4358318, --29521458, -13955422, 4593468, -11765526, 4619774, 1257352, 3386582, 18220862, -6697465, 7390565, --1335735, -14695231, -2459943, 11244224, 16287053, -447750, -6673306, -12438762, 455267, -17393006, --5572720, 1592896, 20669530, 18424336, 2622615, 7792145, 2429341, -2983392, 10311143, 7785165, --3910568, 8538932, 6514392, 3480534, -6939057, -396211, -3526168, 6264210, 4456029, 5586142, --302258, -8272644, 8050916, 466541, -3735548, -8048232, -220117, -548682, -7522635, 5513665, --5413270, -8783745, 10242960, -3901978, -3200288, -4377646, 2452426, 1555315, 8275865, 1898376, --1142998, 3468186, 5227512, -8885750, 2738579, 5987722, -13793287, -38021196, -3682935, -4229469, --4591320, 6287296, -15767899, 30518964, -5935645, 1722819, 32788318, -38732016, -4512400, -7282117, --4176856, -44426604, 2047089, -6577743, -9115531, 15538118, -15839303, 2700998, 2473364, 7578470, --1875827, -15993921, 10697690, -10397042, 22804128, -3689914, -26868778, -1634235, -1371168, -13013214, --27074936, 12242267, 13049721, -21968758, 17687750, -19844360, -16156056, -9351218, 1256278, 1896765, -2494839, 13129715, -2947421, -11992086, -29504814, 6174016, -39710192, -20575578, -13995688, -31163746, --19127636, -8812736, -2456185, -14508936, 21921514, 23331336, 4598300, -6734509, 24968256, 11725261, --3453691, -5535676, 17819282, 13756780, -6816113, 24496882, -20942260, -10248866, 26002806, 12693776, -36693516, -20147154, -23460186, 6123550, -17979806, 18949396, 1446867, 6720013, 34835404, -19327352, --21496312, -7511898, 6778532, 8271570, 8334921, 9255655, 9670656, -10705206, 3723200, 1863479, --1370632, -1066226, -7904351, -5628555, 9724343, -10985453, -1174137, 2455648, -6022618, 1588064, --6168110, -209917, -1231045, 2511482, -9592273, 4755066, 10529649, 3490735, 2036351, 12527883, -8411693, -689879, -12588549, 11090679, 2083596, -3959423, -9580998, 11497627, 981937, 512175, -6174016, 8938901, -12052215, 6021544, 2923799, -7960185, -4131222, -12829604, 8270497, -1736241, --14047764, -7316477, 3735548, 29721174, 17149804, -2957085, 40585832, -4849555, 16740172, -19288162, -23742042, 22069690, -1899986, -18049064, 2010582, 6272263, -9853192, 10376104, -14435922, -419833, --4351876, -4961224, -16421271, -12280922, -7405598, -1191317, -5236102, -13175886, 19427748, 13071733, -3704409, -5570573, 3414499, 18415210, 8875550, 13489955, 8719320, -10334228, -15610596, 31616864, --4038880, -17531520, -7118909, -7618735, -4028679, 22844932, 1114007, -17877802, -6645388, -44214540, --10725607, -5310727, 27277874, 18606872, -53429392, -23207318, -12899934, -407485, 2818572, -21514564, -15874736, 8290361, 13833553, 26735634, -35001836, 34250752, 24816858, -11289858, -23461258, 1385664, --5752035, 9037148, 31429496, -16324634, -18009334, 25411174, -29921426, -33743412, -13414793, 3344706, --9504763, -36961416, -14779519, -12011413, 694174, 1933809, -10427107, -826244, 1712081, 365072, -3262565, -23379118, -8069170, -7791071, 1617592, 6446209, -1613834, -7514582, -4224101, 2419677, -12006044, 12656195, -1657321, -11087458, -2761127, 16125992, 1069447, -4250407, 3479997, -21978958, --6354404, -10383083, 1555315, 3767223, -21180632, -21712670, 5509906, 18851686, -8004746, 12337830, -3910568, -6082748, -1674500, 5013838, 3884261, -1777043, 3858491, 27977416, 3863323, 10465225, --21819508, -34675956, 50068044, 24947318, 2355253, 3195993, -11161546, -29512330, 10408853, -2374043, -25318832, 5559835, 9448928, 27584964, 15385110, -397284, -2869575, 4591320, -16787954, -13960791, --17855252, -10097468, 16684874, -4634807, 1128503, 20676510, -3489661, 9020505, -28765544, -26004416, --17505750, 14891188, 6171868, -1051730, 6938520, -9265318, -25861072, 32651416, -31030602, 14238353, -14863808, 11549167, 5272073, 19728932, -12716861, -31918586, 23596014, 66597228, -11687143, 32161252, --38742216, -21049098, 24061480, 13933948, -35964984, -10266046, -2972654, 31170726, -7713762, -3510062, --48928804, -31615254, -11190000, -36106716, 30146912, 31929860, 50657528, -44937704, 19326280, 5475547, --24850144, -1574106, -1117765, -51903608, 36981280, -15518254, 17495012, -5462125, 2937758, 69902200, --18858128, 24147380, 16127065, -17131550, 30602178, -210453, -5810017, 1692217, 7952669, 19551764, -12153147, 7666517, -614180, 18488224, -17426292, -8820789, 1561758, 4471598, 8760660, -5005785, -15181636, 1817308, 6803228, -3162707, 11535745, -1193464, -16642998, 9392557, -20463372, -12402792, --4662724, 8566312, -2068564, 10268193, 24206972, 36911484, 26975616, 7109245, 17413944, -10252624, -8943196, -926639, -580894, -1887101, 3783866, -8018704, 10390063, -9882183, -44627396, -25302726, --922344, -6758668, -14957760, 5422933, 14388677, 1493038, -15808701, -793495, -15154792, 41043780, --12607876, 944356, 31110058, -1744294, -31919124, -22201222, -21817896, -9659918, -11617350, 34195992, -3541201, 5645198, 17040282, -9365176, -9545028, -5738613, -9730248, -20845624, -4901632, 39198556, -12645457, 9322763, -26047902, 9617506, 2039573, -18543522, -2166811, -9287867, 42526620, -33627984, --29038810, -10223633, 5303748, -10011032, 1295470, 11492796, -22141094, -5936182, 36025112, -29018410, -5098126, -7262253, -17649094, -30778272, -23528904, 1154809, -42876660, -51833276, 12305081, 10634339, -8324184, -46315316, 35775468, 43476344, -14759655, -12572980, 2709051, -1797444, -9800578, -24057722, -17437030, 65597572, 17022566, -16193637, 314606, 10424959, 21876416, 5936182, -38816840, -34603476, -37494528, -7171522, -15351287, -22603340, 7779260, 42874512, 13121662, -13547401, 7895224, -1658394, --7642358, -3744675, -2302639, 18973018, 10477036, -6444599, -10503343, 8589398, 4968741, -1591285, --4354023, 6943889, -10160282, 6306086, 16425029, -1510755, -9108015, -2731599, -5870147, -9949292, --18422726, 2685428, 14031658, -9397925, -11627550, 5735392, -14509473, 85899, -23591718, 11317776, -14674830, 37556804, -11977590, -5115843, -15573551, -15952582, 4483409, 8275328, 15600395, -1881733, --3405372, -15748571, 6308233, 3877819, 4699768, 9933722, 11427834, -14187888, -37455872, 10375030, -14631343, -55451784, 30376694, 1328756, -15811385, 5341329, 20236276, -28643674, 17701170, -26594974, -7184407, -1514513, -13422310, -7424925, -3636764, -19568944, 14039711, 12323872, -573915, 6813429, -852014, 10908143, 14179835, 13755707, 20338280, 17516488, -10814191, 2764348, -22193170, 23571318, --18194556, 5806259, -3506304, 4842576, 1154273, -16761647, 15289010, -8471823, -16243566, 34129420, --27267136, 8240432, -7859254, -13501767, 13761075, -3497177, 4089346, 21289080, -25661892, 1093606, --31442918, -61914636, -1568737, 19801946, -7429757, 79709760, 16232292, -31072478, 8768176, -43371652, -15099494, 31124554, 36719824, -12563316, -7219303, -48223356, -55319716, -4600984, -34478924, 8229694, --2153389, -30059940, -7025493, -14857366, -32937030, 27064736, 53167400, -14858439, 3780645, 11519102, --14062797, 16495896, 20984674, -14500883, 2469606, 105764, -26421028, 13268765, 2270964, 8087424, -9720585, -18641232, 7361037, -9865540, -14958297, -16939888, 14492830, -10492068, 5988258, -16374026, --5876589, -1068373, -19983946, 19676318, -12646531, 3977140, 6046777, -18619220, -2983392, 14444512, --1641751, 2101313, 3269544, -5404680, 8910983, 18629420, -2153389, 10841034, 12794171, -15829639, --30061012, 10241886, 4296578, 17448842, 20932596, -27201102, -26673358, 4728222, -39508332, 8123394, --2848100, -23068806, 10400800, -14986215, -10074383, -18621368, 9517648, -20275466, 25973278, -2777233, -9639517, -5998459, 34878892, -9484898, 19173270, -329102, 22852984, -6382859, -11480448, 7436736, --12997108, -13789529, 1915555, 25948582, 16738024, -17681844, 18924162, -13263396, -20252382, 5718749, -27814746, -10685342, -11265162, 14848776, 6716255, -13833553, 1603633, 18893024, -7821673, -18174690, -9960029, 7579007, 11668889, 21279416, 4522064, -12833899, -4161287, 46743204, 49159120, -13562970, --40596032, 31192736, -13530221, 8807904, 4490389, 52641804, 7305203, -27300960, -9910637, -6602439, -1556389, 8164733, 12780749, 17126718, -20240034, 6553047, 4704600, 30539902, -7526394, 21528524, -23217520, 12838194, 11121818, 6703370, 18511846, -17615272, 19915764, 25262460, 18294414, 3123515, --35633196, -5288179, -22942104, 1125818, 15584289, 5260798, -7766375, -12493523, -7236483, -1937567, --794032, 6620155, -7285339, 2080375, -649077, -5532992, 11009612, 4318053, -9631464, -4527433, --2376191, 13377213, 125628, 2808372, -12666932, -9076877, -16844324, -7904888, -896038, -1523640, -374199, -2868501, -15074261, 4020626, -5050882, -2395518, 2414845, -4146791, -57445, -13085692, --2979634, 664109, 372588, 394600, -3195456, -3207804, -981400, -5108327, -7243463, 55684252, -23128398, -24858196, 5847598, -25978110, -14406931, -1596117, 9269076, -3980361, 20126754, -24008330, --956704, 9751723, -1017907, 10134512, -1647657, 3687766, 2120103, -17146046, -5652714, 4764730, --16393353, -16099685, 1167694, 4405026, -11716671, 8451422, 7757785, -4642323, -8341900, -1087701, -1561221, -2636036, 6637335, 1972464, 5185636, -6931004, -3234110, 12908524, -193274, 874026, -5928129, -3875134, 6580964, -6252399, -12225624, -7583302, 12212740, -9639517, -7454990, 999654, --9982041, -10332081, 14902463, -14796699, 23674934, 5472862, -10787347, 10695542, 1457605, -17456894, -1345935, -2924873, -3304977, 8649527, -472983, -10138270, 20111184, -11935714, -4931160, 10769094, -3178276, -4172561, 321049, 3509525, -539555, -597000, -2302103, 4932233, 8237748, -63351, --14280229, 10342818, -7463580, -824097, 11844446, -528281, -3888556, -226560, -10612864, 5304822, -3400540, -889595, 27380, 4517769, -10339597, 1009854, -3677029, 1294396, 3990562, 1349694, --4512400, 10213432, -15316390, 2254321, 1582696, -799401, 1668058, -1949378, -8737037, 9687299, --4571993, 6999723, -90731, -822486, 8664560, 3589519, -7626788, 3081102, -3946001, -2953864, -1500017, 5893769, 5513128, -1962263, -7530689, 4030290, -4372277, -33574832, -40375912, 34054796, -137916768, 53965728, 63273460, 869194, -129125504, -95083600, -49707804, -75767520, 34001644, 65270080, -26913876, 115376784, 65284576, -4322885, 27121108, -58306864, -117659016, -46937012, -81719808, -13043279, -56630756, 47723528, 43191800, 71928888, 44377748, 12225624, 19767050, -5328444, -83713744, -36973764, --30141006, -115656488, 21472688, 15196668, -51357072, 83361560, 82481088, -2780455, 104355360, 51337208, --48446696, 32411970, -48163228, -100250440, -7935489, -60540784, -87738664, 15548318, 9411347, -5200132, -81851336, 78947408, 47149616, 70283920, 42714524, -27271432, -30760018, -54695336, -93787056, -69177424, --33005214, -30909270, 16856136, 53028352, 36238788, 58257472, 87923888, 34253436, -11530377, -10939819, --60773252, -49038864, 4533338, -56297356, -25558814, 30642444, 7570417, 38345468, 30822832, -15623480, -10299332, -3092913, -20959978, 4721243, -9336185, -9412958, 19477140, 6826851, 8272644, 25963078, --14822469, -5679558, 14105209, -19196894, -15781320, 7432978, -46141372, -7581154, 15913391, -37124624, -18300318, 23379118, 2555506, 58543088, 55650428, 12910135, 22645216, -16091095, -49568216, -24765318, --65993784, -74876848, -42454676, -17945448, 14334990, 71711456, 83000776, 87012280, 77242304, 44232796, --9462350, -48297980, -76620608, -106884016, -91475824, -50193672, -12891881, 43451648, 77698104, 77627240, -69367480, 45273252, -8191040, -13551159, -21918828, -33120104, -23543936, -20556250, -24495272, -12923020, --6561637, -5403606, 5477157, 15188078, 19863150, 25978110, 23922430, 19169512, 8951249, 2305324, --7988639, -10641318, -11562052, -6452652, -3611531, 23085, -782758, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ -536871, -3439732, -4676683, -3805878, -653372, 3687230, 5433134, -2558190, 3172907, -1756642, -4524748, --1240172, -2529199, 1487669, -622770, -2186138, 2004676, 3043521, 681826, 3679176, -6740951, --7283191, -4679904, 678605, -18254, -1244467, 351114, 2224256, -728534, 3003256, 2480344, --3180960, 1210644, -237297, 3888019, 3586835, 1351841, -3809099, 2497524, -2268817, 1269700, -2501282, -6088653, 6653441, 9768366, 1280437, 4425964, -3595425, -727997, -3375308, -1756105, -3028489, -1013075, -3490735, -927713, -2196876, 1681480, -2142652, -1951526, 198105, 1784022, --1775969, -2009508, -867583, 3468723, 3127810, -2643552, -969052, -3123515, 721555, 4121021, -1148904, -1512365, -1967095, 1548873, -550830, -2812130, -1022739, -1899986, -269509, -1020055, -1633698, 1523640, 823560, -905701, -1241782, 2776696, -373125, 753230, 1446330, -417149, --34897, -579284, 852014, 109522, 217433, -816581, 119185, -260919, -803696, 36507, --120796, 597000, 1468879, -817118, 345745, -161598, 717796, 869194, -206158, -362925, --177704, -48855, -775778, -331786, 355945, -303332, 154619, -21475, 657667, 137439, -15028627, 6916508, -521839, 3146064, 2856153, -3605625, -1768990, 4166655, 1894081, 4534412, --3299609, 6594386, 2475512, -6512781, 5163625, 271120, -120796, -3439732, 3776887, -7042673, --6043556, -1299765, -2151779, -1175210, -2161979, 807991, -1314797, -2934000, -2121177, 2440078, --2678449, 1700807, 1073742, 675384, -2956548, 4129074, -8671539, -1536525, -55298, -1532230, --1097364, 732292, 1608465, -2794950, 2200634, -3384434, 3212636, 1002875, 694711, 3305514, --2356327, -584116, 1334661, 5181341, 1275068, 2160906, -1212791, -4535486, -6318434, 1137093, -3408057, 4445291, -1847373, -7073811, 1032403, -2907156, -1983201, -1656784, 1937030, 180389, -6874632, -231928, 2301566, 1324461, -1063004, -1822677, -1942936, -7230041, -2136746, -1206349, --1001264, -1408212, 1317481, 3577708, 984621, 3391951, -61740, -354872, -1118302, 909459, -1222992, -376347, -1420560, 1181116, -744640, 444529, -636192, 597537, -1061931, -673236, -949725, 282394, 522912, -409096, 309775, -696322, 8085813, 1894618, -6847252, -7743289, -2115272, -2348273, -6435472, 7310571, -3591667, -1174137, -1005559, 5738613, 1194001, -3293703, -4003983, -3089692, 6056978, -8361765, -5540508, 6701223, -6976638, -7011534, -2833068, 5731634, -2492692, 2756832, -678605, 5138929, 3088618, -507880, -6763500, 1850057, -1887101, 2454037, -2134599, 1864016, 5854041, 1595580, -5785858, 555661, 4012036, 5930813, 1981591, -3209414, --773631, -4745402, 2031520, -8437463, -339302, 9167608, 482110, 1007707, -4696547, -5775658, -883690, 1296006, 6716255, -1433982, 572304, 738198, -1000191, 722628, 2229088, 432181, -4724464, -1249836, 3136937, 499290, 845572, 603980, 5545340, 267899, -776315, 1062468, --1185411, -3714073, -1999307, -3829500, -89121, 7025493, 1466195, -2245731, -783295, -3946001, -2270964, -3079492, -2189360, 802085, 120796, 279173, -1794760, -2502892, -520228, 678068, --848793, 1510218, -154082, 46171, 1440962, 945430, 1452236, 1242856, -3758, 526134, --1156420, 119185, -1023813, -1059783, 798327, 993748, 1669669, 1257889, -783295, -146566, -893890, -581968, -1243393, 776852, 202400, -18589692, -12195023, -2648921, 1991254, 3027415, -280784, 6442, -7144141, -407485, -1583769, -1158031, 121333, -1777043, -854699, -5225902, -2694018, -11031087, -4080756, 1026497, -2257542, -3346853, -1973001, -6260452, -3228742, -2579665, --3024731, 1429687, -4911295, -2643552, 6004365, 3976066, 373125, 2939905, 2097018, -1938641, --4081830, 2442226, 8984535, 1063541, 1097364, -3513820, -3210488, 2694018, -7756174, -4068408, -8529805, -7783555, 2334315, -1822677, -3976603, 1853815, 548145, -2132988, 479426, 1359357, --2736968, 70867, -563178, 5327370, 4659503, 738198, 1237488, 2336999, -179315, -983011, --1845762, -10817412, 5238787, 3329137, -2980707, -70867, -4568235, -1189706, 627065, -3277060, -1489280, -3985730, -2262911, -4647692, -6984154, 4632122, -1342177, 255551, -5904507, -1420560, -746787, 1027034, -1566053, -220654, -338229, -1573569, -3060164, 539018, -1576790, 1364726, --253940, -715649, -637803, -265751, 1480690, 313533, -2266669, 482110, -688805, -132070, -716186, 394063, -596464, 589484, -1780264, 1007170, -1618666, -444529, -16087337, 2477123, -3774740, -1016834, -1409286, -8910983, -3644280, 2439005, -7953743, -7627325, 1557999, -7256347, --3732864, -191126, -4377109, 2463701, -3450469, 5432597, -2870649, -1893544, 1717450, 3795677, -7038378, 4388920, -7844758, -437013, -582505, 3855270, 5799817, 9842454, -4380330, -3888019, -5107790, -5398774, 1248762, 1530082, 8326331, 3036005, 4647155, -6214281, -2740189, -8478802, -6692633, 6989523, 8055748, -147640, -1733556, -5420249, -1132798, 5393942, -2513093, -3500935, --3204583, -4262755, 915902, 971200, 1270774, -5826660, -77846, -5710159, -307627, -878858, -2315524, 1971927, -1744294, -2609730, -7202660, -453119, -577136, 4405563, -2782065, 7342247, --4205310, 884226, 3419331, 6665789, -5184026, 1513976, 3512210, -6060736, 3017215, -39192, -7416872, 2434710, 1660005, 4519916, -462246, 1207960, 3506304, 1377074, 37044, -1338956, -56908, 1435056, -479963, 1833951, 2871723, 2305324, -1088774, 1257889, 180926, -826781, -1148367, 1465658, -2684, 644245, 1837172, 1302449, 1481227, 660888, -724239, -1247688, -1415729, -1336272, 1409286, -794569, 102005, 1717987, 1346472, -476741, 19902878, 17075180, --620086, 513785, 8873402, 1217086, 4342212, -2657511, 4867272, -3750580, 8957691, 3074123, -6442, 1835025, 617938, 11353209, 7655243, -7435126, -6204081, 2416993, 1190780, -2379949, --1625108, 1443646, 5432060, 4044786, 2473901, 587337, 2862059, -1891396, -161061, 6256157, --6881075, 2761664, 8337069, 6266894, 11338714, -1113470, -1739999, -986232, 702227, -3620121, -12322261, 11311333, 8064875, -3757560, -1140851, 4811974, 3901978, -3448859, 753767, 6475200, --2437394, -3027415, 4099546, -11989938, -1413044, 666257, 1744294, -4056597, -7860864, 3204046, -5341329, -6375342, -2397129, -6933151, 2561948, 489626, -1482838, -1489280, -6075231, 10139881, --2695092, 1365800, -10339060, -2446521, -4952634, 12057584, -2158221, -1654099, 5337571, 2484102, --66572, -3845606, 3534221, -2529736, -3628711, 5591511, 5168993, -76773, 3213173, 119722, --1524177, 2967823, -503048, 1159641, -1005022, -1306744, -376883, 2309619, -1759326, -1305670, --124554, -1747515, 574452, -1575179, -963146, 152471, -340913, 2295123, 16106, 675384, -1405528, 1473711, 329639, 763967, 1148367, 3058554, 517544, 2882997, 421981, 1429687, -2029909, 13103408, -499290, 8278013, 11330661, -5987185, -13932874, 578210, 10613938, -8215199, -7455527, -2223183, -10081362, -4664335, 10171019, -9934796, -8756365, 6377490, -10126996, 3369939, -4840428, 3969624, -2869038, 6132140, 1736241, 1146756, 3954054, -6479495, 8827232, 4336307, -3835406, -1827509, -980863, 16440061, -5755793, 1015223, 4283156, 8269960, -11245298, -9265318, --8623757, 326418, 638340, -583579, 5233955, 1622424, 9342091, 3753802, 5474473, -886374, -731755, -4625143, 8348343, -3787624, 8233989, -4498442, -7106024, 12246026, 9949292, -14097156, --12439836, -8182450, -6397891, 4429185, 698469, -2860448, 6478958, 7143605, -8586176, 5045513, --700617, -17185774, -5682242, -8668855, -7864622, 2968359, -2682207, 5635534, -1307818, 841277, -10268193, 10460393, -980863, 2746632, -921271, 1622424, 1469416, -3547106, 2936147, 853625, --145492, 8825621, 2642479, -69793, 252329, -1584306, 2597382, -295816, 1705102, -1918240, --118648, -2022930, 523986, 2291902, 710817, -13959, -290447, 2004139, 1280974, -1277753, -159451, -62814, 287763, 1014149, 434865, -7471633, -10411538, 6240051, -5972689, -4431870, --3697430, -12159052, -1241782, 5394479, -3247532, -754304, -4396436, 9980967, 1583769, 6350646, -4904316, -8078297, 8320426, 12377022, -3754338, -5079873, 1379221, -2168959, 5399311, -15343771, -5921150, 13262322, -1714766, -4358318, -3732327, 5761699, 11945378, -2832531, 3057480, -5316633, -8202851, -9826885, -3704946, 1900523, -1476395, -7625715, 14086419, 9883257, 7469485, -3129421, --10505490, -1306207, -14949171, 2589329, -1026497, -483184, -246424, -2266669, 8206072, 6889128, --10361609, 5830418, -6175089, 8628052, -719944, -1748589, -643171, -9137543, -1671279, -8335458, --18382996, -836445, 2237141, 1460289, -7007776, -236760, -1947768, -13783624, 360777, 11979201, --7483981, 3140158, 3992172, -1511829, 935229, -3536906, -2010582, 2819646, 3496104, 3764002, --864899, -2394981, -827318, -2574296, 2204929, 1047972, -2084670, -617938, -1908576, -2168422, --194347, -1947231, -2879239, 1844689, -522912, -2266669, 1905355, -1583232, 1589675, 2291365, -1062468, 2203318, 1651415, -9127, 1567663, 4959077, 2487860, -2441152, -1582159, -2804614, -118648, -3633542, 2042257, -194884, 2937758, -730144, 2316061, -357556, -1438814, 4687420, -2364916, -19313932, 1288490, 11377368, 6099391, -8761733, -7255811, 14244259, 3201898, 3257733, --2865280, 3739843, -217433, -9405442, -2543695, -9882183, 4636954, -5857799, -978179, -9626632, --10808285, -14360760, 8959839, 6169721, -4701916, -5072893, 3984119, -13181255, -1281511, 1072131, -3130494, 5899675, 2774012, 446677, -4657892, 2003065, -4283156, 3572339, -4111358, 2384781, -1156420, -4123706, -5523865, -10313290, -6924561, 2702608, -17798344, -4758287, 9656160, 5250061, --2208687, 23217520, -3420942, 10795400, 10534481, -16793858, 1029718, -2167348, -14317273, -7379291, --7910793, 322123, 1599339, 16067473, -2643016, 1611150, 10772852, 8114804, -1959579, 10870562, --5187784, -3889630, -7282654, -9496173, -14001593, -5221070, 7883950, -15102716, -7807714, 11803107, -8486319, -5039608, 10656351, -4698694, -804770, -401579, 5093831, -3278671, 5076652, -3136400, -4334696, -1194538, 1755031, -1986422, 3496640, 3491272, 1418950, -520765, 3955665, -2515240, --3001645, 3218541, -936840, 3505767, 2437394, 1782411, 2251100, 1491964, 599148, -5764920, --1138703, 32212, 1576253, -1468342, -2529199, -1975685, -5657546, 2215666, -170188, 3627100, -1941325, 3534221, 2565169, 825707, 1140851, 13302051, -2288681, 4273493, -6478422, 3818763, -5623186, -3432216, 4816269, -7400766, -8069707, 12345883, 6780680, 7969849, 9904195, -54224, --8067559, 10665478, -9299678, -12563853, 229781, 11776800, -1640678, -10207527, 1448478, 13862007, --1942936, 3806415, 1399623, 19449222, 1288490, 4163434, 9657234, -1219234, -4904316, -9315247, -1381906, -1289564, -8887898, 295279, -5207111, 3575560, 13257490, 136365, -7879655, -2353105, --7299297, -3919158, -1071058, -3105798, 1864016, -9825811, 10640245, -5569499, 17920214, -4488778, --12873628, 751619, 717796, 6340446, 2792803, 3437048, -13201656, -10763725, 7882339, -11208254, --15532749, 4500052, 3202435, -3535832, 16997870, -13732621, -18951544, 7147363, -12905840, 1269163, -1904818, 392990, -12402255, -7595113, -16160888, 5603859, -1522029, -872952, -2394444, -7220377, --3138011, -5470178, -2592013, -2105071, 6338835, -4722854, 4901095, 1768990, 5058398, 857383, -773631, -6608344, -2283849, 1837709, -1995549, -7213398, 1575716, -1139240, -2679523, -2514167, -2460480, -2874407, 3271691, -1628866, 3942243, -687195, 2090039, -3740917, -3545496, -81068, -450435, -1305133, 5885179, -4950487, -4579509, -3086471, 2950106, 3051574, -3670587, 883153, --10432476, 5819144, 519154, 14220637, 14780056, 21497922, 9718974, 4625143, 2914135, 7143605, --7338489, 8246337, -12965433, 6369974, -1322313, -1009317, -24800752, -9489193, -4118874, 8510478, --1114544, 2128693, 2626373, 2328409, -12702366, 13168370, -550830, 5409512, 380105, 12295418, --13178033, 9203578, -6505802, -232465, 9840307, -11155104, -5075578, -12163884, -4927938, -13554917, -12363063, 9205726, 16627966, -741956, 3892314, -15119359, 3405909, -15678241, 15252503, 4406100, --2543695, 14572287, 14738180, 7634305, -8872329, -13089450, -19013284, -769873, -6768332, -9484898, -10230075, -2762738, 23896124, -17677548, -6528351, 13761075, -14343580, -5615133, 3234110, 315143, --2141578, -13651017, 6202470, 2392834, -7519951, 6847252, 14379014, -12351789, 13877039, 17410724, --5255966, -9133248, 7087770, -6998113, 6543920, 4277788, -7325604, -5604396, -1502165, -2209224, -10116259, 3483755, -1787780, -4891968, -8140574, -4522601, 2498060, -5122822, 2415382, 4946192, -3084324, -3433290, 2601140, -2804077, 3824669, 2564096, 4274566, 2661806, 144418, -4525285, -2929168, 4584878, -4656282, 217970, 1534914, 1723893, 3875134, 385473, -561567, 4355634, -5267241, 1063004, -2480344, -4132832, -154082, 3704409, 4491462, 3149285, 22266184, -5068062, -3116536, -1168768, -7377143, 10021769, -3693135, 3726421, 1166084, 14344117, -4543539, 16722455, -242666, 8334384, 7344931, -1298691, -5453535, -16248935, 7683697, 16951700, 847719, -97711, -11709155, 9984725, -766652, 1855426, 20113332, 12642773, -3700114, 4402879, 13205414, -3329674, --14731738, 360777, -10712722, -1671816, -6812355, 630286, -20361904, -6058052, -7457137, 347355, -4189204, 4277788, 19689204, 21828634, 11448772, -15103252, -8973797, 12265353, 17147120, 3635153, --15788300, -2590939, -3793530, -16404091, -10424422, -12424267, 15101105, -5683316, 2007360, -15446313, -22378928, 16556025, -1939715, 6834904, 37192808, -1903207, -7720741, -14347875, -949725, 9884330, -7759396, -5790153, 11149735, 22277458, -9644349, 14198625, -6571300, 4628901, -9047349, -4890894, --7821673, -10152229, -5302137, 6591164, -127775, -2262374, 1511292, 2710124, 11922829, -1376537, -1088237, -187905, -5674726, -652298, -2105608, 1062468, 4745939, -3207804, -1618666, -3964255, --1982127, 1305133, 1348620, -1478006, -8082592, -7487202, -2684892, -9208410, -8126615, -1527935, -6934762, 6191196, 5260261, 1132798, -1411971, 236760, 2854006, 2433636, -1152125, 1643899, -1071594, 11319386, 907849, -7062537, -9737228, -15964930, 20779588, -12985834, 15634218, -11394011, --17415556, 973884, 21526376, 14078903, -16189342, -10588705, 3543348, 3321620, 7172059, -1141388, -14296872, 7825968, 18889804, -6829535, -3359738, -556735, -3860639, -18246632, -13708462, -4127464, -18986440, 4097936, 1329292, 755914, -18032420, -20223928, -15892453, 8222178, 9097278, -6851547, --4769561, 1874753, 2020245, -10744398, 2939368, 20301774, 3358128, 12750684, 12254615, 9033390, -21499532, 31222802, 10033580, 627065, 4289599, 12378633, -6693707, -3375308, 8073465, -2725157, -4224637, -2799245, 13245142, 4845260, 9321153, -2570001, -3783866, 6905771, 17759690, -1235340, --14940044, 9499931, -23264228, -26670674, -9371082, 13901735, -9148280, -26378078, -16388521, -6663642, -9433896, 6657200, -14526653, 25725780, -8477729, -17932026, 4467303, 7080791, -6150930, 8974871, --9519795, -3599720, 3086471, 2463164, -5123359, 4584878, 605054, 8145406, -4738423, -9638980, --5898064, 1659468, -2407866, -1918240, -1042066, 107374, -1057636, 6606197, -1410897, 1123671, --2949032, 3059627, 5137855, 1086090, 4910222, 1641214, -8389682, -3555159, -270583, -6976101, --8570070, 3992709, 5497022, -4520990, -9128953, -9683541, 3644280, 1619740, -750009, 6258841, --3956739, 8410083, -37284076, 1984812, 18926310, -3520263, -4414690, 22918482, -12287901, -12752295, --16187732, -5417028, -5458367, -10845329, 3219078, 5213017, 8863202, 6200859, -5168457, -4142496, --1814087, -4637491, 1552094, 4267587, 18700824, -8067559, -24195162, 12883291, 114354, -776315, --20122996, 8911520, 3918621, -2152852, 22944790, -6635188, 2502892, -2197413, 10122701, 12127377, --13412646, -1395864, -7522635, -952409, 6866579, -5155572, 10510859, -16462610, -13674102, -8734890, --14610405, -2623688, 1331440, 2182917, -20437066, -13518946, 9730248, 16400333, -7827578, -9306120, -8666170, -18791556, -16957604, -16500727, 18034568, -30531312, 9880572, -1737314, -17966386, -5828271, -15151571, 38597796, -5197984, -10791105, 12741020, 29569240, 10644540, -6805376, -7215545, -1472100, -8104067, -671626, 3767760, 17551384, 1134945, -6724845, -12509092, 10232760, -14754286, -10165114, --7365332, 5081483, -6110128, -10791105, -6794102, -6615324, -137439, -7995082, 2653216, -6225018, --597537, -2125472, 7436199, -5794985, -4514548, -11742977, -3528853, -2194728, -3984119, 10902238, --8211441, -10572062, -748398, -9295383, -8463233, -3965866, 1153736, 8134668, -1176821, -3673808, --1692754, -5613523, 3764002, -11187316, -1061394, 11281268, 5322538, 7332583, -3000035, 2691871, -3539590, -2889439, -4466229, -6381248, 2088428, 5355288, -2363306, -20855288, -33608656, -1828046, -38245612, -6031208, -2888366, -25264608, -2058900, -1589138, 2498060, 8498130, 1009317, 7079717, -353261, -319975, -18228914, 2668249, 16302085, -11019275, 20253456, -8513699, -1415192, -18006650, -11435887, -8931384, -6009733, -20796768, -28453622, 14529874, -13968307, -13528610, 4809827, 2972117, --6249715, 1455994, 15869904, -4693326, -15446850, -9439264, -19736986, -2346126, 5444945, 13607530, -2626909, -3945464, -3508988, -8068633, 4546223, 14123463, 2180233, -8778376, 15870441, -15310485, -1495722, -26410828, -7937100, -5154498, 32444720, -20578262, 6512244, -6672769, 4134980, -3779571, --3786551, 644782, 13109851, 4030827, -24197846, 26455388, 7934952, 9451612, 3271691, -10535555, --8200703, -3016678, 3196530, -585726, 5134634, -14302241, -15049029, -2433636, 7109782, 16067473, --10107669, 13625784, -3509525, 5305895, -10930155, 6131066, -17717276, 19633906, 696858, 2176475, -6281927, 8845485, 691490, -12277701, -6089727, 3285113, -11806865, 3132105, 5287105, 4886599, --7099044, -4328254, 11587822, 2116345, -12141336, -1764695, 10019085, -3893388, -14899242, 16600049, --4723391, 6379100, -3012920, -4843113, -8041253, 5050882, 1206886, 5251672, 595927, 8861591, -848256, 6342593, -3336653, 341987, 3808026, -2379949, -3759707, -16653736, -9628243, 35494684, --4250944, 2941516, -18313740, 16556562, -9396315, 12187507, -9483288, 21437256, 2342905, 2174864, --10222559, -8544837, 12714177, 27788976, -11357504, -16951162, 8214125, -6678674, 18563922, 23156316, -11661373, -3483755, 14573898, -9523553, -8605504, 19454592, 27043798, -29982092, 2719788, 4472135, -5344013, -10146323, -436476, 12105902, -30030948, 9107478, 17983028, 6664716, -13205414, -3727495, -22022444, 17811766, 6201396, -10236518, -13087302, -26226680, 37697464, 6774774, 19521700, -2798708, --7680476, 4190814, 11485279, 353261, -314069, -30481920, 5012764, 28751584, -4844723, 27551142, --16236587, -7426536, -11230803, 6423124, 26217018, -8169028, -449898, 23440858, 28932510, -9345312, --20619602, -18671296, -15966004, -7584912, -6564858, 16464220, -19856708, 10977400, 12735115, -4593468, -1743220, 12897787, -2178622, -7452842, 8089571, 5472325, 4467303, 11853036, 2939368, -2152852, -11087995, 3805878, 4883915, 5413807, -1513439, 600759, -2110977, 4605279, -19433116, -5555004, -1180042, -3925600, 8053601, -14926622, -1329829, 96100, 5624260, -448287, 8732742, 5732171, --3637301, 11772505, 6422587, -4241280, 8939974, 9171366, 462783, -6118181, 4898410, 8914741, -5869610, -1478543, -8334384, -4376035, 2674691, 1234803, 1797444, 14156749, 10413685, 24984362, --7557532, 18095234, -9577240, -3819300, 16817482, -566399, 22923314, -27668716, 17335024, 3160022, -7698192, -11130945, 8389682, 20640002, 40135932, -9243306, 10189273, -567473, -26646514, 24414204, -2459406, 9538049, -4884452, -12480638, -4653060, -1036161, -10358924, -6514929, 34055332, 2362232, -13077102, -9777493, 24124294, 106300, 11682848, 4920959, -14172855, -3048890, -8761733, 222265, -4318053, 28519120, 14483167, 1159104, 3331821, -1063004, -2435247, 4627291, 2781528, 17829482, -14490146, 7268696, -8589398, 12353400, 26036628, -24747064, 22804128, 3592203, 6785512, -24879672, --11880953, -31245350, -25252798, -5065914, 16640851, 13873281, -43314208, -438087, -19616190, 10104447, -42959872, 21498996, -27885612, 15013058, -11572789, -14458471, 23578834, 11838540, -12392591, -6977175, -20713016, 16938814, 9159555, 26406532, -7381975, 16116865, 14140643, -17163764, 23517094, 6305012, -27323508, 8176544, -2807298, 16000901, -1946157, 3994320, -19633370, 14323179, -9721658, 7330973, --7313793, 3088618, 8680129, 21689048, 5441724, 13071196, 3049427, 3980361, -7551090, -1920924, --2930242, 1495186, 10654740, 9105331, 16191490, 5810554, -2386391, 2325188, -4290673, -2515240, --17064442, -3139621, 3710852, 4918812, 13845364, 12390981, 11230803, 14028974, -36266704, -55672976, --14601815, -6265284, -13826573, 3097208, 18711562, -19624780, 28263032, 10372883, -40940704, -31345746, --6376953, 22349400, 709207, 1876364, -4374961, -12944495, -39646844, 1632625, -33329484, -27519466, -13385266, 10718091, 9652939, -4646081, -13001940, 29971892, 17843442, -12710956, -26036092, 19792284, -9875204, 4668630, -12320114, -30335354, 11406359, -14236206, 4417374, -25837450, 31279710, 792421, --12729746, 3080029, 7760469, 25929792, 16048682, -6622840, -1453310, 9092446, 8818642, 10002979, --6065568, -40517648, -32048510, 6467147, -4561256, 23746338, -4728222, -10159208, -28782724, 33246268, -12563853, -23128936, -24078660, 34105260, 31752156, -310848, 23238994, -3105798, 607201, -9659918, --6091874, -18280992, 22381074, -4150012, -5337571, -9756555, 9101573, -28778428, 13374528, -8406325, --5638755, 20491826, -673773, 3265249, 4910758, 18813568, 9372692, -7633231, 13706851, -4128537, -16594680, 6680822, -19146964, 4726612, -9844602, 9002251, -8035884, 223338, -12805445, -6426345, -6658810, -12408161, 5043366, 4279935, 5187784, -11090679, -8196408, -14279693, -12773233, 16699370, --6258841, 10786810, 6535867, -10205379, -1683090, -8924405, 122943, -5659157, 20859046, 17796734, -11814918, 16623134, -4318590, -18449032, -21365852, -3026341, 6160057, 30745524, 18547816, -7099044, --5978058, -8286603, -15546708, -949725, 6721624, 3106335, 19530290, 1913408, -13764833, -35365296, -55763708, 1405528, -43133820, -3264712, -16057272, 7294465, 21401286, 19439558, -23997592, -38509212, -6577743, -18431316, 5873905, -3755412, 16979080, -5574331, 2429341, 10087268, -15731928, -19291382, -2038499, 5063767, 16811576, -385473, -26896696, 17691508, -15001247, 13903883, -13038447, -8876624, --1468342, -4268661, -28916404, 5432060, 8079371, -27958090, 11826192, -10988674, 5601174, -9329206, -27011050, 21031918, -27236536, -14457397, 18602578, 23309324, -27870580, 36792836, 2386928, 29625610, -21525840, 34959960, -10814728, -14838575, 7850664, -29011430, 4430796, 3664681, 50939924, -15794742, --47884052, 80834504, -38193532, -29381872, 46605228, 21049098, -27193048, 45282912, 5039608, -36888400, -45871860, 5535139, 4106526, -8021925, 6738267, 30434676, -7448010, -10620917, -15850040, 22657026, --8259759, -5822902, -3191161, -9165997, -9780177, -14234058, 13598403, -2057289, -1282048, -5182415, --3519189, 1681480, -6152541, -10718091, 1343251, -8686571, -16030965, -16715476, 20686710, -9062918, -1902671, 19047644, -9222369, -8839043, 1321776, 9400610, 4053376, 3949223, 18358838, -11449846, -2629594, -8471286, -5254356, -3795677, 30378840, 14976551, -4977867, 4199405, -16155519, 5033165, --14789720, -9302899, 7093139, -4054986, -30488900, 18610094, 7627325, -5825587, -50255948, 7009387, -14988362, -37600292, 17184164, 10033044, -13254806, -3691525, -706522, -9159555, -3071975, -5334350, --16829292, 548682, -8410620, -1767916, -4155381, 8262444, 29965986, 25195352, -23167590, -2467996, -31541702, -5439039, -5942624, -32192390, 3719979, 10694469, -5288716, 27610198, 65951908, -22087406, --27797566, 47060492, -3132642, -25216290, 29308320, 19398220, -15191836, -22637162, -28101434, 8683887, -15095736, -12409771, 44265008, 28985124, -55169928, -52842592, 30900142, -24806120, -32256278, 41998336, -6767795, 56181932, 26934276, -6671158, -7508677, -40316860, -31507344, 92204896, 25456808, -19618874, --44518948, 1379221, -18116172, -39654360, -6163815, 46761992, 19870666, 738734, 38416336, 33695092, --10590316, -42572788, 6669548, 25769804, -10561861, -9832791, 53525492, 30911416, 5362804, -5451924, --27449136, -26787174, -6909529, 25637734, 10315975, -10165651, -4851166, -11788611, 10070088, -7510287, --10251013, -6453725, -1221918, 7847979, 10348724, 9337796, 3881577, -24255828, -8494908, -4575751, -9285182, -9288404, 1745904, -2299418, 22552336, -14277008, -10036802, 23481124, 6548215, -11498164, -18370648, -6118718, 5415417, 1722819, 4238059, -13741211, -3722126, 19410568, 18800146, 8082592, --7354595, 5324149, -8453033, -6541235, -5168993, 10370735, -15610596, -2952790, 12537546, 49995568, -41503880, -11044508, 29477972, 3130494, -22994718, 14770929, 25171192, 8516383, 10851772, -32958506, --6788196, 3963718, 6626598, -4773856, -28797756, -10257993, 10302553, -6903086, -3116536, -24217174, -37261524, 4772783, -30863098, 17546552, 43755516, -22512608, -13250511, 6518687, 14380624, -14026826, --27674084, 23781770, 39779452, -3081102, -15757698, 5291937, 11199664, 18274548, 25448754, 1799591, -46395848, -920197, -51864952, 525597, -5924371, 17010218, -5515275, -42149200, -1267015, -18132816, --17929878, 25502978, 13242458, 14601815, 18130130, -37758132, -19916300, -6523519, -606127, 15430207, -434865, -7612830, 966368, -12837657, -25922812, 2639794, 40061308, -20511154, 3725884, -15908022, --11586748, 27603754, -33881388, -237297, 14743012, -11807939, 5442261, 4355634, 8305930, 9878962, --17947058, -21231098, 35851704, -7331509, -11772505, 18668612, -18564460, 11707544, 2201708, -7440494, -5550709, 15709380, -3073586, 2250563, -7788387, 3891240, 850404, -884226, -6971269, 8652748, -4128537, -703838, -857383, 7283728, 5796595, -6486475, -12097312, 6694244, -862752, 3484829, -550293, -2947958, 6021008, 328028, 4967130, -1825898, -1126355, -3319473, 812823, 5936719, --1456531, 14567992, -6018323, -4210142, 486942, -6113886, 3826816, -43223476, -62003760, -54831164, -110295832, 105287368, 105076376, 296649088, 105393664, -12213276, 19523310, -205112608, -249850064, -83937080, --140196864, -194280704, 24983824, -10773925, -32512902, 213981712, 130604584, 54570244, 334143072, 157770784, -29167122, 152371488, -36135172, -181773760, -174100256, -165839424, -229861824, -225025152, -52853868, -81204408, --132513696, 154775584, 71257800, -55684788, 223462320, 72227392, -26243860, 252712112, 230200048, 53080964, -238889296, 242449824, -9298604, 60250876, 27439472, -233230688, -270818624, -201627232, -381252448, -360993088, --216846992, -289538784, -217855776, 24761024, 179109792, 203320528, 436755232, 397176576, 350167616, 377354208, -278284352, 141373680, 43154756, -30522722, -212568672, -256203920, -274342112, -309107712, -293347872, -249975680, --161589024, -117308440, -114790520, 22028350, 69610144, 136782368, 325055488, 337662272, 230827648, 288598720, -121995328, -39716100, -95506648, -147853168, -202782048, -146757424, -98203888, -97641248, -33684356, -9064528, -838592, 52167748, 66122632, 63123136, 96505768, 60898880, 39327940, 48821432, -28745680, -26458610, -8225936, -78065328, -55330452, -20219632, -75537200, -46500000, -5207648, -75889384, -80305152, -53165252, --78797080, -51562692, 59413356, 111162344, 176562352, 260577280, 243059184, 208193168, 195572416, 105966504, --32239636, -162426544, -287866976, -341674304, -308279872, -249395872, -188383712, -88151520, 28366648, 112104552, -157007904, 169647456, 149630224, 133777496, 124294744, 125515048, 87298432, 41714868, 19335406, -10277320, --35206920, -31514322, -57379152, -61457224, -43352328, -31918586, -42579768, -40274984, -51890184, -58089968, --54074712, -36619428, -17319992, 7194070, 10759430, 7631083, 514859, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --3671660, -13821205, 7314330, 6095633, 3394635, -1464584, -435402, -1415729, -2878702, -3990562, -2825552, --4078072, -1725503, 3882651, 1322313, -202937, -5369, 2545305, 1183264, -1610613, -1734630, --1305670, -7206419, 2986613, 754304, 69793, -1487669, 935229, 126165, -1991791, 1038845, -2637110, -11274, -3290482, -838592, -1422708, -1532230, 405338, 3169686, -821413, 747861, --3767223, 2417530, -4654671, 2965138, 656593, 175020, 35433, 2949569, -3573413, -2653753, --4869956, 1290638, 874563, 237834, 2778307, -3005940, 647466, -413927, 78920, -2193655, -1927367, 877247, -1616518, 2997350, -4789426, 2188823, -2615098, 4873178, 2219424, 852014, -345745, -982474, -5975910, 4542465, -1437203, -157840, 776852, 1261110, 1080721, 1192927, -1434519, -446140, 413391, -677531, 1399623, -117038, 793495, -1826435, 609885, -299574, -387084, 707596, 1937030, -127775, -341450, 639950, 760209, -807454, 995896, -1209570, -971736, 188442, 863825, 44560, 553514, -333397, 210990, 739271, 365072, -153008, -568009, -154082, 13207561, 6292664, 8622684, 2362769, 2932926, -500364, 3374234, 354872, -2998961, -2210298, 5847061, -1482838, -6682432, -1830730, 135828, 368293, -2122788, 5125507, -281857, 2003065, 4949950, 2425583, 54761, -4832, 1177895, -4515085, -2990371, 1797444, -2152316, -1641214, 469225, 2211371, -4483946, 6321118, -651761, 933619, -1006096, 2348810, -3256122, 165893, -3430068, -3492882, 6851010, 155156, -2007897, -288300, 3943854, 2921115, --2044941, -2749853, -6052146, -1875827, -2486249, 252866, -2246268, 541166, -5880884, -2399813, -674847, -2393908, 1286343, 2369748, -1197759, -157840, 1105417, -1492501, 2305861, -169651, -2902861, 35970, -1008780, -3380139, 375273, -4192425, 1311039, 76773, 2365990, 42950, -2429878, 3141232, 2668249, 102005, -1746441, -132607, -644245, 3467112, -943282, 444529, -2208687, 2319282, -170725, 1307818, 459025, 1195075, -498216, 1446867, -557272, 2132988, -479426, 408022, -185220, 191126, 207232, 2793339, -8916352, -2873333, -2039036, 1555315, -1746978, -6087043, -2743947, -1202591, 1449015, 3243774, 1006633, 4445828, -3678103, -5292474, -1521492, 185757, -964220, -3622805, 11758547, -607201, 3118683, 709743, 353798, -257698, --1826972, -4468377, -3526168, -1092532, 2994666, -2492692, 6150393, -2079301, -587874, -5043902, --6025302, -510027, -3847754, -2124398, 8185671, -4473209, -1255204, -4342212, 1581622, 216359, --1590749, -4562866, -884226, 47782, -5202816, 622233, -2806224, 4162360, 2717641, -2379412, --1284732, -1309965, 1259499, -215285, 3285113, -1693828, -2179696, -2212982, 7464117, 6764574, --2330020, -6490233, 869194, 2026151, -221191, 1925756, -2713883, 547071, -3145527, 2251637, -158377, 7195681, 4414153, 6842420, -6228240, 2708514, 4146791, 177704, 3143379, 2292976, -456877, 4714801, -877247, -479426, 1189169, 673236, -1942936, 1894618, -1491964, -1243930, --147103, 500364, -225486, 735513, -1118839, 574452, -156229, 171799, 593242, 890132, -396748, 1028108, 922881, -688269, -962610, 772557, 257698, -1659468, -707059, 1388885, --845572, -29295972, -4744328, -8441758, -9577777, 2577517, -3241627, -8327405, -6903086, 1159104, --6800544, 969589, 10140955, -2516314, 4353486, 3303904, 8551280, 2228551, -5954972, 1372779, -9294846, -4330401, 4628364, -6848326, -6248104, 2059974, 2668249, 7315940, 431644, -4467303, -4243965, -2991982, 3257733, -361851, 4612795, -3891240, -2531883, -4341675, 60666, 812286, --1704028, 3370476, -7689602, 1013075, 7764227, 1704565, -2195802, 3013457, -3962644, -1985349, --9708774, -2850785, -317291, 1548873, 169651, 5248987, -7793755, 788663, -1064615, 3961034, -2107218, -1475321, 5563057, -4839892, -649614, -3876208, -7488276, -3120831, -1717450, -2080912, -5643587, -5007932, -8090108, 360240, 2660195, -769336, -2327872, 2828236, 3104188, -2220498, --1818382, -3102040, -1290638, 6564858, -3017215, 3642669, -1066763, -62814, -589484, -166967, --3366718, 881005, -2011118, -41876, -228170, -430034, 91805, -719407, -1045825, -977642, --272194, 391379, -639950, 1145683, 494995, -14551349, 8291971, 9394167, -530965, 5283347, -2369211, 11092827, 14688251, 1917166, 1904281, 4249334, 1807108, 2474438, -2111513, 2939905, --2445447, 3894999, 4480725, -12573517, 6510634, -1353989, -2356327, -3871376, -5124433, 2087354, -3561065, 5763846, 1099512, 1002338, -7379828, 346819, -2168959, -2433636, -1111323, 1007170, -403190, -540629, 7212861, -354872, -2422899, 2411087, -2833605, 3728032, 4865661, 5486821, -2818572, 618475, -3067144, 6125160, 1916629, 839666, 615254, 820876, 416075, -3517578, --5003100, 4535486, -4665945, 4344897, 3925600, 2916283, -668941, -3265786, 2930242, 3859565, -8504035, 3951370, 3190624, 2010582, -8379481, -2558190, 992674, -1355599, 3558381, -7223062, -328565, 2395518, -6801081, -631360, 2232309, -1635309, 828929, -3962644, 1457605, 511101, --1732482, 3119757, 1794223, 122943, 3379603, -1552094, -1550483, -347892, 667867, 1393180, -5142687, 840740, 1726577, 1215476, -91268, 1123134, -899259, -995359, -1438814, 902480, --812286, -677531, 537408, 535797, -682363, 1742146, -1077500, 1211718, 1084479, -536871, -1654099, 469225, 675384, 826781, 62814, 157840, 1927904, -170725, 27029840, 8152385, -1998234, 5288716, 13511967, 5446556, 16292958, 3992709, -3595425, -1168231, -1367947, -1554778, -4420058, 6984154, -3246995, 1500554, 4866198, -1809255, -6774774, 5382131, -639950, 2559264, --2309619, -3398393, 5534602, 1292248, -511638, -1574642, -6172942, -3050501, 3338263, 839666, --2126009, -1080721, 930934, 2324651, 6203544, 1963874, -5724655, -1310502, 365609, -1794760, -2054068, 2945811, -5769752, -6957310, -409096, 1749125, -743566, 5382668, -9927817, -2102387, --4506495, -5579163, -619012, -426276, 1459752, 5320391, -59056, 805843, 1710471, -853088, -7079717, 4529043, -5825587, -5097590, 3876745, 8591545, -751082, -4010426, 8458938, 4484483, -1953136, -3716757, -4049081, 4191888, 205622, 3172370, -1928440, -6143414, -3402151, -4179540, --2665564, 2435247, -3443490, 478352, 1452236, -1227824, 1407676, 1039382, 1196148, 718333, --2234457, 1236951, -717260, -1163936, -556198, 1660542, 1277753, 224949, -1924145, 1699733, --773631, 2931315, -480499, 407485, -2812130, -3584687, 1171989, -3374234, -680752, -518080, --1935420, -914828, 384936, -3029563, -1292248, -307090, 307627, -632434, 2105608, 302795, --839666, 13263396, 6443525, 11942693, -4029216, 95563, -3037616, 12031814, -12379706, -1760937, -3170760, -2374580, -2451890, 4025995, -1391569, -3819837, 10558103, 5964099, 1216013, 17835388, --4875325, -1191853, -3776887, 131533, 2945811, -4609574, -593242, -2394981, 6807523, -5761699, -1531693, 395137, -1809792, 615791, 4001299, 2723009, -5417565, -9453223, 221728, 1938641, -7821673, 9174587, 9136469, 827318, -5269388, 6568616, -15948824, -2630131, -6264747, -9287867, -6491843, -2141578, -3007551, 5056250, -1839320, -2725157, 13915157, 159451, -4108136, 4840428, -372588, 3681861, 2716030, 1808718, 8429947, -5061619, -3102577, 488553, -7239704, -64961, -1368484, -1844152, 2481954, 4160213, 8864276, -3352222, 2955474, 7649337, 4649302, 2260764, -1445793, -2646774, -5597416, 2855080, 4270808, -941135, 428423, -896038, -714575, -3198140, -625455, -988379, 548145, -2988224, -1498407, -2684, -520765, 2745021, 1200980, -2684, --3832722, -1752884, 1905355, -2252710, -38655, 1460826, 1505923, -2606508, 2410551, 1860795, -620086, 2463701, 2238752, -4460861, -789737, -1730872, 1207423, 2379949, 2932389, -638340, --1632625, 354872, -886374, -20679730, -31088048, -5237176, 1534377, -535797, 853625, -1451162, --6239514, -3508988, -4974646, -1333587, 5048197, 6032819, -5478768, -8069170, 6898791, 1433982, --4436701, 364535, -739808, -4918812, -4132832, 11470247, 5834176, -6160057, 3131031, 1301912, -4904853, -5975910, 6657200, -6646999, 4575751, 2995740, -1407676, -3097745, 2956011, -12396886, --6154688, 7603703, 12237436, 6797323, -8563091, 207232, -6071473, 8142721, 1684701, 2116882, -580357, -6698539, 3258270, 9961640, 1127429, 7533373, 5332202, 3454764, 5760625, 12219182, --3384434, -12285754, 5965173, 43487, -2907156, 635655, 10573673, -4307852, -7340099, 3613141, --1939715, -1240709, -2775086, -1640141, -3299609, -5735392, -2882997, 7099044, -9652402, -6047314, --3556233, -6923488, -6743099, -388158, 4199405, -6345278, -107911, -2335389, -2678986, -5713380, --3616363, -6562710, -344134, -5039071, -383326, -99858, 4638028, 3320547, -2337536, -2478733, --3354370, -983548, -2369748, -2236604, 2817499, -4445828, 1707786, 434865, -2843268, 360777, --1855963, 1136019, -954020, -3615289, -4476967, 18254, 1194538, 1926830, -836982, 856846, -1435056, 68719, -2329483, -246424, -2988224, 389231, 1411434, 1374926, -11956652, -7790534, -2020782, 1915555, 15943992, -13936095, -9534291, -5381594, -2633352, -1727114, 5158256, 4984310, --7377143, 7585449, -1755031, 3440806, -5312338, 11307575, -2195265, -4256313, 7311108, 5274220, -4254702, -7685307, -7230041, 9572945, -5007932, 2828236, 2342905, -3462281, 8136816, 2480881, --4832, 1815161, 5973763, 7670812, 2364380, -6804302, 1588601, -9713069, 5805185, 2546379, --10882910, 7730405, 1799054, -5648419, 9972914, 3185255, -2698313, 5830418, -900333, 11026792, --2515240, -2739652, -2331630, -1423782, 14328011, 3044595, 248034, 3918621, -12036109, -7498476, --8178692, 919123, 7623567, 1038308, 9454834, -12194486, -5024575, -7728257, -7186017, 17856326, --1814624, 6398965, 4570919, -3794604, -894964, -2451353, 1349694, 973347, 4866735, 3003256, -9748502, -5221607, 807991, -1630477, 2116882, -31139, -193274, 7516, -2081985, -9167071, -3424163, 2186138, 1361505, -2406256, -870805, -1142998, -5142150, -287763, -1844689, -3299609, -1864016, -2777770, 1195075, 1685775, 1285806, 2151779, -3582540, -1903207, -2430415, -2157147, -1275068, 2601140, 1491964, -799938, -493921, -589484, -1124208, 3762391, -1289027, 2692945, -1642288, -959388, 1105417, -682900, -11274, 979789, 982474, -16135118, 5031018, -6924561, -3919695, -4840428, 13032005, 2208687, -9150965, 1448478, -9328669, 7570954, 14405857, -12282533, -8108899, 3018288, -372588, 5956583, 15356656, -5864241, -27380, 4713190, -16791174, 997506, -7622493, -4650376, 5461051, 5973226, -3071975, 15074261, -7515656, -13605920, -5868536, 1657321, -355409, -2770791, -5881958, 4123169, 3794604, 24696, -9598715, -2232309, -2436857, 6428493, --4206921, 25274272, -3181497, 3636227, -1166621, -1052267, -12257837, 1279900, 9084393, 7374459, -24627880, -2625836, -2386928, -5078262, -973347, -6910603, -526670, 9900973, -5259725, -996969, -1788317, 2354716, 9710384, 7926362, 2234994, 19092204, -3606162, -17634598, -17678622, -12443057, --2566780, 5603859, -1742146, -4615479, 8413841, -485868, 7471633, -4577362, -872952, 6092948, -5149666, -1843078, -1803349, 646929, 1579474, -1934346, -4125316, -5906117, -1997697, -2493229, --744640, -4202089, 3167002, -1242856, 954557, -2113124, -3038689, 4106526, 1831804, -2052458, --559420, -1676648, -1811403, 1809255, -1126355, -1988033, -4012573, 3204583, 1262720, -1693828, --3037616, -4013647, -752156, -2749316, -2805151, 3447785, -2015413, 712428, 145492, -1438277, -1474784, 701690, -546535, -718870, -887448, 28727426, -20703890, -15705622, -5025112, -9923522, --11349451, 13935558, 5653788, 2794950, -4378719, -2778307, 16908750, -4905390, -7103876, -20219632, --2916820, -486405, 9553618, 3537443, -4102768, 1261110, 8378408, 3800509, 5243618, 12964359, -16266115, 4523138, -6046777, 4201015, -9753871, 6706055, 5492727, -3481071, 338229, -7553774, -3063386, 212601, -14657650, 14299557, -1279363, -6645925, 8827232, -13561896, -3133179, 14930917, -8517994, -186831, 561567, -18791556, 6599218, 10501732, 5992553, 3489661, -1028108, -13871134, --40761388, -3252901, 8309688, 11454141, -1046361, -11956652, 20137492, -9329743, 9190693, 15244450, -12562242, 2334852, 15196668, 1727114, 5415954, 3214246, 9221295, 1811403, 2924873, 19354734, --6494528, -4232154, 16363825, 8529268, 4433480, -6767795, 1637456, 13308493, -1454383, 10661719, -2441689, 2315524, 6706055, -3624953, -342524, 700080, -718333, -3027415, 5218922, 2414309, --7303592, 3980361, 2698313, 3830037, 1875290, -2119030, -34897, -2350958, -2698850, 3191698, -4066797, 1671279, 2447595, -2210835, -2158221, -1487132, -2647847, -3472481, -5180268, 700080, --3344706, 2392834, -1265942, 1363652, -4800700, -3188476, -1066763, -1624571, -1478543, -2240899, -534187, 4474819, 4675609, 1695438, 290447, -2761127, 3668976, 14352170, 13651017, -3611531, --6997576, -1360968, -4129611, 15703474, 10207527, -27426588, -3009162, 2195802, -12865575, 5060009, --18765786, 14208289, 3446175, -2261837, 7784092, 3815005, -3951907, -6363531, -4606890, 20073604, -802622, -226023, 4449049, -2799245, 8063801, 23653996, 9663676, -3546032, -4196720, -3570192, -13741748, 4798552, 13914083, 9536975, 6941741, 3914863, -6063420, -6766721, 6206228, -14191646, -2406792, -7590281, -6259915, 368830, 9729175, 1251446, 782758, 3371549, -3061238, 16159278, -21114596, 24038932, -113817, 10902238, -14342506, 5411122, 8311836, -6709276, 12295418, -9971840, --19643570, 2471754, -10292889, -1682017, 930397, -10582799, 2631204, 14132590, -8667244, -8613557, -7200513, 13077102, -579821, -5020280, 12175159, 926102, 2737505, -8515310, -1711545, -734976, -10055592, -5256503, 836445, -2525441, 2223719, -364535, 1971390, 2371359, 1814087, -163209, -1020592, 2006287, 2857227, -2477123, -4515621, -1012539, -643708, -4422743, -5115306, -599685, --2329483, 3477850, -3442416, 2586107, 4919348, -567473, -8003135, -1103270, 1638530, -3114925, --3739306, 259846, 2305861, 12246562, 4258997, 3553012, -308701, -33286, -1000727, 3331821, --809064, 3562675, 10612864, 9237401, -1141924, -920734, -1699733, 108985, -17106318, 31129386, -1944010, 8109972, 23763518, -8768713, 2409477, -4516158, 6250788, -6836514, 6843494, -16718160, --19870666, -584116, -11775727, -876710, -1115618, -1309965, -3371549, 1293859, -5520644, 4984310, --15796353, -6284074, -21304112, -1051730, 4871567, 10236518, 22982906, 12775380, 3966402, 2962454, -6595459, 5124970, 3874061, 9315784, 9729175, -3060701, -19456202, -19254876, -13228499, -7871602, -1930051, 6535330, -7127498, -11271068, -19734838, 606127, -7538742, 18047452, -8031052, 4563940, --13692893, -6568616, -2397666, -5590437, -26459682, -27529130, 7566659, 2863670, 722091, 14179835, -8075613, 11391864, 9155260, -17131550, -3726958, 32266478, -5956046, -12142946, 4750234, -7043747, -3307662, -19839528, 8075076, -9074192, 1377611, -1257889, 13095355, 826781, 5267241, -11261941, -2172180, -6325950, -2845416, -7706245, -5844914, 4115116, 4582730, -10286447, -3436511, 810138, -1995549, 2636036, 1411434, -3947612, 4573604, 1933272, 1607392, -470836, -231928, 1492501, -4645007, -4850092, 4696547, -1157494, -85362, -1677722, 3019899, -2818572, -1606855, 4149475, --7580081, -76773, 1595044, -4591320, -1504312, -10672457, 7846369, 9214315, -504122, 2241973, -2554432, 3202435, -4663261, 5180268, 3391951, 4066260, -3345780, 2266669, 3221226, 4711579, -18467822, 14069776, 1833951, 14949171, -2799245, -6077379, 8180302, -11372537, -22275848, -33263448, -2788508, 739808, 12869870, 9441412, -12411382, -6315750, -32526324, -2149094, -15149960, 3569655, --7625715, -3604551, -6260989, -2377801, -2537252, -11264625, -5085242, -13134010, 10501732, -2612951, -8986682, 23332410, -12309376, 6733972, -1913945, -5757941, 6002217, -12441447, -21205328, 10203232, -4980015, 10147934, 6332393, -44394392, -20163798, 5939403, -14785962, -1235877, -12633109, 18604724, -22389128, -1082869, 24748676, 3504693, 11242077, -3256659, -819802, -13833016, 8767639, 17901960, -3876745, 29801704, 703838, 4109210, -8748848, -13089987, 17634598, 27966142, 9759776, 5435281, -2755222, 10579041, 912681, 2025614, -26167626, -19189378, -1987496, 1398549, 3468186, 19678466, -21160230, -3894999, 1389959, -7262253, 4406100, -13551696, 346819, -14341970, -12151536, 6274411, --354335, 1580011, -8067559, 5179194, 6334540, 4261145, 6415071, 7575786, 657130, -4300336, -3323768, -5874442, -1433982, -3625489, -8609799, -2473364, -4762582, -3834332, 7145215, 3946001, --2546379, -5662378, -8527121, -5585068, 5754183, -5667746, -560493, 455267, 3938485, -8047158, --6426345, 2849711, 9991705, 6367289, 2571612, -16106, -6010270, -736050, -3653944, -6968585, -11900281, -17418776, -8582955, -32544578, -40553620, -30071214, -13728863, 9196599, -259846, -7132330, --14812805, 32212, 26769458, 13107703, -23404350, -3851512, -4832375, -16542067, -2942590, 1225139, -11275900, 8302172, -17456358, 12555263, -9856950, 5332739, -9181029, 2789045, -13369696, -4996658, -6642167, -24172076, -4606890, -9110163, 7956964, -6012418, -22321482, 26286810, 25361782, 350040, --10218801, 14322642, -34212100, -10719701, 10222022, -11514270, -7248294, -878321, -11038066, 2199560, --2820720, -22944790, 9880572, -2918967, -7022272, -7845832, -6027987, -1430761, -6249178, -9725417, -19080392, -9061307, -8963597, 9063992, -201863, 31256088, -6212134, -19367082, 11121818, -10111427, --8550206, -15108621, 10528575, 19279572, -37556268, 2957622, 31794032, -5158256, -1915555, -12553116, -21694416, -1525250, -11708081, -1560147, -10987063, -8860518, 15736223, -9411884, -731755, -5221607, --6491843, -10998338, 4716948, 3684545, 5799817, -1306744, -8804683, -6080600, 390305, 1561758, --13441100, -3867618, -8620536, 13448616, -4421669, 965294, 1986959, 1669132, 1503239, -10924786, -7454990, 374736, -4095788, 9812927, 1599875, 12838194, -2190433, 14833206, 3524558, 5992016, -7349226, -9590125, -6238440, 4696010, -7801271, -6153615, 2442226, 45097, -5449777, -12963822, -6444599, -25663504, 51269024, 36568964, -695785, -9774272, 8138963, -30735322, 516470, 38264400, --6737193, -13292387, 636729, 43370044, -6196564, 9531606, -9208410, -19594714, -15841987, -3993783, --7227356, 8010651, 11107322, 625455, -16294032, -22821308, -20992726, -3365107, -4591320, -11303280, -10649908, 8629126, -9152575, -11170673, -12195023, 6926709, 2440078, 8507256, 21721260, -78383, --18444738, 12623446, 5018133, 4303021, 1386738, -284542, -8846559, 16104517, 8291971, -6352794, --7576859, -5010616, -20936892, 5876589, 15504295, 4758824, -14625437, 17315160, 12738336, 7215545, -2030983, -8960912, 4855461, -29882772, 4807142, -1768453, 26869316, -9508521, -13108777, 5778342, --6772627, -455267, -19184008, -3394098, -5035313, 26080116, -16732119, -31376884, -20374252, -40804336, -8190503, -8210367, -2550137, -21720724, -13770739, -36042292, -15847892, -12521440, -1692217, 8998493, --11494943, -1911261, -2021319, -1705639, -3026878, 7893076, -13370770, 6035503, -5128728, -10412611, -1845762, -2896956, 9934259, 5178657, 423591, -5141076, 12777528, 11870216, 7310035, -4371740, --6008123, -6034966, -5465883, 13333189, 21788906, 2698850, 20052666, 21923660, 7532836, 567473, --19151796, -1897302, 3930969, 3038153, -1512902, -5148055, -16139413, -175557, 11391864, 1978906, --12014097, -2931852, -8935143, 48922900, 1705102, 8294119, -8356933, -15773267, -21721798, -6904697, -5847061, 14470819, 11584601, -10122701, -290984, -21301964, -8092792, 7900056, -18345416, -9520332, --7100118, 26478474, 13485124, 14658187, 13436268, -15051176, 2564096, 5712844, 5972689, -1288490, -17498770, -3726958, 7569880, 13936095, 5031554, 3996467, 11384885, 16140487, -9654550, -18603650, -12302934, -1872069, -191663, -19677930, -18719614, 4406100, -9492951, -7031399, 15967078, -16564615, -21197274, 13998909, -9785546, 11442867, -12838194, -12534325, -15612206, 22298934, -15800648, 7117298, -6499360, -25266218, 2141041, 3064996, -20316270, -34429532, -31160524, 22613002, -23490786, -322123, --21151640, -4723927, -15204721, -1166084, 9375914, 5990943, -15472620, 15821586, 18003966, 38289632, -9725417, -25648470, 8788040, -15771657, 8290361, -22565758, 11857868, -9646497, 1428614, -4614406, -8983461, -2775623, -9462887, -21683142, -21900038, 2413235, 1817308, 13695577, -10030896, -937377, -21100100, 6043019, 14543833, 4479651, -4144107, -1653026, -5354751, -14330158, 4857608, -17288854, --10467372, 3671660, 14025753, -18884434, 10220948, 1916092, 13245679, -4645007, 7292855, 13589277, -14748918, 15046344, -7164006, 7296076, 11500849, 12632036, 2205466, 7496329, 3686156, -5911486, -23159538, 10746545, 11536819, -9826885, 880468, -21431886, -340376, 3600256, 4188130, -18901614, --19663970, -31130460, 21627844, 2209761, 7450158, -5129265, 11475079, -8534100, -8360154, 6424734, -16484084, 3845606, 10852845, 33501282, -4815732, -20244866, -42945916, -6134824, -16568373, -8186745, --10193568, -19981798, -14017700, -29841432, -3414499, -476205, 10495826, 30917322, -25691958, -9926743, --4176856, 10121627, 11017128, 30635464, 4234301, -35003448, -7968775, 7177427, 27447526, 7184944, --42315628, -16995722, 38448012, 3498251, 38357816, -22513144, 1326071, 3005940, 23259396, -2143189, -21176874, 31780074, 4594542, 26967562, 19006304, 4594005, 37427956, 31917512, 10457172, 49760416, -38312184, 23988466, -40176736, -2575370, 15910169, 9215389, -345208, -29161218, -34794604, -18010946, --49856516, -7836168, -37038724, -14111652, -9419400, -53446036, -50636592, -35252016, 17604534, 634581, --11583527, -535260, -3697967, -978179, -9718437, -5126581, 12617540, 5082557, 2328946, -1560147, -2155000, -2296734, 7894150, -1149441, -13177497, 23388244, 3943854, 5763309, -6706592, 1307281, --617402, 12365211, -425739, 7300371, -3980361, -12495134, 5308043, 10061498, 25926034, 23079006, -1742146, 21475, 16642998, 8432095, 19407346, 16210817, -4842039, 18665928, 10539850, 4020090, -11808476, 7799124, -6280853, -2631741, -14421963, 9358734, -12836584, -5459441, 7301982, -27711666, -29579976, -12831215, 19377818, 9430138, -24779814, 3600793, 15479599, -9846749, -25884158, 17084306, --6971806, 14597520, -8644159, 3650185, 6061810, -16077673, -1821603, -7146826, -269509, -26244398, --20474646, 25314538, 1243930, 10173704, -19980724, 20677046, 18659486, -14092861, 11922292, -20409148, --4269735, -11483669, 14832670, 36033164, -533113, 43744780, -10989211, -2219424, 2218351, 4361003, --2868501, -24874304, 43179452, 27931246, -3205656, 23437100, 18599356, 24332600, -9119289, -708133, --43549356, 19622632, 20780662, -5842230, -7279970, 27213986, 14668387, 14273787, 34269544, 5533529, --17277042, -21264384, 6617471, -6794639, -24918864, 20643760, -28898688, 1067836, 6713034, -20900922, --32118840, -22202296, -7990250, 2117419, 26391500, 17324288, 8607651, -49827528, -13680008, 29696478, --2097555, -11009075, 9109089, -27100170, -16485158, 22416508, 178241, 115964, -9268539, -66035, -14057428, -4481262, -9848360, 7602629, -3208341, -19347218, -10095321, 1666984, -1127429, -1389422, -614180, -8611946, 327491, -13357885, -17358110, 2164127, -1327682, -29286308, -2953864, -17823578, --9846749, -3449396, 4715337, 5088463, 16259672, -14921790, -9690520, 2999498, 15852724, -16493211, --17097728, 24289114, -3507915, -1600412, -4366371, -375810, -9960029, 4149475, 11796665, 6092411, -10307385, 495532, 4062502, 34897, 1740536, -36783172, 20883742, 32648730, -714038, 37613712, -11264625, -32523640, -20172388, -2490544, -11437498, -19752018, 20875152, 24609088, -2461553, 17153026, -22902914, -18080202, 16125455, 27657442, -1775432, -37152004, 14527727, -971736, -7487739, 10364293, -28021440, -8890045, -14264123, 6993281, -12430172, -16052440, -1228361, 24811490, 20998632, -34998076, -11059004, 15128485, -23672786, -14951855, 28349468, -7629473, -41477572, -5163625, 34693672, -11225971, --59882580, 62836984, -17936320, -7092602, -31008054, 40657772, 13106093, -13806172, 29381334, -17171816, --13044353, -7398618, 75343928, 25352656, -31668404, -27764280, 28846074, -6519224, 42032160, 967978, -31526670, -43321188, 34687228, 60143500, 5578089, -6244346, -10645613, -10253698, -24007256, 56767120, -37934224, -33618320, 9412421, -35344360, -6174553, 4061965, 7328825, 5226439, 10409390, 1224066, --39068096, 18479096, 2291365, -3803194, -929860, 18171470, -7861938, 4222490, -5782637, 9549323, --3782793, 2659122, -6321655, 11967926, 377420, -2088428, 6570226, 9672803, -21433498, 2854006, -13349832, 5394479, -15472620, 8494908, 24077586, -23397908, -36866388, 7511898, 4472135, 14687714, -14019310, -1645509, -33310692, -10942503, 8993125, 4895726, 9254044, -4709432, 1301375, -1031866, --11179263, 9983651, -8766565, 27043262, 61847528, 11956652, -23916526, -5699422, -5866389, 10845866, -9306657, -19313932, -27538256, 7344394, -23304492, 4632659, -14507326, -16687559, -3628174, 2821794, -7904351, -18599356, -7512972, -7377680, -23145042, 19406272, -7281580, 1246077, -3435437, -15444166, -6124087, 4339528, 536334, -3339874, 171262, -569620, -9129490, -19646254, 8399345, -9754408, -8519068, 5986111, -19634442, -15898358, -1806571, -2287070, -2238215, -4221416, 16004659, -11075647, -1637993, -20853676, 17804250, -20431160, -10813117, 10158671, 288300, -16373489, 13020193, -22014392, -1680943, 6631967, -578210, 2413235, 10557030, 5013301, -22680112, 11488501, 1620276, -13681618, -19471234, 7675644, -21520470, -2346126, -17155174, -2248952, 7007776, 5768678, -21906480, 27939836, --14744623, -8094940, 15566035, 10335839, 2571612, 10401874, -833761, 14549202, -6430640, 3002182, --1762547, 7059853, 5531918, -4137127, -4996121, 5624797, -6924024, 780610, 1260036, 967441, --4041027, 736050, -3762928, -6250788, -3355980, -6802692, -290447, 5200669, 9046275, 3394635, -1147293, 4807679, 5959804, -8101382, 12674448, 3369939, -298500, -8214125, -4606353, 4018479, -10060961, -1859721, -88047, -4808753, 1760937, 1515587, -3972845, -5482526, -4810364, -12868259, --4586488, -37123548, -46348064, -16995186, 140025600, 112070728, 74327096, 135528224, -53813792, -128220344, --41096932, -207234864, -80744312, 5864241, -48556216, 95051384, 129866928, 21242908, 82568600, 141779024, -3122441, 39082056, -9192304, -166630768, -137820672, -104167992, -103435160, -50987168, 79103096, 42489036, -61226908, 174037440, 73867528, 10805064, 104263552, 48442936, -59626496, 20330228, -50007376, -168875968, --40581000, -88238496, -173916112, -28923384, 4083440, -42518564, 117759952, 135847664, 53641996, 159742176, -161722704, 30163018, 62375812, 28030030, -102149888, -114591872, -107188424, -192924032, -170415712, -64983928, --79121352, 16672526, 103380400, 141463344, 116963232, 180706448, 134122168, 71931576, 9993852, -22582402, --104210400, -127000576, -93730144, -111598816, -93020400, -4106526, -5240934, 21129628, 100411504, 48358648, -61341260, 96148752, -2008434, -30012694, -15902116, -60358248, -34495568, -20273320, -22270480, 24645596, -50837380, 19662898, 28128814, 31978716, -23396834, -8398272, -9985262, -61582852, 8438000, 25622702, --66715336, -888521, -6235756, -67350456, 24927990, 11272679, -76272712, 48027936, 71595496, 16767552, -144330224, 89754616, -1946694, 76768784, 13698261, -97773320, -81282256, -127298536, -180623232, -135613600, --88377544, -47559784, 61372936, 133379672, 156292784, 194695168, 190727152, 135007472, 29628832, -14517526, --97274032, -177209808, -172392464, -153183760, -128762584, -27935004, 13528610, 22120692, 88153128, 93741960, -64961380, 66937064, 51891256, 22429392, 31666258, 22938346, -5954972, -11979201, -28184112, -56296820, --61058864, -60413548, -61165704, -45817100, -9196599, 4551592, 16142098, 19381040, 10968273, 4398047, -1093069, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --5063230, -15737834, 6034966, 3824132, 1245541, -3338263, 45634, 3016678, 5682779, 75699, 554588, -329639, -2076080, 550293, 1931662, -391379, 1886564, 2901251, 3874597, 1621887, 1592896, -2035278, 1813550, -3562675, 3613141, 6772090, -3209414, 1919850, 1068910, 1884954, 354335, -4005594, -2609193, -940598, -2347737, 2306934, 6725919, -1142461, 3266323, -101469, -1513976, --5550709, 2077690, -2881923, 2558190, 1280974, 2857227, -331786, -1710471, 886911, -1176821, -3834332, 501974, -3064996, 3911105, -871878, 3053722, 2335389, -118648, 2240362, 4408247, --1258425, -1538672, -1269700, 2195802, -1821066, -2370822, 2719788, 36507, 1818382, -2929168, -4310537, 260919, -1243930, -504122, -503585, 1729261, -1647120, -2595771, 1511829, 2330020, -2178085, -2058363, -3105261, 1242319, -134755, -364535, -1213865, -1123134, 1514513, -399969, --255014, -952946, -1161252, 226560, -843961, 353261, 207769, 1143535, 762357, -338229, -377957, 651761, -721555, -285078, 10201, -312996, -561030, 397821, 1071594, 633508, -791348, 16106, 12225624, 9594420, 4808753, 707059, -1816771, 5563594, -3260417, -3485903, --812286, -6094559, 3677029, 255551, -2541547, 1453310, 3533148, 6098317, -2836826, 3521873, -7898982, -2247342, 41339, 1823751, 4098473, -1024887, 4466229, 3184182, 4518306, 1057099, -3446711, -3510062, 6026913, -707596, 5814312, 2906619, -659814, 740882, -983548, -118112, --2126546, -978179, -2623151, -1902134, 2013266, -528818, -5667746, -1249299, 577136, -139050, --3172907, -3236258, -1675037, -1388885, 4393752, -1749125, -4874788, -6460168, -7158100, -2441689, --3167002, -236760, 1074279, 3464965, -4691715, -2099702, 519691, -453119, -2117956, 538482, --4937602, -444529, -5814849, 3111704, -3179350, -1516660, 3984119, -565325, 2725694, 813896, -973884, 3126736, 745177, -2483028, -1176821, 266825, -2471217, 1316944, 2453500, 1224603, --1942936, 1454383, 2046552, 423591, 1094680, -592706, -1155346, -768262, -1155346, 817118, --148176, 750546, -970663, -679679, 766115, 6478958, -14046691, -3777961, -7113540, -1328219, -1611, 7731478, -3757023, -12601434, -4430796, -327491, 4803384, 1489817, -4664872, -10940892, --2805688, 2991982, -1217086, 6154152, 251256, 2694018, -599148, -4858145, -5270462, 3178276, -3894462, 451508, 1272384, -195958, 2386928, 548145, -6483253, 343597, 9163850, 1229971, --2258079, -845572, -2414309, 559956, -2079838, -3975529, 6142877, -1904281, -2532420, 5560909, --2889439, -4934381, 246424, 34897, 181462, -7116761, 5809480, -2203318, -115427, 5342940, -4879083, -7629473, -1912334, 1482301, 1877975, -670552, 4206921, 1158031, 2102923, 2905009, -460098, 2323041, 3530463, 770410, 48855, 3275450, -8679055, -1920387, 248571, 4445828, -2491618, -1063004, -849867, 3236258, 3037079, -3462818, -463856, -1226750, 139050, 1919850, -2465311, 496606, 3039226, -292595, -2120103, -1007170, 277025, 235149, 321586, -797790, -2129767, -417686, 789737, -306553, -915365, 629750, 9127, -402116, -742493, 187368, --695785, -106837, -1278827, -1003412, 311922, -185220, -990527, -2017561, -703301, 460635, -1762010, -27909772, -11086384, -5578626, -7984881, 2561948, -2791729, -2610803, -379031, 3599183, --3250753, -3754875, -5600638, 1182727, 4944581, 1181116, -3853660, -4662724, 1367947, 4231617, -3809099, -5309654, -7968775, 667331, -7452842, 4018479, -93416, 2825552, -252866, 2728915, --2959769, -1154809, 7705172, -9306120, 4270808, 2258079, 1005559, -3255048, 2028835, 4689568, -1188095, -5641440, 1109175, -3552475, 2750927, -7726110, -338766, -6992207, 5395553, -504659, --1444183, -1932735, 2951716, -11782706, 5425618, -3345243, -7219303, 2943663, 5733782, 6605123, -3808562, 1469416, -504122, 852014, -632434, 4290673, -2443837, 1270774, 3277060, 8240432, -1264331, 239981, -5899675, 3817152, -2951180, 747324, 128312, 4424890, -3889630, 307627, -3956739, -273804, -4769025, -6439767, 5357435, 535260, 978179, 2801393, -592706, 1406065, -1131187, 44023, 942208, -370978, 132070, 1532767, 1312113, 1512365, -2396592, 1017370, --1806571, -685047, -1526324, 1487132, -1727651, -15913928, 7796977, 12402255, 2424509, 967978, -6912750, 2316598, 2122788, 3760781, 530428, 3935264, 3983045, -3218004, -576599, 524523, --3889630, -2432562, -39192, 1904818, -2289755, 12896176, 6870874, -1898376, 934692, 4085051, -5173288, 5878200, -2456185, 4134980, 4843650, 257161, 1420560, 1378148, 2762738, 1979980, -1224603, 2713883, 2616709, -5601174, -4307316, -8615704, 940598, -3061775, -4289599, 4409321, --1248225, 2770254, -10645613, 11718818, -842350, -5595269, -1026497, 9286793, 6740951, -1497870, -250182, 4489315, -2132988, 1922535, -3420942, -7337952, 871342, 670552, -5876589, -2342905, --5792837, 1021665, 2152316, 1297617, -2812130, -5141076, -7805566, -9323837, -6686727, -2622615, -542777, -2278480, 914291, 3078955, 2751464, -3883187, -408559, -4233764, 1547262, -1483911, -1218697, -68719, -1717987, 1220845, 1415729, -1254667, -580357, -1629940, 2187749, -2599529, -569083, 817118, 772557, -273804, -596464, 541166, 1165547, 1147830, 955093, 717796, -983548, 310311, 1865626, -438624, 2066953, -1295470, 657130, -392453, -523449, -1489817, --1139240, -994285, -1335198, 519691, -1071058, -153008, 987306, 318901, 29315300, 7773891, -2174327, -1086627, 17668958, 2073932, 8395050, 1733019, 5583458, 9203578, 3246995, -5108327, -5429913, 6326487, 996969, -461709, 1348620, 11580842, 799938, -3957812, -7044820, -2068564, --216896, -8044474, 1344862, 2386928, 4611185, 1966558, 3252901, 8869107, -2776160, -1411434, -5442798, -854162, -2411087, -462246, -7940858, 5128191, 3351685, 178778, 5094905, -2554969, --6957310, -15022185, -5509370, 5541582, 6120866, 187368, 4292283, -4248797, -4618701, 12211666, --7083475, 5529234, -6239514, 1291711, -9090835, -9541270, 10331007, -3962644, -3733400, 14259291, -1060857, -1616518, -6719477, 5217849, 8228084, 387084, -4458713, -8422968, -1336809, 6092948, --1973538, 2052458, -3732864, 2988760, -1433445, 952409, 6490770, -7047505, 2175401, -2012729, -412317, 783295, -833224, 7496329, 2329483, 1078037, -2262911, 46708, -1800128, 3138547, --1566053, 2480881, 2490007, -2677912, -19864, -459562, -1751273, 3537979, 562641, 1633161, -92879, -1303523, 681289, -27380, 19864, 978716, 1537598, 544387, 2029372, 606664, --210990, 1118302, 738734, -860604, 195421, -402653, 396211, 1801202, 1999307, 277025, --252866, 14890115, 5004711, 12335146, -7537131, 2456721, 6964290, -9446781, -3172907, -3701725, -1033477, -4782446, -2851858, 7305203, -2173254, -1396938, -463320, 9146133, -3291019, -4265440, -9844065, 1567126, -6863358, 2901251, -1459215, 1547799, 3758097, -5631239, -1236414, -4236985, --7509751, 900869, 250719, 1417876, -7387881, -7779260, 3062312, -695785, 2982318, -337692, -4310537, 1225139, -134218, -4980552, -4738423, 1301912, 4841502, 2294050, -1337346, 14015552, -3395709, 2370822, 6444599, 2330020, 4808216, 4799089, 3222836, 1905892, 2484102, -2077154, --1049046, 1030255, -5901822, 1537598, -9548249, 2583960, -6301254, 4937602, -3519189, 2692945, --1184874, -4701379, 1624035, -1275068, 5070209, -4411469, 13469017, 11260331, 5272073, -9710921, -3092377, 4250944, -4072166, 1739462, 1249836, 6531035, 6305549, 2574296, -88047, -947040, --1291711, -3872450, 5879274, -493384, -652298, -37044, -1624035, 579821, 1995012, -1658931, -3085934, -1213328, -2449742, -2674154, -44023, 1726040, 1782411, -541166, -577673, -2127083, --844498, 1025960, -2433099, 2699924, 2904472, -1884417, 558346, -2368675, -714575, 320512, -975494, -1824287, 3074123, -18502720, -35604204, -1518271, -7135552, 6176700, -1835562, -9856413, --955630, -7981123, -8804146, -7545184, 11644193, 6047851, -7776575, -4468377, 8862665, 5135171, -7909719, -5437966, 5116380, -4822175, -4873714, -1497870, -2128156, -15052250, 4116189, 8608188, -3706020, -8944269, -2054605, 1597728, 2297808, -7976291, -1775969, -11451457, 2534031, -5421860, --503048, -3980361, 2199023, 12281459, -1315871, -2262911, 6153615, 8984535, -5416491, 2465311, -3397856, -7542500, 4059818, 3796751, -8871792, 1419487, 5758478, -1333587, -9341017, -5867999, --6020471, 8521215, 3305514, 8346195, -4907000, -9582072, 2295660, 4826470, -2027225, -6847789, -4591320, 6758668, 6393059, -7853348, -4080756, -1599875, 12769475, -2668249, 7632157, 2280628, --8947491, -7264401, -1371168, 5050345, -8475581, -454193, -1554778, 4727149, -994285, 10594611, -1350767, -2358474, -3117610, -2613488, -3005403, -1909650, -996432, 1031329, 9127, -1174137, --3827890, -307627, -3719979, -1575716, 1582696, -1242856, 652835, -1017907, -2799782, 1791538, --417149, 4593468, -836445, -3585224, -2534568, 1525250, -643708, 250182, -977105, -2267743, -850940, 2624762, -2200097, -612033, 3499325, 1698123, -2076080, 2858838, -18214420, -17180, -504122, 10504416, 2544231, -4188130, 6212134, -2985002, 2717641, -9865003, -2905009, -6248641, --3470871, -12473122, -4738960, -7446400, 17204028, 9895068, 10484015, -12234751, -10484552, -5007932, -5859946, -551903, -144418, 366683, 3515431, -824097, 4991826, -7112466, -6127308, -103616, --1748589, -8776229, -8858907, -7058779, -5140539, -3799436, -3536906, -11121281, 5096516, 13673565, --2977486, 6422050, 8759586, -6405407, 7578470, 4835597, 1788854, 12491912, -614717, 10467372, -3855270, 1379221, -9822590, 3964255, 4820027, -2538863, 14338748, 11496017, 2208150, -4217658, --7183870, 4202089, -7063074, 2907156, -166967, 8555038, -48855, -12590697, 882616, -4919885, --2046015, -9414568, 11052561, 5821828, 3985193, 2710661, 12337830, -3485903, -12999792, -1954210, -8115341, 303869, -6715718, -1638530, 888521, -2804614, 1540283, 4005057, -80531, 208843, --877247, 1359894, -260382, 4809290, 1395328, 1495186, -1160715, 1916092, 2444910, 4376572, --3651259, 2463164, 2428267, 59056, 726386, 4408784, 2334852, 1209570, -2678986, 3761318, --1135482, -2037425, -2537789, -70867, -6501507, 4165582, 2011655, 832687, -3110093, 3685082, -3536906, 6477885, 3926674, 1182190, 1045825, 424128, 5235029, -16489453, 7431367, 5449240, -7049652, -7704635, -13674102, 3952444, 4100083, 675921, -11532524, 11011222, 3155190, -5894306, --10158135, 4568235, -4498442, 17633526, 20541754, 3019362, -3299072, -7685307, 11659762, -13298292, --4764730, 16371342, 4064650, -3207267, -8875550, -8189429, -4630512, 267899, -10852845, 2420214, -11537356, -1494649, 4326106, -8491150, -7745437, -2647847, -6406481, 16757889, -6175626, 7509751, -6185290, 6782827, 1782948, 3316789, -11655467, -11703786, -11207717, -2527588, 8383240, 19320374, --7814693, -14015015, -3248606, -6477348, 3564286, 2967286, 10758893, -6620155, -155693, -8760660, --1679332, 15462419, -1999307, -8479876, 11072426, 3595425, 1775432, 5784247, -12455405, 1859184, --4230006, 1161789, 5674726, 13585518, 3793530, -15880105, 5770826, 1342177, -2474975, -6645388, -290984, -1734093, -883153, -473520, 2217814, 3602404, 4370666, 1405528, 281320, -2606508, -810675, -844498, 3132642, -5428302, 1993939, 2038499, -133681, 418759, 884226, -4125316, --127775, -2757369, 4414690, 4057134, 1004486, 4882841, -1949378, 621697, 3753265, -859530, -2969970, 668941, 2747705, 863825, -6274411, -452045, -2256469, -426276, 828392, 295816, --2226941, 136365, -2619930, -76236, -1286343, 26761404, -11611981, -9166534, -2755759, 5607080, --15641197, 6234682, -4198331, 7872675, -7003481, -3251827, 9754944, 7164006, 2776160, -4941360, --1745367, 13261248, 13120588, -2770791, 11458436, -3370476, 16835198, -7912941, -4108136, 2962454, -17632988, 12808129, 4276714, -9497783, -644245, -19621558, -2940979, 2996814, 9012452, 10423886, -18575196, 4801237, -328565, -962610, -7116761, -12267500, -868657, -10650445, 7659001, 2331094, -11838540, 6516003, -4039417, 11658689, -13965086, 6241125, -3114925, 937377, -2430415, 14856292, -8747238, 4198331, 2658048, -27180164, -4318590, 15996606, 8108362, 919123, -512712, 736587, -12952011, 5420249, -20508468, -6766184, -7922067, 1838783, 426276, -20446192, 780073, -19118510, --12640626, -1734093, -8200703, -8948564, 11880416, 14943265, -1635846, -7383586, -823023, 4533338, --1862942, 3856344, 6132140, -577673, 6814503, 9929964, -3219615, -5655398, 908922, -2457795, -3012920, 1893544, -1595044, -1476932, 115964, 71404, 2813204, -383326, -3459596, 624918, -3394098, 1190780, 3014530, -2709051, 4579509, -76236, -1702955, 1054951, -2916820, 1091459, --5834176, -3803731, -4567161, 2280091, 213138, -4400731, -872415, 3635690, 2429878, 3146064, --2139431, 1701344, 26844, -788127, -5575405, -2929705, -5909875, 9710384, 18914500, -4787815, --7692824, 1058710, 7319161, 4167192, -11563663, -754841, -9367324, -549756, -12751221, -1444183, --10958609, 465467, 11362336, 841814, 25077240, -10576357, -5024038, -9001178, 10247792, 16641388, --13345537, -4534949, -20709258, 3838627, -140660, 5605469, 5146445, -11677479, -6849936, 9007620, --3358665, -2631741, -11241540, 22687090, -2988224, -24419574, 6903086, -6484327, -7177427, 8695161, -6887517, -7106024, -7690139, -2422899, -14002667, -8526047, 4770635, 3080565, 4976257, -4361540, --10088341, -11877195, -11747272, 9704479, -17292076, 203474, 4305168, -5439576, 573915, -185757, --2236604, -13880797, -2427730, -5686537, 8918500, 11165304, -1950452, 17398912, -858457, -255014, --5217312, -1192390, 25271050, 2359011, -11203959, -4609574, 9917079, 7201587, -13805636, 205085, -2135136, -9538049, 8032126, 1773822, 8973797, 1286880, 1488743, 1276679, 834834, 3772055, -5461051, 392453, 2808909, 8469139, 811212, -3133716, 1635309, 4022237, -3102040, -1013612, -634581, -4100620, 3861176, 3342558, 4439923, 757525, -4511327, 983548, -1447404, 679142, --830002, -956167, 559956, -2711198, 3864934, -2019172, -2416993, -3214783, 7661148, -24696, --7991861, 5850819, 4812511, 1913945, -382252, 4450660, 3592740, -9165460, -12147241, 30758946, --7871065, -2763275, 2792266, 13078175, 9492951, -20071456, -8112657, -19072876, 4220879, 1027571, --5833640, -20990042, 914828, -9836012, 4392678, 4539244, 10608569, 465467, 7733089, 36134632, -7912404, 8963060, -5644661, -2087891, 15849503, -1458141, 1281511, 4113505, 1069984, -2402497, --8228084, 14505715, -15446313, 6362994, -22980222, -7089381, -10736881, -14292041, -12178380, -111132, --25114822, -8646306, 3478387, 14307610, 8307541, -24793236, 14034879, 9229885, 10233296, -15779173, -11553462, -7452305, -17966386, -6213744, -17877264, 8650601, 21412022, 5319317, -2036351, -14055280, -11327976, -14964203, 22356916, -4217658, -2399276, -13530758, -14707042, 2118493, 17458506, 5705327, --12006044, -4909685, 2926483, -2515777, -4806069, 11412802, 5903433, -5353140, 14774151, -1219234, --20975010, 26278220, 13993003, 10817412, 4961761, -3553549, -1297080, -2201171, 7851737, 1777043, -1151588, 17295296, 6753299, 303869, 824097, 2453500, 9031779, -7246147, 5091147, 493384, -1699733, 1652489, 5815923, 2843268, 358093, 9746355, 7456063, 648003, -3411815, -3467112, --1282048, 7977365, 3990025, 4476967, 4300873, 5305895, -6602976, 6598681, -1756105, -1764158, -6112812, 9586904, -1398012, -2670933, -64425, 9124121, 10510859, 4021163, 6475200, 4962835, -16905528, 3151969, -10803453, 4893042, -3116536, 5042292, 18542984, -26087094, -11802033, -20976084, -11942157, -4229469, 2090575, -6925635, 15139760, -14873472, -14963666, -6830609, -3461744, -10712185, --18527416, -8962523, 3515968, 12185896, -17045652, 11263015, -6393059, 1348083, 22168474, 16938814, --245350, 8927090, 4318053, -3523484, -2637110, -30048128, 4205310, -3049427, 2998424, 5852967, --2324114, 819265, 30396558, -27254788, 2601140, 32886028, 4325569, 9082782, -12862890, -3521336, -17224966, 30189862, 1560684, 26773216, -10409390, 24220932, -8483097, 17928268, 18209588, -4500052, -35460324, -5897527, -1476395, -10524817, -15991774, -16969416, -7765838, -10186052, -24635932, -11508902, --5214627, 9118752, 9035537, 1156420, -12649216, -2115808, -3563749, 15857556, 4931696, -8268349, -13594645, 3058017, -1673427, -1916629, -9884330, -1522029, -3928285, 4138201, -10009421, -4786741, --6981470, -6947110, 12637941, 4879620, -4195646, 3816615, -3230352, 2414845, -7607998, 11325292, -531502, 3176128, -302258, -7637526, 6986301, -930397, 2559801, 8044474, 5567888, 3426847, -617402, -11883101, 5661304, -4558034, -565325, 10218801, -244276, 3783866, 2424509, 4879083, -6845104, -2483565, -5574868, -3677566, -4474282, 2126009, 6133750, 10519449, 6042482, -12297565, --1602560, -13472239, -11390253, -39062728, -27616102, -19650550, -1852742, 26421566, -17279190, -2256469, --13274670, -19374598, -15896211, -19792284, -20485384, -8195335, -24194624, -26494042, -22897544, 6461779, --15784005, -8344585, -19697794, 18815178, 30975304, 2633889, -3481608, -10931229, 2612414, -1969779, --736587, -2524367, 9810242, 2008971, 21146808, -18411452, 1684701, -15668041, 32101660, 7817378, --18711562, 14720464, -13389561, 11951820, -18003430, 10561325, 1623498, -10853382, 9782325, -17148730, --5645198, 5398774, 17576616, 7623567, 31142270, -6995965, -19968914, 1859184, -5650030, 2344515, --13209709, -11523397, -21316996, 2688113, -22667764, -4584878, -3490198, -19945828, 13381507, 16850768, --9747428, -1085016, -29248728, 33687040, 40939092, 6535867, -16063178, 5569499, 36034776, -16893180, --7599408, -19265612, -11152419, -21146272, 8745627, -1025960, -11857331, 9217000, -11877732, 4958540, --7367480, -3425773, 4953171, 2556579, -28454, -7930120, -1516124, 6931541, 4110821, -13216151, -10495289, -9211631, 4871567, 6024229, -4094715, -7781944, 4239670, -6297496, 5208722, 3696356, --8147553, 2991445, -1050656, 3151969, -4830228, -13332652, 3693135, 2309082, -5408975, 3426310, --4839892, 9459665, -88047, 3851512, 1150514, 12298102, 1694365, -16558173, 9373229, 6108517, -2873870, -31477278, 57612156, 21807160, -4732517, -17359184, -4849555, -18436684, 19824496, 49993956, -1082332, -33157684, -15183246, 18039936, 6702834, -6594386, 23820426, -4601521, 2988224, 13667123, --1440425, -13746580, -4483946, 11257646, -14413910, -13096966, -5323075, 4686883, 711354, -2492155, --6052683, 10608032, 1101659, 15699179, 12392591, -16169478, 7947837, 19295140, 10794327, -14943265, -5776731, 3209414, 13012677, 336081, 4537096, 3511673, 5367099, 27202176, 25743498, 15955804, -34891776, -17187386, 17987324, -20707648, 13220983, -228707, 12082817, 15152108, 4886062, 3941169, -18397492, 8551817, -4896263, 11678016, 71941, 15663746, -16608639, -9497783, 1450625, 37759740, --26046830, 2519535, -32753420, -3892851, 3810173, 12905303, -15931644, -3151969, -16419123, 4250407, -20267414, -12424804, -29283624, -6246493, -2870649, -7959112, 7123740, 5091147, -8279087, 2923262, --7080791, -6940131, 6582575, -1060857, -3941706, -13243532, 7197292, -576063, -8368744, -6726456, -6269042, 17814988, 1743757, -5129802, -2357400, 6478958, 16019154, 3178813, 1402844, 13323525, --377957, 3613678, -1231582, -2642479, -602369, 4820027, 7589207, 4535486, -2134062, -2850785, -6762963, 4793184, -10033580, 9525164, 2592013, 18525268, -4606890, 4690641, 11173894, -7674570, --4686346, 6270653, -10528575, 48233020, 3953518, 3496104, -10618770, -6762426, 7975755, 7368554, -4398047, 18611168, 7754564, -7845832, 9827959, 19858318, -832150, 21771190, -2155537, 10574209, --22204980, 40162776, -6026376, -4704063, 6685117, -30396020, -7873212, -14632417, 21369072, 11771968, -12073690, -14198088, 5115843, 5128728, -18963892, 5246840, 16124381, 13764296, 4675609, -4677220, -1879048, -9102646, 30465276, 4620311, 13735305, 11253351, 16406775, -27169964, -2236604, -8182450, -4999879, -10080288, -11982422, 22514756, -21532282, 16502875, -13694503, 17372606, -3991635, -18184354, --1810866, -27328876, 16844862, 15691126, 18903762, -56528748, 16218333, 10217727, -17470316, -11629698, --16250009, 29136522, -41735272, 25012816, 58469536, 1130113, -28052042, -11192685, 16899622, 34391412, -9402757, -11716671, -25287694, -42323680, -3500935, -216896, 16736951, -12645994, -5797132, -9681930, -28951838, 1901597, -915902, -8278013, 5975374, 1713692, -89121, 1196685, -373662, 5501853, -18453864, 22672596, 11884711, -3308199, -1869385, 9062918, 2237678, -5502927, 2642479, -8898098, --5453535, -10854456, -15947750, -33374044, -13254269, 5258114, 1626182, 18946174, -13401909, -9406515, -24139326, 9099425, -6262063, -9815611, 7864085, -2285996, -9200894, 24041080, 2816962, -960462, --7470559, 882616, -9490267, -12644921, 7949448, -27215060, 3782256, -16236587, 24575266, 2248416, -6480569, -13654238, 10722386, -3469797, -10337449, 5177583, -10627360, -5588290, -9061307, -21664888, --13099113, 16757352, 13184476, 10899553, 11181410, -26302916, -8094403, 5761699, -8234526, 16186658, -10759967, 1423782, 9143449, 27135604, -8334384, -26908506, 51730732, -22305912, -29455960, 32679332, --15944529, -8760660, 6866042, 16977468, -19724638, -5664525, 1662152, -12324946, 67472864, -162135, --11395622, -3851512, 300111, 17307644, -33502892, -24810952, -14467597, -12840342, -1442035, -28156732, --343597, -2076617, 10231149, 43402256, 43061880, -16310675, 33223720, -32380296, -29569240, 18216566, -26844620, -8764418, 7233799, 3996467, 18318572, 23594940, -228707, 2083596, 30043296, -26508002, --54018876, -5398237, -21676700, 12555263, 25074020, -1897839, -17231946, 35112432, 9992778, 7572564, --9558450, -27692338, -16120623, 3703336, -12505871, 16914654, -1694902, -9519258, -1689533, -10849624, --12067784, 16826608, -5416491, 7212861, -12068858, 17891224, -1715303, -311922, 10808285, 17202418, --2026688, -2694018, -11503533, 2209224, -9919227, -8081518, -7047505, -2089502, -17146046, 785442, --7911330, -2083059, -17190606, 5753109, 19400904, 8291435, -12178917, -23974508, -2040110, -1359357, -13173202, -32568200, -7057705, 8757438, -7013682, 16499117, -438087, 10397579, 2518462, -19599010, -21180632, 201863, 12978317, -13397077, -20365662, 18910742, -20161114, 6187438, -4580046, 17765058, -179315, 3833795, -10668699, 3317325, -7508677, -26492432, -20716774, 8726300, -1513976, -833224, -4443681, 19500762, -8678518, -6172405, -16376710, 6948184, 6207839, -2220498, -3101503, -44423384, -2193118, 12230993, -15643345, 10795400, -24330452, -4833449, 1805497, 15094126, 19573240, 2093797, --9054328, 5899138, 35108672, 30196842, 30501248, -1659468, -2576981, 6176700, 3840238, -14233522, -9218610, 37997040, -27110908, -9225053, -7712151, -267362, 1656784, 4615479, -20109036, -31341450, --11434277, -2232309, 62594852, 31322660, 21386252, -3323768, -5261335, -16312823, 27333708, 3519726, -17565342, -6843494, -8227010, -13025025, -10945724, -46555300, -20242718, -24780350, 19317690, -2243584, --8813273, -1910724, -18751828, -9317932, 20226074, 29706678, -4539781, 26137560, 14502494, 10679973, -1774358, 12138651, 16085189, 12934294, -3240553, -1316408, 344671, 17661442, -14231911, -18988588, --8830990, 9468792, -1606855, -13502840, -8361765, -13526999, 7807714, -3437048, 16611323, 32425930, -6277095, 19810536, 26475252, 12366285, 16454557, 7762080, 5277978, 6805376, -12002286, 16895864, --14248017, -10087268, 3891240, 1001801, -10158135, 4771709, 9457518, 16968878, 7171522, -20476794, -11037529, 7961259, 2189897, 8829379, -5383205, -42719892, 24018530, 20854750, -1084479, 34332356, -15537044, -23579908, -23095650, 9953587, -9451076, -21053392, 1416266, 1958505, 9441412, -5336497, -12301860, -3168612, 11650636, 14671071, -13604846, -55350856, 29714732, -8471823, -17242684, 12446815, -19648938, 559420, -37033892, -4993437, -1440962, -38301444, -23766202, 19975892, -5749888, -15640660, --13062069, 8505646, -37092412, -26496726, 50256488, -4404489, -29055990, 11282879, 27336930, 11565273, --41184440, 58851252, 23922968, -36483600, 20282984, 26536456, 4333622, -24750286, 25638808, 28427852, -17439714, -22821308, 21521008, 39871256, 2231773, 40279276, 50058380, -26874684, -15874736, -18751828, -47301548, 29959008, -20441896, 11402064, -12333535, -30172146, 25936770, 58773408, 8567923, -17822504, --14730127, 35265976, -3246459, -39717712, -28292560, 7096360, -1413044, 32693828, -5793911, 25233470, --49174156, -7647726, 2022393, 8358007, -10197326, 10356777, -413927, 922344, 5694590, 1312649, --12818330, 3823058, -6078453, 7863548, 3156801, -17997524, 15712064, 5037997, -14893336, -10726681, -2876018, -13006772, 2565169, 11774116, 13041668, 1791001, -12210592, -4032438, 4038880, -16822314, -9803800, 12361453, 4044786, 983011, 12412992, 4494684, -5578626, 6005975, -4500589, 992674, --8577587, 5363878, 19854560, 34739844, 55672976, 22512072, -23155780, -8467528, -19429896, 11911555, --9473624, 15336791, 10051297, -25540560, 12978854, -26025354, -8817568, 256087, -9627169, 1516660, -13573170, 10696616, 720481, -20732344, 4658966, 16755204, -6348499, 2543158, -7551090, -24252606, -24583856, -14623827, 17019882, -24975234, -14777909, -3466039, -20574504, -6045704, 20886426, -20310900, -27540940, 1854889, 22461068, 8934069, -11188927, -30059402, 24715926, 15397458, 10295037, 6415608, -25484188, -18805514, -9591736, -10850698, 7971460, 9640054, -2490007, -23710366, -1068373, -3207267, --24013700, -9445707, 3810710, 6589017, 18974628, -2170569, -16862578, 22600654, -4318053, -3810173, -27097486, 12979928, -22188338, 7305203, -13586055, 8732205, -7107634, 10712722, -19154480, 10853919, --6618545, 21368536, 3683471, 8286066, -7169911, 82141, -15532212, 6375342, 1051730, 842350, --364535, 4609037, -6233608, -5679558, -711354, 2682207, -1701881, 4250944, -7877507, -1354525, -6124087, -1296006, -242666, -1099512, 206158, 553514, -12451647, 2561411, 10075993, 402653, --1409823, -2488397, -1176284, -9071508, 722628, -2099702, -1098975, -4595615, -7609609, -1486596, -7577396, -4099010, -2242510, 3772055, 1657857, 6012954, -5660230, -1935957, -794569, -4277251, --6615860, -41258528, -48598092, -26026964, 144189568, 126756296, 76713488, 168197360, -35840964, -126346128, --44422308, -238212304, -124871880, -2457258, -61648888, 85207856, 156161792, 21930640, 91764120, 178922432, -30035244, 62448824, 5979668, -183727968, -153493536, -135514816, -149296816, -90467584, 74131672, 31441844, -74226160, 193390032, 116533200, 30236570, 143471776, 65557844, -87885768, 47815872, -64135672, -168209168, --20748988, -103965592, -191249520, -86223616, -19843286, -100211248, 111897320, 120471688, 57008712, 191822368, -216646736, 82292112, 107134200, 101164736, -112692960, -73342472, -144118704, -225082592, -207087216, -132682280, --133310416, -38168300, 86586544, 112165216, 149781072, 211168512, 189587904, 110932024, 80908056, 14693620, --87850336, -127601328, -93598608, -121483688, -150190704, -50711216, -56702696, -27418534, 93711888, 65073588, -69247760, 145929024, 37215892, -6254010, 24070070, -40108016, -63005024, -34879968, -63667520, -18914500, -40859636, 15763067, 22525492, 51873540, -12111271, 11030013, 28192166, -47307456, -4731444, 60054916, --56549152, 5197984, 9531069, -112512040, -5695127, -1864016, -134712192, 11098195, 47505560, -16942036, -138870256, 126500208, 23171886, 135353216, 66657892, -5469641, 22497038, -35960688, -145471072, -151259616, --187569280, -213129696, -107540616, -16962436, 43333000, 134529120, 222994704, 256076688, 203566960, 151034672, -69009920, -27580670, -84715544, -186134224, -233558176, -171529712, -137841072, -130813968, 8683887, 65208340, -79403208, 130254544, 116043576, 76997488, 75474384, 54920284, 17861696, 22657564, 560493, -39524436, --45617384, -57357676, -73910480, -64209224, -43142408, -24988120, -2066953, 14066018, 8092256, 5173288, -249645, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --527744, -6460705, -673773, 1967632, -1189706, 8621073, -3393561, -827855, -316754, 1074279, -1533303, -3951907, -694174, -2653753, -484258, 5400385, 387621, -2724083, 2516851, 1869921, 3539053, -1460289, -2718178, -1783485, 6015639, 843961, -1557463, -1187559, -1242856, 1189706, 1269163, --773094, -7691750, -1918240, 355409, 5303211, 1879048, -653909, -37581, -3054796, 4204773, --4307852, -5748814, 744640, 39728, -1940252, -1336809, -1599875, 803696, 523449, 489089, --2006287, 4989142, 153545, 6692096, -1080721, -3213709, 1470489, -374199, 958315, 1539746, -3389803, 2288681, -868657, -1860258, -1571421, 4334696, -4434017, 154082, 122407, -797253, --3804267, 3333432, -1919850, 423591, 2907156, -2069637, -2751464, -2304787, 2947421, -292058, --925029, -840203, 91805, -573915, -1204738, 1445257, 1495186, 1075889, 676994, 354335, -2044404, 310311, -51540, 410706, -210453, 52076, -484258, -276489, -256087, 1364189, -323733, -949188, 1178969, -2560874, 2239289, 1325534, -2985002, -1663226, -217970, 265751, --140660, -456340, -1503239, 2703682, 540629, -1183800, -1572495, -93952, 5638219, -799401, --2622078, 3586298, -1380832, -3401077, -323196, 2866891, 2172717, -1868848, 530428, -2332704, -1374390, 1307281, -1085016, 2863133, -761283, -5206037, 989453, 2677375, 2537789, 339302, --358630, -3778498, -1242319, -510564, -1622424, 3383361, 4800163, 2207613, -6482717, 2188286, -7691213, 3154654, -345745, -66572, 3558381, -1761474, 1184874, -3246995, -2893197, 2950106, -3382287, 1600949, 927713, 576599, 703838, 1567126, 331786, -320512, -1124745, 787053, --2246268, -446677, -950798, -4666482, -2294050, 956167, 1759326, 1409286, 3176128, 2463164, -2643016, 3744138, -2370285, -1532767, -667331, 1176284, 1406602, 2201171, -448824, -763967, --393526, 1336272, -959925, 1207423, 332323, -531502, -388158, 385473, -203474, 727460, -331249, 99321, -287226, 392990, 397284, -184684, 624918, 129923, 172336, -513785, -128312, -160524, 34360, 767189, 110059, 312996, 310848, 4453344, -311922, 1835562, --2867965, -4285841, -2674154, 2324651, -1945083, -1992328, -2109903, -2831994, 2725694, 378494, -2000381, -887985, 590021, -5818070, -3733937, -2660732, 3729105, 703301, 831076, 2029909, --2056753, -1054951, -462783, 664109, -4403952, -860067, -2971044, -3249143, 187905, -2867965, -1921461, 1799054, 7681549, -1921461, 3906810, -2609730, 1614908, -1794760, 402116, 6706592, -1077500, 2899640, -3182034, 2036351, -2862596, -1371168, -443455, 4256313, -2106682, -1108638, --3797825, -2028835, -4484483, -613643, 4236985, 1001801, 314069, 723165, 3884261, -3841848, --6720550, 1545651, 2113661, -4398047, -324270, 578210, -1089311, 1760400, 5251672, 1088237, --1336809, 110595, -1873143, 338766, 317291, -1509681, -453656, -485868, -2126546, -507880, --1214939, 442382, -463320, -843424, 1736241, -336081, -1713692, 727460, -1221381, 48318, --1321239, -1925219, 1116155, -352187, -140123, 608275, 816044, 245350, 1779727, -848793, --149787, 297427, -641561, -274341, -202400, -887448, -465467, 1465658, 489626, 2088428, -256087, 937914, -828392, 2471754, -6861747, 1145683, -2402497, -5046050, -3655017, 2059437, --1013075, -226023, 5006858, 1671816, -700617, 446677, 4257923, -1995012, 3143379, -1417339, -938987, -4496831, -796180, 3065533, -1028108, 3805878, 4256313, 1412507, 2681670, 5586679, --1304060, -7839389, 1786170, -3481608, 245350, -9604084, 263067, 3099893, -1927367, 3602941, -510564, -3455838, 1248225, -7218767, -4626217, -1750199, -1775969, -5987722, 3043521, 3342022, -197032, 3111704, 239444, 855772, -1944547, 2823404, 2140504, -1106491, 6624987, -1229434, -5473399, 4704063, -268972, -745177, 14496, 1518808, 2236067, 731218, 2502892, 852014, -850404, 7348152, 2798171, -3182571, -1471563, -25233, -1765768, 1106491, -1277753, 7412577, -1234803, 3492882, -2655901, 3020436, -33286, -1437740, 635118, -2372970, -1559073, -390305, --1718524, -1036698, -1040993, 927176, -1612760, -355945, -1136019, -564788, -553514, 2052994, --866510, 1080721, -292058, -1707250, -288300, 1091459, 428960, 212064, 664646, -1022202, -893890, 609885, 523449, 1025423, -576599, 262530, -1691680, -96637, 1296543, 1188632, -281320, 244276, 161598, 976568, -13087302, 42950, -31675, 3358665, 5753646, 2018098, --2888366, -4784057, -756988, 6223945, -1173600, -1185948, -4604205, -106837, -1911261, 4609037, -5485747, -9402757, 6143951, 3919695, -3557307, -762894, -4922570, 31139, -1479616, 117575, -3240016, 6254010, -2339684, 1445793, -1628866, -2139431, 2329483, 4315906, 2917357, -2711198, --4443681, 3103114, 2161442, -1602560, -802085, 543850, -5729487, 2086280, 1743757, -2296734, --3828427, 1483374, -2907156, 5102958, 2253784, -8960376, 4098473, -3837553, -9860171, -2861522, --729071, 1979980, -4038343, -187905, 2186138, -4358855, -4284767, -4486094, -1363115, 1123134, -9376450, 1472637, 1791001, -2016487, -4885526, 6380711, -1925756, -7494181, 381178, -7563975, -582505, -734439, -2745021, -8286066, 2537789, 110595, -1809255, 2023467, 5038534, 2303713, --941135, -860604, -11274, 2738579, 457414, 667867, 1556389, 2666101, -217433, -1256815, --1584306, -1660542, 656593, -136365, -1287953, -1336809, 1229434, 1162326, 2351495, 482647, --37044, -143345, 890669, -420370, -22012, -383863, 1494649, -181999, 807454, -231391, -8153459, 2177012, 1771137, 3555159, 5131949, -1147830, 12534862, -1838246, 8968429, -10593000, -3641596, 6165963, -2240899, 845572, -2981781, -300648, 4827543, 8799314, -2501282, -4395362, --1296006, 4092030, 867047, 8947491, 4231617, -983548, 1279363, -81604, -4201552, 817654, --945967, -1315334, 3906810, 5130876, -8133595, 9364639, -7152731, -3900904, 1583769, -2908767, -4713190, 105764, -2726231, 6610492, 9277129, -6936372, -1261110, -692564, 2864743, -6568616, --10805601, -5051956, -3312494, 3158949, -7497939, -4339528, -884226, 7736847, 4864051, -5422933, -3850438, 2034741, -2956548, -4460324, -716723, -2752537, -3182571, 302795, -2121714, 5779416, --4401805, -935229, 4897874, -3914326, 5294084, 6324340, 851477, -677531, 544924, -7860864, --6972343, -1760400, 4356171, 166430, -3062312, 2865817, 6427419, -4316442, -2012729, 1730872, --593242, -3074660, -28454, 802622, -2970507, 136365, -827318, 1302449, 380105, 2305861, -311385, 1804423, -1176284, -508417, 73551, 186831, -134218, 1612760, 688805, 1884954, -1811403, 154619, 532039, -302258, 1229971, 1874216, -947577, 4778151, 3884261, 5219459, --5042292, -6671158, -3606699, 4531728, 204548, 18763638, -1434519, -466004, -4539244, -8487392, --12473659, -2758980, 4096325, 6591701, -4136591, -7989713, 1012539, 63888, 7976828, -2685428, --3304441, 9869835, -5409512, 635655, -7645042, 4872641, -1556389, 31139, -1723356, -11609297, --7310571, 609349, 6407018, 4297115, 492311, -12029130, 7951058, -4865661, -4991289, -5194763, --6906845, -1084479, 6502044, -5335960, -5901285, 4026532, -1951526, 2309082, 11996917, -5260261, -226023, 590021, 5074504, -3569118, -3295851, -1670742, 7610682, -1731946, -4068945, -718870, -5926518, 7737921, -7722351, -8750459, -3009162, -1302449, -2963528, 1851131, -6174016, -2177012, --5829881, -11558831, -4600447, -2676302, 1499481, -10630581, -2983392, 158377, 7479149, 219580, --6575595, -128849, -313533, -2005750, -3657165, 159988, 1508070, -695248, 1106491, 1054951, --1484448, 2159832, -934692, -2157147, 2304787, 2873333, -1286880, -2757369, -127775, -542240, -440771, 2301029, 817654, 41876, 1580011, -875636, -1428614, -1108638, -1563368, 2246805, --6123550, 5189931, 6342056, -4664335, -5645735, -4775467, 2587718, -483184, 9190693, 16004122, --8981313, 590558, -369367, -1119913, 1496259, 4627828, -13139379, 11800960, -9257265, -4588636, -11888469, -2754685, -5675263, 3932043, 4398047, 259846, -656593, -9176198, 5732708, -1314260, -1996623, -6076305, 7575786, -701153, -12641162, -13512504, 4523138, -2485176, -6966974, 3416647, --569620, 20914880, 3519726, -3834332, -6220187, -12345347, -4365835, 2387465, -2993055, 9626632, --2029372, -14377403, -1380832, 9871982, -4306242, 1286343, 8548059, 5757404, -4833449, -913754, -6925098, 9227737, -4201015, 1796370, 1331440, -4464082, 2014877, -2061584, -604517, 1366873, --2134599, -2611877, -8887898, -9747965, -8215199, 8199093, 4601521, 5337034, 2278480, 51003, -3293166, -7116761, -3908957, -9955734, 4955856, -1269700, -1353452, -2036351, -1461900, -5086852, --2990371, 1024350, -2040646, 289910, 405338, 340376, 1975148, 236223, 2365990, -274341, -1751273, -2328946, 1349694, -3484292, 317828, -1665911, 2915209, 119722, -1803886, -562104, -940598, -1511829, -1655173, -4072703, -4039954, -2275796, 4167192, 252866, 1490891, 2578054, --10722386, 4066797, -11574937, 448287, 4214437, -1872069, -8661875, -4076998, -1765768, 7756711, -6163278, -4619774, -4780299, 8271034, 3452617, -4792110, -5168457, -4034048, -545998, 7997766, --1356136, 725313, -444529, -98784, 10276783, 5092221, 6889128, -483184, -492311, 3544422, --5301601, -8944806, 7321309, 11761768, -7940858, 10111427, -2949569, -1024350, -4515621, 5210869, -340376, -5660767, 3469260, 9562208, 7504382, 3456375, -7157026, -2943663, -14513768, 2416993, -7601019, -4671851, -1138703, -5754183, 1536525, -3424700, 5674726, -3587908, 1915019, 6738267, -3875134, 12693239, 6673843, 4294968, 8153459, -6806450, 12221329, 3775276, 7446400, -2430415, --8356396, -12946642, -2418067, -2167885, -3336653, -3034395, 4869419, -8897562, 13514115, -2303176, --10842645, 6213207, 10115722, 4185446, 1349694, 2112050, 3831648, 1289564, -2176475, 2597382, --1987496, -23085, 4286378, -3221, -98784, 4638565, 725313, 2548526, -321586, -2157684, -771484, 468688, -1779727, 1458141, 1965484, 518080, -1244467, 1130113, 460635, 3598646, -869194, -636729, 2347737, -3054259, 981400, 718333, -3263102, -4873178, -1281511, -1894618, --1168768, -2404645, -1619203, -999117, -324807, 6007586, -12783433, 9402757, 3255585, -1932198, -13877576, 10739029, -17622788, -11799886, 11119670, 19087908, -1762547, 2820720, -1624571, -2404108, --1906966, -787053, 4831838, 2878702, 11536282, 2845953, 11039677, 3124052, 4804995, -1493575, --6236830, 2683818, 865973, -5085242, 8451959, 875636, 3391414, 1980517, -1745367, -7830799, -1023813, -8884677, -2997350, -10283225, -6880001, -4155381, 8650601, 1241782, 4263829, 10592463, --4574677, -878321, 1247688, 3808562, 1149978, 265751, -2968359, 7843147, 17274358, 8315057, --13746043, -9796284, -10172630, 11933567, -1807108, -11045045, 6454262, -6189048, -674847, -1804423, --767189, -848256, 378494, 10462003, 17291002, 6540699, 14892262, 9552544, 4830228, 1941325, -3752191, -4792110, 15850577, 5131949, -8315594, -11133092, 4917738, 3664144, -3051038, 7943542, -14988362, 3459059, -5788542, 9339406, -876173, -6867653, 1424319, 5237176, 850404, -909459, -593779, 2876018, 5052492, 2243584, 2237141, 574452, 3295314, -1398012, -651224, -1945620, --562641, 6914361, -3677029, 2559264, -1089848, 1649268, 162135, -1843615, 1023813, 2451353, -3003256, -1429687, 1225676, -2791192, -85362, 1389422, -5006858, 2123325, -7150047, 1994476, -17193828, 3285650, 6038187, -5516349, 4406100, -8470212, -14982993, 347355, 7969849, 2392297, -6393596, 9030706, 9903658, 591632, -10875931, -9211631, -14397804, -22244172, -419833, -2677912, -9803800, 7313793, -8383776, -4652524, 5735929, 11638825, -14595909, -9394704, -2833068, -7975755, --5469104, -2979634, 4472672, 9038222, 373662, -5487358, -6776922, 9133248, -7327214, -3069828, --251792, 12855374, -936840, 1056025, -20212116, -1522566, 4891968, 10369125, 13438953, 2905009, --13032541, 6135361, 224412, 6106370, 8447127, 1429687, 4226248, 9749039, 16994112, -11324218, --4514011, -995896, 5178120, 18124226, 7590281, 6055367, 10124312, -3487514, -6029061, -10878615, --13746580, -8132521, -572304, 8796630, 20136418, -12583180, -9290551, -1290101, 19745038, -11075647, --6473053, -9892383, -1860795, -8865886, 2797634, 1694902, 4669703, 10513006, 1901060, 6735583, --4407174, -4329864, -5638755, 456877, -2865280, -6553047, -5919002, -2866354, -1586454, -1357210, -6643241, -5000416, -1549410, -1879585, 4741107, 1208496, 3445638, -2251100, -2318209, 4786204, -1553704, 1270237, -4028143, 6166500, -3144453, -157840, -2205466, 1966558, -2285996, 649614, -4022774, 4904853, 8951786, 5057861, 12610561, -14915348, -10645076, -1661079, 21887154, 8849780, -555661, 11842835, -7371775, 17770428, -4169876, -15599321, -3020973, -15501611, 12607876, 7532836, -4950487, 4909148, 297963, -4970888, 6109054, 9084393, 4582193, -3164317, 8145943, 10880763, -9752260, -1212791, -8446590, 14743549, 3481608, -899796, -2461553, 1774358, -9605694, 9568650, --1796907, -2649458, -12246026, -6669548, -7553774, 17200270, 6147172, 187905, 2286533, 8893267, -12786655, 6521371, -16492138, 15035607, -1752347, 8700530, 3727495, 13214004, -3007014, -17277042, -5446019, -780073, 7178501, -3059091, -7042673, 6441914, -2727841, 4376035, 21794812, -2629594, --9989020, 68183, 2896419, -10545755, 17575544, -7783018, -10541997, 15498389, -8970039, 7916699, -1088774, -11188927, -7925826, -11190537, 3585761, 9429064, -5546951, 5479305, 10471130, -5750961, -7407745, -2354179, 12385612, -4330938, 3744675, 4065187, -3315178, 96100, 556198, -5537287, --643708, 5159867, -7757785, -1453846, 5852967, 3017215, 271657, -4729296, 2495913, -1217623, -2046015, -4944044, -4758287, -2645163, 1146756, 1329292, -5743445, -3570192, 5600638, 816044, -2518998, -5856725, 2857227, 631897, -2567317, 1300838, 981400, 2053531, -3032784, 362925, --1404454, -199716, -6242735, 4671314, -14404783, -3122441, 7761006, 1553168, -14087493, 3477313, --4937602, 10128607, 2518462, 5071283, -23530516, 6954626, 447213, 8893804, 15185931, 558346, --1910724, 1018444, -7648263, 15155866, -14636712, 4517232, 9269076, 6081137, 8535711, -4147328, --7053947, -8448738, -15149423, 5749888, 2309619, 8568460, 16090558, -6332930, 13797046, 7252589, --13311177, -7839926, -208306, 1186485, 707059, -389231, 6823630, 11574937, 10957535, 4362076, --27811524, 6603512, 8254391, 7953743, -18331458, 10808285, -9416179, 9339406, 1138166, 4798552, --2506114, 6929930, -2238215, 23349590, 11335492, -10873247, 1306207, -30019138, 4971425, -9066139, --9019968, 8039105, 5978595, -15246597, -29599840, 18388902, 11502996, -28090696, 10851235, -6604049, -10628433, -2655901, 2558190, 4018479, 303869, -19042812, -6976101, -3048890, 5952288, -518617, --4710506, 7523172, -9981504, -4293894, 10421738, -1251983, -875100, 3260954, 2198487, 3724811, -1899986, -5937256, 2349347, -8704825, 5224291, -4019016, 3007014, 1842004, -2165737, -1644436, --1447404, -3344169, 1589138, -5171141, -701690, -4442607, -2937221, -7081864, 3510599, -2389613, --1701881, -4247723, 1855426, 2935610, 2297271, 1402844, 746787, 576599, 2627446, -581431, -2847027, 1879585, 6504728, -3843996, -3449396, -6016176, 10919954, -8339753, 92342, 1622424, -28033788, -3811247, 20246476, 4985920, 15248745, 969052, 4363687, 4951561, 27030376, 27078158, --13978508, -12780212, 15475304, -19614042, 24159, 5306432, -19547470, 11137924, 1584306, -1560147, --3543348, -5959804, 2371359, 2110440, 3680787, -12015171, 113280, -2930778, -15786689, 8064875, -11023034, -17653390, -13128104, -6453725, 9536438, 9248675, 8868034, -951335, -3564286, 8304320, -28147606, 15166066, -5521718, -3663607, -3817689, 18992346, -15170361, 7017440, 4042101, -23685134, --9800578, -1064615, 3240553, -20074678, 13843753, 9006010, 4045322, 3823595, 9605157, -19010598, --2289218, -15768972, 714038, 9791452, 16480326, 10140955, -10407243, -5537824, -817118, 555125, --11959336, 26775900, -2119566, 3567507, -6306623, 9188009, -2032593, 5375689, -2421288, 3344169, -2522220, 5831492, -679142, 105764, -2182917, 1389422, -415001, -1499481, 7894687, -2348273, --5829345, -327491, -657130, 4049081, -5943161, 1365263, -4931160, -7715909, 4760971, -1422708, --5289252, 442382, -115427, 930934, -4660040, 6186901, 1586454, 7594576, -9385040, -631360, -4375498, -2345052, -7627325, -120259, 8175470, 3722126, -2525441, 12914430, 20024748, -1394791, -1302449, -12402792, 1042066, -546535, -8865886, -14810658, -2843268, -6857989, -11098732, -8113730, -12550431, -10638634, 9101573, -3206730, -2540473, 17577154, -12169790, -6789807, 2684892, 7090454, -1030792, -23255100, -14295799, 2660195, -3752728, 3772592, -3260954, -7299297, 14817637, 3175592, --1289027, -6089190, -33454038, 20084340, -6062347, -364535, -2860448, 1278827, 9573482, -5570036, --9139154, -15608985, -1487132, 6892349, -9651865, -12367895, 5083631, 19638202, -3350611, 18263812, -13430363, -13368086, 24570972, 16254841, -16232292, -25052544, -7223062, -10917807, 1324461, -7937637, --1964948, 12001212, -20966420, 10262824, -3422552, -11769821, -13164075, -13129715, -15930034, 3317325, -9533754, -8547522, 13630616, -1773822, -7983271, -16409459, 250719, -1837709, 6328635, 19588272, --7099044, -14838038, -5196374, 434865, 5019743, 13406740, 3509525, -1657321, -11001022, -79994, -395137, 4989679, 2058900, 31139, 3688840, 5495948, -4131759, 6860674, -3966939, 3144990, -7944616, 7181186, 421981, -11214160, -4626217, 1716376, 2753074, -7793218, 12649216, -7668664, -5773510, 6856379, -5212480, 693637, 1376537, -2954938, -10751914, 2296197, 4805532, 869194, -9005473, 6309844, -6150393, -21228950, 38631084, 54366768, -5245229, 6623914, 3491272, 13167833, -26363584, -25164214, 303332, 4359392, 500901, -9075803, 1362042, -11212549, 13235479, 32386200, --6834904, 695248, 1851668, 9810242, 904091, 3802120, 12460237, -24955370, -1854889, 24482388, -25161530, -29403346, -6233608, 4227322, 4145717, 8748848, 22148072, 6226629, 44668196, 7430831, -13790066, 6576132, -7008313, -9270687, -525597, -31345746, -45076220, -15269682, -14622753, -46976204, -7362648, -1124745, -26223996, -12809740, -43936980, -4815195, -6040335, 29944512, -29339996, 18299782, --20045150, -1644436, -13179107, -10420664, 11793980, 26907434, -20734492, -7795366, -1870458, -6152541, --2190433, 11343009, 21594558, 23032298, -16434155, 46338940, 31102006, 4038343, -17568026, -38151120, --8641474, -14208289, -10399726, 2505040, 12259447, -8017094, 4580583, 14377403, 2347737, -4578972, -14632954, 9723806, 5026723, 6402723, 15362561, 15469935, 134755, 1254131, 6222871, 5791764, --2512019, -4625680, -2635499, 2819646, -363998, -1963337, 985695, -3093450, 2158221, 10084046, --415538, 3550864, 12345883, -3234110, -4396973, -4728222, -500901, -6855305, -1354525, 5833640, --3180423, -1880659, 1207423, 31139, 1078574, -981937, 4878546, -3294240, -3367791, 7974144, -5679558, -6235219, -290447, -3340948, -19413790, 35566088, 59204512, -13906030, -3015067, 10546829, -26513370, 8959839, -15373835, 9681930, -13127031, 3459059, 8405788, -3124052, -17709224, 5393942, -18905910, -4646081, -26976690, 21203716, -6160057, 17322676, -6340983, -4198331, -6614787, -10856067, --384400, 19240380, 10764799, 3248069, 15560667, -7283728, -6081137, 5989332, -8214125, 10813117, -6325413, 16499117, 28195924, 24734716, -17672716, -32952600, -11989938, -1982664, 25937844, -9806484, -4680441, 10525354, -10168872, -15130096, -24276766, -24919938, 19801410, 21124260, -16698296, -60122564, -5075041, -4133906, -8157754, 4786741, -5904507, -24052890, -11177116, -5555004, -16683264, -7070590, -25745108, 9825811, 14890115, -5675800, -8269960, -5322002, 14370961, 2518462, 2792803, 12380780, -35682052, -2974802, -5094905, -17827872, -16853452, -24665998, -2534568, 14166413, 9713605, -9986336, -7560753, -4539244, -5747740, -10205379, -9264781, 8705362, -7136088, 8498130, 4081293, 4862440, --5145371, -7590281, 8880382, 5545877, -2018635, 6736656, -8942659, 3979824, -1063541, 5578089, --2832531, -5057324, -2760590, -2432025, 6320581, 3190624, -88584, -6248641, -1311576, 12971338, --8974871, -79457, -8704825, 11154567, -5708012, -2312303, -8012799, 1340567, -3295314, 1341104, -9553618, 9546639, 2186138, 310311, -3328063, -12590697, -1873143, -10380936, 5513665, -14761266, --24550034, -5179194, -4205310, 4697084, -8458938, 18991272, -11318849, -38155952, -20898238, 13452374, --18187040, 21486648, 18901078, -8221105, -3013993, 2951180, -11809549, 251792, 6112812, -1472637, -3273302, 27168352, 22362820, -5796595, -35850092, -26900990, 1899449, 19132468, -14479408, -5970542, --16994648, -21423296, 1873143, -5901822, -25467008, -27406724, -40615360, 16485695, 5462662, 1089848, -23236846, 31534724, -1352915, -23228256, -17906256, -18752364, -10831908, -6519224, 7005629, 12321187, --10949482, -17062294, -21169356, 11339251, 9694815, -20507396, -19832548, -7745974, -3561065, -11906186, -7343857, 50964620, 30379378, 59490128, 19714436, -31396748, 36840620, -1484448, -19051938, 1956895, --17944374, -38801272, -16226923, 9035537, 18436684, -4283693, 16974248, 9968619, 37655588, 41310608, -33793876, 11332808, -9657234, -5903433, -5720897, 7250979, 9458055, -14268418, -5431523, 2417530, -30681098, -4250407, 2529199, -3318936, 11013370, 11246372, 13039521, -644782, 124554, 236223, -2729452, -1194538, 1728188, -11222750, -3732327, -3841848, -10661183, -10877005, -5165235, 3946538, -12893492, -8429410, 1830193, 4565014, 14669998, 20038706, 13587666, 12805445, 14137959, 3141769, --5494337, -11041287, -16031502, -19791210, -15716359, -9215926, -18910204, -19098646, -7524783, -3382824, -35376036, -20088636, 2306934, 10405095, -4464082, -26219702, 26520886, 25340308, -14579803, -20045150, -2738042, 35087736, -18402324, 10011569, 22471268, 6896107, -8469139, -16741783, -11023034, 7803419, --2678449, 5954436, -9838696, 6573985, -21779780, 31876710, -3094524, 7184407, -1519882, -40111236, -12492449, -11077794, 20683488, 12504797, 22100292, -8599598, -38729868, 27837294, 12495670, -13121662, --24119462, 19969450, 10659572, 21234318, 21376590, -18622442, 8567386, 22407918, -32811402, 30090540, -14768245, -911607, 9535901, -16962974, 37616936, -4202089, 24748138, 11162083, 43683040, -3024731, --7686381, 6194954, 17756468, 11842299, 12351789, 44189308, 2568391, 10831371, 25777856, -17022030, -17681306, 2133525, -29388314, 10970420, -9921374, 33247878, -24487220, -29356638, -30617748, 26167626, -42871828, -13657459, 10892037, -50549080, 4794794, 2473901, -1961726, -23653996, 3930969, 10062035, --7853348, -6476811, -6391448, 16061567, 7480760, -10071698, -10937134, -6256157, -2609193, -3130494, -4561792, -17402670, -10492068, 9307194, 3789235, 3338263, 521302, 8025684, -1401770, -883690, --10286984, 13781476, 17095044, -7283191, -26714160, -17977122, -240518, 77846, 5068599, 1398549, --8458401, -13060459, -7248831, 4996658, 7651484, 21429740, 7175817, 1174137, 301721, -15879031, --3330210, 16620987, 9726490, -64912524, 3564823, -7966628, 2028835, 50225884, 41371808, 59481540, -31433256, -15845745, -12112345, -24675124, -32855962, 11545946, 2891050, 8606578, 10457172, -9598715, -14966887, 25347824, 4671314, -6818261, -8591008, -17995912, -11945378, -10886668, 4963372, 8056285, --25805774, -15292231, -3558381, 17288854, -7815767, 11125576, 13854491, -36697812, -36132488, 6827388, -10472204, 8019241, -27275726, -12568148, -24499568, -11886322, -11218455, 23596014, -31053150, -43262132, --16256988, 8545374, 7347616, -33376728, -26781806, -21077016, -15946140, 17986786, 25393458, 1111323, --8634495, -10588168, -5896990, -5663452, -11484743, -37050536, 12168179, 27769648, 25262460, 7827041, -34507376, 46639048, -4078072, -6047314, 35730368, -8701067, -21767432, -49213344, -16762184, 6650757, --26998702, -18113488, 12623446, -4469451, 17508972, 30611306, -18685792, -29019484, -9611600, -12483859, --7213398, -7917772, -7820062, 3205119, 4423280, 3525631, 6214818, -10465225, 9054865, -14434848, --1752347, 8875550, 11951283, -12907450, -17948668, 10196789, -4113505, 596464, -12539157, 14717779, --8693014, -3185792, -3481071, 13613973, -11619497, 14773614, -6627672, -7006166, 9784472, 2513630, -7784628, -6276558, 653372, 2829310, 15963857, -1957968, 3758097, 42610908, 14971719, 3436511, -15572478, -17681306, 1165010, -9041443, -13186623, 7865159, 3127273, -11043435, -18305688, -10556493, --16990890, -13861470, 5599564, -10703059, -5180805, 7970923, -5254893, 1782411, -5849746, 21161304, --16540993, 17342004, 6344741, 1924145, -15996606, -6944425, 12832289, 5149129, -251256, 10182831, --1772211, -4281546, -6524056, -5582921, -4357781, 1868848, -40265, 2098629, -18743238, 9822590, --7811472, -7420093, 6597607, 4437238, 2503966, -3608310, 13231720, 11281805, -16396575, 14650133, --2011655, 9913858, 19902878, -4242891, 10794863, 10157598, -9825811, -7117835, -13111998, 1094143, -2313377, -21188148, 8758512, 3113851, 16479790, -6562710, -37381784, 23375896, 1472100, 585726, -532039, -16621523, -5171678, -4453881, -5539434, -24184960, 13765907, 6795175, 14842870, -10837276, -6559489, -12146168, -10937134, 394063, 9438191, 7470022, 293132, -1497333, -3333968, 716186, --5479842, -1257352, 16005196, -6608344, 3216394, 1608465, 4576825, -9922448, 10668699, -522375, --1979980, 2359011, -1015223, 2298881, 3601330, -9046812, -1187022, 16106, -1633161, -1777580, -4909148, -5839008, 7144678, 10176925, 3932580, -6592775, -287226, -1501091, -5971079, 7374459, --2056753, 3955665, -21979496, -62221192, -92652112, 19484656, 72727216, 3061775, 199157632, 183672128, -126109904, 217009664, 166875584, 22737556, 3547643, -22484154, -159137664, -162250448, -123415888, -212531088, --198250864, -56649008, -66169340, -66847408, 15864535, 40253508, -33210298, -11047730, 63720136, 40621800, --2214056, 47418048, 32847910, 2487860, 39664024, 93978176, 61793840, 21552146, 96267400, 71271760, -5556614, 82744152, 112146968, 26933204, 12138114, 114417392, 31335544, -44549012, 57605712, 88132728, --45041860, 20586852, 123179128, 11701102, 20353314, 148707344, 116867136, 9869835, 92727808, 122989608, --42707544, -25306484, 34996468, -100618736, -168106096, -113456392, -185379376, -275375040, -252932768, -282906816, --360331104, -380201248, -336338880, -355431616, -334764256, -251346320, -200756976, -104570104, -26079042, 59113784, -206190640, 239972704, 260528960, 404256832, 395223968, 265348448, 341647456, 266976784, 106180720, 117365888, -165971488, 81170048, 52882860, 124010200, 88442504, -566936, 42354820, 96364032, 23981486, 6656663, -71806488, 16535087, -74924096, 24137180, 58799712, -17300666, 52645024, 140332144, 55506548, 31452582, -123509840, 67342400, -24438364, 14312442, -32136020, -148364816, -181694304, -180536272, -227627360, -257132176, --212735632, -204527424, -233190960, -210472192, -174064816, -200471360, -183533616, -123744448, -98538896, -94358824, --38999912, 21944062, 26232050, 83369072, 141111680, 148402400, 146712320, 165781440, 153117728, 109302624, -92571040, 82350096, 56575992, 46007688, 56799332, 50285476, 33621004, 34934728, 38308960, 31956704, -31077310, 40149356, 34928820, 23197118, 17160542, 12417287, -5382668, -11112154, -11217381, -10800232, --5050882, -1528472, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ -3755412, -5177583, -3042448, 206695, 171262, -3719979, 4968204, -1986959, -1937567, 1413044, -5119601, --2303176, 5493263, 1240709, -2234994, 3896072, 1211181, 828929, -801011, 1896765, -30065, --6574521, -310848, -2443837, -292058, -149250, -6285685, 91268, -4039954, 213675, 637803, -2801929, 3360275, 1102196, 836445, 610959, 2903398, -1593970, 994285, 179852, 457951, -600759, -868657, 2587181, 3878892, -7452305, 3462818, -1952063, -4476967, -2869038, 5717139, -2861522, -1927367, 3241627, 947040, -2051921, 2016487, 40265, 0, 296890, 393526, --779000, 46708, 420370, -326954, 2454037, -1524177, -3442416, -3330210, -22012, 1124208, --212601, 163209, 1877438, -737124, 3296924, -3481071, -1040456, 2685965, 2895345, -1988033, -3264175, 1151588, -845035, -2199560, -1021129, -937377, -877247, -868657, -433792, -121333, --478889, -915365, 281320, 662499, -1309965, -339302, -420370, 684510, -1138703, -256624, -164283, 2767570, 198642, -2206003, 1379221, -1188095, -1768990, 435402, -3721589, -444529, --2790655, 977105, 1734093, 1672890, 1323924, -2901787, -211527, -2404645, 2567317, -4961224, --2822867, 2502892, -5444945, -615254, -367220, 1385664, 1184874, 2670933, 5633924, 2601140, --712965, -21475, -2029372, -1576253, -9976672, -9179419, -624918, 6787659, -1698123, 5420786, -463320, 1546725, -1698660, -7719667, 3978214, 1216550, -2333241, 1895691, -4101694, -837519, -2304787, 1015760, 7221988, -4969277, 4377109, -2280628, -5710159, -2652142, -1566053, -1570884, -2005750, 1696512, -4605816, -2055142, -2627983, -983011, 4424353, 4728222, 5081483, -3738769, -627065, -2347200, -316754, -1975148, -2520609, -3056406, -3432753, 1884954, 531502, -533113, --1250909, 447213, 1921998, -1968169, -1728724, -885300, 2202781, -770947, -424128, -967978, --1120450, -282394, 480499, -32212, -187905, 364535, 482647, -147103, -214748, 1409286, --1116155, -708670, 541166, -687732, 1090385, -689342, -758599, -155156, -139050, 681289, --359167, -347892, 408559, 85899, -1111323, 357019, 259309, 3708704, -3513820, -4534949, --3939022, 117575, -1560147, -1253594, -3118146, 678068, -3482682, -248571, -1437203, 5337571, --3439195, -3758633, -8400956, -10890963, -2643552, -4852776, -4474282, -1062468, 2248416, -2761664, --6545530, 4059281, -9490267, 2855080, -1600949, -1698123, 6123013, 4330401, 2259690, 855772, --1065152, -968515, -2314987, 1000727, 4152160, -3339874, 3936875, 3655554, 1050656, 551903, -1633161, 2804614, -6175626, -2660732, 5869610, -4543002, 374736, -75699, 3586835, -433255, --1379221, 699006, 6090264, 3397319, 2114198, 1988570, 3390340, -5364414, 4151623, -4373888, -3843996, 2561411, -1151051, -747861, -1841467, -2388002, -3930432, -173409, -1232656, -3099356, --3468723, -1920924, -2020782, -323196, -240518, -921807, 4624069, -1884417, -874563, -3119757, -3203509, 46171, -716723, 711354, -1356136, -2239826, 44023, 1309965, -158914, -191126, --1479079, 454730, -492311, -1295470, 81068, 326418, 724776, -136365, 474057, 434865, -1082332, 408559, -1191853, 82678, 608812, -140660, -1045825, -620086, 1521492, 821949, --827855, -328028, -331249, 2185602, -5772973, -137976, -2709051, -5302137, -2465848, -986769, --3696893, -1248762, -3410741, -1330903, 2685965, 3613678, -5990406, -3408057, 1962263, -1193464, --6544994, 4353486, 7795903, 1634235, -1836635, -3644817, 862215, 3765076, 7052337, -3586298, --1494112, -4521527, -3625489, 3897683, 3912715, -5487895, 3223373, -1754494, -3500935, 5544803, --14496, 3023657, -7596187, 522375, -4871030, 1101122, -6051609, -3801046, -988916, -1414118, -12621835, 4005057, 3272765, 2462090, -9397388, 5253282, 3656091, -2077154, -236223, 4095788, --581968, 4327717, 5011690, 4982699, -2891050, 363462, -1613834, 2651069, -2369211, -2507724, -1650341, -2355790, 1112933, 1557999, 86436, 2933463, 1164473, -5575405, -673773, -712965, -1751810, -6319508, -2030446, -1606318, 4454418, -1359894, -740345, -3417720, -903017, 219043, --321049, -1594507, 46171, -1036698, 1152125, 403190, 10201, 180926, 425202, -821949, --2349884, 1240709, 526134, -1357210, 652835, -744640, 281320, 285078, 843424, -194347, --281857, -595927, 540092, -978179, 918586, -1112397, -56371, -97174, 733366, -740882, --284005, -1073742, -615791, -991601, -7810398, -4358855, 3197603, -3422552, 9165997, 4029753, -8973797, -139586, -4384088, -4676683, -6294812, 9576166, -2345052, 4373351, 4894652, 1009317, -3446711, 3122441, 3048890, 1209570, -6323803, -365072, -2442763, -951872, 4339528, -397821, --386010, 3018288, 1911261, 3126199, -2747169, -9982578, -5950677, -3784940, 7348689, -6644315, --2007360, 4494147, -505196, 831076, -5566815, 9654550, 528818, -3769371, 7631083, -4693863, -11820287, 6100464, -2665564, 1361505, -3365107, -2308545, -10885595, 3852049, -4957466, -777389, --423054, -2389613, 4669167, -1826435, -4750234, -4638565, 1082332, -4238596, -4658429, 2657511, -417149, 3355443, -1816234, -9943386, 3438658, 4315906, 5561446, -5351530, -6011881, 780610, -9859097, 1583232, -5085778, -2336462, -855235, 2699924, 501974, 2875481, -2888903, -1100585, --559420, -3565360, -2908230, 4379256, -717796, 1717987, -367757, -1247151, -2774012, -267362, -124554, 1089848, -504659, 1013612, -705448, -2266132, -891743, -311922, -33286, -408022, -1726040, 99321, 1867774, -620086, -109522, -284005, -1987496, -2684, 1066763, 1044751, -7885023, -7255274, 3623342, 9255118, -6672769, 1830730, -3749507, -7276749, 10769094, 4022774, -10008884, 9215389, 1359894, -7356742, -4494147, 3813931, -468688, 1588601, -7945153, 829466, --14125611, -5944772, -11016054, 6795712, -6253473, -230854, 2042794, -1828046, -2842195, 3340411, -3368865, 9771587, -1347546, -2175401, -7472170, -6401112, 6260989, 1337882, 2170032, 11687680, --3520800, 75699, 6241661, -2799782, 2895882, 2137820, 6247030, 5598490, -3862786, -614717, --7919383, 8252243, -5401995, -7171522, -6871411, 4355634, -2535641, -3783329, 8151848, -2539400, -8449274, -5194226, -3924526, -1084479, 5542119, 7152195, -520228, -7737921, 2816962, -4948876, -10087804, 2079301, 5936719, -8104604, -3551401, 2161979, -2051921, 4872104, 745714, -2764348, -2945274, 6459631, 9148280, 7031399, 132607, -1657857, -83215, 1514513, 168577, -1589138, -1097901, -1339493, -195421, 2594697, 164819, -1286880, 2813204, -899796, -1457068, 721018, -1001801, -58519, -1725503, 637266, -1180579, 243739, -2357400, -2947958, 759672, 1104344, --61203, 2276870, -802622, 1027571, 4663798, -12346420, 4294968, 3688840, 2447595, -9330280, -7118909, 11783243, -11493869, 4388920, -7074885, 4643397, 606127, 4173635, -3420405, -241055, -2692945, -7796440, -3893388, -3351148, 6166500, 6513855, -2151242, 3068754, -1607392, 4817880, -6110128, 2405182, 1833414, -6197638, -2349884, -7743826, -8613557, -5996848, 559420, -2863133, --419833, -3578782, -8577587, -2887292, 1724966, 789200, -539555, 12967580, -10505490, 3878892, --5243082, -1500017, -3275450, -3289408, 5485210, -3274913, 399432, -3969624, -2677912, -4824859, -6587943, -6068789, 5400385, -1403381, 5394479, -483184, 797790, -552977, 5213017, 3034395, --175020, 11246372, 423591, -5623186, 2936684, -5057324, -6243809, -7489886, 7267085, 2586107, -6470905, 6629282, 7740068, 4570382, -959388, -1385664, -1427540, 7476465, -1122597, 8381629, -1760937, -352724, -1304060, 2878165, 4240207, 1120450, 1727114, 592706, -593779, 838592, --1433982, 2256469, 75699, 1935957, -600759, 1837172, -224412, -2922725, 1423245, 2017561, --30602, 1641751, -545461, 95563, -1721745, 1417876, -434329, 695248, 3076807, 3102040, --12988518, -1032403, 1680943, -3008088, -10230612, 11696807, -762357, 426276, 9935870, -2787434, --10240276, 3601867, 6699612, 12686797, -822486, 5355824, 1091459, -11184095, -3290482, -5820218, -5682779, 3230889, 2965675, -4194036, -770947, -483721, 1015760, -3791383, 5291937, 1457068, --4504347, 6544457, 917512, -7353521, -6171331, 1700807, 7928510, 7108708, -9953587, 19442780, --972810, 352187, 5345624, -788127, -2562485, -188979, 12498892, -6273337, 6178311, -1523103, -8650601, 2595771, 7752953, -2962991, -6109591, 4294431, 6628745, -3304441, -7425462, -8077760, --7110319, -3226057, -1439888, 7387881, 178778, 6420439, -776315, -2130841, 6377490, -5577552, --10764262, -2869575, -6874095, -6476274, -11969000, 8921184, 7785165, 3196530, -18559628, 4358855, -3907883, -1392106, -545461, -6476811, 8866960, 4538707, 3510599, 2166811, 8143258, -710280, --583579, 600222, -83752, 1891396, 923418, 36507, 2495913, -1504312, -337692, -1921461, -557272, 645319, 2749853, -1924682, -302258, -756988, 2118493, -982474, 787590, 1253057, -1695438, -1472100, 4068945, -11274, -125091, -1499481, 1588064, -2550674, 898185, 104153, --3725884, -874563, -618475, -7399692, -499827, 576599, 5389647, -7787313, 395137, -1194001, --3250753, -16176457, -1960116, 7652558, 5905580, 7841537, 906238, -8687108, 22981834, 9681930, -15629923, 1647657, -6844568, -2714956, -2221035, -9736691, -615791, -3809099, 4897337, 47782, -505732, -3103651, -4172561, -8227010, 2779918, 838056, 405874, 4283156, -352187, 1834488, --823023, -7141457, -5566278, 4366908, 26307, 10471667, -13195750, 10593537, 6480032, -4625680, --9540196, -14868640, 3153043, 11797738, -6018860, 11421929, -891743, -470836, 2619393, -3304441, --13225815, 1627256, 6257231, 2829847, -5742372, -1462436, -3600793, 2968359, 6419366, -292058, -1642825, -825707, 6181532, -2720325, -2103997, 4261145, -3649112, 9767829, -2592013, -4875862, -3620121, -8751533, -4483946, 124554, 3489124, -3763465, 1643362, -1335735, 1945620, 118648, -2310693, 2054068, -779000, 1250372, -4165582, 2318209, -564251, -5575942, -1954210, -1537598, --3388192, 59056, 985695, -2574296, -1883343, -61740, -3569655, 320512, 915902, -714038, --3778498, 402653, -56371, -2790118, 1176821, 2180770, -2323577, -80531, 679679, 299037, -1101122, 3410204, 2776160, -2789045, -2298344, 2561411, -17788144, 12727599, 11475079, 13552232, --4380867, -12084964, 4214974, 4859756, -18100602, -16432008, 15892990, 1742146, -7815230, 6028524, --11324755, -12836584, 1792612, 33440616, 15489800, 6207839, -9124121, 150861, -3280281, 264141, --3854196, -1858647, -4276177, 1204738, 9479530, 1888712, 11696807, -4649302, -3930969, 2149631, -8161512, -1567663, -1224066, -17485348, -784905, -9847823, -566936, 13558138, 9631464, -3584687, -9413495, 18814104, -8999030, 5434208, 15545634, -11446088, 16433619, -1373316, 6738267, -3906273, -658204, -2226941, 2251100, 3818226, 16303159, -6262599, -2095944, 4248260, -7648263, 4803921, -2491081, -4383551, -7451769, 16094316, -1097364, -8838506, -2952790, 9980430, -4227322, 6774774, --72478, 487479, -10644003, -11559904, -5586142, -9860171, -8936216, -9660455, -610959, -2302103, -4680978, -606664, 831613, -881005, 5898064, 3765613, 410706, -7322919, 258235, -1370632, --5458904, -1556389, -2814814, 2862596, 1082869, -3722663, -1253057, -2854543, -2245194, -262530, -2040110, 1997697, 2087354, 3585224, -2206003, 455803, 2248416, -1558536, -2148021, 2633889, --3708168, -1458678, -1139240, 1661079, 710817, 2667712, 466004, 273804, -1047435, -2679523, -21697638, 3886946, 3074660, -11292006, -6532109, 562641, 2510409, 4384625, 5044439, -21524766, -984084, 1351841, 15555835, 2479807, 3968013, -1484985, 14153528, -23113904, 725313, 11829414, --13748727, 3436511, 2714956, 11139535, 2208150, 1180579, -3766686, 352724, -11800423, 3997541, --2932926, 2088428, 3233574, -2029909, -8944806, 3275986, -7056095, -12317429, 6971806, -6966974, -4594005, -11581379, -7276212, -1230508, -3568044, 2758443, -4896263, 12683575, -122943, 12093554, --12749074, -10802916, -3439195, 171799, -187368, -3760781, 10915659, 8887361, 22739168, -3651796, -14555644, -8517457, -1429687, 4373888, -17209934, 19669340, -497142, 12244952, -453656, -17180942, --10322954, 7226820, -22958210, 11967389, 3336116, 17470316, 22057342, 2862596, -16296180, -12355010, --5059472, 12543452, -1500017, -3040300, 724776, -4600447, 698469, -3367254, -4918812, -1711545, --7931731, -391379, 386010, -3693672, -3294777, -4507568, -3187403, -1546188, 2025077, 3831111, -1447941, -635655, 3521873, -2400887, -1314797, 816581, 1872606, 2237141, -2215666, 2830920, --2893734, -1366337, -4233764, -7431367, 4617627, 797790, -4206384, -4254165, -799938, -5898601, -820876, 62814, 4397510, 11016054, 17063368, 5839545, -7018514, 16094853, -17290464, -1884954, --5290326, 2063195, 13864691, -12594455, 31208842, 4052302, 7753490, -9268003, -12547210, 4265440, -135291, 26402774, -3770981, -9257802, -15111306, -10289131, 7409893, 4652524, 4345970, -1994476, --14874009, -23065048, 1752884, -13937169, 18462990, 2323577, 15000173, -9330816, 6291054, -6062347, -7789460, 21539260, -3556233, -2365990, -3231426, 5567352, 7223062, 3621194, 1619740, 2157684, -9419937, 8364449, -4824322, -7493108, -6640020, -7503308, 24757802, 9691057, -14461692, 11109470, --3259880, -11931419, -8475581, 4298726, 9088151, -16977468, -22028888, 2398739, -9814537, 28923384, -15101642, -5042292, -3253975, 6076842, 13117367, 3282966, -2174327, -3916473, -19966230, -1001264, --4854387, -21787832, 8276402, 13619878, -2172717, 6791417, 3841848, 13893682, -7618735, -2121714, -5063767, -2237678, -6245956, -7174743, -137439, -4356171, -10544682, -2244657, -4828617, 4555350, --2000918, -5913096, 4117263, 1562294, 644782, -3685619, 4109210, 1057099, -6593849, 2257005, -2707440, -3163244, -9177808, -4606890, -1627793, -1053341, -50466, -3541201, -397284, -2640868, -1347546, 1041530, -1746978, 369904, -71404, -2816425, -5657009, -807454, 1297080, 3278134, -1755568, -4373351, -2739116, 1029182, -8122857, -13793287, 7967701, -4635344, 12035035, 5354214, --12809203, -5536213, -6425808, 2692408, -17292612, 11699491, 16588774, -6796786, 10391673, -2587718, --4416300, 7927973, -12076911, 7500624, 13499082, 3604551, 23196582, 11130408, -9545028, 9789304, -4311611, 8593693, 525597, 12340515, 10917270, 16558173, 6393596, -6595459, -7676181, -10386305, --854699, 25728464, 679142, 10832981, -16122770, 33636036, -9875740, -26519276, -12367358, 21203180, -1814087, -3056943, -2789581, -1653562, 15996606, -11748346, 9319005, -2463701, 20109036, 30422864, -15840913, 14617921, -10715943, 17258252, 10623602, 10210748, 11933567, 17256642, -3478387, -30403536, --19306414, -22115860, 5848135, 7742216, 6421513, -5210869, 10388452, 26656178, 2014877, 1976222, -6662031, -1602560, -23333484, -25352656, -8497056, 4915053, 2834142, -1178432, -14295262, 3571265, -859530, 1088774, 7727720, -1774895, 4967667, 1549410, 9506373, -2457795, 6399502, -5049808, -1271847, 879931, 11011222, 4884452, 10992969, 1119913, 5675263, -2042257, 1376537, 4544613, --2844342, -7158100, 1785633, -4308926, -7789460, -6371047, -1572495, -1823214, 10735271, 2110440, -136902, -3315715, 1818919, -45634, -3645354, -4426501, -2997350, 2294050, 6925098, -955630, -796716, 753767, 3204583, 2034741, -6931541, 4402879, 11159399, 13067438, 4746476, 6127845, -10206453, -8047158, 23714126, 9331353, 4596689, -6779606, -18163416, -7350837, 9932112, -1005022, --25746718, 34674344, -12167642, -6815576, 10705206, 507880, -3447785, 2496450, -6720550, -8162586, --1763621, -18893024, 4682051, -20302310, 574452, -16098611, -18094160, -3651259, -3840238, -3990562, --13234405, 5791764, 14190572, 3782793, 10867878, -18846316, 18574122, 33805688, 3511136, -13604309, -21141976, -17355426, -27452894, 45698988, -4682051, 3223373, -3175055, -20467130, 15780784, -18556944, -8029978, 27913530, -551903, 38346540, -29936996, 28880970, 8429947, -19011136, -9944460, 3598646, --18240726, -9117679, 20332376, -19959250, 13242458, -13430363, 7350300, 21210696, -46618648, -20574504, -21475374, -40040368, 14146549, 12382391, 22894324, 20214800, 9117679, -1653562, 13440026, 20050518, --21796960, 21758304, -401043, 7511361, -1143535, 6808597, 1771137, -4170413, 1508607, -6353331, --2071248, 1607928, -1122597, -10996190, 6912750, -1962800, 9002251, 5359583, -7762080, 6107444, -7513509, 5428839, 2265059, 3878356, 2360622, 4949950, -15229417, 8519605, -1988570, -4179540, -10829760, -8714489, -7062000, 3620658, -8993662, -7354058, -8862665, 4904316, -13435731, -40099964, --10435697, 13137231, 30958662, -9863392, 15632607, 424665, 7385197, 16031502, 10386842, 27766964, --7177964, 1169842, 7635915, -24616068, -15817291, -7348689, -7951058, 5645735, 427886, 2069637, --12814572, -2138894, -16967806, -13822279, 6649683, 34289408, 19749334, -9037148, -10968810, 16333224, -19602768, -11685532, 5184563, 15056545, -5956046, 32796370, 11181410, 4802311, -25298968, 15600932, -3227131, 12289512, -2580739, 3158412, -4159676, -5473936, -39898636, 10562398, 27625766, 13618804, -3715147, -793495, 13942538, -22473954, -41447508, 3063922, 55005108, 13210246, 43642236, 41334228, -574989, 3587372, -26277146, -23582054, -2487860, -20233590, 27564026, -60043104, 11368778, -22510460, --47904992, 10624138, 22468048, 47896400, 4329864, 2367601, -30507152, 9948218, 14462229, -21379810, --1959042, 1480153, 22429930, -6036040, -14249628, 33867428, 7215545, -12150999, -394600, -19659676, -2632278, -18611168, -3704409, -678068, -9031779, 2784213, -7285875, -7829189, -4207994, -127238, --3655554, 6231461, 17624936, -1041530, 260919, 6499896, -15846819, -9665824, -1853278, 4760435, -5091147, -13907641, -7776039, 10942503, 6549825, 3769908, 2718178, 11555073, -373662, 134755, -1263794, -7912941, 1489817, -10405632, 29235842, 51306068, 1251983, 14089103, 9154723, -26816166, --7710003, 26946088, 8385387, 11936788, -6811818, 7903277, 4500589, -9418326, 348966, 14031658, -14693083, 18103824, -8029442, -2115808, -39858908, -37226092, 5074504, -22979148, 725850, 20117090, -4772246, 2480881, -6985228, -4362613, 12769475, 31428424, -22832046, -12970264, -3046206, -22025666, --1688459, -21224654, -6705518, -22538378, 19923280, -27332636, -2310693, 5036386, 13211319, 48063368, -63883880, 16662326, -16896938, -34024732, -3091303, -23241678, -9241696, -36193688, 5350993, 35095788, -25736518, 21102784, 2445447, 5191005, 35778152, 34927748, 25508884, -1991254, 16071231, 6069863, -7900056, -41179608, 12370043, 4676146, -9604621, 25001542, 33718716, -4591320, -657130, -16492674, --70618928, -1257352, 20776904, -10139344, 48740900, 34793532, -16208670, 3337190, -18061948, 12254079, -3283503, -6435472, -10844792, -4802311, -1087164, 7693360, 9350144, 14553497, 318364, -8590471, --18896246, 1202054, -8959839, 7289097, -8460012, -11360188, -2944737, -2866891, 8427800, 3677029, --3315715, 4591857, 2379412, 3667902, 750546, -6408091, -10478110, -5150740, 3835406, 8819715, --842350, 7214472, -176094, -10298258, -10921565, 3134789, -13346074, -7348689, -57445, -5709086, --1709934, 3852049, 5348845, -4824859, -12460774, 31922344, 22778896, -15224585, 15429133, 23709830, -2685965, -29725468, -35461936, 33123324, 11289858, 7655243, 26097296, 569083, -11348377, 27988154, -7391102, -21254182, -10766409, -7714298, 9463960, 575526, -12706661, 4902705, -14057965, -1430761, --6334003, -6865505, 19091130, 35537632, -12088185, 7356205, 16775069, -8350490, -7135552, 6851010, -20265266, 6454262, -15520938, -19696720, -23655606, 12681965, 13368623, 32251984, -15267535, -14518600, -11359652, 19204410, 30114164, -882079, -55706264, -11959873, 17999672, 17893908, 8096550, -10917270, --386010, -22321482, 3380139, -9667435, 23199266, 33174864, -10011569, 694711, -19423452, -21111912, --8109435, -42719356, -8563628, -21737904, 18951544, -17405354, 19658066, 24317568, -49372260, -4161287, --20877300, 21122112, -8684424, 7423851, -15343771, 2469606, -13067975, 14536854, 16253230, 27989228, -27075474, 13365401, 26050050, 12041478, 1563905, 13729937, 8871255, -3927748, 11603391, -12917651, -6219650, -6627672, 5385889, -16273094, 9629854, 35433, 7627862, -11997454, -6787659, 7708930, --3119757, -4056060, 13975824, -11054709, -2528662, 11264089, 5590437, -7658464, -2405182, 4555350, -25790204, 13793287, 11241003, 15139760, 1028645, 16462610, 5565204, 4987531, 8638253, -65498, -13865765, 3767223, -23866596, -11230803, -6379637, -11727408, -16201690, -26793616, -6073621, -14905684, --27178554, -41064720, 20088098, 21264384, 12539694, -27438936, -37344740, -28675886, -16259136, 6732898, --1219234, -36371932, -21703544, -24924232, 35325568, 10997264, 15406048, -11102490, -20062866, 44762148, -11103027, 13969381, -8525510, 2662343, 13270912, -9141301, 10560251, -3283503, 21398600, 30171608, -1388348, -24319716, -19468550, 23906324, 16443819, 20944944, 6128919, 5270462, -10697690, -4705674, -3556770, 14646912, 31692564, -239444, -58819576, -54595476, 910533, -13316546, 35492536, 36011152, --39887900, -27003534, -16684874, 49859200, 44536664, -24002424, 7254200, -31443456, -30176978, 18546206, --13781476, 251256, -4470524, -21792664, 15809238, 16101296, 12960601, 50525460, -36764384, -9868224, --3204046, 13019656, 4336307, 20846698, -73593192, -42818140, 15701327, 23270132, 23138600, 6601365, --24103894, -24806658, 718870, 14849313, 42973832, 10496900, -13895830, 4499515, -27314918, 17274358, -15255187, 1000727, 24236500, 51366200, 12643310, -37459632, -19364396, -2522757, 4685273, 24887724, -21879100, 10344966, -10943577, -4458713, -7410429, -8723615, 22683870, -2455111, 2460480, -8698919, -22028888, -9836012, -3727495, -367757, 19194746, 8426189, 7126962, -3750043, -23118736, -8212515, -8144332, 19062676, 3740380, -25916906, -35806604, -29993368, -206158, 4699768, 6138582, 3969087, -49425948, -32813014, 30838402, 30768072, 19640886, -71599256, -28770912, 24052354, -19480898, 13940927, --5122822, -29703994, 19053012, 5794985, 5676336, -13095892, -47438452, -4435628, -1449552, 242666, --6773701, -34497716, 25834766, -21293374, 44123808, -4594542, -3859028, 21559126, 16003585, -21032992, --1957968, -15905338, 23576150, 37204080, 28266790, -31259846, 7022809, -20896626, 18900540, -18141942, --7475928, 3165928, -1595580, 20252918, -18543522, -43428024, 11187316, -15488726, 16243566, 17032230, --55048060, -9271224, -10499584, 2080375, 60956860, -16363825, -44362180, -11716134, 38743288, 18673980, --24024974, -7812009, 24034100, -27380, 29672318, -44557064, -23574002, 26931592, -28016608, -67973224, --20074678, -9201431, 77653544, -21111912, -40119828, 21420612, -46283640, 122176784, 11562589, -113368880, --30205968, -19958176, 80524192, 43666932, -50622096, -26645978, -657667, 59585692, 47456168, -7325604, --37314140, 14698452, -12623983, 53746684, -5196374, -26884884, -22321482, 35233764, -28139552, 18292802, --53884124, -171262, -2064269, -3068217, -3163780, 11397233, -29831232, 28958280, 2397129, 21258478, -855772, -33960844, -26140244, 19452980, 22935126, 36099200, 13449690, -3606699, -23523536, 3204583, -5853504, -6144488, 1542430, 23682986, 3676492, -1054415, -26909580, 5241471, 19115288, 7125888, -788127, -7808788, -19353122, -65553012, 18389976, -1058173, 22408454, 54184232, 17386028, 7450158, --30533996, -12688944, -30515206, -36579164, -12230993, 7173133, 20915954, 27640262, -3083787, 16069083, -19501300, -16987670, -34390876, 18209588, 6564321, -27980102, -9489730, 26543434, -9025874, -2994666, -24320252, 13603772, 10818486, 3361886, 13830868, -13249974, -31948114, -13922673, 9118752, -13120588, --7542500, 11682311, 795643, -22538378, 23476828, 5040681, -20839718, 2646237, -5022965, 20169166, -11251204, -8176544, 9495099, -12475269, -28009092, 3728569, 6826851, -2573222, 74088, 5901822, --12232067, 3843996, -10473278, 6265821, 19996294, -2145873, 8744017, 9217537, -7723425, 474594, --19071802, 6503118, 11258183, -34692060, 20131586, -21646636, 6823630, 979253, -96100, 9528385, -3872987, 22602802, 4132832, 6373195, -3266860, 11551315, -12162811, -8035347, 2805688, 1912871, --10642929, 3807489, -948651, -3124589, -6147172, 2166811, -1211718, 12216498, -3136937, 1430224, -8770860, -6188511, 6094022, -3826279, 2138894, -6194417, -5371394, -6187438, -1617055, -2804614, -4632122, 3265249, -14354318, -3966939, -4194036, 9951976, -5923834, 3692598, 1716913, -16037408, -5320391, 10331007, 681289, -3947075, 1730335, -4752918, -2369211, 53062712, -1931662, -1765768, --14733885, -14492293, 10923176, -644245, 9456444, 162672, -5185636, -7016903, 3596498, -9820980, -9954660, -9249749, 14504105, -11741904, 8451959, -9940702, -2211908, -1613297, -9245454, -7082401, -2091112, -4188130, -2919504, -85899, -6951942, 904628, -1380832, 2201171, -1634772, 4039417, --13937706, 12680354, -4771709, -4175782, 9622337, -7738458, 515396, -9660992, -8449274, 6135361, -5418101, -6792491, -4381404, 2717641, -438624, -11811160, 3019362, 2063195, -11274, 7736310, --2876018, -3339874, -3184182, -8067559, -2194728, 8443369, -8993662, 2307471, -4362613, -1114544, -572304, -2741800, 1978906, 42950, 5905043, -8595840, -746251, 5540508, -11094437, 6456410, --4999879, 69256, 5063767, -2463164, -5057861, 2282775, -900333, -1453846, -379031, -3613678, --95026, 3743064, -249645, -1765232, 650688, -3131568, 2158221, 1576253, 916976, -2529199, --761820, 3243237, -4155381, 4138738, -1902671, 1798518, 4600984, -5548561, 1319092, 370441, --7000797, 1269700, -2234457, 2878702, -998043, 207769, 4233227, -2798708, 808528, -4506495, -768262, 646393, -1130113, -1090385, -547071, -1627256, 311922, -824634, 178241, 3115999, --4567698, 1991791, -24917790, -42071352, 15599858, 134742784, 33703684, 74294344, -2939905, -72384696, --23528368, -71231496, -60878476, -21531208, -14697915, -4994510, 40325448, 54178864, 71619120, 90486368, -39031588, -23211078, -41968272, -88926224, -84546968, -34493956, -28285044, -18869938, 36458368, 49733036, -29701310, 46104328, 55294484, 18677740, 15121506, 10293426, -28742994, -13253195, -20601348, -44813688, --24767466, -33312304, -49348100, -26882200, 6044630, 5217849, 27468464, 66728224, 45624364, 37962680, -36983428, 11339251, 2673617, -3862786, -19291920, -27497992, -34785476, -49700824, -43947716, -24603720, --7763691, -16833588, 13779329, 25659746, 21796960, 37652904, 41984916, 26928908, 24391120, 23833848, --3791383, -11799886, -5958731, -34308736, -28424094, -7332046, -28135258, -30109332, -19083076, -27092654, --13190918, 7634841, 17203492, 31152472, 50001472, 30964030, 28713466, 31755914, 11715597, -3879966, --5873368, -17193828, -28355374, -29469918, -28071906, -30815854, -21428666, -19755238, -16398722, -6837051, -7608535, 18880140, 29344290, 44281648, 46665892, 45452028, 38643968, 12141873, -10161893, -20864952, --33481418, -44344464, -50033684, -50003084, -39577588, -22399866, -5398774, 13573170, 40905804, 45449880, -45578192, 47685412, 39457864, 20635170, 6519224, -11373610, -31998044, -44806172, -39498128, -37031208, --29146722, -13701483, 1115081, 10712185, 21919366, 24741696, 24450176, 19325742, 8734353, 3875134, -1481764, -3832185, -4310537, -4444218, -5719286, -7172059, -5539971, -7909719, -5350993, -4576825, --3178276, -4049617, -1530619, -928787, 1657321, 1683090, 3795141, 3054259, 2889976, 344671, -848793, -466541, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ -3117610, -3112241, -2801929, -496069, 4461398, 1465121, -2306934, 481036, -2548526, -2270427, -1824287, --3999152, -1387811, 2437931, -195421, 1350230, -672699, -1133871, -1107028, -485868, 3362423, --2123861, 211527, -151934, 148713, 2667712, -85899, 1835025, 5850819, 4560719, 4588636, -2376728, 1043140, -740345, -5404680, 2219961, -2015413, 3468186, 1233193, -1835562, 1635309, --2414309, -4684199, -1444720, -1808718, -4438849, 192200, -545461, -631360, -2079301, 286152, -4632659, 2057826, 3148748, -45634, 1936493, -1807108, -130460, 2426657, -2001455, 1626719, --2481417, -2637110, 268972, 5457830, 3593277, 2098092, -1060857, 915902, 585189, 319975, --984084, -2090039, -3202435, -2318209, 73014, -1984275, -993748, -2136746, 709743, 330712, -1108102, -627065, 911607, 1292785, 1059783, 142808, 665720, -487479, -533650, -12885, --1333051, 1409286, 1153736, -130460, 1457605, 433792, 293668, -653909, -414464, -836982, -280247, 475668, -15032, -260919, 503585, -318364, -1236951, -345745, -827855, -45634, -242666, 309775, -1295470, 236223, 1999844, 1028108, -3454764, 8158827, -177167, 491774, --865436, -4310537, 3183645, -2250026, -2155537, -5023501, -3871913, -1630477, 3114388, 4479651, --911070, 2647847, -1035624, 4859219, 5042829, -10080288, 1840394, 42950, -992137, 3403762, -5356898, -1660542, -787590, 102542, -336081, -2566780, 2101313, -2587718, -2046552, -215822, -2679523, -1527398, -5674726, -2526515, -3860639, 443455, 333934, -5039071, -606664, -2203855, -1034013, -158377, -769873, 1227824, -1687922, 1698123, -2708514, 2636573, 3860639, 5937793, -2457258, -2608119, 2118493, 2485712, -948114, -6742025, 425739, 3496104, -2719251, 2011655, --3918621, -54224, -2506650, -6849936, -2099702, -3587372, 1717450, 2531346, -2324651, 1079111, --1102733, 3216931, 235686, 1879585, 2686502, -1164473, 1097364, 536334, 1122060, 2316598, --566399, 775778, 2889439, 1642825, 369367, 1725503, 287226, 739271, -147640, -51540, --1607928, 830539, 971736, 1307281, 872952, 284005, 395674, 28991, 471373, -221728, --474594, -137976, 1038308, 887448, 243203, 793495, 156229, 919660, 766652, 6669548, -1837172, -9086540, 3231426, 4647155, 1708860, -798327, 2374043, -5713917, 811212, 2516851, --1272384, 2433099, -384936, 2966749, 722628, -3862249, 2422362, 3506304, 3479461, -1024350, -1663226, 1888175, 1321239, -10289131, 1443646, -4387309, -1294396, -1468342, 2399813, 1097901, --8386461, -3034931, -1879585, -1606855, 3409130, -3138011, -5869610, 1432909, 2718714, 1679869, --5840619, -2761127, 1868848, -5527623, -447213, -6106370, 892279, 2971044, -3124589, -966368, -3482145, 4422206, -10355166, -782221, -2878702, 3118683, 1280974, 499290, 892279, -2932389, -2633352, 2262911, -8042863, 6157910, -831613, 1501628, -4105989, -1734093, -3473555, -451508, -899796, -3238405, -4472135, 3946538, -1444720, 1614371, -226560, -828392, 1145146, 1326071, --1635309, -4154307, 2296734, 2064806, 525597, 945967, -135291, 289910, 684510, -55298, -681826, 456877, -98784, 1566053, 220654, 1193464, 1441498, 57982, 2034741, -80531, -392453, 524523, 907849, 708670, 1008780, -1553168, 686121, -720481, 300648, 650688, -488016, 1173600, -421444, -389768, -4362076, -4093104, -3404299, -2157147, 6780680, -2368675, -921271, -5509370, 5839545, 392453, -3964792, -1041530, 3381213, -7055021, 2390686, -2080912, -1585917, 1140851, -3235184, -2291365, -8397735, -2257542, -9457518, 1225676, 2126009, -1012539, --1290101, -862215, 1422708, -3697967, -6743099, -3129958, -2483565, -1038845, 2469606, -1551020, -4007205, 1783485, 3069828, -4175245, -240518, -205622, -3498251, 971200, 2747169, -272194, --1747515, -4093104, -3792456, 2551211, 3808562, -122943, 7546795, 5990943, -5415954, -1376537, -8053, -5708549, -6538014, 9872519, -167504, 271657, 3089692, -6273337, -2070711, -4064113, -9742060, 2634426, 499290, -7762617, -6171331, 828929, -2547453, 5037997, -2592013, -55298, -1374390, -3046743, 1098438, 3040837, -4574677, 50466, -7290707, 795106, 2734821, -2103997, -1057099, 875100, 3564823, -512175, 566936, -705448, -144955, 1546188, 1582159, 1484448, --1106491, 474594, -77846, 666257, 42950, 652835, -1069984, 2298881, 13959, 659278, -341987, 725850, 534187, 664109, -619012, -596464, -525060, 506806, 1537061, 1817308, -317291, 824097, -1504312, -11388643, 5701569, 3231426, 5813775, -3117073, 3187940, 3334505, -5974837, 1418413, -11367168, 2843805, 493384, 4523675, 8256538, 438087, 3587908, 3144453, --6805913, 2396055, 634045, 947040, -1847373, -942208, 4228932, 2804614, 175020, -4161823, --47245, -1983738, -2153389, 6816113, 3150359, -281857, -909459, -8228084, -7058779, -8083129, -2154463, 2189897, -8380018, 599148, 570157, -8302709, 524523, 1286880, -1108638, 9551470, --1175210, -4688494, -1178969, 5486821, -452045, -8501888, 9243843, 4792110, -5879274, 4501663, -897111, 867583, -151934, 521839, -2283312, -4268124, -4041564, 7391102, -490163, -2154463, --343061, 5316633, -4922033, -8691940, 311922, 1983201, 1631014, -7597261, -3935801, 2929168, --683437, 4251481, 1619740, -1347009, -1270237, -1158567, -603980, 150324, 6752763, 3937411, -2441689, 2163053, 2610266, 3934190, -1878511, -625992, -2129767, -646929, 748398, 195958, --1178969, -1900523, 1984812, 304406, 894964, -31139, -1214402, 435402, 1048509, -2401424, --408559, 1924145, 415538, 114354, -883153, -264141, -574452, -1042603, 257161, 975494, -777926, -703301, 793495, 68719, 3410204, 13167296, 3894462, 10564009, -11620571, 463320, --5748277, 202400, 3829500, 4457639, -5981816, 2621004, -3474629, -3038689, -4165045, -6720550, --1010928, -15852187, -173409, 5257040, -722091, -1064078, 1722819, -8309688, 2908230, -7924215, --2528662, 8192650, 1634772, 2837900, 172336, 2421825, 6951942, 6324340, 12128451, 6326487, --9210020, -751082, 10214506, -1418413, -7511898, -1124208, 928787, -3408057, 6837588, 5097590, --5912560, -1706176, 6556805, 7015829, -2513093, -4434554, 11077794, -4558034, -14979235, -10093710, -3277597, -15032922, -318901, -4489315, 55298, -1381369, -4224637, 5652714, 1593970, -1456531, --4936528, 4320200, -2964601, 7995619, 5434744, -2164127, -5307506, 1152662, 2069637, 759136, -282394, 1903207, -1118302, -5849746, -1715839, 8185134, -961536, -3304977, -899259, -1698660, --4237522, -4083977, -2289755, -1953136, 469762, -20401, 4076998, -339302, -1490354, 592169, -1449015, -965294, 840203, -1389959, 2767570, -71404, 1694365, 273267, -2690260, -253403, --304406, -2793339, -772557, -1692754, 1267015, 101469, -446677, 984084, 420370, -263604, -488553, -3126199, 670552, 915365, -12826920, 6088653, -1129040, 3261491, 4254165, 6956774, -1559073, -6072010, 8287140, -3058017, 3690451, -3678103, 3075734, -534187, -15067819, -3092377, --2575370, -1743757, 1035087, -3588982, -2485176, 2045478, 3310883, 1172526, 8144869, 3788161, --7866233, -547608, 20938, -4399121, 9370008, -5567888, -5410585, 9895605, 10391137, -1256278, --117575, -6430103, 2336462, 1442035, -3367791, 1760937, 6437619, 4010426, 7740605, -1887101, --6070937, 3816615, 907312, 1896228, -7237020, -3714073, -4250407, 1744831, 4148402, 1555315, -1112933, 7471633, 8913131, 1367947, -4231080, 5109401, 4157528, -6242735, 880468, 1127429, --715112, 771484, -140123, 5357435, -578210, -4117263, 2121714, 7050189, 3120294, 4154844, -8691940, -5887327, 1061394, -1978906, 8248485, 4759898, 8834211, -4214974, -1127429, 1505386, --3135863, 496069, 872415, -965294, 10737, 2083059, 2366527, -849867, 1294933, 954020, -3068217, 2739652, -359167, -192200, -1374390, 428423, -1384053, 768262, -2440078, 2459406, --35433, -901406, -31675, -167504, 102542, -824634, -1897839, 2733210, -330712, 484794, --3004867, -2432562, -658741, 2627983, -267362, -237297, 260919, -259309, 5373004, -11148124, --6640557, 4408247, -2584497, -10414222, 5309654, -5457830, -4728222, 6688338, -2012729, -2238752, --1641751, 1711545, 4989679, 2560874, 2695092, 2729452, -4113505, -2492155, -838592, 6024229, -3135863, -10641855, 3406983, 3294777, -4431333, 9976672, 9194988, 4917201, 380105, -3648038, --2326799, 519691, -3091303, -3754338, -6128919, 877247, -7000797, 5084168, 1987496, 45634, -1139777, 2675228, 2356863, 5443871, 8549669, -3246995, -13471165, -2370822, -9164386, 3151969, -1304060, -12239583, 4466229, -5148592, 15381888, 5077188, -9635222, -349503, 9799505, 5073430, --7970923, -4786204, 10251550, 5848672, -7057705, 8708046, -7243999, -9621264, 1523103, -14558329, -8813273, 9420474, -2126546, -8771397, -1530082, 3419868, 1819992, 1445793, 923418, 6744710, --9464497, 3039763, 10632192, 156766, 409633, -9349607, 4687420, 2585034, -8566849, -2171106, --4301947, -2082522, 386547, 2671470, 2204392, 281857, -2544231, 239981, -2728915, 1126355, -1703491, -379031, -1293859, -953483, 1747515, 512712, -493384, -1480153, -2721399, -344134, --2655364, 5375689, -5012227, -43487, -483184, 2041720, 1452236, -2949569, 944893, -936303, -4651987, -610959, 1356136, 101469, -2585034, -296353, 2948495, -31675, -8721468, -6441914, -206158, -10472204, 31139, -24622510, -7750269, -2830920, -13455059, -4712116, -2818036, -5899675, --4560719, 3211562, -6485938, -12313134, 3278671, 7727720, -12577812, -3476776, 3875671, 6314139, -10849087, 6927246, 6390375, 7011534, 2534031, 12426414, -7395397, -3164317, 2630131, -6148246, -2338610, 3522410, 6503654, 855772, 10635413, 2235531, 2621004, 7344931, -3246995, -6296959, -111132, -9654013, -6176163, -11143293, -469225, -512175, -14653355, 5283347, -6640557, 2998961, --13841069, 1656784, -10475962, 15626165, 781147, -13928042, 16709570, 20473572, 5743445, -6862821, --5090610, 5312338, -1789391, -676457, 6041945, -9778030, 6362457, -10099079, 5338645, -4027606, --5698885, 2405182, 5361193, -2921652, -321586, 6299644, 1640678, -3115999, 3535295, -1563905, --5791764, 752693, 5383742, -1045288, -2148021, 2136746, 1554778, 4388920, 864899, 141197, -1879048, -1485522, 3049964, 764504, 2522757, 867583, 2000381, 1619740, 1628330, 1311576, --1900523, 2105071, -2550674, -2362769, 210453, 1376000, 436476, 681826, 1501628, 991064, -97711, -835908, -1924682, 6979, -2022930, 5326297, -2674691, 4798016, 7240241, 1066226, -6681896, -3778498, 10444824, -8122320, -7565585, -19903952, -4425427, -10321343, -24285356, 6091338, --14005888, -8505109, -11294153, 3097745, -21879638, 5848672, 1773822, -4203163, -500364, -6293738, --2237141, 5241471, -7469485, -5316633, 270046, 3994320, -6537477, -509491, 7459285, -12006044, --2798708, 7000260, -6685117, -411243, 39192, -1902134, 10120554, -8875013, 6000606, -4039417, -8227547, 8702141, -8883066, -11833709, 11045582, -1199370, 2386928, 2891587, 970663, -2541547, -6209449, -3380676, -13707925, 3568581, 2762201, -11855183, -1349694, -4243965, 7099581, 8672613, -4269198, 1462436, -3437585, -8421894, 8593156, 5330055, 7683160, -528818, -12164958, -2837363, --1856500, -5296769, -3018288, -1413044, 3482145, 5412196, -4714264, -3980898, -12087112, -5721434, -2303176, 4983773, 1320166, -1015223, 5500780, 5217312, 3092377, 6404870, -1989107, 5026186, -2251100, 3442953, 554588, 57982, -3350075, -2523830, -633508, 1633698, -814970, -2808909, --3570729, -92342, -607738, 772020, -2436320, 599148, -2900714, 935229, 4786741, 1123671, --2780455, -2794413, 6098854, 3526705, -781147, -326954, -7769059, -831613, -114354, -6511171, -144418, -2611340, -2056753, 1610613, 2017024, 545998, -776315, -5984500, 29561186, 17069810, -1137630, -9383967, -22384296, -2729452, 10408316, -4902169, -9043591, -16783658, -980863, -3622805, -542240, -5758478, 5382668, -95026, 14612016, 5792301, -6157910, -435939, -2657511, 1105954, --3063922, 3025268, 9041980, -10644003, 2019708, -6416145, 4189204, -4571993, -7797513, -15166066, --1264331, 8673150, 2869575, -1899449, 3162170, -1129576, 8237748, 13089450, -4609037, -2989834, --15209553, -16451335, 4507032, 2435247, -6995428, -6019397, -13700409, -9394167, 5370857, -1776506, --15569, 690953, -1098975, 6237903, 3529926, -11249593, 429497, -10252624, -933082, -5532455, --3224447, 10880226, 22396106, 36958732, 1351304, 11886859, -11194295, -14207752, -20002200, -1054415, --110059, 4044786, 4188130, -2731599, -25273736, 10472741, -4330938, -3484292, 1546188, -6616934, -719944, -3598109, -10321343, 128849, -4155918, 97174, 984621, 394063, 7257958, 1060320, -791348, -392453, 261456, -304943, 3093987, 6882685, 1995012, -242666, 1431835, 6241125, -130997, 80531, 2309082, -2064269, 736050, -5702106, 1912871, 2988760, -5400385, 5487895, -293132, 481036, -1625108, -5961952, -1959579, 2678986, -8590, -599685, -1525787, 214748, -10821707, 18009872, -8901320, 22549, 3475702, -14709726, 148176, -9501541, -9184788, 13834627, --4063576, -3488050, -7430831, 15889232, 13985487, -16643, 22969486, 2570001, 7181186, 5039608, --6389838, -7511898, -11940009, -6308233, 2809446, 96637, 10298795, 785442, -1112933, -1890323, -7279970, -10524817, -25669946, -9019968, 7582765, 2357400, -2100776, -7669201, 464930, -12373264, --1847910, -11274826, -769873, -1429150, -7923141, 7582228, 3784403, 14419816, -11920145, 22348862, -6012954, -4373351, -7909719, -4087198, 3531537, 12882218, -3964255, 7361037, -11395085, 9191230, --10347650, -11676405, 11497627, -16689706, 10930155, 9153649, 17735530, -18076444, 13725642, -1737314, -12236899, 4751308, -18965502, -3345243, -4452271, 5264020, -10061498, 29840360, -1465121, -10572062, -4240744, 13775571, 9380209, 6437082, 7131793, -971736, 3399467, -1251983, -3955128, -2550137, -1056025, -163746, -3923453, 1095754, -1150514, -6090801, -1255741, -2347200, 2551748, 3161096, -1743757, -871342, 5900212, -993211, 3267396, 1269163, 4176319, 1531156, -2103460, -2662880, -719944, -352724, 2881386, -1206349, 280784, 2400887, -1473174, 4140885, -1971927, -2352032, -1174137, -1775432, 4374961, 1535988, -1273458, 1286343, -12487617, -16750909, -34305516, -10536629, --20145544, 5608154, -920734, -6870337, -9979893, -9505836, -8588324, -9312026, -9118752, 943819, --7436199, -1351304, -16156593, -24792162, 30344480, -9476308, 16436303, -3162170, 4233227, 5221607, -8852464, 5827734, -1565516, -520228, -13124883, -2988224, -3138547, -8839043, -13766444, 5341866, --1574106, 19401978, -13478681, 327491, 26851598, -6509023, -22362284, -7237020, 856309, -10156524, -15695421, 7192997, -8670465, 6344204, 8414378, -5245766, -209380, 4208531, 10476499, -432181, --10397042, -10236518, 12543452, 8955544, -6656663, -14388140, 9108552, 10546829, -9501541, -12954158, -8996883, -16416439, 31271120, 6686727, -2611340, 1225139, 7607998, 1675037, -5570573, 452045, -2193655, 11191611, -7439420, 2194192, -22317724, -20106352, -2304250, 1135482, -2252174, -9792525, -7016903, 16489990, -530428, 4176856, -1624571, 3470871, 4933844, 5903433, -6473590, 7110319, --3393024, -1981054, 4680978, 8766565, -2688113, -8948027, 2449742, -896038, 1399623, -886911, --4841502, -1403381, -5003637, -3131031, -6157373, 6165426, 6309844, -3923990, -99321, 7603166, -2346663, -3347390, 1515587, 9543417, 6239514, 6855305, 6903086, 6092948, 2197950, 8734890, -4558034, 3582003, 3173444, 8264591, -12912819, 27917, 4774393, 3672197, -8462696, 20390358, -14376866, 29351270, 16209743, 10930155, 4247186, -25670482, -2120103, 3500935, -15137612, -4026532, -29021094, 2232309, -16850768, -16598975, 15022185, -22873922, -5960878, 1009854, 6100464, 2633352, --4394826, 7433515, -10364830, -13422, -2128156, -6504191, -1474784, -4526896, -14984067, 7875360, --12996034, 7596724, 6717329, 8841727, 1547262, 5860483, -5473936, 24154896, 3175592, -25650618, --22624278, 2070174, 10047002, 19632832, -6554657, -15409269, -6914361, -2041720, 2124935, 11528766, -2413772, -9096204, 26466126, -32569810, -5527086, 6164889, -22767084, -11737609, -6074695, 3346853, --36829344, -17388712, 26169772, -9970230, 7552163, -8551280, -29772714, -11227581, 14141180, -4387846, -5424544, 9069897, 18606336, -8950175, 1921461, -5622649, 11589969, 5298916, 4901632, 721018, --624381, 274341, 10065793, 5209259, 5884642, -1628866, -399432, 3738232, -7030862, -6334540, -2553895, 11783243, 5375152, 4539244, -11745662, 6739878, 21447456, -177704, -431107, -8381629, -5661304, 882616, -5242008, -6828998, 695248, 6319508, 7296613, 5337571, -6922951, 4398584, --4725001, 5002027, -8868571, -4871567, -1991254, -4671314, -5870684, -1844152, -14313515, -13485124, -1920387, -1107028, -2488934, 4602595, -456340, -1453846, -176094, 4552129, 15224585, -6714645, --47055124, -12598213, 2956548, 12864501, 13244069, 11370389, 12129525, 20935818, 38648264, -22345642, -16353088, -5941551, -416612, -6021544, -31228708, -23920820, -4211753, -1797444, 7027640, 11979738, -16422881, -5454609, -279173, -8690329, 322123, -1857573, 90194, 16304233, 9166534, 5197448, -13064754, 14814953, -26378078, 12836047, -15230491, -19996294, -5570036, 12315819, 3882651, -13622026, -4612258, 1249299, 9717364, -1263257, -25640954, -18891950, -21227876, -21712134, 3016678, 17328046, --3098282, 63722284, -41689100, -31935766, 19498614, -5999533, -12657269, -4683662, -3318399, 350040, --39058968, 3789772, -2707440, 5043366, 30169998, -2446521, 10650982, 11247982, 14461155, 48959944, --18165564, 62001612, 17482128, -2039573, 8341364, 3234110, -25482040, -23046258, -281857, -5914707, -3328600, 9288404, 7787850, -4787278, -21836150, -18455474, 7372312, -12568685, 8079371, 8329552, -19583440, 18516140, 17441862, 2996277, 6175626, -635118, -708670, 12379169, -1960653, -1504312, -4236449, -18851148, -4238596, 7406134, 147103, -2260764, 11930882, 4058744, -17029546, 11461120, --9448928, -13822279, -7318625, -4562329, 3507915, 5179194, 6029061, -7575249, 8638253, 3150896, -5626944, 1960116, 7354595, -3380139, 4527970, -11554536, -2121177, -28176060, 10267119, 44988708, -1320703, 46948288, 24839944, -2930242, -18136036, 52952116, 7986492, -9029632, 6885907, -12190728, --3537443, -1934346, -3238942, 6570763, 14823543, 10177999, 1971927, 6665253, -10634339, -10448582, -3232500, -3299072, 17450988, 18747532, 12048994, -5033702, 1203128, -23171348, -14421426, -4457103, --15774878, -25062744, -14805289, 11646878, -14442364, -44069584, -20282446, 13182328, -17721572, -12729209, -627602, -3457449, 20635708, 30104500, 39873404, -21364242, 11336029, -555125, 1308891, -8840116, --26374320, -52894668, -34653408, 17996450, -35115116, -18692234, 9578851, 17561048, -13007845, 19835770, -57707716, 11862163, 11181410, -43912820, -58496380, -12962748, -18212272, -31508954, -8913668, -26374858, -18611704, 10294500, 52310016, 21264384, -6063957, -10886668, -18177912, 12063489, 23766202, 47082504, -33141042, -23123568, -47892108, -23701240, -15288473, -28656558, -5301064, 23827942, 11563126, 29544544, -1261647, 20906290, 8438000, -7248831, -8973260, -10606422, 5742372, 12631499, 3195993, 16531866, -21023328, 12371116, 14974940, 6548215, 22702660, 19623168, 771484, -806917, 9917616, 22185654, --2281702, -6441914, -3455301, 18853296, 5843840, 502511, -5806259, 11621645, 9162776, -3387656, -7587597, 9096741, 4638028, -2535641, 2007897, 6371047, 750546, -11464341, 24106040, 47805132, --25517474, 36192080, 29050622, -4895726, -7565048, -16487306, 4835060, 32249298, 23928874, 37853696, --16711181, -7744900, -7932268, -2594697, -10410464, 9717900, -12748537, 27700928, 11687143, -46186468, --20023674, 124017, 6699612, 19556060, -9680319, -17644800, 4948876, 5144834, -7592429, -8851391, -4945655, -13326747, -20222854, -9348533, 43060804, 17655536, 7111392, -22226992, -7319698, -18900004, -10671920, 20727512, 6845104, 1131187, 12182138, -7618198, 27401354, 15426449, 1425929, 8919036, --1226213, 54475216, 11096585, -23549306, 8697846, 9216463, 5246303, 12151536, 519691, -22478786, -26173530, 5580773, 4327180, 10118406, 4609037, -260919, -16540993, 18640694, 21296596, 10900627, -61481920, 43639016, -23853174, -47808356, -33501282, -3474629, 3970161, -5061082, -40652940, -20271172, --14524506, -16847010, -16764331, 14871324, 11636140, -4423280, 2367601, -3791919, -22822920, 6388227, --4312684, -1391033, -23375896, -22503482, -4140349, 9360344, 10995653, 1252520, 11734388, 4954245, -14834817, 2059974, 2894271, -25469156, -15162308, 10714870, 2871723, -7107634, 13238700, 5574868, -2313377, -12271795, 11760157, 16168404, 11371463, 11730093, 14843944, -3320010, 16457241, 32993402, -26022134, 5866926, 3605088, -4228396, -5755256, -16967806, -21448530, 5641977, -2357937, -8938901, --55867324, -7334731, 13858786, 15622407, -12870943, 19532438, 5946919, -8077223, -21052320, 4483946, --5286031, -31256624, -10151692, -11220602, 2017561, -42992084, -33784212, -5919002, 20724290, -3045669, --6823093, -26112328, 161061, 21940840, 683437, -15621870, -9255118, -3562139, -9094056, 5252745, -6961068, -22181896, -24854438, 3543885, -1261110, 4990215, 39902932, -24944096, -2987687, -1846299, --39735964, -12149926, -29194504, -4817880, -2856153, 27504970, 30911954, 38056632, 10560251, 6167036, --15010911, -33942052, 918049, 13297219, -12096239, 46783468, 109790640, 105502112, 15014669, -68137512, --62648540, -24790014, -39560408, 129475008, 79903032, 50057308, 65168612, -1476395, -35230008, -92965640, --59742460, -23409182, -5399848, 36839544, 74978856, 66718560, -8426726, -55988120, -34078956, -50755776, --39982388, 6535330, 54178328, 79152488, 30423938, -4829691, 4016331, -31077310, -36588828, -36477156, -12129525, 5071283, 8957691, 31439160, 16670379, -3815005, -20917028, -18349174, -12128451, -28679644, --5996848, 11814918, -10852845, 123480, -4227859, 18875844, 14304389, -26737246, -16609712, -53397180, --42813308, -38366944, 23790898, 42049340, 15903190, 10401337, -15835544, -28012314, -83099024, -61882964, --37087580, 6427956, 22641456, 14055280, 3091303, -31093416, -25740812, -48826260, -80191872, -32101122, -8966818, 22689776, 40568112, 18256296, -338229, -23165442, -8599598, -15602542, 28831578, -28202366, -32521492, 6686191, 3249680, -51775292, -17261474, 46268072, -31066572, 13106630, -320512, -9896678, -13778255, 5738613, 24099062, 39135204, -23012972, -29812978, 7601019, -17955648, 23886460, -31166968, --16982838, -19520626, 2020245, -4911295, -18684718, 8830453, 36524400, -28394028, -32298154, -23124104, --7723425, -6424198, 49148384, 3512210, -1753957, -48176112, -12821551, 5047124, 41252088, 18508624, --7625178, -69670272, -50451908, 48051556, 51667384, 50630148, -23201414, -116545552, -23204634, 52867288, -43682500, 6990060, -13635984, 7711614, -47302084, -27880780, 15904264, -13654775, 14395657, -8419747, -1917703, 49733036, -36817532, -19163608, 41056668, 32525788, 61951684, 26458610, -82691544, 26069378, -89352496, 19387482, 45256072, 11579232, -25060598, -566399, 56872884, 39257612, 75527000, -99027984, -13606456, -472983, -11203959, 39507256, 538482, -51380156, 4413079, -2063732, -10769630, 7809861, --413391, -31352724, 27399206, -12828530, -992137, 1617055, -7721278, 1600412, 3895535, -8533026, --11737072, -16968342, -25524454, 25059524, -1545115, 9383967, 20816632, -23858544, 11145440, -627602, --44217764, 463856, 13217225, 47602196, -12948790, -65412888, -8260833, 31721554, 7872138, 28103044, --22303766, -17915382, -24532854, 11478837, -4873714, 17412334, -25961466, 13110925, 5688684, 8169565, --28858960, 3510062, 5194226, 20543366, -8775155, 4934381, -17972828, 7087770, -11120744, 17869748, --4068945, 14529874, -5345087, 6612639, -58281096, 6585796, 10422812, 5555004, 57461832, 9678709, --4313221, -36686536, -6272263, -3611531, -8596377, -368830, -6944425, 14698452, 6860137, -10818486, --1853815, 22813792, 70330, -1289027, 2423435, -5717675, -9794673, 12799003, 11320460, 8586713, --14267881, 7493108, 21346524, 8364986, -1227287, 13762686, -2508261, -16346646, 4319664, 4133369, --13163001, -14312979, 14249091, 13868449, -13700946, 8770323, 8475044, -129923, -4991826, 92879, -10832444, -607738, -12103218, 6288906, 7379291, -22486302, 5745593, 16611323, 5434208, -14623290, -2273648, 10306311, -18937048, 5134097, 8869107, 3736622, -4928475, -18061948, 21246130, -23011362, --2035815, 22126060, 355409, -3826816, 483184, -20813412, 9203041, -316217, 11878269, 22002580, --9967008, -1594507, -12728672, 16825534, -3534221, -1891933, 17254494, -22550726, -9918690, 12503724, -10204305, 4470524, -18335216, 6325413, -4035659, -1162862, 8781061, 6670084, 1250372, -4677220, --2355253, 839666, 4964446, -16011638, 11648488, 2367601, -2232846, 4505421, -2106682, 10110890, --15060303, -2738579, 301185, 874563, 1492501, 6955163, 4602058, -25573310, 13508209, -2741263, --2981781, -1074279, 5192079, 6979859, -6344741, -2567317, 11883638, -10184978, -1315871, -7793755, -5645735, 53852448, 4723391, -6572374, -18009334, -11969537, 6309307, -8026220, 6944962, -10712722, --853088, 8532489, -4827543, 4011500, 3929358, -14929843, 4122095, -4890894, -3252901, -12305081, -3469797, -3486440, -7762617, -3620121, 5943161, -5372467, -5320928, 7589744, -8436390, 4266513, -7215545, -14959908, 14740865, -3736085, -17600240, 9335111, 9284109, -8208756, 2848637, 5322538, --7437810, -6660421, 39728, 990527, 4787815, -2421825, -911607, -7405061, 6783901, -5801427, --1882269, 8519605, -10300942, 2967286, -1877438, 26307, -4857071, -6641093, -2717104, 11583527, --7933879, -3018288, 1859184, 2461553, 319438, -7020661, 5331665, -3146601, -6074695, -172872, --11123965, 16242493, -7189239, 3292093, 3571802, -3339874, 5619428, -9660455, -7893613, 9891310, --4871567, -6700149, 6611566, -439697, 1835562, -4464082, 1166621, -984621, 3017215, -3559454, --2800319, 3754338, -2188286, -2592013, -709743, 2373506, -1551557, -209380, -1261110, 638876, -2245194, -3157875, -3199214, 9313637, -2747705, -3318399, 2907156, -1054951, 2702608, -7451232, -497679, -1227287, -232465, -1962263, 8722542, 132607, -7676181, 2534031, 849330, -309775, -67646, 3416647, -2188286, -2183991, -970126, -1966021, -994822, 989990, -2396055, -27917, -728534, -301721, -26739392, -43719544, 19992536, 150777504, 23133230, 75307960, -17661980, -76678048, --27823872, -74729208, -49151068, -15658377, -8187819, 3504157, 44393320, 53282828, 74076376, 73485280, -23393076, -29124174, -47028820, -86385216, -66111356, -34844532, -13527536, -8881455, 26677116, 44685376, -34590592, 47084652, 45702212, 16784732, 14826764, 5535139, -33415920, -12473659, -28729574, -49810348, --30063160, -29122026, -43118788, -9237938, 20173998, 15265924, 44015900, 57611616, 30034706, 38356744, -28922310, -4117800, -1243930, -2764348, -31003758, -38262788, -34055332, -51375324, -43698072, -15517180, --2554432, 6142877, 35617628, 32708324, 31599686, 39724152, 29722784, 10146860, 18787798, 10229538, --11570105, -5587753, -21398600, -45119704, -27084064, -25632364, -35471600, -17167522, -11361799, -20021526, -16876538, 31833224, 36849744, 58693948, 55381992, 23298586, 13754633, -849330, -20066088, -23904178, --24569898, -35863512, -32764158, -30173756, -27583354, -17323750, -6845104, -140123, 13436268, 31406948, -39256000, 36418100, 44050260, 30415348, 14788109, 6150393, -5115843, -22700512, -25531970, -35694400, --46444704, -46923592, -37205692, -31182536, -4738960, 18469970, 41553272, 55597276, 60287920, 46454904, -30328374, 13320841, -3651259, -23476828, -34227132, -46366320, -45914812, -32997160, -21588116, -6720550, -8288213, 16398722, 21910238, 27285928, 23644868, 14607184, 12456479, 4246112, -368830, -4604205, --5756867, -7623030, -7311645, -10666014, -8605504, -6968048, -5687611, -5888400, -3838090, -3960497, --1025960, 1182190, 5236102, 6003291, 8458401, 8270497, 7847979, 2549600, 786516, -1102196, -179852, -684510, 0, 0, 0, 0, 0, 0, }, -{ --1141388, -6170258, -3467112, 1032940, -5153961, 1443109, 580357, 7864622, -4709432, 15569, -2477123, -3941706, 4025458, -2567317, -488016, -2206540, -1264868, -2579128, -3210488, 2369748, 775778, --2099702, 4391604, 3998078, 6833830, -201863, 2589329, 1359357, -112206, -6172405, 1607928, -2572149, -2434710, 1545115, -1794223, -2091649, -3385508, 1760937, 4363687, 453656, 5091684, --2073932, -430034, 5135171, 2688650, 418759, -59593, 4878546, 7326141, -5439039, 1224603, --1874216, -839129, -8468602, -3003256, 3433290, -2627446, 2381559, 1102196, -1236951, -2050310, -1207960, -697932, 2652679, 1440425, 1241246, 1360431, -4389994, 173946, -2105071, 2714419, -4500052, 3156801, -628139, 4871567, 43487, 2071785, -632434, -1071058, 273267, 2448668, -2824478, -908922, -1904818, -3950296, -496606, -1736241, -1859721, -1045288, -1579474, -1129576, --1862405, -972810, -29528, -13422, 61203, 1574642, -1063004, 829466, -371515, -747861, -62814, 728534, 282931, 583042, 22012, -511101, 32212, 744640, 265214, -1062468, --811749, -27380, 35433, 450972, 89657, 815507, -1052804, 3673271, -4502737, -4709969, -178241, -6343130, 1164473, -1997160, 3082713, -1699196, -5031554, 572304, 4932770, -753767, -170188, 6868190, 8632884, -3725347, -3961034, -1125818, -6417218, 2741800, 586263, 1599875, --2256469, 3426310, -4471061, -814433, 3062312, -2516314, -916976, 469225, 5563057, 358093, -4025458, -5304822, 5212480, -568009, 754304, 3374234, -2910914, 2815351, -1321239, -1347009, -2425583, 3199751, -541166, 1830193, -7035157, 4255239, 4130685, -7458211, -6564321, -1854352, --5443871, -1525787, 2077690, 1354525, 1983738, 114354, -1813550, 4589710, -1535988, 168041, --1833414, 1081258, -2777770, 3905199, 958851, -3004867, -1678259, -1189706, -1739999, -1541356, -3956739, 5181878, -244813, -1056562, 203474, 1659468, -1075889, 3620121, 2057826, -1479616, --275952, -924492, 1576253, -1517734, -40265, -400506, 242666, 573378, -86436, -445066, -984621, -760209, -249645, 203474, 658204, 51540, -1311039, -907312, 257161, -865973, --722091, 868657, -456877, -1606855, -1030792, -1292785, -339302, 204548, 1549410, 11094974, -2119566, -4102768, 5143760, 654983, -3492345, 10134512, -6800544, -9741523, -5709086, -5906654, --1988570, 2882460, 3555159, -3366718, 5116380, -6419366, -3500398, -776315, 2128156, 1601486, --1955821, -2522757, 5724118, 1102196, -390305, -3208878, 4272956, -3125126, -723165, -6442, --362388, -448824, 1663763, 889058, -881542, 3568044, -1682554, 2175401, -153545, -5820218, --2283849, -2324651, 6189585, -3431142, -4172561, -7558606, -8832063, -1613834, 449361, -3526705, -6702297, 905164, 3600256, -2706903, 5801427, 2474438, -3364033, 9355513, -4239133, -4529580, -724239, 5864241, 8596377, 6087580, 2015413, -2994129, -6765647, 2695629, -83215, 6667400, -2681133, -1905355, -230854, 3400004, 2731062, 49929, -637266, 280247, -1331977, -2808372, --265751, 884226, 695785, 2427730, -86436, 1472100, -515396, 1161789, -295816, 221728, --250182, -1643362, 154082, -299574, -2107755, 1693291, -389231, 1037235, -572841, -1132798, -156766, 201327, -82141, -740882, 780610, 313533, -557272, -170188, -1621887, 210453, --915365, 817654, -304943, 1753420, -792421, -10478110, 1628330, -3794604, 2422362, 723702, -7532299, -9689446, -5557151, -7104413, 3806415, 3199751, 4571456, -5058935, 1738925, -1481227, -635655, -7895761, -6772627, -4929549, -4925791, 8039105, -3236795, -928787, -156766, 2762738, --1287417, -8390219, 3540664, -3315715, -1112397, 3934727, 2917357, 4511863, 277562, 2430415, --5914707, -2403034, 5283347, 8831527, 5148592, -343061, -6726456, 4828080, -2174864, -5760088, -8002598, 2420214, 2746632, -4888747, -2884071, 2792266, -1822140, -2702608, 4219269, -3288871, -1462436, 255014, -5593121, -1139777, -3703873, 5912560, 2980171, -768262, 993748, -2651606, -3468723, 629213, -106300, 1079111, -6691559, -3435437, 3766686, 1868311, -1096827, -813896, --4759361, 7843147, 9642202, 5376762, -4428648, 4005057, 676457, 3425773, -1476395, 2824478, --2126009, 1845762, 3520263, 1949378, 1685775, 1329292, 63888, -1138703, -401043, 3504693, -175557, 278099, -1302449, -199716, 720481, 2126546, -264141, 2490544, 397284, 110595, --94489, 2030446, 2433099, -1016834, -469762, -226560, 375810, 1789928, -103079, 517544, -127775, 464930, -877784, -15846819, 5287105, 804233, 3941706, 4268661, -3094524, -11207180, -8637179, 3669513, 8498667, -1562294, 4505421, -88047, -3058554, -209917, -7921531, 9693741, -2213519, 919123, -4989142, -2865817, -3379066, 2896419, -4449049, 7424388, 326418, 2556579, -4136054, 2286533, -476205, 2398202, 2290828, -1733556, 1927904, -8252780, 2146410, 3764002, -3850975, 7413651, 2574296, -4948876, 2481954, -2492692, 5041755, 979253, 3668976, 5645198, -925029, -1232119, 4422743, -3039763, -4805532, -1772748, 3085397, 7823820, -1853815, 497142, -140123, 940598, 1535988, 3281892, 1112933, -2050847, -368830, -2768107, 2014340, 656056, --4955856, -4356171, 1741609, 2759517, 2760053, 4920959, -7568269, -4063576, -5516886, 6500433, --2862596, -4019016, 2103997, -3703336, -5394479, -1938641, 150861, 5787469, -2041720, 1880122, --2299418, -1336272, -335544, 1773822, 764504, -1031329, -876710, 1123671, 2869038, 988379, -1654099, -779000, -545461, 1964948, -77309, 153008, 731218, -1336272, 2563022, -779537, --178778, -1177358, -3268470, -484794, -719944, -218506, -36507, -1204202, 128849, 2953864, --731218, -256624, -558883, -1056025, 3910031, 16094316, 8539469, 7646653, 11149198, 3034395, -2036888, -6818261, -223338, -12751221, -2297271, 4859756, 3526705, 2268280, 2950643, 3512210, --2752537, -1862942, 7311645, 6594923, 5656472, -425739, 794032, -9104794, -7888781, -2983929, -5765994, 1869921, -1196148, 3135863, -5305359, 506806, -2736968, 6346888, 4981625, 11143830, --1105417, 4207458, 3501472, -1787243, -5841156, 10485089, -6093485, -1377074, 4745939, 233002, -2697776, 7561290, -2412698, 2823941, -7305740, -15611669, -8661875, -5175973, -2097555, 730144, --623307, -4020626, -8394514, -1742683, -6027450, 1858110, -139050, 751082, -9466645, -4303021, -6138045, 2126546, -368293, -10487773, -9496173, 5659693, 1016834, 3448322, -6957310, -5545340, -374199, -2825552, -5935108, -4212289, 3336116, -1280437, 1537598, 446677, 4172024, 3063386, -1433445, -2113661, 1130113, -372052, -2525441, -2487323, 2402497, -1019518, 713501, -1606318, --2436857, -418759, -191663, 2174327, -236223, -2104534, 576599, 818728, 2403034, 476741, -584652, -1008244, 3007551, -1133335, 3423626, -1876901, 2542084, -2233920, 401579, 1333587, -128312, -157303, 559956, -507880, -891206, -8137890, 6157373, -3616899, -305480, -21188148, --5009543, -7829726, -5187247, 867047, 6991133, -1387274, 9245991, 4906464, -553514, -9108015, --3780645, 13570486, 2261300, -8111583, -5941014, -2673617, 6351720, -4950487, 68183, 4381404, -6911140, 7814693, -8567923, 5768141, 772020, 1637456, 2436857, 3171297, 2744484, 7835094, -206695, 2383707, -6868727, 9600863, -4829691, -2253247, 1602560, -7958038, 9842454, -1553704, --19267760, -6360847, -15473157, 951335, -236760, -4666482, 20956756, -3661997, -10394358, -3516505, --2565706, 9641665, -1333051, 4602595, 5636608, -3928285, 7182259, 9936944, -5060009, 3786551, --8841190, 4311074, -3179350, -2488934, 10183367, -3726958, -988916, -4527970, 258235, 179315, -3877282, 5763309, 6089727, -1621350, -1742683, 246424, 7892003, 3753802, 4097936, 164283, --6463926, 2598455, -3143916, -3505767, -1938104, -57982, -188442, 425739, 1427540, 1513439, --386010, 4301410, 689879, 1884417, 741956, 856846, -1205812, 1146219, 431107, -1261647, --1883880, -1213328, -3236795, -2520609, 2226404, 1804423, -2739116, 756988, -149250, 780610, -3092913, 668941, -1208496, 348966, 999117, 82141, -2498060, 1121523, 9632538, -13450764, -2685965, 2753074, -4261145, 1809255, 10137197, 10870025, 4029753, 3890167, 5182415, -8404177, --1464047, -8973260, -190052, 5739687, 3629784, -1885491, -7103339, -2295660, 4798552, -9301289, -315680, -658204, 4294431, 8870718, 838592, -4770098, -3641059, 9492415, -6096169, -2934537, -5458904, -3387119, -11212012, -4051765, 2552284, 1908039, -4482335, 1061931, 5841693, 4043712, -5634997, -648003, 4249334, 8076149, -3550864, 4031901, 3469797, -5495411, 11963631, -11477226, -6859063, 3037079, -15972447, 15313169, -9888088, 2194728, -1759326, 12226698, -5172215, -8627516, --1832340, 101469, 2223183, 9401683, -7958575, -363998, 580894, 577136, -1421634, 2805151, --6467684, -920197, -4607963, -8597451, -9546102, 5185100, 4191888, 4019016, 111132, 6087580, --2771865, -6959458, 1840394, -12351789, -10308995, -1907502, 3052111, -68183, -1886564, -1561758, -1512365, -6742562, -2232846, -1388885, -1069447, 3189013, -290984, 561030, 296890, -2186138, -1158567, -2461553, 235149, 1235340, -2665027, -535797, 2352032, -1748589, 69256, -1213328, --45097, 894427, 144418, -3675955, -520765, -4832, -114890, -597000, -2201708, -3784403, --841814, -193810, -449361, 3153580, 2391223, -10718628, 8497056, -24561844, 13445932, -9778030, --6720013, -12010339, 1316408, -1445793, 2076080, 8567923, -7242389, -2776696, 6791417, 6235219, --2101850, 2421288, -3363496, -11259257, -1140851, 2825552, -5840619, 9070434, 1450088, -1066763, --5479305, -5315559, 1142461, 13980655, 484794, -1972464, 3723200, -12098386, -2202245, 4411469, --8310762, 11746736, 7345468, -427886, -3722663, -3943317, -4656282, -8043937, -10062035, 8347806, -490163, 14833743, 1217623, -773094, -6799470, 1231582, -2744484, 3330210, -338766, -9351754, --7444789, -9529459, -16184511, -2235531, 14019310, -13531831, -964757, -14169097, 2130841, 3993783, -3163244, 10115722, -1243393, -14565308, 10324565, -1009317, -7182259, -5874979, -12721156, -4306779, --9703942, 5253819, -14831059, -2445984, 5650030, -107374, 991601, 7037304, 3454228, 8451422, --92342, -4563940, -1931662, -3125126, -281857, 3124589, -986769, 553514, 303869, 345745, --2578054, -3571802, 2133525, -2498597, 970126, 461709, -634581, 1130113, 252866, 481036, -4951561, 929860, -421981, 979789, 1482301, 1138703, -2676838, -370978, -5499706, 2035815, -2660195, 4228932, 1391033, 1469416, -207232, -2702071, 1512902, -100395, 10517301, -3825742, -9349070, -9119289, -4887136, 6454799, 2026151, -12318503, 772020, 16117939, -18545668, 1136019, -8625905, 20857434, -8922795, -5248987, -2302639, 16163573, 15802795, -16678969, -805843, -12801150, --6171868, 8420283, 8400956, 11074573, 6243272, -2135136, 7734699, -9531606, -5182952, -907849, --1487132, -13818520, 1216550, -261456, 18343268, -2781528, 9036611, 2241436, 5354751, 12347494, --7445326, -3258807, -18132278, 12546673, -15979963, -2780991, 3667365, -2101313, -9228811, -2258616, -2621541, -6505265, 1800665, -1013075, -1395328, -20313584, -14427869, 1069447, -10458782, -14243722, -2644626, -13163538, 4219806, 8669928, -7758859, 14846628, 3113851, 9552007, 10190347, 2677375, --7538205, -8887898, -11127187, 5792837, -11545409, 7022272, 8375723, 11597485, 2056216, -8142721, --5254356, 299574, 1139240, -15227807, -352187, -9834938, -1659468, -2729452, 644782, -7179038, -981400, -1584306, -76236, -4633196, -3405372, 1207423, 7665443, 888521, -697932, 1120987, --1054415, -2741800, -2747705, -2972117, -1309428, -3541738, 3976066, 2973728, -233539, -2910914, -4719632, 7110319, -1520418, -1116155, -1618129, -612033, -194884, 1834488, -2620467, 2899103, -2630668, 1890323, -2490007, -263067, 1505923, 2165737, 4877472, -9814537, 25395068, 10645613, -4378183, 13121125, -5030481, 2793339, -13533442, -17352204, 10937134, 22402550, 6634114, -63888, --22119082, 26709864, 3835943, 3324305, 3806952, 1029182, 4803384, 1562831, -3839164, -124554, -6716792, -4094715, 8445516, 1664837, -6680822, -9206262, -2541010, 8484708, -2330020, 2794950, --3835406, -3352759, 127775, 23965380, 3857418, 3497714, 3219078, 2055142, 14329085, -5309117, -4114579, -9233643, 17075716, 23835994, 6193343, -1339493, -8482560, 24903830, 11680164, 396748, --9633075, 3666828, -5781563, -863825, -11049340, -4121558, -7374996, -10099616, 16364899, -4886062, -12059194, 2554969, -9412421, -116501, -20136954, 19160386, -1390496, -9134322, -7153268, -11648488, --14381698, -7846369, 22269942, -6924024, 8022462, 10133975, -9000641, -8548596, -16068010, 2437394, -10834055, 3733400, 10359998, -2375654, -2044941, 477278, 2947421, -4408247, 1241782, -7992934, -2605435, -363998, 9091372, 6416681, -4907537, 500901, -262530, 5410585, -1829656, -7195681, -1605244, -222265, -576063, 2676838, 505196, -1128503, -3599183, -4039417, -766652, -965831, -4286914, -165356, 4300336, -5888400, 1435593, 4437238, -8335458, -6088116, 2212445, -2656974, -6269579, 7528541, -5606006, -5959267, 23675470, 23209466, 28672128, 17252884, 5694053, -7293392, --7569343, 4287988, 8330089, 10188199, -15234786, -453119, -1813550, 7640747, 6038187, -10576357, --13036299, -53150, -4937602, 12426951, 14629732, -8590, 7756711, 2550137, 3102577, 16889422, --10313290, -13676250, 10787347, -17909476, 1551020, -5521181, 9887552, 5041755, 185757, 11557757, -10615549, -9650255, 12027519, -28454, -5141613, 2842732, 13065827, -5051956, 5591511, 9683541, -4386772, -20875152, -12065637, 2054605, 1106491, -14193256, -9693204, 4712116, 6756521, 5738077, --19332184, -13507672, -13452374, -1069447, 8384850, 12221329, -30712774, -22577032, 3760244, 4718559, -17745732, 6254546, 6510097, 12916577, -1387274, -3316789, -4685810, 31712964, 10967199, -5005785, --16592532, 15160698, 9908490, -4960687, -4505421, 2339147, -4564477, 8097087, -2922188, -1736241, -4771172, -1183264, -1899449, -2501819, 5010616, 12998719, 93416, 922881, 457414, 5651103, -7262790, -1853815, -4568772, 1961190, -424665, 1458678, 853088, 1109175, -6164352, -3370476, -4371203, 438087, -2507724, 2126546, 6082748, 4728222, -8156680, -1839320, -5422396, -5230197, -3872987, -6243809, 2447058, -3371549, 6059662, -7225209, -10075456, -19494856, -18979460, -15596100, -6016713, -2006824, 8800925, -17195976, -2838437, 805306, -6639483, -8046085, 13977971, -5354214, -2827162, -210453, 969052, -14020384, -5164162, -11988864, 1591285, 1585380, 3111704, 33153390, --12918725, 9158481, 13951664, -7080791, -6687801, -10028212, -2030983, 15488189, -15804943, 10821170, --1040456, -2630668, 1448478, 1590212, 8485782, 956704, -16767015, 12825309, -10446434, -24054502, --19478214, -9752260, 32561220, 27635968, -15024869, -4319127, -20624970, -17204028, -6800007, 20123532, -518617, 13881871, 7248294, -9458055, 10573136, -7199439, -21467320, -1812476, -13019120, -2646774, --6979322, 42372000, 382252, -35062504, 27528056, -11104101, -7824357, 27825482, 28267864, 100932, --12386686, 5523865, 6908992, -38074348, -16391206, 1018981, -5604933, 19947438, 8434242, -28880970, --4329864, -2309619, 13091060, 8341900, 5695664, 5189394, -6022618, 1040456, 2291902, 12099460, --1503239, 1673427, 2368138, 2076080, 7102266, 3380676, 157840, -8244727, 10445897, -935229, --52076, 497142, 10737, -4449586, -6960532, -4757213, 944893, -1709934, 3039226, -462246, --3085397, 3333968, 7707856, -10245644, -3336653, -3118146, -1472100, 2935610, -199716, -2920041, --5783174, -2156074, -1494649, 5223754, -16862578, -10484552, 5126044, 4002373, 9173513, 28868086, -4981625, -731755, 6759205, 1515587, -11996917, -7365332, 6473053, 1494649, 23574002, 5575405, --1460826, 8536784, 12661027, 12836047, 13813689, 757525, -9674414, -2675228, -22111028, -2994129, --24967182, 13944685, -15190226, -5871757, 84826, 20237350, -11712913, 11267310, -8222178, 6833293, --10314364, 12921946, 19520626, 1343788, -4111358, -10482941, -15121506, 8484171, 9715753, 24752970, --3337727, 1255741, 10916196, 39637716, -9230958, 5953899, -6397354, -22054120, 15511274, -3145527, -11035382, -1354525, 2749316, -13281649, 36702108, -55004572, 40520332, -63114008, 27235998, -32552094, -10140955, -25522306, 9218074, 16940962, -4023311, 12590697, -6448357, 46057620, -27906550, 30583926, --47353088, 23912768, -18556944, 23005992, -15430744, -16719771, -8165270, -4228932, 11632382, -3177739, --2030446, 1162862, 727997, -5911486, 8279087, -8919573, 8748848, -6445672, 2689187, -10258529, --5731097, -7579007, 1371168, -6968585, 8638790, 9205726, -8711267, -138513, 3499325, 8448738, --1267015, 3030100, 6930467, -6487011, 11454141, -3184182, 15146202, -9023189, 18141942, -12936441, -4671314, -1063541, 10120554, 8395587, -1603633, 4915590, -13973139, 15932181, -10944650, 3871913, --11121281, 8053601, -14836428, 5098126, -1249299, -5439039, 5609228, 14039711, 11213623, 44458816, --30917322, 12972949, 8119636, -26612692, -748398, -5189394, -7585986, -13648332, -742493, 1627256, -17670570, 6646462, 9244380, 13340705, 10749229, 458488, 14733348, -16940424, -2455648, 20540682, -2275796, -28049358, -6468221, -36723044, -6882685, 6475737, -6823093, -8513699, -1607928, 32940252, -8304856, 2580739, 4009352, 8293045, -2486786, -18797998, -5782100, -2030446, 3497177, -4285841, --8817568, 23872502, 12811351, -4858145, -1138166, -5052492, -21534966, -17608292, -12917114, -10667625, -24024436, 5853504, 8864276, -14416595, -14068702, 4589173, 9776419, 9087077, -4074313, -2781528, --16335371, -10724533, 14254996, 710817, -39533028, 13970992, 21561272, 6968585, -17231946, -10530186, --8588324, 2899640, -12408697, 6190659, -29100550, -38823284, 16089484, 14093398, -7780334, -14232985, -10903848, -6337224, 2818036, 3441880, -5736466, 6287832, -3556770, -3595425, -2114735, 9410810, --6659347, -1903207, -7284802, -42950, 603443, 6310381, 6468221, -670015, 3809099, -4538707, -7559680, -5216775, 6174553, -14251775, -6519224, -1919850, 4126390, -4625143, -9338870, -7108171, -3405372, 7421167, -281320, 9573482, 2672544, 3813931, 581968, 6247030, -3512210, 5971079, --1433445, -11744051, -9069360, -3432753, 5365488, -6588480, 3899830, -36660232, 32088774, 39051452, --3675418, 28391882, 1136556, 4335233, 12350178, -25087440, 9102109, 18559090, 18297634, 7679939, -5654325, -18142478, 13248363, 7799124, -11023570, 5851356, -2207613, 21625160, 5944772, 5524402, -12765717, -5138929, -14752676, 4247723, 27538794, -9884330, -5383205, 24879134, -9165460, -11149198, --9088151, 8559333, 31995896, 44511968, -2789581, -28896004, 43656196, 15028627, -28782724, 32561220, -12457016, -8090645, -8370355, -12227772, -20285130, -1162862, 10632192, -17399450, -11398306, -36742372, --5000416, 21374442, -44508748, -24111410, 7019587, 7167764, 8772471, 26990112, 23884850, -39553964, -321586, 1511292, -27992986, 7812009, 13316009, -14364518, -10252624, -12128988, 8109972, 31078384, -9725953, 16161962, -21253646, 10829760, -24064702, 2104534, -16183974, -65751116, 50287088, 12923020, --18352396, 34039228, -11744051, -15510738, 9156870, 6956237, 8757975, 13310104, 5383205, -13371307, --4246649, 13058311, -429497, 5024575, 2105608, -2144263, 3205656, -5865315, 4343286, 12200391, -4404489, -7199439, -5326297, 3724811, -3267396, -6532109, 2489471, 7611219, 4423280, -22741314, --6877854, -16748225, -8689793, 9761387, -7467338, -9361418, 8909910, 5756867, -9816685, 12469364, --9210020, -4030290, 4478577, -7228967, 8196945, -3646427, -13492103, -20862266, 24039468, 79703856, --25447144, 702227, 6124624, 35986996, 31905164, -10442676, -13852880, -20099910, 855772, 15243376, --507880, -10276246, -10569378, 14384919, -7849590, -19335406, -17285632, -3491809, 29287918, 20542828, --23291608, 1564979, 423591, -10155450, 11545409, 4271882, -8312373, -2743947, -6538014, -3123515, -37387152, -13923210, -24831354, -17380658, -14113799, 33064268, 913754, -7667591, 30445950, 20928838, -8318278, 15493021, 29938070, -18210662, 4614406, 29127932, 17029546, 22251688, -25282324, -7129646, --948114, 10656351, 10038949, -23933168, 2279554, -31442918, -47288664, -2498597, -12514461, 21951578, -24413130, -6411850, -1944547, 4950487, -17199196, -45808512, 30817464, -22203908, 4758287, -8556649, --15496242, -8997956, -17969070, -36318780, 21432424, 19068582, 23142894, 4453344, -28864864, -50706920, --15063524, -14042932, -6214818, 16002511, -10384157, -2558727, 3045669, 2125472, -8080444, -3715147, --6495065, 754841, -2904472, 5326833, -3200288, -3969624, 5859946, 7611756, 6037651, -12306155, -3993783, 653909, -1132261, 99858, -26972394, 1254667, 3700651, 3911105, -17783312, 11500312, --2576444, -14846628, -12127377, 7115150, 9474161, -1849520, 5611375, -9193377, -6449431, -6296959, -683437, 10924786, 2749316, 10423886, -302258, 4771172, -15706695, -2544768, 3780108, 2078764, --12459163, -3775813, -39140036, -22436910, -18248242, -46079092, 53204444, -1219771, 28021978, -6394670, -1392643, -32116154, -17566416, -16571058, 3707094, 25164750, -1159104, -26201984, -19602230, -37455872, --41704132, 35763656, 13187160, -32457604, -10082436, 16014322, 29773788, 4172561, -36970004, -22473416, -7275675, 10340134, 9165460, 21577378, -22991496, -21808234, -3361349, -7739531, 3032247, 6426345, --44427140, -8185671, -30991410, -19839528, -41329396, -15661598, 56581364, 9760313, 1773285, 13883482, -14017163, 4435091, 42041288, 33298344, -11026255, 11313481, 56810068, -14885820, -13293998, -13571560, --42355892, -1631014, -23201414, -52585432, -55175296, -28913182, -28494960, 12885976, -21347062, 1866700, -11161009, -37470904, -13758391, 238908, -187905, 9674951, 24477018, 16295643, 29520384, 40018356, -29003378, -3574487, -21162914, -30655866, -2637110, 12688407, 3710315, -4313221, -409633, 8692477, -6993818, 18849000, -2148558, 3005403, 307627, -6280853, 6134824, 974421, -3063922, 16107201, -6939057, 3656628, -15127412, 10159208, -5449777, 7661685, -14359149, -39756900, -1898376, 15698105, --3002719, -21103322, -13581760, -15444702, -11686069, 5036386, 6892886, 7883413, 2110977, -1413044, -5873905, 15557982, 25927106, 24531242, 30456686, 26115012, -2550137, 17559436, 39727372, 2822867, --17523466, -24922622, -25156698, -34163244, -27809376, -13284871, -14970109, -2090039, 35221952, -23026394, -6957847, -26669062, -9042517, -29083908, 3735548, 35279400, -811212, 21805012, -43616468, 38343320, -12850005, -7857106, 30392262, 4261682, 13826573, -12155294, -14347338, -272730, 9312563, 7137162, --30455076, 27960238, -33749852, 4135517, 9446781, -11457362, 19894826, -20977694, -11916387, -2316061, --7484518, -10619307, -2342905, 4502200, -15583752, -18369038, -5950677, -3214246, -4508642, 11162620, -6067178, 4548907, -22282828, 5930813, 27114128, 35941360, -26511760, -13357885, 30561914, 41794864, --25338160, -15671262, 17627082, 7398081, -20122996, 16709570, -47270948, -9309342, 19267224, 37790880, -4920959, -23442468, -21195126, 5736466, 45296336, 3948686, 6794639, 1359357, 15035070, -2901251, -33666100, -368293, -37234144, 23502598, -24291798, -7450695, 10314364, -14219026, 3409130, -30316026, --11288248, 28111634, 12958990, -12594455, -17993766, -9851044, 2366527, -14615237, -4395362, -3222299, --8940511, -5491653, -4305168, -18975702, 12040941, -7092065, -8397735, -27485644, -6906308, 20219096, --13961865, -7721278, -7261716, -15697032, 30262340, 12410845, 1201517, -992674, -16749836, -25160456, -1660005, 22507240, 18526878, 6199249, -18866180, -11057930, -8391292, 10980621, 2075006, -16828756, --4099010, 1093606, 6710350, -14968498, -9996536, -8829379, 23551454, 12037720, 1604170, -14539001, --12512313, 13161390, 28309740, -282931, -12048994, -17365626, -5794985, 7849053, 716186, -4001836, -1104880, -3464428, -2565706, 2673080, -56834764, -15902653, 9708774, -19330574, 56313464, 41024992, -27085138, 14196478, 38018512, 26644366, 9004399, 18095770, -44542032, -60117732, -8256001, 404801, --15349676, 7850664, -2784750, -15832323, -19582904, -16209743, 31150324, 26865558, -21567178, -2957622, --2936684, -5614059, -7615514, -11460046, -16304770, -23124104, -4299799, 40349072, -12874701, -22687090, --10665478, 37860672, -17678086, -17655000, 58954332, 20772610, 10003516, -14487998, -32240172, -22748832, --33257006, 8855149, 27630062, 74175696, -65212636, -27864674, 38434588, 52910776, 9373229, -3277060, -68245960, 32516124, -21383568, 21586506, -7730405, 145492, -47068008, -23906324, -16372415, -77454368, --32689532, -12564390, 41769632, -22608170, -12914967, 30988190, -1947231, -4196720, 7556458, 21793200, --21012590, 15391015, 23779624, 493384, -4380867, -43728672, 20276004, 15615427, -50363324, -3686693, -5590437, 3246995, -4172024, -22436372, 6094022, 3790309, 6429029, -3561602, -6354404, 16134582, -3571802, -3379066, 11258183, 4607426, 29799020, -4069482, 9859634, 1869921, -23438710, -20536386, -14541149, -11433740, 8890582, 11078868, 7002944, 6840273, 324807, 19609210, -6130529, -4912369, --7608535, 5627481, 15408732, -23007066, -8429410, 11049340, 5266167, -13034689, -23336168, -5998996, -6577206, 49292264, 18099530, -4116189, 12794171, -2502355, -4552666, -18168786, 8727374, 7524246, --14321568, -6982006, -52141440, -2122251, 21483964, -5037460, -21738976, 9519795, -4878009, 23463944, -4696010, -11365020, -174483, 25119116, -14292577, 4042638, 9079561, -7641284, -215822, -13587666, -27741194, -1664837, 4132832, 445066, 13408888, -6068789, -5216238, -8669391, 5548561, 10425496, --4564477, 12385075, -5358509, 7632157, -13007845, -10248866, 15799574, 20259898, -26170310, 1224603, -39192, 2454574, 8253854, -16466368, 25266756, -22626424, 20337208, 2848100, -35321812, -1924682, -27576374, -35955856, 17162690, 158377, 4652524, -8631811, -5379984, 7268159, -10424959, 36826660, --27236536, 4074313, -7304666, -3302830, 9088151, 517544, -4464619, -843961, 11141682, -345745, --12773770, 3602941, 6491843, -21392158, 16648904, 7515119, 789200, 15346455, -5612449, -4745939, -7229504, 3353833, 4587025, 2609730, -4229469, 8664023, 3733937, 642635, -9356049, -1545115, -4575214, 8304320, -14202920, 7434052, 8853001, -12554726, 5958194, 1842541, 2139968, 6626061, --3733937, 1480153, -2340220, -18211198, -273804, -4403952, 7955353, -5130339, 3037616, 1997160, --751082, 2428267, 4609037, -3018825, 4295, 819265, -130997, 1315871, 5534066, -5647345, -5185100, -4125316, -26274462, -74187504, -105962208, 35633196, 94238560, 20808042, 261197360, 215122032, -145350288, 245979760, 128133368, -8739185, -30689152, -97119408, -224258496, -185192016, -180112672, -250465312, --185173216, -54378580, -40103184, -6555731, 87158312, 40580460, -10827076, 55288040, 91443608, 44781476, -42848204, 83224120, 49582712, 38241316, 75406744, 118406880, 49300320, 69510288, 111144624, 19077708, -7546258, 98209792, 58076012, -37649684, 47359532, 61028800, -63678260, -18997178, 70382168, -14176076, --42127724, 90914256, 48194364, -56398828, 48798344, 64725156, -86312200, -80798000, -34509524, -208447648, --276600736, -173480704, -244529136, -325952576, -227131296, -232436656, -300528000, -237652896, -164791456, -178677088, --106789528, 10205916, 66716412, 145021184, 237282992, 295772384, 364217536, 404668608, 442085824, 468772608, -420947072, 331012064, 305788800, 196009952, 59263568, 46551540, -31323196, -150494576, -118199648, -50157700, --111970336, -115118008, -24298240, -81093816, -155436480, -93868656, -68067712, -139036688, -118374664, -41826004, --105197704, -124978176, -9959492, -6238977, -56297356, 22367652, 13051332, -90618440, -67170064, -38986492, --129012768, -177761712, -145357264, -198545056, -246279872, -182703072, -146731120, -139179488, -60919816, 28548110, -74086576, 109913584, 151769648, 171272560, 153622384, 200292048, 256780528, 266178992, 248589488, 253168992, -244185536, 198255152, 223857984, 202116336, 86896312, 11434814, -49597208, -109308528, -115546968, -95266672, --112528144, -110007536, -95225864, -93947576, -100153808, -82252384, -73451456, -70123928, -66205848, -51005420, --48302812, -50069656, -39617852, -25890600, -23276038, -14841796, -1594507, 6151467, 6395743, 7705708, -2896419, 1775969, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ -4054449, -9705015, 164283, 397821, -4638028, -3712999, 2798171, 1709934, 250719, 3958349, -5982890, --2035815, 9687299, 654446, 1883343, -2555506, -3277597, 4550518, 3805341, -1604707, 3745212, -151934, 605054, -3704409, 1323387, -3373697, -2634426, -3314104, 1117228, 125628, -1085016, --380105, 1123671, 2874407, -1386738, -5276904, 81604, -3764002, -4810900, -1267015, 2155537, --746251, 1923072, 1219771, 1762010, -764504, -685584, -910533, -787053, 1614908, -66035, -3328063, -458488, 4122632, 676994, 927713, 3919158, 1393717, 996432, 5076652, -2076617, -1675037, -1777043, -3600256, 3288871, -1197759, -1074, 1212255, -613643, -2990371, -931471, -2143189, -1402844, -81068, -2909304, 1394791, 181999, -1938641, 222265, -3090229, 451508, --2964064, -278636, -44560, -410169, 1708323, 812823, 446140, 928250, -325881, 1714229, -1251446, -156229, 383326, 370441, -64961, 46708, 572841, -740882, 396211, -942745, -791348, 69256, -146029, -57445, 655519, 151398, -605054, 191663, -31675, -367757, --913754, -12736726, -6614250, -2976412, -2764885, -13422, 31675, 945430, 179315, -715649, --5219459, -2368675, -5348845, -8376797, -6998113, 3947612, 4869419, 4925791, -1943473, -585726, --557272, -1102733, 1812476, 755914, -1784022, -3797825, 2732136, 2331630, 3413962, 891206, --1151588, -2080912, 967441, 1628866, -390842, 3467649, -1690070, -100395, 3370476, -2583960, --4097936, 323196, 5663988, 1298691, 1251983, 789737, 47782, 722628, -878321, 1004486, --4478041, 726386, 4643934, -1067836, 67109, 456877, -1586990, -891206, -645856, -759672, --1244467, 2837900, -2668785, 2785286, 2374580, 5213017, -363462, 2928631, 6659347, -1233193, --5369783, -6021544, -291521, -790811, 322659, -5111548, 1479616, -3589519, -2669322, 1222992, -3725347, -1538135, -2846490, -3409130, -667331, -377957, 936303, 296890, 2139968, 1263257, --121333, 1077500, 309238, 2109903, 1596654, 1001264, 456877, 457414, -373662, 1410360, -64961, 420370, -176631, 26307, -1069984, -4295, -209380, 8849780, 6982543, 2968359, -3580392, -2310693, 1621350, 6119255, 3008088, 6590628, -2557653, 2656974, 3788161, -191126, -4854387, -2507187, 3039763, 551366, -3084860, -788127, -571768, -194347, -865436, 361314, --1541356, 485868, -1124208, 6027987, -1373853, -333397, -2684, -2720862, -7652021, 4360466, --1805497, 1683090, -3031173, -2881386, -3243774, -2159832, 2004676, 5782637, 4575214, 1920387, --316754, -1243393, 1847373, 4155918, -911607, -1365800, 5160403, -2282238, 2476586, -2567317, --2001455, -1231045, 1927367, 2038499, -3607236, -2490544, 108985, 3868155, 5021891, 2719251, -3915937, -538482, 3668976, 1438277, 3852586, -2164664, 1549946, 8792335, 4105989, 3731253, --894964, -2473364, -5989332, 3480534, 1505923, -2474438, -2477659, -815507, 1836099, -1821603, --834834, -1639604, 61203, 1258425, -528818, -2468533, 719944, 851477, 1422708, 1462973, -205085, 2071785, 1025423, 861141, 645319, -678605, 1466195, 135828, 0, -710280, --1077500, -1185948, 293668, 851477, 356482, 54761, 267362, -71404, 1317481, -1795296, --423054, 543313, -712965, 717796, 2754685, 10166188, 1449015, 3689377, 7364795, 139586, --4208531, -1805497, -1262720, 290447, -2651069, -7227356, 2902324, 243739, 157840, 3020973, --4792647, -2215130, 7550553, -1850057, -2849174, -4472672, 155156, -4226248, -703838, -1410360, --1269700, 542240, 6101538, -196495, -1912334, 1789391, -4847408, 6505265, -827318, -1462973, -8135205, -4685810, 388695, -5537287, -2529736, 471373, 260382, 2128693, 2569464, -4940823, -1473711, 2070711, 1687385, 474057, 2335389, 1693291, 3409130, -3127810, -1668058, 6418292, --2667175, 2452963, 615254, 1844152, 1661079, -545998, -2171643, -336618, 4537633, -2698850, --296353, -1434519, 1054415, 4047470, -2270427, -5048734, -9748502, 609349, -397821, -839666, -42950, -3750580, -2623151, -5439576, -2138357, 2707977, -86436, 1685238, -642098, 3388729, -2352568, -31139, 1764695, -135828, -205085, 1176821, -2110977, -1129576, -1712081, -10737, --2044941, 1224066, -68183, 584652, -755377, -656593, -79994, -736050, 478889, 775242, --1892470, 909996, 776852, 450972, -1803886, 964757, 650688, 1717450, 1813550, -158377, --615791, -940061, 909996, -471373, -324270, 344671, -4330938, -10963978, 5577552, -3653407, --6138582, 209917, -11588359, 2443837, 3634079, -1358283, 8585103, -3333968, -10186052, 2385854, -3961034, -3644817, -7186554, 12322261, -710280, -817654, 3218541, -2818572, -1520418, 1189169, --6001680, 3480534, -577136, 1674500, -1204738, 5720360, -1400159, 3172370, 2923262, -5805722, --2743410, -3306588, 6020471, -3042984, -1714229, 4446365, -1513976, -3445101, 2688113, 8221105, --4152697, 3966939, -4292283, 5378373, -2947958, 2798171, 613107, -3012383, -8434242, 4674535, -6179384, -648540, -1893007, 3442416, 4348655, 4089346, -5788006, -740882, -5099737, -548145, -1872606, -3673271, 1442572, 3974992, -4251481, -163209, 882616, -4190814, -2952790, 3791919, --2707977, 2983929, -1745367, -5361193, 1126355, -5199595, 1379758, -2007360, 1841467, -5718749, -5259725, -4325032, 576599, -4024921, -93952, -303869, 1107565, -476741, 9664, -1296543, -1409286, -3888019, 1376537, -3193845, -2494839, 19327, 2337536, 1044214, 456877, 668404, -176094, 1326071, 2965138, -2515777, 2469069, -1641751, -305480, 1509681, 1263794, -1796907, -6979, -4398584, 5557151, -6121939, -6093485, -10421201, 4381404, 11029476, 1666447, -1970316, --964220, -1848983, 9587441, -5750425, -5257040, -1233193, -5794448, -1770063, -6294275, -2706366, --4421132, -8721468, -2460480, -1917166, -316754, -950798, 2255395, 5216238, 1850594, 2587718, --8028905, 1003412, -139050, -2501819, 2774549, 1494649, -2346663, -1022739, -5717139, -6319508, --932008, 7031935, -2064269, -3597035, -779537, -2327872, -4937065, 97711, -5154498, 10547903, -8879308, 2314451, -2718178, -2450279, 926102, 1602560, 1816234, 1752884, -643708, 3938485, --3721052, 1752884, -3273302, 120259, -39192, 2220498, 1539209, 4962835, -2142115, -3016141, --2769717, -11418707, 357019, 2405182, -1155346, 4169340, 1794760, -3419331, 996432, -5981816, --2231236, 521839, 4600447, 1983738, 6294812, 1289027, -752693, 61740, 2334315, -2580739, --328028, 627065, -1079111, 1636383, -2255395, 1212255, -1717450, -1378148, -278099, -1900523, --1886564, -2331094, -1239635, -660351, 1773285, 1501628, -1744831, -2469069, -755914, -1881196, -1330366, -2101313, 1052804, -1209033, -345208, 2159295, 155693, 1811939, -10768557, 1743757, -10979010, 10347650, -11121281, -10151155, 2622615, -8078297, -4290673, 1155346, -567473, -3306588, -8331163, 3680787, -11748346, -966368, 696322, -125091, 7501698, 2773475, -5460514, 7883950, -2942053, 1019518, -4239133, -4532801, 3377992, -2916820, -7959112, -1475321, -1040456, -3581466, --4750771, -6445136, 6830609, 452582, 1008780, -4474282, 109522, 4817343, -3820910, -8103530, --8184597, 8560407, 1930051, 8078834, -1291711, 2292976, 5973226, 12124693, 3924526, -1558536, --6204081, -2698313, -3092377, 1813013, 658741, -4874251, -1964948, 7034083, 4993437, 9568650, -4497368, -6678138, -6353867, 7909719, 4226785, -4214437, 49392, 8147553, 641024, -498753, --6356552, 6985765, 5266167, -1291175, 9780714, -1504849, -2816425, -10263361, -1347546, 466541, -5444945, -7099044, -433792, 3101503, -1720134, -5121749, -4759361, -690416, -471373, -977642, --5950141, -5314485, -3117610, 1850594, -108448, -2473901, -809064, -380105, 530428, 442382, -891206, -559420, 2012729, -1704565, -410169, -5369, -1177358, -3992172, 270583, 2231236, --705985, -3533148, 307627, -894427, 1248762, 147103, -429497, -367757, 1153736, -593242, -2126546, 1036698, -55835, -1982127, 1441498, -1575716, 1456531, 1793149, -4409321, 1745367, --1649804, -889058, 5393942, -8987756, 5403606, -5893232, 1062468, 4711579, -62277, -2396592, -1760937, -6171868, 245350, -4807679, -13950591, -4270808, 5899138, 3813931, 2146410, -3398393, -2841658, 1268626, 14886894, 2550137, -5051419, 5531381, 1081258, 1169305, 9892383, -2866891, --2800856, 3430068, -6997576, 8382703, 7740068, -202400, 4371203, -1654099, -4291209, -581431, --5389110, 425739, -5277441, 2028835, -91805, 1493038, 589484, -9051107, -1875827, -1190780, -483721, -4575214, 1951526, 1975685, -1751273, 11876121, -5217312, -10609106, 6298570, 10382010, -2345589, 2663417, -4613869, 8904004, -3064996, 1474784, 3995393, 1144609, -4065724, 4234301, -1828582, 484794, -44560, -8185671, -2898566, 3978750, 7231651, -2834679, -5377299, -7449621, --2435783, 2474438, 1355062, 3689914, -9172440, 1701344, 6155225, 790274, -367757, 2341831, --1921998, -1061394, -265751, -517544, 3226057, -929860, 1020055, -981937, -678605, -725313, --2349347, -1336809, 1104344, -1659468, 2221572, -370978, -406411, -1094143, -1321239, -6969658, -651224, 3702262, -190052, 1281511, -671626, 2289755, 774168, -1376537, -1605781, 1276142, -30389042, -8327405, 183073, -3066607, -1944010, -6772090, -153545, -17808008, 9247065, -6402723, --452582, 10300942, 5086852, -6842957, -7342247, -2752537, -6279242, 5659693, -14732812, 2712809, -6095096, 8419747, 1650878, 2503966, 332323, 1364189, -1955821, -4640176, -13470091, -1999844, -1694902, 6179384, -4862440, 5957657, 2314451, -2464774, -881005, 4609574, -4892505, -4625680, --2672544, -3540127, -544924, -11934104, -5596880, -2863670, -357019, 9421011, 2087354, 8986145, -3076270, -434865, -5684389, 667331, 533113, 1349157, 3089155, 12602508, 1447404, -11846057, -3022583, -4661114, -360240, -4485020, -5022428, -2365990, 4804458, 3102577, -20969640, -7886097, --6263136, 3936875, -935766, -4526359, -2920041, 11787538, -4890357, 9048959, -8593156, -6465537, --9302899, -5087926, -9887015, -1576790, 13116830, 3041374, -1627793, 1534377, 5551245, -153545, -6852084, -3923453, 2614025, 3812857, 4633196, 1803886, -871878, -9171366, -3431679, -4734128, -18790, 2908767, 2503966, -1896228, -708133, 3798899, 1548873, -3064459, -1316408, -2166274, --985695, 112743, 1931125, -1657321, -1622424, 4840428, 4076461, 1246077, -637803, 1713692, -3323231, 188979, -3059627, -358093, -3121904, 719944, -2809982, 1559073, -4690641, -5100811, -3808562, -9479530, 557809, -22160420, 5369246, -7236483, 2138894, -7522099, -16397648, -2490007, --3836480, 11651709, 4900021, 4218195, -417149, 15455440, -11613055, 2868501, 4356708, 11951820, --13748190, -7791608, -2740726, 1175210, -941135, -3854196, -1296543, 4160750, -7411503, 1556389, -4351876, -799401, 577136, -5916318, -6849936, -4179540, 18420040, 219043, -4499515, 7224672, --4444218, -9222369, -7614440, -4972499, -1345935, 3326989, 670552, 695785, 10226854, 9417790, --1699733, 3395709, 2249489, -11764989, -8126078, -450972, -953483, -3032784, -8074002, 9976135, -11966316, -9749039, 6459631, 6136435, -1921998, -9312563, -15145128, -14609868, -11322608, -6598681, --13069049, 1261647, -10698227, 6486475, 5773510, 1026497, 129386, -18187040, 1196148, 415001, -1347546, -9284109, 3147137, 10453950, 1400159, 2710661, -8266202, -5046587, -1009854, -8636642, -2035815, 5505075, -2566780, -3155727, -3997541, 3470334, 5534602, -9592809, -5288179, -393526, -6465537, 2477659, -2805151, 2352568, -328028, -17180, 2916283, -1772211, 3755949, -4203699, --1498407, 3224984, 2744484, -974421, 7267085, 558346, -4529043, -3766686, -632971, -3084324, --2856690, 487479, 2065879, -1250909, -9032853, -7677791, -5236102, -6020471, -1839320, -13604846, -635655, 14735496, -5182415, 7730941, -3085934, 14689862, 12526809, 5092758, -15308874, -4013647, -20509006, -5378910, 15208479, 2291902, -14539538, -7470022, 17179332, 277025, -11523934, 177167, --9823664, -1447941, 3496640, 1314797, -1955821, -17202954, -15184857, 4101157, 11007464, -9867150, --850940, 4193499, -724776, 1587527, 18276696, 3271155, 2669859, 1490891, 6047314, -8178155, --5723044, -4240744, -19245748, -6622303, -7218767, -5071820, 5087389, 3310883, -1212255, -2000918, --7611756, -11622718, 15069430, -3325915, -13233331, -6280316, 2695629, 10014790, -7994545, -2580202, --8485782, -1668595, -10139881, -2026151, -2159295, -20454782, 1872069, -6935836, 14121852, -3706020, --11474005, -21687974, -14256607, -2761127, 1795296, 7531762, -5592585, -5173288, -11780558, 10733123, -18228378, 1880122, -2160906, 6158446, -4761508, 6817187, -5141076, -2524904, 2346663, 5208185, -3783329, -6402723, 221728, 1296543, -84289, -484258, -1600412, 1696512, 6471442, -2736968, --5690295, -268972, -1276679, 2946885, -47245, 6277095, 435939, 2288681, 221191, -3867618, -1009854, -1552631, 6754373, 387084, -4308389, -818728, -1049046, 4519380, 442919, -4949413, --767189, 3487514, -1618666, 855235, 7036230, -24910810, -12749610, -8559333, -13653701, -7281044, --5600638, -14122389, 14839649, -4289599, 22408992, -11310260, -16947404, -3283503, -11385421, 19313394, --6666863, -10172093, -4737349, 5184026, 9791989, 8435853, -2061584, -2259153, -4448513, 2134062, -15889768, -418222, 1493575, -5119064, -2034741, -8329552, -2749853, 3701188, 2714419, -6885907, -304406, -10191957, 2019172, -3042448, -3078955, 4168803, 1911797, -4744328, -1931662, 8718247, -3246459, -7212861, -9526774, 15856482, -785979, -25239376, 13100187, -2796024, -10759430, 5090610, --1593970, 1162326, -2498060, 8785356, 3353833, 904628, 24206972, 23944442, -8494908, 2619393, --18044232, -3818763, -3510062, 7649337, -2807298, 1248225, 7336341, -5439576, 13794898, -5848672, -1464584, -18754512, 7732015, -4876936, -13192529, 6600828, -3101503, 26420492, 6224482, 5041755, -9705552, 1100049, -9290014, -727997, -3873524, -2260764, 2574833, -3263638, 5306969, 3307125, --4112968, 6739878, 3738232, -4408247, -1238561, 412317, 599685, -1802813, 1355062, 2370822, --720481, -1969243, 373662, 2109903, 1153736, 1601486, -4338454, 4324495, -8599061, 7570417, --5094368, -2910914, -674847, 3954591, 5529771, 1521492, -6562173, 78383, -2713883, -1534914, -1440962, -6193343, -11389716, 3335579, 29972966, -22464290, -7180112, -14201309, -9440875, 11394548, --12914967, 27544700, -3206730, 8453033, 1547799, 6733972, -17073032, 3189550, 4511863, -1208496, --2547453, -1446330, 5077188, -10448582, -6345278, -1434519, -2949569, -12928388, -11506754, -3039763, --5308043, 15735150, -4060355, -7383586, -5347235, 5442261, -8029978, -3361349, -13917305, 6577206, --5302674, 5801427, -4911295, 7363185, -3710852, -24004572, -12228846, 3594888, -1853278, -1429687, --7480223, -14281303, -802622, 6349036, 4262755, -3218541, 4741644, 7403987, 22825066, -9747428, -10823854, -25632364, 1636383, 3801046, -3031173, -7342784, 5223217, 993211, 1206886, 5791227, -18145700, 12327093, 9306657, -4836670, -5834176, 8995272, -10911901, 2711735, 9188009, -6477885, -22694608, -329639, 7053410, -6169184, 13094282, -12432320, -12250320, 416612, 4602595, -5609764, --1363115, 14180908, 139586, 12911745, 4722854, -1982127, -2032593, -7349226, -587874, -379568, -3644817, -469225, -5912023, 1035624, 2663954, 7320235, -10674067, 1847910, -5417028, 2260227, -6098854, -2083596, -165893, -5571647, 1837709, 2083059, -3611531, -12855374, -8049843, -5080947, -2495376, -6794102, -3859565, -4556961, -4082903, 2585570, 4967667, -142271, 4121558, 1582696, -2195802, 752693, -9295383, 7886097, -6860674, 12038256, 35474820, 25130390, -6750615, -15731928, --10660109, 21538724, -25599078, 1370632, -6489696, -6278169, 10467372, -18764712, 2501819, -9599789, --237297, -13057237, -10073309, 1522029, 683437, 524523, -12608950, 20099910, 4072703, -8993662, -3645354, -2656974, 1766842, 29968134, 9469866, -8367670, -7361574, 1453846, 9300215, 2507187, --22405234, -5517959, -15487652, -5174362, -7248294, 7568269, -4173635, -2129767, -143881, -773094, --10981158, -12758737, 8316668, -4833986, 2256469, -600759, 11162620, -9061307, -6470905, 2837363, -4669167, -11995844, 13396540, -8391829, -19522774, -18213346, -6500970, -5229660, -7888781, -4083440, --27757300, 9800042, -13166222, -4183298, -10989748, 15391552, 5010080, 7363185, 4295, -2365990, --13418015, -4064650, 18139794, -14931991, 21980032, 16769700, 5909875, -3960497, 776852, -3106872, -3176665, -9712532, -7786776, -4849018, 1360968, -1333587, 1417876, 4096325, -7026567, -1759863, -7125888, 7392176, -2881386, 4592394, -3900904, -6346888, -2765959, -2002529, 4734128, 1246077, -1806034, -6280853, -4066260, 2139968, -2278480, 1987496, 2656974, 4424890, 8847096, 3473018, -4991826, -5950677, -3346317, -2065342, 2655901, -2918430, 1258425, -2706903, 1316408, 8888972, -4296041, 2375117, -1628330, 5569499, 1872069, -2394981, -34999688, -4329864, 23318988, -28592134, --11374147, -688805, -8740258, 10372346, -5928666, 32329830, -3222299, -7023346, -5320391, -1424319, -9505299, -6419366, -6197638, 26382374, -19281182, -2346663, 6192269, -4268661, 16560320, 9310952, --1091459, -2068564, 7067906, 9379672, 10271414, 8369281, 17525078, 5564667, 7580618, 4544076, --5594732, 29214904, 3751654, 5452998, 7459822, 4344897, 21167746, -1512902, 5283347, 7263327, -6175089, 3438121, 13993540, -8248485, -6567542, 13841069, -2469069, -13997298, -3515431, -24464670, --8240432, -4708895, 23222888, -21925808, -2760053, 935766, -679142, -1277216, 13722421, 37376952, --6456410, 4672925, 4345433, 5653788, 17908404, -19351512, -19783694, -18060338, 31908922, 2339684, --11913702, 29220810, -11086384, 25473452, -13660680, 9763534, 1140314, -33916284, -4866198, -8492761, -9771587, -718870, -2861522, 201863, 6163278, -926639, -10223633, 5524402, 208843, -4814122, --39192, -9038759, 12187507, -1322313, 4410932, -5775658, -5147519, -5165235, -6834904, -665183, -249108, 11558294, -471910, 1267015, -4583804, 1277753, -10923712, 3481071, -10528039, -1970853, --2240362, -9457518, 5051419, -7489886, -7476465, 1644973, -10446434, 3216394, 8427263, 7821673, --3908957, -3698504, 2059974, 3170760, 7330436, 9298067, 20734492, 1889249, -20896626, -61448096, -12311524, -14756971, -23753854, 26623428, -15943992, -8203388, -23392002, 6077916, -4626754, -22852448, --7398081, -13566191, 6416681, -12562779, 645319, 4909685, 10313827, 5245229, 17447230, 2758443, --89121, -1792075, -14623290, -11238319, -10401337, 8463233, 13054016, 6071473, 4665945, -355945, -5066988, 10226854, 23836532, -11249056, -6227166, 4193499, -10770704, 11471858, 2530810, -10394895, -24260122, 8863202, -20342038, 8075076, -19566260, 2343442, 3790309, 10347113, -5529234, -6602439, -30835718, 11986180, -13195750, 8062728, 16334297, -12608413, -26801670, 14936286, -2111513, -277562, -2253247, 6568079, 41712184, -3842922, 5260798, 8017630, -82678, 9612674, 5647882, -22069152, -4744328, -11722576, -10229001, -6149857, 5092758, -35662188, -4292820, 11191074, 1820529, 17795660, --12991739, 12620761, -8468065, -3685619, -4744328, 5681168, 2524904, -4319664, 88047, 46708, --6273337, 5105106, -7933342, 8457327, 1178432, 5909338, 5035849, -3551401, -2915746, 1531693, --2172180, 1280974, 2001992, -3446175, -1214939, -3968550, -2774549, -2583960, -7106561, 194884, -1048509, 4225711, -2257542, 4072703, 9767293, -5033165, 1639604, -5050345, 2615635, 3144990, --8137353, 144955, 2674691, -7676181, -3799436, 6787122, 110059, 1395864, 1535988, 310848, --19010062, -21875880, 46920372, 10037339, -3032784, -5647882, 10582263, 42406360, 19449760, 5079336, --1229434, 14221710, 35408784, 8818642, 12206834, 11050414, 25244744, -16267726, 16350404, 7277822, --48476760, 14369350, -6857452, 14382235, -15097347, 11411728, 7567196, 15069430, -122407, 6399502, -2357937, -13744432, 6855842, 13651554, -11446625, 6868190, -11115375, -6671158, 34750580, 3565360, -30767536, -21883396, 9579388, -1107565, -4408247, -675384, -2678986, 4795331, 11274826, 7837779, --861678, 17596482, -28032178, -26405996, 19160922, -15023796, -3879966, -3507915, -18130668, 9148817, --4783520, 5168457, 2804614, 29795798, 14457934, 15706159, 5887864, 4221416, -27097486, -6228777, -13318694, -248034, 331786, -20938, -8700530, -23563264, 4502200, 2180233, -17651242, 2493766, --8486855, -6973417, 7396471, 4984310, 26723286, -3835406, 6787122, 6382859, -5159330, -6913287, --764504, -6572911, -2545305, 15739981, 6565932, 2838437, 770410, -306016, 358630, -215285, --957241, -10709501, -3288871, 6513855, -1891396, 638876, -3988951, -5420249, -2228551, 1714766, -12754979, -8540542, -8263517, 7495792, 3657165, -9592809, 6721624, 4048007, -6818261, 8513699, -673773, -5145908, -2420751, -3575560, -1644436, -1670742, 4203699, 2107755, 2081449, 4829154, -7025493, 5214627, -1414655, 12181064, -42531988, 36284956, -15293842, 7169374, 23478438, -34000036, --887985, -2732136, 8287140, 12954158, 14776835, 25667798, 4304094, -16168941, 9039296, 27325118, --38501696, -22428320, 25861072, 1556389, -199179, 1452773, 2215130, -464930, -665183, 13451838, -8108362, -18258980, 1174137, -4968741, 32160178, 19684908, -6576669, 2180233, 3864397, 4236449, --215822, 11924977, 1168768, 9217000, 32822140, 4768488, 3452617, -4727686, 8422968, -30983358, --13526999, -12888123, -1405528, 3536906, -27557584, 11044508, -24460912, 8450348, 25334402, -5383742, --22834194, -12093017, 9426379, -4337380, -46627776, 12857521, -32548872, -6999186, -4061429, 1149978, --13059922, 3375844, 16409459, -13438416, -30931818, -46416784, 36294084, 11078331, -5702106, 10386305, --10996190, 11097122, 20125680, -20912732, 36080948, 4978941, -3846143, 16765942, 9511742, -5814312, -9315247, 682363, 10055592, -9786083, -5213554, 2716030, 7265474, 12521440, 3721052, 11286637, --7473780, 6406481, 11726334, 10407243, -1745904, 9474161, -10183904, 4032974, 960462, 4359392, -19551764, -13064754, 7770670, 1063541, -745714, 15260019, 4166118, 19895362, -2624762, 9827422, -2599529, 7752416, 2216203, -4092567, 5951751, -10282152, 8870718, -3810710, 7344394, -1763084, -1967095, -834297, 1474784, -148176, 7689602, -1758252, -1918777, -1045825, 3274913, -383863, --862215, 359704, 1599875, 1101659, 1327682, -964220, 1326608, -1131724, 1253594, 881005, -1402844, -2665564, 51849920, -55794848, 22557706, 28368258, -34955664, -10785200, -18817862, -10368051, -51481624, -23176180, 36536212, -17150342, -4916664, -9289477, 11978127, 4466766, -44513040, -8513699, --11778948, 19084150, 1006633, 7926899, 15503758, -21889300, -4005594, -14048301, 7834557, 17969070, -11332271, -28268402, -4829154, 5411122, 3838627, -1978369, -13139916, -5692979, -25238302, -4868883, --3417183, 23096724, -20577726, 50705848, 11340324, -15112379, 22601728, 576063, 29320132, 15714212, -27836756, 6585259, 25446608, 20431696, 24902220, 25905096, 4122095, 25062744, -32196148, -5788006, -6958384, -21525302, -3532611, 13222057, -24932286, -36954436, 14950244, 23682450, 940061, 5331665, --25549686, -7089381, -21339546, -993748, 24780888, 1891933, 46139224, 20700668, -11410654, 48364016, -25862146, -14409078, -5339718, -10323491, -15190762, -9879499, 12099460, -7003481, -23635206, 3832185, -16938278, 549219, -7600482, -6337761, -4739497, -8083129, -14220637, 2483565, -3103651, -1959042, --10909217, -1071594, -3673808, 4863514, 8227547, -2456721, 1862405, -3238942, -8432095, 5634460, --2040110, -6771016, -16175921, 7628936, -22397718, -3192235, -15422691, -9616432, -12474733, -3329674, --1677185, -4666482, -8614631, -4429722, -9868224, -1910724, -814433, -785979, -6485401, 10416369, --7896834, 4930623, -72444824, 66055524, -14985141, -21896818, -19305342, 45788648, -34743600, -5507759, --9978283, -303332, 24504936, -27210766, -2507724, 10947335, -8248485, -3500398, 621697, -15336791, -21906480, 1441498, -35865124, -8838506, -8728447, 2416456, -39306468, -127775, 4617627, -7586523, -275952, 10936597, 24162412, -9818832, -6183143, 5389647, -16285442, -50299436, 4307852, 40317396, --20524038, -30874910, 2071785, 32571422, -15166603, -9434969, -41966124, -6585796, 788127, 30090004, -13792214, 4017942, -31664110, -17869748, 24807732, -29637958, 10474888, 49550500, 27864138, 38466264, --18524194, 22498650, 14165339, -42717208, -15808164, -22869628, -5694053, 25404194, -1215476, 27458262, -22151830, -42450384, 47469052, -28755880, -137976, 2567317, -21830782, 47036872, -3188476, -10773925, -37654516, -30516280, -5308580, -43592308, -14920716, 20081120, -6245956, 18177376, 19390704, -4416837, --7683697, 3409130, -10741713, -12288438, -3507378, -9024263, -5515812, -7294465, 3102577, -9094593, -1775969, -11497627, -11453067, -10056666, 8476655, -5900748, -1047972, 5995238, 1407676, -2010045, --12504260, -19389092, -12584791, -25303262, 18629958, 7809861, 16122770, 5878200, -13807783, -13962402, --7364795, -1902671, 20476794, -4225711, -141734, 2792803, -3307662, -3311957, -1770600, -7652558, -14258755, -8950175, 18296024, -94489, 43173548, 30640296, 4515621, -8260833, -22429392, 13139379, --1762010, -2000918, -1424855, -736050, 95026, -8570070, 10871636, -206158, -38528004, 9684614, -3453154, -13310104, 508954, 16663936, -5613523, 1134408, -27860380, 20307680, -9913858, -2983929, --2809446, 11570642, -15098958, -536334, 3433826, 481573, 3190624, -7138773, 20634096, -10790032, -36373004, -22355304, -23862838, 22515830, -25214680, 1355062, 18797998, -17377974, -7771207, 10054518, -11703786, 15535434, -55486144, 17707076, -527744, -12652437, 35184372, -17615808, 2158758, 224412, --29878476, 38338488, -1826972, -1625108, -20132122, -3584687, 31584116, -7317014, -1189706, 1305133, -9105868, 5301064, -39005820, 19284404, 34756484, -18206366, 13925358, -27152784, 45565308, 2103997, --42527692, 628676, 23722714, -2342368, -26419418, -5892159, 62081604, -9614284, -25572236, 4354023, -27387396, -7030325, -8560407, -3169686, -1214939, 1662152, 1235877, -6905771, 18079664, -2877091, --4247723, 1066226, 6175626, 15202037, -4522601, -7346542, 8346195, 1934883, -14010720, -5067525, -7520488, 1773285, -5852967, -3095598, 12079059, -10929618, -2209224, 1933272, 1738925, -10318659, --4187056, 13474386, -725850, -9607305, -4088272, 9780714, -2858301, -7201050, -6155225, 8553964, --24212342, -80252536, -121662464, 8208756, 105224552, 1657321, 275283776, 249527392, 149385936, 288067744, -189007552, -31211528, 10933913, -36941552, -226762464, -128756680, -99783904, -221475360, -182144192, -53716620, --106925360, -122781840, -10005663, 7328288, -51941724, 11409044, 46994460, -59993712, -51007568, 80447424, -16457241, -19468014, 56136296, 75351440, -95026, 77290624, 130810208, 46902652, 35880156, 133387728, -90148680, 10921565, 97915056, 144494512, 63469952, 73898136, 164641136, 62550828, 22469658, 157276864, -154773440, 47864728, 186415536, 265127264, 98820216, 108856480, 184854320, 56422448, -59852516, 10631118, --61479236, -222722512, -212468816, -226881648, -364529440, -393987552, -421357760, -498292448, -521311872, -509161408, --495585536, -436274176, -391560352, -320140960, -211549680, -150965952, -52153252, 143920592, 233397648, 230576928, -426933696, 455305728, 354357344, 431855200, 452352928, 242871808, 253343472, 310701152, 150802208, 122003376, -201604160, 146323632, 68690488, 95245192, 127449400, 54249196, 44214004, 128094176, 67640904, -11609297, -70111584, 54817740, -40045740, 5582921, 50444928, -33292438, -14607184, 94714232, 37373732, 3594888, -91035592, 59886340, -9008157, 4949950, -39962524, -134073848, -182550064, -201753936, -264710112, -283097408, --282916480, -306338528, -309315488, -323811552, -324899776, -296906784, -295007872, -247531312, -191290320, -151409952, --63475860, 55115168, 118241520, 197481520, 246926800, 261653696, 249303520, 227543616, 193117840, 156853824, -136414608, 119386136, 97623000, 88011400, 85248656, 77701864, 72557032, 75857712, 70376264, 58717036, -49600428, 38540352, 20977158, 8018704, -12636868, -28193776, -28339804, -18241262, -8790187, -2099165, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ -2938295, -9543417, 2138357, 1384590, -2166274, -790274, -4711043, -202937, -1203128, 3533148, 3134253, --3160022, -2272038, -1909650, -1809255, -2250563, 246961, 2811593, -2234457, -2403034, -7866770, --5793374, -4255776, -199716, 423591, 5768678, -3178813, 2858838, 1768990, 1469416, 346819, --4310000, 1104880, -9188546, 1120987, 283468, 433792, -630823, -5666136, -2583423, -4884452, -299574, 314606, -2954401, -7584912, 5214091, -366146, -4439923, -20938, 2958696, 644245, --1531693, 1078037, -2528662, -1090385, -2386391, 1837172, -2539936, 3576097, 2891587, -573915, --5054103, 264141, 697395, -449361, -1852742, 1279900, 898185, -1152662, 2730526, 2974802, -2052458, 196495, 12885, 951335, -2745021, 380641, 4224637, 493921, 807454, 782221, -3121904, 1199907, 981400, 2801929, -692027, 2206003, -862752, 1439888, 1010928, -384400, -598074, 813359, -249108, 1029182, 1577327, 376883, 33823, 1118302, 1486596, 1187559, --178778, 451508, 487479, 580357, 170725, 93952, -114890, -370978, -1174674, 765578, -85899, -10144713, -11386495, -808528, -4500589, 3477850, -5578089, 1401770, 2582886, -3804267, -3113315, 11394548, 643171, -1048509, 6249715, 846645, 6275484, 97174, 2867428, -4484483, --5938329, -321586, 2261300, -4132832, -1324461, -419296, -1159641, 1131724, -1207960, -2182917, -2072322, -1029182, -858457, 4476430, 6391985, -1990717, -3423626, 1270774, 5117991, 1939178, -6557342, 273804, -910533, -168577, 5853504, 375273, -4168803, -2296197, 4598836, 3326989, -3580929, 970663, -2263448, -4721780, 947577, 2221572, 2772402, -1017907, -2458332, 5103495, -3445101, -847719, -2838974, 170188, -1969779, 5319317, 1651415, 974958, 1720671, 593779, -1126892, 3267933, 602369, 3282966, -610959, 5233418, 667867, -5180268, -2020245, -1805497, -2602750, 3197603, -483721, 853625, -3591667, -1319092, -3342558, -1027034, -2166811, -1876901, --759672, 1097901, 83752, 28991, 178241, 1447404, 266288, 328565, -143881, -1555315, --402653, 80531, -114890, 627065, 276489, 267899, -552977, 5978595, 4192962, 6295349, -6554657, -1571421, 3285113, -1404991, -3711926, -346282, 9709310, 4249334, 2170569, 3453691, --4043175, 6919729, 2972117, 4636417, -1362578, -7682086, 3234647, -11986180, 2438468, -3061775, -2416456, 1888712, -218506, -4126390, 1002875, 2691871, -1596117, 2524367, 6085432, -436476, --5029944, -6867653, 1081258, 3069291, -6312528, 3514894, -5931887, -3876745, 4322885, -2507187, --5012764, -2448668, -3533684, 5548024, 7627862, 4314295, -2731062, 32749, 4078608, 2430415, --336081, -3114388, -1469953, -2733210, 2909304, 9422085, -66572, -5111011, -4027069, 2185602, -775242, -1915555, -5571110, -103616, -4771172, -1877438, 759672, -819265, 3799436, 708133, -4769025, 5541582, -4854924, -1789928, 278636, -3794604, -4547834, -728534, 28454, -2787434, -2676838, -2532957, -309775, 2108829, 430034, 151398, 2089502, -2561948, -880468, 606664, -968515, -1160178, 835908, 454730, 943819, -142808, -16106, 960999, -1304596, 1675574, --1306744, 820339, 260382, -372052, -99858, 745714, -535797, -872415, -1476932, 925565, --1083942, 406948, 1414655, -194347, -900333, 13376139, -3593814, 1304060, 1909650, -8822937, --7517804, 195958, 8742406, 6670084, 10567767, 3485903, -2982855, -4547297, 779000, -2610266, -2083059, 1009854, 3570729, 6564858, 2091112, 4840428, -136365, 2870112, -2913062, -6114960, --3205119, -4680441, 63351, -1306744, 1427003, -7449621, -3719442, -996969, 2756295, -3682398, -7719130, -8698383, 1866163, -5477694, -4443144, 2529199, 2216203, 7447474, -827318, 1882269, --2126546, 5216238, 5512591, 1532767, -1188632, -5604933, -777926, 1934346, -4297652, 4307316, --4730907, 2029372, 7820062, 6554657, 96100, -2525978, 1224603, 7818451, -977642, 1921998, -1214402, 6388764, 62814, -1706176, -3968550, 2785823, -5980205, 2175938, 12436615, 3056943, -5855651, 579821, -8229694, 2974265, 1527398, -3248069, 3356517, -1043677, -897111, -4105452, -1714229, 4036733, 1801739, 775242, -1876901, -4041027, 932008, -805843, -631360, 258772, --206695, -765578, 1299765, -1379221, -1255204, -1188632, 1829656, 731218, 1439351, -814970, -1327145, 72478, -1313723, 1404991, 765041, -1166621, -2226941, -813896, 1827509, 111669, --484794, 917512, 828392, 1986422, -96637, -782221, -4876936, -8341900, 4207994, -5947993, --6132140, 1263794, -2972117, -19624242, 1901597, 3032247, 17962626, 5820218, 1329829, -8154533, -7485055, 3246459, -3260954, 3926137, -682900, 6531572, -3942780, -2018635, -1329292, -1730335, --2708514, -1168768, 4634807, 4062502, 7014219, 2514703, 3439195, -64425, -4571993, -4932770, -6643241, -3633006, 1472637, -591095, -4699768, 6752226, -1132261, -2913062, 1169305, 4918275, --3272765, 7463043, -9454297, -7807714, -9588514, 2330020, -5405217, -8191577, -1896228, 7674570, --3258270, 2309082, 4537633, -3288334, -4336307, 357019, 695248, 2572686, 456877, -2384244, --288300, 9885941, 4177393, -4020626, -12447889, -9927817, 3617973, 11758547, 9867687, -7704098, -181462, -5025112, 2210298, 1956358, -8442832, -667867, 1651952, 986232, -2305324, 504122, -485868, 256624, 2837900, 2614561, -1703491, -2055142, 1380295, -999654, 634045, -2940979, -1183800, 877247, -4714801, -1058173, 984621, 710280, 361851, 919660, -315143, 339302, -321049, 463856, -1739999, -243203, 574452, -549756, -2109903, -1045825, 251256, 320512, -2234457, -3506304, 5814312, -9774809, -1626719, -12113418, -3509525, 1795833, 4269735, -11041824, --2705293, 7562901, -867583, -11052025, 5772973, -3537979, -6276021, 3462281, 5844914, 1312113, -1260573, 1998234, 7622493, -3596498, -3102040, 1980517, -3710315, -1915019, 145492, -426812, -296890, 6073621, 3160022, -706522, -488016, 3549254, 1532230, 4359392, -337155, 4921496, -5251135, 2076617, -5646809, 821949, -757525, -4045859, 5514738, -3104725, 2332167, -3758633, --1343788, -13534516, 1275605, 10987063, 1006633, 11680164, -2120103, -2625299, -11992622, 14113263, -6683506, 8041790, 1350230, 6591701, -42413, -51540, 5532455, -3215320, 2021856, -22549, --13455059, 3094524, -3133716, 3563749, -2002529, 3216394, 12546136, 3775276, 3326989, -151934, --7574175, 5705327, -3059627, 1144609, 2889439, 3761855, -4160750, -1105954, -1708323, -2265595, -2467459, -1424855, -1069447, -1779727, 310848, 456877, 207232, -3501472, 1422708, 607201, --768262, 1010391, 505732, 881005, 746251, 1663763, 30602, 354335, -198642, -804770, -2110977, -394600, 2968896, 459025, 1243393, -910533, 1639067, 545461, -15541339, -512712, -11682848, -2560874, 6914361, -7457137, -5145371, -13425531, 7663833, 3978750, 8898635, 4160213, --4393752, 7503308, -1903744, 7179038, -4734665, -4372814, 536871, -1605244, 6210523, 1304596, -5235565, 5864241, -3523484, -2997350, -2085207, 3862249, -806917, -2492692, 783832, -5280663, -2715493, 1870458, -2792803, 3907883, 6849399, -2746095, -3130494, -827318, -5201206, -2517925, -7873749, 1073742, -4903242, 9592809, -10563472, 1671816, 5631776, -2413235, -3490198, -773631, -4486094, -8043937, 4013647, -3263102, -6929930, -5174362, -4195646, 157840, -1993939, -4397510, -1879585, 11915313, 6549289, -1606855, -4115116, -11503533, 1195075, 6417218, -3780108, -12713640, -314069, -1977296, 611496, 1628330, 5812165, -317291, -3000572, -1103807, -4679367, -2716567, --2229625, 3535295, -2917894, 3283503, -6818798, 604517, -3148211, -2040110, 4096862, -1932198, --1982664, -2335389, 810675, -4298189, -1767379, -957778, -204011, 969052, -3113315, 912681, --2477123, 1391033, 1577864, 3608310, 633508, 1332514, 1842004, 1481227, -1057636, 623307, -188442, 2697776, 1501091, -226023, 1555852, -86436, 106300, -1043677, 130460, 55298, --1912334, 603980, -1330366, -947577, 102005, 1455457, -428423, 5170604, -2277407, 1315334, -7642895, 496606, 8953933, 9706089, 21658984, 14770393, 9057549, -2302639, -11473468, -4002910, -10510859, 4544076, -11082626, 8267812, -1934883, -5501316, -6782827, 1008780, 18724984, -12695923, -13540421, 5281199, -2919504, 4443681, -3663070, 9686225, -3723200, 5113696, 1016834, -6731288, --4713727, -6558415, 248571, 5536750, -1604707, -3701188, 3568044, 454730, -1122597, -12674448, -3831111, -7103876, -5374078, 3487514, 8346732, -6174553, -8885214, 307627, 7534983, 614180, --5066988, -1895691, -3017752, 3429532, 2502892, -2922188, -4789426, -7198902, 4444755, 11527692, -7065221, 3636227, -6696391, 3462818, 7299297, -8202314, -10703595, 1865626, -8837969, -4233227, --17324824, 217433, -11897596, -6203544, 3198140, -1500554, -1145683, 5261335, 895501, -9711995, --6733972, 4371203, -1344862, 524523, -3022046, 280784, 2833605, -427886, 1877975, 1885491, -388158, 173409, 1393717, 1626182, 1082332, 122943, 335544, -984084, 2563559, 62814, -2359548, -426276, -1570884, 759672, 2196339, -2760053, -4049617, -2070174, -586263, -1273458, -4604742, 1728188, -1449015, 2041720, -1166621, 302795, -3710852, -338766, 269509, -1705102, -23699092, 530428, -9276592, 10445897, -11426224, 13224204, 1072668, -8055748, -13795435, -3344169, -6769942, -10969883, 9735617, -1555315, 6277095, 7473243, -6415071, -2672007, -3860102, -5113696, --1985886, -4777614, 798327, -5839008, 6075231, 3833258, 5099737, 10337986, 5325760, -1544578, -12336757, 6284074, 2282238, -6622303, -7215008, 3696893, -5522254, 1268089, 3901978, -8239358, -7056095, 18787798, 1437203, 13361106, 6331319, 6462852, 9546639, 552977, 5062156, 5337571, --12158516, -8253317, 8397735, 558346, 7926362, 1407139, 8321499, -1346472, 2997887, 2066416, --17418776, -1150514, 4485020, 11656541, 2611340, 10223096, 1047972, -2413235, 3364033, 4585952, --9772124, -16542603, -8719320, 2273112, 4082903, 551903, 12152610, 4279398, -19016504, 4842576, --2747705, 100395, 5489505, -7638063, -245887, -4115653, 3518652, 4920422, 316217, 1062468, -3578245, 144955, -13959, -1648731, -1804960, 647466, 380641, 122407, 2994666, 2158221, -772020, 1791538, 1178969, 85362, -2889976, 2334315, 1935420, -1141388, -226560, -396748, -173946, 1711008, 1447404, 4519916, -3753265, -1065689, 1729261, -913217, 2406256, -1867237, -3999152, -923955, -1162326, 580357, 2312303, 1631014, -507343, -232465, -11432129, -1044214, --10172093, -4860293, 4369593, -5224291, 2365990, 3445638, -6068252, -15291157, 4963909, -15149423, --17293686, 3725347, -8462159, 7620346, 11013907, -2844342, 12839805, -3134789, 12687333, 17131014, -112206, 967441, -17256642, -3326452, 1978369, 2922725, -1928440, -11476153, 898185, -9725417, -1336272, -2655901, 2739652, -3763465, -6308233, 1409823, -1038308, -3579855, 4174708, 360777, --2541010, 12365211, 4713727, 9272834, -5781563, 1673964, -4858145, 3506841, -1003412, 4838818, --1531156, -3722663, -4653597, -11021960, -6373195, 17671642, 7277285, 11706470, -13489419, 2822331, -10159208, -8606041, 184147, 6528351, -3452617, 6551436, 1047972, -11911555, -2979634, -18314814, --2153926, 7332583, 3917547, 12229383, 1495722, 8110509, 8799314, 2980707, -437013, 15856482, -1454383, 375273, -2616709, -1610613, 8527658, 4890894, 8162586, -998043, -1544041, -2103460, -5995775, 1152662, -1108638, 1544578, 4153770, -1012539, -2253247, -4726612, 289910, -3783866, --1527398, -3237332, 2811056, -441845, -5332739, -1079647, 544387, 329639, -126165, -2660732, -3864397, -3093987, 1096827, 1323387, -3977140, -854162, -2605972, 472446, 3456375, -3031173, --2240362, -1922535, -1637993, 1750199, -11148661, -10152229, -10554345, -15652471, 10706280, 6755447, -1047435, -10572599, 9551470, -203474, -13103408, -10914586, -3675418, -2811056, -8360154, -3452617, --4922570, -4373351, -3039226, -12332999, 6196027, 7024419, -552440, -1263794, -2146947, -4640176, --14420890, -15947750, 562641, 6733972, -4100083, -9875204, -5396627, 7282654, 5529771, 224412, --2973728, -4323959, -4167192, 9241159, -4703526, 6453189, -4447439, 52076, -15699179, -3579855, --1173063, 11759620, 3341485, -2935073, -8799314, -6314139, -12344273, 19880866, -9146133, 18872086, -2488934, -8351564, 12613782, 12203076, 21417928, -21100100, 8732205, 3325915, 2883534, -4319127, --5960878, 9096741, 4850092, -1758252, -9773735, 10757819, -5684389, 11576011, 9751723, 9018358, --8269423, 17966386, -13343927, 7282654, 11744588, -6914898, 1511829, 153545, 10209137, -2886755, -4563403, -5488432, 10904385, -535797, 1952063, -6426345, 5003100, -540629, 5158793, -1683627, -6936909, 3168612, 2218888, -4275640, 1347009, -3616363, 241055, -3113315, -3870839, -1001801, --3414499, -2523293, -326954, -1978369, -3403225, 2138894, 2910377, 3994320, 1024350, -4175782, -413391, -2897492, 2711735, 879931, -1896765, 280247, 1907502, 878321, -4400194, 623307, -4496294, 1499481, -660888, 1028645, 16922172, -28350542, -30653182, -19094888, -3302830, -13282723, -8122857, -10908143, 1043140, 5580237, -909996, 20215874, 14413910, 5230734, -5988258, -4390531, -13995688, -2261300, 2092723, -5673115, -12660490, 132607, 5000953, 3467649, -7000260, 6189048, -781684, -723165, 11843909, 16528108, 1089848, -10409390, -4613869, -20056960, -7900593, -5115306, --6141803, 1002338, 3435437, -7233799, -3022046, -10155987, 10951093, 13342316, 10951630, 12463995, -9634149, 16282221, 1890859, 5646809, 3748970, -2850785, 6145025, 9739375, -9780714, -33382634, --7890929, 11206107, -17442400, 8927090, 10833518, 4038880, -5378373, 923418, -4271882, -13357885, --3765613, 8830453, -10858751, -9016210, 3120831, -7306276, 21679922, 22242026, -8321499, 14348949, -3653944, -2020782, -9820443, 6897718, -13208098, -10751377, 11787538, 9067750, 6184216, -772020, --1272384, -15883863, -11593727, -2039036, -3754875, -2910377, -2514167, -4659503, -4037806, -4341675, --2333241, 632971, 3634616, 3027415, 4858682, -373125, -2509335, -2345052, -1762547, 7239704, -6549825, 3497177, -755914, -420907, -1675037, -2658048, -4325569, -1817308, 617938, -1210644, -2769180, -1518271, 952409, 1409823, 1089311, 2768643, -3349001, -43487, 502511, 2343442, --4009352, 6646999, -2901251, -1676111, 27279484, -22953378, -476205, 3941169, -22059488, -6452115, --9345312, 3360275, -6775848, 19145354, 2395518, -191126, 23776938, -1304060, -21210696, -16901234, --10453950, 8213051, -1320166, -20443508, 5155572, 5750961, 10667625, -12144020, 6084358, 10412074, -8910983, 7293392, -2615098, 12434467, 13264470, 4570919, -29956324, 21853868, -10828149, 8450885, --2309082, -3045132, 5575942, -13163538, -7697119, 14076218, -6561637, -1774358, 12527883, -14131516, -12597676, -4874251, 11682311, -15571941, 20690468, -9217000, 32097364, -4165582, 1853815, 8361765, --7320235, -5237713, -4108673, 2693481, -1845225, -16175921, -20600274, -5568425, 11644193, -6043019, --7619272, -20715164, 9366250, 2222109, -28627568, -329639, 156229, 4282083, 14387067, -9837086, -4334159, -12658342, -11391864, -16818556, -17110612, -2901787, -10115185, 12301323, -2287070, 12018392, --6073084, 6888054, -1221918, -7537668, -10888816, -1124208, 990527, 5288179, -2807835, 2383170, -758062, 4345970, -715649, -5540508, -1114544, -8433168, -696858, 1482301, 1583769, 580894, --3546569, -4038880, 4376572, 2273112, -1733556, 5437429, -7038915, -8840653, -498753, 8044474, --155156, 2404108, 2795487, 5535676, -28454, 6183143, -5310727, 2058900, 848256, 5047661, -8003135, -5104032, 971200, -1118839, 984084, 10377178, 31868658, 15681462, -9511742, 21720724, -7348152, -14096083, 5531918, 13991930, -2028835, -4939750, -19324132, -5408975, 12177843, 7727720, -5880347, 3414499, -3350075, -7938710, -18226230, 9671729, -6103686, 4762045, -13953812, -7758322, --183610, -2287070, 18255222, 5341329, 3054796, 13739600, 6821482, -21055540, -2275259, 7558069, --3752191, 333397, 18045842, 5780489, 20923470, -12176769, -7438884, -3502009, -7560753, 8044474, --7887171, 15531139, 15738371, -6934762, -15015743, 25368224, -12916577, -5380521, -2865817, 7494718, -4067334, -14288819, -4048007, 9002788, -6562710, 11443403, -5261335, 16250009, -8290898, 3605625, -25170656, -584116, 17792438, 30387430, 4054449, 14882062, -7527467, -36728412, -24632712, -4836133, --1359357, 20749524, -468151, 6888591, 1983201, -5255966, -16764868, -37898256, 28840706, 1903744, -1066763, 9288941, 4684199, -9296994, 21382494, 988916, 4693863, -332860, 1653562, -18723374, --6699075, -12366285, -7189239, -668941, -6700149, -7010997, 4569845, -1575179, -4534412, 13586055, --2301029, -13943611, -9679246, 3426310, 932008, -4085051, 21386790, 6323803, -6815040, -8225936, -2454574, -1953136, -4118337, 638876, 2210835, -4807679, 5286031, -207769, 7517804, 9357660, -2119030, -926102, -2556043, 6265821, 6394670, 5472325, -41344964, -9958419, 43298640, -16637093, --18471044, 38144680, -24419574, 21488258, 28833726, 11345156, 4041564, -21846888, 8454643, -38307352, --18767396, 8386461, 20025822, 2264522, 4712116, 14536854, 38871600, 26219164, 8319352, 1480153, -96100, 4353486, 3348464, -14986215, 475668, 9646497, 12284143, 51773684, 29315300, 19999516, -37515464, 15338402, -5164698, 11307575, -514859, 35871568, 13145284, -2817499, -5762236, 15060840, --2092186, 17285096, -53121768, 2432025, 18589692, -965831, 22459994, -8170639, 6111739, 11996381, --49417356, -19031000, -3642132, -15734613, -20316270, -24071682, 22957674, -14649060, 4797479, -4345970, -23051626, -37110664, -9961103, -5049271, 12001212, 44560, -3142842, 27737436, 48275968, -3758, -15230491, -8844948, 4347581, 33814276, -35388384, -20961052, -29563334, -37444060, -2978560, -1242319, --14536854, -15720654, -14799920, -14103062, -18198850, -26615376, -11402601, -17160004, -10342281, 4976794, -23983634, 7850664, 3921305, 3850438, -2005213, 5567888, 2640331, -16502875, -14788646, -4052302, --20975546, -8167954, -9055402, -7017977, -8054675, 10067940, -7415798, 921271, 1793149, 4534412, -12084427, 18238578, 136365, -4186519, 13348221, -6267968, 8631274, 3515431, 2151779, -3157875, -2710124, 1993402, -7307887, -9766756, -10598906, -1165547, 22807886, 19432580, -18272402, -66247188, --11587285, 26682484, 6460168, -7683160, -4984847, 1720671, -8887898, -12417824, 14754286, 10521596, -30190936, 10588168, 18238042, -7074348, 40101572, 6896107, 25505126, -3863323, 37011880, -14265197, -24192478, -23638964, 434865, 2294586, 17352204, -7028177, -12541305, -31165894, 17437030, 1986959, -3765613, -15207942, -27460410, -1973001, 3462818, -3685082, 8741332, 17571248, 2949569, 12490302, -45825152, -19441170, 4827007, -15273977, 23795192, 20164872, -22600654, 21338472, 24907052, -17856864, -6524056, 5557688, 17343078, 8196945, 34964792, 10697690, -12039330, 1851668, 45113800, 13984950, --51002736, 14908368, 9453223, -44346612, -11994770, -14348412, -30900142, 2041183, 19517942, 20890720, --12241731, 37736656, -9488656, -16668768, -8216273, 19870666, -74187504, -9277129, 1358283, 59880972, -8234526, 50750408, 24738474, 35571992, -730681, 12102144, -6573985, 30127584, 30999464, 27420682, --6400038, -18519898, -7237557, 30114700, -3284039, -19906636, -8315594, 35716948, 5276904, -22427782, --7349226, 32220844, 9526774, 13355738, -156766, 12112882, -8961986, -735513, -418759, 5202816, --581968, 5639292, -4213363, -10570451, -12143483, -15256798, -1721745, -11147588, 275952, -2028835, --4048544, 10689637, -11941083, -5032091, -11836930, -4512937, -21958020, -16586090, 22749368, 398895, --40840308, 33114198, 71446784, 4757750, -39609800, 61536680, -13791677, -920197, 8865886, 34893388, --19991462, 1476395, 69994008, -34677564, 16739098, 23535884, 22692460, -31015570, -3030636, 5539971, --15093052, 2635499, 7387344, -12615393, 12510703, -21381958, -5957120, -8567386, -1511829, -12840342, --11123428, -4153234, 6841346, -23315230, -21675626, 32747516, 6058052, -20523502, -5262946, 19477140, -47405164, -4127464, -22941030, 24669218, 36386428, -10540387, -2572686, 940598, 13253195, 98247, -158377, 16491064, -39934604, 27484032, -22983980, 295279, -32631014, 18387292, -2434710, -48932564, -24282672, -3492882, -18803904, 33022392, 4013647, 32652488, -27485644, -10576894, -11024107, -25546466, --39508332, -52441012, 44644576, 18196702, 32902134, 30215632, 18835042, 7294465, -18719614, 28611462, --14081050, -12040941, 38872676, 12935905, -7150047, -3474092, 11950747, -27456116, 7220377, -10850161, -18327162, -6984154, -11588359, 17346836, 3100430, -20409684, 1802276, -9671729, -5525476, 4317516, --4291746, 3733400, -949725, -14703284, -7262790, 6356552, -4720169, -9274982, 9365176, 14460618, -14386530, -11428371, -4494147, 16622597, -28021978, 8455717, 10524817, -12098923, -27838368, 14089103, -1958505, -12658342, 8968429, -13551159, -21616570, 5718749, 19788524, -16227460, -6780680, 6904697, -17307108, -4716411, -1907502, 931471, -11731703, 38742216, -15791521, 11476689, 8929774, -40184788, -36098664, 12632036, -10366440, 31018790, 2551748, 2064806, 15120969, -13485124, 39537860, -31793496, --17067126, 14745160, 13575318, 6720550, -29616484, -18015240, -32998234, 18177912, 4304094, 16598975, --47782, 17826262, 7125888, 5943698, 632434, 15185931, -6956774, 8339216, -15149960, 11243151, --14015552, -174483, -18475876, -13113072, 658741, -16406775, 7538742, 38893612, 9190156, -29275570, -15106474, 11645804, 20526722, 501437, 34216932, -29613800, 4367982, 13618804, -28646358, -6742562, -57328688, 32266478, -76258752, -32412508, 40296456, -11162620, -36288180, 14119705, -3890704, -27978490, -20229296, 34475704, -47119548, 9141838, 41442676, -28371480, -25560960, 33915748, 4333085, -28191628, -4738960, 21981106, -24755654, -3578782, 26604102, -4128537, -12243878, -19432042, 24300388, -6693707, -13417478, 2983392, 13624710, -9758703, 8704825, 24582246, 9471477, -18505940, 1165547, -13313862, --9193914, -18656802, -2018098, -5166309, -1667521, -12636331, 12279311, 10626823, -4703526, 28074590, --7570954, -30427158, 35878008, -4599373, -7315940, 6385543, 12280385, 1391033, -3806952, 30302068, -16383153, -21845278, 1359357, 8370355, -16087337, -13253732, 21665426, -11776800, -42505680, 40105868, -4654671, -41328860, -1723356, 21170430, -15918759, -34840776, 19323058, 26102126, -43011948, 5812702, -31408022, -19193672, -3855807, 34529928, -3174518, -14786499, 7616588, 14272713, -19772418, -5788006, -19931332, -5268851, 33157148, -72130752, -5623723, -12389370, -81151800, -13991393, -25345138, 8368207, -13424994, 24332064, -11101954, -31029528, -12344273, -44976896, 5639829, 16714402, 8964670, 7669738, --36980744, 22878218, 3121368, -43457016, 31644782, -46764140, -19746112, -17252346, 12393128, 34638376, -39209832, -2781528, -9341554, -75953272, 32403918, 77858096, 27797028, 2253784, -42926588, -61822832, --25999048, -4781909, 32136020, -38539816, -23717346, -39603356, -13175349, 72769632, 77541880, -13099113, --36334888, -30481382, -16888886, -7749195, 38865160, -18177376, 11354820, 8668855, 25726318, -6694781, --17989470, -45035416, -20135344, 69836704, 29317446, 46643880, -42712376, -22981296, -19984482, 47656956, -591095, -76229760, -74381856, 41947872, 70997424, 120196272, 20579872, -101145408, 16658031, -26336740, -34223372, 33849712, -124907312, -39190504, 23990076, 66180076, 15621333, -62846644, -14542759, -5777805, -36518496, 32032940, 8072928, -50202264, -8281234, 11745125, 22308060, 11884711, -13574781, 2806224, --28432684, -2916283, -809601, 27828166, -18935438, 36907728, -23460186, 11027865, 20699594, -7972533, -17114370, 16158204, 28114320, 2200097, -14136885, -15641197, 2236604, 2158221, 4481262, 3762928, --1279363, -1107565, -10631118, -10041634, -2498060, 18811420, -4959614, 1353989, -4088272, 6882685, -1021129, 10911364, -36348308, 30974230, -32389958, -7456063, 1527398, 7938174, -5862094, 7082938, -13024488, -21441014, -17808546, -758599, 5088463, 13176960, -14957760, 1789928, 11957726, -9413495, -7567733, -5064840, 35979476, -876710, -5102958, 20144470, 11517492, 17859010, -8941048, 11268384, --3427921, -864362, 15310485, 10314901, 2778844, 4111894, 20549272, -19287624, -5435281, 1648194, -27628988, -816044, -5884105, 25061672, -6190122, -11436961, -10730439, 20698522, -4720706, 8825084, -5920076, 2825552, -7118909, 3403225, 8505109, 2517925, 24095840, 11428908, 7060390, -10700374, --1248762, 8689256, -16676284, 5728950, 6781217, 17146584, 561030, -2479807, 10251013, 1792075, --19397682, 21800718, 7118909, -5585068, 18773838, -12922483, -1211718, -9749576, -7830799, 17736068, -13625247, -1671816, 6995965, -11259794, 2881386, -15037217, -1033477, -13809930, 3349001, 8210367, -3512210, 1175747, -2532957, -2292439, 2927557, -8443369, 2703145, -3918621, 4170950, -5727339, --1475858, -5339718, -5834176, 2541547, -693637, -891206, -1904281, 8117488, 3718905, -11382737, --10979010, -8255464, 2798708, 3064459, 8712341, 4428112, -10073846, -2057826, -3532074, 9123047, --1991254, 9874667, 4731980, -9017821, 493384, 4095251, -4414690, 6109591, -3456375, 6971806, --4823249, -2212982, 2877091, -4758824, 57496192, 4593468, -21199958, -17617418, 2882460, 12959527, --766115, 11827803, -4487167, -3211562, -15910169, -3538516, -11134166, 17706540, -11072963, -937377, --6982006, -3338800, -4086662, 1912334, -11766600, 1779727, -5056787, -8337606, 2464774, -1350230, -693100, -2275259, 4179540, 1978906, -9835475, -6359236, 20938, -6709813, -5790690, 4871567, --1568737, -10099616, 699006, -5623723, 4327717, -14907295, 7472170, -6488085, -11270531, 3420942, --5149129, -5872294, 1559610, -109522, 733903, -2488934, 2530810, -4564477, 5068599, -3135326, -565325, 8294656, -5961952, 2779381, -1546188, -886374, 2297808, -6870337, 6279779, -7221451, -6270653, -1511829, -265214, -4624606, 5931887, -6936372, 496606, 2446521, -9072582, 9088151, --5506685, 3855807, -4158602, 3684008, -3192771, -4028679, 6805913, -4242891, -785442, 6642167, --4237522, -63888, 606664, 1049583, -4687420, 376347, -363462, -2075543, -1267552, 1138166, --1423782, -2559264, -1199907, 2893734, -2575370, 2167885, -675384, -306553, -772020, -1966558, -1928977, -1329829, -1462436, 1986422, -1995012, 1570347, 820876, -1257889, 401579, -328028, -645319, -4016331, 3944391, -4131222, 813896, -613643, -2058900, 547608, -1085016, 2806224, --27634356, -44680008, 47362752, 164437648, 31579820, 49323940, -101259224, -140924864, -58798640, -73826728, -57007100, 132004208, 75981728, 50914152, 5156645, -72858752, -64381024, -64512020, -26299696, 36478232, -31237298, 33237678, 30000346, -1081258, -4791573, -7725573, -10326175, -15362024, -2006287, 20110648, --1735167, -11823508, -4540318, -17042968, -9474161, -3043521, -4154844, 32319628, 30198988, 17730162, -19196356, 883690, -23344758, -23968064, -43723304, -29271812, 4088272, 3470871, 9012989, 25737592, -36881420, 21985938, 18615462, -954557, -20762408, -29111826, -24955370, -21117280, 3092377, 7377680, -13568875, 9201431, 6281390, 1228361, -7501698, 2859911, 827318, 3054796, 18387828, -1835562, -8199093, 8196408, -13504988, -25853018, -26385594, -24012626, 6450504, 19454592, 14305462, 21297670, -19002546, -6471979, 4860829, 11548630, -7419019, -7198365, -16355772, -21368536, -8130910, -5158256, --2088428, 8843875, 4320200, 4707284, 14433238, 13460964, 14211510, 7890392, 3720516, -7206955, --8615704, -21964462, -23791434, -17112224, -12306155, 5242545, 15757161, 19505594, 26515518, 18693308, -12176232, 22012, -8036958, -13057774, -27117886, -29067802, -10052371, 5010080, 13991930, 10882910, -9791989, 10893648, 8153459, -693637, -1879585, 1011465, 482110, -4954782, -4115653, -14765024, --9398462, -560493, 5490042, 7046431, 5912560, -2326799, -29528, 5161477, 4407174, 176094, -3142842, 2426657, -1449015, -7011534, -5933498, -6081137, -1101659, -1687385, 172872, 1158567, -6395207, 6658273, 6322192, 2576981, 1786706, -2451353, -1755568, -1751810, 297963, -704912, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ -2178622, -6312528, 533113, 4223564, -972273, -621697, -2283312, 4503273, 2844342, -2654827, -3499862, -2265595, -896574, -5377836, -6229850, 1469953, 302795, -2107218, -2129767, -4195646, 2667175, --4934381, 1252520, -492848, 1107565, 398358, 1046898, -2221572, -332323, 866510, 1406602, --513249, 1722819, 1257352, -2197413, 1640141, -1334124, -4209605, 5954972, -1154809, 259846, -1413044, -760209, 3281892, 4194573, -911607, 1566053, 3153043, 252866, -3366181, -2583423, -832687, 1986959, -1028108, 1079647, 3871376, -3431679, -3089692, 3210488, 603980, -1294396, --2091112, -106300, 726386, 2430952, -3926674, 1909113, 986769, -3072512, -3315178, 2802466, --1808718, -4066797, -1740536, -399432, 6102612, 7040525, -619549, 1151588, -889058, 1064615, --1174137, 1854352, 1131187, -1187022, -401043, -1259499, 594853, -1672353, 1547262, 1364726, -307627, -1955821, 221728, -116501, 834834, -525060, 1299765, -704375, 226023, 57982, -804770, -207769, 275415, 209380, 831613, -69256, -7766912, -3353296, -5359583, 3512747, --2601677, -3635690, -2468533, -3260417, -652835, 1204738, 5868536, 1014686, -3142842, 4958540, -188979, 5111011, -4916664, 7915088, 3667365, 8586176, -1546188, -2923262, -595927, -4725538, --408022, -338229, -1717987, 1604170, 152471, -3753265, -916439, -15569, 1155346, 3723200, -852551, -5611912, -4679367, -1774895, 3143916, 206695, 147640, -2846490, 4663798, -130460, -334471, -2018098, 587337, -1220845, 2443300, -798864, 7779260, 61740, -1034013, 2946885, --1975685, -3508988, -1459752, 2632815, 4690105, 774168, 2868501, 702764, 475668, -2479807, --2426657, -3969087, -187905, -4114579, 1009317, 3338263, 3559454, 2502355, -1283658, -1828582, -3193845, -2283849, -963146, 1993939, -1843615, -330712, -965294, 2063732, 3673808, 1893544, -1067836, -941672, -427886, 656056, -381715, 2459943, 405338, -1214402, -728534, -562641, --180926, 336618, 292595, 30065, -397284, 1134945, 712428, 46171, 428960, -903017, --583042, -723165, -847719, -306553, -948114, -927176, -213675, 1161789, 5428302, 5872831, -3100430, 9664, 4788352, -2580202, -4074313, 3976603, 4126390, 5244692, 7707856, 751619, --4910758, 2876554, -4683662, -282931, 1567126, 1158567, 8584566, 716186, -6912213, -278099, -1233729, 2947958, -499290, -2301029, -7610145, -1447404, 6458557, 2282775, 4247723, 5026186, -4134980, 1204202, -719944, 4473746, -5653251, -120796, -3843459, 10366440, -559420, 340913, -4591320, -3773666, -601832, 1664837, -578747, 6203007, -950262, 1909113, 5886790, -1095217, -1845762, 538482, -285078, -9664, -774705, -1653562, 2544231, 3464428, -827318, 3448322, -1239635, 6776385, 7691213, -363998, 2056216, 1317481, -3884798, 3856881, -951335, -3195456, -1356136, 3798362, 1060320, -937914, 6815576, -927176, 1850594, 2086280, 1009317, -3420942, --200790, -667331, 549756, -1788854, -377420, 245350, 723702, 767725, 1254131, -404801, -613107, -1662152, -1153199, -2070174, 1603633, 565862, -313533, 672699, -290447, -1694365, -1086627, 199716, 787053, -496606, -605054, 334471, 2026151, -2071248, 8581345, 8387535, --3295314, -4818954, -4190814, -2895882, 2171106, -9192304, -876173, 1260573, -4374424, -8144332, -7918309, -1718524, -1962263, 1251446, 3666292, 3229816, -4000225, -1615445, -131533, -452045, -1933272, 2767033, -1493575, 3406446, -2522220, 5230197, -586263, 201327, -2639258, 2757906, -1067836, -808528, -2626909, 1260573, -1469416, -2349884, -1915019, 460635, 1779190, -4964982, -479963, -9361955, -5353677, 3360812, -1352378, 1114544, 2147484, 6158446, -1924682, -3105261, --155693, 194884, 2653753, 2493766, -2821794, -1266479, 6868727, 263067, 1103807, 582505, -3093987, -5670968, 258772, 2879776, 5356361, 1114544, 2341831, 8047695, -1908576, -751082, --4283156, 63888, 1395328, 2822867, 64425, -1727114, 2529736, -203474, 4538170, 52076, --105764, 558346, -5578089, -2901787, -3272228, 3159485, -477815, -898722, 9664, 428423, --162135, 1666984, -461172, -926102, -1180042, -595390, -1696512, -1124208, 1372242, 98784, --426812, -870805, 461709, 366683, 166430, -761820, 1506997, 644245, 966905, -193810, --41876, -995896, -1067299, 761283, -488016, 1021665, 1355062, -5434208, -8507256, 3651796, --2777770, 174483, -4379793, 3411815, -9820443, -8048232, -9261023, -3103651, -1960653, -6449967, -3305514, 8871255, -6513855, 1384590, 10402411, -2387465, -2829847, -4765266, 852551, -9127, -4614943, 1524713, 3320010, 2339684, -3375308, -6586869, -3134789, 3963181, -2230699, -4022237, -1029718, 1686312, 1308891, 856309, 9059160, -4254702, 4936528, -2340220, 2483565, -2617246, -7539278, -5587753, 3083250, -445066, -4465156, 4187593, -1651415, -1464584, 4498978, 2404645, --377420, -1966558, 4089883, 2027761, -4190278, -5015448, 3452617, 5579700, 3140695, 142808, --2414845, 295816, 3556770, -1517734, 4297115, -997506, -8730595, 287226, -3831111, 12451647, -4349728, -7068980, -3982509, -1386738, -3200825, 3218541, 3115999, 2367601, -1521492, 2736968, -2200634, 781147, -520765, -3646964, 726386, 1265405, -1042066, 849330, 1274532, -481573, --152471, 811212, -230854, -1078574, -906238, 94489, 956167, -984084, 904628, 1072131, --1368484, -1741072, -2202245, 77309, 1309965, -592706, 1163399, -940598, -90194, 890132, --625992, 376883, 3262565, -7239704, -8828842, 7606924, -1585380, -7203734, 652298, -1853278, -7438347, 3678640, -1824824, 1378685, -309775, -1096827, -1257889, 8589935, 1744831, 469762, --5793374, -2668785, -1304060, 3018825, 3839164, 11564199, 358630, 391916, -284542, 798864, --5010080, 242129, 2169495, -6303938, -4390531, -4078072, -448824, 8456791, -6799470, 1182727, -3925063, 1683627, -3142842, 3528316, -8504572, 7022272, -1449552, 11811, 3874061, -4325032, --5013301, -7866770, 1736777, -2567317, 7528541, 2603287, 249645, 1430761, 2334852, 5862631, --2524367, -1280437, 6177237, -1248762, -3424700, -121333, 6180995, 6207302, 5716602, 3067681, --3705483, 3637301, 5175973, -6038187, 7793755, -4723927, -4363687, 7016903, 791885, 10121627, --75699, -5675263, 2550137, -2526515, 6754373, 3201898, 1896765, 454730, 2347200, -1180579, -4261682, 1469953, 1721208, 1273458, 2513630, -197032, -164283, 1930588, -30065, 1417339, --715112, 2336462, 4817880, -2780991, -1236414, 841277, 638340, 306016, 1254131, -242129, -421444, 980863, 2379949, 169651, 4437238, 1046898, 549756, -1978369, 536334, 1453846, --1941325, 429497, 899796, -120259, 599685, -15849503, -10442139, 2807835, 5091684, 10837276, --6604586, 5815386, 1083406, 6124624, -312459, -2859911, -3722663, 3781182, 11228118, 947040, --983011, -10714333, -8960376, 54761, -6585796, -3878892, 384936, 1346472, -6749541, -2025077, -1640678, 3960497, 2118493, -4372277, -9664, 5034776, 4108673, 847182, -4136591, 760209, --2528125, 1215476, 1420560, 2305861, -3182571, 3995930, 9786620, -1000727, -720481, 1891396, --5442798, 2567854, 7885023, -7769059, -9146133, -4743255, 769336, -11862700, 307090, 332860, -1668595, 108985, -159451, -5635534, -3018288, -3662533, -482647, 8060580, 11926050, 331249, -802085, 5804649, -2415919, -1001801, 2716030, 13392782, 1713692, 4810364, 9430138, 1713692, --6084358, 2527588, 2834679, -2824478, 2917357, 2415382, -605590, -2920578, 1397475, 850940, --607201, -4985920, 2221572, 4564477, 1736777, 3324305, 1886564, 4013110, -841277, -1514513, -3728569, 3067681, -923418, -210453, -1075352, 2640868, 2901787, -2320356, 2883534, 762894, -384936, 712965, 1582159, 2137820, 312996, 1867774, -1232656, -680215, 25770, -337692, -801548, -1249299, 225486, -376883, 586263, -1682554, 8201240, 5070746, -7483981, -372052, -16224776, 14247480, 3077881, 8575976, 10722386, 2648921, -91805, 6959995, -3103114, 37581, --6289980, 5154498, -371515, 218506, 2403571, 2725694, 8859444, -7457137, -6706055, 6685654, -1436667, 3030636, -5222680, 912144, -1789391, 3418257, 107911, 4814122, 4828080, -4901095, -4096862, 3329674, -5531918, 14292041, 2561948, 2743947, -11068668, -3618510, -839666, 9244380, -8718247, -936840, -9494025, 6181532, -8248485, -2636573, 7326678, -270046, -5834176, 7042136, -8980777, -2334315, 3063386, -3654480, -12460774, 10201, 8078297, -3752728, -4226785, 5214627, --5949067, -9181029, 2319282, 6115497, 11317776, 5838471, -8386461, 3467649, -9861782, -11753715, -10837813, 5003100, 3999688, -7329899, -7785165, -1247151, 8182450, 2642479, 11667279, 5082557, -2983929, -12412992, 2047626, -3508452, 521302, -2951180, 2620467, 705985, 3161096, 5144834, -2772938, 394600, 2350421, -2124935, -967441, -2164127, 17180, -2030983, -537945, 701690, -3936875, 609885, -1578401, -767725, 1287417, 102542, -306016, -4041027, 258772, -2101850, -792421, -2895345, -3070902, 1998234, 2489471, 3810173, -3779571, 16782584, 10765872, -7274601, --1992865, -277025, 2934537, 2367064, -1063004, -6561100, 1586454, -4498442, 6977175, 217433, -2685965, -2283849, -1043677, -6847789, -3650722, 14426258, 4763119, -8798777, 4157528, -8595303, --6077379, -13444321, 5836861, 222801, 200253, 3183108, -382252, -6097780, 10125385, 5796595, --2248952, -10215580, 10214506, -7014219, 2684892, -266288, 3336116, 2017024, 6484864, 7494718, --1765768, 4149475, 11863773, 1522029, -3744138, -3401614, -2119566, 1843615, 7913477, -2181307, -3206193, 622770, -7282654, 277562, -1806571, 3542811, -10945187, -184684, -18234820, -11044508, --10182294, -2572686, -10062035, 6752763, -2528662, -8313446, -2254858, -934155, -6752226, -2924336, --258235, 676457, -4058207, -8734353, -8768176, 471910, -1919850, 2137820, 4886599, -781147, -2435247, 1223529, -59593, -142808, -4785131, -202937, -117575, -3825205, -334471, 3607773, -6912213, -1197222, -3335042, 2600066, -4311611, 3633542, -3602941, -1333587, 671626, -2605972, --3240016, -16643, -2029909, 505732, -769336, -3235184, 1575716, -126165, 4024384, 2729452, --2872796, 2448131, -1613834, 2277943, -1328219, 1551020, 1401770, 1111323, 62277, 1628866, --1908039, -1001801, -2118493, -4217658, 537408, 1548336, -462783, 933619, -3342022, -11431592, --14370961, -6723235, -9565966, 24769614, -11993159, 5669357, -11326366, -3177202, 1190243, -1760400, --16876538, -281320, -8021389, 671089, 19868518, -6287296, 8334921, 11009612, 3949223, 4518843, -11948062, 3629247, -4656819, 3469260, 4682051, 5115306, 2136746, -2413235, 13905493, 601832, --1122597, -2259690, 3767223, -1118302, -4846871, 4777078, -1797444, 3446175, -13479755, 631360, --2610266, 12259447, -4817343, 4001299, 18271864, -1525250, 376347, -4394826, -7560753, -367757, --1246077, -7664906, 9702868, -2027761, 7038378, 811212, 6646462, -3799436, -724776, 14671608, -7141457, -11287711, -5947456, 3150896, 3505230, 1794760, 3107409, -3260417, 4127464, 5412733, -12130061, -15538655, 930397, -6617471, 3171297, -237297, 1775432, 5783174, 8330089, -5525476, -5883032, -3991098, -2744484, -2213519, -2086280, 4735202, -10615012, -2051384, -4903779, 6115497, -4913443, 2128156, 2528125, -3527242, 4058207, 1889249, 2920578, -392453, 2315524, -3129958, --1773822, -3932580, -336081, -629213, -3552475, -46708, -369904, -943282, -49392, 4210142, -2579665, -2317135, -3799436, 1982127, 1439351, 4824859, -3723737, 290447, -1343251, 2164127, -2461016, -2024540, -3831111, -8199630, -7264937, -7932805, 8596377, -16594143, -4827007, -10411538, -5215701, 17124034, -9286256, 468688, 545998, -3397856, 6678138, -5559835, 2721399, -1749125, --7005092, 15276125, 825171, -5024575, 282394, -2269890, -6710887, 5313949, -5126581, 4987531, --9629854, -4531728, 6600291, 4776004, -16131360, -2930778, -13727252, 4088809, -2247879, -13282723, -16231218, -4540854, -255551, -12287365, -13397077, 768799, -12072616, -1597728, -10422275, -8960912, -10646687, 1160178, -13574781, 4466766, -12144020, 10872173, 3991635, -5279052, 475668, 3493956, -11487964, -8846022, -12452721, 12656732, -8781598, -5042829, 6692633, 9555765, -17672716, -8722542, -10139881, 7496329, 3968013, -928787, 1305670, -12736726, 4432406, 4247723, 7083475, -2241973, --13420162, -9769977, 4825933, -11627013, -10125385, 4291746, -618475, 159988, 4301410, 9821516, -68719, -411243, 9200894, 850940, -1434519, 1568200, -1192927, -1859184, 2024540, -2404108, --1644436, -4615479, -4365835, -3150896, 865436, -2621541, 91805, 1870458, 1542430, -255014, --2147, 2001992, -2261837, -3660923, 1156420, -119185, 3554086, -3372623, -909459, -3823595, -4495757, 4690641, 1066763, -232465, -2838974, -1172526, -4014721, 350577, 714575, -2279554, -765578, 928250, 8433705, -13015898, -21220896, -17139604, 7722351, -20492362, -991064, 15512885, --1374926, 1102733, 11139535, -7407745, -6301254, 24660628, -9772124, 5759015, 9388799, -1757715, --22368726, -1876901, 2359548, -5640903, -3100430, -5222680, 20871394, 182536, 236760, -1045825, --15034533, 2733210, -8656507, -4369056, 936303, 2494302, 4455492, 12099460, 2692408, -3144990, -23847806, 2488397, -5898064, -21829172, -3182571, 15973520, -3471944, -10030896, -13420699, -11844983, --10094247, -6376416, 16963510, 6570763, 975494, 9402220, 14172318, 7877507, -3087008, -2513630, -14649060, -2919504, -4492536, 4227859, 11202348, 1567663, -11511586, 2618320, -1161789, -17236778, --1300301, 13663902, -6782290, -7941395, -1925756, 18379238, -14652281, -2968359, -8176007, 8377871, -4879620, 3865471, 5887864, -2444910, -3157875, 6202470, 4975720, 3411278, -1005559, 737661, -3915937, -10848551, -1999844, 1386201, -5601174, 113280, 5913633, -629750, 1091459, -2356327, --674847, 3211025, 4176856, 6240051, 3520800, -1080721, 2228551, -3614752, -4573604, 1281511, --897648, -3746822, 4136054, 2173790, 3128347, 638876, 1513976, 3191161, 1778653, -954557, --2303176, -629750, 1301912, -16106, 1319629, 248034, 1636919, 973347, 2802466, 337692, --2698313, 5935645, 4871567, -4604742, -1555315, -2215130, 17365090, 1741072, -15501074, -578210, -4657355, -564251, -7062537, 6725919, -5223217, 13800804, -10613401, 9482751, 20744692, -5614059, --5515812, -4890894, -4305705, 18510772, -13710609, -15081241, -11495480, 4198868, -5992016, -9708774, --4454418, 6649146, -9293235, 5146445, 1232656, 7262790, 10798085, 1327145, -1364189, -2070711, -10644540, -2739116, 3771518, -13029320, -100395, -4640176, 10380399, -13845901, 11387032, -4782983, --7120519, 11449309, 19853486, -11149198, 5662915, -2461016, 4041564, -29782376, -23597624, -14324253, -2083596, -9086003, 3943317, 974421, -11046656, -8736500, 980326, 23745800, 5616207, -14790257, --22100292, -11666205, -8147016, 14555644, -10064719, -14402636, 3471944, 3170223, -13303124, -830002, --194884, -6600828, -1491427, -340913, -527207, 6533182, 1637993, -7648800, -6765647, -3723200, --9767293, -5323075, 1666984, 11054172, 1897302, 2086817, -3150896, -9038759, -1353989, 7440494, --301185, -4191351, 6875706, -10306848, -5020280, 1579474, 1697049, -143345, 1209033, 757525, --3427384, -7204271, -2535641, 5551782, -3142306, -2542084, -2822331, -6423124, -7072201, 2709051, --2491081, -1525250, -6653978, 1701881, 4499515, 5383742, -145492, -3173444, -3666828, 3892851, -3546569, 29823716, 19563576, -5156108, 2012729, 19283866, -7577933, 629750, 8342437, 20875688, -12313671, -3680787, -4611721, -7269232, 1931662, -4024384, 376347, 484794, 22073448, 36377300, --2079838, 25076704, 15924128, 3198140, 3995393, -17964774, -17710834, -2078227, 4762045, -1341104, -4413079, -6746857, -13247290, -22508850, -1876364, -14508400, -12162274, -8158827, -12591770, -9154186, --444529, 20770998, -609349, -15894600, -1278827, 4427038, 15525770, -4935991, -3875134, -9526774, -7074348, -28451474, -25440702, -12350178, -12665322, -13714904, -8217883, 8956081, -11417634, -15987479, --13321378, -23869280, 12243341, 6433324, -21082920, 10740639, 21400212, 41756208, 23139674, -363998, -7691750, -24190866, -9805410, 12861280, 11008538, -6280316, -16247324, 2010045, 3468186, 14702210, --1836635, -15325517, -2612414, 24141474, 15542413, 17445620, 14016626, 24349244, 23086522, 6793565, -6311992, -5511517, -9632001, -2820183, -795106, -8406325, 20938, -9697499, -7088844, 10982768, -4984847, -3149822, -9597104, -3806952, -1103270, -282931, -10688563, 10577431, 187905, -9114457, -5431523, -5669894, -4601521, -1506997, 3402688, 14639933, 7282117, 17541720, 129923, -3615289, -2072859, 6611566, 4551592, -2406256, 9382893, 319438, -2953864, 1251446, 7779260, -3932580, --3201898, 2747169, -590558, -31003222, -2796561, 49465676, -3496640, 1637456, 12520367, -18285286, -10293963, 35012572, 32605782, -32986960, -31322122, -199716, -33994128, -13112535, 59056, 3734474, -12548284, 18523658, 16630650, 29001766, 6998113, 11285027, 11733314, -5166309, -1996086, 2948495, -3941169, 8391292, -15590194, 34874596, 15145665, 16146930, -2983392, 35410396, 4495220, 21238614, -8977019, 6461242, -8335995, -5724118, 18245558, 6716255, 8510478, -19450296, -10200547, -16294032, --9296994, -11935714, -11274, -23503134, -25164214, -1779190, -9672266, -47854524, -35356708, -32360432, -9167608, 34331820, 44903348, -25120726, 30962420, 47779900, 8227547, 3723737, -3050501, 32764694, -2537252, 29603062, 12891344, 13669270, -19962472, -66432944, -52325048, -12187507, -1786706, 1024887, -2312840, 24037322, 23067196, 19705310, -12541305, 1209033, -6565932, -34473020, 3403762, 2292976, -17078938, 2225867, 25132002, 22320408, 5577015, 19350976, -8448738, 12952548, -11972221, -13846975, --5027259, 4842576, 21791590, -5410048, -6272800, 2734284, -10948409, -5807333, 10954851, -3664144, -7520488, -14319421, 18639084, 5152350, 32749, -1844689, 14281303, -4115653, 827855, 1785633, --483721, 9236327, -7304666, -4225174, -320512, 8829916, -14291504, 1252520, 4769025, -7499013, -792421, 1910187, 1473174, -3758633, 24251532, -5446556, -43361988, -3970161, 69448008, 12526809, --12780749, 17726404, -5531381, 11488501, -5347771, -7655779, -22613002, -8726837, -2280628, -3964792, --10718628, 16238198, -14595909, -16052977, -882079, 2392297, 14726906, 6376953, 4208531, 6042482, --5704791, -20938, 21889300, -11218991, -25601764, -5320928, 2492155, -8871255, 18260590, -9578851, --5847598, 15045270, 4502737, 11324218, -26452704, -30204358, 10231686, -5950677, -9982578, -13022341, --15634755, -33244658, 338766, -3052648, 11300059, -21340082, -43934832, 32950990, 9367861, 30963492, -3726958, -10189810, -9101573, 7949448, -16371342, 25647934, 5403606, 30814242, 21880710, 45824616, --4275103, -44306884, -34053184, -19672024, 25675314, 25373056, -19136764, 20114942, 40477920, -23854248, --3384971, 43067784, 6989523, 33042258, -4667019, -17141752, -44713832, -17660906, 5333813, 28525026, -25286620, -14960982, 12826383, 11638288, 23991688, 8005282, -23420994, -28189480, -10799695, 19166292, -41342280, -1229971, -3481071, 21195126, 11496554, 1752347, -3335579, -9197136, -10909217, -9165997, -7212861, 4103841, 13218299, -5658620, -1324997, 1041530, 8061117, 9955197, -12842489, 30602, -14906221, -1871532, -4125853, -16543140, 12030740, -225486, -6869264, -5217849, 16590385, -973347, --10396505, -5843303, -36529772, 37874096, 51391432, 8949101, 2333241, 11412802, -7844758, 22418656, -12541305, 23427972, -4752918, -24757802, 54984172, 306553, -20675436, 2532420, 37176164, 17012902, -7283728, -23573464, 2545842, -12629351, -9221295, 3670050, -17539036, 1462436, 4702453, 21115132, --30026116, -5130339, -3615289, 17826798, -6808060, -11113228, -10572062, -171262, 11358041, -23369990, -1677722, 6114960, -47771848, 6543920, -12969727, -33693480, 22094922, -24916716, -43661028, 57560076, --488553, 3284576, -4588636, -16077136, 34715148, -24650964, -2363306, 5114233, -15925739, -1365800, -43873092, 22644678, -38815232, -42008000, 41295036, -19821274, 24028194, 39621072, -35710504, -61422328, --42539504, 70717712, -4291209, -55629492, 50675244, -37131068, -70527120, -1231582, 60632052, -2753611, --73196440, -1180579, -24715926, 527207, 89997280, -13901199, -66475356, 9475772, 35182760, 590558, -41161892, 2239289, 678605, -13237626, 1535988, 9271224, 33190970, -7152195, -9148280, 32819456, --4571993, 7679402, 22959284, -4159676, -33833068, 21764210, 15755014, 25520158, -8158827, -818728, -8969502, -7634305, -24965034, -11152419, 10037339, 538482, -5070209, 32411970, -1177358, -36580236, -8287677, 29433410, 17010218, -12904766, 1423782, -14757508, -8286603, 35733592, 29991220, -8152385, --34840776, -11387032, 13991930, 11285027, 9206799, -6838662, -1504312, -24237038, 37248640, -7216619, -10973641, 24420110, 16769163, 18585934, 43892956, 19528142, -11373073, 7343857, 10446434, 14806363, --16566763, 42999600, 39825620, 5930813, 13459354, -9546102, -532039, -43249784, 19513110, -22687628, -15011984, -1460289, -16524350, 23928336, -9910100, -17307108, 8941585, -24570972, 16006806, 1024350, --5247377, 7193534, 9805410, 15770046, 15305116, 15375446, 44661216, -4116189, 4403415, 14605573, -29918742, -2667712, 7569880, 441845, 23284628, 28586228, -9732933, 7136088, -1781875, -4271345, --52151640, 4478041, 21482352, -11996917, -13158169, 11788075, -22038014, -31656594, 2327872, 18521510, -37613712, -48637284, 18224620, -2146410, -1901060, 585726, 18632642, 41437844, 200790, -29599304, -9410273, 33698852, -18586470, -25992606, 2019708, 14993731, -14664629, 26766774, -5669357, 20660940, -1232656, -19856170, 24350854, 20385526, 2866354, 16161962, -9436580, 10235444, -5377836, 5592048, -7602092, 24425480, -5645735, -28770376, -4297115, 34153044, 2069637, -3912178, 29470454, 6652368, --682900, 7606387, 20283520, 31353262, -20419886, 8023536, 3698504, -1086090, 14673219, -4036733, --23088134, 7806640, 20969104, -8805757, 5082020, 7719667, -7515656, 8773008, -14872398, 10624138, -8661338, -12093554, -27531814, 11938935, 14842333, -6706592, -10367514, 14760729, -1603633, -8295730, -23213224, -44100724, -34886944, -323733, -53669912, -18033494, -20048908, 41394896, -1491964, -14921253, -18613314, -9409736, 10184978, 2971044, -20671678, 24616068, -55305220, -4940823, 3047279, -13476534, -9851044, 2732673, -11025181, -1682554, 1329292, 14134737, 547608, -15854872, -53661860, -38655244, --29939680, -14476724, 32810328, -6431177, 969589, -53178136, 3732864, -3452080, -7509214, 1957431, --51944944, 27945742, -25352656, 13004624, -10529649, 35464620, -19473382, -33812668, -16648367, -22549, -25275346, 46810848, 48644800, -60065116, -44897440, -30531848, 20558934, 49848464, 59755344, -10188199, --15299747, -52538188, -19823422, 47291348, 28496572, -287763, -213138, -842350, -44847512, 30137248, --9181566, 29099478, 69561288, -77671264, 94272384, 26979910, -51383916, 14605573, -102807560, -99976104, -73813848, 31872416, 7108171, 22371948, -38160248, -17941690, 68790880, -2323041, 46209552, -4247186, --37461240, -11857868, 40810780, -13320304, -1060320, 13615046, -3444564, -23565948, 13162464, -19069118, -8829916, 26455388, -27300960, 26066694, 8518531, -3111704, 9626632, -1232656, -6219650, 4630512, --9524090, 5199595, -19385334, 17479980, 17775796, 4010426, 536334, -5569499, 9097814, 3725884, -3615826, 9238475, 17131550, -20895016, -7220377, -19360102, -15096273, 1969243, 768799, 17391396, --22034256, -16466905, -21221970, -12992276, -5665062, -44542568, 36820756, -22075596, 22588306, 12036109, -14204531, 8458938, -28632400, 31212602, -4771709, -11070815, -10366977, -12286828, 9398999, -6426882, -13431973, 8134131, -1929514, -3204583, -23998666, 13913547, 5495411, -6068789, 5155572, 12635257, --3741454, 7195144, -12276627, 14372571, -5494337, 1895154, 5658083, 6146098, -6537477, 22126060, --1025960, -20678120, -1543504, 9628780, 4551055, -15803869, 7544647, 18536542, -3643743, -8911520, --8933532, -1151588, 4916127, -2177549, 21527986, -14534706, -5757941, -5124433, -11070278, -864362, --3494493, 8013335, 5587753, -8910983, -1516660, 8400956, -8934606, -4452808, -2779918, 13474923, --8455180, 5812165, 8859444, -20735028, -8528731, 6717866, -21837224, 32952600, 8650064, 10525354, -15037217, -9570798, -392990, -2791729, -15074798, 3055869, 4802847, 12065637, -2507187, -4999879, -7202124, -7539278, -3240016, 7253663, -33823, -1719598, 5974300, 1907502, -3995930, -127775, --4398047, 9648107, -9184788, 14615237, 550830, 3254512, -6170258, -500901, -2301029, -4511863, --2482491, 3510062, 1673964, 4236449, -162672, -3389803, -2374043, -11241540, 11328513, -9018894, -5098663, -2110977, 6596533, -3684545, -10583336, 743029, 5419712, -8594230, 12919262, -10251550, -5636608, -3889093, 51510616, 6703370, -17445620, -13565654, -10151692, -998043, -1649268, 1114007, --1395328, -2008971, -29116658, 615254, -5791227, -6744710, 3705483, -11457362, -5180268, 5282273, --7964480, 2248416, 9048959, -12240657, 7712151, -4545149, -6471979, -1058173, -6472516, 3010235, --6005438, -3230352, -7077569, -1406065, -88047, -186294, -4242354, -4447439, 1361505, 2302103, --5073430, 6874632, -8465917, -772557, -3361886, -1101122, -1568200, -6756521, 9262634, 5648419, --9233106, 11252277, -1113470, 2388002, -5057324, 10797548, -10770167, 798327, 966368, 2844879, --1745904, -2811056, 8111583, -5364951, 1243930, 418222, -1596654, 2571612, -3463891, -495532, -4556961, -2273648, -2007360, 5101885, -1937030, -2234994, -4689031, 2462627, 2380486, -10519986, -12650289, -7110319, 2908230, 863825, 234076, -4076998, 1803886, 5177583, -3777961, -1949378, -2840584, -3872987, -181462, 3171297, -1239098, 1263257, 759672, -2870112, 569620, 370978, -2649458, -4660577, 454730, -525597, -1766305, 1948305, -2221035, 1122060, -1413044, -4076461, -2355253, -3533684, -1960116, 1312113, -2140504, 820339, 2127620, 228707, -3010772, 3278134, --554051, -2017024, -25169582, -40950364, 45730128, 153798480, 15653545, 35328252, -83669720, -127949760, --32150514, -66827544, 52081312, 107227080, 56507276, 35751308, -8010114, -41578504, -40898288, -30758946, --28565290, 10227391, 18294950, 10596221, 19691888, 2628520, 1580548, 7796977, 2236604, 8848706, -7039989, -5222144, -19582904, -14465987, -17258790, -23287850, -12305081, 13168370, 16972100, 31524524, -44500156, 16151225, 6449967, -14752139, -35255776, -34103116, -23822572, -16515223, 3403762, 13167296, -18895172, 20172388, 16996796, 11483132, 1347546, -1309428, -11193222, -7715372, -4930623, -5577552, --2168422, -6307160, -1806034, -7484518, -7322383, 2747169, -572304, 9772124, 16033113, 9547175, -23838142, 21247740, -10186589, -20888574, -20937966, -31170726, -8763344, -7478075, -1657321, 19235548, -17143362, -2988760, 14911590, 18602578, 6324876, 13007308, -1140314, -14951318, -10835666, -25690346, --16171089, -6067715, -1570884, -1874753, 4672388, 12171937, 19283330, 24317568, 20585778, 6887517, --11181947, -18344880, -17546552, -19585588, -8764955, -4963909, -1989107, 4359392, 9715216, 7704098, -13575318, 7413114, 8934606, 8097624, 118112, -6673306, -8691403, -10926397, -10706817, -9567040, --5032628, -5268851, 3118146, 5536213, 11178726, 16149614, 15633681, 5940477, 1159104, -8870718, --10735271, -12714177, -12694313, -3730716, -497679, -2449742, 3126199, 9918153, 13003013, 6391448, -1512365, -696858, 283468, -2609730, -2826625, -4890894, -2901787, -3724811, -2519535, -1631551, -183073, 1611, 3009162, 5558225, 5997385, 2678986, 1183264, -1540820, -776852, -1169842, -238908, -545461, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ -3988414, -6492380, 1704565, 5732708, 98784, -5909875, -4076461, -4303557, -669478, -2954401, 6932077, --5181341, -1316944, -2350958, -828392, -4154844, 3998615, -2448668, -1918777, 3365644, 5577552, -6313602, 973884, -448287, 1314260, 338229, 892816, -2851322, -3071975, 1507534, -2784750, --2786897, -3737695, -3927748, 1202054, -2599529, 3482682, -4335770, -587337, 1920924, 1825361, -1612223, -6729140, -1202591, -3730716, -643171, -1563368, -4099546, -79994, 4909685, 1496796, -2389076, 2260227, 2658585, 343061, 3333432, 2097555, 3719442, -2093797, 2486249, -1212255, -1720671, 203474, -3415036, 4013647, 4540854, -2420214, -3029563, 1345399, 4174708, 1001801, -1123671, -1385664, -261993, 2266669, 1423245, 373125, -812286, 285078, 1918777, 2330020, --268435, -3613141, -2204392, -1211718, -1529545, 849330, -333397, -321586, 1734093, -1260573, --411780, 537, 316217, -852014, -233539, 135828, -1359894, -150324, 1699733, -242129, -905701, -1213328, 718870, 366683, -69793, -795106, -10142565, -2664490, -4575214, 3356517, --9508521, 2083059, -4191888, -2215130, 1347009, 186831, 1061394, 1419487, 1069984, 4123706, --1836635, 428960, -419296, -5023501, 3698504, 6179921, -5034776, -4726612, 3586835, 919660, -4428648, 1401233, 5950141, -830002, 2003065, -3155190, -963146, 6066105, 481573, -3963181, --4888210, -5280126, 220117, 4366908, 2215130, -32212, 4969814, 3961034, 152471, -4070019, -6356552, 1620276, 4901632, 4983236, -876173, 3173981, 3751117, -458488, 2215130, 2570538, --2477123, 507880, -770410, 2442763, -5591511, -3580392, 1801202, -3461744, -1336809, 4789426, --1942399, 2630668, -1125818, -7523709, 1266479, -38118, 3950833, -6196564, -3333432, 2798708, -706522, -597000, 1596654, -2921652, 847182, 743566, -894964, -1842004, 2532420, 2302103, -1592359, 288300, -954557, 611496, -707059, -1116155, 833761, 716186, -1511292, 1089311, --845035, -642635, 1359894, -978179, -2011118, -30602, -750009, -246424, -952946, -1047435, -420907, -78383, 612570, -5369, 601295, -1482301, 430570, -431644, 6379100, 6734509, -2962991, 4981089, 3890167, 6744710, 7687455, -2860448, -825707, 2587181, -7681012, -258235, --2532957, -1466731, 3515968, -4472672, -523986, 5681705, 1049583, 3641596, -1802813, -1318555, --1915019, -7224135, -1184337, 489626, 3819300, -1163399, 6572911, 2588792, -1136556, 2626373, -1361505, 3376381, -2443837, -512175, 7675107, -1029182, 7250979, 3401614, -3183645, 759136, -6385006, 3322694, -4214437, 5819144, -1599339, 390842, 300648, -1178969, 1115081, 643171, --5266704, 3354906, 2452426, -458488, 188442, -1179505, -4758287, 0, 2670396, -550293, --563714, -3208341, -6995965, -2410014, 2600066, 5862631, -8920110, -4762582, 1664300, -3900367, -2281702, -189515, -44023, -5376226, -4075387, -2394981, -3488050, -1730872, 194884, 591632, --1252520, 2010045, 1606855, 317291, 1480690, -1644973, -606664, 26307, -2405719, -540629, -235686, -3064996, 1277216, 719944, -586800, 71404, 634045, 1446867, 162672, 187368, -23085, -1504312, -190589, -470836, 1085553, 731755, 1486059, -1079111, 9400073, 10040560, --2024540, -4172561, -4608500, 9628780, -8355322, 253940, -1381906, -3858491, -5297842, 1902671, --1471563, -7159174, -8764955, 359167, -678605, -4540854, 1633161, 2451353, -3235184, -4816269, --4539781, 6414534, -6913287, -804770, -8075076, 122407, 4467303, 1556926, 750009, -4489852, --4363687, 3983045, -3069828, -4589173, 557272, -1651415, 2810519, 86436, 1126892, -4575214, --1717450, -1269163, 4407174, 3061238, 3060701, -9087614, 1429150, 2571612, 2069637, 2600603, --2612414, -1630477, 315143, 1879048, 3595961, -594316, 2372433, -2607582, 7030325, -12740484, -4477504, 395674, -6804839, -260382, 7503308, -2241436, -3531537, -6816113, -2318746, 564788, --1910187, 24159, 3073586, 3952981, 3269007, -938450, -547608, -3996467, -827318, -1000191, --2033667, 588947, -828929, -767189, 1633161, -2006287, -946503, 1997160, -985158, 1300301, --303332, -781147, -710817, -512712, -2951716, -1813013, 1282048, 1476932, -1401770, -1102196, --954020, 1115618, -697395, -393526, -1159104, 785979, 804770, -1351304, 551903, -168041, --1256815, -271657, -711891, 836982, -417686, 1232119, 1705639, -4459787, -14147085, 2587718, --6456410, 1421097, 1170379, -810138, 10019622, 562641, -6430640, 8577587, 4116726, 2949569, --1302449, 1782411, -2624225, 6724845, -1130650, 770410, 10105521, 9884330, 4211753, 4529043, -4335233, 4922033, 3265786, -9759776, -3067681, -133681, -2586107, -8308078, -935229, -1969779, --2216203, -4464082, -107374, -1311576, 7126962, -2296734, 12512313, -78920, 1033477, -2326799, --1838783, 90194, -385473, -1009854, -2217277, -1476395, -6168647, 1487132, 979789, -742493, --3202972, 4279398, 3149285, 3707094, -1333051, -2702608, 44560, 3227131, 3480534, -2837900, --8053064, -4113505, 837519, 6673843, -954557, 5452461, -4374424, -6327561, 4681515, -2225867, --5213017, 2990908, 3110093, -5829881, -4626754, -6414534, -2158221, -2225330, 3636764, -2024003, -1082869, -436476, 2412161, 1487669, 1319092, -1235340, -719944, -3356517, -1709397, -919660, --78920, 1443646, -323196, 67646, 2725157, 1044751, -176631, -9127, 1735167, -1207423, -438624, 472446, -981400, 1029718, -876173, 662499, 506806, 743566, -548682, -2115272, -1962800, -3532611, 5196374, -6154152, -6729677, 3238942, -1927904, -563178, -3533148, -2019708, -3450469, 4904316, 2556579, -1102733, 751082, -552440, -1117765, -4620848, 1576790, -12507482, --3628711, -3958886, 3476239, 4341138, 375273, 2175938, -7794829, 2173254, 1220845, 2164127, --7024956, 13342853, -581431, 2514703, 1764695, -6244346, 1012002, -8971650, 5810554, -1877975, --7525857, 1566589, 598611, -3740917, 432718, 869731, 5983427, 10772852, 4667019, -2127620, -3497177, 4450660, -9962177, -3626563, -4552129, 2821794, 2307471, -1617055, 1604170, 3519726, -2237678, 4520990, 8391829, 236760, -3092913, -817654, -335544, 6614787, -4706748, 66035, -3053722, 8905615, 52613, -5858336, -5736466, -471373, -7050189, -922344, 2695629, 10896332, -9366787, -1052804, -4949950, 4037269, 311385, 1202591, 1025423, -342524, 1382980, -348966, --1361505, 1213865, 1569811, -1506460, 2194192, 2051384, 1981054, -545998, -1596654, 1285269, -1763084, -267362, 526134, -1340567, 217970, -281320, 2555506, 941135, 1595580, 1236951, -398895, 830002, -11274, 1003412, 2284923, 479963, 938450, 1631014, 2222109, -1065689, --558346, 530428, 660888, 1673427, 2609730, -13028783, -3544422, -4843113, 5573794, 159988, --2673617, -16741783, -2201708, -2273648, 6928319, 16506633, -4760971, 11076184, 1915555, -9822590, --9991168, 1698123, 2543695, -5726265, 6269042, -4534412, 5052492, -6263673, 3015604, 2108292, --5914170, -5018133, -3797288, 1928440, 6476274, -8477192, 316754, -8911520, -493384, -3412352, -2165737, 6441914, 682900, -2839510, -2478733, 6976101, -19864, 10653130, 3284576, -4065724, --3876745, -3130494, 1531693, 6672232, -137439, 11083163, -19796042, -14634027, -11813308, -2767570, --10075993, 620086, -3792456, 3550864, 8992051, 1581085, 3722126, 5732708, 9518184, 4860829, -1457068, -6598144, -16386911, -17302812, 9268539, 593779, 11765526, -8413841, -6032282, 5122822, --12129525, 208306, -4332549, -489626, -7822746, 276489, 2610266, 7036230, 1277753, 1112933, --2255395, 2517388, -516470, 812823, 1974074, 3170760, 4120484, -1146756, -1730335, 2972117, -1519345, -1169842, -2172717, 430034, -362388, -288837, -920197, 439160, 31675, -1203665, --401043, 1207960, 2228551, 1765232, 1531156, 777389, -5024038, -2786360, -1921461, -1806034, -2699387, -437550, -832150, 5369, 769873, 181999, 7848516, 3428995, -6251862, -170725, -14944876, 12669617, -1170916, -10951093, -18478024, -2108292, -6486475, 6609955, -5537287, -5450851, --20925080, -8978629, -18742164, 6917582, -612570, -4567161, 4995047, -656056, 115427, 1358283, --6014565, 532039, -6908992, -1226750, 4201552, 3125663, -7046968, 2541547, 7199439, 11715597, --1768990, -1636919, -3892851, 668404, 6086506, 8637179, -1234266, 1279363, -1855963, -1492501, -10293426, 7490423, 308701, 7726110, 2244121, -9458592, 1794760, -947040, 12251931, 4791573, -1551557, 5915244, 7953206, 2194192, -6978785, -11961484, -2752537, 2505040, 6431714, 3287798, -411780, 2516314, 9506373, 2101313, 3099893, 4383551, 2566780, -6092948, -6886443, -5984500, --6802155, -6228240, 10568304, 1497870, 8164733, -7156490, -6313065, -1206349, 6826314, -4254165, -3642669, 2096481, 1098438, -3611531, -2289218, -3336116, -2278480, -3803731, 1531693, 1241782, --1031329, 2517925, -1641751, 1191853, -656056, 285615, 1155883, -3365644, -2086817, -3377455, --2182917, -4116726, -1175747, -3411815, -1628330, -1973538, -2594697, -160524, 3002719, 987306, -1258425, -1062468, -281320, -364535, -702764, 2341294, -1093069, 26212186, 5743982, -8078297, -4683662, -4700305, -15537044, -3135326, -15240691, -8339753, 7893613, 10533944, 4070019, 2194728, -897648, 1982664, 9982041, -7036230, 14120242, -9069360, -9274445, 11325292, 5015985, -18104360, -7965554, 4721780, 5779416, 12070469, 5927055, 9007620, -588411, 4937065, -2828773, 7715909, -2016487, 1747515, 5095979, -10120017, -5516349, -3011846, 6586869, 2991445, 2378338, 5361730, -1544578, 1998234, -9233643, 244276, 10050223, -1643899, 1266479, 1425929, 1326608, 12150999, -4655745, 16293495, 3761855, -2127083, 15372225, -13016435, -1670205, -1909113, -5217312, -1023276, -3262565, 15380278, 1511292, -3037616, -5850283, 3332895, -6153078, -2461553, -3938485, -8122320, --1275605, 2427194, 13060996, -876710, -12495670, -3271155, -7474854, -3572876, 9142912, 7534983, -8570070, -6555194, 1472637, -7314866, -1068373, -2335925, -4468914, -2320356, -6153615, -3403225, --1093069, -2435247, -8096550, -3002719, -2266669, -1433445, -1769527, -2635499, 445603, -1144609, --6347962, -95563, -3009162, -1618666, -448824, 161598, 1229971, 27917, 2985539, 3073049, -591095, 747861, -1963337, -1564442, -378494, -1937030, 3062312, 2004139, 2884071, 2875481, -1239635, 3932580, 2553358, 1176821, 1828046, -248571, -1392643, 2864206, 3848828, -9395778, --14583025, -5211943, -14358613, 10322954, -12256763, -8952859, -7234336, 6539625, 16345572, -16584479, --5939403, -18695456, 5328444, 2654827, 1719061, -5342403, 1423782, 21133386, -11076184, -1813013, -7948374, 5495948, 4138738, 7460895, 4902169, -6898255, -11764452, -2150168, -6534256, -8809515, --10865194, 213675, -2566780, 2705830, 13897977, 8865886, -7870528, -4189741, -918049, -4003983, -3370476, 26549340, -9041443, 18532248, 5749351, 3148211, -1255741, -2957622, 3083787, -10114111, -4815195, 14433238, 564251, 2338610, 11474542, 7515119, 4412542, -9673340, 8078297, -5752572, --8699456, -23373748, -7414188, 15250355, -8695161, 3981972, -16524350, 11831561, -6249715, -6454799, -10257456, -16390669, -12190728, 18650896, -13309030, -12453795, 7425999, -8531416, 1692217, 67646, -5289789, -13438416, 4203163, 390842, 13405130, -9965935, 3304441, -1382980, -7634305, 10000294, -1989644, -8256538, -6041409, -5677410, 851477, 14496, -4199941, 147103, 5176510, -400506, -3663070, 4179540, 3269544, -7432978, 4132832, 3837553, 5978058, -118112, 427349, -5397700, --2183454, -2640868, -2828773, 1286343, -637803, 3505767, -4949950, -3085397, 1853815, -4749697, --4037269, 1730335, -10584947, -7891466, -1073742, 12032351, -5703180, 21150566, 19701014, 3858491, -6306086, -11460583, 1410897, -9285719, 14783277, -2986076, 4347581, -7093139, -4585415, 2487323, -1979443, -6817187, 11318313, -3242164, 2382633, 4191888, -7452842, 2771328, -9505299, -1611, -5359583, 6412923, 117038, 8490077, 10736881, -856309, -20221242, -3448859, -6015639, 14391899, --12239046, -15204721, -10855530, -7290707, 2050847, -8644159, -6796786, -4381941, -1298154, 2595771, --29641180, 18615462, 14501957, 21230560, -6832756, 3351685, 14206141, -13712220, -12707734, 2430952, -9255118, 6053757, -1676648, 2800856, -7547332, -8982924, -11445551, -3420405, 39268884, 3080565, --21886616, -3987877, -12029667, 7415798, 5798206, -13611825, 2812667, -4245039, 1030255, -6770479, -8329552, 8480413, -1369558, -4460324, -5254893, -17241610, 5070746, 2653216, -785442, 6964290, --3515968, 1015223, 2648921, -8248485, 3015067, 4734128, 11126113, 5842766, 597537, -9790378, --34897, 8676371, 409633, -142808, 6484864, -9127, 2141578, 6347962, 5394479, -1161789, -2900177, 5340255, 4966056, -2592550, 2105071, 6434398, 7976828, 5807333, -304943, -4435091, --1100049, 537, 4939213, -206695, -1591822, 143345, 1720671, -3383897, 1728188, 2939368, --3244848, 1798518, -5686537, -11259794, -21733072, 1755568, -18155900, 8551280, 2927557, -14614163, -8242579, 9483288, 13219909, 3823058, 5224291, -15167140, -310311, -3025268, 14119168, 6571837, -616328, 13206488, 14709189, -1773822, -7057168, 1680406, 18139794, -11819213, -9372156, 9350144, -5097053, -12023224, -2682744, -11125576, 20745228, -17720498, 4901095, 11036992, -6703907, 10143639, -3630858, -5069135, -5412196, -5455682, -8485245, 11613055, 15625628, 3116536, -12050068, 1236414, --13306882, -5068062, 8588324, -1655173, -6639483, -4855998, 2159832, -17663590, 471910, -1868311, --10242423, 13763223, -13642964, -935766, -3205119, -10062035, 10558103, -863288, 6069326, -5128728, --1139777, -625455, -6528887, 4931696, -6025839, -1122060, -5936719, 15915538, 6743636, -18949932, --4268124, -31210454, 17885318, -73551, -14181982, 12584254, 1234803, 1846836, 4480188, 204011, -7091528, 8813810, 1853278, -2310156, 4721780, 9480067, -5577015, -3365107, 3702799, 1358283, -2184528, 2782065, 4658966, 6457484, -4387846, 3365644, 1881196, -5126044, -4848481, 4099010, -686658, -537408, -3593814, -3112778, -5760625, 5526549, 5531918, 958315, -3911105, -11769821, -71941, 1058710, 3649649, -7559680, 647466, 5975374, -3461207, 6914361, 2936684, -456877, -1729261, 3760781, 137976, 1367410, 1891396, 4622459, 19021336, 716723, -14482630, -6225555, -8553964, 13855028, 14849313, 533650, -3494493, 20877836, 9081171, 23204634, 2818572, 1967632, --11189464, -4602058, -6641093, 6190122, 3344169, 12549894, -14399952, 971736, -8579197, 7697655, --12486007, 4735202, 13787382, -2080912, -440771, -7218230, 1931662, -7265474, -24820616, 3401077, --3839701, 1719061, -11104638, -2440615, 9651328, 18714784, -1973001, -6805913, 10865730, 5115306, -2626373, 12880070, 4458713, -6889665, -3318936, 8312373, -1173063, 7586523, -9090298, -8088497, -2779918, -7601555, -14565308, -6731288, -16585016, -3707094, 5565741, -13023415, -1883343, -14956687, --6550362, -114890, 5870684, -17822504, 7785702, 1315871, -10605885, 13269838, -4737349, 3510599, -23527294, 26637388, 1709934, 9364639, 19481972, 23296440, 23125178, -2283849, -15418396, -23638964, --8591545, -15673409, 14799384, -3190087, -6978785, 3784403, -379568, 1612223, -276489, -7008313, -7522099, 2120640, 2825015, 542240, 10170483, -5690832, -99321, -3125663, 7061463, -6548215, --2773475, -697932, 10049687, -2619393, 6078990, 8274255, -7577396, -1629940, -3187940, -8603893, --3451006, -1974611, 3741990, 294205, 11780022, 3187403, 7985955, -756451, -7530689, 2114735, -234613, 31835908, 36827196, 1775432, 11893301, 11099806, -1406602, -26541288, -559956, -1209033, --9872519, 7294465, 7040525, -14515379, 7963943, 9909026, 1797444, -3973382, 5599027, -3817152, -18817326, -3355980, -8617852, -26844, 4370666, -1907502, -1110249, -482647, -29667486, 8454106, --560493, -20723218, -8417599, 3415573, -1821066, -14166950, 4984310, -16693464, -1385127, 1486059, --26452704, -4892505, 11509439, -8666170, 1348083, 16618302, 10379325, 12681428, 4099546, -7354595, --12298102, 12621835, -6475737, 7013145, -11679090, -6289443, 8575976, 14194867, 2210298, 17030620, --11392401, 14717242, -12452721, -15259482, -10695542, 14669461, 15602006, -14433774, 7521562, -39634496, --3492882, 11489574, 3790846, -6323266, -15627775, 7129646, -22135724, 3469797, -11353209, 10432476, --17064978, -11087458, 17361868, 270046, 8792335, 1841467, 7682623, -3994857, 3253438, -2069101, --12745852, -2447058, -5869610, 3894462, -4013110, 2175401, 657667, 2029372, 1182190, -2951180, --3765613, 432718, -8002598, 2797098, 2471754, 4571456, -5066451, 4539781, 4490389, 2742874, -3888019, 2630668, -5444408, 484258, 2897492, -4253628, 7671886, -785979, -2729452, -4396973, -139586, 560493, 3751654, -2838437, 3570729, -2745558, 8074002, 3358128, -6456410, -1838246, --1460289, -3241090, -2604361, -28981902, 2132988, 35885524, -24260660, -2269890, -2106682, 1917166, --9600863, 4592394, -15306190, -15658914, -5173825, -4269735, 3784403, -3932043, 8159901, -11735998, -383863, 23087596, -18918794, -16681653, -4053912, 20204600, 2815351, -25275346, 10757819, -9372156, --10824391, 2523830, 34748432, -19543174, -10910828, 24753508, 18315888, 1604707, -10244034, 689879, --3817152, -7847442, 7067906, 6473590, -4226248, -20040318, 25672630, 12074764, 4846871, -27285390, --4194036, 8490613, 9430138, -3384971, 14338748, -2306934, 4866198, -6248641, -16457241, 10724533, --11747272, 7047505, 3635153, -14399415, 27199492, 4195110, 19583978, 19659676, 3491809, -29554744, --5684926, 288300, -11753178, -5947993, 1108638, -936303, 12831752, 24142548, -6982543, -2355253, --10657424, -4752382, 10023380, -6764037, 5823439, 17950816, -15693810, 17842368, -3507378, 5365488, --6784975, -3634079, -5695664, 774705, 3330210, 3940096, -2985002, 99858, 4071629, 2321430, -9430674, 4427038, -4759361, 405874, 860604, 8603893, -4766340, 2504503, 3974992, 1342714, --335007, 304943, -11218991, 5514738, -4129074, 5399311, 7040525, 946503, -1136556, 3581466, --367220, 2741800, 933082, -1167694, -4142496, -4214437, 8367133, 1431298, -1955821, 2349347, --5204964, -979253, 8530879, 11190537, 1545115, -10300405, -51554640, 3386582, -13435195, 1777580, -25844966, 2466385, -4955856, 4704600, 1023813, -17515414, -18874770, -17029546, -16316581, 21271362, --4229469, 25389162, 2286533, -23987392, -809601, 2645163, 20584168, 4045859, -3285650, -4085588, -5906117, -12917114, -4911832, 22726282, -4596152, -29515016, -22505092, 13471165, -2891050, -6135361, -6824703, -2118493, -15163919, 4584341, 8973797, 20463372, -4079682, -16988206, 277562, -21425982, -8289824, 24255290, -3835943, -29769492, 9419937, -340913, 1723893, 7175817, -9327058, 18321794, -1425929, -12359842, 9663676, -6691559, -4084514, 26181046, -13357885, -4502200, -4348655, 16496433, -6682969, -28956132, 14746770, -23333484, -5513128, -12588012, 3065533, -7675644, -7020124, -2405719, -13356275, -4318053, -8138963, 15744813, -9119826, 16163573, -26844, -8528194, -5077725, 4028679, -4507568, 3212099, -9651328, -3202435, 2448668, -530965, -6291054, 156229, 6056978, 9240085, -3908420, 4763119, 818728, 9086540, -5066988, 2966749, 7237557, -2699924, 968515, 2950106, --1723893, 1459752, 2910377, -8853001, 7575786, 3232500, -8866960, -7290707, 591632, -10475425, -988916, -7706245, 10108742, -18097918, 34897, -3788698, 1985886, -4667019, 5738613, -2962991, -2713883, 2098629, -25188372, 5157182, 41580116, 27087822, 12387223, -20632486, 15458124, 19551228, -28922846, 13972602, 3415573, 1029182, 18118856, 31284004, -7062537, -3808562, 17712446, -35019016, -12742631, 31251256, -6481643, -10817949, 8108899, 24267638, 19538344, -13056701, -22383222, -1307281, -11257109, -3782793, 2711198, 372052, 26249766, -14976551, 16816408, 25409564, -10163503, -3053722, -17927730, -2667175, 62862216, -26339424, 11319923, 43051140, -24775518, 8147016, 2881923, -34854196, --1079647, 6544994, -15380278, 34155728, 2585570, -4648229, 2658585, -14150843, 46786152, 12947716, --37491308, 36229660, -15117211, 1394791, 11108396, 13494250, 24017994, 11767137, -6479495, -23376970, --31523986, -11770895, -12631499, -2097018, -9667971, 19896972, -12048457, -20826834, 2350421, 5852967, -4268661, 7694434, -11818139, -11446625, -6984691, -7539815, -24842090, -10415296, -8446590, -17077326, --8235600, 6241661, -7283191, -16002511, -750546, 6360847, 10835666, -2442763, 5110474, 11885248, --653372, -7885023, -471373, -4735739, 6582038, 9511205, -13146895, 11711302, -6797860, 270583, -1768453, -5983963, 12205223, 4834523, -17074106, 10669773, 1628866, -5933498, 12664785, -14224932, -5799817, -2534568, 6208912, -3267396, -3962644, 2566243, -2315524, -1284195, 4482335, -2418604, --9765145, 4739497, -873489, 3188476, -390842, 8412230, 10298258, -48389248, 28187870, 1261110, -17042968, 28054190, -46380816, 10584410, 23885386, 5386963, 17825188, -17889076, 19622094, 5695664, --18176302, 244276, -11451993, -33996276, 18654654, 10555419, 31073552, -17213156, -22744536, -7987029, -7298760, -4764730, -38502236, -19044422, 11853573, -2913062, 5776194, -16298327, -5024575, 12771085, --10843719, -5466957, -16427713, -3898220, 6006512, -18269180, 1939178, -39844412, -32726040, 10066330, --34041912, 2907693, -35615480, -25041270, -17169668, 16702591, 33290292, 40888088, -9666898, 18131204, -22231824, 10678899, 9657771, -15968688, 45629196, 46405512, -31554050, 31601832, -24815784, 15860240, -32753420, 30988726, 37948720, 45122928, 32112396, -36063768, -25489020, -355409, 960999, 13517336, --8501351, -7004555, -21487722, -12038256, -31907312, 6937983, 26929444, -10935524, 6662031, 27944130, -13294534, -19289772, 21626770, -1416802, 7706245, -2197950, -3712462, 6127308, -6680822, 9443559, -8151311, -7242389, -8548596, 8136816, -5790153, 197569, 367757, -771484, 2463164, 720481, --11411728, 10636487, -4774393, 5035313, 6286759, -4377109, 6764037, -8330089, -5909875, 5357972, --6478422, -8601746, -3627637, 3279208, -3199751, 1999844, -7555921, 164283, 2966212, 6969658, -10746008, -2629057, 6117107, -7133941, 148176, -1418950, 3359738, 2330557, -486405, -5550172, -59872916, -43826384, -22296248, 23605678, -14051522, 22549116, -17580374, -19614578, 6621766, -46351824, --2098092, 31156766, -7524246, 16010564, -26585848, -6540699, -10499048, 1049583, 33238216, 10045929, -7384123, -5940477, 18242874, 5862631, 45413372, 11164767, 26511222, 1879585, -20739324, -19616190, -26422638, -12861280, 12215424, -265751, -34114924, 24581172, -30397094, 59008020, -44004088, 26845156, -24035174, -25272662, -21241834, -15696495, 21785148, -1678795, 22798224, -302795, 2962454, -40373228, --21701932, 9373229, -19852412, 6549825, -12113418, 11834782, 6714645, 30974768, -18438832, -6366216, --7875897, -15217606, 42003168, 7755101, 3933653, -39165808, -12701292, 21024938, 12400644, 13380434, -36375152, 23267448, 32162326, 37119256, -1112397, 16420197, -15480673, 49381388, 3688840, -8191577, -17975512, -4257387, 37888592, 651224, -7670275, -7871065, 4508105, 26625040, -20262582, 13734232, --6476274, -2233383, 7872138, 5255966, 10337986, -6568079, 6713571, 12396886, -3315178, -4792110, -8381092, -1432909, -1372779, -1013075, 2212982, 1310502, 4000225, -9122511, 11803107, -7066832, --3934727, -1996623, 7187091, -10326712, 964220, -7418483, 9844065, 17871896, -6090801, -5068599, --2471754, 12234751, 5980205, 12779675, -1127966, -7602092, 5797669, 6072547, -1946157, 6009733, -4682588, -17632988, 2605972, 19901804, -2794950, -90372552, 62827856, -38934952, -27227946, 699006, -12917114, 16255377, 2952790, -14426258, 48926656, 24847996, 6867116, -24415816, 16079821, -767189, -18277234, -23302882, -16105590, 12582644, 36602784, -41836740, 1767916, 13668197, 4512400, -10227928, --6140730, -5187784, 1744831, -2033130, 9529459, 46183248, 3036005, -20723754, 31061740, -7129109, --29888678, -38544648, 36886252, 12153147, -5039071, 13828184, 8587250, 30749282, -41489920, -4281009, --21061982, -5879810, 23841900, -17388176, 9341017, -20066624, 9831717, 63661616, 4889284, -36219996, --40731324, -2376728, 19520626, 19225884, -16280610, 4101694, 30993558, -12826920, -59771988, 34280820, --20561082, -33881924, 15017353, 56917980, -39143260, 28763396, 39644160, 13812615, -34206192, -28436442, --17549236, 14451491, 12444131, -11654931, 35587564, 17534204, -2160369, -812286, 2202781, -29438780, --11257109, -20764020, 10873783, 9816685, 7120519, 9924596, 7341710, 22114250, -10866804, -5063230, -4250407, 368830, -16818018, 14876156, -587337, 9452686, -4166655, 7215545, -10816875, -2981244, --6506876, 10641855, 1994476, 2501282, 331249, 6592238, 16075526, -5916855, -30582314, 2959769, --15087683, -2482491, 9171903, -12463458, -8405788, 17911624, -16258062, -3084324, 141197, 8915815, --17415018, 1831267, 52217140, 16742319, 3774740, -4136591, 8558259, 14265734, -4318053, 6478422, --7524783, -405874, -5877663, 24035174, -27014270, -3403225, 16677895, -38312720, 12621298, -9599789, -3190624, -4776541, -10304163, 6460705, -2610266, -15797963, 41941428, -32089848, -8613557, 29220810, --18617610, -3223373, -5653251, 6176700, 29553134, 1951526, -28200756, 38769596, -20803210, 13608604, -24676198, 10533944, -8785356, 1839857, -21163452, 4932233, -12695923, -10545755, 52665964, -12481712, --20564304, 6506339, -9440875, 12120398, -7831873, 13339632, 33995204, -18838800, 11457362, 25425132, --29952028, 13549548, 16768626, 7220914, 20911122, -23798950, -5885716, 35683664, -24538222, -5787469, -10581726, -10384694, 34644816, -34427384, 6103686, 11985106, -15458661, 11649562, 13430363, -32801738, -11870216, 27377196, 5906, -8646306, -1000727, 17497160, -3374234, -30822832, 25107306, 11441256, --13094282, 4761508, -7076496, 10678899, -3979824, -13975287, 16386911, 571768, -3183108, -12192338, -11485279, 1798518, -15500000, 5331128, 10922102, -2513630, -4854924, 1993402, 10124312, -1772748, --9852655, 10084583, 7139847, 950262, -184684, 8380555, 2008434, 2733210, -11763915, 15057082, --8130373, 16080894, -29304024, -78957072, -124177704, 11333882, 118946968, 9832254, 269277792, 278022368, -138430016, 291076928, 194143264, -40121436, -4071092, -63851668, -233445968, -204847936, -126589328, -238421152, --186597536, -54069880, -116843512, -97733592, 34941168, 58971512, -28166396, 15653545, 52679384, -40058088, --23347442, 74197168, 65900904, 7896834, 73643120, 125495184, 42152956, 90908352, 171538304, 82629800, -43786116, 153811904, 128603672, 17562658, 92493728, 180210928, 36024576, 42825120, 145635360, 63077500, --15236396, 103179608, 97373352, -8501888, 86041080, 110995376, -1336809, -80329312, -37193344, -189463888, --313381760, -278604320, -297155904, -454059648, -407854400, -381576160, -464255904, -451000032, -369962048, -333497760, --300032992, -173482848, -66462472, 59311888, 125695976, 240323280, 358060160, 390899456, 435348608, 567958976, -560492160, 441139328, 482507904, 426700704, 176867824, 192731824, 163821856, -6374805, -26262114, 47860968, --6117107, -72679440, 9965935, 49776524, -47006808, -18303540, 44027708, -22453552, -92481384, -30144228, --24634858, -134018552, -94858112, -25123412, -105031816, -118967912, -7724499, -41801844, -120361088, -57508000, --54153096, -169387072, -160614064, -145444240, -262729584, -284023488, -236774560, -252527440, -272568832, -195046816, --166292000, -144168096, -104231880, -55759948, -24739012, -6111739, 22801444, 94352376, 128515624, 197865392, -322125216, 364261536, 402918944, 470593120, 459937312, 405423968, 345721792, 243185344, 106091064, 28623810, --21842056, -74117712, -87450368, -85623392, -86521040, -88280904, -81964080, -73420320, -79135312, -80620832, --75550088, -80783504, -88265872, -82670608, -77054400, -70557184, -50822348, -23611582, -5479842, 1469416, -2094870, 474057, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ -1627256, -6451578, -3213709, 1780801, -667331, 367220, 302258, -2611877, -2961380, 1931125, -542240, --2381559, -3036542, -1876364, 2673617, -286152, 3588982, 747324, -4556424, -4711579, -3341485, -1365263, 1162326, 2431488, -365609, 2783676, -2135136, -402653, -4927401, -765578, -919660, -1008780, 1852742, 1851668, 3637837, -1819992, -2436857, 1960116, 1110249, -2383707, -2423435, -104690, 1692217, 802085, 4039417, -1546725, -1280974, 4569309, 1399623, 8574365, 3648575, --2420214, -82678, -5295695, 98784, -6034966, -397284, -2265059, 4161823, 427349, 2233920, -3036542, 1649804, 2910914, 1944547, 402653, -5053566, -574452, -2532957, 3471407, 5085778, --3579855, -2539400, -1546725, -2058900, -2705293, -4332549, -996969, 1299228, -2566780, -2111513, --912681, -3561602, 400506, -716186, -2417530, 768262, 115427, -13959, -1196685, 212601, -210990, 1324461, -380641, 854699, -452582, 618475, -184684, -799938, 205622, 1040993, -163209, -933082, -973347, -98247, 1760937, 411780, -356482, 286152, -534187, -10131828, --10831371, -860604, -3106335, 417149, -2350421, -638340, 6026913, -1077500, 3240016, -1489280, --2896956, -4003983, 735513, -827855, -4782446, 5513128, 1656247, 379031, 2938831, 2804077, -4545686, 3202435, -301721, -3382287, 3157875, 736050, -4559645, -2014340, -2056216, -1365800, -4075924, -1395864, -6953552, -2354716, -795106, 1452236, -2161442, -4524211, 147640, -441308, -5255966, 779000, -42413, 1920387, -120796, 7092065, -1223529, 652835, -1567663, -2813741, -2684, 3045669, 1377074, 831076, 2878165, -2640331, -4400194, -3147137, -633508, 579284, --1026497, 126165, -3302830, -731218, 1730872, -1053341, 3445101, 1797981, -194347, 639413, --3230352, -2750927, 5346161, 1214939, 2277407, 1551020, -950262, -314069, -4060355, 286689, --2319819, 996969, -790811, 1034013, 1102196, 3143916, -326418, -1098975, 185757, 673773, -421444, 112743, 111669, -947040, -744640, 381715, -341450, -816044, 1278290, -646393, -657130, 972273, -919660, -274341, 736050, -277562, 1319092, -792958, 655519, -631897, --458488, -1647657, 1516660, 7004555, -387621, 3594351, 2110977, 4793184, 5873368, -1335198, -477815, 3622268, 3569655, 2395518, 6719477, 1369021, -2206540, 297963, 5877126, 2076617, -2770254, 5108864, 6852621, 4533875, -1569274, -4698158, 3296924, 2260764, -2734821, -4538170, -230318, -2648921, 1192390, 1742683, -1677722, -2263985, 2262374, 1807108, 4031364, -2710661, --5551245, -2771865, -2418604, -3684545, -1306744, -4209068, 2491081, -5762236, 2443300, 490700, -1298154, -2563022, 5466957, 4195646, -3928821, 4833986, 1778117, -716723, 1551557, -3506304, --1162862, 3304441, 1131187, 1383516, 820876, 3946538, 1553704, 4879620, -2444373, -296890, --366146, 1892470, 2777233, -1129576, 1830193, -2565706, 1244467, 1712081, 1489817, 5353677, -144955, 3994320, 4425427, 2511482, -4135517, -787053, -692027, -1071058, 307627, 2266132, --998580, 67109, -226560, 256087, 766115, -670015, 909996, 1560684, -1153736, -588411, -1428614, 48318, -45634, -79994, -908386, 367757, -472983, 118112, 1090922, 1879048, -19864, -260382, 888521, 723702, 236223, 432181, 300648, 456877, -133681, -266288, -773631, 1016834, -1009854, 532039, -405338, 19370302, 161598, 17151416, 1381369, 10863046, --2330557, -1870458, 2977486, -8108899, 8868571, -5040681, 5951751, 4385162, -3237869, 2588255, --229781, 328565, -1489817, 2465311, 3513283, 4343286, 7173133, 1744831, 2298344, -281857, -8435853, -9675488, 250719, -744103, 2337536, 4100083, -5071283, 1941862, 2315524, 1175747, -3387656, 1816234, -3907347, 1862942, 7557532, -1422171, 2327872, -1282585, -1149978, -372588, --5389110, 8331700, -105227, 797253, 6265821, -893890, 507880, 7722888, -11331197, 3096672, --185220, 3375844, 9220758, 2719251, 2251637, 3160022, -965831, -2597918, -1707786, 2217277, -871878, 4904316, -1751273, 4023848, 1927367, -1418950, 869731, -3281355, -2067490, 392453, --912681, -4517769, -2806224, -4621922, 2753074, 4002910, -1047972, 1202054, -905701, -3090766, --82678, 1627256, 1735704, -5509906, -176094, 457951, -787590, 256087, -1071058, 58519, --1153736, -2682207, 5369, -1793686, -1343788, -2226404, 154619, -2178622, -598074, -2114735, --1506997, -119185, -682363, -1150514, -52076, 224949, 1065689, -1157494, -7730405, -9527311, --3762928, -1442035, -3550327, 7602092, 3266860, -6092411, 6789807, -963683, -4930086, 1461363, -2964064, -2767570, -4504884, -4084514, -8576513, -4351339, 3720516, -5461051, -8709120, 2442226, -3541201, 683974, -3196530, 6517076, 819802, 6024229, -366683, -1410897, 3463891, 5705327, --8130910, -3900904, 2231773, -1848447, 2007897, -5349382, -375273, 1410897, 1941862, -4570919, --8257612, -2355790, 2426657, -1428077, -1029182, 473520, 2687039, -848256, 1497870, -2818036, -4810900, -6328098, -4694400, -1679332, -4598300, -1416266, -1232119, 1803886, -3369402, 2522220, -5223217, -486942, 1238561, 1367410, 2514703, 5049808, -1918240, -1014686, -948114, -2149631, -5311801, -2193655, -9204652, -5929203, -3878892, 8818642, 172336, 5040681, 2350958, 726386, -1392643, -657130, -178241, 4220879, -1396938, -1017907, 1402307, -794032, 708133, -1957968, --1136556, 929324, -235686, 1026497, -252329, 584652, 1623498, 1097364, 1519345, -41876, -1065689, -284005, 1556926, 1628330, 2757369, 1656247, 2194192, 459562, 1473174, 1189706, -923418, 1239635, 1823214, -870268, 166430, -408559, -739271, 686121, 1088774, -2210835, --8369818, -19458886, -1811403, 1348083, 212601, -6308770, -2788508, -7159711, -1839857, -8444443, --9666898, -7558606, -1745904, -5006858, -10894185, -6820945, 2265595, 3374234, -3002719, 6560026, -3638911, -2425583, 8099235, 1733556, 679679, 1301912, -11060078, -405338, 1855426, 4170950, --3468186, -3081639, 6609418, 12836584, -9589051, 3456912, -2811593, -493921, -8449274, -743566, --82678, -4313758, -5461588, -3974455, -4643934, -2477659, 2784213, 9426379, -4387846, 3537443, -6382859, 5767604, -1931125, 656056, -2048163, -1825898, -8672613, -4296578, 4939213, -3128347, -1083942, -2986076, 2498060, 1323387, -942745, -323196, -4037806, -3337190, 778463, -1200980, -1801202, -10274099, -10858214, -1162862, -1573032, -4664335, -6979, 3458523, -5328444, -4105989, --4540318, -7903277, 5614059, -563714, -1166084, 2159295, -289373, 1939178, 3712462, 1293322, -2072859, 1185948, 2734284, -798327, 510027, 454193, 642635, 913217, -682363, -657130, -177167, 854699, 1075352, -650688, 886911, -954020, -1832877, 1032940, 760746, -713501, -2458332, 1124745, 191663, 963146, -1443646, -1566053, -387621, -817118, -633508, -12083890, --2380486, -14550812, -3263638, -10307922, -1232119, 1946157, 2623688, 11195369, -6984154, 2507724, -3020436, -6067178, -2742337, 9009768, 954020, -2624225, 1130113, -7409356, 6727530, -9495636, --3139621, 4243965, 2635499, -981937, 1621887, -1869385, 3111704, -4047470, -7138773, 494458, -3452617, 2834679, -5709086, 1590749, 6414534, -6589017, -8363375, 6673843, -5703717, 4360466, --4105452, 2436857, -170188, -5925445, -7723425, -4746476, 2102387, -299574, 2883534, -4024921, --3936338, -9848360, 5137855, -7056632, -3232500, 3847217, 8746701, -1125818, -1817845, -12894566, --10168872, -3379603, -3626026, 4861903, -1377074, -7550016, -1213865, 408559, -4207458, -1024350, --9032316, 6026376, 2335925, 7597261, 9264244, 4893579, 376883, 4045859, 8263517, -678605, --1909650, -556198, -2531883, -8208220, 454193, 616865, 1766305, 4413079, -1794760, 983011, --8590, -3222836, -1755031, 3015604, 2886755, 2745558, -2110440, 835371, 1133871, 1054415, -1007170, 1214402, 391916, 2298344, 2267206, 1557463, -466004, 1065689, -394600, 915902, -1634772, 593779, 656056, 51540, -571768, -500901, -38118, -1415192, -667867, 7177427, -3761855, 20844014, 10084046, 13503914, -4178466, -513785, -225486, -20558398, 1077500, 8884140, --4076461, -1584843, 703838, 12976170, -2200097, 7522635, -1541893, 7204808, 3948149, 8895414, -12484396, 1617592, 8333847, -2571612, 7211787, -966905, 13360033, 7121593, -230318, 7614977, -6134824, -2241973, 5855651, 3537443, 5055177, -3992709, -3216931, -10794327, -668941, 7665980, -1465658, 981937, -2522757, -4034048, -3234110, -3556233, 18799608, -12091944, 4785668, 5719823, -3230352, 1630477, -7232188, -9599252, -2469069, -1427540, -458488, -16636019, -8267812, -8551280, -393526, -391916, 4930623, -545461, 4377646, 5897527, 10638097, 1956358, -2763812, 3583077, --6728603, 1832340, -4941897, 1789391, 4100620, 2327336, 6764574, -4590247, -5236102, 24410984, -3317862, 4423280, 3062312, 8278550, -5895380, -3044595, 5186173, -618475, -175557, 946503, -1682554, 4771172, -2412698, -381715, 864899, 2738042, 589484, -2543695, 4594542, 151934, --1138703, 84289, -583042, -2505577, -2373506, -1113470, -2636036, -32212, -1065689, 1101122, -3267933, -336618, -382252, -3686693, -828929, 1776506, -464930, 186294, 274341, 2845416, --1557463, -466541, 859530, 1049583, -3259880, 31934156, 3443490, 4751308, 3615826, -2004139, --12931073, 8730058, 9251896, -5184563, 4067871, 4141959, -7735773, -1098975, 7636452, 4356708, --13642427, 3469797, -3661997, -7016366, -73551, 4008815, 1182190, -140123, -156229, 5902359, --1741609, 3326452, -10578504, 4279935, -981937, 4203163, 2537789, -1949915, 7742216, -10390600, --4345970, -10260677, 9063992, 4230006, 14705431, 7208029, 96100, 3133716, -11668352, -97711, -3599720, 3771518, 3750580, 792421, 2238752, -3122978, 3526705, 10470057, 14256070, 6104223, --6247567, -3531537, -1277753, -2779381, 5421860, 7129109, -4759898, 4220342, 8058970, 2423972, --10671920, -21437792, -10392747, 4311074, 9585830, -4035659, 3023657, -804770, -1757715, -68719, -10009958, 1802813, -7853348, 13258027, 6230387, -15355582, 955093, -1839320, -4693326, -1713692, --2078764, -1074, 5589363, 2250563, -3873524, -2189360, 3428458, 5739687, -2263985, 4371203, -1416802, -3554086, -625455, 588947, 448287, -648003, 620623, -1748589, -974421, 1298154, -687195, -1546188, -1359894, 133681, -748935, -2580739, 1976759, -874563, -1009317, 783295, -3093450, -2885681, -4261145, 12885, -293132, -6749541, -783295, 1750199, 397821, -4048007, --77846, -1455457, 1737314, 1032940, 2574296, 1761474, -19536196, 5826660, 9364102, -10545755, -6846178, 11384885, -27827630, 5965710, 1265942, 6063420, -10331007, 15700253, -21937620, -254477, --1496796, -1864553, -2176475, -6471442, -8239895, -1428614, 7974681, 745177, 304943, -4264366, -5641440, -932008, -2629057, 4123169, 9829033, -6522445, 7116761, -1342714, 4360466, 2072322, -6694244, 10049150, -2235531, 2595771, -12996034, -6627672, -2597918, -5027259, -11822971, 1219234, --4232154, -7829189, 11576547, -10806138, -3460670, -5130876, -5683853, 7764227, -8764418, 4913980, --2979097, 7980049, -4110821, 8745627, -11493869, -3371549, 1646046, 10604811, -18638010, -7151658, -855235, -75162, -3177739, 7407208, -9579388, -19187230, 4320737, -16859894, 8686034, -6084358, -237834, -17625472, -6673843, 18800682, 10881300, -14329622, -11703786, -10184978, 786516, 5616207, --2282238, -6486475, 12492986, 4264903, -1960116, -2808909, -4413079, -1097364, 5029407, -4651450, -5393405, -758599, -3379066, 502511, -2530810, 1741609, 4595078, -2772938, 2159295, 3040837, -2494839, -558346, 5311801, -5015985, 5029944, -1541893, 4454418, -5811091, -2684892, 645856, -605590, 5632313, 2201708, 3303904, -1727114, -3547106, 2173790, -6643778, -379031, -14475114, --6213744, 18236432, 767189, -15037754, 14155138, -6626061, 937377, -15680926, 2406792, 6220187, --13841069, -3376918, -12371116, -85362, 779537, -4165582, -3441343, 12073690, 1848447, -8175470, -2041183, -17518634, 10519449, 16696148, -5409512, 6973417, 11832098, -883153, -2429878, 1458141, -1427003, 6938520, 1172526, 1604707, 3630858, -9793599, -717260, -11258720, -11516418, -4719096, -4824322, 6831683, -372588, -13546327, 2658048, 3551938, 6653978, 14482630, -14861124, 21734146, --18035104, 794032, -3642669, -3125663, -8727374, -16727287, -22575422, -8754754, -2594160, 5744519, --1722819, 932545, 3309809, -169114, 15881178, 7513509, -16314970, -2549600, -343597, 10398653, --11279658, 745714, -22721988, 4247723, 17732846, -15868294, -6238440, 2238752, -184147, 4429722, -24852828, 363462, -3292629, 1284732, 12647068, -8606041, 3377992, 4617090, -1891396, -930934, --179852, -346282, 5622112, -1856500, -1307818, -4892505, 8192113, -1793149, 2401424, 810138, -1430224, 2033130, 5952288, -4171487, -1082869, 6305549, -4604742, -6487548, 5319317, 238371, -2587718, 3576634, 2011118, 6519761, -5106179, 3021510, 3597572, -2289218, 9235790, 3150896, -5641977, 2048163, -5595269, -2064269, -966905, -999654, -1010391, -9310415, -18886044, 22574348, -9644886, -11063299, 14656039, 14664092, 20829518, -7683697, -7190849, 15202037, -2234994, -3010235, -5301601, 6758131, 2700998, 3231426, -20717312, -2202781, 66572, 170725, 1149441, -2346126, -8792335, 17037598, 1731946, 1161252, -283468, 810675, 15703474, 4165045, -1098975, -3433290, -4026532, 3466576, -2455111, 1795296, -8949638, -1876901, 13656922, -13553843, -6577206, -11690364, -15258408, -13985487, 7012071, -5732708, 4493073, -3048353, 3624416, -11241003, 2576981, 16938814, --11151346, 874026, -29584808, -1329829, -10451803, 785979, -27614492, -1238024, -1360968, -8535711, --5935645, 22523882, -24197308, 4016331, -6545530, -9048422, 6501507, -8209293, -18906446, -13280576, -1824824, 972273, 3890704, -9390946, -12737262, 7218767, 597537, 1386738, 8460012, -14141717, -10557566, -10297184, -4838281, -4446902, 2492155, 329639, 2994129, -1861868, -3628711, 840740, --2078227, 2930778, 6552510, 3792456, 2388539, 1814624, 1744294, 1695975, -751619, 7110319, -1310502, -1429150, 5294084, 5431523, 1999844, -3110630, -365072, -4511327, 7075422, 2465311, -5674189, -2881386, 5821828, 5176510, 7638600, 3714073, -2258616, -4110284, 6401112, 1232656, -5521718, 1184337, 1419487, 1384590, 1574106, 18934900, 6665789, -2500745, 4099010, -9484898, --9987410, -8194261, 18454400, -16483011, -20480552, 9823127, -19053548, 7082401, 762357, 5208722, --8501351, -2048163, -10352482, -4393752, -7983271, 3871913, 9516037, 6554120, -15372225, 17921824, -2207076, 6269042, 1672353, 8636105, -1816771, 8296266, 2071785, -3688840, 5328981, 1938641, -7050189, 4834523, -11651709, 4705674, -3386582, 3307125, -2340220, -4349192, -3575024, -8198019, -7691750, 8198019, 8606041, -1593970, 15709380, 18726058, 7533910, 2458332, 8540542, 19408958, -9621800, 21172042, 13642964, 15783468, -16914118, -17068200, 3516505, -3462818, -4552129, 1333051, --8501888, 7099581, 5352603, 3337727, 16161962, -3787624, -10386305, -8739722, -7669738, 1874753, --3636227, -34615824, -15017890, -13474923, -4855461, -6999186, -3595425, -5254356, -9787157, 357019, --5866926, -5662915, 2336999, -5681705, -1741609, -8732205, 558883, 448824, -1332514, -12441983, -5182952, -43487, 648540, -9362492, 2886218, 3313031, 3670587, 1010928, 10924786, -7030325, --2604898, 2203855, 1266479, -806380, 4556424, -4984310, -4133369, -921807, 7789997, -808528, -5695664, 6361921, -1271847, -8043400, -7084549, -892279, 8137353, 595390, -5642514, 788127, --1152662, -3939022, -2806761, -1271847, 576599, -6024229, -4969277, 15397458, 10457708, -33719788, --24904904, -7755101, -325344, 11113765, -4636954, -790811, -26848378, 3801583, -14069776, 10042707, --1969243, 13305272, -11425687, -2835752, -13557601, 2353105, 11004780, -5276368, 3183108, -7740605, -536871, -18116708, -5076652, -865973, 1246077, 13448616, 17425756, 617938, -16125455, -11287711, --5262946, 1660005, -4321811, 5123359, -18535468, -5715528, -2618856, -4776541, -10459856, -2415919, --4877472, 12581570, 18131742, 12320651, 4387846, 7535520, 7530689, -8770323, 30346092, 18496276, --24145770, -20752746, 22252762, -17571784, -10292889, 3481071, 2336999, -17054242, 16409996, 1111860, --51740936, 13845901, 32219770, -22373558, 22145926, 29894046, -10120017, -3055869, 15768436, -18604724, --12537010, 6260989, -10348187, -11621108, 13332652, -22580254, -7085623, 2944737, 308164, 1323387, --2398202, 8326868, -6146098, 3580392, 991601, -5973763, 11740293, 6150393, -629213, -7604240, -8997420, -5770289, 6885370, -6145562, 8426189, 927176, 1547262, 8812199, -7063074, -7621957, -2050310, -7031399, -4602595, -315680, 493384, -4678830, -8723615, 4024384, -20127828, -537, -8876087, -7326678, 5113159, -2243584, 2428804, -8318815, -82678, 4556961, -4181151, 2983392, -17542258, -7943005, -7765838, 17537426, -12981539, -2133525, 14445586, -10521059, -6655052, 11059004, -6828998, 7252589, -1789391, -10857140, -8667781, 10208064, -8152385, -775778, 3042448, -15352897, -9979893, 8121783, -6207302, -5050882, -11969537, 289373, -7406134, 10311143, -16807818, 1243393, -6440304, -933082, -7998303, -17460652, -3923453, -7621420, -1699196, -13524315, 18379238, -17999672, -3138011, -6575595, 4616553, -25475598, 26200374, 4932233, 2611877, -10539313, 5966247, 4216048, -1136019, 2328409, -4691715, -20120848, -3489661, -8745090, -12881144, -17299054, -6236830, -4409321, --17141752, -6621229, -820339, 11768210, 5433134, -15575162, -13575318, 8279087, -3585761, -19756312, --8521752, 4762045, 16168941, 16025060, 16334297, 26052734, -5062693, -17801566, -16977468, -1158567, -11434277, 20267414, 9102646, 4285841, -20806970, 11594801, 4298189, 19759534, 13734769, 8899172, -6743099, -96637, 1700270, 11581916, -2842195, 709207, 1999307, 3263638, 3943854, 3641059, -5569499, 13906567, 4332549, 889058, 4742718, -483721, 4414690, 1144609, 736050, 8556112, --10678899, -7692824, -2901787, 3760781, -5463199, 3287798, -2450279, 10778220, 295816, 1622961, --5850283, -7342247, 498216, 6170258, -6165426, -919123, 7287486, -6365679, -490700, 3224447, --10759967, 12696460, 6824703, -2592013, 2962454, -780610, -286152, -3422015, 7191923, 12145631, -32870996, -28993176, -838056, -11569031, -15337328, -9206799, 15042586, -8256001, -8928163, 7676717, -19372450, 12160663, -14533632, 9360881, -15250355, 11184632, 636729, -1754494, -7370164, -11418171, --9160092, 1890323, 2108292, -18037788, 11442867, 1845225, -1599339, -6875706, -7609609, 12739410, --17438640, -870268, 19044422, 22307524, -20000052, -1387811, -3941169, -13027710, -16741246, 18312130, -4227859, 11622182, -3549254, 1374390, -1532230, 11569031, -4469987, 574452, -14333916, 20588462, -17279728, -25224880, -30697742, -6579353, 441845, -10186052, 1110249, -7586523, 2438468, -15677704, -16642461, -20139638, -17493938, -6623377, 3002182, 13792214, -7134478, 20013474, 2229625, -7237557, --6745246, -5337034, -12515535, 12167105, 9268539, -3393024, 7864085, 6000070, -9753334, -9957882, --8238284, 15493558, 4270808, -11207717, 1642288, 4318590, 5476620, -16680579, 8797167, 6565395, -3464965, -244276, -4318590, 2142652, -4748087, -14849313, 3445638, -2037425, -2291902, -1801739, -1859721, -4551055, -5234492, -378494, -1627793, 7313793, -3508988, -2121714, 4706211, -2044941, --6513318, 5762773, -6483790, -2332167, -11624329, 6399502, 1771674, -1787780, 2639258, -5483600, -11263015, -741419, 2350421, 12093017, 9239012, -3418794, -3415573, 5799280, 3830574, -4210142, -2910377, -3862786, -2947421, -771484, 3321084, -44487808, 65910032, -45283988, -11583527, 11925514, -35582732, 28926604, -10704132, -11583527, 1859184, 1651952, 18330384, 6769406, -24335284, 7292855, --5297842, -8535174, 2335389, 9943386, -191663, -18210662, -16117939, 8503498, 6881612, 11260867, --6225555, 13939316, 3180423, 16348793, -1767916, -5570036, 12022687, -1457068, -13005698, 2261300, -14944876, -635655, -17224430, 8521752, 19888382, -18391586, 7182259, -19756312, 7741142, -24966108, --16401406, 27518930, 25563646, 12066174, 33314988, -6398428, 39786968, 14841259, 15288473, 21437256, --36197984, 30474404, 10312753, 12344273, 13968307, 3391951, -17719424, 2906619, 33554968, 38358352, --551366, -43346420, 21227338, 1219234, 8972724, -1454920, 925029, -9401683, -32810866, 6657736, --5544803, 7425999, -6208375, 16258599, -18500572, -19649476, -13990319, 2934537, -6103686, -8795556, -10425496, 4240207, -14249091, -14860050, -11952894, -8704825, -1721745, -2237678, 7649874, -96637, --12250320, 9693741, 1730335, -2846490, 360777, 4863514, -6206228, -2809446, 5822365, -10435160, --4696010, -7067369, 6026913, 8005819, -9100499, 2896419, -24083492, 752156, 973347, 1609539, --4870493, -4161287, -10986526, -7761006, 5260261, 3884798, 5032628, 8742406, -8174397, 1064615, -3016678, 2564096, -8021389, 498216, 1724966, 194884, -6631430, -440234, 43660492, -1674500, --51773684, -26273388, -30448096, -11724187, 346282, 17040282, -44117368, -9965935, 7031935, -20669530, --23643794, -21674016, -23603530, -3889093, 26223996, 13351980, -10283225, 12484933, 5230734, -12058121, -13569412, -15212237, -3270618, 6221260, 9006010, -30137786, 15174656, -14877230, 8682813, -6011344, --24058796, 6598681, 7574175, 3619584, 4041564, -10140955, -34187404, 1265942, 7143605, 7333657, -410169, 4139275, -14158897, -309238, -1153736, 30964566, -4732517, -51310900, -23064512, -5712844, --42456824, 9519258, -12943958, -11011759, -20448876, -9341554, -30565134, -30165166, -36766532, -3841848, -38754564, 5135707, -24492052, 11098195, 355409, -2915209, -13776108, -19579146, 8142185, 15740518, -12146704, 6382322, -7341710, -31598074, -22388590, -31814970, 4636954, 3216931, -1117228, 10981695, --16655346, -20382842, -2858301, -7743826, -20583094, 4176856, 11811160, 1312649, 4302484, 19429896, --3593277, -4456566, -3418257, 927713, -7132867, -4320200, 8786966, 13111998, 14717242, 9539122, --4140349, 244276, 2247879, -6601902, 13612899, -6046777, 19889456, -7474854, 9298067, -9989557, --2728915, 19783156, 6640020, 2288144, -181462, -8433705, 7893076, 1226213, -9955197, 3942243, --8535711, -11383811, 3039226, 2703145, -6805913, -7073275, 6805376, -194347, 9606768, 1519882, -6505802, -4193499, 2804077, 2143726, 28492276, -3134253, 22783190, 29993904, -25400974, -31233002, --33435246, 8996883, 11348377, -45185204, -26546656, 1204738, 1027034, 13995688, -53173844, 5957120, -11950747, 36988260, -42651172, 5324686, 6670621, -4973036, 23090282, -13143674, 40672804, -1939715, -3330747, 12664785, 15627775, -15161771, -33355252, 19593104, 23075786, 5706401, 29271812, 6057515, --4033511, -10725607, -25273198, 39018168, -17585744, 37000068, 14210973, -2375654, 10579041, -15164456, -19557134, 19945828, -13947369, 14927159, 7181186, -38088308, 27761594, 28876676, -3850975, -19238232, -3466576, -576063, 1007707, -6541235, 52697100, -600222, -30955440, -16820166, 5775658, -43937516, --58299348, 8358007, 72428184, 16472810, -5347771, -45977624, -11989401, -7276212, 49299784, -33428804, --21903796, -81117976, -12016245, -14475114, -19416474, -14832670, 29773788, 32474784, -32077500, -11895986, -10327249, 4932233, -6018323, 13652627, -5792837, -9546639, -10212895, 11859478, 4342212, 4226785, --4235912, 11661910, -11633456, -3316252, 9618579, 5111011, -816581, 163209, -8715562, 4767951, --5835250, 21785148, -5944235, -10838887, -9580461, -17416630, -6291590, 14646375, 15615964, 43717936, -16223702, -4153234, -32942400, -44612900, -21376590, 1448478, 18425410, 15804406, -12229383, -17253420, --9297530, -6571300, 11128797, 20369956, 4200478, 1975685, -2561948, -6069326, -6003828, -72405096, -21020644, 35044248, -46631532, -3986267, 26137560, -11042898, -20983062, 18959060, -20246476, -10854456, -1534914, -14998563, 24581708, -8058970, -11237245, -4058207, 12984223, 44719736, -6937446, -20252382, --22891102, 8486319, 21253646, 12956306, -20234664, -2943663, 24188718, 895501, -18343806, 6318434, --16376173, 41375568, -18626200, -44332116, 15363098, -7260642, 21240760, -29622390, -29407104, 29727080, --2412698, -37983080, -20357608, -36282272, 47240884, 23035520, 12704513, -49579492, 8804683, 20799452, --34988416, 2297808, -25154012, -18785650, 19448148, -16677358, 22323630, -13734769, -30419642, -6607271, --7594039, -4246649, 10355166, 3885335, -19044422, 59170152, -7350837, 26392574, 26679264, 16578574, --8144332, 6471979, -13501767, 33399814, 8027831, -8089571, 3817152, 14345728, 22842246, -5449240, --50164680, -3126199, 15417859, -4705674, 26228292, -10921565, 8924405, -3754338, 491774, 11142219, -2430415, 6884296, 13262322, 8244190, 15425375, -3502009, 4857071, 8525510, 852551, -15822660, -19016504, -7752953, -130997, 3215320, -9880572, 5187784, 732292, -2335389, 13128104, -5828271, -714038, 19566798, -480499, 10988674, -9745818, -5898601, 10154913, -2259690, -7495792, -9943923, -223875, 1555315, 2112050, -3216931, 2162516, 6194954, -2508798, 52382496, 10928007, 22605486, --1787243, 5345624, 8466454, -19258096, 8559333, 18182744, 324270, -22136798, -11613055, -16463683, --6534793, -22185654, -21120502, 2501282, -16804596, 24718610, 8207146, -5958731, -17864380, -8804683, --5774047, 13240310, -3983045, -20992190, -17041894, 4192962, 4631586, 11774116, 4689568, -4764730, -5705864, -18329310, -55143084, 2139968, 67267776, -2141578, -48619028, -8103530, 32105954, 8719320, -5382131, -1079111, -21020106, -26584236, -15620259, 5834176, -1446867, -24604258, 9199283, -49304076, --8607651, 45316736, 13576392, 58346056, -7508677, -23278186, -6780680, -5337034, 15867757, 3224984, --239444, -32105954, -15857556, -15451682, -1950989, 36863168, -4774930, -9246528, 12399034, 14820858, -2614561, -19905562, -30562450, -2413772, 12688407, -1558536, -15056545, -4103305, 8825621, -6666863, --5522791, -10268730, 18811420, 19423990, -9629317, -5361730, -8826695, 7784092, 11809013, -5560909, -1912871, -2252174, -1371168, -3862786, -14472429, 1422708, 8650064, -9120363, 2450816, -2345589, -914291, -8186745, -2437394, -3560528, -4984847, -6259915, -5970542, -1966558, 26540214, -13244069, -415001, -5334887, 1706176, 14345728, -9557376, -1572495, -2547453, 4392141, -413927, 3980361, --7275675, -23177254, -77510736, -119378616, 28063854, 107094472, 33621004, 261784160, 246326576, 109751448, -253993632, 107470816, -46210628, -639950, -76565848, -208953920, -114287472, -109355776, -214424624, -155889056, --89741192, -134854464, -90902984, 19876572, -8020315, -43067248, 51022600, 47952236, -354872, 51397872, -139037216, 58558656, 26063472, 133361416, 119061328, 40173512, 141861696, 173888736, -437013, 103062032, -175019920, 66469988, 69870528, 178709296, 106525928, -14016626, 139211696, 97948880, -38175280, 54832772, -110692048, -49526880, -88164944, -19764366, -186136896, -312066944, -302403808, -335934080, -537761024, -465206176, --384055968, -497368480, -426716800, -273993152, -325097888, -248219040, -68926712, -22103512, 104955040, 195820448, -322470976, 432388864, 471352256, 550111232, 597182976, 558135296, 528369024, 560839488, 426398976, 338322080, -401059744, 218930048, 34744136, 50596324, -81301048, -296434880, -249188640, -184152624, -266078592, -271801088, --169854688, -193007248, -243695904, -178406496, -162540352, -228993168, -205757920, -134005664, -170757168, -183092304, --60250876, -57679264, -108396384, -11425150, 40776420, -31009128, 5458367, 40754944, -58700928, -75530224, --72015864, -157022400, -173702432, -121460064, -91613800, -66606352, 22042310, 106140456, 144018304, 204564464, -261873280, 273772480, 290104640, 321181952, 304293056, 276854656, 288044128, 261059920, 193701952, 132891120, -34321084, -52053928, -133230424, -193299296, -216880272, -228179264, -204051744, -156315872, -137408896, -115732192, --95217816, -82114408, -72873248, -54766200, -43184284, -39674760, -39241504, -27759984, -21966610, -17820894, --8230768, 5494874, 16648367, 31831614, 31901406, 30655330, 27302034, 17678086, 6714645, 3770981, -200253, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --553514, -11153493, -5529771, 440234, -3299072, -253403, 4714264, 2237141, 2957622, -2580202, 3663607, --3787624, 4112968, 2056216, 4956929, 2093797, -943819, -5597416, 6019397, 4151086, 1525250, -708670, 557272, -2378338, -2726767, 3114388, 1904818, 2035278, 2986076, -3037079, -237297, -2806224, 3318399, -432181, -2484639, -4712116, 11274, 881542, -2855617, 1067299, 751082, --4247186, -2305324, -322123, 2150168, 49929, -2079301, 3968550, 730144, -1340030, -2947421, --651761, 336618, -5545877, 2549063, 3478387, -1942399, 4453881, 3631932, -574989, 3001109, -1785633, 5879274, 1860258, 1086627, -912681, 2203318, -4737349, 592706, 2279554, -2368675, -2609193, 3119757, 3454764, 2131378, 4538707, -994285, -2746095, -1451162, -1157494, 578747, --1041530, -3544959, 1677185, -1685775, -1846299, -2160906, 821413, -27380, -1074816, -879395, -1411971, 78383, -153008, -403727, -129386, 634581, 951335, -179852, -45634, -826244, -234076, -1465658, 148176, 933619, 1284732, -936840, -953483, 192200, 841814, -10582263, --7401303, -1053878, -4765266, -4078608, 2007360, -6026913, -5810554, 1671816, -2631741, -2362232, -2419677, -1903744, -4115653, -450435, -310311, -1165547, -1882269, -1114007, -4720169, -296890, --3403762, -2465848, -128312, 4218732, -936303, 6097780, -3169686, 3661997, 4212289, -4732517, -1650341, -1202054, 918586, -3352222, 1661079, 2160369, 3250753, -1673964, -3966402, -1387811, --2173790, 1264331, 1544041, -4820027, -601832, -3312494, -2651606, 896038, -3938485, -6322729, --1177895, 6192269, 1378148, 2161442, 344671, 1416266, 855772, 2273112, 2459406, 6944962, -530428, -3100430, -3981435, -868120, -1890323, -525060, -8060580, 1662152, -562104, 2565169, --1066763, 704375, -1913408, -957778, 7913477, 1571958, 7257958, -2471754, -1306744, 540092, -2075543, 688805, 2471754, -2423972, 2683281, -2823941, -1725503, 1425392, 1058710, -120259, -144418, 42950, -590021, 181999, -1053341, -115964, -349503, -192737, 489626, 531502, --573378, -1040456, -613643, 49392, 61740, 155693, 361314, -443992, -444529, -452045, -134218, -185220, 585189, 8590471, 9932649, 7619272, 5680094, 8010114, 3267933, 3473018, --718333, 2265059, 8458401, 886374, 2588792, -3153580, -2079301, 6456947, -4329864, -7933342, -2408403, -6630893, 5721970, 1330903, 6863358, -2197413, -418759, -1705102, 2262911, 2727304, --85899, -6755447, -1379758, 5757941, -3832722, 2587181, 1538135, -1318018, -1651415, 6400038, -4847408, 11176579, 4489315, 912681, 2689187, -963146, 688269, 3508988, 2109903, 9523016, --4078608, -2739652, 671626, 2439542, -1495722, 4404489, -4136054, 841277, -266825, -3198677, -994822, 939524, -4305705, -5850819, -3605088, 4599910, 2241973, 537, -371515, 3466576, -266825, 1136556, 6047851, 2963528, -1438814, -981937, 5376226, -4679904, 619012, -4220879, --1889786, -5449777, 1480153, -1149978, -3218541, -2129230, 3150896, 1922535, 563178, 1830730, --3015604, -526670, -257161, 2316061, 67646, 146029, 431644, 676994, 1718524, 1907502, -1520955, 97174, 812823, 1724429, 98247, -1607392, 1468342, -826244, -314069, 336618, --267362, 1261110, 1165547, 563178, -2684, -466541, -462246, 529892, 733903, 246961, -1120450, -2288144, -1449015, 1114007, -79994, 18690088, -331786, 9156333, -1661079, -1432372, -9819906, -9614284, -3331821, -750009, 4849018, 3368865, -2062121, 1869385, 904628, -8710194, -2198487, 4656282, 4132296, -9763534, -3438121, 1096827, -7005629, -1930588, 527744, 309238, -943819, -1083406, 4449049, -3161633, 3535295, 7308424, 7298760, -2134599, -4205847, -760746, -8221641, -483721, -457951, 47782, 793495, -4293357, 713501, 3449933, 500364, 805843, -3296924, -2215130, 2211908, 1278827, -929324, 5770826, 544924, 4583267, 883690, -1564442, -1982127, 3054796, 2625836, -157840, -4558571, -4147328, -5484137, -2455111, -225486, -22012, --672699, 4027606, 3449933, -2666638, -5385352, 140660, 2736431, 3308736, -3313031, -642098, -3115462, -317291, -482647, 4163434, 1919314, 1953136, -1614371, -1388348, -301185, 1770600, -2646237, 19864, 1988570, 693100, 112743, 350577, 621160, 2465848, 1825361, 2779381, --1496259, 1284195, 125628, 306016, -479426, 242666, 348966, 70867, 294742, -518617, -1275605, 1268089, -1308891, 266825, 673773, 771484, -487479, 2552821, -5022965, -13935558, --3653944, -4718022, 877247, 2324651, -2402497, -2791192, -26329224, 526670, 8410083, -6139119, --9884330, 7365332, -11182484, -1689533, -5032628, -5861557, -3692061, -3684008, 339302, 4461934, --878321, 2484102, -2907156, 3362423, -2647311, -3993783, 1687922, -1502165, -6357626, -8040179, -3768297, 374736, 3718905, 1152662, 8408472, 1190780, 2868501, -4082903, -7135552, -2056753, --3580929, 7045357, -3369402, 176094, 1755568, -3510599, 9787694, 6527814, 63351, -7866233, --10048613, -3391414, 3240016, -9002251, -304406, -4382478, -8640400, 788663, -13485124, -2971581, --1506460, -4991826, 8933532, -562641, -1500017, -152471, 5566278, 7200513, 2085744, -7217693, --2413235, -1829656, 3805341, 1816771, 2150705, -4055523, -5246840, 4050691, 2682207, 1016834, -1283658, -254477, 2236604, 643708, 3410204, 990527, 734976, -294205, -179852, 558346, -2172717, 3207804, 1892470, -781684, 1202591, -4005594, 1998234, 2390149, -745177, -331786, -664109, -900333, -323196, -217433, -1304596, -1291175, -776852, -376347, 686121, 1597728, --316217, -1842541, -77846, -2604898, 825707, 3589519, 1474248, 2123325, 1436130, 5578626, --15049029, -22181896, 2692408, -5082557, 4913980, -6227703, -11041287, 250182, 10096931, 2045478, -6184753, 4935991, 3816615, 2438468, -3576097, 2688113, 6703370, -10564009, -4959614, -3529926, --2385318, 3839164, -889595, 1306207, 6960532, 6059125, -2488397, -5966784, 1380295, -3350611, --2550674, -5783174, -4013647, -8795556, 2105071, -3299072, -75699, 7778723, -1560147, 1478543, -2060511, -5606006, 4700842, 4631586, 6500433, -5711233, 10263898, -1680943, -7503845, -6349573, --8208220, 7644505, -2887829, -8728447, 2653753, -1346472, -6145025, 6545530, 8798777, -3036542, --7341173, 5452998, 1732482, 4276714, -634581, 11834782, 6957847, -6897718, -3422015, -3250217, --2687576, 3958886, 5418638, 7030862, -9127, 941672, 2698313, -2773475, 2566780, -752156, -4539781, 6462852, -8741332, -3885872, -4406100, -2727841, -4501663, -325344, -3190624, 1500017, --193274, -253403, -392990, 1202054, -2172180, 5503464, -704375, 2368138, 803159, 1175747, --1090922, 256087, 125091, 369367, -1871532, 436476, -1227287, -1864016, -2911988, -795643, --201863, -418759, 77846, 406411, -616328, -322123, -1116155, -934692, 1684701, -20713554, --13959, -3762391, 1373316, -37581, 7816304, 5732708, 8096014, -1312649, 11043435, -5131949, -7510287, 9193377, 1695975, 9163313, 1980517, 2383170, -2566780, -935229, -3849901, 7265474, --446140, -824634, 10234907, 6183143, 100395, 2759517, -865973, -340913, 6658273, -3801583, --6577206, -3758, -907849, 3381750, -18609020, 11196980, 12080132, 4769025, 2355253, 322659, --5913633, -12410845, 8205535, -5000416, -5640366, -3777424, 7365332, -5180805, 4545686, 4612258, --4405563, -2917894, -10717554, 4938676, -6970732, 4140885, 694174, 3708168, 6519224, 10406706, -4465156, -4798016, -11443940, -2015950, 7004018, 11467563, 8608188, -1737314, -2275796, -7371238, --12257300, -1297617, 8477192, 3783866, 2672007, -2720325, 11250130, -383863, 3781182, 1088774, --2185602, 1063004, -5753646, -2799245, -2915746, 1911797, -1455457, -4106526, -2434710, -2838437, --3081639, 1225139, -4380330, -1820529, 825171, 749472, 3359738, 175557, 461709, 575526, --934692, 2750927, -889058, 3128884, 1112397, -904628, -2430415, -133144, 3001109, 2143189, --405874, -2954938, -803159, 2596308, 2308008, 322659, -562641, -366683, -1816234, 1995549, -7925289, 27070642, 14795089, -1302986, 2630668, 2419140, 6029597, 10715407, -1428077, 2122788, -18177912, 1872606, -719407, 10947335, 7693360, -7514046, 4570919, 1121523, 7361574, 5042292, --12503187, 9601936, -5748277, -800475, 1153199, 7523172, 1418413, 2059974, 5775121, 6568616, --6162741, 6746857, 20080582, -3499325, 9180493, 9372692, -4903242, 7357816, 2011655, -4783520, --5140002, 3584150, -4587562, -12414066, -1541356, -555125, 1347009, -15899432, -3822521, 4920422, --10010495, -6761353, -16531329, 5508833, 7697655, -11329050, -3987877, -5456756, 12071006, 305480, --6816650, -4799089, -7599408, 3856881, 10106058, -7135552, 3925063, -3030636, 4896263, 11373073, -4821638, 8959302, 9147743, 11354283, 1779190, -6363531, -6312528, 4550518, 7230578, 1036698, -4868346, -5093831, 2068027, -629213, -1549946, -5350456, 762357, -2380486, 332860, 4335233, -1864016, 1819992, 1492501, 4786204, -2959233, 156766, -787053, 1411434, -549219, 145492, -2063732, 521839, -1680943, 2548526, -554588, -3714610, 2302639, -2662880, -2108829, -2761664, --5537287, 2964601, -1269700, 2501282, -295279, -558883, 738198, 4083440, 2769717, 3637301, -1705102, -92342, 1498944, 4193499, -1735704, 27827630, 7488276, 1127966, -1559073, -4036733, -221728, 5203890, -3329137, -6440841, -9475772, 710280, 6854231, -8483097, 4221416, 5564667, --2335389, 18779208, 6696928, -4686346, -3153043, -1422708, 6804302, -2792803, -6209449, -6908992, -4377109, -15066208, 590558, -4263829, -5439576, 4797479, 1126355, -5538897, -3345243, -5324686, -7573638, -2502892, -11855720, -1474248, 338766, 860604, -6847789, -9755481, 985695, -1851131, --1253057, 3269544, -1993402, 9073655, 1950989, 5396627, -5746130, 13223667, 3922916, -6664716, -8850854, 16737488, -4742718, -4172024, 8670465, 7888245, 3382287, 4780836, -10276783, -2810519, --11116449, 3242164, 10580115, 4698694, -13044353, -2723546, 4242891, -13025562, -20258824, -1819992, -756451, 5721434, 18564460, 1416266, -2013803, -5830955, -4281546, 2833068, 4775467, 3870303, --192737, 2019172, 272194, -4145717, 2623688, 3122441, -5107253, -5040144, 5703180, -1947231, -3391951, 2433636, 1758252, -1483911, 1301912, -213138, 2039036, 397821, 3048353, 2684, -2705293, 1745904, 684510, -2481417, 5527086, 1646583, 5055714, -1124208, -1553704, 1723893, --3216394, -650151, 2461553, -3207267, 908922, 1714229, 1208496, 1090922, 2758980, -1133335, --4726075, -153545, -399969, -5216238, 861678, -2240899, -21597244, 10154376, 28708098, -11808476, -20148228, -4558034, -4341675, -6311992, -10407780, 7714835, 296353, 5264020, 5217849, -18865106, -251256, 8759049, -7642895, -4059281, -11874511, 20998632, -13105556, 10351945, 9787157, -12527883, --5151277, -4384088, 8820789, -10026064, -4078608, 10170483, -1770063, -2743947, -4956929, 12409234, -2196339, -2025614, -5102421, 314069, -9446781, 10229001, -1207960, 4698694, 25551834, 17132624, --14700062, -10416906, 4021163, -1336272, 10695005, -5883032, -8615704, -3071975, -16022375, -6193880, --1894618, -12315282, -7027104, 27303644, 6523519, 94489, -1331977, -302795, 8047158, 9620190, --2019172, 9503689, 774168, -5217312, 1040456, -14565845, -1084479, -13495861, -7276749, 8141111, -11933567, -17895518, 7279433, -4580583, -5667210, 8681203, -1254667, -8231305, -452045, -3219615, --6437619, 3321620, 2416456, -4493610, -11087995, -5339718, -1087164, -863825, 8812199, 2622078, -2229625, -4765803, 119185, -1952600, 4750234, 5285494, -2768643, 2269890, 4023848, 4352413, -3459059, 4947803, -1893007, 365609, -3325379, 293132, -3879966, -2077690, 1580011, -1067836, --3109020, -729071, 1772211, -5243082, -2506650, -2831457, -1489280, -1985349, -2296734, -22871238, -3881040, 21264920, -5629629, -5392869, 4541391, -6566468, -5428302, 6019397, -852551, -1168768, --315680, -14387067, 24401320, -25975962, -2564632, -570157, 8846022, 5385889, 254477, -9845676, --7162395, 3136400, 19036368, -1527398, -8491150, -5733782, -13627394, -898185, -8033737, -6310381, --2864206, 4277251, -525060, 662499, -9255118, 1872606, 2531883, 5896453, 4808753, 5937256, --12537010, 83752, -2620467, 8217883, 1997160, 16645146, 3513283, -3819300, 1389959, -9009231, --147640, 7287486, 9286256, -14233522, -11143830, -1006096, 14803142, -23251880, 6035503, 26917096, -14701136, -7150584, 2406256, -14409078, 6016713, 13321915, -22809498, 5127654, -11153493, -3082713, --30894774, 207232, -13060459, 12065100, 752156, -14267344, 9445170, -861678, -18546206, -2408940, --11755325, 7678328, -6582038, -9590125, 13063680, -2478196, 2257005, -4315906, -5767068, -1495186, -5543729, 4261682, -3224984, -732829, 169114, -3187403, 1974074, 3256122, 4577899, -4629975, -1786706, 2556579, -5640903, 418222, 2388002, -3929895, 321586, -2519535, 6107444, 3375844, -7446937, -3488050, -2867428, 2585034, -7217693, -689879, -2117419, -1052267, -436476, 1591285, --4077535, 330712, -599148, 1477469, 1316944, 326418, -4115116, -6231998, -17362406, 27469000, -8078297, 14367202, -16182363, -18261664, -3241090, 4803921, -4947266, -2471217, 9358734, 2500745, -3004867, 8118025, -20089172, -2248416, 411780, 5108327, -13927505, 1814087, 2538863, -9825811, --5260261, -13523241, -9994926, -110059, 4475356, -10953240, 958851, -4987531, -9561671, 3728569, -114354, 7705172, -21306796, -22435836, 4776004, -1971390, 8532489, 18728204, 2208150, -11868605, -16889422, -8422431, -15678241, -12209518, -5102421, 1286343, -16660715, -6533719, 16535087, 22278532, -9491878, 6191732, 4719096, -2648921, 14287746, 7978439, -16574816, -9138080, 130460, 1586990, -15625628, 9945534, 2529199, -2474975, -1904281, -7730941, 10374494, 8040716, 18020610, 4032974, -5260261, 2103997, 32339494, 3578782, 12532715, -13469017, 1158031, 12198781, -29294362, 2308008, -3873524, 8156680, -3043521, 4289599, -3835406, -1095217, 5017059, -2537252, 15516106, -6343130, -9063455, -2509872, -5529234, -3069828, -5981816, 49392, 2408403, 2924336, -1265942, -3128347, -6446209, -2074469, 4301947, -2442763, -2515240, -4866735, 4826470, 5165235, 1089311, 356482, --4020090, -7016903, 3146064, -761283, 156229, 7984881, -2365990, 6969122, -1177895, 3994857, -2749853, 5316096, 1157494, -5282810, -1056025, 18524730, 1234266, 23019414, -827855, -10707890, --11653320, -21792128, 3919695, -9266392, -668404, 1728188, 7727720, 11229729, 19123878, 19760070, --3147674, 17575006, -1388348, -1675037, 6625524, 14788109, 6425271, 4039954, -23823646, -12331388, --19385872, 9651328, 19278498, 3621194, -8428336, 13373991, 19339164, -2762201, 2945274, -4678830, -16249472, 13655312, 11637214, -7062000, -12373801, -2092723, -3259343, -27525908, 4714801, 3614215, -2377801, -7097971, -3699041, -30680026, -10873247, -27857694, -4915053, -20894480, -10823318, 19896972, -5254356, 20970178, 1344862, -17402134, -8460012, -18101676, -34395708, 4724464, -21274046, -6315750, -20208894, 8330626, 7925826, 1549946, -3888556, -1600949, 3951907, -14904073, 11832635, -25341380, --26026964, -1559073, -2232846, -3362960, -19116362, -4457639, 25270514, -1491964, 1586454, -6848862, --21834004, 11005854, -14667313, -5887327, -14598594, -9166534, -6795175, -4781909, -5224291, -3364033, -405874, 2492155, -13645111, -6009733, 2717641, 2354179, 7746511, 3488050, -4479651, -5879274, -5093295, -9366787, -1316408, 2772402, -7009924, 2156074, 2253784, 5070209, -4755603, -1781875, --2490544, -468151, 3534221, -2121177, -201327, -2813741, 5561983, 7453379, -2379412, -1302986, -2144263, 2445984, 4849018, 6596533, 1337882, -1222992, -1499481, 10827613, 21814676, 18986976, -20456930, -11790222, -20521890, 15783468, -9327058, 16312823, 4903779, -26205206, 6609955, 4881767, --29501594, 15863999, -13431436, -13735842, 8075613, 8979166, 1436667, 10658498, 835371, 532576, --6892886, -3997004, 6512244, -4098473, -10088341, 680215, -18984292, 6874632, -24141474, -14697915, -938987, 9596031, -3259343, -9995463, 3792993, 7569880, 5675263, 447213, 19519552, -44758392, --10118406, -12255152, -14819785, 19423990, -15608448, -2136746, -36056252, -10095858, -4237522, 1887638, -24129664, -5804112, 3099356, -14533632, 12267500, -18084496, -11659762, 9408126, -41864120, 6108517, -22467510, 29111826, 22291954, 14082661, 32792076, 18082886, -326954, -8089034, -8336532, -12651900, --28152974, -3052648, 2707977, -39905616, -15721191, -12059194, -8934606, 12784507, 33514166, 39072392, -25952876, -13100724, 10756209, -8442295, -1747515, 8854075, 6099391, -3397856, 2202781, 2920041, --685584, 1354525, -6046777, 3524558, 11067057, -5151277, 1566589, -9665824, 2483565, -4523675, --550293, -468688, 8583492, 15027017, -5273146, 948651, 3773129, 6124087, -8965744, -14054207, -391916, 10954314, 3310883, -8962523, 8534100, 4427038, -8978092, 6394670, 4222490, -3500935, --2651606, -966368, -1552631, 1657857, 3568044, -3190624, 6295349, -38429756, 52076, 6413460, -26948772, -8773544, 12455405, 11333345, 5961952, 6186901, -42038068, 33146410, 18051748, 41068476, -15065672, -1792612, -15291157, -9704479, -9589588, -14897094, 10586558, 7789997, -15150497, -17205638, -9038759, 12295418, 21408802, 5978058, -13383655, -19946902, 4159139, 3326989, 1311039, 2338073, -38035692, 12839268, 7208566, 12482786, 13706314, 15442555, 271657, -24254218, 16926466, 53067544, --5529234, -14900315, -32452236, -7056095, 42749956, 4901632, 17620104, 5822902, -59381144, 12102681, -10508174, 1116155, 5954972, -4282083, 766652, 11948062, -32051194, -13390634, 26916024, 9888625, -3547643, -24182814, 16994648, 6198712, -21823802, -23673322, -15955804, 21332028, 44552232, 41450728, -45671608, 46326056, 1651952, -20921860, -17251274, -40886480, -13553306, 12647068, -33231236, -514859, --27127014, 137976, 35919348, 13861470, 14653355, 17716740, 10958609, -11272142, -3921842, -13850733, -19391778, -12147241, -10763188, 3281355, -2560338, -7346005, -13286481, -4059818, 13094818, 12326019, --6194417, 19210852, -1219771, 190052, -9166534, 2565169, 9743670, -2869575, -8008504, -7776575, -4676146, -4461934, 10642392, 6590628, 8537858, 12638478, -13640816, 3003793, 757525, 5577552, --3161633, -6071473, 11278047, 2397129, 9115531, -5568962, 3042448, -8232379, -3031710, 18506478, -39304320, -79104704, -27183922, 5612449, -45367204, -42624328, -17676474, -26087632, 3467649, -19345070, -50361176, -5814312, -17083232, -7665443, -37550364, -11076721, -30185030, -13320304, 5966784, -40184252, --6053220, 30222612, -25134148, -7914551, 9473087, -655519, 13443248, 2189360, 670552, 10962367, -4882841, -20211042, -3058017, 17053168, -8230231, -25048250, -7421167, -30268246, -14009646, -52650392, -5749888, -36020280, 17826262, 5860483, -12355010, -46495704, 4943508, -5384279, 57388280, 22052510, -1742683, 30289720, 14041859, -191126, 25724706, -29986924, -13324599, 1733556, 22841172, -24916716, --14130979, 81717656, -7146826, 42104100, -32479080, -543850, -22997402, 17404818, -7701950, 27411556, -44479756, 705985, -30342334, 26135950, -32370094, -15459735, 11788075, -34744136, -22270480, -11383274, -25565792, 47102368, -55925844, 47225312, 10195715, 13495861, 5923297, 6254010, 5742372, -7475928, -9284646, 24259586, -11813308, 3903589, -1746441, 2797098, -26115012, -5238250, -7522635, 7659001, -8961986, 25959856, -15778099, -9969693, -12139725, 17890150, -22679038, 5218386, 9333501, 7531225, -9414568, -38922604, -8448738, 13487271, -5898601, -16860430, -1423245, 4148939, 1722819, 15931644, -9024263, 12569759, -12210592, -11953968, 13918378, 3483219, 9623948, -9053791, 9692131, 5696201, -2499134, 2945811, -2809446, -4368519, 1028108, -29680908, 61337500, -35249332, 22557706, 20098300, --31913754, 17479444, 9641665, 6868727, -5671505, 24203214, 12526272, -30871152, 21869436, 25410638, -4945655, 4269735, 15387257, -452582, -30671436, 39799852, -22766012, 8959302, -16937204, -3965866, -4992900, -7532836, 32456530, 7228430, -4317516, -7886097, -1728188, 6283001, -33088428, 10395431, --17173426, -11668889, -7974144, -170188, -16263967, -7813620, 3891777, 34215320, 316217, -7301982, --21922050, 9025337, 5979132, 902480, 26571888, -6596533, -2839510, 31562104, 9898289, 1718524, --30642444, -16131360, 19659140, 10899016, -28714004, 772557, -65161096, -32382980, 58272504, -13823889, -31484258, 41191956, 11683385, 6874095, 18635864, -8151848, -22938884, 12104292, 3764002, -1663226, -26243324, 16935592, -19002546, -45628120, -9494562, 18320720, 5811091, -1301912, 14642617, -17374216, -25400436, -12702366, 9448928, 11681774, 5123359, 17268990, 13179644, 20976620, 2316061, -5744519, -7584912, 20320028, -5480379, 17758080, 10705743, -11890617, 3539590, 9319542, 6350646, 3694746, -12824235, 10557566, 4645544, 21310554, -6926172, 2226941, -3199214, -1634772, -5570036, 18888730, -15734076, 12454331, -6069863, 2189897, 22462142, -6106907, 16445430, 14614163, -44560, 25635586, --23467164, 3084860, 35392680, 4341138, 9975598, -7570954, 24894168, 4635344, 34817152, -10747082, --58195732, 9895605, -7023882, 20044612, 6117107, -19729470, 10212895, 12011413, -22508312, -24697136, --16550120, -41238664, -41522672, 28557238, -6638409, -42649024, -13100724, 4364761, 14085882, 13500693, --26151518, -28333900, 2755759, 39402568, -18881214, 15198279, -26550414, 9408663, -29949880, 19463718, -20532628, -14691473, -30823370, -21211232, -3466039, 12053826, -13250511, -8746701, -11037529, -39209292, --33886756, 17708150, -28455232, -5858873, 10095858, -23521388, -37936908, 14419279, 19859392, -2597382, --45664092, 20352776, 17879948, 57647588, 239444, 15086073, 11271605, -24718074, 9415105, -7732015, --49902688, -7713225, 30466350, 7181186, -25256556, -62668940, 39507256, 50442244, -15044734, 40782324, -47543140, 2365453, 2130304, 37502580, -24372328, 1798518, 62941136, -46510200, 26975078, -39855684, --10936597, -3330210, 27095338, -9299141, 3921842, 15114527, -491774, -35291208, 38757248, -7132330, --4560182, 5862631, 16180752, -26554172, 11578158, 6713571, -3997004, 7969312, 9423695, -24617142, --3323768, 5623723, 12886513, 26679264, -2258079, -23589572, 11948062, 27384174, -21862458, 26707718, --12692702, -2950106, -9419400, 30129196, -20893942, 7066832, 18897320, -13168370, 4753992, 3227668, --17411798, 3704946, 7532836, -3423089, -13214541, 8490613, 10998338, -6270116, 21855478, -32947768, -8114804, 9451612, 479963, 1843078, 22563610, -5069672, 12657269, -26199300, -82958368, 22434224, --9587978, 61962956, -21329882, -13605383, -24897388, -70965208, 32439352, -41350872, -24209120, 1274532, --116501, 54758148, -39202852, -27409408, 36019208, 21478058, 18760418, -6782827, 17922362, -12677133, --18096308, -16605954, 42241540, 35188668, 54930484, -17467632, -20617990, 998580, -3673271, 20211580, --33140504, 7125888, -34831112, 18615998, 34078420, 11746199, -28144384, 19184546, -24816322, 55819544, -28362890, 7931194, 7473780, -8582955, -43789340, 24760486, -59385440, 12433930, 11016054, 29033442, -22980222, -51228224, 15430207, -32255742, -19198504, 14000520, -5116380, 19171660, 12230993, -46832860, -19138912, 43101608, 56913148, -16477642, 16809428, -23204098, 39943732, -56719340, -3005403, -10296110, -17919678, 37389300, 53625888, -42883636, 10692858, -57398480, 36928664, 75728328, -19220516, -51527796, --4144644, -38849588, 49700288, 12663711, -25367150, -7126962, 2895882, -8446590, 35501124, 13418552, --20044612, 19153406, -28385438, 1903744, 26653494, -5506685, -32715840, 36341864, -52207476, 15192910, --7863548, 20931524, -1293322, 13023951, -12016782, -6388227, 5339181, 4643397, 5568962, 24828670, --25310242, -21232170, 1212791, 5774047, -5821292, -26372172, -19295140, 38765836, 10475962, -17149804, --19804094, -44125956, 52938692, 41467372, -16082505, -14120779, -30808338, 1226750, 39571144, -65168076, -46535972, -6029597, -1832340, 15484968, 12962748, 18437758, 5099200, 9034464, -22964116, 21797496, -5909875, -23331336, 15726560, -9244917, -431107, 21314848, 12249784, -33216204, 18631032, -15684147, -27653146, -20119238, 6947110, -10245644, 12831215, -9760850, 5859409, -14568529, 31811750, -2743410, -794569, 9570798, 10612327, -16065325, -3444027, 7380365, 10554882, 9806484, -11294153, 4141959, -381715, -32292786, -2780455, 8512088, 11829951, 5298916, 7549479, -29033442, 4549981, -1575179, -2847563, 6830609, -5864241, 6468221, 4767414, 2878165, -7144678, -6452115, -2346663, 33879240, --11963095, 6852084, 12443057, -6927246, 11834782, -13424457, 11401528, 6113349, -9184788, -13504988, -8478802, -8243116, 6627135, -12131135, -10700911, -4716411, 15403900, -3862786, 1388885, 3237869, --1226213, 3828427, -12387223, 9426379, -8029978, 20545512, -19097036, 8999030, -11435350, 10276783, --9358197, 8242042, 125091, 13912473, -12050604, 6555194, -6215892, 801548, 2338610, 8239895, --8681740, 2103997, -9360344, 13187697, -11085311, -2977486, 6534256, 2785823, -5459441, -1520955, -7393786, 5019206, -18207976, 10189810, 802085, 170188, -2005750, 3723737, -2354179, 1992865, --1494649, 2407866, 514859, 4782446, -5214627, 13001940, -16545825, 51849920, -3747896, -16776679, --25608742, -11626476, -14381161, 18817862, 10864120, -13663902, 1125818, 1620813, 6129455, 852014, -13008382, 4502737, 10241886, -3510599, -384936, -3071439, 4792110, 11125039, -10340671, -60666, --5126581, 367757, 13538274, -7685307, 1303523, -3470871, 5323075, 2760590, -7456063, -2753611, -7960722, -2448668, 12991202, 9256728, -13595182, 4354023, 2859375, 7124277, 2991982, -12830141, -8665633, -2401961, 8426726, 6757594, -15337865, 4202626, 24696, 3448322, -1730335, -6729677, -10900627, -2685965, 4935991, 259846, -3301756, 5054103, -6542846, -918049, 9086540, -6260989, --7532836, 15180562, -9826885, 14161581, -1498944, -11477226, 23453206, -21559126, 18716930, -6649146, --11257109, 11868605, -11060615, 3266860, 3799972, -10804527, 9069360, -1949915, -722628, 5802501, --7536594, 9821516, -3211562, -762357, 2394444, -1683627, 3424163, -1653026, 527207, 2859375, --2796561, 4575214, -565862, -2619393, 5607080, -8749922, 4613869, -3897146, -1826972, 5440113, -423054, -1654099, 2795487, -2086817, 2774549, 1420024, -4085588, 2700461, 515396, -933619, --726923, 2436857, 490700, 4511327, -3606162, 1271847, 542777, -2574296, 4977330, -1470489, --835908, -25397216, -43562780, 54951424, 157414304, 24879672, 15255724, -115089016, -142278304, -45605572, --27970438, 96225520, 146793936, 75520024, 21888228, -49427556, -106209176, -96898224, -81145352, 6397354, -121610392, 101683352, 58327268, 19775640, -52042656, -67532992, -53611392, -51851528, -18273476, 24542516, -33777232, 69821672, 50016504, 12097849, -16935056, -10004589, -56225416, -27357868, -28411208, -38532300, -22922240, 43156904, 24987582, 62845036, 16710644, -14973867, -24150064, -41849088, -33033668, -5214627, --10208064, 12797929, 26032870, 23144506, 16578574, 11244224, -5708012, -22995254, -16218870, -19131394, -6162741, 22230750, 7362111, 5432060, -9651328, -20007032, -3718368, -86436, -273267, 16134045, -14504641, 16172162, 6418829, -5624260, -17357574, -25213068, -25744034, -16796006, 17878876, 26396332, -32813550, 22639310, -5685463, -12861816, -13588203, -27021250, -11897596, 9809705, 5207648, 4850092, -7888245, 3741454, 3037616, -4217121, -5394479, 4221953, 9392557, -233539, -790274, -6490233, --8856759, -4651450, -5372467, -3205119, 6969122, -1260573, 14554570, 17908404, 10395431, -6248641, --10171556, -11458973, -14414447, -10586021, -14265197, 7611756, 19707458, 17926656, 10654203, 11185169, -4268661, -11062762, -21550536, -22101902, -11191611, -2306934, 7006166, 15702937, 23120882, 18925236, -3592203, -12224014, -20303384, -14921253, -4921496, 124017, 5583995, 3523484, 8735963, 11130408, -3325379, -4839355, -6562173, -3712462, -2729452, -2689723, -744640, 784905, 5194763, 3124589, -372052, -63888, -309238, -997506, -2262911, -2369748, 716186, 729608, 443992, -177704, -214748, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --2868501, -10933913, 1274532, 2968359, 1044751, 1568737, -2637647, -6599754, -1277753, 3503083, 1244467, --3261491, -461709, 2681670, -691490, -3928821, 1185948, -4530117, -2815888, -130460, 1247151, --1280974, -1028108, 2824478, -3917547, -83215, 494458, 1903744, 1498944, 1451162, 4781373, -2170032, -5949604, -1506997, -2706903, 762357, -157840, -440771, -3748433, -4872104, 6461779, --2976412, 1576790, 1890323, 1615982, -6127845, -3492345, -1599339, 672162, -472983, -196495, --556198, 1029182, 2347200, -3213709, -1074, 1714766, 2008971, 2384244, 886374, 38655, -2319282, 815507, -998580, -300648, 3761318, -2793339, -2944200, -1597191, -1178969, 3202972, -1900523, 758062, -1195075, 3085934, -1376000, 1596117, -3653407, -355409, 282931, 753230, -759672, -2958696, 799401, 2081985, 1051730, 346282, -265751, 2725694, 1301912, -283468, -1751810, 1033477, 454730, -408559, 587337, 462783, 380105, -529892, 665183, 179852, --550830, -445603, 946503, 199716, -93416, 2684, 36507, 149787, -883690, 622770, --248571, 486942, -695785, -6215355, -3741990, 2647847, -6080063, -8597451, 1672353, 738734, -1060857, 1256815, 1210644, -7391102, -1206886, 2146410, -4686346, 4924717, 4787815, 4108136, --1661079, 377420, 1112397, 3146064, 717796, -106837, 619549, -2138894, 1985886, -772557, --778463, -1005559, 6073084, -3623342, 2102387, -2287070, -1969243, -2054068, 1611687, 3321084, --3543885, -1767379, -1919850, 2430415, 2289218, 3692598, 2510409, 492848, 3236258, -2756295, -1945620, 739271, 845572, 6776922, 1603633, 3350611, -5561446, -1502165, 2294050, -2783139, -2639258, -1203128, -2046552, 724239, 4067334, 2742337, 1876364, -995359, 833224, 3030636, --3667365, 4837744, -659278, 3964792, -1610613, 3271155, 3906273, 3288871, -1836635, -4880157, --7202660, -4866198, 470299, -2553358, 4758824, 788663, 745714, 1272384, -3395709, -1052267, --1527398, 1708323, -918586, -654446, 2096481, -2560338, -903554, 1013075, -1420560, 117575, --1585380, -1267552, -1003949, -285078, -1690607, 10443750, 7504382, 6148783, 5117454, 5767068, -2436320, -454730, -127238, -2141578, -638340, 7587597, -3311420, -3413425, 5236102, 3886946, -5034239, -3518652, 1524713, -1330366, 1138166, 2243047, 3143379, 460098, -2293513, -1704565, --2951180, -1054415, -1823214, -5381594, -651761, 4531728, -3526168, -613643, 1676648, -2772402, --2510409, 2563559, -1382980, -3594351, -1924682, 2048699, -3069828, -3954054, -1801202, -1173600, -1336809, -2758443, -5714991, 406411, -938987, -799401, 1660005, -4691715, -2281165, 88047, --1953673, 2589329, -651224, 1118839, -8416525, -2551211, 4778688, -1875290, -4628364, 1385664, -834297, 1311039, -1713692, -6677601, -3019362, 7523172, 526670, 2776160, 1606318, -1074816, -2308545, 3138547, 1334661, -1549946, -3579318, -1074, 916439, -2718178, 1253057, -3524558, --340376, -2245194, -1079111, -2974265, -544387, -1697049, -2139968, -1662689, 355409, -735513, -410706, -806917, 324270, -1495722, 1104344, 586800, -383326, -267899, 1429687, -24159, --471373, -1328219, -653909, -597537, -67109, 136902, 68183, 14810121, 9098351, 8611946, -158377, 865973, 693100, -3520800, -7835631, -2953327, 5924371, -4465156, 2684892, 8012799, -650151, -2524904, -996969, -1608465, -844498, 3249143, 4604742, 178778, 1359357, 1893007, -3002182, 196495, -4210142, 1315334, -6786049, -2028298, -857383, -1870458, -1233729, 864362, --1625108, -3543885, -2778307, -1263257, 290984, -1509144, -4119948, 4914517, -1841467, 377420, --1278290, -3186866, 4010426, 11205570, 2684355, -3867081, 6599754, 1536525, -2054605, 2039036, --1163936, -4283156, -2147, -1781338, 1646583, -3707094, -6485938, 279173, 1047972, -7812009, -2313914, 1645509, 4350265, 2511482, 5757941, -1936493, -3935801, -2269890, -1246077, 2842195, --1062468, -5014911, 3404299, -2434173, -4615479, 3151969, -4610648, -2484102, 1414655, -1634235, -1553168, -1070521, -1923072, 1540283, 3852586, -877784, -1946694, -675384, -36507, 1381906, -2697776, 804770, -830539, -999654, -1034013, -314606, 614180, -1959579, -726386, -565862, -2960843, 1538672, 2085207, -340913, 131533, 1654636, 1068373, 806380, -125628, 290447, --7620883, -12045773, -3698504, -6026913, 8631274, -1969779, -1056562, 3232500, -7967701, -5613523, -4781909, -3860102, -3585224, -198105, -325881, 849867, 3150359, -1324461, 1433445, -2076617, --1545115, -147103, -1367410, -3490735, -314069, -749472, 3645890, 3692598, 3237869, -4323959, -2007360, 1465658, 6047851, -3047279, -226023, -2072322, -4628364, 6592238, -6252936, -3067681, --2435247, 1557463, 5468567, -5059472, 5657009, -609885, 3049427, 4719096, 765041, 3639448, --6735583, 1489817, -2540473, 354335, -7133941, 141197, -2458869, -6380174, -4907537, 391379, -4713727, 256624, -3434900, 5375152, -1843078, 3115462, -421981, -6620692, 9280887, -5782100, --1147293, -3284576, 2320893, 3777961, 2496987, 3486440, 7516193, 5746130, -955630, 1210644, -3551401, 2248416, -2670933, 3828963, 2977486, -549219, 1694902, -3731253, -5158793, -539018, --1658931, 2914135, -3021510, -616328, -2903935, -659278, -1330366, -419833, 878858, 1091995, -601295, -114890, -724239, 1757179, 893890, -1787780, 1311039, 98784, -4463008, -385473, --1599875, 2571075, -673773, -288300, 942745, -476205, 899796, 2019708, -123480, 1315334, -1399623, -255014, 529892, 2842732, 3246995, -8528731, -12162811, 1367947, 1023813, 688805, -7844758, -2533494, -8531953, 910533, 999654, -2245194, -484258, -7499013, -1474784, 945430, -1124745, 8412767, -1460826, 7540889, -1809255, -1930588, 641024, -7458748, 3201361, -2802466, -4564477, -1245004, -1909113, -2761127, -1342714, 282394, -5571647, 9677635, -6680285, -10846940, -3264175, 516470, -7612830, -2237141, -14624901, 271120, -5196911, -52076, -5643587, -4573604, -813359, 539555, 2542084, -4610648, 3717294, -5204964, -10089952, 1226213, 2820183, -3042448, -3334505, -1711545, -5588826, -4919348, -6799470, -3215320, -704375, 1141388, -2018635, 6354404, -42950, -1952600, 573378, 406948, 1341104, 1009854, 767725, -6048925, -5654862, 1229434, -4049617, 2403034, 691490, -1314797, 5025112, 2775086, -2304250, -1694365, -5569499, -2286533, -2523830, 1201517, -3023120, 1253594, -822486, -879931, -1402307, -1745367, -581968, -2310156, --1738925, 981400, 492848, 1415729, 2434710, 208306, 2140504, 122407, -1358820, 2014340, -1283658, -387621, 325881, -1126892, -1108102, -16643, 137976, -1264868, 94489, -377420, --22549, 0, -240518, 1313723, -2052458, -321586, -584116, 118112, 763967, 1344862, --18781356, -4739497, 763967, -4818954, -3489124, -6023692, 1564979, 2085207, 4292820, -3253975, --3995393, -4561792, 2280628, 5031018, -2505040, -2188823, -1274532, -802622, 2411087, -10507637, --2576444, 5898064, 1942936, -3095061, 1133335, 5222144, -504122, -1362578, 1846836, -354335, -12878459, -5559835, 3158949, 1012539, -5407901, 1760400, 1221381, -6186901, 4363687, -8781598, --840740, 7730941, 1714766, -245887, -1621350, -6008659, -5160940, 1362042, 3343632, -2273112, -1633698, 6404870, 3193845, -2684892, 3969624, -5718212, -13400835, -1791001, -5880347, 3714610, --3763465, 9510131, 4779225, -452582, -1553704, -12363600, 3905199, 4707821, -3778498, 7535520, --5854041, 2291902, -9817221, 4549981, 3457986, -11201275, -7111392, -2304250, 2776160, 3709778, -8168491, -1138703, -381178, 5288716, 1241246, 22549, -2349347, 1208496, 1241782, 1587527, -1751273, 431107, -201327, -1019518, -1142461, -3019362, -2491618, 2010045, 1443109, 1035624, -2512556, -1009854, 1222992, 1272384, -616328, 2149631, -267899, -17180, -492311, -2426120, --511101, 2800319, 649614, 2081449, -751082, 768799, -1078574, 3330747, 338766, 2795487, -1254131, -1359894, 751082, 4720706, 7927436, 18341658, 19556596, 3929358, 5861020, 63888, -2795487, 184147, 2064269, -5224291, 2431488, -3245922, 4336307, 4109747, 10071698, 1559610, --2032593, 6317897, 4555887, 7597261, 379031, 4728759, 2749853, -2335925, 2366527, 11304354, -1801202, -4873714, -2627446, 8366597, 5173825, 4027069, 7777649, -5976447, 2336462, 9270687, --9230422, -11031087, 3649649, 5919539, 9624485, -4167192, -7179575, 5827197, 2113661, -870268, -3619584, -1457068, -878321, -52613, 13696651, -4951561, 2777233, -3302830, -2122251, -1612760, -7141457, -944893, 15939697, 7645042, -7654169, 8909373, 1941862, 4153234, 1914482, 1935957, -2171643, -2917894, 5376762, -12609487, -3333432, 5770826, -12845173, 4398047, -10380399, 2437931, -11452530, 2832531, -79994, 3148211, 1087701, -3083787, 769336, -3277597, 373125, 2639794, --7723425, 4423280, -1409286, -1837172, 513785, 2394444, -2031520, -3077881, 1030792, 2781528, --1479079, -2604361, -2571612, -1506460, 1061394, -1840394, -1657857, 1731946, 2410551, 1130113, --1292785, 1576790, -1155346, -3980361, -1813013, -64961, -2038499, 1131724, 808528, 1661616, -2692945, 3967476, -1897302, 5597416, -1981054, -3280281, -1135482, 1980517, 408022, -3335579, --2182917, 30239790, 5273146, 4748623, -8848170, 13032005, -4322348, -580357, -3419331, 715112, --8469139, -654446, 4021700, 941672, -6896644, 8595303, -2058363, -4480188, 1262184, 2684892, --8880919, -12520903, 5211406, -5179731, -7364795, 1438277, -13959, -3811247, 6543920, -6581501, -2193655, 6326487, -1094680, 9225053, 2940979, -11724724, -12208981, -5249524, 824634, 2212445, --9640054, 3481608, 3553012, 1824824, 3147137, 4254702, -10019622, -5032091, 2952253, -11226508, --4019016, -282931, -11573326, -6235219, -3932580, 2337536, -5908802, -12635794, -5945309, -6758668, -14664092, 7050189, -1152662, 1988033, -3876745, 11614128, 13996762, 1555315, 9396315, 6808060, -2738042, 1669669, -5354214, -1184337, -4723927, 6765647, -8877697, 290984, -2105071, -13700409, --4106526, -1983201, 7473243, -6784438, 3767760, 3190087, 1434519, 707059, 3263638, -3280281, -2612414, -1980517, 2895882, -730681, 4264366, 1230508, 401043, -2222109, -784368, -5353677, -2904472, -746787, 4582730, -4369056, 28454, -455267, 2746632, -479963, 2457795, 1025423, -1354525, 1288490, 719944, -2927557, 3419331, 4303557, -2153926, -3103651, -3599183, -1508070, --201863, -1307281, 405338, -20629802, 13928042, 22355304, -16768626, -9987410, 4606353, 4010963, --3401614, 7346005, 1998234, -6250251, -7636989, -156229, -2452963, -5452998, 2793339, -2506114, -359704, 6184753, -8315057, 1753957, 1119376, -4936528, 712965, -7841537, 1537598, 11520713, -5880884, -1148904, -3693672, -938987, -6566468, -6992744, 3452080, 5831492, -1828046, -3215857, --2283849, 3491809, 5815386, 2794950, 10646150, -5713917, 4389994, -2748242, 1062468, 6645925, --2370285, -2087354, -12639552, -1927367, -9782325, 4940823, 3383361, 12618077, -10783589, -3968013, --10436234, -17194902, -2870649, 7195681, -11865384, 2652679, -1294933, -8657043, -10203769, -12873628, -17330730, 670015, 10303090, 7574175, 8756901, -3935801, -11488501, -8697846, -10749229, 3782793, -8471286, -8049843, 3835943, 9028021, -6069863, 1051730, 7333120, 8414378, 2047089, -2987150, -3629247, -1484448, 1952600, -8928163, -787053, 3455301, -3003256, 1167694, 591095, 404801, -2037962, 3393561, -3504157, -1244467, 2092186, 3025805, 883153, 1480690, 2976412, -612570, -3213709, -2652679, 2215130, 3229816, 3621731, 416612, -1312113, 2814814, -2233383, 711891, --471373, -1920387, -914828, -1894081, -473520, 916439, -2318209, -6519761, 2353105, 3587908, --16137803, 11657078, -1468342, -6052146, 9983115, 3525631, -9722195, -13922136, -5378910, 35970, -284005, 666257, -4963372, 15816754, 6555194, 4773856, 3651259, 4968204, -4816269, 1189706, -3142842, 2304250, 14212047, 1471563, -21182242, 2597918, 8813273, -7912404, -11909944, -2533494, --6467684, -3833258, 990527, 14963666, 8968965, -1531693, -344671, -4530117, -13116830, -4450660, --10834592, 7719667, 10581189, 120259, -5877663, -2157147, -2429878, 4836133, 6737730, 7132330, --16522202, 3171833, 572841, 1444183, 11492259, -6719477, 4708358, -6133214, -4405026, 1197759, -7523172, 13517873, -2141578, -8766565, 2840047, -15769509, 12591770, 6780143, -1551557, -6521908, -3409667, -3652333, -7770133, -6481106, -7042673, -3376918, -1470489, 468151, 6676527, -5101348, -18344880, 762357, -2771865, 1050656, 5484673, 246424, -192737, 5945309, 4109747, 3067144, -246424, -2883534, -2211908, -685584, -384936, -2659659, -7415798, 3940096, 3768297, -2808909, -1064615, -4125853, -3051038, -1423245, -767725, -103079, 6602439, -1345399, -2010582, -1058173, --333397, 4036733, 7355132, -2376728, 4149475, -1097364, -4508642, 5291400, -4885526, -3986804, --2577517, -4023311, 926639, 3124052, 1656247, 3203509, 119185, -1179505, -222265, -3251290, -2036888, -1855426, -6988986, -1709934, 7741142, -13870060, -3935801, 8979703, -11275363, -1156957, --1119376, -1501628, -13132399, 13056701, 5661841, -9087077, -1561758, -3894462, -3328063, -19956566, --2797634, -9115531, -22526030, 4818954, 3489661, -10242960, -8470749, -12071542, -13744432, 11724187, -6617471, 12342662, 442382, 25894358, 1222992, 13528610, 18614388, -2150168, 5695127, 19177566, --12908524, 5919539, -7776039, 13195213, -4136591, 25691420, 11676942, -7989176, -12070469, 2012192, -5960878, 10720238, 2886218, -9283572, -2136209, 8511015, 19092740, -7965554, 12806519, -4656819, -7817914, -14937896, 5905043, -8118562, 5915244, 983011, 1973538, -2705293, 11802570, 16478716, --29925184, 9090298, 6238977, 4456029, -5456219, 3948686, -21468930, 1840930, 385473, -3337727, --8200167, -7119445, -7092602, -2056753, 15321222, -8813273, -5178120, -12402255, 456340, 11018202, --5510980, -6148246, 8530879, -303332, 6196564, 1381369, -1510755, 156766, 2736968, -5922223, -3008088, 1201517, -5093295, -4263829, -2488397, 1498944, 3457986, 3558917, 10385768, -1095217, -7867843, 3870303, 2567317, -5182415, -1609002, -7828652, -3532074, -1300301, -2619930, -3714073, -4358318, 2529199, 5206037, 6671158, 1256278, -1500554, -841277, -4257923, 2596845, 14920180, -15857019, -3458523, 16487306, -846109, -3438658, 1302986, 9270687, -3470871, -4198868, -1925219, --11718818, 1924682, -3358128, 18461916, 12152610, -8798777, -9322763, -17526150, -6416681, 12729209, -22930294, -10434623, 7083475, 1537061, 3017752, 12492986, 8940511, -17955110, 3566970, -6409165, --3649112, -7406134, -4048544, -7816304, -17307644, 3034931, 11573863, 4439923, 27108760, -6586869, --3739306, 18837726, -6867653, -1046898, -4204236, 4993437, -20686710, -13272523, 7186554, 15477988, -22548578, 26919782, -19782082, -10257993, -1040456, 9008694, -890132, 30544734, 8497056, 4570382, --23698018, 1650341, 170725, 11464341, 14950244, -11136850, -3696893, 4679904, -4860293, 5906, -16986596, 6135898, -16797618, 4389994, 8857833, -8057896, 26418344, -9129490, -14128832, -19824496, -14658723, -3165928, -16646756, -13186623, -3023120, -606127, -6624450, 404264, -7211787, 1414118, --10040560, 714038, 4904853, -3450469, 3862786, 781147, -6072547, 693637, -96100, -1149978, -647466, -4107063, 4987531, 68719, -2546379, 5723581, 5791227, 282394, -1598265, 2572686, --5458367, -2245194, -4385699, -800475, 4504884, -3520800, 1971390, 4470524, -8209830, -2905546, --1692754, 1385664, -1552094, 3572339, 7949448, -2210298, -4752382, -2279554, 5133560, 1496796, -483184, 4156455, -2386391, -1664837, -1498407, 3672734, 31316218, 14855218, -8227010, -2637647, --28894392, 2261300, 7649337, 2028298, 43103220, -5435281, -3260954, -18917184, -16356846, 6732361, --13373991, -8152385, -8968429, -6015639, 10710575, -6972880, -12295418, -10586021, 963146, 10829223, --13904957, 3158412, 6291590, 1422171, 15554224, -1776506, 1224066, -15776489, -22244172, -9131100, -10198400, -12242267, 2981781, -10273025, -38836704, -20879984, 11647414, 866510, -22252226, 3466576, -31008054, -1396401, -799938, -12069395, 6788733, -13321915, -23939610, 641024, 3644817, -9253507, -4603668, 9051644, -2212445, -7790534, 6468221, 8422431, 15564425, -8909373, 11700028, 15025943, -6324340, 26102664, 2937221, -16159814, 19017042, 1193464, 3196530, -3416647, -3809099, 11791833, --11602317, -1616518, 28933584, 22732188, -14013941, 14572287, -4168803, 26892400, 11330124, -9242770, --21404506, -868657, -7809325, -9236864, 6074158, -8313983, -222265, -2073932, -7457674, -12474733, --2422362, 10699837, -11393474, 142808, -7060926, 1173063, 4515085, -4538170, -13332115, -2267743, --6288369, 8237211, 4975183, -3163244, -8804683, -3576634, -9474698, 5834713, -4628364, 3219078, -3791919, 5571110, 4414690, -7291781, -5191542, -8202851, 2517388, 5456756, 757525, 10748693, -11335492, 6245956, 4645544, -22498650, -23877870, -28525026, 39322036, -21771726, 5166309, -1205812, --12511240, 19969450, -23490250, 10159208, 41813656, 25741350, 5959267, -33907156, -1919850, -22371948, --11365020, -20429548, -1957431, 5806796, -3695283, 16065325, -7740068, 2672007, 7924215, 22451942, -3105261, 3099893, 27156542, -17889612, -2554969, 11985106, -5262409, -13874892, -9241159, 13692356, --11958263, 5742372, 23240068, -6474663, -41962368, -2563559, 10473815, -51515984, 31060130, 23970212, --19569482, 31947578, 21626234, 14256070, 33112588, 712428, 16997334, 1962800, 1974074, 11938398, --21103858, 21019034, 28515362, 21973052, -22719304, -4438849, 31341450, -15235860, 24840480, 22814866, -53289808, 32174674, 1782948, 3689377, -6950331, 6690486, 9235253, -30920006, -44302588, -15411953, -3787088, 1650341, -6423124, 34622268, 16256451, 6522445, -15293305, 13728863, -10859825, -13677323, --7059853, 15673946, 18185428, 3521873, -3365107, -3517578, 466541, -21451214, -5162551, -5540508, -6853694, 3985730, -11218991, -8480950, -611496, 16909824, -4807142, -6518150, 351650, -6750615, --17235704, 8575976, -3798362, -6704981, -10154913, 59056, 5581847, 1119376, -30578020, -1727651, -14895483, -2280628, 481573, 2506650, 4229469, 12776991, 10040023, 446140, -271120, -4907537, --1715839, 24009940, 29700236, -58271968, -53360672, 23273354, -15335181, -16805134, -6995428, -20308752, -7216082, -32898912, 41539848, 15617038, -17307108, -372052, -16929688, -12733504, -13645648, -15623480, --10123775, -39684424, -35655208, -6651831, -8095477, 2268280, 3390340, 6899328, -2501282, 5061619, -6649683, 17656610, 19559818, -7377680, -9875740, -11581916, -9816685, -22458920, 33427730, -11805791, -8158827, 24814710, 23466628, -8907225, -10043244, -18701362, -12270722, -15357192, 25693568, 2731599, -3176128, -31793496, -11268920, 45938972, -4451197, 42768212, -8637179, -16035260, -10104984, -18126372, --18551574, -3413962, 207232, -25523380, 2145336, 12183748, -1031866, 9573482, -58887224, -23810224, --16486232, 31259846, -7472706, 5135171, 10683194, 49080740, 13928042, -4537633, -5001490, 42261404, -25534118, 6222871, 8247411, -2177012, 33564632, -14004815, -19142132, 10334765, 15775415, 28003186, -26064546, -15289547, 17688286, 13217762, 14253923, 4227322, -10193568, -20143934, -17093970, 10632728, -14751602, 7866770, 5302137, 17407502, -1721208, -4836670, -1001264, -1469416, 9069360, 5432060, -11836393, 20682416, 14607721, 23660974, 6387153, -21314312, 6752763, 5668820, 18501108, -369904, -14496051, 6167036, 13939853, 301185, -26785564, -3482682, -5893232, -1820529, -30786862, 63946696, --20648592, -12836047, 37896644, -24022826, -36273148, 33646236, -48828408, -14120242, 11511586, 8386461, --34059628, -13357348, 29237452, 190589, -5761162, -19013284, 22948548, -22762252, 1509681, 18067854, --6027450, 16589848, 119185, -8189966, 5557688, 3943317, -9889699, 15774878, -8677445, -3514894, -4712116, -308701, 982474, -2960306, 4684736, 10012106, 16183974, 23295902, 11427834, -9619116, --2682207, -14773614, 13659607, -4912369, -21345988, 5015448, 91805, -12160663, -29180544, 20550882, -1560147, -13503914, 32991254, 1899449, -10205379, -5949604, 48863308, -45703284, -49195628, 30003568, -46837156, -86405616, 428423, -31983548, -29031832, -12853227, 31449362, -24286430, 41618232, -5889474, --1019518, 55919400, -15781857, -43290584, 53761180, 63311040, -61478700, 68732360, -23152022, 1693828, -56829396, -19017042, -21735756, 15581068, 15282031, -7307887, -2860985, 10545218, 2111513, 1345399, --13512504, 18687402, 121870, -1222992, 372052, 2507724, 8458401, 5106716, -6801081, -7454453, -7878581, 18633178, -16115254, -14958834, -3998078, 19510962, -659814, 10421201, -2801929, 4342749, -108985, 4444218, -2192581, -3431679, -23021024, -9687836, 5816997, -8335458, -2281165, -8201777, --12412455, 19476066, 12228309, -33921116, 13589813, 17575006, -3391414, -148713, -11884711, 17394618, -38050188, -17785460, -24105504, -6626598, 6039798, 38674032, 28889024, -10097468, -3077344, 12076911, -31471372, -10482941, -1763084, 19302120, -24736328, -21269752, 16958142, -11293617, -8426189, -10400800, --935766, -17135846, 1374926, 11746736, -7198902, 9070971, -8058433, -5069135, -5075041, -23701778, -3547643, -9602473, 14549202, 31022548, 1734630, 15457050, 12850005, 1176821, 5889474, 9702331, -32948304, -23301272, 15936476, 13982266, -16833050, 11272679, 11014444, 3494493, -14936286, -29933238, --30234422, 9970230, 10878615, -11437498, -50545860, 41115720, -13824426, -22165790, -12774843, 41359460, --19437412, 45229764, 24159, 15187004, -42562052, 40240084, -18420040, 17823040, -5429913, -58272504, --18344880, 11468100, -35974648, 36999532, 3990025, -53426172, -60051696, -30914638, 41766408, 10306311, --37273872, 45449880, -48877264, -2412698, 88286808, 13205414, 5028333, 8773544, 6701760, -23175106, -24138254, 1786170, 12338904, -15555835, 23202488, -12817793, -12207371, -10239202, -1293322, -641561, -7033009, -2332167, -3403762, 4549981, -8077223, -16724066, 15217069, -5619428, -2609730, -19845434, -9072045, 4403415, 8610336, 2354179, 9934259, -7368017, 2345589, 27445914, -3192235, 285615, -14552423, -15604153, -3285113, 802085, -1561221, 10673531, -11041287, 11983496, -4191888, -31039728, -2005750, -8117488, 9125195, -10331544, 12004970, -19273666, -36839544, 155156, -39133056, 10743861, --3497177, -6998649, 13070659, 21617108, -13874355, 3105798, 23742042, -18612240, 32206350, -4294431, --35455492, 30411590, -14638859, -6500433, 27066348, -34686156, 9135932, 594316, 12579422, -5443871, --12743705, -52939232, 12135430, -21845814, -53192096, 64297272, -43289512, -18022220, -8601209, -14628122, --32676112, 18341120, 44362180, -27451820, 12446278, -39824548, -22540526, -22686554, 20045150, 3621194, -58214524, -10005663, -4864051, -17358648, -50228568, 68719, 24410984, -18551038, 20490216, 24661702, --20807506, 2090039, -17744658, -74177840, -38924752, -22820234, -77961176, 49844168, 65639448, 30890478, --66104380, -53117472, -118581896, 17160542, 140966192, 65222300, 24903830, -37044092, -130065032, -29527900, -30109868, 88916024, 89147952, -60568704, -51250772, -23785528, 11633993, 6155762, 96846680, 1641751, --11803644, 7897371, -9600863, -23633594, 34070364, 6129992, -7305740, 18867254, -15446850, -26361436, -18700288, 16195248, -44914084, 30264488, -6719477, -9883257, -23929948, 25419764, -24179056, 29092498, --14308684, 29777008, -35100084, 14052596, -9810242, 472446, 25376814, 41511396, 11761231, -15420543, --10966125, -2581275, 22942104, -3663607, 32989106, -25796648, -20305532, 9495099, 32703492, 3846680, -19938848, -55810952, 40487048, -7945690, -8863202, 1005022, 18234284, 345745, -3493956, 13492640, -4639102, 4494147, 21510270, -13631689, -151934, 11170136, -3894999, -2030446, 13562433, -12593381, --3056943, 3814468, 21319144, -14095546, -10006737, 11934640, -566936, 6699075, -21124796, 27702540, --6608344, 9347459, -6060199, 3567507, 15090904, 6642167, -3554622, 12986370, -4957466, 13125420, --10358387, -776852, 13534516, -3125126, -5653251, -27354110, 2752537, 21137144, 2189360, 9904731, --13872207, -4398047, -8319889, -8702141, -3599720, 15289547, -5617817, 9315784, -12087649, -14403710, --6218039, 3419331, 27925878, -10732586, 12676059, 835371, 2739116, -13676250, 7425999, 14512694, -735513, -13222057, 10167261, -8812199, 6798933, -5378373, -3940096, -5145908, 1844152, 10178536, --5181878, -2617246, 4656282, -613643, -7789997, -1660542, 7543037, 6443525, -6763500, 1134408, -6887517, 281857, -4278861, 1114544, -6807523, 5050882, -475131, 2579128, -3121904, 1312113, -4365835, -2214056, 5124970, 984084, 4669703, 3597572, -7684770, -7755101, -2675765, 13538811, --8674760, 9403294, 7482907, -5510980, -14035953, 10593537, -9028558, 11970074, -1165547, -1999307, --4974646, 1984812, 1949378, -740882, -1642825, 1003412, 53126060, 10568304, -28496034, -20215338, --31471910, -9958419, 6036577, 16723529, -5236639, -6734509, -5835250, -5586679, -5319317, 7654706, --3896609, -1047972, -1703491, -5514738, -1343251, 8413841, 1180042, -2405719, -8410620, 9654013, --12513924, 7366943, -4484483, -12235288, 27917, 5614596, 6261526, 4946192, -7268696, 1642288, --2348810, -3937411, 14738180, -13117904, -2427194, -503585, -936840, 1416802, -2228551, -7689602, -6471979, -12205223, 11643656, -1673964, -8229158, 2869575, -4260071, 10423886, -6104223, -3631932, -11181947, -10006737, 3465502, -4766877, -1135482, 8644159, -6171868, -2395518, 7678865, -5243618, -1998770, 842350, -6288906, 15275051, -13326747, -1083942, 5832566, -3330747, 9701794, -4360466, --2173790, 2598992, 3185792, -995359, 2131915, -806917, -4335770, 3921842, -26307, 433255, -2098629, -221191, 3016141, -3008625, 871342, 666794, 663572, -321049, -1913408, 2541010, --375810, -598611, -1815161, 2253247, 3561602, -1156957, -1849520, 1173063, 2075543, -2580202, -2166811, -1932735, -1730335, 5786395, -891743, 2171106, 3005940, -3908420, 9734007, -3145527, --523449, -436476, -5637145, 5876052, -3646427, -5775658, -25152402, -37796784, 49539764, 154542592, -13232794, 13455059, -105353400, -133264784, -27765890, -28225452, 78500728, 133611600, 68563784, 13200045, --48343080, -94068376, -66399120, -47472812, -2462627, 65096136, 95122792, 51408076, 11780558, -33348810, --59278064, -33192044, -31935230, -29908542, 18905372, 38758320, 38200512, 38485056, 9254044, -16681116, --6844568, -25353728, -39690328, -4395899, -11834246, -8008504, 35840964, 20709796, 29942902, 18161806, --13572634, -32659468, -7864085, -21226802, -3277060, 14849313, 4552666, 8024073, 16199006, -8208756, --11488501, -2643552, -6749004, 6538551, 10460393, 569083, 12912819, 7662222, -13550085, -13035763, --20772072, -17764522, 792421, 21435644, 32492502, 15651935, 4112968, -7550553, -21744346, -3730179, --24518358, -15043660, 11550241, 9060234, 27470074, 9254581, -6986301, 8094403, -14235669, -24707874, -4353486, 6267431, 8288750, 7658464, -1542430, -3087545, -2360085, -10273562, -7870528, 5388574, -8386461, 8431558, 8557722, -2370822, -8266739, -5481452, -3172907, 218506, -170188, -9354439, -2397129, 11777874, 6357626, 7328825, -2181844, -11855183, -6885907, -7000260, 2737505, 8310225, -5484137, 5132486, 2222646, -1700807, -8991514, -11849278, -5422933, 719407, 7320772, 11674795, -7150584, 7191923, 4540854, -7441031, -13795972, -17713518, -11482595, 4935991, 9909026, 12851079, -17835926, 5404143, -5371394, -9043591, -7332583, -5459441, -5149666, -5248450, -1543504, 3941169, -7832947, 6881612, 5398774, 3718905, 799938, -5079336, -8754754, -8478265, -4339528, -273267, -3159485, 3179350, 1852742, 339302, 267362, -92879, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ -1260573, -3418794, 2694018, -905701, 2068027, 963146, 5925981, -1047972, -141734, 727997, 4341675, --872415, -4496294, -2115808, -4315369, 1037235, -1525787, -380641, -530965, 1027034, 434329, -860067, 2525978, 4592931, -2033667, -1154273, 937377, -2197413, -284005, 3578245, -1938104, -4427575, 475131, -1617592, 2971044, -4054449, -1016297, -2831457, 3960497, -139586, -1438814, --1094680, 64961, 3642669, 165893, 4388920, 1712618, -3648575, 2954938, -1607928, -2690260, --2235531, 3036542, -651761, 9637907, 998580, 2436857, 1728188, -4465156, 44560, -643171, -1151588, -2527588, -1742683, 5031018, 4085588, 389768, 1685775, -441308, 2535105, -4118337, -401579, 3123515, 1937567, 333397, -338766, 2230699, -3527779, -1600412, 3717294, -2439542, -776852, 1835025, 2191507, 694711, -2822867, -1854889, 1461900, 341450, 1449552, -430570, -405874, -1386738, -95026, -683974, -427886, 812286, 1522566, 660351, -908386, -334471, --619012, 374736, 926639, -544924, 680752, 520765, 965294, -128312, 1161252, -466004, -281857, 730144, 907849, -7336341, -6628209, -4118337, -3757023, -3248606, 1245004, 4636417, -9438728, 1816234, 2433099, -13422, -6740415, -2814277, -2503966, -6047314, 9420474, 2511482, -3741990, 2594697, -2083059, 967978, 9020505, 3609383, -2121177, -164283, -2186675, 199716, --4173098, 2522220, -1314260, -1859184, 360240, 4805532, 510564, 1685238, 3008088, 4169340, --7441031, 111132, 1897302, 4348655, 6665789, -3688840, -744103, -1777580, 5562520, 3026341, -3590593, -573915, 1670742, 11127723, -7006166, 1428077, 665720, -4669167, 2010582, -6531035, --868657, 1705639, -1404454, -9856950, 2785823, 709207, -2656437, -2711735, -441308, -1458141, -3353833, -3105261, -1371168, 1003412, -86973, -3018825, -129386, 2531346, -4119411, 400506, --1110249, -957778, -1269163, -693637, 650688, -2376191, -1797981, 395674, -1424319, -1869921, --1943473, -632971, -1283658, 2441152, -2094870, -555661, 360777, 1249836, -118112, 126702, --715649, 191663, -1246077, 1000727, -1787780, 9912785, 914291, 3528853, -375810, -2715493, -251792, 6950868, 3616899, 4468914, 7267085, -3239479, 109522, 6973953, 2280628, 3037079, -435402, 816044, 4149475, -3772055, -1061931, 5171678, -3518652, 1990717, 3006477, -2275796, -2218888, 6949257, -3283503, 2533494, 590558, 219580, 124554, -1511292, -4742181, -1534377, --3968013, -477278, 1709397, 3295851, 3579318, -695785, -5958194, -608275, 8785356, -3305514, -1802276, -1633698, -9170292, 5312875, 1387811, 3926674, -631897, 4479651, 4468377, -7902740, -3165928, 165356, 2974265, -655519, -5454072, -339302, -734976, -1088237, -995359, 3425237, -24696, 602906, 7153805, 1294933, 5696737, 98247, 593242, 998043, -3056943, -4970351, -3389803, -3783329, 2244657, 1284195, -144955, 2240899, -2420214, -1493575, 1612223, -9127, --4669167, 1429687, 606127, 519691, -905701, 1954210, 244276, -909996, 2328409, -614180, --147640, -1992328, 727997, -1042603, 377420, -82141, -230854, 357556, -671626, 1132798, -333934, -583579, 405874, -390305, 184147, -157303, -707059, 16291885, 9166534, 13938243, -4534412, -5795522, 2971044, -2603287, 401579, 1340030, -11883101, -3185792, -3266323, 3054259, -4680978, -1943473, -266288, 1552631, 383863, 8492224, -932008, -8944269, 2913062, -5180268, -3971234, 4503273, 3614752, 5248987, -1263257, -1844152, 2142115, -1601486, -2072322, 1495722, --1383516, 3140695, 4532264, -1979443, -6870874, 2192044, -6683506, -4328254, -841814, -13927505, -135291, -2370822, 5450851, 5178120, 2511482, 8494372, 8568460, 3773666, 1905355, -644782, -412854, 459025, -3892314, 7931194, -1067299, 2741800, -2529736, -3058017, -1101659, -4570919, -4002373, -2127620, -1691143, 7777112, -6508486, -2019172, 1642825, -3005403, -913217, -264677, -2723546, 3202972, 2156074, 5531381, -1831267, -1535988, -819265, -3520263, 1835025, 3544959, -4886062, -111669, -754304, -1060857, 46708, 1037772, 1019518, -1489280, 1615445, -38118, -1160715, 981400, -213138, -402653, 2090039, -622770, 1048509, 850404, 963146, 855772, --617402, 774705, 3539590, -277562, 161598, 404801, 2608656, 457951, -603443, -1879585, --6206228, -14286135, -5110474, -1483911, 2021856, -1764158, 4315369, -939524, 6973417, -6280853, -3680250, -1541356, 12836584, 5408975, -2844879, -5489505, 2938831, -7817914, -4234838, 3046206, --2807835, -4652524, 8858907, 3738769, -564251, -4083440, -5617817, 3804804, 2847563, 2849711, --302795, -1350767, -3497177, 5276368, -6903086, -2896419, -383326, 4902169, 3654480, -308701, -5293547, 718870, -2578591, 1134945, -2568927, -2557116, -3090766, 3823058, -2843268, -41339, -4918812, 7505456, 7556995, 3178813, 2628520, -441308, 4246112, -1679332, 6139656, -1020055, -3886409, 3118146, -2638721, 383326, -2883534, 3089692, 2559801, 1125281, -1040456, -5158793, -3612604, -5619428, -761283, -6085432, 2188286, -381715, -663036, 1247151, -5299990, 319438, -1291711, 8571144, 2687576, 1511829, 1946694, 3396782, 1394254, 1806034, -2596308, 1993939, -1379221, -3389266, -359704, 280784, 675921, 1583232, -1783485, 1200443, -1178432, 337692, --277562, 2245731, 158914, 372052, 191663, 825707, -513249, 2049236, -1129576, 835371, -689342, 1980517, 826244, 2708514, -1948305, 1076426, -510027, 3107409, 1085553, 1178432, --453656, -310848, 169651, -474594, -2021856, -6649146, -14017163, -11288785, 688805, -9644349, --4773856, -13665512, -7299834, -8326331, 3299609, -4445291, -5943698, -2021856, 306016, -3511136, --13302587, 3572876, -2369748, 1339493, -6033892, 5998996, 2199560, 139586, -5371931, -2379412, -6774774, 4638028, 277562, -1010391, -4585415, 2845416, 1449552, 2945811, -5486284, -507880, --4462471, -3980361, -4366908, 449898, 8778913, -7185481, 125628, -6846178, 671089, 3183108, -3964792, -7220377, 7227356, 8807367, -2937758, -2101850, -1571958, -354335, 2767033, 3549254, -845572, 2411624, -4332012, -844498, -1632625, 7572028, -2413235, 8380018, -254477, -2588255, -6654515, -712965, -4046396, 1416266, 7211787, 8337606, -670552, -2632815, -4594542, 2858838, --6118718, -623307, 4018479, -3133716, 1783485, -238908, -86436, -2526515, 4832, -1966021, --3090229, -338766, 2518462, 1328756, 2507724, -1178969, -883153, -2084133, 746251, -1692754, -2610803, 1318018, 3668976, 311922, -926102, -374199, -717796, -1364189, 1648731, -1214402, --731218, 650151, 513249, -1887638, -700080, 437013, -3758, -1069984, -1838246, -170188, --1700807, -1194538, -749472, 2080912, -220654, 674310, 579821, 19864, -1347009, -459025, --10846403, -10730439, -12461311, 3687230, -10097468, -4160213, 9649718, 4751308, -10956462, -702227, -79457, 4835597, 7118909, 12240657, -3329137, -4354023, -12027519, -14696304, -8730595, -2928631, -5979668, -5940477, 2863670, -8451959, 8796630, -6332930, 7058779, -3249680, 965831, 1887101, --1452236, -6244346, 9926743, -8555038, -464393, -4545149, 1187022, -5301601, 1197222, -21484500, -315680, 10064182, -12847321, 2973728, 8719320, 3192771, -6709276, -691490, 10501732, -12934831, --82141, 5370320, 5060545, 5052492, -1915019, -1822677, -8440148, -4109747, 3401077, 5791227, -9084393, 11191074, -16432545, 6297496, -4989142, 1263794, -11599096, -4635344, 9473624, 2388539, -1264331, -6282464, -36507, 6204617, 4423280, 2805688, -5766531, -3630858, 5912560, -1513976, --2568927, -1219771, -4257923, 3660923, -741956, -3259343, -1322313, -1071594, 811749, -2080912, --2338073, 863825, 765041, 989990, -1354525, -1828582, 1574106, -1141924, -4403952, -308701, --1349694, 2713346, -2074469, 213138, 153008, 1132261, -2781528, -1452236, -1043677, 368830, -2830384, -258772, -751082, 1862405, -30602, 1833414, -892279, -1855963, -797253, -3202972, -675384, 56371, -2355253, 1309965, 12831752, 21485038, 11905649, 14014478, 2099165, 4993973, -18786724, -562104, 532576, 12907450, -6327561, 57982, 3673808, 6448357, 10595684, -8619999, --12359842, 6824703, 3746285, -7131793, 1506997, 4425427, -2774549, 2554969, -6666326, -1472637, --7780870, 2413772, 8423505, 2655901, 7376070, 5751498, 5997922, -14635101, 744103, 17098264, --2055142, -274878, 15883863, -2066416, -585189, 2386928, -2119030, -436476, 8783745, 13862007, --13608067, -2183991, 2692408, -4139812, 6396280, -2128693, 613107, 1038845, -2979097, 12207908, --1575716, -4403952, 4548371, -4567698, -7610682, 2651606, 8284455, 3168075, -934155, 1712618, -7927973, 4179003, 7102266, 2177549, 876173, -49392, -6984691, -1412507, -5472862, -1219234, --2301029, -12396886, -5386963, 833224, 8012262, -3262565, 3096672, -2099165, -6573448, 2947958, -713501, -2058900, 1032403, -3971771, 201863, 1026497, 2458332, 3528316, -834297, 2284386, --3013457, -4438849, -5345087, -535797, 4844186, -843424, -376883, 1647657, 268972, 564788, -2610803, -1232656, -477815, -1392643, 3753802, 117575, -552440, 470836, -943819, -1968706, --2396592, 1022739, 2135136, 2682744, 1468879, 1081795, -462246, -140660, 46171, -835908, --3684545, 36210332, 5020280, -772557, -219043, -17377974, -5083631, 1678259, -4053376, 7668664, -3373697, 12429635, -1582159, 20401, -2681133, -5253282, 8338679, 1568737, 3190624, 4683125, -6528351, -6138045, -6182069, -7144678, -4972499, -4092567, -1793686, -9815611, -1925756, 15853798, -7474317, -3015067, -1071058, -1862942, 1323924, 5616207, -2745558, 22655416, -3937411, -616328, --10282152, 4109747, 9884330, -1699196, -7565585, -981400, 3808026, 7587597, 3278134, 10666014, -15932181, 5190468, -338229, 9463960, 7732552, 2891050, 5976984, -19857782, 4610648, 525060, --17569638, 6454799, -409633, -7570417, 4954782, -8028368, -7810398, 9319542, 7334731, -4139275, --15544024, -7035694, 3739306, -8936216, -1817308, 3909494, 15278809, -2475512, 3094524, -7959648, --16772384, -9009231, -8032663, -3641059, 8025147, 1098438, -5558225, -1685775, -3460670, -3383897, -5139465, 4270271, 1660542, 3647501, 4340065, -3637837, -2658585, -2702071, 599685, -2963528, --4389994, -4274566, 1879048, -1447404, -610422, 610422, 1607392, -3629247, 2087354, -778463, --412317, -1605781, -561567, -2280628, 5754720, -3532074, -1204202, 1021129, -3646427, -3537979, --2665027, 224412, 2945811, -19191524, 12086575, -2223719, -12400107, -491237, 11242614, -12862890, --2732673, -10370735, 6854768, 2230162, -3841312, -4415764, -1615445, 6905771, 5253819, 2966212, -7153805, 6307160, 610422, 7616588, 8703751, 3615289, 4799089, -8907225, -4399657, -6201933, -5468030, 7185481, 2520609, 2222646, -4275103, -3098282, -2641405, -2298344, -7618198, 6925098, -1534377, 449898, -8152385, -2418604, 12799539, -9259949, -9943923, -15155866, 5228049, -11367705, -16429324, 19085760, 13080323, 7696582, 662499, 14918032, -7964480, 11724187, -1606318, -8366060, -535260, 682363, -18034030, -7990787, 6648073, 1024350, -3130494, 2707977, 14961519, 10291279, --17396766, -4382478, -359167, -465467, 4884989, 7357279, -456877, -13884019, 5471789, -8061654, --25848724, -7500087, -5352066, 7976828, 12879533, 4377109, 528818, 652298, 272194, 1147830, -9135932, 21475, 1254131, 1179505, 4553202, -8201240, -558883, 2503429, 5982890, 7344931, -2480344, 4356171, 6389838, 8579734, 10953240, 4218732, 5357972, 5402532, 145492, -517007, --2137820, -1378685, -73551, 2248416, -6609955, -1614371, 3644817, 6062347, -784368, 1693828, --965294, 2540473, -93416, 3885335, -765041, 3725347, -2918967, 4773856, -44560, 4508642, --16095390, 1604170, 1789928, 10067403, 2168422, 25721486, 4093641, -10616085, -3435974, -8938901, -16252693, -20852066, -1864553, 14412837, -31498216, -12431246, -10631118, -11012296, -20892868, 1974074, --3664681, -8960912, -1144609, 9881109, 1240709, 1309428, -6165426, 2448668, -2088428, 2433636, -9127, 1561221, 8054138, -1959042, -502511, 16389058, -10604811, -2136746, 2828236, 14115947, --7415798, 20156282, -6106370, -8144869, -17261474, -22457848, -6555731, -16716013, 8149701, -5073430, --12553653, 1712081, 2024003, 9244380, 7816841, 3266860, -1592359, 28526636, 15785079, -1803349, -2779381, 9767829, 7300371, 4743255, -3866544, -558883, -5122822, -6652905, -6156299, 4298189, -22245784, -15557445, -3813394, -8861054, 16030429, -4226785, 4965519, -2290291, 7525320, -17621178, --13181255, -4553202, 7485591, 2370822, 6463389, -3900904, 3986267, 6028524, 5294084, 2508798, --1053878, -7519951, 4730370, 1762547, -6381248, -4480725, 3991098, -4201552, -3180423, -139586, -4297652, -4003447, 5179194, -3251290, 7399155, -4128001, 827855, 2573222, 1345935, -3577171, --6761353, 5230197, -2030983, -1531693, -528281, -716723, -2137283, 4958540, 6204081, 4292283, -3796214, -753230, 2189897, 7104413, -3838090, 2797634, 1236951, -185757, 1568737, -479426, -385473, -2594160, -12823162, -12326556, 6950331, -5527086, -23089208, 11432666, -6877854, 9128953, --6635188, 11490648, 7839389, 9552007, 15322296, 2470143, 12968117, 5194763, 3364033, 8779450, -3055869, 2395518, 650688, -384936, -8205535, 7312719, -16683800, 7291244, 1772748, -4807142, --8977019, -257161, 6488622, -7482370, -3085934, -11178189, -4290136, -13755707, 903554, 7536594, --102005, -1802813, -8678518, -15185931, -10972568, 11829951, 3998615, -4962298, -8667781, -2156611, --651224, -14847165, 12600897, 11403138, -14553497, -14212584, -23203560, -3561065, -27770722, 7475928, -10893648, 5681168, -1675037, -3573413, -2811593, 11399380, 11610907, 13300977, -8608725, -6920266, -8979703, -3868155, -4083440, -16337519, 7322383, 13310641, 15344308, -3617973, 8442295, -4716411, -2595771, 8330089, 4395362, -5904507, 2853469, -10093710, -6039261, -4198868, 1592896, 4232691, -3746822, -4011500, -3557844, -1508070, -4410932, -911070, -6113349, -7767449, -3956739, -3249143, --2262374, -1052267, -2137820, -3100430, 797253, -162135, 4614943, -1574106, 5863704, -1530619, -4711043, 289910, -2452963, 1149441, 11735998, 3571802, 6055904, -2692945, -4541928, 935229, -4369056, -4071092, 8562017, 8433705, 2576981, 3949759, 1922535, -9691057, -4928475, 22184580, -25709674, -10188199, -537408, 6895033, -20735028, -3888019, 25865366, 868120, -28098750, 3055869, -8685498, -705985, 9812927, 23078470, -9441412, 20857434, 11355357, 17799418, 5034776, -13676786, --14507863, 11633456, -13161390, -20750060, -5983963, -24648280, 5456756, -1677185, 8781598, 7499013, -5413807, 2763812, -956167, 678605, 12552042, 6096169, -24108726, -2837900, 8123931, 15512348, -8687108, 19221590, 17383344, 13578002, -6386617, -2326262, 3631395, 35006132, -14624364, 2561948, -7458211, 13730474, -5622649, -19464254, -4046933, -4908611, -11681774, -21526376, -23469848, 6454799, --13147432, -9951976, 6120866, 18512920, 22844394, 433255, -1251983, -274878, 17556752, -11880416, --6033356, 20738250, -22563074, 2510945, -17816598, -11973832, 1372242, 24049132, -3860102, -16443819, -21488258, -21949430, 936840, -26497800, -2292976, -3323231, 7851737, 14746770, -10864120, -6198175, --7665980, 1990181, 594316, -8203388, 4714264, -2421825, -2265595, -3494493, -2774549, -9713605, -2245731, -4673998, 3505767, 2632815, -648003, -2139431, 5968394, 14496, 153545, -11454678, -1785096, -964757, -311922, 10709501, 1145683, 3034931, -4393215, 1743220, -2502892, -6216429, -2809982, -12685186, 4318053, -4363687, 9597641, -7541963, -942208, 1771674, -971736, -1960116, --3864397, 7081864, -4575214, 7710003, -2633352, 4552129, 12068321, -14183593, -31756452, -7492571, --11081016, -10463077, -6570226, 1474784, -10888816, -9210020, 3029563, 7074885, -6841346, 16811576, --1834488, 11263015, -5700496, -671089, 9687299, -13858786, -8689793, -4718559, 14456860, -3490735, --15904801, -6003828, 2385854, -7708930, 6584185, -10656888, -10729365, 15569793, 4508642, -12342662, -7477538, -1490891, -9741523, -947040, -16141561, -13870060, 2734821, 24174760, 9731859, 7530689, --19394462, 14923938, -1731946, 11433203, -6770479, -13493714, 6542846, -24887188, 20769388, -33694556, --21370146, 7800735, 18532784, 1433445, 22194244, -9719511, 5808944, -15416248, 20818780, 6695854, -15479599, 7131793, 3623879, -4893042, -5206574, -10176925, -3568044, -612033, -17969606, -10722923, -1556926, -27217208, 1517197, 30562450, 9097278, 11005854, 2929168, -13866839, -10451266, -2828773, --3360275, -986232, -5403606, -7295539, 6074695, 3996467, 5510980, 8633958, -8735963, 5667210, --3326989, -4712653, -3570192, 7688529, -2613488, -8390219, -12720619, -88584, -7664369, -3604015, --7857106, -2180233, -5155572, -3092377, 11950747, -6534793, 2723546, 3706557, -9610526, 10948409, -90194, 6546067, 8612483, -4011500, 4253628, 1931662, -398358, 2663954, 7206419, -4184372, --4100083, 6644852, 558883, 5282810, -23865522, -22257058, 2196876, 9173513, -11253888, -50353124, --10525354, -257161, 6581501, -17031692, 1472637, -9496710, -1979980, -13568875, -15151571, 13460428, --14734422, -18078054, -3057480, -12652974, -13916231, 4793184, -20215874, -6689949, 12197707, 27935542, -22562000, -1075889, -13764833, 4830228, 20308216, -936303, 13506062, -3874597, 17013440, 9568650, --17476222, 27816356, -21199958, -11193222, 18721762, -20627118, 6226092, -4736812, -15527381, 1834488, -23533736, -4878546, -13833016, 8817568, 11548093, -325881, 4779762, -33839512, 8172786, 1422708, -17076254, 8276402, -14846091, 14754286, -7909719, -1275068, -13758928, 7321846, 19832548, -4074313, --3923990, -20315732, -28749438, 16368657, -2079838, 13191455, -15722802, 11978664, 9560597, -20447802, -1180579, 18234284, 10407780, -9538049, -16450798, 14916958, 2429878, -12767327, 12133819, 2021856, -5410048, 1461363, 5027796, 963683, 13557601, 210453, 4668630, -894964, 563714, 12061342, --3878892, 322659, 2739116, -3131568, 2197950, 1102196, 8316131, -403727, -9252970, -1115081, -1178969, -5481452, -1638530, 617402, -3694746, 12489228, -2939905, -7128035, 792958, 7954280, -3730179, -402116, 4522064, 657667, -5187247, -631360, 13100187, 8962523, -8857833, -6469295, -1893007, 18979460, 19041738, -51345796, 19358492, 26025354, -6622840, 18103824, -183073, 9381819, --4168266, -10560251, -6820408, 10918881, 2576444, -14834280, -9635222, -1373853, -6956774, -3800509, --1593970, 31758598, 6385543, 7030325, -19649476, 13673028, -13991930, 204011, 2461016, -21474836, -10027675, -7963406, 1119376, -8696772, -15523622, 419296, 10304700, 29427506, 10584947, 3055332, -18204756, 7703024, -2197413, 2987687, 459025, 5134634, 2982855, 19959250, 8737574, 6030134, -3294240, -2564096, -6205154, -19658602, -16500727, 2287070, -2359011, -12131135, 1722819, 14737107, --22487912, 21721260, 5599027, -8007430, -903017, -5822902, -1802813, 13154411, 5754183, 4281546, --15280957, -3113851, -20885890, -6449967, 5816460, 7628936, 7609609, -9051644, -7260642, 16179142, --1908576, -26244398, 3769908, -488016, -286152, -15501611, 5078799, 11575474, -1599875, 16665547, -11243688, -5619965, -308701, -7245610, 9006546, -791885, 2968359, 1352915, -3791919, -3184718, --695248, -3301219, 3652870, -7203197, -704912, 405874, 3885335, -3723200, -4310537, -5151277, -280247, -1273458, 2861522, 1625645, -151934, -3228742, 3473555, 2603824, 512712, 3777961, -692564, 2693481, 2516851, 3582540, -999117, -13187160, -498216, -3781182, -45634028, 70723080, --69924216, -31622770, -15978889, -4773320, 40907952, 12021077, 45795624, 11434814, -9364102, 36082020, -15612743, -12218108, 16915192, 15308337, 8560407, 14322105, 13890461, -12385612, -19997904, -14241038, -2304250, -13096966, 6906308, 4101157, 8955007, -1402844, 6186901, 2084133, 22480932, 5323612, -2108829, 6911676, -5251672, -327491, 7927436, -14121852, -20074140, -13654775, -11684459, 1981591, -5939403, -14161581, -2315524, -8528731, -34795676, 17500918, -6301254, 8848170, -18309982, -6234145, --16961900, -23244900, 8759586, 6138582, 22585622, -994822, 19897510, -8451422, 16664473, 1945083, -23790898, -16884054, 14714558, 17673254, 9774809, 10242960, 853625, -7252589, 27860380, 18631568, --1866163, 33606508, 8038568, 3914863, 14380624, 21654688, 245350, 9943923, 12498892, 5696201, -5447629, -2538326, 1083942, -19681688, -5051956, -2677375, 3100430, 4098473, 3861713, 13042205, -5750425, 6635188, -5150203, -744640, 5104569, 514859, 396211, -4702453, 5338108, 4526896, -2548526, -3678103, 6790344, -1071058, 1175210, -5330592, -4963909, -2008971, 493921, 574452, --3270081, -10844792, 2455648, 2313377, -2983392, -574989, -2829847, 783832, -4019016, 2631741, --3874597, 132607, 9631464, -2787971, -9673340, 6207839, 4451197, 3765613, -2384244, -1313186, -43176768, 3740917, -26011396, -38210176, -20270636, -15940234, 5127117, 31641560, -524523, -13367549, -28294708, 2341294, -22870164, 20582558, 22315040, -4076998, -422517, -2152852, -20245402, 22509924, -1264868, 12788802, -7140383, -17992692, -31481574, 5750425, 3972845, 4884452, -4444755, 9911711, --10469520, -108985, -20177220, -25124484, 8828305, -3165391, 8002061, -3615289, -9327058, -22747758, --35334160, 18138720, -19746112, 8122320, 16995186, -1170916, -9096204, -17330730, -12501039, 40705016, -9247601, -1835562, 5289252, -5355288, -16445967, -5377836, 23594402, -22792854, -38379292, -13389024, --12181064, -53763328, -42018200, -22608708, -23365696, 5793911, -242129, -18698676, -35874788, -14179298, --16952772, -12161200, -9810779, -7211787, -21456046, -20556788, 16276315, -18254684, 1162326, 2785823, --22479858, -3924526, -16401406, -20548198, -4982699, -3335579, 9555765, 4025458, 12847321, -13121662, -3399467, 7568806, -32212, -17655000, -9972377, -11840151, -1120987, 5784784, -5975374, -8582418, -15358803, 9143449, 11068131, -18047990, 3120831, -8772471, -954020, 784368, 1859184, -2143726, -18315352, 1460289, -3146064, 2331094, 6467684, 9238475, 7654169, -1182727, 10895795, -7765301, --4068408, -3330210, -14057428, -378494, -4226248, -18161270, -15120432, 2655364, 865973, -278099, --4551592, -3978750, 29667486, -3526705, 28262496, 41829224, -7705708, -45412836, -43940200, -9514963, -21079162, 2825552, -34482680, 27012660, -5892159, -22675280, 27796492, -52298744, -10961830, 164819, --9233106, -8119099, 63356672, -26667988, 59373628, -3065533, 12510166, -4527433, -23421530, 37877852, -10117869, 39386996, -27057220, -26843546, 8662412, -43211128, -12869333, -7079180, -29908004, 62126164, --5390184, -64796024, -946503, -28986734, 8456254, 15732465, 25948044, 20856362, -25486872, -16166257, --39677444, -11831024, -18355616, 16821776, 11289858, -2359011, 11749420, -8155606, -28134184, -11749420, --32838784, 33506650, -25380036, -17787070, 30313342, 6942815, 51216412, 24589762, 4531728, 26792542, --36134632, -13727789, -37309844, -36532456, -5535139, -5504001, -45528264, 46784540, -8202314, -36696200, --54235236, 3339874, -10698227, 39573292, -2456185, 1850057, 5426691, -7346542, 7631620, 8739722, -18767934, -12723841, -12517145, -8276402, 656593, -2499671, -2527588, -12028593, 13280039, 7946763, -15823733, -3907347, -8420283, -7493108, -2696166, 2747169, 21161840, 22189412, -3561065, 1034550, -12255689, -3586835, -27967216, -13815299, 1837709, 3667902, -2119030, -18070538, 6349573, -2306934, --4173098, -20661478, 8105677, 6760816, 24481314, 3828963, 6089190, -1363115, 10113574, 1606855, --5742372, -84701584, 43760348, 10011032, -18227842, -13848585, 27057758, 14794015, -16292422, -4533875, --39785356, -16750372, 17002164, -34524020, 1388885, 6097243, -10455024, -23058606, -15606301, 30844308, -12497281, -6305012, -44392244, 14963129, 28057948, 16056198, -34354368, -23036594, 224412, 37376416, -3422015, -9166534, 5989332, 1108638, 19235548, -50039052, -43112344, 53368188, 8385924, 22268332, --50765976, 10979547, -2195265, 37182604, -33331094, -6489159, -50886236, 17739288, 36852432, 8523899, --22545358, 14516989, 53444964, -23992224, -25325812, -20046760, 7700340, 2139431, 46905876, -14055817, -3714073, -25308632, 8408472, -27743342, -773094, 17681306, -34418796, 32968706, 10174241, -24076512, --37237368, -22768696, -1734630, 33266132, -60151016, -13204877, 54744728, 7126962, -24447490, -11637214, --17186312, 51347944, -5512591, -53940496, -6067178, -80531, -13085692, 21912924, -3561065, -7610682, -16882980, -1556926, -10831371, -14177687, -1249299, -12505334, 4022774, 9102109, 12350715, -10885058, --7725036, 11163157, -7086159, 10572062, -5359046, -10848014, 15093052, -8169565, 13627931, 18333068, -1477469, -26656178, -1513976, -15899969, 6913287, 9802726, 6735583, -18629958, 512175, -14071923, -13465259, -3969087, -7714835, -5381594, 3192771, 4492536, 55988120, 28586766, 13028246, 12884365, -13590350, -8952322, -8645769, -18926848, 2538863, 6014028, 5102421, -1181653, -31994822, 15328201, -6483790, -22429930, -18797998, -9766219, -10916196, 8247411, -8107825, -9565966, 2943663, -868657, --16888886, 21805548, -15516643, -5167920, -16128139, -14894410, 10853919, -6397891, -1939715, 5420249, -7162932, -1873680, -21519396, 5094905, 34121368, 7152731, -52947820, -3449933, -11313481, -16614544, -11433740, 11910481, 27762132, 13169443, -34445100, 37535328, -9075803, -26156888, 78588240, -15868294, --6454262, -25918518, -62027916, 28447716, 31889596, 10364293, 12199855, -53314504, 15737834, -4229469, --12643847, -9439264, 2392834, -5120675, 8595303, 10082973, 2464238, -7947837, -14976551, 16107738, -20553566, 28214714, -13707388, -2900714, 6272263, -4189741, 15079093, -36574332, 3808562, 6443525, --16858820, 2815351, -13999983, 5581310, 528818, 4478041, -2090039, 1005022, 1677722, -738198, --222265, -4863514, -3520263, 9769977, -5129265, -355945, 7492571, 1619203, 599148, 11957726, --9575093, 7337952, 8847096, -502511, -1444720, -10074920, 8460012, -18860812, -5029407, 12380780, -3839701, -5104569, -12507482, 3927748, -2692945, 15414638, -31584652, -76201848, -128408784, 10289668, -130941208, 12390444, 278156576, 280774912, 102083856, 281765408, 163556656, -47663936, -4332549, -25672094, --213511952, -177250080, -124206696, -221905920, -211710752, -60574072, -133194456, -116287848, 26462368, 36965708, --28595892, 41084048, 60687352, -244813, 4424353, 120390616, 80583248, 30535070, 89302568, 166571712, -78663936, 91740504, 206434912, 81456736, 37279244, 178235232, 172160544, 7387881, 110191680, 194452496, -573915, 49251464, 115574352, -4691178, -94101120, 46541340, -19474992, -181646512, -169031120, -155659280, --302008672, -446889728, -310791360, -434803712, -578893440, -408809472, -331022272, -447922688, -285800000, -137820672, --132487392, -25393458, 133590128, 268937440, 304902400, 407628352, 555155648, 545121024, 516071456, 580908288, -580420288, 473622144, 381617504, 408232896, 271632512, 96346856, 129574328, 31514860, -238117280, -153473136, --161822016, -332800384, -280714752, -202219408, -236321456, -273893824, -170152640, -149067584, -206835424, -171030960, --88569208, -142349168, -186926640, -112752016, -79222280, -148663856, -83610664, 19250580, -46332496, -53366580, -59635620, -2390686, -75184480, -9943386, -47316580, -170468864, -118286080, -89816896, -157783680, -70967352, -39364448, 75255880, 139774880, 232244448, 270479328, 283416288, 318271584, 338409600, 333651840, 307201280, -286277824, 242683376, 193212320, 118089592, 88774824, 9987410, -76047768, -133461280, -212672288, -306159232, --297311584, -253665056, -229517680, -199735312, -136616464, -115801448, -103142032, -75254808, -49491444, -45008036, --19389092, -13026636, -9327058, -2040646, 16123844, 27232778, 36182952, 42131480, 49587544, 45695768, -41121092, 24771224, 17101486, 3621194, 4120484, -1491427, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ -10251550, --424128, -542777, 3265786, -1328219, 3730179, -1974074, -4786741, 1686848, 4809290, 712965, --746251, 6389301, 217433, 266825, -2178622, -1212255, 9953587, 1387274, -6755447, -4993973, -7020661, -637266, 7280507, 513249, -1382980, -682900, 5499169, 1090385, 11543798, 5085242, -3178813, -619549, 2565169, 5223754, -1283122, -3890167, -4887673, -935229, 4408784, 3791919, -5881958, 1653562, -3287261, -3418794, -1422708, 2457795, -786516, 1352378, -668404, -5232881, --4038880, 1603097, 3823058, 2353105, -1891933, -2158758, -144418, 5708012, 2905009, -625455, --1275605, 2646774, 1787243, 1136019, -2909304, 1464047, 2737505, -351114, 4180614, 4932770, --8614631, 3164854, 1762010, 5624260, 1698123, 447750, 2567854, -1139777, -4015795, -1492501, --2419140, -807454, -497679, 2445984, -122943, -1957968, 30602, 288300, 1461363, -1271847, -237834, -246424, 522912, 747324, 523449, 964757, 97711, 595927, 2881923, 4487167, -9698036, -7882876, 1774895, -1730335, 110059, -10129143, 1016297, 6094022, -9011378, -1867237, -6018860, 15976741, 2288681, -107374, 1134945, -10005126, -323733, 7377680, 6546067, 181462, --209380, 609349, 3435437, 5756330, 6063420, 6557878, -2929705, 1420024, -399969, 2530810, -707596, 1633161, -10154913, -2779381, 1582696, 833224, -5616744, -176094, 3830574, -4463008, -3526705, 3260417, 6010270, 2819646, -2299418, 3005403, 6717329, -3757023, -6067715, 2041183, -1406602, 1190780, 3183645, -2683818, -4906464, -7306276, 5905043, -1081258, -1383516, -2372433, -2591476, -83752, 3829500, 7579007, 1532230, 522375, -408022, -1820529, -5906654, 9193377, -2260227, -1088237, 4747550, -737661, -5444945, -4778688, -1063541, 1816234, -7940858, 663572, --4707821, -879395, 2422899, -128312, 1273995, -1410897, -2596845, -541166, 1312113, 1809792, -1333051, -265751, -796716, -35970, 1297617, -673236, -1322313, -976568, -4754529, -4126927, --5158256, -7329899, 4102768, -95563, -3502009, -1394791, -1789928, 1590212, -2909304, -5033165, -1145146, -3273302, 8596914, 11426760, 9037685, -6254010, -240518, -413391, 2417530, -3471944, -7090454, 4445291, -1011465, 3432753, 5377836, 434329, 1304060, 1875827, 5225365, -500364, -1944547, 6251862, 637803, -71941, -2729989, 4498442, -6793565, 2744484, -949725, -1396938, -4530117, -4375498, -550830, 154082, -5904507, 2454037, -1189169, 2735894, -188442, -2552821, -1796370, 1879585, -308701, 5247913, -372052, 6054294, -87510, -4023848, -1787780, 233002, --2744484, 5399311, 2820720, 4635344, 5259725, -2296734, -5199595, -3398930, -2147, -964220, --1104880, 4285304, 5410048, -806917, -2957085, 1882806, 1480153, -2069101, -2821257, 972273, --4054449, 992137, -72478, -125091, -1081258, -3841312, 875100, -1511292, 165356, 1722819, -6442, -1961190, 992674, -2690260, -40265, 175557, -609885, 228707, 525597, -1469953, -35433, 182536, -1735167, 372588, -514322, -104690, -906775, -22012, 498753, -15112916, --3567507, -4704600, -8178155, 2790118, 2137820, -970663, 3798362, -522375, 3205119, 4535486, --1995012, -5282273, -6665789, -2537252, -6207839, 490700, 683437, -2698850, 3520263, -3033321, -1887101, -1384053, -3542811, -9405978, -3664144, 841814, 1477469, 2476049, -3500935, 2501282, -3780645, 1254667, 8582418, 2138357, -221728, 6649146, -4699768, 3841312, 629750, -2233920, --3183108, 4288525, 574452, 1356673, -10136123, -1867237, -3351148, 10183367, 4362076, 3668439, -4130148, 4675072, 3696893, 5184026, -2745021, -1111323, 3175055, 5092221, -687732, 5946919, --3204046, 1300838, -1293322, 5036923, 7540889, -11785927, 3085397, -2916820, 373125, -5561446, --2862596, 927713, -1692217, -2390686, -4722317, -2129767, 2216203, -117575, 5040144, -535260, -1939715, 4369056, 6944425, -265214, 1829656, -819265, 3228742, 512712, 1567126, -2164127, --766115, 223338, 1471026, -971200, -1584306, 68719, 78920, -1228898, 176631, 697395, -19864, 2017024, -900333, -957241, 220654, 1755568, -725313, 28454, -652298, 1040456, -1615982, -239444, 1545115, 1689533, -424665, -746251, 5900212, 3622805, 2138894, -1119913, -485331, 644245, 7620883, -6049999, 7645042, -1012002, 4166655, 7838852, -4904316, 6074695, --3794604, 3119757, 1188632, 9215926, 4075387, -5124433, -8441221, 1928440, -6328098, 5212480, --1296006, 6791417, -5054103, -816581, -4046396, 2346126, 1510755, 1947231, -503048, -715112, --7366406, -3226057, 6065031, -4822712, -976568, 3947612, 191663, -3773666, 1239098, 348429, --841814, -3270081, 6631430, 2121714, -9426916, -4248260, -7608535, -1323387, -6725919, -11602317, --2636573, 5078799, 14316200, 3139621, 1191853, 6753836, -166967, -5265093, -4601521, 3777424, -1480690, 2555506, 4143033, -10107132, -2473364, -9294846, -2028835, 2627446, -3672197, -8588861, -890132, 3744138, -1821066, -3180423, -1495186, 1517197, -1256278, -339302, 1910187, -1158031, --1247688, -1712618, -1236414, -3917547, 1441498, -1002338, 1847910, -641561, 1096827, 2516851, -386547, -644782, -193810, -2073932, -1353452, -3300682, -2983929, 492848, 409096, 31675, -1234803, 1982127, 1413581, 33823, 1293859, 1084479, -855235, 799401, 850940, -1700807, -16449725, 3915400, 11910481, -5584531, -774705, -3973382, -916976, 12654047, -10794863, 3622268, -1225676, 16571594, 8824547, 10996727, 2009508, -2736431, 5191005, -3619047, -13740137, 2612414, -781684, 1610613, 10829223, 1028108, -6362457, -562641, 285078, 3432753, 3748433, -326954, --1417876, 4418448, -5176510, -1428614, -2621004, -1330903, 1336809, 195958, 9539659, 1371168, -7490960, 8631811, 2390686, 7612830, -564251, 2517388, 4630512, -5002027, -7464117, 932545, -7518877, -12014634, 3576097, -9220758, -8610873, -5287105, -2386391, -8114267, -7853348, -8319889, --4262755, -2075006, 5582384, 129923, 6688338, 1006633, -5507222, 8427263, -8767102, -3332358, --3628711, -3608310, -4647155, -6128382, 8753680, 6802692, -3825205, 3337190, 2756295, 6911676, -28454, 4990215, -2454574, 6274411, 3175055, -3714073, 216896, -3356517, 4002910, -3828963, -427349, 3084860, 238908, 2358474, -670015, 373662, 1649268, -558883, -1676111, 1552631, --446140, 263604, -3226057, -2687576, -2572686, -2024540, -333397, -1134408, -2226941, -110595, -475668, -1058173, 271120, -83752, -8826695, -8984535, -5206037, -5535139, -2872796, -2308008, --10597832, -8609262, -7184407, -1155346, -572304, -1387274, 7440494, 697932, 3866544, 5624797, -6684580, 998580, 13018583, 16191490, -286689, 4656819, 3712999, -2017561, 7150584, 3805341, --14544907, -533113, -5000953, 798864, 11333345, 4444755, -11621645, -3146064, 5240397, 5105643, -761283, 14893336, -6142877, 5977521, 6143414, 6607807, 3941169, 7704635, -13101798, 4769561, --5085242, 7763691, 337155, 3317325, -9825275, 7199976, 5296232, -1322850, 5129802, -901406, -1465121, -146029, -5102958, 1289564, -3245922, 3173444, -4015258, 5004174, 1635846, 12606803, -9510668, -3034931, 3427921, -10489921, 9134859, -2908230, 5621039, 9761924, 9692667, 396211, -9899363, 6746857, 4707284, 4938676, 9100499, 835908, 2003065, -7455527, -1234266, -2186675, -1746978, -5397700, 848256, -3952444, 1260573, -3937948, 1235340, -1491964, -2370822, -2353642, -1650341, 95563, -1169842, -986232, -3090229, -1090385, 607201, -989453, -2213519, 261456, -2401961, -5471789, -3285113, -3054796, 2231236, -3386582, 2088428, -54761, 1222992, -2819646, --3984656, -989453, 799938, 8543764, -7612830, -2025077, 6843494, -3664144, 11708081, -3759707, --8244190, 15507516, 21132850, 4663798, -8323110, 5801427, -4383551, 8642548, 5058935, -1924682, --8829916, -5818070, -15023796, 3901978, 6419366, -13298829, -1570884, 7672959, 2018635, -680752, -322123, -1663763, -7175817, 1706713, 8912594, 324270, 1931125, 3183108, 12621298, -8353175, --221728, 9124658, -8374650, 12269111, 652835, 17259862, -14384382, -13018583, 7153805, 597537, --1712081, 3675955, -1174674, 4773320, 2974802, 9577777, 9185861, -7621957, 1404991, -4997195, --2969433, 5713380, -696322, -3009162, -1261110, 227633, 8629663, -16489453, 12553116, -3973382, --5575405, 9250286, -7482370, 7406134, -10074920, -5720897, -1849520, -7548942, -2568391, -5345087, --8372502, -5705864, 1860795, -1964411, -1991791, -173409, -3884261, -1301912, -554051, 5153424, --239981, 702227, 2124935, -2248416, -827855, -1912871, 1292785, 2491081, 727460, -1105417, -6148783, -23085, 4570382, -4988605, -3154117, -2987150, -2075006, 2274185, 1168231, 105764, -3592203, -2712272, 2750927, 1012002, 2561948, 1367410, 391379, -3192235, -10470057, -7973070, --3517578, -7476465, -11413339, -2385318, 4136591, 14014478, 2263448, -8439074, -15668578, -3255048, -4844723, -2725694, 16799764, 5302674, -5959267, -11877195, -14872935, -28135258, -2311229, -3092377, -10771241, 7992398, -5778879, 746251, -4474282, -2421825, 10108206, -252329, 525597, -1218697, -11469710, 1959579, -3457449, -555661, -437013, 3122441, -10460930, -3275986, -4121558, 16547972, -3843459, -17372068, 4473209, -9008157, -5090610, 2576981, -16193637, 5051956, 11654394, 10362682, -8056822, 1987496, 3248069, -505732, 1707250, -10187126, 3696356, -15959025, -3077881, 9169218, -3333432, 9393630, 9235790, 7664369, -5243618, -11772505, -10326175, -7956427, 2580202, 3213709, -5447629, 5449240, 1165547, 3650185, 11521787, 16175384, -3888019, 5781563, -4034048, -4318053, -4923643, -7060926, -2523293, 319975, -4511327, 4233227, -3922916, -3369402, -1893544, 1041530, --1046361, 2321967, 18254, 3346317, -806917, -1976222, -952946, -1933272, -5129265, 1401770, -2717641, -209917, 1777043, -455803, 2440078, 4742181, 4481799, 3548717, -3639985, -1791001, -3440269, -1014686, -1416802, 369367, -612570, 3530463, -818191, -155693, -568546, 8240969, -14570140, 16887812, 12199855, 20875152, -9774809, 14837501, -12718472, -9959492, 10975252, 14049912, -16574279, -17112760, -113280, 4318590, -12695923, 6010807, -5591511, -8980240, 10226854, -13324599, -14443975, -13697188, 13529147, -9830643, -3644280, -897111, -17942226, -2484639, 19735912, -5050345, --14145475, 3024194, 9149354, -10294500, 5075041, 21368000, 11461120, 4327717, 9423158, -11299522, -7516730, -6787122, -19495930, -5902896, -5124970, 1445793, 8790724, 10905459, -4867272, -8533563, -7731478, 54224, 5907191, 3713536, -3214246, 1062468, -7786776, 1175747, 2415382, -107374, -2492155, 17571784, -2228014, 1733019, 4975183, 1041530, 2108829, -8948027, -9837623, 6787659, --11701638, -15832860, -16654273, 12896713, 8300561, 2473901, -956167, -1934346, 6105833, -992137, --4715874, 5898601, 16195785, 10970420, -4359929, -2783139, 4971962, 2889439, -1204738, -2598992, -1773285, 2268280, -748935, 639950, 8757438, 2084670, 1192927, 3429532, -2941516, 614180, -2736968, 5851893, -639950, 389231, -5827197, 1830193, -3070902, -2222646, 5931350, 4787815, -233002, 3743064, -3345243, -1615445, 1721208, -6979, -1817845, -3358128, -3668976, 2245194, -939524, -1603097, 1964948, -13536663, -21455510, 7627862, 27899034, 13638132, -5213554, -21576842, --7478075, 1364189, 3024731, -4201015, 10602127, 7133404, -7820062, -4062502, -1036161, -14277545, -19840064, -9038222, 7077569, -1662152, -4658429, -17391396, 5712307, 3606162, -2151779, 2097555, -7804493, -2843268, 19405200, -4344360, -2939905, 16168941, -1786170, -11609833, -10361072, -20054812, -2778307, -4452271, -6208375, -4371740, -14689325, -6160594, -13754096, 1473174, -12102144, 10962367, --6827925, -222265, 3436511, 1365263, 6359236, -5819144, -14858439, 6487548, -1683627, 3711926, --3296924, -1493575, 475131, 14351633, 21494164, 5842766, -6700149, 7431367, 7828652, 8541616, --3466576, -7155416, 10983305, 5202279, 14665703, 3425773, 3949759, 441308, 4442607, 13196287, -18026514, 8878234, 3084860, 6789270, 2893197, -3721589, -12265890, -7772817, 1452773, 6009196, -993748, -266288, -4559645, -1664837, 2582349, 1764695, -9680856, -1795296, 2254321, -353261, --4792110, -3996467, -5362804, 1088237, -897648, 3759707, 6956774, 4124242, 286152, -2228014, -4280472, 5148055, 399969, 1770063, -6735583, -175020, -2240362, -6890202, 1530082, 1348620, --6161668, -559420, -1394254, 2431488, -2354179, 5942624, 96100, 8131447, 41477572, 1202054, --11297911, 34826816, 17395154, 15510201, 29985852, 30183956, 8435316, 9746891, 7388418, 32788854, -1520418, -11274826, 13911936, 3227668, -12885976, -14097693, 12368969, 12373801, 23246510, -2065879, -1530619, 545461, 3036005, -13678934, 15482820, 11124502, 4633196, -10571525, 16394964, -4788889, --1056025, -21772262, -4985920, -1429687, -1580548, -11371463, 7416872, -10560251, -6362994, -6087580, -2952790, -7242389, -10324028, -13810467, 14653892, -10454487, 15596100, 7218767, 12773770, 4241817, --13385266, -430034, -21403432, -9592273, -11758010, 4664335, -14927696, -7809861, -2879239, 317828, -15073188, 1788854, -2599529, -24262270, 9482751, 8464844, -789200, -55298, -12589623, 9651865, -816581, -10464688, 28735478, 6663105, -3991635, -201863, -11891154, 2080375, 14281840, -3694209, --1429687, -15953656, -9764608, 5983963, -2489471, -7505992, 9157944, 5886790, -9824738, 8673150, --3561602, 2843805, -3453691, 8493835, 1555315, -1174674, -16106, 2163590, -11797201, 265751, --4518843, 3564286, 3702799, 5788006, -4998805, 4261682, 2841121, 2618856, 3978750, 5140002, --625992, 3994857, -5823439, 9906879, -4686883, 8405788, -5986648, 3803731, -12678743, -23251880, -7140920, 7002944, -7194607, 15134928, -16735340, 18178450, -13114146, -7638063, 5851356, 4206921, -46916612, 18331994, 7028177, -29278256, -779000, -6949257, -15518254, -4509179, -5672041, -5136781, --1737314, -24347632, -468688, -9212168, 301721, 11853036, -12915504, 15381352, -5042829, -17023640, --15188078, 12185359, 9347459, -3807489, -8385924, 15542413, -8386998, -7920994, 12215961, -348966, -3758633, -12586402, -425202, -7400229, 15668578, -2362232, 22476638, -8407398, 3376918, 6773701, --643708, 860067, 6855842, -14492830, -2325725, 18471580, 1496259, 5070746, -173946, -14977625, -6400038, -10455024, 5322002, 16149077, 20946556, 22848152, 24050206, -5188321, 8438000, -191663, -12903692, 29154238, -32022740, 24894704, -14807437, 6692633, 20006494, -12624519, 1282585, 6287296, -5450851, -1490891, 13922136, -5393405, -4412542, 5895380, -3349001, 13424994, -1999307, 5093295, --10825465, -1750736, -333397, -8704825, -3675955, -10981695, 103616, 3188476, 1056025, 12214887, --4041564, 836445, 1302449, 5201743, 1260573, 5247913, -7249368, 5459977, 1655173, -288300, -3860102, 5356361, -6101538, 5565204, -11716134, -10311680, 7191386, -3439195, -8320426, -1165010, -3371013, -5301601, 9389872, -11156178, -24824374, -4734128, 4915590, 418222, 5713380, -18303540, --2580739, -3693672, -26239566, -20177756, 10313290, 10924249, 4936528, 7550016, -13475997, -6507949, --9577240, 28653874, 6782827, 845572, 21339008, 12379169, 10689637, 9745281, 8341900, -15049565, -10777684, 4446902, -4719096, 8571144, -7692287, -7483444, 14860587, -6458557, 9336722, 19752554, -615254, 3805878, -423054, 1304596, -4365835, -11548630, -14689325, -23737748, 9664750, -20105816, -7485055, 7847979, 10056129, 82678, 545461, -2806224, -15555298, -7339562, 7795903, -5360656, -8046621, 19743964, -6138045, 15104326, 6847789, 1681480, -932008, -5381057, -14412837, -602369, --19452444, -6730751, 20691542, -11095511, 3221226, -34255584, 16183437, -6346351, 5162551, -26434450, --23590108, 2219424, 6228777, 12089796, -27365920, -2893734, 263067, 18591840, 15153181, 17206176, --5571647, 358630, 2529199, 8994198, 2057826, 4943508, 14138495, 8070781, -5513128, 5153961, -1297080, 1009854, -401579, -3031173, -11839077, 4117800, -5783711, 1748052, 4557497, -157840, -947040, -166967, 4565550, -2907156, 19080392, 5202279, -860604, 10691247, 6374805, 882616, -3102577, -335007, -8674223, 11238856, -3799436, 1505386, 13330505, 7464117, -4316979, 45634, --5481989, 8850854, 6011881, 7396471, 6784975, 20326470, -48289392, -12014097, -28639916, 9594957, --25709674, -8761196, -29151016, 7722888, -15151034, -11806865, -2393908, -24950002, -8930311, -26723824, --13339632, -30925376, 6754910, -28618440, -11170136, -14914811, -8196945, -7928510, -6554120, -27318676, --15459735, -20804284, -10520522, -6072547, 11865921, -1791538, 8885750, -17031156, -2647847, 892279, --19413252, 3692061, -1256815, 1574642, 5225902, -19842212, -1004486, 7212861, -2331094, 8142185, -16524887, 29660508, -24585466, 1447941, 33164664, 91268, 16338056, -11651173, 20596516, 3678640, --4773856, -27542552, -16064251, 22756884, 14204531, 22223234, 933619, -15600395, 5796059, 7996692, -16054051, -29933774, 333934, 5610301, -16374563, -5545340, -7009924, -10049150, -23826332, 36990944, --6683506, -11940009, -7479149, 7639673, 9014063, -20966956, -19333796, -805843, 6320045, 940061, -186831, -4110821, -6946573, -115964, 18783502, 11539503, 1611, -15388331, -10512469, 1709397, --5805722, 4057670, 5049271, 2500745, -1497333, -7934952, 3364570, 3925063, -2071248, 5948530, --3339337, -13644574, -6362994, -773094, 4082903, -1003949, -4271882, -19954954, -7867307, -4555350, -1624571, 2528125, -8517457, -15441481, 6170258, 9321690, -8097624, 407485, -7108171, 7865159, --2482491, -13771813, 20636780, -34804804, -321049, -6941204, 15067819, -7705708, -21376590, 18653580, --37557340, -32478542, -26720602, 15285789, -7923141, 802085, -14557255, -13874892, -16104517, 9009231, -7889855, 26153666, 12373264, 5244155, 24441586, -6550899, 8883603, -8862665, 7663833, 4354560, -14573361, 23447838, 12309913, -4953171, -14350023, -8642011, -2909304, 13138842, -4329327, 3617973, -523986, -6134824, 12510703, -858993, 10273562, 7540889, -19997904, 16440598, 30353608, 4654134, -25392384, 24489904, 11156178, 8058433, 72478, 12903155, -8070244, -29579440, -9594957, 21832930, -224412, -10928544, 11294153, 31036508, -7098507, 2299955, -22513144, 22099754, 19892678, -1530619, -6403260, -10249403, 51063940, -32131188, -27821188, -26346404, 2226404, 843424, -7729331, 22674206, --31971736, -638340, -20437066, 7719667, 9055402, -1532230, 22183506, 5019743, -1880659, -12108050, --149787, 5505611, 16161962, -11177116, -14265734, 5851893, -8502962, -2334315, 1973001, 3779571, -1316408, -6442, -1073742, -13513041, 1269163, 3119220, 9208410, -8039105, -4511327, 5098126, -2438468, 3515431, 307627, -8869107, -1011465, -10054518, -7602629, 9912785, 5054103, 5537287, -3889093, -443992, 1910724, -2817499, 6030134, 729071, -2767033, -693100, -8791261, -3391414, --5859409, 3425237, 55830280, -12306692, 31096636, 53647900, -18298172, 25722022, 11345693, -33786896, -30842160, 4692252, -14806900, 22763864, 9660992, 21388938, -219580, -18034568, 17028472, 5879810, -51003, 5385352, -5204427, -19075560, -11420318, -9127342, -16558173, -12248710, -3166465, 12709882, --11410117, -6816650, -16308528, 3460670, 1358283, 2621004, 22299470, -13353053, 5349382, -12386149, --7042136, 12838194, -10271951, -22900228, -29481730, 33932924, 15035070, -8392366, 23349590, -21481816, --18869402, -11426224, -1918777, 3462281, 127775, -19990388, -14754286, -15624017, -34454228, -21472688, --18577344, 6682969, 11516955, -911070, 19954954, 3838627, -20626580, -17723182, 26934276, -23079006, -3212636, 23676544, -3152506, -40632000, 28368796, -14948634, 4459250, 1890859, 23454280, -5592048, --9139154, -1128503, -13598940, 7131793, -23374822, 7984881, -30025042, -19073412, 11442867, -12599823, --3794604, -1553168, -17889076, 5912560, -10510859, 8602283, -2857764, -221728, 756988, 11176579, --8144869, -6248104, 1792075, -11104638, -5115843, 1831267, -7490960, -7733626, -5568425, -3210488, --8714489, -4640176, 11906186, -9675488, 4493073, 7436199, -1937030, 7947300, -10561861, 1311039, --7477538, 15351824, 2669859, 5636608, -10806138, 13515188, 8988293, 10394895, 4131222, 1501628, -3084860, 7626252, -7476465, 1007707, -26993332, 16175921, -7554311, 27379342, 18999862, -43814036, --5378373, 4625143, -26528940, -4364224, -4235375, 32318556, 23466628, 21583822, 27042724, -1025960, --18742700, -14629732, -14896557, 687732, -41671384, 4990752, 35899484, -32649268, -58775016, 5967857, --21926344, 43412456, -183610, 1392106, 29231548, -13383118, 6085969, -1387811, -7814156, 25255482, --7202660, 12754442, 42620572, -31343060, -17769354, -28573344, 14288819, 2314987, 28557238, -16383153, -11300059, 1459215, 26011932, 15213311, -12604118, -8506183, 9885404, -4760435, -1083942, -18392660, --17999672, 9405978, -3968013, -5408438, -10211822, 23396298, -8848706, -9522479, 39442296, 42013908, -27328340, -35878008, -3125663, -11345156, 13950591, 52334176, -6589017, -40063992, -2576981, -16568373, -23578834, 10424422, -26747446, 13996762, 10433012, 13648869, -25813290, -9426916, 1944010, 22771916, -1434519, -3803731, 3773666, -7968775, 1820529, 22750978, 11123428, -9655623, -11438572, -2733747, -7215008, 9016747, 12087649, -11559904, -4342212, -21077552, -4399657, 13116830, -13160854, -2208687, --8138426, -7672422, -12372727, -2733210, 8383776, -2030446, -927176, 1957431, 5322002, -5706938, --15801185, -16497506, 9814537, 7433515, 13727252, -7039989, 10052908, 29454348, 1484448, -17878876, --2927020, 1446867, -1674500, -11247446, -25740276, 3888019, -21129092, 19460496, 11157788, -20614770, -35159676, 53355840, 1484448, -2455648, -18278844, -18434000, 3076807, 3106335, -9026948, 48265232, --4383551, 36006860, 28797756, -36313412, -1182190, -12155294, -38916160, 9834938, 8970039, 21265456, -36339180, -1073742, -10437307, 11995307, 13145821, 28668370, 11947525, 2653753, 23526220, 24839944, -8487392, -5683853, 21568788, 9659918, 25929254, 5585068, 7438347, 16275779, 27464168, -4574140, --21873194, -25201794, -8288213, -8754217, 43229384, 23736136, 66759360, -3104725, -33742872, 29662118, --10238128, -11531987, -10160282, -22726282, 3294777, 12773233, -555125, -12731357, 47412144, -9476308, -55959664, -15341623, 30084636, 2637647, -9524090, -30573188, -43716324, 40931040, -4023848, -6993281, --12606803, 38037840, -79994, -39920648, 73123968, 23007066, 7905424, -8405251, -30790084, 15386183, -756988, 15486578, -14353244, 11044508, 5490042, -6912750, -10628970, 1887638, -12833899, -5994164, --14570140, 1685238, -2632815, -202400, 4713190, 11943767, -12258910, 4665945, -6038724, -379031, -15963857, 10691784, -5853504, -20131048, -753767, -1219234, 2561411, 18334678, -12029667, -7074885, -4491462, 11486353, -16847010, 1072131, 10895795, -304406, -1419487, -17519708, 8920647, -615791, -8108362, -18314278, 1925756, 7664369, 5969468, 8950175, -17655000, -18492518, 11992086, 49593452, --29471528, -18967650, 4029216, 8934069, -5608691, 35086124, 27346056, 27593554, 9336185, 13608067, -23240604, 14317273, -8401493, -13874892, -31182536, -5084168, 17157320, 5829345, 3720516, -11659226, --29489782, -8653822, -4119411, 30049202, 437550, -3636227, 22843858, -3666828, 6337761, 4827543, --50794432, 12992276, 13755707, -8920647, -21698712, 4090420, -28631862, -14630806, -43868796, 13232794, --36621576, -72698760, 8466991, -1036161, 51198156, -1800128, 17412872, 42205032, -6890738, -10993506, -18803366, -414464, -36831492, -12922483, 4876936, 6098854, 27229556, 11281268, 24251532, 20942798, --15057082, -11330661, 10351408, 30838402, -12827457, -6515466, -28320478, -19615652, 7557532, -38313792, -11129334, -43028592, 8199630, -11376295, 30546344, -13367549, 21660594, -46112380, -9357660, 6252399, --27388470, 6885907, 4887673, 4694936, -20651814, 10817412, -20221780, 5733782, -1520418, -8670465, --3672734, -2075543, 6505802, -7105487, -3200288, -5708549, 13211319, -8626442, 7733089, -19502910, -10277857, -1176284, -1532767, 2740726, 18879066, 6504191, 8086887, -22601728, 2969970, -9298604, --27820650, 11135240, -8891656, -7141457, -10259603, 10324565, -4986457, 4949413, 5872294, -2750927, -1254131, -6890202, 1989644, 5639292, -1306744, -907849, -10611254, 38970924, 41536092, 97071096, -11441793, -54326504, -40790380, -30024506, -34657700, 67949600, 90689848, 30753040, -8650601, -28513214, -1010928, -34508452, 37988984, 35920960, 10660109, 5207648, -22495428, -3251827, 41803452, 9752797, -16798154, 14157286, 43865576, 36909876, -14221710, -32611150, -43116104, -29058674, -4319127, 12022150, -39436388, 23655070, -8226473, 21375516, -29925722, -10186052, -67299456, -10628433, 66248796, 51200844, --10305237, 134233296, 42111616, 3938485, -73592120, -12541305, -6310381, -17264694, 18801756, 10436234, -15931644, 28171764, -60050624, -64691872, -32500554, -43643312, -6225555, 14779519, 54339388, -32500554, -19883014, 84688704, 42344084, 14741938, 23748484, 17279190, -51151988, -84672592, 43312060, -20951388, -18652506, 45334452, 50169512, 4419522, -30332132, -39986144, -32586454, 35038344, 20272246, 6094559, -34993784, -34892852, -6055367, -5605469, -15433965, -18072148, -1537061, -542240, 11353746, 3497714, --5004174, 68183, -439697, 548682, 2995740, 6448357, 10106595, -10149008, -13808857, -47424492, --25933012, -23468238, 27966680, 16504486, 9993315, -38849588, -37995428, -61266636, -16708497, 23989540, -30746598, 39954472, 15688979, 11625940, 4655745, 3787624, -1163936, 8892193, -2167348, 28573344, -20281910, 3965866, 201327, 86436, -4956393, -187368, -20646444, -88874144, -21176874, 49544596, -94871536, 83583824, 200390288, 104882568, 71168144, 62617940, 28500866, -11206107, -101227544, -127078952, --189579312, -145178480, -148927456, -56657060, 753767, 57038240, 106115224, 87538952, 90471872, 62354872, -85127328, 66636416, 94253592, 44887240, 35160748, 16816408, -24217710, -37271728, -57085484, -34511672, --124022552, -52383568, -117383064, -84693536, -134352480, -79866528, -125057096, -44408888, -61977988, -20175072, -9610526, 63513440, 166544336, 158587376, 222207648, 150402240, 102614288, 133222904, 181965952, 160133568, -134514080, 93855776, 11358041, -90945936, -90268400, -111922016, -213010512, -235181664, -256151312, -255803952, --280874208, -242930336, -204622448, -180476144, -117492592, 13542032, 133772128, 232641200, 307534688, 383323680, -426546624, 297359904, 283619232, 184056528, 111552112, 105392592, -6248104, -34780644, -163318272, -313109568, --337186080, -273754240, -211555600, -124652832, -100818448, -102707704, -56598544, -88200912, -35631584, -9789304, -67833640, 128674000, 105763568, 137546320, 147887536, 157692944, 139343232, 185904432, 138229760, 113206744, -58567784, 12033425, -31302796, -143992000, -127455840, -170948832, -226579920, -205357952, -235316432, -241932816, --70449272, 7923141, 123055104, 150504240, 160395024, 186043488, 194426720, 164846752, 143498608, 109957608, -83495240, 30157112, -21370684, -64116344, -115519048, -169909440, -159030832, -142096304, -106151728, -50050864, --21888228, -10467909, -6097243, 15657840, 32884954, 39683888, 42875584, 35240744, 28387050, 30558692, -25065966, 18533858, 34237868, 38134476, 29416768, 13982803, 7261179, 11187316, 14527190, 3441880, --623307, -1331977, -4027069, -6428493, -2675228, -1762547, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ -12924630, -582505, 2175938, 1815161, -5267241, -2720325, 7160784, 12469364, 2010045, 6646999, -2693481, -1263794, -342524, 5630166, -4454418, -10153840, 4110821, 4764730, -5923834, 6877854, 3383897, -6274947, 1984275, 1498407, -2736431, -869194, 328028, 4184909, 377957, -6283537, 277562, --502511, 1361505, -869731, 1121523, 1515587, 3749507, 2726767, 895501, 1178969, 372052, -1844689, -1937567, -3132642, -6969658, 1351304, 1531156, 568546, 5337034, -1886564, 4146791, -1150514, -1658931, -3287798, -2134062, 7480760, 1597191, 4175245, 690953, 1647657, -1440425, -257161, 494995, 2150705, -652298, -2785286, -1514513, -5799280, 637266, 1132798, 4952098, --1594507, 3782793, -661962, 2472828, 41876, 2225867, 1733019, 1031866, -933082, 2559801, -3543348, 2465311, 2311766, -93952, 495532, 565325, -1965484, 807991, 434329, 1708323, -880468, 693637, 907849, 1216013, -705985, 726923, -542240, -89121, 4791036, 4626754, -2111513, 1891933, 2525978, 3058554, 4522601, -1974074, 4692789, 51003, 5014375, -1101659, -8928700, 3033321, 2947421, -6089727, -857920, -1382980, -7924752, 4326106, 3642132, -2503966, --10380399, -4727686, -1565516, 5052492, 6947647, 4382478, -2789045, 1480690, -4457103, 207232, -376347, -3626026, -1812476, -9389872, 764504, -1182727, -3939559, 402653, 530428, -1278827, --308701, 8975945, -2171106, 7309498, 1412507, -5663452, 407485, 541166, 4102231, -1856500, -1154809, 965294, 302795, 5592048, 1931662, 5740761, 4217121, -2963528, 5230734, 2541547, -3815542, 347355, 1236951, -1356673, -2509872, -4750234, -5847061, 6060199, -6074695, -4690641, --5027796, 2792803, 2521683, 1100049, 1083942, 3542811, -2311766, 2661806, -1750199, -2444910, -3869229, -3597572, 584652, 1800128, -3033321, 709207, 417686, -490163, -492311, -287226, -2019708, -691490, 739808, -927713, 1545651, -461172, 855772, -1108638, -8093866, -7525320, -1620813, 150324, -1632088, 4510253, -594316, -784368, 4679367, -5152887, 1008244, -4497905, --2914672, -1623498, 48318, 7648800, 8685498, -4034585, 3402688, -6256694, -599685, -2449205, -8438537, -2495376, -479426, 883690, -11885785, -2066953, -5870147, -1934346, -1457605, 4427575, -5880884, 2410014, 7948911, -1017370, -3620121, -3672734, 4590783, 11930345, 8339753, -4651987, --5440113, 5969468, -5353140, 1021129, 1904818, 9776956, -3596498, -4813585, 1066763, -2984466, -1870995, 2495376, 6215355, -6800007, -4412005, 3996467, 7508677, -683437, -3482682, -4415227, --10611254, 4037806, -17180, 3174518, 498216, 287763, -1666984, 1961190, -2707977, 1695438, -2295123, 2327336, -3765613, 2782602, -688269, -2629594, 256624, -5557688, 3496104, 543850, -445066, -2197413, -758599, -1855963, -3884261, -2932389, 2070174, 213138, 839666, -704375, -275952, -197569, -1108638, -854699, -1620813, 193274, -928787, -671626, -224949, 391379, --284005, 559420, -296353, 1981591, 759136, -1105417, 1332514, 832150, -1523640, -19680614, --6484864, -1042603, 3353833, 2253784, 4891431, -9403831, -2821794, -432718, -9756018, -6972343, -2439005, 5887327, 3449396, 6496675, -843961, 3725884, 8650601, 7633768, 7170448, 4128537, --2785823, -2218351, -4469451, -1986959, -4490925, 9231495, 4280472, -1437203, -4119948, -2516851, --4207458, -6113349, -6599218, -8280160, 4954782, 3547643, -9196062, 2140504, -513249, 6307160, -929860, 3093450, 4061965, -8688182, -1394254, -342524, 1100049, 4522601, 6854231, -2790655, --1052804, -2053531, -5510443, 1650878, 1032940, -601832, -1547799, 5208722, 225486, -2920578, --1041530, 2455111, 3284039, -1378685, -215285, 847719, -4809827, 3491809, -434329, -7157026, -751082, -8729521, 1312649, 6438693, -2230699, -291521, -9844602, -4801237, -7334731, -4438312, --678605, -783295, 4432943, 846645, 5216238, -3209951, 1703491, 2841658, 876173, 2795487, -243203, -1933809, 1009854, -882079, 820876, 52613, 287226, -388695, -1435056, -526134, -1098975, -1323387, 791885, 2209224, 1044751, 548145, -45097, 43487, -579284, -900869, --1556926, 1046898, 1320166, -879931, 827318, -928250, 10799695, 4080219, 1822140, -2691871, -7955890, 3094524, 4495220, 12621298, 13654775, 532576, -2220498, -4831838, -7426536, 2738042, -5395553, -2780991, -555661, 784368, -1301375, -4347044, 5120138, -4995584, 2362769, -14441828, --2087354, -3504157, -3511673, -7128035, -1489817, -908386, 111132, -3644817, -5229123, -4103841, -573915, -2712809, -5546951, 3336116, 4769025, 408022, -4549981, -5090073, 1879048, -3914863, -4497905, -5603859, 3627637, 1331440, -66572, -7992398, -7415798, 1739999, -5372467, 8744553, -1561758, 7341173, -3790309, 7389491, 1439351, 4764193, 1618129, 4515085, -4135517, -5901822, --117038, 9496173, -922344, -6365679, -3381213, 4149475, -2646237, -3630858, 965294, -10160282, -6879464, 8297877, -511101, -7046431, -8908299, -257698, 7502771, 5431523, -4241280, 5769215, -604517, -823560, -1116155, -581431, -477278, 1597728, -2509872, -2162516, 198105, 871878, --1884954, 702227, -880468, -252866, 1995549, -787590, -427349, 333934, -3136937, 1676111, -420907, 299574, 731755, 1007170, -131533, 279173, -612033, -597000, -467615, -350577, -15533286, 3183645, 8539469, -3347927, 6401112, 4764193, 9961103, -7358890, -5244692, -1675574, -593242, 7084549, -3306588, 10749766, -780610, 6114960, 5289252, -2990908, 2187212, 6196027, -5738077, 1476932, 1600412, 5645735, -11623792, 1916092, 9026411, 7050189, -6274411, 7870528, --9263171, 5650030, -8168491, -4122095, -2134599, 8537321, -1729261, 8938901, 1994476, 1931662, -450972, -294205, 3541738, 5248450, 11640435, 1835025, 10046465, -4934381, 7344931, 9669582, --299574, -1728724, -3482145, 3741990, -13805099, -1142461, 1365263, -5167383, -8190503, -456877, --517007, -1103807, 3621194, -8433168, 4271882, 3724811, 5367099, -13299903, 4584878, 3202972, --7859790, -920734, 4341138, 9795210, -12399571, -1533840, 958315, -11721503, -1025423, 1726040, --3246995, 7709467, -1714229, 673236, 2178622, -1347009, -374736, -523449, 1388885, -3032784, -469762, -1572495, 949725, 279173, -1708860, -186831, 2152316, -943819, -405874, 54761, --2456721, -940061, 508417, -950262, -1104344, -354335, 501974, -1372779, -550830, 1734093, -2365990, -3003793, -46171, 491774, -13803488, -16917876, -13545790, -12233141, -420370, 8618389, --17856864, 12711493, 8214125, -20049444, 12620761, 5358509, 4311611, 1992865, 1932198, 4543539, --3161633, -3266323, -6601365, -188979, 7681549, 6511171, 3777961, -11412265, 7791071, -8154533, -209917, -7169911, 8943196, -4738960, -3718905, 2835752, -13443785, 1348620, -4464082, -4007741, --1447941, 969052, 13191992, -6221797, -2039036, -5020280, 10028212, -6102612, -3310883, 3102577, -3002719, 2838974, 3536369, -4162897, 4825933, 1241246, -11035918, 15149423, 6003828, 2451890, -1557999, -72478, -7078643, 8672076, 7239704, 3038153, 9693741, 1038308, 4252018, 9771051, -4948339, 2103997, -6760816, 8050916, -3563212, 15378130, -1707786, 409633, -4230543, -16130823, -2071785, -3912178, -1957431, 8278013, -744640, -8751533, -5027796, 7114614, 5908802, 927713, -6852621, 1816771, -5118528, 2404645, -539018, -1698660, -1462973, 558883, 4028679, -1933272, -447213, 722628, 2238215, 869194, -1918240, 2982318, 371515, 792421, -242666, 769336, -301721, -1170916, 1639067, -1183264, 1335735, 1098438, -944893, 3359738, -533650, 826244, --1222455, -765041, 9861245, 6709276, -1136556, -6189585, 16200617, 25745108, -3397856, -3584687, -12455942, 3019899, 4109210, 3293703, -18547816, 2032056, -11993696, 9583683, 13681618, -3603478, --6610492, 2222646, 8664023, -5215701, 10465762, -4123706, 20200842, -5923834, 3905199, -1007707, -5478231, 14375792, -5440650, 1399086, -1277216, 4143570, -5345087, -2597918, 8185134, 17635672, -1466731, 12904229, -4795868, 1759326, -2441689, 4285304, 9438191, 14064944, 10973641, 10409390, -10838350, 6836514, -1995012, 1646046, -1507534, 243739, 2141041, -7079180, -2046015, 11322071, --9989557, 3942780, -4402342, -2661269, -5201206, -20586316, 2280628, 11110544, 7035694, -2570001, --9766219, -23725400, -3835406, 9604621, -2012192, 3767760, -7403987, 5473399, -6830072, 6218576, -13413183, -5936719, -7283728, -13444858, 4024384, 1614371, 2181844, -10640245, 745714, 20938, --3229279, 566399, 4981089, 175020, 3418257, 1478543, 2207076, 2674691, -489626, 4232691, -1003949, 384400, -908386, -1442572, -1199907, 4027069, 1357210, -196495, 2720862, 1382443, -1959042, -439160, 2249489, 2702071, 3724811, -1627256, 382252, -1588601, -17794050, -13981729, -1735704, 8384850, -8049843, -5126044, 943282, -4191888, -26593364, -22773528, 9879499, 9278203, -1607392, 1446867, -9788767, 15302968, 18396956, 11491185, -9609452, 8994735, 12052752, -1791538, --15466177, -6843494, 21192980, -6218576, 2058363, 1394791, 11875048, -9485435, -17155710, 3809636, -7777649, -4099010, 4952098, 11171210, -5442261, -4148402, -573378, -23757074, -6980933, 8313446, --4603131, -15838766, 2817499, -317291, -5085778, 3275986, -1575179, -15010374, -12883291, -22520124, --18053358, 3617436, 7860864, 849330, -5451924, -7442105, 118648, -5053566, 4760435, -10759967, -303332, -3738232, -3205119, -3569118, -1048509, 4362076, -5007932, -21592948, 3194382, -3008625, -5296769, 6069326, 344671, 4254165, 4967130, 1719598, -1304596, 2767570, -3149285, 1343788, --6831146, -3459059, -3098819, -3593277, 1478543, 6110128, -3192235, 1075352, -7755101, 1020592, --831613, -5564130, 2428267, -1677185, 1379221, 2475512, 1279363, 1183264, 4788352, 1202054, -570694, 1762010, -47782, 811212, 610959, -1237488, -3729105, -579821, -3774203, 1905892, --2885681, 4316979, -15569, 6121402, 2689723, -3437048, -2433099, -1800665, -279710, 8654359, -27779848, 24691230, 19286550, -2054068, 18855444, 6122476, 26316338, 11154567, -543313, 32117766, --6687264, -1675574, -20452098, -5388574, -420907, -14416058, 8626979, 12892955, -4196183, -176631, --11616813, -19907710, -11757473, -15177878, -4439386, -9168681, -2898029, -1442035, 9110699, 2315524, --1911797, -8204998, -2849174, -5477694, 2896419, 214212, -8149701, 4295504, 5385889, 2134062, --6306086, -8258149, 2732673, 7626788, -1112933, -288300, -14622753, 26174068, 4364224, -4982699, --744103, 2317672, 11173894, 9508521, -9880035, 5544266, -3885872, 1182727, -1699196, -2495913, --15002321, -13366475, -17959406, 2699924, -795106, -3799972, 11201275, -3597035, 31706522, -3150359, --1765232, -7845832, -3549254, 4095788, 5406290, 3810710, -325344, 13637595, 9737765, -2053531, --6673843, 1777043, -4007205, -53150, 1219234, -4438849, -1522029, 77309, -1548873, 2107218, --5484137, 3178813, 5973226, -1896228, 3096672, -1915019, -1569811, -2492692, 915902, 3297998, --1506997, 4441533, 767189, 1527935, 6128382, 2613488, -914291, 6457484, 2852932, 4453881, -5794985, 4461934, 409096, -95026, 4264366, -4090420, 38655, 2570538, 1358820, 2951180, -2717641, 1424855, 3513820, -17089674, -23978802, -13571023, 18076980, 13961865, -12192875, -12916040, -19373524, 11450920, -12047920, -16793858, -2621004, 2641942, 1938641, 2161979, -9599789, 9946607, --7140920, 19655918, -3007014, -14155138, 3321620, 4881767, -52613, 1321776, -6083821, -9273908, --442919, 7873749, -4888210, 5949067, -9702868, -26267484, -21098490, 13195213, -16424492, 13008382, -3902515, 1343251, -5463199, 7558606, 2530273, -2266132, -3738232, 3432753, 7981123, -7368017, -22102976, -5771363, 7461432, -6857452, 1980517, -2073396, -8613020, 21097416, -16635482, 22968412, --805306, -11729019, -17486422, 8748848, 3171833, 2698850, 1061931, 9212168, 6346351, 8328479, --18003430, -5676873, 514859, 36507, 4583804, -13877576, -6590628, -4726612, -2309082, -17322140, --3459596, -5974837, -19207630, -1289564, -10877542, 2541010, -5086315, 1190243, 2516851, 8155606, -5021354, -3496104, -503048, -7353521, 3936338, -785979, 3420942, -8588861, 491237, -3624416, -2043868, -7945690, 1540283, 1432372, 418222, -2014340, 2711735, -4806069, 3461207, -7323993, -2718178, -5345087, 2483028, 996969, 3468186, -2939368, 8830453, 3120831, 163209, -5648419, --4344897, -1184874, 5903433, -1564442, -2848100, -3100430, 4051228, 3535295, 41260140, 13748190, --9190693, 21177946, 19744502, -10225243, -13001940, 31846646, -2854543, 6985765, -18902152, 46363636, -1614908, -13018046, 6726993, 2289755, 22515292, 357556, 28435368, -20479478, 425202, -22369800, -1705639, 15660525, 711891, -13725105, 19370302, 10320806, 5687611, 4622459, -6803228, -6586333, -1736777, -9736154, 12665859, -11375758, -15127949, 13269301, 5012227, -17569638, 9468792, 1088237, --12773233, -7207492, -4301410, 6622840, -1554241, -7744900, 9295920, -11397233, -4547834, -3964792, -15589658, -10362682, 7499013, 11930882, 5496485, -7203734, -14695767, 9174050, -12580496, 16810502, --21381958, 27996744, -8399882, -4060355, -4080219, 12683038, -1012539, 4526896, 7556995, 4486094, -10776073, -10736881, -20310900, 1290638, 17072496, -11593190, -5535139, -12115029, -7299297, 3020973, --1299765, -3588445, 7312719, 5202279, 3806952, -2037425, 11202885, 6783901, -5389110, -2928631, -2101850, 444529, 9456444, 5916318, -918049, -3289945, -2575907, 10301479, 824097, -5545340, -6483253, 1808181, 122943, 5348845, 2353642, -1164473, -5807333, 1383516, 6719477, -5306432, --1443109, 7642895, -679679, -1827509, -2151779, 4419522, 716186, -84289, -2253247, -24482924, --3240016, 22750978, -6772090, -13877576, 6058052, -6412386, -1386738, 10423349, -24675124, -14199699, -9305047, 12807056, 17027398, -1017370, -3409667, 7129646, -1819992, -24024436, -16750372, 28700582, --2320356, -24760486, -14650133, -9840307, -8411157, 2527052, 8231842, 663572, -4318053, -12248710, --19205484, 2778307, 2390149, -454193, 15440944, -10421738, -30037928, 12340515, 8655970, -34701188, -20714090, -5430986, -17769890, -14311368, -1447404, 20092930, 4619774, -6361921, -7329362, 5896990, -10316511, -14483167, 11130408, 2036888, 8167954, -6143951, -15420543, 13794898, -77846, 15444166, --47379932, 6233072, 7181186, -6764574, 13019656, 15481746, 44815836, 1500554, -29777546, -13449690, --7858717, -28605020, -28411746, 1698123, -16178068, 437550, -10782515, 10818486, -10968810, -10454487, -18864034, 4884989, -733903, -812823, 11038603, -2121177, -1196685, 6674379, 5210332, -3861713, -3538516, -9908490, -2308008, 3056406, -1985886, -2714956, -4952634, -4967667, -2730526, -6179921, -2509872, -7916162, 1706713, -1178969, 7585986, -1569811, -4041564, -3159485, -4645544, -4687420, --1362578, -3206193, -6026913, -4191351, 4344897, -5692443, -3088082, -10363756, 3240553, 4494684, -10918881, 2706903, -1427003, 589484, -20609400, 3279208, 12723304, 11319923, -18289582, 32553704, -22706418, -10468983, 13582834, -26394722, -5847061, -8861054, 41643468, 26652956, -9907416, -15910169, --19428822, -4342749, 1113470, 7626252, 27941984, 5919002, 4757750, 6019934, 784368, -9234180, -1137093, -1766305, 12885976, 17350058, 22040698, 14314589, 9358734, -2186138, -4049617, 3482145, -19987168, 3142842, 3566970, -20314658, -10292889, 34264712, 13941464, 10294500, 284005, 20528334, -11001022, 43269648, -2391760, 44613972, 3203509, -13845901, 14478335, -12052752, -8975945, -1575179, --8198019, 498753, 8323647, 17858474, 3146601, -3790846, -19505594, 6320581, 1663226, 12911745, --15285252, 4106526, -6721624, 2331630, -19451370, 9925669, -17106854, -2061584, -23302882, -32105418, --5298379, -4993973, 26521960, 7156490, -755377, 4986457, 8324184, 10341744, 1821066, -363462, -506269, -18588618, 5983427, 299037, 17441326, -7012608, -756988, -4606353, 12428025, 2492692, -11365557, -97174, -12985834, 6420439, -569083, 4369593, -9836012, -4465156, 2510945, 2785286, --7271917, 748935, 6916508, 4261682, -6371047, -7194070, 12895102, -12798466, 5499706, -3922916, --10311143, 3354906, 2559801, 3382287, 4525285, -4758824, -428423, 6158446, 680215, 4297115, --1614908, -4865124, -4792647, -10887742, -16693464, 5105643, -19147502, -10201, 23054848, 7271917, -19644644, -22833120, -10597295, 11225434, 2243047, 32730872, -16683800, 19581830, -7463043, -9879499, --24442122, -9449465, -13171054, 16369194, 3754338, -21698712, 27143120, -14046154, -13161927, 2661806, -10530186, -7934415, 18748606, -9111236, -13158706, -6723772, 6174016, -2283312, -3671660, 2054068, -18684182, -12701829, 34262564, -13319230, -524523, 31832686, -6471442, 5613523, -43482784, 1939178, -7675644, -9787157, 19061602, -34812856, -42681236, 16176457, -7645579, 23564874, -17674328, -16601122, -1808181, -5457830, 36122284, -4403415, -1749662, 8072928, -33731600, 1919314, -34086472, -13615583, -1865626, 8126615, -42533600, -18943490, -5304285, -2070711, 13643500, -18206904, 21635898, -8923868, -2347737, -27884538, -1506460, -24636470, 9214852, 5334887, 18243410, 23374286, -8801999, 15330349, -1980517, -5012764, 7742753, 4905390, -7618735, -7615514, -13568339, -478352, -8109972, -8373039, -2811056, -1966021, 11522324, -15585899, -2812667, -9791989, 3774740, 5702106, -5514738, -703301, --8398809, -8265128, 9217537, 15308337, 17101486, 3563749, 1015223, -4590783, 3165928, 2882460, --6599218, -10314364, 3447248, -5410585, -7690676, 11677479, 8005282, 6842957, -10739029, -12244415, --26271242, 21422224, -18779744, -5392332, 17201344, 39302172, -11093901, 32214402, 11571716, 8318815, --14846091, 35689032, 5738613, 16661252, 1708860, -20908974, 7771207, -20995948, -20759188, 13083007, --20678656, -4468914, -4713190, 21163452, 1982664, -7072201, 7021735, 9429601, -4182761, -19912006, --4501663, 15359877, 37317896, 8581882, -20745766, 2324114, -3839701, 8924405, 11454678, 18850612, --8145943, 448287, 12371653, 2823941, -459562, 24857124, 22618372, 26732414, 9396315, 22461068, -3251290, 13469554, -10391673, -1894081, 3160022, -20900384, 1753957, 35316980, -4311611, -7766912, -7613367, -560493, 9678172, -21081846, 28024662, -17516488, -7630010, -4829154, 1600949, 3229279, -3755412, -30660160, 38785164, -8432095, -12184822, -4640176, 32959042, -3802657, 6995428, -26006026, --17879412, 452582, 13813689, 12465069, 21133386, -33774012, -10383083, 32170378, -11419244, 3474092, -27770722, 6484864, 6204081, -1891396, 1113470, -10638097, -658204, 2536715, 8039105, -4871030, -6717329, -12266427, -6678674, 551366, -3281355, -2205466, -28149216, -22039624, 1942936, 14123463, --13215077, -22987738, -9203578, -18909130, 5405217, 679679, -7056095, 17848274, -5054103, 7196218, -8368207, -9965935, -6790344, -1810329, 2332167, -904628, 13711683, -389768, 977105, -6769942, --1369558, -10551124, 63107564, -3704409, 12639552, -526670, -6502581, 1784022, -29207926, -12459700, --8989903, 11353209, 8086887, 14286135, 1620813, -15358266, 16084116, -13043816, 18545668, 13662828, --15034533, -16090558, 1899986, 22708566, -23295902, 9754408, 10714333, -13297219, 5908265, -1715839, -8114267, -1030255, -33955476, 19039054, 11683922, -28597502, 34493420, -18287434, -4406100, -11319923, -27843200, -5519033, -23704462, -39728, 350577, 23028540, 23406498, 1561221, -18059800, 26261578, --4240744, 4648765, -33300492, 26237956, 10696079, 1601486, -19100256, -14454176, -2024540, 9147743, --15343234, -27422830, -11668889, 21715354, 13460428, -3175592, 35228932, 2136209, -5688684, -25352656, -31099322, -28827284, -9277666, 31766652, 10072772, 4161287, -11878269, 4980552, 31333398, 6999186, -13778255, 19862614, -51099912, -11147051, -8423505, -4170413, -21138218, -3690988, -2423435, 31163208, -8523899, 2181307, 15908559, 22297322, 15670188, -10917807, 6048925, 13387950, -2506650, 5242008, -5869073, 7205345, 4733591, 22189412, 12101607, 1493575, -6269579, -9820443, -18956912, 2920041, -193274, 5306969, 6457484, 3133716, 33421824, -4405026, 12216498, 7367480, -8842801, -26209502, --4055523, -9589588, -16210817, -17529910, 3286724, -2731599, -21150030, 272730, 8398809, -1901060, --1834488, 7693360, -5003637, -16127602, -25305410, 802622, -28329604, 26497800, 41407244, 19223736, -23553064, -36156108, -32230508, -25332254, 2415919, 44800804, -8317741, 16643535, 29115046, 14665703, --16121160, 940061, 21246666, -27473832, -22971096, -19712290, 22262426, 15514496, -28816546, -40666360, -55066848, 33957084, -39348344, 17758080, -4647692, 16265578, 1688996, -11926050, -27350352, 24890410, --727997, -20271708, -30350924, 7715909, 7023882, -7692824, 745177, -2841121, -15008763, -6606734, --7935489, 14021994, -26607322, 29251948, -20091320, 1045825, 46021112, -44488344, -10791642, 41929080, -3004330, 9781251, -6288906, -13175886, 13115220, -4919348, -18554796, 2359011, -42246372, 71503688, --7087233, -78959216, 29817274, 77783472, 45880452, -96259880, -28030030, 18143552, 6914898, -14713484, --22223234, 11939472, 29365766, -36266704, -10026601, -63227288, -10925860, 21740050, 7931731, -19375134, --31634582, 12360379, 27683212, -667867, -8558259, -15228343, 22002580, 13011603, 8938364, -1935957, --6657736, 2540473, 12288975, 9475772, -2253784, -25393994, -15776489, 26249230, 11273752, -13657996, --9212705, 18806052, 6311992, -2729452, -38398620, -17692044, -19151260, 21461414, 5905043, 4620311, --3988951, 452582, 20963736, -4356708, -3725884, -18394808, 3629247, -6015102, 29271812, 6116034, --6548752, 3463354, 29552596, -3943854, -19952270, 4591857, 19639274, 45867028, -19213000, 14944876, --24252070, -64328408, 34746824, -16205985, -35156456, -24392730, -35939748, 17241072, 12030740, -48404820, -31118648, -16879222, -1165547, -602906, -24783036, 19145890, 19148574, 16819628, -1529008, 22006876, -11577084, -13372918, 1288490, -27612882, -9920301, -24501714, -16998944, -1223529, 39875012, -33261838, --7014219, -7189239, -29697014, 17437030, -33506650, 17379586, 15184857, -22832046, 18073222, -36688148, -10628433, -31903554, 20782274, -11973295, -16746614, -17506286, -25875568, -7042136, 13188771, 22610318, --26262652, 17584670, 9982578, 27540940, 34029024, 19619948, -28075128, -13136694, -52896280, -13446469, --15277199, 17580374, -61750892, -11790222, -36678484, -3250217, 37033356, 33914136, 22448720, 7847442, -49826988, 54377508, 48583060, -16714402, -21659520, 18355080, 47561932, 87650616, 6463926, 20468204, -10823318, -4767414, 16341814, -15884400, 9689446, -4185446, -102542, -10266046, 16580184, 18954228, --6512244, -15817828, -11809013, 14336601, 6507949, 16267189, -8835285, 6255083, -3115462, -7334194, --4544076, 16151761, 32224066, 15247671, -16520055, 8375186, -5625871, 11400454, 5273683, 5588290, -15827491, -10210211, -21001854, 1657857, 16378321, 12642773, 4506495, -3257733, -7149510, -29131690, -28651190, 7871065, -6589017, -30285426, -6928856, -20841866, 10472204, -10135049, 7466264, 57370564, --33879240, 21373368, 26214332, -12205223, 2467459, 9884330, -3114925, 27758910, 1516124, 20060718, --25731686, -3781182, 22526030, 3565897, -34950832, 22541062, -13916231, -11539503, -13305809, -3615826, --12979391, 13141526, 18622442, 8896488, -3182034, -9890773, 16158741, -5394479, -25676926, 20924006, --43389908, -11089606, -8901857, -9692131, 24823300, 26980448, 48690972, -14419816, 20847234, -920197, -9411884, 31751082, -2302103, 3262028, -21250962, -67168456, 33202782, 6243809, -32341104, -22322556, -3287798, 17373680, -3074660, -19138374, 9859634, -19621022, 25617870, 14136885, -11158862, -23506356, -46427524, 4955319, 2467996, -4410395, 6438693, 3126199, 2026151, -15763604, -32995012, 8968965, --4833986, -11898670, -30411590, -7637526, -905164, 26963804, 11180337, -34328064, 19913616, 3393024, --1308354, -3949759, 11101954, 14079977, -2834142, -6546604, -2438468, -6205154, 5243082, 8301098, --392453, 4691178, 9478993, -3669513, 13692893, 5667746, 4189204, 7042673, -3888019, 17009144, -2873333, -3802657, 11184632, -13724031, 4334696, 7634305, -3243774, -5965173, 15436112, 22123914, --19987168, -3862249, -7067906, -7005629, 7931731, 6739878, -12575664, 6773701, 5531381, 4803921, -5789616, -11421392, 7997229, -1029182, 4694936, -3716757, 3206193, 63839856, 32560148, 64239288, --59319404, 5129265, 30833570, -11959873, 35119948, 67781024, 37195492, 2161442, -18263812, -18833432, -3513820, 29375966, 31457414, 7147363, -78920, -46780784, -9642202, 46133856, 15262703, -12868259, -25479356, -21677236, -30323006, -8329552, -2024540, 35668628, 46585900, 41851236, 15857556, -16225313, --24941948, -46271832, -46010376, 40074728, 16806744, 3284039, 61892628, 3749507, -18951544, -25327960, --25733834, 12517682, 26443040, 21044802, 40598716, 2882997, 29212756, -1915555, -5250598, 14798847, -27047556, 19786378, 17188996, -15428059, -5844377, -12168716, -27435178, -21980568, -39983460, -13383118, -10719701, -6564321, 29088740, 34969088, -569620, 331786, -14317273, -25561498, 5273683, 33790120, --1946694, 18702972, 8203388, -2452963, -10584947, -4866735, 3092913, 11798812, 9199283, -9029095, --18913962, -23381266, -21939766, -8500277, 8915815, -2281702, -13786308, -7052873, -9564892, -8085813, -4529580, -1219234, 12958453, 18538690, 4167729, -22535156, -11579769, -13498545, -3058017, 15210627, -3679713, 3745212, -18423262, -17454210, -19886236, -10210748, 17382270, 11839614, 15007689, 8062191, --7240241, -8974871, 6381248, 5761699, -1534377, 3908420, -7587597, -6115497, 4542465, 3183108, -6285148, -3657702, -7537131, -3480534, -5768678, -1090385, -33910916, -66134444, 26095148, 107843408, -109653200, 92815320, 67252744, -41511932, -47341276, -51159504, -68038184, -104120208, -83875880, -72855528, -33817500, 78255912, 58200564, 125858112, 97275640, 50713900, -18721762, -33934536, -84619984, -66070556, --65416648, -13388487, -40088152, -32566052, 9695889, 17690970, 35639640, 35762584, 49079128, 48673792, -62807992, 36617280, 16100759, -9165460, -10624138, -27668180, -41843720, -50535660, -61763240, -40470940, --75856104, -50557672, -37941740, 37927784, 71951440, 77581072, 53672060, 36550172, 57283052, 43812424, -54974508, 43184824, 15129022, -20452634, -96331288, -68146632, -69452304, -107778984, -67620504, -58540404, --56804164, 20594906, 57084948, 90651728, 74645992, 106577464, 95655368, 93523448, 66672388, -36457828, --32996086, -74947176, -99089192, -109189880, -89558120, -43022688, -12247099, -22676890, 29482266, 78036336, -55006720, 37131604, 62583044, 52578452, 18759344, -12465069, -12555800, -4138738, -15393163, -42106248, --26477400, -30112016, -16299401, -13556527, -31383326, -11688753, 10714870, -10591389, 34605088, 45687176, -50202264, 53104048, 3228742, 15780247, 15439334, -4645007, -72967736, -58252640, -45535780, -40685152, --32058172, -30416958, 33442226, 49999324, 54350664, 52010980, 42861628, 29352880, 26404386, -529355, --7988639, -42276972, -57024280, -51077900, -42633456, -27248346, -17794586, 1903207, 25476672, 51852068, -38766376, 24608016, 17751100, 4735739, -548682, -166430, -10603201, -13758928, -11458436, -13467407, -2892124, -5226975, -18506478, 2125472, 8365523, -3543885, -4925254, -4093104, 1682017, 3077344, --4189204, 799938, 4656282, 1343251, 504659, 18254, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --3324305, -3346317, 2889976, 6421513, -8774618, 1864016, 5806796, 10568304, -1130650, 5942088, -237834, -5392332, 1321776, 8284992, -155693, -2724620, 5610838, 7937637, 7559680, 4425427, 1229971, --3105261, -2411624, 716186, 3863860, -1990181, 1802813, 441308, 4391067, -2152852, -108985, -1056562, -5212480, -3074123, -1523103, -5494337, 1320703, -1579474, -31675, -782221, -4527433, -3495567, 5431523, -1161789, 450972, 455803, -848793, 5704254, -6957310, -66035, 2902861, -727460, 938450, -1722282, -5759015, -1524177, 2264522, 2608119, 2971581, -574989, 120259, --12885, 1189706, -1033477, 6068252, 115964, -512712, -4019016, 556198, -2894808, -2169495, -2330557, 2620467, 6179384, 241055, 6074158, 717796, 605590, 433792, -3300146, 221728, --1212791, -1626719, 602369, 1984275, -1300301, 814433, -1343788, 1580011, -1688996, -482110, --898722, 923955, -583579, 864362, -791348, 1014686, 1678795, 892279, -917512, -205622, --504122, -401579, 432181, 395674, 6939594, 11257109, 1504312, 5604396, -2035815, 3329137, -4342749, -1335735, -3485903, 5902896, 10177462, -1995549, 1127966, 3939022, -4875862, 3034931, -4343823, -8898635, 2501282, 870268, -2004139, 2147, -9269076, 378494, 2594160, -4404489, -813359, 156766, 5934571, 4241817, -2230699, -632971, -565862, -6308233, -4244502, 695248, -2546916, 571768, 2829847, -4167192, 627602, 2083059, 428423, -3857954, -2827699, -854162, -1341104, 3123515, 3227668, 2155537, 3768297, 3691525, -4144107, -1266479, 165893, 5246840, --800475, 3765076, -2477659, -2560874, -795106, -4712653, -2177549, 967441, 2748779, -4022237, -3936338, -1112933, -1177895, -784905, -1597191, -2033667, 812286, 3064459, 1140314, 5114769, --7095823, -5717675, -1261647, 2120640, -77846, -1165010, 1082332, 160524, 1313186, 2159295, -3612604, 66035, -215285, 857383, -337692, -51003, 555125, -1649804, -889058, -3424163, -1351304, 6541772, 9217000, 5365488, -2332704, 3974455, -2429878, -1613297, -7904888, -6270653, -2834142, 6054830, 5900748, 6172405, 1364189, 344134, 3806415, -5076652, 5108864, 4157528, -373125, 3572876, 9138080, 6234145, 1734630, -6562173, 181999, 2221035, 1409286, 1095754, --7211250, 1735704, 1316408, 4831302, 5311801, -1661079, 3408057, -2580202, -2885144, 3884798, -2188823, -6884296, -6534256, -2848637, -3675955, -2719251, -2922188, -7955353, -7217693, -643708, -2592013, -37581, -770947, -5358509, 704912, 6378027, -1797981, -2004676, 2389076, -5369, -4596689, 2323041, 2343442, -2965138, -3679713, 6847252, 3118683, -2731599, 4495220, -593779, -3501472, -2965138, 541703, 5055714, -1930051, -1631014, 3628711, 451508, 1437740, 2172717, --2525441, 2837363, -1194001, 2325188, 2323577, 1811939, -1625645, 594853, -817654, -1366337, --1768990, 101469, 193274, 1144609, 963146, 268435, -106837, 898722, 261993, 625992, --12756590, -7500624, -2357400, 2422362, -5263483, 1607928, -1446867, 3673808, -899796, -7135015, --5687074, 4942971, 4032974, 10218801, 9011915, -1368484, 6517076, -9818832, -1608465, 7635915, -2289755, 1772211, -1017370, -3207804, -1507534, 1056025, -887985, -298500, 3852049, -4816269, -1061931, 1748589, -128312, 3038153, -3322694, -2714956, 1735704, -2112587, 2704219, -5385889, -878858, -3237332, -1286343, -3605625, -2710124, -4095788, -6081674, 3713536, -54761, 6334540, --5945846, -5083631, -58519, 1207423, -713501, -1226750, 401579, 3811247, 1811403, 813359, --2626909, -2526515, -1446330, -4746476, 733903, -1238024, 535797, -234613, -5119064, -440234, --425202, -5412196, 127775, -1031866, 605590, -924492, -6034966, 528818, 2679523, -1209570, -3949223, 1083406, -2148558, 1657857, 4144107, 1355599, 694711, 926639, -908386, 500901, -3235721, -272730, -543313, 1182190, 1313723, 499290, 1053878, 212601, 426276, -2201708, -214748, -194884, -1097364, -806380, -816044, -1134945, 141734, -936840, 4430796, -6810745, -2770254, -7617125, -1333587, 414464, -5653788, 5357435, 4054986, -11330124, -1152662, 1947231, --1053341, -4938139, -6669548, 1409286, -3359201, -5513665, -2740189, 3321084, 2911988, 8093866, -10481331, -880468, 9365176, -5717139, 3679176, 4112968, -840740, 4051228, -2314451, 117038, --621160, -1901060, -1013075, -2132451, 7795903, -409096, -5833103, -1362042, 3896609, 2458869, -3112241, 651761, -2736431, 5733245, 11608223, 752156, 1154809, 708133, -883690, 1867237, --800475, 6668474, -5099737, 6379100, 4383551, -4013110, 2048163, 4161823, 2810519, -4816269, --5264556, -10335302, -1717987, -958315, 1289027, 4023311, -1000191, 2625836, -907312, -2734284, --2769717, 5365488, -1248225, 5689221, -8398272, -3287798, 1895154, -5293547, 1350767, 5720360, -512175, -27917, 389231, 1229971, 753767, -3204046, -1060857, -512712, 436476, -560493, -1014686, 1474248, 721555, -921807, -2195802, 2375654, 877784, 929860, 582505, 695785, -134755, 67646, -1082332, 993748, 425739, 391916, 130997, 1042066, 652835, 1247151, --1485522, -874563, -1737314, -1570884, -464393, 1247151, -1035087, 117038, 3010235, 1332514, -153008, 4044786, 11738682, 13835700, -3592203, -321586, 2917357, -2094870, 8964134, 8744017, --5505611, 8571144, 6741488, 2592550, 3910568, 3490198, 1788317, -757525, 625992, 1145683, --4729833, -5796059, 1520418, -1627793, -70867, 993211, -5116380, 5155035, 10367514, -332860, --6220187, 10126996, 1232119, 300111, 3978750, -1792075, -3041374, 1462436, -3814468, 1508070, -10349261, 4420595, -78920, 3685082, 5622649, 14593225, -2393908, 6286222, -1259499, -6371047, -4168803, 358093, -2119030, 2851858, 8950712, 2275796, 1584306, -156766, 3579318, 12905840, -5790153, 1588064, 1302986, 3374234, -3739306, 6584722, -1716913, -12834436, 1549410, -1408749, -7701950, 9046275, 3919158, -3923453, -3541201, -3354370, -468688, 2783139, 252329, 1868311, -1290638, 1958505, 5777805, 2456721, -4610648, -2046552, 620086, 1547262, 277562, -171799, -154082, -2581275, 2648921, 567473, 520228, 226023, 518617, 180389, 1974074, -882616, -1431298, -1526861, -455803, -2371359, 434865, -958315, -155156, 773094, -15583752, -1796907, --6591164, -7866233, -2035815, -5622112, 304406, 4756677, -7298223, 7558069, -16190416, 2263448, --4765266, -8690866, -11567958, 12070469, 6088116, 735513, -10245108, -6771553, 3881577, -13401909, --9298067, 3125663, 2878165, 13521631, -1719061, 1085016, 10094247, -6023692, 9916543, 3343095, -3661460, -1968706, -5902896, -739808, 8266202, -4478041, 744103, 10284299, -3724811, -3085934, --4952098, -6174016, -5257577, -4015258, -8294119, -1058173, 2551748, -2893734, 1880659, -2768107, --4221953, 5769215, -7399155, 4493073, -6282464, -8010114, 433255, 6534793, 474594, -2005213, -2652142, -5350456, -2636573, -7483981, -13248363, -6306086, 1938641, -4053376, 15234249, 6019934, --10553272, -5363878, -1525250, -3841312, 4924180, 10280541, 6813966, -5000416, 4813048, -5925445, -3604551, 521839, 4825396, -5245229, -1192927, 456340, -2256469, -4472135, -3688840, 690416, --195958, -1040993, 2393908, 899259, 414464, -1475858, 1452773, -286152, -1098975, -3243237, --22012, -1660542, 336081, 1459215, -1018444, -3599183, -367220, -1517197, 16913044, 11003169, -11574400, -3393024, -16451872, -1330903, -8431558, 2089502, 3640522, 8825084, -4163434, 3855270, --6772090, 1127966, -5974837, -15316390, -8260296, 5823439, -5594195, -12142946, -11408507, -10619307, --16559783, 2032056, -5810017, -12619688, -11347304, 1962800, 15914464, -2156074, -2673080, -5352603, --9673877, 1967632, -3858491, 1031866, -12064026, 743566, -12565464, 1726577, -1033477, 6719477, -5214627, 5588826, 2874944, -500901, 4651450, -3105798, 9160628, 2554432, 4633733, 2759517, --3005940, 3241090, 9232569, -1230508, 5155572, -1335735, 14525043, 1847910, 5456219, 687732, --8148090, -6256157, 286689, -2909840, 1879048, -2129767, 4816269, 4272419, 5599027, -2593624, -3195993, -11165841, 5936719, 16276852, -7852811, -1672890, 4338991, -9401147, -633508, 5854578, --3674345, -598074, -1938104, 5092221, -5228049, -1261647, 1433982, -2938831, 1434519, -1026497, -2171106, -2718714, -2687039, 3000572, -1338956, -2984466, 2123861, -1182190, 83752, -4211216, -3235721, 1072668, -675921, -700080, 1854352, 649077, 1799054, 1293322, 341450, -1802813, --3153580, -927176, -8148090, -23716272, -3899294, -8296803, -12445205, 6684043, -23773718, -3117073, --8443369, -4640712, 6891812, -7607461, 10084583, 8645769, 1402307, 7792682, 712428, 4103841, --6184216, -10980084, -12034498, -6777459, -11027865, 8575976, 11299522, -520228, -5927055, 3221762, -3269544, -4190278, 846109, -18855980, -9936944, 8715026, -4782446, 216896, 8603356, -853625, -5327907, 4507568, -2435247, 5163088, -47245, -10071161, 11183021, -7891466, 551903, 577136, --6149320, 4065187, 6672769, -3966939, 7621957, 817118, -580894, -6994354, 8608725, -85899, --6951405, -2343979, -13938779, -5889474, -7952669, -1044214, 9605694, 2733747, -900333, 124554, --9016747, 1996623, 6956237, -9141838, 535797, 13914083, -5729487, 1336272, 1069447, -9947144, --5952825, 6313602, 5326833, -16164646, 3263102, 12036109, -47782, 1410897, 84289, 2879776, --908386, 7588671, -1731409, -343061, 988379, 1436667, -3441880, 850404, 2696166, 802085, -4540318, 1639067, -83215, -1686312, -3551938, -1053878, 1708323, -2230699, 1616518, -2286533, --50466, 3115462, 1699733, -2231236, -2983392, 136902, 118112, 6656126, -2676302, 528818, -3671123, 1459752, 3586835, 42191612, 9388799, -5535139, -8465381, -829466, -2677375, 7467875, --1666984, 6309844, 11965242, -4841502, 601832, -7935489, -5422396, 2527588, -1306744, 6130529, --11828877, -6953015, 5583458, 11833172, 7826504, -391379, 2808909, -2930242, -7123204, 5123359, -9266929, 9690520, 11727945, -9741523, -2300492, -5601174, -12046310, -1553168, 626528, -2671470, -5538361, 7273527, -15569, 3572876, -2160369, -12834436, -6964827, -17154636, -17370458, -5106179, -5822902, -2576444, -7691213, 14524506, 5511517, -630823, -13650480, -662499, -4200478, -9804873, -128849, -4507568, -6320045, -13563507, -1725503, -5036386, -14859513, -44560, 11385958, -7684770, --3613678, 4159676, -6382859, 2502355, -6323266, 9222369, -2950106, -8995809, -13881871, -22871238, -4530654, 3815542, 17471390, 6980933, 6069863, -127238, 5326833, -4150012, 5645198, -561567, -2014340, 2750390, 6694244, 3004330, 310311, -1262184, -287226, 2593624, 1693291, 6873559, -5476620, 3587372, 1232656, -1452236, -3602404, 1952600, 4542465, 357019, 345208, -885837, --3173444, -601832, -415538, -1595044, -1085553, -2541547, 2151242, 3008625, -2787434, -2956548, --87510, -425202, 1678795, 9491878, -33430952, -19048716, 17723182, -4604742, 1139777, -9182640, -7733089, -3167539, -12898324, 6202470, 17916992, 2303713, -15675020, 4428648, -3411815, -3580392, -10317048, 10704132, -1440962, -2169495, 22561464, 5048734, -3241090, -13856638, 6142877, -19876034, --16361678, -15073725, 6123013, -2844342, -1613297, 12970264, 5173825, -13156022, -10997801, 2873870, -12805982, 4392678, -1457068, 737661, 8540006, -6157910, -13899588, 18154290, -5327370, 1893007, -7331509, 1141388, 2519535, 18669150, 329639, 11895449, 542777, -12495670, 1815697, 2679523, --2586107, 2391760, 8497593, -6316287, -1915019, 2177549, -24712704, 6562173, 5058398, -138513, -5935108, 4625680, -9168145, 4349728, 33949568, 14594299, 8389145, 2462090, 8246874, -26099980, --12371116, 13208098, 529355, -121870, -10014253, 8825621, 10684268, 8944806, 1490891, 1873143, --3584687, 141197, -6211060, -2259690, 4900558, -1109712, -3133716, 2543695, 197032, 2440078, --3624953, -1541356, 1210644, -667867, 2468533, -4340065, -1504849, 3074123, -3465502, 2483028, -894964, 308164, 83752, 15032, -2814814, 1383516, 2571612, -1316408, -1319629, -3020973, -1297617, -205085, -22415972, 15753940, 16830366, 5448703, 9277666, -6209449, 26872536, -3142306, -10241350, 7035157, -12416750, -5064840, -5738077, 15647103, -9306120, -2866891, 9826348, 8304856, --9147207, -2449205, -26415660, 4966056, -2944200, -7720204, 2268817, 746251, 1932198, 2459943, -8921184, 398358, 9773735, 1198833, 4755066, -2495376, -8523363, -9035537, 17041356, -6042482, --12371116, -10364293, -4732517, -5686537, 7383049, 4626754, 5681705, 7579544, 2244121, -9314710, -5339718, -15212237, -5009006, -13288092, 9148280, -16045998, -11560978, -3378529, -5435281, 4838281, -10798622, -8562017, 10193568, 16848082, 8329552, 16231218, -6812892, 21776558, 1970853, 18454400, -10427644, 2327872, -9839233, -24668682, -16704202, -13536126, -7722351, -7572564, -2434710, -11469173, -8658654, 14479945, -5568425, -11042361, -10111964, -7960722, -15040439, 9499931, 6838662, -3962107, --3882114, -5805722, 765041, -3275986, 8095477, 53150, 2072322, -4288525, -3710852, -6059125, --1125281, -7263864, -7006703, 7209103, -507880, 906238, 177167, 2661269, -2865280, -242666, --4304094, 172872, 25233, -160524, 2216203, 262530, -3522410, -2287070, -2527588, 734439, --3784940, -4095788, -5204964, 1433982, 12482249, 6362994, -7102266, 21017422, 2376728, -20511690, -25618406, 1719598, -10910291, 9044127, -21038360, -4024921, -13393856, -4179540, -2369748, -4107063, --9572945, 2687039, -18175228, -7027104, -6550899, -24526410, 2984466, -17785460, -12640626, -19953882, -4010426, -15053860, -4540318, -4984310, 169651, 7597261, -6113886, 10692858, 560493, 14187351, --3294777, 12341052, 15551540, -18648212, -270046, 5011153, 11419781, 452582, 13729937, 4602058, -13239237, -270046, -10096931, -6347425, -960999, 8568997, -1959042, -3929895, -847182, 15862925, -10022306, -3761318, -13054553, 4388383, 7191923, 5113159, 14071923, -18821084, -13915694, -3970697, -1341104, -5293011, 165893, -5397164, -11758547, 33042794, -16301548, -18927384, 14150843, 8150238, -12295954, 3776887, 4531728, 2549600, 7196755, -6776922, 18992882, -3310346, 4672388, -3660386, -2558727, 1146756, -1021129, 12105902, 1534377, 1066763, -11907797, 5408975, 1803886, -1743220, --9693741, -987306, -1989107, 264141, -3073049, 8723079, 2036351, 2443300, -6999723, 4802311, --3315715, 983548, 4223564, -167504, -2055679, -2247342, -6226092, 3640522, 6405944, -3031173, --686658, -2247879, 969589, -3617436, -8388071, -2535105, -263604, -5751498, 5989869, -510027, --794032, 2026688, -5635534, -6391448, 2623688, -4400731, -5602785, 16653736, 12264279, 19691888, --6556268, -4876399, -27045410, 31403190, 14394046, -41827612, -22386444, 13401372, 18618146, 18728742, --12031277, -9767293, 22662394, 5373541, 5201206, 15709917, 12700218, -23130010, 7087233, 9743670, --1731946, 10911901, 2099165, -2975339, 2261837, -7534983, 38612292, 10104984, 5029944, -1067299, --4774930, -2602213, -21901648, 4192425, 6437082, -5164698, -7180649, -35464080, -16939352, 7412577, -6182606, -11646341, -11381663, -1617592, -16879758, 6971269, 6267431, -2469606, 7051263, 13966697, -702764, -742493, -4477504, -7487739, -2441152, 1238024, -26132192, -3496640, 6140193, 15916612, --28283434, 6264747, 10139881, -2244657, -13314935, -12041478, 21358872, 21089900, -3087008, -13200582, --25006374, 5244692, 10030896, 5228586, 417149, -27287000, 11503533, 24794310, -8400956, 2778844, -7798050, -10235444, -16289200, -8638790, 2486249, -5080947, -1293322, -7707856, -6616934, -5638755, --2376728, -2239826, 3317862, -628676, -496606, -7030325, 2886218, -3322157, 1504849, 16106, -2263448, 4203163, 4944044, -7854422, 3140695, -6080600, -10166188, -5383742, 1460289, -1072668, -4443681, -1032403, 2894271, 5956046, 301721, -325881, -5270462, -2991982, 7950522, 3981972, --3326452, -2085744, 12441983, -9162776, 3395172, -7635915, -6732898, 1169305, 8434779, 16833588, --31005906, -40464496, -28118078, -36200668, 31436476, -20968568, 12662100, -3545496, -25420838, 4548907, --6891812, -9450539, -33003602, -30245160, -22572738, -8619462, 1193464, -17500382, -5052492, 4622996, -14236206, 1127429, -8825621, 35970, -9438191, 13643500, -17140140, 23721104, 20461224, -4887673, --6480569, -28125594, -16380468, -17103096, 2084133, 3784940, -4557497, 22990960, 6577743, 18638548, -3702262, -2190433, -8424578, 16770774, 11608223, 5269925, -16804596, 9026948, -28439126, -3167539, --2989297, -18888730, -3076270, 249108, 21809308, 14443438, 452582, 10088878, -360777, -21446920, -10976326, 3056943, 17947594, -10116795, -20614770, 12345883, -37077916, -8491687, 13182328, -5548024, --5865852, 9119826, -2374580, -7291781, 6921877, -3066607, -23772644, -20914344, -3417183, 9836549, -15895674, 22328998, 22383222, -9431211, -7541963, 4436165, 8149164, 7345468, 3105261, -9880572, -8781061, 213138, -1788854, 1176821, 5470178, 9111236, -2585034, 1585917, 8628052, -1926830, --105764, -8580808, 4385699, -1818919, -529355, 7195681, -1323387, -3112241, 3274376, -9751723, --3557844, 10072235, 2942590, 3323768, -3449933, -2244121, -1391033, -7745974, -944356, -4272419, -6039261, -16936666, -40449464, -3780645, -25750476, 1571958, -18962818, 17254494, -13540958, -1455457, -3408057, 6429566, 20827908, 6963753, -9412958, 22462678, 7016903, -38289096, 6332930, -22985054, --1603097, 4346507, -3174518, 18862960, -5566815, 3404835, 4816806, 1634772, -12236899, 19142132, --11063836, -1087701, -22388054, -53150, 3842922, -3584150, -7850127, -10327786, -11676942, 29027000, -1204738, 15008763, -25846040, 2876018, -284542, 8838506, 15491410, -17853642, 31659814, 45471356, --2039573, 4333622, -15854335, 7221988, 10635413, -8864276, 2307471, 8498130, 17706540, -657130, -1077500, -5564667, -15335181, -23180476, 11798812, -17411798, -7284265, -11443403, 5046050, 15444702, -13977971, -2872260, 5268315, -31452046, 20735028, -3979287, 4534412, -9330280, 20257750, -28254980, -33574296, 24274082, 27975270, -11441793, -649614, -27713814, -14928769, -10410464, 9074192, 7492571, --22807350, -16913044, 645319, -6002754, -16642461, -257698, -11519639, -13892609, -5119064, -2274722, -1051730, -9273908, 1612223, 2807298, 13817984, 12122545, -1932735, 11406359, -5755793, -14835891, --8075076, -3401614, -7361037, -1411971, -5477694, 7943005, 2476049, 31513786, 4188667, -11283953, --3785477, 2517388, -16654809, -10732586, 3936875, 307090, -4334696, 1289564, -14496, -18547816, --1931662, 11759620, -8990977, 50797116, 14543296, 36935108, 11821897, -38556460, 15507516, 10678899, --12800076, 2581275, 24916180, 1061394, 23849416, 21053392, -24706262, 13572097, -24716464, -16770774, --2314987, 49706192, 15328201, -22518514, 21242372, 13600014, -27356794, -12149389, -1838783, 27788438, -4149475, -25546466, -14297409, -863288, -6942278, 15394773, 22345642, -8135742, 19659676, -12709345, --17064978, -661425, 40460740, 3688840, -23167054, 13131326, -1046898, -2382096, 11358578, -26417270, --22718766, -21690658, 15887621, -14231911, 5157719, 6665789, 24215026, 11879343, 24893630, 2570538, --1021129, 20182588, 37248104, 22028350, -36734320, 685047, 3634079, -6311455, 7157026, 10125385, --28351080, -4365835, 5690832, 4837744, -33776696, -32161252, -17918066, -19577534, 33670396, 12338904, -1630477, 14731201, -27341762, 11220602, 7667591, 4912369, -2346663, -6378564, 23295366, 13844290, --9205189, 3856344, -6919193, 15037217, -4283693, 942208, 3273302, 2120640, 11389180, -1921998, --18252000, -909459, 3539590, 4670240, 9540196, -2709588, 949188, 6908992, -14116484, -8591545, --1210644, -26045756, -3855270, 6995428, -1798518, 2619930, 14930917, -2307471, -10205379, 2007897, -3716757, 9413495, 11613055, -11294690, -6705518, -964757, -9278203, -6369974, -17904108, -21727702, -6105296, 82678, -9534827, -8381629, -9730248, -19330574, 14476187, -38626788, 27954332, 31219044, -8655433, 33997352, -34842924, -17059074, -9424232, -50085224, 28221156, 2811593, 17473538, 22952842, -22468584, 1716913, -696322, 22816476, -3604015, -27134530, -28142236, 17022030, -31798328, 31022548, --8899172, 6783901, 30764850, 27713814, -13948980, 42212548, -24475944, 2710661, -25450902, 4090420, --8693014, 16601659, 5659693, -18090940, 16212428, 24601572, 36191004, -20950314, 7748121, 22181358, --30511984, 1374926, -12258374, -44168368, -18981608, 11747272, -24233816, 8597451, -20343650, -528818, -29726006, -14143327, 12595528, 34203508, 24461450, 9121974, 45536316, -70967352, -13362717, 23635206, --2729989, 13754096, -21962316, -38376068, 46562276, -717796, -23455890, 9998684, 29465624, 73065448, -27689118, -55350316, -30186104, 18786186, 20447266, 8812199, -38626788, -3425237, 8465917, -11996381, -26074746, 9269613, 16641925, 19753628, 14859513, -10208064, 11471321, -30752502, 4404489, 16320876, --1989107, -16358457, 9491878, -10022306, 16251619, 17901424, -7722888, -15073725, -4064650, 33111514, --5975374, -4000762, -13048648, 14905147, -12960064, -8087961, 9558987, -6328098, 31243740, -2524367, --7798050, 31323196, -2864743, 7196218, 19217294, -1628866, -1703491, 1674500, 2803540, -14984067, -6666326, 620086, -21532818, 14392972, -6725382, 27464168, -15079093, 8664560, 2580739, 37442988, --32917704, -2981244, -15734613, -19508278, 30005178, -11678553, 39397200, -3911105, -30403000, 47262356, -68317896, -9756018, -21829172, -33013802, 7836705, 36290864, 7128035, -7660074, -22656490, 5366025, -5332202, -5029407, 5580773, -3249143, -11147588, -11377368, 10439455, 14894410, -1171989, 20138028, --19471234, 41326712, 31128850, 17928268, -1538672, 2418067, 5855114, -21929030, -19192062, -21261162, --11191074, -5862094, 13209172, 11586748, 22399866, -10894721, -2721399, -9664750, 25485262, 49776524, --11815455, -32129040, -20691004, -1378685, -43453256, 33669324, -59005872, 16925930, 24930674, 25577068, --25752624, 5902896, 25959856, -59794536, -28281822, 12147778, -6379100, -30027726, -26471494, -3541201, --13903346, 44267692, 18973554, -16394964, -15033996, -24790014, 67938864, 14469745, 35458176, -2707440, -10303090, 12692165, 15174119, -22420266, -2927557, 28063854, 19388020, 11457899, -9416179, -12322798, --83752, 8593693, 12937515, 8612483, -17641042, 2266669, 86436, 4293894, 12542378, 12414066, --18478024, 8276402, -11432666, -14186814, 1345935, 14058502, 5723581, -8988830, 1854889, -1597728, --2753074, -7771744, 27026618, -8442295, -62814, -16681116, 3672734, -6467147, 17758080, 5313412, --3992709, -10077604, 10020159, 7922067, -12671227, 312459, -20527260, -8594766, 4628364, 7771207, -11290932, -758599, -25681220, 7734699, 39410084, 1304060, -13455059, 33083596, 23506892, -6737193, --21288006, -31996432, 6028524, 63225676, 13766981, 32468342, -2951180, 2930778, -2666638, -7316477, --118112, 3002182, 15167140, 5157719, -12389370, 10612327, -10864120, -11700565, -13492640, 440771, -12524662, 2856690, 9980430, 10976863, 8627516, -8766028, -15822123, 5078799, -11018739, -27027156, --8211441, 6272800, -9647033, 31826782, -32912872, 26757110, -8640937, 317291, 39217884, -6064494, --1286880, 51604568, -8122320, -20834350, 3562675, -17834852, -4304094, -16831976, 57111252, -16100222, -13591424, -13657996, -6426345, -7738994, 9270150, -14310294, -35415228, 15640660, -4301410, -38873212, -20132122, -10094784, 21430276, 49104896, -24826522, -401043, -2806224, -7118909, -26699128, -4475356, -23887534, 9840307, 14540075, -22091164, 6294275, 4093641, -21790516, -5698885, 4476967, 11206107, -13475997, 1294933, 2320356, 9160628, -2469069, -10526428, 15226196, -5972152, -5038534, 14313515, -1584306, -3736085, 20746302, -1241246, -1937030, 344134, 6540699, -6160057, 10295037, -8046085, --4464619, -6322729, 5185100, -6979, -1130650, 3228742, 9426916, -11468100, 2163053, -1395864, -6658273, 2258616, -2609730, 12181064, -7688529, 6649683, -2441152, 3722126, 459562, 9160628, --13980119, 40265, 65739308, 33405182, 68971272, -38569880, -10020696, 22825604, -21573084, 16539919, -70950176, 16891570, 10260677, -18645526, -17644800, 20414516, -10750840, 28834262, -4720169, -6471979, --8341900, -40686764, 9823127, 49148920, -25905632, 29765198, 25873420, -16495359, -4999342, 20518132, --32588064, 16372952, -2304787, 24693914, 8329016, -20277614, -6564858, -40904732, -21032454, 19338628, -14471892, 31982474, 49737868, 5417028, 793495, -42960948, -26312044, -25612500, -21176874, 11380590, --17568564, -4925254, -4034048, 12998182, -32895154, -5214091, 17035988, 8889509, 27123256, -3536906, --12991739, 27073326, -4890357, 16629040, -20780662, -12451647, -3220152, -6851547, 13226889, 19717122, -27740656, 7923141, 2277943, -19082002, -5405753, -9756555, 23224498, 333934, 34809636, 6128382, -26214332, -25442312, -9165460, -111669, -646393, 19059454, -3044595, -9381282, -5163625, 4725001, -1289027, 4995584, 8752070, 7907035, -4857608, -5631239, 326418, -3313031, 7368554, 7954280, -1814087, -6578816, 245887, -8642011, -3682935, -1868848, 14921790, 5395016, -2004139, 3926137, --10071698, -11809013, -8062191, 3770445, 8157217, -7031935, -759672, 138513, 6062347, 3417720, --1004486, 6538551, 953483, -329639, -6519761, 3097745, 1813550, -2632815, -18079664, -67524936, -1752347, 108659992, 97988608, 92165168, 39050916, -39142184, -54268524, -53801444, -48118668, -88320096, --63079648, -61475476, 47531328, 73056856, 59576028, 95081984, 79076792, 16786880, -3704946, -34017752, --66315904, -39555040, -69683160, -37821484, -23352810, 384400, -9350681, 17483738, 29851634, 50814832, -31916976, 53389664, 40582608, 42422464, 3244311, -34907348, -15963857, 1229434, -38211788, -50378892, --65593816, -64403572, -45761264, -6416681, 31907848, 12654047, 46452220, 32930588, 52988084, 47267188, -51376936, 59711320, 32040456, -4565014, -9720585, -38954280, -31981400, -105214352, -84272088, -67448704, --52822728, 6162741, -23112292, 1515050, 71785008, 88787712, 121346248, 76819784, 46072116, 31439160, -7233262, -46508052, -42750492, -64845952, -83967144, -71009232, -66367984, -31074088, 4648765, 33590404, -55068460, 54523000, 46261092, 29273960, 31002684, 13387950, 8255464, -1484448, -25905096, -22432614, --20644298, -22826678, -12303471, -25514254, -18409840, 6337224, 2033130, -14825690, 7912941, 21053930, -11791833, 24020142, 37248640, 38939784, 17005386, -24040006, -10578504, -3348464, -49256832, -51750060, --45331232, -18820010, 13822279, 22193706, 18297098, 31113816, 34957276, 43404404, 28573880, 17772038, --6861747, -29052770, -29781840, -32909114, -44574244, -31455266, -17709760, 15184857, 23820426, 15628312, -9210020, 28147068, 18712636, 11580306, 2381559, -4144107, -9283572, 970663, -11103027, -12775917, --5059472, 4378719, -7834021, -5544803, 814970, 5854578, 321586, -2796561, -4303021, 4425964, --463320, -1953673, -4393752, 1906429, 1319629, 2702071, -1252520, 1613297, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ -1097901, --1261647, 4443144, 4995047, 2682744, -1933272, -7547868, -6924024, 2508798, 3972308, -1468342, -7419019, -1438814, 4425427, -5273683, -4651987, 2025614, 181462, -1371168, 1959042, 4809290, --2097555, 664646, -2753611, -278099, 252866, 1968706, 1832340, 2467996, 406411, 1467805, -5493263, -2124935, -2575370, -2780455, -4983236, 1428614, -1050656, 9104257, 1767379, -689879, -713501, 5521718, -513785, -1209033, -1412507, -3245922, -597537, 4244502, -656593, 1757715, -4293894, -1353452, -312459, -6916508, -4065724, -6307697, -1236414, -1836099, 927713, 338229, -905164, 2242510, -1514513, 1080721, 67109, 550830, 957241, -2306398, 2172180, -751082, --2623688, -339302, -2645700, -811749, 243739, -4124779, 1087701, 179315, 3170760, 326418, --58519, -1899449, 421444, 3156801, 1543504, -796180, 348966, 695785, 766115, 2405719, -285078, 142271, -586800, -371515, 238908, 86973, -251256, 1584843, 865436, 937914, -670015, 488016, 201327, 471910, 5119064, 12112345, 4767951, 2874944, 3352222, -7099044, --846109, 3080029, -973347, 1211718, -6497749, 6389301, 8629663, 1501628, 3849365, -1808181, --5071820, -7830263, -8595840, -5697274, 6795175, -6412923, -4092567, -5425618, 1733019, 4532264, -843424, 623307, 2517388, -245350, 1586454, 5582384, -792958, 4642860, -4422743, 4236985, -2930778, 2697776, -2334852, -7196218, -1544041, 4136054, 2433099, -2004139, -251256, 1437203, --315143, -3467649, -739271, 2958159, -1022202, 336081, -1728188, -371515, 204011, 994285, -5079336, 2137283, -2618320, 448824, 411243, -1719598, 918049, -2508798, -304943, 4137127, -1333587, 4640712, -3318936, -2831994, -1708860, -724239, 2347737, 5259188, -3039226, -3791383, -4510253, -417149, -97174, 164283, 1549946, 1125281, 3789235, -1061931, 1760937, -2309082, --2179696, 178241, 1016834, -152471, 67646, 879931, 940598, 734439, -1966021, 2207613, --461172, 3546569, 1509144, -3982509, -3751654, -4267587, -664109, -3483755, -7330973, -6988449, -7218767, -158377, 1524713, -54224, 4399657, -6499896, 9663676, 8576513, 450435, 457414, -19327, 255014, -947577, 3358665, 2619393, 212601, -5490579, 2382633, -1699196, 2643552, --760209, 5857262, -1358283, -3408594, -1538672, -919123, 2176475, -36507, 3628174, -5815386, -3141769, 1014149, -3221762, 9152038, -1447404, -1310502, -186294, -142808, -2406792, -779000, -4890894, 3998615, -8571144, -4046396, 4366908, 1255741, -2045478, 7463043, 279173, 1672890, -7354595, 3034395, 5775121, 1629940, -2209224, -2996277, -5765994, -5593121, 819265, 2976949, -7157563, 272730, -2909304, -3648575, 1250909, -67109, -1990717, 2320893, -799401, -1835025, -1680406, 3875671, 1263257, -1943473, 1949915, 2018635, 2538326, 1624035, 135291, 241592, --2393908, -504659, -25770, 1230508, 1044751, 1974074, 1916629, 1585917, 609885, -155693, --9784472, -3417183, -4757750, 4440996, -3248069, 2882997, -3512747, -1459752, 8306467, 4052839, --5506148, 2508798, 7922604, 1155346, -2771865, -5565741, -6675990, -4584878, -6713034, 4454418, -1017907, 2448668, -1285806, -3045132, -3204046, -5922223, 310848, -188442, 1408749, -1447941, --5378373, 82678, 5750425, -1278827, 68719, -2869038, -5729487, -8485782, -727997, 6107444, -2223183, 638876, -2874407, 777926, -4600447, -1511829, -3461207, 436476, 783295, -5244692, -5916855, -3335042, 7528541, 2843268, 716186, -3424163, -1794760, 1930588, -430570, 1826435, -4041564, 817654, 1603633, -4476430, 2641405, -2252174, 6920266, 8566849, 3932043, 5756330, -2681670, -882079, -6011344, -3885335, 496069, 4427575, 4465692, -3575560, 469225, 4207458, --5505611, 5434744, 348966, -2792266, 1792612, -1173600, -263604, -3105261, 609349, 877247, -535797, -2491618, 659814, -1761474, -2335925, -818191, 165893, 1029182, -1524177, 374736, --660888, -2167348, 231928, 1782948, 748398, -1552094, 1003412, -1168231, 3275986, -7900593, -1037772, -8448201, -37581, 1298691, 785979, 3816079, 382252, 609885, 14949171, -1869385, --6602976, -7115150, 7509214, 5037460, -5665062, 1376537, -6317897, -2700461, 212064, 7158637, --8864812, 2593087, -345208, 1422171, -674847, 9087614, -4693326, 2570001, -1418413, -2392834, -1382443, -425202, 2724620, -2767033, -2576444, -7670275, 1207960, -2538863, -1649804, 621160, --2716030, 2279017, -4329327, -2565169, -7619809, -215822, -6764574, -2842732, -8046085, 5997922, -1221918, -2453500, 5267241, -6084895, -22549, -11609297, -616865, 4038343, -307627, 3465502, -7408819, -2576981, -1030792, 9278740, 3918621, 3596498, 5665599, -2902861, -8543227, -883690, --5108864, 3764539, 8540006, -1508607, 2517388, 4564477, 3835943, -425202, -697932, 1085553, -183610, -1545651, 2318209, 2090039, -3527242, 1214402, 3022583, -1472100, -1056025, -5237713, --1196148, -2181844, -700080, -2264522, 494995, -519154, 445603, -197032, 393526, 1402844, --1517197, 593779, -600222, -1540283, -173946, -223875, -439697, 164819, 946503, 1544041, --1428077, 566399, -1200443, 271657, -97174, -1603633, -607738, -1076426, 4223027, 4776004, -1727114, -2874944, 2066416, 1255204, 9092983, -1377074, -1955821, -12259447, -3469260, 9233643, -9004399, 5803575, 4562329, 13140452, 807454, -15670188, -4024921, -2602213, -3803194, 8370892, --1330903, -3030100, 9740986, 1534377, -4024384, -1384053, 3885335, -3448859, -1372779, 1200443, --1251983, -5451924, -2483565, -246424, -5285494, -2408403, -2223183, 3695819, -2484639, 7109782, -6895570, 681289, 6558952, 4616553, -2971581, -999117, -2257005, -10180683, 1140314, 2115808, --9701257, -1380832, -2754148, 3484292, 8853538, 1361505, -8989367, 1333051, -3468723, -6041409, -4897874, -1402844, -6439767, 2933463, 2473364, 7128572, -571768, -864362, 5236639, 6214281, -6811818, -6978785, 4937602, -873489, -1191317, 1860795, 7354058, -306553, -1967095, 2352032, -1118302, -6213744, -825707, 8594766, 1887638, -521302, -1077500, -3837553, 2757906, -1388348, --1760937, 325344, -256624, 2018635, -132607, -2621541, -1909650, 3609383, -445066, 1450625, --1612760, 1770600, -1331977, -948114, -1317481, 947040, 1902671, 6259915, -16042240, 6675453, --1748052, -3659312, -3292629, 2753074, -1519882, -9512816, -10129680, 1239098, 15810848, 4358318, --11494943, 2597382, 9383967, -6744710, 1222455, -1701344, 5597953, -33286, 5166309, 13830332, -10074920, 6289980, -229244, -1139240, -6385543, -6843494, 2731599, -17909476, -2826625, 8496519, -956704, -900869, -8573292, -3054259, -359167, -383863, -4162897, -8865886, 9947144, -3430605, --2173254, -1597728, -8212515, -9238475, -284005, -4505958, 648003, 4405563, 3375308, 3729105, --7330436, -1901060, -3598646, -2288681, 11806328, -1240709, -5382131, 383326, 15138686, -8069707, -2549063, 11143293, 352724, -2554432, -5609764, 3393561, 648540, 8026220, -4310000, 6791954, -5515275, 10512469, 5091684, 7874286, 839666, -5150740, 1113470, -209380, -2967823, 4759361, -6778532, -5615670, 3702262, 2029372, -5046050, 665720, 1800128, 1418950, 1842004, -2884071, -1644436, -3161633, -948651, -873489, 227633, 593779, 1366873, 1732482, -352187, 2594697, --187368, -1155883, 904091, 1727114, -579821, 1048509, -2697776, 1074816, 9222369, 13238700, -8085276, 1350767, -2843268, -4953708, -10998874, -3182034, 7249368, -14955613, -6142340, 13626321, --18886044, -3415573, 10546829, 13255343, -1371168, -13310641, 1833951, -5093295, 17792438, 7893076, --12241194, -7873749, -1893544, -7548405, -15402826, -7703561, -6841883, -5574331, -12476343, 6266358, -2199560, 7693360, -4758287, -2305861, -10976863, -1128503, -9526237, 985695, -6337224, 1394791, -3313567, -14694694, -4836670, -5598490, -3911642, 3158949, 3123515, -4696547, 14467597, -945967, --3798899, -2724083, 1386201, -3406983, -1207960, 5379984, 4578435, 6023692, 7934415, 7532299, -585726, 4937065, -2423435, 11288248, 12073153, -6085969, -3171833, 7407745, -223338, -18336290, -832687, -9316321, 5672041, 5788006, 10354629, -7872138, 4402342, -11042898, -1082332, 6297496, --2703682, 9841381, -2575370, -1207960, 1969243, 638340, 1373853, -659814, 571768, 4181151, --3112241, -800475, 4019553, -626528, 3155190, -4719096, -4102768, 2767033, -664646, 863825, -433255, -567473, 721018, -2824478, -741419, -494458, -1230508, -1910187, -666257, 1493038, -1794760, -92342, -10160819, -12294881, -6022081, -11878269, -16950088, 11992086, 1185948, 6710350, --9367861, -9747428, -13442711, -9094056, 4149475, -9970230, -8952859, 12193949, -3053722, 573378, -2948495, 6965900, -5417028, -4109210, 2011118, -3291019, 1905355, -621160, -6020471, -11523934, --18037788, 5957657, -12956306, -11883101, 624381, -3134789, -833224, -6691022, 3023120, 3433290, --14703821, -326418, -3229279, -5761162, -8175470, 4642323, 993748, 14688251, 1752347, -8252780, --513249, 1357747, 6060736, 2529736, 13030394, -1127429, -14179835, 6060736, -3009162, 6396280, --8478802, 1840394, 4811437, -25080998, -11909407, 8854612, -770410, -2700461, 3850975, -1285269, -15833397, -566936, 10027675, 8704288, -12834436, -14904610, 867047, -16510928, -379568, -824634, -333934, 2389076, 10342281, -372052, -6495065, 5919539, 7782481, -7274064, 1275068, 2330020, -7828652, -3836480, 274878, -3890167, 2647847, -224949, 1657857, 2593087, 4218195, 4258997, --129386, -4112431, 183610, 3025268, 952946, 626528, -3747896, 397821, -3753802, -560493, -2032056, -613107, 3688303, 2728915, -157840, 770410, 2986613, -2782065, 5267241, -118648, --2309082, 2355790, 8559870, 35158604, -8695698, -23583128, -2152852, -10304163, 25499220, 1992865, -14262513, 7750269, -4498442, -11282342, -5114769, -12294344, -3213709, 17214766, -19205484, 831076, --15676631, 4262218, 1255204, 7653632, 1721745, -7478612, -12712566, -14747307, -2783676, -14467060, --11384885, 1874753, 3332358, 10790568, -10115185, -20985748, -4440460, -7275138, 2481954, -9856950, --6709276, 3046743, -5294084, -8338142, -606127, 930934, -4308926, 20487530, -4231617, -3340948, -5136781, 5366562, -6106370, -2562485, 15113990, 12721693, 8308614, 15992848, 12482249, 44560, -5214091, 9094056, -6771553, -6324340, 1843615, 6558952, 10606422, 4376572, 21544092, 2384781, -14443438, -4078072, -8359617, -5359583, 30586072, 5456756, -3978214, -3670050, -10991895, -10493679, --7577396, -7352447, -8798777, 3533684, 7049652, -7473243, 2408940, 7625715, 3779571, -6898791, -1403917, 7778186, -1941325, 4313221, -3872987, -1069447, 1737851, -1297080, -869194, -2310156, --4946729, -755377, -4480188, 2391223, 3753265, 1930051, -3735011, 4980015, 3225521, -2732136, --3263102, -5051419, -1505386, -1384053, 1336809, -1091459, 2363843, 1772748, 443992, -478352, -89121, -4026532, 1690607, 6812355, -30944702, -11268920, 15279346, -3518652, -15878494, -14592688, --5120138, 16877074, 8762807, -13286481, 7306813, -17734456, -7480760, -2004139, -11887396, -15917149, -13370770, 7563975, -14442364, -4904316, 30726196, 7302518, -13759465, -18648748, 264141, 10244571, -1666447, 1862942, -21562346, -511101, -2471217, -15336254, -9043591, -6119255, -12403329, -5749888, -3570729, 590558, -13086765, -12960601, 1657321, 8315057, -224412, 11106785, 18422726, -12859669, -11416023, 8710731, 3629247, 2580202, 13889924, 4422206, 8565239, 5817533, 7720204, -2514703, --1671279, 15939161, 24795920, 4186519, -5766531, 3118683, -3564286, -9315247, 15782394, -7637526, --13298292, -20956756, -7225746, -24432996, 12257300, -9923522, -4225711, -1359357, -3520800, -8741332, --1462436, 9824201, -11150809, -919123, 5157719, -3141232, -10872173, 5527623, 901406, 3103114, --711891, -1227824, -3879966, -363998, -2004676, 5895380, 1549410, 1676648, 963146, 1970316, -95563, 3034931, 2030446, 5234492, -7219303, -784905, 616865, 4862977, -1962263, 4064113, --4342749, 1574642, 1087164, -877784, -2392834, 4262755, -1886028, -263067, 2441689, 817118, -261456, -5805185, -13565117, 11527692, 6928319, -2055679, 7719667, 5714454, 16422881, 12638478, --26656714, -8862128, 29672318, -23380192, -6886980, -14168023, 21150566, 9400610, 9758166, 4093104, -3118683, 8450885, 22437446, 10661183, -9848897, -202400, 765578, -634581, 8897025, 9968619, -1236951, 5896990, 5667210, -5149129, 6969122, 4167192, 13874892, -6655052, -13295608, -11443940, --8888435, 2635499, -1135482, 5286031, 6030671, 6036040, 12222403, -5350456, 2598992, -5392869, --9486509, -3853660, 1035624, -10964515, 14031658, 16949552, -18396418, 6277095, -12736726, 10420664, --2062121, 4050154, -1376000, -10198937, -2462090, 11727945, -9154186, -2825015, 2097018, -18808736, --7169374, 3939022, -14529874, -1012002, 23293218, 11573863, -1553168, -5329518, 18588618, 4876399, -13390097, -4208531, -5989332, 19390704, -6571300, 6051609, 2592013, 2753074, -3985193, -2927020, --3562139, -2472291, -6519761, -4032974, -4541928, 650688, 4202626, -1547799, -9160628, -2947958, --1260036, 1032940, -277025, -2285460, 42950, 2583423, 4478577, -3576097, -106837, -9888088, -1675037, -1235877, -1866700, 6665789, -117038, -646393, -3935264, 4075924, 1120450, 6037114, --2063732, -357019, -4051228, -447213, 18521510, -1506997, -4325569, -15394773, 652835, 1467805, --4153770, -325881, -7161321, 2708514, -22139482, 20195474, -4100620, -7141994, -14021458, -15804943, --1655173, 19266686, -3515431, 5342940, -11926587, -6871948, -3345780, -11583527, -14010183, 12790949, --7925289, -6432788, 11310796, 11026792, -15611132, 5436355, 5870684, 13502840, 11125039, -4068408, --9889699, -6219650, -15181099, 16680579, 10945187, 5539971, 11870753, -12314745, 8410083, -1785096, -7707319, 8571144, -8091719, -634581, 27118424, 22754200, -17226040, 6890738, 14067092, -10828149, -3330210, -25365540, 7575249, -13724031, 11320997, -7961796, -8795019, -6199786, 30258044, 1731946, --8846559, 2686502, 10160819, 1339493, 6034966, -16317654, -1880659, 27197344, -915902, -10681047, --16655883, 514322, -12334609, 7686918, 7822746, 9506373, -17011292, -17743584, -4758287, 2987150, -5814312, 1852742, 70867, 435402, 6446746, -4353486, -1767379, -1348083, -2881386, 3187403, -2680060, -5427228, -3759170, -8337069, 5077188, -3058017, 2206540, 3651259, 5345624, 4267587, -1821066, 8375723, 510564, -1952063, 3989488, -6223945, 3454764, 2410551, 1682017, 5543729, -5918465, 1100049, -845572, 3503083, 377420, -537945, -6575058, -8588861, -1648194, -663036, --1087701, -16742856, -868657, -1991791, 4880157, -24310588, -11260331, -13619878, 11486890, -5768141, -17092896, 10424959, 21763136, -10776610, -913754, -17056388, 14504641, 26466126, -8246874, -20946018, -2043868, -4242891, 32416266, -7939247, -12734578, 12412455, 6802155, 5228049, 12202539, 4212289, --40770512, 205622, -2747169, 15976205, 28619514, -26985816, 1060320, 8174397, -12983686, -2566780, --36968932, -8303783, 18838264, -30351998, -18211736, -9271224, -11911018, 12191802, -7377680, -10772315, -16279537, 5018133, 5931350, 16858284, 1840394, -5713380, 11939472, 17686676, -17149268, -12706661, -26209502, 18095770, 6077379, 8396661, 6188511, -11733314, -17044578, 46708, 219580, -3435974, -5361730, -10245644, 7315940, -14215805, 5789079, 33410014, -15524696, -12753369, 18332532, 5354214, --6249178, 11672110, 16112570, 12050068, 14238890, 7128035, -7243463, 5946919, -17581448, 9468792, -3980361, 5039608, -8922258, -2591476, 1864553, -757525, -1783485, -2603824, 5769215, 11367168, --4414153, -10835129, 6919193, 13135621, 6820408, 5211943, -15465640, 9441412, 1005022, 5143224, --2480344, -5218922, -1235877, 7971996, 719407, -1382443, -6673306, -471910, -3891240, -1845225, --3084324, 3590593, 7460895, -4411469, 295279, 4786741, -1844152, -742493, -4076461, 821413, --2731599, -2965675, 9670656, 8733279, 14242112, -32988570, -60928408, -28082644, -4271345, 20737712, -1468342, 22868554, 21125334, -6389838, 3424163, -5175436, -11587822, -19051402, -11087458, -13752485, --7998840, 21725018, -28238336, -4909685, -23535348, -29190746, -5112085, -29460254, -23703388, 2902324, --6201396, -3400004, 5360656, 25853556, 1804960, -18762028, 1069447, -2250563, -5645198, -24363738, --1597191, 29041496, 2686502, -495532, 11766600, 22561464, 15187541, 3946001, -9188009, 7866770, --7718056, -20679730, -37922952, 36074504, -4566624, 30051350, -2530273, 399969, -10799158, -17364552, -31679142, -18000744, -14626511, -1520955, -23082228, -21686364, 18031346, 13224204, 6940667, -2301566, -9185861, -16013786, 6231461, -12995497, -18344880, -20022600, -15614890, -6438156, 15515032, 987843, -5576478, -9262634, 5494337, -12119324, 8833137, 6860674, 6293738, -3946538, -497679, 7817378, --2118493, -9453223, -7124277, -9357123, -799401, -6905234, -1588601, -2423435, -2505040, 2767570, -1147293, -3710852, 1619203, 4923107, -1277753, -3118146, -7314866, -47782, -5018670, -680215, --795106, -3471944, 8587787, -8027831, -7507603, -3543348, 4575751, -7104413, -7137699, 1040993, --5959804, -27380, -1031866, 3370476, -743029, 1145146, -4796405, 1972464, -9982578, -5036386, --1467805, -21164526, -15495705, -23486492, -242129, -22465364, -26086558, -4413616, -11917461, -28652264, --39670464, 4494684, -15010374, 7315940, -2858301, 14875619, 33423972, 1688459, 3463891, -16959216, --18142478, 15108084, 8449274, -12283070, 74088, 9853192, -22597434, -17393544, -1207423, 28680718, --24647744, 320512, 609885, 13198971, -21046950, 21949430, 11552925, 6213744, -548682, -9155260, --24424942, -258235, -5822902, 8833137, -13239774, -32455458, 26767846, -19559282, -8682813, -1372779, -26197690, -19908248, 9214852, -16354162, 10167261, -5929739, -24021752, 11502459, -30616674, -6774237, --8756365, 10703595, 25174950, -14546517, 9351218, 25458956, -20341502, 3360812, 6201933, 5979132, -7577396, -37153076, -11069204, -6292127, 13429826, 2808372, -1074, 6784438, -6470905, 14826227, --2641405, 3375844, -14221174, 12374338, 3245385, -22900228, -10378252, 10784663, 13569949, -1910724, --3356517, -8957154, 12724914, 1596654, 292058, -23818278, 3974992, -11457362, -17942762, -5453535, --3539053, -2320356, -10513006, -13662291, 5012764, -3142842, -6620155, 3936875, -1267552, -1952600, -908386, -3652870, 1415192, 7379828, -13774497, 1410360, 2734821, -4567161, 10136123, 9336185, -10736344, 4275103, 6532109, -6674379, 2911451, 361314, 3177202, -3024731, 272194, -186294, -4576288, -2682744, -6071473, 43771084, 4236449, 18607946, 49758268, -23159000, -13325136, -19375672, --7500624, 23212688, 1309965, 28543816, 7420093, -847182, -10788958, 21608518, -13561359, 5046587, --9130027, 9017284, -14354854, 16500191, -8156680, -3652333, -9537512, 12720083, 8404714, -13676786, --3495030, 13381507, 3793530, -8728447, 682900, -11271068, -37734508, 16422344, -19922206, -28722594, -17638894, 8043400, 19093278, -1680406, -18995566, -6901476, -5233955, 11330661, 14774151, 16771310, -27578522, 27523224, -12359842, 3896072, -29207926, 408022, -21321292, -37629820, -3912715, -30661234, -9783936, -24467354, -16375637, -16171626, -23243826, 2382633, -5659693, 2037962, -7054484, -2816425, --2204392, -39818104, 6184753, 6154688, 8917426, 19245212, -3805341, -31646930, 18194018, -20469278, -11697343, 11791833, 25740812, -13992467, -13059922, -8449811, -5199058, -18351322, 7231115, 4326643, -2183991, -4342212, 6381248, -9129490, 9206799, -1466195, 1813013, 2836826, -11500312, 8590, -4345433, 11335492, -3067144, -6717329, 4846334, 7871065, 9565966, -5971615, -16106, 5471252, --734439, -978179, -3659849, -7104950, 4992900, -74088, 3169686, -3942780, -615791, 6646462, --4420058, -6681359, -3921842, 1120987, -2920578, -11787001, 19014894, -4784594, -3966402, 1709397, -3612068, -3132105, 3470871, 4625680, -1901597, -470836, -2617246, -3830037, 31152472, 58289148, --31998580, -25845502, -45173928, -91829088, -22741852, -9621800, 20497732, 12404402, -7974144, -17723182, -25060598, 30662308, 2624762, -1484448, 141734, -24228448, -14318884, -17184164, -13228499, -25628070, --381715, -6475737, -3129421, 17579838, -24101208, 19286014, 18060338, -5648419, 9281961, -1059246, --42859480, -30514132, -17062832, -15599321, -7218767, 3381213, 16472810, 5349919, 8839043, 41352480, -37568080, 8515310, -27975270, -14535243, -1253594, -14365055, -26530012, -66125852, -55605868, -24996710, --5994164, 2729452, 14439680, -45870788, -26468272, 23790360, 27567784, 33143188, -30238718, -36666136, -11915850, -22365506, 54385024, -27431420, -3157338, -16139413, -8761196, 7524783, 16073378, -8019778, --21530672, 19987704, 19356344, -4378719, 22177064, 19739132, -43123620, 38585448, -25010132, 134218, --7369627, -25753698, -7245073, 13065827, 9715753, -2077690, 5029944, -15697569, 353798, 7919920, -10653666, 16839494, -12637941, 2575907, -3616899, -6838662, -17890686, -2174327, -17235166, 15220827, --2809446, -18289582, 2912525, -20952998, -1409823, 2553895, -4875862, -9050033, 614180, 1704565, -2193118, 6868727, -1301375, -298500, 12233141, 4014721, -12348031, -14127221, 3855807, -9363029, --19967840, -6830072, -18784040, 6199786, 5935108, 14779519, 2004676, -15200963, -10908680, 10790032, -54786064, -18260590, 17663054, -770947, -24383066, 3764002, -49229452, -11090142, 10584410, 966905, --28655484, 16961362, 50190452, 35205848, -15529528, -31428424, -13381507, 3530463, 52741124, 7093676, -1330903, 199716, 24387362, 25071334, 6556805, 19167366, 15547782, 29473676, -8398272, 3363496, -18833432, -17188996, -26161182, 14694157, 43274480, 9375377, 20972326, 2007360, 12875775, -57930520, -10721312, -2268817, 13084081, 56785372, 22915798, 7674033, -5640366, 25445534, -5814849, -11940009, -8992051, 15810311, 33421288, -10780368, 20770998, 3777424, 5759551, 13145284, 16908750, -534723, --22141094, -13745506, 5170067, 42828340, 29335700, 22785876, 24674588, 20656108, -5931350, -53048752, --38113004, -72768560, -1030255, 22178138, 41872172, 6513855, -30569966, 10085657, -18927920, 6062883, -14447196, 4367445, -8880382, -4922033, 128849, -4111358, 11707007, -8053601, -21189222, 396748, -7012071, 9404368, -13721347, -6219113, -25491168, 6302328, 11033771, -9785546, -8825621, 6358162, --5037460, -6297496, -5559835, -19791746, -4306242, 20402706, 12720083, 18472654, -10027675, -20919176, --15575699, 13568875, 10634339, -4930623, -1006096, -1278290, 3717831, -5888937, 12168716, -13958644, --7978976, 969052, 2218888, 8035347, -17350058, 3561065, -12778601, 33640332, -9990631, 7335268, --11106785, 3878892, -20858508, -8732205, 44769128, -1823751, -20946556, 5119064, -4068408, -17020418, --13842680, 2493229, 23553064, 64255396, 28704340, 56952340, 29635274, 25293062, 23938000, -16954920, --14346265, -16224239, 6949257, 46664820, 14841259, -39041788, 16640314, -41975252, 20802674, -26634702, --5847061, -23387708, -25300578, -1243930, 3030636, -411780, -31607202, 40862856, -8514773, 15325517, --39922256, 10584947, -9443559, -12283070, 20379082, -16916802, 40968620, 4799089, -16454020, 2063195, --12450573, -16928614, 11370389, -27965068, -6212134, 35014184, -7881802, 14297946, -2121177, -25472378, -27632208, -15067819, -58098024, 7154342, 4110821, -283468, 6141267, -8029978, -11513734, -3288871, -25956098, -49784576, 29148870, -11778411, -7166153, 32670206, -20382842, 9567040, 11826192, 47452948, -16291885, 20944944, -3620121, 28333900, -22932978, 22462142, 3445638, -8759586, 5778879, 1296006, -681289, -12326556, -3437048, 2128693, -5477694, -9244917, 19054622, 259846, -1636383, -5760088, -6185290, -7643431, 16958678, 9935333, 9002251, 2056753, -334471, -1715303, 14153528, -11623255, --15038828, 5603859, 7301982, -795106, 12681965, -5642514, -2844342, 558346, -4653597, -14486925, --14642617, -1460826, 4576825, -7259032, 2251100, 4492536, 4898410, -3997541, -585726, 9319542, --13623099, -24177444, 39688184, 36976448, 128737352, 52049100, -70138960, -32889786, -34357592, -53830436, -37567544, 115807888, 46342160, 22031034, -29013040, -7915088, -1941862, -1292248, 55576340, 38143068, -24253144, 83699784, -100140384, 6597607, 52366388, -12608413, 10777684, 54943368, 9632001, -15581604, -29603598, -55146308, -110787608, -10485626, 10902238, -42881492, -4858682, 59466508, 10028212, 3588982, -22584012, -46783468, -95454040, -87126096, -39672612, 28950228, 56761752, 125801200, 31594316, -15969762, --15792058, -33964600, -75163000, -22742926, 55020680, 55458764, 58083528, 56726856, 35562328, 29591788, -8554501, 12994424, -48297980, -29582124, 7194607, 13612362, 24776056, 30447560, 74711496, 19653234, -43486544, -28527710, -28229746, -50608672, -11020349, -38687456, -9250823, 77973520, 100024416, 2240362, --4054449, -62228172, -71832256, -40390948, -17080548, 39961448, 21242372, -4318053, 14816563, -5479842, --10284299, -18753438, -17803176, -2348273, 4505421, 3718368, 21965000, -1571958, -496606, -11232950, -356482, -13991393, -4730370, 51540, -20671140, -9294309, 411780, -5637145, -1481764, 12079596, -10704669, 25223270, -11143830, -4583267, -25596394, -20706574, -15734076, 26125750, 16543140, 8188892, -8652748, -8114804, -22742926, -18330384, 789737, -12926778, 22186190, 32952600, -8517457, -91468304, --57002804, 33371896, 86161872, 101055208, 209268528, 128189208, 86421720, 77004472, 59290412, -10017474, --91162832, -99053760, -193261184, -204773840, -194810048, -123944704, -43750148, 43570296, 74320648, 124753232, -121874528, 86133960, 84371408, 108649784, 103573672, 93591632, 58783068, 41459320, 35929548, -3372086, --6679211, -119639000, -85850488, -107017160, -130326488, -54338852, -127279744, -102146136, -187348624, -163325264, --116372136, -77200960, -11916387, 97542464, 117423872, 99558416, 105678744, 98485744, 181598736, 237217488, -211356416, 210297712, 184953632, 179213952, 132652216, 133264784, 28134720, -89485640, -187132800, -178376432, --267623712, -222709088, -324954016, -386380096, -343978016, -326083040, -196828688, -136566544, 24632712, 65036544, -152207200, 227101760, 349377344, 303155424, 436951168, 377958208, 270214112, 266318576, 120735288, 8944269, --24729884, -94681480, -165959680, -197671568, -236801408, -204694928, -186028448, -178929408, -145939760, -149774096, --123605936, -108258408, -33475512, -23013508, 29337310, 69844224, 79685600, 104644728, 148240800, 180031072, -191355296, 200879920, 146976464, 122148872, 117831888, 43910136, 28419262, -66788888, -160451392, -212955216, --218491424, -243868784, -155523984, -176704080, -118485264, -85106928, -24205898, 42155104, 82562160, 126500744, -130667400, 197745120, 202465840, 195067744, 164701792, 148314880, 58227408, 14848776, -37970732, -84294104, --161159520, -189090768, -157872256, -106834088, -95185600, -66264904, -61289720, -32001264, -5160403, 7349763, -4319127, 27973122, 31084826, 50520088, 42119132, 39662948, 36180268, 42039140, 28331752, 27146340, -29990146, 30527016, 11153493, 3393561, -7248831, -1510218, -4686883, 2255932, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --5173288, --13850196, -1168231, -2212982, -1891933, 205622, -2310693, 863288, 1357210, 5676336, -1917166, --228170, -5236102, 386010, 5262409, 366683, 3803194, -1122597, 1596117, -2198487, -3307125, -111669, 3615289, -463856, -4532264, -186294, 4386236, 1431298, -1881196, -1564979, -208306, --601832, -1027034, 54761, -744103, -1506997, -194347, 904091, 612033, -196495, -3453691, -5136244, 6989523, 230318, 811749, -2819646, -1607392, 561567, -3653407, -4043712, 2419140, --3282966, 2390686, 3110630, 3086471, 1168768, -470299, 847719, 643708, 2344515, -5027259, -447213, -651224, -3643206, -4951024, 160524, 2469606, -1868311, -264141, -557272, -351114, -3506841, 1727651, 486942, 1364189, -1117765, -4074313, 1604707, 658204, 3510599, -4188667, --3149285, 2361158, -1848983, -873489, -3093450, 705448, -1806571, -1703491, 69793, -1365800, --1457605, 408022, -774705, -376883, -1662152, 1044214, -179852, 98247, -420907, 853088, --129923, 276489, -270046, -266825, -12686797, -2997887, 4943508, -763430, -3901441, 1595580, --9404905, -3697967, -1354525, -1771137, -4859219, -5214627, 2791729, 4199941, 3682398, -4881767, --7074885, 731218, -4137664, -7637526, 1743757, -552440, 2153926, 8432631, -2787971, -969589, --5359046, 7276749, 579821, 3595425, 2544768, 5961952, 3080029, 1794760, -5974837, -749472, --5492727, -1588601, 252329, -2381559, 1861332, 1492501, -2592550, -5178657, 3266323, 5258114, -1510218, -2604898, -3934190, -2514703, 1275068, -4507032, -5614596, -1665374, 2795487, -1617055, -1384053, 3475166, 2245194, -2688113, 5138929, 400506, 4378719, -3716221, -3068754, -1840394, --2139968, 2994666, -1704565, 128312, 5188321, 1790465, 141197, -4949950, 1347009, -2003602, -3643206, 5227512, -897648, 390305, -2395518, 1954747, 4655208, -1690070, 2906082, 1272384, -628139, 2350958, 965831, 78920, 1921461, 687195, -138513, -23622, 858457, 738198, --844498, 609885, 658741, 947577, -2592013, 3271691, 4522601, 1822140, -2815888, 1967095, --1316944, 1361505, 8497593, 5231807, -7159711, 4862977, -3935801, -1950452, -1028108, 139586, -3617973, 132070, 9936407, 2864743, -3801583, -2507187, -2464238, 6987375, 1653026, 6729140, -2216740, 4529043, 7031935, 8051990, 3071975, -914828, -798864, 1210644, -6451041, -6013491, -1925756, -4566624, 2597918, 1240172, -1540820, -679142, 1898912, 6717329, -2198487, -2291365, --3452617, 8582418, -1157494, -10719165, -5339718, -4254702, -3892314, 4417374, 4257387, 3731790, -5602785, 2476586, 3513283, -164819, -332323, -166967, 5634460, 1821066, 3307662, -7464653, -492311, 334471, 408022, 483184, 3248069, 2262911, 944356, -3622268, -3593814, 2081449, -1745367, -1073742, -220654, -2920041, -3694746, -3033321, 2062121, 3570729, 442382, 197032, -1253594, -1047435, -125628, -830539, 653372, 622770, 379031, -505196, 1080184, 1708860, --248034, 160524, 385473, -284542, 460098, -719944, 1260036, -1074, -236760, -820339, -1114007, -2172180, 1224066, 345745, 922881, -169651, 18855980, 4178466, 2876554, -2253247, --1306744, 1875290, 1321239, 5076652, 6655052, -258235, 9797894, 3955665, -3455301, -3186866, --247497, 4736275, -552977, -2508798, 5185100, 778463, 14128832, 3750580, 2796561, 633508, --1365263, 718333, 2137283, 2792803, -642635, 82141, 7580081, 1114544, 8344585, -4143033, --4013647, 2808909, 12530030, 3686693, 3025805, -1029718, -5422396, -2072859, 1692217, 430570, --126702, 518080, -7693897, 603980, -3387119, 3140158, 2423435, -2975876, 1766305, 2759517, -1809792, -3551401, -3715147, 947577, 1309428, 75699, -4775467, 1313186, -1861332, 3127810, --444529, 663036, 1939178, -667331, 1069984, -1633698, 520228, 11070815, 1242319, 3969087, -127775, -2957622, 1803886, 729608, 3404299, -6044630, -4267587, 2167348, -900869, 1333051, --1596654, 2407329, 1951526, 324270, -2712809, -945967, -3689914, -576599, -850940, 2450816, --1703491, -368830, 398895, -242666, -889595, -802622, 686658, -856846, -1241246, 73014, -43487, 753230, -2499134, -880468, 628139, 453119, -2720325, -568009, -185220, -3400004, --397284, 2777233, -4158065, -721555, 4229469, -2142652, -6557878, -42950, 10821170, -752693, -8495982, 4348118, 11752641, 1410897, 1100049, 4266513, -3300146, -7017440, -9210557, 2159295, --4686883, 10821707, 6204617, 7640210, -1428614, -3202435, 970663, 1700270, 3595425, 10123238, -1230508, 4205310, -4619238, 3208878, -3273302, 1362042, -1757715, 3313031, 5823439, 756988, -5564667, 2005213, 2793339, -1637993, -1324997, 7385733, -1717450, -1892470, 5604933, -3382287, --300648, 759136, -2433099, -3285650, 2488397, -3763465, -698469, -4794257, -10122701, -1183264, --1529008, -314069, -10549513, -4083977, -3213173, -2789045, 3979824, 10349797, -2642479, 3286724, -5449777, -1577864, 1030792, 858993, 624381, -3854196, 4144107, -4873714, 1260573, 3388192, -9754944, 2978560, 2890513, 815507, -126165, 2868501, -3524558, -105227, 2012192, 876173, -172872, -4027606, 2354179, 2796024, 2890513, -631360, 2150705, 1087164, 604517, 1874216, -1130113, 144955, 1105417, -364535, 855772, 461709, 719407, 1038308, 1412507, 1580548, -1156420, 1025960, 1253057, -850404, 1131724, -13722957, 1202054, 7348689, 3891777, -7707856, --566399, 340376, 1826435, 2795487, -429497, -6008123, -5720897, 864899, 9724343, 4590783, -5770826, 9745281, -6605660, 6943352, 12911745, -1222455, 2917357, -7357279, 2521146, 2598455, --6270116, -3426310, -1346472, 2922188, -6335614, -8425115, 1612760, 861141, -7170985, 507343, -2278480, -1535451, 15305116, -945967, -10823854, -820339, 3758097, 8526047, 3190624, 3771518, --6934762, 1825361, 2209224, -6296959, -391916, -1159104, 10633802, 6391985, -1748589, -3758633, --8211441, 3430605, 3312494, -4975720, -152471, 1850057, 3233037, 3182034, -4175782, -243203, --900869, 9835475, -8361228, 898722, -2169495, 8840116, -632971, -2328946, -3752191, 987306, --3883724, -9276592, 263604, 6808060, 2089502, 4213363, 1095217, -3436511, -1299765, -1806571, -5925445, 2202781, -1600412, -369367, 5381057, 3867618, -1510218, 424665, 852551, 1005022, --98247, 1998770, 1496796, 1160715, 141197, -909459, -340376, 270046, -768262, 97711, --1072668, -515933, 881005, 5214091, 4747013, 1668058, -3483755, 965831, 2272038, 16044924, -10657961, 7970923, 11303280, 4550518, -981400, 1582159, 4177930, -11433203, 5841156, 132607, -6279779, -4636417, -2338610, -7391639, 2074469, 12901545, -12679817, -8088497, -13480292, 6771553, --3090766, 374736, -6149857, 734439, -2308545, -6190659, 2317135, 2945811, -9598715, -1367947, -1703491, -2171643, 5024575, -13942538, -6753299, 14140106, 1391569, -309238, -1439351, 442382, --7249368, -7719130, 416612, -11203422, -2609193, 1065152, 2949032, -4849555, -1140314, 13778792, --930397, 4800700, 10256919, -9644886, -3370476, 2198487, 2401961, 1793149, -2975876, -6906845, -7824357, -919660, -7348152, 5324149, -1345399, 1210644, 2020245, -3996467, -2415919, -1720134, --3009162, -4326106, -5168457, -4991826, -6331856, -1956358, -2685428, -670015, -828392, -122407, -826781, -2639794, -2066416, 1450088, 1756105, 2850248, -157303, -1212255, -3715684, -1090922, --4293894, -2782602, -567473, 810675, -296890, 552977, -1069447, -666257, 3226057, 1213328, -2248416, -2181844, 598074, 505196, 872952, -4393215, 365072, 1292785, 49392, 2325188, --26616986, -14918569, 12118787, -4723391, -5605469, 7218230, 6423124, -11487427, -15331423, -5024038, --5429376, -5881421, -963683, -10689637, -7559143, 3787088, 500901, -14351096, -15631533, -8902393, --4220879, -891206, 8139500, -677531, -5781563, 4321274, -12994960, 295816, -520765, 456340, -4663261, 2408940, -9440875, -7276212, 5816460, 1898376, 21369610, 5112085, -6986838, 852014, -791348, 102542, 5717675, 957241, 2448668, -2306398, -4571456, 1265405, -12127377, -2410014, --5225365, -6597070, 1521492, -9862856, 11455215, -1589675, 4854924, 7985955, 2522757, 4172561, --412854, -5397164, -104153, -807991, -6427419, 8385924, -3404835, 15025406, -372052, -479426, -835371, -4067334, -8076149, 2425046, -6307160, -2745021, 9016210, -11599633, -11132555, 7421704, -7330436, 6032282, -9408126, 6759742, 3022046, 3886409, -138513, 1627793, 2030446, 5228049, -2445984, 1185948, 4138201, -659814, -81604, -3390340, -2367601, -652298, 2877091, -3630321, -652835, -530428, -1882806, -1395864, 1078037, -4634270, -2570001, -3488587, -404264, 1328756, -166967, 3216931, -926102, 3371549, 501437, 1175747, 754841, 2583960, -1899986, -1826435, -5506148, 19712826, -10964515, 9351218, 3972845, 6951942, -2716567, -10838887, 1632088, -2887292, --9976672, 20339892, -1345399, -5731097, -20018306, 12300786, 3524558, -284542, -7423851, -8759049, -321586, 20654498, 7800198, -867583, -1957431, -8951249, -7152731, 5917928, 2729989, -7016366, --4811974, 7165079, 1887638, -363998, 6292127, 9498320, 1581085, 12559021, 14397267, 8624831, --3229279, 3087545, 1241782, 2294050, 7542500, -10685342, 11235634, -842887, -5611375, -8679592, -116501, 7256347, 5198521, -10232760, 2287607, 7946227, 1293322, -7435662, -15806553, -14513231, -3861713, 6298033, 1129040, -5681705, -690953, 11439645, -5235565, -8787503, -16702054, 1681480, -3303904, -12591770, 4745939, 12402792, -5636608, 9624485, 3426310, -11673721, -8534100, 798864, -11935714, -1337346, 12534862, -2273648, -4334159, 2522220, 6410776, 1586990, -2091649, -3466039, -2180770, 5529771, 4620311, 657667, 7455527, 1254131, 5357435, 1199370, 7312182, 972810, -4526359, -202937, 3621731, 1803349, -1767916, -5455682, 484258, -6359773, -845572, -2687576, -998043, -958315, -218506, -5671505, -499290, 2434710, -2683818, 207232, -639950, 236760, --353798, -4154844, 621160, 23737210, 15847892, 3418794, -4641249, -2713883, -3200288, -16558173, --6491306, -372052, 10610180, -7699803, -4080756, -3687766, 315143, 17112224, -13296145, -3762391, --612033, 7945690, -2677912, -10085657, -16480326, 5777805, -11349451, -5417028, -7034620, -7912404, -2556043, -13175349, -6200322, 11372000, 17399450, 627065, -10703059, -9810242, 16051903, -1946694, --8524973, 16475495, 624918, 858993, 808528, -18312130, 7489886, -6888054, 6701223, 5936719, --12237436, -1508607, -12416750, 4700305, -12040404, -2230699, 5181341, 6737730, -3961571, 4030290, --14637249, 9975062, -1055488, 6752763, 5895917, 4035122, -3184182, -3249680, 14766098, -10320270, -7373922, -2658585, -12422119, -7708393, -756988, 13031468, -7478075, 6019397, 1846836, -4230006, -239981, -14865419, 18658412, 11266773, -2129767, -5218386, 9175124, 3790846, -2619393, -4929012, -1090922, -3338800, 4753455, -1136019, 2525441, 7558069, 2828236, 5951214, 43487, 2012192, -957778, -1292248, 211527, -722628, 5327907, 1928440, 7373385, 1076963, -4065187, 5192616, --2099165, -305480, 4051765, -4013647, -1239098, -2190433, -1611687, 3158949, 2053531, 1568200, -6854768, -2195802, -2332704, 9341554, 1786706, -6183679, -14185740, -775242, -18437220, 3173981, -1642825, 9018894, -7363185, -1758789, 4782446, 3980898, 5260798, -12475806, 17645336, 12517145, -2306398, 9255655, -4170950, -17772038, 4197257, -7481296, -8324721, 8381092, 20451024, 3584687, --5639829, -7409356, -16403017, 41876, 764504, 25231322, -9926743, -387084, 756988, -756988, --15193984, -17136920, 13575318, 545461, 7715909, -2193118, -19420232, -11172284, 1552631, -3234647, --4106526, -5530844, 12712566, -2668249, 8258685, -8891656, 17707076, -20891258, 10352482, 10861972, -6470368, 5754183, 5243082, 16563541, 8501888, -1178969, 3531537, 153008, 16346646, 24588150, --2831994, 1988033, -7218230, 10305237, 16494822, -11254425, 3466576, -28396714, 18578954, 19218368, -12804371, 17882634, -8137353, -14213657, -1023276, -2030983, -4211216, -2950106, -8547522, -5897527, --3160559, -703838, -4780836, 2915209, 5222680, 2083059, -8032126, 1662689, -4462471, -4633196, --2966749, 3416647, 3092377, -1335198, -2000381, -627065, -1394254, 950798, -7772280, 2676838, -1124745, 5128191, 1124745, -235686, -227096, 1209033, 4403415, 1631551, -4023311, 3324305, -2684, 584652, -20667382, -3076270, -26437672, -13589813, 10413685, -10846940, -23511188, 2165737, --12674985, 564788, 463856, -15104326, -14329622, 6463389, 13855028, 4158065, -16093779, 7682086, --18103824, -6371584, -6664716, 5647882, -7434589, -3414499, 8712341, 1465658, -5952825, -12916040, -13660680, 13215077, 17213156, 2223719, -1905892, 585726, 5522254, -1324461, 7064685, -7786776, -9286793, -3677029, 10696616, 8546448, 6461242, -3131031, 454193, -16653199, 5669894, -4212826, -12517145, 2247879, -29060822, 4438312, 14339822, 19246822, -11077258, -15175730, 18139258, 8200703, -12756053, -22736484, 11236708, 28395102, 29950954, 1874753, 721018, 17005924, -11782706, -15745887, -10075456, -17430588, 6541235, -8136816, -6837588, -3877819, -37464464, -21675090, -18241800, 13426605, -5116380, 3747896, -13304198, -5453535, -10049687, -1943473, -5395553, 14674293, 3504157, -5894306, --13067975, -2954401, 8472360, -1395864, -3609920, 2554432, 8868034, -3202435, -5231270, -2559264, --1937567, -652835, 6897181, 6872485, 6021008, -6132140, 7889855, -456340, 2257542, 8957154, --4047470, -4125316, 7862475, 14048301, -3297461, -4670240, -2245194, 1632088, -2542621, -9788230, -1569811, 7028177, 1914482, -9861245, -9375377, 4345433, 3177202, -602906, -602369, -1793149, --6973953, -4754529, -15586973, -29882772, 22846542, 2407329, 7666517, -3862249, 16178605, 440771, --13810467, 10692321, 4341675, -4877472, -8337069, -6519224, 2053531, 3912715, 14331769, -8150238, -11246909, 3595425, 20438138, -29316374, -7873212, -4634807, 3775813, 11988327, 17373680, 3960497, --14110041, 9543417, 13669807, 11522860, -3216931, 4031364, 830002, -4800700, -1970316, 850404, -4425964, 1609539, 10109279, 1684701, -12745852, 11929272, -13215077, -16857210, 2626909, 12220256, --5930276, -4359392, 4439386, 5974837, 10522670, -5986648, 4992363, 23775866, -9474161, -25222196, --32690606, -16502875, -22147536, 10084583, 19234474, 12319577, 4707821, 11589969, 6806450, 12807592, --10936597, 14474577, 7517267, 5886790, 15069430, 19594178, -6080063, -4345970, 5359046, -1261647, -17626008, 6846715, -2678986, 2995203, -21476984, -15005542, 2990908, -824097, 3834869, 1473174, -4530654, -3993783, 11341398, -5960878, -6898255, -6655052, -11286100, -4076998, -2218351, 3737159, -3035468, -1667521, -9689446, -540629, 3235184, 1107565, -3875134, 2325188, 158377, 3779034, --4038343, 1697049, 807991, 4553739, -2134599, 6993818, -4282083, -4935991, 1507534, -814433, --3599720, 1184874, 4849018, 443992, -702764, 29956324, 2857764, 4731980, -6241661, 10905459, --34251292, -15067819, -23417772, -24099598, 9557376, -21024938, 20682416, 23612120, 1010391, 5152350, --3651796, 4355097, -22402550, 9240622, 24748138, -14068702, -28833190, 3853660, -10853919, -9148817, --28122372, 4909148, 10307922, -69256, -3826816, 9080635, -16041703, -2629594, 10417980, -5710696, --14216879, 1759863, -7100118, 14725832, -9736691, -5361730, 13747653, 11973295, 25391310, 3403762, -6127845, -2297271, 6816650, 9085466, 15687905, -4483409, -515396, -9712532, 20699058, -26048976, -28028956, 1038845, -11171210, 13173202, -10184978, -7460358, 25782152, -37174016, 6075231, -7810935, -7286412, -14396194, 6958921, 14805289, -7639673, -1322313, -3921842, -6121402, -3299072, 27475442, --31109522, -10583873, 52319680, -19648938, -23080618, 22689776, 13557601, 15160698, -13164075, 1088774, --13084081, -7282654, -2045478, -14904610, 3285113, 2070711, -3886946, 5439576, 4828080, -6721624, --12710956, -3215857, -1058710, 5058935, -11215770, -7822209, 310311, -1063004, 2848100, 7069516, -16673063, -7512972, -361851, -1757179, -1723893, 4858682, 1899986, -9838159, -7456600, 8032126, --6431177, 3082176, 2077690, -5957120, 2322504, -1304596, -10107132, -8225936, 4997732, 3351148, --1505386, -98247, 6359773, -14866492, -23005456, 2250563, -8738111, -7767449, -12963822, -16190953, -20411832, 8812736, 1268626, 9611600, 24179592, 14326400, -1692754, 4959614, 16243029, 20790862, --18473192, 8630200, 17352742, 7586523, 6335077, 24006720, 11523934, 5024575, -768799, 10813117, --1245004, 12233141, 10053445, 5542119, -11272142, 21237002, -17482128, -2163053, 26519812, 26281442, --6295349, -23265838, 8723079, -338229, 22744536, 39235064, 8719857, -5991480, 2729989, -22486838, --2702608, -5931350, -4882841, 466541, 19968376, -8573828, 8761733, 24096378, 4042638, -22263500, -14692546, -1125281, 9327595, 22640920, 31816580, -8977019, -8500814, -2721399, -25294674, -36949604, -959388, -16798690, -2772938, -20368346, -2144799, 666794, 2724083, 15137612, -477278, -10524280, --17565880, 12807592, -5455146, 10959683, 352724, 20405926, 7512972, 7536594, 24696, -6333466, -11405823, -8733279, -10176388, -3044058, -7664369, -2941516, 532039, 817118, -2786360, 3145527, -4444755, 380105, -1208496, 5945846, -5156108, -7229504, 4372814, 5236639, 993748, -6249715, --7576859, -4383014, 6010807, 8163659, 1017370, -1144609, 8982924, 2481417, 4258460, 3755412, -6407555, 1826972, -1243930, -4765803, 2542621, 5152887, -10643466, 24938728, -46798500, 25739740, --19685982, -46212236, -13635447, -11667816, -1594507, -10681584, 5650567, -12799003, -28562606, -17307108, --8505109, -2633889, 3332358, -11800960, 11569568, 22400402, 889595, -1426466, 6205691, 1362042, --4121021, -8337069, -4629975, 6053757, 6731825, -2000918, 6406481, 27533424, 7652558, -8060580, --27254252, -4369593, 19375672, -23510650, -10980084, -8956617, 357556, -1796370, 14904073, -4892505, -1853815, 20414516, 7364795, 22647900, -3108483, -10683731, -4829691, -5801427, -5791227, 10932302, -1266479, 7397545, 13884019, -24257438, 3649112, -6409165, -15021111, -11377905, 23795192, 17099338, -951872, -11557757, 4885526, 10034654, 1132798, 6953552, -16199543, -40240084, -18556944, -14713484, -14847165, 1528472, -1751810, -6765647, 2996277, -4502737, -12615930, -13154948, -6766184, 16341277, -12428562, -18143552, -22611392, -8833674, 1713155, 13853417, 5718212, -4344897, -5965710, -4616016, -3354370, -10019622, 1648194, -6818798, 726923, 10484552, 11263552, 3022583, -5597416, 3667365, -8166344, -178778, -1560147, 6022081, -7997229, 11458973, 10359998, 4063039, -16643, -367220, --969589, 9637370, -3558917, -4917201, -5561446, -8056822, -7834557, 2704756, -2769717, 3594351, --2106682, 1864553, 6212670, -2811593, -5596343, -8284992, -2132451, 4063576, -5783174, 13517873, --18470506, 22223234, -1764695, -35128000, 7190849, -16930224, -3486440, -2532420, -4134980, -22357990, -7065221, 1187559, 17759690, -38233800, 649614, 18884434, 2303176, -9051644, -19324668, -1476932, -11137924, 16544751, -13677323, -4855998, 8953396, 18908594, 17270600, -16594143, -3355443, -26924614, -12611098, 13737990, 8517994, -7634841, -2068564, -7284802, -2826089, -8934069, 2638184, 19732154, --7249905, -7684770, -6709276, -11090679, 22374632, 19264538, -1832340, 27102854, -1183264, 9680856, --23822572, 19670414, 8750996, -26763014, -8638253, 30812096, 12785581, 8407935, 6019934, -14381161, --11355894, -15424301, 26723286, -13721347, 20651814, 21416318, -24162412, 56078316, -11956115, 34814468, -1554778, -7776575, -14962592, 26179974, 10107669, -20154134, -12335683, -43412456, 17435420, -5883569, -20043538, -26691074, 29967598, -22852448, 8866423, -8804683, -6836514, 19785840, 1872069, 1926830, -10996190, 7773354, -5014375, 13013751, -1564979, 3884261, -8996883, 1852742, -1219234, -5614059, --9044127, 420370, -10040023, 4914517, 4342212, -2254321, 8702677, -3020973, -5214091, -7191386, -5133560, 1170379, -1202054, -14304389, 6540699, -2757906, -17351132, -5406290, 4993437, -4799626, --8974334, 6141267, -4868883, 5095442, -9133248, 4447439, -9307194, -1481764, -1394254, 5190468, --2188823, 1065152, -3018288, -3065533, 13429826, 23036058, 1910187, -19317152, 9359271, -37305548, --9893457, -33889440, -46876884, 1611687, -17996986, 6045167, -3437048, -7343321, -17804786, -12266427, -10537702, 28257126, -23489714, -5039608, -40503688, -35591856, 9868224, 14281303, -22217866, -23297514, -1517734, 5178657, -37624988, 2021856, 858993, 19595788, -16859894, 756988, 16284905, -10564009, --19563576, -21932788, -10556493, -20000588, -16353625, -20880520, 29296508, -37171332, -23007066, 33614024, --1035624, 9478993, -28099286, -4920422, -7985955, 732292, 47422880, -6730751, -899259, 4664872, -22231824, 498216, -20963198, -9324374, -15110769, 5077725, 56725780, 11000485, -19968376, 42703788, -30892626, -27466852, 31860068, 52230560, 457414, -20437602, 35576288, -6224482, 37425808, 33675764, -2834679, -1804960, -10051834, 23490250, 19143206, 10842108, -19981798, -6713034, -12901545, 29756070, --3785477, -20584168, -9993852, -20696910, -8880382, 20319490, 2311229, -10852845, -3664681, -13268228, --2219424, 18141404, -8810589, 4374424, -1835562, -17535278, 18853296, 2154463, 7562901, 9019968, --12161200, 3624953, 17322676, -3234647, 682900, -9440338, -38655, 1275605, -5706401, -5391795, -3273839, 12729746, -8266739, 4947266, -11038066, -5410585, 654446, -3823058, 12655121, -5019206, -542240, 1058173, 4619774, 261993, -6048925, 26369488, -67005784, -40488656, -43492448, -14959371, --28926068, 36040680, 13800267, 29551522, -4242891, -57256744, -8566312, 9225053, 39520140, -1671279, -9317932, 36101884, -13333726, -26197690, 2866354, -1780264, 45870252, 29698626, -14716169, -20748450, -48724256, 3404299, 24486146, 11702175, 45475112, 39106216, 30361660, 3195993, -25347824, -13903883, --19315542, 37842956, -17961016, -25836912, -13903346, 1400696, -879931, 16760573, -16240882, 6049462, --76694160, 8673150, 12119861, 12692165, -31977642, -29755534, 9363029, 27145804, -33015414, 12991739, --18699214, -14639396, -22114786, -1924145, 23810762, -15758235, 26146150, -6522982, 10355166, -47846472, --30633854, -1117228, 25660818, 17903034, -34672196, -37485400, -17251274, 3636227, 40057548, 16523276, --3629784, -27880780, -32091996, -10865730, 6960532, 28314572, -2266669, 9476845, 19107236, -7088844, -7047505, -18548354, 11819750, 6800544, -11320460, -9453223, 1267552, 14643691, -13657459, -383863, -23313620, 3795677, 3633006, 189515, -6305549, -15487115, 4291746, -17215840, 20730196, 17735530, -13617194, 1786170, -1328219, -20182052, 13205951, -3902515, 24152748, -5551245, -26616986, -16370268, --3008625, 26463440, 7730405, -5383742, -2323041, -20879446, -9830106, -8267275, -898185, 12104828, -11802033, -21050708, -11360188, -12792560, -12359305, -4377646, 4414153, -1547262, -6855842, -12727599, --12887586, 2030446, -255014, -6504728, -6391448, 11878806, 86785184, 8770323, -46380816, -104252816, --9488120, 61783640, 15496779, 26940182, -2898029, 37571836, -6378564, 16505559, -8773544, 21280490, -29998200, 16002511, -14622753, -34433828, 40446780, 45948632, -10392747, -45546516, -27751394, 4736275, -26466662, 8786429, 9465571, 1662689, 6742025, 3018825, 6682969, -8975408, -52755620, -333397, -32597728, 25045564, -10384157, 2507724, 20069846, 43918724, 27000848, 21517786, -25890062, -18124762, --4409321, -4807679, -39286604, 27804008, 16556562, 28885802, 59111636, -30421790, -19435800, -2755759, --16315507, -14221174, -25748328, 45765560, -27692876, -29985852, -30709016, -10769094, 58609124, 14935749, -22910966, -1280974, -4778688, -13567802, 36510980, 29362008, -14910516, -34189552, 11982422, -4497905, -14273250, -32056026, -12283070, -18656802, -24071682, 14772540, 24367496, 4493610, 1160715, -12921946, -7431904, -5061619, 22682260, 1780264, -7427072, -4457103, 7745437, 14382235, 16119012, -9209484, -10127533, 5133560, 5402532, -737661, -16557099, -2214593, -13366475, -5457830, 1126355, 2290828, -4971425, 4896800, 6009733, 14708652, 22100828, 19459960, -1381906, -4786741, 2892124, -9522479, -12389907, -13385802, -1174674, 10902238, -207769, -2636036, -21297670, 10901164, -21240224, 7267085, --4399657, 3480534, -1419487, 2529736, -541703, -13433047, 8040179, 6744710, -639413, 4586488, --281857, 3951370, -1297617, -3422015, -172336, -1005022, 1242319, -542777, 1272921, 690953, --4089883, -1752347, -420907, 3235184, 1342714, -843424, -2201171, -1486596, -25388088, 2558727, -66215512, 51577724, 7667591, 4229469, -36512052, -69332048, -61297772, -29513404, 49622980, 54983096, -56402048, 31751620, -8699456, -35864052, -33777772, -21657372, 13908715, 22440130, 38474316, 3819837, --29937532, -24762634, -5844914, -24812026, -12046846, 5711770, 39851392, 57629872, 36811628, 17959942, -15903190, -35756140, -4647692, -72111424, -81236088, -50437412, -24782498, -22001506, 37401112, 59403156, -65227132, 59512140, 50987704, 21476448, 3068217, -24628416, -7226820, -39790724, -71269080, -5693516, -6206765, 7060926, 23130010, 14193256, 23470922, -79211008, -43770012, -28221156, -46375984, -19369228, -33660196, -20173998, 22543746, 3304977, -21337934, 17044578, -17893370, 19143206, 21771190, -16764331, --34448324, -70183520, -68517080, -50746648, 24537686, 8883066, -10122701, 13243532, 3304441, 338766, --32900524, -22767084, -60900488, -19992000, -22686018, -2355790, 43884364, 47406776, 6556268, 24513526, --15031312, -32743220, -59256592, -38735772, -36749352, -1212791, 17635672, 10357314, 14305999, 15848429, --11218455, 9627706, -10601590, 9986336, 2124935, -308701, -2509872, 8258149, 6894497, 15712064, --3922379, -3645354, 14318884, 11638288, -119188024, -60955248, -31728534, 40125732, 9317395, 152951840, -156783488, 118181392, 152860032, 160154496, 145531744, 104460584, 94839856, 105214888, 41909216, -6241125, --65066072, -100603704, -139003936, -135078336, -201327136, -122180544, -79442936, -63131188, -89737440, -47238196, --12901008, -67286568, -52195128, -55180128, -12418898, -33139968, -11743514, -44866304, -22721988, 26733488, -27756226, 8265665, -8217883, 29133836, 23672786, -67884640, 14182519, 45878304, 100553240, 73687680, -95739656, 39223788, 38096896, 159353488, 86382528, 163068640, 54702316, 152937344, 105701832, 133520872, -180215760, 170591808, 138453632, 155343056, 172707616, 187822672, 160545872, 185144224, 126454040, 187798512, -150929984, 133781248, 142798000, 77869368, 159854928, 77257872, 47036872, -58789512, 4012573, -86831888, --97406640, -149234544, -175992192, -270794464, -264223696, -249788320, -233374032, -220191168, -185868464, -227027680, --279189504, -275581760, -228361264, -241985968, -227316512, -228361264, -194655440, -212261040, -203266848, -151865744, --167440368, -128891432, -120099096, -110990008, -70514776, -91454352, -20642686, -34062312, 15850577, 21065740, -66728224, 98288712, 103332616, 118985624, 105979928, 159287984, 180908320, 178919744, 207125872, 215965984, -214331760, 163141648, 146004736, 127811784, 118857848, 115367656, 118808456, 111309984, 85127328, 54579908, -62406948, 47911972, 37671160, 24845848, -18876382, -25119116, -25985090, -32317482, -39075076, -44471700, --30838402, -34409668, -27037892, -28014998, -23817742, -17382270, -20411832, -16988206, -16018617, -20175072, --18025978, -20480552, -15482820, -12837657, -16935056, -19777788, -6792491, -1621350, -1369558, -512175, -1505923, 8590, 653909, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --7687455, --15177341, -2673617, 219043, -3496104, -7132867, -2373506, 5257040, -8422431, -4627828, -2797634, --1629403, 2656974, -1183264, 2959769, 1378148, 2590939, -272194, 3210488, -2793876, 511638, --1215476, 597000, 8129300, -1738925, -480499, -4032974, 5032628, 3099893, 2431488, 6243272, --3178813, -1829656, 2159295, 5589363, -1490891, -384936, -4501126, -4964982, -3292629, 3526168, --4376572, -3781719, -454730, 5027796, -6796786, -1460289, -5674726, -2772938, -1607928, 774705, --490700, -4092567, 5258651, 884763, 4735202, -1913408, -1170916, -5878200, -103616, -2066416, --2189360, 3375844, 1926293, -1058173, 1845762, 3737159, -1040993, 1602560, -2655901, -1553704, --623307, -2534568, 2271501, 776852, 1736241, -4016331, 2906082, 1653562, 6522445, 3859565, --1036698, -4131759, -309238, 896038, 541166, 1280437, -162672, -1401233, 84826, -952946, -36507, -1152125, 439160, -1120450, -45097, 1249836, 452045, 644782, -770410, -563178, -623307, 859530, 421444, -127775, -12489228, -4502200, 3614752, -3322157, -1472100, -1413044, -1713692, -650688, -3281892, 5193153, 4673462, 1541356, -568009, 2399813, -6402723, -953483, --6327024, -3209414, 4696547, -794569, 852014, -653909, -710280, 92879, 9808095, 8950712, -4021163, 4772246, 5689221, -1107565, -635655, -1966021, 5021891, -500364, -1881733, 1394254, --2898566, 1988570, 3619584, -1853815, 4078072, 4576288, 8968965, -3514357, -4206384, 3821984, --2296734, 117038, 1903207, -5215164, 329639, -2733747, -3036542, 6885907, 4069482, 4953708, --2821257, -3752728, 2644626, -4366908, 3075197, 13298292, 767725, 904091, 3005403, 1290638, -1242319, 7566122, -4038880, -1036698, 1404991, 979789, -3759170, -2780455, -3837553, -1837172, --1394791, 3474629, -580357, 3490198, 3597572, -3605625, -3837017, -999654, 2441689, 3365644, --4023848, -792421, -1188095, -2780455, -326954, -2634426, 694711, -181999, 1414655, -810138, -549219, -1026497, -249108, -790274, -3657165, 3959423, 6368363, -3056943, 3149285, 10035191, -3343095, 2297808, -7030325, 5816460, 1515050, -9028558, 3814468, -2533494, -5436355, 2185065, --769336, 2105608, 5230734, -5509906, -5805722, -2575370, 7857106, 222265, 3891240, 8152922, --12140262, -9777493, 1574642, 5975374, -4398047, 388695, 8077760, 2089502, -1060857, -2430952, -9669582, 1189169, -2372433, 1359894, -8800388, 1003412, -4859756, 4480725, 769336, 4759361, --2407329, -1185948, 2135673, 149787, 612033, 280784, 4548907, 3679176, -5017059, 2872796, -4024921, -6862284, 806380, -3088618, 1277753, -1568200, -5322002, 93416, 4566624, 3986267, -8822400, -5464272, 6828998, -4516158, -921271, 4065187, -4438849, -6591164, -2396592, 321049, --427349, -328028, -723702, 1317481, 2805688, -3829500, -59593, 1838246, -362925, 1580011, --3156264, -1795833, -1257352, -2302639, 669478, -490163, -1821603, 1005022, 1018981, -1506460, --2332167, -111669, -549756, 2406792, -128849, -380105, 429497, 526134, -426812, -705985, -1602023, 547608, -1297080, -639413, -995359, 157303, 20176682, 9045201, 12222403, -989453, --3381750, -4407710, -4421132, 2404108, -3713536, 5626944, -639950, 7721815, 464930, 4084514, -5068062, 3919158, 3353296, 4443681, -14992120, -4432943, -1412507, -3160559, -2777233, -4719632, --10681047, 479426, 7311108, -4503810, 4387846, -3617436, -5333276, -4022774, 602369, -3395709, --1265942, -3482145, -248034, 8821863, 464393, 3964792, 5570573, 7252589, -3414499, 1698123, --1629403, -5599027, 6350109, -3558381, -266825, -5542119, 4043175, -55835, 84826, -1531156, --2587718, 1874216, 5671505, -2385318, 3191698, 3028489, 2539400, 9763534, -9836549, -4157528, -228170, -5415417, -7023346, -2786360, -8594230, 1282585, 10051834, -6947647, -3324305, -7933879, -499290, -2502355, -3805878, -9300752, 5448703, 7125888, 2807835, 4977330, -2546379, 795106, --1891933, 2059437, 70867, 4925791, -1294933, 2115272, -118648, -1271847, 1699196, 1171452, -2241436, 1887638, -344134, 444529, 1215476, 490700, 943282, -92342, -966905, -1792612, -862752, 454193, -1245004, 867583, 944893, -313533, 396748, 1160178, -384936, -1072668, --389231, 6270653, 8941585, -4954245, 4647692, -4043712, -1975685, -1604707, -11108933, 8065949, --2365990, -1180579, 12783433, 7963406, 8537858, -3477850, 308701, 1529008, -1991254, 2850785, --6548215, -171262, -4487167, 5228049, -5100811, -3498251, -555125, 892816, -6294275, 1209570, -642098, 8240432, 35433, -11256572, 6463389, 6080063, 8635569, -1374390, 2155537, -6225018, --4720706, -1964411, -4583804, 1791001, 1165547, -1698660, -710280, 4711579, 7311108, -10043781, --2196876, -3758, -4145180, -4290136, 6611029, -5342940, 2479270, -5243618, -6974490, -5171678, --3459059, 2400887, 949188, 12423730, -2128693, -3333432, 3677566, -3730716, -1117228, -3311957, -3437048, -3064459, 4437238, -2230699, -2079301, 3069291, 7436736, 2075543, -7030862, 42950, --3477313, -7103876, 1991791, 5031018, -1695438, 1165547, 1728724, 249645, -789200, 2590939, -28454, -2878702, -2147, -1035624, -561567, -1495722, 2338610, -556735, -1963337, -2075543, -265751, 2187212, -1003949, -146029, -2937221, 274878, 498216, 986232, -552977, -2463164, --1309965, 2166811, -909459, -2658585, 1049583, -15432354, 14843944, 7967701, -8856759, -8931921, -3661997, 11783780, -170725, 3456912, 13722421, 4602058, 4131222, -2318746, 7152195, 6536940, -7533910, -13582834, -8342974, -8240432, 6506876, 5614596, 7156490, 343061, -8291435, 3409667, --1257889, 3752191, -11919071, 4606890, 7220914, -5589900, 3122978, 5843840, 1636383, -173409, -1252520, -1872069, 10434623, 7092602, 5582921, 210990, 3626026, 8055748, -7189776, -3866008, -354872, 10651519, 6813429, 4193499, -8022462, 299574, 5452998, 6362994, -2238215, 1975148, -6211597, 7696045, 2428267, 7116761, 2822867, -790274, -6564321, -36507, -10932302, -4472672, --5244692, 921807, 3604551, -6325950, -2565706, -11555610, 5029407, -3203509, -84289, 6142340, -8943196, 10814728, 1342177, -1115618, -6704981, -1994476, 3424700, 3701188, -7114077, 2243584, --3201361, 2617783, 477278, -2392297, 45634, 1280974, -2254858, 1020055, -595390, -2682207, --1383516, -1684164, 1698123, 2080912, -361851, -1551557, 1117765, -1189706, -861678, -2083596, --288300, -438624, -2437931, 2027225, 13076565, 4100083, -2217814, -5925981, -15495168, -7510287, -9509058, -3320010, -14240501, -3792993, -2247342, 2192044, 7896298, 12056510, -688269, 3561602, --2739652, 6018323, -6700686, -7136088, -7681012, -13664438, 7329899, 4185983, -11411728, 373662, --8327942, -3163780, 7394860, 4198331, 6038724, -1669669, -1563368, -1939178, 13019656, 10145786, -10744934, -4852240, -9152038, 7279433, -1217623, -3223910, 9261023, 1672890, 9111236, -263067, -5100274, -6365142, -320512, 4599910, -19484656, -2914672, 950798, -14246943, 3714610, -3610994, -13331578, 8520678, -8153459, 672699, 12171400, -1232656, 6204617, -4056597, 8367133, -3859028, -1655710, -3198140, 208306, 5884105, -7920457, 8579734, 4385699, 4940286, 1398549, 11393474, --4463008, -12971875, 2250563, 9048422, -4269198, -8043937, -5832566, -4092030, 9325448, 234613, --4001299, 422517, 221728, -1778653, -1792075, 620623, 1790465, -1007170, -1228361, -642635, -1993402, -1007707, -3513283, 1018981, -3889093, 3589519, 2301029, -6979, -405874, 987306, --1139240, 1613834, 143345, 1130113, 197569, 525597, 4112968, 1482301, -2175938, 1207960, --31410706, -6636798, 16843252, -13594645, -4930623, 14319958, 5389647, -4530654, 1512902, -11841762, -10573673, -1331977, -19102404, 1377611, -1001801, 7231651, 7086696, -3784403, -14963129, -6400038, --5712844, 329639, -7977902, -4372277, -10173167, -2911988, 11092827, -9095130, -4571993, -3488587, --5920613, -6241125, -8487392, 5812702, 1182190, 7226283, 1265405, -5305359, -8223252, -8106751, --1667521, 5424544, 7988103, -2802466, -7267085, 7656316, 3185255, -11420318, -12738336, -25972740, --2290828, -8284992, -5015448, 3872987, 3959423, 2399813, 11684995, -1196685, -5566815, -682363, --5999533, 13336410, 7087770, -2567317, 7126962, -7469485, 3744138, 3087008, -7311645, -3193845, --6555731, 4718559, 3313031, -12065637, 7985955, 12253542, -789737, -562104, -12366285, -4795331, -5464272, -3819837, 3614215, 12149926, -4044786, 2694018, 1239098, 969589, -3825205, 741419, --610422, -5034776, -3036542, -432181, 1813550, 324270, 1430761, -5250598, 643708, -2796561, -1356673, -3025805, -2940979, -1766842, -164283, 701690, -2244121, 732829, 1312649, -279173, -557272, 2287070, 1285806, -4158065, -2742874, -1272921, 467078, 1606318, -648003, 1629403, -5607617, 20832738, -9722732, 7917236, -5092758, -48855, 11955041, -3446175, -5306969, -2816425, --1099512, 2101313, 8132521, 27451284, -1497870, 1656784, 7630010, 1778117, 141734, -12841415, --13348221, 2057826, 1842004, -8396124, -4271345, -1936493, 7621420, -3372623, 1490891, -175020, -3335579, -3438121, 16042240, 8900246, -7474317, 8814347, 7997766, -9699647, 1709397, 4126927, -3224447, -2699924, -3272228, 13346611, -11674795, 4942971, 14779519, -5152350, 1851668, 9458592, --1019518, 8223252, 4542465, 116501, 4538170, 7052337, 9731322, 6097780, 804770, -372588, --6684043, -7431367, 293132, 804233, -23284092, 15195594, -3562675, -7227356, -8084202, -17105780, --19286550, -12557411, 2354716, 9528385, -3487514, 1154273, -1548336, 9465034, -3533684, -7714298, -4377646, 2250026, -3194382, 1134945, 6482717, -6296422, 1256815, -7998303, -2661269, -3612604, -1915019, -970126, 4098473, 2498597, 871342, -1197759, 2087891, 2747169, -62277, -5819144, -3236795, -339839, 4926865, 4642860, 2347737, -2427730, 4268661, 863288, -670015, -221728, -254477, -3929895, 4282620, -475668, -2831457, 4034048, 8230768, -1720134, -1754494, 4131222, --1664300, -3042984, -1098975, 28195386, 28336584, -816581, -23424752, 4566087, 4821638, -2705293, -6165426, 3510599, 2075006, -281320, -3937948, 22874458, 4263829, -3691525, -25458956, -14341433, -6059662, -1593433, -8824010, -15297063, 2181307, 2583423, 3974455, -3819837, -16711718, -17890150, -19434728, 18339510, 5779416, 16842178, -14347875, 1953136, 7605314, -3041374, -9073655, -16428250, --8061654, 2898566, -632971, -7711614, 7994008, 144955, 7762080, 6236830, 496606, -17661980, --10195179, -8308614, -1355062, 1813013, 2406256, -3007014, -4925791, 1212255, 2924336, -15793668, --3904662, 2579128, 3624953, -7172596, -19679004, -4614943, -4890894, 14583561, -492311, 6561637, --6529424, -5013838, -8766565, -9883793, -5712307, 1592896, -664109, 12242804, -7200513, 2122251, -14228153, -988916, 7146289, 6331319, 13824963, 3052111, -3915400, -7043210, -6111739, -2426120, -8390755, 1283658, 8458401, 4453344, -577136, -227096, 491237, 676457, -3655017, -4687957, -95563, -1163936, -367220, 1356673, -824634, 1061931, -5357972, -1270774, 3428458, -201863, -2200634, -9322227, -957241, -381715, -1731409, 1897839, 1541893, 1187559, 1713155, 2119030, --4275103, 5094905, -3276523, 12281459, -6314139, 2145873, -4756677, 950798, 3227668, -7728794, --5229123, -13798119, -15256261, -10020159, -3923453, -699006, 382252, -8442295, -7821673, -15820512, -7611756, -15855409, -20403780, 13179644, -12230993, -15570330, 14504641, 2755222, -3269007, 15556372, -8982387, -12087112, 11180337, -30819612, -2079301, -7920457, -3284576, -14489609, 25368762, 11877195, --7421167, 3723737, 8001524, -5309117, 8833137, 133144, 400506, -7247221, 8579197, 9874130, -13357885, -20908438, -716186, -144955, 6202470, -9480067, -3605625, -9649181, -9471477, 16618302, -5385889, -12450036, 6429029, -7702487, -8156143, -13369696, -24285356, 6345278, 16069083, 1088774, -16186658, 21961242, -1294396, -8997956, -20807506, 1621887, -2654827, 1330366, -5184026, 4300336, --9137543, 19661824, 10899553, 17199196, 3498788, -2121714, -5220533, 7021198, 8130910, 3659849, --1471026, -2461016, 781684, 9254581, -1620813, 3880503, -5825050, 2520072, -9634149, 940598, -1201517, -4243428, 9103720, 5262946, -2328946, -5980742, -5223754, -1725503, -476205, 2922725, --6117644, 1584306, 1103807, -447750, -4226248, 1603633, -9176198, -1858647, -2173254, -2562485, -1591285, -166967, -17593796, 2357400, -39244728, -26365730, -18900540, 10227928, 19465328, -27764280, -6441377, 19682762, 12157442, -281320, 7204808, 18558016, -8524973, -1109712, -5406290, 547071, --12059731, 8573292, 177704, 1013612, 3167539, 24875914, -1261110, -10975789, -10691247, 5929739, -18313204, -7397545, -18551038, 5505611, 18583786, 10849624, -2509872, 9024263, 6094022, 8694624, -1930051, 7364795, 12604655, -1574642, -21261162, 1064615, 6551973, -19922206, -14548128, 19486266, -15286325, -15047418, -9862856, 4759361, -1013612, 9557913, 23694260, -5095442, -4592394, 4505421, --1231045, 8773008, 4378183, -8639864, -6792491, -3261491, 6935299, 6305549, -6314139, -17176112, --3037616, -25846576, 24448028, 4123169, -4495757, 2326799, 10125385, -526134, -11368778, 4218195, --4948876, -7369627, 5746130, -1546725, -11251204, -18489834, -6048925, -7540352, 15257871, -2436857, -5027796, 2903935, 1856500, -1438277, -1337882, 2380486, -4110821, 664109, 5517959, -668941, --2904472, -1657857, -12617003, -3894462, -350040, -2369211, -9188546, -8242579, -3470871, -1887638, --836982, -2699387, -497142, 152471, 6902013, 2443300, -1147830, -2810519, 1076426, -2486249, --2103460, 4481799, -2270427, -5364951, -1582696, -4043712, 474594, -4973036, 132070, 3280281, -1027571, -4772246, -1591822, -15162845, -656056, 2622615, -18586470, -4884452, 13973676, 18176302, -12863964, 33918432, 20459614, 30734786, 11473468, 8098698, -15880642, 17249126, -5807870, -1944010, --12717398, -8469139, 16666621, -5459977, 37801080, 17586280, 10907606, -2025614, 8740258, -5952288, --17648020, -8929774, -10954851, 7961796, -10329933, -240518, -11054172, 6462852, 15375983, 13875429, --917512, 20068234, 16767552, 776852, -5844914, -7678865, -13762149, -4740570, 31645320, 12263742, -36429376, -11755862, 178778, -1249836, 8490077, 29227790, 10013716, 685584, 18793166, 21525840, -22746684, -2079838, -13453448, -4963372, -3721052, -3903052, 15076409, 10272488, 14307610, 21824876, --13634911, 33022392, -22205518, -41686416, -6451041, -13026636, 8483097, 20070382, 9831717, -11284490, --1157494, -12253005, -9141301, -6086506, 146029, 16591459, 2797634, -4753455, 2595234, 1198296, -4977330, 5256503, 3610457, 6459631, 1759863, 4041564, 1486596, 4487167, 281320, -13478144, --5193153, -203474, -12532715, 1315871, -13085155, -6942278, -7946763, -7408819, -6205154, -4610648, --1757715, 686658, 3749507, 13699872, 1863479, -8791798, 3986267, 739271, 12447889, -2435783, -5368172, -183073, 152471, -6765111, 1567663, 19730542, 32081258, -15973520, -12649216, 11539503, --9678172, -1759863, -4604205, 4307316, 13931800, 15108084, 22198538, -24516748, 27394376, -9978820, -2238752, -12761958, 11186779, 20806432, 8209293, 3804267, 1101659, 25347824, 5884105, -907312, --8772471, -3947075, -26498874, -3599720, -13099113, -31496606, 2261837, -1967095, 12401181, -32803886, --6856379, 7595650, 11649025, 27161374, -7959112, 7848516, 14397804, 2156074, -4278325, 7612830, --7733089, -1954747, -41375568, 3495030, -17905718, -20571820, -23301808, 9123047, -37110664, 11976516, --14190572, -18493056, -25390236, 22433152, 24042690, 23934778, 4673462, 4292283, 22550188, -31660352, --3110093, -9846749, 12774843, -37597068, -12916577, -3998078, 12001749, 9401147, 7701413, 15008763, --14020384, 5413807, -16923244, -5115843, -10146323, -4095788, -3449933, 339302, -16036334, 7198902, -10072772, -1859184, 708670, -7982734, -2457795, 7590818, -10342818, -330176, 5087926, -12929462, -5879810, -11598022, 161598, 7072201, 1734093, -9529459, -6155762, 3522947, -5207648, 5723581, -4128001, 6620692, -831076, -8361765, 15768972, -7585986, -3729642, -10286447, 7064685, -3578245, -1049583, -9552544, 1315334, -11581379, -1762010, 8296803, -2597382, -4982162, -11967926, 1278827, -1671279, -1708860, -15724949, -29685204, -508954, -10645076, 35097936, 7238631, 24832964, -8207146, -33889440, -21368536, -39864276, 8912057, 6784975, 4458176, -19804632, -22680648, -17671642, 6529961, --17798344, 7742216, -9429064, 26486526, -8644695, -4107063, 19191524, 502511, -47707424, -19927038, --618475, 31363462, -3586835, -9955734, -27341224, 4662724, -6725382, -23638964, -27862526, -3320547, -5139465, -9686762, -10590852, -27994060, 18308908, -7005092, 6600828, -13974750, 645319, 8204462, -5087926, 24563992, 282931, -8551817, -31996432, -11366631, 15516643, -21997212, -11142756, 8054138, -17660906, 13689135, 35170952, 26749594, 545998, 20287278, 20901996, 7049652, 867583, 12153147, --10367514, 52977884, -24337970, -57962196, 15452755, -49343268, -1852205, -38631084, -208843, 47165720, -5975910, -22531936, 7546258, 7988639, -14630269, -12110734, -16559783, 3577708, -4956929, 15097884, --11873437, 10084046, -19931870, 5571110, -594316, -3299072, -4466766, 13688598, 26311506, 8188892, -10746008, 18114562, 5619428, -18118856, 5374078, -6723235, 12215961, -3775813, -5533529, -699006, --1116692, -4869956, -14800457, -9791989, -6487011, -821413, 2255395, -1079647, -9324911, -21337398, --13205951, 3221226, -3616363, -363998, -8010651, 2889439, 15586973, 22196390, -33643016, -22378390, --13894756, -11812234, 13532368, 21005074, -12352326, 1401233, 18748070, -37948184, 2807835, 8895414, --28625420, 14829985, -9529459, 13083544, 4926328, 14744623, 1601486, -18551038, 19217294, -24177982, --5263483, 46826416, -19209778, 17155710, -11143830, 19280646, 17578764, -6142877, -20535312, 21822192, -56761752, -31099858, 8083129, -41275708, 20882668, 12561706, -22362284, 24776592, 2326262, -49561776, -7115150, 2437931, 22624814, -6068789, -3517041, -26039850, -25353192, -13006772, 61872224, -9445170, -31392990, -27589260, 20635708, 10126459, -5737540, -21209086, -3994320, 17467096, 34744136, -12600360, --11752104, -3676492, 6750615, 30302604, -7772280, -7151121, -22580790, 6922414, -33956548, -15060303, -24060406, 29272886, 3183645, -2407866, -16000364, -26006564, -75670880, 47162500, 17790292, 27098022, -2528125, -24554328, 26897232, -15198816, 11291469, 16125455, 15526307, 36418640, -847182, 8532489, -9896678, -4041564, -16102369, -5248987, 26419418, 16446504, -15081241, -3214783, -10317048, -2556579, -12238509, 3727495, -17627620, -11221676, 16503412, 3945464, -5461588, 8711804, -14943265, -8936216, --3258270, 7350837, 11587822, 7709467, 2061047, 9363566, -7693897, -9805410, 1564979, -897648, --13457743, 1679332, -13877576, -437550, -8571681, -1910187, 1918777, -6945499, -13305272, 4551055, --31807990, 22220550, 21751862, -43097312, 4054449, -22642530, 2678986, -47445968, 47571056, 41485624, --4387309, -21644488, -7651484, -8674223, 23008676, -23731304, 29713120, -39672076, -23148264, 11316702, -13903883, 3226057, 13415867, 37796248, 10726144, 17438640, 4473746, 18121540, 12714714, -8483634, -3597572, 15348603, -1249299, -1291175, 29995514, 13561359, 39421356, -3609920, 22382148, 76773, --29171954, 29642790, -15525233, -3309809, 8916889, -27454504, -18797998, 10682121, 42872900, 23561654, -15326054, -55531780, -13184476, -38933880, -643708, 62310848, 40700184, 47144784, 3403225, -45712948, -13918915, 46402288, 9426379, -11597485, 40969692, 4475893, 27273042, -71105328, -59337656, 42417632, --3412889, -19128710, -45552424, -9834938, -17335024, 19345070, 17545478, 21181168, 21359946, -8960376, -6391448, 39303244, 35907536, 37963752, 2749316, 54546084, 26808112, -9649181, -22009560, 356482, --11060615, 3264712, 27307938, -4347581, 783295, 20216412, 21825414, 2170569, -335007, 8651675, -24212878, 8710731, 11110007, 16809428, 5526549, 13085155, -1091459, -7335804, -3681324, -2784750, -560493, 17379048, -7113540, 3092377, -14690399, 21027086, 9691594, 9207873, -744103, 10626286, --492848, 36010616, 8745627, 36971080, -10502806, 32345936, 14306536, 4809290, 13544716, 13940390, -15251429, -4179003, -3431679, 22141630, 7098507, 18557480, -41175316, 24273008, 32386200, 2456721, -11021423, -29346974, 22852448, -13363791, 10912975, 1036698, 19327, 19361176, -6084358, 12590160, --4152160, -23579908, 6185290, -1675037, 26213796, 22939958, 32615444, 10851772, -25177098, -20745766, -21117280, 23796804, 10908143, 2024540, 7403450, -6601902, -20691542, 3406983, -7768522, 28973850, -20142860, 17634598, 22867480, 23528368, -32815698, 35817880, 35139276, 25769266, -17738214, -15741055, --22891102, 31170188, 18099530, 51268488, -31512712, -31134754, -24165096, -45616848, -12074764, 48965312, -7594039, 38413112, -41380400, -44177496, 9360881, 27761058, -38723964, 5842230, -30897458, 12018929, --35630512, -2998961, 16548509, 17570174, -32432372, 12471511, -24741160, -48967460, -1893544, 57471496, -29600378, 23128936, -16416439, -41552196, 62444528, 50470160, 13957033, -56674776, -2509872, -13545253, -39873940, 20218022, 24595130, -29634738, 21718576, -13487271, 14112726, -20644298, 6862821, -23065048, -32503238, -6865505, 5064304, -39576512, 11009612, 4498442, -2161979, -9210557, 7613367, 3672197, -3745212, -24717536, 9851581, 24244016, 1200443, 14372571, 12229383, 9848897, 1277753, 4352413, -145492, 781684, 715112, -8305930, -1256815, 7190849, -510027, 14938433, 12799003, -7672959, --1752884, 6525129, 2703145, 11332271, -22984518, -694174, -79154640, -16244640, -1588064, 929324, -28145458, -73983496, -7981660, 33414308, -54089744, 12233141, -11969537, 63461900, 34058552, -38953744, -10023380, 42640972, 4799089, -17157858, 14532022, 10115185, 6061810, -978716, -3820910, 3113315, -7431904, 14463302, 44455596, 35030292, 38927972, 26049514, 48906792, 23327042, 49993956, 20117626, -44395468, 308701, 27731530, 24234352, 27482958, 20365662, -1562294, 7747584, -33315524, -20480014, -64636036, 454730, -25248502, -7547868, 20571282, 33472828, 69519952, -9709310, -37630356, -19524384, --27636504, 38994544, 45439680, 50070728, 16064788, -2220498, 34537444, -58406724, 53204980, 19619410, --27460948, -916976, -89874872, 1739462, -59278064, -83143584, -20219632, -49039400, -20733418, 93315680, -85899880, 80006648, -62914292, -6905234, -6849399, 62816580, 99470904, -22505628, -27606440, 54484880, -56768732, 48099876, -5412196, -8247948, -27082990, -34965864, 5380521, -13127568, 15557445, 23420994, -21088290, 13959717, 1753420, 8894877, 26866094, 4118337, 478889, -7937637, 1828582, 1387274, -7537131, 5037997, 5732171, 27032524, -2090039, -16770774, 17119202, 19532438, 4969277, 31452046, -7836705, 15003931, 35155380, 46214384, 34398392, 24540906, 10384694, 4293357, 13889924, 31556736, -14361834, 32364726, 24591372, 15343234, 23153632, 8039105, 31336618, 26750666, 22392348, 33341294, -19667728, 5961415, 9709310, -2107755, -22002580, 56847112, 69080256, -57219164, -52486648, 17656610, -60392072, 1500554, -28310276, 198105, 16386374, 18122614, -49956376, 18570364, -6671695, 26362510, --27431420, -13207024, -32142998, 33925408, -4631049, -15008763, -30055108, 22009024, 12994960, -5214091, --25402048, 11867532, 11246372, 5983427, -22446036, -3255048, -1127429, 25933012, -19564112, -4788889, --28610388, -7552163, 9898826, 22755810, -29768418, -11396696, 31729070, 27133992, -8332774, -19236622, --117575, -9833328, 26509612, -15188078, -8351564, 12783433, 9634149, 16147466, -14537391, 4549981, --20034412, 23108534, 27416924, 12940736, 4297652, -21497386, 24371256, -17301738, 37715720, -27625230, -30324616, -47564080, 32136556, 3982509, -2681133, -33478734, -9868761, 10799695, -8426189, 3176128, --8140574, 9375914, -4048544, 10499048, -10262824, -14388677, -8955544, 9967008, 907312, -1335735, --2332167, -8002061, 5114233, 11665668, -5901822, -1598802, 928787, 1498944, -416075, 1983201, --1862405, 8404177, 494458, 10920491, -9787694, 1720671, -4374424, 11011222, -11770358, 10837276, --12136504, 7205882, 3956202, 13742822, -2973728, 12987981, -11793980, -9912248, -1642288, 21188148, --10055055, 16264504, -5548561, 1988570, 2758443, 11350525, -4669703, 5546951, 2703145, -340913, --303869, 3527779, -753230, -7945690, 15497853, -9450002, 3040837, -7713225, 5412733, -7363185, -8406325, -10912438, 12682502, -10239739, 10908143, -13741748, 12432857, -17282948, 16669842, -10912438, -12116103, -12826383, 12898861, -13064217, 13468481, -12328704, 12906377, -1834488, -12327630, 55091544, -58628452, -34500400, -20433844, 11623255, 55989732, 34782256, 20864952, 20065550, -8914205, -23431194, --7089918, 13153874, -201863, -5521718, 16703665, 287763, 11773042, 1440425, -6261526, -20995410, --5571647, -1232119, 1549946, -834834, -17056926, 19036906, 3177202, -7669201, -431107, -593242, -267899, 12286828, 22577032, 9623948, 2281702, -8135742, -11688217, -3038153, 7333657, 15127949, -20376936, -11381663, -11236708, 2535105, 20598126, 9284646, 4589710, -9316858, -18702972, 15938624, --3294777, 439160, 1076963, 5127117, 4919885, -2278480, -689879, -12202539, 1863479, 10739029, --5116380, 6410776, -3613678, -8699993, 5507222, -1663226, 2973728, -677531, 9336185, 6327024, --13952201, 4097936, 652298, -25302190, -33618320, 947577, 1952063, 7640747, 20444582, 2226404, --9027484, -8836358, 8041253, 8783745, 13336947, 9087614, 550830, 3866544, -1452236, -10162966, --4238059, 1527398, -13945759, -13342853, 8559333, 9092983, -239444, 10229538, -14554570, -2658585, --706522, 702764, -4516158, 2281702, 7823283, 10872710, 5285494, 9152575, -5833103, -11419781, -6654515, 1043140, -2829847, -19475530, -72702520, 30869540, 112121728, 103376640, 88251376, 35198332, --83727168, -52414708, -75270376, -84359064, -75414792, -21974664, 16316044, 63572496, 66234300, 79306032, -52545704, 52977348, 1327145, -55736328, -53213036, -65630320, -51317344, -28585692, -1910724, -18420040, -19964618, 24577414, 39879844, 43765716, 44487808, 26479010, 2260227, 11756399, -9773735, 6290517, --30415348, -22144314, -28126130, -46028092, -36479840, -27997818, -19729470, -32735166, 4567698, 55819004, -63122596, 35201552, 66001836, 16328392, 38527468, 19775640, 11336029, -16616155, -35194572, -48300664, --67775656, -52025476, -77321224, -32064616, -34410204, 22165790, 22261352, 64661808, 74585864, 66357780, -59155660, 57766772, 36196372, 4397510, -20207822, -61877056, -38763152, -80816256, -68845640, -95841120, --15478525, -8628052, 23637890, 30262876, 54630372, 64190972, 53781580, 47953308, 35622996, 20949776, -2993055, -17894982, -25680146, -34675420, -53434224, -37612640, -46520940, -32430224, -16580184, -4850092, -10570988, 10211285, 51095616, 47026672, 46680388, 36334348, 26716308, 3124589, 16617228, -18558554, --30644054, -23951958, -66360464, -77450608, -14915885, -5276368, -3333968, 37687264, 30925912, 41136124, -28893318, 37585796, 11504607, 9670119, -2896956, -16013249, -20494510, -26574574, -29343216, -18138184, --3783866, -22975928, -12064026, 18245022, 26132192, 17448842, 22638772, 15371151, 11236171, 2847027, --2025614, -8031052, -11204496, -8782134, -14011257, -7438347, -2748242, -5360119, -7111929, 1508607, -5422396, 1076963, 8237211, 10339597, 7846905, 5226975, 4565014, 1374390, -846109, -2950643, --749472, -1116692, 394063, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ --5164698, --5280663, -4364224, 1209033, -2503966, -403727, -715649, 2529199, 10109279, -2704756, 1017907, --9630927, -5260261, 2934537, -4578435, -3572876, -1351304, -4069482, -1078037, 8386998, -3602941, --5373541, 9064528, 7254737, -2560338, -1684164, 8297340, 2359011, 3218004, 1600412, 406411, --2125472, -3496640, 3287261, -2604898, 2456185, 892816, 944893, -1161252, -2853469, -2236604, -2024540, -2574833, -4070019, -1833951, -1820529, -5180805, 5861557, 9061307, -5214091, 2957622, -249108, -2033667, 1434519, -224412, 73014, -3033858, 5602785, -3324305, -4108673, 4664335, -1422171, -243739, -525060, 2563022, 161061, -72478, -1610613, -806917, 4923107, -7191923, -2446521, 1323924, -1751273, -1719061, -2513630, -3659849, 26307, 3533148, 3607236, 1052267, --71404, 818191, -2007897, 2629594, -999117, 1547799, -1121523, -719944, -543850, -654446, --526134, 1214402, -60666, 501974, 730681, 446677, 1257352, 1592896, -529355, -365609, --716723, -491237, -1016297, -297963, -679679, -553514, -1034013, -404264, -120796, -15923591, --2515240, -5817533, -1432372, 1287953, -4342212, -9705552, 7114077, -2382633, 1655710, 4764193, --1515050, -484258, -594853, 2194192, -1686312, 8014409, -334471, 6182606, 9060770, -10877005, -2276870, 7559143, 517007, 1507534, 5228049, 9669045, 1378148, -2173790, 4861903, -1293859, --2525978, 2180770, 1714766, 2157147, -2729452, 9852655, -4554813, 2486249, 3668439, -44560, --489626, -4807679, 774168, -5570573, 4669703, -5690832, -4379256, 3150896, -5315559, 3637837, --3714610, 1527398, -3001645, 2021319, 4275103, 8393977, 2563559, 949188, 4071629, 61203, --7271380, 961536, 2022393, 2759517, -1843078, 378494, -1017907, 1377611, 4027069, 2439005, -5508296, 1905892, 712965, -3372086, -1745367, 3255585, 2514167, -3229279, 3841312, 1887101, -4202089, -1324997, -1045288, -1329292, 164283, -823560, -3426847, -629750, 524523, 561567, -2156074, 239444, -689879, -840740, 887985, 462783, -1699196, -253403, -166430, 9664, -624918, 177167, -814433, -112206, -774705, -5814312, 4338991, 2779918, 909996, 5433134, --250719, 3033858, 7473243, 4580046, 9787694, 1858647, -1396401, -10006200, 1614908, -6145025, --2001992, 744640, 2294586, -3857418, 43487, 9574556, -4866198, -281320, -4858682, 2309082, -92879, 1840394, 3964255, 4598300, -2864743, 3444564, 3626026, 6920803, 309238, -6834904, -705448, 7337952, -680215, -482110, -973884, 4927401, -5719823, 463856, 3823058, 4931696, -5974300, -2253784, -3844533, -517544, 8568460, 777389, 3119757, -6955700, -3063922, 1665911, -1470489, -1204202, 4556961, -328565, -900869, 2520072, -4327180, 261993, -649614, 2965675, -4611721, -6755984, -1479079, 2169495, 4545686, -2900177, -2738579, 1858647, 5379447, -484258, -3623879, 2540473, 3714610, 1539209, 4140349, 6189048, 268435, 1728188, -1686312, 2516314, -1829119, -1189169, -2768107, -532576, -1955284, 644245, -1786706, 780610, -802085, 431644, --1446330, 33286, -122943, 303869, -861678, 1378148, -1296543, -574989, -569083, -708133, -188979, 775778, 824097, 443992, -379031, -293132, -598074, 1865090, 17311940, 8404714, -6822556, -6437619, -1139777, -8984535, -6423661, 9649718, 870268, -6069863, -2829847, 2077690, --5754183, -504659, 9802189, 3937948, -407485, 3163780, 14374719, -9554155, 2294050, -1775969, --4651450, 8284992, 4198868, 4308389, -3220689, 3723200, 4744328, -1439888, 3044058, -948651, --4101694, 875636, 1537598, -690416, 4865661, 1224603, -1761474, 5410048, -2463701, -2514167, --3123515, 1537061, 2062658, 417149, 3864934, 543850, 12164958, 824634, -10737, -2801393, --2543695, 2944737, -9060770, 401579, 5428302, 4342749, -4894115, 7196755, 117038, 3234110, -5724655, -1598802, 4430796, 3469260, -1580011, -5140002, -3949759, 3266860, 8138426, 2349884, --3546569, -1714766, -2012192, 5631239, -4754529, -243203, 4618164, 5389110, 736050, 701690, --1488743, -2218351, 91268, -496606, -1889786, -364535, -863825, -909996, -1454383, -704912, -1898912, 1318018, -386010, 2492155, 724776, 1020055, -323733, 864899, -438624, -192737, --103616, 308701, 302258, 714038, 1339493, 363998, 152471, -387621, 4168266, 1124208, -11323144, 2839510, 6747931, -285615, 1494112, 1918240, 1879048, -1853278, 6899865, -2887292, -7465727, -3646964, -2896419, 1982664, -4941897, -1387811, -1559073, 2131378, 3102040, -1952063, --7233799, 3316789, -8745627, -3498251, -1490891, -170725, -1377074, 1742683, 7825431, 4459250, -524523, -8110509, -7833484, 304943, 5274757, -2754148, 819265, -964220, -3478924, -5196911, -533650, 3579855, 7546258, 6851547, -881542, 2225867, -9480067, 3272765, 6285685, 7184944, --890132, 6554120, 1387811, 9525164, 5606006, 1848447, 4285841, -399432, -2490007, -1656247, --972273, 5987185, -2294586, -3342558, -4163971, 5974300, -1450088, -10421201, 2066416, 3974992, -5840619, 7590281, 12934294, -5417028, -4456029, 7670275, 8082055, 6387690, 2721936, -1342177, --1489817, -5053566, -5680094, -1588601, -2062121, 1684701, -248571, -1664300, -248571, -3152506, -656056, -442919, 1454383, 173409, -2415919, -227096, 233002, -433255, -240518, 1097364, -2097555, 2097018, 1723893, 424128, 413391, -3248606, 122407, 2185065, -1479079, 1174674, -244276, -959388, -792421, -464393, 2178085, 1589138, 307627, -273804, 1178432, 27917, --15039365, 7305740, 10304700, 1391569, 8577050, 1213865, -7689065, -693100, -3589519, -1860795, -7918309, -10275172, -2876554, 3640522, 4048007, 9364102, -1840930, 4071629, -14623290, -7401840, -3741454, 8688719, -5695127, -4047470, -6104759, -7319161, 3848828, -869731, 73551, 2781528, -1335735, 2900714, 11344619, -6832219, 11009612, -573378, 2251637, 2478196, 2393371, -3285650, -3829500, -7754564, -1482301, -4207994, -821949, -5750961, 7014756, 1275605, 19427748, 658204, --1245004, -4881231, 859530, -4081830, 10153303, -6230387, 1345399, -11327976, 8524436, 7881802, --9410810, 5788006, 5840082, 2471754, -5100274, -5148055, 8552890, 2252710, -12378633, 5975910, --5877663, -3145527, 2798171, -3044595, 1105954, 2550674, 3334505, -6396280, -15683610, 2332704, -3517041, -431644, -3372623, 6241125, -2672544, -1954210, -2906082, 4170413, -5077725, -1949378, --2887829, -2078227, 1272384, -1877438, 2687576, 448824, -4516158, 3367791, 430570, -2252174, --143881, 3042984, 965831, 207232, -406948, -754304, -2397666, 266288, 656056, 369904, --248571, 1436130, -2713346, 363998, 504659, -2941516, -2690260, 6612102, 1274532, -119722, --5582384, -9362492, 3314641, -5018133, -2030446, 9084930, -12360379, -5135707, -9107478, -914291, -7807177, -711891, -6442988, -8927090, -10039486, 3926137, 10618770, -3029563, 6634651, 10001905, --2765422, -2290828, 3911642, 5568425, 11857331, -1704565, 6666326, 980863, 14098767, 10380936, -2838974, -3304977, 1425392, -7799661, 13688598, 3195993, -6035503, -6686191, 7895761, 6681896, -4801237, 3433290, 2346126, 7102266, -3060164, 3142306, -4685273, 692564, 386547, -7100655, --9505299, -3357591, -6712497, 4333622, -4095788, -3029026, -10366977, -6509023, 1992328, -3527779, --1238561, 5000953, 10394358, 13119514, 6818261, 5440113, -4825396, -10653130, 191126, -7451232, --17244294, 167504, -1206886, 6452115, 4346507, -4205310, -9605157, -5207111, 4655208, -212064, --1064615, -3961571, 2134062, 2211371, 1743757, -1006096, -5465346, 1172526, 727460, 553514, --1229971, -654983, -732292, 702764, -2670933, -2738042, -281320, 354872, -2218888, 215285, --436476, 2080375, 2761664, -2954401, -98247, 2177549, -355409, -1228361, 513249, 333397, -2995203, -905701, 1930588, 1529008, -1272384, -19889456, -6159520, 1097901, 9682467, -6976101, -4719632, 3107946, -425202, 14606110, -1981591, 13746043, -8120173, 4037269, 4322885, 172336, --12585328, -5190468, -4717485, -14260365, 4838281, -3547106, 2997887, -890669, 5143224, -18254, --5609228, 2976949, -9208410, 6774774, 3934190, 15636365, -694174, 472983, 14251238, -12618614, -11056320, 13591424, -8531416, 8753680, -3686693, -4105452, -7165616, 1801739, 1609002, 9666361, -6178848, -2490544, -4061965, -8215736, 4461934, 5127117, -9469329, -4237522, 8773544, -15460272, -1395328, -11942157, 6694781, 660888, -284542, 3613141, -4109747, 1374390, 14190572, -5872294, -3059091, 6936372, 4316979, 763967, -7569343, 3322157, 2727304, -4369593, -12232067, 133681, --2835752, -9647570, 7261716, -2626909, 2643016, -384400, 1338956, 3073586, 2940979, -5389647, -1317481, -536871, 1190780, -430034, 3598109, 1821603, -941135, -666794, -5297306, -205085, --3633542, 632434, 558346, 3815005, -5597416, 2071248, 2968359, -2103460, -3488050, 1242856, --534723, -2035815, 1637993, -435402, -2189897, 775242, -759672, -2489471, -726386, -1608465, --3372086, 1588601, -1048509, 318901, -1857037, -375810, -1897302, 903554, 3562139, -462246, --8130910, 23639500, -8790724, 4570382, 3400004, 8419210, 2654290, 5099200, 11809549, -9150965, --5607617, -773631, 16428787, -6362457, -6991133, -8174397, 4060892, 2719788, 8990977, -18778670, -177704, 372588, -1273995, 9614821, -2339684, 7408819, 13788456, -10047002, -4498442, 3905199, --7522635, -9483288, 6360310, -8811125, 12965433, -2238215, -13352516, -1788854, -7668127, 4217121, -10574209, -227633, 5346698, -678605, 2052994, 12578349, 383863, 9117142, 3606699, -6868190, -7128035, 6080063, 837519, 5104032, 18076980, -3021510, -8139500, 4275640, -10300942, 784905, -17265232, 5844914, 2717104, -3312494, -4956929, -3350075, -6121402, 10394358, -6852084, -1843615, --4275640, 11798275, -21734682, 7412040, 7646116, 13055090, 3090766, 976568, 11508365, -3277060, --4993973, -6540699, 152471, -5443334, -554051, -4685810, 3768834, 332860, -4172024, -4401805, --3684008, 1382443, 4495220, 3598109, 767725, 248571, -1930588, -4763119, -1593970, -1242319, -1947768, 1985886, -804233, -1186485, 922344, -2862596, -17717, -2778307, -1403381, -3652333, --4912369, -1381369, 1669132, 5435818, 869731, -1530082, -1464047, 2123325, -534187, 5212480, -2355790, 895501, 725313, 34939560, 10427107, -6367826, -8485782, -7148436, 25313464, -21814676, -1736241, 8544837, 1263794, -11826729, -2675228, 5937793, -1267015, 1379758, 10500658, -10865730, --9128416, 4481262, 13687524, 8437463, 3535295, -6630356, -6481106, -6238440, -7269232, 6780680, -2692945, 9716290, 7793218, 4442070, -10310069, -4900021, -10983305, -2176475, -7205345, -16588237, --3091303, 7419019, 1648731, -7692287, -7758859, 200790, 4014721, 10392210, 1321239, 5272609, -1505386, 20076288, -17413944, 11400991, 2137820, -17765058, -3208878, -5350456, -4395362, 2737505, --7778186, 4702989, 3416110, 7965554, -9700184, 3445101, 15538655, 7285875, 24688008, -5513128, --612570, -6058588, -3103114, 680752, -490163, -23398982, 10436234, -974421, -1369021, 6361384, -6286759, -6626598, -9969156, -10900090, -4052839, 7755637, 3302830, -2535105, -6440304, 5695664, --10128070, 5316096, -1657857, -4576288, -5724118, -6206228, -2240362, -2061584, 987306, -2585034, --1751810, 1296006, -1858110, -1729798, 1079111, -5070746, -2312303, -344134, -1725503, -2898566, --1293859, -5149666, 733903, 3871376, 5210869, 6117644, -4432406, -5425618, -3849365, -4905390, -189515, -3221, -3009162, -3422015, 1322313, -449361, 3399467, -1048509, -244276, 2638184, -2640868, -2114735, -11694659, 2843805, 6362994, -243203, -7185481, -4986457, -15532749, -18456548, -3832185, -8178692, -3895535, 2718714, -154082, -1928977, -8236137, -4085051, -78920, 6484864, -6908992, -10136660, -5816460, 6388227, -9084930, -4459250, -14879377, 14408542, -1874753, 12981002, -1136019, 4871567, 13790066, 10425496, -6122476, 3144453, 7012071, -7361574, -2997350, 6833830, --2533494, -16526497, -3071975, -11578695, 16992502, -1793149, -4510253, -9711458, -14173392, 5083094, -3005940, 3346317, 6994891, 165893, -2583423, 7320772, 1869921, -1395864, 2575370, -4088272, -11229729, -2650532, 7085623, 20964272, 4675072, 3940096, 4909685, 7736847, -18246632, -14768245, -5623186, -16119012, 11164231, -2274722, 12790949, 3379603, 24937654, 9793599, 1698123, -7245610, --3214783, -12823162, -864362, 4001836, 2505040, 2726767, 4408247, 11380590, -4733054, -9228811, --3208341, -2564632, 3582003, 10326712, 3652333, -2489471, 2977486, 3029026, -532039, -2386928, --6010807, 404264, 677531, -2933463, -3977677, -758062, -6374269, 4471061, 2538326, -2997350, --971736, -6331856, -3103651, 2927020, 5541582, -2783676, -2572686, -117038, -5087926, 5395016, --255551, 3885872, -5263483, 2147, -5453535, 3192235, -6471442, -1468342, -29772714, -20850456, -7736310, -8304856, -17219060, -26137024, -636729, 2084670, -5068062, -4174708, 24928528, 6541235, --18026514, 3772055, -11000485, -9253507, -8932995, -16099148, -2659122, 1484448, -22169548, -20992726, --7975218, 3473018, 2067490, 12719546, 10765872, 6688875, -5337571, -207232, 4920422, -11369852, --6338298, -3879429, 3765613, -10681584, -6524056, 7300371, 4422743, -289373, -1639067, -1995012, -6086506, -15381888, -8764418, -7573101, 10205379, -11923366, 8106214, 13665512, 18722300, -1245004, -5389110, -4438849, -8930311, -11724724, -3157875, 11559368, 4350802, -20989506, 932545, 21721798, --14421963, 702227, -3074660, 1158031, 5168457, 11077794, -2291365, 3519726, 13302051, 9145596, -5862094, -10174241, -12241194, 8949638, -8856223, -16772384, -16106664, 17553532, 6687801, 9696426, -4167729, -2764348, -3377992, 8375186, 5939403, 1578937, 8072928, -3217468, -10566693, -5459977, --7362111, 2961380, 10699300, 5208722, 1300838, 6330782, 3520263, 5902896, -1120987, -3029026, -3640522, -1319629, -4087198, -3486440, 2825015, -9766756, 2155537, 5728413, -3436511, 7086696, -4866198, -408559, -765041, 6680822, 835371, -1545115, -4248797, -4181151, 1176821, 3521873, -810138, 2835752, -4233764, -17400524, 9601936, -14085882, -25107842, 4529580, -15264851, -8873402, -29669634, 2012192, 22216792, 19985556, -4006668, 21046950, 29132226, 20708184, -26051124, -3484829, --12106439, -12274480, -7500624, 515396, -10737955, 22725208, 6759205, 12466679, -10641318, 11932493, -9197672, 3048353, -13553843, -10558103, 21646098, -3964255, -20181514, -1387811, -23359254, -3383361, -6509560, -8392903, 530965, -19084688, 8774081, 17273284, 9382356, -2563022, -9338870, -3512210, --2334315, -3262565, -8744553, -23447300, 15851651, 8881455, 8294656, 9895605, -13285944, 20645908, -2627983, -6268505, -4575751, -16509854, -7232725, 10650445, 6643778, 17648558, -1871532, -20278688, --35497904, -2130841, -212601, 100932, -12767864, -17945984, -3372086, 11805791, -6208375, -7289633, -4751308, -1646583, 18090940, -3612068, -16012175, -5797132, 16850230, 1021665, 3237869, -16410533, --5769752, -3142306, 6805376, 8696772, -4284230, 2986076, 712428, 6495601, 4323422, -723702, -2961380, 8722005, 2180233, -216359, -2881923, 927713, 5840619, -260919, 2986076, 9979357, -1510755, -3520263, -7405598, -883690, 5425081, -5223754, 2783676, -2385854, -1562831, -3504693, --4445291, -3450469, 93952, 6280316, 4969814, -6806450, -12377559, -3730179, 4645007, 1607392, -1684701, 37877852, 23890218, -3391414, -22062174, 4642323, 11000485, 6338298, 16076599, 24128590, --10647224, 1986422, -21566104, 6106370, 1780264, -8370892, 38863548, 14725295, 33534030, 13840532, -8651675, -29221884, 453119, 16292422, 2973191, -15559056, 6578280, -23782308, -9280351, 1627793, -7168838, -7129109, -4619238, 5145371, 4206384, 1707786, 21058224, 13070659, 3469260, -8439074, -14505178, -9439801, -6766184, -13874355, -4610648, 18073222, -28563680, -449898, 12827457, -14266271, --4476430, 5426691, 4828080, 26370026, -1513976, -310311, -12306692, 25781614, -11483132, 3244311, -2716030, 17848274, -4158065, -6463926, 17011292, -28702192, 7487202, 2734821, -11882564, 22923852, --28660316, -3653944, -9574019, -19267224, -9622874, -1725503, 8173860, 18004502, 29734058, 14484240, -19653234, 29898342, -12160126, 5496485, 7538205, -12801150, 17311940, 325344, -22891638, 11998528, -6367826, -8407935, 818728, 17670032, 13395466, 3924526, 10576357, 3118683, 3469260, 9690520, --1710471, 4107063, 8705899, -2138894, 1941862, -1613834, -450435, 6095096, 1254667, 624918, --5310727, -3214246, -3661997, -7601019, 1700270, -4211216, -12054899, 4617627, 7326678, -2537789, --66035, 3217468, -4123169, -179852, 12861280, -1973001, -3508452, -8126615, -36710696, 10171556, -1933809, 44338020, 10126459, 8335458, -1217086, 21625160, 5837935, -32502702, -4989679, 34774740, --10302553, -7322383, 2934000, -2404645, 790274, -6331856, 36215164, 41199472, -22152904, 10001368, -11093901, 6024229, 11705396, -18133352, -25047176, 19280646, 5299990, -13853954, -23944980, -7188702, --8129836, 21905944, 17905718, 10049687, -20271708, 11151346, -8780524, 7110319, 1222992, 9411884, -20657718, 4754529, -46166604, -14148159, 8488466, -18496276, 5632313, 19593640, 6591701, 34118684, --11280195, -51246476, -1175210, -20428476, 17841832, 15477988, -5579700, -10898480, 15847356, -24609088, --4381941, -13295608, 11635066, 16027744, 13698798, 14891188, -11087458, -20853140, -62065500, -29677150, --36113160, 5710696, -24471114, -11863237, -4971425, -26927298, 14452028, -48480516, 15113453, -34861712, --25249576, 24869472, 29388850, -9023189, -1177895, 15917149, 20725364, -28452548, 632434, 4664872, --4079145, 5025649, 15312632, -1948305, 6779606, -1288490, 5992553, -12577275, -6581501, -5733245, --8267275, -1796907, 12020003, 4991289, 10822781, 409633, -11414949, -10379325, 1824287, 6305012, --2348810, 6695317, 6998649, 16860968, 1670742, 5803575, 1850594, 4022237, -7407745, -2270427, -3103114, -6027987, 324270, -2760590, 727460, 3132642, 17623862, -1617055, -10432476, -11577621, -1161252, -654983, -18408230, -10794863, 7621420, -12106439, -596464, -156229, -48012364, -7062000, -31971736, -37949796, 3831648, 14191646, 513249, 9953587, -2724620, -30061550, -2397666, 16397111, -5628555, 24423868, 16665010, -25784836, -27793270, -3701725, -11957726, -3958349, -45888504, 17212618, -18356690, 32192390, 14751065, 29302414, -12561169, 4027069, 30209190, -9505836, 32866700, 9124658, -17428440, 5860483, -8250096, 16200617, -19801410, 970663, 41504416, -32154810, 3044058, -41823856, --18763102, -30079266, -20387136, -5272073, 2263448, -9893457, -31819266, -5771899, -52893060, 59782188, -21026012, 335544, -8057896, -14475650, 3353296, -26339960, 4893579, -39461624, 925565, 1983738, -8833137, 25245280, 36420784, 1227287, -61062624, -28090696, 26176216, -13350369, -12199318, -14823543, --8126615, 30103962, 6258304, -16962974, 12640089, -28330142, 4910758, -5402532, -12584254, -28603946, --16201690, 18023294, -8630200, -6966974, 9686762, -10672457, -3350075, 17931488, -21079700, -14323179, --6190122, -4446365, 22535694, 10470593, 6077379, 13298829, 5190468, -2282238, 10362682, -307090, -7587060, 10835129, 16944182, -6706055, -202400, -1986959, 12472048, 18976776, 6998649, -4677757, --1449552, -5891085, -13921063, 24271934, -7232188, 12452721, -7285339, 3755412, -7740605, -5648956, -6139656, 11019275, -23813446, 16870632, 27314382, 10059350, -12475806, -16615618, 7963406, -21450678, -33951716, 28268938, 43029668, -30693446, -37789808, -9505299, -860067, -19135690, 25312926, 30682710, --22688702, -96100, -40464496, -11968463, -19153944, -36564668, 11578695, 30144228, 18297634, -23775328, --9181566, 2764885, 20360830, 3022046, -1426466, 7614977, -2244657, -10299868, -32695976, -22230214, -8505646, -3078418, -17753248, 19326816, 17277580, 10951093, -33451352, -30587684, 29000156, 17449378, -21584358, -21837224, -55770688, -10562398, 23620710, 23345832, -5617817, 56500296, -6912213, 56797184, --85290000, -105902080, -43386148, -63807108, 875636, 24849608, 13223667, 68977176, -7704098, -4530654, -12991739, -13806172, -54291608, -48511656, -53821844, 43117176, 35483408, -13383118, -3497177, -90292024, -25307022, -1211181, -40127880, 16687022, 25985090, 39846560, 31456878, 14419816, -2608119, -26865558, -972810, 1273995, -7335804, -11595338, 32024886, 19575388, 12576738, 32408212, -24830280, 5915781, --6824703, -15564425, 20513300, -3256659, -35323960, -305480, 11375758, -12796855, 17024714, -6825240, -4684736, -7913477, 39586176, 30712774, 36688148, -30840550, -6812355, 37755448, 28139552, -26879516, --16406238, -27073326, -15752866, 22012782, 25238302, -8858907, -2379949, 42107324, 1942936, 3870839, --5374078, 7490960, 7435662, 6911676, 12130061, -40904196, 35690640, 27307938, 11113228, 33791192, --19881404, 12508555, -55881284, -26883274, 14597520, 20697984, 9382356, 7291781, 6860137, 14533096, --6864969, 63592360, 5640903, 39638252, 11272142, -18977850, 48298516, -6484327, 18911278, 1105954, -17250200, -1728724, -1136019, 10727755, 24185498, 7176891, 17641578, 1347546, -3755949, 38299832, -4248260, -7952132, 557272, -2905546, -19331110, -5403606, 10657424, 7203734, -43203612, -10433549, -5341866, 10067403, 44964012, 36821292, -44671956, -24469502, 3578245, -9774809, 49524196, 4932233, -45670536, -32140314, 22941568, 4731980, 2440078, 21342230, 46940772, 30606474, 6180995, 41668164, -16247861, -19504520, -42031088, 36837936, -33538862, 22298934, -44137232, 247497, -69940320, 72538240, --18022756, 2537789, -49000744, 44040596, -17169132, 13955959, -35976792, 42534136, -22251152, -19976966, --14627585, -26721140, 8227010, -14974403, 12597139, -13886703, 23209466, -26106958, 23255100, -27489402, -15067282, -32189170, 25649544, -11136313, 28478854, -9993852, 14898168, -12174085, 9595494, -13887240, -450972, -15177341, 17273284, 7036767, 4858682, -6087043, 1629403, -12139188, 9273908, -12473122, -21810380, -18148922, -21587580, -9779641, 8683887, -25661356, 19734300, -6396280, 10830834, -7355132, -6159520, -11854647, 5494337, -6161668, 6586869, -2030446, -69959648, -17481054, -5423470, 7377143, -6280316, -43545600, -25300578, 39353176, -15261629, 14516453, -17413944, 3847217, 49437220, 79685064, -5526013, -2837363, 40025872, 17437568, 16579111, 49334140, 1111860, 29862908, 36239860, 34775812, --13634911, 15024869, 31327492, 43588548, 35692788, 53609780, 30296700, 68462856, 72685344, 52494700, -57957364, 39460548, -4317516, 19306952, 10282152, -15044734, -14824616, 11349988, 33843268, 7661148, -1567126, -246961, 16729971, 50302120, 39168492, 84515832, 17067664, -43992812, 17541720, 770410, -17935784, -22649510, 33627984, -61435212, -79102560, 22014392, 79542256, 34493956, 15892990, -98717672, -569620, 37351720, 59565292, 79878872, -34011848, 4813048, -137941472, -91093568, 36843840, 51518668, --76838576, -65705484, -40889700, 75249976, 50280108, -90382216, -116525144, -23755464, 47414828, -55947316, -26495654, -8759586, -20204600, -30343944, 4111358, 11723650, 19552838, -3762391, -48289928, -41973104, -5063767, -13276281, 20141786, 2452963, -5114769, -18652506, -12259447, 7282654, -1210107, -40427452, --20327006, -30702574, -15854872, 5092221, -15647103, -11768210, -36083632, -48142288, -65935264, -66071092, --55643984, -47536700, -52207476, -52105468, -39735964, -54952496, -58031452, -49638548, -55778204, -36383204, --9934796, -32364190, -46662136, -31232466, 1142461, -17441326, -9554692, -11639361, 23698556, 25040196, -464393, 10836739, 12772159, 6851547, 7050189, -721555, 5334887, 3546569, -26832272, 66924716, -73720968, -83197808, -35548908, 33078228, -24147916, 16941498, -31431108, 28802588, -26725970, 7348689, --761283, -11534135, 5674726, 2480881, -8715026, -4887136, -21520470, -4489852, 3799972, 3595425, --21921514, 21182778, -20176146, -5640903, -17603460, 2993055, -16887812, 33927020, -1552631, 9757629, --9704479, 9730248, -10269267, 10424959, 19203872, 28381680, -8300561, 10233833, 9182103, 25043418, --15888158, 16487843, -14277545, 29874182, -8553964, -15360414, 8411157, -6183143, -9682467, 4290136, --3505767, 13379897, -7570954, -15469398, -16954920, 3473018, 2113661, -27666568, 7727183, -3479461, --3853123, 5896990, -9079561, -3933653, 1909113, -3633542, 2935610, -14471892, 17034914, -50247360, -25985626, -20885352, 33252174, -22040162, 29650844, 562104, 15607911, 10631655, 12477417, 7191386, -1176284, 6870337, -2205466, -20586852, -5639829, 2003065, -9874130, -3063386, -5733782, -1281511, -31675, -7158637, -1869921, 4156455, -1998770, -12339978, 13188234, -1280974, 6449967, -13164075, -5649493, -7670812, 4615479, -9127879, 10597295, -13894219, 20170240, -2819109, 1624035, -20899310, -14015015, 244813, 9783936, -19717658, 3899294, -7415261, 1806034, -2887292, 503585, -12394202, -5332202, -1301375, -10181220, 2428804, 15556372, -17833242, -470299, -5937256, 8320963, -11896523, -11062762, -9127879, 1496796, -5953362, 7838316, -1698660, 3164854, -2026688, 3651796, -5495948, -1864553, -1134408, -4429722, 1763621, 558883, 1500554, -1970316, 5234492, -1410360, 1239098, --4015795, 7402376, -9881109, 3321620, -13566728, 63551556, 38538740, -20952462, -24102820, -2110977, -78964048, 32992328, 11072426, 21859236, -19147502, -24171002, 6736120, 15329812, 3999152, 1391033, --8408472, -6551973, 7430294, 7575786, 18383534, 8181913, -9911174, -4369593, -4900558, -9990094, --111132, 1762547, 4896800, 6233608, 190589, -2652142, 7336878, -21195126, -8055211, 9429064, -13519483, 16762720, -9436043, -5490042, -10031970, 17145510, 11860552, -3246459, 5447093, -19815368, --17149268, 15821586, 12304008, 3881040, -30031486, -15439871, 1232119, 5002563, 19763292, 14129906, --2221572, 5811091, 7019587, -9388262, 8580271, 9309878, -2756832, -5729487, 5529771, -10052371, -937914, -1720671, -7056632, -10769094, 14936823, 3052111, 3304977, 20577188, 25031070, 8860518, -20255602, 18962818, -3000035, -5127654, -5709086, -3663070, 7902740, 12934294, -5031018, 3977677, --11625940, -4230006, -580894, 2756832, -6345814, -7573638, 7818988, 14970645, 6468758, 4148402, -6264747, -7205345, 578210, 7119982, 1388348, -2244657, 1789391, -739808, -8732205, 17752710, -5779952, -14215805, -13427678, 5395553, -2667175, 13997835, 7406671, -1797444, 5226439, 1792612, --2901787, -652835, -4051228, 4097399, 6420439, 991064, -1686312, -5567352, 4757213, -1108638, --22798224, -62870804, 21777632, 115624280, 90913184, 87067040, 27836220, -80922016, -48547088, -71734008, --71970232, -65578780, -22892176, 35391604, 45601280, 71744208, 64250028, 38718592, 6505802, 6344741, --31079994, -49118856, -70338144, -27018566, -19088446, 6362457, -3955665, 35748088, 24126978, 10302553, -47747152, 26851062, 20444582, -4118337, 17942226, -32363652, -24422258, -20158966, -23587960, -31040802, --18719078, -12353400, -31609886, -21826486, 8416525, 46592344, 44944684, 51084340, 40099964, 58400280, -10115722, 14999636, -38766376, -28661390, -24604794, -58137216, -57931056, -51942260, -24558622, -30415348, -7168838, 22622130, 32510218, 65351148, 64165200, 61452392, 55104968, 48260936, 10320806, -28279138, --46134392, -82390896, -70807368, -51601348, -70377336, -32615982, -14673219, 3161096, 69107096, 54202488, -79492328, 78556024, 57380764, 16109885, -15825344, -23417772, -27187142, -24218784, -46749644, -57812408, --40397924, -27568322, -24387362, 3126199, 16289200, 25919590, 22317724, 46600396, 50925428, 38513508, -30630096, 5166309, -10724533, -21898428, -35871028, -30802968, -21850110, -34409132, -46649252, -4879083, -2746632, -7626788, 40273372, 53151832, 34029564, 29905320, 2279017, 8497593, -5473399, -9287867, --23160074, -27224724, -17851494, -20332912, 2971044, -8076149, 2704756, 469762, 18398566, 9927817, -9543954, 17205638, 17582522, 109522, -4488241, -12349105, -12289512, -3447248, -2666638, -5901822, --5779952, 1298154, 1684701, -1341640, 3221226, 3459596, 3337727, 1105417, 11629698, 4390531, -126165, 2072322, 37581, -3620121, -3052111, -3062312, -1673964, -1042603, 250719, -383863, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ --3353833, --4174171, -6163278, 2082522, -3011846, -6083821, -3896609, 2767570, -7686381, -4258997, -9400610, -3266860, 4199405, 5347235, 2915209, -3289945, 7120519, -4875325, 1437203, 149250, -1025960, --5151814, -2640331, -5666136, 219580, -2408403, 3170760, 2100776, -2705830, -863825, -620086, --5200669, -219580, -1155883, 2308545, -92342, 4701379, -1673964, 5949067, -2576981, 73014, -958315, -4350265, 3022046, -1337882, -1668595, 486942, -1175747, 2273112, -9109626, 4215511, -5487895, 760746, 3119757, 1662689, -4031364, -573378, -4374961, 5931350, -1574642, -3770981, -3605088, -5532992, 245887, 2059974, -6214281, 675384, -1447941, -2442763, 2155537, 389231, -586263, -3024194, -1861332, -10088341, -1197759, 2073396, -1568737, 390842, 1290101, 5232344, -4606353, 168041, 1570884, 541166, -780610, -845572, -1255741, -816044, -338229, -1125818, --827318, -146029, 1069447, 539555, 754841, -1654636, 98784, -159988, -329639, -216896, -477815, -331786, 163209, -856309, -481573, -776852, 81068, -736587, 1043140, -14274324, --8556112, 1568200, -4616016, 865973, -4762582, -8206609, -5439576, 9281424, 5425081, -1457068, -6311992, 1466195, 1562294, 1750736, -3036542, -846645, 5133560, -4137664, 2339684, 3718368, --3979287, -6334003, 2910914, -5180268, 590558, 2944737, 7602092, -1724966, -3641596, -3215320, -1198296, 4111894, -5587753, -60666, 4628901, 1802276, 503585, -318901, -413391, 5976447, --209917, 5473936, 3625489, -1406602, 3612604, -1278290, -307627, -573915, -9998147, 3454228, -5682242, -3290482, -1847910, 1367410, 1561221, 1595044, 905164, -557809, -1188632, 325881, --2499134, 6846178, -3054796, 784905, 3746822, 2964601, -2430952, 2695629, 878321, 1751810, -3784940, 3308199, -4953708, 5140002, 5732171, -1948841, 119722, -372052, 3752191, -4575751, --2351495, 992137, 676994, 165356, 271120, -980326, -1509144, 909996, -700080, -399432, -292058, 1300838, -943282, -235149, 56908, -1796370, 638876, -1067299, -1071594, -865973, -699006, 92342, -485331, -1074279, 284542, -5602785, 7177427, 4774930, 11129871, -1809255, -1154809, 3468186, -5476620, -1081258, 2120103, -2199560, -7422777, -394600, 750546, 4994510, --6004901, -14516989, -11801496, -7199439, 2754685, 6963216, -7014756, 3959423, -3464428, 5388037, -4108673, 3663607, 6363531, 3608846, -5077188, -4605279, 819802, 3464965, -316754, 327491, -8917963, -36507, 1507534, 4499515, 4658966, 814433, 77309, 11123428, -834834, -4136054, --1312649, 2549063, 3175055, -2123325, 5901285, 1196685, 3138547, -4241280, -3845606, -1431835, --2565169, 1468879, -2049236, 6517613, -7562901, -6669548, 8036421, -829466, -409096, -9402220, -2857227, -4551055, 5011690, -3903052, -10509248, -462783, 5293547, -4452808, 6862821, -4160750, -3117610, 6496138, -1914482, 2724083, 6444062, -416612, -4902169, 413391, 3103114, 1486059, --2419677, 4502200, 209917, 2376191, 802085, 650151, 1609002, 311922, -773094, -45634, -139586, 687732, -1912334, -923955, -1046361, 1724429, 106300, 1756105, 1727651, -1708323, -312996, 439160, -1090385, -738198, -460635, 321049, -1003949, 351650, 17353278, 4138201, -4598836, 2032056, -4012036, 8388608, -3986804, -2322504, 10583336, -758062, 8504572, -860604, --9800578, 3495030, -3346853, 10814728, 5638219, -710817, -9679783, -6705518, 8878771, 10609643, --12370043, 6222871, 4913980, 3757560, -839666, 1238561, 996432, -896574, 12184822, -515396, --2126546, -3329137, -4131222, -5189931, -1757715, -238908, -7074348, -2467996, 1803886, -4866735, -239444, 321049, 7277822, -2703682, 195421, 3439732, 255014, 7027640, 3121904, 7305203, -3560528, 2251100, -7718593, 845572, -5727876, -5287105, 1241246, 7448010, -322123, 6401649, --2700461, -4776004, -1149978, 341450, 1841467, 4406100, -2051921, -4832, -2422362, 2476049, -1640141, -6233608, 1188632, 1334661, 801548, -1731409, 6527277, -663572, -1312113, 734439, -3047279, 1382443, -2183991, -666257, -902480, -1546725, 1258425, -1855426, 3064459, -1837709, --396748, 404264, -1491427, -392453, 1691680, -1998770, -490700, -2154463, 819802, 936840, -1728188, -2356863, 446677, -950798, 1178969, -790274, -2876554, -894427, 4908611, 3436511, -3948686, 11185169, 5856188, -4855461, -4336843, -12039867, -777389, -266825, -6420439, 2443837, -9667971, 1173063, -7606387, 7071664, 6724308, -697395, 2692945, 6811818, 1621350, -6181532, --945967, 14430016, 7105487, 1497333, -9506373, -3400004, 8691940, 2993055, -1285269, 4895189, -4381941, 4584341, -24696, 8961986, -68183, -1139240, 2269890, -4438849, -5814312, -284542, -1000727, 3339337, 1843615, -5435281, 5546951, 9720048, 4999879, -254477, 7226820, -8196408, -4699768, -4877472, 5162551, -1357210, -5888400, -286152, -7676181, -12582644, -4578972, -4990215, --593779, -37044, -6574521, 1296006, -2005750, 3843996, 2546916, 4549981, -700080, 1843078, --6327561, 1120987, 1030255, 8871255, -3394635, -257161, -3047279, 1891933, 7986492, 4114579, --4595615, -7369090, 2365453, -2932389, -985695, 3874061, -514859, 1320166, 935229, -4374961, -241592, -3330747, 987306, -3161633, -2116345, -1131724, -99858, -397821, 616328, -2011118, --176094, -654446, -1593433, -1341104, 529355, -322123, -805843, 256087, 797790, 2487323, --825171, 1472637, -1016834, -2424509, 1872606, -2655364, 2639258, -200253, -1694365, -249645, --11778948, -7809861, 16695612, -3662533, -3646964, 968515, -571231, 17875118, -5214627, -9660455, -249645, -9529996, 2387465, 7582765, 8176544, 2571612, -16586627, 13637595, -10727755, 5698885, --7329362, -5589900, -4096862, 6805913, 7340636, -10991895, 883690, 4790499, -3395172, 2193118, -3238405, -3977140, 521839, -9053254, -6066105, -13969918, 8282845, -1959042, 14090714, -6563247, -3068754, 9395241, -2335389, -2796561, -4148402, 10769630, 7879118, -13232257, 3787088, -7485591, --2499134, -2909304, -7416872, 4459787, 2379412, 11647414, 8211978, -14636175, -2386391, -6287832, -8561480, 2973728, 747324, -8540542, 1290638, -899796, 7196755, -1202054, 911070, -9821516, --213138, 6971806, -6419903, 1078574, -2018635, -1917703, -5186710, 1044751, -673773, 12360916, -5461051, 5653251, -2253784, -1381369, -2138894, -3367791, -1797981, 2757906, -3774740, -1203665, --3702799, 2806224, 2363843, -2018098, -1128503, 2609730, -3486977, 1733556, 538482, -938450, --1103807, 938450, -91268, -315680, -664646, 2283312, -3365644, 450435, 308164, 1710471, -1851131, 1851668, -1707250, 510027, -1204202, 2473364, 578747, 1813550, 4061429, -4477504, -297427, -9448391, -1192927, -10904385, 1695975, -2729452, 6250251, -438624, 5300527, -7470559, --14081050, 2986613, 9452149, 1236951, -1155883, 7382512, 4953708, -11505681, -200253, -4338454, -14548128, -649077, 1679332, 1142461, 131533, -457951, -5243618, 11540040, -999654, -16364899, --3091840, 9912785, -6409165, 1650341, -281857, 1321776, -2070711, 1575179, -3033321, 3906273, --6299644, 5905580, 8267275, -6505802, -1683090, -3853660, -11420318, 4555350, -8116952, 7034083, --7138773, -12302397, -3389266, 7299834, -2313377, -4400194, 4853313, 6749004, 3833258, 7397008, -12636331, 10195715, -692027, 1976759, 1692754, -6808060, 1260036, -7118909, -7783018, 4216048, --5946919, 1911261, -389768, 4444218, 4487167, -5890548, 6788196, -1881733, -2843805, -1272921, -4759361, -896574, -4480725, -3038153, -6327561, 7166153, -3651259, -958315, 1189169, -312996, --2710661, -2281165, 431644, 934692, 261993, -1272384, 1604707, 1202591, -1467268, 111669, -1010928, 635118, -918049, -39192, -1213865, 432181, -1994476, -1800128, 1032940, 534187, -2326799, 2595771, 159451, 1779190, -42413, -16176457, -13372381, 7764227, 14508936, -77309, --745177, 2673080, -6817187, -3430605, -16536698, -8936216, -4606353, -230318, -11996381, 17243220, -3554086, 9562745, -10925323, -13245679, -9793062, -3934190, 2751464, -15025943, -6577743, 6846178, --2848100, -18260054, -6048925, 2371359, 311922, 11199664, 3913252, -3622805, -8500814, 10649908, --6104759, -705448, 8209293, 2314451, -8681203, -4598836, -558883, -14795089, 3832185, 11369315, --4855461, -6391985, 1797444, -7522635, -2622078, 1408212, -4618164, -3700114, 4010426, -5622649, --11608760, 5737540, -6562710, -8822400, -11897059, -6078453, 1334124, -4866735, 2136209, 14739254, -8497056, -1858647, 14246943, 14273250, -6063420, 1940788, 4122095, -7474317, -4674535, -15771120, -1765768, -5082557, -12565464, -172336, 6842957, 11788611, 7431904, 3433826, 1472637, -10723460, --1186485, -2473364, 2955474, -4075387, -311385, 219580, 4295, 2544768, 658204, -994822, -2456185, -974958, -3206193, 2689187, -2094333, -3042984, 624918, 1092532, 1180042, 223875, -3449396, -348429, 2269353, 1218160, 420907, 652298, 153008, -2560338, 748398, -3514894, -989453, -5608691, -1218697, -250182, -3516505, -4392678, -396748, -4341138, -627602, -923955, --10186052, 26036092, -971200, 15943992, -7992398, -22892712, 6580964, 1925219, -845035, -10753524, --991601, -7096360, 18153216, 13214004, 11900281, 8619999, -14131516, -122943, 2006824, 12559021, --21482890, -2483028, -5215701, -6333466, 3292093, -7135015, 2822331, 4758824, 3623879, 3795141, -5049808, -1537061, -2062121, -10514080, -2437394, -1639067, 10345502, -40265, -9358734, -2254321, -11252814, -1343251, 6571837, 8329552, -6008123, -3630321, -13815836, -8104604, 27215598, 7113540, -12145094, 6454799, 1634235, 981937, -17149268, 10161356, 1673964, 2955474, 8847096, 9544491, -14981920, -17213156, -7031399, -9569187, -1142998, 2344515, -2207076, -4851166, -2757369, -14440754, --18041546, -11792906, -16904992, -2238215, -11027865, -19031536, -7968775, 6138582, 10466298, -3991098, --16185584, -610422, -2393371, 3816079, -4407174, 1014149, 9398462, 399432, -627065, -609349, -1247151, 1614371, -2701535, -2509872, -6471442, -7345468, 3955665, -2034741, 3545496, 3131031, --1134945, 2125472, 2932926, 5237176, 3786551, -2309619, 1210107, 6681896, 1344325, -6798933, --5553393, -3080565, -1364726, 492311, -2334852, 3864397, 4330401, -1045825, 6509023, 836982, --1756642, -1399623, 1546188, 35039952, 7927436, -5056250, -7277285, 1125818, -11251741, -21974664, -16168404, 70330, 10402948, -7872675, 7523172, 17985712, -1788317, 2004139, -4539781, 15652471, -13171591, 5109938, -21226266, 1529008, 3109556, 13103945, 19068044, -5641977, -3919695, -2533494, -5101348, 6802155, 5648956, -9662603, 4392678, -11137387, 8491150, 11345693, -5450314, -11267310, -7081864, -12259984, -11223286, -489626, 3228205, 15929497, 1899986, -2208150, 13562433, -2544768, -12177843, 22530324, 11275900, 230318, -14353781, -1391033, -8282845, -6716792, 14377403, 5599564, --14559939, -202400, -11140608, -2849174, 19067508, 8752070, 2746632, 8143258, 11467026, 5927592, --15445776, 7900056, 12810814, 4365298, -10570988, 4298189, 1176821, 2159295, -8284455, 12660490, --3545496, -3100967, 15229417, 16145319, 2338073, 4558571, 17554606, 984084, 8639864, -6227166, --242129, 10087804, 5820755, -4547297, 5179194, 9097278, -2535641, 16106, 11611444, 2351495, -4909685, -3513820, -5891622, -1831267, 3198677, 1633698, 2626373, 2695092, -1968169, -1888175, --1576253, 834834, 3437585, 4161823, -2899103, -920734, 7210713, 999117, 9687836, -1821603, -2593087, -1392106, 1186485, 4322348, 2618856, 286689, -130460, -4198868, -2961380, -2158758, --4479114, 5595269, 5106716, -8550206, -396211, -10910291, -25550224, 8809515, -10152766, 2801929, -949188, 17910014, -12312061, -10954851, -4544076, -5024575, -6555731, 13228499, -11689827, -16595754, -5010080, -30994094, 964757, -5850283, -13043816, 16648904, -1006633, -996969, 7074348, -6613713, -5334887, -1682554, -18432926, -20200842, -132607, 4262218, 11909407, 5718212, -1274532, -2126546, --11558831, -5505611, 11760157, -18261664, 25288230, 14982457, 3451543, 18654654, -12358232, -5314485, --11304891, -11630235, -4948876, 8534637, 23895588, 237834, -12205760, -2042257, 1255204, -1298691, --1176821, -7528541, 6518150, 5934034, 16149077, -254477, 18248242, 9395778, 5091147, -406948, -3977677, -27052388, 14401025, -3394635, -15749645, 11375221, 98247, 14959371, 6725919, -25050396, -19604916, 15284178, -13023951, 21228950, 8262980, 15882789, 6388764, -2116345, -755914, -577673, --2833605, -5441187, -1567126, 2435247, -5403606, -8316668, 210453, -5384279, -9754944, -5793374, --7270306, 4816269, -4413079, 5901285, 1687922, 6025302, 2934000, -510027, -3006477, 1161252, -712965, -293132, 976031, -1581622, -3949223, 2150705, -216896, 2595771, 2774549, 297427, -2372970, 1229434, 3975529, 3482145, -5788542, -3355443, -9680319, -7333120, -47755740, -3896072, -28542742, -5433134, 992137, 24598352, -5611912, 79994, 3178276, 6407018, -7311645, 6391985, --2416993, -8492224, 8145943, 9213779, -27844810, 3093987, -24763708, -890132, -12756590, -14290430, --2936147, -4446365, -13518946, 6633577, 2413235, 8423505, 11937862, -17206712, 21531744, 1260573, --19845434, 1427003, -13649943, -7192997, -14692546, -13741211, -5673115, 13952738, -12042015, 6532646, -14511621, -8820252, -15130633, -14334453, -20517058, -22536230, -12932147, -6576132, 1915019, -3598109, -6327024, 4002910, -13050258, -1193464, 15064061, 8322036, -21807160, 8408472, -1487669, -6351720, --20189568, 13528073, -7123740, 18757196, 24199994, 401579, 23028004, -12795781, 13437342, -10120554, -14436996, 17907330, 1766842, -24103356, -541703, -32810866, 10748693, 6825777, 13138842, 5909338, --12566001, -11331734, -2684, -7676717, 7578470, -8286066, -61203, -734439, -7792682, -6507413, -5725729, -3374771, -8837969, -1098975, 3054796, 6520297, 3860639, 14418742, -1280437, 997506, --4118337, 10042170, -1205275, -2466922, 9273371, -736050, 1608465, 1906429, 12421582, -2194728, --4678293, 1020592, 8669928, 7694434, -7713762, -1017907, 5829881, -9498857, 5462662, -1735704, -6922951, 150861, -7575786, -22575958, 18204218, -43256764, -2794950, -3952981, -3853660, 4215511, --25177636, 1924682, -5150203, -1960116, 11150272, 4648765, 13008919, -10074920, 9131637, -4729833, --22411140, -8778376, -16519518, -9968619, 10473815, -19213000, 2278480, -7031399, -14918032, -2480881, -14072460, -19111530, -18772228, 7705708, 10855530, -498753, -9025337, 10496900, 10695005, 13541495, -11295227, 4907000, 15560130, 18875844, -10362145, 2917357, -9175124, 23646480, -2198487, -16196859, -19347218, 8707509, 4423280, -9242770, -12694313, 2978560, 7171522, 7598334, -973347, -10178536, -7476465, -11869142, 20938, -11716134, 36048196, 5674726, -10790032, 29931090, -3995930, 9190693, --8086887, 15051713, 21961242, -13817984, 20957830, 22655952, 29171418, 22711788, 1750199, 16870632, --13575318, -2583960, 2789581, -7299834, 12651900, 598074, -1236414, -1294933, -4200478, 6356015, -2798171, 17894982, -6287296, 6605660, -4364224, 100932, 2938295, 5260798, -7985955, 2760053, -7041599, -3281355, -8925479, -1676111, -14049912, 4662724, 3755949, 3641059, -4065724, 2202245, -6636262, 3970697, -2226404, 6789270, 2563022, -4520990, -2793876, -1495722, 10657961, 14487462, -7207492, 3288871, 2067490, 4902705, 8088497, -5869610, -2901787, 3824132, -1495186, 705985, -3396782, 44707924, 11780558, -7710540, -6438156, 10326175, 3099356, 4356171, -944893, -17978734, -15176804, -40944460, 4631049, 8897025, -1645509, -7548942, -15502684, -7277285, 2043331, 12037183, -18706194, -11051488, -23617488, -19315004, -2560874, 623844, -13852343, 28754270, -13282723, -8898098, -12077985, -4140885, 2312303, -2674154, 24917790, 4042638, -24645060, 9741523, 3313567, 17082696, --5963562, 1769527, -10095858, 8440148, 3947075, 21558052, -5110474, 9678172, 10434623, -13178570, --14264123, 934692, 13307956, -25577604, -29979408, -8964670, -12218108, -1722282, -4211753, 2903935, -6995428, -6206228, 1192390, -34900904, -29406568, 23416698, 25132538, -30243550, -23015120, -29111826, --15033996, -12110734, 15190762, -15937550, -27828166, 724239, 1355062, -17214228, -3500398, 24270860, --3532611, 1257352, 7976291, -346819, 1530619, -1171452, -8494372, -10799158, -447213, -3134253, -7137699, -1225139, -553514, -7844221, 4002373, -12082280, -170188, 3568581, 4086125, 5669894, -6631967, 1118302, 3797288, -2761127, 712428, -6196564, 2309619, 521839, -6807523, 6973953, -7141994, -11181947, 758062, 8003672, 6753299, 12420509, -2534031, -14635638, 4096862, 4660040, --7130720, 4525285, -7952132, -3855270, -1209570, -2621541, -6766184, 2374043, -24939264, -3034931, --6041409, 7509751, -11818139, -3206193, -38778184, 34339336, 22052510, -3717294, 47071232, -4613869, --25831008, -2369748, 10558103, -15950435, -21071110, -4415764, -14388140, -665720, 3990025, -21625160, -31738198, 1069984, 3399467, -19950124, -5771899, 2163053, -5724655, 5103495, 7211787, 26112328, -4654671, -1323924, 21071110, 17413944, -6190659, 10274099, -13348221, 3767760, 11774653, 11481521, -29485488, -29169808, 17906256, 54130548, 365609, 8893804, 18488760, 2124398, 3651796, 8751533, -6707665, -18080738, -21590800, -7831873, 17301738, 5174362, -22437982, -12130598, -1019518, -10756209, -19880330, 1833414, 15343234, -34166464, -21211232, 9967545, 23393076, 14359149, 9396315, 32494648, -18931678, -13644574, 22332220, -16863652, -3486977, -2423972, 12528420, -2651069, -14024679, 12131135, -5219996, 1160178, -16080358, 11094974, -311922, 215285, -7219303, 9350144, -7703561, -6159520, --5927592, 4456029, -6185290, -11735461, 3853660, 823023, -169114, -6388227, -1332514, -7999914, --6942278, -6398965, -4132296, -2470680, -3106872, -2436857, 1027571, 226560, -15260556, 10179072, -3900367, -4792647, -11326366, -15976205, -506269, -8704288, -5985037, 5767068, -4336307, 9893457, -4807679, -3492882, 1596654, 9252433, -4294431, -1545115, -4582193, 7795903, 1704028, 3235721, --8036958, 15736760, -44826572, 674310, -28991, -1732482, -5452461, 20777442, 1932198, -12411919, --22352084, 22603876, -20075214, 236760, 14943265, 11532524, -15738371, -4573067, -25497610, -407485, -7593502, 8684424, 10638634, 2445447, -16537772, -21184390, 17391396, 8572218, 8763344, 3067681, -8908836, 2310693, 12852690, -22829362, -37933152, 10271414, -5566278, -8424041, 21458730, -4034585, --11154567, 18497888, 17919140, 14420890, -1181116, -9903121, -16227997, -4554276, -21523154, 50678468, --4179540, 18043158, 4108673, -17259326, 14069776, -6804839, -16072841, 15602006, 12806519, -28385438, -19720880, -3326452, 27292370, -27788976, -20562692, 27342836, -980326, -22759568, 23047332, -8749922, -39257612, -16954920, -13289166, -23967528, 15143518, 2415919, -19064286, 7301445, -24823838, -18595598, -1791538, 15826954, -14176613, -9137006, -28219546, -26084948, 30324080, -3860639, 13300977, 20789252, -28780038, -246424, -2743947, -2609193, 7715909, 11103564, 2302103, 4879620, 17785460, 7326141, -9874130, 5362267, 4583267, -3857954, -1472100, 10436234, 8427263, 13801341, -6562710, 8951249, -10060961, -15942382, 4128537, 3475702, -8285529, -4758287, 148713, 3468723, -6699075, 10738492, -790274, -3032784, -3016678, 9035537, 534187, 2499671, 1041530, 2194728, 2328409, -9161165, --4146254, 6160057, -5499706, -12939126, 33475512, -7656316, 22681722, -35447440, -6193343, -844498, --42237244, -9315247, 6155762, 20748988, -10366440, -9931038, 959925, -3275986, 29715268, -2837363, --14875619, 31460636, -3857954, -1628330, 5987722, -12571906, 27250494, 1801739, -5494337, 13037910, -11222750, -14830522, -5025112, -6870874, 21244518, -42309724, -654446, -8184060, -14867029, 7278359, --15113990, 24680492, -6382322, -30465814, -3080565, 46389940, -28023588, 20356534, -31249646, -8970576, -31307628, 22864796, -16729971, 7980586, -20422570, -26917096, 5859409, -11795054, 11882564, 3476239, --1764158, 4673998, -39398808, -15369004, -20019380, -28798830, 13557064, -10870562, -7907035, -15916612, --27941446, -23505820, 18647138, -3580392, 57854820, 10240276, 5481452, 20735028, 36448168, 4882841, --26022134, 31981400, 24259586, -20217484, 5555540, -5010616, -20114406, -15829639, -13533979, -1412507, --12336757, 4868883, 8675834, 3133716, -9566503, 17123498, 2827162, 8005819, -2132451, -2781528, -8223252, 5101885, -7929047, -7118372, -6823630, 7975218, 3908957, 9602473, 10171556, 590558, --5137318, 7777112, -4102231, 16448114, 7908109, -19271518, -3630321, -14150843, 1964411, -4478577, --6722161, 20562156, -857920, -6088653, 5440113, 6622303, -7166153, -1251983, -9943386, 4778688, -7607461, -1163936, -2967286, 9713605, 22195854, -13040594, -17223892, 19311246, -30534534, -3309809, --6471979, 2032593, 21121038, -13726715, 23465016, 10398116, 5162551, 7325067, -38888780, 26517128, -4685273, -26946624, 10427107, -28598040, 4704063, 38954816, -5018670, -22666154, -24600498, 10656888, -17369384, 14444512, 7356742, -25285546, -17696876, -7664906, -4949950, 33309082, -21138218, -12317966, -49032956, -27118960, -2306398, 19755238, -99858, 20797306, -3191698, -16343961, -11300059, -29896730, -15204721, 21664888, -32328756, 48302276, 15827491, -36018668, -33239826, -31299038, -37956236, -30332132, -1408749, 15321222, 2803540, -25239912, -9797357, 17219060, -613643, -15733539, 17401596, -34057480, -2032056, -7677254, -31831076, -29361470, 4978404, -11559368, 22222160, -40800040, -5657546, -14323716, --30165166, 2250026, 48206712, 12592844, -21529598, 10582263, -26474178, 10877005, -10832981, 1115618, -1315334, 13869523, -1596117, 4859756, 17099876, 355409, -9669045, -4221953, 13688061, 9946071, -6240588, 3543348, -27249956, -2600603, 1937030, 15354508, 7485055, -13910325, -376347, 1759863, -23593866, 1467805, 7506529, -7187628, -4772246, 3632469, 7634841, -841814, -7094749, -13176960, -1858110, -4919348, -9291088, 4649839, -6506876, -6461242, 9091372, -7264937, -10698227, -14583561, --13064217, -2308008, 3747896, 136902, -11365020, 23485954, -58794344, -54376972, -47129748, -30462592, -12326556, -12874164, 60627220, 16004659, -6460705, -13909252, -7647190, 17150878, -39416524, 46153180, -61091076, 24266028, -3668439, 48269528, -15299210, 29185376, 55529632, -10148471, 3090766, 10380399, -73896520, -18750216, -4626754, 43879532, 16692927, 14094472, -12064563, -45038636, 3150896, -35699768, -17073568, -44231720, -51726440, -638340, -2913062, -36166844, -1861868, -17599702, -36998460, -29633126, --48290464, -2321430, 49409304, -15764141, -9392020, -45519136, -24320252, -16776679, -15548855, 15380278, --11084774, 82144472, -19377282, -1157494, -29926258, 61991412, 51029044, -36051956, 41518376, -14514842, --60149408, -10787884, -5698348, 12658879, -13906567, -13694503, -7468412, -24445880, 7179038, 30210264, --35611720, -5096516, 10466835, 6251862, -41362684, 26986890, 19204946, 62299036, -26380762, 17095580, -26506390, -1557463, 7477538, -797790, 9366250, -6897718, 20527796, 8585103, 16726213, 13999446, -1637456, 14422500, 5000416, -5335423, 15697032, -853625, 3133716, 1716913, 11188927, 7876433, --10514617, -8660802, -13493714, 21721798, -13923747, 3321084, 14013405, 5703717, 24837260, 20786032, -36672580, 24671902, 21223580, 1553168, 14303852, -18670760, 18236968, 13101261, -3263638, -17913234, --33101850, -13095892, 10963441, -18771692, -6029061, -13547401, -32282584, -28696288, -12540231, -21267068, --11651173, -18241800, -22384832, -24683714, -6502044, -6825777, -9855339, -17978734, -18128520, 24444270, -104953432, 11767674, -65037616, -16661252, -22679574, 4643934, 33114198, 58265528, 17264158, -49568216, --425739, 33724084, 7929584, 421444, -991601, 8582418, -4156992, -6273874, 41044320, 25095494, -23182086, -34687228, -21759914, 23175106, 9645423, 13594108, -11350525, 4088809, 45713484, 851477, -38860864, 19906100, 21485038, 37201932, 6041409, -20019380, 5225365, -22887344, 6340983, 15684684, -4669703, 61005180, -19757924, -39534100, -37337760, 47114180, 22441204, 25057912, 17859010, -27133992, --33286534, -20758650, -492311, 10232223, -6746857, 16629576, 31976568, -2180770, 23379118, 20604032, --31012348, -6279779, 9720048, -14847165, -12721693, -15572478, -51592756, -8804683, 23312008, 2042257, -46339476, 30493194, -21446920, 16227460, 944893, -15087683, -12125766, -25182466, -55802364, -30015916, -3002719, 1165547, -11812234, -3214246, -5180805, 18264348, 19568944, 9977209, -2733210, 1599339, -15002321, -6864432, 9672266, -25213068, -11409581, -3072512, 14328548, -3242700, 6062883, 9237938, -9476308, 1493575, 25068650, -19237696, -17025788, -17425220, 13370233, -11149198, -17823040, -17786534, -13514651, -5600101, -12831752, -6542846, 10294500, 2949569, 14779519, -23283554, -15073725, -2231773, --990527, 5294621, 11579769, -4631586, -8906688, 16627429, -7861938, -9318468, -8329552, 16182363, --3675418, -7420630, 4983236, -156229, -8071318, 1010928, -10945724, -6163815, -4802847, 316217, --3374771, 3669513, -2793339, 2523830, -1095217, 3383897, -6021544, 2586644, -2631741, 3051038, --4184909, 3944391, -6660421, -5881421, -25411174, 2840584, 82349016, 21170968, 34595960, -17229262, --75185016, -38147900, -55374476, -18682034, 37109056, 85262080, 37982008, 9449465, -40638444, -38254200, -26800596, 42398844, 20957830, 51498804, -2276870, -33743948, -49428096, -24045374, -7713762, 38254736, -4591320, 22102976, 19614042, 3311957, 51043540, 35850092, -4056060, -4917738, -47267188, -11503533, --1119376, 957241, 26897232, 48240000, 29415694, 23155242, 45187352, 26154740, -47141024, -37813964, --11926050, -29640106, 31307090, 21340618, 46377592, 36216776, 41010496, 12163884, 7165079, -33779380, --35443680, -33171106, 11596949, 16896402, -191663, -4501663, 73222216, 18569828, -5143224, -6923488, -50109384, -53500796, 11167452, -101871792, -22874458, 25500294, -35729832, 33272038, 18735722, 528281, -73136312, 34744676, -41660108, -82677048, -39875012, -37442988, -20441360, -13904957, -10781442, 36168456, -22868016, 48785996, 5771899, -35888748, -24831354, -37659884, -35161824, -34843996, 15308337, 3282429, -15139223, 20804284, -9903121, 19241990, 10084046, -13412646, -1667521, -14860587, -4883915, -32129040, --34109020, -12729209, -14870251, 587337, -31959926, 16979080, -2374580, 5905580, 8857296, -21290690, --44185012, -39924944, -2216740, 8752606, 9065602, 26242250, 6464463, -13187697, -24899000, 8244727, -5826660, -118897576, -72671920, -39620536, 35030292, 10004589, 162220912, 173107584, 105195024, 191960336, -156860800, 166039136, 114993456, 140487840, 113949240, 2132988, -54354420, -77442016, -74491912, -155588416, --186796720, -195092976, -136268032, -107092328, -42184096, 7495255, -55185496, 33758980, -69548408, -25094958, --4786204, -21454436, 16460462, -63753420, 87706456, 15042049, 79955112, 51446192, 29886530, 20960514, -44235480, 28907814, 45368276, 104502456, 99227704, 79223360, 96973384, 122803312, 111686328, 105432320, -193216080, 67902360, 135947520, 177297328, 121739240, 161067184, 85433344, 114815752, 89635432, 107793480, -116473608, 43298104, 75413184, 57360900, 70583496, 68472520, 18655728, -13179644, -74035576, -27205934, --98775656, -86102816, -146102976, -165154384, -166577088, -351179616, -297622976, -319242240, -317061472, -369621120, --374219968, -230485664, -268580960, -199622032, -236978576, -179799680, -170652480, -148185504, -149100320, -85328112, --37919728, -54152560, -55202676, -44676788, 8507256, 71534288, 37153616, 148728272, 127667904, 187929520, -192691568, 178250800, 222058944, 206208896, 238320224, 186738736, 228009072, 242057920, 270083648, 236674704, -141070352, 141555680, 140898016, 143583440, 132002600, 93261992, 86850144, 36521716, 25468620, -2702071, -4138738, 18002356, -48973900, -71785544, -78185048, -47844324, -42722576, -80002896, -93439160, -108674480, --79120280, -100603704, -93316752, -78420200, -84495432, -85924040, -86137176, -22252226, -20294794, -10461467, --19361176, 11321534, -2672007, -1993402, -18178986, -6362994, 6412386, 11666205, 4030290, 16151225, -11121818, 19476602, 642098, 3317325, -2473364, 8277476, -2481954, 4155918, -3249143, 3853123, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ -5507222, -95026, -2029909, -478889, -4906464, -3393561, 2198487, 179852, -3085397, 3838627, 2594697, --850940, 245350, -538482, 3112778, -4320200, 1626719, 3208878, 2856690, -6210523, -4330401, --3093987, 4172024, 991064, 1369558, -1742146, 4449049, 1650341, -1090922, 100395, -1254131, -853625, 1672890, -1003412, -1266479, -3747359, 3979287, 6593312, 791348, 4181151, -769873, -827318, 1516660, 1807644, -5006858, 334471, -5231270, -1221918, -735513, 1629403, -2636036, --106837, 1153199, 506806, -3049427, 99321, 351114, 2478733, -3243237, -4096325, -545461, -5507222, 8872866, -4295, 1454920, 593779, -1899986, -5353140, -1356673, 3695283, -1701881, -3680787, 1434519, 3748433, -206158, 1443646, 1333587, -3206193, -4307316, -476205, 1623498, -2449205, 1195612, 1082332, 736050, 808528, -1480153, -2374580, -1606855, -1303523, -620086, -20938, -891206, -144955, 781684, 1246614, 1115618, -201863, 71941, 729071, -25233, --956167, 2522220, -5564130, -1262720, -5277441, 3051038, 341450, -2432562, 11248519, -4396973, --8061654, 613643, 3732327, -681826, -6067178, -1729261, -2637647, -994822, -2878165, -948114, -4170950, -294742, -2724083, 4784594, 701690, 4647692, -1239098, -1145146, 1786706, 117575, -2081449, -875100, 4386236, 7167227, -1978369, -4825933, -3535295, 2953864, -11274, -11047193, --1051730, -4405026, -1641214, 5401995, -3776887, -2872260, 3725884, -2442226, -535797, 4953708, -1707786, -3914326, 1749125, -2820720, -6525666, 2081449, 2556579, -4956929, -2869038, -1435593, --2084670, -49392, 2120640, 3379066, 5119064, 5724118, -1370095, 583579, -2263448, 2467459, -1570347, -1275068, 2394981, 3676492, -3517041, -1794760, 590558, 68719, 1414118, 4224101, --536334, -1133871, 3828427, 560493, -2660195, -1665374, -204548, -1633161, 1169842, -679142, --1472100, 599685, -1669669, -1315334, 825171, -1677185, -1136556, 46708, 1108638, -2075006, -236223, -505732, -725313, -1001264, -96100, -1619203, -462783, -1550483, -9055939, -4599373, -2782065, 4012036, 1562831, 4352413, -3724274, 4555350, 5587753, -1570347, 6183679, -843961, -4554276, -2165737, 137439, -1942399, 5824513, 2274722, -239444, 5206574, -2775623, -2201708, -3806952, -9043591, -1578401, 495532, -1928977, -8059506, -4927938, 3345243, -3162707, -2100776, -111132, 6307697, -1519882, -4413079, -353261, 1624035, 3561065, -541166, -5724118, -3685619, --1057636, -2929168, 944893, -4977330, 2465848, -4683125, -6890738, 221191, 2407866, 2800856, --2209224, -1581085, -4525285, 5845988, 3373160, 816581, 52613, -162135, -1991791, -1063004, -1969779, 2496987, 8812736, -992674, 2212982, 580357, -272194, -4317516, -3289408, 5979668, --2578591, 588947, 1476395, 866510, -947040, 4519916, 231391, 165893, -4912369, 4740034, -2649995, -1831267, -1099512, -530965, -1433445, 655519, 3408594, -46708, 1348083, 1035087, --489626, 792958, 1756105, -184147, -8053, 543313, 812286, 707596, 998580, 1826972, -673236, -1341104, 1394254, 651224, -998043, -773631, -171262, 208843, 2193118, 2699387, -2410551, 5767068, -3825742, -5709086, -4613332, 2891050, 6372658, -1191317, 4880157, -4350802, --5291937, 4364761, -2206540, 445066, 1624035, 5471789, 2026688, 8692477, -3797288, -4645007, -2024540, -2576444, -2430952, 4924180, -7699803, -4750771, 765041, -1493575, 3498788, -2617783, -959388, 6180458, -5765457, 4296041, -3481071, 2781528, -3261491, -930934, -530428, 6405944, -1202054, 223875, -4696547, 227096, -5587216, 2091112, 1375463, -3734474, -92342, -1547799, -9669582, 1299228, 617402, -8396124, -4923107, -7081328, 5527623, -3608846, -399432, 2913062, -12337830, 8709657, -3483219, -7592429, -3161633, -6591701, 6970732, -1337882, -1925756, -3050501, --2023467, -571768, -3183108, -2110440, -526134, -2583423, 1861868, -1807108, 2609730, -9595494, -662499, -791348, -3023120, -1421634, -3209951, -644782, -5024575, 412317, -2073932, -168041, -3074123, -966905, -1060320, -2150705, -2374043, -670552, 705985, -133681, -181999, -855772, --344671, -1012539, -136902, 246961, 624918, -716723, -817654, -1140851, -1007707, -872952, --1531156, -4867272, 3497714, -5036386, -8943733, 9124121, 4140885, -9587978, 9588514, -1545115, --548682, -13470091, 8027294, 5336497, -10875931, 3232500, -1783485, 4118337, 967978, 4747013, -3063922, 1206349, -5049271, 466004, 1881196, -6702297, -2836289, -7907572, -1336809, -4918275, --2610266, 891206, -6167573, -2285996, -9097278, 3441880, 927713, 780610, 824097, -3927748, --7915625, -2484639, 2816425, -1291711, -663036, 8308078, -12305618, 5177046, 6324340, -918049, -421981, -2403571, -949188, -4001299, -6065568, -4158602, -4773320, -3214783, 3087545, 1688459, -2752000, 4156992, -964757, -2222109, 5964636, 11337103, 8027831, -174483, -9626632, 2649458, --1453310, 1416266, 10255845, -70330, 10331007, 9190693, -1233729, -3087008, -2443837, 716186, -916439, 3423089, 10475425, 2781528, 443992, -1079111, -6448357, 764504, 2026688, -2199023, --290447, 324807, -55835, 1197759, 938450, 732292, -784368, 1258425, 1188632, 1124208, -1316408, -3514894, -533113, -2527052, 1031866, -1975685, 858457, -568546, -875636, -2114198, -428423, 519691, -3043521, -985695, 748935, 14532022, 3717294, -2581275, -703301, 4471061, --1526324, 14077292, -1494112, -2161979, 17838072, 112206, 9019968, -3352759, 248571, -777389, -1468879, -2281165, 1239098, -278636, -509491, -9678172, -925565, -2305861, -1731946, -4032974, -6195491, 2898029, 3686693, -5428839, -601832, -8579734, -3434900, 1612223, -698469, -5215701, --1607392, 2867965, 6473053, 3918084, -2052994, -7976828, -280247, 2271501, -1340567, 4226785, -2807835, 5730023, 7897908, -2568391, -52613, -8518531, -10356777, 9774272, 5246840, -353261, --435939, -323733, -3778498, -4141422, -82678, 7824357, 4520453, 1420560, 9545565, -7318088, -2144263, -6002217, -4633196, 4107599, 4217658, 3475166, 14378477, -518617, -6500433, 1129576, --6372658, 2886218, 1675037, 5252745, -2838974, 83752, 645319, -4830228, -865973, 3380676, --508417, 876710, -2101850, -1069447, -318901, 2341831, -1240172, 1479616, -2229625, 210453, --2882460, 922881, -1533303, -985158, 455803, 1455994, -1786170, 1929514, 1227824, 2354716, -139050, 1398012, -606664, 855772, 421981, 865973, -900333, -13422, -843424, -114354, -417686, 1221918, -7977902, -10713259, 4159676, -10012643, 3221, 11145440, -11661910, 4268124, -5235565, -3129421, -14394046, 189515, 8420820, -9314173, 5792837, -652835, -4127464, -12077985, --338766, -8714489, 1544578, -4425427, -6788733, -8477729, 3486440, -1203665, -494458, 8056285, --4874251, 6796249, -5160403, -2067490, 10417980, 3568044, -5554467, 4274566, 2517925, -4821101, -2544768, 2618320, -1844689, -2059974, 420907, -2324651, -2741800, 1704028, 1911797, 14172855, --13340705, 2156611, 857383, -4785131, 9601399, 5459441, -3287261, -10349261, 927176, -1050120, --3117073, -6532646, -7643431, 9331890, 6059662, 772020, -926102, 4970351, 2530810, -2262374, -3985193, 2856153, -2581812, 9928891, -3680250, 6073084, -4059281, 3020436, 3130494, 2236604, --293132, -5528160, 5288716, -4304631, -4470524, -3075734, 1546725, -11811, 663572, -5243618, -2856690, 2201171, -3309809, 339839, -121333, -1660005, 321586, -1100585, 2544231, -733366, -397821, 2119030, -952946, -1613297, 1418950, -1838783, 1494649, -331786, -9664, -2116882, --935766, -74088, -2298881, 2276870, 1302986, 512712, 1524713, -491774, 1042603, 4728222, --10803990, 7928510, -4522064, -1981591, -6202470, -4449049, 3775276, -3547106, 3087545, 12111271, -4141959, 6659884, -15439334, -10204305, -5503464, -3681861, 1668058, -60130, 2659659, -12945031, -6931541, 2900177, 1728724, 12370580, 205085, -6996502, 11599633, 4575214, -5181878, 2379949, --6659347, 6107444, 2870649, 8136279, -6971806, -4938676, 2054605, -7036230, 8879845, -8139500, --147103, 7902740, 7268159, -15031312, -430034, 741419, 1744831, 2492692, 16423955, 3798362, -1022739, -5023501, -4158065, -8877161, -4814122, 12148852, 289910, -14494441, 215285, 3360275, --8238284, -9059160, 1072668, -5874979, 2406792, 13313325, 6527814, 5604396, -5465346, -14221710, -1142461, -2432562, 6524056, -1277216, -11917997, -1447404, 3103651, 3283503, 3212099, -1004486, -10082436, 1905355, -6421513, 8323110, -619549, 4981089, -171262, -1242319, -4335770, 6150393, -4225711, 2405182, -3148748, -1228361, -831613, -2076617, 1163399, -13422, -2677375, 1330366, -805306, -1503239, -1993939, -829466, -1508070, -220117, 1865626, -1913408, 959388, 2352032, -2812667, -725313, 1197222, -1500017, -19041738, -5662915, 5376226, 14719927, 2092186, 7642895, -26109644, 4358318, 4450660, -4019553, -12525198, 7116224, -6076842, 6558952, -1580011, 17297444, -12586402, -6643778, -14149233, -11225434, 8528731, -7469485, 10456098, 4620848, 3403762, -3591667, --1383516, 12455942, -2458332, 10995653, 10977936, 5698885, 7699266, -8516920, 8338142, 4520990, --4476967, 12174622, -5359583, 11063299, 826244, 1272384, -16203301, 9788230, 889058, -3020436, -7999377, -11265699, -4483946, 6791954, 5526549, -10377178, 1672890, -6628209, -3828963, 10331544, -1381369, 3137474, -1092532, -11839614, 7963406, 7591892, 514859, 6008659, 2680597, -5228049, --5524939, -417149, 6327024, -10717017, -390305, 721018, 464393, -69793, 4704063, 6213207, -12693239, 7157563, 419833, -17805860, -5866389, -6645388, -598074, 1354525, -5011690, -10539850, --3331284, -4729296, 2789581, 446140, -3013457, 1167694, -3089692, 4954782, -1767379, -2067490, --2914135, 93416, 1421634, -6320045, 3991098, -4050691, 1660005, -1011465, -2345589, 152471, --3915400, 1307818, -3531537, -2533494, -502511, -1998770, -1877975, 2226941, 3762928, 2296734, -3623342, 4755603, -973347, 745177, 23540716, 6939594, 3105261, -8698919, -21263846, 15403900, -4763656, -14039711, 4180077, -1479079, 3591667, 3031710, -10200010, -21719112, -17062294, 5800890, -13326210, -2596845, 13993540, -6443525, 10916196, 13395466, 18065706, -3934727, 13348758, -11806865, -4514548, -6415071, 1601486, 7261179, -316754, -3796214, 3248606, 9105868, -6453189, -11966853, --12175159, 25556666, 44023, -1206886, -11504607, 11888469, 3844533, -23458574, -13625784, 5346698, --3310883, -4095788, 9188009, 3181497, 22767622, 12645457, -806917, -13156559, -12983686, -7296613, --5336497, -14934138, 13879187, -10188736, 10984379, 9516037, -9499394, -12173548, -11838004, -17206712, -4214974, -207769, -6208375, -7740605, -12677133, -4460324, -12485470, 2713883, 1519345, -4167729, -1710471, 10324565, -26134340, -10068477, -21325050, 10858751, 7514046, -9071508, -3078418, 4472135, --4014184, -43487, 5068062, -3869229, -8530342, -862752, -2450279, -2603287, -95563, -1020592, --3619047, 233002, 767725, 4652524, -6286759, 1762010, 3470871, -297963, -2595234, -3942243, --1163399, -522375, 908386, -1297080, -331786, -2351495, 1216550, -884226, -4008815, 7256884, -754304, 2261837, -12658879, -24401856, -5420249, -6332393, 1352915, -5662915, 1061394, 2580202, --2621004, 10487236, -13511430, -4091493, -12822625, -620086, -6380711, 14863808, 16616155, 13282723, --18524194, 13149042, -6686727, 9989020, -3827353, 7377680, -6146098, -7912404, 2858838, -10223633, -6586869, 7937100, -979789, 4769025, -9372156, -1175747, 15876347, -12618077, 606664, -3742527, --5173825, -10173167, -566399, 15683610, 20667382, -13037910, 6249178, -1636919, -12538083, -12822625, --13771813, -6305012, 26161720, 15792595, -4889821, 8396124, -5552856, 7270843, -14314589, 8403104, --431107, -7835631, 19913616, 10253161, 4065724, 6496138, 5698885, 18628884, 2469606, -15844671, -6437619, 12049531, 9454834, -27642946, 16859358, -11751567, -10430328, -5190468, 1714766, -10869488, -11928198, 26433914, -4603131, 3750043, 13523241, 2261837, -2220498, 3180423, 1376537, 7678328, -6931004, 4133369, 12684112, 6465537, -3541738, 8592619, 5359583, -3862786, -7732552, 4310000, --1078574, 4668093, -2224793, 1359357, 3827353, 1457605, -1115081, -1007170, 1721208, 5887327, -1283122, -1460289, 1299765, 4505421, -2027761, 180926, 7677791, 2907156, -2068027, 4144107, -1302986, 1051193, 3144453, -151934, 2588255, -1282585, -4932233, -4532801, 3793530, 16977468, -11176579, 46139224, 12991202, -7795903, 3042448, 7739531, 269509, 15349676, 11525008, 10623602, --13657459, -22973244, 23023710, -13027173, 2261837, 7906498, 25258166, 10067940, -15163919, 13725105, --13707388, -2892124, -18877456, -24937116, -2704756, 6676527, 6793565, 4964982, 6431177, -2017024, --17006460, -6364605, 5572720, 5724118, -8967892, 18919330, 12113418, -11418171, 6370510, 9394704, -3780645, 528818, -10412611, -1351304, -7280507, -4391604, 1152125, 11750494, 29443612, -8023536, -2745558, 4278861, 11024644, -10561325, 37299108, -3269544, 3673808, 3060164, -16831440, -16619913, --26676578, -11411191, 14701673, -5179731, 7422777, 5874979, 25679072, 4044249, 4655745, 1302449, -20245938, 9697499, -8388071, 18475876, -16815870, 2653216, 17125646, 21967684, 20311974, 7938174, --11506754, -18894634, -8092256, -6076305, -13721347, -7715372, -7792145, -2226941, -11519639, 2866354, --3944928, -1948841, -10043244, -1239098, -6254546, 9902584, 1051193, 2122251, -8939438, -1783485, --12286828, 799401, 5273683, -450435, 9007620, 5620502, 27380, 3664144, -1861868, -5606006, --3255585, -2550137, -10541460, 915902, 2105608, 2454574, 3141769, -5270462, 7437810, 8005282, -3548180, -6314139, -4217658, -2149631, 1799054, 4394826, 2401961, -4252018, -2174864, -4858145, --19223736, 10827613, 5136244, 13291313, -3578245, -29396904, 2333778, -19725712, -17494476, 5167920, -4169876, 8166881, -5120138, 5867999, -1051193, -10082973, 16002511, -2618856, -5317170, -6452115, --11253351, -9673877, 5815386, -12184285, 2954938, -7814156, -5352603, -3403225, 15704548, -3137474, -16858820, 10492068, -4434017, 5543192, 5829345, 11924440, -8283382, -11369315, 1695438, 6998113, -9199283, 15761993, -17463874, -17002702, 7260642, 5582384, 19516868, -9670656, -1395864, 9644349, -57445, 2673617, -3605088, 12733504, 16048145, 7329362, -2040646, 10043781, 33658584, -7466801, --9822053, 12476880, -1381906, 19640886, 4726612, 9157944, 11080479, -3610994, 7756174, 22736484, --6208912, -27338540, 19226958, 5611375, -9006546, 2619393, -41653668, 27780386, -277025, 17222818, --10938745, 8986145, 1269700, -16607565, -15830176, -2178085, 3072512, -12272869, 65498, 1885491, --2254858, -4082903, -2557653, -13423920, -2230162, -8058433, 115427, -4213363, -1217623, -4825933, -8078297, -5994164, -4576288, -8660802, -4187593, -9882183, -1823214, 2216203, -5499169, -621697, --4503810, -4912906, -5321465, -325344, -4405563, -3282429, 1589675, -1413581, 4298726, -3063922, --6313065, -6908992, 45097, 1198833, -4349728, -886911, -1957968, 2122788, -9286256, -17807472, --879395, 27736362, 13615046, -35723392, 5468567, -6445672, 2980707, 5841693, -1865626, -18416282, -2440615, -2849711, 15864535, 31029528, -5266167, 9992778, 20310900, -912681, -5884642, -5247377, -7947300, 30990336, -781684, -2144799, 25328496, -10363219, 6714645, 71941, -580357, -6640557, -9426379, -28428926, 725850, 9013526, 20617454, 22106734, -18347564, 784368, 19805168, -1189169, -37005440, -13469554, -18368502, 2521683, 26844620, 4793721, -20875688, -9690520, 6003291, -42413, -11613592, -30155502, 3557844, 1399623, -6442988, -21857088, -19547470, 5211406, -6025302, -1291711, -970126, -22743462, -24043226, 5153424, 3637837, -24104430, -8294656, -15638513, 13974213, -38141992, --14564234, 12628278, -23298050, 12793634, -6357089, -9235253, 12580496, -3823595, 18947786, 18152142, -3985730, 11296301, -5162014, 2359548, -13554917, 14662481, -10525891, 8759586, -14191646, 10520522, -648003, 4736275, -1280437, 148713, -8173860, 9735080, -10696079, 1923072, 1166621, 5513128, --11727408, 6152004, -4769025, -3188476, 3645354, -2398202, -5519570, 7945153, 3279208, 8486855, -3676492, -781147, -3983045, -3923990, -1087164, 1659468, -5575942, 2052458, -4071092, 2058363, --11215770, -5761162, -4597226, 5840619, 6630356, -3590056, 1491964, -1568737, -9321153, 20170778, -24159, 11156178, -21056614, -1587527, -19929186, 20900384, 9290014, 27347668, 19311246, -9713069, -3728569, 21600464, 11138998, 10991895, 7093139, -18364744, -5206037, 9016210, 1500554, 10650445, --23360864, -17381732, 10635413, 35049080, 4830765, -11604465, 22207128, 6300180, 13902272, 3650185, -2768107, -19798726, -20092394, 342524, 395674, -34660924, 2863670, -7134478, -1721208, 10945724, --13458280, 8268886, 27276264, 2840047, -44303660, -31919660, -5139465, -9838696, -10971494, -351114, -8137890, 7009924, -10817412, 12273943, 11718281, 10544682, -6802155, 9072582, -4946192, -11566347, --2669322, 10132902, -33050848, -7584912, -14889578, -17289390, -6811282, 4635344, -8732205, -934692, -36527088, 20714628, -13952201, 97711, 474057, -6314139, -6436009, 3176665, 24521578, 8913668, -3770981, -7612293, -5439039, -12718472, -14562087, -15622407, -3506304, 1974074, 4910222, -5489505, -4395362, -1325534, -3489661, -1377611, -4107599, -13721884, -3340948, -151398, -3389803, -11872900, -1575179, -4316442, 12988518, -6551973, 4451197, -1339493, 5409512, -88047, -10368051, 868120, -12613245, 1893544, 11355357, -3128347, 5855651, -3628174, 3750043, -796180, -7668664, -3462281, --737124, -1405528, -1443109, -71404, 7482370, 14288282, -19891604, -5077725, -8443369, 5253819, -41523744, 6526203, -20464982, 5366562, 18330920, -3980898, 17126182, 21787832, -11292006, 5116917, -11001022, 7477538, 468688, -3260954, -6773701, 3210488, 12930536, 6630356, 12075837, -18174154, --27954332, -3018288, 12449500, 10945187, 8934606, -3224447, -25788058, 8258685, 5703180, 38562900, -40577776, 9602473, -30213484, 21805012, -11513197, -30909270, -7226283, -36572184, -27841052, -12327630, --13419088, -28369870, 4927938, -11457899, -32447404, -29721710, 8568997, 19233400, -3187403, -25096030, -7439420, 679142, 8010114, 15735150, 15365246, -19425600, 25016038, 17154100, 2179696, 6874632, -17406428, -947577, 45532024, -32506996, -15527917, -1126355, -37047852, 30367566, 2215666, 38182796, -11797201, 8514773, -1935957, 7536594, 16196322, 599685, -15083388, -279173, -8052527, 6027450, -5833640, 10894185, -4585952, -13991930, -93952, 12934831, 6135898, -8311836, -4141959, 6788196, --9299678, -73014, 200253, 11882027, 4660040, -6519761, -2825015, -7402913, -11944304, -10364830, --573915, 2245194, -5921686, -4363687, 1389422, -5980742, 9357123, 4554813, -112206, 5616207, -18898392, -7196755, -3597035, 2127620, 5075041, -10196789, 11076721, -3732864, -341987, 1890859, -8283382, 13939316, -20240570, 5311264, -40421012, -10954314, -2504503, -9948755, 44377212, 13982803, --11787538, -27884002, -14134201, -11480984, -17661442, -12967043, 6787659, -40705552, -8760660, 29867740, --3534221, -3362960, -31095026, 29655138, 14704357, 660888, -11791296, 12633646, 6274411, -7092065, -13543106, -21024938, -5572720, -10743324, 6030671, -4918275, -13237626, 15024869, -11290932, 6260452, -438087, -20429012, -12710956, -3198140, -25550760, -25103546, -33590940, -8685498, 15413564, -11294153, --6150393, 19369766, -23638426, -19452980, 20959978, -184147, -1207960, 18855444, 282394, -16164646, --9269613, 6352257, 13656385, -20881058, -6546067, 25373594, 10982231, 24482924, 12709345, -5034239, -12915504, -1005022, -33172716, 10405632, -25092272, 18175228, 3194382, 6652905, -10552198, -28722594, -6056441, -4303021, -24893630, -10006200, 11196443, -12664248, 541166, 3904125, 8159364, -8134131, -459562, 1187022, -2124935, 5178657, -3711926, 2890513, 10241886, -1911797, 3526168, 2661269, --6600828, 2066416, 4929549, 2768643, -4922570, 6703370, 4693863, -516470, -6901476, -14190572, -2945811, -11234024, 9137006, -11469710, 7538742, 9346923, 475131, 518617, 304406, 5302137, -863288, -4902169, 11060078, 8794482, -4332549, -6929930, -11546483, 30285962, 10573673, 1117765, -3697967, -7909719, 12008192, 18662706, 47278464, 41293964, 3570729, -18179522, 8410083, 23943906, -6843494, 18540836, 13372381, 8978629, -14013405, -17995376, -21626770, -1507534, 8034810, 15232102, -30713848, 16253767, 19697794, 11454141, 18262738, 9215389, 17592186, -11748883, 3316789, 33205466, --892816, 25545928, 6771016, 20659866, -32779728, -5331128, -9662603, -9658845, 7645042, 12767327, -23741506, 38408280, 32172526, -11404212, 5713380, -42652248, 10361072, 9821516, 37580428, -29875256, -23767812, -7756711, -20943334, 16049219, 4952634, 13394392, 23541252, -7659538, -30149060, 15604690, --19382650, -26578868, -12633646, 35560720, -30868466, -43815644, -22111566, -7260106, 23110682, -2412698, --15756624, -30240864, -22830972, 14461155, -2065879, -565862, 19588272, -21336860, 6101001, 21908628, -8533563, 14666776, 21220360, -14371497, -7241315, -12146168, 16230145, 3603478, 8356933, 5915781, --14605036, 18138184, 4482872, 2874407, -7154879, -26519812, -25333864, 2524904, -12057047, -5004174, --11436424, -9946607, -4365835, 4672925, -151934, -11186242, 14283987, 11970611, -1611150, -12698071, -2081449, 7646653, -9074192, -4111358, -5211406, 105764, 6172942, -2850785, -6272800, -5078799, -4340602, 3631395, 6963216, 8684961, -4553739, 4962298, 5374078, 29707752, -9371082, -32829120, -2303713, -13711683, -46932720, -23738284, 61550640, 8608188, -27799176, -30521648, 3434900, 544924, -12710419, 15979963, -21530672, -14294725, -34346852, 7996692, -12463458, -8244727, 52476448, 11270531, --7266011, -54169740, -3506304, -28924458, 28660316, 35413080, 3704946, 27551678, -32466194, -12768938, --20516522, -4842576, 53586160, 66748624, 10649908, -17814988, -23848880, -48189532, 648003, 6236830, -58254252, 32518808, -8527658, -95784752, -49629420, 8249559, -9208410, 84136800, 28187870, -40377524, --16813186, -72086192, -22827214, 2542084, 47140488, 48652852, 54608360, 2605972, 12931073, -5740224, -4707821, 67189928, -24802900, 49356152, -11960410, -50673096, -15181099, -53717156, -17264158, 70350488, -31978716, 50233400, -16654273, 39395052, -44109316, -7026030, 10481331, 21001316, 41777684, -14097156, --912144, 2639794, -3962644, 6460168, 11143293, -11950747, 1816771, -12566537, -22738630, 10226317, -18471044, 10305237, -2400887, -13648869, -30422328, -29955250, -15804406, 10142028, 27996208, 15780784, -21655762, -29446832, -38612292, -29778618, 3344169, 33823940, 37554656, 28855738, -17244294, -73536816, --47265580, 1433982, 37015100, 79915920, 30961346, 6571300, -36389648, -47936128, -16660715, -15253576, -41878616, 46286324, 17299592, -2743410, -40172440, -30128122, 9175124, 13839995, 34061240, 16557099, --17607218, -12319577, -21082384, -10031970, 9893994, 9047885, -42673720, 47327856, 79994, -12333535, --73531984, -19794430, -19857244, -33175938, 71185328, 762894, 31891742, -48657148, 27015882, 22687090, --21895744, 14247480, -4211216, 12736726, -11274, 36422396, 12858058, -35328792, 21334176, 17614734, --125628, 24596740, -18190260, -9327058, 30848602, 21643950, 20540144, 10279467, 17868674, -53243636, -46468324, -26714160, -17028472, 10190884, -37363532, 54575612, -15540802, 5504538, 39363912, 1418950, --6029597, 21474836, 21863532, 38676716, -9465571, -35785132, -36576480, 4131222, -13237089, 17001628, --22143778, -10671383, -15008763, 11014444, -68702832, 1200443, 50918448, 14187351, 20697984, -1837172, --5666136, 13513578, -18181670, -20659866, 12731357, 7177427, -22406308, -24761560, 94551024, -10151155, --30826590, 8679592, 44281648, -1154809, -35003448, 14464913, -6626061, -13152264, 28478318, 36318780, --26598732, -43331388, 9740449, 10521059, -10088341, -25891136, 1218160, 13160317, -4068945, -4154307, --1796907, -4415764, 6888054, 7795366, -8993662, 1037772, 3818226, 2001455, -5440650, 2049773, --375273, -11969537, 8580808, 3749507, 16675747, 8359617, -6437082, 6887517, -3389803, 9914395, --782221, -2523830, 13587129, -3347927, 9285719, -2698313, -10821170, -893353, 12223477, -3416647, -13924821, -13224204, 17503066, 4168803, -12706661, 5348308, 207232, 6502044, -2196339, -5051419, --1344862, 13749801, -36681168, 13063680, 57882200, 91163904, -40308268, 29716342, -60186988, -17737142, --36666136, -4995584, 56018720, 59456308, 47245712, -1477469, -37729676, -22809498, 20542292, 1552094, -10303627, 31079994, -570694, 15476378, -39549668, -10077604, -22877144, -27851790, 15291157, 12749074, -862752, 27875948, -23661512, -837519, 6276558, -33347736, -921271, 2350958, -21088290, -7948374, -7907572, -14076755, 31412318, -10264435, 47582868, 35996120, -23460186, -6575058, -32610612, -37262600, --48400524, 15486041, 22308598, 64698852, 49334680, 23060216, 31351650, 6012954, -35638564, -23551990, --19966766, -24257976, -5161477, 13584445, -1313723, -16669305, 4335770, -16819092, 10569915, 24103356, -4692252, -25144886, 19643032, -12057047, -12808666, -25164750, 13012140, 11156714, 5700496, 3081639, -57028040, 43589088, 35642860, 6047851, -8293045, -48324824, -10136123, -5061082, 47498580, 27214524, -12364137, 14347338, 41133440, -6578816, -16415902, -22254910, -18644990, -8791261, -4198331, 3717831, -470836, 261993, 21325050, -2521683, -12791486, -7861401, -4416300, 405338, 10522670, 18998250, -8295730, -2470680, 11745125, -19793356, 7657390, 18059264, 7340099, 35661112, -14717779, 151398, -6039798, -15005005, 3818226, -23820426, -1304596, 8193724, 202400, 9552007, -6873559, -98972152, --57332444, -33006824, 56899728, 26718454, 151434640, 142380848, 147048400, 148809872, 159362080, 112170048, -58497456, 84954456, 50984484, -25337086, -47205448, -72698224, -141491248, -127397856, -132189968, -95741264, --97126392, -71905808, -59697360, -31661962, 3192235, -55934968, -28683940, -11565273, -8892193, -30245696, -7758322, 37929928, 42469172, 15897285, 50184544, 64004140, 15795279, 12648679, 12600360, 62896576, -65410204, 82695304, 92433600, 81021872, 91796336, 139584288, 56501904, 109003584, 148580640, 95664488, -112772960, 88794152, 44378288, 53079892, 58562416, 52206940, 70757976, 69860328, 43251932, 8553964, -21483426, 41210212, -2618856, 4862977, -19811074, -22673132, -70164200, -31477278, -121568512, -152609312, --122353952, -139229424, -189642128, -182987616, -108608448, -204403936, -185615072, -169261984, -191619968, -161540704, --123368640, -154789552, -114045880, -31465468, -75756240, -93522376, -37067716, -36899136, -30486214, -33470680, --14964740, 9385577, 19228032, 37520836, 48399988, 55624120, 62513248, 64763812, 91183232, 56041272, -107426792, 120423904, 57272316, 111874768, 106249976, 67575408, 81439024, 118371448, 80400176, 133591736, -100753488, 126689184, 88607320, 80711024, 83516712, 78212432, 61304216, 70387536, 61072824, 48525076, -36436356, 35748624, 28918552, 12790949, -8905078, -6702297, -5021891, -41681048, -68319504, -65333968, --67308576, -73023568, -67900208, -75548472, -54877336, -56453052, -46395312, -33914672, -26711476, -30027726, --29898342, -22257058, -15744813, -16895328, -22944790, -11113765, -5379447, -12097849, -19443854, -9938017, --6550362, -8323110, -9280351, 1234803, 3693672, 5188321, 603980, 1806571, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ -10777147, -565325, -710817, -370978, -846109, -5516886, -5599027, 5360656, 1287417, -3201898, -4889821, --2353642, -3695283, -6370510, 8149701, 987843, 2952253, 4065187, 11740830, -299574, 1874753, --2827699, -1044214, -2174864, -7653632, 1708860, -2341831, 756988, 5318780, -2099702, -523449, -1158567, 562104, -1263794, 248034, -7070053, 1466195, -169651, -2538863, 2211908, 1013075, --4758824, 7509751, 263604, 1077500, 6990060, -2716567, -3019362, -6895033, -3491809, 4756140, -298500, 5069672, -2485712, -5641440, 2451890, -5259188, -2351495, -10147397, 4169340, 3542274, -2161979, 3045669, 6957847, 1796907, -3055869, 3746285, 5778879, -3791383, 2860985, -32212, --1220845, -1973001, -1557999, 3882114, -789200, 4308926, -2186138, 1720671, -1349694, 1554241, -3149285, -1726040, 1147293, -1198296, 2544768, 2047626, 1743220, -897111, 603443, 46171, --1419487, 685047, 2486249, 415001, 842887, -1496259, 976568, -828929, 578210, -1155883, -246961, 1439351, -4263292, 1148904, -2638721, -5406827, -526670, -6386617, -7740605, -4894652, --3707094, -8543764, 345745, -3088082, -1716376, 2624225, 9100499, 829466, -2160369, -1046898, -1464584, -180926, 3781182, 6455336, -544924, 7248831, -833761, -477815, -867583, 4127464, --5459441, 847182, 662499, -1343788, -310848, -3264175, -5425618, 7451769, -2536178, -557809, --1328756, 3286187, -3546032, -3055332, 1299228, 1102733, 5207648, -3575024, 4289062, -2509335, --4294431, -341450, -1774358, 1162326, 2336999, -96637, 3032784, 1439888, 2210835, -2877628, --3377455, -5599564, -4112431, 521302, 6681896, 840203, 5427228, 1404991, -2794413, 3728032, -1772211, -4035659, 7071127, 1175210, -6658810, 1731409, 3018288, 594853, 2004676, 1728188, --4717485, 1716376, 1652489, 1159641, -271120, 3469260, 1168231, -892279, -1139240, -27917, -1389422, -43487, 1886564, -62814, 91805, 1084479, -450972, -1038845, -666257, 184147, --921271, -988379, 1214402, -119185, 1165547, 1020592, -284005, -105227, -7925826, -7044283, -1493575, 792421, 5896990, -4567161, 6066105, -3098282, -1376000, -9556302, -635118, 608812, --3299609, -598611, 5092221, 4796405, 7220914, -1804423, -1134945, 4485557, 2093797, 4023311, --9865003, 9699647, -2131915, -180389, 1511292, -1237488, -110595, -921807, -708133, 5994164, --212601, 7884486, -1402307, -3304441, -6638946, 715112, -3027415, -2676302, 4524748, 3469797, -4732517, 100395, 551903, -7090991, -5110474, -136902, 6361921, 2152316, -864362, 2080375, --2708514, 6755447, -405338, -5951751, -7515656, -2733210, 8337069, 6265821, 6430103, 2943663, -204548, -7072738, -3171833, -1051730, -4138738, 4261145, -774168, -2022393, 3659849, -10044855, -2955474, -1336272, 2339684, -823023, -2889439, 4495757, 1690607, -4779225, -5060009, 2518462, --1334661, 2944200, 783832, -2180770, 1529008, 1863479, -104690, 701690, -15569, 191663, --858457, -38655, -1403381, -8053, -1224066, 1960653, 1071058, -1527935, 744640, -406411, -515933, 512175, 682363, -1140314, -983548, 336618, 729071, -2079301, 1998770, -2255932, --4347044, -718333, -3367791, 1539746, 5449240, 2134062, 191663, -2223183, -12671227, -8353712, --275415, 3665755, 4435091, 253403, 893890, -1790465, 4396973, 1946694, 3522410, -5526013, -5233955, 3003793, -5957120, 2228014, 5456756, -302795, 1762010, 885837, 4947803, -3852586, -2935073, -506269, -671626, -4738960, 285615, 5064840, -3237332, -2345589, -4439386, 5945309, --585726, 1154273, -4670240, -13304735, -3882651, 1950452, 1222455, 4910758, -3543885, -2189360, --2022930, -892816, -4280472, 129923, -3865471, 8712341, 3061238, 7106561, -7205882, -1422171, --2992519, 6658810, -2034204, -1232119, -5551245, 3438658, -120796, -3711389, 5666673, 1753957, -686658, 6502581, 1386201, -5708549, -804233, 687195, -1557999, -1929514, 34897, -4849018, -9607305, 3958349, 1390496, 5988258, 2593087, 2364380, 4395362, -1264331, 3718368, -2139968, -634581, 381178, 216359, -1116155, 665720, 284542, -360777, -654446, -629750, 457951, --499290, 38655, 3181497, 330712, -100932, -57982, -49929, -434329, 2523293, 650151, -3537443, -2817499, 2245194, 212601, -1456531, 6012954, 4573604, -463320, -8202314, -10941966, --8458938, 3131568, 2147, -4726075, -1237488, 554588, -1080721, 12313671, 2121177, -8896488, --2370822, -2659122, 442382, -4187593, 6958921, -5204964, -6828461, 6375879, -2687039, 1750736, -1686848, -2916283, -8038568, 1070521, -4287451, -3781719, -3941169, -490700, 6245420, -864899, --1425392, 9240085, 1687385, 1414655, -11931956, -1331440, 6349573, 7443179, -4126927, 2018635, -1008244, -11766600, -1585380, -723165, -1211181, 2961380, 120796, -6602976, 846645, -5281199, -5046587, -1800128, 6498823, 1294396, -7490423, 3306588, 14011794, -5455682, 105764, -10463077, -2514167, 8785356, -15782931, 2240362, -1142461, -1377074, 3896072, -2556579, -4139275, 7384123, -7047505, -6127845, -768799, 4617090, -2088965, 1077500, 2153926, 1355062, 418222, -1801739, -3913252, -121870, 2546379, 90731, 3491272, 2381023, 2188823, -206695, 724239, 3904125, -386010, -828929, 1340030, 1198833, 426276, 3237869, -1850594, 1012539, 478352, -751082, -192737, 1150514, 773631, 368293, -357556, 10545755, 1312113, 4729296, 7472706, -9213779, --2827699, -7031399, 3537443, 4080219, 8115341, 15709380, 2473364, -11980811, -1119913, -3011846, --1242856, -5181341, 19327, -579821, 5938866, 4727686, 1721208, -424665, 237834, -1845225, --1370632, 6804302, -2219424, -911607, 5085242, -638876, 2996277, -507880, 6472516, -4941897, --9785009, 12170864, -717260, 2889439, -9159555, 674847, -2786897, 13503914, 2127620, 6112812, --1278827, 5420786, 3648038, -12222403, -1926830, -6863358, -5900748, 823560, 8613020, 1080721, --1730872, 13370233, -1416802, -7556458, -5770289, -3954054, 6562173, 20201378, -41876, 5605469, -1449015, -6439767, -1414118, 110595, 5994164, 9183177, 844498, 7380902, 6585259, -12097312, -400506, -2161979, -308164, 6061273, -2705830, 1574642, 2862596, -933082, -6212134, -4313221, --9073655, 2170032, 3616899, -457951, 1396401, 1334124, 1102733, -111669, -2817499, 595390, -1336809, -161061, 1238024, -1473711, 2416993, -210453, 1214402, -670552, -434865, -1170379, -307090, -629750, 425202, 1995549, 3209414, 2651069, 402116, 690953, 1966021, 1089848, -61740, 1107028, -3595961, -15602006, 3535832, -1578937, 5350456, 3427384, 14518600, 2919504, --2752000, 3476776, 11107859, 12294881, 5073967, 8657580, 8855686, -6877854, -5345624, -11141682, --12038793, 1308354, 5182952, -10187126, -7247758, -562104, -11782706, -9769977, 4940823, 1574642, --5240934, -3494493, -7734699, 6403260, 4674535, 10535555, 20037634, -2236604, -5697811, -2153926, --9894531, -130460, -7713225, -8533563, 10260140, 1158031, 1399086, -13215614, 13617731, 2695092, --8506183, -2742337, 7001871, 456340, 1504312, -246424, 1125281, 3974992, -6519761, 7614440, -151934, -5370857, -1512902, -9192841, 1410897, -9438191, -8380018, 7211787, 7444789, -7509751, --11927661, 3016678, -5761162, -876173, -3193845, 3989488, -3428995, 5269925, 1673964, 6383395, --1469416, 4763119, 2445447, -10707890, -3758633, 2610803, 1387274, 173409, -5303748, -3001645, --1598265, 3514894, -2059974, -1792612, 139586, 2811593, 2184528, -141734, -168577, -3084324, --1665374, 570157, -738198, -328028, 2500208, 255551, -187905, -2270964, 2157684, 675384, --832687, -454730, -1526324, -306016, -1687922, 2272038, -574989, 1036698, -671089, -5950141, --6492917, 7844758, -2418604, -1865090, 4541391, -6562173, -6891812, 7908109, 10597295, 156229, --647466, 3563212, -9122511, 15533823, -9554155, 1101122, 7441568, -3567507, 6942278, 8364986, -2761664, -8844411, 9496173, -1446330, 3564823, -6941741, -1299228, -13173202, 4515085, -7838316, -3003256, -13557064, 7932805, -9918153, -6914361, 5629092, 7830263, 2609730, 857383, 300648, --8515846, -7917236, -5054640, 20558398, 11280195, -3259880, -19086834, -2710661, 5343476, 11081016, --6300717, 886911, -13201656, -4544613, -1656247, 3415573, 1904281, -2968359, -267362, 5774584, --6553583, -365609, -7466801, 4042638, 4829154, 14220100, 6005438, -6909529, 2899103, -3844533, --10779831, -1352915, 6178311, 890669, 17669496, -10124312, -4980015, 2747705, -9261023, 4723391, -1441498, -1725503, 8959302, 2243584, 3937948, 88047, 292058, -1381906, 4413079, 6648610, -1566053, -1886028, 4827007, -2508261, 1494112, -4545686, -1559610, 18790, -6048925, -74625, --2371896, -1037235, -2367064, -3873524, -1835025, 1373316, 1493038, 1085016, -1296543, -157303, -2632278, -4362613, 431644, 417149, -13570486, -1995012, 2784750, 8011188, 3901978, 10459319, -1907502, -12502650, 7962870, -10576894, -11319386, 316754, -1024887, 8618389, 10716480, 9855339, -14375256, 3517041, -14821395, 16237661, 8883603, -6554120, 12497818, -1608465, 1533840, -10947872, --3779034, -3151432, -4844186, 10478646, -17576080, -3969087, -8249559, -7847979, 1469416, 8490077, --3997541, -10140955, -10750303, -14012331, -14158360, -7192460, -2392297, 6127845, -11108933, -14416058, --8506720, -3622805, -7059316, -4721243, 12593381, -7055021, 1205812, 6684580, -11381126, -6763500, --7662222, 12394739, -5257577, 8077760, 17764522, -1710471, 4006131, 1747515, -5410048, -7113540, --4846871, 8394514, -1222992, 9609452, 603443, 7258495, 1714229, -12169253, 15118285, -6496138, --1899449, -12928388, 7967701, 16992502, 2893734, -2309082, 4532264, 1982127, -10844256, -5055714, -667331, -2554969, -1145146, -4667556, -4559645, -740345, 833224, 694174, 7915625, -897648, -1025423, -3894462, 3021510, 339302, 5953899, 2591476, 2698313, 1137093, -692027, -2538863, --2133525, -3531537, -752693, -2656437, 1797981, 926102, -41339, -1846836, -1559073, -1349694, --525597, 632434, -620086, 3264712, 25151866, 15858093, 11541114, -8339753, -18103824, -4887136, -11023570, -17148730, -9342628, 330712, 13471165, 9654013, 7827578, -9936407, 7499013, -2677375, -7496866, -1966021, 19477140, 11673721, -960462, -17914308, -1842541, 13576392, 11553999, 478889, -23611046, 10676752, -4741107, -11274, 1634235, -2794413, -6589017, -9094593, -1425392, -25530896, -7237557, -8759586, 1218160, -900869, 6671695, 9496710, 244276, 2526515, -11388643, 8116952, --4136054, 16902306, 390842, 2413235, -41176924, -1771674, 10990821, 5671505, 11689827, -4008278, --11527692, 6405944, 2239289, -9446244, 8995809, 1823214, -9052180, 132607, 390842, 3158949, --3324842, -15074798, -15101105, -620086, -5431523, 5064304, 5326833, 2240362, 5669357, -18458158, --6325950, 951335, 4095788, 4457639, -7348689, 5798743, 1354525, -2641405, 1953136, 5231270, --3476239, 703301, -1121523, 2164127, -3536906, -5531918, -1867237, 6581501, -4975183, 702227, --3717831, 2637110, -1538135, 2334852, 3792993, -456340, -3773666, 3089155, -638876, -4412542, --2815888, 1587527, 2040110, 243739, -1784022, 879395, -360240, 2723546, -1286880, 5278515, --1805497, -338766, -17376900, -27957016, 4509179, 9677098, 10051834, 234613, 23232014, -16529719, -5446556, 3175592, -4715337, -14674293, -6182606, -8348880, 9849971, -4332012, -9039296, -14936286, --1385127, -5524939, -2858301, -11268384, 5998459, -715112, -5276904, 6056441, 7714298, 9128953, --11872363, 21665426, 1310502, -3126736, -13320841, -12525735, -2552821, -1655173, -12993887, -13547401, --10397579, 8717173, -6026376, 14463302, 4626217, 24142012, 8279623, 9154723, -3110630, 12936978, --2264522, 3099893, 18344880, -5612986, 6648610, -22091164, -28115392, 6105296, -1340030, -17862232, -1100585, 416075, -24268712, 6801081, -7158100, -4825933, -9486509, 9125195, -8864812, 475668, --991064, 4383551, 10201, -13307419, 7777649, -1945620, 3088618, -16776679, -23128936, -20609938, -1129576, -4911832, -23419382, -4959077, 22472342, 11819213, 5201743, 4257387, -10406706, 313533, --2399813, 975494, -3435974, -2799782, -134218, -285078, 882616, -62277, -7270306, -1775969, -1901060, -1392106, 3484829, 5705327, 4792647, -81068, -818191, -2521683, 7605314, 4359392, -5002563, 4150549, 3061775, -592706, -2911988, -2636036, 5932961, -4625143, 3535832, 4973572, -1946157, 2441152, 398895, 1452773, -4019553, 342524, -1163399, -3464428, 1655173, 4502200, -17013440, 22207666, -609885, 5915244, 14047227, 11515344, -1154273, -28256590, 19372986, -1897839, -5290863, -5753109, 9942312, -688269, -12208981, 3455301, 22258132, 3417183, -14577656, 12876312, -9211094, 6034966, -10961830, 11849815, 8789651, 1059246, 14148159, -5618354, 3795141, 22789634, -16604344, 692027, 5258114, 11207180, -21488258, -4309463, -1371168, -3334505, -18830748, 4853850, -5690295, 1117765, -14606110, -193810, -25002078, 1371705, -17870286, -3498251, 9190156, -7589207, --10824928, -8662412, 5292474, 4399121, -9991168, 3986804, -3618510, 12357158, -6432788, -7212324, -6405944, 11547020, -1131724, 5045513, 4429185, -27272506, -653372, -1990717, -13942001, 1463510, -17747342, 5434208, -5013838, -2178622, 12960601, 9126269, 5649493, -3660386, 20578798, 215285, --17133162, 2302103, 20594368, 10698227, 10449119, 6193343, 1111860, -5087926, -5848135, 3718905, -3339337, 4894652, 7726646, -1924145, 6099391, 3716221, 595390, -1059783, -640487, 2727841, --2798171, -1088237, -2775086, -79994, -1316408, 3003256, -6227703, 1049046, 2109366, 649614, -4734665, -8426189, -3519189, 1399623, 1598802, -867583, 4845260, -1814624, -1625645, -2360622, -545998, 3094524, 3670587, -4711043, 680215, 2130304, -4300336, -2760053, -2381023, 10858214, --24999930, 10623602, -25888990, -30714922, -19870130, 1301912, -16953846, 16509317, -5198521, -20650202, --718870, -5247377, 2784213, 3854196, -4838281, -2660732, 13602698, -4061429, 5177046, -7419019, --7413651, 21684216, -7320235, -2482491, -671089, 4947803, 13340705, -27210228, -1862405, 14588393, -14052596, 13207024, 1721208, -4919348, 27983860, 9512279, 8803609, 10951093, 4952634, -3930432, -173409, 16513612, 5310190, -11636677, 6145562, 30393872, -16061567, 21014202, 7673496, -32036698, -7738994, 21563420, -2359011, 9717900, -139050, -24270324, 12265890, 30292942, 1695975, 20613696, --12475806, 18243410, 15049565, -448824, -2733210, 16751983, 8845485, -21932250, 21966610, -5388574, --5021354, 13378823, -6460168, -7856032, -9805410, 3475702, 1141388, 3710852, -921807, -4400194, -16507707, -14699526, 2546379, -3001645, -4816269, -12002823, -11434277, 6792491, -865436, -7376607, --10200010, -8520678, -14532022, -10282152, -565862, -7103876, -4271345, -1016834, -7528541, 3219078, --6624987, -6803228, -1839320, 1730872, 2432025, -3401077, -414464, -10677289, 4288525, -11201812, -8606578, -2839510, -696322, -4888747, -2665564, -511101, 12885439, 6487011, -1297080, 3105798, -8879308, 4852240, -4823249, -2263985, 3504157, -4363687, 7255811, 1659468, -2751464, -9733470, --17276506, 41490456, 20529406, -48380660, -19943680, 5135171, -8019778, 13976897, 16455093, 17657148, -20198158, -12408697, 38267084, -5759015, 966905, -12525198, 14421426, 19216758, -13847511, -15796353, --3321620, -9097278, 1703491, 7664369, 1187022, -9943923, -3753802, 15758772, -1251446, 7963406, -1928440, 18963354, 28427852, 10781979, -13657996, -32020054, -2677912, -5435818, 3614752, -7410966, -10574746, 17748416, 1617055, -6579353, -14616847, 35007204, 30626874, -4062502, 14962592, -8333311, --11172821, -33723008, 18655728, -15736223, -3610994, -1009317, -10524280, 5906654, 20729122, 3166465, --9123047, 9830106, -4212289, -13922136, 21197274, 4300336, -29335164, 37610492, -25462176, -13650480, -14563160, 14927159, 12528956, 211527, -31333934, -2699387, 2771865, -1823214, -10283225, 6072010, --5368709, 2219424, 3911642, -13015362, 15054934, 10473815, 5058398, 2019708, -6152004, -4570919, --287763, 5305895, 479426, 4092567, -2443837, -10081899, 3063386, -14777372, -4672388, 4699768, --4357245, 8082055, -6839199, -1012539, -5810554, 6439767, 570157, 7920457, 9215389, 6330782, -272730, -6976101, 5067525, 8566849, -1691680, -1002338, -9176734, -4050691, 10659035, -3643743, -7198902, -625455, -4006668, 3777424, 3577708, -220117, -6046240, 11009612, -13350369, 1488743, -19088446, 5660767, -25897580, -20773146, -4972499, 32402308, 3388729, -15560667, -41794328, -11627013, --1897302, 9924059, 28767690, 22038550, -3075734, 273267, 18925774, 15400679, 718870, 4223027, --56398288, -35560180, -17326972, -27866284, 2423435, -15544024, 24958592, -5713380, -1955821, -121870, --10050760, -11476689, 18085034, 11269457, 6401649, -2557116, -8611409, -7713225, 9009768, -20211042, --7572564, 3575560, -7006703, -9842991, 8429947, -29213294, -40877352, 9722195, 12773233, 15865072, --23870354, -12692702, 13218299, 5018670, -39848708, -34999152, 2127083, -16938278, -17521320, 6517613, --32193464, 16337519, -12453258, 13426605, 12884365, -7986492, -18144626, -41929080, -14698989, -12596602, -23536420, -20343112, -13267691, 7176354, 24059870, 14025216, 134755, -8189429, -2694555, 7198902, --7215008, 24314346, -15066208, -11809013, -5706938, -2113124, 6685117, -17911624, 10549513, 8086887, --7503308, -12542378, 2917894, -726923, 12212203, -15664819, -20432770, -5183489, 3233574, -11303817, --1701881, -13669270, 591632, 3334505, -6150930, 9537512, -2569464, -6759205, 2962454, -4568772, -2782602, -3892851, -14200236, -624381, 1042603, 13556527, 10633265, -6525129, 48855, -730681, --8017094, -10256919, 4974646, -2605972, 16578574, 22886270, -3692061, -30660160, 13882408, -4548907, --12843026, -26422102, 7880728, 11391327, -39294120, 14899778, 13943611, 35492536, 3193308, -8806294, -2186675, -43276092, -12596602, -5193153, 561567, 8008504, -14820322, 26643830, 10639171, 32916092, --6595996, 28962576, 18548890, 11494406, 26331370, 13402982, 17376900, 22443352, 979789, -29222958, --27638114, 5697811, 31644246, 22919556, -42161008, -1154809, -7140920, -5870147, -4425427, -29152628, -7481833, -20750598, 18728204, -13863081, 42258720, -11057930, -60625612, -6389301, -20892332, 12115566, -9003325, 17330194, 39346196, 8854075, -5344013, 21606906, -12717398, 44028248, 7401840, 29479044, -13830868, 2748779, -11143293, -10016937, 72156528, 499827, -49803904, -9943386, 39811124, -23718956, -5226439, -10902238, 17481590, 36625332, 21109228, -42098196, -2716567, -41441604, 5776731, -5648956, --24572044, -2823404, -6636798, -10808822, -51540, -21182242, -23331872, 8162049, 8832600, -1073742, --26111790, 18964428, -23133230, -35760436, -15251429, 9017821, -8870181, -15883863, -20550344, 3874061, -8719320, -18568218, -14231374, 7015292, -8236137, -14959908, 12331388, 9922448, -863288, -1781875, -733366, -3338263, -6132140, -6456410, 2426657, -13791677, 8188355, -4853850, 3129421, -17563196, -19862614, 8601746, -41219340, -15463493, -46809236, 7136088, 41261212, -30403000, -28509992, 27263378, -12817793, -46663208, -44222056, 14179298, 2340757, 6492917, 15054934, -1842004, -13276818, -6750615, -28258738, -20231444, 34893924, 5688148, -8170639, 7460358, 20160040, -66035, -6035503, -37338836, --16387448, 4151623, -20010790, 17273284, 25791816, 1869385, 4271345, -26709864, 31865436, -11181410, --14242112, 25995826, -9982041, 63888, -18635326, -1882806, -13100187, -45913736, 15767899, -5132486, -34142304, 43797392, -636192, -7803956, -27747636, -8760123, -7719667, 41678900, -39604432, -27948962, --65650724, 1553168, -27175868, 7553237, 22786948, -12267500, -3419868, 44805100, 28895466, 20443508, -3535832, 2065342, 34000036, -36841692, -1599339, 10486700, -4348655, 20357608, 9764608, 86453400, -13671955, -23593330, -1321776, -16160351, -42596412, -16866336, 1589675, 7254737, -8201777, -8815957, --8061654, -30419642, -380641, -2487860, -16158204, 4329864, 10854456, -26075820, 1714229, -17685064, -6940131, -1188632, -6142877, -3491809, 1520418, 15397995, 8981313, 712428, 17038672, -10439455, --2198487, -4952634, 16037945, 10751914, 7636989, 16508244, 7682086, -11731703, -5632313, -1896228, -8182450, -14766098, -3795677, 511101, -16674137, -5153424, 3046743, 39967356, -29358786, 10187126, --10080288, -14249628, -13894756, 60410864, -8102993, 29662118, -23952496, 41220948, -14300094, 619012, -22200686, 23814520, 56834764, 2729989, 9287867, 8366060, -24148990, 29367376, 9083856, -17220672, -28592672, -11921219, 36013300, 27555974, -8522289, 23985244, 1105417, 22402550, 4494147, 37963752, --23156316, 18978386, -38318088, -9519258, 12867722, 41161356, -1799591, 3412352, 17701170, -33823, --13842680, -49345952, -30565672, 8572218, -21226802, -814433, 15631533, -42968464, 26382910, -1753957, -31374200, -14782204, -29316374, -4968741, 81069656, 18556406, -73726872, 13147969, 18796388, 4758824, -80268640, -4679904, -59086400, 61500712, -20658256, -3779034, 67184024, -7036767, 44205952, 7305203, --39879844, 1889249, 68692096, -55832964, 29460792, -34133716, -38674568, 28916404, 17336636, -35212828, --12924093, -21783538, -11882564, -12636331, 6479495, -21457656, -4380867, 8898098, -22167400, -15715822, -11656004, -25834766, -6252399, 9485972, 3726421, -5734855, 19696720, -8184597, -6503118, -9164923, --17583596, 8910983, -11285027, -12857521, -2964064, 2612414, 26276610, 448824, 7557532, -21226266, -2385854, 28039158, -4991289, -2930242, -2004139, 1730335, 2128693, 19714436, -10024454, -11496017, --5719286, -18080202, -21735218, 6255083, -10706280, 4831302, 7155416, -2831457, -59272160, -4502737, -9341017, -22149684, -6276558, -62209380, 39604968, 60552060, -26386132, 8626442, -45832668, -134351408, --25496536, 6305012, 68467144, 57360900, -55874304, -49930068, -50170048, -41327784, -28981366, 35647692, --5895380, 78442208, 53333292, -15690052, -64530272, -161987920, -104619496, 7413651, 180211456, 137005696, -25395604, -70498664, -176747024, -181269088, -12873091, 105720080, 163697312, 179224160, 18813568, -57812944, --72967736, -97120488, -87207704, 5997922, 60911228, 112878184, 78005736, 62162672, -80438296, -98913096, --115971096, -139978352, 16073915, 168083008, 165907600, 33821256, -59391880, -157364912, -206188496, -69681016, -16271484, 76959912, 188817504, 69573640, -120796, -103770704, -84727896, -35640712, 43162812, 73891688, -129699960, 34027952, 67864776, -5279052, -86502248, -71621800, 4298726, 83715888, 91382408, -41357852, --79054240, -97001840, -24165634, 16066399, 23223426, 15007153, -48373680, -41856068, -17251810, 31224412, -122943, 667867, 7054484, 25016574, 20189568, 15680389, -8432631, -58986008, -39224864, 4601521, -30595736, 56680684, 27466852, -15790984, -37396280, -49383532, -30944702, -19737522, -25875568, 56848188, -59322088, 65154116, 54059680, -24903294, -103533944, -87678000, -47266116, 40143984, 131068984, 127107408, -7181186, -80014704, -125314800, -112710680, -7301982, 62820876, 59038620, 28792388, 25959320, 1650341, --33602212, -40205724, -50968376, -7521562, 47725676, 58698780, -15966541, 28918014, 22234508, -50995756, -556735, 26229366, -21069498, 28992102, -1177358, -5317170, -2079838, 5842766, 22042310, -8664023, -25974888, 17655536, 10581726, 11747272, 8925479, -2257005, -14860050, 24277302, -318901, 14809584, --8828305, 13185013, -4528506, -1902134, 8979703, -12024835, -12657805, 1853278, -5434208, 19648938, -19447076, -17819820, 8906688, -10619844, 12240120, 242666, 8045011, 3038153, 10436771, -12695386, -8816494, -14608794, -6305012, -2041720, -1619203, 11767674, -22232898, -4416300, -9158481, -19836844, --1723893, -7810398, 4771172, 18854370, -5638755, -26197690, 4243428, 16218333, 31729608, -1415192, -2827162, -17111150, -12948253, 14730664, 1374926, -5624797, 479426, 25844966, 11486890, 8135742, -14006962, 23812372, -26989574, 10754061, -4582730, -40346924, -4668093, 31160524, -5753646, 27719182, --1212255, 17201344, -20373714, 12578349, -13850733, -4159139, 27357868, -7894150, 2544768, 536334, --95026, 9953587, -19327, -4132832, -2304250, -796180, -1913408, 4961224, 7856569, 11409044, -1311576, -9845139, -4406100, -12717398, 4774930, -13185013, 7102266, 5351530, -4054986, 7299297, -2342905, -13675176, 213675, -76236, 4335233, -23445690, 8156143, 5124970, 2024540, -702764, --6482180, 7585986, -11853573, 11857868, -962610, -1513976, 3175055, -5789079, 10041097, -11388106, -3120294, 5666673, -18602578, 47546360, 81918984, 7001334, -53594748, 17987324, -4036196, 66428648, -31203474, 65299072, -6147172, -31010200, -8445516, 14497662, 27434640, 21486648, -12107513, 2127083, -11644193, 8481487, 25916370, -18101676, 4362076, -24417962, -3969624, 375810, 6269579, 12771085, -2782602, -10392747, 19841676, -1796907, -17564806, 23981486, -4110821, -8528194, 6340983, -3521873, -18622978, 29777008, 711891, 7809325, -10021769, -6200859, 17184702, 12502113, 14227616, 2869575, --9052717, -18654654, -19214074, -20816096, 16675747, 18391586, 17963700, 26867168, 28713466, 12473122, -1501628, -25042880, 15365782, -2641405, -22793928, 28186260, -2081985, 18554258, 9683004, -28148678, -7787850, -8326868, 6015102, 19123342, 3551938, -23519778, -16756278, -13851270, -24720758, 15097884, --1529545, 26015690, -278636, 4284767, 506806, -13981729, -9044127, 4971962, -21210160, 6448894, --230854, -4076998, 7630547, -11741904, 7159174, 4694400, -964757, -9938554, 13069585, -3272765, -11591580, -19562502, -14445049, -8491150, -7606924, 9283035, -3913252, -2398739, -2508261, -9782862, --5340255, -6004901, 5369, 18176838, 2413235, -4599910, -304406, -10551661, 7688529, -5866926, --1044751, -4017405, 8615704, -741419, 1133871, -1828046, -6256157, -4242891, -28952374, -64612416, -4344360, 89608584, 118366616, 101700528, 70055208, -2914672, 4304094, -51729660, -61686468, -103484552, --78303160, -83074328, -26999776, 7085086, 27022860, 45565844, 112878720, 94036160, 63225140, 20563230, --10024991, -40764072, -30468498, -42386496, -54056460, -29969208, -30943628, -37946036, -17762374, -24944634, -5234492, 17736604, 14780593, 48179332, 44348220, 39479340, 25711284, 29920352, 18719078, 35820564, -8548596, 31002684, 1305133, -8011188, -54050016, -23408646, -65131568, -75568872, -84667224, -66250944, --49894100, -17588428, 12695923, 48693656, 51729124, 40917080, 83977888, 68207840, 72732584, 67517424, -62844500, 25343528, 40615360, -16246788, -40565428, -42363948, -100017440, -99781216, -96569120, -102589048, --84755272, -28858960, -14339822, 22893786, 57223460, 62527744, 76206680, 91983704, 81889992, 63985884, -57964880, 42847668, 15886010, -1489280, -34487512, -50524384, -51147692, -58143656, -48959404, -54687820, --57213260, -48105780, -37660420, -18705656, 2109903, 24988656, 47800840, 44987100, 44140988, 52310016, -57549876, 44773960, 44595720, 20092930, -21121038, -15204184, -37029596, -46794204, -39329552, -32074278, --22808960, -28344636, -20791400, 2631204, 5814849, 10131291, 25145960, 22437982, 13969381, 3660923, -9356586, 9878962, 2691334, 12460237, -7876433, -8296803, -7046968, 4810900, -1621350, 408022, --920197, -1432909, -9473087, -6236293, -2992519, 9042517, -363462, 4274030, 986232, -4624069, --6285148, -2857227, -4555350, 1460826, -666794, 1704565, 460635, 2238752, -2809982, 2257542, --2128693, 613643, 453656, 4232691, -520765, 2398739, -1600412, 1698660, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -{ -{ -10392210, -5522254, -621697, 3624953, 906775, 827318, -11378442, -4951561, -5636071, 4433480, -609885, --3697430, 4030827, 4161287, 273267, 3995393, -1669132, -137439, -234613, -2466922, -1284195, --5468567, 2826089, -8085276, 3376381, -4217658, 3442416, 6427956, 2934537, -1225139, -1817845, -4749697, -766115, 219580, 4495757, -4817343, -140660, -1630477, -2774012, 588947, -674847, -994822, 4607963, 7593502, -2413235, 135828, 6307160, 478352, 1658931, -2324114, -3534758, --520765, 1059783, -5959267, -1564442, 3112778, 404801, 1123671, 1848983, -856309, -1862405, --1762547, -2088965, 2303713, 1887638, -1099512, -3414499, -4198868, 2074469, 36507, -3484829, -3675955, -803159, -245350, 560493, 1037235, -1738925, 2198487, -2341294, -792421, 2876554, --1988033, 1146219, -3364570, -2572686, -1239635, -833224, -216359, 454730, -1357747, -1698660, --171799, -967441, 378494, -358630, -309238, -463320, 358093, 99858, -357019, -693637, --419833, -258235, -65498, -375810, -242129, -530428, 484794, -777389, -482647, -3735011, --1026497, 29528, -3537979, -3579318, -2147484, 8588861, -6032819, -2480344, -4212826, -7670812, -2864743, 1315334, 298500, 6585259, 6234682, 6248104, 2017561, -1168768, 966368, 4709969, --2014877, 2031520, 2379412, -5556614, 7911867, 1534914, 2460480, 5851356, -2251100, -5838471, -393526, 3965329, -2795487, -1268089, -3726958, 3946538, -102542, -402116, -6477348, -280784, --788127, 3987877, 2035815, -3551938, 7084012, 2614561, 1473174, 2481954, -1156957, 3972308, --1548873, 195958, -4946192, -5907191, 4734128, 3708168, 6558952, 640487, 1768453, -5080947, --7865696, -3861176, -2361158, -2291365, -3635153, -3130494, 1619740, -911070, 2384781, -2952790, --1132798, 1296006, 1466195, -887985, 4000762, 1215476, -3007551, 6041409, -2371359, 1858110, -7621957, 1625645, 1044214, -2364380, 104690, -2596308, -3103114, -500364, 1752884, -35970, -223875, 94489, -842350, -270046, 74625, -762357, 1786170, 1145146, -670552, -165356, -49929, 468688, 251792, -1188632, -643171, -286689, 130460, 528818, -554588, -855235, -733903, -440234, 562641, -306553, -474594, -594853, -7397545, -6890738, 4037806, 923418, -5655935, -8740795, -1234803, -3472481, 938450, 10416906, 5942624, -9100499, 3445101, 869731, --3796751, -4218195, -5163625, -8378408, 299037, 1012002, -3108483, 1497333, -1791538, 328565, -2529199, 1962263, 5405753, -4719632, 8511015, -5179731, 4942971, 3930432, -3186866, 2304250, -413391, 3547106, -1415192, 1859184, 3246459, 1095217, 506269, -1288490, 2530810, 771484, --1128503, 6067178, -7913477, 557809, -4792647, 9545565, 3368865, -8307004, 3237332, 10912438, --10240276, -4869956, 1237488, -826781, -3880503, 3263638, -1356673, 7271917, -6100464, -593242, --2014340, -408559, -365072, 7027640, -6501507, -2147484, -700080, -6708202, 3629784, 2815351, -7256347, 2964064, 6179384, 5575942, 922344, -2234457, 1755031, -185220, -766652, -1662689, --151398, -2552284, -1016834, -568546, -3579855, 2290291, 199179, -2493229, -415001, -2019708, -197569, -78383, 1389422, -474594, -802085, 179852, -1145146, -31675, 1200980, 447213, --251792, -802085, 3296388, -5092758, 646929, -3200288, 3375308, 1202591, -5126044, 14813342, --9423695, 2960843, 16047072, -11346767, 5281199, -311385, 5247913, -1407676, -9698573, -2138357, -8009041, 7163469, 1985886, -83752, 4054986, 1973001, 146566, 3340948, 3372086, -2800319, -4296578, -1207423, 6772090, -5470715, -8420820, 1783485, -7351374, 2523830, 137976, -2116345, --2353105, -3370476, -5003100, 958315, 1763621, 165356, 1272384, 1444183, -3084860, -6468221, -5076115, 1124745, 832687, -328028, 7459285, 1489817, 3123515, 7870528, -4842039, 1898912, -315143, 2367601, 5519033, 4314832, -7193534, -6312528, -1625108, -3610994, -828929, 247497, --3098282, 1636383, -5752572, 273267, -5535139, 2728378, 2709588, -3211562, -4210679, 461709, -2310156, 423054, -4866735, 680752, -2786360, 2087891, 1733556, 775242, -913217, -1369021, -967441, -144418, -523986, -34360, -1255204, -1057636, -3339874, -828929, 3043521, 1330903, --873489, -605590, 2124935, -732292, 638340, -942208, 38118, -236760, 113817, -1210107, --803696, -461709, -345745, -436476, -503585, 101469, -332323, -763967, -627065, 402653, -4677220, -1999844, 4235375, -798864, 2111513, -2433636, 289910, -1598265, 1406602, -769336, --9246528, 7022272, 4505958, 11582453, -7600482, 4742718, -9403294, -1615982, 5735929, 6206765, --6599754, 1888175, -7645579, 564788, -8964670, 2935610, -6715718, -8334384, -7456600, 3742527, --6024766, 259309, -7065758, 916976, 1037772, -1066763, -5172751, 3245922, 4540318, 2703145, -2114198, -5530308, 3007014, -5799817, -1833951, 3555696, 114890, -806380, -1561758, -226560, -3678103, -4279398, -8246337, -1745904, 2537789, -1745367, -6114423, -6185290, -8768713, 2093260, --2529199, -8213051, 5869610, -5265630, -5160403, 9916543, -3586298, -1962800, 811212, -1802276, --3236258, 796180, -5443871, -2702608, -4580046, -3617436, -1503239, 2949569, 7511361, 375273, -4514548, 370441, 3368865, 2333778, 6068252, -450972, -136365, 615791, 2243584, -1245004, -259846, -605054, 4437775, -185220, 2143726, 307627, 855235, -772557, 992137, -2736968, -2974802, 54224, 59056, -2241973, -564788, -3023657, 1427540, -1555315, 1022739, -424665, -3001109, -1482838, 594316, -2636036, -2096481, -218506, -911607, 704912, 7662222, -11038066, -1987496, 9656160, -3582003, 10575283, 2946348, 666794, -3067144, -7385733, -4858682, 12589623, --6763500, -59056, -2337536, 983548, 7577933, 6807523, -4125853, 9834401, 9819906, -4629975, --2421288, 5980742, -5053566, -4424353, -317291, -6795712, -153008, -2006287, 876710, 11798812, -4028143, 636192, -5408975, -15696495, -1912871, 8818105, 2164664, -5883569, 4512400, 7167764, -6263136, 7573101, -12403329, 2506114, 602906, -6156299, 3337190, -5541045, 3946001, -3126736, -4894115, 11000485, 14541149, 9177271, 4217121, -6033356, -1664837, -7201050, -7568806, -1594507, -8526047, 2096481, 134218, 2006287, -8345659, 2167348, 1038308, -76773, -4224101, 2259690, -4567161, -4829154, -9100499, 20725364, 2677912, -3713536, 1278827, 2230162, 9443559, -1902671, -2598455, 3218541, 4687420, -3262028, -1599339, -3521873, 1672353, -976031, 1844152, 1718524, --1223529, -1928440, 3514894, 467615, 929324, -671089, 2124398, -3646964, -2601140, -1755568, --646929, 4050691, 1491964, 2707977, 2066953, 2122788, 150324, 470299, -901943, -2555506, -2498597, 601832, 1056562, -1781338, -5709622, -1603633, -3503083, -1331977, 2653753, -3595425, -16345572, -1606318, 4605279, 11740830, 1534377, -1739462, -7679402, 4325569, -4147865, -5170604, --15518254, -6922414, 3117073, -805843, -3007014, -11180874, 3907883, 6199249, -8824010, -4583267, --2374580, -9203578, 3673271, 686121, -4889284, -3980361, -1687922, -12443057, -4451734, 6219650, -10365904, -7819525, -9823664, -2812667, -579821, -7936563, -6560563, 2538863, 4364224, -8696772, -17497696, 131533, 7113003, -3935264, 6683506, -4480188, 2010582, -12372727, -2621004, 5124433, --12430172, 3467112, -2812667, -6271726, -14114336, -251256, 7825968, 178778, -14887430, -2181844, -2702071, 6056441, 10912975, -3946538, 4881231, 12824772, 4252555, 1634772, -5806259, -1022202, --3624953, 839129, -4319664, 1072668, -8154533, -993748, 6239514, 1872606, 1209570, -3456912, --6323266, 3601867, -1171989, 3715684, -1349157, 570694, -824097, -1727651, -1684701, 2451353, -912144, -369904, -837519, 179315, -2458869, 1253057, -2510945, -3029563, -1975685, 1211718, -147103, 120259, -2370285, 1968169, -299037, -1114007, -3349001, -942745, 208843, 554051, -1357210, 3671123, 1127966, 940061, 1791001, 4835060, -1583769, -4825933, 5883032, 1079111, --9099962, -14207215, -11664057, -14704894, 12655658, -7672959, -1937567, 4207458, -13989245, -5749888, --9747428, -4282083, -3149822, 6350646, -12265353, -6480032, 3840238, 4878546, 6993818, -69256, -181999, -2140504, -78920, -2830384, 1692754, -9647570, -5268851, -8479876, 5855651, 2975876, -4522601, 5977521, -11837467, -809601, -1329292, 10755672, -4087735, 3412889, 5776731, -2157684, -6189048, -4055523, 6907381, 9814000, -3882651, -637266, 8327942, -7135015, 11538967, -4931696, --18510236, 2903935, 9494025, -3615289, 1039382, -284542, 7269769, 9222905, -9383967, -4031364, -2117956, 6359773, -11027329, -8295193, -6719477, 13318694, -375273, -15211164, -3366718, -6313065, -5149129, 712965, 3874597, -5696201, 9361955, 425202, 1629940, 2741263, -8771397, -2942053, -591632, -1067836, -2252174, -2511482, 2382096, -2391760, -2410551, 1866163, 2723009, 1448478, --5175973, -440234, -2097018, -1475321, 2067490, 1906966, 4244502, -571768, -2169495, 1665374, --4863514, -549219, -92342, -3119757, 375810, 314069, -1243393, 615254, -5520644, -978179, --708133, 633508, 648003, 2311766, -340913, 2593624, 1415729, 1344325, 125628, -8558796, --3464428, 5878737, 2176475, 8422431, 2888903, 4120484, -16540993, -6481643, 6454262, -4357781, --3120831, -5510980, 1694365, 8617852, 2260764, 2053531, -11082089, -3747896, -2022930, 4108136, -9731322, -11819750, 5572183, -9635222, -2562485, -8863739, 1137093, 1227824, -452045, 3702262, --8276402, -2384781, -7756174, -3189550, 139050, -358630, -9740449, 5581847, 6250788, -2330020, -7417946, 14590541, 1494649, 11052025, 14175003, 1114544, 456877, 3418794, -2982318, 4698158, -959388, -3104725, -4780299, 17806398, -1854352, 10405095, 4599910, -5251672, -6096169, -4244502, -4973572, -4069482, 6464463, 15683610, 7947300, -2085744, 249645, -13155485, -9067213, -8026757, -12341589, 19376208, -8511015, -78383, -7875360, -1301912, 11845520, -3752191, -726386, -18698140, --2507187, -3411278, -1989644, 7089381, 496069, 1467805, 2154463, -3758633, 2968896, 1578401, -2644626, -2247879, 3836480, -1858647, -435402, -4745402, -1129576, 4111358, -1529545, -134218, --817654, 3946001, -1016834, -2881923, 1663226, 1745367, 995896, 1370632, 1446867, -1568737, -387621, 2779381, 4824322, 4175782, 2703682, 1454383, 285078, 351114, -3033321, -290447, -1896765, -1871532, 1998234, -700617, 685584, 2609193, -1150514, 11188927, 31024160, 13522168, --4216584, -1076963, -5763846, 14298483, -14324790, -8140574, -21900576, -252329, 10799158, 13434658, -2419677, -5334350, -13129715, -9608379, 9675488, -1966558, 15367393, -46171, -4935991, 7250979, -2642479, -134218, -3821984, 10029286, -1865626, 8663486, -138513, -4727686, 18906446, -4525822, -7668127, 18582176, 6534256, -789200, -9085466, -1716376, -14798310, -17340930, 3773129, 11096585, --2666101, 1549946, -18923090, -7201587, 10959146, 5931350, -4905927, 3615289, -5615670, -2732136, --8631274, -14511621, 872952, -3433290, -10244034, -16748762, -14438606, -4712653, -13263396, 6088653, --5940477, 2089502, 1712618, -116501, 315680, -2163053, -2974265, 8569533, 17062832, -11521787, -2081449, -4853313, 6168110, -6440841, -256624, -4656819, -2098092, 15682536, 11409044, 2551748, --1770063, 137976, -6424198, 2198487, 6393596, -1239635, -5556614, -3195993, 5535676, -6732361, -611496, 2837363, 2683281, -2383707, -2143726, 2375117, 3016141, -2336462, 3592740, 2051921, -2979634, -345745, 3934727, -447213, 2488397, 1196148, 1463510, 875636, -870268, 4598836, --4552129, -707059, 991064, -1400159, -1158031, -2176475, 2059974, 149250, -3925063, -1511292, -2561948, -2858301, -12782360, -14460081, 3753802, 5553393, 17353816, -14662481, 4687957, 4510790, --24423332, -1123134, 182536, -20402706, -11110007, -7208029, 5222144, -1619203, 1249299, -5746666, -8617315, 13543642, 7148436, -1907502, -20707112, -9010305, -11247982, 4225174, 1293322, -9074729, --682900, 7158100, -6010807, 12354473, -11093364, -311385, -6456947, -20699594, 3558917, -8800925, --9921911, 7734163, 11467563, -12821551, 4992363, 15171972, -4926328, 6658810, 5219996, -3534221, -2085744, -16804060, 25485262, 10043244, 6051072, 24338506, -29659970, -2207076, -4088272, 3167002, -12130598, 12599287, 4850092, 6017786, 15569256, -1467268, -10554345, -18343806, 7124277, -6928856, -699543, 4981625, -3658775, 7518877, 19937776, -12281996, 9296994, -5948530, -5701032, 15079630, -1147830, 4710506, 14619532, 12072079, -5304822, -6099928, -12861280, -3237869, 63888, 6714108, -7032472, 25233, 1667521, 1020055, -257698, 1411971, 1616518, 551903, 3969087, -1975148, -592706, 2867428, 1582159, 843424, -1787780, 3855807, 2499671, 595927, -2197413, -3064459, --7295539, 4365298, -300111, -647466, 2197413, -3484292, -430570, 2449742, 3333968, 5054640, -2823941, 1405528, 1377611, -31675, 3642669, 15959562, 18682034, 4722854, 11509439, -7474854, -5399311, 5340792, -30771830, 8739185, 9921374, 2146410, -9830106, -179852, -19006304, 22367652, -13410499, -6964290, -7545184, -11044508, -5829881, 16203838, -16381005, -9309878, -2484102, -2670933, --3555159, 2413235, -10855530, -10982768, -6535867, -8442832, -2327872, -10999411, -1551020, -7356742, --24317568, -15431281, -6017249, -3780645, 3380139, 4139812, -146566, 796716, 7031399, 3473555, -3599183, 17192218, 3571802, 5872831, 10672457, 23066122, 19641422, 1135482, -7761006, -14969572, -13733695, -3269544, 37093484, 7594576, 16639777, -1702955, 2135673, -14618995, -563178, 12982612, -7462506, 9872519, -11106785, -7239168, -14278619, -27031988, 15714212, -23839216, -2888366, 31737660, -2151242, 12801150, 6081674, 9454297, 332323, -16924318, 16644609, -140660, -14932528, -13265543, -551903, 5371931, 11223286, 3146064, -13077102, 845572, -2540473, 2823941, -5103495, -4149475, -2401424, 2280628, -3994857, 564788, -1234266, -206158, -5280663, -1795833, -1624035, 2668249, --1338956, -3106335, 4396973, -2469606, -957778, -7415261, -7951595, 206695, 296890, -3133716, --2001455, 2829310, 2088965, -3181497, -5271536, -134755, 3604015, -22033720, 6556268, 8189966, --14646375, -11459510, 302258, 8992588, 21531744, -1176821, -16472810, -16777216, -806917, -9528922, -2871186, 2961917, -18401788, -16016470, -30109868, -8997420, -8685498, -20628728, -13856101, -219043, --9489730, -6086506, -5344550, -1763621, -20244328, -10982231, -12422119, -6267431, 6318971, -17360258, -1348083, 14296872, 17174500, -4101694, 4736812, 9709847, -16886200, 9488656, -7285875, 14977088, --7242926, 1289564, -7810398, -1796370, 29952028, -6231461, 11301133, -21941378, -3574487, -98784, --20698522, 19277424, 777926, -7175280, 13931800, -5775121, 3608310, 27377196, -10862509, -15115064, -10382010, -2948495, -30819612, 12457553, -40867152, -22031034, 16432545, 12728136, 2653216, 8591008, -71941, -297427, -30827664, -16663399, -7245073, 2743410, -17514876, 4238596, 2451890, 7156490, --11432666, 605590, 8864812, 6645925, 5103495, 510564, 4202089, -10125385, -6416681, -6860674, --1884954, -1477469, -882079, 8021389, -4153770, 4168803, 8099772, -4069482, 2506114, -6524056, --4898410, -392990, 2087354, -5873368, 2537789, -7340636, 6358162, -2646237, -1277753, 181462, -5703717, -1894618, 2277943, -5189394, 4565550, 3362960, 10537165, 2383170, 8653822, -8647380, --2870112, -10269804, -5290863, -5088463, 41455024, 22702124, 32212, -21343304, 10965052, -22256520, --18108118, 3293703, 18411988, 36403068, -5731634, 18405546, -6585259, 13065827, 22059488, 12342125, -14096620, 7565585, -4139812, -18056042, -18693846, -5653251, -17667884, -5193153, -3253975, -3973382, -14105209, -2404108, -36287104, 2130304, 8735963, 8380555, 21681532, -2238752, -43305080, 24617678, --19390704, 6338835, -4259534, 14565845, 21189222, -23602456, -1676648, -11793443, -20605106, 14898705, --10261751, -25345676, 9919764, 14803679, 24335822, 6452115, -3828963, 2664490, 19916838, -16052440, -31457414, -9900436, -8808978, -2834679, 19154480, -19963008, 1802813, 2435783, -55599964, -8240969, -17162690, -8000987, 2845953, 7714835, 3995393, -2728378, 4482335, 19055160, 22721450, -18025978, -6460168, -13205951, -2294586, 22526030, -523986, -2348273, 788127, -1526861, -11724724, 3213173, -734976, -6823630, -17345762, 227096, -4182225, 5282810, -8039105, -7474317, -9449465, 7959112, -1787780, 4876936, 3871913, 325344, 2843268, -3839164, -7978439, 12108050, -1274532, -5879810, --243739, -4241280, -2710661, -4896263, 561030, 1484448, -773631, 3349001, 8764418, -341987, --2211371, -3615289, 738734, -4494147, -2608656, 5037997, -3929895, -3227668, -4796405, -11689827, --6605660, 1611150, 7490960, -6149320, -1620813, 23759222, 15761456, -44174276, -25113748, 30255360, -35066260, -18848464, -6386617, -49708340, -27475442, 7159711, -2254858, 6610492, -26422638, -16558173, --18108656, 26825292, 39862128, -1940788, 10762114, -6491306, -3491272, -508954, 9155797, 17271138, -4204773, -6154688, -3304977, -4059818, -23810762, -13509283, -24207510, -3224984, 7485055, -10183904, -14939507, -11068668, -4140885, 23173496, -11233487, 13019656, 9057012, -4259534, -22323630, -16172699, --13307419, 4012573, 41748692, 7336878, 22450868, 26443040, 20712480, 15316390, 13727252, -23044110, -557272, -3783866, 30906048, 14667850, 18079128, 32246078, -15833397, -21718576, 7973070, 27270358, --46231028, -850940, 3696356, 21490406, -37384468, -56369300, -10014790, 15775952, 3955128, 6372121, -17681306, 1113470, -12483859, -18513994, 629750, 2525978, 3675418, 17046726, 25308632, 11949136, -1895154, 75162, -257161, 2072322, 2562485, -6398428, 9350144, 1152125, -8513162, -15032922, -1881196, -6413997, 3245385, 1628866, -1334661, 943282, -6201933, 6460168, -3319473, 4334696, --6669011, -4336307, -11913702, -11782706, 580894, 6192806, -5259725, 12406013, 354872, 3690988, --3721052, 13260175, 1130650, 6075231, -6542846, -3592203, -2071785, -8256538, -1600412, 8939438, --15462419, 11917997, -596464, -11344619, -20089710, 7569880, -9793062, -19589882, 14097156, 27195196, -8301635, -10292352, 16095390, 27361626, 10059887, 5752035, 1898912, -2889439, 12796318, -22608708, -1321776, -32577326, 17467096, -26257282, -2249489, 14390825, 7828115, -14896020, 3157338, -17259326, -35744864, 4825933, 11580306, 18846854, 39439076, -16088411, 12796318, -18672908, 6804302, 14410689, -31707596, 7711077, -6462852, 32742146, 4380867, -2047089, -18720152, 1480153, 20369956, -6652368, -19581292, -23859618, 37152540, 38789996, -46324980, -949725, -2922725, 10384157, -7890929, -5810554, -19931870, -16546362, -49412524, 863288, 43948788, -34395172, 17418240, -7738994, -4385699, -20841328, -48520244, -2856690, 8043937, 4738960, -32610076, 42531988, 3323231, 37859064, -74320648, 7368554, --6967511, -22133040, -5995775, 13345000, -17284560, 11923366, -15574625, -10101763, -20505784, 26207890, --9925669, 2060511, -21864604, 1236414, -16052977, -5199595, 7510824, -10808822, 5219996, 979253, --14808510, 13704167, -6047314, 2209761, -6309844, 12466679, -9116605, 2202245, 891206, -3102577, -16174847, -9028021, -11249593, -6249715, -12612171, -17340394, -8805757, 1996623, 1151588, -12404402, --7154879, -8236137, -12230456, -9430138, 4307852, 3156801, -322659, 31423592, 3623879, -23854786, -2324651, -48631376, -11252814, 2573222, -9577777, -38744364, -4443144, -25395604, -6479495, 23511188, -5282273, 30788474, 12581570, 11690364, 7039452, -10356777, 24448028, -12377022, -411243, 11735461, -5184563, -14969035, 12046846, 5113696, 28954522, 12102144, -5416491, 17726940, -14194330, 23897198, -7969312, -26008174, -27096948, 14028437, 17266842, 7389491, 2630668, -12566001, -17427904, 5389647, --17155174, -25451440, -8080981, -4191351, -23746874, -8613020, 8559333, -15958488, -26758184, 7614977, -9582609, 1063541, -3504157, -1409286, -4762582, 9658845, 44889924, 9344775, -1739999, -1575179, --16224776, -25622702, -11704860, 37314140, 39652212, 20608864, 3513283, 36392868, 17147120, -8051453, --50709068, -38298760, -31942208, -60081760, -35391604, 8677445, 48642116, -21529598, 16255914, -24089934, -7627862, -1827509, 16510391, -7698729, -3147137, -21474836, -12730820, -5105106, -19609746, 24811490, --4160213, -12663711, -6416145, 2726767, -14281840, 10199474, 7051263, 16135655, 3339874, 4707284, --16000364, -18096844, -2454574, -13309030, -8860518, -15546171, -23046258, 1415729, -6273337, 1647120, -1299228, 17631378, 17052094, -6250788, -3804804, -7474317, 16457778, 11368242, 6960532, 2846490, --3774203, 9842454, -13647795, -5070746, -2519535, -14995878, -29844118, 15709380, -903017, -9256728, --4327180, 11241540, 20809654, -8856759, 26845156, -30748208, 24797530, -3078955, 33138358, -21462488, -19086298, -31688268, 27536110, -25590488, -10979547, 38607996, 8742406, 31031676, 44069048, 4640176, --3712999, -18345416, -1623498, 28175522, 6924024, -9837623, -31235686, 2772938, 5998996, 14811732, -8836358, 12355010, 7494718, -18010946, -29070486, -12142946, 27879706, 10874857, 89247808, -28248536, --24012088, 29298120, 45759120, 9785009, -907312, 12234214, 2916820, 14903537, -13605383, 5497558, -21339008, 23886998, 15714212, 69562904, -8913131, -8756901, -4610648, 36002028, 21299816, -17926120, -18656802, -164819, 6026913, -14702747, 31681290, -31439698, 2128156, 49242872, -36148592, 105441448, --48360260, 50614044, 46093052, -45030584, -41500660, 47106128, 1951526, -26674968, -11483132, 26190710, --71077416, 11497091, -8406862, -45336064, 29875256, -35396972, 2793876, 3105798, -14466524, -34901976, -9557913, -2261837, -1618666, 7305203, -7329362, -11155104, 6315213, 15366319, -5650567, 2806224, -11512123, -10246718, 16031502, 12949863, -25584046, 4266513, -14373108, 7132867, -1023276, 2709051, --13089987, 6082211, 3422015, 591095, -6563247, 20447802, 4465692, -23622, 18881214, -12627741, --12181064, 2760590, 8159364, 2802466, 9092983, 5477157, -26304528, -12828530, 6803765, -14626511, -22668838, -8334921, 17365626, 23416698, -54388244, -22512608, 32749126, -69270304, -43543988, -28705950, -48386564, 104359656, 28368796, -81051400, -18752364, -82812336, -43826920, 68365144, 40215928, 64305324, -34746824, -47802988, -76973864, -57917096, -14361834, 35061964, 38951060, 24137180, 12911745, -19762218, --84104048, -100249368, -22148610, 77622944, 137204880, 93750544, -17912162, -64039572, -92938264, -68208912, --55897924, 536871, 21867826, 75608064, 79867064, -42942692, -27513024, -100368016, -94087704, -33239826, -8920647, 97843112, 143433648, 64282776, -42763916, -150174064, -112003624, -81438488, 39250632, 86288040, -53218404, 34382824, 28488518, -89395448, -16840566, -50761680, 18729278, -6604586, 52916680, 84186728, -66115116, -77612744, -157918432, -117950000, 12825309, 92641368, -2596845, 128265976, 4997195, -32371168, --38754028, -27695560, 46171, 92826592, 79344152, 15161771, -32029718, -10801843, -6158446, 48981416, -53142704, 6958921, 2012729, -7789460, -1727651, -9720048, -13347685, -8048232, -5052492, 19104552, -28598576, 24233816, -35183836, -38967164, -15545097, -15812459, -15970299, 36617280, 29138668, 38483444, -10830297, -15658377, -28761248, -54448376, -35383552, 23714126, 48309256, 74257304, 50142668, 4832912, --113850992, -99198712, -34306588, 41661720, 63581084, 86042688, 64103460, -4369593, -64869576, -94489280, --92136176, -16065862, 99686192, 104180336, 52334712, -24212878, -69352984, -47449724, -32668058, 3652870, --18343268, 36658084, 11662447, -30030412, -27979028, -99858, -45192184, -5798743, 6902013, 5000953, --3766686, 943819, -15080704, -2094333, -1615982, 7636989, -5088463, 20720532, -5377299, -4220342, --5665599, -6762963, 13211856, 3533684, -6116571, 20057498, 1454383, -36208184, -17809082, 9718974, -17793512, -6199249, 2317672, 24473260, -438624, 3164317, -20016158, -9221295, 6383395, -4594542, --4318053, -2887292, 16492674, 5701569, -6226092, -19527068, -7526930, -1345399, -17450988, 1473174, --19955492, -13680008, -9200357, -18097382, 28196998, -5268851, -12523051, 11640435, -32749, -27776090, --1451162, 27304718, 22485228, -13013751, 17446158, 2683818, 16651588, -18631568, -26987964, 10184441, -12127377, 10320270, 9292699, -10477573, 10240813, -20478404, 13871134, -27852862, -24160264, 17733920, --14071923, 12028056, 16976932, 992137, -12853763, 3950833, 4910222, -1331440, -913217, -680752, -11112691, -9436043, 7269769, -9853192, 12998719, -11491185, -5982353, 4486094, -3740917, -654446, -5227512, 977642, 3542811, 9652939, -7752416, -4944044, 5823976, 3157875, 11465952, -9443559, -3294240, -1365800, -6926709, -7369627, 3058017, 1559073, -6849399, -10676752, 3155190, -129386, --1799591, 6377490, -9803263, 11251741, 3605625, -10240276, -10946261, 8999567, -15444166, 10402411, --1590749, 7114077, -632971, 2251100, 13797582, -22073984, 44296684, 67837400, -8949101, -24950538, --21620866, 62552976, 28133110, 60542932, 32499480, 199179, -28156732, -6153078, 15327128, 28496572, -13487808, -13035763, -3334505, 13675176, 19892142, 2587718, 4388920, -13870597, 2452426, -6640020, -9009768, 10327786, 26342108, 22887880, -12205223, 2087891, -13688598, 3648575, 11959336, 18133888, -1224603, -8468602, -144418, -15389405, 12819941, -3466039, 5218922, 12183748, 132070, 16193637, --8045011, -4307316, -3893388, -16443282, -10045929, -25135222, -4910758, -28676960, 1831804, -9796284, -23547158, 3626026, 6833293, -22149684, 9259413, 265751, -10052371, 16422344, -8956081, -4475356, -3896072, 10896332, -1460289, -5806796, 36522792, 12045236, 8316131, 13886703, -10104984, -379568, --3487514, 19290308, 26477400, 25719874, -15460809, -16596291, -2464238, -6533719, 6511708, 17372068, -17740362, 904628, 9855339, -1091995, -2941516, 5982890, 11231876, -977642, 8777839, -7410429, -1414118, 246961, 2918430, -2467996, 9841918, 5963025, -1290101, -2698313, 2815351, 1898376, -10707353, 734976, -6713034, -6908992, -4284767, 3206193, 3473555, 7137162, -8770860, 1311576, --2596845, 5763846, -4447439, 8083666, -2964601, 3103651, -4753455, -3578245, 2235531, -6794639, --257698, 7823820, 1622424, -3014530, 407485, -25323128, -54880020, -7439420, 72568840, 111815176, -93918584, 74171400, -4971962, 8696772, -54465556, -61829812, -100730944, -58034136, -63427540, -20010790, -8018704, 43852688, 31273268, 95498600, 83205864, 27451284, 5848672, -14845554, -32417340, -51346872, --18752900, -52631604, -13973139, -25620016, -16510928, -12295418, 2820183, 884226, 17891760, 25799332, -39293044, 42504608, 51103132, 44050796, -5253819, 4270271, -492848, 8262980, -25221122, 10198400, --26960584, -67563592, -33109902, -50574312, -84902376, -24919400, -7330973, -34438660, 11716134, 26110716, -59379532, 69900056, 103255848, 65157340, 53180284, 52785148, 32907502, -10234907, 5427765, -52074332, --44785772, -75412112, -89569392, -103521600, -75307960, -58087824, -5986111, -2818036, 8280697, 30244086, -51274392, 92231736, 91291680, 90814400, 72895792, 31228708, 47057808, 7371775, -23517094, -35527432, --83923128, -76384920, -67572720, -58339616, -46645492, -28248000, -17079474, -5851893, 4276714, 28294170, -33622076, 44224204, 36689220, 52422224, 47517908, 31071940, 35840428, 24063628, -6462315, -19399294, --22342420, -53430468, -46277736, -41712184, -31204012, -17013976, -563714, -2029909, 13735305, 21064668, -16441672, 19546934, 12535936, 3952444, -333397, 5696737, 1409823, -6507413, 7129646, 8545911, -682363, 4620848, -1197759, -1849520, 878858, 3223910, -33286, -7184944, -9549323, -9382356, --10842108, -7331509, -2103460, -2444373, 3313031, 1362578, 1064078, 3798362, 4400194, 3513820, -4752382, 7309498, 6298570, 3618510, 4395362, 1596654, -1280437, -325881, -1672353, -2568391, --923418, -1391033, -412854, -525597, 149787, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -{ -7398618, -2813204, -3714073, -630286, 2575907, -455267, 2740726, -6771016, -4831838, -1181653, -5706938, -2391760, -1274532, -627602, -3857418, -1717450, 3578782, 3580929, -1407676, -1089311, -2382633, --5472325, 6096706, 3630858, 150861, 643171, -341450, 178778, 4908074, -2490544, 894964, --7861401, -6454262, -1612760, 576063, -5478231, -1026497, 1949378, 462246, 99858, -2760590, --2114735, 5132486, -2380486, -2204392, -721555, -737124, 2267206, -1200443, -3367254, -130997, -2955474, -4220879, 183073, -4520990, 317828, -3315178, 5005785, -299037, -5273146, -782221, --511638, 613107, -7530689, -927176, 627065, -5051956, 2318209, 91268, -5801964, 2622078, -3568044, -3114925, -3554086, -6396280, 3340411, 1908039, 5917928, 2898566, -879931, 1127966, --821413, 1771137, 1881733, 4059281, 1039382, -1803349, -63351, 453119, -133681, 2307471, -604517, -831076, -1134408, 1107565, 907312, 1720671, 873489, 650688, 1046898, 920734, -391916, 558346, -111132, -332860, 373125, 215822, 443992, -279710, 523986, -54224, --5474473, 2469606, -6828998, -1914482, -948651, -3466039, 3300682, 7637526, -3120294, -1031866, -369367, -3177202, 2207613, -490700, -2563559, -4384088, -2313914, 6886980, 6673306, 3731253, -7750806, 4542465, 2473901, 7275138, -4518843, 1589675, 3128347, -159451, 1268626, -2181307, -1409823, -10103374, 228170, -602906, 3656091, -2300492, -1268626, -721018, 2804614, -3210488, --501437, 891206, 1979980, 1896228, -522375, -3442416, 663572, 1181653, 2486249, 1848447, -2889439, -3237332, -1896228, -606664, -5696737, -693100, 1534377, 4894115, 5500780, -768262, -3041374, 2235531, -391379, 2020245, 2445447, 3528316, -1402307, -63351, -2637110, 443992, --2269353, 1560147, -3369402, -3216931, 1941862, -34360, -6310381, -607738, -4720169, -1300301, --652298, -813896, -6272263, 594316, 2243047, -1868311, -1773822, 1075352, 817118, 446140, --1224066, -3392487, -151934, -1490891, 1308354, 38655, 113280, -385473, -1375463, -1559073, --1733556, 119185, -736587, 757525, -1076963, 431107, 289373, -1008244, 3221, -1121523, --378494, 62277, 31675, -996969, -215285, -170188, -6911676, -6536404, 2436320, -779000, -5430450, 5437966, 459562, 115427, 10492068, -2851322, -238908, 8788040, 374736, -5109938, --7445326, 5390721, -2171643, 13422, -4607963, 1410360, -3288334, 3652870, 16378321, -5999533, --4799626, -5927592, -6377490, 1142461, -5199058, -12923557, -315143, 1266479, 41339, -5156108, --1069447, 4161823, -5258114, -3136400, 7660074, 2488934, -1938641, -1854352, 4935991, -2474975, -3536369, 3190624, -6974490, -4664872, -4125853, 4534949, -3533148, -2141041, -1916092, -2360085, --357019, -4745402, 48318, -1458678, 1173600, -689342, -10219875, 4705674, -5710696, 4473209, -853088, -8447664, 1716913, 5576478, 1742683, 9313637, -3948149, 467615, 1103270, 2142652, -3359201, -3740380, 1408749, 1184337, -5430450, 7405598, 545461, -1111323, 3174518, -1126355, -1427540, -1419487, -2834142, -256087, -1822140, 2390149, -630286, 404264, 2914672, 944893, -1112397, -710280, 1586990, 216896, -423591, 979253, 2118493, -1597191, 139050, -1682554, -1009317, -595390, 3058554, -4300873, 2004139, 2246268, -2377801, 1107028, -1190243, -9346923, -2860985, 8866960, 7308424, 8319352, 1417876, -1732482, -7130183, -3670050, -3367254, -2624762, -7308424, 10249403, 702764, -636729, 7237557, -11733851, 199179, -887985, -244813, -3778498, --3999688, 4365298, 5270999, 242129, -1213865, 2191507, -5770289, -4268124, 4354560, -4711579, -9117679, 8373039, 1347546, 5185636, 4275103, 951335, -3790846, 1377074, -246961, -6389838, -6229850, -478889, 2888903, 5182415, -6117644, -2278480, -7261179, -1552094, 1602023, 6849399, --6998649, -2680597, 5022965, -987843, -4496294, 7507066, -6237367, -12916577, 2137820, -7239704, --3323768, 3618510, -3195456, 708133, 721555, -3090766, 5494874, -4997732, -5817533, -6842957, --821413, -2922188, 402116, 1922535, -4289599, 1202054, 1158567, 394600, -2073932, 1203128, -848256, 2979634, 379031, -849330, -2042794, -1196685, -938987, -436476, -759672, -1150514, -318901, 647466, 782221, 345745, -443992, -903554, -450972, 1523640, -1527398, -1452236, --512712, 41339, -192200, 1185948, 1248225, 1305133, -818191, 513785, 207232, 566936, -2841121, -1412507, 181999, -11762842, 2518998, 11068131, 907312, 1724429, 3380676, 10368051, -1440425, -9990094, 11094437, 4859219, 4020626, 6736120, 5871757, 40802, -2050310, 6354404, -4887673, 1658931, -4551592, 5527086, 2629594, 8185134, 9579925, 3631932, -2328946, 216359, --41339, 3980898, 12155831, 7204808, -6700149, 11737609, 501437, -1444720, 1583232, -8654359, -9651865, -1279900, 207232, -1147830, 2487323, -1297617, 5002027, -6977711, 9862319, 8382703, --276489, -1561758, -5426691, -10408853, -3534758, 4135517, -2385318, -3901978, 5562520, 6486475, --4350802, -3905199, -13313862, -4627828, -1611150, -646393, -14901926, 7614440, 878321, -8894340, --7272990, 2458869, -3427384, 913754, -2166274, 485331, -3889630, -861141, -3464428, 2541547, -5034776, -1403917, 3841848, 457414, -1534377, 4477504, 1602560, 233002, 3729105, -418222, --1635309, -2308008, -2567854, -2717641, -2546379, -3178276, -2285460, 175020, -1241246, -2981244, --1432909, 314606, -592706, -1100049, 687732, 1228361, 632434, -1351841, -1903207, -2405182, -307627, -2280091, 2167348, -1245004, -1276142, -1228361, 91805, -871342, 5510980, -6960532, --55835, 71941, 258235, 11242614, 6184753, -97711, 14018773, 6475200, 12658342, 3018825, -4289062, 13502840, -5328981, -8999567, -5679021, 12625593, 3105798, -7122667, 9648644, -2635499, --5602785, 8607651, 20452634, -5272609, 1051193, 3264712, 3933653, -5313412, 703838, 11249056, -1238561, 13832479, -2978560, 14854144, 10544682, 3559454, 8847633, 5580237, -5247377, 3694746, --1315871, -1321776, 1463510, 1009854, -914291, 3919695, 2764348, 9598178, 6519761, -8021925, -2855617, 3614215, -5865852, 354335, -13913010, -18104898, 7311108, -4637491, -11766600, -2537789, --6302328, 7799661, 1782411, -3675955, -8859444, 6997039, -6388227, 4269198, -7176354, 1067299, --2840047, 10972031, 2128693, -4281546, 4310000, -9354439, 8608188, 1389422, -7955890, 368830, --740345, -2308008, -872415, 1147830, 2474438, -2339684, 4021163, -869194, -1444720, -1781338, --1285269, -3463891, -179852, -1229971, -3255048, -1240172, 1313186, -2081985, 2254858, 332323, --1086627, 571768, -2122251, -413927, -1446867, -192200, 44560, 107911, 1218697, 1344325, -1615982, 71941, 879931, -70867, -7922604, 1064078, 321049, 2102387, -4827007, 5466420, -6038724, -651224, -4014721, -13911399, -11913702, -9175661, 4292283, 1243930, 2233920, -11404212, -7247221, 5103495, 9015136, -9776419, 9297530, 7135552, -5594732, -4655745, -2815351, 9450002, -6540699, -4150549, 959388, 14297946, 7268159, 3695283, 8308614, 5698348, 2254321, -4725538, -1098438, 665183, -1985886, -5245766, 12724914, 5937256, -11786464, 7996692, 7975755, 7920457, -6233072, 1682554, -7333120, 236223, -948651, 11083700, 1505386, 4962835, 10088878, -1787243, --10938208, 2454574, 5947993, 11201275, -14872935, -8392366, 4127464, 176094, 1417876, -8813273, --2139968, -8545374, -1146756, 4093104, -2773475, -4662187, -5649493, 2439005, -1365263, -2820183, --6995428, 285078, -9381282, -148176, -865973, -4750771, -5264020, 6082748, -2032593, -1480690, --2959233, -5779952, 2108829, 2829847, 1992865, 2222109, 1644973, -3179350, -1689533, -947040, --734439, -2986076, -5604396, -2481417, -87510, -1890323, -111669, -3002182, 321586, -1614908, --1098975, -2173254, -2417530, -1268089, 2536178, -1758789, -803159, 404264, 1063004, 686658, --1144609, 1914482, 2885144, 2882460, -724776, 5284958, 686658, -9248138, 9418863, 6054294, --2816962, 3745748, 5673652, -6251325, -2115808, 24105504, -789737, 9405978, 6573985, -20106890, --10696616, -1123671, -848793, -225486, 11422466, 2575370, -5562520, 11818139, 7251516, -1465658, --1941325, 3781182, -1924145, -4159139, -8966818, -10610180, 5876589, -2314451, -5007932, -503048, --16554415, -3060164, 1091459, 9152575, -10938208, -3143916, 1415192, 755914, 2384781, 837519, -11672647, -13580150, -4529580, 3051038, -443455, -8002598, -1695438, 10617159, 9104794, 7903277, --2171643, -13518410, -6183679, 4934918, -1544041, 9131100, -532039, -142808, -6755984, -4150549, -7943542, -9679246, 6652905, 5239860, -7006166, -3436511, -1629403, 1167157, -7543037, 3717831, -2612414, -3656628, -1154809, -10241886, 3730716, 8013872, 11384348, 1053341, 3061775, 5451924, -1673964, -8934606, 6178848, -2095944, 1027034, 89121, -2879776, -3037616, -1654099, 4250944, -758599, 3564823, -368830, 642098, -4985920, -1635309, -2283849, 3848828, -364535, -1555315, -2633889, -1851131, 2069101, -1151051, 357556, -4060355, 991601, -888521, -835371, -2576444, -974958, -343597, -2309082, -4196720, -930934, 502511, -1692754, 1810329, -419833, -18180596, --1197759, 2569464, 12206834, 1600412, -567473, 7492571, -5442798, 16170552, -16139413, -1471026, --3506841, 2764348, -847719, -1242319, 4068408, -2954401, -5526549, -3578782, -3290482, -9576703, --1585917, 6928319, -1634235, -4216048, 10147934, -87510, 12218645, -11936251, -6935299, 15265388, --1601486, -854162, 850940, -9494025, -1163936, -11870216, 3447248, -14262513, -410706, 10726681, --3526705, 7333657, 9503689, 5623186, 7474317, -9621800, 9616969, 1146756, -25310242, -4173635, -3636227, -1990181, -2851322, -10758356, 8505109, -9157944, -1853278, -10395431, -9862319, -15130633, -13530221, 174483, 15776489, -7794829, 11884711, 15880642, -10414222, 12956306, -15870441, -13090523, --14368276, -4904853, -10131828, 3325379, 4738423, -470299, -1892470, 4295, -11365557, 976031, -104153, 6640557, 2570001, 2656437, 4640712, 2728378, -2485712, -4832, -4634807, -2656437, -106300, 1984275, 67109, 2231773, -1530082, 2392834, -705985, 1315334, -7039989, 531502, -2676302, 2148021, 3904662, -2115808, -3106335, -4014184, -99321, -241592, -3290482, -3471407, -374199, -467078, 606127, 137439, -1041530, 1984275, 5607617, -1252520, -1299228, -590021, --1517197, 5153961, 215285, 729608, -1724966, 3114388, -3245922, 11993696, 20028506, 2945811, --5415954, -10795400, 6681359, 18581640, 106300, 5370857, 886374, 7451769, 5025649, 5732708, -10017474, -12103755, -1040993, -4459787, 15827491, 11863773, -657667, 18370648, 9598178, 1700807, --17302812, -8478802, -13214541, -6011344, 1249299, 5012764, -4796405, 763967, 18533320, -3420405, --72478, 1022202, 19043884, -11623255, -4800163, -4691715, -1969779, -11372000, 13087302, 955093, -8746164, -13656922, 1775432, -1423245, -8272107, -3179350, -15247671, 4823785, 188979, 3260954, --1960653, -849330, -17687750, -5908802, 6769942, 11247982, -3345780, 2993592, 23278186, -1450625, -1251446, 4361540, 10435697, -9841381, 2168422, 11912629, -7131793, 8676908, 2420214, 9039832, --12039867, -6008659, 1512902, 2794950, 5938866, 6905771, 6445672, -4436165, 1791001, 4098473, -7820599, 12406550, 5616207, -5819144, -2843268, -4570919, 1884954, 2653753, 5273683, 4935455, -2847027, 5210332, -5680094, -1081258, -5791227, 4926865, -6619082, 6626598, 4633733, -4909685, -2808372, -573378, -3126199, 760209, 884763, -1753420, 1393180, 8210904, -363998, 4295, --5146982, 2596845, -333934, -147640, -4683662, 4702989, -4000225, 1476395, 1912334, 3726421, --521839, -1767379, -10999948, -16581795, 4552129, -1715303, -16881906, 4677220, 1620813, 15308337, -13403519, -12427488, -15064598, 3427921, -11517492, -5960878, 405338, 22770842, 256624, -2822867, --20361366, -10101226, -1819456, -15075335, -23065584, 15842524, -5993090, -7202124, -1382980, 17176112, --5414343, 1933272, -3488587, -3375844, -10000294, -5243618, 1616518, -23967528, -15505906, -4381941, --8819715, -8077760, -2858301, -9368934, 8121783, 3799972, 2573222, -5690295, 4088809, -34624952, -32208496, 18988050, -3309809, -4342749, 18103824, 1151588, -10894185, -15399605, -2005213, -5366562, --6471979, -9242770, -9533754, 11924977, 11041824, -4961761, 24297166, -13474386, -11141682, -9973988, -32749, 8002061, -28521804, 8476118, -9035001, 14947023, -16170015, 7137162, -1485522, -5415954, -11130945, -20936354, 19710142, 1171989, -277025, -4396436, 570157, -239981, -9972914, 2005213, --2764348, 5252208, 6631967, -6043019, 3032247, 4286378, 9312563, 382252, -3040837, -473520, --832150, -3656628, 2730526, -1400696, -2230699, 2428267, -3695819, -1129040, 906775, 2727841, -3200288, -7396471, -5692979, -4888210, 848256, 3095061, 4832, 2057826, 1742146, 5035313, -2610266, -3996467, 3762928, 794032, 16538845, 1338956, 38529076, 12519830, -760746, 1628866, --14881525, -19330038, 24067386, -7153268, 2741800, 31899796, -8306467, -1573569, -6818798, 24867324, -4799089, -10327249, 14707579, -5379984, 21840982, 11426224, 5444408, 3198140, -2415382, -8396661, --2724083, -2306398, -23408646, -5920613, -3773666, 12909061, -7254200, 2400887, 4300873, -16813186, --24991878, -934692, 21563958, -1484985, 19153944, -3364033, -26796300, -10417980, 1206349, 6024229, -4831302, -21835076, 168577, -6285685, 15806017, -16216723, 19984482, 29532732, 19161460, -6071473, -3554622, 11883638, -4280472, 23127862, 26796300, 23600308, 7701950, 25882546, -914291, -10501732, -3321084, -13615046, -17154636, 9290551, -7383049, 21140366, 10915123, 5566278, -7318088, -26153130, --23701778, 16550656, -10518912, -21174188, 14054207, 28098750, 16879222, -9087077, 13391171, 8195872, --2977486, -6713571, 7924752, -10069014, -3096135, -1133871, -6956237, 853625, -1549410, 5735929, -3447248, -1406065, -9246528, 5060009, 4594005, 3152506, -2057289, 237297, -8654896, 630286, --164283, 2165201, 1935957, 159451, 5028870, -1846836, 6987375, 7923141, 1977833, 6422050, -500901, -5196374, -12269648, 2691334, 195958, 2556579, -8739185, -19440632, 11376831, 14249628, --226560, 6978785, 4683125, 6906845, 5720897, 2640868, -1551557, 3381213, -4082903, 7413114, --13218836, -36822904, -14781130, 20212652, 1165547, -5989869, -12335146, -48855, 16984448, 21711060, -4622459, -13285944, -2347737, 17376364, -20996484, 2033130, -2616172, 15556372, 17717276, -14171245, -26881126, 5252208, 1070521, 38012072, 186831, -11866995, 13296145, -6294275, 1896228, -8061654, -2820720, 25285010, 2910377, 32197760, 13566191, -28009630, -30719754, -6656126, 7989713, 17226576, --23819888, -8364986, -3442953, 28999082, 26505316, -22632868, -875100, -13785771, 8751533, -4716411, -30305290, 457414, -6654515, 19951734, -4038880, -23456428, -11859478, -3790309, 24443196, -21597780, -13128641, 38024420, 17992154, 25543782, -6802155, 10424959, -6852084, -15698642, -15131707, 8032663, --10749766, -658204, -3843996, 6997576, -150861, 15489800, -3435974, -7026567, -2491618, -3019362, -3823595, -2374043, 5970542, -10502806, 7847442, -6919729, -3157875, 2257542, -2741263, -3217468, -4976257, -4563403, -1717987, -1297080, -3787088, -12921409, -7282654, -1177358, -1467805, -3754875, --5036386, -1109175, 3937948, -2175938, 2349347, -1911261, -48855, 3045132, -9907416, 1202591, --1323924, -7447474, -17706540, 13146895, 19843822, 16188805, -28328530, -13806709, 18223010, 54374284, -3524558, 11644730, -15629386, 4714801, -564251, -2777233, -14659797, 4283156, -5008469, 25975962, -21001854, -27604292, -11901891, 28723668, 14928769, 10177999, 3313031, 15414638, 18474802, 5581310, -11147588, 9820443, -12970264, 1717987, -12693776, -6036040, 3821984, -2775623, 2462627, -11403675, --9755481, 7524783, -1789391, 10465225, 8708583, -25547540, 19199040, 3548180, 15517717, -17320530, -10096931, 15140833, -11615739, -19748260, -19352586, -21846888, -21328270, -18146236, 6762426, 31751620, -8811125, 9626632, 15506979, 832150, 80531, -12704513, 21788906, -27391154, -54125716, 18441516, --12057584, 2142652, -45846628, 11192685, 15124727, 2291902, 9683541, 7556995, -6382859, -12055973, --17862768, 5582384, 4575214, -14222784, 10740103, -5556077, -23147190, -13154948, 270583, -4474282, -3052648, 1358820, 7583302, 3033858, 1840930, -702227, 6148246, -3668439, -6978785, -13674102, --7472170, -8926553, -2421825, -5041755, 5560909, 7340099, 6284611, -10956462, -269509, -4762045, -690416, 5903433, 2501282, -9721658, -16885128, -1766305, 1374926, 1189169, -5597953, -2913062, --5875516, -1598802, -7871065, -9251360, 6471442, -9050570, 4286378, 1190243, -3856344, -2076617, -6243809, -5339718, 2815351, -6425808, 12955232, 9335111, 12373801, -17663590, -9186935, -2483028, -11310796, -23572928, 39220032, 18641232, -3214246, 21401286, 12845710, 20395190, -10735808, -13726179, --13350369, 24702504, 8761196, 4461934, 22265648, -19505058, -63164472, -4206921, 4205310, 7514046, --35561256, 27550068, 20020990, -38170448, -29395830, 941672, 15718507, 1335735, 8924405, 20235738, --5377836, 12564927, -18450106, -21112448, -16843252, -21932250, -34155192, 9514963, 3531000, -22924924, -30259118, 11765526, -7399692, -7213935, -17869212, -13380434, -31133144, -16909286, 11068668, 27624156, --10525354, 2771328, 11363410, -24500640, 17680232, 23939074, 3529390, -6134824, 20459614, 5603322, -2304787, -14666240, -17151952, -1257889, 30589830, -9407052, -28225452, -496069, -35967128, -37468220, --39023000, -18714246, -20589000, -13150653, 16783122, -2357937, 15087683, -3118683, -4981625, -14121852, --3795677, -4162897, 8103530, -6207839, -9025337, -1788317, -3542274, 1322313, -13158706, 2486249, --6066642, -5273683, 6960532, -6310381, -2102387, 2272038, -4685810, 10243497, -6499896, 1526861, -16632798, 2032056, 9716827, -3725884, -5842766, 16851304, 2524904, -8943196, 325881, 159451, -1309428, 2381023, -4785668, 10519449, 638876, -810138, -5092221, -5299990, -13875429, -23840290, --12567074, -12778065, 15522012, 30690226, 11274289, -13899051, -29560112, 31750546, 17027934, -15205795, --8256538, -8075076, 1763621, 7540352, -9771051, 16550656, 15305116, 949725, -10292889, -9657771, --9183177, -1079111, 5959267, -4523138, -10158135, -24086714, 7467338, 21381420, -12200928, 18919868, -591632, 12738873, -10528575, 14154065, 40736156, -15138686, 17794050, 35489316, 6168110, -6068252, --9789841, 10383083, 797253, 18179522, -13775571, 48664128, -14984604, -32457068, 7524783, -14716705, -38448548, 12723841, -11969000, 2341294, -23126252, -31649078, 39046084, 4596152, -10449119, 38668664, --19907174, 5161477, -11220602, 22471806, -28434294, -31832686, -22764938, 7237020, 13805636, 25717190, -10983842, 27173184, 42429980, -5071820, 8588861, -5450851, 5419712, -1207423, 1775432, -30998926, -1231582, -42861088, -14289356, -8331700, 7686381, -1306744, 9491341, -3260417, -12789339, -13367549, --3021510, -8786966, -9838159, -16993574, 71404, -1640141, 13100187, 5711770, -10484015, 9805410, -4594005, 8121247, 10595684, -13542569, 3916473, -5526013, -2513630, 13915157, -4498978, 7023882, -9374303, -5369783, -14806363, -7420093, 5553393, -24347632, -7553774, 745714, -3357591, -5348845, -11200201, -11392938, -12699681, 9190693, 15025943, -6623914, 12574591, 29877940, -4532264, 991601, -35536024, 4003447, -19628000, -22526566, -20145008, 36733780, -24728274, 14656576, 17016660, -11629698, -3352222, -19990926, -4752918, 16481937, -14785425, 11943767, -5097053, -25145422, -55720220, -4811437, -49689012, 21070036, 4876399, -9701794, -15259482, -2533494, -19949050, 6592775, -28023050, 33472828, -2208150, 4249334, 2476049, -10977936, -33741264, -12559021, 26640608, -21705154, -5879274, -14934138, -11766600, -10619307, 36964636, -5727876, 7432978, -13288092, -34977140, 7981123, -26759256, -5687074, --2563559, -48351668, -41267120, -38490424, 12656732, -6849399, -21226802, -13350906, -13655849, -12075301, --18961744, -12327093, -3463891, -43352864, 11997991, 5214091, 15904801, -9352291, 37757596, -3638374, -7130720, -12834436, -5415417, 20799452, -40695888, 17546552, 26377542, -26908506, -17811230, 1986422, -4131759, -6863895, -13260175, -20995948, -1468342, 830539, -13012140, 11280195, -9633075, -16652662, --9534827, -6959995, 10626823, 41339, 228170, -46708, 7908109, -20578262, -6120329, -2177549, --4191351, -1109175, 236760, -24732032, 678605, -7779260, -6727530, -1816234, -11340861, 3418794, --3296924, 2597918, 356482, -1842541, -2891587, -5918465, -1125818, -4799626, -1291175, 3838090, --5774584, -8848706, 193810, -1879048, -2137820, -5409512, -10257993, -6585259, -2696166, -959388, --7306276, -8523899, 15101642, 9137006, 18274012, -6885370, -37983616, 10957535, 547071, 63074280, -64555504, 7809861, 638340, 15210090, 7630547, 16247861, 27861990, 10386305, 28930900, 43713640, --10875931, 5745056, -35893580, -5079336, 4712653, -4630512, -10671383, -21758842, -18297098, 10155450, -10094247, -47696148, 34062848, 9213779, 48064980, -2913062, -9487583, 15726023, -3299609, 50594176, -12910135, -2574833, 9759239, 10023380, -13534516, -30871152, -24184424, -12126303, 37795712, 520765, -41540924, 5119064, 40614820, -11687143, -55794308, -20871394, -16171089, 28922310, 3556770, -27109834, --39269960, -27438398, -5438503, 33962992, -29502668, -25703232, -16914654, 30313880, -14892262, -8810052, --39094940, -38916160, 12319577, 6593849, 52465172, 13494250, -5510443, -14170708, 16480863, 17037062, -56013352, 1029718, -18096844, -24230594, -1519882, -2484102, 1318018, 8719320, 8097624, -13026636, --2909304, 4235912, 11705396, -12509629, -10132365, 15741055, 23200876, 10779831, 7122667, 9018358, --9742596, -4151086, -6127308, -1267552, -1287953, 5097053, 85899, 30245160, 6361921, -1289027, --9226127, -15870441, 15187541, 24546274, -8871255, 406411, 972273, 3073049, 14066018, 6128382, -10452340, 10663867, 2725157, 8301098, 2735894, -521839, 2747169, -7472706, -2521146, 1833951, --4502737, 3000035, 834297, 38602092, 14665166, -18761490, 36384280, -2258616, -71459128, -21762600, -45081052, 50075560, -35225176, -35275104, -35851164, 20013474, 30675194, 61288648, 18563386, 7913477, --34941168, -3547106, -2142115, 13787382, 30690226, 22279070, 1821066, -37072012, -72007272, -19088982, --36420248, 54196580, 57408680, 100153272, -29974576, -96321624, -20967494, -33091650, 74884904, 25467008, -75950592, 19563576, -25353192, -73385960, -49598820, 2676302, 9162239, 82287280, 33450816, -2855080, --67693520, -118132536, -30859340, 2531883, 54611584, 124311384, 27124866, 37490768, -80071072, -122729224, -5336497, 28198070, 97774392, 57475252, 41108204, -22666154, -79050480, -64680060, -586800, 18269718, --1653562, 49363132, -40691592, -38103340, -9395778, -87188376, 13684303, 4220879, 23860154, -17491254, --35190816, -18927920, -14832670, -39857832, 9250823, 11718818, -12674448, -1951526, -37356016, 5402532, -10960757, 12402255, 17563196, 5640366, -19050328, 6805913, -5920076, -3223373, 2971581, 30514668, -5404680, -855772, -7584912, -23023172, -4338991, -9116068, 9148817, -4061965, 10135049, 6593312, --20958366, -47856672, -23409720, -35104916, 29070486, 29211146, 34749508, 19983410, -44502840, -40161704, --62154084, -14856829, 50918984, 56259240, 54912768, 2928631, -59928752, -44844292, -34774740, -459025, -90200216, 62625456, 25804700, -47888884, -55661164, -41700912, 21055540, 21694954, 31549756, 16687022, --40980968, 54459648, -1176821, 7904351, -22922240, -51873004, 30904974, -52236464, 55338508, 7938174, -4949950, 11547020, -33254322, 32855426, 3244848, 22789634, -31886374, 11112691, 288300, 39460012, --15760919, 9568113, 26436598, -30236032, -17331266, 2706903, -27411556, 44295072, -9966472, -18569292, -40039832, 45774688, -12285217, -34279744, -8369818, -30247844, -5507759, 18283676, -2859911, -37618008, -4498978, 19845434, -13111998, 22414360, -18752900, 8483097, 24357834, -10032507, 16071231, -42824044, --42765528, 43270184, 24326158, 66935456, -2711198, -17383344, 57126288, -32897838, -28928752, 19666656, -19335406, 32005560, -29309930, -14392972, 8774618, -6622840, 32405528, -26225070, -79995376, 20433844, -44885092, 198642, -37009732, 6621229, 22899692, -9356586, -9599252, -30296162, -9541270, -25084220, -24934432, 5625871, -17315698, -5140002, 29758218, -21465710, -7372312, -19445464, -2120103, 13947369, --20779588, 10721312, 31092878, 11436424, -318364, -9274982, -1622961, -11913166, -14329622, 22974854, --9671729, 10188736, -3175055, -12416214, 15569, 2090039, 2326799, 8078297, 10429791, -18347564, --5348845, 8441758, 7560216, 17296908, -2259153, -15844134, 6171331, -18377628, 8650601, -16787416, --9089761, -167504, -3445101, -11410117, 25222196, -11448772, 5239323, 10506027, 2426120, 8137890, -16754131, -773094, -2921652, 352187, -1607392, -21079700, -13284871, 81321448, 22005264, 22775138, --68911680, -16933446, -54024784, -45222784, 40838696, 43418900, 85287848, 39750460, -11553999, -16203838, --10047539, 27310086, 18688476, 923418, 41450192, 8454643, -16617228, -19274740, -15882252, 30211874, -537, 26470420, 12175695, 16123307, 3930969, -6199249, 3040300, 184684, 3921842, -6441377, --1726577, 8913131, 7199439, 56337624, 45061188, 37189584, -3230352, 10423886, -22807350, -3418794, --14185203, -25347824, -26795764, 8446053, 14618995, 21635360, 26090316, 21866216, -13463112, -34010772, -52285320, -36996312, -16338056, -9218074, 17958332, 2678986, 25611964, 27006754, 23386634, -31127776, --11247446, 4600984, -12330851, -50409496, 33964600, -11593190, -9107478, 19479288, 39417064, 44989244, -32638530, 32206350, 27600534, -29097866, 3864397, -7241852, -9100499, 17056388, 13354127, 18152680, -8719857, -7904888, -14619532, -20953534, -22922778, -45823008, -18379776, 7046431, -2600066, 28324236, --15569, -12572980, -4249870, -18112414, 6997039, 2361158, -1322313, -25233, 11963095, 26539140, --3195456, 1519882, 14541149, 1259499, 206695, -5070746, -1683090, -6060736, -5986648, 1770600, --12498892, 5774047, 7218767, -9040369, -13606456, 3961571, 2796024, -4775467, 13439490, 18158048, --2401424, 2889976, -5794985, -17967996, -7601019, 3164854, -104804720, -52287468, -71967544, 51963200, -11526618, 148824912, 153889216, 153271808, 175218560, 172485344, 123980136, 77103792, 96706024, 42728484, -9036611, -81594712, -70970040, -178185840, -155754848, -139895136, -82375328, -104020888, -79207784, -6532109, --25288768, -10247255, -12466143, 610959, -164283, 4695473, 20350092, 21786222, 20860656, 61398704, -63075888, 66788352, 47769164, 133620192, 34977676, 56150792, 93598608, 104272144, 38807176, 104938400, -126357400, 99567008, 86523192, 87900264, 9714679, 52613888, 106351984, 105009264, 67740760, 88117696, -77115064, -1087164, -28503550, -20133732, -52526376, -64896420, -8314520, -72931768, -111143016, -86681032, --103520520, -153177856, -70061120, -103588168, -114740592, -162576864, -132140040, -149934080, -171213504, -114138752, --193598336, -229101072, -229861280, -125153200, -155537952, -196093168, -38527468, -87366616, -40964324, -22058416, -64251636, 28524488, 94267552, 49984292, 89045944, 84693536, 55737940, 43862352, 69034616, 127794064, -130100464, 130478424, 133336720, 138471888, 168346608, 150315264, 124852016, 153456496, 173228384, 138369888, -104129872, 124190056, 104545944, 67436352, 85270672, 57565448, 28636158, 12200928, 26324392, 7577933, --10816875, -7602629, -13939316, -33470144, -50770272, -50589884, -55022288, -47156592, -58822260, -92619360, --83197272, -95718712, -107834816, -125735704, -125299232, -103914048, -104274824, -85602992, -54360328, -61403000, --41811508, -29585882, 2995740, -794569, 15032, 4616553, 18418968, 21089900, 6938520, 16508781, -26843008, 21064130, 9148280, 10420128, 19699404, 11069741, 4416300, 7269769, 10666551, 8989367, -5246840, 4539244, 3424163, 1444720, 352724, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, -}, -}; -const Word32 CRendBin_Combined_BRIR_coeff_re_16kHz_fx[15][BINAURAL_CHANNELS][1774] ={ -{ -{ -5815386, -1455994, -2240362, 100932, -1137093, 1463510, 5843840, -490700, -3820374, -5774584, 630286, --4339528, -1251983, -1309965, 1000727, 3101503, -4463008, -2168959, -1370632, 244276, -2636036, --4633733, -1809792, -3896609, -2077154, 841814, -190052, -1798518, -345208, -493921, 500901, --4146791, -1033477, 1678259, 3571265, 1837172, -529355, -505196, 171799, -3932043, -2672544, -870805, 260919, 1046898, -1050120, 864899, -852551, 1567126, -818728, 2932389, 2979634, --273804, -67109, 2286533, 889595, -158914, 220654, -4801237, -3017752, -729071, 1796907, --1975148, -4236985, -2667175, -2019172, -2979634, 1803349, -5478231, 1680406, 5598490, -2954938, --1404991, -2715493, 3122441, -1240172, -3447248, 913217, -4941897, 4958003, -1909113, -63888, -4645544, -2752000, 1786706, -420907, 616328, -3272765, -6712497, -1464047, 2591476, -1807644, -1569274, 2216740, 1942936, -1569811, 1095217, -4239133, -771484, 921271, 1699733, -258235, --98784, 389768, 1019518, -3588445, -2868501, 1076963, 2401961, -1335735, 2518998, 4634807, --6406481, 761820, -3049964, -2241436, 1464584, -963683, 3983582, -1395328, 3597035, 1690607, -628676, -440234, 1953673, -79457, -329639, -2204929, 5829345, -4211216, -1141924, 1807644, -2317135, -329102, -1862942, 869194, -2062121, 1985886, 531502, 551903, 63888, -1039919, --594316, 2697776, -7567733, 1501091, -855772, -4786204, -613643, 3422552, 1972464, 1978369, --3203509, 2334315, -9340480, 6575058, -3736085, 1165010, 910533, -175020, -2306398, -542777, --5420249, -6655589, 1323924, -1591822, 1567663, 1584843, 5257040, -5009543, 283468, 3449933, -3328600, -4142496, -4392141, -2514703, -3867081, -74625, -1559073, -3098819, -2480881, -383863, --6739341, -6452115, -1682554, 801011, -956704, 93952, -1136556, 962073, -3745212, 3424163, --1775969, 1761474, -903017, 1112397, -3469260, 588947, 1668595, 2089502, 654446, 25233, -454193, -1562294, -2983392, 4632659, 3393561, 1120450, -2406792, 5829345, 3792993, -2347200, -3518652, -887985, -3705483, -1369558, -1709934, -3446711, 1239635, 1450088, 384400, -2881386, -3810173, -3746822, 1896765, 2922725, -1532767, -616865, -6481106, -3740380, -6877317, 200253, -7478612, 3416647, -2929705, 1264868, 934155, 11962558, -3585224, 3423089, 5779952, -1132261, -5247913, 2166811, 3544422, -4735739, -1833951, -5545340, -2653753, 3759707, -198105, -2622615, -536334, -3869766, -409633, -2520072, 3446175, -1526324, -610959, -1366337, 1762010, 876710, --97174, -406948, 1404991, -5799280, -4669703, 2072859, 367220, -504659, -3149285, 7039989, -1808181, -824634, 2097555, 2839510, -214748, 1450088, 420370, -3355980, 2872796, -4006131, --3369402, 3779034, -4663261, 3884261, 1386201, -3193845, 5352066, 3189013, 1827509, -1422171, -4764193, 1336809, -1123134, -1351304, 1109175, 758062, -1408749, -5905580, -1451162, -998043, -1201517, -3354906, 4038880, -1420024, 2953327, -3744138, 12374338, -10511932, -9244380, -3066607, -9443559, -1466195, -5321465, 6428493, -4500589, 2970507, -370978, -7262790, -4985384, 5894843, --4029216, 2860448, -4197794, 3857954, -1898376, -1219234, -578747, -4048007, 1954747, 2771865, --4074850, 863288, -2127620, 713501, 1693828, -675921, 2481417, 689879, 2014340, 3269007, --4411469, -3253438, 3797288, 122407, 2932926, 2878165, -2818572, -4136591, -1697049, 647466, -5291400, -5837398, 2332167, -6504191, -7924752, -1883880, -4541391, -774168, -5361193, -10161356, --5388574, 4715874, 4408784, 2873870, -3356517, 9750650, -2944200, 1686848, -5301601, -5004174, -1439888, 84826, -350577, -6291054, -1898376, -233539, -1034550, -1082332, -3091840, -2585570, -1214402, -682900, -1133871, 16124381, -5162551, 7605314, -1914482, 10193031, -1878511, -1435056, -1771137, 2165737, -1643899, -11446088, 1195075, -972273, -3037616, -22549, -517007, 4285304, --1294396, 10033580, -1284195, 1297617, -696858, 5774047, -1096827, 2131915, -4621385, 42413, --3188476, -3075197, -976031, -714575, -2147, 3833258, -6385543, -1610613, 2080912, -455267, -4297652, 1294933, -1204738, -2601677, -2997350, -2764348, -5917391, 2521683, 2309619, 2525441, --10255308, -1100585, 6943352, 4408784, -1820529, 117575, -3352759, -6465000, -7602629, 7832947, --2546379, -4384088, -3064459, 4569309, 2823404, 1001801, 3166465, 2172717, 3000572, -924492, --7703024, -1591822, -3815005, -2698313, 4642860, 4633733, -1371705, 7234873, 7857643, -24428700, -12734578, 4349192, -1551020, -1519882, -377420, -4106526, -7119982, -1908039, 2829310, 9692667, -6388764, -9713069, -2195265, -5966784, 3339874, -933082, -12918725, -4151623, 7255274, 4274566, -2212445, 6039261, 3534758, -1130650, -1222455, 1454920, -5152350, -3278134, 707596, 5206574, --2771328, -5238787, -7281580, -3944928, 3082176, 10710575, 417686, -2422899, 2019172, -2767570, --8628052, 154619, -6180995, -5064840, -5779416, 2942053, -641024, -8228084, 1156420, 2487860, -2758443, -8859981, -4927938, -3581466, -2332704, -1363652, -3331284, -1946157, -4214974, -8597451, --1120450, -7362111, -8451422, -5581310, -1558536, 1016297, -4984310, -7720204, 2194192, 5464272, --177704, -1474248, -443992, 3861176, -5959804, 4266513, -10272488, 3375844, -5246840, -1225676, -966368, 2536178, -725850, 4724464, -177167, -1449552, -14203994, 6019397, -2863670, -3398930, -4727149, -8520678, -11340861, 4055523, -4124242, -5682779, -1867237, 9513889, 6083821, -4175782, --2359011, 4130685, -1570884, -1042066, 1178969, 3988414, 8189429, 4737886, 6612102, -1626719, --415001, -444529, -4554813, 508954, -1963337, 10713796, -8756901, -5699959, -4646618, -4989679, -2699924, 828392, 4057134, -1413581, -5728950, -8447664, -2191507, -10359998, -13271449, -3500935, -440234, 9485972, 2158221, -9117679, -1973538, 6801618, -3126199, 1580548, 2533494, 3263638, --5935645, -10434623, -3820374, -6015639, 15242839, 186831, -4425964, 1502702, 2903398, -3316789, -2341294, 117038, 8715026, 2856153, -527207, 6051072, -929324, -7220914, -1166621, -528818, -7458211, -3978214, -751619, -2112050, 1410360, -2151242, 700080, 2451890, 3690451, 5016522, -3518652, 1631014, 13007308, 5068599, 4492536, -494995, -9692131, 696858, -7999377, 2579128, --5291937, 1406065, 412854, 3239479, 16045461, 4443681, -1995012, 5616207, -3962107, 4775467, --2258616, 8128763, -3940096, -77309, -5585605, 3685619, 6782827, -7324530, 15313706, -3670050, -1738925, -2331630, -3245385, 1499481, -3653407, -12686260, 2951716, -3254512, 182536, -7882876, -2800319, -2862059, -11937862, -5986648, -2498060, -11584601, 7739531, 16404628, 21383032, -19204946, --13064754, -8198556, 2504503, 4645007, -3965329, 2648384, -4486094, 1752347, 11400454, 8051453, --12760885, 20572894, 1232119, 12402255, 4996658, -3201361, -3386045, 11567421, -5510980, 7631620, -9129490, -201327, -5083631, 1214939, 9401147, 5749888, 5200669, 4749697, -12885, 2292976, -3649649, 11851962, 8446053, -4925791, -4257923, 35970, -1808718, -277025, -5030481, -2885144, -6193880, 10601053, 3153043, 15517180, -3386045, 16888348, 1384590, 8478802, 18178986, 13412646, -4612258, 4593468, 8537321, -707596, -6491306, 996432, 8031052, -3242164, -7579007, 1379758, --767189, 17126182, 13372381, 965294, 18581102, -454730, 10164577, 6337224, 8084202, 227633, --5925445, 9420474, -1371168, 10867878, 6706592, 21545704, -11141145, -382252, -22719840, 6534256, --11348914, 419833, 9997610, -1948305, 3317325, -12981539, -9463424, 4895726, -7592429, 4598836, --4480188, 1406065, 12342125, -1970316, -11155641, 3157875, -4516158, 11697343, -11900818, -8489003, -5283347, 5621576, 8842264, 288300, -489089, 5456756, -2966749, -8397198, 5578089, -3505767, --6241125, 1898912, 6955163, -4896263, 12714177, 4826470, 34360, 1452236, 6505802, 2447058, --20405926, 8354785, -1595580, -2433099, -3037616, 10892574, 666794, 11593190, 1124208, 754841, -1964411, -3438658, -583042, 5432597, -5979668, 1242319, 19790136, 1305133, 14795625, 694174, --1998234, -1946157, -8526047, -20003810, -13300440, 6020471, 10001368, -4346507, 16072841, 5918465, --9507984, -6722161, 15022185, 9261023, 10558640, 2334852, -2513630, -239981, 1331440, -8548596, -228707, -4151086, 6726993, 13425531, 5674189, 5107253, 15273977, 12926778, 10930692, 1309428, -4633196, 1690070, -1434519, -1889249, 3253438, -229781, -7713762, 2797634, 9339406, 814433, --1542967, 3526168, -20147692, 7916162, -7492034, 6135898, 8013872, 7347616, -7016366, 5175436, -68719, 745177, 13338021, 10029822, 1002875, 5801964, 4491999, -763967, -6235219, 2661806, -6959995, 1049583, 9753871, 3592203, 8907762, 16760573, 1708323, 7326141, 7661685, 9427453, -531502, -4489315, 14566918, -4342749, 11940009, -12049531, -9780177, 15942382, 172336, 5915244, -9778030, 14045617, 17878876, 8109972, 3327526, -7265474, 4766877, -682363, -14012868, 13866839, -9190693, -11300059, 597537, 1914482, -13960791, 6484864, 14217415, 8896488, 2310156, -35291748, --22091702, 6622840, 7020661, 13841606, 23310398, -7024956, -4065187, -8071854, -7329899, -9451612, --9855876, 200253, 3519189, 2399276, 14660871, 27917, 14398341, -1392643, 4795331, 6110665, -4980015, 10210748, 7562901, -182536, 9411884, -884226, -1324461, -6332393, 6334540, -1700807, --14475114, -13241921, 7634841, -2685428, 16954384, 9271224, 10873247, 3100967, -21581136, 4176856, -13429826, -3114388, 3863860, -4375498, 2627983, 15843597, -630286, 13050258, 23680840, 112743, --8963060, -1524713, 246961, -16204912, 20135344, 8210904, -2651069, -2583423, 14614163, 5378373, --17629768, -15945066, 5723044, -7874823, 8508867, 4432943, 2743947, -8699456, -12484396, -2310693, -3249143, 737661, 13630616, -19542102, 2581812, -1220845, 24898462, -29229936, -8048769, -14150307, --424665, 4856535, 955630, 19918984, -20178830, 9824201, -2605972, 4134980, -2292976, 11039140, --5801964, -9865003, -673236, -2718714, 7824357, -413927, 5344013, 11703249, -2220498, -8364986, --983011, 13144747, -7424388, 3324305, 3071439, 767189, -1002875, 13078175, -314069, -3035468, --21233782, 7165079, -5123359, -13231184, -11587285, -2826089, -12861816, -7374459, -11143293, 5691906, --13179644, 13666049, -12077985, 8612483, -6146635, 16525424, -15463493, -8721468, -2157684, 9758703, -4064113, 489626, -6230387, -12401181, 1526861, 5465883, 18551574, 10079215, 4240744, -9978820, -6486475, -8769786, -10217727, 9699110, -9900436, 5428839, 12154757, 10510859, -2364380, -3162707, --8329016, 14904073, 1592359, 11919608, 17426830, 23727010, -22931368, 18688476, 13334263, 1664300, -9887015, 31188978, -7437810, -7606924, 3886946, 9935333, 13529684, 5191542, -10743324, 14375792, --3882651, 27681064, 297963, -3326452, 9601399, 8058970, 7902740, 776852, 25952876, -19695646, -6023692, 678068, 7805030, -7606924, -16346109, 9642202, 7693897, 8051453, -5150203, -3566970, -21760452, 8857833, 27099096, 3415573, -8876624, -37044, 6635725, -1287953, 28013388, -2447058, -15568720, -1675037, 25137906, 9862319, 7241852, -5000416, -780610, 14365055, 782221, 15291157, -11332271, 13584445, -16542067, 3529390, 12340515, 15298137, 10975252, 9032853, 19515258, 24637544, --18552648, -1647657, 35944044, -8357470, -10785737, 23809152, 30368104, 447213, -2609730, -18178450, -11432129, 23976654, 15569, 8515846, -17878876, 19846508, -8425115, -4458176, -15545634, -9335648, -35792648, 2102923, -23075786, -9182640, 482110, 1795296, -2030983, 28438590, 13620415, -498216, --10025527, 764504, 8120710, -1435593, 36638756, 9478993, 16689169, 7359964, -6980396, -18117246, -5745593, 1845762, 4146791, -13468481, -678605, -8341900, 12951474, 2333241, 2913062, 14778982, --10336376, -5856725, 3384434, 3031710, 4621385, -14660871, -12617003, -26860726, -14518600, 4032974, --15925202, 5134097, -11281805, -4335770, 22903450, 10020696, -9645423, 9842991, 3556233, 3357054, -22231288, 30065, 26787712, 13652090, -9627706, -27029840, 6990060, 9477382, 19083614, -4373888, --20215338, -2391760, 9272298, 7687992, -1566053, -7640210, 15752329, -18369576, -1542967, 26866094, --6353867, 7685307, 2331094, 3244311, -26084948, 20879984, -2668785, -20788178, -12563853, 10420664, --3665755, 5079336, -762357, -8757975, -6985228, 3425773, -7021735, -1717450, -1075889, -29879014, --8501888, -20092930, 3621194, 6873559, -986769, -8933532, 2679523, -4354023, 10758893, -26394184, -850940, 4437238, 14070850, -11551851, 13005698, -11367705, 7876433, 2282775, 9814537, -17220672, -4128001, -8563091, -19385872, 11777874, -15967078, -29672856, 3064459, -2817499, 22001506, -11301133, -1838783, 10716480, 13982266, 17536352, 280247, -6009733, -12767327, 361851, 6505265, 11571716, --25095494, 25890600, -2410014, -17439178, -15524696, -23212688, 6637872, 5666673, 5884105, 4134980, -20292646, -8492224, 19376208, -23054310, -1165547, 11023034, -5890011, -24896314, -4858145, -35883916, -15782394, -39550208, 21883932, -27699854, -24239722, 5467494, 18855980, 13714904, -14253386, 12783970, -24001888, 3273839, 2704756, 4701379, 1226750, -15962246, 16936666, -31369904, -19753628, 454730, --2884608, -3192771, -5020280, -8790724, 3017215, 26445724, 6173479, 2530810, 1604170, -14408542, -15122580, -4298189, -28900298, -5718212, -376347, -857920, -20067698, -14995878, 13734232, -6340983, -24264418, 3068754, -925029, -22195318, -12182675, 5813775, 2334852, -7434589, 20695300, -19045496, --11286100, -2818036, -2147484, 18165564, 790811, 21437792, -842887, -22149146, 4024384, -19586662, -11856257, -5718749, 16476568, 28665686, -50982336, 12237972, 6263136, 2739652, 18357764, -5946382, -2934000, 39476656, 33937220, -11823508, -15308337, -2493766, -28572806, 14081587, -3064459, 4229469, -605054, -15412490, 39538932, -19393924, -73793984, -12382928, 13010530, -50520088, -9749039, 13399761, --42633992, 3858491, 25505664, -20854750, 25467008, -27646168, 21717502, 26621282, -19522236, 5811628, --3884798, -1372779, -8955007, -13321378, -3282429, 15531675, -12502650, -20939040, -11446088, -17296370, --2720862, -14060649, -3031173, 4128001, -3888556, 14966887, -16172162, -20855288, 13848048, -21969294, --30165166, -39776764, -13967234, -3255048, 6405944, 18460844, -9559523, 6890738, 8978092, -9395778, --3989488, 31801548, -23458574, -3549254, 22866942, 4533875, 17882634, -7505992, 6169184, 23088134, -12898324, -4646081, -3658775, -19620484, 6164889, 22186190, -25219512, -11884711, -8573828, 36042292, -24260660, -34878892, -7301982, 31105226, -9793599, -19226422, -13973139, -19251118, -11831024, 31525596, -18679886, -2377801, 13727252, -3237869, 16793322, -10704132, -6721624, 35169340, -15236396, 6614787, --10874857, -3427384, -1238024, 9928354, 27485644, 11362873, -20227686, -5185636, -1944547, -2418604, -14846628, 2672007, 27373438, -7854959, 3632469, -2338073, 6945499, -23319524, 12903155, -21421150, -13364328, -441845, 20252918, -4961761, 14448807, -6702834, 3150359, 10204842, -11614665, 10586021, -19896972, 28651726, -17144972, 29382946, 9266929, 34724812, -12568148, 7447474, -4415227, -2992519, --9918690, -1105417, -14973867, -53919556, -39025148, -9308805, -5517959, 9340480, -1683627, 14415521, -14084272, -28534152, -10628433, -10430328, 26574036, -40381820, 36454072, -11653857, -11957726, 8833674, -16506633, -31753766, -7066295, -189515, 5322002, 949188, -1773285, 14847702, -10339060, 1303523, -7256884, 8375186, 12038256, 10069014, 2637110, -17667348, -4394826, 22505092, -23463944, -19847044, -22983444, 7580081, 15928423, 25623774, 39618388, -9799505, -26906896, 33826088, -14957760, -6354404, -34760244, 10731513, -14258755, -37918120, -25812754, -4253092, -14951318, 17117592, 34173444, 17648558, --13296145, 35851704, 11020349, -13559749, 8807904, 40107480, 10502806, 7488813, -9772124, -32769526, --44790604, -34909496, -3743064, 25995826, 6779606, 16383690, 60844116, 30455614, -38375532, -25087440, -15298674, -51392504, -24726126, 44559212, 14910516, -56735444, -48324288, -21364242, -36389648, -33055678, --17236778, -54029076, 39786968, 17926656, 13775571, 16906066, -4630512, 20441896, 16841640, 23738284, --2960306, 32017908, -17915382, 24697672, -7226820, -16065862, -4457103, -27361626, 4138738, -8958765, -11349988, -5629092, -10182831, 29620242, -30967788, 22457310, -110059, -12077985, -4636954, 14241575, -14861661, 12029667, 27229556, 23250806, -14431627, -1127966, -12864501, 13960254, -11355357, 11418171, -13400298, 8061117, 7779797, 7044820, -6910066, 31501974, -2177012, 11145440, 3395709, 16003048, -7865696, -32088238, 2614561, -17984638, 5594195, 18331458, -2644089, -11605539, -13391171, 35745404, --34253976, -24177982, 50784768, -17817672, 12967580, 9184251, 15957414, -3152506, 7978976, -30367030, -1617055, 40157944, -19539416, -7102802, 28102508, 6546067, -26805428, 12505334, -37677600, -137980112, --148366960, -10197863, -87148648, 67864240, 258684272, 109803520, 154139936, 195629856, -80527416, -58699856, --26026428, -185362736, -130713568, -46006080, -202247328, -91289528, -22140556, -85962160, 14756434, 180355344, -164109632, 177214112, 232043120, 137261792, -17148194, 47930760, -57269092, -215591248, -118496536, -89798640, --178929408, -125079648, 2631741, -139810320, -48264160, 24486146, -138337680, -74164424, 96845072, 33843268, -105463992, 266627808, 217437552, 173556944, 318101920, 228274832, -7155416, 28579786, -63073744, -292923744, --278069056, -288776416, -444851776, -304239904, -187310496, -185640304, 514322, 139642816, 160726800, 223222880, -343002528, 314833440, 268950848, 262911056, 153861296, 52892524, 12884365, -14259291, -112143208, -200613088, --239049824, -256209824, -335403136, -255880736, -100100120, 29174102, 28749974, 0, 0, 0, -0, 0, 0, }, -{ -8801462, -1883343, -196495, -1462973, -2813204, -2139431, 2573222, 3369939, 1700270, 2755222, 520228, --1939715, -264141, 151398, -2012192, -2039573, -3981435, 5708549, -2593624, 4967130, -3507378, --4341138, 590021, 6983080, -468688, 2850248, -793495, 1972464, 2929168, 2231236, 3717294, -2377801, -6961605, 403727, -3833795, 1169305, -1810329, -858993, -1358820, 253403, -590558, --1314797, 52076, -687732, 3553549, 1048509, 379031, 2974265, 2844879, 546535, -1574642, --1372242, -1493575, 1649804, -103079, 222801, -2730526, 7178501, 3269544, 1732482, -1275605, --1525787, 3157875, 827318, -269509, 975494, -1576790, 907312, -2250026, 74088, 1873680, --3071439, -2076617, -1116155, 148176, 403190, 1709934, -7948374, 3591667, -9015673, 1557463, -460635, 381178, -6212670, -2307471, 1474248, -1489817, 1777580, 2974265, 1707250, -245350, -2284386, -6976101, -26844, -424128, -361314, 3588445, 5501316, -6128382, -1537061, -3775276, --1379221, 1978906, 3709778, 488016, 769336, -1613834, -2148021, -1723893, -1411434, -2854543, -1283122, -2872260, -2056216, 2993055, -2870112, 2116882, 163209, -6862284, -2493766, -3829500, --1099512, 2758980, -2203318, -690416, -2170569, -2122251, -1627793, 2715493, 4051228, 707596, -2160369, 1814624, -2469069, -4345433, 2097018, 1852742, -1140314, -3717831, -3279208, 2772402, -367220, 2095944, 801011, -5626944, -2056216, -2022930, 2958696, 1415729, -5865852, 1745904, --3164317, -505732, -10730439, 7495255, -4997732, 955630, -447750, -1778653, 5821292, -4675609, --2989834, 209917, 6150930, -1974611, -60666, -428423, 5148055, -2736431, -7503308, -1538672, --3710315, -5260261, 510564, -250182, 1216550, 3330210, 5513665, 3410741, 833224, 8107825, -3430605, 433255, 6010270, 6098854, -119722, -3044595, 592706, 2774012, 2474438, 99858, --757525, -4467840, -3665755, -1859721, 4952634, 2012729, 8246337, 4556961, 85899, 2741263, -3637837, 1184337, -4398047, 5378910, -1605244, 2862596, 293132, 1772748, -5273683, -823023, --1293859, 2151242, -1192390, -2090575, 6663642, -319975, -3892314, 1897302, -2757369, 2933463, --1188632, 4659503, 4754529, 4507568, 2428267, -3955665, 3458523, -165893, 3766686, 2091112, -2367064, 19864, -2226941, 2187749, 810138, 579821, 1006096, -8803609, 2734821, -5660767, -843424, 1657321, 1814087, -2678449, 4544076, 584652, -1768990, -948114, 5323612, 3703336, --2396592, -3178813, -2521683, 1909113, 3773129, -2488934, -2564096, 558883, -9877351, -219580, --4231080, -1861868, -4204236, -5689758, -694711, 4766340, 1357747, -4692789, -1196148, 4031901, -1286343, -2986613, 4831302, -2359011, -6730751, -2274185, 3795677, -1949378, 4495757, 8266202, -6946573, 656056, -61740, 2103997, -1008244, -5378373, 103616, 1559073, -3556770, 2688113, --7102266, -1451162, 528818, -3442416, -2245194, 2707977, 6368363, -5337034, -4981625, 2726231, -3362423, 5428302, 2097018, -3860102, 4960151, 3913789, 14904073, -5622649, -2410014, -825707, -10777147, -938987, 8178692, -5739687, 7219840, -6908992, -6053757, 1605244, 3477313, -4029753, --908386, 2241973, -433255, 2885681, -4173098, 5061082, 1891396, -5178120, -99321, 2245731, -1758252, 1066226, 10122701, 8109972, 6344204, 117038, 4145717, 497142, 1253594, 3118683, --9175661, -1300301, 5711770, 3783329, 4443144, 8590, -1580548, 2153926, -312996, 11420318, --1668595, 2017024, 1169842, 662499, -3321084, 6891812, -757525, 7161321, -3884261, -3963718, -2909304, -2602213, -9441412, -4221953, 1850594, -775242, -6797860, 2005213, -67109, 8897025, -656056, 909459, -2818036, 3360275, 3063922, -516470, -716723, 7948374, 5420249, 5954436, --3954591, -4792110, -4576825, 10654203, -8818105, -441308, -9205726, -6151467, -3699041, 7571491, -4402879, -11134703, -15051176, -5988258, 5084168, 3462818, -2387465, 4815732, -100395, -1559073, -437550, -8125005, 2222109, -1343788, 527744, 2147484, 411780, -364535, 3177202, 2536178, --5297842, -5543729, 5825050, -2248952, -2993592, 3235184, -10250476, 2022393, 2060511, -9796284, -3358128, 9270687, 5834713, 6209449, 1332514, 3205119, 9192841, 1239098, 1745367, -11083163, -5583995, 7434052, 6535330, 692564, 6652905, -8120710, 7462506, -2844879, -7348689, -12071006, --32212, -7952669, -5757941, -3243774, -6834904, -18136574, 907849, 70867, -391916, 1804423, -8773008, 2237678, 3736085, 1210107, -5828808, -280247, 3403762, 1128503, 2962991, -23587960, -11426760, 1363652, -9243843, 2090575, -1132798, -2814277, -1992328, -5287642, 2640868, -2770791, -411243, 3258807, 2983392, 10043781, -4243965, -9833328, 5149129, -12436078, -5447093, 1891933, -1557463, 1287953, 3852586, 4827543, 4121021, -204011, 5498632, 253940, -2376191, 7373922, -4502200, -2390686, 4316979, -7852274, 14496588, 445066, 2589865, -1478543, -12690555, -2280091, --4801774, -4503810, 1826972, 10366977, 178778, 338766, -1461900, -2987150, -6884296, 2048163, --1214939, 3652870, -8628589, 2788508, 4479651, 1911261, -6385006, -2337536, 1633698, 729608, -5120675, 922881, 17815524, -5158793, -7507066, -8693014, -2467996, 114890, 6582575, -8632347, --737661, -3690451, 4545149, -12437152, 601832, -2719788, -3322694, 10277320, -3720516, -2855617, -1973538, 2794413, -8853001, -8965207, -8189966, -7761006, -12426414, 7295002, -7390565, 1788317, -2658585, 10661719, -2107218, -2991445, 8356396, 1623498, 1533840, -10524280, -6914898, 4594005, -1898912, 3565360, 5701569, -11087458, -137976, 4146254, 9942849, -527207, 717796, -1967095, --233539, -7409356, -1554778, -2616172, -13191455, -1500017, 3740917, -7909183, 2971581, -8573292, --252866, -6091338, -1349694, -2251100, 542240, 9937481, -3228205, -391916, 5188858, -3541738, -2981244, -9237401, -15606837, -8979166, -4816269, -2786360, 1535451, 9700184, -4942434, 2131378, -2445984, -8077760, 2472291, -6389301, -2010045, 3092377, 10515154, -2285996, -449361, 2723009, --30602, -10191421, 10588705, 11098195, -3041911, 1269163, 11639361, -11297911, -10002442, 8950175, --1796370, 1440962, 8184060, -1310502, -1865090, 8131984, -14308684, 6467147, -355409, 2713346, -7418483, 7570954, -7866770, 1786170, -10921028, 3690451, -3060164, -972810, -7493644, -171799, --10878615, 1313186, -9380209, 7030862, -3067144, 1512365, 12474196, 5849209, 5781563, -9457518, -2140504, 11467563, -2297808, -15754477, 8943196, -1725503, 1935957, -2916820, -7034083, 10786273, -4174708, 8835285, 2531883, 1484448, -6711424, -8966281, 3703336, 4562329, 5005248, 6387153, -14521821, -199179, -10594074, -6854231, 8872329, -926639, -9088688, -2158221, -275415, -2225330, --11676942, 562104, 1795296, 3381213, -4308926, 7288560, -635655, 1068373, 8588324, 8034810, --10187126, 11531450, -2817499, 12206297, -10300405, 8983998, 834297, -1162326, 15266461, -8260296, -754304, -8025147, -2499671, 23332410, 11192148, 4796405, 3244311, 6491306, -3917547, -234076, --20047834, 3491272, -981937, -8808441, 9390946, 6949794, -442382, 1491964, -11637214, 9922448, --5506685, 10550050, 6914898, 5535676, -8378408, -1659468, -7061463, 10122701, 2257005, -3968550, -18192408, 8546448, -2178085, 758599, -15276662, 2375117, 601832, 11852499, -5508296, -15619722, --2743947, -4453344, -3081639, -21981642, -10940355, -23390392, -11895986, -8451422, 2681670, -5971615, -10927471, 1260573, -12561706, 7492034, -8390755, 11830487, -10546292, -8537858, 6244346, 10697153, -10526965, 329639, -9549860, -7174206, 5122822, -15169824, -17877264, -12092480, -2405719, -963683, --3003256, 3329674, 5397164, 3565897, -806917, 1577327, -6246493, 2840584, -11851425, -16088411, --358093, 11064909, 1207960, -4864588, 8558259, 4866198, 8239358, 14648523, 1090385, -5457293, --10712722, -8552354, 3546032, -9700184, -7195681, 1595044, -8099235, -16394427, -9606231, -1591822, --2860448, 2935073, -4595615, 7945690, 1419487, 2550137, 10879152, -2678449, 250182, 2022393, --10807748, 10537702, 599685, -11253351, -18433462, 3549254, 168041, -13267691, 11732777, 7697119, --13037373, 3023657, 9482214, 5312338, 1289564, 8234526, -5990943, -4717485, -1214402, -6165963, --10208600, 12787728, -14677514, -2659122, 2732673, -234076, 18907520, -20478940, 2547989, -4450123, --3968550, 3050501, -1646046, 2463701, -4757213, -11759620, 9257265, -20785494, -14919106, 10040560, --1072131, -18988588, 8858370, -11361262, 20248086, 3559991, -27966680, -4093104, 1927367, -7530152, -1501091, 4166118, 9168145, 7716983, -16470126, -1308354, 938450, -3911642, -15133317, -2865280, --3571265, -5618891, -4990215, -817654, 541703, 11810623, 13066364, -4816806, 6792491, 5731097, -5653788, 12964896, -357556, 3062312, -16142635, -5941551, 4975720, -3652333, 7012071, 18054432, -2214056, -16824460, -36824512, -603980, -11722576, 9804873, -7398081, -4174708, -7676181, -20055350, -7980586, 25799868, 969052, 6503118, -21145198, 3948686, -2935610, -9494025, 1730335, 9921911, -4564477, 8125005, -9552544, 13238700, 6906308, -14565308, -23190140, -118648, -16962436, -39697844, --25130390, 17860622, 14298483, 23447838, -262530, 9220758, 2095407, 7401840, -522375, 4788889, --10665478, -12466143, -8023536, -11134703, -7508677, -7895224, 9251896, 22701050, 4597763, -27461484, --6916508, 4981089, -7714298, 6911676, -16182363, -1076963, -973884, 1144609, 7218767, 6083821, -583579, -1613834, -4048544, 6736120, 11921755, -9652939, -16103443, 10703595, 4293894, 13955959, -5526013, 20136418, -14309220, -4286378, 11835856, 19302120, 15533823, 10233296, 3773129, -3397319, -372052, -1684701, -841814, 7241315, -25487410, 13981192, -2956548, 4440996, -2705830, 19567872, --6832756, 759136, -5304822, 12947179, 8731132, -19661824, 13638669, -16393353, -2338610, -7445863, --10431402, 9924596, 60130, -25675852, -3426847, -143345, 22280680, -24150602, -248034, -13606993, --38875896, -4353486, -14135274, -30666604, 6525666, 66035, -5660767, 2203855, 16991428, -824097, --17201880, 6276558, 1096290, -5411122, -3830037, -2903935, 1300301, 19385334, -3875134, -489626, -9140764, 6638946, -2303176, 9480067, 8963060, -3899294, -3534758, -7513509, 11171747, -2371896, --17832168, 2971581, -665720, 6467684, 24634858, -15912317, -25161530, -16110959, -6896644, 3686156, -9251896, 4677757, 19006304, 9247601, -12179990, -7376070, -16837882, 15300821, 10193031, 1730335, -4101694, -10094247, 1986422, -10712185, 19450296, 18053896, 2356863, -8546985, -3540127, 1626719, -18067854, 33313914, 22035866, -3488050, -5932961, 47782, 12462384, 4094715, 11966316, 12914967, --10797548, -1349157, -21802328, -14087493, 8704288, 10142565, -17408040, -501974, -8182987, 16160351, --14177687, 4843113, 3119757, 29945048, -15707232, -3331284, -16205985, -2093260, -15988016, -13087302, --9022116, 7356205, -17329120, -12002823, -18993956, -3462818, -1400696, -4498442, -7641821, -21227876, -7751342, -14446123, 8313983, -15232102, 22821308, 5153961, 11182484, -2148558, -18172544, 12607876, -7908646, -4729296, 12397960, 16906066, -6311455, -19419694, -9729175, 30800284, -10517301, 1154809, -2516314, -2744484, 8106751, 20804822, 5106716, 10149008, -4182225, 15608985, 2022393, 12843563, -5056250, 5982353, 1556926, 3580392, 24703578, 9512816, 56512644, -30579630, 23255638, 32778116, --5852967, 3747896, 17541184, -7857106, -1067299, 28723130, 12241194, 113280, 15738908, -82141, -29037738, 32646046, -871878, 23256712, 22988812, -2528662, 9546639, -25665114, -9070434, 20626580, -557809, 20395190, 28451474, 23710366, -6563247, 15167677, -26779658, -40115532, -18464064, -15533286, -7712151, -751619, 8323110, 10162966, 21790516, 17568026, 4490925, -19362250, -4211753, 18075370, -4021700, -9735080, 9975062, 25271050, -5014911, 8528194, -23208930, 9690520, -18847928, -4813048, --12856985, -22049826, 10982768, 1349694, 4051765, 26035018, -16678432, -15862388, 6779069, 27171036, --24004036, -14003741, 5952288, -6521371, 35265976, 28773596, -29964376, -9520869, -24458766, 1951526, -19981798, -9802726, -19681150, -6120329, -2214056, 7181186, -23200340, 6586333, 34968548, 5262946, --30212410, -36642512, 27807766, -34165392, -36450852, -12618077, 4695473, -8589935, 4379793, 1587527, --37418828, -22740778, -28578712, 4802847, 12928388, 2904472, 20892868, 18038326, 27038966, 6532109, -29741038, 11582990, 18640158, -12501576, -5540508, -12602508, -25795036, -20031728, -38995080, -24939264, --8644159, -24604794, 3454764, -3650722, -1874753, 6101001, 6134824, 481573, 16995722, -7553237, --16137266, 18669686, 1004486, -31889596, -13316546, -6326487, -35377644, -29528438, -26217018, -1039382, -11699491, -158914, -13775034, -5287105, 14061186, 5159867, 34141768, 2539400, -46352896, -19443854, --7937100, 3180423, 7462506, -9724343, -11824582, 12495134, -24945170, -9677098, -19604916, 10299332, --39129300, -30706332, -31328566, -32706712, 3276523, -21937082, -9004399, -34676492, 16458852, 37723772, -2510409, 17250736, -13398687, -9883257, 25905096, 10404558, 26076358, -43882756, 18227842, 32416266, --3899294, 37442988, -20746840, -57641144, -30587146, -504659, -6640557, 6305012, -21559662, 19891068, -27047020, -25190520, 21205328, -13689135, -18118320, -39900248, -17621178, -22757422, -16532940, -18066780, -16727287, 3158412, -37410240, -45509472, 33260764, 8490613, 10867341, -10059350, 1104344, -11664057, --1437740, 11472931, 14194330, 15541339, 36998460, 2348273, -30001420, 38989712, -6153615, -8487929, --19807316, 17398376, -33463700, -19283866, 15122580, -14430016, -26860188, -28489054, -29424820, -3620121, -585189, 5136244, -11381126, 35229468, 24511916, 18254, -19517406, -24411520, -35344360, 11059004, -2391223, -2512556, -7721815, 49095236, -2127620, -8439074, 13621489, 14622216, -36165772, 27870042, -18311594, 54825256, 24395952, 1727114, -17644800, 26397406, 140123, 2294586, -11869142, 24082956, --26867168, 20435992, 19921668, 20669530, 10492068, -7117298, 27622008, 34089156, -6182606, 14239427, --20210506, 34245384, 15263777, 11609297, -20891258, -47169480, 10251550, -14335527, -9987410, -19069118, --23361938, 14766634, 7464653, -11677479, 3634079, 1203128, -11846057, -57884348, -2626373, -12310450, --4919885, -948114, 41869488, 27759984, -12517682, 10361072, -25759066, 2788508, 21298206, -31005368, --27288612, -23784456, 38212860, -26986354, 9006010, 29141890, -38611220, -37782292, 35667020, 26466126, -30249454, 37476276, 15805480, -50180788, 12792560, 13221520, -2498060, 78604344, -6289443, -14182519, --34020436, -33870112, 18698676, -32354526, 21883932, 1163936, 25046638, -7883950, 13600551, 41763724, -4947266, -32806570, 50597400, 13395466, -1646583, 36403068, 18945638, 29713658, 12208445, -40563280, --7574175, -14282377, 21451214, 50349900, -29329794, 9292162, -13181255, 23161148, 26774290, -31685584, -29309394, -25211458, -22107808, 13430363, 24465744, 2230699, 9323837, 18909130, -24931212, 24808804, -3681324, 29976188, -3264175, -6480569, 11259257, 43746928, -17268990, 35506496, -14776835, 7938174, -10936597, 35377644, -81604, -1364726, 13816373, 52719648, 5407901, -39852464, -1287953, -48213156, -31376884, 653909, 82158432, 17585206, -21324512, -6800544, 19834158, -17570174, 30296700, 52240224, -38001872, 531502, 17479980, 22108344, -234613, -25222196, -900869, -6915434, -81031000, 50061064, -41704668, 32771674, 11785390, -40563820, 32202592, -18741090, 32720134, -28560458, 5573257, 16143708, --14481019, 2996277, 6586333, -7140920, -15214385, -28748364, 45683956, -9172976, -8442295, -14081587, --2103460, -5189931, 15086073, -29313152, -8399882, -17899276, 6862284, -17956184, 18657874, 1081258, -9734007, -19832012, -38165616, 3110630, -27856622, -27990838, 13484587, -21111374, -18871012, 38565584, --13590887, -20221780, 2908230, -20784420, 10581726, 15608448, -3996467, -16593069, -5247913, 12319577, -9415105, -6547141, -734439, 34533148, -5789616, -18357228, -25618944, -1793149, -11200201, -36684928, -36315024, 14530948, -44270376, 29351806, -1842541, -16530792, 85505280, 50136764, 39565240, 22942642, -12405476, -18194556, 3776350, 11351062, 10992969, 5586142, 38842612, 9705552, -8486855, -18103824, --68838128, -38284800, 66773856, 9198209, 22436910, 12569759, -15531675, 13040058, 19417010, 5396627, --1045288, -15187541, -1938641, 5248450, -6587943, -4923107, 3644280, 8137353, 20080582, -12570832, -8972187, 1493038, 16227460, -4708358, 3957276, 5737003, -16660715, 14986752, 3263102, 4210142, -6095633, 5941551, -10177462, 12530030, -8625368, 3062849, 12386149, -5588290, 12178380, -4224637, -15101105, 11491722, 7395397, -16889422, 14114873, 10448582, 9026948, 22260278, -19799800, -1339493, -938450, -3984119, 7549479, -10370199, -16145319, 12283606, 14643154, 7102266, -424128, 3175055, --599148, 7263864, -4778151, 3056406, -11528766, 11865921, -18596134, 18937048, 11943767, -6340446, -1195075, 7719667, 2094870, 6803228, 1759863, 552977, 1149441, 12639552, -52721796, -122738352, --19666118, 71656696, 65118684, 160322544, 83769576, -43326556, -13273060, -89010512, -150811872, -10590852, --68512784, -9746355, 109944720, 46716896, 84972168, 130108520, -15077483, -19344532, -66100084, -112850800, --89385248, -6057515, -33487324, -13050795, 93700080, 29335164, 61030948, 110219064, 18326626, -818191, -11682311, -67638752, -101563088, 17085380, -104933568, -69267088, 23667418, -11036455, 17445620, 134941968, -15909096, 51410760, 110976584, -22559852, 3867618, 24100136, -106128640, -89481888, -30991410, -121936272, --46433964, 14818174, 23050016, 82888040, 118359632, 83191904, 59947544, 50856172, -18800146, -71845136, --57461292, -88676576, -91294896, -40419400, -22210886, -261456, 78885664, 91531120, 30698278, 71353368, -23435490, -23566486, 18785650, -49638012, -52439404, -7990787, -8610336, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ -7561827, -1618666, -2086280, -746787, -6973417, -3740917, 1630477, -356482, -369367, 6088116, 5115306, -1120987, -1479616, -1249299, -3369402, 3058017, 338766, -2038499, -1047972, -1949915, -907312, --500901, -4602595, -4224101, 3770981, 3504693, 1509681, -4344897, -2013266, -1016297, 1904281, --1606855, -2148558, -381715, 188442, 901406, 2044404, 410706, 2925410, -3751654, -3474629, --4669703, -3411815, -1887101, 437550, -613107, -647466, -1973538, 718333, -550293, 396748, -3310346, 2478196, -1255204, -2485712, -1812476, 970663, 764504, 326418, -275952, 6504728, -3992172, 630823, -1284732, 319975, -3777961, 233539, -250182, 1034013, -593779, -2095944, -3583613, -4563403, 215822, 440234, -448824, -4526359, 4527433, 1053878, -2632815, -1228361, --5730023, -1608465, 4591857, -2592550, -1927904, 1347009, -849330, -278636, 180926, -1602023, --1324461, 5603322, 2654827, -794032, 158377, -947577, -1825898, 686658, 1913408, 3040300, --928250, 1102196, 1319629, -5147519, -1680406, -108448, -1137093, 2997887, 143881, -1161789, -2646237, -2225867, 797253, 4225174, -2548526, 172336, 426812, 3180423, -1423245, 4424353, --6585796, -2452426, 2626909, -1385127, -5618354, 274878, 912681, 1693291, 1674500, -712965, --2542084, 71404, -2334315, -1584306, 417149, 2550137, 2252174, -3784940, 2949569, -4139812, -3285113, 17180, 2826625, -1417339, -2887829, -1375463, 1741609, -676994, -935766, -955093, -2390686, -3439195, -15290084, 5016522, -5557151, -2218888, -4547834, -4678293, 2660195, -1566589, --3939022, -2129230, 5374615, 7964480, -4351339, -1635846, -374736, -5757941, -5382131, 389768, --527744, 3492882, 1203128, 2596308, -2279017, -1460289, -2957085, 820876, 5177046, 2214056, -1033477, -3340948, 2552821, 738198, 1580548, -2190433, 235149, 736050, 1204202, -2968896, --2101313, 779537, -4006668, -4181151, 1844152, 3124052, -3475166, -1810329, -1292248, 226560, -3221762, 2504503, 1183800, 448824, 8220568, 3161633, -2461016, 3134789, 2369211, -2285996, -3965866, -1458141, -821949, -48855, -1516124, 3384434, -1743757, 870805, 2257005, 1624571, --2805151, 1174674, 838592, 594853, -733366, -1524177, -216359, 4741107, 894964, 2075543, -11718818, 4722317, -727460, 611496, 2749316, 1478006, -703838, -4943508, 245887, 4546223, --4493610, -426276, -8506183, 2340220, 3581466, 319975, -1962800, 6366216, 4497905, -3958886, -2040110, 325881, -3463891, 5691906, 3173981, -275415, 2348810, 5428839, -1568737, -1012539, -444529, 122943, 216359, 1373853, 6645925, 1413044, 1069447, -10507101, -468151, 576063, -1360968, -4702989, 1206349, -3775276, -2871723, -3998615, -2573759, 117575, 1334124, -2407866, -2605435, -5997922, -3389803, -281320, 31139, 2042257, -2325188, -482110, -2091112, 1404991, -3420942, -1917703, 481036, -1657857, -183610, 5172215, 4139275, -1571958, 3889093, -1778117, --3066070, -4014184, -172336, -453119, 18713710, -7641284, 1861332, -322123, -3035468, 3266323, -5501853, -2994129, 5890548, 44560, 6260989, 1985349, 2444373, -2194728, 3709241, 1643899, -3791919, -6874632, 4239670, -3920768, 1709934, -3234647, 4909685, -882616, 4946729, -2327336, -2066416, -1400159, -5906, 159451, -64425, 2159832, 9892920, 787590, 3195993, -2254858, --3980898, 561567, 512175, 566936, 1881733, -2661806, 6673306, -2147, 5679021, 763967, --1781875, -2445447, -7337952, 4264903, 3059091, -3229816, 938450, 3581466, 2221572, -8657580, -6028524, 173409, 4487704, -4971962, -5240397, -2327336, -5038534, -480499, 7406134, 2006287, --1698660, 1091459, 4705674, -468151, -1916092, -617402, -2055679, 3634616, -3393024, 885837, --1075352, 4844186, -11213623, 2333241, -3497714, -10256382, -7873212, 4244502, 4765266, 6212134, --2994666, -1573569, 4334696, 2050310, 6446746, 2083059, -624918, 656593, 4155381, 7918846, --1930051, 2304250, 6979, 6407555, 1585917, -404801, -1170379, -4913443, -7320772, 59056, --939524, 2211908, -283468, 1722819, 1450088, 419833, 631897, 1443646, -2379412, 242129, -3711926, 5491116, -2529736, 606664, -2197950, -3237869, 4777078, -3571802, -8533026, -3502546, --2016487, 4134443, 587337, 4564477, 4489315, -2322504, 452582, -3708704, -222801, -1641214, -5729487, -6925098, 122407, 2215130, -6898791, -8243116, 495532, 2425583, 5562520, -3691525, --8185134, 4412542, -7472170, 9227737, 5803038, 1502165, 4613869, 186294, -1809792, -25173878, -4872104, 1001801, -12775380, -16048145, -2804077, -12446815, 9645960, 2585034, -7616588, 208306, --3688303, 853088, -5287105, 395674, -556735, -186294, 6716255, -2739652, -1901060, -3153580, --2843805, -6826314, -4691178, 6378564, -3004330, 3951370, -3956739, 1583232, -164283, 3555696, --4121021, 2644089, -4138738, 1472637, -1755568, -2617246, 2114198, -6361384, 2089502, -3330210, --1405528, -4664335, 10543071, 4974109, 9209484, -4212826, 3722126, 3064459, -2163590, 1545115, --4773856, 4639102, 10123238, 8114267, -6010807, -1626719, 2155537, -4215511, -3069291, -7301982, --13875429, -4613332, 6684580, 2549063, -3641059, 1479616, 426276, -3524558, -6747394, -6225555, -4340602, 1005559, -10281615, 1839320, 712965, 1120450, -9660455, -3973919, -2429878, 7460358, --1833951, 1832877, -7484518, -7860864, 524523, 2372433, -4508642, -2597918, -4215511, 9090298, -2145336, -2975876, -6430640, -6458557, -6191732, -1730872, 3230889, 9102109, 3125663, 5149666, --3882651, 9675488, 5713380, 1787243, 312996, 9934796, -5593121, 940061, 3364570, 6710350, --10654740, -5558225, 4978941, 1883343, -1262184, 11303817, -4710506, 3163780, 7094749, 2072859, -1412507, 4933307, 2301029, 2412698, 2823404, 999654, 3219078, -263604, 4614943, -1111323, -10897943, -7827041, 9030169, 6795175, -5719823, 6712497, 1596654, 5667210, 6241125, -13139916, -8590, -720481, -3533684, 1853278, -3129421, 3354906, -1048509, 8008504, -419296, 1034013, -3986804, 2057289, 13139916, -3268470, -1861332, -3013993, 9392557, 5029407, 1129576, 3708704, --6117644, 14014478, 4711579, -897648, 5345624, 6880538, -11167989, -548682, 2788508, 1537061, -96637, 9778030, -4486630, -5567888, 13249974, 2229088, -835371, -1055488, 6963753, 788127, --908922, -1017370, -3107409, 3710315, -1898912, 4866198, 3291556, -7973607, -7778186, 1308354, -15586973, 155693, 3231426, -9216463, 4785668, 6749004, -3906810, 5121212, 5914707, -9288404, --5879810, -776315, -12392591, -6128919, -7384123, 2685428, -2510409, -2219424, -1335735, 9325985, --11964705, 5927055, 2627983, -3202972, 7339026, -3929358, 718333, -9228274, -199179, 7042673, -5480915, 12561706, -13538811, -2065879, -15029701, -1614908, -282394, -1399086, 1862942, 9161165, --9638980, 635655, -5794448, 17329120, -6899865, -3816079, 15040975, 11441256, 2346663, -20249160, --4734128, 9793062, 1045288, -656593, -2655901, -1285269, -1335198, 1777043, 3450469, 3249680, -3023120, 18575734, -3551401, -2293513, 261456, 2735894, -5193689, 3563749, 2167885, -316217, --5756330, -3389803, 6798933, 7424388, 13551159, 3792456, -5297842, 3759170, 10737, 3811247, -417686, 7806103, -6016176, -8795556, -9351218, 6630356, -2588792, 1726577, 2564096, -2951716, --562641, 16292958, 5444945, -12894029, 9502615, 3522410, 15994995, -7835094, -7959648, 5172215, -8473970, 6527814, 3086471, -875636, 163209, 4776004, -5699959, -786516, -484258, 7618735, --5862094, 14638859, -1859184, 1047435, -9335648, -5848135, -12484396, -10629507, -4317516, 3514357, -3590056, 18570902, 17982492, -2382633, 1168231, 561567, -175020, -447750, -4100083, -12505871, --9738301, -5087926, 4015258, -3640522, -11011759, -3234647, 1689533, -993748, -16711718, -5004174, -3277597, -1858110, 1199370, 955630, 4566087, 7042136, 810138, -5376762, 4955319, 5393405, -3532074, -348429, 6811282, -14473503, 4448513, -12824235, 15490873, -11341398, 3970697, -12012487, --2338073, -13396540, -7403987, -8355322, -9345312, 6141267, -8254391, -1533303, 2444910, -84289, --4544076, -2995740, -1698660, -12974559, 129923, 954020, 6193343, -20223390, 231391, -345745, -9284646, 11657078, -7917772, -4449586, 334471, 9185324, -16833588, 11353209, -7406671, -4189741, -1294933, -15042049, 2277943, -10454487, -25972204, -10862509, -5549635, 3589519, 6068252, -9085466, --3862249, -11229192, -9902047, 4005057, -8777303, 7461969, 2681670, 5109938, -1688996, -9054328, -13615583, 4798016, 7334194, -11120207, 3671123, 957778, -15554224, 8289824, 4871567, -387084, --10777684, -4851703, 4378183, 4348655, -858457, 857920, 6621766, -8063801, -5821292, 7510287, --17545478, -17751100, -22555020, -5972152, 6516003, -20354924, -16646219, -10842108, -200253, 5858336, -1709934, 853088, -151934, -6711424, -8167417, -19374598, 9176734, 1544041, 21675090, -6481643, -186294, -14906758, -16726750, 818728, 10229538, -570157, -10626823, 5469641, 2491081, 13666586, -1246077, 428423, -7485055, -2943126, 6231461, -16471736, -27733678, -9644886, -6885907, -23087060, --17648558, -7806640, 12925167, -523986, 21775484, 4803921, -1429150, -11360188, 4656282, 22622666, --22640920, -20047834, -6498823, -2747705, -14110041, 14397804, 4301410, 8163659, 9121437, -13669807, --1475858, 6618545, -8888435, 17903034, 443455, 4720706, -4798016, 5129802, -11129871, -5471252, --3761855, 7409356, 3128884, 11403675, -16937204, 2600603, -105764, -11538430, 13819057, -7095286, --20253456, 5215701, 7215545, 2742874, -6142877, -141197, -8560407, 2776160, 6709813, 4379256, --14038637, 6931541, -3413425, -13758391, -9384504, -17187386, 55298, -1178969, -925029, 4299799, -11080479, 16336982, 11395622, -4046396, -11090679, 5651103, -3422015, 584652, -8971650, 17460116, -11272679, 537, 21613886, -11873437, 5832566, 16989280, 8714489, -20347944, 2677375, 348429, --12851616, 1999307, -28695214, -24756192, -5895917, -90731, 1122597, -492311, -10187126, -219043, --2896419, 9345312, 1811403, -430034, 1730335, -21576306, 7502771, 4214437, 12037720, 5170604, -5184026, 14339285, 7000260, 2224793, 35376572, 7761006, 13544716, 18993420, 763430, 13452374, -3185255, -7180112, 8450348, 801548, 3955665, -7022272, 316754, -4486094, 2752000, -4468914, -9680856, 1401770, -6536940, -7552163, 689342, -20833812, 11798812, 8454106, -1560684, -1701881, -4250407, -5390184, -5274220, -6702834, -9058086, 7149510, -7482370, 11680164, 12405476, 13282186, -12807592, -3077881, -22462142, 463856, 7304129, 21374442, -6929930, -823560, 7550553, 14596983, -18445810, -3862249, 3992172, 18296560, 23477364, -15819975, -16567836, -22237730, 21878564, -1250372, --7409356, 8191577, 8053601, 20476794, 17342542, 2010045, 18928458, 26304528, 8331700, -11957189, -13291313, -10999948, -5523328, -1522029, -7171522, -9089225, 6420439, -4117800, -3747359, -11170136, -28841780, 4398584, -13399224, 944356, -681826, 13300977, 14396194, 6099391, -7232188, 14120242, --2185602, 9076340, -23810224, 2267206, 11943767, -9883793, 5115843, -10823854, -8067023, 26993332, -12386149, 8798241, -213138, -22142168, -3955128, 7620346, 6677601, 4672388, -3713536, 19301584, --11089069, 11138461, -4173635, 7679402, 9415105, 15472083, 21734146, -21926344, 1590749, 12632036, -8036421, 17362942, 18522584, -21965536, 2854006, -5594732, -8576513, -227633, -8148090, 5378910, -17432198, 34793532, 1430224, -16668231, 4629975, -11143293, 7121593, -9673340, -10524280, 31636730, --24113558, 39731668, 24199994, -5812702, 7876433, 19248432, 2644626, -29851096, 11609833, -24142548, -5613523, 2277943, -12144557, 649077, -1814624, 17470854, -8859981, -697395, -876710, -5081483, -36364952, -1894618, -5737003, 4941360, 12069395, -12224014, -26599270, 21043730, -3610457, -1302449, -23382876, -13621489, -4174171, -16254304, 4097399, -11237782, 13019656, 12714714, 24828670, -6822556, -6646462, 17271138, -24321326, 3389266, -15676094, -23560580, -31218506, -15650324, -33748244, -36825048, --5775658, 3019362, -18181670, -18286898, 11083163, -631897, -11330661, -19653770, 13920526, -10073846, -2887829, 19439558, -36078264, -9011378, -8042327, 16811038, 38653632, 1810329, -10536092, 10860899, --5412733, -16538845, -24306294, -18519362, 19733228, -16807280, 7743289, 18775450, 7792682, 11922829, --23223962, 32455458, 20244328, 17523466, -13627931, 23136988, -3016141, 15157476, 9772124, 3044595, -8012799, 10992969, 6466610, -4281546, -6365679, -5701569, 1834488, -16298327, -19214610, 9989557, -4043175, 5562520, -15964393, 3624416, 4015258, 10903311, 16433619, 25143276, -15285789, 3241627, -35876936, 7206419, 3107946, 2798708, -8429947, 1894618, 35567160, 9735080, 22650046, 5821292, --26351772, -11527692, -19548006, 51921324, 20329154, -21652004, -14114336, -19548006, 1720134, -13396003, --30251602, 5052492, -23347442, 30703648, -3887482, -28841242, 33724084, 26395796, 2516314, -10481331, -3589519, -19653770, 21769042, -25654376, 9453223, -4006668, 24412594, -52680460, -36208720, 20001662, -9419937, 6826851, 17084844, -18429704, -23560044, -13435731, -19446002, 10083509, -20809654, 5250061, -13291313, 21589190, 467078, 17949742, 10658498, 2286533, -6181532, -20395190, -13993540, 10572599, --24086714, 11327439, 2713883, 19509888, 15498926, -8542153, -29826938, -20316270, -1780264, -2455648, --7813083, 19406272, -35910760, -3817152, 1430224, -38784092, -500901, -5733782, -2720862, 2916820, -22448184, -22682796, -58875412, 20942260, 24678346, 13168907, 46857556, -39365524, -4192425, 24369108, -20465520, -25284472, -10177462, -8031589, 37507412, 5675263, 36011152, -51874080, 8757975, -61641908, --34314640, -36467492, 43143484, 11381663, -24443732, 22612466, 5265093, -24522116, 26060788, -33004140, -18403934, 45081052, 16787954, -16028281, -10353019, 6267968, -11237782, -13363254, -1387811, 20946018, --3405909, 3906273, -22000434, -4628901, 31005368, -22477712, 17293148, 40066676, 20384452, -1800665, --7326141, -13318694, -25314000, -19019726, 22495428, -12770012, 21153788, 14766634, 7543037, 761820, -8544837, -6644315, -32182726, -11595338, 23844048, 18214420, 19922742, -20978768, 36177584, -9528385, -14416595, -26728656, 24713242, 41128068, -7754027, -15233175, -904628, 1056025, -8584029, 8579197, -18843096, -34607236, 23070416, 21146272, -4591857, 24575266, 14079440, 10249939, -15192910, 2669322, -23287312, -48164300, -41529648, -18274012, 12016245, -22508312, -63534916, 26371100, 18426484, -8842264, --10205916, 179315, -3206730, -21945136, -58888296, -2376191, -1149441, 21820044, 28942174, 588411, --32752884, 43236900, -12222403, -30290256, 27023398, -4417911, -16508781, 20859582, 5535139, -4460861, -17585744, -24297704, 22884660, -8300561, 687732, -7144678, -6105296, -33867964, 13267154, -13012140, -5210869, -13672492, -1231582, -10244571, 9539659, -6083821, 36342404, 6253473, 23716810, -9499394, -5807333, 14847702, -6579890, 10161893, -2256469, 17927730, -1120987, -6449967, 28584618, -26103738, -14120242, 19283330, -11818139, 21832392, -13926968, -1058173, 11154030, -9280351, 25855704, 22826140, -4508642, 38326140, -24457154, -55904904, -9717900, -34971236, -23033910, 79471928, -2592013, 23533736, --4365835, -35304632, -1569811, 32258962, 47074988, 27271968, 47252156, -28194312, -9041980, -14494978, --29418916, 14117021, 25186226, -25196426, 31679142, -18055506, 4887136, 647466, 3818226, -23130010, --3109556, -20826834, -17288854, 844498, -6484864, -15474230, -5953362, 12776454, -13371844, 11870216, --6046777, 34283504, -14949707, 10905459, 2530810, -7330973, -26307212, -8826158, 20913270, 4737349, --6193343, 27859306, -19320374, -18859202, -2244121, 26747446, -22766012, -2012192, 5042292, 8232379, --25406880, 9149891, 9479530, -7832947, -26580478, 1983201, -20522428, 10483478, 5292474, 9727564, --40855876, -15928960, 24145770, 65531000, -28259274, -1995549, 5721434, -8625368, -17352204, 1920924, -53852448, 14709189, -4702453, -2014340, -13277355, -361314, -9905268, 23835994, 2042794, -9590125, --13058311, 4814122, 10789495, -16441672, 18015240, 10768020, 19731616, 8785356, 24208046, -39771936, -54405424, 8107288, 12904766, 13585518, -11740293, -13606456, 1178969, -4809290, 8300561, 18407692, --24201066, 8943733, -4591320, 7184944, 6695854, 4940286, 14808510, 11822971, -9960029, 10712185, -9298604, -7844221, -14211510, 5301601, -4639639, -11536282, 7997766, 6840809, -421444, -7251516, -844498, -5057324, -2238752, 1392106, 3810173, 6492917, -10494753, -796180, 9493488, -3097745, -8578660, 2416456, 6352794, 12581033, 4044786, -10984379, 1836099, 12096239, -5737540, 404801, -5976984, -17924510, -577136, -3625489, -17092896, 25527674, -5652177, 135291, 15046881, 3704409, --10359461, 5596343, -9892383, -714575, 8569533, -8256001, -3053185, 19728396, -18737332, 3947075, -2107755, 8807367, -8213588, 8681740, -2601677, 10290205, -3661997, 12674985, -53131968, -108212240, --13854491, 67985040, 52344912, 150028032, 72284296, -34963720, -30429844, -71128416, -124426280, -15766288, --48140676, -15018427, 88115016, 56022480, 60028612, 114415784, -3816615, -25409026, -42969000, -113292112, --62266824, -20202990, -20795694, 3040300, 51791936, 39788576, 42639900, 79759152, 47040628, -29529510, -42902428, -44923212, -104092288, 13175886, -69734160, -97704064, 38394324, -8592619, -17680232, 119651344, -39683888, 31613644, 103768560, -11369315, -19867982, 31153008, -68764576, -86369104, -22625350, -74026448, --65298536, 13583371, 14863271, 29368986, 90790776, 79415552, 49054968, 56803088, 11821361, -45678588, --47828756, -60763588, -81847048, -39247412, -19972134, -28785944, 26220776, 79008072, 53544820, 50583976, -44249436, -30819612, 2747705, 6346351, -50838456, -14061723, -7513509, 0, 0, 0, -0, 0, 0, }, -{ -5649493, -661962, -4917201, -1250372, -1280437, -550293, -1284195, 2446521, 5765994, 878858, 4686346, -1743757, -1127429, -2554969, 2191507, -775778, 4634270, 3273302, -1581622, -2910914, -3406983, -1711545, -1139777, 398358, -2471217, -1035624, -631360, 1984275, -2419140, 1961726, -776852, --2707977, 3482145, 3521336, 576063, 1317481, 699543, -690416, -2273112, -7385197, 2042794, --2382633, 2250026, -2359011, -2858838, 2126546, -2518998, 1229434, 1348620, -5202279, 216359, -781147, 1294396, -2047089, 2754685, -2732673, -1758789, -915902, -1242856, 1814624, -301721, -876710, 1561221, 2297271, -404801, -2460480, -2486786, 162135, -5215164, -2262374, -481573, -4718022, 1422708, 1893544, 1471563, 2643016, -1112933, 2631741, 4597226, -3535832, -3068217, --4711043, 4155918, 2042794, 307627, 6177237, -683974, -135828, -1968169, -1600949, 1291711, --1725503, -3311420, 1770063, 464930, 5149129, 7052873, -1911261, -4251481, -5217312, -390305, --3008625, -2909304, -2009508, -464393, -4168803, 3888019, -1532230, -1623498, -2778844, -2076617, -696858, 4371740, -525597, -1359894, 1280437, -4447439, 3213173, -2806761, -9860708, 4773320, -3162707, 5308043, 5530844, 972810, 2878702, -3020973, 759672, 4138738, 257698, -161598, --1097364, -682363, 2197413, -2198487, -1576253, -35433, 2076080, -1953673, -2331094, -3453691, -4088809, 1460826, 401043, -1261110, -4330938, -435939, 2967286, 1578401, -829466, -1297617, -2745558, -1151051, -14701136, 7648800, -734976, 202937, 2653753, 3738769, -5483063, -712965, --992674, 3104188, 1177895, -3368328, 10437844, -1141388, -656593, 4625143, 3807489, 1222992, -2639794, 8501351, -4229469, 239981, -2159832, 824634, -2632815, 181999, 258772, 925565, --4742181, 372052, -1144609, -1818919, -210990, 2935610, -1648731, 2724083, 4019016, -6995428, -927176, -2874944, -779000, -4332549, 2122788, -2597382, -448824, -1496259, -4362076, 1593433, --2934000, 1909650, 1070521, -2230699, -3187940, 13959, 2911988, 2115808, 5309117, 2363843, --2347737, -6675453, -487479, 1026497, 8213588, -2711198, -1328756, -257698, -1704565, -4502737, --2178622, -4238059, -709207, 3059091, -1001801, 3621194, 2133525, 1560684, 1803886, -2474438, -11052025, 5917391, -1407139, -3996467, 6468221, -6846715, -864899, 4306779, -2627983, -1815161, --2753074, 7401840, -2161442, 2506114, 929324, 2479807, 10012643, -9402757, 3232500, 5186173, --2898029, -8678518, -4346507, -297427, 911070, -957778, -1276142, 4089346, 5836861, -131533, --3525631, 615254, -4558034, 1790465, -2721399, 2063732, 6231461, 2473901, -5499706, 175020, -751082, 9099425, 2039573, 4724464, -851477, 2286533, 1957431, -10253161, 605054, 5370857, -2774012, 5970005, -4508642, -2695629, -4469451, 1710471, 3680250, -639413, 1611150, 654983, --1926293, 1333051, -1271310, 2087354, 2236067, 47782, 3296388, 959925, 398358, 1591822, -7204808, 1635309, 4384625, 4638565, 22447646, -5383742, -1750736, -3020436, 4835060, 3363496, -7830799, 3337190, -817654, 3963181, 126165, 4396973, 1839320, 5976984, 386547, 5080947, -6384469, -6415071, 1468879, 2142115, 1374390, 1461900, 1749125, -3642132, 210990, -4248260, --461709, 241592, -7681549, -4939750, 2161979, 388158, -99858, 3566434, 3240553, -1168231, --6644315, 2479807, 6263136, 4483409, 5835787, -1082869, 3194382, 6132677, -9353902, 3466576, -4223564, -4187593, 5893232, -3581466, -826781, 1073205, 1155883, -2638184, 2741800, -313533, --1116155, -2744484, -2755759, 3812320, 3167539, 2035278, 3073586, 5605469, 2545842, 7590281, --1748589, -7269769, 7281044, 1890859, 3304977, 2277407, -1858647, 2762738, 728534, 1277753, -4260071, 9385040, -11660299, 7050726, 1185948, 7218767, 1392643, -4774393, 1045825, 5435281, --7412040, -1974611, 462246, -8448201, -1905892, -6620155, -4062502, -4974646, -5193689, 1540283, --7891466, -5265630, -6334003, -2106145, 5579163, 1531693, -7534983, -3428458, -7854959, -2491081, -1438277, 10311143, -9015136, 2970507, -2433636, -3887482, -6738804, -370441, 962610, 6314139, -3547106, 165893, -6069863, -11071352, -248571, 2269353, 8042863, 2046015, 2554969, -6810208, -2167348, 4250944, 402653, -72478, -3168612, -4078608, -993211, 2032593, 654983, -3025805, -237297, -7602092, -709207, -6607807, 3812857, -2261837, 3900904, -6596533, -4102768, -8709657, --206695, -6098854, -1194538, 577673, -6053757, -4538707, 2715493, 2735357, -4769561, -27430346, -4311611, 3038689, -7995082, -1832340, -142271, 205622, -1627256, -2684892, -2143189, -8180302, -6125697, -3984119, 727460, -6808597, -2548526, 9757629, 8723615, -5653788, -3552475, 264141, --319975, -4630512, -5555540, -3823058, 464930, 422517, -18790, -545461, 2094870, -6653978, -1888712, 253940, -11971684, -1380832, -3729642, 5422396, 7649874, 1276679, -1603097, 431644, --7122667, -8575976, 4402342, 8617852, 9283035, -2488934, 1497333, 5637682, 5486821, -2875481, -5040144, 8711267, -608275, 7354595, 5897527, -7115150, 2117956, 531502, 7525320, -4649302, --5318244, 4592394, 5659157, -1701344, 310311, -8412230, 5798206, -4677757, 6165426, -10530723, -1040993, 2530810, 5027259, 296890, -4336307, -8930311, -10832444, 3515968, -9597104, 11605539, -11164231, 103616, -15663746, 6142877, 651224, -3131568, 10430865, -209917, -9416179, -1237488, -11365557, -14788109, 248034, -3899830, -11673184, -3457449, 3758, -2529199, -6073621, 3105261, --5062693, 3675418, -4338991, -8050916, 3948686, -868120, 5761162, -11857331, 4534949, 8806294, --3841312, 448287, 8971650, 13075491, -3733400, -3041911, -11446625, 345208, -9469866, -1079111, --6638946, -3221, 747861, 5075041, 2436320, 4603131, -3715684, 564788, 2916820, -937914, -12210055, -8556649, -4182225, 15880105, 16193637, -3598646, -1147293, -10630044, -5343476, 120796, --2937221, -7191386, 9779104, 2611877, -2622615, 14022531, 2783676, -7394860, -156229, -13743358, --6533182, -7968238, 13070122, -3550864, -193810, 8971650, -2198487, 5270462, -2961917, -11546483, --768262, -70867, -2375654, -6887517, -7595113, 3848828, -6012954, 10509785, -3264712, -7820062, -6575058, 13200045, -3301756, 3599720, -3568581, 7553774, 190052, -16353625, 5793911, 8828305, -927713, -2877628, -9383430, 7704635, 5325760, 4878546, 1081258, 2983929, 10620917, -7700877, -1374390, 1813013, -5823439, -11661910, 10910291, 5738613, 20254528, -1347009, 8976482, -3310346, --6269579, 707596, -915902, -687195, -1727651, -7012608, 14576045, -137439, 1212255, 1535451, --1943473, 11360725, 1591285, 9360881, 4239670, 985695, 10736881, -5815386, -11924977, -3244848, -2228551, 537408, -4980552, 4670777, -3659849, -18155364, 1220845, 1617592, -9954124, 11162620, --17095580, 3428995, 8421894, 12290049, -11819213, -1237488, 8891656, 6377490, 7662222, 1810329, -15593953, 3347390, 6767795, -1316944, 1407676, 6782290, 3925063, 7747584, 1081795, -9396852, --14034343, 8292508, 4243965, -2184528, 2219424, 4930623, -13101798, 726386, -8081518, 4625680, -38118, 9536975, -2354716, 4611185, -1556926, 2947421, 1723356, 270046, 5524939, 7366406, -2903398, 4558571, -10162429, 5104569, -1379758, -17884780, -11855720, 3896609, -13081397, -183073, -11718281, -7410966, 22788022, 8866423, -3997541, 12940200, 1057636, -3081639, -8509404, -7984881, --11893301, -941135, 7721815, -7805030, -616328, 9170829, 4153770, 5783174, 16828756, 3408594, -11193759, 1674500, 2667712, -15646566, 5601174, 3483219, -9258339, -329639, 5708012, -125091, -3974992, -9458055, 7230578, -607201, 2027761, 6799470, -12831215, -8759586, 2181307, -183610, -6836514, 14387067, -1490891, 3587908, 15289547, -5740224, -10662256, -597537, 11125576, -2447058, --13261785, 1055488, 4582193, -2554969, -4335233, -950262, 16491064, -3184718, 14136348, 10907606, -12849468, 728534, 734439, 7690676, 2215666, -2677375, 2319819, -10437844, 7435662, 13164075, -7820599, 1099512, 6868190, -5829881, 5122822, -5688148, 7694434, -7531225, -473520, -695248, --1248225, 23329188, -4234838, -1469953, -2831457, 3063386, 5606543, 12107513, 13157095, -8007430, -2337536, 13662291, -9029632, -10242960, 4578435, -4852776, 4577362, 26015690, -14399415, 760209, -350577, -8509404, -1814087, -9332964, -14591078, -11262478, -15183783, -5968931, 1377611, 11711302, -8530342, 2994666, 12244415, 3582003, 7344394, 6879464, -3748433, 10722923, 11456825, 8179229, --16304770, -9082245, -9608916, 3340948, -6755447, 318901, 4138201, -4743792, -11662984, 7179575, --5760625, 2499134, 1978906, 11406359, -12421582, 18552112, -18848464, 18968186, -526670, 9511742, --9724343, 3346853, -21062520, -11434277, -10531797, 9081708, 3617436, 13174275, -1880122, 15032, --7260106, -16388521, 10136660, -8891119, -5316633, 7961259, 18015240, 18226768, 7783555, -1030255, --12957379, 7398081, -19542102, -1231582, -11458436, 6311992, 19444390, -19166828, 6231461, 9349607, --12996571, -857383, -2989834, 7133941, -8939438, -11251741, 1498407, -4706748, -16996796, -14662481, --16968342, -5482526, 9286793, -13189308, 7067369, -17746804, -4035122, -7394860, -6967511, -14240501, --2250026, -5878200, -9078487, 5516886, -10006737, 8724152, 927713, 6635725, -12901545, -22896470, --2962454, 3711926, -10377715, -7580081, 2443837, 2071248, -11977053, -5913096, 14163728, 6686727, --3240016, 7650411, 20824686, 49929, 1540820, 1545651, -2954401, -1056025, 1948841, 2283312, --18281528, -6811818, -22072374, -7169374, -20707112, -9700721, -369904, 22009560, 9076877, -11699491, --14618995, 7925289, 16281147, 10823318, -9574019, 13266080, -6860674, -1373316, -25659208, -7395397, --4891968, -3152506, -18272938, -26332982, 6386617, -46708, -21360482, 5058935, 27655294, 4296041, -758599, -18272402, -4772783, 938987, 292058, -18730352, 12074227, -18465138, -3807489, 4240207, --8869644, 20973400, -17463338, -18152680, -14599131, 20226074, 9164923, -12097312, -10630581, -7403450, --2151779, -6726993, -6508486, 672699, 7758859, 19837918, -2087891, 8212515, 7669738, 6857452, --13289166, -17294760, -11871826, 13630616, -2196876, 16632798, 5978058, -2465311, -23163296, -19742354, --1641751, 912681, -13244069, -9203578, -5993627, -7265474, -30353608, -7469485, -7049115, -11924977, --4926328, -8138963, -13583371, 8997420, 19801946, 9680856, 1168231, 10281078, 15112916, -6278706, -5313949, 2452963, 2227478, -1906429, -2806224, 8710194, 5022965, 15443092, -2910914, 8053, -7194607, 31586264, 882616, 15721191, 23930484, -4278325, -17892296, -1008780, 21613886, -418759, --13877039, -19387482, -14272176, 20463372, 15347529, -30067456, 11651709, 14211510, -3930432, 10749766, -31708670, 4045859, 8332237, -8941048, 8618926, -9542880, -5439039, -4359392, 3877819, 9294309, -12502650, -2147, 6154152, -1727651, -135828, -4263829, 9686225, 29935386, -7536594, -7615514, -11935714, 8717710, 2799245, -19114752, 15178951, -14928233, 11260331, 13386339, 3155190, 4547297, --1546188, 21072184, 16676284, 1714766, 11868068, -6271189, 14497662, 3651259, 16156593, 22243636, -1575716, 6812892, -615791, -6049462, 1610076, 10605885, 12365748, -18156438, -9737228, 6258841, -23818814, -8749922, 16696148, 11232950, 5328981, -21292300, 5492727, 5379984, -24601572, 18064632, --12301860, -16285979, -31422518, 10622528, 24793772, -7137699, -15175193, 6852084, 28440736, 18253612, -7455527, 21554294, 15493558, -5696201, -42977592, 4807142, 20947630, 10009421, 4219269, -18839338, --563178, -13022341, 2518462, -1332514, 3017752, 6359236, 8386461, 3782793, -23757612, 13420162, --3845606, 4091493, 16941498, 6833293, 2597382, -6218039, 21098490, -660888, 20927766, -26222386, --8562017, 8575439, -16214575, -13079786, 35970, -3245922, -12961674, 1658394, 18192408, -361314, -244813, -9772124, -22034792, -13027173, -7114077, 9046275, -3484829, 2411087, -11538967, -10794327, --6785512, 17117592, -12814035, 10075456, 5047661, 5905043, 388158, -16723529, -26134340, -1451162, -14850923, -19859928, 8183524, -17001628, 9251360, -17904644, -2788508, -17643188, 23928874, -23029078, --16152298, 6645388, 2102923, 12294344, 7648263, -5876052, -4972499, 7158637, -35811436, -4606890, -11433203, 3208341, -8112657, -12432320, 1755031, -11791296, -591632, -18504330, 18400714, -6584185, -11733851, -24221468, -13479218, 38655, 30941482, -24295556, -1569811, -18894098, -14878304, -4169340, -19628538, -3860102, 9060234, 9468792, -9470940, -20999706, 31038118, 13812078, -16736414, 3956739, -2907693, 8980777, -16230681, 15778099, -630823, -31173410, 4096862, 6987375, 8959302, -25700548, --5516886, 3970697, 24022826, 5079336, 13784698, -33298344, -19758460, 11118060, 942208, 22886270, --4949950, -3015604, 2747705, 12017855, 11439645, 4704063, -42013908, 12949326, -3755949, 10676752, -24401320, -6489696, -553514, -25526602, 10179072, 12657805, -12017318, -7534447, 25885232, 38136088, -12220793, 6192806, -7803419, -31644246, -20854750, -7474854, -773094, -18214956, 13661217, -37307696, -1345935, -23070416, 11297375, -8825621, -25598006, -2655364, -7217693, -9286256, -29088202, -21328270, -5553393, 22179212, -15595026, 27483496, -24186572, -16021839, 4678830, -2711735, 12252468, -8280697, --8691403, -11900281, -3616363, -39505648, -11650636, 789737, -2073932, -6853694, -15770583, 11983496, --13981729, 20618528, -6808060, -2876018, -15136538, -13897440, -26222922, -11505681, 9310952, 3760781, --1803349, 1557463, -9535364, -7150584, -12200928, -10155450, 5141613, 7682623, 3511673, -22490596, -25698400, 3583077, -11210402, 20781736, 14763950, 24820080, -4596152, 14681272, -33538862, -17748952, --31607738, 32980516, -10158135, -21795348, -21348134, -45093400, -18815714, 33240900, -1534914, -14906758, -7975218, 39975408, 51306068, -5216238, -23150410, -5790153, -8883603, -23505820, 9761924, 265751, --16958678, 48888004, 16933446, -12094628, -34322696, -3501472, 8110509, 8531416, 9898826, 23094040, --6877854, -12160663, 10997801, -43294880, -28639378, -11720966, -3111167, 4016868, -22863722, -21457656, -21988622, 16874390, -13445932, -26531086, 16451872, -186294, 29020020, -24286430, -5365488, -8766028, --1401770, -19396072, -27707908, 22571664, -17139604, -11685532, -21133386, -5577552, 14140106, 12327093, --8442832, 976031, 2593087, 16709570, 27099096, 18934900, -34444564, -17561048, -20396262, -6102612, -11886322, 3331284, -23570244, -34959960, 28814398, 849330, -28289338, -47790636, 23449984, -6961605, -12355010, 11056320, 11768210, 1340567, 7939784, -17758616, -9484898, 4880157, 18388902, 22695144, --27498528, -23041426, 66575216, -5064840, -6174016, -9669045, -20603494, -2006824, 24234890, 38694436, --17361868, -10417443, -3555696, -17210470, -3998615, -9584220, 15636902, -15524159, 17858474, 8613020, --5611912, -21754546, -1212791, -8791261, 33493228, -17879412, -10737, 354335, -2846490, 15271830, --9061844, -929860, 7366406, -4196720, -31791884, 16824460, -14207215, -16697222, -3375844, -17811766, --9995463, -32654100, 32244466, 1899986, -20447802, -38268696, 23223962, -22334366, -21625160, 875100, --16654809, 8474507, 15078020, 44776644, -11723650, 18045306, -2858838, -20422032, -17208324, -4271882, -67260264, -57307212, -3272765, 62278100, -54654532, -19481434, 32498406, -2608119, -24012626, 61428232, --27926414, -8799314, 32470490, -38736848, 37004364, -4942434, -21082384, 20439750, 7950522, -2398739, -5228049, 3800509, -3110093, 8212515, -6503654, -8791261, -3333968, -12631499, -10304163, -24769614, --8713952, 23570780, 22315576, -31069256, 12064563, 18393198, 15641197, -4292820, -30602716, -1610076, --14477261, -36048736, 24887188, 61125976, -32974612, -2383707, 43885440, -10710575, -13744432, 35905388, -27074936, 14064407, -12444668, -26361972, 10801843, -9842454, -16012175, 64085744, 47651052, -36160404, --26116086, 35416836, -59885264, -19991462, -15644955, -8875550, 44969920, 30479772, 20822538, 22611392, --70308616, -23236846, 71208408, 42119672, 10552735, -16117939, 26330298, -21817360, -46394236, -30084636, -27100170, -14926622, -336618, 31337692, 55737400, -1968169, -23890756, 9678172, 27738510, -60724932, -27099634, 878858, -5710159, 31989990, -4772246, -23130010, 12492986, 11455752, 31281320, 17993766, --16042777, 1487132, 5315022, 21641804, 5446019, -23619636, -367220, -777926, 5506148, -21918292, --24009404, 36230196, -12268037, -36610840, 19719806, 33689724, -18034030, -5683853, 2732673, 23313620, --26477400, -34844532, 10304163, 30663920, -5944235, -12095702, -6859600, -6605660, 13597330, 6281927, -8340827, 76328008, 4716411, -8895951, 1564979, 3163780, 41350336, 2110977, -13995151, 10050760, --31409632, -17850420, 8764418, 1101659, 35554812, 28849296, -17583060, -4217121, -16628503, 1951526, -12955769, 4433480, 4227859, 13951128, -8781061, -35633196, 9623411, 26826366, -11825119, 24178518, --34562140, 18680960, 9935870, -26993332, 4298189, 4563403, -11828877, 19072876, -41609108, -132249024, --156103808, -15899432, -108874200, 39936216, 258542528, 138103056, 209625536, 220959968, -26219164, -66328792, -17098264, -164495104, -200507856, -63406604, -220512752, -177529248, 42584064, -128276176, -36294084, 249559072, -89212376, 175844016, 305456992, 180872880, 79977656, 60243360, 19978040, -138905152, -172205632, -58226872, --234518096, -234904640, 28994788, -176140368, -144628736, 84031032, -148201072, -152600192, 112219976, 44402984, --22305912, 266836656, 250093792, 158907888, 339659968, 319740448, 108533824, 126389616, 98557152, -163208224, --163197488, -206366736, -406961024, -480461888, -345406112, -344069824, -253527088, 8209830, 23448374, 167160672, -289638112, 356904256, 325891904, 378216416, 325039360, 193135552, 131750272, 47417512, -57416732, -134692864, --192677600, -159542464, -232629392, -248321056, -149541104, -71778568, -35441532, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ --207769, -2129230, 2378338, 6924561, -845035, 1109712, 818191, -422517, 3914863, 2948495, -5400922, --3054796, -4917201, -2898566, -550830, -3492345, 56371, 377957, 250182, -486942, -312459, --4798016, -762894, 1109175, 1853278, -2304787, 2971581, 912144, -2384244, -1576790, 545461, -2966749, -988379, -1027571, -1480153, -3993783, 802085, -5181878, -431644, -2572149, -2367064, --1709397, 1088774, -1753420, -2943126, -2068027, -301721, -1503239, -4112431, -1752347, -1159104, --1043140, -3055332, 427886, -1483374, 3561602, 711354, -4119411, -2372433, 5035849, -1497870, -1408212, -2736431, 1346472, 2304250, 2122251, -3716757, 1923072, 2672544, 1945620, -186831, --2221572, -1426466, -2022393, 1388348, -625992, 1056562, -9175124, -10882910, 5218922, 67109, -8002598, 2720862, 3404835, 2065342, 3117610, -373662, -333934, -2141041, -5625334, -3409667, -1220308, -565862, -1209570, -944356, 2666101, 1928440, -171799, 2277943, -2623151, -6467147, -1763084, -1758252, 498216, -3469260, 2273648, -2908230, -1466195, -1364189, 4228932, -1396938, --222801, -2204929, -675384, -5349919, 1512365, -1225139, 2527588, -2757906, 162135, -1519882, --4145717, 855235, -543850, -1503239, 1636919, 2849711, -816581, -2461016, -5972689, 71404, --3598109, 1136556, -61740, -2742337, -205085, -1475858, -925029, -4744328, 2622615, -4289599, -1965484, -2049773, -2591476, -2734284, -4584878, 1826972, 128312, 539555, 2581275, -3627637, --4775467, 2138357, -15545097, 0, -1905355, 4300336, 266288, 1751273, -1105417, 2211908, -601832, 1949915, -1610613, 10295037, -1991791, -1286880, -4134443, 1597191, -5031018, -1555852, -632434, -2428804, 211527, 3848291, 2388539, 1535451, 2773475, 3733400, -4129074, -1568737, -198105, 2407329, -3860639, 4155918, -3171833, -1653026, 3561602, -518080, 1078574, -2487323, -3339337, 3227668, 3721589, -5082557, -1207423, 5670431, 312459, -761283, -848793, 6167573, -4393215, 4786204, 526670, -1030792, -944893, -266288, 360777, 758062, 2336999, -5823439, -12348, -2680060, -2902324, -394063, 1618666, -2993055, 1475858, -2271501, -143881, -876173, -702227, 2115808, 2738579, -969052, 253403, -1190780, -3687766, -844498, 5527623, 6513318, --4220342, 752693, -3573950, 5986111, 1245004, -2208150, -3219078, -2815351, -450435, 928787, -1716376, 7911330, -4410395, -531502, -1643899, 3224984, -8437463, -804233, 5675263, 55835, -4799089, 2253784, 3886946, 4070555, 1861868, -532576, -3857954, 1561758, -941135, 745714, -6620692, 1858647, 5712844, -2651606, -1304060, 673773, -7209103, 1130113, 5757941, -1358283, -739271, -4355634, 3732327, 214748, 1794760, -5182952, 3479997, -3366718, -1793149, -3514894, --4246649, 2961380, 1178969, -1090922, -2003065, -1791001, -1275068, -666257, 2924336, -2073932, --4198868, -6573448, 6988449, 5587753, 761283, -6452115, 2707440, -2669322, 3432216, -1425392, -1270774, -3233574, -1790465, -4048544, -1263794, 2767570, 26732414, -9929428, 11976516, -9518184, -816581, 2838437, 2811056, -7860864, -2667175, -2645700, -13152800, -80531, 695785, -4751308, --767189, -70330, 9403831, 1722819, -6560563, 4771172, 5228049, 1145683, 9532143, -7114077, --2596845, -3817152, 2010045, 7604240, -558346, 444529, 2836289, -1407676, 3406446, 1494649, -8718247, -1369558, 3411278, -5774584, 5205501, -4067871, 5811091, -177704, -6103149, -996432, -8780524, -480499, 5933498, 3470871, 5703180, 395674, -4553739, -3812857, 68183, -2881923, -4669167, 2956011, -4684736, 461172, -3672197, 5999533, -1730335, 4745402, 5893232, 775778, -6069863, -588411, -3033858, -1367410, -3859028, -252866, 7962333, -5571110, -5273683, -2634426, -2152316, -2723546, -22313428, 2387465, -6603512, -4740034, -7236483, -8768713, 3393024, 7741142, --1218697, 2976949, 1191853, 3947612, 866510, 237834, 2376191, -4828080, 11023570, -632434, --6477348, 7202660, -2255395, 3023657, -7293928, -4575751, -5177046, 2168422, 1320166, 5622112, -142271, -3588982, 565325, -3211025, -3491809, -3903052, -1361505, -5410585, -2736431, 4929012, --4664872, -386547, -3652870, -5735929, -2549600, 655519, 1802276, 3550864, -2876554, -2675228, -3548180, 571231, 1327145, 897648, 2192581, 3297461, -5449777, -1862942, -566399, -7657927, -2003602, -570157, 4443144, -4494684, -3436511, -4195110, 687732, 4716411, 3613678, 8340290, -5531918, -5133560, 1999307, -2292439, 3800509, 2547453, -5811091, -28714004, 7418483, -8818642, --7410966, -5429913, 587874, -1837172, 16330539, 1283122, 3624953, -2223183, -308701, -7221988, -6437619, 1627256, -1370632, 1005559, 8513699, -4820027, -1923609, 1687922, 228170, 4097936, --4278861, -2117956, 4511327, 1429687, 4120484, 165356, -5203353, -3521336, 2295660, -850940, --2044941, -3384434, -2151242, -591095, 8003672, 1729261, -1957968, -229781, 184147, -2972654, -5628555, 4225711, -1900523, -6815040, 1137093, -3824132, 5311264, 4029753, -4980552, 1283122, --6317360, -5690832, -5065914, -6249715, -2488397, 726923, -3966939, -283468, -4337917, -3832722, -6116034, 3585224, -6193343, -8319889, 288300, 5710696, -5590974, -4590247, 4879083, 3294240, -5625871, -15015743, -1568737, 2431488, 7168301, -1492501, -3900367, 1627793, 10570451, -13507672, -3012920, -2792803, -2600066, -6110665, 3527242, -10825465, -7121056, 3650185, -5743982, 3358665, -15226196, -2756832, 6083285, -7252053, 7288560, -1956895, 2087891, -6497212, 2898029, 1817845, --3593277, 1511292, -825707, -3336116, -348966, 4212826, 6477348, -5166309, -8376797, -6524056, --6183143, 804233, 4715874, 12857521, -273267, 8675297, 8899172, -8352638, 6332393, -12296491, --4635344, 842887, -5609764, -5049271, 3311957, -11878806, -2471217, 8409546, -3691525, -3029563, -1003949, -3543348, 3315178, -3503620, 5759015, 7670812, -2153389, 2487323, 261456, -7475391, -618475, -4767414, -3433290, -5835250, 3400004, 2873333, -5888937, 1001264, 3106872, 35542464, --1558536, -13825500, -1609002, -438087, 1476395, 4640712, 1945083, -1430761, -1335198, -6849399, --3229279, 4154844, 8744017, -6873559, -4368519, 5989869, 547071, -1853278, 2379412, -333397, --8146479, -8114804, 11408507, -816044, -694711, -1650341, 5852967, -198105, 615254, 3977140, --6243809, 6871411, 2712809, 1347546, 2468533, 6878390, -15955267, -6828461, -3961034, 14918569, -1766305, 1384053, -4656819, -4673462, 4199941, -363998, 4864051, -1509681, -10401337, 1388885, -945430, -1235340, 4589173, 2516851, 926639, 8413841, 19313932, -1266479, -2208150, 7825431, -1663226, -2049236, 4441533, 15663746, -2593624, 3202972, 4537096, 4709969, 2744484, 4278861, -2999498, 3644280, -6125697, 6131066, 8011188, -2915746, 6999186, 7818451, -10280541, -3066070, --8758512, 8397735, 15787226, -7750806, -1968169, -8868034, -3993783, -10700911, 7370164, -6561637, --2833068, -763967, -132607, -4291209, -5412733, 9462887, -8868571, -3245922, 755377, 6455873, -6697465, -9997073, -3179350, 3807489, -8829379, 4854387, -7066832, -2774012, 2227478, 207232, --4007205, -1017370, 1750736, 11161546, 1068910, 2554432, -315680, -9466645, 10070625, -5037460, --8139500, 6318434, -5912023, -6199786, 7832410, -3604015, 671089, -1694365, 709743, 10908680, --2250026, 2565169, -9842991, -573378, 10530186, 2637647, 10412074, 9507447, -3535295, -2157684, --13131863, 2187212, -2635499, 8649527, 9739375, -5610301, 2011118, -18250926, -5636071, 6489696, --6970732, 9936407, 6554657, -7991861, 2947421, -7468948, -663572, -10144713, 17063368, -4840428, -1328219, -5206574, -15220827, 9002788, 3303367, -11382737, 7318625, -5070209, -3607236, 4126390, -16201154, -7880728, 15665356, -210453, -10626823, 544387, 3845070, -9469329, 10788421, -5454609, -8060580, 17041894, 1922535, -7861938, -1946157, -845035, 4173098, -6688875, -3389266, -862752, -8669928, -2945274, -3042984, -11074573, -47245, -13106630, -2077154, 14905147, -2979634, 8490077, -1181653, 2268817, -19110456, 268972, -12064563, 10048613, 17920752, 5379984, 4860829, 1065152, -3119220, -10222022, 4129611, 5412733, -3962107, -1311039, -3393561, -2607582, 8577050, 136902, -10341208, 29250338, 11601780, 2914135, -8968429, -9295383, -4631586, 5975910, -7492034, -4449586, -29820494, -17353278, -1225139, -9020505, -16296180, -21516176, 4976257, -7442105, 5319854, -20413980, -3092377, 6185290, 5539434, -9048422, -18748606, -14991583, -12645457, -670015, -7661148, -13962402, --9773735, -5425618, -11453604, -8316131, 1061394, 12714714, -1084479, 1092532, -1209033, -12765717, -6623914, -1927367, 1444183, -3503083, -8587250, 5872831, -10522670, -14591078, 11643656, -14250701, -1989107, -952946, -19449760, -12057047, 6720550, -1153736, 8431558, -6815040, -20551418, -876710, -133144, 6669548, 7428146, 17894982, -11309186, -39182988, -13902809, -13827110, 8191577, -25728464, --8833137, -4819490, -23254026, -8241506, -617402, -4893042, -4442607, 4581657, -6213207, -845572, --5681168, 5296769, -13160317, 5131949, 11555610, -12300786, -17294760, 7419019, 9229348, -2547453, --2919504, -8489003, -9225590, 22854594, 8769249, -20735028, 7874286, -11188927, -463320, -10168335, --20941724, 6562710, -10560251, -4522064, 1629940, 797790, -4727149, -18136574, -10519449, 9080098, --10352482, -221191, -9018358, -15147276, -4985384, 16925392, 3689377, 3017752, -13697724, -4954245, --1938641, -1962800, 7114077, 7332583, 10725607, 11713986, -4526896, 6530498, 3627637, -6979322, -5552856, -11652783, -8558796, -8853538, 5228586, -10226854, 2063732, -15285789, -11490111, -7099581, -17311940, 11789148, 13677323, 12639015, -10032507, 15892990, 2638721, 7032472, 24696598, -5167383, --1741072, 3043521, -8236674, 3769371, -2281702, -14751065, 4893579, 10508174, -10067403, -10691247, -2306398, 10951093, -5041218, -8860518, -20164872, 22266722, -18059800, 23069344, 12751221, 8551280, -4647155, 8830990, 9633075, 8866423, 24823838, -9210557, 1400159, -2078227, -4727686, -1163936, -2741800, -2745558, 4461934, -2045478, 7491497, 6194417, -1814624, -4789963, -25516400, -9381282, --18624588, -1283658, 9192304, 9237938, 2662343, 4473746, 6812892, 5508296, 6581501, 17500918, -26382374, 17498234, 3171297, -3930432, -5654862, -8238821, 8902393, 9006546, 10219875, -8548596, --6801081, -10488310, -2171106, 12450036, -431644, 15014669, -10083509, 7707319, 4445291, 13339095, --30034170, -21813066, -9299678, -12625593, -12806519, 2759517, -5706401, 17566416, 4657355, -21640192, --2609193, 32263258, -12252468, 9167608, -6157373, 12302397, -7639136, -5838471, -862752, -14925548, --7694971, 11576547, 4799626, 8429947, 22657026, 1550483, 14985141, 22151830, 15215459, -10634339, --23426362, -1187022, -11013370, 24349780, 6649146, 18939732, -3248606, -10766946, -4312684, -11706470, -3968013, -9092446, 545998, -10077067, 4536023, -7458211, -3499862, -15938087, -15957414, -1888712, --22640384, 11757473, 7800198, -6955163, 10770704, -5718212, 3843459, 12283606, -14545980, -18626200, -2678449, -4294431, 30166240, 12790949, -34357592, -9372692, -10198937, -17653926, -19065896, -37921340, -5998996, -13702556, -4203699, 5242545, 686121, 7634305, -2203855, -4550518, -29310468, 3357591, --13754096, 3528316, 15960098, 3615826, 10399726, -16849156, -23488102, 4860293, 13065827, 9880035, -4239133, 9624485, 13442711, 19195820, 17467632, 40411884, 26544508, 37056440, 2005213, -7800735, --25876642, -7872138, 3805341, 5545877, -6529961, -20009178, -7585986, 32011464, 12881681, -4807679, -9396315, -1055488, -12416214, -3790309, -8303783, 21747030, -2261300, 988916, 8935143, 325881, -10197863, -407485, 14665703, -14363981, 16971026, 3281892, -8882529, -5248450, -9791989, 15629386, --22771916, -24082418, 14296872, 24618752, 380105, 16909824, 22813256, -26889716, 8000451, 5160403, --2356863, -522375, 3015067, -10272488, 17575544, -11550241, -9982041, 7202124, -139050, -2315524, --5459977, -5861557, 1467268, -17904644, -6548752, 13814762, -18710488, -4357781, -13181255, 51540, -33508262, -11446088, 529892, 8923868, -1731946, -8610873, -24067386, 20780662, 7484518, -45023068, -7757248, 9016747, -18375480, -43844636, 38738456, 23026394, 12186433, 8513699, 19065360, -44261784, -17963700, 20193326, 8574365, -28413894, 15556372, 28346784, 13068512, 31262530, 11311333, 312996, --1427540, -1230508, -5550709, 13070659, 22155588, 21008296, 7224672, -6857989, -11345156, 2312303, --10370199, -12215961, 12176232, 8152922, 2067490, -12318503, -11877732, -3034395, -10400263, 4571993, -25301652, -5173288, -8744553, 8006893, 4179003, 6876243, 8448738, -2784213, -5766531, 19739670, -13020730, 5739150, 8402567, -2794413, -21306796, 3492345, 12783970, 343061, -16253767, 18820010, -4226248, 26585848, -191126, 23439784, 1312649, -10829760, -4353486, 3249680, 34479460, -8033200, -10829223, 4770098, 14468134, 3712462, -3342022, -8158827, 6584185, 41151156, -5718212, -5542119, --27847494, 31870804, 143881, 28300076, 1284732, 2560874, -24501714, -7009924, -10718091, 19890530, -5432060, 9235253, 5605469, -18509162, 2430415, 2319819, -16411607, -23426362, -24256902, 9193914, --8726837, 23374286, 1753957, -6302328, -5412196, 5730023, -8306467, 2341831, 7014219, -8579734, -5714991, 8523363, 2959769, 3114925, 17403208, 29632054, -5284958, 751082, 14717779, 12793097, -17546552, -11784853, -4746476, 6232535, -16906066, 2726231, 1720134, -21715354, 29575682, -355409, -15006079, 13896367, 9133248, -16218333, 1774895, 15939161, -11946988, 27498528, 7315940, -8498667, -21841520, 17572322, 11471858, -35582732, -7515119, 8392366, -12618614, 2994129, -20613696, -4229469, --31238370, -8213051, -5055177, -8382166, -34825204, -4414690, -9382356, 37820408, 18111340, 16165720, -12542915, -5589900, 8589398, 19696184, 19024020, 9568650, -18556406, -21756156, 12586939, -1174137, -9645423, -2269353, 22216256, -12970264, -1155346, -3066070, 19609746, -11111617, 32894618, 40212168, -40741524, 4567161, -5270999, 8487929, -3126736, 11691975, 249108, 1990717, -9478993, -28932510, --8496519, -27608050, 18966038, 18323942, -16531866, -11526082, -16593069, -6376416, -843424, 42908872, -2277943, -18509698, -20512764, 890669, 30195768, 15817828, -55268712, -9413495, -8371965, 9697499, -23099944, -22582938, -6204617, -12605192, 8068096, -31694174, 18339510, -3613678, 704912, 11304891, -2772938, -14742475, 34609384, -1715303, 16966732, 37078988, 74048456, 44902272, -557809, 25115358, -37250788, 47551732, 50864224, 12671227, 27404038, 10897943, -5196911, -14398341, 20973400, -21842594, -41923712, -2866354, -5033702, 2497524, 33960844, -19430968, -1347009, 718333, 2880313, 13060996, --5669894, 18074832, 8338679, -1662152, 6506876, 3289408, 15744276, -38491496, -9743133, 37044, -7104950, -2752000, -26040924, 24925842, 1738388, 4297652, 11770895, -17965848, -5387500, -43039332, -14977088, -9489730, 11862163, 32789928, -5245229, 7350837, -461709, 15823196, -22429392, -34661996, -34678104, -2566243, 6729677, 5413807, 35171488, 22617834, 31266826, -511101, -31295280, 21123722, -14857902, -8835821, -7612293, 19857782, 1648731, 25055766, 48322140, 32212792, 11722576, 1731409, -37968584, -7631620, 16725140, 24136106, -9872519, 27827630, 26933740, 8189429, -11311333, -13280576, --16461536, -2871186, -1857573, -55399172, 12306155, -9322227, -2541010, 42928736, 18095234, -13602698, --10924249, -211527, -28372554, -34132640, 2332167, 348966, -19805168, 20484846, 1827509, -19545860, -11764989, 37260452, -5696201, -21083458, 12629351, -12250857, -14522895, 7293392, 29225104, -9359807, -3493419, 8752070, -10241350, -21839908, -15707232, 30346628, 9400073, -28599650, 23957864, 10600516, --21233782, -9649718, 40066676, -12502113, -32934346, -15271293, 53544820, -53066468, -26470420, 33317136, --15970836, -16139413, -53092240, 41636488, -34591128, 13315472, 104153, -4600447, -59955060, -15509127, -48132088, 33295660, -41248328, -8823473, -18971944, -5971079, 6105296, 13074417, 10922639, -66486092, -35508104, 31317828, 28064926, 2888903, 13547937, -31603980, -32279900, 59446104, 22142704, -45158896, -8211978, 57163868, 18069464, 6461779, 1851668, 4643934, 24647206, 33743412, -7360500, 6630893, -8881992, -5331665, 20360830, -10184441, -2622078, -7591892, 15670725, 11926587, -6116571, 11013907, --14971719, -11878269, 15606301, -9439801, 17118130, -10811506, -4882304, 179315, 9398462, -55835, -7010461, 3331821, 17372606, -11810623, -2392297, 869194, -6809134, 17262548, 14521821, -11361262, --4208531, -6737193, 3854733, -14797773, 8326331, 5402532, 7628399, -5502927, -4703526, 19670414, --22861038, -3249680, 9576166, -5473936, -4216048, 10674604, -28123982, 7535520, -10237055, 2469069, --10030896, 25077240, -7984344, -9614821, 9881109, -4596689, -15949361, 31830540, -848793, 4256313, --6781217, -10576894, -13658533, 17329120, -16597364, -5357435, 14087493, -43122008, -120503360, -99128384, -51227684, 14159433, 118231856, 211882544, 30799748, 66290136, 23603530, -170343232, -54419384, -115794464, --139828032, 3170760, 21411486, -58730456, 83249888, 109271488, 60945584, 174712288, 100379288, -23290534, --42439108, -82122992, -159248256, -125839320, -37679748, -112284944, -16345572, 95580736, 15283641, 21722334, -144758656, 73570640, 45144400, 151080304, 22599582, -42555608, 58552216, -80128520, -158189008, -66517232, --133572944, -166848736, -3173981, -35321812, -44481904, 110115448, 121291488, 77071040, 183387056, 147987392, -69406672, 62867048, 36066452, -123453464, -113726440, -143680080, -189709248, -152004256, -64444912, -44166760, -3559991, 108737832, 132098696, 138666784, 132798240, 123593592, 26701812, 3552475, -19709604, -91211144, --99941744, -53811108, -97657896, -22536768, 11902965, 1081258, 0, 0, 0, 0, -0, 0, 0, }, -{ --713501, -1232656, 3558381, 4639639, 60666, -2546379, 3241627, 1820529, 3834869, 4727686, -1896765, --543850, -3818226, 2133525, 667331, -1609002, -4565014, 1530082, 2323577, 3124589, 180389, --4326643, -2462627, 2504503, -2974265, 2615635, -644245, 876173, 1027034, 984084, -4387846, -1372779, 1608465, -3016141, -5083094, -4860829, 263604, 388158, 1000191, -291521, 37581, --1410360, 2350958, -417149, 2052458, -3111704, -389768, 3265786, 6025302, 472446, -126702, -781684, 3526705, 2279017, -4315369, 1129576, 2113661, 1340567, 10737, 2299955, 2078227, -1320166, 1343788, 825171, -1111323, -2521146, 3261491, 1413044, -2014877, -386547, -1651415, -2185065, -43487, -1498944, 1830193, 1222455, 899259, -10684268, -12977781, 6375879, -2462627, -5558762, -2923262, -3002719, -5858336, 1235340, 1121523, -381715, -3221, -772020, -4497368, --641024, -2609730, -3027952, -2833605, -240518, 244813, -357019, -579284, 2043868, -687195, --6805376, 4066797, 1914482, -2344515, 516470, -136902, -81068, 866510, 4127464, -2452963, -94489, -7612830, 3600793, 683437, 1533840, 2553895, 4071092, -2422899, -1975685, -906238, --3973382, 259846, -752156, 3241090, -1949915, -260919, -2027225, -2136746, 3802120, -3038689, --1656247, 353798, -2939368, 2266669, -312996, -1294396, 2253784, 4530654, 59056, -173409, --870268, 3886409, -4095788, 51003, -857383, 2052458, -1218697, -1736777, 3925600, -49392, -560493, -1182190, -15477452, 2473364, 1681480, 5240934, -2238215, 1490354, 6124624, -2563559, -1582159, -3937411, -5692979, 1890859, -3914863, -4474282, -4464082, 1154809, 1532230, -7558606, -4230543, 2728378, -1381369, -2871723, 1611150, -837519, -1807108, 369367, 2333778, 1644973, -3799972, 582505, -1314797, 3857954, -2151242, 8621073, 1860258, 5237713, 1967632, 4568235, -1995012, 3085397, 1650341, 193274, 55835, 6457484, 1000727, -1277753, 309238, 3303904, -2470680, 163746, -436476, -1594507, 600222, 7894687, 2183454, 3517041, -4079682, -2266669, --4300873, -2872796, -4187593, 2756295, 1729261, -2842195, -2019172, 1525250, -2117956, 1722819, --1120987, -922344, -3021510, -5020280, 1749125, -7973070, -1385664, -2021856, 8812736, 12074227, --3468186, 3373160, -5732171, -140660, 534723, 15375983, -1371168, -3845606, -6366752, 324807, -4551592, 7165079, -1385127, -9006010, -2445447, -3327526, -2308545, 3291019, -471910, 6011344, -856846, -3131031, -7213398, 2399813, -481573, 1898376, -676457, 1012539, 3862249, 1509681, --9110163, 1300838, 6244883, 3132642, 981937, 1617055, -1250372, 4343286, -5264020, -357556, -4822712, -2959233, 277562, 7585986, -3131568, -163209, -2209224, 4742181, -4476967, -3363496, -2543158, -4773856, -2105071, 6656663, 4161287, -5579163, -1746978, -670552, -1026497, -2435783, -2509335, -2063732, 2845953, 121333, 857920, 1227287, 5425081, -383863, 7322919, 3621194, --4508105, -2283849, -1812476, 4027606, 1824287, -49929, 28144920, -10735271, 5516886, -8257612, --1074816, 34897, -825171, -4495220, 2085207, 3017752, 554588, -3339337, -6816113, -498216, -3780645, 2602213, -3129421, -5206574, -635655, 4177930, 7863012, -4627291, -822486, -3558917, --7322919, 530965, -3799436, 1886564, -2872796, 5246840, -9910637, 6265284, -659278, -6036577, -1174674, 2149094, -910533, -3333432, -37044, 7285339, -510027, 955630, -1292248, 2601140, -1116155, -2091649, -3060164, -6536940, 3822521, -1624035, -2041720, 2062658, -163209, -10807748, -7841000, -11620571, -6693170, -8352101, 1533840, -1332514, 4604205, -3034931, 2377265, -5257040, -2157147, -1751810, -2099702, -5845988, 3129958, 3110093, 6288369, -2270964, -665720, 856309, --1959579, -371515, -22382686, 2310156, 243739, -1868848, -3454228, 3958349, -3045132, 2653216, --818728, 12348, 3599183, 4771709, -2928631, 3535295, -1049583, -1845762, -6328098, -233539, --8542690, -6152541, 7409356, 2752537, -2965138, -966905, -957778, 5282273, 2645163, -2565169, -4626754, 3252364, 1741609, 1747515, 1888712, 3718368, 2963528, 3180960, 8205535, 7645579, -3085397, 964757, -5368709, 5917391, -7906498, 1666447, -2357400, 6407555, -4946192, -5989869, -10309532, -2303713, -5920076, -4883378, 7566659, 4986457, -24696, 4206384, 5361193, 2787434, -8850854, -374736, -1859721, 5411122, 2757369, 490163, -277562, -4609574, 2344515, 3186866, -6856916, 3236795, 3988414, -2626909, -4527970, -7818451, -2563559, -30273614, 7591892, -6803228, --9833864, -9754408, 5376226, -7359964, 4708358, -9138617, 4391067, 3626026, 2126009, -9611063, -5885179, -585726, 3419331, -8058970, 3852586, 8472360, 6490770, -251256, -3564823, 752693, --2283849, -10180146, -2298344, -5170604, 1877438, -6614787, 4892505, 4572530, -2342368, -782758, -6870337, -2144263, 4568772, -4502737, -6557342, 2668249, -396748, 2767570, 8556112, 4754529, --599685, -16043313, -7646116, -2794950, 1888712, -3044595, 8246337, -14077829, 4010963, 1100585, --346819, 3455301, -1930588, 5733782, -14209362, -7345468, 5276368, -14930917, -2750927, 5712844, -2247879, -4026532, -9480603, 2529736, 6038187, 3430068, -1650341, -10967736, -730144, -1124208, --840203, -13679471, 1863479, 2704756, 11337103, -10011569, 12341052, 3786014, -641561, -2428804, --974958, 1515587, -8465917, -1268626, 3121368, -2461016, -4851166, -957778, 8601209, -8131984, --1575179, 9054328, 325881, -2934537, 3313567, -3693135, 6604049, 3282429, 195421, 3680250, --3397856, -5245766, -142271, 992674, 5002027, -9565429, -5196374, -3883724, -2862596, -2392834, --2802466, 2153389, 768262, 1500017, -7289097, -7084012, -5888400, 935229, -9431211, -4625143, -6111202, -3160559, 1588064, 1431298, 132070, 3280281, 3782793, 4185983, 4259534, 6680822, --636729, 7208566, 12348, 4209605, -67109, -2829310, 268435, -5173825, 4544076, -6147709, -7688529, -6861211, 670552, -6902550, 1801739, -6589017, -7117298, 6898791, 11481521, 39616240, -1055488, -10672994, 2364916, -5531381, 16155519, -1970316, 4975720, 1712618, 1355062, -13103408, --6404870, 8153459, 7272454, -10208064, -1281511, 238371, 10205916, 5280126, 4269198, 9965398, -2103997, 1177358, 8791798, -2295660, -11797738, 2396592, 10145250, 6184216, -2954938, 745177, -7278896, 4596689, 2469069, 199179, -6311455, 3946538, -6915434, 1307281, -13604309, 4296041, -5085778, -605054, -5876052, 9618042, 5476084, -1329292, 7771207, 3802120, -5214627, 11436961, -1919850, -3309272, 3289408, 11713986, 2517388, 262530, -8514236, -4882304, 2129230, 4335233, -13573170, -3644817, -4160750, 1651952, 7864085, -3941706, -4552129, 42413, 10266046, 7147900, --1222455, -6595459, 776315, 8530879, -2079838, 16925930, 8275328, 4159676, -14418205, -1947768, --7571491, 13447006, -5801427, 6011344, 664109, 8254927, 2853469, 826781, -1321239, 3091840, --4603668, -6369974, -17041356, -12579959, 3375844, 10385768, 13852343, -5747203, -7749732, -6631967, -2559801, -3802657, -1429150, -959388, 1251446, 1848983, 8969502, -5506685, 180926, 2053531, -3987877, -5002563, -4233764, -8033737, -6009196, -5678484, -9986336, -23622320, -1073205, -3387656, --10851772, 2008434, -1967632, -12890271, 3401077, -10948409, 1882269, -1496259, -1771137, 5274757, -6144488, -356482, -11407970, 2950643, -7533910, -7364795, 9092983, 9017284, 9135932, -3376381, -592169, 1311039, -6273337, 794569, -3626563, 15923591, -3816079, -1589675, -2821794, -47245, --11008538, -12022687, 4591320, -15224585, 5720897, 1897302, 16225313, -10836739, -6038187, -3601867, -8739185, -8234526, -7758322, 7109245, 4962298, -8359617, -8213588, -8271570, -18188112, 11993696, -11538967, 11924977, -4944044, 3695283, 12168716, -17395154, 290984, 11206107, 10801843, 4620311, -280247, -5698348, 1484448, -2848637, -14596983, 1693291, 4469451, 1974074, 10311680, -8977019, -1364189, -16589311, -1622961, 2949032, -8494908, 3168612, 3264175, 6980933, 9469866, 12074764, --1966558, -5252745, -14384919, -11107322, 5279052, 21598316, -6139119, -1385127, -9407589, -5886790, --7252589, 4196720, 5749351, -2294050, 1664300, -16784196, -1095754, 10181757, -7573638, -8376260, -7747584, -3858491, 10923176, 1213865, -5264020, -309775, -8433168, -5105106, 81068, -9881646, -21577916, -11212549, -5960878, -826781, -1114544, -15979963, 614717, -11870216, 7908646, -21968758, --3536369, -7288023, 6973953, -7813620, -7864085, -18651432, 11908334, -7900056, 4657892, -6268505, -3278134, 9326521, -7468412, -12373264, -4431333, 7791071, 16589848, 5056787, 6701760, 430570, --17546016, -9587441, -9659381, -5171678, 2559801, 15091978, 6248641, 8600672, 8028368, -2824478, --4075924, -5683316, -14784351, 303869, -10471130, 15009837, -7582228, 10170483, 1776506, -6106907, -3052111, -4259534, -5399311, -9004936, 12164421, 2745558, 20917564, 4089883, -23775328, -6428493, -6765111, 5326297, 2686502, -2055142, 1300838, 23423142, 11298985, -4974109, 1701344, -7490423, -16528645, -1748052, -1918240, 5626944, -17147656, -7981660, -13616120, 7778723, 17666274, -1989107, --1006633, -644245, 16402480, 4922033, 3754875, 2610266, 1732482, 2596845, -6789270, 986769, --20847234, 2721936, -10169946, 8373576, 20839182, -2978023, 1294396, -16871168, 21978422, 10536629, -9196062, -3009698, -12466679, 1227824, -4419522, 11031623, 7834021, -10346576, 282394, 5704791, -3944391, -8063801, -7208566, 32312112, -7821673, -5919002, 6586333, -8531416, -6329171, 10111427, -9849434, 162135, 3601330, 3450469, -12913356, -6501507, -862752, 4065187, 10692321, 2504503, -2247879, -14448807, -1722819, 3994320, -19831474, 4066260, -5838471, -2139968, -4056060, 5557151, --6300717, -10675678, -11860015, -17934710, 1582696, -7265474, -4284230, 11487427, -4875325, 3936338, --21514564, 617938, 15771120, -10256919, -10306311, 24613384, -14685030, 3886409, -9386114, 29026462, -6163278, 5426691, -9257265, -10876468, 1052804, 8366060, -8888972, -14059039, -8429410, -20478404, --8040179, -11964168, -41876, -27536110, 1915019, 15146202, 9205189, 12422656, -8581882, 3380676, -13274133, -1340030, 9615358, 3807489, 15002321, -7304129, 12505871, 10232223, 7096897, 16576426, --9157944, 10012643, -5017059, -5462662, -3874061, 3961571, -31620086, -9714679, -19660212, 23154168, --14341970, -15716359, -3469797, 13322452, 357556, -5244692, 17890150, -5809480, -5647345, -12345347, --31919660, 2239826, 3027952, 14070313, -13318157, 861141, -8056285, -9879499, 17246442, -2462627, -8773008, -17498234, -17805860, -10088341, 14650670, -151934, -8436926, -8146479, 548145, -12429635, --640487, 15389942, 1523640, -5348845, 7641284, -13464722, 25177098, 15659988, -752693, -12288438, --13937706, 5064304, -3977677, -1693291, -1335198, 23024246, -12181064, -34360, -8680666, 8190503, --15266461, -13838385, -27022324, 5666136, -11394548, -15244450, -2506114, -25476136, -13020193, 6661495, -4618701, -3838627, 12308303, 826244, 15061377, -7361037, -22555558, -3681324, -16744467, -3403225, --5592048, -21242908, 1918777, 16687559, -48766132, 5747203, -732829, 11576547, -3252901, -15220290, --29340532, 11052025, -4413079, 10322954, 5397700, -3728569, 15621333, -20897700, 27936614, -7497939, -15101642, 33553896, 12429635, 23822572, 8321499, 6109054, -4451734, 12367358, -5878200, -13306882, --18930606, -11583527, -1763084, 9822053, -2447595, 41070624, 33576980, 30345018, -6126771, 758599, --24574192, 19525996, 23966454, 8654896, 23159000, 9730248, 8253854, 8654359, -3416110, 3868155, -6800544, -4993973, -23730768, -13964549, -367757, -15341086, -18279380, -43342124, 10201084, 8442832, -11994233, -7624641, -2546379, -5031554, 768262, -12948253, 44560, -9646497, 12643847, 11060078, --5900212, -7654706, -22891638, 40126804, -11878269, 8679055, 326418, 3479997, 6576669, -15233712, -19843822, -8868571, 6947647, 5393942, -14376866, -14024679, -2590402, -265751, 9240085, 42453604, --3346317, 7248294, 1429150, 13596793, 8874476, 10435160, -7399155, -1023276, 3389803, -18823768, -3745748, -15924665, -27828166, 10721849, 121870, 3357591, -21136608, -46938624, 19027778, 22792318, -11884175, -25841208, -23998666, -47596828, 38950520, 6023692, 6659347, -16041166, -11658689, -50603304, -13594645, 35717484, 10714333, -32140314, -16273094, 4915590, -12737799, -8133058, 14416058, -16844862, -8930311, 8021389, 6499360, -18715856, 6255620, 5477694, -9016210, -17524540, -10358387, -6889665, --4827007, -16724603, -14578193, -8056285, -17361332, 13178033, -6706055, -22180822, -7937637, 13226889, --3143379, -15460272, -8735963, -8015483, -410169, -12321187, -7631083, -20259898, -19345070, 7801808, --7105487, 24631638, 16048682, 1268626, 14547054, -22172768, 13767518, -21110302, 17071422, -3452080, -8585640, -9775882, 30604864, -8347269, 17020418, -5194763, 25148644, 9302899, 5930276, -27404576, -28223304, 21281562, 9706626, 8581882, -20646444, -6754373, 8263517, 9386651, -3826279, -6298570, --30620970, 30246770, -1010391, 15669114, -15841450, -3632469, -2194192, -1972464, -1894618, 18583786, -2838437, -11363410, 13329968, 4119411, 10302553, 16080894, 16396038, 2962991, -9626632, 51760800, --11115912, 40321152, 2798708, 4512937, -19033684, -7197292, 6149857, 20685636, 11725261, -3745212, -17741436, 5344013, -18168786, 5760088, 5767604, 23739894, 1964948, 15144055, -13015898, 2323577, -17359720, 9557376, 15036681, 34576096, 28752658, -1647120, 16383690, 389231, 28399934, -17896592, -20057498, 9345849, 2290291, 17706540, -4721243, 42010684, -3432216, 21660594, -10871636, -10118943, -4245575, 44746580, 17413408, -36246840, 38470024, 2158221, 16178605, -26481158, 14268418, 6416681, --54393612, 27832462, 49884436, 20417738, -13502303, -8763344, 15642808, 42370388, 10035191, 11850889, -7774428, -8734353, -4330938, -15661061, 20325396, 3478387, 13525926, -10449119, 27028230, -8996346, -12565464, 4702453, 5551245, 4518306, 2257542, -27659590, -16523813, 822486, 2356327, 20007568, -15700790, -22320408, 2048163, -11922292, -11895449, 6511171, 1005022, -7028714, 9062381, 38224672, --25263534, -1003949, 56544320, -33761664, 3426847, 21470542, -11205570, -7290707, 11031623, 20023138, --21418466, 11353209, -38213396, -2716030, 54508504, 3796214, 14594836, -4451197, 29118268, 32015760, --9788767, 1038845, -15899969, 5156645, -12277164, -25388088, -19193136, -30552250, -25807384, 37820944, -12312061, 12554726, 45458472, -31952410, -22764400, 8109972, 14875619, -11324755, 5186710, -12378096, -22287660, 17451526, 3881577, 19770808, 61022360, 6657736, -6986838, -15814070, 14712410, -3089155, -32337882, -27515172, 8199093, -1100049, -8118562, -7333120, -3091840, 10560788, 6950331, 7481296, --463856, 18486612, 4127464, -21977884, -16994112, -1532230, -9532143, -12229919, 4105452, 15462419, --926102, -2324651, -19897510, 11329050, -2228014, 22494354, -6157373, -40399000, 6246493, -11278584, --5035313, 1061931, -32343788, -16649978, -27588722, 1535451, -827318, -7067369, -36879272, -14493904, --2012729, 21003464, 23420994, 2827699, 3074660, 11815992, 3868155, -25154550, 24466282, 32407138, --12083354, 5836324, -12060805, 6765647, 1506460, 24974698, -25103546, -18325552, -59506772, -20638928, -17296908, 25746718, 19535122, 16916802, -12971338, -4198331, 14558329, 12192875, 29236380, 12205760, -14436996, 16616692, 6793028, -48041892, 21561272, -13609141, 2771865, 35948340, 30102352, -10468983, --4006668, 19092204, -10333691, -10624138, -8977555, 3606162, -2566243, -90731, 4951561, -2580739, -17947594, 42275364, -16571594, -30767536, 32763622, -23492934, -6038187, 1656247, 40660456, 4559645, --11485279, 13291850, 11746736, -40291624, -11743514, 8532489, -1096290, -18191334, -1002338, 9620727, --61027728, -26622892, 30878130, -28425168, -33389076, -18854370, 25208774, -30206504, -50285476, 53121228, --14765561, -29538638, -1694365, 22344568, -19411642, -31595390, -852014, 18343268, -1868311, -41035728, -10129143, 2535105, -20069308, 49692236, 43031276, 413927, -18513456, -30275224, 52041044, 11858942, -7892003, 23300734, -15159087, -45977624, 20185272, 45679124, 26869852, -12450573, 3253975, -49767932, -6580427, 48853104, 27060442, 7685307, 386010, -7677254, 13442711, -15894600, 40757628, -2055142, -11609297, 15659451, -12662637, 1506997, -702764, -14176076, 972273, 6715182, 23341000, 888521, --12788802, 7845832, 19005768, -2004676, 29514478, -21125870, 5699422, 7374996, 8521215, 25623238, --12394202, 3137474, 197032, -31212602, 5715528, -9555228, -16418049, 8489003, -5507222, 26257282, -19427748, -12294881, -27624156, 14681272, 4052302, 6755984, 17412872, 36078800, -4656282, 8258149, --12884365, 21134998, 15837155, 16058883, -15252503, 24080808, -6372658, -9052717, -18556406, -771484, --6237903, 30931818, -20397336, 2698313, 9429064, -5682779, -11326903, 42908332, 762357, 11212549, --759136, 6574521, 435939, 13864691, 4226785, -321586, 15974057, -45090716, -125306744, -119127896, -50711752, 4373351, 113089712, 240564336, 52023864, 96584152, 51048908, -179543056, -80914496, -120932856, --177569520, -12421045, 20023674, -84041232, 73319920, 125690608, 76395656, 216861488, 132497056, 739808, --21040508, -77377592, -192943360, -155971200, -67986648, -147741504, -44455596, 83851720, 24038396, 20968568, -198094624, 76493904, 47467440, 183994256, 7677791, -9571871, 83896816, -42530912, -153009280, -73740832, --152907808, -221903248, -25665114, -100833488, -83349208, 70953400, 136555808, 63708860, 242152944, 193902736, -111284752, 147360864, 48788144, -71893992, -112257560, -147853168, -238436720, -189816080, -128677224, -108103792, --34723200, 83632144, 124881544, 141281344, 187714768, 160256512, 74254080, 29701310, 41678900, -59262496, --94543504, -61268244, -134350864, -72863048, -1661616, -9522479, 0, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ --1440962, -20401, 2159295, -4076998, -1202054, -2580739, -3591130, -315143, 4429185, 767725, -2393908, --2267206, 6123013, -2767033, 584652, -1990717, -2043331, -3163780, -776852, 7668664, 504122, --382252, 1437203, 1978369, 652298, -2481417, 4250407, 131533, -148713, -1906429, 536334, --1441498, 634581, 2820183, 207769, -115964, -159988, -200253, -666794, -3753802, 876710, -3172370, -945967, -1850594, 2961380, -3440269, -263604, -1462436, 2172180, -5546414, 2048163, --421444, 833761, -1253594, -1153736, -153008, -1565516, 224949, 1675574, 1235340, -340913, -1093606, 4946729, -3124589, -2483028, 253403, -1171989, -2353105, 652835, -2532957, 1389422, --3048890, 315143, -1552631, -2566780, -373125, -4971425, -1869921, 1250909, -870268, -2827699, --147640, 6809671, -3394098, 868657, -1399086, 10737, -2518462, 4932233, -2459943, -2585034, --2974802, 5866389, -3383897, -799401, -1576790, 1725503, 2705830, 3483219, -4725538, 98784, -4597226, 2131915, 813896, -133681, -539555, 2182380, 4677757, 1249299, -5947456, -2946885, --3192235, 5350456, -516470, 4120484, -2486786, 1991791, 5226975, -2388002, -3923453, 1557463, --1468879, -95026, -3519189, -1243393, -2636036, 1184337, -4781373, -1378148, -1240172, 53150, -6424734, -1887638, -1005022, 2147, -1734630, -420907, -662499, 4171487, 1955821, 2682744, --3435437, 2775623, 2490007, -1940788, 951872, 1919314, -1873680, -1903207, 2556043, -3585761, -2644089, -440771, -54224, -217433, -3240553, 3271691, 322659, -1527935, -2230162, -674310, --1165010, -81604, -2741800, -2144799, 1454920, -512712, -1088774, -4769561, -756988, 4259534, --2988760, -827318, 3226594, -1986422, -3559454, -2775623, 2190433, -79457, -383863, -775242, --3403762, 1031866, -1532230, -893353, 3777424, -2197950, -5181341, -1643362, 267899, 1438277, -1343251, 333934, -3923453, -1014686, -4771172, -4449049, -1158567, 4431333, -767725, -9097278, --375273, 2908767, 2667175, -1972464, 1820529, 1811939, 248571, 2549063, -4753992, -3549791, --350040, 1277216, 350577, 870805, -363462, 1132261, 1342714, 1731409, -41876, 1010928, -1399086, -1048509, 2247879, -606664, -4185446, -4003447, -1699733, -500364, 4276714, 2470680, -6319508, 584652, -1058173, -581431, 4509179, -1007170, 2484102, -3806952, -283468, 81604, -2425583, 1785096, 4043175, 2949032, -1883880, -3739843, -3095061, 2403571, -1254131, 3213173, -2002529, 613107, -86973, 2714956, 1862405, -1597191, 2156611, -4014721, -497679, -3700651, --3279208, -4494684, 1460826, 2937758, -425739, 3998078, -2848100, 3728032, -6977175, 2964601, -1256278, 5471252, 1576253, 2141578, 2851858, 152471, -1760937, 2231236, 4571993, 1839857, -2219424, -431644, -71941, -6133750, -431644, 1347546, 1225139, -613107, 3408057, 6804839, --2208687, -4291209, 3026341, 1057099, -3390877, 334471, -1661079, -2913062, 222265, 5069135, -896574, 2124398, 373125, 3518652, 3393561, -3028489, 5112085, -1646046, -3162707, -4765266, -1280437, -6344204, -253403, 784368, 1942936, -4009889, 2823404, 41339, 758599, 1830193, -1231582, 1562294, -5384279, -273267, -1075889, -3530463, 2310156, 1163399, 1029182, 3207267, -11158325, -715112, 773094, 1652489, 2924873, 1161252, -8766565, 1956895, -1259499, -945430, -5168993, 231928, 2704219, 3639448, -4173098, -2390149, -1005559, -4218732, -8943733, 522375, --3180960, -468688, -492848, -100932, -1813550, -4425964, 1624571, -4228932, -1013612, 1070521, --4440996, 5088463, 2120640, 1523103, -1603097, -258235, -340376, 1110249, -1075352, 2688650, --3438658, 1452236, 6568079, 5132486, -1125281, 2705830, -1667521, 1280974, -3615289, 175557, -7297687, -9322227, 366146, -5753646, 2901251, 4190278, 5124970, -835371, -4917738, 86436, -5049808, 1040993, 947040, -3859565, -534187, -6727530, 8857296, -520765, -6859600, 7350300, -1831804, 2137820, -504659, -2730526, -895501, -3590593, -3501472, 2667175, 3859028, -864362, -3639448, -3097745, -1910724, -83752, 5087389, 4749697, -1384053, -2825015, 3952981, 2435783, -344671, 3257733, 772020, -4081293, 4134443, 2469069, -346819, -1518271, 1114007, -4423280, -11332808, -757525, -448824, 8289287, -816044, -5386963, -2861522, -835371, 2011118, -5635534, -3627637, 836982, 61740, -5203353, -4196183, -8999567, -847719, 3626563, 1910724, 4414153, --2826089, -2494839, 10100152, -3569655, 1523103, -2423435, -4486094, -9607842, 62277, -3948686, --4475356, 1566589, -5406827, 309775, 4001836, 2229088, 8188892, -13206488, 8761733, -1283122, -3941706, -2423972, -1715839, -6886443, 6449431, 5636071, 1591285, -6117107, -134218, -3493419, --216896, 6601902, 4739497, 1098438, 6411313, 8590, 547071, 697932, 18254, -4245575, -9490804, -849867, 331786, 10820633, -6684580, 2634426, -3049964, -643171, 3662533, -1420560, --5198521, 10385231, 8347269, -262530, 2908767, 4354560, 11475616, -1442572, -1705102, -6073084, -1384053, 2099702, -6083821, -6885907, -5672578, 7158100, 531502, -3047816, 5345087, 3412889, -472983, -1866163, 2051384, -4095251, -524523, -4500589, -437550, 3667902, -7262790, 1388348, --980863, -6117644, 4146791, -2192581, 1226750, -1936493, -987306, 1247688, 7147363, 7568269, -1093069, -6958384, -1121523, -6628209, 2467996, 16542067, 3952444, 11376831, 4084514, -120259, --11045582, -2944200, 1597728, 10222559, -4838818, -2612951, -4239670, 699006, 8254927, -6505802, -3940633, 6976101, 1425929, 2340757, -4986994, 8668855, -2143726, 11383811, -324807, -4000225, --11263015, 930934, -187905, 12725451, -4212826, -1542967, 8102993, -434865, 843961, -3241627, --8912057, 366146, 4678830, -6797860, -5203890, 652298, -10693395, 4996658, 5383205, -2488397, --1072131, 2115808, 5425081, -1377074, -4094178, -1106491, 8065412, -2177549, -1942399, -4470524, -10431402, 9896142, -82141, -3675955, 723165, -2456185, 1600412, 2674691, -2408403, 3568044, --6753836, 1582696, 366683, -7248294, 7678865, 5865852, 616865, -4764730, -5338645, -2257542, --10778757, 12870406, 9762998, -1918240, 3740380, 1278290, -1896765, 9777493, -576063, -4370666, -14491757, -15370614, 4205310, 6777459, 156766, -6231461, 7023882, 1146219, 10065256, -3723200, --837519, 2704756, 4159676, 737124, -1117228, 14390288, 6413460, -6495601, -9655623, 6926172, --9656160, -2838437, -11149735, -1453846, 17303886, 6988449, 8495982, 56371, -8796093, -1525250, --4166118, -2001992, 13015898, -2042257, -13797582, -1211181, 3022583, -9045738, -1220308, 5638219, -4803384, -6176700, -2878165, 5954972, 8413841, -2626909, 8748312, -170725, 2381023, 2771865, -950798, 2813204, 5304285, 4235375, 4978941, -3505230, -10022843, -12599287, 6366752, -699006, -5944235, -11599096, 4286378, 3425773, 1810329, -7557532, -6317897, -8054675, 6452115, 3418794, --5740761, -5708012, 8088497, 2716030, -549756, -4779762, -8002061, -3180423, 3383897, -5055714, -711891, -9586904, -2624762, 1269163, 3426847, 6487011, -923418, 4193499, 5637682, -5496485, --13395466, 9445170, 542240, -1992328, 8971113, -1210644, 482647, -5801964, 7917236, -4802311, --6163278, -2293513, 6540699, 9859097, 8309688, 2717641, 1835562, -16882442, 7981123, -830539, -3507378, -5684389, -845572, -6375342, -1990181, -1378148, -8431558, -4164508, -3204046, -4531728, -9548249, -2634426, 12356084, -1096290, -46708, 7771207, 9207873, 14659260, 10692321, 264141, --3479461, 56371, 1538672, -5838471, 3715147, -3512210, -4891968, -18486612, 3705483, -12822088, --7797513, 11507291, 8887361, -21061982, -19327352, 323196, 7810935, -5142687, 4706748, -7164006, --1067836, -12356621, -3440806, -11183558, -1068910, -3286724, 63351, 3868155, 3144453, 6462852, --1112397, -6073084, 4751308, -7180112, -3015604, 1917703, 188442, 3223373, 6946036, -1439888, -680752, 1380832, -3127810, -1025960, -10720775, -12717935, -12248173, -233002, -12303471, 3833258, -1450625, -5018670, -5770826, -2638184, -2121714, -1238561, -7299297, -11592654, -690953, 17957796, -9977746, -2697776, -10791642, -11300596, 12587475, -11836393, -3736622, -2156074, -7632157, -5979668, --7700877, -9343701, -12618077, -17545478, -2012729, -2730526, -1819992, 6070400, 6496138, 1728724, -6161668, -3299072, 1609539, -14516453, 2133525, 7900593, 8609262, 7941395, 3654480, 15291157, --5430986, -10543608, -2363306, 2234994, -1705639, 5057861, 10457172, 20365124, 13156559, 7635915, -9897752, -7492034, -14260902, -4845260, -10525354, 12817793, 3446711, -2452426, -8392903, 14485851, -12910135, -4376035, -263604, 95026, -6743636, -6039261, -10459319, 3435437, 4547297, 6454262, --9806484, 1057636, 3757560, -4716411, -9459129, 365609, 6754373, 7911867, 2160369, -20003274, --6300180, -9869835, 4993437, 11944304, 915365, -11258183, 3637837, -10882910, 7010997, -2682207, -2001992, -7757785, 17246442, 12687870, -2865817, -3824132, -8136279, -723702, 14174466, 2873870, -17206176, 15216532, 14177687, 7428683, 4151623, -10251013, -3981972, -13513578, 17565880, -8533563, --1107028, 8607114, 14026289, -11905649, -14690936, -12569222, 16707423, -5025112, 11651173, 1153199, -1609002, 25912612, -1509144, 3102040, -9417790, -15699716, 5739687, -1254667, 6101538, 4261145, -180926, -8446590, 4316442, 4898410, 3294777, -7909719, 7691750, 5684389, 19598472, -7017440, -2901787, 11076721, 11739756, 1654099, 11870216, -1293859, 2173254, 10325101, 9456444, 3322694, --2110440, -13174812, -9074729, 9760850, 1692754, -2020245, -892279, 3445638, 21441550, 105764, --4689568, 11196443, -2611340, 10664941, 4471598, 29335700, -3196530, 443992, 2308545, 5520644, -12037720, -496069, -675384, 7610145, -10428181, 12109123, 22564684, 7230041, -1106491, 12377022, --970126, 755377, 25729538, -11637751, 8521215, 10087268, 592169, 1417339, 1874753, 3898757, --14902463, -4975183, 8707509, -5628555, -8177081, -7518877, -7546258, 193274, 8803609, -2253784, --22228066, -1031329, -17075180, 5261872, 6199786, -951335, 2523293, -8262980, -1687922, 7515656, --21267068, 4060892, -5225365, 10264435, 7188702, 3939559, 170725, -9413495, -19233400, -2252174, --16893180, 8706972, -565325, -6220724, 16350404, 7473780, -7487202, -6800007, -4233764, -4045322, --5444408, -10669773, 976031, 1099512, 23966454, -2415919, -18311594, -1649804, 11348914, -809601, --9776956, 3966402, -14405857, 7314330, -6518150, 4152697, -8728984, 1692217, -14790794, 34782256, -567473, 23279260, -3342022, -9298604, 5675800, -10670846, -9092446, 11588896, 12689481, -14874009, --33315524, 27598386, -12037720, -11470784, -5828271, -1981591, -15940771, -5762236, -4994510, -13699335, --24059334, -6032819, 149250, -12800613, 5954972, -5543729, 10350871, -9250286, -4083440, -13120051, -30760018, 26162256, -6174553, 5779416, 17736068, -19022410, 18919868, -8046085, -8329016, 6895033, -2211371, 3265786, -3165391, -4184909, 194347, 6234145, 5019743, -8403640, 9291088, -9041443, --15491410, 11027329, 9264781, -12509629, -16035797, -17980880, -3056943, -2877628, 4641249, -11667816, --15221901, -7393786, 24319178, 8851391, 7973070, -10392747, 9089225, 13271986, -10642929, 24598352, -4031364, -8395050, -11904039, 6859063, -10091026, -20409148, 4541391, 206695, -73551, 11876121, -10031433, -8562554, 1157494, -25985626, -3920768, -9709847, 21413096, 2317672, 2386928, -11496554, -9536975, -19882478, -4589173, -11622182, 14543296, 15302432, 13872207, 9293772, -175020, 12647068, -11525545, 1808181, -2233383, 5005248, -1074, -13164075, -1578401, 4778151, -10198400, 14356465, --15170898, 11944304, 13201119, -4006668, -2990371, 5381594, 17627620, 12973486, -15938087, -3733937, --4263292, -1545115, 3987877, -7728257, -7778186, 16983374, 442382, 24503326, -16214038, -15751256, -12516608, -8678518, 4520453, -10172630, 8358007, 9074729, 6295349, -4384088, -14252849, 879931, -4740034, -12432320, -21787832, -1378148, 1970316, -13538274, 23505282, -3431679, -6710350, 30443266, -29387776, 2034741, -4173635, -2105608, -6395207, 5960341, -15591805, 13197361, 1711545, -9860171, -17211544, 1104344, 3167539, -7014756, -10029286, -25979720, 4348655, -11266236, -5459977, -26071526, --60029684, 19758998, 18711562, -6955163, 3970161, -14663555, 25521232, 16216186, -14886357, 3888556, -3243237, 90731, -6844568, -5024038, -31085900, 12753369, 14951318, -3802120, -274878, -2016487, -9973988, -8018704, 19275276, 5498095, -23496156, -13459891, 29228326, 19066434, -19495930, -4825396, --7108171, -12077985, 1561221, -5011690, 3925600, 38008848, 10161893, 39835284, 22647900, 25555056, -23287850, 45921252, -3337190, -4624606, 10751377, -3605625, -39115876, 31106838, -13960791, 17683454, --25992068, -20754356, -38667592, 7233799, -3914863, -13245679, 8932458, -18408230, -375810, -26146688, --26171920, 6749541, 14470819, -21371220, -6134824, -15028627, -20782274, -23209466, -17024176, 11560978, --10799695, -29199336, 39106752, 23843510, 38533908, -8257612, -22469658, -57770532, 24003498, 28791850, --14060649, -6550899, -2175938, 32684164, 387621, 6400575, 6366216, -8615704, 5959804, 14803142, --3802657, -15750719, 3051574, 27637578, -15745887, -10227391, 5546951, -4784594, 20596516, -6158446, -8906152, -11813308, -13864154, -14018773, 13253195, -5080947, 11680700, 13538274, -4440460, 983011, --631897, -12736189, 3178276, -11663521, 11886322, 29947734, 50054084, -1649804, -2228551, -22564148, -10826539, 15549392, -1326071, 17562122, 25851946, 10080825, 14296872, -24618752, -14997489, 18230526, -49793168, -10581726, -30842160, 6263673, -11017665, -1925219, 12565464, -1188632, -14907295, -8013872, --8475581, -36115308, -16087874, -1433982, 3804267, 10300942, -4303557, -15112916, -10598369, 1326608, --9477919, -15312095, 6870874, 18088254, 5978595, 9475772, 3666828, 27303108, -8676371, -3429532, --10807748, 6345814, -6748468, 6028524, 30907122, 6154688, -32935420, -7968775, -9682467, -28035936, -17744658, 8504572, -3367254, 4058744, 1632088, -12509629, -238908, -772557, -12652974, -3615289, -26924076, 39929776, 18630494, -13681081, -22056268, 10554882, 18039400, 2265059, 14405320, -9857487, --7141994, 15231565, 4591857, 543313, -33498060, -43141872, -1522566, -25029996, -14882062, 9571871, -36316096, 8420283, 1728188, -9960029, -12657805, -17580912, -16086800, 3741990, 10972568, -3041911, --18059264, -28148142, 11645267, 1879585, -16081431, -25855704, -18173080, -28372018, -53609244, -30754114, --4416837, -4295504, 65461744, -5238250, -1524177, 40843528, 5704254, 7010997, 24382530, -5043902, --15404437, 20564304, -28987272, 7413651, 4706748, -12592307, -40674416, 27802398, 8334384, -2559801, --41174776, 11045045, 6518150, -21740588, 3763465, 19177566, 11876658, 5623186, -18555332, -3754875, --6835441, 3348464, -6889128, 1786170, -14321032, -20764020, 23001160, -15712064, 34877280, -21347062, --19216220, -13066364, -24194624, 2222109, -279173, 36545340, -26818312, -28394566, 14892262, 9495636, --23378580, -31245888, -3267396, -17536352, 20542828, 4488241, -25753160, 17041894, -4219806, -39711268, -26425324, -17561048, 17314086, -29416232, -7080254, -489089, -12321724, -4721780, 3560528, 37970196, --10027138, -2940979, -10750303, 11396159, -17814450, 14723148, 29095182, -757525, 29043642, 24459302, --4276177, 48936856, -4109210, 7759932, -3929895, 16563005, 40672804, 349503, 27348742, -54434416, -1473174, -61190936, -20896626, -10887205, 17852568, 55363204, 46967616, 16916802, 27481348, -18855980, --15981573, 2091649, -4741644, 12329240, 3482682, -13286481, 18140332, 26999238, 22327924, 16515760, -13859323, -1145146, 1914482, -10093710, 25470230, 11509975, -5721434, -16854526, 4662187, 9995463, --3613141, 33478196, 34978212, -21470542, -16113107, -46708, 26935350, 16486232, 3565897, 2541010, --7567196, -13426068, 5945309, 41786812, -18329846, -22115860, -24102282, 21310018, 7963943, -13865228, --21135534, -33009508, -39093868, 2980707, 6861747, 5589900, -9865540, -4095251, -12062953, 6070937, --31962072, -50990924, -24343338, -5053566, -10685879, -21085606, 22201222, 39454108, -12293270, 19144816, -42146516, 27191438, 6037114, -34978752, -2248952, -33930780, 27925878, -3202435, 24041080, 14690936, -869194, 16029355, -6576669, -1475858, 13877576, 16892644, 2892124, 366683, -208306, -14841796, --9481140, 4313221, -20730196, 833761, -7575249, 772557, -17517560, 3300682, 1350767, -16010027, -13932874, 6015639, 9549323, -20182588, -5148055, 4078072, -703301, 1698660, 12081743, 2804614, -3652333, -2139431, -4151623, -3001109, -1298691, 7747584, -3042448, -12859132, 10940892, -17760226, --5246840, -5994701, 2534568, -8632347, -10013179, 13779329, -1354525, -13579076, 8754754, -19000398, -15681999, 4833986, 1102196, 15806553, 17912698, 2457258, 5366025, -13179644, 17366700, -8381629, --11299522, -1118839, 2824478, 31963146, -14192719, -24057722, 20518670, -8238284, 20342576, -4262755, -1098975, -9961640, 9313637, 14603963, -9563818, -91423208, -172334496, -62763432, -135378976, -154059408, -35110820, -7331509, 48903036, 194666704, 211407424, 148510848, 212960592, 174477680, 56670484, 59675888, -43840340, -120837296, -124071944, -70152920, -120445376, -130364072, -44746044, -39942660, -109801912, -83541944, --14896557, -50335408, -60606820, -16726750, -46683072, -81887848, -46926276, 12902619, -33386392, -41407780, -45697380, -9824201, -45521284, 38705708, 73985104, -19010062, 17943836, 114594560, 15403363, -38654704, -76701136, 66092568, -66883380, 37200324, 85140208, -27284854, 9844065, 146701056, 113302848, 56461104, -208277456, 230522176, 119902600, 212926224, 276783808, 173523120, 166246368, 227798624, 150298624, 96195992, -109529720, 59180892, -51406464, -110622792, -147495088, -263307808, -314878560, -359921472, -394814336, -381344256, --317797504, -149840128, -94480152, }, -{ -976031, -1103807, 2146947, 2560874, 2877091, 2073932, 436476, -99321, -2056753, 2018635, -3248606, --2457795, 1020592, 904628, -3114925, 5828808, -1801739, 1736241, -1864553, -1691680, 1253594, --514859, -1008780, -564251, 361314, -1848983, -861141, -3647501, 2195802, 1664300, -2878702, --1264868, -1255204, -3185792, 1018444, 560493, -125628, 726923, 1198833, 242129, 1040993, -3312494, -4687957, 895501, -739271, 3169686, 2712272, -2182917, 6245956, -3831648, -4067871, -1019518, 2785823, 1735704, -712428, -912144, -646393, 904091, 1036698, -353798, -2431488, --2031520, -1283122, -3136937, 408022, 1988570, 609349, -724776, -475131, 3759707, 1663226, -1451699, 2830920, 1035624, 1073205, 1397475, -4356171, 3650722, 3905736, -1825898, 3918621, --2334315, -499827, 5216238, -2112587, 2493766, 1522029, -5734318, -2583960, 4349728, -1671279, --798864, 2733210, 1828582, 1950452, 548145, 6668474, 1166621, -1700807, 1523640, -2291902, -4156992, -1178969, -2235531, -978179, -5356898, -1819456, -3936338, 1308891, -32212, 1462973, --1553704, 2264522, 1106491, -244813, 732292, 363998, 563714, 729608, -2807298, 7117835, -1096290, -2597918, 5322538, -1273995, -4502737, -4999342, 4922570, -978716, -332323, 3210488, -422517, -852551, 2583960, -286689, 1529008, 402116, 1930588, -986769, 2102387, -932008, -2491081, 3463891, 1998234, -2082522, -2001455, -1058173, 1073205, -2208150, 1718524, -1061394, -2148558, -16643, 4582730, 914291, 1056562, 3847754, 65498, 2780991, 1334124, -296890, -312459, -2977486, 1417876, 255014, 4712653, 1676111, 1558536, 224412, 1406602, 5162014, --4842039, 2762738, 745714, -3198140, -1418950, -1979443, -632434, -1837172, 1321239, 5952825, -3758633, 4446365, 3542811, 6065031, 4429722, -5497022, -9963250, -1262184, 478889, -2433636, -5266167, -226023, 7880728, -3681324, -3683471, 3387119, 187905, 272730, 3115462, -5763846, -1471563, -4133369, 5439576, 3192771, -34897, 8257612, 347355, -816044, -1054415, -1481764, --2091649, 3889093, 2046015, -2050847, -723165, -5801427, -2614025, -802085, 5940477, 4081293, -607201, 2992519, -61740, 3183108, -237297, 1261647, -3822521, 3396246, 8018704, 2186675, -136902, 21475, 2100776, 1928977, 271120, 1060857, 1648194, -371515, -391916, 2110440, -9116068, 2870112, 7066295, -4382478, -3580392, -1626182, -4585415, -5384279, -2255932, 3520263, --6526740, -1156957, -952409, -10213432, 1789928, -10320270, -3544422, -1626182, 2177549, -262530, -1886028, -2260227, -307627, -7081864, 2281702, -2560338, -3995393, 392990, 1692217, -645319, -281320, 2559801, 4918275, -8998493, 2142652, 229781, -2786360, -3124052, -796180, 814970, --1403381, -5597416, -1481764, 1010391, 2443837, -779000, 6173479, 132607, -16643, 2184528, --4464082, 5640366, 1591822, 3138547, 1223529, 2522757, -1089311, -1122597, 1282585, 501974, --1490891, -2411087, -2338073, 4915590, 5369783, -173946, 5922223, 373125, -783832, 730681, -483721, -1093069, -71941, -4131222, -2378338, 3707094, 4329864, -5077188, -1235340, 2131915, --3417183, -9722195, 2398202, 3623342, 4205310, -2214593, -2614025, -3448322, 5277441, 6084895, -999654, 2419677, -4799626, -3820374, 4454418, 1734093, -3616363, 6287832, -6324340, 1078037, -538482, 5900748, 2089502, -1259499, 885837, -1993402, 3140695, -7610145, -2350958, -10981158, --4903242, 5619965, -566936, 8596377, -1277216, -7106561, 4402342, 1031866, -3055332, -305480, -197569, -2863133, 1730872, 5149666, 5585605, 175020, 2543695, -260382, 6318971, -3357054, -2544231, -653372, -477278, 140123, 1815161, -807991, 7597261, 569083, -234076, -1893007, -6259915, -7926899, -884226, -5293547, -5506148, 2305861, 1360968, 12144557, 867047, 4626754, --9683541, -2127620, 2441152, -4910758, 3658775, 1244467, 1090385, 3152506, 3609383, 8056285, -3726421, -983548, 2721936, -3637837, 1386738, 3402688, 37044, 906775, 3715147, 4729296, -11052561, 2367064, -1352378, -7133941, -56908, 5866926, -8490613, 1224603, -386547, 3007014, --4126927, -4909685, 9611063, -5718212, 2189897, -119185, -5595269, 13772350, 3752728, 7341710, -4083977, 8002598, -1155883, -2663954, 5210332, -4304094, 4070019, -3384434, 2342368, 5579700, -3229279, -2164664, -125091, 2948495, -4439923, -3294240, 566399, -376347, 8295193, -4243428, --7177427, -1014149, 4476967, 6765111, -3811784, -7213398, -962610, -3491809, 3252901, -13280039, -7000260, 1808181, -3222299, 3584150, -10897406, -9177808, 824634, -4714264, 9691594, 8529805, -9138617, -6672769, 3366181, -227096, 9116605, 295816, 6359773, 2294050, -3115462, -8857296, --7980586, 2072322, -10533407, -537945, -2704756, -5364951, -7123204, -4409858, -217433, 7848516, --243203, 2816962, -11988864, -6944962, -1511292, -7749732, 249645, 6949794, -8213588, 2878702, --352187, -3129958, -991064, -2117956, 7850664, 3932580, 3791919, -2360085, -2707440, 10734734, --3611531, -3461744, -9431748, 6294275, -13288629, 1365800, -4526359, 1617055, 4404489, -3565897, --7201587, -4728759, 237297, 9044127, -5001490, -1464047, -6399502, -5363341, 2782065, 2872260, -7151121, -9145059, -542777, 2067490, 1105417, -12633109, 2629594, 555125, 1404991, -17154636, -14218489, -228170, -965294, -814433, -6043556, 1236414, -471373, 4819490, -5328444, 5476620, -1015223, -4183298, -7094749, -8455717, 3300682, 266825, -1417876, 119722, -5353140, 4568235, -2968359, 8795019, 4697084, 3251827, 4290673, -1567126, -5874442, -4154844, -510564, -3007014, -3144990, -4804458, -7643968, -7745974, -432181, -10466298, 3764539, 5078799, -7001334, 5985037, --8287677, 3490198, -11807402, 1283658, -2971581, 644782, -3888556, -280247, -11126113, -1772211, --4534412, -6447820, -2808372, -5001490, 467615, -4456029, -3760244, -6361384, 1660542, -6008659, --1699196, 10193031, -2980171, 667867, 1895154, -1695975, -11418707, -10777684, -3117073, -6785512, -792958, 4662724, 3144453, -10423886, -490700, 1737851, -9777493, -11007464, 5779416, -10791642, -1870995, 7102266, -5426691, -12360379, -5523328, 277562, 7878581, -3299609, 14078366, -968515, --1421097, -8246337, -6192806, -923418, 2573759, 881005, -3306588, -2399813, -1034013, -2982855, --6533182, 5190468, -5500243, -2978023, 4958540, 1759326, -9127342, -9050570, -8967892, 7551626, --8398272, -8304320, 13400298, -8489003, 5594195, -944893, 3179350, -12260521, 5137855, 1048509, --2685428, -261993, -3129958, 4446365, 2261300, 12255152, -3736622, -1791538, 4823249, 11934104, -2309082, 2845416, -6300180, -2988760, -10362682, -1359894, -1226750, 607738, 5790690, -1367410, -2556579, 12854300, -2986613, 556198, -2547453, 936303, -13152800, -12253005, 5003637, -957241, -5944235, -1023276, -2663417, -3799436, 5025649, 3067681, -2962991, 2232309, 5114233, -2835752, --17869212, -7825431, -3595961, -2074469, 7819525, -14021994, -10334765, 8446590, 5184026, 21406118, -5943698, 4859756, 5791227, 2629594, -3978750, 333397, -4188667, 6754373, 173409, 6820408, -70330, -291521, -9584220, 4801774, -6555194, 4879620, -1142998, 5123896, 1898376, 6910603, --11099806, 1191317, -7765838, 9029095, 356482, -9226663, 11872900, 8862128, 5510443, -5551782, --18659486, 5234492, -2270964, -2343979, 8722005, -924492, 3845070, 8675297, -2294050, -11094437, --506806, 4935455, 2753611, -2983929, -1780801, -8110509, 2363843, 1111323, 926639, -1219771, -159451, 6931004, -5650030, 2931852, -2962991, 4899484, -4757750, -19732154, 4403415, 5201206, -20626580, -3935801, -2960843, 9944460, 12927315, -20250234, -11442867, 11582990, -5546951, 717260, -4904853, -12768401, -28432684, -10930155, 16608639, 13330505, 11262478, -2983392, 6431714, -2995740, -5939403, -5625334, 2259153, -14127758, 3805878, -4747013, 7676717, 7591892, 492848, -6466610, -6994891, 4642323, 11899207, -825707, -7038915, -3221762, -18200460, -9014599, 4696547, -834297, --12155294, 8768176, 11617887, -15842524, 15847356, -1086090, -1620813, 10304700, 2115272, 9773735, --1177895, 3780645, -3542274, -1450625, 4700305, 19237696, -6874095, 12430709, -1153736, 1611150, -4264903, 10924786, -9967008, 1658931, 14762339, 5126044, -7706782, 4686346, 4960151, 2098092, -10259066, 9404368, -1133335, -13254806, -3548180, 13314399, 8334921, 10011032, -6844031, -3468723, --1322850, -1548873, 14166413, 1755031, -15157476, -6721624, -4858145, 9452686, 1530619, 1986422, -7748121, 17678086, -26574036, 17346300, -3840238, -3118146, -7182796, 5171141, 4917738, 10231686, -1137093, 9770514, -1483374, -2544768, 2522220, -1553704, 4450123, 9047349, 508954, -556198, -11191611, -8611409, -2237678, 3040837, -1668595, 10571525, -12926778, 1341640, -11196980, 1962263, --11868068, -1276142, -455803, 6426882, 14205067, -8404714, -5737003, -8676908, -1486596, -12822625, --9666361, -8199630, 4814122, 11496017, -1032940, 22255446, -14916958, 20078436, -14931454, -2196876, -4464082, 5544803, 17482128, 12434467, -15990700, 9331353, -7671349, -17027934, -858457, -12211129, --7330973, 1112397, 17885854, -1812476, 8666170, 16729971, -11635066, 6978248, -19419694, 13922673, --11404212, -4855998, 21435108, 8199093, 23002234, -7887171, 1465658, -8436926, 7585986, 29198798, -8458401, 10822781, -12737799, -1292785, 2005213, 12114492, 10766409, 19222126, -13168370, -3600256, --14446123, -11922292, 2302639, 2549600, 10640245, -7650411, 7843147, -19903952, 14724222, 11689827, -6143414, -2101850, -1224066, 2936147, 7673496, 3674882, 3101503, 1487132, 15858093, 14093935, -6696928, 2777770, -9707163, -9148280, 31334470, 2856153, 5053029, 18532248, 8709657, -2885681, --2243047, 12571906, 22902914, -13662828, -5266704, -15549929, -15183246, 23389856, 10636487, 2620467, --3084324, 9639517, 16954920, 13224741, 16982838, 8070781, -6343667, 568546, -905701, 6248104, --14203994, -10743324, -4272419, -13335337, 14527190, -1979443, -3864934, -12754979, -2164127, -11920682, --28686086, 4579509, -3572339, -9438728, 6445672, -15608448, -916976, -8748312, -22907208, -5732708, --9893457, -11366094, 18417894, -5428839, -6504728, -3879429, -279710, -5220533, -6302865, -1632088, -5040681, 14897631, 11927661, -1085553, -634045, -26702886, 1894081, 2860985, 11011759, -6733435, --5035849, 38748660, -6374805, -20092394, -18313740, 15569793, -10482405, 3882114, -21708912, 4650913, --5668283, -12822625, -9675488, -26263188, 4719096, 6243809, 18685256, 4212289, -9004399, 13021267, -2449742, 12087649, 15622407, 41336376, 12266963, 1431835, -15810848, -20386600, -4283693, -182536, --1865090, -19729470, 7500624, 15076409, 3588445, -5522791, -17055852, -7242389, -2492155, 5554467, --6139119, 10507101, -5172751, -6795175, 20061256, 10640781, 22782654, 590558, -6460705, -8621073, -24125906, -20290500, -7597797, 28384366, -16821240, 5980205, 5914707, 7670275, 1718524, 16170015, --4851166, 14616847, -5323075, 3565897, 3433826, -6800544, 10568304, -15440944, -11079405, -9811853, --4737349, -13611825, -26125212, -4158065, -7817914, 4792647, -6731825, -34068756, 9657771, 22527104, --1262184, -3896609, 34147676, -41518376, -9162239, 24437828, -5790690, 19205484, -13458280, -7399692, -6354941, -39362840, 13066901, -12659416, 20205136, 16014322, -21444234, 43655120, 6294275, 3649649, --2108292, 18251464, -30564062, 14300094, -1298154, -2857227, 8438537, -17430588, 28413894, 28423556, --46390480, 9864466, 9279814, 2321430, 26962194, -10606422, -32422708, -32560148, 3700651, 5167383, --13709536, 9764071, -17616882, 6995428, -7398081, 18271328, 23206246, 1721745, 22498650, 20475182, --9721658, 726923, -12730820, -2473364, -2119030, 8525510, -210990, -1127966, -1155883, -21415244, --32732482, -12618077, 18905910, 14709726, -13326747, -15711527, 11026792, 10945187, -20783884, 12177843, --13373991, -1673964, 18401788, 24773372, 1535451, -12956843, 10476499, 2915209, 16213502, 3688303, -13811004, 13874355, -2058363, -47423420, 7094749, 2484639, 21312164, -5914707, 21767432, 21166672, --11512660, -64521148, -6963216, 4097399, -5948530, 41086196, 43632036, 30560840, 43493524, -8990977, -21760988, -14436459, 30107184, 21431886, -29839286, 43540232, -39639864, -33030446, -30161408, -24848534, --48029544, 11589432, 19429896, -1436130, 26249766, 10771241, -29796336, -6645925, 7914551, 8838506, -9878962, -5100811, 15747498, 2403034, -7917236, -3083250, 6509023, 21664888, 28147068, 21378736, -33499134, -29685204, -7118909, -6845641, -30084636, -6407555, 6924024, 2767570, 5034239, -11412265, --12676596, 17209934, 37633576, -15890842, 20225000, -10997801, 6490233, -10040560, -238371, -26898306, --8508867, -386547, -37164352, -21525840, -36290328, -30906048, 23177254, 51532092, 41997800, 2501819, --562641, 1502165, -7019587, -15858630, -58846956, -18882824, -6601902, 6529961, 4811974, -19843286, --12750147, 9674414, 29155848, 17920214, 11057930, 19659676, 32549410, 14172318, -27572616, 25807384, --15298674, -6001680, 20260972, 44328356, 10619844, 55238648, -21123186, -34502548, 21144660, -3439732, --20921860, 9935870, 22405234, 19468550, -40354976, -34770980, 8471286, -16176457, 3903589, 19607062, --10905996, -7903277, 32240708, 8803609, -4775467, -10327249, -9483825, 12209518, -7586523, -1397475, --1250909, -13168370, -5419175, -21930104, -29613800, 10547366, 15649787, -18391050, 13165685, 9375914, --6763500, -12684649, 1585917, 23323820, 12922483, 4366908, -23596550, -25692494, -13076565, 7253663, -28543278, -21463562, -12008729, -9572408, 16804596, 47095928, 11820287, -45329620, -10746545, -4948876, -22852448, 1007170, 11489038, -5441724, -11571179, -9541270, -26680874, 24782498, 24689620, 11032160, -26050050, -7640747, 16367583, -7167227, -20804284, -20520816, -24646670, 5339718, -45193256, 46868832, --4808753, -15064598, -28314572, 31556198, 22803056, 6562710, 1676111, 13005698, 11414949, -27292906, --37852620, 8179229, 23229330, 34841312, -3370476, -12080132, -27548458, -17577690, 12481175, -3975529, --24088860, -44742820, -44883480, 5150203, -16091632, 19566798, -51208360, -19248432, 5471252, 3251827, -5242008, -18631032, 3064459, -4904853, -12788802, -5426691, -26192858, 16867948, 21402358, 15123117, --34004868, -19801410, -4774930, 6363531, 10974715, 12290586, 8779450, -7314330, -6377490, -8053064, -17150878, 55479704, 33216204, -35156992, -34973380, -23642184, -43859668, 41914584, 20009178, -18845242, --45552424, -43709884, 39484708, 22473416, 880468, 29104310, -40723808, -9264244, -3195456, -14816027, --2110977, -19317690, -41648836, 2286533, -33273648, 29356102, 29090888, -21547850, -10274636, -9168145, --12032351, 23686744, -37677064, 33557116, 49495740, 53464288, -59426780, 11253888, -1311039, -4955856, -25993678, -10678362, -17164836, 17680232, 9638443, 36510444, -3000035, -28846610, 1628330, -13200582, -22333830, -33237142, -10906533, -15705622, -21218212, 30109868, -21226266, -3359738, 21809844, 11847667, --6352794, -11887396, -29994978, 3661997, 41959148, 24502788, -640487, 11717208, -8065949, 32905892, --21313776, 14893873, -11192685, 20167556, 35737348, -8277476, -21092048, 10394895, -29205240, 49876920, -7289633, -27576374, -7808251, -42644192, 6740951, 59192164, -9512279, -36099736, -23240604, 35964984, -12380780, -20103668, 382252, 8724152, 21936008, 49866180, -40036076, 17827872, 42462196, -6597070, --48194364, -47374564, -27380416, 83682608, -60834992, 22150756, -60921964, -22340272, 21578452, -56521232, -9662603, -50788524, 22124450, 23774254, 47029892, 20772610, 10588168, 12231530, -14998026, -36259724, --25417080, -23840290, 9842454, 5792837, -6464463, 21528524, 33017562, -14986215, -21275658, 23097798, -3768297, -30881888, -7457137, 13941464, -25820270, -4507568, 5229660, 12956306, 6498286, 18338436, -30985504, 5581310, -20462298, -2262374, 5600638, -15838766, -7575786, 14770393, -11634530, -20034948, -27519466, -6633040, -7449621, -11001022, -11536819, 18329846, 4086125, 4344360, 23621784, -11337103, --19249506, -838056, 1213865, -7646653, 5583995, -1008244, -7262790, -861141, -24174224, 5633387, -3989488, -3585224, 12073153, 9039296, 3835406, 6193880, -24883966, 29377040, -11242614, -9805410, -8602819, -25726854, 8969502, -19304804, 4638565, -25692494, 42807404, -1687385, 24432458, -21230024, -3155727, -3414499, 8020315, 7373385, 13283260, -6015102, 9880572, -5323612, 5626407, -382252, -4527433, 10780905, -869194, 16415365, -5978595, 12556337, 999117, 98247, -4118874, 8276939, --5755256, 7548942, -3743064, 1126355, -3062849, 4444755, -2457258, 9674414, -2523293, -5624260, -14704357, -9282498, 7800198, 6793028, 2455111, 7732015, -8633421, -5388037, 6818261, 6972880, --3723737, -31139, 7208566, 191663, -9731322, 5185636, -4920422, 5949067, 6908455, 4150549, -2357400, 3178276, -10636487, 6181532, 2896419, -2149631, 3726421, -3879966, 2192581, -1301375, --799938, -67646, 3269007, 8511551, -10464688, 10337986, -2522757, -1793686, 4008278, -4977867, -1751810, 6673843, -1817308, 10722923, -35477504, -111029200, -16143171, 54188528, 28155658, 131448008, -24639154, 28388124, 17997524, -35213364, -49570364, -35344360, -63605244, -54742580, -30872762, -12642236, -36810556, 99817728, 79352208, 68219648, 38998840, -30584462, -49636400, -36647884, -68507416, -65093452, --19681150, -9077413, -14899242, 25327960, 39834212, 26189100, 48518100, 37283000, 11733851, 34287796, -7329899, -5072893, 3514357, -20641612, -53967876, -46189152, -38873212, -55089400, -22679574, 16072304, -11462731, 35243964, 40349608, 34869764, 36253284, 36542656, 23630910, 22622130, 2943663, -20382304, --37493452, -25983478, -35247184, -47312284, -22750442, -21736830, -17103634, 6636262, 18506478, 17113834, -34025268, 41733660, 20869782, 29452738, 25858388, -6898255, 3727495, 11418707, -13035226, -13003013, --19846508, -18107046, -9757629, }, -}, -{ -{ -1566589, -2699924, 383326, 1531693, 3398393, -1061931, 3617436, 936840, 667331, -4192425, -1037235, --4155381, -501437, 4171487, 3026878, -299037, 1903207, -598074, 1583232, -520765, 1980517, -1675574, 2143189, 5126581, 2151779, -3779571, -343061, -4280472, 2205466, 1586990, -646929, -434329, 476205, -927713, -1342177, 2562485, -1171452, 828392, 2291365, -2279554, 3849901, --901943, -1611, 1830730, -824634, 601832, 433792, 1934883, 3019899, 59056, 462246, --1103807, -146029, 181999, -1702418, -1613297, 1910724, 5183489, -474594, -2897492, -2598992, -1632088, 2559801, 2950643, 1667521, 4212289, 246424, 3053722, -2422362, -1606855, 1927367, --621160, 2571612, -158377, -846109, 1377074, -3542811, 2703145, 1701881, -3491272, -608812, -4500052, 1336809, 1127966, 2476049, -561030, 679142, -1139777, -4684199, -1814087, -233539, --1003949, 1343788, -1418413, -459562, -3935264, -12348, 719944, -2812130, -572304, -3549791, --1218697, -1141924, -4240207, -1983738, 1407676, 1846299, 4845797, 2818572, 6179921, -691490, --949725, 869194, -2063195, 5299453, 368293, 2483565, 4283156, 703838, -1653562, 1688996, --2198487, -3047816, -693100, -1345935, -1599875, -5597953, -1730335, -27380, 932545, 1598802, -530965, 2761127, -3078418, 2426657, 49929, 554588, 1831804, -2256469, -4832375, -2180770, -2160369, 2998961, 2395518, 133681, 2436857, 1744831, 3281355, 1589675, 1429687, -2101850, -146029, -129386, -2658048, 2359548, -4042638, -2514703, 6279779, -1114544, 5540508, -2961380, -456340, 2704756, 1147293, 107911, -3872987, -5438503, -5687611, 527207, 48855, -1657321, -663036, -5023501, 9764608, 1044751, -5583995, 1391033, -2973728, -3195993, 2840584, 4116726, --165356, 878321, 1892470, -362925, -84826, 3225521, -1908039, -857383, 86436, 5926518, --230854, -748398, -2374580, -3578245, 1724429, -913754, -3746822, -1676648, -4489852, 551366, --4088272, 60130, -3131568, -1014686, -2775623, -5506685, -2394981, -357019, 5028870, 758062, --1660542, 2829310, 4572530, 730681, -6646462, 3002182, -219043, 1248762, 1899986, -1443646, -3844533, -1961190, -3946538, -3699041, -7096897, 789200, -2737505, -2171106, -3601330, -5191005, -8047158, -2310693, -7765301, 352187, 2326262, 19327, 2120640, 1718524, -6211060, 1918777, --1643899, -446677, -17717, -1290638, 4284767, -1603097, -3226057, -452582, 3359738, 2099165, -1067836, 1951526, 8526047, 2143189, -3321084, 3801583, -3995930, 1045825, -3291019, 8113730, -971736, -2869575, -1954210, -2873333, -1277216, 5332739, -4739497, -3863860, -1488743, 4393752, -2237678, -4370666, 804233, 794569, -2866891, -31139, -9443022, 2853469, -2512556, -1872069, --6174553, 8530879, 12885, -4667019, -4051765, -4579509, -180926, -1095754, -66035, -161061, --5788006, 6739341, -4501663, -3687766, 2056753, 609349, 1986959, -2053531, -1182727, -4357781, --474057, 778463, -6339372, -4210679, -739271, 7188165, 214212, 1552631, -5963025, 1829119, -3404835, 2496987, -266825, -2980707, 7716446, 1350767, -1564979, 3719442, 3005403, -3606162, -4711043, -3174518, 7784628, 1123671, 6941204, -744103, 1190243, -2717104, -7945153, 876173, -113280, 294205, -1418413, 1650878, 4114042, -1020592, -4119948, -2658048, -5839008, -1566053, --2914672, -3021510, 453119, 2021319, 3049964, -3677029, 2498597, -2448668, -3184182, -381178, -2544231, 533113, 544387, -5733782, -5689221, -1018444, -1782411, -4182761, 9053791, 4304094, --735513, 1807644, 3528316, -9244380, -4875862, 6251862, -3668976, 5861020, 1103270, -1197759, --6471979, -4587025, 7125351, 3915937, 6681896, -7381438, -883153, -5166309, -858993, 1668595, --3288871, 437550, 714575, -12092480, 667867, -1532767, 3302830, -7307350, 2366527, -2448131, -12268574, -3223910, -6325950, -2297808, -5303748, 1685775, 4566624, -1423782, 8580271, 904091, --2507187, 2091649, 1062468, 2259153, -3014530, -504659, 3205656, 5056250, 2008434, -971200, -2431488, -4454418, -1380295, 6354404, 4538707, 7457137, 5287105, -86973, -3754875, -7875897, -5485210, -824097, -5749888, 3040837, -1501628, -8819178, 256624, -7341710, -560493, 6735046, --1107028, -4913980, -2259690, 6442988, -5499706, -8986682, 9223979, -1659468, -2195802, 2233383, -1208496, 1176284, 2257005, 2312840, 1276679, -6560026, -2473364, 5282810, -624918, -1828046, -1644436, 9030706, -4383014, -4681515, -2110440, 3936875, 2016487, -7468412, -3278671, -10549513, --150324, 2915209, 10304700, 10642929, -3329674, 5335423, -6722161, 2307471, 4573604, 6859063, --1901060, 10252087, -1837172, 8704825, -4642860, 7302518, -3559454, -11974369, -2654827, 3068217, --4075924, 4707821, -2527588, -2833605, 1381906, -13138842, -4187056, -218506, -2215130, -741956, --6299107, -2153926, -2197413, 2144799, 13529684, 7796977, -7744900, 4318053, 10835129, 2705293, --3696356, 2715493, -2762201, -3172907, 7820599, 5415417, -5309117, -701153, 5597416, 11557757, --3638374, 6290517, 17206712, 7379291, -7820599, 3191698, 2064806, -9551470, 1501628, -7903277, -3594351, -8621610, -1957968, 317291, 4129074, -5665599, -1493038, -2858838, -5047124, 6482717, -5704254, -467078, -3714073, 770410, 4417911, -2561948, -11000485, 2237141, -8887898, 1153736, --3114388, 10929618, -5923834, 1340567, 2682744, 875636, 3797825, -1870458, 11966853, 732829, --8184597, -1697049, -6103149, -1154809, -2159832, -5686537, -7128572, -1973538, -4682051, -2296197, -7565585, 2707977, -6866042, 2385318, -8148627, -1686312, 5495411, -10961293, -9761387, 5236639, -4842576, 2464774, -564788, -6711424, 2356863, -3387119, -6413460, -3009698, 109522, 1811939, -10017474, -4172561, -1366873, 413391, 4574677, 2393908, -3731253, -4686883, -8376797, -2605435, --1970853, -4605816, -5393942, 3273302, 6736656, -104690, -4440460, 7510824, 1429150, -3791919, -957778, -1158031, -884763, -2662343, -1278290, 4840965, -3563212, -6005438, -2776696, 2692945, --3177202, 5653788, 10692321, -7812546, -208843, 7341710, -3402151, -5061082, 6690486, -10347650, --608275, 2088965, -1343251, -3749507, -4606890, -2045478, 1811939, -376347, 5005248, 2728915, --1706713, -3782793, -2957085, 8488466, 269509, -9862319, 4643397, -6136972, -6344204, 4106526, -7181722, 7699803, 5521181, 118648, 3681324, 2902324, 3453154, -2981244, -322659, -2638184, --7445326, 3424163, -2066953, -12885, -1811403, 1114007, -1428614, 8462696, 14701136, 2914135, --2859911, 433792, -10967736, 10867341, -7595113, -4188130, -7346542, -8013872, 14162118, 1403381, --8473970, -2273112, 9596031, 5872294, -8064875, -4916664, 10988674, 1765232, 642098, 15789910, --7686918, 5138392, -5966247, -13506598, 6250251, 8656507, 469225, -6111202, 4640712, 6040872, -11522860, 10525891, -827318, 8920110, 3786014, 9105331, 8768176, -15612206, 5120138, -5304285, --6991670, -5181341, -1843615, -10087268, -2442763, 2006287, -8716636, -17419314, 3486440, -1566053, --15777562, -11639898, -10482405, -5986111, 125091, -3248069, 3222836, -2389613, 5677947, 11551851, --7253663, 3692061, -3118683, -5817533, -4413616, 367220, -1614908, -853088, 8423505, -727460, -8489540, 11231339, 3001109, 4628901, 7205882, -1369558, 1078574, -11813308, 10218801, -9705015, --3776350, -3347390, 448824, -2957622, -9417790, -8232379, -17731772, 15205795, -18115636, -17439178, -2332704, 15947214, 5236102, -2533494, -4700305, 7084549, -8864276, 8947491, -3386045, 704375, -297963, -6784975, 5846524, -8007430, -6767258, 1772748, 7544110, 9722195, 9692667, 10550050, -24237574, 11155641, 14012868, -6280853, 22447646, -12139188, 974421, 5339718, 259309, -7818988, -3107409, -1801739, -18473728, 7633768, -4406100, 2534031, -1438277, -5711233, 327491, 6129992, --7291781, -3400540, -887448, 4980015, -11190537, 7838852, 3023120, -9943923, -555125, 4879083, --9276592, 4172561, -11187853, 5890011, -747324, -3073586, -223875, -6830609, 9812390, 12002286, --10628970, -5519570, 5086315, -3175592, 3180960, 3431679, 869194, 1071594, 13218299, -2581812, --8658117, 8846559, -263604, -6142877, -5750425, -10121090, 2098629, 3739843, 5394479, 6002217, --5136244, -7680476, 4545686, 3125126, 16073915, 2444910, -2496987, 1039919, 338229, -4416837, --3503083, -12709882, -14299020, 24309514, 17018272, 21742736, 1562831, -13707388, 5071820, 11407970, -8216273, -3401614, -8566849, -2453500, -3018288, -4135517, -7338489, -2917357, -6126234, 16201690, -2790118, 2752537, 342524, 1023813, 1933809, -5875516, 10882910, 6083821, -405874, 3932043, --1285806, 11014981, 2255932, -935229, -17708688, -1302986, 1364726, 1722819, -3122978, 2245194, --8262980, 14553497, 12036109, 11361262, 10175314, -7857643, -10588705, 8245801, 2788508, 3984656, --488016, -12693239, -8895414, 611496, -6896107, -56371, -5769752, -2763275, 7740068, 2206003, --5231807, 1695438, -13788993, 145492, -23505820, -12337830, -22243636, 18852222, 17373142, 18019536, -22393422, 10214506, -3894999, -10871099, -3373160, -1940252, 2604898, 14784351, -8440148, -11391327, -10280541, 13333189, -6369437, 12400107, 1826972, -5033702, 5015985, -17570712, -5423470, 5194763, --5579163, -10683194, -20445118, 10292352, -8753143, 2600066, 13343390, 3430605, 15542950, 12109660, -6780680, 2815888, -9114457, -2396592, -4759898, 1145146, 8654359, 4823785, 1801202, 7712688, -21081310, -732829, -17906792, -7477538, 2901251, 4716948, -1023813, 886911, 1695438, -7170985, -467615, -16360067, 3787624, -17102560, -6440304, -13082470, 6717866, -6192806, -11217918, 17776332, -4789963, 2120640, -7704098, -9472550, 2560338, 4929012, 1510218, 6520297, -8736500, 20277614, --23330262, 7242926, -9700721, -12854300, -7893076, 13749801, 3754875, -11519639, 9472014, -8447127, -26030186, 308164, -2809982, -8651138, 1082332, 24345486, 25051470, 23629836, 4998268, -6396280, --4016868, -15299747, 12328704, 321586, 7208029, -4605816, 2273648, -5617281, -4356708, -8858370, -4698694, -9220758, 15013595, -39399884, -11533598, 250182, -11985643, 8430484, -12320651, 2489471, --4810900, 12353400, 2120640, 11892228, 778463, -2837363, -279710, 4339528, -13882945, -9929964, --10823318, -1539209, 13324062, -26497264, 9084393, 23008676, 2723009, -16959216, -780610, -14286135, --13798119, 9455371, -1917703, -11673721, 6347425, 951872, -4487167, -6605123, 3617973, 9552007, -5652714, -13564044, -10062035, 7715372, 11479911, -9570261, -12812424, 6159520, 12836584, -15974057, --829466, -14297409, -19819126, 23038742, -4260071, 3350075, -4858682, 13969381, -4068945, 2717641, --8647380, 10086731, -6092948, -1946157, -20402706, -10338523, -5896453, -17535814, -24515136, -5845988, --9239548, 20058572, 4919348, 30583388, 4226785, -10800232, 2659659, 4530117, -27868970, -69256, -21466246, 13073880, -16918414, 514859, 9911711, -22696754, -5013838, -12164421, 7329899, -9876277, -4260608, -185220, -5833640, -483721, -1730872, -8429410, 5498095, -15997143, -7315940, -7831873, --19741280, -5473936, -4134443, -1427540, -494458, -6645925, -7491497, 31074088, 8023536, -14545444, --25136832, -10252087, 419833, 21874806, -7742753, -4991289, -15314780, -5486821, -11449309, 17460652, --18014166, 15299747, 19732690, -24381992, 12308839, 3325915, -11944304, -10736881, 2738579, 7837242, --51364052, -9071508, -3122441, -9548786, 9506373, -9813463, -39820252, -18052284, -13959717, -6905234, -5454609, 32274532, -1041530, -37574520, -21149492, -23206246, -4493073, -12771622, -700617, -18963892, -31144956, 18799072, -3567507, 24851754, 488553, 26814554, 6107444, -15052787, -21199958, -12858595, --17187922, -7177964, 3776887, 11861626, -4111358, 4195646, -14337675, 2871186, -20533702, -1284732, --1611150, 7487202, -8039642, 32840394, 3641596, -154082, 20826296, -7558606, -15732465, -8091719, -12496744, -136365, -9239548, 4523138, -781147, 28410134, 6072547, 1172526, -11354820, -15362561, --42533060, 3980898, -33973728, 18198314, 56129852, -39190504, -9543417, 10858214, -7877507, -5381057, --12293807, 11482595, -12616466, -37208376, -11388643, -36865316, -9140227, 1505386, -25518548, -510027, --36265092, 18716930, -4244502, -18692234, 55031416, 8337606, 23633058, -12176232, -66677756, -7355132, --17381196, -18975702, 23667418, 18690624, -23667418, -18788872, 45025752, -5593658, 14296872, 1909113, --2838974, -5680631, -5408438, -15204721, -628676, 4821638, 7679402, 5071283, 15793132, -13201119, --779000, -12874701, -7887171, 4617627, 22601192, 14409615, 19902342, 17855790, -4572530, 6195491, -10493142, -389231, -19170050, -3820374, 25439092, -5050882, -37471980, -16719771, 3593814, -31774168, --14024679, -32552094, -22541062, -20500416, 29245506, 19893752, -6897181, 19910394, 7385197, 28256052, -18848464, 8798241, -50861540, -11695196, 1889786, -44781476, -32789390, -12898861, -8937290, -52386788, -10935524, 28271086, 38316476, 45683956, -15627775, -30528090, -323733, -30780420, -22414360, -42522324, --46538120, -33319820, -27537720, 31556736, -18921478, -48002164, 20943872, 3990025, -32111860, 33107218, -17287244, 11308112, -5706938, -28562070, -5909875, 2501819, 31078384, 40662068, 4010426, 12170327, -4270271, 2833605, -81068, 6894497, -14566918, 56599080, 14999636, -16336445, -16150688, -6376416, -4253092, 28493886, -11164231, -2457795, 1869921, 15226196, -11175505, 8795019, 2821794, -1400696, --43484932, -12588012, 16510928, 25184078, 10330470, -3407520, -11106249, -28308666, -1259499, 6586333, --5089000, 2224256, -5764920, -17605608, 21547850, -2749853, 9064528, -18897320, -2212445, 54663124, -6111202, -4033511, 8326331, 8769786, 7143068, 28537910, -7602092, -10069551, 21998286, -211527, -13882945, 9473087, 19342922, -4454418, -17739826, 12330851, -7396471, 4205310, 75893144, 75022344, -31416612, 16039555, 32433446, 664109, -42848204, -14467597, 4421132, 1435056, -13404056, 24828132, -10405632, 6952479, -13747117, 29712046, -6120329, -3641596, -13232794, 13683229, 8043937, -30734786, --42200740, -15311022, 2415919, -2468533, -11276974, -39831528, -7464653, 7742753, -1097901, -16670379, --8777839, -15480673, -17394080, 3251827, 6114960, -27592480, -29084444, -13935021, -35133368, 3239479, -23622320, -29433410, 22578644, -17875118, -18343268, -32603096, -41390064, -48071960, -43801688, -26484916, --3744138, 9188009, 3312494, 8964670, -24814174, -53564148, -22272090, -51920248, -83198888, -37067180, -60530048, 102837624, 60830696, -34172372, -25126096, -105145096, -91063504, 53070228, 7310571, 71790376, -79722112, 77495168, 25962004, -43654584, -45555644, -57359288, -56828860, -15223512, -4490389, 6665789, --25883084, 33961380, 15939161, 30010010, -69111928, 14395120, 8439074, -22118008, 14555107, -16860430, --8465917, -5871221, -10433549, 28195386, 53560928, -16985522, 10306311, -8820252, 12444131, 26257282, --8923868, -6354404, -15450071, 6567542, -9917079, -31268436, 21479132, 35456564, -5143760, -20721606, --17918604, -40269076, -10864657, 27972048, 19883014, 8777839, -42803108, -26308286, -18621368, 36333276, -32935420, 27289686, -83308408, -57068304, -6505802, 39777840, 88476864, -1127429, -105567072, -40386652, -4064650, 34331284, -2292976, 18259516, 15571404, -47584480, -19414326, -13998909, -26765162, 858457, --50975356, 7262253, 21984864, -63672892, -38771744, -19998978, -6215355, 69831336, 1835025, -106290240, -13180181, 16836272, 20555176, 45490148, 27966142, 23477902, -56667260, 7907035, -41712724, 7496866, -34891240, 31112206, 9835475, -20131048, 3633542, -11893301, -3424700, -14729053, -11502459, 7841537, -1495186, -21401822, -3110630, 11574937, -3077881, 1636383, 3352222, -13390634, -14468671, 124017, -8207146, 1746441, -22928146, 2444910, 10321343, 4221416, 1586454, 23780160, -3647501, -5325760, -7076496, 9713069, -16840030, -16304770, 11471321, 3536906, -14694157, 10056666, 2339147, 5560909, --10899553, 5087389, 8717173, 2719788, -14901926, 19301046, -4119411, -18150532, -1507534, 17404818, -2584497, -10976863, 9392020, 6125697, -20759188, 9865540, -1931662, 21157008, -19905026, 4441533, -9294846, -26103200, -2913062, 16355235, -4844723, 12985297, -9917616, -13906030, -3516505, -14002130, -11109470, -27322972, 46426448, 7099581, 21332028, -17185238, 8528731, -3211562, 6148246, 5667210, --7037841, 3746822, 9000641, -4151623, 18869402, 1512365, 1202591, 6910066, 6576132, 28454, --4052302, 8513699, -611496, -4658429, -511638, 8568460, -7864622, 2555506, 4413079, -10001368, -14027900, -1905355, -5897527, 21422224, -7922604, -11361799, 10052908, 6050535, -5134634, 9772661, -7723962, -1654636, -2352032, -758062, 3237332, 6011344, 3554086, 843961, -3032247, 11523397, --10798622, 11099806, 2108829, -318901, 3350611, 4169876, 3803194, 1418413, -9593883, 3803194, -9160628, -5193153, 430570, 1014149, 7062537, 355409, -2142115, 11029476, -4668630, 6404870, --9966472, -2809982, 10405095, -8578660, 10001368, -1716376, 6728067, 10613938, -37866580, -120941984, --6208912, 65025268, 29184840, 138629200, 11800960, 29175712, 1199907, -40593348, -50971600, -34666292, --62102004, -43610560, -27310086, 820339, 47453484, 93237832, 68794104, 59644748, 19547470, -32721208, --47693464, -43154756, -50528144, -56356412, -22650584, -10997264, -4786741, 27149026, 36492188, 27165132, -50979652, 32555316, 12344273, 33831456, 984084, -15103252, -9592273, -30913564, -62561568, -38471096, --36509908, -37791416, 2233383, 17144436, 12367358, 45823008, 38167228, 25755308, 37575596, 39251708, -11606075, 11541114, -3787088, -34405908, -46904264, -36512052, -46960636, -34056408, -11204496, -8611946, -3595425, 25649544, 21011516, 18137646, 37420440, 30168388, 23301272, 37890740, 11773042, -7218230, -449361, -14010720, -29520384, -16951700, -28831042, -18379238, -7886634, 0, 0, 0, -0, 0, 0, }, -{ --522912, --292058, -565325, 4009352, 2597918, 440771, -1506997, 2077154, 3594888, -1101659, 3978214, --2531346, -810675, 2589865, 882616, -4480725, 1421097, 2778844, -6218576, -113280, 5133023, --3015067, -4310000, 4304631, -3466576, 875636, -2539936, 370978, 334471, 381178, -228170, --3140158, 4502737, -2037425, -1030792, -2770254, -2889976, 176631, -618475, -2095944, -3569118, --2871723, 5473399, -601295, 2137283, 1509144, -349503, 4178466, 1117228, 2911988, -325881, --2171106, 2853469, -4024384, -2179159, 36507, -428960, 409096, 973884, 3021510, -1032403, --602369, -1225139, 843424, -418222, -747324, 1876901, -62814, 2343979, -440234, -1940788, --1645509, -7516, 475131, -737124, 981937, -2665027, 764504, 3340411, -183073, 392453, --4699231, -2312303, 811749, 6468758, -4001836, 1433445, -6507949, 6890738, 551903, 2593087, --674847, 1182190, -1167694, -2222109, -5640903, 2543158, -5654325, -2582349, -3141232, 3384971, -2712809, 1367947, 2823941, 5230734, 450435, -4521527, 3171297, 621160, -97711, 2627446, --799401, -1555315, -6659347, 1233193, -1815697, 1620276, 2982318, -3541738, -1330903, 3496640, -1191853, 547608, -3313031, 8869107, 5398774, 1015223, 4368519, 3634616, 3520263, -7787313, -661962, -586263, -1937030, 2151779, 1501628, -1066763, -1297617, -200790, -2182380, 2596308, --685047, 4904316, 59593, -884763, -1948841, -3714610, -466004, 3523484, 171799, 1216550, -4008815, 1739999, 527744, 1751273, 494995, 2195265, 7337952, -3376918, 2528662, -1867237, --3012383, -1158031, -2050847, 4071092, -3141769, -5915244, -1429150, 1723356, -4923643, -2911451, -5803575, 9965398, -1543504, 3894462, -3258270, -3410204, -44023, 1178432, -319438, 42950, -3761855, -6085969, 2147484, -309775, -1191853, -5101885, 572304, 279173, 3076270, 1045825, --3995393, 5586679, -4198868, 5227512, -449361, 1089311, 2178622, -419833, -2408940, 4137127, -1097901, 5472325, 933619, -4471598, 8586713, 6917582, -2206540, -486405, -1486059, -5666136, --3027952, -750009, -853625, 2598992, -3064996, 495532, 2501819, 255014, 115427, -119185, --323196, -2941516, 5385889, 442382, 229781, -1329292, -99321, -4422743, -3206193, -7954817, -8840116, -2449742, -1516124, 6191196, -3015067, 2983392, 14289356, -2199023, 12885, -6063957, --4971962, -7449084, 3639448, -3333968, 1560147, 3425773, -4842576, -4212826, -3192771, -125628, -1023813, -5896453, -2564632, 1937567, 1616518, -2609730, -1316408, 2882460, -3868155, 86436, --2139431, -1073205, -2826625, 1588601, -2630668, 451508, 1518271, -1357747, 5748277, -198105, --1279900, -5033702, 102005, 6152004, 467078, 1768453, -6504728, -9110163, -3596498, -7904888, --7029251, -643708, -3301756, -731218, -8442295, 6339909, -7860327, 607738, 4560719, -5043902, --8215199, -5962489, -2142652, 4636954, 3998615, 6367826, -4603131, -4024921, -3442953, -2915209, -4297115, 787053, -2790118, -1589675, 1473174, 8005819, 810675, -3233574, 424665, -2669859, --631897, 5621576, 9372156, -3203509, -3345243, -8519605, 1024350, 2178622, 4798016, -3179350, -5172215, 882616, 7997229, -6415608, 956704, -12159589, -1434519, 1545115, -3082713, -2656974, --1178969, 4614406, -3796214, -6311992, 1715839, -9302899, -2170569, -4387309, 1963337, -845035, -3069291, 594853, -7318625, -7577933, 83752, 4345970, 7559143, -1301375, -3265249, 6688338, --7241852, -3597035, 3289408, 3352759, 4951024, -4544076, 41339, 2310693, -3204046, -660888, -2870112, -4006131, 5613523, -2058363, -1195075, -5648419, -5214091, 2993592, -118112, 702764, --954020, -3109556, 3496640, -1629403, 4400731, 767189, -5822902, -5148592, 2374043, -1852742, -1401770, -6833293, 5281199, -12599823, 3514894, -5215164, 5294084, 5945846, -5680631, -11009075, -2115808, -1088237, 7772817, -3925600, 11034308, -3998615, 7486128, -8181913, -2650532, 4010963, -5719286, 1859721, 519154, -4874251, -127238, -3755412, -4615479, 3270618, -3843996, 2119030, -1615982, 2515777, -1908576, 5265630, -295279, 4577362, -313533, -7701950, -694174, -2225867, -1481227, 8396124, 1190243, -353798, 281857, -2931852, 3505767, -2753074, 4992363, 4914517, -2435247, 2075006, 8900783, -1712618, -648003, -6204081, 5470178, 4350265, 1742146, 1309428, -1777043, 584116, 3343095, 5168457, 4323959, 2089502, 2884071, -1080184, 7603166, 2343979, --78383, -4851703, 3883724, -1430224, 10936060, 5295158, 2933463, -4505421, 310848, -16558710, --8857296, 3651259, -2989834, 7030325, 7065221, 10445360, 4537096, 4361540, 2842732, -12047383, --2410551, -1484985, 1445793, -1029182, 4173098, 2900177, -4353486, -3592203, 3524558, 6136972, -7920457, 6646999, 8954470, -4560182, -4283156, -6105296, 7013145, -3716221, 5876052, -1294933, -146566, -5759015, -3051574, -3282966, 5406290, 6140193, 1539746, 6118718, 9212168, -3482145, -2693481, 10225243, -4663261, 3273839, 3985730, 303332, 8232379, 9774272, 8048232, 17002164, -3731253, -2606508, -2612951, -3147674, 390305, 2767570, 5790153, -1242856, -1069447, -2159295, --3965866, 1525787, 3130494, 3971771, -10031433, -2018098, 3398930, 6454262, 5666673, -9904731, --6034966, 806917, 2451890, 6264210, 4179540, 8259759, -945430, 1797444, 7052337, 10355703, -5839545, -11111617, 118648, -11821897, -8429410, -4971962, -931471, -7146826, 8814884, 3439732, -5232344, -14701673, -1029182, 9978820, 4993973, -4139275, -6244346, -3578782, 3821447, -11145440, --655519, -7053410, 11230266, -1185411, -3287261, 1506460, -412317, -1598265, 1963874, -2622078, -5188858, 4071629, 7462506, -171799, 344671, 11972758, -3703336, 8171712, -1306744, -906238, -20323248, 2909840, -2243047, -4089346, -15823733, 2207613, -16218333, -2135673, 16944720, -4175245, --3371549, -11147051, -3528316, 1149978, -6410239, 4211753, -664646, -7789997, 9174587, 4263292, -2990908, 3625489, -6378564, 8286066, -10895795, 4661114, 4412542, 2303713, -1063541, -1924145, --2460480, 1271847, 6999186, -13029320, 6131066, -4367445, -6409165, -6097243, 5446556, 6853694, -4149475, 11623792, 8675297, 2032593, 3752728, -8485245, 2152852, 4326643, 9102109, 2037962, --3833258, 3537979, 4444218, -7577396, 1516660, -7783555, 6698539, 6114960, 7795903, -6894497, -4776541, 8296803, -3243237, 2383170, 10928007, -537, -6189048, -4890357, 2711198, -1433982, --6299107, -2425583, 476741, 1856500, 3961571, -4285304, 7723962, 4778151, -1343788, 9190156, --760209, 3654480, 12007118, -12137041, 23222888, -10278930, 3469797, 7150047, -2075543, -1043140, -3202435, 15724949, -554588, -1945620, -187905, -3500398, 7787850, 8609262, -2480344, 3745212, -3191161, 2850785, 5303748, 6707665, 586263, 7187091, 1408212, -6274411, 7902740, 10320270, -6445672, -10333154, 20680268, -6099391, 4137664, -14644765, 6210523, -12906377, 10504953, 1401770, --2606508, -7144678, 9926206, 1650341, 6407018, 6747394, 3488050, -10785200, 5902359, -6378564, --1046898, 5408438, 5652177, 1656784, -1905355, -10784663, 1715303, 10686416, 1297080, 7062000, -7587060, -11264089, 6549825, -5524402, -5746130, 9021579, 9635759, 5371394, 5452998, 1906966, -5217849, -11602854, -5305359, -3415573, 392453, 13228499, 6178311, 5500243, -925565, 6056441, --278636, 14529337, 5201743, 5775121, 2143189, -363462, -20884816, 8156680, 4905927, -1513439, --1505386, -15167140, 123480, -5550172, 3721589, 13965623, -2243047, -7377143, 15927886, -325881, -9169755, -4878546, 520228, -9349070, -260382, -3968013, 3854733, -533113, 12984760, -11951820, -1319092, 4398047, 5701032, -20455856, 12930536, 3205656, -14514842, -9602473, 7450695, 17258790, --6552510, -3798899, -12566001, 24897388, 9642202, 975494, 4001836, -14017700, -8894340, -1225139, -895501, 12528420, 2663954, 9470940, 11266773, -1250372, 534187, 7196218, -2266669, -9329743, --8289824, -2925947, 11205033, -7022272, 14224932, -7592429, 20960514, 8388608, 16899086, -5633387, -2668785, 12554726, -10682121, 5216775, 6105296, 4581120, -6112276, 5990406, 1744831, 967978, -6207302, 11535745, 10935524, -12593918, -2530273, 4063039, -10703059, -8615168, -2718714, -23989540, -6096169, -12984223, -6590091, -129923, -2374043, 5065914, 14618458, 6244346, 6559489, -10711112, --122407, -15686831, -23258858, 12936441, -9334575, 10648298, 3637837, 5272609, 6400038, -15550466, --28476170, 2771328, 4383551, 16404628, -15717433, -17257716, 15323370, -5798206, 7096897, -3068754, -3826816, 2623151, 4212826, -7734163, 4080756, -918049, -2259690, 10202695, 3958886, -1202054, --12715788, -1535451, -135291, -2151779, -381715, -6773701, -16941498, -7399155, 12847321, -5133023, -6455336, -9498857, 7452842, 3959423, 108448, -4659503, -21069498, 12025908, 11671037, 14951318, --10044855, -4104378, 20217484, 17918066, 8394514, 4058207, 11525008, 4421132, 10376641, -5175436, -9039296, -16570521, -850404, 4982699, -4173098, 20337744, 985695, 11257109, -6345278, -10478110, -23350664, -91268, 9360881, -2774012, 486942, -26982596, -2013803, 6190122, -12296491, -15942382, --5006322, -4123706, -26949310, -25283398, -7031399, -376883, 18107046, 14681809, 14465450, -6291054, --2969970, -4235375, 15472083, 6419903, -7293928, -1651952, -5928666, 11142219, 8422968, -7139310, --9957345, -9040906, -18161806, 6911140, -104153, 78920, 3236258, -3037079, 6059125, 24314346, --14678588, 7063611, 857920, -9900973, -6077379, -11673184, 3660386, -5376226, -6316287, 12461848, -931471, -4587562, 12275017, -2058900, -6356552, 4214437, 8769249, -5450314, 9467719, 17960480, -16881368, -12206297, -841277, 4205847, 9211631, -15335181, -3847754, -4295504, 18246632, 8018167, --2723009, -11498164, -13452374, -11263015, 16436303, 14363981, -27714888, -22236120, -17710834, -11469710, -3626026, -9863929, 6387153, 3762928, 2738579, 21510270, 16865800, 10372883, 1294396, -14557792, --7795903, -2478196, 5464809, 8811125, -13049721, 3045669, 340376, -11006927, -5569499, 8485245, --6899865, 6718940, 2461016, 7952132, -10606959, -197032, -23049478, 3230889, -29030758, 11578695, -10950019, -11155104, 12414603, 15480673, -214748, 4360466, -19043348, 10761577, 341987, -7649337, -9169218, -2365990, -666794, -177704, 369367, 19182934, -3055332, 7516, 22576496, -178778, --11846594, -30983894, -26586384, 28491740, 16576963, 7121056, 5978595, -11728482, -25178708, -11585674, -2468533, -8994198, 17301202, -777389, 959925, 20446728, -5804649, -6001143, -6360310, -12433393, --23629300, -16863652, 46551540, -23444078, -13401372, 14220100, -27962922, -17790828, 13520020, 24373402, -1933272, -6425271, 2197950, 5615133, -20404316, -15137612, -10683194, -18685256, -2013803, 17059074, --1625645, 3251827, 8187819, 5360656, -15150497, -7468412, -12592307, -6849399, 15268072, -5092758, --2105071, -2452426, 9089761, 9167071, 27846420, 4204773, 20380156, -1509144, 6588480, -11620571, --8975408, 7168838, -14871861, -16311749, 59056, 4772783, -8707509, 6308770, -10127533, 2670933, --25856776, 13884019, 7386270, 11312407, 889595, -10559177, -21810918, -7821673, -2496450, 17264694, --13969381, -8128763, 4221953, 39807904, -11776263, 40480068, -25726318, 9647033, -10020696, 17657684, --7965554, 30688616, -30010010, 44045428, -5251135, 8930848, 17940078, -32943472, 27866284, -35154308, -22024056, -57171920, 28965260, -29384018, 23427436, -38238632, 29894046, 1304060, 13910325, -17215302, --15572478, 18901078, 32309428, -26106422, 40856952, -1967632, 315143, -1165010, 7347079, -11660299, --8562017, -17661442, -3754338, 989453, 313533, 319975, 16189342, 3146064, 17709224, 17517560, --10644540, 6716792, 36637144, 12329777, 7996692, 5894843, -31419296, 2042257, -4966593, -3526168, --28843926, -5695127, 16761110, 5137318, 5619428, 8807367, 21151640, 5935108, -6487548, -1735167, --1830730, 8336532, -14409078, -8418673, 21692806, 13930726, 10004053, 17241610, 12246026, -6938520, --3930432, -24743306, -11360188, 10583336, 7657390, 19313394, -14171781, -6491306, -5408438, 14230837, -7412577, 12763032, 4247723, -9724343, -10340671, 31477278, -11025181, -30480310, 5204964, 21867290, -12645994, -898722, -6175626, 1525250, -869194, -686658, 8924405, -11874511, -63551020, 18248242, --7231651, -3557307, 16325171, -10371809, 17491254, -1793149, -27153856, -4604205, 3348464, 10199474, -13072807, 3315715, -19008452, 19898046, -6945499, -1379221, -11383811, -5066451, 11184632, -1730872, -10074920, 16053514, -2865280, -19969988, 5294084, 22572738, -19923280, 7913477, 18118856, -2878165, --12862353, -25343528, -16392816, 18279918, 47162500, -14038101, -17536352, 52315388, -2461553, -7338489, -38486128, 21989696, 19638202, 15189689, 7208029, -10925323, 20115480, 17835388, 13320304, 5724655, --33372970, 21585432, 20231980, -36401996, -19859392, -13089987, -8951249, -10059887, 41043244, 19795504, --21364778, 21174188, -6985765, -21337398, 10761577, 10700374, -7781407, -9145596, -31597000, 3553549, -7638063, 24029268, 14090714, 1838246, -17193828, -69881800, 21294448, 39254928, -24582246, -5161477, --19182934, 40428528, 26991722, 17049946, -3495030, -14191109, 2615098, 16305843, 7275138, -7044283, --1904281, 22341884, -1857573, -8198019, -30341260, -14143327, 24778204, 14726369, -16419123, 12818330, --12068858, -3577171, 6986301, 7192997, -7576859, 4686883, -26910118, 7617125, 34720516, -4388383, --7703561, -34718904, -21800718, 17037062, -28408524, -14790794, 5291400, 7139847, -9577240, 22992570, -20390894, -22032646, 7029788, 12539694, 34367792, 32905892, -6653978, 10888279, -2480881, 37607272, -14510547, 15367393, 33539400, -15637439, -25274808, -11665131, -31983010, 25219512, 9215389, 12440373, -3611531, 42681776, -31345208, -6285148, 14442901, -9677635, 15910706, -474057, -2389076, 10248329, --28508920, 17644262, 29002840, 25465934, 26246008, 33292976, -16879222, 26502632, -47598976, -20095616, -20100984, 5757404, 37395744, 17697950, 32137092, -11996917, 5624260, -25252798, 19615116, 31023622, -28675350, 3990025, 20817706, -45906220, -29042032, 30503932, 10213969, -28172838, -13468481, 4798552, -44989784, 14543296, -15830176, -21035676, 6203544, -5323612, 28433220, 29866128, -972810, -3535832, -7606387, -7029251, 36346696, 10996190, -6177237, 8028368, -14345728, -8630200, -75011600, -25123948, -15878494, -10982231, -9339943, 700617, -11640435, -12842489, 37680820, 24740622, -15359340, 33345052, -69337416, 14893336, 50244676, 7795903, 12488154, 36211944, 26062398, -17352204, -18072686, -35865660, --19745576, -448287, -32948304, 16356309, 462783, -32020054, -18836116, -18626200, 1216013, 32364190, --1497333, 27800786, -14949171, 8833137, -55649892, 18138184, -6966974, 31508416, -5608691, -32337346, -36251136, -10937671, 6976638, 21731460, 16368657, 33721936, -3182571, 6949257, -4396973, 38211252, --6060736, 9042517, 26678726, -26697516, 26306674, -4973572, 16674137, 26312580, -4953171, 7732552, -5507759, 4860829, -6276021, 13119514, 11828877, -1764695, -12681428, -94489, -15039902, -2831457, --1741609, 16052977, -5539434, -23541790, -15881715, 30254824, 29226178, -23631446, -20748988, 35794796, -40145596, -12186433, -2549600, 30850750, 2417530, 17326434, 21634288, -44014288, -12637404, -124017, -46803868, 7328288, -1997697, -41554884, 10125385, 20964272, 12753905, 5124433, 13248900, 8426726, -7350300, 61419108, -822486, 8718247, 33249490, 32693828, -56260852, -4246112, -47610248, -44300976, -10797011, 8791798, 7843684, 600759, 41590316, 23246510, 53629648, 58236000, -6547141, -29553670, -6107444, -8525510, -5371931, 12029667, 5738613, -5477157, -26993870, -30421790, 32214940, 13972602, --3484829, 4008815, 5426691, 1986959, 6162205, -4048007, -7388955, -44851268, 1298691, 23991688, --6983617, -34940096, -10640245, 26439282, -50921668, -19010062, 33027224, 18265422, 39390756, -2601677, -3463354, -37348500, -35451196, -47167332, 39076688, 52550000, -70683888, -37448892, -2872260, 34379604, --27426050, -6659347, 66566088, 24510842, 17712446, 41104984, 32869922, 45201308, -15953119, 44762688, --5862631, -39945880, -53173844, -15823196, 22535156, -46552076, -6692096, 5758478, -7087233, -19094350, -11799349, -41660644, 31770410, -2887292, 9583683, 12192875, 11785390, 220654, -14175003, 22494892, -5484673, 21709986, -4908611, -46568720, -4420595, 13238700, -15466714, -17146046, -10613938, -15812996, -18689550, -5008469, -16714939, -1083942, 17365090, -23781770, 16333761, -8340290, 8582418, -23420994, --6033356, 9310415, -2231773, -2269353, 2638721, 12955769, -2555506, -2223719, -16517907, 8011725, --4716411, 2527588, 4780299, 1632625, 11803644, -17728552, -13756780, 18440978, 15674483, -22218940, -10290742, -17949206, 20375324, -17325362, 7487739, 5349382, -14988362, 32530082, 2814277, -36083092, -16295643, 4485557, -28355910, 15848429, -10693932, 16936130, -24713242, 12760885, -26203596, 12242804, -17681306, -15879568, 8820252, -16553878, -111132, 2373506, 1103270, 7594039, -22601192, -124107912, --213919440, -79428440, -168589808, -166905648, 70738112, 4860829, 103264432, 249003952, 223143952, 180752096, -223514928, 132008504, 19923816, 33092186, -45854680, -187386736, -185332672, -141735536, -180371440, -127469264, --36002028, -89917288, -119440360, -58614492, -25385942, -67730560, -38420628, -12904766, -39664560, -61377232, --1182190, 31345746, -26019448, 48134772, 77632072, -9063455, 6043019, 109237128, 48708152, -10100152, -102061848, 81604912, -31990528, 33381560, 95217280, -11922292, -1014686, 139039360, 70638792, 24177444, -171037952, 189527248, 89452896, 179970400, 226323840, 54425824, 25365004, 89392232, -42613056, -117115168, --68761352, -149234544, -261180176, -259831568, -292604832, -389377440, -388820704, -370920896, -374593632, -330299616, --272114080, -205460496, -105280920, 922881, 173103824, 205873344, 138525040, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ -7273527, --3756486, 1766305, -492311, 683437, -1034013, 3728032, 5650567, -2708514, 1975148, -641024, -1970316, -2550674, -298500, 1482838, -3415036, -3418257, 1109175, 1793686, -4001836, 1832877, --2221035, -3002182, 195958, -1574106, -2990371, -3769371, -674310, 3165391, -683437, 1203665, -2091649, 1171452, 1504312, 1778117, 1533303, 3668439, -5411122, 1407676, -3522947, 1968706, -3813931, 230318, -816044, -3289408, 1298691, -556198, 578210, 1159641, 636192, -1294933, --2845416, -2114735, -3673808, 779000, 3758, 449898, 1728724, 2381559, 707059, 4234301, -242129, -2643016, 2880849, -812823, -537408, -900869, -3913252, 3384971, 1664300, 2967823, --3499325, -5673115, -1708323, 2509335, 1876364, -2925947, -8451959, 966368, 5605469, 1938641, -3659849, -5272073, -2886218, 274878, -920734, 1458678, 4436701, -10589779, -60130, 3535295, -2110977, 3263638, -3067144, -4250407, 4653060, -30602, 1300301, 2945811, 3846680, 1469953, -802622, 3512210, -513249, -1050120, -2992519, 1669132, -848793, -424128, -1562294, 2052458, -5042829, 89121, -1068373, 2450279, -3256122, -4765803, -2700461, -903554, -3168612, 363998, --760209, 2117419, -1998234, 653909, -3972308, -284005, -3280818, -55298, -1537061, -1171452, -1578937, -1753420, -264141, 2775623, -1482301, 3294777, 3745748, 412317, 5082557, -2513630, --305480, 2637110, -1048509, 1842541, 2181844, 1458141, -2949569, 1276679, 974958, 1101659, --205622, -2037962, 13946833, -4137127, 1202591, -3228742, -409633, -1437740, 1464584, 942745, -4673998, 1334124, 682363, 1721208, -1335735, -9896678, -9494562, -3064459, 1076426, 2705293, --2538863, 382252, -3206730, -1231045, -25233, 1503775, -4318053, -4653597, -1516124, -435939, -2242510, 651224, -1203665, -3400004, 378494, -1939178, -107911, 2128693, -3503620, 1437203, -2721936, -2437394, -6271189, -1728724, 1980517, -508417, 1560147, -443992, 1313186, -430034, -1458141, 182536, -5903970, 963146, 2050310, -1043677, 1293859, 114354, -614180, -1272921, --244813, -3484292, -616865, -1071594, -4545149, -869731, -499290, 3567507, -4092030, 5967857, -6703907, 5436355, -2929705, -1345399, -1864553, 2485712, -1716913, -1867774, 717796, -13207024, -12885, -1949915, 1016834, -355409, -6793028, -1212255, -1358820, 2261300, 3443490, -4502737, -3778498, -1061931, 2631741, 2663954, -1293859, 5658083, 428960, 366146, -870805, 1085553, --1284732, 1148904, -1454383, 336618, -3527779, 522375, 4083977, 137439, 1774895, 4345433, --4037806, -4210142, 1915019, -1828046, 3462281, -3245922, -925565, -6951942, -5379984, -4586488, -2181844, 785442, 2639258, -2405182, -1724966, -351114, 4583267, -4744865, 2164127, 1063004, -498753, 2714419, -1585380, -2042257, -2825552, 2046015, 1121523, -4126927, -4648765, -5345087, -16106, -934155, 2018098, 30065, -847182, 826781, 983548, 2827699, -6438693, 1174137, -4095251, 6026913, 6130529, 5196911, -448287, -3111704, -7060926, 5536750, -3408057, 6462315, -8199630, 5380521, 631897, 2935610, 1224603, 6846715, -2629057, -2643016, 2474975, -216359, -3231426, 5437966, -6022618, 2865280, 6775848, 3578245, 286152, 675384, 1459215, -2085744, -683437, -1927904, -2978023, -233539, 6469295, -1415192, 3401077, -1246614, -2764885, 7616588, --5246303, 5363878, 5790690, 1756105, 3948686, -3672734, -459025, -985695, -640487, 3981972, -1734093, -3983045, 1549410, 336618, 1684164, -219580, 2506114, 2473364, 6518687, -5149666, -3689914, 3132642, 213138, 3138011, 1461900, 4420595, 4139812, 3016141, -1072131, 3767223, -5838471, 877247, 3813931, -1044214, 6818798, 7180649, 7645579, -710817, -3600793, 2819109, -532576, 3830037, 3271155, 10885058, -999654, -3437585, 10386305, -4145717, 4692252, -2559264, --9855339, 1684164, -2780455, 213138, 11964168, -4717485, -5519033, 319975, 6365679, -10200547, --3588982, 7362648, -2492155, 2241436, 3738232, -2903935, 3435974, -2338073, -3269007, 442382, --750546, -1502702, -1039919, 3895535, -3098819, 7850127, 2326262, -179315, -4383551, -1774358, -5328981, -6151467, 1570884, 1546188, -524523, -8478265, 5869073, 946503, 1765232, 162672, --658741, 3542811, -1981591, 5016522, 3714610, -2875481, -9224516, 3607236, 3178813, -1034550, --2165201, 1497333, 6933688, 5460514, -19864, 2761127, -5021354, 3053722, -232465, -3235184, -3341485, 3541738, -2538326, 3289945, 1920387, -3957276, -533650, 1670205, -1899449, 6131066, -4050154, 3677566, 10673531, 1795833, -2146410, -12639552, 4481799, 7874286, 4878009, 3355980, --669478, 4233227, 14674293, -1272921, 7013682, 1105417, 4114042, 1867237, 693637, 3323231, --759136, -5612986, -1268626, -4048544, -745177, -5901285, 2733210, 670015, 7903277, 1952063, --3044058, 2962454, -628139, -1328756, 5221070, 2222646, 4012036, 2600066, -1634235, -7818988, -950798, 5372467, 105764, -1066763, 2614025, -3864397, -1432909, -7216082, -9176734, 5545877, -5996848, 4907000, -909459, -994822, 527744, 437013, 3300146, 124554, 3577171, 3418794, -383863, 3524021, -2186138, 1449552, -911070, 2405719, 2604898, 9770514, 561567, 8164196, --2212445, -6795175, -85362, -175557, -2225867, 6908992, 360777, 4758287, -11557220, -345208, -11887396, 16284905, -6685654, 1843615, 2659122, -5639829, -3208878, 637803, -4617090, -4920959, -11483669, 1570884, -7438347, -1234266, -4808216, -2848100, 7530152, -2378875, -3146064, 6656663, -4294968, 6715182, -2730526, 1314260, 6786585, 197569, -3807489, 1708323, -396211, 708133, --8199630, -5849746, 2706903, -741956, 2206540, -7883950, 3846680, 2651606, 2036888, -13807246, --7731478, -3658239, -1449552, 1711545, -5690295, -4227322, 1611150, 10172093, 7166690, 3409667, --1546725, -1457605, -3630858, 2674691, -813359, -8092256, -5553930, -1120450, 243203, 10486700, -6437619, -5914170, -5652177, 7000260, 1930051, -5199595, 485331, 6036040, 3034395, -711354, --8351564, 8531953, -2938831, 4633733, 2043868, 2436320, -2947421, 5022428, -5953362, 7236483, --442919, -1695438, 3940633, -6889128, 2625299, 4075924, 978716, 2913062, 3551401, -1706713, -8036421, -3471944, -13166222, -7736847, -1554778, 743029, -2627446, -5490579, -6041409, -4015795, -13339632, -3418794, -827318, 2124935, -2517925, 1800128, 10987063, -4947803, 5330055, -3120831, --6706592, 6448357, 4705137, 3110093, 9882720, 469225, 4779762, -164819, 1391033, -114354, --2926483, 2397129, -482110, 7271380, 1660005, -4533875, -966905, -1095754, -44560, -7550016, -3459596, -7425999, 2203318, 10754598, -6451041, -12674448, 3398393, 2181844, 6387153, -2234994, -343597, 6541235, -3223910, 3485903, 5140002, 1837172, -1909113, 6714645, 2476049, 8625905, --10002442, 24328842, -5224828, 11145977, 1373316, 4883378, 3604015, 335007, -13074954, 11825656, --16393353, 5823976, 4347044, 15496779, -6744710, 7216082, -10328323, 7377143, -3135326, -11034845, --5193689, 3135326, 3227668, 4629975, 2413772, 6470905, 4217121, 9584756, -2568927, -7019051, --6487548, 3091303, 158377, -3222299, 6338835, 3146064, -1038308, 4129611, 7766912, -204548, -2145873, -630286, 3913252, 2710124, -9529459, -3696356, -12552042, -2396055, -2035815, 242129, -6190659, 5967857, 883153, -2947958, -18790, -1341104, -2990908, 2275796, 17847200, 2201171, --433792, 6285685, -510564, 7129646, -2919504, 725313, -4419522, 18572512, 3984656, -6689949, --8734890, -4947803, 321586, 297963, -11883101, 1261110, 2308008, 1001801, 12365748, 935229, -10252624, 6194954, 10036265, 3306588, -10555956, 10041097, -6845641, 17463338, -11588896, -3444027, --15955267, -3390877, -1940252, 6915434, -7596724, 10188199, 7946763, -5020280, 246424, 11676405, -16128139, -5281199, 33823, -2174327, 4760435, 64425, -2361695, 2384244, 4057134, -7858180, -5433671, 1133335, 6270116, 2605972, 479426, -13400835, -2763275, 15593953, -2497524, 5238787, -11259794, 3476776, -1650878, -4132296, -6273337, -3256122, -284005, -5079873, -3962644, 9064528, -7384660, 2656437, 12821551, 9241696, -4025995, -1353452, 674310, 3233574, -5574868, -11038066, -12935905, 6337224, -4597763, 13157632, 11949136, 15302432, 4565014, 2197950, -8018704, 179315, --10734197, -6633040, -7694434, -16207059, 13504451, 589484, 2282775, -2279554, 904628, -1977833, --21032992, 2194728, -440771, -3954591, -1796907, -10438381, 11476689, 11812234, 13190381, -22045530, -6779069, 4291209, 270046, 21300890, 8551817, -10938745, -1545115, 21016886, 2201708, 3549254, -4018479, -6495065, 3217468, 4121558, 12851079, 6428493, -10453414, -16882980, 5902896, 3639985, --8762807, -1885491, 392990, -10536629, 726923, 12109660, 4847408, 6609955, 9636833, 15991774, -1037772, 14006425, 2309082, -6201933, -1412507, -9055939, -5089000, 3018288, 4230543, 3126199, -6550899, -10958609, -5407364, 17637284, -2190433, -4821101, -11190000, 7737384, 6906845, 1590212, -2185065, -1502165, 3797825, -9650792, 11643656, -8699993, -9689446, -9177271, -6898255, 13562970, -244276, -5158256, 19280646, 22716082, -6007049, 6292664, -1830730, -6801081, 1149978, -15418933, --9638980, -773631, -3271155, 30560302, -13990856, 3844533, -19682224, -2930242, 11669963, -5054103, --11066520, -11421392, -4394826, 4652524, 5811091, -787590, -1229971, -12797929, 2749853, 8946954, -4243428, 5497022, 1349694, 2024540, -7762080, -2406792, 4693326, 1887101, -337155, 631360, --9342091, 4092567, -9829033, -1438814, -620623, 2870649, -10908680, -950798, 4749160, 7701950, --12415677, -6115497, 20831666, -7984881, -17258790, 14319421, -14161044, -4061429, -6582575, -2181307, --11062762, -6969658, -2830384, -10224707, -15757161, 24675660, 12653511, 11249056, 6563784, -8970039, --4664872, -5830955, 5667210, -10809359, 6633040, -5323075, 1385664, -1897839, 31182536, -15318001, -13023415, -29631516, 6951942, -19169512, -4370666, 9259949, -1863479, 5609228, 9699647, 7593502, --13488345, 8427800, 954557, 5994164, -3670050, 8672076, 7897371, -2864206, 874563, 4853850, -5500243, -10124849, -4168266, -14349486, -2674154, 10948945, -698469, -6536940, 196495, 3481071, --204011, -5796059, -10627897, 1535988, -7533373, 5296232, -7184944, 21945136, -3215857, -13328357, --15103252, 2257542, -8792335, 6288906, -16829292, -13212930, -17091286, 2767570, -14620606, -4129074, --20503100, 12921946, 1683627, 8388071, 4576825, -21816286, 424665, -2813741, -9007083, -12636331, --4381941, -10931229, -13720810, -7948374, 4642860, 7169374, 10893111, -8118025, 639413, 3856881, --18398566, 6375342, -12400107, -26419954, -7409356, 30431454, 26906360, 15344308, -12572443, 13595182, -20161650, -12716861, 17820894, -13700409, 16451335, 4314832, -879395, 5857799, -164283, 9071508, --12655658, -3085934, -5646809, 7082938, -12041478, -10313290, 17170742, -1018981, -3505767, 2267206, --16486769, 311385, 26564372, 15191836, 2989834, 480499, 5597953, 25896506, 10632192, 1175747, -4106526, -6131603, -3150896, -5129265, 10595684, -4705674, 6969658, 2292976, 12613782, -14310294, --650688, 99321, 16643, -3240016, 6771016, 12708808, -3212099, -2109903, 11151346, 2599529, -846645, 27834072, 3497177, 1800128, -12882754, 6918656, -9851044, 13977434, -15093589, -10667625, -931471, -10214506, -14322105, -17657148, 4248260, -3559454, 9203041, 972810, 4636417, -21522618, -21570400, -35108672, 13651017, 14286135, -25199646, -3225521, -21712134, -7633231, -19581292, -9218074, -20692078, -8071318, -2384244, -15821049, -3753802, 2770791, -23234700, -1567663, 13469017, -28351616, -162135, -19571092, -11062225, -298500, 1160178, -13181792, -10937671, -11149198, -3923990, -9674414, --1496259, 4141959, -3649649, 6363531, -14439143, -9255655, 17068200, -9083319, 8786966, -11374684, -9163313, 8650601, 573915, 1836099, 8428336, -197032, 12428025, 16415365, -4296041, 1875827, -24245090, 848793, 11891691, -1581085, -11258720, -20664698, 2149094, 13187697, -23307176, -425202, --14274861, -7559143, -29969208, 11572789, 17420388, -5772973, 7540889, -5548561, 18838264, 21684754, --3689914, -23689966, -23969138, 29687888, -26732414, 7064148, 1132261, 6497749, 37493992, 42267312, --2321967, -31483184, 31470300, -34423628, 5013838, 14972256, 3753802, -3425773, -15906948, 18319110, --7991324, -6132677, -16236050, -9134322, -5042292, -19975356, -11170673, -8709120, -5086315, -2940979, -14103599, 214748, 12168716, 533650, -5334887, -17349520, -19594178, -4442070, -812286, 248034, --3084860, -6761889, -8575439, 9896678, 22310208, -11628087, 7550016, -7012608, -8077223, 9571335, --8951786, -13433047, 31283468, -2780991, 2598455, 2287070, -17967458, -3102577, -4069482, 9752797, --23187454, -9231495, 23643258, 4777078, -10743324, 14047764, 23935852, -12921409, -17861696, 10030359, --15307263, 1375463, -28137404, 10049150, 22386980, -1081258, 11114838, 8478802, 2854543, 28176060, -6862821, 1413581, 13268765, 615254, -51831128, -36516348, 14307073, -15867220, -14953466, -44219372, --13195750, 8592619, 2973728, -9274982, -24824910, -1020592, 11666742, -1615445, 1068910, 11988864, -21990232, -20323248, 50825032, -13979045, -17645336, -5954972, -3456375, -537408, -20906290, -318901, --4133906, 10062572, -7415261, 14558865, -6900402, -13907104, 4835060, 5493263, -12202002, 11888469, --39669928, -570694, -3637301, 14724759, 18400714, -14616847, 17135308, -7719667, 4562866, -9409200, --3292629, -6198712, 13642427, -2942053, 18116708, 27904402, -25678536, -8201777, 13183939, -18207976, -9874667, -20585778, -11074036, -10961293, -11724724, -21158082, -10523207, 7638600, 7087770, 13429826, -19187766, 12375411, -24283746, 823560, 3765613, 3122441, 3843459, 12010339, -9385040, 5934571, --11864847, -36053568, 25066502, -45804216, 30103962, -5673652, -21222508, -18194018, -20287814, -14026826, --11315091, -186294, 21679384, -2996277, -20596516, 19349364, 27673012, -45639396, -13247827, 2003065, --5057324, -8038568, -3620121, -7260106, -9321690, -14016089, 15093589, -6855842, -13805636, -22238804, --22521198, 19705310, 3920232, -4830765, -3798362, -1004486, -6169721, -6663642, 3026341, -19641422, -8586713, 20217484, 14244259, 8894340, 18638548, 22593138, -15187541, 4060892, -21165598, 20134270, --13760001, -4406637, -1840930, -31678606, 8232916, 24415816, 2534568, -11297375, -10266046, 32243930, --15159087, -15127949, 7441031, -34559456, -5809480, -17480516, -1136019, -33659120, 11967389, 5244692, -11779485, -53813792, -47462072, 7801808, -16821776, -9199820, 5233955, 41652056, -52712132, 58042188, -18653580, 252329, 6871948, -38226284, 10620380, 21065204, -4784594, 49703508, -11225434, 22678502, --14391362, 54520316, 517544, -5000416, -17615272, -5282273, 10130754, -3238942, 23780160, 18556944, --3030636, 3457449, -18045842, 9905268, 23685670, 23368918, -20580410, 11766063, -1897839, 24821152, --3434363, 16856672, -10974715, -8741869, -28162638, 4150549, -16756278, -26947162, 44121124, -16182363, --639413, -5747203, -6828461, 7700877, 6532109, 16724066, -3688303, 24574730, 5371394, 42855184, -18945638, 47259672, 41634340, -1422171, 29073170, 21990770, -3086471, 25551834, 34964792, -10658498, --27287000, 20685100, 15526307, 28709708, 17276506, 1046898, 4046933, -29217052, 1421634, -4750234, --7139847, 51606716, 2075543, 18502182, 17965312, -37463924, 74563320, -9068823, -7329899, -3758097, -54459112, -31962072, 27726698, -35070020, 34974992, 7898982, -5850819, 1875827, 20797842, -7576859, -19430432, -7632694, 599685, 38704096, 12299713, -8579734, 588411, 10479183, 8105677, -35432944, -10441065, -12195560, -2638721, -18124762, 19274202, 18836116, 3398930, 9545565, 32063542, -9261560, --49435612, 13152800, 33364380, -11501922, -32327682, 9956808, 24032490, 9170829, 566399, -38176892, --18373334, -22090090, 22431540, 10146323, 23089208, -46190764, 3554622, -7483981, -51921324, -12324409, -8244190, 25017648, 33578592, -16326781, 62272732, 13238700, 1688459, -11528766, -24222542, -16088411, -12397960, -27533962, 59062244, -17681306, 3477850, 35187592, -21274584, 21521008, -20163260, -12465069, -51504176, -17483738, -43212204, 24842090, 15902116, 24866250, -9806484, -6869800, 10059887, 244813, -2877091, 1117228, 4896263, 1379221, -6824703, 32221918, -7496866, -21807696, 9277666, -310311, --19493246, 7052873, 4399121, 13514115, -9070434, -14365055, 15672873, -12353400, -1886564, -3409130, -12801150, -21974664, 7445326, -13457743, 11127187, -19262392, 6772090, -6138045, 3138547, 43698608, --29986924, 6155762, 9210020, -26226680, 9398999, 12925167, -20182052, -3522410, -7959112, 36575940, -2647311, -40878960, 24484534, -32877974, 5694053, 18148384, -16556025, 20693152, -24518894, -19001472, -26866632, -3745748, 11148661, -39985608, 7205882, 9882720, -2626373, -5202279, -765578, 17835926, -262530, -53099216, 32746978, -1871532, 12699145, -12367358, -15867757, 55006720, 2809982, 18293876, --9295920, -109274704, -229992816, -93104152, -173680432, -211110528, 71850504, -3059091, 73774120, 286434048, -249981056, 141203488, 274163328, 151832992, 15359877, 93270048, 56729000, -106656920, -75816912, -23904178, --117736328, -142184352, -48491256, -73019272, -112675248, -29928406, -6787122, -143178096, -98934032, -16718160, --87383792, -112985560, -33870112, -56360708, -122130080, -24956444, 11028402, -69390032, -52749716, 49488760, --19320910, -74051144, 14484777, 46786152, -36357972, 28368258, 105465608, -16425029, -28170690, 104006392, -56266220, -26467200, 174636592, 236275808, 148412064, 249600416, 374640864, 287713952, 275608064, 400419264, -349428352, 257099424, 317266560, 287695168, 187473712, 165366448, 95411624, -21500606, -111418968, -210987584, --297894624, -359043168, -444289664, -476471872, -485214272, -545162880, -419987136, -176518320, -128365832, 0, -0, 0, 0, }, -{ -8273718, --2595771, 1931662, 1451162, -2772402, 3333968, 2580739, -845035, 4555887, -33286, 1936493, --6468221, 2427730, 2448668, -3367791, 6817187, 846645, 3335579, -469225, -832150, 406411, -4708895, 5187247, -5184026, -1624035, -2317135, 3388192, -1610613, -1233729, 746251, -2787434, --4301410, 2321967, -4068945, 2324114, 2290291, 2280628, -90194, 1279900, -45634, 3339337, --1170379, 514859, -3358665, -835371, -6404333, -3007014, 807454, 2289755, -277562, 3205119, --303332, 1631014, -3988951, 1114007, 1969243, 2333778, 587874, -1815161, 158914, -874563, -1504849, 1756642, 754304, -155156, -1414655, -818728, 3273839, -850940, 1464047, 2817499, -1774895, -1525250, 3287798, 69793, 1025960, -1014686, -7168301, 204548, 5684389, 3911642, -3922916, 2477659, 1548336, -2237678, 68183, -2544768, 6071473, 3741454, 1439888, 898722, -854699, -55298, -1954747, 3015604, 4161287, 4056597, 2435783, -3036005, -4459250, -4807679, --4634807, -442919, 2362769, -4689568, 3911105, -902480, 6864969, -1096290, 4344360, 119185, --5773510, 1706713, -783295, 4707821, 272730, -460635, -2385854, -3834332, 304406, 2312840, --5079873, -6771016, 4753992, -3867081, -3721052, -3337727, 2658048, -2593624, 1103807, -1068910, --385473, -3881577, -1267015, -2569464, -4067334, 1533303, 3091303, -930934, -4457639, -607201, --921271, -1932198, -3832722, 36507, -3097208, -3284576, -613107, 706522, 970663, -695785, -763967, 4295, 13517336, -4686883, -3054259, -4177930, -2852932, 336618, -8988830, 1543504, --4438312, -8818105, -1845225, 7589207, -5400922, 1490354, -594316, 2552821, 3878356, 4102768, -6671158, -1409286, -3731790, 1692754, 1660542, -3035468, -372052, -2051921, -1265405, 812823, --3397319, -2173790, -425202, -4377109, -5047124, 2615635, 4057134, -2362232, -5802501, -1045288, --1282048, 821413, 4871567, 299574, -1860795, -335544, 6498823, 774168, -3776350, -3787624, -1786706, 1181116, 5235029, 2860985, -181462, -4895726, 433792, -324807, 4350802, -4518306, --1320166, 2408403, 5050882, -1425392, 637803, -3743064, -1846836, 2180770, 372588, 389231, -1564442, -1532230, 2025614, 401579, 2427194, 1177895, 1090922, 8232916, 2658585, -9942849, --2370285, -4713190, 4488241, 1108638, 63888, 3186866, -1961190, -7689602, -4084514, 5051956, --328028, 5207111, -441308, -2997350, 5753646, 2151779, 12674448, -2425583, 5468567, 778463, --6059125, 1482838, -5158793, 3272228, 1101122, 1271310, -5515275, 2697776, -1022739, -1950989, -2156074, 8639864, 3139621, -76773, -7042136, 6003291, -1363652, -1611, 4168803, -6356552, --1287417, 4331475, -2699387, -2291365, -7260106, -7835631, -721555, 4683125, 2643552, -3172907, --235686, 3027415, 3693135, 1479616, -969052, -1566589, -7036767, 3144453, 8297877, 3784940, --2696166, -1304060, 2422362, 3936875, -631897, -1422708, 648540, -5827734, -1481764, -4204773, --2390686, -724776, -3149822, 5934571, 4565014, -2663954, -7636452, 8121247, -7358353, 7399155, --263067, -6248104, -14470819, -5816997, -4289062, 1946694, 7296613, 5667210, -1990717, -1339493, --1927367, -4287451, -1365263, -4793721, 1394791, 1504849, 2654290, 4518843, 2610803, 8817568, --150324, 1632625, -3348464, -927176, -2322504, 3125126, 829466, -4371740, -6227703, 68183, --4515621, 366683, 3955665, -7033546, 4673462, -11711839, -3328600, -8731132, 1316944, -697395, -4295, -3521873, -4658429, 1435056, 3960497, 2769717, 959388, -7035157, 1983738, -4903779, --1915555, -1512365, -9470403, -3802120, 2719251, 3488587, -399432, -6585796, 1046361, 2330020, --1301375, -1395328, 736050, 5520644, 1993939, -1349694, -1815697, 917512, -13364328, 903554, -3357054, 3118683, 8958765, 9590662, -2385854, 185757, 6331319, -3193845, -3007551, 9477919, --7153268, -16910896, -11126113, -6492380, 10210211, 4417374, 1416802, -9751723, 10405632, -4402342, -2909304, -2602213, 4072703, 5107253, -434865, 230318, -121870, -1584843, -5418101, -4228396, --1366337, 682900, 4672925, 2800319, 7320235, 3652333, -3291019, -1586990, 6491306, -4594005, -7973607, -6307160, 1635309, 3686693, 2176475, -5078799, 6985765, -536871, 7502771, 10224707, -1396401, -3854733, -4058744, 4424353, -5015985, -10050760, -2829847, 2326262, -6774774, 3928285, -2804077, -1992328, -4339528, -1550483, -1847910, 2162516, -1109175, -5559835, -2552821, 10144713, -7584376, 4508642, -12319040, -11424076, -6917045, 11390253, 4972499, -609885, 640487, -4931160, -1258425, 4396436, 6654515, -782221, 2319282, -11482595, -4146254, 1429687, 3391951, -14142254, --1929514, 5541582, -4553739, -9330280, 5166846, -10787884, -8051990, -4502200, 494995, -4151623, --2988224, -707059, 7318088, -6940667, 1293859, -2448131, -3159485, -5894306, -1956895, -8435316, --2838437, -593242, 1108102, -5998459, -1629403, -3910031, 73014, -2160369, -2949569, 1145683, -5920613, 1285806, -3768834, 2837363, -5316633, -1530082, 1403917, -2166811, 2707977, -1344862, --828929, -22712860, 1009854, -8061654, 3306588, 2957085, 4454418, -12608950, -13093745, 1436130, --86436, 2690797, -464930, 6474663, -3295851, 3433290, 3899830, -2340220, 9859097, -3452617, --7613904, -1580548, -6572374, -266825, -12381854, 129923, 3819300, 8800388, -17391934, 4819490, -844498, 5002563, 7130720, 1432372, -6715718, -14742475, 1123134, -5849746, 11371463, -4422206, -2371359, 1023276, 2440615, 8754754, -3766150, -39192, -3971234, -1999844, 2209761, -1910724, -7978976, 6227166, 1660005, -1432909, 41339, 5645735, -638340, 2881923, -227633, -4121021, -3788161, -822486, -3455301, 5066451, 7865159, 361314, 2953864, 913754, -5535676, -2958159, -9514963, -4332012, 4402879, 7491497, -9710384, 7124814, 3273302, 3830037, -4538170, 7324530, -1591285, -744103, 8379481, 788663, -592169, -3652333, -2891587, 491237, -4459250, -8915815, --3157875, 10163503, 6498823, 8476655, -1758789, -7780870, 2455111, 10704669, -3087008, -6520297, --1843078, -4364761, -3263638, 1611, -8160438, -2297808, -13252658, -3759707, -7631083, -9002251, --8553964, -2912525, 11818139, 12887586, 17648558, 4089883, -6569153, -3940633, 14617384, 122407, --3278134, 11292543, -1066226, 666257, -17272748, 8035884, 4451197, -11401528, 16131360, -2050847, -7280507, -1762010, 3830574, 7325604, 66035, 12806519, 4879620, 3769371, -1429687, -4285841, -1232656, 7832410, -2039036, 2457258, 3581466, 10309532, -485331, -2882460, 6503118, -7488813, --4854387, 3642132, 11124502, -4785131, -6055904, -1728724, 9127342, 238371, 1203128, -3296388, --1691143, 3436511, 4719632, 547608, -4133906, -12637941, 1326071, 3829500, 11914776, 3572876, --1219234, 9327058, 16369731, -3460670, 5523328, 3831648, 6554120, -1536525, -6218576, 2997350, --14797773, 21623550, -10346039, 5213017, -431107, -6927782, 16539919, 4221416, 2349884, -16695612, -4775467, -6396817, -7464117, 2341831, -7284265, 9110699, 5552856, -992137, 2041720, -3717294, --1593433, -5731097, -3704946, -6968048, -11246372, -2325725, -7788387, -1635846, 4669703, -2715493, --4071629, 9697499, 6008659, 9748502, -7253126, -249645, -1250372, -7640210, 337155, -3752191, --20304458, 2459943, 620623, -2495913, 7379291, -37581, 8113193, 7400766, 2703145, 13130789, -11245835, -10073846, -2737505, 916439, -159988, 4728759, 1722819, 11414412, -1999844, 17736068, -228170, -8920110, -7780870, 2318746, 3299609, 4519380, 12491912, 4343286, 3361886, 12662100, -15622407, 1847373, -8980240, -7669738, -337155, -1943473, -1361505, 16207059, 13205951, 1444720, -9046275, -8927090, 4657892, 1232119, -248571, 6158446, 13922673, -3224447, -781147, 12908524, --15967615, -8636642, -6726993, -18277770, 4130685, -5432597, -2210835, 2797098, -12391518, 14609331, -11039677, 15497316, 7138236, -8716636, 1319092, 1191317, 11615202, -1453846, 85362, 195421, --6487548, 1207960, -3624416, 6919193, -6897718, -2086817, -2012192, -2457795, -8139500, 4809290, --12149926, -1142461, -384936, 8766565, 5223754, 1924682, 678605, -1301375, 1490891, 1087164, -7186554, 2553358, 2540473, 43487, -19120658, -8024073, 3017752, 9478993, 10621454, -14114336, -11243688, 4611185, -5132486, 3200825, 4472135, -1738925, 16333224, 2381023, 4482335, -867583, --18861886, -3827890, -6599754, 2095944, 18852222, 2544231, 7288560, -12229919, -11138998, 5545340, -9509058, 643708, -4128001, 18089328, 5290326, -454193, -5728950, 3529926, -2018098, -2579665, --1270774, -3716757, 288837, -6705518, -15352361, 4363687, 933619, 4005594, 879931, 7719130, -1910724, -9320079, -18571976, -5906, 753230, -1911261, -16329466, -8136279, -2962454, 3960497, --4031364, 1326608, -14359686, 245887, -3671123, -323196, 784905, 3423089, -2078227, -13333726, --12504260, -7788387, 4415764, 3352759, -3758097, -3013457, -21343304, -12051141, -988379, -20522964, -18082350, -19359566, -5795522, -12582644, 19468550, 6252936, -14581414, 6978248, -2095944, 7518341, --12410845, -3934727, 185220, 8270497, -11618423, -4294431, -3912715, -11179800, 1148904, 8171712, -62814, -2117419, 16080358, 36358508, -6022081, -12695923, -11906723, -10695542, -14806900, 1217086, --24514062, -1292785, -19158238, -9521942, 4671851, 10306848, 5624797, -9335648, -2044941, 9711995, --1656247, 11368242, -8378945, -8752606, -7553237, 4694936, -5273146, -6975564, 1136019, -8138426, --7863548, 7211250, 19229642, 6256694, 7738994, 2452426, -12677133, -4188130, -10441602, -10489921, --2279017, -3094524, -8377871, -13566728, -25096030, -3796214, -9640054, 1572495, -5313412, 7472706, -7595650, 3116536, 7984344, 4483946, -1777580, 15209016, 23390928, 3944928, -29263760, 3850438, --5977521, -18646064, 1398549, 6005438, 3082176, -1520955, 6796786, -2861522, -14602889, -1756105, -5242008, -16392280, -8437463, -15894063, -25093346, 14771466, 617938, -856846, 26884884, -21044802, -23127862, -2617246, -3574487, -12731357, -5216775, -12636331, -10997264, 12152610, -12102144, 6020471, -27761594, 10078678, -5065914, -13424457, -11683922, 12226161, -11306501, -18138184, -8182450, 1313186, -732292, -20615844, 442382, -6583648, 9477382, -6827388, -1356136, 1873143, 28934120, -7718056, --10742787, 14122389, -12794708, 17059074, -11484206, 12373801, 844498, -9701794, -9839770, 15826418, --22449258, 15559593, -10567767, 1185948, -6623377, 8280697, -8951249, -4190278, -2071785, -6970195, -28735478, -9330280, 18874770, 7558606, 7405598, -741956, 5554467, 12765717, 12465069, -4843113, --17389248, -734439, 9293772, 4057134, -5717675, -19462108, 20500416, -6535330, -20952998, -6350109, --15785615, 4963372, 2663417, -31549220, -13641890, 18881214, -4089883, -8140574, 21984326, 1851668, --11879880, 8172249, 11827803, 10012643, 1302986, -19502910, -8250096, 2668249, 2532420, 9785546, -6342056, 11075110, -10134512, -8016020, 3493419, -2923262, 8977555, -18333604, -3380139, -19807852, --6646462, 3295314, -3023120, -2698850, 20593294, 4119948, -15845208, -2588792, 901943, -16078747, --2497524, 547608, 9167608, 23834922, -8904004, 7819525, -13804025, 1800665, -8286066, -10392747, -9412421, 20824148, -17085916, 1394254, 18324478, -8684424, -2168959, -7255274, 11814918, 2740726, --15717970, -409096, -5826123, -5172751, -2044941, -7719130, 10796474, -27188216, 5109938, 2011118, --11978127, 14838575, 22457310, 16073378, 43353400, 13094282, -12107513, -15927349, -13743358, -7311645, -19598472, -53734336, -4365835, 26951994, -41360000, -4142496, 5371931, -42715060, 15752866, 2522757, -30021284, -5644124, 9118216, 7096360, -37799472, -31848794, -13755707, -5333276, -20083268, -24360518, --13883482, 17641042, 11816529, 9650255, -1046898, -343061, 4010963, -1407139, -28153510, -12350715, --35486092, -13322452, 16065325, 2696703, 10036802, 38735772, 8329016, 12791486, -3182571, 5324686, -34071976, 24474872, 5069135, 14912663, 13928042, 33296198, 27308476, -43201464, 22151294, -5714991, -21000242, 20677046, 7160248, 40111772, 35706748, -25316684, 16001438, -4425964, 14956687, -36455144, --373662, -1207423, -2505577, -12276090, 16366510, 16551730, -25588342, -13220983, -17203492, 981400, --22906672, -29774324, 14598594, 25603910, 5660230, 23516556, -19508816, -16047608, 24192478, 43322800, --5545340, -58223112, -18435610, 6421513, -4304631, -9252433, -12616466, 707596, -33306398, -19567334, --27633282, -3910031, -7936026, 9914395, -19697256, -5046050, 5531918, 10031970, -74625, 11126650, -20409148, 4999879, 29368986, -17973364, 7164006, 2092723, 27999428, 8291435, -5374615, -27062052, -18758270, -3736085, 25520158, -20196010, -16902844, -14937896, -8573292, -24559160, -3512747, -3054259, --24330990, 14950781, 27790586, -11792906, 4146254, -34285112, 34673808, -9045738, -18845242, 17852032, -13852880, -18411988, 1806034, -10461467, 4532264, -6811282, 43350180, 1247688, -3764002, -7550016, -76472968, 5449777, -10540387, 36725728, 26072598, -23349590, 21264384, -28882582, -19768660, -29365228, -25589416, -16546898, 9281424, -17470316, -79812304, 4688494, 49704044, -31556736, -21400748, 39766028, --30598958, -2843805, -9408663, 38145216, -68088120, 36592584, 21239688, -19830400, 5976984, 35741644, -25125558, -13717052, 13925895, 5838471, -11274289, 16352551, -1434519, 9574019, 14782741, -7631620, -2747169, -2575370, 6469295, -10568304, -8920110, -1480153, 12494060, -40634684, -20817170, 18928458, --5604933, -27230092, -32298154, 4537096, 37601364, -17675402, -25930866, 18194556, 27732604, -7194607, -6080063, -5988795, 25730076, -15515569, 39170640, -6366752, -1141388, 21202106, -756451, 4145717, --29913374, 44094280, -24537686, -29246580, 20164872, -30959198, -11118060, 3919158, 13673565, 40430676, --15999827, 24646670, -6497749, 12137041, -71725416, -55576876, -11108933, -22818088, 9442486, -8220568, --28844464, -14833206, 16718697, -35268124, 29520920, -30371862, -37665788, 17396766, -19605988, -13846975, -17547626, -17590576, 14175003, -14319958, 5086852, 37127308, -38141456, -4882841, -8260296, 30944166, -1583769, 838592, -34565360, -31955630, -13550622, -10933376, -7665443, -11815992, 2764885, -496606, --6392522, 2712272, 3915937, 1226213, 2260764, -8278550, 12207908, -12248710, 11469710, -30253750, --2482491, -24895778, -33088428, -19515258, 35622460, -19005768, -21009906, -14902463, 5188858, -9868761, -13529147, 23434952, -30779884, 21913460, 76773, -38904888, -22852984, 74364136, 35057672, -59796684, --15623480, 34827352, -23602456, -23036058, 9556839, -20174536, -45554572, 26752278, 7093139, -56418692, -15808164, 25257628, -39423504, -24079198, 23270670, -13219909, 49299244, 69224672, -25769804, 77299744, --4572530, -19575388, -14631880, -24543054, -663572, 13931263, 46388332, 2667712, 15393700, -10302553, --37060736, 1780264, 3080565, 26506928, 6549825, -28266254, 56116432, -22290344, 11951283, 25324738, --25252260, -21144660, -36774584, -16127602, 25827786, 30535070, 38766912, -13160317, -87936768, 20630876, -49086108, 60865056, 53932980, -215822, -23539642, -31385474, 13171591, 31204548, -17243220, -9934259, --77296528, -48467096, 45354316, 72424960, 17375828, -1719061, -14830522, -31347892, -4625143, 20137492, --25046638, 11004780, -980863, 45574436, 1162862, 17685064, -85895584, -11518565, 4518306, 54460184, -46052788, -1582159, -22860500, -7961796, 69280504, 28643136, -71961104, -95806224, -31981938, 17599702, -152848224, 14198088, -18853296, 19127100, 7221451, -12622372, 31053150, -36381056, 791885, -14755897, -7996692, -22572738, 20631412, 5643050, -12320114, -22716618, -11513197, -4399121, 6128919, -30897994, -6641630, -15152108, -6361921, -24159192, -11871826, 19549080, -21110838, -7252589, -3386045, 9612674, -5887327, -7931194, 10473815, -17540646, -2030983, 367757, 8828842, -11381126, 16101296, 12749610, --13466333, -14513768, -6378564, 24164560, -17940078, 7880728, 16940962, 4342749, -18099530, -6181532, -6586869, -10361609, 7168301, 1327145, 2974802, -15363098, 2394444, -12320114, -1566589, 12793634, -14189498, 12662637, -9913858, 12200391, 278099, -13215077, -3322694, 1044214, 15666430, -3452617, -2211371, 16083579, -4624606, -17676474, 25289304, -9154186, 14285061, 13673565, 1257889, 6251325, --11555073, -8796630, -28560996, 55121612, 5561983, 3552475, -21407728, 13210246, -1218697, 14859513, -11560978, 17284560, 2515240, 4787278, -8744553, 3220152, 16048145, -1014149, 9111773, -858457, -3400540, 3860102, 6969122, -6058052, 12379706, -7481833, 1843615, -857383, 4734128, -635655, -3147137, 9224516, 10522670, -4313221, 5124433, 2244121, -1303523, -3828427, 13796509, -3651259, -3638374, -3373697, 7679939, 238908, -5235565, 13236552, -7092602, -2554432, 4441533, -5890011, --2667712, -1705639, 1595044, -2173254, 1309428, -1109712, -2229625, 4514548, -7190849, 5337571, -4778688, -2828773, 6793028, -4223564, 7870528, -3448322, 2639258, 1151051, -2487323, 6245956, -1573032, 574989, -330176, 8217346, -8399882, 10279467, -5480379, 104690, 5028870, 10259603, --49938660, -124109520, 19110994, 94195072, 87552368, 151929632, -38958576, -40933724, -103700376, -141643184, --29268592, 50913616, 54628764, 102832256, 55902220, 4169876, -26845156, -72219336, -51225000, -9104257, --8065949, 25362318, 23738822, 13461501, 8740795, 6614787, -3820910, -17991082, -1386738, 20107964, -151934, 3970697, -1162326, -15654082, -11708081, -26396870, -25491168, 11218991, 10723996, 23310398, -36058396, 26603028, 13247827, 4388383, -38781944, -27874874, -21170968, -21701396, -23657216, 4565550, -15283641, 25951804, 33807300, 27448062, 6231461, -3692061, -22148072, -23193360, -13343390, -6988986, -2418067, 3384971, 7813083, 320512, -6987912, 2171106, -11278047, 5841693, 10340671, 1020055, -20393042, 24049670, 8260296, -3959960, -24847460, -32131724, -8114804, -99858, -733366, 0, -0, 0, 0, }, -}, -{ -{ -7204808, --112206, 2781528, 3014530, 1069447, 1095217, 1584306, 2418604, 4501663, 2129230, -317828, --1715839, 302258, -2369211, -2297808, 426812, -415538, 963146, -445066, -933619, -2509872, -3289408, 670015, -118648, -4460861, 390305, 3133179, 4474282, -2950643, -650151, -817118, -2281165, -329102, -152471, 1020055, 359167, -621697, 1668058, -1816771, 807991, -4531191, --3287798, 1495186, 1793149, 6454799, -2423435, -2421825, -1366873, 2668785, -2049773, -3800509, --2625836, -4480725, 494458, -2971581, 2694018, 3472481, 849867, 1490891, -2051384, 1344862, --309775, -5009006, 5896990, 3970161, 2848100, 1022739, -1912334, -848256, 2512019, -1515050, -765578, 284542, 177167, -436476, -1467805, -4156992, -5884105, -124554, 1229434, 925565, -4115116, 505196, -562104, -2726767, 6068252, 3742527, 144418, -791348, 6024766, 2028835, --2000381, -5366562, 3344706, -1568200, 2582886, -5105643, 265751, -1241782, -3834332, -1048509, --1962263, -725850, 222801, 3221, -2816962, -1707786, -505732, -546535, -1780264, 1817308, --247497, -1841467, 3187403, -5433134, -2648384, 2584497, -3333968, 446677, -2100776, -2976412, -1944547, 1844152, -1680943, 2046552, 3839164, 2224256, -2123861, -2362769, 337692, 796716, --2494839, 2631741, 4230006, -3653407, -1283658, 2177549, 1484448, -822486, -1247151, -1734093, -2259153, 810138, -2997887, 3355980, 1426466, -2538326, -2185602, 3593814, -2806224, -3047279, --6527277, -4979478, 2285460, 7984881, -558883, -1377611, -3003793, 5187784, -2471754, -79457, --3871913, -4116189, -5260798, -2346663, 4438849, -4197794, -1478543, -1331977, 1647120, -873489, --5892159, 3387656, 1681480, 12014097, -1041530, 5752035, -940061, -44023, -376347, 862215, --2328946, 4821638, -1045288, -651761, -2602750, -229244, -835908, 7351911, 1458678, -423591, --6480569, -375810, -1131724, 2310156, -4069482, -843424, 1278827, 1284195, -1027034, -363462, --2480344, -623307, -3010235, -1037772, 6235756, -1401233, 2063195, 3821984, -695248, -2880849, --4225174, 1592359, 1147830, 1804960, 2830384, 3731253, 2763275, 2090575, -1090385, -562104, --1284732, -5459441, -1357747, 119722, 3063922, 3373160, -1449552, 838592, -10471667, -2663954, --354872, -2349884, -1682554, 3474629, -7407208, -6216965, -3716221, -2509872, 872415, 8017094, --1931662, -149250, 816581, -5973226, -1694902, -5006322, -922881, 8512088, -835371, -4319127, --2901787, -5906, 1590749, 1619203, -2594697, -11043435, -5407901, -1565516, -4394826, 292058, -25233, 4338454, -3032247, 3848828, 787590, -2104534, -6030671, -4978941, 6610492, -5672041, -3555159, 1031329, -3764539, -1398012, -3378529, -2345589, 3026878, -6053220, 2949032, 1036698, --258772, 998580, 263067, -598611, -20938, -3036005, -4336307, 330712, -1422171, -3041911, --1390496, -4710506, 5419175, 3893925, 832150, 4664872, 419833, -1783485, 5534602, -2784213, --1966558, -1656784, 4214974, -3796751, -6864432, 8580808, 9738838, 2712272, 2688650, -2701535, -4601521, 2313914, -5536213, 1818382, 3747896, -6696928, -5765994, 5962489, -5029407, -712428, --3188476, 5998459, 1449015, -656593, -2042257, -23085, -3706020, 3608846, -1760937, 2187212, --752693, -24159, 4069482, 1528472, 742493, -1506460, 4008815, 2408403, 1347009, -339302, -4158602, -324270, 953483, -2505040, 5040681, 1051193, 2167885, 3479461, -9367861, -3165928, --1621350, -3490735, -3063386, 932545, 5680094, -2370822, -1115618, -2998424, -983011, 1102196, -2716030, -6694781, -29528, 2248416, 659278, -598611, 3292629, 1799591, -5780489, -1821603, --889058, 3760244, -3593814, 5342940, 6411850, 2982318, 1792075, -2840584, 494995, 374199, -10348187, -2325725, -493384, 3561602, 2187212, 1549410, 3264712, 9150428, -2988760, -1214939, --9487583, -163209, -8200703, -10316511, 14496, 3902515, -13219372, 4024384, 3870839, 1961190, --4252555, -3441343, -4607963, -1969779, -95563, -81604, 3751117, 5054640, -1086090, -5682779, --3577708, 3644817, -6070400, -3210488, -5185636, 678068, -8167417, 3526705, 267362, -901943, -904628, -629213, -2142652, -375273, 4677757, -6197101, 6679211, -5737003, -982474, 897111, --3906273, -3304977, 2389076, 938987, -1489280, -3144453, 4880694, 1750736, -4034048, -7786776, -472446, 1227287, 3909494, -668404, -2285460, -144418, 1879048, -2291902, 9795747, -4000225, --2075543, -7917772, -5262946, 10783589, 4173635, -3410204, -1358820, -1163399, 2556579, 6507949, --9584756, -5798743, 6031208, -5178657, -5533529, -5987185, -7141994, 4491462, -2115808, -541703, --1968706, -80531, -7915625, -1821603, 2997887, 3429532, 417149, -4265440, -6188511, -5072357, --6510097, 937377, 6787659, 691490, 1888712, 2206540, 1957431, -4516695, 3998615, 2522220, --3649649, -2804077, -10289668, 1282048, 1720671, -7930120, -1087164, 2170032, -1926293, 765578, --1176821, -8448738, 6556268, -7865696, 5579163, 189515, 2570538, -8796093, -5340792, -7867307, --6612102, 1058710, -2668785, -2807835, -3934190, -42950, 3390340, -7175280, -592706, 2138357, --2783139, -7923141, -5467494, -1535451, 1083406, 4090956, 1293322, -6332930, 6700686, -1920387, --1786170, 7441031, -9164923, -2641942, 14674830, -12155831, -6152004, -7948911, 6607271, 2749853, --3760781, 3303367, 486942, 8870181, 1100585, 507880, -7552700, 6157910, 9917616, 10172093, -8744553, -4139812, -56371, 1635309, -4537633, -3183645, 2042257, 952409, -6787122, -3315715, --2434173, 4003447, 177704, -5318244, -1832877, 2189360, 5293547, 878858, -745714, 388695, --3123515, 199716, 635655, 918586, -7646653, 5302674, 6845641, 1515050, 4028143, 3808026, --5901822, 10217190, 10012106, 1951526, -5047661, 3847217, -1006096, -8861591, -1093606, -2580739, -1165010, 884226, 1206886, -5210332, -3483219, -11050414, -7937100, 496069, 7432441, -4833986, -4235912, 1160178, -1550483, -8831527, 1263794, 5935645, -1134945, 5447629, 12472048, 3576097, --278636, -13079249, 1865090, -4615479, -17659294, -13497472, 3926137, 552977, -2672007, 3647501, -9160092, -964757, 5675800, 5040681, 3150896, -971200, -4241817, 4263292, -3537443, 900869, --2964064, 5856725, 10444824, -8539469, -2083596, 971200, 4122095, 1382443, -2277943, -1211181, --2816425, 159451, -3600793, 5682779, 1695975, -5875516, 7554848, -6600291, -1687922, 9025874, -8149701, 6822556, -6721087, -4362076, -5947993, 8019241, 10888816, 286152, -1508070, 8599598, --11375758, 1926830, 3874597, -705448, -9420474, 9543417, 3877282, 5083631, 9243306, 929324, --11436424, 3681324, 5771363, -2625836, -104153, 8895951, -7864622, -7659001, -6172405, 1368484, -11740830, 6368363, -599685, 12899934, -15493021, -5612449, 1128503, 8115878, -14280229, 14985678, -6248641, -79994, -1228898, 1518808, 2790118, 8253317, -1253057, 1166084, -2294586, -1552094, -4746476, 2607045, 5465346, 2588792, 3255048, -9648644, -3884798, 16973710, 1919314, 5251672, -7232725, 2925947, -5436355, -10193031, 3475702, -4081830, 598074, 3981972, -5024575, -5847061, -7667054, 9069360, -4395362, -2961380, 6969122, -8069707, 3818226, -6147709, 3043521, -5943698, -9171366, 1535451, -1072131, 3451006, 15634218, 4549444, 6110665, -1490354, 871342, 2902324, -11528229, -744103, 16476568, 730681, 7832410, -48855, 14835891, 5477157, 11048266, 8619999, --1916092, -4749697, -1421097, -5460514, -6376953, 8904004, -1927367, -3180960, 1112933, 371515, --4783520, -1852742, 831076, 4374424, -16106, 16619376, -4907537, -607738, -21442088, -1221381, -10838350, -6373195, 9379672, -13880797, 1570884, 823023, -744103, -18274012, -1141924, -30107184, -1066763, -3828963, -12690555, -2745558, 1360968, -7089918, 842887, 6849399, 883153, -7405598, -1007170, -2753611, 6321118, -7952132, 207232, 8779987, 1937567, 66572, -1593433, 6524056, --4836133, 537, -169114, 4790499, 958851, -10783052, -5409512, -7869454, 8173323, -19543712, -8993662, 6546604, 6364605, 2648384, 1398012, -9129490, 5862094, -13096966, -2801393, -3569118, --2410014, -1599875, 908386, 2781528, -9131100, -4815732, 15946677, 5374078, -5440650, -7932268, -2064269, -4106526, 5224828, -4610648, -431644, -6588480, 14927696, 5657009, -3983045, -817654, --5860483, -163746, 11052025, 11154567, 6585796, 5876052, -5074504, 6503118, 10771241, -7629473, --16106, -20104206, 11890080, 8088497, -2607045, 4845797, -1014149, 1757715, 7532836, -4415764, -11623255, -10090489, 1301912, 12840342, 5906654, 870268, 10168872, -3405909, 4861366, 2651069, -5621039, 8748848, -4782983, -1014149, 16425029, 8040179, 26307, 2212982, -10492605, 14754823, --12046310, -823023, 13341242, 3958886, 14340896, -8820252, 2652679, -663572, -2982318, 1749125, --13021267, -9582072, 13127568, -6484864, -2264522, -4482872, -13849122, 9942312, -2903398, -2619930, --5859946, 5970542, 15031849, -11778948, -1831267, 9451612, -10252087, -5091147, 9292699, 11783780, --19648938, -5878200, -1148367, 8074539, 329102, 9459129, -1703491, 10324028, 22167936, 4070555, --13470091, -4991826, 4184909, -29671244, 725850, -114890, -4791036, -1748589, 13398150, -22498112, -4712653, 10038949, -8310225, 8847633, 17002164, 3896609, -15967615, 3922379, -4102768, -665720, --15628312, -5081483, 14077292, -1995549, 12914967, -3835943, -4609574, 1693828, -11032160, -6624987, --7937637, -6328098, -4333085, 10122164, -11700565, 1412507, 20482700, 13303124, 4658429, -21320218, -3521873, 13101261, 5797132, 249108, -7306813, -9612674, -22065932, -15941845, 3332895, -8217346, --7398618, -1090385, 9708774, 6038187, -6415071, -418222, 13795435, -5937256, -1938104, -163746, -18142478, -140123, -429497, 8167417, 3365107, -21092048, 6296422, 4910222, 651224, -17679696, -7956427, 8913131, -6301254, -5398237, -6444062, 23307714, 1445257, -4518843, -137439, 10375030, --4744865, 2955474, -2295123, 2542621, 8975945, -15881715, 17105780, 19245748, 5599564, 8195335, --6268505, 10937671, 25425132, 891743, -2660732, -4581657, 10958072, -3754338, -5866926, -2093260, -4038343, -12533788, 5820755, -11055246, 12883828, 2859375, 12972412, -8027831, 11843372, 3401614, -15427523, 2439542, 3429532, -5541582, 9688372, 2241973, -2780455, 13492640, -5104032, -9915469, -19516868, 15178414, 5888937, 14296336, 21314848, 25301652, -7789997, -8377871, -8878771, 2800856, --11621645, 13415867, -1599875, -1791001, -19598472, 3976066, 22400402, 22069690, -857920, -3765076, --15638513, -657667, 14753213, -8621073, -9395778, 7161321, 1089311, -9547175, 2527588, -3046206, --31339302, -22196390, 10095321, 3317325, -16943110, 645319, 5959267, -15472083, -10194105, -7221988, -16181826, 6779069, 4418985, -6444599, -5335960, -5306432, -11887933, -15283641, -26422638, 12253005, -10126996, -6269042, 27384712, 12824772, 26235808, 17933636, 566399, -9645423, 6065568, 2514703, -11256036, 13482976, 14605036, -3103651, -4020090, 5930813, -8404714, -2460480, -7568806, -12627741, --20730196, -6450504, 18523120, -5674726, -9211631, -11968463, 6568079, 11254962, 6658273, 60130, -10337449, 22043382, -14924474, -6895570, -11808476, -8271034, -23296440, -6040335, 4172561, -10642929, --9183714, -25906706, -37340444, 3303367, -25065430, -37917580, -28335510, -11971684, 22811646, 7727183, -13450227, 10420664, -26060250, -11148661, 1091459, 11742977, 2432025, -58782532, -10126459, 17395154, --20685636, 6897718, -8684424, -32466732, -10762651, 32293322, 41192496, -23629300, -193274, -8970576, --35380868, -28691456, -26844620, -28949690, -15702400, -19383188, -2393908, 4551592, -5697811, 5665599, -5632313, -12730283, -3948686, -16972638, 5688684, -25923886, -22842784, 3779034, 3001645, -8201777, --8856759, 17606682, -6412386, 25026774, 5142687, 23044648, -17442936, 9068287, 6266894, 28183038, -15288473, 8718784, 2181844, 2714956, -4204773, 6928856, 11676942, -11581379, -14123463, 18973018, --3506304, -28286654, -50997368, -62699008, -44290776, 5106716, -644245, -58655832, 17779554, 7332583, -13578539, -21587580, 1890859, 4254165, 1957431, 26559540, 28943248, 56655988, 19008452, -33475512, --40960568, -25614648, -10871636, -5327370, 31766652, -9302899, -61653720, -18134426, 49786188, -7658464, -10725607, 6459631, 8926016, 16891570, 13987635, 4288525, -10381473, -4466766, 2115272, -11659762, --2886218, 17681844, -16866874, -10664941, -16877074, -4802311, 2593087, 1284195, 4165582, 7786776, --12807056, 10376104, 27387396, -1372779, -16197395, 584652, -10602127, -4517232, 16294569, -18131742, -1947231, 4548907, 20019916, 28038620, -18318572, -11399917, 11340861, 651224, 3343632, 2473364, --11975979, -32054952, -5287642, -15369540, 28714004, -54707684, -35020628, -15380815, -5404680, 14812268, -3797825, -19715510, -2593624, -22529788, -22975390, -8983461, -16332687, 2760053, 14925011, 64623688, -12985834, -9461276, -40586368, -33590404, 11337103, 519691, -38021196, 24607478, 20038706, -23132694, --74254080, 8606578, 9416179, -4109747, -3031710, -7264401, -22758494, 6530498, -6534256, 35327180, --40123048, -9394704, 36915244, -3383897, -28401008, -4803921, 20856362, 26397942, 14991583, -6546067, -17772574, -16627429, 11229192, -7629473, -7518341, -14551349, 19512036, 13460964, -16777216, -8021389, --4630512, 20810190, -4714801, 955630, -16973174, 13589813, 6950331, -17846662, 27004606, -31675, --29830696, 22373558, -32254668, -16743393, 23396834, -58061516, -39458940, 29514478, -23032836, 21544630, --39556112, 6704444, 9432822, -21086678, -3194919, -2872796, -41288056, -9933186, 33911452, 39131984, --50754164, -16629040, 8971650, -38284800, 42135776, 46309412, 747324, -69804496, -42710764, 71041984, --46331424, -9471477, 49183280, -36859408, -83799104, -19746112, -10308458, -39837432, -37553584, -932545, --47378320, -13984414, -20122458, -19001472, -14273250, 30843770, -3306588, -9846749, -12911745, 6040872, --16521665, -39528196, 30778272, 9649181, 26636850, 8296266, 27571542, -10879689, -16662862, 6070937, --28336046, 22232898, -25603374, -5479305, 17432198, -19659676, -3761318, -11932493, -30949534, 4745939, --23220740, -17073568, -20156282, -15283641, -8884677, -20991116, 4329864, 23400056, -15112379, -5528697, -3609920, 21619254, -9008157, 7768522, -21194590, 35997732, 12121471, 15592879, 10801843, 34637836, --946503, -39997956, 10060424, 15105937, -9970230, 420907, 22597434, -27394912, -26382910, -31738734, -29728154, 9398462, -38343856, 16963510, -24541444, -3422015, -35264904, 18900540, 29030220, 8841190, --38408820, 28485834, 35479116, 66463008, -15730855, 33053532, 6616934, -15467251, -29387776, -17082158, -38776040, -12458626, 7397545, 15124190, -3650722, 35686884, -4978941, 28033788, 29393682, -35623532, -18690088, -9228274, 1127966, 13252122, 11148661, -1093606, 6075768, 10739566, 35940288, 36798208, -28566902, -20607790, -6802692, -48661444, -1209033, 11615739, 22267258, 5171141, -40094056, 17766132, --23972896, 31391916, -28039158, -19689740, 2263448, -23577760, -3854733, -13576928, 48371532, -26250304, --12738336, -50415400, -16307454, -26419418, 71393632, 43459700, -15000173, -47925928, -51549808, -30478162, -35352948, 46446312, 23240068, 7007239, -62186296, -28488518, 19750408, 17598092, 1856500, 22650584, --14041859, -40368936, 17459042, -68720016, 72318656, -6886980, -53119080, 112036904, 7449084, 2794413, --28978144, 20222316, -41081900, 26015154, -16655346, 42458972, -18571438, -1648731, 24453396, 4565014, -2574833, -10580652, -8916889, 1362578, -15629386, 18030272, -1544041, 19115826, -14253386, -14373645, -5539434, 949188, -14413910, 9648107, -1272921, 8427263, -3962644, -3903589, 8562017, -7393786, -89121, 5997922, -2325725, -3498788, 30663920, -1981591, -9206799, -5306432, 15040439, -1274532, --15396921, 8638253, 18429168, 3498251, 1406602, -10428181, 4723391, -8499203, 9132711, 21097954, --6359773, 9508521, -6742025, -2660732, -7408282, -4496294, 7092602, 6444062, -10799158, 6948720, -4009352, -2250026, -10431402, 1290638, 6757594, -10270341, 15916612, 9829033, -19437412, 3928285, --16994648, -25865366, 20564304, -11812234, 25107306, -23795192, 52173652, 10334228, 13291850, -5957120, -5348308, -908922, 10407243, 3665755, 22619446, 2089502, -11266236, 7808251, -7116761, 3954591, -5170604, -9522479, 1213328, 2990908, -10212895, 10490994, 3246459, -3926137, 14071387, -4235375, -5996848, -3550864, 3213709, 3082176, 1955821, -1152125, -3207804, -1300838, 2626373, 849867, --1459752, -5986648, 5633387, -3856881, 3215320, 4773320, -3639448, 1444183, -3330747, 1685775, --5749351, -10195179, 11891154, -5443334, -1980517, 5158256, 3053722, -1414118, 2179159, 9946607, --9505299, 4978941, -2959233, 8660802, -7770133, 5434744, 3524558, -1129040, 3035468, 611496, -1294933, 4402879, -4298189, 3483755, 4128537, -1196685, 1000191, 7425999, 730144, 2587718, --5856725, 11105175, 9595494, -45953464, -113883744, 24428700, 94386736, 63797980, 133190696, -43737800, --37487548, -76841256, -122850560, -12215961, 38009924, 50306952, 65538516, 33083060, 3400004, -10813654, --28681792, -40606768, -6401649, -10872710, 3726421, 9281424, -760209, 2323041, 4616016, 2171643, -15763067, 19079318, 11543798, -2165737, 1884417, -14078903, -29942902, -31509490, -15815680, -20636244, -16694001, 31496068, 32983738, 36703716, 19690278, -5812702, -14844481, -26782880, -28825674, -19608674, --11524471, -1114007, 6757594, 13990856, 14387604, 12676059, 10297721, -1607392, 2433636, -2910914, -961536, -2086817, -1940252, -512712, -10555956, -10171556, -8129836, -15466714, -452045, -2456185, -1549946, 27749784, 35264364, 12904766, 11763379, -8578660, -19718732, -11546483, -22576496, -11243151, -2200634, -286152, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, -{ -6260452, -49392, 8157217, 379568, -2594160, -643708, 55835, 751619, 3802657, -1575716, 1945083, --3844533, 1293859, -403727, 2646774, -1793149, 3823595, 978179, -1950452, 274878, -3888556, -4334696, -404264, -886911, -2147, 639413, 909996, 661425, 3200288, -5628555, 420907, -3550327, 702764, -279710, -625455, -325344, -130460, -465467, -5762236, -478352, 1702955, --2002529, 1939715, -4516158, 22549, 2531883, -2654827, 5084705, 4920959, 3670050, 3128347, -4027069, 497679, 2022393, -1910187, -810138, -3316252, -1329829, -183610, -2893197, -971736, --4112968, 578747, -3486977, -4562329, 864899, -3337727, 2522757, 367757, -3713536, 2554969, -1621887, -4126390, 1232656, 89121, 4827543, 1418950, -6394133, 849867, 2075543, 2015950, -10150618, 2787971, 2167885, -2957085, 417149, -5089536, 1232656, 4756677, -2363306, 270583, --968515, -2478196, -4041564, 3189550, -6779069, -3382287, -3391414, 3742527, 4063576, 2185602, -988379, 2985002, 2436857, 4894652, -1661079, 1756105, 3025268, 704375, 1007707, -3456375, --1503239, -1401770, -1312113, 3344169, -6243272, 1126355, -2155000, 6641630, 169114, -1093069, --1633698, -2610803, -890669, -2724083, -8244727, -2509335, -1609539, -1224603, -1846299, 969052, --1544041, -266288, -532039, 3020436, 1289027, -234076, 1838246, -1467268, 3529926, -2160369, --3862786, 3886946, 3860102, -1489280, -3736622, 568009, 1951526, 1767916, 1647120, -1461900, --169651, 1793686, 1486059, 9223979, -1644436, -805306, 1050120, 2597918, -6679748, 4274566, --7941932, -286689, -3811784, -493921, -2499134, -527207, -561567, 4103841, -3330747, 4439923, --4483946, -4881231, 2163590, 6747394, -7794829, -2094870, -3740917, 144418, -1919314, 2214593, -2873333, 1518271, 2924873, -4467840, 220654, 6504728, 2569464, 918049, -4597763, -6538014, --3946538, 1127966, -3348464, -1806571, 1347009, 4430259, -3840775, -3709778, 1598802, -2675765, -4998805, 1789391, -467078, 3629247, 3358665, 137439, 5607080, 2903398, 1779727, 1632088, -3683471, 5912560, -3755412, 1273995, 1604707, -3855270, 379568, 3482682, -1263794, 8516383, --2558727, -1968169, -1734630, 3319473, 4202089, -5095979, -2239289, 1787243, -11702175, -1845762, --2565706, -2036888, -998580, -1379221, 6308770, 7538742, -1656784, 6162741, 2377801, -3312494, -1637993, -5050882, 947040, 1142998, -6829535, -956167, 1108102, 1262184, 4791036, -854699, -4163971, -2707440, -5240397, -5507222, -1564442, -2758980, -4197794, 4427038, -1692754, -790274, --749472, 965831, 2390149, -6692633, 32212, 988379, -3195993, 8080444, 623307, -1941325, --1755031, 8616778, -634045, 1121523, 5046050, 176094, 3062849, 1226213, 237297, 4744865, --89121, -3313031, 4173635, 2268817, 2637647, 3826816, 1161789, -3171297, 2092723, 3096135, -2907693, 4650913, -166967, -4518843, -3748433, 5390721, 7450695, -7297687, 1056025, -2189360, --1713692, 1167694, 2313377, 2127620, -8694088, 9193914, 8508867, 6413997, -4538707, 5010080, -9051107, -2313914, 7059316, 2653216, 1015223, -1127429, 7781407, 3687230, -1895691, -5637682, -3195993, -2343442, -3075197, 3163780, 3677029, 1635309, -5659693, 897648, 4927938, -2451353, -1610613, -10982768, 1487132, -886911, 5188858, 1291711, -2384244, -3310883, 6655589, -5826660, -351114, -4704600, 421444, -1439351, 3643743, -784905, -1379221, -5762773, -1540283, -1012539, -6992744, 361851, -6730751, -236760, -556198, 2244657, 3214783, -2908767, -213675, -3713536, -3723737, -865436, 4529043, -2583960, 6847789, 3551938, -8210904, 8357470, -1570884, -5769215, -567473, 7636452, 1072131, 1177895, -6742025, -398358, -3095061, -3324842, -4173098, 331249, -9855339, -3541738, -7328288, -486942, -10934987, -123480, -9413495, -3345243, 6277632, -6746320, --7437273, 2079838, 489626, 542240, -1835562, -2513630, -5420786, 3470334, -10493142, -3306588, -925029, 6308770, 249645, 6400575, 2187749, 14206141, 5355288, -276489, 493384, 6695854, --1771137, -2175401, -1427003, 994822, -4665408, -2384781, -7768522, -679142, -3656628, -2249489, -9215926, -6979, 5698348, -2518462, 2216740, -768799, 3317325, -1358283, 3067681, -3422015, --4191888, -856309, 917512, -4258997, -4250944, 105227, 1836099, 4085051, -879395, -2341294, --1157494, 3797825, 6760816, 5906, -5119601, -7308961, -250719, 1374390, 328565, 8761733, --6325950, -1083406, 3664681, -2563022, -5597416, 5082557, 1992865, 1185411, 630286, 8918500, --6827388, -1385127, 581968, -525060, -237297, -5625334, -4316442, -603443, 3758633, 1363652, -1524713, 1578401, 3955128, -801011, 3623342, 2917894, -9231495, -3553012, -10835666, 2829310, --3786551, 5481989, -3475702, -4792110, -3467649, 2856153, -7187628, -6012418, 8489540, -4584878, -9205726, -2142115, 2829310, -3196530, -6059662, 6798933, -5116380, -5832566, -475668, -3157338, --6759205, -5267778, -8541616, 395674, 5730560, 3253438, -3204046, 9686762, 3722663, -3490198, --4268661, -6915971, 540629, -2547453, -4612795, -2386391, -1767379, -3353296, 2181844, 7806103, --68183, 612033, -4759361, 2574833, 3163244, -4406637, -2937758, 2006287, 10220412, 3933653, --1196148, -977105, -253940, -9035537, 13316009, -1905892, 501974, -1587527, 8857833, 8404714, -3261491, -12656732, -1649804, -15483894, 10008884, 4495757, 814970, 17002164, 8364986, -958851, --6835441, 7292318, -2597918, 2173254, 2883534, 1554778, 5987722, -4329327, 9831717, 3993246, -1490354, -2330020, -4108673, 6738267, 5890011, -556735, 4046933, -7414724, 2091649, -10059350, -4908611, 1041530, 5990943, -8188355, 2426120, -2380486, 2549600, 10255845, 8971113, 821413, -3063922, -5682242, 8686571, 643708, 17745732, 18458158, -1717450, -4413079, -4230543, -3514357, --9769977, -2543158, -12963822, 1200980, -432181, -399432, -2069101, 5147519, 8804146, 12989592, -12496744, 9369471, -14175540, -10353556, 251792, 987306, 16317654, -10821707, 8970039, -434865, --3186866, -4583804, 9241696, 2007897, -6717329, -3726421, 17328582, 16976932, 19101868, -1864016, --700080, -3244848, 3313031, 9283035, 10827613, 3078418, -4458713, -9192304, -18464602, 5470178, --10849624, -2477123, -946503, -2455648, 1447404, -639413, -3211562, -506269, -10572599, -4383551, -882079, -2117419, -11812771, -5220533, 1296543, 8617852, -2197413, 92879, -9307194, -3413425, -428423, 6170795, -3567507, 3704946, -10386305, -3210488, 2862596, 3833258, -2556043, 14155138, --2557116, -2106682, -7079180, -2777233, 6253473, 1649268, -184684, 7166153, 10915123, 11764452, --1612760, -6504191, -6336688, -366683, 2035278, 2333778, -4258460, 3337190, 5858336, 3684008, -4992900, 11360725, 9027484, 4452808, 303869, 1431835, -10864120, -4221953, -18210662, 21363704, --1195075, 2646237, 11422466, -367220, -4786204, 47782, -21985400, -13610751, -6700686, 2835215, --4796942, 1858110, -10593000, 6339909, -4081293, -687732, 12622372, -13479218, -9159018, 11755862, --4466766, -18720688, 687732, -11783243, 1706713, -1551557, 6178311, 2289218, 2809446, 738734, --2803540, 7399155, -1520418, 9680856, 5692443, -4352413, -6843494, -6506876, 2169495, -3563749, -2177012, 1278827, 5421860, 1035624, -12109660, -89121, 3190624, -4741107, -223338, -8703214, --2477659, -158377, -231928, 17205638, -3932580, 11919608, 14592688, -5232344, 7407745, -3600793, --1323387, -9713605, 4519916, 11834246, 8171176, 638876, 2539400, 6533182, -1692754, 4877472, --4059281, -6026376, -8141111, 482110, 13915157, 20851530, 2864743, 5068062, -5181878, -2690260, -14071387, -9591199, -2406256, -18712636, 17148730, 8940511, 1002338, -6440841, -17782238, 1646583, --4936528, 2027225, -19932944, 6896107, 10074920, -11520176, -3046206, 1611687, 878321, 3709778, -10916196, 13776108, -318364, -106300, 2217277, 458488, -8799851, -9673340, -6784975, -12721693, --6669548, 10736344, 4561792, -4083977, -5832029, -3580929, -22767622, 4795868, 4805532, -10455024, -16481937, 579284, 12114492, -4610648, 7608535, -2750927, -11689290, 967978, 9404905, -5613523, -4784057, 6481106, 17276506, 4992363, 4789426, 17337172, 8931384, 6547141, -25089052, 4941897, -2501819, 4624606, -815507, -9842454, 15940234, -12976170, 8240969, 10372883, -17675402, -3414499, -18864570, -18540836, 948114, 691490, -11790222, -17394618, -8098161, -7694434, -23102092, 14468134, -1621350, 15496242, 164283, 1602560, -8499203, -4751845, 7140920, -1321776, 7406134, -8840653, --3367254, 743566, -4452808, -7366943, 8966818, -10653666, 10827076, -4779762, 2986613, -3221762, --8686034, -7803419, 2583960, -3285113, -901406, 5266167, 22425634, 947040, -3805341, -8569533, -2502892, 18037788, -4300873, -3796751, -11784317, -4507032, 699543, -11074036, -4660040, -15490336, -8590471, -18803904, -33558728, -4175782, 117038, 14806363, -17066590, 14175003, 8764955, -8441221, --16217797, -3233037, 1471563, 3633006, -517544, 8612483, -7427072, -3228742, -33387466, -5207111, -32042604, 2313914, -6900402, -5417565, -18656802, 11901891, -7059853, 16885664, 15234249, -2999498, --4242891, 54761, -20777442, 16050293, -12621298, -10135586, -7565048, 6936909, 3641059, 14996952, -3051574, -5976984, -7290707, -7539815, 8381092, -2009508, -3427384, 13848585, 15236933, 6166500, --7923678, 12886513, 19815368, -5572183, -2629594, 17416092, 5507222, 4665408, -8982924, 1460826, -16577500, -20878910, 16825534, -1860258, 3524021, 10729365, 12589623, 1410360, 7027104, -9024263, --7125888, 7306276, 22680112, 7202124, 6682432, 9552544, -9153112, 3782256, 10971494, 6982543, --162672, 9116605, 6345278, -11159936, 12008729, -10837276, 4526359, 10599442, -8032663, 9026411, --10116795, -3265249, 4197257, 1923072, 9811316, -3489124, 8905615, -3700651, 3513820, 3586298, -766115, -4262218, -5886790, 24777130, -14712947, 15366856, -5829881, -15343234, -19984482, -5575405, --2208687, 11639361, -17663590, -2781528, -2295123, 9228274, 17059074, 14445049, 8639327, 1487132, --4765266, -2522757, -2130304, 12385075, 9644349, -2135136, 1185948, -2396592, 7423314, -18651970, -10854993, 6572374, 8372502, 3387119, 1534377, 16760036, -6971269, -13431436, -483184, -4056060, -363998, -18713172, -11290395, -507343, 15475841, -10206990, -4116189, 3400540, -1353989, 1285806, -15109158, 7271380, -3222836, 2370285, 6955163, 6182606, 17629768, -4265440, 7570417, 10668699, -4126927, -1584843, 2093797, -18538152, 7630010, -2026688, -77309, -2669322, -12075301, -12661564, -1988570, -4552666, -21225192, 7831336, -18156438, -9000641, -3853660, -21241298, -16200617, 10368588, --25184078, -27985470, 18312666, 16521665, 6270116, 17803714, 29224032, 8990977, -9637370, 10055592, --3166465, -6984691, 13991930, 1871532, -10388989, 8005819, 10415833, 3055332, 4426501, 1607392, -2612951, 26656714, 644245, 6387690, 3618510, 16845936, 2177012, 26401164, 1133335, -10432476, -21722334, 4981625, -7748121, -2412698, 12144557, -1482301, 1151588, 9214315, -14179298, 16231218, --1882269, -22029424, -4938139, 2897492, -21257940, -1907502, -878321, 10598369, 11190000, 17664126, --10406169, 3148211, 4348118, 4054449, 8988830, -10428717, -10515154, 6832756, 1523103, 13403519, -12535936, 3551938, 29306710, -4367445, -2044404, -18577344, 30152282, 4858145, 21839372, 11580306, --28265716, 3937411, 6034966, 18087718, -6254010, 6262063, 16757352, -36595804, 21087216, 21545704, --9791989, 4890357, 2563022, 5638755, -357556, 17169668, -13241921, -2969970, -14195941, -310311, --8299488, 1060857, 3035468, -20010252, 8282845, 21488258, -15547245, -14310831, -15256798, 28709708, --13313325, -7063611, 1890323, -9822590, -30609158, 5301601, 20777978, -29596082, -14339822, 10399190, -15014132, 4502737, -5471252, 7095286, -11528229, -4676146, -1580548, 15013058, -21276732, -15714748, -10297184, 18876382, 6121402, -22619446, -8666707, 1091995, -2311229, -3429532, 10762651, -2929705, -16852914, -14078366, -4617090, 785442, -18390514, 11651709, -21225728, -12554726, 4748623, -7682086, -17579838, 29032906, 14715095, -16874926, 8024073, -3688840, -7220914, -10928544, -5732171, -18617610, -14576582, 15217606, 6123013, 20490216, 34523484, -801011, -27090506, 5072357, -32219770, 4871567, -13843753, 6205154, 1366873, 18484466, 13538274, -1416266, -3450469, -26756036, -14663555, -184147, --12809740, 34897148, -7028177, -8624294, -15876883, 1323924, 12775917, 8745090, -1058710, 6263136, -9813463, -16335908, 4796405, 29831770, 10179609, -21498458, -15336254, 9270150, -10952703, -2029909, -6777459, -5252208, -17894444, -4743255, 1420024, 28373090, -6971806, 5812702, -8435853, -24064702, -3353833, 28791850, -8693014, -18264886, 4324495, -11422466, 6343667, -6783901, -8088497, 19622632, --6139119, -2882997, 8854075, -17971754, 5168993, 20892868, -10079215, 1394254, -13895830, 37264212, --8364449, 4250407, 10471130, -8785892, -4145180, -9787157, 2757906, -10563472, -12625593, -9796820, --57626648, -19915764, -635118, 18972482, -9319005, -28627568, -10531797, -3830574, 14641007, 4130685, --3471407, -13940390, 15579457, 27371290, -11829414, 20796232, 5508833, -38144680, 14785425, 18532248, --5961952, -15257871, -2550674, 24196772, 25754772, -1677185, -18855444, 1766305, -1818919, -2067490, --15658914, 4381404, 7683160, -25021406, 17921288, 15335718, -17581448, 3732864, -19774566, 7532299, -49536004, -43551504, 45817636, 20968030, 2388002, 28201292, 14150307, -28072444, 17420388, -21023864, --4489852, 23735064, 1393180, 7046431, -11661373, -20500416, 63652488, -14570140, 1177358, 25275346, --11818139, 5160403, 2135136, 15697032, 35910760, 34178812, 32300838, 2245731, -453119, -4911295, -1803349, -8362838, 2631741, 27770722, -6749004, -8085276, 15330886, -3433826, -42374684, 19969988, --30683246, 44292388, 5571647, -37482716, 8969502, 927713, 18232136, 9043591, -8863202, 33017024, -8230231, 2314987, 21927956, -16585016, -23745264, 1514513, 12856448, 44392244, -5884105, 906775, --4333085, 32273994, 3644280, -24111946, -14561013, 5632313, -2580202, 14865956, -24103894, 12648679, -4112431, 8223252, -2035815, -8401493, 5641440, 10892037, 200253, 30407294, -47022912, 5371394, --16547435, -9008157, -6026913, -33055142, -50016504, -50343460, -37643240, 5549635, 198642, -28406376, --248034, -3727495, 3226594, -16785806, -48242684, 49512920, -872415, -4881767, 9669045, -44841608, --3230889, -9246528, 8898635, 16559783, 64865816, 51219632, -5124433, 2696166, -932545, 16392816, -20871394, 16013786, -11276974, 59825672, -55239720, 10600516, -9881109, 3167002, 24712168, -16342351, -6879464, 1925219, -59853592, 2549063, -5879810, 4016331, 7972533, -26069914, -9175124, -43844100, --10630044, -1046898, 3427921, -15837692, -11811697, -18366890, -7170448, 20689932, 5245229, 40549324, -10638097, -11920682, -12875775, 25522306, -25756382, 47630652, -34978212, 12035572, -27981176, 2201708, -28924994, -48771500, 48715128, 10162429, 6715182, -32780802, -5666136, -4599910, 1304596, 18719078, -17943300, 23154706, -38601556, 1367410, -14276471, -11079405, -13888314, -18820010, -13343927, 3722663, -24550034, -21240224, 8297877, -41517300, -13296145, 15294915, 15268609, 6782827, -49335216, -22836342, --16284369, -20500952, -19611894, 8385387, -15037754, 35208532, 10089415, 23722714, -7073275, 25072946, --47991428, 72500656, -55070072, -5950677, -33396592, 6362994, 304943, -20076288, -28696824, 32975686, -21721798, 10344966, -14946486, 14585709, 3959423, 31249108, -25304336, -16236587, 18742700, 32566590, --42087996, 16878684, -2231236, 19880330, -15720117, 6002217, -19194208, 4065187, -35270272, 11612518, -35902168, -843961, -3843996, 46244448, 6906308, -20621212, -45876692, 38826504, -21427054, 17886928, --17697412, 46444164, 18831820, -4252018, 3269007, -25615184, 2012192, 12343736, -14412837, 13835163, --57087096, 22891102, 48354888, 40553080, -23716272, -21109228, -24800214, 27009438, -258235, -6268505, --459025, 66842040, -34389268, -12510703, 22067542, -19027778, -61940408, 27824408, 9234717, -38381976, -18993420, 44681080, 30317100, -5679021, -23199802, -47500728, 24456618, -3321084, 5922760, -17755932, -14388677, -233002, 7596187, 1961190, 2077690, -10298795, 6808597, 24881820, -33091650, 27365920, --5450851, -17597554, 5024038, -12111271, 6823630, -12381317, -10536092, 7802345, -26601416, -3080029, -33673080, -50131396, 13247290, 1977296, -9114457, -15658914, -18889266, -12114492, 35304632, -30092688, --5108327, 11365020, -31097174, 7380902, 15709917, 10833518, 4777078, 4991289, -17983028, 13219909, --45427868, 447750, 37960532, -16422344, -5382668, -8836895, -12023224, -365609, -32552630, 16681116, -11541114, -25975426, 23270670, 6925098, -30872224, 12408697, -7013145, 21823266, 17452600, -27181774, -8264591, 31229244, -30321396, 16936130, -22070764, 17263622, 17223356, -27784680, 15125264, 326954, --15935402, 26377004, 7494718, -24980604, -122997664, -251165936, -108801720, -172081088, -228745120, 65336116, -13429289, 54343148, 302281952, 249196144, 159163440, 257382896, 170131168, 6822019, 30957050, 18137110, --160544272, -109034728, -79650704, -181531632, -184757680, -62083752, -62337692, -120524296, -46225124, -37615860, --141715664, -124048320, -49999324, -74748000, -134336384, -43758736, -34285652, -108287400, -24822226, 51373176, --42058468, -36701032, 83191904, 45777908, -52475372, 72443752, 128463008, 3049427, 67160944, 160996320, -73006928, 32131188, 175762416, 125666448, 91253560, 216750896, 297444192, 233663408, 273540576, 357499648, -231496048, 149834224, 199367008, 127576632, -40175124, -10940355, -91579976, -223825248, -315535136, -336593888, --450576416, -509102880, -538365568, -513171296, -487514752, -472316480, -378379104, -252343280, -194695696, 20937428, -161597072, 105515000, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ -11677479, --721555, -141734, 1270774, -1389959, -1471563, -1053341, 2721399, -7006703, 2644089, -1918777, -4832, 372052, -279173, -894964, 426276, 1571958, 2938295, -1367947, 3275450, -2646237, --2936147, -2094333, 1474784, -2743947, -1764158, 2119030, 412854, -886374, 2610266, -599148, -3758, 1705639, 921807, -1284732, -1789928, -1931662, -2195802, -4995584, 1326071, -1185411, --395137, 7590818, 661962, -1540283, 4350802, -1591822, 75162, -1959579, -3619584, 4491999, --1444183, -741419, 51003, -3106335, 995896, -136365, 2281165, -457414, 2287070, 889595, --629213, 2748779, -356482, 1005559, 1341104, -80531, -6255083, -71941, -914291, -2363306, -1582696, -525597, -1345935, -744640, -3873524, 2535641, 3999152, -1262720, 3567507, -455267, -3760244, 1938641, -685584, -1325534, 3809636, 412317, 854699, -4099546, -554051, -205622, --67646, 5834176, 2925410, -117575, -4184372, -3042448, -1729798, 612033, 24696, 1326608, -2762738, 883690, 1097901, -4269198, -543850, -4156992, 295816, -2269890, 2895882, 2830920, --977105, -2222109, 3022583, 674847, -959925, -3861176, -404264, -2464774, 828929, 2428804, --3841312, -1907502, -537408, -1531156, 10253161, 2425046, 5971615, 427349, 2041183, -53687, --2804614, -2738042, -3335579, 1593433, -2733747, 1994476, 177167, 2426120, 2668785, 6116571, -1977296, -648003, -224412, -3862249, 6098317, 5329518, 1020592, 1445793, 1575716, 1413044, -13799730, -3500935, -3128884, -1321776, -2978023, 462246, -6865505, 344134, 1107565, 168041, -4299263, 352187, -1162862, -4155918, 2323577, -5788006, -5097053, 1602560, -2615635, -1278290, --1093606, 798327, 3535295, 5060009, 122407, -936303, 5900212, 2101313, -642635, 105227, --2816425, -36507, 6478958, -105764, -3460670, -2651606, -1051193, 2203318, -3467112, -3957812, --4290673, -3316252, 2741263, -3118146, 791885, -3764539, 921271, 4410395, -102005, 3124052, --1762010, -2567854, -1676648, 2169495, -583042, 3387119, 4519916, 718333, -2006824, -2582349, --655519, -367220, -331249, 190589, -5000953, -412854, -2705293, -2163053, 1423245, 556198, -580357, 1759863, -6134287, -2735357, 1100049, -738734, 2367601, -10449655, -5397700, -2619930, --7298760, -2833068, -7028714, 1458678, -1064615, -4540854, -5193153, -1162326, -4335770, -552977, -2692408, -697932, -6343667, -2623151, -419833, -2736968, -2402497, 1241246, 4990752, 6607807, --1653026, -2326262, 3442416, 4065724, -1927904, -1481227, -1424319, -3614215, 438624, 1039382, --3401077, -2572686, -1205275, 2298881, 5479842, -23622, -2574833, -410169, -3586835, -1528472, --5382668, -2676838, -2701535, -8034810, -1376000, -3861176, -2975339, -8772471, 4629438, -4033511, --3815542, 1112933, -1106491, -974421, 507343, -7327214, -2405719, -2849711, -1154273, -4364224, --1157494, -2223183, 1232119, 2106682, -2887292, -1498407, -3953518, 928250, -1123671, -872415, --614717, -5223217, -748398, -4232154, -18380312, -1363115, -8993125, 8270497, -4613332, 14806363, --9281961, 9350144, -8198019, -449898, 45097, -6398428, 5191005, 213675, -2204392, 1526324, --1893007, -837519, -6052146, -63888, -4499515, 3731253, 1557463, 4559645, -2430952, 6804302, -6436009, -6036040, 1971927, -5153424, 5716602, -30602, -3464428, 222801, -198642, -304406, -4321811, 459562, -5538361, 2298344, 4632659, -434865, 5419175, -2504503, 4510790, -6310381, --2677375, 3810173, -3063386, 791348, 5883032, -5163088, 8485782, 2890513, -7359964, 1626719, --7044820, 2416993, 4814659, 2519535, 4687957, 5492190, 2622615, -1129040, 206695, -57445, -2581275, 3725884, -682363, 7423851, 2382096, 4852776, 3884798, 897648, 1433982, 11991549, --150861, -3548180, -1331440, -4781909, -5653788, 8689793, -1943473, -1530082, 7975218, -868657, --1788317, 3382824, 6164352, 1576790, 2961380, -406411, -7151658, -2088965, 5028333, -8174397, --8041790, -3197066, 1527935, -5845451, -3547106, -151398, -969589, 5223217, -2301029, -1475321, -5608154, 7776575, -7156490, 1543504, -1838783, 2652142, 630823, -3388729, -843424, 3051574, -4969277, -1683090, -7408819, -1942399, -797790, -2231236, -3771518, 199716, -610959, 986232, --1144609, 664109, 6630893, -5361730, 512712, -4179003, -3221762, -5619428, -1703491, -3418794, --7362111, -663036, 392453, -3240553, -647466, -3422015, 2720862, 3070365, -607738, 582505, --2632278, -1194538, 8783208, -1584306, -3485903, -11769284, 16247861, 18202608, 3806415, -6064494, -4478577, 7417946, 7466264, 4369056, 5749888, 2774549, 9141301, -491774, -620623, -3162707, -5910949, -2821257, -7205882, -10180146, 1675037, -4692252, -3892314, 4099010, -639950, -2448131, -9360344, -284005, 11518565, 464930, -3877282, -2642479, 4363687, 2906619, -1679332, -8412230, -13105019, 7607998, 577673, 7145752, 4589710, 4747550, -3619584, 5311801, 3078418, 1294933, --1000727, -1974611, -5032628, -7579007, 2748242, 4049617, -5578089, 2692945, 5816460, 8099772, -2624225, 7322383, 3842922, 6250251, -8367133, 2815351, 1358820, 1933272, 758062, -494995, -4306779, 3516505, 3848828, 4893579, -1125281, 2339147, 1828582, 6895033, 8905615, -4520453, --4910758, 14810658, 4880157, 6683506, -5022965, 2361695, -12853763, 953483, -9189083, 7437810, -5178120, -3781182, 6407555, 3660923, -6082748, -1392643, 9680856, -108448, 6794639, -1570347, -1685238, 7602629, -8826158, -545461, 1937030, 2871723, 1057099, 3133716, 842887, 9145059, --3706020, -2460480, -2236604, 6929393, 1366873, -3089692, 4654134, 11585674, -7483981, 1510755, -2100239, -614717, 5210332, -2248416, 9368397, 3015604, 2837363, -7135552, -73014, -1855426, -4734128, 3105261, 5087389, -4900558, -2503429, 4217658, -7861938, -4789963, 2747705, 9305584, -6451041, 8239358, -8057359, -2775086, -8148090, -2277943, 3755949, -666794, -7488276, 1287417, --4063576, 179315, -8039642, -10948409, -3060164, -7453379, 2560338, -17775260, -16087337, -11763379, -2750390, 2772938, 12191265, -6334003, 11551315, -5650567, -20725902, -2470143, -2492155, -8463233, --13621489, -5441724, -898185, -8715562, -678068, -13038447, 297963, -13712220, 6846715, -3990562, -4830765, -3273839, -819802, -4770635, -5276368, 7293928, 996432, -3081102, 8536248, 271120, -899796, 2373506, 7822746, 6602439, 5061082, -625455, -10469520, -1809255, 4228396, 665720, -5551245, -3702262, 2187749, -15362561, 4094178, 7990250, -11538967, 5692443, 1778117, 9587978, -7471633, -837519, -3213709, -1079647, 6604049, 2652679, -9735080, -8396124, -13273596, -7055558, --9022116, -2785823, -11038603, -3099893, -3903589, 10066330, -5349382, 4574140, -3028489, -2380486, --3670050, -8304856, -4064650, -21606370, 18331994, -3872450, 11227045, 6995428, 539555, -13909252, -12724377, 2662343, -107374, 8515310, 6192269, -5085778, 796716, 13795972, 5098663, -4609037, -9881646, -3789235, -3100967, -1560147, 3741990, 1240172, -804233, 2421825, 4692252, 4675609, -4371203, -8098698, 6583648, -6493991, 11363410, -5276368, 11304891, 4704063, 1784559, -8964134, --9707163, -2097018, -2726767, 13644037, 4217121, 11228655, 4855461, -7262253, 1079647, -471910, -4937065, 1798518, 4431870, 511638, -5148055, -1790465, 6942815, 17211544, 11911555, 3021510, -4575751, 703838, -1435593, 9855339, 7420093, -868120, 10579041, 15932181, 20146080, 2602213, --10293426, -11055246, 5523865, 4908611, 386547, 6056441, 1198833, -1299228, 1158567, 14964740, -10210211, -15610596, 12621298, 5057861, -10782515, 24293946, 3372086, -12752832, 2573222, 6618545, -310848, 4732517, 17248052, -17030620, 10617159, -6990596, 9358197, -3885335, 1673964, -15758772, -2226941, -1843078, 5826660, -6121402, 408559, 1064615, -322123, -9283572, 8280160, 806917, --1484985, 4028679, -2311766, 3972308, -2764885, 12284680, 9162776, 12161200, 11556683, -2073396, -3586298, 5186710, -170725, -6511171, 7879655, -10336376, 2369748, 10035191, -6867653, 5255966, --12218108, 3490198, -1923072, -2845953, -1973001, 699543, 2444910, 3174518, 10810433, -8067559, --1596117, 7623567, 15705622, -15425375, 2445447, -4127464, 3618510, -3301756, 23135378, -15969225, -3539590, -9400073, -6910603, 1046898, 71404, -244276, -24182814, 10991358, -15600395, -3695819, -20865488, -6901476, -927713, 10958609, 2185065, 6577743, -16449188, 14812805, 486405, 660888, --4560719, -10072235, -1838246, -1963874, -10795400, -6677601, 10865194, -4099010, 1655173, -6068789, --25586730, 8005819, 593779, -8211441, 4232154, 9229348, -1468879, 600759, -2527588, 1969779, -5997385, 1623498, 9977209, 6767258, 1053878, 8769249, -8055748, -7796977, -11066520, 3477850, -5389647, 1291175, -17220672, 4232691, -14831059, 20038170, -5567352, 6826851, 16754667, -7349226, -10346576, 2320356, 11296838, 4422206, -6681896, -18398566, -13780403, -10484552, -2338073, -10977936, --3133716, -9643812, -7103339, 17638894, 2675765, -8105677, -8231305, 3249143, 5087389, -1949378, -651224, -33215666, 10614475, 1520955, 6424198, -21045340, -25613038, 14247480, -12948790, -15002858, --4789963, 8630737, 18702436, -13596256, 325881, 8420283, -3492345, -4870493, 4294431, 2391223, -13903346, 4010426, -14741938, -1429150, -7818451, -1399086, -9036611, -11938398, 1005559, 10050223, --1494649, 3927748, -9817221, 1669669, 10200547, 7401303, 590558, -206695, 6114423, 5356361, -3422552, 8826158, -13297756, 12642236, 9237401, 2188286, -11124502, -490700, 7311645, -9540733, -8600672, -7896298, 9825275, -4231080, 13039521, -23153632, 22239340, 3850438, 20906828, -221191, --5414343, -3221762, 6986838, -1285269, -19009526, -1196685, -2222109, -20825760, 4946192, 11198053, --18909668, 12552579, -16873316, 2410014, 4754529, 594316, -21175262, -12306692, -11578695, -857383, --1846299, -11474005, -11162083, 17796734, 3873524, 11831561, 11479911, 3473555, -8238821, 2241436, -29795262, -19907710, 5221607, -3222299, -10712185, 994285, 4298189, 5085242, 200790, 401043, --5464809, -8181376, -12905840, -6372658, 10328859, -8075613, -12979928, 7956964, -4452271, 3235184, --1452773, 6237903, -5364414, 12814035, -4231080, 1633161, -6979, 1592896, 11809013, 4185446, --5109401, 6401649, -4671314, 9692667, -5475010, 4099546, -13345000, -9692131, -7082938, 2551211, --6624450, -11643119, 5081483, 8898098, 2638721, -6162741, 4071092, 6273874, 7002944, 18983218, -26031260, 35505420, -3754875, 5631239, 8344585, 4937065, 4456566, 5559299, -7727183, 13857175, --2640331, 18059800, 21776022, 16192564, 5461051, 8754754, 1198833, 30881352, 5191542, -7800198, -448287, 36171140, 29051696, -11610907, -5035313, -13971529, 9128416, 4948876, 17956722, -2225867, --6946573, -2546379, -10703595, 3416647, 950262, 17279728, -5638755, 7039452, -21573084, 13105019, --1291175, 9537512, 301185, 8765491, 1700807, -11491722, -6123550, -9677098, -7852274, 10181220, -22138408, 10670309, -2343979, -5588290, -75699, -612033, 5633924, 8647917, -13828184, 1030255, --4767414, -3324842, -15112379, -10320270, -24575266, 1900523, -1271310, 10364293, -7461432, 17322676, --12124156, -3649112, 31336618, 32937568, -21895206, 6593849, 17752174, -8666707, -5478768, 11260331, --4049081, -11166915, 34404300, -6583648, -54148800, 20017768, -1700270, -25064892, 19788524, 25018184, --9495099, 18440978, 18037788, -6605660, -1843078, 15366319, -16749299, 6757594, -14143864, -7499013, -1608465, 5268851, 10915123, 4754529, -10384157, -2768107, 7881802, -11034845, 9205726, -6036040, --13627931, 10466298, 5161477, 4650913, -3987877, -4344360, -5302674, -1768990, 8960376, -21219822, -9243306, -1605781, 16027207, -11764989, -649614, -14354318, 5055177, -22613002, 1723356, -311922, --9113921, -7724499, 2838974, -15691663, -25418690, 13736916, -1929514, 3183645, -15205795, 7647190, --2852932, 8297877, 9942312, 3742527, -10768020, 7140383, -5331128, -3729105, -19523310, 1286880, --13934485, -16501801, -22087944, -10514617, 3367791, 4510253, -22651120, -12751758, 1246077, -9705552, --30201674, -25706454, -24466282, -6810208, -14353244, 11384885, 19112068, 3300682, -17313550, -23021562, --23261542, -4231617, 587337, 10867878, -14171781, 28211492, 31251792, -5813238, 21561272, -4367982, --6393059, -6500970, 21082384, -15756088, -2371359, -6831683, 32607392, 2451890, 12956843, 5340255, --1269163, 16726750, 10337986, 13901199, 5701032, -761820, -3693135, 13315472, -249108, -10718628, -16647830, 748935, 14837501, -13398150, 12008729, 4712116, -12869870, -10317048, 28928752, 18587008, -333397, 10720238, 10114648, -16130287, -9175124, 6675453, 6437619, 12971875, 3664144, 3585761, -6902550, 15566572, 8297877, 4660577, -12264279, 41225780, 29470992, 3966402, -15708843, 9857487, --3603478, 5832029, -1584843, 9426379, -3300146, 2126546, 24976308, -14679124, -4655745, -19996294, -8651675, -4908074, -718333, 19710678, 8929237, 3234110, 4566087, -6803228, -12749610, 12780212, --8927626, -20243254, 55493124, -60555280, -6344204, -31446140, 40416180, 11589969, 7716983, -14502494, -4413079, -11639361, 36219996, -5287105, -1626182, 4664872, -1126892, -12852153, 5928666, 9154723, -11344619, -22890028, -12024298, -11224897, 5477694, -6103149, -5927055, 419833, 289910, 16966732, --7632694, 2031520, 12367895, -201327, -15378130, 3303904, 12950400, -155156, -24543054, 20025286, -2629057, 1749662, 327491, -9092446, 8572755, -44700408, -31914828, -2994666, -11244761, 3635690, -3808562, -20053202, 34251828, -11863773, 47063716, -4975720, -16200617, 17707076, 2850785, 16009491, -21824340, 8594230, -22183506, -4445828, 25089052, 59854128, 1918240, -13146895, 24126442, 3761855, -28344636, 6179921, 38237556, -8643085, -2405719, -129923, 7118372, 1540283, 79226040, 23972896, -8027831, -3417183, -9417790, -12415140, 25333864, 23032298, -28423020, 15426986, 11653320, 1829119, --9125732, -15710990, -38454452, -15200963, 11272679, 2805151, -12892418, 21601538, -8165807, 8022462, -8331163, -6727530, -6112812, 22475564, -166967, -10356240, 14027363, -14300630, 28326920, -15706159, --9509594, -3064459, 10514080, 4493610, 28601260, -10672994, -18534932, -7945690, 6856379, 267362, -14818711, 2494302, 366146, -8359617, 11654394, 53294640, 22386980, -22721988, 16544214, -13072807, --18096844, 11221676, -2013803, 1386738, -2646237, 7052337, -16352551, -25303262, -60999808, -18822158, -18965502, -11382737, -22731652, 4919885, -7584912, 4402879, -27114128, -25826712, -14067092, 2918430, -3751117, 20696374, -3451006, -13291313, -32837172, -11796128, 18494666, -13482976, 49625124, 41770704, -19971598, -10469520, -16445430, 30064234, 25892748, -32210108, -5921686, -19453518, 29080686, -4064113, --39419208, -16776679, 15080704, 25859462, -45700064, 19369766, -31413928, 12635794, -18249316, -4203699, -23092428, -6828998, 4128537, 14974940, 30499636, -18818400, -32020592, 7991861, -1904818, 4212826, -31186294, 8327405, 23411330, -28267864, -4742181, 9855876, -25213606, 42668888, -4399657, 25764436, --3053722, -5417565, 21114596, 21150030, -11543798, 46786688, -10573136, -19825570, 22582402, 40139152, -2374043, 7434589, 1932198, 17695266, -18883360, 14099841, 60180544, 27671938, -2391760, 26073136, -31795106, -24723980, -75068512, 4616016, 43123620, 48872968, 11725798, -7392176, -24698210, 21677774, -51570748, 14193256, 4184372, 32744294, -68387152, 50054624, 9512279, -32097902, -674310, 27369142, --20165408, -548682, 14891188, -21407728, 715112, -19418084, -12366821, 17521856, -17225504, -10794327, --35137128, 13277355, 32467268, 7762617, -15768972, -27067958, -4813585, 17412872, 9628780, -23447300, --1238024, 24380382, -4076998, -44023, -9488656, -8278013, 60950956, -31428424, -7991861, -8834211, -9922448, 26515518, -30698278, -19130322, 40157408, -6935299, -2815888, -50624244, -40164388, 14456860, -27127550, 12501039, -49555332, 31539018, -806917, -10110890, 7305740, -38057704, -9505836, -7311645, --17121888, 29061360, -24302536, -16772921, -26004416, -18548890, -34328600, 7395934, -53971096, -18925236, -7989176, -31182000, 8714489, 11236708, 9208410, -4934918, -6504191, -25176024, 34280820, -12871480, -3645354, -38524784, 23554138, -552440, 30428232, -6062883, 31442918, 4151623, -3987877, 14282914, -36416492, 17715666, 9299141, 7575786, 4585952, 14651207, -18433462, -1139240, -13881871, -14065481, -22235046, 14340896, 8370892, -6019397, -5869073, -2201708, 23153632, 4068408, -10687489, -16433619, --1128503, -3472481, 17223892, 3242700, 14295262, 28272160, -8203388, -69504920, 4068408, 57638996, -5356361, -41126460, -6059662, 16810502, 11940009, 23128398, 19588272, -892279, -14060112, -12754979, -16914118, -10000831, 1011465, 7106561, -73883640, -11721503, -15156940, 12501039, 55979528, -74088, -3236258, -12273406, 2408940, 12848395, 22393422, 13622026, -15965467, -6348499, -37314676, -994822, -22119082, -9550934, -7529615, 10129143, 21772262, 21088826, -9261560, 5425618, -16581258, -129274224, --230552768, -101205000, -160648416, -182510880, 90360744, 22304838, 81888384, 274791456, 174985552, 138440224, -214620048, 100026568, -6750615, 76334992, 8448738, -105668544, -78368656, -87021408, -181626112, -150184800, --72756208, -135877728, -148222000, -69413112, -96462280, -152519664, -85368920, -2920041, -100809328, -93402656, -4201552, -30700964, -92856120, 75932336, 45098232, -79912696, 53222696, 87503520, 2485712, 44757856, -189183648, 83421152, 48255568, 225193184, 154351456, 84588848, 222359584, 302291616, 183049888, 270444960, -353622912, 250164672, 162716448, 218194000, 110683992, -124140664, -84353160, -160112624, -363330080, -363053600, --367307200, -550160640, -542817856, -543141568, -565110336, -530449920, -514880672, -400015008, -316757600, -230056160, --81302656, 63319628, 121521264, 280087168, 421957440, 299317888, 219650000, 0, 0, 0, -0, 0, 0, }, -{ -12633646, -1332514, 2347737, 4104378, -5537287, -1505923, -3160022, -670552, -1440425, -3429532, -386010, --508417, -3372086, 4203699, -2761664, -1741072, -284542, -1544578, 3635690, -1651415, -2587718, -1075889, 1333587, 3838627, -387621, 816044, -2459406, -484258, 279710, 1143535, 260382, --103079, 3945464, -2310156, 889058, 238908, -2445447, -5657546, -2268280, 1213328, 1976222, -2039036, -5528160, 4306242, -2130304, -2319819, 2320893, 932545, -4861903, 1867774, -4975183, --1459752, 2103997, -3885872, -1548336, 3351685, -1257352, -2206540, -2840584, -5541045, 4292283, -1531156, -1764695, -1698123, -3736622, -4242891, -4867272, -1057636, -3209951, -52076, -222801, --271120, 305480, -307627, -3107409, -7095286, -796716, 6358699, -5968931, 2101850, -9950365, --36507, -3712999, 3800509, -3482682, 766115, -2423972, -4217121, -1240172, -510564, 2777233, -3604551, -3727495, -6260989, 3018825, 994822, 2043331, 1258425, 2331630, -3658775, -2898566, -549219, -908386, 3122978, 2075006, -2804614, -829466, 2371359, 4285304, 2724083, -222265, --3620658, 1648194, -666794, -2168422, 2452963, 801011, -3311957, -3026341, -2255932, 1525787, --3231963, -2033667, 2667175, 714038, -112743, -3687230, 1225676, -3230889, -7430294, 369367, --2520609, -5175973, 2220498, -1764695, -1342714, -2065342, 140123, 3208341, 2248416, 756988, -1722819, 2249489, -5530844, 2364380, -2153389, -2753074, -1161789, 1183800, 421444, 3149822, -14850923, -1255741, 2726767, 3262565, -1512365, 1530082, 5927592, -4626217, -800475, 1675037, --2275259, -471910, 4369056, -1427003, -952409, -328565, 1715839, -861141, 2128693, -1502165, --1404454, -702227, -3326989, -5798206, -1036161, -1890859, -718870, 3343632, -6040872, 7446400, -108448, 76236, 326418, 1357747, -107374, -2943126, 533113, 2246268, 5742908, 214212, -50466, -933082, -1809255, 3686693, 1891396, -1452236, 2187749, -3827890, 759672, 1110786, --2705830, -9828496, -2911451, -334471, -425202, -557809, -698469, -1337346, -535260, -1950989, -2571075, 7075959, 4266513, 211527, 203474, -296353, 2745558, -1573569, -6283537, -333934, --3115462, 2033130, -3528316, 2058363, -9019968, -262530, -487479, -12950937, -12485470, -4618164, --1744831, -1670205, 132070, 3320547, 881005, 2724620, -5803038, 3064459, 3806952, 3703873, -4297652, -3093987, 1013612, 9983115, -5972689, -68719, -4223027, -6138582, -641024, -294205, -5561983, -2488934, 682900, -4537633, 3119220, 2043331, 2470680, -10362145, 1729261, -1754494, --3588445, -818728, 52076, -7631083, -4956393, -4176856, -251256, 6717866, 2362769, 2359548, -3232500, -2716030, 1940252, -2408403, 5672041, 8804683, -715649, -562104, 2526515, 838056, -2301029, 5071283, -2188286, 5249524, -712965, 117038, 3012920, 4326643, -1482301, -5541582, --5339718, 2389613, -721555, -671626, -2382633, 3000035, -4528506, 2028298, 3238942, 6041409, --3512210, 5796059, 3122978, 1990717, -14343043, 6150930, -6445136, 11455752, -10744934, 8373039, -4240744, -4476430, -5603322, -3121904, 2144799, 1950452, -3049427, 6754910, -2487323, -6495601, --1371168, 6994354, 4754529, -7101192, 1083942, -894964, -7477538, -3078955, -4828080, -1114544, --5737003, -1503775, -2422362, -7821136, -2843805, 3997541, 5657546, -1075352, -6764574, -1324461, -4711043, -1421097, 117575, 375273, 60130, -6616934, -244813, -729071, -1740536, -231391, -1132798, -4687420, 2685428, -5011153, -157840, 89121, 60130, 3940633, 32212, -1604170, -1501628, 2818572, 6230387, 3077344, 1377611, -1577327, -3946538, -3391951, -1584306, -3686156, --2942053, 2738579, 4037806, -2579128, -5151277, -2925947, 1496796, 1556389, -4905390, 17923436, -7387344, -730681, 4389457, -2363843, 10223633, 4596152, 18073760, 792421, -16671989, 4846334, -10770704, -5689221, 2220498, 7611756, -5082557, 5515812, -4049081, -472446, -5089000, -4721780, --1263794, 1958505, -182536, 2881923, -1968169, 8096014, -4150012, 2672544, 1770600, 5468030, --8658117, -4155381, -3192771, -506269, -2833068, 1423782, 5871757, 4517232, 9109626, -685047, --295279, -4378719, -1287417, 6146098, -5040681, 5199595, -4694936, -1465658, 8379481, 12272869, -8659728, 2150705, -5777268, 5006322, 3533148, -2521146, 7097434, -3690451, 1676648, 1865090, --11993159, 726923, -11346767, -3829500, 2221035, -2161979, -5218922, -3769908, 1352378, 9120900, -2398739, -2084133, -3663070, -2237141, 1246614, 2705293, 11054172, 22185116, -9373229, -6897181, --1736777, -2362769, 7844221, -7090991, -13152264, -4390531, 1103807, -3028489, 3993783, 2052994, -6802692, 3034395, -2506650, 9812927, 9105868, -3865471, 792958, -5893769, -911070, 617938, --3665755, -450435, 6810745, 9888625, 504659, 1882806, 4061429, 2836826, 1653026, 978179, --3526168, -6560563, 893890, -9571871, 453119, 2631204, -3068754, 4259534, -2425583, -5104032, --345745, 5726802, 2439542, -1987496, 16267189, 372052, 5295158, -9203578, -2080375, 7067369, --3032247, -6663105, 4263829, -7866770, -7436199, 2232309, 9251360, -6963753, -4159139, -1631551, -455803, -2770254, -3306588, 13084081, 7351374, -355945, 823560, -4959077, -3990025, -1323924, -4037269, 8571144, -15732465, -2232846, -11847130, -6809134, -10741713, -2838974, -1754494, -1733556, --4203163, 4604742, -15078020, 7552163, -5218922, 4433480, 1884954, 6101001, 238371, 2447595, --6139656, -2700998, 2687576, -6149320, -4463545, 7208029, 1926830, 3184718, 2856153, -897648, -1882806, 10798085, -4014721, 907849, -5021891, 8654359, -5399311, -19696720, 5972689, 2930778, -8151848, 4303557, 11267310, -7804493, -3104188, 6701223, -2909840, -6693170, -3154654, 3419331, --9555765, 9247601, -379568, 6118181, -8066486, -3658775, -2951716, -8831527, -1803886, -7045894, --3178813, 608275, 9992778, 7941932, -925565, -12394739, -7010997, -2364380, 9719511, 7958038, -5852967, 5358509, -3463354, -14231374, -3690451, -317828, 3140695, -21105470, -25367150, -14604499, -9495636, 188979, -5266167, -5862094, -8555575, -1453846, 2018635, -14405320, -1983738, 8105140, --5993090, -4388920, 9059160, 1964411, -7093676, 1862942, -6891275, 13852880, -5349382, -4013110, -3980898, -8083666, -5402532, -4972499, 1743757, -5777268, -2658585, 1861332, 1033477, -17503602, -6863895, 6844568, -5606543, 12591770, 4316442, 724776, 11853573, 6666863, 1504849, 1253057, -12859132, -1857573, -3082713, -1408212, 7592966, 4199941, -13116293, 4313758, 3070902, -545461, --7377680, -20343112, 7960722, -1731409, -5742372, -12883291, -7906498, 7293392, -2513093, -3980898, --9227737, -16495896, 687732, -2497524, -9590125, -3804267, -16362215, -2532420, -4576825, -2824478, --1898912, 5829345, 10361609, -21072720, 17119740, 1070521, 8778913, -1424855, -649077, 1747515, -9450539, 1092532, -1136019, -12612708, 4573604, -1210107, -9874667, 2794413, -6462852, -4736812, -18324478, 5459441, 5616744, -3695819, 6525129, 8211978, 7608535, -4150012, 6622303, 3793530, --7807177, 5370320, -7609072, -2234994, 4685810, 2654290, -903017, -3764539, -4056597, 12624519, --3704409, -4907000, -3599720, 2967823, 2465311, -5327370, -10041634, -187905, -10777147, -688269, --9756018, -3003793, -2515240, 2494302, -5126044, -7584912, 10115722, -3609383, -11782706, 8067023, -11897059, -5148055, -4286378, 7015829, 4104378, 13002477, 7424925, 2152852, -571231, -11489574, -2519535, 12990129, 9074729, -7388955, 8569533, 11078331, -7309498, -17315698, -6791417, -15087146, -4434017, -33394444, 16539919, 4936528, -1217086, 23119272, -970663, 11873437, -9798431, -2037962, -2178622, 486405, 13400835, 8614094, -17284560, 11369315, 1226213, 6954626, -15523086, -300111, -9599789, -15311022, 19957102, 5607617, 198105, -6682432, 1580011, 8764955, -13605383, 1580548, -4000762, 2758443, -8221641, -2932389, 8607651, 4887136, -447213, 1464047, -5248450, -9491878, -4466229, -16222091, -234076, 23759222, 23449984, -7175817, 3310883, -847719, 7049652, 16689706, -1868311, 8027294, 3112241, -8617315, -160524, -1621350, -24474872, -11287711, 15977815, 653909, -5299453, -6158446, -981400, 5293547, 8060580, -986232, 19849192, -156766, 15660525, 1262720, -3885335, 1115081, -8983998, -13539884, 16300475, 1772748, -6173479, 11644193, -24252606, 10215043, -15849503, -1821066, 4967130, 7290170, -3398393, -2073932, 9932649, -3303367, 14887430, -13523778, -7928510, 18223546, -18844170, 1050120, -8756901, 11594801, 5174899, 9650792, -9334038, -7360500, -287763, 24475408, 681826, 12483859, -5036923, 945430, -1261110, -1965484, -10353019, -241592, --2608119, 5098663, -4392141, -6839199, -5450314, -318901, -1628330, 11062225, 2299418, -5969468, --5077725, -5509370, -1626182, -2611877, 18295486, 799401, 9392557, 609349, -3885872, -3947075, -15278809, 11032160, -3878892, -14108968, 8312909, 5309117, -30491584, 1619203, 17821966, 16777216, -4356708, 13246216, -18239652, 30209190, 3086471, 5455146, 6477885, 14110041, -638340, -13577465, --3306588, -15958488, 18637474, -7713225, 9160092, -18491444, -14874009, 12814572, 10667625, 26596048, --9783399, -7273527, -5118528, 4890894, -11738682, -1509681, 4068408, -915365, 14003741, 9188546, --11957189, 977642, 2934537, 8284455, -13596256, 13784698, -711354, 6128919, -2827699, -6248641, --14295799, 4942971, -2924336, -5703180, 2216203, -8311836, -8798241, -1662689, 3726421, 16940962, --25503516, -14794015, -14060649, -14772003, -4935991, 17696876, -10933376, -63351, 16367047, -2037425, --8424578, -14267881, -4745402, -5776194, -31384400, -23081154, -7507066, 6129455, -3753802, 6209986, --7658464, -3934727, 13646722, 9867687, -16229071, -6673306, -18089866, -5411659, 405874, 8450348, --4112431, 3668439, -15707769, -9570261, -11819213, 2185602, 1299228, 3857418, -15034533, 3892314, -17846662, 9912785, -13196824, 2417530, -1511829, 30107184, 3231963, 14433238, -12656195, -8690866, --3148748, -14375256, -9083319, -13905493, -6436009, -9085466, 16353088, 3923990, 4099010, 16679505, --487479, -1199370, 7594576, 14944876, 23727546, 17098802, -3613141, -6754910, -27416386, 7212861, -8526047, 2981244, -17128330, 19342922, 7799124, 11170673, -3318936, 638340, 11116986, 24150602, -23890218, 13302051, 2771865, 25042344, 510027, -8284992, 8139500, 14851997, 12415677, 22302692, -11934640, -296890, 2491618, -14795089, 5702106, -35730908, -6344204, -4545686, 7262790, 26175142, -14856829, 2764348, 19250044, -15817291, -13783624, 1262184, -34578780, -9792525, 410169, 4528506, -6648610, 6708739, -3432753, 12237972, 147640, 4574677, 25263534, -20795694, -11012833, -10520522, --22996866, -7028177, 4505958, 17940616, 32600412, -12652974, 803696, 5717675, -5718749, 30372934, -5509906, -14358076, 26444114, -4984310, -8660265, 19257022, -16928076, -9503152, 1262720, 2145873, -2436857, 12836584, 6662568, 10538776, -3005940, 5869073, 15093052, 1511292, 10280004, 2500745, -384936, 17283486, -21766894, -7230578, -7425999, 15181099, -11157788, -2155537, -6629282, 15100568, --6213744, 32701344, 23190140, -20926692, 10479720, -25274808, 3550327, 10331007, 4858682, 6578280, --33553358, -5488432, -32397476, 5279589, 2339684, 4985920, -5412196, -4696547, 14992120, -26547730, -9137543, -10750840, -52679384, -18223010, -17565880, 10035191, -8109435, 9502078, 25618406, 29578366, -15230491, 16564615, 13021804, 6135898, -21429740, 24367496, -1233729, 9028558, -40540196, -18375480, --13487271, 8523899, -30695058, 12186433, -17972828, 27758910, -30496416, -39002600, -7687455, -4889821, -32220308, 16120086, 14898168, -7169911, 4635344, -18470506, -14524506, 4467303, 7585449, -24052890, --22116934, -15388331, -995359, 13421773, 10143102, -16625818, -20939576, -11926050, -11871826, -29040958, --16086800, 14123463, -7108708, 697395, -2858838, 10614475, 16733729, -3153580, -43466144, 19830938, -38885560, 14905684, 635655, -44033616, -9208947, 20568062, -4006131, 51221244, -3699041, -39555576, -8443369, -5857799, 5208722, 2093260, -6141803, 11858942, 15563351, -41778220, -9174587, 3304441, -17563196, -7021198, -19145890, 20267414, 4846334, -13748190, -39363376, -48870284, -21741124, -3010772, -7992398, 38835096, 61212948, 24683714, 2781528, 74553120, 68386616, -29767882, 35132832, 31135292, --9640054, -5965173, -17219060, -9494562, -20130512, -14183593, 56532508, -3660923, 32597192, -122943, -823560, -67646, -23433878, 4898410, 3843996, -50178640, 6542846, 11576011, -27033598, -5909338, --8966818, -3990025, 6427956, -1887638, 564251, 21507048, 7898982, -11016054, 5741835, 34557308, --457414, 15767362, -1927904, 12836584, -20342038, -23489714, -14147085, -42878804, 10229538, 4589710, --20189030, -51981452, -35143032, -48564268, 33962992, -25218974, 4107063, 8738111, 6545530, 6790880, -36112084, -36119064, -1444183, -20111722, 38103340, -89159224, 16441672, 7312182, 26527866, 26561688, --2176475, -7590818, -16292422, -3129421, -29004988, 20080582, 49082888, -2922725, 6314139, 33849712, --23132156, -21792128, 33530810, -59344636, 45911052, -22762790, -14958297, -8376260, 6920266, -15120432, --11007464, 22434224, -2942590, -39681740, 17771500, 301721, 10642392, -6673843, 40999220, -27970438, -4480725, 18653042, -7525857, 14853608, -21974126, 5041218, -18415746, -8004746, 26917634, 6036040, -12825846, -10371272, 26230440, -3504693, -7166690, 11846594, -10430328, -8489003, -3861713, -4503810, --19877646, -28310814, -5031554, 20796232, 4108673, -6525129, -27572616, 4634807, -20873004, 1842541, -14154065, -21038898, -1816234, 21827024, 22787486, 17178796, -26045218, -10524817, 25760676, 10965588, -4283693, 21364778, -95249488, -18698676, -5862631, -40796284, 10095321, 17645874, 3272765, 13963476, -27880780, -6278706, -14401025, 12369506, -11563663, 2427194, 31143344, 168577, 66728224, -9290014, --19255950, 1758789, -8058433, 32530082, 5779416, -3735011, 31248034, 31205622, 10157598, 11435350, -17285632, -40706628, -22231288, 31771484, -4749697, -33714420, -16672526, -15996069, 22282828, 10732050, --12031814, -48342540, 14589467, 5968394, 6275484, 6245956, -5563594, 3232500, -35074312, 29912836, -22137872, 9945534, -17331804, -16759499, 346819, 13937706, -2946885, 14477798, 7754564, -39205000, --15829639, 3744675, -36603860, -24696, 8104067, -35297116, -45301704, -9004936, 15250892, -29633126, --54905788, -27513024, -13119514, 33524368, -20350628, 37986300, -6368363, -1614371, 20097762, -1473711, --60268592, -8507256, 5985037, 24670292, -52204792, -83146272, 10457172, -11485279, -43425876, 20185810, -21221970, -11664057, 11894912, 32464584, -30597884, 6584185, 34684008, 15504295, 77468328, -27990838, --29451128, -10270341, 1821066, 73888472, -6681359, 61789548, -37895572, -12758737, 27836220, -41231688, --11623255, -38555920, 10027675, 46145128, -55581172, -17987860, -1921461, 21362630, 2626909, 10145786, -19384798, -468688, -34080028, -30631706, 4872104, 28075664, 68379640, -10613401, 20859046, -14820858, -35385700, 5119064, 6975564, -4905390, -35265976, 5485210, 38765300, -1782948, 1218697, -8817031, --30246234, 48791364, 20228760, 34207268, 42968464, 2905009, 5836324, 29557964, -59546500, 27027156, --28185722, 80160192, -3242164, 13011067, 15181636, -15882789, -17875118, 13747117, -27421218, 54026932, --23063438, -27918898, -30291330, 57149908, 22454626, 36957120, 103616, 37818796, 37060200, -19238770, -2490544, -13561896, 10941966, 6487548, -55586004, 37833832, -39520140, 4619774, -18200460, 14448270, --1508607, 20642686, -3302293, -18340584, 31208306, -11235098, -4226785, 4444755, -12901008, -11726871, -36119064, -8885750, -4701916, -4650376, -1576790, 16004659, -12264279, 3369939, -8856223, 7680476, --7651484, -6703370, -18852758, 27562952, -16951700, 8690866, 5015448, 18833432, -21401822, 4180077, --8395050, 21382494, 3525631, 956167, 18186502, 4379256, -28346784, -5177583, -4233227, 7150584, -13511430, 9672803, -25572236, 10311143, -19067508, 13073344, -10444287, 1926830, -5551245, 12822625, --4431333, 2898566, -28480466, 5818607, 15457050, -14722074, 14571750, 651224, 6104759, 7206419, --10741713, 19319836, 9198746, -2109366, -5400385, 9268003, -5496485, 18591302, -15675557, -2433099, --14768245, -23328114, 46493020, 3688840, 5657546, -18888192, -13980119, -29866128, 19661824, -8528731, --6283001, -13095892, -737124, -11696270, -1664837, -1722282, 4975720, 5626407, -1155883, -1581622, --8676908, 7657927, 7098507, -7192460, 3045132, -16073915, 6073084, 2889976, -3037616, -2661269, --5559299, 4862440, 849867, -11497091, -3303367, -3505767, -9652402, 15203110, 1342714, -10017474, -1229434, -4037806, 13132936, -4834523, -6551436, 2421288, -8284992, 15475841, 163746, -8829379, -2187212, -3699578, 7359964, -10041097, -2258616, 3090229, -3894999, 6714645, -4230006, 1833414, -2797634, -9058623, 913217, 8704288, -13877039, -1025423, 3739306, -12679280, 22483616, -21028160, -10012106, 3730179, -12458090, 23684598, -16716013, 4035122, 2153389, 10735808, -50200652, -115650584, -30124364, 106738528, 90195384, 121121296, -59973848, -77625088, -116703928, -119228296, 7996156, 88647592, -97827544, 107252312, 35510788, -23493472, -85400592, -141167520, -77484432, 35767952, 55377696, 93963680, -71091912, 19382114, -12856448, -29807610, -70875016, -45867028, -43787728, -8065949, 37002752, 57000660, -29815662, 38035692, 19042274, -21526912, -3582003, -45959372, -64139432, -10979010, -15140297, 11234024, -60054916, 34714072, 29691646, 8822400, -22819698, -23263154, -20272246, -33094870, -8902393, 1478006, -13968844, 17339320, 28616830, 8258685, -1225139, -14507326, -27043798, -2225867, 9494025, 10016401, -16771310, -4188667, -13572634, -6306086, -13514115, -10366440, 2985002, 7934952, 21983790, 18887118, -18289044, 1978906, -7678328, -32321240, -22062174, -2129767, -1344325, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ -10871099, -4711579, 5091684, 39192, -2043331, -4964446, -1811403, -3577171, -3725884, 773094, -3032784, --1884954, -511101, 3035468, -222801, 1024887, -3275450, -1678795, -3889093, -6316823, 3422015, -2469606, -2666638, 1373853, -1632625, -334471, 3979824, -2336462, -464393, -3007014, -1876364, -1577327, 2162516, 3046206, 2671470, -4293894, 592169, 2261300, 68183, 3236258, 416075, -1008244, -3397856, -1817308, 586263, -960999, 813896, 270046, -2039573, 3583613, 2485176, --4343286, -184684, -236760, 1103807, 3747896, 1523103, -4109747, 595927, 1422171, -3065533, -1148904, 1420560, -567473, 1628330, -434329, -827855, -345208, -2459406, -520765, -998580, --1880122, -345208, 35433, -302258, -652298, -1038845, -5580237, -4926865, 6039798, -1286343, -4816269, 1370632, 7182259, -1729261, -3767760, -2620467, 4377646, 73014, -1635309, -478889, -4958003, -1380295, 878321, 1695438, -3375308, -2605972, -1115081, 862215, -3498251, 824634, -687195, -4090420, -1327682, -2473901, 324807, -1826972, 631360, 6503118, 3358128, -1991791, -304406, -3193308, 2389613, -914828, 3881577, -8136279, -883690, 1165547, -2863133, 431644, -3914863, 2893734, -3614215, -2774549, -2897492, -637803, -2287070, -1273995, -3510599, 1245004, --277562, -4207458, -2079301, -1773822, -157303, 714575, -835908, -566399, 1830193, 542240, --1852205, 840203, 4454418, -2434710, -472983, -4917738, -1672890, -638340, 2055679, -2327336, -630286, 328028, 299574, 7813620, -2538326, 2734821, 6574521, -4822712, -5488968, -556735, --1168231, 224412, 3477313, 2085207, -7744363, 1553168, -4332012, -6018860, -145492, 2627983, -2768643, -1750736, -9664, -359704, 3698504, -392990, 3085397, -998043, 582505, 950798, -1113470, -3670050, 1934883, 3437048, -1203665, 4293357, -1939178, -79994, -4687957, 3864397, -1130113, -940061, -3582003, -3421478, -1478006, -917512, 2158221, -32749, 1895691, 2030446, --3152506, 2517925, -4318590, 2044941, 2895882, 5457830, 5087926, -3741454, 2311229, 181999, --864362, 3411278, -2008434, -2203318, -1778653, 2902324, 1437740, 3652333, -2873333, 5260798, --1289027, 332860, 1659468, 1383516, 3000035, -1460826, 4159676, 5626407, 8862665, 4472135, --9212705, -9908490, 1138703, -788127, 2361158, 2236604, 6550362, 3005403, 3118146, 1633161, --3228205, 1289564, 8255464, -5476620, -656593, 321586, 6606197, 4072166, 875100, 3027415, --586263, 2363306, 2995740, 6905771, 3697967, 3924526, 1968706, 1744831, 3223373, 1315871, --4859219, 3034931, 3802657, -1270237, 2720325, 3898757, -1458678, 1326071, 4544613, 1887101, --1306744, 1847373, 4610648, -79457, -258235, -770947, 1093069, 4682051, -1573032, -2340757, -1033477, -1351841, 2086817, 3041374, -3664681, 951335, -2509872, 421444, 990527, 4049617, -2695629, -7677254, -479426, 4209605, -2541010, -2979634, -127775, 986232, 3271155, 96637, --9240622, -3223910, 1880122, -1773285, 2956548, -339839, -17015050, 2141041, 1515050, 7624641, --525597, 5909875, 2913599, 1352378, -10073846, -190589, -382789, -7840463, 987306, 5509370, -845035, -309238, -965294, -3244848, -3743064, 1362578, 1999844, -466004, 1245004, 1561221, -6596533, 592706, 2769180, 3009698, -3874597, 584116, -1130113, -1186485, -748398, 2333241, --687195, -1914482, -3053185, -1842541, 569083, -5082557, -3790309, 1858110, -4214974, 1067299, --6722161, -7851200, -2298881, 9241696, -2859911, -775242, 5207648, 1644973, 26307, 5735392, --1245541, 423054, -1173063, 1493038, 3402151, -1774358, -6422587, 3520263, -3956739, -6942815, --3143379, -2204392, -543850, 2040646, 6597607, -405874, -698469, -3346853, -963146, 3560528, --2812667, -3106872, 3905199, 15028627, 556198, -838592, -5610301, -3192771, 7958038, -3122441, -6225555, 5380521, -5962489, -902480, 4682051, -3289945, -1568200, -1491427, -2124935, 1079647, -1717450, 374736, 2945274, -1218697, 512175, 1187559, -1150514, -2728915, -2892661, -3229279, -326954, 4006131, 1757715, -3177202, 371515, 1659468, 7496866, -2071785, 6720013, -5921686, -2813741, 4938676, -3090229, -1781338, -6101538, 3075197, 20401, -4170950, 4384625, -5202816, -6123550, -144418, 8634495, 2158221, 1037235, 2272575, 3670050, 2117419, -2633352, 4446902, --645856, -4242354, -6880001, -1642825, 3154654, -3229816, -2093797, 3067681, -3711926, 8070781, --7162395, 363998, 5269388, -3779034, -1304596, -7242389, -96100, -2365990, -1017907, -1217623, -7192460, 12750684, -3760244, -5596880, 1443646, -2306934, 3506304, 11596412, 56371, -2718714, -3678640, 1957968, 3433290, 2041183, -6341519, 185757, -5658620, 3094524, 2727841, 1605244, -10633265, -573915, 7928510, -278636, -195958, 2338073, -65498, 8264054, 1106491, 5166309, --1937567, 7023346, -3204583, 3692061, 14111115, -2420214, -3552475, 9820980, 2102923, 6345278, --146566, -6327561, 1941325, -3723737, 4278861, -7619272, -977642, -4056060, 4224101, -832687, -892279, 7464653, -3703336, -7961259, 2199560, -926102, -321049, 5964099, 1260573, 578210, --2753611, -5423470, -5305895, -2179696, -4346507, -3780108, 4732517, -2787971, -271120, -2210835, -767189, -574452, 4429722, 1884954, -4211753, -7595650, 17916992, -8825621, 6529424, 624918, -3405909, -3848291, -2950106, -1538135, 4180614, 5307506, 1407676, -2292439, -4737349, 3069828, -5208722, -540092, 1880122, -2181844, 5641977, 2377265, -9580998, -2839510, 3550327, -150861, --3872450, 235149, 4869419, -2876554, 1882806, -6012418, 4117800, 8623757, -3034395, 9102646, -641024, -1105954, 6104223, 227633, 792421, 5691369, -10896332, 2182380, 3760244, 5287105, -3586835, 4250407, -4690641, -3389266, 182536, 2328409, -5101885, 2354716, 5681168, 5331665, -2142652, 15139760, -4202626, -1230508, -6197638, -2210298, -3914326, -5424007, 7927436, 3793530, -7772280, -452045, -11258720, 7559143, -3636227, 4531728, 3915400, 2483028, 2646774, -8315594, -11716671, 3533148, -21971442, -18640694, -17271138, 2702071, 2390149, 432718, -235149, -2093260, --2244657, -486942, -3764002, -6839736, -5103495, -11278584, -5573794, -5941551, 5191005, -8873402, --4537633, -5412733, 317828, -809601, -3095061, 1427003, -1728724, -9164923, -1214402, 6698002, --76236, -8267275, -7589207, 1963337, -3716221, 5484137, 3388192, -7855495, 5778342, 9979357, --10223096, -10211822, -6119255, 2542621, 7489349, -7037304, -7524246, 2380486, -4853850, -217970, --2018098, -1686848, -11127723, 992674, 4753455, -3986267, 2164127, -5842766, -7156490, -6743099, --4210142, -10961293, 15788837, -4599910, -2570538, 2010045, 402116, 2637647, 809601, 4295504, -837519, 3536906, 8907225, -14886894, 7727183, -4540854, -4721243, -1845762, -20683488, 15814606, -4207994, 3403225, -3798362, 15437723, -2392297, 7215008, 47245, 6461242, -9142375, 3519189, -3730179, 1255741, -4413079, 13627394, -3594351, 4007205, 3345780, 14104136, -9478456, -877247, -4196720, -2763812, -6862284, 3984119, -6419903, 1402844, 2101850, -8185671, 3330210, 264677, -714038, 15353971, 10197326, -1755568, -6081674, -5507222, 3909494, -1338419, -9033390, 2148021, --386547, 2212445, 7589744, 9873056, -6696391, 6476811, 4102768, -5421860, 3973382, 1997160, --6843494, -4826470, -4028143, 6648610, -7432441, -7813620, -17869748, -14622216, 4555350, -3639448, --1839320, -8341900, -13526999, 4239670, 2092186, -1867237, 8144869, 4392141, 9697499, 3161633, -3411278, -2524367, 2935073, 6583648, -5362804, 5995775, -24565066, 23534810, 17033304, -6360310, --5288716, 6652905, 489626, 975494, 11470247, 8213588, 762357, -1222992, 4888747, -2165201, --1146756, 3510062, -4490925, 6605660, 4716411, -4770635, 7160784, -330712, 2275796, -99858, --10537165, -229244, 8498130, 8691403, 3749507, 3939022, 4949950, -4753992, -5988258, 3176665, -5503464, 162672, -1987496, -5291400, 2879239, -1296006, 7616588, 8694624, -382789, 9964324, --4438312, 11059004, 6374805, 13251585, 1519345, 2224793, -3111704, -4939750, -377420, 10230612, -16818018, 1297617, 12996034, -5009006, -11130945, 1876901, 5195837, -10059887, 11547020, -3301756, -4631586, -22538914, -8908836, 63351, -4499515, 4589173, 8626442, 15968152, 4568235, 281857, --6193880, -12885439, 7154342, -8702141, 17670032, -6138582, 2993592, 13488882, 13883482, 79994, --6433861, -2934000, -2957622, 2007360, -8612483, -6539625, 8990440, 3088618, 6121402, 7371775, -8391292, -2228551, 5777805, -715112, 6727530, 25169582, 6617471, -10457708, 12211129, 14079977, -1515587, -967441, 1636383, -5213554, -7863012, -3413962, 14142790, 10076530, 8261907, 12456479, -3237869, -667867, -4185983, -12955769, 7577933, 8828305, 5156108, -913754, -768799, -3538516, -2988760, 13006772, 9012452, -11836930, 9816148, -9707700, 12870406, 4066260, 5506148, 6883759, --861678, -4660040, -775778, 6507949, 21629456, -1401233, 11457899, -2561948, -7920457, 12990129, -11178726, 4840965, 3768297, 12528420, 5150203, 3801046, 861141, 8639327, -4141422, 8762270, -11209865, -12562779, 8712878, 5021891, -2862059, 859530, 6084358, -5246840, -10955925, 16843252, -3881577, 3237869, 3406446, 9978820, 3189550, -10053982, 11025181, -14429480, -16502875, 1445257, -2357400, -9356586, -2692408, -27596238, -19108310, -14775224, -4567698, -15217606, -7023882, 5577015, --13139916, 9351754, 9203041, -11241003, 14733885, 7397545, -2304787, -1673964, -6875706, 56371, --12655658, 28643136, 9012989, 4188130, -13867376, 3165928, -3860639, 18802294, -3236795, -922344, --16864190, 16675211, 1820529, 6204617, 6262599, 9438191, 6393059, -4494147, 6487011, -9212705, -9448928, -3886946, 5921686, -14507326, 31786516, 3761318, -13469017, 6684580, 9941239, 5772973, -11461120, 7420630, -12974559, -21304648, 7340636, -2004676, -1105954, 14334453, -1367410, -1210107, -2368675, 12939126, -2010582, 7982734, -4714801, -5796595, -7650948, -10044318, 20368346, 11089606, -8100845, -5007932, -16525960, -20607790, 11551315, 8225936, -6547141, 6203007, -4075924, 1559073, -20328080, 9418863, -4267050, 11385958, -2311229, 6411850, -5193689, 7537131, -12952011, -19763828, --6865505, -8233453, -339302, 25409026, -18569828, 12520367, 7864085, 6036577, -3083787, 10649908, -5602785, -17969606, -22865870, -7546258, -9667435, 28493350, 21284248, -5558225, -10783052, 69793, --11063299, -1554241, 21488796, 19590420, 12070469, -15187004, 5167383, -11603391, 21726092, 10657424, --311385, 1257889, 8647380, -10571525, 4704063, 19031000, 11821361, -14217952, 19884088, -4958540, -11633456, -17007534, -6172405, 30506616, 14593762, 17872970, 5023501, -24029806, 8506720, -19385334, -14086419, 37856916, 14143864, 23976654, -9561134, 7356742, 11818139, -521839, 3804804, -8964670, -3470871, 15188078, 1844152, -3359738, -12100533, 7793218, 6598681, -12953621, 8201777, -4625143, -11520713, 15171972, 16895864, 19284404, 3201361, -14173392, 5310190, 9314710, 1245004, 26041998, -3721052, -29093034, -16972638, 8753680, -5914707, -34435436, 2916820, 15163919, 7201050, 1877438, --1354525, 18633178, -12495670, -17552458, -1445793, -6102612, -15260556, -682900, 3514894, -9841918, --12569759, -8881455, 3302293, 2458332, -18842558, 6771016, -5991480, 5616207, 28281822, -2966212, --4933844, 17973902, 1278290, 15353971, -8559870, 10927471, 7288560, -11236171, -3642669, 24768540, -2874407, -34876744, -15984258, 20980916, -31217432, 17109540, -29557964, 1957968, -5034239, -42616276, --5928666, 18577344, 38478612, 11950747, -5996311, 9008694, -15243376, -5417028, -34221764, -2306934, --23344220, -3735548, -5361730, -16326244, -17191144, -6023692, 9393630, -15702937, 10237591, 18984830, --20279762, 6839199, 6177237, 3027952, -21545166, -3648038, -480499, -22680648, 5561446, 28002650, --2397666, -41591928, 14363444, -25261924, -63774896, 17563732, -26500486, -33029372, 1529008, -15300284, -4328254, 10914586, -6469832, 16428787, -14197014, 14327474, -11757473, -28715078, -62814, 20092930, -19257560, -37199784, 5146982, -4650376, -27860380, -7582228, -7255811, 47645684, 23318452, 27828704, -11977590, 11887933, 28394566, 42065448, -11802033, -21050708, -8188355, 54160076, 58725624, -36939404, --15489263, 25288230, -13654775, 9220758, -18207440, 3370476, -18639622, -33964600, 42631308, 4722854, -12479027, 9602473, 2812667, 4045322, 46708, 7161321, 9691594, -33024004, -26968636, -24365350, --22478786, -17777944, -11192148, -10173167, -17845052, -11345156, -15247671, 14273250, 11271605, 4316442, --8782671, 1370632, -33972116, -18540836, 8138426, -31994286, -3577708, 12661564, 25201258, 1820529, -4351876, -13096966, -20010252, -24902220, 17855252, -4519380, 17753784, -66216584, 3648575, -9520869, -7126962, 37166500, 4668630, 4469451, 4400194, -13577465, -13103408, -1721745, -2332704, -38096896, -8197482, -15254113, 33012192, 173409, -34430604, -50066972, -28617368, -7737921, -32061930, -34342020, --18248242, 23234700, -4818417, -8994198, -14936286, 64441688, -34896608, 25589952, 45885820, -19471772, -7682086, 37452652, -43634184, 3819300, 6318434, 23990076, -49221400, 4999879, 4556424, 18869938, --20913806, 2655364, 10074383, -27197344, 5392869, 315680, -4628901, 19007914, -4052302, -1695438, -7697655, -994285, -4315906, 19039054, -14302241, 7561827, -5563057, 7374459, -9049496, -1891396, --11220065, 3747896, 2690260, 35101156, 10772315, 19164680, -2889976, 4479651, 23450522, 3353296, --8651138, 17603460, 9673877, -5646809, -30429306, 32995012, -30404610, 10398116, 14395120, 24912958, --30085710, 38092064, 50903416, -21319144, -52492552, 76946488, 24116242, -26492432, 15290620, -24385750, --41890428, -10728291, -8433705, -31832686, 33646772, -46858632, 16428250, 44674104, -26287884, -56195352, -59880972, -14544370, 35530652, -22362284, -17701708, -36091684, -16199543, 22408454, 17646410, -9218074, --11480984, 12174622, 29671244, -11892764, 22584548, 26640072, -17757542, -2167885, 16756815, -3659312, -717260, -4824859, 2206540, -26256746, 8139500, -5510443, 1745367, 6815576, -4510790, 5870147, --10201621, -22012244, -9687299, -38602628, 5775658, 208843, -4882841, 7489349, 4650376, -2291902, --7912404, 15865609, 25697326, -25783762, 38978976, -4113505, 6083821, 5648956, 34607236, 15527917, -25618944, -30738008, -6578280, -5710696, 44857176, -40793600, -12846247, 20003810, -343597, -47143172, -4347044, -9707163, -6890202, 21570936, 24806658, 1729261, -16473347, 38257420, -14766634, 63839856, -2206003, -28962576, 1466195, -4123169, -31549756, 65850440, 15600932, -4965519, -54742044, 15275588, -20387672, 12794171, 49112416, -8256538, 12026982, -3643206, -23578296, 13329431, -14561013, -8011725, -11157788, 22375706, -21407728, 25617870, 4185983, -472983, 51948704, -9531069, -4204773, 38611756, --22779970, 34154116, 15951509, -7308961, 14902463, 14694157, 32838246, 33030982, 11083163, -25872346, -56894896, -54916524, 3621194, 50799800, -25307558, 11520713, -4101157, -6220724, -56426208, 39895952, -12514461, 17792976, 20704964, -11996381, -26854284, -21786758, -15400142, 2755222, 57892936, 285078, -46060840, -14652281, -30783642, 1567126, 15384036, -27885076, 47719236, 17658222, 25248502, 43453796, -32146756, -47973176, 21944062, -68647000, -79207248, 561030, 75374528, 42701100, 11471858, -51566452, --170944528, -34881040, 63880124, 60076392, 101814888, -9392557, 7224672, -43581032, 36612984, -27366994, --4781909, -17678086, 16962974, -19844360, -932545, -1971927, -5518496, 4242891, 18626200, -19638202, -8564702, 1754494, -4763656, 500901, 13027173, -16497506, -4804995, -2178085, 27224188, -27516244, -7106561, -11861626, 17907866, -19951734, -6098854, 7351911, -4280472, 4272956, -13511967, -1876364, -11482595, -3129421, 4163971, 4282620, 2032056, 15410880, -14253386, 9910100, 10204842, 13890998, --2408403, -30120606, 3365107, 4366371, 11924977, 12207371, -2894271, 3874597, -5879810, -13139916, --3120831, 7331509, -3424700, 19677392, -16063715, -3988951, -31278636, 10203769, 2307471, -3559991, -5721434, 7278359, -1619740, -14181445, 3546032, 17060146, -4576825, -151934, 3992172, -3416647, -8390219, -2328946, -24713778, 60436632, 16589848, 15042586, -7813083, -19157164, -18405008, 5411659, -11872363, 1984275, -517007, 69793, -8631811, -1471026, 4413079, -2206003, 2006287, -817118, --8635032, -336618, 4562866, 7006166, -5944235, 1808181, 4613332, -8678518, 14638322, -8650064, --7434052, -7486128, 2189360, 4327180, 6918119, -7203197, 9569724, -13357348, 9153112, 8055748, --5687074, -513785, -182536, -1451162, 7204808, -7391102, 2443300, -2299955, -9416716, 13813689, --7391102, -170188, -5395553, -1688996, 9861245, -12402792, 5388574, 3546569, -5138392, 4670777, --10326175, 3172370, 4776541, -7837242, 550830, 4329327, -6942815, 7423314, -9706626, 2872260, -10782515, -15102179, 4816269, -5751498, 1529008, 5965710, -4029216, -2348810, 8896488, -46728708, --109448648, 30798674, 106858784, 73448776, 116210544, -64918432, -69098504, -94162864, -108986408, 2201171, -83832392, 86625736, 90436440, 17648558, -30079266, -59530396, -85397912, -72388992, 5481989, 55999932, -66432944, 59776816, 14186277, -16683264, -10487236, -46905876, -52469468, -22199612, -1574106, 20000588, -43970800, 21426518, 15854872, 21975738, -11183558, -26363046, -4444755, -42072424, -19828254, 343597, -6512244, 31857384, 37083820, 3189550, -5785858, -3609383, -27617176, -7552700, -525597, -5822365, -9373766, 18295486, -4056597, -1555852, -7349226, -11577084, 2234994, 1053878, -1366337, 20688320, -13952738, 5138929, -611496, -19605988, -28362354, -22376780, 1596654, 21132850, 18128520, 23909546, -3385508, 1022202, 5804112, -28398860, -15374372, -7304666, 374736, 1276679, 0, 0, -0, 0, 0, }, -{ -10924786, -6826851, 2576981, -311922, 5572183, 409096, 82141, -1086090, 2179159, 4372277, 619012, --2878702, 3926674, 2895882, -1643899, 409096, 923955, -2917357, -1707250, 1961190, 632971, -3770445, -2250563, 2246805, -3097208, -137439, 827855, -3096135, 965831, -1439888, 2833068, --3769908, 5240397, -729071, -2787434, -5018133, 1829656, 4124779, -1475858, 904091, -2236604, -1057099, 2969433, -147640, -1038845, -1052267, -1012002, 2515777, -2498060, -2246268, 671626, -1196685, 1803886, 217970, -1911261, 5364951, 634581, 682363, 3292629, -1029718, 1573032, --31139, -943282, -509491, -445603, 1829656, 3636764, -610422, 921271, 622233, 4495220, --869731, -1659468, -938450, -1498407, -2046552, -388158, -4283156, -2802466, 1347546, -1003412, --1276142, -2016487, 633508, 4391067, -1258425, 151398, 542240, 7432978, -38655, 1538135, --2897492, -1939178, -644245, -1813550, -2010582, -1825898, -1247688, -1722819, -2388539, 2254858, -3562675, -1735704, 622233, 315680, -3841312, 292058, 5369, -2605972, 5360656, -2499134, -3088082, 1342177, -716186, -2816425, -2700998, 2925410, -1318018, -797790, -4069482, -828392, --292058, -1722282, 5652714, -962073, -251256, 2585570, -304406, -4355634, -2275259, -3793530, --2633889, 6638409, -1666984, 7364795, 90194, 46171, -1150514, 1178432, 432718, -3808026, --4317516, 3659849, 533113, 2648921, -118112, 3048353, 1785633, -3546032, 208843, 1910187, -2459943, 588411, 2073932, 9867687, -512175, -925565, -2226404, -5027796, -6255083, -5706401, -903554, 5531381, 2095944, 7305203, 2673080, -2975876, 1098438, -8185134, -6885907, 3543348, --2260764, 4895726, -192737, -3512747, -1619203, 9494025, 2313914, 4143570, 66035, 3223373, --1137630, -917512, 2080375, -1057636, -3802657, -81068, 1727114, -257161, 2147, 6107444, -3891777, -6127845, 389768, -3814468, 6923488, 4151623, 523449, -2174327, -2195802, 3267396, -1956895, 5172215, -4387309, 8093329, 9946071, -2499134, 9694278, 153008, 5190468, 3236795, --1519345, 1782948, 7804493, -758062, -4898947, 4491462, 1620813, 30602, -395674, -843961, -497142, 4438849, -2699924, 1562294, 1279900, 2204929, -3658775, 3866008, 788663, -1063004, --8578123, -6753299, 1810866, -3918084, 2390149, -4835597, -6806987, -6274947, 590021, -4736812, -3884261, 2833605, -6083285, -1396938, 2098092, 360777, 2637647, -1904818, 2733210, 3527779, --5449777, 1473174, 1410360, -4323422, 2142652, 256087, -5194226, 3467112, 3197603, -1901060, -3516505, 393526, 2807298, 2677375, 858993, -1988033, -787053, -6010807, -2105071, -3055869, -2747169, 3118146, 934692, -9532680, 1440425, 3833795, -2487860, 6484864, -5775121, -7292318, -168577, -2247342, 1907502, -5238250, 8942122, -609349, -3527242, 795643, -295816, 5194763, --725313, -3226594, -639950, -2239289, -3315178, -3778498, 1248762, -6730751, 198105, 46171, -1430761, 4147865, 913754, 2803003, 4241280, -3783329, -20647518, -995896, -3097745, 13405130, --345208, 169651, 2354716, -2649458, 6448357, 1057099, -8223252, -4777614, -9532143, 873489, --1255741, -3767223, -3202972, -3979287, -2702071, 10227928, -5660767, -3223910, -3470871, -9089761, --969052, -2800319, 2240899, 3383897, -1961190, -823023, 1838783, -3335579, -1295470, -1874753, --3616363, 2552284, 6160594, -1614371, -1702418, 4519380, -7642895, 3757560, -6215892, -12214350, --7780870, -12181601, -2293513, -7326678, -4903242, 309238, 3960497, 1394254, 2675228, -2587718, -3366718, -5749351, -1633698, 3147137, -559956, 4717485, -2920041, 744103, -4536023, -4067871, -2426120, -8011725, 1315871, 4058744, -7293392, -499827, -2345589, -4419522, -5014911, -5415417, --1988570, -3425773, 28454, 12932147, 204548, -6997039, -6754910, -2196876, -4909685, -1760937, --3679176, 1160178, 692564, -5451924, -3259880, -5993627, 11809013, 5209259, 1125281, -428960, -6405407, -9263708, -131533, 66035, -6004901, -7723962, 7165079, 445066, 5100811, -7715372, --3537979, -2464238, 2756832, 67109, 3387119, -5168993, 1618666, 2661269, -6063420, -5356361, --5295158, 1685238, -1806571, -1154809, 4969277, -1000191, 453119, 604517, -1118302, -5187784, --3619584, -89121, -8744017, -5020817, -4681515, 3033858, 1491427, 4117263, -1015223, 2224256, --270046, -115427, 3824669, -2291365, 6790344, 1856500, 1921461, 27380, -2495913, 3804804, -1968169, 6637872, -1844152, 2116345, 3204046, -563714, -53687, -5586142, 3385508, -3192235, -14835354, 14030584, 10398653, -3890167, 3628174, 5129265, 2885681, 2776160, -5600638, -4910758, --7244536, 5916855, -6818798, -1075352, -5044439, 7941932, -9415642, -7075422, -3702262, -1742146, --5330055, -7815230, 1836099, 126165, 120259, -9415642, -5366562, 2120640, 1585380, 2329483, --2817499, -3899830, -55835, 2486786, 3163244, -2837363, 2983929, -5115843, -1655710, -12142946, -3981435, 1175747, -2432025, -2505577, -9162239, -4254165, 695248, -2370822, -12732431, 6404333, -2303176, -248034, -3780645, -2809982, -5684389, 1375463, -2347737, 3342022, -1300838, -1960653, --7558606, -1528472, -1298691, -4009352, 7044820, -5698348, -598074, 4482335, -2696703, -6055367, --4275640, 5245229, 6473590, 3914326, -1875290, 267899, 18212272, 6053220, -2749316, -2219424, -6349036, -12447352, -2397129, 9915469, 4949950, -7073275, -220117, -4834523, 1869921, 7591892, -18843632, 6131066, 14665703, -5331128, -1151051, -14446123, 4808216, -4304094, 3980361, -6404870, --382252, 470299, -2284386, 5002563, -2354179, 2309619, 6280853, -5003637, 2807835, 7925289, --2253247, 2537789, -40265, 3076270, 4377109, 4369593, -24357834, 8698919, -2863670, -11579769, --2046552, 6745246, 2065879, -9007620, 4678830, 6707665, -14385456, 915902, -4118337, 8178692, -1837709, 6703370, -1796370, -5275294, -10160282, 338229, -6203544, 18686328, 3365107, -3423626, -6159520, 476741, 5924371, -15268609, -2204392, 1951526, 4332012, 730144, -7371775, -1482301, -1998770, 6279242, -21910776, -24011014, -8354249, -2060511, 235149, 4855998, -10370735, 3004867, -11784853, -7081864, 6177774, 8093329, -5986111, -27917, -3019899, 9941776, 13953275, -6991133, --8197482, 6908455, 479426, -7009924, 3012383, -101469, 1568200, 1807108, -3841848, -2867965, --15336791, -1001801, -4536559, -575526, -658741, 10053445, 2841658, -18699750, 96637, 8660802, --10312216, 2410551, 10645076, -2644626, 3606162, -43487, -3068217, -7289633, 13741748, 11465952, --9157944, 4382478, -3548180, -773094, 4117800, -3426847, 3414499, -5874442, -863288, 11427297, --3586298, 2100239, 5332202, -4456566, -9936944, -884226, 3084860, 1202054, -4905390, 27917, -2366527, 3515968, 8382166, 4528506, 9259949, 3999152, 1637456, 3001109, -22655416, 26811870, --788663, 17511656, 2005750, -9004399, -2193118, -4904316, -6111739, -152471, 1188632, 12877923, --1199370, 9083319, -7669738, 303332, 2792803, 2676302, 1676111, 11301133, 11238319, 4604205, -2397129, -564788, -1328756, 164819, -1032403, -16797080, -5271536, 8874476, 5948530, -1176284, -1607928, -7528541, 4922033, -9404905, 2939368, 17002164, 2465848, 4322885, -12778065, 8009041, -6969122, 2549600, -8361228, -3128884, -3546032, 1576790, -7461432, 9140764, 10773925, 6972880, --277562, 16056198, 5982353, 23110146, 9255655, -5053566, 19051402, 1325534, -6271726, 14330695, --1761474, 5364951, 8795556, -5147519, -4983773, 13369159, 13428215, 8850317, -10929081, 5072357, --537408, -4098473, -9859097, 7228967, 9886478, 6553583, -11737072, 17482128, -3988951, -10198400, -4522601, 8017094, -6411313, -2948495, -14486925, 7166153, -4733054, -1141924, -13169980, -5494874, --3838090, -1724429, -5393405, 3999152, -1869921, -2810519, 4318590, 5305895, 9232032, 8680666, --2431488, -2281165, -10285373, 5091147, 1313723, 8080444, 3173981, 2596845, -1426466, 3575024, --5924371, -5440650, 4545149, 2266132, 4626754, -13300440, 5903433, 9605157, 1269700, -11668352, --11404749, -9405978, -28004798, 4666482, -1971390, 14723148, -5504538, 12307766, 5292474, 1288490, -16780438, 2793339, -158914, 11408507, 5707475, -14479408, -5708012, 2217277, -2988224, -8058970, --3317325, 19633906, 10751377, -8705899, 855235, -4792110, -497142, 3009698, 15548318, 234076, --2014877, 17043504, 8029978, -11319923, -2308008, -2469069, -868120, -59593, 32775432, 6046240, -12416214, -4881231, 10919417, 21492016, -17047262, 27690192, 16572668, -6326487, 885300, 2501819, --9021042, -15302432, 1737314, -8479339, -13837311, -5548024, 1884954, 973347, -1185948, -5524402, --507880, -5330055, 127238, -6293201, 23085, 6055367, -10810970, 7311108, 10095858, -6342056, --6400038, 6070400, 4236449, 520228, 29291676, 3747359, 19675246, -12555263, -878321, -15443629, --11842835, 4298726, -11899744, -15524696, -10881300, -11397233, -2429878, -1903207, -13927505, -13914083, -20542292, 4858145, 1532230, -963146, 10685879, 7717520, 12772696, 783832, 11977590, -4471061, -2602213, -19925964, 17925582, 11579232, 712965, -9071508, -2393908, 14218489, -7774965, -6616397, -16054588, -16109885, -12579422, -4182225, -10282152, -2873333, -18853296, 2457795, -12129525, 6784438, --195421, 1325534, 8638253, 1366337, 5701032, 8169028, 7849590, 6058052, 11543261, -27917, -7415261, 6278169, -10756746, 14681272, 2638184, 5904507, -10135049, 11060615, 4372277, 7252053, -900869, 1486596, -3013457, -13444858, 1611687, 4870493, 6433861, 6745783, 445603, -16076599, --10414759, 8388608, 4160750, 427349, -6851547, 5145908, -6636798, -16284905, 19493246, 10750840, -7856032, -10189273, -5513128, -12827994, -34740380, -3269544, -6259915, 1925756, -9436043, -10785200, --16387448, 2147, 2830384, 15824270, -16620450, 3013457, -1882806, 5374615, -15293305, -19331648, --12448963, 6170795, -493384, -25748866, 16405164, 17445084, -7150047, 15059766, 5773510, -21473762, --3049427, 30845382, -3304441, -18577344, -2192044, -694174, -16292422, 13251048, 3343632, -7393786, -13773960, 9886478, 31421444, 19272592, 1247151, 3607773, 29635812, -6023692, 8029978, -10383083, --16298327, -3610994, -10879689, 4090956, -210990, 7351911, -281857, -504659, -4318590, 24382530, -1640678, -16293495, -13736379, -1543504, -3227131, 1107028, 7864085, 22585622, 13672492, 6249715, --12269111, 18087182, 29846802, -4263292, 13671418, 14620069, 35800164, 8914205, 6928319, 13000866, -15251429, 10751914, -12216498, -9296457, 8120710, -19236622, -13309567, -12887586, 14575508, 15937550, -8696235, -343061, 10433549, 26377004, -13671418, 22183506, 17384418, 2270964, 17292076, -10133438, --2823404, 6198175, 20744156, 36719824, 4234301, -3556233, 4209068, -1763621, -5631776, 1254667, -4211216, -8761733, -11440719, 4148939, -5707475, -3268470, 9778030, -394600, 18770080, -9565429, -18440442, 8809515, 2333241, -10404558, 3982509, 17811230, 5801964, -9140227, 4193499, -2259153, -1200980, 10354092, -13797582, -7849053, 16976932, 146029, -3207804, 13845364, 137976, 4712653, -4070019, -13782013, -23654532, -5548561, 9468255, 15353971, 4392141, -12514461, 16752520, -5631776, -32968706, -16678969, 22582938, -13123809, 8852464, 17765596, -25972740, -28812788, 1090385, -8726300, -8605504, 8121783, 2698313, -5060545, -15153181, 10202158, -853625, 18854370, 10666551, 17381196, -6827388, 9514426, -2626909, 12883828, 7318625, -9920838, 4572530, -1271847, -28319940, 22484154, -29471528, -8048769, -2510409, 9529996, 39416524, -194884, -25409564, -10981695, 3586835, 3289408, --8931384, 6436546, -6814503, 11266773, -21747030, -287226, 11415486, -9900436, -10532870, 403190, --21515638, -7605314, -7899519, -33546916, -28478318, -17131550, 10525891, 12545599, -3779034, -24297704, -1237488, -607738, -2156074, 3157338, -12847858, 26036628, -9210020, 2051921, 29061360, -28105730, -11454678, 3037616, -10706280, 9591736, -8631274, -23097260, -1005559, 17190070, -9844602, -15089294, -6274411, 992137, 16275242, -1406065, -29061896, 643708, -17882096, 25496000, -11519102, 2505577, -4882304, 1640678, -5748277, -19196894, 5368172, 16783658, 3249680, 17340930, -30133490, -17049946, --7095286, -2033667, 209917, -23445152, 16226923, -5410048, -20845086, 31319976, 1197222, -52970904, -21649856, -7108708, 4511863, 5606006, 7535520, 13210246, 5180805, -9509594, -1879585, 13247827, -9367861, -10496363, -62277, -8342437, -3813931, -26121992, -2774012, 12557948, 16209207, 3461744, --5578626, 17222282, -17172352, 19603842, -10676752, -6523519, 3063922, -6293738, 6003291, -15937550, --20451560, -24007794, -6789270, 12022150, -3899294, -200253, 15362561, 3658239, 3459059, -856846, -1462973, -5451924, 1209033, 15103252, 10661183, 15916612, 15067819, 15916612, 12395276, -10470593, --5048734, 3342558, 218506, -19755238, 14092861, -4286914, -16525960, 21571474, 1222992, 2636036, -935229, -9306120, -1045288, 8220568, 15458661, 10035191, 2247879, 5494337, -20904680, -4845797, --5947456, 11025181, 6238440, -6113349, -8010651, 72411536, -71111240, -3572339, -77308336, -11978127, --29384556, -3590593, 18898392, -9596568, -21366926, 33728916, -9082782, -5883032, 1173063, 10398116, --1135482, 28044526, 18649822, 11138461, -16449725, 1123671, -11170673, -11458973, -7537131, 459562, --3367254, -3044058, -9156333, -2012729, 15720654, 1995549, 10509785, 10348187, -539555, 13801341, -20244866, 1223529, -3719979, -10214506, -12013024, 5180805, 5899138, -10052371, 17398376, -22020298, --21997748, 2828773, -7255274, 12466143, -20205136, 9387725, -39434780, -20925080, -31307628, -2190433, --14876693, -744103, -8548596, -11296301, -9218074, -22549, 4223027, -30379378, 5300527, -5600101, -5587753, 1682554, -12250857, -23751706, 20419348, -13118978, 485331, 18792092, 2291365, -424128, -14294725, -5675263, 60202020, 31048856, 15763604, -12590160, -5862631, -29003378, 8204998, 26203596, --3369939, -4182761, 41622528, -5535139, -7586523, 21602612, 30774514, 6797323, 31322122, -5802501, -5617281, 19463182, 21229486, 33363842, 26726508, 393526, -10314364, 11258720, 12570832, 12651900, -14539538, 25422986, 12502113, 31857920, -10807748, 973884, 9590662, 9942312, 26198764, 16589848, -27950574, -17908940, -5632850, 12676059, -20741470, 18911278, 17779554, 18443664, 7374996, -19614578, --7650948, 42318848, 10479183, 29099478, 22585622, 26621818, -5353677, 34708168, 51199768, 19510426, -3947612, 37936908, 24197308, -12218645, -9650792, -15809775, -15375983, 16969416, 16013786, 3287261, --17054242, 2105608, -16027207, 1265942, -9424769, 10783052, -36165772, -1588601, -4840428, -19029390, -8815957, -22909356, 38852276, 55040544, 32122060, -14947023, -30783104, -12004970, 27368606, -8967355, --22879290, 40585292, -28777354, 23802708, 14008036, -33624764, -13419625, -4547834, -53633940, 927713, -6380174, -27230092, 53238804, -19586662, 49520972, -38339024, 5840619, 795643, 36404144, 51323784, --3880503, 16225850, 25562572, -31178242, 20257750, -41652056, -10289131, 73251208, -3543348, -23026394, --3320010, -44542568, 2625836, -15786689, 48005388, 15274514, 22848152, -10044855, -11519639, -26462904, --20739324, 2297271, 4022774, -3250217, 32436666, -11213623, 7049115, -36407900, -15826418, 17670032, --47478716, -23521926, -13583908, -21320218, 46250892, -1819992, 49758268, 29524678, 16168941, 12641699, --10846403, -32729262, 21230560, -43116640, -24174224, 32753420, 35794796, -58097484, 62792960, -1045825, -5231270, -19436874, 50746112, 12372190, 32800666, 12821551, -20892332, 7834021, 18336290, -30206504, -21858700, 1002875, 14576045, -40490804, -2965138, 10735808, 38075420, -15127949, -31057982, -687732, -37799472, 20572356, -14285061, -31752694, -1538672, 27923194, 3578245, 2644089, 7512972, 20535850, -49838264, -69575784, -11731703, 7604777, 38953204, 9586367, -21565030, -4435091, 14598594, 36687072, --4001299, 2635499, -67946384, 20456392, 9992778, 19355806, -49619756, 44281648, 36516348, 15054397, --23051626, -1195075, -25559888, 19426674, 30708480, 14563697, 13513041, -1548873, 22529250, -33949568, -31465468, -8450885, -14289356, 40936408, 29545616, 3963718, -15771120, -30055644, 19159312, 28877212, --75369696, -1035087, -50801948, 27045410, 6389838, 17796196, 21051246, 30077656, 11542725, 10765336, --12181601, 16326781, 4099010, 35484484, -2518998, -8407398, 27936614, 22128208, -3136400, 3517578, --10051834, 2143189, 9716290, -797253, -5514201, 17023102, -10821170, 3459059, 21767432, -2499671, -13067438, -18953154, -3068754, 4811974, -7439957, -1276679, 3554622, 17069274, -2669859, -22876070, -2101313, 52113524, 11442330, -24781424, 9162239, -25252260, -17823040, -11848204, -2825015, 34312492, --2442226, -22835268, 52503292, -53099216, 10443213, 59602872, 6979322, 42807940, -29615410, -54086524, -19327352, 5016522, 46345920, 5618891, -24733642, 24495272, -4866198, -1102733, -10034654, 2090039, --15080167, 12267500, 3116536, 17034378, -18460844, -10870562, -5263483, 28085864, 11039677, -21225728, --117632176, -255214480, -108173584, -158138544, -226404368, 104097120, 20326470, 55109800, 294330880, 224537136, -125950456, 240619104, 176296064, 20933134, 50495392, 40572944, -130976104, -113184200, -61652108, -193517808, --186158912, -77745352, -101275328, -137444320, -64509336, -56203944, -140421264, -118189448, -20431160, -71780712, --115947472, -46265388, 21941378, -86136640, 11537893, 102900976, -19838990, -26097832, 142307296, 112828792, --16371342, 169779520, 196864656, 75127568, 184477440, 264907136, 152902976, 133325448, 318408480, 254056448, -187261648, 226001712, 300491488, 103623064, 34864396, 123229592, -110948672, -299609408, -220846688, -329764896, --533160608, -474892928, -505987936, -583672128, -597064320, -511007168, -447137248, -443189088, -312575904, -131227360, --87682296, 1000191, 168455056, 310556736, 328255776, 392185824, 330019392, 215854848, 0, 0, -0, 0, 0, }, -}, -{ -{ --132070, --67109, 317828, -6643241, 1188632, -184147, 210990, -4071092, 1222455, -7295002, -3908957, -1842004, -1560684, 2344515, 3863860, -2347737, 2735894, -3688303, -402116, 3347927, -998580, -2068564, -5641440, 687732, -12885, 1688459, -1324997, 1964948, -2812130, -1526861, 1977296, --4854387, 1438277, 1396401, -1577864, -2652679, 7001334, -1620276, 1882269, -2807298, -977105, -943819, -5814312, -3759707, -3112241, -2216203, -2803003, -2863670, -52613, 143881, -2734284, -956704, 194884, 2765959, -2286533, -1091459, -261993, 1220308, -1404454, -3934190, 4258997, -3278671, 1841467, -1231045, 1731409, 383326, 2673617, -3260954, -6189048, -5268315, 694711, --3234110, 2296197, 5021354, 1111323, 3317325, -8733816, 4890894, -6681896, 613643, -2925947, --1042066, 2370285, -4221416, -7497939, -2062121, 462783, -4395899, -2580202, 3366718, -2263448, -1452236, -9335648, -986232, 6070400, 3110093, -10420128, -3743601, -2835215, -2937758, 3336116, --1709934, -5485210, -3576097, -3955128, -4111894, 6649683, 1898912, 4242891, -3048890, 5615133, -4983773, 3600793, -2289755, -4969277, -4051765, 302258, 735513, 7698729, 2525978, 1392106, --3913789, 761283, 91805, 811749, 2840584, 1755568, -5546414, -4568772, -2583423, 2786897, -400506, -1053341, -5927055, -1779190, 1945083, 2519535, -2565169, -900333, -164283, 2681670, --886911, -3023657, -311922, 401579, -4194036, 8180302, 156229, -5648419, -415538, -1014149, --5553930, -5021891, 5897527, 5401995, -4195646, 3282429, 431644, 1726040, -14009110, 5534602, --1978906, -9579388, -12451647, 401579, 9225053, 607201, 6032819, 272194, -11233487, -3877819, -1459215, 4021700, -1850057, -935766, -4630512, 667331, -704912, 8067023, 4257923, 1730335, -1619740, 2200097, 2975339, 7340099, 4632659, -6473053, -353261, 1502702, 1770600, -7713225, -2716567, -2308008, -4655208, -1403917, 18790, 5236639, 1588064, -2986613, 5578089, 8267812, --1512902, -3216394, 2270427, -667331, 4816806, 4553739, 3909494, -5659157, -3944928, 3876745, --1382980, -1527935, -3952444, 308164, -6008659, 3591130, 3744138, 4246649, 1510755, 4918275, --5229660, -3879429, 7710540, -106300, 3178276, 7823820, 7046968, 498753, 2638184, -6185290, --5288716, 2813204, -1577864, -2339684, -2968359, -2752000, 2022930, -7121593, -4179540, -8763344, --10558640, -2034741, 8474507, 5468030, -3671123, -1078037, -1384590, -2114198, -7671349, 5293547, --2071785, -2015413, 274341, 3434363, -1890859, 227633, -469762, 5021891, -4934381, 5041755, -2569464, 6064494, -2324651, 4679904, 1870995, -2999498, 4031901, -2961917, 2206540, 4496294, --3700651, 4730370, -3131568, -2345589, -1013075, -1450625, 2101850, -1422171, -3952981, 1436667, --3490735, 674847, 74625, 481573, 6828461, 1398012, -2057826, 47245, -3384434, -4107063, -1665911, -968515, 6372121, 7047505, 2287070, -1904818, -1706176, -2147, -3476239, -3151969, -2698313, 5574868, 13794361, -5727339, 5705864, -6919729, -5794448, 97711, -1541893, -1421097, -2005750, -2877628, 6030134, 5848135, 5061619, -1429150, -538482, -2525978, -6216965, 1044751, --3684008, -650151, 818728, -2068564, 3737159, 1414655, -296353, -10400800, -4218732, -6538014, -397821, -4262218, -6465537, -2857764, -3494493, -4003983, 6768332, -5224291, 4831302, 447213, --1677722, 2647311, 2440615, -4678830, -1079111, 142271, 5319854, -439697, -6721624, -8786966, --8939974, 2439542, -3087545, 250719, -439697, 1380295, 3417183, 5162551, -3199214, -1815697, -2039573, 1814624, 1041530, 6469295, -3164317, 4025995, -6899328, 14497125, 2290291, -1468879, -3389266, 1450088, 3434363, -3947612, 104690, 1142998, 599148, -882616, -5621039, -6550362, -1132798, 1404991, 601295, -898185, -3862249, 2552821, 2065879, -5897527, 7269232, -8712878, -11099806, -909996, 3801046, 1779190, -80531, -1015223, 2393908, 10428717, 11651173, -2043331, -2207613, -1225139, -1503775, 1688459, 2572149, 8056285, -878321, 2552284, -3875671, 4487704, -1076426, 6382322, 3125663, 5986648, -8301098, 3699578, 3164854, -2494302, 7516, 6479495, -116501, 642635, 2007897, 3994320, -1232119, -408559, 12276090, 5944772, 1138703, 1240709, --2505577, 5666136, -7343857, -10698764, -13067438, -700617, 6890202, -117575, 3423089, 9387188, -3651259, -1582696, -3320547, 5007395, -1034550, 11987791, 5279589, 1764695, 1541893, -6584722, -1220308, 4810364, -2719788, -7599945, 1056562, 1917703, -15349139, 2314451, -609885, 11551315, --7598871, 5418638, -16301012, 7270306, -1010391, -7978439, -8876624, -5979668, 5619965, 4583267, -13393319, 2352568, 4842039, 12929999, -1562831, -8259222, 1908576, -6201933, 2248416, 10691247, -2426120, -2108292, -626528, -1207423, 3505767, 4593468, -260919, 3320547, 5719286, -2474975, -2197413, -5293547, 97174, -6801081, -619012, 1818919, -3019899, 6389301, 4390531, 5581310, -10071698, 1445793, 12072616, 9654550, 4845260, -5092758, 13775034, 6576132, 2925410, 12480638, --642635, 1222455, 1602023, 4830228, -1748589, -2335389, -7227893, -6575058, -5532992, 1203665, --4174708, 11329587, -5298379, 5467494, 7206955, -2175938, 1312113, -1394254, -549219, -8244727, --9960029, 7266548, 146566, 13385266, 551366, 188979, -1183800, -2589329, 2458332, 568546, --6743099, -8723079, -11752641, -6199786, -12290049, -7876433, -4116726, -9170829, -5682242, -4021700, --4638565, -12402792, 8630200, 5297842, 463320, 4450123, 2219424, -3469260, 15552077, 912681, --5120138, -2825015, -10213432, -4518843, 11675869, 520765, -9363029, -9639517, 1663763, -9754408, -3400004, 3378529, -7266011, 273267, 2696166, 517007, 11623792, 3362423, -4764730, 1134945, --5759551, 5697274, 1251446, 2542084, -13304735, 9543954, -4223027, 4022237, 872952, 1932198, -2861522, 476205, -3363496, -156766, -4673462, 221191, -10089415, 212064, -10865730, 15803869, --1675574, 10288057, -6152541, -2779918, -304943, -6651831, -2654827, 7176891, 1811939, 1619203, --6932077, -122407, 4966056, -13259101, -66572, -5802501, -4604205, 9187472, -15214922, -14471355, -3703336, 18958522, 467615, 1653026, 1457068, -3090229, 10460930, 9969693, 5876052, 2676838, --2740189, -15754477, 9232569, -157840, -12411919, -4268124, 2928631, -898722, 155693, 984084, --2936684, -12562779, -621160, 172872, -2161979, -5470178, 3765076, 10255845, -13616657, 8133058, --5035313, -3008625, 930397, 6314676, 22407918, -14898705, -3497714, 891206, -1284195, -3200288, -891206, -6131066, 2087891, -5644124, 15496779, 4558034, 3058017, 3454764, -3038153, -1730872, -8322573, -2207076, 3751654, -7778186, 12002823, -638340, -8066486, 15129559, -10202158, 6047851, -2461553, 1924145, 12298639, -7011534, 5471252, -3636764, 248034, 16313896, 1293322, 4261682, -4859756, -2720325, -9353902, -7352984, 1161252, 16304770, 9281424, 2004676, -14535243, 2095944, --7968238, 39192, 16369731, 15677168, 7988103, 10590316, -9497783, -19832548, -10298258, -14301704, -8003672, -164819, -2321430, -80531, -10706280, -3237869, 3453691, -2062658, -3986804, -4029753, -11689827, -784368, 3287261, -3325915, 7733089, 1563368, -4204773, -9238475, -6878927, 20874614, --702764, -4784057, 6900939, -12013560, 3984656, -6904160, -20635170, -4752382, -2439005, 6252936, -2727841, 5478768, 2098629, 8184060, 677531, 484258, 4982162, -20517596, -2776160, -5595269, --957241, 1859721, 12286291, 12814572, 5302674, -3547643, -8210367, -11913702, -3108483, -7103339, -2445447, -3620658, -2542084, -7740068, -23117124, -14952392, -3076270, -5145371, 12565464, 8753680, --1464047, 21232170, -20467130, -4436165, -7388955, 22636088, 11185705, -6842420, 8732205, 3555159, --8068096, 15759309, -16318728, 8800388, -7190312, 1752884, 2447595, -5211943, 15413564, -9972914, -9720585, -3908957, -21112448, -3192771, 15876347, -8789651, -14169634, 615791, -1140314, -21826486, --3422015, 9330280, 4544613, 12264279, 9509058, -2109366, 22206592, -4718022, -5736466, -10121627, --8908299, -9078487, 6797323, 8380018, -5914707, -7377143, 3583613, -6350646, 10045929, -2087891, -6010807, -3264712, -4342749, -3897146, 1183264, -12222403, 4819490, 9432285, -584116, 4268124, -7151121, 6769942, 13521094, -8017094, 5916855, 9319005, 1416266, -19118510, 18173618, -9428527, --25674240, 1376537, 20451024, 25772488, 5835250, -7765838, -5523865, 3796751, -3115999, -2585034, -12033425, 12220793, -4087198, 11848741, -12090333, -316754, 10924249, -3373160, 12965969, 6842420, --322123, -14701673, 7454453, -2378875, -2497524, 2223719, 134218, -290447, 23390392, -9392557, -12615930, 20357608, 14485314, 8391292, 1651415, -10956462, 13917842, -5428839, 13354127, -5114233, -4233227, -11484743, -1010391, -10718628, -6592775, 3613141, -9950365, -1405528, -2383707, 1378148, -11972221, -10183904, -8665097, -1792075, -4163434, -351650, -8429410, -11123428, -14710800, 4037269, -15047418, 1611687, -6006512, 4092567, 5141613, 13243532, -8748312, -3211025, -781684, 3425773, -10911901, 4522064, 5937256, -2174864, 2213519, 13330505, -45433776, -21731460, 14798310, -37137508, --25844428, -1897839, -15331960, -10562398, 10965588, 12632573, 3646964, -2600603, 4358318, 36603320, --4826470, 5666136, 13861470, 15937550, -17125108, -8937290, -8290361, 13382044, 14502494, 7242389, -2381023, 13688598, -4445828, -7180649, 9394704, 18602040, 962073, 5866389, 18750754, 13901735, -11115375, -8808441, 3220152, 5575942, -451508, -542240, 11859478, -4261682, -627602, -1485522, -7760469, 54224, -13888314, -9258339, 2233383, -18525268, 13351980, -4353486, 30061012, 892816, -16266115, 2970507, -1217623, -10232760, -959925, 3489661, -13396540, -7122667, -15556908, -2441689, -7269232, 9903121, -4995584, -25255482, 8552354, -4726612, 8154533, -9784472, -10512469, 6522445, --15413027, -13569412, 25604984, 18931142, -7735236, -20578798, 9709310, -10455561, 5259725, 330712, --9920301, 20114942, -25444460, -460098, -30840550, 1388348, 26094074, 36219996, 17500918, -5483600, -17128330, -613643, -1598265, 2413235, -2092186, 9404905, -368830, -15998753, 1706176, -22479858, -8900783, -6481106, -4393215, 16222628, 476741, -17090748, -19086298, 5342403, 3593277, -9171366, --7388418, 15673409, -20667382, 672699, -3406983, 8428336, -4802847, -3838090, -16224239, -6464463, --6529961, -2314451, 13593035, -13813689, 6533182, -810138, -1258425, 2976949, 6758131, -23889144, --1154273, 4549444, -572841, 10481868, -6080600, -9714142, -3051574, -26524644, -10107132, -10624138, -3123515, 13666049, 20933134, -6553047, 17160004, -21048024, 41865192, 5370320, -460098, 24080272, --7657927, 22936736, 1318018, -16354699, -344671, -2465848, 10655814, 7017977, -9958955, 11541651, -241592, -25756918, -28020366, -2681133, -8413304, 7004555, -1163399, -9905268, -25241522, -22058416, -12080669, -18771154, -4158602, 1184337, 5998459, 1397475, 18092012, 1503239, -9047885, 12068321, --1532230, 1751273, 11232950, -14716705, -879395, 3162170, -14906758, 9065065, 12561706, 5396627, -11196980, 5747203, 17291538, 4634270, 12629888, -17632988, -5348308, -2881386, -23432268, -220117, --2388539, 9759776, -1402844, 11181947, -1694365, -13847511, -9109626, -899259, -21582748, 9330816, -852014, -4520990, 13026636, 7731478, 10892574, 10562398, 3688303, -1864553, 9599789, -30275224, -9337259, 2793339, 13604309, -6525129, -20588462, 11162083, -3233574, 18130130, -29671782, 15650861, -14513231, 53097608, 40128416, 5420249, 11637214, 3349001, 30836254, 823023, 15014132, -14035953, -36524940, -14502494, 33125472, -1532767, 21164526, -2513630, 14940044, -14907831, 3588445, 7390565, --8130373, -2738579, -4364224, -3513283, 9886478, 140660, -8517994, -11849815, -17718350, -22659174, --10836202, -3929895, 136365, 6943352, -18992882, 7882876, -10457708, -16306380, -3364033, -11985643, -5365488, -3100967, -24729348, -6135361, -12589086, -15175730, -15668041, 13881871, 18932216, -40033928, -8953396, 3126736, 11086384, 3483755, -5072357, 23498840, 13421236, 11986180, -33305860, -15517717, --558346, 7428683, 27343372, 143881, -3903589, 279173, 23054310, 19643032, -20134806, 20778514, -1238561, 2878165, -4403415, 9927817, -29248190, -16459925, 12683038, -7663833, 10803990, 17869212, --24232206, 5043902, -14666240, 35345432, -23962696, 19148038, 17469780, -9271224, -36713916, -22137872, --4230006, -11150809, -2978023, -17847200, -27291832, -35618164, -21283710, -24357296, 7720204, -21115132, -6017786, 361851, -4197257, -3916473, -17813376, -6830072, -18257906, 2814814, 12487617, 17044040, --1695975, -7322383, -18732500, -5977521, -414464, -11940009, 738734, -15727096, -11027329, -4037806, --15714748, 8632347, -14151917, -37569152, -869194, -3300682, -13908178, 12830678, 9579388, 14867029, -4318053, 11117523, 25055766, 2089502, -29606284, -8856759, 10391673, -8786966, -25129316, 9655623, -15378667, 2791729, -2791192, -34230352, 24568824, -5405753, 19373524, -23371064, 19414862, 49353468, --8498130, -10142028, -43192340, 15142981, -56737056, 38054484, 13967771, -9494562, 40711460, -3631932, --19969988, 35874788, -13186623, -1788317, 8128763, 12593918, 33600068, 1415192, -2033130, 23314156, -10568304, 19537806, 24654722, 17692580, 2388539, 12299176, 2742874, -1410360, -12297028, 8174934, -13404056, 2765959, 120259, -14478872, 7698729, -13645648, 16893180, 15295452, 3706020, 18085570, --10460930, 11692512, 20322174, 11641509, -24977382, -28732258, 33972656, -4022774, 21685826, 31003222, -1902671, -1000191, -2150705, 5135171, 19651086, 16260209, 3057480, 13154948, 1260036, -18173618, --19463182, -32454384, 1833951, -14413910, 1749662, 15231565, 17623324, -31200254, 3786551, 8329016, --23897198, 916439, 36330592, -19089520, -16325708, 14028974, -19340774, -1767379, -6295885, 3587908, --20526186, 3860102, -23678154, 46930032, 11120744, -26003342, 9130564, -6526740, -23116050, -27274116, --27530204, 7340636, -1823751, 23172422, 34884260, 16309065, 8098161, -4986457, 11284490, 405874, --44956496, 18788334, 45786500, -31012886, -32245004, -28239946, -39309152, 27345520, -38707320, 16441672, --173409, -5594732, -667867, -13255343, -15224585, 18165564, -39795556, 39638252, 22813792, 4515085, --26329224, -20451024, -17585744, 2746095, 6329171, -17655000, -2767033, -13277355, 27415850, 11730629, --5517423, -1753957, 10953240, 1664837, 12539694, -23703388, -9619653, -3081102, -4687957, -22083648, --15645492, 11749957, -41147936, -24591908, 2126546, 46432356, 21641266, -14954002, -2302103, -36203352, -15784542, 54769424, -192737, -10688026, -11108933, -21068962, -903554, -23097260, -16187732, -45213656, -8735427, -33585572, -49640696, 10440529, 26043072, 5611375, 6351183, -21654688, -26662620, -7744900, --39068096, -19834696, 9154186, -33048162, 49580564, 8741332, -13172128, 9758166, -24918864, -48814988, --16758962, -37596532, 5068599, 9569187, -14095009, -27065274, -13846975, -17123498, 13350906, -20154134, --7576859, -3579318, 20967494, -16703128, -3417183, -8397198, 4976257, 7915625, 1141924, -7536594, -21786758, 28018756, 18183818, -15957414, -12586402, -43831216, -24148454, -10792179, 11053098, 70928704, --12512850, -78383, 31844498, -3766686, 13533442, -17134236, -17051558, -14437533, 15247134, -41115720, -461172, -5702643, -250182, 35093104, -15039365, 53563612, 5289789, 41341744, -50523848, -13259101, -16151761, 3177202, -19063212, -3236795, -44744968, 20428476, 31712964, -24036248, -19988240, -7132867, --21917218, -26053272, 6071473, 7062000, 19061602, 401043, 16523813, 30400316, 31343598, 20928838, -6504728, -24027658, 1392643, 11870216, 15316390, 24640764, -747324, -13335337, -19904490, -7488276, -24282672, -10773389, 8833137, 21705154, 969052, 42994232, 3737695, -27999966, 22590992, 23272818, -5434208, 9844065, 20467666, 3162707, 350577, -25730612, 53264572, -58814744, -44633836, -50235012, --18248242, 9938554, -31141734, 14658723, 30786862, -10128607, 1178432, 28382218, 7074885, -31751620, --13115220, -24734180, -5873905, 1196685, -971200, 27216670, 24676734, -7050726, -9871445, 16684337, -39027296, 6403260, 31242666, -30294552, 27001386, -14551886, 5833640, -6892886, -24943560, -12400107, --24815784, -50064824, -50411640, -36417028, 7634841, 94085552, 23852100, -12761422, -28281822, -67652712, --95346128, 21769042, 39628052, 47690244, -9896678, 4363150, -27904940, -48425756, 14117558, 9125732, -15917686, 2593624, -40766756, -12152610, 10042170, -7864622, -1549946, -7357279, 53265648, 47115792, -31561568, -2463701, -22784264, -38340636, -25622702, -22733262, 36397164, -5512591, 26647050, 12572980, -12507482, -15767362, -88356608, -60245508, 30112016, -47227996, -16289737, 102720048, 70194800, 53469660, --39887360, 29692720, -27605366, 2915209, 2092723, 15765214, 43337292, 77292232, -29123636, -1595580, --50206556, -39405252, -66468912, 8545911, -2676302, -70208216, -17100950, 47716548, 17294222, 33906084, -43679280, 80481248, -57353920, -32587528, 4408784, -45462764, 18736258, -42266236, -129439576, -120819040, --71211632, -77146736, -22548042, 115772992, 56724708, 119227216, 105480640, 167622912, 118631832, 101180840, -12719009, -50583440, -108174120, -171073920, -145617648, -147006528, -78655880, -40407052, -12624519, -3526168, --113817, 24652576, 35100084, 94291176, 56014964, 112112608, 72047000, 95407328, 32202592, 92010008, -29635274, 18871012, 18968186, -10587631, -31060130, -70377872, -79441864, -145251504, -99919192, -182777168, --144417200, -220810176, -131583840, -106485664, -27976880, 54411868, 28213104, 395674, 56031068, 121660856, -166094976, 216791152, 261487280, 221213904, 162636448, 201089824, 167722224, 90364504, 40964860, -15470472, --72275712, -168841600, -195497792, -265582528, -336538080, -394280160, -350017280, -314129600, -216494272, -153952560, -55143084, 144438672, 201697040, 252096320, 160200128, 106504992, 0, 0, 0, 0, -0, 0, 0, }, -{ -4442070, --1763621, 2601677, -6839736, -655519, -2604361, 3244848, 589484, -2800856, 4190278, -3695819, --930934, 3333968, -1308891, 1451162, -5663452, -995359, -713501, -5924908, 752156, 81068, --200253, 1653562, -2985002, 703301, -1089311, -380105, 6172405, -674310, -4259534, -2035278, -409633, 1458141, -4109747, 1070521, -3109020, -68719, -1196148, -1873680, 3390340, 3307125, --2367064, 4380867, 4456029, -5549635, -933082, -586263, -5206037, -2241436, -3605088, -4102768, -912144, 989453, -512712, 469225, 1952063, 2110440, -1163399, 671089, 1888712, 5239860, -3013457, 2350421, -2647847, 233002, -1479616, 3271155, -3713536, -2676838, 2877091, -1714229, -3119220, -3618510, -1782411, -1217623, -2197950, -12145094, 4277788, -6987912, 3518115, -4013110, --8071318, -13798119, 2222646, 246961, 3249143, 2863670, -1135482, -1152125, 843961, 8098698, --6042482, -10588705, 3272765, -4459250, -7192460, -9664, -1238561, 4197257, 1346472, 2962991, --3343095, -898185, -2261837, 6912750, -2115808, -2944200, -2703145, -1336272, -1899986, -2910377, --2695629, -1810866, 1185411, 522375, 712965, 175557, 1621887, 2928094, 1307281, -2695629, --8137353, -107911, -5720360, 787053, -579821, -2510945, 3344706, 260919, -176631, -7861401, --3427384, 1122060, -814433, 2852395, 11811, 2581275, -2477123, 1182190, -1169305, 5086315, --1889786, 2837363, -4506495, -3996467, -5609228, 721018, -1381369, -1007707, 27917, -1096290, --8615168, -1817845, -1160715, -2482491, -1127429, -2987150, 2816425, -1222455, -1016297, -313533, -49929, -248034, -2071248, 7518877, 4888747, 7856569, -3712462, 7813620, -4671314, -3384434, -3092377, 8651138, -169114, -5419712, -7807177, -5748277, -1047972, 6118181, 2493766, 1982664, -2817499, -2880849, 4301947, 397284, 3234110, -1699196, -7074885, 1786706, -4868346, -3548180, --3387656, -995359, -8980240, -597000, 521302, -3972845, 8571144, -1797444, -2629057, -3602404, -32212, 730144, -3503620, -86436, -4315906, -1891933, 268435, -2057826, 6246493, -39192, --1471563, 3180423, 2371359, 5406290, 2467459, 6545530, 1890859, 5310190, -6078453, 1414118, -5340255, -1944010, -4175782, -6402186, 337155, -589484, 9738838, -4378183, -3364570, 1005022, --2136209, -1576253, 4896263, -3754875, 4714264, 2187212, 127775, 2430415, -3118146, -2955474, --5488968, -5898601, 7842074, 3738232, 2770254, 4224101, -2719788, -1784559, -1998770, 9921911, --3809636, 10857140, -353798, -2707440, -2595234, -5680631, -6153615, -7425999, -459562, -1834488, -1350767, 7269769, -620623, -3334505, -10080288, 401579, 7985418, 11796128, -5532992, 3084860, -2135673, -2934000, -2692945, 3118146, 11082626, -2599529, 1697049, -897648, -1690607, -984621, -5257577, 7762617, -5930813, -3105798, 2272575, 10161356, 1545115, 7215545, -6015639, -5359583, --504659, -836982, 1792075, 1589675, -450435, 680215, 638340, -2603287, 681289, 3255048, -1724429, -2112050, 15670725, -11256572, -2711735, -4844723, 958851, 3963718, 7374459, -7947837, -4962298, -2287607, -8400956, -13400835, -2983392, -5858873, 632971, -1539746, -5847061, -3121904, -2754148, 2947958, 9945534, 5398774, 4905927, 245350, 1309428, -5607617, -3914863, 7941932, -5986648, 3983045, 1658394, 3649112, 514322, -272194, -7218230, -10046465, 6169721, -2913599, --6902550, -3448322, -4476967, 3150896, -3993783, 7932268, 1534377, -5118528, -2709588, -4013647, --3563212, 3666828, 5666673, -911607, 3671123, -3411815, -3792993, -404801, 360777, -3655554, --1728724, 4294431, -452582, -2490007, -2891587, 2040110, 2319282, -986769, 2873333, -204548, --3184182, 7459285, -1976222, -33286, -559956, -11128797, 2619930, 1434519, 2905546, -10460393, -3233574, 537408, -2796561, -5540508, 2922188, -5277441, -614180, 10267119, 15355045, 7764227, -8638253, -199179, -3704409, 6580427, 5960878, 2742337, 3390340, 7764227, -639413, 5756867, -5635534, 8038032, 7765838, -5585068, 5357435, 17180, 2178085, -5179194, 2161442, -347892, -5464809, -1539209, -946503, -3545496, 4112968, -5717139, -4485557, 883690, 5738613, 3256659, --2673617, -1257889, -475668, -1714766, 3682935, -6974490, 7282117, 339302, 8943733, -11578695, -1385664, -10397579, -2839510, -3076270, 3507378, -781684, -1859721, 2695092, 1502165, 3220152, -5284421, 7930657, -279710, -5845988, 2017561, 10530186, 2838437, -2766496, 33823, 6482180, --2505577, 3891777, -2349347, -11174431, 7175280, 5856188, -16491064, 173409, -3750043, 1409823, --9298604, 1028645, 1382980, 12076911, -9871445, 44560, -13201656, 2902861, -8043400, -1988570, -317291, -4334159, 3603478, 1618129, -7014756, 80531, -292058, 6280316, -4328254, 10146860, --329639, -8853001, -4719632, 10812580, -1267552, 4321274, 2648921, -1799054, 6234145, -7175280, --7041062, -5278515, 474594, -6860674, 7021735, -4009889, 4392678, -6632503, -380105, -8057359, -4992363, 738198, 6029061, 5712844, -5726265, 10718628, 8749922, 8642011, 1324997, 9076340, -7027104, -7613367, 6163278, 3195456, 169651, -7057705, 2816962, -5995238, 5513128, -2541547, --5299990, -519154, 8392903, 3249143, -10928544, 9889162, -1499481, -3428995, -6694244, 10041097, -7636452, -7522635, 5492727, 23822572, 4419522, -490700, -7612830, -14704357, 4318053, -1791001, --21775484, 19941534, -8990440, -13668733, 3443490, -462246, 3094524, -472446, 4252555, 6063957, -552440, 82141, -10877005, -501974, -587874, 13839458, -1949915, 794032, 5435818, -1902671, --1135482, -5000416, 11962021, -8128226, 8798777, -1581622, -6309844, 1744831, -7106024, -3428995, --11874511, 2663954, 6298570, -2887292, -5608154, -4430259, 8141648, -11173894, -2119566, -5252745, -498216, -1163399, 2204392, -9600863, 10572062, -13285944, -8704288, 4292283, 2447595, 35970, -4510253, -6589017, -9445707, 1877438, -1882806, 151934, 6048925, -5508833, 5654862, 3890167, -12538620, -2405182, 2922725, -57982, 1631551, 16701517, 3063922, 16745004, -1469953, -4104378, --17732846, -2819109, -4076461, -14479408, -24554864, 6832219, 11839614, -9329206, -4833449, 6497212, --3203509, 14393509, -2290291, -8500814, -5388574, -22848690, 6904697, 2011118, -2689723, -16188269, -3044595, -9218610, -2974802, -8145406, -4606890, 10670309, -11397769, 4143033, -16553878, 9681930, -1294933, -251256, -5312338, 753230, -2827699, -9291088, -17457432, 2812130, -767725, 3156264, -6175626, -4458176, -2178622, -11124502, -6387153, -3257733, 3646427, 2701535, 6979322, 12272332, -8909373, 4736812, 6525666, 1961190, 6795712, 6754373, -8003135, 7801271, 7963943, -2153926, -10988137, -1526324, 13015898, -6579890, -16916266, -2709588, 8231305, 10700374, 10649908, -2486786, --23612120, -2160369, -3571265, 964757, -3718905, -4843113, -955093, 22950694, -5051419, -5491116, -7635915, 12381854, -914828, 5788542, 14264660, 10384157, -23541252, -21523154, 108985, -2006824, -3084324, -9569187, -17230872, 4154307, 13626321, 9169755, -10073309, 16262894, 12914430, 12367895, --20745766, 5948530, 10619844, 681826, 1447404, 9325448, 20995410, -3957276, -9929428, 6583111, -4552666, -2733210, 11186779, 17278654, 2895882, 17900886, 7425999, -13132936, 1148904, 14886894, --1967095, -5848672, 7207492, 1425392, 2456185, 15634755, 9433896, 5459441, 1318018, -17702782, --18807124, -1303523, 2295123, 4999342, -6279779, -554051, -5421323, 1854889, 1513439, -6570226, -1755031, -3911642, -1983201, -5497558, -361851, 11755325, -7885560, -16064788, -3876745, -13501767, -1552094, -4297115, -2267206, -695248, -39738112, -25316148, -8667781, 5553930, -3790309, -10968810, -263067, -10721849, 25366076, -12263742, 15739445, 25078850, 12871480, 11649025, -11853573, 7986492, --6648610, -13674102, 9170292, 11091753, 6738804, 16443282, -1444720, -2325188, -9450539, -9470403, --8485782, -12513924, -12431246, -8830453, 2535641, 91805, -1734630, -8398272, -5465346, -12190191, -2819646, -10726144, -10153840, -5208722, 2801393, -1488743, -7444789, -17119202, 122407, -6091338, -3898757, -19949050, -16124918, 14740865, -4315906, -4622459, -9373229, -6102075, 10249939, 2421288, --4459250, 5127117, -3801583, 5377836, 3479461, 6334540, -7745974, -10933913, -25631828, 4295, --24976308, -3205656, -21529598, -4463545, 15978352, -3985730, 940061, -14641007, 26851598, 958851, --18617072, -15786152, 17067126, 13370233, -11693585, -11450920, 22754736, 14442901, 1399086, -12859669, -2198487, -5253282, 11155104, -7916162, 1903744, -3233037, -1749125, 23148800, -2549063, -6076842, -4974109, 4047470, 7600482, 7200513, 1539746, -8977019, 7636989, 3515431, 8657580, 17761838, -8948027, -25579752, -6474663, -4227859, -18705120, 7474854, -2519535, 259309, -10009958, 9032853, --3325915, 1533303, -13252658, 9340480, -10609106, 620086, 12339978, -2211908, 12976170, -9820980, -15954193, -19710678, 10573136, -361314, -5937256, 24463596, 7676181, -5966784, -14017163, 5677947, --2141041, 1116155, -1379221, 8111046, 14539538, 17235704, -10955925, 6883759, -4063039, 14863271, -6354941, 384936, -1731946, 7408282, 0, -9709310, -38216620, -24671902, 20824148, -14958297, --14086956, 8177081, 18220862, -29573534, -4836133, 7364795, 2025077, -15287936, -23242216, 44109316, --18814642, 6267968, -21416318, 12174085, -7434589, 20841866, 18234284, 2216740, 3244848, -23935852, --27380, 11927661, -9869835, -14064944, 11511049, 3733937, 12399034, 10378252, -2115808, 4669703, --2802466, -1002338, 18260590, -15014669, -9256191, 15317464, -707059, -11130945, 15452219, 201863, --3555696, -9811316, -4793184, 6497212, -8381092, -146029, 5304822, -9604084, -10891500, -6074695, -7687992, -21722334, 10605885, -35433, 21320754, -19187230, 6488085, -14259828, 5421860, -8016557, --12081206, 20774756, -11044508, -3278671, -10775536, 10004053, -12292196, 8853538, -4393752, 16214575, -14330158, 411243, -22090628, 18528488, 8612483, -22514756, 6648610, 22591528, -2818572, -747861, -10036802, -7805566, 15643882, 14012868, -20364050, -12866648, -4364224, 9507984, 17974976, 2457258, -9200357, 20246476, 15065672, -23132156, -3141769, 34393560, 7963406, -3299072, -4933844, -7616588, --11143293, 2118493, 7879118, 8620536, 8192650, -7371775, -15875810, 2967286, -8647380, 7158637, -23562728, -7647190, -25311852, 28091770, -9681393, -17402134, 22869628, -5594195, -7967701, -26782880, --5488968, 9063455, 4066260, -7037841, -11705396, 8214662, 27917, -13471702, 9031242, -4171487, -22050362, -18985902, 1241246, -5417028, 25288768, 6782290, -39045012, 9349070, -17212618, -9342091, --15086073, 13266080, 52155936, 16267189, 1022739, 8507256, 13100724, -24617678, -12135967, -11542725, --18232674, 1578937, -8247411, -28573344, -12178917, 1953136, -11628624, -35951024, 31143344, -5980742, -14012331, 2668249, -16531329, -28345174, -27383638, 30680562, 18612240, 7067906, -10871099, -20463372, --15428059, -24298778, -6329708, 9136469, -3866008, 2054068, 3802120, -3922379, -12702903, -12044162, --20792474, -7333120, -4076998, 10282689, 6997039, 11306501, -5662915, -9135932, -4002373, 14768245, -1955284, 13106630, -43409236, -10022843, -199716, 9686762, -13958644, -399969, -16143171, 12750684, -10852845, 2356327, 53270480, 1118839, 16506633, 22294102, 739808, 7430831, 102005, -3490198, --6680822, 11480448, 16000901, 21720186, -774168, -3533148, 1141924, 14529337, 12363063, 1074279, -9939628, 9618042, 6571300, -1989107, 20607790, -4970888, 26693758, -25281252, -12634183, 21793200, --2239826, 2401424, 6841346, -26256208, 2659122, 5497022, 18969796, 28177670, -21203180, 6543920, --12821014, 20524574, 18712098, 3703336, 34556768, 11842835, 14647986, -10531797, -467615, -19587198, -34516504, -17679696, 6628209, 21750252, -3352759, -11477226, 11668352, -1445793, 6618008, 23235774, -2009508, -5357435, -557809, 5593658, 751082, -11360725, 10972031, 282931, -2228551, 38570952, --27062052, 28315646, 18726058, 34954056, 15041512, -22179212, 19709604, 1834488, 18405546, 45512156, --30404610, -11747809, -2720862, 2251100, 31316754, -16413754, 2898566, -17770428, 2817499, 35044248, --2514167, 36250596, 11137387, 7099581, 17145510, -20432234, -2407866, 16229608, 22844932, -34877820, --416612, -30194694, 14122926, -16363825, -755914, 4440996, -6881612, -22272090, 5163625, -38339564, --34005404, -265214, -481573, -21741124, 16094316, 4249334, -6741488, -20164872, 25494388, -6814503, -38422240, -6369437, 7385197, 13684840, -20392504, -6959458, 4822712, -23430120, -14146012, -20522428, -15937013, -16505022, -5684389, -5688148, 13550622, -13919989, -24266028, -32246078, -2379949, 26207354, -96637, -14908368, -7763691, -18765786, -7784628, -60130, 9436580, -21034066, -4004520, -4691715, --16586627, -20605106, -788127, 3349538, 11435887, 4502737, 20904680, 6311992, 26814018, -11958263, -21744346, -5983963, -20575578, -4733591, 36468568, -16534550, 15382962, -12055436, 26014080, -14789183, -7136625, 18174154, -3640522, -7195144, 654446, -10043781, 22671522, -23445690, -12475806, 25720412, --7735773, -21833466, -34378528, 40499932, -11716671, 34652868, -5603322, 28063316, 3650722, -7166153, --16910360, -11762305, -964220, 1587527, 21196200, -6336688, 9664, 6801081, -16369194, 30090004, -12419972, 2196876, -22193170, 17452600, 10292889, -17928804, 20330228, 2696166, -1144609, 5753109, -1252520, 25488484, -3717294, -29693794, 35138740, -16103443, -707059, 25692494, -8848170, -4401805, --12642236, 39948028, -15284178, -3845070, -22122840, -3775813, 5302137, 35782448, -13901199, 7495255, -13598403, 21642878, -2842732, -21174188, 26794154, 15524159, 22387518, -8634495, -1703491, 3366718, -24794310, -11119133, -22082574, -27466852, 18627274, -18985366, 8863202, 22039624, 23752242, -13019120, --270046, 29313152, -40489732, -335007, 12022687, 16415365, 4967130, -15828565, 7624641, 14169097, --7047505, -8139500, -49744848, 17650704, 10366440, 45369888, 39897024, -5322002, -13919989, -45749456, -1963337, 15947214, -19176492, 15573551, 27698244, 26780732, -11570105, 32133334, 28985124, 1779190, --16449725, -17918066, 29598768, 25142738, -34495568, -47568372, 64411088, 3678103, -3826279, 8722542, -5415417, 23982560, 24205362, -9134859, -7337415, 33503430, 16505022, -5669894, -21360482, 13638669, -3380676, 2013266, 12556874, 1852742, -307090, -13094818, 8172249, -3845070, -15507516, 29904784, --46731928, 33140504, 28199682, -44969920, -2400887, 22839562, 6506339, 25997438, -5415954, 3439732, -24651502, -3495030, 12913356, -22629646, -34454228, 98229664, -39808980, -57671748, -11855720, 108995536, -48041892, -48391396, -10208064, 17453136, 13739600, -3260954, 5078799, -21767968, -14567455, 22674206, -40689984, 940598, 68997040, -33596844, -14368276, 39323108, -207769, -4291209, -23516556, -44348220, -32974612, -23985244, -26381300, 16472273, -29049548, 11476689, -27682674, -29810832, -7093139, 4454418, -1599875, -8255464, 31341986, 6862284, 18164490, 8339753, -1843078, -958315, -17670032, -33818036, -7921531, 30942556, -28834262, 21265994, -29351270, -4024384, -3935264, -42753716, 27157616, -15483894, -9076340, -155693, -14696304, -160524, -32532766, 30150670, -24210730, 9694278, -37431712, -21786222, --48317308, 17022566, -23803246, -24321862, -21791590, -9997610, -2152852, 49192408, 15426449, 24754580, --8609799, -21960704, -30651034, 8977019, 360777, -47995184, -24179592, -85119808, -41544680, -30404610, --4114579, -35276176, -28342490, -12128451, -50575388, 11518029, 17185238, -43621300, 23469312, 4661650, --13267691, 2541010, -13025562, -1192390, 8513699, 12773770, 21306260, -25968446, 1554778, 30412664, --4424890, -14030584, 25957708, -11490111, 653909, -15544024, -7852274, -31461710, 6932614, 1465658, -16594143, -11867532, -274341, 23406498, -12381317, 1343788, 21416854, -44537736, 1032940, -51033876, --18667002, -33681672, 25763362, 11308112, -4350265, 13276818, -12686797, 14477798, 32920924, 11384885, -52384644, -28727426, -38147900, 34628712, 5750961, -21494164, -25661356, -6600828, 16845936, -16812112, --4509179, -13924284, -25878788, 16092706, 11700028, -28991030, -23645406, 31950262, -5626407, 14265734, --11708618, 20253456, 549219, 33840584, -23523536, -5762773, -941672, 14271103, -17768816, -19808390, --33610268, -68267432, -33965676, -12776454, 30289720, 39353712, -74512848, 13173738, -29392072, -40307196, --7985955, 47108812, 30302604, 25795574, -15786689, -17814450, -21217138, 23867134, 17050484, 36695128, -5146445, -47156056, -18161806, 35827008, -5063767, 10655277, 32313724, -15047418, -21659520, -34455840, --34266324, 408559, 23065048, 49016852, 36618356, 24154896, 10288057, -49778136, -52737904, 18782428, --36223216, 8842801, 47403556, 18820010, 3703336, -23498840, -41911364, -7113003, -17741436, 14406931, -11656541, 8118562, 29978334, -4428112, -5089536, 7880191, 21951040, 34743600, 36472864, 12302397, -32568200, 10880226, 12138651, -6876243, -35048008, -13889387, -14788646, -29164976, 22798224, 20768852, -16071768, 15403363, -6103686, -35037268, 6367826, 10772315, 22659174, -58883464, -119946624, -61222612, -13183402, 48826260, 116933704, 114446384, 48501992, 49521508, 35940824, 3310883, -56119652, -96050504, --145488800, -42412264, -60047936, -9261560, 61351996, 108294376, 91242288, 80778672, 45124000, 457414, --26587458, -36093832, -6642704, -63561220, -50235548, -47605956, -30758946, -24950538, -10870025, -883690, -23743116, 54107460, 55613920, 54740968, 40393092, 52207476, 28286654, 30449708, -8179229, -746787, --22662932, -61596812, -89894736, -108844672, -52094732, -20172388, 18412524, -1558536, 12882754, 26862336, -34716756, 72668160, 83598320, 110351128, 70810592, 8066486, 32920924, -15590194, -59322088, -52022792, --104138464, -122025392, -90854664, -56443924, -23813984, -19519016, 44277356, 48636208, 137714912, 110370456, -80819472, 74236896, 30403000, -27915676, -35465156, -21523692, 0, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ -9789841, --1864016, 2947421, -306553, 3818763, 4725538, 3293166, 5990406, -3674882, 6475200, -2181307, -875636, -6014028, 281320, -6265821, 1365263, 1100049, 522375, 174483, 2330020, -3340948, --3968013, 3262028, -300111, 2494839, 1482838, -551366, -2729989, 521839, 4961761, 3034931, -1607928, 1927367, 1483911, 545998, 1794760, -394063, 240518, -393526, 5630166, -1161252, -2926483, -2091112, 2488934, 6615860, -1755031, 6193343, 947577, -2611877, 1844689, 2766496, --891743, -1075352, 175020, 4693326, -1481764, 1498407, -869731, 2983929, 1248762, 4070019, --1354525, -280784, 1573569, -1611687, -3324305, 630823, -1086627, -423054, -1306744, 2673617, -426276, 1686848, -788127, 3610457, 1846299, -4569845, -7105487, -5182952, 1995012, -814970, --12140262, -6931541, -526134, 1693291, -3725884, 1229971, -4490925, 826781, -3235721, 8457864, --6913287, -3111704, -3018288, 5356898, 3788161, 8596377, 2335389, 1721745, -3911642, 4005057, -583042, 1017370, -415001, 3186329, 4577899, 233002, 4570919, 4151086, -1979443, 2268280, --2431488, -2942053, 426812, -2431488, 1563368, -3749507, -6425271, 1632625, 2480344, -1768453, -1975148, -3277060, 3113851, 3868155, -6749004, 1193464, -194884, 2441152, 2428267, 194347, --6616934, -2224256, -2770254, 2085744, 170725, 500364, -1921998, 1073742, -3210488, -28991, -4124779, 2224256, 610422, -2153926, 1649804, -5806259, -2698850, -4330401, 1250372, 468151, -274341, -13818520, -255014, 932545, 387621, 2494302, -4759361, 3826816, 2222646, -2398739, --8167417, 5690295, 5812165, -1125281, 4865661, 3586298, -4450660, 9401147, 2091112, -3955128, -5116917, 565862, 4791573, 891206, -7838316, 3259880, -1347546, -2746632, -2940442, -2210835, -5414343, 4290673, 498216, 4482335, 1708323, -3788161, -4809290, -217433, -994822, 2383170, -1625108, -3669513, 1104344, 2289218, 2097018, -3186329, -2714419, -4299263, -1427003, -870268, -1090385, -842887, 6300180, 2902861, -767189, -2812130, 1332514, 2848100, 1509681, 6900939, --904628, 3641596, -190589, -1832877, -3795677, 3173981, -687732, -1488743, 4096862, -801548, -1532230, -443992, -541703, -3992172, 1241782, -758599, 5433671, 6923488, -1174137, -2627983, --4140885, -9513353, -5695664, -2055679, 6832219, 898722, 1264331, 4209605, 1113470, 1830193, --10000831, -9133785, -5863704, -1500017, -64961, 4263292, -3027952, 3349001, -1748589, -6111739, -1883880, -849330, -4262218, -9127, 5866389, 8665633, 3847754, -3865471, 2253784, 355945, -6140193, 60666, -4996658, -70867, -2945811, 6203544, 2596845, 2976949, 6097243, -937377, -375273, 8422431, 7157026, -117575, -117575, 738198, -546535, 2388539, 513785, -5830955, --8108899, -2604361, -1120450, 270583, -2763812, -8657043, -1063541, 2772402, -4984310, -2040646, --3295851, -2334852, 810138, 1562294, 2800856, -5746666, -5134634, 5349919, -2197413, -434329, -809064, 434329, 2928094, -4901632, 12635794, -5000416, -3981972, -731755, 112206, -4879083, --62277, -3449933, 6026376, -1617055, -7683697, -10677289, -2813741, -7115687, 9643812, 667331, -6815040, 5699959, -9341554, -649077, 3779034, 2673617, 4812511, 779537, -694711, -976568, -2204392, -3204583, 3428995, 1804423, -3396782, 1890859, 48855, 2229088, 5197448, -3017752, -2002529, -498753, 2924336, 2440615, -1189706, 3421478, -1123671, 2949032, -2495376, 2668785, --7595650, -3367254, -2845953, 1915019, 6358699, -4951561, -3259880, -1957431, 273804, -2381023, --2992519, -1733019, 2493229, 1905355, 3612068, -1465121, 1996623, -2430952, -2466385, -442919, --1544041, 2371359, -187368, -4114042, 2041720, -2450279, -4008278, -1512365, -2538326, 1838783, --2742337, 1909113, 3089692, -1550483, 4817343, -8179765, 3308199, -4989679, -5470715, 7422777, -2619393, -9302362, 708670, -194884, 2496450, -6768332, -4400731, -824634, -5507222, -9880572, --9545565, -6409165, -9526237, 3732327, -1195612, 1145683, 4811437, -8435316, 5157719, -2580739, -2296734, 1382980, -1052804, 562641, -1401770, -1460826, -5543192, -3481071, 6736120, -2863133, --6002754, -5627481, -735513, -2702608, 1950989, -5408438, -8093329, 876173, 7108171, -1454920, -4225174, -2885681, 2207613, -4300873, 2775086, 840203, -5593121, 7515656, 1204202, -2088428, -1647120, 6831683, 6518687, 3051574, -908922, -8638253, -1549410, -7334194, 1787243, -2115272, -993748, 455803, 1797981, -7000260, -52613, -1541356, 3178813, 4478041, -9588514, -9213779, --6179921, -10092636, -11841225, -11330124, 3996467, 4395362, -7472706, -2415919, -6814503, -10807211, -4922033, -3272228, -9409736, 2449205, -1146219, -149250, 361851, 2406256, 452582, -927713, -1752347, 2455111, -5625334, -5514738, -1843615, -6592238, -943819, -6988986, -11534672, -1501091, -6158446, -8607651, -6624987, 3690988, -4714801, -136365, 1194538, -4750234, -3813931, -4127464, --12366821, -5790153, 2057826, -4044786, -4424890, -8134668, 2852932, 6025839, -2902324, 9646497, --6189048, -3342558, -534187, -3139084, -9194988, -1264868, 1501628, -936303, -2332167, -8244727, --1760937, 6844031, 3249143, 1576790, 3335042, 2154463, -2551748, 13700946, -5138392, -6152004, --6036577, -6934225, 1567663, 7526930, 16297790, 11161009, -212601, 10201621, -539555, 1688459, -2217277, -5227512, 9404905, 300648, 8348880, 7867307, -5858873, 10147397, 516470, -7446400, --12170864, 11599633, 5941551, 11509975, -9138617, 6650220, 3958349, -10409390, -9950902, -6065568, --2507724, 11031623, -9993852, 9296457, -431644, -1010928, 7143068, 6292127, 9056475, 3137474, --4179540, 4151623, 8568997, -4933844, 8581345, 12167105, 5750425, 7333120, 3644817, 1981054, -2659659, 174483, -6078990, 2299955, 1279900, 302795, 6236293, -4180614, 3986804, 3515968, --975494, 10423886, -5598490, -4096862, -1726577, 8913668, -972810, 7278896, 4582730, 4780299, -5376762, 497142, -12262132, -2441689, -9635759, -6100464, 14470282, 6711424, -5043902, -507343, --14057965, 8912057, 8549669, 25281788, 1002875, 2214056, -1260036, -3434363, -1647120, 8576513, -7783555, 6819871, 9812927, 4021700, 15495705, 4579509, -6158446, 1526324, 13496398, 5382668, -1349157, 2146947, -6976638, -9949829, 6380174, -4916664, -9826885, -20691004, -366146, 8303246, --673236, 4918812, -7225746, -3749507, -2728915, 1603097, -2321430, -6164889, -3083787, -16650514, --4409858, -14125611, 1146756, -7423314, 5647882, -8086887, 3047816, -7775502, -2763275, -454730, -191663, 1240172, 1544578, -10329933, 4972499, -1544578, 2268280, -5406827, 127238, 8257075, -3323768, 11397769, 6409702, -3539053, -647466, -2437394, -1112933, -2801929, -3553012, -350040, -4812511, 2797634, 3648575, 1912334, -16167331, 10358387, 27681064, 10270341, -4088272, 13901735, --8370892, 9832791, 6700149, -12359305, 3197603, -15665893, 795643, -5023501, -10881837, 6526740, -676457, 5102421, 7129646, 8711804, 13728863, 5988258, -463320, -2965675, -8542690, -15796353, -6252399, 6827388, 2254858, -5213554, 9276592, 1608465, 9776956, 5983963, -16454020, -5971615, -2788508, -12009265, 1152662, -426812, -1854889, 4143033, 3275986, -2467459, 13027710, -6747394, -1029182, 7487202, -5620502, 5295695, -2141041, -7095823, 5641440, 428960, -411780, 7697119, -5345087, 769873, -3147674, 15416248, 1272921, 8904004, 1467805, -4114042, -4526359, -11953431, --4163971, 5775658, 360240, 5027796, -691490, -9141838, 4653060, 3834869, -13462038, 4785131, -8238821, -3202435, -27837830, -8932458, 29995514, 8675834, 5144834, -3969087, -381715, -4052839, -6431177, -9055402, 13313325, 7907035, 6438156, 6750615, -4210142, 87510, -177704, 4702989, -9040906, -12530030, -7438884, -3611531, 10262287, 4174171, 5850819, 6565395, -1075889, -8776766, -3351148, 1353989, 18316962, 14845018, 3979287, 11440719, 816581, -4539244, 2447058, -813359, --2285996, 7652021, 8725226, 7753490, 17624936, 9172976, 6986301, 8427800, -7815767, -12206297, --6003828, 6718403, -11011222, -4648765, 10790568, 12331925, 6292664, -4296578, 10118406, -3064459, -1034550, 3412352, 5717139, -1946694, -6496675, 4740034, -5930276, -16704202, 494458, 7112466, --10124849, 2765422, -2224793, -788663, -2391760, -3629784, 13734232, 1529545, 6779606, 14075682, -22425098, -34235184, -5238787, 1489280, -707059, -4581120, -8845485, 8682813, -11215770, -17728014, --2149094, 16171089, -2786897, -10396505, 2740726, -14321032, -7798050, -86973, 8462159, -15013595, -1278827, 15012521, 15787763, -263604, 5418101, 13353590, -8293582, -13269838, -17785460, 966905, --17707614, -4490389, 7174206, 6153615, -15646029, -15399068, -9019968, 5475547, -4226248, -3565897, --4148939, 13093745, -20786568, -6951942, 3207804, -12095165, -3838090, -905701, -13022341, -369367, -5484137, -1725503, 17302812, -2215130, -6736120, 355409, -593779, -6786049, 3638911, 7222525, --7372848, 10741713, -5403606, -23796266, 1724966, -10260677, -3959423, -2310693, -1334661, -31500900, --3579318, 11191074, 13600551, 4996658, 20577726, 12120398, -1787780, -32168232, 9126269, -5924371, -11128260, -10261214, 32749, 16921634, -5491116, 24007256, 5677410, 4637491, -10132365, 4536559, -12070469, -7337952, -1292248, 15472620, 10197863, 11620571, 1866163, -17993766, 11623792, -11661373, --847719, -7084549, 2017561, -9037148, 5434744, -2472291, 5310727, 4639102, 8840653, 8500814, -9921374, -11662984, 3010772, 18025440, 4184372, -3557844, -3376918, -9483288, -7108708, -377957, -969589, 2915209, 15670725, 914828, 8777303, 7770133, -285615, -4412542, -3451543, 13411572, --16014322, -4139275, -14149770, -12532178, -3081102, -613643, -23958938, 5506148, -7394860, 13957570, --2891050, -303869, 10418517, 1054415, 24920474, 19362250, 29589640, 9918153, 1138166, -4804995, --3313567, -6249715, -8935143, 13275744, -3216394, -2234457, 30227980, -5570573, -6044630, 33627448, -11811, 19396610, 14350559, 1709397, 8250632, -3821984, 6560563, 6369974, 4086662, 5305359, -15711527, -9865540, 18836116, -9454297, 108985, 4474282, -2073932, -12626667, -11516955, 388695, --18956376, -5419175, -20751134, -668404, -12173011, -8582955, -6494528, -5195837, 3534758, -16133508, -20118164, 4006668, -12447889, -8629126, -237297, -1499481, -2769180, 6133750, 3082713, 20486458, -2601677, 906238, -9541270, 2821257, 4405026, 523986, -10188199, -3256659, 12585865, 14697378, --367220, -9770514, 5058935, -589484, 17801028, 21073258, -7020124, -3042448, -2988760, 4364224, --6749541, 10266582, -23224498, 619549, 29392072, -22103512, -11228118, -1165547, -3198677, 2415919, --16920024, -9085466, -2333241, 13786308, 16502875, 11463805, -9907953, -25944824, 45978700, 11891154, --28284508, -28309204, -3962644, 7378754, 19766514, -24566676, -4084514, 5097590, -40802, -3159485, -26458610, 6048925, -15044197, 8638253, 1376000, -287763, 14053133, -2061584, 7802345, -16587164, --5503464, 30401390, 11322071, 24074366, 7701950, 21813066, 3972308, -7373922, 15239618, 14151917, -21660594, 11034308, -24011552, -8705362, 5430450, 12999255, -9548249, 4177930, -9206799, -15169288, -1735167, -1315871, -9231495, 7784628, 10269267, 9315247, 6542846, 6553047, -4525822, 16731045, --52076, -15565498, -11630235, 15131707, 7952132, -24707874, 11038603, 5112085, 8170102, -21409338, --15050639, 15016279, 22067006, 13430363, -4471061, 11529840, 21931176, 8823473, 23131084, 4371740, -10983842, 8269960, 38117836, 51502564, 4686346, 10755135, -31692026, -9749576, 20336670, -15981573, -39298412, -7152731, 6837588, 10888816, 23353348, 13012140, -4589710, -15884937, -18369038, -5870147, --2335925, -23601920, -10562935, -9143449, 16273094, -8540542, 5455146, -15031312, 2929705, -5693516, --21607980, 23730768, 17121350, 19151796, 9208947, -11172284, -10184441, -25901338, 1428614, -23343148, --6212670, -1779190, 4081830, 12281996, 10506027, -7492571, -4446365, 10143639, 23106388, 6035503, -9451612, 16192027, -19569482, 14576045, -10695005, -10849624, -19796042, -9218074, 10429254, 7825968, -2203318, 23970212, -4523675, -9447317, 4367445, 5718749, 33757908, -11894375, 13349832, 11720966, -31660352, -7801808, 4412005, -14493904, -4347044, -19238232, 14842870, -27574764, 979253, -22238804, -4073240, 9236327, 3126736, -13379360, 44891000, -3360275, -6396817, 3925600, -26050588, 1304060, --17718888, 430570, 4536559, -5372467, -951335, 10488310, -9815611, 255014, 13297219, 970663, -3067144, -22277458, 2412698, -2010582, -1798518, -5742908, -27890980, -15416248, 6342056, 2114735, -11734924, -31947040, 2998424, -29739964, 14531485, -20321638, -32807644, 16239271, 29276108, 5015448, -14124537, -22432078, 21553220, -5595269, 2741263, -13799193, 17831630, 7305740, 18523658, 5900748, -22587234, -21092048, 3400540, 1095754, -4221953, -16681653, -14207752, -15614890, 17149804, -4572530, -23552526, -14610942, -12058658, 3615826, 2799782, -11038603, 6558952, -53259740, 6030671, -17324824, -48413944, -9654013, -25128780, 9352828, -1867237, -25047176, -4661650, 3629247, -15258408, 36426692, -4782983, 3070902, 16284905, -21218212, -32391570, -20156282, 44565116, -4071092, -10040560, 29272886, -16312286, -14677514, -14583561, -8440148, 35223564, 4510790, -9196062, -14462229, -7231115, -28392956, -18322330, -3759170, 7129646, 17425220, -6844031, -29404956, -4041027, 36719824, -2105608, -9826885, -17440788, -8702141, 21762600, 14071387, -2408940, -28087476, -14545980, -4348118, -26001732, -15534897, --15203647, 1398549, -4023848, 20896090, -15491410, -5816997, -618475, 54651312, 18695992, -10186589, -10666551, 5828808, -3777424, 27360016, 13135084, -11391864, 3901978, 21880174, 25203942, -16586090, --11462731, -38712152, -29777546, -979253, -4214437, -4119411, -58133992, 22054120, -11239929, 33332168, -33819108, -17126182, 16775605, -30355756, -46455440, 2787971, -32216550, 6069326, -2691334, 27758910, --17847736, 20297478, 17528298, 27876486, -38317552, 6062883, -22840100, -20624970, 3993246, -27103928, --17034378, 27998354, -6045704, 11776800, 32220844, -4207458, 11719892, -23313082, 4569309, -25858388, -27469000, -21058224, -13573707, -14975477, 30511448, 25128780, -14698452, 33652680, 22713934, -4450660, -33166274, 543313, -31118648, -6775848, -1870458, -23321672, 7912404, -51982528, 7669201, -11207717, --23874650, -18341658, 26803818, -11615202, 53118008, 40682468, -53755272, 3352759, 1502165, 6294275, -29391534, -40465572, -27284854, 34830036, -21218750, -26896696, -31493384, 8230231, 81992536, -6060199, --17694728, -16972638, 7233799, 28412282, -30907122, 15931644, -52130164, -7668664, -20045150, -17603998, -28193240, -35678832, -55521044, 32863480, 49682572, 12096775, -9059160, -44558676, 3542811, 17645336, -18038862, -7369627, -17360258, 2356863, -3828427, -5754720, 6328635, -6504191, -14344117, -29212756, -4420058, -17564268, 5118528, -15755014, -32596654, 20777978, 16119549, 25525528, 1803349, 27588722, -16428787, 4132832, -7912941, -14139569, -21880710, -16458852, -8050916, 6453725, 17150878, -10728828, --3787624, -38180112, 37249716, 42179800, 25218974, -21753472, 24427626, -29679298, 1557463, 6523519, --62179852, 4954782, 8941048, 30073898, -35570384, 49158048, 22827214, -36159868, -16223702, 14163728, --1440962, -27154930, -25900800, -36109400, -38504920, -5172751, -49177912, -6669011, 17754322, -23162222, --21577916, 20136418, 20426328, 4051228, -19499152, -66521528, -9871445, 12862353, 7810398, 28667832, --734976, 16610786, -4431333, -552440, -8454643, 1108102, 17488034, 1892470, 632971, 16937204, --4639639, -4264903, -22523346, -2219424, -3679713, -2666638, 3799972, 13468481, 18561238, -3816079, --38118, 14439143, -3338263, -28310814, -1954747, -25158844, 3631395, 3218541, -32743756, 23557896, --45100376, 9899900, 12468827, -20008642, -1320166, 58289684, -16466368, 19506130, -12221329, 10184978, --43658344, 4428112, 25878788, -1020055, 22419192, -5530308, 2660732, -1863479, 28745142, -18721762, --21294984, 24480776, -22442814, -29431800, 638876, -46790984, 31940062, 23889682, -6993818, 7487202, -8075076, -4494684, -25497610, -74591232, -35720708, -12721693, 22726820, 52801792, -50736984, 9583146, --15559593, -51158428, -8215736, 43624520, 10848551, 35720168, -32413044, 8044474, -12016245, 951872, -20599736, 2462090, 10644003, -8288750, -64826088, 17639968, 1925756, -28229210, 26532698, 19948512, --20420422, 18351322, 1163399, -21932250, 5169530, -14011794, 38614440, 3679713, 14941654, -428423, --41996728, -33891588, -12184822, -25417080, 25406342, 36992552, 38085624, 30415884, -12087112, 3246459, --33237678, -5989332, -4378719, -14641544, -18056580, 1608465, 1954210, -45197552, -14058502, -18317498, --2353105, 18705120, -22837952, -6012418, 6490233, -903554, 21563420, -26024818, -2161979, -29253560, --16116865, -21652004, 10449655, 7279433, 21481278, -2794413, -3708704, -25053082, -10319733, 20130512, --29841970, -120640800, -63213864, 14271639, 52133388, 115727896, 88446264, 50498076, 17467632, 26938572, --7336341, -46941844, -92414808, -122707752, -30617212, -34617436, 2576981, 61747136, 86816320, 59153512, -77815144, 19196894, 16952236, -7561827, -38495792, -42719892, -35253092, -36458904, -46524160, -36095444, --15691126, -797253, -209380, 31784368, 39398808, 76432168, 35572528, 13379897, 30887258, 49488760, -15350213, 10948409, -38395932, -50771884, -86069000, -37834368, -45210436, -30672508, -19592030, -13209709, -6142340, 12723841, 35863512, 76292576, 59180356, 67311264, 47605956, 61343944, 43209520, -33127082, --33443836, -79582520, -64638720, -43979928, -105840344, -78230680, -51138564, 6545530, 61172144, 62970128, -68470368, 91634200, 72222024, 42875584, 42804716, -396748, -32700270, -33023466, -18997714, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, -{ -8451959, --1050656, 4005057, -1381906, -127775, 7632694, -4049081, -380105, 2151242, -797790, 2536178, -2909304, -6616397, 2668785, 2490544, 1421634, -319438, -2156074, 4530117, -5764920, -4878546, --1060857, 125628, 2349347, -4952098, -3628174, -526670, -3215320, 5291400, 282394, -2252174, -4214974, -3853660, 467615, -863288, -2269890, -351114, 3287798, 3337190, 1994476, 5168457, -4294431, -389768, 1335198, -2173254, 5496485, 3415573, -2423972, 563178, 770947, 543313, --3294240, 2905546, 1016834, -513249, 5833640, -3114925, -3484829, -482110, 1784022, 363998, --705985, -2178085, -1389422, 1809792, -1567663, -386547, -1182727, 1895691, -774705, 4364761, -2157684, -2896419, -1624571, 2457795, -2684355, -1497333, -2153389, -4194036, 2537789, 4019553, -7099581, 1950452, -4884989, -8747775, 1969779, -4063039, 412317, 2805688, 1138166, 7159711, --5819681, -1408212, -732829, -426276, -4983236, 3151969, 1389959, 687732, 209917, -2430952, --1822677, -1751810, -498753, 281857, 1270237, -1828046, 2793339, 6403796, -118648, 2862059, --4430259, -2592550, -5316633, -2579665, 5836861, 303332, -1075352, 1049046, 6192269, 684510, -3167539, -743029, -2752000, -869731, 3588982, -2962454, 5573794, 3388192, 6274947, 3065533, -517007, -1855426, -3948686, -2231773, -3409130, -514859, -2442763, 1059783, 382789, -1352915, -1067299, -1148904, 2379949, -489626, -412317, 3190624, -94489, -110595, 659814, -2837900, -1650341, -12275553, -2781528, 5029407, 882079, 6856916, 3661460, -5656472, 1491964, -131533, -2252174, -2033130, -9417790, 5428839, 3339874, 6220724, 7799661, 6694244, 2362232, 75162, --9587978, -1006633, 4423280, -4395899, -3781182, -10044855, -653909, -1698123, -1137630, -2573759, -1212791, -6007586, 2757369, -1073742, 2564096, 719944, -3988951, 3078418, 2629594, 6925635, --767189, -5599027, -2830384, 2984466, 1263794, -1425392, 345208, 2186675, 351650, -4103305, -31139, 822486, -357019, 222265, -2484102, -1162862, -3326989, -741956, 4316442, 1467268, --1322313, 1760400, -415001, -256087, 789737, -4925791, -275952, -280247, 2936684, 5255966, --1321239, -565325, -3110630, -2667712, 1753957, 6010270, -4706211, -855235, 445603, -411780, --1437740, 1032940, -1431298, 6769942, 2534031, 2275796, -2288681, 160524, 627602, 631897, --11664594, -6321118, -536334, -2917894, -3614215, -197032, -3041911, -11877732, 7065758, 1609539, -3198677, -1263794, 2435783, -3150359, 153545, 412854, 6117107, -2185602, -1278827, -1032940, --1022202, -987306, -418222, 6614787, -1264868, -105227, -3751654, -215822, -1796907, 2150705, -1117228, -6416145, 5007932, -6491306, -87510, 5702106, -774705, 223338, 479426, -117575, --3929358, -2809446, 6595459, 3805341, -8042863, -4301410, 1349157, -4721780, -3380676, 3513283, --5754720, 1187022, 1494649, 3398930, 7050726, 5413270, 3351685, 2581275, -4668093, -4852240, --4183835, 1473711, 6044093, 2384781, 8946954, -2146410, -2235531, -2638721, 2557653, -2959769, -4405026, -8425652, -1030255, 6290517, 3337727, -6336688, 4762582, 7734699, 7349226, 4658966, -959388, -279710, -4691715, -6136972, 2683281, -586800, 6240051, -482110, 3769371, -3839701, --2462627, -2063732, 706522, 1955284, -246424, -7512435, 1691143, 2587181, 2001992, 3220152, -2105608, -4089346, -9898289, -3248069, 1603633, 1911797, 615254, -454193, 2054068, -4140349, -93416, -7499013, 3662533, -7738458, -1850594, -3300682, -4878009, 3666828, 1843615, 1533840, --4206384, -2190433, -1064078, -4479114, 678605, -415001, 2654290, -1942399, -3433290, -2892124, --8534100, 2782065, 1405528, 3776350, 6047314, 7145215, 3297998, -2857227, -3630858, -2007360, -4552666, 4534412, 4194573, -631897, 2991445, -8531953, 1096290, -4032438, 534723, 1363652, --5331128, 2057826, 15927349, 1814624, -1316944, -8835821, 12838194, 56371, 5441187, 719944, --181462, -6844568, 6817187, 1816771, -3635690, 970663, 595390, -2675765, 2808909, 7189776, --1977296, 7641284, -2145873, 3325379, -31139, 5076115, 4510790, 5058398, 145492, -2594697, -3974992, -2736431, 3513820, -865973, 3543348, 3468723, 3310346, -296353, -886911, 1414655, --2684355, -3898757, -10197326, 6874095, -6550899, 4808216, 712965, 2120103, -1076963, -12121471, --2528662, -3134789, -5843303, 1015223, 3883724, -7672422, -2321430, 3814468, 858457, 5873905, -9985262, 76236, -2349884, -1908039, -9756555, 3675955, 2516851, -1219234, -4633196, -5568962, --663036, 2785286, -1874753, -2760053, -4093104, 1017370, 7065758, 3090229, 1000191, -16507170, --7645042, -2420751, 3218004, -2093260, 5408438, 18541374, 5682779, -6998113, 941135, -8254391, --2753611, 5548561, -6582575, -1780264, 8215199, 1871532, -2201171, 1045288, 4601521, -2974802, -2178085, 2336999, 2343442, -4777614, 2020245, -2312303, -2742874, -6992744, -2754148, -4148939, --7710540, 3191161, 190589, -667867, 7639136, 5475010, 1920387, 6031745, -6979, -7991861, -6565932, -907849, -5384279, -4397510, -7793755, 183073, 9400610, 462783, -4092030, 3800509, --6921877, -4574140, 3715684, -5869610, -7386270, -4189204, -2180233, 3973919, -6387153, -2373506, --2731599, 8142721, 1757179, -3579318, 5452998, 3866008, -10851235, 9821516, -4022237, 670015, --4861903, 8362838, -1437203, -6085432, -19165754, -2807835, 9640054, 2152852, -14972793, 6448357, --194347, -3323231, -4916127, -4143570, -1627793, -9100499, -1641751, 6793028, 9105868, 10692858, -6546604, 9715753, -3420405, 7576859, 3693672, -15954193, -476205, 3716221, 5448703, 2349347, --5467494, -56371, -1195075, 5140002, -9415642, -3744675, 6915971, -2685428, 3886946, 1656247, --6242198, -7333657, -3564823, -10797011, -2922188, -3620658, 4314295, 1097901, -5923834, -1843615, --12713103, -3715147, 5369783, -4252555, -12497818, -722628, 7401303, -15935939, 4705674, 1946694, -5178657, -7955353, -3044595, -7675644, 930934, -2953864, -7409356, -3148211, -882616, 3207267, --11293617, 3095061, 9923522, 12612708, 9561134, 9700184, 4088272, -5977521, 7006703, 11660299, --16084116, 8756901, 8888435, -17399450, -4107599, 4776004, 19784230, -1107565, -629213, -4195646, --4774393, 24132348, 12403329, 3666292, 3609920, 12676059, 428960, -1533840, -3935801, 2173790, --9998147, -9327595, -1494112, 3298535, 7879655, 3546032, 2373506, -3351685, 1465658, -7567733, -4063576, -11361799, 12219182, -1018981, -4824322, -6441377, -6746857, -11500312, 2943663, -11137924, --2867965, 8001524, -821413, -3698504, -2706366, -1642288, -8634495, -6590091, -3247532, -3998615, --1030255, 3692598, 3245922, 689879, 1843078, -8511015, 16184511, 8535174, 1707786, -1082332, -21042118, -2384244, -1640141, -4872641, -8039105, -2890513, 21776558, 7364795, 4509179, 10518375, --12122545, -7321309, 6726456, 7198365, 16112033, 2256469, 4387846, -11032697, -775778, 5312875, --14499810, -4711043, 5604933, -4875862, 28991, 3848291, 10455561, -3678640, 3983045, 2097018, -2162516, 8988830, 7713225, 9586367, -7794292, -5158793, 10268193, -13349295, -4617090, -4474282, --1107028, -3665755, -8712878, 8186745, -533113, -9229885, 185757, -3682398, -9801115, -11962021, --6883759, -7202660, 13765907, -4553739, -3872450, -8405251, -1001801, -4322348, 1846836, 16479790, --3448322, -5513128, 2458332, -1083942, 9176198, -11203422, 18369576, 3643206, -18497350, -13269301, -4301947, -12315819, -298500, -13200045, -482110, 2571075, -2263448, 13807246, 16957068, -8705362, -1364189, -3905736, -17972290, 8464307, 40892920, -5654862, 764504, -16159814, -6083285, 12994960, --486942, 23966992, 14901389, 13842143, 1325534, 10960757, -17379048, 18161806, 10033044, 2024003, -3473555, -9572945, 5958731, 1067836, 18548890, 10868952, 12795244, -2949032, 2418067, 4247723, --10295037, -8112657, -2943126, 6557878, 21483964, -4321274, -5451387, -5586142, -2470680, 3904125, --11425150, -2422899, 559956, -5547487, -12132209, -1541356, -15749645, -4913980, 11607686, -10603201, --3712999, -975494, 2513630, -17981418, -10101226, -1094143, -394063, -2234994, 13909788, 6881612, -2549063, 8923868, 14392972, -6155225, -1342177, -8916352, 6764574, -6585796, 9126806, 9956808, -11922829, 19704774, 7303592, -11287174, 213138, 32093606, 12188580, 19475530, 10287520, 20185810, -22172768, -22948010, 5315559, 16283295, 9824738, -6668474, -12236362, -10801306, 23211078, 1512902, -8652748, 11831024, -7102266, 3002719, 5035313, -14792404, -15279346, 11843909, 4149475, -22681186, --5138929, 28200756, 13791677, -664646, -16399796, 4744328, 4357781, 16821776, 5848135, -9246528, -11541651, 1273995, -4706748, -2457795, -3324305, -14489072, -6287832, 1206349, 2550137, -17229798, --17365626, -11398306, -4794257, -20397336, 11785927, -2318209, -13426605, 1444183, 681826, -7215008, --1272384, 2819646, 323196, 2945811, 5553393, 6265821, -7125888, -10730976, 12575127, 22536230, -11650636, 4691715, 18444200, -5475547, 10443213, 21259552, 15316390, -460098, 3595425, -10480257, --13404593, 10415296, -12586939, 1658931, -4197794, -1895691, -4649839, -21268142, 5929739, -10270341, --4752382, -7945690, -1364726, 18147310, 17976048, -36458368, 11241540, 11529303, -11344619, -18562312, --24189256, 4232691, -7125351, 4444218, -8458938, -6662031, -3947075, 22521734, 5688148, -1988570, --408559, -3615289, -6758131, 5682242, 3735548, -124017, 9033390, 1950452, -1916629, 3209951, -8205535, 23262080, 2340220, 2859375, -11494406, -4924717, -5433134, -5787469, -687195, -1930588, -7733089, 11145977, 561567, 12880607, -2945274, -2149094, -2581812, -1399623, -22490060, 25483114, -738734, 1855426, -1770600, -6548752, 6876780, -1665374, 10481331, 680752, -9687836, 2789581, -11186242, -7647726, 10467372, 2650532, -15173583, -2428267, -2822331, -27984934, -8971650, 7703024, -8301635, -10651519, -6985228, 17437030, 4248260, 4590783, -14682346, 8998493, -6522445, 8508330, --8665633, 11293080, -12411919, -10430865, 16063715, 937914, 3323231, -11413339, -23871428, -3415573, -5624260, 523986, 8753680, -9419400, 233539, -1400696, -18067316, -13594108, 4619774, -20579336, --13626321, 4780299, -929324, -21507048, -3883724, -11438572, 11824582, 6251325, 1318018, -6167036, --13597866, -28297928, 8459475, -13548474, 13677860, -6014565, -5881958, -4119411, -8086887, 2390149, -2864206, -23156854, -10424422, 19272592, 17464410, -20918638, 23771570, -680215, 17251274, -6419366, --5337034, -4459250, -8152385, 7175817, -8046085, -22422950, -11568494, 21100638, -6272800, -7649874, --2279554, 4160213, 3767223, 8360154, -28190018, 3748970, 17729624, 9107478, 12858058, 9977746, --9597104, -16441672, -13732621, -8100309, -15912317, -888521, 7692287, 17566954, -2911451, -859530, --29270202, 17590038, 22109954, -3520800, -11745662, -12174622, -7307350, 32969242, -19888920, -140123, --2127620, 8838506, -1211181, 37966976, 1220308, -20799990, -5134634, -19777250, 26030724, 22235046, --17656610, 20906828, 5662915, 16807280, 6757058, -31873490, 10426033, 16886200, -21505438, -6212670, --24432458, -12581033, 1437740, -23098334, -19010062, -651224, -15240691, -303332, 6298033, -5757941, --15010911, 12903692, 12557948, -25987774, -18966038, 10865730, 5531918, 7028177, 14197551, 17304424, --5206037, -9165460, 694174, -5791227, 1025960, -1545115, -7202124, 4018479, -34339336, 13113609, -19523310, -17299592, -12883828, 13928042, -8058970, 9393093, 21336860, 38994544, 60745868, 3099356, --22794466, -29632590, -6031745, 2560338, -6174016, 30230128, 22857280, 16339129, 26286810, 19640348, -15934866, 2375117, 13049184, -14072460, 22879290, 26559004, 2819109, 27588186, -9682467, 3581466, -7146289, -22963042, -15353971, -4323959, -13480829, -15631533, -1516124, 28389734, 634581, -3675418, -4328254, 7279433, -2690797, -34914328, -4066260, 11108396, -4476430, -9582609, 5377299, 15715285, -25884694, 7812009, 13579613, 19380504, 22611930, -28460064, -20162188, 13574781, -8055748, 40103184, --3314641, 34762928, -25971668, 17557826, 27453430, 2892124, 4893579, 18051748, -28616830, -11525545, -1158567, 18671296, 798864, 21272436, 8010651, 9459665, 19674172, 9458055, -2409477, -5590437, -42235636, 13817984, 14554034, 30732102, -2724620, 6260452, 13064754, 19662360, -22706956, -18105434, --8092792, -19811610, -3972845, -26506928, 12929999, 20733954, 14711337, 20607790, -14659260, -7982197, -15426986, 12321724, -9486509, 20953534, 11962021, -5000953, -26590680, 14223321, 14913200, -13249974, --2801393, 7437273, 2835752, -20915416, 23072028, 6338835, 24792698, 14001593, 9078487, -14050449, -10954851, -7478075, 38156488, -30973694, 2223719, 11830487, -7096360, -19996294, 11475616, 12492986, --3788698, 12291123, -13369159, 32006096, -16301012, 8416525, 5440650, -20369420, -10414759, -28129888, -10275709, 8144869, -22622130, 19390166, 14870787, -14604499, 10088341, -1765232, 30564062, 10329396, --18207440, -12315282, -13548474, 9660992, -8450348, 7858180, -4532264, -36711232, 17929878, -31152472, -34447784, 41177464, -1061931, 8111583, -31522912, 810138, -6211597, 4440996, 20010790, 20517058, --4682051, 11184095, 16815334, 3629247, 7677254, 5683316, 7592966, -2983929, 24030342, -2059974, -6286222, -11658689, 26914412, 6756521, -1347009, 316217, 24337970, 10082973, 12067247, 26895086, --4637491, -14694157, 32668594, -32347010, -13384192, -4601521, 8556112, 23443006, 6291590, -7881802, --8249022, -14943802, 806917, -1677185, 7606924, 36912560, 35777076, 23319524, 32403380, -1487669, -48206712, -14312979, 14326400, -9714142, 2354716, 16297790, -5976447, 3321620, -12820477, -16533477, -1640678, -9648107, 10990821, -13589277, 24669218, -15272904, -26581016, -9090835, -5506685, 600759, -35863512, -16127065, -2071248, 10774462, 9165997, -1466731, -14870251, 56870736, 79799952, 23205708, -61911416, -15641734, -45500884, -32698660, -22987738, 8834211, 10288594, -16600049, -25008520, 18555870, -26280368, 14107894, 26243324, 19163608, 3987340, 6322192, 2929168, -3563749, -19315542, 5743982, --22642530, 12808666, -1023276, -22470732, 22143778, 11625940, 10016401, 37681360, 23613194, -14151917, --8854075, -17184164, -18235358, -23813446, -9354976, -2068027, -17672180, -8162586, 33703144, 49585396, -37790344, 2076617, 25468620, 24894168, 42184096, 16276315, -23925652, -41263900, -24479166, -27828704, -13157632, 7897371, -52451752, -39490612, -10151155, 17193290, 45667312, -39780524, -2535641, -35471060, --5162014, 32793686, -22349936, 8513699, -31977106, -11441256, -10814728, 18580028, -30768072, -2827162, --6183679, -23607288, -45337136, 4906464, 24258512, -21239150, 37920268, -15906948, 14666776, -5639829, --45257144, -23310934, -2863670, -26685168, -60890824, -17318918, 20971788, 32964948, -17052094, -26159036, --54469312, -16335371, 15053860, -11021960, -16377784, -26999238, 5496485, -6315750, -5383205, -5267778, -9965935, 21346524, -17691508, 16488916, 13278428, -17103634, -49970332, 3905199, 2973728, 12598213, -4884452, 32061394, 2174864, -48663592, -781147, -53537304, -1395864, 18804978, 21263846, -3908420, -1720671, 25265682, -14360223, -9076340, -18197776, 16666084, 10265509, -7081864, 17659832, -5220533, -6402186, 9899363, 29651380, 5332739, -13194140, -32343788, -13838921, 19164144, 12700218, 28839632, -36204428, 70160976, 30447560, 19836306, -20942260, 3683471, -43650828, -13222057, 30419106, -14867029, --12541841, -3118146, -9807021, -34893924, -38969312, -56822416, -18020610, 292595, -4454955, 37504728, -10207527, 48947056, 29990146, 15338939, -6883759, -17726404, -3445101, 68624984, 4145180, 20021526, -10993506, -8220568, 33928632, -13816910, 27357332, -29587492, -3108483, -21172042, 25728464, -35945656, --7808788, 11657615, 11335492, 12257300, -31978716, 23266374, -36581312, 8058970, -17991082, -11521250, -36134096, 2908230, 2256469, 13308493, -13886166, 83215, 9367861, -43257836, 1094680, 11260867, --6518150, 29652992, -12815646, -4296041, 47886200, -16738024, -39893268, 1691143, -15042586, 5028870, --2957085, -20401, -31891206, 19564650, -5020280, -40658844, 26588532, -50195820, 11048803, -6836514, --19999516, -23545010, -19953344, -67781560, -69590816, -59609316, -30511984, 119918712, 36913632, -16234976, --16755741, -61025580, -127769912, -15463493, 33113660, 41325640, 17326434, -20732880, -15533823, -38619808, --42073500, 29683056, -30547418, 75022344, 56337088, -90324232, 27922656, 10347650, -19498614, 5549635, -63082332, 7756711, 43291124, 86062552, -19818052, -73271072, 2629057, -13713294, -67652712, -19745576, -31675920, -4460324, 39187820, 62776316, 5165772, -57321708, -109691856, -95320896, -84256520, -10429254, -80771152, 21488258, 21316996, 10518375, -22342420, -111145704, -68651832, -36815924, -13439490, 4904316, -24737938, 22167400, 30989800, 29719564, 39586712, -49110268, -16549046, -40630392, -2661806, -44309032, -27115740, 24116778, 54941760, 57648124, 30118996, -904628, -13580150, -11682848, -68886440, 15736223, --16117939, -128925792, -143614048, -99853696, -102725416, -32651952, 99187440, 64714420, 107572288, 121130424, -187188640, 122314760, 126241440, 79387640, -14328011, -103234904, -174217296, -203526160, -178469856, -141460656, --105233680, -30314952, -12814572, -20751672, -2947421, 35744328, 61795452, 90229208, 76147088, 108240696, -102761928, 136818336, 122899952, 30600032, 79841296, -25115896, 15991237, 11803107, -3085397, -17910550, --135643120, -158732320, -203862768, -235060336, -216877600, -121230280, -111196168, -89771792, -114315384, -127633008, --34331820, 25818122, 69330976, 109303696, 156022208, 192342592, 243605184, 328796928, 314514016, 242500288, -191211408, 164025872, 80542984, 138817632, -62445068, -111236968, -275958624, -305650816, -389216928, -362261696, --340122208, -306928576, -307014464, -165308992, -104239928, -2929705, 216135632, 169441824, 112524920, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ --6926172, -11555073, -3087008, 1925219, -3746822, 1478543, -8167954, 453119, -2434710, 2946885, -4432406, --3198677, -853088, 3000572, -613107, -497142, -1694365, -2312840, -5465883, -1149978, -4561792, --2443300, -3861176, 1732482, -814970, 300648, 1947768, 1156420, -2690797, 1243393, -944893, --223875, -1005022, -857383, -2404645, 176094, -4378719, 5513128, -1662689, -1314797, -850404, -348966, -37044, 655519, -5102421, 378494, 2211908, 176094, 957778, -111669, 1155346, -4165045, -1309965, 2567317, 2994666, -4387846, -1378685, -1044214, 4114042, -770410, 1263794, -4692252, 31675, -1297080, 1014149, 1377074, 1369558, 401579, 2407866, 30065, -733903, -1975685, -2028835, 630286, -108448, -3620121, 13587129, 1753957, -5662378, 2247879, -3496640, -1206349, -2197950, -1301375, -3015604, 2529199, 4195646, 1381906, 1464047, -7058779, 1660542, -361314, 2496987, 3016141, 1755031, 4423280, -656056, -2107218, 670015, 5242008, 258235, --3597572, -159451, 4499515, 2541547, 698469, 266825, 1439888, 115964, 567473, 1048509, -107374, -1299228, 64425, 258235, 1919850, -2276870, -5622112, 4548907, 4576288, 3996467, -3793530, 28991, 2186138, 3591130, -3304441, -596464, 164819, -4536023, 1330903, 542777, -4551592, 632971, 2670933, 252866, 5662915, 2908767, -513249, 3947612, 2572686, -1083942, --4116726, 1229971, 1442035, -1056025, 629213, -2418067, -350040, 2311229, 1873680, 1918777, -4709432, 11413876, -7476465, 2639258, 6470905, 1573569, 4592394, 5521181, -4842039, 1116155, --344671, 2192044, -6158983, -4904853, -812823, 4945655, 6727530, -2465311, -2064806, 3234110, --5237176, -7111929, -1191853, -8376260, 3027415, 2860448, 906775, -5183489, -5187247, 1954747, --2952790, 779000, 0, 5618354, 6034429, 5359046, -692564, 3773129, -5633924, 2586644, --3243774, -255014, 496069, 4599373, -4704063, -4287451, 235149, 6036577, 2670396, 2403571, --3397319, 2099165, 1705639, -1676111, -7225209, -1117765, -2286533, -3176128, -2697240, 3535295, --2874407, -885300, 1053341, 2273648, 5645198, -1879048, 173409, -3833795, -1646046, 1089848, --5275294, -32212, 1860795, 4240744, -886911, -2325725, -1169305, -4734665, -4351339, -7599945, --2158221, 890669, -2585034, -4025995, -2381023, -7583302, -4414690, 7270306, -652835, -3751117, -3702799, -6484864, -1745367, -7999914, -1928977, -6386617, -3485366, 6682969, 29528, -1820529, --8308614, -5356361, -2137283, -3804804, 1009854, -4636954, 77846, 2240362, 8111046, 3740380, -2832531, 3249680, 6503118, -6159520, -401579, -2141041, -4763656, 1402844, -1239098, -2157684, --4969277, 1978369, 4542465, 63351, -3872450, -2725694, 12145631, -413391, -3917010, -5471789, --7813620, -10461467, -1576253, -5675263, 864362, -1534914, 2450816, -23085, 1010391, -5145908, -344134, 157840, 5690832, 1415729, -4871567, -412854, -1774895, -2062121, -1470489, 1362578, -2801929, 2262374, -3474629, -17268990, 7063074, -2947421, 3074123, -7039452, -2752000, -5468030, --5017596, 537408, -1481764, -3348464, 9023189, 2499134, -686121, -5185100, -1569811, 2706366, --6040335, -3053722, -5749888, -3051038, 8612483, 1052804, 5779952, -309775, 59056, -1187559, -1717450, 1814087, -4393752, 308164, 1456531, 2798171, 9316858, -4549981, -5480915, -830539, -10290205, 3488050, 10943040, 1248762, 1095217, -1619203, 5452461, -624381, 7992934, -488016, --825171, -1096290, -3191698, 3690451, 1115618, -2476049, 2394444, 3327526, 5586142, -2807835, --171262, -612033, 4996658, -1614371, -703838, -1448478, -1120450, 1574106, -1457605, 971736, -983548, -787053, 1387274, -7691213, 979789, 5633924, 2081985, 7351911, 849867, 889058, -2204929, -3906810, -2015413, -255551, -8791261, -1617592, -89657, -4468377, -15423764, -3877819, --3457449, -6827388, -1462973, -1889786, 9388262, -3495030, 7062000, 3202435, 5050882, -9990094, --4565014, -10093173, -9364102, -190052, 1579474, 5584531, -2931852, -4515085, -2812130, -6885370, -1289027, 2868501, 3366718, 1979980, -2171106, 2317135, -4607963, 302258, -8199630, 2734284, --2209224, 926639, 1653562, 2837900, 3095598, -3257196, 5369, 7641284, -4300336, 3617973, -3867618, -426276, 2277943, 3681324, -1684164, 1355599, 3695283, 54224, 6592238, -3644817, --4704600, -2376191, 2108829, -147640, -8948564, -4621385, -9900973, -10807748, -1882269, 2820720, --8778913, 3847754, -1464584, -145492, -3031173, 3027952, -5224291, -524523, 4747013, -14382772, --854699, 4218732, 2621004, -7735773, -1073205, -5002563, 1085553, 1225676, 890132, -8453033, --11150809, -7740605, 1165547, -6241661, 6454799, 1835025, -10718091, 7413114, 6621229, 5057324, -4671851, -5541045, 8557722, 2004676, -138513, -3648575, 2855617, 4883915, -4799626, -7270843, -2533494, -2940442, -8669928, -1473711, -8357470, -3368328, 15079093, -4365835, -6784438, -8761733, -480499, 1015223, 6027987, 2021319, -5490042, 4647155, -592169, -4735202, -5681705, -6507949, -9379135, 3744138, 5957120, -4858682, -5949067, 2296734, 1638530, -6695317, -161598, -4293357, -6189048, -1635846, 737661, -7859790, 4938676, 3457986, -3939022, -3175055, -2318209, 7914014, -411243, 898185, -2101313, 5722507, -5661304, -7341173, -56371, 2162516, -1639604, -5806796, --8771934, -6955163, 7554848, 1138166, 9197672, 10964515, 10617159, 1865626, 14474577, 3711389, --1335198, 6878927, 5262946, 13447543, 2130841, 7863012, -10143639, 17382806, 12788265, 6381248, --4964446, -3801046, 6382859, 1735704, 4632659, -2226941, 7564511, -1886564, -1718524, 6937446, -5566815, -6431177, 4719632, -1492501, 7341173, 8102456, -15123654, -2509335, 9574556, 3148211, -5272609, 4343286, 9459665, -4209605, 3860639, 466541, -7750806, -3546569, -126702, 1912334, --11462194, -715112, 7347616, -5517423, 12275553, 9403831, -3695819, 90194, 2319819, 4755603, -7081328, -2658585, -2430952, 11623792, -2930242, -312459, 4744328, -26307, 6301791, 4745402, -1386738, 1766842, 30563524, -14653892, 3023657, 13133473, -327491, 1341640, 17048336, 18678812, -2943126, -430570, 4563940, 83215, 4833986, 6055367, -5683853, -1026497, 11294153, 10241886, --3532074, -7452305, -8241506, -8363912, -4278325, 8814347, -5221070, 4457103, 1188095, -9896678, -25770, -6205691, -117038, 4233227, 5559299, -13093208, -5927592, -10177999, -2769180, 18292266, -3211025, -368293, 2261300, -352724, 1583769, 6288906, 3707631, 9810779, 279173, 7677254, -4549981, -4652524, 4530117, -7732015, 1009854, -7736310, -8746701, 5017059, -9687836, 5866389, -670015, 6840809, 5054103, 5406827, -4741644, 8131447, -8603356, 1485522, -3431142, 274878, -12931073, 2257542, 7095286, 7820599, 95563, -282394, 6207302, -7898445, 6050535, -18308372, -2735894, 3687230, -12524662, 4799089, -613643, 11927124, -3831111, -7028177, 4810900, -16178068, --5823976, 12409771, 5270462, -8662949, -19620484, 7817378, -3106872, 3952444, -12651900, -16958678, --11405823, 13249437, 757525, 6942815, -1722819, -8239358, -11377368, 4363150, -3280281, -10446434, --11536819, -67646, -10315438, -8600135, -4488778, -2907693, -11114302, 5122286, 6999723, 8826158, --4922033, 7707856, -7231651, 12755516, -2755222, -1809255, 10344429, 4301410, -2746095, -8212515, --3657702, 8961986, 2257005, -8774081, 3544422, 9497246, 10165114, 3042448, -12448426, -15161771, --1181116, 1192390, 952946, -11475079, 3121368, 9247065, 3385508, -6484864, -17313550, 2690797, --7250979, -19492710, 1095754, -1900523, -9004936, 9513353, -22628572, 13070659, 9945534, 10982768, -1003412, 11636140, 612033, -8642548, -9790378, 651224, 9291625, -7581154, 1702418, -15549392, -9558987, 9997610, -5994701, -3831648, 1926830, 10995116, 8049306, -6889128, -5975374, 7243999, --10191957, 2521146, -13730474, -853625, -4391067, -18578954, -18764712, 2687039, 10100689, 4016331, --16064788, -9320616, 11519102, -14154065, -5907191, 9680319, -3260417, 12314208, -5052492, -10240276, -3115999, -14472966, 15152108, -2674154, 2396055, -8317741, -4032438, -1714766, -14892799, -10008884, -839666, -3519726, 1126892, -5910949, -15772731, 1664300, -13115756, 4413079, -3555159, 7872675, --15761993, 5496485, 2267743, -5934034, 11076184, -3132642, -8394514, -17030620, -2691334, 1117228, --13206488, 6073084, -10030896, -3287798, 6784975, -7310571, 1986422, 8201777, 12173011, -3629784, -965831, -4751845, -17255568, -3854196, -4064113, 7058242, -15246597, -267899, -9018358, 8958765, --10845866, -14265197, 8831527, 4140349, 5540508, 19258096, -3768834, -5677410, 4884989, -12516072, --15096273, 1126355, 17939004, 5604396, 9779641, -7421704, -9771587, -14747307, 2272038, 18887656, --9143449, 9921911, 1548336, 14756434, -23155780, -6993281, -1131187, 2803540, 11995307, 6366752, --17882096, -4381941, -8746701, -389768, -20511154, -2760590, -7940321, 1741609, -11234024, -252329, -1503775, -28228136, 2371896, -8447127, 826244, -10737955, -1570347, 7776575, 2650532, -3060164, --4591320, -14231374, 14310294, 15675557, 4002910, 4839892, -13715441, 21385180, 7199976, 10886131, -27707908, 10084583, 19139984, -17585206, 4740570, 19441706, -5145908, -6394670, 3257733, -11308112, -9552544, 2682744, -13101261, -17554068, -725850, 15600932, 244276, -868120, 10615549, -14532559, --3118146, -11922292, 7565048, -20563230, 1049046, -4180077, 8310225, -21531744, -14316200, -9285182, -7143605, 7226820, 5629092, -6879464, 6088116, -5095442, 7271917, -4177930, -1078574, -1393717, --5270462, 4221416, 10512469, 5783711, 10597295, -794032, -8508867, 1308354, -8448201, 24904368, --5364414, -24700356, -6686191, 6537477, 22335440, -21604222, -7798587, -1700807, 14754286, 491237, --29188060, -4192425, 15016279, 28228672, 2141578, 19342922, 29984240, -3030636, 10382010, 12576738, --2719788, 23295902, -2292439, 28082106, 5662378, -10225243, -24865714, 11411728, 13829258, -23790360, --23114440, 6081137, -5385889, 682363, -9179956, 21511880, -9658845, -6260452, 7536594, 5328981, -261456, -9943386, -7152731, -12090333, 4916664, -791348, -5710696, -1061394, 14450417, 21426518, --23169202, -1605244, -22582938, -2545305, -5717675, 22393422, -9337796, -9227200, -4184372, 13566191, -4763656, 3635153, 5980742, 5333813, -3814468, 115427, -2669859, 3503620, -2384244, 20927766, --5159867, 5438503, 15211700, -7889318, -16643535, 3638911, 6241661, -6141267, -6060199, -1561758, -4025995, 10572599, -14024142, 19458886, 29403882, 19250580, -7374996, -11686069, -25857850, -34372088, --11768210, -57445, -5218922, -1569811, -2758980, 8538932, 651761, -12726525, 8643085, -4927938, -908922, 14365055, 24283746, -11950747, 23438174, 10708427, 13462575, 20063402, 30829812, -11428371, -16096464, -31133144, -3573413, -13796509, -30596274, 12811351, 7612830, 9717364, 4427575, 12556337, -4032974, -21922586, 19019188, 33390150, -4654671, -5008469, 8395587, 3600793, -6614250, -29174640, -2711735, 419833, -2385318, 715649, 10329933, -20764020, 4862440, 6307160, -4036733, -11839077, --5626944, -13230110, 14106283, -29948270, -4082367, -19144816, 11125576, 4705674, 11282879, -3521336, -3308199, -7405598, 18855980, 5916855, 15546171, -13493714, 15297063, 10737, -14278082, 30593052, --4636954, 4070019, 20812338, -19241990, 23303418, 14076218, -17497696, 7989713, -6382322, 10512469, --24334210, 18671834, 3148748, 6972343, -1693291, 6632503, -19476066, 14012868, 23620710, -41516228, -4712653, 18628346, -10965052, -13261785, -220654, -12698071, -5632850, -33837364, -28792388, -3860102, --16410533, -19844896, -14165339, 9000104, -4872104, -9998147, -15972447, 15113453, 1294396, -24441586, --3570729, -47782, -11366094, -3591130, 10290205, 7235946, -1382443, 158914, 825707, -6098317, -5612986, 11513197, -3903052, -2685965, 18003966, -33007360, -4953708, 9338333, 35692252, -14562623, --8670465, -13123273, -17389248, 7820062, 37915436, 6959995, 23709830, 4794257, -3231963, -1948305, --2165201, -18041010, 4590783, 4085051, -14018773, 3256659, 29920890, -4736275, -8252780, 4903242, --9681930, -2394981, 26630944, 38114612, 11213086, 22907208, 27445378, -9315247, -9923522, 3119220, --7486665, 1677722, -24715390, 56371, -18659486, 6697465, 6497212, 12980465, 27364310, 30877056, --11955578, 69464120, -9202504, 1912334, -12500502, 8475044, -5126581, 8374113, 18035104, 5375689, --16291885, -8646843, -17042968, 64425, -11496017, -21081310, 3121368, 14269492, -2116882, 4411469, -6826851, 8523899, 88584, -5813775, -7878044, 4480725, 135828, -10310606, 4369593, 30102352, -21166672, 12324946, -25065430, 18484466, 14271639, -6260989, -7591892, -7325604, -10007274, -3952444, -8219494, -17861696, 1764695, 2660195, 10937134, 28719910, 5419175, 6254010, 1443109, -3015604, --5884105, 12657269, -7661685, 28972238, 8922258, -2423435, 12165495, 2704756, -19758460, -13579613, -15665893, 19010062, 6206228, -4494684, 11496554, 13531831, 17852568, 37344740, 2335389, -10946798, --21522082, -13383118, 6208912, 803159, 7063611, 11259794, -10695005, 49486612, -7305740, 2143189, -5528697, -3687766, -637803, 12445741, -9141838, -10824928, -5651103, 16048682, 14348412, -38160248, -7435662, 6604049, 15703474, -9706089, -15008763, -14294725, 11014444, 9971303, -15325517, -8338679, --6234145, 25810070, 13044353, 7322383, -4877472, -26547192, 7671349, 6805376, 13868986, -3203509, -7445863, -7295539, 2756832, -23055384, 9788230, 9554692, 532039, -5660767, -14304925, -28721520, -18904836, -12075301, 9861245, 9881109, 16785270, 2307471, -17217450, 29169808, 6084358, -28613608, --12830141, 16953310, 4528506, 22157200, 9986336, 3384971, -19740744, -10493142, 12048994, -36010616, -38907572, -28108414, 2481954, 21572010, -5029944, 43401720, 8135742, 5166846, -14798310, 47212964, -7035694, 13622563, -8250632, 15217069, 38650948, 11399917, 23492398, 30487826, -3499862, 35269196, --30929670, -12486007, -12946105, -11700565, 1918240, 3938485, -4553202, -14917495, -26877368, 21606370, -20383378, 7333657, 18213882, -35442608, -30851286, 7494181, 11679627, -17585744, -23644332, 11563663, --8869107, -33219424, -13450227, -8147553, 13270375, -30742840, 13713294, 8438000, 10444824, -15603616, --2838437, -15470472, -7823283, -40246528, -11273752, 16079284, -62151396, -21384642, -4310000, -3691525, -88047, -38537132, -10981158, -56860000, -6503118, 8374650, -17457968, -19457276, -8973797, 13963476, --7432978, -22089554, -24267102, -59310276, -22098680, 24131274, -26942866, -40755480, 30311732, -12563853, --44670344, 10502806, 37302864, -23283554, -10836739, 2204392, -29396904, 32452772, 48059612, 66020088, --9165997, -1157494, -24437290, -24850144, -43113420, 19512036, -6346888, 65737160, -12517682, -27492622, --37902012, 2850248, 13492640, -13956496, 13635984, 42991548, -15453292, -7183333, -28252294, -13179644, -30269318, 33449206, -31871878, -9267466, 18705120, -7081328, 9210557, -9914395, 43466680, 33484102, -72958072, 23133768, 33297270, -14165876, 24443732, 47925392, 17542258, -3377455, 13208098, -2010045, -33427730, 15946677, 47878148, 12337830, -43997644, 15563888, 20074140, 37279244, -18967112, -18979460, -24437290, 22921166, -8904004, 37136972, -10805064, 14448270, -39362300, 25224342, -7093676, 13052406, -17827336, 31810138, 32015224, -25022480, -21045340, -9910637, 38322384, 33093796, -10138270, -22541598, --34566972, -7676181, 29779692, 25742960, 21635360, -13237089, -50087908, 6408628, 83737904, 51058572, --8514236, -115997936, -14163728, -9398462, 12111271, -10867341, 5101348, 15001247, -1654099, 7957501, --22910966, 19094350, 22776748, 39276404, -23550916, -30913028, 37668472, 57490820, 16877610, -21814676, --29430726, -4398584, 11280732, 5662915, 11833709, 2800319, 15278809, 7468412, 39084204, -8838506, --45939508, -18709952, 19172198, 8434242, -13629005, -18888730, 6323266, 25898652, 44754096, 40543956, -2780991, 3372623, 19189378, -11854110, -38731480, 15728170, -22655952, 53879828, 59901908, 1788317, -19869592, 10990284, 15357729, -21671868, 785979, 56353192, -15525233, 3758097, -67561984, -6205154, -13125957, 20274930, 20974472, 18711562, -12288975, -7271380, 38828652, 52158084, -1570347, 2469606, -13111461, 4646081, -7066832, -54323284, -22900766, 41609108, 46235860, 43539696, 59810640, 9229885, --26749056, -81123344, -61284352, -12734578, 16325708, 49241264, 54520316, 24581708, 707596, -28367186, --23695872, -11941083, 16750372, 45530412, 26433914, -8060043, 1338419, -5785321, -26306138, -37554120, --29393682, 3294777, 43219184, 30411052, 65164856, 40149356, 41886668, 56749404, -17513266, -43679280, --46839840, -64775088, -76448808, -31821412, -9192304, 19408958, 41786812, 57178364, 56466472, 42364484, -28944322, 54318452, -11577621, -41014252, -1919850, -13878650, 15210090, 12781823, 69310032, 55484000, --22808424, 5228586, -16065862, -52650932, -13994077, 5593658, -28284508, 35767412, -17621714, 6088116, -3363496, -14231374, 37114424, 41347112, 41303628, 16900160, -21365852, -65760244, 28614682, 8571144, --113195472, -119373784, -124563176, -127673808, -170967616, -12829604, -43992276, -5721434, 22600654, 87104088, -97692792, 101225936, 138636720, 189878352, 181632560, 179155440, 144543904, 106608608, 78473344, 28202366, --78244104, -33931316, -44117368, -24447490, -95349888, -10570988, -36575940, -39815956, -78340200, -58018028, --60381872, -53123912, -57105884, -102511744, -91585880, -51014548, -47166792, -58877024, -85312544, -8396661, --74589624, -142775456, -123586608, -106487808, -56058452, -71206264, -11475616, -148966112, -66236984, -64295124, --30500710, -19963008, -78677896, 5680631, -79725864, -8126078, 10333691, 37372656, 67646, 37189584, -51870320, 86833504, 88219168, 126453504, 76083200, 198264288, 116953032, 228322608, 145057696, 222231264, -251893392, 303824928, 234061760, 232163376, 243998704, 160720368, 68846712, 44360568, 0, 0, -0, 0, 0, }, -{ --9471477, -10372883, -6034966, 430034, -5037460, 2355253, 1140314, 1713155, -5577015, -3837553, 120796, --3586298, -407485, 2319282, -438087, -1240709, -635118, 2598455, -1077500, -1749662, 7144141, --17180, -5595269, -2598455, 2393371, 570157, 2228014, -4943508, 539555, -5198521, 784905, -4361540, -545461, 2752537, 2852932, 2631204, -2928094, -1270774, -1711008, 943819, -739808, -1838246, -4839892, -2312840, -2051921, 247497, -1221381, 2700998, 3520800, 5583995, -2215130, --3022046, -1438814, 1378685, 3658775, 4175782, 3382824, -759136, -4900021, 6252936, -4102768, -2231236, -4314832, 3594888, -2860448, 2152852, -2602213, 195421, -2763812, -1953136, -203474, --1003412, 2152316, 1381369, -365072, -4466766, 17122960, 2335925, -5506148, 2735357, 3099893, -1123671, -6992207, 3316252, 5121749, -5334350, -1525250, -6555731, -1358283, -2741800, -2328946, --879931, 471910, -156229, 782221, 2458332, -2844879, 1393180, -6682969, 2410014, 4292820, -958315, -1666984, -5441724, 3724811, -2353105, 5952288, 5036386, -83215, -2246805, 4884452, -5602248, 4593468, 4568772, 1264331, -3388729, 1232656, 4325032, -1631551, -3542811, 3403762, -5202279, -2086280, 2749316, -5668283, -413927, -4941360, 3569655, -6628745, -1770063, -1064615, -2414309, 3623342, 2494302, 41339, -3527779, 699006, -4905390, -3024731, 1028645, -311385, --2887292, 1996086, 1851131, 828929, 3351148, -2340220, 1610076, -3209951, -1157494, -812286, -2650532, 9663676, -9846749, 316754, 120796, -2534568, -2990908, -3186329, 963683, -5575405, --5494337, 712965, 2595771, -259309, 3086471, 2385318, -3040300, 1175747, -10788421, -2686502, --2445447, -2558190, -3430068, -3794067, -9510131, -7414724, 968515, 2157684, -548682, 5066988, -4060892, 1665911, -1861332, -1080721, 4765803, -1912871, 560493, -758599, -5077188, 1629403, --1721208, -3494493, -1359357, 4066260, 9933186, -3857418, 1082869, 2368138, -1872069, 3080029, -1373316, -3539053, 2000918, -8290898, -3841848, 36507, 3337190, 5174362, -3238942, -1542967, --394063, -11989401, 1998234, 6114960, 286689, 841814, 3320547, -1995012, 5202279, 7055021, --984084, 1974074, 4162360, 4021163, 666257, 220117, -2148558, -2725157, -2707440, -8527121, -1809792, 164819, -8244727, 1097901, 4418448, 6544457, 1592896, -4964446, 11217918, -1676111, --2355790, 5174362, -3414499, -3369939, 428960, -4305705, 4939213, 4884989, -2158221, -7802345, --3882651, 3621194, -5023501, 10608569, 9201967, -7628399, -9214852, 135828, 1596654, -8862665, --672699, 3379603, 2325725, -4450123, -2572149, 9733470, -1159641, 6626061, -783295, -2452426, --2416456, -5360119, 788127, -974421, 5262409, -4837207, 1136019, -1468342, 889058, -2978023, --465467, 4233764, 3483755, -5980742, 8713952, 400506, -166967, -492311, -944893, 2018098, --1364726, -8319352, -1285806, -4628364, 6702834, 2379412, -38655, 7882339, -4948876, 4973572, -5217312, -346282, -4622996, -20413442, 4439923, 887985, 14200772, -972273, 5581310, -7939784, -1457605, -5995775, -1603633, -3032247, -1133335, 2461553, -1779190, 2288144, 4629975, 3526705, -13446469, 9259413, -6442988, 2958159, -571768, 2348273, 1370095, -1919850, -13837311, 3267933, --949188, -303869, 4896263, -979789, -4058207, -2805151, -916976, -4387846, -2551211, -11025181, --2838974, 120259, -4136054, -846109, 4191351, 6277632, -2404108, 7796440, -6286759, 1147830, -2374043, 880468, -2207076, -4351339, 2588792, -1213865, 1432909, -3273302, -4843113, 667867, -2144263, -4629975, 3804804, -3212099, 9669045, 10626286, -3802120, 3786014, 3573413, -703838, --2011655, -1583769, -13839458, 5378373, 4612258, 51540, -3034395, -5609764, -315680, -2077154, --6645925, -4148402, -6430640, 6775848, 3930969, -390305, 7793218, -3900367, 7006166, -7511898, --7227893, 3792456, -11636140, -3984656, 3135863, 7380902, 9545028, -1438814, 7161321, -41339, -6824166, 2672544, 1232119, -890669, 508954, 6869800, -3034395, -488016, 1348083, 792958, --6430103, -599148, -3432216, 13789529, -6361921, -6350646, -1476395, 6621229, 6550899, 5755256, -7504382, -1047972, 1463510, -1405528, -3569655, 3036542, -236760, -458488, -4108673, 10887742, -6644315, -3040837, 2102923, 3397319, -5546414, 1447941, 4196183, -787590, 8033737, -2959233, --994285, -8409009, -3242164, -7104950, 351114, 10455561, -3994857, 3155727, 1742683, 635655, --2789045, -661425, 71941, -2224256, 4872104, -4828617, -2319282, -580894, -2021856, -18861886, -14011257, 1658394, -6828461, -16625282, -1496796, 640487, -9783936, -680215, 4809290, 4176856, -532039, -2648384, 3835943, 12268574, 12366285, -4986457, -5580773, -12985834, 2799782, -2128156, -13009456, -4974646, -136365, -2743410, 4985384, -1160715, -13037373, 4619774, -477815, -7510824, -146566, 1544578, -933082, -1009854, -5281736, -7210713, 4720169, 1479616, 6129992, -4854924, -10225780, 5162551, -1953673, -8556649, -1644436, 3635153, 10002442, 3481608, -5451924, -2107755, -4718559, 3420942, -2735894, -918049, 4968204, 4466766, 5238250, 10315975, 11052025, 5900212, -5948530, 7311645, -3795677, 1613834, -7092602, 7911867, 1270237, 4387846, -5040681, -7237557, -1937030, -9428527, -3642132, -3699041, 7433515, -6904160, -455803, 12776454, 7836705, 10794327, -2014877, -11913166, -3959423, 12545063, -3680787, -8027294, -8360691, -8233453, -8707509, 4714264, -4790499, 3058554, 2797634, 2891050, 12069395, -1544578, 5211406, -10452877, -11758010, 7797513, --464393, -6435472, 410169, -16355772, -5375152, -5537287, 1955284, -613643, -1554778, -11515344, --7562364, 1236951, 7875360, 12845173, -5159330, -5084705, 6810208, -8872866, -689342, -477278, -2903398, 5614059, 4537633, 8911520, -4855998, 12932683, 6037114, -13989245, 6913287, -7769059, --9359807, -7701950, -11315628, 10183904, 2279017, -11919608, 1241246, 2584497, 957778, 1979443, --2380486, 8539469, -5126044, 6634114, -10721312, 8112120, -5717675, -4497905, 368293, 3984656, --1597728, 6534793, 27433030, -23126252, 11931956, 12407087, -9924596, -1105954, 16757889, 6604049, -10956462, 3856881, -2643016, 24764244, -100932, -3643743, 838056, 913754, 12353400, 18832894, -7686381, 708133, 1236951, 3534758, 7064685, 746787, 4166118, -11747809, 6846715, 10641318, --1161252, 4836133, 902480, 2659122, -7202660, -5488968, 1371705, 564251, 12030203, 6332393, -5525476, -3828427, -4813048, -4892505, 7343321, 10152766, 1039382, -2121714, 19123878, 10276246, -13115756, -5652714, -12539694, -1682554, -13161390, -8420820, -3232500, -4987531, 248571, 11562589, --2268280, 1380295, -7561827, -8271570, 11739219, 504659, 6143414, 6368900, -4248260, 11311870, -3994320, 2143189, -2075543, -5461588, 9593883, -947577, -12224014, 9831717, 9619653, -18932752, -1954210, 5766531, -9439264, 7224672, -16064788, 3194919, 4536023, -2503966, -6501507, -8463233, --9583146, -16292958, 1802276, 17505750, -6120329, 8167954, 4644471, 12848932, 6947110, -5615133, --11635603, 5340255, -3026341, -4691715, -12015708, -2411624, -1686312, -5409512, -5167383, -3424163, --8417062, -11709155, 12797392, -2004139, -7450695, 9287867, 3564823, -9588514, 1354525, -1489817, -5781026, -12547747, 3364033, 3087008, -17128866, 4788889, 5747740, -9883793, 2695092, -391379, --2619930, 5247377, 781147, -2381023, 977642, 3064996, 11862700, 7926899, 12125230, 6781754, -4516695, -4581120, 17969606, -6116034, -8703751, 17813914, 1670205, 9894531, 2935073, -5953362, --17766132, -19246822, -3759170, -1775432, -6325413, -6454799, -32050120, 14019847, 25552372, 731755, --16228534, 5767604, -3891240, -2193118, 3277060, 1434519, 5771899, -9222369, -155693, 22726282, -17267916, 14879914, -18605262, -1925219, 3222299, 7974681, -9489193, -10620380, -3481608, 1807108, -7220914, 2898566, -23615878, -26815628, 6872485, -2101313, 13326210, 13502303, -10620380, 10940355, -8750459, 11756399, -1985349, -9105868, -9201967, 4900021, -9685151, -4653060, -1114544, -1754494, -6695317, 15191836, 8212515, -5982890, -5050882, -9688909, -3237332, -769336, 3342022, -3308199, --4087198, 6582038, 3966939, -14163728, -1351841, -1156420, 13877039, -9320079, -9860171, -18238578, --6794102, 935229, -118648, 6518687, -3046743, 41876, -8546448, -13144747, -11042361, -12420509, --6737193, 2051921, -20866024, 4255776, 3914863, 3409667, 5444945, 16080894, 1655710, 14041322, --1490891, 18096308, 9101573, 14251775, 8737037, 4570382, -6483790, -81604, -3967476, 10015864, -3021510, 8898635, -7635915, -695248, 14778446, -17244294, -9841918, 14730664, -23510114, -9673877, -1914482, -3723200, -11599096, 24678346, -4159139, 17337172, 6688875, -13453985, -2141041, -4462471, --17323750, -21566104, 18008262, 853088, -6583111, 5515275, 275952, -1882806, 6476274, 3735548, --2436320, -7073811, 1447404, 18289582, 14241575, -10547366, 4503810, 2356863, 13197898, -4617627, -8819715, -17738214, -5027259, 14914274, 4038343, -2590939, 15302432, -3027415, 10527502, -19304268, --25350508, -6533182, -194347, -14851460, 18173080, 16472273, 18356690, -5099200, -7515656, -1816234, -21561272, 15500537, 24295556, -21627308, -16276852, -37030672, 15905875, -4136054, -31674846, -6146635, -2948495, 4648229, -11875585, 12867185, 10814728, 1216013, -212601, 2005750, -5316633, -11016054, -2345052, -6265821, -10396505, -136902, 23881092, 742493, -3744138, -19176492, 7975755, 15138686, --7956427, -23139674, -4329327, 7792145, 2624225, -4918812, 4888747, 1636919, 8157754, -2354179, -13548474, 20957292, 7744900, -13972602, 15603616, 7087233, -18086644, -19049254, 20425790, 9948218, --8306467, -9333501, -739808, -16918950, 12028593, 16170015, -722628, 820876, 3722663, -2193655, -17374754, 5848672, 4164508, -7527467, 2353105, 5829881, 21362094, -5472862, 7707319, -17241610, --20244328, 17037062, -3706020, -1870995, 270046, 16214575, -2189360, -4095788, -5692443, -7866770, --25631828, -2669859, -16967268, -33857764, -34838092, -15426986, -26729192, -12482786, -4786741, 4074313, -14078366, 15693810, 1123671, -9468255, 17041356, -9580461, 8131447, -33472290, -3757560, -23170812, --15635828, 14596446, 10194105, 9757092, 2957622, 21297132, -2720862, -2047626, -16314433, -6163815, --3672197, -11453604, -11353746, -27666568, -11077794, -3677029, -4811974, -17394618, 14303852, 5164162, -8359617, -8069170, -3268470, -41665476, -12230456, -12023224, 9054865, 20229296, -13343927, -2744484, --24262270, -2497524, 11864847, -4699768, -8462159, 4556961, 17194364, 29209536, 5898064, 98784, --2091649, -8942659, -12481712, 7112466, -8427800, 26281442, 4771709, 10705206, 54830088, -12165495, --10501195, -15246597, -21267068, -27149026, 16419660, 26682484, -14769856, 1464584, 6438156, -8300025, --1582696, -18742164, 161598, -10193568, 28794534, 717796, -4804995, 23412940, -5258651, 7337952, --25538412, 14254460, 4486094, 18354542, -7771744, 13873818, 23538032, 25627532, 14335527, 23189602, -11844446, -2761127, 22112102, -9725417, -14009110, -3773666, 9035537, 15584289, -35154844, -1587527, --22658100, 19010062, 8444979, 391916, 6442451, 26297548, 1249299, 23565412, 9830106, 35252556, -3192235, -3059091, 15130096, 5838471, -17506824, 4630512, -2049236, -22670448, 16470126, -13336410, --23041962, -46112916, 3531000, -4947803, 27466852, -14552960, 36769216, 13020193, -854699, -4847408, -14140643, 15991774, -27359478, -10781979, -20351166, 7710540, -9468255, 21002926, 5703717, 7008313, -6076842, 19133006, -10639171, -12115029, -11815455, 18393198, 10268193, 23555212, 7595113, 70351568, --19131932, 1509681, 1966558, 33316062, 14811732, 15995532, -19618874, 10334228, -6790880, 1627256, --8200703, 3151969, 24881820, -5151814, 9022116, 45923400, 15794742, -19455128, -22141630, 3662533, -31083216, 16156056, 7364259, -10522670, 26801670, 5036386, -1831804, -26675506, 10307385, -3628174, -13791677, -24212342, -13188771, 1961726, -4268661, 3904662, -21103858, -213138, -11984569, 7129646, -22843858, 16967806, 7706245, -31413390, 2661269, 3559991, -26247618, -25296820, -14437533, -13728326, --11341398, 22963580, 7962870, -494458, 17714592, 23710366, 9337796, 20447802, 3744675, 13418015, -93765040, -20885352, 18491444, 9992778, -12009265, 2960843, -55941948, 1926293, 16113644, 39275864, --14397267, 1842004, -21961778, -15088757, 8378408, 18818936, -17774722, 27072252, 12687333, -28976534, -22077742, -9992778, -13296145, 1621887, -16618839, 7470022, -6105833, 27639726, -11768210, 1955284, -15944529, -44387412, 9185861, 17928268, -11975443, 14937896, -26361972, 31995896, 5473399, 8301635, --52007224, 52458732, 23338852, 19595788, 3380676, -27413702, 30692374, 1831267, -11789148, 53874996, --7708930, -18200998, -9329206, 9973451, 16780438, 17761300, 5924908, -4319127, -56777320, -2410551, -17037598, 5255966, 23948200, -26449482, 34261492, 7956427, 13094282, -26610544, -6822556, 10168872, -43056512, -11625403, 11809549, -23586350, 28082106, 20379620, 26586384, -3121904, 12918188, 10908143, --30015916, -23292682, 18027052, 21156472, 6707129, -2270964, -43421584, 44522168, -6564858, -7441031, --13902272, -2049773, -33802468, -64847028, 25747792, 22254910, -608275, -11043972, -25198036, -1586990, --6207302, -11617350, 28973850, -57370564, -23527830, -28740848, -7211250, -42776800, -1935957, -3573950, -659278, -4253628, -7022809, 10984379, 1870458, -16705275, -4041564, 3334505, -25528212, -10974178, --5839008, 6101001, 23894514, -6800007, 45499808, -18102750, -709207, 22659710, -16620450, 16430397, -5090610, -24522116, -41407244, -5601174, 14094472, 45736032, 20397336, -25046638, -9968619, -82390896, --26383984, 131533, 22060026, 55037320, 1126892, -43994424, 6830609, 36099736, -5956046, 6472516, -34455300, 41089952, 77020576, -67956048, -9062918, 24137716, 27579596, -9376450, -19865834, -21920440, --25816512, 10727755, -26642220, 5619428, -11205570, -63369560, 13478681, -11314554, 17800492, -17901424, --18636936, 805843, -27059368, 3977140, -27304718, -1001264, -5471789, -10813654, 11850352, -20160576, --26683022, -23895050, -31202938, -5395553, -4281009, 33253784, 6419903, -24728274, -37419904, 4570919, --1837172, 8504035, -8191040, 20221242, -25066502, -9563282, -34781720, -21503828, -10883447, 1181653, --15454366, 35143568, -13552232, -29711510, 7924752, 36629628, 24938728, 11150809, -27190364, -16251083, --4187056, 33589864, 61527552, 143345, 10696079, -11255499, -63657856, -12562779, 3656628, 24509768, -50652160, -27820650, -38046432, 22620520, 7486665, -10519449, -1057099, -17432736, 9092446, -49641768, --9497783, 6085432, 8599061, -27817966, 31307628, -46654084, -64932928, -48282412, 37720012, 11806328, --66121020, -11429445, -45447196, 20867098, 4359929, -91208464, 6803765, -27835146, -58712204, -45823544, --67041756, 42214696, -19956566, -52966072, -23201414, 17627620, -30953292, -27098022, -20521890, -12380780, --22647362, -23095112, -42230804, -30943092, -58233852, -33106144, -29007672, -9585830, -26679800, -5319317, --11711302, -360777, 3740380, 8374113, 18220326, -15857019, 15541876, 2234994, 32307280, 13870597, -21010980, 19852412, -53500260, -13927505, 46983720, -6907381, -25191594, -30379914, -20435454, 18791556, -74991736, -3806952, 2046015, -47298864, -45957760, -9249749, 13865228, 44384728, 1042066, 40696964, -18932216, -45959372, 90575488, 3372086, 72052368, 2108292, -11125039, 38044820, -41412612, -59501404, --32273994, -134386848, -74958992, -23296440, 70308616, -23045720, -56486872, 66381940, 63308892, -39460548, --51641612, 268435, 56703768, -5566278, -3271155, -17005924, 49470508, -4789963, -13324062, -440234, -13503914, 26254062, 446677, -18191334, -22027276, 31520228, 1904281, -12094628, -33107218, 19687056, -9753871, -2536178, -26322244, 9352291, 10444287, 10528039, -16999480, -8368744, 2094333, 26695370, --8274255, 10624675, -38021196, -8664023, -958315, 26166552, -52723408, -7386807, 3833795, 39088496, --19137838, 7792682, -27750858, 5730560, 9447317, -15900506, -15409269, 206158, 4347581, 13808320, --13572634, 3398393, -47938816, 27632208, -9758166, 45973328, -28936268, 22245784, -20556250, 23156854, -1203128, 16719234, 8655970, -30039538, 34978752, 11025181, 18788334, -33425582, 7111392, -6153078, -2836289, -19522236, -43176768, -57362508, 41519448, 27471684, -32780802, -46661060, -22940494, 21315386, -11115912, 28415504, 30642982, 5828808, -15698105, -4741107, 10618233, -10812580, -1024887, 6151467, -1593433, 17019344, 11905649, 4996121, -15671262, -813896, -9758166, 9762998, -16405701, -14340896, -11669963, -4011500, -6757594, -6766721, -11440719, -15773267, 1054951, 12380780, 11425150, 9397388, --3804267, -13079786, -11223823, -8072391, 13689671, 18461380, -8865886, -13455059, -5786932, 15242302, -7945153, 20494510, -14835891, -5972152, 8143258, -4310537, 600222, -2629594, 7320772, 4026532, -5907191, 829466, -14161581, 5397164, 2579128, -976031, 10899016, -6138582, -2786897, 1418413, --1966558, 943282, -3963718, 18085034, 4921496, -1845225, 18312130, 16797618, 20016696, -47216188, --124995896, -45676440, 22888418, 65663608, 138170176, 92634392, 24114094, 35385160, -18035104, -55633784, --92765928, -80581104, -64062660, -18117246, 2836826, 45294188, 49767396, 105676056, 51412908, 34162168, --2306934, -21926882, -50308564, -25785910, -40627168, -46699180, -28766080, -23808614, -1519882, 13699335, -39643084, 24889336, 28523952, 26255136, 26216480, 39634496, 3614215, 27663884, -4788889, -11509975, --32737852, -18971408, -48945984, -71640592, -63031868, 1467268, -10607495, 20594368, 34093988, 19435264, -52497924, 46621868, 66292820, 38622492, 44930728, 3205656, 2160906, -34361884, -57990112, -66472136, --81380504, -52074868, -66624068, -4115116, -628139, 33633352, 33014340, 82209432, 62353260, 92045448, -35477504, 45042932, 16193100, 3987877, -55673512, -70020312, -29356102, -19980188, 0, 0, -0, 0, 0, }, -}, -{ -{ --6253473, -6058052, -4815732, 7134478, -1403381, -4489315, 1406602, 3631395, -1666447, 892816, 3344706, --4984847, -3398930, -931471, -3041374, 9645960, -3819837, 9485435, 2748242, 3217468, -1248225, --2049236, -3347927, -4402342, 122943, 4133369, 345208, 535260, -2499671, 2736968, 3787088, -324270, -2057826, -4986457, 3352759, -925565, 3842922, -1635846, 697395, 1720134, -2787434, -17717, -4901095, 6687264, -70867, 988916, -612570, -5857262, -1512365, -1727114, 472446, -944893, 3424163, 1539209, -2306934, -3564823, 1728188, -2137283, -1110786, 4239133, -2357937, -3000572, -4167729, 2270427, -4828080, 2415919, -3235184, -1720671, 4893579, 2246268, 2660195, --718870, 383326, 1079111, 1206349, 1720134, 7618198, 784905, -2103460, -2191507, 1294933, --3721589, -94489, -7224672, 5126044, 6533182, 4533875, 6432251, -7781944, 613107, 1721745, --2769180, -2174327, -1894081, -9114457, -1529008, 5332202, -9278740, -7597261, 4389457, 3915937, --5956583, -2143189, 3953518, 439160, 4808216, 1985349, 5011690, -3211562, 974421, 615791, --1305670, 2246268, 1855426, 3307125, 1454383, -1586990, 360777, 3696356, -984621, -1821603, --595927, -4686346, -10063645, 5905043, 2976949, -3280281, 4502737, -1899449, 564251, -285615, -2143726, -2808372, -602369, 5827734, -5524939, -2416993, 2072322, 802622, -737124, -466004, -2774012, 93416, 2500208, -4239670, 4297652, 1845762, -4963372, 3878356, 714575, 1176284, --136902, -1998770, 12009802, -6819871, 2157684, -7545721, 975494, 1828046, -7596187, -9637370, -2486249, -10462003, 2386391, -2694555, -652298, -6400575, -857383, -7194070, -3639985, 72478, --7573101, 8180839, 2954938, -12658879, 1300301, -658204, -2201171, -5395553, 2836289, 6630356, -241592, -444529, 6302328, -3592740, 202400, -2272038, 4230006, -4759361, 1547262, 5825050, --4884989, 5100811, 1935420, 5514738, -302258, 1288490, -648540, -2260764, 7357279, -8842264, -2258616, -3882114, -1487132, -1102733, -2996814, -2332167, -6827925, -4388920, -821949, 4689568, --79457, 1814087, 6806450, -61203, -5215701, -619549, 636192, 1868848, -2240362, 143881, --4937065, 278636, -1564442, 2021319, 3697430, 4476967, 2585034, -1975685, -1489280, -3120831, --10141492, -360777, -6209986, -2125472, -1218160, -7198365, -1199370, -1861868, 3205119, 7871602, -7912404, 730144, -3733937, 3024194, -8149701, -1366873, -3270618, 2519535, -12022687, 3924526, -1750199, -662499, -3632469, -5307506, -2563559, -4417374, -3843996, 1976222, -1027034, -4738960, --1553704, 692027, 7456063, -517007, -8000451, 390842, 3118146, -311385, -2668785, 433792, -2706903, -8650064, -870268, -3874597, 5724655, 3412352, 806380, -7999377, 692027, 2816962, -4605279, 4295504, -5298916, -2588255, 77846, -1771137, -1746441, 4013647, -2706366, 2407329, -607201, -3411815, -802085, -4620311, 5405753, 1949378, -5335423, -3754875, 1003412, 2841121, --4059281, -5290863, -563714, 503048, -2933463, -16972638, 5300527, 4741107, 8003135, -2236067, -4961761, -14634564, -4138201, 4445291, 364535, -7279970, -2054068, -2479807, -12911209, -5236102, -1092532, -656056, -9274445, 5602785, 7838852, -8321499, 6055904, -10871636, -3910031, -1005559, -3492882, -82141, -4632122, 2957622, 1231582, -725313, 4581657, -2331630, -3381213, -950798, --2050847, -3169149, 4480725, -3608846, 1061931, 3626563, -1018981, -2753611, -5618354, -551366, --4102768, -1047435, -4730907, -1064078, 9495636, 351114, 5638755, -5308580, 4669703, -1369558, --8372502, -4511327, 4085588, -2663954, -4446902, 3216931, -5173288, 4321274, 690416, -1104880, -4830228, 5142687, 1678795, -4689568, -6277632, 173946, 7397545, 2254858, 785442, -3532074, -840740, -9888088, -9447854, -6535330, 173409, -2315524, 2614561, -3970697, -893353, -241592, --3460133, -1829119, 1249299, -3388192, 9105868, -7424388, 3719442, -2572686, -1612760, -5509906, --2216740, -1486596, 6366752, -5829345, -292595, 580357, -8120173, -5214627, -5856725, -4991826, --9276056, -3690451, 2013266, 4809827, 2586644, -7455527, -10348724, -2874407, -712965, -5581310, --135291, -4051765, -5899675, -12394739, -6850473, -8928700, 3639985, -2908230, 2752000, -5470178, --12355010, -6793028, -516470, -3104188, -4794257, -2487323, -5550709, 5230734, -579284, 2711735, -3560528, 390842, -1353989, -4714801, -1007707, 4308926, -2088965, -4575751, -6476811, 7614440, --8260833, -10545218, -8198556, -4735739, -6757058, 5386426, 8421357, -8386998, 2489471, -18321256, -5899675, -1174674, 3488050, 10245108, 4216048, -2417530, 3688840, -7556995, 4995584, 5579163, --9765145, -2126546, -4775467, 5679021, 5282273, 7683160, 9300752, -11656541, -5596343, 1845762, -10383083, -3877819, 5068062, -11218991, -2901251, -4037269, -1879585, -6891275, 2165201, -11188927, -8140574, -2384244, -1400696, 5309117, 243739, 984084, 6517076, -158377, 5472325, 2889439, --709207, -2297808, 38118, -8145943, -4933307, -7521562, 313533, 14147622, 4200478, 2274185, -490163, -2661806, 754304, 8090645, -951335, 2006824, -15932181, 14749455, -2740726, -3666828, -1986422, 8544301, 4633733, -2690797, -4543539, 15433965, -1854352, -1613297, 6836514, -5872831, -1654636, 381178, -1802276, 649077, 5502390, 240518, -750546, 8281771, 4795331, 9175661, --3241627, -1847910, 5455146, -7948911, 7726646, 8686034, -3880503, -466541, -12898861, 864362, -4926328, 3919158, -2433099, -8799851, -17910550, 503048, -2716567, -8483634, 2428267, 6025839, --7529078, -3206193, -8238284, 4551055, 933082, -1133335, -2433099, -3611531, 9799505, 11030550, -4710506, 5312875, -1942399, -5366025, 15697032, 3870839, -2076080, -8849243, 7109245, 333397, -9287330, -730144, 11366631, 5423470, 8144869, 6392522, 3869229, 8383240, 11127723, -352187, -2602750, -3432216, 586263, 5609764, 3126736, 2957622, -8507793, -3610457, -1137630, -8339753, --6847789, -5417565, 5279052, 8505646, 12706124, 14734959, 4572530, 666257, 13667123, -5754183, -14341433, -13157095, -6080063, -1560147, 5616744, -12278238, 8119099, -12085501, 6264747, 223338, -6628209, 10471667, -3999688, 9595494, 10359998, 9973988, -5455146, 8465917, -8647380, -6715718, --945430, -5113696, 51003, -4345433, 8135742, -5600638, 1881733, -5515812, -10161893, -4443681, --2061047, 12771622, -10317048, 10145250, 4389994, -14045617, 16616692, 4461398, 1912334, 12014634, -2120640, 932545, -6531035, 389231, -3635153, 13680545, 5624260, 9734007, -3595961, -1727114, -6404333, 11512660, -11528766, 11929809, 2085207, -1342714, -2159832, -10328323, 5223217, -4568235, -2196876, 1066763, -9860171, 3938485, 8337069, -6928856, 5308580, 4149475, 11731166, 1972464, --653372, 7873749, 10488847, 1693291, -5245229, 7820599, -6054294, -11440182, -8185134, 12367358, --15910169, 3956202, -8465917, 9387725, -10093173, 15363098, 5367636, 1416266, -13361106, 6738267, -11374684, 2900177, -6832756, -4580046, -3877819, 10408853, 5797669, -14810658, 2164127, -10524280, --474057, 1045288, -8767639, 11487964, 11812234, -5470715, 2703145, 7752416, -9526237, -1660542, --2809446, -8215736, 17237852, -6407555, -3607236, -8810052, -14116484, -2512019, 511638, -5206574, -2399813, -12134893, 1340030, 557809, -2058900, 9086003, -1605781, -7613367, 4182761, -338766, --5043366, 4332549, 20673826, -4418985, 5322002, 703838, -13163001, -2656974, 12882218, 5070209, -12872554, -1729261, 7841537, -10204305, 5285494, 3730179, 2537252, -8822400, 8959302, 2072322, --19636054, 1034013, -1373316, 13603235, -24564528, 28616830, 3724274, 11533061, -20078972, 11571179, -14947560, -16377247, 6789270, 8690866, 6824166, -10447508, 1823751, 2297808, -3254512, 6710350, -13434658, -10079751, -8302172, -2804077, 11450920, 9932112, 13914620, -274878, 6111202, -9693741, --2233383, -2243584, 2613488, 6720550, 17672716, 10650445, 6681359, 3649112, -170188, 8612483, --2651606, -14458471, -2476586, 4714264, 5133560, -8318278, -6169184, -10388452, 2472291, -504122, -4167729, -6694781, 13003013, 12670154, -10280541, 25719874, 1555315, -1993939, 245350, -4947803, --754304, -1292785, -9875740, 499290, 417686, 7063074, -20968568, 5552856, -7179038, 15826954, -19133542, 8412230, 8199630, 3782256, 1699733, 17152488, -2652679, -12371653, 11396159, -5804112, -4251481, 9862856, 1576790, -7562901, 6280316, 9560597, 8314520, 5034239, 10002979, -13050258, --8369818, 929860, -11714523, -3328600, -2250563, 2006287, -3251827, -7910793, -9578851, -6119792, -4272956, 7255811, -13974213, 2318209, -1705102, -963146, -16748225, -15428059, -2820720, -12119324, -5202279, -13747653, 639413, 6351183, 9899900, -9612137, 11818139, 2364380, -1330366, -3354370, -17649094, -5682242, -981937, -15027017, -8101919, 10874857, -934692, 3621731, -13763223, -15852724, --4105989, -9317932, -1440962, -192200, -5480915, -7989713, 4340065, -7502771, 726386, -10657961, --5078799, -1196685, -15817828, 502511, 10839961, 1010391, 5875516, 10471130, 20091858, -20081120, -3890704, -12814572, -10964515, -7457137, -8268349, -6564858, -5031554, 18670222, 19026168, 20208894, -22310208, -18080738, 437013, 11595875, 9017821, -10953240, -20032264, -3154117, -3653407, -16057809, --9522479, 27770184, 1496796, 1003949, 9993852, -2218351, 3854196, -4948339, -12120398, 6497749, -5555004, -16442209, -22623740, -18023294, -14193256, -13914083, 548682, 2660195, 5844914, -9648107, -7711614, 888521, -4850629, -10189810, -950262, -661425, -14603426, -12125230, 977105, -3740917, -1289564, -9709310, 6234682, 853625, -8567923, -18401250, -7348152, -7115150, -23315766, -8550206, -1548336, 9807558, -1658931, 11828340, -2914672, -2649995, -19931870, -5709622, 7055558, 1968706, --32971390, 7541426, 2246268, -10891500, -6068252, -11415486, -11232413, -2594697, -136365, -12716324, --4004520, 3674345, 8657043, 10965052, -12084427, 7827041, -6871948, 22452478, -19452444, -11975979, --4087198, -36578624, -19244138, -164819, -23461796, 18015240, -8393977, -7581154, 1840394, 41344964, -19720880, 1263257, 8231842, -1928440, -11387032, -1098975, -17482664, -12416750, 5592585, 6032282, -7080254, -11901354, 14930917, 9410273, 16917876, -17526688, 2414845, 25715042, 1961726, 1129576, -4598836, -24506546, 5788542, -6119255, 3526705, -9798431, -23768350, -1309965, 8802535, 11555610, -2345589, -3502009, 1034013, -933082, 7002944, -17399450, -26252450, 4704063, -10094247, 15374909, --6925098, -6199786, 19015430, 4620848, 7616588, 1727114, -17826798, -6767258, -3087545, 9202504, -25093346, 20312510, -7267622, -23104240, -1813013, -2581812, 7161858, -14207215, -19448686, -9972377, -6919729, -17236778, -40375912, 17186312, 14303852, -4936528, -26298622, -4891431, -9425843, -9955734, -13255880, 16139950, -377957, 5281736, -30027726, 12190728, -37868728, -8658117, -2213519, 9010305, -20826834, 32444720, 14143864, -16789028, 5408438, 23082764, 4124242, 7939784, 13065827, -17022030, --5826123, -1538672, 6845641, -11544872, -5656472, -2504503, -8389682, -5959267, 14601278, 14492293, -4721780, 2611877, 23846196, -2644626, 11928735, -23734526, 18314278, 6492917, -21449604, 4095251, -8966281, -19797652, -1131187, -19242528, 8800388, 10893648, 11304354, -12139188, 676457, 16426639, --9837623, 2527588, 222265, 25988848, -11602854, 20024212, 11224897, -18846854, 21891986, -12743705, -15359877, 20080582, -12999255, 13754096, -9944997, -11871826, -21068962, -14080513, -15017890, 12852153, -8156680, -31462782, -14137422, -14760729, 30162482, 2288144, 12147241, -3259880, 42176040, 7858180, --25857850, 3414499, 31344134, -9681930, 8044474, -3533148, 3958886, -16101832, -22278532, 38897908, -28020366, -8859981, 21807160, 9451076, 27954332, 31684510, -7552700, -5763309, 28219008, 21124796, -3457449, -7145752, -12137578, -12687870, 13698261, 25099788, 12372190, -3003793, 17147120, -7084012, -16307454, -5483063, 23220740, 40422620, 30895848, -30629560, 15618112, -4207994, -11984032, 773094, -12062416, 11892764, 72401872, -6098854, 84289, -10564009, -11936788, 14953466, 26500486, -5362267, -20199768, 17663054, -1818919, 1404991, -13647795, 14884746, 11976516, 38625716, 38468412, 47416976, -18901614, -11742441, -10960220, -21525840, 18715856, -31882616, 17228188, -21940840, 14886357, 12424804, --12621298, 3308736, 7092602, -6474663, 21662742, 4629438, -53408992, 11666205, 6012418, -39469676, -1372242, -7019587, 632434, 14062260, -2947421, -36380520, -7532299, -11711302, -3200825, 25451440, -29487634, -17595408, -5717139, -14745696, 6185827, -27725624, -55184424, -19238770, -17760764, 2872796, --734976, 24524264, -38434052, 17631914, -10339597, -3892851, 13191992, 7293392, 23546084, 6069326, -7723962, 27613956, -33459942, 39291972, 28579786, 16495359, 26520350, -10869488, 8368207, -26744762, --8229158, -13205414, 21042118, -20792474, 1938641, -45203992, -60176788, 38477000, -5443871, 25074020, --21220896, 16848082, -15588047, 4214974, -11193222, -36439040, -16980690, -24077586, -17640504, 14275934, -48468168, 20526186, -56511032, -10274099, 1743220, -15333033, 2083059, 1538672, -34004328, 15358266, -15345381, 28545426, -16442745, 9381282, -18651432, -21421686, 7093139, 38433516, 63362580, -5791764, --6026376, -383863, -3168612, -30764314, 43789876, 20078972, 22463216, 16856136, -14957760, 13969918, --27459336, -38811472, -8201240, 25768730, 16143171, -15152108, -10415296, -3805878, 20468204, -1069447, -14362908, 13921063, 24508158, 6719477, -18722836, -18013092, 13056164, -20070920, -15454903, 5531381, -26887032, 24439438, -32973000, -26221850, 13430900, 16267726, 54747948, -16013249, -33763812, -35169340, -24662240, -23703388, 22965190, 25994752, 55841016, 121526096, -31206696, -19656992, -50348292, -78626352, --27602682, -42040212, 86436, 46792060, -12347494, 21650394, 33735356, 18753974, -20907900, -54916524, --83727704, 29606820, -14806900, 15127412, -27528056, 2385854, -25283398, -65756488, 13700409, -28843926, -24068996, 1514513, 12451647, 10509785, -60266444, -43505336, -22592602, -15198816, -15710990, -26150446, --9592273, -41857140, -27306328, 16473884, -27861452, 46328200, -38533372, 1209033, 7864622, -6418829, -2095944, -4680978, 9467719, -13940390, -14410152, -4761508, 6533719, -4221416, 18726058, -22487912, -2231236, 27841052, 7562364, 1785633, 13320841, -918049, -14749991, -10839961, 22519050, 2616172, --41598368, -20414516, -34240016, -17574470, 39760124, 36211408, -43170328, -7720204, -48824652, -14449881, --6548752, 7257958, 20335596, -41379324, 22243636, -35871568, -8704288, -25613574, 45033804, -13758391, -30277908, 27936614, 66721244, -37214280, 23837606, 172872, 20784958, 4807142, 11185705, -41130756, --49798536, 34864932, 8507793, -53399864, -21517250, -31614180, 5564667, -4438312, -73642048, -31173410, --16733193, -37208912, -22157736, -73832096, -62259308, -8004209, 31291522, -38837240, -22323092, -2274722, --33272574, -4378183, 162135, -31219580, -6383932, 11250667, 4690641, -42684460, -23721642, -22573812, --12011950, -12435004, -2044941, -28309204, 29709362, 21808234, 41194104, 60369524, 51335596, 16694538, -54040352, 24940338, 11487964, -18703508, 20263656, 23084376, 16933446, -1707250, -15775415, -3910568, -14715095, 27275726, 119731344, 20318416, 25781614, 21658984, 49550500, 22981834, 43449500, 81487344, --36497020, -71404368, 9871445, 52487720, 86417424, 42343544, -74897248, 14042932, -19487878, 112687592, -78547432, 100952136, 86836720, -74532712, -55001352, 66044784, 70883600, -18937048, -55786792, 89573688, -72593000, -62817656, 14298483, -1698123, 10470057, -2783139, -5715528, 22643604, -22617834, 22012244, --8519605, -544387, 9678172, 6544994, 8904541, -885837, -12190728, -9321690, 15469935, -12867185, --373662, 12791486, -6347425, -9145596, -9705015, -21536576, -18873696, 13451838, -5869073, 4026532, --11130945, 944356, -25351044, -6608881, 9282498, 15626165, -9121974, 1880122, 14038637, 17070348, --2385318, 13671955, -10534481, 48139068, -16283832, 15008226, 4878546, 7359427, -6753836, 10766409, --2534031, 33203856, -2900714, 8307004, -21970368, 30029338, -14070313, -4357245, -1457068, 1702418, --6255083, 16639240, -19080392, 15430207, -17000018, 24053428, -24304146, 31507880, -18596134, -14911053, --9798431, -8932995, 6635725, -22195854, -45638324, -50194208, 42279660, 10522133, -13364864, -67944232, --27434640, 37520296, 7487202, 27041114, 30194156, -11184632, -19298898, 692564, 7011534, 5383205, -4853850, -12183748, -8983998, -6852621, -139050, 18130668, 9738301, -1076963, 3966402, -5462662, --9007620, -5833103, -4773856, 166967, 5290863, -4319127, 6876243, 7196755, -24968256, -11175505, --11084774, 13174812, 9180493, -923418, -11621108, -15722802, 13619878, 2972117, 9148817, 12717398, --23041426, -15331423, 4262218, 18641232, 9463424, -26142392, -16062641, -21167210, -10022843, 5707475, -5007395, -8495982, 9882720, -3593814, -8916889, 4584341, 9138080, -5978058, 2506114, 485868, --7724499, 185220, -2301029, -17433272, -18066780, 421444, -19082002, -12827994, 2241973, 10336376, -3527779, 17151952, -44362716, -120027160, -45952392, 26822070, 57088168, 135442336, 79306568, 21346524, -27883464, -23881628, -44532368, -96532072, -65457448, -50038516, -16882442, 19446538, 52324512, 40898288, -50758460, 49436148, 33005214, -11555610, -39882528, -34117608, -35578436, -28183038, -41150620, 12298639, --26302380, 1790465, 18034030, 34688304, 18826452, 32500018, 42087996, 818728, 11967389, 1003949, --1513439, -23876796, -4045859, -21191906, -42526620, -65543348, -37519224, -19815906, 4373351, 5296232, -38133404, 54597088, 51195472, 62503048, 8067023, 41247792, 15169288, -3067681, -39173324, -36709084, --51768852, -65841848, -46416248, -50662896, -33625300, 1422708, 15202574, 38641284, 59321552, 90254976, -70397736, 66618164, 34821984, -9830643, -11987791, -29533806, -70190504, -47001976, -64996812, -17580374, --9045738, 0, 0, }, -{ --6189585, -5708549, -5827734, 4446902, -2529736, 1142461, -8290898, 4577899, 1128503, -279173, -1499481, -3481071, -4316442, -924492, -1751810, 3629784, -9207336, -2603287, -5244692, -2419677, 1912871, -1406602, 4478041, -7128035, 2143726, 754304, 408559, -2933463, -799938, -3810710, -486942, --5206574, 1706713, -5771363, -512175, -4916664, -3936875, 806917, -4359392, -5549098, -6791417, -1804960, -791348, -1369021, 2682744, 1993402, -2641405, 55835, 7233799, -3696356, -2362232, --5546414, -1621350, 3125126, 1724966, 1770600, -2612414, 2251100, -3163244, 360240, -3856881, --432718, 253403, -4028679, -1493038, 584116, -585726, -4527970, -8455717, -3602941, -3030636, --1060857, -237297, -1986959, -2407866, -574989, 8009041, 5094905, 83215, 188442, 6310381, -1492501, -3209414, 2062121, 4198331, -2253784, -3537979, -12737799, 654446, -4372277, 8416525, --4318053, 4223027, 3259880, -433792, 2597382, 4676683, 1107565, 1111860, -2476586, -2741263, --2334315, -3453691, 2845953, 1861868, -1858110, 2798708, -2117956, -2727841, -3567507, -1536525, --2880313, 305480, -217970, -400506, 5499706, -3240553, 4434017, -1597728, -1505923, 3288334, --2284923, 1118302, -2302103, 3612604, -1382980, -9716290, 2556043, 502511, 812286, 5129265, -2143189, 536334, -1571421, -3073049, 7971996, -4265440, 2782065, 1930588, -4027069, 3778498, -1013075, -3891777, 2664490, -4008815, -408559, -180389, 3025805, 882616, 3149285, -1238024, --9478456, -1779190, 15497853, -7443715, 990527, -324270, -308164, 3628174, -2621541, -10895795, --10021232, 4916127, -3070902, -811212, 2742337, 693100, 2711198, 2988760, -4691178, 2743410, -1957968, -3302830, 4171487, 6176700, -3791383, -1171989, 461172, -6401649, -2787434, 783295, -7967165, -1132798, -267899, -6374805, 4022237, 129923, -5650030, -2363843, 2214056, -755914, -1325534, -4911832, 78383, 477278, -1847373, 5524939, 1581085, 1349157, 5432597, -398358, -6999723, -2124398, -8339216, 3623879, 3632469, -2866354, -1032940, -887448, 1373316, 558883, -2726231, -1783485, 1944010, -4489315, 181999, 3293703, -4051228, -292595, 3118683, 1097901, --1803349, 1837172, -1158031, 828392, 5115843, 2000381, -5203890, 7905424, 3719979, -3568581, --8815420, -930934, 1110786, 10026601, -3619584, 8611409, 2276870, -155693, 680752, 7715372, --1604707, -1944010, -2032593, 5473936, 11021960, 2972117, -7315403, -10030896, -14276471, 2020782, --3595425, -5949067, -3149822, -9294309, 145492, -4246112, 906775, 4649839, 4967667, -5244692, --4600984, -3289945, 821413, -7865696, -647466, 2615098, -3386045, -1187022, 1083406, 3355980, --4237522, 1308354, 10830297, -299574, -236223, -3752728, 4690641, -1814624, 694174, 3508988, -4697621, 6656663, -697395, 1122597, -1596654, 83752, -726386, 1040993, 10563472, -11084774, -694711, 2401961, 6477348, -2265595, -2462627, -407485, -2244121, 8402567, -3831111, -10287520, --18790, -2746095, -3628174, 3215320, -9535364, -16432545, 6243809, -5088463, 6999186, -6145562, --484258, 4863514, -9467182, -1567663, 2994129, -2527588, 13996225, -5766531, -1677722, -5498632, --4569845, 7217693, 8038032, 3146601, -9275519, -11234561, 10544145, 1822140, -10500658, 4026532, -484258, 5082020, -3045669, 4852776, -6240051, 3160559, 10333154, 4298726, 4486630, 2394981, -286152, -2532420, 2247342, 872415, -6869264, 192737, -2097555, -5051956, -4998268, -1864016, -4169340, -7278896, 1136019, -5239323, -409096, -722628, 2573759, 4463008, 9397925, 3367791, -107911, 4084514, -4769025, -7150584, 56908, 1828046, 959925, 8935679, -1773285, -901943, --2555506, -1042066, 1542430, 4507032, -808528, 2081985, -3920768, 7495255, -1267015, -1952063, --664109, -8627516, -2298881, -5733245, -918586, 10581726, 6635188, 4514011, -1202591, -10030896, -977642, -6733972, -10593000, -3783866, 6991670, -6168110, -9433896, 1971927, 410706, -4917201, -601295, 4755066, 1052804, -12494597, -3794067, 7180112, 8575976, 4041564, -10386305, -4059281, -4191888, -2138894, -2530273, 209917, 2976949, 92879, 860604, 9822590, -361851, 5753109, -4434017, -552977, -5016522, -598611, -3123515, 5630702, -3901978, -6356015, -389768, 9089225, -129923, 9009768, 4730907, 366683, 5745593, -1621887, 12825846, 465467, 6113886, 6842420, -232465, -6842420, -1423245, -8092256, 3280818, -6039261, -3488050, -5675800, -3766686, -3195993, -1846299, -104153, 3021510, -1170916, -4934381, -4825933, 500364, 5342940, 9993852, -14965814, --2756832, 12495134, -6210523, 2257005, -9649718, 4216048, 17633526, -2430952, 957241, -801011, --12410845, 940598, -751082, 18617610, -5848672, -995896, 8227547, -5240934, 11649562, -7909183, --1093606, -11916924, 13434121, 66572, -5163625, 42413, 4991826, -6345278, 9392020, -1134408, -8346195, -217433, 4439923, -13076565, -8165807, -6203007, -1781875, 7587597, -11531987, 6047314, -5010080, 1412507, -4650376, -7286412, 16291885, 2947421, -1599339, 5975374, -5439576, 3101503, --7301982, -7729331, -2809446, -5307506, 17683990, 4849018, -3107409, -5523865, -6246493, 5076115, -4933844, 1232119, -5636071, -1183800, -1933272, 6957847, 1303523, 5514201, -13267691, 7123204, --274341, -117575, -244813, 2091112, -3854196, -311385, -1649804, 5861557, 2653753, 4745939, -1081795, -416612, -2447595, -8488466, -2953327, -5649493, 2688650, -790811, 11576011, -10612864, --13496935, -3799436, 3587908, -4578972, -3626026, 9727027, 1581085, -6189585, -7001871, -7299297, -10727218, -6193343, 7093139, -4206384, 7804493, -8829379, 1334661, 12153684, 3867618, -17917530, -3500935, -200790, -2714419, -2144799, 1283122, -2684355, 1183264, -3454228, 885300, -1341104, --8255464, 7110319, 7450158, -3039226, 8304320, -8206072, -1823214, -2867428, -4108136, 8988293, --7517267, -13124346, -7474854, 1560684, -10640245, -10208064, -5251672, -4012573, -7022809, -1417339, -7723962, 7793755, 772557, 8405251, 2379949, 165356, 6583111, -8866960, -1833414, -1488206, -19488414, -9390409, -9020505, 6370510, 15882789, 3193845, 14328011, 8207146, 13035763, 5818070, --2209761, -5716602, 4801774, -9494025, -7100118, 10824391, 9180493, 22500260, -359704, 3202972, --8075613, 8731669, 4151086, -9918690, -2131378, 12749074, 200253, -13931800, -5399848, -7851200, --2423972, 7828652, 7423851, -5283884, -2305324, 9736691, -9154186, 4326643, 8476118, 9781788, --4944044, 8405251, -3271155, -12775917, 4798016, 11636140, -2819646, 3307125, 3169686, -4046933, -1750736, 3402688, -3303904, 1185948, 9805410, -5712307, -2600066, 8579734, -1520418, -1946157, --14125611, -5333813, -8375186, -14610942, -9298604, 6953552, -4314295, -6446209, 12873091, 12116103, --2707977, 13008919, 5837398, 8356933, -1978906, -7428146, 5977521, -9786083, -10461467, 14105209, --2373506, 32260036, -13316546, -6302328, -751619, 7827578, -4509179, -4461398, -13309030, -15467251, -6955163, 1257889, 21259552, 6798397, -2164127, -2524904, 14126684, 14305462, -11902428, 8531416, --11368778, 2858838, -4892505, -6010807, -3485366, 2260764, -1846299, 7311108, 3754338, 8185134, --1046361, -4209068, -7873749, -1752884, 9142912, 569083, -12186970, -1804423, 2929705, -5494337, -9596031, 7817378, 1639604, 2477659, -26636314, -10565083, 9194451, -1048509, 14799384, 3693135, -16669305, -2404645, -9262097, 8402567, -5291400, 5484673, 839666, 23772644, 19942606, 1584843, -5355824, -4256850, 7594039, 7479686, 8671002, 8734890, 15538118, -1804960, 2035278, -8116952, --6539088, 2536178, -8998493, -22841172, -28036472, 22135188, -637266, 2531883, -7772280, 12427488, --26629870, -17035450, -5390721, -6797860, -656056, -23820962, 4661114, 548682, -652298, -10829760, --11103564, 4598300, 15204184, 2454037, -20302848, -4287451, -16619376, 13259101, 8483634, 805843, --7342784, -3316252, -3731253, 11005854, -1505923, -11274, -2293513, -14476187, 7707856, 10567230, --6083285, -3007014, 8121783, -15693274, -11542188, -17313014, -5834713, 4828080, -11085847, -4955319, --265214, -17821430, 5842766, 11799886, 20271708, 3446175, -1632088, 1857037, -12724377, -9604621, -15775952, -316754, -5243082, -2751464, -22737556, -11598559, 5382668, -3863323, -1773285, -598611, -16475495, -1252520, -13138842, 2798708, 13116830, 1642288, -4858145, 2232309, 3840775, -2914135, --6191732, 3593814, 15702937, 14514305, 5795522, 23993834, -9487583, -3905736, 4573604, -5122286, --959925, 8486319, 25559888, -3032784, 5834176, 823023, -721018, 586800, 28084792, -12209518, -14951855, 888521, -17109002, 6987912, -16969416, -9771051, 11039677, -8250632, 8038568, 1517734, -1762547, 13381507, 10577431, -13523241, -15884400, -11315091, -3411278, 6007586, 5603322, 3071975, -4096862, -18717468, 3870839, -9406515, -24409910, 18562848, -4142496, 17580912, 18100602, 2471754, -7301982, -7694434, -10360535, -18284212, 5456219, 19848654, 4132832, -6288369, 2030446, -2244657, -3782793, -8835821, -7714835, -8725226, 2942590, 770410, -2318746, 13928042, 11809549, 8701067, -18459770, 4464082, -16469052, 26023744, -15284715, -2057289, -2369748, -297963, 22138408, 24900610, -6554120, -43995496, 2588792, 13716515, -13888850, 10060424, 18959060, 1909650, 5848672, 12397423, -9693204, 4435628, 17126718, 4727149, -1291711, 31453120, 12256226, 5056250, 14083735, -8943196, -17060146, -10180146, -40265, -149787, -2781528, -15523622, 6527277, -10637023, 22588306, -761820, --3318936, 33003602, 5187247, 5851893, 11526082, 2413772, 7039452, -5909875, -12932683, -331786, -10296110, -15159624, 19997368, 18486612, 13638669, 4628901, 8503498, -10029822, -10845329, -17362406, --7313256, -8728984, -8664560, 5840082, -857920, -16900160, -7162395, 17557290, 690953, -13630616, -9533217, 681826, -9334575, -22972170, 2650532, -35570384, 22513144, -10981158, 20454782, 2709051, -6037651, 2488397, -7384660, 11767137, 30517890, 11869142, 8711804, 23960012, -34206732, 12717935, --20222854, 16234976, -8841727, -14772540, -4504884, -16937204, -7280507, -4288525, 5489505, 6847252, --5136781, 22877144, -1461900, -4750771, -3491809, -22046068, -2665027, -631360, -18231062, 5027259, --15559593, -20045150, -6466074, 10871636, -32154272, -22461068, -14658723, 875636, -22533546, -19813222, --15505906, -8530879, -6300180, -3731253, -15151571, 15398531, 2813741, -2372433, -11218455, -12421582, -22031034, -19847580, -12839805, 4959614, 6086506, 7080791, -10752987, -16172162, -6114960, -3626563, -7631620, -11808476, -3886409, -5259188, -12554189, -23219666, -27697170, 26240640, -28604482, -2279554, -3111704, -5737540, -4267050, -26897770, 11586211, -6780680, -26059714, -998043, -4211216, 25782152, -8640400, 18530636, -30390114, 34283504, 5124970, 3055332, -6364068, 17147656, -107374, 28512140, --8214125, 19372450, 10446971, -29175712, 12141336, 4097936, 13342316, -2969970, -7845832, -12062416, --4401805, 13272523, 30565672, 2511482, -4669167, -20241644, 7186554, -21870510, -3476239, 20375324, --19325206, -881005, 1227287, -4272956, -7356205, -9172976, 33982856, -8425115, -8470212, -5249524, -7637526, 10258529, 4194573, -672699, -7038915, -1404991, 5005785, 19334332, -4857608, 28176596, -17202418, 7295539, -7255274, 24203752, 29194504, -4132832, -7959112, -3359201, -9762998, 984621, --9720585, 12739410, 4706748, 19120658, 16057809, -28489054, -29964914, 32742684, 25543782, 1398549, --5883032, -17019344, -20566450, -10896332, 18257906, -22382686, -22568980, -6995428, -9146133, -31875636, -14430016, -13521094, -5011153, -3581466, 2103460, -448287, -19852950, -55756192, 26537530, -27295590, -9814537, 38193532, 5044976, -17326972, 10361609, 12704513, -6622303, -13335873, -3505230, -27941984, -7988103, -29007672, -17977122, 10332081, 234613, 3918621, -26292716, -6109591, -19236622, -16496969, --23517630, -8841190, 6816650, -14418205, -14578193, 12306155, 917512, -2091649, 3309272, -26974542, --2507187, -21208548, 16404628, 3764539, -50362248, 11436424, 25627532, -6704981, 14943265, 12250857, -8125005, 6123013, 24480776, 18747532, -86436, -19252728, -4622459, 18898930, 12263742, -17999672, -494458, -20870320, -6984691, 15569, 13634911, 17678086, -35505420, -29130078, -15896748, 1385664, --10682121, -5529771, 32423782, 3544959, 7670812, 23548232, -11014444, 5651640, 19289234, 18664854, --29474750, 7497403, -5435818, -6976638, -5938329, 21599390, 12103755, -13935558, -7334194, 16704738, --26927298, 2615635, 11499775, 16706886, -2069637, 4467303, -31568546, 855772, -13240847, 11959873, -5381594, 19195820, -27539330, -13635984, -2816962, 4499515, -1075352, 6568616, 3505767, 16680579, -31180926, -17908940, -22810572, 7299834, -23804856, -6579353, 12160126, -17530982, -16301012, 2367601, -12640626, 16335908, 12632036, -6048925, 139050, -31390842, -20008642, 29483876, -18092012, 39498128, --14562623, 8717173, 7534447, 543850, -26472568, 36435280, -14584098, -2522220, -4341138, 14747307, -28937342, -26255136, -13199508, 32687386, -21234318, 819265, -6449967, 7375533, 39430484, 1083942, -91268, -21912386, 31288836, -8286603, 10663867, 7905961, 1970853, 18016850, -19694036, 6047314, -16967806, 16915728, 37611028, -23201414, 34547644, -5501316, -22177064, -21393232, 5873905, 14907295, --9715753, -3954591, -15268609, -5698348, 29177324, -19787988, -1780264, 24067922, -7453379, 14695231, --9256728, -3641596, 24779814, -31139, 1261110, 24767466, 16517370, 6776922, -3011309, 21147882, -27426050, -27029302, 25730076, -23702314, 12929462, -16750909, 3516505, 22536230, 7027104, -47170552, -21191906, 15105400, -522912, 25996900, -38871600, -5895380, 25680684, 23900956, 3191698, 36748276, --19204946, 2314987, -5140002, -3329674, 14263586, 8474507, 25385942, 24351390, -17299592, 17291538, --31431644, -6260452, 1304060, 2081985, -3611531, -687732, -48980880, -21124260, -38271380, -18468896, -25765508, -8110509, -4491462, 16559246, -11991012, 11466489, 29496224, -16365436, 11338714, 14542759, --21375516, 2684892, -26279294, 9916006, -2893197, -14012868, 20646982, 556198, 32253056, -2043868, --24358370, 40909028, -7509214, 4018479, 5495948, -38533372, 11401528, 33013802, 11610907, -14490146, --25393458, 2509872, 5907728, 28181428, 18000744, -9370545, -5785858, -22214644, -93952, 31847720, --43866112, 13008919, 30072824, -27611808, 9654013, 2583960, 10122164, 31745178, 10232223, 12034498, --6441377, -31833760, 32021666, -6469295, -17253420, 67826120, 32955284, 16887274, 2281702, 939524, --32911798, -27048094, -12789876, 19292456, -1587527, -19548544, -14147622, 24298240, -16531329, 16258062, -8765491, -13889387, 17441862, 6918656, -28275918, -15431817, -17001628, 2150168, 16235513, -36690832, -11680700, 41966664, 69909720, -11537356, -2172717, -57137024, -19027242, -42008540, -27848568, 39034812, -2985002, 10624675, -32145146, 10513006, -28171228, -64019172, 9628243, 30736934, -2214593, 3944928, -33463164, -43943956, 50485728, 24907590, 16052977, -24915106, 34132640, 64856692, -12435004, 19965156, -49844708, 41522672, 74056512, 15826954, 26985280, 19840602, 18537078, 62957780, -15735686, -7687455, -24012626, 13623099, -6059662, 34505768, 2954938, 7086159, -19672024, -56622700, 3192235, 37366216, -6813429, 22520124, -39517996, 2250563, -52832928, -192737, -56757456, 3691525, 42324756, -5508296, --15644955, -55813636, 74512312, 12802761, 6990060, 74778064, 1503775, -17702244, -9910637, 3271691, -18346490, -4945655, 4308389, -7099044, -34540664, 21650930, 16773458, -19714436, -70648456, 5870147, -101004744, 16697759, -17743046, -16714939, -42546484, -27023934, 3744138, 63936492, 13265543, -38787848, --530428, 19127636, 6485938, 3582540, -1595044, 13065291, -26917634, -8672076, 17513802, 36484672, -36936720, -30128658, -9955197, 4847945, 7147900, 11046656, -34790844, 5985574, 8696235, -7452842, -29497298, 2114735, 33656976, 49103824, 25019796, 12093554, 23030688, -24068996, 26806502, -18954764, -38778184, 66123704, 23735600, -31896574, -26855894, 31365610, 13377749, 56795572, 43671764, 15033459, --7248831, -9569724, 4648229, 5455682, -15853261, 23757074, 21552682, 6210523, 52170432, 36295160, --1289027, 26695370, 29963302, 15234249, 30054034, 3949223, -43125768, -2972654, -7610682, -8048232, -56817048, 26955752, 12765717, -3056943, -17034378, -72025528, -17470854, 36042828, 18516678, 81993608, -2257005, -15111842, -40312028, -77270760, -83981104, -16562468, 32985348, 36553928, 23181012, -44372916, --56673168, -3569655, -8781061, 18498424, 54831164, 25610354, -7357279, -37557340, -48256104, -32630478, --37044, -32139240, 9211631, -27598386, -13632226, 34053720, 29554744, 23917062, 9132174, -43095164, --12605729, -41541996, -30374008, -19408958, 20334522, -8727374, 21731460, 52776020, 58409944, -29980482, -5328444, -49459768, -31852552, -26536456, -5380521, 2640331, 33280628, 31222264, 49670224, 30175904, -11542188, -31909996, -24899536, -12560095, 14865419, -49233748, 1383516, 40904196, 37197100, -18855980, -50847044, 37692632, 24301462, 38758320, -96273840, 10248866, -30537218, -42780560, 9419937, -30746060, --15760919, 37589016, 15997143, -105924632, -122119344, -132191576, -133933720, -186293664, 1904818, -57659936, --9482751, 40709848, 80600432, 108095736, 110452064, 212178896, 225792336, 186988912, 141905712, 150296480, -143065360, 64088428, -6324340, -75322456, -76608256, -123379376, -31955630, -60589104, -43015172, 8506720, --104301672, -19936702, -92111480, -14891725, -107905688, -99478960, -40687300, -80014704, 1505923, -34174516, --32833414, -57033944, -35903244, -92840552, -64632816, -27576912, -27099096, -44121124, -25638270, 6895033, --37329708, 25552372, 74017320, -42673184, 85280872, 56556668, 110681848, 114527984, 96151968, 121487984, -98255432, 165320272, 158137472, 130129456, 166019280, 146389136, 215013584, 216574256, 245936272, 194102992, -197500320, 222690832, 184506432, 232209024, 144846704, 237232512, 146835808, 4883915, -65832720, -116003848, --93619016, 0, 0, }, -}, -{ -{ --3456375, --2316598, -3061238, -3729642, -3496640, 3483755, -8136279, 923418, -1453310, -2848637, 7288560, --2356863, -2164127, 4657892, 719407, -3473018, 1116155, -1416266, 1225676, 949188, -588411, -3830037, -1297617, -4027069, -345208, 1193464, 1972464, 2501819, 62814, 1534914, -1029718, -5698348, 3857418, -4274030, -2419677, -2046552, 1655710, -3001109, -3505230, 4099546, -1772748, --69256, -380641, 1111323, 3718368, 3384434, -1574642, -996969, 2645163, 1229434, 806917, -283468, 2208687, -3189013, -2115808, 200790, 1901060, -2298344, 1586990, -4053912, -265751, -2793339, 2028298, -1389959, 2391223, 278099, 3365644, 1217086, -1560147, 4572530, 6152004, -2249489, -1038845, -477815, -2959233, 5129265, -333397, 2035815, 711891, -4708895, -3576634, -1081258, -3235721, -4732517, 2507187, -661962, 560493, -2763812, 1818919, 74625, -4219269, --298500, 4589710, 3723737, -3068754, -5286031, -4849555, 584116, -1221918, -1033477, -4150012, -4258460, -1300301, 1123134, -1970853, -1218160, -542777, 1550483, -1332514, -2404645, -8955544, -2891050, -818728, 2742874, 1537061, 1093606, -383863, 5770826, 944893, 1072131, 657130, --3105798, -2087891, -379031, 260919, -3107946, -886911, 1071058, -593779, -2942590, -1682554, -3758, 2586644, -4453881, -6103686, -7419019, 2379949, 4083977, 202400, 3353833, 2306934, -366146, -6961605, -310311, -2038499, -2513630, -209917, 164819, 2367601, -918049, 3085934, -4058744, -1040456, -147103, -6015639, 5197448, -6876243, 2528662, 11365557, -2551748, -4337917, -547071, 5895917, 529892, -1772748, -935229, -1783485, -1193464, -5448703, -2207613, 2583423, --4386772, -2508798, 124554, -301185, 4599373, -2943663, 758599, -1175210, 905701, -657667, --2885144, 5171141, 8758512, 2199023, -639950, -1717450, 9483825, 399969, -4162360, 223338, --7316477, -16643, 3600256, -5546951, -846645, 1144072, -4547834, -1358283, 4914517, 689342, --697932, 4860293, -3408594, -5167383, 2753074, 1907502, -3748433, -1799054, -4002373, -4522064, --5003637, -2694555, -2923799, 3921842, 2651069, 765578, -242129, -2726767, 2420214, -585726, --1925756, 3341485, 3699041, 5826123, -8546448, -5646272, -2054068, -1257352, 261993, 1080721, --8155606, 5630702, -2596845, 1832877, 1132261, 1868848, 3517578, -32749, -1211181, -2710124, -5814849, -465467, 3765613, 7225209, -1607392, 6146098, 5199595, -4538170, 2994129, 3080565, -3252364, -8005819, -842887, 492848, -2567854, -5025112, 28454, 5904507, -1432909, -2495376, --2032593, 1828046, 5399848, 2727304, -2844879, -8590, -2358474, 274878, -794032, -2670396, -5029407, -6529961, -5509370, -4935991, 1473174, -633508, -256087, -6065568, -6568079, 1666984, --223875, 464930, -733366, -234613, -4944581, -2740726, -5407364, 1181653, 4411469, -1247688, -3881577, 950798, 3409667, -7493644, -173409, 1421097, -2843268, -737661, 678605, -2716567, -922344, -379568, 5217849, 8192113, 702227, -2824478, -6595459, 3319473, 2206003, 2098629, -8642548, -5311264, 377957, 1248225, -1353989, -2545842, 1425929, 754304, 5267778, 11469173, --824097, 2170032, 4863514, -1814624, 4350802, 7534983, -4951024, 35970, -1756105, 120796, -3398930, -5467494, 6283537, 1598802, 196495, 3469797, -416612, 4716948, -2325725, -809601, --1164473, 7278359, 3377992, 4715337, -772020, 3922379, -6779069, 8132521, -3008625, 3326989, --7166153, 3118683, 5259725, 9851044, 3552475, 1999844, -6355478, -2241436, 1724966, -4626217, --5767068, -1190243, 11319923, 13346611, 2424509, 3229279, -3906273, -1582159, 7202660, 1482301, -3011309, -477815, 1981054, 1819992, 5907728, 504659, 1027571, 8167954, -6251862, -7376070, -12388833, -2749316, -1620276, 8279087, 5029944, 981400, -13547401, 15367930, -2445984, -1470489, --1282585, -383326, 877784, 1368484, 4955856, 7435126, 4871030, -530965, 8098698, 5451924, -2780991, 2607045, -2619393, 4089883, -5370857, 5027259, -603980, 2431488, -4512400, -6356552, -1139777, -288300, 2790655, 4785668, -1807644, -5997385, -3617973, 2287607, -7703024, 5824513, -1852742, -11975979, 5990406, 1617055, 3542274, 1595580, 2244121, 2963528, -236760, -2727841, --2812667, -7763691, -6051609, -2589865, -4091493, 25233, 872952, -5273683, -8578660, -199179, -6268505, 11275900, -17717, -5366025, 1688996, -9075803, 1416266, 877247, -3269544, 10642929, --13427142, 7191386, -2430952, -4665945, -3673271, -4454418, -6301791, 12630962, -15704548, 3919695, -3991635, 5371394, 7909183, 1457068, 2309619, 3106335, 2255395, 1805497, 2780991, 7015829, -1385664, -3558381, 147103, -457951, -4730370, -4212826, 2415382, 4779762, 5073967, 881005, -3662533, -8046085, -804233, 106300, -296890, -7602629, -4530654, -2584497, 5282273, 4836133, -84826, -8323110, 216896, -4386772, -3149285, -1421097, -2127083, 5657546, 7511361, 2507724, -7814156, -11899744, -8317204, 4364224, 2703145, 737124, 1839320, 1137630, -3710852, -7310035, --5037997, 4451197, -3148211, 6633577, 6439767, -1776506, 6156836, -8724152, -4158602, -2017024, --2638721, 1366873, 17391934, -1532230, 5517423, -1379758, 14082124, -2492155, 555125, 6040872, --13064217, 9287330, 4782446, -7267085, 8446590, 9462350, 3272765, -14088566, 8994198, 590021, --1191853, 7444789, 7968238, -228170, -2157147, 448824, -5398774, 5416491, -2887829, -5053029, --10975789, 2834679, -11944841, 3489124, -2825552, -1100049, 3617973, -9586904, -3915400, 8453569, --587874, -3546032, 5134634, 617938, -4175782, 4003447, 1462436, 671089, -1727651, 3146601, --5882495, -296353, -8644695, 8629663, 8385387, -9944997, 6991133, -6971806, -2678449, 7521562, -10048076, -294742, -4868883, 3463891, -540092, 1921998, -12085501, -9096204, 1997697, 2294586, --2559264, -1879585, 3222299, 311385, -4251481, 5912023, -4914517, 2616709, 3775276, 163746, -5895917, -4629975, 3947075, 1779190, -4967667, 9867150, -3250217, 4858682, -9768903, -586263, --2516851, -8832600, 393526, 6440841, 11314018, 14823006, -8296266, -106300, -10362145, -648003, --6576132, 6070937, -6155762, -12164421, 861141, -7740605, -677531, 10355166, -5990943, -5878737, -11006391, 500901, 1934883, -977105, -6389301, 2908767, 2383707, 13377213, -9060770, 6659347, --7680476, 2119566, 2601677, -7418483, -4655208, 12882218, 3499862, -9206799, -2401961, -3220689, --7538205, -80531, 12448963, 6903623, 8669391, 2237141, 3480534, -11062225, -1617055, 14706505, -1165010, -8654896, 4818417, 5090073, -6549289, -5382668, -3137474, -14443438, -2240899, 4794257, -7382512, 13433584, -3155727, -6643778, -1873680, -3901441, 10936597, -3319473, 5551245, -22728430, --15906948, -10473815, 383863, -19170050, 1974611, 12899397, 3747896, 13303661, -8333847, -4263292, --2310693, -8099235, -3522947, -11770358, 18739480, 10361072, 6994354, -17288854, -3984119, -6105833, --11533598, 2911451, -1934346, 2674691, -14142790, -1729798, -2011655, -10394895, 4745402, 757525, -8952322, 3099893, -9023726, 12045773, -6946573, 4376035, 1853815, -976568, 9328132, 8600672, -1504849, -13196824, 14104673, -8507793, 9841918, 3976603, -6504728, -7141457, 11107859, 799938, --2387465, 2144799, -11200738, -4677757, 4837207, -1909650, 9593346, -7261716, -10766409, 2818572, -1558536, -857383, 9376450, 3330210, 842350, -8081518, 6301791, 1635846, -7485591, -2305861, --2421288, -5013838, -4650376, -4619238, 1335735, -13412109, 19075024, 8190503, 21737366, -9079561, --11030550, 20793010, 1089311, -1596654, 4839355, 2068027, 12260521, 16358457, 2424509, -14181445, --23218594, 3847754, -6178311, 1988570, 973884, -9640591, -364535, 13401372, 10763188, 8826158, -16772921, -3153043, 14226542, -9250823, 12600360, 4672388, 9781788, -5845988, 17072496, 10344429, -12475806, -19014894, -10737, 18451716, 10210748, 3847217, -4222490, 27451820, 11302206, -9920838, --6563247, 7148973, -10365904, -399432, -5097053, 1974611, 22298934, 24190330, 16831440, 6863895, --199179, 9437654, -8328479, -1453310, 9069360, -9524627, 23131084, 15343234, 10810433, 5030481, --2034741, -10921565, 12778601, 782221, 10582799, -5367636, 2441152, -7953743, -7920457, -413927, -683437, -9491878, 22990424, -1362578, -11428908, -5132486, -8986682, -326954, -14392435, 3745212, --12427488, 7033009, 1478543, -3257733, -9827422, -11502996, -17714056, -18118320, -5559299, 15948824, --1340567, -10159745, 4090420, -9657234, 7371775, -8200167, 14630269, -14990510, 3366718, -10539850, --11248519, -1745904, 1677185, -2911988, 6788196, -21560198, 8612483, 2485712, -5487895, -1107028, --1662689, -10394358, -17586818, -18144090, 13202729, 7153268, -7477538, 12172474, 189515, -4221416, --13874892, -28134184, -23867670, 14162655, -4270808, 1092532, -2944737, -497142, -1430224, -18577344, -7410966, -22030498, -12240657, 2171106, -591095, -3705483, -2864206, -1719061, 24142548, -5851356, --7202124, -4757213, 25679072, -2553895, -8802535, 18024904, -10524817, -5110474, -6893960, -4039417, --34293704, -25977036, -14979235, 29360396, -1800665, -5270999, -3907347, -2671470, -10053982, 10165114, -7853348, 26216480, -24770688, -5129802, 7298223, -18288508, -7419019, -6708202, 30360586, -818191, -6826314, 15198279, 1190780, 14607184, -16394427, -20731270, -13815299, -4137664, -3653944, 2029372, -9376450, -874026, -17311402, -12232604, -1044214, -9562208, -19382650, 16740709, -3017752, -10011569, --261993, 5083631, 5319854, 2776160, -8809515, 1318018, -17990008, -8261370, -26616450, 12022150, -7913477, -3572339, -8411693, 9363029, -13289166, -3810173, 28528784, -3442953, 24173150, 10418517, -6438693, -6762963, -30500174, -13062069, -5911486, -16768626, -12312597, -8156143, 13562433, -6513318, -230854, -12406550, 25848724, -9207873, 10539313, 8121783, -17507360, 19730006, 1251446, -7897908, -12957916, 8374650, 38915624, 3442416, 2492692, 15176804, -14532022, -9247065, -1223529, 5264556, -8031052, -2206540, 17648558, -7283728, 4234301, 16958142, 8662412, 7764764, 7495792, -8459475, -4112431, 2065879, -3226594, 4668630, -5784784, -11508902, -5224291, 3599720, -11682311, 20321638, -780073, 4358855, -357556, 14864345, 15896748, 66572, -8093329, 1792612, -1144072, 19073950, -23021562, -12010339, -8079371, -4592931, 7378754, 18524730, -11716671, 7725036, 1581622, 6438693, --5005785, -6383932, 5277978, 13645111, 4185983, -9110163, 13783087, 37355480, -8516383, 10158671, --95563, 6720550, 15515569, 8067023, 17950816, 17539036, -581431, 24799678, 38716444, 7209640, --9721122, 41508712, 3848291, 39932460, 424128, 8360154, -21597780, -6005975, 37648072, 7457137, --15073188, 6356015, -10995116, 6030671, 8591008, -1608465, -17381732, -5891622, -26792006, 13102335, -11579232, -9747965, 12448963, 17767742, 5279052, -3291556, -14758581, 4929549, 28625958, -11665668, -18006650, 16346646, 4463008, 12526809, 12754442, 1492501, 15439334, 9827959, -23203560, -2672007, --7984344, 26850524, 19527068, -17249126, 13511430, -1261110, 16138340, 44071196, -1588601, -6571837, -6903623, 39670464, 18650358, -1720134, 7720204, 7697655, 25315074, 20450486, -10652056, 24394878, -13959717, 22622666, -12493523, 2879239, 7712688, 5181341, 17086454, 20732344, -9589588, -10027675, -19860466, 8500277, -1409823, -5209796, 4403952, 24982214, -41136124, 11710228, -10998338, -10558640, --8827232, -8426189, 6084895, 7978976, 8300561, -9947144, -12093017, -31148176, 1489817, -17239998, -28618978, 3805341, -7421704, -3904662, 17127256, 5312338, 27799712, 11642046, -7323993, 1583232, -5760088, 13137768, 20799990, -22966264, -20489678, -3751654, 35017944, -10324565, 4234301, 10616085, -15140833, 19322520, 26447334, 23758148, 1652489, -4872104, 24593520, 2617246, -16413754, 9183177, --15308874, 11414949, 2099702, -12426414, 11446625, 47841640, 25543244, -15805480, -13310641, -870268, --13839995, -12067784, -12031814, 8979703, -7284802, -10081899, 1465658, 13903883, 6680285, 5277978, -17352742, 5974300, -5698348, 20573430, 15136538, -13034689, 8174934, -14813879, -13958107, -12956306, --1654636, -32869384, -11834782, 25156160, 15643882, -6278706, -11911555, 11500312, 9446244, -15358266, --6065031, -34460672, -1930051, 30441118, 1252520, -20680268, 4380867, 1966021, -13631689, 20633560, -12267500, -6930467, 6495065, 9902584, 13041131, 7750806, 3003256, -7718593, 5662915, 8031589, -19706920, 29146184, -6806450, -17850420, -9046275, 6444599, 6773164, 24229522, -7909183, -16987670, --13167833, -13342853, 28937880, 52461416, 19600620, 3776350, 57253524, 4617090, 24340654, 14577656, --3694209, -10492068, 11071889, -14625974, -9540196, 12794708, 1916092, -32456530, -33914136, -7283728, -15921981, -16751446, -21652540, -11008001, -15603079, -12271795, 13374528, -7914014, -24417962, 13682692, -2821257, -5464809, 8089571, -3530463, 15397995, 55414204, -29703994, 29650844, -33577516, -17144436, --8048769, -3298535, 26949310, 1219234, 29003378, 18789408, 17006996, 24739012, -27954332, 11316165, --29292750, -807991, 39336532, 34949224, 15205795, 901406, 7201050, 4746476, -10668162, 9353365, -11680700, -48654464, 3496104, 7521562, 15395310, -17643188, -27078696, 20527796, 10081362, 5429376, --11275900, 24265492, -2854006, 18907520, 16022912, -1612223, 2892124, -5199595, 19420232, -11006927, -6298033, 11551851, -458488, 24307904, 14512158, -1208496, 12919262, 14195404, -195421, -10803453, --36217312, -6709276, 4449049, -21723944, 2622078, 17366700, -32884954, -14852534, 5618891, -14435385, --1846299, 17492328, 1477469, -12660490, -15847356, 6977175, 7441568, -34120832, -10939282, -3282966, -368830, 20565378, 10482405, 1505386, 36917392, -5874442, -1734093, -293668, -22560390, -8826695, --34178276, -29754460, 6045704, -15102716, -4344897, -22849762, -28470264, -30100742, -19504520, 22181896, -30292404, 1190780, -23885386, 2320893, 1744831, 695785, 11915313, 19318762, 19600084, 807991, --11647951, -30141544, -16804060, -26362510, -5046587, 399432, 2941516, 3018288, 4457103, 7591355, -10241886, 18172006, -27442694, 12571369, 5671505, 6399502, 15874736, 26884884, 30783104, -17160542, -14157286, -23796804, -6671695, -21614422, -1311576, -8417062, 50705848, 17701170, 36761700, 1471026, --18460306, -8373576, 23842438, 24775518, -13822279, 45829984, -18471580, 2603824, 2819109, 7646116, -17675402, 50760608, -2857764, 11972758, 29174102, 5790690, -22033182, 13431973, 52799108, -10776073, --12529493, -32547800, -2878702, 16942036, 10662793, -2404108, -26386132, -4393215, -5581310, 9771051, -46251964, -2764885, -555661, 19390704, 3554086, -64617248, -20458540, 45242112, 14928769, -13778255, --25827248, -3991098, -17125108, 23124104, 12023224, 4009352, -13738527, -30823906, 6366216, -52799644, --6536940, 25198036, 34853660, -4459250, -29778618, -20646444, -61366492, 17574470, -10675678, 23589572, -18147848, -17841832, -12646531, -54817740, -40793064, 20865488, 58081916, 22745610, 27688044, -19705310, --34260416, -33453500, -13613973, 48899276, 66678292, 34257196, -76775224, -28624346, -58678380, -31933618, -73803104, 17566954, 16854526, -10005126, -69876968, -58034672, -57175680, -10993506, 6571837, 36375688, --12461311, 27666568, -54666880, 34691524, 15476378, 4151623, 72258528, 4392141, -4133906, -3676492, --92309048, -30176440, -1595580, 2339684, -29548838, 51047832, 20735028, 22397718, -67610840, 11309186, --93420904, -22014392, -2359011, 11111617, 3113851, -60325500, 29535954, -17999134, -12764106, -12763032, --14715632, -16071231, -20408610, 36639292, -13311714, -34612068, 8129300, -10971494, 1599875, 16870632, --39677980, -14903000, -4822175, 14042396, -978716, 40650792, -6220724, -25627532, 52991308, -48587892, -24786794, -45130980, -17275970, 19931870, -38392712, 1245541, 22769232, -14740865, -6114960, -3908957, -29999810, 49349176, 26014616, -18178986, -10355703, -9012452, -267362, 15197742, -10314901, -11034308, -6065568, 4315906, -95627984, -4496831, -7554848, 12646531, 6978785, 27917, -4574140, 25667262, --33967824, -7632694, -8434779, 19921668, -79947056, -9904195, 59010704, -16047072, -36714992, 1995549, -24655796, -13925358, -24046986, -68793032, -56909392, 46551004, 39276940, 2157147, 42053100, -49677204, --4786204, -94290640, -34936876, -18044768, 42790224, 39238284, 22932442, -38854960, -14959908, -3171833, --19942606, 7300908, 14032732, 19618336, 25914758, -22870164, 13519483, -41441604, -27637040, -7668127, --10832981, -209917, 24187108, -32865090, 24958054, -13400298, -19971062, -8113193, 155693, -40783936, --3317862, -36965172, -15891916, -14906758, -36673116, 46129560, 19069654, 9877351, 8954470, -9810779, --50496468, -71667968, -44097504, -42315092, 25757456, 6347425, 27947890, 42312408, 32498944, -11684459, -5793374, -24562918, -21486648, -22264574, 14950244, -23394686, -3752728, -22050898, -26039850, -13796509, -25132538, -20888574, -8754754, 4268124, -5605469, -29144574, -37287296, -15729244, 31261994, -6642167, --91781840, -127464432, -119808112, -113805360, -137735840, -16505559, -32066762, 33761128, 49643916, 138522896, -92348776, 118535728, 161130528, 175563760, 123045448, 153419984, 91435024, 46099496, 2529199, -20140176, --28879896, -54481124, -52150028, -76576584, -27040040, -23901494, -70369816, -52030844, -48015052, -57438208, --95891048, -64557116, -46489264, -37724844, -72099080, -5319317, -16132971, -27713814, -69819528, -66328792, --51490216, -45528800, -29301340, -10335839, -42168524, 18414672, 32423782, -34920232, 49780820, 63210644, -63860796, 107268952, 90803128, 67314488, 77254648, 73461120, 76421960, 109945792, 127446712, 120297736, -85701776, 128239136, 130627672, 129950680, 136406544, 148163488, 134858752, 134708432, 186687200, 82171312, -86702504, 76345728, 70924944, -44443784, -7704635, -34548180, -97089880, -62141196, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, -{ -1824824, -1520418, 1184874, 2761664, -888521, 255551, -1235877, -4140885, -7766375, 1602560, -2968896, --4188130, -5618354, 1364189, 1056025, 4163971, 1150514, 4949950, -716723, -7343321, 2747169, --3877282, -484258, 1573032, -3115999, -4798552, 642635, -3138547, -478352, -1585917, 2860985, -2870112, 916976, -6844568, -1481227, -2626373, 5280126, 1101659, 1585380, 6161668, 2937758, -2764885, -98247, 1667521, 9698573, 4763656, -1661616, 461709, -4668630, 3338263, -275952, -527207, -5748814, -761820, -3052111, -3914326, -1592359, 4333085, 3333432, 49929, 18790, --3757023, -3528853, -1305133, -3597035, -7394323, 3778498, -3084324, -670015, -6961068, -1855963, -4182225, 2106145, -312459, -6386617, 7894150, -692027, 3128347, 1542967, 3696356, -6840809, --3745748, 4275640, 2008971, -20401, -3860102, 706522, -10600516, -6822556, -467078, -4088272, --4663261, 1817308, 8100845, 1326071, 6141267, -1494649, 6065568, -3731253, -3404835, -450435, --5689758, 1072131, 2654290, -2044941, -253940, 1422171, 141197, 2495913, -421981, -5980742, -2010045, -3707094, -2915209, 1671816, -3803194, -5563594, 5408975, -5830418, 5140002, 4940286, -3107409, -239444, -6988449, -3953518, 635655, -1249836, 8683350, -5344550, 2008434, -628139, -1028645, -6592238, -11283953, -1865626, -3482682, -3597572, -1012002, 4858682, -1153199, -4845260, -4283156, 2094870, -2354179, 3959960, -825707, 1460826, -5213554, 61203, -1300838, 4174708, -4161823, 500901, 7590281, -188979, 3212099, 4038880, -165356, -3855807, 275952, -5434744, --6959458, -2688113, -7916162, -8134131, -2744484, 5201743, -2016487, -1916092, -4317516, -1141388, --7454453, 3502009, -2183454, 1733556, 4263829, 1418950, -1677185, 2953327, 2730526, -3641059, -2346126, 267362, 525060, 2620467, -6529424, -2813204, 4386236, -2953864, -352187, -1894081, -4882304, -6482180, -676994, -5432597, 3354906, -357556, -536334, 4837744, -2245194, -2370285, --1821603, -4578435, 189515, -2084133, -494995, 282931, 2968896, 3133179, 935766, -1411434, --5492190, -8803072, -2835215, -622770, -2270427, 4710506, -1988033, -2732673, 3714073, -2467459, --3795141, 8274792, -1778117, 9217537, -5408975, -2396055, -3841848, 3608846, 909459, -105227, -6709813, 1851131, 2148021, -9038222, 1978906, -4045859, -4820027, -6271726, 140123, 564251, -8070244, -6062883, 3200825, -2342905, 9913321, -3143916, -2973728, 7238094, -2403571, 2736431, -1264331, -89121, 1359357, -4241280, 968515, 601832, 2166811, 9488120, 3380676, 1251446, --3676492, 3594351, -6864432, -1538672, -1153736, 4305168, 3505230, 5941551, 3797288, -3660923, --5870684, -2170569, 4816806, -77846, 2587181, -466541, -488553, 9773735, 2359011, -152471, --10861435, -4348655, 461172, 4442607, 6077916, 8946417, 4827007, -1331440, 1664837, -1313186, --2644626, 6743636, -3568044, 6996502, 487479, -4578972, 2243584, -1722819, 5128728, 1082332, -4656819, -1166084, -808528, -1779727, -5502390, 156766, 3930969, 3862249, 7340099, 3296388, --9636833, -8129836, -6977175, 207232, -1163936, 423591, -3779571, -2460480, -556198, 2826089, -5369, -6285148, 6728603, -1067836, -6139119, 1149441, 1537598, -253940, -513249, 2550137, -3627637, -2352568, 5506148, 120796, 3280281, -7522099, 5369246, 1702955, 3162707, -5239860, --403190, 3531000, 3341485, 7862475, -116501, -11303817, -2837900, -5522791, 2823404, 1590749, --221191, -3185255, 1109175, -4784594, -1330366, -8534637, -4573604, -527207, 4960687, 4898410, --3350075, -3456375, -2852395, 5018670, -1356136, -946503, -7465190, 4496294, -7303055, -3051038, -287226, -1995549, -1433982, 8020852, -678068, 2021856, -3103651, 3893925, -3503083, -211527, -5468567, 10100689, 6942278, 1311039, -8273181, -6286759, 1976759, -1614371, -5370857, -1931662, --6861747, -3104188, 13226352, 1312649, -1611150, -2739652, -172872, -3366181, -2336462, 8818642, --9585830, -1363115, 754841, -2270427, 2189360, 5222680, -2690797, -3364033, 1218160, -4124779, --3927748, -9024800, -3405909, 2076080, -7996156, -1599339, 3724811, 5608691, 1938641, -12583717, --3866544, 2165737, 6034966, -5130339, 10530723, -1561758, -5581310, -3349538, -2469606, -4553202, -5653788, -4682051, -1314797, -6081137, -4658966, -2455111, -4736275, 5789616, -2421825, -12673912, -4540854, 7907035, -57982, 2636036, -15142444, 11350525, 32212, -10101763, 812286, -6798397, --11470784, 2103460, -8544837, 8320426, 1837172, -3714610, -6965900, -11937862, -5391795, -8755828, -2513093, 15734076, 2386928, -4592931, -607201, -2614025, -2842195, -7673496, -5136244, -7890929, -1678259, -971200, 1297617, -3030100, 900333, -8323647, -881542, 1394791, -5715528, -2399813, -345745, -3354370, 446140, -3122978, 11587822, -14987288, -2918967, 753230, 3594351, -1933272, --6303938, -9363566, -6655589, 4357781, -1593433, 4880157, -4851166, 13370233, 1493575, -3112778, --450972, -8636105, -10801843, -5729487, 3660386, -9380745, -861141, 10089952, -614717, -5395016, --10307922, -17277042, 365072, 8270497, -2745021, 9574556, -1264868, -3432753, -6624450, -5768678, -537408, 3797825, -3673808, 14464913, 3752728, -4095251, 9564892, -4073777, -10856067, -2917894, --8076686, -4187593, -3442416, 11668889, -2798171, -3827890, -4774393, 7510287, 6832756, 5965173, -16504486, 17186312, 8081518, 10689637, -3869766, -4911832, 7242926, 10531797, -4411469, 4629975, -3409130, -9137543, -8481487, 5094905, -1096290, -132607, -8453569, -10990284, -2428804, -8923868, -10242423, 18751828, 4072166, 7361574, 2355253, -2279554, 6913824, -12920872, -3231963, 2581275, -7359964, -4330401, -10166188, 15031312, 178241, -4777078, -3492882, 6076305, -1648731, 5388574, --3579855, 8529805, -523449, -407485, 10943577, 3144453, 5151814, 1720134, -1447941, 7797513, --12039867, -5142687, 4742718, 13571023, -8252243, -1248225, -1564442, -2225330, -5603322, -1536525, --2747705, -4131222, 7078106, -6485401, -2378338, 6419366, -4590783, 2916283, 4880694, -8924405, --9563282, 3044058, 7722888, -2296197, 7066832, -4721780, -1982664, 13306882, -14571213, 9183714, --3995393, 377957, 613107, 16383690, -3368865, 3463891, 5333276, 9161702, 5401458, 8067023, --1083406, -950798, 2746632, 1556389, 1501091, -7463580, 12291660, -15799574, -3343095, -3917547, -9210020, -1481764, 11179263, -162672, 1241782, -18829136, -5055177, 12052215, 20087562, 188442, --9654013, -7930657, 8379481, 6959995, 5156645, 5090610, -8234526, -3451543, -4668630, 3017752, -593779, -4745402, 3301756, 3140695, -2178085, -2171643, -11319923, -2541010, -3987877, 17076790, -1775432, 3673271, 6519224, 1065689, -12751221, 1200443, -7750269, 6883759, 6176700, -12823162, --5436355, -5325760, 1472637, -1496796, 17062294, -3050501, -197569, 10546829, -10948945, -8155606, --10320806, -10741713, -3247532, -1170916, 3622268, 18318036, -2601140, -11818139, 18949396, -485868, -4677220, 12722230, 8464307, 11815455, -4184909, 9157944, -7334194, 12398497, 10666551, -3968550, -5118528, -6162741, -5860483, 4149475, 14208289, 5962489, 5043902, 1280437, -5783174, -9237401, --9479530, 497142, 9427990, -6954626, -8286603, -9867687, -4413079, -18680960, -5193689, 2459406, --14093935, 5344013, -139050, -6939057, -16411607, -11257646, -1092532, -21368000, 5237713, 3423626, --1612760, 4548371, 2492155, -3145527, -11811697, -7632157, -2452426, -7992398, 4957466, -8392903, -15475304, -12787191, -863288, 5855114, -1379221, -24619290, 8904541, 11547020, 20116016, 166967, --14646912, 4418448, 7286949, -15083925, -15808164, -9703405, -267899, 8790187, -326954, -5958194, --226023, -5164698, -3592203, -9572408, 16581795, 13221520, 4914517, -19903416, -6020471, 3610457, --1121523, -4139812, 25642028, 9772124, 8053064, 7939784, 12148315, 9538585, 2190433, 9982578, --701690, -15465640, 8541079, -15905875, 4913443, -15726023, 13578002, -3790309, 16396038, -8505109, -3863860, -6761889, 5779952, 10219875, 25020332, 5907191, -32306208, -1100585, -4727149, 7511898, -13718126, -2185602, -6565395, 10981695, -2197950, -4342749, 13380434, 1626719, -1093606, 1493575, -5367099, 11882564, 8122320, -8601209, -7773354, -5041218, -10463077, 3259343, -1869385, 11939472, -6746320, -13820668, 27065810, -10198400, -17981418, -5683853, 7059316, -4398047, 13003013, 18853832, --7553237, 17300666, 11087458, 8732742, -2862596, -2005750, -3499325, 16793322, 3019899, 2090575, --9783936, 4314832, -5150203, -347892, -16153909, 10972568, -14845018, 144955, -10514617, 17516488, --9040369, 463320, 17086454, 13169443, 8689793, -988379, -7026567, 8069707, -460635, -1495722, --22239878, -6491306, -13552769, -10765336, -8719320, -3952444, 11120207, 7197829, 6316287, 18254, -16445967, -8949101, 17383344, 15613817, 16326244, 29322278, -11901354, -8986145, 12336757, 2279554, --12065637, 17539036, -6568616, -8828305, 4938139, -2529199, -7074885, -5504001, 6573448, -10832444, -3462818, -7072201, 14882062, -7841537, -1466731, 3534758, 9600863, 14392435, -2989297, -15273977, --26382910, -22468584, -2219424, 3331284, -15754477, -485331, 66572, 22317186, -16521665, -18589692, -4415764, -8457327, -1296006, -13850733, 10888279, -14040248, -18694918, -11566347, 18783502, -14740328, --12538620, -3594351, 6807523, -7008313, -15791521, 3492882, -7231651, -878858, 5149666, -19965156, --2866354, 9605157, 15473157, -3481071, 24397562, 10455561, -4450123, 281857, 10241350, -5692443, --12074227, 1173600, 12437152, 764504, 5119064, -455803, -13120051, 3226057, -26874684, 1584306, --344134, -3883724, -16595754, -14107894, -162135, -6736120, -12037720, -7366406, -10106595, 9161702, --18560702, -9889162, -6820945, 6884296, -11883638, 20109036, -5281736, -17228188, -3822521, -10157061, --29635274, -7892003, -928250, -326418, -20716238, -8477729, -7882876, 19789598, 17717276, 5728413, -35702988, -5942624, -11842299, -10393821, -4730907, -18313204, 26036628, -14666776, -5227512, -11718281, --6066642, -5097053, 3347927, -17260936, 577673, 1022739, -2220498, 5976984, -18832894, -3962107, -13296145, -12068858, 897648, -15851651, 16287590, 1091459, -28533616, -13835700, -5094905, 461172, -8033200, -16287590, -9728101, 13114683, -2045478, 9464497, 7558606, 8752070, -10516227, 2473364, -12567611, 6047851, -23807540, 16670379, 10822244, -11309723, 36100812, 897648, -26363046, 8844411, -7904888, 1118839, 18999862, -4167729, -32854890, 10998874, 4120484, 11660299, 10893648, -12760885, -22744000, 10980621, 6483790, -3297998, 34564824, -320512, -481573, 26774290, -5429913, 13756780, -17640504, 9451076, 1044751, -1650878, 7088307, 7321846, -24896314, -24438900, 50813220, 16531866, --31361314, -15678241, -14254996, -28727426, -1908039, -15067282, 21315386, -11712913, 354872, 26474178, -821413, 4557497, -19092204, 24418500, 18323942, -130460, -5574331, -1707786, -14768782, 1321776, -2194192, 3250217, -20387136, -2835215, -903017, -6049462, -4304094, -14079440, 13807783, 26920318, -32443110, -2444373, -12697534, -5257040, -6331856, -4328790, -19390704, 6885907, 8041790, 7252589, --20209968, -27249420, 29998200, 11385421, 16957604, 21731460, 20551956, -8555575, -13452374, 19698868, --19476602, 10282152, -14489609, -11155104, -6272800, 23439784, -7351374, 4982699, 8289824, -3932580, --18469434, 39102456, -23213224, 2769180, 28237800, -25021942, -11503533, 3446711, 10008348, 29384018, -13582297, -7990787, 8674760, 34136936, 20734492, -2611877, -21169894, 2692408, 34974992, 27952184, -6201396, -26929982, -10139881, -23193360, -1372242, 18910742, 23217520, -1255204, 9052180, 27557048, -29247116, 45231376, 45468672, -22127134, 10154376, -23933706, -4077535, -19337016, -6778532, 15924665, --3190624, 7170985, 6386080, -13663365, -10012643, 11779485, 12991202, 16873316, 11975979, -257161, -12315282, 18553722, -9515500, 9513889, 10904922, 3445101, 10620917, 35167728, -26210038, -22439594, --5069135, 21745956, 20681878, -12192875, -220117, 33248952, 26726508, -18791018, -12710419, 11363410, --23194434, 6284074, -11346767, -21011516, 6362994, -24743306, 24978992, 8973797, 27626840, -12325482, --17123498, -32477468, -7648263, 9535901, -28765544, -25009058, -15302432, 13777718, 34321620, -1678259, --10063645, 22281216, 4875862, -700617, -31871878, 28905666, -13622563, -30050812, -10070625, 2694018, -35649840, 4025995, 25617870, 10928007, -29700772, -5832566, -26300232, 4973036, -26234734, -18307298, --11145440, 2086817, 5769752, -19744502, 20322174, -5699422, 12402792, 13980119, 13166759, 25279640, -44696116, 27023398, -8396124, -21029770, -674847, 47847548, 29312614, -15035607, 23423142, -8032663, -28584082, -13182865, 2804614, -9592809, -5243618, -550830, -8005282, 71606232, -13408888, -18364744, --22497038, -30515206, -12166569, -23229330, -1067836, 28452548, -10819023, 9280351, -9009231, -12643310, -24908126, -5587216, 41952704, 9103720, 33695628, -39382704, 17250736, 73246912, 26783416, -38262252, -24941948, 23925116, 2971044, -1137630, 46691128, 20536922, 3131031, -3903589, -55861956, 22562536, -31298500, -26632556, -19949050, 39119100, 24775518, -35696548, -37620156, -1218697, -22944790, 6503118, -1118839, 6077916, -35486092, 6161668, -8746164, -19063212, 27200028, -4602058, -7201587, 7347616, -22438520, 19636590, 12912282, -31008590, -1676111, -16486232, -32574642, 8385387, 6264210, 15982110, --8710194, -16806208, 36416492, -30521112, 9946607, 10728291, 8597988, 5570573, -7177964, 20132660, --23620172, -39457328, -8569533, -44804024, 34442952, 19864224, 33718716, -5723581, 4612795, -32008244, -27834072, 35560180, 11135240, -19020800, -45635640, -12529493, -59428924, -1695438, -13415330, -40771588, --35591320, 12903155, -740345, 22147536, -21588116, 26565446, 19302120, -30754650, 3064459, -4585415, --32618130, 16088947, 12438762, -14606647, 6680285, -6857452, -49778136, -12071006, 13616120, -4489315, -6607271, -26844620, 37928856, -47130824, 4768488, -34068756, 25651156, 28927678, 9763534, 24526410, -3346317, -21767968, 40860708, -16929150, 4953708, 2464238, -22378928, 39947492, 3286724, 11842835, -8930848, 13920526, 6880538, 30625802, 34100968, 13551159, 39705364, -31811750, -2225330, 2410014, -50525460, -7100655, 40291088, 24945170, 55196236, 13541495, -12331925, -14684493, 21912386, -38122668, -38778184, -20262582, -13952738, -3188476, 7607998, 32925220, -7219303, -49566072, -15286325, 90366648, -5772973, -50050864, 12626667, -31302796, 9672266, 90272160, -24722368, -17465484, 57370564, -57008176, -29979408, 22697828, 16248398, 65965328, 30629022, -31223876, 43523588, 21523692, 29282014, 55790552, -27815282, -26820460, 35735740, 10628970, 32261646, -9368397, -59547576, 60508572, 52727704, 32217086, -99485400, -9417253, -83253112, -43278236, -39203388, 87951264, 64958696, 15454903, -5414880, -16342351, --58088896, -27947890, -18657874, -33780992, 89950040, 72468984, 101441760, 1549410, -115429392, -180585120, --87567944, 100036232, 135862704, 137968848, 56164212, -115144312, -210333136, -129701032, -64778308, 96728032, -165792720, 93353264, 51570748, 13089450, -74022688, -100818992, -74407624, -6302865, 58762132, 117176912, -141568560, 24322936, 28272696, -112610288, -184599840, -99661496, 93188440, 154194160, 147858544, 90866472, --53012244, -181281984, -115792856, -152224912, 1564979, 101556648, 111921480, 54525684, -43077448, -95905008, --83486112, -66998268, 19372450, -13599477, -33390150, 36410584, 4372277, -55133960, 5967320, -15054934, --22742388, 15350750, -17658222, -7562901, -29977798, 759672, -12059731, -22553948, 7694971, -3339337, -6286222, 2629594, 17028472, -18531710, -6921340, 4598836, 996969, 7528541, -8511015, 17322676, --13768591, 11702712, 4938139, -6624450, -14441828, -6523519, -26191248, 26692684, -3510599, 254477, --5812702, -7175817, 441845, -1406602, -384400, 10011569, 5191542, -852551, 14203994, -13783087, -3535832, -13069585, 12552579, 8031589, -11758010, 6986838, -14134201, -14627048, -13101798, -22323630, --4002373, 16539382, -16899622, -30075508, -22522808, 1962800, 16248935, 725313, 11324218, -28036472, --10231686, -2408403, -5792301, -26592826, -10924786, 3082176, -1079647, -6409702, 21068426, 20542828, --23868208, -29835528, -48579300, -75934488, 2131378, 61623652, -24423868, -38719132, -41452876, -39085812, -7386807, 7476465, 70993664, -10878078, -10985989, -32384054, 2860985, 9220758, 21840446, -24439974, -11396696, -17890150, 27302570, 8507256, 8408472, 2948495, -18269180, -9920838, -12204686, -4168266, -9320079, -10929618, -10140418, 19407346, -18960670, -11660299, 15457050, -15949361, -6650757, -13737990, --22763326, 7347616, 13346611, 2270964, 12497818, -20876762, -6238440, -967978, 10863046, 14371497, -17201344, 906775, -2990908, -31236224, -32806034, -12125230, -11398843, -7358890, 13427142, 19495930, -27020714, 2615098, -14006962, 27685896, -21320218, -9645960, 11437498, -9575093, 35989680, 1003949, --7184407, 5176510, -14397267, 9304510, 25143812, 18997714, -7453916, 4184909, 18347026, -49836652, --114763136, -88017304, -11290932, 36240936, 96627640, 81349368, 77650864, 79280264, 51926156, 21086142, --30303678, -52849572, -99597072, -73795592, -72449120, -72326712, -45391360, 41511396, 56517476, 83517248, -63934884, 53245784, 16811038, 35077536, -9375914, -10752987, -12608950, -21235928, -38408280, -31829466, --63881196, -24158118, -50954956, -25035902, -12898324, 15032922, 2167885, 22079354, 4326106, 31450434, -22988276, 38330972, 51550880, 64124400, 40779104, 26913338, 45450956, 2476586, -16720308, -58385784, --68112816, -93472984, -83266528, -77978352, -30285426, -51379084, -27139898, 2455648, 13401372, 32191316, -61901752, 66176856, 74020000, 112215688, 63218160, 86481312, 60106992, 14897094, -7863012, -32706176, --87242064, -93488016, -88557392, -94190240, -63826972, -19724100, -1180042, 2333778, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ -2484102, --669478, 1698123, 1275068, 2346663, -433255, -1897839, 3670050, -516470, -5807333, -1687385, --6451041, 4508105, 867583, -973347, 906775, -1239098, 862752, -5407364, 4455492, -544387, -1574106, -5060545, -1840394, -1856500, -7013145, -2695629, -594316, -89121, -454193, 2633889, --999117, -2592013, -2026151, -5426691, -499290, -5418101, -318364, 1212255, 1358283, -1422708, -129923, -987306, -183610, -1873680, -1769527, 1171452, -1134408, -1350230, 2147484, 7158100, -343597, 3140158, 5743982, -535797, -1183264, 5374078, -2950106, -405874, -1194001, 248034, -2247342, 962610, -2411087, -2822331, 3053722, 1730335, 3431142, -2044941, -1890323, -2705830, --1158567, -1047972, -1282585, -1843078, 635118, -9339943, 7177964, 325881, 3278671, 3257196, -9297530, 4361003, -3482145, -4381404, -6109054, 4323422, -5350456, -3890167, 828392, 1309965, -533650, 5447629, -1831804, 5090073, -1355599, 4566087, -4396973, 1986422, -1971390, -4677220, --380105, -8895951, 1275605, 2144799, 3907347, -3271155, -112743, 3425237, -2609730, 3849901, -3591667, -2235531, 2557116, -2985002, -1443646, -2221035, -3257733, -4088809, 3535832, 5291937, --4085588, 2314451, 4206384, 3415036, 5165235, 591632, -891206, 2986613, 2218351, -5647882, --325344, 547071, 234613, 1656784, 3478924, 684510, 1172526, -2073932, -1365263, 2384781, -3430605, 1800128, -2059974, -3560528, 3521873, -3293703, -1158031, 1688459, -817654, -653909, -1379758, -361851, 3693672, -1944010, 2706366, 269509, -223338, -7493108, 1208496, 6408091, --3922916, 2658048, -7969312, -8046621, -2658048, -6538014, -5725192, -839666, 1180579, 4530117, -714038, -2143726, 1016297, 3096135, -3969087, 5525476, -3727495, -3990562, 4648229, -2278480, -5355288, 6855305, 936840, -4871567, 3431679, 2295660, 1370632, -2449742, -1821603, 2918430, -2381559, 547071, -5564667, -1537598, -5140539, 4707284, -4640176, -2943663, 3405909, 245887, -2956548, 940061, 1133335, 5145908, 852551, 5768678, -7293392, -3623879, -1680406, 3750043, -5123359, 5993090, 7968238, 1032403, -2237678, -569083, -1027571, -23622, -5111011, -2006287, --2168422, -322659, 911607, -3810710, -2317135, -442919, -1539209, -2516314, 4241280, 8414378, --6449431, -2496450, -1367947, 5126581, 4617627, -4903779, -554588, -8999030, -2057289, 10640781, -3937948, -4452808, 7611219, 2399276, 2856153, 666257, -2706903, -8594766, 1023813, -3938485, --2528662, -1670742, -5276368, -1950452, -4109210, 2666638, -1920924, -2461553, 4723391, -9240085, -8279623, -3078955, 1083942, -2976949, 2510945, -461172, -944893, -346282, 3465502, 56908, -2153389, -3377992, 6182069, -5005248, 7217693, 1442572, -823560, -4212289, -4903779, 9834938, -1620813, -9434969, 9445707, 8882529, -4968741, -1890859, 2740189, -3777424, -763430, -2357400, -2186138, 5653788, -3550327, 1243393, -2663954, -2438468, 902480, 7690676, -7094749, 4297652, --7280507, -5560909, -5198521, -806917, 350577, 348966, 1670742, 3245385, -2456721, 1199370, --5644124, 7028177, -8260833, 1184874, 10377715, -16456704, 12907450, 5642514, -3720516, 4619774, -531502, 11319386, -206695, -7850127, -5165772, 4355097, 4971962, 1997697, 1201517, 5287105, -2258079, 1563905, 6980933, 3307662, 2673080, 5192079, 4089883, 15783468, -3143379, 4814659, -763967, -1616518, 4871567, 3250217, 2523830, 2739116, -1429687, -3295851, 1309428, 839129, -1265942, 3011309, 5632850, -3803194, -3852049, 2989297, -70867, -1033477, -1821066, 6945499, --3200288, 9659381, 5330055, 1260573, 3299609, 1620276, 3681861, 12055973, 10714870, 1605781, -1921998, 3046743, -777926, 5089536, 648540, 4687957, 2869038, 1171452, 1918777, -3832185, -6835978, 4434554, -795106, 2536178, -723165, 5191005, 394600, 5954436, -1874216, 5338108, --3501472, 10768557, -7699266, -2551211, -3567507, 11124502, 6257768, 4376572, 6977711, -5676336, --1071058, 10349261, 5755793, 5128728, 4930086, 3071975, 3413962, -599148, 9570798, -433255, --4271882, -2669859, 3388729, -2980707, 2221572, -8341900, 3350611, -1083942, 192200, -8964670, -4146254, -1385127, 9009768, -769873, 2818036, 3207804, -3866008, -188442, 4034048, 1353989, -2720325, -1216550, 4886599, 7955353, 754304, -4061965, 1736241, 5928666, 3382824, 1643362, --3605088, -5945846, 5619428, -6675453, -3541201, 5530844, -10579578, -1100585, 6111202, -3390340, -1058173, 1607928, -852551, 346819, 2381023, -3089692, 215285, -5889474, -3869766, -5168993, --3598109, 2274185, -19508816, 2783676, -6535330, -4003447, 3777961, 2768643, 1739999, 307090, --14506789, -1992328, 3749507, -8000987, -2554969, -10748693, -5812702, 1772748, -1825898, -9926743, -9196062, 5421860, -3626026, 562641, 7088844, -5481452, 1435056, -3901441, -6033356, -4156992, --10397042, -4114042, 6684043, 2990371, 8716636, -5219459, -16044924, -7100655, 3063922, -5384279, --10715407, -2139968, -2597382, 8702677, 3935801, -11089606, 6380174, -7965017, -1215476, -5858873, --6021544, -5388574, -12579959, -7363722, 61203, 7220377, 10620917, 6988449, 1294396, 4237522, --6084895, -9049496, -6286759, 5281199, -3582540, 5757404, -2733210, -5732708, -1231582, 416075, --3678103, -6259915, -652835, 4908611, -16480326, -9588514, 12553653, 7547868, 86436, 3983045, --4692789, 3974455, -6527277, -134755, 12042015, -5199595, 11375758, 11669426, 14147622, 3870839, -5781563, 12412455, 9597104, 7336878, -9130564, 1643362, 3111704, 8500277, -1432909, -6447820, -9081708, 9543954, -2448668, 6533182, -2901251, -2652142, 5780489, 5434208, -611496, 6366752, -575526, -8971650, -7572028, 8813273, 11981885, -348429, -4129611, 3135326, 359704, -5069135, --10711648, 6227166, -10150081, -4248797, 7658464, 2327336, 6745783, 1006096, 10832444, 2258616, -11883101, -13214541, 12521977, -1670742, -665183, 4643397, 6490233, -4521527, -11812234, -2390686, -10334228, -1131724, -12692165, -6335077, -7936026, 3087008, 4088272, -9683541, 5007932, 7421167, -10689637, 4731444, 2889976, 3564286, 11861089, 1345935, 4852776, 14115947, 15264314, 4387846, -3719442, -11630235, -5915781, 12378096, -9509594, 12647605, 3498251, -300111, -2699387, -4762582, --7572564, 1099512, 5591511, -14137959, -6388764, -6181532, 2971581, 2488934, 2939368, 122407, -2262374, -823560, 4090956, 3067681, -3760244, -6841883, -12065100, 1760400, -6550362, 10455561, -363462, -6387153, -7609072, -2699387, 4961224, -9819906, 5828808, -3572876, 1882269, -549219, --6763500, 6199249, 8367670, -6255083, 7030325, 1526861, -606664, 19693498, -5149666, -13652090, -2414309, 4363150, -3356517, 500364, -5794985, 13100724, 7879118, -2018635, -3059091, 9055939, -9161165, -2676838, -8133595, -6529961, 18836116, -2545305, -2997887, -8465381, 4498442, -11009612, --3452080, -3794067, 408559, 4002910, 9918690, 8591545, -14968498, -153545, 1243393, -1958505, --4788889, -10485089, -1481227, 2873870, 5481452, 4328790, -9629317, -2104534, -12083354, 10388452, -24696, -1597191, 4786741, -5702106, -1399086, -12913893, 1628330, -7929047, 4656282, -1509681, --2524367, -4738423, -8671539, -8553427, -1398012, -10429254, -16527034, -3567507, -7776575, -16042777, --1705102, -1931125, -8905615, 4922570, 8039642, -1686312, 3598109, -1719598, -1790465, 1633161, -2062121, -13205951, -4132296, 6148246, -6469295, 14224395, 2270964, 3214246, -10086731, -914291, --4779225, -10728291, -1454920, 12963285, 6060736, 9548249, 5510443, -5715528, -11509975, -18769008, -11541651, 10588168, -1447404, 4433480, -12719546, -27453968, -7132330, 21216064, 6849936, 8457327, --5977521, 8549669, 14663018, 779537, -2904472, -25358560, -6222334, -1493575, 13966697, 3725347, -5360119, -19068582, -5452461, -7283728, -4875325, 11355357, -6998113, -2587181, 1598265, 3037079, --6356015, -2890513, 2572686, -5541045, 11017128, -13152800, 936840, 8170639, -11480448, 8739722, -14895483, 17593796, 8111583, 8453569, 11255499, -8363375, -15273977, 5583995, 5910949, 9450539, -7250979, -17022030, -5281199, 8440148, 4530654, 2845953, 9929964, 1995549, 11647951, -4914517, --3197603, 6591164, 5880884, 1531156, -11335492, -6192269, -12139188, -13706314, -1360968, -14987288, -175557, -8994198, 11811, -8295193, -5106179, -19295140, 12253542, 2579128, -3322157, -4225174, --2710661, 1493038, 16714402, -8579734, -7372312, -6583648, 11429982, 14556181, -9603010, 23539106, -4742181, -10517301, 11949136, 3154654, -10191957, -12009802, -9674414, -1099512, -5302674, -3813931, --15793132, 5892159, 6258304, 21163452, 2699387, -4030290, -9917079, -10536629, 2381023, -1571421, --13794361, 2041720, -5221070, 278099, 10348187, -8509404, 13751412, -12582644, -10386842, -1078037, --16080358, -19485730, 2997887, -2579665, -22123914, 1132261, 190052, -10884521, 5464272, -5493263, -2763275, -15294915, -24312736, 15567109, -14844481, 24336358, 13573170, -18083422, -2162516, -18318036, --4686346, -2671470, 7628936, -6848862, 11597485, 13923210, 13901199, -10178536, -7597797, 927713, --11528766, -1415729, -3286724, -16065862, 10322954, 7048578, -7274064, 13069049, -16226386, -13933948, --10488310, 7738994, 9219684, 10200547, 16793858, -5449777, 30487826, -341987, -15089294, 7396471, -15240155, 4687420, 8207146, -5926518, -16230681, 25712358, 14309757, 10958072, 5257577, -7948911, -8449811, 21594022, -7290170, 5240397, 156229, 5184026, 3946538, 15675557, -3933653, 5900212, --4908611, 5395553, -1087164, 110059, 9543417, 2901787, -18107582, -11382737, -16957604, -10816338, --8859444, -3502009, -12924630, -6389301, -6204617, -10325101, -7681549, 6240588, -11684995, -2889976, --9010841, 23505282, 11574400, 20695300, -17237852, -214748, -15721191, -1871532, 18231600, 11471321, -21443162, 11786464, 13414793, -12060805, 6649683, 8145406, 19996830, 22032646, 6462852, 20374788, --14837501, -4680441, 12409771, -37403260, 2119566, 17664664, 11545946, -11294690, 22542136, 13430363, --950262, -5433134, -2628520, 13571023, 33221036, 17783848, 4936528, 1503775, 11040750, -2538326, -26854820, 15180562, 16843252, 772020, -8306467, 5734855, 2188286, -14111652, -3319473, -838056, --3180960, -3998615, 5577552, 2981244, -11479374, -5561983, -20413442, -2108292, -6257768, -26467736, --11760157, 772020, 10003516, -13663902, 17110612, -4784594, -4002910, -2409477, -4118337, 12269648, --8324721, 8516383, -27146878, 8225399, 11768747, 8929774, 17963164, -18080738, 15311558, -16292422, --12196633, 13079249, -8156680, -2743410, 10832981, -18584860, 15584826, 25350508, -1209033, -4307852, -32072668, -7741142, 5194763, 17822504, -41137732, -21180632, -744103, 95026, 2351495, 8061117, -14353244, 8967355, -21549462, -5966784, -31390842, -18896782, 23164906, 22983980, 2518998, -5468030, -19562502, -31549220, -16845398, -34146064, 14995341, 4072703, 1609539, 6532646, -15405511, 7764764, -10910291, 14043469, 24107114, 24523190, 20842940, -967978, 4836670, 125091, -8840653, -2022393, --7341173, -4060355, 28765006, -6863895, -26064010, -6847252, -5185636, 2125472, 41399728, -15124727, --14511084, 13671418, -22033182, 7429757, -24463060, 32017370, 9421548, -1226750, 8595840, -12815109, --15459198, 21772800, -26591216, -21910238, -18996640, 4939750, 8465381, 9616969, -17558900, 17926656, --5270999, 853088, 28826746, -2520072, -4351876, 7719130, 23415088, -15532749, 38540888, 617938, --43161736, -6234145, -989453, -15695421, -3392487, -1365263, -3027415, -13857175, -8345659, 17492864, -8007967, -6314676, -1478543, 44339632, 27329414, -31111132, -24633784, 36193688, 34637300, 22630182, -25628070, -37520836, -6199249, -8470212, 13191992, 6484327, -13564044, -27020176, -42226508, 15732465, -14492293, 6097243, 15007689, -3497714, 433792, -8004209, 11614665, 18187576, 16668231, 6317897, -21274046, 8634495, 684510, -4836133, -24457692, 1270237, -8625905, -6747394, 12372190, -26467200, -5550709, 4001836, -10674604, 14805289, 13982803, 8309151, -16596827, -15376520, -45103064, -9296457, -3578245, -12418361, 6048388, 13302051, 13580150, 30167850, 16786342, -8659728, -4679367, -14570677, -26542362, -6062347, 43328704, 36456756, 13378286, -17177184, 47956532, 23987392, -12608413, 7022809, -27282706, 55225764, -14609331, -33152316, -12372190, 7245610, -2193118, 18779208, 7837242, -9129490, -10143639, 922344, -7731478, 17211008, 6162205, -5242545, -16037408, 14207752, -27340152, -24675660, --9091909, 20437066, -11289858, -13607530, -205085, 23549306, 2275259, 24365886, -8013335, 29280402, -3026878, 16223165, -10206990, -5482526, 8585640, -27943058, -8552354, 12286828, -5683316, -2556579, --24020142, -20721070, 9668508, -11995307, -10409390, 19793894, 24149528, -1963337, 15528991, -27692876, -841814, -6109054, 37241660, -13790066, 11589969, 25591562, 21065204, 8784282, -16987132, 12319040, -5593121, 9323300, 10675141, -35030828, 67766528, 25137906, -8174934, 6744173, 5524402, 22641456, --7925289, 18447958, 37724308, 1553168, -53472880, 25216290, 13695040, -13142063, 19138374, 86973, --15933255, -20787104, 45022532, -19213536, 46641196, -20296942, -8302709, 47775604, 5717675, 25935696, -13239237, -26289494, 1649268, 15581068, -4686346, -22907744, -4379793, -49945100, -13973139, -18632106, --10768020, 10851235, -1469416, 17809618, -8771934, 1866163, 17385490, -15595563, 1650878, 9825275, --1013075, -17137456, -71404, -11828877, 34391952, -6197638, 19902342, 3051038, -405338, 35109748, -25363930, -15788300, -18342732, 8684961, 15890842, 19077708, 23431194, -783295, 8189966, 21927418, --1333051, -9426379, 6864432, 277562, -19912542, -1020592, 12908524, -20111722, -26350162, -3209414, --1698660, -3636227, -8894877, -10410464, -31310848, -1082869, 30666066, 8231305, 17122960, 8679592, --3961571, -42021960, -29311542, 6034966, 26676042, 6226092, 14101451, 50219440, 56551296, 42986716, --1324461, 18129594, -11250667, -41430328, -12513924, -28809030, 11126650, -16311212, 11366631, -5713917, --19774030, -4362076, 2051384, 13386876, -7128035, 8079907, -30145838, 32791538, -65553012, -4138738, --14818711, -11181410, 11136850, 41466836, 8269423, 16846472, -31307628, 10322954, 14287746, 29533268, --11873974, -18569292, -13003550, -4262755, 912681, 2544231, 18008262, 14915348, -7609072, -45600740, --21350282, -36384816, 6452652, 73555608, -47777752, -16087874, -5836861, 44174276, -11787538, 20905216, --11216844, 23425826, -6032282, -7796977, -23500988, 17160542, -27540940, 31323196, 50310712, 10770704, --7458748, -4416837, 41884520, 15625091, 1028645, 26492968, 8315594, 13099650, -6593312, 52376588, --72422272, 59130424, -43932148, 27502824, 53038552, -35573604, 85165440, 64849712, -22929756, -483184, -52582212, 10427644, -1819456, 49515604, 47280612, -40470940, 39404716, 36080948, -33980708, -51576116, --75854488, 17479980, 114150032, 46601468, 357556, 23259396, -108829104, -45330696, -3646427, 16282758, -82269024, 79885320, 14143327, -31326418, -60071024, -35826468, 4464082, 25467008, 39623220, 62625992, -38553236, -51353852, -119683560, -98488968, -9075266, 108454368, 119198224, 74342128, 23548768, -25802552, --47702056, -73814920, -40949292, -45182520, 88082800, 71890240, 46770048, 39872864, -60738352, -87229176, --99286760, -90647432, 35748088, 120885072, 151079232, 49818400, -44083544, -107556720, -126545304, -35707820, -22132504, 12317966, 81728392, 30499636, -28472948, -18853296, -59732256, -14364518, -68441912, 29630442, -85649168, 155424128, -7383586, -84310208, -179678352, -7825968, -60879552, 709207, -10483478, 51368884, -29966524, -4529043, 10808285, 5589363, -36745056, -3774740, -3145527, 4064650, 944893, 3024731, --13609141, -5235029, -5191005, -3227131, -6372121, 22072374, -8183524, 9603010, -16834124, -1443646, -6428493, -537408, -5424007, 38103340, 4785131, -21122112, -25380572, 5560372, 4700842, -14271639, -3482682, 19392314, 9247065, 18308372, -18980534, 5998996, -1376000, 4792647, -13673565, 2987150, -13449153, 20824686, 4206921, -4646081, 4942434, 2966212, -5792837, 14537391, -21561810, 5400385, --34487512, -9536975, 12334609, -10332081, -14865419, 19091130, -13183402, -29874182, -25834766, 22508850, --4685810, -2826625, 2615635, 12326019, 24374476, -15803869, -25809532, 2990908, -6576132, 20608326, --4078608, 13589277, -1009854, 2337536, -30821222, -33906620, -79672720, 22098144, 21817896, -2318746, --67296768, -43715252, -7096360, -11606075, 43687332, 29312078, 13646722, -30123290, -12941810, -8461086, -27052388, 2416993, -8724152, -17913772, 10622528, 4461398, 13054553, -1350767, -6455336, -7647726, --16724603, -8502962, -10436234, 26067768, 13419088, 2628520, 3191698, -17989470, -1731946, 1682554, -23490250, -2168959, 10531797, -9402220, -7068443, 4609037, -10780368, 6318971, 2141041, 6868190, -22931904, -2263985, 20044612, -403190, 12621835, -10382547, 169114, -15159624, -20343650, -20562692, --18363132, 6059662, 2438468, 1881733, -26664230, 13395466, -23241142, -1854352, 682363, -13266080, --15824807, -6873022, -63888, -25426206, -18562848, 19097036, -8240432, 18857590, 2741800, 16105590, --39820252, -96227672, -92380448, -15345381, 25716654, 89699320, 77120968, 72816336, 78090560, 42960948, -8966818, -41781980, -42320460, -85619096, -67212480, -58720792, -38221988, -47107200, 61097520, 50477676, -66293892, 38030860, 53811108, -3291019, 12722230, -10189273, -23733990, -13634374, -28012850, -31404264, --32165546, -30837866, -37244344, -26830660, -23001698, -3396782, 3440269, 48476224, 39378408, 20952462, -21359410, 31758062, 28112172, 13780939, 68213744, 8424578, -1277216, 12552042, -28508382, -81340240, --25330106, -65220688, -71667432, -73731704, -54124104, -46457052, 95563, 38241852, 36912024, 47859896, -84735944, 62863824, 74178384, 75566728, 45872936, 52449068, 15830176, -16471736, -60059748, -74523048, --88713088, -53304304, -78396040, -59574956, -71856952, -28498718, 16186658, 28952912, 19346680, 0, -0, 0, 0, }, -{ --945967, --1034550, -2892124, -6316287, 275415, -507880, -4354560, 922344, -187905, -1166084, -1078574, -4333085, 4241280, 1076426, 6105296, -4664872, 4355634, 2791192, -4049617, 3409130, -7570417, --1985886, -12191265, -1796907, 2594697, -2512556, 1838246, 1763084, 657667, -362925, -1176284, --2354179, -614717, 2034204, 2259690, 260382, 2935073, -1170916, -2332167, 2440615, 2957622, -1954210, -4855461, -4516158, -3167539, -2853469, -3075734, 3448322, 2338610, -2646774, -4559645, --7634841, -834834, -2736431, 1909650, 3505230, 1001264, -1701344, 129386, 3291019, -2840584, -3651259, 152471, -479426, -9095667, -1916092, -3704946, -955630, 4604742, -626528, -2391760, --380105, 3975529, -2802466, 251256, 332860, -4474819, 7359964, 2530810, -1413581, 1825898, -2321967, 4395899, 7366943, -3622268, 2402497, -3092913, -2431488, 1440962, -52613, 569620, --5318244, -2599529, 1778117, 3651796, -567473, 3070365, -5701569, -5039071, 3066070, 1962800, -785979, 2240899, -2000381, 3986267, 4431870, 4335233, 6201396, -3529390, -2962454, 180389, -714575, -6068252, -465467, -566399, 1569274, 549219, -3855270, -972273, 5044976, -2785286, -919123, -3189013, 1421097, 1540283, 941135, -4730907, 3696893, 297963, 769873, -695248, --1620276, -1995012, -3272228, 6742562, -1269700, -1310502, -1588601, 2957085, 649077, -6493991, -1591822, -3007551, -4434017, 2525978, -2724083, -7039989, 2817499, 941672, 406411, -6460168, --7568269, -2878165, 4576288, 744640, 605590, 4093641, -5539434, 1191317, -4582193, -5873905, -1995012, 5941551, -3299072, 2936147, -2422362, -1067299, 1394254, 504122, -2588255, -8192650, --8105140, 363462, -1867774, 135291, 4616016, 909459, 5597953, 7432441, -3556770, 6445136, -1033477, 6535867, 656593, 7715372, 1215476, -4009352, -896038, 616328, 3686156, -736587, --864899, 932545, 2865817, -2941516, 80531, -786516, 2571612, 2973191, 430570, -2678986, -77309, -354335, 1926830, 3095598, 5556077, -1692217, 3709778, -1403381, -4291746, -3966939, --2470143, 2710124, 3118146, -1447404, 4865661, 234613, 1966558, 301185, 5856725, 3712999, -4398047, 1663763, 2711198, 1444183, 2511482, 4421669, -771484, -461709, 5981279, 6169184, --6897718, -4758824, -3941706, -5662915, 1414655, 1984812, -4572530, 668941, 8573292, -6774237, -4224637, 7275675, 7286949, -5000953, -1514513, 3373697, 481573, 788663, -3609920, 1477469, --11687143, 8617315, 13896367, 2101850, 4548371, -2698850, -387621, 7076496, -4126390, -9475772, --1685238, -301185, -198642, -7758859, 378494, 1359357, -8843875, -4554813, 3886409, 883690, --3228205, -1303523, 2883534, -4750771, 8878771, 2279017, 307627, -6320045, -668941, 2541010, --2048699, -390305, -2139431, -719407, -926102, -5252208, 234613, -5124970, 6709813, -7200513, --4372814, -2168959, -7831336, 4495757, -4211216, -11652246, -2000381, -5509906, 1329292, 4132296, --5095442, -286689, -3520800, 2584497, 221728, -4445828, 177704, 1679869, -4780836, 3515431, -148176, -721555, 4143570, -3371013, -12477954, -2233920, -476741, 5844377, 8226473, 7261716, -3690451, -2505040, -538482, -7641821, -6354941, 2542621, 9321690, -2344515, 9545565, 6081674, --5342403, 3271691, -529355, 3404299, -6002754, -4082367, 1401233, 4782446, -222265, 2921652, -4184372, -7003481, -1074279, -3143916, -9408663, 6242735, 1345935, 2360085, 4621385, 7897371, -3091840, 494458, 6476811, -1303523, -2714419, 6363531, -2891587, 10667625, 5282810, 4283693, -636729, -2979097, -3277060, 5229660, 7474854, -5208722, 1710471, 6733972, -749472, 2172717, -15315317, -4532801, -1326608, 2825015, -6977175, -390842, 1815697, -3434900, 4105452, -2530273, -2696703, 7291244, -2187749, -134755, 1269700, -2810519, -17898740, -1023813, 4832, -3189013, --5296769, -1374926, 10188736, -6465000, -10059350, 4420595, -3886946, 2011118, 2185602, 7124277, --4178466, -809064, 1602560, 6688338, -2574833, -3448859, -925565, -2873333, 4781373, 8875013, -4414690, 691490, -447213, -4107063, -62277, 13662828, 2496987, -950798, 15228880, -216896, -11358041, -2677912, 245887, 8311836, 2442226, 2630131, 2826625, 2096481, 4272956, 3221226, --7067906, 14092325, 8120173, 11746199, 7335804, 5687611, -7270306, 4121021, 3666292, 1506460, --4523675, 13317083, 7356742, 12175695, 1835025, -1123671, -2941516, 9365176, -4253092, -7221988, -9637370, 4463008, -5885179, -1701344, -41339, -923418, 239444, 693100, 284005, -831076, --4472672, -484794, -11839077, -4545686, -13269301, -8990440, 1127429, -8500277, -6728603, 1038308, --1411434, 9223979, -5870147, 10208064, 12315282, 1518808, -10297721, -7021198, 11049340, -5283347, --2940442, 6457484, -7986492, -13958107, 5758478, 12641699, -6308770, 3484829, -214212, 5723581, --14883672, 3333968, -5990943, 3977140, 277562, -5851356, 10343892, 5153961, 4334159, 14246943, -6379100, 3296924, 7752953, 2025614, 2441689, 4420595, 1207423, 1122597, 2010045, 2399276, -15596637, 9383967, -201327, 13760538, 8087424, 10325638, 15037217, -7192997, -6739878, 13981192, --4911832, 143345, -8213588, -2665027, 4437775, 7816841, -6385543, 67109, 1634235, -870268, -3260954, -5473399, -1672353, -6335614, 13812615, -3255585, 6743636, 4571456, -4837207, 1583769, -730144, 1566589, -6951405, 9089761, 5306432, 12341589, 2428267, -1669669, -13881871, -7446937, --5174899, 3546032, -7186554, -12069932, -3309272, 3069828, 1392643, -13489419, 10980084, 807991, --764504, -11507828, -6542309, 2658048, 1469416, -12796318, -3906810, 4592394, 571231, 1212255, -6585796, 7546795, 4511327, -2065879, 3898220, 1085016, -4521527, -9547712, 16295106, -4210142, --7871602, 9664, 4067871, 5090073, 12178917, 1817845, -199179, -4765266, -125091, 6516539, --854162, 8173323, 16114180, 1083406, -3537443, 185757, 13824426, 17032766, -8756365, 2044404, -2284923, 8964134, 4766877, 1170916, 2614561, -7472706, 3926674, 3835406, 3925063, -3750580, --570694, 2481954, 3758097, -4016331, 6907918, -5196374, -9822053, 7665443, -312996, -2021319, -3258270, 6591164, -16814796, 1556389, 13849659, -1059783, 24486146, 11919071, -6746857, -4887136, --1674500, -6440304, -2494839, 11154567, -3526705, -3038689, 11301133, 9153649, 3471944, 5442798, -10619844, 7078643, 8111046, -5037460, -3121368, 9950902, -1223529, 9047349, 710817, -9831180, --5937256, 3220689, 8801462, -10736881, 1393717, -5530844, 3840775, -6384469, 10224707, 9903121, --8499740, -551903, 3467649, 132607, -11715597, -5172215, 2956011, 8726837, 14481019, 5078262, --9241159, -1785096, -1560147, -732829, 9517111, 1829119, 7853885, -9855876, 5667210, 1211718, --7116224, 10250476, 5272073, -715112, -953483, 2362769, 942208, -7507603, 11593190, -13121662, --1660542, -3821984, 14499810, -5706401, 12025908, -3040837, 11250130, 15165530, -5998459, 5181878, --3250217, 8902393, -2706366, 7519951, 6193343, 6023155, -805843, 6313602, -2451353, -6616934, --3064996, 8722542, -9058623, 2142652, 358630, 7860327, 14968498, -12682502, 839666, 13750875, -38118, 12640626, 1977833, 5951751, -1317481, -303869, 3544959, -17717276, 2120640, 291521, --7047505, 5625871, 3292629, 14142790, 6914898, -555661, 25652230, 7121056, -13176960, 4347044, -1480690, 9695352, -5601174, 2541547, 7643431, 1447404, 4682051, -458488, -14548665, -14083735, -68183, -4139275, 12027519, -19405736, 26108032, 840740, 14419816, 17716204, 3732327, -3302830, --3798899, -6605660, -11205570, 557809, 1542967, -24159728, -1645509, 8287677, 1437740, -9062381, --22397718, 12348, 2673080, -3932580, -824097, -6621229, 3615826, -5521718, 11727945, 4070019, --6744710, -8657043, -14609868, 11034845, -4527433, 714575, 14615774, 19767586, 12304008, -1897302, -1278290, -13653701, -5552319, -5534602, 3929358, -19356880, 5338645, 5188321, 1425392, -9997073, -9863392, 14718316, -2018098, -348966, 2120640, -8683887, -8662949, 5135707, 4029216, 11106785, --11831024, 13271986, -6523519, 7278896, -10848551, -9078487, -3919158, -363998, -717796, 4817880, --1778653, -19972672, -14212584, -4227859, 1324997, -19974282, 1143535, 9931038, -4340602, -2208150, -4079145, 8580808, -16404628, 9266929, -1745367, -2202245, 1504849, 7888245, 10961293, -9349607, --2552284, -4121558, 21521008, 301721, -4635881, 16683800, -3917010, -7110319, -2039573, -1789928, -20756504, 23750632, -3341485, 4862440, 5895380, -3309809, -11609833, 5357435, 22085258, 16757889, -14326400, -5543192, 6081674, 11710765, -15772731, -11851962, 13349295, -7209640, -7842074, -810675, -16736951, -2851322, 15381888, 723702, 13771276, -8706972, 19008988, 5542656, -6245956, -10158135, -3240553, -14244259, 1380832, -16848620, -5931887, -6274947, 9129490, -9813463, 15230491, -19428284, --33320356, 20218558, 8843875, -4439923, -227096, 22327924, 10240276, 1407139, -6426345, 4511327, --3146601, -119185, -15311558, -15358266, 8218957, -5381057, 4211216, 27904940, -8117488, 5840619, --19247896, 21704618, -8243116, -9591199, -5763846, -2426120, 7800735, -16699907, 13581760, -24655796, --18303004, -17758616, 24958592, 886911, 10767483, 6408628, -21815750, -19120120, 12991202, -34151432, -10107669, 10182831, -2068564, -13578002, -12370580, 21318608, -11303280, -1489280, -3418257, -11027865, -16376710, 5166846, 14847702, 8528731, 10318122, -3204583, 16678432, -1516124, -10522670, -12677133, --2659659, 7136088, -9330280, 12770548, 8502962, -9643812, -34289944, -2918967, -2498597, -870805, -25520696, 554588, -19299436, -11705396, -11615202, 10307385, -7128572, -16427176, -17806934, -11415486, --8360691, -40840844, 1566053, 5055714, 14045080, -21360482, 7672959, -17666812, -13655312, -5000416, -17889612, 4277788, 16745541, 29791504, 10004589, 6709813, 20621212, -15416248, -688269, -7521562, --6924024, 15185394, 16068010, 22276384, 13053479, 13198435, -9430138, -21248276, 7656853, 1136019, -971200, 2308545, 4566087, 6301254, 11350525, 4735202, 9767829, 6127308, 11311333, 27259084, -2223719, -32001264, -10925323, 10050760, 1686312, -5406827, -20203526, -12611098, 5887864, 19082540, -8121783, -15076946, 10290205, 8742943, -17540646, -1890859, -22007950, 20045686, -8376260, -10453950, -18302466, -14641007, 5955509, 37101000, -2761664, 7585449, 11812234, 1816771, 6548752, -18764712, -6458020, 5632313, 4794794, 48416092, 32874754, -1363115, -14679124, -8537321, 16111496, 19161996, --17011828, -8018704, -23318988, 42036456, 12601971, 7153268, -4616553, -1606318, -6978248, -2007360, -30437896, -4527433, 9816685, 31792958, 7087770, -4320737, -18524194, 4738960, 11447162, -37451040, -12979928, 11705396, 30207042, -5838471, -27050778, -3822521, 18787798, 10542534, -30301532, -40023728, -4712653, 27239220, 11107859, 16651588, -9337259, 12855911, 2268280, 347355, -14427332, -5210869, --22530862, 33621540, 11395622, -27347130, -18619220, 12177843, 1417876, 6674379, -8058433, 16699370, -9917079, 11451993, 22129818, 19386946, 4123169, 18931142, -9942312, 10786810, 33286, 13123273, -6189048, -3406983, -7960722, 8949101, -11868068, 31119186, -8406325, -6231461, 6439767, 15186467, -15317464, -10756209, 26977764, 26388816, 15485505, 6038724, 2105071, -9107478, -20560008, -35373888, --5928129, 11798275, -1102733, 14512694, 16067473, 17002702, 5578626, 9088151, 57081188, -29306172, --13434658, 4782446, 9824201, -2507724, -47048144, 9460739, -9830106, 5577552, 3140695, 18915572, --5295158, -9130027, 3176128, 14959371, 14666240, -8393977, -11439645, 3160559, -11021960, -34579320, -35290136, -10534481, 9685688, 3153580, 29504814, 23658290, 14588393, -14374182, -2750927, 20279224, -10406169, 23890756, 63588600, -4108673, -25742960, -6729677, 18614388, -3016678, -30394410, 45394584, -22990960, -16246788, -25631828, -3277597, 4880694, -8152922, 17324824, 15134391, 16924856, 33742872, -4798016, 9304510, 5111548, -13520020, -32709934, 18226230, -22678502, -16629040, 23765128, 12594455, -12764643, 6818798, 3697967, -2097555, -32849520, -28522878, -1217623, 15709917, -22579716, 18540836, --11282342, -24406152, 4959077, 18894634, -6402723, 2180233, 17202418, 17798344, 17210470, -1096290, --16694001, 8438000, 44137768, 1451699, 13475460, 21461952, -9206262, -22352620, 18043158, 14874545, -381715, -11799349, -17552994, -30882426, 5491116, 19156628, 25970594, -21990770, -23691576, 29122026, -12890271, -944356, -3073586, -11791833, 5350993, -5356898, -12726525, 13543106, 15968688, 11492796, -832150, -2040646, -9329206, 2290291, 6497212, 4487167, -10561861, -35747548, 7703024, -7790534, --11243688, 2471217, -5103495, 3525095, -36487896, 17324288, 12670154, -25373594, 17617418, 24710020, -19596326, -4766340, 2764348, -2534568, 12489765, -2234994, -786516, 65187940, -20104206, 6202470, --18089328, -9112847, 35478040, 14284524, 11458973, 24320252, -30658550, -23374286, 35427576, -21906480, -17411260, 24444806, 819265, 7653632, 7225209, 43139188, -15887084, -13985487, -40177272, -6045167, --19000398, 15326591, -27344446, 43139724, 16375637, 23687282, -9824201, 27180700, -14879914, 14624901, -45820320, 23016730, 17682918, -24770688, 7686381, 25735980, -20985210, 36207648, 13347148, 19601156, -17641578, -10486163, 18249852, 15730318, 6957847, 35846332, 27348742, -1589675, -60026464, -6673843, -28638306, 27543626, 28390270, 7067906, 16052440, 1733556, 8305930, -1677722, -18300856, 39071856, --580894, 37208912, 17050484, 26889180, -36908264, 25492778, 12969191, 11534135, -9445707, 8889509, --6649146, 8435853, 37392524, 14791867, 48671108, 2319282, 10901164, 28160490, -5573257, 44263932, -22028888, 3574487, -29419990, -18857590, 16222091, 1306744, -4971425, 267899, -5142150, 2609193, --21635898, 13252658, -23069344, -35424352, -12973486, -3634616, -11583527, -10989748, 28755880, -6369437, -26512834, -29101624, 29703456, -1606855, -9347459, -27965606, -26849452, -11314018, -12250857, 20015622, --34908420, -42974368, -46939160, -56132000, 23536958, 26354994, -2794413, -5204964, -1423782, -13876502, -1916092, 6191196, -12989592, 37009732, 34104724, 22567906, 23970212, -23939074, 14083735, 744640, -17008070, -7786776, -11049340, -35003448, 29341606, -31634044, -39414916, -10314901, -9589051, 40239012, --23985244, 5160403, -22778896, -6135898, 37347424, 7054484, 10559177, 19217832, 34066068, 2109903, --5931350, -43940736, -10053982, -3507378, -3244311, 24124832, 10888816, 81883016, 2010045, -2309082, --29235306, -1877975, 30333744, 30203820, -4878009, -13857712, -42600708, 10735271, 23344758, -12282533, --31659814, -11442330, 23045720, -6346888, 16468515, -56693032, -34514356, -44128640, -13878650, 23242752, -9969693, -4099010, -13769128, -5874442, 42324220, 3927211, 2782065, 73017128, 9503689, -49471580, --37504728, 52015812, 46313168, 5463736, -32229434, -40432824, -22260816, 11318849, 45070848, 40715752, -27894202, -12736189, 7460895, -12793634, 16349330, 35109748, 52262772, 57259432, -4402342, -26212186, --43553652, -65808024, 1662152, 39537320, 151162992, -16508244, -5609764, -68970736, -27442156, 9021042, -19459960, 91528976, 66160212, 42449848, -42776800, -22517976, -41776072, 315143, 76350560, 71518720, -85745800, -20171850, -80246096, -57047904, -81090592, 23670102, 78267728, 69878048, 125590752, -56281788, --69981120, -60265908, -8722542, 57330836, 74590160, 104458976, 47715476, -19024558, -38241852, 11597485, --1800665, 30933428, 82536920, -16434692, 51304460, -17312476, -46792596, -5764920, -35693324, 48163228, --10327786, 56705916, -51021528, 969052, -21781390, -53517440, 40293772, -28040768, 37439228, -28754270, --10081362, -2539936, 19899658, 4161287, -19419694, -11112691, 384936, 28964186, -25745644, 33171644, -25418690, -18584860, 5689758, -23329188, -21447456, 38417944, -36762236, -19987704, 27599996, 58779848, -1393717, 7238631, -3553012, -26967026, -5295695, 23260470, -6339372, -40441412, 7729331, -9849434, --4392141, 10477573, -33478196, 16542067, 2348810, 10717017, 30184494, -64276332, -43574592, -17297444, -1376000, 62172872, -31229244, 20969640, 53570592, -30310122, -13287555, -4544613, 30676268, 36902360, --18475876, 8177618, -4546760, 12079059, 65865472, -27304718, -66442608, 10181757, 35908612, 2891587, --33784748, 16934520, 13060459, 15062987, -10817412, -8177618, -75790064, -26295938, 27710056, 39275328, -31945966, -39401492, 8098161, -104110544, -69021736, -58972048, -12336757, 43967044, 26890790, -5356361, --25677462, -30594126, 9836012, -19954418, -5262946, 32909114, 6260452, -1483911, -39346196, -20369956, --7263327, -20065014, 7274601, -6110665, 15704548, -8189429, -3900904, -9440338, -4888747, -7689065, --24177444, -18501108, -38058244, -27218818, 13655849, 30518964, 32650342, 17341468, 27911918, -7801271, -23117662, -9258876, -16416976, -45675904, -5720360, -26501558, 14173392, 4164508, 49884436, -46491412, -11210938, 27553826, -21123722, -25950730, -17999134, -13518410, -15797963, 1274532, 33516852, 22097070, --15421080, -3978750, 22022982, -34401616, -41392212, 12144020, -47971564, -33922188, -36197984, 30782030, --1711545, -78597904, -120146344, -148846384, -116412408, -176777632, -25374130, -59462212, 27621472, 46845208, -140762192, 86220928, 145448528, 149030000, 199630624, 148996704, 149768736, 113708720, 11104101, -22142704, --49377092, -25877714, -108869368, -70201240, -56553444, -55512988, -57426396, -54674932, -55624660, -57633092, --67127656, -45543832, -79168592, -60451664, -55098524, -18348638, -66133908, -13232257, 30783104, -44066900, --21145734, 22911504, 15624554, -36007396, 40927816, 56508348, 63897304, 90801512, 86407760, 1923609, -52009368, 89183384, 116437640, 98599568, 181735632, 177670448, 150125216, 129126048, 153055984, 83625160, -120544696, 155788128, 111449568, 79443472, 119329224, 45448808, 34274912, 80129056, 65934192, 56032144, -325881, 42689292, -37689412, -5543729, 2031520, -71586904, -172790832, -139353968, -97657896, 0, -0, 0, 0, }, -}, -}; -const Word32 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[15][BINAURAL_CHANNELS][1774] ={ -{ -{ --2848100, --4996121, -2501819, 178778, -1384590, 3234110, -3849365, -6403260, -5370320, 883690, 0, --1796907, 2643016, -185757, 2986076, -4163434, -3251290, 912144, -12885, -562641, -3524558, -877247, 576063, 872415, 3602941, 2280091, -505732, 1189706, 1094680, 1391569, -843961, -188979, 4723927, 2952253, 1245541, -2436320, -1349157, -585726, -1560147, -1996086, 3809099, -1480690, 1563368, -492311, 772020, 365072, 855772, 782758, 405338, 2534031, -2726767, --1814087, -331249, -390842, -3704409, -1619203, -4740570, -2827162, 858457, 1508070, -1408212, --3979824, -1078037, 1160178, -315680, 2673617, 134755, -540092, 7708393, -3829500, -2741800, --691490, 1606318, 1019518, -4606353, 1345399, -206158, 5018670, 2812667, -3750043, 5525476, --3332895, -854699, -143881, -1605244, -2269353, -3904662, 759136, 6459631, 412317, 1331977, -2425046, 855772, -2447058, -477815, -1549946, -1117228, 3553012, 1251446, 261993, -1079111, -461709, 54761, -1678259, -2145336, 3428458, 3036542, 280247, -568009, 4009889, -5709086, --2456185, 2738042, -2706903, 5315559, 266288, 3817152, 203474, 635655, 2066416, -1820529, --1118302, 153545, -330176, -1367410, -1553168, 2479807, -396748, -5230197, 4833986, -483184, -573378, -4372814, 1885491, -1795833, 1498407, 394063, -489089, -1471563, -523449, -2397129, -2392297, -4905927, -971736, 4092567, -3421478, 1729798, 5208185, 2059437, 54224, -2459943, --324807, 1869385, 10871099, 2074469, -1596654, 3390340, -1724429, -1323924, -1829119, -674310, --4189741, 5841693, 3265786, 2533494, 2603287, 2587718, -2797098, -3616363, 4780836, -1044751, --3912178, -7224672, 1059246, -2145336, 2136746, 33286, -751082, -1636383, 2128693, -2702608, --1505386, 3539053, 6623914, 1728188, 2918430, 541703, 3235184, -760746, 3444564, 2228551, -215822, 1960653, -23085, 518617, -26307, 4871567, 826244, 1209033, -1354525, 629213, --597537, -809064, 3764539, 4479651, -1928440, -1833414, 641024, 4088272, -7202660, -526134, --2195265, -5286031, -2419677, 513249, -2542084, 2053531, 1447941, -88047, -3537443, 1180579, --1125818, -3282429, 3308736, -5625871, -3074123, -6050535, -3468186, -1366337, -70867, 2916283, -1844152, -7045894, -235686, 598611, 5129265, -1815161, -7864085, 6265821, -7407745, 25233, --3007551, -3094524, -7875360, -5893232, -2822331, -2480344, 3818763, 761283, -5038534, 377420, --2499134, -354872, 228707, 1846299, 883690, -2782602, 818191, 177167, 1772211, -2091649, --725850, -917512, -2254858, -4514548, 5995775, 2149631, 1206349, -1193464, 5186710, 3650185, --4194573, 862215, 920734, -1341104, -2232846, 154619, -4323959, 609885, -412854, -4420058, -5374078, -416612, 149787, 5567888, -4743255, 4250944, 2325188, -1267552, -3339874, 555125, -31139, -4753455, -2828236, -622770, -860067, -2561948, -5035849, -502511, 1946694, 1827509, --884763, 1515050, 1598265, -2189360, 121870, -4880157, -12334609, -11577084, 4437775, 7732552, -4580583, -10443750, 7369627, -2514703, -1052267, 668404, -4959614, -3683471, 8679055, -133681, --145492, 648003, -351650, 2842195, -4530117, 2617783, -2484102, 2332167, 3849365, -2729989, --915365, 2262911, -876173, 4118337, -1528472, 1733019, 129923, -530965, 101469, -3694746, --5245229, 4573604, 329639, -1044751, -262530, -4819490, -6132140, -328565, -232465, 2844342, --5766531, -4799626, -1373853, -9808095, 3307125, -987843, 1510755, -987843, -2787971, 1196148, -11780558, 6528887, 3016678, -4004520, 4250407, -404264, -6957847, -362925, -7290707, 5181341, -4832, 199179, -4600984, -478352, 2889439, 826244, -298500, -176631, -797790, 3355980, -1412507, -370978, 947040, -17770428, -1202591, -4377109, -475131, -3080029, -9860171, -556735, --2545842, -4251481, -9232032, -1281511, 6804839, -4774930, 4527433, -893890, 6323266, -2206540, -5166309, -1764158, -4818954, -1439888, 683437, -2281165, -4317516, -3686156, -4241817, 51003, --3857954, 1374926, 621697, 321586, 2043331, -3086471, -3890167, 5759551, -386010, 1670205, -204011, -4621385, -2758980, -3267396, 296890, -2346126, 4198331, 4110821, 816581, -5606006, --1704028, 10313290, 2691871, -4333622, -3343095, -2164664, -3700114, -1956895, 8165270, 4983236, --5734855, 3686156, 4851703, 7150047, -1712081, 3024194, -341987, 278636, -2757906, -5569499, --985695, 4637491, 504122, 8754217, 5968394, 920734, 1976222, 7722351, -5567352, 22699440, -15058692, -4584341, -975494, 133144, -752156, -2520072, 3007014, 7788923, 6369437, 3432216, --12031277, -5241471, 1336272, 703838, 4836670, -8922258, 1588601, 12090870, 7915625, -1412507, -2658048, -1099512, -4344360, -5629092, 37581, -4817343, -3063386, 1314260, 3452080, -3576634, --6811818, -3191161, 776315, 5837398, 7964480, -1722282, -9177808, -2016487, -3543885, -9002251, --950262, -456340, -4679367, 1253057, 1915019, 4933844, -7896834, 2777770, 3302293, 562104, --7710540, -5616207, 1860258, -8053, 1243930, -1131187, -1356673, -630823, -4671851, 1538672, -1319629, -3233574, 4156455, 5370857, 7152195, 1358820, -381715, 6925098, 11244224, 1209033, -404801, 1166621, 5692443, -450435, 2150168, 9822590, 11489574, 656056, 2062658, 3273839, -5308580, -1867237, 3213709, -2733747, -2421825, -9453760, 3449396, 7028714, -6535330, 5401995, --2993055, -8278550, 8447127, 5603322, -2099702, 5648419, 9954660, 7612293, -5932961, -2756295, -4736812, 1915555, -1746978, 4296578, 3163780, 5654325, -234613, -2185602, -5262409, -8116415, --877784, -6726456, 228707, -2104534, 3213173, -5359583, -13239774, 2862596, -3786014, 5879274, -787053, 496069, -4179540, -7408282, -6936372, -609349, -1366873, -5651640, 7129109, 10097468, -9811853, 4138738, -8369281, -854162, 9210557, 722628, -2570538, 4363150, -2181307, -2904472, --10419054, 4780299, 1821066, 13230110, 5399848, -10057740, 2124398, 2689187, -2065879, -1182190, -2226941, -3447785, -4018479, -5763309, -2011118, -1219771, -10918881, 862215, 918586, 5607617, --2378875, -4226248, 1502702, 889058, 2098092, 388158, 5325760, 2600603, 3544422, 966368, --864899, 3689914, 1562294, -10113574, -3650185, -14584098, 223338, -2510945, 1257352, 2881386, --270046, 7337415, 1326608, 10363756, 754304, -11829414, -258235, -4640176, -2510409, -376883, --2339147, -437013, -10099079, 2247879, -5162551, 11660836, -12528420, 6766184, -3199751, -10085120, --2536178, -7075422, -2197950, -2105608, -11541114, 3172370, 2607582, -1958505, -2555506, -691490, -3035468, -8654896, -645319, 8020852, 558346, 11143293, 17347372, 7436736, -17783312, -22417582, -9469866, 4554276, 15053324, -3777961, 6059125, 1287417, 5311801, 10627360, 9529996, -20206748, -15076409, 2937758, -2776160, -134755, -9284646, -7365332, 7860327, -1930051, -2634963, 8435853, --6149857, -6341519, 341450, 8428336, 3467112, -2359011, 245350, -4377109, -614180, 965831, -4410932, 538482, -10349261, -9962177, 2377265, -992137, 2556043, -617402, 4229469, 8468602, -15058155, 232465, 9385577, -1790465, 2732136, 6926172, -6109054, 12776991, -1628330, -7008850, --10594074, -1429687, -8756901, -10571525, -2953327, 5871757, -3309272, -7984881, 4526359, 7000797, -9893457, 13385266, -10056129, 4789426, -2666101, -8470749, 3723200, -9514426, -1742146, -16101832, -7060926, -3957812, 2740726, -1828046, 2899103, -17098802, -18242874, -9661529, -4160213, 11914776, --9768903, 21319144, -6725382, 4137127, -1695975, -2069101, 16455630, 1712618, 5772436, 5233955, -1102733, 10719701, 675921, -13293461, 6046777, 2726767, 5743445, 81604, -11075110, 15562814, -7327214, 6816650, -2103997, -3782256, 1211718, -361851, -8927626, 6052146, 3022583, -3856344, -5267778, 10168872, -447213, 4279935, 8705362, -9514963, 1758789, -2725694, 3521873, -18533858, -5183489, 9990631, -3934190, 3189550, 8588324, 5686537, -550830, 3788698, -10341208, 3200288, --6375879, 1148904, 2091649, 2241436, -5106179, 19158238, -4025458, -2790655, -5026186, -15390478, --7253663, -9164386, -12157442, -1511829, 15119895, 18086108, -2466922, 6045167, 6195491, -13886703, --5493263, 12450036, 8934606, -5164698, -4944581, -13743358, -5585605, -4886062, -7923141, -7603166, -1040456, -13785771, 4165582, -1719598, -5218922, 3245385, 1116155, -7311108, -10422812, -11561515, --4318590, -11287711, -4378719, -4607963, 481573, -10706280, 2711198, 4463545, 843961, -12177306, -4156455, -15086073, 5060009, 8464307, 657130, 13156559, 838592, -3823595, -1926293, 8931921, --2688650, 12278238, 4846334, -4071092, -3624953, 2300492, -5629629, -3169149, 1059783, 11703249, -245350, 6302865, 4120484, 1289027, 8764955, -3351685, -6672232, 3570192, -4538707, -2148021, --13659607, 8476118, -4246112, -3918621, -2058363, -15562277, 19979114, 5340255, -1313723, 8716099, -3723200, 4469987, -7381975, -12252468, -13320841, -6531035, 1937030, -14158360, 6701760, 10969883, --15014669, -5654325, 7460895, -7374459, 5550172, 17980344, 2372970, -4125316, -3109020, 12329240, -28142236, 31091268, 8449811, 19586662, -13623099, -12261058, -3755949, -1148904, 376883, 5056787, -8965744, 18202608, 4998805, 16910896, 1073205, 5677410, 1689533, -3646964, 6647536, 620086, -2224793, 2065342, -8917426, -194884, -5110474, -8068633, -6248104, 975494, 184147, -10961293, --5563594, 15713675, 10013179, 8580271, 11893301, -6947110, -613643, -20754356, 310311, 19426674, --4315369, -2818572, 1538135, -1107028, 13834090, -260382, -3112241, 12101607, -14052059, -20739324, --9418326, 2861522, -12335683, 9549860, 11356430, -16095927, -7157563, 1119376, -1026497, -23470922, --16305306, 8875550, 2645163, -760746, 7110855, -9558987, -7362648, -13921063, 2719788, 6154152, -275415, 2512019, -11202348, -14900315, 12257300, -19990388, -28567974, -19876572, 13652090, -2530810, -25141128, -5823976, 20630876, -16503949, 125628, 7961796, -2057289, 1321776, 2084670, -896574, --13071733, 4877472, 4388920, 5986111, 5936719, -3463891, 10041097, -9030706, -7387881, -4962835, -14277008, -7633231, -3124052, 1789391, -704375, -7131257, 6140193, -8000987, -10521059, -18559090, -1331440, 4020090, -13363791, -5501853, 5821828, -2063195, 2913062, 1613297, 14635101, 1647120, -10905459, 5677947, 54761, 9732396, 1626719, 3824132, -17522392, 18303540, 5789616, 14531485, --8819178, 4447439, -9608916, 15133854, 10414222, 18332532, 2355790, -3622805, -13091060, 226560, -1853278, -9699647, 14992120, 3658239, 2110977, 17799418, 3528853, -3551938, -6580427, 938450, -10126996, 13180181, -3392487, 12432857, 13180718, -30792232, -1169842, 15824807, -9942312, -3508452, -12048994, -12826383, -25581898, 5109401, 4756140, 4003983, -2990371, -15300284, 4289599, 4405026, -1612760, 8587787, -26961120, 12710419, -5850283, 6699612, -15080167, 12903155, -19194746, -12436615, -8323110, -4949950, -1627793, -14780593, 12540231, 15863462, 715112, 2066953, -6361384, 23709294, -6632503, 6763500, -3352222, -19768660, -3409130, 11622718, -1049046, 17197586, 1174137, -5516886, -5115306, -596464, 11613055, -19379430, -1218697, -14685567, 17831630, -5492727, 6874095, 253940, -789737, -17357574, -4913980, 16710107, 6603512, 2260764, -3199751, 1348620, 3707094, -22294638, --22280680, 26563836, -9516574, -26776974, 13250511, 14222784, -20338818, -28078886, -18256296, -18128520, -13223131, -18006650, -8124468, -18753974, -366146, 2415382, -22310208, 2608656, -10243497, 31649614, -3032247, -30647812, -5462125, 13194676, 10088878, 5883032, 16221018, 13867913, -19931870, -6490233, --6856916, 18941342, -5623186, 22312892, 1381369, -14453639, -9302899, -21804476, -22462142, 488553, -4237522, -4811974, -10849087, -6118718, 3092913, 2949032, 9701257, -12496207, 7446937, -14514305, --14650133, 2435783, -1918240, -4983236, -15322833, -16618839, -6147709, -5507759, 24468428, 1613834, -9264244, 12438762, 1174137, 28449864, 13247290, -9866077, 3058017, 14668387, -4230006, 18736794, --3382287, 2456721, 2834142, -25214680, -24581708, 4347581, 19701552, 1162326, -4287451, -27362700, -3139621, 11437498, 7293392, -7210177, -6942815, -1321776, -12800613, -14295799, 28685550, -9826885, --8713415, -2804077, -6115497, -19950660, 1820529, 11505144, -30465276, -1903744, 9729175, 8827232, --9411347, 5874979, -16780438, 46708, -3209951, 4355634, -14834280, 8821863, -26308286, 3200288, -2337536, 14410689, 16443282, 6013491, -8774618, 10217190, -1731409, 11569031, -12407624, 835908, -18254148, 11690364, -5974300, 1278827, 2244121, -5083631, 9895068, -4551055, -7674570, -12167105, -9649718, -20827370, 14875082, 1504312, -18593988, 18058726, 20992190, 16091632, 8734890, -10710575, -25169582, 1138166, 12395276, -15538655, -9241696, -15004468, 7190312, 3456912, 11430519, -20488068, -5450851, 11912629, -31876710, -599685, -7198902, 20442970, 19888920, 9058086, 3342022, 12414066, --5589900, -3727495, 3338800, 23400056, 5471252, 11658689, -33908228, 15472083, -18842558, 25490094, --2291365, 9638980, 19915226, -21674016, 38063072, 26607860, 20701742, -9828496, 5759015, 25343528, --6267431, -8934606, -5823976, -2002529, -19371914, 4515085, -10225780, -24452322, 23172422, 6869800, -6482717, 2108292, 5479305, 8093329, 24335284, 4237522, -14972793, -2177549, -15557445, 2171106, -2355790, -28515898, -1093069, 13980655, 1158031, -3035468, -8354785, 28165858, 6073621, 11302206, -6474663, -17032766, -11278584, -9925669, 18200998, 9388262, -3647501, 9614284, -1634772, -21451214, -19333796, 754841, 22162568, 750009, 2267743, -1383516, -29446296, 2048163, 794032, 1120987, -18348638, -9592809, 28904056, -46422692, -7585986, 29587492, -12862890, 7067369, -14155138, -27970438, -16349330, 7134478, -36538360, -41454488, -4886599, -18967650, 1505386, 12940736, -18207440, 5775658, --27207544, 12054899, -15611669, -70148624, -5947456, 43929464, -20074678, -7371775, 41961832, -9597641, -801548, 52607980, -14053670, 12017855, 3213709, -7141994, 40205724, -33340758, -6133750, -556198, --7779260, -6475737, -8817568, -570694, 11675869, -7465727, -24924768, 425739, -1672353, 6874632, -6127308, 1574642, 16524350, -715112, 6267431, -5190468, -25192668, 15709380, -5395016, -23538032, --1832877, 13242458, 38428148, 20586852, 31700616, 360240, 5368172, 16127602, 547071, -2543158, -28861644, -2306398, -16488379, 37307696, 2481954, 5947456, -4264366, -6216965, 16676284, -959925, --18311594, -15302968, -9598715, -3970161, 24596740, -23474144, -9517648, 470299, 25756382, 17813914, --38075420, -21041044, 32217086, -7220377, -28094992, -1857037, 2311766, 9216463, 34011848, 27172648, --15972983, 3774740, -2285460, -1275068, 1440425, -20118700, 29779692, -9822053, -16610786, 5053566, --11414412, 14453102, 3183108, 21189222, -5176510, -22925462, -17602386, 15731928, -6430640, 20927766, --4154844, 13074954, -12832825, -12799539, -5113696, 237834, -16550120, 3175592, 2881386, -1027034, -19947976, -1521492, 7963943, -13817447, 10896869, -21040508, 23137526, -20272782, 14579803, 5145908, -19812148, -30982820, 3071439, 1291175, -6908992, -22697828, -34303904, -7282654, -28925530, -13129715, --22676890, -12761422, -43210592, -15305116, 22923852, 24921010, 16585553, 13963476, -12348, 15167140, --29883308, -9097278, 7401840, 17032766, -52539260, 15430207, 8004209, -27465242, 10625212, 10314901, --20295332, -15320148, 23207318, 2938831, 12171400, -6339372, 15152108, -4990215, -2901787, 12185896, -5438503, 3925600, -191663, -8394514, -14798847, -8811662, 21621940, -8014946, -19979114, 32608466, -19532974, 2374580, 14173392, 4196720, -17807472, -50371376, 19593104, -1968169, -28072444, 22408454, --3479997, -36868000, -31875100, -16342887, 22727894, 9220221, 23507966, 30882426, 7910793, -25770878, -6452115, 8607114, -33909840, -5734318, 16344498, -10631118, -37089728, -27255326, -44952740, -27954332, --8524436, 26341034, 36610300, 18096844, -5404680, 26120918, -9848360, -67065916, -55911884, 10466835, --30339648, -32535988, 40442484, 4556961, -65672196, -48361332, 9644349, 754841, 2230699, 19838990, -41181756, 48706540, 48919140, -15892453, 17626546, -20444044, 12964896, -35433, 7921531, -24161338, -2857764, -20703890, -16892106, -404801, -40331892, 479426, -16528645, 4104378, 13284871, -791885, -15245523, -20776904, 32014150, -15642808, 659278, 20963736, -18841484, 7523172, 16666621, 18632642, -4032974, 6586333, 6026913, -29929480, -15167140, -4956929, 5800354, 4481262, -2972117, 19647328, --4868883, -286689, -2231773, -8500814, 8545374, 4010426, -21890912, 7061463, -17227114, 5373004, --43676060, -1939715, 636192, 225486, 20361366, -7080254, -14667850, -6914361, 18971944, 518080, --41866804, 62067108, -3295314, -10931766, 15515569, -1714766, -6829535, -10346039, -9958419, -11736535, -44418552, -14491220, -22058952, 23231478, 4313758, -29830696, -5899675, -37685116, -59234040, -54272816, -120955944, 102823128, 113995952, 262840192, 66394824, -65113852, 18334142, -209863376, -225466992, -55032488, --142878000, -108393704, 63241244, -34746284, 10564009, 166465952, 79409648, 123025040, 234027392, 157464768, -37460704, 33223182, -74300784, -217947584, -169887968, -128355632, -260513920, -105530568, 1046898, -47619376, --25778930, 126701536, 28554554, 14376329, 154111472, 16492138, 31809064, 223884832, 160408432, 101797704, -207801248, 102584224, -45685032, -8369281, -76588928, -340910880, -301647360, -242662960, -377166304, -286881280, --109767552, -140354704, 18412524, 246475296, 215295968, 305671744, 384367360, 285343136, 215829088, 212392576, -107342504, -56225952, -99315752, -199178576, -282984672, -275589248, -247752512, -277487648, -290987808, -237598128, --154757328, -120460944, -16268799, 156988032, 192766192, 123452392, 10576894, 0, 0, 0, -0, 0, 0, }, -{ --3461744, --7253126, -2795487, -4082367, 81068, 1404454, 4320737, -2083059, 347892, -3197603, -2488397, --3400540, 1675037, -3912178, 884763, -3293703, 6473053, -366146, 511101, -306016, -4567161, -2915209, 6880001, 111669, -1712081, 355409, -1312649, 2218351, -814433, -1169842, -1206886, --8152922, -2587718, 659278, -1212791, 2113124, -2427730, 1825361, -496606, 2205466, -1386201, -2369211, 446140, 3339874, 1639067, -1064078, 1348620, 854162, -1751810, -3197066, -1368484, --555125, 1919850, 805306, 178778, -592169, 3748970, 4085588, -4485020, -1616518, -4090956, -2371896, -314069, -2329483, -1136556, -1515050, -1649268, -221728, -2482491, 2707977, -3387119, --1540283, 298500, 1855426, 684510, 1488206, -570157, 9018894, -1265405, 789737, 6932614, --833761, -429497, -1981591, 7559680, 508417, 3614215, 2319282, 2136746, -3117073, 1464584, --4859219, -665720, 3833795, 631897, 2252710, 3433290, -6029597, -4377109, 1454920, -458488, -4497905, 2570538, -232465, -2662880, -1574642, -3260417, -505196, -595927, -484258, 663036, -1144609, -2881923, 4463545, -1240172, -747861, 1324461, -5791227, -1546188, 2419677, 647466, -5589363, -260919, -496606, 856846, 293132, 2098092, 3816079, 4715337, -403727, -795106, --38118, -3161096, -3780645, 1702418, 3095061, -2603824, -2360085, -1818382, 3957276, 2082522, --777389, 264141, -5114233, -1818382, 2294050, 1662152, 3347390, -5746666, 911070, 1434519, --1366337, 3074123, 11439645, 3419868, -2871186, 6155225, -3083787, 6402723, -2247342, -2589865, -2956548, 6011881, -358630, -2619930, 1367947, 1455994, -406411, -7980586, 1764158, 2662880, -503048, 5396627, 6767795, 3976066, 6668474, 4899484, 4013647, -835371, 4479651, 2498597, --3619047, 1592359, 2013803, -4213900, -5824513, -585189, 2153389, 388158, -2154463, -2460480, --2774549, -1025960, 3011846, 6497212, 5173825, 2297808, 3970697, -6165426, 368830, -1323924, -34897, -7113540, 2748779, -372052, -1757179, 60130, -2006824, -3328063, -2554969, 2974802, -679142, 2371896, -2640868, 5455682, 1408212, -5509906, 2563022, 1126892, 1802276, 3605625, -1185411, 6294812, -1630477, 1009317, -6591701, 1634772, 1065689, 383863, 639950, 877784, --2656437, -2072859, -1066226, 2462090, -4285304, 1462973, -8174397, 1775969, 1191317, -618475, -5332739, 657130, -922344, 807454, 2685428, -4526359, 394600, 1783485, 2789045, -6563247, --3774740, -2283849, 2224256, 1341640, -2450816, -6628209, 1388348, -6589017, -717796, 3060701, --1574106, 2411624, -1488206, 4980552, 6604586, 3978750, -3866544, 1007707, 4933307, 3574487, --3529926, 3067144, 513249, -5022965, 1596117, 7764764, 3172370, 2857764, 7953743, 1129040, --3428458, -5912023, -573378, -3126736, -4548907, -1578937, 4238596, -3850438, 1204202, -2088428, --2704219, 5801427, -993748, 1429150, 3911642, 6345278, -2859375, -4606353, 6389838, 5905043, -2942590, 1200443, -4434017, 1750736, 4708895, -3824132, -15714212, -5590437, -2506114, 8666707, --3334505, -1144609, -5129802, -4120484, -805843, -11096585, 6238977, 2250026, -379031, -3981435, -6159520, -1562831, 3112241, -2319819, 1960116, 4165045, -4970351, 738734, 5446019, 3313567, -2195265, 6078453, 5229123, -3026878, -4163434, -4951024, -60130, -6579353, 1673427, -8764955, --1685238, 6970195, 3566434, -1979443, -632971, -6479495, 3178276, -2564096, 6101538, -3093450, --6051072, -882616, -2413235, -4660040, 2104534, -736050, -3062849, -2837363, -10737418, 1964411, --3074123, -7590818, -1929514, 5518496, 2807835, -3621731, 3735011, 5046050, 4606353, 2238752, --5226975, -236760, -835371, 4618164, -3455838, -685047, 2587181, 2978023, -5433671, -6253473, --12175695, -1049046, -6029597, -13441100, -5570036, -2296734, -4160750, 4755066, 5900748, 5827734, --11477226, -8333847, 3121368, 13943074, 8027294, 121333, 1826972, 4060892, -5104569, 3400540, --4742181, 3445101, 4769025, 876173, 3800509, 1344862, -411243, 2156611, 1078037, -3593277, --4822175, 6587943, 2497524, -4628364, 4514011, -2480344, -602906, 11238856, -5439039, 6402186, -12338904, 5174362, -823560, 567473, -4599910, 5908265, -6050535, -3171833, -10094784, 1961726, -7624104, -119185, -7158100, -2450816, -10105521, -5026723, -1922535, -14206141, -7814156, -1343788, -1480690, -6181532, 3150896, -1584843, -4930623, 5420786, 15805480, 1556389, 8096550, 5564130, -4815732, -4858145, 2227478, -8323647, 1087164, 2723546, 2149094, -2858301, 376347, 20920248, -13687524, -7587060, 3000035, 6527277, -2543158, 3602941, -1057099, 6057515, 3455301, 1722282, -6037114, 2945274, 3113851, -2129230, -13940927, 6460705, -2170569, -3571802, 11345693, 6524592, -4075387, 4765266, 4036196, 2462090, -1942399, 1273458, 676994, -4013110, 3156801, 4413616, --7788387, 1134408, -4968204, 3421478, 4641249, -12934294, -1074, -15324443, 455803, 1418413, -1459215, 3609920, 10351408, -1712081, -5080947, -3066070, -2646774, -4417374, 3099893, 2631204, -1153199, -2190970, -1663763, 9315784, -3119757, -2558190, -5242545, 8163659, -1191317, 6735046, --3337727, 7210177, -7464653, -16655883, -4630512, 258772, 3328600, 4612795, -5285494, -4822175, -2260764, 589484, -2419140, -4996121, 10095858, -4515085, 9780714, -3651259, -6744710, -168041, -894427, -9296457, -7530152, -2224793, 2401961, -1286343, 12073690, 7459822, 151934, 11796665, -4039417, 3523484, -10198400, 9496173, -1943473, -2266669, -8638790, -3730716, 7307350, 7488276, --2309619, 4988068, -10361609, -1358283, 6620155, 5203890, -4006668, -7155416, -4263829, -4404489, --5781026, -4583804, 893890, -7539815, -951335, 10519449, -5267241, 1243930, -617402, -2384244, -3866008, -1649268, 6629282, 26307, 9442486, -2467996, -6300180, 3500935, -5016522, -4763656, --5009006, -13717052, 1404454, 5670431, 7994545, 5874979, 10581189, -1116155, -4248797, 6183143, --7707319, 1750736, 1153199, -1172526, 7009387, 6455336, -1493038, -8332237, 2030983, -4372814, --7152731, -7597797, 2285996, -11780558, -7352447, 1567663, -7179038, -17571784, 13259101, 1074, --1167694, 2015950, 794569, -11514270, 7991861, -12014097, 827318, 5945846, -1889249, 2367064, -1721745, -12940200, -4727149, -5586142, -1489280, 3045669, -4616553, -2435783, -795643, -446140, -958851, 5885179, 2716567, 12271258, -4582730, 16720308, -1398549, 794569, -10958072, -1235340, -7708393, -1222992, -16718160, 7011534, 7407745, -4536559, 3802120, -5784784, 11164767, 6685654, --573378, -298500, -7574712, -4297115, -8266202, 7884486, 7155953, 3636227, 591095, 3760244, --6717866, -16618839, -6473590, 6331856, 2349347, -12239046, 53687, 1846836, 1457068, -5709622, -4064113, 9258876, 4347581, 427349, 3348464, 6270653, -3750580, 8901857, -148176, -18527416, -9816148, -2275259, 3407520, -5287642, -3376381, 8199093, -9503689, 9178345, -5891085, -10421738, -4481799, -5502390, 22410066, 3630321, -8342974, -10830297, -2377801, -13496935, -6709276, -14562623, --1283658, 10096931, -7433515, 6301791, 9540196, -9052180, -418222, -10606959, 5592585, 2307471, --873489, 6529424, -7221988, -9521942, -8682276, 708670, 1303523, 8268886, -12247636, 8462159, -1078037, -17180406, -10087804, -13857175, -6324876, 5392869, -5318244, -4583804, -27203250, -495532, --6491306, -2391223, -17724794, -5910412, -2962991, 1322850, 13160317, 12645457, 9950365, 6119255, -12597139, -14500346, 10407243, 1446330, 4374424, 3616899, -11201812, 15800648, 9002788, 6016713, --7983808, -9882720, -7715909, 8644695, 364535, -1005559, 7307350, 13036299, 14505178, 5672578, -10198937, 7928510, 5022965, -2814814, 1244467, -4105452, 501974, -1546725, -8492224, 10827613, -17654464, 6771553, -4624606, 7639136, 7611756, -508417, 4785131, -8455717, -15751256, -10788421, --7088307, 4396436, -1775969, -8517457, 6361384, -3062849, -7289097, -298500, 13033615, 6291590, -9693741, 3143379, 7174206, 7610682, -1643362, 6958384, -2636036, -8362838, 3596498, -9648107, -3682398, 3597572, -13775571, -9206799, 5863704, 14284524, -7322383, 9928891, 14197551, -11708618, -648540, 12718472, 1561758, -4723927, -889595, -6569153, -11271605, 187368, -3265249, -5902896, -8121783, 603443, -12868259, 17160542, -6661495, 14157823, -15819975, -10267119, 8245264, -8717173, -5776194, -4632122, -1686312, 1163936, -12829604, 8497593, -6050535, -12095702, 17661980, 10380399, --14010183, 10094247, 7438884, 3254512, 14668924, -31301722, 1306744, 13980119, 3495567, 1960116, -12938589, 1307818, 6568616, -17824652, -3638911, 5786395, -933082, -8580808, 2419677, 8172249, -2371359, 4224637, 8613020, 8905615, 11826729, 10995116, -5430450, -3584150, 8757975, -5631239, -5667746, -10910291, -7790534, -14143327, -8307004, 8727910, 1190780, -2822331, 10407243, -13816373, --21226802, -30902826, 7889855, 11417634, 6549289, 7194070, -9491341, 5537824, -6488085, 12414603, -29436096, -4416837, -9143985, -13281649, -6997039, 12426951, -10905459, 7371775, 8679592, 2506114, --3554622, -8559870, -6289443, 5159330, -26021596, -19267224, -2484639, 4508642, -12589086, 2682207, -48217988, 26272852, 17768816, -5040681, -4240744, -1247151, -3454228, -5559835, -6790880, -9566503, --14688251, -2684, -506269, 3044058, 7222525, 11993159, 19743428, -3266323, -24424406, -10470057, -21959094, -4058744, 8548596, -3502546, 144955, 13538811, 5435281, 10094247, 6854768, -1203665, --182536, -968515, 7653632, 8430484, -3146064, -14854681, 18825378, 12394202, 9764608, 2632815, -5142150, -8311299, -13596256, 18347564, 11026792, 4073240, -8624294, -10799158, -13655849, -9476308, --2260227, -9638443, 4989679, -18758270, 2582886, 12125230, -8473970, 3587908, 795643, 835908, --20382304, 6053757, -8891119, 13610214, -32899450, 4318053, -8961986, -12377559, 2059437, -8110509, -5780489, 4788352, -22626962, -1400696, 12586939, 813359, -29348048, -14916958, 2062658, -25587804, -5800354, 18772228, -9067750, 22798760, 26514980, 3511673, 13209172, 16538308, 7281044, -15604153, -10201084, 12661027, -681289, 3311957, 8771934, 7962870, 18719614, 3361886, -7285339, 12149926, -4256313, -1694365, 237834, 8211441, -11001559, -4780299, -4664335, 6893960, 3463891, -15280420, -4567161, 13133473, 350577, 15795279, -14723685, -27619860, 2251100, 12724914, 18927920, 17763984, -9094593, 8567923, 6726993, -18652506, -5454609, -512175, 14294725, 22735410, -7634841, 5144297, --8114267, 5636608, 3741990, 14009110, 21361556, -7785165, -9026411, -1447404, 11883638, 15312095, -21203716, 966368, -22103512, -20765094, -2928094, 3281892, 772557, -9158481, 1203665, -24954296, --14977625, -14218489, -13561896, 8924942, 12704513, -27642410, 2850785, -5721970, 15404437, -8242042, --784905, 4462471, 11859478, -15394773, -25141128, -4552666, -9469866, 674310, -10949482, 6825240, -7436199, 715112, -13118441, 8741869, 1661079, 23289998, -2851858, 12861280, -9801652, 24143622, -7854422, 15201500, 11040750, 16610249, 25025700, -5460514, 10435160, -16324634, 18877992, 17663590, -882079, 6129455, 18656264, -10465762, -9265855, -1090385, 36348844, 6408628, -8135205, 18117246, -3964255, 14165876, 20875152, 6547678, 623307, 2875481, 5010080, 13766444, -2238215, 14790257, --7006166, 14592688, -4820027, 31292058, -1666447, 27284316, -20331302, -23575612, 38542500, -27572616, --12498892, 3541201, -5835250, -15781857, 20346870, 831076, -18097918, -7385197, -6090264, -29693794, -5254893, -24707874, -13632226, 2655901, -28371480, -19357418, -19260244, -23113904, 27395986, -2588255, -2392297, 5699422, -6079526, -35038880, -23264228, -26274462, -47917876, 1404454, 6922414, 19085224, -13729937, 5108864, 11862163, 5039071, 3492345, -17954574, -21721798, -15630997, 18855444, -4782983, --12335146, -8009041, 18386218, -23736136, -12654584, -24392730, -9880572, -4712116, -19934016, 4753455, --16481937, 15567109, 13738527, -6073621, 13487271, -15983184, -25553982, 7949985, 15628312, -17045652, --29584272, 18781356, -1721745, 12381854, 13812615, -46935940, -30427158, -4103305, -7122667, 23189602, --16336982, -23465016, -5527086, 4893579, 759672, -8430484, -10819023, 30542586, -19648938, -37345816, --42740292, 20929376, -9686762, -43407088, 11859478, 3286187, -7861401, -4075387, 2863670, -25913686, --12169790, 13683229, 19053548, 42781632, 5324686, 22796612, 9000641, 11431592, -11184632, -2237678, --9846749, -22163104, -28712930, -37116032, -15621333, -33437394, -15319075, -17280264, -8662412, 18773838, -2420751, 12854837, 19366544, 358630, 12307229, 4480725, -1571421, -322659, -5237713, -28639916, -7975755, -3583613, -35033512, -20185272, 6816650, -21010444, -10755672, 7304666, 20702280, 28210956, -6978785, -6442451, 853625, 18524730, 7043747, 3288334, -3892851, -57513908, -14881525, 11482058, -10767483, 4517232, -5924371, -20504710, 9317395, -18664854, -16942036, -5238787, -820876, -11657615, --34752728, 13619878, -8611946, 34632468, 9325448, 9291088, 9225053, 23314156, 56604984, -4525285, --4307852, -9814000, -21225192, 29459718, -2090039, 3503620, -32498406, -14009646, 42769820, -29367912, --5268851, -25762824, -67157184, -12178380, 23302346, 15165530, 5396090, 2651606, -1740536, 36397164, --39843336, -2470680, -10093710, -30414274, -21757230, -6007586, 9827959, 4458176, 11210938, 22517440, -18077518, -20307142, -16260209, 47241420, 42472932, -5899675, 6487011, -8123931, 14955076, -2886755, -30704184, 7854422, 17050484, 1586454, 3809099, -54334020, 22874996, -5063230, -28222766, -18007724, -4351876, -10942503, -28190554, 25445534, -3728032, -24096914, -3173981, -29528, 26364656, 25017648, -22544820, 4969814, 26132192, 23431730, -19284940, -25638270, -13312251, -7378217, 26728118, 30806190, -6522445, 8167417, 33819108, 15131170, -31024696, 17287244, 8638253, -14576582, 1690607, 50896972, -28792924, -18375480, -27845884, -43876312, 8343511, -7981123, -14577656, -17414482, 9413495, -10341744, --5541582, 29758218, -9511205, -1051193, -23281944, 2474438, 14245333, -31453656, -20601884, -18549426, --9773735, 12329777, -43568684, -23382338, -62718332, 11561515, -898722, -15138149, -7201050, -8476655, -13125420, 20810190, -22363358, 1621887, -7901129, -6696391, -39129836, 9416179, 29843580, 8783208, -22589380, 29326036, 25451440, -33272038, -10441065, -9370008, -15952045, 29765734, -29291140, -15916612, -1197759, 42861088, 9665824, -13532905, 42391864, -22477174, -21865678, 51480016, 48547088, 5984500, -12809740, -12225624, -44884556, -12457553, 46723876, -20536386, 42601780, -13099650, -64262912, -15097884, --29098940, 37459096, 2270427, 10918881, 33862060, -946503, 28398860, 12467216, 22647362, 2259690, --42067056, 25129316, 27910308, -33795488, 18442590, 453656, -12785581, -14040785, -49936512, -21181704, -17169132, 3893388, 45312980, -35787280, -20883204, 9390409, -5193153, 30070140, -40714680, 951335, -4082367, -33360622, 34261492, 19791210, 10466298, -15068893, 23529442, -26751740, 15447924, 13043816, -7349226, -848256, -15371151, 7609072, 31405874, -15209553, -5727876, 7335268, -24143622, 26188564, -1310502, 7825431, -33101850, 19383188, 4857608, 7484518, -78101296, 12142946, -21819508, 38103340, -30969936, 33666640, 17103096, -62514860, -10573136, 15076946, 2044941, 5597416, 45717780, -5405753, --26371100, -31278100, 2041720, -35057672, -31018254, -27220966, 14171781, -52203716, 37973416, 71612136, --18625126, -9939091, -56607132, -16937204, -49818400, 12492449, -21022254, -16729434, 17043504, -13977971, --16551730, 12861280, -22219476, -2854543, -25527674, 37637336, 2188823, -29903172, -6913824, -708133, --1350230, 7724499, -17532056, -14539538, 5811091, 6537477, 6118718, 2515240, 16355235, -18457622, --5036386, -40751724, 16207059, 2423435, -10492605, 27258010, 17164836, -12930536, 45221172, 8447664, --25851408, 19503446, 5170604, 12291660, 30409442, -3852586, -5461588, 3357591, 25353728, 12301323, -2146947, -3508452, 27015344, -3300682, -27885612, -6104759, 7065758, 22356916, -8714489, 39236136, -45935748, -28957744, 24749212, 49088792, -11856257, 75017512, 44282724, -19457812, -15672873, -28876138, --30750892, -18427020, 11524471, -5608154, -4388383, -668941, -3732864, -52153252, -19607062, -50984484, -12059194, 67464808, 16966732, -23203560, 2021319, -30672508, -4745939, 11765526, -13651554, -15915001, --19202262, -6255620, 6582575, -3286724, -6538551, 9331353, 4350802, 12372190, -12396886, -6554120, -8049306, -2151779, 1033477, -16399796, 11294153, -19332184, 9286256, 7721815, -4828617, 134755, -308164, -10715407, 1555852, 3514894, -9810779, 18134426, -9535901, 5295695, -289373, 1813013, -8215736, -7118372, -13390634, -2608119, 19285476, -13214541, 9281424, -25309168, -16212428, 6527814, --6091338, 1090922, -2069101, -14504105, 16767552, 15273441, 962073, -10053445, -850940, -5355288, -3257196, -7037304, -521302, -6571837, 6207839, -238371, 1481227, 23889682, -18442590, 903554, -3132105, 4028143, -4008278, 3568581, -8610336, 4117800, -7173669, -31237298, -48108464, 33758980, -150781264, 67173288, 68679752, 325881, -141077872, -100767984, -53613004, -109789568, 52883932, 66735200, -33494840, 143756320, 63494648, -5431523, 46614892, -91746408, -118776784, -66561256, -83453896, -17039746, -63085552, 66214436, 26592826, 110709224, 53745612, -6866579, 52058224, -47881368, -84322560, -47101832, --63642288, -97799624, 35474820, -61203, -36228588, 106965624, 63090384, 36785860, 107843944, 27092654, --56047176, 54349588, -79554608, -88912264, -19219442, -93557808, -96620120, 38710540, -16697222, 23999204, -119894552, 83562880, 85245976, 82080584, 9014063, -44677324, -53461068, -87240984, -116417240, -59766080, --33745560, -23053774, 43366820, 69708392, 63908576, 92433064, 82012400, -11800960, -15156403, -13768591, --85184232, -23875186, -41391136, -57782880, 14991583, 15187004, -727460, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ --3161633, --7335268, -2953327, -4199405, -2286533, 5206574, 2805151, 404264, 4345970, 2943126, -3470334, --4744328, -2906082, -2251637, 567473, 1776506, -4748623, -664109, -1881733, -74625, -561030, --1050120, -2517925, 5964636, 3493419, -426812, -4907537, -1965484, 1066226, 2006824, -151934, --1964411, 882616, 1709934, 592169, 1597728, -1355599, -231391, -3757560, -4873178, -1030792, --461172, 2405719, 2901251, 2079838, 576599, 698469, 1660542, 2501282, 708133, 3333432, -1329829, -2103997, -2516851, -22549, 2368675, 2256469, 957778, 520228, 3595425, 2430952, --4287988, -3681324, -2237678, -2025614, -1838246, 2463164, -1668595, 1176284, -4060892, 2962454, --2884071, -2058363, 2066416, -1300301, -1811403, 4696547, 2877628, -4475893, -886374, -1729798, --31675, 6410776, 481036, -2916283, 3547106, 576599, 455803, 1021665, 825707, -71404, -5014375, 2637110, -3223910, -1417339, -281857, -1306744, 1476932, 1955284, 1506997, -1569811, --2026151, 667867, -4181688, -2098629, 3309809, 125091, 2683818, 1162326, -1991254, 1415192, -124017, -2014340, 4607963, -3195993, -1322850, 392990, 1649268, -2253784, -445066, -3161633, --5768678, 5284421, -1000727, -3273839, 425202, 4822712, 109522, 1717987, -2401424, -1713692, --924492, 1289564, -1869385, 3758097, 758062, 3344706, -5159867, 1916629, -1239098, 536871, -2390686, -1293322, -430570, -4332012, 202937, 1628330, 678605, -1655710, 48855, 1180042, --699543, -2048699, 13666586, 4842576, -1209033, 3849365, 72478, 6918119, 4154844, -837519, -3376918, 6223408, 7867307, -4597763, -4735202, 2079838, -1983201, -1424855, 5589363, 4734665, -4273493, 3257733, 467078, -60130, -2119566, 2300492, 1395328, 7398618, 608275, -34360, --3347390, 1640141, 2000381, -287763, -1124208, -1009854, 1839320, -157840, -1308354, -2531346, -2688650, -812286, -1095754, 4158065, 5559299, -1326608, -842887, 3444564, 2803540, 5376226, -3086471, 1594507, 384936, 4612795, 2360622, -5958194, -153545, 2063732, -3696893, 284542, -408559, -4168803, 2051921, -1904281, 3097745, -469762, -756451, 2024540, 366683, -2729989, --483721, 1998770, -825707, -374199, -1133871, 768799, 3197066, 1176284, -3799436, 4766340, --370441, -9005473, -4190278, -1750199, -1949378, -4904853, -4503273, -2831457, 4875862, -5367099, --2508261, -2552284, 975494, 8132521, -1229971, -653372, 1981054, 4650913, -7134478, -1169842, -1440425, -3153043, 2499671, 3973919, -4410395, -280247, 545998, -2563559, -6488622, 1115618, --2748242, 867047, -2535641, 3690451, -4496294, -4177393, -10297721, -2776160, 3487514, -583042, --3983045, -1950989, -546535, -4138201, 151398, -707059, 2772402, 2231236, -1132798, 117038, --1127966, -4368519, 5233955, 915365, 3499325, -1331440, -95026, 924492, 1435056, 4110821, --1457068, -1005022, 1065152, -124017, 4325032, 2400350, -4089346, -1543504, -1199907, -6149857, --959925, -557809, 3345780, -2309619, -19718732, -6285685, -1656784, -1679332, -1557463, 7571491, --6950331, 3324842, -1535988, 1487132, -1899449, -1699733, -5558762, 874026, -1942936, 375273, --8112120, 115427, -702227, -1523103, 13959, 1508070, 1404454, -818728, -402653, -3339874, -1189706, -2683281, 1922535, -27380, 1674500, 5131412, -1158031, -5916318, -2325725, -6920266, -1162862, 1241246, -412317, 1197759, -2190970, 2321967, 1421634, -3048890, 505196, -8288750, --1521492, -5531381, 3300146, 5525476, -4569845, -340376, 1855963, 889595, -7633768, 1377611, -4376572, -3740380, -1497333, -8967892, 3395709, -1220845, 4077535, 6800544, 4171487, -5267241, -1505923, 1411971, 672162, -5822902, 1931662, -2354179, 4372814, -1366873, 171262, 2172180, -1802276, -11871290, 964220, 2579128, -4780299, -158914, 11596412, 9694278, 4663261, -956167, --2567854, 6346888, 3346317, 2292439, 1862405, -4427575, 1246614, 847719, 5232881, -4997195, --2865280, -644245, 298500, -717796, -6622303, -3825205, -4788352, -4777614, 2433636, 3848828, -1794760, 1923609, -325344, 1890323, -1225676, -278636, -59593, -1483374, -999654, 3117073, -1648731, -3818226, -5189931, -34360, -5217312, 3234647, -1944547, -7567733, 437013, 4478577, -5204964, 4406100, -344134, 4195646, -6288906, -1384590, -3167539, 58519, -257698, 3026341, --2665027, -4726612, 5596880, -5252745, -3583613, 4469451, 8276402, 2749853, 794569, -8335995, -8520141, 1868311, 5344013, 11244761, -4107063, 2183454, -1401770, -2419140, 1991254, 18580028, -13009993, -4619774, -6859063, 10324028, 6650220, 10858751, 15843597, -7998840, 5446556, 2680597, -4546223, 2095944, 2696703, 6597070, 1553168, 6731288, 130997, -4286378, 1706713, -1384053, -2160369, -802622, 12230456, 2075543, 2597918, 1657857, 357019, 4298726, 1695438, 226023, --943282, 3059091, -2546916, 5867999, -4774393, 7066832, -3540127, 4250944, 2059974, 2573222, -1884954, 10378788, 7767985, 434329, -2473901, -5733245, 5947993, -6978248, 1480690, -3101503, -2777770, 6447283, 505196, -11035382, -9177271, 818191, -5840619, -6095633, -3790846, -7017440, -2107755, 11861089, 5628018, -4528506, -132070, 1260036, -3580929, -3655017, -1068373, 5752572, -5999533, -7070590, 2659122, 7543573, 702764, 2435783, 7866233, 1857573, 11526618, -732829, --426276, -3609383, -3445638, 4284767, 8670465, -2282775, 2105608, 973347, 9430138, 4349192, --4762582, -3819300, 390842, 2385318, 8567923, 8992588, 12913893, 2756295, 3437585, -1931662, -5146982, 6474127, -2566780, -2626909, 4530117, -3226594, -5216238, 5135171, 1255741, -5415954, --7308961, 11291469, 5303211, 65498, 6799470, 1795296, -4989679, 10770704, -2524904, 774705, --341450, 3148748, -3831648, 3158949, -3818226, 3098282, -3528853, 3663070, -2866891, 4815732, --3585761, -3136400, 9664750, -11494943, 766115, 1986959, -4002373, 1380832, -13342853, -6053757, -6711424, -4777078, 4297652, -796716, 3108483, 1848447, 2867428, 2132451, -5353677, 4048007, --2427194, 354872, -9480603, -8393440, 85899, 3463354, 6843494, -7961796, 2367601, -7170448, -5925981, 4322885, -9571335, -2141578, 1142998, -11487427, -6356015, 6767258, -799938, -637803, -1726040, -864899, -11796665, 10711648, 780610, -7853348, -3670587, 1283658, -927176, -7563438, --2153926, -4422206, 1285269, -547071, -2309082, 2190433, -10261751, -4767414, 2693481, 13276818, --2231773, -8119636, -5589900, -4619774, 9167608, -9989557, -1970853, -909459, -10472741, -13253195, -3149822, -9274982, -1505386, 1073742, 6764037, 3543885, 440771, 1171989, 8036421, -3878892, --2746632, 11766600, -8343511, 5908265, -3069291, -3503083, -1586990, -2003065, 12524662, -329102, -4498442, -14101451, -10365367, -644782, -2842195, 13582297, -811749, 8082592, 1983201, -15834471, -1401770, -1444720, 10787347, 1393717, -11700565, 13944148, 4323422, -7971460, -17900350, -7264937, -17449916, 1021129, -2343979, -2785823, 1699196, 740345, 5310727, 3037079, 5701032, -1086090, -10266582, -5172215, -12317429, 705985, 471910, -2713883, -536334, 4783520, -3227131, -1656784, --1152125, 9992778, 7500624, 4158065, -804770, -13065291, -338766, -442919, -636729, -1948841, --297427, -5548024, -10935524, -1412507, 7380365, 7565048, -2821257, 8120710, -2610803, 3705483, -8477729, 8557185, -18221398, 6587406, 6418829, 3109020, -4546223, -15460809, 9490267, 6145025, -2912525, -5174362, -3362960, -5881421, 3330747, -6529424, -1597728, 788127, 6145025, -3266860, -2872796, 2691334, -12185896, -469225, -8614631, 14236206, 1522029, 9586904, 12512313, 12082817, -9881646, 11829951, -15036681, -10452877, -4981625, -5400385, -7048578, -6062883, -12033961, -4616553, -1119376, 6910066, 269509, -7512972, -65498, 6884833, 612033, -6567005, -2617783, 16231218, -1851131, 5789079, 2142652, 6402723, 1608465, 1724966, -10096394, 5207111, 555661, 1834488, --10622528, 3175592, -16414291, -573378, -5115843, 3524558, -1414655, -12684112, -212064, -12640089, -2265595, -10618770, 9168681, -5812702, 14368276, -195421, -279173, 6577206, 1511292, -2945274, --2187749, 2243584, -5018133, 2692408, 8706436, 3820374, -6788733, -4174171, 18734110, 718333, -14829448, -14784888, -3342558, -2240362, 10532334, -13004087, 1123671, 5126581, -12961674, 7805030, --8696235, 1612223, -4848481, -15177878, 2091649, 15122043, 10950556, 12361990, -4336843, -3037079, -2766496, -2041183, 14821395, 5125507, 6870337, 12789876, -1289564, 4782446, -9055402, 12684649, -5935108, -3245922, -8232379, -7324530, 8060580, -14851997, 5267778, 8352101, -6680822, -8401493, --5248450, 7715372, 2385854, -3226057, -6008659, -165893, -9726490, -13975824, 1818382, -13466870, --20251308, -2851322, 20401, 19370302, -9315784, -7239704, 8014409, 14056891, 13764833, 7188165, --1771674, 2735357, -7223062, 410169, -7568269, 15527381, 13384192, 8465381, -1721745, -17637284, --1211718, -15301895, 14558865, 11047730, 6369974, -13123273, 8483097, 4108136, 5420786, -3846143, --11421392, -9156870, -9463960, 548145, -12732431, -23264764, 2681133, 10616085, 6621766, 6963216, -13364328, 26006026, 12822088, 8518531, 9630927, -17493402, -1719598, -6934225, 22160420, -22444426, --19582366, 5038534, 14791330, -1217623, 17892834, 14576582, 191126, 5114233, -9250286, -8150774, -17078400, -7156490, 12037720, 3139621, -6221260, -4524211, -2215666, -4319664, -6513318, 5517423, -7681012, 4859756, 1519882, -9104257, -9766756, 13239237, -12700218, 10107669, 2029372, -17585744, -9570261, 15463493, 736050, -5012764, -964220, 697932, 2028835, 10410464, 544387, -8826158, --2299418, 8829379, -15874199, 3622805, -1647657, 13409962, 15879031, 9356049, 12748537, 14715095, -12188580, 3641059, -8373576, -11272679, 6849936, 7212324, 1090922, 6333466, 10453950, 23067732, --11004780, 14794552, -6377490, -5056787, 18456012, 2838437, -17373680, -3697967, 10934450, -13339632, -943819, -8566312, -13584445, 20077362, 18129594, 14223858, 7534447, 3371013, 6364605, 14639396, -8930848, 15028091, -5120675, 12523588, -9140227, 15266461, 21714280, 12797929, 11187853, 4954245, -11550241, 10560251, -2573759, 21420612, 5939940, -13547937, 6961605, -13704704, -8423505, -3106335, --19960324, -13422, -3637301, -5980205, -9269613, -5594195, -2065879, -994822, -1190243, 558883, -1748052, -12225088, -6943352, 2140504, -5337034, 4624606, 21384106, -10592463, 185220, -2231773, -1811403, -10033044, 6359773, -4947803, 16950088, 3120831, 10646687, 14557792, 3798899, -1159104, --8390755, -21819508, 4304631, 16088411, 13268765, -3002182, -12770012, 12416750, 3154117, 7919383, --16343424, -11881490, -9074729, 9100499, -30776662, -19549080, -9411884, 22051436, 15925739, -11758010, -13655312, 12496744, 10518375, 10471667, -10300942, 1214402, 5965173, -10066330, -30902290, -5461051, --8536248, -18767934, 1779727, -6263673, -4769025, 6015102, 3553549, -3994320, 1035087, 14731201, -15651398, -28271086, 6948184, 1702418, 13383118, 4748623, 936840, -17492864, 5664525, -4283156, --4661114, -11936788, -8782671, 23125714, -10038949, -126702, 3088618, -5752572, 25671020, 12286291, --10806138, -6516539, -19284404, -2566780, 19436874, 5830955, 6311455, -5929203, 12203076, -2454037, --4251481, 10882910, -5478768, 17857400, -3222299, 13335337, -25720412, -8898635, 16534013, 3883187, --1060320, 4350265, -27930710, -14081050, 6595996, -12079596, 7317551, 589484, 7589744, 16123307, -6878927, -14683956, -37129456, -4573604, -3336116, -5482526, 7182259, -16660178, 31416076, -6828998, -2622615, 31893354, -37829000, -5409512, -6375342, -5077188, -43516072, 1143535, -5662915, -10022843, -16457778, -16750909, 3626563, 1556389, 8509941, -2798708, -15055471, 9768366, -9451612, 21867826, --2736431, -27813134, -671626, -2324114, -12040941, -28037546, 13225278, 12076911, -20973936, 16703665, --18837190, -17152488, -8329552, 246424, 2934000, 1469953, 14184666, -3987877, -10916733, -30561914, -7271380, -40785008, -19451906, -15089831, -30010010, -20240570, -7624104, -3588982, -13278428, 20768852, -24613920, 3428458, -5388037, 23785528, 13154948, -4641786, -3995393, 16642998, 15453829, -7948374, -26433376, -21963926, -7907572, 25246354, 15867757, 36624260, -14024679, -12659416, 8124468, -1542430, --14170171, -7099044, 3636764, 29962228, 17075180, -2691871, 40534828, -4560182, 16713328, -18973554, -23739894, 22409528, -1877438, -17683990, 2059437, 6663642, -9779104, 10794327, -14334453, 25770, --4223564, -4486630, -16264504, -11777337, -7219840, -656593, -5020280, -12609487, 19675246, 13670881, -3984656, -4935991, 3729105, 19086298, 9226127, 14199162, 9108015, -9584220, -15181636, 32410360, --3566434, -16691317, -6600291, -6728603, -3460670, 23788214, 1735704, -16876538, -5965173, -43149924, --9980967, -4177393, 28092844, 19815906, -52536040, -21914534, -11918534, 977642, 3899830, -20026896, -17068736, 9890773, 15156940, 28458454, -33530272, 36100812, 26454314, -9327058, -21649856, 3389266, --3819300, 10773389, 33036888, 27666032, 4153770, 10132902, -21547850, -35031364, 50321448, 24568286, -2592013, 2791192, -10939819, -29943438, 10615549, -2833605, 25512106, 5071283, 9630390, 27065274, -15555298, -949725, -2708514, 4005057, -16634945, -14583025, -17709224, -10757819, 16825534, -5335423, -1265405, 19933480, -3354370, 8233453, -28631326, -26838714, -17369384, 14007499, 6311992, -1987496, -7085086, -10256919, -25705916, 31600758, -30863634, 13124883, 15045807, 10369125, 5473399, 18478024, --12492986, -33245194, 23848342, 65190624, -11400454, 30668750, -38415260, -22633404, 24438364, 12251931, --35529580, -12052215, -2465848, 29275034, -7120519, -5520107, -48229260, -33741264, -10359998, -38345468, -31141734, 29596082, 51863340, -47317656, 20812338, 3183645, -22970558, -3358665, 1447941, -50529216, -9861245, -9354439, -45156212, -24776592, -1451699, -6233608, -15486578, 5945309, 13859859, 2013266, --16336445, -276489, -15680926, 41557028, -13133473, 1453846, 30586610, -1239635, -32440962, -21701932, --22337588, -9167071, -12134893, 34681324, 3026341, 6123013, 16527571, -8896488, -10054518, -5280126, --10237055, -20398410, -5405753, 39633420, 12144557, 9743670, -26545046, 10022306, 1545651, -18156438, --2657511, -8920647, 42039140, -33282776, -29522532, -9903121, 4823249, -9718974, 818728, 11753178, --22614614, -5711770, 35555348, -28836410, 4632122, -7127498, -18111340, -30698816, -23986856, 1169305, --43329776, -51895552, 11858942, 10480257, 7887171, -46581604, 35353488, 43069396, -15156940, -13159243, -2355790, -2623151, -10067940, -25223806, 17350594, 63840392, 10054518, 11325829, -14048301, -37539624, -10532870, 14566918, -55275692, 30331060, 1523103, -15837155, 5554467, 20230370, -28412282, 17715130, --26344792, 7219303, -1245541, -13365938, -7136625, -3558917, -19261318, 14139569, 12651363, -450972, -7161321, 998580, 11276437, 14351096, 14145475, 20534776, 17928268, -10590852, 3198677, -21942452, -24029268, -17914846, 6288369, -3196530, 5350993, 1495186, -16226386, 15663746, -7907572, -15833397, -34724812, -26819386, 8868034, -7371775, -12838194, 14291504, -2794950, 4665408, 22033182, -25035902, -1884954, -30763240, -61070140, -830002, 20706574, -6624987, 80684720, 17109540, -30014306, 9728638, --42213088, 16156593, 32410896, 37893424, -11107859, -5897527, -46525772, -53790708, -2515240, -32605782, -11079405, 533650, -39602820, 8212515, -2949569, -22984518, 10292352, -14906221, -10191421, -18545132, -9392020, -20202452, 25837450, -2705830, 9492951, -5928666, 34720516, -9415105, 19002010, -259309, -22668300, -6311992, -11680700, 7509214, -13213467, -13714367, 1682017, 26027502, 16484621, -17598628, -18650358, -13174812, -20548734, 5813775, 27493696, -10582799, -11612518, 14959908, 6340446, -13712757, -1196148, 19025094, -8263517, -18029736, 9480067, 7738458, 11147051, 21454436, 3954591, -12640626, --4780299, 46956876, 48483200, -13326210, -41337448, 31454730, -14344654, 9099425, 3591667, 52966072, -6308770, -26939108, -11021960, -6197101, 307090, 8621073, 11362336, 17644262, -21872120, 7145752, -2791192, 31231392, -9831717, 22362820, 20313584, 13921600, 7151121, 8413841, 11427297, 56317760, -22507240, -24211268, 5237713, -25316684, -15006616, -919123, 8678518, -3286187, 19543712, -23296440, --1532230, 10483478, -1586990, 10886668, -2211908, 4462471, 1559610, -16347719, -6210523, 5588290, --16949552, -15249281, 612033, 5284421, -12273406, 9361955, 7198365, -3698504, -8904541, -107911, -992674, -1617592, 6061810, 3032784, 4600447, -5826123, -3830574, 14062797, -803696, 2080912, -5301064, -2610803, 5934571, -4924180, -12894566, -6185290, 11517492, -8164733, -8181376, 2560338, --10745471, -8675834, 14097156, -13032005, 22819698, 7361037, -11701638, 12725451, 473520, -15261629, -278636, -533650, -4473209, 11278047, -1764695, -7216082, 18665390, -8633958, -6573985, 14584635, -1277216, 401043, -1929514, 9380209, -3249143, 8346195, -7959648, -32926830, -41022308, 34704948, -137272528, 54618564, 62631360, 1524713, -129765992, -94425392, -50347216, -75105560, 33362770, 65935800, -26276610, 116046256, 64647848, -3649112, 26484916, -57628260, -118294672, -46253040, -82354928, -12353400, -55996172, 48419312, 42556684, 72631656, 43742632, 12935368, 19131932, -4610111, -84348864, -36246840, --30776662, -114919368, 20836496, 15944529, -51993800, 84121232, 81843824, -2007360, 103717552, 52125332, --49085572, 33216740, -48802640, -99426880, -8575439, -59695212, -88379688, 16418049, 8770323, -4301947, -81210312, 79878336, 46509128, 71253504, 42074572, -26255672, -31397284, -53624276, -94420024, -68037112, --33630132, -29681982, 16244103, 54370528, 35650376, 59759100, 87377888, 35992900, -11992086, -8795556, --61041148, -46013596, 4843113, -49038324, -18105972, 18257906, -3688303, 0, 0, 0, -0, 0, 0, }, -{ --2585034, --6458557, -1875290, 1891396, 347892, 2050847, 1841467, 5793911, -1076426, -266288, -651224, --4194573, -3362423, 790274, 675921, -274341, 2022930, -6150930, -3652333, -3535832, 2113661, --63888, -900869, -1084479, -1076963, 969052, 1435056, -373662, -797790, 2165737, -3448859, -3494493, 2368675, -1294396, -2873870, -571231, -4226248, -1808718, -5934034, 2421825, 2223719, --376347, 1289564, -3872987, 3503620, -75162, -586800, 2807298, -3904125, 124017, 3304977, -843961, -905701, 246961, 469225, -3580392, 2785823, -629750, 3441880, 378494, 892816, -668941, 1102733, -2083059, -2416993, -2416993, 1851131, -1467805, 354335, 4126390, 5426155, -3099356, -549756, 1268089, -24159, 74625, 490700, 3484829, -4723927, -3761318, -701690, -3730716, 5383742, -2515777, 3121904, -1714229, -4576825, -1198833, -2582886, 1528472, -678068, --2146410, 1947768, 3083250, 623307, 3718368, -6801081, -7243999, -4742181, 717260, -82141, --1206349, 285078, 2262374, -797253, 3041374, 2409477, -3143379, 1137093, -199179, 3811784, -3624953, 1272921, -3770981, 2415382, -2230162, 1183800, 2540473, -6177774, 6693170, 9674951, -1321776, 4328254, -3553549, -830539, -3331284, -1864553, 3074123, -1126892, -3442416, -1048509, --2145873, 1553168, -2087891, -2088965, 257698, 1636919, -1709934, -2168422, -792958, 3296388, -3214246, -2832531, -865436, -3332895, 850404, 3885335, 1321239, -1782948, -1713155, 1229434, --90731, -3167002, 14972256, 6973953, -576599, 3205119, 2803003, -3544959, -1820529, 4228932, -1843615, 4598836, -3349001, 6659884, 2427730, -6445136, 5116917, 340913, -165893, -3368328, -3732864, -6968585, -6085969, -1223529, -2193655, -1096827, -2202245, 888521, -1353989, -2850785, --2159295, 2526515, -2714956, 1790465, 1038308, 768262, -2990908, 4225711, -8704825, -1436130, --87510, -1427003, -1127966, 841814, 1578937, -2680060, 2172717, -3263638, 3185792, 1130113, -668941, 3440806, -2380486, -440234, 1312113, 5334887, 1253594, 2326262, -1232656, -4356171, --6337224, 1333051, 3390877, 4662187, -1862942, -6830609, 1018444, -2630668, -1995012, -1334661, -1926293, 565862, 6864969, 248034, 2289755, 1962263, -1087164, -858993, -2025614, 8096550, -1890323, -6829535, -7741142, 2138894, -2339684, -6404870, 7326141, -3555159, -1151588, -962610, -5768141, 1243393, -3257196, 4059818, -3045132, 6119255, -8310225, -5472325, 6760816, -6901476, --6943889, -2750927, 5807870, 2581275, 2841658, -583579, 5232881, 3191161, -404264, -6653978, -1963337, -1770600, 2577517, 2258616, 1998770, 5985574, 1741609, -5646272, 714038, 4159676, -6102612, 2137820, -3023657, -608812, -4544076, 2205466, -8219494, -155156, 9403831, 676457, -1264331, -4490925, -5497022, 1100585, 1599875, 6946036, -1101659, 815507, 1103270, -742493, -1125281, 2503429, 880468, 5015985, -746251, 3447785, 1072131, 1177358, 1268626, 5899675, -1060857, -400506, 2057289, -805306, -18246632, -12525735, -2293513, 1672353, 3395172, -26307, -386547, -7439420, -14496, -1867237, -751619, -150861, -1357210, -1115081, -4792110, 2444910, --10583336, -4318053, 1488743, -2483028, -2869575, -2186675, -5767604, -3430605, -2070174, -3213709, -1955821, -5088463, -2100239, 5840082, 4537633, 221728, 3520800, 1957968, -1337882, -4207458, -3064996, 8873402, 1708860, 1000727, -2844879, -3292629, 3388729, -7822209, -3345780, 8479876, --7031399, 2301566, -1037772, -3991098, 2673617, 553514, -1273458, 505196, 2261837, -2687576, -1021665, -488553, 6333466, 4762045, 1807644, 1371705, 3480534, -9127, 248571, -1634235, --9477919, 5499706, 4805532, -2660732, 1586990, -4175245, 726923, 1108638, -945967, 2062658, --858457, -15761993, 2145873, 4093104, -1354525, -1097901, -9254581, -3339337, 2088965, -7655243, --7983271, 1848983, -7618198, -3448859, -558346, -4100620, 2090575, -3181497, 5054103, -2609730, --2276870, 1970853, 3406983, 7283728, 3995930, -7607461, -834834, -353798, 3453154, 6019934, -9435506, -4169340, -4298726, 5309654, -5812702, 1442035, 1112397, 8509941, 2615635, 4820564, --6637335, -2576444, -8903467, 6846178, 6563247, 8198556, -574452, -1601486, -5846524, -1012002, -4968741, -2403571, -3923990, -3106872, -4681515, 1001801, 558346, 1345399, -6230387, -14496, --6103149, -255014, -1255741, 2357937, 1615982, -1709934, -2937221, -7173133, -741956, -548145, -4168803, -2743947, 7177964, -4141959, 820339, 3537443, 6702834, -4945118, 587874, 19498614, -17476222, -1027034, 912144, 8463233, 1612223, 3928821, -2265059, 4450660, -3361349, 8537321, -3460670, -416612, 2218351, 191126, 11733314, 7224672, -7057705, -6637872, 2791729, 753767, --2008434, -2065879, 1811939, 4987531, 4409858, 2025614, 949188, 2410014, -1532230, -616865, -6611566, -7341173, 3113315, 7872675, 6615324, 10870562, -768799, -2212982, -645856, 224949, --3284039, 11840688, 11642583, 7579007, -3431142, -1631014, 5132486, 3406983, -3134789, 255014, -6782290, -2940442, -2728915, 3592740, -11701102, -1923609, 942208, 1231045, -3795141, -8375186, -3446175, 4827007, -6157910, -2908767, -6748468, 2058900, 628676, -1969243, -1416266, -6528351, -10109279, -3080565, 1155883, -10566693, -3020973, -4539781, 13015362, -418222, 8183524, 11404749, --6089190, -13865765, 469225, 10673531, -8330626, 7507603, -2346126, -10036802, -4794257, 10207527, --10071698, -8727374, 6233608, -10106058, 3219078, 4853313, 3811247, -2864206, 5966247, 1731946, -973884, 3941169, -6660421, 8804683, 4147328, 3803194, -2024540, -1023276, 16234440, -5808407, -801011, 4219269, 8046085, -11320460, -9498320, -8711267, 83752, 537945, -836982, 5119601, -1357747, 9213242, 3477313, 5330055, -1175747, 570694, -4927938, 8169028, -4105452, 8035347, --4832912, -7326141, 11893838, 9705015, -14469208, -12710419, -8577050, -6698002, 4009352, 364535, --3309272, 6105833, 6662031, -9004399, 4525822, -1170916, -17747878, -6213744, -9274982, -8463770, -2338610, -3327526, -7707319, -10177999, 6001143, -5742372, -4672925, -3469260, -12403329, -1016297, -5147519, -3025268, -1004486, -4176856, 9728101, 1800665, 6094559, 5118528, -8337606, 8530879, -12113955, -3546569, -5346698, 1583232, -2439542, 5600101, -15618649, 6118718, 12983686, -1521492, --4642323, -3543348, 5472862, 12129525, -3126736, 3237332, -5616744, 8377334, -10133438, -3536369, -1586990, -1313723, -7946763, 14242648, 9553618, 7617662, -3468186, -10365367, -1655710, -14818711, -2228014, -906238, -857383, -137976, -2655901, 8300561, 6483253, -10282689, 5405217, -6114423, -8180839, -681289, -2221572, -630823, -9640054, -1690607, -8872866, -18441516, -1415192, 2128693, -833761, -7182796, -920197, -2211908, -14528264, -28991, 11184632, -8032126, 2303176, -19401442, -1384053, 11298448, 6203544, -8832063, -7142531, 14181445, 3324305, 3202972, -2733747, 3692598, --76236, -9445707, -2392297, -9914932, 4798016, -5883569, -806380, -9645423, -10625749, -14372571, -9154186, 6164352, -4496294, -5071820, 4202089, -13174275, -1051193, 1085553, 3374234, 5918465, -3031710, 471373, -4386236, 2032593, -3995930, 3606699, -3808026, 2423435, 1476395, -4081293, --5185636, -10267119, -6567005, 2750927, -17419850, -4708358, 10056666, 5301601, -1784022, 23268522, --2969433, 10844256, 11014981, -16749299, 1542430, -2128693, -13768591, -7349763, -7321309, 337692, -2234994, 16064251, -1953136, 1581085, 11526082, 8046621, -1128503, 10748156, -4258460, -4092567, --6222334, -9822590, -12746926, -5740224, 9500468, -15567646, 1675037, 12779138, -1743757, 3760781, --5921686, 3316789, 6191732, -3923990, 5396090, -7881802, -7477538, 11875048, 7385197, 7508677, -10521596, -505196, -7436736, 10225243, -8654896, -12994424, 888521, 11355894, -967441, -10618233, -2137283, 13461501, -1238561, 3416110, 2120640, 19069118, 2026688, 3792993, 10413685, -1578937, --4128537, -9664750, 2177549, -1628866, -8070781, -33286, -4366908, 3257733, 14121316, -170725, --6989523, -2649458, -6381785, -4204773, -123480, -3380676, 2843268, -10089415, 11654931, -5823439, -18973018, -4732517, -11778411, 517544, 1859721, 6113886, 3986267, 3215857, -11949673, -10982768, -9200357, -11432129, -14138495, 4260071, 4683662, -3814468, 18578954, -14096620, -17261474, 6585796, --11142219, 140123, 767189, -10328859, 5690832, 611496, 14078903, 14861124, 21342766, 9789841, -4455492, 2974802, 6958384, -7287486, 8045548, -12923557, 6152004, -1289564, -1245541, -24776592, --9744207, -4102768, 8236137, -1106491, 1832877, 2626373, 2009508, -12709882, 12825846, -565325, -5041218, 358093, 11899744, -13206488, 8778376, -6541235, -689342, 9797894, -11646341, -5124433, --12692165, -4983236, -14123463, 12301860, 8593693, 16559783, -1401770, 3817689, -15832323, 3323768, --16449725, 15163919, 3569118, -2639794, 13662291, 14633490, 6641630, -8986145, -14176076, -19137300, --1965484, -6904697, -10807748, 10079751, -4235912, 23727546, -19332722, -6720013, 11880953, -14565845, --7783555, 2968359, -2240362, -2474975, -16765942, 5754720, -1654636, -8212515, 502511, 4224101, -3391951, 21974126, -4850629, 2799245, -976568, -7719130, 10189273, -4060355, 3868692, 773094, -14461155, -4961761, 16813186, -201327, 8399345, 6874632, -1260036, -5951214, -16237661, 7159174, -16935592, 295279, -142271, 11127723, 9911711, -1377611, 1752884, 19472308, 12510166, -4372277, -4238059, 12500502, -3526705, -15469935, 129923, -11486353, -1938104, -7623030, 326954, -21210696, --6400575, -8347806, -35433, 3255048, 3850438, 18708878, 21355114, 10417980, -15626702, -10058813, -11687680, 16002511, 2998424, -16998944, -3293703, -5077188, -17180406, -11790759, -13283797, 13639742, --6638946, 434865, -16515760, 20673288, 15348603, -3809099, 5451387, 35112432, -3520800, -10087804, --16303159, -3745748, 7381438, 4203163, -9384504, 5432060, -10714870, -14980309, 19808926, -11994233, -14670535, -10394895, -18372260, 1980517, 20577188, 15092515, -17131550, -9567040, 2608119, 4350802, -6244346, -103616, 13376139, 8872329, 17977122, -5774584, -4264903, 507343, -4757213, -17172890, --14597520, -3044058, 18106508, 5192079, 458488, 1860795, -18894098, -19107236, -16744467, 9351218, -8256001, -5709622, -5600101, 3030636, 1201517, -9573482, 2132988, 21488796, 2565169, 13955422, -11476153, 10256382, 20736102, 32466194, 9287330, 1892470, 3561602, 13668733, -7401840, -2058363, -7387881, -1378148, 3563212, -1419487, 12611098, 6261526, 8718247, -1111860, -4351876, 8411157, -17231408, 324270, -15422154, 11121818, -23692650, -24975234, -9736691, 15685757, -9438191, -24478630, --16585553, -4565550, 9290551, 8373576, -37216964, 1978369, 19024020, -3496104, -4286378, 22972170, --12128451, -12668543, -15996069, -5303211, -5235565, -10701985, 3474629, 5386963, 9150965, 6404333, --4847408, -3908957, -1459215, -4373888, 1941325, 4561256, 19124952, -7743289, -23735600, 13238163, -609885, -390842, -19589882, 9327595, 4489852, -1705102, 23554674, -6156836, 3153580, -1686848, -10814191, 12669617, -12678207, -821413, -6744710, -346282, 7690139, -4516695, 11381663, -15790984, --12753905, -8029978, -13639206, -1886028, 2355790, 2953864, -19356880, -12715788, 10868415, 17235704, --6628209, -8439074, 9929428, -17894444, -15627775, -15575162, 19434190, -29581050, 11353209, -766652, --16419123, -4845260, 16772384, 39581344, -3512210, -9830106, 14463302, 30458298, 12284680, -6190659, -6954626, -3959960, -19252728, -35203164, -222265, 36652716, -4421132, -4479651, -23649700, -3649649, -30602, 908386, 10123238, -580357, 8711267, -1236951, 1318555, -19819664, 4314295, 14710263, --9364639, 18660022, -6849936, -3010772, -16332687, 9837623, -7246147, -7610682, -19099182, -30058328, -16241419, -15577846, -11802033, 3195456, 4715337, -7869991, 3218004, 14243185, -2910377, -17081084, --7632694, -21380348, -512712, 3791919, 15470472, 961536, -2048699, -5187247, -6133214, 2852932, -16103980, 469225, -6746857, 14138495, -13218836, -259846, -24248312, -9720048, -2907156, 30628486, --18228378, 4656819, -4196720, 2231773, -1145146, -5746666, 3483219, 11078331, 7141457, -26317412, -29945048, 5707475, 13507672, 922344, -5527623, -10596221, 4126927, -16934520, -9346923, 35213364, --3969624, 2659122, -18031884, 16273631, -9114457, 11903502, -9200357, 21151640, 2627446, 1887638, --9936407, -8834211, 13001940, 27496918, -11067594, -17245904, 8506183, -6976638, 18859202, 22855132, -11959336, -3789235, 14875619, -9833328, -8300025, 19139984, 27353572, -30302068, 3033858, 4146254, -5662915, -10478646, -112206, 11766063, -29700772, 8759586, 18319646, 6308233, -12862353, -4093641, -22373022, 17434882, 6560026, -10625749, -12720083, -26629870, 38073812, 6356552, 19907710, -3234110, --7284265, 3735011, 11892764, -126165, 105764, -30988190, 5445482, 28212566, -4398584, 26973468, --15775415, -8053064, -10754061, 5734855, 26710402, -8938364, 60666, 22562000, 29461328, -10377715, --20074678, -19907174, -15415174, 14716705, 9834401, 25524454, -8157217, 18617072, -10197863, -3315178, -16174847, -79457, 22258668, -27198418, 16646756, 3614752, 6986301, -10691247, 7652558, 21065204, -39374112, -8831527, 9400610, -168577, -27462020, 24800752, 1615982, 9913321, -5757404, -12115566, --5556077, -680215, -11293080, -6167573, 33089502, 2703145, 12077448, -9443022, 23090282, 437013, -10612864, 5248987, -15279883, -2721936, -9907953, 550830, 3132105, 28851442, 13256417, 1497870, -2061584, -714038, -3749507, 4989679, 1421634, 18209588, 13084081, 7672959, -10042707, 12788265, -24536074, -24272470, 21257940, 4117263, 5196374, -24289650, -13505525, -30570504, -26900454, -4278861, -14994268, 14812805, -44913548, 718870, -21072184, 11590506, 41873784, 23535348, -27887222, 17934710, -10799158, 14457397, -36700496, -55248848, -15037754, -5845451, -14263050, 3512210, 18274548, -19215684, -27827094, 10775536, -41375568, -30951144, -6809671, 22735946, 279173, 2253784, -4800700, -12576201, --40068288, 1990181, -33745020, -27173184, 12976707, 11052025, 9252433, -4325569, -13392782, 30278446, -17462800, -12419435, -26404386, 20067160, 9521406, 4926328, -12658342, -30096984, 11086384, -14017700, -4118337, -25639882, 31003758, 966905, -12979391, 3229816, 7540889, 26053272, 15863462, -6527277, --1598802, 9159018, 8718247, 10038412, -6112812, -40514964, -32034014, 6434935, -4473746, 23678692, --4553739, -10263898, -28502476, 33105608, 12972949, -23303956, -23507430, 33901788, 32530082, -531502, -24288576, -3321620, 2020782, -9827422, -4198868, -18304614, 2832531, 19803020, 1638530, -13492103, --35641248, 56035900, 1127966, -42862164, -3543348, -15785615, 7013682, 21673478, 19157164, -23725400, --38793220, 6850473, -18718004, 6147172, -4044786, 17253420, -5866389, 2704219, 9791989, -15455440, --19589882, 2317135, 4761508, 17091822, -691490, -26614302, 17381196, -14716705, 13588740, -12751221, --9197136, -1177895, -4595078, -28622736, 5099200, 8376797, -28297928, 12127914, -11336566, 5907728, --9686225, 27322972, 20665236, -26918708, -14834817, 18926848, 22919556, -27539868, 36388572, 2725694, -29205240, 21873194, 34520800, -10458245, -15299747, 8216810, -29498372, 4807679, 3148748, 51327544, --16346646, -47485160, 80240728, -37783900, -30023968, 47024524, 20352776, -26765162, 44542568, 5479842, --37595996, 46370616, -49913424, 6663642, 15328201, -37949796, 17521856, 9678709, -12918725, -4051228, --371515, -9525164, -2737505, -5706401, -16494822, 168577, -8075613, -2156611, -3819300, 7864622, -30303678, 24786794, -22828288, -2888366, 31884226, -5872294, -5597416, -32639604, 4068945, 10231149, --4935455, 27128624, 66309464, -22588306, -27435178, 46538120, -2764348, -25763362, 29683056, 18824842, --14809584, -23240604, -27711666, 8046621, 15494095, -13084618, 44672492, 28267864, -54752244, -53608708, -31328028, -25626996, -31817118, 41114648, 7218230, 55225228, 27397596, -7712151, -7033009, -41456636, --31019328, 90947544, 25956098, -21017960, -44009992, -192200, -17602386, -41439456, -5652177, 44704168, -20365124, -1675574, 38866768, 30794916, -10233833, -46171972, 6851547, 21074868, -9993315, 50954420, -40550932, -10078678, 28529320, 4103841, -23940148, 15752866, 24228448, 9509058, 9910100, -31955094, --7729868, 4979478, 5683853, -3744138, -29742648, -9213779, 9353902, -5842766, -4070019, -23139136, -36301600, 5870147, -31831076, 18664318, 42777336, -21372294, -14239964, 7682623, 13377749, -12837120, --28692530, 24999930, 38743288, -1832340, -16814260, 6573448, 10119480, 19591494, 24341728, 3155727, -45258216, 478352, -53036940, 1970316, -7136088, 18505940, -6772090, -40597640, -2575907, -16520055, --19297824, 27184458, 11805254, 16360604, 16611860, -35912904, -21529598, -4579509, -2333241, 17487496, --1429150, -5421860, -1066763, -10487773, -28169616, 5184026, 37535868, -17719962, 818728, -12783433, --15054397, 31217970, -38269232, 4234838, 8467528, -4952634, -5947456, -42703788, -62617400, -54405424, -109587704, 105618616, 104272680, 296885856, 104493872, -12071542, 18526342, -205066976, -250946880, -83988624, --141394624, -194431024, 23682986, -11024644, -33920040, 213627376, 129088464, 54110144, 332514208, 157201712, -27422292, 151690192, -38000796, -182571536, -176092048, -166758016, -231985680, -226070976, -55116240, -82383376, --134922096, 153457040, 68694784, -57151520, 220734480, 70602816, -29147258, 250920048, 227108208, 51107964, -235593984, 240281408, -12815646, 57870388, 23681376, -235844176, -274841408, -204495744, -385568864, -364145568, --221490928, -293008576, -222867456, 20933670, 173680432, 199085696, 430848576, 392473568, 343708512, 372108992, -271181024, 135495488, 35293356, -37142876, -221325040, -263687904, -284140000, -317551616, -304279104, -259293088, --173356160, -126398200, -124485872, 23753854, 81166288, 74898328, 19959786, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ -2406792, -241592, 2704756, -2811056, -4813585, -194884, -3294777, -300111, -868120, -7608535, -6163815, --1093069, -2480881, 3034395, -1336809, 1396938, 1696512, 656056, -1179505, -44023, -2864743, -172336, 3119220, 1845762, -1472100, 82141, 1650878, -4111894, -1278290, 312996, 1671279, --1730335, -3926137, -1023813, -3874597, 589484, -1642825, -1633161, 1837709, -2043331, 1550483, -819802, 1028645, -3154654, 973884, 186294, 1679869, -2723009, 1590212, 1247688, 2509335, --673773, 3206193, 1557463, 3257196, 1826435, -2621541, -1370632, 6327024, 753767, -858993, -441845, -52076, 3707094, 119722, -2083596, -1013075, 4282083, -1893544, -914828, -4538170, --466004, -1688459, 1822140, -378494, -469762, -1940788, -3853660, 13997835, 7126962, 6266358, -3201361, -1299228, -634581, -1255741, -3083250, -3836480, -3036542, -3928821, -1942399, 4026532, -1099512, -64425, -235149, 2678449, 947040, -1482301, -1977833, -1182727, -7457137, 3103651, -496606, 181999, -1752884, 1041530, -147103, -1890859, 756988, 2733210, -301721, -3200288, --1138166, -1337882, -1841467, 484258, 2849711, -747861, 417149, -3699578, 2075006, -4592394, -2609730, 712428, -194347, 85899, 2565169, -3528853, -3054259, -4831302, 872415, 907849, --200790, 2805688, -3467112, 669478, -900869, 96100, -2710124, 1940788, 326418, -1605244, -2405719, -4778688, 1547799, -2601140, 4171487, 2243584, 71941, 393526, -1866700, -5873368, -3508988, -1176284, 12961138, 6540162, 8377871, 2611877, 2688650, -250182, 3131568, 606664, -2757369, -1956895, 5606543, -1227824, -6921877, -1574106, -102542, 626528, -2360622, 5385352, -45097, 2265059, 4713727, 2689187, -180389, 260919, 943282, -4247186, -3224447, 2068027, -1918777, -1369021, 235686, 2486249, -4716948, 6598681, -884763, 1213865, -1239098, 2631741, -3022583, 451508, -3663607, -3204046, 6616934, 447750, -2242510, 7516, 3708168, 3220689, --2281702, -2445984, -6290517, -1567126, -2726231, 566399, -2488934, 860604, -6126771, -2073396, -425739, -2059437, 1032403, 2713883, -1457068, 198105, 839666, -1121523, 2032593, 221728, -2620467, 457414, -1299765, -2910377, 79994, -3634616, 1032940, 848256, 2986613, -9110699, --2680597, -2234994, 1746978, 1549946, -5896453, -2942590, -1012002, 1248762, 3433826, 804233, -4635881, -3882651, -5102421, 1314797, 375810, -1174137, -3432753, 11545946, -417149, 2902861, -900869, 134755, -66572, -2049773, -4276177, -3753265, -899796, 2763275, -2298881, 5914170, --1884417, -830002, -4847408, -6273337, -311922, -4102231, -1925219, 7923678, -4271882, -1525250, --4139275, 1302449, 421444, -1880122, -4355097, -1184337, 258235, -5515275, 835371, -3133179, -4379256, 2374580, -2158758, -1646046, -1085553, 877784, 13959, 2879239, -1459215, -2614025, --1971927, 6995428, 7012608, -2840047, -6234145, 307627, 2291365, -850940, 2202245, -3437585, -836445, -4017942, 2555506, -1015760, 7474854, 1490891, -29103772, -4935455, -8248485, -9767829, -2771865, -3431679, -8130910, -7092602, 1357210, -6990060, 1169842, 9950902, -2313377, 4162897, -3509525, 8360691, 2436857, -6146635, 1584306, 9101573, -4115653, 4432943, -6629819, -6445136, -2282775, 2468533, 7543573, 228707, -4235375, 4037806, -2754685, 3047816, -118648, 4398584, --3642132, -2751464, -4086125, -164819, 1075352, -1936493, 3641059, -7929584, 1292248, 7515656, -1993939, -2454574, 3313031, -4232691, -1673964, -9992778, -2526515, -616328, 1888175, -147640, -5604396, -8132521, 1163399, -1428614, 4357245, 1712618, -1053341, 5131949, -4387309, -1126892, --3386582, -8023536, -2585570, -2328946, -1486596, 4929549, -4333085, -8951786, 1153199, 1567663, -225486, -14581414, 8320963, 9363029, -502511, 5251672, 2397129, 11059541, 14716169, 1882269, -1931662, 4212826, 1834488, 2436857, -2084133, 2900714, -2418067, 3853660, 4509179, -12616466, -6540162, -1399623, -2326262, -3919158, -5092758, 2037425, 3594351, 5711233, 1134408, 947040, --7342247, 288837, -2128156, -2494839, -1067299, 943282, 450972, -607738, 7264937, -425202, --2365990, 2336999, -2771328, 3650722, 4934918, 5405753, 2895345, 532576, -2981244, 6035503, -2012729, 745714, 723165, 722091, 537945, -3621194, -4865124, 4427038, -4508642, 4231617, -4106526, 2798171, -460098, -3389803, 3172907, 3730716, 8790724, 3817152, 3532611, 1870995, --7962333, -2703145, 1517197, -1508070, 4250944, -7394323, 1329829, 26977226, 8202314, 1942399, -5334887, 13452911, 5490042, 16231218, 4032438, -3660386, -1131724, -1435593, -1522029, 4349192, -7013682, -3320547, 1526324, 4790499, -1786706, -6853694, 5400922, -721018, 2573759, -2393371, --3387656, 5448703, 1299228, -600222, -1571958, -6263673, -3052111, 3245385, 833761, -2221035, --1090922, 834297, 2310693, 6104223, 1945620, -5825587, -1333587, 263604, -1822140, 1950452, -2914135, -5874442, -6993818, -514859, 1708323, -850404, 5337571, -10035191, -2151779, -4614406, --5632850, -726923, -484794, 1351841, 5258651, -166430, 740882, 1604170, -920734, 6974490, -4459250, -5929203, -5167920, 3773666, 8521752, -854162, -4079145, 8351564, 4417374, 1831267, --3790846, 12896713, 6802155, 11567958, -3678103, -287226, -2694018, 11640435, -12043625, -2160369, -3499862, -2783676, -2129767, 3607773, -1075889, -4247723, 10866804, 5525476, 1517197, 17386564, --4580583, -1651415, -3489124, -339839, 3227131, -5093295, -318364, -2891587, 7075422, -6271726, -1792612, -128849, -1555852, 76236, 4248260, 2167348, -5178120, -10026601, 454193, 1347009, -8046085, 8562554, 9352828, 193810, -5061619, 5911486, -15749645, -3313031, -6075231, -9998684, -6671158, -2882997, -2839510, 4280472, -1683627, -3539590, 14057428, -697932, -3980898, 3933116, -482110, 2717104, 2805688, 776315, 8495445, -6175089, -3065533, -723702, -7239168, -1403381, -1323387, -3349001, 2374580, 2417530, 8662949, -5479305, 2573759, 4647692, 2928631, -20774220, --30985504, -5324686, 1643899, -615254, 970663, -1523103, -6115497, -3572339, -4843650, -1388885, -5186173, 5986111, -5333813, -8106751, 7050726, 1404991, -4278325, 344671, -574452, -4929549, --3960497, 11469710, 6012954, -6150393, 3316789, 1322313, 5097053, -5944772, 6856379, -6604586, -4781373, 3049964, -1195075, -3031173, 3175055, -12317429, -5929203, 7696582, 12470438, 6904160, --8323647, 329102, -5824513, 8280160, 1938104, 2270964, 841277, -6526740, 3526168, 10152229, -1402307, 7743826, 5615133, 3686693, 6051072, 12473659, -3086471, -12007118, 6271189, 348966, --2593087, 969052, 10895795, -3944391, -7009924, 4009352, -1602023, -811212, -2429878, -1176284, --2950106, -5240397, -2535641, 7611219, -9346923, -5521181, 1473711, -12061342, -7698192, 1911261, -2001455, 15828565, -13857175, -9654550, -5310190, -2758443, -1663226, 5028333, 5040144, -7510824, -7632694, -1893007, 3479461, -5454072, 11336566, -2340757, -4236985, 7162395, 5282810, 4102768, --7687992, -7384123, 9558450, -5164698, 2800856, 2183991, -3503083, 7976291, 2425583, -166430, -1744294, 5811628, 7582765, 2202245, -6910603, 1426466, -9839770, 5644124, 2398202, -11041824, -7558069, 1642288, -5847061, 9820443, 2957085, -2845416, 5570036, -1040993, 10729365, -2646774, --3078955, -2451890, -1810866, 14222247, 2602213, 161598, 3411278, -12098923, -8083129, -8209830, -239444, 7634841, 241055, 9524627, -13144211, -4873178, -8883603, -6911676, 16400869, -1342177, -4441533, 5415417, -16287053, 5187247, -7072738, 4079682, -4984847, 13196287, 2069101, -8982387, -1312649, -9156333, 7439420, 14582488, -12409771, 8289287, 2895345, -187905, 5838471, 15545097, --5978058, 165893, 4604205, -16594143, 893353, 7824357, -4750234, 5667210, 5878737, -2860985, -14985141, -7300371, -13689671, -5648419, 1578937, 580894, -2843268, -5651640, 4056597, 4030290, --35970, -9357660, -2286533, -2189897, 6381248, -3954054, 25233470, -2922188, 3602941, -900869, --1078037, -11985106, 1261647, 9364102, 7364795, 24915106, -2626909, -2091649, -5070209, -670015, --6893423, -214748, 9927817, -4939750, -960462, 2116345, 2400887, 10044855, 7981660, 2574833, -19155018, -3266323, -17568026, -17348446, -12382928, -2268280, 5623186, -1533303, -4858682, 28867012, --20871394, -15592879, -5219996, -9838696, -11572253, 13992467, 5403069, 2824478, -4657892, -2776696, -16601122, -4931696, -7440494, -20274394, -3282966, -569620, 9157944, 3425237, -4529043, 1119913, -7920994, 3629247, 4753992, 12763032, 15743739, 4290673, -6602976, 3936875, -10344429, 6409165, -4866198, -3811247, -325344, -7918309, 2361158, -187368, -15400142, 13862544, -2064269, -7121056, -7998303, -14077292, -4009889, 14374182, 7591892, -787053, -418222, -19438486, 5562520, 9806484, -4894652, 2742874, -2193118, -14673219, -41999948, -4113505, 6990060, 10529649, -2457258, -12950937, -18622978, -10399726, 7556458, 14091788, 10786273, 1088774, 13248363, 376883, 3248606, 1745904, -6758668, 209380, 18790, 17608292, -10226317, -6015639, 13573707, 14431627, -4387309, -6215355, --2134062, -3346317, 14933601, 10991895, -28192702, -2224256, 1433445, -12079596, 4302484, -17980344, -13455596, 4231617, -3008625, 8568460, 3073586, -3168612, -7098507, -3825205, 19345606, 1582159, --946503, 5225365, -3511673, 8837432, 22950694, 10433549, -4239670, -3431142, -4253092, 14501957, -4127464, 14668387, 8878234, 7689602, 3270081, -5323612, -7397008, 6936909, -14805289, 3127273, --8185134, -5550709, -206158, 10424959, 699006, 1462973, 2844342, -2398739, 15659988, 21756694, -23571318, 504122, 10471130, -13752485, 5021354, 8868034, -7050726, 12811351, -10256382, -19177028, -2255932, -9886478, -1813550, 1260036, -10606422, 2860985, 14253923, -8572755, -8278550, 7094749, -13786845, -1040456, -3228742, -16646219, 30662846, 2398739, 7636989, 24213416, -9248675, 2854543, --5003100, 6691559, -7332046, 7280507, -17221746, -19437412, -1097364, -11345693, -1399623, -688269, --1843615, -2946885, 748935, -5098126, 4427575, -15375446, -6854231, -20885352, -1635846, 5289252, -9637907, 23399518, 12160126, 4382478, 2330020, 7011534, 4473746, 4290136, 8644159, 10145250, --3754338, -19039590, -19972672, -12811351, -8615168, 2347737, 5762773, -6708202, -12074227, -19315004, --231928, -7117298, 17171816, -7608535, 3645890, -13269301, -7533910, -1973538, -6608881, -26035018, --28608240, 7990250, 1715839, 1142998, 12952011, 8492224, 10071161, 9564355, -18563922, -3331284, -30698278, -5580773, -13881334, 5093295, -9003325, 3603478, -22107808, 8318278, -11836393, 4241280, -18926848, 13588203, 2282775, 14455786, -2360085, -6582575, 8609799, -11890617, -21855478, -33794412, -3199751, 194884, 13272523, 8881992, -12016782, -6890202, -32139240, -2739116, -14770393, 2963528, --7253126, -4227859, -5894843, -3019362, -2177549, -11924977, -4730907, -13814762, 10850161, -3314641, -9330280, 22608170, -11970611, 5985574, -1578401, -6531572, 6333466, -13241921, -20876762, 9374303, -5306969, 9287867, 6657200, -45287744, -19839528, 5010080, -14461155, -2204392, -12306692, 17593796, -22717692, -2141041, 25081536, 2394444, 11581379, -4424890, -472983, -15066208, 9125195, 16594143, -4248797, 28408524, 1093069, 2615098, -8335995, -14703821, 18076980, 26206280, 10241350, 3490198, -3287261, 8395050, 1510218, -470299, -25477210, -17845590, -8159901, -32974612, -40134320, -30504468, --13312788, 8759586, 151934, -7572564, -14404783, -411780, 27173184, 12660490, -23004918, -4301947, --4437775, -16996260, -2552284, 766652, 11660299, 7839389, -17077326, 12088722, -9483825, 4861366, --8814347, 2312840, -13010530, -5477694, 6993281, -24659018, -4263829, -9603547, 8289824, -6512244, --21998822, 25779468, 25672630, -165356, -9920838, 13798119, -33929168, -11253888, 10488310, -12060268, --7000797, -1437203, -10812580, 1626182, -2620467, -23535348, 10051834, -3529926, -6885370, -8480413, --5931350, -2092723, -6200322, -10421201, 19071266, -9798431, -9044664, 8274792, -373125, 30400316, --6499360, -20309826, 10679436, -11173357, -9207336, -16343424, 9554692, 17774722, -39045012, 956167, -29328184, -8668318, -26057030, 51675436, 36187784, -275415, -10143102, 8573292, -31092878, 964757, -37918120, -6273337, -13627931, 1116155, 43044700, -5699959, 9215926, -8694624, -19901268, -15310485, --4291746, -6677601, 7720741, 11676942, 343597, -15704011, -23095650, -20381768, -3633006, -3957812, --11565273, 11307038, 8372502, -8471286, -11422466, -11487964, 6679211, 3174518, 8262980, 22484154, --320512, -17651778, 12382928, 5843303, 4062502, 2246268, -526134, -7950522, 15860240, 9226663, --6601902, -6600828, -5266704, -19916838, 5611375, 16571594, 4480725, -13507135, 17018808, 13911399, -6896644, 3263638, -9310952, 6152541, -30274688, 6174016, -2217814, 28311350, -10038412, -11586748, -5130876, -5166309, -1285806, -17495012, -4539244, -3275986, 24288040, -14925548, -35012572, -13083007, -48520784, 2118493, 7902203, -7930657, -16156593, -21281026, -7281044, 6303402, 14100378, 12058658, --10488847, 201327, -21665426, -7580081, 7537668, -17810156, -9883257, -6541235, 26112864, 14069239, -14288282, 14048301, -15427523, 3205656, 5327907, 6646462, -1684701, 18206904, -4136591, 8315057, -13509283, 5816997, 3549791, 12213813, 15669651, -8778913, -19102404, 13229573, -2403034, 790811, --20247012, -17676474, 3792456, -8383240, -7696045, 17149804, -17289390, 22461068, 13204877, -8431558, -10566693, -11382737, -13506598, -14042932, 21212844, -14101451, 5895380, 8348880, -26651346, 4166118, -1480690, -18082886, -36258652, -28675350, 20475182, -20692616, -2857227, -17951890, -7785702, -11463805, --4959077, 13897440, 1109175, -9687836, 9076340, 26416196, 26193394, 25622164, -9109089, 223875, --20653424, -936303, 4440460, 3653944, -17999672, -20136954, -30166240, 21217676, 3236795, 7102802, --4038880, 11191611, -7378754, -8578660, 7646116, 16331076, 5134097, 10767483, 34858492, -4831838, --18816788, -42890616, -4634270, -16440061, -6611029, -9989020, -18328772, -13734232, -28107340, -3049427, -1341640, 10946798, 32822676, -25150792, -7930120, -3541201, 12214887, 11753178, 32830730, 5077188, --32700808, -7012608, 9595494, 28526100, 9725417, -41104984, -14323716, 39802000, 6312528, 39868572, --19544786, 3009698, 6142877, 25134686, 1178432, 23267986, 35306240, 6930467, 30721902, 21623012, -8604430, 40373228, 36217848, 13792214, 54392004, 42121820, 29000692, -35771172, 2875481, 21097954, -15159087, 5941014, -22724136, -26813480, -11196980, 9338870, -29704530, 31659814, -14780593, 21501680, -7524246, -22612466, 1739462, 17690434, -11664057, -23628762, 15312095, -4671851, 12870406, -6299644, -1969243, 8451422, -17712446, 613643, -8733816, 2211908, -27783070, -17945984, 23825794, 3820374, -8735963, -17356500, 19291382, 21333102, -15424301, 14645838, -21684216, -1495722, -12700755, 17658222, -34876744, 2345052, 42652248, -8057896, -3244848, 5203890, 3406983, 171799, -25752624, 46275052, -27132920, -54761, 22725746, 21805548, 23715198, -5858336, -1222992, -40235792, 19221052, 24143622, --6118181, -3872450, 27079768, 18112414, 14301167, 37737192, 5747740, -13806709, -20830592, 10058813, --6097243, -21560736, 21665426, -25713970, 2498060, 9557913, -18938658, -29949880, -19534048, -7334194, -5667746, 21638046, -34846144, 18933290, 34573948, -2678449, 39526584, 9286793, -30623116, -22164716, --601295, -13444858, -17873506, 18852222, 26477400, -4500052, 19011136, 20847772, -16232292, 14053133, -29496224, -3865471, -35321812, 12418898, 850404, -9615358, 12178917, 25873420, -7082938, -16433619, -8793946, -14621142, -14257681, -3442953, 26600880, 18760418, -33212446, 8795019, 16910360, -25963614, --13172128, 26029650, -5850819, -43827992, -3383897, 32311038, -9444096, -62300112, 64623152, -20391430, --5299990, -33503966, 42460048, 10566156, -11990475, 26792542, -15338402, -15687368, -5541582, 72640248, -27240294, -34441344, -25836376, 25993678, -4538170, 39085276, 3018825, 28465432, -41175316, 31482648, -62420908, 2182917, -3776350, -14314052, -7494181, -28122908, 60033444, 32836098, -28589986, 26800596, -62093416, 11717208, -23668492, -5935108, -5616207, 10613938, 9558450, -19541028, -27285390, 7122130, --23051626, 4415764, -14254460, -16898012, -3375844, 2617783, 8155069, -18796388, -7263327, -7567196, --22898082, 19224810, -7037841, 1073205, -3195993, -15607911, 6359236, 4185446, 766115, -3483219, -395137, -702227, -8913131, -19767050, 8607114, -9862856, 8717710, 5891622, -19446002, -15978889, --1630477, -2352032, -2075543, -4269735, 16152835, -11105712, 1770600, -20864952, 17918604, -20421496, --10717554, 10191421, 362925, -16316044, 13072270, -21930104, 1709934, 6746320, -572841, 2559264, -10539850, 5195300, -22716082, 11709155, 1573569, -13420162, 19432580, 7978439, -21513492, -2011655, --17022030, -1926293, 7458211, 5865852, -20632486, 25733834, -36866388, -46635292, -16768089, 139707776, -112267224, 73978664, 135693584, -54192824, -128086128, -41507100, -207131776, -81186160, 5935645, -49030272, -95090040, 129360120, 21248276, 82027432, 141749488, 2546379, 39017092, -9804337, -166732784, -138470288, --104308112, -104123968, -51167556, 78373488, 42266772, 60453812, 173771152, 73049344, 10492068, 103397040, -48080548, -60544544, 19915226, -50980724, -169347872, -41613400, -88771072, -175013472, -29521994, 2915746, --43189116, 116514944, 135098192, 52311092, 158905744, 160296240, 29229400, 60841432, 26987964, -103806672, --115757424, -108985872, -194230768, -172377968, -66453344, -81277424, 15010911, 100990784, 139574624, 114286392, -178541792, 131085088, 69427608, 6489696, -25514790, -108342696, -130485400, -98752032, -115805744, -99387688, --9206799, -13757317, 16040092, 73951824, 14881525, 7090991, 0, 0, 0, 0, -0, 0, 0, }, -{ -1680943, -1800128, 2106682, -2403034, -3902515, 656593, 2688113, -1779727, 1821603, -6285685, -3461744, --3566970, 304406, 941672, -2608656, -3248069, 1381369, 3463891, 161598, -1697049, -4660577, --2656974, 3657702, -747861, 173409, 1690070, -1887101, 1130650, -1387274, -2617783, -1802813, -3553549, -4591320, -2381559, -2007897, 4698694, 3243237, 2784750, 326954, 1528472, -195958, -3016141, 1087701, 1097901, -15569, -159988, 5154498, 4013110, -13959, -3427384, 1087164, -609885, 1602560, -4969814, -184147, 3262028, 259846, -592706, 366146, 1138166, -1207423, --795106, -1487669, -1818382, -2593624, 1584843, 1868848, -3755949, -791348, -399432, 1054415, -1325534, -2320893, 1490891, 1031329, -670015, -1116155, -4995584, 15668041, 6101001, 3752191, -1309965, -3411278, 107911, 2941516, 5743445, -1074, 613107, 251792, -2019708, 471373, -1985886, -472446, 1939178, 2819109, 3924526, 1538672, 1641214, 1950452, 1859184, -3648575, -3656628, 6685117, -3168612, 1831804, 1107565, 1796370, 390305, 3915937, -2575370, -1031329, --2316598, 2216203, 6753836, -1233729, 3292093, -192737, -1490891, -5641977, 2097018, -2973191, -2574833, 1190780, 2870649, -420907, -1700807, 798864, -1170916, 3747896, 504122, -3149285, -3909494, -952946, 3047816, 2257542, -129923, 2167348, 4391604, -1325534, -1561221, -1329292, -2165737, -1870995, -2409477, 2682207, -13422, 1797444, -2993592, 4313221, 173409, -1203128, --635118, -378494, 12114492, 9703942, 4696010, 814970, -1931125, 5669894, -3376381, -3381213, --929860, -5991480, 3557844, 357019, -2661806, 1552631, 3410741, 6196027, -2960306, 3617973, -7773354, -2153389, -85899, 1916092, 3969087, -934692, 4334696, 3272228, 4385162, 1142998, -3310883, -3426847, 5888937, -626528, 5674189, 2985002, -802622, 816581, -1129576, -45634, --2275259, -908922, -2775086, -1836635, 1857573, -467078, -5827734, -1192390, 412854, -86436, --3342022, -3189550, -1849520, -1348083, 4212826, -1715303, -5063767, -6433861, -7355132, -2424509, --3374234, -230854, 855235, 3458523, -4925254, -2121177, 267899, -492311, -2391760, 477278, --5240397, -533113, -6157373, 2988760, -3577708, -1678259, 3497714, -744640, 6345278, -13913547, --3912715, -6981470, -1464047, 133144, 7594576, -3626026, -12739947, -4299799, -467078, 4933307, -1348083, -4535486, -11084237, -2676302, 2847027, -1088237, 6006512, 380105, 2544231, -470836, --5010616, -5142150, 3023120, 4022774, 292595, 1400159, -358093, 2514703, 382252, -6356015, -172872, 9291088, 1054415, -2131378, -1026497, -2288144, 373125, -1954210, -4168803, 6267968, --2104534, -2408403, 5352603, -2767033, -5152350, 366683, -193274, 300111, -7356742, 5925445, --2456721, -3221, 5073967, 4986994, -7916699, -1809792, 1174674, 1973001, -1002875, 4292283, -796180, 2175938, 2506650, 516470, 1880122, 3564823, 270583, 52613, 2700998, -8719320, --2597918, 144418, 3618510, 2294050, -2040646, -579284, -27736362, -11266236, -5412196, -8171176, -2722473, -2985002, -2456185, -579284, 3748433, -3457986, -3611531, -5815386, 1320166, 4721780, -1313186, -4083977, -4536559, 1129040, 4352413, 3561602, -5193689, -8225399, 777926, -7718056, -4124242, -368830, 2926483, -537945, 2824478, -3255585, -1064615, 7398081, -9220758, 3951907, -2339147, 674847, -3178813, 1684701, 4760971, 830539, -5574868, 737124, -3490735, 2363306, --7668664, -743029, -6939594, 4973572, -456340, -1884954, -1889786, 2490544, -11744051, 4942434, --3311957, -7726646, 2972117, 5200132, 6628209, 3245922, 1487132, -1098438, 863825, -1262184, -4294968, -3112778, 1265942, 2565169, 8222715, 504122, 204011, -6713034, 3748433, -3818226, -611496, -16157667, 8047695, 12164958, 2682207, 737124, 7176891, 2092186, 2393908, 3542811, -807991, 3724274, 4267587, -3422552, -284542, 326954, -3590056, -2623688, 267899, 1721208, --1975148, 12719546, 7193534, -2068027, 1265942, 3922916, 5513665, 5723044, -2107218, 3987877, -5201743, 118112, 1788854, 1247688, 3141232, 1857573, 1614371, 2600603, 3017215, -5704791, --3894462, -8709657, 1366873, -3145527, -3848828, 4336307, -792421, 2709051, -10173704, 11669426, --352187, -5631239, -516470, 9264781, 7272990, -1504312, 806380, 4498978, -1548873, 1950452, --2805151, -7289097, 1524177, 741419, -5180268, -2246268, -5042829, 1148904, 2968896, 1460826, --1907502, -4932233, -6776385, -9050570, -5460514, -2240362, 2168959, 29351806, 7729331, 2203318, --1138166, 17690970, 2015413, 8409009, 1667521, 5589363, 9131637, 3244311, -5187247, 5418638, -6241125, 977105, -553514, 1319629, 11483132, 761820, -4061965, -7092602, -2178622, -274878, --8160438, 1276679, 2265059, 4532801, 1839320, 3163244, 8735963, -2877628, -1549410, 5329518, --997506, -2536715, -610422, -8079371, 4974646, 3199214, 20938, 4928475, -2717104, -7138773, --15188078, -5706401, 5371394, 5906654, 13959, 4060892, -4425427, -4869419, 12032888, -7354595, -5348845, -6531572, 1109712, -9406515, -9723806, 9990631, -4145180, -4101157, 14078903, 663036, --1794760, -7150047, 5043366, 7761006, 216896, -4966056, -8590471, -1888712, 5919539, -2575370, -1840930, 14487998, 5409512, 11935714, -7130183, 2059437, 7373922, -9841918, -2760053, -4094715, -1449015, -5173825, -2433636, 6915971, -1751810, -1784022, -38655, 8761196, -2863133, -4648765, -10275709, 1185948, -6427956, 2521146, -1020055, 1169842, 4201552, -6007586, -788663, -4611721, --7057168, 528281, 708670, 1046361, -6925098, -8148627, 3531000, -1063541, 3456912, -703838, -4791573, 860604, 353798, -5342940, -4242354, 941135, 5346161, 1935420, -823560, 13659607, -3919158, 2017561, 6979322, 1979443, 5355288, 4452271, 3783329, 1562831, 3060701, -2414845, --455267, 698469, -5288179, 1214402, -8912057, 2272575, -5638219, 4641786, -2826089, 2420214, --457414, -4939750, 2388539, -1458678, 5864778, -4509179, 14237280, 11058467, 4726612, -18144626, --35951024, -1149441, -7472170, 6557342, -2161979, -9463960, -1272384, -7576323, -9111236, -7128035, -11346230, 6478422, -8066486, -4023848, 8581345, 5594195, 7636452, -4963909, 4850629, -4333085, --5131412, -992137, -2379412, -14529874, 3871913, 9148280, 3468186, -8384850, -2287070, 2176475, -2070711, -7376607, -1997697, -10830297, 2316598, -4777614, -717260, -3310883, 1988570, 12977244, --1524177, -1539209, 5946382, 9738838, -5623186, 3251827, 3190087, -6720013, 3849901, 4657892, --9086003, 2323577, 5538361, -382252, -9569724, -4864051, -6260989, 9584756, 3048890, 9477919, --5185100, -8371428, 1988033, 6129992, -2373506, -5432597, 4190814, 8310762, 5915244, -6127308, --4673998, 354872, 11985106, -401579, 6453189, 4974646, 3437585, -18808198, 547071, -104690, -11053635, 1919850, -3653407, 5572720, -2464774, 2062121, -9359807, -3576634, -5757941, -4159139, --11997454, -5443871, -6985228, 16482474, 10341208, 9744744, -11803107, -11242077, -4591857, 5083631, --151398, -939524, 751619, 2699924, -454730, 4155918, -6759205, -6985228, 233002, -2629057, --8457327, -9762998, -6757594, -6069863, -3517041, -4493073, -10857677, 4112968, 13917305, -3991098, -6644852, 7714298, -6205154, 6498286, 5011690, 671626, 12642773, -1772748, 10590852, 2652679, -1472637, -11074573, 4024384, 3513283, -2516314, 12968654, 11476153, 765578, -4287988, -8710731, -4072166, -8691940, 2702071, -1921461, 8251169, -1963874, -13032541, -1250372, -5577552, -4497905, --10477573, 8070244, -17010218, 7952669, 4929012, 7571491, -8224326, -13152264, 3433290, 4622459, -156766, -11009612, 10492068, 3678103, -6412386, -9634685, 4050154, -3974455, 17115982, 21066278, -2502355, -2774012, -8201777, 12185359, -13814225, -4238596, 15855946, 4590783, -3722663, -8348880, --8703751, -4103305, -246424, -10324565, 1906429, 12066174, -2007360, 4855461, -9003862, -7215545, --3160022, -5875516, 16246251, -5643587, 6998649, 6718403, 6272263, 2317135, 2806224, -11119670, --12214350, -10670309, -3037616, 8922795, 18810346, -7272990, -14525579, -2703682, -6988986, 4112431, -2455111, 11310796, -7133941, 401043, -9277129, -1117765, 14941654, -1431298, -9007083, 11647414, -3057480, 2356863, 5228049, -11873437, 1264868, -3667365, 466004, 6132677, 12186970, 26848378, --11698417, -9079024, -2841658, 5695664, -15726560, 6323803, -4283693, 7962870, -7088844, -3160559, -9669582, 7256884, 2691334, -4847408, -1829656, 13357348, 13035763, -2673080, 11374147, -3270618, -16750909, -7810935, -4192425, 3067681, 17549236, 12916577, 4192962, -9386114, -726923, -19505594, --3023120, 3117073, 8930848, 10548977, 18494130, 4932770, -408559, -825171, -7195144, -12122545, --945430, -10497437, 7583839, 2493766, 11766063, 6689412, -4108673, 11843909, -14030584, 6440304, --3175592, 1152662, -2485176, 15090904, 8700530, 4454955, 2621004, -26896696, -4342749, 16311749, -8100845, 1273458, -498216, 1139240, 12997108, 5884642, -20419348, -6219650, -7765301, 2499134, -695248, -19614042, 1269163, -17985176, -11570642, 328565, 9396315, 19220516, -5109938, -7394323, -727997, 7610145, 3827890, -11279121, -1103270, -9089761, -907849, -12480638, -1811939, -10694469, -86973, 11620571, 452582, 25330106, -10976863, -4777078, -9414031, 10488847, 16216186, -13109314, --4973572, -20478404, 3386045, 85362, 5137855, 5368172, -12160663, -6633040, 8507256, -3145527, --3149822, -11032160, 22150220, -2782602, -24976846, 7106024, -7063074, -6976638, 8092792, 7085623, --7734163, -7493644, -3078418, -13806709, -9211631, 4967130, 2361695, 5173825, -5116380, -9888088, --12671764, -11541651, 8865886, -17079474, -683437, 4529043, -6381785, 813359, -1189706, -1975685, --14954539, -2135673, -6840273, 9256191, 9920838, -1543504, 16050293, -341450, -1722282, -4507568, --2800319, 26380762, 228170, -12431783, 31034896, -8164196, -2496450, 2490007, 13336410, 9181566, --19821274, -8433168, -18831820, 3890704, 1260036, -6172942, -20766166, 565862, -9620727, 4033511, -4745939, 10239739, 663036, 7354058, 36323612, 7522635, 9142912, -6045704, -1916629, 15437186, --1296543, 857383, 4265977, 634045, -2259690, -8677445, 14638859, -15908559, 6485938, -23456428, --6976638, -11227581, -14190035, -12684112, -19864, -25636122, -8566312, 2939368, 14375792, 7750806, --24737402, 13458817, 9273908, 9636833, -15749108, 10934450, -7435126, -18609020, -6210523, -18545668, -8639327, 20715164, 5293011, -2764885, -14096620, 10565083, -15020038, 21556440, -4286914, -3242700, --13610214, -15597174, 2037425, 16518444, 5641440, -12989055, -4903242, 1953136, -2217814, 5028870, -16827682, 3206193, -10894185, 4935455, -3220689, 5073967, 18425410, -26065620, -11934104, -20965346, -11795591, -4228932, 1928440, -6934225, 14961519, -14891188, -15158550, -6857452, -3673808, -10747619, --18757732, -9006010, 3265786, 12134356, -17315698, 11203959, -6685117, 1281511, 21854404, 16865262, --583042, 8846559, 3954591, -3610457, -3027415, -30141006, 3786551, -3148748, 2549063, 5748277, --2806224, 709743, 29879014, -27369142, 2044941, 32767380, 3727495, 8959302, -13507135, -3648575, -16530255, 30058866, 809601, 26638998, -11223823, 24082418, -9368397, 17785996, 17242146, -4647155, -34398392, -6051072, -2649995, -10687489, -17300666, -17147120, -9242233, -10390063, -26328686, -11760157, --7202124, 8771934, 6605123, 587874, -15923054, -13939316, -10917807, -39524436, -27138824, -20107964, --1370632, 25968982, -16791712, -2704219, -12782360, -19817516, -15398531, -20230906, -19982872, -8630200, --23687282, -26925150, -22385370, 6034429, -15266461, -8769249, -19176492, 18393198, 31501438, 2214593, --2951716, -11349451, 3146601, -2386928, -199716, -2940979, 10350334, 1591285, 21689048, -18830748, -2229088, -16090558, 32646584, 7390565, -18166102, 14287746, -12845173, 11511586, -17460652, 10110353, -2162516, -11316702, 10315975, -17628156, -5118528, 4898947, 18093086, 7099044, 31645320, -7551090, --19484120, 1265942, -5188321, 1704028, -12779138, -12222940, -20927766, 1914482, -22333830, -5452998, --3232500, -20936354, 13530221, 15698105, -9762461, -2460480, -29527900, 31987306, 40177808, 4300873, --17894444, 1845762, -30837328, 56963616, 22438520, -5389647, -16736414, -5515275, -17822504, 19149648, -50599548, 398895, -32560684, -15875273, 18628346, 6001680, -6015102, 23110682, -4030827, 2269890, -14228690, -2167885, -13193603, -5220533, 11801496, -15159624, -12562242, -6077916, 5211943, -52613, --1977296, -6825777, 11113228, 319438, 16193637, 11601244, -15685221, 7147363, 19768124, 9984725, --14482630, 4958003, 3657165, 12184822, 769873, 3700651, 3930432, 4522064, 27604292, 24890410, -16340203, 34031172, -16824460, 17119202, -20368346, 12347494, 82678, 11203959, 15429670, 4003983, -4178466, 17514876, 8738111, -5776731, 11799349, -801011, 15699179, -17467096, -9579388, 619549, -37512244, -26829586, 2022930, -33449742, -4791036, 3285650, 11285027, -16055661, -6033892, -12608413, -47953848, 4274030, 3259343, -10256919, -6957847, 8378945, 7215008, 4843650, 18499498, 8242042, --7914551, 10357851, 19832012, -259309, 21788370, -1539209, 10635413, -21544630, 40269076, -5321465, --4552666, 7435662, -30198452, -7075959, -14387604, 22214108, 12064563, 12968117, -13856101, 6060199, -5520644, -17966386, 5690832, 17176112, 14261439, 5783711, -4125853, 3046206, -8494908, 31694712, -5286568, 15030238, 11979738, 17771500, -26381300, -798327, -7328825, 6517613, -9159555, -10378788, -23505282, -19835232, 17565880, -11894375, 18510236, -2078227, -16968342, 229781, -26032870, 19029390, -17069274, 21254182, -55068460, 18762564, 11758547, -14694694, -10014790, -13191992, 30808338, -38322384, -26703960, 62344672, 2749316, -23543936, -9909563, 22362820, 33370286, 13058848, -10438381, 5744519, --25005836, 1578401, -14023605, 22371410, 4465692, 4276177, -11431592, 8516383, -1241246, -12545599, -7413114, -12838731, -3344706, -11277510, -19412178, -15320685, 19020800, 10956998, 13173738, 8946417, --24016384, -10337986, 8062191, -10487773, 18502182, 8495445, 3755412, 6866579, 29485488, -10624675, --24538758, 49424872, -19914152, -31779000, 35094716, -18286898, -6318434, 4502200, 19448686, -22111566, --3161096, -751082, -9785546, 65031172, 2416993, -13868449, -1227287, -2207613, 19982872, -36049272, --22079354, -17056388, -10042707, -4076998, -25283398, -3030100, 884226, 7489886, 46467252, 40261560, --13120588, 30362198, -29037738, -32491964, 21750788, 23868208, -4982699, 4229469, 8114267, 15350750, -28202902, -2982318, 7524246, 28013388, -18195628, 2653753, -19704236, 21345988, 127238, 13173738, --13441100, -20140176, 18897856, -19905562, 6206765, -4293894, 17817134, 496069, 3918621, -10320806, -3437048, -7129109, -26337276, -20304458, 8918500, -1068373, -602906, 4923643, 19771346, -8163122, --5859409, -15824807, 7305203, 6797860, -1816771, -2471217, -43969728, 2864743, 12738336, -14928233, -11359652, -23568634, -4208531, 2616709, 15786152, 20437066, 2858301, -8134668, 6743099, 36089536, -31128312, 31547608, -630286, -1459215, 7314866, 5036386, -12972412, 10501195, 39398272, -25732222, --7662759, -6226092, 1483374, 3263638, 6587943, -18364206, -29102162, -9529996, 332323, 64684356, -34295312, 23694260, 175020, -2692408, -12106976, 30214558, 8730595, 20812338, -68183, -4630512, --3305514, -7863012, -41568840, 22873922, 22012782, -2222646, 35498440, 14404247, -22405770, -24223078, -11136850, -10574209, -19860466, 297427, 3161096, 8325794, -4122095, 11190000, -1942936, 10541997, -15909096, -14711337, -54099408, 28609850, -7205882, -18345952, 13728326, 18546742, 1857037, -38135552, --3678103, -2542621, -36967320, -24867324, 21330418, -6852084, -14264660, -14165339, 9905268, -38196756, --25071872, 49150532, -2952253, -30163556, 12764643, 26226680, 13079249, -42296300, 60400124, 22808424, --34896072, 19166292, 28165858, 3215857, -23074174, 24520506, 30156040, 16321949, -21036212, 20407000, -41720776, 1124208, 42201812, 48963164, -24869472, -16949014, -16652125, 46262704, 32168232, -21422224, -13737990, -13214541, -27692338, 25232396, 61399780, 8210904, -15160698, -14227079, 36017596, 35713728, -54715200, 23503134, -24098524, -7458748, -20358144, 12938589, -10388452, 16383690, 9149891, -24473260, -12089259, -24937116, -9695352, 1367410, -10494216, 2651606, 12715788, 11856257, -127775, -19546934, -3819300, 17967996, -7180649, 3784403, -8376260, -22981296, 23764590, -13320841, 16204912, -23638964, --15588047, -2094870, -21381958, -4637491, 20081656, -18864034, 26737782, 3343095, 21658446, 10465762, --11992086, -28481002, 23911156, 17025250, 9487583, 8095477, 24672976, -17069810, -10406706, -9055402, -7151658, 11498701, -3315178, -21783000, -1898912, -1206886, -24849070, -7367480, 2973728, 8750996, -18139258, 79457, -17688822, 24943560, -5120675, -1372779, 26343718, 15507516, -22845468, 9901510, --14052596, 11326903, -7173669, 13047574, -18346490, 11290932, -40273908, -49613852, -25073482, 143142128, -127679712, 75634376, 169090720, -36952824, -125483376, -45567456, -237379616, -126051384, -1654636, -62863288, -85979880, 154910880, 22672596, 90475632, 179632720, 28707562, 63127428, 4611721, -183081568, -154903904, --134901168, -150751200, -89887224, 72630584, 31986768, 72675680, 193899520, 114930640, 30708480, 141813920, -65990560, -89602144, 48207788, -65915936, -167860208, -22597434, -103662256, -193171520, -85969136, -21845814, --100008848, 109806744, 120618248, 54820964, 191907728, 214351088, 82310360, 104717208, 101109432, -115246320, --73480448, -146827744, -225312912, -209976656, -133017288, -136410848, -38623032, 83235928, 111571440, 146126592, -210413664, 185558160, 109989280, 76401024, 13536126, -92983360, -128986456, -99586336, -123028264, -157394976, --51923472, -65560528, -23392002, 70367672, 34575560, 912681, 0, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ --1262720, -3423089, -3764539, -789200, 187905, 287763, 1505923, 6287832, 466004, -1490891, -2266669, -5662378, -581968, -2845953, 1067836, -1983738, 1464047, 1147293, 7502234, 1944010, -4078608, -1737851, -219043, 696858, -3625489, 2316061, 321586, -2681670, -1586990, -287226, 311385, --328028, 2369748, -647466, -2257542, -559956, -1553168, -294742, -2757369, 1013075, 2907156, --439160, -4005594, 2462090, -2452963, -1492501, 119722, 1152662, -2056753, -595927, 3727495, --1959579, 1065689, -2463701, 1803349, -843424, 1256815, 1658394, 1033477, -967978, -541166, -1920924, -3010772, -5550709, 1184874, -707596, -1753420, 499827, -304406, -346282, 375273, --2020245, 2206540, -2871186, 2329483, 1005022, -533113, 6467684, -676994, 1977296, -1190243, -8632347, -3391951, -813896, -312459, 1090385, -1526861, 3969624, -685047, -2633889, -472446, -5422933, 402116, -2699924, 2534031, 1896228, 3559454, 1488743, -2694555, -1752884, 6042482, -877247, -1526861, -1152125, -1209033, 1227287, 1306744, -733366, -7649874, -1875290, 401579, -5348845, 1929514, -605590, 17717, -3003793, 4265440, -4253628, -5682779, 803159, 111669, --1878511, -1257889, -1533840, 889595, 594853, 583042, -1930051, 5092221, 235686, 6804839, --991601, -3089692, 1567663, -237834, 1065152, 1690607, 3507378, 2456721, -736587, -1671816, --1422171, 4548371, -4261682, 398895, 325881, -511638, -3556233, 3675955, -1600949, 852014, -3360812, -864362, 1090385, -2479807, 2146410, 1403381, -3081639, -1589138, -318364, 336081, --245350, -389768, -1611687, 2766496, 427886, -1124745, -1688996, -38118, 5516886, -747861, --2747705, 3634079, -1511292, -3357054, -457951, 2907156, 2033130, -1832340, 385473, -2299955, -1224603, 1335198, -1240172, 2887292, -922344, -5186173, 822486, 2692945, 2364916, 350577, --537945, -3772055, -1428614, -508954, -1815697, 3380139, 4599373, 2199023, -6692096, 2174327, -7473243, 3134789, -572841, -92342, 3320547, -1794223, 935229, -3287798, -3155190, 2901251, -3106335, 1542967, 635655, 508417, 392990, 1487669, -537, -414464, -1483911, 675384, --2639258, -579821, -1387274, -4829691, -2791192, 750546, 1173063, 4379793, -234613, 1766305, --2786897, -4351339, -2589329, 2262911, -1856500, -2049773, -2018098, -2884608, 2820720, 330176, -2099165, -932545, 692027, -5857799, -3628711, -2695092, 3837553, 673773, 942745, 2005213, --1941862, -1074279, -344671, 650688, -4283156, -868120, -2847563, -3250753, 314069, -2863133, -2050310, 1810329, 7813620, -1903207, 4041564, -2584497, 1751810, -1760937, 541703, 6748468, -1219234, 2950106, -3038153, 2095944, -2717104, -1301375, -295816, 4336843, -1957968, -1016297, --3648038, -1923609, -4333622, -493921, 4387846, 1137630, 463856, 877784, 4032438, -3666828, --6575595, 1745904, 2253784, -4167192, -193274, 847182, -972273, 2081985, 5345624, 1488206, --1285269, 650151, -1915019, 2641942, -7033546, 1314797, -2575907, -4878546, -3830037, 2225330, --1189706, -61740, 4828617, 1835025, -879931, 608275, 4076461, -1835025, 2960843, -1258962, -754304, -4340065, -982474, 3220152, -1216550, 3958886, 4065724, 1563905, 2489471, 5735929, --1498944, -7692287, 1589138, -3336653, 46171, -9461276, 60666, 3240016, -2132451, 3740380, -302258, -3321084, 1036698, -7087233, -4840965, -1621887, -1994476, -5863704, 2820720, 3462281, --30065, 3227131, 6979, 965294, -2182380, 2927020, 1896765, -1009854, 6374269, -1141388, -5214627, 4781909, -536334, -678605, -262530, 1570347, 1947768, 763967, 2201708, 861141, -534187, 7325067, 2464238, -3250753, -1825361, -162672, -2144263, 847719, -1692217, 6802155, --12954158, -86436, 105764, 3233574, 5895380, 1896228, -2742337, -4902169, -606127, 6109054, --1017907, -1297617, -4443681, -215822, -1745367, 4503273, 5657546, -9505299, 6321655, 3819837, --3373160, -859530, -4731980, -62814, -1281511, 25770, 3445101, 6165426, -2126546, 1359894, --1407676, -2223183, 2559801, 4234301, 3157338, -2790118, -4192962, 3026878, 2422899, -1676648, --528281, 472983, -5442798, 2017561, 2044404, -2362232, -3512210, 1420560, -2573759, 5043902, -2605435, -9015673, 4471061, -3888556, -9464497, -2907693, -307090, 1939715, -3586298, -221191, -2673080, -4382478, -3757023, -4497905, -787053, 1126355, 10012106, 1496796, 2502355, -1962263, --4073240, 6480569, -968515, -7322383, 1576790, -7272454, 2348810, 8139500, 2195802, 1762010, -3578782, 5127117, -1119376, 12534325, -1804423, 8971650, -10553808, 3649112, 6210523, -2229625, -896038, -2966749, -244276, 4846334, 8862128, -2478733, -4326106, -1269700, 4167729, 896038, -9030706, 4263829, -893353, 1315334, 16643, -4162360, 924492, -904091, -1199907, 3951370, -5255430, -8086350, 9498857, -7103339, -3755949, 1635846, -2752537, 4767414, 273804, -2669859, -6791417, 9335648, -6741488, -1200443, -482647, 2926483, -6342056, -10742250, -4807142, -3248069, -3424163, -7432441, -4051765, -818191, 8050380, 4930623, -5079873, 3917010, 2412161, -2890513, --4042638, -652835, -2284923, -3121368, 831613, -2065879, 6387153, -4355097, -220117, 4925254, --3043521, 5273683, 7448547, 1440962, 1667521, -732292, 4575751, 4103305, 5021891, -4818954, --6864969, -3379066, 4342212, 436476, 18578418, -1197759, -646393, -4298189, -8663486, -12228309, --2930242, 4346507, 6425271, -3882114, -8151311, 1271847, -92879, 8240969, -2836826, -3035468, -9723806, -5135171, 494995, -7365332, 4737886, -1271310, -97711, -1432372, -11731703, -7013682, -493921, 6709813, 4188667, 801548, -12129525, 8267275, -4958003, -4668630, -5277978, -6576669, --1158031, 6840273, -5399311, -5554467, 3974455, -1595580, 2270427, 12362526, -5284421, 602369, -582505, 5462662, -3557844, -2894808, -1636383, 8027294, -1671279, -3635153, -624918, 6380174, -7874286, -7243999, -8557185, -2499671, -1027034, -2410014, 2260227, -5546951, -1500017, -4874251, --8234526, 2033130, -5908802, 4977867, 6558952, -4875862, -5426691, -4986457, 2809982, -695248, -9416716, 15791521, -8751533, 375810, -135291, -1336272, 1735704, 4408247, -12894566, 11578158, --9006546, -4815732, 12145631, -2986613, -5410585, 3694209, 4670240, 15569, -376347, -9429064, -6022081, -1575716, 2295660, -6347962, 7885560, -984621, -12319577, -13809394, 4857071, -2797098, --6619082, 3087545, -207232, 20566450, 3898220, -4204773, -5823439, -12741020, -3949759, 1962800, --2555506, 9168681, -1568200, -14874009, -892816, 9330280, -3788161, 692027, 9101036, 5100811, --4240744, -1645509, 7563975, 8404714, -3505767, 860067, 2094870, -5543192, 2865817, -3327526, -364535, -152471, -993211, -4494147, -7454453, -12199318, -6097243, 4604205, -10558640, 3904662, --11411191, 286152, 4379256, -2033130, -8496519, -4236449, -1599875, 7597797, 6329171, -4777078, --4613869, 8115341, 3619584, -4946192, -5000953, -4186519, -378494, 7846905, -1188095, 577136, --276489, -244813, 10444824, 4948876, 7057705, -623844, -323733, 3406983, -5133560, -9078487, -7489349, 11632382, -7772280, 9986873, -2780991, -1144072, -4347581, 5097590, 507880, -5767604, -3637301, 9463424, 7671886, 3366718, -6990596, -3023657, -14347875, 2349347, 7765838, -4725538, --975494, -5791764, 1698123, -3442416, 5834176, -3582540, 2071785, 6772090, 4028143, 12761422, -6821482, 4406100, 8294119, -6641093, 12352326, 4012036, 7562901, -2097555, -8261907, -12479564, --2359011, -1500554, -3338800, -2061584, 4718559, 6181532, -12972412, 9562745, 3051038, -1786706, -13657996, 10870025, -17858474, -11682848, 10867878, 19191524, -2030983, 2910914, -1909650, -2327336, --2209761, -723165, 4510790, 2929705, 11196980, 2884071, 10681047, 3149285, 4427038, -1480690, --6635725, 2684355, 446140, -5096516, 8010114, 852551, 2926483, 1945620, -2233920, -7877507, -510027, -8942659, -3537443, -10352482, -7447474, -4234838, 8053601, 1151588, 3636227, 10492068, --5235565, -987843, 551903, 3690451, 416612, 139586, -3742527, 7710003, 16456167, 8177081, --14612016, -9938017, -11091753, 11791296, -2784750, -11184095, 5410585, -6321118, -1793686, -1921461, --1973538, -940061, -932545, 10412611, 15848429, 6561100, 13274670, 9694278, 2946885, 2319819, -1363115, -3595961, -7472170, 2327336, 16882442, 3628711, 5738077, -5163625, 4117800, -8108362, --15259482, 718333, 7706245, 2772402, 6142877, 9418863, 9666898, 988379, -11097659, -8807367, --14604499, -21832392, -610422, -2258616, 9629854, 7740068, -8540006, -4218732, 5598490, 12079059, --14713484, -8948027, -2929705, -7522635, -5543729, -2520609, 4422206, 9503152, 348429, -5017596, --6774774, 9608379, -7295539, -2589865, -188442, 13340705, -839666, 1545115, -20076824, -1029182, -5068062, 10865730, 13660143, 3404835, -12761422, 6638409, 550830, 6611566, 8836358, 1937030, -4685810, 10257456, 17534204, -10815265, -3881040, -486942, 5920613, 18632106, 8463233, 6561637, -11156178, -2983392, -4799089, -10379862, -12259447, -7649337, 1256815, 9167608, 22024056, 9402220, -4622996, 13077102, -15334644, -10162429, -2064806, 22385906, 8461622, 1071058, 11469710, -6839736, -17412872, -3620658, -15941845, -2454574, -15829102, 13191992, 7220377, 5552856, 4612258, 918586, --5253282, 6748468, 8817031, 5240934, -3416647, 8824547, 10643466, 10451266, -1435056, -7726646, -14536317, 4223027, -1091995, -1697586, 1597191, -8818642, 9405978, -985695, -2797098, -11410117, --6801618, -6691559, 17083232, 7036767, 85899, 3204046, 8806294, 13734769, 6448894, -15512348, -14978162, -738734, 8657043, 4776541, 13183939, -1919314, -17293686, 6574521, -784368, 8352101, --3053185, -5820755, 6456410, -1451699, 4395362, 23131084, -2610803, -8583492, 77309, 4383014, --10564009, 19163608, -7865159, -8808978, 15257334, -6677064, 5049808, -4895726, 3313031, -13067975, --4492536, 9088151, 170188, -12769475, 2080912, -3628174, 8717710, 3820374, 3645354, -22235582, -5513128, 1735704, 7435126, 16469052, -918049, -632434, -476741, -6374269, 13640816, -13365938, -2981244, 10537165, 4523138, 9802189, -5728950, -5788542, -10055055, -13884019, 4117263, 3576097, -6907381, 17359184, -8023536, 15068893, 5530308, -12035035, -9596031, 1073205, -606127, 1995012, --2220498, 8120173, 9702331, 12264279, 2443837, -26492968, 4636954, 9586904, 5934034, -16983912, -8731132, -8050916, 7199439, 2523830, 2588255, -1098438, 4642860, -805843, 20976084, 12794171, --13343927, 2792266, -32600950, 6483790, -11776263, -7487739, 5177583, 7514046, -18291728, -28106802, -15104863, 12817256, -31768800, 11309723, -11186779, -4410932, -5063230, 9949292, -7394323, -887448, -2560874, 27043262, -2879776, 19245212, 5910949, 14236206, 1888175, 3338263, 5865852, 25992068, -27987618, -15030775, -11874511, 14408005, -18712636, -1058710, 6205154, -20647518, 12034498, 466541, --665720, -4679904, -5066451, 1214402, 3002719, 2501819, -11122892, -1089311, -2037425, -17013976, -8959839, 9767829, -16755741, -14412300, -5552856, 8220568, 10153303, 7517267, -41339, -4952098, -9221295, 26717918, 16090558, -6996502, -2729452, -5342403, 19937238, -16750909, 7974681, 2399813, --22712324, -11512660, -74625, 1449552, -19064822, 11962021, 10039486, 2059437, 4882841, 7497939, --17921288, -4540318, -14645838, -1708323, 10949482, 13849122, 11331197, -13292924, -4338454, -4004520, -1676648, -15228880, -2709051, 13099650, 19842212, -1208496, 1121523, -12216498, 862215, -359167, --9044127, -14622753, -3019899, -6670084, -11273215, -7925826, 12377559, -10450729, 8930848, -3019362, --2709051, 17763984, -12336220, -6604049, 2521146, 7275138, 869731, -23072028, -14454712, 2841121, --3908420, 3951370, -3413962, -7123204, 14667850, 3348464, -1435593, -5920613, -33597920, 20248624, --6202470, -205622, -2997350, 1431835, 9440338, -5423470, -9268539, -15470472, -1612223, 7021735, --9772661, -12248710, 4967667, 19745576, -3461207, 18357764, 13325673, -13289703, 24472724, 16315507, --16322486, -25012278, -7304129, -10901701, 1254667, -7949985, -2020245, 11955578, -21002926, 10176925, --3432216, -11905649, -13133473, -13329968, -15835544, 3015604, 9737765, -9113921, 13774497, -21311628, -38707856, 54278188, -5173288, 6528887, 3558381, 13065827, 26426396, -25273736, 362388, 4242354, -556735, -9200894, 1414655, -11346767, 13285944, 32242320, -6786585, 541703, 1898376, 9645960, -950262, 3626563, 12505871, -25142202, -1808181, 24282672, 25209310, -29616484, -6183143, 3999688, -4198868, 8505646, 22205518, 5967320, 44731548, 7154342, 13859859, 6280853, -6929930, -9585293, --436476, -31681826, -44973676, -15628849, -14504641, -47359532, 7500087, -1534914, -26063472, -13248363, --43748000, -5284958, -5816997, 29441464, -29074244, 17760764, -19726248, -2223183, -12793097, -11040750, -12264279, 26242250, -20153598, -8507793, -1143535, -6912750, -1263794, 10537702, 22804666, 22191560, --14796162, 45493904, 33444910, 3285113, -13824426, -37855840, -19684372, 35824860, 58922120, -13659070, --3309809, 10782515, 26206816, 9184251, -15693274, 9895068, -13458817, 3660386, 8061117, -2934000, --18067316, 5572720, 18533858, -4478577, -27363236, 21359946, -6561100, 17466558, -6757058, -4065724, --7046431, -10735271, -832687, 19349364, 10299332, 3344706, 15076946, -7199976, -6584185, 6060736, --8737574, 10871099, 5779952, 16543677, 27627914, 24765318, -18265422, -32935956, -12609487, -1980517, -25289304, -9819369, 4000762, 10496900, -10883984, -15174656, -25029996, -24981140, 19004694, 21045340, --17543868, -60219200, 4173098, -4249334, -9125195, 4651987, -6949257, -24206972, -12315819, -5728950, --17939542, -7262790, 24337432, 9617506, 13275744, -5894843, -10184441, -5539971, 11969000, 2328946, --570157, 12302934, 28611462, -13484050, -984084, -11278584, 6400038, -15663746, -23666344, -6087043, --3323231, 3782256, -7577933, 18070002, -10437844, -39084740, -20016696, 12514998, -17303886, 20540682, -19787452, -9176198, -2124398, 1985886, -10915123, -723702, 7013682, -2459406, 4181151, 26169772, -23279796, -6808060, -34921844, -27925878, 2840584, 18094160, -13523778, -7023346, -16021839, -22491670, -2866354, -6985228, -24451248, -28506772, -39572220, 15368467, 6536940, -44560, 24348170, 30382598, --199179, -24398098, -16703128, -19940460, -9569187, -7724499, 8338142, 11099269, -9533754, -18299782, --19652160, 10089952, 11336029, -21765284, -18037788, -9005473, -1570884, -13157095, 9587978, 49737868, -32963338, 58313844, 22773528, -32480154, 40607304, -2398202, -14122389, 1392106, -10690174, -37579892, -35343284, -20056424, 2274185, 10436234, -4496294, -26190710, 26489748, 25367150, -14608794, -20021526, -2711735, 35108136, -18425410, 10028212, 22452478, 6907918, -8483634, -16734803, -11031087, 7804493, --2679523, 5949604, -9831717, 6561637, -21763136, 31856846, -3067681, 7156490, -1480153, -40148280, -12546136, -11125576, 20753282, 12446278, 22188338, -8671002, -38620884, 27752468, 12628278, -13221520, --23960012, 19852950, 10849624, 21099026, 21602074, -18778670, 8833137, 22227530, -32498406, 29883308, -15134928, -1149978, 9966472, -17237314, 38122128, -4518843, 25341918, 10794327, 44382044, -3453691, --6859063, 5689758, 18742164, 11240466, 13535589, 43462920, 4007205, 9935870, 27554900, -18155900, -19930258, 644782, -26437134, 8912594, -5789079, 30200062, -17816598, -25981330, -64806760, 3463891, --7856032, 1933272, 50342924, 41280540, 59604484, 31345746, -15716896, -12196097, -24538758, -32937030, -11689290, 2812667, 8757975, 10381473, -9439264, 14893336, 25515864, 4598836, -6641093, -8661875, --17808546, -12015171, -10689100, 4894115, 8264591, -25875030, -15072651, -3627637, 17520782, -7886097, -11370926, 13783087, -36439040, -36206036, 7100655, 10395968, 8308078, -27354646, -12263205, -24581708, --11563663, -11305428, 23937464, -31144418, -42900816, -16353625, 8928163, 7244536, -32971390, -26891864, --20646444, -16063178, 18443126, 25268904, 1596654, -8767639, -10072772, -6038724, -5115843, -11634530, --36467492, 12011950, 28388660, 25102474, 8482560, 34350612, 47327856, -4216584, -5336497, 35645008, --8007967, -21698174, -48695804, -16089484, 5800354, 42026792, 15570867, 2866891, 16187732, -18237504, -1797444, -9585293, -12535399, 7332583, 3798362, -11565273, -17614198, -11069204, -16276315, -14365592, -6337224, -11198590, -4417374, 7482370, -4464082, 1299765, -5030481, 20683488, -15691126, 16869020, -7227893, 1454920, -15078556, -7410966, 13788993, 4683662, 746251, 9717900, -731755, -4746476, --5435818, -6049999, -3218541, 1399086, 1154809, 1625108, -17487496, 9343164, -6489696, -7905961, -7992934, 3942243, 3979287, -4114042, 14796162, 10764262, -14731738, 14118094, -235149, 9364639, -21806622, -4811974, 12844637, 9565429, -7606387, -7736310, -10692858, 446140, 4973036, -21870510, -11713450, 2393908, 19810000, -7322383, -33550674, 22582938, 6023692, -210990, 6268505, -17301738, -3111704, -5026723, 12183748, -21638582, -62672700, -92422864, 18921478, 72844792, 2386928, 199162464, -182884544, 126001456, 216108800, 166652240, 21722334, 3207267, -23616414, -159597232, -163501344, -123996240, --213903328, -198955776, -58145268, -67002028, -68470904, 14900852, 38499012, -34309808, -12937515, 62480500, -38591892, -3599720, 45242648, 31309774, 161061, 37966976, 91492464, 59929828, 18900540, 94227824, -68444600, 3332358, 79732848, 109726216, 23727010, 9508521, 111003968, 28484224, -48183092, 54516020, -84262960, -48387100, 16464757, 119560080, 7308961, 16437914, 144024752, 112632296, 4876936, 88148832, -117664384, -47656420, -30982820, 29654064, -106659072, -173859200, -119858576, -191541584, -282103104, -259459504, --289848000, -367075296, -387062464, -342896224, -361456384, -340003584, -254369968, -200921792, -96309808, 2296197, -124596464, 138281840, 31000000, }, -{ -708670, --98247, 1244467, -1082332, -430034, -3767760, -1692217, -4007741, 399432, -2260764, -2665564, -1319092, 2340220, -2917357, 2914672, 334471, -3683471, 585726, -4206921, 2381023, -1177358, --685584, -1367410, 955093, -1877438, -248571, -1218160, 1555852, 3164317, -2915209, -1376000, -1154809, -636192, 2127083, 3264712, 136902, 1548873, 1027034, 963683, -427886, 2384244, --3133716, -1216013, 3446711, 112206, 4090956, -4457639, 2360622, -1635846, -6176700, 3228742, -2874944, 956167, -2195802, -1484448, -483721, 660888, 482647, -1101659, -2155000, -1287953, -911607, 146566, 1883880, 4257387, 996969, 333934, 271657, 3554086, 2046552, -762894, -976568, -527744, -1680406, -346819, -2671470, 3749507, 5184026, -3048353, 213675, 165893, --3712462, 4962835, -1979443, -1942399, 1421634, -5123896, -2294050, 5488968, 1250372, -2239826, -3906273, 1206886, 839666, -805843, 1908576, -34897, -6562173, -315680, -2430952, -297427, --135291, -6291590, 106300, -4046396, 229781, 630823, 2818572, 3352222, 1119913, 827855, -629750, 2893734, -1574106, 983548, 201327, 445603, 623307, -882616, 2610803, 3863323, --7427609, 3444564, -1926293, -4498442, -2841658, 5692443, 2890513, -1955821, 3272228, 913754, --2019708, 1977833, 73551, -45097, 331249, 339302, -743566, -17717, 456340, -404264, -2490544, -1618666, -3406446, -3447248, 12348, 977105, -181462, -27380, 1905355, -991064, -3327526, 2783139, 184684, -2187749, 1367410, -1167694, -1778117, 457951, -3728569, -419296, --2794950, 1003949, 1731409, 1702418, 1323924, -2870112, -209380, -2370822, 2572149, -4925254, --2815888, 2541547, -5435818, -574452, -355945, 1428614, 1198833, 2716030, 5650030, 2648921, --694174, 28991, -2008434, -1524177, -9953587, -9124658, -599148, 6845104, -1670205, 5480379, -493921, 1609002, -1665911, -7654706, 4013110, 1283122, -2295660, 1964948, -4062502, -766115, -2345589, 1089848, 7264401, -4893042, 4420595, -2202245, -5666136, -2571612, -1522029, -1488743, -2048163, 1779727, -4566624, -1971390, -2593624, -899796, 4450123, 4809827, 5093295, -3661997, -615254, -2280091, -367757, -1926293, -2644089, -3046206, -3708168, 3723200, -3531000, -4523138, --3958349, 126702, -1582159, -1247151, -3141769, 681826, -3508988, -247497, -1465121, 5335423, --3468723, -3763465, -8432631, -10899553, -2677375, -4864588, -4510253, -1077500, 2210835, -2780991, --6584722, 4036196, -9530532, 2828236, -1642825, -1729261, 6079526, 4294431, 2215130, 815507, --1111860, -1013612, -2362232, 950262, 4103305, -3395172, 3886946, 3594351, 999117, 484258, -1581085, 2730526, -6228777, -2741263, 5815386, -4631586, 320512, -171799, 3531537, -538482, --1434519, 584116, 6033892, 3271691, 2057289, 1851131, 3333968, -5515275, 4095251, -4540854, -3787088, 2375654, -1207423, -956704, -1897839, -2626373, -3986267, -452582, -1288490, -3439732, --3524558, -2371359, -2073396, 1954210, -5541582, -369904, -2477123, -5534602, -2233920, -1219234, --3464428, -1482301, -3177739, -1565516, 2919504, 3377992, -5755793, -3645354, 2197950, -1432372, --6308233, 4112431, 8034273, 1391569, -1597191, -3889630, 1103807, 3517578, 7295539, -3837017, --1248225, -4774930, -3376918, 3640522, 4163971, -5749351, 3477850, -2020245, -3243237, 5273683, -246424, 2747169, -7330973, 239444, -4601521, 811749, -5777268, -4097936, -708670, -1719598, -12907450, 3689914, 3565360, 2135673, -9098351, 4915053, 3963181, -2430415, 79994, 3726421, --256087, 3939559, 5348308, 4571993, -2542084, -73551, -1250909, 2181844, -1991254, -3016678, -2045478, -2914672, 1525787, 933082, 517007, 2215130, 1604170, -6445672, -263604, -1972464, --7820599, -4345433, 3191161, -3405372, 9162239, 4050154, 8973797, -115427, -4380867, -4648765, --6288369, 9607842, -2335389, 4408784, 4906464, 1048509, 3461744, 3165928, 3066607, 1257352, --6303402, -313533, -2419140, -896038, 4365298, -337692, -358093, 3083250, 1941862, 3195456, --2714956, -9908490, -5916855, -3706557, 7384660, -6560563, -1970316, 4582730, -467078, 925029, --5528160, 9754408, 567473, -3663607, 7669201, -4581657, 11857868, 6218576, -2630131, 1486596, --3332358, -2175401, -10856604, 3993246, -4933844, -626528, -406411, -2229088, 4675609, -1654099, --4756677, -4452271, 1058710, -4034585, -4705137, 2882997, 338229, 3609383, -1940252, -9649718, -3246995, 4670240, 5259188, -4897874, -6532646, 1420560, 8472360, 8120173, -7502234, 3847217, -8996883, -6460168, 1561221, -3548180, -7558069, 10959146, 3730179, 10187126, 8910983, 1526861, --7672959, -4339528, 3485903, -325881, 1248225, -7814693, 476205, -14007499, -6310381, -10910291, -6416681, -6160594, -623307, 2121714, -2234457, -2776696, 2919504, 3419331, 9336185, -1311576, --2625836, -7451769, -6867653, 6265821, 854699, 2157147, 11186779, -3551401, -443455, 6192269, --3337727, 2826625, 1579474, 6155762, 5018670, -3976603, -1217086, -8057896, 7625715, -5567888, --7824894, -7066832, 3674345, -2763812, -4495220, 7887171, -3285113, 8143795, -5976447, -4276177, --1908039, 5136781, 6284074, -987306, -8656507, 2275796, -5923834, 9459129, 1044214, 5201743, --9200894, -4408247, 1026497, 4321811, -12020003, 3937411, 3999688, 2075006, -9035537, 6730751, -12062416, -11897596, 4652524, -7494181, 4890894, 170725, 4405026, -3871913, -26307, 2225867, --7598334, -4377109, -3170223, 5666136, 6677601, -2668249, 3214246, -2141578, 4945655, 5558225, -2514167, 1263257, -6107981, -2938295, -7674570, -9220758, -5947993, -67646, -2835752, -1067836, --3573950, -9246528, -2905009, 1033477, 747324, -1253594, 12899934, -11244224, 3784403, -6007049, --1622424, -4066260, -3442416, 4664872, -3459596, -451508, -4188130, -3562139, -5079873, 5667746, --6362994, 4440460, -1740536, 4391604, -866510, -252866, -987306, 4109210, 2544768, -1339493, -10696616, -809601, -6237367, 1624035, -5736466, -7647190, -8220031, 5765994, 1875827, 4890894, -5822902, 2534031, -12418361, -1597728, 2253247, -3571265, -9656160, 11135776, -185757, -131533, -10515154, -3343095, -9658845, 3049427, 7283728, 12137041, -235686, 4808753, 1680406, -11727945, --2698850, -6360847, 6277632, 2694018, 3563212, -4727149, -170188, -1012539, 1620276, -4315906, -5900212, 937914, -3892851, 6031208, 1533303, -7860864, -5550709, 1199907, 8553964, 6614787, --9322763, 18957448, -336081, -124017, 5988795, -1254667, -1911797, -643708, 13157632, -6715182, -6846178, -1949915, 9328669, 2185065, 8442832, -3353833, -5406827, 3926137, 7346542, -3645890, --6689949, -8387535, -6354941, -3497177, -660351, 7164006, 986769, 6256157, 64961, -2218351, -7257421, -5561446, -9843528, -2704756, -5927055, -6075231, -11137387, 9708237, -3824132, -780073, --720481, -7309498, -605590, 663036, 5280126, -7704098, 281320, -1114544, -3368328, -16101296, --2082522, 7723962, 5778879, 7909183, 775242, -8623221, 22846004, 9740986, 15489263, 1702955, --6990060, -2663954, -2372433, -9690520, -772557, -3767760, 4734128, 83752, 336081, -3073049, --4348655, -8202314, 2596308, 856309, 214212, 4294431, -551903, 1838783, -1032403, -7145752, --5785858, 4353486, -204548, 10448045, -13438416, 10559177, 6223408, -4672925, -9811853, -14930917, -2864206, 11718818, -6327024, 11323144, -1222455, -593242, 2262911, -3455301, -13612362, 1441498, -5834713, 2600066, -6207839, -1748589, -4119948, 2607045, 5833640, -759136, 970126, -1452773, -5392332, -3620121, -3051038, 2767570, -4636417, 2419140, -17631378, 12599287, 11647414, 13438953, --4194036, -12183748, 4416837, 4776004, -17883170, -16501801, 16125992, 1687385, -7566122, 5988795, --11059004, -12861280, 2075006, 33432026, 15789910, 6214818, -8805757, 173946, -2943126, 303869, --3497177, -1801739, -3899294, 1279363, 9877888, 1981591, 12118250, -4537096, -3485903, 2281702, -8631811, -1414655, -726386, -17309792, -258772, -9648644, -9664, 13782013, 10222559, -3333968, -10040560, 19093278, -8332774, 5744519, 16255914, -11101954, 17192218, -992137, 7550553, -3484829, -1531156, -1761474, 3193308, 4333085, 17324288, -5691906, -982474, 4881231, -6424734, 5507759, -3846680, -3598646, -5932424, 16972100, 631360, -7857106, -944893, 11070815, -1825361, 7939247, -2920041, 1167157, -765578, -2966749, 21974126, 3593814, 3345780, -11590506, -6266894, 259309, -2769180, 4076461, 5297842, -21837762, 1230508, 1033477, 15795816, 2156611, 4201552, -1813013, -14379551, -23447300, 943819, 11491185, -13538274, 3092913, 2916820, 10791105, 2401424, 826781, --3582540, -6442, -11626476, 3633006, -2769180, 1717987, 3386045, -2405719, -8804683, 2894271, --6928856, -12706124, 7084549, -7361574, 4691178, -11982959, -7196755, -1640141, -3507378, 2340757, --4857071, 12257837, -107911, 11658689, -12761422, -11248519, -3482682, -285078, -267362, -4230543, -10792716, 8402567, 22564148, -4153770, 14317810, -9039832, -1745904, 3826279, -17628156, 19090056, --1052267, 11623792, -1202054, -17859548, -11368242, 6460168, -24521042, 11032160, 645856, 4133369, -11300596, 16819092, 6144488, -7242389, 16420197, -17493938, -1538672, -5474473, 2430415, 13700946, --12206297, 31065498, 4461934, 7630010, -8836358, -12650289, 4719632, 52613, 26878980, -3833258, --8757975, -15152645, -9765682, 7390028, 5199595, 4347581, -1422171, -14850386, -22468048, 1798518, --13313862, 18531174, 2973728, 15091978, -8652748, 6407018, -5356361, 7929584, 22274774, -3390877, --1599875, -3039763, 6365679, 7442642, 4452808, 1868311, 3023657, 9698036, 9266929, -4514011, --6552510, -6295349, -6522445, 25138980, 10714333, -14040248, 12177306, -2793876, -10816875, -7959648, -5463199, 9661529, -15759846, -21388400, 3670587, -9090835, 30250528, 15933255, -3663070, -2269890, -7492034, 14344117, 4671851, -459562, -2863670, -16449188, -3174518, -1645509, -77846, -7042136, --14914274, 9035537, -5769752, 13091060, 4205310, -11764989, -6699612, -5393405, 1513439, -16272020, -10505490, 17598092, -8007430, 11390253, -3815005, -3428995, 6683506, -11100343, 6238440, 14465450, -2323577, 24152748, 9830106, -8599061, 8469139, 5247913, 7252053, 1452236, 10976863, 11834782, -15171972, 7301445, -8005819, -6776922, -11822434, 34897, 24266028, 1560147, 9341554, -15249818, -32114008, -9011378, -28073516, -11511049, 19614042, 2662343, -4684199, -1949378, -3321620, 16828218, --13460428, 10142565, -4225174, 20923470, 28606630, 16645683, 12741020, -9921911, 15312632, 11403675, -8186208, 12696460, 15139760, -2738579, -32628866, -18602040, -24472724, 6496675, 5224291, 6974490, --7922604, 10770167, 23797876, 2269353, 44560, -7190312, 4655745, 10895795, 13314399, 4477504, -6368363, 9932112, -7813083, 23434952, 9558987, 4312684, -6559489, -18451716, -7138236, 9639517, --799938, -26043608, 34870840, -12468290, -6627672, 10400800, 686658, -3755949, 2666101, -7032472, --8002598, -2078764, -18743774, 4363150, -20163260, 251792, -15971373, -18420040, -3535295, -4169876, --3887482, -13567265, 5882495, 13853954, 3860102, 10526965, -18782428, 18227842, 33855080, 3160022, --13569412, 20784958, -17335024, -27816356, 45704356, -5053566, 3213709, -3556233, -20490752, 15388331, --18593450, 7622493, 27866822, -978179, 38292856, -30386894, 28827284, 7948374, -19054622, -10468446, -3583077, -18823768, -9075803, 19663970, -19804094, 12445741, -13055627, 6346888, 22041236, -47997332, --18661632, 19218904, -8685498, 4738960, -13246753, -40254044, -10234370, 12993350, 31172336, -9996536, -15860240, 301185, 7626252, 15917149, 10641855, 27661736, -6907918, 1072668, 7920994, -24704652, --15516106, -7429757, -7633231, 5571110, 762894, 2001992, -12461848, -2200634, -16596291, -13879187, -7039989, 34236796, 20159502, -9086003, -10537702, 16287053, 20055886, -11730093, 5660230, 15011984, --5456756, 32750736, 11704860, 4753992, -24749750, 15548318, 3803731, 12229383, -1976222, 3088082, --3526168, -5557688, -39233988, 10460393, 28322088, 13492640, 4443681, -950798, 14704894, -22672058, --40651864, 2812130, 55834036, 12887586, 44503376, 40916544, 1464584, 3038689, -25365540, -24315420, --1567663, -21239688, 28469190, -61469572, 12214350, -24635932, -47207060, 7317551, 22635014, -9421548, -28264106, 52303576, 292058, 15100568, 8206072, -25790204, -8647917, 27987618, 7457674, 12994424, --7728794, 8978092, 3592740, -8325794, -550293, 15143518, 13801877, 19235548, -8912594, -963146, --40735080, -36050880, 4205310, -21779780, -137439, 21341156, 3915400, 3732327, -7836705, -3082176, -11922292, 32739998, -23674934, -11625940, -3885335, -20645370, -2523830, -19805704, -7538742, -21077552, -19092204, -25826176, -3140695, 6593312, 12382391, 49675056, 63054416, 18335216, -17726940, -32284196, --3922916, -21425444, -10075456, -34291556, 4514011, 37096168, 24895778, 23215908, 1601486, 7435662, -34929896, 37328096, 24657944, 597000, 15220827, 8890045, 7056632, -38064684, 11548630, 8180839, --10368051, 29055454, 33100776, 331786, -955093, -9408126, -11338177, 30794378, 23897198, -16358457, -16544214, 22568980, 3798362, -30873836, -34351148, 31966368, 12400107, 6488622, 27207544, -607738, --10236518, 26799522, 8505109, -22455162, -9649181, -8928163, 10585484, -653372, -11579232, 3658239, --12923557, -2691871, -5190468, -8144332, 20244328, 34240016, -10923176, 6037114, 17954038, -9691594, --5941014, 5486284, 21478058, 5064304, -14287746, -21114060, -22398792, 11235098, 14652818, 30773440, --13952738, -16030429, 12709882, 17656074, 31505196, -2469069, -54268524, -13589277, 19492172, 16219944, -9652402, -12640089, 1244467, -24095840, 5099200, -11497091, 25026238, 31287764, -8053064, -1251983, --17298518, -23115514, -5770826, -44772348, -5937793, -23816668, 21985400, -19446002, 23317914, 22502408, --44629004, -4961224, -13735842, -11806865, -16166257, -26917096, -6082748, -15073725, -27232778, -41276248, -19988778, 21008832, 12394739, -27738510, -37534792, -29019484, -16495359, 6345814, -1501628, -36802500, --22032108, -25398290, 34950296, 10479720, 14983530, -11664057, -20532628, 44157096, 10585484, 13320841, --9090835, 1970316, 12656732, -9876277, 9898289, -4061429, 20687784, 29350732, 628676, -25183004, --20276540, 23000624, 15587510, 19998442, 5224828, 4283693, -11648488, -5732171, 2560338, 13582834, -30652108, -1339493, -59901372, -55728276, -208843, -14478335, 34340948, 34824668, -41064720, -28207198, --17876728, 48646948, 43343200, -25210922, 6079526, -32630478, -31304406, 17405892, -14819248, -806917, --5354751, -22716082, 15177878, 15392089, 12736189, 50146428, -36352068, -9808095, -2134599, 11946452, -45974940, -29348048, 27399206, 34248068, 16211891, -68102072, -32190780, 27567784, -22893786, 17476758, --8529805, -26146150, 15649250, 9376987, 2275259, -9487583, -50839528, -799401, -4851703, 3909494, --10179072, -30798136, 22424024, -17558364, 40705016, -821949, -7288023, 25372520, 12562242, -17175038, --5414343, -12000139, 20102058, 41160284, 24771224, -27248346, 3503083, -16824998, 15351824, -14005888, --11057930, 7372848, -5215164, 24536612, -22206592, -39060044, 7474317, -11028939, 12473122, 21593484, --58884000, -4598300, -14410689, 6877317, 56958244, -11428908, -48462264, -6626598, 34525096, 23938000, --28382218, -2351495, 19512036, 5656472, 24953224, -38619272, -28532004, 33155536, -33268280, -61436824, --25690884, -2363306, 71584760, -14144401, -46699180, 27497454, -52123188, 96954592, -65148212, 17975512, --662499, 21985400, 54570780, 16953846, 7826504, -30975304, -12322798, -30965640, -36223216, -12690018, -7518341, 20447802, 27974732, -3561065, 16392280, 19014894, -16675747, -34886408, 18509162, 6059125, --27693412, -10004589, 26817238, -9550397, -2734821, 23784992, 13848585, 10272488, 3591130, 13273596, --13037373, -32517198, -13727252, 8536784, -12943421, -8137353, 11839614, 186294, -22402012, 22851910, -5153961, -21481278, 2734821, -5682779, 20230906, 10570988, -8144332, 8792335, -12475269, -28737090, -3693135, 6069863, -2647847, -716723, 5782637, -13061532, 3674882, -11348377, 6039798, 19066434, --2438468, 7746511, 8847633, -8804146, 11811, -20258824, 5927055, 9929964, -35408248, 18605262, --22531936, 4983236, -30602, -2695629, 9792525, 52880176, -1740536, -1939715, -14533632, -14657113, -11131481, -800475, 9673340, 15032, -4960151, -7154879, 3830574, -9949829, 10196789, -9370008, -14754823, -11852499, 8711267, -10042170, -1944547, -1704565, -8969502, -7164006, 2375117, -4259534, --2626909, -147640, -6651294, 853625, -1071594, 2160906, -1317481, 4009889, -13612362, 12661564, --4438312, -4183298, 9963787, -7733626, 864362, -9644349, -8092792, 6164889, 5782100, -6749541, --4010426, 2774549, -61203, -11739219, 3402688, 2150168, 377420, 7840463, -2483028, -3218004, --2787971, -7925289, -1796907, 8607651, -8596914, 2496450, -3970161, -896038, 955093, -2487860, -2343442, 340913, 6240051, -8239358, -462783, 5982353, -10901701, 7037841, -4984310, 938987, -4662724, -545998, -5709086, -24478092, -42501924, 16049756, 134322416, 34163244, 73883640, -2470680, --72785200, -23049478, -71622336, -60389388, -21911850, -14198625, -5364951, 40834940, 53819700, 72138808, -90137944, 39562016, -23548768, -41426572, -89251568, -83993992, -34807488, -27720256, -19171124, 37035504, -49444736, 30291330, 45829984, 55897388, 18417894, 15738908, 10048613, -28110560, -13481902, -19953882, --45024680, -24102282, -33504504, -48665200, -27053998, 6747394, 5067525, 28192166, 66602056, 46371688, -37863356, 37757056, 11269457, 3476776, -3898757, -18456548, -27495844, -33911988, -49654116, -43030204, --24505472, -6794102, -16672526, 14811195, 25896506, 22907208, 37986300, 43193948, 27386858, 25731150, -24462524, -2268280, -10924786, -4161823, -33043868, -26174604, -5361193, -24996172, -26481694, -13142600, --12840342, 2990908, 864899, }, -}, -{ -{ --576599, -426276, -2568927, 2670933, -3614215, 389768, -1221918, -2304250, -4488778, -1504312, -48318, -806380, 5398774, 2911988, -2048699, 37044, -506806, -76773, 327491, 152471, 1750199, --247497, 1137093, -858457, -6593312, -2307471, -1106491, 323733, 3984656, -2474438, 271657, --373662, -129386, -1427003, 2348273, 466004, -1072131, 2851858, -2022930, 1081795, 1283658, --2902861, 2544768, -1269700, 164283, 659278, 910533, 1276679, -1180042, -2157684, -705985, --1498944, 1106491, -1358283, 297963, 1719061, 4559645, -1600412, -3562675, -1049583, 3362423, -3476239, 2158758, -106837, 1025423, -1277216, -1781875, -1467805, -4255239, 2999498, -606664, -752156, 80531, -2029909, 737661, 863288, 3195993, 3035468, -2722473, -571768, 4541928, -1391033, -2224793, 407485, -2465848, -2342368, -1739999, -4069482, -1302449, 2369211, -108448, -1283122, -585189, -1199370, -1017907, -549219, 3452617, -2185602, 302258, -210990, 241055, -2610266, 7516, 1780264, 5945846, 4508642, 4684736, 2327336, 1140851, -787053, -5305895, -2176475, -1915019, 3427921, 1334661, -1871532, 1738925, -2445984, -4578972, -1471563, -1701344, --4460324, 301721, -561030, -519691, -2088428, 400506, 4631586, 2174864, 3155727, 74625, -1953673, -1683627, -100932, 2553895, -1957968, 1758789, -2421288, -2499134, 350040, 5602248, -3700651, 2250026, -920197, 1077500, 770947, 493921, -735513, -1899986, -2858838, -2107218, -578747, -1760937, 2013266, 1010391, -3445638, 8136816, -172336, 465467, -865436, -4341138, -3179350, -2284923, -2164127, -5063230, -3884798, -1674500, 3096672, 4430796, -933082, 2594697, --1062468, 4801237, 5011153, -10143102, 1803886, -25233, -1034013, 3330747, 5309654, -1738925, --840203, 18790, -394600, -2656437, 2037425, -2683818, -2117419, -317828, 2602750, -1635846, --5759015, -2642479, -3951907, 319975, 234613, -5170067, -714038, -2343442, 917512, -306553, --896038, 1069984, -1824287, 1529008, -2855617, 2456185, 3700651, 5745056, 2284386, -2814814, -1930051, 2263448, -1153199, -6982006, 201863, 3236258, -2964064, 1728724, -4188130, -363998, --2803540, -7191923, -2428267, -3968550, 1355599, 2103460, -2711735, 603980, -1399086, 6582038, -1921461, -9176198, 3313567, 4554276, 1787780, -893353, 2450279, -5811628, 884763, 2416456, --1201517, 2330020, -316754, 2860985, 787590, -3970697, 2484102, 3395172, 3538516, -1138166, -1719061, 1771137, 1373316, -10408316, 1493038, -4509179, -1248225, -1592896, 2442763, 970126, --8347269, -3165391, -1844152, -1741072, 3440806, -3274913, -5841693, 1292785, 2742874, 1535988, --5820755, -2908230, 1884954, -5678484, -435939, -6260989, 898722, 2812130, -3122441, -1129576, -3479461, 4253628, -10362682, -955630, -2891587, 2939368, 1262184, 313533, 868120, -3125126, -2603287, 2061584, -8079371, 5946382, -874563, 1278827, -4155381, -1971390, -3529926, -706522, -838056, -3515968, -4534949, 3643206, -1478543, -4601521, -3852586, -3643206, -1915555, 6542309, --2126009, 682900, -5265630, 5601711, 637266, -4202626, -794569, 3143379, -6806450, 2152852, --1830730, 1347546, 1393180, -3474092, -2036351, -8637716, -2000918, -9698036, 1485522, 1884417, --750009, -1533303, -596464, 1178432, -3428995, -6988986, -2857764, -2732136, -762357, 2218888, --1270237, 3754338, 2068564, 2813741, -3884798, -499827, 89657, -3760781, 1272384, 2480344, -35970, -2018635, -3777961, -4068408, 2874407, 3526705, 208843, 7258495, 6332393, -5710696, --1024350, -295279, -5343476, -6850473, 10251550, -490163, 667331, 2754685, -5857799, -2419677, --3624953, 9375914, 3104188, 112206, -7253126, -6585259, 1395328, -2997887, 5698348, -3098819, -813359, 772557, -11395622, 5709622, 3225521, 5823439, -3121368, 3198677, 3330747, 5987185, -1416266, -11353746, 2842732, 508954, 4523138, 8273718, 438087, 3607236, 3144990, -6784975, -2397666, 657130, 949188, -1822140, -939524, 4256850, 2807298, 205622, -4158602, -13959, --1980517, -2117419, 6819871, 3189550, -278099, -867047, -8224863, -7013145, -8079907, 2203855, -2192044, -8326868, 600759, 628139, -8301635, 587337, 1286343, -1040456, 9549323, -1101122, --4692252, -1098438, 5480915, -364535, -8509941, 9339943, 4780299, -5773510, 4486630, 1013612, -847182, -22549, 495532, -2138894, -4301410, -3878892, 7347616, -304943, -2210298, -128312, -5244155, -4668093, -8787503, 621697, 1854352, 2030446, -7778186, -3353833, 2665564, 3497177, -13082470, 3983582, 10480794, -11529303, 381715, -5655398, 122943, 3924526, 4379793, -5884642, -2545305, -3374771, -3113315, -4063039, -6793565, -906775, -15923591, -67109, 5186710, -613643, --1132798, 1833951, -8377871, 3022046, -7990787, -2412698, 8127152, 1752884, 2772402, 292595, -2357400, 7074885, 6259915, 12253542, 6262063, -9082245, -816044, 10344429, -1483911, -7379828, --1190780, 1063004, -3476776, 6973953, 5027259, -5774584, -1780264, 6696928, 6937983, -2371359, --4517232, 11220602, -4647692, -14835891, -10191957, 3421478, -15141370, -175557, -4611721, 197032, --1522029, -4086662, 5487358, 1726040, -1654636, -4814122, 4075924, -2857764, 7683697, 5514738, --2581812, -5276904, 547071, 1992328, 1015223, -12938589, 6176700, -1252520, 3337727, 4118874, -7020661, 1412507, -6019934, 8128763, -3018825, 3519726, -3651259, 2893197, -519691, -15262166, --3090766, -2782065, -1755031, 816044, -3614215, -2717104, 2006824, 3066070, 1119376, 7887171, -3720516, -8137353, -630286, -263604, -4496831, 9071508, -5681705, -5723581, 9764608, 10063108, --1404991, -461172, -6596533, 1976759, 1256278, -3744675, 1554778, 6043556, 3782256, 7328288, --2138357, -6502581, 3540664, 454730, 1593970, -7711077, -4044786, -4748623, 1382980, 3624953, -1159104, 562104, 7036767, 8331700, 890132, -4845797, 4582193, 3505230, -6826851, 185220, -475668, -1459752, 37044, -943819, 4516158, -1455994, -5105106, 1146219, 5825587, 1988570, -2260227, 5105106, -10878615, -6905771, 4679367, -2847563, -10142028, 5048734, -5184563, -4986457, -6962679, -2268280, -1963337, -1894081, 1987496, 4740570, 2837363, 2449205, 3005940, -4355634, --2215130, -1076963, 6300180, 2902324, -10365904, 3177739, 3569655, -4655208, 10250476, 8975945, -5189394, 167504, -3376918, -2533494, 788663, -3291556, -3487514, -6322192, 1140851, -7186554, -5344550, 1810329, 301721, 971200, 2927020, 2197950, 5690295, 8401493, -3006477, -13608067, --2137283, -9288404, 3377455, 1194001, -12023224, 4371740, -4942971, 15304042, 5270462, -9693204, --170725, 9763534, 5235029, -7982734, -4645007, 10268193, 5964636, -7008313, 8793409, -7155953, --9574019, 1656247, -14560476, 8997956, 9350681, -1887638, -8943196, -1195075, -210453, 2853469, -46171, -8825084, -6372658, 93952, -10411538, -89657, -24570434, -7879655, -2787434, -13593035, --4677757, -2965138, -5873905, -4716948, 3228205, -6651294, -12305618, 3104188, 7726646, -12761958, --3487514, 3681861, 6293738, 10645076, 6897181, 6176163, 6971806, 2309619, 12376485, -7630547, --3224447, 2383170, -6219650, 2079838, 3440269, 6233072, 762357, 10351945, 2130304, 2324114, -7227893, -3557844, -6426882, -215285, -9797357, -6518150, -11300059, -827855, -683437, -15031312, -5097590, -7038378, 2797634, -14260365, 1439351, -10920491, 15392089, 308701, -14179298, 16205448, -20204600, 5201743, -7148973, -5677410, 5009543, -2432562, -993748, 5324686, -10102837, 5539971, --10417443, 4345970, -4303021, -7037841, 2274722, 6872485, 1439888, 6320045, -3398930, 10088878, --7736310, -7915625, -19512036, -4769561, -9922985, -24624122, 6496675, -14338748, -8093329, -11621645, -3515968, -22201760, 6274411, 1457068, -3770445, -812286, -5854041, -2543695, 5688684, -7770670, --4862440, -26844, 4456566, -6829535, -39192, 7171522, -11527692, -3081639, 7486665, -6963753, -83752, -235686, -1398549, 9849971, -8362302, 5733782, -3517578, 7963406, 9234180, -9144522, --11291469, 10786810, -645856, 2130304, 3456375, 715649, -1964948, 5955509, -2791192, -13961328, -4172561, 2508261, -11236171, -1605244, -3607236, 6841346, 9328669, 4007741, 2141578, -3703336, --7715372, 8322573, 6070937, 7408819, 258772, -12438225, -1979980, -2112050, -4316979, -3192235, --120259, -5569499, 29155312, 17494476, 741419, -8950175, -22771380, -2285460, 10030896, -4449049, --9411884, -16320339, -1339493, -3149822, 193274, -5275294, 5043366, 398358, 14282914, 6296422, --6477348, 79457, -2966212, 1632088, -3362423, 3562675, 8754754, -10094784, 1743220, -5854578, -3925063, -3997541, -8049843, -14578730, -1503775, 9274445, 2643552, -1284195, 2950643, -499290, -8041790, 13735305, -4788889, -2327336, -15371688, -15771657, 4364761, 3133716, -7116761, -5301064, --13798119, -8654896, 5299990, -1014149, -56371, 1477469, -1104880, 7050726, 3564823, -10407780, -513785, -9379672, -789200, -4625680, -3005940, 11824582, 22711788, 37944964, 1797444, 12919798, --10561325, -13121662, -19078244, 100932, 1329292, 5330592, 6788733, -679679, 387621, 10646687, -18181134, -9078487, 191126, 3296924, -14543296, -31675, -9337796, -9365713, 13994614, -4245575, --3330747, -7613367, 16042777, 13802414, 133681, 22785876, 2716030, 6997576, 5181341, -6573448, --7374996, -12123082, -6176163, 2627446, 223338, 10117332, 906775, -1292785, -1775432, 7101729, --10416906, -25845502, -8919573, 7409893, 2449742, -2270964, -7584912, 298500, -12299176, -2010045, --11210938, -926639, -1377074, -8074539, 7621420, 3639985, 14444512, -12055973, 22356916, 5887327, --4383551, -8023536, -4118874, 3431679, 12825309, -4046933, 7275138, -11456825, 9070434, -10382547, --11839614, 11497627, -16906066, 10976326, 8870181, 17846662, -18449032, 13931800, -2231773, 12599287, -4081830, -18310520, -4270808, -3051038, 4175245, 1416266, -12616466, -16619376, -34434364, -10403485, --20273856, 5743445, -1049046, -6732361, -10108742, -9365176, -8718247, -9168145, -9249212, 1091459, --7568806, -1199370, -16290811, -24635396, 30208116, -9313637, 16297253, -2994129, 4090956, 5397164, -8706436, 6010807, -1715303, -329102, -13279502, -2787434, -3298535, -8628589, -13932337, 5564667, --1746978, 19637128, -13658533, 577136, 26663694, -6243809, -22559852, -6953552, 648003, -9853192, -15475304, 7519414, -8904541, 6696391, 8164733, -4864588, -476741, 4622996, 10188736, 20401, --10709501, -9739375, 12202002, 9504763, -7032472, -13777718, 8690866, 11229729, -9971840, -12183748, -8458938, -15539192, 30642982, 7696582, -3367254, 2401424, 6657200, 3065533, -6860137, 2113661, -126165, 12905303, 8207683, -12880070, -53150, 4782446, 3566970, -8479339, 20260434, 14336064, -29196114, 16144245, 10749766, 4156455, -25876104, -2235531, 3269544, -15278272, -4284230, 28854128, -1948305, -17043504, -16910896, 14802068, -23213762, -6208375, 641024, 5824513, 2234994, -4699231, -7004018, -10699300, -474594, -2493229, -6999186, -1871532, -5056250, -15414101, 7310035, -13460428, -6992744, 6216429, 8198019, 1008780, 5173825, -6052146, 23422604, 2555506, -26431766, -23288386, -1236951, 9335648, 18743238, -7315940, -16360604, -7729331, -3060701, 1253057, 10434623, 1480690, --10274636, 25467546, -33842196, -6595459, 4784057, -23910082, -13244069, -7295002, 1691680, -38124816, --19223200, 24809878, -12027519, 6167036, -10893648, -31060666, -13940390, 13400298, -7182259, 3243237, -16533477, -8024610, -45746232, -13909788, 4266513, 11550241, 14556181, 10052908, 13443785, 19614578, -39966280, -23671176, 17675402, -7271917, 910533, -7358353, -29895120, -25263534, -2871723, -3147674, -8375723, 10621454, 17780628, -6822019, 1088774, -10067940, 1702418, -3245922, 1483911, 14904073, -10575820, 3784403, 14491220, 13387950, -24932286, 11393474, -13763760, -21455510, -4079145, 10838350, -5400922, -15119359, 6161131, -270583, 11300059, -2806761, -24019068, -20461762, -19561966, -23311472, -4733054, 15697032, -1323924, 62054760, -39847632, -33643552, 21417392, -7752953, -10648298, -6489159, --1202054, -1515587, -36814312, 1852742, -307090, 3020436, 32759864, -4577362, 13476534, 8974334, -17579302, 46477452, -14698452, 59146532, 21228950, -6231998, 9808095, -28056336, 10145250, 45107356, -1197222, 47066936, 24713778, -2812130, -18265422, 53070764, 7853885, -8909910, 6749541, -12069395, --3678640, -1810866, -3384434, 6696928, 14672682, 10308458, 1815161, 6800007, -10797548, -10308458, -3062312, -3153043, 17273822, 18901078, 11863237, -4871567, 1008780, -22999550, -14625437, -4273493, --15989090, -24866786, -15030775, 11857331, -14679661, -43841952, -20533164, 13428752, -17986786, -12460774, -347355, -3163780, 20338280, 30427158, 39557184, -21008296, 10999411, -159988, 949725, -8400419, --26758720, -52402360, -35065724, 18550500, -35558036, -18063558, 9101036, 18278844, -13524315, 20663624, -57148836, 12825309, 10575283, -42776264, -59151900, -11598022, -18915036, -29830696, -9649181, -24235426, -17899276, 13205414, 51779052, 25865904, -11722576, 24396488, 47579112, -25194278, 35998268, 29405494, --5056787, -7177427, -16615081, 5255430, 32154272, 24382530, 37792492, -16223702, -7772280, -7410429, --2586644, -9854266, 9761924, -12156368, 27781460, 12315819, -46068356, -19357418, 281320, 7403987, -19753628, -8935679, -17405892, 5734855, 5427765, -6763500, -8523363, 5819144, -12950400, -19303194, --8921721, 44029320, 18135500, 8131984, -21690122, -6244883, -18302466, 11804718, 21390010, 8039642, -1864016, 13442174, -6809134, 28731720, 16319265, 2832531, 9904195, 263604, 55562380, 12676596, --22348326, 10377178, 10546829, 7035694, 13629542, 2430952, -20830054, 28222230, 7429757, 6529961, -12206834, 6987912, 2117419, -13962939, 21378200, 24100136, 14084272, 64521148, 47339668, -20717312, --43521440, -935229, -10394895, -54476828, -8824010, 15217069, 14098767, -11544335, 17974438, 7242926, --9670119, -19787452, 2855080, -4051228, -32921462, -8946417, -12922483, 3193308, -44731548, -32636920, --7696582, 21842594, -4861903, -5732708, -27967754, 1224066, 20045150, 1720134, -17558364, -8244727, --5540508, -8108899, 3231963, 7921531, -24245628, -23918136, 1436667, -347355, 2838974, 40794672, --27140436, -2116345, -4088272, -38883948, -14437533, -28360206, -7151658, -2036888, 25125022, 31717796, -35631048, 11355357, 3696356, -14223321, -36456220, 1702418, 10742250, -11310796, 44191456, 110583056, -102877888, 15821586, -70785360, -61818000, -27450210, -38696044, 126820184, 80814640, 47431472, 66143032, --4040491, -34181496, -95428264, -58631136, -25756918, -4387846, 34372088, 73114304, 25682294, -25102474, -29321204, 9737765, -2684, -48770964, -20568598, 49227304, -34428996, 16020765, -3740917, -7026567, -10297721, 8564702, 20556250, 41918880, -26620744, -27071178, 3925600, -15255724, 20140712, -28508382, --20802138, -16903380, -1876901, -2335389, -22662394, 11365020, 32461362, -25901338, -36451388, -20673288, --11971684, -4016331, 44799192, 5876589, -6209449, -45856292, -17390860, 7320235, 36561444, 20733418, --12446278, -67496488, -55412596, 50172196, 46555836, 52693880, -28476706, -114543560, -28658170, 54802172, -38034084, 8849780, -19499152, 9488656, -53403624, -26198764, 9536438, -12082280, 7726110, -6976101, --5096516, 51020992, -44231720, -18067316, 33169496, 33375654, 53492208, 26979910, -91865592, 26121454, -79257712, 18686866, 33982856, 9258339, -35785668, -59232968, 7531225, 9465571, 6493454, 56499756, -10609643, -5279052, -35764728, -7241315, -2699387, -9567040, 532576, -7916162, 15588584, 5888400, --9941239, -2825552, 23676544, -899259, -441308, 1456531, -4886599, -10757819, 13612362, 10362682, -9380745, -15219753, 8266202, 20402706, 9114994, -2161979, 14487462, -3431142, -15649250, 3409667, -4801774, -14057428, -13677860, 13371844, 14467597, -14556718, 9330280, 7642895, 386010, -5796595, -559956, 10060424, -195421, -12837657, 6639483, 6689412, -22204980, 5107790, 16813186, 4858145, --14513231, 1771137, 10310606, -19349902, 5012764, 8566312, 3464965, -5093831, -18516678, 21256330, --23694798, -1793149, 21147882, 917512, -5201743, 1510755, -22756348, 10972031, -3159485, 15024869, -17451526, 53689776, 4897337, -6723235, -17824652, -12109123, 6505265, -8153996, 7152195, -10828686, --634581, 8428336, -4597763, 3918621, 4170413, -15010911, 4374424, -4959614, -2988760, -12361990, -3745212, -3531000, -7475391, -3652333, 6241661, -5392332, -5011153, 7582765, -8114804, 4272419, -7549479, -14940581, 15086609, -3703336, -17242146, 9380745, 9654013, -8148627, 3230889, 5396090, --7042673, -6572374, 448287, 1092532, 5209796, -2305324, -476205, -7272990, 7233799, -5654325, --1418413, 8681740, -9822053, 3144453, -1382443, 219043, -4345433, -6432788, -2187749, 11806328, --7385197, -2780991, 2429341, 2712272, 913754, -6757594, 5953899, -2874944, -5417028, 104153, --10419054, 16517370, -6411313, 3555696, 4487167, -3083787, 6919729, -26126822, -44335872, 20601348, -150156896, 23738284, 74683576, -17060684, -77306192, -27226334, -75361640, -48557288, -16295106, -7597261, -2863133, 44980120, 52636972, 74658880, 72835128, 23971824, -29779692, -46453828, -87045568, -65540128, --35509716, -12960601, -9552007, 27240294, 44008384, 35148940, 46401216, 46256260, 16094853, 15375983, -4838818, -32872070, -13176960, -28191092, -50521700, -29530048, -29841432, -42591580, -9965935, 20694226, -14528801, 44529684, 56864292, 30540438, 37598144, 29419990, -4888210, -755377, -3547106, -30524870, --39058968, -33587180, -52185464, -43242268, -16342887, -2112050, 5301601, 36046048, 31852014, 32013076, -38854420, 30122216, 9268539, 19175956, 9355513, -11183021, -6426882, -20983600, -45847164, -26555246, --26025354, -34526168, -16361141, -7961796, -8920647, 12223477, 751619, 0, 0, 0, -0, 0, 0, }, -{ -598611, -333934, 2591476, 2121714, -2348273, -1621887, -504122, 3191698, -3264712, -204011, -1760937, --4113505, 2080912, -803159, -3930969, -1672890, 3838090, -5396627, -1599339, 4961761, -1509681, --6172405, 4240207, -550293, -2192044, 1329829, -1729798, 3087008, -1814087, 1402307, -3595425, -3181497, -461172, -3484292, -361314, -1637456, 1931125, 1603633, -786516, 234076, 488016, -6812355, 3144453, -887448, 3452080, -1697049, 2784750, 452045, -1193464, -816044, -4350265, -1185411, -1661616, -3380676, 3061775, 515396, 1702955, 727997, 2112587, -1243930, -1906966, --3758, 391379, 1242856, -1053341, 2158758, 209380, 346282, -200253, -2683818, -278636, -1002875, 1946694, 506806, 1073742, 3257733, -1122597, 6152541, -3447785, 1016297, -5133560, -1427003, 601832, 7850127, -4687420, 2147, -2454574, 3928821, 4049081, -2579128, -463320, --2216740, -1239635, -2588792, -3184182, 2361695, 802622, -2107218, 4418985, 3992172, 6861747, --206158, 2617783, 1356136, -83215, -6174016, 1637456, 2571612, -2404645, 1546725, -1763621, --2088428, -3354906, 1765768, 4394826, 460098, 5122822, -2064806, -399432, 5146445, 2719251, -432718, -29528, 4894652, 7354595, -5419712, 1251446, -1851668, -814433, -8442295, -2981244, -3463354, -2609730, 2416993, 1114007, -1196148, -2046015, 1255741, -704912, 2707977, 1418413, -1306207, 1316408, -4312147, 96637, -2010045, 2585034, 4619774, 2936684, -469225, 4467840, -271657, 1075889, 187905, 717796, -953483, 3576097, -4402879, -4807142, 278636, -6439767, -1265942, -2093260, 3185255, -1795833, -4927938, 475668, 5037460, -850404, 275952, 6771016, -8739722, -3822521, -3852586, -1224066, -6307160, 2643552, 697932, 1500554, -2143189, 3325379, --4356171, -916439, 3179350, -2619930, -798327, 363998, 5683853, 250182, 4148939, -5414880, -5338108, -681289, 882079, 3257196, -2779918, 2694555, -1187559, -1472100, 2562485, 3069291, --401043, 1693828, -6891812, 4111358, 4277788, -7610145, -6412923, -2015950, -5288179, -1699196, -2238215, 1167694, 2149631, -89657, -1641751, 4364761, -1357747, -82678, -1647120, 796716, --2582349, 3576097, 1165010, -3395709, -1459752, -1672890, -1506460, -2182380, 4170950, 11210938, -1996623, -3994320, 5013838, 756451, -3629784, 10229001, -6945499, -9654013, -5862094, -5826123, --2149094, 2956011, 3387119, -3300146, 4940286, -6359236, -3685082, -723702, 1934883, 1647657, --2157684, -2483565, 5513665, 1134408, -609885, -3183645, 4044249, -3106872, -962073, 4832, --610959, -444529, 1404454, 886374, -1151588, 3557844, -1963874, 2158221, -446677, -5844914, --2589329, -2356863, 5871221, -3470871, -4504884, -7605850, -9179419, -1669132, 86973, -3589519, -6323266, 834297, 3202972, -2785823, 5384815, 2388002, -3802120, 9260486, -4700305, -4632659, -236760, 5753646, 8078834, 5969468, 1464047, -3119757, -7357816, 2563559, -724776, 6531572, -1974611, -2041720, -1029718, 3271691, 1751273, -1172526, -10104984, 1241246, -3427921, 2028835, -1084479, 7131257, -9335648, -5965173, -6757058, 3391414, 3540664, 4148939, -4725001, 1308354, --1153199, 197569, -7574712, -7219303, -4615479, -5380521, 8346732, -3700114, -628139, -629213, -3056406, -1768990, -8104067, 3048890, -3037616, -1614371, 4205847, 2404645, 4774393, -246424, -2684892, -6451041, -2157684, 4733591, 9067750, 4585415, -116501, -7304129, 5043902, -2768643, --5555540, 7391102, 2613488, 2116345, -4708895, -3534758, 2958159, -2495913, -2552821, 3519726, --3156264, 734439, 368293, -6353867, -1049046, -4501663, 5978058, 2138357, -733366, 98784, --2652142, 2509335, 584652, -1146756, 980326, -7838852, -3604551, 2470680, 1605781, -2611340, --1188095, -6390375, -15860777, 5310727, 800475, 3974992, 4274566, -3051038, -11190537, 8689793, -3697430, 8559870, -1523640, 4576288, -37044, -2979097, -147103, -7833484, 9768903, 2310693, -1007170, -4883378, -2764348, -3264712, 3011846, -4326106, 7554311, 457951, 2701535, 4276177, -2448131, -328028, 2576444, 2447595, -1537598, 2093260, -8038568, 2320893, 3998615, 4034048, -7669201, 2765959, -4670240, 2682207, -2190433, 5251135, 1308354, 3886946, 6002217, 1152662, --845035, 4660040, -2618856, -4559108, -1315334, 3341485, 8322573, -1588064, 1040993, 415538, -1535451, 1821603, 3934727, 1408212, -1330903, -64425, -1969243, 2326262, 1548873, -4639102, --3347927, 2057826, 3914863, 3062849, 6272263, -7311645, -2424509, -5419175, 8507793, 4360466, -15653008, 8999030, 7214472, 11618423, 2611340, 2515777, -7232725, 265751, -13157095, -1797981, -4462471, 4036196, 1879585, 3470871, 3132105, -2221572, -2234457, 7853885, 6231461, 6211060, --780610, 1360431, -9451612, -7310035, -3322157, 6357626, 1539746, -591095, 2813741, -4686346, -192737, -2102923, 6041945, 5631239, 10846940, -439697, 3919158, 4183835, -2066953, -5141076, -10213969, -5374078, -1639604, 5485210, -19864, 3459059, 7317014, -1628866, 2589329, -6496675, --15836081, -7825968, -5390721, -1231582, 526134, 275415, -4212826, -7459822, -1923072, -5051419, -1691143, 883690, 599685, -8390219, -4436701, 7277822, 2014340, 848793, -10572599, -8181376, -5613523, 2463164, 3462818, -5317707, -242129, -1155883, -7872138, 5893232, -3350611, -568546, --20921860, -5271536, -7562901, -5447629, 1133335, 6731825, -1121523, 8987756, 5172215, -809601, --8842801, -4034585, 13834627, 2009508, -7848516, -6190659, -2411087, 6104759, -4689031, -175557, -4641249, 6670084, 8072928, -8805220, 6024229, 538482, 1891933, 2208150, 3423089, 2520072, -8084202, -12885, 2629594, -7082938, 9843528, -5037460, -2014340, 1401770, -7723425, 9648644, --1324461, -19452980, -6136972, -15648713, 1168231, -402653, -4457103, 20802138, -3461207, -10536092, --3325915, -2692945, 9819906, -1444183, 4766877, 5544803, -3781719, 7112466, 10060961, -5105106, -3882651, -8856223, 4369056, -3157875, -2485712, 10252087, -3807489, -851477, -4758824, 523986, --459562, 9727027, -13538811, 2786897, 2670933, -4153234, 1733019, 10252087, 10799695, 4151623, -3825205, 5311264, -8463770, -1327145, -9028021, -45097, 5690295, 3782793, -1930051, -6942278, --2335925, 4968204, -9337259, 494458, -690416, 4482335, 8841727, 1036161, -4795868, -3432753, -9469866, -5877126, -2954938, 5688684, -3405909, -10970420, -4069482, 2806224, 1890859, -4215511, -1044214, 6122476, 4024921, 5929739, -669478, 4560182, 8050380, -3223910, 4001299, 3815005, --5534066, 12328167, -11526082, 7244536, 2974802, -15563888, 15233712, -9454297, 2092723, -1297080, -12095165, -4677757, -8798241, -1301375, -120796, 2796561, 9110163, -7334194, -751619, 1268626, -52613, -650151, 2075543, -5572183, -1980517, -3473018, -10244571, -7334731, -10450192, 8245801, --24276766, 13211856, -9476308, -6936909, -11691975, 1117228, -1110786, 1894081, 8920110, -7406134, --2407866, 6645925, 6621229, -2228551, 2825015, -3470871, -10838350, -1228361, 3264712, -5908265, -9527311, 1403381, -591632, -5504538, -4821101, 1140314, 14493904, 506269, -1438814, 3768834, --11543798, -2130841, 4987531, -8212515, 12344810, 7472706, 193810, -3564823, -3297998, -4466229, --7372848, -9837623, 9046275, 752156, 15560667, 1519882, -14496, -6453725, 2022930, -2350958, -4158065, 107911, -8484171, -6938520, -8618389, -15611132, -1276142, 14668387, -12517145, -227633, --13091060, 2971044, 5145908, 4127464, 11356967, -126165, -13212930, 11637214, 487479, -5605469, --4176856, -10753524, -2292976, -7048578, 7716446, 10859825, -4169876, 9689983, -9464497, -4548371, -6107981, 2363306, -12665859, 1107028, 15769509, -18212808, 787053, 8955544, 20508468, -8595840, --5598490, -1978906, 15813533, 16123307, -17029008, -489089, -13150653, -5858336, 8071318, 8709657, -10726144, 6547678, -2483565, 8034810, -9878962, -4888210, -1254131, -1197759, -14163728, 1500017, --605590, 18620294, -3124589, 9307731, 1899986, 5618891, 12007118, -7188702, -3597572, -17884244, -12209518, -15740518, -3117073, 3898220, -2436320, -9007620, -2592550, 2832531, -6838662, 2000918, --1346472, -1205812, -20648056, -14249091, 732292, -10290205, -14586246, 2803003, -13513578, 4370129, -8306467, -7611756, 14461692, 3265249, 9133785, 10363756, 2203855, -7305740, -9452686, -10736344, -5082020, -10249403, 25836376, 10216117, 4825933, 12696460, -4575214, 2373506, -13070659, -17767742, -11407970, 21990770, 7113540, -472446, -21630530, 26304528, 4334159, 2921652, 4316442, 628676, -5324149, 1163399, -3306051, -522375, 7262790, -4491999, 9005473, 1268089, -6105833, -9603547, --1949915, 8086887, -1722282, 2395518, -3209414, -3753802, 773631, 23561654, 4524211, 3090766, -3909494, 1644436, 15044197, -5724655, 4856535, -9654550, 17846662, 23408646, 6997039, -1773822, --7644505, 24460912, 12557411, -55835, -8713952, 3204046, -4815195, -1338956, -10030896, -4609574, --6298033, -10602127, 17507898, -5403069, 13276818, 2024003, -8109972, -659278, -18737868, 18613852, -118112, -9664213, -5523328, -12103218, -12632573, -8033200, 24063092, -5737540, -2419677, 6013491, -7747048, -5880884, -5759015, 23381266, 23390928, 28359132, 17415556, 5361730, -7150047, -7921531, -4412005, 7958038, 10293426, -15627239, -368293, -2226404, 7706245, 5603859, -10531260, -13492640, --28991, -5416491, 12430172, 14128295, -26844, 7231115, 2509335, 2552284, 16825534, -10888816, --13764833, 10184978, -18023294, 920734, -5661304, 9228274, 4874251, -504122, 11361799, 9892920, --9877351, 11270531, -288300, -5935108, 2547989, 12233141, -5384815, 4715874, 9309342, 3465502, --21293910, -13036836, 1585917, 80531, -14717242, -10779831, 4125853, 5601711, 5080410, -20564840, --14248554, -14774687, -1909113, 6957310, 11261404, -32268626, -23687818, 2042794, 3408057, 15811385, -4663798, 4248260, 10894721, -4297652, -5771899, -7749195, -9547175, -20014548, -18446884, -16110959, -6554120, -2516314, 9342628, -17700634, -2292976, 306553, -6089727, -8540006, 14532022, -5842230, -3386045, -692027, 1531693, -14495515, -4596689, -12457016, 2163053, 1124745, 3688840, 32700808, --12336757, 8713952, 14539001, -7516193, -6095096, -10453414, -1432909, 15073725, -15200426, 10418517, --428960, -3020436, 2066416, 1214402, 9111773, 597537, -16132971, 12483322, -9803263, -24376624, --18825378, -10052371, 33225330, 27361626, -14348949, -4564477, -19935628, -17416092, -6095633, 19951734, -1240709, 13756780, 7990787, -9526774, 11338177, -7198365, -20675436, -1723893, -12194486, -2444910, --6115497, 42726336, 1295470, -34493956, 28506772, -10211285, -6751689, 29259464, 29496762, 2602213, --10764262, 10919954, 4944044, -16592532, -10773389, 5386963, 3703336, 9425843, 28558848, 5225365, --1051730, 6994891, 1184874, -11769821, -7707856, 6692633, 1139777, 23786066, 5208185, -1256278, -8156143, 12858058, 12441983, 14003204, 348966, -9491878, -3099356, -21935472, -3434363, -24798068, -13487271, -15028091, -6346888, 239981, 19742890, -11564199, 10751914, -8080444, 6295885, -10178536, -12360916, 19649476, 756451, -3988951, -11098732, -15005542, 7837779, 9825811, 24072218, -3234110, -536871, 11013907, 38876432, -9139690, 5144297, -6311455, -22919556, 15592879, -4076461, 11113228, --2362769, 2825015, -14383845, 36779416, -56223808, 40604084, -64483564, 27335856, -34121368, 10275172, --27372900, 9421011, 14668387, -3677566, 9619653, -5782100, 41744396, -26366268, 22759032, 13652090, -11617887, 44087304, -30496416, 12618077, 8557185, -26951456, -293668, -5512591, -7114077, -13955959, --252866, 1335735, 18178450, 6370510, 9770514, 13080323, 11294153, 213675, 15297600, -17169668, --1871532, 20326470, 2879776, -28247464, -5843303, -36905580, -6236293, 6308233, -6154152, -8666170, --915365, 32803886, 9021042, 2458869, 4750771, 8186745, -1719061, -18889266, -4985920, -2106682, -4322348, -4347581, -7960722, 23824720, 13701483, -4892505, -212601, -5073430, -20570746, -17617418, --11911018, -10665478, 25076166, 5864778, 9967008, -14398341, -12908524, 4611185, 11001559, 9108552, --2773475, -2767033, -14944339, -10726144, 15755551, 678605, -37891276, 13886703, 23394686, 6794639, --15110769, -10861435, -5956583, 2253247, -8484171, 4482335, -13548474, -36303212, 31753766, 39429412, --3988414, 28790240, 846645, 4754529, 12083354, -24648818, 8859981, 19017578, 18080202, 8157754, -5462662, -17645874, 13084081, 8314520, -11159399, 6385543, -2314451, 22178138, 5868536, 6096706, -12721693, -4548371, -14762339, 4857071, 27564564, -9256191, -5318780, 25526064, -9060770, -10483478, --8940511, 9243843, 32189170, 45215804, -2546379, -28172838, 43952548, 15771657, -28429462, 33324114, -12873091, -7307350, -7885560, -11423539, -19724638, -337692, 11276437, -16552804, -10660109, -35873716, --4156992, 22264574, -43545064, -23199802, 8121247, 8099772, 10035191, 27940910, 25338160, -38588672, -2005750, 2484102, -26023206, 8778376, 15652471, -13433047, -7425462, -11294153, 11639361, 31664646, -14372034, 16024523, -14433774, 7022809, -20315196, 23511188, 80269720, -25956634, 1286880, 5633387, -36590436, 31432718, -9820980, -14306536, -19458886, 421444, 15903727, -923418, -9596031, -10965588, -15084999, -8225936, -18615462, -17642652, -2751464, 28951300, 21304112, -23608362, 2347737, 127775, --9350681, 11270531, 5099200, -8565775, -1893544, -6769942, -2248952, 37177772, -13023951, -25017648, --16456167, -14277008, 34015604, 774705, -6688338, 30331060, 21937620, 8228621, 16532940, 29873646, --17138530, 4576288, 30234422, 17017734, 23394150, -25267292, -5947993, -905701, 11879343, 10108742, --22665080, 2375654, -30127048, -47166792, -1130650, -12368969, 23374822, 24579024, -4927938, -1764158, -6497749, -17012902, -44194676, 30995168, -20523502, 4905390, -6814503, -15404974, -7186017, -17878338, --33541548, 3739843, 2144263, -12475269, -3684545, -39131984, -22318260, -18218178, -45932528, 53255984, --1043677, 28094454, -6188511, 1484985, -31878322, -17454748, -16301012, 3836480, 25469156, -1012539, --25862682, -19439022, -37080064, -41525892, 36177584, 13379360, -32003412, -9877351, 16510391, 29990682, -4712116, -36742908, -21887690, 7511898, 10973641, 9409200, 22261352, -22742388, -21070572, -3108483, --6945499, 3286187, 7280507, -44174276, -7268159, -30742302, -18853832, -41087804, -14602889, 56812752, -10897943, 1989107, 15105937, 14213121, 5749351, 42211476, 34714072, -10888816, 12840878, 56906708, --13234942, -13247290, -11780558, -42369316, 319438, -23286776, -50450296, -55343876, -26556856, -28752658, -15515569, -21682068, 4852776, 10827613, -33975876, -13740137, 4628901, 2218888, 36537288, -24303610, -8310762, -27909234, -7650948, -30287036, 5165772, 34113316, 658204, 20675436, -42107324, 37250252, -14399952, -8913668, 31984084, 3242164, 15460809, -13137768, -12670154, -1218697, 11033771, 6228240, --28687698, 27088896, -31935230, 3301219, 11309723, -12254079, 21808770, -21736292, -9949829, -3036005, --5463199, -11300596, -264141, 3859565, -13445395, -18973018, -3748970, -3777961, -2239826, 10638634, -8407935, 4064650, -19865834, 5487358, 29613262, 35538172, -23923504, -13721347, 33247878, 41470592, --22544820, -15957951, 20539608, 7147900, -17076254, 16491601, -44070660, -9500468, 22645216, 37618544, -8509404, -23609436, -17351132, 5552856, 49460308, 3710852, 11376295, 999654, 20195474, -3517041, -39698384, -1546188, -29679834, 20793548, -13015362, -55158656, -17581986, 11382200, -21012590, 57985280, -39339216, 28754270, 12507482, 39686036, 24951612, 10670309, 16398722, -42877732, -61819612, -6592238, --1301912, -13687524, 6138045, -1122597, -17550310, -17921824, -17934172, 32810866, 25134148, -19906636, --4696010, -1276142, -7361037, -5954436, -13215614, -14643691, -24889336, -2638184, 38573100, -11212012, --24473798, -9001715, 36061084, -16013249, -19468550, 60620244, 18943490, 11669963, -16333761, -30572650, --24613920, -31587874, 6968048, 29300266, 72264432, -63541892, -29804388, 40105868, 50939384, 11043435, --5286031, 69914552, 30463130, -19718732, 19480362, -6070937, -2025077, -45418744, -26156888, -14737643, --79807472, -31077846, -15052787, 43346420, -25285546, -11390253, 28026810, -496606, -7639673, 8931921, -17315698, 48987324, 18403934, -4422206, 13099113, -2808372, -4247723, -18476412, 9032853, 7215545, --14015552, -7292318, -51833812, -2434173, 21793200, -5351530, -21427592, 9203578, -4563940, 23145042, -5013301, -11686606, 146029, 24795384, -13967771, 3715684, 9408663, -7971996, 118648, -13921600, -28082106, -2002529, 4481262, 104153, 13765370, -6413997, -4850629, -9017821, 5924908, 10072772, --4176319, 12028593, -4956393, 7271380, -12590160, -10613401, 16234976, 19891604, -25713970, 853088, -518617, 2080375, 8761196, -16842714, 25806310, -23003844, 20915416, 2471754, -34697432, -2297808, -28255516, -36320928, 17908940, -193274, 5483063, -8959302, -4443681, 6979859, -9351218, 36604396, --25979720, 3967476, -5798206, -3197066, 10928007, 1034550, -2403571, -26561152, -74454328, -106802416, -34812856, 92843232, 19430432, 259243152, 213183392, 142831824, 243473648, 125044216, -11820287, -34357592, --100785168, -228516960, -189453696, -184973504, -255336880, -190651456, -59875604, -46215460, -12696460, 80392664, -33774548, -18269180, 47793324, 83300352, 36570572, 33973728, 74265888, 39944268, 28499792, 64966212, -107842336, 38015292, 58076012, 98965176, 6721087, -5583458, 84869624, 43930536, -52042656, 32123672, -45501956, -80090936, -35751844, 52691732, -32268626, -61215096, 71354440, 27569396, -77579992, 26468272, -41736880, -110550312, -105817792, -60903172, -235776528, -305454848, -203463344, -276229760, -359028672, -262171776, --269178496, -339558496, -278824448, -208691920, -225337072, -156797984, -43481712, 8761733, 81913080, 168436800, -219100240, 279131520, 305690528, 325236928, 256278016, 71095664, 3454764, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ --7415261, --2544231, 572304, -1530619, 395137, 130997, 4044786, -5265630, -2714419, -483721, -2277943, --1417339, -3992709, 1948841, -3980898, -2339684, 606127, 3228205, -4040491, 19327, 298500, --3243774, 1285269, 609349, -1534377, 301721, 1772748, 5829881, 1129576, 762357, 2332704, -973884, -288837, 1200443, -1358283, 1248225, -5062693, -1829656, 1426466, -1128503, 5373004, --2825015, -1618666, -3403762, 1119913, 1017907, -626528, 878858, -942208, -1641751, -2905009, --328565, -419296, 2385318, 3314104, 906775, 2357937, 1724966, 119722, 419296, 12348, --5108327, 1069447, -49929, -3014530, 214748, -2730526, 2490544, 2663417, -1436667, -2617783, --6153615, 1680943, 3428995, 3181497, -2975339, -286689, 4031364, 9729712, 142271, 423591, --4658966, -3685619, 2778307, 1738925, 232465, 3989488, -6000606, -2003065, 9670656, 689342, -1867237, -2518462, -3293166, 4589710, 3790846, -1563368, 3731253, 196495, 591632, -3657165, -1310502, -3323768, -2646774, -3260417, 1104880, 181999, -1096827, -319975, 1112397, 2938831, --1398012, -5208185, 70867, -3690451, -4821638, -1189169, 2144799, -662499, 1911797, 1309428, -1750736, -668404, -696858, -806917, -798327, 1726577, -77309, 3448322, -469762, 4253092, -665183, 1069447, 3907347, 1548336, 984084, 5245229, -2088965, 1860258, -1788854, -3395172, -3277060, -970126, -12348, 1467268, -624381, -2702071, -940061, 2472828, -1409286, 300648, --2909840, 1835025, -12709882, -6642704, -2950106, -2794950, 11274, 537, 968515, 146566, --694174, -5253282, -2348273, -5384279, -8358007, -7035157, 3964792, 4831302, 4941360, -1982664, --571231, -598074, -1089311, 1770063, 767725, -1826972, -3787624, 2687576, 2340220, 3367791, -898722, -1198833, -2075006, 919123, 1633161, -440234, 3470334, -1740536, -98784, 3318936, --2583960, -4150549, 321586, 5610838, 1295470, 1197759, 784905, -7516, 715649, -933619, -996432, -4533875, 716723, 4587562, -1079647, 10737, 443455, -1642825, -906775, -700617, --777926, -1298154, 2818036, -2720862, 2762201, 2325188, 5186173, -408022, 2897492, 6621229, --1270237, -5398237, -6068252, -302795, -852014, 343597, -5197984, 1583232, -3626026, 8703751, -7128572, 2822331, 3726958, -2456721, 1767916, 5973226, 3155190, 6444062, -2410551, 2509872, -3936338, -338229, 5003100, -2654827, 3189013, 403190, -2934537, -936840, -420370, -344134, --712965, 210990, -1387811, 335007, -969052, 5876052, -1217086, -486405, 156229, -2874944, --7491497, 4205847, -1642288, 1526861, -2865817, -3038689, -3075197, -2318746, 2177012, 5622112, -4750771, 1757715, -136365, -1407676, 2032593, 3989488, -720481, -1534377, 5357435, -2452963, -2681133, -2740726, -1788317, -1407676, 2150168, 1858647, -3372623, -2674691, 358093, 3679713, -5287642, 2524904, 4202089, -740345, 3980361, 1226750, 4196183, -2389076, 1935420, 8547522, -4546223, 3451006, -380641, -2834142, -5375152, 2699387, 10271414, 1360431, 3810710, 7292318, -278099, -4264903, -1650341, -1302986, 462783, -2675228, -7037304, 2894271, 450972, 165893, -3246995, -4768488, -1970316, 7591355, -1586454, -2792266, -4189204, 228707, -3922916, -613643, --1086090, -1162326, 887985, 6226092, 171799, -1769527, 2181307, -4686346, 6921877, -648003, --1021129, 8334384, -4217121, 607738, -5040144, -2290291, 998580, 521839, 2687039, 2853469, --4348655, 1781875, 2699387, 2020782, 1141924, 2695629, 2403034, 3798899, -2372433, -1247151, -7224135, -2211371, 3314641, 1109175, 2767570, 2197950, 447750, -1585917, 737124, 5179731, --1532230, 413391, -157303, 1846299, 5459441, -1372779, -3465502, -8707509, 2425046, 856309, -1328219, 1675037, -861678, -3620121, -11673184, 6289980, -4360466, -5423470, -495532, -10871099, -1739462, 4354560, -2061584, 9308268, -4036196, -9460202, 1684164, 4690105, -4345970, -6453725, -11621645, 25770, -1518271, 3959423, -3519726, -775242, 488016, -5252208, 2778844, 177167, -972273, -444529, 5017059, -634581, 2467996, 3695283, -6512244, -1964948, -4015258, 6806450, --3753802, -920734, 3732864, -711891, -4161823, 3499862, 7500087, -3330747, 3241090, -3459059, -4647692, -2102387, 2061047, 1472637, -3756486, -7559680, 3921842, 7071127, -1411434, -981400, -2667712, 5281736, 3300682, -4829154, -1547262, -4110821, -1375463, 2895882, -4527433, 2508261, -3086471, -3133716, -1098438, 2065879, -5192079, -1685238, 2685965, -1329829, 1669669, -228170, --4409321, 5577015, -6124087, -6065031, -10414759, 4418985, 11044508, 1713155, -1947231, -907849, --1817308, 9653476, -5710696, -5181341, -1184874, -5708012, -1714229, -6197638, -2642479, -4313758, --8649527, -2341831, -1837172, -186294, -863288, 2398202, 5311801, 2005213, 2690797, -7860864, -1114544, 42413, -2382633, 2969970, 1621350, -2136209, -887985, -5491116, -6177237, -689342, -7182259, -1803886, -3439195, -500364, -2161979, -4637491, 271120, -4833449, 10729365, 9223979, -2503429, -2347737, -2253247, 1324997, 1806571, 2246268, 1964948, -178778, 4158065, -3216394, -1979980, -2722473, 354872, 565325, 2462627, 2208150, 5213017, -1393180, -2757906, -1918240, --11150809, 1348083, 2687576, 44560, 4475356, 3372086, -3083250, -10333154, 1308891, 11414949, -9912785, -10684805, -10584947, 3060164, -8512625, -3852049, 721018, -128312, -3740917, 8771397, -3246459, -11306501, -1401770, 1139240, -560493, 7946227, 2336999, -5014375, 7446937, 3390340, -580894, -3789235, -4971962, 3830037, -3358128, -7504919, -1918240, -583579, -4026532, -4291746, --6892886, 7292318, 2684, 1474248, -4927401, 578210, 4360466, -3349001, -8564702, -7708393, -8094940, 2410551, 7608535, -806380, 1816234, 6463389, 11640972, 4420595, -2049773, -5702106, --3198677, -2582886, 1301912, 1175210, -5397700, -1439888, 6495601, 5528160, 9012452, 5042829, --7255811, -5796595, 7305203, 4796942, -4853850, 632434, 7461432, 1234266, -1250909, -5764920, -6127845, 5804112, -2366527, 9787157, 1843078, -4452808, 1800665, -1687385, -827318, 5362267, --8920110, 5378373, -5819681, 1043677, 4791036, -74625, -2310693, 1755568, -6080063, 245887, --4709969, -13942538, -4166655, 5914170, 3923990, 2168959, -3281892, 2872260, 1392106, 14925011, -2680597, -5004711, 5668820, 1136556, 1314260, 9957345, -2714956, -2726231, 3590056, -6912750, -8550743, 7835631, -26307, 4479114, -1468879, -4170950, -387084, -5254893, 629750, -5128728, -2243047, 73014, 1717987, 772020, -8814884, -1673427, -942745, 708133, -4314295, 2200097, -2250026, -1474784, 12164958, -4908611, -10306311, 6643778, 10700374, 2733210, 2996277, -4175782, -9250286, -2565706, 1829656, 4570382, 1496259, -3395172, 4552129, 2624225, 677531, 907849, -30595200, -8519068, 403727, -3244311, -1708860, -6935299, 96100, -17957258, 9511742, -6538014, --172872, 10179609, 5382131, -6949794, -7031399, -2845416, -5952288, 5581847, -14389214, 2648921, -6455873, 8370892, 2028835, 2469606, 729071, 1344862, -1540283, -4643934, -13035226, -1988033, -2150705, 6207839, -4385699, 6002754, 2813741, -2402497, -357556, 4689031, -4344360, -4527970, --2097018, -3423089, 59056, -11797738, -4961761, -2706366, 311385, 9599789, 2792266, 9188009, -3820910, -208306, -4895189, 919123, 1371168, 1629403, 3983045, 12912282, 2405182, -11504070, -4053912, -4283693, 758062, -4068945, -3798899, -1906429, 6157910, 3609383, -19449222, -7327751, --4518843, 4548371, 1131724, -3876208, -333934, 12375948, -1323387, 6920266, -4279935, -5509370, -4221953, -9885941, 973347, -22564148, 5786395, -7637526, 2557653, -7920457, -15976741, -2886218, --3413962, 11258183, 5324149, 3827890, 8053, 15067819, -11186779, 2484102, 4784057, 11570642, --13320304, -8169565, -2312303, 799938, -512712, -4226248, -867583, 3791919, -6983080, 1191317, -4779225, -1161252, 1003412, -6275484, -6425271, -4535486, 18842558, -133681, -4079682, 6875169, --4028143, -9569187, -7203197, -5316633, -939524, 2985539, 1069984, 356482, 10618233, 9080098, --1318555, 3059091, 2618320, -12101607, -7772280, -788127, -617938, -3372623, -7762080, 9631464, -12248710, -10101763, 6704444, 5771363, -1726577, -9696962, -15015743, -15023796, -11284490, -7060390, --13162464, 714038, -10989748, 5738613, -9239012, -7461969, -5433671, -5794448, -2027761, -13368086, -455267, 14982993, -5355288, 7990787, -3251290, 14962055, 12368432, 5378373, -15461345, -3714073, -20362440, -5064304, 15067282, 2622078, -14675903, -7122667, 17047798, 642098, -11651709, 561030, --9947681, -1044214, 3375308, 1739999, -2075006, -16754667, -15301895, 4574140, 10891500, -9367861, --966368, 4721243, -840203, 2145873, 18159658, 3863323, 2550674, 2119566, 5924908, -7509214, --5849746, -3527779, -19378356, -5859946, -7359427, -4254702, 4937065, 4189204, -1374390, -1052267, --7788923, -10594074, 14873472, -2203855, -13451838, -5048197, 2448668, 11380053, -8276939, -1050120, --8812736, 71941, -10524280, -2147, -2616172, -18020072, 1324461, -3826279, 13482976, 821413, --11831024, -8499203, 6842957, -24721832, -12948253, -8374113, -13857712, -7099044, -5811091, -13943074, -14622216, -4111894, 22184042, -11133629, -17180942, -3107946, -11628087, 19489488, -6919729, -9994926, --5000953, 5362804, 9517111, 8616778, -2349884, -2074469, -4750234, 2323041, 15573551, -223875, -1161789, -4918812, -2384244, -8121783, -3117610, 3918084, 2326799, -6658273, -104690, -9952513, -1585917, -2789045, -3536906, 4438849, 1425392, -4456029, -2448131, 9028558, 2696703, -6877317, --10113574, 16221555, -1413044, -24839944, 12428025, -2355253, -11481521, 5579700, -2372970, 1711008, --3341485, 9405978, 2436857, 1614908, 23203560, 24770150, -9600326, 3595425, -19274740, -2637647, --4896263, 9125732, -4401268, 3179350, 5443871, -2714419, 11394548, 29878476, -22391276, -7296076, --14149233, -9578314, 11425150, -13073344, 27553826, -3386582, 8440148, 1346472, 6698539, -17296908, -3131568, 4265977, -1289027, -2815888, -1549946, 4786204, -10575820, -6659884, -1586454, -3287798, --13105019, -11869679, -3242700, -5696201, 15506443, -4474282, -7640210, -5788542, 5157182, -8499203, --3675418, -14416058, 6231998, -5832029, 5424007, -5472862, 6951942, -4306242, -24451248, -12860743, -3110093, -2524367, -1954210, -8193187, -14849313, -1561221, 5735929, 3455301, -3881577, 3879429, -6687801, 21902186, -10522670, 9832791, -26472568, 568009, 2888903, -4190278, -8335995, 3958349, --92342, -186831, 4597763, 16591459, 11004780, 7542500, -6318971, -7890929, 7300371, -13416404, -700617, 5854041, -9103183, 11152419, 36368172, 24252070, -5849209, -16602196, -9750113, 20675972, --24680492, 515396, -5562520, -7126962, 11403675, -19606526, 3447248, -10434086, 717260, -13884556, --9109089, 700617, 1657321, -289910, -11624866, 19291382, 5067525, -9795747, 4650376, -3453154, -2783139, 29177860, 10497437, -9152038, -6322192, 674847, 10351408, 1734093, -21341692, -6285685, --14410689, -5937256, -6158446, 6810208, -3069828, -2882997, 974958, -1522029, -9847286, -13503377, -9466108, -5574331, 3423089, -1336809, 12346420, -9793599, -5268851, 2108829, 5890548, -12721156, -14639396, -9113384, -18257370, -18931678, -5211406, -5944235, -6571837, -4794794, -26410290, 9092446, --11786464, -4886599, -9572945, 14692546, 6464463, 6663105, 1483911, -3105261, -12019466, -5328981, --34716756, -4629975, 23584202, -28909962, -11126113, -1023813, -8509941, 10020159, -5716602, 31960462, --3028489, -7409893, -5145371, -1828046, 9661529, -6840809, -6060736, 25943214, -19164144, -2803540, -6289443, -4744328, 16636556, 8817031, -1036161, -2581275, 7101729, 8848170, 10282689, 7817914, -17513266, 4992900, 7545184, 3951370, -5654325, 28600724, 3666292, 4815732, 7348152, 3684008, -21028160, -2199560, 5114769, 6550362, 5976447, 2696166, 13763223, -9021042, -6831146, 13034689, --2767570, -14841259, -3849901, -25350508, -8613557, -5642514, 22810572, -22914188, -3213709, -116501, --1175210, -2406792, 13184476, 36151276, -7033546, 3325379, 3736085, 4143570, 17283486, -21090436, --20385526, -20144470, 31420906, -328028, -12040941, 25333864, -9906342, 19982872, 2648384, -21640730, --60681444, 11574937, -13982266, -24483462, 27406724, -16666621, -7410966, -24107652, 6879464, -5335423, --22042310, -8099772, -12745852, 5721970, -11732240, -42950, 5750961, 9632538, 6097780, 16772384, -3623342, -756988, -914291, -15284178, -10347113, -11055246, 9368934, 12406550, 6993281, 4025995, -582505, 4434017, 11183558, 23211078, -10272488, -6845104, 5192079, -11381663, 12494060, 1927367, --9346386, 23664732, 9940702, -20929912, 9185324, -20146618, 3490735, 3218004, 11535745, -6094022, --5366562, 30277908, 13276281, -13747653, 9416179, 15787226, -11180874, -27346056, 16452946, -2657511, -1345935, 1700270, 8324184, 41140956, -1920924, 4653597, 10153303, -761283, 12030203, 4827543, --19279034, 3616363, -8520678, -18818400, -22079890, 47099148, 9820443, -2866891, -5877126, 10735808, -42164232, 19591494, 4824322, -1100585, 13953812, 35525284, 8536784, 12310987, 10755672, 25336012, --16575889, 16428787, 6956237, -48410724, 14033269, -6804302, 14032195, -15057082, 11047193, 7594576, -14690399, -107911, 6005438, 2359011, -14153528, 6844031, 13226889, -11472395, 6427419, -11155104, --7128035, 34696356, 3091840, 30699352, -22374632, 9496173, -1616518, -4506495, -1202054, -2792803, -4249334, 11144366, 7271917, -1008780, 17010754, -28196998, -27012660, 18976240, -15652471, -4085051, --4158602, -18358300, 8474507, -5036386, 4470524, 2522757, 29073708, 14141717, 14960445, 5528697, -3453691, -27513560, -7013682, 12821014, -1035087, -295816, -760209, -9568113, -24014772, 11507291, --41874856, 35594004, -14653892, 6460705, 24101746, -34725884, -281320, -3476239, 8877161, 12192875, -15350750, 24887724, 4861903, -16966732, 9580998, 26508538, -37975564, -23263690, 26371100, 702227, -296353, 579284, 2695092, -1358283, -199716, 12538620, 8559333, -19192598, 1611150, -5922760, -32583770, 18709952, -6166500, 1183800, 4262218, 3218004, 170725, 10884521, 1544578, 8153459, -33188286, 3681324, 3811247, -5838471, 8775155, -32118840, -13179107, -14048838, -1058710, 2350421, --27208618, 9831180, -24104968, 7209640, 25703232, -6653441, -22444962, -13392782, 9847286, -5667210, --46160696, 11495480, -32013076, -8394514, -3424163, -279173, -12269648, 1910724, 17440252, -14942191, --29496762, -47967268, 38487200, 9437117, -1792075, 8078834, 50638740, -54569708, 21360482, 29607358, --36139464, -9531606, -19988240, -9099962, 50324132, -21893058, 35391068, -15852187, -6049462, -7976291, -10857140, 5794985, -45622752, -7169911, -12877386, 20443508, -81604, 9301289, 14425721, -20499878, --5073967, -12643310, 6774774, 19389630, 10281078, -26832272, -5873368, 6861747, 2801393, -513249, --14171781, -4213900, -26265336, -3375844, -4440996, 24602646, -21599928, 52223580, 10318659, -13583908, -21578452, 2113661, 28293098, 17258790, 26803818, 8134668, 24404542, 21982180, 23847806, 27451284, -3051038, 26599806, -33287608, -4268124, 5840082, -20033338, -4683662, 14671608, -26124138, -35569308, -13708462, 24973624, -361314, 6481106, -26921928, -6159520, -22790708, -419833, 23259932, 1824287, -44633300, 19233400, -12421582, 33441690, -70490616, 64120640, -13011603, -23814520, -17310328, 43887588, --32727114, -7393786, -7938174, -2175401, 26569742, -29068876, -417149, 9101036, -6130529, -5335960, -2768107, -17162152, 24082956, -375810, -33656976, -10648298, -6486475, 613107, -37029596, -1926830, -6932077, -9381819, 2629594, 9142912, 26557930, -11613055, -3743601, 3593814, -13799193, -52099028, -6844031, 38511900, -17935246, -32688996, 4717485, 30745524, -12460237, -11274826, -39195336, -8443369, -3629247, 28210418, 16709033, 2111513, -28665148, -19807852, 27896350, -31614718, 13662291, 47527572, -31159988, 36387500, -15107011, 20351702, 17719424, -44947908, -12098386, -25204478, -1803349, 22936736, -2888366, 24815784, 26516592, -45336600, 52168284, -32009318, 5029944, -1331440, -15858630, 41517300, -5531381, -25339770, 44077100, 29745870, 5428839, -9146670, -21507048, 12263205, -829466, -2867428, --483184, -1593970, 1046898, -9417790, 11833172, -1044214, -37555732, 8856223, 4436701, -14128295, -1503775, 15856482, -4606353, 337692, -26840862, 19522774, -8880919, -3757023, -1762547, 10809896, --14036490, -1283122, 4511863, -250719, 4285841, -7856032, 21748104, -11490111, 37507412, -23037668, --22706418, 21853330, -24033564, 714575, 20005958, -17994840, -6533719, 9464497, 12975096, 14975477, --54176716, 17181480, 825171, -13139379, 36586680, -18057116, 3618510, -163746, -28350006, 38013680, --217970, -1873143, -18423800, -3738232, 33414846, -7350837, 797253, 1427540, 11297911, 5634460, --36529232, 19917374, 37652904, -17117592, 17510582, -25291988, 50496468, 5413270, -33929704, -24130736, --80461920, -121709176, 7871065, 105049528, 1190780, 274979360, 248930400, 148951616, 287339232, 188441152, --32073206, 10234907, -37939056, -227597296, -129892160, -100756712, -222752032, -183257664, -55137716, -108183784, --124351648, -11412802, 5605469, -53501332, 9527311, 45276472, -62039192, -52889836, 78230680, 14404783, --21863532, 53906136, 72769632, -2510409, 74513384, 128199944, 43918724, 33065342, 130185824, 87116968, -7488276, 94655176, 140815328, 59967408, 69956968, 160880880, 58329412, 18434536, 152754800, 150445184, -43019468, 181774288, 259935184, 93846112, 103291280, 179526416, 50458348, -65550864, 4243965, -67559832, --229549888, -218926288, -234149264, -371325152, -401654080, -428382176, -506228480, -528294400, -517024416, -501871232, --443181568, -395437632, -323578528, -207575232, -141330192, -7804493, 207479136, 179362672, 35194572, 0, -0, 0, 0, }, -{ --7441568, --3151432, 441845, -2930778, -376883, 3689377, -4294431, 1852205, -1865626, -1881196, -3999152, --1311039, 6078453, -4331475, 3453691, 1873143, -3306588, -148176, -4864588, 1398012, -404264, -2983929, -8735963, -3820910, -1162326, 1890323, -725850, -3172370, -10201, -863825, -3992709, -3882114, -7516, 1139240, 4190278, 224412, -1038845, -682363, -801548, 386547, -1806034, --2829847, -2325725, -2204392, -1247151, -1381906, 5653788, 3712462, 1368484, 1187559, 1036698, --1246077, -381178, -1191317, 5369783, -718333, 1422708, -3681861, 1379221, -339302, 2182917, -1082869, 758062, -1595044, 268972, -986232, 4189204, 20401, 476741, 1946694, 1056025, --2605972, 1250372, 544387, -1300301, -175557, 61203, 3103651, 9375377, 2301566, 1213865, --2005750, -963146, -4553202, -378494, -1047435, 3354906, 3287798, -3340948, -2121177, -2093797, --1660542, -2437394, 393526, 2622078, -2090575, -2595771, -7725036, -5989332, -4116726, -399432, -559956, 5565741, -3045132, 2652679, 1900523, 1258962, 475668, -4524211, 1230508, -9406515, -1243393, 61203, 553514, -857920, -5549635, -2815351, -4771172, 62814, 424665, -3197066, --7479149, 4965519, -264677, -4694400, 76773, 2697240, 737124, -1800128, 1165547, -2805151, --1007707, -2670933, 1913408, -2833068, 3645354, 2588255, -512175, -5367636, 316754, 373125, --406948, -2188823, 1309965, 550293, -1137630, 2371359, 2971044, 1684701, 166967, -354872, -881005, -3081639, -10150081, -11382737, -815507, -4498442, 3469797, -5577552, 1392106, 2581275, --3815005, 3110093, 11382737, 637803, -1061394, 6242198, 832687, 6265284, 82141, 2854543, --4499515, -5953362, -337692, 2243047, -4149475, -1345399, -436476, -1184337, 1114544, -1235877, --2200634, 2040646, -1046361, -893890, 4459250, 6352257, -2007897, -3467649, 1254667, 5069135, -1923072, 6503118, 259309, -970663, -181999, 5786932, 362925, -4242891, -2306398, 4517232, -3319473, 3490735, 965831, -2363843, -4722854, 835908, 2224793, 2648384, -1009317, -2596845, -5119064, 3289945, -824097, -3014530, 204011, -2169495, 5366562, 1421634, 1039382, 1452773, -681826, 808528, 3388729, 214212, 3454764, -1107028, 5493800, -32749, -4663798, 6007049, -4163971, 6323803, 6525129, -1543504, 3255048, -1377074, -3742527, -318901, 9677635, 4276714, -2138357, 3481608, -4076461, 6947647, 2937758, 4664335, -1398012, -7653632, 3198140, -11957726, -2400350, -3032784, 2377265, 1917703, -259309, -4096325, 960462, 2722473, -1640678, 2555506, -6038724, -404264, -5078262, -6835441, 1030255, 3102577, -6365679, 3549254, -5987722, -3841312, -4264366, -2471217, -5074504, -2411087, -3598646, 5586142, 7559680, 4353486, -2803540, 73014, -4002373, 2472291, -416075, -3071975, -1554778, -2689723, 2820183, 9466645, -160524, -5065377, --4125316, 2231236, 672162, -1869921, -5677410, -58519, -4880157, -1834488, 651761, -779537, -3698504, 743029, 4691178, 5570573, -4841502, -1762010, 13325673, -3549254, 1248225, 1948841, --8884140, -7483981, 128312, 8770860, 6597070, 10591389, 3406446, -2964601, -4632659, 792421, --2702608, 2091112, 911070, 3573950, 6459094, 2089502, 4727686, -142808, 2749853, -2923799, --6242735, -3220689, -4816269, 42950, -1450625, 1401770, -7602629, -3748970, -1158567, 2721936, --3853660, 7680476, -8879845, 1823751, -5669894, -4489852, 2325188, 2165737, 7231115, -881542, -1653026, -2183991, 4972499, 5451924, 1273458, -1252520, -5881958, -843961, 1637993, -4365835, -3989488, -4800163, 1686848, 7751342, 6183679, 28454, -2930242, 1160178, 7374996, -1035624, -1429687, 1166621, 5834176, 31139, -2342368, -3973919, 2034741, -5940477, 1246614, 12558484, -1803886, 6146098, -1505923, -5070746, -8145406, 4016331, -5749351, -6321118, 1465121, -3157875, --19420232, 1718524, 3238405, 17782776, 6028524, 1152662, -7944079, 7311108, 3459059, -3431142, -4140885, -849330, 6747931, -4105989, -1799591, -1488743, -1509681, -2864206, -945967, 4483946, -4286914, 6867653, 2741263, 3296924, 163746, -4708895, -4702453, 6511708, -3401077, 1347009, --357019, -4818954, 6988449, -1245004, -2674691, 1063541, 5158256, -3370476, 7705708, -9542880, --7563438, -9667971, 2577517, -5473399, -7941395, -1952600, 7928510, -3300682, 2566780, 4511327, --3025805, -4343823, 625992, 709743, 2849711, 498216, -2095407, -214748, 10191421, 4292283, --3691525, -12279848, -9561134, 3859028, 12186970, 10210211, -7163469, 669478, -4236985, 2711735, --3429532, 5726265, -9710384, -1726577, -12060805, -3621194, 1836635, 4146254, -11013370, -2840047, -7579544, -1014149, -11048266, 5615133, -3547106, -6445672, 3440269, 5662915, 1276142, 1066763, -1949378, 7416872, -3659849, -3320010, 1903207, -3940633, -2007360, -97711, -534723, 40802, -5949604, 2891050, -846645, -770410, 3391414, 1236414, 4183298, -647466, 4726075, 4926328, -1861332, -5986648, 584652, -1112933, -4305705, 5143224, -3389266, 1943473, -4069482, -1750199, --13873281, 850404, 10616622, 562104, 11275363, -2586107, -3068217, -12481712, 13627931, 6169184, -7507066, 808528, 6001143, -614717, -708133, 4924717, -3951370, 1372779, -856846, -14155675, -2132988, -3904125, 2428804, -2878702, 1814087, 11451457, 1825898, -15932718, -117038, 11295764, --2160906, 6532109, -7052873, -5523328, -13017509, 7290170, 4391604, 8529268, 4576825, -4758287, -7923678, -2263448, 7604240, -5089536, -3943854, 186831, -1172526, 5865315, 1741609, 4895189, -6305012, -3858491, -2552284, -2415382, 4311074, -1132261, -2039573, 464393, -4823785, 2400887, -2331094, -3102040, 4372814, 6546067, -2277407, -3428458, -354872, -5493800, -2041720, 7586523, -1554241, -5185100, 10077067, -10839424, 2159832, 5361193, -1921461, -3755412, -277562, 4225711, --7543573, 3757560, -2758980, -7182796, -4665945, -4445828, 671089, -2242510, -3879429, 1629940, -12439299, 6295349, -1075889, -4378719, -10963978, 912681, 6969658, -4097936, -12141336, -73014, --1370632, 65498, 2291365, 4653597, 5291937, -2390149, 1445257, 7538742, 635118, 8858907, -9852118, 21573084, 14925011, 8981313, -2139968, -11540040, -3832185, 10453950, 4722317, -11129334, -8454106, -1970853, -5307506, -6808060, 1210644, 18711026, -12486007, 13538274, 5498095, -2909840, -4668093, -3640522, 9918690, -3688303, 5353140, 1065689, -6483790, -4650376, -6303938, 326954, -5798206, -1510218, -3432216, 3679713, 730681, -993211, -12391518, 3979287, -6813966, -5205501, -3783866, 8537321, -5871757, -8670465, 616328, 7774965, 927176, -4799089, -1577864, -2718714, -3750043, 2835752, -2600603, -4419522, -6878927, 4857071, 11842299, 7524246, 3940096, -6184216, -3747359, 7872675, -7953206, -10061498, 2053531, -8120710, -4159676, -16533477, 54224, -11076184, -23852638, 382252, -9118216, 10302553, -11263552, 13086228, 1240172, -8187819, -13623636, -3470334, -6946036, -11089606, 9915469, -1668595, 6460705, 7366943, -6227166, -2770791, -3668976, -5204964, --1791538, -4860829, 996432, -5913633, 6276558, 3767223, 5304285, 10282152, 5533529, -1590212, -12547210, 6249178, 2495913, -6645388, -6998113, 3686693, -5302674, 1270774, 4124242, -8222178, -7281044, 18820546, 1664837, 13411035, 6561100, 6531572, 9779104, 641561, 5297306, 5448166, --11921219, -8118562, 8637179, 719944, 8167954, 1598802, 8564702, -1122060, 3242700, 2327872, --17172890, -846645, 4731444, 12008729, 2857764, 10630581, 1292785, -1941862, 3604551, 5131412, --9539659, -15911780, -8507793, 2997350, 4224101, 1354525, 11479911, 4630512, -11056856, -1415729, --9792525, -5228586, 4753455, -5589900, 2754148, 3083250, -5675263, -15651398, 5362267, -15507516, --16889958, 3369402, -8051990, 7266011, 11429982, -3197603, 13262859, -3486977, 13117904, 16779364, -550830, 616328, -16809966, -3677566, 2434173, 2571075, -1462973, -11828340, 1373853, -10078678, -1822677, -3010772, 3237332, -4119948, -5798206, 1051730, -514859, -3941169, 4712653, -3758, --1987496, 11996381, 5284421, 8899172, -5192616, 1295470, -4249334, 3121904, -373125, 4447439, --877247, -4122632, -3973919, -11431055, -5665599, 17251810, 8016020, 11274289, -12716324, 2375117, -10969346, -9070434, 1035087, 6043019, -2558190, 6039798, 1986959, -12457553, -2001455, -18910204, --1163936, 6649146, 4809827, 11294690, -10687489, -10626823, -10106595, -16142098, 11140608, 6250788, -1469416, -11093364, 9961640, -740882, -12705050, -11469173, -3288334, -3383361, -7983271, -4043712, --4555350, -4983773, -2681133, -12964359, 6544994, 6371584, -211527, -1939715, -1813550, -5339181, --14094472, -16672526, 883153, 5982353, -3784940, -10654740, -5085778, 6473053, 5837398, -617402, --2668785, -5200132, -3863323, 8327942, -4398584, 5499706, -4140349, -944356, -15387257, -4623533, --854699, 10664404, 3669513, -4087735, -8457864, -7530152, -11984569, 18592914, -8762807, 17503066, -2902861, -9813463, 13066901, 10632192, 21922586, -22799298, 9304510, 1471026, 3545496, -6367289, --5175973, 6800007, 5805722, -4390531, -8567386, 7639673, -4087735, 7672959, 12035035, 3554086, --4313221, 5134634, 16377247, -27824408, -31216896, -18587544, -3885335, -12794708, 7521562, -10439455, -423591, 6029061, -1547799, 20644298, 13757317, 5638755, -6663642, -4003447, 13302051, -1896228, -1380295, -5330592, -13392245, 452582, 4249870, 3764002, -7771207, 6460705, -9127, -476741, -11033234, 16747688, 258235, -10217727, -5466957, -19894826, -8774618, -4983773, -7038378, 1101122, -2515777, -7169911, -3964792, -10129143, 9984188, 13328894, 9959492, 12407087, 8616241, 16178605, -845035, 5492190, 2674691, -3061775, 5041218, 9465571, -10916196, -33726768, -9059160, 10781979, --18645526, 8411693, 9593883, 3417720, -6657200, 176631, -5593121, -14254996, -5130876, 7746511, --12271258, -10336913, 1658394, -8942659, 20166482, 20157356, -9888088, 26321170, -21997748, -1437203, -4895189, -23023710, -5499706, -10313827, 4311611, -7748658, 20096152, 1418413, 759672, 22793928, --352724, -22199612, -15948824, -11449309, 9167071, -2322504, -19487878, 4145180, 6708739, 9648644, --11183021, 5055714, 11376831, 7872138, 8262980, -3665218, 13409425, 12202002, 5551782, -31032212, -22841172, -11919071, 9446781, -3416110, -2040110, 4451197, -12148315, -8841727, 15103252, -7728257, --733903, 11337103, -13075491, 11379516, -3800509, 10433549, -14477798, 19407346, -8099235, 30775052, --3020436, 486405, 9539122, -8739185, -4022237, -5587753, 3955128, -3396246, -14858439, -22237194, --4181151, 9901510, -4567161, -9495636, -19121194, 7316477, 3980898, -30916248, 1675574, -2488397, -6700149, 11124502, -6556805, 9706626, 32529546, 14999636, -8860518, 21027086, 7991324, -14802605, -6167573, 13271986, -1399623, -5674726, -18700824, -6160057, 12796318, 6959995, 6494528, 2628520, --2739116, -8744553, -17617956, 8844411, -5496485, 3912178, -13347148, -8632884, 424128, -3187403, -18864570, 4412005, 3666828, 12780212, 7438347, -22048752, -1652489, 6528887, -3121904, -734976, -18685256, 4669167, 21574158, -13334800, -6774237, -4712653, -6880001, 6776385, -7187628, 14199699, -16460999, -8337606, -14265734, 23885386, -12134356, -6954626, -2045478, 5816997, 4933307, -16086800, --3126736, 7063611, -5574331, 9336185, -4190814, 13939853, -7118372, 1044214, 26473642, -3467112, -19265076, 27076548, 5754720, 10965052, -5509370, -41586556, -22146998, -11431055, 1833951, 9121437, --41660644, -9674951, 42950208, -16385837, -18851686, 38363184, -24832964, 21674552, 28387586, 11498701, -3562139, -21726092, 7941395, -38219840, -19314468, 8440148, 19443316, 2284386, 4094715, 14522358, -38218228, 26168698, 7628399, 1393717, -632971, 4230006, 2580202, -15147276, -333397, 9446244, -11433203, 51533700, 28420336, 19717658, 36574868, 15013058, -6153078, 10936597, -1554241, 35453344, -12052215, -3285650, -6912750, 14539538, -3304441, 16707960, -54400056, 1794223, 17238924, -1669132, -21029770, -8944806, 4592931, 11143293, -51034948, -19971598, -5371931, -16775069, -22175990, -25227028, -20946556, -15939697, 2603287, -5801964, 20633022, -38773892, -12666395, -6986301, 8915278, -2276870, --6766184, 24824910, 43823160, -3958349, 9276056, -15131170, -5906654, 20311438, 21919902, -20780126, --63768452, -14108431, 29155312, 3923453, -5214627, -7537668, 4187056, -11459510, -9951976, 12161737, -12988518, 27576374, 13059385, 15598784, -4597763, 37436008, 9380745, 22810572, -1367947, 34285652, --11755862, 21432960, -21113522, -2361695, 4839892, 14516453, -4460324, -15420006, -28571196, 14512158, -4613332, 790811, -12545599, -30489436, 730681, 374736, -934155, 5588826, 20376936, -273267, -15357729, 42526080, -16502338, 1443109, -12253005, 20317880, 23280334, -26181584, 24563992, 21209622, --14503568, 2695629, 9060770, 13365401, 11877195, 30815854, 14589467, -16388521, 5999533, 40527312, -18447422, -55876988, 19765440, 4219269, -38981660, -17696340, -8305393, -37248104, 9035001, 12190191, -29326036, -21314848, 48659296, -40586904, 32833414, 71673880, 4448513, -39407936, 61197380, -13613973, --1290638, 9020505, 34489660, -19859392, 1038845, 70104600, -35151088, 16829292, 23025320, 22762790, --31565862, -2979097, 4947803, -15059766, 1999844, 7402913, -13297219, 12510166, -22112102, -5973226, --9349607, -1542967, -13677323, -11169062, -5048734, 6782290, -24273008, -21747030, 31723166, 5974837, --21619254, -5356898, 18304614, 47301012, -5382668, -23054310, 23324894, 36265632, -11981885, -2700461, --606664, 13120051, -1564442, 21475, 14700599, -40074192, 25552908, -23124640, -1792075, -32770064, -16124381, -2570001, -51392504, 24153822, -6176700, -18922552, 30082488, 3908957, 29417842, -27571006, --14153528, -11085847, -29520920, -39539468, -56872348, 44641352, 13276281, 32871532, 24970402, -83752, --10754598, 37688876, -14851997, 10384694, 9831180, -41316512, 36961952, 11461120, -9540733, 29808146, -3339337, 813359, 15870441, -14777372, 40249748, -33127082, -16393353, 13368086, 14209899, 5299990, --29020558, -19479824, -32442036, 16667694, 4820564, 15042049, 427349, 16221018, 7560216, 4288525, -1024887, 13479218, -6607807, 6579353, -14844481, 9427453, -13755707, -2048163, -18262738, -15047418, -823560, -18404472, 7654169, 36828272, 9252970, -31412854, 15114527, 9432285, 20477330, -1794223, -34106336, -31998580, 4191888, 11136850, -28893856, -9331890, 57003880, 29557428, -76669464, -35256848, -39788576, -14163192, -36908264, 10934987, -4644471, -31384936, 19311784, 30791158, -48245904, 5095442, -40036076, -32911260, -27360016, 28703804, 2029909, -32854352, 30849140, -69800736, -7910793, -10036802, --83419000, -11615202, -27593018, 10768020, 11195906, 26757646, -13313325, -28577638, -14538464, -42497092, -3462281, 19223200, 6802692, 10208600, -39127152, 25448754, 989453, -40853728, 29526826, -44125956, --21850646, -14577656, 10300942, 37351720, 37129992, -27917, -11410117, -73156712, 30346092, 80700288, -25748866, 5144297, -44965624, -58880780, -28029494, -1785096, 30113090, -35483408, -25733834, -36483600, --15186467, 75958104, 75535592, -9836549, -38338488, -27137750, -18890876, -4316442, 36863168, -14645302, -9350681, 12310450, 23716810, -2929705, -20007568, -41130216, -22166864, 73904040, 27264452, 50901268, --44797044, -18495740, -22120692, 52425444, -1631551, -71095664, -76762336, 47587700, 68295352, 126617784, -17081084, -93201864, 9834938, -9425843, -35230008, 29841970, -31285078, -8602283, 2618320, 6777459, --4783520, 5907191, 14090177, -22632330, -16755204, -1966021, 6129992, 11953431, -13928579, 549219, -12975096, -10671920, 8573828, -6341519, 36974300, -2172717, -4119411, 18829136, 12490302, 16522739, --7978976, 9911174, -2476586, -2244121, 16251083, 8910983, 3709241, 2683281, 21470004, -20742544, --4524748, 165893, 28529320, -2327872, -4993973, 23518704, -5310190, -13013214, -9860708, 19086298, --3861176, 7174206, 6769406, 1132798, -6279779, 1665374, 9332427, 730144, 24911884, 9585830, -7864085, -12604655, -459562, 6715718, -15903190, 3676492, 7534983, 15002321, 1289564, -4733591, -10946261, -596464, -18748606, 19237696, 7697655, -8392903, 19242528, -16128676, -914828, -13819057, --7582765, 6757594, 57184804, 4913980, -21501680, -17287780, 2589865, 13297756, -1049046, 12174622, --4759898, -2856690, -16172699, -3175055, -11385958, 18078054, -11314018, -558346, -7212324, -2952253, --4305705, 2305861, -11974369, 2180770, -5252745, -7929584, 2280628, -935766, 521302, -1854352, -4020090, 2405719, -9982041, -5926518, -112206, -6271189, -5909875, 5315022, -1674500, -9650792, -607738, -5170604, 4250944, -14449881, 7410429, -6027450, -11317239, 3884798, -5179731, -5406290, -1545651, 358093, 736587, -2020782, 2551211, -4096862, 5106716, -2669322, 621697, 8756901, --5886253, 3236258, -1450625, -438087, 2415382, -6434935, 6420976, -6804839, 6439767, -1123671, --61740, -4282620, 6183679, -6677064, 831076, 2535105, -8554501, 8676908, -4320737, -27081380, --45240500, 47907676, 163869648, 32117228, 48748416, -100729328, -141508432, -58276264, -74418360, 57521424, -131404528, 76488000, 50305880, 5655398, -73475616, -63890860, -65136936, -25817048, 35844188, 31711354, -32593970, 30465276, -1734093, -4335770, -8388071, -9878962, -16035260, -1569274, 19426674, -1308354, --12519293, -4124242, -17751100, -9069360, -3764539, -3761855, 31585190, 30579630, 16981226, 19563576, -118648, -22992570, -24749750, -43387224, -30072288, 4407174, 2649995, 9312563, 24894168, 37159520, -21117818, 18869938, -1850594, -20535312, -30039538, -24758876, -22081500, 3252901, 6372121, 13687524, -8145943, 6349573, 112743, -7495255, 1671816, 758062, 1774358, 18221398, -3234110, 7907035, -6639483, -13961865, -27626304, -27039504, -26032334, 5912023, 14761803, 5912560, 384936, 0, -0, 0, 0, }, -}, -{ -{ --4326643, --3154117, 690416, -2771328, -1715839, -1253594, -353261, -445066, -1789391, -5367636, -3997541, --2841658, -1395864, -3881040, 1618666, -900333, 638876, -1604707, -575526, -2429341, 2540473, -501437, -1779727, -3200288, 312996, 3591667, 1978906, -3655017, -3510062, 656056, 300111, -410706, -2443837, 530428, -883690, -1581085, -469225, -1490354, -2250563, -1051730, -3828963, -4952098, 1385664, 3439195, -3332895, -5646809, -444529, 726386, -625992, -5243618, 306016, --1304060, 3092913, 2091112, 2322504, 5333276, -921807, -187905, -1628330, -805306, 1934883, --3631395, 4267050, 5105106, -2404645, -1676111, -4257387, -2229088, 862752, -1294933, -2566780, -281857, -2709588, -1395864, -3434363, -2870112, -3156801, 2104534, 6383395, 455267, 4291209, --1053878, -557272, -2368675, 4565014, 2754685, -2595771, -3593814, 2321967, -995359, -5324149, --6333466, 1521492, 193810, -2057289, -2243584, -4147865, 2546916, -4888747, 1125818, -448824, -974958, 441308, 906775, -2180233, -479963, 906775, 1250909, -474057, 1558536, 1295470, --2371359, 1677722, -1518271, -4172561, 5760088, -1117765, 53687, 1449552, -979789, 3319473, -3961034, -874026, 1317481, 3191698, -13422, -3326452, -2867965, 874563, 1680943, -984084, -749472, 3918084, -3788698, -3038689, 2822331, 659814, -1718524, -2029372, -572841, 795643, -1913945, -3847754, 1330366, 1078574, -3729105, -3206730, 2043868, -1678259, -4968741, -1581085, --1531693, 6293738, 5272609, -7813620, -3304441, -5403606, 3563212, -2643552, -3582540, -2507724, --3205119, -689879, 1262184, 5833640, 1074279, -3175055, 5019743, 158914, 5174899, -4943508, -7981123, 3643206, 8653822, -1568200, -2853469, -615254, -4653597, -424128, -264141, -1731409, -1680406, 142271, -3675418, -923418, 64961, 1151588, 3805878, 852551, -5527086, -4676146, --1687922, 3151432, 295816, 158377, -2754685, 4678830, -36507, 353798, -1921461, 611496, --1121523, 2472291, -696322, 7813083, 166967, -994822, 3055332, -1931125, -3397319, -1408749, -2748242, 4747550, 893890, 2933463, 826781, 549219, -2350421, -2343979, -3833795, -93416, --3972308, 1116692, 3489661, 3685082, 2665564, -1132261, -1646046, 3390877, 5618354, 5676873, -3284576, -192200, 4967130, -2788508, -3900904, 3762391, 4293894, 5023501, 7869991, 523986, --4753992, 2641942, -4531728, -524523, 1714229, 909996, 8726837, 460098, -6774774, -542240, -1366337, 2675765, -370978, -2581812, -7486128, -1736777, 6577743, 1984275, 4362613, 4718022, -4246112, 886374, -613107, 4145180, -5549635, -460098, -3744138, 10015864, -463320, -22012, -4683662, -4149475, -512175, 1275068, -491774, 5798743, -865973, 1488743, 5968931, -1532230, -1926293, 83215, -206158, -484794, -695785, -2151242, 2623151, 2942053, -747324, 2899103, -1322313, 6196027, 7777649, -979789, 2148558, 659814, -3783866, 3150359, -839129, -3960497, -1482838, 2962454, 1202591, -1854889, 8439611, 8529268, -3437585, -4677757, -4333085, -2755759, -2028298, -9052717, -1018444, 1399086, -4516695, -8006893, 7776039, -1582696, -2103997, 1386201, -3525095, 3362423, -4140885, -1484448, -271120, -323196, 1794223, 2893734, -1631551, 3531000, --2658585, 5352066, -721555, 319975, -2773475, 2873333, 935229, -696858, -2757369, 1367947, --1598265, -2246268, -2041720, 558883, 1655173, -4871567, 357556, -9274445, -5473399, 3441880, --1468879, 1188095, 2033667, 6223945, -2035278, -3048890, -262530, 241592, 2550137, 2529199, --2921115, -1244467, 6773164, 270046, 1012539, 572841, 3007551, -5701569, 177167, 2825552, -5280126, 1031329, 2270964, 7927973, -1973001, -917512, -4336307, -164819, 1371705, 2499671, --5361193, -8586713, 3718905, -2863133, 235686, -4471061, 3467649, -9917616, -7998840, -9365176, --3059627, -2071248, -6411313, 3188476, 8904004, -6637872, 1411971, 10271414, -2365990, -2967823, --4749160, 706522, 1611, 4461398, 1529545, 3158949, 2339684, -3544422, -6592775, -3312494, -3951907, -2416993, -4038880, 834297, 1664300, 1103807, 828392, 8844411, -4287988, 4711579, --2379412, 2247342, -2661806, 7291781, -5638219, 2823941, -500901, -4737349, 4125853, -1937030, --1532230, 4198868, 2331094, -692564, -2046552, 3757560, 1941862, -4540854, -5107253, 3083250, -5481989, 2749316, 38655, -2829847, 186294, 3115999, -1632625, 3827890, -1115618, -9230958, -170725, -4361540, 12349642, 3801046, -7107097, -4466766, -994822, 39728, 3587372, -7589744, --8516920, 7243463, -1286343, -7580618, 938450, -2243584, 7712151, 3274913, -1563905, 961536, --61203, -1528472, -1022202, 8144332, 1968169, 9127, -5583458, -3143916, -1106491, 2528662, -4023311, 11057930, 529355, -130460, -127238, 259309, -4866735, -314606, 2298881, -6878390, --4275103, -4671314, -347355, 7844758, -6713571, 550293, 3995930, 1029182, -3088082, 2851858, --8465917, 6322192, -1427540, -712965, 3878356, -5077188, -5028333, -8647380, 1702418, -3379066, -7473780, 1758252, 172872, 548682, 2234457, 4939750, -2650532, -2249489, 6023155, -2269890, --3609383, -1202591, 5961415, 5054640, 5456756, 1827509, -4012036, 2284386, 4811437, -7547868, -7352984, -6482180, -4917201, 4703526, -16230145, -10058277, 2429878, 5478231, 10462003, -6215892, -5444408, 1475321, 5756330, 81068, -3223910, -3326989, 3420942, 11625403, 591095, -584116, --11065446, -8559870, -292058, -6183679, -4220342, 788127, 1010391, -6345814, -2355253, 2045478, -3636227, 2523830, -4690105, 396211, 4723927, 4514011, 543313, -3731253, 464393, -2123325, -927713, 1824824, 2027761, -2779381, 3727495, 10188199, -1258425, -321049, 1645509, -5045513, -2334315, 8278550, -7988103, -8755828, -4946729, 1155346, -12048994, 687732, 165893, 2042794, --36507, 207232, -5756330, -2660732, -3754338, -135291, 8002061, 12259447, 312459, 1119376, -5833103, -2119566, -914291, 2983929, 13554917, 1940252, 5071820, 9587978, 2117419, -6078453, -3155727, 8653822, 4621385, -7028177, -818728, 16684874, 13802951, 3542274, 8133595, 11191611, -2207613, 382789, 6519224, -2622615, -402653, -5803575, 4714801, 121870, -222265, 2904472, -2283849, 9368397, -7900593, -6188511, 6240051, 1963337, 2582349, -4685810, 460098, -1241782, -2961917, 667331, 4352950, 5400385, -5368172, 4682588, 2856153, -4931160, 13810467, 3178813, -2252710, -10434623, -4119411, -186294, 8731132, 9392557, -1462973, -8796630, 5639829, -7525320, --3195456, 8078297, -848793, -5050882, 6440841, 9800042, -2961917, 3923453, -4312147, -11553462, --682363, 9039832, -4486094, -3200825, 4434554, -4844723, -10016937, 3520800, 5213554, 12642773, -4858145, -6893960, 2395518, -8128226, -12927852, 12965969, 3749507, 6914361, 17204566, 10358387, --6838125, -2385854, 175020, 2555506, 2834142, -1428077, -6078453, 1235340, -3999152, 6639483, -732829, 2361695, -1751273, -1354525, -6297496, -3947612, 14994805, 4479114, -8211441, 3886946, --7988639, -6334540, -12817256, 5593121, 870805, -29528, 3852586, -598611, -5404680, 9922448, -6513318, -2437394, -9473624, 10040560, -6245956, 2525978, 529355, 3192235, 2842732, 6356552, -8351564, -1877975, 5039608, 11768210, 2448131, -3821447, -2437931, -2178622, 2848637, 7874286, --1132261, 3187940, 1720134, -7277822, 1427003, -1775969, 4750234, -10887205, 1087164, -18145700, --9701794, -10056666, -1149441, -9893994, 8268349, -2308545, -6691559, -1967095, 813359, -6367826, --1025423, 287226, 2768643, -3136937, -6251325, -11173894, -14638859, -6475200, -9843528, 25006910, --12280385, 5895917, -11623255, -2961380, 884763, -1556389, -17191680, -88584, -8344585, 851477, -19536732, -6119255, 7994545, 11164767, 3600256, 4661114, 11591043, 3757560, -5021354, 3583613, -4310000, 5215164, 1756642, -2328946, 13518410, 670015, -1517197, -2208150, 3365107, -1083406, --5255430, 4793721, -2212982, 3443490, -13901735, 608812, -3038689, 12215961, -5252208, 3936338, -17830556, -1613297, -70867, -4507568, -8013872, -506806, -1705102, -7831873, 9238475, -2224256, -6568079, 582505, 6170795, -4061965, -1206349, 14371497, 6653978, -11628624, -6441914, 2765422, -3002719, 1358820, 2594160, -3752728, 3599183, 4853850, 11578695, -16179142, 343597, -7379291, -2543695, -1324461, -2458869, -3385508, -8622684, -6808060, -8344048, 9065065, -16994648, -4346507, --10800232, 5708012, 16747151, -8782134, 103616, 1062468, -3751117, 7206419, -5901285, 3262565, --2078764, -6451578, 14958834, 1392106, -5329518, 862215, -2562485, -6117107, 5034776, -4518843, -4721780, -9007620, -4784057, 7238094, 4537633, -15478525, -3154117, -13057237, 3880503, -1561221, --13475460, 16935592, -4716411, 468151, -12446278, -12653511, 628139, -11308112, -1719061, -9635222, --9061307, 11457899, 1082332, -12737799, 4412542, -11278047, 10844256, 4887673, -5278515, 1405528, -3526168, 12454868, -8777303, -11444477, 12766253, -7727720, -4884989, 7796440, 9770514, -16513612, --8438000, 11355894, 7868380, 5233955, -442919, 2578591, -12103218, 8652748, -13242995, -21009370, --17374216, 7925826, -20733954, -796180, 15263777, -1188095, 846645, 11317776, -7670275, -6132140, -24391656, -9612674, 5483063, 9539122, -2040110, -22228604, -2165737, 2488934, -5935645, -2981244, --5523328, 20979304, -124554, 332860, -1358820, -14950244, 2414309, -8585103, -4694400, 994285, -2163590, 4499515, 11762842, 2721936, -3488050, 23862302, 2139968, -5899675, -22184042, -3201361, -15612743, -3508988, -10397579, -13476534, -12218108, -10170483, -6756521, 16865262, 6183679, 854162, -9008157, 14025216, 7474854, -3261491, -2924336, 14445049, -3340411, -4729296, 3795141, 10929618, -1121523, -11824582, 2155537, -1520418, -17721572, -1709934, 13149042, -7250442, -8499203, -2458869, -17751100, -15231565, -3744138, -8268886, 17121888, 1996086, -15733539, -312459, 4436165, -288300, --7272990, 7013145, -5422396, 14099304, -10801306, 9791989, 20568062, -5294084, -5681168, -4559645, --4459787, 18852758, -13853417, -14728517, -11626476, 4562329, -6111202, -9334038, -4561792, 7035157, --9388799, 5543192, 1149441, 7670275, 10726144, 1745367, -1423245, -1640678, 10597832, -2298344, -3737159, -12577812, -122407, -4177930, 10371272, -13372918, 11390790, -4299263, -7103339, 11943767, -19883552, -10644540, 5705864, -1947231, 4097936, -29259464, -23527830, -13792751, 2166811, -8547522, -4039417, 1518808, -10937671, -8188892, 1101659, 24293408, 5749888, -14247480, -21955872, -11135776, --7992398, 15062450, -9901510, -13938243, 3642669, 3557307, -13123809, -589484, 6979, -6690486, -3687766, 29661582, 19683836, -5338108, 2111513, 19082002, -7501698, 408559, 8396124, 20635708, -12343736, -3939022, -4605816, -7545184, 1912334, -4318590, 330712, 173409, 22000970, 36049272, --2180233, 24732032, 15795279, 2836826, 3836480, -18342194, -17900886, -2470680, 4539781, -1749125, -4156455, -7169911, -13539884, -22945862, -2206003, -14959371, -12531104, -8623221, -13002477, -9631464, --898722, 20281910, -1109712, -16395501, -1828046, 3915400, 14924474, -5457293, -4532264, -10056129, -6357626, -28986734, -26221312, -12890271, -13514651, -14256607, -9141301, 8417062, -12421045, -16519518, --14411226, -24387362, 11060615, 5939403, -22366042, 10285910, 20010790, 41363220, 21642340, -656593, -6095633, -24311126, -11458436, 13065827, 9459129, -5301064, -31964220, -1854889, 48485348, -2574833, -637266, 13422847, -19305878, 11177116, 33972116, 33469606, -34047280, -30477624, -1280437, -33168958, --14213657, 864899, 2612951, 13334800, 17381732, 17397302, 27838904, 7745437, 10101226, 12461311, --6371584, -1287417, 1722282, 4630512, 7143605, -14920716, 33605436, 15795279, 14855755, -2353642, -34097744, 5105106, 19903952, 9567040, 5105106, -7765301, -7102266, 18796388, 5316633, 9041443, --20870856, -9689446, -17734994, -8805220, -13396540, 461709, -24982214, -24708946, -3274913, -9234180, --49364744, -34934192, -33880848, 9576703, 32806034, 45302780, -26644904, 31357556, 46268072, 8627516, -2239826, -2631741, 31333398, 2999498, 28265716, 13440563, 12499429, -19236622, -67281200, -51207820, --12307766, 439160, -4864051, 25325274, -6584185, -42319924, -5140002, 70458936, 11323681, -11801496, -16489990, -4583804, 10218264, -4431870, -8960376, -21728776, -10066866, -1428614, -5340792, -9898826, -14824616, -13809394, -17504140, -128849, 901943, 15446313, 4845260, 4893042, 4468914, -5055714, --1638530, 22501870, -12882754, -25026774, -7032472, 3027952, -10633802, 18756122, -11395085, -5393942, -13173202, 4912369, 9391483, -26089242, -32200980, 10546292, -8016020, -9720048, -15161771, -15427523, --35465156, 485868, -5360656, 11382200, -23744726, -43924632, 30438970, 9299141, 28332288, 3569118, --12955232, -9361955, 5029944, -16751446, 22550188, 4879083, 27507654, 21176336, 42267312, -5215164, --48172352, -35322884, -23926726, 23900420, 20608864, -21805012, 14681272, 35783520, -29113972, -37147172, -38476464, 50758996, 9535901, 1687385, 11984032, -8504035, 22972706, 11868605, 23964844, -5437966, --24239184, 54287312, 806917, -21383568, 3013457, 36457828, 17474612, 6555731, -23132694, 1808718, --12209518, -9966472, 4067334, -18291192, 1837172, 3943854, 21466246, -30790620, -4804458, -4383551, -18127446, -7579544, -10839424, -11344619, 74625, 10586021, -23153094, 907849, 6300717, -48536888, -6698002, -13727789, -33573224, 21347598, -24831354, -44394392, 57607324, -1203128, 3292629, -5279052, --16112033, 34055332, -24730422, -2983929, 4985920, -16496433, -1546188, 43365748, 22407382, -39240968, --42306500, 40975600, -20188494, 23848880, 39177080, -35700304, -61954368, -42264624, 70080984, -3630858, --56396680, 51933132, -38074348, -68276024, -2396592, 63445256, -3219615, -22526566, 35526896, -5509906, -9244380, 26124138, 15031312, 20288888, 42145440, 21230560, -13131326, 9047349, 8676908, 16513076, --18349174, 44710608, 38029252, 7647726, 11647414, -7821136, -2360085, -41515152, 17667348, -20941186, -13147432, 300111, -18409304, 25705916, -11817066, -15509664, 7012071, -22750978, 14053133, 2870112, --7227893, 9069360, 7796977, 17680770, 13266617, 17325898, 42591044, -2120103, 2299418, 16653736, -27777700, -558346, 5389647, 2620467, 21061446, 30845918, -12001749, 9489730, -4100083, -1807108, --54524072, 7072738, 19050328, -9245454, -15656230, 14729053, -24609626, -28483686, -326954, 21984864, -34861176, -44802416, 15355045, 2180770, -4919348, 5591511, 15406048, 47440060, -3367254, -21990770, -5087389, 44297756, 23466090, -44339096, -34619048, -549219, -53385368, -18246094, -19746650, 41193568, --1171452, -15111842, 18953690, -9590662, 10546829, 2799782, -20286204, 24452860, -54895588, -5096516, -3483219, -13625247, 10314901, 2590402, -10530723, -1819456, 1855963, 14002667, 1109712, -15982110, --53061636, -38778184, -29298656, -14596446, 33495376, -6548215, 1703491, -53291956, 4519380, -3563749, --6665253, 1847373, -51037632, 27837830, -24375014, 12898324, -9474698, 35360464, -18331994, -33914136, --15410343, -121333, 26622892, 46716360, 50116900, -60153700, -43282532, -30612380, 22339736, 49780280, -61731564, -10239202, -13091060, -52564496, -17331266, 47299936, 31339840, -229781, 3078418, -714038, --40962712, 30363808, -4472672, 29457034, 75491568, -77176808, 102184792, 27326192, -40305048, -44378288, -36662376, -21905406, 22435836, 12211666, 14058502, 8639327, -28771986, 31398896, -4904316, -10879689, --10492605, -12091407, 9280887, -6226092, 13321378, 8339216, -2032593, -2995203, -24093156, 14127758, -5410048, -5850819, 5078799, 12856985, -3808026, 7421167, -12332999, 14601815, -5539434, 2128156, -5624797, 6382322, -6558415, 22365506, -1033477, -20435992, -1536525, 9874130, 4574140, -15556372, -7584376, 18785650, -3584687, -8661338, -8854075, -900333, 5019743, -1926293, 21657910, -14285061, --5597953, -4877472, -10875394, -622233, -3257733, 8247948, 5874442, -8688719, -1168768, 8605504, --8509404, -4275640, -2254321, 13609678, -7793218, 5880347, 9715216, -20775830, -7378754, 6484327, --20199768, 32344862, 11212549, 9054865, 19843822, 51882132, 6342056, -17064442, -13917305, -9760313, --1340030, -1247151, 780610, -982474, -2332704, -28693066, 300111, -5355824, -7051800, 4152160, --11755325, -4721243, 4992363, -7493108, 1966558, 9533217, -12513924, 8209830, -4810900, -5960878, --1316408, -5946919, 2758980, -5465346, -3474092, -6522445, -1642825, 483184, -416612, -3653944, --4670777, 1967095, 2085207, -4449049, 6663642, -7822209, -977642, -2697776, -1300838, -882079, --6951405, 9972377, 5457830, -8498667, 11065983, -352187, 2205466, -4267050, 10618233, -9947681, -621160, 1823214, 2669322, -850404, -2985002, 9050033, -5537824, 2230699, 246424, -555125, -2401424, -2357937, -660888, 5738613, -2426657, -733903, 4980552, -549219, -2274185, -3150896, -2643016, 4165045, -24603184, -41523208, 46290084, 153218656, 16207059, 34741992, -83122112, -128543000, --31609348, -67428304, 52617108, 106619344, 57036628, 35136052, -7486665, -42201812, -40380744, -31390306, --28053652, 9586904, 18800682, 9947144, 20191178, 1969779, 2073932, 7128572, 2723009, 8169565, -7520488, -5912023, -19109384, -15168214, -16792248, -24001888, -11845520, 12440373, 17423608, 30782568, -44944148, 15393163, 6885907, -15526307, -34828964, -34896072, -23405424, -17328046, 3810710, 12332462, -19291382, 19312858, 17380122, 10596221, 1717450, -2227478, -10838887, -8668318, -4594005, -6570763, --1852205, -7347616, -1513439, -8580271, -7058242, 1584306, -341987, 8527121, 16221555, 8198556, -23975044, 19763292, -10112500, -22558778, -20933670, -33113660, -8793409, -9854266, -1106491, 13064217, -7633768, -1311576, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, -{ --6125697, -1522566, -2790655, -7104950, -2758980, 654983, -1326071, 2278480, -3286187, -1293859, -2513630, --1180042, 1643362, -267899, -94489, -1381369, 2288144, -5952825, 584116, -3075197, 2193655, -1506997, -3591667, 671089, -427886, 933619, -1331977, 1057099, -3933116, -2491081, 5079336, --1430761, -1890859, -2262911, -654446, -1429687, -512175, -3594351, -411243, 4619774, -987843, -863825, -95026, -1367947, 6444599, -1275605, 3697967, 4507032, -292595, -1640141, -1067836, --3859028, -3624416, -3997004, -4694936, -2481954, -3256659, 890669, -3137474, -907849, -1837709, --270046, 820876, -3737159, 3806415, 811749, 1660542, 3340948, -3020973, 1801202, 3497177, --3479997, 736050, 2767570, 1246077, 1465658, -6023155, 3957276, 6521908, 1672353, 5761162, -65498, -5881958, -4111358, -4276714, -706522, -2928631, 6893960, -5156645, -1357210, -2327336, --870268, -4131759, 3954591, -2426657, -1964411, 3387119, 5529771, 6334003, 923418, -428423, -1261647, 357556, 837519, -2832531, -3129421, 1525787, -2845416, -2769180, -3802120, -3911105, -1134408, -2583423, 3411815, -4320200, -662499, 1935957, 1745904, 1626719, -6813429, -1188632, --3819837, -629750, -1657857, -4087198, -180389, 4921496, 1389959, 2399813, 2145336, 2668249, -220654, 3341485, 1966021, 3726421, -2236067, 2491081, -1365800, 1723893, 35970, -3415036, -3830037, 4537633, -2623151, -3037079, 1117765, 4161823, 742493, 1105417, -1688459, -282931, -1895691, 1427003, -159451, -10110890, -2695092, -4542465, 3326452, -9475235, 2054068, -4157528, --2243047, 1382980, 158914, 1098438, 1392643, 1108102, 4097399, -1796907, 403190, -378494, --5048734, 3740380, 6155225, -4990752, -4751308, 3632469, 896038, 4475893, 1377611, 5998996, --853088, 2054068, -3178276, -909996, 6043556, 536871, -3985730, -4831302, -5302674, 279173, -4344360, 2277407, -54224, 5034239, 3938485, 219580, -4092567, 6426882, 1597728, 4974646, -4960151, -799401, 3150359, 3831111, -482110, 2298881, 2545842, -2389613, 482647, -678605, -2416456, -5495948, -3607236, 1901060, -3490198, -1232656, 4759898, -1833951, 2600066, -1014149, --7555921, 1380832, -71404, 4065187, -6229313, -3222836, 2770791, 802622, 6448357, 6669011, -3034931, 4918812, 3965866, 6685117, 7766375, -2916820, -743566, 2533494, -7595650, -308701, --2443837, -1513976, 3608846, -4517232, -427349, 5640366, 1149978, 3603478, -1698660, -1353452, --1806571, -7256347, -1072131, 460635, 3935801, -1189169, 6694244, 2566243, -1010391, 2607045, -1493038, 3360812, -2307471, -524523, 7816841, -1037772, 7398618, 3396782, -3029563, 758062, -6545530, 3325915, -4046396, 5827197, -1423782, 403190, 484258, -1160715, 1307818, 666794, --5064304, 3384434, 2666638, -421444, 415001, -1134945, -4518306, 54224, 2927020, -484794, --287763, -3128884, -6696928, -2312840, 2928094, 5983427, -8555038, -4609574, 2079838, -3696893, -2771328, 100395, 571768, -4893579, 9466645, 9973988, -1957431, -4238059, -4541391, 9563818, --8287677, 189515, -1314797, -3922379, -5230734, 1840394, -1404991, -7220377, -8698919, 299574, --613107, -4599373, 1697586, 2394444, -3171833, -4871567, -4478041, 6361384, -6853157, -855772, --8017094, 73551, 4522601, 1510755, 803159, -4533338, -4313758, 3942243, -3023657, -4626217, -599148, -1685238, 2847563, 56371, 1158567, -4600984, -1692217, -1290101, 4424890, 3045132, -3069828, -9097814, 1428614, 2568391, 2057289, 2603824, -2638184, -1618666, 273267, 1900523, -3535295, -561567, 2288144, -2561948, 6918119, -12679817, 4330938, 474057, -6995428, -159451, -7256347, -2113661, -3853123, -6653441, -2745558, 773631, -2495376, 296353, 2212445, 4319664, --4505958, -14098767, 2543158, -6406481, 1378685, 1222455, -851477, 10073846, 522912, -6373732, -8538932, 4176319, 2912525, -1239635, 1746441, -2558727, 6689949, -1061931, 736587, 10177462, -9851044, 4287451, 4496294, 4414690, 4890357, 3350075, -9790378, -2979097, -164283, -2492155, --8338142, -836445, -1999307, -2110977, -4493073, 3758, -1340030, 7245610, -2324651, 12637941, --106837, 1168231, -2354179, -1694902, 62814, -231391, -1036698, -2051384, -1502702, -5989869, -1461363, 1173063, -768262, -2993055, 4254702, 3379066, 3683471, -1080721, -2724620, 323733, -3207267, 3791383, -2855080, -7703024, -4125853, 1236414, 6667400, -491237, 5455682, -3824669, --6307697, 5357435, -2179159, -4333085, 3089155, 4386772, -5557151, -3619584, 5279052, -6244883, --6650757, 3143916, -1852205, -663036, -3461207, -2123861, 3519189, 4794794, 2622078, -1217086, -813359, -672699, -1058173, -4746476, 1633698, -12639552, -3574487, -4097399, 3528316, 4196720, -425202, 2024003, -7747048, 2013803, 1267015, 1997160, -6980396, 13167833, -537945, 2330557, -1807644, -6438156, 1054415, -9175661, 5852430, -2092186, -7483444, 1340030, 641561, -3979824, -477278, 617402, 6029597, 10505490, 4716411, -2411624, 3549791, 4148939, -9904195, -3948686, --4487704, 2476586, 2379949, -1988033, 1686848, 3118683, 2333778, 4086125, 8505109, -238908, --2956548, -1342177, -168041, 6030134, -4495757, -595390, 3328063, 8142721, 427349, -6762426, --5179194, -1584843, -6038187, -2279017, -12999792, -3563212, -4802311, 5565741, 211527, -2671470, --16678432, -2188823, -2199023, 6951405, 16593606, -4728222, 11175505, 1957431, -9710384, -9939091, -1823214, 2604898, -5587216, 6339909, -4381404, 5132486, -6096169, 3104725, 2290828, -5815923, --4820027, -3689914, 2143189, 6592238, -8245801, 441845, -8662412, -359704, -3143916, 2308008, -6729677, 834297, -2531346, -2318746, 7306813, 148713, 11007464, 3461207, -3686156, -3691525, --2724083, 1724966, 7108171, 63888, 11550778, -19586124, -14131516, -11595338, -2226404, -9849971, -1205275, -3557307, 4184909, 9234717, 2272038, 3973382, 6490233, 9778567, 5698348, 1726040, --5660767, -16108275, -16236587, 9558450, 1838246, 12068858, -6899865, -5712307, 7117298, -11788075, -3459596, 8360154, 2915746, -5741835, -685047, 15454366, 12154221, -663036, -11468100, -17971754, --2626909, -5981279, 6089727, -5033165, -5973226, -20422570, -9502078, -18240726, 6392522, -112206, --5094905, 5493800, -1185411, 612570, 826244, -5519033, -2147, -6415071, -1763084, 4693863, -2586644, -6556805, 1999307, 7687992, 11170136, -1282585, -2185065, -3409130, 116501, 6567005, -8081518, -756451, 719407, -1381906, -2057289, 10763725, 6920266, 773631, 7150584, 2704219, --10040560, 2248416, -1535988, 12697534, 4194573, 1988033, 5309117, 8378408, 1577864, -6567005, --12589623, -2358474, 1862942, 6803765, 2629057, 754841, 1837709, 9810242, 1397475, 3350075, -3648575, 2736968, -6867653, -6842420, -6810745, -6980396, -7097434, 9822590, 26246008, 5699959, --8055211, 4629438, -4687420, -15602006, -3132642, -15315853, -8347269, 7807714, 10516227, 3973382, -2166274, 790274, 1943473, 9863392, -7085623, 13990319, -9130027, -9415642, 11253888, 4862977, --18187040, 7800735, 4627291, 5602248, 11964705, 5737540, 8889509, -790811, 4806606, -3044058, -7572564, 1786706, 1590749, 4852240, -10290742, -5775121, -3197603, 6312528, 2791192, 2087891, -5144834, 1237488, 1764158, -9559523, -8053, 9705552, -1916629, 901406, 1131724, 940061, -11833172, 4245575, 15949361, 3326452, -2500745, 14909442, -13423920, -2164127, -2355253, -5745056, --1515050, 2696703, 14833206, 901943, -3653407, -6511171, 2628520, -6875706, -3286187, -4738960, --9124121, -2187212, 1124208, 11897596, -2909304, -10002442, -13974750, -5817533, -13748727, 9718437, --11644730, -9556839, -6619619, 5935645, 16963510, -17187922, -5318244, -19299436, 5953362, 2049773, -2348273, -5948530, 2057826, 20525112, -10437844, -2422899, 8593156, 4883378, 4789426, 6845104, -5559835, -7517267, -11099269, -2773475, -5861020, -9437117, -10182294, -419296, -1874216, 2066953, -14601815, 8220031, -7154879, -4843650, -188442, -4666482, 4115116, 25876642, -8279623, 17848274, -6529961, 2450816, -454193, -3670050, 3909494, -10843719, 5668283, 13683229, 1449015, 1565516, -12395276, 6714108, 5375689, -10507637, 9091372, -6626598, -7626788, -24296630, -6269042, 14266271, --7459822, 2919504, -15174119, 10663867, -4747550, -7770133, 11973295, -17934172, -10146323, 16694538, --10631655, -15522549, 1539746, -10394895, -8083666, -884226, 11839077, -5513665, 20955682, 19891068, -3661460, 6496675, -11659762, 1602560, -9487583, 14976551, -3190624, 4543002, -7300371, -4386772, -2276333, 2180770, -7031399, 11523397, -3460670, 2592550, 3969624, -7237020, 2544768, -9283572, --232465, 5588826, 6176700, 353798, 8249022, 10983305, -1103270, -19963544, -3701188, -5746130, -14134201, -11955578, -15468862, -10555956, -7560753, 2369211, -8920647, -6456947, -4664872, -934155, -2306398, -29248728, 18319646, 14926622, 20928302, -6369437, 3043521, 14714558, -14025216, -12145631, -2113661, 9881109, 5734855, -972810, 2483028, -6746320, -9293235, -10522133, -3714610, 40351756, -2820183, -20587388, -4181151, -10416369, 7362111, 7919383, -13329968, -6106370, -10813117, -22126060, -2230162, -18522046, 9053254, 2587718, -14084272, 7929584, 10041634, 12933220, 4410395, 4963909, --14549202, -543850, -2377265, 13911936, 7250979, 435939, 13917305, 14555644, -1029718, -7183333, -2458332, 18040474, -11005854, -9443022, 10200010, 5054640, -11135240, -2696166, -10198400, 20761336, --16751983, 4948339, 12048994, -6624987, 11201275, 3741990, -3963181, -5266704, -4299263, -8304856, -12824235, 15843061, 4386236, -11793443, 2568927, -13009456, -3667902, 8929774, -180926, -6250788, --3300682, 2599529, -16018081, 967978, -122943, -9684078, 15622407, -13014825, 1053341, -2496987, --7920994, 11359115, 1457605, 6983080, -2588255, -87510, 2189897, -5296232, 8105140, -4541928, -2543158, -4068408, 20269562, 9120900, 20282984, -558883, -13234405, -7516193, 9788767, 12549894, -16070157, -787053, -2286533, 19541028, 10276246, 21851720, 4000762, 597537, -10019622, -5989869, --5484137, 4783520, 4488241, 11124502, -13267691, -474057, -7459822, 6230924, -11379516, 3246459, -14880988, -3593814, 639950, -8755828, 2998961, -8829379, -23767276, 1809255, -2800319, 97174, --10080288, -4094715, 10660646, 17026324, -979789, -8531953, 11841762, 3348464, 3584150, 11068668, -5396627, -8749385, -2402497, 6398965, -280247, 5613523, -8223789, -10128607, 3616363, -9716827, --13763223, -8932458, -15822660, -6008123, 6280316, -15440944, -1227287, -17512730, -5967857, -2839510, -6357089, -20757040, 8140037, -1889249, -10443213, 9698036, -4881231, -594853, 22812182, 21646636, -67646, 32029718, 36687612, 1996086, 11781632, 11346767, -1489817, -26268556, -614180, -909996, --9897215, 7619272, 7045357, -14164802, 7999914, 10284836, 1865090, -3571802, 5699422, -3390340, -18951006, -2903398, -8449274, 450972, 4575214, -1403917, -868120, 46171, -29386704, 9008694, --239444, -20142322, -8054138, 4022237, -1412507, -13533979, 5440113, -16034724, -879931, 2171106, --25894358, -4181151, 12124693, -7928510, 2023467, 17382806, 11120207, 13471702, 4911295, -6539088, --11408507, 13463112, -5501316, 7878044, -10609643, -5402532, 9751723, 15101105, 3507378, 17951890, --9955734, 15647103, -10852309, -14331232, -8898098, 15579994, 17643726, -13569412, 9876277, -38866232, --713501, 12066711, 7198902, -6148246, -11143293, 6325413, -27980638, 1129576, 36884644, -25266218, --1272384, -3113851, 2913599, -10609643, 5586679, -16317118, -14665703, -6186901, -3277060, 2769717, --2940442, 7143068, -10744934, -634581, 24078124, -19938312, -15691126, -5074504, 21195664, 1793686, --24283746, 9735617, -8378945, -11846594, 3519189, 33725692, -18544596, -11933030, 25755308, 17294760, -2611340, -11263552, 1701881, -4834523, -6828461, 6053757, 7501161, -5236102, -19002010, 24668144, -13125420, 3849365, -26220238, -5182952, 9574556, 8451959, -2279554, 13373991, -1175210, 3918084, --5085778, -17385490, 11926587, -12649752, 8296803, 2764885, -13091597, 26370562, 5576478, 18808198, -21133386, 2785286, -27960238, -6297496, 2042257, -12234751, -3976603, 820339, 1343788, 12855374, -26875758, -6376953, 10804527, 1929514, -10687489, -51171852, 2997887, -13054016, 1387811, 26224534, -2075006, -4578435, 4311611, 1399623, -17909476, -18500572, -17424682, -15943992, 20875688, -3859028, -24992414, 2654827, -24385214, -442919, 2246805, 20948166, 3647501, -2923799, -4484483, 6265821, --13316009, -4554276, 22327388, -4241280, -29912836, -22152904, 13073880, -2542084, -6531572, 7170448, --2512556, -14821395, 4192425, 9312026, 20075214, -3745748, -17373142, 606127, -21805548, 8612483, -23881628, -3520263, -30135102, 9727564, -697395, 2021319, 6831683, -9041980, 17992692, 1695438, --12670154, 9913321, -6978248, -3860639, 25924960, -13168907, -4716948, -4208531, 16335908, 6753299, --29040958, 14711874, -23306104, -5716602, -12384001, 2563559, -7151658, -8141111, -1053341, -25713432, -5702643, 41075456, 27654220, 11902965, -20044076, 14993194, 20161650, 28477780, 14606110, 2989834, -1685775, 17711908, 31964758, -7450158, -3103114, 17344152, -34287796, 12393128, 32009318, -6811818, --10032507, 7798587, 25082072, 19247360, -12212203, -22654342, -431107, 11005854, -2873870, 2480881, -1315871, 26039850, -13996762, 16628503, 26427470, -10328859, -1995012, 17784922, -1566053, 62743568, --25192668, 11226508, 44246216, -24843164, 9394167, 2842195, -33552284, -1090922, 7905961, -15360414, -35580044, 2638184, -3155190, 2746632, -12584254, 46911780, 14594836, -37324876, 37963216, -14907831, -3221226, 11363947, 15421617, 24322400, 13801341, -6126771, -21232170, -31126164, -9518721, -12204150, -238908, -9258876, 22233972, -11812234, -18814642, 1631014, 10715943, -48797272, 28614682, 863288, -17478906, 27666568, -45935748, 10206990, 24340116, 5020280, 18289044, -18244484, 20095616, 5352066, --17693654, -86973, -10959146, -34314640, 19157164, 10250476, 31586264, -17503602, -22221088, -8261907, -7832947, -5022965, -37956236, -19285476, 12411919, -3134789, 6347962, -16499117, -4438849, 12592307, --10242423, -5621039, -15810311, -4025458, 6642167, -18366354, 2594697, -39908836, -32048510, 10038949, --33339684, 2921115, -34884800, -24981678, -16407312, 16814796, 34089692, 41060424, -8825084, 18372260, -23124104, 11000485, 10610180, -15552613, 46654620, 46933792, -30438970, 32265404, -23587424, 16689169, -34128348, 32022740, 39517456, 46418396, 33950104, -34428456, -23260470, 1737314, 3800509, 16239271, --4610111, -3490198, 60345364, -44334800, -21859236, 23060216, -13649943, 21966610, -17213692, -20235738, -6954089, -47012176, -1800128, 30455076, -7260642, 15266998, -26356066, -7327751, -10304163, 217433, -33398740, 9166534, 7509214, -6868190, 18332532, 4882841, 45467060, 10131828, 26527328, 789737, --20760798, -20766704, 26362510, -14074608, 12114492, -1547262, -34257732, 23228256, -30583388, 57577256, --44236552, 25331180, 23754928, -26875758, -21573084, -17397302, 21399674, -3485903, 22354768, -2226404, -2456721, -42424612, -22275312, 7179038, -20500416, 4196183, -12842489, 9302362, 5894306, 28238336, --19361712, -9337796, -8914741, -18462990, 40830108, 4184909, 2603287, -43128988, -14220100, 16572131, -10650982, 8293582, 34331284, 17308718, 29721174, 29836064, -4155381, 6698002, -19644644, -89491552, -61929672, -38069516, -28145994, 1551020, 11978127, 17095580, 1990181, -13595719, 47938276, 25670482, -5850819, -23598698, 15032922, 45097, 17198122, -22492206, -17220134, 13392782, 35450124, -41024452, -573915, 14484240, 3273839, -9405442, -7427072, -4357245, 406948, -1191853, 8136279, 47038480, -1583232, -19852412, 29544006, -6238977, -31476204, -37631428, 35223564, 13091597, -6784438, 14796162, -6752763, 31750546, -43421584, -3241627, -23100482, -4796942, 21686900, -16256988, 7056632, -18880140, -7404524, 64909840, 2303713, -34901440, -43495672, -978179, 16555488, 20715164, -19474456, 5695127, -27536646, -11113228, -63534916, 36134096, -24685324, -31863826, 10457172, 59134720, -44241384, 31227634, -33861524, 16607565, -40893996, -25109990, -25437480, 51672752, 17278116, 3221762, -3608846, 7997229, -14785425, -4887673, 6989523, -8102456, 97174, -6463926, 24530168, -27608050, -2916820, 16075526, --37834368, 12011413, -9128953, 2573222, -4313758, -10929081, 6916508, -3242700, -15349676, 41302552, --31648540, -9259413, 29655676, -19269908, -2794413, -6310918, 6599754, 28889560, 2369211, -28868622, -39182988, -21474836, 14018236, 24001350, 10941429, -9461813, 2245731, -21840446, 5338645, -13371307, --10137733, 51993264, -12069395, -21231098, 6926172, -10099079, 12550968, -8477192, 13785771, 33367600, --18370648, 10853919, 25922812, -30522186, 14087493, 16242493, 7814156, 20446192, -23128936, -6266358, -36461052, -24799678, -4852776, 10495289, -9212168, 34827352, -32868310, 6730751, 14233522, -14040785, -15199889, 15695958, -30044906, -78913584, -125615984, 10678362, 116809152, 8474507, 266435616, 275957568, -134877008, 288296992, 189871376, -43626132, -9072045, -68091872, -239189408, -209839216, -133089760, -244179088, --193873216, -60613800, -124914832, -105086576, 26050050, 50784232, -37904160, 6602976, 42063836, -50005768, --34875672, 63314796, 53419192, -3963181, 60163364, 112608672, 27622546, 76939504, 155897648, 67514736, -26968636, 137478144, 110531520, -73551, 73077792, 161175632, 15161771, 22280142, 123206504, 40891848, --39371428, 79200272, 71367864, -34455840, 57970248, 82851528, -31707060, -110922896, -70146480, -222823984, --349264608, -315122816, -336399008, -494227808, -451002176, -426023712, -512009504, -500549984, -423244864, -389259328, --360098112, -237003280, -135062224, -14229764, 46017892, 153234768, 263588592, 284531904, 321910496, 359044768, -146011168, 19289234, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ --6075768, --9342091, 178241, -5176510, -1161252, -3584150, 2933463, -5563594, 260919, 2194728, -1876901, -1732482, -447750, -497679, 755377, 812823, 1699196, -2633889, -605054, -1763621, -4587562, --3758, 1382443, 388695, -1945083, 3505230, 1270774, -1101122, 1235877, 311922, -1985886, -1167694, -658204, -2212445, -2467996, -1138166, -475668, -1144609, 2312840, 4354023, -381715, -6562173, 1059783, -4931160, 1795296, -817654, -3785477, 483721, -3598109, 4072703, 906238, --3160022, 1583232, -1826972, 1346472, 2078764, 997506, 951872, -717796, 1852742, -3002182, -1622961, -1305133, -1239098, -824097, -1472100, -5317707, -967441, 2918430, -1786170, 2085744, -1026497, -1455457, 526670, -4295, 1669132, 6414534, -3165928, 1748589, -614717, 339839, -360240, -2633889, -2897492, 1913945, -472446, -2393908, -2960843, -1883880, 2755222, -288300, -3676492, 749472, -4461934, -4704600, -3240553, 1377074, 1270237, 2448131, -249645, 2805151, --2011655, -375810, -4795868, -733903, -779537, 1045288, 2001455, 1893544, 3796751, -1772748, --2268280, 2012729, 1290101, -2325725, -2232309, 168577, 1896228, 871878, 4256850, -1470489, --1048509, 4652524, 1647657, 8664560, 3914326, -2323041, 202937, -5190468, 406411, -5921150, --64425, -2142115, 4523138, 559956, 2628520, 3179887, 2082522, 3066070, 2423972, 570694, --4517769, -391916, -1925219, 3668976, 5787469, -3366181, -1704565, -1318555, -1012002, -2474975, --10022306, -10944114, -754304, -3221762, 520228, -2468533, -538482, 5906117, -980863, 3116536, --1395864, -3023657, -3914863, 606127, -741956, -4913980, 5595269, 1521492, 456877, 2801929, -2877628, 4406100, 3272228, -443455, -3317325, 3013993, 796716, -4705674, -1959042, -2204392, --1315334, 3925600, -1350767, -7105487, -2315524, -949188, 1486059, -2317672, -4497368, -10201, --420907, 5096516, 792421, -202937, 1925756, -282394, 7089381, -1386738, 641024, -1731409, --2835752, -161598, 3013457, 1212255, 786516, 2713883, -2698850, -4563403, -3220689, -795643, -488553, -1185948, 15032, -3459059, -865436, 1579474, -1217086, 3299609, 1598802, -332323, -392990, -3360812, -3063922, 5215164, 792421, 2091649, 808528, 1320166, 7189776, -595390, -3768297, 1891396, 4955856, 5641977, -1183264, 235149, 3763465, 3315178, 2524904, 6452652, -1487669, -2485176, 404801, 5585605, 2172717, 2465848, 5193689, 6535867, 4607426, -1899449, --4636417, 2952790, 2311229, -3092913, -4500052, -142808, -2622615, 804233, 1756642, -2080912, --2262374, 1843078, 1796370, 3595425, -2734284, -6004901, -2808909, -2890513, -3735548, -1797444, --4274030, 1980517, -5842230, 1910724, 395137, 743029, -2674154, 4888210, 4067871, -4533875, -4688494, 1145683, -881005, 887985, -3689914, -1859184, 3099893, 397821, 1155883, 45634, -3694746, 731755, 4600447, -3322157, -606127, -1309965, 1549410, 1749662, -1511292, 690416, --2992519, -66035, 1236414, -173946, 18912352, 621697, 16696148, 1844152, 10409927, -1866163, --2321430, 3444564, -8557722, 9338333, -5486284, 6423661, 3941706, -2763275, 2146947, 246961, --110059, -1010391, 2029372, 3995393, 3909494, 7657927, 1313723, 2785823, -709743, 8926553, --10100689, 744640, -1166084, 2834679, 3681324, -4570919, 1526324, 2819109, 763430, 3895535, -1407139, -3395709, 1458141, 8072391, -1822677, 2847563, -1679332, -625992, -763967, -4859756, -7945153, 428960, 416612, 6805913, -1268089, 1053878, 7355669, -10778757, 2736968, 374199, -3024731, 9787694, 2378338, 2827162, 2830384, -381715, -2913062, -1114544, 1918777, 1474784, -4626217, -1139777, 3772592, 2545305, -1634235, 1487669, -3445638, -1471563, 307090, -7634305, --9627706, -3671123, -1547262, -3463354, 7492571, 3349538, -6206765, 6867653, -1082869, -4856535, -1337346, 3032784, -2896419, -4440460, -4218732, -8516383, -4490389, 3776350, -5604933, -8658117, -2292976, 3587372, 529892, -3155190, 6357626, 856846, 5858336, -335007, -1582159, 3490735, -5528160, -8108899, -4084514, 2248416, -2037962, 2019172, -5545340, -369904, 1208496, 1941862, --4780836, -8264054, -2572686, 2414309, -1652489, -1047972, 241055, 2661806, -1088237, 1465658, --3066607, 4771172, -6585796, -4742181, -1946157, -4654134, -1693291, -1296543, 1516660, -3443490, -2224256, 5139465, -796180, 1144609, 1046361, 2410014, 4716411, -2032056, -1359357, -1067299, --2502355, 5199595, -2542084, -9267466, -6197638, -3659849, -2429878, -8141111, -19667192, -1571958, -1149441, 462246, -6496675, -2528125, -7337415, -1568737, -8611946, -9385040, -7715909, -1453310, --5153961, -10590316, -6957847, 2580739, 3247532, -2676838, 6443525, 3976603, -2531346, 8448738, -1637993, 1040993, 1217086, -10686416, -479426, 2241436, 4107599, -3069291, -3133716, 7021198, -12795244, -9163850, 3426847, -2372433, -512712, -7995619, -750009, 385473, -4308926, -4978404, --3957276, -4145180, -2448131, 3299072, 9468792, -3856344, 3592740, 6931541, 5836324, -1364726, -738198, -1462973, -1729261, -8068096, -4185446, 5563594, -3002182, 1729261, -2843805, 3163780, -1482301, -256624, -147103, -3333432, -3142306, 1496259, -984621, 2521683, -10028749, -10164577, --860067, -11668352, -2790655, -14130442, -3668976, -9882183, -1632088, 2376191, 2229088, 11630235, --7373385, 2947421, 2636573, -5622112, -3120294, 9458592, 581968, -2170032, 763967, -6951405, -6367826, -9032853, -3493419, 4711043, 2288681, -510027, 1281511, -1393717, 2777770, -3566970, --7464653, 978716, 3133716, 3322694, -6020471, 2083596, 6111739, -6092948, -8657580, 7174206, --5989332, 4864051, -4381404, 2943663, -435939, -5415417, -7978439, -4233764, 1859184, 215822, -2652679, -3507915, -4153234, -9330280, 4935991, -6537477, -3416647, 4365835, 8581345, -609349, --1960653, -12381854, -10286447, -2872796, -3711926, 5359046, -1424319, -7067369, -1212255, 869731, --4139275, -597000, -8869644, 6397354, 2645700, 7859790, 9822590, 7447474, 3477313, 21099564, -9785546, 13745506, -4491999, -286689, -554051, -20345260, 734439, 9083319, -4435091, -1399623, -329639, 13147432, -2590402, 7679939, -1948305, 7348152, 3525095, 9024800, 12044162, 1733019, -7875897, -2470143, 6736120, -879931, 12865575, 7194607, -743566, 7673496, 5601174, -2197950, -5301601, 3566970, 4479651, -3977677, -3815005, -10793790, -1291175, 7651484, 818191, 952409, --3196530, -4078072, -3936875, -3615289, 18066780, -12165495, 4020090, 5631776, 2428804, 1527935, --8072391, -9715216, -3352759, -1556389, -1390496, -16776142, -9253507, -8700530, -654983, -546535, -3809099, -700080, 3169149, 5752572, 9322763, 1837709, -4215511, 3524021, -8364449, 1905355, --6843494, 2195802, 1767916, 31304942, 4084514, 4133906, 4268661, -2610266, -12266427, 8135742, -9927817, -5767068, 4755066, 3571802, -7036230, -1657321, 8347806, 3810173, -12919798, 2935610, --2927557, -7538205, 672699, 3499862, 1941325, -636192, 614717, 5419175, -958851, 2856153, --9783399, 3823595, -174483, 3760244, 3358128, -2378875, 8574902, -10804527, -3500935, -10659572, -9921911, 3846143, 15576236, 6840273, 979789, 2782602, -10771778, -431644, 4509179, 3455301, -4672925, 495532, 3173981, -3400004, 4473746, 10214506, 15214922, 5871221, -5277441, -3740380, --297963, -2961917, 6410776, 6975027, -3765076, 4097936, 9057012, 2335925, -9674951, -21486648, --9403294, 4306242, 10558640, -3991098, 3966402, -707596, -864362, 66572, 10806675, 1787243, --18634252, 4922033, 10263361, -11453067, 7744363, 10473815, -26931056, 5050882, 2161442, 5143760, --9436043, 14775761, -21042656, -1184337, -601832, -2800319, -1280974, -7414724, -7342784, -2379412, -8872866, -214212, 1205275, -5232881, 6543383, -1910724, -1724429, 3133179, 10736344, -7524246, -8027294, -2357937, 5274757, 1042066, 7612830, 9002788, -1312649, 1531693, -12068321, -7711614, --1664837, -6132677, -10884521, 89121, -3287261, -8985608, 12527883, -11992622, -2502355, -6351183, --4718022, 6506339, -7789997, 3612604, -1996086, 6630356, -3118683, 7339026, -10492068, -4843113, -2658048, 9056475, -17616346, -8792335, 1888175, -1828046, -2134599, 5514201, -8524973, -21263846, -5388574, -19191524, 9774809, -8809515, 1392643, -21087216, -4997732, -14766098, -5933498, 17934172, -1037235, -15351824, 14415521, -6952479, 1188095, -16019691, 2648921, 5867462, -13607530, -3743601, --12145094, -467078, 997506, -4563403, -3230352, 11659226, 2052458, -8607114, 2239289, -17968532, -10711648, 16226386, -5222680, 6482717, 12014097, -1395864, -2252174, 921807, 1601486, 6377490, -1343788, 1016297, 3799972, -10411001, -549219, -11906723, -11349451, -5400922, 4991826, 6114423, --202937, -14303315, 2830384, 2751464, 6831146, 13634911, -14676977, 20834886, -17841832, -162672, --3437048, -4146791, -8505109, -17820894, -22332220, -9929964, -2323041, 4475893, -1415192, -443455, -3666292, -1670205, 16304233, 5865315, -15799037, -4371740, 308701, 8370892, -10414759, -1517197, --21489868, 1786170, 19727322, -17648020, -9777493, -18418968, 22106196, 10111427, -11531987, 15123117, -14194330, 21296596, -8154533, -6723772, 14729590, -1767379, -3483755, 5770289, 6282464, 3171297, -2754148, -20245938, -2681670, 539555, -310311, 1624571, -2828773, 9270150, 16551730, 2212982, -673236, 200790, 319975, 16191490, 3671660, -606127, -3929895, 4524748, 2966749, -1950452, -1292248, -8438537, -2384244, 14176613, -14064944, -6048388, -12205760, 15797963, -14505178, 7563438, --6257231, 5058398, -3578245, 4205847, -11775727, 3177739, 16397648, -10529112, 326418, -28935732, --1883880, -9771587, 224412, -26896696, -1807644, -597000, -9114457, -5114233, 21935472, -23302346, -3417720, -5553393, -9658308, 7628399, -8830453, -17580912, -13911399, 3482682, 344671, 6261526, --9908490, -5090610, 18262738, 7361037, -3149822, 4818417, -10111964, -9243306, -8800388, 19224274, --17068200, -19683836, 9258339, -18228914, 6537477, 1615445, 4683125, -7618198, -2554432, -9437654, --4881231, -7036230, 3403225, 10497974, 6104223, -14353781, 17490180, 3264175, 5855651, 2769180, -8240432, -676994, 7919383, 3257196, -4048007, 6562710, 1597728, 8335458, 4511863, -10311143, -4401268, -1986422, 3021510, -876173, -4615479, -2041720, -8444443, 9300215, 7971460, 10296647, --1799591, 17489106, 18541910, 9412958, 2297271, 10529112, 19272592, 11732777, 21061446, 15891379, -15701864, -14510010, -17118666, 6098854, -3477850, -1764158, 1357747, -5473936, 7170448, 8665097, -3462818, 19817516, -3596498, -6310381, -8470749, -3075197, 2215130, 1550483, -34396244, -6533719, -15755551, 10117869, -33344516, -25227028, -7363722, -628676, 11521787, -4920959, -366683, -27112518, -4242354, -14314052, 10498511, -2192581, 13776108, -11627550, -2349884, -13736916, 2854006, 10849087, --4760971, 3051574, -7211250, 430570, -17573932, -5156645, -309238, 1194001, 14018773, 17402670, -1201517, -16117939, -10691784, -5222680, 2268280, -4247186, 5743982, -18424336, -5083094, -2469069, --4133369, -10268193, -1761474, -4640176, 13246216, 18417894, 12994424, 4727149, 8217883, 7928510, --8080444, 30808338, 19192062, -23611046, -20052128, 22868016, -16868484, -9585830, 4184372, 3150359, --16353625, 17346836, 1805497, -50656456, 14527727, 33483028, -21709986, 23633594, 30532386, -8340827, --2452963, 17949742, -18044232, -9745281, 6781217, -6375342, -11219528, -9796284, -7401840, 11761231, -6059662, 7932268, -2581812, -10199474, -9482751, 10843719, -8990440, -162672, 2180770, -14762339, -9095130, 8689793, -7115687, -4505958, -12902082, 810675, -8363375, 10808822, -17790292, 1716913, -5432597, -483184, -9032316, -17035450, -4984310, -7221451, -2787434, -13150116, 17263084, -17651778, -1992865, -6255083, 3441343, -25183004, 24994562, 5195837, 1374390, -10305237, 4696010, 4418448, --168041, 2499134, -6031208, -19983946, -4865661, -8643622, -14294725, -17234094, -7689602, -4383551, --18634790, -6636262, -2354179, 11710228, 3857954, -15679852, -15191299, 8125005, -5239860, -19963544, --10209674, 4497905, 14458471, 15700790, 14620606, 25664040, -6738267, -18254684, -18526878, -1668595, -10219875, 19745038, 8841727, 4060892, 11322608, 33716032, -29795262, 27917, -12349642, -14450417, --9965935, 15950972, -8993125, -7999377, 6961605, 20322174, 11467563, -13562970, 8690329, -14258755, -10536629, 1648731, -2379412, -6337224, -12019466, -8106214, 1312649, 3183108, -18591840, 12538083, -1315871, -483184, -7379828, -6473053, 12260521, -16281684, -1322850, 20221780, 21881784, -18802294, --1786170, -2723546, -13397614, -15503758, 17971754, 5484137, 11311870, -2273648, 1096290, -238908, -11324218, -3159485, 363998, -13007308, 20414516, 18620294, -25360172, -29344290, -6673306, 1804960, --10234907, 2479807, -7587060, 3809099, -15624554, 18008262, -20026358, -16141024, -6440304, 4329327, -14057428, -5850819, 20380156, 3443490, -6736656, -5643587, -4641249, -11595338, 13194676, 9904195, --43181064, 64617784, -43963284, -12861816, 13261248, 34318936, 30277908, -11954505, -10216653, 622233, -3034931, 17106318, 8168491, -25545928, 8709657, -6496138, -7101192, 1149978, 11395085, -1364726, --16740172, -17278116, 9993315, 5733245, 12770548, -7361574, 15469398, 2056753, 17900350, -2879239, --3995930, 10923176, 140123, -14093398, 3882651, 13868986, 1010928, -18289044, 10195179, 18835580, --16690243, 6140730, -18025440, 6710350, -23204634, -17420924, 29312614, 24554328, 13894219, 32315870, --4534412, 38796976, 16743393, 14306536, 23379654, -37172940, 32459752, 9342628, 14373645, 13000329, -5467494, -18688476, 5029407, 32578400, 40527312, -1543504, -41133976, 20206210, 3466039, 7901129, -804770, -235149, -7175280, -34134252, 8753143, -7212861, 9308268, 44449152, -2460480, -50982872, --27057220, -29655138, -12506945, 1142461, 16259672, -43317968, -10745471, 7834557, -21448530, -22837952, --22451942, -22794466, -4667019, 27036820, 12573517, -9467182, 11705933, 6051072, -12838194, 14393509, --15993384, -2443300, 5437966, 9837086, -30923764, 16009491, -15666967, 9521406, -6804302, -23216982, -5800890, 8419210, 2816962, 4889284, -10949482, -33337000, 450972, 7996156, 6511708, 1263794, -3308199, -13304735, -1149441, -299574, 30114700, -3880503, -52171504, -22215718, -6584185, -41612864, -8635569, -12108050, -11907260, -19623706, -10247792, -29753922, -31080530, -35974648, -4762045, 39521216, -4218732, -23758148, 10198937, 1046898, -3768834, -13137231, -20332912, 8722542, 15205795, 12686260, -6364068, -6675990, -30057792, -19474456, -17070348, 27817966, -2426657, 22140020, 30735860, -26014080, --30455076, -34019364, 9812927, 10791642, -44329432, -27077622, 2101850, 521302, 14936286, -53655952, -6943352, 11490648, 38022808, -43089796, 6410239, 6252399, -3833258, 22690312, -11947525, 40290552, --682900, 2964601, 13986024, 15276125, -13772886, -33693480, 21055004, 22749368, 7246684, 28955058, -7681549, -4342212, -9010841, -25575456, 40830644, -17884244, 38918308, 13913547, -341450, 10280004, --13003550, 19252728, 22247394, -14261439, 17383880, 6853694, -35457640, 27414240, 31702764, -4224637, --16188805, 3058554, 2729452, 554051, -2936147, 52184928, 3358665, -31544388, -12433393, 5086315, --39020852, -59122372, 13951128, 71422088, 22967874, -6615860, -38202660, -13657459, 2507724, 46917148, --19808390, -26489748, -41519448, -71721656, 20309290, 35698156, -47370804, -3361886, 25371446, -10449655, --21774948, 19520626, -21064130, -10325638, 692564, -14503568, 23715198, -7598871, -12127914, -3634616, -12070469, 45105208, -7873749, -19906636, -23848880, 8791261, 20274930, 13217225, -21233782, -2727841, -23170274, 1064078, -19381576, 6436546, -17431662, 41440528, -19698330, -44324064, 14275398, -7312719, -20139102, -29738890, -30521112, 29541322, -3536906, -38244000, -21489868, -36624260, 46103252, 22604950, -11565810, -50107236, 7668664, 20163798, -36115308, 1541356, -26265336, -19677392, 18361522, -17723720, -21273510, -14958834, -31417148, -8040179, -8517457, -5927055, 9535901, 1902671, -19716048, 56809532, --7808788, 23540716, 26539676, 13052942, -7781407, 1943473, -12261595, 27130772, 11224360, -19014358, -14564234, 51314660, 11997454, 21539260, -716723, 4281009, 9538049, -20320564, 9631464, 17121888, -1397475, -23195508, -10539313, -17520782, -5461051, -23241142, -20046760, 1448478, -15731391, 23667418, -9279277, -7008313, -16793322, -9852655, -4705137, 12193949, -2916283, -22036940, -15978889, 3149285, -5690832, 10732050, 5744519, -5806259, 6754910, -19370302, -54101556, 1099512, 68300720, -3182571, --47596292, -9145059, 33116882, 7676181, 6379100, -2124935, -20039780, -27633282, -14660334, 4780836, --510564, -25664040, 10107132, -50371376, -7734163, 44238164, 14408542, 57252452, -6727530, -24390582, --6061810, -6474663, 16508244, 2051921, 300648, -33328410, -15448997, -16744467, -1722819, 35463008, --4805532, -10821170, 11962558, 12930536, 1439351, -22488986, -33509334, -23281944, -78017008, -120094800, -26946624, 105764640, 31889058, 259835856, 243976160, 107178224, 251017216, 104265160, -49821084, -4488778, --80820544, -213458256, -119199304, -114530136, -220008096, -161750608, -96014528, -141422528, -97886600, 12578349, --15737297, -51120848, 42545408, 39113192, -9622874, 41739564, 128942968, 48041892, 15103252, 121942712, -107189496, 27801860, 129026720, 160507760, -14295262, 88605712, 160070752, 50862612, 53750440, 161863360, -89143656, -32202592, 120459872, 78304232, -58421220, 33590404, 88803816, -72533944, -111872624, -44733696, --211876640, -339239072, -330434912, -365603712, -568404032, -497740544, -417713472, -533232544, -463905312, -313789760, --366493312, -292750336, -115445496, -72475424, 52023328, 138012336, 261211856, 364685664, 398688384, 468327008, -507501920, 453715520, 408530848, 400821376, 171415904, -13131326, -2270427, 0, 0, 0, -0, 0, 0, }, -{ --5747740, --9216463, -690953, -9408663, -5207648, -1798518, -1622424, -255014, -2236604, -419833, 2037425, --2442763, 2855617, 351114, -3832185, 2399276, -658741, 2564632, 381178, -3635690, 2573759, -1425392, 2024003, -1553704, -2319819, -1667521, -1928977, 1527398, -316217, 425202, -2103460, -1513976, -2552284, -3497714, 191126, -4347581, -3234110, -1664837, 4675609, 579821, 1805497, --5655398, 832150, 969052, -4862977, 1753420, 386010, -5078799, -925565, -374199, -3939022, -4518306, -2825015, -1625108, 2663417, -187368, -4773856, -477278, -3299609, 3722126, 3245922, --4551592, -2374043, -3041374, -2056753, -1284732, 1970853, 1727651, 1132261, 3125663, -27917, -1241246, -458488, -1240172, -1636383, -746787, 11343009, -5726802, 626528, -3499325, -70867, -4510253, 2416456, 2749853, -2404108, 3452080, -3615289, 3898220, 2225867, 4738423, 2259690, --1166084, -5435281, 5792837, 4310000, 1294933, 864362, 323196, -2226404, -2965138, 3262565, -1662689, 2179696, 2739652, -2895882, -488553, 2943663, 3062312, -298500, -2745021, -4582730, --253940, 1007707, -3126199, 1189169, 475668, -4129611, -2586107, -209380, 1864016, 158377, --2371359, 4072166, 432718, -1240709, -3251290, -557809, 26307, -5457293, 2231773, 3561065, --2266669, 4530117, 3300146, -505732, 2661806, 1846836, 5531918, 1912871, 730681, -870268, -1837709, -4708358, 216359, 2291365, -2757906, 2595234, 2710661, 3393561, 1677185, 4340065, --10730976, -7254200, -1204202, -4619774, -4230543, 2151242, -6180995, -5668283, 1516124, -2491618, --2520072, 2558190, -2063195, -3978750, -612033, -175020, -1329292, -1748589, -1279900, -4588636, --465467, -3273839, -2636573, 0, 4045322, -810138, 5921686, -3045669, 3483219, 4334696, --4913980, 1770063, -1387274, 1036161, -3540664, 1775969, 1967632, 3363496, -1870458, -3856344, --1589138, -2066953, 1058173, 1648194, -5032091, -500901, -3531000, -2554432, 670552, -3845070, --6556268, -1088774, 5949604, 1462436, 1908039, 424665, 1151051, 929860, 1993402, 2527052, -6648610, 591095, -3417183, -3928821, -1209570, -1846836, -897111, -8027294, 1250372, -541166, -2100776, -1059783, 167504, -1922535, -1605781, 7887708, 678068, 573915, 8603893, 9923522, -7634841, 5673115, 8027831, 3263102, 3492345, -721018, 2287070, 8458401, 910533, 2591476, --3127810, -2073932, 6484864, -4321811, -7903277, 2419140, -6598681, 5735392, 1365263, 6880538, --2160906, -398895, -1666447, 2286533, 2768643, -57982, -6711960, -1348083, 5804112, -3796751, -2636036, 1578937, -1267015, -1605781, 6454262, 4898947, 11234024, 4546223, 973884, 2753074, --898722, 759672, 3577171, 2189360, 9595494, -3990025, -2662343, 770410, 2521683, -1385664, -4492536, -4013110, 936303, -128849, -3096135, 1150514, 1051193, -4129074, -5729487, -3404299, -4734128, 2472828, 150861, -103616, 3637301, 581431, 1334661, 6423661, 3200825, -978179, --685047, 5966247, -4286378, 1465658, 18814642, -460635, 9277129, -1794223, -1315334, 9682467, --9501005, -3473555, -641024, 4702989, 3474629, -2212445, 1971390, 749472, -8611946, 2037962, -4750771, 3966939, -9672803, -3608846, 1184337, -7181722, -1846836, 345745, 389231, 755914, --1006633, 4255776, -3088618, 3335042, 7377680, 7092065, -2069101, -4419522, -699006, 8000987, --426276, -686658, 101469, 556735, -4243965, 468688, 3494493, 245887, 845572, 3033858, --2180233, 1938104, 1308354, -1213328, 5794448, 249108, 4599910, 575526, -1555315, 1661079, -3055332, 2290828, -167504, -4908611, -4169340, -5850819, -2492155, -609349, -78383, -1074816, -3945464, 3029026, -2783676, -5825587, -26307, 2280091, 3061775, -3772592, -1029182, -5024575, --13927505, -3649112, -4704063, 887985, 2343979, -2385318, -2765959, -26305064, 557272, 8441221, --6103149, -9845676, 7407208, -11136850, -1643362, -4978941, -5810017, -3630858, -3627637, 408559, -4523675, -800475, 2550674, -2821257, 3432753, -2552284, -3918621, 1792075, -1422708, -6243272, --7956964, 3892851, 462246, 3853660, 1244467, 8554501, 1285806, 3025805, -3984119, -6965900, --1954747, -3398393, 7151121, -3172907, 284005, 1966558, -3399467, 10013716, 6641093, 306016, --7750806, -9787694, -3274376, 3520263, -8883603, -3221, -4262755, -8315594, 908922, -13133473, --2851322, -1125281, -4872641, 9349070, -444529, -1044214, -36507, 6071473, 7313793, 2652142, --7108171, -1764695, -1723356, 4567698, 1920924, 2982318, 5953362, -15421617, -21805012, 2320893, --4704063, 4544613, -5847061, -11409581, 633508, 9730248, 2431488, 5819144, 5324686, 3452080, -2829847, -3939559, 3082176, 6340446, -10166724, -5321465, -3129421, -2747169, 4243428, -1250909, -1714229, 6599218, 6470905, -2850248, -5550709, 1018444, -2930242, -2913599, -5357972, -4377646, --8365523, 1739999, -2863670, -442382, 8220031, -1929514, 1926293, 1688459, -5151814, 4325569, -5093295, 6121402, -5242008, 9880035, -1203128, -7893076, -5862094, -8603893, 8142721, -3291556, --8218420, 2240362, -823560, -6570226, 7083475, 8359080, -2481954, -7798587, 6027450, 1252520, -4874251, -1143535, 12459163, 6410239, -6242198, -4023311, -2559801, -3367791, 4683125, 4606353, -7752416, -20522964, -208843, -3575560, 1174137, 144955, 7613367, 5911486, 7888245, -1137630, -10830834, -4960687, 7292855, 9360881, 1473174, 9327058, 1752884, 2543158, -2799782, -778463, --4088809, 7418483, -690416, -674847, 9984188, 6329171, -156766, 2902324, -1130650, -201863, -6386617, -3665755, -6856916, 128312, -1195612, 3510062, -18905910, 11320997, 11773579, 4889284, -2037962, 439160, -6241661, -12298639, 7864622, -4891968, -5995238, -3673808, 6995428, -5082020, -4158602, 4705674, -4811974, -2829847, -11145440, 5020280, -7424388, 4215511, 210990, 3774740, -6001143, 10463614, 3904662, -4751845, -12057047, -1982664, 6324340, 11485279, 7840463, -1738925, --3164317, -7397008, -13321915, -1351304, 7131257, 3710315, 806917, 1886028, 8020852, 26946624, -14877230, -1440425, 2698313, 2267743, 6082748, 10550050, -1388885, 1943473, 18202608, 1679332, --709743, 10739566, 7688529, -7735773, 4550518, 885300, 7325604, 4791573, -12554726, 9336185, --5815923, -1081258, 1068910, 7227356, 1317481, 1748589, 5656472, 6241661, -6299107, 6403260, -19925964, -3859565, 9006010, 8995272, -5097053, 6962679, 1796370, -5196911, -5376226, 3151969, --4846871, -12866111, -1824287, -1027571, 1038845, -16393353, -4157528, 4403952, -10373420, -7300908, --16924318, 4944581, 7272454, -11919608, -4447976, -6075231, 11573863, -343061, -7354595, -5479305, --8182450, 3142306, 9474161, -7887171, 3239479, -3822521, 4149475, 10537165, 4006131, 8075613, -8251169, 10420128, 743566, 27285928, 8026220, 582505, -1024887, -4586488, 751619, 4649839, --2803540, -6999186, -8953933, 147640, 7371775, -9050033, 4734665, 4993437, -1826435, 18203146, -7201587, -5267241, -2652679, -2008971, 7299834, -3384434, -5719286, -7505992, 4861903, -15669114, -1069984, -4873178, -4966056, 4181151, 1593433, -6162205, -2885144, -5956046, 8026757, -3142842, --11410654, -2123325, 775242, 201327, -6420976, -10426033, 1401770, -2533494, -848256, 2573222, --1602023, 8361765, 2327336, 4667556, -5386426, 12474733, 4262755, -7436736, 9167608, 15939161, --4453344, -5001490, 8926553, 7022272, 3597572, 3870303, -10112500, -3775813, -11018202, 2207613, -10590316, 3575024, -13157095, -3968013, 3944928, -14443438, -20863340, -3514894, -440234, 3440806, --21502754, 10066330, 28809566, -11890080, 20256676, -4633733, -4226248, -6381248, -10285373, 7651484, -426276, 5206574, 5355288, -18916646, 396748, 8712878, -7489886, -4099546, -11712376, 20963736, --12935368, 10322417, 9966472, -12552042, -4962835, -4402879, 9018894, -10040023, -3870839, 10161893, --1552094, -2747705, -4727686, 12409771, 2436320, -2019708, -4850629, 324807, -9182640, 10244571, --930934, 4719096, 25842282, 17157858, -14395120, -10386842, 4341675, -1301375, 11031623, -5843303, --8261370, -3027415, -15649250, -6142877, -1501628, -12258374, -6612102, 27367532, 6963216, 166967, --865973, -220117, 8543227, 9715753, -1488743, 9617506, 1344325, -5077188, 1657321, -14384919, --408559, -13249437, -6523519, 8505109, 12790413, -17325362, 8056285, -22578644, 3608846, 21577916, --5881421, -5059472, 4310537, -6213207, -5638219, 6393059, -1041530, -774705, -483184, -13972065, -24255828, -25540560, -2688113, -113817, 8745627, 5863704, 177704, -9346386, -7215008, 3658239, -19008988, -983011, -8492224, -5165772, -13601625, -306553, -7979513, -5694053, -2780455, 4919348, --410706, 1330903, -9107478, 2568391, 2713883, 6621229, 5027796, 6692096, -12278238, 869731, --2319282, 9037148, 2343979, 17500382, 3910568, -2926483, 1842004, -8076686, 363998, 8263517, -9865540, -13210783, -10489921, 67646, 15541876, -22122302, 6870874, 28108950, 15648176, -5890011, -3484292, -13069585, 7249905, 14750528, -21388938, 6660421, -9503689, -1428077, -28963112, 2006824, --10795400, 14024142, 3285650, -12258910, -5893232, -17709224, 27798102, 7722888, 14687178, -16546362, --17951352, -3612604, 5104032, -5326297, -2181844, 8972187, 2779381, 2611340, 8385924, -20489678, --1992328, 4832, 5352066, -14340896, 2044941, 2119566, -9607842, -5685463, -13319230, -10424959, -79994, 4040491, -10778220, 519154, -4828080, -10005663, 3871913, -333397, 7831336, -21758304, --22327924, 4321274, -1882269, 8075076, 18797462, 1749125, -11820287, 16428787, -8396124, -16139413, --12206834, -5564130, 1263794, -17121350, -6582575, 16075526, 22200686, 9035001, 6083285, 4265440, --2790118, 13838921, 7802345, -17018272, -9352291, -306553, 1331977, 15195057, 9647570, 2103460, --2819646, -2330020, -8122857, 9937481, 7602092, 17539036, 3555696, 4641249, 1617592, 31219580, -3040300, 6793028, 18395344, 1382980, 22909892, -660351, -10797548, -11467026, -21861384, 4124242, --9314173, -445603, 1701881, 7967701, 11225971, 19381040, 19779398, -2873333, 17617956, -1097364, --1607392, 6933151, 14880988, 6749541, 4159139, -23483270, -12184822, -19029926, 9826348, 19650012, -3825742, -8041253, 13609678, 19741280, -2493766, 3362423, -4376035, 16681116, 13994614, 12082817, --6684043, -11914239, -1673964, -2787434, -27063662, 5200132, 4122632, 2874944, -6539625, -3191161, --30067456, -10354629, -27186606, -4387846, -20159502, -10288594, 20702816, 5794448, 21853868, 1888175, --16430934, -7916162, -17031692, -33855080, 5907728, -20742008, -5000953, 20726976, 9800578, 8421894, -3208341, -3423089, 292595, 4376572, -12701829, 12210592, -22698902, -25687126, 1953673, -3718368, -10753524, 21897354, 18920404, 20548734, -11850889, -20419886, 15728170, -9213242, 16262357, 5030481, --26252450, 6750615, 4836670, -29345900, 15820512, -13258564, -13778792, 8266739, 8935679, 1647657, -10613401, 1067836, 484794, -6636798, -4048544, 6793565, -4154844, -9779641, 617938, -18644990, -6804839, -23769422, -14775761, 1347009, 9507984, -2812667, -10094247, 4282620, 7458211, 6212134, -321586, 20107964, -44900124, -9472550, -12414603, -14111115, 19244674, -14828375, -2336999, -35196720, --10320270, -3287798, 1636919, 25181394, -6082748, 4268124, -14842870, 13572097, -18425946, -10195715, -9033390, -40210556, 5699959, 24351390, 28671054, 24461450, 13616120, 35325568, 17606682, 2690260, --8541079, -4640712, -12998719, -23419382, -3071975, 9302899, -38356744, -38178500, -180389, 6684043, -26735634, -8483097, 12261058, 11643119, 5786932, 6516539, -42193760, 33496986, 17915382, 41439992, -14949171, -1400159, -15387794, -9290551, -9665824, -14460081, 10531260, 8249559, -15184320, -16722455, -9026411, 12803834, 21419002, 6512781, -13350369, -19385334, 4216584, 3917010, 1393180, 2958159, -38144140, 13491566, 7344394, 13168907, 13871671, 16164646, 467615, -23492934, 17155174, 53871236, --5265630, -14050449, -32151052, -6156299, 43091944, 5856725, 18006650, 6839736, -58945204, 13187697, -10998338, 2279554, 6505802, -3029563, 1386738, 13303124, -31351650, -11914776, 27707370, 11508365, -4447976, -22388590, 18024904, 8209830, -20634096, -21386252, -14567455, 23979340, 46189688, 44575856, -47611860, 50037980, 3842922, -17688822, 19793356, 38005628, -77828568, -28494960, 6878390, -46692200, --41366976, -19015430, -24838870, 2113124, -18103824, 48990544, -4579509, -18471580, -6436546, -38956428, --9852118, -31610960, -12099460, 4520453, -38966092, -7521025, 31439160, -26625040, -6698539, 7958038, -561030, 11901891, 3407520, -898185, 12183748, 3285650, -18985366, -4686346, 18284750, -9891310, --23809152, -9116605, -29020020, -15741592, -51390356, 3978750, -34746284, 16013786, 7150584, -14212047, --45185740, 3039226, -4051765, 55432996, 23411866, -265751, 31679678, 11975443, 1235340, 23597088, --28518582, -15517717, 3251290, 20577726, -23341000, -16467978, 83362096, -9560597, 43829604, -34971772, -1277216, -25567404, 19338628, -10339060, 29473140, 41802916, 2893734, -32982128, 28332826, -34684008, --30291868, 62000000, -35809828, 23271744, 19589882, -31148176, 17022566, 10460393, 6463389, -4800163, -23849954, 13451301, -31171262, 22849226, 25164750, 5981816, 4079145, 16481400, -586800, -29518236, -39723616, -21552146, 8942659, -15660525, -3921305, 6335614, -7424388, 33867428, 7403450, -2835215, --7641284, -170725, 6600828, -31451508, 10790568, -15452219, -11192148, -6163815, 393526, -14358076, --7156490, 5900212, 34972844, 2435783, -6436546, -19681150, 10009421, 8352638, 2015950, 29091960, --5339718, -156229, 32979444, 12765717, 3315715, -27565636, -14328548, 22978076, 12938052, -25112136, -3088082, -61221536, -29738890, 62624380, -10781442, 36352068, 44729936, 17221208, 11048266, 25086904, --3125126, -15158550, 18344342, 13691819, 6467147, 40351216, 27632746, 37771016, -13725105, -55264956, -6891275, -4113505, 17012366, 9008694, -22792318, 13087302, 8916352, -19648938, -27826556, -13704704, --44405132, -38689604, 25351044, -3815542, -45897096, -10285373, 1071594, 16894790, 10159745, -23347442, --31725850, 5557688, 35956392, -16079821, 11693585, -23746874, 5841693, -27142046, 15830713, 23346906, --18395882, -27998892, -24991878, -628676, 8190503, -10396505, -12698071, -8164196, -43256228, -30989262, -13557601, -25528212, -10120554, 13057237, -27905476, -34934192, 9902584, 22910966, -7259569, -42554536, -15531139, 21058224, 52649856, 3499862, 9892920, 14631880, -30129196, 12896713, -13387413, -46270756, --13643500, 34288336, 938450, -21187610, -69268696, 43906912, 43431784, -10176925, 33298344, 53128208, --5667210, 8993125, 28766080, -13380434, -11127723, 21986474, -4459250, 12113418, -25556130, -83468928, -23110682, -10064719, 62672164, -21772800, -12862890, -25306484, -70189968, 32065152, -40542880, -24548422, -2115272, -420907, 55632712, -39471288, -26502096, 35786204, 22418656, 18564460, -5808944, 17763448, --11669426, -18217640, -15564425, 42158864, 36264020, 54885924, -16357920, -20622822, 2143189, -3637837, -21391084, -33064268, 8340290, -34713000, 19865834, 34238944, 13031468, -27940372, 20505784, -24568286, -57176752, 28655484, 9324374, 7812009, -7154342, -43404940, 26225070, -58955404, 13932874, 11492259, -30565672, 23501524, -49664856, 15994995, -30664992, -18592914, 15612743, -4475893, 20795694, 12898324, --45214732, 19816980, 44682692, 57576184, -14993194, 17411798, -21946746, 40405440, -56023552, -2826625, --11329050, 17613124, 19671488, -62097176, 43461848, -2959769, -4911295, 18555870, 9877351, 21511344, -2005213, 12113418, -26068840, 24883430, 2792266, -20236812, 12593918, -6139119, -3580929, 24434068, -9080635, -30081414, 15439871, -12531104, 24437828, -16945256, 3704409, -7048578, 9558450, -6536940, -2553358, -11315091, 28468654, 543850, -2588792, 12895639, 7183870, -12699681, -6921340, 10792179, -7023346, 13269838, -14885820, 7662222, -3275986, -28708098, -6511708, 12167642, 8017094, 9034464, -3645354, -25208236, 543850, 2351495, -1274532, 10872173, -10117332, 10640781, 363998, 7201587, --11721503, -1954210, -7125888, 38582764, -16983374, 11799886, 7131793, -1684164, 6163815, -7814693, -5270999, 12191802, -15927349, -6799470, 864899, -633508, -2373506, -3015604, -22502408, 8468065, --8503498, 51747376, -3650185, -16884054, -25515864, -11738682, -14293651, 18701362, 10946798, -13785234, -1203665, 1495186, 6201933, 721555, 13074954, 4367982, 10303627, -3649649, -329102, -3215320, -4842576, 10977400, -10296110, -212601, -5087389, 210990, 13571560, -7846369, 1330366, -3635690, -5344013, 2592013, -7441031, -2925947, 7969312, -2624762, 12993350, 9077413, -13599477, 4171487, -2848100, 6939057, 2973191, -13018583, 8640400, -2592550, 8393440, 6565932, -15378667, 4009352, --23085, 3254512, -1786170, -6922414, 10836739, -2877091, 4864051, 71941, -3381750, 4872104, --6631967, -1090922, 8989367, -6421513, -7638063, 15039365, -9940702, 14049375, -1620813, -11545946, -23323284, -21560736, 18578954, -6538551, -11405823, 12179990, -11252277, -25596394, -43371116, 54744192, -157598464, 24665460, 15432354, -115311280, -142109200, -45834816, -27808840, 95988224, 146946944, 75275208, -22033720, -49680960, -106072272, -97159680, -81017040, 6127308, 121730648, 101404712, 58438400, 19487878, --51940652, -67829880, -53519588, -52158084, -18191334, 24225764, 33848636, 69494184, 50077172, 11759084, --16885664, -10355166, -56188908, -27720792, -28387586, -38909184, 22931904, 42764988, 24982752, 62437552, -16689706, -15399068, -24188718, -42293616, -33091112, -5680631, -10286984, 12308839, 25930328, 22628036, -16449188, 10697153, -5866926, -23577222, -16412681, -19754702, 5929203, 21559126, 7081328, 4702989, --9989557, -20806970, -4127464, -974421, -771484, 15134928, 13889387, 15029164, 5647345, -6951942, --18339510, -26736172, -26924076, -17573932, 15055471, 7797513, 2724083, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ --4990215, --5331128, -6693170, -8210367, -6183143, -3707631, -540629, -3342558, 2524367, -566399, -781147, -1321776, 2819109, -49392, -1805497, -1963874, -3180960, 483184, -2907693, 5175973, 5660230, --2302103, 202937, 1690607, -1453310, 4345433, -1626719, -1887101, 208306, -387621, 3879429, -3149822, 1447404, 773631, -3640522, -1656247, 4308389, -1210107, 1197759, -868657, -2005213, --2586107, -2677375, 2293513, 4832, 453119, 921271, -1221381, 1274532, 2755759, -5076115, --1198833, 2038499, 479963, 2065342, -276489, -4689031, -1698123, 2646774, -2906082, -284005, -2043331, -1753420, -463320, -839666, -2774549, -756451, -2180233, -988916, 217970, -1457068, -162135, 409633, -343061, -1260573, -881005, -2870112, -2877628, 10940355, 1263257, 2972654, -1030792, 1570884, -2653753, -6599754, -1296006, 3500398, 1224066, -3266860, -484258, 2674154, --716186, -3939022, 1158567, -4542465, -2845416, -146029, 1214939, -1299228, -1062468, 2803540, --3954591, -107374, 455267, 1876364, 1457068, 1421097, 4736812, 2136746, -5996848, -1544041, --2756832, 721555, -210990, -485331, -3804267, -4920422, 6402723, -3029026, 1514513, 1832877, -1549946, -6190122, -3562139, -1666984, 598074, -545998, -274878, -635118, 946503, 2261837, --3301756, -93416, 1620813, 1908576, 2283849, 777389, -68183, 2200634, 700617, -1127966, --424665, 3619047, -2927557, -3100967, -1743220, -1352915, 3041911, 1705639, 580357, -1415192, -2889976, -1620276, 1374926, -6254010, -3696356, 2615635, -6028524, -8622684, 1730872, 719944, -1125818, 1244467, 1282048, -7395934, -1129040, 2148021, -4601521, 4933307, 4879083, 4124242, --1562294, 401043, 1217623, 3177202, 830539, -67646, 739271, -2091649, 2113124, -716723, --643171, -941135, 6216965, -3549254, 2254321, -2203855, -1808181, -1960653, 1781875, 3425237, --3364570, -1651952, -1730335, 2557653, 2490007, 3832722, 2722473, 646393, 3461207, -2588255, -2183991, 922881, 1098438, 6977711, 1873143, 3569655, -5274220, -1262184, 2602213, -2521146, -2970507, -915902, -1688996, 1040456, 4456029, 3090766, 2301566, -609349, 1304060, 3460133, --3139084, 5318780, -55298, 4507568, -900333, 3888556, 4782983, 3988414, -644245, -4189741, --1416266, 10172093, 7781407, 5880347, 5397700, 5501316, 2719251, -718333, 159451, -2402497, --348966, 7328825, -3018288, -3669513, 5532992, 3632469, 5334350, -3770981, 1828582, -1581085, -1445793, 1994476, 3455301, 213138, -1977296, -1949915, -2630668, -1298154, -1498407, -5624260, --321586, 4290136, -3191698, -854162, 2016487, -3012383, -2165201, 2324114, -1032403, -3833258, --1568200, 1809792, -2706903, -4194036, -1432372, -1414118, 1712618, -3000035, -5332202, 163209, --549219, -1045288, 2057289, -4940823, -1875290, -165356, -1539746, 2330557, -228707, 854162, --7984344, -2823941, 5219996, -2158758, -4177393, 1088774, 1293859, 996969, -1247151, -7012608, --2549600, 7161858, 989990, 2386391, 2033130, -1459752, 14823543, 9083319, 8623221, 141734, -874563, 674847, -3514357, -7855495, -2949032, 5902896, -4463545, 2662343, 8011188, 626528, --2528662, -1021665, -1615982, -869731, 3238942, 4578972, 164819, 1333051, 1875290, 2975339, -175020, -4236985, 1290101, -6812892, -2057826, -884226, -1904281, -1259499, 825171, -1650878, --3587908, -2803003, -1312649, 267362, -1563905, -4141959, 4853850, -1861868, 310848, -1296543, --3260417, 3994857, 11125039, 2671470, -3955128, 6590628, 1440425, -2059974, 1933809, -1164473, --4397510, 2684, -1905892, 1657857, -3842922, -6467684, 132070, 1074816, -7972533, 2350958, -1471026, 4399657, 2320893, 5821292, -2144799, -3854733, -2498060, -1142998, 2591476, -934155, --5288716, 3535832, -2581275, -7846905, -11822971, -3927748, -5806259, 8398809, -1751810, -1292785, -3447785, -8207146, -5400922, 4538707, -3649649, -3832722, 10201, -577673, 1056562, 2893734, --1119913, 1171989, -1873680, -1811939, 53687, -1639604, -3291556, -592706, -551903, 3361349, -3888556, 2945811, -4129611, 1707786, 1658394, 5740224, -2855617, -542777, -1882269, -4954782, -6780680, -6590091, -2880313, -2784213, 1743220, 5107253, -4874788, 5281736, -426276, 2658585, -4901095, 356482, 3819837, -7163469, 1669132, -2990371, 532039, -7609072, 317291, -2962991, --6205691, -5445482, 564251, 4136054, 427349, -4059818, 5544266, -2524904, 3282429, -1175210, --6455873, 8435853, -5618354, -2114198, -3120831, 1180042, 3944391, 1073742, 3664681, 5302137, -3307662, -8586176, -12099460, 1313186, 1090922, 637266, 7915088, -2582886, -8457864, 863825, -1078037, -2289755, -402116, -7540889, -1388885, 905164, 1214939, 8374650, -1365800, 7504382, --1709397, -1965484, 745177, -7492571, 3310883, -2834679, 4679367, -1276142, -1787780, -2791192, --1215476, 252329, -5438503, 9648107, -6539625, -10877005, 3411278, 486405, -7457674, -2267743, --14461692, 238908, -5025112, -86436, -5462125, -4610111, 1005022, 500364, 2745021, -4654134, -3932580, -5253282, -9861245, 1171989, 3063386, -3104188, 3593814, -1782948, -5310727, -5002563, --6499896, -3314104, -379031, 1023813, -1663763, 6211060, 434329, -2129230, 1010928, 185220, -1839857, 722628, 1355599, -6437082, -4915590, 652835, -18813030, -4701916, 737661, -4776004, --3509525, -5974300, 1549410, 2140504, 4282620, -3191698, -4001299, -4493073, 2279554, 5106716, --2501819, -2106145, -1266479, -712428, 2422899, -10409927, -2559801, 6003828, 1962800, -2981244, -1156957, 5344013, -476205, -1231582, 1877975, -213675, 12912819, -5409512, 3196530, 1172526, --5367636, 1931125, 1264868, -6005438, 4409858, -8588861, -792421, 7935489, 1765232, -28454, --1568737, -5778342, -5106179, 1606318, 3400004, -2014877, 1691680, 6678674, 3252901, -2394981, -4030290, -5411659, -13339095, -1466731, -5816997, 4057670, -3699041, 9873056, 4845260, -68719, --1484985, -11958263, 3979287, 5136781, -3694746, 7988639, -5750961, 2771328, -9670656, 5061082, -3718368, -10644003, 5093831, 7533910, 18694918, 19143206, 4263292, 5426691, 377420, 2340220, -478352, 1588064, -4949413, 1934346, -2990908, 3817152, 4344897, 9530532, 1775432, -2596845, -6513318, 3968550, 7772817, -231928, 4883915, 2114198, -2201171, 1705639, 11418171, 1114007, --4780836, -3340948, 8438000, 4431870, 4076461, 7006703, -5949604, 1534377, 9273908, -10064182, --11051488, 2782602, 5874979, 8722005, -4236985, -8120173, 5730560, 1132798, -994822, 2596308, --1611150, -1947768, -237834, 12576738, -5170067, 1602560, -3557307, -3357591, -1905892, 5838471, --1280437, 14560476, 7261716, -9120363, 8471823, 373662, 3653407, 224949, 1362042, 332860, --3583077, 3346853, -13391171, -5622649, 4829154, -15519864, 3212636, -13726179, 29292750, 6223408, -3804804, -7894150, 12090870, -3364570, -1518271, -2457795, -220117, -7502771, -1587527, 4992363, -10737, -5921150, 7665980, -1077500, -5407901, 2248952, 1758789, -7888781, -13445395, 6209986, --6102612, -6358699, 515933, 999654, -4732517, 7565048, -7502234, 3223373, 5406290, -55835, -8305393, 3990562, -12644384, -11149198, -6169721, 1896228, 1291711, -8555038, 2560338, 4652524, -902480, 4262755, 3331284, -8886824, -5957120, 4104915, -12153684, -2844342, -1212255, -10373957, --7167764, -2704219, 1401233, -4647155, -13575855, -4646081, -7703024, 16008417, 6099928, 245350, -1031329, -2414309, 10649908, 15539192, 581968, 11039140, 5823439, 4511327, 668941, -3406983, --2212982, -2537252, 5664525, -6381248, -1294396, -20643224, 13948443, 22348326, -16741246, -9987410, -4641249, 4017405, -3359738, 7358890, 2048163, -6230924, -7579007, -130460, -2388002, -5421323, -2866354, -2467996, 441308, 6228777, -8224863, 1803349, 1218697, -4881231, 821413, -7779797, -1655173, 11587285, 6008123, -1076426, -3556770, -861141, -6418829, -6909529, 3610457, 5920076, --1658394, -3121904, -2102387, 3591130, 6009196, 2899103, 10853382, -5604396, 4611185, -2633352, -1298691, 6765111, -2118493, -1963337, -12370580, -1798518, -9494562, 5074504, 3692061, 12756590, --10451803, -3824669, -10078141, -17046188, -2483028, 7349763, -11442330, 2813204, -828929, -8488466, --9684078, -12695386, 17921288, 863288, 10992969, 7790534, 9598178, -3678640, -10384694, -8366597, --9060234, 4129074, -15713675, 11249056, -1028108, -6443525, 10439992, 3149822, -9249212, -14282377, --4889284, -307627, 790274, 338229, -4439386, 15505369, 7096360, 4478577, 4210142, 4689031, --4239670, 926102, 3737695, 2057826, 14825690, 1241246, -20549272, 2384781, 9466108, -8108362, --11237245, -2711735, -5774047, -3993783, 1705639, 14821395, 9706626, -1655173, 416075, -4634807, --12331925, -4536023, -10024454, 7654706, 11417634, 76236, -5013301, -2179159, -1535988, 4837207, -7662759, 7157026, -15563888, 3221762, 1566589, 1520418, 12524662, -6614787, 5782637, -5998459, --3284576, 1364189, 8694624, 13719736, -912681, -8527121, 4134980, -15488189, 13964012, 7107634, --85362, -6143951, 4994510, -3221762, -6020471, -6003828, -5024575, -5984500, -2711198, 8748848, --14868103, -2923262, 7984344, -10258529, -2150168, -97711, -2493766, -12104292, 12066174, 6695854, --10077067, -520765, -4884452, -2279554, -20946556, -1740536, -10106058, -21460878, 3827890, 4565014, --11236171, -7384660, -13066364, -12647068, 10726681, 7727720, 11341935, 1566053, 24889872, 2361158, -12519293, 19768660, -3164854, 6867116, 18157512, -11717208, 4891968, -6563247, 12160126, -2899640, -24646670, 12939663, -9043591, -10778220, 945430, 7285875, 9638980, 4248260, -10380936, -732829, -7394860, 20543366, -9103720, 14311905, -5821828, 9386651, -16135118, 7548942, -9356049, 7648263, --306016, 3814468, -4061429, 13777718, 15031312, -27780386, 7509214, 8607651, 2663417, -2783139, -1769527, -18369038, -1283122, 15064598, 15735686, -3291019, 16389058, -655519, -3513283, 1517197, -9219684, -3233037, -4226248, -1663226, -11722039, 2210298, -3337190, 18771692, 12198244, -8464307, --9251896, -17166448, -6320581, 13113609, 23053236, -10023917, 7233262, 1974074, 3194919, 12956843, -9146133, -17462800, 3802120, -5887864, -3383361, -6855305, -3750580, -7234873, -16976932, 3647501, -11940009, 5085778, 27511414, -5906654, -3297461, 19553912, -6383932, -293132, -3675955, 5786932, --20110648, -12437688, 7814693, 16357920, 23233088, 27846420, -19035832, -9280887, -225486, 10040023, -1611, 31634582, 9475235, 5724118, -22621056, 2873870, 1362042, 12765180, 16276852, -9750113, --2208687, 6162741, -3174518, 1595044, 18918258, 7838316, -14560476, 6167036, 11390790, -6849399, -22504554, 4734128, 30258582, 15921444, -9280351, -1566589, -29944512, 3337727, 6602976, 3110093, -42059540, -4347581, -4301947, -17823578, -17395692, 7832410, -14410689, -7045894, -10004589, -4902169, -9675488, -5851893, -13330505, -9457518, -71941, 11965242, -14941117, 4302484, 5253819, 2574833, -14513768, -615254, 179852, -14606110, -23292682, -7951058, 9145059, -11053098, 1921998, -9074192, --39904540, -19670950, 10570988, 2086817, -23339926, 4697621, 29906932, -154082, -1915555, -10816338, -5654862, -12056510, -25094420, 1918240, 2465311, -7965017, 3394635, 10352482, -3456375, -6477885, -5182952, 9746891, 14228153, -7573638, 10300405, 16372415, 4846334, 27459336, 1356673, -14793478, -17296908, 2571612, 1270774, -2014340, -6084895, 13289703, -14703821, 736587, 15426449, -21738440, --24663312, -27788976, 38511360, -21059298, 4329864, -516470, -13374528, 20635708, -24381456, 10802916, -40894532, 26363584, 5010616, -33306934, -2899103, -21793200, -12375411, -19871740, -3000572, 6343667, --4772246, 16581795, -8853001, 3168612, 6774237, 22928146, 1917166, 3556770, 25927106, -17452062, --3827353, 12403866, -6579890, -13475460, -10606959, 14073534, -13375065, 6105296, 21769042, -6129455, --43492448, -2234994, 8880919, -51203528, 29399588, 24267102, -21304112, 32231046, 19810536, 14526653, -31207770, 973347, 14994805, 2215666, -139050, 12188043, -23341000, 21270288, 26136486, 22233972, --25262460, -4156455, 28606092, -14914811, 21875342, 23204098, 50041736, 32680406, -1822677, 4406100, --11030013, 7820062, 4486630, -28810640, -50102404, -9320616, 23591182, 30049202, -58759448, -53081500, -22717156, -15126875, -17430052, -6858526, -21002926, 7280507, -33662344, 41531260, 14784351, -17390860, --1275068, -17090212, -13708462, -13884556, -16670379, -10442676, -40805412, -36056788, -7847979, -8582418, -994822, 2815351, 5546414, -3168075, 3626563, 5888400, 16137266, 18699214, -8985072, -10839961, --13281649, -10889353, -24254754, 32241782, -13703093, 6852621, 22810572, 22033182, -11025718, -11611981, --20941724, -13983877, -17729088, 23825794, 216896, 1141924, -34463892, -13483513, 43096240, -6862821, -39734352, -11264625, -19283866, -12970801, -21620866, -21683142, -7192460, -3224447, -29637422, -1629940, -7665443, -5207111, 4554276, -63539748, -29475286, -21729850, 24715926, -13489419, -2703145, 3544959, -39042864, 4756677, -19370840, -32320166, 65497716, -22164178, -11268920, 36399312, -22439594, -37750616, -35245040, -50286012, -12506408, 10074383, 10014790, -35475892, -11715597, 27843736, 1845762, -7131793, --17346300, 21602074, -21082920, 188442, 19758460, -7322919, 18291192, -1148904, -6478422, 4317516, -5663988, -11099806, 17504140, -9856413, -1778117, 3565360, 1435056, -129923, -1211718, 3608310, -11764989, 15145128, 25052008, 10428717, -7861938, -3638911, -13017509, 12748000, -3159485, -22209812, -6761889, -721555, -10423886, -29939680, 22273700, 859530, -11800960, 32353452, 3575024, -10775536, --4310537, 48367776, -44113608, -49609556, 31527208, 46513960, -84973784, 207769, -30677878, -29133300, --11729019, 31490164, -23427972, 41839960, -5440113, -548682, 55707336, -14940044, -44533444, 53691924, -52155936, 39657044, -19358492, -22463752, -8167954, 7718593, 37164352, 30606474, -11577621, -1319629, -10625212, 33271502, -11906723, 81604, 17904644, -22844932, -22641456, 18898392, -12640626, -6433861, --11723650, 1111860, -18435610, 3481608, 10468983, -5029944, 7814693, -5822365, -6304475, -2768107, --24917790, 5931350, -10799158, 17015050, 29844118, 4289062, 14295799, 15500537, 32749, 8645232, -8574365, 35818416, -24414742, 18932216, 12882754, -13699335, 10187126, 14301704, 2420751, -11477763, --30996242, -26583700, 8917963, 14746233, -12481712, -46430208, 40079024, -9423695, -23196582, -8042327, -40334036, -14313515, 44208100, 5616744, 14169634, -36399312, 39229156, -11545409, 16826072, 2357937, --59235652, -9335648, 10591389, -25224342, 36361728, 17562658, -53324704, -38901668, -26764626, 9829570, --11012296, 12731894, -19931332, -36089536, -478352, -38360500, 10133975, -2701535, -7584376, 13888314, -21056078, -13034152, 2569464, 24605330, -19122806, 33092186, -4778688, -34547108, 29953638, -13707925, --6931541, 28020366, -35089344, 10112500, 219043, 13580150, -5789616, -11719355, -53255448, 13183939, --22130892, -52119428, 64043868, -42191076, -18242874, -7477538, -14814416, -31525596, 18189724, 45540612, --27566710, 13653164, -39901320, -21303038, -22723598, 21315386, 3625489, 59519120, -9957882, -3520800, --17265232, -48843440, 209917, 25843356, -18359374, 21976274, 24906516, -19256486, 2390686, -16115254, --73817600, -37196028, -22397718, -76101992, 50333796, 67680096, 31452046, -63795832, -52476984, -115839560, -17899276, 144502560, 66134980, 30247844, -35484484, -116993296, -54767276, 39440148, -6903623, -9912248, -2044404, 17182016, 1383516, -4549444, 14528801, 3580392, 5528697, 20447802, -12598750, -1218160, -12202002, -4965519, -999654, 12487617, -11563126, -4136591, 4844723, 20234664, -13065827, -11097122, -12964896, -1663226, 7729868, -22227530, 28734404, -7718056, 10380936, -7177964, 4603668, 13964012, -7681012, -4690641, 14028974, -6104223, 14172318, -11517492, 275952, 12361990, -2064806, -6841346, --26284662, 1546725, 22217866, 962610, 10998874, -15122580, -3286724, -9598715, -7569880, -4911832, -16447577, -6970195, 10507101, -13489419, -13170517, -7681549, 4707284, 26385058, -9372692, 11033771, -2292439, 961536, -12084427, 5459977, 16301012, -1505386, -11131481, 7494718, -6212670, 3379603, --1795833, -8837432, 53140020, 10554882, -28481538, -20227686, -31456340, -9970767, 6053220, 16711718, --5218922, -6746320, -5816460, -5598490, -5299453, 7642895, -3875134, -1060320, -1680406, -5527086, --1318555, 8400956, 1206886, -2419140, -8382166, 9640054, -12483322, 7351374, -4451734, -12251394, -62814, 5596880, 6299107, 4926865, -7228430, 1621350, -2305324, -3960497, 14784351, -13143137, --2377801, -530965, -884226, 1386201, -2172180, -7723425, 6532109, -12242267, 11708081, -1714766, --8159901, 2824478, -4185983, 10374494, -6025302, -3686693, 11266773, -10066866, 3556233, -4832912, --1037772, 8571681, -6066105, -2475512, 7792682, -5331128, 2122788, 746787, -6152004, 15171435, --13174275, -1194538, 6007049, -3443490, 9913858, -4461398, -1873680, 2568927, -25028386, -37926708, -49657876, 154407296, 13345537, 13313862, -105246560, -133411888, -27664422, -28378996, 78596288, 133451616, -68653976, 13033615, -48258788, -94241784, -66320736, -47653200, -2390149, 64908768, 95189360, 51213192, -11841225, -33551748, -59223840, -33403034, -31887448, -30128122, 18946712, 38529076, 38234336, 38246148, -9280887, -16930762, -6825777, -25614112, -39679592, -4668630, -11832098, -8294119, 35833448, 20410222, -29925184, 17847200, -13601625, -32990718, -7904888, -21576842, -3331284, 14478335, 4483409, 7630010, -16112570, -8629126, -11594264, -3093450, -6877317, 6053757, 10305774, 44023, 12725988, 7088844, --13775571, -13667660, -21046950, -18468360, 454193, 20640540, 32067836, 14737643, 3565897, -8627516, --22477712, -5037460, -25556130, -16676821, 10130754, 5693516, 8642548, -1285269, 0, 0, -0, 0, 0, }, -{ --4021700, --5322538, -7656853, -865436, -2963528, -5371931, -2615098, -1255741, 1214402, -2573222, -5400922, --438624, 1519882, -5378910, -2807298, -1046361, -3007014, -3120831, 2367064, -342524, 525597, --2747169, -2796024, -708670, -4345433, 3001109, -4391604, 1318555, -1085016, 1723893, -2087354, -514322, 1439351, -5981816, -1072668, 682363, 6537477, -2992519, -553514, -1056025, -11811, -2509335, -905164, -2785286, -406948, -920734, 1993939, -784905, -2341831, 2424509, 2251100, -1175210, 525060, -1649268, 2951716, 2145336, -3511673, 2212982, -2488397, -1145146, -416612, --1997697, -639950, 352187, 758062, 2488934, -2017024, -1631551, -352724, 409096, -1770600, --5507759, -970663, -2046552, -1000191, -767725, 1010391, 1248225, 3432216, 2682744, -891743, -2056753, 978179, 5915244, -1031329, -152471, 745714, 4330401, -853088, -4507568, -2094870, --4327180, 1060320, -1537598, -355409, -543313, 1054951, 420907, 890669, 2511482, 4626754, --2049773, -1117765, 920197, -2157147, -302795, 3622268, -1959042, 4475893, 452045, -1564442, -2945274, -3995930, -1044751, -2767570, 3929358, -69256, -1474248, -1017370, 26307, 3727495, -122943, 4482335, 1664300, -3546032, 2900714, -1494649, -2750390, -2109903, 2968896, -513249, -9561671, 1152662, 2350421, 1899986, -4562866, 237297, -754841, 1368484, -2655901, -1496259, -4882304, 4367982, 214212, 2013803, -651761, 2923262, -4378183, 875100, 2786897, 2547989, --142808, 550293, 1317481, -7219303, -6740951, -3997541, -3865471, -3122978, 1140851, 4766877, -9338333, 1950989, 2336462, 126702, -6833830, -2669322, -2593624, -5896453, 9334038, 2667712, -3658775, 2756832, -2163590, 1135482, 8943196, 3783329, -2195802, 16106, -2259153, 387084, --4242891, 2716030, -1381906, -1657857, 294205, 5013838, 446140, 1901597, 2945274, 4393215, --7502771, 344134, 1836099, 4590247, 6605123, -3437585, -804770, -1516660, 5500780, 3297998, -3527779, -290984, 1605781, 11422466, -7074348, 1735167, 593242, -4348655, 1932735, -6196564, --954020, 2055679, -1498944, -9490804, 2679523, 1093069, -2778307, -2309082, -582505, -1035087, -3186329, -2660195, -1571958, 1471563, -332323, -2528662, -432181, 3039226, -4473209, 927176, --1577864, 9697499, 1118839, 3308736, -176631, -2940442, 445603, 6720550, 3805341, 4233227, -7450695, -3479997, 287226, 6728603, 2452963, 2786360, 601832, 560493, 4310000, -4032974, --907312, 4905390, -3370476, 1719598, 3148748, -2552284, 2354716, 6666863, -3154654, 2246268, -711891, -73014, 238908, -1809792, -4635881, -1837709, -3869766, -786516, 1799054, 2981244, -3659849, -1016297, -5887327, -934692, 8845485, -3637301, 1851131, -1971390, -9133785, 4968741, -1410360, 3577708, -624381, 4124779, 4459787, -8263517, 3138011, -200253, 2924336, -1025423, --5528697, -712428, -839666, -1464047, -1136556, 3049427, -162672, 231391, 6907918, 935229, -5370320, -236760, 148713, 720481, -3696356, -5084168, 16073378, 9373229, 13708999, 4729833, --6036040, 3155727, -2855080, 574989, 1076426, -11720966, -3460670, -3115462, 2767570, 4820564, --2241436, -138513, 1242319, 500364, 8169565, -826781, -9279277, 3006477, -5528160, 4052302, -4142496, 3684008, 4875325, -1206349, -2231773, 2186138, -2003065, -2040646, 1079647, -1365263, -2710124, 4537633, -2426120, -6878927, 1729798, -6705518, -4807142, -878858, -14424111, 83215, --2886218, 5383742, 4642860, 2428267, 7938710, 8468602, 3195993, 1788317, -1246077, 278099, --168041, -4045859, 7275675, -1240709, 2055679, -2724083, -3779034, -1318018, -5331128, 3762928, --2932389, -1954210, 6918656, -6796786, -2942590, 1328756, -4012036, -1252520, -1387274, 2362232, -1888175, 1780801, 3642132, -6749004, -13741211, -5650567, -936840, 1483374, -1214939, 3779034, --387084, 6438693, -5725729, 3148211, -983548, 12306155, 5970542, -3373697, -4925254, 2412161, --7249905, -4759898, 3618510, -3331821, -4075924, 8337069, 4319664, -1084479, -3497714, -6135898, -4395899, 2331630, 3446711, -817118, -747324, -4009352, 5886253, -7413114, -2279017, -891206, -5528160, 3149822, 326418, 4791573, 1363115, -3077344, 1791001, -3064459, -1888712, -3582540, -4505958, -3330747, 657130, 4436165, 8222178, 7080254, 3916473, 2158758, 321049, 3783866, --888521, 5687074, -195958, 3445101, 3983582, -3066070, 1299228, -3293703, 4068408, 2172717, -2186138, -1397475, -3985730, 3297461, -4284230, -1015223, -4488241, 2033130, 1735167, -712965, --1879048, -6794102, -13875966, -11436424, 827318, -9795210, -4636954, -13819594, -7164543, -8483097, -3433290, -4605816, -5811091, -2185602, 438087, -3679176, -13171591, 3400540, -2239289, 1163399, --5903433, 5818070, 2330020, -46171, -5240934, -2570538, 6906308, 4441533, 410169, -1212791, --4451197, 2637110, 1585917, 2731062, -5347771, -729608, -4320737, -4210142, -4221416, 212601, -8928700, -7430831, 280784, -7100655, 832150, 2918967, 4132832, -7495792, 7403987, 8520678, --2750927, -2400887, -1372779, -667331, 2980171, 3221226, 1075889, 2066953, -4081830, -1207960, --1357747, 7187091, -2107755, 7970386, 89121, -3027415, 7047505, -1186485, -3587908, 900333, -7761543, 7767985, 16643, -3271691, -3662533, 2135673, -11063299, -10514617, -12678743, 3902515, --10315975, -3945464, 9430138, 4964982, -11177116, -488553, -142271, 5048734, 6895570, 12453258, --3554086, -4141422, -12254079, -14483703, -8958765, -2717104, 5749351, -5728950, 2631741, -8240432, -8561480, -6121939, 6821482, -3038689, 725850, 2097555, -1695975, -6034429, 9679783, -8345122, --715112, -4335770, 932008, -5092221, 937377, -21275658, 51003, 10271951, -13117904, 3180423, -8442295, 3398393, -6993818, -487479, 10209674, -12731894, -383863, 5570573, 4748087, 5249524, --2239289, -1628866, -8779450, -3921305, 3045132, 5973226, 8708583, 11365020, -16833050, 6460705, --5420786, 1411434, -12069932, -4508105, 8950175, 2484102, 667867, -6235219, -744103, 6164889, -3528853, 2566780, 1200443, 12942347, 21376590, 12017318, 13906567, 2212445, 4886599, 18901078, --668941, 649077, 12801150, -6209449, -47782, 3794604, 6342593, 10719165, -8725763, -12233677, -6720013, 3875671, -7237020, 1639604, 4321274, -2637647, 2450816, -6524592, -1576253, -7634305, -2310156, 8575976, 2553358, 7534983, 5649493, 6163815, -14736033, 918049, 16998406, -1872069, --373662, 16076599, -2163053, -381178, 2292976, -1901597, -527744, 9015673, 13774497, -13360033, --2267206, 2959233, -4217658, 6684580, -2199023, 926639, 977105, -2636573, 12156905, -1198833, --4441533, 4965519, -4588099, -7144678, 2653216, 8809515, 3197603, -335544, 1779190, 8619999, -4294431, 7916162, 2359548, 1854889, 224949, -5768141, -1016834, -3892851, 36006320, 5239323, --962610, 14496, -17552994, -4834523, 1517197, -3789235, 7522099, 3653407, 12297028, -1287417, --98247, -2370285, -5357435, 8666170, 1479079, 3534221, 4607963, 6889128, -6199249, -5804649, --7191386, -4577362, -4124779, -1379758, -9833864, -1493038, 15850577, 7925826, -3003793, -599685, --1837172, 1816234, 5657546, -2231773, 22711250, -3401077, -544924, -9722195, 4196720, 10468983, --1596654, -6955163, -862752, 4446365, 7722351, 3944928, 10816875, 16630113, 5357972, 393526, -9648107, 8500277, 3091840, 6783364, -19639812, 5459977, 760209, -16673063, 6706592, 539555, --7303055, 5963562, -7746511, -6733435, 9614284, 8491687, -3836480, -14292041, -6733435, 5106716, --8655433, -304406, 4111358, 16976932, -2643016, -18473728, 11382737, -1491964, -13090523, 253940, -10566156, -12103755, -3395172, -9597641, 6205691, 3017215, -4475893, -3614215, -2236067, 7721815, -4648229, 3797288, 6562710, 7153805, 34897, 8478265, 8143795, 4493073, 4255239, -8012799, --4926328, -5290863, 4958540, 8114267, 2029372, 3169149, -4747013, -2132988, -3093450, -1313186, --8048769, 7931194, 1126892, 1477469, -8535711, -1368484, 12443057, -8185671, -10271951, -14055817, -4931696, -10240276, 16167868, 20242180, 12857521, 8884677, 483184, 16140487, -8094403, 12983686, --1678795, -7065221, 529355, 2028835, -17959942, -6592238, 6818798, 2481954, -2839510, 4234838, -15406585, 11901891, -16747151, -2668249, 577136, 1386738, 6254010, 9408663, 1642825, -11490111, -9084393, -4578972, -15275588, 793495, 2619393, 9265318, 3007551, 24927990, 4943508, -11401528, --2575370, -9716827, 17124572, -21623012, -981400, 13648332, -30602178, -13188771, -9722195, -11763915, --19970524, 1227824, -2728378, -9701794, -193810, 9145059, 2207076, 577673, -5182952, 1721208, --1088774, 1709934, 1026497, 840740, 9089761, -2676838, 552977, 15673946, -9528922, -2850248, -3926137, 13404056, -6295349, 19444928, -4961224, -8855686, -16090558, -23169202, -5357972, -17428440, -9375914, -5787469, -11296838, 996432, 3313031, 8526047, 9140227, 2545305, -232465, 27801860, -17183090, -2531883, 4217658, 9035537, 8780524, 4008815, -2344515, -1292785, -3559991, -7381438, --4559108, 3585761, 23860690, -16231218, -2227478, -9440338, 17440788, -12125230, -13049721, 7622493, --6276558, -22441204, 10657424, -6254546, 8326331, -6036577, 10660646, 8413304, 8694088, 15871515, -1583232, 13493177, 4278325, 3864934, 7832410, 3531537, 1417339, 1102196, -1395864, -7778723, -6267968, -16282758, 6211597, 2148021, -5923297, -8627516, -1410897, 6811282, -8676371, -2791192, --12414066, -4023311, -15035607, 1140851, 6209986, 105764, -3178813, -8502425, -16614544, -10830297, -10345502, 4105989, -6506876, -8597451, -3765613, -621160, -16526497, 12588549, 9647570, -14612552, --16051367, -23314694, -5491116, -27939300, 5443871, 10660646, 3535832, -1982127, -5846524, -3205656, -8980777, 11113765, 10714870, -9233106, -9700721, 8194798, -6876780, -5080947, -19615116, 6029597, -9728101, 13612899, -7461969, 20824148, 27094802, -11523934, 872952, 5582384, -19298362, -5177583, -27329414, -398895, -26606786, 1810866, 10205916, -1929514, 11362873, 21875342, -7860327, 19675246, -12968654, 16637093, 6681359, -14818711, -12826383, 10510859, -11444477, -21853868, -4228932, -25733834, -7251516, -2743947, 10617696, 6449967, 7293392, 1731946, 969589, -336081, 14526653, 5098126, --22083112, -3819837, 10204305, 14546517, 10825465, 18270254, 19583978, 12641162, -4118874, -3249680, -5971615, 34094524, -12205760, 1661079, 9962177, 12838731, -3025805, -20349018, -1347009, -5789079, --8868034, -22407382, -20527260, 5567888, -10059350, -10852309, 9376450, 17587892, 26296474, -534187, -2437394, -1311576, 21541408, -13033078, -1658931, 19388556, -17620640, 808528, -11848204, -14276471, -8198556, 5497022, 11125576, -13237089, -32697050, -6543920, -12020540, -9512279, -7508140, 2428267, --11825119, -8253854, 2094333, 8033200, -7775502, 17772574, -2768107, 12226161, -6633577, 295279, -8754217, -12890271, -9623411, -3746822, 13522705, -2516851, -16840030, -5027259, 1449015, -6729677, -5645198, -9674951, -11671037, 16553878, 3563212, -11355894, 6527814, -501974, -10696616, 43487, --17103096, -12877923, 1765768, 25169046, 8753143, 8526047, -20384452, 15919833, -2735357, 12430172, --7789997, -12497281, 5504538, -23891292, 19707994, -32700270, -22458920, 8792872, 17410186, 2422362, -21030308, -8735427, 4594542, -14436996, 19539954, 7669201, 14118094, 8099772, 2153926, -3925600, --6823630, -9194451, -5394479, 438087, -20118164, -9387188, -1168231, -23768350, -2788508, 5523328, --24133422, -22043382, 1902671, 9360881, -11575474, -50193136, -10873783, -124554, 6206228, -16927002, -1069984, -9419937, -2410014, -13520557, -15608985, 13480292, -15219753, -18087718, -3571265, -12692165, --14458471, 4723391, -20787642, -6790880, 11595875, 27802934, 21930104, -1241246, -14427869, 4631049, -19612968, -1170379, 12778601, -4144644, 16252156, 9260486, -18272402, 27469538, -22031572, -11580842, -17853106, -21057688, 5318244, -5212480, -16475495, 1311039, 22542672, -5451924, -14868103, 8189966, -10465762, -1011465, 3647501, -34586836, 6986838, 608275, 15832860, 7388418, -16151761, 13786308, --9284109, -2331630, -15209553, 6168110, 18294950, -5335960, -5563057, -21693342, -30513596, 14872398, --4006668, 11606075, -17888538, 10473815, 6993818, -20547660, 17673790, 20352240, -52646636, 20673826, -24728274, -5301601, 16811038, 1144609, 8092256, -2834679, -11847130, -5479842, 9634685, 3924526, --16115791, -8279087, -2653753, -5592048, -5078262, -221191, 30481920, 7767985, 5754183, -18256832, -12397423, -12588012, -1072131, 3876208, -22751516, 11455215, -9241159, 2560338, -9976135, -14068165, --862752, 11775190, 28142774, 12072079, 1766842, 19710142, 6410239, -672699, 1689533, 2005213, -3829500, 4552129, 18646600, 10332618, 4708358, 4918275, -3897683, -4549444, -21004538, -14810121, -926102, -628139, -13510357, 3498788, 13336947, -20659330, 20294258, 7487739, -9465571, 1057099, --7320772, 242129, 11605539, 7901666, 2665027, -13007308, -4826470, -18454400, -8310225, 8438537, -5504538, 10401337, -11784853, -45381700, 70447664, -69694432, -31921808, -15772194, -5095442, 41091024, -11675869, 45956152, 11065983, -9227737, 35689568, 15725486, -12634720, 17003238, 14867029, 8624294, -13856101, 13929116, -12876849, -19985020, -14758581, 2291365, -13640816, 6866042, 3529390, 8886824, --2002529, 6089727, 1454920, 22354232, 4664335, 1950989, 6220724, -5442261, -1051193, 7702487, --14879914, -20335060, -14448807, -11983496, 1148904, 5599564, -15035070, -2698850, -9445707, -35225712, -16537772, -6781754, 7834557, -18846316, -7301982, -17558364, -24372866, 8095477, 4944044, 21846352, --2262911, 19073412, -9803800, 15742666, 495532, 22755810, -18448496, 13545253, 15971373, 8443369, -8367670, -679142, -9354439, 26068304, 16213502, -4008278, 30702036, 5394479, 150324, 10875931, -13377749, 43274480, 3704409, -25851408, -38186556, -20047296, -15858093, 5414880, 31782222, -170188, --13169980, 28717226, 2595234, -22377854, 20891794, 22878754, -3712462, 214748, -1734630, -19531900, -22982370, 2056753, 13314399, -6267968, -17415018, -30525406, 6380174, 5016522, 5565204, -3310883, -10643466, -9241696, 672699, -18850612, -24293408, 10257456, -2285460, 9539122, -2687576, -7676181, --21772800, -33563020, 19158776, -17848274, 9186935, 19027778, -63351, -6919729, -16182900, -10171019, -41890428, 11741904, -615791, 7961796, -4105452, -13581223, -4103841, 26669600, -21502216, -35074312, --12093017, -8622147, -52475912, -38177428, -21349746, -19209242, 6994354, 4269735, -17601312, -30960272, --13256417, -11581916, -11531987, -3931506, -7104950, -15049029, -21485574, 23079544, -20298016, 30895310, --4732517, 29511258, 40647032, -6437619, -46569792, -42653856, -10645613, 22382686, 1722819, -33162516, -25939992, -4556961, -23716272, 29146184, -53305912, -9598715, -807454, -7858180, -9053254, 64742872, --27562416, 60770568, -3917010, 13916768, -5332739, -22005802, 37120864, 11541114, 38682624, -25626460, --27492086, 10100152, -43799540, -11425150, -7603166, -28458454, 61672508, -3935801, -65174520, 512712, --29282550, 9920838, 15525770, 27417460, 20747914, -24012626, -16167331, -38197292, -11713450, -16867948, -17071422, 12787191, -1961726, 13259101, -7591355, -26606786, -10995653, -31287226, 34478924, -23793046, --16559783, 31950798, 8473970, 52927956, 26489748, 6354941, 29154238, -34139084, -10762114, -35035660, --32727114, -2782602, -402653, -41871636, 54322748, -2647311, -84989888, 44071196, 9744207, -17892834, --14095009, 27417998, 14566382, -15905875, -4742718, -39370892, -16942572, 17445620, -34700116, 1862942, -5936182, -9948755, -23205708, -15065672, 30709554, 13074417, -6428493, -43776992, 14850386, 28713466, -15952582, -33655900, -23132694, 967978, 37287296, 4213900, -9250823, 6832756, 1028108, 20134270, --50117436, -42155104, 53289268, 9406515, 22187802, -49677204, 10894721, -1032403, 37091336, -32088238, --6590091, -49555868, 17625472, 38278896, 8393440, -21013664, 14366129, 55094228, -24168854, -23545010, --20255602, 9629854, 1891396, 49004504, -14352170, 6009196, -25664578, 10932839, -28173374, 2026151, -17157858, -31283468, 32324998, 13733695, -24879134, -33117956, -23793046, 3170760, 31901406, -54020488, --15207405, 63221920, 56377352, 28223304, 13442174, 12547210, 14028974, -9262097, -8183524, -19209242, -3024194, 5760625, 5610301, -1405528, -31464394, 15134928, 7036230, -22591528, -18224620, -9895068, --10321880, 8152922, -7493108, -9625022, 3578782, -890669, -16233903, 21822192, -14842333, -5110474, --15434502, -14794552, 11565810, -6252936, -1209570, 5611912, 7910793, -1631551, -20753818, 5390184, -34904664, 7504382, -52148420, -3037079, -10497974, -16136729, 12265353, 12458626, 28609314, 13793287, --33582888, 38242388, -8199093, -25358024, 79478904, -14968498, -5550709, -24906516, -61112016, 29586956, -32817846, 11647414, 13140989, -51866024, 16690780, -2586644, -11678016, -7567196, 3374234, -2969433, -9596031, 12581570, 3491809, -5006858, -13918378, 19609746, 21568252, 32215476, -30353608, -77912856, --127658240, 8096550, 131210712, 9712532, 277941824, 277607904, 101380552, 278103424, 162358896, -51828444, --6031745, -30348776, -215721712, -182449680, -126938296, -227640240, -214977072, -66859220, -137009456, -123141008, -22080964, 29525216, -33563020, 33033668, 55111408, -8930311, -1786706, 111039936, 73708080, 20485920, -81730008, 155786512, 70354784, 80175768, 197344624, 69063072, 27357868, 164954128, 161349568, -6845641, -98422936, 179189792, -12230993, 32870458, 101640400, -22295712, -109273096, 27588722, -36014376, -202095392, --187093072, -177784800, -321783232, -470911488, -332511552, -460994400, -602850752, -437514912, -357588224, -479588928, --315460512, -173039408, -165894192, -64977488, 95526512, 223822016, 260847328, 355200768, 503006176, 482404288, -452136032, 502134304, 496818208, 363852448, 247115776, 142944560, -27574764, -27306328, 0, 0, -0, 0, 0, }, -}, -{ -{ --2313914, -1927904, -5349382, 1587527, 2429341, 27917, -2440078, 324807, -826781, -2805688, 7335268, -2345589, 2139431, 4487167, -2088428, -465467, 420370, -3085397, 5737003, -2183454, 597000, --3279745, -700617, 3382824, 29528, 252329, -1219771, 466541, -4053912, 4246649, -3253975, -951335, 2710124, -577136, -2592013, 4911832, -60130, -4220879, -510564, -4885526, 2048699, --5196911, -2491081, 529355, 1159641, 803159, 1119913, 2338610, 3609383, -427886, 2384781, -2505040, 1815697, -67646, -2026151, 2518998, 688269, 1548336, -2685428, 4915590, 3955128, --386010, -2535105, -408022, -200790, -955093, -2917357, -5924371, -979789, 3772055, 3449933, -1532767, 7355669, -1255741, 218506, -2921652, 10228465, -406411, -570694, 3279208, -1360968, -3738232, -2011655, -4784057, 1644436, 4806069, 665720, -754304, 6337761, 203474, 210453, --2198487, -1272921, 9928354, 1322313, -6787659, -5063230, 6982543, -711354, 7235946, 434865, --1433982, -766115, 5441187, 1002875, 11478837, 4993437, 3106335, -716186, 2485176, 5122822, --1371168, -3995930, -4984310, -1045825, 4303557, 3677029, 5767604, 1533840, -3411278, -3543885, --1557463, 2327336, -932008, 1217086, -825707, -5374078, -4207994, 1455994, 3639448, 2199023, --2090039, -2319819, -358630, 5538897, 2673080, -803696, -1528472, 2457795, 1510755, 934155, --3214246, 1245541, 2398202, -591095, 3794604, 4661114, -9068287, 2843268, 1196148, 5211943, -2711198, 4661650, 9530532, -7705172, 1611150, -1548873, -49929, -9943923, 860067, 6283001, --9163313, -1674500, 5870684, 16172699, 2144263, 92342, 994822, -9801652, -459562, 7584912, -6415071, 392453, -335544, 824634, 3313567, 5975374, 5946919, 6780680, -3040837, 1647120, --505732, 2762738, 607201, 1869385, -10248329, -2538326, 1495186, 1079647, -5697274, 76236, -3757560, -4204773, 3461207, 3525095, 5952825, 3091303, -2347737, 3284576, 6678674, -3469260, --6096169, 2337536, 1389422, 1497333, 3178813, -2365453, -4897874, -6975027, 5928129, -734976, --1343788, -2007897, 2648384, 302258, 3905736, 7991324, 1629403, 967978, -288837, -1329829, --5767068, 9746891, 2413235, -434865, 4883915, 102542, -4664872, -4219806, -5072357, -7426536, -4184909, -195421, -3423089, -1498944, -1714766, 1482838, -2837900, -5144297, 1212791, -3388192, -8660802, 11308112, 9097814, -6376953, -184147, -540092, 2470143, -3602404, 7138773, 4310537, --967441, 3293703, 5418101, 290984, 1340030, 1728188, 5256503, -652835, 1971390, 6095096, -659814, -233539, -2712809, 4332012, -6782290, 2572686, -944356, -1574106, 4529580, -4558571, --557272, -35433, -5917928, 2258079, -1210107, 2532957, -217970, -2763275, 1758252, 1661079, --357556, 5021354, -432718, 5818070, -162135, -4270808, -1879048, -25770, -2855617, 5127654, -2683818, 4347581, 5090073, -2602750, -5414880, -3728569, -284005, -1324997, -1494649, 3877282, -4817343, -1307818, -15266461, -3415036, -4859756, -8027294, 2633352, 2287070, -1128503, 3946538, --682363, 3352759, 4373888, -1848983, -5445482, -6520834, -2702608, -6064494, 323733, 826244, --2867965, 3661997, -3204583, 2027761, -1556926, -3402688, -9581535, -3525095, 664109, 1615982, -2295660, -3362960, 2318209, 3918084, 1068910, 8719320, 1949915, -85362, 6457484, -4563403, -3645890, 766652, -2433099, -3046743, 4085588, 711891, 1149441, -9998147, -2079301, -3212099, -9966472, 4502200, 3445638, 4271882, 4446365, 3841312, 4948339, -2597382, -1355062, 3326989, -4839355, -530428, 5683853, -3039763, 1025960, -1118839, 4748087, 7728257, -12091944, 3291556, --3243237, 605590, -5912023, -2587181, 548145, -1340030, -2795487, -4186519, -2434173, 5993090, -3534758, 2236604, -1202591, 587874, 565325, 7729331, -6124087, 7759396, -1082332, 4286914, -7773354, -4778151, 6012418, -3662533, 3061775, 1327682, 9161165, 4220879, -5175973, -8288750, -1880659, -6168110, 5167920, -1128503, 6750078, -4878546, -855772, -3862786, 2309619, 1703491, -1913408, -301721, -747324, -7154879, -3256122, 6286222, -4851166, -744103, 3920232, 435402, --3799436, 1494649, 322659, -573915, -3295314, 6913287, 2095407, -9130564, -4275103, -7296613, --1352378, -6397354, -11633456, -2289755, 5043366, 14682883, 3099893, 1580548, 6706592, 245350, --5320928, -4162360, 3709778, 1950452, 2470680, 4647692, -10215043, -1928440, -9436043, -1434519, -2434710, -3015067, -8865886, 1632088, 3300682, -979253, 16563541, 3809636, 12031814, -5682779, --645856, -4063039, -780610, 12572443, -10650982, 3549254, 1376537, 16507707, 8982924, 10941429, -2174864, -2782602, 5362804, -3656091, -13561896, 2585034, 966905, 1592896, 11020349, 1020592, --6165426, -559956, 488553, 3446175, 3957812, -302795, -1203128, 4453881, -4956393, -1381369, --2396055, -1271310, 1567126, 267899, 9774272, 1455994, 7729331, 8730595, 2632815, 7725573, --318901, 2644626, 4878009, -4859219, -7215008, 1091459, 7769059, -11839077, 3825742, -9027484, --8362838, -5075041, -2142115, -7882339, -7613904, -8067023, -4031364, -1799054, 5802501, 430034, -6892349, 1333587, -5324686, 8784819, -8613020, -2939368, -3513820, -3170223, -4585415, -5623186, -8742943, 7454453, -3863860, -8243116, -9578314, -4633196, -6139656, -2310156, -2924336, -10045392, --9237401, -6641630, -1795296, -39192, -2039573, 7964480, 32212, 4380867, 4945655, 7190312, -305480, 13515188, 15484431, 200790, 3934190, 4191888, -2756295, 7620883, 3049427, -14083735, --1306207, -4548371, 6979, 11777337, 3633006, -11185705, -3979287, 5667210, 4250407, 1179505, -14013941, -5733245, 5072357, 6544457, 5674726, 4332549, 6741488, -12719546, 3773666, -4712116, -6731288, 701153, 2245194, -9471477, 6083821, 5639829, -2487860, 5462662, -2122251, 1786706, --1430224, -4793184, -68183, -2949032, 1729261, -3732864, 3456912, 1903207, 10933913, 9760850, --4866198, 3658239, -12529493, 9343164, -5235565, 5801964, 6994891, 9839233, -3170223, 9879499, -806917, 8540542, -7601019, -2024540, 6860674, -3659849, 11730629, -3752191, -8215736, 15517180, -21168284, 4675609, -8280160, 5815386, -4333085, 8658117, 5117991, -1908039, -8762270, -5800354, --14945949, 3919158, 6507413, -13281113, -1471026, 7690139, 2130841, -665183, 447750, -1649268, --7035694, 1719061, 9068823, 334471, 2103997, 3190087, 12812961, -8349954, -10201, 9123584, --8140574, 12263205, 911070, 17248052, -14098767, -13037373, 7468948, 571231, -1363652, 3640522, --789200, 4727686, 3401614, 9519795, 9659918, -7693897, 1932735, -5085242, -2379949, 5605469, --34897, -3140695, -514859, 67109, 9477919, -16687022, 13525926, -4219806, -4445291, 8935143, --6148246, 6986301, -8461622, -6327561, 172872, -8610336, 199716, -10551124, -7898982, -3605625, --7409893, -11509975, -2325188, 4032438, 14067629, 2150705, -8392366, -15789910, -3214783, 4713727, --2691334, 16659104, 5330592, -6110128, -11854647, -15034533, -28119150, -2484102, -3082176, 10586558, -7996692, -5975910, 744640, -4685273, -2429341, 9883257, -265751, 285078, -1238024, 11212012, -1934346, -3732864, -586800, -732292, 3084324, -10777147, -3320547, -4460861, 16496969, 3478387, --17430052, 4080219, -9073118, -5514738, 2503966, -16652662, 4970888, 11156178, 10273025, 7514582, -1888175, 2654827, -615791, 1056025, -10308458, 2977486, -16093779, -3877282, 9018894, 2437931, -9225053, 8221641, 7473243, -6405944, -11992086, -11681237, -8215199, 962610, 2897492, 3443490, -5036923, -1495722, 3051038, 7043210, 8249559, 14565845, 16900160, 12199318, 20891794, -9771587, -14858439, -12711493, -9933186, 10985453, 14081050, 16587164, -17076254, -96637, 4360466, -12676596, -6058588, -5569499, -8926016, 10251013, -13264470, 14471355, -13630079, 13558138, -9756555, -3613141, --815507, -17908404, -2395518, 19771346, -4952098, -14107894, 3131031, 9188009, -10177999, 5115843, -21494164, 11502996, 4465156, 9466108, -11150272, 7560753, -6625524, -19450834, -5727339, -5078799, -1635846, 8836895, 11112154, -4820564, -8309151, 7779260, 299037, 5954972, 3980361, -3165391, -1355062, -7736847, 1496796, 2466922, 246961, 2545842, 17965312, -2170569, 2173254, 5038534, -1539209, 2181844, -8376797, -9747428, 7457137, -11582453, -15022185, -16481937, -13032541, -21954800, -8137353, 27404576, 14153528, -5703717, -21055540, -7965017, 1891933, 2541010, -3666292, 10121090, -7675644, -8298414, -3512747, -1512902, -13719736, 19364934, -8472360, 6602439, -1087164, -5133560, --16807280, 5236639, 4199405, -2629057, 2700461, 7323993, -2230162, 18921478, -3719979, -3427921, -16804060, -2280091, -10963441, -10861972, -19396610, 2268817, -3781719, -6728067, -3688303, -15221901, --5463736, -14301167, 2183454, -12666395, 11687143, -7412577, 516470, 2827162, 2119030, 5721434, --5050345, -15530602, 7271380, -2396055, 4511863, -4058744, -678605, -346819, 15181099, 20598664, -6685654, -7687992, 8286066, 6722698, 9405442, -4727149, -6289443, 9511205, 6060736, 12888123, -4255776, 1688459, 1195612, 1282048, 13578539, 9124658, 9250823, 40359272, 2323041, -12416214, -35951024, 16276852, 16638166, 28865402, 31317290, 7312182, 10886131, 6261526, 33935612, 388695, --10120017, 12774843, 4392141, -14030048, -12921946, 11217381, 13561896, 22086332, -864362, 360240, -1762010, 1854352, -12444668, 14288282, 12377559, 3424700, -9296994, 15171435, -3490735, -2297271, --20447802, -6245956, -76236, -2861522, -9985799, 6112812, -9138080, -7692824, -4625680, 1595044, --5735392, -11712376, -12252468, 13230647, -8839043, 14134737, 8899172, 11270531, 5996848, -14936823, -1410897, -23008140, -7652021, -13422310, 6721087, -16660178, -5614596, -4690105, 2679523, 13172128, -4355097, -4606353, -21438866, 7349763, 11622182, -3077881, 3554622, -15078556, 13918378, -1960116, --5121749, 25368224, 14274861, -12942347, -22985592, 6880001, 7272454, -7452842, 15408195, -16991428, -18455474, -13368623, -7356742, 5598490, 4492536, 46665356, 18622978, 6777996, -28981902, -1028108, --6646999, -15766288, -4200478, -5919539, -4821101, -1983738, -24023900, -715112, -8880382, 55835, -12194486, -13161390, 15732465, -5288179, -16661252, -15433428, 12560095, 9102646, -3419331, -8630737, -15944529, -8631811, -7502234, 11972221, 86973, 3515431, -12130598, -667867, -6922414, 15427523, --1859721, 22237730, -7877507, 3141232, 7334194, -875100, 1455994, 6630893, -13857175, -2542621, -19152870, 1291175, 5805185, -362925, -14182519, 6233608, -9588514, 5187784, 17099338, 20860120, -23898272, 24034636, -4020626, 8534637, 1113470, 13192529, 30607010, -31338228, 26423176, -12563853, -4053376, -10557566, -25418690, -4130148, 4324495, 1028108, 5124970, -17686676, -3167539, -3068754, --26825828, -19544248, 9727027, 11567421, 4349728, 8204462, -14064407, -5841156, -10168335, 29334090, -6187974, 1540820, 20739324, 13090523, 10085120, 10474888, 7730405, -14300094, 10158135, 5217849, --5347771, 9366250, -8331163, -6662568, 14209899, -5609228, 8672076, 20633560, -64425, 4721780, --1119913, 2259153, -5082557, -10551124, -15428596, -22692996, 8900783, -19007914, 6692096, 9006010, -9230422, 1308354, -317828, -1503239, -16461536, -5948530, 6840273, -3867618, 7032472, 21356188, --7221451, 16858284, 5681705, 3606699, -2197950, -3246459, -15802258, 1796907, -20998096, -3984119, -18942416, -7868380, 1196148, -30304216, 13761612, -1106491, 2117419, -17052630, -22750442, 7493644, -6690486, 20426328, -48381196, -11911018, -28729036, 9700721, -25796110, -8652748, -29234768, 7833484, --15232102, -11693048, -2473364, -24834574, -9007620, -26605712, -13415330, -30805116, 6681359, -28496034, --11242614, -14790257, -8267812, -7802882, -6624450, -27191974, -15528991, -20677046, -10589779, -5945309, -11796128, -1664300, 8815420, -16904992, -2719788, 1016297, -19486804, 3812857, -1333587, 1691143, -5145908, -19731616, -1089311, 7315940, -2421825, 8235063, 16426639, 29740502, -24692304, 1511292, -33046016, 133681, 16206522, -11635603, 20447802, 3659312, -4943508, -27606440, -16259136, 22634478, -13977434, 22022444, 666794, -15906411, 5477694, 7542500, 15668041, -30601642, -142271, 4615479, --16976932, -7085086, -7793755, -12657805, -24834574, 30673046, -2499671, -13788456, 20585778, -34854732, --406948, -7024419, 14946486, -7822209, -21533892, 18504330, -37751152, -32660542, -26951456, 15071577, --8192650, 555125, -14865419, -14154065, -16452946, 8697846, 7500087, 25809532, 11941083, 4867272, -23965918, -6961068, 8362302, -9305584, 7095286, 3877282, 13955959, 22937272, 11641509, -5498632, --15072114, -9222369, -3687766, 12522514, -5166846, 2965138, -375810, -6824703, 11544335, -1587527, -9236864, 6773701, -21110302, 15632607, 29159606, 3804804, 24109798, 23596550, 9776956, 7120519, --1413581, 11918534, -9674951, -30612380, -11334419, 20749524, -1668595, -12064026, 9222369, 29847876, --9382893, 1058173, -25058986, 20806970, 17013976, -2863133, 3075197, -11589432, 47078212, -33382096, --32917166, -27088358, 54212688, -10677826, 29489782, 55289116, -19894826, 27375584, 9758703, -32120450, -29264296, 6372121, -16376173, 24457692, 8099235, 23097798, -1774895, -16310675, 15479599, 7619272, --1492501, 7141457, -6744173, -17302812, -12956843, -7336878, -18093086, -10439992, -4701379, 14537391, --12946105, -4969814, -17846662, 5327907, -185220, 4509716, 20748988, -11442330, 3789235, -10452340, --8615168, 14796699, -11861089, -20916490, -31091806, 35944044, 13399761, -6353331, 21682606, -19412178, --20574504, -9323837, -3671123, 5599564, -1682017, -17814988, -16636019, -13407277, -36424008, -19210314, --20657182, 8996346, 9298067, 1459215, 17558364, 6275484, -23256174, -15208479, 23993298, -20469814, --160524, 26402774, -7157026, -37753300, 23364622, -11864310, -2373506, 5253819, 11489038, -26694296, -15863462, -7268696, 27055072, 19271518, -44149580, -5122286, 4278325, -26288422, -4720706, -4012036, -31952410, 23672786, 21209086, 27230630, -1408212, -18574122, -15018964, -14747844, 292058, -41544680, -4590247, 36004172, -33054068, -58693948, 5559835, -21869974, 43001748, -153008, 980863, 29234232, --13793824, 6059662, -1796370, -7871602, 24850680, -7292318, 12355547, 42496016, -31733366, -17930952, --28952912, 14088566, 1949378, 28315108, -16730508, 11013370, 1133871, 25677462, 14915885, -12989592, --8768713, 9444633, -4979478, -1583769, -18558016, -18563386, 9307731, -4600984, -5421323, -10919417, -23493472, -9636833, -9283035, 38567196, 42443940, 26359288, -35186520, -4195110, -10280541, 12773770, -53962504, -7888245, -37510632, -4091493, -12279311, 20345796, -26291106, 4413079, -21705154, 19960324, -10555956, -20139638, 34532612, 53805740, 831613, -2030446, -18957986, -18033494, 2370822, 3481608, --9759239, 48615808, -5143224, 36332740, 28010702, -36012228, -1996623, -11878806, -39759048, 10086731, -8098161, 21492554, 35438312, -871342, -11368242, 12173011, 12184822, 28821378, 10954851, 2782065, -22501870, 24944096, 7429757, -5604396, 20477330, 9715216, 24802900, 5616207, 6274947, 16282758, -26263188, -4590783, -23113904, -25241522, -9570798, -8817031, 41902776, 23651312, 65386044, -3211562, --35166120, 29533268, -11715060, -11681774, -11696270, -22897008, 1693828, 12580496, -2229088, -12948253, -45654964, -9723806, 54105312, -15633144, 28113782, 2268280, -11640435, -31101468, -46022184, 40011916, --6589554, -9184251, -15374372, -19359566, 12869333, 48737140, -28584618, -19813222, 4925254, 8100845, --4704600, 34265248, 28258738, 26786100, 10255845, 12814572, 24167780, 13538811, -7467875, -14637785, --30242476, -5830418, 18102750, 5100811, 4671314, -12368432, -28534152, -9343164, -3160022, 29381872, -1400696, -4280472, 23810224, -4286378, 7306813, 4234838, -49823768, 12428562, 14727443, -9453223, --20726438, 3592203, -27660664, -15091978, -42899208, 12812424, -35655208, -73074040, 9428527, -1362042, -52153788, -2069637, 18359374, 41997800, -5955509, -11129871, 19723564, -470299, -35931696, -12884902, -5750425, 6245420, 28068148, 11557220, 25042344, 21374978, -14332306, -10707353, 10982768, 31703838, --12333535, -5335423, -28040768, -18008262, 7480760, -36093296, 10383620, -39857296, 5872294, -6429566, --1507534, -10030359, 38351912, 42099808, 96431144, 11988864, -54987928, -40258340, -30709554, -34140160, -67239320, 91193432, 30016990, -8159364, -29277718, 1489817, -35302484, 38456600, 35094716, 11117523, -4347581, -22048752, -4148402, 42241004, 8817031, 17227114, 13179644, 44286480, 35887136, -13808857, --33681672, -42709692, -30181808, -3920232, 10842108, 39828844, 22413824, -7839926, 20066624, -29545616, --11567421, -66926328, -12090870, 66615480, 49649820, -9946071, 132584032, 42461656, 2179159, -73252280, --14423574, -5982890, -19284940, 19113678, 8257612, 16222628, 25811680, -59788092, -67262944, -32276142, --46461884, -6054830, 11664594, 54431732, -35976792, 19859392, 80760952, 42142756, 10230612, 23256174, -11975443, -52157544, -91135448, 41270876, -29368450, 13917842, -20547660, -89156008, -21260624, 49079128, -94605784, 82932600, 199940928, 104043432, 70535176, 61588220, 27681602, -12429635, -102235256, -128500592, --190778160, -146803056, -150321712, -58489940, -839666, 54990612, 104316704, 85269056, 88462904, 59854128, -82899848, 63895692, 91799560, 41895260, 32471026, 13560822, -27154394, -40804872, -60283088, -38337952, --127493960, -56521768, -121146528, -89165128, -138427328, -84695144, -129466424, -49622440, -66748624, -25806848, -4447439, 57425860, 160950672, 151998352, 216138864, 143258096, 96016144, 125458680, 174772960, 151669792, -126644088, 84594752, 2708514, -101126616, -99828464, -123179128, -223651840, -247721360, -268104208, -269902176, --294455456, -258973648, -220291024, -199029328, -135946992, -8399882, 111380848, 205813216, 279080544, 348654720, -387223520, 247036848, 212924608, 56009596, -22849762, -17192754, 0, 0, 0, 0, -0, 0, 0, }, -{ --6327561, -328028, -5092221, -1712081, 2312840, 1407676, 3224447, -4187593, 2341831, -546535, -3929895, -4642860, -2215130, -960999, -3183645, -2645700, 3153580, -3089155, 1725503, 4360466, -419296, -2439542, -1421097, 79994, 2024003, -584116, 4193499, -173946, -6439230, -145492, 1058173, -2829310, -2903935, 465467, 929324, -569083, 2788508, -506806, 3889630, 3453154, -2181844, --229244, 3512747, -7078106, -4002373, 1541893, -3591667, -805843, 1478543, -16643, 4281546, -4736275, 1091995, 2000918, 2433636, 2530273, -747324, 705985, 2312840, 3107946, 442382, --2132451, -4013647, -2622615, -83752, -431107, -329639, -5526549, 5031018, -1579474, 712965, --1739462, -3380139, 1675037, -679679, 1908576, 12936978, 565325, 2183454, 1793149, -5264556, --2747705, 7159174, 12437152, 2004139, 6609418, -2703682, 1221381, -357556, 5581847, -4473209, --10208064, 4088272, 4704600, -5950677, 6812355, 3353296, 6203007, 1949378, 1420024, -2775086, --954020, 285615, 4093641, 332323, -6381785, 228707, -608812, 1309428, -983548, 1065689, -1394254, 3690988, 2596845, 833761, 1040993, 307627, 1697586, -2005213, -3288871, -7038915, -1184874, 1459215, 391916, 5262946, -2074469, 4071092, 950798, -1735704, -3499862, -2211371, -7255274, 1519882, 3935264, 613643, 1391569, -1516660, -16643, 421444, 1857573, -722091, --3101503, -1578401, -6141803, 581968, 757525, 4909148, -2013803, 3758097, -1148904, 2475512, -4661114, 4758287, 1983201, 2024003, 2399813, 3192235, 4398584, -1839857, 4570919, 186831, -4894652, -964757, 8811125, 3170760, 2833068, -5951751, -969589, -1244467, -8032663, 4464619, -3537443, -2365453, -10481331, -4588099, -1662152, 5191542, 6855305, 4521527, -2876018, 1619740, --4538707, 345745, 300648, -3487514, -1882269, -9251896, 701690, -1045825, -3994320, 537945, -484258, -1144072, -345208, 9109089, -2196876, 7441031, 1399086, -5533529, 407485, 668404, -4117263, -1731946, 1187559, 1086627, 355945, 5709622, 2007897, 5853504, 4320737, -2856153, -5367099, 2641405, 3990562, 438624, 1460289, -1277753, -2225867, -4687420, -5484673, 6099928, --5606006, -4685273, -4405026, 2741263, 3393561, 940598, -8111583, -7507066, 1603097, 168577, --1649268, 4529043, -611496, -766115, 4662187, -5134097, 991601, -4479114, -2931852, -1604170, -31675, 7668127, 8669391, -4015258, 3386045, -6237367, -615791, -2429878, 8422431, -2475512, --494995, 903554, -11901354, -2047626, -5885716, -1915019, -1473711, 4446902, 5865315, 2428804, -7933342, -999117, -3635690, -3654480, 4575214, 11947525, 8324721, -4635344, -5455682, 5985037, --5368172, 1035624, 1889249, 9789304, -3611531, -4802847, 1051193, -2975876, 1855963, 2500208, -6200322, -6798397, -4427038, 3992709, 7494181, -693637, -3496104, -4434017, -10623602, 4008278, --27380, 3130494, 491774, 223338, -1667521, 1867237, -2697240, 1557463, 2331094, 2116882, --3663070, 2427730, -19679004, -6484327, -1038845, 3355980, 2259690, 4895726, -9396852, -2815351, --423591, -9746891, -6961068, 2450279, 5900212, 3462818, 6511171, -827318, 3742527, 8669928, -7651484, 7192997, 4148939, -2760053, -2196339, -4439923, -1963337, -4457639, 9257265, 4318053, --1409286, -4078072, -2487323, -4160750, -6081137, -6547141, -8245801, 5012764, 3584687, -9131637, -2180233, -441845, 6349573, 1009317, 3138547, 4150549, -8639327, -1296006, -290447, 1209570, -4578972, 6976638, -2730526, -915902, -1989107, -5356361, 1720671, 1206349, -526670, -1351304, -5289789, 449898, -2833068, -783832, 2549600, 3583077, -1276679, 135828, 958315, -4391067, -3610457, 75699, -7033009, 1393180, -8607651, 2162516, 6528351, -989990, -413391, 10589779, -4296578, 1618129, -2469606, 7757785, 3323768, 4303021, 12857521, 13467407, 776315, -2403034, --4580583, -7603703, 2997350, 5222680, -2513630, -724239, 1060320, -1465658, -4062502, 4959614, --4701379, 2205466, -14137422, -2240899, -3189550, -3661997, -6802692, -1637993, -571768, -34360, --3296388, -5372467, -3742527, 432181, -2338073, -5687611, 3725347, 4628901, 812286, -4690105, --4669703, 1738388, -3476776, 4356171, -5146982, 3483755, 1808718, -213675, -7492571, -7567733, -2265059, -5529771, 9296457, 1396938, 7924215, -3965329, 8006356, 1251983, 5421323, 1413581, -5218922, -4361540, -5142150, -370978, 10325101, -1214402, -5448166, -3726958, 5186173, -3070365, --2419140, 417149, -8655970, 6105296, 10442139, -1925756, 15885473, 2833605, 8893804, -3696356, -6758131, 4417911, 10320270, -7703024, -4882841, -2018098, 957778, 6743636, -2939368, 10411001, --410169, 5778342, 5662378, -3325915, 2564096, 5862631, 6118718, 1145146, 1984812, 5315559, --11235098, 1588064, 9418863, 6723772, -5877126, 7546258, -8861054, 5327907, -7761006, -4442070, --1721208, 8218957, -1309428, 8623221, 2421288, 1618666, 884763, -605054, 3983582, 4940823, -12091407, 1530619, 10506564, -5235029, 7815767, 9373229, 182536, -2021319, -2987150, 3454764, --13295608, -1423245, 1890859, -5441187, -7647190, -722091, 46171, -1358283, 4206921, -8674760, -4882841, 3501472, 6005975, -13499082, 5254356, 3039763, -7159711, -1023276, 5064304, 9812927, --11694122, -1181116, 1443109, -13885092, -16828756, -13618804, -12135967, -485868, 8724152, -17914308, -12826383, 8164733, -19925964, 12579422, 5490579, 4277788, 2134599, 1906429, 4694936, -3179350, --3104725, -6610492, -17180, 7680476, 6693707, 3785477, -11217918, 7807177, -7948374, 235686, --6951405, 8978092, -4506495, -3673808, 3082176, -13388487, 1610076, -4398047, -3730179, -1370632, -1263794, 13281649, -5908265, -1936493, -4686346, 10145250, -5746130, -3179350, 3483219, 3151432, -3246459, 3702799, -3725884, 5013301, 1711545, -10826002, 15657303, 6239514, 3002719, 1823751, -527207, -6779069, 9329206, 7580081, 3763465, 10081899, 1845225, 4699231, 10679436, 5468567, -3140695, -6146098, 9259413, -2823404, 16828756, -795106, 2243047, -3066070, -13536663, 3409130, -10298258, 6261526, -710280, -6648610, 16617228, 25274272, -2991445, -4067334, 12852690, 2525441, -4496831, 2785823, -18169322, 1510755, -11624329, 9048959, 14042932, -4152697, -6257231, 1658931, -9009231, -5794985, 10802916, -4719632, 20530480, -6536404, 4227322, -1638530, 5793374, 13726179, --5131412, 730144, -974421, 3453691, -5048734, -3309809, 8475581, 16900160, 1751810, 12143483, --4515621, 971200, -2166274, 3468723, 9709310, 13217225, 11240466, 9527848, 11102490, 5917928, --1734093, 686658, -1248762, -760209, 2398202, -8133595, -1789391, 10210211, -9732933, 2766496, --4144644, -3913252, -4940823, -21927418, 2544768, 9660992, 7304666, -4155918, -9490267, -25490094, --3549254, 7588671, -1709397, 1359357, -7055558, 2308545, -6011344, -18287970, -13481365, 1248762, -8891119, -8530879, -4612795, 468151, -3671123, -27062588, -22246320, 9415642, 9812927, 1149441, -1989644, -10241350, 15853261, 17949206, 12049531, -10051834, 9561671, 11615202, -1215476, -15898895, --6258841, 20764556, -5624797, 1634235, 1998770, 11455215, -8871255, -17571784, 4434554, 7364795, --3462818, 4541928, 11819750, -5849209, -3486977, -978179, -23082228, -7384123, 9002788, -5005785, --15133854, 2415382, 404801, -5488968, 4016331, -1979980, -14249091, -13291850, -21736830, -18466748, -4425427, 7439957, 1685238, -5882495, -6574521, -324807, -4149475, 4299263, -9813463, -180926, --2741263, -3719979, -2512019, -1604170, 5493263, -5618891, -20367272, 2506650, -1658394, 4501126, -7593502, -602369, 6045167, 3766686, 8648990, 27763206, 24663850, 19247896, -2103997, 18795850, -6049999, 26235808, 11058467, -644782, 31998044, -6809134, -1819992, -20594368, -5557688, -583579, --14610942, 8444443, 12672301, -4398047, -424665, -11839077, -20183126, -11999065, -15481746, -4700305, --9501541, -3178813, -1804960, 8810589, 1921461, -2231236, -8631274, -3187403, -5937256, 2538863, --280247, -8526584, 3765613, 4990215, 1566053, -6721087, -8864812, 2299418, 6979322, -1564979, --978716, -15094126, 25438554, 3875134, -5764920, -1251446, 1485522, 10648298, 8624831, -10422812, -4605816, -4444755, 186294, -2273648, -3553012, -15590194, -14487462, -18558016, 1512365, -1401233, --5055177, 10594074, -4919885, 31108448, -4535486, -2335389, -9276056, -4049617, -18336290, -22716082, --14801531, 19356344, 12747463, -10896332, -14115947, 20687784, 10266046, -10715407, -17963700, -1269700, -1486059, 3309272, 1020592, -8208756, 8819178, -5729487, 18541910, -1574642, -15255724, 4776541, -3794604, 1424855, 246961, -4581657, -10335302, 1084479, 6824166, -3335042, 4911832, -8122320, --27292370, -19488950, 12182675, -14784888, 12007655, 5573794, 354335, -3758097, 6581501, 4270808, --3231963, -1959042, 2477659, 9800578, -8311299, 23966454, -6703370, 9371082, -7778186, 3940633, --2982855, -6598144, 20199232, -14560476, 22082574, 1334661, -12602508, -15274514, 7889318, 5463199, -1855426, 3441343, 8388608, 8824010, 7530689, -15417859, -6438156, 3215320, -666794, 7395934, --14481556, -3721052, -5132486, 296890, -17075716, -2323041, 4007205, 40796284, 14227616, -9645960, -21664352, 19297824, -9731859, -13438953, 32347546, -3282429, 7492571, -19319836, 46877420, 1207960, --12498355, 6330782, 2815351, 22131430, 889058, 28063316, -19942070, 66572, -21826486, 1361505, -16208670, 382789, -13171591, 19057306, 10879152, 5392332, 5185636, -7080254, -6017786, 1480153, --9163313, 12430709, -10798622, -15338939, 13850733, 4827543, -16984448, 9312563, 1676648, -12897787, --6615860, -4391604, 7217156, -1605244, -7148973, 9288941, -10800232, -4505958, -3367791, 15687368, --9767293, 7660611, 12523051, 5732171, -6617471, -14374182, 9750650, -12156368, 17370996, -20835424, -28533078, -7705172, -3562139, -3200825, 13120051, 100932, 4860293, 8973797, 4626754, 12597676, --11027865, -17936858, -723165, -1926293, -24815784, -2918967, 22411676, -6456410, -14223858, 6367826, --6765647, -1082332, 10062572, -24375550, -14567992, 9599252, 12430172, 17316234, -1402307, -3125663, -6735583, -1540283, -24428164, -16474958, 28286654, -2049773, -25185152, -14383845, -10276783, -8149701, -2078764, 8489540, 202400, -4065187, -12723841, -18956912, 2287607, 2634426, -960999, 15680926, --10945724, -29802242, 11797738, 8886824, -35264904, 20940650, -6016713, -17547626, -14921790, -1229971, -19455128, 4832912, -7029251, -7121056, 5196911, 10520522, -15220290, 11329587, 1258962, 8362838, --6968585, -15229954, 12917651, 108985, 14506252, -47195248, 5225902, 7364795, -7853885, 13204877, -14295262, 45007500, 197032, -29568702, -14898168, -7611756, -30237644, -28066000, -197569, -15211700, --1046361, -181462, -19841138, 2504503, 13489419, 10541460, -17524540, 31769336, 23471996, -11259794, -14349486, -27193048, -5078262, -9667435, 42415488, 25836912, -9130564, -16735877, -18646600, -5180268, -1902671, 6776385, 28739774, 5055714, 5565204, 5141076, 1603097, -10129143, 1969243, -2678986, -13733695, 16418586, 22905060, 13362180, 10242960, -3161096, -3143379, 2482491, 20918638, 2116345, -4526896, -21370684, -9300752, 33176474, 14969572, 9170292, 1353452, 19365470, 12117176, 42063300, --1221918, 43359844, 4434554, -15153718, 15779710, -13421773, -7592429, -3012920, -6719477, -1018981, -9914932, 16248398, 4872104, -5509906, -17618492, 4469987, 3750043, 10900090, -12947716, 1890323, --4058207, -154082, -16345035, 7062000, -13345000, -5508296, -18343268, -36530844, 5495948, -10959146, --16591459, 5065377, -19014894, -19327, 23218056, 7293928, 19837918, -22779970, -10373420, 11310260, -2496987, 32847910, -16399796, 19731616, -7148436, -9696962, -24096914, -9234180, -12795244, 16618839, -4160213, -21415244, 27580132, -13727789, -12694313, 3015067, 11029476, -7545184, 19279034, -8685498, --12596065, -6260989, 6768332, -1782948, -3045132, 2593624, 19343996, -12123082, 34955664, -12699681, -202937, 32494112, -5709622, 6317897, -42684996, 2687039, 8509404, -8993125, 19932944, -33971580, --41771780, 17066590, -6696391, 24507084, -16683800, -15604690, 2842195, -4402342, 37202468, -3284039, --620623, 9262634, -32549410, 3190624, -32845226, -12245489, 3175055, 9624485, -41142564, -17264694, --3805341, -105227, 15307263, -15712064, 23671712, -5352603, -24773908, 19900730, -17306570, -6937446, -18650358, 37733436, -9669582, 30621506, 12971338, 6701760, -13471702, 34048352, 7087770, 14996952, -3031173, -22597970, 9067213, -22709640, -19490562, 11344619, -19437948, -6231998, -3501472, 19374598, -3164854, -8887361, 8172786, 7588134, -3064459, -21780316, -3416647, 13464186, 38367480, 6657200, --19732690, 370441, -2865817, 6940667, 12386686, 16835734, -7258495, -1598802, 13211856, 743029, -329102, 22741314, 23351200, 24580098, 10067403, 20270098, 3854196, 11238319, -9864466, -4168266, -3601867, -23220740, 2098092, 32947230, -4080219, -10188736, 7711614, -3039226, 9615895, -23622856, -27764280, -20125680, -8141648, -7513509, 755377, 463320, 2441152, -33514704, 36749352, -11370389, --15515569, -7590818, 62282396, -2867965, 11825656, 320512, -7305203, 2643016, -29999272, -11589432, --9770514, 12234751, 7318088, 15179488, 863288, -14453639, 15337865, -12127377, 17811230, 14591078, --15757161, -15149960, 1189706, 23661512, -23994372, 10720238, 10027675, -12318503, 5234492, -723165, -7452842, -23622, -34604552, 20059644, 11047730, -27561342, 33871184, -17235704, -5015448, -10251550, -27247810, -4432943, -24285892, 1065689, -216359, 24154360, 22854594, 2709051, -18597208, 27434104, --4762582, 5848135, -33806760, 27467390, 10205379, 2865280, -19575388, -13150653, -2484639, 10497974, --15788837, -26016764, -12101070, 23190140, 13038447, -1613834, 34812320, 3811784, -6109054, -23523536, -30657476, -26776974, -9778567, 34158412, 9426916, 7138236, -12927315, 9147207, 28258738, -24062018, --415538, -27060442, 25303800, 42703248, 18052822, 24876450, -37304476, -30878130, -26459146, 3798899, -43694848, -6903623, 15557982, 30561914, 13599477, -14639933, -107374, 22763864, -28503014, -21417392, --20724290, 23855858, 14519137, -27181774, -41645612, 56744572, 32993402, -37625524, 16809428, -2876018, -15330886, 3511136, -12847858, -25474524, 23980950, 1205275, -21169356, -28356984, 6828998, 9082782, --8570070, 2873870, -3710315, -12805445, -7468948, -5651640, 13165685, -24236500, 28398860, -17626008, -194884, 48589500, -45340360, -8110509, 41072236, 5809480, 8916352, -3346317, -14055280, 16211354, --5821292, -15286862, 1424855, -38783016, 70520144, -3400540, -80019000, 33764884, 76601280, 50141596, --97656280, -23369454, 16311749, 12184285, -17753248, -14671071, -19428822, 3991635, 20086488, 45191108, --18843632, 14192719, -23961086, -65156264, 34958348, -17110076, -35025460, -25373594, -35890356, 16182900, -11996917, -49540300, 30999464, -18093624, -1371705, -1896765, -25078850, 17770964, 18760418, 15362024, --2011655, 20464982, 10995653, -15001247, 605054, -29330332, -10709501, -26309896, -17898740, -3126199, -38859252, -35262756, -8151848, -9292699, -30962956, 15227270, -34908420, 15057618, 13638132, -25271588, -16372415, -39252244, 8761733, -34600256, 18736258, -14812268, -18986976, -20498268, -28329068, -10200010, -10500658, 19271518, -29212220, 14046154, 6739341, 23781234, 30451854, 15611132, -32037772, -17429514, --57311508, -18067316, -20234128, 12572980, -67374080, -17264158, -43149924, -9307731, 29434484, 27074400, -13265543, -222265, 38205880, -12263742, 9589588, 55236500, -31762894, 19235548, 28322624, -14345728, -4567698, 7741679, -1024350, 25615184, 3595961, 17917530, -23663660, -5923297, 24580634, 1426466, --32910186, 20404316, -11890617, -13670881, -11297375, -5740761, -10989211, 11024644, 20591684, 6788733, --1234266, -11986717, 18081812, -7477001, -23779624, 18857054, -41521596, -13137768, -7065758, -11719355, -26624502, 24978456, 50453516, -16393353, 22566832, -2860448, 11082626, 29849486, -685047, 1404991, --19694572, -68973416, 34690452, 4498978, -30932354, -23996520, 4606353, 15784005, -1861332, -20628192, -10950019, -20991116, 26562226, 12912282, -10389526, -24552180, 46982112, 4132832, 2755759, -4945655, -6387690, 2968359, 1528472, -15401216, -34102576, 10099616, -6833293, -9446244, -33934000, -963683, --4100083, 3590593, 63458680, 32945620, 63858648, -58932320, 4749697, 31221728, -12338367, 35510252, -67403608, 37586868, 1785096, -17870286, -19209242, 3908957, 29000692, 31854698, 6772627, 319438, --47154984, -9241696, 45759656, 15665356, -13242458, 25884158, -22051972, -29916594, -8704288, -1615982, -35292820, 46996068, 41474888, 16269873, -16603807, -24528022, -46652472, -45594836, 39692476, 17223892, -2898029, 62310848, 3359738, -18532248, -25722560, -25313464, 12116640, 26862872, 20636244, 41018012, -2464238, 29630442, -2346126, -4836133, 14352707, 27456116, 19320910, 17589502, -15918759, -5456219, --12691628, -27064736, -22546430, -39639864, -14006425, 11023570, -7266548, 29330868, 34155728, -426276, --645319, -14345728, -26794154, 4911295, 32120986, -3092913, -33655364, -66329864, 26410290, 107707576, -110029008, 92739616, 67689760, -41527500, -46842524, -51114404, -67476624, -104013904, -83249888, -72686416, -34508988, 78488376, 58959700, 126156072, 98103496, 51077900, -17822504, -33501818, -83646632, -65566972, --64366528, -12811887, -38958036, -31912680, 10910291, 18424336, 36941552, 36579700, 50474456, 49579492, -64301568, 37616936, 17699560, -8065949, -8913131, -26461294, -40011916, -49213344, -59800976, -39023000, --73751568, -48973364, -35681516, 39662948, 74382928, 79483736, 56294672, 38640212, 60119340, 46114528, -58054000, 45729052, 18486076, -17628156, -92651568, -64991444, -65392488, -104228656, -63103808, -54507428, --51727512, 25232932, 62867584, 96071976, 81349368, 113052664, 103615552, 101507792, 76465984, -26111254, --20229296, -60276644, -79548160, -68961072, -11515344, -6640020, 0, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ --6346351, --4986994, 1199907, -2861522, 4595615, -4682051, 1912871, -8588324, -650688, -3399467, -5342403, --4507032, -2642479, -223338, -1012002, 5650567, -1739462, 1135482, -736050, -292595, -4706748, -5520107, 1690070, 1017370, 1465121, -1102733, -1225139, 1391033, 5286568, 2262374, -1039919, --404264, -153545, -1214939, 110595, -889058, -490163, 70867, 2984466, 355945, -2333241, -1708860, -2499671, 7295539, -4435091, 544924, -76236, -5440650, -831613, 2388539, -3060701, --1372242, -998043, 3630858, -1977296, -1393180, -223338, 417686, 781147, -537945, -1773822, --4234838, 797253, -2205466, -3162707, 755914, 1193464, -232465, 857383, 2074469, 2114735, --301721, 788127, 358093, 2738579, -3060164, -3017752, 3038689, 3194919, 6111739, -8471286, -1552094, 6108517, 10254771, -830002, 5626944, 61203, 5075041, 1619740, 7965554, 141197, --3046206, 5906654, 7613904, 7854959, 4099546, 1524177, -3433826, -2118493, 384400, 4155918, --2324114, 2094333, 104153, 4682051, -2493229, 181462, 713501, -4922033, -3421478, -1233193, --5844914, 1610613, -1933809, 258772, -1140851, -4236985, 3132642, 5722507, -1529545, 743029, -83215, -555661, 5325760, -6663105, -450435, 3199214, 336081, 1237488, -2121177, -5456756, --1932198, 2571075, 2190433, 3283503, -1003412, 439160, -454730, 1517197, -1491964, 6407555, --362925, -157840, -4524748, 932008, -3438121, -1762010, 1730335, 3077344, 5479305, 784368, -5145371, 6923488, 11277510, 1492501, 5629092, -2043331, 3358128, 4340065, -1302449, -3484292, -5940477, 10184441, -1954210, 1139777, 3984656, -4859219, 3084860, 4365835, -8844411, 2528662, -928250, -1970853, 64425, -9229885, 445066, 2639258, -4334159, 864899, 231928, 5992553, -4321274, -2165737, -548682, -493384, -6219650, -4163971, 788663, 2635499, 670552, 2927557, --4064113, 734439, 2192044, 545461, -3743601, -2699387, -733903, 1481227, 3250217, 3380139, -2288681, 3935264, 3832722, -3961571, -1117228, 365609, 5404680, -581431, 3932043, -2236067, --2383170, -528281, -4522601, -1881733, 1171989, 3079492, -3800509, 4308926, -869731, -753230, --515396, -1105417, -1727114, 1396938, 3426847, 1868848, 5583995, -5913096, -1457605, -1082332, --3233574, 1156420, 6731288, 9020505, 5553930, -2530810, 4161287, -2629594, -1427540, -8106751, --6085969, 2630131, 6238440, 5694590, 6355478, 1155883, 526670, 3595961, -4895189, 4896263, -4338991, 157840, 3753802, 8920110, 6414534, 1513976, -6382322, -41876, 2400887, 1182727, -1276142, -7441568, 1916092, 1082869, 5012227, 5073967, -1480153, 3166465, -2398202, -3131031, -4067871, 1938104, -6699612, -6789807, -2661806, -3936875, -2530810, -3188476, -7763691, -7490423, --448824, 2312303, 161598, -1057636, -5153961, 410169, 6589017, -2101850, -1785096, 2076080, -224949, 4274030, 2567317, 2010045, -2702071, -4023848, 7135552, 2765959, -2407329, 4139275, --216896, 3162170, -2510409, 301185, -12742094, -7514046, -2340757, 2410551, -5245229, 1597728, --1426466, 3665218, -877247, -7142531, -5662915, 4935991, 4059818, 10213432, 9040906, -1372779, -6548752, -9822590, -1573569, 7633768, 2327872, 1770600, -976568, -3208341, -1462973, 1056562, --839129, -297427, 3904662, -4814659, 1119376, 1751273, -66035, 3041374, -3255048, -2711198, -1809792, -2108292, 2784750, -5379984, 966368, -3230889, -1190780, -3598646, -2605435, -4087735, --5967320, 3722663, 70330, 6344741, -5807870, -5072357, 94489, 1220308, -544387, -1211718, -590558, 3828963, 2022930, 834297, -2388002, -2501282, -1174137, -4715874, 1047435, -1198833, -901943, -183610, -4682588, -370441, 110059, -5311264, 813896, -869194, 1563368, -607201, --4278861, 4320737, -6703907, 2657511, -7512972, -1450088, 515933, -5773510, 5456219, 3932043, --11234024, -1279363, 2041183, -1183264, -4846871, -6803765, 1498407, -3497177, -5426691, -2882460, -3406446, 2765959, 8178155, 10331007, -798327, 9210557, -5636071, 3520263, 4193499, -1004486, -4130685, -2483028, 195958, -794032, -1822677, -1190780, -2054068, 7613367, -330176, -6020471, --1282585, 3703873, 2539936, 2914672, 733903, -2938831, 5817533, 11400991, 839129, 943282, -798327, -1099512, 1961726, -1020055, 6768332, -5323075, 6484864, 4157528, -3899830, 1821066, -4284230, 2584497, -4683125, -5486821, -10188736, -1932198, -796180, 1089848, 4205310, -1173063, -2831457, -1034550, -2500208, -2812130, 5632850, -1108638, 5978595, -7617125, -142808, 3257196, -1059246, 386547, 3758097, 11959336, 13535589, -3384971, -635655, 3111704, -2422362, 9146133, -8402030, -5336497, 8215199, 6897181, 2222646, 4053912, 3105261, 1918240, -1157494, 743566, -731218, -4625143, -6226092, 1611687, -2073932, 7516, 530965, -5050882, 4676146, 10419591, --828929, -6180458, 9613747, 1258425, -230854, 3991635, -2341831, -3041911, 893353, -3827890, -919660, 10322417, 3811247, -119185, 3054259, 5569499, 13939853, -2460480, 5609228, -1340030, --7073275, 4075387, -370441, -2225330, 2095407, 8831527, 1489280, 1453310, -974958, 3436511, -12052752, 5636608, 697395, 1140314, 2442226, -3908957, 5606543, -1889786, -13864691, 1380295, --2497524, 7552700, 7891466, 3840775, 204548, -15011984, -2362232, -6016176, -8428336, -1457605, --6180458, 885300, 4201552, -6714108, 7006166, -15603079, 1715303, -4175245, -9235790, -10975252, -11529303, 6683506, 197032, -9647570, -7306276, 4481262, -13933411, -8696235, 2597382, 3482145, -12996034, -1114007, 562641, 10700911, -6543383, 10524280, 2826089, 4269735, -2483565, -5294084, --1252520, 8875013, -4989142, 1351841, 9774809, -3117610, -3594888, -4346507, -6682969, -4654671, --4524748, -7694434, -1568737, 3146601, -3406983, 2470143, -3285113, -3639448, 5245766, -6825240, -3962107, -5718749, -8551817, 984621, 5978058, 1010391, -2581275, 3169686, -5952825, -2139968, --8122320, -12776454, -6994354, 2384244, -4812511, 15657303, 5155035, -10125922, -6393059, -947577, -17137456, 10777147, 11797738, -3620658, -16230681, -1559610, -8211441, 1859184, 3858491, 8593693, --3947075, 3623342, -6558415, 894427, -5762773, -15551003, -8050380, 5588290, -5386963, -12379169, --11203959, -10856604, -16357383, 1794223, -5610301, -12857521, -11151346, 1723893, 16107201, -2394981, --2483565, -5592048, -9487583, 1727651, -3675955, 791348, -11885785, 503048, -12391518, 1486059, --864362, 6478958, 5378910, 5348845, 3033858, -740882, 4804458, -3345780, 9307731, 2314451, -4774393, 2520609, -2872260, 3002719, 9359271, -1468342, 5274220, -1573032, 14635101, 1611150, -5557688, 450435, -8055211, -6493991, 370978, -3150359, 1956358, -2377265, 4888747, 4009889, -5674726, -2889976, 3294240, -11549704, 6123550, 15605764, -8165270, -23688356, -3905736, -8258149, --12440910, 6733435, -23758686, -3056943, -8417062, -4569845, 6928856, -7525320, 10133438, 8739185, -1462436, 7897908, 784368, 4220342, -6100464, -10851772, -11938935, -6637335, -10919954, 8728447, -11420318, -354872, -5793911, 3400004, 3416647, -3998615, 1007170, -18649822, -9761387, 8936216, --4591857, 453119, 8810052, -601295, 5551782, 4777078, -2193655, 5450851, 213138, -9764071, -11463805, -7563438, 854162, 927713, -5823976, 4440460, 7023882, -3564823, 8001524, 1249299, --170188, -6527814, 9054328, 418759, -6466074, -1794223, -13407277, -5287105, -7367480, -378494, -10255845, 3478387, -169651, 970663, -8182450, 2979097, 7932268, -7960722, 1722282, 15421080, --4177393, 3532611, 4045859, 41747620, 9862856, -5964099, -7975755, -1242856, -2172180, 7069516, --1146219, 5925981, 12502650, -5209796, 1155346, -8288750, -4852240, 2189360, -719407, 5807870, --11224360, -7260642, 6206228, 11541651, 8468065, -666794, 3469260, -3189013, -6442451, 4881767, -9968619, 9466645, 12451110, -9947681, -1554241, -5788542, -11275900, -1721208, 1422171, -2819109, -6360847, 7147363, 835371, 3469260, -1278290, -12914430, -6049462, -17208324, -16419123, -5131949, -6813966, -2572686, -6656663, 14561550, 6594386, -557272, -12512850, -547608, -3001109, -9642202, -1400159, -4290136, -4964982, -13280039, -270046, -4672925, -13280576, 420370, 13121662, -7086159, --1671816, 4946729, -4152160, 3577171, -3650185, 10805601, 519691, -6247030, -8180302, 9937481, --33889976, -18615998, 17251274, -4185446, 654983, -8776229, 7235410, -2774012, -13408351, 6582038, -17394080, 2669859, -16210817, 4780836, -3960497, -3241627, 9755481, 11028402, -2015950, -1859721, -21973052, 5344013, -3842385, -13575855, 5527623, -19610820, -16990354, -14824080, 5480379, -2610266, --2269890, 13187697, 4502737, -12954695, -11683922, 3058017, 12105365, 4560182, -2173254, 886911, -7807714, -6026376, -14648523, 18267032, -6092948, 1986959, 6547678, 1215476, 1717450, 18723374, --492311, 11929809, -300111, -12481712, 950798, 2673617, -3475702, 2365990, 7581154, -6360847, --2860985, 2116345, -25693032, 6488622, 4038343, -217433, 4867272, 4554276, -10295573, 4312684, -32744830, 14649597, 7086159, 2774549, 6881075, -24525874, -22889492, 16239271, 16368657, 5945846, -8828305, -5699959, 26435524, -2621541, 9817221, 7567733, -12828530, -4520453, -6136972, 16203301, --9692131, -2298881, 9454297, 8884677, -9505836, -1857037, -26759794, 5570573, -3273302, -7103339, -1954747, 1376000, 1634235, 3102040, 8639327, 1053878, 9508521, 1867774, 4507568, -1812476, --8752070, -8338142, 16831976, -5330055, -12560095, -9636833, -4899484, -4942971, 7239168, 5387500, -5563057, 8358007, 2151242, -8516920, 5275831, -14394583, -5041755, -12448426, 9149354, -15183246, --11522324, -2490007, -5355824, 5755256, 10924249, -7612293, 10370735, 17834314, 8565775, 17260400, --6508486, 22857280, 2354179, 19599546, 10904385, 3557844, -9250823, -23316840, -15980500, -11979201, --6832756, -5530308, 12598750, 6252399, -6980933, 20912732, 2502892, -20610474, 25748866, 1627793, --10776073, 8959302, -20900922, -4101694, -13253195, -4248260, -2226404, -4167192, -9427453, 2636036, --18028126, -7067906, -6402723, -24557012, 3133716, -17804786, -12491376, -19961398, 4159676, -15049029, --4392141, -4965519, 316217, 7630547, -5970005, 10741713, 701690, 14252849, -3157338, 12424267, -15684147, -18545668, -143345, 5134097, 11539503, 598611, 13841069, 4772783, 13340168, -73014, --10007274, -6120866, -885300, 8828842, -1899449, -3634079, -806917, 16199006, 10040560, -3380139, --13062606, 4820564, 7153268, 5604396, 13996225, -18262200, -14034879, -3332895, 1170379, -4561256, --66572, -4552666, -12061342, 34022584, -16681116, -17788144, 13706851, 9434969, 3146601, -4910222, --5065914, 16158204, 12816182, 19209242, -5989332, -5346698, -26461830, 30945240, 14993731, -42274288, --21770116, 12966506, 19252190, 18304614, -11378979, -10181220, 23333484, 4969814, 5892159, 15315317, -13412109, -23515482, 7820599, 9366787, -975494, 10542534, 2878702, -3337727, 3066607, -7890392, -39443368, 9754944, 5888937, -1412507, -3886409, -2943663, -20981452, 3853660, 7390565, -5502390, --6191196, -35802848, -15911243, 7071664, 7252053, -11992622, -10266582, -1971390, -15715285, 6605123, -7486128, -2851322, 8330626, 13562433, 2049236, -1175747, -3054796, -7959648, -932008, 714038, --24522116, -4090420, 7869454, 15227807, -26409218, 5443871, 12195023, -3256122, -11020886, -13343390, -23995446, 19304268, 136902, -15931644, -19663970, 12828530, -9541270, 3790309, -8006356, -6330245, -807454, 8846022, 16480326, -30587146, -40808632, -27692338, -36535676, 31869194, -21294448, 13101798, --3862249, -24973624, 4241817, -6437619, -9747965, -32542968, -30532386, -22106196, -8897025, 1666447, --17767742, -4573604, 4366371, 14721000, 881542, -8335458, -199179, -8942659, 13419088, -16639240, -23507966, 20966956, -5089536, -5970542, -28315646, -15865609, -17281338, 2603287, 3619047, -4034585, -22836878, 7104413, 18497350, 4233227, -2318746, -7889855, 16655346, 12146704, 5167920, -16261283, -8938364, -27890444, -3241627, -2434710, -18948322, -2512556, 205622, 22385906, 14417131, 1049583, -10082973, 267899, -21427054, 11658689, 3113851, 18727668, -9996536, -19640348, 12607340, -35637492, --39814348, -4414690, -25113210, 939524, -18324478, 16623671, -12901008, -2084670, 4049617, 5801964, -21471078, 6337761, -8768713, 21838834, 7662759, -38911328, 6980396, -23605140, -954557, 3728569, --2524367, 18247168, -4915590, 2791729, 5469641, 1023813, -11582990, 18534394, -10408853, -1692217, --21732534, -653909, 4499515, -4180614, -7192997, -10919954, -11019812, 28440200, 1861868, 14427332, --25189446, 2301566, 370978, 8272107, 16144245, -18410914, 32309966, 44924820, -1393717, 3800509, --15214922, 6704444, 11266773, -9362492, 2927557, 8022999, 18311594, -1103270, 1662152, -5974300, --14777909, -23541790, 12319040, -17710298, -6813966, -11655467, 5446019, 15354508, 14279156, -2779381, -5428302, -31059592, 20688858, -3029563, 4194573, -7036767, 19591494, 50554448, 14779519, 36686000, -12051678, -38812544, 15731391, 10415296, -12582107, 2310156, 25128244, 782758, 24056112, 20766704, --24504936, 13277355, -24520506, -17074642, -2123861, 49393736, 15515032, -22840100, 21424370, 13268765, --27179090, -12490302, -1665374, 27437324, 4319127, -25908316, -14131516, -1235877, -6779606, 15010911, -22504554, -8531953, 19815368, -13117367, -16911434, -1081795, 40611064, 3255048, -23018878, 12684112, --901406, -2843268, 11501922, -26892938, -22577032, -22180822, 16026670, -14736570, 5295158, 6146635, -24349780, 11345693, 25025700, 2024003, -892816, 19624242, 37372120, 21461952, -36617816, 115427, -3739306, -6874632, 7244536, 9586367, -28293634, -4849018, 5696737, 4473209, -33868500, -32265404, --18213346, -19040126, 32853278, -19777788, 14944876, -39052528, 28445032, 30814780, 9168145, 33614024, --34308200, -17420388, -8866423, -50425064, 28802050, 2492692, 18078054, 22656490, 23097260, 1443109, --41876, 22565222, -2923262, -27362700, -27434640, 16818018, -31062814, 30843234, -8133595, 6630356, -31561030, 27586574, -13120588, 42113228, -23613194, 2640868, -24551644, 4051765, -7755101, 16595754, -6638946, -18061948, 17235704, 24667608, 37262064, -20843476, 8871255, 22332220, -29332480, 1574106, --11016591, -43916576, -17671106, 12058658, -22846542, 8975408, -18869938, -75162, 31297964, -13602698, -14280229, 34846144, 26277146, 9885404, 47508244, -70057896, -11203422, 24725052, -338229, 15074798, --19274202, -36748812, 49643380, 1339493, -19822348, 12712566, 33946348, 76958296, 33686504, -13520557, -7113540, 4147328, 35897336, -31341986, -4522601, -14147622, -21046414, 31604516, -13215077, 41010496, --5447093, -28774670, 45725296, 69963408, -11294690, -20164334, -34556232, 9521942, 34743600, 8835821, --9213242, -20924544, 3804267, 7091528, -6600291, 7369090, -4831302, -9327058, -12972949, 12294881, -13283797, 721555, 18510236, -17535278, 39679592, 33109902, 16259136, 493384, 724239, 7942469, --23650774, -17043504, -23013508, -8974334, -7648800, 15501611, 9761387, 24777666, -12763032, -247497, --11581379, 28068148, 47805672, -9107478, -34161096, -17838610, -3478924, -40431212, 31491774, -55781960, -14661408, 28398860, 23214298, -21980568, 3428995, 30120068, -62393528, -23604066, 9411884, -969589, --32905356, -19937238, -6537477, -5373004, 41301480, -24927454, 6980933, 40164388, 549219, -12699681, -32326608, 24263344, -7496329, -20528870, -32758252, 6790880, 62460100, 14533096, 31698470, -2179696, -2156074, -1890323, -8097087, 665183, 2215130, 15957951, 4363150, -11589969, 9810242, -10055055, --12512313, -12672838, -380641, 13356275, 2024540, 10825465, 10132365, 9488120, -9623948, -14944876, -4206921, -10122164, -27915140, -7293928, 5367099, -8705899, 30901752, -31945430, 25810606, -7643431, --652298, 40248676, -7060390, -217433, 50580220, -7009387, -21891448, 4725538, -18928458, -3083787, --17966922, 58399744, -17281874, 14959908, -14893873, -4962298, -9037685, 10852309, -15681999, -33686504, -14183056, -2382633, -40432824, 22306986, -11774653, 23970212, 47292960, -21715354, -2315524, 1363652, --8814347, -18965502, -13968307, -5369, 65717832, 33326262, 68917048, -38683160, -10108742, 22677964, --21693880, 16357920, 70796096, 16674137, 10072772, -18898930, -17866528, 20124606, -11006927, 28507308, --5010616, -6837051, -8667244, -41091024, 9462350, 48704392, -26302916, 29279328, 25439092, -17023640, --5471252, 19945828, -33099166, 15754477, -2856153, 24028194, 7736310, -20993264, -7201050, -41672456, --21712670, 18516140, 13744432, 31102006, 48962092, 4475356, -34360, -43967044, -27194122, -26688390, --22117470, 10230075, -18571438, -6156299, -5104032, 11679627, -34038688, -6628745, 15811922, 7369090, -25810070, -5175973, -14405320, 25300578, -6418292, 14702747, -22441204, -14558329, -5037997, -9174050, -11218991, 17125646, 25494388, 4976257, -273804, -22541062, -8339753, -14068165, 19857782, -19222664, --66339528, 652835, 109888352, 96932040, 93436480, 38037840, -37827924, -55237576, -52443700, -49043156, --86917792, -63958504, -60028072, 46699180, 74549896, 58791124, 96621728, 78341280, 18374406, -4389994, --32380296, -66948876, -37866580, -70261904, -36079872, -23874650, 2181307, -9813463, 19338090, 29451664, -52729852, 31583578, 55368572, 40319544, 44469016, 3055869, -32788318, -16072304, 3425237, -38233260, --48099876, -65521872, -62034896, -45586248, -3949223, 32195612, 15228880, 46865072, 35624068, 53540524, -50093276, 52087216, 62687732, 32930052, -1418413, -8622684, -35610648, -30640296, -101640400, -82641080, --63600412, -50838992, 10344429, -20689932, 6112812, 74770552, 93920200, 125083944, 82671680, 50870668, -38315404, 13654238, -38030324, -33484102, -53408456, -67266168, -40710920, -8149701, 1158567, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, -{ --5803575, --3656628, -530965, -5476084, 4852240, -4402342, -5283884, 2318746, -1553168, -1198296, 1406065, --6242198, -1283658, 4512937, -3128884, -1114007, -4889284, 1396401, -3642669, -6628745, 2744484, -1201517, 2328409, -2642479, -3220689, 3591130, 1022202, 4066260, 4225174, -4557497, 4128001, --1251446, -1247688, 2871723, -680215, 2598992, 4476430, 4192425, 804770, 1748052, 1620813, --3750043, -1819456, -1436130, 700080, 3224984, -6259378, -1509681, -338766, -448824, -2866354, -462783, 2571612, -3308736, 2246268, -2618856, -6324876, 1282048, 1240172, 780073, -2477659, --766652, -1642825, 2947421, -777389, -151934, 130997, 2049773, 665183, 1256815, 1723356, --4498442, -2363843, 2320356, -540629, -1096290, 1130650, -1292785, 4477504, 4966056, 2718714, --1960653, -7510287, -6949794, 2547989, 3948149, -1427540, 7396471, -1396401, 4405026, -5229660, --4670240, 2071248, 165356, -1323924, 1944547, 4858145, -2109366, 715112, -2763812, -225486, -245350, 2022393, 1826972, 2523830, 403727, 1525250, 5492727, -2065342, -2572686, -2718714, --4977330, 1491964, -1042066, 9170292, 1779190, -622233, 728534, 5592048, -494995, -1136019, --1389959, -3169686, -570694, 4323422, -624918, 1840394, 4330401, -1267015, -270583, -6825777, --4017942, -6212134, -1182190, -1734630, 988916, 446677, 974958, 2359548, -1435056, 1207960, -157303, 691490, 1060320, -2147484, 2291902, -566399, -2481954, -113280, -2469606, -506806, -499827, 5185100, 12045773, 4832912, 2807298, 3416647, -7167227, -782221, 3010772, -910533, -1141924, -6435472, 6318971, 8691940, 1429687, 3910568, -1880659, -5010616, -7903814, -8535711, --5771899, 6855305, -6488622, -4032438, -5502390, 1792612, 4454418, 903017, 544387, 2576444, --325881, 1645509, 5500243, -733903, 4559645, -4363687, 4152160, 2989834, 2611340, -2275259, --7284265, -1484448, 4046396, 2493766, -2095944, -190052, 1343788, -252866, -3563749, -675921, -2859911, -956704, 235686, -1660542, -475131, 273804, 887985, 5153424, 2027761, -2540473, -335007, 494995, -1837172, 1009317, -2631204, -204011, 4008815, 1447941, 4505958, -3185792, --2974802, -1547799, -877784, 2553358, 5090610, -2758443, -3988414, 4845260, 733366, -1968169, -2202781, -466541, 3538516, 1500017, -3993783, -3764002, -4282083, -680215, -3501472, -7350837, --7009387, 7195144, -181999, 1497333, -81604, 4368519, -6529961, 9628243, 8543227, 410706, -420370, -25233, 215285, -996432, 3315715, 2565706, 166430, -5549098, 2332704, -1763084, -2590939, -828929, 5801427, -1433445, -3467649, -1619203, -981937, 2089502, -102542, 3534221, --5884642, 3040837, 941672, -3330210, 9075803, -1564442, -1389959, -311922, -226023, -2542621, --865973, 4744328, 3908957, -8730058, -4139812, 4195110, 1158567, -2233383, 7363185, 73551, -1569811, 7127498, 2929168, 5522254, 1522566, -2494839, -3104188, -6094559, -5698885, 430034, -2879239, 6673843, 204548, -3558917, -9801115, -3401077, -4774930, 4456029, -3265249, 2896956, --3530463, -1446330, 8288750, 4065187, -5523865, 2520072, 7904888, 1165547, -2789581, -5557151, --6693707, -4577899, -6730214, 4459250, 1001264, 2452426, -1301912, -3044058, -3219078, -5922760, -296353, -191663, 1395328, -1453846, -5391258, 74088, 5739150, -1290101, 59056, -2883534, --5737540, -8504035, -734976, 6085432, 2218888, 612570, -2877091, 747861, -4600447, -1546725, --3459059, 396211, 788663, -5290326, 5924908, -3386582, 7539278, 2785286, 731218, -3489661, --1775969, 1857037, -408022, 1744831, 4068408, 726923, 1634235, -4576825, 2676302, -2362232, -6958384, 8446590, 3971234, 5626944, 2718178, -1015223, -5990406, -4006668, 462783, 4374961, -4110284, 3312494, -7938710, 1073742, -8487392, -2684, 1258425, 820339, 3774203, 415538, -566936, 14981920, -1913945, -6570763, -7161321, 7540889, 4989679, -5633924, 1326608, -6287832, --2752537, 241592, 7104413, -8835285, 2536178, -316217, 1362042, -646929, 9024263, -4665945, -2503429, -1391569, -2463701, 1408212, -500364, 2749853, -2847027, -2551748, -7755101, 1231582, --2629594, -1627256, 523986, -2694555, 2174327, -4308926, -2678449, -7601555, -338229, -6747931, --2975339, -8031589, 5852967, 1233729, -2612414, 5275831, -6259915, -17717, -11803107, -616865, -3821984, -313533, 3222836, 7395397, -2852395, -1053878, 8962523, 3882114, 3228205, 5609764, --3339874, -8628052, -1418413, -5240934, 3079492, 8316668, -2464238, 2044404, -1004486, 4144644, -4841502, 1642288, -2815351, 1975148, 1308354, 8994735, -1330366, -2060511, -12218108, -3580929, -9268539, 8885750, 5832029, 4436165, 13162464, 673773, -15654082, -4166118, -2593087, -3952444, -8373576, -1488206, -3033858, 9574556, 1523640, -4199941, -1401770, 3700651, -3473555, -1567663, -1168231, -1457605, -5491653, -2700461, -294205, -5514738, -2464774, -2465848, 3630858, -2741263, -7036230, 6624450, 598074, 6271189, 4523675, -3277597, -1103270, -2583423, -10296110, 791885, -1988570, -10074383, -1520955, -3155727, 3329674, 8419747, 1191853, -9460739, 1146756, -3984119, --6245956, 4329864, -1628330, -7072738, 2685428, 1759326, 6855842, -1392106, -1163936, 4271345, -5888400, 5630702, -7317551, 3376381, 6119255, -15912317, 6524056, -1629403, -3821447, -3184718, -2580739, -1423245, -9695889, -10043781, 1045288, 15884937, 4153770, -11432666, 2382096, 9434969, --6970732, 1261110, -1938104, 5623723, -281857, 5179194, 13571023, 10074920, 6018860, -243739, --1422171, -6414534, -7138236, 2688113, -18217104, -2886218, 8176007, 881005, -1234803, -8666170, --3401614, -469762, -746251, -4292820, -9242770, 9797357, -3823595, -2344515, -2007360, -8406862, --9665824, -503585, -4951561, 402116, 3939559, 3100430, 3241627, -7637526, -2412161, -3940096, --2825015, 11426224, -1804960, -5804649, -212064, 14667850, -8698919, 2024003, 10474888, -234076, --3266323, -6267431, 2631204, -91268, 7205882, -5144297, 5907728, 4578435, 9561134, 4087735, -8986682, 13479218, 7854422, 1596117, -3068754, -4704063, -11218991, -2927557, 7034620, -14696304, --6351183, 13889924, -19089520, -3147674, 10349261, 13527536, -1562831, -13034689, 1648194, -4813048, -17613124, 8177081, -12414066, -7585986, -2059974, -7256884, -15562814, -7408819, -6994891, -5276368, --12621835, 6567542, 2061584, 7997766, -4888747, -1998234, -11099806, -818191, -9641128, 1298154, --6443525, 1709934, 3215857, -14377403, -4925254, -5279589, -3991635, 3479997, 3053185, -4373888, -14407468, -622233, -3848828, -2399276, 1346472, -3081639, -1236951, 5706401, 4560182, 6351183, -7926899, 7861938, 587874, 5269925, -2412698, 11627013, 12088722, -5734855, -3157338, 7781407, --223875, -17916456, 785442, -8796093, 5487358, 6552510, -9701257, -12756590, -5564130, -12342125, --16493211, 11525545, 1641751, 6241661, -8913131, -10219338, -12989055, -9569187, 4602595, -10448582, --8500277, 11711839, -2601140, 86973, 3401077, 6475200, -4963909, -4604742, 2464774, -3791919, -2359548, -1127429, -5565741, -12036646, -17581448, 5438503, -12498355, -12409234, 1083942, -3668976, --371515, -7233799, 3486977, 2881386, -14237280, -888521, -2759517, -6334540, -7701950, 4057134, -1471563, 14090714, 2234457, -8864812, -25233, 730144, 6554120, 1884954, 13530758, -1790465, --13671955, 5376762, -2491618, 5689221, -7951058, 1108638, 5351530, -25840134, -11354820, 8065949, --197032, -3520263, 4446902, -2137283, 16457778, -1447941, 10692321, 7807177, -12109660, -15772194, -1700270, -17156784, 8447664, 35293892, -8784819, -23424752, -2218888, -10122164, 25456272, 2198487, -14242112, 7980049, -4495757, -11027865, -5089000, -12015171, -3164317, 17519708, -19132468, 1162326, --15579994, 4620848, 1376000, 8039642, 1867774, -7064148, -12541305, -14303315, -2586107, -13991930, --11160473, 2381559, 3584150, 11331197, -9835475, -20409684, -4130685, -6662568, 2822331, -9204652, --6336151, 3739843, -4887136, -7600482, -163209, 1715839, -3827890, 21323438, -3709778, -2449742, -5702106, 6317897, -5493800, -1545115, 15778099, 13812078, 9029632, 17164300, 13266080, 1307818, -6068252, 10461467, -5837398, -4836670, 2869575, 8187819, 11740293, 6174016, 22807350, 4388920, -15866146, -1812476, -6731825, -2748779, 32493576, 8554501, -1653562, 204548, -8054138, 7945153, --32078036, -10136660, 14144938, -2385318, -17014512, -13458817, -6258841, 18013092, 7621420, -12148852, -6162205, -16594143, -8629126, -860604, -13040594, -14769856, 12212203, 8716099, -15606301, -3747359, -29555280, 8465381, -14937359, -17478906, -921807, 11421392, 471373, 3047816, -22767622, 683437, --3687766, -14131516, -10271951, -4903242, -13645111, -4521527, 2313377, 1832877, -14360760, -11703249, -365072, 9590125, -1537061, 12400107, 17086990, -11545409, 10055055, 10048076, 2239826, 3943854, -12467753, 5814849, 7106561, 7241852, 6219650, -1054415, -3219078, 17440252, 23192286, 5733782, --7434589, 4718559, -5309117, -7655779, 13945222, -5909338, -15246597, -19148574, -9311489, -22530862, -10000831, -7907035, -6689949, 821949, -6182069, -5840619, -13857712, 11811160, 6624987, -1781338, -7406134, 5979668, 16098611, 12895102, -26991722, -8614094, 29325500, -23140746, -7245610, -13936632, -20779052, 9624485, 9373229, 4308926, 2719788, 8658654, 22023518, 10861435, -10278394, -9664, -319438, -449898, 8432631, 10145250, 753767, 6066105, 5163625, -4988068, 6443525, 4320737, -13326210, -6510097, -13870060, -11307575, -9490804, 2763275, -1767379, 5405217, 5365488, 6145562, -11521250, -5251135, 1857573, -5303748, -10272488, -3775813, 199716, -10897943, 13139379, 17002702, --19353660, 6316287, -13766981, 10444287, -3178813, 4056060, -2594697, -10212358, -3802657, 11692512, --10644540, -2886218, 418222, -18900540, -9093520, 3810173, -16791174, -1189169, 20531554, 11322608, --5164698, -5746666, 18488224, -1487132, -4372814, -15388868, 592706, 1459752, -4227322, -348429, --7248294, 2671470, -22239340, 20143934, -4213363, -7209103, -14147085, -15887084, -1793149, 19168976, --3665755, 5229123, -12089259, -7001871, -3520800, -11730093, -14197014, 12627741, -8125005, -6613713, -11099806, 10827613, -15833934, 5218922, 5636071, 13266617, 10879689, -4323959, -10146323, -6495601, --15448997, 16384226, 10667625, 5221607, 11582453, -12655658, 8112657, -2149094, 7400766, 8182450, --8406325, -1049046, 26797374, 22312356, -17552994, 6419366, 13736379, -11329587, 2997887, -25900264, -7244536, -14295262, 10996727, -8573292, -9106404, -6855842, 29968134, 1024887, -9099425, 1918240, -9968082, 497142, 5944235, -17256642, -1788854, 26123064, -445066, -11985643, 3824669, -23267448, --12328704, -12588549, 10405095, -4748087, 15997679, 11433740, 20653424, -9778030, -2038499, -16068010, -13363791, 27444842, -9404368, -19976966, 869194, -3282429, 31223338, -6987912, -13946833, 13355201, -5569499, 6162741, 10948945, 5138929, -42047192, 1124745, -4048007, 16888348, 27292906, -26080116, --293668, 9073118, -14367202, -1674500, -38383584, -7416872, 17389248, -29470454, -19697256, -8394514, --13435731, 13064217, -8945880, -9904195, 14664629, 5883569, 4264366, 17722108, 116501, -4851166, -10151692, 18549426, -19008452, -11842299, 24269250, 18964428, 4045322, 9272834, 4050691, -10845329, --19305878, 951872, -2188286, -2503429, 2778307, -9272298, 4516695, -13175349, 2717104, 34563748, --18949396, -11382200, 14443438, 7273527, -10528575, 9738838, 8687645, 14333916, -33011118, -60811904, --28083718, -4130148, 20758114, 1635309, 22910430, 21318070, -6328098, 3643206, -5093831, -11340861, --18950470, -10812580, -13632763, -7694434, 21862994, -27904402, -4753992, -23170274, -29017872, -4714801, --29270738, -23273354, 3107409, -5737003, -3179887, 5860483, 26087632, 2341294, -18514530, 1644436, --1991254, -5029944, -24093156, -940598, 29321204, 3387119, -208306, 12513387, 22855132, 15982647, -4243428, -8341900, 8165807, -6818261, -20382842, -36965708, 36366024, -3547643, 30332132, -1445257, -664109, -9643275, -17124034, 32912872, -17794586, -13307956, -1362042, -21669720, -21593484, 19549080, -13225278, 8578123, -2432562, 10964515, -16340740, 8180302, -13632763, -16175921, -21209622, -13128104, --14487462, -24497420, 763430, -23478438, -25084220, -5429376, -10918344, -29670170, -38674032, 3475166, --14017163, 6294275, -1869385, 13852343, 34409668, 663036, 4445291, -17986250, -17165374, 14079440, -9422085, -13313325, 1042066, 8821326, -21634824, -18427020, -250719, 27645094, -23696408, -716186, -1554241, 12160126, -20109036, 20909512, 12483322, 5171678, 373662, -10199474, -23511188, -1304596, --4918812, 7784092, -12345883, -33507724, 27650462, -20614770, -7812546, -2432562, 27054536, -20972862, -10056129, -17424682, 10991358, -7008313, -23217520, 10413685, -29834454, -7875897, -7999377, 9584756, -25902410, -15688979, 10043244, 24284818, -19691888, 2140504, 6798933, 4690641, 8106214, -38547332, --10634339, -7863548, 13724031, 902480, 41339, 4079682, -7185481, 43082280, 4962835, 17955648, -50522236, -23775328, -12522514, -19956566, -6658810, 22666690, 2192581, 28032178, 8344048, -1324997, --9822053, 21164526, -12550968, 4636417, -8075076, 8640400, -13253195, 16156056, -7007239, -3963718, --8338679, 12441983, 9655086, -13922136, -2191507, 13168907, 5152350, -8908299, 2099702, -11417634, --36257576, 16308528, -18382460, -28802588, 19244138, 7997229, 20768314, -1692217, -17247514, -6878390, --3409130, 11389180, 16681116, 16866874, 29571924, 27656368, -10273562, 4068408, -27022860, 620623, --19029926, -37374268, -1506997, -30360586, 12313671, -24118388, -13710072, -15769509, -20430622, 2842195, --2683818, 2562485, -3899830, -2216740, 1148904, -39129836, 9757092, 6953015, 12724914, 20188494, -231928, -30486214, 22319334, 868657, -3978750, -2512019, 29769492, 59585156, -33403572, -24571508, --46601468, -90577104, -24192478, -8392366, 19024558, 13610751, -9470403, -16539382, 23539642, 31821950, -1079111, -349503, -1429687, -23117662, -15916612, -16099148, -14854681, -24569898, -2036351, -5445482, --4814659, 18581640, -25818660, 20257750, 16308528, -4708358, 7494181, -151934, -44686452, -29642254, --18931678, -14763950, -9133785, 4176856, 14508400, 6104223, 6820945, 42061688, 35489852, 9176734, --30119532, -13925358, -3472481, -13811004, -28833190, -65632468, -58004608, -24569360, -8503498, 3084324, -11802033, -45594836, -29258390, 23978802, 24594056, 33235530, -33436858, -36679020, 8435316, -22492744, -50539416, -27677306, -7495792, -16496433, -13804025, 7107097, 9933722, -8293045, -29669098, 404801, --13615583, -12524125, 12363063, 53153980, -16699907, 16012712, 779537, -26053272, 5305359, -50921132, --9556302, 8870181, 2494302, -30393336, 18483928, 48425756, 36724116, -17321604, -29912300, -15203110, -5046050, 50887848, 8609262, -555661, 1717987, 22464290, 26593364, 4595078, 20695300, 13545253, -31009128, -10444824, 4908074, 16739635, -15633144, -28305982, 16263967, 41075456, 10961293, 18713710, -3612068, 10553272, -56303800, 8329016, -617402, 10616085, 58464704, 20364050, 9385040, -8283382, -27192512, -8559870, -10153303, 6132677, 17641578, 30433602, -8899172, 17635672, 5713380, 2454037, -15141907, 13403519, 1527398, -25886304, -11613592, 1127966, 45031660, 24915642, 25054154, 19745576, -22967874, -11592117, -50761680, -44945224, -70713416, -21256330, -8351564, 44354128, -1460826, -21378736, -5463736, -4517232, -16694538, -14308684, 2799782, 23070416, 64542620, 28205050, 57219164, 29119342, -25539486, 23404350, -16730508, -14896557, -16022375, 6381248, 46843596, 14254996, -38887708, 16036334, --41846940, 20179366, -26532698, -6489696, -23314156, -25963614, -1200443, 2346126, -399969, -32313724, -40840844, -9244917, 15267535, -40677100, 10489384, -10225243, -12419972, 19568944, -17097728, 40127344, -4570382, -17329120, 1782948, -13362180, -17265232, 10418517, -28362890, -7208566, 34548716, -8928700, -13757317, -3223373, -26096758, 26466662, -15785615, -59334972, 6330782, 2792803, -1227824, 4731980, --9113921, -13025562, -4535486, 24335284, -51226076, 27426050, -13459891, -8931921, 30668214, -21935472, -6972343, 11493332, -13496935, -24347096, 39770324, 36761700, 128776544, 51788180, -70142720, -33197412, --34403760, -54185844, 37479496, 115402552, 46211700, 21575232, -29185376, -8422968, -2156611, -1854889, -55318640, 37524592, 23953032, 83022256, -100484520, 5859409, 51978232, -13411035, 10343892, 54073640, -9152038, -16522202, 29076392, -56161528, -111363672, -11580306, 10274636, -44060996, -5539434, 58196268, -9291625, 2220498, 21788370, -48257180, -96312496, -88715232, -40597640, 27235462, 55764244, 123947384, -30518426, -17978196, -16954384, -36145372, -76421960, -25119654, 53653804, 52858164, 56593172, 53866408, -33928096, 26425324, 6751689, 9460739, -50305340, -33566244, 4933844, 9059160, 22192096, 25149718, -71698576, 13328894, 39876624, -36370856, -32727650, -60985852, -16951162, -54403812, -16287053, -9627169, --90664616, -58418536, 33867964, 84439592, 101242040, 207237536, 128063576, 84079352, 76562624, 56633976, --10780905, -94139240, -100144680, -196562944, -206199776, -198443600, -125714232, -47724604, 41446972, 69995616, -122264832, 117187648, 83266528, 79310328, 105388832, 98122824, 89919976, 52925272, 37356552, 29645474, --7927436, -13412109, -124673776, -93057984, -112559816, -138038640, -60423212, -135530912, -108811920, -196178000, --170617040, -125825896, -85171352, -22049288, 88831736, 106549008, 90035936, 93985696, 88064544, 168997296, -225793952, 197736544, 197746192, 170182176, 165380400, 116562192, 117955912, 10516764, -106514112, -206546592, --197441792, -289185504, -244233856, -349138432, -410943552, -371445952, -354515712, -228542192, -170124736, -12810814, -24292336, 106535056, 175329152, 290591584, 231230304, 347713024, 200316736, 32184338, -2443837, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ -15547245, --3688303, -1811939, -4158065, 384400, -4757750, 141734, 2228551, 1487132, -693100, -3057480, -2359548, 3493419, 202937, -1853278, -1523103, -1205275, -2942590, 1131724, 665183, 818728, -2069637, 4105452, 4027606, 979253, 3172370, 1658394, -1734093, 867583, 1382443, -275952, -499290, 465467, -446677, 2117956, -139050, 3839164, 3338800, -3635153, 2774012, 623307, -2270427, 445603, -366146, 95026, 6896107, 196495, 2267206, 558346, 1948841, 2699924, -544387, -1862942, 4030290, -5218386, -449898, 1494649, 4357781, 1412507, -661425, 3718905, --404264, -3114388, 1017370, 1066226, 711891, -653372, 427886, -378494, -2338610, 723165, --956704, -1605244, 1811403, -2806224, 2375117, -5189394, -13831405, -1182190, -2191507, -1902671, -230318, -2318209, 890669, 1352378, 5705864, -1919314, -195958, -5235029, 420907, 5266167, -403727, 3810173, -1082869, 1605781, -2156611, -3294240, 155693, 3631395, -417149, -4513474, --137439, 4408247, 1482301, -1855963, -1511829, -179852, -546535, -995896, 112206, -709207, --1447941, -156766, 964757, 652298, -134755, -3409667, 5199595, 7036230, 294205, 861141, --2754148, -1555315, 627065, -3598646, -3977677, 2476049, -3217468, 2449742, 3175592, 3147137, -1232119, -408559, 907849, 705448, 2400887, -4966593, 498753, -592706, -3599720, -4897874, -193274, 2514167, -1851131, -234613, -562104, -347355, 3466039, 1685238, 385473, 1224066, --1347009, -12506945, -3179350, 5121749, -947040, -3725347, 1410360, -9230422, -3884798, -1182190, --1960116, -4689031, -5405217, 2960306, 4006668, 3848291, -5076652, -6910603, 534187, -3975529, --7836705, 1903744, -753767, 2311766, 8229694, -2632815, -1175210, -5206574, 7068980, 729608, -3385508, 2691334, 5748814, 3223910, 1579474, -5834176, -967978, -5355824, -1809792, 385473, --2605972, 1990181, 1265405, -2467996, -5409512, 3386045, 5024038, 1624571, -2842732, -3825742, --2757369, 1377074, -4753992, -5520644, -1916629, 2881386, -1873680, 1460826, 3213173, 2311229, --2956011, 5192616, 126165, 4417911, -3997541, -3046743, -2129767, -2137283, 2696703, -1726040, --178778, 5137855, 1471026, 55835, -5285494, 1218160, -2365990, 3400540, -2513093, 3187940, -4596689, 1733556, -2746095, 1873680, -1251446, 1262720, 8558259, 5127654, -7102802, 4753455, --3882651, -2065342, -978716, 19327, 3663607, 5906, 9978820, 2732136, -3762928, -2646237, --2428267, 6841883, 1685775, 6577206, 2246805, 4370129, 7059853, 7886097, 3097208, -1087701, --775778, 1030255, -6429029, -6201933, 1946157, -4763119, 2617246, 1035087, -1522029, -892816, -1917703, 6493991, -2178622, -2523830, -3431679, 8339753, -1134408, -10972568, -5313412, -4518843, --3862249, 4141422, 4293357, 3443490, 5646272, 2174864, 3565897, -480499, -266825, -497679, -5715528, 1474248, 3409130, -7828652, 621160, -48318, 573915, 78920, 3464965, 1837172, -1237488, -4072166, -3171297, 18506478, 4529043, 2528125, -1901597, -1654099, 2229088, 974958, -5431523, 6309307, 98247, 9453223, 4313758, -3799436, -2826625, -591632, 5098126, -896574, --2144799, 4842039, 1144609, 13785771, 4118874, 2453500, 1005022, -1708860, 1091995, 1793686, -3169149, -986769, 461709, 7235410, 1497333, 7998840, -3757023, -4360466, 3198677, 12182138, -4080219, 2675765, -632434, -5774047, -1670742, 1337882, 836982, -484258, 929324, -8055211, -1021129, -3752191, 3563212, 2053531, -2546379, 1390496, 3196530, 1426466, -3106335, -4107063, -1401233, 906775, 539555, -5191005, 1788317, -2293513, 3616363, -898185, 1167694, 1456531, --143345, 547608, -1084479, -59593, 11654931, 572841, 4605816, -701153, -2226404, 642098, -1447404, -237297, 2610266, -4005594, -896038, 4374424, -2324651, -6419903, -233002, 10952167, --950262, 8619999, 4141959, 11870216, 1196685, 1210644, 4044249, -3196530, -7248831, -9113384, -1918777, -4596152, 10572062, 6288369, 7381438, -1351304, -3471407, 1040993, 1420560, 3658775, -9833328, 1286880, 3904125, -4569309, 2895882, -3230352, 1036698, -1721745, 2975876, 5852430, -405874, 5586142, 1640678, 2807835, -2017561, -1318018, 6991133, -1717987, -2303713, 5596880, --3810710, -316754, 311922, -2457258, -3752728, 2456721, -4251481, -738734, -5304822, -10171019, --1717450, -1585917, -873489, -10614475, -4669167, -3285650, -3400540, 3901978, 9713605, -2723009, -2631741, 5373541, -2233920, 977642, 252866, 648003, -4240744, 4479651, -13898514, 1373853, -7169911, 4060355, -7889855, -401043, 155693, 1988033, 2607582, -271657, -6199249, -5566815, -671089, 9874667, 4394826, 5916855, 9546639, -6463926, 6742025, 13049184, -1426466, 3049964, --7562901, 2649995, 2390149, -6146635, -3636764, -1227824, 2710124, -6221797, -8638790, 1721208, -645319, -7067906, 290447, 2376191, -1753420, 15397458, -1165547, -10737418, -1040456, 3838090, -8305393, 3264175, 3550327, -6867653, 1604170, 2269353, -6517076, -338766, -1378685, 10679973, -6174016, -1709934, -3974455, -8180839, 3218004, 3335579, -5184026, -137976, 1647120, 3238942, -2986613, -4177930, -427886, -912144, 9665287, -8380555, 750009, -2195802, 8723615, -663572, --2389076, -3776350, 1049583, -3846143, -8650601, 5036386, 4933307, 1500017, -3287798, 806917, -2477659, 15895674, 10872173, 7830799, 11527155, 4420058, -747861, 1460826, 4420595, -11544335, -6093485, 30602, 6541235, -4728759, -2067490, -7474317, 2355253, 12829604, -12389370, -8150774, --13179644, 6720013, -2779918, 333397, -5829345, 704375, -1977296, -6209986, 2658585, 2937758, --9246528, -1364726, 2066416, -2156611, 5398237, -13915694, -6368363, 14179298, 1787780, -257161, --1031866, 507880, -6830609, -7639673, 846645, -11110007, -2167885, 1173600, 3401614, -4726612, --676994, 13917842, -456877, 4955319, 10738492, -9473624, -2881386, 2386391, 2894271, 1998234, --2485176, -6686191, 8303246, -685584, -6898255, 5566278, -959388, 1448478, 2265059, -3794067, --2524904, -1653562, -26331908, -15188615, 12419435, -4977867, -5290326, 6979322, 6752763, -11710228, --14986215, -5230734, -5070209, -6072010, -589484, -10863046, -7170448, 3630858, 904091, -14489609, --15213311, -9023189, -3788161, -992674, 8587787, -759672, -5318244, 4258997, -12517145, 253940, --27380, 436476, 5171678, 2411087, -8916352, -7250442, 6356552, 1949378, 21926344, 5188858, --6412923, 955630, 1382443, 235686, 6326487, 1121523, 3075734, -2108292, -3925600, 1499481, --11461657, -2136209, -4538707, -6280316, 2229625, -9497783, 12186970, -1170916, 5610838, 8465381, -3304977, 4721780, 397821, -4766340, 737661, -79457, -5551782, 9234717, -2492155, 16027744, -581968, 728534, 1833951, -2563022, -7034083, 4408247, -5246840, 210990, 9738838, 6372658, -18834506, -10108742, 8460549, 4816806, 6048925, -1882806, -11754789, 2455648, -3816615, -9163313, -19396610, -542240, -6687801, -19224810, 11329050, 4308926, -1271310, -6648610, -9761387, 1087701, -19635516, 8558259, -1903744, -1207960, -10004589, -6411313, 4845797, 3463891, -8107825, -4085051, -6052683, 2607045, -1497870, 7005092, 8341900, 2288144, 11378979, 15097884, 7419019, -2533494, -1855426, 1932735, 1032940, 8229694, -11977590, 11919608, -2167885, -4929549, -10040560, 796716, -5856725, 5879274, -11674795, 2970507, 6458020, 1979443, -8975945, -15113453, -16110959, 4564477, -4634807, 1845225, -7419556, 45097, 9615358, -4472135, -10714333, -15899432, -369904, 4160750, --14798310, 5680094, 9993315, -4605816, 6932614, 4380330, 23157390, 16411607, 2822331, -4093641, --3326989, -2669322, -17188460, -5975910, -1018981, 11108933, -8363912, -3598109, -4369593, 781684, -16412681, -12845710, -4479651, -177704, 7209640, -2260227, -10841034, -16078747, 5003100, -10965052, --6212134, -6667400, -8727910, 2906619, -14012331, -5867999, 10513006, 17714056, -255014, -10406706, --10716480, 16330003, -2877628, -8266202, 15518791, 864362, -125091, 1028108, -19325206, 7689065, --7931194, 6878927, 4861903, -12082280, -2617246, -12284143, 3555159, -11930882, -3414499, 5266167, -5512054, -3901978, 2759517, -14603426, 8655433, -1048509, 5379984, 5876589, 2603824, -3229279, --4745402, 14698452, -11886859, 7289633, -4303021, -12506408, -9434969, -799938, 11228118, -7355669, -4189741, 2675228, -5660230, 6155225, -1511829, -3048890, 10009421, 1054415, -5531381, -14934675, --138513, -19203336, 3794604, 858993, 9623948, -8164196, -1169305, 3963181, 4554276, 4423280, --11917461, 16788490, 13059385, 1429687, 9782325, -5068062, -17261474, 3279745, -6986838, -9264244, -8858907, 19488414, 4045859, -6625524, -6965363, -17413408, 469225, -272194, 25640954, -10990821, -4832, -336081, -383863, -16318191, -16782584, 12418361, 880468, 6523519, -1878511, -20650202, --10877542, 281320, -2961380, -5422933, -5279589, 11347304, -2439005, 6838662, -8685498, 16225313, --20708722, 8801999, 11020349, 4840965, 5889474, 3520800, 16676284, 6670084, -1085016, 1564979, -234076, 14209899, 24672976, -5195300, 2113661, -9908490, 10575820, 13266080, -10468446, -1080721, --21045876, -2687576, -26805428, -13190918, 10056666, -10438381, -23857470, 2583960, -13009993, 993211, -140123, -14666240, -14641544, 6910603, 13554380, 4614406, -16381542, 8148090, -18378702, -5896990, --6926709, 6131603, -7683160, -2921652, 8477729, 1967095, -6172942, -12406013, 13455059, 13733695, -17023102, 2750927, -2079838, 1120987, 5365488, -781147, 6925635, -7234873, 9165997, -3117073, -10595684, 9113921, 6381248, -2556043, 396211, -16070694, 5634460, -3623879, 12506945, 2843268, --29044180, 5039071, 14385456, 19851876, -11000485, -14566918, 18250390, 8811125, 12905840, -22127134, -11428908, 28999082, 30190936, 2467459, 1016297, 17578764, -11422466, -15209016, 10515154, -16955994, -7082938, -7775502, -6153615, -3739306, -36550172, -22006876, -16607028, -4265977, -16076599, -29395294, -22355842, 2892661, 7174743, -3377992, 15685757, 923418, -14303852, 11173357, 3847754, -4398584, --8831527, -6041945, 1558536, 4387846, 13836237, -7677254, 10751914, 4066260, 19943144, -28848222, --8367133, -4169340, 3282429, 12451647, 16881368, 4421132, -14600204, 10000831, 13181792, 11976516, --3701725, 4481262, 348429, -4355097, -2447595, 1291175, 3954054, 2045478, 9642738, 2114198, --13204340, 12351789, -13664438, -16442745, 2188286, 12625593, -6356015, -3965329, 4028679, 6355478, -10130754, -5622112, 4622996, 24121074, -9816148, -24901146, -32999308, -16212428, -22414898, 10336376, -19018652, 12520903, 4555350, 11724187, 6733972, 12849468, -10909754, 14382235, 7661148, 5582384, -15320685, 18881750, -5990406, 29911762, 2910377, 4696010, -6180458, 10878615, -34182036, -15084999, --23340462, -24106578, 9641665, -21022254, 20773684, 23625542, 1109175, 5176510, -3546032, 4390531, --22290344, 9287867, 24866250, -14008573, -28708636, 3926674, -10723460, -9061307, -27987080, 5011153, -10449119, 48318, -3681324, 9214852, -15891916, -2478196, 10572062, -5540508, -14059575, 1950452, --6940131, 14937896, -9575093, -5125507, 13910862, 12234751, 25554518, 3693135, 6289980, -1976759, -6976101, 9440338, 15842524, -4090420, -368293, -9277129, 20835960, -25564720, 28151364, 1579474, --11068668, 13779329, -10109816, -6777459, 25820270, -36397164, 6062347, -6918656, 7201050, -13356275, -6768869, 16042777, -7987566, 198105, -4525822, -4154844, -4366908, 30270930, -33194728, -5609228, -36696736, -14598594, -23267448, 2524367, -8994198, -7488276, -13214004, -15905338, 20167556, 9104794, -1029718, 9910100, 23946590, 14631343, -1919314, 5270999, 16022375, 21109228, -18687940, 8956081, -17144972, 7920457, 6133750, 24348170, 11329587, 5374615, -955630, 11172821, -1424855, 12602508, -9881646, 5921686, -11435887, 21628382, -17637820, -1759863, 26373784, 26698054, -6431714, -22834730, -8596914, 108448, 22629108, 39699456, 8616241, -5507759, 2638721, -21981642, -2779918, -5401458, --4945655, 1023276, 19921132, -7985955, 8731669, 24720222, 4031901, -21598316, 14702210, -412317, -9360344, 23411330, 31875100, -8137353, -8412767, -1795833, -25172804, -35915052, 1121523, -15620259, --2560874, -18988588, -1866163, 2356327, 3099356, 17406428, 2684, -6190122, 25182466, -47042776, -25982942, -19931332, -45969036, -13882408, -11424613, -1843078, -10438381, 5399848, -12555263, -28815472, --17062832, -8761196, -2389076, 3073049, -11555610, 11305965, 22646288, 621160, -1180579, 5931350, -1608465, -4401805, -8090645, -4918275, 6300180, 6434935, -1755031, 6099391, 27778774, 7333657, --7816304, -27585502, -4127464, 19029390, -23270670, -11343545, -8720394, -25233, -1564442, 14498736, --4666482, 1423245, 20633022, 6904697, 22857280, -3602941, -10486163, -5363878, -5618891, -6372658, -11096048, 629750, 7537668, 13181255, -24146844, 2866891, -6336151, -15901043, -11353746, 22795002, -17061220, -201327, -11679090, 3534758, 9802189, -483721, 6564858, -18187040, -40857488, -21099026, --15691126, 11391327, -108448, -7019587, 13771276, -18731426, 22468584, -2033667, -34890704, 6914898, --16702054, -3769371, -2313377, -4424890, -22148072, 6768869, 1387811, 17457432, -38044284, 340913, -19063750, 1988570, -8884140, -19645180, -1321239, 10812043, 16687559, -14008573, -4726612, 8617315, -19024020, 16930224, -16494285, -3700114, -26840862, 12262132, 13803488, 8165807, -7587597, -2423435, --7258495, -3183108, -8930311, 2279017, 19711216, -7609072, -7733089, -7067906, -11169062, 22017612, -19152870, -2185065, 26953604, -1530619, 9489193, -24160802, 19430432, 8425652, -27058830, -8946417, -30451854, 12501576, 7971460, 5768141, -14908905, -11563663, -16063178, 26577258, -14499273, 20592220, -20460150, -24097450, 54883776, -11705396, 33283312, 2100239, -9828496, -13904420, 23173496, 12238509, --25979720, -3645890, 13459354, 22957138, 1889786, -19447076, 9289477, -37485936, -10013179, -34120292, --47046536, 1329292, -18216030, 5710696, -3706020, -7730405, -18124762, -12706661, 10167261, 27763206, --23912230, -5588826, -40977748, -36197448, 9341554, 13618268, -22798224, -24019068, 882616, 4397510, --38315940, 1178432, 111132, 18689550, -17666812, -214212, 15417859, -11602317, -20492900, -23040352, --11550241, -21179558, -17414482, -22133578, 28165858, -38501160, -24210730, 32204202, -2316061, 7985955, --29461328, -6499360, -9434433, -937377, 45881524, -8494372, -2540473, 2803540, 20480552, -1464584, --22835268, -11392401, -17118666, 2902324, 54563264, 8717173, -22311818, 40315248, 28331752, -29948806, -29025926, 49683108, -2742337, -22982370, 31839130, -8584029, 32742146, 32149978, 24252070, -64873872, --42591044, -41345504, -17046726, -26764088, 33967824, 15978352, 27493160, -2049773, -59301152, -6357089, -7195144, 41744936, -3686693, 11558831, 34100968, -11076184, -28184112, 5140539, -3752191, 48161080, -27741194, -12408697, -22691386, 51049444, 1476395, 26829050, 9788767, 47835736, 37207840, 32741072, -1313186, -22950158, -15771120, -16898548, 35991288, -15524696, -27672474, -11447162, -417686, 1596117, -14959371, -13743895, 4266513, -74176768, 6909529, 14658723, 10948409, -29417304, -31478352, 11944304, -25446070, -30412126, 11317239, -16074452, -16286516, -19468550, -3539590, 26479010, -17336636, 28835336, --8058433, 13066364, -49328236, -27900644, -2529736, 28419262, 16585553, -31879394, -38661148, -14398878, -2698313, 43056512, 16077673, -94489, -26196616, -5927592, 11465952, 87300040, 8409546, -45814952, --104562056, -8871255, 61527552, 16164646, 26737246, -2179159, 37423124, -5608154, 16412144, -7951058, -21243982, 30873298, 16023449, -13694503, -34353832, 41429256, 46089296, -9354976, -45342508, -26657252, -5004711, 27618788, 9122511, 10677826, 2069101, 8015483, 3498251, 8020315, -8419747, -51352776, -303332, 34069828, 25766582, -8840116, 3318399, 21689584, 44824428, 28701118, 22524956, -24105504, --17008070, -2534031, -3573413, -37313604, 29166586, 18634252, 30387430, 61303680, -28766080, -17118666, --928787, -13860396, -12202539, -23139136, 48002164, -24909736, -27497992, -27727236, -7987029, 61821760, -18070002, 26394722, 2287070, -969052, -9445707, 40715752, 34231964, -10228465, -28221156, 17150878, -3351685, 1184874, -28027346, 5264556, 63607928, 54318452, 5090073, 7007239, -39060044, -66516160, --63817308, -26657788, 47130824, 57880052, 53935664, 34692600, -11140071, -32877974, -36194228, -18622978, -11515881, 25524454, 36104032, 6956774, -32285806, -21570400, -8172249, -21561810, -14354318, 9023189, -37563248, 61006788, 34541736, 21405580, 13650480, -32236950, -6883759, -68513320, -83456584, -46755552, --26988500, -18230526, 35207996, 63270772, 63045288, 63483912, 48816060, 25560960, 904628, -20421496, --9383967, -35449588, -73423000, -1205812, 4053912, 11710765, 20973400, 19022948, 21306260, -74179992, --45949172, -22963580, -48578764, -13853954, 31420906, -14362371, 20250234, 9460739, -23713588, 23606750, --20397874, 26193394, 19054622, -9111236, -37546068, -61729956, -72327248, -39911520, 10897406, -118135224, --61386356, -30361124, 40002252, 11003169, 153135984, 158792464, 118672632, 155196496, 160953904, 148202144, -105568688, 97850632, 106633840, 45268956, -4508105, -61349312, -98553392, -134919952, -132706440, -196864656, --119482232, -74590160, -60099476, -84480400, -43867184, -7224672, -63567128, -46082316, -51103668, -5851356, --28695750, -4700305, -40043052, -15179488, 31949724, 35822712, 13888850, 402653, 35181152, 32877974, --61394948, 24008868, 52830784, 111040472, 81126560, 106932872, 47174312, 50046568, 167843024, 99145024, -172128864, 68340984, 162600480, 120288072, 143822880, 195829040, 181568672, 155182000, 167029664, 190645552, -200246400, 179790016, 198315280, 147091360, 201686288, 173010416, 148262800, 166259264, 92603792, 184319056, -91319056, 71124120, -48287780, 21985400, -95662344, -107075144, -115826144, -3383897, 0, 0, -0, 0, 0, }, -{ -15113453, --1633698, -2529736, 694174, 1110786, 4139812, -1085016, -2465311, -4063039, 4425964, 384400, -1467805, 4436165, 1223529, -699006, 1129576, 2338073, 1537598, -2365453, 5131949, 536871, --6700149, -1268089, 4452808, 1720671, 485868, -2434173, -1402307, 2183991, -816044, 8834748, --1593433, 2013803, 346282, 805843, -4951561, -1691143, -1029182, 1817308, -663572, 1092532, --2844879, -1573032, 1886564, 2798171, 1957968, 3325915, 3411278, 2185602, -3005403, -4722317, -593779, 2790655, 3081639, 2320893, -1652489, -2074469, -7317014, 3772592, -1742146, -2819109, --473520, -1253594, 1475321, -3479461, 1503239, -4404489, 1876364, -4182761, 3798899, -1668595, -3176665, -807991, -527744, -4976794, -453656, -7773891, -15089831, -2759517, 307090, -3581466, --7044283, -2458332, 5346698, -8506183, -4537633, -2880849, -1538672, 2573759, -1091459, 2877628, -1470489, 2509335, -179315, 3129958, -2700998, 431644, -1121523, 517544, 8223789, -1817845, --385473, -4110821, 5128191, 3022583, 2527588, 6167036, -3082176, -1905892, 2256469, 5514201, --1393717, -459562, -4403415, -5039071, -3194919, 3453154, -4278861, -3854196, -357019, 4955856, --6699075, -1531693, -5577552, -2843268, -1511292, 704912, -395674, -4161823, 5352066, 816581, -4825933, -1980517, -1082869, -5944772, -19864, -2131915, -2112050, 3311420, 1995549, -1120450, -1903207, 3677029, -1000191, 1546725, -2640868, -1602560, -649077, -2569464, 2173254, 778463, -1483374, -12412455, -4581657, 3688840, -3404299, -1400159, -1497870, 1782948, -738198, -3214783, -5102958, 4737886, 1448478, -505196, 2303176, -6342056, -1053341, -6269042, -3312494, 4752382, --900869, 906238, -763967, -658204, -20938, 9858561, 8832600, 4070019, 4649839, 5735929, --1234266, -590558, -2097555, 5065914, -637266, -1839320, 1252520, -2857227, 1840930, 3659312, --2007897, 4117263, 4415227, 9007083, -3682398, -4168803, 3645890, -2259153, -68183, 1940788, --5410048, 368293, -2939368, -2996814, 6667937, 4110821, 4721243, -2777233, -4001836, 2693481, --4635881, 3129958, 13005161, 830539, 581968, 3080565, 931471, 1334661, 7159174, -3920768, --1509681, 1563905, 409633, -3529926, -3508452, -3468723, -2874407, -615254, -3712462, 4012036, -6310381, -3007551, 3088618, 10081362, 3279208, 2341294, -7096360, 5856725, 1445793, -8991514, -3742527, -2499134, -5510980, 2215666, -847182, 2132988, 5149666, -5486284, -5889474, -2554969, -7770133, 238908, 3801046, 8165807, -12233677, -9768903, 1478006, 5980205, -4498442, 388695, -7973607, 2085207, -1168768, -2440078, 9557376, 1174674, -2489471, 1340030, -8922258, 978179, --4986457, 4449586, 636729, 4721780, -2546916, -1230508, 1989644, 97711, 457414, 220654, -4385162, 3609920, -5190468, 2793876, 3839164, -6951942, 607201, -3190087, 1061931, -1683090, --5557688, -37581, 4307316, 3837017, 8533563, -5634997, 6504191, -4713190, -1290638, 3834869, --4860829, -6861211, -2859375, 20041392, 9178345, 12083890, -858993, -3522947, -4279935, -4565014, -2530273, -3860639, 5750961, -789737, 7843147, 311385, 4203699, 4911295, 4036196, 3192771, -4559645, -15155866, -4319127, -1580548, -3048353, -2949569, -4609037, -10857677, 588411, 7130183, --4396436, 4201552, -3511136, -5524939, -3918084, 405338, -3291556, -1468879, -3379066, -456877, -8924405, 248571, 4066797, 5347235, 7354058, -3645890, 1799591, -1869921, -5497022, 6099928, --3455301, -527744, -5437429, 3770445, 51540, -201863, -1421097, -2888903, 1989107, 5352603, --2263985, 2852932, 3157875, 2176475, 9904731, -10227391, -4000762, -196495, -5236102, -7490423, --2573759, -9115531, 1546188, 9458592, -6599218, -4017942, -7424388, -342524, -1603097, -4742181, --4812511, -584116, 6470368, 8751533, -4749697, 4461934, -3833795, -2157147, -1389959, -11286100, -8286066, -2538863, -955093, 12614319, 8194798, 8373039, -3240553, 147640, 1772748, -2149094, -3100967, -6702297, 84826, -4638028, 5491653, -5247913, -3227131, -699006, 1171452, -6434398, -1495722, 504659, 8535174, -98784, -10952703, 6331856, 6393059, 8506720, -1051730, 2028835, --5891622, -4844723, -1619740, -4705137, 2147484, 1046361, -1329292, -827318, 5095442, 7195681, --9644886, -2310156, 411243, -4256850, -3856344, 6500970, -4889284, 2370285, -4767951, -7082401, --4670777, -3565360, 2930242, 843961, 12986370, -2232309, -2733210, 3576097, -3086471, -1215476, --2615635, 3343632, -2306934, 4349728, -1403917, -2173254, 3969087, 6934225, -15254113, 14665703, -8145406, -9035001, -8754754, 3483755, 11960947, -348966, 3634079, 13544179, 4778688, 3952981, --2142652, 6973953, 6713034, 7355669, -13407277, -8521215, -8065949, 6328635, 5788006, 6977711, -515933, -8470212, 3582003, -1436667, 3922916, -12097849, 4776541, 7042136, -5422396, 2943663, -6009733, 1456531, -9664, 1072131, -1710471, 10253161, 7251516, 5400922, 366683, 3442953, -8207683, -7374459, -3717831, 168041, 10794863, 6623914, 4330938, -8215199, 430034, 5255966, -6485401, -2440615, 2087891, 6002217, 7796977, 2210298, 7203197, 2593087, -722091, -6809671, -8590, -11198053, -4457639, -5538361, 896038, 3271155, -6408091, -2957622, -11722039, 4546760, --3508452, -724239, 5564130, 7954817, 9414568, 2218888, 12882218, 4290136, -2414309, -5738077, --15693810, -7323993, 9307194, -3134789, -14445049, -3608846, -2455111, 2375117, 7685307, 12238509, --903017, 3743064, -2958696, 6199249, -6923488, -6955163, -7908646, -13482976, 7097971, 4367445, --11648488, 555661, -8570070, -2980707, 7147363, 4382478, 5785321, -1483911, -1823751, -1751273, -12752832, 10335302, 10471130, -4660040, -9433896, 7475391, -1507534, -3024731, 8961986, 1876364, -8802535, -54761, 4781373, -6150930, -650151, 4820027, -19826642, -2687039, 595927, -14011257, -3345243, -3365644, 12947179, 8776766, -8554501, 941135, 11752104, -950262, 5764920, -3758097, -7905424, -3542274, 1169305, -2863133, -304406, 6235219, -8462696, 8931921, 3809099, 5222680, -753767, 10964515, -31454730, -6573448, 16818018, -13512504, -4936528, 14420890, 5403069, -4410395, -1545651, -11702175, 10625749, -1173063, -19030464, 1555852, -909996, 7429220, 7199439, -3566970, --14829985, -6162741, -5558225, 587874, -7802345, -4093641, -9975598, -2612414, 11312944, -8774081, --4328790, -3144990, -5653788, -5874979, -8195872, 6202470, 1498407, 7640210, 1608465, -4866198, --7853348, -7641284, -1269700, 5916855, 8415988, -2281702, -6808060, 8207683, 3677029, -10837276, --12212203, -25355876, -1727651, -7631620, -4413079, 4565550, 4604205, 3134789, 12375411, -413927, --4826470, 153008, -5204427, 14231374, 7943542, -1604170, 8050916, -6425808, 4745939, 4228396, --6220724, -1931125, -5361193, 6141267, 4625680, -10422275, 9404905, 14212047, 319438, 6449431, -19986094, -8885214, 7065221, -4260608, -906775, 12782896, -4309463, -4483409, -3685619, -280247, -1225676, 8947491, 26569204, -686658, 768262, 8437463, 882616, 945430, -13744432, -12548284, -1147293, 2638721, -9314710, -3477850, -2863670, 8411693, -4309463, 2278480, -1121523, 4120484, --4394289, 16824460, 7932268, -6693707, 7834557, 8776229, -10692321, 2486249, 3120294, 3999688, --3721589, -2498060, 12307766, -10901164, 3885872, 15553687, -6230387, 2626373, 8357470, -243739, -7096360, 5320928, -1040456, 5319317, 5861020, 10516764, 4866735, 1596654, -1650878, -5884642, --8766028, 1102733, -599685, -22461068, 13705241, -2722473, -8828305, -7221451, -18854906, -18394272, --14515379, 3282966, 7248831, -2526515, -1728188, -595927, 27845346, 28665148, -1188095, -23117124, -4172561, 5108327, -3121368, 6430640, 3072512, 2319819, -742493, -3714073, 22389128, 4466766, --4201015, -25276956, -14875082, 6220724, -2152852, -8684424, -15882789, 2299955, 1970853, 4071092, --4460861, -16637093, -18560164, 19487340, 17638356, 5808944, 16109349, -14341433, 1186485, 7587597, --3842922, -9115531, -17267380, -8128226, 2019708, -725850, -8632347, 7874286, -820876, 7613904, -5222680, 319975, -18728204, -10402948, -9431748, -1595044, 627065, 2132451, -4261145, -5235565, --118112, 2575907, -17208860, -4294968, 1067299, 3189013, -8794482, -20164872, -6364605, -5432597, -12682502, -1096827, 4478041, -7206419, -7323456, -9531069, -12484396, -6585259, -1402307, -1681480, -8664023, -8420283, -2525441, -5384815, 6208375, -4382478, 13399224, -7416872, 3269007, -5857262, -2078764, 2129230, -6594923, -6325950, -12657805, -16351477, -8872866, -5018133, 455803, -712428, --7279433, -8916889, -14649597, 6515466, -14675366, -21501680, 14369887, -13331042, -14369887, 13401909, -3966402, -4375498, 16779900, 7871602, -10851235, 10064182, -29570312, -3200825, -6656126, -4413079, --13209709, 24232206, 13173202, -8566312, 5037997, 6846178, -3976066, 7667054, 1487132, -777926, --5870147, 7386807, 11275900, 12149926, -19479288, -1940788, 1314260, 4959614, -7988103, -4867809, --8120173, -10755135, 18189186, 4080219, -10831371, 5100811, -6027987, -9505299, -11629161, -25651692, -8165807, 14695231, 3010772, 14826227, 24019068, -2595234, -6743636, -21937620, 4192425, -3299072, --17152488, 1921461, -38797512, -26796300, -18447958, 9802189, 19924354, -28185722, 6906308, 19266150, -12629351, -693637, 7683697, 18149994, -8038568, -1513976, -4912369, 146566, -11557220, 8176007, -688269, 619549, 3686693, 24485072, -731755, -11364483, -10152229, 5543192, 18862422, -7781944, --17990544, 5123359, 19156092, 10468446, -1925219, 8644695, 6692096, 8315594, 2542084, 6985765, -13232257, -1954210, -20616916, 683974, 7213935, -20305532, -13866839, 19100256, 15988016, -15438260, --9138617, 4362613, -264141, 9153649, 24471114, -5510443, -3785477, 4076461, -390305, 8325257, -5256503, -9112310, -5871221, -3766686, 7905424, 5753646, -5287105, -17794586, -1945083, -26565984, -25616258, 3240016, -3243237, 1145683, 11451457, -2388539, -10073309, -4803384, -1575716, -15209553, --654983, 2559801, -18600430, -4963909, 13945222, 18080738, 12821014, 33805688, 20402706, 30605400, -11402601, 7951595, -15964930, 17083770, -5905580, -2127083, -12828530, -8671002, 16542603, -5681168, -37664716, 17345226, 10759430, -2286533, 8579734, -6234145, -17820356, -9232569, -11137924, 7636989, --10524280, -587874, -11258720, 6091874, 15161771, 13479755, -1140851, 19647864, 16535624, 330176, --6083821, -8152922, -14006962, -5243082, 31395138, 11731166, 36175436, -12320114, -76773, -1847910, -8235063, 28594818, 9761924, 14496, 18548354, 20813948, 22513144, -2836826, -13670344, -5769215, --3914326, -4764730, 14916958, 9346386, 14194330, 20820390, -13682692, 31918050, -22162568, -42933568, --6276558, -14529337, 8869644, 19144816, 32694364, -16531329, -12008192, 11009612, -9009768, -2261837, --3908420, 3833795, 14655502, 14663555, 22950694, -24932286, 28174448, -10365367, 3047279, -13118441, -12023761, 20480552, 9076340, 3508988, 1998234, 25084220, 6810745, -1138703, -7814693, -4145180, --25509422, -3764002, -12076911, -31625992, 3317862, -2060511, 13492103, -32859722, -5728950, 7577933, -12814572, 27183922, -6753836, 7912941, 15644955, 2263448, -2986613, 7765301, -6394670, -1754494, --39986684, 3745212, -16462073, -20268488, -21799106, 9481677, -35543000, 12394739, -12551505, -18012020, --23671176, 22981834, 25852482, 24555938, 6586869, 4990215, 24584930, -30880278, -930934, -8980240, -15129022, -36643052, -10342818, -2966212, 14861124, 10471667, 10945724, 15967615, -10252624, 5651640, --10739029, -29021630, -1141924, -9951976, 34495568, 7961259, 24261734, -7455527, 33349884, -20587926, --40371620, 9721658, 6310918, 5296232, -20245402, -21814138, -18078054, 7424925, -18169322, 8666170, --9763534, 27438936, -8941048, -3126199, 18933826, 1512365, -47925392, -18887656, -795106, 32432372, --3719979, -8856759, -27429808, 5792301, -6767795, -22477712, -27856084, -2127620, 5196911, -8461086, --10479183, -26734560, 18476950, -5710159, 6828461, -12642773, 936840, 9575093, 5447093, 25975426, -714038, -7097434, -31486942, -9865003, 16110422, -20444582, -10457172, 9663140, 18447422, 15360951, -36069136, 28493350, 1568737, 22114786, 22067542, 8977019, 2197950, 14204531, -8840116, 55188184, --22565758, -55537148, 17549774, -46612744, 725313, -35461396, 3251827, 50035296, 23487566, -34894460, --21047488, -15106474, -10440529, 12359842, 22417044, -13485124, 2854543, 17654464, -36453000, 1753957, -10433012, -29640106, 16410533, -10503879, 14708116, 3991635, 16413754, 707059, -16836272, 18363670, --22416508, -6075768, 48636748, -19979650, 19015968, -11871290, 21191906, 16894790, -4178466, -21174188, -23841364, 56168508, -29023242, 7536594, -39139500, 20384452, 14760729, -22810034, 27041114, 1930588, --47228536, 6774237, 4844723, 22340810, -3584150, -3740917, -23471996, -25513180, -10349797, 61780420, --6691559, 31374736, -24730422, 20697984, 13100724, -5586142, -18107046, -3743601, 20713016, 35108672, --9191230, -11256036, -78383, 7403450, 34125664, -6927246, -3053185, -21492554, 11374684, -32548872, --10116795, 25892748, 34988416, 5447093, 7211250, -34439732, 24910810, 19147502, -40375376, 1477469, --19887846, 127238, -44656924, 45044008, 44311176, -6890202, -18779744, -10131291, -5769215, 20551418, --20783346, 27277874, -36678484, -25561498, 14358613, 11511586, 6319508, 11045582, 40944460, 8376260, -20645370, 2145873, 21391084, 10408316, -5146982, 1312649, 18757196, -3511673, 2195265, 27756226, -17132088, 37206228, 52076, 20192252, 3837553, -31334470, 33512020, -17658758, 677531, 6815576, --23337242, -20864952, 14942728, 40845140, 27981712, 13342853, -50934556, -15117211, -34138012, -2517388, -67330592, 38896836, 52419540, 1684701, -40145596, 12305618, 52308944, 7946227, -5292474, 39664560, -11256572, 26207354, -63747516, -60058676, 50494320, -3593814, -10132365, -44777720, 379031, -14394046, -31027380, 21861384, 9682467, 15945603, -38615516, 21630530, 34923988, -219580, 13540421, -32060320, -25355876, -16117939, 13403519, -1761474, 2500208, 16515223, -3609920, 9692131, -1681480, -26533772, -8655970, -4689568, 28687698, 19860466, 35095788, 7701950, -22686018, -23971824, 23622856, 20488604, -13432510, -1372242, 9951439, -10095321, -18115098, -190589, -5158256, 25262998, 22793392, 13799730, -25565256, 19558208, -30063160, 31699542, 37955164, 21488258, -14849313, -20201378, -19917374, 26510148, -21170968, 46386184, -28327994, -36266168, -20848308, -51029580, -8603893, 43231532, 11246909, 32310502, --37511172, -50707996, 13491029, 20725902, -34274912, -1795833, -26049514, 3644817, -30269856, -12293270, -22594212, 7085086, -25419764, 372588, -16235513, -63424320, 9323300, 39062728, -1226750, -78683800, --16837882, -1178969, 275415, 28491740, -74698072, -7698729, 32639604, -53870700, 11398306, -11815992, -62566400, 34146064, -39909372, 10043781, 41625212, 4750771, -18234820, 14413910, 8977019, 5872294, --2178622, -4083977, 1851131, 7093676, 13137768, 44040056, 33640868, 38432976, 24595130, 48330192, -21806622, 49332532, 18530100, 43645996, -1348083, 26891328, 22507240, 26548266, 18565534, -2595771, -5872831, -34452616, -22432078, 63391568, -1577327, -26606786, -9663140, 19093814, 31270584, 67916856, --12002823, -39366060, -21913996, -29512868, 36503464, 43414604, 47472272, 13882408, -4933844, 32189706, --61244088, 50685984, 16648367, -30153892, -4033511, -92733712, -1535988, -62268972, -86595128, -23243826, --52696028, -23509040, 89358944, 84272088, 74320648, -21633750, 56481504, 69455528, -57583700, -52101712, -17289928, 60788820, 1128503, -27897960, -181999, 16816408, 17731772, -49504328, 18166102, -6195491, -25941066, -26927298, -13648869, -31607738, 33459942, -4060892, -15501074, -29446296, 21486110, 13646185, --5771899, -24704116, 11271605, 11995844, 5344013, -21641266, -3941706, -261456, 25194278, -18631568, --5585068, -27604828, -8411693, 10982768, 21826486, -28598040, -12401718, 32993402, 26045218, -6965900, --20417738, 1360968, -11115912, 28111098, -16582332, -6614787, 11265699, 11519639, 14491757, -12486544, -2741800, -17800492, 21128554, 29856466, 10765872, 6969658, -23893976, 27308476, -19954418, 40960028, --30577482, 33928096, -50874960, 36171676, 234076, 1887101, -37774776, -4619774, 5814312, -2275259, --2499134, -1524713, -12630962, 55407764, 58331560, -34177204, -20724290, 11953968, 55705724, 35119948, -20587388, 20410758, -9185324, -23077396, -7354595, 13515725, -460098, -5150740, 16452409, 668404, -11528766, 1831267, -6498286, -20593832, -5800354, -818728, 1329292, -409096, -17268990, 19475530, -2974802, -7216082, -622770, -124554, 87510, 12772696, 22408992, 10128070, 2127083, -7611219, --11827266, -2491618, 7211250, 15699179, 20273856, -10783589, -11317776, 3163244, 20542292, 9946607, -4562866, -8616778, -18695992, 16681653, -3248069, 1230508, 1170916, 5974837, 5070209, -1365800, --470299, -11213086, 2168959, 11818676, -4702989, 7599945, -3060701, -7376070, 6245956, -167504, -3970161, 1043677, 10710038, 8366060, -11973295, 6646462, 3745748, -21616570, -19639274, -72522672, -30721902, 112317688, 103244568, 88463976, 35081828, -83498456, -52515100, -75024488, -84443352, -75151192, --22042846, 16596827, 63520956, 66533340, 79271136, 52864068, 52960168, 1664300, -55736328, -52855480, --65612068, -50938848, -28549184, -1509681, -18364206, 20388210, 24653650, 40328668, 43862892, 44962404, -26599270, 2762201, 11899744, -9242770, 6459094, -29853244, -21948356, -27530204, -45802604, -35847408, --27740120, -19056770, -32442572, 5283884, 56150256, 63887100, 35576824, 66820028, 16752520, 39405788, -20255602, 12282533, -16070694, -34169688, -47678968, -66659504, -51311976, -76097160, -31238908, -33056752, -23133230, 23775866, 65812320, 76304928, 67755256, 61146376, 59515360, 38570952, 6681359, -17242146, --58684284, -34739844, -75764832, -62251792, -83965536, 5574868, 3627100, 11296301, 0, 0, -0, 0, 0, }, -}, -{ -{ -11112154, --2180770, 3111704, 1506997, -5671505, 1533840, 4866198, -1912334, -797253, 1494649, -2167348, --5287642, 5623723, -1262720, 9840307, -102005, 1028645, 4223564, -6033892, -2025614, -6458557, --1136019, -2865280, 2684355, 4490389, 1052267, -2036351, -425202, -153545, 4327717, -3388729, --2140504, -4611185, 3471944, 1825361, 1074, 654983, -3719979, 2979097, -4370666, 424128, --2235531, 3635153, 2950106, -4909685, 505732, -5879274, 274341, 1964411, 2135136, 2486786, -1970316, 672699, -3381750, -2552284, 1389422, 2266132, -2422362, 5784784, -1857573, 788663, --1344325, -344671, 864899, -746251, 4227322, -3030636, 8243116, 1514513, 1303523, -1824287, --197569, 740882, 1292248, 129386, 938987, -5042829, -5404680, -4244502, 1082332, -2385854, --532039, -600222, 2398202, 10223096, -2838437, 1129576, -9767293, -5150203, 2795487, -4469987, --3715147, -1244467, -4214437, -972810, 8238821, -3499325, -5525476, 9166534, 7099044, -2459943, --1844152, 8396124, 2195265, 3315178, 1432372, 502511, -2298344, -3402151, 3109020, -2512019, -2272575, 984621, 755377, -1070521, -3049964, -2147484, 1821066, -2487323, -4281546, -1747515, --2040646, -5095442, 5632313, 9145059, -5454072, 3039763, -3221, -1952600, 1168768, -144418, --208306, -2955474, 5303748, -3246995, -4428648, 4740034, 1076963, -169114, -900333, 2636036, --251256, -1611, -2069637, -737661, 4402879, -7125351, 1840930, 1386738, -2481954, -1660005, --3449396, -3486440, -15956877, -2483028, -5850819, -1400159, 1254131, -4311074, -9739912, 7145215, --2416993, 1685775, 4728759, -1484985, -519691, -565325, 2158758, -1656784, 7977902, -306016, -6146098, 9089225, -10913512, 2304787, 7522635, 544387, 1470489, 5255430, 9632001, 1405528, --2210835, 4888747, -1330366, -2499134, 2143726, 1741609, 2120640, -2702071, 9816685, -4527433, -2450816, 3696356, -79457, -461172, -4841502, 803159, -5602785, 4700305, -5721970, -4347581, -3121904, -5282273, 3610457, -3679713, 1503239, -2964601, 1999844, 4315369, 8376797, 2607045, -936840, 4119411, 54761, -7218767, 962610, 2081449, 2770254, -1777043, 402116, -944356, -1417876, 4109747, 2502892, 5598490, 2004139, 803696, -3222836, -1681480, 3346317, -5754183, -4271345, 2832531, 834297, 5478231, -334471, 3071975, 7381438, 4611185, 9687299, 1882806, --1505386, -9989020, 1497333, -6134287, -2129230, 748935, 2157684, -3859565, -103079, 9565966, --5022965, -296353, -5026186, 2288144, -85899, 1813550, 3773666, 4565550, -3067144, 3405909, -3411278, 6876243, 81068, -6884833, 462783, 7282117, -937914, -542777, -1247688, 4861366, --6010270, 392453, 3514357, 4855461, 5646809, -2334315, -4193499, -602369, 8196408, 688269, -2723009, -7048042, -3488587, 1570347, 1014686, -1302449, 4066797, -428423, -1430761, 2419677, --4902169, 162672, -1277753, 2870112, 3919695, -6844568, -2250026, 2093797, 3673808, -2952790, --3745748, 1847910, 4175245, -403727, 2090039, 17066052, 8645769, 6572911, -6201396, -1394254, --8752606, -6682432, 9876277, 607738, -5848135, -3097208, 2294050, -6025302, -293668, 9526774, -4143033, -686121, 3363496, 14091788, -9360344, 2007897, -1588064, -4940823, 8466454, 3905736, -4482872, -3516505, 3890704, 4445291, -1278827, 2741800, -795106, -4406637, 1021129, 1229434, --552977, 4555350, 1352915, -2073932, 5528697, -2778307, -2405182, -3439195, 1635309, 1745367, -503585, 3546569, 618475, 11846594, 885300, -329102, -2755759, -2860985, 2973728, -9375914, -411780, 5116917, 4331475, -5200669, 7160784, -182536, 3168612, 5434744, -1699196, 4154844, -3324842, -1836635, -5340255, -4176856, 2993055, 7955890, 1971927, -3652870, -2253247, -1967095, -4794794, 4032438, 1239635, 11166378, 2934000, 6571300, -211527, 1296543, 1970853, 1661616, --1822140, 6662031, -2877628, 7206955, -3659312, -3175055, 1947231, -5241471, -1446330, -1879585, -2049773, 2760053, -2057826, -7596724, 3186329, -9130564, -3653944, -1898376, -352724, -1806571, -1533840, 7372312, 4221953, 47782, -8376797, -8334384, 8590, 4748623, -3082713, 267362, --1326071, -4058207, -5594195, -73551, 3145527, 6910066, 6376953, -1548873, 1709397, -10180146, -2710124, 5550709, 6572911, -1662689, 5888400, 575526, 8800388, 4749697, 1057636, 3381750, --1263794, -3447248, -2604898, -1990717, 4940823, -3383361, -4504884, -5335423, 4669167, -2722473, --11908334, 664646, 2239826, 4264366, 5482526, 11105712, -8184597, -6551436, -15877957, 8152922, -9474698, 2246805, 7755101, 2077690, -8503498, 179315, -4395362, -978716, 7120519, -9384504, --3666292, 4540854, 3266323, 10274099, -2614561, 4991826, -15388331, -6470905, 2984466, 9629854, --6443525, -3095061, -6845104, -6355478, 3117610, 106837, -648540, 3770445, 622770, 3903589, -10641855, -5814849, 10316511, 458488, 1568737, 3526705, 1721745, -2220498, 3169149, -6670621, --2130304, -3104188, -1457068, -4625680, 6393596, 2424509, 18821620, 1832340, -1834488, -3678640, -287763, -2847563, 9601399, -4961224, 816581, -10019622, 8021389, 9235253, -9883793, 7193534, -5403069, 3937411, -5493800, -3610457, 8213051, 3877282, -12647068, 7708930, -6049462, -1273995, -2769717, -988916, 1306744, 4846334, 3710852, -2513630, 6442988, 1459215, -281857, -5390721, --9516574, 3513820, -5164162, -1823751, 8946417, -12146704, -5265630, -8886287, -1036161, 8034810, --825171, -6207839, -9031779, -9796820, 3830037, 10868415, -3115999, 6891275, 9924596, -2501282, --2358474, 4182761, 5510980, 12135430, -1751810, 6951942, 944356, 14391362, 10355703, 3139084, --3318936, 1733019, -7801808, 14003741, 3206730, -5713380, -6662568, 8225399, 6719477, 5138392, -3485366, 2690797, 7169374, -2709051, 3225521, -4326643, 793495, 751619, -6982006, -9134322, --3219078, -6336151, 4491999, -3715684, -2848637, -9984188, -6305549, 2374580, -3299609, -861141, -5254893, 10761041, 13399224, 7161321, 5743982, -4527970, -10331544, 395674, -7131793, -17258790, --19594178, -6446209, 1402844, 9404905, -6662568, 4451197, 3431142, -685047, 14938433, -2231773, -14087493, -8360691, 4388383, 4091493, 532576, -12807056, -4820564, -4929549, -13880261, 4636954, --3156801, 2806761, -489089, 4962298, 393526, -5778879, 3400540, -9366250, 7210177, 3788161, -16083579, -827855, 933619, 14130979, -12144557, 10950019, 14079440, -8623221, 9256728, -3762928, --3586298, -7225209, 2338073, 1567663, 10220948, 6156836, -1916092, -4063039, -7619809, 4483409, -5746666, -9422085, -3592203, 8849243, -14787036, 1502165, -11236171, 6837588, 1402307, -100932, -4396436, -3878892, 2206003, 14477261, -4983236, 3412352, 7894687, 4752382, 1809792, -7030862, -4484483, 3401077, -3037616, -11370389, 1764158, -1686312, -7118909, -7915088, 23422604, -8576513, -4351876, 3612604, 8199630, 2866354, 4878546, 12020003, -9373229, -5398774, -997506, 16636556, --6587943, -6784438, -8400419, 4266513, 2492155, 9194988, -19007914, 380641, 142271, -1072131, -9382893, -2138357, 7175817, 13988708, -10281615, -4298726, 3668976, -7323993, -9721122, 6558415, --9050570, 13163001, -2478733, -13154948, -2031520, -7471096, 3972845, 10771778, -474057, 5544803, --927176, 2251637, 12327093, 584116, 8863202, 3809099, -7125351, 7332583, 5818607, 1045825, -4837207, 18289582, -3294240, -7920994, 3994857, -10074383, 492848, 17501454, 5538361, 2965675, --3639985, -4692789, -3707094, -5837398, 9991168, -6542309, -2319819, -3934190, 11195369, -21355652, -6560026, 8061117, 11565810, 3498251, 34909496, 10470593, -6383932, -8429410, -7151121, 25383256, --21803402, 1818919, 8569533, 1359894, -11788075, -2566243, 5990943, -1144609, 1447404, 10635950, --10783589, -8979703, 4578435, 13849659, 8550206, 3710852, -6501507, -6291590, -6092948, -7066295, -6942815, 2910377, 9895605, 8025147, 4639639, -10064182, -4683662, -10722386, -1940252, -6929393, --16331613, -2799782, 7696582, 1956358, -7391639, -7435126, 525597, 4354560, 10742250, 1678259, -5650030, 1880122, 20482700, -17022030, 11838540, 2547989, -17293686, -2780455, -4842039, -3948686, -3286187, -7313793, 5297306, 3898220, 8610336, -9203578, 4147328, 16047072, 8054138, 25201258, --4668093, -106300, -5123359, -2629057, 1724966, -101469, -22224308, 10610180, 344134, -1836635, -7626252, -1723356, -12097849, 3223373, 5947993, 124017, -7612830, -4631586, -15971910, -18114024, -3381213, -7849053, -4358318, 3036005, -628676, -1624571, -8722542, -3793530, -577136, 6762426, -6398428, -9872519, -6339372, 6637872, -9619653, -4224101, -15426986, 14629195, -2435247, 13186623, -562104, 5061082, 13203266, 10598369, -6723235, 3300682, 6396817, -7223062, -3627637, 6954089, --3178813, -16425029, -3732864, -11497091, 16314970, -1732482, -5205501, -9672803, -14886894, 5098126, -2272575, 3336653, 6240588, 129923, -3360275, 7256347, 1068373, -1490354, 1746441, -4216048, -10370199, -2814814, 6191196, 20759724, 3740380, 3688840, 3927211, 7431904, -19289234, -15139223, -4502200, -16578574, 9931038, -2868501, 11370926, 2516314, 23055384, 7847442, -6873022, -1081258, --30188252, -20477330, 7306813, -7945690, -17662516, -25792890, -1094143, 2414845, -5539434, -3859565, -24443196, 6841883, -18525804, 4057134, -11513734, -8983998, -9460739, -15845208, -3200825, 1722282, --22725746, -20771536, -8545374, 3677566, 1482301, 12906914, 10166188, 6858526, -5952288, -55835, -4290673, -11237245, -6983617, -3766150, 3104188, -10588168, -7201050, 7372848, 3729105, -238908, --2348810, -1967632, 5359583, -15378130, -9508521, -7594039, 9443559, -11970074, 7326141, 13590350, -17923436, -1349157, 4570919, -4574140, -9768366, -11893301, -4015795, 11354820, 3471407, -21232170, -31675, 21438330, -15345381, 374199, -4022237, 782221, 4194036, 10652056, -3299072, 3039763, -12242267, 8608188, 4684736, -10804527, -13694503, -18192944, 10397042, -14875082, -24308978, 3743064, --14462229, -9657234, 30476552, 1230508, 23028004, 19205484, -3191161, 20269024, 29952566, 19931870, --25224880, -4260071, -11274826, -13048648, -6662568, -257698, -9893994, 21952114, 7610682, 11694122, --9782325, 11159936, 10064182, 2275796, -12678207, -11331197, 22530862, -4738423, -19287088, -2163590, --22453552, -4161287, 7427072, -9172976, 1461363, -19866908, 9718437, 16487843, 10342281, -3352222, --8361765, -4306242, -1338419, -4061429, -7727183, -24253144, 16892644, 8068633, 9363566, 9073655, --12185896, 19813222, 3765076, -7113540, -3395709, -17370458, -5998996, 9771051, 7942469, 16745004, --489089, -21213380, -34003256, -3108483, 1437740, -939524, -10881837, -19087372, -1087701, 10466835, --3098819, -9194988, 37757056, 24014772, -3508452, -21933324, 4528506, 11133629, 6227166, 16215112, -24019604, -10503879, 1880122, -21417392, 6001680, 1934883, -8473434, 39024608, 14623290, 33702072, -13739600, 8826695, -29321742, 635655, 16192564, 3164317, -15659451, 6778532, -23882702, -9070434, -1525787, 7388955, -7232188, -4388383, 5040144, 4449049, 1600412, 21313776, 12960064, 3738769, --8553964, 14789720, -9558987, -6465537, -13998372, -4291746, 17943300, -28224914, -586263, 13187697, --14410152, -4092030, 5274220, 5240397, 26208428, -1071058, -482647, -11828877, 25598542, -10964515, -3049427, 3281355, 17641578, -3536906, -6680285, 17699560, -28925530, 8259222, 2512556, -11004243, -22721988, -27639188, -3791919, -8348343, -19232864, -8060580, -1185411, 10483478, 20439212, 29417304, --35563404, 9071508, 3129958, 43283608, 11372537, 7326141, 80531, 20660404, 7188165, -33424510, --3585224, 33895344, -8841727, -8159901, 4452808, -3201361, 2369211, -7088307, 37856916, 40482752, --20446192, 9323300, 12868259, 5384279, 13550085, -18735722, -23128398, 18715856, 7296613, -14382772, --21867290, -7681549, -5966247, 21448530, 20160576, 9627706, -17921288, 10763188, -6327561, 6755984, -3784940, 9089761, 23336704, 4465156, -43361988, -14406931, 11429445, -18724984, 8720931, 19392852, -9842454, 33944200, -7851737, -51397336, 2451353, -20558934, 21689584, 15363098, -1481227, -11003169, -20232518, -24713778, 338229, -13412109, 16752520, 15878494, 19300510, 14677514, -4874788, -21186536, --55041616, -30235496, -27925878, 4689568, -14345728, -14122389, 10201084, -31653372, 681826, -19746112, --9459665, 6283537, -10773389, -1934346, 1173600, -49349176, -5735392, 30636002, -36627480, 2498597, -15509127, -817118, 11265162, -4051765, -28756416, -3720516, 17694728, 4310537, 25712896, 15352361, --24504936, -29098940, -2433099, -13256417, -2700998, -47178604, 18456548, 17075716, 33421824, 13480829, -30515206, -13819594, 5221607, 28963648, -8331163, 31635656, 10276783, 16214038, 6987912, -9446244, -17299054, -20976620, 2037425, 40351756, -31124018, 1917703, -40833864, -19859928, -29136522, -21450140, --4383551, 1238561, -9067213, -32799054, -5018670, -53821308, 60448444, 20157356, 897111, -8854612, --14041322, 2641942, -26064010, 4285841, -39390220, 445066, 1782948, 8511015, 24660628, 36294084, -50466, -60965988, -30339112, 26378616, -18382996, -8720931, 10405095, -23213224, 16241956, 27901718, -9415105, -11900281, -17276506, 8527658, -22129282, 34506304, 27571542, 43575128, -31410706, -37252400, --10243497, -329639, -19895900, 25837986, 29898342, -22167936, -904628, -39946952, -12802761, -18638548, --37427420, 12093554, 29252486, 18813568, -24697672, -8662412, 1809255, 20884816, 2031520, -895501, -6587943, -1704028, -11366094, -32142998, -23338316, 9074729, -4231080, -17164300, 18127446, 17890150, -9701257, -32808718, -31891206, 29678760, 16088411, 22306986, -23259396, -54994908, -12049531, 24460912, -21789980, -4697621, 54871428, -5893769, 55093156, -84147536, -107683960, -42086920, -65665220, 2377801, -22921704, 14994268, 66997732, -5565741, -6522982, 15655156, -15727633, -50826644, -50175420, -48998060, -42142220, 43195560, -12718472, 18923090, 5133560, 13867376, -42725796, 37388764, 25441776, 12773233, -31878322, -18257370, 10547366, -54292144, -28895466, 16153909, 18633178, 10907069, 5171678, 8354785, -12354473, -5399311, 61353608, 7080254, 37335612, 12686797, -21347598, 49689552, -8924405, 20280836, --1408749, 18600430, -4321811, 197032, 8051990, 25503516, 4412005, 18946712, -1511829, -2459943, -35339528, 5537287, -11020349, 1843615, -6090264, -18043694, -8714489, 11950210, 3755949, -41899552, --14032195, 6663105, 6304475, 46309948, 32875828, -43293272, -28618440, 5000953, -14153528, 51004884, -293668, 47224776, -37078452, 24591372, -556198, 4214437, 15640660, 48877800, 24404004, 8334921, -34843996, 18701362, -27125402, -39145944, 28148142, -29983166, 12077448, -39396124, -12451110, -62434864, -53624816, -4304631, -67589360, -19659676, -2956011, 5293547, 8846022, -45535780, -22636088, 37456408, --12496207, 12712566, -14547054, 2136209, 52408264, 78066400, 8602283, -4364761, 43208980, 16001974, -19871740, 47990352, 4516158, 28609850, 39757976, 33614024, -9999758, 13953812, 35081828, 42608224, -39570608, 52719648, 34301220, 67662376, 76820320, 51783884, 62227632, 38837780, 92342, 18772766, -14837501, -15492484, -10117869, 10986526, 38708392, 7380365, 6597607, -448824, 21935472, 50174880, -44557600, 84458384, 22652732, -43989056, 23335094, 824634, 23953570, -22558778, 39888436, -61327840, --72577432, 22109954, 86361056, 34537444, 23039816, -98785320, 8093329, 37082212, 67532456, 79264696, --25498684, 3614752, -128708360, -93314608, 47158740, 47392280, -64359548, -23079006, 63171988, 77474232, --86948928, -31797254, 29329794, -20398410, 13196287, -27685360, 25061672, -22983980, 3613141, 2975339, --15262703, 9404368, -1240709, -4993437, -8599598, -17808008, -8192650, 7501698, -96100, -18231600, -17504140, -16500727, -9305584, -13944148, -656056, -13246216, 30295626, 2068564, 6145562, -6105833, -6140193, -6696391, 6859600, 22747220, 24843702, -4789963, 6726456, 12655121, 21569326, -12457553, -13052406, -10895795, 26482768, -5227512, -18702972, 11673721, -9468792, -6493991, 1069447, -403727, -10233833, -4570382, -18527416, -14074071, 518080, 4851166, -30498026, 10291279, -6161131, -1502702, -3398393, -6995965, -6201396, 3652870, -5604933, 4233764, -16051903, 17732310, -51288352, 25837450, --21145734, 31841276, -21040508, 3349001, -13613973, 63559072, 38472168, -20964272, -24189792, -2142652, -78857744, 32941326, 10945724, 21787832, -19294604, -24262270, 6568616, 15218680, 3810173, 1258962, --8618389, -6704981, 7198902, 7401840, 18129594, 7987029, -10188199, -4586488, -5201206, -10229001, --435402, 1501091, 4547297, 5949067, -185220, -2959769, 6934225, -21526912, -8486319, 9072582, -13058311, 16381005, -9928891, -5898064, -10558640, 16711181, 11297911, -3708704, 4845797, -20306068, --17792438, 15302432, 11615202, 3332358, -30770756, -16018617, 437013, 4393215, 18905372, 13490492, --3151432, 5142150, 6006512, -10084583, 7469485, 8589935, -3985730, -6466074, 4155381, -10792179, --622233, -2438468, -8863739, -11413876, 12780212, 2593624, 609885, 20619064, 21335250, 10772852, -9466108, -23015656, -62674312, 21540334, 115799296, 90656024, 87219512, 27559732, -80792096, -48841832, --71628240, -72283760, -65498252, -23223426, 35446364, 45252312, 71772128, 63883880, 38718056, 6123013, -6314139, -31479962, -49181132, -70755288, -27113592, -19522236, 6232535, -4406100, 35580584, 23659902, -10095858, 47263432, 26602490, 19943680, -4411469, 17423608, -32704566, -24958592, -20551418, -24142012, --31489626, -19291920, -12862353, -32202592, -22401476, 7803419, 45945412, 44309568, 50357956, 39441220, -57586384, 9432285, 14088566, -39476656, -29681982, -25345138, -59281288, -58704688, -53226992, -25369298, --31861678, 6315750, 20987894, 31609348, 63496796, 63211180, 59334972, 54092964, 45827836, 9252970, --31094490, -47233904, -85662584, -71830104, -55363740, -70824008, -36502392, -10081362, 2771865, 38146288, --6261526, 0, 0, }, -{ -11669426, --4000225, 3040300, -444529, -324270, -3609383, 2025077, 5330592, -3006477, -1369558, 754841, --2290828, -3757023, 580894, 78383, -3585761, -6129992, 4901632, -2550137, 8421357, -464930, -4721243, -6693707, -304406, 2417530, -1489280, -3539053, -1470489, -2531346, -436476, -2094333, -224412, -438624, -3110093, 1935420, -4150012, 4902705, -1733019, -1356673, -803159, 5811628, -5447093, 210990, 4046933, 2596308, -1280437, -1222455, 5425618, -2703145, -6251325, -83752, --1341640, 6776385, 349503, 847719, -4264366, 11811, -2239826, -2360622, -1159104, -2544768, -1848983, -3678640, -1647657, 938450, -1364189, -3943854, -5515275, -107374, 3163244, 1662152, -2664490, -53687, -676457, 988916, -346819, -3704946, -3823595, -6515466, 2431488, -3365107, --5735392, -4250944, 3114925, -8042327, -3912715, -9757629, 3612068, 3840775, 5691906, 2555506, --2946348, 6759205, -4532801, 1074279, 490700, -1390496, -4810900, -3007014, -5326297, -148713, --2069637, 2800856, 2438468, -3077881, -527207, -994822, -4865124, -596464, -821413, 1928977, -240518, 4319127, -1342714, 5563594, -2247342, -315680, 1285806, -4742181, 3347390, -1734093, --1345399, 86973, -855235, 1868311, -8792335, 3805878, 5801427, 346282, 3428458, 1242319, --3727495, -1000191, -4077535, 5497558, -1284732, -4211753, 3885335, -5981816, 513785, 1603633, --5961952, 210990, -1216550, -2913599, 2358474, -84289, 748398, -3488050, -1758789, -10506564, --1186485, 1881196, -14341970, -8486319, 1502165, -4544076, 801548, -4688494, -8268886, -5362804, -9220758, 5504538, -1516124, 6393596, 1408749, 1646583, 1694902, -2949569, -901406, 5223754, --4190278, 2433099, 3666828, -3882651, -6384469, 3011309, -5229123, 694711, 2896956, 7710003, --1771674, -3529390, -3260954, 1315334, 4067334, -5466420, -104153, 4755603, 1759326, 636192, --360777, -274878, 5935108, -64961, 5433671, 3777424, -1446330, 3772592, -1317481, -139050, --612570, -9820443, 3416110, 5870147, -3328063, -1648731, 1329829, 1772748, 1557463, 1130650, --595390, -948114, 287226, -2241436, 6806450, -2777770, 744103, 4044786, 2921115, -2109366, -2647311, 1225139, 1695975, 4156455, 3237332, -4563403, 5035313, 6123013, -2185602, -5443871, -7019587, 4935991, 10973105, -1646583, 999117, 3633006, -5631239, -914828, 1966021, -2030446, --7576323, -223338, 597537, 5168457, -6157910, -14340359, -11954505, -7019587, 2602213, 7146289, --7167764, 4146254, -3617973, 5578626, 3954054, 3858491, 6208375, 3808026, -5233955, -4401268, -661425, 3673808, -477278, 542240, 8754754, 184684, 1341640, 4727149, 4490389, 1049046, --95563, 11365557, -1012002, -3884798, -1494649, 2809982, 2987150, -1852205, 5706401, 1479616, -2935610, -3945464, -4057670, -1120987, -2788508, 1796370, -2285996, 6863895, -7815767, -6300717, -7764227, -434329, -704375, -8975408, 2532420, -4085588, 4651450, -3389266, -10914586, 116501, -4830765, -3779034, 6332930, -3329674, 2538863, 17536352, 3956739, 4784057, 1852205, -3825205, -8209830, -3797825, -2500208, 10774999, -935229, 8698383, -1036161, -9604084, 3320010, -3147137, -10640245, 5841693, -885300, -9473087, -6880001, 9089225, 10435697, -12155294, 6048388, 5133023, -3582540, -615791, 1063004, 1226213, -1072668, 12419972, -693100, -1885491, -3507915, -3883187, --5370320, -1502165, -421444, -6810745, -2652679, 2076617, -5053566, 521302, 130997, 7570954, --2897492, 500364, 3241627, 573378, 6825240, 3454764, 7096897, 3909494, 2036351, -7350300, -623307, -5338108, -5518496, 1655710, 7205882, 121333, 6146098, -2223719, -5048197, -632971, -48318, 2407329, 4085051, -1425392, -363998, -1718524, 2061584, 2446521, -6739878, 2144263, -637266, 4982699, 3354370, 4014721, 11094974, 5914707, -4953708, -4286378, -12146704, -734976, --382252, -6385543, 2319819, 9694815, 1040456, -7587597, 6929930, 6735046, -848793, 2695629, -6651294, 1615982, -6352257, -959925, 14249091, 7083475, 1305670, -9536975, -3602941, 8652748, -2778844, -1333587, 4669167, 4325032, 4345433, -90731, 8709657, -143881, -1406065, 2183991, --4720706, -5909875, -582505, 894427, 3023657, 1726040, -5769752, 5418101, 9365176, 4858682, --631897, 7073275, -8598525, 4532801, -5308043, 4982162, -1818382, -6083821, -782758, -7886634, --13120051, -4804995, -5575942, -836982, -679679, -6834904, 583579, -2282775, 3042448, 2254321, -3630321, -1004486, 756988, -6631430, -225486, 759136, 7020661, -3468723, -12169253, -7417409, -16307454, -3267933, -4033511, 1365800, -956167, 18275086, -5597953, -9257265, -132607, -9123584, -2005750, 7992934, 7795903, 2985539, -16966732, 14055280, -11107322, 6120866, -7708930, -5163088, --4475893, 7238094, 6961068, -10554345, 503585, 5234492, -3775813, 2643552, 2856690, -3519726, -138513, -8588324, -6451041, -13496398, 7896298, -1475858, 13701483, -6070400, 2676838, 9898826, --2730526, -2280628, -4546760, 11298448, 7476465, -12687870, 3379603, -6925098, -2911988, -2330020, --7836168, 5060009, 1952600, 12271258, 7777112, -13984950, -2830384, -5604933, 8107825, 3694209, -281857, -7774428, 812823, -78383, 6706055, -310848, 408559, -8837432, -722628, 8087424, --6920803, 2406256, -2462627, -140660, -5356361, 569083, 1816234, 4044786, -4481262, 273804, --9458592, -1222992, -10921565, 1658931, -2753074, 6206228, -469225, 5249524, -7507603, -14139032, -2942590, 9386651, 1185948, -1228361, 7323993, 4873714, -11570642, -287763, -4410932, 14453102, --728534, 1576253, 1055488, 20938, -552440, -5362804, 11437498, -1126892, -16474958, -3227131, -9794136, -6553047, 1523103, -434865, 1185411, -2232846, 1430224, -3204046, 3751117, -6480032, -5740224, 8077223, -6682432, -1883343, -4042101, -11630235, 4354023, -8336532, 6818798, -7369090, --12533788, -3629247, 7050189, -2563559, -4670240, 4594005, 6454262, 3564823, 7072201, 12362526, -9833328, -969052, 1564979, 1421097, -7289633, 1008244, -7705172, -7978439, 3452080, -5981279, --16639777, -12903692, 7306276, 14982993, -530428, -265214, 2224793, -6330782, -3874597, -16044387, --9375377, -4107599, -665183, -11490648, 16812112, 4066797, 9135932, -10405632, -13669270, -9265855, --4354560, 3286724, -15442555, -6033892, 6432251, -2296197, -18671296, -5487895, 1962800, 882079, -10793253, 4493073, -4027069, -7910793, 10247255, -5504001, -1106491, 8821863, 1913945, -8056285, --4998268, 78383, -15194521, 4483946, 10969883, -4189741, -6792491, 2479270, -7924215, -1923072, -1005022, -3900367, -4105989, 4748623, -6031745, -10848014, 5324686, -5776194, -9240622, -11082089, --6502044, 2182380, -5296232, 3023120, 14303315, 9431748, -2301029, 15241228, 13828184, -4990215, -1500554, 5310727, -7882876, -3292629, -16057809, 3561065, -4700305, -10024991, 25879862, -804770, -15793668, -7821136, -23037668, 6757058, 1785096, -664646, -10887742, -806917, -7225209, 18342732, -13091060, 12093554, 8503498, -13933948, -233539, 2208150, 12454868, -21277804, -2580739, -5006858, --6424734, 3504693, -7219840, 3038689, 4680978, 3842922, 3724811, 5272073, -1600412, -1837172, --10570451, -2209761, -1687922, 10575283, -81068, -9127342, -2287607, 11485816, -1368484, 6805376, -8312373, -5774047, -3639448, -13581760, -8106214, 27448600, 7120519, 12375411, 6469295, 1861868, -1003412, -16926466, 10189273, 1890323, 2989297, 9054328, 9582072, 15176267, -17173426, -6853157, --9530532, -986769, 2377265, -2081449, -4832912, -2673617, -14449344, -18017388, -11847667, -16967806, --2371359, -11218991, -19244674, -8083129, 35009888, 7945690, -5098663, -7270306, 1070521, -11256036, --22043382, 16153909, -12348, 10377715, -7969849, 7488813, 17873506, -1832340, 1876901, -4592394, -15508590, 13110925, 4948876, -21294984, 1350767, 3033321, 12906914, 18985366, -5857799, -4008278, --2769717, 5006858, 6544457, 5550172, -9942312, 4290136, -11440719, 8385387, 11017128, -5557688, --11622182, 6973417, -12643310, -11331197, -903017, 3122441, 15483357, 1797981, -2689187, 13466333, --3063922, 12090333, 21969294, 11199664, -376347, -14415521, -2048163, -8325257, -7429757, 14359149, -4823785, -14547054, -1050656, -11087995, -3780645, 19170050, 7723425, 2913599, 6998113, 11717745, -4639102, -15084999, 6430640, 13320841, 2656437, -9853729, 2248416, 2196339, -445066, -6799470, -8609262, 5616744, 5090610, -8522826, -408559, -10876468, -25558814, 8850854, -10159208, 2851322, -944356, 17969070, -12315819, -10885595, -4547834, -4944044, -6561100, 13320841, -11696807, -16489990, -4999879, -30874372, 950262, -5714991, -13063680, 16800838, -1033477, -826781, 7039989, -6424198, -5290863, -1472100, -18488760, -19967302, -201327, 4520990, 11826192, 6004365, -1375463, -1811403, --11679627, -5158256, 11617350, -17878338, 25119116, 15404974, 3253438, 19120658, -12589623, -4800163, --11574400, -11061688, -5262409, 9164923, 23531588, 937914, -12627741, -1262184, 765578, -424665, --1745904, -6542846, 5855651, 7053947, 15375446, 1030792, 17340930, 10892574, 4021700, 1370095, -2708514, -24882356, 12884365, -630286, -17564268, 15156940, -1969243, 20657718, -8826158, -8169028, --46883328, -4715337, 29434484, -6235756, 1903207, 23811298, -4679904, -691490, 4131759, 5650567, --6336151, 5649493, -1418950, -9221295, 9168681, 8498130, -26797374, 2390686, -23689966, -1581622, --11656541, -14970645, -1807108, -5116380, -12360379, 5973763, 3602941, 7772817, 13160317, -17849348, -22788022, 625455, -18552648, 798864, -12319040, -7815230, -13320841, -14359149, -4258460, 13338021, --10581189, 5920076, 16021839, -9432285, -13567802, -14948097, -18896782, -23153632, -11250130, -7198902, -3664144, -4229469, 8150238, 3359738, -11146514, -1852742, 17058536, 7641284, -19711752, 7700877, -722628, -7094749, -17847736, 12739947, -4628364, 17909476, 26877368, -525597, 25927106, -13830868, -16615081, -11312407, 17983028, 16446504, 6026913, -21614422, 17217988, -42319924, -3806415, -3040300, --4890357, 5104032, -26240102, 2789045, -6237903, -1119913, 10036265, 5465346, 11868068, -9281424, -7963943, -3960497, -23606750, -8032663, -17743046, -9246528, 9221832, -18514530, 996969, -6356552, --16229608, -1829656, 12730283, -18483928, -20146080, 8309151, 9450002, 81604, -10464688, 11053098, -9221295, 14074071, 9786620, 5415954, 14015015, 19360638, -11944841, 3378529, -10797011, 24084030, --3860639, -15782931, 17643188, 9097814, 2675765, -8875013, -14486925, 3323768, 5332202, 7921531, --2860448, -9875740, 5539971, -11586211, -1966021, -11450920, 34011848, 5924371, -12873628, 30167850, --6121402, 9417790, -10239739, 15272904, 19810000, -13604309, 18875844, 22846542, 27331024, 22785338, -720481, 15809238, 44181792, 12306692, -8236137, -5912023, 9802189, 3623879, 3834332, -421981, --18497888, 15696495, -41459856, 5147519, 8385387, -1133871, -8055748, -14996415, -7778723, 2543158, -11541114, 19198504, -11540577, -23133768, -19797114, -2087354, 149250, -13390634, 28288266, -12833362, --9354976, 12512850, -4588636, 2730526, -3111167, 25317222, 3616363, -24266566, 9326521, 3668439, -16680579, -5634997, 1380832, -9796284, 8065412, 4212826, 21198348, -4882304, 9334575, 10620380, --13506062, -14126684, 624918, 13390097, -25869124, -29960082, -9236864, -12271258, -1974074, -4348118, -2672544, 6760816, -6416681, 843424, -35089884, -29890824, 23248122, 24486146, -30391726, -23856932, --29240674, -16112570, -12221329, 13829258, -16019691, -29508036, 746787, -519154, -15814070, -3633542, --25342992, -2645700, -6460705, 7885560, -12254079, -2843268, -39230768, 34690452, 21581674, -3377455, -46580532, -4283693, -26341572, -2048699, 10026064, -15637439, -21626234, -4109747, -14966887, -366146, -3385508, -21330418, 31107374, 1360968, 2740726, -19662360, -6460705, 2449742, -6445136, 5390721, -6458020, 26401164, 3864934, -1032403, 20242718, 17710834, -7059853, 10578504, -14260902, 4081830, -10814728, 11807402, 28475096, -28829432, 16840566, 54489712, -759672, 9274445, 17298518, 2532420, -2389076, 9190693, 5365488, -17603460, -23022098, -7309498, 15770583, 5750961, -24082956, -11489574, --2794950, -10036802, 17952426, 2647847, 13234942, -33234994, -23538568, 11045045, 20793010, 15622407, -6443525, 34003256, 15497316, -11799349, 18188650, -14481556, -8872866, 3543348, 14829985, -43890808, --202937, 936303, -2580739, -4457639, 19958714, 2957085, -13201656, -21297132, 21843130, -18989662, --493921, 16061030, 10832444, -14588930, -5242545, -24314884, -1045288, 8810589, 8078834, 11890617, -1873143, -15249281, -21722334, 18718004, 8069707, 10129143, 2602213, 10315975, 1883880, 14302778, --23215908, -36437428, 9927817, -4022774, -8722005, 23052700, -4284767, -9506373, 18298708, 19625316, -14277545, 587337, -9986336, -14392435, -4571993, -19614578, 50732152, -2190970, 18176838, 6185827, --17037062, 16244103, -6482717, -13788993, 16037408, 15214385, -27819040, 22269942, -2607582, 30005716, --26889716, -17655536, 28460064, 2160906, -21373904, 26477936, -7023882, 43059196, -14782204, -8987219, --21177946, 20173462, 6112276, -12845173, 12127377, -13635984, 7320235, -6656126, -11775190, 32322850, --6487548, 21531744, -34273840, -7341173, 334471, -43383464, -8130910, 5011153, 21939230, -11509975, --8733816, -183073, -2072322, 28572270, -1625645, -16019154, 32679870, -5002563, -400506, 4841502, --11335492, 26101590, 3047816, -6645925, 14293651, 10066866, -13564044, -6185827, -5593658, 20078436, --41020696, -1827509, -6882685, -16048145, 8593156, -16304233, 26008712, -7583302, -29123100, -4294431, -47747688, -29251948, 21729850, -32494648, -7580081, 30042760, 24271934, -18017388, 9405978, -21736830, --25473452, 4513474, -10332618, 10499584, 4957466, -3192771, 6172942, -40882720, -13854491, -21572546, --27273042, 11914776, -9342091, -9667971, -14401025, -29867202, -22034256, 16470663, -2219961, 55252608, -11318849, 1999307, 20637854, 23250268, 9959492, 21972516, -12772159, -17424682, 19602768, -30713312, --2995203, -6628745, 2370822, 20986284, -13364328, 23352810, 10785200, 5071820, 7736847, -38956428, -26955214, 4639639, -26482232, 10404021, -28106266, 4703526, 39475044, -4996121, -22115860, -24555402, -11237782, 17438104, 15057618, 7449084, -24638616, -17579838, -6982543, -4808216, 34029564, -20971252, --11556683, 49225692, -26314728, -2087354, 20607254, 146029, 21699786, -2917894, -15385647, -10998338, --28876676, 15535970, 22753662, -31967442, 49468360, 16220481, -34764540, -32814088, -29943438, -37497212, --28858422, 1903207, 16935592, 3335042, -23455354, -9226127, 19214074, 537, -13471165, 18063022, --31442918, 2750390, -4580046, -31038118, -25562034, 5888400, -6646999, 23365158, -33836288, -3894999, --1382443, 23434952, -58744952, -54430656, -47081432, -30520038, 12375411, -12936441, 60677688, 15936476, --6408091, -13984414, -7590818, 17067664, -39355860, 46060840, 61158188, 24163486, -3594888, 48155172, --15217069, 29057602, 55621436, -10290205, 3193845, 10222559, 74011952, -18925236, -4496831, 43685724, -16838420, 13880261, -11901354, -45275396, 3334505, -35961224, 17278654, -44520556, -51496656, -956704, --2655901, -36516884, -1574106, -17985176, -36677412, -30056718, -47932372, -2786897, 49809272, -16275242, --8945343, -46080704, -23820962, -17394080, -14991046, 14701673, -10460930, 81398224, -18678276, -1978369, --29141354, 61088392, 51912196, -37045704, 42515344, -15607911, -59020368, -11986717, -4414690, 11353209, --12442520, -15092515, -5794985, -25872882, 9076877, 28978144, -33502892, -18060338, 24429774, 105075304, -11806328, -64860984, -16569984, -22447646, 4788352, 33402498, 58463096, 17608830, -49318572, -22549, -34026880, 8391829, 777926, -468151, 8992588, -3571265, -5810017, 41694468, 25614648, 23898272, --34112776, -20975546, 23805930, 10501195, 14282377, -10421201, 4836133, 46720116, 1658394, 39947492, -20774756, 22656490, 38132868, 7302518, -19023484, 6580427, -21824876, 7795903, 16815870, 6231461, -62207768, -18081812, -38257420, -35539244, 48468168, 24373402, 26492432, 19935090, -25615722, -31052614, --19152332, 1916092, 11931419, -4145717, 18426484, 34793532, -281320, 26439818, 22611392, -27674084, --4159676, 13377749, -12610561, -8691940, -13219909, -47124920, -6345814, 28299002, 4569845, 51928840, -32962800, -15269682, 18016850, -3700651, -27634356, 4979478, 80083424, 23267986, 32287416, -15173046, --77538656, -36133024, -57773216, -16707423, 34664680, 87195352, 35489316, 11341398, -43179992, -36404144, -24209120, 44207560, 18313740, 53265112, -4974646, -32021128, -52182244, -22367116, -10526428, 39887900, -1716913, 23689966, 16675211, 4850092, 48036524, 37338300, -7135015, -3481608, -50422380, -10122164, --4355634, 2280628, 23574002, 49501108, 25998510, 24350318, 41668700, 27278948, -50770272, -36767068, --15676094, -28679108, 27423904, 22207128, 42345692, 36976448, 36812164, 12801687, 2777233, -33282238, --40048424, -32840394, 6739341, 17027398, -5349382, -4617090, 67702640, 18141942, -11111080, -7761006, -43567076, -54899884, 3856344, -104087992, -31280784, 21996676, -45863272, 27477054, 5349382, -9892920, -37969120, 3468723, -115902376, -74394736, -35985384, 33944200, 14284524, 161773168, 178037664, 105389368, -197549712, 157703152, 172297440, 116491328, 147426896, 116111760, 9766756, -51516524, -69096896, -70964136, --146513680, -182563488, -185266640, -131311648, -96490200, -36483064, 18901078, -48716204, 45999636, -62283468, --11984569, 3306051, -7434589, 25414396, -48779556, 97562864, 31021476, 90759104, 68488624, 41690172, -39130912, 57097296, 48281336, 59355376, 125164472, 114416856, 101272104, 113453712, 146351552, 129560376, -130612104, 212603568, 94868848, 156988032, 206231984, 144597584, 192188512, 110306032, 148384672, 116758152, -144128896, 146131968, 82794088, 107959912, 100515120, 106456672, 115922776, 58412092, 39406860, -29678760, -31663036, -48875116, -19325742, -89413168, -88047904, -101545912, -260147248, -222526016, -175442432, -80647136, --13482976, 0, 0, }, -}, -{ -{ -1787243, --403190, 1455457, -329102, 6126771, -915902, -234076, 7471096, -1792612, 8322036, 1512365, --3323231, 5019206, 2379949, -3670050, 1390496, 1989107, 594316, 3205656, -833761, 2577517, --537, -3583613, 1549410, 3954591, 2282775, 2304250, -457414, 335007, 22549, 1433982, -2919504, -6963753, -3382287, 161061, 1675574, 652835, -2704756, 5324149, 1768990, -1191317, -2855617, 1030792, 3949759, 1143535, -1539209, -3018825, 3193845, 214212, -56371, -1628330, -900333, -2840584, -1970316, 1321239, 2859375, -1372242, 634581, -27917, -399969, 5279052, -1985349, -627602, 843424, 2306934, 224412, 2361695, -3019362, 2885681, 3200288, -1607392, --5352603, -2806761, -1466731, 5539434, 60666, -1999844, -515933, -4878546, -3432753, 2224256, -137976, -3061775, 3794067, 2615635, -897648, 264141, -587874, 3129421, -4371740, 1641751, -3154117, 2869575, -6267968, -4319664, -3153580, 4181151, 928250, 1376537, -1807644, 4453881, -1581622, -1087701, 28991, -1252520, 778463, 1671816, -1081795, -1269163, -3828427, 3974992, -6508486, 785979, 4092567, -776852, 734976, 1508607, 1711545, -5016522, 234613, -5242008, --1326071, -747324, 1520955, -2648384, -219580, 1140851, 388695, -3061238, -23085, 340376, -2350958, -3252364, -4229469, -551366, 5368709, 8871792, -148176, 1461363, 445066, -1882269, --5506685, -1321239, 3539053, -1638530, 3525095, 1545651, 3604551, -6442, 1345399, 2401961, --5445482, -1385127, -5160403, 2927557, 456340, -2558190, 11362336, -4524211, -7949448, 484258, -3842385, -813359, -5958194, -1862405, -2530810, -1130113, -2772938, -1085553, 4274566, -434329, --2622615, 4642860, 801548, 4503273, -1141388, -1292248, 1882806, -32212, 2175401, -1028108, -4478577, 7011534, -1888175, -4984847, -3447248, 2791192, 75162, -11213086, -967978, -4575214, --1559610, 5226975, -3697967, -3051574, 3802120, -2627446, -462783, 4762045, 1777580, -4112431, -1815697, -3026341, -6462852, 1866700, 2615635, -5181878, -2814814, -1673427, -2035278, -301721, -2164127, 3108483, 5156108, 5430450, -1341104, 259846, -2244121, 2102923, 1577864, -1698660, -2388002, 3158412, -3542274, -9136469, -4521527, 2698850, 4087735, 1476932, 4425427, -3812320, -4625680, 5496485, -1502165, 6090264, -778463, 4458176, -2102923, 38118, -1881733, 5722507, -2332704, -344134, 5261872, -2883534, -2149094, 3695819, -8993662, -1692754, 542777, -2046552, --8014946, -5049271, 3387119, -3287261, -2062121, -17180, 6343130, -1651952, -4380867, -489089, -1653026, 3420942, -515396, -5867999, -3663607, -1205812, -2910914, 792421, -4962835, 2308545, --4672925, -7052873, 226560, 2240899, 2800856, -2381023, -1586454, -4701379, 5834713, 3192235, -798864, -132607, -186831, -2180770, -1095754, 1778117, 2455648, 8621073, -1043677, 2024540, -518080, -450972, -4393215, -3446711, 5888400, -2688650, 476741, 1475858, 718870, 2173790, -2726767, 2399813, 5802501, -3828427, -5665599, -4607426, 2942590, 6386617, -1131724, 4902705, --4283156, -5260798, 4440996, -2166811, 529355, 1672890, 5563594, 2084670, 8792872, -3730179, --4536023, 2101313, -2459406, -2344515, 5049808, -7603703, -4616553, 871342, -1350767, 3615289, --2466385, 1086627, 6340983, -5626944, 4466229, -3331821, 2960843, -3100430, -741956, -357019, -6604586, 1387811, 432718, -4497368, 446140, -5375152, 2320893, 1602023, -3493956, 148713, --1295470, 9926206, 1563905, 890132, -8119636, -4633196, -6791954, 5835250, -3306051, -73014, -3229279, 12683575, 9040369, -3117073, -7247758, -2775086, -6234145, 7378754, -969052, -1497333, --2677375, -1576253, -212064, -2718178, -1327145, -5069672, 3703873, -5236639, -8736500, 8926016, -4349728, -9783399, 9798431, -1738388, -337692, -13660680, 8239358, 5148592, -10663330, 3047816, --1570347, 3936875, 1181653, 4568772, 3277597, 1031866, -4835597, 295279, 2094333, -6868727, --2623688, -8070244, -1124745, -5076652, -2399813, 738198, -5958731, -2434173, -8890045, 3299072, -1132261, 643708, 1025960, -4058744, -7716983, -2608656, 3011309, -1408749, -472446, 8198556, --12120398, 5076115, 6503654, -1009854, 594316, -2485176, -784905, -4071629, -5910412, -4216048, --4629438, -3258270, 3218541, 1661079, 2868501, 4148402, -865973, -2207613, 6042482, 11378979, -8080981, -97711, -9602473, 2772402, -1464047, 1603633, 10205379, 216359, 10240813, 9655086, -14874545, 3377992, -2234994, -1039382, 4821638, -1859721, 14432164, -1824824, -1802276, 17509508, -476741, 8693014, -2982318, -76236, -401043, 1145146, -1898376, 916439, 110595, -831076, --9281424, -1246614, -1900523, -2052994, -3619047, 5874442, 3320547, 3365644, -4995584, -923955, --8135742, -3758097, 2068027, -1023276, -4747013, -1934346, 3351148, 6143951, 4416300, -2385318, --7461969, -615791, 2805151, -1680406, 4781373, 2463164, 6307160, 7547868, -1966021, -409633, --7887708, -10721849, 10436771, 4872641, 345745, -820876, 416075, -4176319, -3354370, -495532, -8666707, 4089346, 2327872, 9093520, -6334003, 1665911, -4925254, -5144297, 5299453, 3665218, -4811437, 13772350, 1005022, -7179575, 2901251, -7153805, -7817914, -10869488, 4322885, -10166188, -170188, 10995653, -11491185, 4121021, 5410585, -3273839, -14215268, 47782, 8603893, -9453223, -5980205, -789737, -3934727, -12212203, -141197, -8846559, 1747515, -4555887, -6580427, -8606041, -3700651, -1330366, -273804, 7931731, -4647155, 6672769, -4926328, -2189897, 10659572, 3447248, --5304285, 4154307, 2776160, -4940823, 2812130, 2498597, -1567126, -2179696, 709207, -2445447, --2441689, 1582696, 2224793, 14049375, -13013214, 2030446, 1200443, -4914517, 9962177, 5325223, --2907156, -10489921, 1329829, -1199370, -2689723, -6693170, -7186554, 9156333, 6550362, 575526, --395137, 4745402, 3110630, -2529199, 4626217, 2525441, -1861868, 9493488, -2852932, 5441724, --3067144, 1912334, 4899484, -10974715, 8099235, -4693326, -1809792, -6373732, -4277251, 3604015, --3374771, 2915746, 12284143, 3969624, 6833293, -15611669, -10029822, -5676873, -3506304, 1493038, -115964, 2484102, -12767327, 6754373, 3079492, 1550483, 12551505, 25233, -6814503, 11418171, -4759898, -5366025, 2566243, -6845104, 6296422, 2681670, 8327942, -7163469, -4744328, 1859721, --6838662, 8681740, -7938174, -349503, 8108362, 7060926, -14821395, -642098, 956704, 1526324, -2713883, 16199006, 4027069, 790274, -4786741, -4398584, -8630737, -5064304, 12406550, 28991, --14223321, -57445, 3648038, -8525510, -8749922, 769873, -5538897, 2087354, 13684840, 6189585, -6025302, -5821292, -13728863, 775242, -1824287, 6169184, -453656, -12164958, -18944028, -5772436, -5461588, 14598057, 2165201, 7508677, 26170846, 4211753, 4500052, -4179540, -12487617, 6943352, --6051609, 6373195, -1566589, 17098264, 12587475, -6856379, -14160507, -11451993, 8505109, -7710540, -10420128, 4365298, 3354906, -3862249, -1445257, 12169253, -2532957, 10692858, 10889890, 5379447, -7596724, -8854075, 8221641, 4165582, -4608500, 11799886, -5506685, 10668162, 663572, 855772, --16382616, 9348533, 692027, -3484829, 7783555, -11756399, -4719632, 6272800, 5269388, -10928007, -1392106, -7213398, -4134980, 9706626, 1046898, 2468533, -1459752, -12560095, 7558606, 6810208, -64961, 5152350, 2175938, -6178311, -6100464, -1491964, 5655935, -11967926, -1201517, -804233, --577673, -2091649, 3191161, 2991445, 9470403, 22771916, 7723962, 2351495, -7898445, -22002580, -16220481, 4039417, -13206488, 3469260, -628676, 2895345, 3900367, -10883447, -20832738, -17732846, -6705518, 12668543, -1672890, 13347685, -5499169, 10282689, 14359686, 17443472, -2949569, 12737262, --10799695, 3913789, -5385352, 1010391, 8313983, -898185, -2719251, 2675765, 10208600, -7018514, --10838350, -12732967, 26712550, -507343, -22012, -12050604, 13102871, 3302293, -22212498, -14165876, -6625524, -3849901, -2781528, 8647917, 4532801, 22224308, 14035953, -1357210, -11723650, -13544179, --5818607, -5911486, -13407277, 13283797, -8609799, 10361609, 11152419, -10159208, -10474351, -12548821, --15437723, 3434900, 1639604, -7084549, -5803575, -13692356, -2420751, -13718126, 4874788, -100932, --1865090, -913217, -12212740, -24854976, -4981625, -6791954, 1783485, -6128919, 1483374, 2108829, --2208150, 10011032, -13108240, -4571993, -12429635, -1104344, -5998459, 14376329, 16986596, 12792560, --18165564, 12657269, -6340446, 9496173, -3494493, 6884833, -5827734, -8405251, 3162170, -10714333, -6874095, 7448547, -709743, 4284767, -9120900, -1655173, 16108275, -13091060, 817654, -4206921, --4984847, -10627360, -401579, 15242302, 20805896, -13464186, 6358699, -2044941, -12459700, -13208098, --13728326, -6664716, 26167626, 15464567, -4926865, 8106214, -5638219, 7027104, -14455249, 8215736, --635118, -7953743, 19634980, 10221485, 3697967, 6575058, 5222680, 18852222, 1856500, -15426449, -5646809, 12744779, 8421894, -26523034, 15471546, -9896678, -12395812, -1713155, -1262720, -94489, -16982838, 11157788, 46131708, 12957916, -7815767, 2994129, 7707319, 205085, 15306190, 11443940, -10569378, -13756243, -23037668, 22907208, -13100724, 2125472, 7823283, 25101400, 9976135, -15342160, -13625247, -13908715, -3000035, -19102404, -25052008, -2955474, 6554657, 6515466, 4837207, 6124087, --2150168, -17344688, -6502581, 5201206, 5582384, -9375377, 18773838, 11666742, -11566347, 5882495, -9244917, 3246459, 377957, -10996190, -1501628, -7918309, -4539781, 454730, 11605002, 28679108, --8164196, 1907502, 4145180, 10103911, -10685342, 36284420, -3381213, 2552821, 2964601, -18075370, --16694001, -28064390, -11457899, 13144211, -5188858, 5661304, 5916855, 23667418, 4159139, 2329483, -1529545, 17512730, 10122701, -11657615, 19354196, -20689932, 5367636, -5153961, -18893024, 10567230, -5502927, 13066364, -3176665, -29586420, 2770791, -19878720, -17022030, 5051419, 4677220, 8086887, --4576825, 5825587, -471373, -10087268, 16618302, -2585034, -4664335, -6379100, -10563472, -9560597, -6542846, -12030740, 3721052, -7618735, -4547297, -3165391, 16549583, -2855617, 17745194, 10819023, --3506304, 5916318, 6800007, 12345883, -7267622, -10897943, 2756295, 7520488, 10307385, 16338056, --16306380, -16370268, 8469139, 6273874, 20779052, -8917963, -77846, 10462003, 1433982, 3559991, --2166811, 13692893, 17551384, 8366060, -468151, 11163157, 35304632, -6257768, -8097624, 13782550, -425202, 21051246, 6620155, 10682657, 13063143, -1958505, 9824201, 24532316, -4075387, -25371982, -21351356, 7822209, -7245610, 5579700, -36595804, -15721728, -2936147, 29851096, 11586211, -33578056, -3466576, -4269198, 1004486, 8050916, -3816079, -16173773, 514322, -572304, 13961865, 33342904, --7145752, 12343199, 18453326, 1476932, -7720741, -2817499, 6131603, 33461554, -2578054, 369904, -23550916, -7802345, 4954782, 2680060, -2323041, -3982509, 7699266, -25718264, -986769, 11779485, -18917720, 24930674, -20036022, 3670050, 18126910, 1761474, 35334696, -10449119, -20033874, 5616207, -25182466, 7967701, -22538378, -6430640, 4336843, 3310883, 9939091, -26701274, 1868848, 4964446, --8152385, -18169322, -21286394, 9036074, -7804493, 2687576, -863288, -18587544, -25950730, 9515500, -1630477, -19494856, -10438381, -10722386, 11639361, -32825362, -17177184, 18511846, -26332982, 19603304, --7827041, 18683108, 1524713, 9673877, -19549618, -3063922, -18415210, 19428284, 10812043, 25880400, -20840792, -11176579, 5266704, 20141250, 12686260, 9535901, 8648990, -19818590, -3639985, 7565048, -3076270, 9201431, -21774410, -18830210, 12233141, 33601140, 6439767, -13052406, 23828478, 4850629, -15537044, 2198487, 4416837, -21253646, -18429168, -1116692, 2073932, -36125508, 4558571, -8606578, --8590, 9465034, -11726871, 6777459, 29028610, 1335198, -42528768, -33440616, -3339874, -11379516, --9144522, -1915555, 9995463, 5416491, -8924942, 10645613, 13650480, 8872866, -4823785, 7348152, --2912525, -13357885, -568009, 8255464, -30865246, -9573482, -12593381, -19426138, -4365298, 2291365, --6068789, -3585224, 39533564, 17566416, -10323491, -4032974, 7609609, 14169097, -19756312, -5187247, --8300025, 5152887, 41674604, 6434935, -20307142, 5285494, 18495740, -4051765, 17297980, 21728240, --11114302, 5068062, 11184632, 7440494, 658204, -3285650, -6578816, 3198677, 13130252, 6631430, -12279848, -18158584, -27746026, -2988760, 12661027, 10990284, 9149354, -3163244, -25570088, 8336532, -5923297, 38658464, 40799504, 9716827, -29990146, 21939230, -11289322, -30754114, -7002408, -36394480, --27618250, -12126303, -13197361, -28142774, 5146982, -11203422, -32231046, -29438242, 8780524, 19548544, --2981244, -24746528, 7639673, 1065689, 8202851, 16162499, 15549929, -18953690, 25192668, 17673254, -2347200, 7445326, 17566954, -322659, 45689324, -31828928, -15365246, -406411, -36864240, 31082678, -2434710, 38690140, 11580306, 9188546, 13048648, -19320910, 4434554, -39485244, -11818139, -1552094, --10800232, 45347340, 13143137, -10799158, -28712930, -13127031, -12299713, -16633871, -13776108, 7836705, --41506028, -7689602, 29075318, -2440078, -4148402, -29975650, 28876138, 15849503, -113280, -10618770, -11864310, 7475928, -7858180, 14775761, -21788906, -4307316, -11507291, 7330973, -5682779, -11899744, -14258218, -9912248, 5488968, 1859721, -21206938, -11242077, -3985730, -24030342, -25902948, -32015224, --9501005, 17051020, -12130061, -4445291, 18508624, -21857626, -20345260, 22825604, -1116155, 754304, -17874044, 2355790, -17207786, -7067369, 5229123, 16012175, -22106196, -4005594, 24013700, 13753022, -22940494, 15775952, -6833830, 16382079, -3189013, -29122562, 7584912, -20063402, 14051522, -6504728, --11960947, 30722438, 10170483, 1564979, 3307125, -7452305, 11629161, 19130322, 46912316, 41771780, -3217468, -17692580, 8070244, 24440512, 6517076, 19047644, 13060459, 9494025, -14310831, -17470316, --21908092, -973884, 7770133, 15774341, 30466350, 16805134, 19467476, 12013560, 18051748, 9783399, -17401060, -11172821, 3146601, 33789580, -1040456, 26137560, 6646999, 21259552, -32877974, -4723927, --9732933, -9044664, 7605314, 13387950, 23734526, 39035348, 32201518, -10770704, 5782637, -42013908, -10474888, 10464688, 37745248, -29228326, 23990614, -7107097, -20652350, 16699907, 5325223, 14045080, -24013162, -7010461, -29552060, 16250546, -18621904, -25936770, -11647414, 36202816, -29550986, -43157444, --20259898, -6525129, 25955024, -1339493, -10517301, -26351772, -5390184, 5437429, 4869419, 30153892, --9905268, -32413044, 1739999, -13325673, -47525960, -23382876, 60927868, 8932995, -28452010, -30229054, -2752000, 805843, 11996381, 16208133, -22275848, -14100378, -35123704, 8156143, -13273060, -8121247, -51634096, 11356430, -8142185, -54122492, -4417374, -28918014, 27712740, 35376572, 2720325, 27470610, --33490008, -12898324, -21580064, -5022965, 52480744, 66513476, 9500468, -18108656, -25044492, -48547088, --595927, 5810017, 56959320, 32015224, -9877351, -96372624, -51037096, 7567733, -10678362, 83348672, -26650808, -41285912, -18422188, -73134168, -24515674, 1331977, 45365056, 47250544, 52736828, 971200, -10951093, -7662759, 2604898, 64902324, -27047556, 46584824, -14374182, -54117124, -17808008, -58176944, --20193326, 64117420, 28470264, -42981884, 47602732, -260382, -12093017, -73904040, -19588272, -20260434, --33005214, 70752072, 896574, 31428960, -48561048, 26523570, 22744536, -22416508, 14264660, -4759898, -12712566, -587337, 36355824, 12255152, -35439384, 20704964, 17459042, -780073, 24393266, -18869402, --9579925, 30144764, 21339546, 19812684, 9921374, 17118130, -53658100, 45695768, -27187680, -17822504, -9655623, -38178500, 53974856, -16375637, 4833986, 38510824, 674847, -6899865, 20651814, 20976620, -37769404, -10366977, -36783712, -37490768, 3033858, -14162655, 15795816, -23077934, -11995844, -15949898, -9558987, -69647192, -402116, 49973020, 12417824, 19755238, -3798362, -6604586, 11328513, -19113678, --23113366, 11802033, 4393752, -23347980, -27968828, 93541168, -13938243, -32125282, 3987877, 40903656, --8375186, 11800960, -34781720, 11065446, 59732796, 89115736, -38505456, 27616640, -58432492, -19888382, --34959424, -7199439, 57677652, 57198764, 48857400, -3789772, -36165236, -25177636, 22058952, -874026, -11772505, 28595356, 849867, 12931073, -38177428, -12685186, -21553756, -30523796, 16565152, 10009958, -2086817, 25068114, -22487912, -3717831, 7398081, -36303212, 147640, -682900, -20073066, -11065446, -8867497, -17280264, 32315334, -13559749, 48426832, 32602560, -22676354, -10072772, -31890132, -40871444, --47745540, 11756936, 22893786, 60839284, 49846852, 19058380, 31786516, 1854352, -35286916, -27885076, --19704236, -28787018, -4995047, 8832600, -1252520, -21679384, 4282620, -22133040, 10394895, 18422188, -4393752, -31281320, 19245212, -18775986, -13166759, -32620276, 13502303, 3877282, -8490077, -96976600, --58569396, -30632244, 56043956, 29473676, 150962736, 145518320, 146964112, 152333904, 159670784, 116084376, -59204512, 89265528, 52097416, -20622822, -45678588, -67573256, -139540272, -121853056, -129803576, -89764816, --94291712, -65485904, -56399364, -24784108, 6970195, -48583596, -24407762, -3721589, -4095251, -21889300, -13099650, 46822660, 48381732, 25352656, 56700012, 74052216, 22948548, 23323820, 20432234, 74237976, -73966320, 94747512, 101766032, 93835368, 101966280, 153218128, 67579160, 123526480, 160647344, 111155904, -125925216, 105348032, 58730992, 70806832, 74251392, 71240624, 87949120, 90361816, 62148176, 30720828, -42338176, 65289408, 20514912, 31168040, 6020471, 6266894, -41075992, 649614, -88445184, -116520312, --84060024, -98010616, -144426336, -134697152, -53810036, -116386632, -38426000, -1539746, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, -{ -632971, --2012729, 393526, -3454228, -2672007, -2975876, -3445101, -5291400, 2605435, 2426657, -2637110, -587874, 3957812, 6357089, 2251100, 2586644, -1566589, 707059, -9688909, 2893734, 299037, --1386201, 2769180, -938987, -3627100, 3354370, 1221918, 1333587, 2476586, 3316252, 3384434, --86436, -4323422, -194884, 4540318, 4769025, 6190122, -1454920, 6061273, 120259, -335007, --1996086, -275952, 3360275, 1279900, -9922448, -3320547, -5809480, -277562, -387084, -3804267, --4479114, -3420942, 1127429, -3291556, 2004139, 3149822, 3466576, -4528506, -2304787, -5123359, --2987150, -1445257, 330176, -4853850, 4890357, 1969243, -2193655, -102542, -902480, 8402567, -1959042, -757525, -2509335, 10535018, 805306, -955630, -133144, -1093069, -5280663, -5849209, -5594732, 1035087, -2969433, -5145371, -2122251, -3954591, -6140193, 7887708, 1216550, 2686502, -4292820, 11471321, -72478, 1601486, -2601140, -1321776, -1948841, -7935489, 1935420, -2627983, -983011, 5027259, -1873143, -819802, 1386201, 260382, -1035087, -59056, -6839736, 1152662, -62814, -2858301, 2445984, 686658, -4521527, 7175817, 504659, 736587, 7234873, -3066070, --2769180, -7253126, -3235721, 4388383, 562641, 4692252, -2212982, -6030671, 2735894, -5660230, --2054068, -10561325, 4482872, 3112778, 2495376, 2599529, 7317014, 1331977, -2663417, 3258807, -6216965, -4305168, 3362423, -579284, -624381, -2564632, -805306, 3222299, 267362, 1358820, --4187056, 1064078, -2566780, -5495948, -459562, -6480032, -7678328, -4992363, -3649649, -8645769, -398358, -3193845, -1669132, 2513630, 9142912, 715112, -2123325, -1165547, 1495722, -303869, -3806415, 6328635, -525597, 7117835, -820876, -612570, -860604, 3988414, -5459441, 703838, -655519, -1491427, -325881, -3416110, -5448166, 7295002, -2567854, -718870, -1369021, 3120831, --3595961, -3224984, 1238561, 928250, 5136244, -3754338, 4204773, -2693481, -4391604, -530965, --1886028, 967978, 2209224, -295816, 2886755, 1235340, 2044404, -3087008, -3566970, -5814312, --4328254, 301721, 6435472, 615791, 5143224, 1176821, -3122441, 3498251, 1387811, -4264366, -6612102, 955630, -7225209, -8031052, -6932077, 1394791, 911070, 5804649, -4442070, 5981279, --2966212, -1454383, -9417790, -706522, 753767, -3363496, -447213, 5035313, 4954245, 7172059, --1639604, -1176284, 4657355, 2060511, 4201552, -9890236, 9885404, -2148558, 11811, 1503239, --1038308, -109522, -714575, -697395, 6208912, -192200, 8106751, -1371705, -3074660, -6597607, -953483, -2975339, -2429341, 4589173, 3725884, 4809290, 365609, 642098, -6815576, -5005785, -148176, 6481643, 2448668, -728534, 2388539, -2554969, 7075959, -233002, -5617281, -7322383, --2384244, 8553427, 6630893, 6670621, 3325915, 472983, -6670084, -2872260, -627065, -3804804, -4711579, -401043, -1542430, 4077535, -9530532, 3422015, -785979, 2857227, -263067, 2275796, --2535641, -4072703, -1001264, -3095598, 1253594, 5718749, 1845225, 458488, -2514703, -12406013, --8648454, -12348, 3367254, 4696010, -48318, 1152662, -2096481, 4653597, 1636919, 3777424, --5839545, 5487358, 2685965, -5705327, 1905355, 5707475, -630286, 2011118, 553514, 5195837, --4189741, 3182034, -848793, -425202, -5087926, 531502, 4710506, -2991982, -2706903, -4194036, -5577015, -339839, 777926, -4423817, -13688598, -3635153, 1557463, 1471563, 4508642, -3291556, --2602213, -1767379, -1316408, -4020626, -306553, -3599183, 8262444, 3335579, 6641093, -6920803, --1904818, -2693481, 6156836, -1716376, -1756642, -5207648, 2887292, 259309, -4294431, 6099928, -1130113, 1203128, 5819681, 2050310, 3502009, -2784213, 2206540, 243203, -1497333, 6040872, -4530654, -438624, -8247948, -10920491, -8506183, 3150359, -47245, -4710506, -1288490, 566936, --1133871, 12322261, 2066416, -8891119, -2427194, -2656974, 384400, -4189741, 6900402, -5210869, --6888054, 6366216, -2747169, 1737314, 1626182, -2934000, -8099772, 1048509, -4348118, -3807489, --4001299, -521302, 6185290, -899796, -1483911, 9200357, 1631014, 1370095, -11985643, -1380832, -6299644, 7389491, -4173098, 1960116, 967978, -11829951, -1618129, -790811, -1234803, 2889976, -108448, -6678138, 849330, -5358509, 5067525, -1878511, 6544457, 1217623, -7412577, 3235721, -14132053, -5513128, 285078, -10495289, 2780455, 8804683, -15382962, 2371896, -510027, -938987, -10336913, 1514513, 4513474, 7668127, -9437117, -2639258, -7261716, 3718905, 3842385, 8290361, -15464030, 2641942, -12233141, -958315, -3272228, -1087701, -5449240, 167504, -854699, 6081137, -4444755, 1857037, -715649, 367757, -2144263, -1247688, 6497212, -2102387, -1226750, 5196374, --962610, 3101503, -839666, 6571837, -5282810, -9691594, 11821361, -629213, 2531346, -9077413, -307627, -2709588, 13127568, 2199560, 5727876, -1211181, 5026186, 3710852, -12626130, -1867774, --7276212, -5845988, 401043, 8665097, 649077, -1682017, 12929462, -1370095, -8005282, -5724655, --4410932, 6607271, 19737522, 2684, 5135171, 1494649, -6914361, -1368484, -365609, 6038187, -8708583, 879931, 6913824, 6590091, -12552579, 284542, -3989488, -15205258, 3144990, -1178432, -4963372, 3830574, 14134201, 3326452, -3133179, 3886946, 10730439, 12708271, 4699231, 9074729, -8484708, -6457484, -5713917, -10718091, -12403329, 1735167, 4821638, -9756555, -7605850, -128312, --12137578, -9332427, 4589173, 2015413, -5589363, -3049964, -8079371, 6851547, 4332549, 10987063, -19699404, -1781338, -6032282, -1694902, -10225780, 332323, -8040716, -8067023, 9935870, 1628330, -1078574, -12741557, 13301514, 3173444, -8818642, -2260764, 6693707, 942208, 1200980, 243203, -826781, 4468377, -6812355, 8111583, -134755, -4870493, -1792612, -8689256, 1140851, -8931921, --8638790, 7719130, 7201587, -7002944, -12147778, 3520263, -5944235, -382789, -3309272, 4454955, --3398393, 5657009, -5858336, -6583111, 7938174, -2506650, -1770063, 4455492, -6465537, -6975027, -8005819, 10515691, 255551, -726386, 3663607, -9199283, 15634755, -9627706, 1203128, 7370701, --3464965, 6874632, 8468065, 2696703, -8741332, 9434433, -1343251, 3506304, -6838662, -1354525, --13070659, 4463545, -7736847, 2954938, -13456669, 7888781, -9818832, -6954626, 5726265, 7794292, -2704756, 825707, 392990, -8542690, -7828115, -5077188, 20643224, 11262478, -3179887, -19099720, --2636036, 5335960, 11148661, -6302865, 947040, -13197898, -4494147, -1646583, 3455301, 1919314, --2941516, -246961, 5786395, -6527814, -371515, -7435662, 4016331, 4864051, 14170171, 6040872, --6985765, 2931315, -3946001, -10759430, -1466195, 6165963, 840740, 17558364, -13351443, -2226404, -2991982, 7767985, 4097399, 10203769, 2091649, -12770548, 8135205, -10857140, -11158325, 23085, --875636, 8311836, 10854456, 9534827, 14501420, 3182571, -14706505, 15888695, 8986682, -6917582, -12589623, -1986959, 1613297, -11342472, -3711389, -3562675, -4788889, 10050760, -17532594, -4414690, --8218957, -8312373, 1487132, 8006356, -3992709, -10645613, -10758893, -14538464, -14181445, -7741679, --2429341, 5554467, -11161009, -15016279, -8574365, -4250944, -7143605, -5379984, 12491912, -7747048, -1085553, 5957120, -11521250, -7530152, -7823820, 11584601, -5443334, 7219840, 17551384, -2622078, -3762391, 775778, -5690295, -8152922, -5171141, 7279433, -1604170, 8412767, 145492, 5980742, -1142461, -13492640, 14359149, -7639136, -2967286, 24346558, 16670379, 10742787, -7520488, -18896246, --4059281, 10237591, -16313360, -10123238, 1175210, 12695923, 10507637, 7057168, -9073655, 6733435, --1804423, 6735046, -1082869, 18719614, 12568148, -1714766, -17008070, -2593624, 14494441, 10806138, -1410360, 22865332, 11621108, -5485210, 947040, 891743, -1821066, -7329899, -8105140, -2166274, --24525338, 6496675, -7736310, 476741, 140660, 5928666, 10557566, -500364, 3608310, -12136504, -9221295, -4887136, 18030272, -365072, 3566434, -41938744, -592169, 10221485, 6880001, 10911901, --2769180, -12316892, 7678328, 1436667, -8137890, 8177618, 3170760, -9889699, 1523640, -470836, -4597226, -4215511, -13582297, -16027207, 936303, -6398965, 6701223, 4315369, 4001299, 4641786, --16377247, -7114077, -17178796, -28140088, 4722317, 9508521, 10279467, 81604, 23474680, -16667157, -5703717, 3053185, -4442607, -14781130, -5895380, -8439074, 10152766, -4406100, -8721468, -14993731, --1051193, -5565741, -2508261, -11290932, 6364605, -719407, -4894115, 6070400, 8114267, 9162776, --11454678, 21719112, 1746441, -3052111, -12866111, -12428562, -2078227, -1534914, -12498355, -13402982, --9880572, 8887361, -5486821, 14660871, 5190468, 24369108, 8869644, 9413495, -2492692, 13229036, --1617055, 3429532, 19025094, -5243082, 7363722, -21676700, -27361090, 6569690, -542777, -17342542, -1946694, 999654, -23366232, 7458211, -6191732, -4082367, -8444979, 9972914, -7733089, 1451162, -251256, 5523865, 1393180, -11944841, 9350681, -256624, 4946192, -14524506, -20430622, -12965969, -4545149, 16942572, 22222698, -708133, 5900748, 13921600, 11471321, -1305670, -28330678, 19195282, --2003602, 5087926, -5891622, 9714142, -859530, -12462384, 3249680, 21980568, 3176128, -14879914, -12598750, 8884677, 5719286, -11311870, 11494943, 8415988, 662499, 13750875, -6058052, 3373697, -22304838, 16159814, 159988, 4790499, 10625212, -21978958, -4944581, -1884954, -4025458, -19367082, -4103841, 5130876, 304943, -15188078, -1074816, -25607132, 418222, -18497888, -4530117, 8541079, --8706972, -11496554, -9873593, 4599910, 3084860, -10704132, 2558190, -4351339, 10800769, -7183870, --8913131, 5638755, 9680319, -1911261, 2985539, 3643743, -29560650, -1436130, -4558034, -14703284, --1455457, 17044578, 2047089, -5566278, -6263136, 12904766, 3386582, 9689983, -23827942, 9459129, --24712704, -31876174, -18690088, 144955, -15770046, 15355582, -4010426, -21800718, 472983, -6394670, -3980361, 2709588, -3637301, -3802120, 14807973, -5200132, 6386617, -8554501, -6199249, 20551418, --6101538, -3613141, 551903, 3819300, 14568529, -28336584, -630286, 13463649, 15289547, 12084427, -2961917, -6040872, 29228864, 8391829, 10052908, 9831180, 6206228, -5049808, 1430224, 15394237, -6570226, -12757127, 7408282, 29272350, -14796699, 19890530, 8938901, -33163590, 9004399, 20432770, --1095217, 8581345, 1120450, -25414396, 13518410, 29138668, 2938295, 19446538, -11249593, 17058000, -16252693, -1657857, -1563368, 15509664, 9967545, -23222352, 23019414, -6751689, -4072166, 11895986, --5672041, -9574019, -9302362, 1061394, 1192390, -9198746, -17808546, 42027864, 19998978, -47840568, --20471962, 5678484, -8546985, 14523969, 15929497, 18207976, 19673634, -11853573, 37743100, -5199595, -443992, -11961484, 13899051, 19785304, -14369887, -15222438, -3844533, -8517994, 1180042, 8250096, -663036, -9352291, -4278861, 16357383, -1777580, 8568460, 1400159, 19575924, 27897960, 11402064, --14190572, -31391380, -3212099, -4799089, 3077344, -6765647, 10034117, 18403934, 1073205, -5914707, --15164456, 35681516, 30074972, -3377992, 14406394, -7638600, -11733314, -33018098, 18090402, -15022185, --4181688, -286152, -11100343, 6637872, 20147692, 3904125, -9709310, 10570451, -4803921, -13183402, -20601348, 5030481, -29934312, 38320236, -26063472, -12978317, 13961328, 15533286, 11923366, 703838, --13116293, 1275068, 19343996, 5467494, -25621628, -20946018, -4675072, 32249836, 3707094, -15693274, --41453952, -11739219, -1535451, 9831717, 29151554, 21966074, -2669859, 220117, 19353660, 15367393, -1169305, 4208531, -55925308, -35555348, -16830904, -27842126, 2942590, -15501611, 25500832, -5652177, --1389959, -41876, -9461276, -11378979, 18698140, 11384885, 7038378, -2423972, -7949985, -7563438, -9694815, -20044612, -6863358, 3757560, -6273337, -9645960, 9186935, -29001766, -40096740, 9947144, -13576392, 16102369, -23045720, -12444668, 14063334, 5275294, -38985420, -34735012, 3006477, -16669305, --16630650, 6788733, -31296890, 16608102, -11559368, 13693966, 13762686, -7724499, -17301202, -41671384, --13923747, -12333535, 24182276, -20040318, -12880607, 7660611, 17037598, 22434762, -3226594, -31104154, -14353244, -4983773, -12366821, -26847840, 8360691, 10975789, -38810936, 14494978, 14429480, 35099548, -3680250, -9186935, 2674154, -43643312, -12109660, -5546951, 1046898, 7669738, -14338211, 26320096, -11116986, 32608466, -6124087, 28671592, 19013284, 11221139, 26786638, 13148506, 17821430, 22208202, -1411434, -29438242, -27222576, 5502927, 32041530, 22746146, -41785200, -1306207, -6790344, -5998996, --4103841, -29258928, 7769059, -20833812, 18975166, -13923747, 42458436, -11097122, -60481192, -6408628, --20813948, 12113955, 9002251, 17342004, 39249560, 8872329, -5557688, 21620866, -13077102, 44021268, -6856379, 29424820, 13042205, 2602213, -12261595, -10333154, 70567920, -129386, -52116208, -11185705, -36235564, -26365730, -1173063, 20314658, 8103530, -40814000, -16008954, -46450608, 6543920, 41573672, --31042950, -28244778, 26575648, 13035763, -47399260, -44051868, 13393856, 2462627, 5657546, 15127412, --2728378, -13253732, -7689602, 28230820, -21223580, 34813932, 4640176, -8303783, 6355478, 19972134, --1229971, -6279779, -38563436, -16690243, 2863670, -20374252, 15917686, 25366076, 443992, 3779571, --28208808, 31304942, -12758737, -14875082, 24334210, -10691784, -1686848, -19426674, -3730716, -13979045, --47866336, 14795625, -7200513, 33068026, 41602664, -1822140, -10140418, -29056528, -11256572, -9166534, -38999912, -41206452, -30840012, -67431520, -1588601, -29164976, 4108673, 20547124, -16088411, -5968931, -40499396, 25948582, 15480673, 48318, -3851512, 29708826, -44307956, -7297687, -83752, -7471096, -5382131, 37666864, -27004606, 7903814, -7707319, -16516834, -11501386, 58158688, -5689221, 27424976, --21516712, 38998840, -11841762, -1589138, 24682104, 21620328, 59340880, 549219, 11819213, 6198175, --21591338, 27212376, 11669426, -19362786, 31207232, -14051522, 38658464, 25438018, -5845451, 21879638, -3815542, 20308216, 7239704, 35881232, -20374252, 16907676, -35497368, -11577621, 15729244, 39115340, -1104344, 1379221, 20649666, -2053531, -10846940, -51351704, -27520002, 6582038, -18129594, -2787434, -18781892, -44922672, 29589104, -3685619, 34637300, -16688632, -25996364, -6844031, 84444424, 16719234, --70302176, 11359115, 22259204, 3033321, 83746496, -6320581, -55638616, 59978144, -17333414, -5129265, -70184600, -8130373, 46377592, 6557342, -40179420, -37044, 45335528, 5752572, 6224482, -1919850, --60213296, -3600256, 8388608, -21256330, -7240241, -61324080, 38628936, 61428768, -27375584, 9495099, --46836080, -133491344, -26514980, 7156490, 67432064, 58204324, -56927108, -49095236, -51241644, -40502080, --30073362, 36464808, -7009924, 79249664, 52194592, -14893336, -65695820, -161201936, -105814576, 8188355, -178984176, 137766976, 24132348, -69751344, -178050016, -180537344, -14219563, 106435192, 162301440, 179919936, -17362942, -57139172, -74480104, -96471944, -88790392, 6618545, 59248536, 113466592, 76251776, 62712428, --82299088, -98407368, -117955368, -139525776, 13943074, 168471696, 163601744, 34133180, -61911416, -157148016, --208972704, -69584912, 13150116, 76899776, 185250528, 69302520, -4307316, -104345160, -89848568, -36695664, -36417564, 71912784, 119060792, -15982647, 28919626, 22203370, -51009180, 510027, 26201448, -21131776, -28949690, -1255204, -5373541, -2173254, 5771899, 21932788, -8748312, 25848724, 17557290, 10439455, -11635603, 8767102, -2381023, -15035607, 24139864, -511101, 14659797, -9037685, 13022878, -4754529, --2076617, 8736500, -12210592, -12917651, 1656784, -5711770, 19441170, 19152332, -18037252, 8595303, --10846940, 11912092, 6979, 7700340, 2794413, 10075993, -12945568, 8440148, -14864882, -6695317, --2301566, -2022930, 11506217, -22647900, -4677757, -9582609, -20095078, -2153926, -8061117, 4338991, -18615998, -6067178, -26416196, 3826816, 16028281, 31335008, -1562294, 2470680, -17195438, -13243532, -14740865, 1175210, -5468030, 430570, 26240102, 11692512, 8942659, 14721537, 25309168, -23469312, -3491809, 4629975, -17569100, 46506444, 82949240, 5957657, -52567716, 16939888, -3011846, 65376920, -32224602, 64243584, -5128191, -32069448, -7428683, 13434658, 28449326, 20419348, -11094437, 1056025, -12656195, 7406134, 26927834, -19180788, 5372467, -25501368, -2959233, -711354, 7280507, 11680164, -3794604, -11486890, 20854750, -2894271, -16549046, 22880902, -3092377, -9631464, 7363185, -4627291, -19650550, 28669980, 1745367, 6701223, -8981313, -7309498, 18233746, 11394011, 15287399, 1763621, --7980586, -19757386, -18126910, -21914534, 17780628, 17300128, 19089520, 25784836, 29864518, 11402601, -2683818, -26097832, 16587164, -3674882, -21524228, 27179626, -749472, 17583596, 11100343, -29072634, -9326521, -9186935, 7744900, 18357764, 5627481, -24103894, -13885092, -13422310, -29577292, -64042796, -3663607, 90122912, 117629488, 102159552, 69261720, -2511482, 3453154, -51382304, -62596464, -103194104, --79272752, -82841328, -28030568, 7259569, 25929792, 45681272, 111720688, 94090384, 62000536, 20554640, --11318849, -40837084, -31834298, -42526080, -55497420, -30178050, -32463510, -38227356, -19364396, -25301652, -3544959, 17300128, 12998182, 47659104, 42467564, 38869456, 23725400, 29214904, 16619913, 35012572, -6327024, 30084098, -1049583, -9049496, -56550224, -24577950, -67792304, -76883136, -87505128, -67726264, --52930104, -19244138, 9436580, 46834472, 48215840, 38823820, 80172544, 65844532, 68587408, 64836288, -58298276, 22283900, 35588636, -19765976, -46177876, -46452220, -106357888, -104589968, -103832448, -108328736, --93204552, -35801772, -24256364, 14690936, 46365784, 49877992, 21386790, 10043244, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, -}, -{ -{ --2168959, --445603, 329102, -860067, -1518808, -3882651, 483721, -608275, -7189239, -1008244, -819265, -2469069, 5764383, -4874788, 2117419, -3059091, 1299765, -4207458, 2139968, 1373316, -3018288, --2754148, -4562329, 1896765, -4285841, 639413, 3762391, 2639794, 1153736, 1784559, 277562, --3806952, 163746, -2378875, 1923072, 1250909, 1466195, 5996311, 1932735, 905164, -128849, -2052458, -59593, 1890323, -471373, 4276177, 1480153, 1901597, 3220152, 7155416, 351114, --1174674, 2863670, -2155537, -4983236, 2552821, -2284923, -4288525, 1119913, -1305670, 2362769, --1137093, -1913408, -3275986, 3397856, 1266479, -198642, -3163244, -4417374, -1308891, -1005022, -724239, -550293, -78383, 702764, 1323387, 10341208, 5574868, -671626, 3679176, 858993, -882616, -11425150, -4894652, -5681168, 4491462, -653372, -3637837, 3988951, 4221953, 233539, -4057670, -1706713, -73551, -271120, -2401961, -1318555, -5402532, 2793876, -8017630, 3346317, --4148939, 3414499, 6497749, 2909304, -1153736, -1840930, 4822175, -786516, 293132, 4478041, --4742181, -155156, -1554241, -2785286, 666257, -682900, 1073742, 4603668, 7672959, -2413772, -216359, 6311455, 559956, 1668058, -2241436, -3520263, -437550, 1080184, -5875516, -1537061, -3196530, 439697, 1206886, 1893544, -774168, -1806571, -1682554, -2019172, 2379949, 1974611, --1029182, -3305514, -4138201, 2214593, 81604, -3298535, 3694746, -541166, -271120, 972810, -933082, -900333, -3777961, -983548, -13422, -3494493, -3621731, -2102923, 8546448, -5988258, --2523293, -4167192, -7713762, 2911451, 1271847, 346282, 6541235, 6283001, 6203544, 2067490, --1213865, 1017907, 4664335, -1962263, 1984275, 2433636, -5604933, 7968238, 1485522, 2518998, -5800354, -2190433, -5890548, 456877, 3911105, -2729452, -1324461, -3658239, 3888019, -30065, --463856, -6401649, -345208, -708670, 3920232, 2119566, -3623342, 7172596, 2539400, 1567126, -2401424, -1057636, 3886946, -1443646, 104690, -4833449, -6005975, 4854387, 3600793, 6688338, -522912, 1908039, -5209796, -7714835, -4003983, -2196876, -2451890, -3454764, -3311957, 1820529, --1120450, 2610803, -3198677, -869194, 1000191, 1787780, -1254131, 4429185, 809601, -7387881, --6904160, 4044249, 906238, 5658620, -8762270, -1235877, -3497714, 933619, 10387378, 5934034, --9133785, 3433290, 832150, -3811784, -4260608, -5182415, -8425115, 277025, 960462, -3134789, -1440425, -1821066, 266825, 2496450, 1895154, 5369246, -4792647, 8470749, -5258651, 4898947, -3845070, -3234110, 2211908, 362388, 3447785, -1469953, 1751810, 3187403, 979789, 443455, --1413581, 2463701, 636729, -1199370, 5921150, -7988639, 399969, -4872641, 9373766, 3284039, --8493835, 3147674, 10707890, -10334765, -5094368, 1137093, -1074279, -3986804, 2988224, -1469953, -6963216, -6220724, -943282, -2143189, -810138, -504122, 6557878, -6653978, -2710661, -869731, --7407745, 3433290, 1894081, 7009387, 1601486, 5668283, 3165391, -4946729, 531502, -3039226, -3274376, 1378685, -5211406, 15005005, -9493488, 3167539, 15992311, -11124502, 5242008, -74088, -5224291, -1154809, -9706089, -1869921, 8018167, 7448010, 2011118, 216896, 4097399, 2289755, -206158, 3674882, 3449396, -2449742, 4391604, -839666, 6885907, -5085242, -8287677, 2187212, --7198902, 2946348, 310848, -1674500, -2158758, -2908767, -4786204, 1440425, 2004139, 668404, -1537598, 1969243, -2793876, -5920076, 5394479, 1696512, 1180579, 268972, 7838852, 2113124, -3537443, 8521752, -4391067, 2579665, 807454, 3079492, 6057515, 5060545, -6602976, -5530844, --974958, -2790118, -108448, 1111323, -2292439, 2547453, -4840428, 1237488, -4478577, 3754338, -3987340, -2122251, 5488968, -2804614, 5054103, -1597191, 2937221, -3226057, 1123671, -2384244, -2248416, -1548873, -8396661, 6248104, 5364414, 10813654, -6733435, 3979824, -8527121, -2374580, -6621766, 5453535, -5703717, 1139240, -6739341, -179315, -8047158, 2195802, -5786932, -9069897, --6516003, 3010772, -5071283, -468688, -6098854, 192200, 2018635, -1788317, -4176856, 2527052, -5552319, 1986422, 3143379, -6244346, 4054449, -6511708, -767189, 2844879, 1203128, -1515587, --450972, -935229, 4814659, -4988068, -7082401, -2455111, 3732864, -2455648, -4884989, -6897718, --7500624, 1378148, -1216013, -8931921, 7235410, -5989869, -3732327, 9185861, -2080912, -2702071, -2415382, -2552284, -1498944, 33823, -3508452, -3478924, -2290828, -4392141, 1838783, 1303523, -7954817, -11344082, 2266669, 9336722, -3315715, 10241886, 3199214, 319975, -2827699, -7746511, --4632659, 12214887, -6550362, -447213, -2138357, 580357, 7764227, 6390375, -3953518, 9402220, -9978820, -5077188, -2276333, 5517959, -4922570, -4902169, -200790, -7290170, -50466, -2517925, -964757, 11270531, 4101694, 89657, -5350456, -16261820, -1869385, 8233989, 2193118, -6488622, -4524748, 6541772, 6259915, 6924561, -12422656, 1833414, 568009, -6854231, 3285650, -6266358, -3877819, -3882651, 4809827, 10212358, 14440217, 8352638, 4100620, -6898255, -1795833, -8112120, --7713762, -2558727, 8370355, 1069447, -27917, 902480, -8507256, 967441, 889595, -1404454, --4336843, 751082, 4537633, -6624450, -8929774, 18355616, 3469797, -6244883, -1061394, -4031901, --783832, 2131378, -3040300, 15830176, -1044751, 4096325, 12309376, 1032403, -1165010, -8174397, -4907000, -4636417, -4582730, -15999827, -6327561, 2643016, -205085, -3474092, -10573136, 3447785, -6813429, -9277129, -3962107, -2820183, -8575976, 3234647, 1320703, -5319854, -3339337, -2110977, --11795054, -4867272, 6874095, 9958419, -7158100, -10223096, -2144799, -970663, -7261716, -6942815, -3220689, 3990562, -8009041, 17133162, 825707, 6757594, -3234647, 6337761, -3773129, 1675037, --11660299, -2946348, 5842230, -12743705, 4189204, -3114925, -5546414, -14404247, 475668, 7549479, -904628, -15149423, -1461363, 2456185, 6764037, 10684805, -3264175, 4669703, 13457743, 4052302, -2160906, -6031745, -767189, 5134097, -1885491, -4529580, 5578089, 1372242, -9407589, -13916768, --11974369, -14417668, 12342125, -7388418, -2253784, 4488778, -14308147, -5471789, -10069551, -4007205, --3475166, 6621766, -12593918, -6212670, 3507915, 5142687, 6658273, 190589, -156766, -1884417, --421981, -2578591, 1345935, -9400073, -5619965, -8237211, 5499706, 3213173, 4161287, 6208912, --12204150, -583579, -1701881, 10974715, -4466766, 3625489, 5390721, -1952600, 5794985, -3859028, -6504191, 10001368, -4296041, -460635, 7902740, -6970195, 11099806, -4779762, -18964428, 3040300, -9021042, -3496640, 543850, -186831, 6746857, 9294846, -9940702, -3991098, 1517734, 6359773, --11684459, -8349954, -7454990, 13186623, -1224066, -15464030, -4395362, -6790880, -8757438, -3270618, -5674726, 2366527, 8213588, 3074123, 3906273, -16359530, -6701223, 6631967, -4582730, -2946885, --5741835, 1864553, 8381092, 2428267, 1810866, -10917270, -3997541, -1860795, 3852586, 9891310, --12081743, 5730023, -9904195, -2405719, -9139690, 1292785, 944893, -296890, 3411815, -8120710, --2682744, -7599945, -3495567, 296353, -672162, -9580998, 5260261, 6413460, -2659659, 7584376, -14252312, 1666447, 10705206, 14353781, 759136, 643708, 3054796, -2785823, 4325569, 1168768, --3485903, -4556424, 17416630, -1612223, 10007274, 4864588, -5657546, -5804649, -4656819, 5298379, --4488241, 6829535, 15259482, 8362838, -2512556, 727997, -13583371, -8511015, -8453033, 12995497, -18949396, -7742216, -534723, -7007239, -2135136, 10761577, 31446676, 13088913, -3799972, -1516124, --5352603, 13853954, -13918378, -8591545, -21499532, -709207, 11195906, 12970801, 2811056, -5805185, --12743168, -10085657, 10057203, -2451353, 15744276, -538482, -4563940, 6750615, 3009162, -643708, --3459596, 9511205, -1508070, 8135742, 213675, -5265093, 19253802, -5073430, 8010114, 18023294, -6871411, -1359894, -8753680, -2300492, -14471355, -17938468, 4094178, 10484015, -2350421, 921271, --18613314, -7847979, 11263015, 5266167, -4608500, 2928631, -5324149, -3442416, -8346732, -15247134, -1151051, -4197794, -9973451, -17545478, -14175003, -5545877, -13006772, 5213554, -5690832, 1166621, -1956358, -1093606, 554051, -3200825, -2736431, 7464117, 17307108, -12693776, 2343979, -6057515, -6427419, -7341173, -13131326, -14126147, 3389803, 5872831, 16974784, -14357002, 4293357, 4802311, --24833500, -846109, -243739, -20139102, -11552388, -6958384, 4762582, -1383516, 772557, -5524939, -8122857, 13751948, 6635188, -1713155, -21239150, -8829916, -11799886, 4391604, 721018, -8922258, --1276142, 7296076, -6626061, 12477954, -11731703, -202400, -7118909, -20605106, 2871723, -8720931, --10635950, 7798587, 10726144, -12772696, 4221416, 15204721, -5728413, 6674916, 4384625, -3534758, -1215476, -16822314, 24577414, 10006200, 5102421, 24283208, -30652108, -2282238, -5127654, 3070365, -11040213, 12481712, 3703873, 5877126, 14361297, -1632088, -11830487, -18534932, 5771899, -7147363, --737661, 4733054, -5193153, 7237557, 18292802, -12601971, 7517267, -6309307, -7764764, 3360275, -16244640, 18402862, 5011153, 11233487, -7184407, 5127117, 5633387, -31039728, 9033927, 9657234, -2442763, -10089415, 117575, -19261318, 22666154, 13159780, -6665789, -7790534, -10745471, -6070400, -16502338, -16615618, -9011915, -2713346, -2374580, -3778498, 2707977, -11072963, -10690174, -6746857, --8153459, -2532957, -10714870, -1750199, -7077033, -24509768, -15156940, -6202470, -3513820, 3201361, -4398047, -318901, 1044751, 6866042, 3709241, 3440269, 17413408, 3419331, 6076305, 10525354, -23248658, 19500226, 1293322, -7898445, -14842870, 13599477, -3180423, 36960340, 7636452, 16505022, --1721208, 1995012, -14715095, -715112, 12782360, 7290707, 9528385, -11311333, -7793218, -14535243, --27913530, 15375446, -25289842, -3349538, 29072096, 4118337, -22535694, 7082938, 7699803, -14106820, --11938398, 855235, 8524973, 22098680, -1633698, -15891379, -17224430, -210990, -9965935, 3483219, -2534568, -17773648, -16434692, -29465086, -9407052, -8022999, -21029770, -13175886, -612033, -8789651, --6471442, -4625143, -2142115, -19503446, -11353746, -11659226, -6633040, 7105487, -17719962, 2159295, -13942538, 18012020, -4452271, 5602785, 9363566, -15990163, 9145059, -6357089, 14635101, -6278706, -948651, -6808060, -2137820, 30996242, -6574521, 12391518, -22288196, -2432025, -450972, -19498078, -18918258, 2043868, -7544110, 15273441, -6156836, 5039071, 26978838, -9325448, -15533823, 12048994, --3391951, -28988344, 11984569, -38818452, -22537304, 18786186, 12192338, 5479305, 8055748, 3779571, --660351, -24014772, -13033615, -5106716, -5273683, 41637560, 22516366, 212601, -21529060, 11142756, --22441740, -17934172, 3109020, 18581640, 36220532, -5566815, 18225156, -6426345, 12888123, 22211960, -12167642, 14242112, 7394860, -4002373, -18221936, -18566070, -5813775, -17550846, -5348308, -3148211, --4122095, 14197551, -2545305, -36208720, 1997160, 8797704, 8256538, 21725018, -2352568, -43281996, -24515136, -19390704, 6248641, -4284767, 14489609, 21134998, -23663122, -1763621, -11836393, -20729122, -14875082, -10427644, -25346750, 9705552, 14828375, 24065776, 6506339, -4164508, 2753074, 19505594, --15923054, 30955976, -9722195, -9418863, -2596845, 18411988, -19650550, 896038, 2843805, -56716652, --7705708, 15770046, -7286412, 1068373, 8698919, 1640678, -1293322, 1112397, 21388400, 16207596, --6067178, -1649268, 23895588, 15787763, -43983688, -25033216, 30500710, 35201552, -18548354, -6195491, --49353468, -27228482, 7570954, -1950452, 7078106, -26060250, -16033113, -17687212, 27409408, 40343700, --1297080, 11305428, -5786395, -2884608, 259309, 9827959, 18103824, 4944581, -5254893, -2494839, --3090766, -22927610, -12468290, -23248658, -2108829, 8523899, -8989367, 16062104, -9791452, -2929705, -24537686, -9928891, 14476187, 10461467, -2704756, -20812338, -14512694, -11680700, 5786395, 43500504, -9233643, 24339580, 28474022, 22750978, 17495550, 15932718, -20700668, 2950106, -1255741, 33512020, -17406428, 20929376, 35227860, -12694850, -18450106, 11455752, 30884572, -42324220, 3193845, 8147016, -26096222, -32197222, -50982336, -3731790, 22392886, 12239583, 15524159, 24599962, -5709086, -4151623, -11483669, -18018998, 14460618, -3159485, -8803072, -22660248, 10111964, -12372727, -17046726, 11507828, -29740502, 5699959, -7743826, 13480292, 29913910, 7430294, 8309688, -748398, -325881, 10130217, --20037634, -1365263, -29998736, 14755897, -23669028, -4987531, 16989280, 5061082, -12286291, 357019, --14637785, 32908040, 7461432, 8702677, 21497386, 36515276, -13421773, 9820980, -15988016, 3771518, -17114370, 28609850, 10435697, -9634149, 35489316, 1125281, 724776, -22071836, 4277788, 16907676, --3826279, 15990700, -21002926, 33411624, 41678900, -50243600, 1974074, -7054484, 13344463, -12280922, --2811593, 15222438, -13507135, -54526756, 3942780, 38307888, -31277026, 11065446, -4586488, -11754252, --17653926, 39577588, 439697, -3789235, 9495636, -47160352, 31740882, 3342558, -23501524, 2079301, --48242148, -11462194, 2998961, -9750650, -38282116, -4579509, -24896314, -6578816, 24048058, 5220533, -31363462, 12557948, 12304544, 7055021, -9702868, 24503326, -11681774, -314606, 12472585, 5323075, --14188961, 12229383, 5938329, 29181618, 12972949, -5142687, 18646600, -13871134, 24866786, 8344048, --24987046, -26668526, 15104863, 17752174, 8523899, 3176665, -11370926, -16817482, 6649683, -16476031, --24122684, -7327751, -2789581, -22913114, -7132867, 9480067, -14394046, -25741350, 9271224, 10705206, -2819109, -2264522, 454730, -3391414, 11642046, 46409804, 11459510, -49929, 685584, -14336601, --23198728, -9583146, 39920112, 42055248, 23420456, 6266358, 39437464, 20358682, -4737349, -46825880, --34610992, -26671746, -54487028, -18801220, -4173635, 11114838, 20989506, -8956081, 27049704, -30818538, -25026774, -3120294, 33391224, -21473226, 19362786, -31667330, 27834610, -25536802, -10658498, 38696044, -9084930, 31155156, 44432512, 4800700, -3328600, -18146236, -1219234, 28414430, 7348152, -9556302, --30791694, 3097745, 6462315, 15182709, 9318468, 12774306, 7995082, -17540646, -28551332, -11619497, -28417114, 11454678, 89802936, -27609124, -23438710, 30000346, 46350212, 10553272, -297963, 13072807, -3543885, 15816754, -12960601, 6489696, 22000970, 24962886, 16394427, 70727912, -8215736, -7497939, --3896072, 37360308, 22030498, -16463147, 19403052, 1406065, 6786585, -13021804, 32450626, -29650844, -2899640, 51128364, -35389992, 107395120, -47647292, 52570936, 46679852, -43224552, -41303088, 48406964, -214748, -6401649, 15406585, 25325812, -56374132, -20627118, 30735322, -67406824, -45587320, -26863946, -46312096, 106180720, 26261578, -79249664, -20893942, -81029392, -46005004, 70129296, 37999188, 66051764, -32489816, -46073724, -79274360, -56203944, -16707960, 36759016, 36556616, 25818122, 10465762, -18096844, --86604792, -98599568, -24707874, 79257712, 134582800, 95370288, -20601348, -62435940, -95699384, -66620848, --58736900, 2108292, 18945638, 77162312, 76854680, -41406704, -30623116, -98852968, -97304632, -31746788, -5587753, 99310920, 139974064, 65721588, -46362560, -148769072, -115755808, -80074832, 35328252, 87601760, -49107584, 35632660, 24166708, -88227752, -21397528, -49703508, 13907641, -5697811, 47798692, 84873384, -60666412, -77268608, -163727904, -118200184, 6646999, 91106992, -9023189, -18546206, 36869072, 11468100, --29811904, -28164248, 126702, -45367204, -5565204, 6737193, 5241471, -3920768, 1190243, -15222975, --1841467, -1746441, 7894687, -5206037, 20983600, -5480915, -3952444, -5755256, -6490233, 13137768, -3810710, -6173479, 20338818, 1415192, -35923644, -17829482, 10006737, 17793512, -5908802, 2340220, -24766392, -392453, 3459596, -19944218, -8924405, 6483790, -4295504, -4187056, -2587718, 16658031, -6002217, -6023692, -19226422, -7283191, -1044751, -17161078, 1773285, -19613506, -13380434, -8799851, --17797808, 28664074, -4969814, -11979738, 11940546, 598074, -27473296, -717796, 27613418, 23338852, --12692165, 18442590, 3029026, 17818208, -18239116, -25617332, 10669773, 13737453, 11002632, 11162083, --9331353, 12267500, -18025440, 15222975, 13787382, -22089554, 44259636, 67796056, -9012452, -25017648, --21711596, 62460636, 28014998, 60424820, 32353452, 56371, -28331214, -6320581, 15123117, 28304372, -13254269, -13253195, -3598646, 13433047, 19596862, 2320356, 4061429, -14163192, 2091649, -6957310, -8615168, 9984725, 25912612, 22519588, -12671227, 1693828, -14192719, 3228742, 11415486, 17687212, -639950, -8942122, -772557, -15890842, 12146704, -3995393, 4497905, 11625940, -639950, 15605227, --8870181, -4926328, -4776004, -17095044, -10990821, -25820806, -5922760, -29398514, 746787, -10555956, -22381074, 2824478, 5577552, -22996866, 7902203, -631897, -11526082, 15466714, -10567230, -5499169, -2117956, 9791452, -3447248, -7013145, 34257196, 10708964, 5645735, 12385075, -13457206, -26069914, --54200876, -8253854, 73179800, 110934176, 94459752, 73223288, -4501663, 7681549, -54067732, -62911608, --100407208, -59183576, -63180044, -21227876, 8187819, 42566348, 31361852, 94142464, 83210696, 26023744, -5766531, -16346109, -32590212, -52922588, -19020800, -54284628, -14340896, -27353036, -16983912, -14111652, -2235531, -1018444, 17188996, 23805394, 38463580, 40415104, 50138376, 41859288, -6365142, 1970853, --1762010, 5847598, -26663156, 7657927, -28591598, -70239360, -34949224, -53398792, -86973624, -27907624, --9662066, -37609416, 9090835, 22734872, 56418692, 66290136, 99907384, 61277908, 49377628, 48590040, -28564216, -14806900, 430034, -57105348, -50594176, -81016504, -96411280, -109865800, -83515640, -65424700, --16093242, -11559368, -4680978, 19373524, 33392296, 77469400, 49866716, 24200530, -2239289, 0, -0, 0, 0, }, -{ --266825, --848256, -2347200, 1889786, 4907000, -1739999, 3080029, 3562139, 873489, 1805497, 4203699, -4820564, -1772748, 1234266, -3221226, -3966402, 4744328, -9451076, 529892, -6005975, -4046933, --2385318, -933619, 11103027, -158914, 2776160, 2876554, 420907, -907312, -488016, -839666, -1137093, 2854006, 2432025, -752693, 103079, -830002, -3867618, 1779190, 1083406, -1492501, --5880884, -5230734, -176094, 334471, 709207, 3226594, 3525631, -4456566, -3146601, -3311957, -2951716, 4565014, 2816962, 6103686, -190052, -630286, -1303523, 4073777, -2573759, 559420, -408022, -3329137, -4973572, -1956895, 5257040, 117038, 7946763, 250182, -931471, 187368, -5209259, -796180, -425739, 2817499, 2080912, 7327214, 2882997, -3787088, -561567, 2501819, --388158, 2665027, -6706055, -4909148, -1118302, -5785321, 2454037, -1354525, -568009, -3938485, --1659468, 3496640, 3636764, -1491427, -1035624, -2467459, -5420786, 6010807, 3679713, 63351, -689342, -430570, 222265, 4817880, -2449742, 803159, -7824357, -6547141, -1578937, 481573, --5448166, -1122597, 1975148, 364535, 121333, -2859375, -2098629, 5031554, -2369211, -2306398, --716723, -841277, 2265595, -1306744, -3376381, -239444, 2937758, -4331475, 156229, -4633196, -280247, -3429532, 4955856, -416075, -5337571, -901406, -592169, 492848, -7631083, -1048509, -503048, -5172751, 2165201, -26844, -5990943, 2514167, 3332358, -3196530, -3852586, -6400038, -2956548, 2305324, -105764, -5415954, 2425046, -6763500, -1952063, -875636, -3496640, 3380139, -7613904, -3033321, -1048509, 463320, -3186329, 2309082, -492848, -2454574, -4378719, -2196876, -6899328, 6797860, 3751117, 7883413, 4569845, 2614561, 7310035, -4369593, 1632625, 3286187, --107911, 1435056, -2121714, 1585380, -10034654, 413391, -525597, 3850975, -2214056, -1063541, --624381, 3020436, -3104188, -274341, 1008780, 2218351, 2024540, -271657, -3301756, 927176, -1334661, 2763275, 2014877, 3180423, -3055869, -1590212, -409096, -5375152, -478889, 1872606, -5127117, 5856725, -514859, 3415036, 2511482, 1074, 2321967, 2856690, 3857954, -974421, -297963, -2196876, 839666, -1829656, 1991791, -2967286, -2759517, 2160369, 402653, -6684043, --6768332, 2659122, -1015760, 5648419, 5196911, 673236, -130460, 10700911, -3102040, -34897, -8533026, 573915, -5369783, -7251516, 5126044, -1982664, -256087, -4423817, 1136556, -3109556, -3374234, 16552267, -6283001, -4631586, -6215892, -6214818, 848793, -5042829, -13222594, -164819, -961536, 185220, -5465883, -931471, 3846143, -5127654, -3457986, 7783555, 2161442, -1822677, --2188286, 5043366, -2815351, 3635690, 2843805, -6884296, -5018670, -4045322, 4174171, -3462818, --2509872, -1857573, -2736968, -310848, -5129802, 80531, -1851668, 1190243, -1090922, -10220412, -4295504, -5730560, 4054449, 809601, -8873402, 1647120, 5146445, 1640141, 8884677, -4090420, -54224, 909459, 1783485, 3090766, -3891777, 942745, 2807835, -4038880, 1764158, 2519535, --2606508, 1392106, -1407676, -9050570, 2654827, 9175124, 7113003, 8639327, 1233729, -1399623, --7303055, -3325379, -3529390, -2266669, 7158100, 10620380, 563714, -251792, 7110319, -11334956, -84289, -474594, -347892, -3350075, -4090420, 4809290, 5193153, 702764, -1278290, 2669322, --5821292, -3772592, 4318590, -4197257, 9096204, 8907225, 1341104, 5741298, 4285304, 1529545, --3762928, 1979443, -201327, -5761162, 6295885, 177167, 2975876, 5869610, -6008123, -1557463, --7126962, -794569, 1763621, 7647726, -6806987, -1835562, 5248450, -90194, -4232154, 8465917, --5929203, -11884711, 2496987, -6120329, -2903935, 4848481, -2701535, 2084670, 1308354, -1501091, -6199786, -3046206, 3128347, -1690070, 479426, -12029667, 2826089, 10812043, 1224603, 1478543, -3708168, 10132365, 1777580, -10214506, 11441793, 4645544, 4377646, 6534256, 6238977, -149787, --1672890, 6175626, 5274757, 1492501, -4153770, 5373004, 3037616, 8043937, 9998684, 3503620, --1899986, 102005, 398358, 3880503, 12607340, 7119445, -6237903, 11667279, 974958, -1498944, -2069101, -8691940, 10149545, -1300301, 717796, -1149441, 3010772, -1280437, 5539434, -6940131, -10413685, 8442295, 289373, -1479079, -4844723, -10301479, -2936147, 4269198, -1769527, -3739843, -6197101, 6679748, -3695819, -3678103, -12636331, -4363150, -908386, -339839, -14170171, 7968238, -1646046, -8483634, -6458557, 2940979, -2543158, 1505386, -1142998, 1341104, -2357937, 1533840, -5874442, -7321309, 310848, -285615, 628139, 10888279, 6557342, -448824, 14395120, 6127308, -13037910, 2674154, 4671314, 13160854, -4942971, -9338333, -5289252, 12290049, 3498788, -7454990, -10044855, -2964601, -5203353, 8281771, 20855824, -5594732, 1458141, 2945811, 4344360, -5629092, -1118302, 10937134, 1657321, 13524315, -2555506, 14549202, 10971494, 3257733, 9279277, 5282273, --4811437, 3400004, -875100, -1612760, 1909650, 722091, -463320, 3635153, 3220689, 9316858, -6982006, -8300561, 3323231, 3338263, -5391795, 79457, -13433047, -18378702, 7797513, -4911832, --11274289, -2815351, -5803575, 7517267, 2286533, -3968013, -8353175, 6688338, -5883032, 3933653, --6682969, 687195, -2384781, 10515691, 2468533, -4888210, 4134443, -7803956, 950798, 445066, -1993939, -4698158, 5363341, 6172942, -749472, -3875671, -14004815, -11768747, -9263708, 4442070, -1161252, 2389076, -11481521, 7408282, 5031554, 9181566, -9842991, 9469866, 7074348, -5416491, --4711579, -2631204, 9400073, 6731288, -4194036, 1156420, 14260365, 7471633, 3664144, 8518531, -5673115, 2471217, -4743792, 1323387, 653909, -1753420, -5250598, 12965433, 5939940, -11537356, -8006893, 8233453, 7939247, 6499896, 1708860, -7056632, 271657, -661425, 11128260, 1803886, -5017059, 10399190, -1723356, -10615549, 2528662, 6284611, 11285563, -14521284, -8297340, 4495220, -280247, 1802813, -8700530, -1735704, -8427800, -721018, 4209605, -2324651, -4563403, -5178657, -2481954, -884226, -2955474, 5305895, 674847, -9218074, 9416716, 6092948, -2809446, 3792993, -5691369, -6195491, -2088428, 24169392, -751082, 9477919, 6622840, -20026896, -10635950, -1036161, --776315, -130460, 11506754, 2677375, -5465346, 11927124, 7362111, -1349694, -1817308, 3904125, --1785633, -4029753, -8813273, -10474351, 6046240, -2172717, -4821101, -355409, -16349867, -2907156, -1314797, 9311489, -10694469, -2980707, 1680943, 923955, 2674154, 1009317, 11987254, -13404593, --4187593, 3229279, -70330, -7821673, -1289027, 10799158, 9548786, 8084739, -1685775, -13338021, --5649493, 5112085, -954020, 9303973, 123480, 22549, -6021544, -3995930, 8775692, -9538585, -7609609, 5362267, -5881421, -3336653, -261993, 1241782, -5783711, 3770981, -17704392, -1662689, -3056406, 11752641, 2098629, -1010928, 8002061, -5876052, 16691854, -16562468, -937377, -3919695, -3309809, -1249836, -684510, 3675955, -2383707, -5909338, -2995203, -3663070, -8979703, -1948841, -7539278, -1987496, -3591130, 9803800, 551903, 11883638, -11281805, -7260642, 15934866, -1918240, --168041, 542777, -8791798, -1462973, -11150272, 3156264, -13523778, -693637, 11484206, -3802120, -8110509, 9235790, 6421513, 7212861, -8801462, 9361418, 1990717, -25560424, -3304441, 3390877, --1093606, -3092913, -9833328, 8265128, -8201240, -2093260, -9403831, -10104447, -14100915, 13282186, -1247151, 15518791, -6674379, 11611444, 17057462, -10711112, 14199699, -16202227, -11765526, -14753213, --3474092, -10598906, 4901632, 4131759, 1307818, 12462384, 19557670, 3412889, -5888400, -10329933, -6207302, 19044958, -369367, 5832029, 408559, 7911330, 4546760, 6190122, 9536975, -11647951, --1522566, -4006131, 15344844, 12315819, -1141388, 18820546, 9113384, 2149631, -17788680, -8031589, --13700409, -5565741, 762357, 5457293, -5282810, 1207423, 18047452, -2977486, -557809, 1464584, -18559628, -11181410, -5282810, -4249334, -2449742, -10929081, 12610561, 1399086, 8273718, -13210783, -1308354, -974421, -8732205, -2726767, -15699179, 5282273, -251256, 3726958, -2386928, -373662, --18096308, -5420786, 6383395, 11752641, -3702799, 3520263, 22958748, -894964, 983011, 4957466, -10235981, -9191230, 2066953, 12642236, -7089918, 9524090, 2688113, 10077604, -11375758, -4615479, -3041911, 5046587, -10887742, -16687022, 4671851, -1814087, -16754131, 4584878, 1756642, 15221901, -13547401, -12508019, -14911053, 3352759, -11354820, -6030671, 578210, 22706418, 440234, -2882997, --20166482, -10156524, -1612223, -15126875, -22845468, 15795279, -5759551, -7245610, -1134945, 17135846, --5150740, 1896228, -3208341, -3409667, -9701794, -5274757, 1934346, -23995982, -15167140, -4408247, --8458401, -8101919, -2471754, -9391483, 8535174, 3779034, 3017215, -5710696, 4566087, -34645352, -32723356, 18967650, -2753074, -4363687, 18708340, 1129040, -10235444, -15425375, -1283658, -5396090, --5677410, -9277666, -8651675, 11881490, 12029130, -5017596, 25414932, -13547937, -9859634, -10075456, -1531156, 7854422, -26724898, 8243653, -6794639, 14528264, -13179107, 6120329, 3268470, 16307991, -1560147, 38288560, 12731894, -1011465, 1832340, -15142981, -19134616, 23794656, -6965900, 2457258, -32079648, -8602819, -1400696, -7128572, 25033216, 4476430, -10167798, 14370961, -5226975, 21489868, -11573863, 5077188, 3339874, -2798708, -8259759, -3124052, -2174864, -23826332, -5793374, -4210142, -13032005, -7710540, 2519535, 3823595, -16698296, -25491168, -823560, 21041044, -1377074, 18606872, --3259343, -27369680, -10316511, 605590, 6123013, 4201552, -21739514, -492848, -6192806, 15111306, --16127602, 19254338, 29618632, 18393734, -5990406, 2747169, 11959336, -5130876, 23195508, 25900800, -23656680, 6759742, 25922276, -1904818, -10486700, 2283312, -13639742, -18234284, 9200357, -8489003, -20932060, 9823664, 5113696, -8282845, -27255326, -8667244, -19506130, 11455752, 14190035, -140660, -6924561, 4776541, 6857989, 5822365, 2595771, -1441498, 3340411, -3964255, 7376070, -13091060, --36857260, -14643154, 20180978, 1313723, -6019934, -12176769, -77846, 17154100, 21682606, 4803921, --13314399, -2153926, 17346300, -20790326, 2001455, -2397129, 15522012, 17949742, -14209362, 27127014, -5209259, 1330903, 37962680, 462246, -11923903, 13586592, -6360310, 2202245, -8138426, 3142306, -25194816, 3248069, 32092532, 13919989, -28133110, -30350386, -6801081, 8374650, 17056388, -23420994, --8565775, -3031710, 28762322, 26925150, -22913650, -450972, -14120779, 9172440, -5119064, 30710626, --32212, -6285685, 19346144, -3741990, -24225226, -11701638, -4808753, 24320790, -23050016, 12352326, -35602596, 14506252, 16258062, -16554415, 12008192, 21009906, 15062987, -27146878, -14921253, 19420768, -53271016, 4738960, 10550587, -14396730, 3630321, 687195, -3853660, -13387950, 3214246, -3715684, -24912958, 22317724, -28661390, -10562935, 27670326, 16292958, 9128416, 4704063, 14367202, 19894288, -4534412, 12597139, 8773008, -11489038, 668941, -11178726, -7088307, 5373541, -3833258, 4052302, --12468827, -8124468, 6450504, -114354, 9379135, 10431402, -26648662, 20973400, 2429341, 17347372, --18461380, 11987254, 13973139, -9658845, -20947630, -17323214, -23084912, -19217832, -19431506, 8962523, -30409980, 11112691, 8215736, 17923436, -664646, 2629594, -14309220, 24493662, -29133300, -51233592, -16520592, -8934069, -20401, -42423540, 8689793, 18968186, -721555, 14212584, 3649112, 104153, --6353331, 12906377, 9430674, 12348568, -17546016, -9186935, -2343442, 11336566, -23412404, 39272644, -18822694, -3134253, 21603148, 12954695, 20616380, -10597295, -13485660, -13180718, 24962350, 8963060, -4740570, 22501334, -19208168, -62892816, -3892314, 4514011, 7846369, -35213364, 27900108, 20409684, --37803228, -28963112, 1326608, 16197932, 1737314, 9453223, 20654498, -4796405, 12999792, -17811766, --20660940, -16144245, -21464100, -33390150, 9999758, 4367445, -22424024, 31173946, 12283070, -6398965, --6680285, -16773458, -12829604, -29931090, -16341814, 12390444, 28208808, -9067213, 3373160, 12978317, --23881092, 19479824, 24576876, 5548561, -5478231, 22748294, 6278169, 4933307, -13972602, -14074071, --549219, 34301220, -8696235, -23524072, 165356, -29366838, -36941012, -21114596, -5521181, -13657996, --24065238, -12350715, -13008919, 15737834, 30451854, 11491722, -14146549, -29339996, 31492310, 17252346, --15476378, -8026220, -8359080, 2001455, 7240241, -9524090, 16232829, 15562814, 612033, -10022306, --10017474, -8898098, -1463510, 6261526, -4934918, -9837086, -24528558, 7809861, 20906290, -11834782, -18407692, 984621, 12185896, -10105521, 13555991, 41192496, -15787226, 18287434, 34784404, 6703370, --6835978, -9207873, 9545028, 1431298, 17261474, -13083007, 47656420, -14226005, -33567852, 8357470, --15945603, 39366060, 11358578, -10954851, 815507, -22000970, -33364380, 40299680, 2652679, -9044127, -36446556, -18322868, 2591476, -9419937, 19455128, -26366268, -35443144, -20356534, 2797634, 16670379, -20032802, 14522895, 19369228, 47296716, -17997524, 18949396, 29767344, -4385699, 916976, 35718560, -3964792, -19409494, -22529250, -19890530, 36767604, -24437290, 14726906, 17343614, -11522860, 3716221, --19847044, -4351876, 16662862, -14347338, 12162274, -4621922, -24888798, -55206972, -4516158, 50240380, -21403970, 5466420, -9328132, -14629732, -2119566, -19279572, 7046968, -27312770, 33968360, 2960306, -4787815, 3269544, -10396505, -32904282, -11933030, 27521614, -21033528, -4953708, -14216342, 12738873, --9853192, 37984692, -4912369, 8502425, -12421582, -33856692, 8900783, -25586194, -4712653, -1335198, --47319804, -39980776, -37398964, 14004278, -5695127, -19813758, -12131135, -12170864, -10786273, -17397838, --10964515, -1808718, -41914048, 13763223, 6732361, 17814988, -7755101, 39884140, -1970853, 9648644, --11135240, -1921998, 22451942, -29170882, -6785512, -9058623, 15607374, 8588861, 18762564, -7444789, --37512780, 10387915, 998580, 62495532, 64986076, 7223598, 1047435, 14616847, 8016557, 15649787, -28223304, 9784472, 29265908, 43109660, -10568841, 5140539, -35616016, -5682242, 4959077, -5230734, --10458245, -22354232, -18118320, 9567040, 10235981, -48275968, 34164856, 8645232, 48125644, -3468186, --9470940, 15187541, -3330210, 50075024, 12829604, -3070902, 9625559, 9553618, -13725105, -31309774, --24435680, -12530030, 37479496, 157840, 41154376, 4802847, 40153112, -11949673, -56337624, -21072184, --16802986, 28792924, 2828773, -27157078, -40102648, -27389544, -6386617, 34124588, -30576946, -25407952, --18129056, 30770756, -16260209, -8153459, -40629316, -38003480, 10615012, 7857106, 50629612, 15314780, --7201050, 2029909, 1872606, 37700688, 15772194, -19594178, 37560564, -3022583, -70213592, -22457848, -46395848, 49450104, -33840048, -35830228, -34394636, 19529216, 32203664, 60875792, 20164872, 7573638, --33266132, -3813394, -391916, 13596793, 32516660, 22164716, 3725884, -37108516, -70023000, -19044958, --34354368, 54322748, 59558312, 100364792, -27739046, -96022584, -18643380, -32701344, 77300288, 25952340, -78459928, 20147692, -22746684, -72698224, -46891380, 3473555, 11974906, 83199960, 36372468, -1819456, --64658048, -116964848, -27704686, 3842385, 57890252, 125777040, 30533460, 39127152, -76527192, -120902792, -9021579, 30238718, 101604968, 59762324, 45086420, -20090246, -74926776, -61756260, 3670050, 21627308, -2703145, 53289808, -36320928, -33377264, -5237713, -81202800, 16903918, -38385732, 51882132, 1436667, -5345087, -20291572, -54413476, 33552822, -54757612, 58003532, 5436892, 7632157, 9065602, -30555472, -30394946, 5959804, 20350628, -29154774, 8695698, 3036542, 37066104, -12995497, 7198365, 29218126, --32580548, -14533096, 388695, -24596740, 42004244, -7135015, -20830592, 42887932, 43544524, -9420474, --36477156, -5487895, -32409824, -2609193, 16159278, 56371, -39701604, 7432441, 17806398, -10160819, -20424180, -15784005, 6546067, 27344984, -11909407, 19076634, -44634912, -39741332, 41533944, 27369680, -65285112, 352724, -18934900, 60210608, -34333968, -25822954, 18367428, 22463752, 30871688, -26156350, --15321759, 11956115, -7292318, 35620848, -26554172, -76734960, 20570746, 48212080, 1013075, -33564096, -8509404, 26615912, -5541582, -4725001, -966368, -21809844, -12732431, 80502720, 22468048, 21867290, --68539088, -17929878, -53742924, -46308876, 41028748, 42242612, 85385024, 38483444, -11551315, -17563196, --10140955, 25857314, 18496814, -624381, 41157596, 6810745, -17012366, -21016886, -16383153, 28369332, --609349, 24524264, 11451993, 14071387, 3090766, -8359617, 2077154, -2088965, 2830920, -8831527, --2951180, 6401649, 5833640, 53699440, 43546136, 34418796, -4904853, 7513509, -24652038, -6476811, --16212965, -28562070, -29022168, 5065377, 12175695, 18074832, 23408646, 18112414, -16409459, -37976100, -49041012, -41194640, -19920596, -13675176, 13985487, -2069101, 21181704, 21924734, 18408766, -36599564, --16896402, -1336272, -18828600, -56920664, 26350162, -18839338, -18276160, 11249593, 27908160, -91805, --101211440, -55207508, -68036040, 49380848, 15797963, 146582400, 158503088, 151371824, 180178704, 170931648, -129291400, 75900664, 102373768, 41882372, 15068356, -82077360, -64566244, -178295904, -148969872, -139623488, --75197896, -103356776, -71624488, -5462662, -17286170, -8757975, -4027606, 2536715, 8727910, 7075959, -29717416, 24642374, 30727270, 64755220, 73468640, 70672080, 58719184, 138063328, 46520400, 61188252, -105774304, 109945256, 51662552, 111295488, 139947744, 106662832, 100910792, 95799248, 24975234, 61392264, -122573000, 114757768, 85029080, 98944776, 95597920, 10949482, -8668318, -6726456, -31142808, -49916648, -14867029, -56121264, -85837608, -67704792, -75654776, -131582768, -39023536, -78740176, -79629768, -133531608, --91513944, -115153440, -122459184, -70647384, -130706592, -165349264, -101339752, 6479495, -672162, 0, -0, 0, 0, }, -}, -}; -const Word32 CRendBin_Combined_HRIR_coeff_re_48kHz_fx[15][BINAURAL_CHANNELS][240] ={ -{ -{ -591356864, -602200576, 625467520, 657311488, 675305792, 655243456, 616993536, 612510656, 636582848, 605619904, 484448160, -380037504, 423112256, 590311552, 738261376, 797214656, 832138112, 910296320, 1007401216, 1071398400, 1095982720, -1089256320, 1031573312, 913199168, 777546368, 685862784, 657140736, 668234624, 696832704, 742273408, 813552704, -913253952, 1030070592, 1139625600, 1216546304, 1250709504, 1250671872, 1231760128, 1203536768, 1166884608, 1119160064, -1061989696, 1004802752, 959169792, 929753024, 912757312, 901457280, 889540864, 871032256, 842555008, 806505728, -769039680, 734854400, 705459136, 680934848, 661060416, 645468096, 633794368, 624781888, 615331904, 602178560, -584063488, 560285440, 528072672, 484184544, 428944832, 366892224, 304280192, 247500176, 202229616, 171427184, -154277904, 148099056, 150429088, 158711920, 169591616, 179823296, 187428608, 191850816, 193787856, 194745632, -195949296, 197934640, 201510736, 208074528, 218345392, 231886352, 248418768, 268307680, 291102144, 314787264, -337050240, 356353984, 371552800, 381496704, 385412640, 383181408, 375294784, 362846368, 347200320, 329467488, -310722080, 292437888, 275762656, 260609488, 246567088, 234356496, 225260832, 219650000, 217340384, 218822672, -224834560, 235197776, 249167152, 266420048, 286923136, 310524512, 337267680, 367393120, 400790784, 437318400, -477523040, 521913696, 569809536, 620230336, 673409024, 729850240, 788359488, 846688384, 903672960, 958912640, -1010481792, 1054694208, 1088314112, 1109581184, 1116685056, 1106621952, 1076729472, 1026966400, 959503744, 876062208, -777221056, 664998400, 544082688, 418661056, 289705760, 157642480, 25789132, -102029632, -225718256, -347099936, --465098784, -576757184, -682193792, -784291648, -883714240, -978283520, -1067402432, -1153286272, -1237131520, -1317139200, --1391275136, -1459658624, -1522985728, -1579894656, -1627292288, -1663214848, -1688108928, -1702371968, -1704015872, -1691106304, --1665435264, -1630263808, -1585290624, -1528357120, -1461195136, -1387605632, -1306595072, -1214017024, -1110125568, -997769216, --874274944, -733867072, -576635840, -405794400, -218905360, -12729746, 206384448, 427856064, 646835520, 856251136, -1036709568, 1168554240, 1244153216, 1253890432, 1176388864, 1002391680, 748564480, 427082432, 39296804, -354520032, --598867136, -562934400, -304085824, -39659728, 67954432, 43758200, 3848828, -113817, 5425081, -234613, --4213363, 795106, 3238405, -993211, -2480881, 1097364, 1996086, -1024350, -1545651, 974421, -1202591, -926639, -976568, 789200, 694174, -766652, -570694, 625992, 367220, -578747, --257161, 485331, 141734, -388158, -8590, 346282, -38118, -208306, 187368, }, -{ -519927808, -530017216, 466860800, 320014240, 179574192, 91877944, 9543417, -86853904, -131920456, -83504904, 3501472, -50432044, 26572962, -75433584, -251784400, -442617312, -551045888, -545525824, -486239168, -427736864, -359921472, --270188864, -194567920, -165222016, -158624960, -136778608, -99855840, -60807612, -3196530, 94492504, 214905136, -319855328, 399596768, 470877120, 531518304, 549032640, 501886240, 410894688, 317784096, 244543632, 185171072, -128257928, 71558984, 14892262, -46188616, -112785304, -177098144, -230683232, -272678880, -305296480, -326825536, --334137728, -327876736, -310965280, -285371584, -253225360, -217572848, -179481312, -137296144, -90265720, -40242768, -10457708, 59538984, 102896680, 135867536, 157079840, 168768048, 173415744, 172320528, 167035568, 159876944, -152828352, 147094032, 143294608, 141170736, 139437184, 136325488, 129968392, 118732760, 102292696, 82190640, -60512332, 38238632, 15131170, -9887015, -38775500, -73349992, -113059648, -154378304, -192600832, -223349040, --242643104, -247449168, -237033344, -213207552, -179452320, -140565152, -102270152, -69394320, -44122200, -26440892, --15446850, -9341017, -5072357, 725313, 10765336, 27581744, 54035520, 92223152, 141980880, 200616304, -263345920, 323517888, 373243936, 404991264, 413136672, 394475552, 348091008, 275402432, 180246352, 68402184, --53290880, -177418656, -295944192, -400517504, -483597216, -539454848, -564354944, -556716352, -517826496, -451912704, --364800032, -262651744, -151906544, -39088496, 70405248, 172821424, 264930768, 343262912, 404896768, 447910336, -470505088, 470804128, 448127776, 403556736, 339092512, 257591200, 163818640, 64262912, -34533148, -126612952, --206073600, -267704240, -308601984, -328299232, -327595936, -308422144, -274420480, -230245136, -180154544, -127826816, --76795624, -29921964, 11274826, 46106472, 74042016, 95014880, 109733192, 119107496, 123791696, 124422520, -121678032, 115948544, 107431624, 96491808, 83497384, 68584720, 51995412, 34262564, 15771657, -3326989, --22571126, -41188200, -58603220, -74133816, -86342264, -93631896, -95170032, -90304912, -77953120, -57965952, --32314260, -3663607, 25825638, 52808232, 71989024, 79367240, 74249784, 56223268, 24601572, -14105746, --42410656, -44609140, -24227910, -1767379, 6867116, 3891777, 264677, 423591, 1282585, 801011, -521839, 1245004, 1653562, 1271310, 1171989, 1639604, 1773285, 1404991, 1297080, 1534914, -1468879, 1077500, 922344, 980326, 776315, 379568, 200253, 144955, -121333, -471910, --623844, -716723, -967441, -1210644, -1279900, -1345399, -1514513, -1603097, -1554778, }, -}, -{ -{ -519927808, -530017216, 466860800, 320014240, 179574192, 91877944, 9543417, -86853904, -131920456, -83504904, 3501472, -50432044, 26572962, -75433584, -251784400, -442617312, -551045888, -545525824, -486239168, -427736864, -359921472, --270188864, -194567920, -165222016, -158624960, -136778608, -99855840, -60807612, -3196530, 94492504, 214905136, -319855328, 399596768, 470877120, 531518304, 549032640, 501886240, 410894688, 317784096, 244543632, 185171072, -128257928, 71558984, 14892262, -46188616, -112785304, -177098144, -230683232, -272678880, -305296480, -326825536, --334137728, -327876736, -310965280, -285371584, -253225360, -217572848, -179481312, -137296144, -90265720, -40242768, -10457708, 59538984, 102896680, 135867536, 157079840, 168768048, 173415744, 172320528, 167035568, 159876944, -152828352, 147094032, 143294608, 141170736, 139437184, 136325488, 129968392, 118732760, 102292696, 82190640, -60512332, 38238632, 15131170, -9887015, -38775500, -73349992, -113059648, -154378304, -192600832, -223349040, --242643104, -247449168, -237033344, -213207552, -179452320, -140565152, -102270152, -69394320, -44122200, -26440892, --15446850, -9341017, -5072357, 725313, 10765336, 27581744, 54035520, 92223152, 141980880, 200616304, -263345920, 323517888, 373243936, 404991264, 413136672, 394475552, 348091008, 275402432, 180246352, 68402184, --53290880, -177418656, -295944192, -400517504, -483597216, -539454848, -564354944, -556716352, -517826496, -451912704, --364800032, -262651744, -151906544, -39088496, 70405248, 172821424, 264930768, 343262912, 404896768, 447910336, -470505088, 470804128, 448127776, 403556736, 339092512, 257591200, 163818640, 64262912, -34533148, -126612952, --206073600, -267704240, -308601984, -328299232, -327595936, -308422144, -274420480, -230245136, -180154544, -127826816, --76795624, -29921964, 11274826, 46106472, 74042016, 95014880, 109733192, 119107496, 123791696, 124422520, -121678032, 115948544, 107431624, 96491808, 83497384, 68584720, 51995412, 34262564, 15771657, -3326989, --22571126, -41188200, -58603220, -74133816, -86342264, -93631896, -95170032, -90304912, -77953120, -57965952, --32314260, -3663607, 25825638, 52808232, 71989024, 79367240, 74249784, 56223268, 24601572, -14105746, --42410656, -44609140, -24227910, -1767379, 6867116, 3891777, 264677, 423591, 1282585, 801011, -521839, 1245004, 1653562, 1271310, 1171989, 1639604, 1773285, 1404991, 1297080, 1534914, -1468879, 1077500, 922344, 980326, 776315, 379568, 200253, 144955, -121333, -471910, --623844, -716723, -967441, -1210644, -1279900, -1345399, -1514513, -1603097, -1554778, }, -{ -591356864, -602200576, 625467520, 657311488, 675305792, 655243456, 616993536, 612510656, 636582848, 605619904, 484448160, -380037504, 423112256, 590311552, 738261376, 797214656, 832138112, 910296320, 1007401216, 1071398400, 1095982720, -1089256320, 1031573312, 913199168, 777546368, 685862784, 657140736, 668234624, 696832704, 742273408, 813552704, -913253952, 1030070592, 1139625600, 1216546304, 1250709504, 1250671872, 1231760128, 1203536768, 1166884608, 1119160064, -1061989696, 1004802752, 959169792, 929753024, 912757312, 901457280, 889540864, 871032256, 842555008, 806505728, -769039680, 734854400, 705459136, 680934848, 661060416, 645468096, 633794368, 624781888, 615331904, 602178560, -584063488, 560285440, 528072672, 484184544, 428944832, 366892224, 304280192, 247500176, 202229616, 171427184, -154277904, 148099056, 150429088, 158711920, 169591616, 179823296, 187428608, 191850816, 193787856, 194745632, -195949296, 197934640, 201510736, 208074528, 218345392, 231886352, 248418768, 268307680, 291102144, 314787264, -337050240, 356353984, 371552800, 381496704, 385412640, 383181408, 375294784, 362846368, 347200320, 329467488, -310722080, 292437888, 275762656, 260609488, 246567088, 234356496, 225260832, 219650000, 217340384, 218822672, -224834560, 235197776, 249167152, 266420048, 286923136, 310524512, 337267680, 367393120, 400790784, 437318400, -477523040, 521913696, 569809536, 620230336, 673409024, 729850240, 788359488, 846688384, 903672960, 958912640, -1010481792, 1054694208, 1088314112, 1109581184, 1116685056, 1106621952, 1076729472, 1026966400, 959503744, 876062208, -777221056, 664998400, 544082688, 418661056, 289705760, 157642480, 25789132, -102029632, -225718256, -347099936, --465098784, -576757184, -682193792, -784291648, -883714240, -978283520, -1067402432, -1153286272, -1237131520, -1317139200, --1391275136, -1459658624, -1522985728, -1579894656, -1627292288, -1663214848, -1688108928, -1702371968, -1704015872, -1691106304, --1665435264, -1630263808, -1585290624, -1528357120, -1461195136, -1387605632, -1306595072, -1214017024, -1110125568, -997769216, --874274944, -733867072, -576635840, -405794400, -218905360, -12729746, 206384448, 427856064, 646835520, 856251136, -1036709568, 1168554240, 1244153216, 1253890432, 1176388864, 1002391680, 748564480, 427082432, 39296804, -354520032, --598867136, -562934400, -304085824, -39659728, 67954432, 43758200, 3848828, -113817, 5425081, -234613, --4213363, 795106, 3238405, -993211, -2480881, 1097364, 1996086, -1024350, -1545651, 974421, -1202591, -926639, -976568, 789200, 694174, -766652, -570694, 625992, 367220, -578747, --257161, 485331, 141734, -388158, -8590, 346282, -38118, -208306, 187368, }, -}, -{ -{ -557387968, -593159680, 624878528, 592054784, 496021472, 439830944, 497395872, 568646144, 487803584, 279752160, 172007536, -304443936, 546257024, 676547008, 654668992, 619560320, 679938944, 802748160, 890860480, 891186368, 816945216, -714719040, 629804352, 583309184, 570548288, 582207488, 619833600, 686186496, 771129152, 854134784, 913836416, -934031360, 911524672, 860876800, 801601408, 739015168, 666780224, 587767872, 520823296, 484344000, 481374016, -501688672, 530134784, 551650944, 556632576, 545941888, 527557280, 506844256, 482542784, 451983552, 416671968, -381627168, 351128064, 326048672, 304637728, 285190112, 267333792, 250556048, 233008960, 213521616, 193968784, -177589376, 165159216, 154646736, 144559472, 135879344, 130301256, 127932040, 127418256, 127691528, 129051416, -132694088, 139440944, 148960208, 160134096, 171935600, 183858960, 195841920, 208121232, 220983584, 234291008, -247348784, 259533600, 271027456, 282685088, 295102368, 307943776, 320258528, 331289632, 340634944, 347539104, -350454848, 347743104, 338704352, 323762688, 304125568, 281853472, 259888464, 241151136, 227387920, 219248416, -217304400, 222436352, 235214416, 255448544, 282617984, 316601888, 357794400, 406395712, 461548992, 521332256, -583583488, 646257280, 706787840, 761959424, 809219648, 847609088, 876638784, 894981504, 901453504, 896620608, -881838912, 856941568, 820498176, 772231872, 713310848, 644071168, 563615168, 472553792, 374247872, 272054496, -166945920, 59370944, -48115980, -152288272, -252473216, -350090848, -445352128, -536800032, -624242368, -709630592, --794075584, -876057344, -953815040, -1027575744, -1097648640, -1161764480, -1216457088, -1260221824, -1293141120, -1313950208, --1319934720, -1309968256, -1285501440, -1247996672, -1197440640, -1134339456, -1061370688, -981684032, -896877248, -808056192, --717803392, -629496704, -545263808, -466033472, -393168832, -328561248, -273071872, -226043056, -186550832, -154243008, --128655744, -108451680, -91867200, -77659448, -65245384, -54001160, -42885784, -31039728, -18444738, -5459977, -8137890, 22981834, 39114804, 56093884, 74043624, 93453120, 113812872, 133719512, 152372016, 169460080, -183575488, 192614256, 195772128, 193043216, 183014992, 163948560, 136519296, 101771936, 57531624, 3827353, --46607912, -71913856, -62028992, -31731756, -6418829, 2238215, 1021129, -205085, 335007, 281320, --333397, -169114, 317828, 137439, -227633, -49392, 216359, 30065, -185220, -26844, -124017, -28454, -144418, -12348, 70867, -41876, -94489, 8053, 47782, -28454, --42413, 27380, 38655, -5369, 1074, 35970, 30065, 16106, 27917, }, -{ -557387968, -593159680, 624878528, 592054784, 496021472, 439830944, 497395872, 568646144, 487803584, 279752160, 172007536, -304443936, 546257024, 676547008, 654668992, 619560320, 679938944, 802748160, 890860480, 891186368, 816945216, -714719040, 629804352, 583309184, 570548288, 582207488, 619833600, 686186496, 771129152, 854134784, 913836416, -934031360, 911524672, 860876800, 801601408, 739015168, 666780224, 587767872, 520823296, 484344000, 481374016, -501688672, 530134784, 551650944, 556632576, 545941888, 527557280, 506844256, 482542784, 451983552, 416671968, -381627168, 351128064, 326048672, 304637728, 285190112, 267333792, 250556048, 233008960, 213521616, 193968784, -177589376, 165159216, 154646736, 144559472, 135879344, 130301256, 127932040, 127418256, 127691528, 129051416, -132694088, 139440944, 148960208, 160134096, 171935600, 183858960, 195841920, 208121232, 220983584, 234291008, -247348784, 259533600, 271027456, 282685088, 295102368, 307943776, 320258528, 331289632, 340634944, 347539104, -350454848, 347743104, 338704352, 323762688, 304125568, 281853472, 259888464, 241151136, 227387920, 219248416, -217304400, 222436352, 235214416, 255448544, 282617984, 316601888, 357794400, 406395712, 461548992, 521332256, -583583488, 646257280, 706787840, 761959424, 809219648, 847609088, 876638784, 894981504, 901453504, 896620608, -881838912, 856941568, 820498176, 772231872, 713310848, 644071168, 563615168, 472553792, 374247872, 272054496, -166945920, 59370944, -48115980, -152288272, -252473216, -350090848, -445352128, -536800032, -624242368, -709630592, --794075584, -876057344, -953815040, -1027575744, -1097648640, -1161764480, -1216457088, -1260221824, -1293141120, -1313950208, --1319934720, -1309968256, -1285501440, -1247996672, -1197440640, -1134339456, -1061370688, -981684032, -896877248, -808056192, --717803392, -629496704, -545263808, -466033472, -393168832, -328561248, -273071872, -226043056, -186550832, -154243008, --128655744, -108451680, -91867200, -77659448, -65245384, -54001160, -42885784, -31039728, -18444738, -5459977, -8137890, 22981834, 39114804, 56093884, 74043624, 93453120, 113812872, 133719512, 152372016, 169460080, -183575488, 192614256, 195772128, 193043216, 183014992, 163948560, 136519296, 101771936, 57531624, 3827353, --46607912, -71913856, -62028992, -31731756, -6418829, 2238215, 1021129, -205085, 335007, 281320, --333397, -169114, 317828, 137439, -227633, -49392, 216359, 30065, -185220, -26844, -124017, -28454, -144418, -12348, 70867, -41876, -94489, 8053, 47782, -28454, --42413, 27380, 38655, -5369, 1074, 35970, 30065, 16106, 27917, }, -}, -{ -{ -528323936, -521020320, 540578560, 592845056, 653261312, 717063552, 786136832, 823052096, 793232128, 737496320, 723856640, -740865728, 720060928, 652342720, 596755648, 578083264, 559248768, 518883584, 479682880, 451339872, 413041632, -363545888, 331671328, 327888544, 332871232, 337333184, 348948384, 358744672, 343110976, 302795200, 264860432, -243976688, 231275392, 220823056, 219565712, 230320848, 247392800, 269858176, 301967872, 340665536, 375766688, -401169824, 416797056, 423082208, 421671840, 418448992, 419976928, 429309888, 447531296, 474900992, 508197696, -540729920, 566361216, 581071488, 581869824, 568189248, 543684352, 513382816, 479775232, 443569728, 406177216, -369065472, 332418112, 296441856, 262662480, 232833936, 207938160, 188815360, 176282640, 170244448, 169768784, -173987520, 182115200, 193182800, 206733424, 223349040, 243906368, 268926688, 299044608, 335399904, 379107104, -430591936, 489461440, 554827072, 625948544, 702407552, 783147008, 865627008, 946551744, 1022604352, 1089404544, -1141034880, 1172661888, 1183078784, 1173171968, 1143169408, 1093627008, 1027916160, 950953024, 865882560, 774277376, -678871104, 583300608, 489188736, 395959488, 303981664, 215988000, 134995120, 62572304, -201863, -51686172, --90861104, -118878256, -138328544, -151115744, -157800864, -158872992, -155626528, -149380032, -140627968, -129674192, --117633248, -106007848, -95420752, -85375896, -75175888, -64502356, -53092776, -40415104, -25994216, -9968082, -6793028, 23126252, 38115152, 51076288, 61049204, 66719632, 67147520, 62217968, 51898776, 35355632, -11499775, -19732690, -57364120, -100552160, -148785728, -200636176, -253343472, -304400960, -352847136, -398310976, --439680640, -475895808, -507457888, -535759584, -561140160, -582897920, -601041472, -616570496, -629873600, -640165952, --646885952, -650597376, -652060864, -651216384, -647618816, -641518336, -633958656, -625735936, -616669248, -606437568, --595811840, -585957568, -576570368, -566297344, -555121280, -544144960, -532675264, -518246848, -500029760, -478902272, --453556608, -420442944, -378153632, -327303904, -265747888, -189495568, -98843304, 2273648, 112312320, 229941808, -346832576, 451240000, 536794688, 597777856, 620114368, 590760960, 510590016, 381782336, 195273904, -35808752, --234559968, -300432960, -214249072, -71331888, 15775415, 23496156, 4268124, -942745, 2696703, 938987, --2272575, -402116, 1856500, 120259, -1471026, 93952, 1229971, -158914, -984084, 210453, -777389, -264677, -656593, 226560, 473520, -271120, -405338, 216359, 273267, -221728, --205085, 190589, 136365, -145492, -48855, 142808, 31675, -60130, 65498, }, -{ -474580480, -398759264, 259799344, 101417064, -25479356, -112331112, -185142624, -246895664, -268402704, -242585120, -205237152, --186441312, -177279600, -161690480, -147096192, -139762528, -115844928, -44347148, 72617696, 199460960, 297104896, -342636384, 332363904, 279873504, 206060176, 123929672, 37595996, -44044888, -104937328, -137535584, -150566528, --156369024, -158901984, -157653760, -153791504, -146374096, -128723928, -94373320, -44081932, 14919106, 72908680, -119517128, 146036944, 149292528, 132541080, 102513888, 67012764, 34136400, 10182831, -3135863, -8441221, --9655086, -9846213, -10952703, -13720273, -17641578, -21669720, -25094420, -27732066, -29929480, -32669132, --37112276, -43723840, -51956756, -60378112, -66410396, -66276716, -56291988, -34812320, -3122441, 34979824, -74029664, 108025408, 131982200, 143158784, 141070880, 126644088, 101371432, 66827008, 24585466, -23269596, --73314016, -120408872, -158241088, -180575456, -182854480, -163737568, -125828584, -75043280, -18950470, 34983044, -80619224, 113781736, 132411696, 136386144, 127179888, 107473504, 80718544, 50710140, 21187074, -4627291, --24551644, -37795712, -44883480, -47211892, -46525772, -44491568, -42404748, -41034116, -40599252, -40838696, --41083508, -40307196, -37228776, -30582852, -19549618, -4136054, 14667850, 34984120, 54367308, 70325792, -80868328, 84793928, 81678464, 71765680, 55852292, 35109212, 10918881, -15112379, -41051296, -64691336, --83730928, -95960840, -99542312, -93476744, -78015400, -54739360, -26379152, 3516505, 31205622, 53573812, -68691560, 75903880, 75692360, 69438880, 58948964, 45899240, 31609348, 17107392, 3111167, -9999758, --21968220, -32387812, -40741524, -46544560, -49306760, -48571248, -44215616, -36639828, -26604102, -15072651, --3232500, 7695508, 16845398, 23805930, 28441810, 30910342, 31720480, 31430034, 30328374, 28571734, -26295938, 23301808, 18974628, 12774306, 4409858, -6484864, -20079508, -35452272, -50543176, -62921272, --69786240, -67693520, -53924924, -28570122, 5386963, 43156368, 77880104, 100739528, 104390256, 86776056, -50828252, 2720325, -47143708, -84642528, -98577016, -86414208, -51794084, -1819456, 47561396, 71257800, -54431732, 12842489, -18505404, -20906828, -7013145, 1737851, 650688, -1589675, -652835, 148176, --869731, -1324461, -414464, -31139, -600222, -618475, 101469, 339839, 38118, 163209, -667331, 766115, 553514, 638340, 883690, 816581, 587337, 552440, 564788, 373662, -127775, 8590, -99858, -300111, -486942, -588947, -670552, -758062, -811749, }, -}, -{ -{ -474580480, -398759264, 259799344, 101417064, -25479356, -112331112, -185142624, -246895664, -268402704, -242585120, -205237152, --186441312, -177279600, -161690480, -147096192, -139762528, -115844928, -44347148, 72617696, 199460960, 297104896, -342636384, 332363904, 279873504, 206060176, 123929672, 37595996, -44044888, -104937328, -137535584, -150566528, --156369024, -158901984, -157653760, -153791504, -146374096, -128723928, -94373320, -44081932, 14919106, 72908680, -119517128, 146036944, 149292528, 132541080, 102513888, 67012764, 34136400, 10182831, -3135863, -8441221, --9655086, -9846213, -10952703, -13720273, -17641578, -21669720, -25094420, -27732066, -29929480, -32669132, --37112276, -43723840, -51956756, -60378112, -66410396, -66276716, -56291988, -34812320, -3122441, 34979824, -74029664, 108025408, 131982200, 143158784, 141070880, 126644088, 101371432, 66827008, 24585466, -23269596, --73314016, -120408872, -158241088, -180575456, -182854480, -163737568, -125828584, -75043280, -18950470, 34983044, -80619224, 113781736, 132411696, 136386144, 127179888, 107473504, 80718544, 50710140, 21187074, -4627291, --24551644, -37795712, -44883480, -47211892, -46525772, -44491568, -42404748, -41034116, -40599252, -40838696, --41083508, -40307196, -37228776, -30582852, -19549618, -4136054, 14667850, 34984120, 54367308, 70325792, -80868328, 84793928, 81678464, 71765680, 55852292, 35109212, 10918881, -15112379, -41051296, -64691336, --83730928, -95960840, -99542312, -93476744, -78015400, -54739360, -26379152, 3516505, 31205622, 53573812, -68691560, 75903880, 75692360, 69438880, 58948964, 45899240, 31609348, 17107392, 3111167, -9999758, --21968220, -32387812, -40741524, -46544560, -49306760, -48571248, -44215616, -36639828, -26604102, -15072651, --3232500, 7695508, 16845398, 23805930, 28441810, 30910342, 31720480, 31430034, 30328374, 28571734, -26295938, 23301808, 18974628, 12774306, 4409858, -6484864, -20079508, -35452272, -50543176, -62921272, --69786240, -67693520, -53924924, -28570122, 5386963, 43156368, 77880104, 100739528, 104390256, 86776056, -50828252, 2720325, -47143708, -84642528, -98577016, -86414208, -51794084, -1819456, 47561396, 71257800, -54431732, 12842489, -18505404, -20906828, -7013145, 1737851, 650688, -1589675, -652835, 148176, --869731, -1324461, -414464, -31139, -600222, -618475, 101469, 339839, 38118, 163209, -667331, 766115, 553514, 638340, 883690, 816581, 587337, 552440, 564788, 373662, -127775, 8590, -99858, -300111, -486942, -588947, -670552, -758062, -811749, }, -{ -528323936, -521020320, 540578560, 592845056, 653261312, 717063552, 786136832, 823052096, 793232128, 737496320, 723856640, -740865728, 720060928, 652342720, 596755648, 578083264, 559248768, 518883584, 479682880, 451339872, 413041632, -363545888, 331671328, 327888544, 332871232, 337333184, 348948384, 358744672, 343110976, 302795200, 264860432, -243976688, 231275392, 220823056, 219565712, 230320848, 247392800, 269858176, 301967872, 340665536, 375766688, -401169824, 416797056, 423082208, 421671840, 418448992, 419976928, 429309888, 447531296, 474900992, 508197696, -540729920, 566361216, 581071488, 581869824, 568189248, 543684352, 513382816, 479775232, 443569728, 406177216, -369065472, 332418112, 296441856, 262662480, 232833936, 207938160, 188815360, 176282640, 170244448, 169768784, -173987520, 182115200, 193182800, 206733424, 223349040, 243906368, 268926688, 299044608, 335399904, 379107104, -430591936, 489461440, 554827072, 625948544, 702407552, 783147008, 865627008, 946551744, 1022604352, 1089404544, -1141034880, 1172661888, 1183078784, 1173171968, 1143169408, 1093627008, 1027916160, 950953024, 865882560, 774277376, -678871104, 583300608, 489188736, 395959488, 303981664, 215988000, 134995120, 62572304, -201863, -51686172, --90861104, -118878256, -138328544, -151115744, -157800864, -158872992, -155626528, -149380032, -140627968, -129674192, --117633248, -106007848, -95420752, -85375896, -75175888, -64502356, -53092776, -40415104, -25994216, -9968082, -6793028, 23126252, 38115152, 51076288, 61049204, 66719632, 67147520, 62217968, 51898776, 35355632, -11499775, -19732690, -57364120, -100552160, -148785728, -200636176, -253343472, -304400960, -352847136, -398310976, --439680640, -475895808, -507457888, -535759584, -561140160, -582897920, -601041472, -616570496, -629873600, -640165952, --646885952, -650597376, -652060864, -651216384, -647618816, -641518336, -633958656, -625735936, -616669248, -606437568, --595811840, -585957568, -576570368, -566297344, -555121280, -544144960, -532675264, -518246848, -500029760, -478902272, --453556608, -420442944, -378153632, -327303904, -265747888, -189495568, -98843304, 2273648, 112312320, 229941808, -346832576, 451240000, 536794688, 597777856, 620114368, 590760960, 510590016, 381782336, 195273904, -35808752, --234559968, -300432960, -214249072, -71331888, 15775415, 23496156, 4268124, -942745, 2696703, 938987, --2272575, -402116, 1856500, 120259, -1471026, 93952, 1229971, -158914, -984084, 210453, -777389, -264677, -656593, 226560, 473520, -271120, -405338, 216359, 273267, -221728, --205085, 190589, 136365, -145492, -48855, 142808, 31675, -60130, 65498, }, -}, -{ -{ -570948288, -560026688, 580181376, 651761280, 741916928, 808227456, 843835456, 857312512, 837136384, 774951680, 706217152, -679031104, 684954432, 669311040, 616302016, 573348608, 574092160, 586936832, 569456832, 532186720, 511266464, -508753920, 500068416, 481083584, 469860832, 471176704, 471000064, 463027008, 456938336, 460991712, 472953760, -487162560, 498884064, 503802880, 502036032, 500722304, 507399392, 523648864, 547635712, 577758464, 611217856, -643876800, 673844416, 701608704, 726164096, 744914304, 757558144, 766675264, 774677376, 782670272, 791276352, -800164224, 807529536, 811386944, 810441536, 803607680, 790492480, 772253888, 750109056, 723654208, 692558656, -658613376, 623875136, 588272000, 551226816, 513920224, 477741024, 442319360, 407270816, 374342368, 346103488, -324013952, 308986912, 302183712, 304083136, 314027616, 331233792, 355143872, 384909600, 419871168, 460244416, -506109280, 556402816, 610180096, 667974272, 730482688, 796728256, 864836224, 933754880, 1002700352, 1069331456, -1129822848, 1180747776, 1219959168, 1245454080, 1254418176, 1244496256, 1215806464, 1170467200, 1109940864, 1034459008, -945641216, 847554880, 743703680, 634964736, 522334048, 409629280, 301142176, 198468288, 102261024, 15424301, --58399208, -118443920, -166344624, -202983920, -228296832, -243548272, -251478384, -254185296, -252344368, -246456496, --237761344, -227809360, -217644784, -207521552, -197397776, -187577872, -178339920, -168868448, -157501280, -143418624, --127228208, -109625816, -90643672, -70704288, -51351164, -34363496, -20870320, -11671574, -7842611, -10806138, --21989696, -42191076, -71323840, -109272560, -156607936, -213349280, -277530592, -346465888, -418796896, -493406368, --567116608, -635954752, -698211328, -753866624, -801667456, -839523328, -867368640, -886954240, -899010176, -902935808, --899064448, -889133376, -874578816, -855873728, -833484544, -808545280, -782657920, -757145856, -732274752, -707778944, --684467456, -663835520, -645579200, -627796992, -610332544, -594772992, -580344064, -563827712, -544390336, -523586592, --499708160, -467863136, -426242208, -375602400, -312369216, -230306880, -129177048, -13320841, 116749560, 260566000, -407468928, 542101120, 656437952, 742504256, 780045504, 750219648, 653257024, 490681760, 248766112, -54896660, --315592576, -397934080, -278208128, -86560232, 26632556, 32959042, 5339181, -1480690, 3817152, 1295470, --3219078, -542240, 2632278, 140123, -2107218, 150324, 1763084, -252329, -1420024, 335007, -1135482, -409633, -951335, 375810, 700080, -432181, -585189, 369904, 397821, -374736, --287226, 331786, 177167, -271657, -49392, 255014, 3758, -143345, 130460, }, -{ -486143040, -364342624, 167167104, -39809516, -210170464, -331450144, -400646368, -397819200, -302972896, -136612176, 38106024, -162898976, 224026560, 241295024, 232041520, 197469712, 137426608, 64054068, -4851703, -61337500, -109474424, --150905280, -174555520, -167025904, -129885720, -78476568, -24754580, 29452202, 81586128, 121351616, 139262704, -135213088, 114415248, 80613848, 37157372, -10004053, -54111756, -89473832, -110401064, -112610824, -97661648, --72609104, -43728672, -13062606, 18713172, 49372260, 75726712, 94291712, 100883952, 92121144, 68263672, -33529736, -5985574, -43577812, -72516768, -87965760, -88946088, -77864536, -58571544, -35153772, -11158862, -11494943, 32676648, 52577380, 70250632, 83405584, 88749056, 82459080, 61465276, 25380036, -22145926, --73177112, -116362472, -139532752, -134017472, -98660232, -41028212, 24821152, 82922936, 120561880, 131824896, -117951616, 85022632, 41123240, -5562520, -47731044, -79383344, -96038152, -95309080, -77927888, -48202416, --13012140, 20197620, 45314052, 58828168, 60328184, 52038896, 37601900, 20818780, 4846334, -8215736, --17446694, -22883586, -25109990, -24932286, -23152558, -20329690, -16650514, -12021077, -6245420, 798864, -8900783, 17241072, 24407762, 28773060, 28998008, 24451786, 15506443, 3594351, -9093520, -20161114, --27564026, -30052960, -27466316, -20724828, -11460583, -1493038, 7592429, 14678588, 19193672, 21027624, -20345796, 17446158, 12731357, 6713571, 0, -6703370, -12594455, -16858284, -18838800, -18180596, --14910516, -9489730, -2803540, 4010963, 9847823, 13867913, 15613280, 15064061, 12602508, 8839043, -4398047, -165893, -4359392, -7796440, -10248329, -11593190, -11739756, -10663330, -8444443, -5230197, --1233729, 3169686, 7443715, 11014444, 13337484, 13909788, 12430172, 8997956, 4060355, -1731409, --7519414, -12302934, -15287936, -16097001, -14592688, -10806138, -5191542, 1425929, 8293582, 14696841, -19480362, 21246130, 19167366, 13080323, 3120831, -9589051, -21958020, -29879550, -30411590, -22520124, --6946573, 12622372, 29110214, 35555348, 29511258, 13119514, -8797704, -27741730, -32343788, -17748952, -5345624, 18192944, 13360033, 1357210, -4248260, -2078227, 543313, 91268, -795643, -256087, -223875, -275952, -562641, -71941, 215285, -70867, -133681, 248034, 392990, 158377, -103616, 299574, 277025, 19327, -73014, -4295, -89121, -279710, -303869, -215822, --225486, -260919, -163209, -23085, 32212, 82141, 196495, 271657, 263604, }, -}, -{ -{ -486143040, -364342624, 167167104, -39809516, -210170464, -331450144, -400646368, -397819200, -302972896, -136612176, 38106024, -162898976, 224026560, 241295024, 232041520, 197469712, 137426608, 64054068, -4851703, -61337500, -109474424, --150905280, -174555520, -167025904, -129885720, -78476568, -24754580, 29452202, 81586128, 121351616, 139262704, -135213088, 114415248, 80613848, 37157372, -10004053, -54111756, -89473832, -110401064, -112610824, -97661648, --72609104, -43728672, -13062606, 18713172, 49372260, 75726712, 94291712, 100883952, 92121144, 68263672, -33529736, -5985574, -43577812, -72516768, -87965760, -88946088, -77864536, -58571544, -35153772, -11158862, -11494943, 32676648, 52577380, 70250632, 83405584, 88749056, 82459080, 61465276, 25380036, -22145926, --73177112, -116362472, -139532752, -134017472, -98660232, -41028212, 24821152, 82922936, 120561880, 131824896, -117951616, 85022632, 41123240, -5562520, -47731044, -79383344, -96038152, -95309080, -77927888, -48202416, --13012140, 20197620, 45314052, 58828168, 60328184, 52038896, 37601900, 20818780, 4846334, -8215736, --17446694, -22883586, -25109990, -24932286, -23152558, -20329690, -16650514, -12021077, -6245420, 798864, -8900783, 17241072, 24407762, 28773060, 28998008, 24451786, 15506443, 3594351, -9093520, -20161114, --27564026, -30052960, -27466316, -20724828, -11460583, -1493038, 7592429, 14678588, 19193672, 21027624, -20345796, 17446158, 12731357, 6713571, 0, -6703370, -12594455, -16858284, -18838800, -18180596, --14910516, -9489730, -2803540, 4010963, 9847823, 13867913, 15613280, 15064061, 12602508, 8839043, -4398047, -165893, -4359392, -7796440, -10248329, -11593190, -11739756, -10663330, -8444443, -5230197, --1233729, 3169686, 7443715, 11014444, 13337484, 13909788, 12430172, 8997956, 4060355, -1731409, --7519414, -12302934, -15287936, -16097001, -14592688, -10806138, -5191542, 1425929, 8293582, 14696841, -19480362, 21246130, 19167366, 13080323, 3120831, -9589051, -21958020, -29879550, -30411590, -22520124, --6946573, 12622372, 29110214, 35555348, 29511258, 13119514, -8797704, -27741730, -32343788, -17748952, -5345624, 18192944, 13360033, 1357210, -4248260, -2078227, 543313, 91268, -795643, -256087, -223875, -275952, -562641, -71941, 215285, -70867, -133681, 248034, 392990, 158377, -103616, 299574, 277025, 19327, -73014, -4295, -89121, -279710, -303869, -215822, --225486, -260919, -163209, -23085, 32212, 82141, 196495, 271657, 263604, }, -{ -570948288, -560026688, 580181376, 651761280, 741916928, 808227456, 843835456, 857312512, 837136384, 774951680, 706217152, -679031104, 684954432, 669311040, 616302016, 573348608, 574092160, 586936832, 569456832, 532186720, 511266464, -508753920, 500068416, 481083584, 469860832, 471176704, 471000064, 463027008, 456938336, 460991712, 472953760, -487162560, 498884064, 503802880, 502036032, 500722304, 507399392, 523648864, 547635712, 577758464, 611217856, -643876800, 673844416, 701608704, 726164096, 744914304, 757558144, 766675264, 774677376, 782670272, 791276352, -800164224, 807529536, 811386944, 810441536, 803607680, 790492480, 772253888, 750109056, 723654208, 692558656, -658613376, 623875136, 588272000, 551226816, 513920224, 477741024, 442319360, 407270816, 374342368, 346103488, -324013952, 308986912, 302183712, 304083136, 314027616, 331233792, 355143872, 384909600, 419871168, 460244416, -506109280, 556402816, 610180096, 667974272, 730482688, 796728256, 864836224, 933754880, 1002700352, 1069331456, -1129822848, 1180747776, 1219959168, 1245454080, 1254418176, 1244496256, 1215806464, 1170467200, 1109940864, 1034459008, -945641216, 847554880, 743703680, 634964736, 522334048, 409629280, 301142176, 198468288, 102261024, 15424301, --58399208, -118443920, -166344624, -202983920, -228296832, -243548272, -251478384, -254185296, -252344368, -246456496, --237761344, -227809360, -217644784, -207521552, -197397776, -187577872, -178339920, -168868448, -157501280, -143418624, --127228208, -109625816, -90643672, -70704288, -51351164, -34363496, -20870320, -11671574, -7842611, -10806138, --21989696, -42191076, -71323840, -109272560, -156607936, -213349280, -277530592, -346465888, -418796896, -493406368, --567116608, -635954752, -698211328, -753866624, -801667456, -839523328, -867368640, -886954240, -899010176, -902935808, --899064448, -889133376, -874578816, -855873728, -833484544, -808545280, -782657920, -757145856, -732274752, -707778944, --684467456, -663835520, -645579200, -627796992, -610332544, -594772992, -580344064, -563827712, -544390336, -523586592, --499708160, -467863136, -426242208, -375602400, -312369216, -230306880, -129177048, -13320841, 116749560, 260566000, -407468928, 542101120, 656437952, 742504256, 780045504, 750219648, 653257024, 490681760, 248766112, -54896660, --315592576, -397934080, -278208128, -86560232, 26632556, 32959042, 5339181, -1480690, 3817152, 1295470, --3219078, -542240, 2632278, 140123, -2107218, 150324, 1763084, -252329, -1420024, 335007, -1135482, -409633, -951335, 375810, 700080, -432181, -585189, 369904, 397821, -374736, --287226, 331786, 177167, -271657, -49392, 255014, 3758, -143345, 130460, }, -}, -{ -{ -585517888, -603768768, 627174208, 672103296, 761459584, 857675968, 888617472, 849407616, 807566592, 792039744, 753588544, -665247488, 586939520, 580662912, 620325888, 642416512, 641460352, 654848832, 684151232, 694853760, 681777728, -678236032, 698247872, 713505216, 696568512, 655880192, 618497280, 599802944, 597858880, 602115776, 602125952, -598339392, 606265216, 640826304, 696614144, 752099776, 792209408, 818164416, 836594112, 849271232, 855984832, -860132160, 867262912, 880720640, 900384576, 923915648, 948425984, 971895296, 993049024, 1009658240, 1018224000, -1016310592, 1004292736, 984205184, 958115904, 928455424, 898594112, 871473024, 847765312, 826018304, 804140800, -779889280, 750238976, 711679296, 662058496, 601978304, 534215008, 462380064, 390642304, 323834624, 266263808, -220085392, 185562992, 162854416, 152585152, 154569968, 167094624, 188017024, 216053504, 250726768, 291603040, -337903328, 388500736, 441990784, 496750016, 550902592, 602529152, 650644608, 696202944, 741374720, 787388864, -833677824, 879251776, 923515136, 964723712, 998794112, 1021126336, 1029023680, 1021009280, 994659136, 947367808, -879430016, 794493248, 696595904, 588685376, 474664768, 360498080, 251361344, 148936048, 53078280, -35200480, --114485040, -185632784, -251139088, -311828032, -366206080, -413158144, -453193152, -486505984, -511755552, -527891744, --535970048, -538049344, -535165280, -527439712, -515578624, -500989696, -484397152, -465294208, -443159552, -418643360, --393136064, -367567072, -342242336, -317726112, -295226912, -275897952, -260195024, -248294736, -240972368, -239713392, --245919088, -260263200, -283061440, -314996128, -356768960, -407775456, -465772032, -528284736, -593519936, -659180864, --721473408, -776672896, -823061248, -860024256, -886102208, -899678592, -901019200, -891726464, -872470016, -843046784, --804458624, -759121536, -709012672, -655144640, -598906368, -542581056, -488293760, -437264704, -390185440, -347831136, --311187008, -280902688, -256568992, -237137488, -222288720, -212319568, -206354384, -202389600, -199712752, -198990128, --199218832, -197380592, -191855648, -182596240, -167102688, -140601120, -101198016, -50129248, 13270375, 90374168, -176566640, 262803680, 343406784, 413509248, 460463456, 469743264, 437460672, 362457664, 232589120, 48323752, --135371456, -227771248, -189644816, -81659680, -712965, 16642998, 4131222, -1096290, 1920924, 1211181, --1720134, -702764, 1472100, 416075, -1187022, -164819, 1025960, 63888, -841277, 14496, -667867, -108448, -586263, 91268, 417686, -167504, -371515, 130997, 248571, -156766, --188979, 143345, 129386, -107911, -42950, 121870, 37581, -40802, 61203, }, -{ -492458816, -349794496, 129527088, -96207264, -288197664, -422264544, -462296864, -379511904, -194033200, 25005300, 207826496, -323443264, 371411584, 352320992, 261544720, 108599856, -70567920, -227162960, -323923200, -346284416, -296182016, --183876672, -29744260, 131055560, 255829184, 313094528, 295361152, 215104848, 93717264, -42967388, -164946064, --244086752, -264142640, -224621424, -137462576, -23976654, 87305408, 168234944, 202542608, 190500048, 142876384, -72989744, -5356361, -77092512, -128115656, -149521776, -139468320, -102299144, -47389596, 12211129, 62995360, -95328408, 105811888, 96282432, 71339944, 36839544, -556198, -34204044, -58991912, -72233296, -73333344, --63195076, -44117904, -19546396, 6851547, 31963146, 53144316, 67774584, 73123432, 66496832, 45960980, -12265353, -28991566, -67493800, -91713656, -93705984, -72288056, -33486250, 11548093, 50563040, 74676056, -80886048, 71364640, 50734300, 23636816, -6165426, -35329328, -59969016, -75204880, -76068704, -59759640, --28084254, 11696807, 48752172, 72719704, 77735152, 64218888, 37776384, 6369974, -22525492, -43672300, --54536956, -54899344, -46179488, -30768072, -11426224, 9098351, 28132572, 42993160, 51108500, 50401440, -39848168, 20178830, -5488432, -31690416, -51811800, -60119880, -53805740, -34228740, -6758668, 20978768, -41781980, 51145544, 48185776, 35227320, 16558710, -3080565, -19743964, -30885646, -35407712, -33469070, --26164940, -15119359, -2183454, 10665478, 21432960, 28376848, 30299920, 26755498, 18218714, 6157373, --7192997, -19282256, -27701466, -30641370, -27364848, -18465676, -5731634, 8220568, 20392504, 28074054, -29621852, 24886114, 15098421, 2502892, -10116795, -20106890, -25608742, -25818660, -20939576, -12112345, --1234266, 9513889, 18153754, 23138600, 23540178, 19303194, 11266236, 916439, -9779104, -18561774, --23449448, -23363012, -18262738, -9059160, 2299418, 13110388, 20908974, 24199994, 22317724, 15349676, -4602595, -7508140, -18427020, -25810606, -27186070, -20816096, -7585449, 8796093, 23526758, 31803160, -29438780, 15509664, -4955856, -23095650, -31586264, -27039504, -9897752, 13072270, 27832998, 22847616, -2806761, -13591961, -13608604, -3265249, 3494493, 2470143, -91268, 244276, 1340567, 833224, -1611, 189515, 360240, -318364, -882079, -673773, -454193, -654446, -615254, -68183, -355945, 403727, 528818, 820339, 833224, 507880, 234076, 67646, -243203, -622233, --778463, -736050, -680752, -548145, -228170, 137976, 404264, 624381, 802085, }, -}, -{ -{ -492458816, -349794496, 129527088, -96207264, -288197664, -422264544, -462296864, -379511904, -194033200, 25005300, 207826496, -323443264, 371411584, 352320992, 261544720, 108599856, -70567920, -227162960, -323923200, -346284416, -296182016, --183876672, -29744260, 131055560, 255829184, 313094528, 295361152, 215104848, 93717264, -42967388, -164946064, --244086752, -264142640, -224621424, -137462576, -23976654, 87305408, 168234944, 202542608, 190500048, 142876384, -72989744, -5356361, -77092512, -128115656, -149521776, -139468320, -102299144, -47389596, 12211129, 62995360, -95328408, 105811888, 96282432, 71339944, 36839544, -556198, -34204044, -58991912, -72233296, -73333344, --63195076, -44117904, -19546396, 6851547, 31963146, 53144316, 67774584, 73123432, 66496832, 45960980, -12265353, -28991566, -67493800, -91713656, -93705984, -72288056, -33486250, 11548093, 50563040, 74676056, -80886048, 71364640, 50734300, 23636816, -6165426, -35329328, -59969016, -75204880, -76068704, -59759640, --28084254, 11696807, 48752172, 72719704, 77735152, 64218888, 37776384, 6369974, -22525492, -43672300, --54536956, -54899344, -46179488, -30768072, -11426224, 9098351, 28132572, 42993160, 51108500, 50401440, -39848168, 20178830, -5488432, -31690416, -51811800, -60119880, -53805740, -34228740, -6758668, 20978768, -41781980, 51145544, 48185776, 35227320, 16558710, -3080565, -19743964, -30885646, -35407712, -33469070, --26164940, -15119359, -2183454, 10665478, 21432960, 28376848, 30299920, 26755498, 18218714, 6157373, --7192997, -19282256, -27701466, -30641370, -27364848, -18465676, -5731634, 8220568, 20392504, 28074054, -29621852, 24886114, 15098421, 2502892, -10116795, -20106890, -25608742, -25818660, -20939576, -12112345, --1234266, 9513889, 18153754, 23138600, 23540178, 19303194, 11266236, 916439, -9779104, -18561774, --23449448, -23363012, -18262738, -9059160, 2299418, 13110388, 20908974, 24199994, 22317724, 15349676, -4602595, -7508140, -18427020, -25810606, -27186070, -20816096, -7585449, 8796093, 23526758, 31803160, -29438780, 15509664, -4955856, -23095650, -31586264, -27039504, -9897752, 13072270, 27832998, 22847616, -2806761, -13591961, -13608604, -3265249, 3494493, 2470143, -91268, 244276, 1340567, 833224, -1611, 189515, 360240, -318364, -882079, -673773, -454193, -654446, -615254, -68183, -355945, 403727, 528818, 820339, 833224, 507880, 234076, 67646, -243203, -622233, --778463, -736050, -680752, -548145, -228170, 137976, 404264, 624381, 802085, }, -{ -585517888, -603768768, 627174208, 672103296, 761459584, 857675968, 888617472, 849407616, 807566592, 792039744, 753588544, -665247488, 586939520, 580662912, 620325888, 642416512, 641460352, 654848832, 684151232, 694853760, 681777728, -678236032, 698247872, 713505216, 696568512, 655880192, 618497280, 599802944, 597858880, 602115776, 602125952, -598339392, 606265216, 640826304, 696614144, 752099776, 792209408, 818164416, 836594112, 849271232, 855984832, -860132160, 867262912, 880720640, 900384576, 923915648, 948425984, 971895296, 993049024, 1009658240, 1018224000, -1016310592, 1004292736, 984205184, 958115904, 928455424, 898594112, 871473024, 847765312, 826018304, 804140800, -779889280, 750238976, 711679296, 662058496, 601978304, 534215008, 462380064, 390642304, 323834624, 266263808, -220085392, 185562992, 162854416, 152585152, 154569968, 167094624, 188017024, 216053504, 250726768, 291603040, -337903328, 388500736, 441990784, 496750016, 550902592, 602529152, 650644608, 696202944, 741374720, 787388864, -833677824, 879251776, 923515136, 964723712, 998794112, 1021126336, 1029023680, 1021009280, 994659136, 947367808, -879430016, 794493248, 696595904, 588685376, 474664768, 360498080, 251361344, 148936048, 53078280, -35200480, --114485040, -185632784, -251139088, -311828032, -366206080, -413158144, -453193152, -486505984, -511755552, -527891744, --535970048, -538049344, -535165280, -527439712, -515578624, -500989696, -484397152, -465294208, -443159552, -418643360, --393136064, -367567072, -342242336, -317726112, -295226912, -275897952, -260195024, -248294736, -240972368, -239713392, --245919088, -260263200, -283061440, -314996128, -356768960, -407775456, -465772032, -528284736, -593519936, -659180864, --721473408, -776672896, -823061248, -860024256, -886102208, -899678592, -901019200, -891726464, -872470016, -843046784, --804458624, -759121536, -709012672, -655144640, -598906368, -542581056, -488293760, -437264704, -390185440, -347831136, --311187008, -280902688, -256568992, -237137488, -222288720, -212319568, -206354384, -202389600, -199712752, -198990128, --199218832, -197380592, -191855648, -182596240, -167102688, -140601120, -101198016, -50129248, 13270375, 90374168, -176566640, 262803680, 343406784, 413509248, 460463456, 469743264, 437460672, 362457664, 232589120, 48323752, --135371456, -227771248, -189644816, -81659680, -712965, 16642998, 4131222, -1096290, 1920924, 1211181, --1720134, -702764, 1472100, 416075, -1187022, -164819, 1025960, 63888, -841277, 14496, -667867, -108448, -586263, 91268, 417686, -167504, -371515, 130997, 248571, -156766, --188979, 143345, 129386, -107911, -42950, 121870, 37581, -40802, 61203, }, -}, -{ -{ -597213568, -596643456, 589774720, 572423040, 546464256, 513296896, 469925248, 426302880, 420621728, 490009600, 619773440, -746362240, 818147776, 830061504, 797643584, 733486464, 660355520, 611384320, 598772160, 608339712, 634336576, -687962496, 761336640, 817412288, 830826496, 811578624, 779512960, 745057664, 723017984, 733358144, 775793472, -828397184, 878846976, 933033856, 988564032, 1026026368, 1033997248, 1021642816, 1001205760, 976111296, 949339712, -926577472, 907651712, 887279552, 865113280, 845489024, 829484352, 815743680, 805347200, 798338304, 790169856, -778097728, 766046080, 758030080, 752204480, 745350784, 737406720, 728103232, 714701376, 696160000, 675283200, -654903040, 635414656, 616550080, 598197696, 579157568, 557310144, 530734464, 497799584, 457844064, 412453216, -364070944, 313385504, 260460240, 207604768, 157896416, 111621368, 67432600, 26114474, -9955734, -40010840, --64545844, -82950848, -94379760, -100110320, -102734008, -103747080, -103519448, -102710384, -102403832, -103430864, --106081400, -109889960, -113784424, -117140400, -120256936, -123273080, -125650880, -127430072, -129705328, -133059160, --136775920, -140245184, -143737520, -147170272, -149432112, -149540560, -147397904, -143076640, -136364672, -127245384, --116070952, -103235448, -89156008, -74332464, -59030032, -43270720, -27318676, -11630235, 3788161, 19364396, -35270808, 51383380, 67845448, 85084376, 103357848, 122716344, 143190448, 164647568, 186708128, 208921168, -230610208, 250557120, 267457280, 280695968, 290074560, 294978368, 294679840, 289356768, 279864896, 266521504, -249057632, 227865200, 204276704, 179287504, 152854672, 124924496, 96344168, 68000072, 39594228, 10161356, --20476794, -51754892, -83805552, -117771224, -154393344, -193238096, -233857216, -276860032, -323067456, -372146016, --422997376, -475317600, -529790656, -586465408, -643890240, -700616000, -756673408, -812224512, -865455744, -913745152, --956444672, -993991808, -1024540800, -1044644480, -1053249984, -1051286144, -1037245888, -1007591808, -961676992, -901270464, --825239296, -730415040, -617438080, -489367488, -345486080, -184001760, -9601399, 169511088, 349013344, 523518400, -678688576, 799189824, 878520512, 909441600, 875318080, 766932416, 594697792, 366670496, 80809272, -222708016, --426628768, -421689024, -237979312, -36925980, 50219440, 34310348, 3150359, -520765, 4166655, 107911, --3273302, 406948, 2525441, -611496, -1940788, 715649, 1552094, -683974, -1200443, 656593, -932545, -623307, -751082, 527744, 540629, -506269, -441845, 405874, 294742, -368293, --213675, 300648, 132070, -231928, -41339, 200790, 8590, -107374, 91805, }, -{ -579569344, -535923328, 456493280, 339312096, 191848672, 66356708, 32766306, 103828152, 212905280, 270114240, 223526736, -80593984, -96322696, -222835248, -256390224, -230623632, -209125712, -218933808, -251325920, -302965920, -374807840, --441093664, -461958080, -430899584, -381811328, -347154688, -331162368, -322570848, -310652288, -285347968, -238625168, --171585552, -93660352, -15587510, 52657908, 103282688, 137355200, 165996720, 199463648, 238056608, 275797024, -307733856, 331415232, 346436352, 355098784, 360181312, 361320576, 356328192, 345073792, 328951552, 307940032, -281095424, 248241056, 208854064, 161546064, 106783088, 47956532, -11725798, -71075264, -128828080, -182525376, --230390640, -271964320, -306472224, -332878752, -351642944, -364130016, -370140288, -367786112, -355681824, -333905248, --303412064, -265913232, -223840816, -179236496, -132854072, -84868552, -35997732, 12401718, 58838368, 102022120, -140978000, 174821808, 202405168, 222608160, 235105968, 240408640, 239242032, 232475840, 221377648, 207077552, -189982512, 170418400, 149442320, 128243432, 107248552, 86594056, 66920960, 48932024, 32751810, 18377628, -6179921, -3654480, -11619497, -18376554, -24261196, -29586420, -34911104, -40721120, -47217260, -54525684, --62832688, -72317584, -83130704, -95292440, -108497856, -122208464, -135885248, -148858192, -160160400, -168929648, --174782080, -177386976, -176042656, -170148880, -159679904, -144694224, -124912680, -100323992, -71671192, -39765492, --4875325, 32683090, 71931576, 111755584, 151444848, 190155376, 226390416, 258580656, 285708736, 306818496, -320383616, 324775776, 319060768, 302832224, 275651008, 237360288, 188829840, 131817912, 68225552, 119722, --69640744, -137617728, -200805296, -256893264, -303624128, -338806336, -361185824, -370585888, -367052736, -350678720, --322384544, -283973568, -237179904, -183409056, -124464928, -62643172, 13422, 61794916, 120655832, 174232864, -220522416, 257989024, 285203008, 300952640, 304579744, 295920576, 275240288, 243384528, 201620800, 151448592, -94955288, 34892316, -26127896, -85768888, -140812112, -187124752, -221358864, -241145776, -243458608, -225485776, --187893008, -134548448, -69194072, 3423626, 73443944, 128780840, 162185488, 168736912, 138974400, 69362648, --16011101, -71099424, -69478072, -32066226, -1396938, 4179540, -1872069, -3814468, -2048163, -2362769, --3785477, -3195456, -1980517, -2334315, -2949032, -2248952, -1418950, -1617055, -1794223, -1104880, --477278, -527207, -454193, 172872, 659278, 707059, 900869, 1422171, 1777043, 1865090, -2081449, 2456185, 2674691, 2752000, 2915746, 3112778, 3192235, 3227131, 3289408, }, -}, -{ -{ -579569344, -535923328, 456493280, 339312096, 191848672, 66356708, 32766306, 103828152, 212905280, 270114240, 223526736, -80593984, -96322696, -222835248, -256390224, -230623632, -209125712, -218933808, -251325920, -302965920, -374807840, --441093664, -461958080, -430899584, -381811328, -347154688, -331162368, -322570848, -310652288, -285347968, -238625168, --171585552, -93660352, -15587510, 52657908, 103282688, 137355200, 165996720, 199463648, 238056608, 275797024, -307733856, 331415232, 346436352, 355098784, 360181312, 361320576, 356328192, 345073792, 328951552, 307940032, -281095424, 248241056, 208854064, 161546064, 106783088, 47956532, -11725798, -71075264, -128828080, -182525376, --230390640, -271964320, -306472224, -332878752, -351642944, -364130016, -370140288, -367786112, -355681824, -333905248, --303412064, -265913232, -223840816, -179236496, -132854072, -84868552, -35997732, 12401718, 58838368, 102022120, -140978000, 174821808, 202405168, 222608160, 235105968, 240408640, 239242032, 232475840, 221377648, 207077552, -189982512, 170418400, 149442320, 128243432, 107248552, 86594056, 66920960, 48932024, 32751810, 18377628, -6179921, -3654480, -11619497, -18376554, -24261196, -29586420, -34911104, -40721120, -47217260, -54525684, --62832688, -72317584, -83130704, -95292440, -108497856, -122208464, -135885248, -148858192, -160160400, -168929648, --174782080, -177386976, -176042656, -170148880, -159679904, -144694224, -124912680, -100323992, -71671192, -39765492, --4875325, 32683090, 71931576, 111755584, 151444848, 190155376, 226390416, 258580656, 285708736, 306818496, -320383616, 324775776, 319060768, 302832224, 275651008, 237360288, 188829840, 131817912, 68225552, 119722, --69640744, -137617728, -200805296, -256893264, -303624128, -338806336, -361185824, -370585888, -367052736, -350678720, --322384544, -283973568, -237179904, -183409056, -124464928, -62643172, 13422, 61794916, 120655832, 174232864, -220522416, 257989024, 285203008, 300952640, 304579744, 295920576, 275240288, 243384528, 201620800, 151448592, -94955288, 34892316, -26127896, -85768888, -140812112, -187124752, -221358864, -241145776, -243458608, -225485776, --187893008, -134548448, -69194072, 3423626, 73443944, 128780840, 162185488, 168736912, 138974400, 69362648, --16011101, -71099424, -69478072, -32066226, -1396938, 4179540, -1872069, -3814468, -2048163, -2362769, --3785477, -3195456, -1980517, -2334315, -2949032, -2248952, -1418950, -1617055, -1794223, -1104880, --477278, -527207, -454193, 172872, 659278, 707059, 900869, 1422171, 1777043, 1865090, -2081449, 2456185, 2674691, 2752000, 2915746, 3112778, 3192235, 3227131, 3289408, }, -{ -597213568, -596643456, 589774720, 572423040, 546464256, 513296896, 469925248, 426302880, 420621728, 490009600, 619773440, -746362240, 818147776, 830061504, 797643584, 733486464, 660355520, 611384320, 598772160, 608339712, 634336576, -687962496, 761336640, 817412288, 830826496, 811578624, 779512960, 745057664, 723017984, 733358144, 775793472, -828397184, 878846976, 933033856, 988564032, 1026026368, 1033997248, 1021642816, 1001205760, 976111296, 949339712, -926577472, 907651712, 887279552, 865113280, 845489024, 829484352, 815743680, 805347200, 798338304, 790169856, -778097728, 766046080, 758030080, 752204480, 745350784, 737406720, 728103232, 714701376, 696160000, 675283200, -654903040, 635414656, 616550080, 598197696, 579157568, 557310144, 530734464, 497799584, 457844064, 412453216, -364070944, 313385504, 260460240, 207604768, 157896416, 111621368, 67432600, 26114474, -9955734, -40010840, --64545844, -82950848, -94379760, -100110320, -102734008, -103747080, -103519448, -102710384, -102403832, -103430864, --106081400, -109889960, -113784424, -117140400, -120256936, -123273080, -125650880, -127430072, -129705328, -133059160, --136775920, -140245184, -143737520, -147170272, -149432112, -149540560, -147397904, -143076640, -136364672, -127245384, --116070952, -103235448, -89156008, -74332464, -59030032, -43270720, -27318676, -11630235, 3788161, 19364396, -35270808, 51383380, 67845448, 85084376, 103357848, 122716344, 143190448, 164647568, 186708128, 208921168, -230610208, 250557120, 267457280, 280695968, 290074560, 294978368, 294679840, 289356768, 279864896, 266521504, -249057632, 227865200, 204276704, 179287504, 152854672, 124924496, 96344168, 68000072, 39594228, 10161356, --20476794, -51754892, -83805552, -117771224, -154393344, -193238096, -233857216, -276860032, -323067456, -372146016, --422997376, -475317600, -529790656, -586465408, -643890240, -700616000, -756673408, -812224512, -865455744, -913745152, --956444672, -993991808, -1024540800, -1044644480, -1053249984, -1051286144, -1037245888, -1007591808, -961676992, -901270464, --825239296, -730415040, -617438080, -489367488, -345486080, -184001760, -9601399, 169511088, 349013344, 523518400, -678688576, 799189824, 878520512, 909441600, 875318080, 766932416, 594697792, 366670496, 80809272, -222708016, --426628768, -421689024, -237979312, -36925980, 50219440, 34310348, 3150359, -520765, 4166655, 107911, --3273302, 406948, 2525441, -611496, -1940788, 715649, 1552094, -683974, -1200443, 656593, -932545, -623307, -751082, 527744, 540629, -506269, -441845, 405874, 294742, -368293, --213675, 300648, 132070, -231928, -41339, 200790, 8590, -107374, 91805, }, -}, -{ -{ -577258624, -576715840, 589559424, 634232448, 698922688, 728686848, 684827712, 605792256, 564653952, 574836800, 588651584, -585370752, 601567104, 661806144, 733112256, 772729600, 780550720, 777879232, 765676736, 732168960, 682062848, -633115776, 593396992, 558773120, 526239264, 497608480, 473712896, 452478016, 431136864, 408102976, 385196288, -367728128, 358867616, 354917856, 349517472, 341043488, 333114976, 330029056, 334360512, 346667200, 364892384, -385567264, 406968544, 429555776, 453146432, 475951648, 496440224, 513792448, 526557632, 533109056, 533698016, -530780640, 527621152, 527320512, 532114240, 542515008, 557551744, 575819264, 595270656, 612548800, 624400192, -629702848, 628770304, 621445248, 607733056, 589560512, 569769856, 549599040, 528701344, 507052576, 485115488, -462446656, 437741984, 410362656, 380882528, 350196064, 318906688, 287777856, 258289136, 232238016, 210521040, -192472512, 176729856, 162499552, 149450368, 136906384, 124364536, 112801944, 104405824, 100885560, 102829568, -110493400, 124145496, 143568416, 168067968, 197059536, 230199504, 267108304, 307226528, 349479328, 391873344, -432042048, 468332352, 499699584, 524740320, 541990528, 551234368, 553277696, 548283200, 535577056, 515299968, -488932640, 457753856, 421960128, 381905280, 339214368, 295833600, 252551056, 209267456, 166404208, 125076960, -85714128, 47379932, 9058623, -29046864, -66327716, -103271416, -140889952, -178859088, -215597696, -250224256, --282999680, -313612608, -340509824, -362547840, -380093856, -393859776, -403703296, -409354400, -411566848, -411762816, --410889856, -409194944, -406989504, -405171648, -404765760, -406089696, -408785312, -412814016, -418855936, -427302016, --437474624, -448574976, -460808640, -474671744, -489646688, -504675840, -519564352, -534837248, -550401664, -565369088, --579182784, -592082688, -604251456, -615084416, -623628736, -629501568, -632924096, -633715456, -630808320, -623335040, --611626432, -596118400, -575879424, -549629632, -517612800, -480661056, -438062496, -388580192, -332951232, -272879680, --208295712, -138401568, -64546916, 10955925, 87666192, 165303088, 240628224, 309478176, 369945408, 419880832, -454019904, 467810528, 460804896, 432175712, 378043008, 298507744, 200767712, 89689120, -32957432, -147629296, --208934592, -183362352, -94947768, -11396159, 21154862, 13571023, 1598802, 219580, 1552094, -166967, --1190780, 297963, 907849, -333934, -683974, 361314, 556198, -324270, -425739, 303332, -326954, -289910, -272194, 236760, 183073, -237834, -159451, 185757, 95026, -176094, --68183, 146029, 36507, -114354, 5369, 108448, -10737, -59056, 63351, }, -{ -515484128, -438002368, 285437632, 87102472, -95549600, -207499536, -246394224, -259768752, -290284480, -329814304, -334158112, --277309920, -179602640, -81671488, -2548526, 68614248, 145949968, 223177232, 277775392, 292139904, 267355264, -219215136, 163913664, 107111112, 45060648, -25191594, -98342936, -163622144, -212229360, -239572208, -242371984, --218386208, -170373840, -107468136, -40647032, 22208202, 76519136, 118805240, 146478256, 159197264, 158901440, -148381456, 130218040, 106511432, 78693464, 47551192, 13783624, -21502216, -56903484, -90858960, -121219008, --144781200, -157715488, -156839328, -140899088, -111030272, -70184600, -22074522, 29413546, 80016312, 124801552, -158639984, 177334368, 178578304, 162241312, 130077920, 85197120, 31552440, -26269630, -82910584, -132101920, --167161744, -182411552, -175011872, -146204976, -101226472, -47990352, 4851703, 49933288, 82761336, 102251360, -109926464, 108391552, 100088848, 86803440, 69654704, 49291728, 26264798, 1508070, -23351200, -46049028, --64142116, -75698800, -79888000, -77085536, -68492920, -55634320, -40024264, -22984518, -5550709, 11476153, -27378806, 41423884, 52866216, 60949344, 64928632, 64188824, 58415852, 47712792, 32670206, 14405320, --5500780, -25198574, -42783244, -56484724, -64899640, -67242008, -63444720, -54072028, -40175124, -23145042, --4522064, 14173929, 31491774, 46041512, 56548612, 61957052, 61529164, 55007792, 42856796, 26371636, -7527467, -11340861, -27921582, -40336184, -47478716, -49118320, -45780056, -38537132, -28769302, -17866528, --6992744, 2981781, 11478837, 18216030, 23148264, 26322244, 27794880, 27651536, 25996900, 22894860, -18408766, 12705050, 6067178, -1148904, -8491150, -15392626, -21266530, -25612500, -28012314, -28146532, --25897042, -21394306, -14951318, -7052337, 1611150, 10235444, 18057654, 24388434, 28619514, 30362198, -29501056, 26049514, 20122996, 12118250, 2699387, -7464653, -17680770, -26953604, -34088080, -38085084, --38092064, -33202782, -22987202, -8251169, 9140227, 26823682, 41736344, 50129784, 49140868, 38405060, -19730542, -3705483, -26817238, -42991012, -47351476, -39288752, -21038360, 3487514, 26129508, 34982508, -24200530, 2942053, -11587822, -11480984, -4002910, 411780, 44023, -694174, 86436, 687732, -409633, 424128, 1004486, 1205812, 898185, 817654, 995896, 848793, 416075, 180926, -95563, -194884, -587337, -776315, -840740, -990527, -1120987, -1066226, -919123, -800475, --636192, -364535, -71941, 179315, 426812, 675921, 872952, 997506, 1061931, }, -}, -{ -{ -515484128, -438002368, 285437632, 87102472, -95549600, -207499536, -246394224, -259768752, -290284480, -329814304, -334158112, --277309920, -179602640, -81671488, -2548526, 68614248, 145949968, 223177232, 277775392, 292139904, 267355264, -219215136, 163913664, 107111112, 45060648, -25191594, -98342936, -163622144, -212229360, -239572208, -242371984, --218386208, -170373840, -107468136, -40647032, 22208202, 76519136, 118805240, 146478256, 159197264, 158901440, -148381456, 130218040, 106511432, 78693464, 47551192, 13783624, -21502216, -56903484, -90858960, -121219008, --144781200, -157715488, -156839328, -140899088, -111030272, -70184600, -22074522, 29413546, 80016312, 124801552, -158639984, 177334368, 178578304, 162241312, 130077920, 85197120, 31552440, -26269630, -82910584, -132101920, --167161744, -182411552, -175011872, -146204976, -101226472, -47990352, 4851703, 49933288, 82761336, 102251360, -109926464, 108391552, 100088848, 86803440, 69654704, 49291728, 26264798, 1508070, -23351200, -46049028, --64142116, -75698800, -79888000, -77085536, -68492920, -55634320, -40024264, -22984518, -5550709, 11476153, -27378806, 41423884, 52866216, 60949344, 64928632, 64188824, 58415852, 47712792, 32670206, 14405320, --5500780, -25198574, -42783244, -56484724, -64899640, -67242008, -63444720, -54072028, -40175124, -23145042, --4522064, 14173929, 31491774, 46041512, 56548612, 61957052, 61529164, 55007792, 42856796, 26371636, -7527467, -11340861, -27921582, -40336184, -47478716, -49118320, -45780056, -38537132, -28769302, -17866528, --6992744, 2981781, 11478837, 18216030, 23148264, 26322244, 27794880, 27651536, 25996900, 22894860, -18408766, 12705050, 6067178, -1148904, -8491150, -15392626, -21266530, -25612500, -28012314, -28146532, --25897042, -21394306, -14951318, -7052337, 1611150, 10235444, 18057654, 24388434, 28619514, 30362198, -29501056, 26049514, 20122996, 12118250, 2699387, -7464653, -17680770, -26953604, -34088080, -38085084, --38092064, -33202782, -22987202, -8251169, 9140227, 26823682, 41736344, 50129784, 49140868, 38405060, -19730542, -3705483, -26817238, -42991012, -47351476, -39288752, -21038360, 3487514, 26129508, 34982508, -24200530, 2942053, -11587822, -11480984, -4002910, 411780, 44023, -694174, 86436, 687732, -409633, 424128, 1004486, 1205812, 898185, 817654, 995896, 848793, 416075, 180926, -95563, -194884, -587337, -776315, -840740, -990527, -1120987, -1066226, -919123, -800475, --636192, -364535, -71941, 179315, 426812, 675921, 872952, 997506, 1061931, }, -{ -577258624, -576715840, 589559424, 634232448, 698922688, 728686848, 684827712, 605792256, 564653952, 574836800, 588651584, -585370752, 601567104, 661806144, 733112256, 772729600, 780550720, 777879232, 765676736, 732168960, 682062848, -633115776, 593396992, 558773120, 526239264, 497608480, 473712896, 452478016, 431136864, 408102976, 385196288, -367728128, 358867616, 354917856, 349517472, 341043488, 333114976, 330029056, 334360512, 346667200, 364892384, -385567264, 406968544, 429555776, 453146432, 475951648, 496440224, 513792448, 526557632, 533109056, 533698016, -530780640, 527621152, 527320512, 532114240, 542515008, 557551744, 575819264, 595270656, 612548800, 624400192, -629702848, 628770304, 621445248, 607733056, 589560512, 569769856, 549599040, 528701344, 507052576, 485115488, -462446656, 437741984, 410362656, 380882528, 350196064, 318906688, 287777856, 258289136, 232238016, 210521040, -192472512, 176729856, 162499552, 149450368, 136906384, 124364536, 112801944, 104405824, 100885560, 102829568, -110493400, 124145496, 143568416, 168067968, 197059536, 230199504, 267108304, 307226528, 349479328, 391873344, -432042048, 468332352, 499699584, 524740320, 541990528, 551234368, 553277696, 548283200, 535577056, 515299968, -488932640, 457753856, 421960128, 381905280, 339214368, 295833600, 252551056, 209267456, 166404208, 125076960, -85714128, 47379932, 9058623, -29046864, -66327716, -103271416, -140889952, -178859088, -215597696, -250224256, --282999680, -313612608, -340509824, -362547840, -380093856, -393859776, -403703296, -409354400, -411566848, -411762816, --410889856, -409194944, -406989504, -405171648, -404765760, -406089696, -408785312, -412814016, -418855936, -427302016, --437474624, -448574976, -460808640, -474671744, -489646688, -504675840, -519564352, -534837248, -550401664, -565369088, --579182784, -592082688, -604251456, -615084416, -623628736, -629501568, -632924096, -633715456, -630808320, -623335040, --611626432, -596118400, -575879424, -549629632, -517612800, -480661056, -438062496, -388580192, -332951232, -272879680, --208295712, -138401568, -64546916, 10955925, 87666192, 165303088, 240628224, 309478176, 369945408, 419880832, -454019904, 467810528, 460804896, 432175712, 378043008, 298507744, 200767712, 89689120, -32957432, -147629296, --208934592, -183362352, -94947768, -11396159, 21154862, 13571023, 1598802, 219580, 1552094, -166967, --1190780, 297963, 907849, -333934, -683974, 361314, 556198, -324270, -425739, 303332, -326954, -289910, -272194, 236760, 183073, -237834, -159451, 185757, 95026, -176094, --68183, 146029, 36507, -114354, 5369, 108448, -10737, -59056, 63351, }, -}, -{ -{ -548208576, -544875648, 556473152, 595631424, 646513920, 673311808, 656640896, 613493120, 573444160, 545771136, 523946272, -512668224, 528104896, 570986368, 619035776, 651238912, 664630592, 662498176, 642140544, 604135488, 562161856, -531653600, 513580928, 497497888, 476482048, 451859008, 426314688, 399838368, 372339296, 345038336, 318229152, -290570112, 261266080, 231251776, 202268800, 176573088, 157658592, 149259776, 152462208, 164561664, 181516048, -200835888, 221446368, 241784640, 259613056, 273704320, 284568960, 293368800, 300983776, 308247104, 316196576, -325680384, 336977760, 349679584, 362544096, 373749120, 381757088, 385728320, 385028256, 379138240, 368555968, -354957568, 339719040, 322804384, 303550048, 281759520, 257424240, 230248896, 200429488, 169588928, 140275776, -114747568, 94497336, 80372256, 72387912, 69433512, 69580080, 70905080, 72181224, 73050952, 73737608, -74635256, 76160504, 78805136, 83034064, 89080304, 97012040, 106988176, 119291640, 134152768, 151717568, -172148192, 195655088, 222447088, 252568240, 285544992, 320244032, 355295264, 389456352, 421268640, 448819264, -470615680, 486550016, 497294400, 502999200, 503384672, 498815360, 490098720, 477141888, 458903296, 434948640, -406098272, 373242848, 336539136, 296369376, 254260992, 212019984, 170402288, 129428840, 89707368, 52514028, -18496276, -12868259, -42181948, -69283728, -94063008, -117452320, -140713872, -164041440, -186702768, -208308592, --228934640, -248002144, -264098608, -276266240, -284733792, -290072960, -292338560, -291486560, -288102112, -283189216, --277436640, -271084928, -264461008, -258339056, -253602256, -250668784, -249504848, -250273648, -253578624, -259806336, --268593312, -279387616, -292212928, -307295232, -324187360, -341960992, -360170048, -378949792, -398132736, -416920000, --434612576, -451133696, -466487680, -480054400, -490873952, -498532960, -503238624, -504890592, -502673312, -495979072, --485127840, -470478240, -451429504, -427278912, -398506944, -365985984, -329454048, -288222912, -242872352, -194613024, --143526528, -89254792, -32881732, 23790360, 80102752, 135577088, 187954752, 234388176, 273482048, 303914560, -322653504, 327144960, 317413664, 293490688, 253710704, 198723840, 133334576, 60891900, -17351668, -89882928, --129710696, -116388248, -63574104, -11751031, 10314901, 7651484, 1107565, 191126, 886374, -95563, --682900, 167504, 525060, -182536, -388695, 207232, 321049, -182536, -245350, 169114, -184684, -166967, -160524, 128312, 100932, -136902, -95026, 100395, 53150, -98247, --40265, 80531, 23622, -60130, 4295, 62277, 0, -26844, 38118, }, -{ -500830240, -459700000, 365290720, 223673840, 79591112, -12800076, -46884400, -72271416, -131517264, -207050176, -253433680, --264418048, -274940192, -304089056, -331065216, -330414528, -300650400, -250105072, -180549152, -97373888, -17135846, -48171280, 102873056, 155102000, 202770240, 239229136, 263950976, 280074816, 286780320, 279620096, 255321312, -213867360, 159070016, 98352064, 38867844, -16834662, -69041064, -115651656, -151848576, -174539424, -184535424, --184808144, -178791440, -169817632, -160143760, -150425328, -140704736, -130871408, -119393648, -102829032, -77734616, --42771432, 861678, 49697068, 98473400, 141868144, 176802336, 202836816, 220397856, 229242272, 228382208, -216517888, 192473584, 156089312, 109163576, 55341728, -993748, -55795384, -105952008, -149571696, -185756256, --213678912, -231680736, -237370496, -228723120, -205311248, -168948448, -123544736, -74185896, -25676926, 18674518, -57234196, 89338008, 114706768, 133451080, 146092240, 153200944, 155143888, 152306512, 145243440, 134385232, -119815632, 101499744, 79442936, 53550724, 23803782, -9089761, -43452720, -77154256, -108082856, -134136120, --153368448, -164484896, -166966848, -160689760, -145835616, -123247304, -94430224, -61100740, -25034290, 11703786, -46866684, 78484088, 104971688, 124940064, 137357888, 141914848, 138936288, 129008472, 112964080, 92061016, -67778880, 41452876, 14324253, -12225624, -36784248, -58154396, -75314936, -87332792, -93628136, -94261648, --89822800, -81178104, -69453376, -56011744, -42142756, -28752658, -16386374, -5359046, 4293357, 12834973, -20619602, 27886686, 34779036, 41381472, 47594680, 53053048, 57246544, 59666224, 59808492, 57193932, -51528332, 42825656, 31368294, 17646946, 2381023, -13491566, -28950228, -43017856, -54792508, -63472100, --68468224, -69502768, -66583804, -59929828, -49961744, -37337224, -22892176, -7493108, 8032126, 22838488, -36083092, 47083580, 55367496, 60529512, 62212064, 60317984, 55040544, 46573552, 35052840, 20901458, -4920959, -12059194, -29173566, -45003204, -57619132, -65364032, -67100812, -61773440, -48815524, -29346974, --6101538, 17914846, 39580272, 54831164, 59880972, 53787488, 38157028, 14897631, -12156905, -33443300, --37562712, -23103166, -2974802, 7738458, 6340983, 1333051, -418222, 242129, 268435, -290447, --146566, 301721, 176094, -116501, 54224, 310311, 185757, 17717, 149787, 287226, -174483, 65498, 147640, 206695, 107374, 28991, 68719, 79457, -3221, -60666, --47782, -57982, -118648, -155693, -150324, -161061, -197569, -210453, -195958, }, -}, -{ -{ -500830240, -459700000, 365290720, 223673840, 79591112, -12800076, -46884400, -72271416, -131517264, -207050176, -253433680, --264418048, -274940192, -304089056, -331065216, -330414528, -300650400, -250105072, -180549152, -97373888, -17135846, -48171280, 102873056, 155102000, 202770240, 239229136, 263950976, 280074816, 286780320, 279620096, 255321312, -213867360, 159070016, 98352064, 38867844, -16834662, -69041064, -115651656, -151848576, -174539424, -184535424, --184808144, -178791440, -169817632, -160143760, -150425328, -140704736, -130871408, -119393648, -102829032, -77734616, --42771432, 861678, 49697068, 98473400, 141868144, 176802336, 202836816, 220397856, 229242272, 228382208, -216517888, 192473584, 156089312, 109163576, 55341728, -993748, -55795384, -105952008, -149571696, -185756256, --213678912, -231680736, -237370496, -228723120, -205311248, -168948448, -123544736, -74185896, -25676926, 18674518, -57234196, 89338008, 114706768, 133451080, 146092240, 153200944, 155143888, 152306512, 145243440, 134385232, -119815632, 101499744, 79442936, 53550724, 23803782, -9089761, -43452720, -77154256, -108082856, -134136120, --153368448, -164484896, -166966848, -160689760, -145835616, -123247304, -94430224, -61100740, -25034290, 11703786, -46866684, 78484088, 104971688, 124940064, 137357888, 141914848, 138936288, 129008472, 112964080, 92061016, -67778880, 41452876, 14324253, -12225624, -36784248, -58154396, -75314936, -87332792, -93628136, -94261648, --89822800, -81178104, -69453376, -56011744, -42142756, -28752658, -16386374, -5359046, 4293357, 12834973, -20619602, 27886686, 34779036, 41381472, 47594680, 53053048, 57246544, 59666224, 59808492, 57193932, -51528332, 42825656, 31368294, 17646946, 2381023, -13491566, -28950228, -43017856, -54792508, -63472100, --68468224, -69502768, -66583804, -59929828, -49961744, -37337224, -22892176, -7493108, 8032126, 22838488, -36083092, 47083580, 55367496, 60529512, 62212064, 60317984, 55040544, 46573552, 35052840, 20901458, -4920959, -12059194, -29173566, -45003204, -57619132, -65364032, -67100812, -61773440, -48815524, -29346974, --6101538, 17914846, 39580272, 54831164, 59880972, 53787488, 38157028, 14897631, -12156905, -33443300, --37562712, -23103166, -2974802, 7738458, 6340983, 1333051, -418222, 242129, 268435, -290447, --146566, 301721, 176094, -116501, 54224, 310311, 185757, 17717, 149787, 287226, -174483, 65498, 147640, 206695, 107374, 28991, 68719, 79457, -3221, -60666, --47782, -57982, -118648, -155693, -150324, -161061, -197569, -210453, -195958, }, -{ -548208576, -544875648, 556473152, 595631424, 646513920, 673311808, 656640896, 613493120, 573444160, 545771136, 523946272, -512668224, 528104896, 570986368, 619035776, 651238912, 664630592, 662498176, 642140544, 604135488, 562161856, -531653600, 513580928, 497497888, 476482048, 451859008, 426314688, 399838368, 372339296, 345038336, 318229152, -290570112, 261266080, 231251776, 202268800, 176573088, 157658592, 149259776, 152462208, 164561664, 181516048, -200835888, 221446368, 241784640, 259613056, 273704320, 284568960, 293368800, 300983776, 308247104, 316196576, -325680384, 336977760, 349679584, 362544096, 373749120, 381757088, 385728320, 385028256, 379138240, 368555968, -354957568, 339719040, 322804384, 303550048, 281759520, 257424240, 230248896, 200429488, 169588928, 140275776, -114747568, 94497336, 80372256, 72387912, 69433512, 69580080, 70905080, 72181224, 73050952, 73737608, -74635256, 76160504, 78805136, 83034064, 89080304, 97012040, 106988176, 119291640, 134152768, 151717568, -172148192, 195655088, 222447088, 252568240, 285544992, 320244032, 355295264, 389456352, 421268640, 448819264, -470615680, 486550016, 497294400, 502999200, 503384672, 498815360, 490098720, 477141888, 458903296, 434948640, -406098272, 373242848, 336539136, 296369376, 254260992, 212019984, 170402288, 129428840, 89707368, 52514028, -18496276, -12868259, -42181948, -69283728, -94063008, -117452320, -140713872, -164041440, -186702768, -208308592, --228934640, -248002144, -264098608, -276266240, -284733792, -290072960, -292338560, -291486560, -288102112, -283189216, --277436640, -271084928, -264461008, -258339056, -253602256, -250668784, -249504848, -250273648, -253578624, -259806336, --268593312, -279387616, -292212928, -307295232, -324187360, -341960992, -360170048, -378949792, -398132736, -416920000, --434612576, -451133696, -466487680, -480054400, -490873952, -498532960, -503238624, -504890592, -502673312, -495979072, --485127840, -470478240, -451429504, -427278912, -398506944, -365985984, -329454048, -288222912, -242872352, -194613024, --143526528, -89254792, -32881732, 23790360, 80102752, 135577088, 187954752, 234388176, 273482048, 303914560, -322653504, 327144960, 317413664, 293490688, 253710704, 198723840, 133334576, 60891900, -17351668, -89882928, --129710696, -116388248, -63574104, -11751031, 10314901, 7651484, 1107565, 191126, 886374, -95563, --682900, 167504, 525060, -182536, -388695, 207232, 321049, -182536, -245350, 169114, -184684, -166967, -160524, 128312, 100932, -136902, -95026, 100395, 53150, -98247, --40265, 80531, 23622, -60130, 4295, 62277, 0, -26844, 38118, }, -}, -}; -const Word32 CRendBin_Combined_HRIR_coeff_im_48kHz_fx[15][BINAURAL_CHANNELS][240] ={ -{ -{ -11671574, -33428268, 48048336, 42938400, 10669236, -23849416, -20741470, 7692824, -3387119, -60983168, -61801896, -75895296, 273056832, 373722816, 342877984, 285016704, 275532896, 274483296, 221783520, 125141392, 18176302, --95674688, -211587264, -285864960, -277180544, -200371504, -107004816, -29242822, 34718904, 94131728, 145453904, -173212816, 159637488, 97118336, -2741800, -114900576, -218103808, -305466112, -380638784, -447978496, -505954112, --547699072, -568476480, -572700096, -571630080, -574870080, -586484736, -606955648, -633760512, -660538560, -680332480, --690672640, -693753728, -692721856, -689765824, -686531200, -684405184, -684960832, -690392384, -702076288, -718923840, --738931392, -761562688, -786150272, -808610816, -822278976, -821855936, -805235520, -773099456, -729042752, -679147072, --629310400, -583083136, -542430208, -508994432, -483474816, -464784704, -450638176, -438507040, -426233088, -412716288, --397979712, -382108736, -364839744, -346619968, -328956928, -313062304, -299318432, -288607296, -282822528, -283359936, --290075648, -302071488, -318472352, -338125600, -359373888, -380381088, -399396000, -415003904, -426471456, -433510368, --435789408, -433354688, -427214496, -418410336, -406781184, -391712832, -373661632, -353731904, -332318784, -309478688, --286101728, -263467792, -242115904, -222054112, -203476224, -186587344, -171440064, -158391408, -147968608, -140255920, --135438576, -134720784, -139487120, -149966304, -166157792, -189564832, -222349376, -265213696, -317849056, -381103200, --456832576, -545526336, -645587840, -755151872, -873149696, -997795520, -1124988288, -1249492480, -1367641088, -1477668480, --1577235968, -1662584576, -1731487104, -1785210624, -1825508224, -1851442304, -1861844224, -1859087360, -1846884736, -1825654784, --1793888128, -1753022592, -1706731904, -1655882752, -1598357632, -1533789184, -1464510848, -1391412096, -1312354688, -1225542656, --1131783424, -1032359296, -926551168, -812663616, -690843904, -563587200, -433046528, -299167008, -162062000, -24927454, -108413568, 237962656, 365616608, 489768000, 607022208, 718448192, 827780352, 934079168, 1033306880, 1126050176, -1215316352, 1297863424, 1366641408, 1419627904, 1456143744, 1467462528, 1442218880, 1377115264, 1271023104, 1115677824, -906274048, 653276864, 370027008, 61913028, -255111936, -543083584, -769113216, -917314304, -946205440, -779825408, --411155616, 4182761, 243786096, 231176608, 95539400, 3235721, -7104950, 4381941, 277025, -4724464, -574452, 3642669, -973884, -2865817, 1049583, 2232846, -1037772, -1719598, 1045288, 1407139, --914291, -1052804, 878858, 840203, -778463, -638876, 676994, 439160, -634581, -346282, -492848, 158377, -474594, -108985, 336081, -40802, -296353, 102005, 194347, }, -{ --43152612, --167244416, -326189344, -425169024, -430063680, -408412736, -396821152, -347003296, -240177248, -150636320, -149980256, --227270880, -334289120, -431815488, -465875104, -381789856, -201092512, -19849728, 100399696, 182234384, 254505808, -295659648, 288585824, 269964992, 281386944, 315109408, 345971968, 378699072, 424291776, 459042880, 447787936, -391741280, 318566848, 234615808, 120319752, -26028038, -167703984, -263907488, -309349856, -328910208, -343889440, --357035808, -365100128, -369183040, -368511424, -355676992, -325343232, -281465856, -230792208, -174850800, -113110112, --48930952, 12495670, 68545528, 118137904, 159899488, 194040720, 222759552, 246649776, 263353968, 270581344, -267532432, 253314480, 227605888, 193476464, 156568736, 121000504, 88099440, 58618252, 33705292, 13705241, --2253247, -15534897, -27778774, -40846212, -56144888, -74168720, -94531160, -115715544, -135217376, -151071184, --163176544, -172670576, -180643104, -187729264, -193513504, -195408656, -189196000, -171573200, -141721040, -100734160, --51151448, 2652679, 55053964, 100841536, 136072080, 158270624, 167375952, 166312400, 159483952, 150750128, -143187760, 139580528, 141745200, 149778400, 162720736, 179277840, 197052032, 211674784, 217527216, 209201408, -182345520, 134332080, 65313032, -21227338, -119223464, -221298192, -319546656, -405998432, -473390208, -516054816, --530230368, -513815520, -466422720, -390015232, -289196256, -170530608, -41752988, 88480088, 211208240, 318744032, -405772416, 468956192, 506444288, 518312352, 506494752, 473356928, 420836992, 351277312, 267993616, 174445472, -73914776, -29439854, -130281392, -223306080, -303793248, -366947520, -408276384, -425243104, -417698464, -386863264, --335266752, -267617264, -190219808, -109179680, -29850560, 42653320, 104020888, 151907632, 185724048, 205642496, -212621824, 208755280, 196538784, 178010288, 155011808, 129571112, 103384160, 77390480, 52181168, 28295244, -5985037, -14707042, -33559800, -50273664, -64760052, -76887432, -86267104, -92647280, -96055336, -96301216, --92933432, -85790360, -74892952, -59932512, -40791452, -18388902, 5860483, 30818538, 54721104, 74417288, -86956984, 91032904, 85701776, 69631080, 43691092, 12382928, -19332722, -47658568, -65710852, -62912144, --36258112, -518080, 21429202, 20601348, 8546985, 825707, 671626, 1986959, 1380832, 722628, -1206886, 1399623, 694711, 281320, 529892, 461709, -140660, -445066, -325344, -481036, --959925, -1155883, -1067299, -1207960, -1529008, -1587527, -1462973, -1526861, -1668058, -1577864, --1390496, -1357210, -1326071, -1107565, -872952, -761283, -598074, -305480, -71941, }, -}, -{ -{ --43152612, --167244416, -326189344, -425169024, -430063680, -408412736, -396821152, -347003296, -240177248, -150636320, -149980256, --227270880, -334289120, -431815488, -465875104, -381789856, -201092512, -19849728, 100399696, 182234384, 254505808, -295659648, 288585824, 269964992, 281386944, 315109408, 345971968, 378699072, 424291776, 459042880, 447787936, -391741280, 318566848, 234615808, 120319752, -26028038, -167703984, -263907488, -309349856, -328910208, -343889440, --357035808, -365100128, -369183040, -368511424, -355676992, -325343232, -281465856, -230792208, -174850800, -113110112, --48930952, 12495670, 68545528, 118137904, 159899488, 194040720, 222759552, 246649776, 263353968, 270581344, -267532432, 253314480, 227605888, 193476464, 156568736, 121000504, 88099440, 58618252, 33705292, 13705241, --2253247, -15534897, -27778774, -40846212, -56144888, -74168720, -94531160, -115715544, -135217376, -151071184, --163176544, -172670576, -180643104, -187729264, -193513504, -195408656, -189196000, -171573200, -141721040, -100734160, --51151448, 2652679, 55053964, 100841536, 136072080, 158270624, 167375952, 166312400, 159483952, 150750128, -143187760, 139580528, 141745200, 149778400, 162720736, 179277840, 197052032, 211674784, 217527216, 209201408, -182345520, 134332080, 65313032, -21227338, -119223464, -221298192, -319546656, -405998432, -473390208, -516054816, --530230368, -513815520, -466422720, -390015232, -289196256, -170530608, -41752988, 88480088, 211208240, 318744032, -405772416, 468956192, 506444288, 518312352, 506494752, 473356928, 420836992, 351277312, 267993616, 174445472, -73914776, -29439854, -130281392, -223306080, -303793248, -366947520, -408276384, -425243104, -417698464, -386863264, --335266752, -267617264, -190219808, -109179680, -29850560, 42653320, 104020888, 151907632, 185724048, 205642496, -212621824, 208755280, 196538784, 178010288, 155011808, 129571112, 103384160, 77390480, 52181168, 28295244, -5985037, -14707042, -33559800, -50273664, -64760052, -76887432, -86267104, -92647280, -96055336, -96301216, --92933432, -85790360, -74892952, -59932512, -40791452, -18388902, 5860483, 30818538, 54721104, 74417288, -86956984, 91032904, 85701776, 69631080, 43691092, 12382928, -19332722, -47658568, -65710852, -62912144, --36258112, -518080, 21429202, 20601348, 8546985, 825707, 671626, 1986959, 1380832, 722628, -1206886, 1399623, 694711, 281320, 529892, 461709, -140660, -445066, -325344, -481036, --959925, -1155883, -1067299, -1207960, -1529008, -1587527, -1462973, -1526861, -1668058, -1577864, --1390496, -1357210, -1326071, -1107565, -872952, -761283, -598074, -305480, -71941, }, -{ -11671574, -33428268, 48048336, 42938400, 10669236, -23849416, -20741470, 7692824, -3387119, -60983168, -61801896, -75895296, 273056832, 373722816, 342877984, 285016704, 275532896, 274483296, 221783520, 125141392, 18176302, --95674688, -211587264, -285864960, -277180544, -200371504, -107004816, -29242822, 34718904, 94131728, 145453904, -173212816, 159637488, 97118336, -2741800, -114900576, -218103808, -305466112, -380638784, -447978496, -505954112, --547699072, -568476480, -572700096, -571630080, -574870080, -586484736, -606955648, -633760512, -660538560, -680332480, --690672640, -693753728, -692721856, -689765824, -686531200, -684405184, -684960832, -690392384, -702076288, -718923840, --738931392, -761562688, -786150272, -808610816, -822278976, -821855936, -805235520, -773099456, -729042752, -679147072, --629310400, -583083136, -542430208, -508994432, -483474816, -464784704, -450638176, -438507040, -426233088, -412716288, --397979712, -382108736, -364839744, -346619968, -328956928, -313062304, -299318432, -288607296, -282822528, -283359936, --290075648, -302071488, -318472352, -338125600, -359373888, -380381088, -399396000, -415003904, -426471456, -433510368, --435789408, -433354688, -427214496, -418410336, -406781184, -391712832, -373661632, -353731904, -332318784, -309478688, --286101728, -263467792, -242115904, -222054112, -203476224, -186587344, -171440064, -158391408, -147968608, -140255920, --135438576, -134720784, -139487120, -149966304, -166157792, -189564832, -222349376, -265213696, -317849056, -381103200, --456832576, -545526336, -645587840, -755151872, -873149696, -997795520, -1124988288, -1249492480, -1367641088, -1477668480, --1577235968, -1662584576, -1731487104, -1785210624, -1825508224, -1851442304, -1861844224, -1859087360, -1846884736, -1825654784, --1793888128, -1753022592, -1706731904, -1655882752, -1598357632, -1533789184, -1464510848, -1391412096, -1312354688, -1225542656, --1131783424, -1032359296, -926551168, -812663616, -690843904, -563587200, -433046528, -299167008, -162062000, -24927454, -108413568, 237962656, 365616608, 489768000, 607022208, 718448192, 827780352, 934079168, 1033306880, 1126050176, -1215316352, 1297863424, 1366641408, 1419627904, 1456143744, 1467462528, 1442218880, 1377115264, 1271023104, 1115677824, -906274048, 653276864, 370027008, 61913028, -255111936, -543083584, -769113216, -917314304, -946205440, -779825408, --411155616, 4182761, 243786096, 231176608, 95539400, 3235721, -7104950, 4381941, 277025, -4724464, -574452, 3642669, -973884, -2865817, 1049583, 2232846, -1037772, -1719598, 1045288, 1407139, --914291, -1052804, 878858, 840203, -778463, -638876, 676994, 439160, -634581, -346282, -492848, 158377, -474594, -108985, 336081, -40802, -296353, 102005, 194347, }, -}, -{ -{ -11190000, -11688753, -40061308, -117706800, -134747616, -57714160, 5634460, -62899260, -187951520, -160767600, 71454832, -306802400, 341183072, 213331568, 114958560, 134767488, 188811056, 166078864, 51683488, -91673392, -197863776, --236760608, -216768080, -167876320, -114699248, -63814088, -17744658, 10382547, 3632469, -45310832, -131139848, --237333984, -339328192, -417852000, -472420640, -513258784, -540252096, -540749248, -509197376, -458708960, -410927968, --381957344, -378321664, -397385408, -428277504, -458271392, -481866880, -501694048, -520654720, -536553088, -544890176, --544073024, -536677632, -526796544, -516915424, -507240992, -497597728, -488693184, -480493024, -470668832, -456728448, --439283872, -421299232, -404266496, -386905152, -367767840, -347481632, -327834848, -309644608, -292188768, -274380224, --256101376, -238439936, -222777808, -209789296, -199288624, -190734128, -183625952, -177709104, -173162880, -170485504, --169868640, -170759840, -172325904, -174384800, -177703728, -183303296, -191610832, -202452416, -215758752, -231803136, --250417536, -270201216, -288826880, -303902752, -313296928, -315217312, -308869888, -295065856, -275606432, -252019552, --225260304, -196459328, -167298640, -139454368, -113997560, -91598768, -73310256, -61077120, -57306676, -63880124, --81812688, -111846320, -154618288, -209682448, -275052384, -348547872, -429030176, -515448160, -605471232, -696545472, --787878464, -879785408, -971233856, -1059755776, -1143757312, -1222864640, -1295487232, -1358142208, -1408379904, -1446699648, --1474248064, -1490276864, -1493755776, -1486252544, -1470870016, -1448836864, -1419387904, -1382823296, -1341137920, -1295046400, --1242674176, -1182316928, -1114553728, -1040169152, -957788992, -865628096, -764488064, -656917952, -544147136, -426189056, --304802560, -183969552, -66967132, 45001056, 150619136, 246948272, 331334720, 403297952, 463172480, 510109504, -542955264, 562277248, 570001216, 567531584, 555661952, 536101568, 511675008, 484807840, 456758496, 428523904, -401605216, 377419712, 356422688, 338270560, 322689472, 309778272, 299407008, 290740288, 282810720, 275370208, -268582560, 262031664, 254824160, 246598768, 237373184, 226360352, 212164944, 194264592, 172972832, 147953040, -118503520, 85361936, 50281184, 13942538, -23293756, -58928560, -89729384, -114679384, -131502768, -130823096, --102383432, -51582556, -2934537, 20398410, 17792438, 6694244, 927713, 525597, 409096, -360240, --264141, 293668, 136365, -266288, -70330, 250719, 71941, -165893, 3758, 180389, -18254, -121870, 12885, 104153, -25233, -98784, 3221, 44560, -47245, -75162, --3221, 9664, -45097, -44560, -1611, -3758, -23622, -9127, 3221, }, -{ -11190000, -11688753, -40061308, -117706800, -134747616, -57714160, 5634460, -62899260, -187951520, -160767600, 71454832, -306802400, 341183072, 213331568, 114958560, 134767488, 188811056, 166078864, 51683488, -91673392, -197863776, --236760608, -216768080, -167876320, -114699248, -63814088, -17744658, 10382547, 3632469, -45310832, -131139848, --237333984, -339328192, -417852000, -472420640, -513258784, -540252096, -540749248, -509197376, -458708960, -410927968, --381957344, -378321664, -397385408, -428277504, -458271392, -481866880, -501694048, -520654720, -536553088, -544890176, --544073024, -536677632, -526796544, -516915424, -507240992, -497597728, -488693184, -480493024, -470668832, -456728448, --439283872, -421299232, -404266496, -386905152, -367767840, -347481632, -327834848, -309644608, -292188768, -274380224, --256101376, -238439936, -222777808, -209789296, -199288624, -190734128, -183625952, -177709104, -173162880, -170485504, --169868640, -170759840, -172325904, -174384800, -177703728, -183303296, -191610832, -202452416, -215758752, -231803136, --250417536, -270201216, -288826880, -303902752, -313296928, -315217312, -308869888, -295065856, -275606432, -252019552, --225260304, -196459328, -167298640, -139454368, -113997560, -91598768, -73310256, -61077120, -57306676, -63880124, --81812688, -111846320, -154618288, -209682448, -275052384, -348547872, -429030176, -515448160, -605471232, -696545472, --787878464, -879785408, -971233856, -1059755776, -1143757312, -1222864640, -1295487232, -1358142208, -1408379904, -1446699648, --1474248064, -1490276864, -1493755776, -1486252544, -1470870016, -1448836864, -1419387904, -1382823296, -1341137920, -1295046400, --1242674176, -1182316928, -1114553728, -1040169152, -957788992, -865628096, -764488064, -656917952, -544147136, -426189056, --304802560, -183969552, -66967132, 45001056, 150619136, 246948272, 331334720, 403297952, 463172480, 510109504, -542955264, 562277248, 570001216, 567531584, 555661952, 536101568, 511675008, 484807840, 456758496, 428523904, -401605216, 377419712, 356422688, 338270560, 322689472, 309778272, 299407008, 290740288, 282810720, 275370208, -268582560, 262031664, 254824160, 246598768, 237373184, 226360352, 212164944, 194264592, 172972832, 147953040, -118503520, 85361936, 50281184, 13942538, -23293756, -58928560, -89729384, -114679384, -131502768, -130823096, --102383432, -51582556, -2934537, 20398410, 17792438, 6694244, 927713, 525597, 409096, -360240, --264141, 293668, 136365, -266288, -70330, 250719, 71941, -165893, 3758, 180389, -18254, -121870, 12885, 104153, -25233, -98784, 3221, 44560, -47245, -75162, --3221, 9664, -45097, -44560, -1611, -3758, -23622, -9127, 3221, }, -}, -{ -{ -6211060, -34978752, 80612776, 109325712, 110260400, 92930208, 42263016, -53406844, -146626960, -180780000, -181451632, --218612768, -291483328, -334530176, -329071808, -323580704, -343249504, -359814656, -357419648, -356058144, -359599904, --343069088, -302278176, -264480864, -243390432, -228616272, -220896080, -233855600, -258485632, -265091824, -244069040, --213233856, -184628832, -152695216, -115064320, -79634600, -49862424, -22612466, -731218, 7459822, 524523, --15042049, -33455110, -50982336, -62585188, -64738580, -59263032, -50605452, -42732240, -40575092, -49833432, --73002632, -108290624, -152267872, -200412304, -246377040, -284815392, -314633184, -337180160, -352783232, -361140192, --363007424, -359134432, -348979520, -332006336, -308914464, -280828576, -248721024, -214081568, -178794656, -144102592, --110534208, -78451336, -47745004, -17543868, 12916577, 43589624, 74150464, 104460584, 134023920, 161468224, -184815664, 202076608, 211709680, 212568672, 203110080, 180917440, 143664512, 90120224, 19548544, -68624448, --172849888, -288047360, -407998272, -528383520, -645873408, -755773568, -853351488, -936860672, -1006812288, -1062875008, --1103973504, -1130945408, -1146318720, -1151125376, -1144086400, -1124344064, -1093229184, -1052873088, -1004816704, -950963712, --894673344, -839560896, -787456512, -738373568, -692276224, -649974016, -612192832, -578741504, -549220032, -523921600, --503275680, -486701408, -472745984, -460297024, -449115616, -439285504, -430778240, -423759712, -418975680, -417571744, --420481600, -428016032, -440041952, -456500800, -477438752, -502406496, -530226048, -559775424, -590655168, -622515776, --653955456, -682810688, -707459520, -727025216, -740269312, -745413568, -741645312, -729996288, -712013760, -688337216, --659459456, -627038912, -593065216, -558063360, -521429440, -483322336, -444842112, -406379616, -367223456, -327093984, --286897920, -247544192, -208959824, -170764672, -133316856, -97519376, -63731944, -31346282, 276489, 30821222, -59784872, 88011400, 117109800, 147303952, 177724672, 209031760, 243277152, 280708864, 319700192, 360357952, -404555328, 451731232, 498806240, 544664128, 589579264, 629760832, 658198912, 670943680, 666074816, 637512704, -578303936, 489051808, 374302112, 234066048, 70973264, -98681704, -255379824, -389007008, -478705248, -472851744, --333534272, -111147312, 68010808, 117137720, 67772976, 12375411, -2839510, 2132451, 1378148, -2444910, --650688, 2015950, 204548, -1671279, 1074, 1360431, -106300, -1068910, 222265, 907312, --214212, -693637, 259309, 566399, -253940, -448287, 227096, 315143, -245887, -266288, -176094, 139050, -197569, -118112, 121870, 20401, -115964, 9127, 60666, }, -{ --91098944, --257189088, -369215776, -400231360, -368604832, -319033920, -265362944, -188068032, -89787368, -9621264, 29767882, -50291920, 77778096, 108183248, 133607304, 170049568, 232137616, 298603840, 326322496, 290237248, 197401536, -73890616, -49498424, -148477552, -214940032, -253075584, -264258608, -244663888, -199331584, -146193168, -100364792, --62904628, -28640452, 4153234, 36403068, 71977208, 112137304, 150219696, 175712480, 181030192, 163381088, -124666256, 72294504, 17459578, -29639032, -62694712, -79011296, -79526688, -69355672, -55715388, -44043816, --36359044, -32417340, -30959198, -30240864, -28823526, -26287348, -23006530, -19612432, -16761647, -14723685, --12786118, -9368397, -2711735, 8783208, 26276610, 49416284, 75259640, 98729488, 114351360, 117805048, -106865232, 82032800, 46493556, 4951561, -37917044, -78324096, -113419888, -140948480, -158707632, -164144528, --154651568, -128642864, -86754584, -32558000, 27484032, 85047328, 131882880, 161876784, 172216912, 163395056, -138473504, 102116608, 59641528, 16258599, -23465554, -55970940, -78933984, -91351272, -93557272, -87172800, --74826384, -59545428, -44037372, -30204358, -18999324, -10519986, -4220342, 817118, 5617281, 11120207, -18055506, 26812408, 37246492, 48491256, 58960776, 66642860, 69566656, 66279936, 56247964, 40042516, -19180250, -4301410, -28228672, -50518480, -69346008, -83255792, -91117728, -92039536, -85456424, -71343704, --50351512, -23885386, 5788006, 35614404, 62179852, 82309824, 93587872, 94823216, 86394880, 70160976, -48873508, 25526602, 2877091, -16967268, -32840930, -44412648, -51804284, -55371256, -55631100, -53061636, --47908212, -40312028, -30549566, -19041200, -6323266, 6787659, 19158238, 29657286, 37421512, 41853384, -42696268, 40242232, 35249872, 28576564, 21034602, 13422310, 6296959, -242129, -6320045, -12029130, --17589502, -23371602, -29429652, -35311072, -40429600, -44040056, -44704168, -40561136, -30383136, -13873818, -8616778, 35296580, 61857192, 82479480, 92036856, 86772832, 64508260, 26887570, -18865644, -62464932, --94489816, -107148696, -94908040, -58954332, -9684078, 38810400, 74739944, 87122872, 66568236, 18261128, --29876866, -46610596, -28573344, -2207613, 8111583, 3517578, -1232119, -479963, 791885, -161598, --657130, 418759, 933619, 294205, 179852, 879395, 1036161, 533113, 457414, 810675, -723165, 273267, 157303, 263067, 57982, -306553, -411780, -402116, -574452, -774705, --785442, -737124, -769336, -770947, -658741, -520228, -406411, -269509, -93952, }, -}, -{ -{ --91098944, --257189088, -369215776, -400231360, -368604832, -319033920, -265362944, -188068032, -89787368, -9621264, 29767882, -50291920, 77778096, 108183248, 133607304, 170049568, 232137616, 298603840, 326322496, 290237248, 197401536, -73890616, -49498424, -148477552, -214940032, -253075584, -264258608, -244663888, -199331584, -146193168, -100364792, --62904628, -28640452, 4153234, 36403068, 71977208, 112137304, 150219696, 175712480, 181030192, 163381088, -124666256, 72294504, 17459578, -29639032, -62694712, -79011296, -79526688, -69355672, -55715388, -44043816, --36359044, -32417340, -30959198, -30240864, -28823526, -26287348, -23006530, -19612432, -16761647, -14723685, --12786118, -9368397, -2711735, 8783208, 26276610, 49416284, 75259640, 98729488, 114351360, 117805048, -106865232, 82032800, 46493556, 4951561, -37917044, -78324096, -113419888, -140948480, -158707632, -164144528, --154651568, -128642864, -86754584, -32558000, 27484032, 85047328, 131882880, 161876784, 172216912, 163395056, -138473504, 102116608, 59641528, 16258599, -23465554, -55970940, -78933984, -91351272, -93557272, -87172800, --74826384, -59545428, -44037372, -30204358, -18999324, -10519986, -4220342, 817118, 5617281, 11120207, -18055506, 26812408, 37246492, 48491256, 58960776, 66642860, 69566656, 66279936, 56247964, 40042516, -19180250, -4301410, -28228672, -50518480, -69346008, -83255792, -91117728, -92039536, -85456424, -71343704, --50351512, -23885386, 5788006, 35614404, 62179852, 82309824, 93587872, 94823216, 86394880, 70160976, -48873508, 25526602, 2877091, -16967268, -32840930, -44412648, -51804284, -55371256, -55631100, -53061636, --47908212, -40312028, -30549566, -19041200, -6323266, 6787659, 19158238, 29657286, 37421512, 41853384, -42696268, 40242232, 35249872, 28576564, 21034602, 13422310, 6296959, -242129, -6320045, -12029130, --17589502, -23371602, -29429652, -35311072, -40429600, -44040056, -44704168, -40561136, -30383136, -13873818, -8616778, 35296580, 61857192, 82479480, 92036856, 86772832, 64508260, 26887570, -18865644, -62464932, --94489816, -107148696, -94908040, -58954332, -9684078, 38810400, 74739944, 87122872, 66568236, 18261128, --29876866, -46610596, -28573344, -2207613, 8111583, 3517578, -1232119, -479963, 791885, -161598, --657130, 418759, 933619, 294205, 179852, 879395, 1036161, 533113, 457414, 810675, -723165, 273267, 157303, 263067, 57982, -306553, -411780, -402116, -574452, -774705, --785442, -737124, -769336, -770947, -658741, -520228, -406411, -269509, -93952, }, -{ -6211060, -34978752, 80612776, 109325712, 110260400, 92930208, 42263016, -53406844, -146626960, -180780000, -181451632, --218612768, -291483328, -334530176, -329071808, -323580704, -343249504, -359814656, -357419648, -356058144, -359599904, --343069088, -302278176, -264480864, -243390432, -228616272, -220896080, -233855600, -258485632, -265091824, -244069040, --213233856, -184628832, -152695216, -115064320, -79634600, -49862424, -22612466, -731218, 7459822, 524523, --15042049, -33455110, -50982336, -62585188, -64738580, -59263032, -50605452, -42732240, -40575092, -49833432, --73002632, -108290624, -152267872, -200412304, -246377040, -284815392, -314633184, -337180160, -352783232, -361140192, --363007424, -359134432, -348979520, -332006336, -308914464, -280828576, -248721024, -214081568, -178794656, -144102592, --110534208, -78451336, -47745004, -17543868, 12916577, 43589624, 74150464, 104460584, 134023920, 161468224, -184815664, 202076608, 211709680, 212568672, 203110080, 180917440, 143664512, 90120224, 19548544, -68624448, --172849888, -288047360, -407998272, -528383520, -645873408, -755773568, -853351488, -936860672, -1006812288, -1062875008, --1103973504, -1130945408, -1146318720, -1151125376, -1144086400, -1124344064, -1093229184, -1052873088, -1004816704, -950963712, --894673344, -839560896, -787456512, -738373568, -692276224, -649974016, -612192832, -578741504, -549220032, -523921600, --503275680, -486701408, -472745984, -460297024, -449115616, -439285504, -430778240, -423759712, -418975680, -417571744, --420481600, -428016032, -440041952, -456500800, -477438752, -502406496, -530226048, -559775424, -590655168, -622515776, --653955456, -682810688, -707459520, -727025216, -740269312, -745413568, -741645312, -729996288, -712013760, -688337216, --659459456, -627038912, -593065216, -558063360, -521429440, -483322336, -444842112, -406379616, -367223456, -327093984, --286897920, -247544192, -208959824, -170764672, -133316856, -97519376, -63731944, -31346282, 276489, 30821222, -59784872, 88011400, 117109800, 147303952, 177724672, 209031760, 243277152, 280708864, 319700192, 360357952, -404555328, 451731232, 498806240, 544664128, 589579264, 629760832, 658198912, 670943680, 666074816, 637512704, -578303936, 489051808, 374302112, 234066048, 70973264, -98681704, -255379824, -389007008, -478705248, -472851744, --333534272, -111147312, 68010808, 117137720, 67772976, 12375411, -2839510, 2132451, 1378148, -2444910, --650688, 2015950, 204548, -1671279, 1074, 1360431, -106300, -1068910, 222265, 907312, --214212, -693637, 259309, 566399, -253940, -448287, 227096, 315143, -245887, -266288, -176094, 139050, -197569, -118112, 121870, 20401, -115964, 9127, 60666, }, -}, -{ -{ -7603166, -42476688, 103279464, 146589920, 135250672, 80335752, 11234561, -65767760, -149280720, -208833120, -214609856, --191591504, -195253504, -231171248, -247936112, -220656096, -190400192, -197253888, -220569120, -219633360, -197185712, --183433760, -182333712, -173349168, -152315104, -135353744, -128052304, -118505664, -99485400, -77576240, -60952564, --51844012, -49365816, -49600968, -45003740, -30903900, -10552198, 9705015, 26149908, 36463200, 38291244, -31807454, 19619410, 2814277, -19248970, -45126148, -71135392, -95098096, -117431384, -139254656, -161874640, --187139776, -216240336, -248834304, -283934368, -320240800, -355665184, -388487840, -418700800, -446400640, -469913984, --487608160, -500139808, -508678752, -512512544, -510573888, -503515648, -492055072, -474965408, -450726208, -419716000, --383359104, -342749664, -299282976, -255128032, -212111792, -171212960, -133291088, -99048392, -68507952, -41831372, --20184736, -4600447, 5168993, 9294309, 6242735, -6143414, -28790240, -61982820, -107035416, -165830832, --238823264, -324541696, -421067872, -526965120, -640141760, -756518208, -871110080, -980573248, -1083398528, -1177353088, --1258720128, -1325160064, -1377268224, -1415646976, -1438483328, -1444116736, -1434029440, -1410808192, -1374958592, -1326537728, --1268522880, -1205691776, -1141034880, -1075703552, -1011597376, -951476992, -896733888, -846954688, -801676032, -761317824, --726391168, -696634560, -671082176, -648755904, -629198720, -612108032, -596566656, -581449984, -566881472, -554386304, --545277248, -539866112, -538575488, -542615424, -552946432, -569424640, -591395520, -618458112, -650345536, -686426496, --725362560, -765176896, -804046336, -840819840, -874014592, -900821056, -918468544, -926077632, -923566656, -909549504, --882574464, -843826880, -796154880, -740955392, -678549504, -610973056, -541576576, -472080256, -402478176, -333600832, --267507744, -205489488, -147484880, -93419832, -43877924, 492848, 39701604, 74688944, 106660144, 135861088, -162007776, 186297424, 211087984, 236946368, 262724224, 289269280, 319466112, 353746400, 390006112, 428802560, -473271584, 523070112, 574500736, 626924032, 681552256, 733620160, 773950400, 797709120, 802263936, 778438656, -715712832, 614000448, 478078176, 306086208, 100260640, -117822768, -322167104, -499343648, -620302272, -613854976, --428609280, -133701256, 100466800, 159385168, 88751208, 13932337, -4886599, 2917357, 1884417, -3468186, --879395, 2867965, 268972, -2379412, 20401, 1941862, -180926, -1547262, 338229, 1308354, --344671, -1014686, 410169, 827855, -409096, -651224, 383326, 463856, -403727, -373662, -319438, 195421, -336618, -142808, 237297, 3221, -216896, 54224, 134755, }, -{ --121878824, --327949216, -439449792, -444052896, -368775552, -245396720, -86296632, 97207456, 264143712, 356090368, 346550720, -263938096, 159234304, 62198104, -24681030, -102201968, -160068592, -186791344, -183981904, -163771392, -133201432, --87697328, -23809152, 46788300, 103827080, 137113072, 150406000, 147602992, 125509144, 83242912, 29804388, --22716618, -67662376, -102038760, -122054920, -124664648, -110078936, -80458160, -39591008, 4912369, 43421584, -70509408, 86873768, 94564440, 93348968, 82163800, 60991756, 30705794, -6274947, -44485660, -76545984, --96388728, -100801272, -89162448, -63834488, -30457224, 3966939, 33825552, 55890408, 69000264, 73880416, -72445896, 66097400, 54684060, 37191732, 12969727, -17504676, -51842404, -85010288, -109748760, -118309168, --104737608, -67371392, -11078868, 52457656, 107721000, 140508240, 142736256, 114968760, 65752728, 7995082, --45689324, -86133960, -108403360, -111204760, -96031712, -66442072, -27694486, 13394392, 49216568, 73181408, -81637128, 74689480, 55739548, 30266634, 4209068, -17627620, -32488206, -39666708, -40008696, -35300872, --27625766, -18796924, -10100689, -2289218, 4378719, 10022843, 14871861, 19003620, 22226456, 24037322, -23637890, 20209432, 13393856, 3655017, -7693360, -18708878, -27219356, -31388158, -30255898, -23992224, --13833553, -1796907, 9791452, 18900540, 24272470, 25560960, 23177792, 18026514, 11200738, 3724274, --3570729, -10016937, -15056008, -18243410, -19265612, -17955110, -14359686, -8842264, -2096481, 4945655, -11243151, 15796353, 17865990, 17185238, 14020921, 9051107, 3195456, -2569464, -7425999, -10878615, --12737262, -13000866, -11812771, -9455371, -6269042, -2563559, 1353452, 5134097, 8430484, 10930155, -12307766, 12255152, 10621454, 7481296, 3088618, -2079838, -7271917, -11628624, -14440217, -15199352, --13622563, -9851581, -4516158, 1581622, 7680476, 12921946, 16411070, 17614198, 16370268, 12476343, -5845988, -2801929, -11996917, -20175072, -25573310, -25850872, -19255950, -6481106, 9387725, 24314884, -33745560, 33120640, 20860656, 999654, -18942416, -32137092, -33390686, -19749870, 4261145, 23944980, -25036438, 9262097, -6587943, -9628780, -3402151, 1152125, 552440, -816581, -246424, 438624, --35970, -354335, 189515, 510027, 148176, -16106, 305480, 378494, 28454, -121870, -37044, -1074, -271657, -336618, -187368, -178241, -283468, -211527, -19864, 46171, -44023, 150861, 278636, 281320, 241055, 255014, 233539, 123480, 26844, }, -}, -{ -{ --121878824, --327949216, -439449792, -444052896, -368775552, -245396720, -86296632, 97207456, 264143712, 356090368, 346550720, -263938096, 159234304, 62198104, -24681030, -102201968, -160068592, -186791344, -183981904, -163771392, -133201432, --87697328, -23809152, 46788300, 103827080, 137113072, 150406000, 147602992, 125509144, 83242912, 29804388, --22716618, -67662376, -102038760, -122054920, -124664648, -110078936, -80458160, -39591008, 4912369, 43421584, -70509408, 86873768, 94564440, 93348968, 82163800, 60991756, 30705794, -6274947, -44485660, -76545984, --96388728, -100801272, -89162448, -63834488, -30457224, 3966939, 33825552, 55890408, 69000264, 73880416, -72445896, 66097400, 54684060, 37191732, 12969727, -17504676, -51842404, -85010288, -109748760, -118309168, --104737608, -67371392, -11078868, 52457656, 107721000, 140508240, 142736256, 114968760, 65752728, 7995082, --45689324, -86133960, -108403360, -111204760, -96031712, -66442072, -27694486, 13394392, 49216568, 73181408, -81637128, 74689480, 55739548, 30266634, 4209068, -17627620, -32488206, -39666708, -40008696, -35300872, --27625766, -18796924, -10100689, -2289218, 4378719, 10022843, 14871861, 19003620, 22226456, 24037322, -23637890, 20209432, 13393856, 3655017, -7693360, -18708878, -27219356, -31388158, -30255898, -23992224, --13833553, -1796907, 9791452, 18900540, 24272470, 25560960, 23177792, 18026514, 11200738, 3724274, --3570729, -10016937, -15056008, -18243410, -19265612, -17955110, -14359686, -8842264, -2096481, 4945655, -11243151, 15796353, 17865990, 17185238, 14020921, 9051107, 3195456, -2569464, -7425999, -10878615, --12737262, -13000866, -11812771, -9455371, -6269042, -2563559, 1353452, 5134097, 8430484, 10930155, -12307766, 12255152, 10621454, 7481296, 3088618, -2079838, -7271917, -11628624, -14440217, -15199352, --13622563, -9851581, -4516158, 1581622, 7680476, 12921946, 16411070, 17614198, 16370268, 12476343, -5845988, -2801929, -11996917, -20175072, -25573310, -25850872, -19255950, -6481106, 9387725, 24314884, -33745560, 33120640, 20860656, 999654, -18942416, -32137092, -33390686, -19749870, 4261145, 23944980, -25036438, 9262097, -6587943, -9628780, -3402151, 1152125, 552440, -816581, -246424, 438624, --35970, -354335, 189515, 510027, 148176, -16106, 305480, 378494, 28454, -121870, -37044, -1074, -271657, -336618, -187368, -178241, -283468, -211527, -19864, 46171, -44023, 150861, 278636, 281320, 241055, 255014, 233539, 123480, 26844, }, -{ -7603166, -42476688, 103279464, 146589920, 135250672, 80335752, 11234561, -65767760, -149280720, -208833120, -214609856, --191591504, -195253504, -231171248, -247936112, -220656096, -190400192, -197253888, -220569120, -219633360, -197185712, --183433760, -182333712, -173349168, -152315104, -135353744, -128052304, -118505664, -99485400, -77576240, -60952564, --51844012, -49365816, -49600968, -45003740, -30903900, -10552198, 9705015, 26149908, 36463200, 38291244, -31807454, 19619410, 2814277, -19248970, -45126148, -71135392, -95098096, -117431384, -139254656, -161874640, --187139776, -216240336, -248834304, -283934368, -320240800, -355665184, -388487840, -418700800, -446400640, -469913984, --487608160, -500139808, -508678752, -512512544, -510573888, -503515648, -492055072, -474965408, -450726208, -419716000, --383359104, -342749664, -299282976, -255128032, -212111792, -171212960, -133291088, -99048392, -68507952, -41831372, --20184736, -4600447, 5168993, 9294309, 6242735, -6143414, -28790240, -61982820, -107035416, -165830832, --238823264, -324541696, -421067872, -526965120, -640141760, -756518208, -871110080, -980573248, -1083398528, -1177353088, --1258720128, -1325160064, -1377268224, -1415646976, -1438483328, -1444116736, -1434029440, -1410808192, -1374958592, -1326537728, --1268522880, -1205691776, -1141034880, -1075703552, -1011597376, -951476992, -896733888, -846954688, -801676032, -761317824, --726391168, -696634560, -671082176, -648755904, -629198720, -612108032, -596566656, -581449984, -566881472, -554386304, --545277248, -539866112, -538575488, -542615424, -552946432, -569424640, -591395520, -618458112, -650345536, -686426496, --725362560, -765176896, -804046336, -840819840, -874014592, -900821056, -918468544, -926077632, -923566656, -909549504, --882574464, -843826880, -796154880, -740955392, -678549504, -610973056, -541576576, -472080256, -402478176, -333600832, --267507744, -205489488, -147484880, -93419832, -43877924, 492848, 39701604, 74688944, 106660144, 135861088, -162007776, 186297424, 211087984, 236946368, 262724224, 289269280, 319466112, 353746400, 390006112, 428802560, -473271584, 523070112, 574500736, 626924032, 681552256, 733620160, 773950400, 797709120, 802263936, 778438656, -715712832, 614000448, 478078176, 306086208, 100260640, -117822768, -322167104, -499343648, -620302272, -613854976, --428609280, -133701256, 100466800, 159385168, 88751208, 13932337, -4886599, 2917357, 1884417, -3468186, --879395, 2867965, 268972, -2379412, 20401, 1941862, -180926, -1547262, 338229, 1308354, --344671, -1014686, 410169, 827855, -409096, -651224, 383326, 463856, -403727, -373662, -319438, 195421, -336618, -142808, 237297, 3221, -216896, 54224, 134755, }, -}, -{ -{ -22941568, -60834992, 94597728, 135659232, 151335328, 93556200, -15516643, -96951904, -125620280, -154287040, -207301968, --228418704, -174931328, -95768104, -61450780, -67413272, -64889440, -49018460, -53573276, -80212808, -94167696, --85941760, -86875912, -117151136, -155600224, -170909104, -157015952, -129109400, -103067400, -85586888, -71761384, --48570176, -10253161, 29126858, 47252692, 37082212, 10780368, -17792438, -44844292, -71080096, -94165008, --110759688, -121372552, -130140728, -141675936, -159057136, -183318336, -214228672, -251893392, -296846112, -347995968, --401685216, -453714432, -501417024, -543284928, -578109568, -605895872, -628941056, -650780416, -674133760, -700343296, --730119744, -763450816, -798361408, -830556992, -855029760, -867926976, -866865088, -850513600, -819124864, -775252864, --722731328, -664644608, -602938240, -539823168, -478321376, -420980896, -368797024, -321822976, -280324448, -245082112, --217063360, -197146512, -185978528, -183895472, -190771168, -205554448, -226081712, -250233920, -277758208, -310404256, --350039296, -397613568, -454370496, -522581024, -603616832, -695994112, -796599936, -903032960, -1012979328, -1121766528, --1222814720, -1311025920, -1384092928, -1440244224, -1477094528, -1494116608, -1494412928, -1482181376, -1459547520, -1427511296, --1388589824, -1346003072, -1300631040, -1251070336, -1196795264, -1139278720, -1079781632, -1018152064, -954703040, -891668480, --831614144, -775381696, -722612672, -673521728, -628960384, -589041856, -552887360, -520006720, -491207360, -467731072, --449969760, -437531008, -430267680, -428568480, -432568160, -441643424, -454992192, -472407200, -494080704, -519696960, --547997056, -577340800, -606388160, -633769664, -657122496, -673232384, -679566400, -675043776, -658866240, -629654528, --586888512, -532360128, -468847232, -398032864, -321164224, -240938000, -160777808, -82597592, -7059853, 64257004, -128806608, 185087328, 233052448, 272529632, 302702848, 323317088, 335299520, 340011616, 338508384, 331614976, -320457696, 306831936, 292658528, 278890496, 265742512, 254260448, 246242816, 242156704, 241125376, 243671744, -251926144, 266340592, 285317376, 308789888, 338100896, 371314432, 403117056, 429964896, 449832320, 456690848, -442260288, 403697920, 342134400, 255046432, 140796000, 9450002, -123436824, -249365808, -352794528, -388898560, --312111520, -143997904, 17201344, 83570936, 59500328, 15437723, -1094143, 1642288, 1639067, -1799591, --961536, 1548873, 506806, -1336272, -270046, 1126892, 141734, -891743, 17717, 785442, --37044, -605054, 112743, 501974, -137976, -407485, 129386, 281320, -176094, -251256, -115964, 123480, -159451, -115427, 89657, 18254, -98247, 2684, 48318, }, -{ --134705744, --355052064, -462366656, -454684576, -356599328, -183986192, 41270340, 262388672, 404438816, 426639488, 346103488, -208141632, 46766824, -119401168, -266116176, -356898368, -362558592, -282236800, -142683104, 19489488, 171758432, -286208576, 336999776, 307832128, 205007376, 59145996, -89700392, -208730576, -276980288, -282773120, -225548064, --120158152, 6200322, 123784712, 207463024, 239510464, 213983328, 141544944, 46180564, -46616500, -119248160, --162227360, -170816224, -145180096, -92382600, -25236154, 41639708, 95004136, 124838056, 126479808, 102404368, -61247308, 13972065, -29905320, -63705640, -83256864, -86804512, -75461504, -52934400, -24138790, 6084358, -33353642, 53966264, 65539592, 67355288, 59813324, 43739412, 20334522, -8456254, -39436388, -67427232, --85135912, -85208928, -64182380, -25450366, 21178484, 62900332, 88331368, 91328184, 72951096, 40411348, -3381750, -29947196, -54736672, -69009384, -72172096, -63930052, -44290240, -14661408, 20721070, 54373748, -77168216, 81717656, 65875136, 34143380, -4037806, -38145216, -60307248, -67199592, -59830504, -42037528, --18751828, 5282273, 26208964, 41352480, 49213884, 49219252, 41464688, 26736172, 6737730, -15744276, --36872296, -52103860, -57128972, -49394272, -29525216, -1772748, 26890254, 48787608, 58082452, 52814140, -35395364, 11363410, -12761422, -31455804, -41445896, -42038068, -34630320, -21813602, -6573985, 8270497, -20461224, 28472948, 31444530, 29120952, 21932788, 11050951, -1744294, -14279693, -24270324, -29755534, --29578366, -23648090, -12975096, 421444, 13831405, 24459838, 30067992, 29402810, 22509386, 10887742, --2807835, -15531675, -24613920, -28263032, -25919590, -18389440, -7525857, 4358318, 14934138, 22187802, -24834574, 22589918, 16065862, 6547141, -4144644, -13931800, -20942260, -23813984, -21829172, -15197205, --5259725, 5860483, 15851114, 22525492, 24193550, 20387672, 12138651, 1318555, -9976135, -19389092, --24594056, -24252070, -18323942, -7525857, 6455873, 20078436, 28725278, 29109140, 20496120, 4436701, --14688788, -29411936, -32658932, -22777286, -4110821, 16222091, 29726006, 27842126, 9167608, -13823889, --22857280, -12723304, 3033321, 8892193, 4354023, -463856, -427886, 914291, 268435, -825707, --612570, -216896, -677531, -992137, -438087, 107911, 82678, 163209, 664646, 923418, -667867, 439697, 420907, 186294, -307627, -612570, -645319, -705985, -776315, -590021, --216359, 78920, 310311, 594316, 802085, 790274, 652835, 476741, 187368, }, -}, -{ -{ --134705744, --355052064, -462366656, -454684576, -356599328, -183986192, 41270340, 262388672, 404438816, 426639488, 346103488, -208141632, 46766824, -119401168, -266116176, -356898368, -362558592, -282236800, -142683104, 19489488, 171758432, -286208576, 336999776, 307832128, 205007376, 59145996, -89700392, -208730576, -276980288, -282773120, -225548064, --120158152, 6200322, 123784712, 207463024, 239510464, 213983328, 141544944, 46180564, -46616500, -119248160, --162227360, -170816224, -145180096, -92382600, -25236154, 41639708, 95004136, 124838056, 126479808, 102404368, -61247308, 13972065, -29905320, -63705640, -83256864, -86804512, -75461504, -52934400, -24138790, 6084358, -33353642, 53966264, 65539592, 67355288, 59813324, 43739412, 20334522, -8456254, -39436388, -67427232, --85135912, -85208928, -64182380, -25450366, 21178484, 62900332, 88331368, 91328184, 72951096, 40411348, -3381750, -29947196, -54736672, -69009384, -72172096, -63930052, -44290240, -14661408, 20721070, 54373748, -77168216, 81717656, 65875136, 34143380, -4037806, -38145216, -60307248, -67199592, -59830504, -42037528, --18751828, 5282273, 26208964, 41352480, 49213884, 49219252, 41464688, 26736172, 6737730, -15744276, --36872296, -52103860, -57128972, -49394272, -29525216, -1772748, 26890254, 48787608, 58082452, 52814140, -35395364, 11363410, -12761422, -31455804, -41445896, -42038068, -34630320, -21813602, -6573985, 8270497, -20461224, 28472948, 31444530, 29120952, 21932788, 11050951, -1744294, -14279693, -24270324, -29755534, --29578366, -23648090, -12975096, 421444, 13831405, 24459838, 30067992, 29402810, 22509386, 10887742, --2807835, -15531675, -24613920, -28263032, -25919590, -18389440, -7525857, 4358318, 14934138, 22187802, -24834574, 22589918, 16065862, 6547141, -4144644, -13931800, -20942260, -23813984, -21829172, -15197205, --5259725, 5860483, 15851114, 22525492, 24193550, 20387672, 12138651, 1318555, -9976135, -19389092, --24594056, -24252070, -18323942, -7525857, 6455873, 20078436, 28725278, 29109140, 20496120, 4436701, --14688788, -29411936, -32658932, -22777286, -4110821, 16222091, 29726006, 27842126, 9167608, -13823889, --22857280, -12723304, 3033321, 8892193, 4354023, -463856, -427886, 914291, 268435, -825707, --612570, -216896, -677531, -992137, -438087, 107911, 82678, 163209, 664646, 923418, -667867, 439697, 420907, 186294, -307627, -612570, -645319, -705985, -776315, -590021, --216359, 78920, 310311, 594316, 802085, 790274, 652835, 476741, 187368, }, -{ -22941568, -60834992, 94597728, 135659232, 151335328, 93556200, -15516643, -96951904, -125620280, -154287040, -207301968, --228418704, -174931328, -95768104, -61450780, -67413272, -64889440, -49018460, -53573276, -80212808, -94167696, --85941760, -86875912, -117151136, -155600224, -170909104, -157015952, -129109400, -103067400, -85586888, -71761384, --48570176, -10253161, 29126858, 47252692, 37082212, 10780368, -17792438, -44844292, -71080096, -94165008, --110759688, -121372552, -130140728, -141675936, -159057136, -183318336, -214228672, -251893392, -296846112, -347995968, --401685216, -453714432, -501417024, -543284928, -578109568, -605895872, -628941056, -650780416, -674133760, -700343296, --730119744, -763450816, -798361408, -830556992, -855029760, -867926976, -866865088, -850513600, -819124864, -775252864, --722731328, -664644608, -602938240, -539823168, -478321376, -420980896, -368797024, -321822976, -280324448, -245082112, --217063360, -197146512, -185978528, -183895472, -190771168, -205554448, -226081712, -250233920, -277758208, -310404256, --350039296, -397613568, -454370496, -522581024, -603616832, -695994112, -796599936, -903032960, -1012979328, -1121766528, --1222814720, -1311025920, -1384092928, -1440244224, -1477094528, -1494116608, -1494412928, -1482181376, -1459547520, -1427511296, --1388589824, -1346003072, -1300631040, -1251070336, -1196795264, -1139278720, -1079781632, -1018152064, -954703040, -891668480, --831614144, -775381696, -722612672, -673521728, -628960384, -589041856, -552887360, -520006720, -491207360, -467731072, --449969760, -437531008, -430267680, -428568480, -432568160, -441643424, -454992192, -472407200, -494080704, -519696960, --547997056, -577340800, -606388160, -633769664, -657122496, -673232384, -679566400, -675043776, -658866240, -629654528, --586888512, -532360128, -468847232, -398032864, -321164224, -240938000, -160777808, -82597592, -7059853, 64257004, -128806608, 185087328, 233052448, 272529632, 302702848, 323317088, 335299520, 340011616, 338508384, 331614976, -320457696, 306831936, 292658528, 278890496, 265742512, 254260448, 246242816, 242156704, 241125376, 243671744, -251926144, 266340592, 285317376, 308789888, 338100896, 371314432, 403117056, 429964896, 449832320, 456690848, -442260288, 403697920, 342134400, 255046432, 140796000, 9450002, -123436824, -249365808, -352794528, -388898560, --312111520, -143997904, 17201344, 83570936, 59500328, 15437723, -1094143, 1642288, 1639067, -1799591, --961536, 1548873, 506806, -1336272, -270046, 1126892, 141734, -891743, 17717, 785442, --37044, -605054, 112743, 501974, -137976, -407485, 129386, 281320, -176094, -251256, -115964, 123480, -159451, -115427, 89657, 18254, -98247, 2684, 48318, }, -}, -{ -{ --4357781, --15616501, -30627412, -43881144, -49493592, -45687716, -24834574, 32756104, 132964136, 236001472, 278151200, -234555136, 138744624, 37156300, -46155868, -96170224, -98129264, -59395104, -9983115, 32935956, 73852496, -105064560, 99138584, 48845052, -16016470, -64116884, -87776784, -86431384, -57499948, -14449881, 14837501, -18675592, 7561290, -14667313, -59650116, -128861368, -203432736, -266602048, -317439424, -358831104, -389818208, --413140416, -435458688, -457594400, -475116256, -487643616, -498576448, -508736736, -518301088, -530641056, -547201408, --563499200, -576024896, -587904256, -603265216, -621687936, -641835072, -664708992, -689980032, -714076416, -734508096, --752373568, -769566336, -786965248, -805674688, -827064704, -851393536, -877783424, -904528704, -928722816, -947569088, --960526464, -968117312, -969178688, -962167168, -948336320, -930310848, -908301312, -880925696, -848764992, -814003136, --777668800, -740189824, -703618176, -670610304, -641908096, -616688064, -594530304, -575577152, -559538688, -545531712, --532376768, -518926016, -504799840, -490573856, -476650112, -462685024, -448691488, -435484448, -423228768, -410814144, --397389152, -383203968, -368334240, -351987072, -333742592, -314279392, -294420000, -274476864, -254796256, -236030464, --218706720, -203103632, -189430064, -177678496, -167604112, -159153776, -152452544, -147246512, -142963360, -139410880, --136809200, -135170144, -134270336, -134177464, -135288784, -138003200, -142755056, -150127360, -160649488, -174779392, --193083472, -215875792, -242649552, -272467904, -304807392, -339312608, -374917344, -410167776, -444380928, -477570848, --509230112, -538187328, -563902336, -586957760, -607890368, -626362432, -642089536, -655882304, -668904640, -681289216, --692395968, -702260416, -711722816, -720979008, -729036864, -735027840, -739143488, -741636672, -741602880, -737625728, --729266688, -716956736, -700395904, -678032512, -648656576, -612586880, -570266432, -520494208, -461707360, -394449248, --320360000, -239108880, -149194816, -51655036, 50466940, 156328752, 266896784, 380279104, 492131840, 600777856, -706555968, 806222784, 894021056, 967654528, 1026274944, 1063700736, 1071413440, 1046386624, 987673344, 889303040, -747161088, 568291840, 362638592, 134009960, -106979048, -332635552, -517338464, -648572800, -695149056, -595534272, --334001888, -20295868, 172842368, 174538880, 74892952, 2940442, -6116034, 3243774, 536871, -3659849, -205085, 2843268, -568546, -2236067, 668404, 1739999, -687195, -1341104, 701153, 1087164, --616328, -816044, 590021, 648540, -517544, -494458, 443455, 347892, -408559, -276489, -308701, 145492, -290984, -108985, 195958, 7516, -166430, 34360, 97174, }, -{ --69783016, --199971536, -310595392, -391509344, -410424384, -341338752, -220779568, -138907840, -162189776, -282055328, -432248736, --532211936, -528276160, -431201824, -313920768, -246209008, -234605616, -242493312, -246754464, -242492240, -212146688, --135220064, -27264452, 66219804, 119115552, 144776368, 168390640, 202259136, 248485872, 304710208, 361405376, -404982144, 426869824, 425519040, 403979264, 371348768, 340884576, 319475232, 301885184, 278762176, 246195584, -205628000, 160109408, 113309824, 67929736, 23271744, -22824530, -69941928, -115888416, -160149664, -203430048, --245286112, -284792832, -321529856, -353703968, -377589888, -390746464, -393658464, -387155328, -370846272, -345016864, --311447936, -271611584, -226304512, -177214112, -126466384, -74490840, -20390358, 35524212, 91066728, 143629616, -190960144, 231159440, 263330880, 287973248, 305897248, 317057696, 320815808, 316798944, 305198752, 286624640, -261830336, 231468672, 196347648, 157979632, 118393456, 79318920, 41998336, 7539278, -23330262, -50640884, --74534864, -94525784, -110122960, -121693064, -129915248, -134911904, -136685184, -135825120, -133061312, -128692256, --123075512, -117087784, -111551040, -106692360, -102533216, -99270656, -96970160, -95349344, -94065152, -92896920, --91614872, -89897424, -87315072, -83257944, -77060840, -68273872, -56595856, -41711112, -23567022, -2640331, -20503100, 45624900, 72381472, 99876784, 127154120, 153659968, 178721648, 201124192, 219794944, 234370992, -244561888, 249531152, 248457952, 241128592, 227431408, 206856368, 179084032, 144575040, 104046120, 57863412, -6546604, -48497160, -105292200, -161998656, -216730496, -266991280, -310002144, -343559808, -366076160, -376005600, --372055296, -354064224, -323047584, -280337888, -227390064, -166443408, -100478072, -32240172, 36025112, 101848704, -162506000, 215946656, 260997104, 296530432, 321288256, 334612320, 336531104, 327058016, 306174272, 274521440, -233450256, 184480112, 129268848, 69917232, 8820789, -51598664, -108862928, -160553936, -204564992, -238923120, --261717056, -271722720, -268565920, -251806960, -220931504, -176865680, -122199872, -59592672, 7924752, 74658344, -133093520, 177590448, 204240720, 207763680, 184013040, 135966320, 71502080, -3244848, -78216184, -128000760, --123941480, -68201400, -3135863, 27491548, 20126754, 3505767, -1666447, 785979, 1134408, -297963, -426812, 1980517, 1751273, 1092532, 1852742, 2781528, 2525441, 2199560, 2792803, 3315178, -3042448, 2836826, 3216394, 3432753, 3126736, 2936684, 3098819, 3076270, 2731599, 2509335, -2474438, 2274722, 1906429, 1642288, 1448478, 1138703, 780610, 486942, 178241, }, -}, -{ -{ --69783016, --199971536, -310595392, -391509344, -410424384, -341338752, -220779568, -138907840, -162189776, -282055328, -432248736, --532211936, -528276160, -431201824, -313920768, -246209008, -234605616, -242493312, -246754464, -242492240, -212146688, --135220064, -27264452, 66219804, 119115552, 144776368, 168390640, 202259136, 248485872, 304710208, 361405376, -404982144, 426869824, 425519040, 403979264, 371348768, 340884576, 319475232, 301885184, 278762176, 246195584, -205628000, 160109408, 113309824, 67929736, 23271744, -22824530, -69941928, -115888416, -160149664, -203430048, --245286112, -284792832, -321529856, -353703968, -377589888, -390746464, -393658464, -387155328, -370846272, -345016864, --311447936, -271611584, -226304512, -177214112, -126466384, -74490840, -20390358, 35524212, 91066728, 143629616, -190960144, 231159440, 263330880, 287973248, 305897248, 317057696, 320815808, 316798944, 305198752, 286624640, -261830336, 231468672, 196347648, 157979632, 118393456, 79318920, 41998336, 7539278, -23330262, -50640884, --74534864, -94525784, -110122960, -121693064, -129915248, -134911904, -136685184, -135825120, -133061312, -128692256, --123075512, -117087784, -111551040, -106692360, -102533216, -99270656, -96970160, -95349344, -94065152, -92896920, --91614872, -89897424, -87315072, -83257944, -77060840, -68273872, -56595856, -41711112, -23567022, -2640331, -20503100, 45624900, 72381472, 99876784, 127154120, 153659968, 178721648, 201124192, 219794944, 234370992, -244561888, 249531152, 248457952, 241128592, 227431408, 206856368, 179084032, 144575040, 104046120, 57863412, -6546604, -48497160, -105292200, -161998656, -216730496, -266991280, -310002144, -343559808, -366076160, -376005600, --372055296, -354064224, -323047584, -280337888, -227390064, -166443408, -100478072, -32240172, 36025112, 101848704, -162506000, 215946656, 260997104, 296530432, 321288256, 334612320, 336531104, 327058016, 306174272, 274521440, -233450256, 184480112, 129268848, 69917232, 8820789, -51598664, -108862928, -160553936, -204564992, -238923120, --261717056, -271722720, -268565920, -251806960, -220931504, -176865680, -122199872, -59592672, 7924752, 74658344, -133093520, 177590448, 204240720, 207763680, 184013040, 135966320, 71502080, -3244848, -78216184, -128000760, --123941480, -68201400, -3135863, 27491548, 20126754, 3505767, -1666447, 785979, 1134408, -297963, -426812, 1980517, 1751273, 1092532, 1852742, 2781528, 2525441, 2199560, 2792803, 3315178, -3042448, 2836826, 3216394, 3432753, 3126736, 2936684, 3098819, 3076270, 2731599, 2509335, -2474438, 2274722, 1906429, 1642288, 1448478, 1138703, 780610, 486942, 178241, }, -{ --4357781, --15616501, -30627412, -43881144, -49493592, -45687716, -24834574, 32756104, 132964136, 236001472, 278151200, -234555136, 138744624, 37156300, -46155868, -96170224, -98129264, -59395104, -9983115, 32935956, 73852496, -105064560, 99138584, 48845052, -16016470, -64116884, -87776784, -86431384, -57499948, -14449881, 14837501, -18675592, 7561290, -14667313, -59650116, -128861368, -203432736, -266602048, -317439424, -358831104, -389818208, --413140416, -435458688, -457594400, -475116256, -487643616, -498576448, -508736736, -518301088, -530641056, -547201408, --563499200, -576024896, -587904256, -603265216, -621687936, -641835072, -664708992, -689980032, -714076416, -734508096, --752373568, -769566336, -786965248, -805674688, -827064704, -851393536, -877783424, -904528704, -928722816, -947569088, --960526464, -968117312, -969178688, -962167168, -948336320, -930310848, -908301312, -880925696, -848764992, -814003136, --777668800, -740189824, -703618176, -670610304, -641908096, -616688064, -594530304, -575577152, -559538688, -545531712, --532376768, -518926016, -504799840, -490573856, -476650112, -462685024, -448691488, -435484448, -423228768, -410814144, --397389152, -383203968, -368334240, -351987072, -333742592, -314279392, -294420000, -274476864, -254796256, -236030464, --218706720, -203103632, -189430064, -177678496, -167604112, -159153776, -152452544, -147246512, -142963360, -139410880, --136809200, -135170144, -134270336, -134177464, -135288784, -138003200, -142755056, -150127360, -160649488, -174779392, --193083472, -215875792, -242649552, -272467904, -304807392, -339312608, -374917344, -410167776, -444380928, -477570848, --509230112, -538187328, -563902336, -586957760, -607890368, -626362432, -642089536, -655882304, -668904640, -681289216, --692395968, -702260416, -711722816, -720979008, -729036864, -735027840, -739143488, -741636672, -741602880, -737625728, --729266688, -716956736, -700395904, -678032512, -648656576, -612586880, -570266432, -520494208, -461707360, -394449248, --320360000, -239108880, -149194816, -51655036, 50466940, 156328752, 266896784, 380279104, 492131840, 600777856, -706555968, 806222784, 894021056, 967654528, 1026274944, 1063700736, 1071413440, 1046386624, 987673344, 889303040, -747161088, 568291840, 362638592, 134009960, -106979048, -332635552, -517338464, -648572800, -695149056, -595534272, --334001888, -20295868, 172842368, 174538880, 74892952, 2940442, -6116034, 3243774, 536871, -3659849, -205085, 2843268, -568546, -2236067, 668404, 1739999, -687195, -1341104, 701153, 1087164, --616328, -816044, 590021, 648540, -517544, -494458, 443455, 347892, -408559, -276489, -308701, 145492, -290984, -108985, 195958, 7516, -166430, 34360, 97174, }, -}, -{ -{ -4396973, -18730352, 43955768, 62520228, 36020816, -44321380, -122355032, -133907416, -89308480, -52676164, -46959560, --35172024, 995896, 22633940, -6811818, -70629128, -132929776, -187501632, -245622736, -301632864, -338469184, --353582656, -358535264, -360587200, -358735008, -352565280, -344896608, -337896896, -331250976, -322315808, -307475104, --286514048, -264907680, -248241600, -235557488, -221265440, -201784544, -177688704, -151782528, -127838088, -109232832, --96672736, -88565984, -84239344, -84811648, -90858424, -101595304, -116348520, -134488848, -153815120, -170888688, --183136864, -189838624, -191920608, -191799280, -192611024, -196889888, -206453712, -223010816, -247206512, -277297600, --310380096, -344601344, -378737728, -410577920, -437911104, -460739936, -480709920, -498734816, -514743232, -529178624, --542961152, -555994816, -566950208, -574567296, -578352256, -578027456, -573051200, -563112640, -549016512, -532708544, --516039776, -499600800, -483089344, -466339488, -449094144, -430101792, -407705152, -381528928, -352745664, -322786112, --292707392, -263698112, -237151984, -214081568, -195071504, -180745648, -171941504, -169715088, -175369952, -189889632, --213101248, -243979376, -281717120, -325589120, -373912864, -424414720, -475792192, -527720480, -579196736, -628193216, --673297344, -714438848, -751509760, -783385920, -809055872, -828938368, -844243456, -855476928, -862441216, -865578688, --866344832, -865804736, -863600320, -858992384, -852285824, -844150592, -833970432, -820226560, -802486720, -781642688, --758091264, -731185984, -700930624, -668854208, -636547456, -604441472, -572702720, -542376512, -514803904, -490429952, --468853664, -449801184, -433525408, -420207264, -409284608, -399728864, -390993952, -383223296, -376250400, -369016064, --360573248, -351062560, -340871168, -329410048, -315708544, -299783360, -282321088, -263283104, -241879136, -217813904, --191608160, -163595840, -133328136, -100234336, -64467996, -26707180, 12809203, 54536420, 98570576, 143910928, -189559456, 235761488, 282941184, 330004896, 375307680, 418653536, 460329760, 498804064, 531752384, 558711872, -580073472, 594267264, 598866112, 593451712, 578232000, 551137152, 509791680, 454804288, 387670720, 307864320, -216058864, 117309512, 16954384, -82486992, -175775296, -252181152, -303696608, -327520800, -313098816, -241155968, --115031576, 14910516, 83878024, 74836048, 30868466, 2026151, -1671279, 1275068, -20401, -1331977, -242129, 1015760, -345745, -801548, 348429, 621697, -330712, -469225, 333934, 392453, --280247, -284542, 272194, 230318, -237834, -175020, 202937, 114354, -195421, -97711, -143345, 34360, -147640, -31139, 97711, -19864, -92342, 31675, 59593, }, -{ --99617472, --286525856, -426918144, -479716704, -432016800, -323711680, -220421472, -155266832, -104122352, -23704998, 92558696, -205582368, 273793952, 292715456, 287555584, 276731712, 253248448, 200025760, 114359944, 13984414, -76767712, --143746656, -188256464, -218978368, -239801440, -245534688, -228605008, -187522032, -127440272, -55115168, 22870164, -97539248, 157715488, 195234720, 208737552, 201576240, 177796608, 141271136, 96886408, 50203872, 5709622, --33995204, -67701032, -95033128, -116073640, -130764040, -138548672, -138680192, -130588480, -113732880, -87506200, --51908436, -8606041, 38646116, 84669376, 124226024, 153222960, 169042928, 170094128, 155477824, 125430224, -82081656, 29616484, -26425860, -80192944, -126371896, -160656480, -179832960, -181643296, -164823136, -129660232, --78935056, -18505940, 43240656, 97167192, 135631312, 154242480, 152633472, 134172096, 104647416, 70279624, -35944044, 4480188, -22913114, -45918568, -64495912, -78462608, -87238304, -89910848, -85651312, -74275016, --56666724, -34820372, -11373610, 11130408, 30785788, 46446312, 57597124, 64184528, 66410932, 64531884, -58780384, 49432928, 36874440, 21636434, 4475893, -13545253, -31093416, -46683072, -58814744, -66160212, --67793376, -63361504, -53129820, -37984692, -19406810, 711354, 20378010, 37780144, 51434916, 60302952, -63837172, 61920008, 54761368, 42888468, 27187142, 8901320, -10379862, -28739774, -44103408, -54607824, --58997280, -56868052, -48755396, -36053568, -20711406, -4804458, 9823127, 21776558, 30251602, 35050692, -36432060, 34912716, 31146030, 25813828, 19491098, 12600897, 5487358, -1540820, -8236674, -14373645, --19656992, -23740968, -26317412, -27138288, -26007100, -22863722, -17864380, -11331734, -3701725, 4446902, -12408697, 19478750, 25026774, 28495498, 29480118, 27852862, 23748484, 17478906, 9565429, 723702, --8311299, -16871168, -24227910, -29619706, -32505924, -32583232, -29544544, -23179938, -13749264, -1946694, -11372000, 24927454, 36624260, 44075492, 45504640, 39842800, 26695906, 7341173, -14562623, -34248068, --47577500, -51240032, -43075836, -24232206, -117575, 22448184, 37966436, 41439456, 29064044, 4553739, --17837536, -23693724, -13037373, 359167, 5138392, 2745558, 555661, 988916, 1490354, 879931, -510027, 812286, 741419, 117575, -214748, -168577, -386010, -847182, -1012002, -918049, --975494, -1106491, -983011, -702227, -527207, -376347, -74088, 267362, 491237, 669478, -882616, 1039382, 1072668, 1042066, 981937, 848793, 638876, 394600, 134755, }, -}, -{ -{ --99617472, --286525856, -426918144, -479716704, -432016800, -323711680, -220421472, -155266832, -104122352, -23704998, 92558696, -205582368, 273793952, 292715456, 287555584, 276731712, 253248448, 200025760, 114359944, 13984414, -76767712, --143746656, -188256464, -218978368, -239801440, -245534688, -228605008, -187522032, -127440272, -55115168, 22870164, -97539248, 157715488, 195234720, 208737552, 201576240, 177796608, 141271136, 96886408, 50203872, 5709622, --33995204, -67701032, -95033128, -116073640, -130764040, -138548672, -138680192, -130588480, -113732880, -87506200, --51908436, -8606041, 38646116, 84669376, 124226024, 153222960, 169042928, 170094128, 155477824, 125430224, -82081656, 29616484, -26425860, -80192944, -126371896, -160656480, -179832960, -181643296, -164823136, -129660232, --78935056, -18505940, 43240656, 97167192, 135631312, 154242480, 152633472, 134172096, 104647416, 70279624, -35944044, 4480188, -22913114, -45918568, -64495912, -78462608, -87238304, -89910848, -85651312, -74275016, --56666724, -34820372, -11373610, 11130408, 30785788, 46446312, 57597124, 64184528, 66410932, 64531884, -58780384, 49432928, 36874440, 21636434, 4475893, -13545253, -31093416, -46683072, -58814744, -66160212, --67793376, -63361504, -53129820, -37984692, -19406810, 711354, 20378010, 37780144, 51434916, 60302952, -63837172, 61920008, 54761368, 42888468, 27187142, 8901320, -10379862, -28739774, -44103408, -54607824, --58997280, -56868052, -48755396, -36053568, -20711406, -4804458, 9823127, 21776558, 30251602, 35050692, -36432060, 34912716, 31146030, 25813828, 19491098, 12600897, 5487358, -1540820, -8236674, -14373645, --19656992, -23740968, -26317412, -27138288, -26007100, -22863722, -17864380, -11331734, -3701725, 4446902, -12408697, 19478750, 25026774, 28495498, 29480118, 27852862, 23748484, 17478906, 9565429, 723702, --8311299, -16871168, -24227910, -29619706, -32505924, -32583232, -29544544, -23179938, -13749264, -1946694, -11372000, 24927454, 36624260, 44075492, 45504640, 39842800, 26695906, 7341173, -14562623, -34248068, --47577500, -51240032, -43075836, -24232206, -117575, 22448184, 37966436, 41439456, 29064044, 4553739, --17837536, -23693724, -13037373, 359167, 5138392, 2745558, 555661, 988916, 1490354, 879931, -510027, 812286, 741419, 117575, -214748, -168577, -386010, -847182, -1012002, -918049, --975494, -1106491, -983011, -702227, -527207, -376347, -74088, 267362, 491237, 669478, -882616, 1039382, 1072668, 1042066, 981937, 848793, 638876, 394600, 134755, }, -{ -4396973, -18730352, 43955768, 62520228, 36020816, -44321380, -122355032, -133907416, -89308480, -52676164, -46959560, --35172024, 995896, 22633940, -6811818, -70629128, -132929776, -187501632, -245622736, -301632864, -338469184, --353582656, -358535264, -360587200, -358735008, -352565280, -344896608, -337896896, -331250976, -322315808, -307475104, --286514048, -264907680, -248241600, -235557488, -221265440, -201784544, -177688704, -151782528, -127838088, -109232832, --96672736, -88565984, -84239344, -84811648, -90858424, -101595304, -116348520, -134488848, -153815120, -170888688, --183136864, -189838624, -191920608, -191799280, -192611024, -196889888, -206453712, -223010816, -247206512, -277297600, --310380096, -344601344, -378737728, -410577920, -437911104, -460739936, -480709920, -498734816, -514743232, -529178624, --542961152, -555994816, -566950208, -574567296, -578352256, -578027456, -573051200, -563112640, -549016512, -532708544, --516039776, -499600800, -483089344, -466339488, -449094144, -430101792, -407705152, -381528928, -352745664, -322786112, --292707392, -263698112, -237151984, -214081568, -195071504, -180745648, -171941504, -169715088, -175369952, -189889632, --213101248, -243979376, -281717120, -325589120, -373912864, -424414720, -475792192, -527720480, -579196736, -628193216, --673297344, -714438848, -751509760, -783385920, -809055872, -828938368, -844243456, -855476928, -862441216, -865578688, --866344832, -865804736, -863600320, -858992384, -852285824, -844150592, -833970432, -820226560, -802486720, -781642688, --758091264, -731185984, -700930624, -668854208, -636547456, -604441472, -572702720, -542376512, -514803904, -490429952, --468853664, -449801184, -433525408, -420207264, -409284608, -399728864, -390993952, -383223296, -376250400, -369016064, --360573248, -351062560, -340871168, -329410048, -315708544, -299783360, -282321088, -263283104, -241879136, -217813904, --191608160, -163595840, -133328136, -100234336, -64467996, -26707180, 12809203, 54536420, 98570576, 143910928, -189559456, 235761488, 282941184, 330004896, 375307680, 418653536, 460329760, 498804064, 531752384, 558711872, -580073472, 594267264, 598866112, 593451712, 578232000, 551137152, 509791680, 454804288, 387670720, 307864320, -216058864, 117309512, 16954384, -82486992, -175775296, -252181152, -303696608, -327520800, -313098816, -241155968, --115031576, 14910516, 83878024, 74836048, 30868466, 2026151, -1671279, 1275068, -20401, -1331977, -242129, 1015760, -345745, -801548, 348429, 621697, -330712, -469225, 333934, 392453, --280247, -284542, 272194, 230318, -237834, -175020, 202937, 114354, -195421, -97711, -143345, 34360, -147640, -31139, 97711, -19864, -92342, 31675, 59593, }, -}, -{ -{ -294205, -8901857, 28864864, 39342436, 13937706, -47083580, -111196168, -146788016, -153042576, -147262624, -134354624, --107734424, -75171056, -61331596, -80488224, -123064232, -173706192, -227136128, -279479968, -318843328, -336521952, --339959008, -344491808, -356248736, -370266432, -381413504, -389552448, -395492384, -398438208, -398182656, -395899872, --391819136, -384272320, -371361664, -351976320, -325347008, -291679296, -253915248, -217424128, -186781680, -163319360, --146260816, -135214160, -130368904, -130834368, -134310064, -138643696, -142857584, -146631792, -149753696, -152409600, --155440768, -160096512, -167755520, -179548416, -195720048, -215495696, -237803216, -261634912, -285511712, -307542752, --326749824, -343719264, -359359904, -373625120, -385901728, -395743104, -402390112, -404216000, -399577440, -388097536, --370758208, -349199104, -325402816, -301640928, -279964768, -261452384, -245954528, -232490880, -219916288, -207399680, --194486320, -180918512, -166608768, -151734208, -136620224, -121469192, -106369160, -91516088, -77255184, -63954212, --51991652, -41852844, -34239480, -30183956, -30968862, -37641632, -50665044, -70217880, -96439736, -128817344, --165670304, -205029920, -245914800, -288069376, -330800544, -373101120, -414799360, -456399872, -497562304, -536742048, --572604480, -604822656, -633069568, -656218368, -673303232, -684666112, -691340480, -693680704, -691445184, -685094016, --676069184, -665548672, -653697792, -640570752, -626994880, -613774464, -600480448, -585917824, -569544320, -551551616, --531744320, -509446464, -484738048, -458893088, -433236576, -408261344, -384195040, -361766176, -341875648, -324845568, --310456352, -298596320, -289516224, -283392128, -279850944, -278159264, -277859680, -278895296, -280965472, -283144096, --284521184, -284876064, -284215168, -281956544, -277226176, -269789984, -260008736, -247893696, -232882784, -214655488, --193558064, -169964208, -143662368, -114285320, -82115480, -47969952, -12283070, 25144886, 64223720, 104003704, -143587744, 182995664, 222292480, 260444672, 296157856, 329288160, 360096512, 387627776, 410374464, 428013344, -440756512, 447537728, 446730272, 438046400, 421747520, 396788928, 361954624, 317939776, 266154288, 206862800, -140971568, 71972912, 3565360, -62324808, -122405496, -170344848, -201553696, -214717232, -204053904, -158424704, --79753248, 1994476, 47517908, 45334452, 20262046, 2575907, -511101, 807454, 5906, -761283, -128312, 577673, -195958, -460635, 197569, 360240, -182536, -265214, 192737, 229244, --154619, -161061, 154082, 132070, -134218, -102542, 110059, 62814, -112206, -61203, -74088, 16643, -84826, -23085, 49392, -11811, -51540, 14496, 30602, }, -{ --71337800, --213465776, -339793664, -413543616, -409479488, -353031808, -305707168, -298885696, -300287456, -264226384, -195696432, --136379712, -100566120, -60322280, 7445863, 92119536, 172758624, 241801296, 295369728, 323153344, 321709696, -303267104, 280336800, 251828960, 211822416, 162183328, 108903192, 53142168, -7278896, -71462888, -134384160, --189267936, -229497824, -251617440, -257608384, -251723744, -235261136, -207125328, -168757856, -125397472, -82674896, --44142064, -11410654, 15624554, 38577396, 59280212, 78995720, 99249176, 121977072, 147628224, 173745392, -195907952, 209443536, 210543584, 197508896, 171792256, 137052944, 96641056, 52245592, 4629975, -45239428, --95707976, -144094000, -186567472, -218991792, -238354048, -243538608, -235136576, -214888496, -184976192, -147172960, --102447856, -51600812, 3540127, 59476708, 111452256, 154566208, 185071744, 201401760, 204407152, 196513008, -180407952, 158314112, 132102456, 103480792, 73781096, 43827992, 14254996, -14263050, -41233832, -66497368, --89908160, -111083424, -129520104, -144553568, -154997312, -159221424, -155894960, -144507392, -125213864, -98698888, --66384624, -30321932, 7365332, 44700944, 79597552, 109910360, 133930504, 150538064, 158915408, 158564288, -149662432, 133052184, 109883520, 81576464, 50009524, 17294222, -14701673, -44412648, -70369280, -91344824, --106646184, -115988816, -119189640, -116235776, -107519672, -93766656, -75855568, -54942832, -32583770, -10457708, -10011032, 27708982, 41794864, 51884280, 58184460, 61274688, 61807800, 60452740, 57889716, 54622320, -50830936, 46487116, 41490456, 35638028, 28609850, 20147692, 10214506, -1030255, -13279502, -26003342, --38427608, -49677740, -58929100, -65435436, -68561640, -67904504, -63380832, -55185496, -43737800, -29694868, --13953275, 2471754, 18584860, 33456722, 46217068, 56118044, 62656592, 65594888, 64864208, 60536492, -52914532, 42531988, 29978334, 15844671, 871342, -14052059, -28158880, -40861244, -51453172, -59042916, --62928252, -62682900, -57788784, -47746076, -32801202, -14114873, 6833293, 28235652, 47299936, 60724932, -66258460, 63038308, 50745040, 30215094, 5039608, -19430968, -38898444, -49840948, -47437912, -29073170, --1954210, 18064632, 20342576, 9911711, 258772, -1879048, -155693, 432718, -141197, -37581, -459562, 310848, -67646, 66035, 318364, 149787, -82678, 21475, 147640, 0, --147103, -73551, -13422, -125091, -211527, -157303, -125091, -194347, -232465, -185220, --158377, -187368, -188442, -140660, -110059, -110059, -88047, -37581, -5906, }, -}, -{ -{ --71337800, --213465776, -339793664, -413543616, -409479488, -353031808, -305707168, -298885696, -300287456, -264226384, -195696432, --136379712, -100566120, -60322280, 7445863, 92119536, 172758624, 241801296, 295369728, 323153344, 321709696, -303267104, 280336800, 251828960, 211822416, 162183328, 108903192, 53142168, -7278896, -71462888, -134384160, --189267936, -229497824, -251617440, -257608384, -251723744, -235261136, -207125328, -168757856, -125397472, -82674896, --44142064, -11410654, 15624554, 38577396, 59280212, 78995720, 99249176, 121977072, 147628224, 173745392, -195907952, 209443536, 210543584, 197508896, 171792256, 137052944, 96641056, 52245592, 4629975, -45239428, --95707976, -144094000, -186567472, -218991792, -238354048, -243538608, -235136576, -214888496, -184976192, -147172960, --102447856, -51600812, 3540127, 59476708, 111452256, 154566208, 185071744, 201401760, 204407152, 196513008, -180407952, 158314112, 132102456, 103480792, 73781096, 43827992, 14254996, -14263050, -41233832, -66497368, --89908160, -111083424, -129520104, -144553568, -154997312, -159221424, -155894960, -144507392, -125213864, -98698888, --66384624, -30321932, 7365332, 44700944, 79597552, 109910360, 133930504, 150538064, 158915408, 158564288, -149662432, 133052184, 109883520, 81576464, 50009524, 17294222, -14701673, -44412648, -70369280, -91344824, --106646184, -115988816, -119189640, -116235776, -107519672, -93766656, -75855568, -54942832, -32583770, -10457708, -10011032, 27708982, 41794864, 51884280, 58184460, 61274688, 61807800, 60452740, 57889716, 54622320, -50830936, 46487116, 41490456, 35638028, 28609850, 20147692, 10214506, -1030255, -13279502, -26003342, --38427608, -49677740, -58929100, -65435436, -68561640, -67904504, -63380832, -55185496, -43737800, -29694868, --13953275, 2471754, 18584860, 33456722, 46217068, 56118044, 62656592, 65594888, 64864208, 60536492, -52914532, 42531988, 29978334, 15844671, 871342, -14052059, -28158880, -40861244, -51453172, -59042916, --62928252, -62682900, -57788784, -47746076, -32801202, -14114873, 6833293, 28235652, 47299936, 60724932, -66258460, 63038308, 50745040, 30215094, 5039608, -19430968, -38898444, -49840948, -47437912, -29073170, --1954210, 18064632, 20342576, 9911711, 258772, -1879048, -155693, 432718, -141197, -37581, -459562, 310848, -67646, 66035, 318364, 149787, -82678, 21475, 147640, 0, --147103, -73551, -13422, -125091, -211527, -157303, -125091, -194347, -232465, -185220, --158377, -187368, -188442, -140660, -110059, -110059, -88047, -37581, -5906, }, -{ -294205, -8901857, 28864864, 39342436, 13937706, -47083580, -111196168, -146788016, -153042576, -147262624, -134354624, --107734424, -75171056, -61331596, -80488224, -123064232, -173706192, -227136128, -279479968, -318843328, -336521952, --339959008, -344491808, -356248736, -370266432, -381413504, -389552448, -395492384, -398438208, -398182656, -395899872, --391819136, -384272320, -371361664, -351976320, -325347008, -291679296, -253915248, -217424128, -186781680, -163319360, --146260816, -135214160, -130368904, -130834368, -134310064, -138643696, -142857584, -146631792, -149753696, -152409600, --155440768, -160096512, -167755520, -179548416, -195720048, -215495696, -237803216, -261634912, -285511712, -307542752, --326749824, -343719264, -359359904, -373625120, -385901728, -395743104, -402390112, -404216000, -399577440, -388097536, --370758208, -349199104, -325402816, -301640928, -279964768, -261452384, -245954528, -232490880, -219916288, -207399680, --194486320, -180918512, -166608768, -151734208, -136620224, -121469192, -106369160, -91516088, -77255184, -63954212, --51991652, -41852844, -34239480, -30183956, -30968862, -37641632, -50665044, -70217880, -96439736, -128817344, --165670304, -205029920, -245914800, -288069376, -330800544, -373101120, -414799360, -456399872, -497562304, -536742048, --572604480, -604822656, -633069568, -656218368, -673303232, -684666112, -691340480, -693680704, -691445184, -685094016, --676069184, -665548672, -653697792, -640570752, -626994880, -613774464, -600480448, -585917824, -569544320, -551551616, --531744320, -509446464, -484738048, -458893088, -433236576, -408261344, -384195040, -361766176, -341875648, -324845568, --310456352, -298596320, -289516224, -283392128, -279850944, -278159264, -277859680, -278895296, -280965472, -283144096, --284521184, -284876064, -284215168, -281956544, -277226176, -269789984, -260008736, -247893696, -232882784, -214655488, --193558064, -169964208, -143662368, -114285320, -82115480, -47969952, -12283070, 25144886, 64223720, 104003704, -143587744, 182995664, 222292480, 260444672, 296157856, 329288160, 360096512, 387627776, 410374464, 428013344, -440756512, 447537728, 446730272, 438046400, 421747520, 396788928, 361954624, 317939776, 266154288, 206862800, -140971568, 71972912, 3565360, -62324808, -122405496, -170344848, -201553696, -214717232, -204053904, -158424704, --79753248, 1994476, 47517908, 45334452, 20262046, 2575907, -511101, 807454, 5906, -761283, -128312, 577673, -195958, -460635, 197569, 360240, -182536, -265214, 192737, 229244, --154619, -161061, 154082, 132070, -134218, -102542, 110059, 62814, -112206, -61203, -74088, 16643, -84826, -23085, 49392, -11811, -51540, 14496, 30602, }, -}, -}; -const Word32 CRendBin_Combined_HRIR_coeff_re_32kHz_fx[15][BINAURAL_CHANNELS][160] ={ -{ -{ -684059456, -694721728, 718016512, 750012416, 767910656, 747670080, 709496384, 705104256, 728998208, 697888192, 576820544, -472416352, 515254336, 682356480, 830409408, 889270848, 923931200, 1002047040, 1099221120, 1163028352, 1187355008, -1180632832, 1122951936, 1004305600, 868427904, 776772224, 747962112, 758725312, 787148864, 832611072, 903697088, -1003041280, 1119737728, 1229271680, 1305896064, 1339709312, 1339594368, 1320585344, 1291978240, 1255008768, 1207225088, -1149855616, 1092223616, 1046323264, 1016832448, 999522624, 987748544, 975616832, 956979392, 928073728, 891554688, -853911424, 819506048, 789585152, 764623872, 744581440, 728649792, 716380160, 706977920, 697330368, 683703488, -664957056, 640836480, 608352064, 563857280, 507986176, 445618976, 382620384, 325117760, 279242144, 248119184, -230435728, 223447824, 225212512, 233121696, 243301312, 252673456, 259749424, 263692736, 264762720, 264846480, -265530448, 266880672, 269439392, 275141504, 284857248, 297565536, 312960832, 332009024, 354152800, 376782464, -397825088, 416296672, 430680544, 439338112, 441985408, 438891424, 429955744, 416002464, 399061504, 380368736, -360280096, 340298304, 322299712, 306000320, 290274304, 276203456, 265722112, 258674064, 254312528, 253796064, -258285376, 266805520, 278343424, 293458464, 312182912, 333418304, 357347200, 385152256, 416348224, 449873120, -486868896, 528649792, 573701312, 620366656, 669895744, 723237056, 777981760, 831667264, 884435264, 935750976, -982277824, 1020765568, 1049322240, 1065305984, 1065594240, 1048380032, 1012002752, 954715904, 877888640, 785156544, -677219712, 553643840, 419359520, 280817856, 137423392, -13232794, -166012304, -315872832, -467536704, -625439552, --787549888, -961260928, -1156324352, -1334872064, -1404911232, -1314379776, -1130580864, -975823552, -905737728, }, -{ -520912960, -531102240, 467924352, 320982240, 180585120, 92974232, 10579578, -85890752, -130880536, -82408608, 4509179, -51402704, 27641336, -74349104, -250800320, -441627328, -549956096, -544462784, -485270112, -426719488, -358819808, --269153248, -193602096, -164174048, -157523296, -135770352, -98880344, -59730112, -2107755, 95477656, 215902640, -320955392, 400663552, 471848864, 532545888, 550145024, 502925632, 411866432, 318845472, 245655488, 186183072, -129242544, 72652056, 15991237, -45198088, -111775448, -175980912, -229606272, -271699616, -304252800, -325694880, --333088672, -326895328, -309884032, -284240928, -252203696, -216574256, -178364624, -136178912, -89264456, -39213588, -11601780, 60633664, 103889352, 136936448, 158239488, 169834816, 174414320, 173432928, 168196832, 160916848, -153850560, 148247776, 144443504, 142192416, 140497504, 137513040, 131094216, 119749592, 103401872, 83398600, -61611304, 39268884, 16295106, -8673686, -37701224, -72286448, -111843096, -153174096, -191540512, -222234496, --241382000, -246264304, -235969792, -212026432, -178160080, -139403360, -101179768, -68139120, -42813844, -25296820, --14304389, -8010114, -3761855, 1866700, 11986180, 28982976, 55339044, 93388160, 143304272, 202077136, -264642992, 324739808, 374687040, 406500416, 414440736, 395797888, 349667776, 276952384, 181587456, 69872672, --51570748, -175824688, -294516096, -398845152, -481722464, -537794304, -562765824, -554778752, -515776192, -450131904, --362942464, -260368976, -149631296, -37082212, 72688024, 175570752, 267537264, 345687424, 407858688, 451339328, -473669408, 474014080, 452224608, 408090080, 343312832, 262358608, 170016288, 70852464, -28055800, -118341384, --195563824, -257014064, -292038976, -283843648, -229665328, -154733184, -96225520, -71824200, -69452304, }, -}, -{ -{ -520912960, -531102240, 467924352, 320982240, 180585120, 92974232, 10579578, -85890752, -130880536, -82408608, 4509179, -51402704, 27641336, -74349104, -250800320, -441627328, -549956096, -544462784, -485270112, -426719488, -358819808, --269153248, -193602096, -164174048, -157523296, -135770352, -98880344, -59730112, -2107755, 95477656, 215902640, -320955392, 400663552, 471848864, 532545888, 550145024, 502925632, 411866432, 318845472, 245655488, 186183072, -129242544, 72652056, 15991237, -45198088, -111775448, -175980912, -229606272, -271699616, -304252800, -325694880, --333088672, -326895328, -309884032, -284240928, -252203696, -216574256, -178364624, -136178912, -89264456, -39213588, -11601780, 60633664, 103889352, 136936448, 158239488, 169834816, 174414320, 173432928, 168196832, 160916848, -153850560, 148247776, 144443504, 142192416, 140497504, 137513040, 131094216, 119749592, 103401872, 83398600, -61611304, 39268884, 16295106, -8673686, -37701224, -72286448, -111843096, -153174096, -191540512, -222234496, --241382000, -246264304, -235969792, -212026432, -178160080, -139403360, -101179768, -68139120, -42813844, -25296820, --14304389, -8010114, -3761855, 1866700, 11986180, 28982976, 55339044, 93388160, 143304272, 202077136, -264642992, 324739808, 374687040, 406500416, 414440736, 395797888, 349667776, 276952384, 181587456, 69872672, --51570748, -175824688, -294516096, -398845152, -481722464, -537794304, -562765824, -554778752, -515776192, -450131904, --362942464, -260368976, -149631296, -37082212, 72688024, 175570752, 267537264, 345687424, 407858688, 451339328, -473669408, 474014080, 452224608, 408090080, 343312832, 262358608, 170016288, 70852464, -28055800, -118341384, --195563824, -257014064, -292038976, -283843648, -229665328, -154733184, -96225520, -71824200, -69452304, }, -{ -684059456, -694721728, 718016512, 750012416, 767910656, 747670080, 709496384, 705104256, 728998208, 697888192, 576820544, -472416352, 515254336, 682356480, 830409408, 889270848, 923931200, 1002047040, 1099221120, 1163028352, 1187355008, -1180632832, 1122951936, 1004305600, 868427904, 776772224, 747962112, 758725312, 787148864, 832611072, 903697088, -1003041280, 1119737728, 1229271680, 1305896064, 1339709312, 1339594368, 1320585344, 1291978240, 1255008768, 1207225088, -1149855616, 1092223616, 1046323264, 1016832448, 999522624, 987748544, 975616832, 956979392, 928073728, 891554688, -853911424, 819506048, 789585152, 764623872, 744581440, 728649792, 716380160, 706977920, 697330368, 683703488, -664957056, 640836480, 608352064, 563857280, 507986176, 445618976, 382620384, 325117760, 279242144, 248119184, -230435728, 223447824, 225212512, 233121696, 243301312, 252673456, 259749424, 263692736, 264762720, 264846480, -265530448, 266880672, 269439392, 275141504, 284857248, 297565536, 312960832, 332009024, 354152800, 376782464, -397825088, 416296672, 430680544, 439338112, 441985408, 438891424, 429955744, 416002464, 399061504, 380368736, -360280096, 340298304, 322299712, 306000320, 290274304, 276203456, 265722112, 258674064, 254312528, 253796064, -258285376, 266805520, 278343424, 293458464, 312182912, 333418304, 357347200, 385152256, 416348224, 449873120, -486868896, 528649792, 573701312, 620366656, 669895744, 723237056, 777981760, 831667264, 884435264, 935750976, -982277824, 1020765568, 1049322240, 1065305984, 1065594240, 1048380032, 1012002752, 954715904, 877888640, 785156544, -677219712, 553643840, 419359520, 280817856, 137423392, -13232794, -166012304, -315872832, -467536704, -625439552, --787549888, -961260928, -1156324352, -1334872064, -1404911232, -1314379776, -1130580864, -975823552, -905737728, }, -}, -{ -{ -582648256, -618615424, 650287040, 617266816, 521306496, 465274880, 522704512, 593792128, 513081632, 305120384, 197173888, -329508288, 571484032, 701774592, 679660864, 644523712, 705061824, 827775488, 915653184, 916024704, 841901632, -739491392, 654379072, 607986432, 595271744, 606680768, 644171520, 710656000, 795550912, 878273024, 937916736, -958235136, 935579712, 884652160, 825393408, 762884992, 690409536, 611157760, 544286144, 507804736, 504527136, -524668384, 553213824, 574627968, 579268160, 568484032, 550185280, 529262368, 504625376, 474049504, 438770624, -403417696, 372625984, 347587424, 326120640, 306292384, 288215392, 271501536, 253786400, 233882976, 214194320, -197859472, 185142624, 174220512, 164078496, 155379024, 149404736, 146674736, 146163648, 146315040, 147198192, -150557392, 157327344, 166595344, 177253296, 188863664, 200782208, 212376464, 224147904, 236905568, 250129232, -262673216, 274402240, 285852096, 297302464, 309112032, 321584608, 333871968, 344540672, 353230464, 359869952, -362718592, 359478560, 349791264, 334681568, 314877472, 291924096, 269370144, 250531344, 236445472, 227508176, -225077232, 230121120, 242381648, 261755712, 288561664, 322402272, 362865696, 410612832, 465521312, 525029152, -586353216, 648246400, 708615360, 763308544, 809486464, 847227904, 876116416, 893722048, 899027904, 893719360, -878729920, 852810880, 815213760, 766653248, 707359616, 636827136, 555341440, 464146368, 365206432, 261514656, -155622768, 48023640, -60431800, -166176576, -266760960, -364360320, -460942880, -553809216, -641089344, -726464704, --812489152, -895320320, -972042880, -1045741888, -1117278336, -1180764416, -1232809216, -1276032128, -1308899328, -1324840064, --1324293632, -1308397952, -1254367232, -1122987392, -911265920, -682454208, -520263872, -454856352, -447431968, }, -{ -582648256, -618615424, 650287040, 617266816, 521306496, 465274880, 522704512, 593792128, 513081632, 305120384, 197173888, -329508288, 571484032, 701774592, 679660864, 644523712, 705061824, 827775488, 915653184, 916024704, 841901632, -739491392, 654379072, 607986432, 595271744, 606680768, 644171520, 710656000, 795550912, 878273024, 937916736, -958235136, 935579712, 884652160, 825393408, 762884992, 690409536, 611157760, 544286144, 507804736, 504527136, -524668384, 553213824, 574627968, 579268160, 568484032, 550185280, 529262368, 504625376, 474049504, 438770624, -403417696, 372625984, 347587424, 326120640, 306292384, 288215392, 271501536, 253786400, 233882976, 214194320, -197859472, 185142624, 174220512, 164078496, 155379024, 149404736, 146674736, 146163648, 146315040, 147198192, -150557392, 157327344, 166595344, 177253296, 188863664, 200782208, 212376464, 224147904, 236905568, 250129232, -262673216, 274402240, 285852096, 297302464, 309112032, 321584608, 333871968, 344540672, 353230464, 359869952, -362718592, 359478560, 349791264, 334681568, 314877472, 291924096, 269370144, 250531344, 236445472, 227508176, -225077232, 230121120, 242381648, 261755712, 288561664, 322402272, 362865696, 410612832, 465521312, 525029152, -586353216, 648246400, 708615360, 763308544, 809486464, 847227904, 876116416, 893722048, 899027904, 893719360, -878729920, 852810880, 815213760, 766653248, 707359616, 636827136, 555341440, 464146368, 365206432, 261514656, -155622768, 48023640, -60431800, -166176576, -266760960, -364360320, -460942880, -553809216, -641089344, -726464704, --812489152, -895320320, -972042880, -1045741888, -1117278336, -1180764416, -1232809216, -1276032128, -1308899328, -1324840064, --1324293632, -1308397952, -1254367232, -1122987392, -911265920, -682454208, -520263872, -454856352, -447431968, }, -}, -{ -{ -571035776, -563686528, 583248000, 635546176, 695931264, 759681984, 828763840, 865687680, 835810304, 780023488, 766391296, -783381632, 762498432, 694734592, 639146944, 620424128, 601497792, 561093440, 521875584, 493450944, 455055552, -405524384, 373608480, 369716160, 374602752, 379026560, 390569280, 400235648, 384511776, 344146080, 306105536, -285078976, 272291808, 261769136, 260373264, 270980224, 287966272, 310333408, 342275616, 380825088, 415834432, -441104416, 456541600, 462682336, 461164064, 457771040, 459094432, 468284576, 486372832, 513534752, 546620480, -579007232, 604470464, 618940736, 619525952, 605687552, 580972736, 550405952, 516585248, 480198816, 442552352, -405156608, 368293440, 332101888, 298025088, 267901808, 242780000, 223397360, 210527488, 204188656, 203466016, -207371760, 215130624, 225890576, 239159888, 255406672, 275569920, 300270816, 330058560, 365990272, 409284064, -460427488, 518904512, 583795072, 654486976, 730567488, 810844160, 892802880, 973278784, 1048897600, 1115158144, -1166228608, 1197377280, 1207286912, 1196761984, 1166163072, 1116097152, 1049787712, 972130944, 886425984, 794229120, -698117376, 601780224, 506985984, 413070624, 320269792, 231436992, 149695184, 76461152, 12737799, -39661876, --79682384, -108665896, -129199056, -142991280, -150659392, -152885808, -150864480, -145741120, -138163728, -128583264, --117925304, -107590544, -98434208, -90017144, -81393392, -72254768, -62612032, -51864416, -39275864, -25141664, --10588168, 3440269, 16223702, 26762478, 33942052, 36804648, 34439732, 26286810, 12356084, -7755101, --35396972, -71133784, -113634632, -161730208, -215634736, -274280896, -334196768, -393189760, -451771488, -509486752, --565356736, -622273664, -679333376, -715514688, -697926272, -620863296, -524469728, -457446752, -431498720, }, -{ -474638432, -398825280, 259863776, 101473968, -25419228, -112263464, -185079808, -246839280, -268340432, -242517472, -205177024, --186384400, -177214112, -161623376, -147037664, -139704016, -115777824, -44282188, 72674608, 199522176, 297173088, -342699200, 332420800, 279936832, 206128368, 123990336, 37653980, -43978316, -104869680, -137476000, -150506928, --156300304, -158835936, -157595232, -153728688, -146304304, -128659504, -94315336, -44016436, 14989436, 72971496, -119576720, 146105664, 149362320, 132602280, 102576168, 67084704, 34205656, 10243497, -3070365, -8367670, --9587978, -9785546, -10883447, -13646185, -17576080, -21606906, -25021406, -27657442, -29865056, -32603096, --37036040, -43650288, -51892332, -60308320, -66331476, -66204236, -56226492, -34737696, -3041374, 35050692, -74097848, 108104864, 132063264, 143228576, 141143360, 126728376, 101452496, 66897872, 24663850, -23181550, --73234024, -120335320, -158156272, -180484192, -182774480, -163660272, -125737312, -74950400, -18869938, 35067336, -80717464, 113876224, 132494376, 136477952, 127284576, 107568528, 80806048, 50812148, 21297670, -4530117, --24456618, -37682432, -44767516, -47110960, -46420008, -44366476, -42283952, -40926744, -40478456, -40700720, --40956272, -40189620, -37089728, -30430918, -19414326, -4001836, 14828911, 35151088, 54514948, 70483096, -81056232, 84978072, 81845968, 71956272, 56072944, 35316980, 11116986, -14876156, -40789304, -64449744, --83484504, -95661272, -99224480, -93182536, -77692736, -54348516, -25981330, 3897683, 31652298, 54102628, -69217160, 76438608, 76350024, 70198016, 59703268, 46730856, 32668058, 18297098, 4329327, -8508867, --20058034, -30340186, -37857988, -39406860, -33274722, -22494892, -13228499, -9212168, -8891656, }, -}, -{ -{ -474638432, -398825280, 259863776, 101473968, -25419228, -112263464, -185079808, -246839280, -268340432, -242517472, -205177024, --186384400, -177214112, -161623376, -147037664, -139704016, -115777824, -44282188, 72674608, 199522176, 297173088, -342699200, 332420800, 279936832, 206128368, 123990336, 37653980, -43978316, -104869680, -137476000, -150506928, --156300304, -158835936, -157595232, -153728688, -146304304, -128659504, -94315336, -44016436, 14989436, 72971496, -119576720, 146105664, 149362320, 132602280, 102576168, 67084704, 34205656, 10243497, -3070365, -8367670, --9587978, -9785546, -10883447, -13646185, -17576080, -21606906, -25021406, -27657442, -29865056, -32603096, --37036040, -43650288, -51892332, -60308320, -66331476, -66204236, -56226492, -34737696, -3041374, 35050692, -74097848, 108104864, 132063264, 143228576, 141143360, 126728376, 101452496, 66897872, 24663850, -23181550, --73234024, -120335320, -158156272, -180484192, -182774480, -163660272, -125737312, -74950400, -18869938, 35067336, -80717464, 113876224, 132494376, 136477952, 127284576, 107568528, 80806048, 50812148, 21297670, -4530117, --24456618, -37682432, -44767516, -47110960, -46420008, -44366476, -42283952, -40926744, -40478456, -40700720, --40956272, -40189620, -37089728, -30430918, -19414326, -4001836, 14828911, 35151088, 54514948, 70483096, -81056232, 84978072, 81845968, 71956272, 56072944, 35316980, 11116986, -14876156, -40789304, -64449744, --83484504, -95661272, -99224480, -93182536, -77692736, -54348516, -25981330, 3897683, 31652298, 54102628, -69217160, 76438608, 76350024, 70198016, 59703268, 46730856, 32668058, 18297098, 4329327, -8508867, --20058034, -30340186, -37857988, -39406860, -33274722, -22494892, -13228499, -9212168, -8891656, }, -{ -571035776, -563686528, 583248000, 635546176, 695931264, 759681984, 828763840, 865687680, 835810304, 780023488, 766391296, -783381632, 762498432, 694734592, 639146944, 620424128, 601497792, 561093440, 521875584, 493450944, 455055552, -405524384, 373608480, 369716160, 374602752, 379026560, 390569280, 400235648, 384511776, 344146080, 306105536, -285078976, 272291808, 261769136, 260373264, 270980224, 287966272, 310333408, 342275616, 380825088, 415834432, -441104416, 456541600, 462682336, 461164064, 457771040, 459094432, 468284576, 486372832, 513534752, 546620480, -579007232, 604470464, 618940736, 619525952, 605687552, 580972736, 550405952, 516585248, 480198816, 442552352, -405156608, 368293440, 332101888, 298025088, 267901808, 242780000, 223397360, 210527488, 204188656, 203466016, -207371760, 215130624, 225890576, 239159888, 255406672, 275569920, 300270816, 330058560, 365990272, 409284064, -460427488, 518904512, 583795072, 654486976, 730567488, 810844160, 892802880, 973278784, 1048897600, 1115158144, -1166228608, 1197377280, 1207286912, 1196761984, 1166163072, 1116097152, 1049787712, 972130944, 886425984, 794229120, -698117376, 601780224, 506985984, 413070624, 320269792, 231436992, 149695184, 76461152, 12737799, -39661876, --79682384, -108665896, -129199056, -142991280, -150659392, -152885808, -150864480, -145741120, -138163728, -128583264, --117925304, -107590544, -98434208, -90017144, -81393392, -72254768, -62612032, -51864416, -39275864, -25141664, --10588168, 3440269, 16223702, 26762478, 33942052, 36804648, 34439732, 26286810, 12356084, -7755101, --35396972, -71133784, -113634632, -161730208, -215634736, -274280896, -334196768, -393189760, -451771488, -509486752, --565356736, -622273664, -679333376, -715514688, -697926272, -620863296, -524469728, -457446752, -431498720, }, -}, -{ -{ -623941184, -612998144, 633148480, 704733824, 794866944, 861142528, 896738688, 910201280, 889980544, 827751360, 758994304, -731771712, 737631104, 721934592, 668889600, 625876032, 626539072, 639323072, 621788864, 584434432, 563421312, -560838464, 552077248, 532985568, 521658688, 522892416, 522615904, 514515616, 508313152, 512267744, 524103584, -538168000, 549766016, 554565632, 552645760, 551173184, 557714944, 573819456, 597628032, 627579008, 660887552, -693373056, 723139328, 750719488, 775102528, 793649280, 806071936, 814991488, 822795456, 830553792, 838920384, -847593024, 854729600, 858321856, 857120320, 850050240, 836670336, 818138112, 795719488, 768999936, 737601600, -703336320, 668304960, 632402240, 595015104, 557364352, 520866240, 485103680, 449674496, 416376672, 387787232, -365310048, 349864288, 342665920, 344173984, 353679296, 370430176, 393913984, 423238432, 457707136, 497588608, -542988032, 592780672, 646010304, 703274560, 765267584, 830945152, 898450240, 966795520, 1035161728, 1101150208, -1160982784, 1211281152, 1249836032, 1274607744, 1282854656, 1272239104, 1242800384, 1196652544, 1135342976, 1059082048, -969406848, 870422912, 765710016, 656083648, 542472640, 428773568, 319327072, 215629376, 118305944, 30366492, --44544180, -105779136, -154947392, -192818800, -219386400, -236027776, -245397248, -249499488, -249133344, -244873808, --237816640, -229477952, -221075920, -212865552, -204624592, -196717552, -189617440, -182404032, -173244480, -161499360, --147937472, -133030168, -116715736, -99729680, -83664352, -69962872, -59843388, -54524072, -54907936, -62049928, --77787760, -103346576, -138120784, -181814560, -235942416, -300696032, -373188640, -451458496, -535952320, -624968768, --715645696, -809665728, -902200832, -960130816, -936017280, -824557504, -686992384, -594167936, -560223744, }, -{ -486183840, -364385568, 167209520, -39768712, -210128592, -331406656, -400604480, -397778400, -302930496, -136568688, 38147364, -162939248, 224068976, 241337968, 232082848, 197511056, 137470096, 64096480, -4810900, -61295624, -109430936, --150863408, -174515264, -166983504, -129842232, -78434696, -24713242, 29495152, 81629072, 121392416, 139304576, -135256576, 114458192, 80654656, 37199784, -9960566, -54069344, -89433032, -110358112, -112567336, -97620312, --72567768, -43685188, -13019120, 18754512, 49414136, 75770736, 94334664, 100924752, 92163552, 68307696, -33571612, -5944235, -43534324, -72472744, -87923888, -88904216, -77820512, -58528056, -35112432, -11116449, -11539503, 32719598, 52619256, 70294120, 83450144, 88791472, 82500952, 61509836, 25424596, -22104050, --73134704, -116317376, -139488192, -133975064, -98616744, -40982576, 24864640, 82965344, 120606440, 131869992, -117995096, 85065584, 41168872, -5516886, -47687560, -79339320, -95991984, -95263984, -77884400, -48157320, --12965433, 20242718, 45358076, 58874336, 60375428, 52083456, 37647000, 20866562, 4893579, -8170639, --17400524, -22834730, -25062208, -24886114, -23104240, -20279762, -16602733, -11973832, -6195491, 849867, -8949101, 17289928, 24459302, 28824600, 29047400, 24502788, 15560130, 3646964, -9041980, -20107426, --27507654, -29998200, -27412092, -20667382, -11401528, -1435056, 7650948, 14740328, 19257560, 21090436, -20409684, 17514340, 12801687, 6782827, 71941, -6625524, -12513924, -16778826, -18755048, -18087182, --14814416, -9395241, -2698850, 4130685, 9968619, 13988708, 15758235, 15228880, 12757127, 9001715, -4598836, -22012, -4278325, -7080254, -7436736, -5652714, -3403225, -2173790, -1954747, }, -}, -{ -{ -486183840, -364385568, 167209520, -39768712, -210128592, -331406656, -400604480, -397778400, -302930496, -136568688, 38147364, -162939248, 224068976, 241337968, 232082848, 197511056, 137470096, 64096480, -4810900, -61295624, -109430936, --150863408, -174515264, -166983504, -129842232, -78434696, -24713242, 29495152, 81629072, 121392416, 139304576, -135256576, 114458192, 80654656, 37199784, -9960566, -54069344, -89433032, -110358112, -112567336, -97620312, --72567768, -43685188, -13019120, 18754512, 49414136, 75770736, 94334664, 100924752, 92163552, 68307696, -33571612, -5944235, -43534324, -72472744, -87923888, -88904216, -77820512, -58528056, -35112432, -11116449, -11539503, 32719598, 52619256, 70294120, 83450144, 88791472, 82500952, 61509836, 25424596, -22104050, --73134704, -116317376, -139488192, -133975064, -98616744, -40982576, 24864640, 82965344, 120606440, 131869992, -117995096, 85065584, 41168872, -5516886, -47687560, -79339320, -95991984, -95263984, -77884400, -48157320, --12965433, 20242718, 45358076, 58874336, 60375428, 52083456, 37647000, 20866562, 4893579, -8170639, --17400524, -22834730, -25062208, -24886114, -23104240, -20279762, -16602733, -11973832, -6195491, 849867, -8949101, 17289928, 24459302, 28824600, 29047400, 24502788, 15560130, 3646964, -9041980, -20107426, --27507654, -29998200, -27412092, -20667382, -11401528, -1435056, 7650948, 14740328, 19257560, 21090436, -20409684, 17514340, 12801687, 6782827, 71941, -6625524, -12513924, -16778826, -18755048, -18087182, --14814416, -9395241, -2698850, 4130685, 9968619, 13988708, 15758235, 15228880, 12757127, 9001715, -4598836, -22012, -4278325, -7080254, -7436736, -5652714, -3403225, -2173790, -1954747, }, -{ -623941184, -612998144, 633148480, 704733824, 794866944, 861142528, 896738688, 910201280, 889980544, 827751360, 758994304, -731771712, 737631104, 721934592, 668889600, 625876032, 626539072, 639323072, 621788864, 584434432, 563421312, -560838464, 552077248, 532985568, 521658688, 522892416, 522615904, 514515616, 508313152, 512267744, 524103584, -538168000, 549766016, 554565632, 552645760, 551173184, 557714944, 573819456, 597628032, 627579008, 660887552, -693373056, 723139328, 750719488, 775102528, 793649280, 806071936, 814991488, 822795456, 830553792, 838920384, -847593024, 854729600, 858321856, 857120320, 850050240, 836670336, 818138112, 795719488, 768999936, 737601600, -703336320, 668304960, 632402240, 595015104, 557364352, 520866240, 485103680, 449674496, 416376672, 387787232, -365310048, 349864288, 342665920, 344173984, 353679296, 370430176, 393913984, 423238432, 457707136, 497588608, -542988032, 592780672, 646010304, 703274560, 765267584, 830945152, 898450240, 966795520, 1035161728, 1101150208, -1160982784, 1211281152, 1249836032, 1274607744, 1282854656, 1272239104, 1242800384, 1196652544, 1135342976, 1059082048, -969406848, 870422912, 765710016, 656083648, 542472640, 428773568, 319327072, 215629376, 118305944, 30366492, --44544180, -105779136, -154947392, -192818800, -219386400, -236027776, -245397248, -249499488, -249133344, -244873808, --237816640, -229477952, -221075920, -212865552, -204624592, -196717552, -189617440, -182404032, -173244480, -161499360, --147937472, -133030168, -116715736, -99729680, -83664352, -69962872, -59843388, -54524072, -54907936, -62049928, --77787760, -103346576, -138120784, -181814560, -235942416, -300696032, -373188640, -451458496, -535952320, -624968768, --715645696, -809665728, -902200832, -960130816, -936017280, -824557504, -686992384, -594167936, -560223744, }, -}, -{ -{ -622567296, -640857984, 664247808, 709125376, 798487040, 894723840, 925620224, 886355648, 844520512, 828989888, 790468352, -702073600, 623767744, 617457408, 657030656, 679072448, 678107136, 691429632, 720630016, 731288512, 718183488, -714545088, 734450688, 749665088, 732673088, 691860736, 654373184, 635630464, 633599488, 637711360, 637620672, -633773440, 641577920, 675981120, 731671296, 787074240, 827028672, 852819968, 871151424, 883716928, 890245760, -894228864, 901254848, 914564992, 934020096, 957390080, 981779584, 1005063168, 1025992512, 1042441728, 1050861440, -1048723648, 1036472768, 1016223104, 989953984, 960034176, 929936128, 902642688, 878713792, 856679040, 834564736, -810120512, 780202816, 741334976, 691475776, 631171776, 563095424, 490937856, 418955808, 351882368, 293955072, -247446480, 212663696, 189638912, 178975584, 180624848, 192862816, 213411024, 241024976, 275355712, 315903968, -361771552, 411923872, 465059072, 519434944, 573097344, 624263296, 671999168, 717108160, 761738240, 807277760, -853147456, 898196288, 941872896, 982590784, 1016185536, 1037911040, 1045184064, 1036654272, 1009752192, 961772032, -893178176, 807686848, 709143104, 600464320, 485757568, 370975648, 261082464, 157814272, 61236568, -27743878, --107908368, -179967184, -246240672, -307747296, -363138400, -411065408, -451936864, -486216608, -512616160, -529793888, --538810624, -542039936, -540447552, -533838656, -523063136, -509843744, -494687360, -476798816, -455955872, -433068544, --409150400, -384934304, -361187424, -338605568, -317866784, -300097952, -286370688, -276776832, -271422080, -272051296, --280811936, -297940800, -322991744, -357392832, -402666080, -457149344, -517921504, -584243328, -654970176, -725584768, --793207424, -858191360, -908787712, -910023552, -830644544, -689013120, -552559872, -476109472, -454689920, }, -{ -492595168, -349920640, 129655400, -96068752, -288063456, -422139456, -462165312, -379373376, -193902208, 25130390, 207960704, -323581216, 371539904, 352447712, 261681088, 108736224, -70442296, -227034112, -323784704, -346151264, -296056928, --183744608, -29605210, 131186016, 255954288, 313229280, 295499104, 215232624, 93843960, -42829952, -164810240, --243961664, -264013248, -224482368, -137329424, -23852100, 87437480, 168374000, 202671984, 190624608, 143011680, -73127720, -5229123, -76965816, -127977680, -149385936, -139343232, -102169216, -47250008, 12343199, 63119376, -95461016, 105951472, 96411280, 71464496, 36975372, -418222, -34078420, -58865212, -72094784, -73198056, --63071056, -43987980, -19406272, 6983080, 32086090, 53277460, 67914168, 73251208, 66620848, 46097884, -12402792, -28867548, -67367096, -91574072, -93571232, -72166184, -33356864, 11688753, 50693500, 74797392, -81019728, 71504760, 50860464, 23759760, -6027450, -35191888, -59846612, -75079248, -75928040, -59625956, --27964532, 11826729, 48893908, 72848016, 77854872, 64353644, 37917044, 6492917, -22404160, -43533252, --54400056, -54780696, -46054936, -30625802, -11294690, 9214315, 28262496, 43135968, 51233592, 50516868, -39984000, 20319490, -5370320, -31572842, -51671140, -59984588, -53693532, -34106336, -6614787, 21106006, -41889888, 51274932, 48329656, 35343824, 16665547, -2943663, -19605988, -30780956, -35298188, -33326262, --26037702, -15025943, -2067490, 10809359, 21541408, 28460600, 30424474, 26890254, 18299246, 6234682, --7063611, -19175956, -27662274, -30571578, -27251568, -18436684, -5765994, 8252243, 20380156, 27853400, -29329794, 24358370, 13501230, 316217, -8907225, -10369662, -6804839, -3740380, -3008088, }, -}, -{ -{ -492595168, -349920640, 129655400, -96068752, -288063456, -422139456, -462165312, -379373376, -193902208, 25130390, 207960704, -323581216, 371539904, 352447712, 261681088, 108736224, -70442296, -227034112, -323784704, -346151264, -296056928, --183744608, -29605210, 131186016, 255954288, 313229280, 295499104, 215232624, 93843960, -42829952, -164810240, --243961664, -264013248, -224482368, -137329424, -23852100, 87437480, 168374000, 202671984, 190624608, 143011680, -73127720, -5229123, -76965816, -127977680, -149385936, -139343232, -102169216, -47250008, 12343199, 63119376, -95461016, 105951472, 96411280, 71464496, 36975372, -418222, -34078420, -58865212, -72094784, -73198056, --63071056, -43987980, -19406272, 6983080, 32086090, 53277460, 67914168, 73251208, 66620848, 46097884, -12402792, -28867548, -67367096, -91574072, -93571232, -72166184, -33356864, 11688753, 50693500, 74797392, -81019728, 71504760, 50860464, 23759760, -6027450, -35191888, -59846612, -75079248, -75928040, -59625956, --27964532, 11826729, 48893908, 72848016, 77854872, 64353644, 37917044, 6492917, -22404160, -43533252, --54400056, -54780696, -46054936, -30625802, -11294690, 9214315, 28262496, 43135968, 51233592, 50516868, -39984000, 20319490, -5370320, -31572842, -51671140, -59984588, -53693532, -34106336, -6614787, 21106006, -41889888, 51274932, 48329656, 35343824, 16665547, -2943663, -19605988, -30780956, -35298188, -33326262, --26037702, -15025943, -2067490, 10809359, 21541408, 28460600, 30424474, 26890254, 18299246, 6234682, --7063611, -19175956, -27662274, -30571578, -27251568, -18436684, -5765994, 8252243, 20380156, 27853400, -29329794, 24358370, 13501230, 316217, -8907225, -10369662, -6804839, -3740380, -3008088, }, -{ -622567296, -640857984, 664247808, 709125376, 798487040, 894723840, 925620224, 886355648, 844520512, 828989888, 790468352, -702073600, 623767744, 617457408, 657030656, 679072448, 678107136, 691429632, 720630016, 731288512, 718183488, -714545088, 734450688, 749665088, 732673088, 691860736, 654373184, 635630464, 633599488, 637711360, 637620672, -633773440, 641577920, 675981120, 731671296, 787074240, 827028672, 852819968, 871151424, 883716928, 890245760, -894228864, 901254848, 914564992, 934020096, 957390080, 981779584, 1005063168, 1025992512, 1042441728, 1050861440, -1048723648, 1036472768, 1016223104, 989953984, 960034176, 929936128, 902642688, 878713792, 856679040, 834564736, -810120512, 780202816, 741334976, 691475776, 631171776, 563095424, 490937856, 418955808, 351882368, 293955072, -247446480, 212663696, 189638912, 178975584, 180624848, 192862816, 213411024, 241024976, 275355712, 315903968, -361771552, 411923872, 465059072, 519434944, 573097344, 624263296, 671999168, 717108160, 761738240, 807277760, -853147456, 898196288, 941872896, 982590784, 1016185536, 1037911040, 1045184064, 1036654272, 1009752192, 961772032, -893178176, 807686848, 709143104, 600464320, 485757568, 370975648, 261082464, 157814272, 61236568, -27743878, --107908368, -179967184, -246240672, -307747296, -363138400, -411065408, -451936864, -486216608, -512616160, -529793888, --538810624, -542039936, -540447552, -533838656, -523063136, -509843744, -494687360, -476798816, -455955872, -433068544, --409150400, -384934304, -361187424, -338605568, -317866784, -300097952, -286370688, -276776832, -271422080, -272051296, --280811936, -297940800, -322991744, -357392832, -402666080, -457149344, -517921504, -584243328, -654970176, -725584768, --793207424, -858191360, -908787712, -910023552, -830644544, -689013120, -552559872, -476109472, -454689920, }, -}, -{ -{ -646679296, -645968448, 639122816, 621891968, 595861760, 562558592, 519251872, 475705760, 469890912, 539172480, 669025472, -795626560, 867237120, 879086400, 846760320, 782541952, 709219328, 660229888, 647685376, 657119232, 682932544, -736579392, 809972288, 865853056, 879113792, 859909376, 827793728, 793103296, 770953600, 781334528, 823643200, -875996160, 926382016, 980579136, 1035906368, 1073128704, 1081072256, 1068672128, 1047969344, 1022666048, 995884800, -973002304, 953768896, 933232000, 911046848, 891218048, 874890176, 861030336, 850576960, 843280320, 834800448, -822642496, 810467328, 802096448, 795990592, 789062784, 780909312, 771205376, 757566720, 738932992, 717751296, -696952384, 677270720, 658261696, 639511488, 620062272, 598049472, 571248896, 537837248, 497503232, 451948672, -403237824, 352022496, 298759008, 245707568, 195555232, 148726128, 104236168, 62650688, 26023744, -4582193, --29400124, -48178796, -60261076, -66517768, -69439424, -70959840, -71456984, -71142376, -71192304, -72874320, --76290432, -80570904, -84927608, -89087288, -92982824, -96474632, -99465536, -102183176, -105232064, -109111496, --113631416, -118149720, -122408176, -126476048, -129755256, -130996504, -129633928, -126123864, -120656368, -112729472, --102395776, -90620592, -78009488, -64432024, -50106164, -35723928, -21455510, -7087233, 7117298, 20935282, -34948684, 49608484, 64487324, 79528296, 95684352, 113342040, 131704096, 150455920, 170115072, 190190816, -209036592, 225673680, 239742928, 250109904, 255638608, 256449280, 252586496, 243170848, 228394544, 209796800, -187407136, 160037456, 128926328, 96630856, 62485868, 24452322, -15824270, -56131464, -99214816, -148330992, --202740176, -265789216, -346546400, -437759168, -502903616, -508028608, -462745152, -409909536, -380657568, }, -{ -583148672, -539481152, 460055424, 342895680, 195422624, 69911328, 36334888, 107412304, 216472256, 273669952, 227101760, -84176528, -92762168, -219276864, -252809824, -227045936, -205569488, -215370064, -247742848, -299394656, -371254304, --437524032, -458374464, -427335840, -378257248, -343579136, -327581984, -319013536, -307094464, -281768096, -235050672, --168033072, -90096600, -12005507, 56224880, 106833552, 140924864, 169577664, 203022560, 241609088, 279372064, -311309952, 334967712, 349992576, 358677536, 363750432, 364868736, 359889792, 348653088, 332512064, 311486048, -284663456, 251817696, 212406528, 165094240, 110355960, 51527260, -8180839, -67522256, -125252520, -178963232, --226849440, -268405936, -302897728, -329326816, -348103328, -360565184, -366570080, -364243840, -352140064, -330336128, --299850464, -262378480, -220294240, -175666848, -129303208, -81339168, -32445794, 15968152, 62376348, 105550432, -144535312, 178380192, 205931872, 226138624, 238665968, 243955216, 242759072, 236011136, 224936032, 210609088, -193493648, 173958528, 152993712, 131758856, 110757544, 90138480, 70458936, 52431888, 36262408, 21920976, -9699647, -167504, -8105140, -14840723, -20764556, -26108570, -31393526, -37200324, -43745316, -51052128, --59316720, -68821480, -79682920, -91820496, -104991552, -118746184, -132459472, -145388400, -156676112, -165509248, --171375104, -173924160, -172597024, -166776800, -156289024, -141251280, -121526640, -97005056, -68300184, -36366560, --1575716, 35940824, 75268768, 115067544, 154620432, 193336880, 229652976, 261728320, 288700736, 309878144, -323465792, 327600256, 321737600, 305615904, 278244096, 239449792, 190780832, 133667976, 69099584, -204011, --71012456, -142523664, -210281600, -255934416, -256065408, -210513520, -151919440, -114944064, -103846400, }, -}, -{ -{ -583148672, -539481152, 460055424, 342895680, 195422624, 69911328, 36334888, 107412304, 216472256, 273669952, 227101760, -84176528, -92762168, -219276864, -252809824, -227045936, -205569488, -215370064, -247742848, -299394656, -371254304, --437524032, -458374464, -427335840, -378257248, -343579136, -327581984, -319013536, -307094464, -281768096, -235050672, --168033072, -90096600, -12005507, 56224880, 106833552, 140924864, 169577664, 203022560, 241609088, 279372064, -311309952, 334967712, 349992576, 358677536, 363750432, 364868736, 359889792, 348653088, 332512064, 311486048, -284663456, 251817696, 212406528, 165094240, 110355960, 51527260, -8180839, -67522256, -125252520, -178963232, --226849440, -268405936, -302897728, -329326816, -348103328, -360565184, -366570080, -364243840, -352140064, -330336128, --299850464, -262378480, -220294240, -175666848, -129303208, -81339168, -32445794, 15968152, 62376348, 105550432, -144535312, 178380192, 205931872, 226138624, 238665968, 243955216, 242759072, 236011136, 224936032, 210609088, -193493648, 173958528, 152993712, 131758856, 110757544, 90138480, 70458936, 52431888, 36262408, 21920976, -9699647, -167504, -8105140, -14840723, -20764556, -26108570, -31393526, -37200324, -43745316, -51052128, --59316720, -68821480, -79682920, -91820496, -104991552, -118746184, -132459472, -145388400, -156676112, -165509248, --171375104, -173924160, -172597024, -166776800, -156289024, -141251280, -121526640, -97005056, -68300184, -36366560, --1575716, 35940824, 75268768, 115067544, 154620432, 193336880, 229652976, 261728320, 288700736, 309878144, -323465792, 327600256, 321737600, 305615904, 278244096, 239449792, 190780832, 133667976, 69099584, -204011, --71012456, -142523664, -210281600, -255934416, -256065408, -210513520, -151919440, -114944064, -103846400, }, -{ -646679296, -645968448, 639122816, 621891968, 595861760, 562558592, 519251872, 475705760, 469890912, 539172480, 669025472, -795626560, 867237120, 879086400, 846760320, 782541952, 709219328, 660229888, 647685376, 657119232, 682932544, -736579392, 809972288, 865853056, 879113792, 859909376, 827793728, 793103296, 770953600, 781334528, 823643200, -875996160, 926382016, 980579136, 1035906368, 1073128704, 1081072256, 1068672128, 1047969344, 1022666048, 995884800, -973002304, 953768896, 933232000, 911046848, 891218048, 874890176, 861030336, 850576960, 843280320, 834800448, -822642496, 810467328, 802096448, 795990592, 789062784, 780909312, 771205376, 757566720, 738932992, 717751296, -696952384, 677270720, 658261696, 639511488, 620062272, 598049472, 571248896, 537837248, 497503232, 451948672, -403237824, 352022496, 298759008, 245707568, 195555232, 148726128, 104236168, 62650688, 26023744, -4582193, --29400124, -48178796, -60261076, -66517768, -69439424, -70959840, -71456984, -71142376, -71192304, -72874320, --76290432, -80570904, -84927608, -89087288, -92982824, -96474632, -99465536, -102183176, -105232064, -109111496, --113631416, -118149720, -122408176, -126476048, -129755256, -130996504, -129633928, -126123864, -120656368, -112729472, --102395776, -90620592, -78009488, -64432024, -50106164, -35723928, -21455510, -7087233, 7117298, 20935282, -34948684, 49608484, 64487324, 79528296, 95684352, 113342040, 131704096, 150455920, 170115072, 190190816, -209036592, 225673680, 239742928, 250109904, 255638608, 256449280, 252586496, 243170848, 228394544, 209796800, -187407136, 160037456, 128926328, 96630856, 62485868, 24452322, -15824270, -56131464, -99214816, -148330992, --202740176, -265789216, -346546400, -437759168, -502903616, -508028608, -462745152, -409909536, -380657568, }, -}, -{ -{ -610245056, -609693184, 622532992, 667203840, 731880704, 761625984, 717755584, 638705664, 597541632, 607697088, 621490880, -618182720, 634340928, 694544000, 765818944, 805395520, 813167232, 810452288, 798206784, 764644288, 714478528, -665478848, 625704768, 591012224, 558409664, 529716032, 505750656, 484434720, 463015200, 439907200, 416915712, -399353568, 390405536, 386368800, 380867488, 372288288, 364262080, 361074144, 365289120, 377479840, 395595488, -416150656, 437420960, 459881472, 483348096, 506016928, 526359520, 543573184, 556197696, 562593472, 563023488, -559953664, 556635840, 556160704, 560780992, 571014272, 585870592, 603945408, 623209408, 640301248, 651950272, -657041920, 655905408, 648372544, 634434880, 616032512, 596019584, 575616896, 554468480, 532571648, 510390304, -487461600, 462482080, 434833216, 405084128, 374107232, 342517728, 311096832, 281308000, 254934224, 232891376, -214522880, 198445744, 183858960, 170454896, 157559264, 144643232, 132688184, 123906048, 119996016, 121520728, -128755064, 141985184, 160971616, 185004112, 213525376, 246200416, 282618496, 322217024, 363954464, 405830912, -445446624, 481160352, 511960640, 536418880, 553044672, 561650752, 563063744, 557408896, 543997312, 523012128, -495937184, 464004096, 427414208, 386569056, 343072864, 298823968, 254642176, 210468432, 166675328, 124344136, -83961776, 44609140, 5198521, -34072512, -72519448, -110651776, -149564720, -188894816, -226988480, -263036144, --297373344, -329594176, -358105248, -381894528, -401356640, -417061184, -428902400, -436790656, -441414720, -444037344, --445783776, -447092128, -448056896, -449501600, -452866176, -458555392, -465826240, -474977216, -487494368, -503547872, --522694848, -546431488, -572308672, -583722560, -557764288, -492758368, -418989632, -370297600, -352403680, }, -{ -515739680, -438247712, 285685120, 87360168, -95296200, -207255264, -246143504, -259510512, -290034304, -329569472, -333904704, --277052768, -179355152, -81425064, -2292439, 68869264, 146194784, 223425280, 278033088, 292392768, 267599552, -219466384, 164171360, 107360224, 45304924, -24937654, -98085776, -163375184, -211983472, -239316112, -242116976, --218141392, -170125808, -107210440, -40395240, 22451942, 76769856, 119062936, 146726816, 159440992, 159155376, -148637536, 130463392, 106756784, 78949552, 47805132, 14026826, -21254720, -56645788, -90608776, -120976880, --144530480, -157458336, -156592368, -140656416, -110776872, -69929048, -21831318, 29657286, 80272400, 125053880, -158881040, 177580784, 178835456, 162489888, 130317896, 85446760, 31808528, -26025354, -82670608, -131849056, --166907792, -182170496, -174769728, -145949968, -100976288, -47752520, 5096516, 50188840, 83007224, 102487584, -110175040, 108646032, 100329360, 87040200, 69905960, 49542984, 26501022, 1746441, -23098334, -45803140, --63909652, -75457208, -79635136, -76845552, -68262600, -55389508, -39773544, -22750978, -5320391, 11724187, -27624692, 41651520, 53098144, 61197916, 65167540, 64411088, 58650464, 47960288, 32899986, 14624364, --5263483, -24955908, -42563664, -56267828, -64661268, -67008468, -63235340, -53855132, -39938364, -22924924, --4322885, 14391362, 31722628, 46244988, 56738664, 62173408, 61746596, 55190328, 43038256, 26581552, -7721815, -11183558, -27750858, -40142912, -47320340, -48993764, -45628120, -38378756, -28668370, -17787608, --6880001, 3067144, 11483669, 18213882, 23163832, 26246008, 27607512, 27451820, 25715580, 22356378, -17622788, 11525008, 3844533, -4312147, -9948755, -10860899, -8375723, -5792301, -4709969, }, -}, -{ -{ -515739680, -438247712, 285685120, 87360168, -95296200, -207255264, -246143504, -259510512, -290034304, -329569472, -333904704, --277052768, -179355152, -81425064, -2292439, 68869264, 146194784, 223425280, 278033088, 292392768, 267599552, -219466384, 164171360, 107360224, 45304924, -24937654, -98085776, -163375184, -211983472, -239316112, -242116976, --218141392, -170125808, -107210440, -40395240, 22451942, 76769856, 119062936, 146726816, 159440992, 159155376, -148637536, 130463392, 106756784, 78949552, 47805132, 14026826, -21254720, -56645788, -90608776, -120976880, --144530480, -157458336, -156592368, -140656416, -110776872, -69929048, -21831318, 29657286, 80272400, 125053880, -158881040, 177580784, 178835456, 162489888, 130317896, 85446760, 31808528, -26025354, -82670608, -131849056, --166907792, -182170496, -174769728, -145949968, -100976288, -47752520, 5096516, 50188840, 83007224, 102487584, -110175040, 108646032, 100329360, 87040200, 69905960, 49542984, 26501022, 1746441, -23098334, -45803140, --63909652, -75457208, -79635136, -76845552, -68262600, -55389508, -39773544, -22750978, -5320391, 11724187, -27624692, 41651520, 53098144, 61197916, 65167540, 64411088, 58650464, 47960288, 32899986, 14624364, --5263483, -24955908, -42563664, -56267828, -64661268, -67008468, -63235340, -53855132, -39938364, -22924924, --4322885, 14391362, 31722628, 46244988, 56738664, 62173408, 61746596, 55190328, 43038256, 26581552, -7721815, -11183558, -27750858, -40142912, -47320340, -48993764, -45628120, -38378756, -28668370, -17787608, --6880001, 3067144, 11483669, 18213882, 23163832, 26246008, 27607512, 27451820, 25715580, 22356378, -17622788, 11525008, 3844533, -4312147, -9948755, -10860899, -8375723, -5792301, -4709969, }, -{ -610245056, -609693184, 622532992, 667203840, 731880704, 761625984, 717755584, 638705664, 597541632, 607697088, 621490880, -618182720, 634340928, 694544000, 765818944, 805395520, 813167232, 810452288, 798206784, 764644288, 714478528, -665478848, 625704768, 591012224, 558409664, 529716032, 505750656, 484434720, 463015200, 439907200, 416915712, -399353568, 390405536, 386368800, 380867488, 372288288, 364262080, 361074144, 365289120, 377479840, 395595488, -416150656, 437420960, 459881472, 483348096, 506016928, 526359520, 543573184, 556197696, 562593472, 563023488, -559953664, 556635840, 556160704, 560780992, 571014272, 585870592, 603945408, 623209408, 640301248, 651950272, -657041920, 655905408, 648372544, 634434880, 616032512, 596019584, 575616896, 554468480, 532571648, 510390304, -487461600, 462482080, 434833216, 405084128, 374107232, 342517728, 311096832, 281308000, 254934224, 232891376, -214522880, 198445744, 183858960, 170454896, 157559264, 144643232, 132688184, 123906048, 119996016, 121520728, -128755064, 141985184, 160971616, 185004112, 213525376, 246200416, 282618496, 322217024, 363954464, 405830912, -445446624, 481160352, 511960640, 536418880, 553044672, 561650752, 563063744, 557408896, 543997312, 523012128, -495937184, 464004096, 427414208, 386569056, 343072864, 298823968, 254642176, 210468432, 166675328, 124344136, -83961776, 44609140, 5198521, -34072512, -72519448, -110651776, -149564720, -188894816, -226988480, -263036144, --297373344, -329594176, -358105248, -381894528, -401356640, -417061184, -428902400, -436790656, -441414720, -444037344, --445783776, -447092128, -448056896, -449501600, -452866176, -458555392, -465826240, -474977216, -487494368, -503547872, --522694848, -546431488, -572308672, -583722560, -557764288, -492758368, -418989632, -370297600, -352403680, }, -}, -{ -{ -573552064, -570192320, 581792000, 620967424, 671831104, 698598464, 681930752, 638787264, 598702848, 570998720, 549175488, -537884544, 553273408, 596125376, 644172096, 676342976, 689677824, 687518528, 667147456, 629091904, 587057088, -556523584, 538422976, 522272320, 501194752, 476544352, 450953856, 424396448, 396837248, 369501952, 342626720, -314877472, 285514944, 255454992, 226385584, 200594832, 181621824, 173160192, 176257408, 188260768, 205153952, -224390032, 244880784, 265123504, 282881056, 296865984, 307601248, 316306080, 323835712, 330969632, 338782720, -348169376, 359361536, 371913568, 384639008, 395740960, 403618464, 407422208, 406582528, 400576032, 389836992, -376057664, 360677408, 343627456, 324188960, 302208928, 277727072, 250390144, 220360816, 189325376, 159854384, -134133976, 113651280, 99327024, 91166048, 87985624, 87882544, 89001384, 90074056, 90682328, 91105920, -91786136, 93073016, 95422360, 99376952, 105186968, 112838456, 122489248, 134506560, 149102480, 166340320, -186418768, 209624464, 236110992, 265856336, 298457280, 332832576, 367526272, 401262144, 432677152, 459869664, -481246240, 496708128, 507029472, 512326784, 512221568, 507134720, 497961728, 484529216, 465722080, 441205344, -411850848, 378432800, 341078912, 300298208, 257615904, 214704880, 172351664, 130707128, 90312960, 52321828, -17476222, -14641544, -44763760, -72813120, -98525480, -122787208, -147041424, -171491072, -195217008, -217874032, --239737024, -260137040, -277482816, -290973312, -301004192, -307948096, -311751808, -312641952, -311275072, -308364160, --304645248, -300720736, -296806944, -293374176, -291637952, -292377760, -295200096, -300228960, -308901024, -321814912, --338522336, -360246272, -386598592, -406292640, -400060640, -361901472, -311420032, -275072800, -260514992, }, -{ -501715520, -460559008, 366155616, 224563440, 80469432, -11944304, -46012520, -71380208, -130646464, -206194400, -252554816, --263529536, -274076352, -303230048, -330179904, -329530816, -299793024, -249240176, -179660624, -96497712, -16281684, -49042620, 103762112, 155969584, 203624400, 240106928, 264837344, 280934336, 287637184, 280503232, 256201248, -214720448, 159932240, 99238440, 39739184, -15985331, -68172408, -114765824, -150986352, -173690096, -183660848, --183926064, -177937808, -168966160, -159263824, -149551296, -139858624, -130014568, -118512104, -101964672, -76892800, --41908144, 1741609, 50550156, 99314136, 142736800, 177676352, 203679696, 221240752, 230115216, 229246560, -217352192, 193321312, 156962800, 110015584, 56170656, -140123, -54926188, -105112880, -148744912, -184897808, --212817248, -230854496, -236542640, -227862512, -204462448, -168132944, -122712584, -73326904, -24844238, 19481972, -58070104, 90189480, 115522272, 134254240, 146931376, 154040080, 155942208, 153108608, 146082032, 135206112, -120597848, 102302896, 80275088, 54349052, 24573656, -8286066, -42633456, -76381160, -107322640, -133334040, --152571200, -163738656, -166214160, -159895728, -145068432, -122527360, -93683976, -60323888, -24304684, 12397960, -47603272, 79232480, 105656192, 125609536, 138077824, 142619216, 139570336, 129651104, 113653960, 92704720, -68354944, 42062764, 14964203, -11664057, -36275292, -57592828, -74755520, -86879136, -93201864, -93776856, --89387936, -80867256, -69139312, -55655260, -41899552, -28639916, -16245177, -5225902, 4234301, 12647068, -20462834, 27614492, 34209416, 40676560, 46849504, 51966420, 55684788, 57866096, 57622356, 54056996, -47305308, 37140728, 22166326, 3399467, -12861280, -19901804, -17953500, -13210783, -10441065, }, -}, -{ -{ -501715520, -460559008, 366155616, 224563440, 80469432, -11944304, -46012520, -71380208, -130646464, -206194400, -252554816, --263529536, -274076352, -303230048, -330179904, -329530816, -299793024, -249240176, -179660624, -96497712, -16281684, -49042620, 103762112, 155969584, 203624400, 240106928, 264837344, 280934336, 287637184, 280503232, 256201248, -214720448, 159932240, 99238440, 39739184, -15985331, -68172408, -114765824, -150986352, -173690096, -183660848, --183926064, -177937808, -168966160, -159263824, -149551296, -139858624, -130014568, -118512104, -101964672, -76892800, --41908144, 1741609, 50550156, 99314136, 142736800, 177676352, 203679696, 221240752, 230115216, 229246560, -217352192, 193321312, 156962800, 110015584, 56170656, -140123, -54926188, -105112880, -148744912, -184897808, --212817248, -230854496, -236542640, -227862512, -204462448, -168132944, -122712584, -73326904, -24844238, 19481972, -58070104, 90189480, 115522272, 134254240, 146931376, 154040080, 155942208, 153108608, 146082032, 135206112, -120597848, 102302896, 80275088, 54349052, 24573656, -8286066, -42633456, -76381160, -107322640, -133334040, --152571200, -163738656, -166214160, -159895728, -145068432, -122527360, -93683976, -60323888, -24304684, 12397960, -47603272, 79232480, 105656192, 125609536, 138077824, 142619216, 139570336, 129651104, 113653960, 92704720, -68354944, 42062764, 14964203, -11664057, -36275292, -57592828, -74755520, -86879136, -93201864, -93776856, --89387936, -80867256, -69139312, -55655260, -41899552, -28639916, -16245177, -5225902, 4234301, 12647068, -20462834, 27614492, 34209416, 40676560, 46849504, 51966420, 55684788, 57866096, 57622356, 54056996, -47305308, 37140728, 22166326, 3399467, -12861280, -19901804, -17953500, -13210783, -10441065, }, -{ -573552064, -570192320, 581792000, 620967424, 671831104, 698598464, 681930752, 638787264, 598702848, 570998720, 549175488, -537884544, 553273408, 596125376, 644172096, 676342976, 689677824, 687518528, 667147456, 629091904, 587057088, -556523584, 538422976, 522272320, 501194752, 476544352, 450953856, 424396448, 396837248, 369501952, 342626720, -314877472, 285514944, 255454992, 226385584, 200594832, 181621824, 173160192, 176257408, 188260768, 205153952, -224390032, 244880784, 265123504, 282881056, 296865984, 307601248, 316306080, 323835712, 330969632, 338782720, -348169376, 359361536, 371913568, 384639008, 395740960, 403618464, 407422208, 406582528, 400576032, 389836992, -376057664, 360677408, 343627456, 324188960, 302208928, 277727072, 250390144, 220360816, 189325376, 159854384, -134133976, 113651280, 99327024, 91166048, 87985624, 87882544, 89001384, 90074056, 90682328, 91105920, -91786136, 93073016, 95422360, 99376952, 105186968, 112838456, 122489248, 134506560, 149102480, 166340320, -186418768, 209624464, 236110992, 265856336, 298457280, 332832576, 367526272, 401262144, 432677152, 459869664, -481246240, 496708128, 507029472, 512326784, 512221568, 507134720, 497961728, 484529216, 465722080, 441205344, -411850848, 378432800, 341078912, 300298208, 257615904, 214704880, 172351664, 130707128, 90312960, 52321828, -17476222, -14641544, -44763760, -72813120, -98525480, -122787208, -147041424, -171491072, -195217008, -217874032, --239737024, -260137040, -277482816, -290973312, -301004192, -307948096, -311751808, -312641952, -311275072, -308364160, --304645248, -300720736, -296806944, -293374176, -291637952, -292377760, -295200096, -300228960, -308901024, -321814912, --338522336, -360246272, -386598592, -406292640, -400060640, -361901472, -311420032, -275072800, -260514992, }, -}, -}; -const Word32 CRendBin_Combined_HRIR_coeff_im_32kHz_fx[15][BINAURAL_CHANNELS][160] ={ -{ -{ -12131672, -35005056, 50895364, 46826956, 15495705, -17832168, -13483513, 15928960, 5836324, -50508816, -50141060, -88496192, 286718048, 388669312, 358944384, 302016736, 293678048, 293919104, 242271056, 146592608, 40855876, --71729712, -186644240, -259896528, -249916624, -171891568, -77554224, 1320166, 66618164, 127185256, 179485616, -208453552, 196224176, 134799152, 35961760, -74894032, -176771184, -263083392, -337156544, -403115424, -459808448, --500517760, -520093152, -522885440, -520588160, -522769984, -533068800, -552091200, -577720320, -603377920, -621745344, --630650432, -632588544, -630336384, -625862080, -621228928, -617958272, -617169088, -621017920, -631350528, -647010496, --665534720, -686553728, -709830336, -731014144, -743064768, -741031616, -723115712, -689573120, -643782848, -592302272, --541145984, -493351616, -450879232, -415891872, -388977472, -368544160, -352527680, -338865952, -325068896, -309634400, --293009120, -275597312, -256625376, -236331120, -216784176, -199284864, -183619520, -170708304, -163045552, -161851008, --166402064, -176108688, -190615488, -208338128, -227175856, -245833728, -262890656, -276299552, -285124096, -289769632, --289952704, -284990944, -276000512, -264748768, -250791200, -232823200, -211744576, -189266864, -165182288, -139047424, --112483048, -87114824, -62633508, -38871600, -16938278, 3001645, 21852794, 39007968, 53010632, 64268280, -73474008, 78717624, 77876344, 71662064, 60654064, 42243152, 13946833, -23653996, -70185136, -127838624, --198167104, -280244992, -373098976, -476168544, -587304576, -703502208, -822057792, -938586688, -1047525888, -1146535040, --1235352832, -1310038016, -1365803904, -1404562176, -1430346496, -1440137984, -1430087168, -1404998656, -1369252736, -1317694336, --1246936960, -1155320960, -1014742400, -778383360, -456820768, -156443104, 11594801, 43531640, 16896938, }, -{ --43097848, --167190736, -326224256, -425162560, -429956832, -408348320, -396827072, -346930816, -240030688, -150563840, -149945360, --227132896, -334114080, -431730656, -465785984, -381590112, -200899776, -19745576, 100551624, 182485648, 254709808, -295795456, 288805952, 270257056, 281600608, 315289248, 346260256, 379019584, 424518848, 459280704, 448139584, -392080576, 318817024, 234920752, 120725624, -25675852, -167418368, -263528992, -308901024, -328545664, -343552832, --356583744, -364620160, -368800800, -368111456, -355156736, -324841248, -281055680, -230317088, -174271520, -112592032, --48478368, 13051869, 69172592, 118673168, 160411120, 194679056, 223423120, 247208656, 263940240, 271297504, -268223392, 253909872, 228279120, 194260832, 157282240, 121650120, 88867704, 59459528, 34444564, 14427332, --1388348, -14647449, -27005144, -40033392, -55187108, -73243152, -93707056, -114795888, -134174776, -150110720, --162281040, -171633328, -179525872, -186728528, -192521904, -194249024, -188014880, -170518784, -140609712, -99453728, --49912352, 3782256, 56306484, 102237400, 137370240, 159504352, 168786848, 167815648, 160851888, 152121840, -144768848, 141185776, 143204944, 151323504, 164478464, 180984560, 198637408, 213429808, 219464240, 211020336, -184103776, 136330848, 67433136, -19269370, -117235424, -219022400, -317232736, -403855232, -471103680, -513468160, --527698464, -511415712, -463756064, -387076960, -286395936, -167771088, -38606388, 91831232, 214368800, 322013568, -409529952, 472823296, 510125600, 522313120, 511061920, 477930016, 425322016, 356367392, 273709664, 180098720, -79737144, -22600654, -122727080, -215745328, -295460992, -356861856, -397155104, -413489376, -403401568, -368710048, --313911648, -239426704, -144517600, -42037528, 37808060, 69194608, 55704116, 26498874, 6231461, }, -}, -{ -{ --43097848, --167190736, -326224256, -425162560, -429956832, -408348320, -396827072, -346930816, -240030688, -150563840, -149945360, --227132896, -334114080, -431730656, -465785984, -381590112, -200899776, -19745576, 100551624, 182485648, 254709808, -295795456, 288805952, 270257056, 281600608, 315289248, 346260256, 379019584, 424518848, 459280704, 448139584, -392080576, 318817024, 234920752, 120725624, -25675852, -167418368, -263528992, -308901024, -328545664, -343552832, --356583744, -364620160, -368800800, -368111456, -355156736, -324841248, -281055680, -230317088, -174271520, -112592032, --48478368, 13051869, 69172592, 118673168, 160411120, 194679056, 223423120, 247208656, 263940240, 271297504, -268223392, 253909872, 228279120, 194260832, 157282240, 121650120, 88867704, 59459528, 34444564, 14427332, --1388348, -14647449, -27005144, -40033392, -55187108, -73243152, -93707056, -114795888, -134174776, -150110720, --162281040, -171633328, -179525872, -186728528, -192521904, -194249024, -188014880, -170518784, -140609712, -99453728, --49912352, 3782256, 56306484, 102237400, 137370240, 159504352, 168786848, 167815648, 160851888, 152121840, -144768848, 141185776, 143204944, 151323504, 164478464, 180984560, 198637408, 213429808, 219464240, 211020336, -184103776, 136330848, 67433136, -19269370, -117235424, -219022400, -317232736, -403855232, -471103680, -513468160, --527698464, -511415712, -463756064, -387076960, -286395936, -167771088, -38606388, 91831232, 214368800, 322013568, -409529952, 472823296, 510125600, 522313120, 511061920, 477930016, 425322016, 356367392, 273709664, 180098720, -79737144, -22600654, -122727080, -215745328, -295460992, -356861856, -397155104, -413489376, -403401568, -368710048, --313911648, -239426704, -144517600, -42037528, 37808060, 69194608, 55704116, 26498874, 6231461, }, -{ -12131672, -35005056, 50895364, 46826956, 15495705, -17832168, -13483513, 15928960, 5836324, -50508816, -50141060, -88496192, 286718048, 388669312, 358944384, 302016736, 293678048, 293919104, 242271056, 146592608, 40855876, --71729712, -186644240, -259896528, -249916624, -171891568, -77554224, 1320166, 66618164, 127185256, 179485616, -208453552, 196224176, 134799152, 35961760, -74894032, -176771184, -263083392, -337156544, -403115424, -459808448, --500517760, -520093152, -522885440, -520588160, -522769984, -533068800, -552091200, -577720320, -603377920, -621745344, --630650432, -632588544, -630336384, -625862080, -621228928, -617958272, -617169088, -621017920, -631350528, -647010496, --665534720, -686553728, -709830336, -731014144, -743064768, -741031616, -723115712, -689573120, -643782848, -592302272, --541145984, -493351616, -450879232, -415891872, -388977472, -368544160, -352527680, -338865952, -325068896, -309634400, --293009120, -275597312, -256625376, -236331120, -216784176, -199284864, -183619520, -170708304, -163045552, -161851008, --166402064, -176108688, -190615488, -208338128, -227175856, -245833728, -262890656, -276299552, -285124096, -289769632, --289952704, -284990944, -276000512, -264748768, -250791200, -232823200, -211744576, -189266864, -165182288, -139047424, --112483048, -87114824, -62633508, -38871600, -16938278, 3001645, 21852794, 39007968, 53010632, 64268280, -73474008, 78717624, 77876344, 71662064, 60654064, 42243152, 13946833, -23653996, -70185136, -127838624, --198167104, -280244992, -373098976, -476168544, -587304576, -703502208, -822057792, -938586688, -1047525888, -1146535040, --1235352832, -1310038016, -1365803904, -1404562176, -1430346496, -1440137984, -1430087168, -1404998656, -1369252736, -1317694336, --1246936960, -1155320960, -1014742400, -778383360, -456820768, -156443104, 11594801, 43531640, 16896938, }, -}, -{ -{ -11454678, -12261595, -39353712, -116605680, -133135400, -55874840, 7644505, -60422136, -185013776, -157663952, 74794168, -310658208, 345424896, 217707056, 119653496, 139996064, 194340288, 171745536, 57756572, -85087064, -191056256, --229774848, -209300736, -159948336, -106610752, -55478092, -8877161, 19633906, 13015898, -35591320, -120874336, --226771056, -328624576, -406721600, -460766784, -501388032, -528194528, -528187552, -496168032, -445522848, -397478816, --367953056, -363930304, -382863040, -413397056, -442821856, -466120992, -485803200, -504309152, -519663648, -527787584, --526773440, -518840640, -508476896, -498442752, -488485952, -478252128, -468951360, -460622880, -450411616, -435866688, --418123104, -399991392, -382464704, -364528384, -345181152, -324685024, -304454656, -285758144, -268155744, -250039568, --231118640, -213047024, -197261408, -183846608, -172690432, -163833680, -156576256, -150111792, -144944944, -142063552, --141222816, -141463872, -142488224, -144411840, -147390928, -152274848, -160152352, -170881184, -183707024, -199021264, --217329648, -236966224, -254967520, -269355104, -278557632, -280236960, -273142208, -258744944, -239172240, -215200944, --187614368, -158353840, -129102960, -100698728, -74394736, -51687248, -33260226, -20282446, -15713675, -22118544, --39787504, -68913288, -111002896, -165992976, -230904960, -303376640, -383343552, -469707840, -559023808, -649028096, --740035776, -831807936, -922267968, -1009758080, -1093606016, -1172373632, -1243722624, -1305461760, -1355644672, -1393273984, --1419281024, -1434560384, -1437935232, -1429216384, -1412040832, -1389403136, -1359531648, -1320978944, -1277201920, -1230462976, --1176829568, -1113237248, -1042787456, -967061824, -881342848, -783402048, -677669056, -565563968, -442997952, -311154816, --174498080, -24946244, 148259056, 319944992, 423110656, 406406976, 290862688, 151469008, 43244952, }, -{ -11454678, -12261595, -39353712, -116605680, -133135400, -55874840, 7644505, -60422136, -185013776, -157663952, 74794168, -310658208, 345424896, 217707056, 119653496, 139996064, 194340288, 171745536, 57756572, -85087064, -191056256, --229774848, -209300736, -159948336, -106610752, -55478092, -8877161, 19633906, 13015898, -35591320, -120874336, --226771056, -328624576, -406721600, -460766784, -501388032, -528194528, -528187552, -496168032, -445522848, -397478816, --367953056, -363930304, -382863040, -413397056, -442821856, -466120992, -485803200, -504309152, -519663648, -527787584, --526773440, -518840640, -508476896, -498442752, -488485952, -478252128, -468951360, -460622880, -450411616, -435866688, --418123104, -399991392, -382464704, -364528384, -345181152, -324685024, -304454656, -285758144, -268155744, -250039568, --231118640, -213047024, -197261408, -183846608, -172690432, -163833680, -156576256, -150111792, -144944944, -142063552, --141222816, -141463872, -142488224, -144411840, -147390928, -152274848, -160152352, -170881184, -183707024, -199021264, --217329648, -236966224, -254967520, -269355104, -278557632, -280236960, -273142208, -258744944, -239172240, -215200944, --187614368, -158353840, -129102960, -100698728, -74394736, -51687248, -33260226, -20282446, -15713675, -22118544, --39787504, -68913288, -111002896, -165992976, -230904960, -303376640, -383343552, -469707840, -559023808, -649028096, --740035776, -831807936, -922267968, -1009758080, -1093606016, -1172373632, -1243722624, -1305461760, -1355644672, -1393273984, --1419281024, -1434560384, -1437935232, -1429216384, -1412040832, -1389403136, -1359531648, -1320978944, -1277201920, -1230462976, --1176829568, -1113237248, -1042787456, -967061824, -881342848, -783402048, -677669056, -565563968, -442997952, -311154816, --174498080, -24946244, 148259056, 319944992, 423110656, 406406976, 290862688, 151469008, 43244952, }, -}, -{ -{ -6452115, -35748088, 81947440, 111170400, 112590960, 95807832, 45698988, -49475340, -142197248, -175787648, -175914352, --212588528, -284941024, -327417184, -321428896, -315450304, -334580096, -350572416, -347663104, -345804448, -348785152, --331687424, -290392416, -252080752, -230411568, -215081232, -206860656, -219282240, -243322240, -249385136, -227857136, --196457168, -167259456, -134793792, -96642136, -60622928, -30261266, -2485712, 19939922, 28740848, 22386980, -7348152, -10490994, -27394912, -38426000, -40039832, -33959232, -24671902, -16234440, -13515188, -22138946, --44678936, -79402672, -122788280, -170272368, -215612720, -253478768, -282667904, -304536256, -319520320, -327285632, --328484992, -323923200, -313150912, -295553344, -271757088, -242979184, -210247232, -174942608, -138919104, -103535016, --69322920, -36527624, -5060009, 25834766, 56970056, 88406536, 119745296, 150757104, 181040928, 209296448, -233433616, 251415568, 261826032, 263540272, 254881072, 233442752, 197032704, 144379616, 74620760, -12745852, --116058608, -230334800, -349448192, -468957824, -585466304, -694418368, -791117952, -873665600, -942570304, -997656448, --1037813376, -1063725952, -1077990144, -1081780992, -1073710656, -1052800640, -1020519104, -979087168, -929881920, -874748480, --817228096, -760950080, -707549696, -657069312, -609664704, -566065984, -526812640, -491839264, -460903136, -434124032, --411802528, -393564512, -378035520, -363857280, -350761376, -339089824, -328770080, -319691072, -312706368, -309211872, --309946304, -314980544, -324437536, -338422496, -356629920, -378493984, -403220672, -429656704, -456929760, -484799808, --512288128, -536868768, -556423232, -570509632, -578120320, -576579520, -564771584, -544449920, -516401088, -479406944, --433754656, -377739680, -299510080, -187618672, -59096064, 38548944, 70563088, 50473380, 16210817, }, -{ --91094112, --257185328, -369219552, -400231904, -368597312, -319030176, -265365632, -188064272, -89778240, -9618042, 29767344, -50299436, 77788304, 108185392, 133609456, 170060848, 232147808, 298606528, 326328928, 290251200, 197411728, -73894912, -49488224, -148460912, -214930368, -253069136, -264243568, -244646704, -199322448, -146183504, -100346544, --62887448, -28630788, 4166655, 36424544, 71994392, 112148040, 150237424, 175736096, 181046832, 163393984, -124688808, 72319736, 17476222, -29621852, -62667868, -78985520, -79509512, -69334192, -55685324, -44018584, --36340256, -32390496, -30926448, -30215632, -28802050, -26255672, -22972170, -19587198, -16735877, -14687178, --12751221, -9342628, -2680597, 8824010, 26312044, 49444200, 75296680, 98773512, 114386256, 117836720, -106908176, 82078432, 46528456, 4988068, -37868188, -78277392, -113383376, -140904992, -158653408, -164096736, --154611840, -128592392, -86696064, -32510218, 27528592, 85105312, 131944080, 161925632, 172267920, 163461088, -138537392, 102168144, 59701120, 16331613, -23400056, -55914568, -78863656, -91271280, -93489624, -87109456, --74745312, -59459528, -43966508, -30130806, -18906446, -10429791, -4144644, 904091, 5722507, 11215770, -18139794, 26915486, 37363532, 48592188, 59057948, 66765268, 69696584, 66389992, 56364468, 40188008, -19323058, -4177930, -28086402, -50346680, -69186552, -83109768, -90938952, -91835528, -85273352, -71162776, --50123880, -23640036, 6007049, 35852240, 62478352, 82614768, 93869728, 95155536, 86802360, 70564168, -49274012, 26030186, 3476239, -16371878, -32184874, -43548284, -50790672, -54296976, -54269060, -51174000, --45562624, -37070400, -24777130, -9773735, 3378529, 9642202, 8386461, 3991098, 887448, }, -}, -{ -{ --91094112, --257185328, -369219552, -400231904, -368597312, -319030176, -265365632, -188064272, -89778240, -9618042, 29767344, -50299436, 77788304, 108185392, 133609456, 170060848, 232147808, 298606528, 326328928, 290251200, 197411728, -73894912, -49488224, -148460912, -214930368, -253069136, -264243568, -244646704, -199322448, -146183504, -100346544, --62887448, -28630788, 4166655, 36424544, 71994392, 112148040, 150237424, 175736096, 181046832, 163393984, -124688808, 72319736, 17476222, -29621852, -62667868, -78985520, -79509512, -69334192, -55685324, -44018584, --36340256, -32390496, -30926448, -30215632, -28802050, -26255672, -22972170, -19587198, -16735877, -14687178, --12751221, -9342628, -2680597, 8824010, 26312044, 49444200, 75296680, 98773512, 114386256, 117836720, -106908176, 82078432, 46528456, 4988068, -37868188, -78277392, -113383376, -140904992, -158653408, -164096736, --154611840, -128592392, -86696064, -32510218, 27528592, 85105312, 131944080, 161925632, 172267920, 163461088, -138537392, 102168144, 59701120, 16331613, -23400056, -55914568, -78863656, -91271280, -93489624, -87109456, --74745312, -59459528, -43966508, -30130806, -18906446, -10429791, -4144644, 904091, 5722507, 11215770, -18139794, 26915486, 37363532, 48592188, 59057948, 66765268, 69696584, 66389992, 56364468, 40188008, -19323058, -4177930, -28086402, -50346680, -69186552, -83109768, -90938952, -91835528, -85273352, -71162776, --50123880, -23640036, 6007049, 35852240, 62478352, 82614768, 93869728, 95155536, 86802360, 70564168, -49274012, 26030186, 3476239, -16371878, -32184874, -43548284, -50790672, -54296976, -54269060, -51174000, --45562624, -37070400, -24777130, -9773735, 3378529, 9642202, 8386461, 3991098, 887448, }, -{ -6452115, -35748088, 81947440, 111170400, 112590960, 95807832, 45698988, -49475340, -142197248, -175787648, -175914352, --212588528, -284941024, -327417184, -321428896, -315450304, -334580096, -350572416, -347663104, -345804448, -348785152, --331687424, -290392416, -252080752, -230411568, -215081232, -206860656, -219282240, -243322240, -249385136, -227857136, --196457168, -167259456, -134793792, -96642136, -60622928, -30261266, -2485712, 19939922, 28740848, 22386980, -7348152, -10490994, -27394912, -38426000, -40039832, -33959232, -24671902, -16234440, -13515188, -22138946, --44678936, -79402672, -122788280, -170272368, -215612720, -253478768, -282667904, -304536256, -319520320, -327285632, --328484992, -323923200, -313150912, -295553344, -271757088, -242979184, -210247232, -174942608, -138919104, -103535016, --69322920, -36527624, -5060009, 25834766, 56970056, 88406536, 119745296, 150757104, 181040928, 209296448, -233433616, 251415568, 261826032, 263540272, 254881072, 233442752, 197032704, 144379616, 74620760, -12745852, --116058608, -230334800, -349448192, -468957824, -585466304, -694418368, -791117952, -873665600, -942570304, -997656448, --1037813376, -1063725952, -1077990144, -1081780992, -1073710656, -1052800640, -1020519104, -979087168, -929881920, -874748480, --817228096, -760950080, -707549696, -657069312, -609664704, -566065984, -526812640, -491839264, -460903136, -434124032, --411802528, -393564512, -378035520, -363857280, -350761376, -339089824, -328770080, -319691072, -312706368, -309211872, --309946304, -314980544, -324437536, -338422496, -356629920, -378493984, -403220672, -429656704, -456929760, -484799808, --512288128, -536868768, -556423232, -570509632, -578120320, -576579520, -564771584, -544449920, -516401088, -479406944, --433754656, -377739680, -299510080, -187618672, -59096064, 38548944, 70563088, 50473380, 16210817, }, -}, -{ -{ -7919920, -43446816, 104918000, 148874304, 138170704, 83917216, 15482820, -60879012, -143749872, -202633328, -207747568, --184090896, -187100592, -222344016, -238450672, -210530704, -179610704, -185786864, -208447648, -206863872, -183740304, --169309760, -167556336, -157913056, -136191808, -118551832, -110594336, -100373920, -80657336, -58070644, -40783400, --30984968, -27802934, -27360016, -22086870, -7280507, 13779329, 34718904, 51856900, 62892280, 65432752, -59639916, 48164300, 32096290, 10749229, -14424648, -39697844, -62912144, -84523880, -105623448, -127484832, --151991920, -180360704, -212206816, -246526288, -282065536, -316742560, -348788928, -378200864, -405123872, -427867872, --444754592, -456467520, -464216160, -467251648, -464473856, -456580256, -444310624, -426387168, -401278272, -369414976, --332223776, -290739744, -246373280, -201346464, -157460480, -115644144, -76794016, -41654740, -10200547, 17439714, -40042516, 56556128, 67292472, 72427104, 70361224, 58948428, 37329172, 5191005, -38839928, -96605088, --168503920, -253121216, -348580608, -453376224, -565388928, -680615424, -794080960, -902358144, -1003945408, -1096694144, --1176855936, -1242011136, -1292803968, -1329907584, -1351437184, -1355673728, -1344186752, -1319600768, -1282316672, -1232374784, --1172863232, -1108547200, -1042297856, -975305984, -909583872, -847816320, -791289216, -739690560, -692638656, -650415360, --613473280, -581705536, -554161920, -529680608, -507825120, -488477376, -470631776, -452970336, -435749120, -420651776, --408776736, -400292032, -395874112, -396789472, -403652832, -416310656, -434459040, -457537504, -484837376, -515965696, --549921728, -584192320, -616537216, -646397952, -672314304, -690305408, -697493568, -693863232, -677921920, -645913664, --596482880, -525728160, -416760544, -255793760, -71349608, 65669512, 106195216, 73027328, 22857816, }, -{ --121877216, --327947584, -439449792, -444051840, -368772320, -245394560, -86295016, 97210144, 264148544, 356093600, 346553920, -263942928, 159240208, 62202400, -24676198, -102194448, -160061088, -186785440, -183974928, -163762272, -133193376, --87690344, -23799488, 46799036, 103836200, 137122192, 150417808, 147615344, 125519880, 83253648, 29818348, --22703198, -67650568, -102025336, -122039352, -124650152, -110064976, -80442592, -39573828, 4927938, 43437152, -70527656, 86892560, 94581624, 93367224, 82184200, 61012156, 30724586, -6254010, -44463112, -76524504, --96368328, -100777648, -89137752, -63811404, -30434138, 3992709, 33851860, 55915104, 69026032, 73909408, -72473816, 66124244, 54713052, 37222872, 12999792, -17475686, -51810192, -84977000, -109717088, -118276424, --104702176, -67335960, -11045045, 52493628, 107759656, 140545824, 142772768, 115008488, 65794068, 8034810, --45649060, -86090472, -108358800, -111161808, -95987688, -66394288, -27647242, 13440563, 49265424, 73232952, -81687592, 74739944, 55793236, 30321932, 4263292, -17572322, -32429150, -39607116, -39949640, -35240208, --27561342, -18732500, -10036265, -2222109, 4449049, 10092636, 14942728, 19077708, 22303766, 24113558, -23716272, 20292110, 13478144, 3739843, -7605850, -18616536, -27125940, -31294206, -30157112, -23889144, --13728863, -1690607, 9903121, 19017042, 24391120, 25682294, 23306104, 18159658, 11337103, 3865471, --3420942, -9860171, -14895483, -18075906, -19086298, -17766670, -14164802, -8636105, -1872606, 5182415, -11490111, 16064788, 18162880, 17501992, 14358613, 9434969, 3633542, -2091649, -6881612, -10204305, --11922829, -11974906, -10144176, -6567005, -2434710, 442919, 1197222, 654983, 130460, }, -}, -{ -{ --121877216, --327947584, -439449792, -444051840, -368772320, -245394560, -86295016, 97210144, 264148544, 356093600, 346553920, -263942928, 159240208, 62202400, -24676198, -102194448, -160061088, -186785440, -183974928, -163762272, -133193376, --87690344, -23799488, 46799036, 103836200, 137122192, 150417808, 147615344, 125519880, 83253648, 29818348, --22703198, -67650568, -102025336, -122039352, -124650152, -110064976, -80442592, -39573828, 4927938, 43437152, -70527656, 86892560, 94581624, 93367224, 82184200, 61012156, 30724586, -6254010, -44463112, -76524504, --96368328, -100777648, -89137752, -63811404, -30434138, 3992709, 33851860, 55915104, 69026032, 73909408, -72473816, 66124244, 54713052, 37222872, 12999792, -17475686, -51810192, -84977000, -109717088, -118276424, --104702176, -67335960, -11045045, 52493628, 107759656, 140545824, 142772768, 115008488, 65794068, 8034810, --45649060, -86090472, -108358800, -111161808, -95987688, -66394288, -27647242, 13440563, 49265424, 73232952, -81687592, 74739944, 55793236, 30321932, 4263292, -17572322, -32429150, -39607116, -39949640, -35240208, --27561342, -18732500, -10036265, -2222109, 4449049, 10092636, 14942728, 19077708, 22303766, 24113558, -23716272, 20292110, 13478144, 3739843, -7605850, -18616536, -27125940, -31294206, -30157112, -23889144, --13728863, -1690607, 9903121, 19017042, 24391120, 25682294, 23306104, 18159658, 11337103, 3865471, --3420942, -9860171, -14895483, -18075906, -19086298, -17766670, -14164802, -8636105, -1872606, 5182415, -11490111, 16064788, 18162880, 17501992, 14358613, 9434969, 3633542, -2091649, -6881612, -10204305, --11922829, -11974906, -10144176, -6567005, -2434710, 442919, 1197222, 654983, 130460, }, -{ -7919920, -43446816, 104918000, 148874304, 138170704, 83917216, 15482820, -60879012, -143749872, -202633328, -207747568, --184090896, -187100592, -222344016, -238450672, -210530704, -179610704, -185786864, -208447648, -206863872, -183740304, --169309760, -167556336, -157913056, -136191808, -118551832, -110594336, -100373920, -80657336, -58070644, -40783400, --30984968, -27802934, -27360016, -22086870, -7280507, 13779329, 34718904, 51856900, 62892280, 65432752, -59639916, 48164300, 32096290, 10749229, -14424648, -39697844, -62912144, -84523880, -105623448, -127484832, --151991920, -180360704, -212206816, -246526288, -282065536, -316742560, -348788928, -378200864, -405123872, -427867872, --444754592, -456467520, -464216160, -467251648, -464473856, -456580256, -444310624, -426387168, -401278272, -369414976, --332223776, -290739744, -246373280, -201346464, -157460480, -115644144, -76794016, -41654740, -10200547, 17439714, -40042516, 56556128, 67292472, 72427104, 70361224, 58948428, 37329172, 5191005, -38839928, -96605088, --168503920, -253121216, -348580608, -453376224, -565388928, -680615424, -794080960, -902358144, -1003945408, -1096694144, --1176855936, -1242011136, -1292803968, -1329907584, -1351437184, -1355673728, -1344186752, -1319600768, -1282316672, -1232374784, --1172863232, -1108547200, -1042297856, -975305984, -909583872, -847816320, -791289216, -739690560, -692638656, -650415360, --613473280, -581705536, -554161920, -529680608, -507825120, -488477376, -470631776, -452970336, -435749120, -420651776, --408776736, -400292032, -395874112, -396789472, -403652832, -416310656, -434459040, -457537504, -484837376, -515965696, --549921728, -584192320, -616537216, -646397952, -672314304, -690305408, -697493568, -693863232, -677921920, -645913664, --596482880, -525728160, -416760544, -255793760, -71349608, 65669512, 106195216, 73027328, 22857816, }, -}, -{ -{ -23198728, -61559228, 95750928, 137297760, 153484944, 96155728, -12480638, -93413928, -121580864, -149810608, -202373488, --222976448, -169002128, -89407264, -54619636, -60062432, -57067768, -40763536, -44826572, -70948024, -84447112, --75777720, -76200776, -105965968, -143970528, -158818224, -144399488, -115995256, -89512488, -71548248, -57189100, --33515778, 5246840, 45134200, 63794224, 54092964, 28249610, 206695, -26316876, -52092584, -74698072, --90745144, -100841000, -109150152, -120179624, -137001936, -160759008, -191203360, -228334416, -272725056, -323382592, --376589184, -428057920, -475202176, -516584704, -550901504, -578105280, -600600704, -621953664, -644768000, -670379968, --699618496, -732452480, -766789120, -798380224, -822325184, -834703296, -833034688, -816078656, -784167104, -739744768, --686587584, -627903296, -565669184, -501964096, -439806272, -381877344, -329149120, -281542080, -239374640, -203550848, --174959248, -154366496, -142524192, -139860784, -146122304, -160189936, -180045568, -203606688, -230465264, -262363440, --301331136, -348290176, -404322304, -471761888, -552131456, -643851584, -743671424, -849317952, -958592128, -1066663168, --1166864768, -1254281344, -1326654720, -1382013056, -1417960960, -1434180864, -1433740032, -1420624896, -1397040128, -1364187904, --1324459520, -1280886528, -1234519680, -1184113920, -1128929408, -1070315008, -1009779008, -947248064, -882750528, -818495168, --757349824, -700115648, -646115008, -595666304, -549934592, -508849472, -471224480, -436821248, -406718368, -381813472, --362260640, -348076512, -339271264, -335725792, -337478144, -344461216, -355828384, -370701856, -389412352, -412315264, --437762944, -463297056, -488082752, -511443104, -529989824, -539554176, -538693568, -526605952, -499879424, -455919360, --395226112, -312759520, -194631808, -41409928, 105241192, 182446992, 166282880, 96889632, 28705414, }, -{ --134710032, --355053664, -462356992, -454677056, -356599328, -183980288, 41285372, 262398336, 404443104, 426653472, 346123904, -208153440, 46777564, -119379152, -266092016, -356883328, -362540864, -282207264, -142656272, 19508278, 171784736, -286243456, 337028768, 307856288, 205042272, 59186260, -89668720, -208699440, -276937344, -282728576, -225512624, --120118960, 6251325, 123831960, 207502752, 239558240, 214040768, 141594864, 46226196, -46559056, -119185880, --162174208, -170762528, -145114064, -92316024, -25178708, 41701984, 95078224, 124908384, 126542624, 102476312, -61328376, 14045617, -29835528, -63623500, -83169896, -86727200, -75383120, -52842056, -24046448, 6167036, -33442762, 54068268, 65636228, 67444408, 59914256, 43849468, 20435454, -8358007, -39323648, -67309656, --85029080, -85099408, -64057828, -25326348, 21291764, 63022204, 88467200, 91458104, 73073496, 40547176, -3528316, -29810832, -54602456, -68857992, -72016400, -63786168, -44141528, -14494978, 20885352, 54527832, -77333568, 81899656, 66048544, 34309808, -3853123, -37948720, -60123100, -67015984, -59624884, -41827076, --18555870, 5486821, 26436060, 41576896, 49426484, 49449032, 41713796, 26975616, 6971269, -15485505, --36599564, -51846696, -56868052, -49102752, -29229400, -1492501, 27186606, 49115100, 58404576, 53124988, -35735740, 11730629, -12408161, -31103616, -41052372, -41626288, -34236796, -21403970, -6115497, 8734353, -20910048, 28959890, 31982474, 29651380, 22461606, 11644193, -1104344, -13655849, -23618562, -29010356, --28798292, -22879290, -12122545, 1396401, 14827301, 25492242, 31286690, 30774514, 23921894, 12525735, --779000, -13266080, -21409876, -21661668, -14317273, -5112085, -53687, 488016, 18790, }, -}, -{ -{ --134710032, --355053664, -462356992, -454677056, -356599328, -183980288, 41285372, 262398336, 404443104, 426653472, 346123904, -208153440, 46777564, -119379152, -266092016, -356883328, -362540864, -282207264, -142656272, 19508278, 171784736, -286243456, 337028768, 307856288, 205042272, 59186260, -89668720, -208699440, -276937344, -282728576, -225512624, --120118960, 6251325, 123831960, 207502752, 239558240, 214040768, 141594864, 46226196, -46559056, -119185880, --162174208, -170762528, -145114064, -92316024, -25178708, 41701984, 95078224, 124908384, 126542624, 102476312, -61328376, 14045617, -29835528, -63623500, -83169896, -86727200, -75383120, -52842056, -24046448, 6167036, -33442762, 54068268, 65636228, 67444408, 59914256, 43849468, 20435454, -8358007, -39323648, -67309656, --85029080, -85099408, -64057828, -25326348, 21291764, 63022204, 88467200, 91458104, 73073496, 40547176, -3528316, -29810832, -54602456, -68857992, -72016400, -63786168, -44141528, -14494978, 20885352, 54527832, -77333568, 81899656, 66048544, 34309808, -3853123, -37948720, -60123100, -67015984, -59624884, -41827076, --18555870, 5486821, 26436060, 41576896, 49426484, 49449032, 41713796, 26975616, 6971269, -15485505, --36599564, -51846696, -56868052, -49102752, -29229400, -1492501, 27186606, 49115100, 58404576, 53124988, -35735740, 11730629, -12408161, -31103616, -41052372, -41626288, -34236796, -21403970, -6115497, 8734353, -20910048, 28959890, 31982474, 29651380, 22461606, 11644193, -1104344, -13655849, -23618562, -29010356, --28798292, -22879290, -12122545, 1396401, 14827301, 25492242, 31286690, 30774514, 23921894, 12525735, --779000, -13266080, -21409876, -21661668, -14317273, -5112085, -53687, 488016, 18790, }, -{ -23198728, -61559228, 95750928, 137297760, 153484944, 96155728, -12480638, -93413928, -121580864, -149810608, -202373488, --222976448, -169002128, -89407264, -54619636, -60062432, -57067768, -40763536, -44826572, -70948024, -84447112, --75777720, -76200776, -105965968, -143970528, -158818224, -144399488, -115995256, -89512488, -71548248, -57189100, --33515778, 5246840, 45134200, 63794224, 54092964, 28249610, 206695, -26316876, -52092584, -74698072, --90745144, -100841000, -109150152, -120179624, -137001936, -160759008, -191203360, -228334416, -272725056, -323382592, --376589184, -428057920, -475202176, -516584704, -550901504, -578105280, -600600704, -621953664, -644768000, -670379968, --699618496, -732452480, -766789120, -798380224, -822325184, -834703296, -833034688, -816078656, -784167104, -739744768, --686587584, -627903296, -565669184, -501964096, -439806272, -381877344, -329149120, -281542080, -239374640, -203550848, --174959248, -154366496, -142524192, -139860784, -146122304, -160189936, -180045568, -203606688, -230465264, -262363440, --301331136, -348290176, -404322304, -471761888, -552131456, -643851584, -743671424, -849317952, -958592128, -1066663168, --1166864768, -1254281344, -1326654720, -1382013056, -1417960960, -1434180864, -1433740032, -1420624896, -1397040128, -1364187904, --1324459520, -1280886528, -1234519680, -1184113920, -1128929408, -1070315008, -1009779008, -947248064, -882750528, -818495168, --757349824, -700115648, -646115008, -595666304, -549934592, -508849472, -471224480, -436821248, -406718368, -381813472, --362260640, -348076512, -339271264, -335725792, -337478144, -344461216, -355828384, -370701856, -389412352, -412315264, --437762944, -463297056, -488082752, -511443104, -529989824, -539554176, -538693568, -526605952, -499879424, -455919360, --395226112, -312759520, -194631808, -41409928, 105241192, 182446992, 166282880, 96889632, 28705414, }, -}, -{ -{ --4125853, --14767708, -29042032, -41738492, -46874200, -42393476, -20827908, 37269580, 137992464, 241750288, 284568416, -241448560, 146208736, 45365592, -37332928, -86877528, -88201448, -48722108, 1248225, 44657996, 86271400, -118205016, 112792824, 63035624, -1081795, -48502528, -71673880, -69729328, -40025872, 3649649, 33426656, -37935300, 27593554, 5938866, -38524248, -106998376, -180820272, -243455920, -293718848, -334321344, -364600832, --387406592, -409077376, -430395456, -447260192, -459261376, -469467296, -478806176, -487763328, -499535840, -515295136, --530793536, -542745920, -553990656, -568492096, -586156224, -605739648, -627893632, -652271296, -675657920, -695503936, --712557632, -728850048, -745584320, -763652160, -784144512, -807592896, -833343936, -859363904, -882591616, -900595584, --912911936, -919673856, -919725888, -911916608, -897406592, -878441088, -855408768, -827272960, -794356352, -758548160, --721204992, -682981376, -645543808, -611403072, -581723264, -555737600, -532580768, -512435232, -495456704, -480619200, --466320160, -451648576, -436605984, -421438304, -406230880, -391044416, -376126944, -361823616, -348162944, -334543584, --320139872, -304671008, -288301824, -270764928, -251427920, -230474384, -209052160, -187910720, -166958256, -146492208, --127567512, -110708688, -95519000, -81867448, -70162584, -60325500, -51804820, -44518948, -38556996, -33389076, --28616294, -24735790, -22054120, -20000052, -18549426, -18861348, -21626770, -26554172, -34089692, -45622216, --61571040, -81274200, -104590504, -131516192, -160885184, -191458912, -223045712, -254892352, -285142336, -313281344, --340161952, -364766752, -384908000, -401329248, -416241376, -428463776, -435818400, -440402720, -444750304, -446371104, --443175648, -436180224, -415763040, -357410528, -251464432, -130003288, -41952704, -4706211, 1130650, }, -{ --69776040, --199926976, -310493920, -391379968, -410279424, -341146560, -220535296, -138643152, -161903632, -281714432, -431863264, --531811456, -527844512, -430712192, -313395712, -245669440, -234024720, -241856048, -246089808, -241810416, -211413856, --134434624, -26459682, 67050344, 120003536, 145708912, 169338208, 203243216, 249530624, 305789856, 362501696, -406125664, 428072416, 426747936, 405230176, 372656608, 342246080, 320857152, 303298240, 280238560, 247717600, -207168288, 161693168, 114959632, 69615512, 24978456, -21061982, -68116032, -114034064, -158266864, -201481744, --243280368, -282763456, -319460192, -351561856, -375398944, -388531872, -391390720, -384812960, -368463648, -342605792, --308969216, -269061440, -223721632, -174591488, -123765392, -71724880, -17594870, 38373924, 94002336, 146620512, -193984352, 234253952, 266512928, 291203072, 309168928, 320415840, 324258752, 320284288, 308741024, 290266240, -265549776, 235231056, 200186272, 161926176, 122410328, 83385720, 46162844, 11814381, -18991808, -46236932, --70012264, -89895280, -105430712, -116912232, -124998584, -129893232, -131597800, -130620696, -127709776, -123243552, --117540904, -111405544, -105715792, -100761008, -96488048, -93046712, -90591600, -88866632, -87428888, -86055040, --84617296, -82773144, -79990008, -75703632, -69346008, -60391536, -48456896, -33323578, -15001247, 6155762, -29615946, 55006184, 81981800, 109794400, 137452368, 164257264, 189614224, 212451088, 231574432, 246505888, -257123056, 262678592, 262149776, 255290704, 242235088, 222452464, 195367856, 161559488, 122027536, 76943800, -26591754, -27271968, -82442432, -137508752, -190622992, -238597776, -278680032, -309303680, -328158048, -332487904, --321526624, -293460608, -240470928, -157793872, -62716188, 7940321, 31165356, 20784958, 5646272, }, -}, -{ -{ --69776040, --199926976, -310493920, -391379968, -410279424, -341146560, -220535296, -138643152, -161903632, -281714432, -431863264, --531811456, -527844512, -430712192, -313395712, -245669440, -234024720, -241856048, -246089808, -241810416, -211413856, --134434624, -26459682, 67050344, 120003536, 145708912, 169338208, 203243216, 249530624, 305789856, 362501696, -406125664, 428072416, 426747936, 405230176, 372656608, 342246080, 320857152, 303298240, 280238560, 247717600, -207168288, 161693168, 114959632, 69615512, 24978456, -21061982, -68116032, -114034064, -158266864, -201481744, --243280368, -282763456, -319460192, -351561856, -375398944, -388531872, -391390720, -384812960, -368463648, -342605792, --308969216, -269061440, -223721632, -174591488, -123765392, -71724880, -17594870, 38373924, 94002336, 146620512, -193984352, 234253952, 266512928, 291203072, 309168928, 320415840, 324258752, 320284288, 308741024, 290266240, -265549776, 235231056, 200186272, 161926176, 122410328, 83385720, 46162844, 11814381, -18991808, -46236932, --70012264, -89895280, -105430712, -116912232, -124998584, -129893232, -131597800, -130620696, -127709776, -123243552, --117540904, -111405544, -105715792, -100761008, -96488048, -93046712, -90591600, -88866632, -87428888, -86055040, --84617296, -82773144, -79990008, -75703632, -69346008, -60391536, -48456896, -33323578, -15001247, 6155762, -29615946, 55006184, 81981800, 109794400, 137452368, 164257264, 189614224, 212451088, 231574432, 246505888, -257123056, 262678592, 262149776, 255290704, 242235088, 222452464, 195367856, 161559488, 122027536, 76943800, -26591754, -27271968, -82442432, -137508752, -190622992, -238597776, -278680032, -309303680, -328158048, -332487904, --321526624, -293460608, -240470928, -157793872, -62716188, 7940321, 31165356, 20784958, 5646272, }, -{ --4125853, --14767708, -29042032, -41738492, -46874200, -42393476, -20827908, 37269580, 137992464, 241750288, 284568416, -241448560, 146208736, 45365592, -37332928, -86877528, -88201448, -48722108, 1248225, 44657996, 86271400, -118205016, 112792824, 63035624, -1081795, -48502528, -71673880, -69729328, -40025872, 3649649, 33426656, -37935300, 27593554, 5938866, -38524248, -106998376, -180820272, -243455920, -293718848, -334321344, -364600832, --387406592, -409077376, -430395456, -447260192, -459261376, -469467296, -478806176, -487763328, -499535840, -515295136, --530793536, -542745920, -553990656, -568492096, -586156224, -605739648, -627893632, -652271296, -675657920, -695503936, --712557632, -728850048, -745584320, -763652160, -784144512, -807592896, -833343936, -859363904, -882591616, -900595584, --912911936, -919673856, -919725888, -911916608, -897406592, -878441088, -855408768, -827272960, -794356352, -758548160, --721204992, -682981376, -645543808, -611403072, -581723264, -555737600, -532580768, -512435232, -495456704, -480619200, --466320160, -451648576, -436605984, -421438304, -406230880, -391044416, -376126944, -361823616, -348162944, -334543584, --320139872, -304671008, -288301824, -270764928, -251427920, -230474384, -209052160, -187910720, -166958256, -146492208, --127567512, -110708688, -95519000, -81867448, -70162584, -60325500, -51804820, -44518948, -38556996, -33389076, --28616294, -24735790, -22054120, -20000052, -18549426, -18861348, -21626770, -26554172, -34089692, -45622216, --61571040, -81274200, -104590504, -131516192, -160885184, -191458912, -223045712, -254892352, -285142336, -313281344, --340161952, -364766752, -384908000, -401329248, -416241376, -428463776, -435818400, -440402720, -444750304, -446371104, --443175648, -436180224, -415763040, -357410528, -251464432, -130003288, -41952704, -4706211, 1130650, }, -}, -{ -{ -4600447, -19346680, 44991392, 63967096, 37875168, -42050952, -119665304, -130808600, -85799488, -48747880, -42614128, --30416958, 6164352, 28224914, -804233, -64210836, -126092720, -180239920, -237944944, -293541696, -329953344, --344641056, -349177088, -350809696, -348528544, -341931488, -333844064, -326418592, -319338336, -309974784, -294711520, --273317216, -251272224, -234176112, -221063040, -206330224, -186406944, -161877856, -135534672, -111140872, -92090008, --79091288, -70537856, -65754876, -65877284, -71478456, -81757384, -96047816, -113733416, -132603896, -149208768, --160987184, -167227776, -168843216, -168241392, -168576928, -172385488, -181468816, -197534672, -221246112, -250856160, --283442624, -317161856, -350805408, -382150624, -408971072, -431287744, -450754144, -468265792, -483745920, -497657856, --510922880, -523423360, -533833824, -540915136, -544164864, -543285440, -537748160, -527259328, -512605952, -495719744, --478473312, -461465248, -444370208, -427017984, -409177248, -389593248, -366583520, -339779680, -310380096, -279799936, --249073744, -219411632, -192223408, -168497472, -148803968, -133796824, -124318904, -121394032, -126326800, -140132976, --162630544, -192760816, -229733504, -272853888, -320412064, -370109152, -420674880, -471803776, -522449472, -570576768, --614814912, -655093120, -691254080, -722185856, -746924864, -765859264, -780155584, -790358784, -796305216, -798383424, --798019392, -796342208, -793002368, -787184320, -779196160, -769785408, -758301696, -743142080, -723924800, -701610816, --676507840, -647901184, -615899392, -582057728, -547816640, -513594336, -479704352, -447123264, -416993536, -389851488, --365435680, -343231232, -323292384, -306035200, -290884704, -276268416, -261546336, -247164096, -232224048, -214475104, --192652368, -163808976, -118643104, -50144816, 27531814, 80195632, 85242752, 55034636, 17487496, }, -{ --99621232, --286525856, -426905792, -479705440, -432011968, -323699328, -220398400, -155248032, -104107856, -23679228, 92591976, -205608144, 273819744, 292754112, 287597440, 276765536, 253286576, 200076224, 114409336, 14027363, -76716168, --143684368, -188199568, -218924688, -239735952, -245462752, -228540576, -187456528, -127361888, -55034100, 22943716, -97618168, 157806768, 195323840, 208820768, 201669120, 177899696, 141368848, 96980896, 50311784, 5823976, --33888904, -67592584, -94911264, -115949088, -130647536, -138425728, -138543840, -130454264, -113604568, -87367152, --51758652, -8462159, 38787848, 84825064, 124388160, 153377040, 169199696, 170266464, 155651760, 125596656, -82256136, 29805462, -26240102, -80012560, -126178624, -160451920, -179634864, -181446256, -164609984, -129440112, --78724064, -18290118, 43474196, 97401808, 135857872, 154479776, 152887408, 134421744, 104892232, 70540544, -36217848, 4746476, -22646288, -45631880, -64202244, -78178072, -86946248, -89597848, -85337240, -73968464, --56345676, -34479996, -11038066, 11462194, 31138512, 46814068, 57956288, 64547452, 66799088, 64929168, -59168008, 49832360, 37300716, 22064320, 4896800, -13102871, -30626338, -46220292, -58353036, -65668440, --67281736, -62858456, -52617644, -37437084, -18846316, 1262720, 20951388, 38391640, 52051244, 60915520, -64485712, 62605052, 55444268, 43579424, 27926952, 9672266, -9613211, -27947352, -43250856, -53731116, --58120572, -55941948, -47761112, -35042640, -19684372, -3697430, 11003169, 22971632, 31496068, 36412196, -37870336, 36382132, 32725504, 27558120, 21326124, 14526653, 7638600, 853625, -5680094, -11527155, --16320876, -19895362, -21371758, -19102940, -12946105, -5827734, -1298154, 30602, 38655, }, -}, -{ -{ --99621232, --286525856, -426905792, -479705440, -432011968, -323699328, -220398400, -155248032, -104107856, -23679228, 92591976, -205608144, 273819744, 292754112, 287597440, 276765536, 253286576, 200076224, 114409336, 14027363, -76716168, --143684368, -188199568, -218924688, -239735952, -245462752, -228540576, -187456528, -127361888, -55034100, 22943716, -97618168, 157806768, 195323840, 208820768, 201669120, 177899696, 141368848, 96980896, 50311784, 5823976, --33888904, -67592584, -94911264, -115949088, -130647536, -138425728, -138543840, -130454264, -113604568, -87367152, --51758652, -8462159, 38787848, 84825064, 124388160, 153377040, 169199696, 170266464, 155651760, 125596656, -82256136, 29805462, -26240102, -80012560, -126178624, -160451920, -179634864, -181446256, -164609984, -129440112, --78724064, -18290118, 43474196, 97401808, 135857872, 154479776, 152887408, 134421744, 104892232, 70540544, -36217848, 4746476, -22646288, -45631880, -64202244, -78178072, -86946248, -89597848, -85337240, -73968464, --56345676, -34479996, -11038066, 11462194, 31138512, 46814068, 57956288, 64547452, 66799088, 64929168, -59168008, 49832360, 37300716, 22064320, 4896800, -13102871, -30626338, -46220292, -58353036, -65668440, --67281736, -62858456, -52617644, -37437084, -18846316, 1262720, 20951388, 38391640, 52051244, 60915520, -64485712, 62605052, 55444268, 43579424, 27926952, 9672266, -9613211, -27947352, -43250856, -53731116, --58120572, -55941948, -47761112, -35042640, -19684372, -3697430, 11003169, 22971632, 31496068, 36412196, -37870336, 36382132, 32725504, 27558120, 21326124, 14526653, 7638600, 853625, -5680094, -11527155, --16320876, -19895362, -21371758, -19102940, -12946105, -5827734, -1298154, 30602, 38655, }, -{ -4600447, -19346680, 44991392, 63967096, 37875168, -42050952, -119665304, -130808600, -85799488, -48747880, -42614128, --30416958, 6164352, 28224914, -804233, -64210836, -126092720, -180239920, -237944944, -293541696, -329953344, --344641056, -349177088, -350809696, -348528544, -341931488, -333844064, -326418592, -319338336, -309974784, -294711520, --273317216, -251272224, -234176112, -221063040, -206330224, -186406944, -161877856, -135534672, -111140872, -92090008, --79091288, -70537856, -65754876, -65877284, -71478456, -81757384, -96047816, -113733416, -132603896, -149208768, --160987184, -167227776, -168843216, -168241392, -168576928, -172385488, -181468816, -197534672, -221246112, -250856160, --283442624, -317161856, -350805408, -382150624, -408971072, -431287744, -450754144, -468265792, -483745920, -497657856, --510922880, -523423360, -533833824, -540915136, -544164864, -543285440, -537748160, -527259328, -512605952, -495719744, --478473312, -461465248, -444370208, -427017984, -409177248, -389593248, -366583520, -339779680, -310380096, -279799936, --249073744, -219411632, -192223408, -168497472, -148803968, -133796824, -124318904, -121394032, -126326800, -140132976, --162630544, -192760816, -229733504, -272853888, -320412064, -370109152, -420674880, -471803776, -522449472, -570576768, --614814912, -655093120, -691254080, -722185856, -746924864, -765859264, -780155584, -790358784, -796305216, -798383424, --798019392, -796342208, -793002368, -787184320, -779196160, -769785408, -758301696, -743142080, -723924800, -701610816, --676507840, -647901184, -615899392, -582057728, -547816640, -513594336, -479704352, -447123264, -416993536, -389851488, --365435680, -343231232, -323292384, -306035200, -290884704, -276268416, -261546336, -247164096, -232224048, -214475104, --192652368, -163808976, -118643104, -50144816, 27531814, 80195632, 85242752, 55034636, 17487496, }, -}, -{ -{ -439160, -9365176, 29668024, 40453224, 15341623, -45351632, -109128136, -144421504, -150375392, -144258288, -131021736, --104107856, -71233104, -57051124, -75888312, -118171192, -168489424, -221575760, -273609280, -312674144, -330016704, --333112288, -337341760, -348790528, -362461952, -373274528, -381112320, -386730656, -389323744, -388740704, -386155136, --381738304, -373836096, -360605440, -340908736, -313929376, -279907840, -241828128, -205013280, -174007920, -150196624, --132822936, -121436976, -116219664, -116342072, -119497800, -123473328, -127311960, -130748472, -133538584, -135819744, --138475120, -142795312, -150106416, -161509568, -177308064, -196745472, -218684704, -242115360, -265623328, -287307008, --306123808, -322685728, -337959712, -351861984, -363726272, -373157504, -379437280, -380878240, -375808576, -363919008, --346204960, -324234592, -299991648, -275821184, -253755264, -234803184, -218847904, -204974624, -191987728, -179002432, --165625744, -151641872, -136889200, -121520728, -105938592, -90356448, -74778600, -59408524, -44675176, -30919470, --18438294, -7765301, 328565, 4874251, 4648229, -1475321, -14002130, -33019172, -58642948, -90458456, --126786360, -165555424, -205805712, -247382064, -289544672, -331192448, -372222272, -413219872, -453753088, -492213984, --527374752, -558949760, -586488512, -608848128, -625194240, -635851136, -641718016, -643196032, -640171328, -633021248, --623069824, -611607104, -598890752, -584830656, -570187520, -555927680, -541649088, -525968128, -508355008, -489191392, --468209408, -444536096, -418368992, -391147488, -364010304, -337297728, -311460832, -287304864, -265427904, -246115040, --229447360, -215199872, -203242144, -193907568, -187083408, -181587456, -176594016, -172417168, -168547936, -162928512, --154181280, -140419664, -114481280, -68539624, -9762461, 36551784, 49731428, 34809636, 11406359, }, -{ --71346384, --213462560, -339756064, -413504960, -409455872, -352985632, -305631488, -298819136, -300228416, -264136736, -195585824, --136284144, -100468408, -60189672, 7589207, 92245696, 172898736, 241975776, 295543136, 323312800, 321893312, -303480256, 280539744, 252025456, 212051664, 162432976, 109136728, 53380536, -7004555, -71178880, -134117336, --188985008, -229179456, -251300688, -257305056, -251393568, -234900352, -206775824, -168413728, -125017912, -82274392, --43759276, -11020886, 16053514, 39014948, 59700584, 79435424, 99726992, 122451664, 148089936, 174238240, -196432480, 209955712, 211052544, 198057584, 172362400, 137605376, 97203696, 52851720, 5244692, -44642428, --95086816, -143431504, -185908736, -218344320, -237670064, -242820272, -234431664, -214183040, -184224576, -146399328, --101692480, -50829864, 4360466, 60305636, 112264536, 155409632, 185961888, 202288128, 205284400, 197435888, -181369488, 159261680, 133054864, 104489040, 74815648, 44843752, 15293305, -13164612, -40124660, -65403224, --88772144, -109890496, -128330936, -143368688, -153753392, -157929712, -154617216, -143216752, -123850216, -97302488, --65005404, -28906740, 8858370, 46210092, 81095424, 111469432, 135565280, 152172304, 160555008, 160288720, -151451824, 134831376, 111693848, 83490408, 51971788, 19245748, -12685723, -42281804, -68209448, -89182848, --104380592, -113607792, -116795728, -113810192, -104951280, -91091424, -73173896, -52182244, -29644402, -7425999, -13060996, 30902826, 45198624, 55365348, 61724584, 65044596, 65811248, 64531884, 62112208, 59181428, -55647208, 51414516, 46716360, 41342820, 34611532, 26388816, 17041894, 6484327, -5341329, -17431662, --28704878, -38885024, -46234788, -46222976, -36266704, -20924544, -8422431, -2397666, -471910, }, -}, -{ -{ --71346384, --213462560, -339756064, -413504960, -409455872, -352985632, -305631488, -298819136, -300228416, -264136736, -195585824, --136284144, -100468408, -60189672, 7589207, 92245696, 172898736, 241975776, 295543136, 323312800, 321893312, -303480256, 280539744, 252025456, 212051664, 162432976, 109136728, 53380536, -7004555, -71178880, -134117336, --188985008, -229179456, -251300688, -257305056, -251393568, -234900352, -206775824, -168413728, -125017912, -82274392, --43759276, -11020886, 16053514, 39014948, 59700584, 79435424, 99726992, 122451664, 148089936, 174238240, -196432480, 209955712, 211052544, 198057584, 172362400, 137605376, 97203696, 52851720, 5244692, -44642428, --95086816, -143431504, -185908736, -218344320, -237670064, -242820272, -234431664, -214183040, -184224576, -146399328, --101692480, -50829864, 4360466, 60305636, 112264536, 155409632, 185961888, 202288128, 205284400, 197435888, -181369488, 159261680, 133054864, 104489040, 74815648, 44843752, 15293305, -13164612, -40124660, -65403224, --88772144, -109890496, -128330936, -143368688, -153753392, -157929712, -154617216, -143216752, -123850216, -97302488, --65005404, -28906740, 8858370, 46210092, 81095424, 111469432, 135565280, 152172304, 160555008, 160288720, -151451824, 134831376, 111693848, 83490408, 51971788, 19245748, -12685723, -42281804, -68209448, -89182848, --104380592, -113607792, -116795728, -113810192, -104951280, -91091424, -73173896, -52182244, -29644402, -7425999, -13060996, 30902826, 45198624, 55365348, 61724584, 65044596, 65811248, 64531884, 62112208, 59181428, -55647208, 51414516, 46716360, 41342820, 34611532, 26388816, 17041894, 6484327, -5341329, -17431662, --28704878, -38885024, -46234788, -46222976, -36266704, -20924544, -8422431, -2397666, -471910, }, -{ -439160, -9365176, 29668024, 40453224, 15341623, -45351632, -109128136, -144421504, -150375392, -144258288, -131021736, --104107856, -71233104, -57051124, -75888312, -118171192, -168489424, -221575760, -273609280, -312674144, -330016704, --333112288, -337341760, -348790528, -362461952, -373274528, -381112320, -386730656, -389323744, -388740704, -386155136, --381738304, -373836096, -360605440, -340908736, -313929376, -279907840, -241828128, -205013280, -174007920, -150196624, --132822936, -121436976, -116219664, -116342072, -119497800, -123473328, -127311960, -130748472, -133538584, -135819744, --138475120, -142795312, -150106416, -161509568, -177308064, -196745472, -218684704, -242115360, -265623328, -287307008, --306123808, -322685728, -337959712, -351861984, -363726272, -373157504, -379437280, -380878240, -375808576, -363919008, --346204960, -324234592, -299991648, -275821184, -253755264, -234803184, -218847904, -204974624, -191987728, -179002432, --165625744, -151641872, -136889200, -121520728, -105938592, -90356448, -74778600, -59408524, -44675176, -30919470, --18438294, -7765301, 328565, 4874251, 4648229, -1475321, -14002130, -33019172, -58642948, -90458456, --126786360, -165555424, -205805712, -247382064, -289544672, -331192448, -372222272, -413219872, -453753088, -492213984, --527374752, -558949760, -586488512, -608848128, -625194240, -635851136, -641718016, -643196032, -640171328, -633021248, --623069824, -611607104, -598890752, -584830656, -570187520, -555927680, -541649088, -525968128, -508355008, -489191392, --468209408, -444536096, -418368992, -391147488, -364010304, -337297728, -311460832, -287304864, -265427904, -246115040, --229447360, -215199872, -203242144, -193907568, -187083408, -181587456, -176594016, -172417168, -168547936, -162928512, --154181280, -140419664, -114481280, -68539624, -9762461, 36551784, 49731428, 34809636, 11406359, }, -}, -}; -const Word32 CRendBin_Combined_HRIR_coeff_re_16kHz_fx[15][BINAURAL_CHANNELS][80] ={ -{ -{ -665281280, -674784448, 698239808, 731240192, 748593472, 727196992, 689475904, 685777408, 708633664, 676513152, 556107520, -451947584, 493353760, 659701056, 808494336, 867047040, 900015232, 977696704, 1075521024, 1138411136, 1160941952, -1154109824, 1096802048, 976626176, 839007872, 747508480, 718602816, 727278080, 754160832, 799917248, 870264512, -967069888, 1082529280, 1192306048, 1267405184, 1298377728, 1297374848, 1278310528, 1247297664, 1207363072, 1159006592, -1100992896, 1040038144, 991227968, 961344128, 942479040, 926492096, 911659968, 892559168, 860845632, 819307968, -779264384, 743933440, 709595200, 678932864, 656769728, 638880704, 620198656, 604545664, 592851520, 575412864, -547787648, 516941728, 481964064, 430530752, 362592960, 292907104, 225806832, 155925024, 93299040, 53560928, -27193048, -3490198, -27827094, -33299418, -51461760, -118380576, -203644800, -245106800, -242138976, }, -{ -524114848, -533789280, 470712320, 324263040, 183661936, 95593624, 13487271, -82588464, -127956200, -79816064, 7536057, -54663124, 30402462, -71739912, -247676272, -438472672, -547349568, -541801024, -482090752, -423726432, -356343232, --266416288, -190427040, -161387152, -155142816, -132955544, -95782600, -57178364, 214212, 98348848, 218841472, -323258016, 402958112, 474727552, 535242048, 552199104, 505210560, 414675328, 321215232, 247467968, 188448128, -131875360, 74614320, 17566416, -42997992, -109456704, -174512032, -228280736, -269658976, -302424768, -324817632, --332062176, -325179488, -308778080, -284093824, -251596496, -215451664, -178305568, -136985840, -89327264, -39129300, -10106595, 58457188, 102657768, 135197520, 154283280, 165445360, 170970832, 168290240, 159845792, 152339264, -145684752, 135665664, 126222112, 123444880, 118667264, 95619392, 55449100, 18055506, -1458678, }, -}, -{ -{ -524114848, -533789280, 470712320, 324263040, 183661936, 95593624, 13487271, -82588464, -127956200, -79816064, 7536057, -54663124, 30402462, -71739912, -247676272, -438472672, -547349568, -541801024, -482090752, -423726432, -356343232, --266416288, -190427040, -161387152, -155142816, -132955544, -95782600, -57178364, 214212, 98348848, 218841472, -323258016, 402958112, 474727552, 535242048, 552199104, 505210560, 414675328, 321215232, 247467968, 188448128, -131875360, 74614320, 17566416, -42997992, -109456704, -174512032, -228280736, -269658976, -302424768, -324817632, --332062176, -325179488, -308778080, -284093824, -251596496, -215451664, -178305568, -136985840, -89327264, -39129300, -10106595, 58457188, 102657768, 135197520, 154283280, 165445360, 170970832, 168290240, 159845792, 152339264, -145684752, 135665664, 126222112, 123444880, 118667264, 95619392, 55449100, 18055506, -1458678, }, -{ -665281280, -674784448, 698239808, 731240192, 748593472, 727196992, 689475904, 685777408, 708633664, 676513152, 556107520, -451947584, 493353760, 659701056, 808494336, 867047040, 900015232, 977696704, 1075521024, 1138411136, 1160941952, -1154109824, 1096802048, 976626176, 839007872, 747508480, 718602816, 727278080, 754160832, 799917248, 870264512, -967069888, 1082529280, 1192306048, 1267405184, 1298377728, 1297374848, 1278310528, 1247297664, 1207363072, 1159006592, -1100992896, 1040038144, 991227968, 961344128, 942479040, 926492096, 911659968, 892559168, 860845632, 819307968, -779264384, 743933440, 709595200, 678932864, 656769728, 638880704, 620198656, 604545664, 592851520, 575412864, -547787648, 516941728, 481964064, 430530752, 362592960, 292907104, 225806832, 155925024, 93299040, 53560928, -27193048, -3490198, -27827094, -33299418, -51461760, -118380576, -203644800, -245106800, -242138976, }, -}, -{ -{ -602370240, -637539008, 669323968, 636987136, 540635456, 483809280, 541556736, 613094208, 531643392, 322999264, 215506432, -347957856, 588924864, 718721408, 697091968, 661672448, 721040704, 843483776, 931750208, 931413056, 856077184, -753607296, 668653952, 621145664, 607285312, 618784000, 656078784, 721098688, 805003584, 887858304, 946848640, -965448000, 942007680, 891112832, 830678336, 766307520, 693250688, 613766400, 545172544, 506799712, 503085632, -522555264, 548847936, 568437824, 572668416, 560602752, 539573504, 516954080, 491754976, 459128256, 420713536, -383797216, 352052032, 324045632, 299112800, 277784000, 258055056, 237306608, 215845200, 194331696, 171894256, -150265344, 133504760, 120547384, 105984224, 90401008, 79930952, 74162808, 66552128, 57468808, 52935472, -51010788, 45456324, 40671728, 43430172, 42086384, 16999480, -28233504, -68147176, -87076168, }, -{ -602370240, -637539008, 669323968, 636987136, 540635456, 483809280, 541556736, 613094208, 531643392, 322999264, 215506432, -347957856, 588924864, 718721408, 697091968, 661672448, 721040704, 843483776, 931750208, 931413056, 856077184, -753607296, 668653952, 621145664, 607285312, 618784000, 656078784, 721098688, 805003584, 887858304, 946848640, -965448000, 942007680, 891112832, 830678336, 766307520, 693250688, 613766400, 545172544, 506799712, 503085632, -522555264, 548847936, 568437824, 572668416, 560602752, 539573504, 516954080, 491754976, 459128256, 420713536, -383797216, 352052032, 324045632, 299112800, 277784000, 258055056, 237306608, 215845200, 194331696, 171894256, -150265344, 133504760, 120547384, 105984224, 90401008, 79930952, 74162808, 66552128, 57468808, 52935472, -51010788, 45456324, 40671728, 43430172, 42086384, 16999480, -28233504, -68147176, -87076168, }, -}, -{ -{ -554296640, -547196032, 566668864, 618661056, 679085312, 742984256, 811807872, 848410112, 818592320, 762813568, 748776000, -765459264, 744624384, 676696768, 620590016, 601593408, 582660096, 541901952, 502089728, 473425120, 434916992, -384839264, 352291456, 348175808, 352792896, 356490880, 367396864, 376819488, 360623712, 319377536, 280715296, -259372000, 245877744, 234353280, 232350752, 242504592, 258529120, 279809056, 311139776, 349029984, 382816352, -406947072, 421723360, 426924576, 423932608, 419369728, 419914112, 427815264, 444200544, 470166304, 502258848, -532944224, 556508608, 569734400, 568993536, 552990464, 526220992, 494308864, 458682112, 419633888, 379832416, -340900160, 301575424, 262233520, 225994192, 194006896, 165567776, 142686336, 127879968, 119163864, 114121576, -114892520, 121773600, 129415416, 138241040, 157090576, 180498144, 179665456, 140071232, 95798168, }, -{ -477454336, -401040416, 262195936, 104383808, -22741314, -110121352, -182601616, -243891872, -265826256, -240394688, -202544208, --183463280, -174869600, -159462480, -144265264, -136873088, -113585240, -42030548, 75551696, 202205984, 299249152, -345080224, 335348352, 282432224, 208138944, 126522224, 40561672, -41695544, -102866080, -134796480, -147696416, --154232272, -156779184, -154798144, -151095344, -144431696, -126498064, -91458648, -41634340, 16705812, 75270912, -122406568, 148172080, 150975072, 135045584, 105265352, 68783368, 35770636, 12797392, -663572, -7075422, --8021389, -7206955, -8933532, -12796855, -15990163, -19165754, -23754928, -27308476, -28304908, -30581240, --36782100, -43931072, -50539952, -59223304, -67665600, -67461048, -55589760, -35688492, -7253663, 31792422, -72493680, 101975408, 120829240, 134001368, 129902360, 94151048, 40635224, 1247151, -13009456, }, -}, -{ -{ -477454336, -401040416, 262195936, 104383808, -22741314, -110121352, -182601616, -243891872, -265826256, -240394688, -202544208, --183463280, -174869600, -159462480, -144265264, -136873088, -113585240, -42030548, 75551696, 202205984, 299249152, -345080224, 335348352, 282432224, 208138944, 126522224, 40561672, -41695544, -102866080, -134796480, -147696416, --154232272, -156779184, -154798144, -151095344, -144431696, -126498064, -91458648, -41634340, 16705812, 75270912, -122406568, 148172080, 150975072, 135045584, 105265352, 68783368, 35770636, 12797392, -663572, -7075422, --8021389, -7206955, -8933532, -12796855, -15990163, -19165754, -23754928, -27308476, -28304908, -30581240, --36782100, -43931072, -50539952, -59223304, -67665600, -67461048, -55589760, -35688492, -7253663, 31792422, -72493680, 101975408, 120829240, 134001368, 129902360, 94151048, 40635224, 1247151, -13009456, }, -{ -554296640, -547196032, 566668864, 618661056, 679085312, 742984256, 811807872, 848410112, 818592320, 762813568, 748776000, -765459264, 744624384, 676696768, 620590016, 601593408, 582660096, 541901952, 502089728, 473425120, 434916992, -384839264, 352291456, 348175808, 352792896, 356490880, 367396864, 376819488, 360623712, 319377536, 280715296, -259372000, 245877744, 234353280, 232350752, 242504592, 258529120, 279809056, 311139776, 349029984, 382816352, -406947072, 421723360, 426924576, 423932608, 419369728, 419914112, 427815264, 444200544, 470166304, 502258848, -532944224, 556508608, 569734400, 568993536, 552990464, 526220992, 494308864, 458682112, 419633888, 379832416, -340900160, 301575424, 262233520, 225994192, 194006896, 165567776, 142686336, 127879968, 119163864, 114121576, -114892520, 121773600, 129415416, 138241040, 157090576, 180498144, 179665456, 140071232, 95798168, }, -}, -{ -{ -621756672, -610452800, 630615552, 702445632, 792348480, 858193536, 893816000, 907361792, 886694400, 824003968, 755261440, -727917504, 733139136, 716980352, 663897280, 620523968, 620393024, 632726528, 615048448, 577073984, 555149248, -552123392, 543052416, 523071168, 510752672, 511525760, 510709184, 501455136, 494210624, 497641216, 508644928, -521307040, 531829696, 535974336, 532874432, 529774560, 535202848, 550437632, 572668928, 600793984, 632921920, -664218304, 691969728, 717544640, 740619840, 757538304, 767474688, 774215616, 780483072, 786036992, 791412672, -797712320, 802936640, 803587840, 798848320, 789148160, 773271808, 750862848, 724289856, 694559040, 659781056, -620432192, 580501888, 540989760, 498887296, 454513856, 412135392, 371802432, 329539968, 287038560, 251136944, -222513664, 196285904, 175022064, 167052224, 167232608, 153102160, 109348792, 49311592, 6205691, }, -{ -484072864, -362911328, 165609648, -41981156, -212093008, -332805216, -402363808, -400033792, -304724160, -137953808, 36216776, -160706944, 222448160, 239901840, 229993344, 195366256, 135999072, 62549756, -7023882, -63296008, -110795120, --152567968, -176795888, -168798656, -131159712, -80323408, -26991722, 27882928, 80286360, 119317952, 137106096, -133840304, 113017232, 78420200, 35158064, -11215233, -55674588, -91772712, -112176496, -113720000, -99439232, --74932144, -45231376, -14150307, 16697759, 47128676, 74521440, 93131000, 98641440, 90078352, 67349920, -32195612, -8400956, -45283988, -73177112, -89565104, -91423744, -79084840, -59047212, -37090264, -13511430, -10936597, 32290638, 50281720, 68347960, 83755624, 88343720, 79904648, 60663192, 27116276, -22636088, --75426072, -114201568, -134971488, -134073848, -95666104, -22046604, 41375568, 52510808, 32166084, }, -}, -{ -{ -484072864, -362911328, 165609648, -41981156, -212093008, -332805216, -402363808, -400033792, -304724160, -137953808, 36216776, -160706944, 222448160, 239901840, 229993344, 195366256, 135999072, 62549756, -7023882, -63296008, -110795120, --152567968, -176795888, -168798656, -131159712, -80323408, -26991722, 27882928, 80286360, 119317952, 137106096, -133840304, 113017232, 78420200, 35158064, -11215233, -55674588, -91772712, -112176496, -113720000, -99439232, --74932144, -45231376, -14150307, 16697759, 47128676, 74521440, 93131000, 98641440, 90078352, 67349920, -32195612, -8400956, -45283988, -73177112, -89565104, -91423744, -79084840, -59047212, -37090264, -13511430, -10936597, 32290638, 50281720, 68347960, 83755624, 88343720, 79904648, 60663192, 27116276, -22636088, --75426072, -114201568, -134971488, -134073848, -95666104, -22046604, 41375568, 52510808, 32166084, }, -{ -621756672, -610452800, 630615552, 702445632, 792348480, 858193536, 893816000, 907361792, 886694400, 824003968, 755261440, -727917504, 733139136, 716980352, 663897280, 620523968, 620393024, 632726528, 615048448, 577073984, 555149248, -552123392, 543052416, 523071168, 510752672, 511525760, 510709184, 501455136, 494210624, 497641216, 508644928, -521307040, 531829696, 535974336, 532874432, 529774560, 535202848, 550437632, 572668928, 600793984, 632921920, -664218304, 691969728, 717544640, 740619840, 757538304, 767474688, 774215616, 780483072, 786036992, 791412672, -797712320, 802936640, 803587840, 798848320, 789148160, 773271808, 750862848, 724289856, 694559040, 659781056, -620432192, 580501888, 540989760, 498887296, 454513856, 412135392, 371802432, 329539968, 287038560, 251136944, -222513664, 196285904, 175022064, 167052224, 167232608, 153102160, 109348792, 49311592, 6205691, }, -}, -{ -{ -663314752, -680615424, 704123904, 749817024, 838668608, 933881600, 965105984, 926342848, 883536512, 867071744, 829009728, -740681600, 661032000, 653968896, 694012480, 715598464, 713035968, 725833920, 755362368, 764999168, 750177792, -746233920, 766158272, 779788864, 761093952, 720125888, 682184128, 661349248, 657734528, 661714368, 660551488, -654196544, 660604096, 694720064, 748607424, 801209536, 839960832, 865090176, 880818880, 890421376, 895874368, -898570496, 902171328, 912473856, 930828928, 952021376, 972181952, 992491264, 1012047872, 1025152832, 1028589376, -1023516992, 1009262528, 984214848, 952265088, 919344704, 886117760, 852254656, 821971904, 796597248, 769538944, -736346880, 699329664, 656234496, 598574016, 526703104, 450481408, 372134208, 287646848, 204881744, 136896720, -79741976, 23230404, -23418310, -49200996, -74181600, -124141200, -181532704, -207284784, -203362400, }, -{ -491119840, -348995616, 128621384, -97632120, -289412608, -423000064, -463336768, -380973248, -195104256, 24281598, 206642144, -322000672, 370486560, 351555424, 260226160, 107231376, -71365176, -228021424, -325345920, -347531584, -296888000, --184866672, -31224950, 129964640, 255163472, 311949920, 293880992, 214185728, 93033288, -44268228, -166360192, --244839984, -264906608, -226057552, -138746240, -24590836, 86406152, 166708624, 201445776, 189976064, 141800496, -71440336, -6223408, -77591272, -129388576, -151008896, -140083584, -102848896, -48852032, 10887205, 62631896, -94646048, 104201816, 95234992, 71203576, 35948876, -2226404, -34846680, -58946816, -73388640, -74912816, --63276680, -43950400, -20984674, 5622112, 32672354, 53384832, 66130684, 72770168, 68470368, 46321760, -10834592, -26956826, -62720480, -90538984, -91584808, -56170656, -9368934, 13955422, 13662291, }, -}, -{ -{ -491119840, -348995616, 128621384, -97632120, -289412608, -423000064, -463336768, -380973248, -195104256, 24281598, 206642144, -322000672, 370486560, 351555424, 260226160, 107231376, -71365176, -228021424, -325345920, -347531584, -296888000, --184866672, -31224950, 129964640, 255163472, 311949920, 293880992, 214185728, 93033288, -44268228, -166360192, --244839984, -264906608, -226057552, -138746240, -24590836, 86406152, 166708624, 201445776, 189976064, 141800496, -71440336, -6223408, -77591272, -129388576, -151008896, -140083584, -102848896, -48852032, 10887205, 62631896, -94646048, 104201816, 95234992, 71203576, 35948876, -2226404, -34846680, -58946816, -73388640, -74912816, --63276680, -43950400, -20984674, 5622112, 32672354, 53384832, 66130684, 72770168, 68470368, 46321760, -10834592, -26956826, -62720480, -90538984, -91584808, -56170656, -9368934, 13955422, 13662291, }, -{ -663314752, -680615424, 704123904, 749817024, 838668608, 933881600, 965105984, 926342848, 883536512, 867071744, 829009728, -740681600, 661032000, 653968896, 694012480, 715598464, 713035968, 725833920, 755362368, 764999168, 750177792, -746233920, 766158272, 779788864, 761093952, 720125888, 682184128, 661349248, 657734528, 661714368, 660551488, -654196544, 660604096, 694720064, 748607424, 801209536, 839960832, 865090176, 880818880, 890421376, 895874368, -898570496, 902171328, 912473856, 930828928, 952021376, 972181952, 992491264, 1012047872, 1025152832, 1028589376, -1023516992, 1009262528, 984214848, 952265088, 919344704, 886117760, 852254656, 821971904, 796597248, 769538944, -736346880, 699329664, 656234496, 598574016, 526703104, 450481408, 372134208, 287646848, 204881744, 136896720, -79741976, 23230404, -23418310, -49200996, -74181600, -124141200, -181532704, -207284784, -203362400, }, -}, -{ -{ -698450240, -695113600, 688707136, 673868544, 646702336, 610917760, 568857664, 527102560, 519145056, 586428416, 718136768, -845610880, 914316416, 924911552, 894738880, 830247232, 753590144, 704238272, 693756416, 701662912, 724094464, -778277056, 853215104, 906342784, 916561024, 898645696, 867138880, 828636608, 804123648, 816253184, 857867648, -905643776, 954590336, 1010564992, 1063627712, 1095899008, 1103429120, 1092297216, 1067622016, 1037442368, 1011192576, -988458240, 963559808, 938667776, 917664832, 896221696, 872711040, 855399104, 846239552, 834929280, 818068352, -803600704, 792021504, 776625664, 761370432, 753275008, 743880832, 723544128, 700462464, 681426624, 655573056, -619867392, 590852736, 571201152, 541938432, 502302336, 471169184, 441192992, 387073184, 319064544, 263699712, -203195440, 109921096, 14169097, -55798068, -158887488, -345028160, -519762432, -554675136, -496490176, }, -{ -567408640, -524879360, 445231872, 326981216, 179955904, 55461448, 21249350, 91448984, 201343232, 259282336, 211754768, -68303400, -107528800, -233695072, -268373184, -242689280, -219989296, -229898864, -263432352, -314680992, -385375616, --452217120, -474061312, -442161504, -392155200, -358447232, -343104000, -333307712, -320852320, -296769888, -250224256, --181758720, -103790568, -27038430, 41594072, 93680752, 127249144, 154683792, 189131568, 229011408, 265722112, -296795136, 322010880, 337931264, 345139264, 349932992, 353043616, 348371232, 335426752, 319803264, 301012256, -273765504, 239266192, 201343776, 156256272, 100300912, 40257804, -16853452, -74278776, -133969160, -187937568, --232004464, -272277856, -309240320, -334208576, -347784992, -359915040, -368298816, -361418272, -342292800, -321298976, --291328160, -242526608, -189707088, -145970368, -87378424, 5882495, 92952216, 118694104, 100779800, }, -}, -{ -{ -567408640, -524879360, 445231872, 326981216, 179955904, 55461448, 21249350, 91448984, 201343232, 259282336, 211754768, -68303400, -107528800, -233695072, -268373184, -242689280, -219989296, -229898864, -263432352, -314680992, -385375616, --452217120, -474061312, -442161504, -392155200, -358447232, -343104000, -333307712, -320852320, -296769888, -250224256, --181758720, -103790568, -27038430, 41594072, 93680752, 127249144, 154683792, 189131568, 229011408, 265722112, -296795136, 322010880, 337931264, 345139264, 349932992, 353043616, 348371232, 335426752, 319803264, 301012256, -273765504, 239266192, 201343776, 156256272, 100300912, 40257804, -16853452, -74278776, -133969160, -187937568, --232004464, -272277856, -309240320, -334208576, -347784992, -359915040, -368298816, -361418272, -342292800, -321298976, --291328160, -242526608, -189707088, -145970368, -87378424, 5882495, 92952216, 118694104, 100779800, }, -{ -698450240, -695113600, 688707136, 673868544, 646702336, 610917760, 568857664, 527102560, 519145056, 586428416, 718136768, -845610880, 914316416, 924911552, 894738880, 830247232, 753590144, 704238272, 693756416, 701662912, 724094464, -778277056, 853215104, 906342784, 916561024, 898645696, 867138880, 828636608, 804123648, 816253184, 857867648, -905643776, 954590336, 1010564992, 1063627712, 1095899008, 1103429120, 1092297216, 1067622016, 1037442368, 1011192576, -988458240, 963559808, 938667776, 917664832, 896221696, 872711040, 855399104, 846239552, 834929280, 818068352, -803600704, 792021504, 776625664, 761370432, 753275008, 743880832, 723544128, 700462464, 681426624, 655573056, -619867392, 590852736, 571201152, 541938432, 502302336, 471169184, 441192992, 387073184, 319064544, 263699712, -203195440, 109921096, 14169097, -55798068, -158887488, -345028160, -519762432, -554675136, -496490176, }, -}, -{ -{ -644109824, -641661120, 654817664, 701214080, 765066304, 793017920, 750046272, 672282112, 629564352, 638276160, 653404672, -650713344, 664768064, 724066496, 796885568, 836247872, 841609600, 838631552, 827856576, 793175744, 740571520, -691951424, 653267776, 616578496, 581786624, 554008384, 530454752, 506390080, 483272416, 461399744, 437886944, -417039168, 407054464, 404265952, 397127712, 385007840, 376674016, 374368128, 375742528, 384455936, 402931808, -423579872, 440827392, 460186432, 484475008, 506007808, 521276416, 536031776, 549570624, 553172480, 547704960, -542988032, 540130816, 534797504, 532996864, 542406592, 556516096, 567273344, 579921536, 596790016, 605442240, -600309184, 592648576, 584888128, 564139648, 531910240, 505569728, 483578432, 448984064, 408078272, 379293920, -349889504, 297504320, 240236304, 200201840, 139145664, 12122545, -134532864, -211733840, -217447744, }, -{ -512525440, -435640128, 282957824, 84049288, -98370320, -209789824, -249021136, -262860048, -292943072, -332088480, -336941792, --280376544, -182095344, -83988624, -5475547, 65635152, 143603840, 220762928, 274739392, 289304160, 265117600, -216662848, 160822896, 104457360, 42877732, -27904402, -101418672, -166072432, -214420880, -242443920, -245357520, --220635696, -172637824, -110469240, -43466144, 20132660, 74126840, 115731112, 143894832, 157248416, 156342720, -145316992, 127926136, 104625400, 75957032, 44605920, 11819750, -23396834, -59791312, -93554592, -122836600, --146753664, -160679552, -159128544, -142168784, -113127824, -73081016, -23768350, 28488518, 77793672, 122219736, -157799248, 176779248, 176332560, 160420784, 130510096, 85142896, 29638496, -26396870, -80311592, -131147360, --167546672, -178184240, -167493520, -141860080, -92922152, -21397528, 37648608, 50324668, 34608308, }, -}, -{ -{ -512525440, -435640128, 282957824, 84049288, -98370320, -209789824, -249021136, -262860048, -292943072, -332088480, -336941792, --280376544, -182095344, -83988624, -5475547, 65635152, 143603840, 220762928, 274739392, 289304160, 265117600, -216662848, 160822896, 104457360, 42877732, -27904402, -101418672, -166072432, -214420880, -242443920, -245357520, --220635696, -172637824, -110469240, -43466144, 20132660, 74126840, 115731112, 143894832, 157248416, 156342720, -145316992, 127926136, 104625400, 75957032, 44605920, 11819750, -23396834, -59791312, -93554592, -122836600, --146753664, -160679552, -159128544, -142168784, -113127824, -73081016, -23768350, 28488518, 77793672, 122219736, -157799248, 176779248, 176332560, 160420784, 130510096, 85142896, 29638496, -26396870, -80311592, -131147360, --167546672, -178184240, -167493520, -141860080, -92922152, -21397528, 37648608, 50324668, 34608308, }, -{ -644109824, -641661120, 654817664, 701214080, 765066304, 793017920, 750046272, 672282112, 629564352, 638276160, 653404672, -650713344, 664768064, 724066496, 796885568, 836247872, 841609600, 838631552, 827856576, 793175744, 740571520, -691951424, 653267776, 616578496, 581786624, 554008384, 530454752, 506390080, 483272416, 461399744, 437886944, -417039168, 407054464, 404265952, 397127712, 385007840, 376674016, 374368128, 375742528, 384455936, 402931808, -423579872, 440827392, 460186432, 484475008, 506007808, 521276416, 536031776, 549570624, 553172480, 547704960, -542988032, 540130816, 534797504, 532996864, 542406592, 556516096, 567273344, 579921536, 596790016, 605442240, -600309184, 592648576, 584888128, 564139648, 531910240, 505569728, 483578432, 448984064, 408078272, 379293920, -349889504, 297504320, 240236304, 200201840, 139145664, 12122545, -134532864, -211733840, -217447744, }, -}, -{ -{ -587978880, -583932480, 595629312, 635400704, 685938496, 712024000, 695631680, 652895680, 612192832, 583900288, 562476992, -551322432, 565862464, 608285504, 656774592, 688751168, 701092224, 698698304, 678709504, 640098816, 597021952, -566447680, 548555904, 531494688, 509422848, 484884096, 459217888, 431434848, 403011808, 375859552, 348526944, -319307200, 289268736, 259346768, 229363600, 201952576, 182509808, 173997712, 175682960, 186022016, 202622064, -221453344, 240029072, 258667088, 276221696, 289274112, 297622976, 304864832, 312131392, 317628416, 322647616, -330756512, 341403744, 351437856, 361045152, 371032032, 377771360, 377995776, 373800128, 366717184, 353812416, -335176576, 316256160, 297876384, 274586912, 246141888, 217887984, 188342368, 151595696, 111782968, 77966008, -47567300, 14498199, -13151190, -28034862, -46559592, -86153288, -128819488, -143185616, -134899024, }, -{ -495951136, -455682080, 361104736, 218659472, 74911208, -16711718, -51278152, -77336256, -135958256, -210931216, -258044864, --269439936, -279133696, -308019488, -335871264, -335299520, -304617856, -254157376, -185496960, -102038760, -20926692, -43942884, 97866200, 150721136, 199086768, 234797280, 258988144, 276016064, 283122112, 274994944, 250520080, -210138256, 155355952, 93582504, 34347392, -20257750, -72878616, -120474368, -155971744, -177703728, -188535104, --189547648, -182415856, -172789216, -164300208, -154903904, -143742352, -133717368, -123639760, -106822280, -80108656, --45536852, -3321084, 46471008, 96844536, 139191296, 172961552, 200751600, 219641936, 226778576, 225363920, -216120064, 192853696, 154202208, 107838576, 57583164, 1152662, -56183540, -103766944, -142620832, -180127168, --209971280, -220987872, -219427728, -213443232, -185617216, -118235080, -37197100, 11489038, 22216792, }, -}, -{ -{ -495951136, -455682080, 361104736, 218659472, 74911208, -16711718, -51278152, -77336256, -135958256, -210931216, -258044864, --269439936, -279133696, -308019488, -335871264, -335299520, -304617856, -254157376, -185496960, -102038760, -20926692, -43942884, 97866200, 150721136, 199086768, 234797280, 258988144, 276016064, 283122112, 274994944, 250520080, -210138256, 155355952, 93582504, 34347392, -20257750, -72878616, -120474368, -155971744, -177703728, -188535104, --189547648, -182415856, -172789216, -164300208, -154903904, -143742352, -133717368, -123639760, -106822280, -80108656, --45536852, -3321084, 46471008, 96844536, 139191296, 172961552, 200751600, 219641936, 226778576, 225363920, -216120064, 192853696, 154202208, 107838576, 57583164, 1152662, -56183540, -103766944, -142620832, -180127168, --209971280, -220987872, -219427728, -213443232, -185617216, -118235080, -37197100, 11489038, 22216792, }, -{ -587978880, -583932480, 595629312, 635400704, 685938496, 712024000, 695631680, 652895680, 612192832, 583900288, 562476992, -551322432, 565862464, 608285504, 656774592, 688751168, 701092224, 698698304, 678709504, 640098816, 597021952, -566447680, 548555904, 531494688, 509422848, 484884096, 459217888, 431434848, 403011808, 375859552, 348526944, -319307200, 289268736, 259346768, 229363600, 201952576, 182509808, 173997712, 175682960, 186022016, 202622064, -221453344, 240029072, 258667088, 276221696, 289274112, 297622976, 304864832, 312131392, 317628416, 322647616, -330756512, 341403744, 351437856, 361045152, 371032032, 377771360, 377995776, 373800128, 366717184, 353812416, -335176576, 316256160, 297876384, 274586912, 246141888, 217887984, 188342368, 151595696, 111782968, 77966008, -47567300, 14498199, -13151190, -28034862, -46559592, -86153288, -128819488, -143185616, -134899024, }, -}, -}; -const Word32 CRendBin_Combined_HRIR_coeff_im_16kHz_fx[15][BINAURAL_CHANNELS][80] ={ -{ -{ -12014097, -35897336, 53805204, 50312856, 18828062, -13066364, -6854768, 22745610, 12735115, -41816876, -39875552, -98654864, 297323936, 401317440, 372772544, 315583456, 308144576, 310529888, 259613600, 163684960, 59336584, --51169704, -165799696, -239111024, -227276784, -147407568, -53171696, 26007638, 93542240, 155563712, 207501152, -237285664, 227532864, 167055968, 67771360, -41654204, -141005920, -226938560, -301322560, -365197856, -419542080, --460432832, -479936288, -480030240, -475801312, -478633312, -488226656, -504062208, -528410912, -555006400, -571804032, --577254336, -578772608, -577470144, -570372736, -562345408, -559677184, -559475840, -559533312, -566981312, -584370560, --602642944, -618692736, -640225536, -664323008, -674664192, -666645504, -649141376, -619779904, -569934080, -512024000, --465699552, -423834368, -373262176, -334423328, -327638880, -316269056, -247134560, -134972576, -38042136, }, -{ --43315284, --167275552, -325720672, -424729856, -429919232, -407980544, -395947680, -346303200, -239683328, -149724176, -148736336, --226306656, -333395232, -430414784, -464289728, -380538944, -199746048, -17964238, 102305048, 183813328, 256357472, -298020256, 290804704, 271931552, 283791040, 317931200, 348516736, 381127872, 427289120, 462315104, 450696160, -394719296, 322191808, 238335248, 123655328, -22405234, -163422432, -259725264, -305492960, -324537920, -338921248, --352351072, -360596320, -363949632, -362820032, -350412416, -320028736, -275247808, -224321840, -168880800, -106778792, --41586020, 19834696, 75412112, 125746976, 168545792, 202392288, 230801344, 255875904, 273531968, 280169312, -277151008, 264613472, 239632336, 204636400, 168342320, 135009072, 102396856, 71785008, 48446156, 31304942, -14647986, -258772, -9262634, -19164144, -40214316, -64947420, -72200008, -53375168, -18999324, }, -}, -{ -{ --43315284, --167275552, -325720672, -424729856, -429919232, -407980544, -395947680, -346303200, -239683328, -149724176, -148736336, --226306656, -333395232, -430414784, -464289728, -380538944, -199746048, -17964238, 102305048, 183813328, 256357472, -298020256, 290804704, 271931552, 283791040, 317931200, 348516736, 381127872, 427289120, 462315104, 450696160, -394719296, 322191808, 238335248, 123655328, -22405234, -163422432, -259725264, -305492960, -324537920, -338921248, --352351072, -360596320, -363949632, -362820032, -350412416, -320028736, -275247808, -224321840, -168880800, -106778792, --41586020, 19834696, 75412112, 125746976, 168545792, 202392288, 230801344, 255875904, 273531968, 280169312, -277151008, 264613472, 239632336, 204636400, 168342320, 135009072, 102396856, 71785008, 48446156, 31304942, -14647986, -258772, -9262634, -19164144, -40214316, -64947420, -72200008, -53375168, -18999324, }, -{ -12014097, -35897336, 53805204, 50312856, 18828062, -13066364, -6854768, 22745610, 12735115, -41816876, -39875552, -98654864, 297323936, 401317440, 372772544, 315583456, 308144576, 310529888, 259613600, 163684960, 59336584, --51169704, -165799696, -239111024, -227276784, -147407568, -53171696, 26007638, 93542240, 155563712, 207501152, -237285664, 227532864, 167055968, 67771360, -41654204, -141005920, -226938560, -301322560, -365197856, -419542080, --460432832, -479936288, -480030240, -475801312, -478633312, -488226656, -504062208, -528410912, -555006400, -571804032, --577254336, -578772608, -577470144, -570372736, -562345408, -559677184, -559475840, -559533312, -566981312, -584370560, --602642944, -618692736, -640225536, -664323008, -674664192, -666645504, -649141376, -619779904, -569934080, -512024000, --465699552, -423834368, -373262176, -334423328, -327638880, -316269056, -247134560, -134972576, -38042136, }, -}, -{ -{ -11529840, -13347148, -36569500, -113121920, -129439576, -50867444, 14232448, -53408992, -177612464, -148705184, 85114976, -321205568, 356627232, 230623104, 133642736, 154121136, 209440320, 188600064, 75365400, -67306968, -171972096, --209020496, -188093792, -138411232, -83479128, -30877056, 15938087, 45047228, 40231496, -7201587, -92407296, --197360720, -297320736, -374595776, -428572768, -467873344, -492833536, -492368064, -460149376, -407823264, -358125632, --328469440, -323982272, -340943616, -370154784, -399694496, -422151808, -439693504, -457322752, -472918304, -479750528, --476592128, -468317856, -458178528, -446379712, -434486400, -424508128, -415263744, -404740000, -393061440, -379423840, --361430624, -340799200, -322628288, -306349824, -286351904, -263314784, -243854288, -227870560, -209237920, -189143376, --173876912, -160802496, -144108496, -131797512, -135355888, -143668800, -130320584, -87279640, -29750164, }, -{ -11529840, -13347148, -36569500, -113121920, -129439576, -50867444, 14232448, -53408992, -177612464, -148705184, 85114976, -321205568, 356627232, 230623104, 133642736, 154121136, 209440320, 188600064, 75365400, -67306968, -171972096, --209020496, -188093792, -138411232, -83479128, -30877056, 15938087, 45047228, 40231496, -7201587, -92407296, --197360720, -297320736, -374595776, -428572768, -467873344, -492833536, -492368064, -460149376, -407823264, -358125632, --328469440, -323982272, -340943616, -370154784, -399694496, -422151808, -439693504, -457322752, -472918304, -479750528, --476592128, -468317856, -458178528, -446379712, -434486400, -424508128, -415263744, -404740000, -393061440, -379423840, --361430624, -340799200, -322628288, -306349824, -286351904, -263314784, -243854288, -227870560, -209237920, -189143376, --173876912, -160802496, -144108496, -131797512, -135355888, -143668800, -130320584, -87279640, -29750164, }, -}, -{ -{ -6737730, -36310728, 82552496, 112160384, 114129096, 97516160, 47489452, -47207596, -139446848, -172956720, -172927728, --209062368, -281033120, -323487264, -317248832, -310710272, -329580224, -345570912, -342311584, -339921440, -342769536, --325651392, -283917728, -245152432, -223469840, -208063248, -199347152, -211438016, -235558560, -241466288, -219431488, --187860800, -158804272, -126097016, -87488480, -51480552, -21284248, 6805376, 29567628, 38165616, 31655520, -16961900, -736587, -18033494, -29193430, -30501248, -24554864, -15843061, -7511361, -4630512, -13749264, --37041944, -71893456, -115411136, -163850848, -210135568, -248258768, -278091072, -301507232, -317690144, -326059968, --328749696, -326538848, -317392704, -301186208, -280315328, -255096896, -224872144, -192732896, -162321840, -132668320, --103223632, -78363824, -58980100, -39456252, -23711440, -29182156, -56074556, -68051072, -31855772, }, -{ --91367912, --257344784, -368731008, -399863072, -368732064, -318823488, -264597360, -187626176, -89714888, -9023726, 30760556, -50806240, 78116864, 109169480, 134775008, 170659456, 232808160, 299963744, 327622784, 290989408, 198465072, -75594112, -48091284, -147514416, -213435184, -251069824, -262746768, -243405456, -197352144, -143928656, -98723584, --61254824, -26169236, 6638946, 38232188, 74120400, 115100832, 152906208, 177822384, 183768768, 166826736, -127559992, 74813496, 20892868, -25723632, -59548648, -75917304, -75299904, -64973192, -52216064, -40167608, --31237298, -27542552, -26933204, -25319906, -22686018, -20841328, -18178450, -13306346, -9438728, -8532489, --6724308, -1197222, 6068789, 16056735, 34274376, 60207924, 85978264, 107714024, 125535992, 132588328, -120357328, 93827320, 63501628, 26500486, -22081500, -64213520, -72819560, -48505752, -15430207, }, -}, -{ -{ --91367912, --257344784, -368731008, -399863072, -368732064, -318823488, -264597360, -187626176, -89714888, -9023726, 30760556, -50806240, 78116864, 109169480, 134775008, 170659456, 232808160, 299963744, 327622784, 290989408, 198465072, -75594112, -48091284, -147514416, -213435184, -251069824, -262746768, -243405456, -197352144, -143928656, -98723584, --61254824, -26169236, 6638946, 38232188, 74120400, 115100832, 152906208, 177822384, 183768768, 166826736, -127559992, 74813496, 20892868, -25723632, -59548648, -75917304, -75299904, -64973192, -52216064, -40167608, --31237298, -27542552, -26933204, -25319906, -22686018, -20841328, -18178450, -13306346, -9438728, -8532489, --6724308, -1197222, 6068789, 16056735, 34274376, 60207924, 85978264, 107714024, 125535992, 132588328, -120357328, 93827320, 63501628, 26500486, -22081500, -64213520, -72819560, -48505752, -15430207, }, -{ -6737730, -36310728, 82552496, 112160384, 114129096, 97516160, 47489452, -47207596, -139446848, -172956720, -172927728, --209062368, -281033120, -323487264, -317248832, -310710272, -329580224, -345570912, -342311584, -339921440, -342769536, --325651392, -283917728, -245152432, -223469840, -208063248, -199347152, -211438016, -235558560, -241466288, -219431488, --187860800, -158804272, -126097016, -87488480, -51480552, -21284248, 6805376, 29567628, 38165616, 31655520, -16961900, -736587, -18033494, -29193430, -30501248, -24554864, -15843061, -7511361, -4630512, -13749264, --37041944, -71893456, -115411136, -163850848, -210135568, -248258768, -278091072, -301507232, -317690144, -326059968, --328749696, -326538848, -317392704, -301186208, -280315328, -255096896, -224872144, -192732896, -162321840, -132668320, --103223632, -78363824, -58980100, -39456252, -23711440, -29182156, -56074556, -68051072, -31855772, }, -}, -{ -{ -8164196, -44547400, 107173392, 151858768, 141665744, 88392040, 21066814, -54681376, -136974560, -194774624, -198866656, --174685984, -177014928, -211105152, -226307200, -197914240, -166187312, -171183968, -193077040, -191026192, -166961488, --151375584, -148994032, -138841264, -116053240, -97335232, -88876296, -78059416, -57178900, -33640332, -15949898, --5432597, -1035624, 192737, 5810017, 21478594, 43743168, 65269544, 82739864, 94780800, 98439576, -93017184, 81910928, 66963908, 46561740, 21537114, -3291019, -25325274, -46266460, -67437432, -88755496, --112122272, -140211360, -172351136, -206041936, -240635744, -275572608, -308160160, -336930528, -363343488, -387111296, --404877440, -416117376, -424204256, -429434464, -428134144, -420355424, -410097440, -396474336, -374188288, -344111168, --312845408, -280789920, -243339424, -206263664, -185131344, -182077088, -173855984, -131779264, -49716932, }, -{ --121575488, --327745728, -439912576, -444363744, -368528608, -245493344, -86965032, 96915936, 264271488, 355673216, 345737888, -263669648, 159173104, 61461520, -25578140, -102469864, -160386960, -187825360, -184911760, -164087072, -133838160, --88987968, -24737402, 46355584, 102826888, 135619504, 149487952, 146968416, 124120800, 81604912, 28876676, --23648090, -69442640, -103766944, -123045984, -125989104, -112232328, -82238424, -40732932, 3103114, 40929964, -68689408, 85459112, 92190400, 90564752, 80275624, 59148680, 27699318, -9310952, -46522548, -79008072, --100086160, -104067592, -91500520, -67148056, -34903052, 443992, 30932354, 51430084, 63724968, 69987568, -68585256, 60078540, 48424144, 32638530, 7427609, -25753160, -59433756, -90916944, -118414936, -130138584, --114544096, -76610408, -26872536, 33355790, 92639224, 114539264, 78836272, 23021024, -652298, }, -}, -{ -{ --121575488, --327745728, -439912576, -444363744, -368528608, -245493344, -86965032, 96915936, 264271488, 355673216, 345737888, -263669648, 159173104, 61461520, -25578140, -102469864, -160386960, -187825360, -184911760, -164087072, -133838160, --88987968, -24737402, 46355584, 102826888, 135619504, 149487952, 146968416, 124120800, 81604912, 28876676, --23648090, -69442640, -103766944, -123045984, -125989104, -112232328, -82238424, -40732932, 3103114, 40929964, -68689408, 85459112, 92190400, 90564752, 80275624, 59148680, 27699318, -9310952, -46522548, -79008072, --100086160, -104067592, -91500520, -67148056, -34903052, 443992, 30932354, 51430084, 63724968, 69987568, -68585256, 60078540, 48424144, 32638530, 7427609, -25753160, -59433756, -90916944, -118414936, -130138584, --114544096, -76610408, -26872536, 33355790, 92639224, 114539264, 78836272, 23021024, -652298, }, -{ -8164196, -44547400, 107173392, 151858768, 141665744, 88392040, 21066814, -54681376, -136974560, -194774624, -198866656, --174685984, -177014928, -211105152, -226307200, -197914240, -166187312, -171183968, -193077040, -191026192, -166961488, --151375584, -148994032, -138841264, -116053240, -97335232, -88876296, -78059416, -57178900, -33640332, -15949898, --5432597, -1035624, 192737, 5810017, 21478594, 43743168, 65269544, 82739864, 94780800, 98439576, -93017184, 81910928, 66963908, 46561740, 21537114, -3291019, -25325274, -46266460, -67437432, -88755496, --112122272, -140211360, -172351136, -206041936, -240635744, -275572608, -308160160, -336930528, -363343488, -387111296, --404877440, -416117376, -424204256, -429434464, -428134144, -420355424, -410097440, -396474336, -374188288, -344111168, --312845408, -280789920, -243339424, -206263664, -185131344, -182077088, -173855984, -131779264, -49716932, }, -}, -{ -{ -23554674, -63680944, 100486128, 143425072, 160396624, 105198784, -958851, -80830208, -108001784, -133792528, -184129536, --203911632, -148618224, -66377108, -29700236, -34437048, -29727616, -10700374, -13250511, -38631084, -49996104, --38671884, -37946572, -66779764, -102261560, -114666496, -99396280, -69727720, -40418328, -20343112, -5313412, -20069846, 61832496, 103414760, 122720104, 115239344, 92404072, 65606700, 39885752, 16847546, -2928094, --18153216, -27101244, -32216550, -40784472, -57119844, -79209936, -106136696, -141351136, -185442736, -233775072, --283348672, -333599776, -380434784, -418755008, -449614368, -476425696, -498366528, -515928640, -535856224, -562014720, --590205248, -618661568, -651252352, -684484672, -706655808, -714453824, -713151936, -699310336, -664759488, -616559168, --568175872, -515411648, -449946688, -387446304, -345378720, -302782304, -225644704, -124012888, -36187248, }, -{ --134445904, --354867904, -462737632, -454919712, -356354496, -184022704, 40757628, 262201840, 404614912, 426365152, 345501120, -208006336, 46817828, -119911728, -266756656, -356998752, -362689600, -282963712, -143316624, 19385334, 171397120, -285301248, 336403328, 307668384, 204379248, 58105540, -90248536, -209021568, -277893504, -283894112, -226059696, --120651000, 5003100, 122632592, 206948160, 238739520, 212521424, 140400336, 45597520, -47734804, -120938760, --163346192, -171559248, -146704816, -94255208, -26338886, 40620192, 93026848, 122830160, 125343792, 100967704, -58784680, 11866995, -31174484, -65726960, -86230592, -88996552, -77031312, -55747064, -27654220, 3765613, -31211528, 50083076, 61416960, 64772940, 56640420, 38346004, 15450071, -11638825, -44530756, -75189312, --91152624, -89874872, -73525008, -37754372, 13605383, 52383568, 52429740, 26051124, 5407364, }, -}, -{ -{ --134445904, --354867904, -462737632, -454919712, -356354496, -184022704, 40757628, 262201840, 404614912, 426365152, 345501120, -208006336, 46817828, -119911728, -266756656, -356998752, -362689600, -282963712, -143316624, 19385334, 171397120, -285301248, 336403328, 307668384, 204379248, 58105540, -90248536, -209021568, -277893504, -283894112, -226059696, --120651000, 5003100, 122632592, 206948160, 238739520, 212521424, 140400336, 45597520, -47734804, -120938760, --163346192, -171559248, -146704816, -94255208, -26338886, 40620192, 93026848, 122830160, 125343792, 100967704, -58784680, 11866995, -31174484, -65726960, -86230592, -88996552, -77031312, -55747064, -27654220, 3765613, -31211528, 50083076, 61416960, 64772940, 56640420, 38346004, 15450071, -11638825, -44530756, -75189312, --91152624, -89874872, -73525008, -37754372, 13605383, 52383568, 52429740, 26051124, 5407364, }, -{ -23554674, -63680944, 100486128, 143425072, 160396624, 105198784, -958851, -80830208, -108001784, -133792528, -184129536, --203911632, -148618224, -66377108, -29700236, -34437048, -29727616, -10700374, -13250511, -38631084, -49996104, --38671884, -37946572, -66779764, -102261560, -114666496, -99396280, -69727720, -40418328, -20343112, -5313412, -20069846, 61832496, 103414760, 122720104, 115239344, 92404072, 65606700, 39885752, 16847546, -2928094, --18153216, -27101244, -32216550, -40784472, -57119844, -79209936, -106136696, -141351136, -185442736, -233775072, --283348672, -333599776, -380434784, -418755008, -449614368, -476425696, -498366528, -515928640, -535856224, -562014720, --590205248, -618661568, -651252352, -684484672, -706655808, -714453824, -713151936, -699310336, -664759488, -616559168, --568175872, -515411648, -449946688, -387446304, -345378720, -302782304, -225644704, -124012888, -36187248, }, -}, -{ -{ --4428648, --12817793, -22537304, -33988760, -39535172, -31816044, -6058052, 52388936, 153264304, 261093216, 307425184, -263993392, 169773072, 73569032, -6526203, -56706452, -55943024, -11604465, 39944268, 82797304, 127639448, -164261568, 159431328, 109619912, 49804976, 6515466, -16895864, -14101451, 20765094, 67684392, 96716224, -103307920, 98653248, 79120816, 33847028, -31095026, -99142344, -160865312, -211477216, -247033632, -271942848, --294957952, -315941568, -330808032, -343203328, -356247136, -364157920, -365933376, -371765920, -384912288, -396248864, --403550304, -414054720, -426279808, -433807808, -443296448, -463264832, -485040864, -499604032, -515666656, -537647232, --551704640, -555206144, -566512640, -588050304, -601189632, -608905024, -632589632, -662465984, -671137472, -670804096, --687241472, -695903872, -667400896, -641328832, -648485312, -605638144, -424692256, -185103968, -37003292, }, -{ --69350840, --199906576, -311887648, -392731264, -410866784, -342573568, -223211056, -140879216, -163624832, -284638208, -435727104, --534943008, -530843456, -435152128, -318364448, -249764704, -238453360, -247804576, -252108672, -246991216, -217418768, --141864384, -33516314, 60608968, 112287088, 136834976, 161198720, 195325984, 239988816, 295499648, 353162816, -396481312, 416609152, 415039328, 394495968, 361008640, 328777600, 307674272, 290885792, 266287968, 232155872, -192372656, 147222896, 98384280, 51841864, 8317204, -38079180, -87672632, -134203232, -177202304, -221665408, --266239648, -305633632, -341292064, -375708704, -402299392, -414610912, -417046144, -413983840, -400061184, -372735520, --339849472, -304759072, -261169984, -210188720, -162091536, -116283016, -62799400, -5180268, 44332116, 89105000, -137649408, 177868560, 197069200, 212243328, 236309632, 234228192, 169281840, 75060456, 15222438, }, -}, -{ -{ --69350840, --199906576, -311887648, -392731264, -410866784, -342573568, -223211056, -140879216, -163624832, -284638208, -435727104, --534943008, -530843456, -435152128, -318364448, -249764704, -238453360, -247804576, -252108672, -246991216, -217418768, --141864384, -33516314, 60608968, 112287088, 136834976, 161198720, 195325984, 239988816, 295499648, 353162816, -396481312, 416609152, 415039328, 394495968, 361008640, 328777600, 307674272, 290885792, 266287968, 232155872, -192372656, 147222896, 98384280, 51841864, 8317204, -38079180, -87672632, -134203232, -177202304, -221665408, --266239648, -305633632, -341292064, -375708704, -402299392, -414610912, -417046144, -413983840, -400061184, -372735520, --339849472, -304759072, -261169984, -210188720, -162091536, -116283016, -62799400, -5180268, 44332116, 89105000, -137649408, 177868560, 197069200, 212243328, 236309632, 234228192, 169281840, 75060456, 15222438, }, -{ --4428648, --12817793, -22537304, -33988760, -39535172, -31816044, -6058052, 52388936, 153264304, 261093216, 307425184, -263993392, 169773072, 73569032, -6526203, -56706452, -55943024, -11604465, 39944268, 82797304, 127639448, -164261568, 159431328, 109619912, 49804976, 6515466, -16895864, -14101451, 20765094, 67684392, 96716224, -103307920, 98653248, 79120816, 33847028, -31095026, -99142344, -160865312, -211477216, -247033632, -271942848, --294957952, -315941568, -330808032, -343203328, -356247136, -364157920, -365933376, -371765920, -384912288, -396248864, --403550304, -414054720, -426279808, -433807808, -443296448, -463264832, -485040864, -499604032, -515666656, -537647232, --551704640, -555206144, -566512640, -588050304, -601189632, -608905024, -632589632, -662465984, -671137472, -670804096, --687241472, -695903872, -667400896, -641328832, -648485312, -605638144, -424692256, -185103968, -37003292, }, -}, -{ -{ -4335233, -20616380, 49456012, 69235944, 42754788, -34925064, -109610248, -120600000, -75574248, -35679368, -27114128, --15243913, 21977348, 47280072, 20015622, -43954696, -104432664, -155194352, -211883088, -267991456, -302190688, --313634624, -317882336, -319672256, -314427584, -305008192, -297233216, -289331008, -278697216, -267171664, -252595072, --229863968, -203925584, -185493200, -173132816, -156063008, -132223792, -107246944, -81357952, -53597972, -30962420, --18345952, -9557376, -471373, 2304250, -4316442, -13293461, -22566296, -38360500, -58558120, -72458784, --78857208, -84461608, -87244208, -82279760, -77346992, -81921672, -91409792, -101298416, -120460408, -152264112, --183732256, -209425296, -240028544, -274892416, -298074496, -310640480, -329773504, -351942496, -359755040, -362668640, --380955552, -399289696, -394886816, -392853664, -420282944, -427300928, -342532768, -189912720, -54082764, }, -{ --99345816, --286369632, -427405632, -480084992, -431886880, -323924288, -221190816, -155707056, -104193760, -24307368, 91562800, -205071264, 273453600, 291721152, 286386816, 276125600, 252572000, 198656192, 113060720, 13233868, -77841984, --145458192, -189659312, -219943120, -241321872, -247546880, -230110384, -188789040, -129440112, -57381836, 21233782, -95871184, 155221728, 192750080, 206907360, 199403520, 174810544, 138590000, 94764160, 47423956, 2244657, --36883568, -70249560, -98521184, -120003536, -133912248, -141698480, -142972480, -134980624, -117253144, -91475288, --57106424, -13491029, 34559992, 79605608, 118001544, 147751168, 164080096, 163572752, 148051280, 119160648, -75744432, 21119428, -35354560, -87692496, -134928016, -171976928, -190841504, -191279056, -177239872, -145453360, --93279176, -32515050, 22766548, 72799696, 114743272, 124032752, 85572928, 30638150, 3125126, }, -}, -{ -{ --99345816, --286369632, -427405632, -480084992, -431886880, -323924288, -221190816, -155707056, -104193760, -24307368, 91562800, -205071264, 273453600, 291721152, 286386816, 276125600, 252572000, 198656192, 113060720, 13233868, -77841984, --145458192, -189659312, -219943120, -241321872, -247546880, -230110384, -188789040, -129440112, -57381836, 21233782, -95871184, 155221728, 192750080, 206907360, 199403520, 174810544, 138590000, 94764160, 47423956, 2244657, --36883568, -70249560, -98521184, -120003536, -133912248, -141698480, -142972480, -134980624, -117253144, -91475288, --57106424, -13491029, 34559992, 79605608, 118001544, 147751168, 164080096, 163572752, 148051280, 119160648, -75744432, 21119428, -35354560, -87692496, -134928016, -171976928, -190841504, -191279056, -177239872, -145453360, --93279176, -32515050, 22766548, 72799696, 114743272, 124032752, 85572928, 30638150, 3125126, }, -{ -4335233, -20616380, 49456012, 69235944, 42754788, -34925064, -109610248, -120600000, -75574248, -35679368, -27114128, --15243913, 21977348, 47280072, 20015622, -43954696, -104432664, -155194352, -211883088, -267991456, -302190688, --313634624, -317882336, -319672256, -314427584, -305008192, -297233216, -289331008, -278697216, -267171664, -252595072, --229863968, -203925584, -185493200, -173132816, -156063008, -132223792, -107246944, -81357952, -53597972, -30962420, --18345952, -9557376, -471373, 2304250, -4316442, -13293461, -22566296, -38360500, -58558120, -72458784, --78857208, -84461608, -87244208, -82279760, -77346992, -81921672, -91409792, -101298416, -120460408, -152264112, --183732256, -209425296, -240028544, -274892416, -298074496, -310640480, -329773504, -351942496, -359755040, -362668640, --380955552, -399289696, -394886816, -392853664, -420282944, -427300928, -342532768, -189912720, -54082764, }, -}, -{ -{ -485331, -10242960, 31972274, 43328168, 18358838, -41247792, -103692320, -138647984, -144314128, -136896720, -122505352, --95425584, -62041340, -46414100, -64334316, -106537200, -156071600, -207659520, -259043968, -298011136, -314279392, --315926528, -319767840, -330993792, -343319296, -352833184, -360500768, -365669760, -366703776, -365058784, -362441024, --357266112, -347681376, -333688352, -313987328, -285891808, -250179696, -211662432, -174741824, -142250928, -116871968, --99368360, -87635048, -80598280, -79409648, -82679192, -85931560, -87700544, -90206128, -93239984, -94304064, --94775432, -98646808, -106169448, -115775672, -129464272, -149003696, -170912848, -191925440, -213642944, -236010064, --254295344, -267836848, -281970496, -297131200, -307629728, -313544960, -319844608, -323095360, -315331136, -299738784, --284300000, -264724608, -235417888, -208847072, -196258528, -178760304, -131210712, -66350264, -17217988, }, -{ --70953936, --213264448, -340538816, -414134176, -409366752, -353428032, -306926432, -299649120, -300532288, -265251808, -197311328, --137314400, -101265128, -61981748, 5509370, 90977072, 171506096, 239528720, 293170720, 321731168, 319811840, -300423296, 277909088, 250022928, 209204640, 158823600, 106245144, 50823420, -10669773, -75280040, -137317088, --192245952, -233691312, -255845296, -260910144, -255517264, -240265840, -211742960, -172575008, -130165424, -88486528, --49173080, -15943455, 9725417, 31963684, 53752588, 73487424, 92061016, 114548392, 141434880, 166937856, -187263264, 201139232, 203403744, 188994672, 161490768, 127726424, 88114472, 41495828, -7604240, -55883968, --106299368, -157816432, -201166064, -231501424, -252095248, -261367552, -252826464, -230248368, -203759696, -171087872, --124413928, -71516576, -24179056, 25768730, 85896128, 128984848, 119969176, 69876432, 20000588, }, -}, -{ -{ --70953936, --213264448, -340538816, -414134176, -409366752, -353428032, -306926432, -299649120, -300532288, -265251808, -197311328, --137314400, -101265128, -61981748, 5509370, 90977072, 171506096, 239528720, 293170720, 321731168, 319811840, -300423296, 277909088, 250022928, 209204640, 158823600, 106245144, 50823420, -10669773, -75280040, -137317088, --192245952, -233691312, -255845296, -260910144, -255517264, -240265840, -211742960, -172575008, -130165424, -88486528, --49173080, -15943455, 9725417, 31963684, 53752588, 73487424, 92061016, 114548392, 141434880, 166937856, -187263264, 201139232, 203403744, 188994672, 161490768, 127726424, 88114472, 41495828, -7604240, -55883968, --106299368, -157816432, -201166064, -231501424, -252095248, -261367552, -252826464, -230248368, -203759696, -171087872, --124413928, -71516576, -24179056, 25768730, 85896128, 128984848, 119969176, 69876432, 20000588, }, -{ -485331, -10242960, 31972274, 43328168, 18358838, -41247792, -103692320, -138647984, -144314128, -136896720, -122505352, --95425584, -62041340, -46414100, -64334316, -106537200, -156071600, -207659520, -259043968, -298011136, -314279392, --315926528, -319767840, -330993792, -343319296, -352833184, -360500768, -365669760, -366703776, -365058784, -362441024, --357266112, -347681376, -333688352, -313987328, -285891808, -250179696, -211662432, -174741824, -142250928, -116871968, --99368360, -87635048, -80598280, -79409648, -82679192, -85931560, -87700544, -90206128, -93239984, -94304064, --94775432, -98646808, -106169448, -115775672, -129464272, -149003696, -170912848, -191925440, -213642944, -236010064, --254295344, -267836848, -281970496, -297131200, -307629728, -313544960, -319844608, -323095360, -315331136, -299738784, --284300000, -264724608, -235417888, -208847072, -196258528, -178760304, -131210712, -66350264, -17217988, }, -}, -}; -const Word32 CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[16][BINAURAL_CHANNELS][240] ={ -{ -{ -523696096, -442117504, 310699008, 167178384, 38328824, -62973884, -142701904, -218207424, -288233120, -324050464, -305476864, --239455696, -124559960, 52899500, 239470736, 289440000, 117837256, -137072800, -214231360, -22201760, 253544800, -372249120, 286295008, 117738472, -31679678, -156358816, -271503680, -359748064, -405781536, -424572000, -434228160, --433325696, -417425728, -393916672, -370626688, -346321472, -318988288, -291659424, -266480704, -241915648, -217410704, --194249024, -171965120, -149140592, -126572152, -105665320, -85652384, -65502008, -46165528, -28507308, -11534135, -5517959, 21835614, 36923296, 51426328, 65420940, 78127600, 89553824, 100435664, 110730160, 119946624, -128456568, 136897792, 144993808, 152274304, 159110816, 165962368, 172539568, 178568096, 184424816, 190402880, -196267664, 201906416, 207601008, 213461488, 219304784, 225092800, 230917840, 236754704, 242604992, 248525056, -254273872, 259479376, 264267184, 269042656, 273646848, 277524672, 280694912, 283720704, 286716992, 289173184, -290755872, 291661024, 292211328, 292578528, 292768608, 292590368, 291897792, 291028608, 290619488, 290858944, -291348032, 291775392, 292309024, 293284512, 294904256, 297195616, 299932608, 302707136, 305358752, 308171424, -311448480, 315120128, 318904000, 322573504, 325947744, 328940800, 331715360, 334517824, 337346048, 339990688, -342338944, 344415040, 346238240, 347855296, 349375200, 350801664, 351969888, 352762848, 353224544, 353432864, -353450560, 353402272, 353409760, 353459168, 353489216, 353525216, 353615936, 353763584, 354041664, 354629536, -355629728, 356984256, 358612576, 360484672, 362536576, 364679776, 366888448, 369164256, 371435200, 373599872, -375592736, 377362272, 378847264, 380034272, 380948576, 381599776, 382006752, 382226848, 382302560, 382249408, -382125920, 382023904, 381983104, 382034656, 382263360, 382681600, 383146528, 383545952, 383915328, 384261600, -384489216, 384601440, 384703968, 384776992, 384730816, 384668544, 384751776, 384924096, 385130240, 385565120, -386347872, 387285248, 388299936, 389614208, 391214080, 392766176, 394279616, 396044288, 397870752, 399357856, -400790240, 402575872, 404207968, 405212448, 406370464, 408240928, 409671712, 409968576, 410793760, 413089408, -414437504, 413311680, 413165120, 416964544, 420169120, 415984224, 406336640, 400335520, 402015904, 406590592, -408728960, 407087744, 400552416, 388721920, 377990944, 378296960, 389718368, 399499616, 397218976, 387056000, -379926368, 378810752, 378725920, 378463936, 384824224, 403541184, 430237088, 453206560, 464204896, 464701504, -461558112, 458781952, 455806080, 452544064, 451409664, 452445280, 450857216, 443671200, 436101856, }, -{ -523696096, -442117504, 310699008, 167178384, 38328824, -62973884, -142701904, -218207424, -288233120, -324050464, -305476864, --239455696, -124559960, 52899500, 239470736, 289440000, 117837256, -137072800, -214231360, -22201760, 253544800, -372249120, 286295008, 117738472, -31679678, -156358816, -271503680, -359748064, -405781536, -424572000, -434228160, --433325696, -417425728, -393916672, -370626688, -346321472, -318988288, -291659424, -266480704, -241915648, -217410704, --194249024, -171965120, -149140592, -126572152, -105665320, -85652384, -65502008, -46165528, -28507308, -11534135, -5517959, 21835614, 36923296, 51426328, 65420940, 78127600, 89553824, 100435664, 110730160, 119946624, -128456568, 136897792, 144993808, 152274304, 159110816, 165962368, 172539568, 178568096, 184424816, 190402880, -196267664, 201906416, 207601008, 213461488, 219304784, 225092800, 230917840, 236754704, 242604992, 248525056, -254273872, 259479376, 264267184, 269042656, 273646848, 277524672, 280694912, 283720704, 286716992, 289173184, -290755872, 291661024, 292211328, 292578528, 292768608, 292590368, 291897792, 291028608, 290619488, 290858944, -291348032, 291775392, 292309024, 293284512, 294904256, 297195616, 299932608, 302707136, 305358752, 308171424, -311448480, 315120128, 318904000, 322573504, 325947744, 328940800, 331715360, 334517824, 337346048, 339990688, -342338944, 344415040, 346238240, 347855296, 349375200, 350801664, 351969888, 352762848, 353224544, 353432864, -353450560, 353402272, 353409760, 353459168, 353489216, 353525216, 353615936, 353763584, 354041664, 354629536, -355629728, 356984256, 358612576, 360484672, 362536576, 364679776, 366888448, 369164256, 371435200, 373599872, -375592736, 377362272, 378847264, 380034272, 380948576, 381599776, 382006752, 382226848, 382302560, 382249408, -382125920, 382023904, 381983104, 382034656, 382263360, 382681600, 383146528, 383545952, 383915328, 384261600, -384489216, 384601440, 384703968, 384776992, 384730816, 384668544, 384751776, 384924096, 385130240, 385565120, -386347872, 387285248, 388299936, 389614208, 391214080, 392766176, 394279616, 396044288, 397870752, 399357856, -400790240, 402575872, 404207968, 405212448, 406370464, 408240928, 409671712, 409968576, 410793760, 413089408, -414437504, 413311680, 413165120, 416964544, 420169120, 415984224, 406336640, 400335520, 402015904, 406590592, -408728960, 407087744, 400552416, 388721920, 377990944, 378296960, 389718368, 399499616, 397218976, 387056000, -379926368, 378810752, 378725920, 378463936, 384824224, 403541184, 430237088, 453206560, 464204896, 464701504, -461558112, 458781952, 455806080, 452544064, 451409664, 452445280, 450857216, 443671200, 436101856, }, -}, -{ -{ -39313448, -162039984, 354059392, 513073024, 544220672, 426079008, 200846096, -76480480, -341753760, -517496864, -570909632, --538810624, -426258848, -152656560, 268456928, 556916608, 392621760, -137937712, -524111648, -381302368, 122664800, -517052864, 571298304, 423385536, 267364400, 134421200, -10704132, -142540304, -220866016, -263521472, -306872192, --348453920, -370534880, -379185472, -388552800, -396056640, -394882528, -389052640, -382683744, -371897472, -354961344, --336135936, -316509568, -293179840, -267362784, -242905632, -218939184, -192737200, -166288784, -142837728, -121205048, --99199784, -77883864, -58247808, -38609608, -18247168, 1144609, 19156628, 37176164, 54835460, 70412232, -84282288, 97901632, 110576616, 120906552, 129687608, 138192720, 145665968, 151166736, 155605584, 159884448, -163383248, 165773392, 168035760, 170768432, 173590768, 176530672, 180116432, 184315840, 188937760, 194341904, -200491760, 206520816, 212239568, 218499488, 225355856, 231702208, 237215344, 242769264, 248687728, 254468752, -260238512, 266707808, 273941056, 281680064, 290293632, 300081856, 310452576, 320862496, 331534976, 342404448, -352558304, 361381760, 369063328, 375619040, 380618944, 383952896, 385725632, 385646720, 383630784, 380563104, -377491648, 374619936, 371822848, 369278592, 366996352, 364715744, 362746496, 361908992, 362372288, 363497056, -364780704, 365996160, 366721472, 366764960, 366680672, 366982400, 367400096, 367574048, 367722208, 368027168, -368227424, 368258560, 368442688, 368780928, 368942528, 368980096, 369208288, 369538976, 369727968, 369950752, -370432864, 370996064, 371569984, 372518624, 374047104, 375963712, 378274944, 381220224, 384661024, 388236576, -392007584, 396189792, 400559936, 404847904, 409238432, 413860896, 418399616, 422691904, 426985248, 431279680, -435233184, 438858688, 442451968, 445902976, 448900320, 451546560, 454001120, 456011712, 457482752, 458817920, -460182656, 461281088, 462164256, 463233696, 464334272, 464945792, 465118656, 465174496, 464947392, 464355744, -463920896, 463844128, 463656736, 463389920, 463649760, 464247296, 464458848, 464531328, 465066560, 465613632, -465777920, 466290112, 467196864, 467418080, 467498592, 469054464, 470692448, 470029952, 469692256, 473230240, -476283424, 473541632, 472350304, 482087520, 491237952, 478718144, 450771840, 438733056, 452943488, 469665408, -474604096, 484207104, 505161184, 508774304, 474142368, 428292000, 412397920, 428558816, 447011072, 448439680, -436165216, 422568416, 419888896, 424843680, 401945600, 313745216, 185358448, 103257456, 121463824, 197578704, -251416656, 259959344, 258984384, 271355488, 275937152, 245777360, 185467968, 123581776, 86443736, }, -{ --39313448, --162039984, -354059392, -513073024, -544220672, -426079008, -200846096, 76480480, 341753760, 517496864, 570909632, -538810624, 426258848, 152656560, -268456928, -556916608, -392621760, 137937712, 524111648, 381302368, -122664800, --517052864, -571298304, -423385536, -267364400, -134421200, 10704132, 142540304, 220866016, 263521472, 306872192, -348453920, 370534880, 379185472, 388552800, 396056640, 394882528, 389052640, 382683744, 371897472, 354961344, -336135936, 316509568, 293179840, 267362784, 242905632, 218939184, 192737200, 166288784, 142837728, 121205048, -99199784, 77883864, 58247808, 38609608, 18247168, -1144609, -19156628, -37176164, -54835460, -70412232, --84282288, -97901632, -110576616, -120906552, -129687608, -138192720, -145665968, -151166736, -155605584, -159884448, --163383248, -165773392, -168035760, -170768432, -173590768, -176530672, -180116432, -184315840, -188937760, -194341904, --200491760, -206520816, -212239568, -218499488, -225355856, -231702208, -237215344, -242769264, -248687728, -254468752, --260238512, -266707808, -273941056, -281680064, -290293632, -300081856, -310452576, -320862496, -331534976, -342404448, --352558304, -361381760, -369063328, -375619040, -380618944, -383952896, -385725632, -385646720, -383630784, -380563104, --377491648, -374619936, -371822848, -369278592, -366996352, -364715744, -362746496, -361908992, -362372288, -363497056, --364780704, -365996160, -366721472, -366764960, -366680672, -366982400, -367400096, -367574048, -367722208, -368027168, --368227424, -368258560, -368442688, -368780928, -368942528, -368980096, -369208288, -369538976, -369727968, -369950752, --370432864, -370996064, -371569984, -372518624, -374047104, -375963712, -378274944, -381220224, -384661024, -388236576, --392007584, -396189792, -400559936, -404847904, -409238432, -413860896, -418399616, -422691904, -426985248, -431279680, --435233184, -438858688, -442451968, -445902976, -448900320, -451546560, -454001120, -456011712, -457482752, -458817920, --460182656, -461281088, -462164256, -463233696, -464334272, -464945792, -465118656, -465174496, -464947392, -464355744, --463920896, -463844128, -463656736, -463389920, -463649760, -464247296, -464458848, -464531328, -465066560, -465613632, --465777920, -466290112, -467196864, -467418080, -467498592, -469054464, -470692448, -470029952, -469692256, -473230240, --476283424, -473541632, -472350304, -482087520, -491237952, -478718144, -450771840, -438733056, -452943488, -469665408, --474604096, -484207104, -505161184, -508774304, -474142368, -428292000, -412397920, -428558816, -447011072, -448439680, --436165216, -422568416, -419888896, -424843680, -401945600, -313745216, -185358448, -103257456, -121463824, -197578704, --251416656, -259959344, -258984384, -271355488, -275937152, -245777360, -185467968, -123581776, -86443736, }, -}, -{ -{ -60774324, -59729572, 33552284, -19560892, -61997316, -58416924, -16454020, 26468810, 43690556, 34408592, 9218610, --21484500, -43571368, -38717520, -2093797, 40014064, 45883136, 4796405, -39861056, -32189170, 31201864, -94976224, 107137424, 69399152, 19405200, -16790100, -39045548, -54413476, -64906084, -71736152, -77391016, --81401976, -81075024, -76618456, -71176200, -67105104, -65755948, -68925632, -77089296, -87613040, -97186520, --104786464, -110843440, -115289808, -117946784, -119391504, -120165128, -119999776, -118380576, -114929568, -108963856, --99642704, -86779280, -70805224, -51947628, -30181272, -5902359, 20093468, 47315508, 75696648, 105004968, -134663328, 164189616, 193327216, 221575216, 247971008, 271514400, 291530048, 307443424, 318553952, 324301696, -324525568, 319261568, 308642784, 293263040, 274253536, 252611728, 228828880, 203581984, 178318992, 154462064, -132279624, 111285824, 91716344, 74807592, 61318712, 50438484, 40789304, 32231582, 25963078, 22846004, -22310744, 23179402, 24956982, 27881854, 32162326, 37633040, 43853228, 50110996, 55558088, 59663540, -62427348, 64029372, 64456184, 63435592, 60476896, 55152748, 47702056, 39153460, 30481382, 21861384, -13050258, 4080756, -4772246, -13239774, -20906828, -27201102, -31792422, -34639448, -35629976, -34651796, --31963684, -27963458, -22743462, -16363825, -9285182, -2051921, 5099737, 11960410, 18188112, 23685670, -28553480, 32546188, 35286376, 37026376, 38472708, 40037148, 41990820, 44889924, 48940616, 53439056, -57652420, 61640832, 65580928, 69140384, 72131832, 74825312, 77170896, 78721920, 79533128, 80082352, -80360984, 80159120, 79882096, 79979272, 80138184, 80043160, 80053360, 80276696, 80137648, 79536352, -79057464, 78639240, 77597176, 76030048, 74532712, 72858216, 70625368, 68576672, 67376760, 66365296, -65076272, 64294588, 64252712, 63928440, 63068372, 62334472, 61069068, 57945552, 53580252, 49213344, -43928924, 36705328, 29108604, 22355304, 14842333, 5965710, -1968706, -8492761, -15931644, -23791434, --29415158, -34534760, -42116448, -48639968, -50829328, -54961084, -65088080, -71225592, -67966248, -70453032, --86594592, -93825168, -79387640, -78654808, -121203440, -160942624, -128472672, -42519640, 7400229, -10142565, --38660076, -43189656, -60630444, -109811040, -134682128, -88345328, -12016782, 23361400, 10660109, -5608154, --2326799, 3198677, -12473122, -53285512, -96956200, -102666360, -49961744, 22169548, 46085536, 5877663, --44782552, -56557740, -41253160, -36235028, -45420888, -45099304, -27812598, -9433359, -1260036, }, -{ -60774324, -59729572, 33552284, -19560892, -61997316, -58416924, -16454020, 26468810, 43690556, 34408592, 9218610, --21484500, -43571368, -38717520, -2093797, 40014064, 45883136, 4796405, -39861056, -32189170, 31201864, -94976224, 107137424, 69399152, 19405200, -16790100, -39045548, -54413476, -64906084, -71736152, -77391016, --81401976, -81075024, -76618456, -71176200, -67105104, -65755948, -68925632, -77089296, -87613040, -97186520, --104786464, -110843440, -115289808, -117946784, -119391504, -120165128, -119999776, -118380576, -114929568, -108963856, --99642704, -86779280, -70805224, -51947628, -30181272, -5902359, 20093468, 47315508, 75696648, 105004968, -134663328, 164189616, 193327216, 221575216, 247971008, 271514400, 291530048, 307443424, 318553952, 324301696, -324525568, 319261568, 308642784, 293263040, 274253536, 252611728, 228828880, 203581984, 178318992, 154462064, -132279624, 111285824, 91716344, 74807592, 61318712, 50438484, 40789304, 32231582, 25963078, 22846004, -22310744, 23179402, 24956982, 27881854, 32162326, 37633040, 43853228, 50110996, 55558088, 59663540, -62427348, 64029372, 64456184, 63435592, 60476896, 55152748, 47702056, 39153460, 30481382, 21861384, -13050258, 4080756, -4772246, -13239774, -20906828, -27201102, -31792422, -34639448, -35629976, -34651796, --31963684, -27963458, -22743462, -16363825, -9285182, -2051921, 5099737, 11960410, 18188112, 23685670, -28553480, 32546188, 35286376, 37026376, 38472708, 40037148, 41990820, 44889924, 48940616, 53439056, -57652420, 61640832, 65580928, 69140384, 72131832, 74825312, 77170896, 78721920, 79533128, 80082352, -80360984, 80159120, 79882096, 79979272, 80138184, 80043160, 80053360, 80276696, 80137648, 79536352, -79057464, 78639240, 77597176, 76030048, 74532712, 72858216, 70625368, 68576672, 67376760, 66365296, -65076272, 64294588, 64252712, 63928440, 63068372, 62334472, 61069068, 57945552, 53580252, 49213344, -43928924, 36705328, 29108604, 22355304, 14842333, 5965710, -1968706, -8492761, -15931644, -23791434, --29415158, -34534760, -42116448, -48639968, -50829328, -54961084, -65088080, -71225592, -67966248, -70453032, --86594592, -93825168, -79387640, -78654808, -121203440, -160942624, -128472672, -42519640, 7400229, -10142565, --38660076, -43189656, -60630444, -109811040, -134682128, -88345328, -12016782, 23361400, 10660109, -5608154, --2326799, 3198677, -12473122, -53285512, -96956200, -102666360, -49961744, 22169548, 46085536, 5877663, --44782552, -56557740, -41253160, -36235028, -45420888, -45099304, -27812598, -9433359, -1260036, }, -}, -{ -{ -29020558, -43026984, 51106352, 33877628, -3030100, -28343026, -17795124, 14452028, 29481730, 9083856, -28427314, --59444496, -77127416, -71994392, -24524800, 51500952, 86269784, 25448754, -81479824, -116287312, -27297738, -112266152, 196773920, 197985648, 157917360, 111005040, 55734716, -12725451, -82915952, -143763824, -196459856, --243939104, -282670048, -308530592, -321597472, -323049184, -313426848, -294756640, -270353696, -242588880, -213100176, --183778432, -155631904, -128221416, -101467528, -76332840, -53064320, -30685930, -8827232, 11590506, 29678224, -45077292, 57243324, 65799436, 71648648, 76578728, 81806240, 87654912, 94220848, 101459472, 108883864, -115894320, 122306712, 128216048, 133621264, 138539008, 143277424, 148222000, 153368992, 158288880, 162613904, -166339248, 169426800, 171317120, 171284912, 169202928, 165378784, 159672384, 151565104, 141233024, 129656472, -117366960, 103997800, 89535032, 75091064, 61760556, 49442052, 37490232, 25878252, 14907831, 4243428, --6872485, -18598282, -30380988, -41854456, -53257596, -64815888, -76096616, -86220928, -94558536, -101078832, --106015360, -109264504, -110227648, -108380280, -103932304, -97702992, -90310816, -81695648, -71516576, -59845000, --47395500, -35190276, -23958402, -13630079, -3425773, 7343321, 18519898, 29235306, 38665980, 46534896, -53135188, 59176060, 65425772, 72171016, 79077864, 85709296, 91984240, 98078800, 104238856, 110832168, -118231856, 126450280, 135140608, 143966768, 152718304, 161164896, 169167488, 176834544, 184250336, 191181872, -197286640, 202369200, 206265264, 208791776, 210006720, 210206432, 209600304, 208306448, 206575584, 204618144, -202391200, 199920528, 197530912, 195447312, 193624112, 192247024, 191791232, 192336688, 193484512, 195080096, -197244224, 199711680, 201983184, 204049600, 206191184, 208402544, 210732576, 213604288, 217094496, 220677568, -224179040, 227969888, 231921792, 235477488, 238799104, 242353728, 245612544, 247775056, 249122592, 250004672, -249646048, 247669824, 245118080, 242424064, 238654160, 233954384, 229781824, 225996352, 221350800, 216711696, -213395984, 209736672, 204569296, 200872944, 199637600, 195925664, 188862064, 186209376, 188915744, 185078736, -173190800, 171437376, 182817424, 176767440, 138999104, 113357072, 146674208, 211644720, 240775872, 224184944, -209917056, 212717920, 196212896, 156345392, 147491328, 196417440, 253637152, 267065360, 251954592, 249604176, -261806704, 266423264, 260329248, 246459184, 209993296, 149151872, 105053824, 118057912, 168719200, 200982992, -195907424, 185727808, 196233296, 211471312, 207507584, 194690336, 204803376, 245127200, 283631584, }, -{ -29020558, -43026984, 51106352, 33877628, -3030100, -28343026, -17795124, 14452028, 29481730, 9083856, -28427314, --59444496, -77127416, -71994392, -24524800, 51500952, 86269784, 25448754, -81479824, -116287312, -27297738, -112266152, 196773920, 197985648, 157917360, 111005040, 55734716, -12725451, -82915952, -143763824, -196459856, --243939104, -282670048, -308530592, -321597472, -323049184, -313426848, -294756640, -270353696, -242588880, -213100176, --183778432, -155631904, -128221416, -101467528, -76332840, -53064320, -30685930, -8827232, 11590506, 29678224, -45077292, 57243324, 65799436, 71648648, 76578728, 81806240, 87654912, 94220848, 101459472, 108883864, -115894320, 122306712, 128216048, 133621264, 138539008, 143277424, 148222000, 153368992, 158288880, 162613904, -166339248, 169426800, 171317120, 171284912, 169202928, 165378784, 159672384, 151565104, 141233024, 129656472, -117366960, 103997800, 89535032, 75091064, 61760556, 49442052, 37490232, 25878252, 14907831, 4243428, --6872485, -18598282, -30380988, -41854456, -53257596, -64815888, -76096616, -86220928, -94558536, -101078832, --106015360, -109264504, -110227648, -108380280, -103932304, -97702992, -90310816, -81695648, -71516576, -59845000, --47395500, -35190276, -23958402, -13630079, -3425773, 7343321, 18519898, 29235306, 38665980, 46534896, -53135188, 59176060, 65425772, 72171016, 79077864, 85709296, 91984240, 98078800, 104238856, 110832168, -118231856, 126450280, 135140608, 143966768, 152718304, 161164896, 169167488, 176834544, 184250336, 191181872, -197286640, 202369200, 206265264, 208791776, 210006720, 210206432, 209600304, 208306448, 206575584, 204618144, -202391200, 199920528, 197530912, 195447312, 193624112, 192247024, 191791232, 192336688, 193484512, 195080096, -197244224, 199711680, 201983184, 204049600, 206191184, 208402544, 210732576, 213604288, 217094496, 220677568, -224179040, 227969888, 231921792, 235477488, 238799104, 242353728, 245612544, 247775056, 249122592, 250004672, -249646048, 247669824, 245118080, 242424064, 238654160, 233954384, 229781824, 225996352, 221350800, 216711696, -213395984, 209736672, 204569296, 200872944, 199637600, 195925664, 188862064, 186209376, 188915744, 185078736, -173190800, 171437376, 182817424, 176767440, 138999104, 113357072, 146674208, 211644720, 240775872, 224184944, -209917056, 212717920, 196212896, 156345392, 147491328, 196417440, 253637152, 267065360, 251954592, 249604176, -261806704, 266423264, 260329248, 246459184, 209993296, 149151872, 105053824, 118057912, 168719200, 200982992, -195907424, 185727808, 196233296, 211471312, 207507584, 194690336, 204803376, 245127200, 283631584, }, -}, -{ -{ -9651865, -3961034, 1835025, 9908490, 22075596, 26681948, 24311662, 28811714, 45453640, 56586732, 36004172, --25028386, -102528384, -142361520, -93304408, 31549220, 131521560, 101836896, -42115912, -161706048, -141696880, --8993125, 120542016, 177131968, 177010640, 155108992, 116447840, 57876296, -6760816, -61629560, -106419088, --146315584, -179404544, -202494816, -218007712, -228075648, -229450576, -219002528, -198989600, -174288160, -148494736, --124015032, -102447856, -83734680, -66888212, -51527796, -37416144, -23551454, -9249212, 4811974, 17686676, -29273960, 39620000, 48319456, 55328844, 61418032, 67337032, 73311336, 79517560, 86243480, 93488016, -101055208, 108991776, 117364280, 125814088, 133909024, 141755936, 149705920, 157633360, 165047008, 171803520, -178155248, 184033440, 188793344, 191877120, 193336880, 193314864, 191339712, 186779008, 179929072, 171889424, -163159360, 153135456, 141469776, 129112088, 117172080, 105288440, 92156040, 77496240, 62520228, 48381196, -35046932, 22009024, 9437654, -1845225, -11237782, -18853832, -25243134, -30777736, -35313220, -38456064, --40142912, -40800580, -40957880, -41000832, -41336376, -42368240, -44060460, -45845016, -47209208, -48200808, --49257908, -50800336, -52993452, -55553256, -57713624, -58755688, -58689656, -58201640, -57996016, -58389008, --59332288, -60458108, -61217780, -61281668, -60723320, -59672664, -58015880, -55542516, -52076480, -47392816, --41369124, -34298000, -26756572, -19200652, -11957726, -5417565, 163746, 4829154, 8558259, 11005317, -11884711, 11284490, 9393093, 6365142, 2624225, -1176284, -4648229, -7708930, -10205916, -11959336, --13013751, -13386876, -12816182, -11110544, -8341900, -4396436, 1074816, 8005819, 15867757, 24364276, -33447058, 42705932, 51593296, 60073708, 68262064, 75834088, 82568064, 88848912, 94926832, 100491496, -105538624, 110612584, 115818088, 120789512, 125676112, 130783904, 135540576, 139341088, 142721232, 146152912, -148914032, 150690000, 152522336, 154741232, 156256816, 156975680, 158030096, 159093104, 159020624, 158774208, -159527440, 159551056, 157928624, 157767568, 159824864, 159133904, 155159456, 155541168, 160509376, 158103120, -147591712, 146963584, 157603296, 148436752, 107092864, 79350592, 112127640, 177940496, 209333488, 194080976, -176679392, 173700288, 156176816, 122001768, 116535888, 159170944, 207145200, 219210304, 207884464, 203208864, -206750592, 205597408, 194819712, 166498160, 114397528, 67672040, 78230680, 150149904, 219664496, 232825344, -209000080, 198397968, 209876256, 217262528, 211632896, 205857248, 200630800, 185133488, 166889008, }, -{ --9651865, --3961034, -1835025, -9908490, -22075596, -26681948, -24311662, -28811714, -45453640, -56586732, -36004172, -25028386, 102528384, 142361520, 93304408, -31549220, -131521560, -101836896, 42115912, 161706048, 141696880, -8993125, -120542016, -177131968, -177010640, -155108992, -116447840, -57876296, 6760816, 61629560, 106419088, -146315584, 179404544, 202494816, 218007712, 228075648, 229450576, 219002528, 198989600, 174288160, 148494736, -124015032, 102447856, 83734680, 66888212, 51527796, 37416144, 23551454, 9249212, -4811974, -17686676, --29273960, -39620000, -48319456, -55328844, -61418032, -67337032, -73311336, -79517560, -86243480, -93488016, --101055208, -108991776, -117364280, -125814088, -133909024, -141755936, -149705920, -157633360, -165047008, -171803520, --178155248, -184033440, -188793344, -191877120, -193336880, -193314864, -191339712, -186779008, -179929072, -171889424, --163159360, -153135456, -141469776, -129112088, -117172080, -105288440, -92156040, -77496240, -62520228, -48381196, --35046932, -22009024, -9437654, 1845225, 11237782, 18853832, 25243134, 30777736, 35313220, 38456064, -40142912, 40800580, 40957880, 41000832, 41336376, 42368240, 44060460, 45845016, 47209208, 48200808, -49257908, 50800336, 52993452, 55553256, 57713624, 58755688, 58689656, 58201640, 57996016, 58389008, -59332288, 60458108, 61217780, 61281668, 60723320, 59672664, 58015880, 55542516, 52076480, 47392816, -41369124, 34298000, 26756572, 19200652, 11957726, 5417565, -163746, -4829154, -8558259, -11005317, --11884711, -11284490, -9393093, -6365142, -2624225, 1176284, 4648229, 7708930, 10205916, 11959336, -13013751, 13386876, 12816182, 11110544, 8341900, 4396436, -1074816, -8005819, -15867757, -24364276, --33447058, -42705932, -51593296, -60073708, -68262064, -75834088, -82568064, -88848912, -94926832, -100491496, --105538624, -110612584, -115818088, -120789512, -125676112, -130783904, -135540576, -139341088, -142721232, -146152912, --148914032, -150690000, -152522336, -154741232, -156256816, -156975680, -158030096, -159093104, -159020624, -158774208, --159527440, -159551056, -157928624, -157767568, -159824864, -159133904, -155159456, -155541168, -160509376, -158103120, --147591712, -146963584, -157603296, -148436752, -107092864, -79350592, -112127640, -177940496, -209333488, -194080976, --176679392, -173700288, -156176816, -122001768, -116535888, -159170944, -207145200, -219210304, -207884464, -203208864, --206750592, -205597408, -194819712, -166498160, -114397528, -67672040, -78230680, -150149904, -219664496, -232825344, --209000080, -198397968, -209876256, -217262528, -211632896, -205857248, -200630800, -185133488, -166889008, }, -}, -{ -{ -14787572, --9309878, -12623446, 14235132, 21446382, -18530636, -51859584, -11151883, 81569480, 130340448, 80423800, --23640036, -97234840, -95277408, -29990682, 48718352, 78334832, 28942174, -55041616, -87754232, -36443336, -41908680, 74315816, 52690120, 19752018, 3755949, 63888, 1271847, 11577621, 32096290, 54330264, -71073656, 81520088, 85850488, 83865144, 77858632, 70140576, 59209884, 42861088, 22803056, 2893734, --14632417, -28780576, -38480224, -43919800, -47207596, -50281720, -53584012, -57026428, -60498372, -63314260, --64689188, -64704220, -63640140, -60756608, -54784456, -45235668, -32409824, -16589848, 2012192, 22822920, -44995688, 67856728, 91011968, 114083992, 136437696, 157193648, 175502032, 190672384, 201933792, 208334368, -209109616, 203979808, 193023344, 176628912, 155657136, 131174208, 103956464, 74747464, 44881336, 15788300, --12182675, -39564700, -66217120, -90894928, -112714976, -132169032, -150156896, -166723120, -181363040, -194027824, --205038512, -214222224, -220860640, -224489344, -225158288, -222805728, -216964560, -207381952, -194514768, -179062560, --161272800, -141016656, -118520160, -94934880, -72164576, -51830056, -34111168, -17818746, -1939715, 13076565, -25801480, 35229468, 41436232, 45314052, 48045652, 50455664, 52508124, 53684944, 53906136, 53718768, -53710712, 54243828, 55603720, 57789320, 60308856, 62680752, 64859376, 66787280, 68006512, 68133216, -67199056, 65231428, 62128848, 58126476, 53721988, 49094696, 44256952, 39577588, 35408784, 31518618, -27623082, 23968064, 20742544, 17588428, 14274324, 11059541, 7991324, 4777614, 1561758, -1203665, --3655017, -6198175, -8592619, -10442676, -12040404, -13614509, -14581951, -14561550, -14057428, -13307419, --11811697, -9615895, -7500624, -5536213, -3138547, -507343, 1806034, 4284767, 7539278, 10920491, -13808857, 16869020, 20430086, 23504208, 25693032, 27695022, 29115046, 28652264, 26727582, 24683178, -21885006, 17188460, 11892228, 7428146, 2467996, -3930432, -9811316, -14376329, -19734300, -25883084, --30247844, -33807300, -39536248, -44918916, -46400680, -48712444, -56388088, -61736932, -58746564, -59299540, --72151152, -79747344, -68556264, -65434900, -97560184, -129828272, -101897560, -25092810, 23052700, 8773544, --21001854, -28310276, -39726300, -79001088, -107210976, -78245712, -12508019, 30356292, 27078158, 3529390, --11720966, -20394652, -47575352, -109237664, -177698896, -189935808, -117179592, -17255032, 19667192, -23667418, --79005920, -87648472, -65023120, -56499220, -69431368, -77732464, -69026568, -55698208, -49138720, }, -{ --14787572, -9309878, 12623446, -14235132, -21446382, 18530636, 51859584, 11151883, -81569480, -130340448, -80423800, -23640036, 97234840, 95277408, 29990682, -48718352, -78334832, -28942174, 55041616, 87754232, 36443336, --41908680, -74315816, -52690120, -19752018, -3755949, -63888, -1271847, -11577621, -32096290, -54330264, --71073656, -81520088, -85850488, -83865144, -77858632, -70140576, -59209884, -42861088, -22803056, -2893734, -14632417, 28780576, 38480224, 43919800, 47207596, 50281720, 53584012, 57026428, 60498372, 63314260, -64689188, 64704220, 63640140, 60756608, 54784456, 45235668, 32409824, 16589848, -2012192, -22822920, --44995688, -67856728, -91011968, -114083992, -136437696, -157193648, -175502032, -190672384, -201933792, -208334368, --209109616, -203979808, -193023344, -176628912, -155657136, -131174208, -103956464, -74747464, -44881336, -15788300, -12182675, 39564700, 66217120, 90894928, 112714976, 132169032, 150156896, 166723120, 181363040, 194027824, -205038512, 214222224, 220860640, 224489344, 225158288, 222805728, 216964560, 207381952, 194514768, 179062560, -161272800, 141016656, 118520160, 94934880, 72164576, 51830056, 34111168, 17818746, 1939715, -13076565, --25801480, -35229468, -41436232, -45314052, -48045652, -50455664, -52508124, -53684944, -53906136, -53718768, --53710712, -54243828, -55603720, -57789320, -60308856, -62680752, -64859376, -66787280, -68006512, -68133216, --67199056, -65231428, -62128848, -58126476, -53721988, -49094696, -44256952, -39577588, -35408784, -31518618, --27623082, -23968064, -20742544, -17588428, -14274324, -11059541, -7991324, -4777614, -1561758, 1203665, -3655017, 6198175, 8592619, 10442676, 12040404, 13614509, 14581951, 14561550, 14057428, 13307419, -11811697, 9615895, 7500624, 5536213, 3138547, 507343, -1806034, -4284767, -7539278, -10920491, --13808857, -16869020, -20430086, -23504208, -25693032, -27695022, -29115046, -28652264, -26727582, -24683178, --21885006, -17188460, -11892228, -7428146, -2467996, 3930432, 9811316, 14376329, 19734300, 25883084, -30247844, 33807300, 39536248, 44918916, 46400680, 48712444, 56388088, 61736932, 58746564, 59299540, -72151152, 79747344, 68556264, 65434900, 97560184, 129828272, 101897560, 25092810, -23052700, -8773544, -21001854, 28310276, 39726300, 79001088, 107210976, 78245712, 12508019, -30356292, -27078158, -3529390, -11720966, 20394652, 47575352, 109237664, 177698896, 189935808, 117179592, 17255032, -19667192, 23667418, -79005920, 87648472, 65023120, 56499220, 69431368, 77732464, 69026568, 55698208, 49138720, }, -}, -{ -{ --6025302, -1979443, -222265, -16834662, -30957588, -36381596, -51714092, -87899728, -120777704, -112181864, -43570832, -77029168, 208089024, 261198432, 152920160, -75685912, -236769200, -175597056, 39822400, 187850064, 150632560, -20638928, -58457728, -61116848, -46331960, -37755448, -13233331, 26470958, 49673444, 44979580, 32832878, -29070486, 30021822, 31279710, 35779224, 43230456, 48567492, 50661288, 52303036, 53977000, 54458576, -53994180, 52387328, 47992500, 41231148, 34854196, 29503204, 23281944, 15821586, 8548596, 1335735, --7248831, -17124034, -27237072, -37695316, -48859548, -59795608, -69548408, -78358992, -86362664, -92807800, --97305704, -100093136, -100751880, -98342936, -92724048, -84230752, -72535016, -57256208, -39036420, -18780282, -3400540, 27492086, 52703544, 78053512, 103020160, 127148752, 149767664, 170279344, 188142112, 202759504, -213930704, 221964976, 226878432, 228149200, 225644704, 219942592, 211418688, 199924288, 185485136, 168290240, -147967536, 124031680, 97151088, 68976640, 40701796, 12624519, -14948634, -41031432, -64026152, -82104744, --94056560, -100199976, -101970040, -100331512, -95142656, -86187648, -74119864, -60247116, -46028628, -32858648, --21724482, -12905840, -6273874, -1771137, 579821, 753767, -1453846, -6287832, -13451838, -22012244, --31038118, -40020504, -48729624, -57130580, -65436512, -73827264, -82161648, -90292024, -98483600, -107146016, --116334560, -125821600, -135456288, -145181168, -154930208, -164768368, -174957104, -185680032, -196791648, -207871584, --218379760, -227793248, -235789408, -242291984, -247272544, -250634960, -252407168, -252862448, -252302480, -250889440, --248792960, -246312624, -243703968, -241036256, -238327200, -235674512, -233170016, -230821200, -228622720, -226595488, --224694976, -222788000, -220744144, -218472096, -215921968, -213194128, -210591376, -208357456, -206404848, -204483936, --202514688, -200500880, -198246032, -195491872, -192226096, -188531344, -184309936, -179491520, -174255408, -168694512, --162626256, -156058704, -149355344, -142635856, -135690896, -128732520, -122365768, -116624472, -111073760, -105838728, --101291432, -97019552, -92588224, -88589072, -85222352, -81268832, -76563696, -73123968, -71223976, -68003824, --63351840, -61722440, -63362040, -61339648, -54596012, -54396296, -66872640, -79462264, -79236776, -73754256, --75033080, -74489232, -59138480, -43898324, -56496536, -92272000, -115959288, -111137112, -97305168, -93654448, --96820912, -100096360, -102982040, -95615096, -68264744, -44223668, -64519536, -126372968, -176200496, -181162800, --167001744, -164430144, -164273376, -155705984, -159117808, -175705504, -151062592, -52396992, 49567680, }, -{ --6025302, -1979443, -222265, -16834662, -30957588, -36381596, -51714092, -87899728, -120777704, -112181864, -43570832, -77029168, 208089024, 261198432, 152920160, -75685912, -236769200, -175597056, 39822400, 187850064, 150632560, -20638928, -58457728, -61116848, -46331960, -37755448, -13233331, 26470958, 49673444, 44979580, 32832878, -29070486, 30021822, 31279710, 35779224, 43230456, 48567492, 50661288, 52303036, 53977000, 54458576, -53994180, 52387328, 47992500, 41231148, 34854196, 29503204, 23281944, 15821586, 8548596, 1335735, --7248831, -17124034, -27237072, -37695316, -48859548, -59795608, -69548408, -78358992, -86362664, -92807800, --97305704, -100093136, -100751880, -98342936, -92724048, -84230752, -72535016, -57256208, -39036420, -18780282, -3400540, 27492086, 52703544, 78053512, 103020160, 127148752, 149767664, 170279344, 188142112, 202759504, -213930704, 221964976, 226878432, 228149200, 225644704, 219942592, 211418688, 199924288, 185485136, 168290240, -147967536, 124031680, 97151088, 68976640, 40701796, 12624519, -14948634, -41031432, -64026152, -82104744, --94056560, -100199976, -101970040, -100331512, -95142656, -86187648, -74119864, -60247116, -46028628, -32858648, --21724482, -12905840, -6273874, -1771137, 579821, 753767, -1453846, -6287832, -13451838, -22012244, --31038118, -40020504, -48729624, -57130580, -65436512, -73827264, -82161648, -90292024, -98483600, -107146016, --116334560, -125821600, -135456288, -145181168, -154930208, -164768368, -174957104, -185680032, -196791648, -207871584, --218379760, -227793248, -235789408, -242291984, -247272544, -250634960, -252407168, -252862448, -252302480, -250889440, --248792960, -246312624, -243703968, -241036256, -238327200, -235674512, -233170016, -230821200, -228622720, -226595488, --224694976, -222788000, -220744144, -218472096, -215921968, -213194128, -210591376, -208357456, -206404848, -204483936, --202514688, -200500880, -198246032, -195491872, -192226096, -188531344, -184309936, -179491520, -174255408, -168694512, --162626256, -156058704, -149355344, -142635856, -135690896, -128732520, -122365768, -116624472, -111073760, -105838728, --101291432, -97019552, -92588224, -88589072, -85222352, -81268832, -76563696, -73123968, -71223976, -68003824, --63351840, -61722440, -63362040, -61339648, -54596012, -54396296, -66872640, -79462264, -79236776, -73754256, --75033080, -74489232, -59138480, -43898324, -56496536, -92272000, -115959288, -111137112, -97305168, -93654448, --96820912, -100096360, -102982040, -95615096, -68264744, -44223668, -64519536, -126372968, -176200496, -181162800, --167001744, -164430144, -164273376, -155705984, -159117808, -175705504, -151062592, -52396992, 49567680, }, -}, -{ -{ -29307246, --878858, -42704324, -72876472, -70761736, -23331336, 55871084, 116787144, 109559248, 39856760, -32484448, --58414776, -43856448, -21141440, -2680597, 15889768, 26560614, 13996225, -14605036, -31122406, -21969832, --2903398, 6818798, 8773544, 15928423, 31583578, 48165372, 59697360, 65471944, 64473900, 54574000, -37441376, 18937048, 3500935, -9198746, -21889838, -36363876, -52752936, -69901664, -85429584, -96595424, --102137008, -103021232, -101151312, -97832912, -93675920, -89173184, -84649512, -79967456, -74834440, -69271384, --63428612, -57213260, -50484656, -43397960, -36165236, -28683940, -20797842, -12817793, -5420786, 918049, -6114423, 10133975, 12791486, 14083198, 14567455, 15083388, 16026670, 17206712, 18585934, 20751672, -24294482, 29113436, 34883188, 41921028, 50963544, 62261992, 75462040, 90223840, 106428216, 123815856, -141812304, 159680448, 176754016, 192737728, 207700864, 221378720, 232731936, 240982032, 246897264, 251979824, -256221104, 257716832, 254803760, 247682176, 237500960, 224613360, 208337056, 188131376, 164570256, 139064592, -112637664, 85165984, 56152404, 26129508, -3279745, -30788474, -56460028, -81225344, -105789336, -129938864, --152505696, -172069808, -188065888, -201101104, -212045760, -221146256, -228186784, -233039552, -235799616, -236826640, --236814832, -236425072, -235787792, -234723184, -233300480, -231734960, -229933216, -227519984, -224062000, -219077696, --212325472, -204323936, -196038416, -187871536, -179481856, -170480144, -160598496, -149437488, -136977776, -124157840, --112090056, -100978976, -90492816, -80589152, -71204112, -61867392, -52499532, -43907452, -36817532, -31094490, --26345330, -22387518, -18780818, -14820322, -10290742, -5505075, -673236, 4072703, 8424578, 12390444, -16510391, 21018496, 25596394, 30291868, 35538708, 41002980, 45722612, 49519900, 52903796, 55758340, -57636852, 58932856, 60229936, 61198988, 61519500, 61785252, 62269508, 62305480, 61950072, 62325344, -63552096, 64648920, 65827352, 68190120, 71262096, 73829952, 76496592, 80195096, 83748640, 86269784, -89391152, 93638880, 96563752, 97985384, 101374112, 106389024, 107995880, 106985488, 110517560, 117346024, -117004576, 110704392, 114393232, 129332200, 131231648, 107544368, 84891640, 93700616, 122091424, 134975792, -127269544, 123901752, 131259032, 125364192, 95880312, 70135744, 76178760, 102809168, 116211616, 105042552, -88894008, 83855480, 78058344, 51140712, 9394167, -13389024, 5523328, 48172892, 74796856, 68604584, -50431504, 47843788, 61429308, 69788920, 61923228, 53546968, 67870680, 105293808, 138296336, }, -{ -29307246, --878858, -42704324, -72876472, -70761736, -23331336, 55871084, 116787144, 109559248, 39856760, -32484448, --58414776, -43856448, -21141440, -2680597, 15889768, 26560614, 13996225, -14605036, -31122406, -21969832, --2903398, 6818798, 8773544, 15928423, 31583578, 48165372, 59697360, 65471944, 64473900, 54574000, -37441376, 18937048, 3500935, -9198746, -21889838, -36363876, -52752936, -69901664, -85429584, -96595424, --102137008, -103021232, -101151312, -97832912, -93675920, -89173184, -84649512, -79967456, -74834440, -69271384, --63428612, -57213260, -50484656, -43397960, -36165236, -28683940, -20797842, -12817793, -5420786, 918049, -6114423, 10133975, 12791486, 14083198, 14567455, 15083388, 16026670, 17206712, 18585934, 20751672, -24294482, 29113436, 34883188, 41921028, 50963544, 62261992, 75462040, 90223840, 106428216, 123815856, -141812304, 159680448, 176754016, 192737728, 207700864, 221378720, 232731936, 240982032, 246897264, 251979824, -256221104, 257716832, 254803760, 247682176, 237500960, 224613360, 208337056, 188131376, 164570256, 139064592, -112637664, 85165984, 56152404, 26129508, -3279745, -30788474, -56460028, -81225344, -105789336, -129938864, --152505696, -172069808, -188065888, -201101104, -212045760, -221146256, -228186784, -233039552, -235799616, -236826640, --236814832, -236425072, -235787792, -234723184, -233300480, -231734960, -229933216, -227519984, -224062000, -219077696, --212325472, -204323936, -196038416, -187871536, -179481856, -170480144, -160598496, -149437488, -136977776, -124157840, --112090056, -100978976, -90492816, -80589152, -71204112, -61867392, -52499532, -43907452, -36817532, -31094490, --26345330, -22387518, -18780818, -14820322, -10290742, -5505075, -673236, 4072703, 8424578, 12390444, -16510391, 21018496, 25596394, 30291868, 35538708, 41002980, 45722612, 49519900, 52903796, 55758340, -57636852, 58932856, 60229936, 61198988, 61519500, 61785252, 62269508, 62305480, 61950072, 62325344, -63552096, 64648920, 65827352, 68190120, 71262096, 73829952, 76496592, 80195096, 83748640, 86269784, -89391152, 93638880, 96563752, 97985384, 101374112, 106389024, 107995880, 106985488, 110517560, 117346024, -117004576, 110704392, 114393232, 129332200, 131231648, 107544368, 84891640, 93700616, 122091424, 134975792, -127269544, 123901752, 131259032, 125364192, 95880312, 70135744, 76178760, 102809168, 116211616, 105042552, -88894008, 83855480, 78058344, 51140712, 9394167, -13389024, 5523328, 48172892, 74796856, 68604584, -50431504, 47843788, 61429308, 69788920, 61923228, 53546968, 67870680, 105293808, 138296336, }, -}, -{ -{ --14042932, -36850284, 74545600, 62616864, 21942452, -35493608, -129862632, -245363968, -305267488, -253026192, -105521440, -97686344, 316325952, 438439392, 305316864, -72467376, -401281472, -367888640, -8289824, 324833760, 372224416, -210067392, 57280368, -6293201, -43093556, -93670016, -132662416, -146641456, -157265600, -172272752, -174583984, --158528848, -136673920, -114313240, -85986856, -52620864, -21429202, 5864241, 30623116, 49920404, 61535072, -69225208, 76380624, 81414864, 83167744, 83600464, 83035136, 79553528, 73965776, 69466264, 66667556, -63886028, 60877940, 58137752, 54595476, 49376016, 43455404, 37355480, 30013232, 21316460, 12649216, -4209068, -5113696, -15124727, -24588150, -33608120, -42966852, -51969104, -59424632, -65610996, -71242232, --75948440, -79402672, -82365128, -85393080, -88081192, -90216864, -92116848, -93674312, -94658392, -95714960, --97591856, -99947112, -102214320, -104685536, -107563160, -110046192, -111361520, -111583248, -110840224, -108969224, --106280040, -103409928, -100490424, -97757752, -96583080, -98445480, -103285376, -110119200, -118666728, -129239328, --141640512, -155055840, -168416944, -180446064, -190171488, -197639904, -203280272, -206717312, -207151648, -204593984, --199757856, -193181728, -185304224, -176749712, -167726528, -157865280, -147240608, -136770016, -127191696, -118458416, --110238928, -102100496, -93313536, -83529600, -73475616, -64114736, -55502788, -47197396, -39099236, -31110596, --22786412, -14031121, -5390184, 2841658, 10960757, 19097572, 27059368, 35013112, 43351252, 51912196, -60190208, 68055368, 75498008, 82111720, 87556664, 92006792, 95621008, 98203888, 99734512, 100466800, -100345472, 99104224, 96911104, 94131184, 90725816, 86650432, 82366200, 78212432, 73921216, 69373920, -65007016, 60975652, 56887380, 52735220, 49089864, 46178952, 43797928, 42036992, 41066328, 40505836, -39958228, 39606576, 39498128, 39136816, 38496328, 38295004, 38741140, 39278012, 39824548, 40808632, -41965588, 42667816, 43120396, 43752296, 44179644, 44193064, 44544180, 45489072, 46232100, 46717432, -47753592, 48926656, 49216568, 49459232, 50723564, 51389284, 50187228, 49803904, 51974472, 52767432, -49910204, 49344344, 54588496, 56278032, 46409804, 37261524, 47913044, 74125232, 91240136, 88413512, -80640160, 82477864, 88261040, 86315424, 77971376, 72854456, 75130792, 82306608, 90818696, 97236984, -99371048, 99507416, 100442640, 94990184, 67389112, 14216879, -39399344, -58022860, -36593120, -10273562, --9674414, -19194746, -6493454, 16509854, 8908299, -13298292, 33717640, 181697520, 325155872, }, -{ --14042932, -36850284, 74545600, 62616864, 21942452, -35493608, -129862632, -245363968, -305267488, -253026192, -105521440, -97686344, 316325952, 438439392, 305316864, -72467376, -401281472, -367888640, -8289824, 324833760, 372224416, -210067392, 57280368, -6293201, -43093556, -93670016, -132662416, -146641456, -157265600, -172272752, -174583984, --158528848, -136673920, -114313240, -85986856, -52620864, -21429202, 5864241, 30623116, 49920404, 61535072, -69225208, 76380624, 81414864, 83167744, 83600464, 83035136, 79553528, 73965776, 69466264, 66667556, -63886028, 60877940, 58137752, 54595476, 49376016, 43455404, 37355480, 30013232, 21316460, 12649216, -4209068, -5113696, -15124727, -24588150, -33608120, -42966852, -51969104, -59424632, -65610996, -71242232, --75948440, -79402672, -82365128, -85393080, -88081192, -90216864, -92116848, -93674312, -94658392, -95714960, --97591856, -99947112, -102214320, -104685536, -107563160, -110046192, -111361520, -111583248, -110840224, -108969224, --106280040, -103409928, -100490424, -97757752, -96583080, -98445480, -103285376, -110119200, -118666728, -129239328, --141640512, -155055840, -168416944, -180446064, -190171488, -197639904, -203280272, -206717312, -207151648, -204593984, --199757856, -193181728, -185304224, -176749712, -167726528, -157865280, -147240608, -136770016, -127191696, -118458416, --110238928, -102100496, -93313536, -83529600, -73475616, -64114736, -55502788, -47197396, -39099236, -31110596, --22786412, -14031121, -5390184, 2841658, 10960757, 19097572, 27059368, 35013112, 43351252, 51912196, -60190208, 68055368, 75498008, 82111720, 87556664, 92006792, 95621008, 98203888, 99734512, 100466800, -100345472, 99104224, 96911104, 94131184, 90725816, 86650432, 82366200, 78212432, 73921216, 69373920, -65007016, 60975652, 56887380, 52735220, 49089864, 46178952, 43797928, 42036992, 41066328, 40505836, -39958228, 39606576, 39498128, 39136816, 38496328, 38295004, 38741140, 39278012, 39824548, 40808632, -41965588, 42667816, 43120396, 43752296, 44179644, 44193064, 44544180, 45489072, 46232100, 46717432, -47753592, 48926656, 49216568, 49459232, 50723564, 51389284, 50187228, 49803904, 51974472, 52767432, -49910204, 49344344, 54588496, 56278032, 46409804, 37261524, 47913044, 74125232, 91240136, 88413512, -80640160, 82477864, 88261040, 86315424, 77971376, 72854456, 75130792, 82306608, 90818696, 97236984, -99371048, 99507416, 100442640, 94990184, 67389112, 14216879, -39399344, -58022860, -36593120, -10273562, --9674414, -19194746, -6493454, 16509854, 8908299, -13298292, 33717640, 181697520, 325155872, }, -}, -{ -{ --3956202, --4892505, -590021, 12164421, 38077032, 81775104, 124623304, 129460512, 85682984, 10402411, -102941240, --257014064, -344556224, -196735264, 162329360, 421296576, 301453568, -81786376, -339304576, -270695136, -44466872, -89393304, 91300808, 71099960, 80839872, 84115320, 60540248, 34794068, 20905754, 6206228, -14057965, --28276990, -31372052, -29687350, -27041114, -22638772, -17798882, -13996225, -9483288, -3846680, -10201, -1374390, 3223910, 6271726, 8032126, 7897908, 7853885, 8408472, 8438537, 8327405, 9541270, -12103755, 15187004, 18816252, 23058606, 27099096, 30406220, 33283312, 35678832, 37071472, 37647000, -38043748, 38136624, 37421512, 36086316, 34518116, 32481764, 29738354, 26662620, 23539106, 20119238, -16299401, 12321187, 8060580, 3009698, -2988760, -9727564, -17154100, -25212532, -33552822, -42001560, --50826108, -60007136, -68805912, -76527192, -83177944, -89035208, -94018448, -97715872, -99669544, -99597608, --97630512, -94253592, -89847496, -84563072, -78763792, -73134168, -68153616, -63880124, -60413008, -58128624, --57258892, -57550952, -58465244, -59591596, -60923576, -62826244, -65579856, -68929392, -72264432, -75220984, --77873128, -80420040, -82957832, -85422608, -87509960, -88818848, -89284856, -89289688, -89233312, -89199488, --89014272, -88326000, -86707872, -84005800, -80527416, -76630272, -72300408, -67334352, -61617212, -55052352, --47603808, -39574364, -31474058, -23550916, -15794742, -8280160, -1080184, 5948530, 12839268, 19225348, -24750822, 29457570, 33496986, 36922760, 39977556, 43079060, 46364172, 49711024, 53141092, 56701620, -60179472, 63440960, 66724464, 70176544, 73627552, 77124192, 80998248, 85179400, 89241368, 93158912, -97144104, 100919920, 104110544, 106969920, 109786344, 112219440, 114109224, 116018344, 118209312, 120240296, -122128472, 124492312, 127278136, 129930816, 132675296, 135856256, 138673760, 140493216, 142199920, 144359760, -145933328, 146609776, 147791440, 149669408, 150676576, 150927296, 152078352, 153518768, 153616480, 153758752, -155404272, 155954560, 154248912, 154691840, 158040832, 157198480, 151757840, 152642608, 159947808, 156843616, -142624592, 142603648, 158689376, 148107648, 94958504, 63685776, 117763168, 214589984, 256608720, 227827072, -195774272, 188039040, 163344592, 115923312, 110401064, 177253840, 254218576, 275298816, 254263680, 239107808, -239403632, 237804288, 225745632, 194518000, 136255152, 81283328, 85342072, 150444112, 207728240, 209318448, -186659280, 185007328, 195300752, 193707856, 193329904, 199881872, 165390064, 59089624, -47498580, }, -{ -3956202, -4892505, 590021, -12164421, -38077032, -81775104, -124623304, -129460512, -85682984, -10402411, 102941240, -257014064, 344556224, 196735264, -162329360, -421296576, -301453568, 81786376, 339304576, 270695136, 44466872, --89393304, -91300808, -71099960, -80839872, -84115320, -60540248, -34794068, -20905754, -6206228, 14057965, -28276990, 31372052, 29687350, 27041114, 22638772, 17798882, 13996225, 9483288, 3846680, 10201, --1374390, -3223910, -6271726, -8032126, -7897908, -7853885, -8408472, -8438537, -8327405, -9541270, --12103755, -15187004, -18816252, -23058606, -27099096, -30406220, -33283312, -35678832, -37071472, -37647000, --38043748, -38136624, -37421512, -36086316, -34518116, -32481764, -29738354, -26662620, -23539106, -20119238, --16299401, -12321187, -8060580, -3009698, 2988760, 9727564, 17154100, 25212532, 33552822, 42001560, -50826108, 60007136, 68805912, 76527192, 83177944, 89035208, 94018448, 97715872, 99669544, 99597608, -97630512, 94253592, 89847496, 84563072, 78763792, 73134168, 68153616, 63880124, 60413008, 58128624, -57258892, 57550952, 58465244, 59591596, 60923576, 62826244, 65579856, 68929392, 72264432, 75220984, -77873128, 80420040, 82957832, 85422608, 87509960, 88818848, 89284856, 89289688, 89233312, 89199488, -89014272, 88326000, 86707872, 84005800, 80527416, 76630272, 72300408, 67334352, 61617212, 55052352, -47603808, 39574364, 31474058, 23550916, 15794742, 8280160, 1080184, -5948530, -12839268, -19225348, --24750822, -29457570, -33496986, -36922760, -39977556, -43079060, -46364172, -49711024, -53141092, -56701620, --60179472, -63440960, -66724464, -70176544, -73627552, -77124192, -80998248, -85179400, -89241368, -93158912, --97144104, -100919920, -104110544, -106969920, -109786344, -112219440, -114109224, -116018344, -118209312, -120240296, --122128472, -124492312, -127278136, -129930816, -132675296, -135856256, -138673760, -140493216, -142199920, -144359760, --145933328, -146609776, -147791440, -149669408, -150676576, -150927296, -152078352, -153518768, -153616480, -153758752, --155404272, -155954560, -154248912, -154691840, -158040832, -157198480, -151757840, -152642608, -159947808, -156843616, --142624592, -142603648, -158689376, -148107648, -94958504, -63685776, -117763168, -214589984, -256608720, -227827072, --195774272, -188039040, -163344592, -115923312, -110401064, -177253840, -254218576, -275298816, -254263680, -239107808, --239403632, -237804288, -225745632, -194518000, -136255152, -81283328, -85342072, -150444112, -207728240, -209318448, --186659280, -185007328, -195300752, -193707856, -193329904, -199881872, -165390064, -59089624, 47498580, }, -}, -{ -{ --1443109, -2916283, 6827925, 4448513, -10190347, -35941896, -50278496, -21301964, 45321568, 90000504, 62208844, --10385231, -52024400, -33970508, 263604, 7722888, -259846, 5224291, 19049790, 17630840, 2166811, --5846524, -1266479, 181999, -9330280, -18641232, -16736414, -6763500, 2556579, 8128763, 10948409, -10774462, 6565932, -1125818, -10446971, -19356344, -26142930, -30390652, -33340758, -36155572, -38265476, --38332048, -36147520, -32708860, -29106456, -26172456, -24637544, -24765856, -25979184, -27272506, -27890980, --27470610, -25853018, -23069880, -19397146, -15212237, -10771241, -6171868, -1490891, 3144453, 7651484, -12047920, 16274705, 20060182, 23145042, 25582436, 27581744, 29147258, 30173756, 30836254, 31517544, -32333588, 33101850, 33842196, 34967476, 36871756, 39647380, 43362528, 48338248, 54939612, 63217088, -72916736, 83794808, 95823944, 109095392, 123496952, 138459552, 153138672, 166951280, 179796992, 191547488, -201411424, 208091696, 210612304, 208791248, 202888880, 193053408, 179311120, 162035696, 142256832, 121402080, -100614976, 80314280, 60539712, 41757284, 25057376, 11293617, 126165, -9823127, -19814294, -30041686, --39722004, -47958140, -54550380, -60103772, -65415572, -70796096, -75989784, -80636936, -84662936, -88305064, --91958472, -95962456, -100363720, -104873976, -109146928, -113031192, -116513872, -119557928, -122106456, -124112208, --125511832, -126300496, -126655904, -126842736, -126988224, -127060704, -126995200, -126714424, -126185064, -125603096, --125345936, -125597728, -126224256, -127060168, -128004520, -128815736, -129247376, -129471256, -129961416, -130892888, --132046088, -133215392, -134260672, -134826544, -134499056, -133149888, -130776920, -127238408, -122458104, -116582592, --109666088, -101599600, -92521112, -82809120, -72629504, -62070868, -51628192, -41856068, -32731946, -24047522, --16039555, -8904004, -2273648, 4118337, 10006737, 15390478, 20740398, 25972740, 30525406, 34676492, -39222180, 43891344, 47938276, 51878372, 56495464, 61012696, 64582348, 68081136, 72005664, 75044352, -77184856, 80520440, 84550192, 86223080, 86974696, 91581584, 97592392, 97656816, 95367600, 101955544, -112541032, 109671992, 100214472, 116350128, 158572880, 173721760, 126094336, 58961312, 38272452, 60790968, -74576736, 71284648, 88594440, 124262528, 123211336, 68228776, 16135118, 13064754, 31056908, 25668336, -5967857, 2714419, 8382166, 107911, -6194417, 21946746, 71502616, 93503584, 71871984, 41361072, -33930240, 42570644, 46276124, 41583872, 36570036, 33631204, 31004296, 29609504, 29946122, }, -{ -1443109, --2916283, -6827925, -4448513, 10190347, 35941896, 50278496, 21301964, -45321568, -90000504, -62208844, -10385231, 52024400, 33970508, -263604, -7722888, 259846, -5224291, -19049790, -17630840, -2166811, -5846524, 1266479, -181999, 9330280, 18641232, 16736414, 6763500, -2556579, -8128763, -10948409, --10774462, -6565932, 1125818, 10446971, 19356344, 26142930, 30390652, 33340758, 36155572, 38265476, -38332048, 36147520, 32708860, 29106456, 26172456, 24637544, 24765856, 25979184, 27272506, 27890980, -27470610, 25853018, 23069880, 19397146, 15212237, 10771241, 6171868, 1490891, -3144453, -7651484, --12047920, -16274705, -20060182, -23145042, -25582436, -27581744, -29147258, -30173756, -30836254, -31517544, --32333588, -33101850, -33842196, -34967476, -36871756, -39647380, -43362528, -48338248, -54939612, -63217088, --72916736, -83794808, -95823944, -109095392, -123496952, -138459552, -153138672, -166951280, -179796992, -191547488, --201411424, -208091696, -210612304, -208791248, -202888880, -193053408, -179311120, -162035696, -142256832, -121402080, --100614976, -80314280, -60539712, -41757284, -25057376, -11293617, -126165, 9823127, 19814294, 30041686, -39722004, 47958140, 54550380, 60103772, 65415572, 70796096, 75989784, 80636936, 84662936, 88305064, -91958472, 95962456, 100363720, 104873976, 109146928, 113031192, 116513872, 119557928, 122106456, 124112208, -125511832, 126300496, 126655904, 126842736, 126988224, 127060704, 126995200, 126714424, 126185064, 125603096, -125345936, 125597728, 126224256, 127060168, 128004520, 128815736, 129247376, 129471256, 129961416, 130892888, -132046088, 133215392, 134260672, 134826544, 134499056, 133149888, 130776920, 127238408, 122458104, 116582592, -109666088, 101599600, 92521112, 82809120, 72629504, 62070868, 51628192, 41856068, 32731946, 24047522, -16039555, 8904004, 2273648, -4118337, -10006737, -15390478, -20740398, -25972740, -30525406, -34676492, --39222180, -43891344, -47938276, -51878372, -56495464, -61012696, -64582348, -68081136, -72005664, -75044352, --77184856, -80520440, -84550192, -86223080, -86974696, -91581584, -97592392, -97656816, -95367600, -101955544, --112541032, -109671992, -100214472, -116350128, -158572880, -173721760, -126094336, -58961312, -38272452, -60790968, --74576736, -71284648, -88594440, -124262528, -123211336, -68228776, -16135118, -13064754, -31056908, -25668336, --5967857, -2714419, -8382166, -107911, 6194417, -21946746, -71502616, -93503584, -71871984, -41361072, --33930240, -42570644, -46276124, -41583872, -36570036, -33631204, -31004296, -29609504, -29946122, }, -}, -{ -{ --16855062, --9421548, 6735046, 14541149, -696858, -10459856, 31685584, 111822696, 141461184, 46983720, -137070128, --274288416, -233875472, -17981418, 207736288, 249013616, 80600432, -120410480, -170559600, -71937480, 34109020, -58366996, 33574832, 14930380, 994822, -26393648, -51163260, -50008452, -32954210, -25242060, -30743912, --35949412, -33978560, -26447872, -12712566, 8307541, 31826244, 51606180, 66345972, 77356120, 84789096, -89105000, 92007864, 94001264, 94112936, 92410520, 89962920, 86695528, 81840600, 75707392, 68811816, -60250876, 48849348, 34935800, 19663434, 3723737, -12246026, -27256400, -40934260, -53897008, -66593468, --78649440, -89627912, -99442992, -107755360, -113711408, -116477904, -115559320, -110695264, -101907760, -89489936, --73636144, -54377508, -32165010, -8080444, 16866874, 42273752, 67840616, 92708480, 115740240, 136301328, -154419104, 170198272, 183356448, 193434592, 200290976, 204173616, 205277424, 203442400, 198369504, 189873520, -177717696, 161489696, 141020416, 116809152, 89718648, 60403348, 29473140, -1858647, -31750008, -58535036, --81430432, -100451768, -115763328, -127038152, -133412960, -134269808, -130168648, -122766808, -113663088, -103536096, --92426088, -80411992, -67775656, -54875188, -42179264, -30258582, -19552302, -10249939, -2371359, 4298189, -10300405, 16173773, 21946210, 27116276, 31076772, 33417530, 34017752, 33116346, 31163746, 28391882, -24641302, 19670414, 13437879, 6062347, -2212445, -11009075, -20040854, -29295972, -38747584, -48046724, --56775708, -64774012, -71954120, -78098608, -83117280, -87159384, -90254440, -92231200, -93148712, -93386008, --93218504, -92764848, -92332136, -92295088, -92656400, -93204552, -93935768, -94896768, -95902328, -96840240, --97889280, -99085968, -100114616, -100798048, -101271032, -101534640, -101465384, -101275328, -101294120, -101381096, --101242040, -101033200, -100954280, -100668664, -99784440, -98339720, -96269008, -93179312, -89117888, -84647360, --79874040, -74464536, -68683504, -63166620, -57808648, -52207476, -46784004, -42070280, -37632504, -33078764, --29027536, -25747256, -22391812, -18797462, -15994995, -13892072, -11106249, -7990787, -6463389, -6082211, --4431870, -2181307, -2782602, -6077916, -7808251, -7052873, -8244190, -13497472, -18622442, -19725174, --18895708, -19746112, -20739324, -17023640, -8380018, -2305324, -6387690, -17554606, -23748484, -19843822, --15245523, -17352742, -15122043, 5159867, 31018790, 31144956, -3549254, -43825308, -55629492, -36705864, --11915850, -2823404, -9434433, -15443092, -8246874, 1931125, -11863237, -57452704, -101456256, }, -{ -16855062, -9421548, -6735046, -14541149, 696858, 10459856, -31685584, -111822696, -141461184, -46983720, 137070128, -274288416, 233875472, 17981418, -207736288, -249013616, -80600432, 120410480, 170559600, 71937480, -34109020, --58366996, -33574832, -14930380, -994822, 26393648, 51163260, 50008452, 32954210, 25242060, 30743912, -35949412, 33978560, 26447872, 12712566, -8307541, -31826244, -51606180, -66345972, -77356120, -84789096, --89105000, -92007864, -94001264, -94112936, -92410520, -89962920, -86695528, -81840600, -75707392, -68811816, --60250876, -48849348, -34935800, -19663434, -3723737, 12246026, 27256400, 40934260, 53897008, 66593468, -78649440, 89627912, 99442992, 107755360, 113711408, 116477904, 115559320, 110695264, 101907760, 89489936, -73636144, 54377508, 32165010, 8080444, -16866874, -42273752, -67840616, -92708480, -115740240, -136301328, --154419104, -170198272, -183356448, -193434592, -200290976, -204173616, -205277424, -203442400, -198369504, -189873520, --177717696, -161489696, -141020416, -116809152, -89718648, -60403348, -29473140, 1858647, 31750008, 58535036, -81430432, 100451768, 115763328, 127038152, 133412960, 134269808, 130168648, 122766808, 113663088, 103536096, -92426088, 80411992, 67775656, 54875188, 42179264, 30258582, 19552302, 10249939, 2371359, -4298189, --10300405, -16173773, -21946210, -27116276, -31076772, -33417530, -34017752, -33116346, -31163746, -28391882, --24641302, -19670414, -13437879, -6062347, 2212445, 11009075, 20040854, 29295972, 38747584, 48046724, -56775708, 64774012, 71954120, 78098608, 83117280, 87159384, 90254440, 92231200, 93148712, 93386008, -93218504, 92764848, 92332136, 92295088, 92656400, 93204552, 93935768, 94896768, 95902328, 96840240, -97889280, 99085968, 100114616, 100798048, 101271032, 101534640, 101465384, 101275328, 101294120, 101381096, -101242040, 101033200, 100954280, 100668664, 99784440, 98339720, 96269008, 93179312, 89117888, 84647360, -79874040, 74464536, 68683504, 63166620, 57808648, 52207476, 46784004, 42070280, 37632504, 33078764, -29027536, 25747256, 22391812, 18797462, 15994995, 13892072, 11106249, 7990787, 6463389, 6082211, -4431870, 2181307, 2782602, 6077916, 7808251, 7052873, 8244190, 13497472, 18622442, 19725174, -18895708, 19746112, 20739324, 17023640, 8380018, 2305324, 6387690, 17554606, 23748484, 19843822, -15245523, 17352742, 15122043, -5159867, -31018790, -31144956, 3549254, 43825308, 55629492, 36705864, -11915850, 2823404, 9434433, 15443092, 8246874, -1931125, 11863237, 57452704, 101456256, }, -}, -{ -{ --10470057, --12942884, -12745852, -5259188, 8346732, 21582210, 26531086, 16127065, -12313134, -48213692, -65599184, --43744780, 4936528, 39658656, 33028836, -708133, -27792734, -34398928, -30497490, -23885386, -10569915, -9479530, 25550224, 31105226, 32856500, 38252052, 42853036, 36798208, 18005040, -6361384, -27448062, --39666708, -41641856, -36514200, -30181808, -26812408, -26179974, -25506200, -22668300, -17521320, -11483132, --6290517, -2583423, 323196, 3242700, 6392522, 9896678, 13967771, 18304076, 22140556, 25072408, -27159762, 28331752, 28344636, 27087822, 24391120, 19908784, 13641353, 6088653, -2334852, -11470784, --20963198, -30399242, -39853540, -49548892, -59197536, -68443528, -77530064, -86653648, -95127624, -101969504, --106768592, -109260744, -108752328, -104731704, -97443144, -87307560, -74422656, -59063316, -41965588, -23700166, --4328254, 16065862, 36932424, 57482768, 77115600, 95685432, 113377472, 129973760, 144324864, 155117568, -162090992, 165811504, 166406368, 163296272, 156047440, 144834880, 130329712, 113758648, 96646968, 79828408, -63017372, 45769856, 28480466, 12293807, -1440962, -11697343, -18540300, -23277112, -27110370, -29834454, --30441118, -28513752, -24380382, -18583786, -11894912, -5140539, 1609002, 9041980, 17504676, 26640072, -36108864, 45703820, 54845660, 62985696, 70323648, 77253040, 83527448, 88758720, 93038656, 96317864, -98002560, 97827544, 96204048, 93308168, 88845160, 82897704, 75859856, 67580776, 57710400, 46616500, -34867620, 22393422, 9161165, -4181151, -17242684, -30352534, -43362528, -55311124, -65827352, -75440560, --84275312, -92010544, -99078456, -106269840, -113417200, -119903136, -125755032, -130954624, -134836208, -137331584, --139376528, -141256640, -142338976, -142835584, -143646784, -144416128, -144120304, -143218368, -142758272, -142301392, --141159472, -140213504, -140188272, -140127600, -139490880, -139126880, -138788640, -136974560, -134036264, -131654704, --129288176, -125414120, -121233504, -118497072, -115775672, -111627272, -108029168, -106125960, -103531264, -99802688, --97849016, -96995392, -93625992, -89979568, -90543816, -90746752, -84661320, -79976584, -84875536, -87457344, --75802952, -67523328, -81065896, -89801864, -57851600, -15802258, -34449932, -114977888, -175820928, -169301712, --139757168, -133547176, -123692376, -75457208, -27874874, -44988708, -118811680, -179056112, -183894928, -155834832, --134097472, -124879392, -101552888, -41813656, 33384780, 63154808, 9710384, -84638776, -133886480, -106619880, --56604984, -45735496, -70000984, -82993800, -66955320, -50478212, -64196876, -103361608, -136314752, }, -{ --10470057, --12942884, -12745852, -5259188, 8346732, 21582210, 26531086, 16127065, -12313134, -48213692, -65599184, --43744780, 4936528, 39658656, 33028836, -708133, -27792734, -34398928, -30497490, -23885386, -10569915, -9479530, 25550224, 31105226, 32856500, 38252052, 42853036, 36798208, 18005040, -6361384, -27448062, --39666708, -41641856, -36514200, -30181808, -26812408, -26179974, -25506200, -22668300, -17521320, -11483132, --6290517, -2583423, 323196, 3242700, 6392522, 9896678, 13967771, 18304076, 22140556, 25072408, -27159762, 28331752, 28344636, 27087822, 24391120, 19908784, 13641353, 6088653, -2334852, -11470784, --20963198, -30399242, -39853540, -49548892, -59197536, -68443528, -77530064, -86653648, -95127624, -101969504, --106768592, -109260744, -108752328, -104731704, -97443144, -87307560, -74422656, -59063316, -41965588, -23700166, --4328254, 16065862, 36932424, 57482768, 77115600, 95685432, 113377472, 129973760, 144324864, 155117568, -162090992, 165811504, 166406368, 163296272, 156047440, 144834880, 130329712, 113758648, 96646968, 79828408, -63017372, 45769856, 28480466, 12293807, -1440962, -11697343, -18540300, -23277112, -27110370, -29834454, --30441118, -28513752, -24380382, -18583786, -11894912, -5140539, 1609002, 9041980, 17504676, 26640072, -36108864, 45703820, 54845660, 62985696, 70323648, 77253040, 83527448, 88758720, 93038656, 96317864, -98002560, 97827544, 96204048, 93308168, 88845160, 82897704, 75859856, 67580776, 57710400, 46616500, -34867620, 22393422, 9161165, -4181151, -17242684, -30352534, -43362528, -55311124, -65827352, -75440560, --84275312, -92010544, -99078456, -106269840, -113417200, -119903136, -125755032, -130954624, -134836208, -137331584, --139376528, -141256640, -142338976, -142835584, -143646784, -144416128, -144120304, -143218368, -142758272, -142301392, --141159472, -140213504, -140188272, -140127600, -139490880, -139126880, -138788640, -136974560, -134036264, -131654704, --129288176, -125414120, -121233504, -118497072, -115775672, -111627272, -108029168, -106125960, -103531264, -99802688, --97849016, -96995392, -93625992, -89979568, -90543816, -90746752, -84661320, -79976584, -84875536, -87457344, --75802952, -67523328, -81065896, -89801864, -57851600, -15802258, -34449932, -114977888, -175820928, -169301712, --139757168, -133547176, -123692376, -75457208, -27874874, -44988708, -118811680, -179056112, -183894928, -155834832, --134097472, -124879392, -101552888, -41813656, 33384780, 63154808, 9710384, -84638776, -133886480, -106619880, --56604984, -45735496, -70000984, -82993800, -66955320, -50478212, -64196876, -103361608, -136314752, }, -}, -{ -{ --10983842, --13006235, -3929358, 17680232, 37721088, 46443092, 40728100, 10941429, -45254996, -94501088, -86430848, --14913200, 62980328, 84985056, 45491220, -10434086, -37785512, -24608016, 9770514, 33019172, 23539642, --11264625, -42012296, -46957416, -29937532, -7779797, 9924596, 23110682, 32777042, 39185672, 44401908, -49861348, 53220552, 51618528, 46033996, 39414916, 32559610, 24599962, 15992311, 8638253, 3759707, -1116155, -229781, -1309428, -3022046, -5972152, -10582263, -17145510, -25346750, -33986076, -41676216, --47652124, -51702280, -53836880, -54471460, -54538568, -54916524, -55923160, -57564372, -59957208, -63242856, --67312336, -71798432, -76145472, -79616344, -81476064, -81290312, -78923248, -74315280, -67587752, -59334972, --50400368, -41213968, -31722628, -22126060, -13195213, -5475010, 1385127, 7913477, 13701483, 17743584, -19851876, 20965882, 21868900, 22339736, 22064320, 21849572, 23214298, 26851598, 31973884, 37264212, -42150272, 47022376, 52471616, 58609660, 65099892, 71545568, 77639584, 83133920, 88036632, 92906048, -98628016, 105656736, 113549808, 121376312, 128510256, 134914592, 140710640, 145655232, 149133072, 150623424, -150069920, 147765136, 143911472, 138366128, 130764576, 120871656, 108866144, 95364384, 81130320, 66660576, -52002928, 36966248, 21507048, 5965710, -8986682, -22654342, -34726420, -45481556, -55559696, -65417720, --74898328, -83278880, -89790048, -94177360, -96808024, -98299992, -99149320, -99631968, -99754376, -99183680, --97453880, -94422712, -90353760, -85500984, -79889616, -73622184, -67088464, -60686816, -54556284, -48695264, --43115028, -37770480, -32540820, -27353036, -22235046, -17331266, -12957379, -9450002, -6832219, -4832912, --3287798, -2183454, -1323924, -408559, 513785, 1160178, 1595044, 2214056, 3241090, 4732517, -6899865, 9940165, 13769128, 18282066, 23430120, 28734404, 33386392, 37118716, 40237400, 42695732, -44135084, 44812616, 45314052, 45488000, 44896368, 43860208, 42726872, 40971840, 38429220, 36053568, -34061776, 31361314, 28194312, 26342646, 25353728, 22824530, 19765976, 19673634, 20761336, 17531520, -12257300, 13286481, 17734456, 11180337, -6809671, -14278082, 1575179, 21179020, 20340966, 6315750, -2094870, 6956237, 2289218, -9325985, -3779571, 22872312, 43185360, 38782480, 25930866, 26627186, -36120140, 37453188, 31576062, 30486214, 29011430, 7890929, -32850594, -64304788, -62836444, -39954472, --24018530, -21896818, -18189186, -8540542, -7630010, -15991774, -5650030, 39217348, 85677616, }, -{ --10983842, --13006235, -3929358, 17680232, 37721088, 46443092, 40728100, 10941429, -45254996, -94501088, -86430848, --14913200, 62980328, 84985056, 45491220, -10434086, -37785512, -24608016, 9770514, 33019172, 23539642, --11264625, -42012296, -46957416, -29937532, -7779797, 9924596, 23110682, 32777042, 39185672, 44401908, -49861348, 53220552, 51618528, 46033996, 39414916, 32559610, 24599962, 15992311, 8638253, 3759707, -1116155, -229781, -1309428, -3022046, -5972152, -10582263, -17145510, -25346750, -33986076, -41676216, --47652124, -51702280, -53836880, -54471460, -54538568, -54916524, -55923160, -57564372, -59957208, -63242856, --67312336, -71798432, -76145472, -79616344, -81476064, -81290312, -78923248, -74315280, -67587752, -59334972, --50400368, -41213968, -31722628, -22126060, -13195213, -5475010, 1385127, 7913477, 13701483, 17743584, -19851876, 20965882, 21868900, 22339736, 22064320, 21849572, 23214298, 26851598, 31973884, 37264212, -42150272, 47022376, 52471616, 58609660, 65099892, 71545568, 77639584, 83133920, 88036632, 92906048, -98628016, 105656736, 113549808, 121376312, 128510256, 134914592, 140710640, 145655232, 149133072, 150623424, -150069920, 147765136, 143911472, 138366128, 130764576, 120871656, 108866144, 95364384, 81130320, 66660576, -52002928, 36966248, 21507048, 5965710, -8986682, -22654342, -34726420, -45481556, -55559696, -65417720, --74898328, -83278880, -89790048, -94177360, -96808024, -98299992, -99149320, -99631968, -99754376, -99183680, --97453880, -94422712, -90353760, -85500984, -79889616, -73622184, -67088464, -60686816, -54556284, -48695264, --43115028, -37770480, -32540820, -27353036, -22235046, -17331266, -12957379, -9450002, -6832219, -4832912, --3287798, -2183454, -1323924, -408559, 513785, 1160178, 1595044, 2214056, 3241090, 4732517, -6899865, 9940165, 13769128, 18282066, 23430120, 28734404, 33386392, 37118716, 40237400, 42695732, -44135084, 44812616, 45314052, 45488000, 44896368, 43860208, 42726872, 40971840, 38429220, 36053568, -34061776, 31361314, 28194312, 26342646, 25353728, 22824530, 19765976, 19673634, 20761336, 17531520, -12257300, 13286481, 17734456, 11180337, -6809671, -14278082, 1575179, 21179020, 20340966, 6315750, -2094870, 6956237, 2289218, -9325985, -3779571, 22872312, 43185360, 38782480, 25930866, 26627186, -36120140, 37453188, 31576062, 30486214, 29011430, 7890929, -32850594, -64304788, -62836444, -39954472, --24018530, -21896818, -18189186, -8540542, -7630010, -15991774, -5650030, 39217348, 85677616, }, -}, -{ -{ -10324028, -2917894, -896574, -694711, -5630166, -7763691, 16464220, 60774860, 69673496, 7516, -103573136, --135416560, -49716392, 73525544, 113157352, 43390444, -47776680, -72686416, -36822904, -2836826, 1784022, -4785668, 31545998, 67513664, 85577224, 83043192, 75681080, 70517992, 60548840, 39773008, 10974178, --19559818, -46844136, -67238248, -79171280, -84281216, -85352808, -83596168, -79180408, -72855528, -65625488, --58138288, -51459076, -47203300, -46050104, -47078212, -48954036, -50823420, -51943872, -51584168, -49573588, --46244448, -41780904, -36245764, -30135102, -24321326, -19505594, -16079284, -14329622, -14419816, -16262357, --19583978, -24019068, -29147258, -34573948, -39960376, -44920528, -49046916, -52075404, -53814328, -53897008, --51870320, -47521664, -40890772, -32073206, -21276194, -8932458, 4456566, 18388902, 32183800, 45177152, -57294328, 68956776, 80292264, 90978144, 100936560, 110481592, 119705032, 128622456, 138112720, 149675856, -163716096, 178787136, 193075424, 206050512, 218157488, 229284688, 238077024, 242689280, 241976848, 235966576, -225290896, 210357840, 191294080, 168584976, 143340240, 116700168, 89182312, 60728152, 31309238, 1509144, --27413166, -54177792, -78366512, -100525856, -121310816, -140697216, -158071984, -172816592, -184749088, -194308080, --202391744, -209771568, -216545808, -222269920, -226527312, -229223472, -230488352, -230473312, -229108592, -225995808, --220735552, -213378800, -204309440, -193762080, -181724896, -168168912, -153010896, -136079056, -117541984, -98166848, --78799768, -59817620, -41325640, -23476292, -6266894, 10496363, 26674968, 41643468, 54920820, 66607964, -77071040, 86648280, 95760592, 104841760, 113982528, 122839288, 130839200, 137375072, 142081280, 145099024, -146820240, 147379648, 146776752, 145286928, 143180256, 140241424, 136197168, 131337952, 126123864, 120605904, -114806088, 109120624, 103819024, 98736464, 93811216, 89157080, 84482008, 79365088, 74079592, 69140920, -64355788, 59411208, 54780696, 50856172, 47135656, 43397424, 40339944, 38064148, 35719096, 33387466, -31977106, 30885110, 28834262, 26812944, 26247082, 25228638, 21756156, 18828062, 19435264, 19375134, -14382235, 10659035, 15308874, 19550154, 8751533, -11116986, -16849156, -1181116, 17405354, 23600308, -23253490, 24434606, 22022982, 13565654, 11261941, 23040888, 37060736, 39835820, 36630164, 39961988, -50042276, 60002840, 68639480, 74309376, 68069328, 48506288, 33592012, 40907416, 62417684, 74914432, -71076880, 64213520, 64415920, 66957468, 67494336, 74431248, 97751848, 132080984, 157776160, }, -{ -10324028, -2917894, -896574, -694711, -5630166, -7763691, 16464220, 60774860, 69673496, 7516, -103573136, --135416560, -49716392, 73525544, 113157352, 43390444, -47776680, -72686416, -36822904, -2836826, 1784022, -4785668, 31545998, 67513664, 85577224, 83043192, 75681080, 70517992, 60548840, 39773008, 10974178, --19559818, -46844136, -67238248, -79171280, -84281216, -85352808, -83596168, -79180408, -72855528, -65625488, --58138288, -51459076, -47203300, -46050104, -47078212, -48954036, -50823420, -51943872, -51584168, -49573588, --46244448, -41780904, -36245764, -30135102, -24321326, -19505594, -16079284, -14329622, -14419816, -16262357, --19583978, -24019068, -29147258, -34573948, -39960376, -44920528, -49046916, -52075404, -53814328, -53897008, --51870320, -47521664, -40890772, -32073206, -21276194, -8932458, 4456566, 18388902, 32183800, 45177152, -57294328, 68956776, 80292264, 90978144, 100936560, 110481592, 119705032, 128622456, 138112720, 149675856, -163716096, 178787136, 193075424, 206050512, 218157488, 229284688, 238077024, 242689280, 241976848, 235966576, -225290896, 210357840, 191294080, 168584976, 143340240, 116700168, 89182312, 60728152, 31309238, 1509144, --27413166, -54177792, -78366512, -100525856, -121310816, -140697216, -158071984, -172816592, -184749088, -194308080, --202391744, -209771568, -216545808, -222269920, -226527312, -229223472, -230488352, -230473312, -229108592, -225995808, --220735552, -213378800, -204309440, -193762080, -181724896, -168168912, -153010896, -136079056, -117541984, -98166848, --78799768, -59817620, -41325640, -23476292, -6266894, 10496363, 26674968, 41643468, 54920820, 66607964, -77071040, 86648280, 95760592, 104841760, 113982528, 122839288, 130839200, 137375072, 142081280, 145099024, -146820240, 147379648, 146776752, 145286928, 143180256, 140241424, 136197168, 131337952, 126123864, 120605904, -114806088, 109120624, 103819024, 98736464, 93811216, 89157080, 84482008, 79365088, 74079592, 69140920, -64355788, 59411208, 54780696, 50856172, 47135656, 43397424, 40339944, 38064148, 35719096, 33387466, -31977106, 30885110, 28834262, 26812944, 26247082, 25228638, 21756156, 18828062, 19435264, 19375134, -14382235, 10659035, 15308874, 19550154, 8751533, -11116986, -16849156, -1181116, 17405354, 23600308, -23253490, 24434606, 22022982, 13565654, 11261941, 23040888, 37060736, 39835820, 36630164, 39961988, -50042276, 60002840, 68639480, 74309376, 68069328, 48506288, 33592012, 40907416, 62417684, 74914432, -71076880, 64213520, 64415920, 66957468, 67494336, 74431248, 97751848, 132080984, 157776160, }, -}, -{ -{ --2374580, --1975685, -1382443, -914828, -1770600, -5363341, -9013526, -5036386, 7479149, 10615012, -15942919, --56564184, -57993868, 7053947, 85042496, 88171384, 2945811, -83288008, -83608520, -10362145, 53223236, -56314536, 20531554, -10377178, -20672214, -16948478, -3994320, 16381005, 36971080, 49690624, 53488984, -51806432, 47150152, 41786272, 38687456, 38138772, 36497020, 30347702, 19595252, 5913633, -9071508, --23396298, -34890168, -42566348, -46789912, -48198660, -47502340, -45899240, -44558676, -43887048, -43898324, --44784696, -46591268, -48833780, -50869056, -52300892, -52907556, -52671332, -51987356, -51447804, -51408612, --52043192, -53603876, -56228100, -59635620, -63368484, -67205504, -71101576, -74897784, -78367048, -81413256, --83995064, -85938000, -87039120, -87366616, -87256016, -86901144, -86133960, -84820776, -83342768, -82242184, --81369232, -79879952, -77301896, -74104288, -70828304, -67064304, -61832496, -54830088, -46868292, -39093328, --32087700, -25779468, -20059644, -15351824, -12449500, -11724724, -12670690, -14439680, -16755741, -20076288, --24864640, -30848602, -36961416, -41910292, -44918916, -46094124, -46125800, -45565308, -44384192, -42154032, --38555920, -33717104, -28170690, -22527640, -17147656, -12047383, -7031935, -1874216, 3546569, 9167071, -14823006, 20462834, 26199838, 32102734, 38029252, 43714716, 48913236, 53425636, 57149372, 60168732, -62699008, 64918968, 66953172, 68969656, 71169216, 73711840, 76739792, 80424336, 84902376, 90224376, -96379064, 103264976, 110630304, 118148104, 125512904, 132400416, 138475120, 143570016, 147709824, 150860192, -152853584, 153623456, 153249264, 151710592, 148889344, 144849920, 139821584, 133943384, 127320008, 120237072, -112997368, 105686264, 98361192, 91252488, 84576496, 78442744, 73074040, 68684040, 65085396, 61884036, -58992988, 56423524, 53806812, 50775104, 47516296, 44320840, 41041632, 37541236, 33990908, 30249454, -25816512, 20746840, 15533823, 10032507, 3857954, -2369748, -7787850, -12741557, -17762374, -22230750, --25899190, -29855392, -34100428, -37107444, -39562016, -44016436, -49089864, -50723564, -51017768, -55984900, --62226024, -60142964, -54548768, -61892088, -77720120, -72277856, -36496484, -5768141, -11269994, -33130304, --36767604, -31787052, -48571248, -72495288, -57268556, -2782065, 35726612, 27451820, 5108864, 6401112, -22469658, 29867740, 33055678, 42106248, 39908836, 9390946, -26454852, -28629716, 3511673, 33764884, -40212704, 35827544, 37678676, 43050604, 45202920, 52891448, 79491256, 120323512, 151594096, }, -{ --2374580, --1975685, -1382443, -914828, -1770600, -5363341, -9013526, -5036386, 7479149, 10615012, -15942919, --56564184, -57993868, 7053947, 85042496, 88171384, 2945811, -83288008, -83608520, -10362145, 53223236, -56314536, 20531554, -10377178, -20672214, -16948478, -3994320, 16381005, 36971080, 49690624, 53488984, -51806432, 47150152, 41786272, 38687456, 38138772, 36497020, 30347702, 19595252, 5913633, -9071508, --23396298, -34890168, -42566348, -46789912, -48198660, -47502340, -45899240, -44558676, -43887048, -43898324, --44784696, -46591268, -48833780, -50869056, -52300892, -52907556, -52671332, -51987356, -51447804, -51408612, --52043192, -53603876, -56228100, -59635620, -63368484, -67205504, -71101576, -74897784, -78367048, -81413256, --83995064, -85938000, -87039120, -87366616, -87256016, -86901144, -86133960, -84820776, -83342768, -82242184, --81369232, -79879952, -77301896, -74104288, -70828304, -67064304, -61832496, -54830088, -46868292, -39093328, --32087700, -25779468, -20059644, -15351824, -12449500, -11724724, -12670690, -14439680, -16755741, -20076288, --24864640, -30848602, -36961416, -41910292, -44918916, -46094124, -46125800, -45565308, -44384192, -42154032, --38555920, -33717104, -28170690, -22527640, -17147656, -12047383, -7031935, -1874216, 3546569, 9167071, -14823006, 20462834, 26199838, 32102734, 38029252, 43714716, 48913236, 53425636, 57149372, 60168732, -62699008, 64918968, 66953172, 68969656, 71169216, 73711840, 76739792, 80424336, 84902376, 90224376, -96379064, 103264976, 110630304, 118148104, 125512904, 132400416, 138475120, 143570016, 147709824, 150860192, -152853584, 153623456, 153249264, 151710592, 148889344, 144849920, 139821584, 133943384, 127320008, 120237072, -112997368, 105686264, 98361192, 91252488, 84576496, 78442744, 73074040, 68684040, 65085396, 61884036, -58992988, 56423524, 53806812, 50775104, 47516296, 44320840, 41041632, 37541236, 33990908, 30249454, -25816512, 20746840, 15533823, 10032507, 3857954, -2369748, -7787850, -12741557, -17762374, -22230750, --25899190, -29855392, -34100428, -37107444, -39562016, -44016436, -49089864, -50723564, -51017768, -55984900, --62226024, -60142964, -54548768, -61892088, -77720120, -72277856, -36496484, -5768141, -11269994, -33130304, --36767604, -31787052, -48571248, -72495288, -57268556, -2782065, 35726612, 27451820, 5108864, 6401112, -22469658, 29867740, 33055678, 42106248, 39908836, 9390946, -26454852, -28629716, 3511673, 33764884, -40212704, 35827544, 37678676, 43050604, 45202920, 52891448, 79491256, 120323512, 151594096, }, -}, -}; -const Word32 CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[16][BINAURAL_CHANNELS][240] ={ -{ -{ --94963336, --259899744, -365878592, -407935456, -399034688, -360622624, -313190080, -256787504, -171167872, -51148764, 77082848, -190087200, 280461376, 307977600, 197138464, -42101416, -233239808, -184613808, 66844724, 261040592, 200156752, --49803368, -281876544, -387830720, -404907520, -388901760, -342356672, -260487088, -167980464, -88047904, -17336636, -52413632, 115413288, 165056128, 205573776, 242155088, 273263552, 297519360, 317817920, 336046816, 351308992, -363975936, 375640512, 385805088, 393180096, 398694848, 403710272, 407503264, 409267424, 410109792, 410945152, -410935488, 409496672, 407403424, 405001472, 401672320, 397503520, 393377664, 389382816, 385003008, 380521760, -376547840, 372777920, 368674080, 364578848, 360973760, 357542080, 353929472, 350476320, 347467136, 344584704, -341609344, 338776288, 336161728, 333495616, 330667392, 327781152, 324807968, 321659232, 318333312, 314676160, -310469760, 305917632, 301435296, 296905728, 291875776, 286476992, 281314464, 276465984, 271412928, 265969072, -260564928, 255623568, 251213712, 247219392, 243490816, 239998480, 237063936, 235104368, 234008064, 233171632, -232267536, 231538464, 231289888, 231495520, 231909984, 232202576, 232065680, 231499280, 230856096, 230369696, -229821552, 228851424, 227326176, 225292512, 222869616, 220299072, 217801008, 215311008, 212592832, 209589568, -206436000, 203235168, 200035424, 196905456, 193827584, 190668096, 187384048, 184121488, 181036096, 178191744, -175648064, 173445808, 171507168, 169725296, 168109312, 166713456, 165531792, 164576160, 163917968, 163530880, -163231840, 162854416, 162346000, 161662032, 160738608, 159572528, 158192768, 156563904, 154628480, 152397248, -149915296, 147220208, 144376944, 141480512, 138593232, 135757472, 133036608, 130476272, 128080216, 125873144, -123902288, 122153704, 120579600, 119167624, 117866248, 116520856, 115040160, 113503104, 111976240, 110411800, -108827488, 107345728, 105978320, 104645264, 103426568, 102459664, 101669928, 100940320, 100377144, 100041064, -99700688, 99215896, 98755256, 98316632, 97593472, 96572336, 95553896, 94439352, 92886184, 91133304, -89595704, 87897040, 85607824, 83369608, 81698864, 79643728, 76585176, 73904040, 72387376, 70017632, -65605624, 62018792, 61284352, 59253904, 51306604, 41377716, 38103876, 42578696, 47088412, 45931456, -40431748, 33403034, 26739392, 25276420, 33993592, 48282412, 55147916, 48762376, 38468412, 36508832, -43465068, 51666844, 58545236, 68971808, 84820232, 98487360, 99587408, 85861768, 65221224, 47458852, -35827544, 27596776, 20706038, 16087337, 13238700, 8391292, 366683, -5357435, -3285113, }, -{ --94963336, --259899744, -365878592, -407935456, -399034688, -360622624, -313190080, -256787504, -171167872, -51148764, 77082848, -190087200, 280461376, 307977600, 197138464, -42101416, -233239808, -184613808, 66844724, 261040592, 200156752, --49803368, -281876544, -387830720, -404907520, -388901760, -342356672, -260487088, -167980464, -88047904, -17336636, -52413632, 115413288, 165056128, 205573776, 242155088, 273263552, 297519360, 317817920, 336046816, 351308992, -363975936, 375640512, 385805088, 393180096, 398694848, 403710272, 407503264, 409267424, 410109792, 410945152, -410935488, 409496672, 407403424, 405001472, 401672320, 397503520, 393377664, 389382816, 385003008, 380521760, -376547840, 372777920, 368674080, 364578848, 360973760, 357542080, 353929472, 350476320, 347467136, 344584704, -341609344, 338776288, 336161728, 333495616, 330667392, 327781152, 324807968, 321659232, 318333312, 314676160, -310469760, 305917632, 301435296, 296905728, 291875776, 286476992, 281314464, 276465984, 271412928, 265969072, -260564928, 255623568, 251213712, 247219392, 243490816, 239998480, 237063936, 235104368, 234008064, 233171632, -232267536, 231538464, 231289888, 231495520, 231909984, 232202576, 232065680, 231499280, 230856096, 230369696, -229821552, 228851424, 227326176, 225292512, 222869616, 220299072, 217801008, 215311008, 212592832, 209589568, -206436000, 203235168, 200035424, 196905456, 193827584, 190668096, 187384048, 184121488, 181036096, 178191744, -175648064, 173445808, 171507168, 169725296, 168109312, 166713456, 165531792, 164576160, 163917968, 163530880, -163231840, 162854416, 162346000, 161662032, 160738608, 159572528, 158192768, 156563904, 154628480, 152397248, -149915296, 147220208, 144376944, 141480512, 138593232, 135757472, 133036608, 130476272, 128080216, 125873144, -123902288, 122153704, 120579600, 119167624, 117866248, 116520856, 115040160, 113503104, 111976240, 110411800, -108827488, 107345728, 105978320, 104645264, 103426568, 102459664, 101669928, 100940320, 100377144, 100041064, -99700688, 99215896, 98755256, 98316632, 97593472, 96572336, 95553896, 94439352, 92886184, 91133304, -89595704, 87897040, 85607824, 83369608, 81698864, 79643728, 76585176, 73904040, 72387376, 70017632, -65605624, 62018792, 61284352, 59253904, 51306604, 41377716, 38103876, 42578696, 47088412, 45931456, -40431748, 33403034, 26739392, 25276420, 33993592, 48282412, 55147916, 48762376, 38468412, 36508832, -43465068, 51666844, 58545236, 68971808, 84820232, 98487360, 99587408, 85861768, 65221224, 47458852, -35827544, 27596776, 20706038, 16087337, 13238700, 8391292, 366683, -5357435, -3285113, }, -}, -{ -{ -75060456, -181290576, 166391328, 4222490, -246988544, -485340416, -637412352, -668590592, -562286912, -345107616, -95697776, -137160848, 373837696, 571850752, 535651136, 141639424, -359325568, -489517280, -90843392, 444124864, 613286976, -345293888, -38591892, -275234400, -372770944, -427594048, -446676608, -404071584, -331896832, -276191616, -232449536, --177023520, -115572200, -64596308, -20371030, 27089432, 74404936, 116204632, 156305136, 197281808, 234746272, -267057840, 297569824, 326030976, 349027296, 367687328, 385397632, 400829984, 411187808, 418360416, 425423488, -431585152, 435494112, 438640192, 441890944, 443526240, 442963072, 441746528, 439925440, 436022944, 430542016, -425219488, 419662880, 412594432, 404927904, 398160640, 391658592, 384455936, 377527616, 371925376, 366999584, -362234336, 358501472, 356285792, 354875424, 353917120, 353771072, 354289152, 354975840, 355882048, 356943456, -357440608, 357242496, 357187200, 357383680, 356850592, 355441280, 354234400, 353652448, 353077440, 352439104, -352331200, 352665664, 352851968, 352886848, 352854656, 352064384, 349902400, 346624256, 342358816, 336486528, -328759872, 319841920, 310215840, 299768864, 288650272, 277372736, 266137104, 255173136, 245376320, 237521888, -231328544, 226142384, 221828624, 218345392, 215404416, 213101776, 211880944, 211491168, 210960736, 209735072, -207901120, 205508272, 202684336, 200050448, 198051136, 196295568, 194327408, 192371584, 190693856, 189062320, -187366880, 185905504, 184712048, 183460608, 182183920, 181219696, 180506736, 179776064, 179172080, 178942832, -178924048, 178977728, 179375552, 180231328, 181216480, 182158688, 183190560, 184158000, 184690032, 184836608, -184854320, 184577824, 183745136, 182548464, 181182128, 179390048, 177025664, 174380512, 171548512, 168253728, -164523552, 160702112, 156747520, 152372560, 147711440, 143038512, 138227072, 133205192, 128355632, 123843768, -119330832, 114747032, 110418776, 106214008, 101653288, 96854200, 92291328, 87922816, 83602072, 79703320, -76371496, 73081552, 69701416, 66722316, 63989108, 60789356, 57319024, 54249196, 51235200, 47760036, -44398688, 41387380, 37823628, 33910916, 30954904, 28005872, 23077934, 18101140, 15947750, 13168370, -5380521, -1872069, -1912871, -4445828, -23741506, -48941688, -52257404, -31860604, -17410724, -24125906, --34259880, -38182796, -57206280, -101681200, -139482816, -137172128, -108657304, -93728536, -106906032, -132457864, --153244432, -164201968, -173872080, -205003616, -268345264, -323572640, -301992576, -192217504, -70960912, -19066970, --34032248, -56741888, -58976344, -64205468, -93292592, -128591856, -136745856, -103326176, -38155952, }, -{ --75060456, --181290576, -166391328, -4222490, 246988544, 485340416, 637412352, 668590592, 562286912, 345107616, 95697776, --137160848, -373837696, -571850752, -535651136, -141639424, 359325568, 489517280, 90843392, -444124864, -613286976, --345293888, 38591892, 275234400, 372770944, 427594048, 446676608, 404071584, 331896832, 276191616, 232449536, -177023520, 115572200, 64596308, 20371030, -27089432, -74404936, -116204632, -156305136, -197281808, -234746272, --267057840, -297569824, -326030976, -349027296, -367687328, -385397632, -400829984, -411187808, -418360416, -425423488, --431585152, -435494112, -438640192, -441890944, -443526240, -442963072, -441746528, -439925440, -436022944, -430542016, --425219488, -419662880, -412594432, -404927904, -398160640, -391658592, -384455936, -377527616, -371925376, -366999584, --362234336, -358501472, -356285792, -354875424, -353917120, -353771072, -354289152, -354975840, -355882048, -356943456, --357440608, -357242496, -357187200, -357383680, -356850592, -355441280, -354234400, -353652448, -353077440, -352439104, --352331200, -352665664, -352851968, -352886848, -352854656, -352064384, -349902400, -346624256, -342358816, -336486528, --328759872, -319841920, -310215840, -299768864, -288650272, -277372736, -266137104, -255173136, -245376320, -237521888, --231328544, -226142384, -221828624, -218345392, -215404416, -213101776, -211880944, -211491168, -210960736, -209735072, --207901120, -205508272, -202684336, -200050448, -198051136, -196295568, -194327408, -192371584, -190693856, -189062320, --187366880, -185905504, -184712048, -183460608, -182183920, -181219696, -180506736, -179776064, -179172080, -178942832, --178924048, -178977728, -179375552, -180231328, -181216480, -182158688, -183190560, -184158000, -184690032, -184836608, --184854320, -184577824, -183745136, -182548464, -181182128, -179390048, -177025664, -174380512, -171548512, -168253728, --164523552, -160702112, -156747520, -152372560, -147711440, -143038512, -138227072, -133205192, -128355632, -123843768, --119330832, -114747032, -110418776, -106214008, -101653288, -96854200, -92291328, -87922816, -83602072, -79703320, --76371496, -73081552, -69701416, -66722316, -63989108, -60789356, -57319024, -54249196, -51235200, -47760036, --44398688, -41387380, -37823628, -33910916, -30954904, -28005872, -23077934, -18101140, -15947750, -13168370, --5380521, 1872069, 1912871, 4445828, 23741506, 48941688, 52257404, 31860604, 17410724, 24125906, -34259880, 38182796, 57206280, 101681200, 139482816, 137172128, 108657304, 93728536, 106906032, 132457864, -153244432, 164201968, 173872080, 205003616, 268345264, 323572640, 301992576, 192217504, 70960912, 19066970, -34032248, 56741888, 58976344, 64205468, 93292592, 128591856, 136745856, 103326176, 38155952, }, -}, -{ -{ --9009231, --36637680, -70193728, -75922136, -36270460, 20501490, 50464256, 39287140, 6155225, -24621436, -40747964, --36815384, -10376104, 28257664, 50878184, 32616518, -14510010, -41502804, -12632573, 47379932, 74487080, -36009004, -36733244, -90490128, -105127376, -96395712, -82754896, -69029248, -55150600, -42622720, -31022548, --18132278, -4883915, 5132486, 10377178, 11759620, 10193031, 7223062, 6258841, 10063108, 18169860, -28565290, 40365176, 53441740, 67170064, 81056232, 95515240, 111126912, 127973920, 146063792, 165386304, -185295632, 204663248, 222767072, 239341344, 253865856, 265567488, 274117152, 279660896, 282155200, 281194208, -276510528, 268132128, 255947840, 239568976, 218812480, 194024608, 165772320, 134540384, 100960184, 66029752, -30862024, -3540664, -36068060, -65486976, -91001768, -112490560, -129825584, -142414672, -149966304, -153312608, --153736736, -151610736, -146457312, -138457936, -129109936, -119890256, -110741440, -100565048, -89078696, -77489264, --67181880, -58417460, -50668268, -43698608, -37853156, -33639796, -31494458, -31674310, -33990908, -37805376, --42507828, -47871704, -53913652, -60627760, -67760624, -74542376, -79847200, -83028160, -84393960, -84554488, --83609056, -81294064, -77459200, -72026064, -64901252, -56278568, -46660524, -36447628, -25920664, -15577310, --5956046, 2781528, 10603737, 17167522, 22128208, 25563108, 27681064, 28526636, 28289876, 27351426, -25821344, 23676544, 21408264, 19786914, 19047106, 18995030, 19587198, 20571820, 21073794, 20432234, -18941880, 17059610, 14637249, 11552388, 8166344, 4611721, 605590, -3702262, -7746511, -11465952, --15144055, -18547816, -21358872, -23982024, -26864484, -29727080, -32395328, -35358320, -38722352, -41896332, --44844828, -48186848, -51808044, -55009404, -57896160, -60905320, -63523640, -65251828, -66866200, -69036232, --71145056, -72943576, -75442712, -78984448, -82773144, -86984360, -92518968, -98582384, -103691248, -108415712, --113725368, -118238840, -120716496, -122672320, -125000728, -125737312, -124344672, -123203824, -122424824, -119594976, --115836880, -114016888, -111642304, -105648144, -100828112, -100789464, -97543000, -86452320, -79858472, -84221088, --81069656, -60564408, -50760608, -70058968, -75491032, -19363860, 59583544, 75100184, 18751290, -32347546, --37635188, -37250252, -54767276, -44564580, 21100638, 85975048, 85095112, 34751656, -3085934, -8105677, --8428873, -26249766, -52829708, -62334472, -32243930, 30965640, 78734800, 61895848, -5378373, -54467700, --45957760, -11283953, 3053185, -2666638, 354872, 17393006, 27977416, 21667574, 7367480, }, -{ --9009231, --36637680, -70193728, -75922136, -36270460, 20501490, 50464256, 39287140, 6155225, -24621436, -40747964, --36815384, -10376104, 28257664, 50878184, 32616518, -14510010, -41502804, -12632573, 47379932, 74487080, -36009004, -36733244, -90490128, -105127376, -96395712, -82754896, -69029248, -55150600, -42622720, -31022548, --18132278, -4883915, 5132486, 10377178, 11759620, 10193031, 7223062, 6258841, 10063108, 18169860, -28565290, 40365176, 53441740, 67170064, 81056232, 95515240, 111126912, 127973920, 146063792, 165386304, -185295632, 204663248, 222767072, 239341344, 253865856, 265567488, 274117152, 279660896, 282155200, 281194208, -276510528, 268132128, 255947840, 239568976, 218812480, 194024608, 165772320, 134540384, 100960184, 66029752, -30862024, -3540664, -36068060, -65486976, -91001768, -112490560, -129825584, -142414672, -149966304, -153312608, --153736736, -151610736, -146457312, -138457936, -129109936, -119890256, -110741440, -100565048, -89078696, -77489264, --67181880, -58417460, -50668268, -43698608, -37853156, -33639796, -31494458, -31674310, -33990908, -37805376, --42507828, -47871704, -53913652, -60627760, -67760624, -74542376, -79847200, -83028160, -84393960, -84554488, --83609056, -81294064, -77459200, -72026064, -64901252, -56278568, -46660524, -36447628, -25920664, -15577310, --5956046, 2781528, 10603737, 17167522, 22128208, 25563108, 27681064, 28526636, 28289876, 27351426, -25821344, 23676544, 21408264, 19786914, 19047106, 18995030, 19587198, 20571820, 21073794, 20432234, -18941880, 17059610, 14637249, 11552388, 8166344, 4611721, 605590, -3702262, -7746511, -11465952, --15144055, -18547816, -21358872, -23982024, -26864484, -29727080, -32395328, -35358320, -38722352, -41896332, --44844828, -48186848, -51808044, -55009404, -57896160, -60905320, -63523640, -65251828, -66866200, -69036232, --71145056, -72943576, -75442712, -78984448, -82773144, -86984360, -92518968, -98582384, -103691248, -108415712, --113725368, -118238840, -120716496, -122672320, -125000728, -125737312, -124344672, -123203824, -122424824, -119594976, --115836880, -114016888, -111642304, -105648144, -100828112, -100789464, -97543000, -86452320, -79858472, -84221088, --81069656, -60564408, -50760608, -70058968, -75491032, -19363860, 59583544, 75100184, 18751290, -32347546, --37635188, -37250252, -54767276, -44564580, 21100638, 85975048, 85095112, 34751656, -3085934, -8105677, --8428873, -26249766, -52829708, -62334472, -32243930, 30965640, 78734800, 61895848, -5378373, -54467700, --45957760, -11283953, 3053185, -2666638, 354872, 17393006, 27977416, 21667574, 7367480, }, -}, -{ -{ -3446175, --204011, -23846196, -52114596, -57095148, -29986388, 2611340, 5036923, -25295746, -55882892, -60017336, --39953932, -4871030, 43847856, 85644336, 72697152, -8475581, -85297512, -62989992, 54970212, 156982672, -148635392, 47907140, -62916440, -138422496, -189236800, -230008384, -253524944, -252534416, -234389792, -207569856, --171629584, -125080720, -71781248, -16589311, 37920268, 89157080, 134070624, 171440592, 201639056, 224939248, -242043424, 254667408, 263904272, 269539808, 271831712, 272078112, 270801984, 267182944, 260721696, 251943312, -241457152, 229871488, 218583232, 209222352, 202222624, 196823312, 192198176, 187797984, 183002112, 177325248, -170842528, 163924944, 156742144, 149337616, 141901424, 134577424, 127103648, 118936768, 109767552, 99714648, -88896696, 77050104, 63917168, 49879064, 35686884, 21620328, 7586523, -5926518, -17868138, -27814208, --36255428, -43333000, -48244832, -50476068, -50791748, -50297288, -49199924, -47218872, -44614508, -41934452, --39023000, -35104380, -29783450, -23331336, -15924665, -7117298, 3712999, 16642998, 31121334, 46524160, -62676456, 79761840, 97699232, 115731112, 132824008, 148484000, 162958576, 176581136, 189124592, 199893680, -208319328, 214461136, 219077152, 223164352, 227175312, 230635984, 232696496, 233028288, 232094656, 230754640, -229811344, 229692704, 230215072, 230740144, 230807792, 230511424, 230201664, 230107168, 230344464, 230907104, -231461696, 231452032, 230528608, 228649568, 225833680, 222136240, 217763424, 212854816, 207249888, 200751072, -193433520, 185503392, 177138944, 168663904, 160532448, 153006592, 146134112, 140022384, 134765872, 130244344, -126378336, 123361128, 121290416, 119954680, 119273392, 119402240, 120142584, 120883464, 121341952, 121644208, -121653872, 121032176, 119935888, 118821880, 117758880, 116659904, 115715008, 114868360, 113551416, 111552648, -109263432, 106677320, 103307384, 99273336, 95068024, 90331752, 84431000, 77818904, 71178880, 64132988, -56488484, 49333068, 43240656, 37349572, 31592168, 27217208, 24106578, 20869782, 17935246, 16546362, -15436112, 13311177, 12393128, 13733695, 13445932, 10598369, 11399380, 16712791, 16895864, 10786810, -13023415, 25579752, 25152940, 5520107, 5433134, 53553412, 109159280, 110144976, 64105608, 32104344, -31825170, 25709138, 6568616, 18708340, 73229192, 112479824, 93217432, 48184700, 27605902, 28006408, -18255222, -5207648, -29517162, -56871808, -84257056, -80665392, -27346594, 38667592, 62351652, 41161356, -20950850, 27518930, 39184596, 31987306, 19144816, 27559194, 53057340, 60521996, 27237608, }, -{ -3446175, --204011, -23846196, -52114596, -57095148, -29986388, 2611340, 5036923, -25295746, -55882892, -60017336, --39953932, -4871030, 43847856, 85644336, 72697152, -8475581, -85297512, -62989992, 54970212, 156982672, -148635392, 47907140, -62916440, -138422496, -189236800, -230008384, -253524944, -252534416, -234389792, -207569856, --171629584, -125080720, -71781248, -16589311, 37920268, 89157080, 134070624, 171440592, 201639056, 224939248, -242043424, 254667408, 263904272, 269539808, 271831712, 272078112, 270801984, 267182944, 260721696, 251943312, -241457152, 229871488, 218583232, 209222352, 202222624, 196823312, 192198176, 187797984, 183002112, 177325248, -170842528, 163924944, 156742144, 149337616, 141901424, 134577424, 127103648, 118936768, 109767552, 99714648, -88896696, 77050104, 63917168, 49879064, 35686884, 21620328, 7586523, -5926518, -17868138, -27814208, --36255428, -43333000, -48244832, -50476068, -50791748, -50297288, -49199924, -47218872, -44614508, -41934452, --39023000, -35104380, -29783450, -23331336, -15924665, -7117298, 3712999, 16642998, 31121334, 46524160, -62676456, 79761840, 97699232, 115731112, 132824008, 148484000, 162958576, 176581136, 189124592, 199893680, -208319328, 214461136, 219077152, 223164352, 227175312, 230635984, 232696496, 233028288, 232094656, 230754640, -229811344, 229692704, 230215072, 230740144, 230807792, 230511424, 230201664, 230107168, 230344464, 230907104, -231461696, 231452032, 230528608, 228649568, 225833680, 222136240, 217763424, 212854816, 207249888, 200751072, -193433520, 185503392, 177138944, 168663904, 160532448, 153006592, 146134112, 140022384, 134765872, 130244344, -126378336, 123361128, 121290416, 119954680, 119273392, 119402240, 120142584, 120883464, 121341952, 121644208, -121653872, 121032176, 119935888, 118821880, 117758880, 116659904, 115715008, 114868360, 113551416, 111552648, -109263432, 106677320, 103307384, 99273336, 95068024, 90331752, 84431000, 77818904, 71178880, 64132988, -56488484, 49333068, 43240656, 37349572, 31592168, 27217208, 24106578, 20869782, 17935246, 16546362, -15436112, 13311177, 12393128, 13733695, 13445932, 10598369, 11399380, 16712791, 16895864, 10786810, -13023415, 25579752, 25152940, 5520107, 5433134, 53553412, 109159280, 110144976, 64105608, 32104344, -31825170, 25709138, 6568616, 18708340, 73229192, 112479824, 93217432, 48184700, 27605902, 28006408, -18255222, -5207648, -29517162, -56871808, -84257056, -80665392, -27346594, 38667592, 62351652, 41161356, -20950850, 27518930, 39184596, 31987306, 19144816, 27559194, 53057340, 60521996, 27237608, }, -}, -{ -{ --2225330, --1968169, 6158983, 13817447, 11214160, 1439351, -3064459, -928250, -8775692, -40647572, -86008328, --111542984, -82070920, 9318468, 113516520, 141111680, 46847892, -94969776, -142930064, -40359272, 117732032, -193996688, 151521072, 55995100, -28795072, -94653560, -151199488, -189946544, -200638864, -190920960, -173208512, --149123952, -116706608, -79762376, -42197516, -2463164, 40505836, 82167016, 116783920, 142430784, 159909152, -170632064, 176767440, 180639344, 183267872, 184873648, 186086976, 187212800, 187352384, 185622576, 182334784, -178134848, 173134432, 167612704, 162464112, 158304448, 154957056, 152108416, 149671024, 147394144, 144867632, -141955648, 138645296, 134621984, 129568960, 123688080, 117348168, 110399448, 102380208, 93241592, 83318608, -72623064, 60706140, 47369732, 33063732, 18300856, 3044595, -12803298, -28537374, -42998528, -55863564, --67835784, -79229800, -89193048, -96977680, -103273024, -109301552, -114945672, -118789672, -119976688, -119090856, --117023904, -113776368, -108802256, -102050568, -94226752, -86180128, -78276312, -70336528, -62114892, -53812720, --46037216, -39275328, -33621004, -29006062, -25313464, -22121766, -18753974, -14859513, -10736344, -6897718, --3529926, -406948, 2980171, 7223062, 12537546, 18391586, 23873576, 28486908, 32414656, 36171140, -40293772, 45185204, 50880868, 57031796, 63330904, 69791072, 76509472, 83419000, 90373632, 97126392, -103161896, 107887432, 111051752, 112713360, 112941000, 111880136, 109895864, 107271104, 103991896, 100135016, -96173448, 92631704, 89830312, 88130584, 87942136, 89307400, 91908544, 95536176, 100127496, 105472048, -111369040, 117878600, 125004488, 132456792, 140041696, 147776400, 155345216, 162075952, 167646000, 172148736, -175450480, 177293024, 177915264, 177747760, 176772800, 174956560, 172788144, 170622400, 168202192, 165463616, -162873744, 160496480, 157845424, 154883504, 151892592, 148480240, 144195472, 139637984, 135422464, 130997040, -126027760, 121446640, 117606944, 113443512, 108729784, 104593192, 100958576, 96706560, 92480312, 89471688, -86388432, 82171312, 79161080, 78174848, 75229576, 69644504, 67556616, 69301448, 65283504, 55109264, -53410604, 61128660, 55084568, 31154082, 29526290, 77868296, 133987408, 135236704, 87899192, 51497732, -46257336, 40239012, 25975426, 39135744, 86180664, 117801824, 100321312, 61812632, 41196788, 36080408, -25941066, 7624641, -14322105, -36024040, -35353488, 14984604, 94637456, 136563312, 107327472, 51139640, -26530550, 33206002, 33858836, 17900350, 3644280, -3314104, -12925167, -20556250, -10763188, }, -{ -2225330, -1968169, -6158983, -13817447, -11214160, -1439351, 3064459, 928250, 8775692, 40647572, 86008328, -111542984, 82070920, -9318468, -113516520, -141111680, -46847892, 94969776, 142930064, 40359272, -117732032, --193996688, -151521072, -55995100, 28795072, 94653560, 151199488, 189946544, 200638864, 190920960, 173208512, -149123952, 116706608, 79762376, 42197516, 2463164, -40505836, -82167016, -116783920, -142430784, -159909152, --170632064, -176767440, -180639344, -183267872, -184873648, -186086976, -187212800, -187352384, -185622576, -182334784, --178134848, -173134432, -167612704, -162464112, -158304448, -154957056, -152108416, -149671024, -147394144, -144867632, --141955648, -138645296, -134621984, -129568960, -123688080, -117348168, -110399448, -102380208, -93241592, -83318608, --72623064, -60706140, -47369732, -33063732, -18300856, -3044595, 12803298, 28537374, 42998528, 55863564, -67835784, 79229800, 89193048, 96977680, 103273024, 109301552, 114945672, 118789672, 119976688, 119090856, -117023904, 113776368, 108802256, 102050568, 94226752, 86180128, 78276312, 70336528, 62114892, 53812720, -46037216, 39275328, 33621004, 29006062, 25313464, 22121766, 18753974, 14859513, 10736344, 6897718, -3529926, 406948, -2980171, -7223062, -12537546, -18391586, -23873576, -28486908, -32414656, -36171140, --40293772, -45185204, -50880868, -57031796, -63330904, -69791072, -76509472, -83419000, -90373632, -97126392, --103161896, -107887432, -111051752, -112713360, -112941000, -111880136, -109895864, -107271104, -103991896, -100135016, --96173448, -92631704, -89830312, -88130584, -87942136, -89307400, -91908544, -95536176, -100127496, -105472048, --111369040, -117878600, -125004488, -132456792, -140041696, -147776400, -155345216, -162075952, -167646000, -172148736, --175450480, -177293024, -177915264, -177747760, -176772800, -174956560, -172788144, -170622400, -168202192, -165463616, --162873744, -160496480, -157845424, -154883504, -151892592, -148480240, -144195472, -139637984, -135422464, -130997040, --126027760, -121446640, -117606944, -113443512, -108729784, -104593192, -100958576, -96706560, -92480312, -89471688, --86388432, -82171312, -79161080, -78174848, -75229576, -69644504, -67556616, -69301448, -65283504, -55109264, --53410604, -61128660, -55084568, -31154082, -29526290, -77868296, -133987408, -135236704, -87899192, -51497732, --46257336, -40239012, -25975426, -39135744, -86180664, -117801824, -100321312, -61812632, -41196788, -36080408, --25941066, -7624641, 14322105, 36024040, 35353488, -14984604, -94637456, -136563312, -107327472, -51139640, --26530550, -33206002, -33858836, -17900350, -3644280, 3314104, 12925167, 20556250, 10763188, }, -}, -{ -{ --11633456, --12715788, 12792560, 18263274, -12629351, -26460220, 21744882, 86905976, 80966040, -10594611, -106126496, --122959544, -57123600, 33699388, 87169048, 69767448, -4167192, -68813432, -56982940, 24143622, 93236224, -87987240, 31314606, -12676059, -17874580, -4080219, 9590662, 23705536, 38931732, 46676092, 41782516, -28186260, 10654203, -8883066, -27856622, -43992812, -58518928, -73033768, -85168128, -91186448, -90479928, --84697832, -75187696, -63605780, -52536040, -43498892, -35870492, -28498718, -20794084, -12163884, -2105608, -9038222, 20708184, 33236604, 47214040, 62171800, 76826224, 90194312, 101713416, 110697952, 116401128, -118458960, 116876264, 111651432, 102568112, 89337464, 71894528, 50494320, 25478820, -2820183, -33770256, --66238060, -98885176, -130422048, -159560176, -185192016, -206752208, -223980400, -236382656, -243613760, -246335696, --245776816, -242294672, -235259520, -224608000, -211570624, -197400992, -182159232, -165314368, -146910960, -127420408, --106850200, -84780504, -61219928, -36779952, -11969537, 13087839, 38044820, 61965640, 83914000, 103569376, -120941984, 135637744, 146652736, 152961504, 154441648, 152350000, 148595664, 144171312, 138459008, 130358696, -119826904, 108059768, 96567504, 86388432, 77755552, 70118024, 62765580, 55661704, 49382996, 44306344, -40295920, 37040336, 34111704, 30863634, 26847840, 22164178, 16979080, 11103564, 4450660, -2598992, --9654550, -16572668, -23050016, -28622736, -33212446, -37021008, -39973260, -41962904, -43382928, -44648332, --45602352, -46068892, -46399604, -46832860, -47065864, -46939160, -46704012, -46290084, -45317272, -43932148, --42582452, -41093712, -39066484, -36768140, -34521336, -31913218, -28693602, -25490630, -22720376, -19980188, --17258252, -15257871, -14019847, -12853227, -11799886, -11412802, -11355357, -11072963, -11185169, -12369506, --14022531, -15709917, -18303004, -22199076, -26546120, -31270046, -37242736, -43883292, -49666464, -54925116, --60749092, -66045860, -69426000, -72148472, -75399224, -77537584, -77686296, -77916072, -78711720, -77787224, --75630080, -75049720, -74414600, -70523360, -66937064, -67662376, -66614404, -58616640, -53277460, -57761940, --57564372, -41883448, -32214402, -46751256, -52820580, -8381092, 57775900, 70812736, 17866528, -34949760, --45163192, -43890272, -59213640, -58918900, -12106439, 44909252, 53140556, 9370545, -40288940, -64476048, --72780368, -89085136, -116870352, -126028832, -77658376, 20669530, 96355984, 82265264, 1233729, -57616448, --47462072, -8155069, 4672388, -8897562, -14241575, -753230, 12420509, 12272332, 4403415, }, -{ -11633456, -12715788, -12792560, -18263274, 12629351, 26460220, -21744882, -86905976, -80966040, 10594611, 106126496, -122959544, 57123600, -33699388, -87169048, -69767448, 4167192, 68813432, 56982940, -24143622, -93236224, --87987240, -31314606, 12676059, 17874580, 4080219, -9590662, -23705536, -38931732, -46676092, -41782516, --28186260, -10654203, 8883066, 27856622, 43992812, 58518928, 73033768, 85168128, 91186448, 90479928, -84697832, 75187696, 63605780, 52536040, 43498892, 35870492, 28498718, 20794084, 12163884, 2105608, --9038222, -20708184, -33236604, -47214040, -62171800, -76826224, -90194312, -101713416, -110697952, -116401128, --118458960, -116876264, -111651432, -102568112, -89337464, -71894528, -50494320, -25478820, 2820183, 33770256, -66238060, 98885176, 130422048, 159560176, 185192016, 206752208, 223980400, 236382656, 243613760, 246335696, -245776816, 242294672, 235259520, 224608000, 211570624, 197400992, 182159232, 165314368, 146910960, 127420408, -106850200, 84780504, 61219928, 36779952, 11969537, -13087839, -38044820, -61965640, -83914000, -103569376, --120941984, -135637744, -146652736, -152961504, -154441648, -152350000, -148595664, -144171312, -138459008, -130358696, --119826904, -108059768, -96567504, -86388432, -77755552, -70118024, -62765580, -55661704, -49382996, -44306344, --40295920, -37040336, -34111704, -30863634, -26847840, -22164178, -16979080, -11103564, -4450660, 2598992, -9654550, 16572668, 23050016, 28622736, 33212446, 37021008, 39973260, 41962904, 43382928, 44648332, -45602352, 46068892, 46399604, 46832860, 47065864, 46939160, 46704012, 46290084, 45317272, 43932148, -42582452, 41093712, 39066484, 36768140, 34521336, 31913218, 28693602, 25490630, 22720376, 19980188, -17258252, 15257871, 14019847, 12853227, 11799886, 11412802, 11355357, 11072963, 11185169, 12369506, -14022531, 15709917, 18303004, 22199076, 26546120, 31270046, 37242736, 43883292, 49666464, 54925116, -60749092, 66045860, 69426000, 72148472, 75399224, 77537584, 77686296, 77916072, 78711720, 77787224, -75630080, 75049720, 74414600, 70523360, 66937064, 67662376, 66614404, 58616640, 53277460, 57761940, -57564372, 41883448, 32214402, 46751256, 52820580, 8381092, -57775900, -70812736, -17866528, 34949760, -45163192, 43890272, 59213640, 58918900, 12106439, -44909252, -53140556, -9370545, 40288940, 64476048, -72780368, 89085136, 116870352, 126028832, 77658376, -20669530, -96355984, -82265264, -1233729, 57616448, -47462072, 8155069, -4672388, 8897562, 14241575, 753230, -12420509, -12272332, -4403415, }, -}, -{ -{ -1873680, --3342558, -19244674, -27656906, -22355304, -19368156, -24668682, -14368276, 35566088, 115204984, 187445792, -207972512, 133678712, -40381820, -220773136, -249746976, -72728288, 156203136, 219099168, 80410376, -88923000, --134445904, -75266080, -14714558, 11208254, 32719598, 56719876, 56432648, 28938952, 3604015, -2774012, --493921, 44023, 623844, 1908576, -689342, -7561827, -14534706, -20530480, -27339078, -34963720, --42800424, -51575040, -60615948, -67405216, -71713072, -75916768, -80622976, -84235584, -86635936, -89183384, --91638496, -92573192, -91874720, -90047208, -86417424, -80261128, -72179072, -62777928, -51649128, -38638600, --24369108, -8988293, 7864622, 25739202, 43609488, 61118460, 78132432, 93664648, 106606456, 116818816, -124399968, 128720168, 129075040, 125471560, 118142736, 107078904, 92366496, 74322800, 53285512, 29830158, -4844723, -21139292, -48130476, -75797584, -103187664, -129672576, -155294736, -179954832, -203204032, -224887168, --244870576, -262082128, -274927840, -282757568, -286034624, -285112800, -279649600, -269137696, -253551776, -233815328, --211990992, -190447984, -170416256, -151812592, -134632192, -119826904, -108681464, -101978632, -99884832, -101988296, --107322640, -114817360, -123800824, -133918152, -144834880, -156276688, -167954160, -179187104, -188990368, -196777152, --202669840, -207099024, -210479712, -213223648, -215589104, -217503056, -218880128, -219979632, -221099008, -222103504, --222602784, -222417024, -221578432, -220112784, -218076960, -215601984, -212652960, -208877680, -203807472, -197126656, --188761136, -178910080, -167981008, -156358816, -144291568, -132064872, -120104464, -108753944, -98115304, -88228832, --79218528, -71134856, -63835024, -57146152, -51018844, -45420352, -40235252, -35341676, -30671436, -26133802, --21595632, -16984448, -12326556, -7702487, -3257733, 802085, 4425964, 7874823, 11486890, 15340013, -19361712, 23628226, 28253906, 33103460, 37936372, 42713448, 47430396, 51872468, 55884504, 59576564, -62923956, 65588984, 67455680, 68768328, 69464120, 69151656, 67971616, 66530116, 64882996, 62704912, -60319596, 58182848, 55834036, 52952116, 50392316, 48293148, 45027900, 40353364, 36657008, 34141232, -29250874, 21852794, 17468706, 16530792, 10105521, -4660040, -14901926, -10554345, -1905892, -2388539, --5411659, -14496, 1378148, -20427938, -52753472, -61199524, -39141648, -15971373, -12524125, -18922552, --21503828, -20447266, -14762876, -2520609, -2463701, -38536596, -92413736, -110900888, -76509472, -31289374, --12119324, -5588826, 8677981, 18663244, 20618528, 49403400, 113965880, 143392848, 67788008, }, -{ -1873680, --3342558, -19244674, -27656906, -22355304, -19368156, -24668682, -14368276, 35566088, 115204984, 187445792, -207972512, 133678712, -40381820, -220773136, -249746976, -72728288, 156203136, 219099168, 80410376, -88923000, --134445904, -75266080, -14714558, 11208254, 32719598, 56719876, 56432648, 28938952, 3604015, -2774012, --493921, 44023, 623844, 1908576, -689342, -7561827, -14534706, -20530480, -27339078, -34963720, --42800424, -51575040, -60615948, -67405216, -71713072, -75916768, -80622976, -84235584, -86635936, -89183384, --91638496, -92573192, -91874720, -90047208, -86417424, -80261128, -72179072, -62777928, -51649128, -38638600, --24369108, -8988293, 7864622, 25739202, 43609488, 61118460, 78132432, 93664648, 106606456, 116818816, -124399968, 128720168, 129075040, 125471560, 118142736, 107078904, 92366496, 74322800, 53285512, 29830158, -4844723, -21139292, -48130476, -75797584, -103187664, -129672576, -155294736, -179954832, -203204032, -224887168, --244870576, -262082128, -274927840, -282757568, -286034624, -285112800, -279649600, -269137696, -253551776, -233815328, --211990992, -190447984, -170416256, -151812592, -134632192, -119826904, -108681464, -101978632, -99884832, -101988296, --107322640, -114817360, -123800824, -133918152, -144834880, -156276688, -167954160, -179187104, -188990368, -196777152, --202669840, -207099024, -210479712, -213223648, -215589104, -217503056, -218880128, -219979632, -221099008, -222103504, --222602784, -222417024, -221578432, -220112784, -218076960, -215601984, -212652960, -208877680, -203807472, -197126656, --188761136, -178910080, -167981008, -156358816, -144291568, -132064872, -120104464, -108753944, -98115304, -88228832, --79218528, -71134856, -63835024, -57146152, -51018844, -45420352, -40235252, -35341676, -30671436, -26133802, --21595632, -16984448, -12326556, -7702487, -3257733, 802085, 4425964, 7874823, 11486890, 15340013, -19361712, 23628226, 28253906, 33103460, 37936372, 42713448, 47430396, 51872468, 55884504, 59576564, -62923956, 65588984, 67455680, 68768328, 69464120, 69151656, 67971616, 66530116, 64882996, 62704912, -60319596, 58182848, 55834036, 52952116, 50392316, 48293148, 45027900, 40353364, 36657008, 34141232, -29250874, 21852794, 17468706, 16530792, 10105521, -4660040, -14901926, -10554345, -1905892, -2388539, --5411659, -14496, 1378148, -20427938, -52753472, -61199524, -39141648, -15971373, -12524125, -18922552, --21503828, -20447266, -14762876, -2520609, -2463701, -38536596, -92413736, -110900888, -76509472, -31289374, --12119324, -5588826, 8677981, 18663244, 20618528, 49403400, 113965880, 143392848, 67788008, }, -}, -{ -{ --19043884, --43914968, -38262252, -1210644, 55222544, 103580656, 104854648, 41815800, -48219060, -98342936, -79811232, --27014270, 11771968, 25251186, 27530204, 21311628, 423054, -23129472, -24757802, -1234803, 23149874, -29137058, 23870354, 23459648, 29103772, 30188252, 21255256, 5424544, -13989245, -35932232, -57081724, --71927816, -78420736, -79843440, -80427560, -81427752, -81558208, -78913048, -71798968, -59414432, -42890080, --25060598, -8555575, 5655398, 17808008, 28244778, 37237368, 45284524, 52852792, 59964184, 66443144, -72349800, 77808704, 82662552, 86696064, 89984400, 92640296, 94380832, 94751272, 93707056, 91681984, -89125400, 86281064, 83486648, 81406272, 80671832, 81307488, 82813952, 84937808, 88006568, 92246232, -97188128, 102227736, 107407472, 113055888, 118871808, 123967248, 127667368, 129718752, 129829344, 127503624, -122321744, 114165600, 103276248, 90096600, 74759272, 56898116, 36531920, 14866492, -6754910, -28671054, --52594560, -79236240, -107203992, -134600512, -160846528, -186407488, -211295216, -234419856, -254366224, -270582944, --283647168, -294197728, -301790720, -305295392, -304413856, -300247744, -294231040, -286901120, -277723328, -265717808, --250344512, -232193456, -212747440, -193219312, -173814112, -154246240, -134529648, -115035864, -96240016, -78633872, --62454732, -47388520, -32900524, -18815178, -5185100, 8209830, 21780852, 35743256, 50075024, 64490008, -78244640, 90542208, 101380016, 111477488, 121334440, 130941208, 140193632, 148746528, 155699536, 160357440, -163121792, 164887008, 165994048, 166473472, 166606608, 166391328, 165169952, 162598336, 159321808, 156156960, -153387776, 151220432, 149974896, 149471312, 149054160, 148359984, 147387712, 146072368, 144525120, 143221584, -142293344, 141271680, 139971376, 138650128, 137006768, 134275712, 130547680, 126651072, 122752848, 118513184, -114306800, 110740360, 107516992, 104217384, 101331704, 99189048, 97191352, 95255936, 94279360, 94262184, -94076960, 93668408, 93980864, 94576256, 94197760, 93305480, 92939872, 92204360, 90170688, 88225072, -87094960, 84780504, 80922016, 78442208, 77275048, 73243152, 66924716, 64326800, 64422360, 58594628, -48184164, 46018964, 51507396, 44683768, 20112794, 5031554, 21172578, 47353624, 48104708, 25314538, -9361418, 7545184, -2579665, -27305792, -39609800, -20830592, 7098507, 10118406, -13167296, -34975528, --39409008, -40161164, -53462680, -68065568, -55893092, -10875931, 35991824, 48624936, 26519812, 2823941, -3407520, 19760070, 26929982, 18486612, 13001940, 26946088, 50138912, 54092428, 23716272, }, -{ --19043884, --43914968, -38262252, -1210644, 55222544, 103580656, 104854648, 41815800, -48219060, -98342936, -79811232, --27014270, 11771968, 25251186, 27530204, 21311628, 423054, -23129472, -24757802, -1234803, 23149874, -29137058, 23870354, 23459648, 29103772, 30188252, 21255256, 5424544, -13989245, -35932232, -57081724, --71927816, -78420736, -79843440, -80427560, -81427752, -81558208, -78913048, -71798968, -59414432, -42890080, --25060598, -8555575, 5655398, 17808008, 28244778, 37237368, 45284524, 52852792, 59964184, 66443144, -72349800, 77808704, 82662552, 86696064, 89984400, 92640296, 94380832, 94751272, 93707056, 91681984, -89125400, 86281064, 83486648, 81406272, 80671832, 81307488, 82813952, 84937808, 88006568, 92246232, -97188128, 102227736, 107407472, 113055888, 118871808, 123967248, 127667368, 129718752, 129829344, 127503624, -122321744, 114165600, 103276248, 90096600, 74759272, 56898116, 36531920, 14866492, -6754910, -28671054, --52594560, -79236240, -107203992, -134600512, -160846528, -186407488, -211295216, -234419856, -254366224, -270582944, --283647168, -294197728, -301790720, -305295392, -304413856, -300247744, -294231040, -286901120, -277723328, -265717808, --250344512, -232193456, -212747440, -193219312, -173814112, -154246240, -134529648, -115035864, -96240016, -78633872, --62454732, -47388520, -32900524, -18815178, -5185100, 8209830, 21780852, 35743256, 50075024, 64490008, -78244640, 90542208, 101380016, 111477488, 121334440, 130941208, 140193632, 148746528, 155699536, 160357440, -163121792, 164887008, 165994048, 166473472, 166606608, 166391328, 165169952, 162598336, 159321808, 156156960, -153387776, 151220432, 149974896, 149471312, 149054160, 148359984, 147387712, 146072368, 144525120, 143221584, -142293344, 141271680, 139971376, 138650128, 137006768, 134275712, 130547680, 126651072, 122752848, 118513184, -114306800, 110740360, 107516992, 104217384, 101331704, 99189048, 97191352, 95255936, 94279360, 94262184, -94076960, 93668408, 93980864, 94576256, 94197760, 93305480, 92939872, 92204360, 90170688, 88225072, -87094960, 84780504, 80922016, 78442208, 77275048, 73243152, 66924716, 64326800, 64422360, 58594628, -48184164, 46018964, 51507396, 44683768, 20112794, 5031554, 21172578, 47353624, 48104708, 25314538, -9361418, 7545184, -2579665, -27305792, -39609800, -20830592, 7098507, 10118406, -13167296, -34975528, --39409008, -40161164, -53462680, -68065568, -55893092, -10875931, 35991824, 48624936, 26519812, 2823941, -3407520, 19760070, 26929982, 18486612, 13001940, 26946088, 50138912, 54092428, 23716272, }, -}, -{ -{ -22912576, -33083060, -15137612, -77247672, -120297736, -152744064, -162527472, -98063768, 53420804, 225633424, 342901600, -368999968, 262932528, -8273181, -334095840, -445709152, -187704032, 234369392, 430890432, 258872176, -54666880, --231026288, -234318928, -195415648, -183787552, -168180720, -128274568, -89106072, -61837328, -28456306, 16117939, -55568824, 82885888, 105637408, 125082872, 134603744, 133938552, 127843456, 116640040, 99855304, 82162184, -67347768, 53308596, 38053948, 23500988, 10541997, -2518462, -15147813, -24635932, -31176094, -37507412, --44420164, -51113868, -58128624, -66110284, -73897056, -80638544, -87209848, -93788128, -99032280, -102709312, --106020192, -108920904, -110194904, -109961904, -109219408, -107584096, -104145440, -99537480, -94908576, -90141160, --84906672, -79914312, -75686448, -71660456, -67447632, -63418412, -59664076, -55971476, -52758304, -50490024, --48571248, -46197204, -43537008, -40852120, -37523520, -33078764, -28085328, -23219666, -18641232, -14722611, --12118787, -10951093, -11154567, -13344463, -17927194, -23760296, -29066192, -33188822, -36287640, -37961068, --37246492, -33403034, -26076894, -15426449, -2415919, 11868605, 27242440, 43924632, 61286500, 78111496, -93715112, 107930384, 120553824, 131646656, 141690432, 150730800, 158116000, 163587792, 167816720, 171597904, -175348480, 179357840, 183519664, 186957248, 188903936, 189707632, 190191888, 190584336, 190813584, 191065920, -191285488, 190901088, 189672192, 188022400, 186193280, 183966336, 181352304, 178589040, 175419888, 171292960, -166147056, 160202816, 153353424, 145516720, 137107168, 128511328, 119673896, 110619568, 101676912, 92926984, -84211960, 75754632, 67987184, 60909080, 54394688, 48741972, 44157096, 40261024, 36796060, 34086472, -32245004, 30837328, 29772176, 29517700, 30151208, 31197568, 32465658, 34006476, 35463008, 36461588, -37243272, 38035692, 38538740, 38768524, 39375724, 40481676, 41403484, 41928544, 42491724, 42966316, -42817064, 42306500, 42020888, 41728292, 41157060, 40897752, 41180148, 41191956, 40722732, 40543956, -40480068, 39620000, 38581692, 38432976, 38014220, 36214628, 35186520, 36433672, 36713916, 34064460, -33306398, 37192268, 38308960, 31653908, 28657632, 42315092, 62512176, 65438660, 47303696, 29169808, -25497610, 26946624, 20507396, 9653476, 5276904, 8847096, 13584982, 14318347, 9484898, -607201, --13053479, -25279104, -41357852, -68102616, -99225016, -110134232, -80648208, -24404004, 17795660, 24222542, -19369228, 35908076, 62372052, 65007552, 59028420, 102312560, 191254352, 219296736, 99885904, }, -{ -22912576, -33083060, -15137612, -77247672, -120297736, -152744064, -162527472, -98063768, 53420804, 225633424, 342901600, -368999968, 262932528, -8273181, -334095840, -445709152, -187704032, 234369392, 430890432, 258872176, -54666880, --231026288, -234318928, -195415648, -183787552, -168180720, -128274568, -89106072, -61837328, -28456306, 16117939, -55568824, 82885888, 105637408, 125082872, 134603744, 133938552, 127843456, 116640040, 99855304, 82162184, -67347768, 53308596, 38053948, 23500988, 10541997, -2518462, -15147813, -24635932, -31176094, -37507412, --44420164, -51113868, -58128624, -66110284, -73897056, -80638544, -87209848, -93788128, -99032280, -102709312, --106020192, -108920904, -110194904, -109961904, -109219408, -107584096, -104145440, -99537480, -94908576, -90141160, --84906672, -79914312, -75686448, -71660456, -67447632, -63418412, -59664076, -55971476, -52758304, -50490024, --48571248, -46197204, -43537008, -40852120, -37523520, -33078764, -28085328, -23219666, -18641232, -14722611, --12118787, -10951093, -11154567, -13344463, -17927194, -23760296, -29066192, -33188822, -36287640, -37961068, --37246492, -33403034, -26076894, -15426449, -2415919, 11868605, 27242440, 43924632, 61286500, 78111496, -93715112, 107930384, 120553824, 131646656, 141690432, 150730800, 158116000, 163587792, 167816720, 171597904, -175348480, 179357840, 183519664, 186957248, 188903936, 189707632, 190191888, 190584336, 190813584, 191065920, -191285488, 190901088, 189672192, 188022400, 186193280, 183966336, 181352304, 178589040, 175419888, 171292960, -166147056, 160202816, 153353424, 145516720, 137107168, 128511328, 119673896, 110619568, 101676912, 92926984, -84211960, 75754632, 67987184, 60909080, 54394688, 48741972, 44157096, 40261024, 36796060, 34086472, -32245004, 30837328, 29772176, 29517700, 30151208, 31197568, 32465658, 34006476, 35463008, 36461588, -37243272, 38035692, 38538740, 38768524, 39375724, 40481676, 41403484, 41928544, 42491724, 42966316, -42817064, 42306500, 42020888, 41728292, 41157060, 40897752, 41180148, 41191956, 40722732, 40543956, -40480068, 39620000, 38581692, 38432976, 38014220, 36214628, 35186520, 36433672, 36713916, 34064460, -33306398, 37192268, 38308960, 31653908, 28657632, 42315092, 62512176, 65438660, 47303696, 29169808, -25497610, 26946624, 20507396, 9653476, 5276904, 8847096, 13584982, 14318347, 9484898, -607201, --13053479, -25279104, -41357852, -68102616, -99225016, -110134232, -80648208, -24404004, 17795660, 24222542, -19369228, 35908076, 62372052, 65007552, 59028420, 102312560, 191254352, 219296736, 99885904, }, -}, -{ -{ -2811593, -11651709, 24683714, 38550552, 49903224, 43626132, -1712618, -78012712, -148158112, -194630208, -212185872, --141817680, 80555872, 349895968, 395538560, 95827696, -293273792, -390015776, -136008192, 164994384, 247096448, -150730272, 59409060, 36841156, 23941758, -11520176, -40115532, -45217952, -44843752, -48241608, -44198436, --29087130, -13136157, -2078764, 6528887, 13400835, 17460652, 20465520, 23479512, 24280524, 22565222, -21513492, 21992380, 21405580, 19192062, 17724256, 17702244, 17687212, 17659832, 18847390, 20900384, -22446036, 23242216, 23521926, 22731114, 20545512, 17583060, 14187351, 10077604, 5511517, 1179505, --3005403, -7570954, -12317966, -16756815, -21050708, -25465934, -29654602, -33335388, -36824512, -40335648, --43652972, -46806552, -50156628, -53645752, -56791816, -59336584, -61207580, -62139048, -61984432, -60968136, --59076740, -55733644, -50593640, -44098576, -36854040, -28940564, -20136954, -10415296, -74088, 10281078, -19926500, 28428388, 35715336, 41639172, 45858976, 48331268, 49465676, 49610632, 48818208, 47272020, -45551348, 44269840, 43650828, 43487616, 43418900, 43353400, 43700756, 45009648, 47382080, 50449760, -53869092, 57584236, 61721900, 66486632, 72013720, 78093776, 84218400, 90076200, 95814280, 101782136, -108258408, 115370336, 122938608, 130462856, 137564048, 144328624, 150999232, 157586112, 163950176, 169920720, -175151456, 179257440, 182218816, 184320128, 185714384, 186431648, 186631904, 186397280, 185502864, 183816016, -181655104, 179429232, 177305376, 175456928, 174135152, 173290656, 172604528, 171951696, 171356848, 170666960, -169782208, 168940384, 168295072, 167642240, 166908336, 166301664, 165705200, 164677632, 163193184, 161554656, -159646624, 157208144, 154559232, 152100368, 149600688, 146894864, 144484304, 142610624, 140772928, 138825152, -137261792, 135995840, 134363216, 132420288, 130557880, 128245576, 125015224, 121768768, 119185344, 116360864, -112885696, 110000016, 107964200, 105277168, 101876088, 99383936, 97464616, 94458680, 91321744, 89620400, -87426744, 83417928, 81007912, 81163072, 78259136, 71723272, 70384312, 74463456, 70391296, 57915488, -57659400, 70776232, 65012384, 34982508, 36167920, 104857328, 179518896, 172511664, 96391952, 39862664, -33528126, 29611652, 13415330, 34887484, 105161736, 152656016, 124219048, 59104120, 20142860, 10727218, --97711, -22026202, -49624588, -78276312, -84543208, -37925636, 40091372, 78421272, 47701516, 60666, --12510166, -6209449, -15641197, -32628866, -43815108, -75613440, -136878992, -159193504, -73527696, }, -{ --2811593, --11651709, -24683714, -38550552, -49903224, -43626132, 1712618, 78012712, 148158112, 194630208, 212185872, -141817680, -80555872, -349895968, -395538560, -95827696, 293273792, 390015776, 136008192, -164994384, -247096448, --150730272, -59409060, -36841156, -23941758, 11520176, 40115532, 45217952, 44843752, 48241608, 44198436, -29087130, 13136157, 2078764, -6528887, -13400835, -17460652, -20465520, -23479512, -24280524, -22565222, --21513492, -21992380, -21405580, -19192062, -17724256, -17702244, -17687212, -17659832, -18847390, -20900384, --22446036, -23242216, -23521926, -22731114, -20545512, -17583060, -14187351, -10077604, -5511517, -1179505, -3005403, 7570954, 12317966, 16756815, 21050708, 25465934, 29654602, 33335388, 36824512, 40335648, -43652972, 46806552, 50156628, 53645752, 56791816, 59336584, 61207580, 62139048, 61984432, 60968136, -59076740, 55733644, 50593640, 44098576, 36854040, 28940564, 20136954, 10415296, 74088, -10281078, --19926500, -28428388, -35715336, -41639172, -45858976, -48331268, -49465676, -49610632, -48818208, -47272020, --45551348, -44269840, -43650828, -43487616, -43418900, -43353400, -43700756, -45009648, -47382080, -50449760, --53869092, -57584236, -61721900, -66486632, -72013720, -78093776, -84218400, -90076200, -95814280, -101782136, --108258408, -115370336, -122938608, -130462856, -137564048, -144328624, -150999232, -157586112, -163950176, -169920720, --175151456, -179257440, -182218816, -184320128, -185714384, -186431648, -186631904, -186397280, -185502864, -183816016, --181655104, -179429232, -177305376, -175456928, -174135152, -173290656, -172604528, -171951696, -171356848, -170666960, --169782208, -168940384, -168295072, -167642240, -166908336, -166301664, -165705200, -164677632, -163193184, -161554656, --159646624, -157208144, -154559232, -152100368, -149600688, -146894864, -144484304, -142610624, -140772928, -138825152, --137261792, -135995840, -134363216, -132420288, -130557880, -128245576, -125015224, -121768768, -119185344, -116360864, --112885696, -110000016, -107964200, -105277168, -101876088, -99383936, -97464616, -94458680, -91321744, -89620400, --87426744, -83417928, -81007912, -81163072, -78259136, -71723272, -70384312, -74463456, -70391296, -57915488, --57659400, -70776232, -65012384, -34982508, -36167920, -104857328, -179518896, -172511664, -96391952, -39862664, --33528126, -29611652, -13415330, -34887484, -105161736, -152656016, -124219048, -59104120, -20142860, -10727218, -97711, 22026202, 49624588, 78276312, 84543208, 37925636, -40091372, -78421272, -47701516, -60666, -12510166, 6209449, 15641197, 32628866, 43815108, 75613440, 136878992, 159193504, 73527696, }, -}, -{ -{ -1766305, -2392834, -2967823, -13154948, -21828098, -13592498, 23732916, 69370168, 72411536, 11843372, -60894584, --74438224, -25907780, 20711942, 23179938, 5403069, 3657165, 11682311, 4756140, -13142600, -18874770, --10082436, -5405753, -11533598, -15028091, -6480569, 6342056, 12303471, 10251013, 4749160, -2111513, --10241350, -18179522, -23642184, -25355876, -23281408, -18531710, -13084081, -8157217, -3108483, 3117610, -10074383, 16234440, 20606180, 23109608, 24038396, 24024974, 24174224, 25506738, 28323698, 32306744, -36983964, 41889888, 46537044, 50538344, 53766548, 56298968, 58215060, 59515900, 60221348, 60425896, -60163900, 59333900, 57909580, 56159380, 54442468, 52864068, 51385524, 50192600, 49603116, 49638548, -50051940, 50826644, 52286396, 54623396, 57640072, 61087320, 64938832, 69148976, 73336032, 76918032, -79475152, 80860272, 80984296, 79532592, 75905496, 69521560, 60245508, 48402132, 34217468, 17394080, --2496987, -25216290, -49676664, -74593920, -99082752, -122543472, -144185808, -162914016, -177765472, -188473904, --195543952, -199672496, -201060848, -199500160, -195243312, -189557840, -184086064, -179620368, -175639472, -171028816, --165171552, -158431136, -151753536, -145830240, -140600592, -135516416, -130188512, -124697400, -119384520, -114528528, --110164304, -106021808, -101652216, -96741992, -91300264, -85496152, -79429512, -73136312, -66677220, -60127396, --53596360, -47292420, -41414224, -35956928, -30760018, -25701084, -20750060, -15941845, -11440182, -7451232, --3917547, -482647, 3153043, 7072738, 11359115, 16073378, 20965882, 25650618, 30160870, 34941708, -40317396, 46365784, 53226992, 61034708, 69603168, 78600048, 87877176, 97303024, 106561896, 115417048, -123827664, 131587064, 138292576, 143794976, 148143616, 151136672, 152569056, 152790784, 152322624, 151187680, -149328496, 147177248, 145073792, 142777600, 140200624, 137736912, 135370384, 132611944, 129665064, 127228744, -125030792, 122277184, 119323856, 116903640, 114341696, 110789216, 107069240, 103905456, 100271384, 95927024, -92563528, 89972048, 85635208, 80475336, 78287592, 77118824, 71010840, 62952948, 62019328, 64006824, -55034636, 40962176, 44935020, 61018600, 45531484, -16530255, -70942120, -62221728, -13724031, 11134166, -4073777, 5789616, 18125298, -3304441, -61377768, -95043328, -70010648, -29961154, -23776402, -35720168, --28427314, -8661338, -1998770, 2596845, 29952566, 61971548, 55981676, 12006581, -23720030, -23033372, --5655398, 145492, -6174553, -10863046, -10317585, -8673686, -6595996, -3351148, -774168, }, -{ --1766305, --2392834, 2967823, 13154948, 21828098, 13592498, -23732916, -69370168, -72411536, -11843372, 60894584, -74438224, 25907780, -20711942, -23179938, -5403069, -3657165, -11682311, -4756140, 13142600, 18874770, -10082436, 5405753, 11533598, 15028091, 6480569, -6342056, -12303471, -10251013, -4749160, 2111513, -10241350, 18179522, 23642184, 25355876, 23281408, 18531710, 13084081, 8157217, 3108483, -3117610, --10074383, -16234440, -20606180, -23109608, -24038396, -24024974, -24174224, -25506738, -28323698, -32306744, --36983964, -41889888, -46537044, -50538344, -53766548, -56298968, -58215060, -59515900, -60221348, -60425896, --60163900, -59333900, -57909580, -56159380, -54442468, -52864068, -51385524, -50192600, -49603116, -49638548, --50051940, -50826644, -52286396, -54623396, -57640072, -61087320, -64938832, -69148976, -73336032, -76918032, --79475152, -80860272, -80984296, -79532592, -75905496, -69521560, -60245508, -48402132, -34217468, -17394080, -2496987, 25216290, 49676664, 74593920, 99082752, 122543472, 144185808, 162914016, 177765472, 188473904, -195543952, 199672496, 201060848, 199500160, 195243312, 189557840, 184086064, 179620368, 175639472, 171028816, -165171552, 158431136, 151753536, 145830240, 140600592, 135516416, 130188512, 124697400, 119384520, 114528528, -110164304, 106021808, 101652216, 96741992, 91300264, 85496152, 79429512, 73136312, 66677220, 60127396, -53596360, 47292420, 41414224, 35956928, 30760018, 25701084, 20750060, 15941845, 11440182, 7451232, -3917547, 482647, -3153043, -7072738, -11359115, -16073378, -20965882, -25650618, -30160870, -34941708, --40317396, -46365784, -53226992, -61034708, -69603168, -78600048, -87877176, -97303024, -106561896, -115417048, --123827664, -131587064, -138292576, -143794976, -148143616, -151136672, -152569056, -152790784, -152322624, -151187680, --149328496, -147177248, -145073792, -142777600, -140200624, -137736912, -135370384, -132611944, -129665064, -127228744, --125030792, -122277184, -119323856, -116903640, -114341696, -110789216, -107069240, -103905456, -100271384, -95927024, --92563528, -89972048, -85635208, -80475336, -78287592, -77118824, -71010840, -62952948, -62019328, -64006824, --55034636, -40962176, -44935020, -61018600, -45531484, 16530255, 70942120, 62221728, 13724031, -11134166, --4073777, -5789616, -18125298, 3304441, 61377768, 95043328, 70010648, 29961154, 23776402, 35720168, -28427314, 8661338, 1998770, -2596845, -29952566, -61971548, -55981676, -12006581, 23720030, 23033372, -5655398, -145492, 6174553, 10863046, 10317585, 8673686, 6595996, 3351148, 774168, }, -}, -{ -{ -5993627, -17628694, 19673634, 5511517, -1316944, 26298084, 60221348, 29726006, -86547888, -207553216, -211214688, --51820392, 175624432, 290699488, 184001760, -57539676, -215310464, -162342784, 8655970, 113864416, 90045600, -19725712, -16241956, -23730232, -33396056, -36325224, -14506789, 15855409, 28052578, 24194624, 24378772, -35450124, 50498076, 65474092, 79804784, 89017496, 88574576, 80295488, 68737192, 55748140, 41954316, -28828358, 16729971, 4466766, -8088497, -19849728, -30842698, -41951092, -52959632, -63195612, -73171744, --83501680, -93191128, -100623568, -105214888, -106988712, -105779672, -101878232, -96300680, -89617176, -81389096, --71149888, -58987080, -44915696, -28600724, -9971840, 10462003, 31940598, 53636088, 74668544, 94358288, -112261320, 127707096, 139699184, 147604064, 151536640, 151740656, 147978800, 139933792, 127940096, 112900192, -95545304, 76076216, 54547696, 31362924, 7206955, -17441326, -42510512, -67998456, -93649080, -119086560, --143967296, -167687872, -189147136, -207169888, -221065184, -230433056, -234611520, -232813536, -224927968, -211891680, --195147200, -175832736, -154430384, -131102264, -106469552, -82101520, -59958816, -41174776, -25575456, -12447889, --1443109, 7364795, 13848585, 17929340, 19570556, 18952080, 16517907, 12791486, 8284455, 3510062, --1264868, -6323266, -12278238, -19502910, -27894738, -37029596, -46336256, -55298776, -63761472, -71935336, --79978736, -87721488, -94827512, -100983808, -105914968, -109505024, -111884968, -113158968, -113146616, -111667000, --108869368, -105025912, -100253128, -94717984, -88775904, -82661480, -76385992, -70137352, -64354716, -59281824, --54871428, -51158968, -48226576, -45827300, -43549356, -41275708, -39049304, -36720360, -34171296, -31555662, --28919088, -25992068, -22663468, -19183472, -15687905, -12097849, -8553427, -5284421, -2087354, 1395328, -5065914, 8723079, 12654047, 17178796, 22093312, 27161374, 32479080, 37844032, 42629696, 46680924, -50356344, 53518512, 55652040, 56935696, 57907432, 58341764, 57814016, 56804164, 55839408, 54453744, -52364240, 50339700, 48634600, 46335180, 43406552, 41039488, 39003672, 35665408, 31436476, 28479392, -26251914, 21914534, 16054051, 12672838, 12202002, 10322954, 5653788, 2725157, 4658966, 8232379, -9478456, 9896678, 13198435, 18043694, 17870286, 9187472, -1604170, -3621731, 4505958, 11703249, -11009612, 11530913, 22065932, 29156386, 10431402, -29294362, -55091008, -42656540, -7008313, 17862768, -16177531, -407485, -11506217, -9565429, -7515656, -24008330, -54532128, -65081104, -29904246, }, -{ --5993627, --17628694, -19673634, -5511517, 1316944, -26298084, -60221348, -29726006, 86547888, 207553216, 211214688, -51820392, -175624432, -290699488, -184001760, 57539676, 215310464, 162342784, -8655970, -113864416, -90045600, --19725712, 16241956, 23730232, 33396056, 36325224, 14506789, -15855409, -28052578, -24194624, -24378772, --35450124, -50498076, -65474092, -79804784, -89017496, -88574576, -80295488, -68737192, -55748140, -41954316, --28828358, -16729971, -4466766, 8088497, 19849728, 30842698, 41951092, 52959632, 63195612, 73171744, -83501680, 93191128, 100623568, 105214888, 106988712, 105779672, 101878232, 96300680, 89617176, 81389096, -71149888, 58987080, 44915696, 28600724, 9971840, -10462003, -31940598, -53636088, -74668544, -94358288, --112261320, -127707096, -139699184, -147604064, -151536640, -151740656, -147978800, -139933792, -127940096, -112900192, --95545304, -76076216, -54547696, -31362924, -7206955, 17441326, 42510512, 67998456, 93649080, 119086560, -143967296, 167687872, 189147136, 207169888, 221065184, 230433056, 234611520, 232813536, 224927968, 211891680, -195147200, 175832736, 154430384, 131102264, 106469552, 82101520, 59958816, 41174776, 25575456, 12447889, -1443109, -7364795, -13848585, -17929340, -19570556, -18952080, -16517907, -12791486, -8284455, -3510062, -1264868, 6323266, 12278238, 19502910, 27894738, 37029596, 46336256, 55298776, 63761472, 71935336, -79978736, 87721488, 94827512, 100983808, 105914968, 109505024, 111884968, 113158968, 113146616, 111667000, -108869368, 105025912, 100253128, 94717984, 88775904, 82661480, 76385992, 70137352, 64354716, 59281824, -54871428, 51158968, 48226576, 45827300, 43549356, 41275708, 39049304, 36720360, 34171296, 31555662, -28919088, 25992068, 22663468, 19183472, 15687905, 12097849, 8553427, 5284421, 2087354, -1395328, --5065914, -8723079, -12654047, -17178796, -22093312, -27161374, -32479080, -37844032, -42629696, -46680924, --50356344, -53518512, -55652040, -56935696, -57907432, -58341764, -57814016, -56804164, -55839408, -54453744, --52364240, -50339700, -48634600, -46335180, -43406552, -41039488, -39003672, -35665408, -31436476, -28479392, --26251914, -21914534, -16054051, -12672838, -12202002, -10322954, -5653788, -2725157, -4658966, -8232379, --9478456, -9896678, -13198435, -18043694, -17870286, -9187472, 1604170, 3621731, -4505958, -11703249, --11009612, -11530913, -22065932, -29156386, -10431402, 29294362, 55091008, 42656540, 7008313, -17862768, --16177531, 407485, 11506217, 9565429, 7515656, 24008330, 54532128, 65081104, 29904246, }, -}, -{ -{ --30602, -2479270, 9492951, 16711718, 17120276, 6766721, -13114683, -36174900, -49415748, -36882496, 3577171, -46484968, 55562920, 22531936, -20698522, -37361384, -23899882, -2588792, 12509092, 24769614, 35760972, -37337760, 26557930, 13006235, 4521527, -3856881, -20049982, -41466836, -57522496, -60912300, -51961052, --35696548, -18810884, -7061463, -2002529, -471373, 1672890, 5923834, 11039677, 14950244, 16398185, -15717970, 14334453, 13266617, 12461848, 11574937, 10468983, 8745627, 5770289, 1439351, -3791383, --9651865, -16166794, -23213224, -30580168, -38163468, -45602888, -52181168, -57428008, -61326228, -63802276, --64693480, -64217276, -62700616, -59956132, -55662776, -50021336, -43212204, -34663608, -23717884, -10545755, -4327180, 20737176, 38386272, 56305948, 73504608, 89552752, 104081016, 116416160, 126146408, 133414568, -138302784, 140432016, 139366320, 135071888, 127921304, 118373056, 106448616, 91569240, 73389176, 52714816, -30967788, 8856223, -13687524, -36408436, -58315456, -78199544, -94956360, -107788648, -116784992, -122916592, --126914136, -128452808, -126728912, -121377920, -112811608, -102297528, -91600376, -81738056, -72181224, -61933964, --51042464, -40455372, -30998926, -23176718, -17252346, -12846247, -9113921, -5813775, -3537443, -2767033, --3551938, -6061810, -10421201, -16129213, -22588306, -29928942, -38486664, -48046188, -58372364, -69697120, --81970528, -94491424, -106836240, -119177288, -131404528, -143031536, -154034704, -164636304, -174413792, -182744416, --189709776, -195511200, -199726720, -202112576, -203154096, -202998416, -201069424, -197389184, -192904704, -188092192, --182729920, -177114784, -171862576, -166647952, -160692976, -154040608, -147007072, -139340544, -131171520, -123469576, --116542328, -109671456, -102832256, -96776888, -91197728, -85123032, -78982840, -73858408, -69328824, -64517924, --60049012, -56563644, -53043384, -48741436, -44484052, -40409736, -35395900, -29847338, -25490094, -21993990, --17826798, -13899588, -11877732, -10437844, -7936563, -6040872, -6036577, -5704791, -4167729, -4024384, --5182952, -4381941, -2988224, -5002027, -7115150, -4204773, -2294586, -8315057, -12634183, -5450851, --1278827, -14765024, -24306294, -5111548, 11762842, -26110716, -98523864, -122462400, -70461088, -8380018, -10191421, 14363981, 40327060, 53931368, 8960912, -63687924, -88644368, -45148696, 17628694, 52721796, -62794568, 77477992, 107806360, 126214056, 90390808, -1745904, -87026240, -94509144, -29715804, 29446832, -27824408, -8575976, -23322210, -6749004, 4201552, -14711874, -44802952, -51480016, -22588306, }, -{ --30602, -2479270, 9492951, 16711718, 17120276, 6766721, -13114683, -36174900, -49415748, -36882496, 3577171, -46484968, 55562920, 22531936, -20698522, -37361384, -23899882, -2588792, 12509092, 24769614, 35760972, -37337760, 26557930, 13006235, 4521527, -3856881, -20049982, -41466836, -57522496, -60912300, -51961052, --35696548, -18810884, -7061463, -2002529, -471373, 1672890, 5923834, 11039677, 14950244, 16398185, -15717970, 14334453, 13266617, 12461848, 11574937, 10468983, 8745627, 5770289, 1439351, -3791383, --9651865, -16166794, -23213224, -30580168, -38163468, -45602888, -52181168, -57428008, -61326228, -63802276, --64693480, -64217276, -62700616, -59956132, -55662776, -50021336, -43212204, -34663608, -23717884, -10545755, -4327180, 20737176, 38386272, 56305948, 73504608, 89552752, 104081016, 116416160, 126146408, 133414568, -138302784, 140432016, 139366320, 135071888, 127921304, 118373056, 106448616, 91569240, 73389176, 52714816, -30967788, 8856223, -13687524, -36408436, -58315456, -78199544, -94956360, -107788648, -116784992, -122916592, --126914136, -128452808, -126728912, -121377920, -112811608, -102297528, -91600376, -81738056, -72181224, -61933964, --51042464, -40455372, -30998926, -23176718, -17252346, -12846247, -9113921, -5813775, -3537443, -2767033, --3551938, -6061810, -10421201, -16129213, -22588306, -29928942, -38486664, -48046188, -58372364, -69697120, --81970528, -94491424, -106836240, -119177288, -131404528, -143031536, -154034704, -164636304, -174413792, -182744416, --189709776, -195511200, -199726720, -202112576, -203154096, -202998416, -201069424, -197389184, -192904704, -188092192, --182729920, -177114784, -171862576, -166647952, -160692976, -154040608, -147007072, -139340544, -131171520, -123469576, --116542328, -109671456, -102832256, -96776888, -91197728, -85123032, -78982840, -73858408, -69328824, -64517924, --60049012, -56563644, -53043384, -48741436, -44484052, -40409736, -35395900, -29847338, -25490094, -21993990, --17826798, -13899588, -11877732, -10437844, -7936563, -6040872, -6036577, -5704791, -4167729, -4024384, --5182952, -4381941, -2988224, -5002027, -7115150, -4204773, -2294586, -8315057, -12634183, -5450851, --1278827, -14765024, -24306294, -5111548, 11762842, -26110716, -98523864, -122462400, -70461088, -8380018, -10191421, 14363981, 40327060, 53931368, 8960912, -63687924, -88644368, -45148696, 17628694, 52721796, -62794568, 77477992, 107806360, 126214056, 90390808, -1745904, -87026240, -94509144, -29715804, 29446832, -27824408, -8575976, -23322210, -6749004, 4201552, -14711874, -44802952, -51480016, -22588306, }, -}, -{ -{ -1764158, -11093364, 25240986, 28730110, 14854144, -9666361, -40182104, -69641824, -71814000, -21892522, 57956288, -103303088, 74577272, 1510218, -52022792, -52189760, -14654428, 22415972, 30050276, 5174362, -28579786, --40120364, -19475530, 15033996, 39711268, 47734268, 45950780, 40360880, 32664836, 24563454, 17143898, -8398272, -3512747, -16379395, -26647050, -33858836, -39592620, -43914968, -45525044, -44310104, -41805600, --39669392, -38815768, -39513164, -41541996, -44401908, -47503948, -49970872, -50604380, -48607756, -44217764, --38310572, -31732292, -25287694, -19827180, -15787763, -12870406, -10492605, -8318278, -6136972, -3542274, -5369, 4964982, 11649562, 20126216, 30054034, 40803800, 51764556, 62355408, 71839768, 79551384, -85389856, 89726696, 92673584, 93885840, 93318904, 91695408, 89711664, 87142200, 83405040, 78859896, -74775384, 71914936, 69914016, 68377488, 67898064, 69339560, 72409392, 75580688, 77486040, 78026672, -78029896, 78132432, 78204376, 77709384, 76295800, 73944304, 70800928, 67173288, 63604708, 60559040, -57841400, 54515484, 49600428, 42812236, 34536368, 25171730, 14672145, 2752000, -10590316, -24861956, --39404716, -53848152, -68203008, -82547664, -96672200, -109987672, -121740848, -131383584, -138849312, -144482704, --148653120, -151401360, -152416576, -151308480, -147960544, -142739472, -136395808, -129641976, -122683592, -115113176, --106294536, -95959232, -84526032, -72860896, -61704720, -51327008, -41615548, -32273994, -22919020, -13291313, --3552475, 5793911, 14383845, 22182970, 29150480, 35029752, 39650600, 43175696, 45889580, 47962436, -49513992, 50675784, 51485920, 51858508, 51663624, 50763828, 49123152, 47008952, 44880260, 42984032, -41307920, 39934604, 39033200, 38481832, 37993280, 37645388, 37808060, 38575784, 39746164, 41225780, -42949136, 44591424, 45797772, 46382424, 46002320, 44205952, 41131828, 37461240, 33474438, 29009282, -24359980, 20109574, 16124918, 11930882, 7791608, 4148402, 641024, -2932926, -5789616, -7692824, --9641128, -11643656, -12316356, -12039867, -12932683, -14353244, -13486197, -11772505, -13637058, -17055316, --15304579, -11020349, -15027017, -25094958, -22591528, -1823214, 14637249, 7070590, -10776610, -13829795, --4560719, -2980707, -7587597, 1844152, 24108726, 31710818, 13125420, -8542153, -11340861, -4901632, --9131637, -22211424, -30261266, -35723928, -52106008, -73799888, -74506944, -42775188, -1936493, 17946520, -16542067, 15548318, 22264574, 23836532, 19005768, 28008018, 55568824, 67573256, 31613644, }, -{ -1764158, -11093364, 25240986, 28730110, 14854144, -9666361, -40182104, -69641824, -71814000, -21892522, 57956288, -103303088, 74577272, 1510218, -52022792, -52189760, -14654428, 22415972, 30050276, 5174362, -28579786, --40120364, -19475530, 15033996, 39711268, 47734268, 45950780, 40360880, 32664836, 24563454, 17143898, -8398272, -3512747, -16379395, -26647050, -33858836, -39592620, -43914968, -45525044, -44310104, -41805600, --39669392, -38815768, -39513164, -41541996, -44401908, -47503948, -49970872, -50604380, -48607756, -44217764, --38310572, -31732292, -25287694, -19827180, -15787763, -12870406, -10492605, -8318278, -6136972, -3542274, -5369, 4964982, 11649562, 20126216, 30054034, 40803800, 51764556, 62355408, 71839768, 79551384, -85389856, 89726696, 92673584, 93885840, 93318904, 91695408, 89711664, 87142200, 83405040, 78859896, -74775384, 71914936, 69914016, 68377488, 67898064, 69339560, 72409392, 75580688, 77486040, 78026672, -78029896, 78132432, 78204376, 77709384, 76295800, 73944304, 70800928, 67173288, 63604708, 60559040, -57841400, 54515484, 49600428, 42812236, 34536368, 25171730, 14672145, 2752000, -10590316, -24861956, --39404716, -53848152, -68203008, -82547664, -96672200, -109987672, -121740848, -131383584, -138849312, -144482704, --148653120, -151401360, -152416576, -151308480, -147960544, -142739472, -136395808, -129641976, -122683592, -115113176, --106294536, -95959232, -84526032, -72860896, -61704720, -51327008, -41615548, -32273994, -22919020, -13291313, --3552475, 5793911, 14383845, 22182970, 29150480, 35029752, 39650600, 43175696, 45889580, 47962436, -49513992, 50675784, 51485920, 51858508, 51663624, 50763828, 49123152, 47008952, 44880260, 42984032, -41307920, 39934604, 39033200, 38481832, 37993280, 37645388, 37808060, 38575784, 39746164, 41225780, -42949136, 44591424, 45797772, 46382424, 46002320, 44205952, 41131828, 37461240, 33474438, 29009282, -24359980, 20109574, 16124918, 11930882, 7791608, 4148402, 641024, -2932926, -5789616, -7692824, --9641128, -11643656, -12316356, -12039867, -12932683, -14353244, -13486197, -11772505, -13637058, -17055316, --15304579, -11020349, -15027017, -25094958, -22591528, -1823214, 14637249, 7070590, -10776610, -13829795, --4560719, -2980707, -7587597, 1844152, 24108726, 31710818, 13125420, -8542153, -11340861, -4901632, --9131637, -22211424, -30261266, -35723928, -52106008, -73799888, -74506944, -42775188, -1936493, 17946520, -16542067, 15548318, 22264574, 23836532, 19005768, 28008018, 55568824, 67573256, 31613644, }, -}, -{ -{ --4406637, --7348689, -3356517, -1883880, -58519, 15189152, 32778654, 12958990, -56069724, -113955680, -81304808, -35633732, 129195304, 105268040, -6237903, -87387016, -69393784, 2754685, 46722800, 43382392, 34414500, -46532748, 59179280, 45785960, 12456479, -17613660, -37055904, -55365888, -77968152, -98888400, -110563192, --110758080, -100773888, -83529064, -63528472, -44748728, -28308130, -13724568, -1228898, 8499203, 15370614, -19379430, 20318954, 18934364, 17206176, 16825534, 18235894, 21321828, 25922276, 31459024, 37022620, -42048268, 46316928, 49381924, 50653772, 49984828, 47725676, 44330504, 40263708, 36105644, 32465658, -29827474, 28544890, 28830504, 30761092, 34375308, 39688720, 46570332, 54795192, 64247344, 74831216, -86176368, 97677216, 108785080, 119024280, 127867080, 134872176, 139811392, 142530096, 143018112, 141754864, -139501616, 136562240, 132723080, 128011504, 122875792, 117545736, 111997712, 106638136, 102006544, 97423280, -90851984, 80689552, 67099736, 51097764, 32862406, 11516418, -13649406, -42112156, -72248328, -102324912, --131304128, -158685088, -183792928, -205630688, -223527808, -237600816, -248374208, -256063808, -260270720, -260319584, --255977360, -247973152, -237642688, -225920656, -212798992, -197832096, -180929248, -162609072, -143774560, -125302448, --107543832, -90107880, -72290208, -53744536, -34629784, -15271293, 4137127, 23631446, 43414068, 63530084, -83574160, 102937480, 121328528, 138791872, 155334464, 170847888, 185203824, 198027520, 208609776, 216449168, -221711584, 224857648, 226156336, 225817040, 224124272, 221082912, 216368640, 209960544, 202450800, 194533024, -186563712, 178708224, 171015936, 163204992, 154712240, 145068960, 134116800, 122069952, 109522736, 97109744, -85053776, 73320464, 62079996, 51527260, 41466300, 31688268, 22530324, 14449881, 7395397, 1171452, --4069482, -8266202, -11797738, -14943802, -17665200, -20134270, -22630182, -24838332, -26244934, -27055072, --27682138, -27813672, -27129160, -26157424, -25265682, -23912768, -21990770, -20338280, -19040126, -17272210, --15395310, -14513768, -13857175, -12069932, -10526965, -10856067, -10587094, -7240778, -4358855, -5493800, --5580773, 703838, 5775121, -506269, -9443022, -1343788, 23636278, 42522324, 42022496, 33808372, -30777736, 29378650, 25759604, 28761248, 42633992, 54049480, 51519208, 43749612, 44405668, 51233056, -53909892, 50683300, 43901544, 31022548, 14563160, 9776956, 25884694, 47662324, 52263848, 39165268, -27675696, 28365038, 33512556, 35976256, 41140956, 53856744, 64300492, 55533392, 22204980, }, -{ --4406637, --7348689, -3356517, -1883880, -58519, 15189152, 32778654, 12958990, -56069724, -113955680, -81304808, -35633732, 129195304, 105268040, -6237903, -87387016, -69393784, 2754685, 46722800, 43382392, 34414500, -46532748, 59179280, 45785960, 12456479, -17613660, -37055904, -55365888, -77968152, -98888400, -110563192, --110758080, -100773888, -83529064, -63528472, -44748728, -28308130, -13724568, -1228898, 8499203, 15370614, -19379430, 20318954, 18934364, 17206176, 16825534, 18235894, 21321828, 25922276, 31459024, 37022620, -42048268, 46316928, 49381924, 50653772, 49984828, 47725676, 44330504, 40263708, 36105644, 32465658, -29827474, 28544890, 28830504, 30761092, 34375308, 39688720, 46570332, 54795192, 64247344, 74831216, -86176368, 97677216, 108785080, 119024280, 127867080, 134872176, 139811392, 142530096, 143018112, 141754864, -139501616, 136562240, 132723080, 128011504, 122875792, 117545736, 111997712, 106638136, 102006544, 97423280, -90851984, 80689552, 67099736, 51097764, 32862406, 11516418, -13649406, -42112156, -72248328, -102324912, --131304128, -158685088, -183792928, -205630688, -223527808, -237600816, -248374208, -256063808, -260270720, -260319584, --255977360, -247973152, -237642688, -225920656, -212798992, -197832096, -180929248, -162609072, -143774560, -125302448, --107543832, -90107880, -72290208, -53744536, -34629784, -15271293, 4137127, 23631446, 43414068, 63530084, -83574160, 102937480, 121328528, 138791872, 155334464, 170847888, 185203824, 198027520, 208609776, 216449168, -221711584, 224857648, 226156336, 225817040, 224124272, 221082912, 216368640, 209960544, 202450800, 194533024, -186563712, 178708224, 171015936, 163204992, 154712240, 145068960, 134116800, 122069952, 109522736, 97109744, -85053776, 73320464, 62079996, 51527260, 41466300, 31688268, 22530324, 14449881, 7395397, 1171452, --4069482, -8266202, -11797738, -14943802, -17665200, -20134270, -22630182, -24838332, -26244934, -27055072, --27682138, -27813672, -27129160, -26157424, -25265682, -23912768, -21990770, -20338280, -19040126, -17272210, --15395310, -14513768, -13857175, -12069932, -10526965, -10856067, -10587094, -7240778, -4358855, -5493800, --5580773, 703838, 5775121, -506269, -9443022, -1343788, 23636278, 42522324, 42022496, 33808372, -30777736, 29378650, 25759604, 28761248, 42633992, 54049480, 51519208, 43749612, 44405668, 51233056, -53909892, 50683300, 43901544, 31022548, 14563160, 9776956, 25884694, 47662324, 52263848, 39165268, -27675696, 28365038, 33512556, 35976256, 41140956, 53856744, 64300492, 55533392, 22204980, }, -}, -{ -{ -117575, -161061, -252329, -1464584, -3598646, -4524748, -379031, 6758668, 4143033, -16192564, -33903400, --12020003, 49617072, 89670864, 48064444, -48242148, -100213936, -51793548, 42024108, 84818088, 49868864, --8434779, -34635152, -24835112, -3246995, 16035260, 30627412, 36352068, 29423210, 13908715, -2612951, --16478179, -27019102, -33733748, -38114076, -44135084, -53906672, -65277060, -74832824, -80749144, -82240032, --78949552, -71816152, -62895500, -53892712, -45776836, -39388608, -35219268, -32866164, -31560494, -30902826, --30591978, -30010548, -28633474, -26456462, -23782844, -20996484, -18630494, -17163226, -16643535, -16815334, --17479444, -18406620, -19099720, -19061064, -18182744, -16600049, -14325863, -11284490, -7541963, -3243774, -1568200, 6864432, 12396886, 17781702, 22871238, 27857158, 32864552, 37613176, 41810432, 45802604, -50356880, 55646132, 60961692, 65723200, 70293048, 75307416, 80490912, 84649512, 86786256, 86875912, -85539104, 83229488, 79847200, 75143136, 69425464, 63683092, 58845348, 55023364, 51725364, 48756468, -46721728, 46633144, 49120468, 53931368, 60053844, 66373888, 72363760, 78207600, 84296784, 90664072, -96856880, 102248672, 106451304, 109519520, 111827528, 113777976, 115599048, 117298240, 118724704, 119707720, -120225800, 120397064, 120254792, 119632016, 118329568, 116299128, 113634096, 110527224, 107276472, 104199128, -101474504, 99150392, 97272960, 95897496, 95001992, 94505920, 94329296, 94344864, 94334128, 94034552, -93170728, 91431800, 88545584, 84382152, 78907136, 72140952, 64253784, 55550032, 46234788, 36351528, -26020522, 15505369, 4977330, -5508296, -15746424, -25402048, -34286188, -42334956, -49382996, -55277840, --60101624, -63987496, -66891432, -68781752, -69795904, -70051456, -69659000, -69007240, -68578280, -68463392, --68547680, -69004552, -70006360, -71223440, -72264976, -73256576, -74401184, -75542032, -76666776, -78069080, --79573936, -80576808, -81057848, -81349904, -80996640, -79342008, -76901392, -74463992, -71653480, -68145560, --64833068, -61896920, -58074400, -53672060, -50640348, -47916264, -42216844, -35222488, -31835372, -29344290, --20187420, -8438000, -6424734, -8773544, 7063611, 41104448, 58184460, 37411848, 8157754, 6343130, -19957102, 18105434, 12898861, 40517112, 89652072, 105694848, 72303624, 36204428, 35644472, 51827908, -53061100, 43456480, 38454452, 28644210, 3903052, -12447889, 8261907, 52053392, 76827304, 68179384, -50771344, 46590196, 50434728, 51454780, 54419384, 66729296, 78190416, 67669360, 27167816, }, -{ -117575, -161061, -252329, -1464584, -3598646, -4524748, -379031, 6758668, 4143033, -16192564, -33903400, --12020003, 49617072, 89670864, 48064444, -48242148, -100213936, -51793548, 42024108, 84818088, 49868864, --8434779, -34635152, -24835112, -3246995, 16035260, 30627412, 36352068, 29423210, 13908715, -2612951, --16478179, -27019102, -33733748, -38114076, -44135084, -53906672, -65277060, -74832824, -80749144, -82240032, --78949552, -71816152, -62895500, -53892712, -45776836, -39388608, -35219268, -32866164, -31560494, -30902826, --30591978, -30010548, -28633474, -26456462, -23782844, -20996484, -18630494, -17163226, -16643535, -16815334, --17479444, -18406620, -19099720, -19061064, -18182744, -16600049, -14325863, -11284490, -7541963, -3243774, -1568200, 6864432, 12396886, 17781702, 22871238, 27857158, 32864552, 37613176, 41810432, 45802604, -50356880, 55646132, 60961692, 65723200, 70293048, 75307416, 80490912, 84649512, 86786256, 86875912, -85539104, 83229488, 79847200, 75143136, 69425464, 63683092, 58845348, 55023364, 51725364, 48756468, -46721728, 46633144, 49120468, 53931368, 60053844, 66373888, 72363760, 78207600, 84296784, 90664072, -96856880, 102248672, 106451304, 109519520, 111827528, 113777976, 115599048, 117298240, 118724704, 119707720, -120225800, 120397064, 120254792, 119632016, 118329568, 116299128, 113634096, 110527224, 107276472, 104199128, -101474504, 99150392, 97272960, 95897496, 95001992, 94505920, 94329296, 94344864, 94334128, 94034552, -93170728, 91431800, 88545584, 84382152, 78907136, 72140952, 64253784, 55550032, 46234788, 36351528, -26020522, 15505369, 4977330, -5508296, -15746424, -25402048, -34286188, -42334956, -49382996, -55277840, --60101624, -63987496, -66891432, -68781752, -69795904, -70051456, -69659000, -69007240, -68578280, -68463392, --68547680, -69004552, -70006360, -71223440, -72264976, -73256576, -74401184, -75542032, -76666776, -78069080, --79573936, -80576808, -81057848, -81349904, -80996640, -79342008, -76901392, -74463992, -71653480, -68145560, --64833068, -61896920, -58074400, -53672060, -50640348, -47916264, -42216844, -35222488, -31835372, -29344290, --20187420, -8438000, -6424734, -8773544, 7063611, 41104448, 58184460, 37411848, 8157754, 6343130, -19957102, 18105434, 12898861, 40517112, 89652072, 105694848, 72303624, 36204428, 35644472, 51827908, -53061100, 43456480, 38454452, 28644210, 3903052, -12447889, 8261907, 52053392, 76827304, 68179384, -50771344, 46590196, 50434728, 51454780, 54419384, 66729296, 78190416, 67669360, 27167816, }, -}, -}; -const Word32 CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[16][BINAURAL_CHANNELS][160] ={ -{ -{ -500112448, -418537056, 287121792, 143605456, 14763950, -86528024, -166246368, -241739552, -311749664, -347549824, -328959072, --262918032, -147998128, 29484414, 216079808, 266078048, 94506464, -160373536, -237499344, -45432700, 230351984, -349093344, 263181104, 94669672, -54703388, -179336896, -294431296, -382621984, -428603392, -447339648, -456935680, --455972512, -440012416, -416439488, -393079712, -368706304, -341304416, -313900896, -288643808, -264001440, -239418128, --216171072, -193799664, -170890304, -148231664, -127228208, -107119168, -86873232, -67434744, -49669148, -32590212, --15431817, 1001264, 16207596, 30826054, 44940928, 57775900, 69332048, 80341120, 90769840, 100129112, -108780248, 117362128, 125608464, 133045736, 140035792, 147043568, 153789360, 159989136, 166012832, 172165904, -178216976, 184042032, 189920240, 195976144, 202025056, 208014400, 214042912, 220098288, 226173520, 232313168, -238288544, 243737776, 248770944, 253786400, 258645072, 262792400, 266229456, 269521024, 272802368, 275555968, -277430720, 278632256, 279502528, 280196672, 280706720, 280861856, 280527392, 280017376, 279963680, 280580544, -281469600, 282292096, 283223040, 284627488, 286693376, 289421216, 292608608, 295871168, 299018848, 302320064, -306113600, 310339840, 314677760, 318900256, 322870400, 326495360, 329891616, 333329728, 336852128, 340216160, -343272032, 346091136, 348726112, 351167264, 353505344, 355814432, 357938816, 359685792, 361114400, 362388928, -363542144, 364617504, 365799680, 367162272, 368560800, 369955584, 371522176, 373325536, 375293184, 377594208, -380535168, 384050080, 387854336, 392037088, 396819552, 401957408, 407214976, 413027136, 419667168, 426614272, -434127232, 443276608, 450554944, 444149536, 412868768, 361643232, 312110432, 282796224, 273215232, }, -{ -500112448, -418537056, 287121792, 143605456, 14763950, -86528024, -166246368, -241739552, -311749664, -347549824, -328959072, --262918032, -147998128, 29484414, 216079808, 266078048, 94506464, -160373536, -237499344, -45432700, 230351984, -349093344, 263181104, 94669672, -54703388, -179336896, -294431296, -382621984, -428603392, -447339648, -456935680, --455972512, -440012416, -416439488, -393079712, -368706304, -341304416, -313900896, -288643808, -264001440, -239418128, --216171072, -193799664, -170890304, -148231664, -127228208, -107119168, -86873232, -67434744, -49669148, -32590212, --15431817, 1001264, 16207596, 30826054, 44940928, 57775900, 69332048, 80341120, 90769840, 100129112, -108780248, 117362128, 125608464, 133045736, 140035792, 147043568, 153789360, 159989136, 166012832, 172165904, -178216976, 184042032, 189920240, 195976144, 202025056, 208014400, 214042912, 220098288, 226173520, 232313168, -238288544, 243737776, 248770944, 253786400, 258645072, 262792400, 266229456, 269521024, 272802368, 275555968, -277430720, 278632256, 279502528, 280196672, 280706720, 280861856, 280527392, 280017376, 279963680, 280580544, -281469600, 282292096, 283223040, 284627488, 286693376, 289421216, 292608608, 295871168, 299018848, 302320064, -306113600, 310339840, 314677760, 318900256, 322870400, 326495360, 329891616, 333329728, 336852128, 340216160, -343272032, 346091136, 348726112, 351167264, 353505344, 355814432, 357938816, 359685792, 361114400, 362388928, -363542144, 364617504, 365799680, 367162272, 368560800, 369955584, 371522176, 373325536, 375293184, 377594208, -380535168, 384050080, 387854336, 392037088, 396819552, 401957408, 407214976, 413027136, 419667168, 426614272, -434127232, 443276608, 450554944, 444149536, 412868768, 361643232, 312110432, 282796224, 273215232, }, -}, -{ -{ -13864154, -136623984, 328640160, 487629664, 518798752, 400693056, 175451568, -101884144, -367117696, -542826944, -596249344, --564139648, -451535296, -177904528, 243203600, 531694944, 367461824, -163075616, -549243648, -406381760, 97649304, -492055072, 546322496, 398481696, 242520704, 109596288, -35486092, -167236896, -245507312, -288138080, -331422240, --372911616, -394943168, -403555136, -412833856, -420243744, -419021856, -413134528, -406657696, -395780160, -378794112, --359887136, -340138848, -316722688, -290845536, -266280992, -242185696, -215901024, -189375312, -165792720, -144028512, --121940560, -100523712, -80735184, -60967596, -40515500, -20994874, -2815888, 15329812, 33093796, 48828948, -62875100, 76620608, 89422832, 99939056, 108899968, 117535536, 125165544, 130876784, 135496016, 139917680, -143608672, 146227536, 148670288, 151568320, 154618816, 157799248, 161570768, 165966656, 170851120, 176503296, -182850720, 189116544, 195128416, 201641728, 208718224, 215347520, 221177936, 226993312, 233166800, 239278000, -245384368, 252129616, 259665136, 267780480, 276746752, 286837248, 297567680, 308396896, 319439264, 330652896, -341231936, 350513344, 358587904, 365545728, 371041152, 374867968, 377070208, 377470720, 376021152, 373483904, -370898336, 368599456, 366440704, 364470912, 362756704, 361157888, 359899456, 359699744, 360843840, 362773344, -364846720, 366792896, 368347680, 369331744, 370134368, 371304224, 372740896, 374010592, 375177728, 376552128, -378008672, 379322912, 380723072, 382422272, 384142944, 385711136, 387467264, 389582528, 391733760, 393863520, -396390592, 399380960, 402513600, 406025280, 410536064, 415955776, 421893568, 428828864, 437292096, 446712032, -457193888, 470256512, 482825184, 481813728, 453202816, 400317792, 346350464, 312895360, 301198528, }, -{ --13864154, --136623984, -328640160, -487629664, -518798752, -400693056, -175451568, 101884144, 367117696, 542826944, 596249344, -564139648, 451535296, 177904528, -243203600, -531694944, -367461824, 163075616, 549243648, 406381760, -97649304, --492055072, -546322496, -398481696, -242520704, -109596288, 35486092, 167236896, 245507312, 288138080, 331422240, -372911616, 394943168, 403555136, 412833856, 420243744, 419021856, 413134528, 406657696, 395780160, 378794112, -359887136, 340138848, 316722688, 290845536, 266280992, 242185696, 215901024, 189375312, 165792720, 144028512, -121940560, 100523712, 80735184, 60967596, 40515500, 20994874, 2815888, -15329812, -33093796, -48828948, --62875100, -76620608, -89422832, -99939056, -108899968, -117535536, -125165544, -130876784, -135496016, -139917680, --143608672, -146227536, -148670288, -151568320, -154618816, -157799248, -161570768, -165966656, -170851120, -176503296, --182850720, -189116544, -195128416, -201641728, -208718224, -215347520, -221177936, -226993312, -233166800, -239278000, --245384368, -252129616, -259665136, -267780480, -276746752, -286837248, -297567680, -308396896, -319439264, -330652896, --341231936, -350513344, -358587904, -365545728, -371041152, -374867968, -377070208, -377470720, -376021152, -373483904, --370898336, -368599456, -366440704, -364470912, -362756704, -361157888, -359899456, -359699744, -360843840, -362773344, --364846720, -366792896, -368347680, -369331744, -370134368, -371304224, -372740896, -374010592, -375177728, -376552128, --378008672, -379322912, -380723072, -382422272, -384142944, -385711136, -387467264, -389582528, -391733760, -393863520, --396390592, -399380960, -402513600, -406025280, -410536064, -415955776, -421893568, -428828864, -437292096, -446712032, --457193888, -470256512, -482825184, -481813728, -453202816, -400317792, -346350464, -312895360, -301198528, }, -}, -{ -{ -64401424, -63330368, 37157908, -15931644, -58379880, -54824184, -12847858, 30091614, 47290276, 37990596, 12819941, --17877264, -39993660, -35149476, 1495722, 43596604, 49433464, 8347806, -36291936, -28638842, 34721588, -98505608, 110677016, 72908680, 22891638, -13288629, -35545148, -50949588, -61456688, -68270656, -73939472, --77989624, -77666968, -73198056, -67782640, -63748588, -62395136, -65560528, -73762304, -84316648, -93879936, --101488464, -107591080, -112057848, -114704080, -116171352, -116993832, -116838680, -115213032, -111799608, -105879536, --96558920, -83700320, -67775656, -48956184, -27186070, -2924873, 23012434, 50206020, 78591456, 107864880, -137462032, 166971152, 196106592, 224303600, 250640864, 274176224, 294177344, 310024704, 321084768, 326829280, -327020960, 321681792, 311023264, 295638720, 276577632, 254856384, 231045616, 205785312, 180449824, 156516656, -134315440, 113291576, 93632432, 76656040, 63151588, 52218748, 42468100, 33854004, 27566174, 24370182, -23728084, 24552718, 26297012, 29117194, 33293512, 38728256, 44891536, 51022064, 56372520, 60442536, -63119376, 64576980, 64919504, 63852740, 60770568, 55293944, 47769700, 39152384, 30319784, 21547314, -12667469, 3592203, -5455146, -14068702, -21811992, -28259812, -33072322, -36057860, -37148244, -36380520, --33932388, -30065844, -24990804, -18882824, -12054363, -4963909, 1974611, 8501888, 14472429, 19794968, -24357834, 27957016, 30428232, 31926102, 32949916, 34061776, 35713728, 38252588, 41734196, 45710800, -49542448, 52979496, 56159920, 59088548, 61521112, 63342716, 64637648, 65327528, 65163780, 64192044, -62777928, 60743724, 56635588, 48552456, 36449240, 23563264, 14521821, 11260331, 11362873, }, -{ -64401424, -63330368, 37157908, -15931644, -58379880, -54824184, -12847858, 30091614, 47290276, 37990596, 12819941, --17877264, -39993660, -35149476, 1495722, 43596604, 49433464, 8347806, -36291936, -28638842, 34721588, -98505608, 110677016, 72908680, 22891638, -13288629, -35545148, -50949588, -61456688, -68270656, -73939472, --77989624, -77666968, -73198056, -67782640, -63748588, -62395136, -65560528, -73762304, -84316648, -93879936, --101488464, -107591080, -112057848, -114704080, -116171352, -116993832, -116838680, -115213032, -111799608, -105879536, --96558920, -83700320, -67775656, -48956184, -27186070, -2924873, 23012434, 50206020, 78591456, 107864880, -137462032, 166971152, 196106592, 224303600, 250640864, 274176224, 294177344, 310024704, 321084768, 326829280, -327020960, 321681792, 311023264, 295638720, 276577632, 254856384, 231045616, 205785312, 180449824, 156516656, -134315440, 113291576, 93632432, 76656040, 63151588, 52218748, 42468100, 33854004, 27566174, 24370182, -23728084, 24552718, 26297012, 29117194, 33293512, 38728256, 44891536, 51022064, 56372520, 60442536, -63119376, 64576980, 64919504, 63852740, 60770568, 55293944, 47769700, 39152384, 30319784, 21547314, -12667469, 3592203, -5455146, -14068702, -21811992, -28259812, -33072322, -36057860, -37148244, -36380520, --33932388, -30065844, -24990804, -18882824, -12054363, -4963909, 1974611, 8501888, 14472429, 19794968, -24357834, 27957016, 30428232, 31926102, 32949916, 34061776, 35713728, 38252588, 41734196, 45710800, -49542448, 52979496, 56159920, 59088548, 61521112, 63342716, 64637648, 65327528, 65163780, 64192044, -62777928, 60743724, 56635588, 48552456, 36449240, 23563264, 14521821, 11260331, 11362873, }, -}, -{ -{ -11786464, -25789668, 33872260, 16652125, -20252382, -45563160, -35004520, -2744484, 12291660, -8097624, -45591616, --76592688, -94264872, -89115736, -41623600, 34422016, 69206416, 8408472, -98491656, -133276056, -44265008, -95329480, 179870544, 181108576, 141069280, 94194536, 38961260, -29467234, -99621768, -160425088, -213080304, --260522512, -299208896, -325018432, -338040224, -339448448, -329772960, -311046368, -286593504, -258777152, -229226704, --199843216, -171641920, -144170784, -117346560, -92145304, -68815040, -46365784, -24428700, -3939559, 14218489, -29699162, 41950556, 50583976, 56514252, 61536680, 66855996, 72790032, 79448304, 86790016, 94313184, -101418136, 107935752, 113958904, 119470424, 124494456, 129352064, 134420672, 139683072, 144722688, 149181392, -153040960, 156255200, 158280816, 158397856, 156460288, 152775744, 147223424, 139280960, 129104568, 117684792, -105569760, 92379912, 78087336, 63820528, 50685444, 38562900, 26798448, 15387794, 4635344, -5815386, --16722455, -28219546, -39760124, -51000052, -62167504, -73465416, -84478784, -94344864, -102413496, -108639048, --113280296, -116241680, -116895592, -114715896, -109939888, -103384160, -95636040, -86646136, -76100912, -64054068, --51193864, -38566120, -26919782, -16155519, -5476620, 5771363, 17424682, 28651190, 38631620, 47049220, -54205708, 60852172, 67741832, 75123808, 82692080, 90047208, 97074848, 103923176, 110883704, 118351584, -126650536, 135782704, 145463568, 155364000, 165216112, 174804640, 184064048, 193087232, 201897824, 210312208, -218072128, 224942464, 230699872, 235267040, 238810912, 241544128, 243650816, 245502480, 247508224, 249758784, -252559648, 256762272, 261317616, 260416752, 246926256, 221287984, 194087424, 176352432, 169659792, }, -{ -11786464, -25789668, 33872260, 16652125, -20252382, -45563160, -35004520, -2744484, 12291660, -8097624, -45591616, --76592688, -94264872, -89115736, -41623600, 34422016, 69206416, 8408472, -98491656, -133276056, -44265008, -95329480, 179870544, 181108576, 141069280, 94194536, 38961260, -29467234, -99621768, -160425088, -213080304, --260522512, -299208896, -325018432, -338040224, -339448448, -329772960, -311046368, -286593504, -258777152, -229226704, --199843216, -171641920, -144170784, -117346560, -92145304, -68815040, -46365784, -24428700, -3939559, 14218489, -29699162, 41950556, 50583976, 56514252, 61536680, 66855996, 72790032, 79448304, 86790016, 94313184, -101418136, 107935752, 113958904, 119470424, 124494456, 129352064, 134420672, 139683072, 144722688, 149181392, -153040960, 156255200, 158280816, 158397856, 156460288, 152775744, 147223424, 139280960, 129104568, 117684792, -105569760, 92379912, 78087336, 63820528, 50685444, 38562900, 26798448, 15387794, 4635344, -5815386, --16722455, -28219546, -39760124, -51000052, -62167504, -73465416, -84478784, -94344864, -102413496, -108639048, --113280296, -116241680, -116895592, -114715896, -109939888, -103384160, -95636040, -86646136, -76100912, -64054068, --51193864, -38566120, -26919782, -16155519, -5476620, 5771363, 17424682, 28651190, 38631620, 47049220, -54205708, 60852172, 67741832, 75123808, 82692080, 90047208, 97074848, 103923176, 110883704, 118351584, -126650536, 135782704, 145463568, 155364000, 165216112, 174804640, 184064048, 193087232, 201897824, 210312208, -218072128, 224942464, 230699872, 235267040, 238810912, 241544128, 243650816, 245502480, 247508224, 249758784, -252559648, 256762272, 261317616, 260416752, 246926256, 221287984, 194087424, 176352432, 169659792, }, -}, -{ -{ --4028143, --9701794, -11829414, -3768297, 8409009, 13034689, 10660109, 15154792, 31817654, 42967928, 22381074, --38646652, -116118736, -155936848, -106882408, 17986786, 117991344, 88319024, -55631100, -175194944, -155151936, --22438520, 107107896, 163734896, 163645776, 141754320, 103114648, 44587128, -20019380, -74875240, -119631480, --159479648, -192540704, -215611648, -231079440, -241096384, -242445536, -231967968, -211899728, -187148368, -161327568, --136807056, -115175992, -96413960, -79535816, -64121716, -49940268, -36028332, -21686364, -7558069, 5389110, -17023102, 27420682, 36199596, 43281996, 49421116, 55405616, 61469572, 67748280, 74530568, 81856704, -89521080, 97530120, 105970264, 114517784, 122714192, 130636264, 138667856, 146708560, 154226912, 161064496, -167516080, 173520976, 178387712, 181562768, 183142768, 183258208, 181393648, 176939760, 170231568, 162338496, -153725472, 143828784, 132326328, 120121648, 108309952, 96578784, 83629992, 69130720, 54300196, 40343164, -27209692, 14343043, 1941862, -9128416, -18303004, -25732760, -31920196, -37209448, -41509248, -44444320, --45890116, -46268608, -46170900, -45974404, -46022184, -46740520, -48153024, -49654652, -50677928, -51319492, --52062520, -53265112, -55057724, -57225608, -59023588, -59653876, -59118616, -58188752, -57553636, -57443040, --57839252, -58457188, -58693412, -58139900, -56941604, -55291260, -52981104, -49748068, -45523432, -40108016, --33250026, -25235080, -16774532, -8288213, 44560, 7775502, 14513768, 20418812, 25611964, 29609504, -32030256, 33180232, 33344516, 32455994, 30959734, 29850022, 29509110, 29776472, 31127776, 34277060, -39178156, 46445776, 58442692, 75504448, 91873112, 99620696, 97023312, 89856088, 84774064, }, -{ -4028143, -9701794, 11829414, 3768297, -8409009, -13034689, -10660109, -15154792, -31817654, -42967928, -22381074, -38646652, 116118736, 155936848, 106882408, -17986786, -117991344, -88319024, 55631100, 175194944, 155151936, -22438520, -107107896, -163734896, -163645776, -141754320, -103114648, -44587128, 20019380, 74875240, 119631480, -159479648, 192540704, 215611648, 231079440, 241096384, 242445536, 231967968, 211899728, 187148368, 161327568, -136807056, 115175992, 96413960, 79535816, 64121716, 49940268, 36028332, 21686364, 7558069, -5389110, --17023102, -27420682, -36199596, -43281996, -49421116, -55405616, -61469572, -67748280, -74530568, -81856704, --89521080, -97530120, -105970264, -114517784, -122714192, -130636264, -138667856, -146708560, -154226912, -161064496, --167516080, -173520976, -178387712, -181562768, -183142768, -183258208, -181393648, -176939760, -170231568, -162338496, --153725472, -143828784, -132326328, -120121648, -108309952, -96578784, -83629992, -69130720, -54300196, -40343164, --27209692, -14343043, -1941862, 9128416, 18303004, 25732760, 31920196, 37209448, 41509248, 44444320, -45890116, 46268608, 46170900, 45974404, 46022184, 46740520, 48153024, 49654652, 50677928, 51319492, -52062520, 53265112, 55057724, 57225608, 59023588, 59653876, 59118616, 58188752, 57553636, 57443040, -57839252, 58457188, 58693412, 58139900, 56941604, 55291260, 52981104, 49748068, 45523432, 40108016, -33250026, 25235080, 16774532, 8288213, -44560, -7775502, -14513768, -20418812, -25611964, -29609504, --32030256, -33180232, -33344516, -32455994, -30959734, -29850022, -29509110, -29776472, -31127776, -34277060, --39178156, -46445776, -58442692, -75504448, -91873112, -99620696, -97023312, -89856088, -84774064, }, -}, -{ -{ -17964774, --6148246, -9459665, 17413408, 24617678, -15374372, -48695264, -7977365, 84730040, 133488656, 83583824, --20476256, -94089848, -92138320, -26839250, 51866024, 81462104, 32069448, -51904144, -84628032, -33337000, -45020384, 77433432, 55789476, 22835804, 6847789, 3155727, 4340602, 14636175, 35163436, 57389352, -74107512, 84549656, 88887568, 86885576, 80854904, 73137928, 62209380, 45836428, 25757992, 5853504, --11676942, -25855166, -35569308, -41002980, -44304736, -47410532, -50720880, -54160076, -57655640, -60502132, --61879740, -61896920, -60864520, -58007828, -52034604, -42496552, -29708288, -13909252, 4695473, 25484188, -47616156, 70463768, 93617936, 116656680, 138971184, 159720176, 178019952, 193147360, 204373872, 210771232, -211526608, 206346864, 195362496, 178964848, 157959776, 133424232, 106186088, 76969032, 47055660, 17911088, --10073309, -37474128, -64185600, -88910120, -110740360, -130227168, -148283744, -164888624, -179540368, -192255616, --203338240, -212553104, -219211376, -222908800, -223648608, -221320208, -215513936, -206016704, -193214480, -177784272, --160050880, -139891920, -117452320, -93894968, -71205192, -50973744, -33303176, -17053168, -1281511, 13631689, -26313118, 35674000, 41749768, 45529876, 48215304, 50524384, 52427056, 53514220, 53673132, 53345640, -53175452, 53623740, 54891828, 56893284, 59245852, 61529164, 63567664, 65269008, 66320200, 66337916, -65197068, 62964220, 59689844, 55530168, 50836308, 45907296, 40879500, 35956928, 31396748, 27166206, -23024246, 18983756, 15240155, 11680164, 7983271, 4147328, 373662, -3414499, -7357279, -11221139, --14868103, -18824304, -23437100, -27577986, -29235842, -27671400, -24319716, -21318608, -19778862, }, -{ --17964774, -6148246, 9459665, -17413408, -24617678, 15374372, 48695264, 7977365, -84730040, -133488656, -83583824, -20476256, 94089848, 92138320, 26839250, -51866024, -81462104, -32069448, 51904144, 84628032, 33337000, --45020384, -77433432, -55789476, -22835804, -6847789, -3155727, -4340602, -14636175, -35163436, -57389352, --74107512, -84549656, -88887568, -86885576, -80854904, -73137928, -62209380, -45836428, -25757992, -5853504, -11676942, 25855166, 35569308, 41002980, 44304736, 47410532, 50720880, 54160076, 57655640, 60502132, -61879740, 61896920, 60864520, 58007828, 52034604, 42496552, 29708288, 13909252, -4695473, -25484188, --47616156, -70463768, -93617936, -116656680, -138971184, -159720176, -178019952, -193147360, -204373872, -210771232, --211526608, -206346864, -195362496, -178964848, -157959776, -133424232, -106186088, -76969032, -47055660, -17911088, -10073309, 37474128, 64185600, 88910120, 110740360, 130227168, 148283744, 164888624, 179540368, 192255616, -203338240, 212553104, 219211376, 222908800, 223648608, 221320208, 215513936, 206016704, 193214480, 177784272, -160050880, 139891920, 117452320, 93894968, 71205192, 50973744, 33303176, 17053168, 1281511, -13631689, --26313118, -35674000, -41749768, -45529876, -48215304, -50524384, -52427056, -53514220, -53673132, -53345640, --53175452, -53623740, -54891828, -56893284, -59245852, -61529164, -63567664, -65269008, -66320200, -66337916, --65197068, -62964220, -59689844, -55530168, -50836308, -45907296, -40879500, -35956928, -31396748, -27166206, --23024246, -18983756, -15240155, -11680164, -7983271, -4147328, -373662, 3414499, 7357279, 11221139, -14868103, 18824304, 23437100, 27577986, 29235842, 27671400, 24319716, 21318608, 19778862, }, -}, -{ -{ -4097399, -12105365, 9900973, -6716792, -20841328, -26265872, -41604812, -77798504, -110680232, -102088688, -33487860, -87101936, 218155888, 271257248, 162964480, -65653408, -226745280, -165586016, 49815716, 197829952, 160600640, -30589830, -48527760, -51201916, -36432060, -27878096, -3379066, 36307508, 59490664, 54769960, 42598024, -38815768, 39741868, 40969156, 45441828, 52869436, 58176404, 60235304, 61848064, 63494648, 63940252, -63437740, 61800284, 57372172, 50569480, 44151728, 38767448, 32506996, 24999394, 17683454, 10433012, -1802813, -8124468, -18282066, -28783260, -40001176, -50993608, -60793116, -69653096, -77717968, -84222696, --88771608, -91616488, -92343408, -89996744, -84433688, -76007496, -64386928, -49173080, -31016106, -10837276, -11263015, 35285840, 60425896, 85688352, 110569104, 134624144, 157159840, 177573808, 195347456, 209883776, -220957808, 228885248, 233705280, 234884784, 232269152, 226452144, 217828928, 206229296, 191663984, 174346688, -153916592, 129858872, 102837088, 74533792, 46139760, 17920214, -9808095, -36027796, -59157804, -77400680, --89521080, -95811056, -97738424, -96288336, -91280400, -82486456, -70603360, -56943212, -42917996, -29930016, --19014358, -10431939, -4008815, 282931, 2376728, 2290828, -146029, -5231270, -12693776, -21539260, --30823906, -40108552, -49162344, -57876832, -66484484, -75242456, -83971440, -92451320, -101007432, -110116520, --119754960, -129643048, -139730848, -150000128, -160265632, -170581600, -181351776, -192741488, -204456544, -216138320, --227413680, -237657184, -246387248, -253706400, -259749952, -264183440, -266929536, -268643776, -269709440, -269844736, --269494176, -269504352, -267268832, -255428688, -228801504, -192924032, -161751152, -144927760, -140091632, }, -{ -4097399, -12105365, 9900973, -6716792, -20841328, -26265872, -41604812, -77798504, -110680232, -102088688, -33487860, -87101936, 218155888, 271257248, 162964480, -65653408, -226745280, -165586016, 49815716, 197829952, 160600640, -30589830, -48527760, -51201916, -36432060, -27878096, -3379066, 36307508, 59490664, 54769960, 42598024, -38815768, 39741868, 40969156, 45441828, 52869436, 58176404, 60235304, 61848064, 63494648, 63940252, -63437740, 61800284, 57372172, 50569480, 44151728, 38767448, 32506996, 24999394, 17683454, 10433012, -1802813, -8124468, -18282066, -28783260, -40001176, -50993608, -60793116, -69653096, -77717968, -84222696, --88771608, -91616488, -92343408, -89996744, -84433688, -76007496, -64386928, -49173080, -31016106, -10837276, -11263015, 35285840, 60425896, 85688352, 110569104, 134624144, 157159840, 177573808, 195347456, 209883776, -220957808, 228885248, 233705280, 234884784, 232269152, 226452144, 217828928, 206229296, 191663984, 174346688, -153916592, 129858872, 102837088, 74533792, 46139760, 17920214, -9808095, -36027796, -59157804, -77400680, --89521080, -95811056, -97738424, -96288336, -91280400, -82486456, -70603360, -56943212, -42917996, -29930016, --19014358, -10431939, -4008815, 282931, 2376728, 2290828, -146029, -5231270, -12693776, -21539260, --30823906, -40108552, -49162344, -57876832, -66484484, -75242456, -83971440, -92451320, -101007432, -110116520, --119754960, -129643048, -139730848, -150000128, -160265632, -170581600, -181351776, -192741488, -204456544, -216138320, --227413680, -237657184, -246387248, -253706400, -259749952, -264183440, -266929536, -268643776, -269709440, -269844736, --269494176, -269504352, -267268832, -255428688, -228801504, -192924032, -161751152, -144927760, -140091632, }, -}, -{ -{ -18727668, --11437498, -53266720, -83454976, -81330040, -33879240, 45314588, 106220984, 99013488, 29327110, -43024836, --68955160, -54369992, -31644246, -13194140, 5386963, 16087874, 3529390, -25078850, -41574208, -32392644, --13325673, -3602404, -1616518, 5564667, 21217138, 37810744, 49380848, 55175836, 54176716, 44300440, -27208080, 8718784, -6712497, -19377818, -32028108, -46491948, -62868120, -79971752, -95463168, -106619880, --112135688, -112968912, -111066784, -107736568, -103542000, -98983960, -94433448, -89733144, -84549112, -78931296, --73065448, -66820564, -60029684, -52891448, -45635640, -38110856, -30154966, -22127672, -14702210, -8305393, --3034395, 1028645, 3723200, 5088463, 5648419, 6205691, 7199976, 8467528, 9920301, 12130061, -15741592, 20657182, 26497800, 33588256, 42718280, 54120348, 67389648, 82216952, 98528160, 116023176, -134091024, 152043984, 169242112, 185334288, 200375264, 214161568, 225654896, 234013984, 240021568, 245238336, -249632096, 251240560, 248440768, 241481312, 231461152, 218694896, 202561392, 182544704, 159153776, 133785544, -107536856, 80280456, 51447264, 21588116, -7601555, -34870304, -60346436, -84909352, -109207600, -133091912, --155438080, -174749328, -190429184, -203171824, -213856624, -222637680, -229308304, -233832512, -236274208, -236900736, --236457808, -235688480, -234648560, -233085184, -231158368, -229137040, -226815072, -223780688, -219724624, -214168544, --206731808, -197954512, -188937216, -180019264, -170715280, -160727344, -149907776, -137711680, -124003224, -109887272, --96534760, -83916144, -71652400, -59930364, -48608292, -36891620, -24775518, -13274670, -2723546, 7456600, -17607756, 28748364, 43400644, 61654792, 77274512, 82553568, 77250352, 68650224, 63350232, }, -{ -18727668, --11437498, -53266720, -83454976, -81330040, -33879240, 45314588, 106220984, 99013488, 29327110, -43024836, --68955160, -54369992, -31644246, -13194140, 5386963, 16087874, 3529390, -25078850, -41574208, -32392644, --13325673, -3602404, -1616518, 5564667, 21217138, 37810744, 49380848, 55175836, 54176716, 44300440, -27208080, 8718784, -6712497, -19377818, -32028108, -46491948, -62868120, -79971752, -95463168, -106619880, --112135688, -112968912, -111066784, -107736568, -103542000, -98983960, -94433448, -89733144, -84549112, -78931296, --73065448, -66820564, -60029684, -52891448, -45635640, -38110856, -30154966, -22127672, -14702210, -8305393, --3034395, 1028645, 3723200, 5088463, 5648419, 6205691, 7199976, 8467528, 9920301, 12130061, -15741592, 20657182, 26497800, 33588256, 42718280, 54120348, 67389648, 82216952, 98528160, 116023176, -134091024, 152043984, 169242112, 185334288, 200375264, 214161568, 225654896, 234013984, 240021568, 245238336, -249632096, 251240560, 248440768, 241481312, 231461152, 218694896, 202561392, 182544704, 159153776, 133785544, -107536856, 80280456, 51447264, 21588116, -7601555, -34870304, -60346436, -84909352, -109207600, -133091912, --155438080, -174749328, -190429184, -203171824, -213856624, -222637680, -229308304, -233832512, -236274208, -236900736, --236457808, -235688480, -234648560, -233085184, -231158368, -229137040, -226815072, -223780688, -219724624, -214168544, --206731808, -197954512, -188937216, -180019264, -170715280, -160727344, -149907776, -137711680, -124003224, -109887272, --96534760, -83916144, -71652400, -59930364, -48608292, -36891620, -24775518, -13274670, -2723546, 7456600, -17607756, 28748364, 43400644, 61654792, 77274512, 82553568, 77250352, 68650224, 63350232, }, -}, -{ -{ --22726820, -28139552, 65842384, 53941568, 13258027, -44198436, -138545984, -254022624, -313942240, -261710608, -114174192, -89050776, 307671040, 429789856, 296704384, -81071800, -409902560, -376489312, -16853452, 316269056, 363651136, -201527376, 48773648, -14806900, -51604032, -102137008, -141103104, -155091264, -165697696, -180655456, -182950032, --166900816, -145012048, -122601992, -94267552, -60898340, -29658896, -2320893, 22440668, 41754600, 53427244, -61154428, 68311992, 73379520, 75195752, 75655312, 75098040, 71666896, 66141960, 61661772, 58882392, -56165824, 53215720, 50490560, 46983720, 41840496, 35969816, 29886530, 22597434, 13982803, 5356898, --3058554, -12309376, -22238804, -31666794, -40648108, -49917720, -58843200, -66265976, -72393824, -77924128, --82560544, -85977728, -88859656, -91780232, -94406064, -96492344, -98289792, -99738264, -100664904, -101653824, --103407784, -105657808, -107865960, -110244832, -112984480, -115367656, -116614808, -116716808, -115826144, -113860120, --111085032, -108066208, -104995304, -102168144, -100880728, -102568112, -107256608, -113988432, -122389392, -132765496, --145016352, -158311952, -171488384, -183303840, -192878384, -200196480, -205611888, -208824528, -209097792, -206349552, --201248752, -194439072, -186380640, -177582400, -168258032, -158151968, -147309328, -136534864, -126621544, -117624656, --109132432, -100621424, -91466696, -81385872, -70982928, -61176440, -52158084, -43499428, -34953516, -26438744, --17656610, -8459475, 754304, 9605694, 18262200, 26974006, 35667020, 44361644, 53363360, 62696860, -71919768, 80702432, 89022864, 96714608, 103426032, 109095928, 113979304, 118189448, 121602872, 124224416, -126407864, 128414152, 129241472, 126000384, 115996328, 100630544, 85895584, 77125264, 74235288, }, -{ --22726820, -28139552, 65842384, 53941568, 13258027, -44198436, -138545984, -254022624, -313942240, -261710608, -114174192, -89050776, 307671040, 429789856, 296704384, -81071800, -409902560, -376489312, -16853452, 316269056, 363651136, -201527376, 48773648, -14806900, -51604032, -102137008, -141103104, -155091264, -165697696, -180655456, -182950032, --166900816, -145012048, -122601992, -94267552, -60898340, -29658896, -2320893, 22440668, 41754600, 53427244, -61154428, 68311992, 73379520, 75195752, 75655312, 75098040, 71666896, 66141960, 61661772, 58882392, -56165824, 53215720, 50490560, 46983720, 41840496, 35969816, 29886530, 22597434, 13982803, 5356898, --3058554, -12309376, -22238804, -31666794, -40648108, -49917720, -58843200, -66265976, -72393824, -77924128, --82560544, -85977728, -88859656, -91780232, -94406064, -96492344, -98289792, -99738264, -100664904, -101653824, --103407784, -105657808, -107865960, -110244832, -112984480, -115367656, -116614808, -116716808, -115826144, -113860120, --111085032, -108066208, -104995304, -102168144, -100880728, -102568112, -107256608, -113988432, -122389392, -132765496, --145016352, -158311952, -171488384, -183303840, -192878384, -200196480, -205611888, -208824528, -209097792, -206349552, --201248752, -194439072, -186380640, -177582400, -168258032, -158151968, -147309328, -136534864, -126621544, -117624656, --109132432, -100621424, -91466696, -81385872, -70982928, -61176440, -52158084, -43499428, -34953516, -26438744, --17656610, -8459475, 754304, 9605694, 18262200, 26974006, 35667020, 44361644, 53363360, 62696860, -71919768, 80702432, 89022864, 96714608, 103426032, 109095928, 113979304, 118189448, 121602872, 124224416, -126407864, 128414152, 129241472, 126000384, 115996328, 100630544, 85895584, 77125264, 74235288, }, -}, -{ -{ --20780662, --21712670, -17408040, -4653060, 21265456, 64972656, 107825688, 112669344, 68903624, -6364068, -119698592, --273759616, -361284064, -213446992, 145631600, 404616512, 284796608, -98422936, -355922336, -287288224, -61032560, -72851232, 74783968, 54613732, 64385316, 67689224, 44145820, 18436684, 4584341, -10081362, -30307974, --44483512, -47537772, -45814416, -43122008, -38670812, -33785824, -29936996, -25370908, -19680078, -15792595, --14354318, -12443594, -9336185, -7518877, -7590818, -7566659, -6946036, -6852084, -6891275, -5601711, --2967286, 188979, 3899294, 8224863, 12344273, 15734613, 18702972, 21189222, 22669912, 23339390, -23837606, 24029268, 23412404, 22183506, 20727512, 18799072, 16165720, 13209709, 10209137, 6907918, -3212099, -631897, -4758287, -9677635, -15535970, -22126060, -29405494, -37317360, -45499808, -53783192, --62446676, -71462352, -80083424, -87622168, -94094680, -99766184, -104549168, -108045272, -109799768, -109517368, --107325864, -103726144, -99096704, -93572304, -87521768, -81644640, -76410152, -71863392, -68115496, -65553548, --64393908, -64374580, -64973192, -65784940, -66783520, -68330784, -70728984, -73718280, -76666240, -79216912, --81465328, -83594560, -85681912, -87680680, -89303648, -90122912, -90061168, -89528056, -88929448, -88313656, --87506200, -86191400, -83928496, -80525808, -76309760, -71669048, -66557496, -60737280, -54133232, -46667504, --38247220, -29160680, -19973746, -10924249, -1928440, 6921877, 15493558, 23987392, 32513440, 40642740, -47986060, 54708220, 61007864, 66839892, 72506568, 78620984, 85303960, 92386896, 100205344, 109109352, -119048440, 130876240, 145829168, 161037648, 168272528, 161819328, 146276384, 132125544, 125181656, }, -{ -20780662, -21712670, 17408040, 4653060, -21265456, -64972656, -107825688, -112669344, -68903624, 6364068, 119698592, -273759616, 361284064, 213446992, -145631600, -404616512, -284796608, 98422936, 355922336, 287288224, 61032560, --72851232, -74783968, -54613732, -64385316, -67689224, -44145820, -18436684, -4584341, 10081362, 30307974, -44483512, 47537772, 45814416, 43122008, 38670812, 33785824, 29936996, 25370908, 19680078, 15792595, -14354318, 12443594, 9336185, 7518877, 7590818, 7566659, 6946036, 6852084, 6891275, 5601711, -2967286, -188979, -3899294, -8224863, -12344273, -15734613, -18702972, -21189222, -22669912, -23339390, --23837606, -24029268, -23412404, -22183506, -20727512, -18799072, -16165720, -13209709, -10209137, -6907918, --3212099, 631897, 4758287, 9677635, 15535970, 22126060, 29405494, 37317360, 45499808, 53783192, -62446676, 71462352, 80083424, 87622168, 94094680, 99766184, 104549168, 108045272, 109799768, 109517368, -107325864, 103726144, 99096704, 93572304, 87521768, 81644640, 76410152, 71863392, 68115496, 65553548, -64393908, 64374580, 64973192, 65784940, 66783520, 68330784, 70728984, 73718280, 76666240, 79216912, -81465328, 83594560, 85681912, 87680680, 89303648, 90122912, 90061168, 89528056, 88929448, 88313656, -87506200, 86191400, 83928496, 80525808, 76309760, 71669048, 66557496, 60737280, 54133232, 46667504, -38247220, 29160680, 19973746, 10924249, 1928440, -6921877, -15493558, -23987392, -32513440, -40642740, --47986060, -54708220, -61007864, -66839892, -72506568, -78620984, -85303960, -92386896, -100205344, -109109352, --119048440, -130876240, -145829168, -161037648, -168272528, -161819328, -146276384, -132125544, -125181656, }, -}, -{ -{ --6142340, --1752884, 2153389, -253403, -14878840, -40603012, -54955716, -25999048, 40649716, 85347976, 57532696, --15068893, -56675316, -38612292, -4403952, 3061775, -4886062, 594853, 14398341, 12999255, -2433636, --10459856, -5893232, -4413079, -13902272, -23233088, -21329344, -11317776, -1985349, 3565360, 6399502, -6265821, 2057289, -5651103, -14944339, -23817204, -30613454, -34868156, -37777996, -40564892, -42690364, --42750492, -40518720, -37063420, -33477122, -30520574, -28937342, -29060822, -30284888, -31540092, -32114544, --31699006, -30080878, -27246736, -23538568, -19363860, -14906758, -10248866, -5544266, -918586, 3623342, -8079371, 12317966, 16100759, 19237696, 21731460, 23732378, 25309706, 26402774, 27111982, 27790586, -28637768, 29481192, 30255898, 31381716, 33338610, 36192080, 39929236, 44916768, 51591684, 59942176, -69655776, 80563920, 92683784, 106019656, 120433568, 135449840, 150231520, 164097280, 176961776, 188793344, -198764640, 205487344, 208043376, 206330768, 200533632, 190734128, 177053584, 159909680, 140229616, 119414584, -98722504, 78572672, 58887224, 40159556, 23593330, 9991705, -1092532, -10959146, -20775830, -30835718, --40430136, -48541184, -54919748, -60304024, -65514356, -70714488, -75657456, -80133352, -84022984, -87416544, --90787016, -94607928, -98813240, -102997072, -106955424, -110626008, -113824152, -116454280, -118649544, -120379344, --121370944, -121642600, -121586768, -121387048, -120952720, -120379880, -119800056, -118943216, -117592448, -116182088, --115217864, -114570400, -114006688, -113704968, -113555176, -112869056, -111450640, -109896936, -108371152, -106411576, --104070816, -100995080, -93944896, -78418048, -54832772, -31004296, -15928960, -11644193, -12591233, }, -{ -6142340, -1752884, -2153389, 253403, 14878840, 40603012, 54955716, 25999048, -40649716, -85347976, -57532696, -15068893, 56675316, 38612292, 4403952, -3061775, 4886062, -594853, -14398341, -12999255, 2433636, -10459856, 5893232, 4413079, 13902272, 23233088, 21329344, 11317776, 1985349, -3565360, -6399502, --6265821, -2057289, 5651103, 14944339, 23817204, 30613454, 34868156, 37777996, 40564892, 42690364, -42750492, 40518720, 37063420, 33477122, 30520574, 28937342, 29060822, 30284888, 31540092, 32114544, -31699006, 30080878, 27246736, 23538568, 19363860, 14906758, 10248866, 5544266, 918586, -3623342, --8079371, -12317966, -16100759, -19237696, -21731460, -23732378, -25309706, -26402774, -27111982, -27790586, --28637768, -29481192, -30255898, -31381716, -33338610, -36192080, -39929236, -44916768, -51591684, -59942176, --69655776, -80563920, -92683784, -106019656, -120433568, -135449840, -150231520, -164097280, -176961776, -188793344, --198764640, -205487344, -208043376, -206330768, -200533632, -190734128, -177053584, -159909680, -140229616, -119414584, --98722504, -78572672, -58887224, -40159556, -23593330, -9991705, 1092532, 10959146, 20775830, 30835718, -40430136, 48541184, 54919748, 60304024, 65514356, 70714488, 75657456, 80133352, 84022984, 87416544, -90787016, 94607928, 98813240, 102997072, 106955424, 110626008, 113824152, 116454280, 118649544, 120379344, -121370944, 121642600, 121586768, 121387048, 120952720, 120379880, 119800056, 118943216, 117592448, 116182088, -115217864, 114570400, 114006688, 113704968, 113555176, 112869056, 111450640, 109896936, 108371152, 106411576, -104070816, 100995080, 93944896, 78418048, 54832772, 31004296, 15928960, 11644193, 12591233, }, -}, -{ -{ --12293807, --4858682, 11296838, 19100256, 3861713, -5900748, 36241472, 116374824, 146012784, 51534240, -132524440, --269747040, -229335152, -13444858, 212266944, 253539968, 85124640, -115891640, -166048272, -67431520, 38611756, -62862216, 38062000, 19412178, 5471252, -21926882, -46705620, -45556720, -28509992, -20809116, -26320634, --31532576, -29571386, -22053584, -8328479, 12683575, 36189932, 55955908, 70685496, 81685448, 89103392, -93404800, 96296392, 98277440, 98371928, 96653944, 94194000, 90911576, 86037320, 79888000, 72978472, -64399276, 52976812, 39047160, 23758686, 7796977, -8194798, -23222888, -36919540, -49907520, -62626528, --74701296, -85702848, -95545840, -103881840, -109858824, -112652696, -111763640, -106924288, -98160944, -85775328, --69952672, -50720344, -28536300, -4487167, 20426864, 45805288, 71338336, 96167000, 119163864, 139693280, -157771328, 173507552, 186629744, 196671392, 203482128, 207318608, 208383760, 206505792, 201380816, 192836512, -180638272, 164359808, 143832016, 119569744, 92430920, 63056564, 32062468, 675921, -29271276, -56125560, --79089672, -98170608, -113548736, -124903016, -131351912, -132275328, -128254168, -120941984, -111917720, -101868568, --90853592, -78939352, -66391068, -53582940, -40999756, -29189672, -18582712, -9393093, -1646046, 4900021, -10785737, 16521129, 22140556, 27170500, 30990336, 33161442, 33582888, 32519344, 30390652, 27408870, -23448374, 18280992, 11822971, 4185983, -4341675, -13386876, -22716082, -32304596, -42073500, -51706036, --60841432, -69281040, -76887432, -83512952, -89127016, -93801016, -97536560, -100308424, -102233640, -103560248, --104703784, -106144208, -107347336, -105644920, -97930088, -84797152, -71584760, -63486060, -60742648, }, -{ -12293807, -4858682, -11296838, -19100256, -3861713, 5900748, -36241472, -116374824, -146012784, -51534240, 132524440, -269747040, 229335152, 13444858, -212266944, -253539968, -85124640, 115891640, 166048272, 67431520, -38611756, --62862216, -38062000, -19412178, -5471252, 21926882, 46705620, 45556720, 28509992, 20809116, 26320634, -31532576, 29571386, 22053584, 8328479, -12683575, -36189932, -55955908, -70685496, -81685448, -89103392, --93404800, -96296392, -98277440, -98371928, -96653944, -94194000, -90911576, -86037320, -79888000, -72978472, --64399276, -52976812, -39047160, -23758686, -7796977, 8194798, 23222888, 36919540, 49907520, 62626528, -74701296, 85702848, 95545840, 103881840, 109858824, 112652696, 111763640, 106924288, 98160944, 85775328, -69952672, 50720344, 28536300, 4487167, -20426864, -45805288, -71338336, -96167000, -119163864, -139693280, --157771328, -173507552, -186629744, -196671392, -203482128, -207318608, -208383760, -206505792, -201380816, -192836512, --180638272, -164359808, -143832016, -119569744, -92430920, -63056564, -32062468, -675921, 29271276, 56125560, -79089672, 98170608, 113548736, 124903016, 131351912, 132275328, 128254168, 120941984, 111917720, 101868568, -90853592, 78939352, 66391068, 53582940, 40999756, 29189672, 18582712, 9393093, 1646046, -4900021, --10785737, -16521129, -22140556, -27170500, -30990336, -33161442, -33582888, -32519344, -30390652, -27408870, --23448374, -18280992, -11822971, -4185983, 4341675, 13386876, 22716082, 32304596, 42073500, 51706036, -60841432, 69281040, 76887432, 83512952, 89127016, 93801016, 97536560, 100308424, 102233640, 103560248, -104703784, 106144208, 107347336, 105644920, 97930088, 84797152, 71584760, 63486060, 60742648, }, -}, -{ -{ -1981054, --492311, -296353, 7187091, 20790326, 34022048, 38966628, 28556164, 110595, -35796404, -53189948, --31344672, 17328046, 52040508, 45398880, 11650099, -15445776, -22064858, -18178986, -11581916, 1719061, -21751862, 37804304, 43341052, 45074072, 50449224, 55028732, 48952428, 30137786, 5746666, -15365782, --27608050, -29608968, -24510304, -18206366, -14864882, -14263050, -13622026, -10816338, -5701032, 302258, -5457293, 9128953, 11999065, 14878304, 17986786, 21451214, 25480430, 29771102, 33561948, 36449776, -38489348, 39609800, 39572756, 38267084, 35515620, 30976914, 24654722, 17046188, 8560944, -637266, --10189273, -19688666, -29212220, -38975216, -48690432, -58008904, -67171680, -76369352, -84917944, -91841432, --96724808, -99298032, -98873904, -94944544, -87748328, -77702400, -64913060, -49656800, -32660006, -14494441, -4769025, 25049324, 45805288, 66242356, 85751704, 104195904, 121765008, 138232448, 152444496, 163098160, -169934672, 173507552, 173946176, 170681456, 163277472, 151896352, 137215616, 120472224, 103182296, 86171000, -69162936, 51720532, 34225520, 17817672, 3861176, -6618008, -13700946, -18690088, -22775674, -25758530, --26644904, -25007984, -21164526, -15672336, -9310952, -2892124, 3518115, 10589242, 18666464, 27408870, -36473936, 45634564, 54317916, 61990336, 68838128, 75240312, 80961744, 85623392, 89298816, 91926792, -92930208, 92042760, 89656368, 85938536, 80607944, 73742976, 65713000, 56356412, 45335528, 33011118, -19910932, 5942624, -8905078, -24007794, -39067024, -54445152, -69956424, -84769232, -98771896, -112544248, --126454040, -141326976, -157807840, -171961904, -174743968, -161483248, -139952048, -123136712, -116040888, }, -{ -1981054, --492311, -296353, 7187091, 20790326, 34022048, 38966628, 28556164, 110595, -35796404, -53189948, --31344672, 17328046, 52040508, 45398880, 11650099, -15445776, -22064858, -18178986, -11581916, 1719061, -21751862, 37804304, 43341052, 45074072, 50449224, 55028732, 48952428, 30137786, 5746666, -15365782, --27608050, -29608968, -24510304, -18206366, -14864882, -14263050, -13622026, -10816338, -5701032, 302258, -5457293, 9128953, 11999065, 14878304, 17986786, 21451214, 25480430, 29771102, 33561948, 36449776, -38489348, 39609800, 39572756, 38267084, 35515620, 30976914, 24654722, 17046188, 8560944, -637266, --10189273, -19688666, -29212220, -38975216, -48690432, -58008904, -67171680, -76369352, -84917944, -91841432, --96724808, -99298032, -98873904, -94944544, -87748328, -77702400, -64913060, -49656800, -32660006, -14494441, -4769025, 25049324, 45805288, 66242356, 85751704, 104195904, 121765008, 138232448, 152444496, 163098160, -169934672, 173507552, 173946176, 170681456, 163277472, 151896352, 137215616, 120472224, 103182296, 86171000, -69162936, 51720532, 34225520, 17817672, 3861176, -6618008, -13700946, -18690088, -22775674, -25758530, --26644904, -25007984, -21164526, -15672336, -9310952, -2892124, 3518115, 10589242, 18666464, 27408870, -36473936, 45634564, 54317916, 61990336, 68838128, 75240312, 80961744, 85623392, 89298816, 91926792, -92930208, 92042760, 89656368, 85938536, 80607944, 73742976, 65713000, 56356412, 45335528, 33011118, -19910932, 5942624, -8905078, -24007794, -39067024, -54445152, -69956424, -84769232, -98771896, -112544248, --126454040, -141326976, -157807840, -171961904, -174743968, -161483248, -139952048, -123136712, -116040888, }, -}, -{ -{ --12559558, --14574435, -5498632, 16103443, 36147520, 44876504, 39157216, 9365713, -46824808, -96066072, -88001736, --16486232, 61414812, 83421688, 43921408, -12003360, -39346196, -26169236, 8202851, 31455804, 21983790, --12823699, -43575664, -48513804, -31488016, -9336185, 8367133, 21562346, 31231928, 37633576, 42852500, -48321604, 51680804, 50072876, 44494252, 37884296, 31025770, 23062900, 14463839, 7116761, 2233383, --410169, -1745367, -2821257, -4539244, -7486128, -12084427, -18647138, -26852672, -35484484, -43163884, --49141944, -53194780, -55318104, -55944096, -56015500, -56391848, -57385060, -59020904, -61418568, -64698312, --68753840, -73237784, -77588048, -81048720, -82895016, -82710336, -80343808, -75721888, -68982544, -60732984, --51794620, -42591044, -33091112, -23498302, -14558329, -6819335, 45097, 6571837, 12374875, 16434692, -18544058, 19660212, 20583630, 21070572, 20794084, 20587388, 21976274, 25625922, 30747670, 36053028, -40965936, 45846092, 51298016, 57459148, 63976224, 70426728, 76528800, 82054280, 86981680, 91855392, -97594008, 104659760, 112574848, 120407264, 127569120, 134014792, 139829104, 144785488, 148304144, 149838528, -149301648, 147018880, 143219440, 137718128, 130134288, 120280024, 108341088, 94882808, 80673984, 66263828, -51684564, 36692980, 21274046, 5818607, -9044127, -22661858, -34666828, -45304388, -55281060, -65073048, --74445744, -82671144, -89063664, -93351112, -95811592, -97100624, -97800160, -98117456, -97976792, -97134984, --95189360, -91867200, -87386480, -82146080, -76163728, -69350304, -62128848, -55066848, -48134772, -41077068, --34018824, -26677652, -17796734, -7066295, 2895882, 8453569, 8887361, 6854768, 5247913, }, -{ --12559558, --14574435, -5498632, 16103443, 36147520, 44876504, 39157216, 9365713, -46824808, -96066072, -88001736, --16486232, 61414812, 83421688, 43921408, -12003360, -39346196, -26169236, 8202851, 31455804, 21983790, --12823699, -43575664, -48513804, -31488016, -9336185, 8367133, 21562346, 31231928, 37633576, 42852500, -48321604, 51680804, 50072876, 44494252, 37884296, 31025770, 23062900, 14463839, 7116761, 2233383, --410169, -1745367, -2821257, -4539244, -7486128, -12084427, -18647138, -26852672, -35484484, -43163884, --49141944, -53194780, -55318104, -55944096, -56015500, -56391848, -57385060, -59020904, -61418568, -64698312, --68753840, -73237784, -77588048, -81048720, -82895016, -82710336, -80343808, -75721888, -68982544, -60732984, --51794620, -42591044, -33091112, -23498302, -14558329, -6819335, 45097, 6571837, 12374875, 16434692, -18544058, 19660212, 20583630, 21070572, 20794084, 20587388, 21976274, 25625922, 30747670, 36053028, -40965936, 45846092, 51298016, 57459148, 63976224, 70426728, 76528800, 82054280, 86981680, 91855392, -97594008, 104659760, 112574848, 120407264, 127569120, 134014792, 139829104, 144785488, 148304144, 149838528, -149301648, 147018880, 143219440, 137718128, 130134288, 120280024, 108341088, 94882808, 80673984, 66263828, -51684564, 36692980, 21274046, 5818607, -9044127, -22661858, -34666828, -45304388, -55281060, -65073048, --74445744, -82671144, -89063664, -93351112, -95811592, -97100624, -97800160, -98117456, -97976792, -97134984, --95189360, -91867200, -87386480, -82146080, -76163728, -69350304, -62128848, -55066848, -48134772, -41077068, --34018824, -26677652, -17796734, -7066295, 2895882, 8453569, 8887361, 6854768, 5247913, }, -}, -{ -{ -1361505, --6031745, -9847823, -9656697, -14584635, -16705812, 7517267, 51822000, 60734060, -8921184, -112508280, --144351168, -58633820, 64616172, 104241544, 34482144, -56665652, -81571096, -45710800, -11709691, -7069516, --4066797, 22695144, 58683212, 76764488, 74230456, 66876400, 61739080, 51783884, 31008590, 2225867, --28280750, -55553792, -75944152, -87853016, -92936112, -93998584, -92232272, -87786448, -81435800, -74198784, --66693864, -59979220, -55700892, -54538568, -55540908, -57379152, -59228672, -60336236, -59941100, -57892936, --54546620, -50062140, -44485124, -38338488, -32506996, -27661200, -24187108, -22404160, -22473416, -24276766, --27546846, -31951336, -37052684, -42429444, -47763256, -52693344, -56783764, -59753196, -61440580, -61491584, --59418188, -55002424, -48322140, -39467528, -28609850, -16194711, -2756832, 11221139, 25089588, 38157028, -50324132, 62045096, 73466488, 84227528, 94241248, 103860360, 113180440, 122174104, 131728256, 143384256, -157529200, 172678624, 187045296, 200132592, 212350704, 223562176, 232452752, 237196016, 236600624, 230685920, -220133184, 205348832, 186409104, 163813280, 138720464, 112246288, 84862648, 56548612, 27314382, -2303176, --31074088, -57662620, -81631760, -103590320, -124196496, -143360640, -160478224, -174997904, -186710816, -195989024, --203774192, -210894704, -217387616, -222761696, -226671728, -229054368, -229952544, -229501584, -227726144, -224215552, --218468336, -210567744, -200995344, -189917008, -177224848, -162980592, -147170272, -129491656, -110055856, -89775552, --69495256, -49401252, -29626684, -10492068, 8148627, 26706106, 44885092, 61997852, 77989624, 93141736, -107788648, 123275224, 140463152, 154866864, 157063728, 142887120, 120772336, 103758896, 96604016, }, -{ -1361505, --6031745, -9847823, -9656697, -14584635, -16705812, 7517267, 51822000, 60734060, -8921184, -112508280, --144351168, -58633820, 64616172, 104241544, 34482144, -56665652, -81571096, -45710800, -11709691, -7069516, --4066797, 22695144, 58683212, 76764488, 74230456, 66876400, 61739080, 51783884, 31008590, 2225867, --28280750, -55553792, -75944152, -87853016, -92936112, -93998584, -92232272, -87786448, -81435800, -74198784, --66693864, -59979220, -55700892, -54538568, -55540908, -57379152, -59228672, -60336236, -59941100, -57892936, --54546620, -50062140, -44485124, -38338488, -32506996, -27661200, -24187108, -22404160, -22473416, -24276766, --27546846, -31951336, -37052684, -42429444, -47763256, -52693344, -56783764, -59753196, -61440580, -61491584, --59418188, -55002424, -48322140, -39467528, -28609850, -16194711, -2756832, 11221139, 25089588, 38157028, -50324132, 62045096, 73466488, 84227528, 94241248, 103860360, 113180440, 122174104, 131728256, 143384256, -157529200, 172678624, 187045296, 200132592, 212350704, 223562176, 232452752, 237196016, 236600624, 230685920, -220133184, 205348832, 186409104, 163813280, 138720464, 112246288, 84862648, 56548612, 27314382, -2303176, --31074088, -57662620, -81631760, -103590320, -124196496, -143360640, -160478224, -174997904, -186710816, -195989024, --203774192, -210894704, -217387616, -222761696, -226671728, -229054368, -229952544, -229501584, -227726144, -224215552, --218468336, -210567744, -200995344, -189917008, -177224848, -162980592, -147170272, -129491656, -110055856, -89775552, --69495256, -49401252, -29626684, -10492068, 8148627, 26706106, 44885092, 61997852, 77989624, 93141736, -107788648, 123275224, 140463152, 154866864, 157063728, 142887120, 120772336, 103758896, 96604016, }, -}, -{ -{ --3934190, --3561065, -2961380, -2469069, -3335042, -6949257, -10582799, -6585796, 5910949, 9033390, -17499844, --58110372, -59563144, 5482526, 83499536, 86628416, 1379221, -84844928, -85138064, -11901354, 51665236, -54776404, 19014894, -11911555, -22216792, -18465138, -5498632, 14854681, 35445828, 48197048, 51996484, -50291920, 45649596, 40315248, 37207300, 36641976, 35024920, 28898688, 18129056, 4440460, -10513006, --24823838, -36339180, -44009992, -48198660, -49605260, -48929340, -47307992, -45934140, -45271640, -45296872, --46153720, -47934520, -50194208, -52233244, -53628036, -54219132, -54003844, -53310208, -52730924, -52689048, --53342956, -54880020, -57467200, -60883844, -64628520, -68430104, -72297184, -76111112, -79580376, -82582560, --85147728, -87112136, -88198224, -88479544, -88365728, -88030184, -87231856, -85876800, -84408456, -83318072, --82401096, -80879600, -78321416, -75120048, -71791456, -68008656, -62799940, -55777128, -47760572, -39983460, --32998234, -26651346, -20882130, -16187195, -13293998, -12516072, -13425531, -15218143, -17527224, -20784420, --25553982, -31566936, -37652368, -42537356, -45547056, -46747496, -46730856, -46114528, -44954348, -42737072, --39073464, -34196528, -28686624, -23036594, -17581986, -12468290, -7497403, -2309619, 3184718, 8788040, -14401025, 20095078, 25889526, 31743566, 37637872, 43394740, 48620104, 53053584, 56763360, 59858960, -62368292, 64483564, 66524212, 68600288, 70713416, 73127720, 76176616, 79870824, 84172232, 89341224, -95507728, 102298608, 109355776, 116673864, 123982824, 130558952, 136096784, 140873856, 144714624, 147014576, -147960544, 147701776, 143530832, 130539624, 107595912, 81434192, 62075700, 53886272, 52787832, }, -{ --3934190, --3561065, -2961380, -2469069, -3335042, -6949257, -10582799, -6585796, 5910949, 9033390, -17499844, --58110372, -59563144, 5482526, 83499536, 86628416, 1379221, -84844928, -85138064, -11901354, 51665236, -54776404, 19014894, -11911555, -22216792, -18465138, -5498632, 14854681, 35445828, 48197048, 51996484, -50291920, 45649596, 40315248, 37207300, 36641976, 35024920, 28898688, 18129056, 4440460, -10513006, --24823838, -36339180, -44009992, -48198660, -49605260, -48929340, -47307992, -45934140, -45271640, -45296872, --46153720, -47934520, -50194208, -52233244, -53628036, -54219132, -54003844, -53310208, -52730924, -52689048, --53342956, -54880020, -57467200, -60883844, -64628520, -68430104, -72297184, -76111112, -79580376, -82582560, --85147728, -87112136, -88198224, -88479544, -88365728, -88030184, -87231856, -85876800, -84408456, -83318072, --82401096, -80879600, -78321416, -75120048, -71791456, -68008656, -62799940, -55777128, -47760572, -39983460, --32998234, -26651346, -20882130, -16187195, -13293998, -12516072, -13425531, -15218143, -17527224, -20784420, --25553982, -31566936, -37652368, -42537356, -45547056, -46747496, -46730856, -46114528, -44954348, -42737072, --39073464, -34196528, -28686624, -23036594, -17581986, -12468290, -7497403, -2309619, 3184718, 8788040, -14401025, 20095078, 25889526, 31743566, 37637872, 43394740, 48620104, 53053584, 56763360, 59858960, -62368292, 64483564, 66524212, 68600288, 70713416, 73127720, 76176616, 79870824, 84172232, 89341224, -95507728, 102298608, 109355776, 116673864, 123982824, 130558952, 136096784, 140873856, 144714624, 147014576, -147960544, 147701776, 143530832, 130539624, 107595912, 81434192, 62075700, 53886272, 52787832, }, -}, -}; -const Word32 CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[16][BINAURAL_CHANNELS][160] ={ -{ -{ --95109368, --260339440, -366612512, -408962496, -400354304, -362236480, -315098656, -258988672, -173663248, -53939956, 73996920, -186707600, 276786496, 304005312, 192871408, -46663744, -238100096, -189772592, 61389580, 255288032, 194103536, --56156696, -288527328, -394782656, -412162784, -396458240, -350214304, -268649664, -176448528, -96819304, -26412976, -43027520, 105719008, 155055296, 195263168, 231530944, 262328544, 286273536, 306256416, 324167488, 339115040, -351465760, 362808768, 372651232, 379707328, 384899392, 389586816, 393053920, 394493280, 395004928, 395505824, -395165440, 393394848, 390962272, 388219424, 384553664, 380043936, 375570208, 371227968, 366504576, 361672224, -357340736, 353217024, 348759936, 344302304, 340330528, 336536992, 332559840, 328731968, 325346464, 322093024, -318739712, 315517952, 312517920, 309469024, 306246752, 302958944, 299588992, 296042976, 292305280, 288233120, -283618176, 278650496, 273737600, 268777984, 263323904, 257488656, 251875680, 246582128, 241085648, 235180064, -229304544, 223901472, 219023472, 214540064, 210318640, 206342576, 202909824, 200431632, 198818864, 197471328, -196033584, 194752608, 193960720, 193620880, 193459824, 193164544, 192452656, 191296240, 190028688, 188915216, -187750208, 186134224, 183929296, 181221856, 178127328, 174841680, 171599520, 168378832, 164916544, 161111200, -157136752, 153130624, 149087984, 145047488, 141054240, 136985296, 132723080, 128412008, 124285080, 120380952, -116669568, 113233056, 110073568, 107003208, 103945728, 101050376, 98364416, 95750392, 93226024, 90918016, -88620208, 85932632, 82820928, 79434344, 75505528, 70683888, 65148212, 58947888, 51291036, 41580652, -29719026, 13152264, -13907104, -52447992, -89501752, -104273216, -87974888, -52846888, -16645146, }, -{ --95109368, --260339440, -366612512, -408962496, -400354304, -362236480, -315098656, -258988672, -173663248, -53939956, 73996920, -186707600, 276786496, 304005312, 192871408, -46663744, -238100096, -189772592, 61389580, 255288032, 194103536, --56156696, -288527328, -394782656, -412162784, -396458240, -350214304, -268649664, -176448528, -96819304, -26412976, -43027520, 105719008, 155055296, 195263168, 231530944, 262328544, 286273536, 306256416, 324167488, 339115040, -351465760, 362808768, 372651232, 379707328, 384899392, 389586816, 393053920, 394493280, 395004928, 395505824, -395165440, 393394848, 390962272, 388219424, 384553664, 380043936, 375570208, 371227968, 366504576, 361672224, -357340736, 353217024, 348759936, 344302304, 340330528, 336536992, 332559840, 328731968, 325346464, 322093024, -318739712, 315517952, 312517920, 309469024, 306246752, 302958944, 299588992, 296042976, 292305280, 288233120, -283618176, 278650496, 273737600, 268777984, 263323904, 257488656, 251875680, 246582128, 241085648, 235180064, -229304544, 223901472, 219023472, 214540064, 210318640, 206342576, 202909824, 200431632, 198818864, 197471328, -196033584, 194752608, 193960720, 193620880, 193459824, 193164544, 192452656, 191296240, 190028688, 188915216, -187750208, 186134224, 183929296, 181221856, 178127328, 174841680, 171599520, 168378832, 164916544, 161111200, -157136752, 153130624, 149087984, 145047488, 141054240, 136985296, 132723080, 128412008, 124285080, 120380952, -116669568, 113233056, 110073568, 107003208, 103945728, 101050376, 98364416, 95750392, 93226024, 90918016, -88620208, 85932632, 82820928, 79434344, 75505528, 70683888, 65148212, 58947888, 51291036, 41580652, -29719026, 13152264, -13907104, -52447992, -89501752, -104273216, -87974888, -52846888, -16645146, }, -}, -{ -{ -74919800, -180832624, 165589776, 3118146, -248377952, -487060032, -639470720, -670940480, -564931520, -348093152, -99012416, -133561136, 369929280, 567594944, 531079680, 136782368, -364506368, -495046528, -96676496, 437999680, 606822528, -338486368, -45694692, -282642144, -380529792, -435686848, -455061984, -412777504, -340961344, -285578816, -242132544, --187046368, -125953672, -75291312, -31372052, 15731928, 62692564, 104184632, 143963008, 184569776, 221687424, -253691376, 283860288, 311944000, 334602656, 352947520, 370293824, 385346624, 395373760, 402216160, 408895904, -414681248, 418261632, 421057120, 423908992, 425174368, 424278336, 422686528, 420456352, 416190912, 410363712, -404640672, 398671744, 391244128, 383210944, 376019552, 369106816, 361541760, 354219360, 348174752, 342842016, -337704160, 333546080, 330874624, 329060544, 327708704, 327105792, 327162144, 327442944, 327925600, 328501120, -328534400, 327920224, 327404832, 327090752, 326092704, 324246400, 322538080, 321427296, 320383072, 319275520, -318623744, 318416512, 318121792, 317643424, 317027104, 315684384, 313017760, 309172160, 304287168, 297851136, -289580128, 280034560, 269758304, 258727760, 247008944, 235039936, 223125696, 211545392, 201074800, 192465008, -185562448, 179705728, 174628000, 170326048, 166635600, 163581344, 161492912, 160217856, 158877280, 156786176, -153965456, 150613232, 146883056, 143231248, 140110416, 137296144, 134274096, 131101728, 128141960, 125304600, -122328720, 119391504, 116704464, 114009368, 111109728, 108314240, 105794168, 103213432, 100447472, 97856000, -95487864, 92946312, 90264640, 87829936, 85353888, 82145544, 78237664, 73787000, 67849744, 59486372, -48626544, 32700270, 4790499, -37725920, -81636592, -103223632, -90638840, -55671368, -17729624, }, -{ --74919800, --180832624, -165589776, -3118146, 248377952, 487060032, 639470720, 670940480, 564931520, 348093152, 99012416, --133561136, -369929280, -567594944, -531079680, -136782368, 364506368, 495046528, 96676496, -437999680, -606822528, --338486368, 45694692, 282642144, 380529792, 435686848, 455061984, 412777504, 340961344, 285578816, 242132544, -187046368, 125953672, 75291312, 31372052, -15731928, -62692564, -104184632, -143963008, -184569776, -221687424, --253691376, -283860288, -311944000, -334602656, -352947520, -370293824, -385346624, -395373760, -402216160, -408895904, --414681248, -418261632, -421057120, -423908992, -425174368, -424278336, -422686528, -420456352, -416190912, -410363712, --404640672, -398671744, -391244128, -383210944, -376019552, -369106816, -361541760, -354219360, -348174752, -342842016, --337704160, -333546080, -330874624, -329060544, -327708704, -327105792, -327162144, -327442944, -327925600, -328501120, --328534400, -327920224, -327404832, -327090752, -326092704, -324246400, -322538080, -321427296, -320383072, -319275520, --318623744, -318416512, -318121792, -317643424, -317027104, -315684384, -313017760, -309172160, -304287168, -297851136, --289580128, -280034560, -269758304, -258727760, -247008944, -235039936, -223125696, -211545392, -201074800, -192465008, --185562448, -179705728, -174628000, -170326048, -166635600, -163581344, -161492912, -160217856, -158877280, -156786176, --153965456, -150613232, -146883056, -143231248, -140110416, -137296144, -134274096, -131101728, -128141960, -125304600, --122328720, -119391504, -116704464, -114009368, -111109728, -108314240, -105794168, -103213432, -100447472, -97856000, --95487864, -92946312, -90264640, -87829936, -85353888, -82145544, -78237664, -73787000, -67849744, -59486372, --48626544, -32700270, -4790499, 37725920, 81636592, 103223632, 90638840, 55671368, 17729624, }, -}, -{ -{ --8997956, --36575404, -70057896, -75746584, -36069672, 20763482, 50795504, 39648992, 6548752, -24158118, -40223444, --36266704, -9786620, 28921772, 51592756, 33353642, -13720273, -40638444, -11729019, 48308720, 75479752, -37072012, -35640176, -89364848, -103929616, -95136208, -81471768, -67702640, -53746684, -41168336, -29545616, --16599512, -3274376, 6781754, 12052215, 13502303, 12007655, 9067750, 8138426, 12019466, 20188494, -30608084, 42454676, 55612848, 69392712, 83302504, 97821640, 113513840, 130401112, 148518896, 167913888, -187898912, 207297136, 225438544, 242095488, 256685504, 268412368, 277012512, 282643744, 285191744, 284255424, -279637792, 271346368, 259203424, 242854624, 222178128, 197471328, 169249088, 138059040, 104570104, 69709464, -34565896, 220654, -32209570, -61572652, -87062208, -108476376, -125715304, -138263584, -145782464, -149036976, --149373056, -147217520, -142017392, -133914392, -124491776, -115248472, -106034152, -95747704, -84204448, -72589240, --62194884, -53323628, -45533632, -38529076, -32577326, -28267864, -26095684, -26221850, -28418724, -32154810, --36836860, -42123964, -48040284, -54697484, -61807264, -68486472, -73672112, -76818176, -78148000, -78183440, --77134392, -74802760, -70909376, -65336116, -58133992, -49504328, -39798240, -29444148, -18872624, -8519068, -1219771, 10084583, 17916456, 24504936, 29606820, 33136210, 35232152, 36126580, 36039608, 35143568, -33567316, 31499290, 29361470, 27712202, 26908506, 26950920, 27614492, 28478318, 28897614, 28332826, -26790396, 24655796, 22099754, 18985366, 15300284, 11255499, 6929930, 2227478, -2730526, -7621420, --12545599, -18257370, -25141664, -31687194, -34493956, -30834108, -21662204, -11296838, -3238405, }, -{ --8997956, --36575404, -70057896, -75746584, -36069672, 20763482, 50795504, 39648992, 6548752, -24158118, -40223444, --36266704, -9786620, 28921772, 51592756, 33353642, -13720273, -40638444, -11729019, 48308720, 75479752, -37072012, -35640176, -89364848, -103929616, -95136208, -81471768, -67702640, -53746684, -41168336, -29545616, --16599512, -3274376, 6781754, 12052215, 13502303, 12007655, 9067750, 8138426, 12019466, 20188494, -30608084, 42454676, 55612848, 69392712, 83302504, 97821640, 113513840, 130401112, 148518896, 167913888, -187898912, 207297136, 225438544, 242095488, 256685504, 268412368, 277012512, 282643744, 285191744, 284255424, -279637792, 271346368, 259203424, 242854624, 222178128, 197471328, 169249088, 138059040, 104570104, 69709464, -34565896, 220654, -32209570, -61572652, -87062208, -108476376, -125715304, -138263584, -145782464, -149036976, --149373056, -147217520, -142017392, -133914392, -124491776, -115248472, -106034152, -95747704, -84204448, -72589240, --62194884, -53323628, -45533632, -38529076, -32577326, -28267864, -26095684, -26221850, -28418724, -32154810, --36836860, -42123964, -48040284, -54697484, -61807264, -68486472, -73672112, -76818176, -78148000, -78183440, --77134392, -74802760, -70909376, -65336116, -58133992, -49504328, -39798240, -29444148, -18872624, -8519068, -1219771, 10084583, 17916456, 24504936, 29606820, 33136210, 35232152, 36126580, 36039608, 35143568, -33567316, 31499290, 29361470, 27712202, 26908506, 26950920, 27614492, 28478318, 28897614, 28332826, -26790396, 24655796, 22099754, 18985366, 15300284, 11255499, 6929930, 2227478, -2730526, -7621420, --12545599, -18257370, -25141664, -31687194, -34493956, -30834108, -21662204, -11296838, -3238405, }, -}, -{ -{ -3337190, --525597, -24376624, -52859772, -58058296, -31161062, 1227287, 3435437, -27114666, -57911728, -62258236, --42413876, -7547332, 40961640, 82542832, 69375000, -12013560, -89047024, -66958004, 50780472, 152577632, -144016688, 43066172, -67980208, -143702096, -194733824, -235730896, -259470784, -258697152, -240774800, -214183584, --178467168, -132137352, -79065520, -24104968, 30179662, 81193136, 125873680, 163009584, 192982000, 216053504, -232919840, 245307600, 254314672, 259715056, 261763760, 261771808, 260262128, 256400960, 249691152, 240672256, -229946640, 218110784, 206570208, 196965584, 189718368, 184060816, 179179056, 174530288, 169478336, 163535168, -156792080, 149618944, 142169328, 134492064, 126790656, 119201984, 111450640, 103003520, 93563176, 83234320, -72127536, 59994252, 46582140, 32255742, 17762374, 3402151, -10920491, -24737402, -36990944, -47239272, --55982752, -63379760, -68614248, -71157944, -71792528, -71634688, -70871256, -69215008, -66949952, -64623688, --62057984, -58481348, -53521736, -47441136, -40394704, -31950262, -21505438, -8965207, 5135171, 20148766, -35888748, 52565032, 70101920, 87712896, 104364488, 119592824, 133637904, 146803056, 158875136, 169184672, -177143776, 182786288, 186896032, 190489856, 193986496, 196899552, 198414608, 198207376, 196701984, 194758512, -193220384, 192503120, 192380704, 192236288, 191645200, 190669712, 189624416, 188777232, 188268816, 188042800, -187744832, 186871344, 185077120, 182256944, 178427968, 173705120, 168274128, 162197824, 155338224, 147560048, -138878304, 129408440, 119380224, 109168408, 99096168, 89302032, 79920216, 71038760, 62386548, 53589916, -44463112, 33750388, 18118320, -4322348, -28186260, -42157788, -39511552, -25010132, -8060580, }, -{ -3337190, --525597, -24376624, -52859772, -58058296, -31161062, 1227287, 3435437, -27114666, -57911728, -62258236, --42413876, -7547332, 40961640, 82542832, 69375000, -12013560, -89047024, -66958004, 50780472, 152577632, -144016688, 43066172, -67980208, -143702096, -194733824, -235730896, -259470784, -258697152, -240774800, -214183584, --178467168, -132137352, -79065520, -24104968, 30179662, 81193136, 125873680, 163009584, 192982000, 216053504, -232919840, 245307600, 254314672, 259715056, 261763760, 261771808, 260262128, 256400960, 249691152, 240672256, -229946640, 218110784, 206570208, 196965584, 189718368, 184060816, 179179056, 174530288, 169478336, 163535168, -156792080, 149618944, 142169328, 134492064, 126790656, 119201984, 111450640, 103003520, 93563176, 83234320, -72127536, 59994252, 46582140, 32255742, 17762374, 3402151, -10920491, -24737402, -36990944, -47239272, --55982752, -63379760, -68614248, -71157944, -71792528, -71634688, -70871256, -69215008, -66949952, -64623688, --62057984, -58481348, -53521736, -47441136, -40394704, -31950262, -21505438, -8965207, 5135171, 20148766, -35888748, 52565032, 70101920, 87712896, 104364488, 119592824, 133637904, 146803056, 158875136, 169184672, -177143776, 182786288, 186896032, 190489856, 193986496, 196899552, 198414608, 198207376, 196701984, 194758512, -193220384, 192503120, 192380704, 192236288, 191645200, 190669712, 189624416, 188777232, 188268816, 188042800, -187744832, 186871344, 185077120, 182256944, 178427968, 173705120, 168274128, 162197824, 155338224, 147560048, -138878304, 129408440, 119380224, 109168408, 99096168, 89302032, 79920216, 71038760, 62386548, 53589916, -44463112, 33750388, 18118320, -4322348, -28186260, -42157788, -39511552, -25010132, -8060580, }, -}, -{ -{ --2301566, --2214593, 5727876, 13223131, 10465762, 513785, -4172024, -2193655, -10200010, -42254960, -87792352, --113481624, -84174920, 7027640, 111054432, 138495520, 44058312, -97946728, -146072368, -43659416, 114249888, -190329328, 147693184, 52002928, -32975686, -99015640, -155720480, -194640400, -205525456, -195984192, -178432272, --154529168, -122307248, -85534808, -48135308, -8592619, 34183108, 75675176, 110118128, 135565808, 152853056, -163407392, 169358608, 173025440, 175466592, 176900576, 177918480, 178836000, 178791968, 176883392, 173388368, -168980112, 163797168, 158085936, 152720448, 148354080, 144822544, 141771504, 139110240, 136628816, 133912248, -130783368, 127244312, 123018064, 117765320, 111654120, 105082816, 97930624, 89697704, 80315888, 70161512, -59257664, 47110960, 33521146, 18984292, 4003983, -11500312, -27609124, -43575664, -58267672, -71399000, --83637512, -95267744, -105480104, -113548736, -120113592, -126386392, -132302176, -136444128, -137903888, -137277360, --135506224, -132569536, -127873528, -121401544, -113898776, -106172664, -98556616, -90922312, -83046952, -75074952, --67602248, -61177516, -55893092, -51618528, -48250736, -45432164, -42456288, -38915088, -35148940, -31722628, --28767690, -26016228, -23027468, -19238232, -14357002, -8902930, -3870839, 246961, 3717831, 7033546, -10645613, 14998563, 20207822, 25861608, 31578748, 37455872, 43646532, 49981608, 56273736, 62394064, -67841696, 71890776, 74301320, 75271448, 74821552, 72951632, 70109432, 66714800, 62621696, 57782880, -52841520, 48412872, 44589812, 41679972, 40359808, 40643812, 41889888, 44006772, 47257524, 51142860, -55154360, 59654412, 63366336, 61291332, 49220324, 30265024, 13108777, 3496104, 413391, }, -{ -2301566, -2214593, -5727876, -13223131, -10465762, -513785, 4172024, 2193655, 10200010, 42254960, 87792352, -113481624, 84174920, -7027640, -111054432, -138495520, -44058312, 97946728, 146072368, 43659416, -114249888, --190329328, -147693184, -52002928, 32975686, 99015640, 155720480, 194640400, 205525456, 195984192, 178432272, -154529168, 122307248, 85534808, 48135308, 8592619, -34183108, -75675176, -110118128, -135565808, -152853056, --163407392, -169358608, -173025440, -175466592, -176900576, -177918480, -178836000, -178791968, -176883392, -173388368, --168980112, -163797168, -158085936, -152720448, -148354080, -144822544, -141771504, -139110240, -136628816, -133912248, --130783368, -127244312, -123018064, -117765320, -111654120, -105082816, -97930624, -89697704, -80315888, -70161512, --59257664, -47110960, -33521146, -18984292, -4003983, 11500312, 27609124, 43575664, 58267672, 71399000, -83637512, 95267744, 105480104, 113548736, 120113592, 126386392, 132302176, 136444128, 137903888, 137277360, -135506224, 132569536, 127873528, 121401544, 113898776, 106172664, 98556616, 90922312, 83046952, 75074952, -67602248, 61177516, 55893092, 51618528, 48250736, 45432164, 42456288, 38915088, 35148940, 31722628, -28767690, 26016228, 23027468, 19238232, 14357002, 8902930, 3870839, -246961, -3717831, -7033546, --10645613, -14998563, -20207822, -25861608, -31578748, -37455872, -43646532, -49981608, -56273736, -62394064, --67841696, -71890776, -74301320, -75271448, -74821552, -72951632, -70109432, -66714800, -62621696, -57782880, --52841520, -48412872, -44589812, -41679972, -40359808, -40643812, -41889888, -44006772, -47257524, -51142860, --55154360, -59654412, -63366336, -61291332, -49220324, -30265024, -13108777, -3496104, -413391, }, -}, -{ -{ --11621645, --12662637, 12901008, 18407156, -12460774, -26243860, 22013854, 87203944, 81292992, -10214506, -105698072, --122505888, -56635048, 34244312, 87755312, 70377872, -3514894, -68105296, -56239376, 24912958, 94054416, -88859656, 32216012, -11744588, -16888348, -3045132, 10651519, 24802900, 40087076, 47873852, 43004972, -29452738, 11979201, -7521562, -26468810, -42553464, -57022672, -71507984, -83610128, -89570472, -88812944, --83004536, -73455752, -61811560, -50697256, -41634340, -33958696, -26524108, -18781892, -10123238, -8590, -11195369, 22897008, 35459248, 49500572, 64513092, 79195440, 92606472, 104193760, 113225536, 118956096, -121067072, 119553632, 114368000, 105315816, 92148520, 74772160, 53405232, 28428388, 200790, -30688616, --63127428, -95725160, -127184720, -156271312, -181872544, -203371536, -220521344, -232880112, -240076864, -242724176, --242090128, -238572016, -231492288, -220755952, -207650400, -193449088, -178148272, -161212672, -142750752, -123226904, --102581000, -80419504, -56811144, -32329830, -7428146, 17716740, 42713448, 66690640, 88742616, 108476376, -125886032, 140656416, 151783072, 158158416, 159679360, 157684352, 154043296, 149673168, 144014544, 136032352, -125606856, 113885888, 102469328, 92425008, 83886080, 76293648, 69045360, 62086436, 55886652, 50864760, -46990164, 43880608, 41015864, 37846180, 33997888, 29450054, 24321862, 18562312, 12101607, 5170067, --1821603, -8575439, -14845554, -20320028, -24818468, -28407450, -31151934, -33056752, -34331820, -35319128, --36078264, -36451924, -36548024, -36649492, -36703180, -36425616, -35817880, -35015256, -33838436, -32111860, --30125974, -27972048, -24702504, -19210314, -12044699, -5477157, -1440962, 21475, 118112, }, -{ -11621645, -12662637, -12901008, -18407156, 12460774, 26243860, -22013854, -87203944, -81292992, 10214506, 105698072, -122505888, 56635048, -34244312, -87755312, -70377872, 3514894, 68105296, 56239376, -24912958, -94054416, --88859656, -32216012, 11744588, 16888348, 3045132, -10651519, -24802900, -40087076, -47873852, -43004972, --29452738, -11979201, 7521562, 26468810, 42553464, 57022672, 71507984, 83610128, 89570472, 88812944, -83004536, 73455752, 61811560, 50697256, 41634340, 33958696, 26524108, 18781892, 10123238, 8590, --11195369, -22897008, -35459248, -49500572, -64513092, -79195440, -92606472, -104193760, -113225536, -118956096, --121067072, -119553632, -114368000, -105315816, -92148520, -74772160, -53405232, -28428388, -200790, 30688616, -63127428, 95725160, 127184720, 156271312, 181872544, 203371536, 220521344, 232880112, 240076864, 242724176, -242090128, 238572016, 231492288, 220755952, 207650400, 193449088, 178148272, 161212672, 142750752, 123226904, -102581000, 80419504, 56811144, 32329830, 7428146, -17716740, -42713448, -66690640, -88742616, -108476376, --125886032, -140656416, -151783072, -158158416, -159679360, -157684352, -154043296, -149673168, -144014544, -136032352, --125606856, -113885888, -102469328, -92425008, -83886080, -76293648, -69045360, -62086436, -55886652, -50864760, --46990164, -43880608, -41015864, -37846180, -33997888, -29450054, -24321862, -18562312, -12101607, -5170067, -1821603, 8575439, 14845554, 20320028, 24818468, 28407450, 31151934, 33056752, 34331820, 35319128, -36078264, 36451924, 36548024, 36649492, 36703180, 36425616, 35817880, 35015256, 33838436, 32111860, -30125974, 27972048, 24702504, 19210314, 12044699, 5477157, 1440962, -21475, -118112, }, -}, -{ -{ -1937567, --3154117, -18935438, -27222040, -21792128, -18682034, -23860690, -13433584, 36628556, 116389320, 188753072, -209408640, 135242080, -38696580, -218963344, -247807264, -70661872, 158391952, 221414688, 82856360, -86350856, --131750272, -72441064, -11758547, 14289893, 35926864, 60059212, 59903520, 32535452, 7328288, 1085016, -3496640, 4161287, 4872104, 6293738, 3827353, -2916820, -9754944, -15612206, -22289270, -29783450, --37481104, -46116136, -55024972, -61679488, -65843996, -69907576, -74480640, -77953656, -80207440, -82614232, --84932976, -85723256, -84875000, -82906288, -79136920, -72829224, -64595772, -55052352, -43778064, -30610768, --16187732, -662499, 16342887, 34379604, 52403968, 70061656, 87236152, 102935336, 116032840, 126399280, -134149544, 138639936, 139153184, 135712384, 128561256, 117670296, 103120016, 85248120, 64397128, 41117332, -16299938, -9499394, -36297844, -63786708, -90999616, -117286968, -142710496, -167188576, -190247728, -211719872, --231499280, -248521840, -261161936, -268768320, -271836544, -270715008, -265027392, -254280320, -238480208, -218527936, --196458240, -174670416, -154414816, -135574400, -118126632, -103066328, -91683056, -84716080, -82332912, -84169544, --89245664, -96442952, -105115032, -114949968, -125577328, -136683040, -148025504, -158953520, -168424992, -175831664, --181361968, -185451856, -188442224, -190755072, -192722704, -194242576, -195153120, -195759248, -196429248, -196955392, --196885056, -196125392, -194752608, -192678144, -189928816, -186760752, -183132032, -178535344, -172533136, -164956272, --155636192, -144592224, -132347808, -119421568, -105817256, -91629368, -77513424, -63801740, -50008988, -35935992, --21733608, -5660230, 15737834, 41821172, 63403380, 68656664, 54958400, 31762356, 9776956, }, -{ -1937567, --3154117, -18935438, -27222040, -21792128, -18682034, -23860690, -13433584, 36628556, 116389320, 188753072, -209408640, 135242080, -38696580, -218963344, -247807264, -70661872, 158391952, 221414688, 82856360, -86350856, --131750272, -72441064, -11758547, 14289893, 35926864, 60059212, 59903520, 32535452, 7328288, 1085016, -3496640, 4161287, 4872104, 6293738, 3827353, -2916820, -9754944, -15612206, -22289270, -29783450, --37481104, -46116136, -55024972, -61679488, -65843996, -69907576, -74480640, -77953656, -80207440, -82614232, --84932976, -85723256, -84875000, -82906288, -79136920, -72829224, -64595772, -55052352, -43778064, -30610768, --16187732, -662499, 16342887, 34379604, 52403968, 70061656, 87236152, 102935336, 116032840, 126399280, -134149544, 138639936, 139153184, 135712384, 128561256, 117670296, 103120016, 85248120, 64397128, 41117332, -16299938, -9499394, -36297844, -63786708, -90999616, -117286968, -142710496, -167188576, -190247728, -211719872, --231499280, -248521840, -261161936, -268768320, -271836544, -270715008, -265027392, -254280320, -238480208, -218527936, --196458240, -174670416, -154414816, -135574400, -118126632, -103066328, -91683056, -84716080, -82332912, -84169544, --89245664, -96442952, -105115032, -114949968, -125577328, -136683040, -148025504, -158953520, -168424992, -175831664, --181361968, -185451856, -188442224, -190755072, -192722704, -194242576, -195153120, -195759248, -196429248, -196955392, --196885056, -196125392, -194752608, -192678144, -189928816, -186760752, -183132032, -178535344, -172533136, -164956272, --155636192, -144592224, -132347808, -119421568, -105817256, -91629368, -77513424, -63801740, -50008988, -35935992, --21733608, -5660230, 15737834, 41821172, 63403380, 68656664, 54958400, 31762356, 9776956, }, -}, -{ -{ --19097036, --44097504, -38590820, -1660005, 54663660, 102884864, 104016056, 40863928, -49285824, -99553584, -81158776, --28471338, 10191957, 23523000, 25673168, 19345606, -1676111, -25376814, -27127014, -3715684, 20526722, -26368414, 20985210, 20455318, 25950192, 26894548, 17848274, 1888175, -17679696, -39755828, -61020212, --76006424, -82653960, -84203904, -84907208, -86058800, -86341728, -83818968, -76833744, -64608656, -48231944, --30523796, -14159433, -113280, 11897596, 22209812, 31049392, 38930120, 46360952, 53340272, 59653876, -65395708, 70720392, 75431440, 79288856, 82416128, 84936736, 86519968, 86708408, 85507432, 83341696, -80612240, 77582680, 74634720, 72403488, 71481680, 71932112, 73285560, 75244608, 78113640, 82169168, -86955368, 91811904, 96782256, 102250288, 107901392, 112794432, 116279800, 118151328, 118082608, 115535696, -110136384, 101798776, 90710248, 77292768, 61738008, 43687332, 23098334, 1181653, -20657718, -42777876, --66949412, -93851480, -122040424, -149661888, -176182240, -202011104, -227126992, -250505040, -270749376, -287239360, --300546784, -311384064, -319296992, -323081408, -322467232, -318624832, -312945824, -305905824, -297029216, -285386624, --270367648, -252524752, -233423424, -214297392, -195262096, -176031376, -156713696, -137660144, -119254064, -102028560, --86310056, -71721656, -57650808, -44007308, -30907122, -18028662, -4916664, 8523363, 22249004, 36105104, -49336828, 61008936, 71157408, 80641232, 89880784, 98731096, 107202384, 115066472, 121261960, 125000728, -126878704, 127838624, 127981976, 127339872, 126459408, 125247688, 122752312, 118818120, 114362632, 109850768, -105385072, 101484168, 96779032, 86209656, 66095788, 40770512, 19630148, 7509751, 1865090, }, -{ --19097036, --44097504, -38590820, -1660005, 54663660, 102884864, 104016056, 40863928, -49285824, -99553584, -81158776, --28471338, 10191957, 23523000, 25673168, 19345606, -1676111, -25376814, -27127014, -3715684, 20526722, -26368414, 20985210, 20455318, 25950192, 26894548, 17848274, 1888175, -17679696, -39755828, -61020212, --76006424, -82653960, -84203904, -84907208, -86058800, -86341728, -83818968, -76833744, -64608656, -48231944, --30523796, -14159433, -113280, 11897596, 22209812, 31049392, 38930120, 46360952, 53340272, 59653876, -65395708, 70720392, 75431440, 79288856, 82416128, 84936736, 86519968, 86708408, 85507432, 83341696, -80612240, 77582680, 74634720, 72403488, 71481680, 71932112, 73285560, 75244608, 78113640, 82169168, -86955368, 91811904, 96782256, 102250288, 107901392, 112794432, 116279800, 118151328, 118082608, 115535696, -110136384, 101798776, 90710248, 77292768, 61738008, 43687332, 23098334, 1181653, -20657718, -42777876, --66949412, -93851480, -122040424, -149661888, -176182240, -202011104, -227126992, -250505040, -270749376, -287239360, --300546784, -311384064, -319296992, -323081408, -322467232, -318624832, -312945824, -305905824, -297029216, -285386624, --270367648, -252524752, -233423424, -214297392, -195262096, -176031376, -156713696, -137660144, -119254064, -102028560, --86310056, -71721656, -57650808, -44007308, -30907122, -18028662, -4916664, 8523363, 22249004, 36105104, -49336828, 61008936, 71157408, 80641232, 89880784, 98731096, 107202384, 115066472, 121261960, 125000728, -126878704, 127838624, 127981976, 127339872, 126459408, 125247688, 122752312, 118818120, 114362632, 109850768, -105385072, 101484168, 96779032, 86209656, 66095788, 40770512, 19630148, 7509751, 1865090, }, -}, -{ -{ -22844394, -32909650, -15393163, -77620800, -120804008, -153344832, -163214656, -98879272, 52478596, 224605856, 341776864, -367739936, 261556528, -9730785, -335662976, -447413184, -189512752, 232476912, 428876096, 256723088, -56909928, --233360064, -236784768, -198009264, -186468160, -170963328, -131196752, -92145840, -64961380, -31695248, 12736726, -52081848, 79310864, 101933536, 121239944, 130664176, 129902360, 123666600, 112332184, 95456720, 77654080, -62691492, 48531520, 33186676, 18509698, 5400385, -7770670, -20495048, -30122216, -36809480, -43242268, --50261316, -57106960, -64260764, -72339064, -80247704, -87148104, -93848792, -100525856, -105907448, -109747152, --113176144, -116183160, -117611776, -117537688, -116905792, -115390736, -112120656, -107663552, -103142568, -98513664, --93455808, -88604640, -84488448, -80620832, -76587320, -72689640, -69058240, -65542276, -62505732, -60363080, --58583892, -56403120, -53912040, -51351704, -48185240, -43943956, -39109972, -34375844, -29983704, -26271778, --23819352, -22798760, -23212150, -25606596, -30336428, -36339720, -41874320, -46194520, -49443664, -51316268, --50843824, -47189880, -40026412, -29606284, -16843788, -2742874, 12445205, 28867012, 45981384, 62622772, -78007880, 91937000, 104316168, 115215720, 125001264, 133735616, 140881376, 146136256, 150063472, 153525216, -157035808, 160791760, 164606240, 167716864, 169412832, 169911056, 170004464, 170063520, 170014128, 169894416, -169681808, 168951664, 167393664, 165290736, 162986496, 160383744, 157356864, 154039536, 150337280, 145769584, -140077680, 133437120, 125952064, 117530704, 108336256, 98785856, 89065272, 79058000, 68738808, 58292908, -47700444, 36189396, 22434224, 6406481, -8493835, -16772384, -16004122, -9655623, -2934537, }, -{ -22844394, -32909650, -15393163, -77620800, -120804008, -153344832, -163214656, -98879272, 52478596, 224605856, 341776864, -367739936, 261556528, -9730785, -335662976, -447413184, -189512752, 232476912, 428876096, 256723088, -56909928, --233360064, -236784768, -198009264, -186468160, -170963328, -131196752, -92145840, -64961380, -31695248, 12736726, -52081848, 79310864, 101933536, 121239944, 130664176, 129902360, 123666600, 112332184, 95456720, 77654080, -62691492, 48531520, 33186676, 18509698, 5400385, -7770670, -20495048, -30122216, -36809480, -43242268, --50261316, -57106960, -64260764, -72339064, -80247704, -87148104, -93848792, -100525856, -105907448, -109747152, --113176144, -116183160, -117611776, -117537688, -116905792, -115390736, -112120656, -107663552, -103142568, -98513664, --93455808, -88604640, -84488448, -80620832, -76587320, -72689640, -69058240, -65542276, -62505732, -60363080, --58583892, -56403120, -53912040, -51351704, -48185240, -43943956, -39109972, -34375844, -29983704, -26271778, --23819352, -22798760, -23212150, -25606596, -30336428, -36339720, -41874320, -46194520, -49443664, -51316268, --50843824, -47189880, -40026412, -29606284, -16843788, -2742874, 12445205, 28867012, 45981384, 62622772, -78007880, 91937000, 104316168, 115215720, 125001264, 133735616, 140881376, 146136256, 150063472, 153525216, -157035808, 160791760, 164606240, 167716864, 169412832, 169911056, 170004464, 170063520, 170014128, 169894416, -169681808, 168951664, 167393664, 165290736, 162986496, 160383744, 157356864, 154039536, 150337280, 145769584, -140077680, 133437120, 125952064, 117530704, 108336256, 98785856, 89065272, 79058000, 68738808, 58292908, -47700444, 36189396, 22434224, 6406481, -8493835, -16772384, -16004122, -9655623, -2934537, }, -}, -{ -{ -2709588, -11341935, 24164022, 37824168, 48972292, 42486352, -3062849, -79568568, -149920128, -196602672, -214368256, --144205680, 77959560, 347087040, 392520288, 92602720, -296709216, -393664896, -139867216, 160926512, 242814896, -146233968, 54702316, 31922882, 18806588, -16871168, -45679124, -50996296, -50842212, -54457500, -50628536, --35736812, -20008642, -9170292, -780610, 5867462, 9701257, 12484933, 15276662, 15848429, 13904420, -12628278, 12879533, 12058658, 9613211, 7916699, 7660611, 7406671, 7144141, 8097087, 9909026, -11210938, 11767674, 11806328, 10767483, 8333311, 5125507, 1481227, -2884071, -7704635, -12288438, --16731045, -21560198, -26567594, -31265752, -35827544, -40514428, -44970456, -48920216, -52687436, -56478820, --60071560, -63505924, -67145368, -70923328, -74355008, -77193448, -79366160, -80595600, -80738408, -80030808, --78453480, -75420160, -70591544, -64421288, -57504244, -49912352, -41438380, -32058710, -22058416, -12040941, --2745021, 5396090, 12326556, 17893908, 21741662, 23833848, 24593520, 24358908, 23168664, 21221434, -19105088, 17416092, 16371342, 15782931, 15292768, 14787572, 14678051, 15534897, 17454210, 20044076, -22972170, 26204670, 29848948, 34091304, 39089036, 44647260, 50229644, 55514064, 60679296, 66076460, -71948216, 78428248, 85371600, 92261800, 98683320, 104746736, 110726944, 116595480, 122185912, 127372624, -131826504, 135100336, 137170512, 138383840, 138876160, 138605568, 137763760, 136496752, 134513008, 131615512, -128205312, 124721016, 121202368, 117805048, 114904336, 112378360, 109732120, 106923744, 104035920, 100594576, -96302832, 90974384, 82011328, 64709052, 38907036, 13247827, -1968169, -5075578, -2077154, }, -{ --2709588, --11341935, -24164022, -37824168, -48972292, -42486352, 3062849, 79568568, 149920128, 196602672, 214368256, -144205680, -77959560, -347087040, -392520288, -92602720, 296709216, 393664896, 139867216, -160926512, -242814896, --146233968, -54702316, -31922882, -18806588, 16871168, 45679124, 50996296, 50842212, 54457500, 50628536, -35736812, 20008642, 9170292, 780610, -5867462, -9701257, -12484933, -15276662, -15848429, -13904420, --12628278, -12879533, -12058658, -9613211, -7916699, -7660611, -7406671, -7144141, -8097087, -9909026, --11210938, -11767674, -11806328, -10767483, -8333311, -5125507, -1481227, 2884071, 7704635, 12288438, -16731045, 21560198, 26567594, 31265752, 35827544, 40514428, 44970456, 48920216, 52687436, 56478820, -60071560, 63505924, 67145368, 70923328, 74355008, 77193448, 79366160, 80595600, 80738408, 80030808, -78453480, 75420160, 70591544, 64421288, 57504244, 49912352, 41438380, 32058710, 22058416, 12040941, -2745021, -5396090, -12326556, -17893908, -21741662, -23833848, -24593520, -24358908, -23168664, -21221434, --19105088, -17416092, -16371342, -15782931, -15292768, -14787572, -14678051, -15534897, -17454210, -20044076, --22972170, -26204670, -29848948, -34091304, -39089036, -44647260, -50229644, -55514064, -60679296, -66076460, --71948216, -78428248, -85371600, -92261800, -98683320, -104746736, -110726944, -116595480, -122185912, -127372624, --131826504, -135100336, -137170512, -138383840, -138876160, -138605568, -137763760, -136496752, -134513008, -131615512, --128205312, -124721016, -121202368, -117805048, -114904336, -112378360, -109732120, -106923744, -104035920, -100594576, --96302832, -90974384, -82011328, -64709052, -38907036, -13247827, 1968169, 5075578, 2077154, }, -}, -{ -{ -1752347, -2318209, -3129421, -13364328, -22068078, -13906030, 23338316, 68938520, 71941240, 11290395, -61519500, --75093208, -26613228, 19918984, 22327388, 4521527, 2712272, 10649908, 3675955, -14254996, -20063402, --11353209, -6714108, -12883291, -16463683, -7989176, 4802847, 10709501, 8565775, 3003256, -3887482, --12086038, -20115480, -25625922, -27375584, -25383256, -20718922, -15309948, -10429254, -5472862, 678068, -7601555, 13700946, 17974976, 20415590, 21309480, 21220360, 21272436, 22553410, 25330106, 29222420, -33808372, 38672424, 43266428, 47165720, 50313396, 52808232, 54654532, 55847996, 56485264, 56649544, -56301116, 55363740, 53883048, 52083996, 50264004, 48584672, 47058884, 45802604, 45097156, 45042932, -45411764, 46103788, 47441672, 49701360, 52670256, 56014428, 59743532, 63888712, 68016176, 71476312, -73917464, 75246752, 75291848, 73703248, 69972536, 63533304, 54155780, 42167452, 27892592, 11008001, --9009768, -31874026, -56412784, -81407344, -106045960, -129645200, -151357328, -170186464, -185207040, -196040560, --203181488, -207441008, -209008672, -207558592, -203382800, -197860560, -192569696, -188201712, -184324432, -179907056, --174222672, -167572976, -161031216, -155325344, -150254592, -145263312, -140111504, -134852848, -129680632, -124933616, --120787904, -116880016, -112634440, -107862736, -102680320, -97099544, -91144576, -85032296, -78863656, -72510856, --66088272, -60015188, -54439248, -49138184, -44054016, -39272644, -34603476, -29887604, -25502978, -21810918, --18476412, -15020574, -11469173, -7778723, -3459059, 1539209, 6551436, 11398843, 16697759, 22694608, -29481192, 38444252, 50652696, 62598612, 66469452, 57299160, 38711076, 19604916, 5549098, }, -{ --1752347, --2318209, 3129421, 13364328, 22068078, 13906030, -23338316, -68938520, -71941240, -11290395, 61519500, -75093208, 26613228, -19918984, -22327388, -4521527, -2712272, -10649908, -3675955, 14254996, 20063402, -11353209, 6714108, 12883291, 16463683, 7989176, -4802847, -10709501, -8565775, -3003256, 3887482, -12086038, 20115480, 25625922, 27375584, 25383256, 20718922, 15309948, 10429254, 5472862, -678068, --7601555, -13700946, -17974976, -20415590, -21309480, -21220360, -21272436, -22553410, -25330106, -29222420, --33808372, -38672424, -43266428, -47165720, -50313396, -52808232, -54654532, -55847996, -56485264, -56649544, --56301116, -55363740, -53883048, -52083996, -50264004, -48584672, -47058884, -45802604, -45097156, -45042932, --45411764, -46103788, -47441672, -49701360, -52670256, -56014428, -59743532, -63888712, -68016176, -71476312, --73917464, -75246752, -75291848, -73703248, -69972536, -63533304, -54155780, -42167452, -27892592, -11008001, -9009768, 31874026, 56412784, 81407344, 106045960, 129645200, 151357328, 170186464, 185207040, 196040560, -203181488, 207441008, 209008672, 207558592, 203382800, 197860560, 192569696, 188201712, 184324432, 179907056, -174222672, 167572976, 161031216, 155325344, 150254592, 145263312, 140111504, 134852848, 129680632, 124933616, -120787904, 116880016, 112634440, 107862736, 102680320, 97099544, 91144576, 85032296, 78863656, 72510856, -66088272, 60015188, 54439248, 49138184, 44054016, 39272644, 34603476, 29887604, 25502978, 21810918, -18476412, 15020574, 11469173, 7778723, 3459059, -1539209, -6551436, -11398843, -16697759, -22694608, --29481192, -38444252, -50652696, -62598612, -66469452, -57299160, -38711076, -19604916, -5549098, }, -}, -{ -{ -6022081, -17711372, 19808926, 5702106, -1069984, 26598732, 60575144, 30136174, -86081344, -207033536, -210641296, --51190104, 176310560, 291438752, 184795264, -56688200, -214403696, -161382320, 9672266, 114938696, 91175176, -20908974, -15001247, -22431004, -32042604, -34917012, -13038984, 17381196, 29633126, 25831544, 26075820, -37205156, 52308408, 67342936, 81734840, 91005528, 90618976, 82400024, 70903464, 57972396, 44236552, -31173410, 19136764, 6932077, -5563594, -17260400, -28190554, -39239896, -50185620, -60355564, -70269424, --80538688, -90162104, -97526896, -102055400, -103766408, -102488656, -98518496, -92877592, -86127520, -77828032, --67520104, -55291800, -41150620, -24761024, -6062347, 14438606, 35991288, 57763016, 78866336, 98627480, -116608896, 132132520, 144197088, 152177664, 156192928, 156476400, 152789168, 144825216, 132918504, 117959664, -100683696, 81301584, 59863256, 36761700, 12690018, -11863773, -36840080, -62242128, -87801480, -113138032, --137922672, -161553040, -182911920, -200827840, -214623280, -223893968, -227962912, -226051648, -218062464, -204918800, --188054064, -168620960, -147109072, -123661776, -98896992, -74404400, -52142512, -33224256, -17482128, -4221416, -6915971, 15874736, 22513682, 26737782, 28529858, 28082106, 25817048, 22249004, 17916456, 13336410, -8747238, 3869229, -1880122, -8884140, -17067664, -25989920, -35050692, -43759276, -51981452, -59895468, --67640904, -75084616, -81900192, -87727392, -92288648, -95513096, -97520992, -98360656, -97869416, -95914136, --92604864, -88149368, -82709792, -76492296, -69763152, -62685048, -55346560, -47927540, -40649716, -33641940, --26855356, -19616726, -10412611, 1456531, 13294534, 19794430, 18117782, 11077258, 3459059, }, -{ --6022081, --17711372, -19808926, -5702106, 1069984, -26598732, -60575144, -30136174, 86081344, 207033536, 210641296, -51190104, -176310560, -291438752, -184795264, 56688200, 214403696, 161382320, -9672266, -114938696, -91175176, --20908974, 15001247, 22431004, 32042604, 34917012, 13038984, -17381196, -29633126, -25831544, -26075820, --37205156, -52308408, -67342936, -81734840, -91005528, -90618976, -82400024, -70903464, -57972396, -44236552, --31173410, -19136764, -6932077, 5563594, 17260400, 28190554, 39239896, 50185620, 60355564, 70269424, -80538688, 90162104, 97526896, 102055400, 103766408, 102488656, 98518496, 92877592, 86127520, 77828032, -67520104, 55291800, 41150620, 24761024, 6062347, -14438606, -35991288, -57763016, -78866336, -98627480, --116608896, -132132520, -144197088, -152177664, -156192928, -156476400, -152789168, -144825216, -132918504, -117959664, --100683696, -81301584, -59863256, -36761700, -12690018, 11863773, 36840080, 62242128, 87801480, 113138032, -137922672, 161553040, 182911920, 200827840, 214623280, 223893968, 227962912, 226051648, 218062464, 204918800, -188054064, 168620960, 147109072, 123661776, 98896992, 74404400, 52142512, 33224256, 17482128, 4221416, --6915971, -15874736, -22513682, -26737782, -28529858, -28082106, -25817048, -22249004, -17916456, -13336410, --8747238, -3869229, 1880122, 8884140, 17067664, 25989920, 35050692, 43759276, 51981452, 59895468, -67640904, 75084616, 81900192, 87727392, 92288648, 95513096, 97520992, 98360656, 97869416, 95914136, -92604864, 88149368, 82709792, 76492296, 69763152, 62685048, 55346560, 47927540, 40649716, 33641940, -26855356, 19616726, 10412611, -1456531, -13294534, -19794430, -18117782, -11077258, -3459059, }, -}, -{ -{ -44560, -2703682, 9866077, 17234630, 17793512, 7589207, -12143483, -35052840, -48142824, -35460324, 5149129, -48207788, 57437136, 24556476, -18523120, -35033512, -21419538, 41876, 15292231, 27706834, 38851200, -40580460, 29954712, 16558173, 8228621, 3758, -16033113, -37292664, -53191560, -56425668, -47314972, --30891552, -13847511, -1938641, 3282429, 4975183, 7279433, 11693585, 16974248, 21048560, 22660248, -22146998, 20931524, 20030116, 19392852, 18677740, 17743584, 16189879, 13386876, 9232032, 4176856, --1509681, -7846905, -14711874, -21900038, -29304024, -36559300, -42951284, -48014512, -51728048, -54012436, --54712516, -54047332, -52337936, -49394808, -44904420, -39068096, -32057100, -23302882, -12154221, 1221918, -16305843, 32928978, 50787988, 68921880, 86341728, 102611600, 117358368, 129918464, 139881184, 147379120, -152497104, 154865248, 154043296, 149988848, 143081472, 133786624, 122117728, 107490144, 89568856, 69164008, -47685948, 25841744, 3575024, -18859202, -40482752, -60081760, -76539536, -89067424, -97762048, -103586024, --107260904, -108474232, -106427144, -100741680, -91825864, -80963352, -69916160, -59686624, -49751292, -39126616, --27851252, -16859358, -6990060, 1244467, 7595113, 12449500, 16635482, 20393042, 23147726, 24417962, -24137180, 22142168, 18325552, 13180718, 7290707, 540092, -7393786, -16309601, -25978646, -36615668, --48160544, -59928216, -71496176, -83015816, -94371168, -105088720, -115143776, -124732832, -133423160, -140608640, --146365504, -150849984, -153621856, -154467968, -153848944, -151803472, -147736672, -141726400, -134540384, -126354176, --116902568, -105653512, -89784680, -65000572, -32832340, -4391067, 9228811, 8695698, 2960843, }, -{ -44560, -2703682, 9866077, 17234630, 17793512, 7589207, -12143483, -35052840, -48142824, -35460324, 5149129, -48207788, 57437136, 24556476, -18523120, -35033512, -21419538, 41876, 15292231, 27706834, 38851200, -40580460, 29954712, 16558173, 8228621, 3758, -16033113, -37292664, -53191560, -56425668, -47314972, --30891552, -13847511, -1938641, 3282429, 4975183, 7279433, 11693585, 16974248, 21048560, 22660248, -22146998, 20931524, 20030116, 19392852, 18677740, 17743584, 16189879, 13386876, 9232032, 4176856, --1509681, -7846905, -14711874, -21900038, -29304024, -36559300, -42951284, -48014512, -51728048, -54012436, --54712516, -54047332, -52337936, -49394808, -44904420, -39068096, -32057100, -23302882, -12154221, 1221918, -16305843, 32928978, 50787988, 68921880, 86341728, 102611600, 117358368, 129918464, 139881184, 147379120, -152497104, 154865248, 154043296, 149988848, 143081472, 133786624, 122117728, 107490144, 89568856, 69164008, -47685948, 25841744, 3575024, -18859202, -40482752, -60081760, -76539536, -89067424, -97762048, -103586024, --107260904, -108474232, -106427144, -100741680, -91825864, -80963352, -69916160, -59686624, -49751292, -39126616, --27851252, -16859358, -6990060, 1244467, 7595113, 12449500, 16635482, 20393042, 23147726, 24417962, -24137180, 22142168, 18325552, 13180718, 7290707, 540092, -7393786, -16309601, -25978646, -36615668, --48160544, -59928216, -71496176, -83015816, -94371168, -105088720, -115143776, -124732832, -133423160, -140608640, --146365504, -150849984, -153621856, -154467968, -153848944, -151803472, -147736672, -141726400, -134540384, -126354176, --116902568, -105653512, -89784680, -65000572, -32832340, -4391067, 9228811, 8695698, 2960843, }, -}, -{ -{ -1759326, -11070278, 25192130, 28666760, 14779519, -9762461, -40301824, -69774432, -71958952, -22061636, 57765700, -103101760, 74360376, 1267552, -52283712, -52460880, -14944876, 22100292, 29719026, 4831838, -28944858, --40509596, -19877646, 14618458, 39270496, 47271484, 45476724, 39869644, 32147294, 24026584, 16596291, -7829726, -4108136, -16990890, -27270894, -34506840, -40266392, -44603236, -46227808, -45040248, -42559368, --40435508, -39600672, -40327060, -42376832, -45249092, -48373680, -50870668, -51521892, -49539764, -45176612, --39297876, -32735704, -26308286, -20878372, -16865800, -13962402, -11606612, -9465034, -7307887, -4727686, --1206349, 3718905, 10382547, 18842022, 28738164, 39454644, 50397148, 60966524, 70414912, 78094856, -83916144, 88226144, 91133840, 92317640, 91731912, 90075664, 88051128, 85455888, 81696720, 77112376, -72987064, 70102992, 68074696, 66493608, 65974456, 67392872, 70428336, 73550240, 75418552, 75933952, -75894216, 75944152, 75982264, 75457208, 73991552, 71586904, 68410776, 64745560, 61116312, 58018028, -55267640, 51893404, 46910168, 40071508, 31758598, 22332220, 11759620, -209380, -13596793, -27944130, --42563124, -57054884, -71468256, -85903104, -100104416, -113471960, -125301376, -135047200, -142590224, -148284816, --152554016, -155416080, -156509680, -155479424, -152256048, -147157392, -140896400, -134246176, -127440808, -119999776, --111275624, -101080984, -89829240, -78299400, -67261336, -57073136, -47571056, -38373384, -29178398, -19800336, --10293426, -1107028, 7255274, 14736570, 21460878, 27151172, 31449362, 34608848, 37118180, 38982196, -40195524, 41229540, 41705208, 39342436, 32184874, 21709450, 11916387, 5348308, 1483911, }, -{ -1759326, -11070278, 25192130, 28666760, 14779519, -9762461, -40301824, -69774432, -71958952, -22061636, 57765700, -103101760, 74360376, 1267552, -52283712, -52460880, -14944876, 22100292, 29719026, 4831838, -28944858, --40509596, -19877646, 14618458, 39270496, 47271484, 45476724, 39869644, 32147294, 24026584, 16596291, -7829726, -4108136, -16990890, -27270894, -34506840, -40266392, -44603236, -46227808, -45040248, -42559368, --40435508, -39600672, -40327060, -42376832, -45249092, -48373680, -50870668, -51521892, -49539764, -45176612, --39297876, -32735704, -26308286, -20878372, -16865800, -13962402, -11606612, -9465034, -7307887, -4727686, --1206349, 3718905, 10382547, 18842022, 28738164, 39454644, 50397148, 60966524, 70414912, 78094856, -83916144, 88226144, 91133840, 92317640, 91731912, 90075664, 88051128, 85455888, 81696720, 77112376, -72987064, 70102992, 68074696, 66493608, 65974456, 67392872, 70428336, 73550240, 75418552, 75933952, -75894216, 75944152, 75982264, 75457208, 73991552, 71586904, 68410776, 64745560, 61116312, 58018028, -55267640, 51893404, 46910168, 40071508, 31758598, 22332220, 11759620, -209380, -13596793, -27944130, --42563124, -57054884, -71468256, -85903104, -100104416, -113471960, -125301376, -135047200, -142590224, -148284816, --152554016, -155416080, -156509680, -155479424, -152256048, -147157392, -140896400, -134246176, -127440808, -119999776, --111275624, -101080984, -89829240, -78299400, -67261336, -57073136, -47571056, -38373384, -29178398, -19800336, --10293426, -1107028, 7255274, 14736570, 21460878, 27151172, 31449362, 34608848, 37118180, 38982196, -40195524, 41229540, 41705208, 39342436, 32184874, 21709450, 11916387, 5348308, 1483911, }, -}, -{ -{ --4452271, --7500087, -3624416, -2251637, -519154, 14617921, 32093070, 12177306, -56947508, -114948360, -82408608, -34436512, 127896608, 103851232, -7760469, -89002456, -71117680, 912681, 44779328, 41342820, 32260574, -44262324, 56810608, 43316892, 9867687, -20316270, -39855148, -58272504, -80997176, -102027488, -113800528, --114110304, -104249592, -87111600, -67213016, -48554604, -32237488, -17758080, -5370857, 4229469, 10980084, -14884209, 15707769, 14190572, 12344273, 11856794, 13141526, 16093242, 20577726, 26002268, 31431644, -36322540, 40476308, 43420508, 44550084, 43748000, 41371808, 37846180, 33631204, 29341606, 25579752, -22799834, 21365314, 21520470, 23321672, 26781806, 31941672, 38691748, 46775952, 56064356, 66494684, -77703472, 89050240, 99985768, 110070888, 118769808, 125605784, 130366752, 132929776, 133261560, 131814160, -129377840, 126279016, 122268056, 117357832, 112035832, 106537736, 100799128, 95228016, 90406376, 85642184, -78858280, 68473592, 54687820, 38485592, 20015622, -1562831, -26934276, -55621972, -86015312, -116332944, --145534432, -173169856, -198556336, -220646432, -238789984, -253151280, -264224784, -272182272, -276668896, -277043104, --273021408, -265308720, -255301440, -243944480, -231167488, -216527552, -200001056, -182089440, -163630208, -145534432, --128217656, -111236968, -93836984, -75738528, -57142392, -38294464, -19366544, -416075, 18755048, 38290172, -57758184, 76446656, 94111864, 110891760, 126710128, 141369920, 154847536, 166826736, 176450144, 183179280, -187335744, 189352768, 189299616, 187444720, 184237456, 179489904, 172672176, 163960912, 153935392, 142774384, -130659344, 117202680, 99061808, 71684080, 37193880, 7276749, -7205882, -7443715, -2540473, }, -{ --4452271, --7500087, -3624416, -2251637, -519154, 14617921, 32093070, 12177306, -56947508, -114948360, -82408608, -34436512, 127896608, 103851232, -7760469, -89002456, -71117680, 912681, 44779328, 41342820, 32260574, -44262324, 56810608, 43316892, 9867687, -20316270, -39855148, -58272504, -80997176, -102027488, -113800528, --114110304, -104249592, -87111600, -67213016, -48554604, -32237488, -17758080, -5370857, 4229469, 10980084, -14884209, 15707769, 14190572, 12344273, 11856794, 13141526, 16093242, 20577726, 26002268, 31431644, -36322540, 40476308, 43420508, 44550084, 43748000, 41371808, 37846180, 33631204, 29341606, 25579752, -22799834, 21365314, 21520470, 23321672, 26781806, 31941672, 38691748, 46775952, 56064356, 66494684, -77703472, 89050240, 99985768, 110070888, 118769808, 125605784, 130366752, 132929776, 133261560, 131814160, -129377840, 126279016, 122268056, 117357832, 112035832, 106537736, 100799128, 95228016, 90406376, 85642184, -78858280, 68473592, 54687820, 38485592, 20015622, -1562831, -26934276, -55621972, -86015312, -116332944, --145534432, -173169856, -198556336, -220646432, -238789984, -253151280, -264224784, -272182272, -276668896, -277043104, --273021408, -265308720, -255301440, -243944480, -231167488, -216527552, -200001056, -182089440, -163630208, -145534432, --128217656, -111236968, -93836984, -75738528, -57142392, -38294464, -19366544, -416075, 18755048, 38290172, -57758184, 76446656, 94111864, 110891760, 126710128, 141369920, 154847536, 166826736, 176450144, 183179280, -187335744, 189352768, 189299616, 187444720, 184237456, 179489904, 172672176, 163960912, 153935392, 142774384, -130659344, 117202680, 99061808, 71684080, 37193880, 7276749, -7205882, -7443715, -2540473, }, -}, -{ -{ -95026, -121333, -286689, -1526861, -3704409, -4636417, -490163, 6609955, 3957812, -16376173, -34094524, --12255152, 49355080, 89414776, 47789564, -48562660, -100550016, -52124260, 41663868, 84414896, 49460308, --8843338, -35082904, -25318832, -3728032, 15545634, 30092152, 35791572, 28868622, 13333726, -3234647, --17113834, -27649388, -34395708, -38820060, -44844292, -54616952, -66028680, -75620416, -81532440, -83032992, --79790288, -72682120, -63753956, -54773180, -46706160, -40330816, -36155572, -33837364, -32576254, -31920734, --31610422, -31074088, -29732984, -27550068, -24888262, -22152904, -19811074, -18334142, -17840220, -18063558, --18738942, -19659140, -20390894, -20398948, -19520090, -17939004, -15714212, -12709345, -8958228, -4674535, -82141, 5354751, 10898480, 16254841, 21288542, 26264798, 31280246, 35985384, 40132176, 44128640, -48680768, 53914188, 59191092, 63964948, 68518152, 73470248, 78630112, 82803208, 84906136, 84932976, -83589728, 81289232, 77855944, 73096584, 67385888, 61640832, 56737592, 52874268, 49592912, 46602544, -44493712, 44381508, 46887084, 51655036, 57703424, 64018636, 70019240, 75797584, 81821272, 88200376, -94386200, 99693704, 103846400, 106935560, 109211352, 111065168, 112856712, 114575768, 115938344, 116819888, -117329920, 117506008, 117264416, 116545552, 115250616, 113193328, 110393544, 107202920, 103961832, 100808248, -97913440, 95516848, 93628680, 92104496, 91001232, 90433224, 90185720, 89945208, 89672472, 89262840, -88194472, 86022288, 82761872, 78343960, 72357312, 64792804, 56205552, 46743204, 36020280, 24197308, -11628087, -2854006, -20797842, -39668316, -51709260, -50203336, -36630704, -19493246, -5658620, }, -{ -95026, -121333, -286689, -1526861, -3704409, -4636417, -490163, 6609955, 3957812, -16376173, -34094524, --12255152, 49355080, 89414776, 47789564, -48562660, -100550016, -52124260, 41663868, 84414896, 49460308, --8843338, -35082904, -25318832, -3728032, 15545634, 30092152, 35791572, 28868622, 13333726, -3234647, --17113834, -27649388, -34395708, -38820060, -44844292, -54616952, -66028680, -75620416, -81532440, -83032992, --79790288, -72682120, -63753956, -54773180, -46706160, -40330816, -36155572, -33837364, -32576254, -31920734, --31610422, -31074088, -29732984, -27550068, -24888262, -22152904, -19811074, -18334142, -17840220, -18063558, --18738942, -19659140, -20390894, -20398948, -19520090, -17939004, -15714212, -12709345, -8958228, -4674535, -82141, 5354751, 10898480, 16254841, 21288542, 26264798, 31280246, 35985384, 40132176, 44128640, -48680768, 53914188, 59191092, 63964948, 68518152, 73470248, 78630112, 82803208, 84906136, 84932976, -83589728, 81289232, 77855944, 73096584, 67385888, 61640832, 56737592, 52874268, 49592912, 46602544, -44493712, 44381508, 46887084, 51655036, 57703424, 64018636, 70019240, 75797584, 81821272, 88200376, -94386200, 99693704, 103846400, 106935560, 109211352, 111065168, 112856712, 114575768, 115938344, 116819888, -117329920, 117506008, 117264416, 116545552, 115250616, 113193328, 110393544, 107202920, 103961832, 100808248, -97913440, 95516848, 93628680, 92104496, 91001232, 90433224, 90185720, 89945208, 89672472, 89262840, -88194472, 86022288, 82761872, 78343960, 72357312, 64792804, 56205552, 46743204, 36020280, 24197308, -11628087, -2854006, -20797842, -39668316, -51709260, -50203336, -36630704, -19493246, -5658620, }, -}, -}; -const Word32 CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[16][BINAURAL_CHANNELS][80] ={ -{ -{ -474517120, -393749184, 262211504, 117985432, -10480794, -110985712, -191049280, -267038512, -336338368, -371476032, -353389376, --287532480, -171644080, 6297496, 192329712, 242526608, 72079216, -182587648, -260212208, -67530848, 209416704, -328129600, 241918320, 74428024, -73858944, -198710960, -313772064, -400587296, -445658688, -464703104, -473818656, --471214272, -454585792, -431268416, -406896608, -380733280, -352922304, -325544576, -298700480, -272249376, -247473328, --223824160, -199292928, -174677936, -151928560, -129886256, -107092328, -85339392, -65715684, -46066208, -25864294, --7434589, 9564355, 27704150, 45774152, 60977260, 75160856, 90906208, 105588016, 117123224, 129179728, -143516336, 155936848, 165762656, 178110144, 192645392, 203760224, 213555968, 228452528, 244631680, 255759392, -268987904, 291244960, 312113664, 327424160, 358783328, 411108896, 436517376, 395435488, 333884864, }, -{ -474517120, -393749184, 262211504, 117985432, -10480794, -110985712, -191049280, -267038512, -336338368, -371476032, -353389376, --287532480, -171644080, 6297496, 192329712, 242526608, 72079216, -182587648, -260212208, -67530848, 209416704, -328129600, 241918320, 74428024, -73858944, -198710960, -313772064, -400587296, -445658688, -464703104, -473818656, --471214272, -454585792, -431268416, -406896608, -380733280, -352922304, -325544576, -298700480, -272249376, -247473328, --223824160, -199292928, -174677936, -151928560, -129886256, -107092328, -85339392, -65715684, -46066208, -25864294, --7434589, 9564355, 27704150, 45774152, 60977260, 75160856, 90906208, 105588016, 117123224, 129179728, -143516336, 155936848, 165762656, 178110144, 192645392, 203760224, 213555968, 228452528, 244631680, 255759392, -268987904, 291244960, 312113664, 327424160, 358783328, 411108896, 436517376, 395435488, 333884864, }, -}, -{ -{ --14667313, -109007344, 300884480, 459067584, 490658688, 373444736, 147811296, -130092952, -394527104, -569486336, -623482688, --591592576, -477895648, -203745728, 216717072, 505419936, 342454912, -187842000, -574587712, -431045056, 74300248, -468669504, 522579424, 375879424, 221147872, 87966832, -57102128, -187308352, -264547968, -307544352, -350313088, --389952416, -411228608, -420155712, -428318304, -433704192, -432025376, -426204096, -417957216, -405028288, -387838784, --368521600, -346348320, -320995104, -295042784, -269352960, -242227568, -214230816, -187539216, -161874096, -136570304, --113043000, -91045792, -67981280, -44285944, -22613540, -1644436, 21249350, 43590696, 62576600, 81269912, -101752608, 119903672, 134431936, 150395792, 167950944, 181327072, 192286752, 207711600, 223999728, 234186848, -245695216, 266763632, 286735232, 300152192, 330441376, 387059776, 423103136, 394020288, 339865056, }, -{ -14667313, --109007344, -300884480, -459067584, -490658688, -373444736, -147811296, 130092952, 394527104, 569486336, 623482688, -591592576, 477895648, 203745728, -216717072, -505419936, -342454912, 187842000, 574587712, 431045056, -74300248, --468669504, -522579424, -375879424, -221147872, -87966832, 57102128, 187308352, 264547968, 307544352, 350313088, -389952416, 411228608, 420155712, 428318304, 433704192, 432025376, 426204096, 417957216, 405028288, 387838784, -368521600, 346348320, 320995104, 295042784, 269352960, 242227568, 214230816, 187539216, 161874096, 136570304, -113043000, 91045792, 67981280, 44285944, 22613540, 1644436, -21249350, -43590696, -62576600, -81269912, --101752608, -119903672, -134431936, -150395792, -167950944, -181327072, -192286752, -207711600, -223999728, -234186848, --245695216, -266763632, -286735232, -300152192, -330441376, -387059776, -423103136, -394020288, -339865056, }, -}, -{ -{ -63584844, -61867932, 35822176, -16645683, -59343564, -56361784, -14022531, 29422136, 46156404, 36439040, 11818139, --18567680, -41300404, -36649492, 654446, 42820288, 47975860, 6956774, -37008124, -29559576, 33152852, -97268128, 110028472, 71801112, 21268678, -14348949, -36198520, -52268680, -63071056, -69157560, -74681968, --79523464, -79209936, -73945912, -68701760, -65478924, -63816772, -66236984, -74942888, -86210192, -95153928, --102194992, -109113104, -114073792, -115841176, -117046984, -118933016, -118941600, -116276576, -113024208, -108315320, --98741832, -84825608, -69585984, -51991116, -29500520, -4359929, 20286204, 46400680, 75974752, 105691096, -133309880, 162058240, 192782288, 220608304, 244149568, 267417008, 289217184, 303198400, 310272192, 316390368, -318068096, 307477248, 290040224, 275691808, 254662576, 207049104, 137422848, 75828184, 44052944, }, -{ -63584844, -61867932, 35822176, -16645683, -59343564, -56361784, -14022531, 29422136, 46156404, 36439040, 11818139, --18567680, -41300404, -36649492, 654446, 42820288, 47975860, 6956774, -37008124, -29559576, 33152852, -97268128, 110028472, 71801112, 21268678, -14348949, -36198520, -52268680, -63071056, -69157560, -74681968, --79523464, -79209936, -73945912, -68701760, -65478924, -63816772, -66236984, -74942888, -86210192, -95153928, --102194992, -109113104, -114073792, -115841176, -117046984, -118933016, -118941600, -116276576, -113024208, -108315320, --98741832, -84825608, -69585984, -51991116, -29500520, -4359929, 20286204, 46400680, 75974752, 105691096, -133309880, 162058240, 192782288, 220608304, 244149568, 267417008, 289217184, 303198400, 310272192, 316390368, -318068096, 307477248, 290040224, 275691808, 254662576, 207049104, 137422848, 75828184, 44052944, }, -}, -{ -{ -17322140, -31187906, 39309152, 22240952, -14697915, -40109624, -29441464, 2966212, 17942226, -2493766, -39815956, --70690328, -88434448, -83261696, -35551592, 40590124, 75310104, 14615237, -92039000, -126762200, -37784436, -101995272, 186789200, 188059968, 148041616, 101429408, 46439332, -21973052, -92030952, -152505168, -204940272, --252362608, -290860032, -316288896, -329120128, -330478944, -320509792, -301369792, -276755360, -248831072, -218876368, --189064992, -160720368, -133050568, -105711496, -80083424, -56609816, -33839512, -11282342, 9620727, 27951648, -43906912, 56876104, 65904124, 72072776, 77758232, 83885008, 90192704, 97200480, 105432320, 113842944, -121302224, 128338992, 135533056, 142001824, 147348512, 152970624, 159588640, 165846944, 171091632, 176687968, -182724016, 186785984, 188384240, 190518304, 192627680, 185383680, 159393216, 120320288, 90364504, }, -{ -17322140, -31187906, 39309152, 22240952, -14697915, -40109624, -29441464, 2966212, 17942226, -2493766, -39815956, --70690328, -88434448, -83261696, -35551592, 40590124, 75310104, 14615237, -92039000, -126762200, -37784436, -101995272, 186789200, 188059968, 148041616, 101429408, 46439332, -21973052, -92030952, -152505168, -204940272, --252362608, -290860032, -316288896, -329120128, -330478944, -320509792, -301369792, -276755360, -248831072, -218876368, --189064992, -160720368, -133050568, -105711496, -80083424, -56609816, -33839512, -11282342, 9620727, 27951648, -43906912, 56876104, 65904124, 72072776, 77758232, 83885008, 90192704, 97200480, 105432320, 113842944, -121302224, 128338992, 135533056, 142001824, 147348512, 152970624, 159588640, 165846944, 171091632, 176687968, -182724016, 186785984, 188384240, 190518304, 192627680, 185383680, 159393216, 120320288, 90364504, }, -}, -{ -{ -6201933, -303332, -1778117, 6503654, 18598820, 23028540, 20786568, 25465934, 41975252, 52989160, 32604170, --28302760, -105976704, -145849040, -96549792, 28359670, 128144104, 98512056, -45183056, -164794672, -144955152, --12104828, 117671904, 174167360, 173926304, 152256048, 113789256, 55066312, -9612137, -64184528, -108850040, --148930144, -181961120, -204718544, -220194928, -230445936, -231651744, -220868160, -200911584, -176357264, -150281440, --125502168, -104079408, -85437640, -68207840, -52620864, -38723964, -24820616, -10057740, 4121558, 16736951, -28503550, 39352100, 48028472, 54768888, 61201136, 67616208, 73394552, 79361872, 86609088, 94278288, -101434776, 109201688, 118283400, 126990912, 134377712, 142158048, 151016960, 158850976, 165027680, 171845936, -179373936, 184241744, 186285072, 189771520, 193235408, 184292208, 152493888, 106336408, 71842992, }, -{ --6201933, --303332, 1778117, -6503654, -18598820, -23028540, -20786568, -25465934, -41975252, -52989160, -32604170, -28302760, 105976704, 145849040, 96549792, -28359670, -128144104, -98512056, 45183056, 164794672, 144955152, -12104828, -117671904, -174167360, -173926304, -152256048, -113789256, -55066312, 9612137, 64184528, 108850040, -148930144, 181961120, 204718544, 220194928, 230445936, 231651744, 220868160, 200911584, 176357264, 150281440, -125502168, 104079408, 85437640, 68207840, 52620864, 38723964, 24820616, 10057740, -4121558, -16736951, --28503550, -39352100, -48028472, -54768888, -61201136, -67616208, -73394552, -79361872, -86609088, -94278288, --101434776, -109201688, -118283400, -126990912, -134377712, -142158048, -151016960, -158850976, -165027680, -171845936, --179373936, -184241744, -186285072, -189771520, -193235408, -184292208, -152493888, -106336408, -71842992, }, -}, -{ -{ -27467390, -2485712, -658741, 27040040, 33897492, -6876243, -39722540, 1653026, 93714040, 141894448, 92704184, --10971494, -85444616, -83779776, -17631378, 61112552, 89751928, 40414032, -42704860, -75765368, -25393458, -53360672, 86494200, 64158220, 30455076, 15159087, 11920145, 12123619, 21956410, 43373800, 65676492, -81234472, 91583200, 96871912, 94500016, 87269976, 79865456, 69784632, 52569324, 31410706, 12203613, --4763656, -20226074, -30743376, -35179540, -38381440, -43128988, -46829104, -49121004, -53146464, -57859652, --59115392, -58056148, -58328340, -57390428, -50747724, -40503688, -29918742, -15891916, 3874597, 24592982, -43498892, 64919504, 89533424, 111123688, 128989680, 148818464, 168397616, 179598352, 184638496, 190617088, -191139472, 176601008, 155666256, 138311904, 107942728, 46190764, -24148454, -62047244, -66298724, }, -{ --27467390, --2485712, 658741, -27040040, -33897492, 6876243, 39722540, -1653026, -93714040, -141894448, -92704184, -10971494, 85444616, 83779776, 17631378, -61112552, -89751928, -40414032, 42704860, 75765368, 25393458, --53360672, -86494200, -64158220, -30455076, -15159087, -11920145, -12123619, -21956410, -43373800, -65676492, --81234472, -91583200, -96871912, -94500016, -87269976, -79865456, -69784632, -52569324, -31410706, -12203613, -4763656, 20226074, 30743376, 35179540, 38381440, 43128988, 46829104, 49121004, 53146464, 57859652, -59115392, 58056148, 58328340, 57390428, 50747724, 40503688, 29918742, 15891916, -3874597, -24592982, --43498892, -64919504, -89533424, -111123688, -128989680, -148818464, -168397616, -179598352, -184638496, -190617088, --191139472, -176601008, -155666256, -138311904, -107942728, -46190764, 24148454, 62047244, 66298724, }, -}, -{ -{ --705448, -7508677, 5253819, -11579232, -25637196, -30896920, -46382964, -82768848, -115529248, -106844824, -38469484, -81976968, 213182848, 266282608, 157711728, -70983464, -231924480, -170874208, 44229036, 192235760, 155120800, -24892020, -54510652, -57131120, -42320460, -34080564, -9823127, 29956324, 53076132, 47967268, 35619236, -31935766, 32671280, 33468532, 37842420, 45331768, 50308564, 51933132, 53520660, 55144696, 55122684, -54221276, 52611200, 48027400, 40636296, 33889440, 28547574, 21951578, 13768591, 6218039, -1031866, --10213969, -20859046, -31143344, -41762652, -53775140, -65463892, -75291848, -84485224, -93593776, -100692288, --105207368, -108724952, -110714592, -108741592, -103163504, -95911992, -85653992, -70381096, -52398600, -34105800, --12992276, 12082280, 36379984, 59146532, 87079392, 115597968, 120755152, 90703800, 54766740, }, -{ --705448, -7508677, 5253819, -11579232, -25637196, -30896920, -46382964, -82768848, -115529248, -106844824, -38469484, -81976968, 213182848, 266282608, 157711728, -70983464, -231924480, -170874208, 44229036, 192235760, 155120800, -24892020, -54510652, -57131120, -42320460, -34080564, -9823127, 29956324, 53076132, 47967268, 35619236, -31935766, 32671280, 33468532, 37842420, 45331768, 50308564, 51933132, 53520660, 55144696, 55122684, -54221276, 52611200, 48027400, 40636296, 33889440, 28547574, 21951578, 13768591, 6218039, -1031866, --10213969, -20859046, -31143344, -41762652, -53775140, -65463892, -75291848, -84485224, -93593776, -100692288, --105207368, -108724952, -110714592, -108741592, -103163504, -95911992, -85653992, -70381096, -52398600, -34105800, --12992276, 12082280, 36379984, 59146532, 87079392, 115597968, 120755152, 90703800, 54766740, }, -}, -{ -{ -22603876, --7221988, -49116708, -79632448, -77375984, -29621852, 49382996, 110023640, 103060424, 33597380, -39041788, --65136936, -50224812, -27392228, -9287867, 9259413, 20324322, 7736310, -21227876, -37613176, -28081034, --9184251, 227633, 2462627, 9927280, 25286084, 41665476, 53599580, 59563144, 58180700, 48233556, -31579284, 13106630, -2745558, -15305116, -27499602, -42119132, -58886148, -75693968, -90777888, -102259416, --108061912, -108416248, -106223672, -103357848, -99264744, -94078040, -89418536, -85260472, -79918064, -73578160, --67833640, -62113280, -54834920, -46960636, -40078488, -32923072, -24091008, -15411953, -8589398, -2209761, -4378183, 8904541, 10871099, 12869870, 15257871, 15999290, 16421807, 19524922, 23485418, 25606596, -29661044, 39075612, 48743048, 56302728, 72059352, 99793568, 118729000, 109183976, 87719872, }, -{ -22603876, --7221988, -49116708, -79632448, -77375984, -29621852, 49382996, 110023640, 103060424, 33597380, -39041788, --65136936, -50224812, -27392228, -9287867, 9259413, 20324322, 7736310, -21227876, -37613176, -28081034, --9184251, 227633, 2462627, 9927280, 25286084, 41665476, 53599580, 59563144, 58180700, 48233556, -31579284, 13106630, -2745558, -15305116, -27499602, -42119132, -58886148, -75693968, -90777888, -102259416, --108061912, -108416248, -106223672, -103357848, -99264744, -94078040, -89418536, -85260472, -79918064, -73578160, --67833640, -62113280, -54834920, -46960636, -40078488, -32923072, -24091008, -15411953, -8589398, -2209761, -4378183, 8904541, 10871099, 12869870, 15257871, 15999290, 16421807, 19524922, 23485418, 25606596, -29661044, 39075612, 48743048, 56302728, 72059352, 99793568, 118729000, 109183976, 87719872, }, -}, -{ -{ --9419400, -41321880, 79047800, 67264016, 26528940, -31041876, -125323928, -240709296, -300726080, -248581440, -100945688, -102328672, 320818496, 442890592, 309921632, -67858336, -396835648, -363421344, -3670587, 329390176, 376628352, -214554016, 61891552, -1806571, -38725036, -89168352, -128088272, -142241264, -152928752, -167772160, -170083392, --154229584, -132369280, -109843792, -81601696, -48437568, -17170742, 10256382, 34843996, 53967876, 65718368, -73473472, 80379776, 85296440, 87221120, 87615184, 86742232, 83217672, 77797960, 73125576, 69989176, -67245232, 64345588, 61274688, 57396868, 52281028, 46337328, 39731132, 32087164, 23515482, 14594836, -5459441, -4110284, -14071923, -24159728, -34084324, -43646532, -52882320, -61583388, -68936376, -74838728, --80607944, -86543592, -91094648, -95179696, -102670120, -111155368, -108656232, -89623080, -69366944, }, -{ --9419400, -41321880, 79047800, 67264016, 26528940, -31041876, -125323928, -240709296, -300726080, -248581440, -100945688, -102328672, 320818496, 442890592, 309921632, -67858336, -396835648, -363421344, -3670587, 329390176, 376628352, -214554016, 61891552, -1806571, -38725036, -89168352, -128088272, -142241264, -152928752, -167772160, -170083392, --154229584, -132369280, -109843792, -81601696, -48437568, -17170742, 10256382, 34843996, 53967876, 65718368, -73473472, 80379776, 85296440, 87221120, 87615184, 86742232, 83217672, 77797960, 73125576, 69989176, -67245232, 64345588, 61274688, 57396868, 52281028, 46337328, 39731132, 32087164, 23515482, 14594836, -5459441, -4110284, -14071923, -24159728, -34084324, -43646532, -52882320, -61583388, -68936376, -74838728, --80607944, -86543592, -91094648, -95179696, -102670120, -111155368, -108656232, -89623080, -69366944, }, -}, -{ -{ --3726421, --4905390, -550293, 12445205, 38268160, 81759000, 124758600, 129797672, 85855320, 10437307, -102676560, --256617312, -344373152, -196594080, 162747056, 421756672, 301686560, -81485728, -338718304, -270162560, -44135620, -89901184, 92062624, 71720584, 81324672, 84869624, 61480308, 35527968, 21602612, 7235946, -12939663, --27393838, -30405148, -28365038, -25742424, -21561272, -16509317, -12374875, -7998303, -2522757, 1645509, -3288871, 4905927, 7898982, 10081899, 10088878, 9747428, 10390063, 10888279, 10763725, 11661910, -14477798, 18012556, 21446382, 25411174, 29873108, 33535642, 36019744, 38237020, 40196064, 40926208, -40725416, 40797356, 40727028, 39200704, 36813776, 34959960, 32791538, 28916404, 24681566, 21641804, -17919678, 11828877, 5825050, 991601, -7748121, -22736484, -34851512, -34499860, -27521076, }, -{ -3726421, -4905390, 550293, -12445205, -38268160, -81759000, -124758600, -129797672, -85855320, -10437307, 102676560, -256617312, 344373152, 196594080, -162747056, -421756672, -301686560, 81485728, 338718304, 270162560, 44135620, --89901184, -92062624, -71720584, -81324672, -84869624, -61480308, -35527968, -21602612, -7235946, 12939663, -27393838, 30405148, 28365038, 25742424, 21561272, 16509317, 12374875, 7998303, 2522757, -1645509, --3288871, -4905927, -7898982, -10081899, -10088878, -9747428, -10390063, -10888279, -10763725, -11661910, --14477798, -18012556, -21446382, -25411174, -29873108, -33535642, -36019744, -38237020, -40196064, -40926208, --40725416, -40797356, -40727028, -39200704, -36813776, -34959960, -32791538, -28916404, -24681566, -21641804, --17919678, -11828877, -5825050, -991601, 7748121, 22736484, 34851512, 34499860, 27521076, }, -}, -{ -{ --4889821, --342524, 3532074, 972273, -13593571, -39178156, -53621592, -24791088, 41968808, 86767464, 58815284, --13867376, -55325620, -37217504, -3175592, 4268124, -3515431, 1946157, 15576773, 14221710, -1054415, --9167071, -4754529, -3166465, -12531641, -22008486, -20215338, -10042707, -641561, 4719096, 7508677, -7569343, 3358128, -4560182, -13816373, -22486838, -29368450, -33820720, -36604932, -39212516, -41504416, --41713260, -39269960, -35690640, -32337346, -29443074, -27575838, -27660664, -29154774, -30347166, -30591442, --30244622, -28885266, -25828860, -21779242, -17788680, -13510893, -8437463, -3421478, 920197, 5463199, -10562398, 15039902, 18501108, 21978422, 25392920, 27537720, 28916404, 30988726, 33019172, 33803004, -35061964, 38326676, 41264436, 43054900, 48853104, 60483340, 67997920, 62146568, 51134272, }, -{ -4889821, -342524, -3532074, -972273, 13593571, 39178156, 53621592, 24791088, -41968808, -86767464, -58815284, -13867376, 55325620, 37217504, 3175592, -4268124, 3515431, -1946157, -15576773, -14221710, 1054415, -9167071, 4754529, 3166465, 12531641, 22008486, 20215338, 10042707, 641561, -4719096, -7508677, --7569343, -3358128, 4560182, 13816373, 22486838, 29368450, 33820720, 36604932, 39212516, 41504416, -41713260, 39269960, 35690640, 32337346, 29443074, 27575838, 27660664, 29154774, 30347166, 30591442, -30244622, 28885266, 25828860, 21779242, 17788680, 13510893, 8437463, 3421478, -920197, -5463199, --10562398, -15039902, -18501108, -21978422, -25392920, -27537720, -28916404, -30988726, -33019172, -33803004, --35061964, -38326676, -41264436, -43054900, -48853104, -60483340, -67997920, -62146568, -51134272, }, -}, -{ -{ --19487878, --11583527, 4476967, 11824045, -3235184, -12584791, 29283624, 109043312, 139014672, 44827112, -139646032, --277102688, -236251648, -20240570, 204973024, 246190208, 78254840, -122839288, -173505936, -74751224, 31737660, -55711096, 30462592, 12132209, -1471563, -29320668, -54413476, -52803400, -35593468, -28465432, -34099356, --38771208, -36869072, -29972966, -16141561, 5407364, 28610388, 47796008, 62867584, 74308840, 81188304, -85045720, 88492968, 90726352, 90090696, 88160112, 86411520, 83108152, 77392088, 71344776, 65213172, -56276956, 44019656, 30570504, 16008417, -677531, -17338246, -31462782, -44628468, -58690728, -71698576, --82425792, -93255016, -104423536, -112355272, -116525680, -119679264, -120098024, -113599736, -102504224, -91154240, --75778256, -52141976, -26696442, -3887482, 26867168, 69371240, 98732168, 91459184, 67642512, }, -{ -19487878, -11583527, -4476967, -11824045, 3235184, 12584791, -29283624, -109043312, -139014672, -44827112, 139646032, -277102688, 236251648, 20240570, -204973024, -246190208, -78254840, 122839288, 173505936, 74751224, -31737660, --55711096, -30462592, -12132209, 1471563, 29320668, 54413476, 52803400, 35593468, 28465432, 34099356, -38771208, 36869072, 29972966, 16141561, -5407364, -28610388, -47796008, -62867584, -74308840, -81188304, --85045720, -88492968, -90726352, -90090696, -88160112, -86411520, -83108152, -77392088, -71344776, -65213172, --56276956, -44019656, -30570504, -16008417, 677531, 17338246, 31462782, 44628468, 58690728, 71698576, -82425792, 93255016, 104423536, 112355272, 116525680, 119679264, 120098024, 113599736, 102504224, 91154240, -75778256, 52141976, 26696442, 3887482, -26867168, -69371240, -98732168, -91459184, -67642512, }, -}, -{ -{ --13447006, --15437186, -15337865, -8318815, 5473936, 19134080, 23803246, 13018583, -15075872, -50674708, -68482720, --46862924, 2273648, 37122476, 29987998, -3798362, -30385284, -37065032, -33677912, -26914950, -13136157, -6638409, 22264036, 28156194, 30261266, 35209604, 39506720, 33935612, 15321759, -9609452, -30800822, --42454140, -44469016, -39946952, -33484638, -29549912, -29195040, -29076392, -25866978, -20243792, -14707042, --9924059, -5625334, -2419140, -177704, 2801929, 7062537, 11181947, 14747307, 18733574, 22507240, -24340654, 24764782, 25312926, 24883966, 21612812, 16559246, 11263552, 4413079, -4876399, -14206141, --22242562, -31212064, -41726680, -50947440, -58571004, -67672576, -77786152, -85235240, -90859496, -97880160, --103053448, -101211976, -95937224, -91939144, -80863496, -52128020, -14814416, 10315975, 18066244, }, -{ --13447006, --15437186, -15337865, -8318815, 5473936, 19134080, 23803246, 13018583, -15075872, -50674708, -68482720, --46862924, 2273648, 37122476, 29987998, -3798362, -30385284, -37065032, -33677912, -26914950, -13136157, -6638409, 22264036, 28156194, 30261266, 35209604, 39506720, 33935612, 15321759, -9609452, -30800822, --42454140, -44469016, -39946952, -33484638, -29549912, -29195040, -29076392, -25866978, -20243792, -14707042, --9924059, -5625334, -2419140, -177704, 2801929, 7062537, 11181947, 14747307, 18733574, 22507240, -24340654, 24764782, 25312926, 24883966, 21612812, 16559246, 11263552, 4413079, -4876399, -14206141, --22242562, -31212064, -41726680, -50947440, -58571004, -67672576, -77786152, -85235240, -90859496, -97880160, --103053448, -101211976, -95937224, -91939144, -80863496, -52128020, -14814416, 10315975, 18066244, }, -}, -{ -{ --17719424, --19465328, -10439455, 10909754, 31063350, 40038224, 34177740, 4187593, -51797304, -100851736, -93000000, --21596170, 56580288, 78688632, 38936564, -16989280, -44022340, -30846456, 3275986, 26647588, 17479444, --17430588, -48388176, -53091164, -35808752, -13846438, 3738232, 17264158, 27108760, 33263448, 38486128, -44350908, 47777216, 45907296, 40481140, 34288872, 27378270, 19193136, 10905459, 3950296, -1097364, --3863860, -4734665, -5491116, -7457137, -10365367, -14367739, -20726438, -29211146, -37582576, -44572096, --50488416, -54773716, -56360172, -56250648, -56406880, -56860000, -56986164, -57897768, -60495152, -63541892, --66344896, -70165808, -74739408, -77426448, -77547784, -76788112, -74449496, -68090264, -58958628, -50159312, --40458592, -27459874, -14231374, -3525095, 10242960, 31209916, 49187040, 51644296, 44649408, }, -{ --17719424, --19465328, -10439455, 10909754, 31063350, 40038224, 34177740, 4187593, -51797304, -100851736, -93000000, --21596170, 56580288, 78688632, 38936564, -16989280, -44022340, -30846456, 3275986, 26647588, 17479444, --17430588, -48388176, -53091164, -35808752, -13846438, 3738232, 17264158, 27108760, 33263448, 38486128, -44350908, 47777216, 45907296, 40481140, 34288872, 27378270, 19193136, 10905459, 3950296, -1097364, --3863860, -4734665, -5491116, -7457137, -10365367, -14367739, -20726438, -29211146, -37582576, -44572096, --50488416, -54773716, -56360172, -56250648, -56406880, -56860000, -56986164, -57897768, -60495152, -63541892, --66344896, -70165808, -74739408, -77426448, -77547784, -76788112, -74449496, -68090264, -58958628, -50159312, --40458592, -27459874, -14231374, -3525095, 10242960, 31209916, 49187040, 51644296, 44649408, }, -}, -{ -{ -667867, --6288906, -10187126, -10408853, -15162308, -16886738, 7102802, 51078972, 60318520, -9038759, -112977504, --145011520, -58855548, 64550136, 103756208, 33980708, -56674776, -81592568, -46154256, -11977590, -6857989, --4037269, 22369800, 58718108, 77199888, 74336224, 66762584, 62137976, 52446384, 31241056, 2430952, --27460948, -54652920, -75504992, -87207704, -91644400, -92828200, -91470992, -86566680, -79617960, -72695544, --65450468, -58036284, -53288732, -52592948, -53606560, -54540716, -56122336, -57767848, -57040924, -53947472, --50586660, -46590196, -40249212, -33004140, -27427662, -22848690, -18099530, -15264314, -15820512, -17430052, --18829674, -22328998, -28017682, -32376000, -35120484, -39361228, -43814036, -44273596, -42357504, -41875396, --39014408, -28842852, -16483548, -6364605, 11662984, 45099840, 76302240, 82672216, 72620920, }, -{ -667867, --6288906, -10187126, -10408853, -15162308, -16886738, 7102802, 51078972, 60318520, -9038759, -112977504, --145011520, -58855548, 64550136, 103756208, 33980708, -56674776, -81592568, -46154256, -11977590, -6857989, --4037269, 22369800, 58718108, 77199888, 74336224, 66762584, 62137976, 52446384, 31241056, 2430952, --27460948, -54652920, -75504992, -87207704, -91644400, -92828200, -91470992, -86566680, -79617960, -72695544, --65450468, -58036284, -53288732, -52592948, -53606560, -54540716, -56122336, -57767848, -57040924, -53947472, --50586660, -46590196, -40249212, -33004140, -27427662, -22848690, -18099530, -15264314, -15820512, -17430052, --18829674, -22328998, -28017682, -32376000, -35120484, -39361228, -43814036, -44273596, -42357504, -41875396, --39014408, -28842852, -16483548, -6364605, 11662984, 45099840, 76302240, 82672216, 72620920, }, -}, -{ -{ --6998649, --6445136, -5876589, -5549098, -6338298, -9783399, -13504451, -9632538, 3009698, 6265821, -20397874, --61070140, -62327492, 2799245, 80664856, 83809304, -1217623, -87422448, -87861072, -14525579, 49264348, -52332564, 16460462, -14287209, -24394340, -20737176, -7818988, 12781286, 33522756, 46147812, 49983756, -48574468, 44018048, 38555384, 35584340, 35335232, 33735896, 27512486, 16987132, 3606699, -11391327, --25731150, -36897528, -44295072, -48573932, -49903224, -48784924, -46949360, -45679124, -44795972, -44305808, --45021456, -46874736, -48736604, -50210316, -51539072, -52110840, -51286204, -50001472, -49417356, -49181672, --48970680, -49908592, -52512956, -55440512, -57990112, -61183956, -65010236, -67820216, -69580080, -71920304, --74211128, -74067784, -72268728, -71680320, -70314520, -61509300, -43222404, -22516366, -9305047, }, -{ --6998649, --6445136, -5876589, -5549098, -6338298, -9783399, -13504451, -9632538, 3009698, 6265821, -20397874, --61070140, -62327492, 2799245, 80664856, 83809304, -1217623, -87422448, -87861072, -14525579, 49264348, -52332564, 16460462, -14287209, -24394340, -20737176, -7818988, 12781286, 33522756, 46147812, 49983756, -48574468, 44018048, 38555384, 35584340, 35335232, 33735896, 27512486, 16987132, 3606699, -11391327, --25731150, -36897528, -44295072, -48573932, -49903224, -48784924, -46949360, -45679124, -44795972, -44305808, --45021456, -46874736, -48736604, -50210316, -51539072, -52110840, -51286204, -50001472, -49417356, -49181672, --48970680, -49908592, -52512956, -55440512, -57990112, -61183956, -65010236, -67820216, -69580080, -71920304, --74211128, -74067784, -72268728, -71680320, -70314520, -61509300, -43222404, -22516366, -9305047, }, -}, -}; -const Word32 CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[16][BINAURAL_CHANNELS][80] ={ -{ -{ --95201168, --261487808, -369519136, -412615360, -404252512, -367495648, -322004448, -266368496, -181466128, -63362040, 63136556, -175570752, 264952768, 290376832, 178081152, -61641372, -254110672, -207646640, 42662448, 236334336, 173758800, --78313360, -311243392, -417897632, -437003808, -422943680, -377025120, -296157312, -205951200, -127701192, -57491896, -10853919, 71386648, 119672288, 159669168, 194378944, 222988256, 246227792, 265816592, 281690272, 294566560, -306515168, 317100128, 324461696, 329706912, 334694464, 338081024, 338716160, 338725280, 339054912, 337549536, -334171552, 331427072, 328584320, 322998176, 316280864, 311258432, 305812960, 297692768, 290134720, 285150400, -278833568, 269938144, 263123648, 258594080, 250957088, 241354080, 235775984, 231270032, 221318048, 211121808, -207134464, 200413904, 184450048, 172849344, 167500496, 133703408, 53686016, -19186692, -21186000, }, -{ --95201168, --261487808, -369519136, -412615360, -404252512, -367495648, -322004448, -266368496, -181466128, -63362040, 63136556, -175570752, 264952768, 290376832, 178081152, -61641372, -254110672, -207646640, 42662448, 236334336, 173758800, --78313360, -311243392, -417897632, -437003808, -422943680, -377025120, -296157312, -205951200, -127701192, -57491896, -10853919, 71386648, 119672288, 159669168, 194378944, 222988256, 246227792, 265816592, 281690272, 294566560, -306515168, 317100128, 324461696, 329706912, 334694464, 338081024, 338716160, 338725280, 339054912, 337549536, -334171552, 331427072, 328584320, 322998176, 316280864, 311258432, 305812960, 297692768, 290134720, 285150400, -278833568, 269938144, 263123648, 258594080, 250957088, 241354080, 235775984, 231270032, 221318048, 211121808, -207134464, 200413904, 184450048, 172849344, 167500496, 133703408, 53686016, -19186692, -21186000, }, -}, -{ -{ -74828528, -179569904, 162359424, -934155, -252682048, -492879712, -647132416, -679114880, -573558016, -358526688, -111054432, -121229744, 356839296, 552497088, 514685248, 120202712, -382224160, -514852224, -117430312, 417020928, 584300224, -313930432, -70863736, -308226176, -408039072, -465042944, -484762208, -443226144, -373642816, -319809184, -276554016, --222665056, -163996352, -114508656, -70787504, -25404732, 19091666, 59804736, 99188512, 137526464, 172307648, -203887472, 233259136, 258566160, 279182016, 297342720, 313283520, 325154784, 333576160, 340281120, 344762400, -347125696, 349632896, 352061152, 351769088, 349595296, 348179584, 345620320, 339195584, 331745952, 325862912, -318082048, 306809376, 296772576, 288880576, 277835520, 264487840, 255271376, 247653184, 234710832, 221795328, -216443808, 209594400, 193566656, 182967216, 182154928, 155035440, 77873664, -201863, -14085345, }, -{ --74828528, --179569904, -162359424, 934155, 252682048, 492879712, 647132416, 679114880, 573558016, 358526688, 111054432, --121229744, -356839296, -552497088, -514685248, -120202712, 382224160, 514852224, 117430312, -417020928, -584300224, --313930432, 70863736, 308226176, 408039072, 465042944, 484762208, 443226144, 373642816, 319809184, 276554016, -222665056, 163996352, 114508656, 70787504, 25404732, -19091666, -59804736, -99188512, -137526464, -172307648, --203887472, -233259136, -258566160, -279182016, -297342720, -313283520, -325154784, -333576160, -340281120, -344762400, --347125696, -349632896, -352061152, -351769088, -349595296, -348179584, -345620320, -339195584, -331745952, -325862912, --318082048, -306809376, -296772576, -288880576, -277835520, -264487840, -255271376, -247653184, -234710832, -221795328, --216443808, -209594400, -193566656, -182967216, -182154928, -155035440, -77873664, 201863, 14085345, }, -}, -{ -{ --9317395, --36821292, -69657928, -75525392, -36439040, 20711942, 51296404, 39745092, 6192269, -23994372, -39681740, --36297844, -10059350, 29302952, 52118356, 33219962, -13837848, -40058624, -11268384, 48121888, 75580152, -37813964, -35274028, -89531816, -103560792, -94278824, -81204408, -67761160, -53076668, -40245456, -29352344, --16449725, -2290291, 7725036, 12230993, 13965086, 13299903, 10004053, 8395050, 12896176, 21770652, -31536334, 42917996, 56999584, 71239552, 84259744, 98653248, 115497576, 132492224, 149590496, 169309216, -190560176, 209627696, 226769440, 244284848, 260102688, 271007072, 278817472, 285900928, 289446976, 287174400, -282213184, 275995136, 264371344, 246168736, 225895408, 203880480, 175305536, 141681840, 109760576, 78130824, -40762996, 2810519, -26260504, -52909164, -89442696, -124522376, -129005784, -92731568, -32746978, }, -{ --9317395, --36821292, -69657928, -75525392, -36439040, 20711942, 51296404, 39745092, 6192269, -23994372, -39681740, --36297844, -10059350, 29302952, 52118356, 33219962, -13837848, -40058624, -11268384, 48121888, 75580152, -37813964, -35274028, -89531816, -103560792, -94278824, -81204408, -67761160, -53076668, -40245456, -29352344, --16449725, -2290291, 7725036, 12230993, 13965086, 13299903, 10004053, 8395050, 12896176, 21770652, -31536334, 42917996, 56999584, 71239552, 84259744, 98653248, 115497576, 132492224, 149590496, 169309216, -190560176, 209627696, 226769440, 244284848, 260102688, 271007072, 278817472, 285900928, 289446976, 287174400, -282213184, 275995136, 264371344, 246168736, 225895408, 203880480, 175305536, 141681840, 109760576, 78130824, -40762996, 2810519, -26260504, -52909164, -89442696, -124522376, -129005784, -92731568, -32746978, }, -}, -{ -{ -3206730, --760209, -24588688, -53230752, -58679452, -31832150, 557809, 2557653, -28212566, -59016072, -63398012, --43799004, -9107478, 39424580, 80919872, 67487896, -14019847, -91020560, -69074352, 48401596, 150138640, -141599168, 40451076, -70834208, -146562000, -197603392, -238845280, -262780064, -261969920, -244105536, -217789744, --182208624, -135817072, -82862808, -28186796, 26032334, 77111840, 121609848, 158477312, 188456720, 211574928, -228198048, 240359248, 249442576, 254848864, 256604432, 256453040, 255078640, 251162176, 244128096, 235041008, -224493648, 212524112, 200652816, 191093840, 184047408, 178163840, 172973904, 168506064, 163650608, 157370288, -150373248, 143538880, 136241728, 128071632, 120195736, 113128904, 105392056, 96147136, 86589224, 76972256, -65361348, 51391968, 37546604, 23663122, 4324495, -22551262, -45995880, -47598976, -20342038, }, -{ -3206730, --760209, -24588688, -53230752, -58679452, -31832150, 557809, 2557653, -28212566, -59016072, -63398012, --43799004, -9107478, 39424580, 80919872, 67487896, -14019847, -91020560, -69074352, 48401596, 150138640, -141599168, 40451076, -70834208, -146562000, -197603392, -238845280, -262780064, -261969920, -244105536, -217789744, --182208624, -135817072, -82862808, -28186796, 26032334, 77111840, 121609848, 158477312, 188456720, 211574928, -228198048, 240359248, 249442576, 254848864, 256604432, 256453040, 255078640, 251162176, 244128096, 235041008, -224493648, 212524112, 200652816, 191093840, 184047408, 178163840, 172973904, 168506064, 163650608, 157370288, -150373248, 143538880, 136241728, 128071632, 120195736, 113128904, 105392056, 96147136, 86589224, 76972256, -65361348, 51391968, 37546604, 23663122, 4324495, -22551262, -45995880, -47598976, -20342038, }, -}, -{ -{ --2380486, --2201708, 6032282, 13530758, 10633265, 857383, -3568581, -1665374, -9763534, -41570452, -86909200, --112731080, -83443160, 8054675, 112200112, 139479056, 45113800, -96580928, -144677584, -42420856, 115654880, -192026912, 149331712, 53525492, -31199716, -96998080, -153833376, -192797328, -203361872, -193656848, -176281568, --152326384, -119745296, -82905752, -45694692, -5987722, 37148784, 78603808, 112886776, 138612016, 156223536, -166643120, 172502528, 176550000, 179240800, 180459488, 181491360, 182870048, 182965600, 180790208, 177448192, -173547280, 168362720, 162371232, 157321424, 153461872, 149761216, 146456768, 144288352, 142253072, 139164464, -135849280, 132984536, 129053032, 123152280, 116941224, 111209592, 104015520, 94634776, 85179936, 75937168, -64041184, 49254148, 35070020, 20654498, -1403381, -32753958, -58780924, -58144192, -24373402, }, -{ -2380486, -2201708, -6032282, -13530758, -10633265, -857383, 3568581, 1665374, 9763534, 41570452, 86909200, -112731080, 83443160, -8054675, -112200112, -139479056, -45113800, 96580928, 144677584, 42420856, -115654880, --192026912, -149331712, -53525492, 31199716, 96998080, 153833376, 192797328, 203361872, 193656848, 176281568, -152326384, 119745296, 82905752, 45694692, 5987722, -37148784, -78603808, -112886776, -138612016, -156223536, --166643120, -172502528, -176550000, -179240800, -180459488, -181491360, -182870048, -182965600, -180790208, -177448192, --173547280, -168362720, -162371232, -157321424, -153461872, -149761216, -146456768, -144288352, -142253072, -139164464, --135849280, -132984536, -129053032, -123152280, -116941224, -111209592, -104015520, -94634776, -85179936, -75937168, --64041184, -49254148, -35070020, -20654498, 1403381, 32753958, 58780924, 58144192, 24373402, }, -}, -{ -{ --11930882, --12633646, 14035416, 19539416, -11880416, -24995100, 24242942, 89128624, 82855824, -7707319, -102444632, --119779120, -53979684, 38026028, 91971352, 73959872, 350577, -63051732, -51099912, 29446296, 99244344, -95165736, 38272452, -6125697, -10269267, 4490389, 17663054, 31674846, 48226576, 56620552, 51063404, -37772628, 21715892, 2442226, -17212082, -32573032, -45621144, -60280940, -72937672, -77700256, -75676248, --70407400, -61078728, -47806744, -35735200, -27477054, -19511500, -10116795, -1858110, 5894843, 16966732, -30312806, 41998336, 53784800, 69578472, 86721296, 100822208, 113888040, 128117800, 139034000, 143659680, -146247392, 148334752, 144509008, 133968080, 122643864, 109887272, 88977760, 62406948, 38290708, 13117904, --20552492, -54335632, -77318536, -99966976, -132959840, -152890640, -128148936, -70697848, -19562502, }, -{ -11930882, -12633646, -14035416, -19539416, 11880416, 24995100, -24242942, -89128624, -82855824, 7707319, 102444632, -119779120, 53979684, -38026028, -91971352, -73959872, -350577, 63051732, 51099912, -29446296, -99244344, --95165736, -38272452, 6125697, 10269267, -4490389, -17663054, -31674846, -48226576, -56620552, -51063404, --37772628, -21715892, -2442226, 17212082, 32573032, 45621144, 60280940, 72937672, 77700256, 75676248, -70407400, 61078728, 47806744, 35735200, 27477054, 19511500, 10116795, 1858110, -5894843, -16966732, --30312806, -41998336, -53784800, -69578472, -86721296, -100822208, -113888040, -128117800, -139034000, -143659680, --146247392, -148334752, -144509008, -133968080, -122643864, -109887272, -88977760, -62406948, -38290708, -13117904, -20552492, 54335632, 77318536, 99966976, 132959840, 152890640, 128148936, 70697848, 19562502, }, -}, -{ -{ -2073396, --2979634, -18908056, -27071178, -21386252, -18320184, -23614268, -12989055, 37278704, 116928336, 189235184, -210141472, 136106432, -37988448, -218234272, -246803856, -69617664, 159266512, 222396096, 84098680, -85161152, --130710352, -71215392, -10320270, 15589121, 37127844, 61506616, 61480848, 33908228, 8679592, 2712809, -5145908, 5570573, 6349036, 8035884, 5467494, -1516660, -8196945, -13848585, -20753818, -28450400, --35919884, -44459352, -53712324, -60499448, -64401424, -68532112, -73542728, -77055472, -79073032, -81757920, --84574888, -85309864, -84337592, -82905216, -79657688, -73227048, -65103652, -56403120, -45642080, -32365262, --18467822, -4152160, 12357158, 30300994, 47081432, 63054952, 79679696, 94618664, 105121472, 113066624, -119806504, 121319944, 115937808, 108282032, 95906616, 65061776, 16160888, -19744502, -14417668, }, -{ -2073396, --2979634, -18908056, -27071178, -21386252, -18320184, -23614268, -12989055, 37278704, 116928336, 189235184, -210141472, 136106432, -37988448, -218234272, -246803856, -69617664, 159266512, 222396096, 84098680, -85161152, --130710352, -71215392, -10320270, 15589121, 37127844, 61506616, 61480848, 33908228, 8679592, 2712809, -5145908, 5570573, 6349036, 8035884, 5467494, -1516660, -8196945, -13848585, -20753818, -28450400, --35919884, -44459352, -53712324, -60499448, -64401424, -68532112, -73542728, -77055472, -79073032, -81757920, --84574888, -85309864, -84337592, -82905216, -79657688, -73227048, -65103652, -56403120, -45642080, -32365262, --18467822, -4152160, 12357158, 30300994, 47081432, 63054952, 79679696, 94618664, 105121472, 113066624, -119806504, 121319944, 115937808, 108282032, 95906616, 65061776, 16160888, -19744502, -14417668, }, -}, -{ -{ --18935438, --43985296, -38830800, -1818382, 54804320, 102846752, 103673528, 40720048, -49203684, -99759208, -81579680, --28606092, 10171019, 23140210, 25193742, 19196894, -1850057, -25942140, -27653684, -3920768, 20147154, -25619480, 20407000, 20134270, 25312926, 25960392, 17194364, 1374390, -18625126, -40882184, -61797600, --76807440, -83958560, -85541256, -85887536, -87257096, -88059176, -85411328, -78131896, -66332548, -50427212, --32447942, -15933792, -2511482, 9138617, 19825570, 28585154, 35676684, 42913704, 50294068, 56216828, -61058864, 66391604, 71415104, 74494600, 76685568, 79417168, 81063216, 80016312, 77930032, 76124536, -72977400, 68185288, 64491080, 62619012, 60442536, 58506044, 59319940, 61267172, 61372400, 62210992, -66633732, 69985416, 68818264, 69603168, 73902432, 65627636, 34381212, 1323924, -5399311, }, -{ --18935438, --43985296, -38830800, -1818382, 54804320, 102846752, 103673528, 40720048, -49203684, -99759208, -81579680, --28606092, 10171019, 23140210, 25193742, 19196894, -1850057, -25942140, -27653684, -3920768, 20147154, -25619480, 20407000, 20134270, 25312926, 25960392, 17194364, 1374390, -18625126, -40882184, -61797600, --76807440, -83958560, -85541256, -85887536, -87257096, -88059176, -85411328, -78131896, -66332548, -50427212, --32447942, -15933792, -2511482, 9138617, 19825570, 28585154, 35676684, 42913704, 50294068, 56216828, -61058864, 66391604, 71415104, 74494600, 76685568, 79417168, 81063216, 80016312, 77930032, 76124536, -72977400, 68185288, 64491080, 62619012, 60442536, 58506044, 59319940, 61267172, 61372400, 62210992, -66633732, 69985416, 68818264, 69603168, 73902432, 65627636, 34381212, 1323924, -5399311, }, -}, -{ -{ -22884122, -33165738, -14810121, -76870248, -119964344, -152239952, -161800000, -97338992, 54136988, 226571872, 344021504, -370080704, 264061024, -6888054, -332583488, -444249408, -186128320, 236213536, 432803328, 260745312, -52605296, --228708080, -231985136, -193081872, -181198224, -165368592, -125485520, -86251000, -58675160, -25121264, 19414862, -59017144, 86671368, 109536696, 128960152, 138729584, 138406400, 132367136, 121195928, 104757472, 87383256, -72582800, 58667644, 43847856, 29568702, 16611860, 3802120, -8322573, -17597554, -24101746, -30022896, --36389648, -42929808, -49812492, -57200376, -64430952, -71055936, -77319608, -83103320, -87808992, -91350200, --94069984, -95959232, -96729104, -96223376, -94447944, -91560648, -87623776, -82350096, -75940392, -69602096, --63686312, -56837448, -49156976, -42819212, -35799088, -20797306, 1918240, 16711718, 9657771, }, -{ -22884122, -33165738, -14810121, -76870248, -119964344, -152239952, -161800000, -97338992, 54136988, 226571872, 344021504, -370080704, 264061024, -6888054, -332583488, -444249408, -186128320, 236213536, 432803328, 260745312, -52605296, --228708080, -231985136, -193081872, -181198224, -165368592, -125485520, -86251000, -58675160, -25121264, 19414862, -59017144, 86671368, 109536696, 128960152, 138729584, 138406400, 132367136, 121195928, 104757472, 87383256, -72582800, 58667644, 43847856, 29568702, 16611860, 3802120, -8322573, -17597554, -24101746, -30022896, --36389648, -42929808, -49812492, -57200376, -64430952, -71055936, -77319608, -83103320, -87808992, -91350200, --94069984, -95959232, -96729104, -96223376, -94447944, -91560648, -87623776, -82350096, -75940392, -69602096, --63686312, -56837448, -49156976, -42819212, -35799088, -20797306, 1918240, 16711718, 9657771, }, -}, -{ -{ -2676838, -11518565, 24768540, 38539280, 49642304, 43461848, -1695438, -78177528, -148516208, -194812208, -212254592, --142130128, 80136040, 349703232, 395369984, 95388536, -293716704, -390215488, -136282000, 164463424, 246670704, -150524640, 59037008, 36267776, 23570780, -11730093, -40562744, -45773612, -45122928, -48447768, -44677324, --29554206, -13287018, -2261300, 6082748, 13103408, 17475686, 20345260, 23156316, 24241332, 22792318, -21519396, 21908092, 21725556, 19693498, 17955110, 18005040, 18484466, 18526342, 19449760, 21778168, -23864986, 24606942, 24705188, 24425480, 22779432, 19651086, 16250009, 12910135, 8831527, 4265977, -374736, -3143379, -7501161, -12150462, -15678778, -18737868, -22670448, -26356066, -28297392, -30069066, --33279018, -35760436, -35962300, -37124624, -40197672, -37626060, -23779086, -7109245, -69793, }, -{ --2676838, --11518565, -24768540, -38539280, -49642304, -43461848, 1695438, 78177528, 148516208, 194812208, 212254592, -142130128, -80136040, -349703232, -395369984, -95388536, 293716704, 390215488, 136282000, -164463424, -246670704, --150524640, -59037008, -36267776, -23570780, 11730093, 40562744, 45773612, 45122928, 48447768, 44677324, -29554206, 13287018, 2261300, -6082748, -13103408, -17475686, -20345260, -23156316, -24241332, -22792318, --21519396, -21908092, -21725556, -19693498, -17955110, -18005040, -18484466, -18526342, -19449760, -21778168, --23864986, -24606942, -24705188, -24425480, -22779432, -19651086, -16250009, -12910135, -8831527, -4265977, --374736, 3143379, 7501161, 12150462, 15678778, 18737868, 22670448, 26356066, 28297392, 30069066, -33279018, 35760436, 35962300, 37124624, 40197672, 37626060, 23779086, 7109245, 69793, }, -}, -{ -{ -1826435, -2365990, -3248606, -13448616, -22016002, -13940390, 23158464, 68848328, 71952512, 11164231, -61750356, --75194680, -26665842, 19692962, 22051436, 4394826, 2568391, 10317585, 3354906, -14431627, -20328080, --11798812, -7087770, -13144747, -16881906, -8556112, 4356708, 10319196, 7961259, 2301566, -4439386, --12662100, -20942798, -26485990, -28083718, -26211112, -21811454, -16364362, -11366631, -6633040, -730144, -6294275, 12436615, 16386374, 18624052, 19660750, 19497540, 19136764, 20284056, 23205708, 26865020, -30972620, 35785668, 40469328, 43934832, 46569792, 49092012, 50889456, 51408612, 51532628, 51770464, -51113868, 49217640, 47254840, 45489608, 42914776, 39926552, 37963216, 36498096, 34237868, 32390496, -32307818, 31949188, 29954176, 29531122, 31299574, 27438398, 13022878, -1730335, -3430605, }, -{ --1826435, --2365990, 3248606, 13448616, 22016002, 13940390, -23158464, -68848328, -71952512, -11164231, 61750356, -75194680, 26665842, -19692962, -22051436, -4394826, -2568391, -10317585, -3354906, 14431627, 20328080, -11798812, 7087770, 13144747, 16881906, 8556112, -4356708, -10319196, -7961259, -2301566, 4439386, -12662100, 20942798, 26485990, 28083718, 26211112, 21811454, 16364362, 11366631, 6633040, 730144, --6294275, -12436615, -16386374, -18624052, -19660750, -19497540, -19136764, -20284056, -23205708, -26865020, --30972620, -35785668, -40469328, -43934832, -46569792, -49092012, -50889456, -51408612, -51532628, -51770464, --51113868, -49217640, -47254840, -45489608, -42914776, -39926552, -37963216, -36498096, -34237868, -32390496, --32307818, -31949188, -29954176, -29531122, -31299574, -27438398, -13022878, 1730335, 3430605, }, -}, -{ -{ -6216965, -17775796, 19325742, 5274757, -1144072, 26213260, 59710784, 29491930, -86476480, -207889840, -211848720, --52057152, 175533696, 290100352, 183276992, -57808112, -215628832, -163201776, 7863012, 113510616, 89436248, -18616536, -17101486, -24245090, -34355444, -37672768, -15455440, 15083388, 26690538, 22615150, 23285166, -34309272, 48685600, 63653564, 78474424, 87381112, 86266568, 78198472, 67035848, 53475564, 39097624, -26377004, 14476187, 1400159, -11567958, -22792318, -33887828, -45995880, -57177824, -66847408, -77320688, --88754424, -98337568, -105320112, -110883168, -113760800, -112169512, -108133320, -104066520, -98369784, -89551680, --79765592, -69713224, -56391308, -39460548, -22283900, -4645007, 16423955, 38332048, 56144348, 72164576, -90016608, 103996728, 108877424, 111673448, 114932784, 100724496, 57576184, 11511049, -3173444, }, -{ --6216965, --17775796, -19325742, -5274757, 1144072, -26213260, -59710784, -29491930, 86476480, 207889840, 211848720, -52057152, -175533696, -290100352, -183276992, 57808112, 215628832, 163201776, -7863012, -113510616, -89436248, --18616536, 17101486, 24245090, 34355444, 37672768, 15455440, -15083388, -26690538, -22615150, -23285166, --34309272, -48685600, -63653564, -78474424, -87381112, -86266568, -78198472, -67035848, -53475564, -39097624, --26377004, -14476187, -1400159, 11567958, 22792318, 33887828, 45995880, 57177824, 66847408, 77320688, -88754424, 98337568, 105320112, 110883168, 113760800, 112169512, 108133320, 104066520, 98369784, 89551680, -79765592, 69713224, 56391308, 39460548, 22283900, 4645007, -16423955, -38332048, -56144348, -72164576, --90016608, -103996728, -108877424, -111673448, -114932784, -100724496, -57576184, -11511049, 3173444, }, -}, -{ -{ -189515, -2603824, 9093520, 16408923, 17219060, 6584185, -13749801, -36543728, -49490372, -37393060, 2747169, -46044196, 55252068, 21684754, -21689048, -37904160, -24512452, -3768834, 11381126, 24070070, 34782792, -35836132, 25294674, 12073153, 3120831, -5666136, -21471078, -42727408, -59395640, -63018980, -53593140, --37393596, -21197812, -9469866, -3933653, -2723009, -1264868, 3184182, 8684424, 12015708, 12869870, -12582107, 11391327, 9513353, 8288213, 7928510, 6730214, 4024384, 868657, -2894808, -8582955, --15516643, -21930104, -28495498, -36749888, -45392972, -52441012, -58786828, -65393560, -70221104, -72049152, --73160472, -74549360, -73696272, -70130376, -66786204, -63549948, -56963076, -47561396, -38742752, -28575492, --13094282, 4017942, 17359184, 31820876, 53082036, 69996152, 65097744, 40224516, 12428562, }, -{ -189515, -2603824, 9093520, 16408923, 17219060, 6584185, -13749801, -36543728, -49490372, -37393060, 2747169, -46044196, 55252068, 21684754, -21689048, -37904160, -24512452, -3768834, 11381126, 24070070, 34782792, -35836132, 25294674, 12073153, 3120831, -5666136, -21471078, -42727408, -59395640, -63018980, -53593140, --37393596, -21197812, -9469866, -3933653, -2723009, -1264868, 3184182, 8684424, 12015708, 12869870, -12582107, 11391327, 9513353, 8288213, 7928510, 6730214, 4024384, 868657, -2894808, -8582955, --15516643, -21930104, -28495498, -36749888, -45392972, -52441012, -58786828, -65393560, -70221104, -72049152, --73160472, -74549360, -73696272, -70130376, -66786204, -63549948, -56963076, -47561396, -38742752, -28575492, --13094282, 4017942, 17359184, 31820876, 53082036, 69996152, 65097744, 40224516, 12428562, }, -}, -{ -{ -1822677, -10966125, 24683178, 28093918, 14313515, -10498511, -41405096, -70848168, -72985456, -23443542, 56086368, -101519608, 72735808, -771484, -54526220, -54574000, -17211008, 19396610, 26918708, 2150705, -31897648, --43881680, -23245436, 11316165, 35585416, 43225088, 41516764, 35880156, 27685896, 19294604, 11999602, -3074123, -9389335, -22429392, -32571958, -40118752, -46413564, -50786916, -52326660, -51607792, -49622980, --47427176, -46620796, -47962436, -50420232, -53144852, -56469692, -59701120, -60630980, -58479200, -54543936, --49472656, -43031276, -36491116, -31762894, -28569048, -25620554, -23313620, -22183506, -20781200, -18009872, --14838575, -11260331, -5197448, 3537979, 12585865, 21601002, 32216012, 43009804, 50777252, 56388088, -62372588, 66507568, 66082368, 64952792, 65838092, 60432876, 40850508, 16411607, 2739652, }, -{ -1822677, -10966125, 24683178, 28093918, 14313515, -10498511, -41405096, -70848168, -72985456, -23443542, 56086368, -101519608, 72735808, -771484, -54526220, -54574000, -17211008, 19396610, 26918708, 2150705, -31897648, --43881680, -23245436, 11316165, 35585416, 43225088, 41516764, 35880156, 27685896, 19294604, 11999602, -3074123, -9389335, -22429392, -32571958, -40118752, -46413564, -50786916, -52326660, -51607792, -49622980, --47427176, -46620796, -47962436, -50420232, -53144852, -56469692, -59701120, -60630980, -58479200, -54543936, --49472656, -43031276, -36491116, -31762894, -28569048, -25620554, -23313620, -22183506, -20781200, -18009872, --14838575, -11260331, -5197448, 3537979, 12585865, 21601002, 32216012, 43009804, 50777252, 56388088, -62372588, 66507568, 66082368, 64952792, 65838092, 60432876, 40850508, 16411607, 2739652, }, -}, -{ -{ --4294968, --7507066, -4181688, -2804077, -789200, 14018236, 31004296, 11244224, -57692684, -116162224, -83996672, -33115272, 126618320, 102010304, -9821516, -90741920, -72991896, -1560147, 42258720, 39131984, 29724394, -41158136, 53827216, 40559524, 6607271, -24050206, -43329776, -61671972, -85042496, -106395464, -117824376, --118264608, -109136192, -92132952, -71879496, -53593676, -38022272, -23476292, -10812580, -1838246, 4233227, -8389145, 9313100, 6932614, 4554276, 4452271, 5563057, 7459822, 11628087, 17483738, 22373558, -26091390, 30193084, 33485712, 33631204, 31635656, 29486562, 26051662, 20342038, 14958834, 11668352, -8486855, 4993437, 4293357, 6699612, 8923331, 11404212, 17710834, 26282516, 32901596, 39942660, -51406464, 62460636, 67791760, 73733848, 84428320, 84616760, 59421408, 23559506, 3558917, }, -{ --4294968, --7507066, -4181688, -2804077, -789200, 14018236, 31004296, 11244224, -57692684, -116162224, -83996672, -33115272, 126618320, 102010304, -9821516, -90741920, -72991896, -1560147, 42258720, 39131984, 29724394, -41158136, 53827216, 40559524, 6607271, -24050206, -43329776, -61671972, -85042496, -106395464, -117824376, --118264608, -109136192, -92132952, -71879496, -53593676, -38022272, -23476292, -10812580, -1838246, 4233227, -8389145, 9313100, 6932614, 4554276, 4452271, 5563057, 7459822, 11628087, 17483738, 22373558, -26091390, 30193084, 33485712, 33631204, 31635656, 29486562, 26051662, 20342038, 14958834, 11668352, -8486855, 4993437, 4293357, 6699612, 8923331, 11404212, 17710834, 26282516, 32901596, 39942660, -51406464, 62460636, 67791760, 73733848, 84428320, 84616760, 59421408, 23559506, 3558917, }, -}, -{ -{ -130997, -32749, -657130, -1952063, -4070555, -5195300, -1305133, 5801964, 3170223, -17411798, -35338992, --13445932, 48125644, 87900264, 46130632, -50145892, -102243840, -54114976, 39600136, 82422568, 47283296, --11302743, -37545532, -27742804, -6405407, 12627204, 27227946, 32908576, 25679610, 9967545, -6510634, --20486458, -31356482, -38201588, -42526620, -48736068, -58842664, -70268352, -79784384, -85971288, -87773024, --84463752, -77336792, -68763504, -60016800, -51819316, -45513232, -41750840, -39570608, -38140384, -37666864, --37796248, -37277096, -35762044, -33891588, -31652298, -28792924, -26312580, -25286084, -25139518, -25078850, --25694104, -27195196, -28119688, -27651536, -26830124, -25931938, -23602992, -19831474, -16272020, -12678207, --7124814, -360777, 5003637, 10241886, 19488950, 31398358, 37372120, 30353608, 11592654, }, -{ -130997, -32749, -657130, -1952063, -4070555, -5195300, -1305133, 5801964, 3170223, -17411798, -35338992, --13445932, 48125644, 87900264, 46130632, -50145892, -102243840, -54114976, 39600136, 82422568, 47283296, --11302743, -37545532, -27742804, -6405407, 12627204, 27227946, 32908576, 25679610, 9967545, -6510634, --20486458, -31356482, -38201588, -42526620, -48736068, -58842664, -70268352, -79784384, -85971288, -87773024, --84463752, -77336792, -68763504, -60016800, -51819316, -45513232, -41750840, -39570608, -38140384, -37666864, --37796248, -37277096, -35762044, -33891588, -31652298, -28792924, -26312580, -25286084, -25139518, -25078850, --25694104, -27195196, -28119688, -27651536, -26830124, -25931938, -23602992, -19831474, -16272020, -12678207, --7124814, -360777, 5003637, 10241886, 19488950, 31398358, 37372120, 30353608, 11592654, }, -}, -}; -const Word32 CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[9][BINAURAL_CHANNELS][240] ={ -{ -{ -512962432, -341278624, 89471152, -133512280, -273079936, -336122528, -349119104, -324554560, -262216880, -165630048, -48346836, -71613208, 178208400, 260153680, 312068576, 334596736, 332439584, 311149984, 274952000, 226719520, 169514304, -107816568, 46557444, -11423539, -66238596, -118599080, -167255696, -209594400, -244145264, -271385568, -292355200, --307673728, -318017088, -324545984, -328378176, -330089184, -330015616, -328703520, -326799776, -324659264, -322200928, --319094048, -315034784, -309916256, -303793760, -296752704, -288858016, -280184864, -270791232, -260669616, -249816240, --238352432, -226495632, -214416576, -202232832, -190123168, -178318992, -166931424, -155884768, -145072192, -134496368, --124182000, -114053928, -104028400, -94160712, -84567368, -75240848, -66096864, -57156352, -48493400, -40037148, --31628140, -23242216, -14948097, -6672769, 1749125, 10307385, 18875308, 27525908, 36488968, 45755360, -55016920, 64084132, 73094440, 82186344, 91185376, 99786584, 107938432, 115887344, 123832496, 131617128, -138845552, 145306800, 151179632, 156724960, 161890736, 166396160, 170170896, 173537616, 176927424, 180539488, -184295440, 188059968, 191885712, 196051296, 200819248, 206168096, 211840672, 217638880, 223553584, 229627200, -235830208, 242074016, 248225488, 254111744, 259614672, 264742864, 269561824, 274113952, 278446496, 282621184, -286661696, 290560448, 294354496, 298083616, 301694080, 305092992, 308258944, 311198304, 313860640, 316228256, -318407392, 320516768, 322582656, 324619520, 326685952, 328788864, 330859584, 332886272, 334947328, 337102304, -339371680, 341797792, 344388736, 347055904, 349720928, 352393472, 355058496, 357624224, 360061600, 362436736, -364735072, 366851936, 368770720, 370553664, 372156768, 373476928, 374532416, 375398944, 376060352, 376523136, -376932224, 377384832, 377836864, 378318976, 378977184, 379788384, 380547520, 381205184, 381878976, 382534496, -383036448, 383457888, 383944320, 384410304, 384740480, 385069056, 385508224, 385921056, 386296352, 386908384, -387834464, 388840576, 389929344, 391359552, 393029248, 394594208, 396151680, 397985088, 399829248, 401337312, -402847520, 404673440, 406299616, 407403968, 408692448, 410470560, 411757984, 412218624, 413173184, 414995840, -415814048, 414951296, 414971136, 417450432, 419495904, 417959904, 414614144, 413365376, 414550784, 415673920, -415281472, 412165472, 403878336, 391482496, 383384352, 387701344, 400877760, 409806464, 406541728, 396224704, -388697760, 386601280, 385393856, 383336032, 387025408, 404428608, 433276288, 459798784, 471420992, 468912192, -462834272, 459868576, 458020160, 454963200, 453582368, 455604224, 456054656, 450368128, 443227744, }, -{ -512962432, -341278624, 89471152, -133512280, -273079936, -336122528, -349119104, -324554560, -262216880, -165630048, -48346836, -71613208, 178208400, 260153680, 312068576, 334596736, 332439584, 311149984, 274952000, 226719520, 169514304, -107816568, 46557444, -11423539, -66238596, -118599080, -167255696, -209594400, -244145264, -271385568, -292355200, --307673728, -318017088, -324545984, -328378176, -330089184, -330015616, -328703520, -326799776, -324659264, -322200928, --319094048, -315034784, -309916256, -303793760, -296752704, -288858016, -280184864, -270791232, -260669616, -249816240, --238352432, -226495632, -214416576, -202232832, -190123168, -178318992, -166931424, -155884768, -145072192, -134496368, --124182000, -114053928, -104028400, -94160712, -84567368, -75240848, -66096864, -57156352, -48493400, -40037148, --31628140, -23242216, -14948097, -6672769, 1749125, 10307385, 18875308, 27525908, 36488968, 45755360, -55016920, 64084132, 73094440, 82186344, 91185376, 99786584, 107938432, 115887344, 123832496, 131617128, -138845552, 145306800, 151179632, 156724960, 161890736, 166396160, 170170896, 173537616, 176927424, 180539488, -184295440, 188059968, 191885712, 196051296, 200819248, 206168096, 211840672, 217638880, 223553584, 229627200, -235830208, 242074016, 248225488, 254111744, 259614672, 264742864, 269561824, 274113952, 278446496, 282621184, -286661696, 290560448, 294354496, 298083616, 301694080, 305092992, 308258944, 311198304, 313860640, 316228256, -318407392, 320516768, 322582656, 324619520, 326685952, 328788864, 330859584, 332886272, 334947328, 337102304, -339371680, 341797792, 344388736, 347055904, 349720928, 352393472, 355058496, 357624224, 360061600, 362436736, -364735072, 366851936, 368770720, 370553664, 372156768, 373476928, 374532416, 375398944, 376060352, 376523136, -376932224, 377384832, 377836864, 378318976, 378977184, 379788384, 380547520, 381205184, 381878976, 382534496, -383036448, 383457888, 383944320, 384410304, 384740480, 385069056, 385508224, 385921056, 386296352, 386908384, -387834464, 388840576, 389929344, 391359552, 393029248, 394594208, 396151680, 397985088, 399829248, 401337312, -402847520, 404673440, 406299616, 407403968, 408692448, 410470560, 411757984, 412218624, 413173184, 414995840, -415814048, 414951296, 414971136, 417450432, 419495904, 417959904, 414614144, 413365376, 414550784, 415673920, -415281472, 412165472, 403878336, 391482496, 383384352, 387701344, 400877760, 409806464, 406541728, 396224704, -388697760, 386601280, 385393856, 383336032, 387025408, 404428608, 433276288, 459798784, 471420992, 468912192, -462834272, 459868576, 458020160, 454963200, 453582368, 455604224, 456054656, 450368128, 443227744, }, -}, -{ -{ -52245056, -222357440, 401378656, 405117408, 177587776, -175398416, -484049792, -639197952, -636222080, -529849184, -372046176, --190520992, -1207423, 180006368, 338932512, 467017568, 559677696, 613684800, 628635008, 609800512, 567096768, -509938784, 443115008, 367884352, 286288032, 202992496, 122816200, 47916804, -21818970, -86701968, -146555552, --201343232, -251326992, -296677536, -337539328, -374389088, -407893568, -438432960, -465938464, -490061664, -510374176, --526579648, -538713472, -547120320, -552200192, -554222592, -553347456, -549751488, -543766464, -535939456, -526901760, --517067360, -506422816, -494632608, -481365440, -466567136, -450447584, -433289184, -415364128, -397026784, -378695328, --360628000, -342847360, -325416256, -308596096, -292586048, -277312064, -262696848, -248960464, -236373520, -224892000, --214347328, -204829680, -196494224, -189083248, -182072784, -175281904, -168897440, -162823824, -156483920, -149478288, --142028128, -134456640, -126554432, -117843168, -108263240, -98220000, -88029112, -77636368, -66831840, -55431384, --43236900, -30057792, -15797427, -396748, 16277389, 34321620, 53564684, 73533064, 93622768, 113299624, -132184064, 149990464, 166375216, 180912608, 193301984, 203518096, 211669408, 217803168, 221992368, 224550016, -226047344, 227133440, 228310256, 229737808, 231250704, 232713680, 234367776, 236709600, 240074720, 244437856, -249490896, 254743104, 259698416, 264169472, 268354384, 272495264, 276597504, 280563904, 284394496, 288109632, -291644384, 294928960, 297945088, 300674560, 303140928, 305479552, 307833728, 310224960, 312618848, 315017056, -317417952, 319834400, 322408160, 325350208, 328767936, 332695136, 337183936, 342184864, 347478432, 352943776, -358699552, 364821504, 371184480, 377744512, 384615936, 391724640, 398746368, 405488928, 411961440, 418068352, -423652352, 428781088, 433596800, 438024384, 441962336, 445481536, 448564768, 451039200, 453010080, 454851008, -456647904, 458242400, 459807392, 461649376, 463540256, 464983360, 465905152, 466422176, 466403936, 465932000, -465512192, 465289920, 464921632, 464530784, 464633856, 465020416, 465081600, 465055840, 465463328, 465917504, -466071584, 466539200, 467415936, 467811584, 468096672, 469604192, 471310368, 471249728, 471386624, 474611072, -477533792, 475729376, 474826336, 482493408, 490060064, 481175936, 461027168, 453999520, 466616000, 478818528, -481039552, 489577952, 509314944, 512657504, 480248736, 437299072, 422137312, 437084864, 454490208, 455429728, -441966080, 425956064, 420154624, 421830208, 396297696, 307272160, 179973088, 99357624, 118199648, 194585104, -249248224, 258870032, 258446432, 271055936, 276278080, 246866128, 186275952, 122813520, 84121232, }, -{ --52245056, --222357440, -401378656, -405117408, -177587776, 175398416, 484049792, 639197952, 636222080, 529849184, 372046176, -190520992, 1207423, -180006368, -338932512, -467017568, -559677696, -613684800, -628635008, -609800512, -567096768, --509938784, -443115008, -367884352, -286288032, -202992496, -122816200, -47916804, 21818970, 86701968, 146555552, -201343232, 251326992, 296677536, 337539328, 374389088, 407893568, 438432960, 465938464, 490061664, 510374176, -526579648, 538713472, 547120320, 552200192, 554222592, 553347456, 549751488, 543766464, 535939456, 526901760, -517067360, 506422816, 494632608, 481365440, 466567136, 450447584, 433289184, 415364128, 397026784, 378695328, -360628000, 342847360, 325416256, 308596096, 292586048, 277312064, 262696848, 248960464, 236373520, 224892000, -214347328, 204829680, 196494224, 189083248, 182072784, 175281904, 168897440, 162823824, 156483920, 149478288, -142028128, 134456640, 126554432, 117843168, 108263240, 98220000, 88029112, 77636368, 66831840, 55431384, -43236900, 30057792, 15797427, 396748, -16277389, -34321620, -53564684, -73533064, -93622768, -113299624, --132184064, -149990464, -166375216, -180912608, -193301984, -203518096, -211669408, -217803168, -221992368, -224550016, --226047344, -227133440, -228310256, -229737808, -231250704, -232713680, -234367776, -236709600, -240074720, -244437856, --249490896, -254743104, -259698416, -264169472, -268354384, -272495264, -276597504, -280563904, -284394496, -288109632, --291644384, -294928960, -297945088, -300674560, -303140928, -305479552, -307833728, -310224960, -312618848, -315017056, --317417952, -319834400, -322408160, -325350208, -328767936, -332695136, -337183936, -342184864, -347478432, -352943776, --358699552, -364821504, -371184480, -377744512, -384615936, -391724640, -398746368, -405488928, -411961440, -418068352, --423652352, -428781088, -433596800, -438024384, -441962336, -445481536, -448564768, -451039200, -453010080, -454851008, --456647904, -458242400, -459807392, -461649376, -463540256, -464983360, -465905152, -466422176, -466403936, -465932000, --465512192, -465289920, -464921632, -464530784, -464633856, -465020416, -465081600, -465055840, -465463328, -465917504, --466071584, -466539200, -467415936, -467811584, -468096672, -469604192, -471310368, -471249728, -471386624, -474611072, --477533792, -475729376, -474826336, -482493408, -490060064, -481175936, -461027168, -453999520, -466616000, -478818528, --481039552, -489577952, -509314944, -512657504, -480248736, -437299072, -422137312, -437084864, -454490208, -455429728, --441966080, -425956064, -420154624, -421830208, -396297696, -307272160, -179973088, -99357624, -118199648, -194585104, --249248224, -258870032, -258446432, -271055936, -276278080, -246866128, -186275952, -122813520, -84121232, }, -}, -{ -{ -62659816, -38722352, -11076184, -60224032, -64550676, -17122960, 36206036, 49209052, 21104396, -18492518, -45760192, --51160576, -33653752, -3940096, 18916110, 27378806, 33587716, 49711564, 70036424, 80460840, 76390288, -62512712, 42136852, 16138340, -11113765, -32715302, -45996416, -54346368, -62400508, -71465568, -79259328, --82685640, -80657336, -74535400, -66313220, -57463980, -49786188, -45816564, -47165720, -53153980, -61890480, --72054520, -83056080, -94266480, -104957192, -114767432, -123768608, -132179768, -140125456, -147380736, -153205776, --156636928, -157067488, -154404608, -148668688, -139690048, -127354904, -111901080, -93701688, -72853920, -49290656, --23210540, 4962298, 34977140, 66672388, 99487552, 132486320, 164877360, 196077600, 225302704, 251551408, -274001184, 292006240, 304865920, 312142112, 314117280, 311378688, 304061664, 292163008, 276567968, 258962368, -240438176, 220876752, 200222256, 179760480, 161236832, 144897168, 129446560, 114223584, 100441032, 89645632, -81753088, 75438952, 69926896, 65512208, 62658740, 61415348, 61547956, 62589484, 63835564, 64725156, -65174520, 65392488, 65549792, 65541736, 64729452, 62083216, 57110180, 50492172, 43350180, 36120676, -28581934, 20549272, 12043625, 3192771, -5557151, -13465796, -20022064, -25061672, -28369332, -29724932, --29306172, -27434640, -24060406, -19061602, -12779675, -5724655, 1852742, 9672266, 17251274, 24357296, -31011812, 36879272, 41431940, 44782552, 47552804, 50098648, 52689048, 55994564, 60378112, 65176128, -69586520, 73636144, 77542416, 81007376, 83853328, 86369104, 88510688, 89804544, 90308128, 90538984, -90499256, 89949504, 89303648, 89043264, 88824752, 88268024, 87730072, 87346752, 86524264, 85144504, -83846888, 82624968, 80781352, 78412680, 76166416, 73822432, 70982928, 68426880, 66885524, 65678104, -64276868, 63483376, 63561756, 63418412, 62732292, 62209916, 61218852, 58342300, 54159000, 49993956, -44940392, 37859600, 30307436, 23600846, 16100759, 7088307, -1053878, -7720741, -15330349, -23497230, --29404956, -34690452, -42556148, -49550500, -52049636, -56297896, -66867272, -73780024, -70877696, -73289320, --89980104, -98395016, -84137872, -82304992, -124999120, -167590160, -137833552, -51009180, 2131378, -13793287, --42914776, -47504484, -63734632, -112846504, -139538656, -94187024, -16139950, 21853330, 10275172, -6083285, --2624762, 3426310, -12224551, -53722524, -98392872, -104956656, -52281028, 21005074, 46271292, 6119792, --45652280, -58137216, -42524472, -37187436, -46717968, -46745352, -29186988, -10275709, -1818919, }, -{ -62659816, -38722352, -11076184, -60224032, -64550676, -17122960, 36206036, 49209052, 21104396, -18492518, -45760192, --51160576, -33653752, -3940096, 18916110, 27378806, 33587716, 49711564, 70036424, 80460840, 76390288, -62512712, 42136852, 16138340, -11113765, -32715302, -45996416, -54346368, -62400508, -71465568, -79259328, --82685640, -80657336, -74535400, -66313220, -57463980, -49786188, -45816564, -47165720, -53153980, -61890480, --72054520, -83056080, -94266480, -104957192, -114767432, -123768608, -132179768, -140125456, -147380736, -153205776, --156636928, -157067488, -154404608, -148668688, -139690048, -127354904, -111901080, -93701688, -72853920, -49290656, --23210540, 4962298, 34977140, 66672388, 99487552, 132486320, 164877360, 196077600, 225302704, 251551408, -274001184, 292006240, 304865920, 312142112, 314117280, 311378688, 304061664, 292163008, 276567968, 258962368, -240438176, 220876752, 200222256, 179760480, 161236832, 144897168, 129446560, 114223584, 100441032, 89645632, -81753088, 75438952, 69926896, 65512208, 62658740, 61415348, 61547956, 62589484, 63835564, 64725156, -65174520, 65392488, 65549792, 65541736, 64729452, 62083216, 57110180, 50492172, 43350180, 36120676, -28581934, 20549272, 12043625, 3192771, -5557151, -13465796, -20022064, -25061672, -28369332, -29724932, --29306172, -27434640, -24060406, -19061602, -12779675, -5724655, 1852742, 9672266, 17251274, 24357296, -31011812, 36879272, 41431940, 44782552, 47552804, 50098648, 52689048, 55994564, 60378112, 65176128, -69586520, 73636144, 77542416, 81007376, 83853328, 86369104, 88510688, 89804544, 90308128, 90538984, -90499256, 89949504, 89303648, 89043264, 88824752, 88268024, 87730072, 87346752, 86524264, 85144504, -83846888, 82624968, 80781352, 78412680, 76166416, 73822432, 70982928, 68426880, 66885524, 65678104, -64276868, 63483376, 63561756, 63418412, 62732292, 62209916, 61218852, 58342300, 54159000, 49993956, -44940392, 37859600, 30307436, 23600846, 16100759, 7088307, -1053878, -7720741, -15330349, -23497230, --29404956, -34690452, -42556148, -49550500, -52049636, -56297896, -66867272, -73780024, -70877696, -73289320, --89980104, -98395016, -84137872, -82304992, -124999120, -167590160, -137833552, -51009180, 2131378, -13793287, --42914776, -47504484, -63734632, -112846504, -139538656, -94187024, -16139950, 21853330, 10275172, -6083285, --2624762, 3426310, -12224551, -53722524, -98392872, -104956656, -52281028, 21005074, 46271292, 6119792, --45652280, -58137216, -42524472, -37187436, -46717968, -46745352, -29186988, -10275709, -1818919, }, -}, -{ -{ -30986042, -41208064, 31604516, -7399155, -42646876, -39767640, -8690329, 9193377, -9797894, -50169512, -80211200, --82558400, -61758408, -32665374, -6299107, 17018808, 44122736, 78785808, 115747760, 145393776, 161863360, -164769440, 156054960, 138911584, 118105696, 97078608, 74432320, 46010376, 10551661, -29061896, -69958040, --111732504, -154016992, -194130912, -228740288, -256414384, -277224576, -290905664, -296850944, -295474944, -288444640, --277581600, -264112576, -248858464, -232574624, -215908000, -199137776, -182061520, -164289472, -145810384, -127242704, --109562472, -93752696, -80578952, -70182984, -61754652, -53999552, -46059768, -37711424, -28867548, -19485730, --9903658, -617938, 8284992, 16995722, 25460566, 33608120, 41878616, 50787988, 60144576, 69420096, -78682728, 88327080, 98025648, 106839992, 114352432, 120786288, 125909112, 128759360, 128811440, 126640328, -122903712, 117325624, 109403016, 99716792, 89660664, 79934712, 70110512, 59742996, 49027588, 38056096, -26288958, 13349832, -290447, -14012331, -27895812, -42229728, -56575992, -69955888, -81798192, -92246232, --101595304, -109661792, -115653808, -118719336, -118834768, -117011016, -114291768, -110680232, -105365208, -97847408, --88574576, -78688632, -69342248, -60915520, -52671868, -43502112, -33178086, -22635014, -13069585, -5121212, -1269700, 6783364, 12419972, 18757732, 25522306, 32154272, 38526392, 44866840, 51430084, 58572616, -66713728, 75898512, 85738288, 95884072, 106171592, 116355496, 126199024, 135748880, 145082928, 153948272, -162009920, 169149232, 175212112, 179893632, 183124528, 185137792, 186045104, 185845376, 184825872, 183374704, -181551488, 179378768, 177229136, 175403776, 173817328, 172571792, 172180944, 172819280, 174104016, 175875152, -178309328, 181149376, 183806880, 186217968, 188689728, 191221600, 193850672, 197067600, 201028096, 205163616, -209240064, 213670336, 218358816, 222652176, 226637904, 230825504, 234698480, 237382304, 239169552, 240502064, -240591712, 238975200, 236730000, 234369392, 230888848, 226354976, 222320928, 218723888, 214212560, 209614272, -206391968, 202894256, 197778944, 194057904, 192942272, 189404304, 182277872, 179474880, 182312768, 178666880, -166541120, 164434432, 176035680, 170421088, 132294656, 105728136, 138884208, 204635872, 234144976, 216945776, -202112576, 205021344, 188581808, 148576880, 140651056, 192015632, 251442960, 265291008, 249755040, 247953824, -261581232, 266896240, 260015712, 244418000, 205954416, 143459968, 99007584, 113309824, 165628432, 198232064, -192291584, 181625584, 192703376, 208599040, 204571984, 191691376, 202913040, 245402080, 285669536, }, -{ -30986042, -41208064, 31604516, -7399155, -42646876, -39767640, -8690329, 9193377, -9797894, -50169512, -80211200, --82558400, -61758408, -32665374, -6299107, 17018808, 44122736, 78785808, 115747760, 145393776, 161863360, -164769440, 156054960, 138911584, 118105696, 97078608, 74432320, 46010376, 10551661, -29061896, -69958040, --111732504, -154016992, -194130912, -228740288, -256414384, -277224576, -290905664, -296850944, -295474944, -288444640, --277581600, -264112576, -248858464, -232574624, -215908000, -199137776, -182061520, -164289472, -145810384, -127242704, --109562472, -93752696, -80578952, -70182984, -61754652, -53999552, -46059768, -37711424, -28867548, -19485730, --9903658, -617938, 8284992, 16995722, 25460566, 33608120, 41878616, 50787988, 60144576, 69420096, -78682728, 88327080, 98025648, 106839992, 114352432, 120786288, 125909112, 128759360, 128811440, 126640328, -122903712, 117325624, 109403016, 99716792, 89660664, 79934712, 70110512, 59742996, 49027588, 38056096, -26288958, 13349832, -290447, -14012331, -27895812, -42229728, -56575992, -69955888, -81798192, -92246232, --101595304, -109661792, -115653808, -118719336, -118834768, -117011016, -114291768, -110680232, -105365208, -97847408, --88574576, -78688632, -69342248, -60915520, -52671868, -43502112, -33178086, -22635014, -13069585, -5121212, -1269700, 6783364, 12419972, 18757732, 25522306, 32154272, 38526392, 44866840, 51430084, 58572616, -66713728, 75898512, 85738288, 95884072, 106171592, 116355496, 126199024, 135748880, 145082928, 153948272, -162009920, 169149232, 175212112, 179893632, 183124528, 185137792, 186045104, 185845376, 184825872, 183374704, -181551488, 179378768, 177229136, 175403776, 173817328, 172571792, 172180944, 172819280, 174104016, 175875152, -178309328, 181149376, 183806880, 186217968, 188689728, 191221600, 193850672, 197067600, 201028096, 205163616, -209240064, 213670336, 218358816, 222652176, 226637904, 230825504, 234698480, 237382304, 239169552, 240502064, -240591712, 238975200, 236730000, 234369392, 230888848, 226354976, 222320928, 218723888, 214212560, 209614272, -206391968, 202894256, 197778944, 194057904, 192942272, 189404304, 182277872, 179474880, 182312768, 178666880, -166541120, 164434432, 176035680, 170421088, 132294656, 105728136, 138884208, 204635872, 234144976, 216945776, -202112576, 205021344, 188581808, 148576880, 140651056, 192015632, 251442960, 265291008, 249755040, 247953824, -261581232, 266896240, 260015712, 244418000, 205954416, 143459968, 99007584, 113309824, 165628432, 198232064, -192291584, 181625584, 192703376, 208599040, 204571984, 191691376, 202913040, 245402080, 285669536, }, -}, -{ -{ -11927661, -8254391, 9876814, 18951544, 25066502, 20257214, 11820287, 10667088, 10446971, -9302362, -55198920, --104534136, -125722816, -109843248, -74312064, -38511360, -5645198, 30492658, 71030704, 110766136, 145943520, -176026016, 199234400, 212091920, 213726160, 206675968, 192827392, 171563536, 142487152, 107303312, 68175624, -26241176, -17527762, -61694520, -105109664, -146663472, -183782720, -212766768, -231493904, -240935856, -243704496, --242107840, -237774224, -231883680, -225010112, -217201872, -208442816, -198703984, -187731952, -175365664, -161985232, --148284288, -134872704, -122400664, -111573584, -102565432, -94773824, -87489560, -80411448, -73331736, -65885872, --57874148, -49357228, -40272836, -30412664, -19817516, -8664023, 3191161, 16006269, 29560650, 43398496, -57560076, 72373424, 87538952, 102159016, 115723064, 128294432, 139524704, 148304144, 153923568, 156971920, -158372624, 157951712, 154864704, 149269984, 142480704, 135179808, 126514704, 115569520, 102871984, 89632744, -76167488, 62046708, 47436840, 33361158, 20686710, 9515500, -448824, -9395241, -17293148, -24054502, --29786136, -34851512, -39529268, -43786656, -47688096, -51757576, -56459492, -61477624, -65965864, -69410432, --71972912, -74226160, -76795088, -79890152, -82914880, -84863184, -85312008, -84779968, -84113176, -83900576, --84370872, -85315232, -86102816, -86176368, -85496152, -84269408, -82502560, -80073760, -76879912, -72683192, --67184024, -60457032, -52966072, -45120780, -37196028, -29571386, -22559852, -16127065, -10208064, -5068062, --988379, 2062121, 4139275, 5170067, 5339181, 5119601, 4758824, 4228396, 3674882, 3360812, -3291556, 3446175, 4119948, 5566815, 7716446, 10654740, 14766098, 20049982, 26006026, 32377074, -39221640, 46223512, 52858164, 59122908, 65221764, 70902928, 75974216, 80866720, 85869816, 90633472, -95081984, 99736656, 104685536, 109496968, 114285320, 119390968, 124223336, 128051768, 131315400, 134485088, -136825312, 137965616, 138964208, 140230688, 140711712, 140338064, 140336448, 140453488, 139494096, 138376864, -138341968, 137693424, 135427296, 134630576, 136169248, 135092288, 130763504, 130876784, 135851968, 133693744, -123466888, 123273080, 134919952, 127440272, 88057568, 62094488, 96197600, 162636992, 193965024, 178560576, -161589552, 159551056, 143084144, 110318920, 107009112, 151814208, 200674288, 212477408, 201375984, 198243872, -203621712, 203391392, 192545536, 163330096, 109403016, 60814588, 71439800, 145763680, 217600224, 230700416, -205281184, 193948912, 206018304, 213945200, 208341344, 202911440, 198481184, 183370944, 164960560, }, -{ --11927661, --8254391, -9876814, -18951544, -25066502, -20257214, -11820287, -10667088, -10446971, 9302362, 55198920, -104534136, 125722816, 109843248, 74312064, 38511360, 5645198, -30492658, -71030704, -110766136, -145943520, --176026016, -199234400, -212091920, -213726160, -206675968, -192827392, -171563536, -142487152, -107303312, -68175624, --26241176, 17527762, 61694520, 105109664, 146663472, 183782720, 212766768, 231493904, 240935856, 243704496, -242107840, 237774224, 231883680, 225010112, 217201872, 208442816, 198703984, 187731952, 175365664, 161985232, -148284288, 134872704, 122400664, 111573584, 102565432, 94773824, 87489560, 80411448, 73331736, 65885872, -57874148, 49357228, 40272836, 30412664, 19817516, 8664023, -3191161, -16006269, -29560650, -43398496, --57560076, -72373424, -87538952, -102159016, -115723064, -128294432, -139524704, -148304144, -153923568, -156971920, --158372624, -157951712, -154864704, -149269984, -142480704, -135179808, -126514704, -115569520, -102871984, -89632744, --76167488, -62046708, -47436840, -33361158, -20686710, -9515500, 448824, 9395241, 17293148, 24054502, -29786136, 34851512, 39529268, 43786656, 47688096, 51757576, 56459492, 61477624, 65965864, 69410432, -71972912, 74226160, 76795088, 79890152, 82914880, 84863184, 85312008, 84779968, 84113176, 83900576, -84370872, 85315232, 86102816, 86176368, 85496152, 84269408, 82502560, 80073760, 76879912, 72683192, -67184024, 60457032, 52966072, 45120780, 37196028, 29571386, 22559852, 16127065, 10208064, 5068062, -988379, -2062121, -4139275, -5170067, -5339181, -5119601, -4758824, -4228396, -3674882, -3360812, --3291556, -3446175, -4119948, -5566815, -7716446, -10654740, -14766098, -20049982, -26006026, -32377074, --39221640, -46223512, -52858164, -59122908, -65221764, -70902928, -75974216, -80866720, -85869816, -90633472, --95081984, -99736656, -104685536, -109496968, -114285320, -119390968, -124223336, -128051768, -131315400, -134485088, --136825312, -137965616, -138964208, -140230688, -140711712, -140338064, -140336448, -140453488, -139494096, -138376864, --138341968, -137693424, -135427296, -134630576, -136169248, -135092288, -130763504, -130876784, -135851968, -133693744, --123466888, -123273080, -134919952, -127440272, -88057568, -62094488, -96197600, -162636992, -193965024, -178560576, --161589552, -159551056, -143084144, -110318920, -107009112, -151814208, -200674288, -212477408, -201375984, -198243872, --203621712, -203391392, -192545536, -163330096, -109403016, -60814588, -71439800, -145763680, -217600224, -230700416, --205281184, -193948912, -206018304, -213945200, -208341344, -202911440, -198481184, -183370944, -164960560, }, -}, -{ -{ -1845225, --6548752, -645856, 11326366, -1323924, -23360328, 516470, 70470752, 103799160, 39323108, -75782016, --143958176, -129812168, -75616656, -29047400, 1406065, 27227946, 53433688, 77974592, 97599912, 107780056, -105458088, 93229784, 76283984, 57622892, 39669928, 26154204, 18576808, 14652818, 12916040, 14906758, -20847772, 27242440, 30925376, 32439352, 33878164, 35633196, 36080408, 32869384, 24407762, 11307575, --3862249, -18832358, -32844152, -45603424, -56769268, -66952636, -77589656, -89338544, -101743480, -114375512, --127040840, -139149968, -149981872, -159129616, -165848544, -168823888, -167367360, -161885904, -152643136, -139270752, --121952912, -101701608, -79026864, -53646824, -25821880, 3289408, 32758252, 62168040, 90734408, 117222008, -140673600, 160389648, 175473568, 185248384, 189831120, 189608304, 184527360, 174534592, 160388032, 143417008, -124507344, 103677824, 80807128, 56646860, 32723892, 9984725, -11984032, -33844880, -55168320, -74984224, --93070328, -109669304, -124435936, -136741024, -146563616, -154035248, -158579312, -159456560, -156764688, -151126480, --142818944, -131737384, -117827056, -101433168, -83825416, -67174360, -53031572, -40934260, -29385630, -17978734, --7737921, 177167, 5261335, 7716983, 8515846, 8907225, 9329206, 9336722, 8757975, 8089571, -7758859, 7969312, 9200357, 11858942, 15609522, 19887310, 24648280, 29855928, 34891240, 39198020, -42775728, 45536316, 47085728, 47491064, 47281684, 46593416, 45326400, 43938052, 42950208, 42043972, -40720584, 39240968, 37930468, 36420248, 34454764, 32409286, 30368104, 27900108, 25135222, 22725746, -20629802, 18361522, 16196859, 14656576, 13375602, 11931956, 10887742, 10683731, 10726144, 10692858, -11195906, 12278238, 13072270, 13478681, 14211510, 15105937, 15531139, 16049756, 17460652, 19108310, -20259898, 21661668, 23775866, 25526064, 26405996, 27226872, 27671400, 26280368, 23406498, 20561620, -17145510, 11816529, 5853504, 878858, -4474282, -11355357, -17719424, -22552874, -28112708, -34612604, --39279088, -42917996, -48835388, -54687820, -56460568, -58741732, -66727148, -72850160, -70095480, -70104600, --82972328, -91474752, -80050136, -74722232, -105705584, -140526496, -115971096, -38424388, 14111652, 2777770, --27246736, -34520264, -43823700, -82118168, -112770272, -86500640, -19781008, 26624502, 25559350, 1846299, --14041859, -22708028, -49884436, -112187768, -181869312, -195415648, -123007328, -21627844, 17504676, -25101936, --81594176, -91303488, -68420440, -59377384, -72649368, -81596328, -73004784, -59483148, -52861920, }, -{ --1845225, -6548752, 645856, -11326366, 1323924, 23360328, -516470, -70470752, -103799160, -39323108, 75782016, -143958176, 129812168, 75616656, 29047400, -1406065, -27227946, -53433688, -77974592, -97599912, -107780056, --105458088, -93229784, -76283984, -57622892, -39669928, -26154204, -18576808, -14652818, -12916040, -14906758, --20847772, -27242440, -30925376, -32439352, -33878164, -35633196, -36080408, -32869384, -24407762, -11307575, -3862249, 18832358, 32844152, 45603424, 56769268, 66952636, 77589656, 89338544, 101743480, 114375512, -127040840, 139149968, 149981872, 159129616, 165848544, 168823888, 167367360, 161885904, 152643136, 139270752, -121952912, 101701608, 79026864, 53646824, 25821880, -3289408, -32758252, -62168040, -90734408, -117222008, --140673600, -160389648, -175473568, -185248384, -189831120, -189608304, -184527360, -174534592, -160388032, -143417008, --124507344, -103677824, -80807128, -56646860, -32723892, -9984725, 11984032, 33844880, 55168320, 74984224, -93070328, 109669304, 124435936, 136741024, 146563616, 154035248, 158579312, 159456560, 156764688, 151126480, -142818944, 131737384, 117827056, 101433168, 83825416, 67174360, 53031572, 40934260, 29385630, 17978734, -7737921, -177167, -5261335, -7716983, -8515846, -8907225, -9329206, -9336722, -8757975, -8089571, --7758859, -7969312, -9200357, -11858942, -15609522, -19887310, -24648280, -29855928, -34891240, -39198020, --42775728, -45536316, -47085728, -47491064, -47281684, -46593416, -45326400, -43938052, -42950208, -42043972, --40720584, -39240968, -37930468, -36420248, -34454764, -32409286, -30368104, -27900108, -25135222, -22725746, --20629802, -18361522, -16196859, -14656576, -13375602, -11931956, -10887742, -10683731, -10726144, -10692858, --11195906, -12278238, -13072270, -13478681, -14211510, -15105937, -15531139, -16049756, -17460652, -19108310, --20259898, -21661668, -23775866, -25526064, -26405996, -27226872, -27671400, -26280368, -23406498, -20561620, --17145510, -11816529, -5853504, -878858, 4474282, 11355357, 17719424, 22552874, 28112708, 34612604, -39279088, 42917996, 48835388, 54687820, 56460568, 58741732, 66727148, 72850160, 70095480, 70104600, -82972328, 91474752, 80050136, 74722232, 105705584, 140526496, 115971096, 38424388, -14111652, -2777770, -27246736, 34520264, 43823700, 82118168, 112770272, 86500640, 19781008, -26624502, -25559350, -1846299, -14041859, 22708028, 49884436, 112187768, 181869312, 195415648, 123007328, 21627844, -17504676, 25101936, -81594176, 91303488, 68420440, 59377384, 72649368, 81596328, 73004784, 59483148, 52861920, }, -}, -{ -{ --7046431, --6595996, -15714212, -32926294, -43859132, -45169096, -49223008, -55187644, -35014184, 33172180, 127528320, -196871632, 209954112, 176739520, 124306552, 69076496, 16124918, -29955786, -64915208, -90075664, -109764872, --125263256, -135164768, -139116144, -137467952, -129359584, -114974128, -98802504, -87378960, -83409872, -83839376, --83728776, -80569832, -74706664, -67144296, -58140436, -47568912, -35586488, -22458920, -8252243, 6661495, -20977158, 33047088, 42269996, 49456012, 55735252, 61524868, 66627828, 70803608, 73946448, 75984952, -76842872, 76411760, 74481712, 70841728, 65519728, 58886148, 51526184, 44047036, 36909340, 30363808, -24545738, 19638202, 15870441, 13397614, 12285217, 12667469, 14854681, 19190988, 25785910, 34442416, -44936632, 57326540, 71794136, 88185344, 105971872, 124750008, 144440288, 164774816, 184924112, 203962624, -221463552, 237294800, 251020976, 261918912, 269517792, 273794496, 274895616, 272934432, 267964080, 259810080, -247952752, 231975472, 212308816, 190321808, 167449504, 144289968, 120732608, 96992176, 74397960, 54987392, -40226664, 30084098, 23371064, 18984292, 16791174, 17363480, 20999168, 27120570, 34506304, 41897404, -48382808, 53475028, 57052736, 59212568, 60022168, 59326920, 56791280, 52143588, 45437532, 37138044, -27927488, 18377092, 8764418, -850940, -10451266, -19975892, -29326036, -38453380, -47488916, -56699472, --66202088, -75788456, -85160072, -94262720, -103266584, -112363864, -121757488, -131678864, -142156976, -152831040, --163162048, -172762368, -181412432, -188911456, -195065600, -199749808, -202918944, -204654112, -205204944, -204860272, --203810160, -202237664, -200407472, -198504800, -196525360, -194462704, -192439760, -190548368, -188756304, -187067296, --185547424, -184138128, -182657440, -181013552, -179228992, -177363360, -175599200, -174196896, -173178448, -172281872, --171363296, -170486048, -169535248, -168204336, -166423008, -164318464, -161801088, -158703872, -155160528, -151312240, --146953376, -142001824, -136815648, -131554848, -125957432, -120161912, -114798032, -109952240, -105170864, -100570416, --96573952, -92794376, -88781808, -85132160, -82048904, -78303160, -73764456, -70451424, -68511704, -65061776, --60248192, -58631136, -60058676, -57418880, -50366008, -50744500, -63768992, -75478144, -73326904, -66725540, --68320584, -68286760, -52987548, -38466800, -53093848, -90649576, -114169360, -107969576, -93619016, -90817080, --94996624, -98737000, -101857296, -94393184, -66017404, -40611064, -60850560, -124140664, -174951728, -179190336, --163824016, -161033888, -161131072, -152438592, -156139248, -173953152, -149530896, -48320528, 56821880, }, -{ --7046431, --6595996, -15714212, -32926294, -43859132, -45169096, -49223008, -55187644, -35014184, 33172180, 127528320, -196871632, 209954112, 176739520, 124306552, 69076496, 16124918, -29955786, -64915208, -90075664, -109764872, --125263256, -135164768, -139116144, -137467952, -129359584, -114974128, -98802504, -87378960, -83409872, -83839376, --83728776, -80569832, -74706664, -67144296, -58140436, -47568912, -35586488, -22458920, -8252243, 6661495, -20977158, 33047088, 42269996, 49456012, 55735252, 61524868, 66627828, 70803608, 73946448, 75984952, -76842872, 76411760, 74481712, 70841728, 65519728, 58886148, 51526184, 44047036, 36909340, 30363808, -24545738, 19638202, 15870441, 13397614, 12285217, 12667469, 14854681, 19190988, 25785910, 34442416, -44936632, 57326540, 71794136, 88185344, 105971872, 124750008, 144440288, 164774816, 184924112, 203962624, -221463552, 237294800, 251020976, 261918912, 269517792, 273794496, 274895616, 272934432, 267964080, 259810080, -247952752, 231975472, 212308816, 190321808, 167449504, 144289968, 120732608, 96992176, 74397960, 54987392, -40226664, 30084098, 23371064, 18984292, 16791174, 17363480, 20999168, 27120570, 34506304, 41897404, -48382808, 53475028, 57052736, 59212568, 60022168, 59326920, 56791280, 52143588, 45437532, 37138044, -27927488, 18377092, 8764418, -850940, -10451266, -19975892, -29326036, -38453380, -47488916, -56699472, --66202088, -75788456, -85160072, -94262720, -103266584, -112363864, -121757488, -131678864, -142156976, -152831040, --163162048, -172762368, -181412432, -188911456, -195065600, -199749808, -202918944, -204654112, -205204944, -204860272, --203810160, -202237664, -200407472, -198504800, -196525360, -194462704, -192439760, -190548368, -188756304, -187067296, --185547424, -184138128, -182657440, -181013552, -179228992, -177363360, -175599200, -174196896, -173178448, -172281872, --171363296, -170486048, -169535248, -168204336, -166423008, -164318464, -161801088, -158703872, -155160528, -151312240, --146953376, -142001824, -136815648, -131554848, -125957432, -120161912, -114798032, -109952240, -105170864, -100570416, --96573952, -92794376, -88781808, -85132160, -82048904, -78303160, -73764456, -70451424, -68511704, -65061776, --60248192, -58631136, -60058676, -57418880, -50366008, -50744500, -63768992, -75478144, -73326904, -66725540, --68320584, -68286760, -52987548, -38466800, -53093848, -90649576, -114169360, -107969576, -93619016, -90817080, --94996624, -98737000, -101857296, -94393184, -66017404, -40611064, -60850560, -124140664, -174951728, -179190336, --163824016, -161033888, -161131072, -152438592, -156139248, -173953152, -149530896, -48320528, 56821880, }, -}, -{ -{ -27171036, --11462731, -54041428, -56250112, -792421, 79816064, 120961312, 82116552, -9214852, -80828600, -88135416, --51418276, -17627082, -5667210, -3959960, -2867965, -3746822, -2963528, 8109972, 25592100, 34102040, -28623272, 21260624, 23161148, 31855772, 40087076, 46668040, 53553948, 59299004, 60382944, 55612312, -46720656, 36820756, 28845538, 23300734, 17404818, 7913477, -5710159, -21782464, -38393248, -53689776, --65853124, -74299176, -79911624, -83453360, -84879288, -84442280, -83029232, -81143208, -78727824, -76015016, --73440720, -70876624, -67899136, -64530272, -60923036, -56743496, -51612620, -45780056, -39832064, -34133180, --28903520, -24467892, -21179558, -19245748, -18563386, -18611168, -18833432, -19230180, -20046760, -20867636, --20792474, -19539416, -17479444, -14470819, -9571335, -2090575, 7872138, 20029044, 34344704, 50779400, -69050192, 88562224, 108419472, 127905736, 146983440, 165609104, 182670320, 196808816, 208435296, 219484640, -230620416, 239943184, 245161024, 246006064, 243747440, 239059488, 231200240, 219135680, 202981232, 184127392, -163848176, 142009328, 117646672, 90771984, 62952408, 35974648, 10460393, -14150307, -38755636, -63661080, --87979720, -110035992, -128729832, -144301776, -157552816, -168799200, -177886800, -184668032, -189119216, -191449248, --192279248, -192278704, -191592048, -190071088, -187894624, -185443264, -182765888, -179586000, -175521888, -170055472, --162886640, -154620432, -146471264, -139066208, -132131448, -125266480, -118172800, -110337176, -101534104, -92527552, --84378392, -77287400, -70873936, -65020972, -59594280, -54016728, -48020420, -42218992, -37269040, -33144262, --29650306, -26781806, -24214488, -21324512, -17926120, -14277008, -10492605, -6687801, -3264175, -325344, -2621004, 5818607, 8962523, 12122008, 15790984, 19717122, 23000086, 25480968, 27674084, 29479044, -30463666, 31004296, 31666258, 32123672, 32067300, 32099512, 32511292, 32637456, 32460826, 32998234, -34337188, 35512400, 36698348, 38945688, 41819560, 44173200, 46582140, 49968188, 53239340, 55529096, -58347668, 62236224, 64938832, 66233228, 69305736, 73911016, 75461504, 74622912, 77919296, 84312352, -84362288, 79118128, 83010440, 97546760, 101596912, 84407920, 69243464, 81434728, 108487656, 119098904, -110885320, 108326592, 117222544, 114166136, 88067232, 63752348, 68513856, 93551368, 107158896, 97117264, -81243064, 75681080, 69503312, 42180336, -511638, -24007794, -4394289, 39977020, 67706400, 61245696, -42284488, 39489540, 53516904, 62232464, 54181012, 45533096, 60391536, 99313600, 133702328, }, -{ -27171036, --11462731, -54041428, -56250112, -792421, 79816064, 120961312, 82116552, -9214852, -80828600, -88135416, --51418276, -17627082, -5667210, -3959960, -2867965, -3746822, -2963528, 8109972, 25592100, 34102040, -28623272, 21260624, 23161148, 31855772, 40087076, 46668040, 53553948, 59299004, 60382944, 55612312, -46720656, 36820756, 28845538, 23300734, 17404818, 7913477, -5710159, -21782464, -38393248, -53689776, --65853124, -74299176, -79911624, -83453360, -84879288, -84442280, -83029232, -81143208, -78727824, -76015016, --73440720, -70876624, -67899136, -64530272, -60923036, -56743496, -51612620, -45780056, -39832064, -34133180, --28903520, -24467892, -21179558, -19245748, -18563386, -18611168, -18833432, -19230180, -20046760, -20867636, --20792474, -19539416, -17479444, -14470819, -9571335, -2090575, 7872138, 20029044, 34344704, 50779400, -69050192, 88562224, 108419472, 127905736, 146983440, 165609104, 182670320, 196808816, 208435296, 219484640, -230620416, 239943184, 245161024, 246006064, 243747440, 239059488, 231200240, 219135680, 202981232, 184127392, -163848176, 142009328, 117646672, 90771984, 62952408, 35974648, 10460393, -14150307, -38755636, -63661080, --87979720, -110035992, -128729832, -144301776, -157552816, -168799200, -177886800, -184668032, -189119216, -191449248, --192279248, -192278704, -191592048, -190071088, -187894624, -185443264, -182765888, -179586000, -175521888, -170055472, --162886640, -154620432, -146471264, -139066208, -132131448, -125266480, -118172800, -110337176, -101534104, -92527552, --84378392, -77287400, -70873936, -65020972, -59594280, -54016728, -48020420, -42218992, -37269040, -33144262, --29650306, -26781806, -24214488, -21324512, -17926120, -14277008, -10492605, -6687801, -3264175, -325344, -2621004, 5818607, 8962523, 12122008, 15790984, 19717122, 23000086, 25480968, 27674084, 29479044, -30463666, 31004296, 31666258, 32123672, 32067300, 32099512, 32511292, 32637456, 32460826, 32998234, -34337188, 35512400, 36698348, 38945688, 41819560, 44173200, 46582140, 49968188, 53239340, 55529096, -58347668, 62236224, 64938832, 66233228, 69305736, 73911016, 75461504, 74622912, 77919296, 84312352, -84362288, 79118128, 83010440, 97546760, 101596912, 84407920, 69243464, 81434728, 108487656, 119098904, -110885320, 108326592, 117222544, 114166136, 88067232, 63752348, 68513856, 93551368, 107158896, 97117264, -81243064, 75681080, 69503312, 42180336, -511638, -24007794, -4394289, 39977020, 67706400, 61245696, -42284488, 39489540, 53516904, 62232464, 54181012, 45533096, 60391536, 99313600, 133702328, }, -}, -{ -{ --3897146, -35413080, 51705500, 3330210, -85761368, -165858208, -204616544, -181687312, -84494888, 65331820, 209428512, -301374624, 341843968, 351401344, 330865504, 269984864, 179177984, 87553984, 12978317, -49327164, -110070352, --170494096, -224259568, -265882096, -294854336, -315021344, -330888032, -343430944, -350049504, -348534464, -339208992, --323108768, -300449056, -271576672, -237778512, -200570144, -161187968, -120923728, -81239840, -43578884, -9268003, -20954072, 47559784, 71691592, 93727464, 112951736, 128653064, 140887280, 150231520, 157535648, 163890048, -170114528, 176132320, 181208960, 184758752, 186622240, 186763424, 185128128, 181812416, 177136256, 171495360, -165172624, 158268464, 150820992, 142963888, 134866800, 126565168, 118074560, 109640848, 101615168, 94079112, -86895240, 80117784, 74002824, 68568616, 63534376, 58829240, 54836532, 51887500, 49731964, 47737488, -45477800, 42900280, 40004400, 36643052, 32768452, 28736552, 25207700, 22724672, 21399138, 20984674, -21247204, 22197464, 23807540, 25405268, 25567404, 22917408, 17092360, 8771934, -1275605, -12981539, --26720066, -42343008, -58632748, -73864848, -86944632, -97880696, -107090176, -114465712, -119330832, -121168008, --120162984, -117121072, -112989856, -108338400, -103112504, -96983048, -89999968, -82793544, -76139568, -70478264, --65733400, -61304216, -56340844, -50405200, -43847856, -37334540, -31153546, -25199110, -19321448, -13348221, --7006703, -175557, 6962142, 14204531, 21529598, 28902446, 36197984, 43416752, 50667728, 57896696, -64880312, 71430136, 77346992, 82315192, 86084568, 88622352, 89958624, 90127208, 89313312, 87725784, -85310400, 81918448, 77646032, 72637024, 66811976, 60207388, 53271016, 46413028, 39657044, 33063732, -26965416, 21463026, 16284905, 11389180, 7116224, 3644817, 912144, -1013075, -2124935, -2820720, --3437048, -3884261, -4232154, -4928475, -5937793, -6543920, -6436546, -6000606, -5334350, -4181151, --2854006, -1941862, -1307818, -608275, -191663, -234076, -26307, 710817, 1257889, 1552631, -2401424, 3464965, 3694746, 3820374, 5041755, 5924908, 4955856, 4556961, 6925635, 8632884, -6834367, 6883759, 13447543, 18618146, 13105019, 6052683, 15908022, 41180148, 59230820, 58138288, -51392504, 54032300, 61192548, 60428580, 52166672, 46730316, 49414136, 57579944, 66939748, 74114496, -77275592, 78338592, 79395152, 73194832, 44445396, -9811316, -63851132, -81508280, -57873612, -29639570, --28724742, -38796440, -25851408, -2009508, -9972914, -33472828, 14603426, 167614864, 316267424, }, -{ --3897146, -35413080, 51705500, 3330210, -85761368, -165858208, -204616544, -181687312, -84494888, 65331820, 209428512, -301374624, 341843968, 351401344, 330865504, 269984864, 179177984, 87553984, 12978317, -49327164, -110070352, --170494096, -224259568, -265882096, -294854336, -315021344, -330888032, -343430944, -350049504, -348534464, -339208992, --323108768, -300449056, -271576672, -237778512, -200570144, -161187968, -120923728, -81239840, -43578884, -9268003, -20954072, 47559784, 71691592, 93727464, 112951736, 128653064, 140887280, 150231520, 157535648, 163890048, -170114528, 176132320, 181208960, 184758752, 186622240, 186763424, 185128128, 181812416, 177136256, 171495360, -165172624, 158268464, 150820992, 142963888, 134866800, 126565168, 118074560, 109640848, 101615168, 94079112, -86895240, 80117784, 74002824, 68568616, 63534376, 58829240, 54836532, 51887500, 49731964, 47737488, -45477800, 42900280, 40004400, 36643052, 32768452, 28736552, 25207700, 22724672, 21399138, 20984674, -21247204, 22197464, 23807540, 25405268, 25567404, 22917408, 17092360, 8771934, -1275605, -12981539, --26720066, -42343008, -58632748, -73864848, -86944632, -97880696, -107090176, -114465712, -119330832, -121168008, --120162984, -117121072, -112989856, -108338400, -103112504, -96983048, -89999968, -82793544, -76139568, -70478264, --65733400, -61304216, -56340844, -50405200, -43847856, -37334540, -31153546, -25199110, -19321448, -13348221, --7006703, -175557, 6962142, 14204531, 21529598, 28902446, 36197984, 43416752, 50667728, 57896696, -64880312, 71430136, 77346992, 82315192, 86084568, 88622352, 89958624, 90127208, 89313312, 87725784, -85310400, 81918448, 77646032, 72637024, 66811976, 60207388, 53271016, 46413028, 39657044, 33063732, -26965416, 21463026, 16284905, 11389180, 7116224, 3644817, 912144, -1013075, -2124935, -2820720, --3437048, -3884261, -4232154, -4928475, -5937793, -6543920, -6436546, -6000606, -5334350, -4181151, --2854006, -1941862, -1307818, -608275, -191663, -234076, -26307, 710817, 1257889, 1552631, -2401424, 3464965, 3694746, 3820374, 5041755, 5924908, 4955856, 4556961, 6925635, 8632884, -6834367, 6883759, 13447543, 18618146, 13105019, 6052683, 15908022, 41180148, 59230820, 58138288, -51392504, 54032300, 61192548, 60428580, 52166672, 46730316, 49414136, 57579944, 66939748, 74114496, -77275592, 78338592, 79395152, 73194832, 44445396, -9811316, -63851132, -81508280, -57873612, -29639570, --28724742, -38796440, -25851408, -2009508, -9972914, -33472828, 14603426, 167614864, 316267424, }, -}, -}; -const Word32 CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[9][BINAURAL_CHANNELS][240] ={ -{ -{ --150097296, --385323520, -471163808, -416024480, -287259232, -144949248, -11310260, 112675248, 221849024, 302379104, 342134944, -337892064, 294679840, 222711776, 134653136, 42464340, -45433776, -124755376, -193698192, -250782608, -294007168, --322044704, -336072608, -339488160, -335108384, -323229568, -303114624, -275699328, -243782336, -209982560, -175646976, --141630848, -108959560, -78353088, -49810884, -23074712, 1864016, 24938728, 46413028, 66868884, 86862496, -106658536, 126201168, 145286400, 163754752, 181534304, 198576736, 214841776, 230328352, 245016080, 258781440, -271458592, 282983040, 293392448, 302702304, 310913216, 318146496, 324659808, 330664704, 336208960, 341291520, -345992896, 350396320, 354457760, 358098272, 361374784, 364421536, 367263712, 369863264, 372304960, 374736448, -377157184, 379463584, 381680864, 383916928, 386114880, 388108800, 389912704, 391663424, 393264384, 394394496, -394925472, 395063424, 394964128, 394468576, 393364256, 391740224, 389905184, 388003040, 385829792, 383090144, -379791616, 376292832, 372916448, 369625408, 366224352, 362793216, 359735200, 357379936, 355692000, 354391168, -353266432, 352345152, 351798080, 351672992, 351722912, 351575296, 351043776, 350189088, 349097632, 347734496, -346006848, 343839520, 341191136, 338098752, 334711648, 331189760, 327615808, 324025216, 320457184, 316913280, -313361888, 309804576, 306253728, 302653472, 298930272, 295106144, 291248160, 287375712, 283517760, 279792416, -276299552, 273013344, 269879648, 266900000, 264052448, 261259104, 258503888, 255857648, 253352608, 250943120, -248592176, 246255168, 243827440, 241232736, 238500064, 235651440, 232635296, 229448432, 226177280, 222837392, -219350416, 215724928, 212060256, 208359600, 204564992, 200738176, 197007472, 193393248, 189896080, 186621168, -183625424, 180810608, 178123024, 175628192, 173262736, 170817824, 168259104, 165744928, 163291968, 160786400, -158296928, 155976032, 153755536, 151511952, 149363392, 147435488, 145601008, 143802480, 142238576, 140936672, -139611136, 138185744, 136866112, 135566352, 133954128, 132106216, 130324880, 128428112, 126101848, 123649960, -121411208, 118972208, 116022632, 113173464, 110741440, 107897096, 104326904, 101171176, 98777272, 95583424, -91120952, 87607672, 86073296, 83676704, 78086264, 71847288, 68708736, 67931352, 65994320, 61677340, -55762636, 48586816, 42441256, 43353936, 54189064, 67248984, 70312376, 60884920, 49271864, 46098956, -51298016, 57953068, 63517196, 72708968, 88788248, 105026448, 108476912, 93433792, 68637872, 48292076, -37647000, 31427350, 24909736, 19747722, 17267916, 13302587, 4965519, -2489471, -2396055, }, -{ --150097296, --385323520, -471163808, -416024480, -287259232, -144949248, -11310260, 112675248, 221849024, 302379104, 342134944, -337892064, 294679840, 222711776, 134653136, 42464340, -45433776, -124755376, -193698192, -250782608, -294007168, --322044704, -336072608, -339488160, -335108384, -323229568, -303114624, -275699328, -243782336, -209982560, -175646976, --141630848, -108959560, -78353088, -49810884, -23074712, 1864016, 24938728, 46413028, 66868884, 86862496, -106658536, 126201168, 145286400, 163754752, 181534304, 198576736, 214841776, 230328352, 245016080, 258781440, -271458592, 282983040, 293392448, 302702304, 310913216, 318146496, 324659808, 330664704, 336208960, 341291520, -345992896, 350396320, 354457760, 358098272, 361374784, 364421536, 367263712, 369863264, 372304960, 374736448, -377157184, 379463584, 381680864, 383916928, 386114880, 388108800, 389912704, 391663424, 393264384, 394394496, -394925472, 395063424, 394964128, 394468576, 393364256, 391740224, 389905184, 388003040, 385829792, 383090144, -379791616, 376292832, 372916448, 369625408, 366224352, 362793216, 359735200, 357379936, 355692000, 354391168, -353266432, 352345152, 351798080, 351672992, 351722912, 351575296, 351043776, 350189088, 349097632, 347734496, -346006848, 343839520, 341191136, 338098752, 334711648, 331189760, 327615808, 324025216, 320457184, 316913280, -313361888, 309804576, 306253728, 302653472, 298930272, 295106144, 291248160, 287375712, 283517760, 279792416, -276299552, 273013344, 269879648, 266900000, 264052448, 261259104, 258503888, 255857648, 253352608, 250943120, -248592176, 246255168, 243827440, 241232736, 238500064, 235651440, 232635296, 229448432, 226177280, 222837392, -219350416, 215724928, 212060256, 208359600, 204564992, 200738176, 197007472, 193393248, 189896080, 186621168, -183625424, 180810608, 178123024, 175628192, 173262736, 170817824, 168259104, 165744928, 163291968, 160786400, -158296928, 155976032, 153755536, 151511952, 149363392, 147435488, 145601008, 143802480, 142238576, 140936672, -139611136, 138185744, 136866112, 135566352, 133954128, 132106216, 130324880, 128428112, 126101848, 123649960, -121411208, 118972208, 116022632, 113173464, 110741440, 107897096, 104326904, 101171176, 98777272, 95583424, -91120952, 87607672, 86073296, 83676704, 78086264, 71847288, 68708736, 67931352, 65994320, 61677340, -55762636, 48586816, 42441256, 43353936, 54189064, 67248984, 70312376, 60884920, 49271864, 46098956, -51298016, 57953068, 63517196, 72708968, 88788248, 105026448, 108476912, 93433792, 68637872, 48292076, -37647000, 31427350, 24909736, 19747722, 17267916, 13302587, 4965519, -2489471, -2396055, }, -}, -{ -{ -74128992, -125036160, -31832686, -328685248, -579388928, -630343360, -464086784, -178695872, 109277928, 336225088, 491736160, -583223296, 615155840, 591585024, 521611424, 416995680, 288475232, 146677424, 3992709, -127547640, -240920816, --335788608, -414927648, -479317824, -527319456, -558024704, -573691136, -578245376, -574549056, -563953344, -547510080, --526430368, -501655936, -473858912, -443802176, -412205728, -379325056, -344973920, -308924640, -271170816, -232013056, --192055376, -152036480, -112535656, -73853040, -36146980, 385473, 35446900, 68685656, 99869800, 129092760, -156785632, 183442352, 209277648, 234109536, 257541264, 279244288, 299046240, 316826304, 332494880, 346143776, -358055840, 368435168, 377279040, 384639008, 390804448, 396035712, 400307584, 403578752, 406126208, 408332736, -410309504, 412082240, 414000480, 416552224, 419807808, 423482688, 427579552, 432489792, 438335232, 444650976, -451000032, 457526208, 464563520, 471950880, 479151936, 485910048, 492437856, 499026336, 505774816, 512669312, -519649696, 526549568, 533144480, 539250880, 544640000, 548879616, 551407744, 551783552, 549847616, 545685824, -539488128, 531410400, 521581888, 510285600, 498035808, 485381760, 472712704, 460356608, 448764480, 438447968, -429737792, 422639264, 416840000, 411893792, 407551072, 403941152, 401302432, 399547392, 398207360, 396715392, -394635008, 391768672, 388279008, 384596608, 381029632, 377540512, 373980512, 370345376, 366690880, 362990784, -359219264, 355432160, 351699840, 348096896, 344748448, 341745184, 339038816, 336535392, 334219328, 332112640, -330238976, 328685792, 327552992, 326791712, 326244096, 325789920, 325290080, 324525568, 323402976, 322057056, -320560800, 318759584, 316548224, 313989504, 311008768, 307334976, 302885376, 297839328, 292288640, 286212864, -279763424, 273154016, 266364208, 259311328, 252110816, 244856624, 237492896, 230150656, 223164896, 216559232, -210064704, 203690976, 197608768, 191548560, 185054576, 178202496, 171357376, 164587984, 157976416, 151910848, -146453552, 141165376, 135994768, 131321848, 126925408, 122191816, 117317568, 112863152, 108515568, 103818488, -99252400, 95040112, 90424632, 85497232, 81323592, 77207944, 71499928, 65615288, 61895848, 57695908, -49410916, 41340132, 39055748, 35219804, 18512920, -2759517, -7189776, 5656472, 12028593, 1793686, --8701604, -13099650, -32475858, -75995152, -113358680, -113468744, -89127552, -77423224, -92568896, -120380952, --144085408, -157587712, -168697184, -199903888, -261747648, -314558048, -291328704, -181573504, -61053496, -9470940, --24637006, -48244832, -51813412, -58076012, -88137024, -125196152, -135724720, -103910832, -38646652, }, -{ --74128992, --125036160, 31832686, 328685248, 579388928, 630343360, 464086784, 178695872, -109277928, -336225088, -491736160, --583223296, -615155840, -591585024, -521611424, -416995680, -288475232, -146677424, -3992709, 127547640, 240920816, -335788608, 414927648, 479317824, 527319456, 558024704, 573691136, 578245376, 574549056, 563953344, 547510080, -526430368, 501655936, 473858912, 443802176, 412205728, 379325056, 344973920, 308924640, 271170816, 232013056, -192055376, 152036480, 112535656, 73853040, 36146980, -385473, -35446900, -68685656, -99869800, -129092760, --156785632, -183442352, -209277648, -234109536, -257541264, -279244288, -299046240, -316826304, -332494880, -346143776, --358055840, -368435168, -377279040, -384639008, -390804448, -396035712, -400307584, -403578752, -406126208, -408332736, --410309504, -412082240, -414000480, -416552224, -419807808, -423482688, -427579552, -432489792, -438335232, -444650976, --451000032, -457526208, -464563520, -471950880, -479151936, -485910048, -492437856, -499026336, -505774816, -512669312, --519649696, -526549568, -533144480, -539250880, -544640000, -548879616, -551407744, -551783552, -549847616, -545685824, --539488128, -531410400, -521581888, -510285600, -498035808, -485381760, -472712704, -460356608, -448764480, -438447968, --429737792, -422639264, -416840000, -411893792, -407551072, -403941152, -401302432, -399547392, -398207360, -396715392, --394635008, -391768672, -388279008, -384596608, -381029632, -377540512, -373980512, -370345376, -366690880, -362990784, --359219264, -355432160, -351699840, -348096896, -344748448, -341745184, -339038816, -336535392, -334219328, -332112640, --330238976, -328685792, -327552992, -326791712, -326244096, -325789920, -325290080, -324525568, -323402976, -322057056, --320560800, -318759584, -316548224, -313989504, -311008768, -307334976, -302885376, -297839328, -292288640, -286212864, --279763424, -273154016, -266364208, -259311328, -252110816, -244856624, -237492896, -230150656, -223164896, -216559232, --210064704, -203690976, -197608768, -191548560, -185054576, -178202496, -171357376, -164587984, -157976416, -151910848, --146453552, -141165376, -135994768, -131321848, -126925408, -122191816, -117317568, -112863152, -108515568, -103818488, --99252400, -95040112, -90424632, -85497232, -81323592, -77207944, -71499928, -65615288, -61895848, -57695908, --49410916, -41340132, -39055748, -35219804, -18512920, 2759517, 7189776, -5656472, -12028593, -1793686, -8701604, 13099650, 32475858, 75995152, 113358680, 113468744, 89127552, 77423224, 92568896, 120380952, -144085408, 157587712, 168697184, 199903888, 261747648, 314558048, 291328704, 181573504, 61053496, 9470940, -24637006, 48244832, 51813412, 58076012, 88137024, 125196152, 135724720, 103910832, 38646652, }, -}, -{ -{ --20155744, --57068304, -71151504, -39433704, 21933862, 59390808, 41422812, -7452842, -42186244, -43565464, -19565724, -15054934, 44517872, 54613192, 45892800, 35036196, 33049236, 31137440, 15760382, -12230993, -41761576, --66220880, -84941032, -95825552, -95630672, -86114632, -73918000, -64082524, -56340308, -47381544, -35001300, --20164334, -5961952, 4998805, 11794517, 14131516, 11659226, 5186710, -2616172, -8871792, -12341052, --13105556, -11278047, -6787659, 111669, 8864812, 19053548, 30604864, 43779140, 59068684, 76820320, -96801048, 118265680, 140499120, 163101920, 185704720, 207685824, 228411200, 247590912, 265105248, 280574112, -293419296, 303271936, 309921088, 312887840, 311509152, 305471488, 294861312, 279709760, 259958800, 235875840, -208078816, 177226992, 144154128, 110148728, 76523432, 43973484, 12924630, -15611669, -40300216, -60733520, --77667504, -91633664, -101980240, -107982456, -110469240, -111319112, -111284752, -109334296, -104599632, -98070208, --91601448, -85908472, -80414136, -74633112, -68831680, -63568200, -59341416, -56565256, -55340652, -55296632, --55941412, -57078504, -58849640, -61640296, -65789772, -70942656, -75847512, -79322680, -81250040, -82208360, --82482696, -81897512, -80183816, -76993728, -71936944, -65003256, -56622164, -47178068, -36929740, -26374320, --16068010, -6155225, 3346853, 12017318, 19338090, 25205016, 29654064, 32559074, 33995204, 34316788, -33622616, 31844498, 29461866, 27319214, 25758530, 24705188, 24274618, 24349244, 24042154, 22586160, -20238960, 17517024, 14314589, 10501732, 6432788, 2237678, -2389076, -7303055, -11904039, -16127065, --20292646, -24174760, -27430346, -30488900, -33845952, -37204080, -40331892, -43709884, -47450800, -50910932, --54007068, -57383448, -60954712, -63988572, -66580048, -69206952, -71360880, -72519448, -73506752, -75081400, --76629736, -77875272, -79886928, -83066280, -86566136, -90516432, -95884608, -101905616, -107004816, -111725520, --117132888, -121851984, -124525600, -126669320, -129272072, -130303400, -129090072, -128088808, -127532072, -124883688, --121162104, -119428544, -117273544, -111342736, -106378288, -106409424, -103459320, -92259656, -85136456, -89434640, --86687472, -65751116, -54604068, -73708616, -80806592, -25334402, 56436408, 75987632, 20873004, -31660352, --37648072, -36377836, -53824532, -44966160, 20563230, 87744032, 89147416, 38726648, -581431, -6444599, --6936372, -25312926, -52908628, -63184336, -33217278, 30641370, 79638360, 63588600, -4334696, -54877872, --46950972, -11652246, 3220152, -2754685, 17180, 17445620, 28529320, 22219476, 7569880, }, -{ --20155744, --57068304, -71151504, -39433704, 21933862, 59390808, 41422812, -7452842, -42186244, -43565464, -19565724, -15054934, 44517872, 54613192, 45892800, 35036196, 33049236, 31137440, 15760382, -12230993, -41761576, --66220880, -84941032, -95825552, -95630672, -86114632, -73918000, -64082524, -56340308, -47381544, -35001300, --20164334, -5961952, 4998805, 11794517, 14131516, 11659226, 5186710, -2616172, -8871792, -12341052, --13105556, -11278047, -6787659, 111669, 8864812, 19053548, 30604864, 43779140, 59068684, 76820320, -96801048, 118265680, 140499120, 163101920, 185704720, 207685824, 228411200, 247590912, 265105248, 280574112, -293419296, 303271936, 309921088, 312887840, 311509152, 305471488, 294861312, 279709760, 259958800, 235875840, -208078816, 177226992, 144154128, 110148728, 76523432, 43973484, 12924630, -15611669, -40300216, -60733520, --77667504, -91633664, -101980240, -107982456, -110469240, -111319112, -111284752, -109334296, -104599632, -98070208, --91601448, -85908472, -80414136, -74633112, -68831680, -63568200, -59341416, -56565256, -55340652, -55296632, --55941412, -57078504, -58849640, -61640296, -65789772, -70942656, -75847512, -79322680, -81250040, -82208360, --82482696, -81897512, -80183816, -76993728, -71936944, -65003256, -56622164, -47178068, -36929740, -26374320, --16068010, -6155225, 3346853, 12017318, 19338090, 25205016, 29654064, 32559074, 33995204, 34316788, -33622616, 31844498, 29461866, 27319214, 25758530, 24705188, 24274618, 24349244, 24042154, 22586160, -20238960, 17517024, 14314589, 10501732, 6432788, 2237678, -2389076, -7303055, -11904039, -16127065, --20292646, -24174760, -27430346, -30488900, -33845952, -37204080, -40331892, -43709884, -47450800, -50910932, --54007068, -57383448, -60954712, -63988572, -66580048, -69206952, -71360880, -72519448, -73506752, -75081400, --76629736, -77875272, -79886928, -83066280, -86566136, -90516432, -95884608, -101905616, -107004816, -111725520, --117132888, -121851984, -124525600, -126669320, -129272072, -130303400, -129090072, -128088808, -127532072, -124883688, --121162104, -119428544, -117273544, -111342736, -106378288, -106409424, -103459320, -92259656, -85136456, -89434640, --86687472, -65751116, -54604068, -73708616, -80806592, -25334402, 56436408, 75987632, 20873004, -31660352, --37648072, -36377836, -53824532, -44966160, 20563230, 87744032, 89147416, 38726648, -581431, -6444599, --6936372, -25312926, -52908628, -63184336, -33217278, 30641370, 79638360, 63588600, -4334696, -54877872, --46950972, -11652246, 3220152, -2754685, 17180, 17445620, 28529320, 22219476, 7569880, }, -}, -{ -{ --593779, --15749645, -47285980, -61542588, -36806796, 1975148, 12770012, -12308303, -41329932, -41480256, -9482751, -34246460, 68642168, 86235424, 92510376, 96318936, 99675456, 95814816, 77260016, 43951476, 2250026, --41162968, -81703696, -116041960, -143292992, -166559376, -189761856, -212546128, -230621488, -240955184, -243966496, --240413472, -229020000, -208530864, -180199104, -146741312, -110020952, -71091376, -31654982, 5920613, 39943732, -69974680, 96199752, 118821880, 138070848, 154407296, 168472784, 180739200, 191128736, 199068512, 204017920, -205905024, 205180256, 202813184, 200209904, 198603040, 198308304, 198823696, 199611296, 200352176, 200629728, -200044544, 198682496, 196919952, 194844416, 192390912, 189826288, 187396400, 184678768, 181011392, 176376592, -171086272, 164806480, 156766848, 146878224, 135744592, 123561912, 109926464, 94966024, 79778480, 65297460, -51424716, 37884832, 25379498, 15050639, 7016366, 285615, -5872294, -11288248, -15758235, -19619948, --23003844, -25256556, -25722560, -24534464, -22019760, -17813376, -11227045, -2228551, 8506183, 20395726, -33462090, 48085916, 64347200, 81491632, 98180808, 113563768, 127978752, 142265952, 156538144, 169929840, -181377536, 190427568, 197567424, 203966928, 210536608, 217013424, 222235024, 225385920, 226701264, 227103376, -227632736, 229052752, 231417664, 234032224, 236215152, 237979312, 239742384, 241751360, 244083536, 246742112, -249400160, 251434896, 252450656, 252423824, 251344704, 249170912, 246069408, 242220048, 237487536, 231686112, -224932800, 217416608, 209194432, 200498208, 191813232, 183445040, 175468736, 168131856, 161751152, 156293856, -151620928, 147904176, 145274048, 143464800, 142311056, 142009328, 142456544, 143032080, 143394992, 143675776, -143722496, 143104016, 141934176, 140727824, 139594496, 138438608, 137487264, 136726528, 135519104, 133565968, -131283192, 128694400, 125229432, 120950576, 116418848, 111328240, 104999064, 97896264, 90795608, 83313240, -75169984, 67478232, 60897804, 54517632, 48195976, 43270720, 39707508, 36021352, 32581622, 30756798, -29306710, 26775362, 25389700, 26396332, 25849260, 22560926, 22858890, 27938226, 27973658, 21383032, -23074174, 35598300, 35306780, 15142981, 14190035, 62300112, 118703768, 119914416, 73123968, 40620728, -40768904, 35194036, 16297790, 29255170, 85286240, 125082872, 104374688, 57344256, 36025112, 36459976, -25771414, 80531, -26517664, -55254756, -82899312, -78341816, -23211614, 44045428, 67240936, 44583908, -23708220, 30807800, 42936788, 35355096, 22083112, 30932892, 57170848, 64223184, 28750512, }, -{ --593779, --15749645, -47285980, -61542588, -36806796, 1975148, 12770012, -12308303, -41329932, -41480256, -9482751, -34246460, 68642168, 86235424, 92510376, 96318936, 99675456, 95814816, 77260016, 43951476, 2250026, --41162968, -81703696, -116041960, -143292992, -166559376, -189761856, -212546128, -230621488, -240955184, -243966496, --240413472, -229020000, -208530864, -180199104, -146741312, -110020952, -71091376, -31654982, 5920613, 39943732, -69974680, 96199752, 118821880, 138070848, 154407296, 168472784, 180739200, 191128736, 199068512, 204017920, -205905024, 205180256, 202813184, 200209904, 198603040, 198308304, 198823696, 199611296, 200352176, 200629728, -200044544, 198682496, 196919952, 194844416, 192390912, 189826288, 187396400, 184678768, 181011392, 176376592, -171086272, 164806480, 156766848, 146878224, 135744592, 123561912, 109926464, 94966024, 79778480, 65297460, -51424716, 37884832, 25379498, 15050639, 7016366, 285615, -5872294, -11288248, -15758235, -19619948, --23003844, -25256556, -25722560, -24534464, -22019760, -17813376, -11227045, -2228551, 8506183, 20395726, -33462090, 48085916, 64347200, 81491632, 98180808, 113563768, 127978752, 142265952, 156538144, 169929840, -181377536, 190427568, 197567424, 203966928, 210536608, 217013424, 222235024, 225385920, 226701264, 227103376, -227632736, 229052752, 231417664, 234032224, 236215152, 237979312, 239742384, 241751360, 244083536, 246742112, -249400160, 251434896, 252450656, 252423824, 251344704, 249170912, 246069408, 242220048, 237487536, 231686112, -224932800, 217416608, 209194432, 200498208, 191813232, 183445040, 175468736, 168131856, 161751152, 156293856, -151620928, 147904176, 145274048, 143464800, 142311056, 142009328, 142456544, 143032080, 143394992, 143675776, -143722496, 143104016, 141934176, 140727824, 139594496, 138438608, 137487264, 136726528, 135519104, 133565968, -131283192, 128694400, 125229432, 120950576, 116418848, 111328240, 104999064, 97896264, 90795608, 83313240, -75169984, 67478232, 60897804, 54517632, 48195976, 43270720, 39707508, 36021352, 32581622, 30756798, -29306710, 26775362, 25389700, 26396332, 25849260, 22560926, 22858890, 27938226, 27973658, 21383032, -23074174, 35598300, 35306780, 15142981, 14190035, 62300112, 118703768, 119914416, 73123968, 40620728, -40768904, 35194036, 16297790, 29255170, 85286240, 125082872, 104374688, 57344256, 36025112, 36459976, -25771414, 80531, -26517664, -55254756, -82899312, -78341816, -23211614, 44045428, 67240936, 44583908, -23708220, 30807800, 42936788, 35355096, 22083112, 30932892, 57170848, 64223184, 28750512, }, -}, -{ -{ --2034204, --1912871, 2893734, 2283312, -8800388, -21194590, -25225954, -27377732, -41857676, -65462816, -72565616, --42084772, 16944720, 74471512, 110361336, 128002376, 139204720, 146519056, 144579872, 130915432, 107955080, -77377592, 39032124, -4934918, -49726056, -92294016, -132781600, -171121696, -205086304, -232441488, -252692256, --265895520, -271576672, -269452832, -259612512, -241535008, -214609856, -180362320, -142905904, -106488344, -73330128, --43904768, -18021682, 4879083, 25580288, 44618804, 62207232, 78529184, 93599152, 106967768, 118061672, -126695096, 132961448, 137057776, 139608992, 141708688, 144187952, 147163840, 150511216, 154277904, 158406976, -162597792, 166676400, 170664816, 174398224, 177568448, 180142736, 182199488, 183408528, 183263568, 181747440, -179094224, 174972128, 168627392, 159862448, 149136304, 136598752, 121848760, 105010336, 87308632, 69930656, -52820044, 35374960, 18020610, 2053531, -12117713, -25485800, -38748120, -51050520, -61122216, -68888592, --75053480, -79632448, -81893216, -81562504, -79292072, -75939856, -71945536, -67399848, -62368292, -57090316, --51939576, -47119548, -42508364, -38028176, -33923800, -30288110, -26547192, -21916144, -16276315, -10230075, --4461934, 731218, 5592585, 10865194, 17233556, 24533926, 31795642, 38166152, 43517144, 48241608, -52942452, 58260696, 64491620, 71342088, 78354696, 85415624, 92620968, 99962680, 107408008, 114904872, -122087664, 128344360, 133310416, 136963824, 139292768, 140327856, 140374560, 139734608, 138376864, 136256768, -133678176, 130995432, 128357248, 126021320, 124419296, 123687544, 123623120, 124185224, 125509144, 127505232, -130003288, 133111776, 136913360, 141143904, 145602608, 150361968, 155197040, 159469984, 162880192, 165587088, -167499424, 168321920, 168255344, 167751216, 166788608, 165273024, 163637184, 162187632, 160570576, 158612064, -156744832, 155027920, 152930368, 150392032, 147729152, 144544976, 140299408, 135554544, 131003480, 126167888, -120727232, 115672056, 111467824, 107095544, 102325448, 98324152, 95037960, 91263224, 87568480, 85192288, -82870856, 79462264, 77278272, 77233712, 75366472, 70892192, 69963408, 73052560, 70506720, 61724584, -61392800, 70719856, 66434556, 43883292, 42880416, 91149408, 146700512, 147194432, 99498824, 63552096, -59225452, 53955528, 40287332, 54138064, 101396128, 131937640, 112648936, 73204496, 52901648, 47913044, -36569500, 16180216, -7840463, -31339840, -31613106, 19630684, 101511552, 144464976, 113561080, 54766200, -29202020, 36538360, 37560564, 21087752, 6425808, -571768, -10691247, -19418084, -10495826, }, -{ -2034204, -1912871, -2893734, -2283312, 8800388, 21194590, 25225954, 27377732, 41857676, 65462816, 72565616, -42084772, -16944720, -74471512, -110361336, -128002376, -139204720, -146519056, -144579872, -130915432, -107955080, --77377592, -39032124, 4934918, 49726056, 92294016, 132781600, 171121696, 205086304, 232441488, 252692256, -265895520, 271576672, 269452832, 259612512, 241535008, 214609856, 180362320, 142905904, 106488344, 73330128, -43904768, 18021682, -4879083, -25580288, -44618804, -62207232, -78529184, -93599152, -106967768, -118061672, --126695096, -132961448, -137057776, -139608992, -141708688, -144187952, -147163840, -150511216, -154277904, -158406976, --162597792, -166676400, -170664816, -174398224, -177568448, -180142736, -182199488, -183408528, -183263568, -181747440, --179094224, -174972128, -168627392, -159862448, -149136304, -136598752, -121848760, -105010336, -87308632, -69930656, --52820044, -35374960, -18020610, -2053531, 12117713, 25485800, 38748120, 51050520, 61122216, 68888592, -75053480, 79632448, 81893216, 81562504, 79292072, 75939856, 71945536, 67399848, 62368292, 57090316, -51939576, 47119548, 42508364, 38028176, 33923800, 30288110, 26547192, 21916144, 16276315, 10230075, -4461934, -731218, -5592585, -10865194, -17233556, -24533926, -31795642, -38166152, -43517144, -48241608, --52942452, -58260696, -64491620, -71342088, -78354696, -85415624, -92620968, -99962680, -107408008, -114904872, --122087664, -128344360, -133310416, -136963824, -139292768, -140327856, -140374560, -139734608, -138376864, -136256768, --133678176, -130995432, -128357248, -126021320, -124419296, -123687544, -123623120, -124185224, -125509144, -127505232, --130003288, -133111776, -136913360, -141143904, -145602608, -150361968, -155197040, -159469984, -162880192, -165587088, --167499424, -168321920, -168255344, -167751216, -166788608, -165273024, -163637184, -162187632, -160570576, -158612064, --156744832, -155027920, -152930368, -150392032, -147729152, -144544976, -140299408, -135554544, -131003480, -126167888, --120727232, -115672056, -111467824, -107095544, -102325448, -98324152, -95037960, -91263224, -87568480, -85192288, --82870856, -79462264, -77278272, -77233712, -75366472, -70892192, -69963408, -73052560, -70506720, -61724584, --61392800, -70719856, -66434556, -43883292, -42880416, -91149408, -146700512, -147194432, -99498824, -63552096, --59225452, -53955528, -40287332, -54138064, -101396128, -131937640, -112648936, -73204496, -52901648, -47913044, --36569500, -16180216, 7840463, 31339840, 31613106, -19630684, -101511552, -144464976, -113561080, -54766200, --29202020, -36538360, -37560564, -21087752, -6425808, 571768, 10691247, 19418084, 10495826, }, -}, -{ -{ --3675418, --81604, 10401337, 2452426, -11511586, 8936216, 50945828, 42283952, -43622908, -130787120, -129202816, --42832636, 50052476, 95645704, 102663680, 99507952, 95833072, 87682296, 72136664, 48658760, 18823232, --11484743, -35738424, -51967492, -60770568, -61992484, -57039312, -50183472, -44155484, -38139848, -32205276, --29515552, -32018444, -37574520, -43262132, -48939004, -56378960, -66799628, -79696336, -92715992, -102787160, --108356120, -110093968, -109205448, -106365936, -102507448, -98825048, -95390688, -91072632, -85015120, -77032920, --66794796, -53879292, -38326140, -20199768, 709207, 23946054, 48075716, 71977208, 95391224, 117751896, -137825504, 154971552, 169409616, 180861072, 188231232, 190866192, 188905552, 182306864, 170675024, 154083024, -133124120, 108329272, 80367432, 50499688, 20045686, -10299868, -40006008, -67978592, -92962960, -114493624, --132957152, -148661168, -161090800, -169352704, -173409840, -174407888, -173363136, -170013600, -163643088, -154449168, --143174352, -129936720, -114503288, -97249872, -78791176, -59132036, -38195680, -16756278, 4031364, 23615878, -41919416, 58651536, 73105176, 84196928, 90812792, 92942016, 92305824, 90893320, 88999776, 85517632, -79797808, 72384696, 64423972, 57170308, 51540144, 47448116, 44063680, 41047004, 38860864, 37816112, -37735584, 38522100, 40057012, 41652056, 42537356, 42621644, 42002096, 40294848, 37220188, 33149094, -28452010, 23117662, 17435420, 12073153, 7235410, 2716030, -1281511, -4464619, -7285875, -10326712, --13342853, -15938624, -18429168, -21095806, -23546622, -25574382, -27540404, -29378114, -30514132, -31028992, --31512176, -31836446, -31529892, -30946314, -30591978, -30040076, -28903520, -27822262, -27251030, -26651882, --25895432, -25755846, -26309896, -26737782, -27026618, -27815818, -28733868, -29087666, -29545616, -30953830, --32684164, -34200824, -36480380, -40064528, -44018048, -48190068, -53603876, -59761248, -64981780, -69554848, --74762496, -79546016, -82324320, -84368192, -87062744, -88705032, -88210040, -87769264, -88090320, -86719144, --83949432, -82848848, -81949584, -77654616, -73355360, -73597488, -72412608, -63796908, -57183196, -60899952, --60729228, -44258028, -32518272, -46260556, -54365696, -11566884, 57226144, 75289704, 24363738, -30342334, --42076720, -40014064, -55356224, -57699128, -12765180, 46264852, 58034672, 15075335, -36666672, -62856848, --71765680, -88359288, -116915992, -126920576, -78842712, 20230906, 97711576, 85162224, 3720516, -57114476, --48222284, -8475044, 5008469, -8928163, -14896557, -1306207, 12319040, 12317966, 4409321, }, -{ -3675418, -81604, -10401337, -2452426, 11511586, -8936216, -50945828, -42283952, 43622908, 130787120, 129202816, -42832636, -50052476, -95645704, -102663680, -99507952, -95833072, -87682296, -72136664, -48658760, -18823232, -11484743, 35738424, 51967492, 60770568, 61992484, 57039312, 50183472, 44155484, 38139848, 32205276, -29515552, 32018444, 37574520, 43262132, 48939004, 56378960, 66799628, 79696336, 92715992, 102787160, -108356120, 110093968, 109205448, 106365936, 102507448, 98825048, 95390688, 91072632, 85015120, 77032920, -66794796, 53879292, 38326140, 20199768, -709207, -23946054, -48075716, -71977208, -95391224, -117751896, --137825504, -154971552, -169409616, -180861072, -188231232, -190866192, -188905552, -182306864, -170675024, -154083024, --133124120, -108329272, -80367432, -50499688, -20045686, 10299868, 40006008, 67978592, 92962960, 114493624, -132957152, 148661168, 161090800, 169352704, 173409840, 174407888, 173363136, 170013600, 163643088, 154449168, -143174352, 129936720, 114503288, 97249872, 78791176, 59132036, 38195680, 16756278, -4031364, -23615878, --41919416, -58651536, -73105176, -84196928, -90812792, -92942016, -92305824, -90893320, -88999776, -85517632, --79797808, -72384696, -64423972, -57170308, -51540144, -47448116, -44063680, -41047004, -38860864, -37816112, --37735584, -38522100, -40057012, -41652056, -42537356, -42621644, -42002096, -40294848, -37220188, -33149094, --28452010, -23117662, -17435420, -12073153, -7235410, -2716030, 1281511, 4464619, 7285875, 10326712, -13342853, 15938624, 18429168, 21095806, 23546622, 25574382, 27540404, 29378114, 30514132, 31028992, -31512176, 31836446, 31529892, 30946314, 30591978, 30040076, 28903520, 27822262, 27251030, 26651882, -25895432, 25755846, 26309896, 26737782, 27026618, 27815818, 28733868, 29087666, 29545616, 30953830, -32684164, 34200824, 36480380, 40064528, 44018048, 48190068, 53603876, 59761248, 64981780, 69554848, -74762496, 79546016, 82324320, 84368192, 87062744, 88705032, 88210040, 87769264, 88090320, 86719144, -83949432, 82848848, 81949584, 77654616, 73355360, 73597488, 72412608, 63796908, 57183196, 60899952, -60729228, 44258028, 32518272, 46260556, 54365696, 11566884, -57226144, -75289704, -24363738, 30342334, -42076720, 40014064, 55356224, 57699128, 12765180, -46264852, -58034672, -15075335, 36666672, 62856848, -71765680, 88359288, 116915992, 126920576, 78842712, -20230906, -97711576, -85162224, -3720516, 57114476, -48222284, 8475044, -5008469, 8928163, 14896557, 1306207, -12319040, -12317966, -4409321, }, -}, -{ -{ --762357, --6477348, -14222784, -10846403, 5228586, 21163988, 35575216, 66310536, 118070264, 157852928, 142933824, -68589552, -27521076, -105497280, -152864336, -176070032, -181038784, -170702400, -151094800, -129158792, -106835704, --82560544, -56399364, -30084098, -4484483, 19157164, 37076304, 45797772, 46952584, 46815144, 50714972, -59249612, 69804496, 80100064, 89555440, 98271536, 105989592, 112247360, 116796264, 119299160, 118966840, -115220016, 108731392, 101220032, 94026496, 87261384, 80369576, 73014448, 65229280, 57132192, 48824652, -40409200, 31980326, 23708220, 15993384, 9437117, 4599373, 1793149, 1034550, 2121714, 4803384, -8926553, 14411763, 21115670, 28822452, 37382860, 46752868, 56827248, 67247376, 77452752, 86985432, -95689720, 103484552, 109970488, 114496312, 116655072, 116416696, 113629800, 107755360, 98385352, 85743656, -70347808, 52385716, 31819802, 8960376, -15445776, -40662068, -66213900, -91788816, -117190864, -142307296, --166738144, -189384432, -208740784, -223839744, -234798880, -242265680, -246359328, -246337312, -241437824, -232037760, --219912528, -207242912, -195313632, -184130080, -173242880, -162818448, -153881168, -147643264, -144762416, -145164528, --148305760, -153484944, -160064848, -167640624, -176078096, -185327296, -195156864, -205027248, -214212560, -222095984, --228442336, -233406240, -237294800, -240332944, -242621088, -244211840, -245200752, -245777888, -246143504, -246290608, --245951840, -244897424, -243215952, -241184960, -238969296, -236579152, -233949552, -230842144, -226779648, -221327712, --214401008, -206182048, -196865200, -186623840, -175695840, -164380208, -153018416, -141984640, -131570952, -121886880, --112959784, -104855184, -97563400, -90909424, -84746688, -79084840, -73921216, -69122128, -64585032, -60297044, --56171192, -52042656, -47883516, -43815108, -39946416, -36373540, -33176474, -30210264, -27126476, -23757074, --20204064, -16452409, -12315819, -7840463, -3291556, 1277753, 5950677, 10547903, 14847702, 18951006, -22899156, 26341034, 29087130, 31393526, 33239288, 34172372, 34248068, 34074124, 33718176, 32808718, -31643172, 30706868, 29549374, 27838368, 26435524, 25466472, 23294292, 19743964, 17202954, 15673409, -11533061, 4961761, 1608465, 1366337, -5018133, -19530826, -28349468, -22183506, -13077102, -14627585, --18621904, -13313325, -12147241, -34821984, -67240936, -73887936, -49457084, -25412248, -22541598, -29239600, --31068720, -28877750, -22050362, -8371428, -7073811, -43227772, -98173824, -116765664, -80738408, -33805688, --14342506, -8144869, 6374805, 16698296, 18523658, 48044040, 115123912, 146539456, 69534448, }, -{ --762357, --6477348, -14222784, -10846403, 5228586, 21163988, 35575216, 66310536, 118070264, 157852928, 142933824, -68589552, -27521076, -105497280, -152864336, -176070032, -181038784, -170702400, -151094800, -129158792, -106835704, --82560544, -56399364, -30084098, -4484483, 19157164, 37076304, 45797772, 46952584, 46815144, 50714972, -59249612, 69804496, 80100064, 89555440, 98271536, 105989592, 112247360, 116796264, 119299160, 118966840, -115220016, 108731392, 101220032, 94026496, 87261384, 80369576, 73014448, 65229280, 57132192, 48824652, -40409200, 31980326, 23708220, 15993384, 9437117, 4599373, 1793149, 1034550, 2121714, 4803384, -8926553, 14411763, 21115670, 28822452, 37382860, 46752868, 56827248, 67247376, 77452752, 86985432, -95689720, 103484552, 109970488, 114496312, 116655072, 116416696, 113629800, 107755360, 98385352, 85743656, -70347808, 52385716, 31819802, 8960376, -15445776, -40662068, -66213900, -91788816, -117190864, -142307296, --166738144, -189384432, -208740784, -223839744, -234798880, -242265680, -246359328, -246337312, -241437824, -232037760, --219912528, -207242912, -195313632, -184130080, -173242880, -162818448, -153881168, -147643264, -144762416, -145164528, --148305760, -153484944, -160064848, -167640624, -176078096, -185327296, -195156864, -205027248, -214212560, -222095984, --228442336, -233406240, -237294800, -240332944, -242621088, -244211840, -245200752, -245777888, -246143504, -246290608, --245951840, -244897424, -243215952, -241184960, -238969296, -236579152, -233949552, -230842144, -226779648, -221327712, --214401008, -206182048, -196865200, -186623840, -175695840, -164380208, -153018416, -141984640, -131570952, -121886880, --112959784, -104855184, -97563400, -90909424, -84746688, -79084840, -73921216, -69122128, -64585032, -60297044, --56171192, -52042656, -47883516, -43815108, -39946416, -36373540, -33176474, -30210264, -27126476, -23757074, --20204064, -16452409, -12315819, -7840463, -3291556, 1277753, 5950677, 10547903, 14847702, 18951006, -22899156, 26341034, 29087130, 31393526, 33239288, 34172372, 34248068, 34074124, 33718176, 32808718, -31643172, 30706868, 29549374, 27838368, 26435524, 25466472, 23294292, 19743964, 17202954, 15673409, -11533061, 4961761, 1608465, 1366337, -5018133, -19530826, -28349468, -22183506, -13077102, -14627585, --18621904, -13313325, -12147241, -34821984, -67240936, -73887936, -49457084, -25412248, -22541598, -29239600, --31068720, -28877750, -22050362, -8371428, -7073811, -43227772, -98173824, -116765664, -80738408, -33805688, --14342506, -8144869, 6374805, 16698296, 18523658, 48044040, 115123912, 146539456, 69534448, }, -}, -{ -{ --20420422, --40212704, -13275744, 46952044, 92115240, 74442520, -7164006, -95062120, -120792200, -71658848, 412317, -39556112, 39258684, 27809376, 22846004, 21613350, 22599582, 30020210, 38551628, 35357780, 20413980, -8887361, 10007274, 16486769, 18066780, 14104136, 8451422, 938450, -10698227, -25531434, -39939976, --50867984, -57304528, -60780228, -64703684, -71266392, -79088064, -84963040, -86841016, -84133576, -76906760, --66280472, -54327580, -42438036, -30728880, -19357954, -9056475, -92879, 7961259, 15277736, 21703544, -27533962, 33300492, 38995080, 44351444, 49515068, 54651312, 59322624, 62897112, 65213172, 66435092, -66654672, 65978212, 64715492, 63386736, 62636192, 62914828, 64117956, 65955664, 68715184, 73009616, -78762184, 85276040, 92387968, 100618200, 110020952, 119751208, 128918272, 137119520, 144049984, 149180320, -151877552, 151570464, 148041616, 141655536, 132766032, 120954336, 105805984, 88399016, 70622144, 52656836, -32515050, 8725226, -17654464, -44401372, -70559336, -96706560, -123290256, -149426208, -173422720, -194302704, --212562768, -229117184, -243644368, -254602976, -260943424, -263205264, -262809056, -260753904, -256988832, -250553904, --240419920, -226641664, -210570976, -193659536, -176393776, -158628176, -140387456, -121987272, -103876472, -86627344, --70640400, -55742768, -41512468, -27914066, -15139223, -3025805, 8857296, 20782274, 32812476, 44721348, -55698748, 64797096, 71973992, 78112032, 83941376, 89633280, 95259152, 100662224, 105034496, 107632416, -108781320, 109376176, 109795472, 110085920, 110543872, 111199928, 111377088, 110571248, 109153376, 107686640, -106334800, 105305080, 104967392, 105214352, 105491912, 105521976, 105286288, 104618960, 103560792, 102622872, -102025336, 101370352, 100522632, 99797864, 98946384, 97210144, 94642288, 92025576, 89505504, 86723976, -84018152, 81963008, 80254152, 78476568, 77107008, 76456864, 75900664, 75283264, 75432512, 76365056, -77025408, 77376520, 78352016, 79577688, 79879952, 79704392, 80063024, 80121008, 78970488, 77898896, -77632072, 76328008, 73605000, 72157600, 71994928, 69305736, 64568392, 63270236, 64563560, 60656212, -52715356, 52361556, 59256592, 55627880, 36381596, 24951076, 39360156, 60072632, 56738664, 33551210, -18991272, 18456548, 9521406, -14571750, -28408524, -13103408, 12198781, 15094663, -7445326, -29722248, --35500052, -37107980, -50775104, -65863324, -53801444, -7777112, 40449464, 53233436, 29868814, 4861903, -5153424, 21903796, 29221346, 20372104, 14507326, 28734942, 52626772, 56590488, 24798068, }, -{ --20420422, --40212704, -13275744, 46952044, 92115240, 74442520, -7164006, -95062120, -120792200, -71658848, 412317, -39556112, 39258684, 27809376, 22846004, 21613350, 22599582, 30020210, 38551628, 35357780, 20413980, -8887361, 10007274, 16486769, 18066780, 14104136, 8451422, 938450, -10698227, -25531434, -39939976, --50867984, -57304528, -60780228, -64703684, -71266392, -79088064, -84963040, -86841016, -84133576, -76906760, --66280472, -54327580, -42438036, -30728880, -19357954, -9056475, -92879, 7961259, 15277736, 21703544, -27533962, 33300492, 38995080, 44351444, 49515068, 54651312, 59322624, 62897112, 65213172, 66435092, -66654672, 65978212, 64715492, 63386736, 62636192, 62914828, 64117956, 65955664, 68715184, 73009616, -78762184, 85276040, 92387968, 100618200, 110020952, 119751208, 128918272, 137119520, 144049984, 149180320, -151877552, 151570464, 148041616, 141655536, 132766032, 120954336, 105805984, 88399016, 70622144, 52656836, -32515050, 8725226, -17654464, -44401372, -70559336, -96706560, -123290256, -149426208, -173422720, -194302704, --212562768, -229117184, -243644368, -254602976, -260943424, -263205264, -262809056, -260753904, -256988832, -250553904, --240419920, -226641664, -210570976, -193659536, -176393776, -158628176, -140387456, -121987272, -103876472, -86627344, --70640400, -55742768, -41512468, -27914066, -15139223, -3025805, 8857296, 20782274, 32812476, 44721348, -55698748, 64797096, 71973992, 78112032, 83941376, 89633280, 95259152, 100662224, 105034496, 107632416, -108781320, 109376176, 109795472, 110085920, 110543872, 111199928, 111377088, 110571248, 109153376, 107686640, -106334800, 105305080, 104967392, 105214352, 105491912, 105521976, 105286288, 104618960, 103560792, 102622872, -102025336, 101370352, 100522632, 99797864, 98946384, 97210144, 94642288, 92025576, 89505504, 86723976, -84018152, 81963008, 80254152, 78476568, 77107008, 76456864, 75900664, 75283264, 75432512, 76365056, -77025408, 77376520, 78352016, 79577688, 79879952, 79704392, 80063024, 80121008, 78970488, 77898896, -77632072, 76328008, 73605000, 72157600, 71994928, 69305736, 64568392, 63270236, 64563560, 60656212, -52715356, 52361556, 59256592, 55627880, 36381596, 24951076, 39360156, 60072632, 56738664, 33551210, -18991272, 18456548, 9521406, -14571750, -28408524, -13103408, 12198781, 15094663, -7445326, -29722248, --35500052, -37107980, -50775104, -65863324, -53801444, -7777112, 40449464, 53233436, 29868814, 4861903, -5153424, 21903796, 29221346, 20372104, 14507326, 28734942, 52626772, 56590488, 24798068, }, -}, -{ -{ -14732275, -11638825, -44356812, -103051296, -108493024, -50523848, 52062520, 175351696, 280234816, 316784448, 267124960, -164828496, 53560388, -54754392, -164943920, -264043856, -327144960, -348748672, -347294272, -340326240, -329075552, --306791648, -271212160, -226679248, -179788944, -134819568, -91358784, -46217608, 1948305, 51128364, 98800888, -143956032, 185903360, 223205696, 254543392, 279389248, 297522048, 308752864, 313207264, 311433440, 304490624, -294090912, 281911456, 268454784, 253179728, 235893024, 217406416, 198865568, 181129504, 164740448, 149718800, -135312944, 120514096, 104906720, 88763016, 72480792, 56328496, 40613212, 25741350, 12032351, -425202, --11732240, -22002580, -31228170, -39348344, -46411416, -52493092, -57499412, -61295088, -64025616, -66019016, --67385352, -68027984, -68061272, -67838472, -67479304, -66735740, -65527244, -64324116, -63756644, -63998772, --64753612, -65714072, -66779224, -67802504, -68379640, -68074160, -66823248, -65060700, -63425392, -62366684, --62037044, -62612032, -64670396, -69012072, -75856640, -84277992, -92689688, -99956776, -105894032, -110643728, --113752208, -114045880, -110504136, -103202696, -93259312, -81803560, -69157560, -55132348, -39913132, -24388434, --9687836, 3438121, 14907295, 25171192, 34681860, 43366820, 50702624, 56338160, 60504280, 63885492, -67284960, 71270152, 75776112, 80083960, 83495240, 85966992, 87916368, 89653144, 91292216, 92918400, -94461360, 95609728, 96113312, 95987152, 95276872, 93914288, 91903176, 89335856, 86142552, 82104744, -77110232, 71161168, 64230164, 56386480, 47918952, 39143796, 30273076, 21537114, 13142600, 5056787, --2822867, -10342281, -17255032, -23532662, -29110214, -33621540, -36813240, -38884488, -40048424, -40223444, --39477192, -38198904, -36531380, -34227668, -31245888, -27889370, -24346558, -20729122, -17398376, -14614163, --12166569, -9895068, -7998840, -6334003, -4242891, -1566589, 1091995, 3431679, 5676873, 7654169, -8916889, 9718437, 10595684, 11388643, 11908334, 12730820, 14100915, 15284715, 16068546, 17187386, -18505940, 19101868, 19503984, 20854750, 22139482, 22066468, 22573812, 25519086, 28031104, 27629524, -28576564, 34391952, 38481832, 34390876, 31168578, 42307576, 60968672, 64931852, 48531520, 30916248, -27147952, 28959354, 22742388, 11207180, 6075768, 9893457, 15458661, 16604880, 11769284, 1722282, --10866267, -23903104, -41185516, -68761888, -99917048, -109958680, -78720848, -20484846, 22592064, 28151900, -21925272, 38224672, 65255048, 67648416, 60901024, 105280384, 197452000, 226874128, 103426568, }, -{ -14732275, -11638825, -44356812, -103051296, -108493024, -50523848, 52062520, 175351696, 280234816, 316784448, 267124960, -164828496, 53560388, -54754392, -164943920, -264043856, -327144960, -348748672, -347294272, -340326240, -329075552, --306791648, -271212160, -226679248, -179788944, -134819568, -91358784, -46217608, 1948305, 51128364, 98800888, -143956032, 185903360, 223205696, 254543392, 279389248, 297522048, 308752864, 313207264, 311433440, 304490624, -294090912, 281911456, 268454784, 253179728, 235893024, 217406416, 198865568, 181129504, 164740448, 149718800, -135312944, 120514096, 104906720, 88763016, 72480792, 56328496, 40613212, 25741350, 12032351, -425202, --11732240, -22002580, -31228170, -39348344, -46411416, -52493092, -57499412, -61295088, -64025616, -66019016, --67385352, -68027984, -68061272, -67838472, -67479304, -66735740, -65527244, -64324116, -63756644, -63998772, --64753612, -65714072, -66779224, -67802504, -68379640, -68074160, -66823248, -65060700, -63425392, -62366684, --62037044, -62612032, -64670396, -69012072, -75856640, -84277992, -92689688, -99956776, -105894032, -110643728, --113752208, -114045880, -110504136, -103202696, -93259312, -81803560, -69157560, -55132348, -39913132, -24388434, --9687836, 3438121, 14907295, 25171192, 34681860, 43366820, 50702624, 56338160, 60504280, 63885492, -67284960, 71270152, 75776112, 80083960, 83495240, 85966992, 87916368, 89653144, 91292216, 92918400, -94461360, 95609728, 96113312, 95987152, 95276872, 93914288, 91903176, 89335856, 86142552, 82104744, -77110232, 71161168, 64230164, 56386480, 47918952, 39143796, 30273076, 21537114, 13142600, 5056787, --2822867, -10342281, -17255032, -23532662, -29110214, -33621540, -36813240, -38884488, -40048424, -40223444, --39477192, -38198904, -36531380, -34227668, -31245888, -27889370, -24346558, -20729122, -17398376, -14614163, --12166569, -9895068, -7998840, -6334003, -4242891, -1566589, 1091995, 3431679, 5676873, 7654169, -8916889, 9718437, 10595684, 11388643, 11908334, 12730820, 14100915, 15284715, 16068546, 17187386, -18505940, 19101868, 19503984, 20854750, 22139482, 22066468, 22573812, 25519086, 28031104, 27629524, -28576564, 34391952, 38481832, 34390876, 31168578, 42307576, 60968672, 64931852, 48531520, 30916248, -27147952, 28959354, 22742388, 11207180, 6075768, 9893457, 15458661, 16604880, 11769284, 1722282, --10866267, -23903104, -41185516, -68761888, -99917048, -109958680, -78720848, -20484846, 22592064, 28151900, -21925272, 38224672, 65255048, 67648416, 60901024, 105280384, 197452000, 226874128, 103426568, }, -}, -}; -const Word32 CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[9][BINAURAL_CHANNELS][160] ={ -{ -{ -481896416, -310217984, 58414776, -164563280, -304120192, -367148288, -380131456, -355551904, -293191648, -196581728, -79275968, -40710920, 147338320, 229316352, 281262912, 303829760, 301715552, 280467264, 244312240, 196129680, 138977088, -77330352, 16125992, -41793788, -96546568, -148845856, -197435344, -239701056, -274179968, -301347776, -322237984, --337472224, -347732896, -354176960, -357916256, -359532256, -359364736, -357953312, -355943808, -353696992, -351132352, --347911680, -343733216, -338496032, -332253312, -325083936, -317056640, -308251424, -298721952, -288455904, -277455968, --265846672, -253836864, -241596736, -229251936, -216980144, -205003616, -193438352, -182215600, -171222096, -160454608, --149944832, -139622944, -129395552, -119315800, -109508784, -99968048, -90599112, -81424528, -72528040, -63835024, --55175836, -46532748, -37983616, -29444148, -20744692, -11905649, -3056406, 5887864, 15157476, 24732032, -34304440, 43698608, 53047140, 62476740, 71822056, 80786728, 89310624, 97632120, 105963288, 114152712, -121790776, 128664872, 134969888, 140964592, 146582400, 151548464, 155807984, 159674544, 163566320, 167695392, -171996800, 176316992, 180702160, 185452400, 190833984, 196802912, 203105776, 209568640, 216174832, 222944240, -229863968, 236866912, 243799520, 250473360, 256799312, 262798304, 268505248, 273959872, 279246432, 284425632, -289483488, 294429664, 299342048, 304237760, 309028800, 313663072, 318155072, 322462912, 326518432, 330373184, -334144160, 337883456, 341634592, 345500064, 349513152, 353603584, 357777216, 362119968, 366623232, 371291872, -376310016, 381789312, 387576768, 393623552, 400144384, 407121568, 414326912, 422021344, 430657984, 440077920, -450606496, 463627232, 476568512, 477523040, 452622976, 403573920, 351848544, 318913664, 307050976, }, -{ -481896416, -310217984, 58414776, -164563280, -304120192, -367148288, -380131456, -355551904, -293191648, -196581728, -79275968, -40710920, 147338320, 229316352, 281262912, 303829760, 301715552, 280467264, 244312240, 196129680, 138977088, -77330352, 16125992, -41793788, -96546568, -148845856, -197435344, -239701056, -274179968, -301347776, -322237984, --337472224, -347732896, -354176960, -357916256, -359532256, -359364736, -357953312, -355943808, -353696992, -351132352, --347911680, -343733216, -338496032, -332253312, -325083936, -317056640, -308251424, -298721952, -288455904, -277455968, --265846672, -253836864, -241596736, -229251936, -216980144, -205003616, -193438352, -182215600, -171222096, -160454608, --149944832, -139622944, -129395552, -119315800, -109508784, -99968048, -90599112, -81424528, -72528040, -63835024, --55175836, -46532748, -37983616, -29444148, -20744692, -11905649, -3056406, 5887864, 15157476, 24732032, -34304440, 43698608, 53047140, 62476740, 71822056, 80786728, 89310624, 97632120, 105963288, 114152712, -121790776, 128664872, 134969888, 140964592, 146582400, 151548464, 155807984, 159674544, 163566320, 167695392, -171996800, 176316992, 180702160, 185452400, 190833984, 196802912, 203105776, 209568640, 216174832, 222944240, -229863968, 236866912, 243799520, 250473360, 256799312, 262798304, 268505248, 273959872, 279246432, 284425632, -289483488, 294429664, 299342048, 304237760, 309028800, 313663072, 318155072, 322462912, 326518432, 330373184, -334144160, 337883456, 341634592, 345500064, 349513152, 353603584, 357777216, 362119968, 366623232, 371291872, -376310016, 381789312, 387576768, 393623552, 400144384, 407121568, 414326912, 422021344, 430657984, 440077920, -450606496, 463627232, 476568512, 477523040, 452622976, 403573920, 351848544, 318913664, 307050976, }, -}, -{ -{ -13525926, -183669984, 362690656, 366411168, 138906224, -214040240, -522691616, -677840320, -674817728, -568401856, -410595104, --229047392, -39669392, 141587360, 300526368, 428658144, 521396160, 575446144, 590423808, 571661760, 529043328, -471929408, 405152864, 330017760, 248510032, 165263904, 85160072, 10375030, -59271084, -124093952, -183848752, --238508128, -288401696, -333674400, -374409472, -411122848, -444532864, -474971296, -502325408, -526306912, -546517440, --562593472, -574554944, -582817408, -587780800, -589642624, -588579072, -584835520, -578711936, -570693248, -561455296, --551466304, -540655296, -528643360, -515168992, -500203168, -483882304, -466478016, -448338752, -429813472, -411243104, --392908448, -374906080, -357258080, -340159808, -323866848, -308357728, -293488000, -279438080, -266554256, -254817184, --243973472, -234108464, -225463232, -217766112, -210407760, -203240544, -196530192, -190128544, -183390272, -175983056, --168182864, -160230736, -151880240, -142743232, -132778376, -122292752, -111605264, -100761544, -89523224, -77611136, --64876016, -51212116, -36453536, -20468204, -3209414, 15364172, 35185984, 55814712, 76534704, 96804264, -116362472, 134906000, 151974192, 167189120, 180361248, 191393408, 200296336, 207218208, 212311504, 215768416, -218109712, 220124048, 222336496, 224759936, 227243504, 229805440, 232639584, 236098640, 240605680, 246271280, -252668096, 259198048, 265524544, 271540192, 277264832, 282908960, 288683008, 294484448, 300107616, 305644896, -311247680, 316729152, 321888480, 326903904, 331966080, 336980448, 342003424, 347368896, 353091936, 358864928, -364784448, 371252128, 378262080, 385742272, 394208192, 404053344, 414948608, 426906880, 440630368, 456193696, -473796640, 495514144, 520240800, 534992928, 520508704, 473353184, 415980480, 375763456, 359659488, }, -{ --13525926, --183669984, -362690656, -366411168, -138906224, 214040240, 522691616, 677840320, 674817728, 568401856, 410595104, -229047392, 39669392, -141587360, -300526368, -428658144, -521396160, -575446144, -590423808, -571661760, -529043328, --471929408, -405152864, -330017760, -248510032, -165263904, -85160072, -10375030, 59271084, 124093952, 183848752, -238508128, 288401696, 333674400, 374409472, 411122848, 444532864, 474971296, 502325408, 526306912, 546517440, -562593472, 574554944, 582817408, 587780800, 589642624, 588579072, 584835520, 578711936, 570693248, 561455296, -551466304, 540655296, 528643360, 515168992, 500203168, 483882304, 466478016, 448338752, 429813472, 411243104, -392908448, 374906080, 357258080, 340159808, 323866848, 308357728, 293488000, 279438080, 266554256, 254817184, -243973472, 234108464, 225463232, 217766112, 210407760, 203240544, 196530192, 190128544, 183390272, 175983056, -168182864, 160230736, 151880240, 142743232, 132778376, 122292752, 111605264, 100761544, 89523224, 77611136, -64876016, 51212116, 36453536, 20468204, 3209414, -15364172, -35185984, -55814712, -76534704, -96804264, --116362472, -134906000, -151974192, -167189120, -180361248, -191393408, -200296336, -207218208, -212311504, -215768416, --218109712, -220124048, -222336496, -224759936, -227243504, -229805440, -232639584, -236098640, -240605680, -246271280, --252668096, -259198048, -265524544, -271540192, -277264832, -282908960, -288683008, -294484448, -300107616, -305644896, --311247680, -316729152, -321888480, -326903904, -331966080, -336980448, -342003424, -347368896, -353091936, -358864928, --364784448, -371252128, -378262080, -385742272, -394208192, -404053344, -414948608, -426906880, -440630368, -456193696, --473796640, -495514144, -520240800, -534992928, -520508704, -473353184, -415980480, -375763456, -359659488, }, -}, -{ -{ -66455492, -42489036, -7303592, -56425132, -60765736, -13364864, 39979704, 53002044, 24871618, -14745160, -41990284, --47383152, -29909078, -205622, 22675280, 31130996, 37305012, 53430468, 73776800, 84180288, 80077520, -66210680, 45848240, 19817516, -7459822, -29043642, -42323680, -50713900, -58782532, -67827736, -75635984, --79104168, -77078560, -70941048, -62747860, -53937808, -46253040, -42276972, -43666932, -49686328, -58409944, --68580968, -79631912, -90862720, -101538936, -111372264, -120424440, -128844184, -136780752, -144075216, -149948048, --153377584, -153809760, -151199488, -145503296, -136517152, -124198640, -108806552, -90635624, -69779256, -46251964, --20236276, 7921531, 37937448, 69579008, 102332968, 135326896, 167705584, 198836592, 228010144, 254259376, -276677504, 294603072, 307423552, 314699232, 316621216, 313799424, 306456128, 294547232, 278876512, 261192000, -242652224, 223062352, 202313904, 181782336, 163247408, 146855136, 131297152, 116018344, 102219688, 91343752, -83339008, 76982456, 71439800, 66915592, 63953672, 62676996, 62753768, 63661080, 64808372, 65666292, -66025460, 66092032, 66163436, 66112968, 65171832, 62365072, 57319024, 50632832, 43322260, 35932232, -28326384, 20185810, 11475079, 2470680, -6353331, -14421963, -21213380, -26396332, -29804388, -31382252, --31219044, -29484950, -26259966, -21551072, -15535434, -8628052, -1274532, 6187438, 13492640, 20416128, -26744762, 32187558, 36453536, 39546984, 41860360, 43914968, 46180564, 49097920, 52860308, 57086556, -61080876, 64526516, 67592584, 70358008, 72584408, 74128992, 75091064, 75411576, 74807056, 73303816, -71312560, 68612640, 63502164, 53864260, 39855148, 25321516, 15413564, 12046846, 12323335, }, -{ -66455492, -42489036, -7303592, -56425132, -60765736, -13364864, 39979704, 53002044, 24871618, -14745160, -41990284, --47383152, -29909078, -205622, 22675280, 31130996, 37305012, 53430468, 73776800, 84180288, 80077520, -66210680, 45848240, 19817516, -7459822, -29043642, -42323680, -50713900, -58782532, -67827736, -75635984, --79104168, -77078560, -70941048, -62747860, -53937808, -46253040, -42276972, -43666932, -49686328, -58409944, --68580968, -79631912, -90862720, -101538936, -111372264, -120424440, -128844184, -136780752, -144075216, -149948048, --153377584, -153809760, -151199488, -145503296, -136517152, -124198640, -108806552, -90635624, -69779256, -46251964, --20236276, 7921531, 37937448, 69579008, 102332968, 135326896, 167705584, 198836592, 228010144, 254259376, -276677504, 294603072, 307423552, 314699232, 316621216, 313799424, 306456128, 294547232, 278876512, 261192000, -242652224, 223062352, 202313904, 181782336, 163247408, 146855136, 131297152, 116018344, 102219688, 91343752, -83339008, 76982456, 71439800, 66915592, 63953672, 62676996, 62753768, 63661080, 64808372, 65666292, -66025460, 66092032, 66163436, 66112968, 65171832, 62365072, 57319024, 50632832, 43322260, 35932232, -28326384, 20185810, 11475079, 2470680, -6353331, -14421963, -21213380, -26396332, -29804388, -31382252, --31219044, -29484950, -26259966, -21551072, -15535434, -8628052, -1274532, 6187438, 13492640, 20416128, -26744762, 32187558, 36453536, 39546984, 41860360, 43914968, 46180564, 49097920, 52860308, 57086556, -61080876, 64526516, 67592584, 70358008, 72584408, 74128992, 75091064, 75411576, 74807056, 73303816, -71312560, 68612640, 63502164, 53864260, 39855148, 25321516, 15413564, 12046846, 12323335, }, -}, -{ -{ -11833172, -22050898, 12451110, -26542362, -61786864, -58906012, -27816356, -9918153, -28902446, -69264400, -99286760, --101615168, -80803904, -51693152, -25300042, -1960653, 25160456, 59849832, 96844536, 126515240, 143009520, -145950512, 137272528, 120158688, 99385008, 78400872, 55796456, 27408870, -8007967, -47571596, -88422104, --130155760, -172388720, -212445728, -247005184, -274629888, -295379392, -308997664, -314888224, -313453152, -306353024, --295421280, -281890528, -266567152, -250204400, -233463680, -216624192, -199466864, -181607856, -163049312, -144401632, --126627984, -110723720, -97463008, -86975232, -78442208, -70585104, -62549220, -54095648, -45135276, -35643932, --25954488, -16548509, -7518877, 1311039, 9896142, 18180060, 26588532, 35627292, 45120780, 54547696, -63959580, 73747272, 83600464, 92582312, 100256888, 106849656, 112147504, 115181896, 115410064, 113417200, -109878152, 104501384, 96770984, 87287696, 77452216, 67945312, 58334244, 48197048, 37726992, 26994944, -15467251, 2789045, -10579578, -24038396, -37650756, -51689396, -65735548, -78822312, -90355912, -100470560, --109487304, -117223616, -122861832, -125552096, -125297616, -123098056, -119972392, -115938344, -110206712, -102256728, --92516816, -82153600, -72332616, -63403916, -54622320, -44908716, -34036004, -22905060, -12717398, -4143570, -2891587, 9098888, 15460809, 22529788, 30061550, 37520296, 44748192, 51960516, 59451476, 67590976, -76761800, 87010128, 97994512, 109366512, 120924264, 132441224, 143733760, 154837872, 165794864, 176393232, -186362928, 195563280, 203809088, 210876992, 216793840, 221757744, 225868032, 229339984, 232655152, 236167904, -240298048, 246023248, 252849024, 255440496, 246008208, 223415616, 197305424, 179231136, 171975328, }, -{ -11833172, -22050898, 12451110, -26542362, -61786864, -58906012, -27816356, -9918153, -28902446, -69264400, -99286760, --101615168, -80803904, -51693152, -25300042, -1960653, 25160456, 59849832, 96844536, 126515240, 143009520, -145950512, 137272528, 120158688, 99385008, 78400872, 55796456, 27408870, -8007967, -47571596, -88422104, --130155760, -172388720, -212445728, -247005184, -274629888, -295379392, -308997664, -314888224, -313453152, -306353024, --295421280, -281890528, -266567152, -250204400, -233463680, -216624192, -199466864, -181607856, -163049312, -144401632, --126627984, -110723720, -97463008, -86975232, -78442208, -70585104, -62549220, -54095648, -45135276, -35643932, --25954488, -16548509, -7518877, 1311039, 9896142, 18180060, 26588532, 35627292, 45120780, 54547696, -63959580, 73747272, 83600464, 92582312, 100256888, 106849656, 112147504, 115181896, 115410064, 113417200, -109878152, 104501384, 96770984, 87287696, 77452216, 67945312, 58334244, 48197048, 37726992, 26994944, -15467251, 2789045, -10579578, -24038396, -37650756, -51689396, -65735548, -78822312, -90355912, -100470560, --109487304, -117223616, -122861832, -125552096, -125297616, -123098056, -119972392, -115938344, -110206712, -102256728, --92516816, -82153600, -72332616, -63403916, -54622320, -44908716, -34036004, -22905060, -12717398, -4143570, -2891587, 9098888, 15460809, 22529788, 30061550, 37520296, 44748192, 51960516, 59451476, 67590976, -76761800, 87010128, 97994512, 109366512, 120924264, 132441224, 143733760, 154837872, 165794864, 176393232, -186362928, 195563280, 203809088, 210876992, 216793840, 221757744, 225868032, 229339984, 232655152, 236167904, -240298048, 246023248, 252849024, 255440496, 246008208, 223415616, 197305424, 179231136, 171975328, }, -}, -{ -{ --2799245, --6461242, -4839355, 4228932, 10352482, 5557688, -2879239, -4031901, -4235375, -23969676, -69864624, --119191248, -140357376, -124462248, -88925688, -53108344, -20214264, 15939697, 56487948, 96248608, 131457136, -161556272, 184781840, 197673184, 199340176, 192308768, 178485952, 157262912, 128219808, 93059056, 53966264, -12078522, -31656594, -75794896, -119164408, -160668816, -197753184, -226699648, -245372560, -254762432, -257492416, --255849056, -251453152, -245508384, -238591344, -230725104, -221897344, -212102672, -201079632, -188643552, -175189568, --161430096, -147956784, -135404752, -124500368, -115428320, -107563160, -100188704, -93028992, -85878944, -78345576, --70234528, -61632780, -52467320, -42505680, -31803696, -20560008, -8610336, 4320737, 17988396, 31924492, -46197204, 61139932, 76425184, 91154776, 104847664, 117561848, 128919352, 137823360, 143591488, 146795008, -148332608, 148056112, 145138224, 139709920, 133072048, 125938104, 117463064, 106697192, 94169304, 81123880, -67869608, 53943716, 39527120, 25675314, 13233868, 2276333, -7464653, -16153372, -23796266, -30318712, --35788888, -40561672, -44957572, -48943300, -52537652, -56276420, -60665876, -65368328, -69496864, -72567768, --74776992, -76658720, -78807280, -81478752, -84098680, -85603528, -85559504, -84545360, -83402360, -82655568, --82548736, -82935280, -83151104, -82575576, -81216224, -79330728, -76860584, -73636680, -69632696, -64636572, --58252104, -50539416, -42062764, -33211908, -24143622, -15275051, -7023346, 731755, 8172249, 14932528, -20656646, 25547540, 29744796, 33010044, 35549980, 38117836, 40965936, 43895640, 47351476, 52045340, -58054536, 66093104, 78244104, 94179504, 107807440, 111929536, 106298832, 97620848, 92195232, }, -{ -2799245, -6461242, 4839355, -4228932, -10352482, -5557688, 2879239, 4031901, 4235375, 23969676, 69864624, -119191248, 140357376, 124462248, 88925688, 53108344, 20214264, -15939697, -56487948, -96248608, -131457136, --161556272, -184781840, -197673184, -199340176, -192308768, -178485952, -157262912, -128219808, -93059056, -53966264, --12078522, 31656594, 75794896, 119164408, 160668816, 197753184, 226699648, 245372560, 254762432, 257492416, -255849056, 251453152, 245508384, 238591344, 230725104, 221897344, 212102672, 201079632, 188643552, 175189568, -161430096, 147956784, 135404752, 124500368, 115428320, 107563160, 100188704, 93028992, 85878944, 78345576, -70234528, 61632780, 52467320, 42505680, 31803696, 20560008, 8610336, -4320737, -17988396, -31924492, --46197204, -61139932, -76425184, -91154776, -104847664, -117561848, -128919352, -137823360, -143591488, -146795008, --148332608, -148056112, -145138224, -139709920, -133072048, -125938104, -117463064, -106697192, -94169304, -81123880, --67869608, -53943716, -39527120, -25675314, -13233868, -2276333, 7464653, 16153372, 23796266, 30318712, -35788888, 40561672, 44957572, 48943300, 52537652, 56276420, 60665876, 65368328, 69496864, 72567768, -74776992, 76658720, 78807280, 81478752, 84098680, 85603528, 85559504, 84545360, 83402360, 82655568, -82548736, 82935280, 83151104, 82575576, 81216224, 79330728, 76860584, 73636680, 69632696, 64636572, -58252104, 50539416, 42062764, 33211908, 24143622, 15275051, 7023346, -731755, -8172249, -14932528, --20656646, -25547540, -29744796, -33010044, -35549980, -38117836, -40965936, -43895640, -47351476, -52045340, --58054536, -66093104, -78244104, -94179504, -107807440, -111929536, -106298832, -97620848, -92195232, }, -}, -{ -{ -4660577, --3761318, 2147484, 14144938, 1481764, -20578798, 3313031, 73286104, 106591424, 42097660, -72984920, --141153024, -127037080, -72848552, -26254598, 4194036, 29984240, 56193740, 80756656, 100364256, 110516488, -108207944, 95994128, 79020416, 60338920, 42405824, 28893856, 21281562, 17347910, 15633144, 17613660, -23518704, 29914984, 33616708, 35107064, 36514200, 38280508, 38737920, 35492536, 27007292, 13924821, --1247151, -16257525, -30282740, -43022152, -54204636, -64430416, -75067976, -86801824, -99237904, -111906984, --124563712, -136666928, -147541792, -156717984, -163421360, -166405824, -164998144, -159533872, -150274464, -136927312, --119659936, -99412920, -76727440, -51388208, -23609436, 5508833, 34976068, 64331632, 92863096, 119363048, -142796384, 162450688, 177512080, 187299232, 191844384, 191558768, 186469760, 176480736, 162277824, 145250432, -126342904, 105501576, 82560008, 58354648, 34439196, 11667279, -10382010, -32273458, -53592064, -73464344, --91631520, -108246600, -123020752, -135405824, -145302496, -152779504, -157352032, -158328064, -155697392, -150061328, --141810688, -130838664, -116973432, -100589208, -83070576, -66531192, -52418464, -40350144, -28921236, -17620104, --7400229, 453656, 5391795, 7756174, 8531953, 8819715, 9077950, 9011378, 8390755, 7570417, -7068980, 7218230, 8370355, 10827613, 14411226, 18627810, 23251880, 28213104, 33091112, 37315748, -40679244, 43155832, 44554380, 44824428, 44306344, 43304008, 41874320, 40254580, 38846904, 37594924, -36056788, 34188476, 32320702, 30408906, 28090696, 25396678, 22599582, 19570556, 16100222, 12525735, -9177808, 5531918, 844498, -4535486, -9188009, -11842299, -12232067, -11146514, -10013716, }, -{ --4660577, -3761318, -2147484, -14144938, -1481764, 20578798, -3313031, -73286104, -106591424, -42097660, 72984920, -141153024, 127037080, 72848552, 26254598, -4194036, -29984240, -56193740, -80756656, -100364256, -110516488, --108207944, -95994128, -79020416, -60338920, -42405824, -28893856, -21281562, -17347910, -15633144, -17613660, --23518704, -29914984, -33616708, -35107064, -36514200, -38280508, -38737920, -35492536, -27007292, -13924821, -1247151, 16257525, 30282740, 43022152, 54204636, 64430416, 75067976, 86801824, 99237904, 111906984, -124563712, 136666928, 147541792, 156717984, 163421360, 166405824, 164998144, 159533872, 150274464, 136927312, -119659936, 99412920, 76727440, 51388208, 23609436, -5508833, -34976068, -64331632, -92863096, -119363048, --142796384, -162450688, -177512080, -187299232, -191844384, -191558768, -186469760, -176480736, -162277824, -145250432, --126342904, -105501576, -82560008, -58354648, -34439196, -11667279, 10382010, 32273458, 53592064, 73464344, -91631520, 108246600, 123020752, 135405824, 145302496, 152779504, 157352032, 158328064, 155697392, 150061328, -141810688, 130838664, 116973432, 100589208, 83070576, 66531192, 52418464, 40350144, 28921236, 17620104, -7400229, -453656, -5391795, -7756174, -8531953, -8819715, -9077950, -9011378, -8390755, -7570417, --7068980, -7218230, -8370355, -10827613, -14411226, -18627810, -23251880, -28213104, -33091112, -37315748, --40679244, -43155832, -44554380, -44824428, -44306344, -43304008, -41874320, -40254580, -38846904, -37594924, --36056788, -34188476, -32320702, -30408906, -28090696, -25396678, -22599582, -19570556, -16100222, -12525735, --9177808, -5531918, -844498, 4535486, 9188009, 11842299, 12232067, 11146514, 10013716, }, -}, -{ -{ -5583995, -6041409, -3080565, -20302848, -31235686, -32544040, -36608152, -42584600, -22413286, 45768784, 140109344, -209438704, 222517424, 189292096, 136838736, 81594176, 28635084, -17463338, -52446920, -77622408, -97324496, --112847584, -122775936, -126743408, -125114008, -117037320, -102680320, -86526952, -75130256, -71197136, -71656160, --71568648, -68443528, -62621160, -55089400, -46113992, -35584340, -23645406, -10550587, 3620121, 18485002, -32754494, 44788456, 53966800, 61098056, 67329520, 73078328, 78128136, 82242720, 85336168, 87326352, -88121992, 87625920, 85643256, 81945832, 76552960, 69851200, 62433792, 54886996, 47670380, 41052908, -35170952, 30184494, 26330298, 23782844, 22596360, 22888418, 24982752, 29239064, 35748624, 44303124, -54699092, 67002028, 81370304, 97648768, 115331144, 134012640, 153588560, 173799616, 193838848, 212766768, -230137776, 245835872, 259442864, 270214656, 277666400, 281800320, 282770976, 280663776, 275530208, 267223200, -255219840, 239074528, 219228016, 197076192, 174036912, 150685168, 126931312, 103010496, 80224080, 60595548, -45620604, 35276712, 28341416, 23708756, 21281562, 21625160, 25003152, 30849676, 37976636, 45104672, -51291036, 56076168, 59363964, 61216704, 61680024, 60641180, 57775364, 52764748, 45659260, 36971616, -27376658, 17395692, 7320772, -2738042, -12794171, -22834730, -32721746, -42367168, -51954608, -61787400, --71921912, -82127288, -92180736, -102044128, -111806048, -121666224, -131924752, -142794784, -154210256, -165864128, --177331152, -188156608, -198022144, -206856896, -214596432, -220965328, -225850848, -229634192, -232688448, -235026512, --237125152, -239875536, -241617136, -236108848, -217380640, -188170576, -160260800, -143712288, -138218496, }, -{ -5583995, -6041409, -3080565, -20302848, -31235686, -32544040, -36608152, -42584600, -22413286, 45768784, 140109344, -209438704, 222517424, 189292096, 136838736, 81594176, 28635084, -17463338, -52446920, -77622408, -97324496, --112847584, -122775936, -126743408, -125114008, -117037320, -102680320, -86526952, -75130256, -71197136, -71656160, --71568648, -68443528, -62621160, -55089400, -46113992, -35584340, -23645406, -10550587, 3620121, 18485002, -32754494, 44788456, 53966800, 61098056, 67329520, 73078328, 78128136, 82242720, 85336168, 87326352, -88121992, 87625920, 85643256, 81945832, 76552960, 69851200, 62433792, 54886996, 47670380, 41052908, -35170952, 30184494, 26330298, 23782844, 22596360, 22888418, 24982752, 29239064, 35748624, 44303124, -54699092, 67002028, 81370304, 97648768, 115331144, 134012640, 153588560, 173799616, 193838848, 212766768, -230137776, 245835872, 259442864, 270214656, 277666400, 281800320, 282770976, 280663776, 275530208, 267223200, -255219840, 239074528, 219228016, 197076192, 174036912, 150685168, 126931312, 103010496, 80224080, 60595548, -45620604, 35276712, 28341416, 23708756, 21281562, 21625160, 25003152, 30849676, 37976636, 45104672, -51291036, 56076168, 59363964, 61216704, 61680024, 60641180, 57775364, 52764748, 45659260, 36971616, -27376658, 17395692, 7320772, -2738042, -12794171, -22834730, -32721746, -42367168, -51954608, -61787400, --71921912, -82127288, -92180736, -102044128, -111806048, -121666224, -131924752, -142794784, -154210256, -165864128, --177331152, -188156608, -198022144, -206856896, -214596432, -220965328, -225850848, -229634192, -232688448, -235026512, --237125152, -239875536, -241617136, -236108848, -217380640, -188170576, -160260800, -143712288, -138218496, }, -}, -{ -{ -19684372, --18938122, -61517892, -63736240, -8271570, 72348728, 113489680, 74640088, -16678969, -88281976, -95594696, --58876484, -25069188, -13101261, -11398306, -10298795, -11159399, -10371272, 700617, 18197240, 26725970, -21249350, 13889387, 15810311, 24522116, 32755032, 39345120, 46255724, 52015276, 53102440, 48347908, -39482560, 29595010, 21625698, 16104517, 10235444, 754304, -12858058, -28900298, -45485852, -60772176, --72917272, -81328424, -86918328, -90447720, -91846800, -91372744, -89939296, -88036632, -85586352, -82835960, --80242336, -77655160, -74635256, -71230424, -67602784, -63391568, -58213448, -52345452, -46373300, -40633612, --35352948, -30884036, -27565636, -25581362, -24846922, -24860344, -25043954, -25381646, -26145076, -26930518, --26805964, -25485800, -23373748, -20323248, -15362024, -7809325, 2206003, 14413910, 28803124, 45313516, -63640140, 83214456, 103157600, 122722784, 141861152, 160564128, 177722528, 191942096, 203639424, 214783792, -226025344, 235433472, 240735600, 241693920, 239550720, 234954576, 227198944, 215266448, 199234944, 180485808, -160333808, 138645296, 114415248, 87663504, 59999084, 33190434, 7822209, -16640314, -41058812, -65774740, --89928560, -111802296, -130274408, -145634288, -158692064, -169711344, -178538032, -185078736, -189296384, -191343472, --191866928, -191587216, -190608496, -188735888, -186197568, -183412288, -180362320, -176743808, -172246976, -166363408, --158708704, -149891680, -141210464, -133262632, -125681480, -118111600, -110336640, -101760120, -92072288, -82134272, --73056856, -64893736, -57217016, -50053548, -43236900, -35970352, -28012314, -20119774, -12702903, -5408975, -1946157, 9951976, 20522428, 34193844, 46772732, 52321292, 49926848, 44465260, 40865540, }, -{ -19684372, --18938122, -61517892, -63736240, -8271570, 72348728, 113489680, 74640088, -16678969, -88281976, -95594696, --58876484, -25069188, -13101261, -11398306, -10298795, -11159399, -10371272, 700617, 18197240, 26725970, -21249350, 13889387, 15810311, 24522116, 32755032, 39345120, 46255724, 52015276, 53102440, 48347908, -39482560, 29595010, 21625698, 16104517, 10235444, 754304, -12858058, -28900298, -45485852, -60772176, --72917272, -81328424, -86918328, -90447720, -91846800, -91372744, -89939296, -88036632, -85586352, -82835960, --80242336, -77655160, -74635256, -71230424, -67602784, -63391568, -58213448, -52345452, -46373300, -40633612, --35352948, -30884036, -27565636, -25581362, -24846922, -24860344, -25043954, -25381646, -26145076, -26930518, --26805964, -25485800, -23373748, -20323248, -15362024, -7809325, 2206003, 14413910, 28803124, 45313516, -63640140, 83214456, 103157600, 122722784, 141861152, 160564128, 177722528, 191942096, 203639424, 214783792, -226025344, 235433472, 240735600, 241693920, 239550720, 234954576, 227198944, 215266448, 199234944, 180485808, -160333808, 138645296, 114415248, 87663504, 59999084, 33190434, 7822209, -16640314, -41058812, -65774740, --89928560, -111802296, -130274408, -145634288, -158692064, -169711344, -178538032, -185078736, -189296384, -191343472, --191866928, -191587216, -190608496, -188735888, -186197568, -183412288, -180362320, -176743808, -172246976, -166363408, --158708704, -149891680, -141210464, -133262632, -125681480, -118111600, -110336640, -101760120, -92072288, -82134272, --73056856, -64893736, -57217016, -50053548, -43236900, -35970352, -28012314, -20119774, -12702903, -5408975, -1946157, 9951976, 20522428, 34193844, 46772732, 52321292, 49926848, 44465260, 40865540, }, -}, -{ -{ --4806606, -34484292, 50781008, 2425046, -86674048, -166787536, -205533520, -182588720, -85410792, 64405720, 208520656, -300475360, 340926976, 350482208, 329967296, 269087744, 178262624, 86645600, 12090870, -50222128, -110979808, --171388528, -225137360, -266773296, -295754144, -315900736, -331757248, -344317312, -350935328, -349396672, -340069600, --323986560, -301317184, -272422272, -238630528, -201435040, -162035152, -121752656, -82081656, -44427140, -10092099, -20141250, 46730316, 70864816, 92928056, 112154480, 127839168, 140086256, 149456816, 156754496, 163096544, -169343584, 175382304, 180445536, 183991568, 185883504, 186037584, 184385632, 181076352, 176431888, 170794736, -164455376, 157568384, 150151520, 142288512, 134180680, 125905896, 117439976, 108993920, 100966088, 93464928, -86296632, 79501992, 73397232, 68001144, 62971200, 58250492, 54280872, 51367808, 49206368, 47202764, -44977972, 42429980, 39519604, 36159868, 32329292, 28316182, 24769076, 22302154, 21023328, 20614770, -20861194, 21843666, 23497766, 25089052, 25243670, 22639310, 16850768, 8513699, -1527398, -13176960, --26892938, -42536284, -58801324, -73973296, -87047176, -97999880, -107164264, -114483960, -119359288, -121201832, --120134528, -117048056, -112938848, -108273976, -102973448, -96818760, -89862528, -82618528, -75885632, -70222176, --65500936, -61007864, -55974160, -50059992, -43510704, -36910948, -30680026, -24768002, -18874234, -12800613, --6443525, 330712, 7516193, 14854681, 22147536, 29458644, 36832028, 44115756, 51270636, 58440008, -65514356, 72052368, 77784544, 82687784, 86508696, 88865024, 89862528, 89898496, 88920320, 86700896, -83516712, 79278656, 72248864, 60511796, 45328012, 31496606, 23372138, 21165598, 21604760, }, -{ --4806606, -34484292, 50781008, 2425046, -86674048, -166787536, -205533520, -182588720, -85410792, 64405720, 208520656, -300475360, 340926976, 350482208, 329967296, 269087744, 178262624, 86645600, 12090870, -50222128, -110979808, --171388528, -225137360, -266773296, -295754144, -315900736, -331757248, -344317312, -350935328, -349396672, -340069600, --323986560, -301317184, -272422272, -238630528, -201435040, -162035152, -121752656, -82081656, -44427140, -10092099, -20141250, 46730316, 70864816, 92928056, 112154480, 127839168, 140086256, 149456816, 156754496, 163096544, -169343584, 175382304, 180445536, 183991568, 185883504, 186037584, 184385632, 181076352, 176431888, 170794736, -164455376, 157568384, 150151520, 142288512, 134180680, 125905896, 117439976, 108993920, 100966088, 93464928, -86296632, 79501992, 73397232, 68001144, 62971200, 58250492, 54280872, 51367808, 49206368, 47202764, -44977972, 42429980, 39519604, 36159868, 32329292, 28316182, 24769076, 22302154, 21023328, 20614770, -20861194, 21843666, 23497766, 25089052, 25243670, 22639310, 16850768, 8513699, -1527398, -13176960, --26892938, -42536284, -58801324, -73973296, -87047176, -97999880, -107164264, -114483960, -119359288, -121201832, --120134528, -117048056, -112938848, -108273976, -102973448, -96818760, -89862528, -82618528, -75885632, -70222176, --65500936, -61007864, -55974160, -50059992, -43510704, -36910948, -30680026, -24768002, -18874234, -12800613, --6443525, 330712, 7516193, 14854681, 22147536, 29458644, 36832028, 44115756, 51270636, 58440008, -65514356, 72052368, 77784544, 82687784, 86508696, 88865024, 89862528, 89898496, 88920320, 86700896, -83516712, 79278656, 72248864, 60511796, 45328012, 31496606, 23372138, 21165598, 21604760, }, -}, +const Word16 CRendBin_Combined_BRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]={{22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22} }; +const Word16 CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {40, 40}; +const Word16 CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]={{{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240},{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240}},{{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240},{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240}},{{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240},{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240}},{{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240},{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240}},{{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240},{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240}},{{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240},{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240}},{{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240},{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240}},{{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240},{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240}},{{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240},{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240}},{{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240},{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240}},{{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240},{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240}},{{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240},{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240}},{{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240},{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240}},{{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240},{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240}},{{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240},{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240}}}; +const Word16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz = 98; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_Q_48kHz_fx = 15; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{7346, 7453, 7924, 6788, 7146, 7305, 7607, 8133, 8168, 8572, 8070, 9148, 9362, 8603, 8908},{7346, 7453, 7924, 6788, 7146, 7305, 7607, 8133, 8168, 8572, 8070, 9148, 9362, 8603, 8908}}; +const Word16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]={{47, 47, 47, 47, 47, 47, 51, 51, 58, 58, 58, 65, 65, 65, 65, 65, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 91, 91, 93, 93, 93, 98},{47, 47, 47, 47, 47, 47, 51, 51, 58, 58, 58, 65, 65, 65, 65, 65, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 91, 91, 93, 93, 93, 98}}; +const Word16 CRendBin_Combined_BRIR_coeff_Q_48kHz_fx = 14; +const Word16 CRendBin_Combined_BRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955]={ + { + {-149, 153, -57, 0, 143, -82, 56, -10, 20, -97, -204, -42, 80, -52, 49, 71, 60, -45, 34, -126, -23, 32, 52, -4, -3, 16, 31, -105, -88, 37, 73, -36, 76, 146, -196, 28, -94, -63, 44, -24, 120, -37, 108, 57, 17, -7, 58, 4, -12, -61, 176, -122, -37, 62, 68, -3, -60, 34, -66, 69, 13, 25, -2, -23, -22, 92, -235, 56, -31, -136, -24, 115, 55, 72, -103, 83, -36, 53, 31, 41, -44, 18, 61, -40, -92, 38, -86, 17, 62, 1, -31, -35, 16, 34, -15, 41, + 1, 30, 24, -10, -7, 12, -14, -7, -11, 12, -19, 10, -28, -6, -26, -3, -9, -28, -7, 14, -271, 215, -100, 50, 42, 9, -56, -3, -152, -189, 54, -34, 62, 63, 174, -139, 23, 120, 116, -112, -120, -62, -104, 12, -33, -80, -61, 3, -191, -182, -37, 40, -15, 18, -20, 45, -100, 120, -39, 70, -12, 50, -91, 34, 66, 81, 36, 18, 30, -30, -75, 159, 120, 52, -56, 197, 133, -52, 125, -7, -94, -21, -33, -83, 58, 67, 33, -63, 139, -88, 82, 119, -20, 15, -168, -73, + -181, 30, 89, -85, -24, 37, -81, -20, 43, -2, 31, -16, -42, -118, -57, -18, -27, -7, 0, 11, -13, -17, -42, -17, 4, 13, 12, -21, -2, 3, 9, -2, 9, 1, 15, 2, -19, -33, -35, 0, -20, -26, 7, 230, 105, -88, 39, 30, 366, -107, 105, 179, -34, 163, 66, 111, -145, -53, -170, -78, 114, -3, -81, 20, -119, -9, -78, 109, -48, -14, -43, 59, 25, 2, -14, 48, -179, -137, 61, 17, -18, -90, 212, 62, -28, 71, 84, 1, 41, 21, -106, 96, -126, -94, 112, -133, + 115, 53, -102, 174, 93, 68, -48, 158, 36, -20, -47, 49, 17, -26, -187, -26, -37, 58, -110, 148, -52, 122, -127, 6, -15, 151, -71, -48, 26, 57, -3, 31, -24, -137, -17, -8, -9, -17, -4, 2, -20, -25, -30, -31, 1, -11, -1, 20, -25, 16, 17, 42, -51, 34, 13, 27, -5, 39, 13, -17, -32, -7, -16, 382, -316, -278, -89, 293, -40, -158, 201, -133, 95, -7, -217, -148, 184, -118, 91, -124, 122, -53, -33, -13, -120, 64, 88, -120, 30, -61, 25, 56, -17, 80, 24, 65, + 103, -131, -96, 120, 7, 93, 90, -83, -124, -49, 22, 165, -176, 74, -197, -239, -56, -136, -23, -162, -309, -163, 144, 136, 88, -102, 297, -90, 50, -163, -154, 42, 0, -14, -195, -62, -11, -38, -38, -104, -84, 23, -27, -56, 7, -101, 19, 59, 102, 58, -85, 92, -59, -4, 101, 44, 15, -32, 52, 61, 47, 12, -26, 10, 72, 39, 46, 21, -27, 40, 7, -3, 11, -19, 7, 12, -21, 41, 59, 71, -5, -4, 10, -43, 64, -3, 40, -8, 488, -161, 228, -62, 306, -60, -49, 51, + 61, -53, -355, 34, -36, -95, -7, -17, 124, -41, 299, -40, 32, -22, 168, -34, 57, -141, -7, -97, -103, -29, -31, 1, 107, -193, -60, 66, -25, 134, 28, -34, -91, -88, -97, -177, 64, 75, 63, -308, -48, 218, 119, -49, -13, -95, -215, -224, 220, -69, -154, -84, 118, 97, 8, 109, 41, 105, -55, -220, -78, -99, -116, 162, 103, -18, 177, 270, -68, 114, -108, -13, -2, 118, -13, 30, 23, 37, 90, -93, 70, -48, 4, -59, 7, 31, 63, 48, -5, 17, 1, -7, 31, -87, -16, -70, + 13, -13, -14, -31, -22, -36, 36, 18, -731, 403, 147, -33, -32, 2, -111, -203, -44, 100, 310, 209, -282, -53, -168, 115, -14, -381, -112, 235, 145, 81, 199, 121, -20, -24, 59, -145, -85, 34, 174, -72, -145, -210, -106, 106, 342, 24, -59, 73, -70, -252, 19, -178, -140, -166, 104, -9, -236, 45, 91, 94, -256, -142, -95, -63, -27, -94, -45, -122, -248, -28, -211, -253, -157, -44, 44, -151, -222, 66, 180, -9, -32, -21, 131, -194, 146, 230, 224, 177, 301, 4, -123, 81, 14, -31, -27, 1, + -68, 100, 6, 8, -60, -16, 33, 38, -35, -32, 20, 103, -13, 40, 35, 88, -70, 5, -1, -79, 13, 12, 68, 8, 15, 58, 37, -98, 38, -35, 32, -302, 115, -149, -25, 40, 90, -12, 157, 4, -31, -424, 198, -78, -89, 153, -245, -338, 139, -118, -158, -50, 306, 193, -111, -66, 143, -42, -14, 41, 140, 255, 163, 206, -31, -9, 6, -136, 36, -57, 348, -265, -153, -140, -130, 84, 48, 124, -20, -175, -234, -68, -291, -407, -81, 11, 317, 63, -250, -64, 238, -100, 80, 71, 134, -188, + -281, -125, -143, 456, 52, -146, 100, 76, -33, 57, 105, -13, 203, -268, -239, 78, -110, 243, -111, -6, 132, -40, 117, -7, -5, -8, -38, -5, 105, 38, 102, 57, 52, 3, -36, -17, 44, -14, 14, -21, 74, -61, 44, -54, 75, -70, 8, -7, -6, 52, 70, -74, 53, 28, -23, 107, 258, 79, -25, 177, -37, -227, -45, -23, 218, -128, -33, -71, 33, -71, 10, 69, 101, 148, 95, 45, 385, 150, 124, -19, -309, 17, -258, 75, -176, 39, -3, 96, 474, 133, -78, 169, -139, 143, -87, 246, + -140, -4, -191, 111, 186, -225, 445, -113, 29, -72, -124, 45, -138, -387, 62, -99, -25, -240, 53, -87, -399, -182, -114, -353, 196, 501, 608, -585, -448, -249, 22, 142, -183, 81, -207, 51, 279, 433, -303, 485, 153, 55, 80, 85, -111, 165, 151, 184, 141, 58, 214, -1, 66, -6, -3, 115, -37, -145, -41, 91, 70, 27, -4, -11, -15, 91, 72, 31, -86, 19, 21, -1, 98, 41, 60, -3, 72, 41, 73, 103, 107, 5, 2, -57, 118, 105, -15, -35, 10, 75, -31, 216, -419, 598, 8, 348, + 123, -128, -133, 322, -197, 202, 250, -37, -184, 6, 258, 144, 130, 113, -28, 38, 84, 330, 230, -182, -157, -31, -82, -41, -180, -121, 163, 290, 70, 440, -129, 482, 17, 225, 530, 375, 116, 105, 237, -57, -221, -5, 222, -135, -253, 5, -45, 485, 388, -9, 548, -53, 292, 153, 230, -35, -196, 244, -56, 286, 193, 610, -349, -63, -699, 144, -346, -50, 313, -134, 125, -61, 367, -102, -266, -23, -94, 108, -23, 177, 206, 53, -62, 165, -43, 69, -5, -115, 70, 75, 141, 74, 159, 71, -9, 3, + -57, -1, 156, -61, -128, 67, -15, 21, 126, 28, 26, 53, 82, -30, -23, 56, 101, 171, 152, -3, 69, -1, -14, 73, 105, 95, -60, 0, -24, 126, 18, -26, 15, -402, -295, 144, -239, 135, -145, 39, 368, -64, -350, 93, -148, 354, -374, -261, 150, 170, 258, 8, -27, 166, -104, -256, 156, -106, -205, 60, 197, -147, 372, 150, -16, 48, 181, 79, -641, 260, -68, -69, -113, 339, -1, 361, 12, 31, 37, -97, -42, 175, -208, 48, 578, 50, 424, 32, -90, -48, -291, -598, -438, 197, 271, -119, + 454, 195, -330, -191, 415, 297, 274, 85, -132, 3, -26, -258, -83, -151, -706, -303, -20, 472, 102, -109, 47, 405, -104, 20, -1, 103, -137, -64, -103, -57, -39, 97, -9, -17, -10, 76, 57, 119, -88, -131, 43, -139, -81, 18, 46, 17, -29, 146, -72, -43, -173, 65, -157, 121, 48, 81, -134, 13, -27, 64, -79, 50, -72, 82, -148, 7, -173, 186, 175, 380, 143, 126, 436, 364, 304, 10, 112, 21, -73, -88, 70, -37, -265, 55, 256, -5, -77, 77, -644, 211, -258, 157, 215, 194, -243, 127, + -27, -8, 378, 276, 1, 146, 108, -54, -219, 51, 183, 1, 269, 79, 243, 481, 23, 193, 204, 257, -13, -168, 415, -164, 335, -399, -329, 455, -25, 149, 267, 397, 514, 216, 69, -254, 111, -53, -464, 390, 242, -379, -24, 22, -475, 157, 374, 221, -5, 143, 101, -222, 410, 38, -83, 211, 405, 158, -18, -144, -113, -50, 68, 113, 167, 53, 27, 51, 195, 174, 217, -4, -25, 85, 185, -1, 16, -39, 85, 14, -23, -72, 43, -136, -242, -12, 134, -5, 94, -116, 72, 4, 82, 12, -67, 53, + -45, -37, -17, -147, 102, -55, 41, 80, 2, -22, -69, -95, -22, -1063, -661, 216, 227, 437, 723, -199, -113, -230, -213, -271, -291, 24, 117, 92, 456, 20, 448, -22, 154, 208, 159, 334, 237, 17, 293, -3, -35, -168, 198, -26, -437, -377, 237, -54, 521, 312, 335, 125, -656, 159, 412, -62, 119, -100, 81, 519, -19, 435, 723, 42, -274, -7, 7, -453, 614, 294, -82, -34, 444, 211, -540, -438, 172, -190, 257, 187, 81, -213, -384, -17, 96, 73, 414, -556, 81, -37, -473, -224, -475, 415, -142, 574, + -451, 43, -218, 326, 141, -140, -28, 301, 18, 95, -175, -91, -148, 267, 131, 0, 70, 81, -245, 18, -69, 87, 50, -52, -250, -86, -185, 221, -164, 37, -45, 219, -47, -37, -78, -134, -9, -88, 86, 242, 208, -13, -220, 280, 754, -898, -251, -438, -18, 142, 24, 602, -621, 294, -85, 120, -75, 330, -182, -308, -26, -90, 234, -20, 158, 350, -73, -263, -35, 394, -232, 94, 89, 15, -36, 391, -15, -101, -653, 210, -161, -413, -359, -96, -398, -235, -345, 164, -408, 407, -374, 252, -193, 493, -478, -278, + -72, 286, 118, 2, -196, -392, 40, 153, 559, 293, 122, -320, 191, -284, -320, 279, -310, 148, 363, 302, -80, -116, -261, 436, 43, 417, 675, -132, -354, -158, -117, -243, 107, -404, 176, 131, 122, 319, -225, 11, -41, 80, 291, 8, 229, -83, -5, 28, -129, -47, 138, 72, -184, -242, -114, 106, 96, -107, 346, 101, -252, 127, 185, 459, 374, 209, 78, 44, -192, -152, -6, -154, 30, -89, -281, 155, -92, -40, 34, 153, 5, -130, 488, 680, -744, 526, 363, 7, 258, 908, -270, -276, 75, 259, 370, 115, + -371, 395, -161, 801, -33, -145, 251, 202, 199, -20, 750, -644, 143, -23, 197, -275, -539, 251, 195, 203, -196, -151, 625, 228, 789, 62, -308, -43, 166, -80, 820, -115, 441, -91, 734, 261, 189, -192, -54, 400, -4, 429, 320, 378, -528, 72, 357, 433, 319, 243, 585, 722, -570, -77, 1101, -278, -313, 710, 960, 8, -21, -536, -444, -38, 476, -81, -104, 12, -49, -145, -386, -146, -40, -231, 4, 217, -138, 280, -305, 246, -71, 213, -231, -2, 154, 87, 271, -59, -160, -75, 73, 249, 66, -101, 346, -120, + 177, 180, -43, -49, -91, 511, -200, 58, 123, 185, -104, -346, -205, -67, 383, 182, -39, 15, 130, -34, -5, 131, 65, 27, -6, 305, 687, -42, 214, -587, 558, -298, -184, -514, -335, 1053, 13, -742, -332, -22, 1, -98, 813, 380, -71, -341, -34, 214, -103, 1085, 228, 477, 162, -245, -617, 144, -10, 96, -479, -51, -324, 366, -1, 60, 377, -344, -255, 75, 13, 113, -529, -413, -904, -471, 35, -515, 65, -374, -227, 669, 206, -325, 196, 76, -7, 644, -115, 780, 294, -336, -956, 166, 147, 527, -290, -684, + -249, 198, 29, -163, -497, -158, -701, -792, 242, -44, 806, -260, -501, -430, -46, 574, -37, 212, 362, 282, -133, 187, 245, 84, 251, 254, -186, -26, 354, -71, 43, 344, -73, 205, -261, 100, 190, -115, 110, 114, -245, 316, -306, 153, 150, 251, -71, -171, 327, -43, 240, -358, -184, -262, -231, 34, -192, 138, 9, 58, -369, 41, -112, 501, -541, -26, 839, -172, 254, 93, 118, -773, 655, -58, -617, -359, 335, -87, 172, 2, -251, -187, 120, -187, -37, -5, -897, -231, -599, 140, 224, 0, -259, 113, -120, 361, + -793, 59, 148, 464, -341, 432, -335, 277, 81, 338, -515, 165, -251, -551, 370, -445, -896, 138, -76, 718, -336, 105, 336, 478, 544, 63, -175, -332, 19, 260, 361, -699, 798, -1, -524, -393, -701, 294, 181, 288, 133, 758, -259, 823, -435, 197, -172, -374, -1130, 648, 132, -296, -765, -39, 152, -61, 292, -203, -240, -35, 129, -211, -205, -131, -31, 126, -59, -63, -298, 233, 16, -162, 149, -116, 245, -67, 127, 163, 301, -95, 274, 36, 24, -281, -216, 76, 117, 46, 24, -49, -179, -98, -80, -199, -85, 364, + -170, -197, 121, -441, 8, -111, -669, -2, 371, -146, -725, -115, -1060, 515, -1172, 701, -810, -707, 202, 608, 454, -402, 426, 765, 136, 115, 180, 70, -450, 549, -920, -571, 52, -56, -59, -121, -229, 124, 847, 220, 118, 80, -398, 493, -89, -851, -131, 19, 18, -582, -412, 450, -146, 771, 143, 2, -626, -342, 231, 101, -171, 661, -522, -316, -23, -37, 622, 52, 728, 2, -595, 150, -508, 388, -72, 528, 996, -1531, 522, 214, 280, 582, 143, -701, -164, -62, -128, 362, -721, 71, -189, -100, -497, -264, -751, 86, + -48, 80, 206, -302, -56, 368, -225, 75, -126, -367, 171, 227, -260, -24, -411, -20, -594, 217, 144, -70, 62, -146, 23, 125, -97, -107, 337, 418, -95, 142, 65, 429, 187, -530, 69, 312, -177, 315, 98, 138, 1254, 1083, -311, -420, -26, -826, 481, -48, 181, 63, -418, 1251, -539, -2209, -324, 440, -1487, -255, 464, -1260, 174, 819, -580, 817, -786, 702, 871, -557, 236, -81, 18, -237, -346, -64, 536, -347, -577, -315, -464, -50, -365, -60, 191, -87, 523, -463, -569, 452, -602, -892, -1144, -399, -28, 222, 636, -267, + 285, 298, -210, -99, 1049, -695, -28, 718, 222, 564, -142, 205, 796, 409, -44, -98, -492, 201, 801, -746, 566, -738, 215, 1042, 240, -586, 593, 94, -375, -293, 717, 236, 309, -44, 54, 197, 235, -22, -72, 305, 266, 56, -355, 390, 48, -135, 96, 134, -258, -69, 199, 38, 332, -410, 616, 478, -85, -391, -159, 411, 470, 758, -23, 146, 124, 416, -632, -337, 634, 397, 43, -102, 55, 175, -331, -260, -223, 47, 202, -102, -1, 330, -352, -250, 1109, 754, -1056, -208, 956, -283, -581, -409, -583, -342, 965, 591, + -71, 441, -98, 537, -327, -179, 1072, -437, 199, -302, -108, -6, 298, 872, 341, -581, -165, -21, -82, 494, 72, 878, -250, 157, -83, 260, -724, 445, -668, 463, -28, 676, -168, 503, -222, 162, 293, -284, 303, 683, 853, -442, 874, 370, 1036, -290, 202, -33, -119, -192, -63, -335, -1677, -1056, -318, -16, 247, 124, 398, 640, -919, -47, -366, 1408, -90, -423, -113, -1227, -1022, 1556, 640, 351, -230, 490, 49, -1124, 240, 80, -420, -436, 81, 10, 130, -233, -110, -549, -457, 201, 256, 217, 175, -285, -411, -255, -535, 348, + 129, -969, -104, -280, -56, 477, -436, -627, -126, 408, 150, -435, 273, 563, -1032, -280, 385, -18, -66, -199, -28, 182, 327, 74, -130, 832, -1211, 1134, -335, -343, 290, 526, -949, -193, 14, 186, 48, -30, 472, -291, 58, 246, 274, 392, 325, 106, -522, -108, 704, -690, -589, 728, 247, 513, 798, 1237, -284, -793, 1047, -428, -180, 1090, 341, -406, -1144, -758, -117, -426, 535, 1074, 550, -375, 1105, 368, -403, 301, 1234, 353, 238, -266, -992, -1334, -1058, -81, 799, 240, 505, 1890, 932, -1139, -765, 498, -1571, -726, 1353, 478, + -1745, -1461, -676, -1120, -1048, -632, 948, -276, -200, 2471, 416, -719, -198, -776, 1316, -283, 285, 85, 18, -727, -279, -63, -366, 80, 282, 638, 83, -445, -19, -9, -289, 126, 187, 211, -572, 139, -530, 85, 277, -39, 422, -110, -28, 419, -88, 231, 474, -169, 141, 319, 356, 284, 59, 65, 248, -271, -101, 161, 468, -1693, 1171, 502, 378, 470, -183, 577, 473, 676, -130, 928, -586, 704, -259, -542, -173, -887, 90, -327, 311, -226, -345, 848, -979, 628, -36, -427, -173, 375, 423, 306, 802, 647, -469, -99, -420, 360, + -372, 280, 384, 176, 214, 143, -233, 886, -87, 262, 85, 408, 223, -1063, 65, -637, 158, 467, -91, -451, -416, 988, -1050, -847, 1549, -661, 398, 153, 494, -236, 257, -1082, 69, 1049, -567, -426, 900, -63, -755, -557, 329, -295, -179, 560, -419, 139, 694, -789, 47, 460, -261, -158, -211, 283, 73, 114, -109, 161, 116, -155, 7, 27, 412, 210, -397, 478, 114, -244, 134, 146, -49, -143, 338, 0, 110, 43, 438, -206, -173, 269, -404, 502, -43, -283, -52, -30, 55, -5, -198, -29, 256, 537, -995, -4054, -4374, -154, + -2507, 2230, 8046, 3510, 4855, 6130, -2308, -1630, -646, -5495, -3842, -1242, -6027, -2623, -532, -2460, 593, 5668, 5149, 5573, 7221, 4354, -386, 1628, -1612, -6414, -3483, -2575, -5329, -3651, 209, -4101, -1347, 913, -4099, -2098, 3075, 1198, 3335, 8301, 6748, 5459, 9815, 7127, -116, 1031, -1829, -8784, -8398, -8661, -13497, -9139, -5648, -5527, 70, 4390, 4942, 6926, 10481, 9702, 8190, 8088, 4632, 1633, 261, -492, -3669, -6316, -7758, -8304, -11216, -9322, -7190, -3515, 3763, 11105, 10341, 11333, 7947, 974, -1077, -3396, -4673, -3156, -1549, -1560, -691, -713, -1137, 13, 166, 830, 2584, 2349, 1730, 2380, + -224, -1531, -206, -1799, -1559, 970, 1047, 245, 240, -2744, -7026, -6651, -5666, -4267, 2078, 6412, 7839, 9904, 8876, 5477, 3800, 1351, -1578, -3305, -3946, -5114, -6279, -7079, -8270, -7352, -2545, 1809, 4256, 5520, 5997, 4501, 3120, 1563, -63, -185, 756, 1212, 1324, 1440, 1188, 87, -1022, -2181, -3885, -3747, -3052, -2552, -1431, -216, 719, 1032, 1088, 685, 426, 620, 984, 1382, 1879, 2234, 2153, 1568, 782, -173, -879, -1160, -1541, -1930, -1907, -1477, -1127, -814, -617, -371, 75, 660, 987, 908, 846, 726, 424, 360, 303, 128, 264, 533, 501, 445, 458, 102, -328, -611, + -1030, -1239, -1047, -805, -581, -84, 238, 342, 448, 336, 132, 143, 327, 399, 621, 679, 577, 469, 184, -208, -543, -727, -783, -692, -463, -164, 106, 232, 253, 190, 144, 132, 133, 117, 90, 41, -4, -35, -50, -48, -36, -19, -8 }, + {-236, 116, -269, 54, 21, 18, -183, -64, 52, -39, 61, 97, 59, -2, 77, -207, 6, -7, -4, 115, 175, -181, -40, -110, -35, 66, 120, 20, 31, -44, -58, -48, -36, -82, 46, -83, -55, 96, -80, 69, 12, -205, -69, -113, -26, 88, -60, -17, -59, -61, -42, 86, 131, 25, 73, 58, -68, -130, 71, 58, -27, -112, -93, 85, 18, 64, 31, -173, -56, -64, 97, 39, -173, 46, -91, -28, -8, -63, 51, -57, 15, 67, 70, 43, 48, 31, -4, 34, 42, 4, -33, 47, 11, 1, -13, -31, + 16, 30, 7, 25, -8, -15, 1, -24, 27, -4, 32, -5, 7, -3, 29, 15, 0, -12, 19, -13, -337, 220, -162, 20, -23, -63, 168, -151, -101, -2, 177, -69, -12, -21, 146, -91, -240, -55, -124, -168, 4, -15, 26, 94, 156, 97, 13, 240, 92, 6, 171, 179, -17, -99, 5, 78, 62, -3, -37, -142, -126, -63, 137, 56, 237, 133, -13, 78, 95, 31, -151, 159, -66, 82, -9, 49, -179, -30, -59, 61, -56, -68, 182, -14, -141, 53, -108, 85, -62, 137, 117, 131, 42, -129, 68, -21, + 67, -57, 17, 180, -73, 87, 117, -19, 5, -7, -24, -50, 28, -4, 43, -2, 34, 1, 0, 25, 42, 17, 40, 46, -12, -36, 59, 5, -4, 4, 35, -11, -36, 17, -11, 9, -1, 36, 9, 19, 9, -32, 67, 76, 4, -65, 71, 28, 22, 34, -264, 86, -168, 28, 55, 58, -77, 141, 23, -52, -24, 164, 118, -71, -91, -75, 64, 117, -70, -77, 23, -300, 0, -128, -50, -127, -167, -20, 153, 42, -136, -36, 131, 39, -83, 147, -64, -206, -61, 115, -51, 137, 262, 211, 30, -3, + 74, -32, -154, 2, 59, -111, 94, -219, -32, 13, -92, -72, 96, 191, -149, -156, 98, 97, 180, 58, -104, 143, 125, -42, 139, -153, 155, 37, 106, 21, -82, -48, -14, 34, 4, -76, 27, 0, -43, -37, 11, -12, 35, 1, 57, -41, -29, -3, 8, 48, -24, -49, 23, 1, -9, 33, -6, 19, -21, 20, 31, 3, 49, 451, -176, -78, -29, 325, -33, 245, -179, 216, -215, -189, 45, 102, -127, -32, 64, -17, 84, -131, 150, 54, -162, -7, 64, 50, 28, 306, 243, 190, -1, 123, 11, 35, + 91, -283, -44, 172, 111, 133, -4, -50, 62, -12, 345, -53, 58, 34, 16, -103, 206, -24, 215, -119, -125, 89, -83, -288, -133, 57, -28, -206, 57, 0, 267, 23, 23, -82, 97, 98, -22, -16, 234, 172, 171, -114, -162, -141, -276, 23, -195, -66, 12, -107, -122, -68, -14, -42, 64, 121, -23, -14, -55, 28, -40, -46, 19, 33, 0, 43, -25, 1, -24, -16, -14, 25, -15, -15, -9, -39, -45, 3, -5, -54, 45, 46, 55, -1, -39, -23, 43, 12, 334, -261, -4, -273, -178, -105, 241, 142, + -330, -452, -172, 162, 116, -66, 158, 4, -36, 20, -236, 74, -29, 22, 78, 18, 2, 102, 90, -156, -156, 183, -55, -87, 113, -308, 77, 67, -284, 106, 299, 182, 206, 44, 115, 283, 55, 56, -320, 172, 246, 201, 41, 204, -227, 229, -65, -224, -346, -1, -219, -177, -74, -210, -527, 25, 30, -16, 85, 263, 101, 107, 72, -187, 31, 91, 79, 69, 80, -192, -55, -243, -107, -15, 60, -87, 90, 20, 19, -59, -7, -30, 4, -33, 36, 13, 28, -7, -41, -35, -33, 40, 28, 2, -14, -32, + -33, -33, -106, 19, 19, -81, -40, -28, -715, 353, 46, -277, 68, -30, -81, -56, -157, 85, -80, 17, 104, 96, 311, -125, -296, 162, -375, -161, 62, 52, 43, 122, 151, 131, -2, 173, 12, -68, 229, 142, -69, 137, -236, 447, 17, 84, -42, -383, -66, -142, -134, 60, 320, 10, 14, -40, -88, -206, 66, -33, 115, -260, 88, 140, 61, -192, -68, 52, 25, 157, 31, 544, -155, -230, -263, -79, 6, 195, -262, -33, -112, 121, -382, -16, -104, -159, 48, -45, 104, -12, 192, 123, -1, 42, 15, 25, + 222, 28, 159, 59, -40, 6, 6, 47, -29, 25, -9, 69, 12, -49, -73, 61, -28, -85, -39, -44, -20, -25, -2, 110, 2, 32, 13, 46, -43, -22, -79, -87, 328, -100, -73, 74, 100, -257, -259, -237, -222, -366, 238, -212, 70, 94, 341, -52, -76, 268, 65, 59, -305, -199, 156, 70, 125, 186, -322, 8, 143, 315, 1, 33, -43, 4, -209, -36, -62, -392, -28, 125, -223, 101, -243, 2, -167, -31, -49, 26, 323, -89, 8, 167, -87, 99, -261, -468, -252, -139, -63, 54, 319, -145, 88, 80, + -223, 80, -171, -58, 119, 323, -45, -14, 106, -4, -296, -281, -116, 287, -31, -422, 34, -276, -120, -55, -26, 98, -104, -29, 109, -27, 128, 111, 81, -47, 125, -105, -78, -74, 22, -10, -20, -23, -18, -35, 28, -7, 82, -51, -31, 36, -44, -25, -120, -146, -10, 15, 76, 13, 47, 6, 312, 328, -104, 28, 344, -355, -317, 263, -66, 34, 238, -50, -69, 238, -449, 188, -23, 73, 214, 221, -253, 45, -346, 103, -106, -39, -242, -14, -345, 31, -300, 206, -107, 37, 367, 170, 162, -297, 51, 341, + -85, -490, 258, -61, 44, -98, -230, 320, 112, 261, 62, 36, -220, -283, 97, 130, 137, 185, 428, -16, -339, -219, 256, -39, -292, -77, -22, -80, -368, 5, 45, 90, -136, 209, -15, 22, 294, 152, 306, -307, -133, 56, -173, 138, 81, 84, -18, -40, -31, -5, -126, 153, -62, 94, -30, 109, -49, -55, 1, 63, -60, -2, -19, -61, -36, 28, -73, -21, -148, -111, 54, 98, 45, 44, -21, -12, -73, -11, 66, -95, -20, 44, -26, 77, 67, -53, -29, 69, 40, -36, -2, 251, -306, 357, -81, 378, + -309, 280, 31, -30, 471, -246, 28, -239, -71, 718, 346, 152, 104, 204, -115, -1, -607, 113, -26, -263, 291, 218, -9, 52, -351, 309, -164, 328, 215, 175, -252, -44, -212, 315, 72, -115, 558, 267, -63, 29, -463, 79, 21, 368, -165, -471, -81, -130, -92, -665, -332, -709, -361, -253, 83, -178, 334, 42, -383, 231, -256, 362, -323, -261, 188, 323, 317, 1, -298, -237, 145, -195, 7, -98, 120, -133, -197, 347, 160, 48, -56, 131, 73, 161, -16, 110, 38, 181, 3, -8, 10, -88, 3, 47, 22, 21, + 4, 140, 63, -109, 12, 64, -35, -41, -27, 9, 26, 71, -18, 49, 81, -16, -83, -6, -91, -39, -84, -52, 71, 6, -47, 48, 26, 100, -59, -29, -90, 40, 20, -431, -514, -338, -41, 2, -59, 133, 197, 140, 8, 79, -157, 117, -328, -460, 23, 368, 71, -118, 296, 179, 287, 477, 69, -136, -290, -231, 145, -266, -182, 79, -209, -470, -254, -18, -47, 120, -99, 274, 85, 109, 375, -50, 52, 94, -284, 354, 65, -311, -514, 142, 56, -371, 410, 270, -343, 128, 346, 199, 99, 289, -120, -104, + 30, -147, -240, 434, -371, -33, 167, 45, 670, -565, 184, -65, 6, 194, 16, 49, -146, 97, -332, -713, -32, 0, -363, -227, -43, 146, 128, 60, 39, -111, 5, -159, -76, -23, -89, -143, 61, -20, 35, -68, -48, 45, -115, -254, -84, 27, -63, -245, -133, 115, 81, 59, -42, -88, -113, -13, -53, -135, -111, -160, -80, -105, -107, 6, -20, 56, -37, 55, -31, 95, -126, -339, 302, -614, -436, 326, -14, -559, 289, -326, 637, 129, -835, -104, 77, -209, 64, 148, 298, 256, -485, -19, 46, -99, -444, -67, + -92, -151, -135, -4, 34, 381, 416, -126, 224, 196, 189, 416, 6, 114, -476, -161, 168, -92, 230, 571, 84, -494, -1107, 0, -341, 318, -209, -110, -218, -595, 261, 803, 47, 213, -628, 133, -71, -279, 72, 310, 159, 251, -270, 401, 233, -459, -687, -40, -523, -485, -312, -357, 47, 648, 247, 28, -86, 419, -211, -305, -50, 69, -49, 81, 64, 8, 65, 163, 58, -12, 12, -57, -61, 171, -51, 169, 4, -88, 20, -44, -69, 203, -48, 113, -244, -26, 118, 4, 48, 208, -152, 191, -19, 26, 56, -56, + 141, 27, 8, 31, 7, 71, 182, -70, 63, 78, 70, 87, -29, -1209, -763, 547, 441, 717, -3, 282, 70, 226, -10, 146, -318, -382, -237, -342, -221, -244, 292, 689, 150, -842, -200, 147, -224, 205, -481, -40, -16, 27, 234, 177, 33, -59, -108, 195, 381, -306, -474, 314, 150, 412, 189, 600, -416, -147, 384, 572, 498, 294, 140, -124, 38, -73, 2, 197, -748, 401, -59, 108, -50, 567, -173, -10, -125, 359, 306, -640, 458, -544, -28, -277, -273, 247, 45, -848, -75, -68, -156, -100, -20, -109, 440, 42, + 421, -134, 498, 233, -257, 108, -64, 27, 32, 45, 67, 24, -96, -161, 248, 108, 203, 55, -121, 232, 9, 11, 176, -495, -229, -221, 70, -8, -335, 13, 57, -17, -63, -2, 116, -124, -5, 132, 67, 161, -142, -71, 41, 175, 670, -747, -18, -425, -1197, -142, -442, -945, 188, -7, -184, 58, 507, -34, -537, 183, 21, -173, -130, -97, 26, 584, -132, -23, 265, 195, -85, 282, 258, -126, -124, -236, 325, -79, -561, 85, -38, 191, 733, -491, -787, -497, -230, 108, 262, 138, 558, 278, -395, -229, -538, 464, + 286, 51, 98, -309, 32, -327, 563, 552, 39, -259, -144, 53, 512, 1022, 629, -98, -229, 13, 325, 140, 300, 414, -411, -20, -793, -535, -510, -342, 213, 485, 334, 52, -97, -47, -442, -556, -140, -296, -278, 62, -57, -72, 3, 17, 126, -143, 283, -289, 121, -368, -123, -2, 68, -12, 64, 139, -100, 15, 336, 410, 495, 270, 310, 139, 59, 21, 8, 17, -87, -269, -262, -45, 203, -2, 31, -111, -78, 30, 249, 155, 297, 239, 213, 257, -584, -68, -302, 440, -485, 94, 43, 860, -532, -156, -547, -118, + -540, -454, -328, 170, -581, -421, -632, -161, -95, -193, -286, -704, 184, -498, 201, -522, 644, 99, 289, -124, -607, 326, 188, -204, 325, 455, -246, -654, -351, 877, -375, -28, 22, -149, 193, 569, 101, 242, -183, 407, 6, 321, 97, 109, -10, 33, 695, 211, 1665, -1016, 649, 913, -241, 21, 470, -341, -100, 764, 302, -127, 405, -174, -740, -547, 185, 30, -989, -275, -102, -513, 263, 154, -334, -273, -202, 29, 90, 209, -174, 24, 121, -55, -221, 60, 45, 69, 204, 36, -126, 16, 237, 211, 101, -237, -7, 434, + -126, -93, 240, -237, -411, -118, 21, -54, -212, -66, -15, -233, -50, 23, -67, -242, -399, 149, 423, 152, -12, 13, -83, -254, -205, 925, 1033, 13, 746, 743, -43, 334, -750, -233, 661, 62, 653, 915, 753, -152, 491, -768, -1198, -513, -449, 288, 1, 308, 332, 720, 557, 194, -572, -70, 569, 183, -281, 366, 785, -89, 272, -642, 306, -507, -139, -322, -667, 408, 45, 198, 795, -432, -486, 287, 824, -650, -436, 268, -211, 1166, 862, -822, -311, -650, 33, 711, -332, -495, -227, 43, 170, -593, 140, 1188, 84, -796, + -1216, 978, -1173, -984, -577, -504, -849, 225, 213, 1360, 338, 596, -304, 649, -82, -281, 243, 27, -66, 665, 82, 339, 422, 227, 507, -149, 135, -114, -45, -114, -433, -321, -358, 405, 142, 360, 447, -103, 266, 580, 207, -193, 298, 347, 117, -86, -427, -385, 375, 156, 248, 495, 1105, 472, 276, 199, 310, -170, -40, 554, -363, -443, -89, 211, -193, 200, 119, -1077, -622, -809, 220, 457, 163, 698, 626, 884, 276, 965, 432, 625, -301, -115, -303, -734, -528, -1139, -676, -214, -665, 153, -23, -11, 276, 231, 106, 561, + -137, -453, 666, 68, -875, -371, -93, -1047, -798, -771, 74, 383, 104, -397, -49, 449, 273, 1058, 197, -1403, -469, -236, 227, 229, -161, -365, 524, -773, -144, -617, 476, -1222, -763, -995, -807, 49, -455, -341, -810, 418, 1455, -27, 940, -511, 230, -680, -4, 1048, 246, -478, 53, 411, -702, -1072, -586, 290, -846, 375, -15, -10, 538, 296, -148, 642, 622, 516, -169, -159, -114, 7, 432, 328, 216, 26, 450, 267, 65, 75, 331, -124, -121, 251, -356, 333, -311, -282, -365, 645, 383, 601, 206, 238, 43, 60, 276, -418, + -713, 75, 187, 196, 258, -46, -283, 811, 334, 818, -1325, 580, 1002, -93, 1153, -605, -1751, -903, -9, -171, 197, -624, 609, 861, -769, 685, -420, -513, -1222, -495, -701, -460, -560, 557, 85, -1093, -1403, 1067, 243, 386, -326, 90, -378, 15, 325, 495, 446, 1194, 40, -848, 1155, -117, -298, -530, 488, -943, -635, 544, -492, -733, -925, -807, -172, 114, 89, -245, 1001, 857, -81, -479, -834, -953, 238, 209, -187, -87, 1374, 99, -399, 599, 286, -898, 721, 1313, -1431, 2320, 619, 675, 255, 679, -182, -1422, 980, 90, -176, 1024, + -1205, 218, 213, 0, -115, 58, -93, -326, 179, 364, -296, -31, -438, -497, 655, -137, -320, 157, -174, -394, -726, -160, -247, 644, -610, -54, 750, -151, 599, -206, -523, 280, -105, -241, 310, 81, 826, -102, -13, 538, 1653, 723, 34, -560, 787, -18, 53, -386, 718, -844, 608, 583, 616, 295, -231, 817, 1027, -216, 422, -645, 1034, 437, 344, -667, -1449, 283, -446, -336, -590, -745, 444, 195, -362, 77, 33, -396, -1769, -116, -377, -187, -29, 1240, 849, -421, 319, -826, 90, 608, -939, -876, -717, 1122, -812, 229, 904, -1226, + -1135, 1038, 829, 870, 1170, 427, -1500, 332, 442, -139, 2446, -260, -374, -1112, -957, 487, -882, 568, 199, 643, 1339, -867, -588, 1626, -995, -1105, 716, -1421, 1027, -1082, 244, 363, -779, 316, -905, 622, 1153, -54, 200, 230, 42, -360, -332, -83, 334, -156, 225, -242, -715, 299, 63, 479, 241, 417, -144, -149, -708, 490, -95, -655, 152, 1325, 370, -349, 394, 710, -354, 70, 553, -285, 551, 178, -169, -866, 149, -337, -17, 1060, -485, 48, 210, 147, -302, 353, 1214, 88, -1061, 1481, 349, -114, 1052, 514, 849, 308, -1295, -297, + -492, 589, 1481, -962, 229, -469, 653, 749, -1020, 826, -822, -743, 359, 677, 18, 215, 528, -831, 709, 41, 868, -171, -243, 272, 1291, -600, 1041, -524, 202, 260, 1041, -77, -79, 346, 1574, 89, -1249, -116, -1501, 880, -7, 2429, 514, -730, -226, 525, -550, 843, 1586, 1077, 15, 449, 682, -94, -752, -118, -178, -2568, 1582, 1171, 1086, 248, -1114, -347, 824, 416, 717, 375, -2453, -890, 1492, 396, 475, 1275, -925, -47, -138, 715, 176, -90, -209, 559, -161, -685, 321, -340, -392, 328, 498, -394, -127, -32, 391, -532, 407, -472, + 204, -803, -811, 776, 94, 51, -101, -598, -187, 513, 48, 161, 877, -157, -682, -85, -391, 282, 323, -341, -281, 329, 725, 908, -38, 962, -594, 979, -895, 152, 468, -459, 66, 185, -245, -479, -906, 1381, -310, -270, -461, -75, -191, 451, -929, -265, -582, 202, -585, 563, -5, 292, -645, -1169, 53, -853, -897, 409, -689, -577, 1130, -415, -665, 89, -684, 324, 425, -120, -560, -157, 321, 291, -257, -19, 995, -172, -621, -777, -117, -337, -1184, 1113, 378, -1347, 828, -54, -573, 2611, 1461, 1206, 630, 373, -624, 104, 280, 315, + 110, 1148, 249, -330, -569, -2295, 463, 312, -19, -440, -876, -162, -567, -491, -45, 737, -507, 1268, 175, -241, -98, -96, 91, 540, -215, 144, 361, 140, 61, 301, -480, 240, 74, 748, -267, -171, -214, -173, -596, -305, 201, -625, 464, -116, -317, 452, 266, 383, -151, -44, 35, 85, -417, 226, 15, -4, -51, 279, 132, -1201, 2005, 248, 652, 352, -507, 366, 559, 133, -66, -495, -93, 129, -235, -181, 77, 218, 578, -414, 239, 16, 460, -173, 85, 146, -545, 429, 63, 100, 149, 153, -348, 355, -301, 66, 340, -197, + 333, -155, 422, 325, 186, -540, 391, 294, 235, 656, -645, -64, -13, -144, 188, -338, -535, 355, 403, 198, -57, 79, -63, 205, -192, 78, -399, 349, -616, 567, 315, -201, -15, 231, 11, 206, -2, 16, -27, -215, 289, 392, -359, -89, 68, 214, -166, -177, 41, 65, -46, 32, -136, 41, 159, -137, 30, 89, -138, 105, 139, -22, -52, -77, 23, 290, -118, 30, -283, 8, 303, -227, 225, -115, 13, 501, -94, 1, -15, -167, 260, 99, 110, 99, -87, 59, 286, -94, 194, -138, -25, 386, -1610, -3745, -601, 2188, + 1985, 4895, 2554, -1320, -408, -2713, -4606, -319, -2095, -293, 3350, 1431, 2587, 3977, -467, -584, -2024, -3437, -2736, -177, -1031, -390, 2850, 905, 1852, 3374, 548, -14, 345, -2053, -3112, 534, -3216, -2101, 708, -323, 517, 4133, 469, 1584, 3369, -672, 99, 753, -3259, -2713, -967, -3702, -1440, 472, 679, 2551, 3586, 2561, 1801, 1575, -604, -2168, -1787, -2681, -2824, -1207, -720, 20, 2358, 2822, 877, 2205, 636, -696, 457, -1535, -2142, -416, -999, -662, 1197, -43, 833, 1499, -418, -31, -7, -756, -241, -50, -576, 637, 222, -145, 1029, 333, -156, 999, -358, -1064, + 13, -1627, -1149, 356, -1093, 236, 1249, 927, 1705, 1872, 672, 665, -87, -1536, -2162, -2211, -2323, -1466, -120, 747, 1589, 2781, 2969, 2478, 1926, -110, -1829, -2603, -3345, -3396, -1825, -541, 1414, 3019, 2718, 1652, 1208, 362, -264, -400, -1212, -1381, -1054, -865, -636, -119, 117, 510, 737, 774, 726, 676, 326, 25, -263, -393, -583, -562, -433, -229, -99, 107, 185, 267, 210, 182, 145, 143, 41, 38, 31, 13, -69, -20, -104, -200, -218, -206, -196, -8, 31, 110, 233, 286, 267, 241, 81, -27, -165, -251, -284, -215, -154, -56, 44, 130, + 143, 164, 128, 88, 44, -1, -64, -48, -68, -54, -43, -43, -21, 9, -35, -21, -5, 18, 43, 42, 45, 73, 47, 25, -2, -34, -57, -57, -65, -46, -26, -6, 14, 31, 31, 33, 27, 18, 5, -1, -9, -13, -14 } + }, + { + {-134, 142, 36, -76, -33, -171, -45, 144, -75, -54, 45, -21, -5, 10, -45, -36, 175, 86, -20, 10, -25, -51, 25, 63, 97, -23, 37, 45, -153, -46, 0, -29, 95, 10, -32, 86, -64, 30, 133, -72, 9, 19, 101, -37, 139, -195, -71, 87, -38, -165, 12, 35, 56, 58, -17, -70, 7, -64, -44, 21, 83, 77, -110, 99, -121, 109, 7, 96, -37, -77, -34, 65, -12, -15, -19, 90, -95, 50, 24, 25, 31, 72, 23, -44, -51, -27, 39, -7, -38, 8, -45, -9, -3, -45, -18, -25, + 6, 26, -31, -21, 13, -5, -45, 1, 25, -16, -2, 11, -4, 19, 13, 3, -34, -10, 1, -14, 1, -2, -24, 15, -40, -6, -467, 153, -170, -68, -139, -143, 81, -48, -121, -65, 164, 243, -133, -50, -12, -176, -165, 12, -17, 107, 36, 80, -71, -44, -91, 25, 157, 68, 30, -101, 77, 23, 47, -66, 6, 23, 35, -90, -66, 24, -124, -127, 54, 96, -108, -55, -42, 8, 96, 77, 33, 14, 248, 97, -79, 96, 68, -69, 117, -44, -30, -1, -51, 104, -59, 27, 62, 50, -93, 36, + 17, 19, -33, -46, -20, 145, 9, -43, -32, 34, -131, 25, 77, -5, 50, -29, -48, 31, 28, -12, 49, 25, -14, 35, 36, 61, 7, 0, -5, -19, -26, -3, -5, -17, 17, -6, 60, 354, 141, -26, 15, 80, 41, -25, -154, 4, 135, -141, -17, -263, 68, 106, 6, -63, 191, 134, -125, 59, 6, -109, 170, 93, -12, 68, 162, -52, -35, 10, 0, 3, 38, 199, 39, 29, -325, -18, 14, 38, -147, 33, -119, -92, -126, -83, 0, 36, -77, 75, -187, -108, -12, -4, 58, -76, -18, -69, + 39, 100, -62, 10, -54, -11, 155, 121, -50, 113, -56, -99, -123, -10, -13, -83, 73, -14, 20, -10, -28, 4, -19, -68, -5, -108, 11, -54, -35, -91, 102, -33, 34, 69, 27, -37, -10, -42, -4, 17, -41, 40, -5, 3, 5, -16, 23, 13, 6, 2, 57, 27, -20, -41, -38, 34, 46, -2, 11, 45, 6, 558, -246, 44, -23, -106, 87, 155, -104, 167, -12, 178, 48, 61, -80, 100, 37, 102, -223, 116, -133, 39, -112, 136, -40, 137, -84, 49, -56, -14, -8, -16, 53, 287, 11, 83, + -82, -136, 3, 0, 3, 42, -95, 188, -14, 157, 9, -71, -89, -241, 115, 76, -114, 10, 94, 49, -280, 164, -12, 116, -169, -182, -90, -178, -34, 200, 40, -80, 10, 112, -41, -94, -50, -105, 72, -159, -30, -122, -48, -3, 132, 61, 13, 40, 167, 87, 19, 60, -50, -21, 9, 1, 25, 12, -31, 14, 58, -6, 11, 20, -31, -41, 35, -49, 53, 30, 49, -1, -22, 29, 49, 11, -23, 14, -4, 145, -345, 69, -110, -315, -243, 127, 142, 188, -95, -50, 129, 61, 193, 62, -23, 19, + 122, 240, -63, 69, -5, 195, 43, -13, -41, -151, -229, 1, -34, 67, -15, 52, 38, 13, 13, 44, -79, 8, 106, 168, -85, 19, -75, -98, 138, -108, -269, -106, -70, 127, 9, 141, 127, -69, 4, -112, -17, -48, 164, -210, -8, 69, -223, -250, 2, 76, 155, -111, -265, 137, -245, 283, 158, 46, 119, -4, -119, 360, -35, 174, -9, 252, 171, 92, -28, -50, -87, -32, 36, 9, 67, -72, 41, -38, -28, -27, -32, 34, -21, -1, -56, -3, 30, 60, -64, -75, 8, 33, -3, 39, -25, 4, + -32, -10, 18, 37, 43, 27, -39, -55, -758, 159, 41, -379, -479, -75, -369, 305, 89, -222, 17, -102, 36, -151, 22, -6, 4, 216, -74, -47, -86, -76, -198, -132, 204, -81, 130, -110, 58, 6, 118, -115, 90, -115, 54, -43, -71, 75, -185, 75, -93, -32, -134, 333, 160, 292, -121, 125, 101, -55, 54, -135, 148, 320, 254, -172, -44, 77, -124, -83, -219, -412, -138, 215, 79, -100, 45, 24, -110, -195, -196, 144, 20, -302, 36, 32, -12, -20, 104, 224, -19, 2, 34, 2, -55, -199, 70, 70, + 45, 97, 60, -84, 26, -52, 15, -43, -15, -48, 5, 14, -3, -34, -32, -8, 19, 1, 78, 29, 73, 77, 85, -95, -95, -35, 78, -23, 31, -27, 45, 46, 31, -45, -23, -300, -126, -79, 223, -61, 52, -234, -244, 10, 69, -144, -83, -135, 274, 59, -94, -203, -200, -196, -55, 92, 276, 88, 155, -126, 294, 167, 53, 2, 302, -179, 28, 94, 204, -334, -170, 143, 58, -47, 345, -153, 97, 207, 64, 34, 152, 60, 76, 76, 33, 88, -5, 130, -31, 322, -235, 265, 211, -186, 209, 37, + 178, 179, -395, -12, -16, -121, 63, -109, 110, -46, 252, -29, 40, 102, 71, 99, -161, -56, -164, -154, -87, 243, 37, -79, 73, 66, 32, -43, 26, -31, 97, 35, 31, -48, 30, -93, -8, 105, 56, -19, 36, 36, -29, 44, 31, 102, 58, -59, -22, -36, 33, -94, 28, 49, 32, -15, -4, -10, 395, -106, -62, -98, 281, 147, 29, 106, -192, 421, 139, -35, 158, 203, -345, -24, 81, 39, -1, 290, -141, -178, 401, 59, -29, -41, 209, 15, -31, -41, -98, 103, -61, 138, 98, -254, -240, 28, + 473, -7, 96, -294, 144, 193, -121, 142, 179, -298, -181, -39, -380, -203, -227, 65, -78, -86, -42, 265, -366, 160, 79, -121, 223, -145, 21, -310, -7, 184, 167, 347, -413, -105, -459, -101, -9, -112, 51, -25, 418, 322, 184, -211, 11, 77, 204, 248, -6, -2, -36, 2, 142, -10, -12, -9, 3, 4, 17, 55, -59, -22, 60, 7, 55, -5, 6, -51, 76, 43, 1, 67, -36, -8, 67, 14, -11, -86, -5, 15, 12, -33, 85, 139, -25, -8, -64, 43, 268, -306, 7, -189, 517, -222, -129, 447, + 337, 60, -630, -156, 286, 21, -33, -92, -52, -52, 41, 95, 86, 82, 554, -119, -83, -2, 70, -169, 95, 56, -23, -185, -117, 198, 213, 405, 102, -170, 101, -8, 102, 5, 224, -191, -283, -292, 187, -85, 37, 73, -106, -22, 481, 162, -410, 287, 90, 487, -257, -243, 139, 261, 180, 99, -47, 12, 124, -162, -48, 2, 206, -154, 416, -18, -8, -219, -245, 474, 140, -395, -94, 326, 226, 42, 81, -203, 61, 50, 62, 33, 69, -95, -113, 12, -5, -95, -32, 82, 82, -126, 31, -3, 52, 71, + -22, -25, -32, 47, 145, -109, 79, -10, 2, -65, -16, -49, -33, 67, -26, -44, -97, -6, -55, -371, -314, -121, 117, 120, 576, 559, -63, 47, 26, 6, -5, -114, -373, -286, -147, 134, -103, -324, -91, 63, -23, -498, -145, 112, -50, 49, 36, 152, 221, 37, -158, 164, 170, 120, -5, 220, -437, 148, -387, 485, -342, 134, -363, -59, -406, -214, -252, -273, 190, -240, -45, 86, -2, -127, -91, -41, -397, 14, 27, 199, -620, 16, -15, 291, 350, -235, -144, 15, 269, -512, 330, -230, -152, 27, -499, -24, + -39, -77, -88, -61, 502, 206, 104, -119, -112, -124, 17, 124, -200, -4, -34, -53, 28, 149, -54, -94, 95, 59, -1, 105, 57, 89, -52, -66, 127, -90, 33, -118, -22, 7, -24, -44, -105, -115, -122, 31, -6, -25, -88, -83, -34, -43, 28, 127, -33, 97, -291, -765, -303, -142, 138, 212, -248, -91, -313, -276, 152, -242, 258, 107, 186, -27, -245, 440, 178, 248, -308, 136, 61, -451, 285, 172, 21, -306, -115, 156, 166, -5, 60, 223, -212, -157, 264, -515, -507, -669, -147, 218, -585, -490, -294, 12, + 216, 69, 64, 12, -167, -234, -553, 295, 87, 676, -158, 19, -414, -498, 67, 324, 26, -314, 212, 85, 463, 46, 62, -222, -39, 195, -447, -842, -231, -210, 49, 222, -400, -204, 136, -141, -29, 132, -74, -68, 177, 43, -12, 86, 139, 150, 33, -101, -264, -25, -159, 44, 34, 34, 115, -96, 105, 138, 97, 78, 82, -199, -178, -69, -152, 17, 49, 52, 190, -44, 123, 72, -74, -41, -110, -154, -37, -203, -61, -46, -720, -553, -255, 380, -33, 651, 128, -56, -366, 130, 670, -702, -633, -209, -106, -440, + 417, 123, 225, 271, -442, -52, 176, -278, 520, 8, 116, -151, 128, -344, -197, -118, 195, 93, 315, -518, 45, -4, -388, 422, -253, -617, 121, 223, 44, -184, -46, -257, 41, 211, 88, -421, 164, -96, -470, -277, -577, 13, -91, -15, 73, 353, 437, 365, -188, -318, 104, -81, -55, -246, 455, 378, -83, 701, -449, 234, 440, 476, 11, 303, -198, -77, -395, -166, 233, -80, -308, 191, -177, 201, -92, -209, 107, -41, -122, -91, 78, -101, 67, 142, -151, 192, -26, -104, 69, 24, 10, -86, 110, -170, 56, 65, + 5, -113, -14, -67, 84, 159, 341, 175, 272, -13, -5, 142, -178, 48, -240, -95, 50, -2, 263, -624, 79, 8, -394, 58, -878, -759, -181, -6, 33, -19, -312, -11, -89, 281, 55, -17, 53, -663, 230, 124, 368, 153, 160, 433, 216, 63, 1082, 232, 416, 574, 27, 405, 102, -224, 263, 19, 127, -220, 17, -142, 92, -142, 305, 37, -189, -236, 33, -642, 373, 252, -33, -58, 147, -170, -141, -210, -254, 213, -203, 351, 408, 400, 426, -98, -644, 11, 272, 651, -151, -23, 308, 455, 669, -86, 295, -197, + -115, -537, -419, -183, -190, -153, 112, 24, -230, 262, 165, 206, 368, 148, 138, -43, 1, -54, -105, 4, 67, 1, 194, 156, 95, -10, -159, 10, -114, -126, 81, 99, 30, -197, -44, -288, -70, 95, 143, -91, 119, -164, -191, -96, -115, 108, 56, -168, -116, 132, 518, 676, -522, -546, -718, 627, -77, -267, 211, 204, 586, 487, 23, 535, 765, 211, -403, 362, -373, -212, -84, -263, -315, 151, -163, -160, -378, 834, 97, -456, -8, -68, 369, 391, 150, -270, 395, -116, 241, -777, 33, 313, -338, 104, -366, -300, + 788, 323, 233, -62, -712, -178, 197, 145, 107, -174, 553, -401, 304, -192, 199, 220, 437, 593, -704, -25, 351, 167, 497, 481, -702, -5, -199, -367, -30, -384, 148, 281, -148, 516, -125, -320, -386, 318, 366, 364, -110, 57, -29, -547, -530, -497, 296, 145, 89, 236, -24, -144, 360, 43, -11, 218, 349, 208, 19, 31, -114, 209, 100, 448, -52, 47, 312, 252, 80, -54, 196, -16, -52, 352, -299, 6, 213, 8, -77, -118, -65, -10, 231, 36, 7, 255, 183, -181, 275, -23, 533, 1063, 45, -508, 144, -340, + 220, -296, -318, 964, -732, 1211, 743, -179, 245, 585, 86, -914, 360, -740, 177, 65, -364, 15, -48, 528, -263, -27, -19, -161, 1118, -65, -166, 143, 378, -381, -802, 634, -99, -49, 725, -426, -115, -507, 138, -354, 411, 376, 772, -221, 217, 513, -727, 89, -462, -734, -936, -494, -1012, -1141, -157, 73, -534, -578, 361, -41, -321, -623, 452, -333, 120, 564, -1062, -308, -193, 472, 1277, -604, 40, -383, -562, 273, -673, 544, 953, -272, -440, -471, -115, -113, 13, 307, 230, -251, 255, -33, 202, 10, -227, -67, 282, -463, + 221, -243, 68, -198, -72, -279, 67, -268, -411, -201, 102, -309, 3, 92, 459, -264, -150, 148, 192, -330, -201, 92, -85, -177, 322, 54, -244, 221, 67, -385, 67, -309, 343, -153, -493, -729, -553, 615, -501, 249, 585, 251, 376, -695, 1003, 632, 547, -401, 719, -77, 476, 314, 107, 261, 350, 214, -116, -177, -159, 74, -482, -567, 321, 143, 187, -466, 128, 144, 351, 525, 787, -442, 120, 1121, 242, 122, 109, -228, 83, 1116, 324, 724, 206, -770, -321, -560, 1618, 659, -625, -389, -557, 97, -365, -876, 202, -663, + 991, -67, -819, 1082, 875, 128, -238, 150, -499, 668, 1188, -315, 564, 1331, -209, -213, -151, 812, -59, -443, -419, -423, -7, -49, -371, 33, -156, 411, 102, -388, -247, -442, -48, 65, -72, -308, -348, -244, 219, 372, 58, -379, -55, 491, 4, 451, 235, -245, -22, -384, 382, 176, -500, -937, 87, -56, -285, 315, -2, -159, -134, 102, 26, -31, 278, -762, 309, -101, 764, -1585, -1087, 634, 305, 232, 538, -538, -703, -385, -578, 334, -621, 187, 419, 686, 26, 576, 336, 99, -179, -593, -418, 353, -727, 377, 89, 628, + 478, -228, -906, -586, -52, -40, -237, 628, -1097, -80, 41, -1146, -19, -136, -89, 129, 677, -651, -1807, 681, 740, 445, 1414, -1157, -147, 790, 602, -724, -337, -196, 1114, 225, 1063, -1530, 226, -1826, -1095, -1056, 1261, 405, -811, 745, 88, -707, 726, -1060, -1117, 173, -1161, 350, -1984, 309, 627, -840, 930, -416, -223, 627, -214, -165, -442, -27, 147, 348, -41, 324, 626, -466, -52, -369, 223, -239, -65, 142, 77, 89, -83, 650, -215, 57, 275, -564, -502, -548, -259, -926, -429, -335, 800, 164, 712, 312, 142, 329, 224, 34, + 268, 62, 557, 1372, 507, -492, -322, 189, -350, -410, -50, 638, -112, 119, -680, -141, 937, -685, 517, 1225, 611, -52, -235, -403, -785, -576, 673, -385, 632, 457, 216, 30, 246, -195, -998, -345, 711, 565, 591, -630, 1086, -280, 421, -804, 735, 1268, -257, -451, -49, 47, -284, 278, 552, -1039, 681, 663, -164, 769, 405, 332, -489, 101, 685, -1449, -1294, -537, 340, -667, -1965, 824, 537, -254, -335, 16, -117, -672, -1806, -108, 1278, 312, -230, -152, 274, 1050, 833, -1230, -510, 823, -176, -329, -1410, -81, 770, 258, -219, 477, + -180, 52, -533, -86, 320, 486, -278, -98, 97, 281, -176, 174, 20, -343, 204, 590, 99, 177, 108, 267, -280, -485, 45, 528, -433, 191, -148, 49, -420, -804, -440, 302, 978, -98, 461, -647, -287, -437, 270, 193, 308, -219, -337, -22, 69, 78, -152, -33, 668, 885, 20, -998, 1321, -371, -922, 827, -133, -502, 639, 171, -134, 539, -739, 701, -250, 24, -215, -184, -1030, 408, -393, 162, -413, -34, -308, 295, -180, 1113, 197, 728, -283, 182, 460, -196, 318, -63, 556, -28, -187, 879, -786, 438, 601, -353, 680, -416, + -17, 350, -266, 799, 716, 149, 1191, -734, -1682, -283, -1040, -688, 2456, -63, 753, -115, -1037, -27, 1032, 1461, 888, 1472, -792, -237, -355, -841, 557, -236, -519, -54, -1020, -1865, 469, 656, -552, 372, -116, -556, 594, 437, -217, 612, -225, -546, 280, -271, 725, 68, 54, 410, 137, -462, -194, 238, -152, 451, -630, 406, -660, -168, 165, -469, 299, 19, -703, -114, 45, -189, -2, -132, -516, 211, 155, -82, 518, 794, -433, -620, -40, -296, 860, 883, -520, -330, -108, -438, 9, 155, 742, -796, 941, -579, 124, -9, 92, -735, + -119, -666, -552, -5, -221, -504, -205, 357, -431, 329, -207, 1012, -478, 297, 55, -260, -824, -307, 617, 105, -210, 810, -611, -617, -89, 773, -716, -107, 133, 204, -796, 230, 268, -290, -832, 7, -648, 264, 140, 238, -1269, -547, 714, 1935, -886, -129, 151, -336, -555, -19, 1617, 366, -171, -151, -435, -108, -334, 622, 27, -410, -437, 15, 285, -655, 500, 142, 545, 14, 695, 286, -494, 650, 623, 1546, 490, 113, 155, -576, 185, 500, 521, 173, -41, 12, -68, 188, 215, -59, 279, -81, -33, 529, 224, 84, -164, 151, + 403, 420, 488, 171, 177, -283, -6, -24, 87, 270, -15, -228, 249, -238, 207, -18, 244, 30, -206, -64, 14, 49, 120, -37, 85, 59, -6, -1237, 1637, 224, 371, 391, -381, -439, 13, -171, 230, 538, -761, 249, -163, 195, 182, 126, 429, 336, -326, 302, 261, -265, -456, 136, -164, -378, 222, 183, -35, -248, 4, -181, -90, 15, 94, 171, -342, -52, 268, -123, 240, 45, 172, 354, 102, -365, 34, 338, -197, -20, 161, -580, -39, -145, -543, 744, -194, -33, 438, 74, -337, 130, -322, -66, 242, -300, -112, 550, + -590, 61, 48, 199, -265, 176, -94, 164, -228, 9, -59, 554, -258, -26, 140, -282, -32, 383, -86, 247, -174, -160, 23, 148, -152, 283, -7, -63, -67, -91, -95, 241, -212, 236, 124, -312, 69, -32, -32, 183, -265, -105, 32, -173, 174, -178, -32, 293, 47, -55, 128, -148, -123, -72, 136, 244, -82, -71, 20, -211, 384, -1625, -3305, -427, 2072, 1593, 4576, 2201, -1069, -934, -2172, -3803, -482, -1475, -459, 2682, 1710, 1825, 3492, -124, -775, -1319, -3456, -1909, -615, -644, 95, 1571, 1217, 1291, 2437, 1425, -898, 1298, -1367, -3188, + 407, -2140, -2977, 1159, -256, -553, 3658, 1197, 972, 3152, -339, -622, 959, -2115, -2627, -708, -2249, -2011, 425, 434, 908, 2750, 2436, 1475, 1747, 336, -1379, -1486, -1838, -2527, -1180, -643, -859, 762, 2433, 1587, 1569, 1288, -910, -12, 256, -2086, -860, -524, -611, 954, 489, -122, 781, -183, -163, 132, -563, -426, 277, -350, 566, 711, -266, 385, 726, -425, 475, 236, -1419, 249, -461, -1542, 23, -882, -788, 1119, 1212, 1169, 2170, 690, 690, 734, -950, -1897, -2116, -2710, -2018, -610, 353, 1641, 2722, 3015, 2356, 1716, 339, -1598, -2406, -2938, -2730, -1416, + -90, 769, 1955, 1804, 986, 990, 385, -28, -6, -305, -598, -496, -620, -751, -551, -409, -105, 210, 510, 614, 664, 574, 404, 206, -1, -333, -555, -508, -356, -248, -194, -52, 71, 243, 284, 189, 179, 156, 64, 89, 80, -95, -123, -60, -118, -106, -158, -213, -103, 9, 21, 110, 172, 175, 213, 159, 58, -22, -108, -152, -150, -137, -126, -62, 26, 68, 64, 62, 55, 54, 49, 17, 4, 13, 10, 5, -5, -30, -41, -67, -90, -72, -38, 6, 45, 66, 83, 86, 58, 35, 18, -34, -56, -52, -53, -46, + -29, -24, -2, 15, 20, 26, 28, 18, 9, 1, -7, -12 }, + {-32, 82, 142, -106, -92, -142, 129, 64, 11, 190, -19, -2, -58, -47, 41, -51, -99, 56, 16, 159, 217, -56, -128, -157, -10, -90, -87, -59, -12, -125, 121, -45, -47, -83, -61, 23, 136, -14, -39, 41, -133, 100, -83, -299, 148, 99, 165, 171, 33, 90, -89, 25, 130, 10, -1, -31, -17, 70, -63, -45, 3, 66, -55, -68, -100, 128, 51, 16, -31, -128, -4, 96, 60, -18, -24, 96, -11, -7, -42, -39, -58, -69, 5, 15, 33, -71, -28, 40, -49, 43, 12, 19, -18, -1, 9, 21, + 5, -8, 13, -9, -24, -8, -40, 27, 14, -11, 1, -18, 24, 25, 8, 3, 10, 9, -25, 1, -5, -6, -10, -3, 14, 4, -448, 234, -22, 7, 82, 115, -167, -21, -30, 96, 37, -102, 319, -34, -19, 142, 117, 39, 81, 261, -128, 9, -65, 27, -80, 7, 9, 30, -144, 13, -34, -54, -6, 91, -50, 85, 123, -211, 29, -86, -23, -130, 66, -77, -13, -43, -132, 51, -89, 61, 34, -65, -96, 4, 90, 68, 163, 76, -70, -200, -13, 36, 253, -78, -38, -2, -49, -131, -62, -122, + -16, 102, -23, 122, 78, 63, 88, 17, -158, -36, -101, -64, -175, -5, -50, 24, 48, 21, -26, -35, 6, 47, -39, -10, 1, -14, -3, -15, 19, -60, -20, -14, 2, -5, -11, 1, -89, 324, 168, -56, -135, 184, -222, -40, 118, -93, -68, -97, 213, -79, 64, 15, 63, 292, -300, 85, 145, -102, -278, -146, -22, 14, -42, -53, 112, 164, -17, -122, 6, -154, 41, -98, 50, 175, 62, -183, -8, 8, 264, 47, 131, -42, 56, 44, -327, 2, 150, 68, 168, -155, -96, -154, 38, 94, -34, 30, + 5, -79, 26, -60, 48, 46, -14, 76, 13, -15, 32, 189, 32, 97, 122, 66, 0, -6, -184, -3, 189, 65, 82, -6, -16, 118, -93, 7, -11, 59, 30, -2, -82, 10, -43, -14, 10, -28, -22, 16, -5, 60, 23, 54, 24, 15, 28, -25, -34, 1, 0, 69, 40, 8, 21, 65, -15, 4, 18, 27, -1, 673, -176, -65, -104, 136, 90, 228, 89, -36, 108, -7, 121, 46, 169, 2, 142, 185, -209, 35, 52, 33, 31, 45, -125, -2, -144, -22, -7, -242, -166, 59, -3, -10, 94, 92, + -51, -209, 60, 185, 121, 173, -49, 93, 171, -290, 89, 125, -145, 177, -126, -28, 15, 34, -98, 83, -28, -34, -102, -83, 98, 99, 43, 97, 151, 83, 211, -46, -243, 232, 36, 113, 46, -41, 58, 43, 8, 159, -51, 157, -229, -53, 27, 69, 13, -125, -60, 20, 4, -14, 5, 47, -63, -35, -37, -45, 23, -14, -19, -37, -29, 68, -19, -23, -4, -25, -23, 34, -17, 37, -11, 2, 26, -9, 1, 303, -340, 232, 52, 237, 58, -128, 47, 184, -212, -42, 28, -239, -45, -183, -111, -132, + -146, 67, -228, -140, -181, -43, 182, 68, -219, -83, -229, -54, 54, 338, -265, 114, -65, -95, -197, 13, 37, 218, 116, 31, -178, -311, -1, 96, 251, 90, 83, -179, 70, 159, 15, 28, -95, -93, -30, 94, 19, -59, 5, -197, -26, -166, 110, -32, 110, -162, -138, -225, -23, -143, -60, 63, -219, -92, 29, 127, -264, 160, -123, -131, -139, -114, 83, -75, 40, 50, -68, 14, 59, 47, 6, -59, -7, -26, -69, -8, 56, 36, -33, 53, -39, -27, -5, 21, -51, 8, -4, 41, 31, 64, -45, 19, + -8, -16, 21, -51, -17, 33, 18, -21, -834, 135, 96, -240, -53, 0, 9, -46, -80, -61, -248, 191, -120, 27, -206, -73, 299, 271, -172, -103, 9, -4, -141, -164, -116, 20, 13, 6, -17, 70, -204, 64, 7, -358, -43, -107, 164, 241, 37, -41, 11, -210, -264, 142, 261, 291, -79, 54, 169, 176, -91, 162, 262, -10, 221, 189, -221, 73, 12, 238, -146, -154, 136, 181, -56, 17, -260, 184, -146, 194, -324, 36, 76, 155, 10, -134, -276, -168, 231, -228, -12, 27, 124, -68, -50, 99, -185, -159, + 65, 45, -14, 133, -62, 33, 33, 37, 49, 12, -53, 34, 67, -27, 8, -12, -36, 29, -87, -10, -93, -16, -19, -28, -49, 21, -29, 0, -73, 30, -14, 27, 28, 13, 10, -322, 116, -284, 363, 350, 13, -469, 197, 29, -86, 327, 3, -279, -28, 355, -441, 16, -109, -348, -95, 8, -67, -177, 105, -147, 123, -125, -235, 128, -16, 183, -351, 146, 280, -110, 25, 281, 410, -107, -81, -342, 22, -282, -21, -196, 12, 29, 167, 81, 153, -107, 30, 95, -16, 378, -248, -122, 498, 500, -96, -30, + -310, -158, 18, -85, -205, 302, 95, -77, 444, 87, -210, -4, -403, -202, -228, -195, -52, -315, -226, 132, 123, -22, 74, -92, 108, -69, -101, 19, -147, -67, 194, 17, 98, -50, 22, 16, 47, 43, -6, -2, -92, 0, 23, 17, -24, -26, 67, 20, -11, 4, -14, 3, 38, 24, -10, -35, 12, -22, 399, -108, -6, 275, -67, 162, -91, -351, -24, -1, -73, -208, -233, 120, -185, 323, -101, -236, 199, 406, -103, 113, -111, 234, 4, -495, 175, 274, 26, -83, -289, 240, 160, 155, 30, 97, 321, -228, + 39, 63, -181, -348, 329, 184, 614, -32, 270, -91, -195, 33, -32, -9, -57, -201, 441, 10, 33, 62, -64, 364, 44, 304, 125, 51, 324, -154, -367, -72, 65, 47, -153, 178, -110, -511, 44, 101, -284, 131, -31, 55, -1, -116, -130, -1, 46, 156, -16, 43, -62, -45, 68, 46, -11, 47, -54, -6, 1, -70, -103, 63, -115, -29, -51, -99, -30, -13, -39, 42, -19, -42, -15, 188, 71, 71, -40, 27, -61, -77, -28, -27, 30, -51, 88, -118, -40, 25, 322, -540, 86, 238, 356, -379, -57, 253, + 176, 215, 36, 457, 83, 188, -60, 24, 187, 101, 217, 15, -307, -447, 233, 111, -87, 49, 130, -418, 2, -265, 120, -17, 270, -90, 119, -66, 68, 34, -14, 150, 203, 70, 116, -329, 133, -60, -570, -380, 95, -418, -31, 339, -252, 677, 244, -140, 367, 14, -123, -278, -274, -381, -61, 217, -272, -37, 243, 108, 137, 495, 60, 322, 1, 60, -537, 145, 38, -491, -463, 262, -178, 27, 138, -83, -127, 24, -30, -37, 26, -91, 77, -67, 16, -158, 82, 22, 32, -13, 188, -158, 12, -47, -40, 34, + 37, 49, 90, 148, 93, -103, 22, -17, 137, -50, 88, -147, -110, -87, -70, -14, -9, 66, 81, -281, -9, 176, -3, 123, -288, 223, -18, 64, 208, -389, -267, 70, -6, 212, 439, -41, 109, 471, -176, -320, -19, 345, -76, -399, 31, 146, -79, -125, -30, 511, -98, 440, 332, 401, 21, 32, 234, 78, -82, 82, -319, 239, 402, 252, 34, 224, -177, 172, -172, 252, -228, 4, -19, -18, 715, -108, -41, -63, 99, 197, 376, 430, -236, 103, 428, -241, -299, 179, -131, 185, 817, -387, 55, 76, -214, 92, + 266, 187, 22, -168, -403, 191, -176, 220, -152, 31, -200, -44, -334, 28, -107, -118, -42, 40, 84, 165, 69, -95, -24, 168, -100, -88, 11, 12, -153, -2, -77, -38, -29, -28, 58, 36, 119, -77, -77, 9, -92, 43, 187, -94, -101, -187, 95, -47, -128, -46, -276, -435, -335, -453, -174, 53, 365, 271, 99, 385, 116, 236, 217, -102, 334, 362, 255, -485, -272, -280, 107, -192, 14, 141, -141, -341, 223, -161, 80, 76, 351, -363, 568, -558, 581, 1, 292, -279, 103, -624, -349, -302, 277, 130, 401, -37, + -1, -201, -502, 331, -274, -140, 239, 573, 552, 262, -37, -370, 220, -570, -45, -322, 185, 622, -594, 220, 275, -366, -37, -59, 207, -241, -353, 74, -143, -514, 263, -47, -487, 365, 477, -153, 16, 72, -206, 315, 143, -83, -78, -199, -117, 253, 142, 147, -12, -220, -68, -71, -250, -48, 74, -10, -74, -18, -179, 28, -61, 126, 66, 31, -207, 176, 15, -83, -53, -28, -11, 107, -77, -26, 76, 215, 104, 68, -128, 173, -412, -482, -132, 320, -368, 253, -507, -86, -192, -175, -401, -31, -146, -239, 201, -266, + 299, 68, 235, -354, -667, -50, 144, -276, -201, 116, 93, -324, -151, 475, 233, -56, 262, 679, 30, 91, 75, -45, -5, 105, 96, -511, -183, -626, -194, -584, -272, 38, 694, 328, -335, -394, 262, 550, 349, -237, 422, -153, -26, -724, -212, -88, -85, -493, -795, 263, 3, -580, 154, 922, 125, 110, -574, -46, -3, 134, -645, 606, 100, 172, 337, 134, 365, -21, 174, -135, -277, -228, 128, -183, -55, -246, 89, 212, 8, 180, 24, -64, 1, -139, 105, 110, 22, 25, -95, -34, 59, 157, 113, -127, -44, -49, + -300, -415, -307, -96, -36, 55, -69, -113, -126, 6, -84, -106, -186, -97, 307, -182, -163, -42, 375, -556, -110, 138, -266, 649, -529, -544, -442, 628, 282, -357, -323, -213, -65, -192, -199, 35, 236, 621, -65, 267, 232, 227, -409, -509, -367, 436, -72, 528, 176, -53, -714, -579, -58, 52, -413, -255, -193, -195, -937, -199, -227, -334, -164, -217, -429, 308, 588, 331, 18, 351, 442, -152, 141, 117, 45, -13, -110, 314, 126, 523, -119, 57, 187, 1026, -10, 548, 688, -54, -596, 57, 597, 94, -508, -450, -582, 387, + -475, -123, 685, -287, -456, 148, -124, 20, 188, -280, -127, 64, -84, -123, -25, 59, 343, -25, -176, -146, 0, -124, -107, -89, -171, -74, 66, -75, -16, -226, 61, -15, 48, 242, 147, -130, 64, 59, -206, -306, 117, 134, 18, -313, -348, -46, -243, -71, -37, -309, 570, 414, -972, 301, 380, -175, 274, 913, 70, 199, -326, 208, -345, -222, -186, 63, 230, 325, -53, 131, -106, -61, -183, 238, 860, -288, -286, 306, 213, 27, -637, 404, -509, 284, 355, 36, 85, -108, 590, 447, -1, 299, -245, 379, 57, 428, + 625, -18, 153, -86, -239, -20, 268, 307, -610, -370, 135, 652, -324, 431, 284, 81, -710, 82, 102, -841, 487, -472, -565, -1064, 251, 641, -299, -595, 115, 711, 448, 77, -100, 7, 244, -221, 328, 546, 515, -41, 214, 540, -93, -9, -68, 465, -77, 113, -227, 117, -143, 17, -2, -38, -114, 101, 266, 92, 69, -249, 54, -257, 69, 403, -156, 6, 44, -192, -259, -288, -75, 183, -94, 49, -183, -17, -3, -532, -146, -22, 102, 137, -120, 190, 90, 103, -168, -153, -106, 50, 245, 675, 492, -158, -1292, 162, + 660, 319, 151, -562, 6, -385, 101, -30, 117, 204, 282, 125, -698, 418, -89, 132, 546, 215, 110, -184, 676, -16, 672, -797, -227, 264, -459, -397, 38, -98, -357, 51, 595, -12, 48, -300, -630, -400, -173, 272, -61, 69, -305, -335, -158, 516, -340, 300, 207, 172, 66, -520, -741, -54, 512, -617, 311, -530, 346, -558, -19, -550, 800, -714, -420, 193, 140, 368, 311, -180, -89, -182, 108, -2, 481, -578, -221, -745, 399, -261, 40, -25, 216, -160, 88, -301, -457, 307, -231, 14, 88, 405, 170, -280, 72, -91, + -358, -62, 98, 123, -323, -156, 379, -31, -299, -129, 443, -500, -161, 111, -107, 188, -27, -216, -289, -89, -123, -86, -87, 90, -12, 196, -187, 113, 48, -82, 201, -1111, -158, 331, 80, -265, -397, 36, -378, -36, -583, 544, -219, 340, -757, -430, -17, 926, -760, -67, -595, -473, -146, 580, -137, 257, 270, -309, -661, 927, 401, -532, 100, 67, 253, -517, 460, -42, -973, 102, 191, 249, -807, -193, 98, 707, 132, 394, -1040, -631, 315, 0, 673, -182, -118, 51, 340, 315, 117, -1319, 368, -154, 298, 703, -226, -63, + -807, 260, 359, -422, -255, 727, 1144, 300, 183, -325, -139, -627, 43, 8, -779, 283, -28, -226, -64, 365, -302, -200, -40, -83, -33, 322, -144, 7, 180, 74, 249, 215, 157, 116, 299, 358, -484, 153, -305, 237, 29, -302, -212, -117, -107, -198, 177, -100, -203, 330, -59, -103, 180, 340, -9, -120, 86, 317, 335, 217, -120, 59, 56, 286, 166, -937, -608, -200, 5, -528, 445, -1110, 69, -676, 373, -241, -753, -53, -192, -256, -860, -624, 197, 704, -448, 866, -711, -462, 170, -57, 401, -227, -239, -338, -84, -1181, + -330, 49, -38, -185, -456, 389, -402, 652, -184, -66, -439, -403, -778, -331, 306, 134, -34, 66, -271, -201, -353, -294, 175, 249, 124, -674, 800, 120, -328, 643, 463, 763, -130, 451, -1015, -543, -959, 1001, -307, -676, -652, -1395, -577, 987, -53, -481, 367, -948, -631, 254, -46, -789, -772, 3, -440, 133, 178, -584, 591, -343, -511, 57, -299, 842, -311, 385, 69, 517, -248, -136, 58, -218, 0, -472, -358, -82, 210, 21, 344, 147, 257, -206, 7, -410, -95, -141, 134, 413, 193, 172, 199, 177, 52, -539, -156, -369, + -87, 73, 261, 1238, 1583, -140, -690, -157, -256, -696, 312, 30, -504, 1515, 530, -346, -1035, -82, 259, 286, 313, 731, -200, -344, 345, -1293, -866, -329, -87, 152, -691, -624, 677, 547, -405, -777, 507, 28, 889, -707, -161, -232, -40, -555, -844, 726, -522, -318, -644, -131, 432, 417, -258, 72, 79, 553, 826, 622, -1052, -491, -623, -141, 363, 148, -719, -1021, 881, 72, -859, -1413, 723, -169, 390, 375, 381, 68, 281, -545, -212, 403, 71, -245, 160, -49, -757, 400, -962, -45, -47, -149, -345, -116, 424, -10, -97, 236, + -311, 957, -74, 103, -70, 29, 233, 5, 225, -458, 103, -68, -335, 55, 159, 333, -159, 108, -800, -240, -45, -397, 354, -26, -98, -203, -331, -463, -683, 229, -71, 522, 589, 400, -406, -538, -715, -243, 650, 557, 88, 273, -232, -386, -316, 25, 90, -298, 141, 553, 685, -848, -711, 2023, -162, -198, -303, -638, -69, 730, 1174, -540, -325, -119, -532, -133, -300, 466, -481, 533, 256, -183, -671, -50, -276, 1009, -553, -14, 3, -101, 458, -291, -37, 209, -137, -986, 504, -450, -519, -121, -554, -324, -1007, 965, 46, -644, + -1181, 687, -696, -682, 11, -532, 241, 435, 1347, -384, 529, -115, -648, -555, -159, 2022, -1782, -133, 1861, -1703, -642, 955, -139, -771, 1800, -892, -367, 822, 208, 349, -530, 593, 841, 390, -211, -58, 850, -127, 488, -15, 342, -488, -59, 219, 140, 89, 26, 30, 356, -166, 95, 126, 123, -765, -309, 239, -640, 189, 372, -277, -283, -227, 159, -317, 373, 307, -36, 176, -224, -464, -442, 883, 165, 548, 119, 104, 357, -309, -66, 557, -329, -775, 582, -84, 343, -95, -221, -225, 944, -1229, 1083, -197, -690, 577, 196, -120, + 113, 69, -142, 204, -246, -315, -150, -433, -363, -803, -314, 672, 632, -996, 319, 513, 427, -180, -984, -98, -493, -1150, 708, 1815, -1059, -124, 1286, -379, -474, 1043, 771, 376, -436, -859, 272, -356, -548, 1899, 1393, -1162, -860, 1021, -1892, -672, -544, -335, 1303, 864, 563, 621, -2221, -781, 2094, 1209, 238, -572, 713, -752, -1513, -1011, 720, -558, -130, 840, 1563, -200, -899, 103, 610, -1084, -410, 1108, 994, 997, 688, -212, -651, -328, 843, 236, 347, -175, 84, 379, 22, -166, -194, -255, 178, 127, 807, 219, -174, -338, 69, 30, + -133, -298, 69, 623, -687, -213, 597, -150, -28, 394, -168, 288, 114, 341, -694, -109, 130, 765, 175, 361, 311, 168, -162, 245, 354, -426, 192, -1877, 803, 3, -198, 953, -169, -729, 357, 326, 931, 526, -514, 22, 138, 637, 142, -744, -36, -47, 144, -693, -757, 1082, -399, -1141, 577, 1004, -575, -198, 58, 687, -833, -1088, 289, 911, -207, -394, -235, -227, 390, 166, 229, 2303, 119, -299, 23, 69, 1237, 36, -452, 277, -983, -575, 243, 2, 1061, 847, -560, -164, -530, 22, 374, 95, 109, 381, -286, -1137, 278, 763, + -373, 673, -1061, 492, 306, -922, 146, 17, -413, 41, -183, 456, 435, -773, -488, 1028, -798, 378, -86, -303, 213, -31, -475, 263, 146, 188, -28, -79, 37, 143, -190, -167, 125, 101, -112, -8, 213, 384, -242, -154, 33, -67, 118, -93, -68, 91, -21, 232, -90, 116, -315, 184, -226, 194, 319, -27, -12, 50, -406, 319, 644, -1208, -3974, -4703, -423, -3262, 1281, 7951, 4277, 6458, 6806, -740, -1961, 581, -4957, -6060, -1872, -6671, -5355, 1358, -3852, -1050, 7678, 2779, 5429, 9378, 5582, 2496, 1900, 664, -4178, -5202, -1716, -7105, -7109, 936, + -5316, -4364, 2623, -4474, -4600, 3471, 1411, -636, 8197, 7675, 4901, 10405, 9807, 3349, 3904, 3041, -4938, -4952, -6260, -12396, -14631, -10525, -10476, -7729, 265, 712, 5102, 8820, 10874, 9906, 11498, 9849, 5810, 3904, 1301, -1945, -4364, -6212, -5335, -7739, -8664, -7189, -8401, -6307, 999, 2018, 4895, 9815, 7818, 6022, 4555, 1791, -1488, -1218, -2461, -3084, -2352, -2679, -2585, -1106, -1046, 55, 1597, 1132, 2243, 2689, 470, 1950, 1878, -525, 625, 435, -1427, 57, 463, -1657, -1804, -2525, -5183, -5800, -4508, -4314, -1412, 2110, 3815, 6199, 9362, 10101, 9373, 6561, 2005, -2124, -4530, -6771, -8349, -8220, + -6414, -4413, -2094, -652, 264, 751, 1908, 3137, 3243, 3002, 3091, 2189, 1980, 1703, 693, 146, 427, 361, 227, 136, -396, -1065, -1616, -2330, -2956, -2963, -2384, -1832, -962, 160, 1001, 1461, 1700, 1496, 1326, 1449, 1404, 1123, 961, 794, 546, 282, 16, -537, -991, -1096, -1028, -936, -873, -810, -601, -218, 22, -81, -266, -150, 21, 120, 236, 273, 374, 596, 812, 797, 821, 724, 468, 283, 164, -64, -269, -416, -745, -1032, -1133, -1179, -1019, -651, -173, 364, 843, 1069, 1044, 815, 540, 266, 14, -134, -211, -223, -195, -189, -185, -167, -131, -101, + -61, -21, 6, 30, 42, 40, 31, 15, 4, -1, -2, -2 } + }, + { + {-270, -322, 169, 12, 254, 93, 113, 74, 104, -1, -1, -55, -163, -93, 46, -6, -28, -18, 90, 70, 3, 81, -72, -186, 62, -42, 23, -94, 77, -76, -37, -29, 137, -30, 1, -54, -13, -150, 53, -24, 84, -70, 12, -32, -120, 41, -10, -31, 56, 102, -19, -60, -176, 18, -104, 51, 4, -67, -1, -28, -23, -127, 85, -112, 65, -43, -74, -63, -135, 77, 9, 39, 84, -86, -139, 92, -133, 6, -88, 31, -68, 63, -33, 34, -58, 13, -26, 38, -27, -30, -29, -27, -52, 10, 15, -7, + -41, 31, -30, 7, -20, -35, -12, -11, -4, -6, -4, -28, -15, 7, -17, -8, -8, -19, -5, -14, -18, -15, -481, -6, -65, 125, 1, 48, -41, 62, 11, 54, -57, 309, -68, -44, -134, 44, -162, -52, 11, -79, -2, 113, 64, 43, 75, 110, -136, -52, -4, 70, -128, 123, -107, -54, 98, -19, 22, -79, 90, 95, 101, -158, -49, 170, -4, -26, -40, 186, 120, 144, 1, -34, -44, -10, -5, 21, 54, -180, -18, -84, -108, -14, 29, -93, 23, -71, -28, -29, -4, 62, 56, -33, -23, -41, + -147, -35, -92, 2, -121, 32, 0, 121, -43, 17, -106, 9, 13, -49, -52, 51, 0, 14, -6, 36, -11, 15, -8, -8, 42, 20, 17, 7, -6, 26, 161, 192, -136, 16, -116, 175, 31, -75, -105, -93, -21, 21, 45, 234, -142, -24, -57, 91, -265, -32, 166, -6, 139, 61, 111, 116, 49, -25, -125, 39, -36, 14, 194, 48, 166, -90, -48, 11, -228, 25, 167, -51, 14, -143, 105, -4, 46, -169, 97, -114, -65, -119, -140, 78, 25, -46, -73, -69, -51, -35, 76, -79, -142, -218, 198, 152, + 6, -218, 64, -105, 83, -72, 13, -134, -85, -174, -80, -26, 166, 99, -190, 80, 2, -18, 80, -13, 63, 132, 5, 27, 87, 17, 16, 86, -18, -4, 5, 10, 17, 20, -22, 24, -20, 5, 2, 21, 3, 54, 46, 2, -5, 53, 26, -42, 6, 18, 815, -303, 365, -291, 24, 86, 85, -240, -82, -81, -402, -3, 21, -145, -24, -2, 286, 53, -201, 146, 159, 35, 290, -217, -80, -116, 61, 233, -17, 14, 86, -42, 104, 46, 266, -41, 104, -175, 159, -123, 177, -4, -186, -28, 268, -12, + 181, 108, 174, 15, -139, -113, 2, -84, 143, 95, -142, 19, -111, 189, -52, 151, 181, 31, 186, -9, -91, -31, -116, 5, 245, -155, -158, -60, 69, -108, -67, 47, 118, -49, 43, -239, 58, 15, -17, 83, 5, 22, 56, -8, -31, 25, -55, 17, -23, 7, 10, -9, -19, -48, -4, -38, -24, -16, -80, -678, 76, -198, -141, -218, -264, 107, 240, -34, 95, 39, 124, 29, 11, 75, -144, 339, -15, -195, 224, -66, 96, -220, -136, -155, 70, 43, 176, 7, -106, 20, -94, -104, -115, -39, -161, -81, + 154, -140, -8, -110, -171, -76, 24, 57, 112, -86, -78, 110, 21, 42, 31, 68, 104, -165, -53, -16, -230, 63, -14, 137, -134, -103, -125, 23, 146, 112, 257, 172, -155, 65, -69, 121, 78, -169, 125, 34, -186, 25, -32, 17, -33, -128, 26, -92, -95, 36, -51, 23, 71, -46, -60, -64, -94, -18, 76, -19, 79, 1, 54, 36, 29, -34, -11, 13, -31, -37, 11, -36, -12, 10, -65, 38, -32, -12, 10, -3, 8, 21, -28, 19, 47, -862, 241, -255, -212, -152, 32, -42, 513, 53, 125, -54, + 5, -206, 211, 64, -27, 45, 275, -133, -44, 66, 22, 139, -115, -50, 153, 58, 141, 19, -143, -93, 86, -11, -46, -89, -49, -3, 261, 68, -43, 8, 22, -75, 189, 145, -41, -192, 52, -100, 180, 140, -134, 56, -175, -156, -136, -172, -57, 41, -102, 11, -113, -96, 206, 132, -169, -230, 29, 200, -150, -111, 171, 134, 194, -121, -2, 56, 82, 217, 61, -26, -5, -154, -20, -1, -131, 12, -36, -59, 6, -16, 69, -14, -23, 34, -17, -54, -33, 14, 57, -23, -17, 4, -10, 103, 21, 132, + -89, 26, 10, -52, 2, -2, -66, 20, -10, -75, -68, -36, -65, -50, 22, -32, -456, -45, 77, 222, -43, -116, 52, 326, -410, 95, -83, -76, -185, 111, -329, -214, 113, -172, 104, 468, -83, 189, -220, 226, -59, 67, -198, 92, 56, -106, 46, -21, -102, -7, 128, 202, -158, -252, -200, -185, 24, 148, 391, -4, 263, 275, -256, 197, -377, -138, 24, -168, -156, 105, -365, -72, 254, -109, -96, 34, -112, 104, -111, 178, 230, -64, 71, 10, -233, 20, -151, -104, -184, 105, 80, -177, 14, 132, 122, 156, + 160, -24, -154, 127, 66, 76, 41, 92, -11, -3, 13, 38, 44, -62, -20, -50, -34, 74, 62, 71, -130, 27, -17, -53, -63, 67, -42, -70, 17, 17, -24, 157, 51, -31, -36, -73, -21, 64, 96, 25, -1, 99, 1079, -53, -428, -55, -20, 40, 135, 54, -51, -45, -216, -103, 119, 263, -217, -137, 175, 13, -64, 70, -18, -251, -256, 346, -33, -23, -59, 177, -15, 18, 112, -191, 201, 83, 32, 76, 201, -485, -218, -119, 446, 57, 33, -138, -152, 133, -21, 154, -56, -310, 32, 37, -48, 150, + 67, 40, 247, 603, -49, -51, 229, 69, -72, 157, 469, -53, 89, 170, 136, 122, 124, 139, 107, -125, 187, 335, -78, 128, 1, -43, -233, 144, 54, -19, 70, 80, 18, 9, -79, -90, -36, -179, -80, -122, 155, 76, 58, -26, -24, 9, -104, 0, 37, -143, 124, -62, 22, -44, 6, 47, 56, -111, -110, -92, 12, -19, -31, -9, 76, -21, 7, -46, -98, -53, -3, 218, 243, -309, -90, -263, 260, 487, -233, -55, -268, -116, -324, 231, -198, -80, -21, 2, -129, -159, 290, -264, -98, 30, 198, 212, + -305, -89, 116, -261, 148, -207, -85, 77, 5, -113, -32, 63, 339, 42, 76, 0, -291, 318, -156, -238, 190, -169, -193, 251, -114, 33, -56, 34, 328, -56, 73, -287, -24, 335, 74, 332, 283, -93, -74, -385, 58, -64, 255, 314, -181, 79, -568, -154, 187, -195, 292, 21, 62, -103, -23, -135, 23, -93, 206, 205, -11, 70, -5, 116, 48, 85, 174, -52, -199, 92, 43, 126, -34, 134, -29, -45, 32, -79, -55, 15, -140, 40, -50, 124, 51, -8, -28, -80, -125, -9, 15, 51, -47, 29, -118, 0, + 5, -60, 76, 9, 0, 34, -40, 8, -1, 194, -250, 84, -233, -26, -315, 514, -153, 34, -164, -471, 270, 94, -352, 216, -159, -117, 122, 487, -245, 470, -10, -332, 13, 109, -293, 321, -170, 237, 517, 50, -243, -69, -29, 118, -207, -113, -29, 254, -92, -103, -340, -12, -402, -75, 453, -103, 258, 24, 68, -596, 7, -382, 306, 533, 164, 133, 32, 79, -312, 109, 166, -139, -39, -124, -79, 240, 5, 291, 893, 326, 89, -308, -286, -185, 175, -304, -27, -28, 62, 172, -167, -32, 166, 182, 37, 31, + 124, 157, 131, -2, -29, -30, 14, -65, -81, 71, -41, 110, -136, -43, 93, 79, -8, 72, -70, 33, 49, 67, -77, -75, 106, 76, 59, -27, -54, 26, -151, -40, 24, -80, 37, -56, -39, 17, 12, -13, -30, -100, 946, -494, -2, -239, -462, -621, 187, -191, 197, -587, 129, 225, 204, -240, -538, -421, -352, 16, -200, -390, -265, -129, -316, -217, 65, 425, -1, 70, -5, -353, 234, -22, 75, -70, -231, 216, -291, -409, 385, -399, 90, 7, -565, -332, 233, 0, 284, -173, -601, 8, 29, 238, 251, 580, + -322, -1163, -402, -390, 270, -754, -251, -117, -693, -223, -5, -123, -124, 163, -182, -6, -170, 175, -405, 159, 338, -407, -203, 216, 169, 149, -420, 112, 12, -50, 234, -46, 193, 175, -30, 62, 43, -41, -135, 244, -69, -153, 12, 4, 132, 55, 7, 50, -116, -115, 21, 55, 82, 145, -8, 72, -6, 65, -136, -51, -92, -81, -8, -9, 60, -152, -67, -111, -79, -159, -202, -175, -13, -6, 30, -103, -139, -541, 214, 268, -89, -104, -269, -298, 688, 250, -641, 222, -349, -34, -317, -660, 195, -344, -143, 27, + 21, -168, -556, -346, 275, -343, -8, -303, -462, -182, 517, 82, 94, -450, -148, -93, -56, 181, 229, 290, 363, -177, 206, 70, -205, 126, -347, -306, -260, 112, -301, 13, -454, -403, -203, 473, 375, 359, 402, -368, 503, 14, 234, 683, -136, -128, 116, -332, 141, -157, -421, 53, 353, -414, -288, -53, 380, -315, 41, 113, 231, 54, -88, -216, 63, 157, -82, 18, -105, 33, -99, 39, 13, 56, -34, 38, 82, 190, -19, -7, 22, 87, -138, -63, -152, -48, -30, -185, 40, 161, -9, -219, -31, -23, -182, -215, + -302, -132, 124, 15, 90, -51, -49, -115, -10, -276, -43, 158, 264, -18, 84, -159, 26, -97, 139, 53, -259, -604, 691, -540, 715, 400, 272, 153, 281, 305, 282, 769, -269, 54, -52, -133, -24, 95, -72, 148, -50, 241, 201, -43, -134, -766, -273, -556, -26, 293, 295, 94, 150, 221, 182, 214, 549, 819, 549, 111, -105, -158, -236, 287, 291, 327, -244, -192, -302, -50, 398, 4, 478, -290, 256, 154, 429, -897, -643, -263, -361, -369, 110, -150, 564, 168, -630, -52, 1018, -343, 317, -154, 418, -195, -128, 15, + -174, -227, -17, 171, 251, 176, -67, 198, -53, 92, -260, -176, 166, 106, -262, -113, -112, -35, 64, -68, -129, 59, 11, 43, -21, -73, 115, 38, -67, 154, -22, 46, -30, 181, -155, 162, 70, -151, 99, 6, 26, -157, -462, 173, 3, 34, -54, 176, -44, -81, 55, 138, 113, -67, 140, -439, -219, 369, 163, 273, 708, 63, 474, 692, 481, -309, -698, -21, -319, 758, 220, 593, -82, -314, -114, -342, 138, -263, 34, -293, 156, -213, -89, -472, -469, -44, -673, 372, 256, -199, 347, -161, 136, 388, -425, -556, + 101, -119, 940, 402, -1029, -275, -291, -528, -562, -1148, 204, -409, -107, 168, 42, 240, -45, -133, -872, 107, -396, 110, 512, 111, 343, -516, -690, 143, 428, 291, 161, 277, 445, 560, 572, -505, -306, -363, -262, -424, 603, 357, 340, 97, 260, 227, -22, 319, -487, -167, -59, 44, -106, -341, 19, -65, 44, 116, 352, 24, 164, 170, 25, 180, 5, -101, 20, -260, -109, 146, 202, 68, 36, -318, -33, 17, -157, -102, 46, 110, -299, -323, -152, 118, 93, 174, 38, -98, 71, -333, -305, 1246, 823, 1143, 75, -226, + -776, -228, 130, 181, -184, -599, -216, 988, 409, -136, 303, -22, -362, -105, -236, 674, -51, 40, 291, 20, 330, -3, 467, -429, 538, 109, -250, -151, -277, 486, -672, -726, 460, 760, 36, 525, 722, -812, 271, 166, -44, -7, 121, -305, 567, -343, -272, 229, 30, -61, -131, -169, 82, -536, -160, 432, -529, -122, -357, 14, 1072, -336, 70, 287, 6, -246, -668, 654, 306, -1347, 335, 339, 252, -302, -140, 688, 32, 51, 177, -479, 19, 305, -124, 176, -38, -156, -398, 61, -52, 370, -34, -16, -265, 293, -98, -102, + -420, -212, 149, -271, 23, -134, 169, -159, -338, 171, -364, -100, -165, 17, 23, -137, 365, -45, 491, 299, -49, 51, 315, -218, 57, 37, 302, -273, -161, 14, -556, -1334, 1186, 707, 376, 265, 586, -1346, 553, 621, 266, -862, 479, 871, 404, 960, 350, 16, -38, -30, -164, 407, 682, 650, 227, -200, -339, 81, -309, -361, 380, 261, 72, -362, -352, -77, -306, 156, 784, -139, -254, 265, 142, 232, 274, -60, -158, 630, 417, 206, 278, -51, -626, 145, 417, 54, -466, 624, 163, 867, 32, 780, 83, -256, -83, 187, + 1110, -140, 399, 274, 525, 275, 2, -34, 342, 1580, 74, 634, -535, -400, 201, 248, 308, 127, 51, -776, -307, -814, 44, -140, -269, -228, -90, -343, 43, -36, -361, 258, -420, -204, -380, -260, -25, 42, -304, -353, 85, 224, 262, -53, -100, -454, -593, 59, 73, -270, 540, 522, 773, 271, -170, 106, 239, 292, 351, 52, -366, 92, 470, 240, 25, 188, -869, 953, -14, 843, 21, 57, -765, -235, -344, 585, 149, 259, 155, -588, 59, 47, -516, -739, -754, 256, -280, 688, 41, -218, -178, 148, -265, 44, 203, -290, + 164, 232, 80, 66, 522, 875, -170, -7, 441, 359, 528, -391, -152, 158, -522, 50, 47, -696, 898, -45, 454, 389, 276, -530, 52, 450, -366, 803, 223, -296, 668, 500, 353, -1122, -225, 221, -380, 58, -622, -159, -944, -274, -141, -265, -1046, -109, -283, 1573, -223, 318, -158, 249, -128, -261, 175, -220, -29, -120, 428, 148, 191, -685, -604, -460, -184, 116, -851, -143, -64, 59, 319, 232, -20, 327, -294, 1, 24, -499, -675, 129, -193, -638, -167, -304, 50, -682, -70, -301, 406, 0, -281, -112, 132, 151, -57, 298, + -300, -199, 403, 369, 669, -228, -49, -95, 179, 476, 416, 306, -248, 186, 523, 504, 214, -642, -742, 309, -114, 219, -148, 603, -475, -110, -173, 524, -419, 930, 1147, 1169, 59, -234, 179, -169, 276, -65, -20, -362, -964, -332, -924, 507, 478, -576, -433, -578, -276, -96, 1228, -1, -646, -696, -54, 852, 402, -1755, -368, -323, 216, 638, -768, -255, -462, 182, -1043, 497, -184, -39, 274, 27, -517, 1002, -114, 468, 1078, 2217, 1328, -49, 741, 1123, 1453, 1572, 443, 956, 267, -4, 586, -486, 968, 404, -437, -1477, -1074, 122, + -426, -316, -280, -179, -190, -618, -404, 6, -103, -50, -200, -70, -324, 372, -659, -283, 178, 103, 49, -185, -212, -132, 122, -121, 326, -411, -502, -512, -314, 359, 414, -176, -82, 136, -89, 683, 144, 44, 553, 334, 313, 778, 515, 581, 179, 270, 649, 235, 503, -487, 264, -229, -506, 567, -731, 1205, -150, -231, 15, 957, -652, -122, -35, 4, 344, -259, 499, 166, -101, 108, 52, 388, -1221, -393, -43, 119, -126, -895, 721, -50, 94, 253, -583, -274, -1346, 344, -319, 246, 974, -280, 200, -138, 462, -812, -1076, 926, + -93, 68, 154, 931, 683, 806, -19, -1109, 646, 292, -263, -401, 618, -127, 782, 1287, 1007, 158, 84, 946, -193, 280, 786, -552, 910, 544, 322, -660, -322, -876, -28, 280, 1279, 525, -1193, -126, 768, -129, 373, 500, -846, -225, 411, 83, 229, -386, 273, 447, 60, -11, 680, 112, -147, -195, 226, -79, 366, 39, 277, 296, -47, -346, 671, -116, -204, -63, -453, -478, -299, -337, 220, 375, -396, -363, 82, 574, -858, -231, 335, -125, 6, -140, -89, -642, -4, -188, 176, 24, 108, -17, 59, -154, 268, 126, -71, -151, + 114, 13, -48, -1683, 386, -279, -66, 1315, 565, -412, -319, -5, -850, -1042, 88, 9, -586, 622, 76, -601, 380, 1131, -151, -652, 409, -384, -418, 211, 919, -299, 135, 252, -283, -684, -448, 907, 319, -894, 765, 300, -612, -321, 1260, -410, -966, -497, 1675, -1653, -766, 980, -443, -532, -1574, 1228, -1008, 360, 53, -190, -1778, -526, 1523, 959, -1203, -330, -521, -247, 247, 330, 397, -2102, 1150, 880, 925, 13, 485, -1029, -913, 1797, 738, 198, 725, -969, 196, -430, 463, -263, 1262, -516, -438, 174, 153, -479, 288, 137, 108, -92, + 65, 100, 104, -120, -67, 262, 16, -142, 553, 161, -490, 52, 475, 121, -466, 624, 1126, -555, -644, -177, -144, 379, 825, 247, -762, -257, -110, 111, 233, -131, 338, -247, -28, 194, -325, -1391, 238, 1731, 540, 184, 45, 128, 741, 1015, -235, 188, 261, -178, 612, -326, -89, -248, 469, 348, -195, 319, -465, -380, 469, -306, 515, -348, -156, -13, 280, -21, 208, 82, 525, -380, -78, 6, -212, 506, 439, -368, -132, -227, 115, -474, 251, 142, 231, -191, -145, 576, -699, -124, 291, -192, -129, 300, -858, 203, -312, 48, + -306, 737, -243, -323, 302, -171, -488, 938, -28, 93, -213, -366, -429, 472, -536, -261, 541, -744, -325, 92, -72, 88, -14, 103, 328, -122, 127, -154, 344, 187, -17, 26, 209, -188, 151, 22, 167, -79, 260, -136, 69, -231, -199, -314, 56, 16, 103, -155, 347, -118, -62, 297, 262, 139, -124, -203, 178, 236, 148, 101, -5, 213, 232, 101, 197, 24, -155, -9, 456, -1290, -3652, -3000, 1589, 457, 3634, 6491, 966, 2048, 747, -5174, -1634, -3509, -4241, 121, 680, -1768, 2567, 3359, 1887, 5355, 3090, -687, -1268, -2483, -4833, -3817, + -1123, -3404, -472, 2939, 493, 685, 4445, 2267, 1405, 4632, 717, -1278, 1814, -2425, -4801, -2010, -4050, -5072, -71, -1059, -1332, 3379, 3727, 2370, 5621, 4533, 2142, 1934, 1123, -3754, -3450, -4373, -5770, -4630, -1950, -1342, 122, 3319, 4040, 4225, 4054, 3753, 804, 69, -634, -2862, -3131, -1812, -3283, -1384, 290, -718, 1653, 2967, 911, 1253, 562, -812, -502, -1242, -1611, -195, 458, 11, 1335, 1227, 143, 1181, 4, -1499, 1325, 396, -1328, 934, -983, -2003, 918, -1427, -3523, 53, -1549, -1030, 3499, 1579, 1666, 4998, 3320, 1837, 2187, -548, -3158, -4023, -5454, -6042, -3828, -2453, + -419, 2291, 5118, 5640, 5238, 5444, 2917, 125, -1389, -3600, -4592, -2984, -3318, -2655, -533, 84, 351, 1284, 1103, 948, 1716, 1694, 1443, 1684, 1178, 375, -135, -761, -1675, -1863, -1557, -1668, -1222, -670, -96, 493, 1246, 1348, 1248, 1133, 799, 293, 25, -113, -478, -495, -299, -375, -436, -308, -479, -434, 8, 42, 3, 163, 78, 90, 374, 380, 415, 477, 256, 72, 16, -143, -300, -388, -437, -450, -318, -147, -10, 122, 258, 271, 289, 283, 154, 5, -29, -118, -139, -102, -32, 26, 79, 84, 64, 14, -67, -125, -137, -148, -144, -110, + -43, 55, 121, 140, 168, 179, 140, 96, 45, -21, -64, -91, -109, -101, -74, -49, -19, 12, 30, 40 }, + {-321, -391, 199, -71, 174, -85, -87, -174, 43, 39, -7, 4, -18, -133, -14, -76, -87, -83, -2, 11, -5, -14, 68, -17, -202, 128, 64, -68, 22, -1, 3, 30, 132, -72, 9, -229, 116, 24, 53, 81, 131, -71, -54, -25, -115, 10, -16, 101, -53, -6, -55, -63, 123, -91, -43, 13, -82, 71, -2, -38, 77, 139, 10, -4, -18, 119, -116, 2, -17, 63, -28, -53, 130, -1, 29, -35, 28, 70, -54, -77, 5, 68, 115, -50, -33, 29, 8, 18, -51, -16, 32, -6, 23, -40, -11, -25, + -34, -25, -22, 19, 5, -17, 20, 13, -15, -4, -3, -22, -39, -11, 2, 9, 23, -2, 16, 9, -17, 17, -468, 80, 56, 165, -64, 50, 191, -73, 53, -115, -170, 63, -115, -131, -132, 40, 51, -225, 133, 89, -38, -82, 53, -20, -51, 17, 75, 56, 120, 24, -36, 124, -62, 269, 61, 166, 64, 146, 65, 101, 54, 13, 6, 204, 35, -32, 14, 108, 80, 13, -9, -41, 23, 249, 71, 115, -120, -61, -126, -79, -123, 93, 58, -77, -56, 56, -58, 63, -28, -18, -85, -142, 62, -231, + -33, -49, -59, 14, -54, 12, 87, 43, -60, 12, -47, -100, -16, 50, -5, -77, 28, 15, 30, 55, 2, 9, -37, -21, -6, 1, 19, -41, -36, 4, 261, 361, -114, 95, -183, -12, 8, 461, -50, -125, -203, 2, 131, 211, -51, -283, -83, -109, -79, 93, -23, 176, 17, -103, -229, 65, -24, 50, -30, 23, 108, 38, -288, 32, 181, 88, 20, 41, -48, 125, -171, -19, 136, -98, -3, 223, -107, -13, -79, 136, -149, -111, 65, -154, -77, 195, 113, -179, -68, -29, -46, -83, 61, -71, 70, -5, + 8, 29, 146, -19, 203, 104, -160, -75, -80, 121, 34, -11, -66, 163, 61, -6, -6, -44, -41, 46, 16, 52, 126, 44, -10, 6, 8, 39, -11, 13, 59, 11, 74, 0, 24, 36, 44, 14, 27, 31, 25, 41, -16, 11, 27, 42, -6, -37, -43, 7, 867, -320, 176, -244, -25, 9, -17, -129, 72, 100, 25, -94, -200, -7, 123, 87, -88, -151, -11, 136, 248, -133, -17, -100, -216, 24, -108, 66, -80, 168, -295, 200, -12, -176, 44, 74, -20, -93, 7, 231, -8, 38, -32, 88, 42, -55, + -86, -190, 124, -40, -55, 73, 2, -319, 246, -344, -197, -244, 54, -29, 147, -80, 79, -147, 72, -39, -59, -162, 100, 114, 196, -48, -17, 52, -58, -35, 39, 112, -148, 73, 108, 118, -187, -155, 66, -97, 50, -2, -10, 16, 25, -9, 46, -56, 28, -18, 112, 6, 28, 24, 8, -44, -2, 10, -12, -683, 70, 7, -58, -105, 120, -93, 80, -24, -1, 111, 144, -88, 106, -31, -58, -192, -9, -259, -190, 228, 81, -88, -32, -27, 158, 84, -81, 144, 96, 57, 50, 62, 110, 95, 93, 255, + 230, 99, 26, -158, 177, -235, 47, -65, 191, -144, -187, 322, -75, -172, -154, 240, 147, 9, 123, 174, 80, 282, -17, -44, 160, 98, 10, 7, -146, 88, 92, 228, 93, 142, -87, -116, -248, -56, -134, -106, -113, 126, -4, 10, -72, -83, -23, -73, 23, -49, -82, 34, -8, 4, -77, -11, 3, -96, -13, -22, 7, -43, -50, -31, -18, 2, -16, 16, -22, 28, 7, 25, 54, -12, 56, 12, 37, -25, 12, -48, -18, -7, -58, -17, -28, -907, 248, -191, -284, -281, 180, -207, 159, -262, 150, 128, + 80, -276, 195, 0, 119, -228, 132, 277, 213, 11, -94, 42, -56, -291, -56, -138, 71, -182, 163, 160, -58, -3, 223, -45, 152, -116, -188, 103, 0, 107, 273, 168, -7, -467, -222, -62, 69, -69, 262, -405, 133, 59, -1, 132, -49, 202, -425, -196, 169, -427, -76, 204, 75, -92, -284, 110, 189, 139, -48, -298, -23, 6, -31, -13, -144, 70, -232, 149, 24, -136, 31, -165, 16, -198, -53, 74, 78, 10, -16, -66, -49, 18, -115, 99, 11, -54, 4, -99, -77, 26, -39, 59, -50, -27, -32, -35, + -66, -8, -35, -12, 23, -13, -28, 29, -9, -23, -24, -58, -40, 12, 36, -6, -428, 46, 71, 336, -317, 366, 104, -30, -86, -40, 34, -268, -52, 86, -88, -157, -43, 254, -262, -57, 262, 1, -104, 93, -128, 193, 84, -2, 96, -112, -177, -12, 13, 145, -310, -167, -137, -95, -92, -94, 46, 15, 25, -231, -238, -188, 6, -296, -164, 178, -121, 39, 18, -5, 73, 106, 100, 119, 174, -31, 189, -12, 95, -16, -122, -7, -197, 121, -230, 214, -257, -4, -265, 25, -266, -255, 120, 352, 105, -226, + 161, 0, -101, -60, -106, 140, 119, 172, 30, 134, -114, -12, 130, 16, 40, 26, -65, 79, -8, 30, 115, 34, -30, -69, -33, 48, 46, 38, 12, -54, 3, -11, -123, 119, 12, 44, 4, -29, -59, 42, -60, -28, 1185, 8, -350, 48, -193, 469, -84, 128, 28, 17, -424, -220, 225, 197, -335, -64, -16, 287, 137, 106, 280, 39, 12, 243, -94, -385, 50, 284, 165, -116, -1, 197, 117, 50, -18, -219, 97, -237, 16, -442, 107, 129, -42, -206, 270, 140, -64, 210, 92, -187, 325, 30, -125, 72, + 334, 48, -16, -290, -173, 34, 108, 383, -135, -159, 26, 207, -144, -174, -22, 277, 195, -76, -224, -17, 239, -103, 505, 106, 69, -267, 215, 8, -64, -138, 6, -80, 6, 311, 137, 110, 53, 32, -2, -26, 22, 59, 107, 13, 13, 37, -95, -3, 30, -24, 92, -75, -10, -39, 31, 163, 49, -57, -21, 35, 6, 51, -19, -77, 59, 56, -65, -20, 140, 46, 68, 270, 144, -422, -42, -212, 427, -158, 200, 40, 268, 107, 41, -20, 109, -120, -180, -499, -370, 124, 331, 445, -162, -214, -189, 101, + -104, -21, -17, 62, 68, 298, -157, 30, 73, 147, -142, -104, -235, -158, -164, -278, -712, -6, -95, -304, 69, -32, -386, 132, -328, 87, -40, -24, 166, 218, -6, -317, 94, -198, -222, 311, 278, 313, -101, 53, 41, -155, 24, -73, 485, -77, -51, -45, -4, -293, -368, 91, -28, -24, 82, 532, -66, -244, -105, 281, -41, -86, -81, -2, -226, 59, -44, 46, -115, 9, -144, -8, -10, 62, -61, -25, -89, 123, 6, -82, 18, 44, -94, 28, 35, 149, -32, 38, 100, 68, -55, 66, -112, -175, 20, 22, + -70, -162, -36, -36, 146, 60, 97, -12, 122, 139, -466, 172, 57, 493, -331, -187, -110, 263, -251, -241, 218, 147, -253, -256, -250, -561, 369, 346, 367, -158, 116, 364, -527, 1, 347, 321, 146, -1, -168, 36, -81, -456, 58, 125, 68, 303, -266, 29, -498, -63, 99, -274, 107, 84, 224, 273, 380, -77, -148, -458, -326, 141, 673, -209, -27, -310, -163, -246, 146, 149, -51, 22, -491, -65, 334, -266, -230, 198, -88, 289, 72, -212, 35, -321, -92, -85, 620, -62, -180, 136, 127, -54, -104, -32, -84, -115, + -106, -82, 44, 48, 101, -26, -1, -60, 61, 15, -158, 42, -1, -18, 58, -4, -86, -86, -204, 68, -64, 60, 79, -97, 45, 28, -20, 77, 1, 222, 32, -41, 6, -65, -11, 38, 7, -20, 19, -88, 70, -286, 674, -327, -167, -10, -19, -472, 34, -347, 257, -655, -92, -207, 229, -223, -224, -554, 379, -225, 158, -176, 116, 300, -212, -362, -119, 254, 523, 171, 221, 30, -519, -276, -278, -141, 96, 478, 208, 280, 263, -69, -106, -156, -433, 28, -300, 477, -212, 330, 74, -167, 114, -110, -144, -254, + 393, 106, 661, 147, -702, -172, 231, 188, 108, -36, 68, 743, 375, -121, 85, -196, 541, -17, -16, 212, -467, -200, -155, -501, -593, 122, 219, -52, -289, -74, -88, -228, 9, -44, -178, 186, 285, -58, -36, -39, -104, 83, 24, -29, -51, -45, -28, 95, -48, -129, -27, -3, 48, 29, -75, 201, -59, 123, -18, 103, 59, -29, -129, -126, 50, -32, -197, -72, -44, 78, 25, -12, 63, 96, 38, -53, -77, -409, 244, 546, -54, -24, -13, 507, 157, 121, 87, 60, 86, -200, 37, -629, 90, -304, 263, 643, + -84, 46, -508, 677, 329, 287, -84, -374, 45, -128, 344, 246, -308, 16, 182, 127, -239, -213, 994, -231, -173, 208, -253, -186, 316, 308, 12, 118, 113, -386, -191, -18, 131, 335, 83, 78, -434, -42, 128, -594, 130, -166, -60, -111, 175, -178, -322, -346, -544, 67, -221, -108, 349, -120, 113, -616, -1, 564, 133, -288, -170, 342, 177, -379, 212, -275, -210, -92, -52, 126, -36, 20, -58, -78, 46, 66, -95, 79, 250, 36, -34, 104, 159, -70, 108, -73, -96, 24, 72, 204, 56, -24, 76, -35, 108, -64, + 99, -79, 34, 83, 26, -148, -81, 259, -111, -215, 105, 51, 79, -60, 339, 94, -77, -44, 86, -38, -314, -315, 750, -448, 118, -286, 885, 188, 164, -282, -334, 33, 253, -271, -431, -256, -628, -244, -368, 0, -844, 60, 458, 282, 375, -261, 98, 406, -46, 295, 110, 459, -229, 383, 305, 218, 498, -278, 297, -152, -176, -117, 111, -964, -308, -599, 695, -437, -493, -106, 392, 11, -176, 546, -194, -173, -395, -975, 48, 91, 407, -409, 2, -250, -328, 521, -105, 261, -566, -553, -344, 434, -44, -276, -292, -12, + -480, -329, 47, -202, -358, 528, -726, -693, 181, 2, 306, 34, -33, -224, -197, 31, -343, -140, 293, 37, 50, -171, 173, 63, -187, 86, -139, -30, -143, 122, -190, -50, 129, 249, 28, 8, -274, -85, -19, 37, -41, 230, -10, -92, 148, -177, -160, 95, 212, -64, -152, -209, 163, 128, 263, -360, 0, 488, 66, -145, 253, -393, 789, 495, -2, -358, -404, 171, -100, -35, -19, 719, -350, 15, -242, 266, -443, -407, -801, 188, -324, -451, -52, -763, -373, 217, 166, -104, 401, 38, 486, -212, -662, -100, -484, -92, + -143, -637, 87, 521, -1459, 186, 7, 364, -69, -454, -864, 347, -103, 324, 197, -105, 510, -629, 887, -221, 497, 1032, 417, 734, 293, 193, -96, 384, -138, -400, -536, -348, -14, 305, -45, -235, -331, -300, 413, -181, -142, 366, 72, 276, -23, -40, -106, 65, 144, -187, -25, -458, -325, 225, -106, -11, -61, -8, -169, -274, 205, -165, 264, -263, -115, -29, -179, -93, 136, 54, 320, -79, -180, 118, -367, 6, 52, -58, 31, -42, 191, 265, 52, -9, -121, -222, -100, 13, 442, 218, -211, 1232, 1003, 904, -208, 0, + -771, 573, 711, 241, 687, 273, 233, 240, -123, 93, 189, -178, -742, -452, -29, -494, -575, -1349, 295, 230, 350, -260, -93, -182, 8, -424, -13, -324, 372, 308, -193, -264, -711, 1194, -375, 233, -1, 74, 190, -498, 596, -304, 203, 131, -447, -463, -86, -43, 276, 1260, -106, 184, 41, 377, 270, 280, -224, -70, 109, -614, 124, -526, -835, 287, 26, 62, -611, -1472, 634, 659, 457, -836, 792, 838, 311, 240, 7, -247, -555, 411, -391, 21, 7, -224, 167, -403, -42, -82, 197, -115, -183, -252, 379, -213, -90, 94, + -341, 185, 155, -123, -119, 28, -317, 288, -106, -84, -26, 20, 216, -175, -400, 114, -223, -75, -229, -208, 31, -170, -75, -159, 514, -234, -418, 60, -150, -17, -721, -1441, 1200, 195, 215, -478, -344, -1533, 427, 1101, 339, -970, -484, 161, -376, -238, 453, -504, 285, 255, 211, -561, 204, 177, -262, -525, -303, -200, -134, -501, -432, -236, -517, 412, -192, -667, -229, 414, -83, -462, -254, -234, 0, -365, -220, -607, -578, 250, -204, 764, 502, 52, 456, -663, 432, -629, 533, -88, 273, -279, 945, -233, 530, -133, 777, 315, + 190, -798, 870, 698, 304, 326, -623, -117, 257, 429, -109, 106, -689, 445, 758, -14, -541, -29, -357, -304, 149, 1, -149, 177, -395, -91, 16, 115, -272, -372, 144, -180, -353, -632, -46, 199, -53, -317, -385, -116, 245, -263, 101, 144, 40, 106, -33, -169, -144, -46, 176, 61, -69, -236, 325, -209, -185, -152, 64, 381, -258, 375, 314, -124, 113, 200, -1027, 831, -123, 387, -576, -202, -160, -151, -152, 476, -8, -437, 312, 35, 219, 401, 405, 0, -390, 1490, -436, 1141, -12, 48, -679, -310, 89, 541, 258, -204, + 441, 73, -656, 85, 73, 634, -44, 371, -502, -20, 424, 200, 352, 963, 769, -143, 390, -82, 755, -640, 498, 190, -46, 444, -262, 1185, -225, 562, -455, -409, 3, 1264, 401, -1210, 1039, -40, 353, -916, 288, 85, -1815, 737, 1357, 510, -591, -380, 261, 1339, 754, 1016, -393, -519, -475, 201, 264, -62, -534, -246, 625, 100, 129, -236, 278, -90, 117, -152, -191, -220, 371, 638, 613, 129, 318, 585, 379, 409, 556, 313, 530, 406, 133, -842, -180, -399, 215, 474, -572, -208, 635, 348, 56, -162, 535, -442, 82, 563, + 431, 242, 283, 341, 184, 65, -56, 81, 29, 292, 346, 224, -284, -144, -497, 610, 85, 404, -341, 818, -298, 378, 118, 166, 111, 67, -873, -504, -5, 74, 579, 483, -715, 68, -399, -356, 162, 40, -253, 288, 1126, -758, -73, 1741, -1074, 122, 610, -322, -270, 359, 562, -629, 295, -1139, -136, 1694, 60, 479, -193, 926, 917, -258, -30, -441, 93, -326, -841, -532, -1001, -728, 1083, 441, 310, 1461, -1051, -612, 171, 548, -422, 267, -451, 809, 470, 281, 579, 2119, -517, -165, -607, -681, -59, 892, -713, -89, 620, 683, + 791, 472, -560, 142, -316, -62, 455, 155, -55, 355, -657, 47, -3, 178, -159, -160, 376, -139, -112, 437, 539, 449, 180, 195, 350, 116, 12, 261, 9, -137, 95, 5, -56, -713, 158, 475, 743, -167, -233, -240, 369, 448, -999, 129, -455, -51, 35, 76, 267, 212, 174, -243, -512, 419, -123, 957, -869, 220, -62, -279, -253, -126, 294, 181, 200, -46, 536, 94, -699, -551, -75, -324, -402, 92, 444, -62, -99, -642, 317, -103, 658, -223, -1261, 154, -373, -190, 4, -1025, -537, -880, 18, -64, -245, -1165, -472, -102, + 611, 673, 56, 51, 330, 74, -798, 702, 958, -415, 147, -416, 175, -4, 730, -818, -591, -1870, -661, 471, 756, 535, 489, -461, -151, 372, 360, 811, 387, 346, 627, 157, -686, -738, -997, 416, -637, 55, -558, -865, -1306, 184, -377, -411, 119, 122, -47, -190, 29, 430, 302, 109, -164, 310, 706, -157, -382, -318, 347, -186, -156, -630, -605, -470, -1036, -60, 5, -418, 186, 278, 207, 514, 145, 607, 42, 165, 675, -331, -16, 97, -3, -471, -15, -94, 813, -56, -334, 250, 104, 233, 522, -94, -6, 294, 136, 13, + -37, -163, 175, -1499, 626, -449, 54, 1062, 889, -355, -152, 546, -344, -362, -302, 71, -106, -43, 125, -120, 522, 1248, -531, -983, 975, -762, -208, 4, 1218, 91, -373, 356, 337, -1281, -379, 207, -53, -610, -49, 236, -1880, -872, 926, -930, -1035, -640, 755, -990, -1548, 1550, -462, -976, -61, 603, -600, -1048, -31, 471, -59, -1347, 311, -24, -607, 1408, 1325, -105, -547, -1052, 1616, 222, 281, 556, -404, -1576, 703, 1199, 957, -599, 342, 1308, 756, -910, -206, -715, 315, 194, 820, 812, -985, -36, -108, 145, -386, 391, -255, 226, + 200, 165, -282, 213, -418, 681, -352, -176, 429, 377, -399, 61, -189, -461, -251, 184, 358, 221, -377, 208, -244, -573, 24, 102, -96, -47, 385, 24, 39, 183, -57, 98, -617, 461, 165, -1561, 159, 1449, 784, 193, -31, -276, 368, -526, 1201, -104, 311, 437, -430, 5, -65, -473, -14, 164, 668, -13, -435, 199, 535, -102, 855, -685, 128, 185, 214, 742, -425, 56, -41, -993, 127, -332, -550, 219, -217, 761, 543, -415, -894, 408, 72, 166, 479, 1061, -196, 211, -449, 604, 426, 449, -524, 694, -256, -318, -630, -65, + -257, 901, -693, 39, 212, -218, -428, 1263, -69, 292, -130, 144, -119, 347, -58, -165, -116, -146, 412, 286, 388, 214, 116, -284, 283, 14, 152, 132, 348, -60, 2, 49, 104, 110, 257, -230, 158, 138, 121, 102, 81, 253, 91, -352, 198, 230, 239, 100, 258, 66, -26, 144, 78, 185, -25, -179, 33, 259, -144, 103, 5, 283, 253, 94, 175, 263, 118, 212, 509, -1355, -3802, -3615, 1571, 153, 3475, 7361, 1612, 2966, 1583, -5461, -2444, -3674, -5393, -363, 638, -2549, 2265, 3851, 2360, 6632, 4072, 36, -613, -2349, -5858, -4748, + -2044, -4498, -1326, 2569, 765, 649, 6078, 2342, 1481, 5622, 268, -287, 2594, -1294, -4635, -2247, -4632, -6770, -748, -3077, -2508, 2164, 4203, 1941, 7426, 5912, 3432, 4489, 1524, -2205, -3391, -4527, -7243, -5812, -3895, -3324, -1031, 2519, 3835, 4268, 5745, 4831, 2268, 820, 1248, -1943, -2970, -2115, -4438, -3347, -572, -2000, 795, 3246, 1165, 1654, 2365, 246, 145, -582, -2221, -1172, 23, -895, 691, 936, -379, 1189, 1032, -1618, 1236, 1431, -1010, 2336, 362, -2313, 1618, -1273, -4502, -753, -2734, -3333, 2057, 252, 527, 4328, 2760, 3059, 4934, 3618, 1206, 510, -3429, -6252, -6207, -6238, + -5886, -3604, 189, 3376, 4977, 6803, 6332, 5968, 4716, 789, -2162, -2387, -4999, -6203, -3720, -3350, -1855, 332, 900, 1066, 2134, 1855, 1759, 2468, 2053, 1283, 1134, 235, -714, -1280, -1548, -2101, -1764, -1404, -1092, -360, 369, 635, 917, 1071, 1038, 791, 639, 278, -22, -140, -145, -284, -220, -146, -166, -164, -42, -228, -263, -259, -401, -449, -264, -225, 126, 544, 726, 738, 699, 455, 332, 123, -208, -547, -653, -712, -639, -476, -217, 30, 307, 483, 508, 425, 318, 118, -34, -156, -228, -249, -159, -84, 29, 108, 170, 163, 109, -19, -108, -182, + -202, -180, -118, -57, 35, 94, 133, 148, 141, 101, 69, 33, 1, -29, -42, -52, -45, -33, -21, -15 } + }, + { + {-154, -59, 36, -29, -89, -6, 205, -105, 24, -44, -2, -79, 148, -77, -82, -92, 176, -105, -27, -49, 50, 81, 103, -145, 0, 139, 62, 24, -8, -17, 63, 142, 34, -182, -94, -98, 159, -16, 121, -76, 56, 159, -78, -120, 43, -45, -8, -107, -43, -80, 30, -145, -48, -37, -5, 197, -64, -29, -7, -51, -20, -18, 119, 62, 73, -102, 75, 79, -70, 33, 47, -52, -72, 84, -126, 89, 53, 24, -116, -40, 43, -10, -24, -31, -3, -62, -73, -11, -12, 9, -27, 1, 43, -1, 16, 7, + 8, 1, -9, -31, -19, 22, -10, 2, -3, -96, 103, 13, -43, -65, -17, -32, 1, -81, -62, 47, -12, -30, -142, -20, 134, -89, -21, 101, -57, -106, -81, 69, 2, -9, -20, -102, 36, -45, -23, 117, -63, -156, -46, 10, 48, 42, 15, -119, -27, -145, -131, -35, 140, -23, -273, -11, 93, 81, -56, 55, 60, 6, 82, -147, -104, -13, 44, 8, 31, -15, 40, 36, 58, -8, 36, 34, -27, 57, -13, -143, -117, -76, -60, -64, 20, -32, 112, 93, -16, -44, -38, -20, 34, 53, 7, -30, + 6, 8, -30, 40, 1, -8, -15, -3, -22, 17, -4, 4, -26, 16, -16, 1, 1, 12, -4, -12, -5, -24, -9, 3, -12, 3, -8, -22, 124, 69, 187, 11, -38, -25, 132, -38, 70, -123, -14, -5, 69, 47, 118, 82, -63, -122, -100, 65, -43, 90, 56, 11, -7, 75, 52, -57, 61, -131, -19, -122, -104, -146, 41, 80, -17, 113, -90, 104, -216, 81, 35, 157, 45, 55, 84, -6, -56, 57, 137, 45, 66, -24, -4, -199, -14, 29, 37, -31, 104, 195, -67, -144, 93, 19, -102, -4, + -48, -103, 11, 140, 34, 49, 23, -17, 53, 31, -4, 44, 2, -15, -11, -29, 26, -42, -6, 64, -15, -4, 24, -18, 44, -65, -29, -1, -26, -30, 6, -18, 21, 46, -19, 25, 7, 0, 0, 4, -55, -16, -13, 8, 44, 24, 69, 102, 98, -98, 150, -55, -102, -151, 33, -199, -14, 19, 53, -127, 80, -3, 16, 51, 31, 43, -171, -13, -40, -112, 63, 31, 24, 94, 333, -26, 15, 46, 81, 31, -276, 56, -47, -33, 148, 3, 73, 107, -137, -77, -41, -133, -284, 12, -108, -18, + -26, -7, -67, -139, 37, -133, -44, 29, -149, 151, 50, 42, -64, -12, -26, 29, -50, 77, -123, 39, 181, 151, -55, 76, -74, 32, -139, -6, 83, 97, 86, -16, 161, 14, 79, 72, -5, 33, 15, 5, -30, 15, 23, -11, 0, -20, -47, -8, 28, -25, 63, -19, -37, -30, 21, -18, 26, -7, -30, 15, -10, 33, 18, 19, 11, -60, -17, 7, 22, 0, 2, -17, 224, -283, 13, -174, 90, 130, 158, -24, -149, 4, 156, 34, 30, -116, -15, -203, 272, -14, -208, 227, 57, 68, -14, -81, + -26, -107, -105, 84, 119, -24, 113, -92, -57, 1, 157, 148, -41, -83, 122, 78, 12, 103, 25, -120, 128, 80, -9, -41, 36, -130, 348, -17, -12, 259, -23, -158, -85, -18, 64, -164, 113, 35, 5, -149, -125, -263, -22, 124, 62, 150, -82, -58, 314, -86, 53, -43, -128, 11, 58, -135, -239, 11, -147, -148, -72, 79, 8, -22, -91, -31, 12, -34, -24, 25, 87, 13, 23, -60, -30, -6, 1, -85, -61, -53, -2, 21, 10, -27, 3, -5, -7, -44, -15, -6, -16, -23, -30, -300, -5, -127, + -144, 41, -172, 3, 115, 62, 243, -409, 260, -45, 113, -80, -60, -216, 189, 166, 41, -192, -12, -112, -15, 196, 136, 28, 187, -5, 8, 17, -8, -134, 281, -30, 1, 326, -213, 76, -103, -23, 102, -47, -169, 314, 245, -11, 78, 130, 340, -46, -63, -187, 31, 63, -197, -211, -185, 218, 4, -92, 150, 106, 1, -54, 48, -121, -32, -131, -30, 121, -241, 55, -51, -167, 100, 158, 67, 165, 143, -123, -196, -99, 85, -78, -151, 96, 163, -120, 20, 34, 18, -113, 64, -51, -40, -73, -38, -57, + -6, -7, 21, 33, -29, -26, -11, -46, -26, -13, -18, 34, 44, 10, 65, -59, 45, -51, -23, 46, 225, 239, 41, -204, -27, -194, 82, 514, 128, 356, 132, 6, -330, -80, 56, 322, -141, -69, -122, 32, 259, -188, 127, 224, 51, 83, -145, 277, -58, 360, -2, -109, -336, 43, 2, 403, -120, -31, 256, 3, 35, -82, -262, 30, 153, -188, -148, 41, -315, 175, 177, -52, -19, 91, 180, -14, -109, -3, 264, -32, -39, -98, 342, 346, 25, -61, 55, -13, 91, 161, -12, 231, -88, -126, -185, 64, + -14, -282, -203, -116, 224, -64, -103, -27, 2, -94, -143, -49, -41, -85, 16, -53, -46, 47, -90, -93, 32, 78, -44, -59, -44, -78, -36, 27, -25, 16, 44, -12, -21, -69, 42, 5, -227, 228, 173, 12, -151, -170, -75, -336, 387, 291, -64, 107, 34, -65, 293, -25, -138, 435, -474, 121, 202, -3, -194, 206, 31, 299, -118, -34, 79, 119, 19, -43, 436, 187, -201, -303, 209, -303, -89, -349, -46, 519, 212, 250, 1, -278, -47, -136, -61, 388, -62, -431, -36, 83, -274, -47, 175, 137, -185, -97, + 187, 247, -73, 258, 3, 64, 96, 20, 101, 154, 149, 145, -78, -313, -345, 84, -70, 244, -45, 290, 98, 134, -157, -140, 103, -7, 20, 26, 12, -141, -65, -23, -117, -5, -101, 16, -57, 41, -15, 73, -1, 39, 12, -39, -34, -47, 91, 9, -28, 28, 47, 38, 8, -70, -192, -110, 0, -94, -3, -17, -19, 113, -19, 186, -29, 174, -362, 123, 97, 48, -239, -200, -254, 189, 96, -183, -183, 239, 74, -24, -155, -252, -106, 95, -163, 14, -302, -88, 30, 97, 189, -36, 118, 164, -178, -417, + 278, 8, -71, 265, -47, 6, -188, 232, -157, -198, -81, 189, 289, 243, 71, 45, -527, 232, -38, 94, -186, -39, -208, -75, -56, -273, -141, -115, -153, 272, -96, 356, -50, -26, 220, 253, 429, 293, -12, -147, -23, -5, -215, 47, -141, -234, 438, -288, -307, -49, 161, 19, 47, 17, 182, -8, 46, 62, -77, 6, 110, -69, 42, 78, 63, 139, 27, -2, 74, 10, -32, 49, 77, 28, -5, 21, 9, 162, 9, 131, 85, 17, 137, 152, 11, -8, 17, 18, 15, -17, -23, 36, 4, -92, -134, -549, + 128, -376, -223, 367, 286, -627, -575, 25, 253, -142, 158, -203, -18, -362, -90, -326, -18, -85, 16, 133, 110, 212, -20, -170, 158, -204, -79, 73, 19, 113, 224, -30, 33, 56, -84, -18, -316, -375, -363, 6, -365, 130, 54, -141, -167, -68, -57, -26, -216, -343, -15, 559, 309, -72, -326, -336, 386, -353, -114, -58, -235, -176, -239, -280, -393, -531, -73, -81, -72, 185, 174, 50, 153, -116, -145, 502, 214, -127, -362, 119, -213, -252, 3, 422, -79, 2, 290, -27, -188, 13, 72, -1, -75, -70, 1, 75, + 37, 52, 32, 147, -39, 81, -203, 100, 53, -32, 46, -38, 78, -33, -57, -30, 71, 64, 10, 84, -114, 122, -56, -66, 12, 31, -461, 47, 224, 244, 226, 92, 451, -186, -337, -93, 53, -73, 140, 297, 608, 379, 220, 279, -242, -459, -160, -346, 379, 80, -86, -282, 431, 368, -144, -35, -7, -233, -194, -348, 96, 110, 189, -329, 25, 84, -151, -320, 4, 174, 235, 32, -616, -227, -306, 117, 360, -9, -348, 73, -336, 175, -85, 21, -239, 484, 385, -131, -118, -294, -23, 385, 87, 475, 463, 380, + 225, 70, -315, -183, -418, 469, 478, -48, -370, 226, 556, -17, 69, -145, -15, -377, 56, -299, 197, 60, 278, 268, 150, 13, 24, 162, 62, -50, -114, -47, -173, 20, 133, -124, -64, -140, 94, -39, 202, -202, 52, -17, 193, -103, 64, 106, 22, -17, 8, 24, -87, -46, 116, 132, -316, -90, 208, 372, -418, -505, -438, 453, -208, 298, -19, -9, 737, -105, 41, -347, -532, 115, -91, 126, 77, -56, -310, 70, 97, 38, -294, 171, 121, 534, -266, 23, 286, 292, -2, 295, -92, -2, 263, 219, 49, -135, + -454, -349, 245, -22, -114, -102, 52, 577, -50, -222, 288, -161, 272, 53, 841, -183, -41, -18, 114, 276, -70, -116, 177, -417, 314, 585, 165, -143, 323, -145, -31, 663, -406, 134, 254, -131, 554, 118, 109, -235, -339, 40, 136, -368, 344, -18, 77, -16, 91, 310, -87, 313, 145, 91, 172, 146, -109, 190, 182, -190, 52, 125, 253, 43, 64, 113, 143, 216, 11, -12, -27, 141, 124, -169, -15, 86, 138, 98, -101, 204, -19, 57, 15, 164, 82, 65, 76, 106, 79, -41, -26, 25, 168, 33, 17, -25, + 23, 53, 67, 13, 79, 92, 155, -420, -115, 300, -134, -216, -191, -197, 45, 301, -29, -647, 9, -490, 202, 220, 13, 107, -209, -22, 273, -619, 169, -130, 359, 248, 167, 34, -240, -559, -20, -488, 315, 10, -139, 526, 280, -201, -154, -102, -69, -139, -269, 57, 91, 758, -14, -532, 11, 373, 38, -271, 186, -412, 291, -171, 197, -238, 124, -422, 1137, 48, 789, -70, -201, 207, -239, -242, 446, 426, -357, -974, 945, -322, -243, -118, -118, 128, -73, 76, 415, 100, -312, -259, -183, 124, -192, -27, 201, -505, + -30, 35, -66, -147, 71, -104, 291, -108, 138, -122, -76, 8, -114, 76, 81, -53, 85, -118, 73, -31, 6, -53, 17, -212, -139, -30, -70, -174, -214, -130, -40, -93, -3, -155, 17, -138, -22, -180, 114, -101, -59, -52, -478, -168, -144, -411, -725, -177, 14, -384, 192, -163, 326, -277, -114, -395, 950, 803, -177, 181, 553, -577, 590, -242, -242, 213, 80, 102, -83, -126, 19, 192, 167, -255, 298, -275, -458, 336, 298, -383, -474, -550, -78, -90, 158, -359, -448, -229, 759, 266, 260, -322, 295, 399, -307, 744, + 141, -264, -345, 200, -289, -634, 158, -6, 18, 348, 327, -278, 57, -813, -98, -320, 677, 41, 99, -392, 322, -691, -80, 271, 82, -75, -75, 84, -28, 78, -100, 20, 61, 165, 45, 53, -34, 98, -98, 31, 311, -60, 18, -98, 141, 64, -12, 161, -165, -161, 179, -147, -50, -135, 78, -197, -84, -64, 162, 157, -248, 39, 133, -87, -280, -138, 215, -65, -31, -137, -351, 446, 471, 426, 288, -3, 390, 354, 60, -67, 158, 1, -396, -47, 152, -310, 444, -462, 371, 403, -115, -91, 172, 538, 404, -486, + -105, -130, -38, 122, -226, -238, 529, 13, 759, -495, -468, 382, -251, 137, -296, 255, 292, 192, -117, -435, 45, 144, -360, -665, -21, 60, -390, 718, -80, -204, 956, 898, 92, -125, -31, -192, 218, -471, 444, 58, -254, 533, 88, 108, -150, -290, -714, 157, -241, -118, 333, 134, -155, -469, -127, -534, 231, 479, -65, -363, -250, -362, 7, 194, 236, -50, -253, -134, -136, 33, -74, -123, 107, -20, -72, 125, -285, 82, 79, 446, 45, -100, -225, 196, -235, -32, 172, -319, 301, 62, -8, 59, 205, -102, -309, 6, + -88, -41, 307, 286, -31, 88, -787, -1823, 612, 580, -203, 130, -438, 788, 504, -445, 128, 108, 12, -200, -144, -940, 399, 465, -106, 1, -52, 313, -235, 597, 178, -708, -401, 901, 592, -586, -137, -208, -358, 57, -143, 129, 1170, 320, 1226, 701, 791, 721, 1412, -92, -130, 339, -99, -1183, 961, -415, 551, -782, -621, -1168, 233, -107, -391, 286, -548, 3, -784, -783, 221, 459, -636, -168, -441, -612, -688, -494, 378, -298, -859, 1236, 775, 1246, -162, -267, -247, -438, -705, -44, -154, -534, -177, 158, -378, -341, 40, -55, + -168, -138, 308, 328, 11, 83, 234, 293, 60, -24, -44, 138, -58, 35, -53, -205, -5, 195, -201, 266, 335, 142, 12, 55, 36, -222, 19, 128, -114, 2, -52, 37, -79, 30, 125, -170, -145, 270, 110, -34, 42, -149, -664, -1741, 754, 901, -408, -177, -45, 1020, 33, 218, 215, -240, 203, 475, -95, -457, 114, 868, -460, -287, 190, -121, 650, -162, 293, -334, -402, -401, 426, -128, 378, 441, -114, 58, 3, -360, 119, -326, 386, 945, 1551, -19, -44, -656, 355, 508, -15, 570, 815, 343, 464, -715, -429, 594, + 1549, -284, -910, 232, -302, -16, 420, 8, -415, -198, -214, -1054, -440, 7, 175, 368, -61, -405, -233, 100, -164, -407, 419, 1014, 439, 546, 56, -138, -825, -182, 234, 183, -185, 468, -132, 262, -577, 34, -199, -166, 5, 160, 157, -163, -314, 304, -119, 250, 22, -63, 20, 54, 231, 8, -37, -119, -132, 199, 66, 183, -393, 273, 158, 74, -142, -52, 285, -34, 11, -220, 20, -337, -71, 98, 286, 142, 252, 58, -43, -247, 556, 187, 293, 117, 837, -260, -101, -324, 197, -200, 187, 949, 190, -999, -241, -289, + -854, 548, 261, -96, 125, 56, -382, -1, -24, -380, -111, 828, 1217, 575, -420, -667, 319, 557, 65, 446, -306, -212, 459, 146, 9, -1016, -1325, -41, -774, -449, 281, 1113, 244, 57, -319, -382, -554, -488, 94, 337, -116, -550, -886, 355, 26, -493, -826, -559, -909, -1644, -990, -147, -194, 1980, -239, -73, 1142, 135, 67, 687, -406, -999, -1160, -180, -554, -616, -653, -717, 143, 649, 1032, 612, 129, 68, -262, 532, 112, -161, -661, 137, 486, -23, 1, -238, 136, 268, 445, 125, 191, 170, 224, 275, 289, -80, 221, 45, + -149, -347, -411, 42, 103, -414, -198, -398, 135, 205, 321, 464, 788, 583, 602, 355, 239, -143, 69, 3, -359, -562, -416, -544, -339, -473, 625, -887, 224, 141, -386, -1244, 847, 251, -80, -1260, 335, 195, -665, 111, 584, 358, 170, -571, -116, -213, 101, -215, 53, -442, -635, 697, -481, 1059, -653, -592, -401, -744, 66, -15, 1113, -825, -869, 448, 287, -720, -957, -107, -539, 620, 132, -793, 515, -136, -1218, 799, -543, 521, -906, -223, -25, -382, -156, 103, 1144, -310, -107, -330, 327, -543, 424, 893, -55, 898, 706, -109, + 1441, -86, 167, -44, 407, 1451, -119, -403, -1553, 1201, 429, 1025, 350, -808, 359, 229, 148, -718, 410, 82, 118, -387, -112, 489, 420, 17, -50, -52, -56, 119, 308, -631, -186, -89, 101, -130, 140, 134, 199, -148, -334, 518, 814, 284, -417, -360, -154, -123, 221, 109, -81, -515, -368, -417, -40, 398, 176, 336, 129, -561, -100, 244, 545, 341, -229, -172, -131, 78, 95, -12, -33, -107, 857, -1638, 68, -1845, -615, -309, 568, 1713, 1456, 540, 862, -552, -465, 88, -121, 400, 130, -381, 578, 849, 706, 529, 448, -10, + 84, -282, 803, 377, -148, -488, 169, 332, -83, 1050, 1096, -627, -463, 28, 852, 533, 140, 108, -198, -378, 215, 1308, -524, -641, -698, 686, 282, -387, -603, -969, -1149, 131, 257, 212, -250, -81, -313, 232, -916, -1507, -677, -101, -253, -586, 760, 1267, -280, 656, 1399, 914, 327, -958, 159, 177, -848, -467, -132, -674, 743, 1058, -60, -240, -127, -304, -169, -427, -419, -152, -207, 155, -92, -113, 210, -636, -75, 56, 652, -662, -106, -148, 126, -420, -146, 133, -229, -388, -62, -27, -382, 455, -617, -66, -226, 141, -64, -179, + -360, 15, 183, -125, 86, -1045, 843, -107, 724, 439, 17, 480, -211, -54, 413, 507, 78, 3, -17, -461, -300, 123, -643, 17, -242, 16, -545, 93, 30, -496, 414, 176, 280, -623, -168, 117, -33, 45, 357, 79, 100, -72, -138, -98, -51, 231, -105, -398, 322, -547, -172, -188, 66, -268, -317, 416, -53, -418, 255, -583, 467, 145, 22, 481, 535, 74, 152, -402, 519, -254, -355, -31, 77, 981, -441, -725, 621, -237, 620, -105, 41, -272, 376, -630, -522, -207, 247, 147, -38, 302, -375, -379, -252, 89, 110, 22, + -16, -115, 65, -523, 106, 106, -126, -49, 158, -84, -223, 270, -135, 33, -11, -69, 183, 78, -190, -22, -45, -170, -37, -63, -348, 106, 213, 169, -158, 158, -254, -80, 6, -165, 520, -218, -2716, -5186, -1841, -4059, -4627, 1143, -149, 1563, 6016, 6522, 4607, 6568, 5400, 1797, 1896, 1405, -3613, -3721, -2067, -3612, -3905, -1303, -1146, -3290, -2478, -396, -1465, -1793, -441, -1371, -2431, -1381, 461, -971, -1199, 1439, -237, -1349, 1241, 2294, -523, 578, 3550, 495, -1131, 2358, 2061, -2031, 1173, 2598, -803, 289, 4497, 3433, 1732, 6315, 7030, 3598, 6474, 8359, + 5248, 4952, 6873, 4421, 2814, 3116, 1624, -1883, -3649, -4951, -8455, -10288, -11665, -13191, -13008, -14099, -12596, -9348, -9349, -7369, -658, -378, 193, 5290, 4179, 1394, 2774, 4127, 1529, 1843, 4190, 3052, 624, 2516, 3547, 1527, 1912, 4364, 1635, -689, 2012, 1409, -965, 1901, 4214, 1986, 3107, 6725, 5593, 5300, 7898, 7295, 5028, 4373, 3920, 1469, -58, 211, -825, -2626, -2615, -3002, -5141, -5750, -5513, -6184, -7421, -6499, -6284, -6703, -5191, -3509, -2747, -1730, 62, 695, 581, 965, 1059, 544, 496, 973, 841, 572, 689, 805, 610, 793, 1213, 1335, 1283, 1497, 1588, 1314, 1507, 1387, + 865, 446, 193, -12, -173, -127, -129, -254, -274, -102, 124, 442, 632, 762, 791, 710, 709, 879, 852, 824, 952, 901, 670, 696, 664, 404, 330, 406, 188, -22, -66, -293, -620, -666, -755, -1049, -1165, -1093, -1247, -1336, -1186, -1173, -1223, -1075, -865, -821, -703, -499, -497, -483, -365, -245, -185, -17, 134, 185, 256, 423, 578, 666, 786, 793, 712, 618, 558, 503, 434, 357, 281, 215, 162, 150, 136, 103, 87, 71, 39, 17, 3, -11, -22, -27 }, + {-135, 110, 118, -57, 118, -73, -17, 157, -66, 74, 45, -177, -80, 131, -52, -26, 82, 54, 58, 15, 202, 34, -53, 44, -71, 125, -37, -70, -31, -166, -57, -122, 39, -3, 44, -50, 68, 31, -8, 20, 10, 15, 21, -88, 216, 31, -80, 160, -39, -140, -153, 147, -30, -13, 98, 10, -26, 76, -9, 43, 12, 55, -30, 60, -29, 72, 106, 57, -64, -66, -32, 27, -68, 46, -34, 58, 76, -96, -54, 82, 24, -27, 127, 73, 60, -8, 33, -4, 16, -16, 19, 6, 9, -30, 47, 14, + 3, -9, 19, 30, -17, 32, -2, 138, 26, 30, 116, 0, 83, 39, -11, 8, -93, 41, 6, 142, 50, 46, 5, 41, 156, -150, 83, 21, -99, -45, -62, -21, -57, 38, 180, 113, 135, 106, 184, 133, -169, -306, -39, 13, -75, 159, -8, 239, -113, -114, 103, 4, 8, 94, -176, 44, -126, 165, 97, -2, 252, 10, -25, -33, -45, -64, 119, 62, -62, -22, -176, -79, -24, 183, 125, 21, 92, 2, 98, -1, 40, -107, -69, 24, 13, -7, -54, 48, 58, -16, -55, -11, 58, -11, 31, -29, + -17, -24, 18, -21, 3, -3, 29, -26, 28, 43, -21, 9, 3, -2, 53, -19, 13, -21, 21, 14, 9, -8, 47, -4, 2, 19, 53, 112, 253, 75, 12, 9, 72, 68, 16, 41, 58, -2, -4, 74, 286, 97, 224, -124, -101, -40, -132, -155, -61, 117, -191, -25, -21, -301, 62, -305, -100, -39, 74, 3, 65, -58, -2, -205, 77, -67, -114, 24, 60, -8, 17, 90, 158, -262, 74, 20, -77, -82, -16, 39, -34, -157, -36, 45, 84, -9, 198, 20, 10, 83, -125, 189, 61, 113, 51, 95, + -18, -15, 56, 35, -25, -54, -45, -91, -2, -122, 9, 75, -6, -51, -97, 90, -51, 38, 14, -13, -92, 11, -8, 26, -28, -24, 9, -27, -51, -25, -21, -2, -33, -3, -19, 47, -8, -21, -8, 26, -9, -37, -42, 49, 1, 7, -27, 149, 163, -6, 180, 10, -25, 21, 14, -35, -3, -127, -73, 112, 132, -156, -38, 63, -104, -298, 73, 109, 128, -69, -80, -107, 161, 184, 31, 72, -146, -119, 137, 51, -110, 190, -192, 31, 18, 178, 65, -41, 29, -63, 98, -235, -70, -337, -147, 169, + -15, 260, -36, -219, 138, 29, -90, -12, 10, -89, 57, 155, 176, 4, 84, -9, 200, -103, 86, -20, -4, 5, 69, -22, 251, 24, 22, -40, 147, 50, -50, -107, 2, 100, 35, 29, -66, -4, 20, -11, -18, -19, -35, 26, 2, 11, 21, 52, -21, -56, 60, -17, 6, 0, -7, -8, 24, 21, 29, -11, 27, -1, 16, 26, -6, 3, 23, 34, 19, 22, 7, 2, 181, -252, -37, -172, -178, 60, 31, 360, 16, 131, -306, -75, 64, -160, 102, 28, 23, 86, 100, 236, 104, -40, 73, -121, + 32, 94, -9, 17, 103, 134, 327, 62, -51, -228, -12, 169, -269, 27, -22, 81, -136, -160, 283, -185, 57, -14, -181, 410, 104, 214, 115, 234, -45, -91, 149, -141, 114, -113, 61, 161, 88, -75, -14, 81, -146, -109, 7, -19, 242, -136, -230, -36, 125, 203, -129, -218, -49, 298, 38, -2, -109, 13, -8, 91, 94, -8, 44, 49, -148, -36, 49, -9, 84, 32, 7, -64, -8, -11, 31, -12, 88, -19, -11, -46, 8, -58, 1, -8, 21, 50, 0, 42, -4, -55, -12, 3, 29, -95, 111, -393, + 225, 67, -87, 122, -321, -268, 36, -131, 307, 273, 290, -191, 114, 6, 289, 22, 205, 83, -85, -257, -233, 77, -311, -3, -72, -150, -207, -121, 3, 253, 2, 100, -356, -198, -37, -222, 17, 226, -242, 102, -2, -81, -22, -50, 248, 135, 124, -57, -74, 342, -102, -91, -280, 207, -398, 57, -130, 64, 142, -94, -212, -129, 15, 291, -144, -30, -187, -149, 94, 102, 229, -265, -2, -139, -93, 58, -105, -207, -119, -17, 192, 197, 68, 12, 29, 91, 8, 16, 41, -53, 6, 83, -24, 11, 99, -22, + -4, 18, 72, 1, 11, 28, 12, 62, -71, -77, -5, -27, 1, 46, -19, 83, 54, -366, 101, 36, 64, -505, 455, 12, -8, -7, -162, 55, 8, 164, -140, 184, 54, -111, -193, -242, 125, 24, -19, 19, -138, 154, 116, 283, 169, 113, 157, -34, -153, -114, 12, -79, 124, -135, -205, -225, 16, -309, 144, 165, -184, 192, -222, 115, -329, 47, -59, 26, -86, -3, -306, -50, -104, -194, -50, -151, 51, -136, -77, -196, 89, -187, -12, 305, -50, 11, 100, -66, -306, -349, -57, -244, 14, -65, 231, 18, + 88, -229, 22, -50, -40, 169, 43, -18, -89, 47, 67, 25, 90, -2, 51, -25, -7, 15, 17, 33, -6, 99, -26, -81, 36, 0, 27, 33, 23, -11, -41, 26, -73, 30, 150, 104, -311, -7, 59, -290, -330, 186, -324, 67, 221, -155, -373, -158, 12, 252, -98, 442, -27, -31, -250, -176, -27, 92, 28, -87, -73, -17, -91, -184, 158, -152, -92, 168, 52, -261, -279, -256, 227, -238, -257, 428, -264, 191, -34, 118, -380, 179, 25, -59, -16, -72, 127, 94, 364, -88, -66, 175, 352, 99, 73, -162, + -107, -285, -59, -4, -1, 212, -63, 115, 368, -53, -11, -40, -5, -369, -423, 25, 282, 6, -562, 150, -195, 98, -350, -216, -53, 13, -127, 60, 132, -13, -16, -9, -59, 61, -67, 61, 10, 22, -59, -38, -82, 42, 7, -23, -79, -15, -23, -49, -58, 39, -66, -23, 59, 20, -32, -2, 3, -84, 10, -52, -69, -5, -18, 156, -26, 184, -28, -78, -113, 156, 96, -87, 71, 159, -84, -542, -236, -107, -61, 242, -425, -312, 261, 161, 656, 185, 151, 180, 83, -118, 13, -124, 209, 9, 211, 6, + -6, -288, 149, -196, 151, -30, 159, 63, 213, -334, 39, -232, 278, 17, -279, 369, 273, 175, -167, -562, 162, -61, -70, 275, -27, 127, 266, -59, -338, -3, 151, 98, -91, -38, -247, 92, 34, 52, -37, 35, 213, -133, 97, -35, -8, 383, -103, 176, 127, -121, -135, 48, 29, -65, 32, -67, 62, -60, 146, 13, 140, 26, -4, 175, 62, -52, 49, -42, -55, 25, 70, -67, 45, -35, -68, -4, 70, -33, -76, 23, -35, -118, 51, 0, -60, -36, -20, -67, -5, 87, 125, -119, 16, 139, -156, -613, + 124, 148, 619, -131, -101, 292, 384, -629, -360, 342, -180, 10, 140, -401, -878, -345, 497, 395, 334, -103, 187, -103, 172, -184, 60, -443, 107, -157, 226, 219, 7, -210, 205, 129, 355, -38, -222, -111, -563, -288, 137, -38, -377, 255, 349, -497, 478, -46, -54, 301, 61, 285, -39, 101, -110, -59, 143, 572, -209, 364, -32, 34, 136, 317, -295, 34, 464, 138, -215, 123, 182, 42, 364, 264, 459, -42, 130, -5, 15, -256, -179, -204, -100, -1, -44, -83, -74, 137, 197, 91, -104, 160, -48, -26, -98, -78, + 99, 33, -38, 6, -108, -91, -107, 2, -60, 93, 55, -40, 39, 109, -69, 50, 62, -58, -55, -62, -12, -18, 66, -23, 9, -29, -399, -102, 411, 261, 310, -201, -102, -32, -44, 441, 57, -454, -202, -139, 291, 57, 62, 247, 541, -800, 530, -105, -95, -207, 157, 163, 311, 49, 297, -31, -80, 92, -50, 152, 273, 32, -21, 359, -268, -50, 87, -31, 316, -374, 33, -320, 51, -339, -49, 11, 185, 459, -269, -148, -279, -16, -407, -264, -268, 180, 331, 4, 656, -417, 586, -414, -98, 181, 133, 582, + 335, -436, 227, -183, -604, -15, -383, 482, 731, 466, -92, -259, -97, 409, -62, 213, 23, 95, 143, 46, 56, 48, -180, 124, 1, 52, -70, -59, -171, -95, -60, 104, -53, 70, 87, -33, -23, 2, 99, 64, 36, 187, -4, 196, -176, -77, 124, 121, -74, 42, -63, -127, 13, -45, -417, -268, -11, 502, -100, 220, 466, -399, 168, -636, 380, -392, -193, 610, 205, 658, -286, 1, -303, 188, 845, 215, 284, -432, -86, 18, 323, 285, 539, -445, -158, -484, -412, 27, 29, 281, -283, 196, -657, 406, 306, 144, + -115, -81, 38, 191, 60, 51, -8, 440, 376, 161, 30, -340, -336, 913, 29, 111, 506, 222, -149, -112, 320, 656, -483, -203, -543, -505, 641, 285, 2, -131, 210, 487, 309, 503, 137, -230, 363, -266, -676, 195, 20, 8, -3, 278, 482, -103, 253, 282, 256, 27, 54, 247, -1, -82, -59, -109, 241, -147, -45, 57, 134, 16, -27, 257, 51, -60, 193, 246, 111, -109, -5, -51, 73, -2, -3, -12, -62, 83, 30, 17, 81, 107, -24, -126, -51, -20, 144, 47, -107, 32, 56, 153, 67, -13, 144, 2, + 74, -60, -2, -6, 25, -21, 199, -427, -319, -125, -397, 448, -50, -114, -378, -63, -352, -873, 152, -108, -275, 197, -463, -28, -252, -700, -160, -304, -331, 559, -149, -203, -101, -14, -141, -198, -31, 147, 474, 356, -13, -29, -794, 48, 109, 325, -183, -166, 1206, -208, -589, -574, 501, -336, 145, -680, 170, -192, -362, -316, -771, 122, 223, 547, 162, -299, 434, 49, 408, 450, 1304, 347, 92, -509, -567, -155, 62, -75, -513, 228, 598, 135, 425, 654, 590, -253, -470, -326, 43, 101, -56, -504, 98, -411, 126, -184, + 28, -229, 149, -42, 95, 8, -94, -234, -51, -10, 136, 181, 149, 210, 14, 179, 323, 2, 63, 175, 64, -168, -91, -283, -80, 160, 96, 14, -35, 99, 61, -65, -128, -249, 34, 31, -33, -87, -16, -93, 49, -176, -527, -229, -83, 161, -193, 312, -164, -216, 607, 315, 690, 8, -202, -274, 732, -630, -236, 854, -517, 170, 177, 221, 49, 480, -151, 432, -165, 94, 103, -223, 321, -488, -340, -317, -146, -434, -799, -146, -240, 126, -207, -1061, 294, 665, -39, -143, 1041, -1292, -280, 719, -177, 558, -411, -256, + 193, -1233, 398, -420, 615, 452, -656, 1292, 190, 68, -67, 509, -937, 382, -45, -149, 250, -606, 855, 776, -1437, 206, -287, -1349, -233, -603, 331, 84, 233, -545, 845, -84, -228, 390, -17, 277, -60, 437, 10, 218, 67, -20, -47, 244, -178, -200, 4, -235, 350, -78, -182, 18, 161, 76, 166, 63, 406, 95, -222, 420, -229, 239, 362, -102, 81, 253, -176, 13, -229, 248, 36, 787, -359, -1025, -1029, 77, 123, -455, 263, -574, 179, -263, 523, 671, 18, 649, 590, -335, -12, -427, -110, -103, 225, -46, -69, -75, + -689, -1039, -420, 536, 414, -448, -515, 294, 298, -677, 336, -452, -87, 517, 719, 1, -433, 273, 51, 447, 74, 372, 385, -113, -1487, 164, 35, 596, -222, 608, 603, -410, -2013, -273, 79, -245, 1205, 1265, 881, 1257, -330, 589, -501, 839, 587, -996, 1251, -1300, -1108, -1045, 328, 780, 649, 215, -817, 747, 101, -273, -352, 41, 705, -552, -223, 1080, 197, 492, 92, 49, 263, -413, 217, -171, 5, 107, -108, -216, -143, -189, -415, 88, 378, -80, 387, 298, -253, -202, -189, 237, 148, -506, -294, 22, 21, -79, 63, 325, + -12, 257, 23, -199, 125, 431, -798, -1506, 314, 552, -83, 760, 290, -951, -242, 199, 231, 259, -194, 437, 35, -286, -132, 154, 623, 814, 615, 976, -944, -264, -247, -966, -233, 163, 47, 105, -386, -437, 487, 1098, -523, 565, -374, 145, -345, -61, -860, -315, -52, -1191, -698, -1166, -985, 648, 1530, 1221, 33, -80, 1, -279, -531, -1862, -625, -270, 148, 76, -659, -462, 238, 815, 485, 260, 531, 914, 356, -922, 699, -548, -289, 541, 1221, 260, 1567, -378, -1637, -193, -531, -1005, 1506, 424, 487, -7, -139, 433, 356, 16, + -65, -267, -57, -83, 408, 494, 591, -73, -27, -29, -26, 385, -172, -136, -234, -185, 217, -51, -12, 60, 136, 224, 279, -46, -174, -301, 142, 49, 133, 362, 317, -170, 75, 160, -293, -95, -72, -282, -134, -19, 243, -406, -636, -1045, 654, -97, -629, 311, 694, 601, -1221, -1054, 269, -487, 130, 604, -321, -236, 996, 273, -134, -311, -277, 376, -219, -39, -25, -399, -152, -667, -890, 323, 492, -560, 417, 286, -191, -388, 64, 711, 411, 131, -703, -787, -381, 218, 890, -660, -347, -298, 533, 1431, 382, -1391, -306, -160, + 721, 20, 375, -178, -327, -305, -786, 740, 784, 318, 829, -254, 537, -243, -591, -655, -701, 128, -1315, 1387, -61, -522, -759, -620, -38, -405, -120, -722, -445, -1286, -355, -846, 317, -298, 255, 293, 314, -210, 717, -158, 520, 23, 128, -37, 228, -107, -282, 62, 86, 269, -423, -146, 114, -417, 5, 158, -522, -227, 129, -70, -399, -619, -371, 231, -115, 289, 72, 14, 425, 33, 366, 144, 229, 851, 511, -235, 132, -293, 14, -137, 1071, 804, 308, 160, 504, 457, -725, -1046, 357, 819, 1171, 7, -261, -730, -429, 492, + -14, -623, -1258, -1257, 265, -377, 706, -1448, -478, 283, 209, 277, -458, 211, -39, -271, -54, -679, 627, 775, 575, -914, -489, -21, 310, 462, 493, 397, -104, -64, -124, 657, 1817, 1149, -946, -929, -592, -1197, 1412, 756, -438, -1241, -1192, 1358, 833, 184, 1042, -1080, -120, 70, -280, 109, -404, -1093, 272, -834, 1120, 1063, -405, -185, 11, 125, 1191, 1224, -1935, -1075, -623, 248, 542, 531, -751, -799, -951, -112, 983, 27, 195, -219, -1052, 248, -442, -544, 238, 1846, 620, -338, -473, -434, -365, 490, 573, 671, -121, 435, -653, 164, + 236, 303, -236, 134, 542, -134, -156, -84, 535, 356, 834, 218, -299, -217, 308, 1041, 839, 183, -622, -754, -248, -175, 178, 82, -308, -379, 712, -1163, 1015, 1496, 1624, -1829, 337, -57, -157, 775, -330, -543, 537, 274, 1113, -113, -881, 27, -402, 657, -1012, -358, -475, -674, 924, -676, -96, 636, 369, -224, -353, -947, 122, 1248, 760, -54, 371, -281, 1019, -687, 471, -379, 633, 1052, -234, -683, 337, -932, 1543, 181, -819, -280, -1278, 163, 1830, -333, -1077, -752, 1122, 335, -590, -30, 289, 630, 1542, -1258, 560, 1265, -192, -1494, + -1448, -847, 2534, -1855, 628, -1953, -940, 4081, 391, -1779, -1711, -1970, 2485, 321, -471, -1974, -476, 618, 2010, -720, 218, -869, 298, 1223, 744, -1092, 514, 202, 472, 422, -1112, 39, -265, -419, 218, -406, -820, 315, -244, 1066, 156, -978, -1121, -355, 29, 860, 643, 153, -525, 223, -24, -413, 27, 549, 477, 121, -828, 209, 318, 526, 461, 340, -164, -532, -205, -124, -170, 258, -438, -118, -158, -204, 666, -1718, 302, -1544, 683, 731, 1443, 639, 332, 378, -449, -1102, -766, -723, 310, 181, -187, 660, 1018, -454, -638, 707, 126, -940, + -216, 427, -776, -137, 172, 396, 211, 560, 959, 170, -611, -70, 185, -485, -216, 449, -340, -614, 856, -206, -211, -340, -335, 555, 142, 127, 738, -352, -569, -33, 55, -241, 189, -40, -202, -36, -718, 161, 141, -122, 388, 262, 136, 174, -742, 880, -329, -318, 270, -804, 262, -602, 71, -476, 155, 210, 326, 29, 289, 436, -168, -98, 242, -14, -153, 133, 31, -100, -154, -140, -92, 315, -300, 305, 21, 83, 153, 91, 223, -12, -6, -136, -29, -187, 379, 28, -169, -276, -90, 147, -270, 359, -174, -455, 26, 193, + -26, -13, 47, -215, -130, -803, 1288, -70, 728, -667, 79, -124, 228, 205, 388, -204, 285, -183, 155, -32, 122, 308, -42, 480, -198, 362, 16, -19, -140, 230, -190, 208, -128, 11, -107, 112, -88, 271, -89, -196, 437, -308, 227, 182, 64, 210, -274, -191, 199, 186, -122, -29, 212, -23, -304, 129, -156, 151, 206, 95, 68, 64, -327, 155, 87, -101, 115, -156, 70, -79, -18, -44, 109, 214, -305, 266, -57, -110, 151, -214, 96, 144, -40, -80, 100, -45, 57, -32, -111, -20, 112, -34, 41, -27, -83, 47, + 43, 78, -118, 88, -12, -51, 105, -125, 185, 93, -75, 189, -19, -80, 4, -80, 112, -130, 128, 50, 67, 30, -80, 60, 26, 11, 8, 2, -35, 31, -83, 93, 35, -95, 321, -1090, -3395, -500, 1648, 852, 4006, 744, 861, 541, -1080, -1521, -1083, -1950, -1675, -951, -390, 1114, 3042, 2412, 2078, 1180, -936, -1525, -1121, -2102, -1989, -612, -279, -466, 771, 1204, 798, 1468, 1137, 345, 1046, 210, -155, 94, -630, -1661, -1410, -1201, -1681, -707, 491, 334, 1077, 1216, 1065, 1090, 1117, 704, 692, 72, -620, -1162, -791, -1094, -1442, -714, + -661, -542, 205, 543, 524, 1016, 1275, 613, 899, 763, -212, 85, 345, -427, -382, -683, -1220, -1229, -972, -1012, -197, 420, 284, 799, 1205, 946, 878, 897, 603, 194, 58, -283, -523, -568, -839, -1067, -1130, -978, -873, -503, 115, 549, 1265, 1667, 1468, 1212, 1034, 593, 127, -519, -1059, -1452, -1515, -1677, -1231, -519, -128, 347, 999, 1282, 1390, 1425, 1198, 502, -34, -373, -809, -1061, -989, -886, -632, -265, 36, 347, 459, 345, 388, 300, 212, 158, 171, 50, 59, -22, -83, -110, -89, -142, -157, -180, -152, -150, -117, -86, 13, 54, + 103, 141, 192, 179, 167, 127, 104, 51, -7, -69, -98, -143, -164, -168, -139, -139, -83, -29, 33, 77, 128, 127, 142, 139, 145, 128, 70, -26, -72, -124, -145, -135, -106, -105, -71, -53, -14, 24, 68, 97, 131, 127, 113, 77, 36, -6, -29, -65, -89, -107, -103, -88, -48, -16, 23, 50, 65, 67, 57, 33, 28, 15, 6, -8, -16, -23, -24, -25, -20, -15, -8, -5, 0, 1, 4, 4, 5, 3, 3, 2, 2, 2 } + }, + { + {-109, 82, 51, -107, -19, 136, 40, 33, 75, -18, 21, -36, -143, -57, -7, -32, 41, -45, -14, -122, 0, 20, -85, -19, -108, -39, -34, -131, -60, 41, 57, 146, 87, 187, -20, -31, 28, -65, 163, 9, 77, 128, 23, -53, 53, -70, -92, -24, -39, -52, -169, -56, 1, 25, 51, 13, 86, -97, 76, -2, 19, 53, -67, -151, -64, 62, 94, 70, 6, 71, 55, 97, 50, 41, -65, 4, -10, -14, -55, -70, -29, -17, -6, -54, 1, 6, 21, 3, 38, -22, 18, -35, -49, 23, -7, -3, + 35, 23, 31, 0, 3, -31, 18, 4, 11, -6, 47, -12, 3, -22, -16, -25, 20, -17, -42, -27, -77, 76, -119, -73, 196, -30, 173, -86, 18, 86, 39, 7, -114, -162, -169, 20, 6, -47, 25, -150, 302, 36, -166, 46, -86, -94, 91, 129, 0, 30, 63, -8, 2, 102, -53, -23, 8, 184, -2, -20, -67, -106, 58, -25, -109, -49, -132, 19, -119, 4, -90, -29, -79, -166, -67, -9, 160, 25, -44, 88, 146, 23, -196, 92, 1, 38, 66, -44, 127, -61, -110, -115, -205, 21, -69, -72, + -91, -96, -4, -105, 35, -15, -59, -21, -67, 3, -2, -77, -31, 33, -10, 6, 19, 9, 15, 11, -20, -69, -11, -25, 21, -8, 10, -12, 2, 0, -14, -43, -35, -5, -15, -16, -13, -32, -11, -148, 256, -61, -227, 21, 82, 10, 75, 62, -179, 68, -39, -4, 11, -30, 142, -40, -87, -5, 114, 73, 45, 68, 273, 74, -89, 124, -109, 40, -87, 256, 43, -80, -46, -80, -25, 171, -130, -110, -31, 142, 83, -126, 40, 32, -71, 6, -272, 94, -60, -50, -171, 267, 19, -136, -105, -133, + 14, -27, 19, 1, -155, 212, -115, -107, 87, 25, 86, -57, -8, -127, 16, 30, -160, -120, 16, -112, 45, -100, -25, -27, 77, -130, -133, -26, -18, -31, -5, -57, -11, -41, -31, -26, -38, -50, 0, -68, 23, -44, 4, 6, -12, -25, 1, -17, 40, -4, -26, 0, -49, -9, -28, 4, 12, -35, -41, -10, 221, 8, 49, -180, 57, 106, 77, -6, -90, 237, 42, -46, 114, 94, -109, 146, -96, 240, 35, 214, -22, 39, -83, -240, 27, 6, 9, -40, 50, 129, -31, -122, -81, -174, -48, -85, + -92, 18, 61, 97, -113, 81, -75, -92, -12, 83, 16, 22, -176, -168, -32, -48, -128, 283, 131, -16, 54, 115, -283, -141, 190, -104, 178, 43, -37, -188, -140, 228, 120, 216, -224, -13, -155, -10, 55, -81, 27, 19, -140, 128, 14, 21, -23, -246, 27, -57, -78, -75, -15, 46, -40, 22, -88, -16, -40, 59, -11, -4, -29, 5, -30, 22, -50, -21, 16, -11, -3, 0, -1, 26, 14, -1, -35, -33, -38, 36, 14, 51, 24, -18, 21, -370, 19, -48, 100, -224, 71, -76, 373, -100, -194, -71, + -163, 50, 138, -45, 261, 26, -78, 62, 31, 68, -93, -17, 97, 153, 60, -31, 73, -138, -43, 192, 137, 226, 160, -4, -116, -242, 166, -27, -177, 91, -47, -271, 6, -226, -19, 203, -35, -152, -71, 194, -170, -277, 280, -53, -69, 65, 35, 33, 67, 67, 37, -204, -78, 157, -22, -61, 47, 270, -138, -150, -69, 110, 55, -244, -109, -84, -107, 80, -15, -19, -91, -72, -193, -111, 46, 6, 30, -8, 113, 118, 20, 43, -60, 13, 5, 48, -74, -34, 8, 2, 33, -1, -42, 42, 15, -81, + -17, 24, 14, 14, -21, 11, -40, -39, -35, 21, -18, -20, -7, -326, -9, 85, 310, 320, -106, 158, -210, 66, 135, 205, -63, 309, -61, 261, -146, 219, -113, -370, -86, 89, -129, 140, -82, -91, 38, -405, -132, -11, -72, -27, -197, -70, -72, 62, 408, 234, -241, 128, 326, 79, -117, 79, -89, -100, 234, 162, -166, -25, 166, 350, -115, 189, 521, 222, -243, 95, 59, -294, 42, -243, 106, -265, -64, 8, 122, -174, -49, -87, -157, 199, 171, -12, -116, 29, 29, 26, 47, 147, 28, -201, -5, 239, + 6, 52, 47, 71, -77, -38, -122, -54, -113, -12, 65, -17, -64, 33, -14, 11, -35, -26, 44, -6, 107, 24, -24, 54, -2, -28, -41, -58, 24, -32, -15, 25, -3, 47, 3, -69, 142, -71, -328, 75, -264, 42, -88, 340, -173, 48, 89, 33, 123, -50, 373, 29, -242, -45, -179, -29, -58, -167, -210, -54, -135, -64, 238, 88, -202, 78, -241, -46, 175, -329, -291, 165, 155, 80, -10, -200, 79, -99, -189, -88, 10, 59, 312, -124, -36, 16, 145, 76, -109, -140, -251, -77, -56, -139, -161, 102, + 208, -2, -134, 230, 44, -115, 28, -35, -31, -80, -46, 149, -120, -180, -104, 93, -139, 243, 109, -41, -101, -115, 69, 151, 310, -91, 159, 4, -1, 16, 49, -58, 1, 37, 65, -42, 45, -36, 150, 56, 113, 0, 76, -5, 68, -15, -7, 79, 29, 8, 42, 8, 78, -60, 18, 53, 72, 61, -25, -81, -2, 49, 10, 8, 64, 169, 323, -242, -9, 220, -106, -159, 202, -320, -20, 59, -42, -120, -141, -68, 55, -18, 153, 77, -52, -122, -89, 252, 9, -309, 143, -195, -192, 117, 222, 226, + 171, -6, 116, 79, 109, -102, -6, -92, -222, 93, -58, -13, -49, 21, -37, 245, 456, 75, -80, -2, -326, 316, -223, -145, -214, -262, 443, 24, -247, -90, 305, 157, -232, -174, 350, 28, 36, 453, -217, 124, -163, -450, 211, 216, 36, -260, -37, -57, 53, -113, 164, 101, -356, 151, 170, 217, 37, -190, 318, 54, -29, -25, -107, -112, -41, 20, 96, 0, 8, -10, -86, 36, 38, 17, -40, -24, 64, 23, 73, -48, 17, -112, 12, 105, -141, 20, -111, 129, -54, -3, -86, -1, 74, -9, 101, 0, + -29, 74, 155, 198, 365, 335, -11, 286, 129, 291, 282, -463, 170, -149, -199, -145, -42, -295, -60, 74, -252, -518, 121, -35, -467, -342, -305, -170, 19, -86, 113, -60, 188, 366, -206, 126, -80, -165, -119, 24, -34, -13, 273, -9, 275, 356, 108, 154, 236, -29, 49, -347, 329, -283, -98, -89, 31, -77, -270, -238, -523, 478, -534, -518, 90, 501, 179, -62, -123, 232, -250, 289, -82, 39, 32, -189, 202, -223, -182, -20, 74, -213, -32, 117, -15, -57, 156, -100, -191, -43, 99, -126, -73, -86, -18, 60, + -40, 19, -30, -69, 22, -44, 47, -46, 67, -18, 123, -16, 49, 67, -40, -80, -7, -19, -3, -24, 58, 4, 74, -64, 27, -138, 8, 7, -50, 40, 216, 282, 282, 307, 726, 325, 414, -207, 672, -386, 17, 147, -4, -255, 83, -72, -576, 216, -146, 60, -55, -192, -1, 169, -233, -122, -37, 133, -351, 220, 83, -323, -26, 129, -292, 107, -350, 159, -31, -115, -14, -230, 292, 345, -331, -191, 149, -120, 91, 82, 21, 9, 399, -103, -268, 245, -11, -212, -177, -334, 63, 88, 165, 157, -154, -260, + 144, 70, 499, 50, -62, 10, 33, -150, -66, -187, 204, 116, 133, -42, -320, -294, -96, -28, -115, -204, 56, -91, 132, 21, -22, 79, 85, 133, 127, 99, -1, -33, 36, 88, 70, -44, -39, -29, 23, -3, -25, -1, -157, 16, 103, 76, -123, -91, 176, 91, 174, 66, -127, 118, -31, -100, 19, -141, -75, -38, 53, -31, -393, -441, 737, 514, 659, 42, -423, 149, 344, 245, -108, -267, -78, -98, -130, -230, -92, -193, 492, 79, 81, 4, 29, 52, -181, 325, 184, -19, 119, -46, 335, 62, -29, -548, + -40, 35, 53, -102, 69, -259, 445, 360, 348, 303, -238, -330, 254, 78, 124, -22, -384, -278, 23, -217, 3, -182, -79, 231, 74, -165, 59, -425, 14, -720, -366, -681, 588, 530, 566, 686, 333, -113, -303, -92, -16, 99, 544, -179, -412, 315, -262, 137, -59, -59, 128, -122, -222, -63, -274, -58, -246, -57, 35, -22, -29, -67, -85, -170, -2, 90, 15, -86, 31, 149, -19, 100, 55, 59, 43, -197, 174, -76, -62, 116, 41, 129, 14, -164, -30, 4, 29, -100, 6, -7, -261, -352, 310, 403, -198, 374, + 53, -159, 150, -542, -168, 153, -173, -332, -626, 308, -269, 72, 406, 97, 473, 362, 206, 78, -279, -82, -146, 26, 263, 137, 54, 225, 643, -34, -547, -240, 88, 131, -31, 14, 52, -233, 14, -515, 116, -538, -196, -417, 205, -208, -342, 522, 146, 43, -235, -313, 78, 124, 46, 170, -267, 587, -713, 185, -297, -433, -242, 374, 113, -405, 286, -323, 791, -74, -87, -385, 46, -514, -276, 685, -276, -311, -203, 205, 26, 290, 145, 152, 212, 115, -20, 22, 101, 43, -56, 170, -54, -59, -128, -115, -52, 63, + -101, 7, 49, -42, 43, 8, 168, 88, 0, -34, 0, -12, 100, -89, 91, -25, 40, 141, -45, 7, -20, -71, 172, -24, 134, 747, 769, 725, 157, -191, -118, -463, 380, 14, 224, -137, 74, -168, -129, -267, 148, -278, 463, -1199, -347, 11, -361, 261, -371, 79, -142, 380, 70, 366, 29, -84, -3, 135, -418, -300, -325, -44, 412, -806, 283, 705, 89, -515, -18, -433, -415, 291, -52, -354, 200, 32, -130, -199, 117, 294, 180, -411, -299, 238, 359, -289, -382, 191, 402, -484, -14, -432, -592, 709, -115, 111, + -130, 440, -101, 109, -233, 383, 214, 353, 408, -403, -444, -180, -83, -266, -669, 76, 39, 1, -47, -108, -88, 194, -15, -82, 180, -195, -103, 74, 352, -105, -106, 18, -42, 122, -41, -18, -60, -97, -244, -352, 64, -24, -267, -134, 72, -93, -303, -169, -19, -52, 26, 87, 38, 0, 251, 87, 394, -126, 1, -563, -255, -120, -475, -688, -118, -222, 673, 210, 994, 189, -269, 142, 199, -790, 59, 716, 460, -455, 77, 364, -631, -91, -309, 286, -239, 193, 57, -115, 49, 11, -193, 232, -424, -159, -174, -537, + -102, -60, 23, 52, -136, -161, 1016, 314, -375, -697, -243, 84, 738, -163, -80, -393, -94, -273, 608, -471, 544, 684, -665, 460, 183, -276, -243, 176, 328, -1470, -182, 9, -190, 402, -187, -1096, -417, -311, -487, -476, 99, 107, -270, -240, -448, 59, -158, 51, -188, -223, -252, 72, -41, 172, -217, 123, -16, -224, -477, -112, -16, 170, -56, -640, 146, 327, 139, -3, -216, 243, -20, -64, -381, -56, -123, 337, -37, 64, 15, 82, 220, -139, 25, 23, -59, 30, 102, -454, -387, -141, -310, -214, -76, -193, -245, -237, + -58, -57, -98, -171, -66, -118, -21, -57, -209, 169, 985, -29, -1147, -641, -710, -132, -392, -15, -582, 957, 569, -101, 753, 24, 811, 196, -467, -637, -402, -513, -229, 127, 350, -113, 115, -424, 73, -612, -55, -34, 211, -229, 983, 128, -25, 654, -253, -461, -271, 401, -31, -261, 109, -2, 836, 208, 2, -323, -505, -1274, 82, -1011, 513, 1739, -1242, -264, 281, -212, -219, -346, 290, -356, -1202, -318, -1199, -249, -36, -749, -107, -1079, 468, -107, -686, 1686, 130, 689, 575, 931, -572, -36, -346, -122, -235, 444, 279, 399, + -821, -162, -447, -573, -484, -293, -67, 323, 262, 186, 231, -63, 73, 461, -88, 456, 130, -390, -111, 144, -174, -63, 529, 12, -166, 601, -281, -38, -496, -116, -347, 262, -267, -113, -105, 103, -122, 238, 0, 246, 61, -86, -172, -226, -178, -346, -2009, -199, -504, -553, 749, 596, -696, -548, 1401, -145, 463, 84, -60, -148, -138, -439, 8, 172, 261, 180, 509, -378, 3, -368, -214, 166, 717, 464, 634, 570, -113, 214, 347, 13, -558, -92, 803, -130, -1117, -486, 136, -945, -401, -969, -662, -601, 919, 631, -185, 632, + 251, 887, 600, 293, -1528, -332, 81, -1342, -978, -369, -252, -1574, 353, 888, 1187, 1419, -462, -907, 1, -915, -677, -1275, -1419, -999, -840, 958, 52, 201, -854, -897, -803, -71, 1253, 1586, 52, -569, -435, -626, -1645, -730, -728, -195, -55, -367, 441, 6, -122, -582, -762, -395, -427, -672, -144, -167, -61, -176, -305, 417, 259, -37, -370, 276, 453, 39, -380, -197, 319, 90, -81, -364, 318, -70, -116, 40, 248, 67, -66, 42, 193, 35, -641, -1528, 575, 59, -1044, 948, 463, 283, -239, -934, -246, 14, 883, 1179, 56, 310, + 64, 25, -69, 149, -512, 1666, 390, -560, -561, -256, 61, 808, -410, -136, -13, 403, -411, 207, 15, -104, -1399, -446, 432, 707, 243, -166, -412, -926, -112, 138, -230, 5, -251, -601, 582, -148, 200, -642, -144, 1602, 109, -190, 177, 200, 140, 802, -310, -378, 594, -79, 347, 214, 516, -214, -612, 293, -289, 38, 2268, 2186, 975, -205, -124, 268, 1022, 469, -319, -43, -148, -592, -631, 331, 159, 80, 504, -77, -300, 299, 118, 445, -671, -544, -681, 92, -313, 30, -146, 235, 258, 555, 313, -603, -452, 208, -379, -215, + 33, 188, -260, -593, -79, 15, -64, 255, 56, -479, 133, 761, 867, 651, 738, 533, 665, -188, -55, 258, -87, 254, 225, 343, 631, 1130, 163, -1168, -297, 273, 189, -272, 905, 454, 361, -284, 1057, -52, 40, -270, 571, 378, -783, -1156, -310, 205, 83, -214, -1055, -98, 399, 96, -344, -140, -305, -403, 269, 314, -669, -761, -250, -946, 277, 846, -716, 814, -360, -436, -806, -1140, -1274, -1214, -611, 8, 482, 223, 480, -636, -1423, -560, -1366, -2420, -906, 1965, 3370, 1973, -803, -652, -2959, -2666, 1880, 334, 2464, 2541, 2652, 896, + -1029, -1293, -1433, -1653, -220, 1668, 2825, 907, 313, -117, -1375, -2037, -1359, 280, 1958, 916, 1277, 1033, 398, -721, -792, 49, -428, 171, 972, 1019, 765, 162, 402, 31, -613, 151, 287, -85, 136, -166, 1400, 814, 898, 543, -446, -1191, -1684, 276, 626, 1175, 1193, 1517, 758, -1088, -1353, -1663, -266, 19, 944, 547, 319, 515, -808, -2462, -1631, -1509, -317, 221, 608, -128, -300, -546, -645, -108, 233, -763, 1067, 512, 948, -2084, 473, 281, -640, 466, -479, -238, -142, -299, 898, 1652, -479, 331, -229, 394, 842, -259, -152, -460, 243, -293, + -911, 663, 1126, -151, -587, -543, -1183, -329, 900, 607, 315, -1308, -755, -572, 1157, 999, 881, -2551, -1694, -210, 1262, 2686, 13, -3238, -1186, 104, 1093, -93, 601, 449, -1410, -623, -388, -851, 62, -1595, 252, 626, -1920, -1235, -597, -250, 2131, -17, -3264, 310, 463, 495, 1290, 596, -1392, 66, -50, 2791, 1975, -1643, 1497, -878, 598, 1539, 558, -851, 779, -343, 203, 531, -54, -578, 1061, -684, 779, -367, 421, -131, 855, -302, 672, -1169, -197, -17, -149, 371, 729, -744, 1498, -588, -510, -1022, 750, 1567, 314, -2073, 171, -469, 1010, 491, + 457, -835, -53, -533, 505, -219, -328, -125, 683, -167, -414, -516, 389, 56, 371, -232, 13, -398, -25, -87, 191, 55, 420, -92, -122, -441, 300, 103, 267, -1, -251, -328, 99, 76, 227, 722, -1722, 245, -1264, 231, 1075, 950, 312, -615, 124, -365, -90, -453, -335, 234, 64, -660, -75, 344, -73, 39, 125, -421, -417, -10, 277, 37, -671, 57, 346, 109, 81, 704, -77, -187, 253, 270, -475, -527, 392, 76, -404, 272, 119, 132, -282, 115, 320, 39, -398, 541, -65, -606, 19, 475, 149, -396, 362, 120, -552, 228, + 29, 565, -511, 46, 390, -896, 30, 387, -14, 269, -148, -573, 77, -607, 571, 295, 162, -225, -237, 471, -405, 421, 463, -660, -213, 29, 512, 8, -295, 190, -358, -21, 53, 302, 22, 50, -184, 314, -104, -366, 335, -148, 145, -83, 242, 304, -347, 61, -187, 82, -190, 675, -189, -379, 306, -170, -56, -193, 201, 184, -271, 153, 267, -138, 19, -377, -858, 1393, 192, 627, -549, 236, -123, 164, 148, -238, 89, 251, -152, 553, 20, 14, 185, 178, -25, -146, 233, -41, -169, -38, 234, -262, 51, 113, -333, 407, + -86, -201, 626, -263, -375, 286, 156, -177, 269, 215, -80, -92, -53, 79, 154, 89, -4, -112, 321, -349, 308, 46, -41, 84, 95, 98, 11, -311, 83, 262, -192, -4, -3, 199, -23, -81, 302, -158, 161, -319, -120, 303, -294, 291, -79, 191, 234, -271, -94, 329, -280, -18, 33, 98, 23, -41, 10, 22, 151, -134, 32, 95, -12, -71, 15, 54, -15, 17, -60, 66, 94, -170, -29, 286, -142, 80, -23, 162, 45, -94, 16, -21, -98, -70, 339, -61, -80, 46, 36, -30, 70, 138, 2, 33, 11, -33, + 19, 38, -67, 42, -6, 327, -1153, -3687, -187, 1988, 892, 4235, 361, 895, 38, -1234, -1555, -1053, -1895, -1325, -834, 31, 1447, 2852, 2098, 1827, 595, -991, -1458, -1309, -1545, -1712, -694, -327, -150, 837, 1109, 838, 1551, 1003, 371, 1042, 24, -451, -299, -933, -1917, -1163, -1122, -1142, 59, 534, 368, 1410, 1154, 798, 1135, 1210, 342, 364, -129, -1038, -1446, -1103, -1450, -1029, -360, -253, 89, 791, 617, 559, 1114, 923, 676, 1153, 315, -234, -48, -460, -1001, -579, -1266, -1597, -943, -794, -346, 930, 1252, 1170, 1347, 1111, 630, 610, 294, -128, + -344, -641, -951, -949, -1077, -1127, -967, -327, -115, 382, 970, 1083, 1068, 1252, 993, 747, 618, 206, -484, -858, -1403, -1788, -1678, -1326, -670, 172, 897, 1236, 1418, 1482, 1275, 905, 459, -292, -728, -958, -1116, -973, -736, -504, -212, 237, 308, 425, 484, 435, 342, 277, 183, 165, 70, -53, -96, -93, -153, -163, -216, -248, -280, -220, -173, -90, -10, 142, 232, 276, 272, 306, 269, 198, 83, -39, -166, -206, -243, -241, -268, -236, -170, -45, 35, 102, 158, 199, 192, 209, 193, 163, 97, 30, -79, -149, -208, -207, -199, -163, + -115, -29, 18, 61, 99, 138, 152, 151, 116, 88, 43, 5, -39, -70, -111, -120, -127, -108, -84, -34, 7, 56, 83, 90, 75, 70, 58, 51, 28, 6, -22, -41, -63, -69, -68, -49, -29, -5, 6, 20, 26, 31, 28, 24, 17, 12, 5, 0, -4, -6, -7, -7, -7 }, + {-86, 19, 97, -10, 7, -148, -75, 20, 193, -127, 39, -203, 205, 12, 74, -25, 31, -41, -73, -177, 73, -178, -84, -101, 98, 78, 37, 81, 154, 9, -143, 92, 14, -8, 75, -30, -53, -209, 32, -61, 44, 85, -114, -46, 101, 31, 11, -107, 264, 159, 25, 127, 104, 101, -244, 14, -25, -66, 58, 39, -40, -47, -14, -74, 70, -29, 140, -6, -37, -68, -125, -24, 94, -5, 20, 111, 29, 129, -4, 18, -15, 138, 123, 124, 26, -1, 54, -4, 16, 1, 5, -12, -40, -34, -8, -39, + 17, 18, -17, 40, -17, -13, -10, 16, 3, 35, 2, -1, 2, 46, 22, -5, -14, 1, -8, 26, 12, 49, 11, 63, 220, -107, 73, -61, -96, -40, -66, 120, -100, -185, -47, 48, -154, -93, 173, 299, -51, 114, -103, -109, -5, 31, -13, -4, 111, -191, 62, -15, -40, -161, 14, 3, 90, 26, -126, 165, -132, 154, -17, 27, 63, -19, -77, 120, 30, 161, 25, -143, 258, 204, -72, -22, -50, -180, -97, -30, -31, 72, -99, 7, 71, 0, -3, -12, -17, -99, 156, 4, -3, -50, -17, -144, + -127, 41, 104, -14, -27, -1, -1, -74, 140, 18, 46, -37, 38, 23, -6, -3, -6, 1, 33, -19, 21, 22, -4, -6, 17, 37, 34, -25, 9, 11, -18, -11, 53, -8, -2, -42, -38, -64, -23, -229, 284, -61, -32, 203, -78, 105, 450, -53, 14, -171, -138, -213, 125, -88, 62, 119, -134, -114, -83, 10, 45, -166, -64, 74, 63, -65, -26, 102, -104, 17, -51, -18, -72, 63, -66, 28, 61, -27, 190, 9, -25, -139, 18, 203, 29, 69, -184, -263, -95, -226, -199, -4, -85, -7, -242, 209, + -224, 34, 155, -138, -234, -166, -48, 157, 140, 210, -122, -107, -85, -73, 152, 40, -61, -33, 73, 83, 26, 39, 54, -10, -86, -13, -56, 23, 9, 20, 19, 6, 38, 6, 44, 5, -31, 45, -49, -32, 12, -12, 45, -25, -18, -7, 7, -16, -29, 29, -8, 22, -24, -23, -29, -34, -20, -30, 47, -39, 245, 25, -99, 14, -82, -18, 171, 287, -98, -101, -261, 33, 65, 148, -99, 160, 25, 246, -198, 32, -374, -41, 44, -91, -84, -33, 137, -113, -197, 56, -288, -63, -139, 63, -31, 97, + 12, -220, -238, 6, 126, 235, -47, -96, 196, -217, -118, 105, 93, 155, -149, 6, 60, -94, -32, 92, -135, 175, -77, -33, -188, -156, 75, 0, 3, -26, -115, 109, -73, 135, -3, -179, -188, 69, -95, 33, -267, -255, -41, 240, 1, -49, 11, 35, 25, -11, 38, -125, 23, 21, 37, 48, 53, 28, -71, 5, 61, 28, 16, -35, -44, 10, -1, -14, 57, -1, -5, -40, 72, 60, -4, 5, -37, 21, 22, 10, 2, 24, -33, -17, 145, -401, 91, -175, 145, 166, -190, -351, 47, -48, 220, -135, + 319, -137, 210, -264, -99, 108, 156, 42, -3, -163, -23, -129, -160, 86, -137, 51, 29, 63, -79, 148, -30, 127, -31, -248, -43, -80, 23, 244, 14, -23, -15, -101, 83, -96, 128, 139, 49, 52, 246, -63, -47, -200, 139, 123, 24, 30, 24, 9, 70, 149, 99, 56, 53, -40, 195, 66, -43, -153, 75, -46, 285, 162, 34, -134, -51, 217, -87, 27, 125, -72, -90, -175, 20, 62, -16, 82, -70, -27, -55, 60, -7, -21, -85, 19, 19, 49, 57, -21, 8, 64, -7, 65, -7, 19, 95, 19, + 98, -9, -24, -7, -11, 2, 5, -76, 26, 60, 4, 23, -20, -514, -279, 103, -101, 206, 206, 311, 128, 126, 76, -375, -84, -52, 33, -38, 116, 83, -144, -115, 96, 182, 229, 198, 261, -143, -144, -190, 201, -117, 166, -42, -9, -178, -107, -102, 150, 186, 32, 186, 266, -106, 67, 313, -158, 101, 105, 12, 234, 301, 228, 523, 96, -74, -98, -90, -7, 92, 158, -29, -52, -55, -141, 59, 75, 135, -328, -45, 82, 217, 150, -279, -208, 53, 51, 226, -200, 13, -21, 24, -284, -77, -99, -69, + -118, -49, 8, 109, -1, 6, 41, 52, -109, -17, 7, 1, 37, -37, -72, -48, -55, 77, -75, -36, -87, 22, -20, 55, -79, 33, -28, 32, 28, 6, 66, -64, 32, 37, 10, 79, 124, 248, -32, 50, 212, 311, 175, -344, 1, -366, -260, -157, -31, -224, 267, 99, 158, -455, -33, 297, 151, -134, -191, -117, 116, -348, -20, -224, 343, -45, -100, 36, -12, -59, 60, -91, 159, 113, 229, -17, 12, 353, -112, 236, -38, -42, 622, 74, -67, -141, -481, 50, -493, -83, 519, -147, -101, -361, -106, 12, + -194, 104, -19, -265, 281, 100, 91, 77, -196, 214, -335, 97, 129, 14, -44, -136, -107, -139, -44, 111, 143, -37, -117, -70, 160, 65, 306, -6, 23, 124, -13, -57, -42, -39, -34, -51, 36, -58, -2, 62, 23, 63, 61, 49, 5, 92, 67, 39, 28, 27, -97, -82, 70, 9, -60, 10, -68, 19, 77, 28, -13, 28, 66, 14, -54, 26, 201, -410, 174, -146, -208, -199, 153, 197, 114, 342, 252, 50, 102, -271, 53, 120, 265, 50, -130, 96, 123, -243, 33, -250, 192, 175, 225, -222, 133, 241, + -112, 61, 321, -12, -201, -161, 70, -55, -205, -85, 2, 46, 109, -142, 223, 135, -53, 270, -35, 101, 355, -380, 697, -323, 94, 209, -74, -41, 87, 472, -27, -67, -16, -114, 228, 256, -84, 109, 90, 82, 156, 202, 15, 218, 46, -190, -292, 68, 27, 132, 55, 437, -46, 243, 196, -137, -251, -31, 27, 63, -69, 111, 52, -109, -31, -104, -39, 63, -34, 93, -25, 33, 23, -45, 49, 56, -88, 57, 38, 17, 19, -4, 16, 104, 32, -38, 18, 28, 51, 64, -21, -73, -22, -64, -49, 77, + 70, 90, 232, 305, 188, -325, 622, -196, 118, -457, 181, -404, 313, 32, -87, -229, 296, 39, 189, 195, 100, -341, 174, -206, -38, 153, 167, 38, -63, -341, 47, 314, 35, 203, 227, -357, 196, -182, -179, 262, 291, 151, 164, 45, 157, -368, -164, -118, 11, 390, 188, 154, -29, 171, -9, 430, 159, 162, 66, -25, -637, 235, 151, -60, -45, -476, 5, -183, 114, 413, -69, -238, 483, -23, 273, -162, 2, -302, -28, 5, -522, -156, -90, -236, -109, -47, 33, 260, 19, -7, -50, -136, -22, 23, -50, 18, + 6, 69, -122, -49, -16, -114, 6, -74, -46, -38, -91, -48, 107, -37, 19, -30, 116, -6, 53, -76, -169, -52, -7, 72, 31, 103, -7, -34, 89, -109, 129, -4, 407, -351, 51, 148, 184, -610, 404, 113, -434, -277, 236, 543, -192, -99, -375, 778, 302, 48, 129, -409, -265, -17, 34, 403, 87, 311, 349, -15, 21, 243, -64, -260, -249, -63, 346, -187, 438, -203, 643, 286, 518, -141, 84, 416, -324, 194, 188, 176, -186, 222, 54, 71, 189, 396, 333, -338, -79, 174, -330, -209, -87, -674, 180, -333, + -209, 65, -84, 231, 430, 275, 174, -232, -55, -14, -456, 83, 39, 564, 121, 127, -122, 436, -4, -12, 1, -142, -65, 18, -26, -153, 14, -39, 28, -183, -199, -65, 159, -26, 62, 60, 49, -13, -42, -54, -110, -183, 63, 10, -45, -217, 160, 110, 62, -17, 14, -73, 55, -38, -71, 26, 93, 57, -56, -13, -22, 70, -486, -717, 388, -292, 318, 104, 154, 188, -481, -876, 78, 127, 494, -487, -534, 461, -184, 210, -101, 110, 73, 121, -243, 117, -35, -76, 304, 114, -44, -395, -54, -11, -73, -19, + -214, -524, -233, 385, -164, 190, -297, 220, 114, -4, -150, -650, 360, 349, 449, -314, -133, 610, 539, 249, 116, 345, 127, 310, -166, 269, -514, -33, 144, -134, 612, 24, 335, -200, -329, 707, -12, 281, -93, 10, -832, -70, 177, -321, 392, 297, 73, -170, -633, -14, -129, 158, 193, 32, -77, 149, 7, 73, -40, -192, -70, -175, 307, 94, -6, -6, 39, 283, -49, -68, 44, -22, 4, 127, 69, 114, -82, -11, -131, 25, 2, 120, 120, -133, 214, 217, -169, 13, 28, -25, -359, -471, -137, -110, -806, -756, + -198, 4, 569, 463, 458, -177, -74, -115, 489, 210, -205, -36, -163, 354, 275, -204, -286, -263, -536, 224, 15, 15, 117, -80, 203, 754, -429, 227, 45, -291, -166, -345, 131, -153, -173, 390, 48, -130, 394, -54, -174, 137, 288, -158, 309, 555, 536, -366, -5, 134, 302, -464, -97, -128, 578, 246, -62, -351, -390, -347, 522, 432, -827, -690, -523, -368, 125, -332, 202, 55, 82, -665, -213, 601, 464, -201, -427, 415, 217, -50, 7, -53, -101, 236, -212, 52, 36, -9, -153, -279, 54, 227, -22, 25, -98, 215, + 236, 23, -32, 79, -9, 95, 103, 148, -200, -19, 73, 0, -124, 33, 250, 232, -89, 178, -273, 68, -89, -76, -110, -171, 64, 668, 526, 327, 52, -434, -225, -66, 180, 278, -384, 101, 25, -328, -155, 266, -194, 212, 92, 249, -306, 0, -685, 104, -867, 358, 354, -336, 400, 476, 15, 136, -559, 331, 34, -232, 305, -71, 5, -5, 38, 585, -65, -1, 719, -7, -330, -948, -779, 867, 540, 214, 219, -362, -730, -359, 117, -280, 572, -30, 77, 617, -126, -191, -138, -388, -659, -523, 1491, -724, -327, 428, + -754, -543, 542, 758, 251, -138, 893, 431, -717, -249, -400, -391, 812, 59, -539, -373, -420, 119, -86, 248, -5, -124, -196, 19, 226, -120, 105, -117, 113, 102, 314, -121, -44, 269, 23, 138, 141, 192, 37, -112, -62, -28, -44, 118, -35, -125, 253, 261, -143, 67, -162, 60, 62, 161, -40, -15, -80, 77, 181, -612, -452, -316, -560, -51, 530, -39, 109, 261, 173, -451, -219, -373, -200, 477, -146, -52, -66, 289, 289, 862, 137, 634, -37, 214, -346, -261, 227, -440, -489, 16, 154, -251, 201, -294, 89, -774, + 432, 241, 353, 44, -315, -648, -231, -58, 534, -407, -241, 149, 1222, -338, 1242, -762, 301, -281, 545, -217, 942, -887, 1349, -128, 277, 584, -1001, 892, -1069, 721, -1742, 944, -896, 793, -1169, 1027, 34, 665, 288, -545, 474, -390, 1180, -538, 194, -705, 190, -48, 129, -252, 327, -324, 232, -115, 74, 99, 104, 136, -81, -186, -151, -179, -410, 236, 60, -282, -131, -85, 182, -314, 298, -240, 59, -129, 144, 48, -3, 452, -401, 244, -388, 583, -112, 570, -225, 178, 257, 86, 88, -1, 273, -408, 446, -311, 293, -66, + 2, -118, 4, 24, -116, 54, 107, 52, -537, -487, 565, 975, -809, 1236, -72, -1, -48, 214, -368, -271, -552, -124, 17, 1, -3, 485, 83, 532, 521, -333, 192, 1111, 363, 237, 166, -965, 49, -157, -121, -885, -187, 507, 143, 168, 255, 643, 168, -199, -66, -56, 241, -439, -270, 664, 412, 309, 514, 379, -224, -113, -767, -338, 312, 245, 579, -418, -208, -147, 426, 248, 382, 157, -303, -282, 957, -294, -930, 214, 673, 460, -12, -81, 83, 153, 95, 854, -1030, -880, 102, 346, -443, -230, 75, -350, 166, -171, + -44, 91, -67, -235, 9, 194, -125, 1, -341, -60, -300, 220, -95, 201, -122, 126, 53, 170, 267, -271, -121, -82, 211, -132, -244, -449, -1, -180, -67, 67, 45, 12, 88, 146, -28, 452, 56, -37, -350, 60, -64, -20, 86, -368, -187, -380, -1957, 540, -239, -125, 479, -332, 514, -70, -849, -155, 82, 297, 378, 88, -602, 594, -234, -55, -370, -167, 318, -64, 284, 479, -112, -620, 137, 679, -633, 232, 527, -96, -419, -781, -528, 550, 1411, -435, -564, 1590, -105, -229, 1144, 666, 568, 459, 188, -337, 581, 541, + 373, 173, -1053, 657, 581, -1112, -643, -400, -312, -306, 1212, 605, -694, 648, -257, -649, 282, 330, -287, -275, -1018, 114, 173, 744, 356, 92, 622, -494, 1287, -1368, -1596, 1127, -689, -43, 790, -498, -343, -99, -94, 98, 485, 238, -397, -24, 189, -47, 269, -11, 149, 29, -211, 113, 430, 296, -19, 58, 288, -46, -34, 73, 666, 342, -107, 146, -591, -26, 156, -272, -366, 346, -158, -10, 356, -308, 137, -52, -88, 442, -249, -59, -518, -2126, 658, 1204, -742, -152, -576, 1238, 834, 524, -96, -430, 92, 501, 235, -213, + -44, 684, -42, -249, -910, -431, 773, 450, -483, 391, -349, -109, 234, 219, -209, 142, -797, 231, 1085, -136, -208, -1062, -636, 518, -836, -454, 195, 215, -256, 699, 661, -676, 256, 379, 1093, 1001, -155, 328, -24, 1144, 499, 465, 1085, -482, -704, -361, -902, 765, 363, 374, 201, 1297, -854, -199, 556, -304, 617, -28, 75, 287, -745, -1134, 146, 220, 1252, 952, 26, -920, -142, -1005, -2, -30, -279, -256, 140, -85, -72, -253, -162, -225, -132, 37, -266, -244, -37, 253, 132, -325, 301, -164, 556, -171, -487, -178, 248, -150, + -368, 428, -88, -386, -597, 95, -93, 73, 137, -228, -193, -523, -113, -136, 41, 100, 198, 171, -396, 5, -502, -182, 55, 57, 494, 840, 733, 755, 972, -562, 765, -1500, -656, 566, 133, 1093, 498, 932, -408, 122, -812, 548, 906, 824, 82, 584, -1440, -939, 892, 259, -898, -465, 108, 1318, 406, -539, -679, 133, -199, 810, 875, -88, -144, 172, -250, 1048, 300, -251, 210, -502, -299, -2355, -802, 417, -370, -354, -14, -426, -427, 1076, 719, -545, 981, 2036, 417, 1450, 198, 293, 1062, 702, -577, -653, -1148, -714, -78, -1132, + 416, -138, -1097, -787, -786, -986, -600, -397, -527, 153, 930, 1138, 597, -121, -835, -108, 29, 69, -408, -75, -277, 221, 317, 33, 231, -10, -165, 270, -298, 35, 255, 556, 73, -7, 373, 157, 1006, -255, -826, -45, 550, 97, -228, -253, -673, -634, -362, -254, -121, -382, -553, -585, -324, -50, 75, 769, 553, -210, 893, 1594, 1099, 775, 480, 303, -399, -257, -398, -358, -100, -29, 921, -111, 781, -521, 201, -1762, 485, -275, 892, -233, -1058, 1045, -405, 152, 591, 440, 956, -156, 138, -193, 1091, -243, 200, 757, -892, 747, + -230, 453, 724, -206, 156, 114, 67, -245, 318, 308, -137, -439, -87, -510, -172, -104, 403, -219, -806, -534, 834, 843, -812, -681, 1000, 1178, -466, -125, 846, 27, 432, 614, -1442, -431, -105, 1383, 120, -106, -1375, 265, 529, 345, 41, 361, 134, 183, 1735, -60, 84, 1020, -623, 675, 120, 508, 328, -797, -269, 934, 615, 354, -231, 322, 156, -7, 117, 233, -122, 404, -278, -79, 415, 244, 78, -893, 72, 432, -341, 150, -796, -505, 546, 263, 447, 391, -322, -869, -248, 290, 744, 452, -119, -171, -271, 613, -19, -130, + -260, 323, 131, -140, -634, -402, 391, 391, 276, -437, -612, 298, 794, 367, 49, -407, -102, 180, -15, 9, 40, -106, -190, 60, 203, 57, 30, 94, 25, 22, 37, 99, 11, -9, 76, 1010, -1706, -116, -1444, -1337, 338, 284, 246, 36, 1275, 728, 1641, 1797, -197, -880, 188, -237, -164, 392, 174, -141, -826, -901, 980, 455, -111, 153, 159, 93, 180, -90, -235, -1333, 29, 770, -225, -1027, -338, 848, -1569, -537, 991, 603, 1184, -32, 86, -1090, -1103, -1387, 1169, 1659, -2182, -1084, -115, 1111, -866, -138, 2000, 817, 507, 1327, + 967, 1457, -526, 1448, -221, -1131, -1668, -388, 638, -1318, -259, 287, -280, -462, 281, 258, -909, 680, 330, 987, -238, -961, 1201, 246, -1097, 9, -256, 460, -486, -495, -257, -48, -17, -374, -458, 359, -478, 0, -473, 263, 447, 75, 668, 464, -676, -247, -1, -602, 100, -98, 240, -155, 211, 591, 0, 118, -412, 635, 400, -441, -132, 455, 422, -57, -650, -79, -1262, 979, -79, 302, 381, 369, 16, -423, 695, 177, 671, -140, -1413, -125, 412, -462, -515, -314, -474, 581, -145, -500, -25, 540, -718, 509, -247, 273, -707, -173, + 292, -57, -62, 92, 403, -67, -61, -493, 251, -132, 84, 158, 56, 372, -535, -408, 568, 491, -673, 327, -543, 635, -525, 242, 167, -443, 996, 101, -1099, 513, 138, -849, 483, -309, 514, -735, 384, -779, 364, 562, -501, 294, -532, 23, 22, 56, -348, 12, 273, -10, -480, 370, -299, -647, 285, -285, 146, 309, -226, -134, 59, -38, 201, -98, -68, 181, 228, 80, -221, -129, 220, 134, -504, 470, -62, -168, 69, -31, 114, 255, -57, 477, -135, -200, -226, -87, 50, -218, 64, -70, -87, 63, 81, -87, 2, -20, + -94, 102, 69, -103, 299, 610, -311, -3409, -6150, -2046, -4767, -4716, 2537, 525, 3529, 7975, 7186, 5892, 7197, 4403, 983, 1383, -1026, -5347, -5284, -3955, -5134, -3522, -730, -2378, -3279, -1425, -411, -1706, -812, -36, -853, -1519, 317, 1307, -445, 1815, 2713, 64, 523, 3668, 1818, 19, 3439, 2810, -661, 1329, 3211, -64, 262, 4530, 2434, 1010, 5480, 6037, 2969, 5723, 7120, 1865, 955, 2897, -1161, -3449, -2012, -4487, -7955, -7940, -9011, -12003, -12088, -11601, -11868, -10622, -9106, -7297, -4782, -2437, 1169, 5237, 6910, 8430, 11421, 10042, 8977, 10026, 7401, 3451, 4059, 4585, 1690, 2207, + 4594, 2249, 417, 1964, 1769, -1026, -13, 1223, -1840, -2347, 516, -481, -775, 2552, 2191, 212, 1991, 2891, 497, -238, 149, -2999, -5407, -5650, -7203, -9064, -8588, -7687, -7002, -6248, -4590, -4357, -4756, -3191, -1050, 273, 1162, 3097, 3717, 4205, 7549, 8798, 8133, 7500, 5977, 3779, 3239, 2753, 1687, 1201, 1112, 440, -100, -151, -316, -663, -819, -675, -925, -1272, -1214, -1179, -1335, -1352, -1148, -1209, -1129, -868, -838, -887, -736, -608, -588, -415, -222, -158, -154, -211, -219, -236, -244, -198, -177, -339, -526, -672, -774, -830, -686, -548, -535, -442, -263, -197, 32, 373, + 552, 607, 795, 897, 859, 964, 1101, 1007, 1013, 1140, 1111, 1063, 1090, 925, 659, 482, 321, 87, -107, -230, -404, -574, -615, -628, -667, -616, -594, -652, -633, -598, -558, -492, -426, -349, -277, -215, -125, -65, -30, 9, 43, 52, 66, 80, 88, 89, 93, 94, 89, 84, 82, 81, 79 } + }, + { + {-259, 28, 170, 58, 111, -162, -89, 7, -29, 43, 135, -324, -2, 107, 64, 98, -94, -131, 142, -2, 39, 88, 117, 43, 24, 105, -16, -34, -91, 49, -26, -15, -48, 61, 154, 1, -32, 73, -99, -148, -82, -30, -96, 9, -22, 62, -60, 17, -120, -12, -99, -5, -45, -39, 50, -57, -6, 81, -43, 97, 117, 9, 158, -81, -6, 76, -28, 51, 72, 39, -84, 33, 38, 27, 5, -70, 92, -25, 44, -15, -20, 6, -97, -8, -75, -35, -4, -13, -3, -7, -41, 48, 5, 14, 3, 27, + -17, 34, -3, 15, -6, -14, 18, 2, -6, 0, 26, 6, -5, 17, 8, -3, 432, -120, 43, -92, -6, -38, 51, 35, 149, 47, 27, 59, -34, -296, -283, -87, 40, 89, -71, 18, -91, -32, 6, 52, -125, -136, -39, -7, 76, 26, -29, -98, 19, -53, 4, 71, -99, 50, 91, -68, -183, -47, 69, -10, 56, -8, 49, -7, 53, 12, -171, 35, 72, -26, 49, 10, -8, -33, 3, -100, -7, -26, -127, -20, -2, 115, -111, 189, 220, 173, -73, -33, -38, 85, -30, -46, 54, -122, -111, 15, + 101, -2, -49, -109, -64, -83, -43, -76, 31, -45, -11, -47, -24, 4, 28, 4, 28, -16, 4, 23, 13, 18, 19, 11, -19, 23, -406, -3, -63, 28, -14, -210, -40, -44, 66, 102, -141, 113, -36, 78, 78, -42, 169, 10, 7, -29, 29, -42, 31, -47, 6, -110, 12, 122, 0, 51, 128, -126, -133, 56, -61, 103, -104, -31, -217, -167, -145, 64, 18, 77, -79, -56, -17, 136, -151, 62, 26, 11, 76, -52, -70, -90, 55, 30, -134, -147, -171, -5, -37, 56, -8, -32, 15, 23, 76, -204, + 25, 117, 172, 178, 146, -25, -109, 159, 48, 31, -80, 46, 32, 5, -21, -47, -8, 55, -43, -69, -29, -29, 11, -5, -18, 48, 3, 61, -7, 18, 39, 38, 29, 22, -25, -26, -10, 24, -6, 24, -18, 41, 33, -35, 1, 3, -60, 45, -240, 144, -129, 172, 225, 139, -6, 65, 12, 184, -105, -106, 50, -32, 73, 141, -209, 62, 182, 84, -17, -5, 19, -89, -5, -84, -116, -33, 172, -69, 78, -64, -110, 207, -186, 138, 151, 27, 94, -138, -40, -57, -46, 95, 26, -149, 20, -17, + 24, -35, 49, 47, 171, -186, 85, 66, -22, 66, 16, 104, 97, 61, -63, 83, 148, -7, 85, -67, 176, 182, 199, -61, -146, 43, -23, 69, 49, -4, -14, -207, -57, -50, -20, -45, -65, 67, 23, 19, 78, -8, 79, 49, 23, -15, 10, -21, -39, 21, 2, 37, -16, 7, -7, -30, 41, -5, -43, 13, 33, 1, -54, 9, -27, 66, 47, 47, -10, 13, 36, 1, 16, 32, 16, 332, -31, -104, 316, -125, 142, -76, -303, 54, -87, 9, 362, -141, -172, 14, 190, -307, -114, 230, -81, 74, + 108, -82, 99, -64, -106, 21, -30, -37, -40, 128, -103, 250, 62, 5, -143, -42, 152, -175, 37, 61, -28, -244, 167, 45, 41, 22, -34, 126, -75, 173, 98, -67, -298, 133, 80, -7, -85, 72, 192, 196, -22, 116, -176, 128, -31, -60, 76, 151, -106, 150, 27, -63, -53, 122, -102, 290, -149, 120, -100, 27, -90, 116, -104, 6, 66, -19, 12, -89, -31, -12, 0, 25, -39, 51, -5, -34, 51, -102, -104, -58, 1, -9, -21, 4, -71, 87, 5, -5, 60, -49, -10, 69, 29, 25, 107, 96, + 309, 38, -82, -402, 121, 224, 133, 86, -37, 112, 432, -56, 198, 17, 110, 40, 5, 84, -39, -189, -55, -141, -39, -198, 68, 3, 225, 42, -109, 72, -35, -59, 144, 49, 107, 61, -66, -257, 13, 145, -13, -52, 64, -137, -60, -240, -296, 149, 167, 129, -44, -51, 0, -8, 84, -18, 92, 82, -5, 85, -84, 21, -45, 49, 61, 273, -2, 223, -87, -235, -23, -34, -90, 182, -17, 74, 15, -135, -161, -59, -36, 15, 161, 51, 16, 66, 108, -49, 81, -12, 68, 42, 16, 95, -12, 54, + 31, 27, -19, -28, -58, -28, 56, 86, -23, 5, -51, -10, 2, -52, 34, -95, 2, -7, -1, 57, 61, -9, 144, -354, -12, 361, 496, -206, 56, 79, -172, -101, 20, -144, -150, 347, 49, -231, -37, -151, -86, 225, -71, -101, 205, 126, 207, -89, 43, 201, 9, -122, 56, -18, 25, -257, -174, 76, -18, 60, -235, 110, 87, 54, -415, -244, -105, -53, 59, -183, -121, 40, 319, 209, 113, -58, -35, -122, 92, -36, -235, -181, -21, -5, 334, 184, -165, -186, 231, 45, -139, 0, 207, 77, 7, -271, + 297, -106, 198, 258, 274, 23, -100, -83, 141, 159, -140, 112, 153, 106, -46, -38, 22, 91, 76, -82, -124, -119, 58, -58, -37, -83, -16, -60, 31, -50, 36, 27, -9, -2, 67, -50, -99, -20, 92, -57, -49, -54, -37, -8, -2, -63, -1, -47, -21, 15, 62, -42, -1, -15, -27, 55, 67, -98, 146, -189, 213, -21, -59, 113, -218, 72, 117, 22, 81, 101, -60, 238, -114, -410, -244, -55, 15, -88, -176, -192, -131, 399, -113, -33, 57, -85, 47, 327, -159, 155, -104, -213, 188, 135, 86, 293, + 5, 137, -14, 34, -13, -98, 64, -24, 212, 41, -148, -39, -44, -12, -241, 95, -237, 56, 317, -209, -399, 91, 54, 181, -82, -5, 185, -116, 90, 136, 37, -85, 183, 38, 235, 49, -147, -140, 152, 256, 90, -4, -213, -44, -69, 152, 38, -291, 45, 76, 20, 28, 112, -52, 47, -80, 49, 44, 36, 58, 25, 38, 35, -68, 21, -22, -11, 64, 27, 35, 73, -24, -233, 21, -16, 16, -22, -15, 65, 42, -38, -45, -317, 731, -171, 328, 31, 137, 99, -2, -410, 349, -511, 165, 123, 460, + -216, 207, -325, 212, -105, -350, -168, 82, 90, 128, 65, 184, 120, 278, -86, -228, -206, 80, -2, -113, 187, 81, -38, 111, 231, -22, 60, -35, 114, 67, -296, -129, -387, -90, -66, -9, 186, 165, 25, -107, -2, -59, -92, 51, 545, 49, -12, 173, -13, 198, -85, 2, -129, 546, 129, -225, -257, -173, 22, -12, -349, 19, 72, 23, 382, -100, 56, -237, -77, -643, -111, 33, 25, -247, 65, -119, 81, 37, -117, -15, 85, 130, 243, 64, -88, -83, -195, -76, 19, 32, -112, -43, 106, 37, -29, -27, + -83, -78, -37, 22, -162, -115, 31, 65, 1, -42, 41, 133, 23, 10, -11, -59, 5, -191, 81, 44, 382, 33, 318, 193, 312, 105, -316, 310, -202, 536, -346, -102, -479, -101, -51, 213, -223, 313, 252, -152, 18, 358, 503, -160, 13, -66, 158, 2, -59, 73, 138, -240, 181, 34, 207, 79, 32, -410, -66, 475, -57, 159, 364, 105, -28, -127, -168, -101, 17, -156, -94, 275, 255, 80, 423, 281, -89, -42, 58, 98, -129, -337, 440, 194, -90, 402, 421, 469, 204, 71, -170, 12, -238, -191, -121, -470, + 189, -60, 401, -95, -315, -59, 30, -47, -421, 67, 112, 192, 203, -142, 65, -97, -273, 54, 106, -21, -81, -206, 216, 122, -193, -219, -123, 126, -22, -62, 59, -97, 61, -25, 37, 95, -140, -65, 63, -29, 3, 281, 92, 19, -19, 67, -93, -53, -9, 92, -58, 420, 26, 78, -62, 36, -53, -633, 75, -5, -113, -46, -311, 359, 368, 412, -665, 217, 139, 18, 658, 271, -326, -36, 650, 78, 117, 134, -190, 110, 135, 405, 205, -306, -506, 194, 121, -253, -47, 27, -311, 38, 381, 164, 214, 311, + 501, 49, 442, 89, -174, -23, -260, -134, 110, 152, 115, 224, -313, -139, 562, -39, -120, -311, 267, 244, 84, 103, -4, 157, -244, 404, -201, -237, -194, -131, 544, 149, 114, -589, -325, -484, 36, -49, -48, -459, -641, -16, 288, -156, 82, -40, -44, 163, -223, -93, -101, 197, 33, -140, -2, -21, -3, -65, -134, 36, 215, -102, -70, -135, -62, -94, -47, 96, -32, 151, -49, -29, -85, -60, 225, -20, -15, -104, -17, 136, 37, -161, 37, 16, 48, 593, 698, -178, 196, -50, -203, 41, -467, -288, -20, -93, + 936, -420, 120, -594, -87, 364, -152, -330, -347, -126, 144, 186, -23, -29, -390, 93, 274, 139, 168, 51, 62, -227, -74, 154, 57, 1, 18, -274, 123, -288, -46, -7, 85, -320, -33, 158, 231, -365, -191, 651, -249, -511, 431, -416, -131, -183, -74, -319, -221, -66, -322, -459, 742, 410, 331, 227, -288, -112, -194, 209, -349, 248, -186, 107, 249, 163, 51, -473, 465, -565, -148, -548, -222, 362, -21, 206, 416, 133, -42, 82, -145, 9, -44, -156, 188, -64, -86, 215, 114, -56, 15, 11, 35, -96, 94, 30, + 51, -115, 79, -53, 204, -90, 144, -43, -71, 216, -144, -62, -129, 87, 214, 99, -60, 101, -86, 103, 149, -161, -387, -25, 985, -435, 431, -871, 246, -552, -100, 315, -23, 204, 330, 264, -377, 289, 64, 215, -77, 297, 276, -56, 62, 180, 203, -277, -91, -406, -45, 365, 15, -168, 43, 137, 31, -146, -287, 78, -192, 193, -181, 701, -60, -376, -422, 100, -229, 223, -474, -372, -482, 115, -406, -95, -585, 426, 92, 287, 181, -634, 54, -54, -233, -353, -92, -300, -377, -208, 183, 255, 372, -208, 57, 162, + -530, 249, -361, -30, 308, 132, 128, 59, 626, -352, -125, -132, 168, -526, 48, -40, 0, 347, 205, 173, 67, -126, 27, -61, 256, -93, -27, -138, 289, 117, -94, 81, -245, 176, 94, 139, 28, -47, 165, 292, 104, -137, -186, -75, 79, -192, -39, -294, -211, -114, 6, -160, 126, -126, 298, -227, 2, 2, -819, -238, 916, 810, 454, -394, 400, 606, -403, 535, -434, 494, 115, -34, 161, -12, 259, -392, -113, -177, 197, -372, -335, 521, -52, -110, 47, -505, -13, 810, 440, 91, -10, 172, 765, 327, 10, 129, + -214, -92, -185, 329, -173, 219, 39, 393, -469, -10, -30, 11, -134, 219, 351, -84, -103, 356, 39, 44, 806, 127, 9, -371, 161, -276, 372, -433, -386, 58, -380, -404, -619, 165, -208, 318, -107, 179, -903, 183, -307, -547, 282, 377, 195, 116, 66, 158, 239, -117, -142, -166, -13, -182, 111, 24, -263, -180, 147, 89, 9, 266, -95, -28, -214, -45, -1, 110, 68, -178, -111, -49, -217, -41, -204, 81, 52, 240, 161, -17, -99, 0, -1, -68, -17, -251, -47, 103, 109, 32, -45, 241, 38, 686, -1044, 444, + 463, -741, -72, -634, -207, -569, -255, 660, -221, -44, -457, -85, 110, -679, -23, 441, -840, 35, -573, -307, 15, 67, -378, -302, -316, -88, -271, -13, 150, -78, 218, -407, -259, 555, -254, 303, -324, 315, 287, 53, 79, 293, 17, 416, 524, -93, 80, 778, 49, 402, -25, -303, -607, 107, 427, -668, 12, -391, -205, -868, 380, 581, -147, 282, -138, 631, 696, -51, -683, -662, 954, -736, 280, 115, 102, 717, -300, 1165, -17, -258, -299, -204, 188, -67, -86, -2, 302, -69, -186, 256, -88, 132, -228, -134, 222, 22, + 330, -103, 142, -236, -66, -324, 71, 140, 166, 37, 171, 22, -49, 184, -277, 191, -235, -79, 146, -285, -71, -161, -486, -125, 34, 182, -236, -119, -208, -62, 53, 373, 192, 1139, 1284, -76, -968, 956, -1058, 149, 449, 112, -113, -488, 550, -246, -197, -497, -289, -154, -621, -341, -278, -155, -102, 432, -7, 373, 2, -160, -544, -595, -151, -21, -8, -90, -223, -256, 284, 687, -373, 237, -233, -239, 272, -265, -431, 964, -107, 90, 46, -537, -119, -112, 272, -694, -309, 737, 117, -311, 399, 749, -426, -525, 272, -445, + 6, -834, 268, 712, -74, 372, 215, 126, 813, 257, -5, 471, -70, -63, 286, 310, -1183, 110, -515, 420, -21, 18, 292, -87, -114, -153, 157, 62, -117, 160, -171, 19, -91, -226, 103, -112, 254, 143, -6, 3, 68, -65, 149, 77, 46, 64, -45, 58, -104, -195, -111, -49, 25, -255, 208, 144, 9, 79, -175, 244, 27, -141, 86, 107, -311, -61, 29, -22, 2, 59, -53, 48, -1552, -1085, 466, -454, -427, -1319, -374, 293, 119, -252, -729, 0, 384, -18, 60, 398, 699, -588, 1578, -394, -511, -149, -79, 17, + -611, 24, -100, 341, -200, 479, -185, -390, 173, 203, -347, 399, -1185, 19, -86, 486, 586, -408, 547, -197, 163, -248, -77, -149, 440, -48, 576, 894, -761, -206, 425, -510, 324, -580, -316, -284, -336, -593, -299, 290, 238, 471, 608, 444, -717, 100, 143, 182, 156, 473, -218, -482, 290, -119, -375, 84, -648, -263, -563, 61, 346, -200, 333, 183, -11, -116, -1, -502, -183, 177, 94, 120, 44, 66, 54, 167, 52, -334, -39, 60, -26, 97, -149, -136, -327, 94, 305, -329, -228, 181, -77, -336, 234, -160, -130, 213, + -8, -57, -97, -145, -196, -208, -48, -176, -102, -88, 155, -4, 2, 234, -309, -1048, 818, -1346, 973, -122, -593, -505, -564, -378, -290, 44, 718, -42, -572, 639, 902, -1344, -346, 109, -96, -198, -51, -175, -225, -381, 521, -163, -360, -633, -626, 647, 182, -103, -53, 14, -125, -159, 157, -556, 327, 660, 501, 314, 636, 732, -396, 166, -578, 656, -351, -94, 14, -927, 322, 785, 149, -306, -241, 1022, -389, -425, 301, -1019, -103, -500, 40, -997, 439, 186, 431, -1625, -1384, 240, -472, -319, -185, -1085, 381, -638, -688, 542, + -457, -271, 246, -105, -195, -30, -41, 238, -521, -246, -502, 10, -210, 113, -56, -403, -150, 153, -8, 38, 129, -443, 77, -564, 283, 94, -395, 139, -474, -99, -161, 44, 281, -188, 290, -138, 481, -204, 310, -155, -31, -9, -36, 99, -27, 5, -17, -99, 21, 170, -26, -67, -37, 57, -38, -58, -24, -26, 35, -26, 1, -23, -36, -22, 52, 1, -56, 0, 17, -75, 67, 1179, -1703, 1679, 475, -84, 114, -1257, 228, 553, -243, 1427, -441, 603, -538, 1575, -84, -241, -639, -249, 207, -186, 622, 479, -197, 18, + -656, 215, 616, 626, -736, 272, -168, 671, -216, 428, -448, -354, -974, 39, -627, -910, 1229, -582, -139, -264, -330, 145, 75, 420, -239, 658, 35, 1214, 447, 1347, 1136, -141, 750, 571, -235, 676, 923, -434, -981, 517, 321, 754, 370, -101, -40, -1042, -127, -324, -400, 1328, -186, -40, 1649, 1099, 574, 726, 355, 23, 161, 950, -19, -280, 258, 795, 354, 443, 200, 543, -62, 139, 180, 373, 104, 77, 39, 21, 289, 459, 173, 615, 14, 371, 359, 696, -43, 470, 405, 71, 336, -2, 50, -144, 120, 178, 67, 82, + -6, -107, -12, 147, -121, 71, 295, -92, 576, 46, 129, -62, -274, 148, -108, 170, 517, -1175, 2245, -310, -253, -148, 1633, -1010, 818, -1105, 1040, 205, -205, 20, 609, -269, 568, -271, -6, 1142, 352, -302, -5, 279, 226, -1123, 298, -414, -101, -596, 569, 531, 85, 247, 960, -328, -1526, 355, 1001, -398, -1003, 257, 717, 232, 2, -1214, -576, -723, 670, 260, 690, -1459, 94, -278, -1599, -426, 237, 713, 1009, -548, 1884, 355, 34, -400, -758, -538, 357, -885, 1777, -581, 75, 1038, -690, 628, -674, -400, 1475, -759, 968, 877, + 326, 392, -1273, -166, -64, -460, 603, 528, 223, 151, 588, -154, 231, -85, 178, -266, 211, -59, 179, 120, 42, -451, -71, 44, -152, -68, 314, 156, 516, -249, 112, -854, -700, -119, -39, 482, 380, -255, -170, -686, 3, 212, -102, -19, 166, -229, 157, -512, 35, -185, -186, 305, -1320, 756, 485, 757, -299, -213, 308, 4, 89, 30, 151, 37, -206, 978, -226, -672, 287, -16, -590, 208, 139, 404, -271, -447, 485, -387, -51, -114, 398, -682, 235, -423, 348, -600, 216, -201, 106, 1319, -904, 173, 292, -816, 299, 377, + -603, -125, -230, 1097, 95, -1268, 762, -1025, 189, 531, -490, 608, -732, -605, 836, -141, 357, -1249, 236, 271, -64, -192, -8, 508, 22, -1661, 1009, -104, 389, -436, -506, 1585, -40, -1013, 90, 512, 119, -1541, 57, 1430, -259, -661, 159, 692, -90, 3, -119, -71, 101, -250, -144, 470, -201, -13, -274, 276, 422, -75, -60, 444, 148, -305, -70, 191, 131, -259, 142, 306, -252, 66, 79, 197, -471, 30, 300, 113, -328, 19, 237, 39, -242, -165, 265, 642, -200, -3251, -6935, -2757, -5217, -6358, 2275, -9, 2333, 8825, 7710, 4393, + 8447, 4717, 547, 2929, 1809, -3173, -2238, -648, -3518, -4259, -1407, -2149, -3368, -835, -138, -4293, -2953, -435, -2603, -3375, -973, -1649, -3670, -693, 390, -2052, -1561, 1572, -546, -2202, 479, 1481, -1079, 913, 3241, -461, -847, 3207, 1719, -784, 5318, 7222, 4501, 7615, 11385, 8760, 8338, 12177, 10559, 7775, 9536, 8670, 5521, 4884, 2636, -892, -3786, -6785, -9645, -11481, -14398, -15385, -16223, -18382, -18368, -13880, -14202, -12934, -5817, -4499, -4375, 1959, 3728, 93, 3884, 5385, 1852, 2573, 5051, 3778, 2206, 3569, 4416, 1884, 2754, 5477, 3263, 2152, 5048, 3788, 1538, 3285, 3751, 492, 1943, 4512, + 2592, 3107, 6356, 5980, 6301, 8155, 8213, 6589, 6234, 5321, 3254, 2348, 1254, -186, -1271, -3463, -4735, -6404, -8535, -9506, -10741, -12505, -11908, -10696, -9445, -6905, -4525, -2398, -881, 377, 795, 972, 1253, 1327, 1124, 1200, 1326, 1287, 1443, 1865, 2093, 2240, 2496, 2574, 2610, 2744, 2538, 2182, 1635, 1021, 649, 183, -120, -209, -312, -445, -437, -375, -207, 25, 268, 544, 639, 694, 810, 868, 862, 905, 999, 953, 861, 960, 855, 631, 777, 802, 544, 549, 476, 129, 37, -6, -367, -607, -696, -883, -1073, -1114, -1191, -1371, -1401, -1387, -1487, -1562, -1492, -1461, + -1488, -1343, -1149, -1040, -852, -532, -300, -102, 183, 436, 562, 684, 846, 890, 866, 889, 861, 770, 710, 654, 568, 484, 421, 342, 263, 209, 169, 123, 93, 65, 37, 20, 9, 0, -4 }, + {-218, 7, 175, 120, 121, 76, 48, -68, 3, -77, 187, 114, 45, 28, 28, -2, -58, 92, 129, 124, 76, -93, -134, -147, -139, -14, 74, -144, 121, -29, 212, -35, 135, 2, -174, 50, -22, 142, 11, -16, -70, -119, 12, 68, -153, -210, 148, -121, -111, -105, 84, -83, 36, -37, -9, -123, -36, -84, -122, 41, 96, -35, -134, -26, -27, -68, -116, -9, -94, -112, -19, 8, 27, -38, 18, -21, -157, -35, 21, -43, -39, -49, 52, -60, 53, -4, 10, 20, -38, 38, 1, -21, 10, -10, -32, 5, + 26, -17, -13, -1, 41, 18, 7, 6, 23, 15, 26, 7, 33, -27, -11, -12, 411, -145, -95, -129, -89, 9, -276, 46, -138, -271, -59, 230, -167, 44, -21, 77, 116, 124, 201, -44, -117, 51, 48, -94, -15, -63, -42, 24, -107, -67, -17, -134, -158, 79, 120, -73, -181, -32, -44, 25, 144, 9, -62, -10, 193, 24, -121, -116, 49, 36, 154, 88, -12, -149, 7, -9, 126, -137, -47, 74, 147, -42, 12, -113, -65, 68, 3, 14, 39, -44, 52, 15, 64, 40, 24, 257, 77, -11, -36, -76, + 109, 68, 118, 85, 28, 31, -27, 23, -50, -52, -41, 13, -20, -13, -10, 41, 5, 54, 3, -18, -9, -6, -10, 17, 11, 22, -302, -71, -142, 139, 35, 4, 99, -58, -233, -123, 156, -8, 160, -11, -90, 178, 67, 389, -73, 169, 25, -183, 47, -155, 101, 36, 40, -166, 84, -28, -58, 69, 265, 99, -1, -212, 185, -38, 2, 131, -192, -36, 134, -79, -68, -217, -237, -18, 145, 85, -95, -2, 95, 118, 48, -24, -45, -208, 99, 260, 119, -75, -36, 83, 125, -9, -38, 31, -171, -32, + -120, -56, -10, -74, 199, 173, -51, 87, 65, -33, -116, 28, -90, -34, 28, -117, -24, 12, -33, 33, 51, -75, -26, -5, 6, -59, 16, -27, 45, -52, 50, -36, 13, 8, -24, 20, 10, -19, 18, 19, 21, -39, -17, 1, -54, 7, 33, -11, -225, 255, -217, 233, 0, -183, -434, -170, -123, 67, 230, 181, -53, -33, -51, -123, -34, -139, 50, 54, 88, 146, 87, 277, 3, 57, -95, -21, -64, 103, 32, -126, -183, 10, -131, 19, 128, -207, 149, -350, -95, -259, 47, -14, 7, -100, -136, 51, + 127, 92, 35, -208, 66, -143, -53, -39, -284, -109, 88, 113, -7, -195, 36, 77, -36, -37, 26, 174, 64, -36, -53, 33, -405, 32, 106, 100, 290, 43, -159, 183, -61, 30, 66, 63, -39, -131, 10, 82, 78, 125, -36, -37, 24, -20, -13, 22, -32, 14, 31, -14, -63, -48, 0, 11, 20, -29, 65, -30, -16, 43, 49, -11, -70, -35, 31, -34, -17, -20, 18, 59, -8, 14, 61, 291, -74, 4, 192, -99, -92, 287, -219, -518, -340, -200, 311, 132, 43, -300, 318, -137, 89, -82, 125, 153, + -12, 4, -2, -52, -164, -133, -40, 17, 145, 82, 226, 107, -98, -53, 201, -145, 246, -197, 53, 108, 70, -160, 217, -22, 234, 307, 48, -123, -118, 129, -147, -313, -80, 65, -200, 114, 93, -67, -124, -54, -47, 59, -23, -176, -66, 303, 245, 131, -361, -356, -193, 340, 174, -28, 49, -169, 217, -11, -166, -59, 24, -17, -83, -13, -65, -36, 65, 93, -54, -2, 10, 15, 15, -94, 109, -8, -105, -64, -13, -34, 4, -9, -12, -12, 27, 4, -47, -4, 21, -13, -75, -53, -69, -26, 54, 149, + 218, -9, 86, -335, -111, 59, 119, -417, -43, 184, -123, -270, 173, -315, -230, -123, 31, -112, -75, -7, 239, -197, 55, -60, -80, -166, -44, -243, -71, -4, 50, -169, -33, -106, 19, -52, -74, 48, 197, 53, -98, 100, -146, -34, 60, -53, 100, -28, -8, -681, 48, -234, 118, 102, 154, -373, -381, 55, 16, 93, 5, 208, -80, 114, 140, -62, 324, -97, -207, -41, -171, -3, -340, 8, 172, 83, 258, -68, -68, 116, -133, 35, 85, 168, -86, 98, -132, 30, 7, 21, -64, -28, -47, 56, -59, -94, + 0, -43, -59, -19, -46, -17, -28, 31, -46, 31, -95, -7, -56, -21, 9, 10, -12, -43, 6, -31, 16, 5, 265, -534, 143, 23, 148, 215, 39, -207, -455, 32, -184, 346, -141, 71, 25, 74, 260, -115, -9, -121, -69, 68, -66, 245, 182, 53, -53, 4, 163, -16, 78, -3, -136, 120, -36, -100, 144, 246, 0, 97, 16, -162, -102, 298, -145, 143, 216, -287, 204, 111, 103, -127, 209, 62, -38, 270, 9, -2, -127, -71, -2, -116, -289, -74, 292, 223, 240, -26, -257, 107, 307, -56, -220, -10, + -156, -38, -27, 242, -25, 125, -33, 13, -171, 47, -31, 68, 64, -115, 77, -183, 16, 69, 3, -45, -5, 39, -130, -21, -123, 40, -78, -45, -76, -121, -84, -29, 15, -35, -6, 42, 11, -29, -26, -34, 68, 5, 23, 49, 26, 35, -19, 64, -12, 5, 22, -20, -36, 20, 61, -254, -75, -409, -120, -238, -280, -266, -94, 356, 388, 534, 119, -205, -126, 442, -2, -104, 339, -36, 14, -530, 239, 133, -354, 489, -69, 220, -60, 115, 217, 0, 384, 147, 109, -45, -137, 36, 233, -63, 69, 109, + 308, -15, -94, 199, -235, -148, 105, 341, -152, -183, -58, 281, 2, 39, -106, -48, 100, 148, 12, -122, -389, 46, 114, 370, 107, -30, 284, 508, -105, 178, 119, 210, -42, -179, 104, -421, -115, -64, -137, -85, 219, 75, -273, -161, 7, -89, -10, -209, -7, -72, -53, -29, 20, -58, -15, -29, 44, -17, 40, -57, -2, 9, 18, 84, 2, -33, 79, 115, -10, -71, -45, -100, -88, 120, -21, 32, 44, 42, 39, -92, 45, -33, -467, 644, -331, 143, -28, -228, 490, 112, 57, -527, 131, -213, -242, 54, + -236, 260, 156, -49, 49, -132, -62, -194, -126, -232, -356, -91, -251, -71, 130, -104, -137, 274, 171, 275, -234, -30, -50, -257, -2, -139, -632, 50, 7, -102, 213, -27, 236, 199, 71, 373, 332, -336, -95, -2, -16, 113, 41, 316, -73, 508, -5, -307, -250, 34, 88, 100, 368, 93, 89, 345, 462, 14, -290, -276, -30, -96, -70, 597, 39, -279, 191, -245, 225, 33, -52, -77, -188, 46, 57, -33, 49, 96, 52, 64, -32, -31, 2, -39, -33, 63, 22, 43, 56, 102, 2, -56, 96, 52, 15, 17, + -26, 10, -9, 102, 163, -96, 75, -26, 65, 3, 10, 137, -12, 8, 7, 112, 73, 80, 52, 8, 386, 26, 259, -290, 125, 19, -25, 170, 408, -117, -41, 375, -504, -283, -222, -577, 110, -186, -84, 65, -395, 425, 320, 452, 201, -288, 24, 14, 338, -67, -14, -17, -215, 13, -128, 186, -228, -89, -79, -101, -266, 119, -389, -63, -30, 238, 140, 28, 1, -72, 25, -1, 198, 42, 55, -37, -607, -286, 67, 246, 297, -478, 314, 89, -189, 41, 100, -117, 456, -1, 85, -113, -641, -224, -294, -81, + 9, -183, 89, 131, -134, -33, 408, 6, 207, -258, 29, -10, 234, 203, 148, -63, 47, 165, 102, -14, 179, 169, 190, 19, 71, 59, 29, -31, -26, 159, 29, -94, 13, -20, 90, -71, 27, 79, -69, 127, 45, -26, 10, -123, 84, 79, -15, -33, -73, -104, 27, 596, 98, 243, -353, -319, 190, 311, 40, -105, 572, 183, 6, -153, 128, -40, -59, -17, -94, 31, -185, -446, 152, 51, 141, 49, 254, 81, -266, -544, 18, 45, -41, -476, -231, -68, 138, -100, 57, -416, 24, -89, 6, 47, 120, -41, + -392, -359, -223, 157, 116, -92, -79, -629, -355, -8, -615, 573, -580, -156, -375, 615, 199, -425, 219, -45, 234, -362, -118, 21, 251, -343, -136, -114, -350, 30, 238, -40, -62, 428, -667, 532, -85, 116, -299, 217, -31, 174, -150, 13, 137, 151, -39, -69, 4, 20, 20, -44, 168, 178, 125, 37, 127, -7, 155, -51, 31, -2, -55, -54, 13, -121, -150, -39, -7, 159, -7, -20, -40, -101, 77, -29, -53, -33, 82, -12, -171, -18, 64, 20, -14, 526, 1146, -149, -351, -329, -289, -418, 75, -714, -1, -551, + -252, 176, 354, 204, -245, -30, 337, -19, 388, -224, -225, -199, 186, -130, -170, 65, -204, -210, 265, 617, 237, 266, 121, -357, -80, -289, -272, -40, -45, -226, -363, -737, -64, -265, 101, -133, 283, 261, 151, 273, 195, -25, 524, 744, 182, -863, 182, -152, -502, 74, 254, 127, 28, 242, -9, -409, 31, 199, -408, -214, -382, -715, 571, 82, -36, 398, 314, 26, 29, 394, -524, -227, 66, 291, 249, 374, 273, -215, -120, -45, -78, -28, -46, -102, -132, -212, -211, -152, -76, -19, 114, -55, -37, -243, -162, 30, + 137, 94, 61, 56, 44, -31, -119, -57, -71, -66, 32, -132, 36, -93, 111, -7, -28, -88, 93, -81, -19, 176, -63, -1, 846, -617, 733, -56, -82, -365, -131, -363, -307, 393, -340, 206, 878, 329, -123, -388, -324, 394, -312, -533, -215, 60, 58, -609, 50, -182, 327, -189, -2, 76, 923, -217, -286, 449, -347, 539, -305, 396, 73, -278, -252, 501, -634, 493, -269, 55, -146, 271, -215, -109, -1, -193, 942, -264, 645, 252, 300, 0, 249, 414, 466, -122, -437, 6, 386, 157, -60, -556, 756, -153, -487, -133, + -296, 238, 331, 17, 549, -143, 286, -612, -101, -653, -197, -237, -7, 40, -119, 238, 85, -174, -294, -221, -57, -25, -143, -29, -45, 189, -46, 11, -62, -281, -77, -111, 44, -44, -151, -246, 107, -165, 87, 113, -165, -423, -92, -64, -104, -149, 27, -69, 56, 52, -184, -23, -185, 183, 121, -100, 59, -169, -955, -408, 584, -117, -241, 679, 64, -354, 257, 369, 313, 48, -588, -243, 88, 86, 306, 202, 345, -300, -238, 116, -83, 283, -553, -94, -598, -193, 107, -82, -76, 639, 132, -473, -73, 38, -485, -65, + 22, 291, 733, -260, 244, -410, 60, -241, -312, 299, 641, -509, 48, 572, -260, -53, -216, 375, 89, -465, -7, -162, -153, -46, -230, 347, -824, 175, 67, -345, 459, 707, 497, 1346, 406, -345, -480, -395, -218, 495, -180, 687, 61, 836, -995, -636, 297, -162, -105, 402, -273, -30, 424, 191, 314, 468, 362, -78, 146, -284, 8, -10, -203, -218, 143, -301, -29, 459, 39, -271, -359, 68, -451, -163, 479, 252, -82, -108, 89, -87, -155, 35, -114, -169, -33, -233, 163, 147, 156, -85, -67, 105, 243, 663, -1574, -68, + 888, -1197, -60, 229, -1237, 545, 144, 981, -104, 343, 285, -1089, -903, -355, -93, -548, -672, -358, 610, 426, 367, 34, 64, 189, 32, -792, -300, -1015, -328, 559, 162, 376, 1264, 325, 474, -25, 248, 1113, 835, 229, 546, 501, 1110, 911, -1222, 756, -74, 724, 736, 304, 1333, 1178, -658, 581, -14, 553, -984, 91, 100, 32, -227, 616, 666, -655, -225, -386, 231, -544, -675, 625, 1068, 390, 1112, -326, 1513, 1482, 410, 776, -233, -394, 344, 341, 162, 114, 86, 197, -217, -387, -280, -724, -760, -308, 347, -13, 305, 51, + 184, 455, 557, -186, 253, -31, -238, -196, -171, -478, -224, 4, -416, -149, -375, -207, 74, 513, -249, 183, 140, -90, 280, 163, 212, 3, 373, 240, 159, -154, -235, -101, -506, 722, 1305, -184, -1795, -577, 177, -145, -302, -398, 1, -1029, -619, -855, -142, -254, 278, -612, -179, 158, 280, -12, 312, 613, 123, 887, -579, 210, 31, 846, 219, -172, -862, 565, -152, 771, -656, -523, -498, -269, -794, -114, -140, -749, 406, 842, -413, 120, -1103, 1052, -336, -581, 480, 417, -631, 50, -394, 133, -289, 1318, -50, -119, -327, 2331, + 59, -322, 1001, 798, -849, 658, -1040, -583, -1087, 825, -748, 396, 572, 449, -963, 1211, -219, -1599, -1816, -722, -222, -533, 425, 411, 720, 112, 65, -546, 545, 846, 1252, 323, -355, 115, 1066, 170, -584, -152, 1138, 253, -668, -181, 563, 316, 514, 336, 722, -2, 399, 132, 513, 233, 813, 260, 515, -109, 165, 29, -55, 207, -67, 271, 509, 67, 298, 28, 386, -870, -194, 654, 60, -504, -2407, 172, 1546, -935, -623, 1242, -904, -59, -257, 1192, -2047, 1144, 679, -578, 213, 1118, 798, -391, 456, 205, -312, 526, -12, 319, + 484, -206, 117, -52, 230, -296, -239, -19, 415, -1214, -601, 604, -137, -804, -951, 165, 1182, -513, -756, 582, 882, -192, 221, -155, 821, -446, 1232, -166, 2, 676, 14, 156, -876, 1377, -712, -860, 653, -911, -302, 155, 454, 1272, -452, 794, -162, 416, -2153, -1645, -303, -640, 328, 299, 816, -127, -172, 977, -1069, -22, 682, 676, -250, 754, 93, -158, -5, -164, 718, -397, -42, 704, 160, -156, 275, -345, 88, -24, 10, 287, 131, -395, -93, 127, -312, -452, -8, 336, 583, -490, 570, 200, -574, 478, 540, -269, -650, 600, + -298, 114, 325, -322, -860, 285, 228, -470, -451, 38, 321, -371, 136, -160, -789, -363, 602, -987, 994, -839, -1055, 618, -503, -336, 631, -451, 530, -351, 253, 1218, -1065, -65, -152, 1028, 150, 109, -952, -893, -309, -252, -128, -279, 191, 65, -86, 163, 230, 117, 181, -174, 487, -295, 466, -845, 43, -683, -889, -519, 1210, -504, -515, -379, 287, -226, 545, 789, -803, 742, 143, -1114, -552, 2342, 1220, -1753, -321, 1134, -557, -632, 463, -544, -1208, 889, 411, -1646, 695, 854, -964, -631, 1002, -230, -733, 183, 503, -1189, 239, 225, + 357, -905, -262, -67, -283, -51, 71, 115, -551, 101, 840, 300, 63, 285, -4, -125, -445, -129, -236, -323, -770, 220, -435, -112, 969, -836, -543, 718, -499, -174, -210, 330, -542, -189, 894, 479, -420, 508, 290, -356, -222, 1213, -949, -735, 1291, 4, -1009, 152, 642, -593, -1263, 862, 117, -1402, 255, 406, -1020, -11, 706, -182, -447, 376, 303, -699, -59, 536, -392, -501, 360, 33, 1455, 2064, -838, 2312, -192, -643, -501, -794, -76, 382, 1359, 39, 411, -355, -1191, 15, 33, 771, 137, -899, 1648, -716, 299, 739, -838, -678, + -1192, -524, 717, 902, 1110, -430, -2758, 602, 1421, 1832, 1567, -31, -799, -981, 319, 931, -611, -323, -2446, -1497, 1294, 2194, 438, -67, -548, -969, -240, 604, -866, 327, -136, 1385, -74, 536, -2736, -352, 18, 1665, 1280, -41, -830, -231, 1973, 892, -2349, -2897, -1145, 575, 4472, 479, -796, 612, -1218, 3183, 957, -2545, -1605, -322, 2235, 333, -955, -874, -821, 636, 1195, 603, -1324, -113, -467, 1073, -135, 648, -247, -279, -885, 334, -284, -96, 655, -1062, 600, -163, -181, 2, 469, 1047, 511, 69, -227, 220, -29, 424, 120, 468, 96, 117, + -553, 245, 259, 190, -18, 156, 77, 465, 540, 433, 40, -306, -471, 133, 209, -272, 229, -377, 957, -1103, 34, -444, 255, -684, 641, 177, -363, -690, -338, -132, 201, -941, 218, -462, -178, -737, -346, 595, -627, -223, -85, 290, 199, -246, 340, -541, -41, 5, 291, -355, 514, 380, -387, -453, -170, 726, -522, 228, 544, 118, -525, -204, 230, -333, 249, 22, 122, -490, 106, -399, -14, 366, 469, 359, -265, 343, 48, -436, -60, -4, 522, -145, 113, 447, -93, -589, 823, -335, 489, 352, 88, 111, -341, -427, 569, 84, + 501, 148, 275, 136, -11, -28, -428, 47, 121, 151, 177, -55, 205, 32, -21, 53, 31, 204, -51, 159, -194, -53, 5, 14, -107, -66, 388, 239, -60, -277, -305, -118, -120, 348, 41, -109, -226, -122, 38, -196, 410, 34, -158, 65, -2, -77, 120, -122, 357, -334, 247, -325, -895, 1660, 146, 86, -677, 381, -62, 432, 328, 507, 52, 126, -292, 78, 464, -51, 252, -45, 77, 99, 185, -203, 350, -246, 28, -44, 116, -36, 67, 265, 291, -148, 126, 53, -71, -132, 389, -126, 79, -117, 202, -6, -193, 391, + -251, -90, 101, -191, -117, -63, 12, -76, 2, -43, -107, 130, -259, 156, 105, -92, 165, -133, 196, -108, 35, 35, -124, 193, -4, 23, -66, 261, -319, 332, -242, 36, 54, -14, 59, -58, 191, -187, 10, 163, -205, 122, 111, -34, 22, 110, 51, -57, 73, 17, -29, 12, 64, 4, -88, 19, 32, -47, 95, -25, 77, -56, 10, 59, -44, 6, 41, -67, 104, -14, 50, -18, 110, -44, 11, 102, -95, 118, -73, 49, -75, 116, -21, 319, -1519, -3782, 588, 2881, 2676, 4643, -1185, -1242, -3161, -4315, -890, 1561, + 1670, 3146, 1709, 136, -817, -2195, -1561, -269, -244, 783, 726, 420, 268, 212, -116, -539, -42, 624, 4, 132, -36, -467, -358, -794, -779, 354, 325, 723, 1098, 824, 402, 147, -1187, -838, -650, -649, -726, 153, 462, 805, 1027, 851, 184, -99, -682, -694, -414, -200, 66, 116, 229, 22, -224, 77, -356, 187, 301, 36, 603, 732, 225, -137, -805, -1057, -428, -194, -125, 540, 416, -108, 472, 516, 286, 357, -198, -380, -308, -437, -350, -63, -336, -130, 17, 271, 377, 549, 470, 437, 344, -177, -412, -686, -850, -491, -370, 50, + 402, 598, 689, 549, 501, 327, -431, -761, -692, -335, -101, -28, 49, 295, 255, 126, 56, 242, 133, 211, 55, -317, -354, -228, -96, 114, 75, -112, -69, 114, 54, 52, 143, 239, 104, 11, -121, -130, -117, -133, -183, -130, -14, 108, 139, 193, 197, 117, -10, -84, -116, -97, -101, -66, -53, -9, 45, 82, 58, 43, 26, 44, 20, -12, -77, -64, -28, 29, 32, 16, -33, -20, -9, 4, 0, 23, 29, 20, -15, -6, 3, 18, 7, -5, -24, -24, -27, -6, 7, 11, -1, 12, 22, 36, 19, 0, + -24, -26, -27, -12, -6, 0, 4, 18, 12, 8, -2, 0, -3, -1, -3, 3, 0, -3, -9, -4, -1, 3, 0, 1, -1, 1, 0, 2, 1, 2, 0, 0, -1, -1, -1 } + }, + { + {-178, -2, 39, 30, 127, 17, -15, -82, 187, 116, 6, -23, 186, 63, -59, -163, 104, -47, 81, -155, 10, -37, -115, -31, -58, -21, 9, 1, -84, -51, -13, -16, -52, 56, -5, -56, 100, -165, -78, 79, -99, 14, -62, -91, 62, 56, -49, 62, 120, 68, -62, -73, 13, 24, -73, 79, 132, -113, -36, 65, 49, -27, -34, -55, 73, 22, -87, 99, 48, -81, -61, 104, -79, -101, -190, -165, 90, 104, 8, 46, -18, 37, -70, 107, -9, 49, -49, 28, -45, -35, 2, 68, -15, -17, -31, 10, + -23, 5, 8, -14, -17, 2, -1, -6, -18, 9, -7, 238, -23, -48, -98, 152, -81, -9, -124, -132, -166, -78, 130, -135, -51, -48, 45, -34, -185, 96, 46, 359, -37, 168, -34, -9, -16, 18, -76, 139, -37, -28, -84, -16, -30, 215, 40, -22, -202, -21, -39, 61, -129, -36, 35, 29, -36, -22, -80, -30, -96, -44, 186, -55, 59, 104, -25, -102, -133, 34, 31, 40, 83, 97, 81, 46, -37, -36, -43, -188, -45, -20, 91, 77, -46, -5, 99, -104, 41, 2, -26, -61, -91, -2, 54, 54, + 58, -25, 24, -22, 5, 81, 33, 6, 1, -13, -2, 5, 16, -11, -11, 35, 18, 35, 37, 7, 21, -6, 6, 2, -16, -43, -8, -314, -76, -5, -66, -46, 111, -220, -185, -108, -72, 32, 250, -53, 0, 31, -177, -46, -148, -22, 264, -20, -127, -83, 4, 54, 54, -73, -333, -159, -44, -128, 13, 7, 136, -87, 121, 30, -61, -178, -149, 208, -170, 114, 34, -109, -40, -97, -69, 98, -183, 96, 33, -2, 32, 14, -17, 5, -92, -127, 10, -38, -93, -37, -145, 170, 117, 30, 140, 17, + -58, 173, -90, -56, -58, 132, -127, 58, 93, 6, 58, 143, 53, -4, 10, 31, 25, -27, -16, 2, -6, 47, 23, 49, 37, 14, -43, -51, 32, -1, -2, 48, -32, -25, 0, 12, 16, -4, -52, 44, 13, -39, -214, 257, 292, 78, 77, -87, 135, 67, -175, 52, 109, -208, -182, 178, -160, -25, -104, 180, 37, -23, -69, -3, -120, 108, -61, 64, -31, -3, 116, 45, 14, -48, 114, 72, 32, -12, 118, -11, 20, -78, 144, 31, 56, 105, -296, -97, -60, -107, -105, 28, 162, -73, -46, -91, + -43, 34, 70, -204, -15, 69, 6, -18, 85, 56, -192, -55, -44, 116, -127, 164, 177, 93, 34, -85, -7, 13, 117, -34, 12, 13, 15, 176, 17, 188, 67, 1, -93, -53, 75, -17, -3, 6, 2, 16, 76, 21, 28, 2, 27, -64, -8, 19, 22, -17, -13, -1, 22, -20, -17, 25, 22, 46, 19, 43, -30, 2, 2, -19, 38, 59, 328, -59, -3, 120, 79, 59, 111, 291, -79, -25, -278, 7, -238, -303, 12, 131, -391, 135, 130, 72, -118, -93, -129, -48, 9, 9, 127, 166, -21, -161, + -97, 123, -173, -86, -146, 33, -237, 120, 21, -15, 40, -7, -53, 1, 156, -176, 217, -162, -17, 40, -106, -88, 86, 42, -32, -82, 162, 68, -110, -223, 28, 53, 133, -5, -56, 12, 72, -53, 314, -104, -48, -221, -145, 352, 145, -77, -18, -122, -134, -10, 51, 10, -64, 76, 44, 106, -9, -76, 33, 4, -32, 31, 32, -8, 16, 42, 16, -10, -29, 18, 14, -29, 60, 49, 19, -29, -71, 5, -3, -3, 36, -36, 27, 39, 12, -22, 91, 212, -279, -164, 198, -145, -155, -170, -204, 149, + -50, -5, -46, 9, -227, -44, 106, 116, 28, -119, -174, -144, -183, 39, 223, 31, 73, 77, 75, -128, 138, 86, -96, -77, -298, 48, 69, -234, -17, 74, -43, 30, -20, -251, 216, -234, 187, 11, 95, -264, -147, -236, -185, 36, -65, -83, -104, 1, 120, -218, -2, 65, -69, -243, -152, -50, 48, 120, 53, -200, 217, -68, -46, 215, -279, -91, -54, -49, 337, -121, -4, -126, -104, 62, 48, -7, 37, -26, -46, 63, 2, 26, 28, 82, -30, 24, 19, 6, 23, -92, 122, 110, -36, -18, 18, -15, + 22, 4, -7, -44, 29, -22, 12, 107, 69, 58, -42, 76, 32, -30, 36, 12, 27, 9, 431, -388, -205, -259, 183, 68, -133, 85, -4, 255, 14, 0, -251, 173, 282, 296, 246, -140, -23, 36, -161, -111, 39, 16, -231, -114, -99, 110, -20, -175, -82, 55, 135, 15, -50, 0, -124, -5, -10, 17, -264, 151, 178, 35, 91, 105, -214, 301, 271, 49, -191, 106, -69, -281, -73, -90, -6, 16, -7, -170, -153, -349, -292, 3, 174, -160, 72, 22, -109, -284, -30, 165, -112, 148, 291, 88, -123, 168, + -2, -19, 78, 131, -13, -24, 35, 84, -48, -191, 9, -6, 19, 23, 62, 139, -51, -25, 104, 95, 19, 13, -69, 134, 14, -10, 79, 25, 28, 13, 71, 64, 71, 118, 8, 70, 9, 78, 36, 44, 29, 74, 65, 53, -414, 42, -155, -554, -426, 105, 3, -97, 97, 264, -43, 158, 140, 81, -44, -145, 116, -124, 14, -106, 165, 302, -274, -80, 16, 109, 28, -86, -51, -103, -9, -127, 160, 34, -193, 212, -215, -70, 262, 230, 194, -224, -147, -201, 231, 312, -6, -67, 248, -368, 44, 97, + -36, -310, 276, 95, 140, 258, 13, -374, 97, 151, -96, -30, 256, -268, -250, -217, 25, 328, 178, -50, 378, -505, -186, 4, 241, 110, -73, -402, -63, -163, 44, 150, 389, 64, -111, 48, -67, -29, -129, -2, -107, 34, 106, 58, 97, 108, 35, 21, 0, 17, -54, -59, 5, 114, 44, -17, 20, 44, 93, 9, -32, 13, -31, 72, -140, -88, -62, 84, 75, -125, 27, -446, 447, 181, -12, -47, 36, 76, 242, -48, 25, -79, -58, 136, 69, 158, 69, 90, -305, -127, 508, 50, 150, 212, 79, -174, + -322, 98, -135, 11, 111, -161, -189, 227, 266, -141, -101, 206, -256, 110, -198, 87, -191, 274, 37, -38, 96, 472, 129, 182, -55, 23, 79, 348, -32, 500, 13, 237, -10, 451, 159, 336, 255, -59, -153, -43, -174, -193, 264, -55, -105, 39, 2, -138, -68, 40, 117, 31, -229, -227, -118, -232, -7, -7, -69, 62, -6, 91, -15, -96, 18, -42, -174, -111, 23, 230, -99, 84, -27, -4, 106, -82, 35, 51, -60, -42, -30, -68, 31, -85, -109, -43, -118, 145, -42, 7, -14, -11, 15, -51, 21, 35, + 18, 58, 79, 12, 58, -46, -127, 23, -36, 51, -52, 523, -134, -2, -639, -20, 345, -177, 300, -406, 62, 44, -10, -539, -22, -899, 45, -97, -376, -63, 53, -195, 36, 231, 37, -204, 40, -61, 202, -219, 15, 292, 67, 27, -41, 224, -141, 26, 1, 173, 35, -302, -160, -212, 253, -567, 278, 230, 197, 112, 44, -247, 179, -367, -86, -75, -75, -14, 25, 122, -283, -109, 481, 204, -173, -200, 54, -82, 148, -95, -28, -152, 436, 224, -148, 30, -220, 54, -166, -55, 174, 164, -49, 320, -123, 161, + -207, 225, 34, -126, -174, -257, 67, -25, 120, -30, -76, 51, 50, 82, 65, 149, -5, 50, -112, 94, -80, -37, -60, -9, -142, -21, 57, 133, -122, -56, -88, 92, 69, -53, -11, -92, 74, 12, 329, 332, 192, 172, -164, 191, 319, -240, -10, -620, 353, 241, -90, 142, -42, 48, 219, -140, 344, -313, 28, 388, 169, 23, 298, -107, 136, 78, 159, 264, -159, -33, 488, 244, -13, 67, -334, 450, -382, -25, 393, 122, 423, -268, 66, -18, -106, 56, -413, -289, 385, -194, -85, -132, -439, 309, -105, -73, + -196, 190, 442, -351, -73, 299, -331, -144, 265, 372, -619, -165, -55, 263, -11, 307, -77, -226, 13, 163, 396, 200, -270, -14, 194, -397, -245, -76, -206, -207, -27, 188, -180, 44, 194, 54, 33, 137, -36, 88, 83, 84, 46, -16, -122, -41, -35, -109, -51, 17, 12, -16, 15, 120, -101, -32, -76, 58, 54, -23, -84, -181, 90, 69, 116, 33, 27, -13, -115, 46, -47, -51, -35, 32, -22, 322, 684, 132, -404, -144, 134, -897, 28, 5, -141, -44, 414, -677, 148, 316, -249, 280, 523, 130, -484, 131, + -122, -9, -474, -143, 432, -48, 396, -104, -140, 65, -336, -188, -242, -179, -133, 324, -358, 58, 624, 422, 140, -634, 105, 417, 173, 25, -227, -275, -678, -468, 96, -231, -233, -13, 288, 206, -205, 9, 411, -158, -71, 19, 540, 21, -28, 276, 85, -616, 172, 179, -4, -510, 214, 300, -226, -159, -420, 112, -155, 159, 78, -98, -179, 116, 51, 179, -90, 279, 97, -190, 21, -9, -264, 6, 20, 0, -7, -137, -121, -55, -5, 175, 56, 92, 140, -64, -86, 68, -138, -122, -7, -6, 41, -40, 29, 87, + 89, 12, -56, -12, -9, -15, -1, -22, 9, -2, 117, -68, -88, 217, 153, -20, 58, -97, 42, 3, -41, -206, 702, 34, -147, -14, 308, -155, 81, -81, 69, 263, -493, 511, 580, 160, 243, -202, 327, 765, 21, -93, -146, 323, -120, -191, -69, 112, -387, 166, -341, 382, 84, 384, -248, 350, 102, 459, 73, 93, -170, 285, 69, -96, 413, -166, -300, 585, 466, 170, 441, 641, 778, -247, -248, -280, 94, -363, 420, -56, -42, -605, 136, 678, 691, -31, -94, -480, 4, 449, -234, -286, 253, 36, -250, 84, + -43, -154, -37, -133, -8, 259, 192, -57, 44, -67, -265, -345, -67, 167, 66, 238, -51, -231, -65, 247, -120, 139, 228, -235, -64, -26, 56, -16, 151, 109, 53, -234, 56, 123, 36, 49, 81, -208, -98, -3, -13, -112, -268, -89, 21, 135, 28, -112, -129, 48, -919, -640, 346, 138, -479, 56, 221, -436, -272, -185, 533, 242, 175, -162, -122, -128, -322, -433, -765, 407, 351, -158, 878, 424, 843, 579, 60, -263, 229, 108, 388, 442, 490, -64, -78, 211, -211, -45, -185, -356, -586, -168, 612, -145, -234, -337, + 248, 371, 251, 29, 364, 699, -406, -184, -311, -227, -661, -159, 177, -300, -230, -766, -1089, 125, -715, -1133, -815, -342, 745, 259, 458, 341, -750, -316, 74, 385, -368, -443, -423, -130, 235, -253, -936, -591, -127, -188, -59, -137, 543, 491, 514, 519, 181, -1, 203, 57, -7, 156, -416, -161, 195, 253, -1, -136, -144, 66, -222, -334, 320, -248, -117, 31, -283, -274, -490, -193, -107, 38, 429, -105, -51, -130, 224, -110, 23, 206, 28, -142, 105, 205, -113, -29, 6, -69, 125, -1742, -259, 583, -582, 264, -216, -937, + -280, 1040, 1305, -666, 41, -217, -1034, -818, -774, -826, -434, -533, -29, 198, -130, 233, 215, -327, -78, -456, 215, -728, -656, 180, 132, -185, -231, 604, -157, 831, 195, 772, -495, 346, 228, 931, 502, 338, 102, 157, -94, 287, 390, -277, -398, 657, -75, -783, -1525, -1832, -1321, 240, 11, -1704, 572, 311, 444, -569, 87, 221, 89, 902, 913, 1818, 610, -942, -1221, -740, -669, -770, -690, -7, 395, 535, -322, 698, -573, -797, -623, -403, -307, -619, 409, -27, 391, 310, 53, 686, -342, -136, -656, 241, 363, -38, -52, 218, + -631, 41, -220, 139, -301, -421, 272, 4, -176, -53, 319, -229, 168, -212, 190, 177, -85, -210, 149, 173, -465, 213, -115, -122, -140, 117, -314, -144, 987, -264, -1865, -533, 1535, -212, 342, 219, 286, 538, 440, 154, -305, -112, 76, -331, -78, 565, -506, -299, -507, -120, 86, 66, 133, 265, -386, 345, 840, -13, -492, 47, -322, -108, 497, -523, 58, 169, 608, 886, -563, -317, 340, 51, 95, 106, -375, -948, -172, -439, 863, -1640, -1084, -440, -182, 480, 97, -575, -101, -663, -726, -253, -526, 101, 425, 1983, 362, -288, + -1276, -1039, 306, -26, -1199, 651, 636, -1207, -28, 323, 345, 1317, 569, 281, -1300, -660, -899, 821, -88, -259, -151, 262, 850, 736, -391, -760, -1130, 281, 656, -226, -123, 593, 326, 518, 121, 191, -441, -120, -213, 230, 221, -51, -110, -55, 300, 357, -519, 305, 214, 430, -280, -178, 253, 103, -379, -28, 421, 92, -331, -109, 44, -634, -2194, 333, 361, -56, -18, -153, -619, 267, -122, 1145, -1146, -220, 1206, -38, -786, -82, 719, 870, 541, -137, 628, -445, 429, -171, -141, -383, 686, 471, -420, -185, -47, 695, -48, 88, + -419, 473, 313, -487, 928, 56, -804, 740, -875, -454, 827, -1716, -1087, 957, -582, 713, -1081, 260, 419, -588, 39, -32, -1117, -248, 1186, 1250, -1389, -451, 445, -1111, 1471, 1472, 225, -2070, -1078, 2232, -1155, -218, 1815, -1040, -2136, -468, 1961, -403, -1402, -333, -2574, -103, 2116, -749, -2077, -197, -571, -266, 641, -58, -7, -747, -482, -227, 857, -1049, 70, 188, -316, 54, 1017, -622, -785, -89, 300, 644, -231, 333, 496, 72, -707, -369, 35, -560, -262, 1124, -399, -1061, -271, 648, 279, -63, 159, -957, -544, 762, 1120, 153, -798, -379, + 54, 311, 571, 77, -313, -1213, -1145, -26, -1446, -423, -614, -576, -437, 946, -103, -295, -397, 190, -508, -1200, 935, 301, 807, 260, 835, -325, -516, 192, -873, 686, -791, -160, 521, -592, -127, -357, -958, 152, -723, -514, -631, -459, -289, -634, 113, 721, -482, -163, 88, 665, -299, 242, -673, 1102, 342, 478, 299, 1058, -62, -1222, 271, 457, -343, 6, 648, -847, -850, -984, 858, 265, -1224, 487, -808, -147, -1142, 516, 810, 179, -1265, 721, 586, -150, -1112, 311, -672, -218, -49, -328, 550, -486, -903, 459, -203, 390, -6, -22, + -7, -233, -282, 202, 803, -86, -1139, -303, 471, -550, -242, 558, -208, -66, -457, 904, 521, -251, 398, -59, 177, 736, -135, -621, 261, 426, -331, 534, -88, 335, 33, -222, 431, 647, -367, -653, 256, 424, -334, -52, 376, 146, -261, -262, 333, 1072, 2017, -492, 998, 190, -482, -909, -531, 1171, -390, 213, 452, -124, 1080, -165, 847, 884, -1096, 557, -290, 21, 397, 326, -41, 172, 321, 1083, 1116, 858, -635, -222, -1491, -51, 349, 666, 152, -1237, 537, -745, 953, -869, -606, 56, -724, -130, -419, 1464, -806, -400, -1543, -508, + -811, 2170, 1321, -465, -1468, -1579, -936, 1076, 1412, 709, 207, -1893, -877, 613, 529, 75, 682, -398, -1242, 581, -2107, 2284, -215, -1488, 3447, 487, 1200, 2059, -3421, -2472, 683, -210, 524, 742, -2138, -166, 433, 36, 1793, 120, -937, -105, 965, -566, 422, 488, 21, -399, 473, -1253, 953, -250, -394, 529, 145, 31, 566, -140, 340, -76, 219, -170, -651, 390, 280, 368, 0, 4, 261, 136, 104, 755, 850, 42, 559, -528, 83, -349, 646, 579, 95, -175, -380, -910, -393, 72, -898, 604, -1268, 782, -523, 1284, -583, -61, 730, 129, + 62, -333, -290, 32, -495, 541, -66, 575, -455, -446, 149, 22, -461, 288, -61, 251, -144, -124, 237, -230, -22, 179, -97, -110, 909, -63, -309, -163, 429, -39, -501, 264, 530, 108, 9, -315, 108, -255, 241, 650, -235, 298, -249, -72, -272, -125, 167, 211, -384, 230, 63, -47, -384, 67, 133, -279, 402, 344, -690, 177, -634, -712, 486, -252, 588, 326, 12, 307, -101, -366, -94, 25, 407, -183, 120, 174, -244, -39, 137, -68, -53, 244, -10, 96, -204, 87, -28, -199, 378, 39, 307, -148, 250, -124, 10, -197, + 164, -92, 373, -113, 352, -364, 73, 31, -87, 20, 36, 294, -23, -330, 213, -182, 25, 213, -220, 367, -748, 1570, 294, 384, -203, 141, -49, 295, 91, 668, 43, -367, 218, -240, 100, 134, -311, 13, 71, -336, 300, 75, -139, 405, -149, 158, -128, 73, 75, 34, -54, -124, -58, 54, 7, -71, -201, 145, -136, 71, 128, -139, 26, -130, 34, -204, -329, 334, -183, -90, 140, 63, -60, 35, 287, -322, 136, -123, 248, -271, 150, 72, -50, 56, 4, 1, 120, -173, 93, 81, -48, -20, 217, -37, 73, -257, + 341, -269, -6, 168, -157, 114, 36, 38, -164, 127, 134, -89, 52, 64, -117, 37, 55, -28, 118, 2, -4, -16, 105, 79, -70, 90, -50, 38, 45, -15, 132, -64, -1, 81, -107, 5, -12, -78, 9, 72, -24, -66, 131, -89, 19, 298, -1398, -3470, 750, 2886, 1951, 4070, -1331, -1138, -2342, -3743, -370, 1167, 1538, 2007, 1012, 111, -328, -867, -1238, -187, -331, 122, 284, -14, 71, 150, 66, 491, 582, 362, -67, 68, -431, -903, -964, -472, -632, 521, 958, 1018, 1117, 613, -181, -441, -822, -867, -604, -338, -40, 220, + 421, 453, 380, 329, -57, 89, -98, 44, -74, -44, -27, -307, -323, -233, -487, 2, -92, 62, 826, 1090, 367, 370, -300, -597, -415, -719, -580, 205, -51, -348, 268, 289, 342, 816, 338, 359, 88, -437, -433, -353, -387, -488, -419, -247, 76, 546, 820, 770, 311, 157, -201, -370, -335, -367, -426, -193, -178, -13, 143, 112, 330, 441, 317, 219, 76, -26, -209, -213, -336, -376, -297, -263, -67, 284, 421, 456, 403, 167, 74, -200, -322, -169, -238, -321, -244, 47, 220, 209, 116, 134, 119, 94, 28, -20, -33, -83, + -109, -99, -118, -136, -74, 65, 114, 148, 123, 90, 31, 4, -36, -51, -67, -72, -82, -47, -18, 29, 48, 48, 41, 37, 8, 1, -9, 6, 6, 19, -27, -48, -42, -23, -22, 10, 29, 39, 23, -12, -16, 23, 36, 31, -10, -38, -45, -16, -1, 8, -5, -8, -11, 3, 11, 26, 20, 20, 14, 4, -13, -19, -26, -22, -23, -13, 5, 24, 23, 22, 13, 9, 6, -3, -18, -17, -13, -7, -3, 4, 0, 1, 2, 6, 7, 6, 1, -2, -3, -3, -2, -1, -1 }, + {-197, 24, 62, 60, 308, 83, 65, -92, 11, -157, 36, 143, -73, 6, -31, -78, -125, 95, -208, -105, -105, 112, 123, 64, 29, 89, 73, 147, -52, 51, 91, 19, 30, -108, -47, -45, -41, 99, -191, 31, -67, 200, 4, -37, -51, -83, -28, -87, -252, -80, -50, -41, -57, 26, -48, -12, -17, 88, 39, -12, 56, -50, 108, -71, -118, 113, 118, -52, -113, 10, 61, 46, 53, -54, 0, 43, 58, 25, -17, 7, 73, 140, 68, -18, -2, -34, -36, 29, -47, 28, 34, -14, -5, 15, 13, -15, + 11, 7, -65, 10, 5, 19, 11, -25, 23, 18, -2, 279, -53, -27, 29, 76, -207, 128, -245, -12, -119, -18, -79, -19, -20, 122, -104, 132, -139, -152, 64, 203, -240, -67, -117, 1, -61, 64, 85, 43, 87, -140, 4, 195, 76, 24, -143, -203, -123, 30, -104, -59, 39, 131, -119, -118, 47, -86, 150, 50, -16, 106, 101, -1, 169, 83, 52, 44, 111, 175, -116, 33, 47, -124, 10, 100, -40, 253, -79, -68, -54, 93, 128, -165, -68, 44, -31, 40, 15, -73, 31, 15, -54, -88, 35, 24, + 79, 6, 24, 36, -4, -27, 58, 3, -1, 50, -28, 24, 66, -6, -15, 12, -11, 20, -42, -14, -20, 2, -7, 26, 2, -26, 0, -358, -58, -80, -64, -32, -44, 191, 229, -52, 187, 71, -103, 49, -156, 28, 33, -209, -31, 33, 37, 145, -28, 126, -84, -161, -170, -48, -86, -128, 134, -52, -25, -23, 28, 73, -205, 1, 29, -97, 246, 20, -60, -53, 262, -18, 34, 155, 5, 95, 37, 9, 145, 0, -101, 130, 70, 84, 118, 39, -95, 68, 97, 94, 145, 1, -134, -107, 170, 237, + -215, 44, -57, -38, 50, 91, 87, -69, -27, -66, -111, -97, -35, -61, -95, 22, -26, 37, 31, -29, 17, 6, -77, 27, -52, -94, 7, -27, -39, -42, -12, 18, -14, 28, -18, -31, -44, -40, -17, 8, 31, -61, -264, 282, 261, 197, -137, 154, 278, -70, 217, 82, 33, -34, 239, 113, -56, -172, 99, -71, -92, 97, 114, 50, -170, 28, 153, -75, 52, -335, 48, -27, 161, 39, -70, -101, 207, -178, 14, -144, 17, -44, 115, -24, -38, -176, -42, -31, 219, 11, -200, -7, -11, 68, 104, -89, + 0, -113, 121, -27, 146, -79, 218, 108, -241, 255, -37, -176, 30, 233, 47, 36, -188, -12, -73, -102, -99, 9, 89, 115, 62, 63, -74, 56, -64, -7, -3, -29, -12, 67, -105, 29, -10, 9, 35, 29, -3, 46, 5, -69, -75, 44, 20, -3, -49, -9, 12, -6, -22, -48, 30, 0, -30, 34, -20, -13, -38, -23, -14, -48, 34, 28, 307, -102, -218, -9, -328, 2, -281, -96, 198, -200, -221, 69, 21, 22, -50, -71, -159, 112, -314, -95, 35, 198, 14, 201, 73, 440, 170, -2, 22, 211, + -47, -60, -37, 37, -135, -66, -230, -14, -104, -62, 289, 7, 182, -69, 76, -16, 109, -33, 102, -96, -119, -17, 37, -121, -120, 13, 66, 135, -16, -60, -24, 129, 218, 14, -144, -207, 6, 60, 25, 289, -177, -7, 131, -45, -147, 204, 95, 38, -97, -105, -176, -68, -16, -91, -44, -78, 18, 23, 48, 8, 16, -97, -49, -105, -34, -28, -79, -49, 31, -7, -31, -7, 30, -65, 37, -46, -2, -18, -33, -10, 2, 33, -44, -68, 60, 36, 19, 272, -208, -42, 18, -16, -7, -171, -132, -18, + 115, 42, 46, 48, 120, -24, 110, 89, -282, -108, -331, 86, -116, 167, -107, -146, -107, 87, -221, -184, 258, -140, 279, -66, 85, -98, -187, 207, -159, -179, -17, -97, -209, -162, -264, 11, 171, 98, -102, 294, 109, -108, -136, -213, 10, -80, -148, -75, -62, -105, 57, 235, -14, 15, -159, 75, 80, -139, -109, 56, 287, 114, -70, -38, -59, -295, -231, -196, 206, 217, -31, -102, 96, -66, 84, -44, 40, 6, 5, -96, 65, -57, -39, -16, 58, 42, -5, -81, 52, -13, 38, -28, -17, -72, -30, -4, + -7, 12, 15, -10, 13, -60, 28, 4, 10, -23, 74, 45, -2, -30, 9, -46, 83, 17, 387, -77, -4, -67, 251, 238, 80, -405, -70, -491, 286, 119, 5, 501, 235, -47, -229, 205, -100, 49, 68, 30, 162, -149, 279, 105, 24, -88, -147, 189, 158, -34, 102, -243, 42, -323, 128, 16, 161, -266, 52, -88, 55, 297, 251, 10, 70, -189, 242, 5, 518, 549, -76, -149, -153, -121, -322, -91, -420, 23, -38, -25, -88, 145, 243, 384, 356, 275, -458, -326, -17, 21, 474, -338, 253, -20, -99, -51, + -15, -96, -267, -175, -53, 76, 22, -8, -75, 40, -97, -11, -53, 100, 110, -29, -25, 104, 77, 12, -19, 37, 4, 15, -24, 44, -7, -28, -46, 12, 42, 66, 142, 112, -59, 13, -107, -21, 43, -9, -24, 2, 18, 23, -144, 278, 58, -210, -117, 524, 515, 578, -59, -27, -101, 95, 282, 324, 93, -143, -281, -571, 166, -339, -76, -37, -75, 36, -19, -107, -14, -332, -132, 17, -63, -371, -157, 29, 266, -78, 6, -296, -101, 1, 192, -121, 118, -330, -93, 74, 123, -92, 438, -93, -57, -232, + -77, 175, 59, -23, 228, 315, 369, -68, -187, -213, 2, 41, 86, -152, 118, 155, 132, 127, 370, 248, 164, -23, 82, -372, -70, 36, 188, 296, -58, -172, 52, 100, -87, 150, 122, 163, 25, 70, -9, -16, -121, 91, -38, 59, 54, 14, 87, 5, 141, 97, 63, 37, 39, -3, -19, 8, -60, -7, -75, -122, -48, 21, 20, 48, -25, 31, -49, 19, 62, -6, 11, -538, 669, -19, 98, 366, 6, -129, 19, -654, -398, -187, 104, -129, 74, -306, 211, -107, -3, 403, -393, -262, 377, -118, -553, 39, + -341, 70, -29, 207, 89, 104, 42, -67, 245, -28, 315, 193, -113, -189, -178, 86, -88, 86, 61, 186, 54, -349, 20, 119, -121, 15, -241, -53, 21, 16, 552, -96, 392, 470, -130, 252, -78, -14, -262, 166, 399, 279, 61, 110, 247, -16, 204, -83, -115, -199, 108, 511, 113, -66, 40, -359, -122, 9, 337, 247, 106, 219, -64, 216, -3, 136, 16, -10, -27, 151, -17, -94, -59, -37, -24, -37, -77, 109, -71, -93, -28, -122, -86, -104, -62, -72, -96, 33, 21, 41, 32, -55, -30, -96, -128, -10, + -72, 43, -35, 12, 61, 66, 43, 113, -31, -8, 83, 643, 94, 161, -151, -76, 437, -287, -66, -566, 531, 278, 39, -192, -534, 55, -142, 66, -599, 215, 317, -348, -83, 53, 37, 117, 344, 424, 2, 0, 80, 17, -256, -292, -194, -385, -190, 330, 154, -122, -163, -107, -679, 149, 164, -317, 521, 20, 389, -139, 252, -82, -335, 32, 310, -169, 170, 200, 553, 155, 174, 531, 303, 202, -733, 153, 113, 144, 15, -297, 532, -393, 304, 319, -478, -103, 655, -581, 99, -135, -63, -208, 255, -107, -217, -184, + 114, 250, -231, 290, -238, -102, 327, 123, -27, -142, -153, -2, -61, -246, -28, -51, -70, -20, 197, -14, -181, 20, 77, 190, 117, 152, -60, 82, -108, 8, -37, 82, 156, -112, 72, 77, -8, -96, 54, 46, -335, -506, -222, -210, -680, 466, 74, 497, 30, 73, -234, -121, 243, -16, 251, -245, -77, 47, -110, -200, 299, -300, 356, -121, 117, -74, -239, -213, 105, -75, -1, 186, 711, 54, -89, -236, 104, 576, -103, -90, -331, -112, 50, -312, -113, -446, 292, -547, -994, -101, 35, 479, -489, 460, 300, -229, + -462, -70, 79, 140, 20, 293, -190, -68, -980, -127, 1019, 104, -167, -130, -523, 401, -166, -145, -126, -71, -224, -334, 106, 201, -6, 154, -282, -518, -15, -270, -75, 15, -269, 69, -194, -345, -255, -121, 118, 167, -26, -409, -99, 33, -199, -85, -12, -184, -106, 57, -3, -143, -54, 75, 31, -192, -73, 11, 189, 210, 61, -55, -68, -17, 143, -23, -7, 18, 58, -160, 162, -27, 112, 18, -111, 471, 420, -136, -174, -43, -678, 445, -429, -355, -275, 166, 67, 412, 49, -228, -266, -276, 212, -108, -148, 376, + 421, 141, -286, 346, 561, -217, -124, 484, 124, 94, -318, -4, 462, -686, 469, -106, 63, 278, 339, -6, 169, -325, -263, 173, 646, 170, 157, 241, -327, 65, 286, 162, -54, 227, 143, -392, 315, -382, 85, 272, -301, 224, -367, -151, 67, 8, 234, -155, 201, -159, 28, 70, -69, -156, -297, 787, 84, 232, -346, -814, 570, -556, -239, -10, -127, -89, -48, -234, 141, 107, 61, -217, 259, 192, -87, -97, 76, -81, 72, -82, 275, 93, 26, 187, 206, -128, 1, 90, 143, 49, 69, -139, -169, 127, 178, 247, + -35, -244, -33, 12, 116, -370, 136, -130, -52, 74, 85, -99, 126, 0, 100, -68, 238, 71, 100, -44, 136, -448, 469, -176, -469, -607, -172, -64, 352, -535, -89, -65, 277, 526, 435, 270, 39, -138, -85, -57, 369, 303, -75, 46, -84, 237, -581, 343, 187, 268, 89, 60, 495, -199, -427, 0, -143, 27, -592, -328, -38, 490, -336, -107, 78, -22, 11, 482, 191, -77, 39, 235, 153, 561, -169, 255, 283, 151, -95, 90, -617, 260, -118, 26, -144, -339, -457, 90, -220, -618, 144, -525, -389, -92, -793, -480, + 115, 335, -398, 83, 28, 905, 856, 810, -28, 44, -431, -259, 335, -185, -124, 54, -113, 188, -238, -118, -13, 70, -145, 173, 171, 6, -80, 46, 167, -141, -188, -49, 149, -211, 349, 201, -21, 158, -62, -149, -238, -129, -212, -114, 115, 19, 351, -85, -120, -56, -804, -890, 523, 469, 155, 509, 855, 240, -332, 273, -135, -247, 389, 24, -356, 212, 279, 61, 95, 17, 40, 782, -21, 164, 69, 484, 25, 776, -8, -348, 620, 123, -280, -102, 326, -73, -10, 254, -478, 469, -104, -698, -198, 64, -697, -82, + -76, 300, 291, 517, -370, 75, 79, 104, 219, -337, -378, 192, -13, 394, 321, 96, 829, -143, -131, -574, 846, 146, 586, 357, -951, 132, 83, 577, -311, 243, 2, -257, -34, -208, 465, -902, -112, -69, 1, 36, 142, 215, -6, 410, -19, -64, -135, -90, 24, -148, 47, -44, 123, 83, -45, 30, -50, -255, -15, 8, 62, -260, 135, -57, 142, 109, 202, -212, 236, -133, 76, 167, 154, -58, 5, -98, 134, -12, 65, -8, -28, 341, 194, 0, 161, 44, 167, 32, 525, -1104, 658, 669, -284, 160, 94, 182, + 6, 533, -386, -83, -415, -3, -234, 38, 113, -606, 274, 660, -452, -434, -442, 878, -382, -215, 83, -300, -908, 160, 662, -906, -409, 314, 488, 132, -136, 210, -320, -150, -15, 449, -615, -490, 350, 564, 224, -704, -226, 18, -31, -122, 370, -109, 557, -452, -97, -1, -515, 328, -600, -414, 194, -269, 588, 847, 502, -560, 299, -165, -166, -395, -121, -644, 495, 362, 178, 19, -302, -171, 202, -673, 545, -129, -90, 284, 53, 258, -70, -41, -227, -67, 25, 45, -177, -64, -83, -65, 308, 32, -2, -147, 127, 121, + -105, 66, 143, 30, 239, -85, -162, 33, -266, 138, 105, 34, -4, 106, -19, 174, 61, 124, -209, -66, 204, 9, 86, 100, -195, 27, 205, 644, 1072, -6, -808, 173, -965, 167, 441, 208, 60, 583, 431, -24, -87, -797, -429, 14, -372, 1084, -196, -244, -466, 60, 409, 287, -13, 211, 319, -478, 166, 931, 331, -635, -448, 304, -314, -41, 228, -139, -524, -124, 66, 887, -190, 199, -234, -713, 127, 900, -240, -536, 159, -327, 222, -186, -217, 619, -156, -68, 304, -529, 194, 656, -268, 59, -380, 1151, -206, 140, + 375, -264, -61, -304, 164, -344, -289, -270, 443, -594, 91, -85, -175, 467, 14, -155, -194, 27, 178, 139, -262, -45, 16, -71, -325, -195, -56, 82, 31, 30, 50, 271, -266, 285, 60, 85, 24, 227, -122, 370, -76, -2, 287, 372, -187, 245, -115, 84, -208, 190, 163, -314, -10, -123, -37, -155, 122, -192, 183, -35, -63, -318, -1778, -627, -39, 560, -304, -893, -341, -136, 428, 107, -125, -445, 456, 816, -380, 615, 149, -1183, 432, 546, -201, -485, -97, 719, 767, -70, -594, 35, -74, -82, -496, 115, 216, -782, + 529, 449, -554, 95, -621, 212, 1494, -1347, 1381, 622, 56, 843, 415, -874, 515, -659, -153, 708, 26, 199, -372, -641, 1927, -460, 21, 757, -375, 143, 51, 466, 1083, 1030, 973, 56, -26, -163, 43, -270, 67, 826, -227, -293, 76, 110, 476, 557, 153, 153, 392, 165, -312, 95, -165, -456, -210, 233, -348, -495, -380, -22, 38, -286, 137, 314, 42, -107, -26, -363, 417, -67, -100, 290, -251, 196, -189, -150, 492, -6, -379, 470, -298, 282, 126, -190, 135, -69, 337, -162, 113, 14, 21, -40, 360, -192, -51, -30, + 57, -56, 152, 279, 453, -121, -1308, 593, -950, 1334, 157, -1162, 261, 9, 545, 256, -281, 987, 241, 49, 659, -529, -734, 23, 384, 1330, -188, 2, -140, 958, 104, -764, -451, 143, -84, 423, -741, 354, 121, 218, -66, -291, 169, 296, 3, 890, -1437, 124, -507, -317, -185, -1053, -1527, -1583, -1149, 120, 6, -919, -7, -170, 99, -572, -1471, 1448, -25, -217, 296, -1441, -98, -361, 271, 420, 1976, 1469, -164, -21, -46, 385, 598, 359, 273, -59, -238, -1403, 265, -33, -545, -249, 915, -133, -166, 432, -36, 475, -185, 236, + -26, -105, 339, 409, -188, 53, 184, -82, 87, 16, -4, 277, -119, -149, 234, -278, 362, -7, 196, 296, -150, 69, 263, -69, -171, -70, 30, -54, 73, -362, -22, -288, 298, 38, 201, 135, -41, 2, -18, 129, 186, 145, -22, -180, -26, -377, 1793, -1718, 290, -334, 63, 722, -533, 178, 24, -1858, 43, -211, 87, 211, -832, -312, -1376, -357, -71, 72, -523, -394, -601, -252, 589, 126, 1194, 290, -409, -428, 732, -822, 1405, -1104, 316, -892, 14, 844, -1544, 1447, 252, 164, -1062, -215, -205, -3, 503, 503, 634, -1224, + -35, -484, -421, -474, -663, -459, 18, 695, -752, 197, -1380, -464, 343, 405, 69, -1568, -852, -562, -802, -664, 50, -524, 827, 245, 412, -293, -437, 1390, -473, 370, -286, 104, 1042, 135, 184, -592, 590, 341, -252, 548, -421, 147, -160, 369, 69, -131, 197, 471, -169, 147, 163, 137, -63, 122, -75, 321, -115, 48, 303, -71, -128, 89, 127, -220, -54, -599, 364, 246, -5, -336, -142, 21, 116, 444, -82, -132, 149, 107, -77, 448, 77, -567, 136, 541, -72, 771, -1457, 2217, -1672, -178, -1010, 197, 20, -611, -864, 1006, + 676, 315, -442, 443, 137, 950, -755, -501, 590, 987, -1265, 507, -47, 597, -457, 172, -562, 112, -1051, 340, 1123, -41, -88, 1394, 242, -649, -1367, 1164, -619, 522, -503, 1392, 614, -158, 142, -813, 106, 343, -392, 385, -1691, 658, 1531, 1193, -665, -693, -693, 771, 61, -251, 61, 1974, -967, -456, 765, -664, -1788, 754, 398, -1282, 715, 1232, 1090, -338, -489, -876, 466, -543, -345, 788, 539, 240, 695, 388, -270, -256, -899, 205, -378, 306, -334, 636, 442, 93, -121, 604, -334, -52, 78, 229, 140, 276, 258, 16, -148, -93, + 216, 109, 86, 24, 341, 1099, -34, -93, 164, -389, 135, 392, -570, 245, 293, -224, -160, 254, 145, -334, -1431, 765, -83, 200, -524, 459, 10, 252, 77, 84, -298, 228, 775, -989, 851, -145, -522, 175, -355, 230, -363, -299, 252, -789, -81, 1051, -1517, 428, 73, -254, -466, -552, -358, 1103, -908, -130, 357, -923, 235, 506, 339, 173, 160, -520, 410, -1357, 19, 1188, -496, -134, -266, -335, -9, -961, 510, 386, -794, 745, 208, -906, 373, -176, 657, 573, -842, 294, 936, -881, 494, -628, 495, 572, -894, 504, -64, -474, + 684, 36, -1075, 331, 480, 144, -298, 52, 817, -377, -762, 812, -33, 61, -34, -103, 501, -373, -177, 353, 137, -87, -364, 539, -203, -354, 32, 283, -167, -132, -82, 420, -326, -171, 33, 228, -200, 163, -5, 417, -261, 65, 39, 40, 370, 694, -297, -3289, -7200, -2857, -4787, -6518, 2458, 872, 2122, 9686, 8068, 5316, 8317, 5649, 669, 1400, 1012, -4446, -2871, -1980, -5085, -5191, -1443, -1458, -3229, -970, -703, -3888, -3345, -1094, -1845, -3673, -904, -626, -2880, -344, 1986, -878, -710, 2936, 1797, -1215, 2600, 4295, 470, 2411, 5275, 2574, 1325, 5691, + 4158, 3090, 6913, 9356, 7398, 8594, 11140, 7271, 4756, 6241, 4017, -1133, -286, -2784, -6885, -9730, -10466, -14006, -15931, -16913, -16362, -15724, -15634, -13060, -9999, -9384, -6128, 478, 2584, 3355, 10186, 9996, 6891, 10157, 9308, 5046, 4903, 6474, 3912, 1836, 4525, 4617, 2069, 3729, 5634, 3732, 2217, 4792, 3967, 789, 2426, 3521, 384, 660, 3856, 2355, 1263, 4089, 4053, 1474, 3228, 2786, -737, -2034, -2108, -4841, -6552, -6469, -7466, -8228, -8533, -8353, -8569, -9527, -9856, -9429, -10518, -9007, -6139, -4697, -1607, 2705, 5675, 8316, 10739, 10921, 9352, 8497, 6982, 5289, 4267, 3595, 2909, 2282, 2073, 1927, + 1436, 1222, 1095, 600, 29, -295, -805, -1360, -1712, -1802, -1981, -1913, -1572, -1186, -877, -490, -246, -55, 177, 336, 328, 346, 224, 25, -80, -176, -369, -451, -497, -631, -653, -579, -690, -768, -685, -744, -853, -795, -950, -1136, -1078, -1083, -1148, -1004, -866, -765, -542, -261, -103, 79, 336, 554, 747, 960, 1130, 1201, 1284, 1377, 1416, 1447, 1482, 1431, 1323, 1176, 984, 761, 479, 197, -67, -337, -515, -592, -620, -608, -535, -476, -447, -397, -353, -334, -308, -275, -250, -230, -202, -172, -149, -125, -101, -82, -70, -61, -54 } + }, + { + {-122, 74, 119, -42, 105, -17, 111, 56, -25, -44, 113, 9, 22, -128, -21, -9, -6, 175, 86, -6, -131, -96, -57, 16, -3, 38, 80, 24, 30, -133, -20, -129, 5, -71, 84, 84, -34, -70, 88, 19, -33, -119, -16, -77, 21, 73, -121, -59, -20, -47, 309, 74, 178, 13, 59, -1, -89, -83, -105, 50, -87, 63, 2, 76, 78, 190, 57, -16, -10, -113, 184, 169, 30, 52, 48, 52, -11, -94, 28, 55, -35, 16, -29, -86, 41, -72, -49, -22, 6, -32, -35, -41, -1, -2, -6, 8, + -14, 27, -15, -26, -2, 34, 13, -14, -46, -14, 43, 3, 19, 17, 12, 428, -100, -89, -34, -84, 20, -202, 17, 41, 11, 139, 16, -28, -121, 79, -171, -147, 54, -72, -34, -25, 29, 117, 159, 13, -24, 189, 69, -10, 7, -76, 3, 208, 1, -95, -77, -22, 71, -95, -117, -120, -98, 95, -92, 36, -112, 40, 137, 10, 98, -40, -76, -37, 68, -3, 105, 153, 23, -45, -78, -3, -11, 8, 5, -133, -14, -62, -68, 66, 14, 43, 50, -159, -88, 67, -29, 119, 22, 100, -20, -24, + -27, -57, -13, -63, -25, 3, 94, -21, -1, -15, 30, 0, 37, 8, -7, -22, 30, -45, 1, 4, -25, 23, 28, -37, 14, -18, 17, 17, 1, 29, 4, -13, -301, -146, -62, -204, -68, -196, 63, -14, -121, -140, -18, -113, 1, 101, -4, -174, -62, 6, -66, -54, 55, 172, 219, -31, -54, 125, 141, -39, -28, -24, -93, 33, 49, -84, -62, -17, 87, 188, 16, -58, 4, -89, -30, -144, -66, -62, -229, -21, -102, -70, -252, 163, -108, -95, 49, -12, -15, 37, -209, -51, -73, -13, -119, -13, + -54, 60, 77, -65, -33, -98, 40, -11, -17, 4, -154, 0, -139, 26, -6, -41, 46, 177, 86, -37, 13, -26, -64, 11, 30, -30, -1, -38, 5, -13, -48, 25, 24, -51, -22, 19, -19, 12, -32, -24, -25, -47, -52, 0, 18, -24, -30, 4, -12, -3, -14, 4, -7, -15, -42, 29, -12, -18, -19, -35, -2, 8, -28, 5, 6, 6, -22, 10, -566, -46, -280, 248, -147, 448, -289, 282, -257, -17, -6, -198, 151, 4, -75, 45, -66, -27, -193, -3, -146, 113, 38, 139, -84, 208, 186, -184, + 49, -156, 163, 1, -118, 9, -18, -7, 119, 17, -182, 74, 127, -9, 151, -72, 122, -187, -98, 122, -110, 31, 162, -150, 241, 96, -243, 58, -234, 83, 127, 87, 122, 179, 58, -22, -17, 12, 54, 129, -47, 243, 44, 167, 87, 49, 9, 167, 27, 42, -99, -130, 63, 91, 7, 144, -20, -1, -30, 171, 48, -60, 35, 30, 21, 59, 5, 107, -20, 37, 16, 41, -31, 21, 6, 3, 6, -35, -36, 15, -44, -17, -47, 29, -5, -13, -18, 375, 4, -100, -32, -137, -164, 274, -51, -38, + 252, -17, -46, 112, 196, 57, 98, -3, -210, -54, 161, -240, -238, -88, 54, -168, -101, 5, -22, 170, -63, -35, 178, 248, -211, 58, -49, 92, 26, -92, -19, 104, 158, -40, -220, -48, -18, -56, -109, 18, -13, 42, -29, 33, 208, -151, 21, -114, -93, -158, -47, -90, -220, -6, 16, -84, -16, -89, 87, 110, -16, 34, -78, -20, 268, -33, -110, -360, -164, -2, -123, 86, -34, 34, 1, -71, -13, 108, -88, 23, -24, 13, 1, -74, -55, -30, -58, -9, -92, -17, -52, 13, -36, -10, -50, -51, + -53, -11, -5, 22, 14, -5, 15, 15, -3, 54, 45, 2, 27, -19, -28, 9, 479, 539, 99, -202, 119, 210, 211, 117, 158, 69, 261, -31, -37, -112, 162, -102, -238, -326, 33, -158, -137, 110, -38, -89, 267, -23, 333, 0, -137, -95, 114, 75, -70, -270, 381, 219, -2, 205, 120, 132, -130, 150, 74, 27, -51, -72, -174, -243, 64, 113, -191, 72, 157, 237, 60, 214, 97, 182, -276, 78, 21, 52, 3, -21, 112, 102, 98, 146, -53, 69, 39, 211, 257, -135, -159, 21, -67, -141, 54, 142, + -93, 59, -265, -194, 40, -135, -66, -45, -123, -2, -5, 13, -7, 50, 58, -6, 27, 9, 43, 48, -3, 2, -7, 52, 24, 28, 63, -13, -38, 49, -18, -2, 73, 46, 69, 98, 12, 43, 23, 65, 14, 27, 32, 443, 139, 195, -163, 63, -403, 21, -291, 219, 147, -123, 184, 104, -198, -49, 283, -10, 194, -54, 38, 226, -283, -22, 45, 82, 18, 91, 11, 274, -129, -79, -84, 207, 25, -98, 125, 350, -246, 43, 46, -22, 140, -71, 266, 90, 66, -220, -23, -58, 123, 93, 133, -151, + -100, 128, -264, -147, 58, 283, 170, 250, -274, -86, -279, -72, 83, -24, -263, 34, -162, -2, -288, -347, -143, -250, 13, 89, 48, -107, 137, 222, 61, 66, 126, -40, -215, -13, -148, 77, 23, -14, 38, 20, -158, -80, -46, 79, 10, -55, -21, -5, -25, 13, -34, -14, 9, 72, 16, 23, 14, -14, 19, 48, 23, 62, 17, 32, 2, 49, -78, 49, -518, -467, -335, 108, 109, 396, -169, 376, -148, -609, -50, -53, -233, -393, -141, -4, -240, 2, -372, 32, -393, 231, -96, 170, -74, -3, -119, -139, + 249, 52, -67, 282, 35, 49, 99, 260, 229, 175, 8, -299, -28, 149, 48, 189, -85, 87, -441, 144, 272, -333, 202, 73, 321, 246, 3, -80, -4, 219, 109, -280, -228, -389, -187, -260, -57, -323, -66, -106, 335, -152, 167, -83, -46, -105, -227, -120, -71, -73, 212, -625, -131, 297, 16, 59, 160, 301, -184, 39, 82, -11, 0, -41, 84, 126, -51, 13, -9, 140, -48, -1, 141, 31, 51, 67, 68, -20, 14, -34, -51, -28, -93, 30, 65, 46, 28, -121, 3, -14, -3, -55, 37, 58, -27, -3, + 68, 73, -73, -697, 522, -157, 306, 175, -20, -464, 352, 41, -39, 219, 154, -196, -11, 379, 121, -183, 267, -159, -128, -91, 81, -6, -58, 29, 111, 97, 101, -294, 169, -246, 315, -209, 314, 94, 23, -324, -327, -115, -114, 364, 98, 289, 118, -276, 3, -70, 121, -2, 105, -43, -187, -115, 182, 463, 334, 29, 110, -44, -74, 233, 196, -97, 292, 413, 584, 2, -346, -419, 135, 64, -24, 92, -5, -141, -22, 346, -72, -167, 629, 150, -114, 176, -2, -17, -27, -112, -21, 183, 89, -73, -100, 125, + 103, -20, 252, 64, 42, 17, 110, 34, 102, 64, 32, 11, 131, 65, 67, 10, 130, -28, 47, 71, 50, -21, 146, 163, 48, -38, 175, 5, -89, -24, 127, -2, -16, -37, -28, -2, 30, 77, 118, 34, 125, -37, 320, -468, 394, 162, -320, 749, 113, -382, 89, 208, 21, 151, 538, -514, 336, -208, 298, -113, 65, -476, 82, -52, 193, -183, 28, 36, 6, -280, 270, 28, -28, 126, -52, 124, -65, 378, 300, 374, 374, -60, 132, 161, 18, -196, 265, -312, 98, 309, -182, 164, -344, 110, -28, -82, + -28, 26, 109, 103, 367, -239, -9, 241, 522, -460, 121, -113, 161, -85, 761, -467, 169, -260, -141, 68, 82, 42, -660, -350, 551, 300, -57, -296, -340, -136, 126, -369, -198, 182, 105, -8, -7, -258, 52, -75, -94, 118, -60, -80, -27, -226, 80, -59, -73, -82, 106, -109, 129, -20, -29, 43, 48, 162, -164, -36, -124, -27, 84, 62, 216, -70, 121, 26, -75, -51, -18, 81, -10, 41, 351, -460, -97, 653, -195, -12, 350, 83, 216, -486, 468, 31, 36, -123, -292, -39, -44, -313, -188, 348, -110, 68, + -170, -764, 260, 36, -235, 147, 297, -27, 34, -59, 76, 201, 65, 323, 222, 51, 283, -226, -223, -318, 121, 185, 55, -505, 144, -431, 627, -148, 223, 534, -209, 340, 86, 370, 150, -178, -547, -393, -305, -42, -321, -64, -280, -182, 552, 120, -234, -208, 112, 205, -47, 80, -1001, 404, 69, -321, -394, -103, -661, 72, 330, 37, -283, 176, 149, -233, 118, 70, -57, 8, -149, 40, 53, 39, -194, -106, 81, -122, 29, -73, -46, 47, 165, -208, 73, 162, -193, -183, 25, -168, 39, -111, 116, 63, -194, 109, + -127, -83, 135, 31, 303, 94, 0, -19, 24, -79, 34, 224, -614, -754, 464, -368, -429, -119, 293, 598, -385, 36, 287, -80, -118, 157, 105, 450, 154, -424, -11, -213, -9, -250, -330, 56, 341, -20, 155, -274, 87, 336, 263, 43, 32, 212, 203, 130, 310, -381, 427, 307, 109, -314, 29, 249, -246, 289, -194, 326, -80, 425, -656, 706, 170, 666, 48, -137, -41, 243, 21, -549, 27, -36, -568, 185, 413, -541, 459, -476, 155, 188, 105, -596, -284, -291, 63, 48, -345, -510, 106, -449, 313, -215, -113, 158, + -277, -214, -284, -116, -156, 12, -226, -169, -206, -309, -147, -62, -66, -76, -86, -58, -144, -160, 112, -192, -102, -47, 155, -70, 9, -246, -175, -78, 0, -54, -208, -26, -14, 176, 116, -137, -127, 31, -66, 131, -67, 71, -127, -358, 526, 101, 344, 333, 89, -269, 51, 892, -624, 142, -115, -344, 14, 114, 139, -11, -4, -184, -266, -411, -210, 298, -262, -413, 228, -153, 84, -61, 176, -180, 377, -146, 36, -16, 35, 345, 115, -171, 183, -158, 283, -182, 113, -421, -307, -229, 67, -215, -365, 144, 262, 70, + -196, 115, 184, 206, 573, 789, 1079, -118, 168, 254, 149, 139, 170, -229, 426, -68, 557, 685, 504, 199, 282, 89, 965, 272, -181, -160, -141, -62, -66, 45, -81, -187, 159, -292, 82, -70, 87, -148, -117, -94, 217, -219, -209, -20, 88, -112, -267, -92, 13, -130, 139, 263, -155, -21, 55, -30, 88, 152, -74, -188, -32, 87, -91, 239, 287, 174, -84, -198, -26, 280, 32, -10, 126, 38, -3, -49, 71, 70, -191, -141, -7, 1082, 866, -377, -173, -450, 260, 127, 530, -93, -229, -104, -343, 78, 14, 500, + -187, 186, -672, 371, -52, 261, -3, 236, 41, -383, -197, -329, -249, 276, 668, 290, -78, -207, -8, -56, 167, 225, -425, -9, -148, -143, -462, -358, -749, 13, -36, 270, -224, 480, -364, -162, 964, 953, -658, 147, 554, -322, -152, 284, -105, -404, 1073, -268, -1625, 540, -19, -840, 644, 684, -241, 479, 612, -289, 24, 386, -417, 174, 338, -601, -80, -199, 35, -221, 6, 83, -251, 203, -292, -137, 146, 289, -165, 15, 61, -45, 101, -213, 314, -160, 332, 318, -5, 15, 219, -160, 50, -10, 274, -204, 168, 49, + -631, 122, -76, -120, 38, -19, 72, -359, 53, -94, -313, 53, 547, -512, 172, 297, -432, -3, 246, -393, -189, 87, 201, 371, 186, -280, -43, 277, -295, 317, -142, -380, 362, 193, 185, -87, -89, -128, -9, 307, -602, 315, -3, 521, -313, 11, -391, 185, -643, 82, 38, -249, -187, 115, -430, -748, 469, -32, 147, -438, 284, -62, 305, 327, 166, -306, 271, -142, -60, -576, 94, -407, -448, -658, -265, 117, 194, -679, -332, 47, -238, -916, -725, -745, -148, -441, 409, 573, 163, -548, -638, -745, -62, -46, 420, -354, + -621, -300, -411, 152, 16, 159, 83, -198, 53, 163, -155, -59, -130, -78, -92, -192, -1, 258, 16, 82, 81, -34, 195, -113, 297, 268, -95, -225, -4, -81, -123, -138, -123, 218, 17, 205, -198, -214, -33, 117, -349, 70, 43, -252, 64, -206, -459, 296, -105, 44, -71, 58, -232, -53, -17, -487, 807, 899, -230, 602, -185, -252, -249, 586, -531, -131, -258, 935, 26, 335, 115, -100, 464, 253, 378, 110, -68, -177, 362, -73, -371, 441, -20, 385, -451, 297, 103, -463, -355, 811, 528, -63, 289, 235, -530, -356, + 167, 119, 360, 33, 74, 131, 441, 171, 109, -458, 1226, 814, 90, -567, 270, -199, 149, -140, 259, -195, 37, 666, -475, -241, -637, 163, -176, -125, 575, 168, 70, 36, -242, -486, 338, -15, 3, 352, 361, -44, -271, -326, 595, -78, -38, -132, 447, -52, -318, 190, 164, 265, 125, 83, 413, -102, -155, 128, -13, 0, 34, 174, -110, -18, -140, 27, 198, -111, 45, 233, -91, 35, 180, -6, -52, -406, 250, -236, 163, -278, -59, 85, -165, -85, 367, 248, 30, -78, 344, 48, 164, 132, 77, -84, 148, 57, + 146, -302, -648, 1665, -1879, -221, -992, 1206, 321, 209, -476, 109, -390, 1081, -197, -74, 106, -58, -429, 158, 242, 324, -737, -388, -382, 147, -227, -200, -29, -10, 475, -251, 19, 360, -51, -486, 55, 379, -51, -764, 564, 66, 5, -4, -327, 249, -1415, -986, -143, -354, 58, 106, -666, 1036, -417, 1428, -208, -502, 483, 80, 431, 661, 204, -681, -195, 763, 1768, 58, -460, 738, 58, 871, 135, 1180, -311, -48, -38, 275, 35, 453, 823, 49, -182, -148, 258, -225, -103, 541, 389, 59, -108, -204, -236, -140, -193, 390, + -248, -168, 187, 70, -81, 175, 192, -111, 164, 277, -150, 18, -400, 497, -9, 399, 20, -416, -4, 43, 102, 45, -7, -357, -339, -20, -200, 264, 89, -122, -20, 208, 35, -120, 4, 151, -6, -72, -23, 82, 2452, 767, 279, -68, -254, -342, 806, 740, -834, 509, 388, 95, -246, -440, -1141, -423, 376, 127, -361, 702, -217, 288, 287, -161, -154, 732, 28, -269, 461, -388, 898, -429, -256, -41, 355, 191, 908, -270, -530, -184, 246, 69, 490, 139, 50, -189, 396, 1696, 726, -621, 550, -322, -505, 423, -11, 128, + -26, 307, -440, -674, -1797, -468, 651, -232, -612, 277, -137, 276, -716, -627, -292, 278, 294, 867, 158, -54, -667, -947, -112, -422, 89, 350, -448, -461, -95, -575, -964, -316, -252, -512, -115, 295, -265, -136, -305, -66, -685, -434, -434, 19, 70, 257, -381, 224, -515, 29, -301, -33, 168, -154, 251, -679, -130, 241, 104, 222, -81, -180, 342, -60, -64, 241, -337, -265, -44, 72, -448, -209, -241, -131, -32, 1, 45, -198, 27, -56, -395, 530, -446, 1480, 1240, 575, -354, -536, 883, 756, -1018, -215, -628, 854, -158, -1236, + -546, 427, 755, -1427, 557, -991, 352, -589, -162, 673, -242, 95, 424, 900, -607, -1007, 212, -87, 97, 924, 223, 687, -893, -171, 271, -794, 1273, -158, 758, -115, -192, 624, 620, -371, 1403, -339, -628, 675, 1204, 62, 208, 52, 524, -579, 418, 1839, 837, -64, 794, 987, -748, -2264, 159, 1356, 1527, 415, -160, -671, 787, 1695, 782, 409, -1678, 309, -955, -593, -1481, 1244, 260, -435, -596, 435, -434, 234, 156, 218, -555, -120, -79, 287, -198, 242, 204, -251, -171, 339, 5, 364, -166, 134, -250, 128, 682, 128, 120, -90, + -753, -378, -468, 244, 1245, 1180, 1060, -85, -786, -737, -359, 496, 546, -42, -266, -398, -587, 153, 316, 270, 246, 198, -3, 20, -112, 115, -162, 111, -43, -24, -6, 144, 34, 62, 10, 68, -123, 13, -58, -19, 1042, -2045, 1572, 331, -934, 19, 882, -577, 31, 491, -604, 58, -543, -343, 586, -492, -277, -1040, 459, 1021, 292, -452, -770, -119, 589, 320, -657, -13, 804, -101, 60, -268, -190, 1880, -895, -225, -204, 319, 877, -922, -515, 1238, -141, -75, -1472, -1218, 516, 834, 458, -1509, 1041, -25, -227, 220, -1077, -297, + -136, -533, 977, -757, -418, -814, -468, -1075, 328, -1682, -469, 199, -835, 209, 469, 206, -9, -300, -603, 893, -191, -85, -318, 541, 1084, 163, -1458, 130, -648, 98, 137, -266, 104, -437, -146, -37, -330, 6, -93, 257, 230, -80, 117, 478, -214, -172, 490, -356, 326, -173, -163, 35, -207, -102, 299, -581, 176, 135, 216, 413, -291, 48, 311, 111, -105, -276, -54, -69, 8, -283, 85, -52, -114, 67, 38, -133, 299, -130, -90, 5, 79, -14, -1182, 713, -24, 924, -194, 956, 117, -124, 425, 1110, 529, 283, 219, 141, + 434, -561, -49, -421, -444, 683, 421, 261, -201, -173, -85, 714, 105, -317, -522, -24, -127, 537, 77, 450, 840, -236, -2145, 141, 1734, 181, -1281, -165, 486, 386, 678, 621, -56, -404, -420, 544, -337, 61, 184, -2222, -391, -427, 347, 1747, -38, 140, -412, 119, 353, 733, 376, -433, -235, -1079, -73, 742, -335, -154, 266, 754, 603, -162, -775, 5, 272, 86, -518, 64, 54, -38, -448, -570, 487, 408, -29, -88, -439, 342, 133, 79, 124, 110, 189, 14, -486, 268, 4, -28, 18, 129, 51, -62, -10, 21, -166, -90, + -669, 106, 457, -325, 157, -531, 291, 142, -89, -144, -63, -49, 53, -114, 602, -70, -3509, -6600, -2652, -4467, -5134, 3193, 1116, 2933, 8821, 5774, 4659, 6982, 3486, 225, 2762, 688, -2794, -1964, -2227, -5117, -4156, -1796, -3722, -4102, -1696, -2525, -4235, -2189, 328, -2664, -2437, 537, -528, -2429, 2722, 1776, -2040, 2018, 3063, 463, 1751, 6154, 2923, 1844, 7239, 5072, 2937, 7136, 9567, 5922, 8579, 11111, 7940, 5265, 6941, 3652, -3536, -2330, -4670, -10882, -10910, -11052, -16682, -16473, -16549, -17242, -16277, -15835, -12464, -9979, -7545, -3111, 915, 2418, 6160, 10699, 9067, 12153, 17283, 14525, + 13568, 16517, 12238, 6276, 6803, 6381, 2396, 1703, 3426, 1265, -299, 1145, 409, -2383, -2127, -1285, -4258, -4895, -2134, -3724, -5124, -2120, -1360, -2796, -39, 899, -922, -142, -680, -3914, -5633, -6319, -7888, -9292, -8336, -7625, -7095, -5331, -3391, -2419, -437, 1878, 2928, 4237, 6985, 8484, 9902, 10604, 10054, 8955, 6857, 4682, 2620, 363, -439, -759, -1227, -1392, -1411, -1645, -1738, -1580, -1415, -1584, -1691, -1625, -1699, -1870, -1799, -1729, -1365, -921, -731, -470, 26, 207, 437, 923, 1215, 1261, 1241, 975, 652, 383, -12, -363, -548, -885, -1137, -1230, -1444, -1515, -1383, -1300, -1215, -1016, + -888, -711, -518, -381, -187, -18, 198, 331, 469, 617, 774, 874, 1034, 1207, 1332, 1399, 1449, 1481, 1460, 1421, 1409, 1280, 1117, 907, 669, 430, 181, -92, -319, -561, -761, -964, -1143, -1326, -1398, -1446, -1433, -1323, -1203, -1057, -827, -602, -391, -141, 74, 216, 344, 435, 445, 417, 396, 342, 270, 220, 190, 152, 122, 105, 93, 77, 71, 72 }, + {-211, -19, 199, -176, 69, -298, 4, -107, 121, -100, 28, -67, -124, -31, -11, 92, 114, -107, -187, 99, 34, 70, 42, 79, -108, -81, 20, -20, 98, 71, -83, -17, 75, 139, 86, 2, -108, 59, -18, -57, 77, 34, -99, -82, -67, 57, -97, -52, 83, 33, -3, -101, 38, -87, -226, 23, -77, -145, 68, -41, -42, -49, 3, 113, 67, 39, 51, 85, -171, 90, -68, -64, -38, 58, 11, 121, 175, 69, 14, 21, -2, 113, -47, -3, 55, 5, -46, -46, 16, 0, -52, -25, 16, -1, -7, -20, + -26, 19, 11, 20, -8, 8, -5, -47, -19, 23, 39, -20, -26, 10, 24, 453, -38, 83, 100, -47, 47, 180, -141, -25, 52, -70, -14, 132, -43, -30, -9, 51, -25, 64, -45, -44, -20, -103, -176, -33, -56, -24, 103, -186, 229, 1, 4, 8, 43, -6, -88, 14, 71, 172, 9, -2, -26, -59, 115, 54, -42, 63, -114, 19, 37, -87, -297, -93, -7, -18, -14, -26, -38, -22, -56, 73, 219, 124, 10, -1, -6, 76, -45, -200, -7, -104, 66, -118, 67, -289, -2, -41, 98, 157, -24, -38, + 24, -1, 85, 31, 14, 114, -84, -12, 15, 41, 0, 41, 2, 26, 12, -6, 9, -11, -1, 24, 36, 4, -10, -15, 5, -7, 21, 14, 10, -7, 4, 13, -399, -385, -145, -57, -55, 0, 97, 23, 79, -181, 89, 112, 109, 127, -99, 27, 300, -186, -7, -133, -192, -23, -14, 166, -81, 17, -143, 92, 57, 72, -321, 49, -59, -113, -30, -2, -238, -155, -133, -11, 199, 69, 66, 95, -89, 56, -80, 170, 262, -25, -24, 74, 18, 67, 147, -69, 152, -24, -5, 90, 123, -47, -178, -164, + 63, -23, -31, -73, 81, -137, 51, 102, 173, -101, 166, 108, 54, 83, 20, -28, -112, 79, -53, -105, -132, 54, -43, 79, 14, -51, -61, -32, 26, -33, -12, -42, -18, -3, 41, 21, -1, 23, 80, -8, 0, 46, -25, 13, -18, -14, 23, 33, 34, 21, 0, -11, 25, 11, 55, 65, -52, -6, 29, 8, -30, 9, 37, 32, -17, 4, 21, -19, -435, 190, -194, 352, -326, 258, 132, -135, -169, -93, 68, 61, -90, 208, -73, -197, -39, 215, 148, -215, 36, -26, -225, -93, -145, -33, -172, -45, + -71, -238, -84, 122, 175, -33, -204, -40, 147, -44, 6, 11, 5, -203, -5, -23, -50, -9, 37, -145, 85, -155, -2, 0, 5, 117, 4, -53, 49, 81, 193, 89, 45, -54, -117, -111, -45, -121, -86, 73, 127, -91, -153, -105, 50, 28, -144, -49, 19, -121, -55, 18, 39, 51, -55, -66, -91, 5, -10, -34, 30, -29, -9, -69, -14, -23, 63, 32, -24, 32, -2, 11, -29, 5, -17, 0, -24, -46, 35, -2, -44, -27, -3, -40, -47, 45, -27, 533, 212, -36, 121, -86, 299, 126, 538, 10, + -522, 133, 316, -188, 55, 217, -168, 153, -136, -30, -168, -160, -51, 44, -18, 72, -72, 231, -138, 65, 42, 150, -276, -144, -109, -33, -98, 26, 168, 120, 267, -39, -20, -153, -50, 168, -165, 139, -154, -65, 245, 354, 254, 44, -187, 131, 97, -100, 206, -136, 41, 32, -377, -4, -357, -144, 57, -95, -170, -146, 30, 245, 61, -101, -125, -110, 25, 39, 117, -186, -167, 11, -32, 11, -48, -28, -30, -16, 56, 14, 26, -25, -39, -38, 11, 97, 33, 71, 23, -113, 85, 38, 15, 16, 49, -12, + 42, 8, -1, -35, -26, -49, 14, 46, -9, -24, -26, -160, -18, -20, 6, -26, 329, 669, -294, -219, -61, -81, 232, -225, -409, -143, 27, -102, 115, 53, 201, 83, -83, 289, 272, -128, 18, -190, -34, 8, -118, -25, 202, 290, 10, 46, 119, 75, 45, 18, -113, -213, 22, -305, 9, 67, -98, 116, -78, -170, -15, 160, 70, -76, 492, -4, 158, -297, -67, 199, -96, -220, 127, -258, -231, 49, 279, -232, -131, -71, 10, -107, -105, 375, 220, -37, 19, -181, -129, -75, 112, 147, 12, 117, 76, -27, + 110, -105, 376, 211, 40, 9, 33, -67, -26, -67, -69, -5, -4, -64, 31, -95, -29, 69, -27, 71, 41, 67, 2, 45, 54, 47, 8, 80, 26, 8, -61, 3, -23, -4, 3, 27, -5, 24, -58, -6, 23, 28, 43, 267, -474, -62, -356, -202, -322, -81, -48, -47, -123, 147, -455, 237, -154, 142, 63, 193, 12, 81, -182, -76, 87, -181, -132, 227, 63, 104, 92, -21, 62, 336, -118, 35, -149, 271, -161, -594, 186, 96, 253, 138, 348, -231, -91, 212, -85, -197, -93, 111, -289, 289, -9, 194, + -243, -105, -87, -263, -53, -208, -95, 25, 307, 249, -26, -372, -212, -66, 298, 249, 180, 168, -104, -431, -110, -10, 103, -134, -41, 225, -41, 266, 5, 185, 71, 12, -66, -4, 100, 30, -45, 12, -119, -17, -6, -157, -95, -99, -49, 35, -63, 29, -85, -8, -24, -43, 71, 37, -14, -106, -41, 47, 73, 5, -105, -53, 25, 58, 16, 30, 9, -52, -623, -753, -425, 311, 26, -139, -158, -240, -24, 83, -419, -39, 267, -161, -114, 299, 80, -194, 76, -188, 442, -140, -103, 144, -228, -142, -133, 77, + -158, -58, 75, 55, -516, 233, 227, -147, 402, 156, 40, 386, 221, 71, 55, 418, -40, -68, -27, 258, 144, -374, 147, 121, -1, -198, -606, 271, -39, -147, -380, -212, 235, -47, -110, -251, -493, 53, -67, -259, -109, -464, -73, -102, -87, -17, 169, 362, 155, -116, -255, 103, 19, 153, 95, -54, 111, 44, -11, -135, 14, -222, -12, -46, 39, -84, 108, 67, -24, -15, -20, 19, -50, -9, 63, -20, -21, 121, -45, -26, 95, -68, 58, -185, -122, -65, -100, -6, -99, -129, -99, -24, -20, 49, -4, -77, + 48, 22, -43, -648, 518, 27, 264, -49, -23, 47, 286, 27, -37, -392, 138, -45, -303, 77, -198, -153, 559, 157, 171, -123, 200, 240, 233, -138, 203, 104, -236, 151, -230, -81, 146, 67, -24, -129, -120, 370, -109, -166, -105, 74, 81, -180, -301, -24, -322, -40, -291, -112, -69, 55, -148, -254, 318, -134, -350, 221, 374, -183, -120, 187, 137, 368, 240, 35, -3, -383, 92, 362, 294, -261, 280, 300, -202, -568, -182, -509, 86, 288, 147, 33, -151, -207, -22, 24, 89, -49, 167, -77, -57, 62, 176, -261, + -33, -35, -78, -1, 72, -17, -7, -43, -4, -44, 16, -6, -4, 22, 93, -82, -44, 50, 60, 190, -17, 78, 78, -86, 70, 28, -71, 16, 30, 20, 80, 166, 38, -59, 115, -38, -61, 7, -107, -49, -6, 3, 122, -1033, 491, 137, -51, 692, -43, 349, -313, -75, 52, 2, 395, 250, -542, 334, 23, 200, -488, -21, 278, -479, 594, 159, -9, -215, 33, 256, -430, 37, 107, 73, -266, -100, 247, 139, -29, 35, -176, -299, 120, -504, -23, 716, 699, -227, 85, -33, 198, 503, 40, 239, 78, -268, + -22, -53, -765, -347, 469, 19, 143, -187, -49, 165, 226, -24, 585, 6, 456, 54, 94, 57, -302, -380, 461, 104, -244, 334, -278, 22, 282, 43, -75, 129, -125, -121, 140, 192, 11, -266, -129, -286, -103, 67, 89, 42, -112, -55, -206, 143, -5, -86, -40, 58, 32, 178, 161, 102, 104, 32, 127, -91, 57, 66, 64, -80, 129, 65, -22, -28, -36, -36, -62, -147, -44, -6, -60, -109, 345, -751, 302, 473, -65, 141, 213, -115, -72, 292, -110, 443, -421, 230, 548, -587, 24, -279, 346, 146, 287, -297, + -231, -4, 741, 8, 375, -167, 23, -52, -65, -329, -12, -93, 152, -147, -212, -180, -13, -63, 335, 57, -184, -169, -169, -63, -80, 545, 25, 273, 20, -132, -118, 453, 340, -132, -426, 240, 167, -944, 56, 531, 520, 120, 414, -570, 933, 80, 180, 183, 446, -36, -397, -123, -469, 534, -235, -160, 469, -16, -182, -144, -350, 332, -572, -86, 57, -16, 84, -121, -244, -159, 79, 61, -114, 28, -109, -122, -86, 104, 58, -138, 129, 24, -163, 73, -28, -60, -124, -145, 30, 68, 300, -132, 179, 20, -56, -23, + -32, -80, 49, -11, -85, -32, -58, 22, 64, 46, -122, 289, -556, -444, 399, 336, 819, -288, -215, -145, 155, -346, -41, 137, -24, 441, 284, -351, 33, 104, 255, -400, 422, -6, 187, -70, -191, -420, 149, -72, -177, 86, -257, -250, -56, 133, 511, -759, -459, -409, -460, -130, 530, -312, -14, 522, -76, -234, -451, -121, -194, -933, -725, -204, 164, -89, 164, -207, -149, 444, 268, -467, -241, -522, -208, 43, 209, -93, 56, -446, -357, -325, -9, 76, 28, -422, 14, 568, 245, 648, -511, 792, 70, -492, -82, 23, + 139, -83, 216, -301, 143, -267, 126, 182, -58, 406, -34, 96, -109, -147, -83, 12, 92, -155, -28, 52, -35, 156, -47, -78, -262, 116, 17, 137, 58, -88, -247, 79, -315, 80, -82, -13, 34, -68, 25, 49, 219, 86, -95, -400, 77, -43, 923, 101, 445, -384, -261, -94, -434, -275, -419, -195, -271, 501, 127, 126, 516, -14, -28, 233, 465, 725, 531, -109, -196, -835, 232, 262, 103, -521, 604, 240, 355, -99, 35, 342, 754, 733, 424, 89, 784, 20, -232, 254, 476, 385, 706, 372, 18, 85, -422, 184, + -1059, -182, -104, 235, 836, 469, 125, 606, -438, -399, 88, -1030, -243, 42, 200, 238, 275, -62, 455, 56, 237, 835, -511, -267, -139, 159, -95, -788, -146, 537, -36, 681, -363, 18, 285, -66, 82, -285, -136, -221, -144, -245, -198, 53, 46, -492, -225, -277, -70, 90, 152, -220, -5, 65, -342, 51, -135, -228, -115, 17, 88, -157, -35, -239, -15, -65, -73, -175, -251, 63, 89, -140, -93, -104, -73, 44, 172, 46, 58, -55, -711, -224, 129, 537, 987, -397, 17, 163, -181, 914, 162, -451, 801, -166, -269, 573, + -521, -305, 35, 50, 71, 375, 201, 304, -94, 161, 459, 27, 313, 57, 12, 507, -663, -242, -225, 441, -338, -89, -199, 437, -186, 973, 712, -665, 325, -798, 114, 287, 155, 171, -1016, -198, -980, 129, 81, 118, -155, -179, 469, -848, 291, -368, -1594, -598, -522, 261, -232, 241, 798, 849, 482, 446, 416, 119, -634, 664, 1, -738, -586, -927, -1226, -634, -124, 979, 353, 58, 376, -301, -7, 187, 157, -81, 144, 44, 100, 39, -303, 242, 162, 118, 49, -161, 86, -238, -84, -368, 305, 228, -51, 31, 243, 385, + -175, -380, -115, 305, -69, -228, 328, -31, -192, 224, 90, 12, -57, -11, -163, 108, -104, -49, 252, -1261, -584, -435, 237, -961, 349, -573, 825, -955, -1212, -260, -171, 958, 470, 429, -241, 115, -586, -470, 115, 204, -756, -703, -491, -60, 388, 280, -529, -670, -386, -394, -908, -524, 409, -251, -1, -122, 301, 475, -119, -1364, 582, 1148, 432, -21, -1367, -323, 604, -167, 1539, -160, -1231, 208, -203, 107, 39, -243, 337, 416, -1299, -344, 77, 467, -237, -660, 598, 64, -437, -1295, -1503, -771, -91, 117, 1214, 1712, 885, 675, + 298, -984, 367, 2, -511, -142, -1624, -336, -4, 20, 64, 719, 274, 220, -286, -86, 625, -413, 0, -18, 127, -304, -508, -567, 262, -260, -87, 345, 20, 63, -431, 157, 150, 85, -353, -174, -230, -370, 59, -211, 417, 170, -270, 63, -95, 292, -375, -41, -8, 211, 190, 103, 228, 7, 129, 106, 2296, 2109, -888, 1094, 970, -272, -162, -503, -270, -591, -414, 1749, -93, 1019, 15, 50, 16, -690, 167, 143, -1514, 226, 370, -798, -164, -246, -106, 224, -42, 46, 671, 270, -322, 205, 1068, 17, 494, -27, 404, -588, + -705, -398, -1298, 347, 150, -580, -1577, -1035, -1474, 1076, -763, 167, 272, 243, 211, 1148, -1100, 5, -614, 1215, -2724, 558, 217, 871, 801, 2, -245, -420, -113, -795, 590, 1606, -115, 330, 1023, -711, 412, 492, -884, -622, -1647, 1369, -257, -1211, 821, -206, 540, -40, 470, 75, -344, 565, 556, 85, 324, 513, 320, -351, -136, -343, -137, 431, 848, -41, -140, -39, 550, -849, 500, -234, 1144, 218, -655, -142, 518, -267, -335, -269, -186, -264, 293, 190, 741, -608, 58, -74, 415, 21, -29, 230, 308, 215, 493, 55, 566, 305, + -8, -796, -754, 933, -1900, 1311, -784, -547, -345, 120, -550, -428, 596, -182, -1300, 449, -80, 231, -293, 1156, -943, 41, 479, -327, 363, -769, 63, -661, -336, 721, 92, 289, -410, 697, -201, -324, 266, -426, -356, -227, -236, -718, -964, -267, 533, 9, -303, -960, 36, -759, -52, 307, -753, -184, 552, 562, 406, -932, -444, 644, 207, -17, 519, -3061, -711, -341, -1394, 137, 379, -81, 254, 657, -382, -651, 162, -591, -183, 637, 1007, -384, -1225, -737, 74, -651, 97, -506, -482, 127, -984, 11, -616, -188, -341, 136, 240, -98, + -613, 133, -48, -383, 466, -21, -455, -155, -126, -170, -319, 166, -293, 230, 310, -128, 26, -190, -435, -600, 95, 77, 265, -695, 132, -5, -461, 342, -199, 244, 548, -1261, 239, 174, 348, -212, -145, 412, -44, 31, 2060, -257, -565, 82, -225, 1022, 196, -83, 972, 984, 327, 383, 543, -1207, -664, 1006, -132, -991, -498, -449, 689, 369, -360, -1433, 451, 226, 195, 237, -168, 147, -1071, 963, 673, 356, -534, -457, 3, 482, -100, 501, 224, -1134, -499, 179, -1137, 68, 224, -1005, -1410, -199, 433, -823, -1713, -753, -444, 1115, + -672, 1259, -253, 59, 545, 73, -1920, -129, 87, 899, -1708, -2371, 179, -156, -1503, 851, 409, -58, 3, 1393, -1988, 1636, 355, 217, 673, -721, -642, -127, 319, -411, -20, 838, -703, -574, 754, -424, -199, 309, 216, -837, 436, -283, -64, 291, 302, -892, -132, -695, 399, 534, 49, -1147, 823, -202, -4, 485, -109, -421, -61, 641, -960, 660, 52, -80, 261, 122, -594, 275, 14, 21, -778, 539, -503, 595, 108, -737, 79, 82, -189, 336, 81, 939, 352, 2246, -976, -1017, -436, -62, 2131, -320, 1760, -1273, -516, 734, -1386, -470, + -1306, 191, 1278, -1811, -681, -173, 518, -34, 174, 478, -152, -1154, -1074, 35, 715, 1973, -468, 522, -599, 965, 7, 98, -302, -1192, 12, 1066, -213, -80, -431, -1042, 1323, 497, 874, 1190, -86, 55, 722, -1943, 639, -989, 2254, -231, 197, 327, -693, -687, 201, -985, 1419, -861, -1095, -1094, 1485, 498, 849, -210, 848, 874, -935, -276, -870, -458, 1548, 1102, 119, 291, -2417, 1622, 2120, 233, -202, -423, -1311, 1841, -137, 111, -394, 39, -839, 1722, -444, 832, 106, -316, -131, 1659, -954, 810, 245, -724, 69, -242, 432, 119, 648, -296, + 41, 114, -38, 658, 1119, -368, -89, 118, 601, 167, -915, -606, 1214, 229, 579, -1234, -1498, 1342, 868, 410, -136, -1150, -56, 1020, 300, 45, -112, -202, 175, 137, 213, -169, 112, 219, 143, -95, 31, 42, 211, 537, 201, -1695, 1159, -1206, 146, -556, 448, -48, 638, -104, -551, 948, -333, -135, 147, -401, -345, 1094, -257, -153, -127, -59, 505, -386, 121, -284, 253, -248, -184, -591, 863, -535, 288, 134, 599, -673, 153, -278, 679, 84, 57, 530, 163, -891, -127, -157, 250, 383, 329, -811, 350, -614, 435, -353, 96, -205, + 430, -172, 128, -908, 218, 432, -408, 403, 62, 144, 261, -370, 629, 239, -29, -203, 309, -197, 572, -481, -134, -458, 592, -587, 539, -491, 654, -559, 347, -551, 484, -46, 58, -166, 34, -104, -75, -176, 292, 101, -30, 83, -77, -162, 294, 34, 118, -194, 22, 273, -317, -91, 201, -7, -87, -222, 525, -174, -248, 122, 58, -94, 67, -42, 62, -100, 86, -165, 265, -222, 304, 114, -205, 63, -31, 18, -12, 125, 14, -100, 88, -107, -703, 1428, 122, 182, -568, -417, -903, 609, -252, -182, -391, -13, -348, -41, + -44, 161, 180, -26, -40, -255, 242, 226, -211, 103, -482, 195, 96, -83, -73, -160, 156, 36, -343, -91, -99, -284, 472, 51, -298, 48, -116, 411, -140, -189, 81, -242, 480, 16, -262, 78, -106, 236, -299, -58, 101, -108, 212, -118, 63, 97, -270, 40, 272, -411, -25, 127, -381, 700, -637, 321, 117, -363, 724, -489, 118, 94, -303, 240, -123, -234, 232, -279, 184, -127, -93, 209, -171, 69, -68, 0, 42, -92, 46, -3, -90, 198, -165, 148, 7, -135, 136, -240, -21, 66, -38, -31, 36, -124, 156, -76, + -53, 18, 18, -96, -13, -55, 55, 79, -109, 98, -104, -19, 104, -75, 333, -1526, -3524, 925, 3262, 2758, 3701, -1824, -2364, -3555, -3634, 251, 2710, 2992, 3277, 1091, -713, -2599, -4304, -2357, 1095, 1697, 2871, 2177, 594, -385, -907, -2155, -1397, -1328, -244, 1137, 1742, 918, 1163, 590, -655, -101, -1401, -1949, -334, -453, 344, 1842, 1060, 915, 269, -687, -710, -610, -1011, -263, 44, 435, 528, 882, 250, -29, -445, -817, -71, 297, 302, 518, -132, -409, -198, -410, -324, 90, 231, 664, 560, 538, 30, -285, -1075, -996, -408, 67, 829, 893, + 366, 380, -43, -715, -441, -49, -169, 41, 74, 175, 143, -90, -236, 141, 215, 180, 183, -14, -136, -81, -366, -147, -203, -340, 201, 501, 579, 195, 208, -110, -138, -517, -775, -295, 87, 245, 298, 637, 588, 289, -236, -493, -562, -521, -390, -23, 468, 731, 575, 170, -277, -327, -331, -188, -128, -140, 140, 336, 243, 56, -46, -23, -88, -95, -141, -58, 77, 70, 38, 48, 37, 35, -73, -89, -29, 41, 30, 12, 12, 15, -29, -22, -12, 7, 8, 22, 19, 14, -7, -25, -44, -4, 8, 4, 11, 31, + 9, 10, 25, 3, -69, -54, -18, 15, 29, 45, 15, 5, -3, -1, -18, -15, -9, -5, -15, -2, 1, 14, 20, 24, 12, 10, -8, -20, -35, -23, -13, 7, 25, 39, 25, 5, -13, -17, -26, -19, -2, 11, 10, 10, 3, 2, -1, 0, -2, -2, -2, 0, -1, -1, -2, 0, 1, 1, 1, 1, 0, -1 } + }, + { + {-168, -148, 187, -37, 149, 44, 221, -50, -113, -77, 136, 5, -48, -12, 153, -39, 29, 55, -101, -77, -32, 29, -105, 28, 23, -122, -39, -72, 11, -52, 21, 202, 104, -57, 10, -94, 74, -24, 119, -245, -26, 39, -87, 17, 120, 92, -110, -81, -88, -15, -70, -35, -107, 43, -9, -124, -64, -49, -6, 27, -27, -12, 54, 23, -59, 32, 133, -67, -17, -142, -54, -10, 59, -59, 17, 25, 20, 48, -110, -2, -62, 54, -40, -105, -30, -2, -2, -46, -50, 53, -23, -8, 19, 32, 1, -6, + 6, 19, 1, -10, 24, 6, -21, -18, 22, -7, 8, -13, 20, -17, -12, -2, -4, 8, 229, -87, 74, 191, -157, -177, -27, -45, -3, 97, 54, -245, 37, -141, -194, -13, 70, 76, -64, -9, -22, 104, -23, 85, -41, 9, 18, 25, -123, 50, 93, -45, 119, -68, -14, -151, 106, 26, -41, -118, -117, -53, -41, 58, -14, 50, 49, -104, 63, -140, 49, 80, 152, 147, -129, 62, -9, -34, 89, -69, -83, -62, 72, 36, 94, -96, 143, -47, -9, 43, 23, 84, -65, 120, 151, 265, 122, 84, + -158, -29, -104, -75, 95, -13, 118, 48, -11, -24, -22, 69, -54, 55, 64, -52, 30, 23, 5, 39, -26, -8, -53, -3, 3, 27, -283, -305, 33, -26, 71, 66, 199, 89, 94, 47, -99, 36, 251, -171, -20, 6, 202, 120, 27, 88, -17, 68, 92, 206, 114, 115, 61, 48, 100, 35, -146, 87, 118, -44, 86, 113, -41, 35, 142, 52, -36, 50, 145, -9, -3, -30, 39, 136, -42, -79, 39, -49, 72, 85, -103, 20, -67, 4, 41, 114, 94, -244, -1, 118, -63, -103, 13, 17, 119, -11, + -260, -115, 83, -74, 122, -35, 0, 30, 153, 95, 64, -80, 125, -17, 77, 36, 15, 25, 26, -4, -21, 15, -11, -64, -27, -27, -8, -16, -1, -21, -46, 21, 9, -25, 5, 41, 31, 13, -6, -9, -5, -4, 40, -1, -510, 74, 55, 241, -7, 189, 98, 50, -298, 2, -2, -231, 40, 176, 36, -1, -20, -91, -104, 50, 71, -6, 48, 55, 212, 26, 95, 100, -107, 26, -23, -29, -11, 79, -9, -51, -81, -49, 30, -147, -103, 64, -116, 40, -192, -232, -57, 290, -74, -15, 173, 59, + 15, 184, -23, 22, -20, 55, 120, -44, -179, 118, -103, -201, -78, -55, 3, 76, 222, 3, 1, -84, -5, 130, -58, -66, 159, -131, -7, 73, -157, -30, -52, -53, 21, -84, -117, 8, 78, -34, -49, -67, -66, -9, 53, 23, -3, -19, -50, 3, -14, -65, -93, -82, 3, -10, 43, -63, 1, -9, 35, -4, 17, -19, 4, 10, -29, 454, 12, -31, -176, -103, 238, -100, 185, 159, -187, -33, 138, -106, -52, -51, -69, 27, 48, 6, 85, -43, 11, 30, -39, -90, -93, -105, 6, 116, 49, -104, + 7, 44, 224, -70, 201, -188, 81, 143, -99, -62, -191, 86, -4, -136, 129, -167, 182, -13, 258, 57, 26, 60, 107, 55, -86, 125, -26, -140, -216, -62, 89, -111, -72, 80, -122, 232, -228, -5, 150, -133, -53, -241, -19, -97, -54, -75, 204, 77, 19, 5, 176, 14, -17, 138, 115, 103, 219, -51, 20, -66, 61, 69, 13, 17, -39, -6, -54, -30, 4, 16, 34, -21, -9, 67, 32, -31, 135, -12, -35, -60, -38, 46, -48, 0, -7, -52, 20, 10, -14, 30, 35, -41, 36, 60, 219, 389, + -115, -171, 44, -70, 107, 354, 1, -83, 112, 60, 104, 63, -194, 6, -173, 95, 83, 50, 324, -17, 241, -8, -7, 73, -3, 254, 33, 159, -60, 216, -99, 115, 430, -72, -109, 302, 63, 196, -5, -190, 58, -110, 130, -229, -31, -119, 128, -21, 26, 233, -114, -237, 66, -22, -11, 189, 37, 26, -86, -156, -164, -56, -136, -104, 140, -72, -13, -53, 17, -1, 125, 77, -144, -209, -48, 5, 57, -58, -51, 169, 97, 82, 25, -140, -64, 74, 4, -47, 61, -21, 38, -47, 4, -27, -78, -95, + -24, -84, 23, -14, 9, 55, -14, -46, 71, 13, 45, 24, 5, -28, 36, -10, -7, -4, -6, 1, -13, 18, 46, -56, 16, -66, 11, -33, 82, 532, -284, 185, 4, 90, -132, -104, -62, 114, 147, 29, -85, -158, 78, 145, -32, 44, -82, 159, 57, -306, -103, 95, -21, -132, -9, 135, -104, 44, -200, 112, 246, -106, 260, 6, -51, 173, -11, 11, 156, -346, 48, 102, 143, 96, 111, -157, -123, -8, 51, -169, 52, 160, 142, 51, 441, -142, -59, -204, -90, -134, -189, 227, 92, 221, -39, -360, + 205, -129, 111, 100, 46, 59, -287, 333, 69, -158, -275, -172, -174, 22, 134, -129, 6, 83, 68, -2, -63, 12, -10, 51, 52, 58, 38, 38, 16, -101, -93, 2, -37, 30, 36, -48, 59, -18, 19, 51, 18, 39, 7, -107, -12, -3, 32, 25, 8, -26, -33, 55, -22, 136, 19, 58, -635, -534, -491, 117, 109, 48, 29, -29, -32, 20, -78, -174, -119, -310, -133, -147, 196, -237, -101, -131, 47, 9, -56, 77, -14, -246, 2, 238, 37, -219, -192, 93, -74, 200, 143, -207, 217, 338, -271, -279, + -145, 111, 270, -182, -187, 106, -105, 26, -18, -18, -295, 64, 190, -88, 112, -144, -172, -172, -81, -300, 531, -105, -28, 97, 64, 117, 79, 169, 82, 148, 331, -413, 300, -94, -72, -9, -459, -16, 150, 19, 26, 136, 55, -6, 85, -152, 190, -60, -99, 105, -57, -53, 27, 87, -55, -93, 42, 84, 11, -28, -78, -42, 20, -117, -74, -37, 66, -22, 13, 70, 9, -116, -19, -98, -84, -81, -45, -90, 90, -23, 14, 180, -26, -48, -38, 100, 32, -27, -26, -631, 484, 128, 106, -117, 474, -75, + 223, -1, 201, -282, 112, 110, 44, -139, 422, -115, 129, 97, 438, -295, -18, 121, -75, -217, 132, -204, 54, 55, -238, 92, 21, 11, 482, 300, -39, -198, -153, 106, -24, -289, 83, -26, 86, 216, 321, -221, 219, 108, -143, 103, 85, -229, -121, -144, 231, -249, -208, -569, -414, 114, -76, -83, -217, -442, 171, 32, -11, 214, 186, 257, 156, 61, -5, 39, 296, -219, 404, -150, -111, -369, 61, -70, -184, -36, 48, -95, 110, -47, 8, -48, -11, -41, -6, 63, 108, 6, 90, -101, -66, -53, 40, 72, + -96, -41, -43, 11, -52, 42, -6, 36, 70, -2, -102, 147, 149, 57, 5, -69, 0, -38, -11, -8, 164, -768, 700, 501, -212, -180, 185, -4, 12, 331, 233, 4, -55, 130, -84, -54, 89, -157, 184, 124, -163, 199, -28, 49, -20, -342, -24, 239, 248, 94, 103, 130, -162, -204, 80, 147, -12, -82, -178, 66, -56, 210, 249, -34, 288, -158, 321, 171, 388, 23, 52, -119, -166, -36, 297, 488, 25, 371, -168, -367, 43, 131, -321, 323, -114, 111, -700, -305, -10, -173, 129, 224, 478, 95, -2, -242, + -425, 103, 13, -358, 139, 71, -259, -78, 56, 273, 1, 79, 80, 139, 114, -241, 79, -10, -52, 0, -16, -43, 95, 89, -103, -46, -6, 62, -42, 91, 10, 65, 58, -82, 53, 65, 177, 11, 99, 108, 23, 128, 44, 63, 26, 11, 44, 151, -72, -150, 31, 175, -309, 496, -231, 49, 368, 381, -42, -238, -134, -132, 16, -304, -245, 233, 49, 146, 179, 215, -115, 135, -69, 164, 721, 161, -367, 332, 381, 6, -79, 9, -209, -281, -154, 391, 257, 212, 328, 58, -73, -169, -449, 190, 215, 116, + -83, -65, -164, 49, 340, 233, -420, 257, -356, 350, 62, 124, 146, -71, -208, -69, 130, 613, -114, 301, -154, -292, 316, 288, 60, 58, 285, 95, 2, -45, -207, -69, -296, 80, -233, -119, 426, -33, -4, -1, 188, -77, 44, 125, 189, 212, 168, 63, 80, 92, 169, -38, -166, 201, 66, 106, 110, -4, -32, 4, -110, 48, 181, 13, 7, -51, -92, 157, 161, 26, 299, -49, 118, 234, -4, 58, -54, -102, 6, 44, 68, 166, 56, 122, 28, 23, 162, -38, 14, 130, 22, 34, 7, 56, 0, 80, + -18, 57, 7, 257, -133, 262, 335, -388, 258, 149, -96, 23, 176, -163, -344, 512, 108, 97, 93, 303, 86, -307, 324, -440, -517, 45, 58, -284, -97, -840, -598, -448, -155, -461, -231, 175, -418, 291, 263, -337, 431, 233, -90, -43, -230, 10, -407, 884, 253, 139, -446, 108, -141, 587, -123, -14, -540, 525, 29, 206, 164, 307, 167, -116, 169, -258, 258, -93, 149, -414, 938, 147, -445, 240, 269, 218, 314, 277, -432, 342, -16, 277, -223, 85, -555, 234, 231, 73, -139, -410, -35, 288, -376, -46, -52, 3, + 104, 90, -92, 164, -18, -73, 117, 102, -124, -87, -249, -9, -233, 140, 28, 29, 166, 277, 161, 134, 76, -89, -48, 10, -185, -137, -51, -51, 83, 228, 58, 147, -43, 6, 58, 2, 47, 176, -684, 190, -95, -68, 403, -76, -71, 37, 361, -96, 210, -179, -210, -269, -340, 586, 305, 211, -186, -540, -662, 316, 218, -236, 156, -161, 14, 583, 254, -168, 314, -108, 162, -197, 197, -434, -636, -249, -285, -50, 742, -607, 349, 199, 151, -136, 291, 129, -582, -741, -264, -339, 836, 605, -204, -375, -32, -385, + -82, 607, 563, 318, -499, 106, -390, 609, 289, -66, 1, 204, -362, 79, 538, 291, -488, 528, -271, 315, 840, 319, -199, -251, 719, 77, -44, -329, 126, -156, 46, -98, -17, -23, -359, 43, -45, -104, 157, -30, -127, 21, -76, 18, -94, -141, 124, -157, -99, 71, 187, -11, 132, 107, -25, -2, -180, 23, 61, -154, 205, 99, -124, -86, -87, -41, -201, 117, 192, 7, -149, -89, 100, -45, 96, 133, 11, 48, 2, 0, -552, -222, 899, 411, 514, 119, -764, 224, -621, 394, 1126, 394, 703, -330, 197, 322, + -43, 76, -300, 65, 437, 14, -128, -412, 213, 157, -420, 205, -165, 305, 440, 468, 566, 49, -455, 112, 263, -14, 774, 60, -909, -573, 247, -238, -1071, 30, 443, 158, 38, -106, 550, -448, -554, -114, -204, -539, -39, 30, -318, -466, -289, 14, 57, -668, 188, -284, 151, 752, -113, -274, 521, -101, 432, -427, 276, 10, -494, -550, 966, 86, 122, 37, -8, 969, 790, 244, -83, 375, -197, 122, 219, -51, 291, 120, 78, -455, 256, 133, -35, 32, -161, 120, 335, -66, -122, -200, -219, 199, 235, 4, -9, -198, + -213, 27, -301, 33, -107, 296, 98, 4, -203, -345, -87, -172, -237, 122, 125, 253, 93, 30, 288, -44, 773, 104, -1047, -471, 658, -936, 540, -886, 77, -138, -1283, -166, 585, 1189, 383, -168, 293, -451, -147, -1030, -52, -699, -96, -150, -480, -512, -165, 299, -461, 325, 598, -607, 227, 200, 111, -646, -93, -4, -674, 180, 873, -63, -1251, 448, -753, -1937, 553, -800, -991, 55, -450, 141, 350, -189, 517, -425, 453, -350, -861, 7, 628, 597, -1121, 167, -128, -838, -217, -207, 1468, 731, 864, 392, 380, 905, 1306, -296, + -608, -671, 126, -834, -249, 432, 709, 99, 72, 609, -133, -346, -462, 367, 424, 409, 104, 469, 203, -289, -56, -280, 436, 68, -42, -481, 154, 383, 51, 6, 385, -302, -192, 206, 30, -154, -280, -95, 451, -24, -970, -94, -15, -227, -182, -262, -149, 210, 200, 110, 77, -165, -19, -203, 1701, 1838, -1079, -427, 821, -372, 332, -512, 154, -526, -985, 1343, 197, 421, 346, 125, 177, 40, 273, 333, -952, -787, -688, -651, -486, -308, -253, -512, -288, -435, 494, 373, 191, -240, 102, -1011, -505, 273, -915, -87, 448, 789, + 118, 151, -337, -595, -697, 558, -74, 553, -1956, 119, -226, 222, 1199, 144, 202, 132, -349, -407, 13, -84, -1097, 232, -401, 982, 68, -1085, -1469, -919, -184, -1038, -1009, -633, 715, -190, -695, -945, 787, -107, 467, -535, 287, 767, -512, -752, -311, -392, 811, 163, -353, 311, 239, 696, 439, 196, -624, -633, -136, 64, -162, 103, 435, -105, -35, -327, -231, -184, -328, -74, 136, 187, 1024, 56, -256, -94, 137, 306, -18, 492, 212, 1155, 181, -24, 42, 198, 57, -55, -335, -514, 1904, -1121, 716, 1347, -661, 183, 1074, -1381, + 45, 145, 658, -1548, 75, 96, 496, -680, -2, 268, -916, 127, -79, -177, 488, -157, -147, 203, -129, -161, 478, -464, 124, -195, 114, -300, -173, -364, -6, 63, 946, 311, 454, -103, 0, 703, -41, -275, 386, 287, -331, -935, 839, -932, 140, 438, 572, -917, 961, 1557, -867, -1595, 2115, 746, -1062, 480, -1023, -1261, -638, -235, -1324, 1056, -1841, 544, 860, -731, -2457, 2307, -415, -601, 1528, -1541, 780, 1310, -408, -366, 395, 447, -260, 158, 121, 412, -220, -156, 452, -6, 90, -54, 73, 369, 261, -55, -348, 543, 576, -116, + -524, -58, 235, 50, 349, -2, 303, 131, 451, 342, 376, -588, 133, -15, 7, -2, -374, -634, 905, -153, -871, 306, 189, 85, -159, -593, -460, 1067, -698, -558, -1116, -512, 669, 520, -295, -369, 358, 886, -376, 669, 801, -563, -77, 490, -122, 0, -157, 45, -811, 225, -177, 30, 200, -162, 172, -336, -678, -321, -1184, 150, 1, -175, 224, 115, -73, -269, 482, 756, -789, 1161, -126, 156, 172, 1026, 475, 751, -937, -232, -172, 1337, -1242, -425, 614, -44, -1435, 99, -292, -245, 662, 721, 55, -540, 1168, -489, 1945, 27, + -895, 0, -151, -1017, 1954, 392, -286, -2306, -1148, 651, -844, -764, 909, -3381, 90, 667, 495, -273, 956, -581, -70, 5, 501, -140, 107, 674, -42, -170, -208, -242, -5, 76, -39, -102, 441, -610, -131, 73, 107, -365, -612, -157, -184, -88, -46, 120, -680, 53, 525, -324, 403, 305, -293, 19, -213, 86, 152, -320, 903, -436, -397, -520, -472, -236, 424, 579, 349, 1455, -292, 322, -150, -765, 369, -491, -282, 293, 647, -702, 746, 78, -49, 1534, -324, -181, 1146, -749, 1011, 432, -253, 399, 419, 945, 980, 279, -816, 1676, + -1701, 48, 1526, -836, 329, -191, -211, -1790, 1198, 312, 525, 559, -382, -895, -679, -549, 72, 1685, -1, 1320, -454, -1030, 44, 374, -852, 1355, 541, 662, 1333, 864, -1453, 542, -2078, -2559, 40, 2141, 1334, 167, -1533, -5436, -1012, 1672, 1904, 2712, -152, -3454, -1959, -1803, 2742, 2101, -395, -1384, -821, -1682, -229, 2153, -224, 499, 345, -360, -797, 1171, -493, 651, 466, -50, -1108, 1493, -607, -288, 418, 384, -827, 9, -271, -310, 87, -33, 583, -1075, 551, -1293, -221, -218, 1516, 42, 398, -939, 471, -355, 659, 808, -410, -933, 317, 239, + 766, 646, -174, -255, -132, 531, 83, 535, 222, -1329, 1120, -835, -142, -540, 522, -607, -23, -62, -162, 126, 575, -603, 269, 49, -137, 9, 407, -510, -136, -74, 842, -848, 229, -372, 559, -619, -173, 213, -116, 118, -397, -71, 367, -110, 144, 115, 80, 453, -416, 284, 332, 404, -52, -940, 125, 111, 388, 349, -63, 93, -153, -428, -68, 195, -75, 570, -459, -155, -922, 276, 106, -148, 213, 179, -8, -480, 155, 466, -85, -70, 190, -191, 356, -218, 66, -442, 214, 81, -63, -123, 261, -124, -178, -268, 284, -14, + -132, -62, 283, -112, 129, -156, -85, -18, 17, -6, -144, 13, 12, -131, 138, -125, 368, 53, 56, -503, 149, -14, -191, 222, 431, -311, -60, -16, -212, 330, -46, 43, -212, 110, -38, 36, -131, 129, -131, -759, 1840, 502, 455, -243, -589, -567, 161, 357, 56, -21, -2, -269, -49, 129, -71, 56, -29, -269, -14, 133, 210, -187, 52, 135, -268, 440, -267, -233, -232, 60, 129, 204, -223, 285, -411, 272, 243, -181, -18, -13, -47, 212, -228, 66, -73, -296, 419, -234, -8, -174, -54, 292, -381, 155, 106, -167, + 140, -325, 95, 135, -241, 6, 130, -224, 225, -309, 86, 316, -462, 133, -176, 32, 182, -138, -70, 32, 40, -28, 130, -99, -85, 63, -76, 41, -29, 54, 52, -75, 38, -15, 68, -62, -17, 45, 2, -36, -107, 68, 72, -16, -74, 71, -3, -34, 74, -154, -31, 86, -110, 160, -98, 7, 267, -78, 192, -110, -10, 212, -148, -56, 276, -1422, -3336, 944, 3266, 2246, 3551, -1977, -2104, -2869, -3321, 72, 2563, 2648, 2765, 543, -913, -1812, -2601, -2205, 172, 1713, 2032, 1828, 438, -505, -315, -1427, -1596, -673, -43, 614, + 1347, 658, 489, 675, -337, -801, -131, -1280, -600, 14, 203, 976, 1136, 101, -172, -107, -838, -227, -12, -174, 290, 562, -120, -44, -220, -350, 72, 35, -38, 634, 429, 159, -16, -597, -864, -683, 49, 643, 552, 724, 99, 19, 165, -899, -512, -423, -77, 690, 156, 231, 644, -371, -540, -126, -92, 200, 232, 73, 130, 57, -332, -344, -84, 0, 247, 358, 117, -50, -78, -102, 90, -100, -422, -66, 100, 195, 420, 102, -87, -202, -345, -76, 35, 113, 198, 247, 195, -100, -299, -315, -275, -32, 137, 152, 406, 417, + 203, -90, -512, -542, -251, -190, 192, 506, 375, 162, 2, -40, -66, -155, -254, -245, -104, 36, 106, 170, 246, 235, 90, -91, -198, -214, -159, -60, 33, 76, 75, 91, 105, 80, 2, -61, -106, -87, -32, 18, 42, 7, -5, 7, 11, 31, 33, -1, -35, -15, 27, 7, -31, -26, -4, -21, -35, -6, 63, 86, 27, -21, -32, -23, -14, -25, -34, -14, 24, 39, 22, 18, 21, 4, -14, -29, -30, -21, -7, 14, 24, 17, 14, 7, -4, -14, -20, -15, 0, 10, 12, 9, 3, -5, -12, -9, + 1, 6, 6, 6, 3, -3, -6, -3, -2, 0, 1, 1, 1, 0, 0, -1 }, + {-135, -89, 37, -35, -43, -66, 16, 130, -42, 0, 13, 222, -4, 42, -92, -64, -23, -60, -64, -61, -41, -58, -76, 63, 106, -58, 16, 4, -120, 3, -3, -86, 161, -83, 91, 34, -25, -93, -85, 82, -43, -32, -127, -33, -12, -60, 170, -38, -11, 70, -12, -142, -73, -125, -84, 193, -54, 214, -1, -9, -39, 24, 9, -128, -136, 99, 11, 67, -9, 78, 48, -125, -1, 41, 67, -1, 57, 102, -137, 35, 35, -69, 0, 30, 99, 64, -68, -22, -3, 22, 32, 23, 26, -19, 14, -38, + -24, -2, 50, 21, -1, -5, -34, 19, -2, -13, -2, 17, 8, 12, 33, -12, 15, 38, 292, -25, -37, -77, -162, -200, -183, 19, 160, 55, 214, 73, -100, 24, -259, -219, 99, -78, 141, -15, -116, -58, 281, 62, 118, -7, 90, -44, -36, 54, -41, -125, -11, 44, -16, -9, 178, 110, -195, 3, -124, 202, 119, 7, -74, -76, 92, 51, 150, -143, 240, 295, -83, 287, -2, 150, 92, -55, 48, 230, -29, -158, 132, 41, -3, -20, -29, 8, 133, -88, 47, 35, 70, -114, 126, 28, -13, 39, + 17, 11, -7, 27, 73, -54, 28, 18, 30, -50, 2, -79, 12, 35, -47, -30, 8, 20, 23, 5, 21, -2, -1, 45, -6, 10, -254, -198, 63, -112, 81, -140, -199, -184, 27, -137, 127, 93, -177, -36, 73, 18, 90, -52, 93, 114, -157, 51, 53, -126, 75, 14, -148, 112, 108, -52, 118, 17, 96, 87, 37, -56, -13, -178, -53, -88, 95, 100, 40, -286, 56, 122, -64, 202, -164, -218, 18, -64, 71, -156, 286, -14, -94, 28, 5, 163, -8, -94, -5, -64, -86, -110, 53, -200, 22, 8, + 60, 134, 45, 96, 149, -101, -17, 33, -125, 87, -42, 74, 60, -39, -29, 108, -34, -99, 15, -10, -2, -53, 80, -61, 31, 30, 41, -16, -15, 5, -29, 12, -19, 2, -12, -30, 40, -15, 10, -6, 4, 0, 8, -51, -609, -9, -73, 431, 11, 27, 93, -59, 218, 55, -230, -123, -270, 49, -18, -92, -78, -98, -62, 336, -153, -75, -86, -254, -10, -61, 88, 128, -41, -1, 75, -77, -20, -32, -91, 103, 207, -23, -33, 164, -215, 141, -171, -346, -219, -344, -52, -196, -132, 38, 139, 71, + 99, -50, 120, -146, -32, 127, 0, 175, -72, 55, -121, -91, 91, -210, 58, 160, -205, 23, -54, -94, -134, -120, -39, -51, 34, 150, -70, 49, -123, -130, -103, 53, 72, 21, -32, -36, -54, 34, -46, -39, -18, -36, -4, 10, -66, -13, -7, -48, -12, -20, 1, -5, -91, 15, 40, -14, -35, 0, 58, 33, -21, -61, 36, -4, -20, 391, 3, -218, -209, -72, -152, -59, -114, 30, 19, -172, -101, -189, 359, 152, 34, -20, 195, -290, -4, -6, -183, -244, 219, 4, 157, -245, -107, -85, 86, -9, + 105, -169, 52, 69, -182, -176, -159, 38, -52, -49, 155, -45, 18, 3, -30, -175, -106, -20, -262, -172, -138, 73, 51, 105, -25, 46, -2, -27, 123, -95, 214, 30, 65, -28, -69, 85, 67, 168, -50, 26, 104, -61, 3, -222, 106, -171, 109, -127, -122, -240, -46, 60, 27, -41, 57, 24, 111, 18, -32, 96, 53, -86, 22, -70, 76, -31, 14, -19, -8, -62, -1, 3, 13, -36, 30, -52, 21, -10, -24, -46, 13, -31, 66, 18, -16, -29, -25, 49, 35, 47, 6, 4, 26, -55, 463, 439, + 328, -108, 121, 167, 99, 95, -160, -140, -210, 191, -197, -23, -143, 252, -276, -206, -102, -43, -152, -229, 67, 14, 15, -277, -152, 75, 60, 81, -74, -109, 10, 86, 109, -77, 103, -147, -38, -361, 134, 45, -61, -67, -266, -121, 35, -63, -375, 204, 85, 1, -100, -78, -158, 50, -55, 110, -23, -53, -213, -40, -21, -117, 235, -169, 4, 140, -58, -183, -103, 159, 230, 114, -17, -6, 122, -246, 101, -25, -12, 12, 54, -13, -10, 13, -48, -148, -40, -45, 46, 33, 17, -57, -30, -66, -82, -20, + -3, 99, 9, 14, 12, -34, -20, 46, -52, -7, 18, 29, -62, 1, -6, 37, -45, -10, -26, -42, -95, -43, -5, -41, 0, 6, -5, -52, -21, 558, 187, -82, -65, 196, -377, -71, 305, 153, -213, -5, -145, 59, 235, 577, 190, 449, -159, -34, -437, 148, -128, 123, -191, -10, 18, -68, 157, -71, 75, 193, -148, 87, 247, -68, 83, 0, 99, 135, 139, -742, 271, -86, -347, -61, 212, 64, -268, 144, 212, -437, 35, -124, 257, 58, 213, -52, -153, -307, 19, -186, 579, 107, -95, 193, 25, 186, + -455, -61, 71, 141, 34, -214, -33, 77, 203, 171, -141, 3, 200, -9, 95, -70, -34, 139, 14, -12, -18, 6, 69, -67, -28, -9, 54, 51, -6, -19, 139, -45, -23, -74, 11, 36, -35, 2, 44, 55, -48, -23, -80, 5, 66, -32, 13, 29, 35, 110, 16, 53, -2, -50, 74, 17, -662, -727, -249, -57, 13, 154, -310, 98, 366, -210, 195, 253, -176, 5, -86, 310, 432, -207, -244, 217, 21, -208, 98, 3, 54, 62, -111, -81, -461, -24, -132, -11, -13, 314, 93, -564, 10, 272, -308, 81, + 332, -73, 117, 7, -87, -214, 427, 358, -272, 143, -101, -14, 133, -95, 112, -169, -19, 360, -102, 76, 171, -123, -295, -13, 102, 52, -141, 18, 81, 128, 264, 162, 291, 153, 57, 134, -47, 261, -8, -207, -277, 34, 91, -49, 209, -108, -111, 82, -25, 22, 12, -129, -17, -78, 96, 42, 77, 148, 20, -53, -214, -17, 51, -56, -21, 21, -46, 45, 49, 5, -49, -37, 107, -16, 51, 25, 36, -77, -78, -48, 20, 35, 65, 46, 33, 28, 81, -22, -76, -720, 789, -53, 506, 32, -304, -96, + -179, -215, -34, 8, 364, -65, 248, -263, -20, 57, 52, 23, 316, 315, 111, 45, -47, -69, -25, -60, -542, -189, 241, 154, -66, 21, -260, 123, -317, 62, 489, 48, 101, -417, 214, 186, 47, -281, -127, -134, 17, -253, 247, 304, 181, -33, 458, 159, 673, 260, -187, 560, 7, -211, 404, -72, 129, 253, -192, -164, 373, 402, 235, -335, 120, -8, -158, -276, 196, 355, 212, 518, 67, -120, -122, -327, -128, 195, 26, -63, 8, -205, -146, 24, 46, -11, 211, 167, 71, 3, 58, 98, 48, -104, -46, 25, + -28, -39, 86, 4, -31, 69, 23, 19, 24, -70, 12, 185, -91, 115, 51, 1, -90, -99, -53, 36, 176, -383, 510, -147, -335, 112, 222, -222, -112, -469, 197, -172, -56, -430, -189, -146, -73, -194, 102, -87, -106, 101, 143, 250, 246, -106, -88, -347, 137, 6, 229, 62, 62, -79, 92, -217, -183, 101, 53, 103, -422, 141, 277, -2, -372, -390, -302, -898, 127, -104, 435, -214, 361, 114, 25, 464, 72, -55, 335, 122, -455, -228, 55, -147, -258, -159, 588, 268, -276, -35, -154, -78, 87, 413, 8, -113, + 550, -199, -498, -478, -563, -102, 44, -17, -98, -71, -240, -50, 72, -77, -70, 45, 47, -357, -145, -281, 14, -97, -89, -152, -45, 37, 217, -1, 265, 127, 195, 17, 93, -94, 178, -5, -126, -194, 111, 13, 62, -54, 36, -64, 63, -26, 74, -20, -30, 42, -8, 222, -369, -93, -99, -49, -26, 978, 160, 357, -174, 312, 630, -541, 819, 485, -220, 7, 49, -295, -495, 33, -287, -442, -198, 38, 0, -55, -199, -34, -193, -14, -223, -17, 153, -347, 190, 291, -227, -212, 150, 113, -20, 878, 77, 585, + -421, -42, -511, -376, 90, -377, -516, -345, -392, -87, -105, -437, -473, 616, 97, 38, -84, 319, 178, 385, -38, 364, -204, 82, -682, 556, 270, 42, -375, -30, 169, 34, 65, 274, 384, -299, -383, -253, -60, -8, 42, -226, 26, 63, 158, 204, -26, -129, 215, 104, -160, -13, 78, -98, -169, 28, -57, -58, -5, -76, 197, -210, 114, -8, 218, -230, -55, 36, -58, -89, -36, -183, -198, -40, 21, 55, 72, -137, 136, 100, -81, 119, -24, 67, 6, 66, -55, -47, 19, 33, 80, -14, 110, -54, -38, 0, + -40, 69, 70, 478, -193, -157, 534, -446, -340, -82, -270, -42, -532, 121, -327, 254, 37, 87, 307, 89, 217, 297, 282, 233, 395, 48, 269, 241, -285, 498, 123, 231, -266, 389, 177, 274, 71, 98, -49, -356, 93, 204, 240, 262, 58, -434, -273, 314, 172, 72, -164, 218, -156, -435, 642, 392, 288, -245, -119, -323, -1010, -29, -139, 132, -234, -253, -444, 80, 145, 568, -445, 183, 10, 262, -391, -481, -292, 313, 97, 99, 168, -131, 58, 367, 133, 187, 236, -91, -82, -151, 6, 162, 201, 9, 85, 42, + 35, 152, -90, -78, -128, -72, -132, -2, -203, -81, -214, -10, -127, -35, -26, -73, 66, -52, -276, -39, 116, 125, 235, -32, -133, 68, -49, -201, 193, 162, 158, 359, 239, -17, 18, -77, 100, 32, -827, 460, 491, -258, 417, 137, -699, -131, 897, -138, -612, -103, -67, -533, 358, 67, -273, 386, 254, 926, 539, 5, 60, 873, -235, 214, -369, -527, -163, -361, 71, -35, 169, -36, -72, -158, 687, 25, -556, -443, -107, -122, -28, 218, 626, 397, 126, -394, 485, 893, -199, 401, 375, 1078, 199, 198, 321, 454, + 249, -382, -366, 241, -674, -410, -485, 444, 389, 268, -116, 325, 690, -406, 548, 545, -82, 535, -518, -234, -186, 1130, -563, 551, 343, 198, 152, -512, -57, -405, 419, 396, -13, 22, -210, 294, -125, 22, 107, 116, -7, 177, -134, -76, -57, -135, 51, 104, -100, 43, 125, 223, 29, -221, 84, -238, 35, 200, 130, 212, -44, 347, -146, 254, -74, -93, -52, 7, 281, -216, 132, -14, 134, -177, 40, 61, -82, 368, -211, 159, 174, 617, 1106, 112, -122, 111, -66, -191, 27, 109, -278, -370, 117, -196, -109, 276, + -20, 549, -299, 538, 263, 46, -322, 95, 540, 150, -282, 100, -71, 7, 315, -451, -239, 487, 6, -130, 425, -29, 148, 89, -415, -758, -163, 252, 477, 95, -372, 471, -161, 965, -496, 646, -386, 226, 559, -839, -861, -15, -245, 213, 271, 31, -129, -516, 340, -82, 607, 266, 565, 146, 328, -147, 434, 148, -262, 44, -9, -1264, -38, 212, 302, 521, 449, -156, 37, -103, 83, -10, -140, -342, 144, -204, 435, 41, 85, 204, 126, -147, 126, 305, 277, -105, -50, 35, -66, -56, -196, -46, -411, -68, 142, -355, + 240, -271, -209, 50, -213, 207, 86, -94, 144, -28, -21, 79, 305, -223, 50, 33, 136, 85, 64, -126, 729, 942, -202, -34, 334, 1246, 38, -733, -291, 152, 144, -230, 241, -166, 388, -621, 36, 391, -257, -279, 57, -614, -187, -199, -978, -827, -477, 364, 429, -73, -695, 80, 28, -23, 144, -349, 842, -238, 110, 931, -809, 394, 141, -282, 342, -218, -655, 15, 574, -254, -410, 239, 81, 545, 8, -837, 72, -495, 831, -299, 130, 204, 104, -118, -531, 225, 567, 164, 585, -849, -463, -140, -2, 92, -651, 588, + -75, -625, -203, 396, 374, -346, -475, 475, -377, -240, -3, -59, -46, -31, -134, -27, 245, -54, 226, -251, 181, 229, -55, 123, 44, -47, 10, 31, 415, 21, -70, 35, 99, -204, 81, -261, -12, 301, -100, -238, -79, 135, 14, 10, 187, 14, -228, -124, 443, 316, -94, -19, -4, -645, 948, 27, -1624, 650, -223, 127, 166, 218, 399, 145, -294, -71, 401, 271, -322, -17, -256, -133, -798, -102, 384, 477, 107, -189, 528, -544, 602, -347, -195, 72, -187, 160, -480, -648, -725, -232, 375, -145, 4, 442, 123, 77, + -14, 15, -153, 6, 476, 293, 502, 426, 504, 343, -300, -191, 124, -32, -579, 389, -105, -547, 687, -8, 112, -19, -250, -82, 288, 418, 347, 11, 213, -701, -100, -250, 381, 132, -195, -223, 882, -269, -302, -96, 142, -218, -582, -33, -100, -314, 545, 111, 205, -167, -29, 127, 33, 160, 173, -57, 106, -105, 120, 46, -97, -73, 89, 125, 34, -111, -92, -100, -74, 3, 62, -90, -110, 26, -9, -19, 94, -44, 150, 46, 439, -37, -55, -96, 53, 3, -185, -243, 2212, -2169, -107, -2358, -364, -896, -108, 577, + -291, -652, 1031, -277, -178, 35, 319, -36, 857, 567, 341, -504, 35, -344, -349, -234, 14, -107, -93, -285, -62, 474, 60, 314, 314, -25, 419, 608, 34, -124, -316, -379, 153, 166, -313, 516, -680, -689, 77, -241, 370, -639, 274, -1228, -654, -983, -84, -485, -43, -296, -369, -321, -29, 83, -960, 109, -210, 110, 5, -444, -781, 540, -470, -84, 484, -49, -151, 320, 401, -83, 400, 261, 483, 266, 489, 231, -289, -81, -255, 12, -211, 45, 177, 250, 274, -122, 128, 91, 180, -43, -68, 94, 216, 28, 50, 238, + 122, 245, -35, 11, -25, 119, 170, -31, -281, 154, -47, 60, -88, 39, -80, -42, 15, -235, 4, 321, -201, -212, 28, 110, 112, 38, -222, 1789, 898, 434, -434, -225, -936, 205, 748, -147, -180, 1227, -222, -274, 606, 898, 154, 916, -231, 133, 539, 611, 963, 780, -43, -349, 288, 351, 330, 413, 720, 352, 916, -357, -27, 268, 247, 777, 449, 832, -603, -190, 330, -648, 520, 530, 506, 216, -655, -239, 1235, 318, 831, 691, 756, -157, 1003, 1574, 539, 138, 1102, 762, -429, -263, -538, -429, 462, 539, 44, -457, + 6, -408, -22, -183, 263, -959, -113, 96, -489, 365, 61, -300, 252, -604, -396, -669, -227, -323, 232, 73, -315, 70, 433, 128, -147, -266, -416, -160, 133, -584, -276, -50, 465, 157, -203, 98, -319, -87, -101, -261, -172, 439, -105, -31, -111, 104, 277, 200, 236, 605, -3, 488, 19, 50, 302, 262, -406, -232, -35, 95, 39, 4, -44, 192, -563, 285, -679, 1199, 1702, 992, -432, -930, -340, 843, -245, -693, 1270, -874, 760, 429, -990, -409, -100, -1639, 69, 191, -787, 1619, -551, 1504, -1120, 169, 77, 1100, 1622, -131, + 554, 766, -889, 602, -1205, -331, 2305, -127, -629, -122, -1282, 58, -400, 1441, 553, 672, -215, -378, -710, -660, 173, 94, 10, 960, -226, 185, -988, -513, 671, -1479, -577, -443, -499, 1385, 108, 1496, 1079, 479, 581, -333, -782, 671, -1067, -655, 1334, 405, -790, -1315, -789, -936, 762, -807, 429, -583, -42, -500, 543, 313, 56, -434, -72, -299, 98, -591, -401, -222, 140, 332, -3, -240, -328, -549, -384, 351, 487, -149, 339, 671, 330, -621, -173, -228, 403, -379, -240, -89, 155, -498, -664, -479, -150, 277, 1, 63, -85, 379, + 129, -23, -339, -115, -206, 267, -66, 64, 1072, -1794, 1897, -53, 141, -615, 1531, 355, 984, 368, -654, 216, 544, -946, 652, 6, 431, -1261, -104, 302, 1150, -488, -959, -47, 1143, 601, -445, -996, -55, 824, 103, 52, 224, 598, 1517, -2153, -360, 202, 1188, 262, -657, -166, 449, 1088, -116, 48, -2065, 591, 316, 557, -1500, 1317, 1132, 424, -682, -73, -754, 555, 969, 405, 450, -89, 733, -1081, 1015, -306, -370, 1196, 983, 60, -380, -990, 716, 787, -2119, -171, 1209, 299, -19, -759, -331, 2062, -164, -709, -95, -384, -465, 684, + -586, 207, 308, 417, -296, 39, -300, -356, -241, 314, 311, -326, -70, 156, -263, 623, -606, 155, -113, -196, 217, 1033, 63, 1, -171, -365, -4, 563, 129, -27, -114, -266, 475, -124, -33, -282, 270, -44, -132, -1605, 770, 141, 487, 590, 861, 300, 271, -423, 440, 75, 1023, -127, -317, 804, 614, -144, 45, -354, 2, 250, -89, -214, 454, -376, 39, 620, -144, 355, -648, -137, 76, -269, -111, 67, 448, -123, -773, 24, 1514, 310, -834, 241, -850, -582, -443, -124, 963, -111, -783, 1566, -1709, 283, 1728, 178, 1212, -938, + -1748, 557, 52, 1382, 65, -787, 636, -180, -152, -337, -64, -491, 235, 64, 363, -598, -519, -207, 607, 787, -272, 418, -72, 659, 460, -836, 657, -173, 90, -144, -267, -5, -12, 88, -72, 68, 51, 46, 87, -276, 5, 152, -239, -31, 137, -148, 183, 211, -323, 378, 145, 392, -97, 181, 306, -598, -17, 183, 338, -214, -169, -205, -159, 348, 689, -297, -3237, -7439, -2948, -4477, -6555, 3524, 975, 2028, 9337, 7197, 4199, 7686, 5735, 980, 1896, 1578, -3642, -3117, -1526, -5571, -5326, -2040, -2737, -3864, -1615, -1388, -3933, -3283, -272, -1870, + -3189, -1095, 1018, -2316, 698, 3448, -262, -494, 4683, 3740, -163, 5471, 6340, 2575, 5957, 8358, 4987, 4332, 10030, 8005, 6019, 7135, 9463, 3383, 1343, 3962, -3123, -8966, -6499, -9916, -16057, -14383, -15264, -17753, -18092, -15601, -13585, -13625, -9577, -4243, -2872, -435, 4649, 8542, 8624, 10705, 15402, 13463, 12308, 17007, 13518, 7640, 11151, 7808, 3032, 2743, 3603, 371, -1135, 700, 104, -2525, -1344, 225, -2009, -3726, -1787, -2556, -5425, -3421, -1320, -4056, -2725, 547, -1287, -1894, 931, -1121, -4467, -3424, -5484, -9274, -8731, -8375, -8698, -7647, -5136, -4014, -2415, -469, 2045, 3625, 5564, 7018, 8718, 9069, + 9620, 10717, 10167, 9322, 8819, 5842, 2059, 195, -874, -2496, -2943, -2569, -2900, -3258, -2870, -2899, -2840, -2399, -2340, -2456, -2370, -2075, -1721, -1470, -962, -597, -121, 68, 437, 664, 835, 866, 917, 909, 715, 418, 323, 163, -46, -219, -278, -615, -803, -992, -1322, -1558, -1460, -1406, -1254, -941, -667, -490, -123, 261, 511, 776, 1207, 1305, 1294, 1400, 1539, 1424, 1480, 1554, 1473, 1417, 1424, 1259, 1084, 956, 735, 417, 189, -80, -437, -799, -1062, -1377, -1567, -1650, -1627, -1608, -1474, -1275, -1075, -870, -608, -429, -231, -65, 93, 224, 331, 421, 486, 477, + 467, 425, 369, 314, 277, 228, 186, 147, 124, 98, 85, 75, 68, 60, 55, 53 } + }, + { + {-261, 155, -198, 25, -84, -26, 78, -122, -223, -56, 20, -128, -73, 109, -64, 51, -280, -23, 190, 102, -313, -107, -82, -82, 106, -45, -163, -102, -116, -118, 207, 66, 134, -85, 175, 160, 114, -62, -148, -116, 13, 31, 238, 85, 46, -111, 26, 11, 27, 95, 56, -160, -137, -70, 87, 21, -30, -172, -53, 69, 78, -68, -26, 5, 83, -17, -91, 1, 13, -117, 251, 17, -170, 1, -26, 162, 13, 110, 150, 58, -10, 9, -55, -34, -37, 97, -31, -11, -43, 34, 11, -17, -4, -24, 5, -2, + 19, 21, 32, 41, -173, -157, 176, 162, -132, 97, 9, 50, -432, 166, -65, -295, -385, 10, 277, 16, 179, 6, -348, -120, 39, 121, -62, -30, -147, 19, -27, 245, 124, 52, 43, 66, 84, 223, 135, -198, -18, 46, 47, -235, 76, -70, -150, -42, -7, 160, 41, -90, 162, 254, -55, -97, 61, -18, 138, 141, 110, -170, -130, 121, -52, -43, -131, 14, -194, 115, 103, 136, 34, 158, -172, -108, 222, 11, 82, 262, 101, 26, -107, 154, 18, -78, 43, -186, 4, -20, 27, 50, -22, -83, -46, -14, + 40, 38, 12, -23, 22, 52, 8, -18, -17, 0, 219, 19, 85, -185, -157, 90, -43, -68, -86, -80, 67, -214, -122, -264, -317, -59, 264, 170, -107, -30, -37, -62, -228, 164, -57, -59, 15, 107, -51, 9, -8, 156, -144, 156, 85, 187, -64, 145, 65, -90, 131, -89, 75, 139, -105, 146, -87, -70, -22, -43, 74, -43, -111, 44, -96, 21, 13, 15, 220, 43, -50, 1, -90, -126, 65, -31, 210, 214, 87, -60, -33, -2, -84, -98, 108, 169, 6, -19, 105, 112, -14, 39, 36, -82, 78, -15, + 112, -56, -21, -5, -46, -5, 81, -18, 25, 23, -57, 18, -10, -12, 23, 21, -36, 41, -14, -18, 3, -5, -7, -34, -25, 11, 419, -177, 172, -213, -179, 1, -50, -45, 58, -90, 181, 177, 151, -45, -20, -79, -193, 30, -116, -21, 21, -65, 110, 42, -13, -319, -133, -201, 8, -131, -202, -89, -112, -124, 201, -161, 142, 12, -57, 79, 68, -144, -39, 3, 155, -15, -212, -270, -281, 73, -102, 6, -22, 41, 95, 156, -108, -57, 51, 54, 20, 196, -109, 121, -225, 440, 54, -47, 86, 42, + 84, -122, -22, 33, -14, -26, -222, -74, -151, -45, -18, -109, -106, 79, 92, 28, 18, -10, 78, 46, 90, -45, 8, 3, 82, -33, -5, -5, 9, -65, 16, -47, 24, 33, -16, -55, 11, 17, -17, -19, -59, 15, -7, -30, 37, 43, -5, -13, -206, 28, 37, 12, -34, -124, 72, 57, -186, 216, -272, 333, -34, 110, 48, -8, -38, 68, 312, 350, -69, 62, -44, -51, 45, 73, 239, -32, 71, -123, 130, 28, 188, 91, 176, -258, 106, 93, -83, -4, 191, 0, 13, 58, 116, -41, -18, 372, + 176, 32, 32, -79, 167, -226, -332, -400, -26, 209, -8, 104, 282, 112, -52, -101, 149, -30, 363, 164, 52, 50, -201, 42, 149, -77, -226, 39, 79, -10, -80, -29, 36, -73, 40, 41, 36, -15, 42, -72, -69, -22, -44, 23, -69, 38, 64, 43, 47, 49, 13, 32, -94, -78, -31, -41, -50, -10, 29, 17, -6, 58, 29, -4, 71, 45, -2, -489, 50, -39, 332, -252, 145, -517, 201, -50, -265, -290, -204, 152, 118, 390, 50, 129, 372, -67, -275, 39, -212, 50, 303, 55, -88, -38, -61, 89, + 116, -26, 77, 156, -101, 49, -187, -15, -233, -37, 29, -111, 168, 115, 143, 289, 16, 350, 266, 129, -185, 401, 170, 70, 350, -39, 5, 29, 114, -74, -106, -242, -236, -191, -1, -151, 306, -187, 125, 192, -111, 9, -92, -52, -307, -348, 156, -61, -120, -104, 27, 40, 20, 68, -125, 284, 17, 85, -62, 15, 81, -139, 43, 5, 45, 64, -4, 50, 94, 0, 25, 70, 74, 100, -8, 17, -55, -15, 1, -24, -77, 5, -25, -32, 4, -30, -43, 407, 15, 4, -38, -80, 73, 16, -209, -267, + -362, -190, -379, -241, -129, -280, -178, -123, -146, -379, 258, 162, 9, 136, 62, -106, 468, 28, -163, -86, -319, -138, 349, 16, -294, -294, 42, -297, 94, 103, -232, 8, 71, 16, 343, 102, -158, 34, -189, 173, 24, 76, -421, 289, -145, 120, 9, 55, 68, 10, -123, -11, -165, -1, -332, -3, -359, 471, -81, 299, -222, -104, -48, -229, -128, 183, -8, -8, 136, 176, 27, 288, 249, 347, 184, 73, 41, 157, 83, 51, 63, 35, 76, -23, 126, 21, -9, -28, 98, 39, 69, 34, -47, 32, 38, 31, + -78, 144, 77, -15, -112, -13, -18, -81, 28, 13, 82, -70, -155, -208, 1, 155, -400, 1, -172, -137, 286, -462, -436, 116, 585, 17, 57, 46, -87, 321, 312, 181, 89, -83, -473, 283, 4, -378, -121, 90, -18, 5, 40, -90, -372, -20, 17, -67, -155, 114, 326, -417, 262, -155, -77, 26, 208, 682, -438, -109, 45, -42, -79, 24, -167, 60, -151, 469, 162, 89, 131, -97, -25, 249, -37, 109, -204, 360, 17, -253, 504, -318, 233, 67, 116, 367, -144, 157, -16, 2, 46, -23, -245, -129, -14, -107, + -37, -58, -150, -153, -114, 74, -131, 78, -34, -4, -115, -78, -84, 70, -159, 18, 17, 99, 154, -58, -27, -135, -116, 10, -101, 31, -17, -89, 3, -26, 43, 57, -37, 497, 38, 129, 147, -84, -287, -225, 34, 497, 281, 60, -446, 63, -245, 1, 497, 478, 241, 323, -293, -605, -317, -437, 241, -5, -74, -2, -330, -99, 101, -63, -126, -123, 352, -24, 95, -101, 231, 48, -134, -281, -216, 638, -28, -145, 203, -366, 114, -210, -638, -144, -84, 192, 73, 169, 53, 251, 9, 17, 139, -624, -99, -168, + -45, 60, 357, 394, 142, -104, -273, -359, -121, -212, 45, -106, -112, -248, 368, 265, 108, 338, -81, 134, 208, -134, 123, -86, 27, 123, -38, -83, -35, -46, -33, -4, 8, 122, 4, 13, 37, -69, -189, 6, -45, -26, -35, -112, -13, 36, 167, 137, -78, 18, 110, -25, 25, -41, 25, 105, 13, 115, -720, -471, -109, -171, 368, 253, -60, 634, -640, -149, -242, 677, 325, -222, 250, 95, -263, 468, -515, 255, -237, 40, 56, -172, 452, -317, 277, -132, -664, -110, 464, -281, -453, 6, -56, -678, -127, 272, + 116, 362, 266, -76, 653, -156, -201, -321, -299, -289, 179, 244, -210, -237, 78, -205, 274, -75, 149, -111, -170, -130, -4, -384, 104, 277, -65, 120, 167, 197, 355, -254, 114, 277, -36, -589, -627, 69, -60, 47, -229, -95, 46, -227, -412, -126, 311, 252, -124, -50, 96, 85, -49, -100, 7, -13, -162, -60, 172, -50, 138, 25, -43, -85, 111, 109, 129, 15, -72, 75, -193, -116, 95, 44, 82, 150, -77, 31, 59, 73, 14, -88, -127, 56, -69, -42, 512, -330, -826, -1, 582, 744, 136, -280, -211, 73, + -138, -122, 325, 329, -167, 317, -412, -54, 290, -148, 352, 163, -53, -495, 184, -119, -120, 21, -41, -56, 669, -335, 339, 572, 396, 206, 4, -385, 377, -218, 359, -209, 80, -405, -81, -383, -252, 53, -356, -102, -127, -19, 310, -374, -322, -121, -186, -80, -319, -412, -513, 47, 392, -32, -255, 38, 81, 309, -349, -203, -114, -14, 232, -1, 62, -243, -103, 120, 474, 209, 326, 379, 495, 190, -71, -179, 119, 150, 217, 91, 19, -2, 300, 106, -114, 22, 167, 66, 39, -113, -111, -79, -153, 8, 141, 135, + 28, -83, 197, 113, 250, 130, 5, 167, 0, -133, 191, -3, -28, -75, 36, -48, -6, 168, 97, -1378, -655, 460, -1126, -780, -50, -459, -315, 344, 393, 121, -72, 143, 1124, -138, 180, 433, 493, -512, -266, -242, 415, 453, 227, 84, 424, -124, -213, 298, 574, 41, 185, 585, 431, 352, -262, 111, 177, 0, -10, 376, -123, -5, -38, 251, 9, -409, -274, 83, -557, 423, -124, 933, 37, 512, 101, -21, -301, -13, 119, -393, -203, -459, -58, 237, 321, -139, -749, 273, -119, 257, -269, -320, 235, -484, -371, 724, + 11, 334, -68, -312, 87, 427, 104, 340, -549, -26, -37, -90, -472, 462, -275, 35, -54, 57, -175, -16, 97, 142, -117, 303, -74, -95, -177, -150, -152, 146, -58, -105, -45, 40, -116, 212, -63, 240, -149, 103, 37, 97, 155, 33, 556, -257, -649, 275, -340, 139, -11, -324, 593, -798, -35, -963, 21, 774, 1084, 511, -189, 500, -41, -72, 52, -88, 265, -35, -511, 27, -709, 246, -221, -160, 471, -12, -546, -610, 138, 82, -305, -255, 452, -661, -6, -135, 230, -179, -145, -529, -226, -235, -101, 377, -453, 160, + -57, -80, 57, 161, -765, -84, 101, -70, 280, -243, -339, -156, -856, -379, -374, 15, 362, 546, -262, 413, -714, 1138, 76, -207, 594, -710, 596, 265, -163, 10, 197, 13, 93, 543, -236, 230, -129, 166, 270, 265, 325, -116, 274, 62, 39, -49, -370, 11, -263, 117, 167, -60, -43, 46, 35, 181, 82, -136, 197, -6, 21, 243, 166, 95, 445, -371, 0, 160, -2, -292, 68, -187, -176, 700, 41, -499, -10, -75, 325, 215, -304, 353, 7, -785, -855, -81, -257, 215, -36, -301, -771, -672, 368, -572, -128, 38, + 182, 44, 551, 48, -277, 370, -48, 55, 341, -447, -29, 99, -457, 279, 381, 167, 339, 178, 525, 145, 382, -534, -167, -84, -719, -2, -77, 303, -47, 347, -57, -416, -284, -20, -665, 294, 19, -127, 390, 248, 324, 337, 103, -38, 283, -901, 275, 116, 405, -158, -636, 403, -96, 692, -1017, -360, -712, 489, -207, -653, -729, -479, -215, 235, 184, -198, -207, -107, -13, -219, -83, 374, 58, -34, 110, 83, 69, 204, -156, -206, -5, -359, 1, -125, -51, -231, -62, -316, -284, 362, -201, -11, 122, 175, -30, 304, + -251, -80, 125, -295, -81, 349, 125, 79, -118, -178, 134, 476, 442, 1619, 1223, 164, 354, 101, 940, 24, 457, -429, 1113, -443, 1009, -47, 644, -77, 454, -455, 108, 226, -250, -83, -135, -106, 300, 6, -261, -360, -542, -690, -332, -118, 3, 215, -580, 244, -320, -494, -103, -361, 163, -89, -755, -181, -384, -456, -478, 432, 578, -1213, 274, 106, 339, 118, -153, 731, 412, 382, -1014, -455, -14, 248, 839, 30, -114, 39, 710, 637, -605, 682, 50, 152, -116, 399, -862, -304, 889, -138, -58, -344, 593, 386, -306, -520, + -89, -24, 53, 6, -111, -485, -165, 375, 495, 305, -273, -74, -80, -236, 76, 77, 229, -52, -161, 141, 56, 85, 448, 59, -124, -172, 78, 159, 349, 68, -338, -183, -254, 99, 131, -282, -596, 191, -48, -102, -208, -369, 446, -175, 389, 604, -680, 213, -388, 1137, -671, 643, 593, -224, -1060, -617, -69, -282, -30, -486, -772, -1028, -588, -684, 297, -585, 246, 70, -66, -60, -481, -148, -494, 146, 445, 581, 12, -162, -507, -121, 52, -302, 88, -417, -270, -59, -413, 329, -364, -1080, 42, -33, -355, 461, 362, 526, + 203, 414, 837, 141, -830, -189, 393, -182, -689, 387, 549, 185, -2, -934, 837, -39, 683, -565, 692, 1692, -148, -48, -824, 446, -670, 568, 290, -369, -81, -912, 212, -497, 10, 352, 354, -11, -234, -203, 253, 619, -298, -47, 97, -268, -77, -84, 132, -29, 262, -117, -295, -163, 92, 235, -292, -90, -2, 42, 220, 49, -72, 80, -496, -284, -28, -44, 106, 32, 43, -7, -83, 257, -10, 192, -9, -52, -181, -123, -1332, 450, -1746, 1150, 410, -300, 1225, -120, -627, 1087, -421, -61, 228, 379, 1004, 39, -84, 709, + 300, 595, 728, 540, 48, 377, 58, -40, -402, 255, 381, 91, -25, -433, 205, -406, 485, 479, 82, 567, -351, 374, 587, 375, -796, -855, 1002, -98, 626, 974, 22, 0, -103, 191, 562, 534, 54, 444, -1, -507, -634, -938, 15, -381, 12, 531, 496, -877, 74, 340, -770, 128, 1069, -464, -535, 575, -619, 142, -175, 1122, -328, 693, -345, 583, -56, 217, 464, -733, -225, 280, -487, 357, -437, -120, -247, -224, 30, -120, -201, 118, 332, -167, 90, 123, -291, 52, 38, -73, -206, -83, -159, -470, -188, 103, -620, 226, + -318, 241, -145, -58, -435, -225, 4, 122, -193, -421, 69, 31, 226, 100, -1, 278, 219, 26, 188, 131, -606, 139, -702, 1454, 359, -771, 298, -176, -686, -809, -821, 248, -37, 731, 1083, 522, 265, -127, 362, 38, -1355, 599, 1414, -920, -968, -835, -1183, 862, -1165, 529, 10, -143, -5, -376, -449, 583, -1199, 1239, 711, 167, -788, -594, -521, 114, 209, -509, -69, -375, 853, 389, -152, -23, 352, 82, 401, -693, -274, -64, -122, -644, -454, 387, -1230, -723, 95, 1442, 695, -436, -28, -1091, 533, 1672, 60, -356, -250, -786, + 1029, -328, -397, -32, 610, 385, -528, -474, -170, 539, -143, 160, -41, -424, -138, 683, 390, 58, -315, -48, -48, 533, 432, 219, 195, -627, 241, 229, -94, 145, -98, -88, -551, -56, -28, -76, -176, 150, 202, 108, -648, -555, -275, 0, 40, -651, 233, 824, 166, -226, 15, 130, 3, -354, -272, -91, 111, 6, -671, -461, -1345, 299, -990, -1483, 354, 826, 207, 225, -625, -783, -200, -1163, -569, 308, -972, 1542, 304, -374, 335, -733, -1452, -485, -1109, 180, 330, -405, -788, -399, -484, 431, -577, -209, -71, 661, -471, -84, + -218, 171, 280, 53, -192, 682, 893, 570, -450, -370, -1301, -724, -294, 348, 2199, -373, 31, 979, -84, 418, -494, -518, -415, 465, -1234, 11, -159, -14, 1077, -470, 1628, 145, 1235, -1566, -465, 455, -26, -679, -568, 1273, -1306, -1081, 1566, 276, 1360, -537, -85, -93, 441, 187, -119, 462, 467, -24, 222, 146, 54, -160, -287, -66, -188, -258, 246, 140, -214, 157, -474, -47, 343, 591, -42, -372, -23, -424, 247, 406, -278, -233, 233, 271, -600, 216, 32, 394, -252, -266, 2, 125, 189, -681, 116, -289, 545, -189, -121, -79, + -1345, 642, 989, -715, -587, -200, -645, -778, 210, 231, 607, 27, 531, 942, 985, 653, 228, -720, 73, 375, 499, 764, 10, -395, -573, -217, 777, -318, 307, 673, 69, 1323, 155, -844, 732, 720, 210, 311, 671, 107, 59, -775, 1676, -1784, -1309, -1522, -501, 314, -892, 459, 1001, -297, 101, 880, 284, -954, -328, -739, -103, 54, 52, 850, 840, -193, -208, 534, 1292, 223, 1063, -895, 946, -414, 316, -190, -598, -420, -92, 425, 265, 1050, -1357, 691, -535, -338, -262, 502, -236, -49, 113, -548, 345, -269, -15, -416, 132, -86, + 22, -469, 73, -45, 97, -48, -505, 200, -286, -267, -116, 376, 443, 482, -412, 831, -625, -193, 51, -72, -461, -253, -23, -352, 103, -33, -11, -45, -340, 40, -54, -20, -762, -1533, -1543, -1117, 229, 2865, 724, -396, -867, -2071, -2913, 657, 1206, 1448, -305, 125, -855, -1487, 428, 269, 483, 69, -1247, -381, 304, -251, -50, -236, 1623, 1425, 961, -89, -697, -1184, -784, -709, 1109, -185, 811, 366, 380, -500, -2699, -1859, 917, -1463, -499, 3112, 2140, 1607, -1220, 880, -845, 61, 61, 451, 1320, 2326, -892, -84, -1535, -1241, -2031, 219, + -85, -2188, -525, 1407, 526, 982, 1332, 2400, -1750, -1051, 138, -1429, -185, 797, 1869, 949, 291, -1143, -1095, 737, -313, 1101, 968, -263, 443, 177, -188, -368, -215, -140, 328, 94, -10, 113, -36, 157, 3, 696, 572, 907, 162, -502, -1054, -861, 348, 815, 934, -119, -600, -2422, -1246, -1148, 25, 120, 245, -11, 178, -276, -4, -408, -365, 509, 449, 260, 262, 131, 57, 114, 709, -1152, -3814, -3549, -2037, -2215, -553, 3673, 1865, 3779, 3353, 5256, 3753, 3229, 520, -1402, -3170, -5079, -4313, -4344, -2271, -1090, -257, 36, 124, 897, 1198, 3022, + 1835, 3567, 2323, 3058, 1105, 2954, 1025, 723, 698, -176, -830, -2000, -2309, -4284, -2936, -5429, -4296, -6589, -3908, -3099, -749, 1811, 962, 163, 1807, 3864, 5160, 6768, 8065, 6903, 5041, 6289, 5187, 2909, 1307, -322, -2164, -5004, -5946, -7960, -10279, -11893, -10735, -9459, -6734, -4596, 1407, 4435, 5402, 8323, 6947, 8680, 9119, 8949, 10313, 6773, 1758, -1703, -3307, -4090, -2651, -3830, -3286, -3833, -5191, -5247, -6112, -3616, -2818, -2399, -1344, -79, 359, 1487, 4028, 4248, 6027, 5250, 6893, 5073, 3387, 3499, 1331, -914, -1498, -6646, -8574, -7979, -7046, -4121, -3238, -1766, 154, 1802, 2739, 3729, + 4446, 5293, 5020, 4752, 4179, 2342, -9, -1175, -2756, -2876, -2469, -2007, -2099, -2116, -1668, -1187, -705, -280, -263, -173, 72, -180, -226, 326, 710, 809, 536, 416, 639, 817, 642, 780, 1025, 1251, 1065, 258, -126, -45, -53, -345, -299, -209, -482, -791, -996, -945, -832, -669, -555, -319, -127, -71, -32, 152, 308, 408, 442, 472, 384, 316, 307, 201, 44, 100, 122, 45, -47, -74, -4, 147, 204, 177, 154, 229, 180, 53, -62, -132, -188, -236, -393, -476, -451, -476, -565, -439, -168, 18, 60, 164, 304, 385, 344, 345, 382, 351, + 259, 185, 105, 51, -11, -57, -64, -58, -71, -95, -102, -88, -77, -71, -60, -44, -33, -25, -21, -16 }, + {-364, 137, -207, 114, -116, -240, -415, 75, 14, 106, 93, -28, -29, 33, 253, -177, -318, 107, -131, -212, 5, -31, 133, 48, 95, -95, -23, -62, 215, -57, -86, -75, -37, -51, -85, -75, -52, 44, 19, 29, 8, 57, 92, 47, -80, -241, -2, -167, 25, -10, -76, 109, 8, 2, -240, -97, 33, -18, 85, 7, 76, -69, 32, -29, 149, -52, 79, -132, -132, -166, 9, -39, -48, 2, -58, 0, -68, 16, 4, -28, -105, 12, 11, 62, 54, 2, 57, -5, -44, -13, -20, 23, 0, 4, 32, 25, + -4, 31, -19, 7, -261, -54, -34, -74, -33, -89, 87, -35, -30, -7, 2, -5, -63, 232, 150, 243, -113, 242, -143, -100, 94, 268, -6, -162, -239, -171, -33, 191, 75, 65, 85, -83, 130, 17, 97, -47, -218, 60, -151, -103, -106, -25, -277, -12, 13, -115, 259, -49, -83, -104, -2, 29, -111, 4, -136, -51, 4, -56, 186, 6, -50, 105, 67, 173, 69, 207, 51, 170, -193, 51, 154, -52, -138, -189, -4, -14, -38, 47, 56, -40, 148, -127, 49, 52, -95, 70, 16, -69, 37, -17, 15, -64, + 20, 9, 12, -7, -5, 33, 8, 60, -12, 6, 295, -136, -105, 29, -67, -50, 148, -117, 142, 65, 2, 72, -97, -92, -169, -182, 238, 112, 83, 127, -84, -57, -62, 300, -118, 329, -12, -85, -80, -176, -189, -229, -15, -59, 40, 219, -20, -104, -308, 10, 243, 357, -169, 91, 65, -92, -82, 92, 339, -82, 53, -30, -50, -33, 162, 234, -179, -98, 72, 307, 51, 217, -179, -167, -10, -29, 62, 46, -4, 18, 32, -81, 37, 99, 76, -62, 197, -51, 123, -66, -68, 73, 62, 66, 15, 69, + 13, -104, -70, 19, -5, 37, -20, 55, -3, 30, -31, -7, -3, -16, -36, -4, -22, -7, -26, -23, 55, -2, -27, 59, 1, -32, 488, -334, -73, -138, 39, 130, 235, -233, 161, -60, -247, -399, -81, -169, 29, -37, -168, -86, 94, 100, 314, 174, 160, 17, 51, -161, -109, 252, 194, 132, 62, 122, 27, 2, -209, -296, 200, -78, -199, -94, -124, 107, -109, 254, 60, -144, -70, -110, -95, 124, 187, -15, 126, -91, -101, 2, 27, -97, -36, 147, 3, -59, -70, 81, 90, -10, 109, 16, -74, 253, + -34, 29, 14, -302, 120, 96, 159, 104, -109, -24, -272, -125, -249, -91, -111, 2, 26, -165, 9, -39, 3, 72, -23, -30, -3, -45, 10, -22, 21, -27, -60, -30, -13, -103, -7, -4, 24, -6, 15, -5, 5, -55, -69, 8, -8, -31, 16, -80, -334, 84, 2, -100, -184, 75, -175, -33, 299, 454, 223, 249, -20, -128, 186, 167, 69, 89, 223, -35, 161, 157, 231, 222, -185, 148, -14, 51, -172, 50, -25, 151, -61, -45, -122, 110, -189, -153, 13, 159, 85, -98, -52, -31, -66, 95, -227, 205, + -3, 255, -367, 24, -331, -105, -107, 88, -37, -76, 70, 26, 86, 140, 230, -30, -190, 39, 311, 63, -93, -24, 191, -103, 115, -100, -338, 192, 203, 189, -168, -250, -182, 209, -25, -34, 146, 54, 34, 24, -13, 57, 75, -27, -45, 43, 2, -16, 23, -43, 9, 67, -31, 70, -33, -54, 22, -3, -3, 35, 24, 36, 25, 25, -6, 34, -26, -499, 9, -110, 46, -280, 35, 47, 371, -297, 4, -398, 91, -240, -58, 15, -130, 116, 51, -208, 4, -3, 193, -126, 311, -3, -269, -137, 331, -31, + 133, 89, -54, 198, -219, -206, -161, 23, -209, 223, -123, 144, -203, -2, -246, 163, 22, 195, 173, -164, 326, 279, 263, 53, 276, 227, -234, 202, 96, 19, -217, 101, -185, 184, -79, -145, -18, 274, 97, -314, 300, -24, -106, -179, 306, 265, -228, 227, -16, -271, 3, -153, -85, 150, -131, 108, -11, 48, -63, 82, -11, -7, -18, -29, 29, 17, -76, 28, 38, 1, 28, 34, -72, 17, -9, 3, -60, 23, -25, -35, -80, 93, 19, -42, -13, 26, -10, 713, 121, -29, -246, -462, 118, -68, -678, 595, + -288, -431, 91, -28, 80, -28, 115, 172, 2, -11, -347, -29, -33, 409, -75, 11, 150, -72, -50, -166, 349, -262, 252, -62, -209, 39, -234, -119, -380, 67, 174, -103, -190, -150, 230, -356, -84, -176, -5, -51, 46, -309, 301, -422, -288, 114, 51, -16, 113, -219, -315, 39, -86, -15, 154, -188, 140, 97, 347, -96, 50, -27, 5, 481, 40, 476, -115, -179, 54, -245, -22, 243, 20, -285, -250, 70, -27, 1, 245, 19, -46, 101, -14, -10, -114, 42, 53, -58, -2, -29, 94, -43, -19, 48, 12, 29, + -9, 54, -18, 0, 29, -60, 74, -48, 27, 62, 34, 59, 16, -522, -67, -105, -424, -730, 227, 381, -267, -128, 216, -78, 457, -50, -242, -144, -680, 232, 78, -61, -477, 114, -265, -69, -232, -118, 342, -325, 142, -482, 311, 63, 8, -138, 38, -62, -269, -508, 100, 2, 111, 215, -122, -39, -326, -167, -86, 140, 95, 243, 387, 303, 157, 232, 72, 241, 217, -209, 249, 281, -56, 375, -37, 440, -192, -470, -75, 302, 333, 382, -72, -656, -64, -33, 27, -21, -160, 96, -478, 375, 237, 228, -249, -236, + -51, 141, -15, -264, 4, -128, -214, -85, -34, -102, 12, -86, 46, -53, -28, 71, 15, 33, -33, -93, -103, 75, -82, -1, -29, 47, -32, -20, -32, 112, 60, 35, -32, 700, -154, -168, 233, 377, -27, 175, 437, 315, -717, -659, 5, -64, 97, -295, -523, 124, 419, 277, -303, 493, 399, 374, -628, 178, 330, 17, 50, 280, 647, -126, -296, 196, 147, -89, 350, 522, 98, 541, 237, -407, 46, 448, -48, -185, 233, 37, 89, 470, 303, 160, 56, -547, -557, -47, 89, 145, -171, -25, -143, 48, 70, -209, + 80, -129, -32, -178, 21, 347, -205, -504, -78, -428, 95, -153, -10, -58, 203, -76, 147, -3, 126, 58, -57, -69, -86, -249, 91, 32, 63, 8, -191, 96, -149, -127, -43, -163, -33, -54, -59, -52, 107, -47, 71, -7, 58, 10, 137, -59, 38, -110, -27, -95, -85, -18, -62, 209, 90, 8, -28, -30, -1164, -725, -216, 217, -67, -287, 57, -280, 823, -327, 530, 813, 443, 403, -312, 291, -152, -371, 331, 385, 257, 548, 7, -24, -236, -243, -207, -335, -327, -223, 131, 49, 1, -210, -112, -326, 141, -281, + -254, -112, 142, 1, -170, -476, 61, -139, 177, -562, -433, 497, -72, -93, -225, -138, 375, 122, -73, 205, -52, 214, 172, 244, -169, -283, -714, 52, -692, -45, -585, -83, 561, -69, 102, -396, -168, -203, 48, -254, -145, 252, 315, -31, -28, 37, -139, 54, -13, -138, -54, -118, -44, -67, -319, 58, -51, -41, 23, -87, -101, -221, -49, -127, -150, -28, -190, -89, 35, -120, -137, 19, -114, 40, 49, 140, -81, 98, 50, -126, -44, -29, -55, 27, -24, -36, 805, 16, -583, -494, 505, 396, -373, -360, 677, 431, + 25, -402, 49, -169, 321, -249, 38, -105, -74, 701, -99, -190, 130, 120, 209, 217, 24, -276, 209, 106, 239, 542, 248, -779, -224, -127, -598, 232, -104, 13, -333, 282, -130, 55, -433, 294, -353, 30, 347, -55, 366, -285, 456, -585, 292, 8, -212, 768, 203, -158, -458, 200, -95, 64, -71, 282, 417, 565, -358, 255, -143, 505, 183, 74, -48, 304, 52, -199, 243, -173, -297, -126, -404, 7, -452, -36, -305, 348, -112, 225, -245, 11, -139, 212, -70, -18, -137, 73, -104, -160, -97, 73, -160, 98, -128, 61, + -84, -76, -84, -171, -105, 7, -130, -112, 156, 141, 71, -78, -208, -19, 84, -5, -162, -91, -16, -1170, -758, 632, -462, -433, 244, 553, -909, -150, 218, 60, -474, -711, 1338, -575, 183, -654, 363, -227, 627, 557, 58, 100, -741, 0, 353, -300, -441, 353, 101, 381, 303, -62, 128, -82, -46, 561, -474, -278, 451, -17, -358, 477, -13, -103, -319, -140, 177, -249, -27, 169, -317, -325, -211, 243, -690, 332, -30, 660, -616, 208, -468, 176, -280, -358, 595, -326, -142, -317, 259, -363, 218, -122, 436, 447, -54, -692, + 279, 291, -31, -20, -394, -272, -63, -339, -272, -95, -6, -168, -223, 260, 89, -159, -132, -163, -172, 190, 72, 47, -259, -98, 228, -129, -158, 108, -112, 3, 85, 133, -51, -215, 46, 131, -287, 9, 78, 9, -150, -85, 10, -67, 591, 288, -661, 228, 716, -61, 4, 332, -212, 503, 455, -596, -365, -108, 318, 574, 103, 306, 646, 485, -677, -70, 1079, 269, -70, -125, -202, -314, 96, 267, 296, 277, -192, -457, 125, -236, 254, 747, -197, -744, 895, -266, -492, 728, -130, -213, -774, -136, 321, 157, -168, -324, + 300, 36, -358, 312, -71, 711, -520, 78, -101, 814, 277, -1146, 361, -477, -201, -407, 498, 1651, 602, 100, 382, 484, -607, -253, -170, -342, -209, -379, 363, -841, -224, 82, 101, -272, 53, 154, -82, -102, 288, 58, 192, 165, -173, 55, 143, 60, 119, -81, 73, -158, 22, -43, -157, -76, -35, 264, 15, 74, 11, -47, -53, 29, -23, -232, -29, 46, -56, -177, -429, -148, -130, 261, -44, 48, -252, -873, -372, 59, -355, -1098, 951, -184, 428, 80, -504, -866, -835, 935, 569, 214, -331, -627, -470, -744, -192, 276, + -117, 60, 117, -123, -386, -371, -633, -228, -123, 310, 216, 341, -171, -284, -120, 445, 62, 394, -1322, -312, -3, 289, -423, -20, -489, 381, 335, 63, 1630, 25, 509, 670, 28, 216, 9, -119, -197, 337, 495, 648, -16, -124, 43, 425, 386, 13, 313, 270, 210, -88, 637, -186, 818, -811, -407, -998, -312, 177, 22, -260, 52, -5, 444, -92, 533, -246, -201, -271, 136, 299, -51, -148, -165, 184, 0, 621, -102, -45, 109, 173, 254, -217, -22, 82, 124, -299, 100, 112, 379, -380, 211, 143, -165, 323, -187, -224, + -3, -77, 162, 82, -138, -6, 132, 30, 328, -17, 213, 610, -123, 18, 154, -856, 27, 113, 524, 805, -701, 145, -446, 571, 517, 58, 1000, 306, 393, -377, -68, -653, 1000, -595, 149, 609, -156, -405, 303, -99, 149, 654, 8, -218, -70, 116, -30, -401, 282, -46, -121, 1123, -878, 810, 519, 1013, 407, -730, 550, 3, 510, 1337, -979, -410, -134, 18, 905, -550, 38, -590, 37, 1023, -125, 1062, 292, 175, 477, -661, -117, 463, 657, -1089, -48, -934, 406, -489, -25, 212, 293, 16, -339, -270, -1023, -123, -729, 577, + 41, -53, 445, 18, -12, 430, 317, 213, -4, -154, 197, -349, -35, -242, 225, 237, -216, -47, -449, 188, -37, -7, -22, -434, -524, -177, 157, 384, 189, 170, -72, 321, 217, -21, -176, 278, -415, -120, 74, 452, 369, 76, -180, -651, 188, -1142, -1006, 19, 18, -638, 525, 154, -171, -592, 814, -185, 1210, -173, 264, 438, -583, -193, 187, -697, -390, -609, 529, -487, -130, -158, 458, -411, -695, -971, -26, 812, 51, -444, -187, -563, -187, 7, 340, -635, -69, -137, -451, -624, 32, 106, 407, 140, 697, 194, 879, -365, + 726, -184, -563, -147, 1180, -508, 539, -372, 867, -456, 294, 549, -30, -226, 107, -312, 788, -720, -269, 785, -94, -654, 34, 600, 336, 600, -603, -514, -324, -66, 594, 715, -1263, 67, 369, -695, 118, 439, 345, 322, 318, 210, -94, 23, 244, 269, 223, 540, -161, 284, 124, 585, 352, -452, -568, 181, 619, -176, -166, -392, -664, 76, -566, -180, 135, -380, 358, 100, -114, -314, -56, -326, -22, 179, 90, 50, -52, -81, -1103, 1183, -412, 1006, -226, 805, 55, -269, -573, -409, -87, -1, 588, -242, -59, 160, -560, 871, + 317, 20, -740, 486, 250, -593, 555, 37, -102, 131, -30, 734, -183, -950, 1001, -535, -95, 741, -345, -177, -463, 1177, -545, -159, -756, -157, 78, 1051, -510, 188, 326, 620, -179, -687, 722, 434, 584, -303, -156, 63, 648, -379, -788, -877, 448, -618, 142, 634, 587, -435, -158, 858, -1401, -45, 179, 468, -77, -519, -114, 782, -167, 1618, 625, -478, -76, 36, -209, -602, -736, -541, 440, -355, -154, -26, 698, 296, -260, 302, 216, -21, 91, 120, -22, 87, 714, 588, 566, 383, 42, -370, 180, -291, 335, -442, 454, 673, + 213, 855, 920, 368, -23, 480, 155, -100, -312, 499, -147, -418, -20, 237, -131, 205, 386, 142, -519, 405, -243, -275, -1547, 512, 287, 1359, 1188, -188, -455, -1421, 30, 462, -616, 452, 814, 794, -385, 958, 853, 33, -534, -568, 871, 747, -1086, -1471, 1932, 93, -150, 248, 131, 715, 704, -295, -259, 1007, 469, -187, -687, 403, 68, 49, 348, 46, -45, -409, 213, -125, -509, 906, -1462, 1007, 824, -1375, -109, 696, 162, 795, -201, 110, 717, -99, 359, -679, -1086, 3015, -1249, -1737, -394, 3358, 1436, -1433, -339, 592, 395, -32, + -880, 1262, 691, 529, 109, -1706, -296, 277, 492, -700, -1175, 103, 350, 161, -563, -578, 262, 157, 404, -77, -157, -41, 432, 572, 377, -857, -349, 608, 430, -430, -15, 496, 860, 345, -480, -624, -836, 390, -280, 363, -710, 393, 184, 442, -335, -163, -574, -232, 531, 105, -474, 257, 811, 56, -72, 251, -131, 224, -596, -375, 759, 1312, 95, 2177, -960, -366, 1264, 67, -68, -644, -1292, 1081, -671, -730, 562, -810, 408, -768, -853, -139, 191, 127, -198, 1035, 262, 633, 305, 23, 20, -459, -985, 322, 989, -799, 692, -815, + -82, -39, -1267, 910, -437, 359, 28, -367, 24, -912, 946, -658, 318, -1062, -647, -1395, 532, -649, -735, -589, -305, 8, 1494, 541, 740, -197, -697, -876, 235, 62, -1520, -701, -2674, -1252, -1034, -148, -1232, -1008, -223, 987, 1116, -901, -1148, -1313, 665, 1587, 80, 1278, 32, 775, 307, 101, 369, 144, -32, -450, 654, 550, 290, -539, -219, -65, 279, 304, -111, 329, -144, -359, -645, 89, 890, 331, -109, 261, -292, 488, -179, 635, 602, 81, -658, 117, 140, 719, 167, 816, -546, -323, 738, 781, 199, -192, -148, -753, 549, -350, + -1521, 369, 549, -1316, 743, 155, -375, 88, -365, -28, 294, 395, 687, -789, 87, 929, -93, -430, 837, -355, 67, -482, -189, -970, 265, 32, 562, -378, 51, 696, -316, 19, 719, -1384, 100, -1586, -497, -1060, 862, 310, -53, 366, -303, 398, 1093, 299, 1692, -930, -1065, 999, 280, -720, -673, -271, 631, -589, -13, -509, -657, 399, 500, -987, -568, 862, -5, 309, -175, 475, 218, 870, -492, -366, 229, 206, -239, -895, -649, -707, 965, -437, -729, 221, -183, -237, -477, 190, 229, -75, -135, -259, -439, -73, -91, -321, 22, -154, + -298, 193, -171, 178, -169, -147, 461, -173, 223, 163, -419, 197, 67, -168, -510, 713, 475, -196, 120, -343, -255, 221, 4, -442, 166, -174, 416, -104, -66, 83, 199, 256, -1035, -2093, -1047, -399, 914, 1192, -2285, 393, -908, -1238, -255, 1430, 913, 779, -494, -551, -660, 721, 508, 1113, 144, -1446, -567, 1087, -168, 319, 972, -466, -675, -1058, -1060, 7, 689, 1490, 1102, 732, 298, -1524, -1626, 568, -1122, 265, 1429, 569, 95, -722, -1297, -222, -560, 435, 336, 243, 895, -139, -176, 236, 649, 1056, 1091, 371, 972, 328, 348, -214, + -1093, -428, -476, -894, 671, 630, 465, 466, -210, -1073, 175, 321, -20, 715, 457, 375, -88, 50, 102, 737, 738, 564, 160, -135, -547, -100, 314, 93, -164, -2, -436, -200, -253, -283, 221, 805, 392, -146, -85, -600, -66, 212, 402, 452, -146, -191, -940, -539, -140, 8, 372, 315, -189, -224, 147, 62, 92, 233, -266, -91, -57, 156, 244, 27, -93, -67, -397, -178, 648, -1840, -3704, -1912, 359, 1447, 3526, 3449, 1437, 1468, 1054, 58, -1755, -2975, -4482, -1338, -1875, -326, 1830, 3261, 2742, 2422, 1335, -29, -853, -1145, -244, -1983, + -1574, -1496, -980, -804, -373, -70, 684, 1609, 1657, 1628, 1193, 1551, 824, 887, -289, -64, -731, -1921, -2782, -3362, -1628, -655, 525, -86, 357, 783, 1024, 2182, 2517, 3334, 2128, 216, 973, -503, -1839, -1610, -3204, -3739, -2794, -1728, -741, -585, 1348, 1521, 4219, 3455, 2529, 2475, 1187, -151, -1674, -2422, -1767, -2121, -2911, -1383, 82, -284, 85, 1274, 1777, 1312, 686, 663, 1133, 483, -82, -135, -552, -93, -493, -1305, -688, -973, -1579, -278, -272, 1264, 1154, 693, 1241, 2145, 1537, -376, -256, -1034, -918, -2159, -2237, -1083, -455, 186, 762, 899, 1343, 1527, + 1479, 1551, 398, -158, -823, -1009, -1329, -1475, -1477, -638, 334, 442, 644, 670, 468, 496, 522, 165, 123, -177, -183, 312, -210, -516, 29, 110, -66, -162, -221, 0, -64, -363, -163, 104, 23, 21, 210, 265, 196, 180, 166, 62, -26, -20, -35, -112, -122, -131, -122, -92, -45, -58, -22, 17, 52, 109, 84, 16, 20, 42, -7, -86, -94, -53, 8, 47, 90, 137, 130, 108, 84, 17, -55, -116, -165, -193, -214, -209, -135, -31, 67, 160, 227, 250, 256, 207, 106, 5, -97, -165, -205, -213, -159, -96, -40, 26, + 67, 78, 70, 59, 47, 34, 24, 9, 3, 3, 1, -6, -8, -9, -8, -8, -7, -6, -6, -6 } + }, + { + {-139, -216, -157, 61, -24, -370, -210, -16, 53, -114, 39, -137, 27, -99, 260, -212, -93, -93, 166, 114, 265, 70, 56, -121, 125, 16, 34, -15, 101, 137, 11, 137, 131, -63, 73, -77, -86, 10, -70, 44, -110, -200, 55, 71, -49, 56, -95, 90, 123, -211, 42, -12, 80, 68, 12, -209, -62, -92, 70, -3, 22, -67, 39, -107, 6, 116, 75, 7, -59, 38, -170, -96, -124, 22, 22, -11, 181, 0, 158, 2, 18, 14, 0, -86, 65, -6, 33, -19, 21, 29, -10, -30, -10, -10, -8, -6, + -45, 7, 48, 26, 2, 4, -12, -22, 21, -14, -428, -14, 22, 5, 70, -152, 110, 62, -80, -255, 167, 171, -41, 142, 102, -142, 280, 58, -128, 150, 10, 140, 20, -245, 92, -47, -91, -96, -75, 159, 123, 9, 129, 46, -124, -153, -15, -36, 64, 44, -120, 28, 61, 58, -106, -89, -140, -50, -36, 27, -35, 186, 79, -30, -96, 34, 77, 40, 200, -34, 100, -13, -67, -123, 85, -28, -58, 117, -37, 39, -27, -25, -137, 29, -40, 159, 197, -120, -122, -86, 32, -77, -40, -50, -50, -54, + 30, 73, -6, 18, 21, -8, 1, -35, -80, -126, -290, -173, -63, 209, 27, 39, 128, 35, 55, -304, -279, -178, -47, -1, 129, -91, 101, -52, -188, 59, -27, -128, -2, 181, 262, 120, -120, 71, 8, 190, -1, -150, -5, -87, 186, 82, 87, 189, -33, 14, 253, 221, -8, 0, 17, -13, 67, 19, -184, -244, -86, -30, 1, -80, -272, -28, 76, -148, -72, -96, -82, 30, 35, 91, -190, -151, 147, -61, -33, 31, -11, 96, -183, 73, 68, -72, -70, 74, -80, 117, -46, 2, 0, -45, 23, 87, + 48, 10, 52, 15, -24, -46, -26, -26, 11, 14, -8, -6, 13, -4, 391, -147, -116, -16, 9, -143, 4, -99, 189, -43, -229, -320, -80, -211, 300, 27, 213, 180, -280, -13, 121, 88, 152, 30, -16, -23, 73, -91, 110, 62, -98, 65, 7, 75, 164, -85, 66, -8, 95, 82, -31, 112, -29, 98, -71, 90, -226, -94, -81, 67, 200, -142, -94, -51, 14, -63, -86, -43, 82, 68, 116, -35, 67, -64, -69, -4, -41, 82, 1, -116, 69, -67, -116, -41, -71, 55, -84, -230, -31, -97, -97, 54, + -62, -137, -27, 33, -8, 12, 0, -85, 5, 50, -31, -33, 11, 2, 19, 18, 47, 17, -38, 30, -5, -11, -14, -36, -35, -37, 70, 106, -36, 158, -238, 112, -141, -156, 238, 91, -272, 33, 6, 87, -195, -123, -14, -157, -290, -280, -184, -280, 126, -25, 47, 158, -245, 169, -67, 81, 54, -21, 30, -32, -32, -158, -94, 217, -75, -172, -159, -11, -69, 71, -152, -236, 40, 228, -30, 140, -74, 78, -117, 96, 41, -160, 245, 48, -47, 61, 226, 209, 111, -17, -244, -37, -203, 64, -42, 39, + 39, 62, -185, 3, -11, 95, 195, -236, 35, -66, -222, -21, 69, -18, -3, -17, 77, 19, -63, -40, -45, -24, -75, 7, -4, 48, -91, -61, -5, -8, -9, 9, -5, 20, -32, -30, -7, -1, -23, -1, -4, 47, 41, 4, 3, -38, -68, -20, 6, -59, -36, -25, -21, -21, -270, -259, -167, -286, -339, -323, 144, 157, -206, -51, -186, -307, 172, -77, -266, 98, -14, 19, 32, 97, 35, -5, 74, 98, -151, -145, -36, -177, -9, -189, -332, -22, 208, -239, -182, 137, -124, 20, 56, -121, -97, -102, + -358, -152, 82, -99, -116, -224, 106, 208, -70, 319, -170, -78, 2, -71, -262, -14, 65, -4, -52, -227, -35, 233, 119, 72, 122, 89, -57, 441, -134, -165, -158, -189, 80, 253, 173, 24, -37, -121, -42, 1, -56, 15, -76, 35, 185, 122, -86, -14, -30, 70, -35, 76, -73, -33, 14, 19, -16, 29, -41, 52, 4, 42, 33, 27, -19, -30, -7, -30, -39, 485, 329, -19, 300, -29, 41, 54, -170, 273, 0, 241, 231, -194, 301, 1, -235, -387, 346, 165, 344, -295, 196, 104, -324, -321, -191, -94, + 332, -323, 279, -32, -35, 199, 189, 257, 93, -148, 124, 241, -152, 241, 370, 154, 223, 89, 61, 59, 6, -209, 72, 15, 12, 166, -124, 97, 111, -55, 323, -197, -119, -79, 279, -57, 230, 112, 154, 136, 25, -404, -64, -325, -176, 409, 214, -191, -14, -234, -207, -112, 342, 25, 116, 62, -56, 65, 121, 211, -63, 121, 89, 73, -76, -53, 32, -44, -4, 54, 78, 28, 33, 91, 93, 30, 1, 41, -22, 76, 123, 54, 2, 131, 14, -65, 56, -430, 271, 260, 770, 30, 66, -39, -106, -51, + 260, 237, 206, 299, 121, 473, 137, -188, 44, 412, 162, 42, 63, -212, -307, 196, -153, -299, -635, -10, 250, -19, 147, -219, -118, -82, 45, -69, -192, -92, -512, -133, -435, 37, -231, 174, -251, 95, -241, -82, -18, 8, 34, 49, -319, 153, -51, 71, -169, 5, 249, 102, 345, 196, -110, -20, -76, -35, -86, -110, -9, 144, 89, 108, 64, -498, 325, 324, -125, 186, 141, -262, 123, 81, 13, -54, 42, 172, -154, 101, -47, 10, -16, 39, 87, -74, -38, 129, -94, 8, 0, 50, -63, -104, 60, 6, + -37, -29, 12, -1, 56, 73, 74, 4, -88, 19, 828, 297, -141, 408, -272, 284, 188, -393, 81, -494, 8, -170, -349, 183, 4, 140, 201, 250, 402, 167, -31, -107, -278, -498, 174, 192, 52, -175, 266, 33, 281, 166, -520, -199, 68, -383, 18, -29, -74, 110, 82, -92, 379, -222, 13, 212, -190, 145, -84, -233, 153, -4, -32, 218, 143, 6, -116, 453, 18, 254, 24, -144, -160, -383, -149, 157, -12, 134, -45, -299, 117, 96, -437, 125, 223, -118, 238, 55, -249, -253, 284, -7, -574, 70, 60, 23, + -60, 33, -80, 13, 169, -53, 26, 42, 49, -145, 42, -52, 38, 105, 111, 80, 38, -96, 42, -9, -10, 37, -107, -2, 71, 98, -67, -41, -125, 21, 129, -128, 51, 45, -865, -289, 900, 248, 142, -138, -26, -141, 182, -294, 393, 224, 183, 188, -142, -16, -18, 125, 264, -401, -239, -130, 302, 108, 168, 180, -43, -288, 92, 20, 549, 432, 112, 327, 16, -161, 67, -48, -77, 210, 259, 213, 532, 255, 208, 232, -243, -398, -187, 178, -339, -169, 327, 348, 191, -161, 308, -124, 32, 72, 177, -93, + -195, 109, -176, -549, 22, 174, -299, 37, -55, -80, -56, -179, 443, -49, 253, -640, -608, -516, -235, 50, 61, -19, 34, -13, -137, 64, -150, -46, -66, 153, 24, 54, -121, -25, -107, -41, 84, 132, 143, 136, -3, -96, 75, 119, 75, 119, 42, -14, 51, 15, 24, -40, -84, 95, 109, -39, -32, -27, -19, 449, 703, -1025, -142, 66, -4, -119, -253, 286, -326, -519, -49, 516, -69, -295, 99, -414, -223, 21, 272, -434, 52, 483, 495, 17, 177, 433, -242, -379, -532, 56, -530, -110, 228, 216, -469, -441, + -267, 196, -122, -79, -121, 430, -629, -181, 102, -337, -114, 6, -396, 23, 168, -17, 527, -31, -209, 49, -23, -167, 104, 262, -235, 372, -178, -679, 35, -262, -143, -14, -70, -897, -148, 418, 360, 254, 541, 553, -739, -79, 51, 159, -213, -365, -4, 172, 201, 174, 135, 68, 109, -194, 4, 123, -60, -41, 25, 43, 110, -114, 25, -43, 53, 74, -156, 27, -13, -105, 49, -21, 24, 9, 0, -133, 73, 14, 39, -88, -66, -57, -58, -985, 275, -183, 335, -315, -4, 515, -173, 731, 168, 141, -315, 138, + 362, -223, -46, 473, 304, 356, 50, -547, 347, -353, -34, -213, 53, -272, 157, -70, 153, 147, 261, 266, 293, -348, 82, 558, 118, -99, -113, -279, -227, 0, 19, 101, 468, 42, 258, 252, -19, -118, -115, 427, -499, -107, -441, -361, -103, 5, -740, 194, -233, 454, -95, 22, 312, 66, 757, 628, 902, 344, 37, -103, -93, -150, -46, -179, -499, 339, 411, 199, -69, 48, -352, -474, 220, 61, 64, -151, -67, -164, -92, 149, 47, 194, -14, 45, -111, 136, -396, -102, -15, -14, -76, 72, 16, 28, -29, -94, + -21, -38, -28, 125, 13, 17, -83, 29, 18, -4, -178, -126, -138, -292, 386, -117, -88, 904, -190, -203, 1005, -17, 571, 421, 30, 235, -139, 183, 172, 108, 139, 463, -325, 559, -313, -12, 112, -79, -411, -367, -14, -594, -192, -648, -48, -386, -291, -213, -188, 94, -523, 600, 91, -394, -296, -21, -80, -98, 152, 80, 589, 65, -11, -305, 46, 120, -26, -325, -144, 369, 401, -27, -348, 138, -72, 526, 585, -233, -156, -111, 63, -229, 234, -735, -73, 864, -786, -388, -185, 54, 65, 101, -75, 230, -143, -42, + 418, -69, 302, -209, 304, -272, 207, 169, 415, -11, -75, 174, 271, 22, -70, -46, 24, -152, -50, 139, 182, 56, -64, 178, -145, 146, 120, 133, 70, 2, -224, 219, 127, 100, 44, 102, 189, 42, -156, 73, -128, -98, 156, -41, 135, 148, -63, -110, -110, 61, -529, -290, -83, 408, 492, 337, -314, -805, 1392, 349, -874, -878, -132, 211, 592, -764, -135, 141, -12, -111, 797, 170, -469, 249, 33, -24, 420, -78, 229, -521, -176, 913, 337, 719, 227, 650, 114, -241, 458, 416, 654, 321, -739, -282, 160, 381, + -297, 111, -286, -479, 48, -57, -286, 221, 310, 267, 197, 183, -141, 493, -4, -493, -356, 443, 242, -773, 336, 136, 249, -676, -460, 432, 671, 377, -150, -723, 164, -33, 616, -207, -826, 345, 483, -184, 503, 412, 171, -332, 44, -6, 98, 35, -21, -177, -72, -222, -21, -45, 117, -136, -79, -47, -99, -63, -52, -63, 258, 76, 5, 248, -60, -236, -156, -127, -99, 10, -169, 71, 107, 87, 68, -227, -85, 189, 159, -24, 123, -27, 325, 642, 243, 678, 107, 307, 227, 1134, 1547, 114, 303, -997, -322, 590, + -512, 1169, -242, 178, 309, 681, 375, -172, -507, -593, -201, -104, -741, -356, -299, 463, -280, 132, -478, 54, -192, -695, 706, 487, 567, 245, -358, -348, -806, 6, -728, -227, -69, 87, 361, 282, -241, -174, 298, 666, 174, 249, 485, -636, 437, -365, -337, -642, -285, 281, 237, 32, 733, -171, -282, 105, 186, 1009, -343, 399, 394, -987, -7, 113, -223, -153, 330, -203, 21, 405, 207, -611, -730, -707, -334, -269, 574, 498, -147, -231, 22, 55, 376, -53, -128, 229, -51, -49, -108, 163, 229, -135, 219, 204, 211, 29, + -100, 183, -140, 106, 239, 9, 140, 187, -341, -24, 156, 172, 238, 19, 212, 2, 7, -85, 119, 175, -652, 177, 985, -220, 153, -425, -114, -570, 472, -824, 50, -662, 144, 298, 116, -392, 1391, -87, -174, 135, -773, 55, -519, 28, 161, -149, -6, 335, -276, 22, 430, 44, 118, -666, 98, -47, -30, -162, -825, -457, 220, 78, 385, -962, 119, -894, 471, -607, -973, 508, 922, 166, 461, -672, 688, -158, 114, -409, 575, 235, 597, 192, 722, -632, 137, 44, -96, -500, -400, -469, 557, -136, 752, -450, -337, 91, + 113, -401, 228, -233, -944, 430, 652, 1064, 385, 757, -417, 9, -472, 810, 287, -146, -303, 389, -258, -70, 58, -235, -392, -265, -176, -155, -527, -230, -436, 357, -69, 215, 426, 115, -290, -23, -290, -126, -443, -248, -469, -79, 820, 170, -42, 186, 260, -456, -192, -21, -41, -186, 224, -85, -687, -55, -141, -510, -1608, 201, -512, 1495, -278, -750, 302, -40, -747, -125, 128, -448, 1129, 164, 111, 515, -631, -971, -598, 1378, -107, -288, 910, 516, -431, -427, -241, 1093, 155, -262, -424, -202, -849, 578, -97, 236, 549, -190, + -880, -104, 1138, -45, -282, 552, -248, 684, 448, -54, -839, -424, -114, -773, -455, -443, 62, -102, 657, -452, -158, 2, 1688, 592, -290, 347, 200, -93, 857, 423, -324, 141, 693, 790, -478, -334, -1146, -913, 524, -336, 565, -8, -674, 173, -54, 222, -449, -334, 634, 169, 84, -54, -75, 430, -203, 226, -108, 272, 532, 152, -386, 74, -149, 301, 239, 90, 346, 551, -213, 447, -43, -566, -151, 30, -325, 142, 419, 5, -215, 39, -80, 562, 469, 62, 221, 297, 146, 381, -472, -335, 166, 110, -102, -26, -77, -176, + -173, -1821, 625, -390, 969, 986, -571, 465, -975, -1464, 36, -1030, 135, -129, 797, -592, 568, 488, 799, -1217, 133, -745, -683, 74, -881, -568, 799, -233, 303, 934, -185, 308, -770, 89, -849, 787, -704, -467, -520, 877, 703, -504, 961, 637, -204, 954, -54, -1010, -280, -119, -787, 177, -1665, 167, -424, -799, -646, 744, -445, 1542, 1145, -1725, 0, -45, 81, 797, -1355, -945, 930, -777, -971, -1117, 74, 2293, 1138, -1068, -674, 92, 833, 318, -1118, 165, -748, -439, -42, -135, 41, 735, 172, 435, 287, -860, 228, 384, -124, -311, + 43, -734, 649, 235, 175, -974, 159, 499, 138, -232, -185, 429, -713, -48, -533, -295, 690, -737, -35, 435, -374, 340, 412, 106, 57, 303, 94, -394, 564, -443, -352, -203, -610, -193, -548, -525, 212, 860, -953, 480, -1601, -240, -623, -543, 849, -1094, -1707, 998, 1503, 365, -290, -1363, 93, 535, 535, -228, -546, 70, -135, -178, 174, -200, -458, -893, 114, -537, 134, -481, -1019, 634, 466, 780, 28, 843, 472, 128, -273, -429, -702, -499, -282, 201, 484, -323, -158, -1160, 1091, 1293, 719, -657, 690, -897, -13, 209, -1965, 163, + 197, 932, -1172, 1517, 597, -1082, -613, 459, -187, -792, -972, -1047, -1430, 1058, -448, 169, -2187, -868, 139, 27, 506, -346, 93, 377, 397, -1043, -236, 174, 585, 424, -86, -399, -167, -84, 546, 96, -334, -37, -259, -99, 506, 233, -243, 538, -527, -309, -392, 520, -200, 66, -232, 229, -735, 114, 316, 121, -124, -320, -272, -375, 382, 84, -118, -430, 456, 28, 40, 67, -748, -368, -487, 67, -243, 6, -9, -173, -418, -152, -1494, -197, 548, -701, -652, 621, 630, 130, -589, -2024, -295, 399, 245, 881, -16, 513, -129, -11, + -252, 40, 540, 64, 25, 523, -136, -124, -681, -62, -106, -76, 122, 417, 572, -111, 4, 446, -97, -858, -55, -762, 115, 104, -995, 725, -1373, 308, 383, -605, -38, 1785, -501, 602, -372, 318, -1333, 143, 788, -23, 681, -159, 75, -46, 869, -558, -662, 764, -702, -877, -6, -1399, 937, 771, -274, 296, 135, -12, -1183, -200, -85, 520, 203, -506, 478, -39, -599, -416, -370, 75, 89, -88, -7, 374, -368, -114, 269, -407, -209, 301, -403, 20, 372, 15, -94, 150, -6, 28, 326, -125, -87, -252, 116, -163, -136, 129, + 185, -352, 66, -330, 320, -375, 215, -15, -52, 24, -66, -55, -1, 237, -732, -2230, -1044, -342, 739, 1658, -1503, 339, -429, -1515, -205, 1378, 377, 1137, -944, 292, -321, 76, 674, 122, 370, -206, -1933, 585, 104, -814, 854, 656, -578, 607, 80, -622, 202, -381, 1223, 159, 500, 34, -1237, -987, -328, -729, 819, 1176, 1206, 975, -325, 145, -971, -137, -90, -401, -508, 94, 103, -1335, -386, -515, -29, 614, -654, -142, 241, 13, 701, -756, -23, -858, -449, -631, 362, 243, 700, -82, -64, -808, -238, -378, -95, 357, 482, 985, + -617, 189, -534, 206, 372, 113, -291, -111, -97, -111, -37, 268, 278, -66, -25, -119, -185, 136, 276, 102, 37, 84, -220, -253, -241, 420, -5, 294, 240, -28, -312, -331, 57, 107, -258, -73, -224, 182, -160, 70, 55, 190, -84, -93, 50, 76, -130, 217, -66, 583, -941, -3714, -1958, 402, 1563, 3497, 2672, 1505, 508, 785, -248, -1471, -2843, -3784, -956, -1097, 58, 1843, 2630, 1762, 2357, 542, 500, -276, -1190, -1350, -1090, -1160, -1432, -1151, -490, -75, -16, 918, 1194, 2279, 1079, 354, 938, 1454, 466, 276, -1172, -1609, -2625, -1216, + -1376, -999, -591, -468, 197, 322, 1107, 2260, 1822, 1984, 1473, 1799, 1343, -1086, -991, -2506, -1936, -1422, -3186, -2469, -1506, 117, 1936, 1839, 2180, 2719, 2331, 1251, 1514, 57, -588, -1600, -2315, -2332, -1918, -1158, -246, 328, 565, 642, 1080, 774, 1263, 793, 319, 202, -45, -128, -26, -875, -605, -127, -401, -1044, -289, -378, -383, -76, 781, 1466, 1223, 124, 1202, 840, -153, -991, -1558, -1457, -654, -724, -446, -255, 418, 906, 1267, 1431, 1038, 399, 447, -281, -781, -1329, -1181, -531, -49, -394, -123, 373, 488, 492, 479, 114, 202, 296, -49, -285, + 12, 89, -200, -238, -30, 78, 67, -156, -74, 51, 25, -137, -217, -175, 65, 11, -10, 129, 243, 180, 185, 126, 101, -14, -67, -116, -158, -138, -47, -111, -95, -82, 88, 101, -30, -48, 95, 54, -10, -16, -24, -68, 54, 73, 38, 65, 127, 129, 115, 9, -37, -75, -113, -216, -255, -217, -145, -115, -5, 115, 213, 264, 301, 261, 192, 83, -6, -115, -197, -241, -220, -227, -153, -73, -12, 56, 143, 151, 143, 127, 106, 50, 2, -33, -35, -43, -44, -46, -33, -25, -13, -7, -2, 0, 4, 6, + 7 }, + {-47, -67, -130, 76, 121, 215, 58, -151, -268, 58, -125, 11, 84, 33, 217, -180, -44, -25, -14, -154, 95, 40, 20, 4, -75, -58, -54, -18, 8, 36, -57, 83, 195, -6, 87, -138, -80, -165, -79, 175, 9, -36, 31, 186, 20, 93, -23, -87, -27, 106, -91, 166, 103, 188, 93, 12, -57, -125, -69, -109, -16, -79, 31, 7, -42, 27, -36, 67, -17, -19, 95, -10, -7, 12, -92, 42, -67, -109, -62, -48, 47, -9, -7, -123, -20, 32, 24, -49, 5, -49, 22, 34, 26, 9, -8, -20, + 6, -38, -20, 8, 6, 17, 17, 15, 4, 35, -374, -85, 154, 27, 210, 112, -172, 46, -4, 69, -62, -287, 166, 102, 190, 238, 205, 72, 3, -293, -30, 135, -133, -116, -306, -21, -51, -35, -78, 36, -183, 83, -32, 77, 23, -123, 95, 79, 212, -25, -170, -88, 92, 37, -42, 9, 68, 9, -124, -1, 26, -13, 8, -78, -34, -104, -21, 129, 46, -44, 55, -17, -7, 20, -149, -14, -7, 83, 162, -48, -16, -104, -81, 41, 184, -163, -25, 42, -9, -44, -3, -43, 60, 63, 33, 102, + -49, -31, -10, 24, -23, 4, 17, 14, -12, -44, 32, -44, 207, 77, 70, -70, 5, 19, 20, -356, -193, -16, -89, -110, -6, -93, -362, 215, 49, 97, -38, 74, -96, 4, 13, 186, -67, -40, -31, -32, -30, -14, 202, -39, -3, -115, -7, -56, 65, 33, -196, 151, -198, -4, 174, -25, 6, 13, -4, -122, -87, 199, 115, -248, -132, 39, -145, -106, 106, -178, 34, 43, 102, 212, 163, 99, 76, -145, -151, -130, 42, 185, 71, -32, -83, 60, -70, -31, 43, -69, -104, -14, 83, -16, -71, 9, + 0, 81, 34, 74, 17, -35, -36, -29, -15, -10, 24, 47, 56, 58, 272, -66, -69, -81, 77, -91, 133, -258, -33, 191, 100, -194, 144, 236, 222, 142, 27, -9, -145, -187, 80, -18, 188, -15, 112, -117, -78, -63, 19, 60, -11, -229, 48, 79, 58, 99, 61, -124, -306, -98, 45, 59, 14, -13, 58, -125, -2, -228, 107, -235, -62, -100, -155, 113, 50, 48, -135, -66, -40, -135, 13, -11, 72, -58, -114, -87, -271, 86, 31, 116, 172, 219, 86, -86, -129, -61, 119, 119, -134, 147, 6, -95, + 211, -41, 48, 36, 62, -4, -47, 14, 66, 24, -10, 71, -37, -29, -52, 24, 6, -26, 39, -38, -68, -29, 52, -12, -12, 19, 134, 123, -24, 87, -265, 29, -128, 12, 37, -167, 58, 482, 51, -45, -274, 387, -3, 162, 17, -10, -214, 204, 50, -115, 25, 14, -87, 81, 214, -65, 228, -70, 96, -5, 149, 133, 149, 0, -85, 117, -89, 103, -32, 103, 100, 96, -15, -32, 37, -87, -126, -316, 203, -205, 140, 16, 57, -38, -378, -83, -104, -184, 22, 112, -243, -78, 106, 18, 168, 296, + -11, -82, -74, -311, 92, 58, -72, 15, 120, 124, 34, 30, 86, 9, -16, 131, 76, -75, 133, 98, 131, 39, -25, 8, -11, -11, -52, 16, -32, 29, -40, 61, 20, 4, 49, 3, -18, 13, -14, -6, -20, 60, 35, 11, 42, -15, 68, 8, 20, -8, 17, -12, -43, 17, -136, -165, -15, 90, -52, -79, -120, 36, 221, 99, 35, -499, -228, -69, 103, -59, 170, 571, 178, -209, 34, -247, -79, 174, -196, -49, 255, 62, -63, 37, 145, -86, 71, 76, 76, -141, 66, -66, -80, -209, -80, -122, + -232, 102, 9, -15, 236, 172, 62, 189, 3, -239, 203, -23, -162, -129, -236, 11, 288, 20, -125, 122, -212, -133, 112, -172, -228, -121, -71, 129, -201, -63, -93, 261, 39, -91, 130, -79, -93, 15, 209, -39, 16, 114, 67, -264, -8, 161, 79, 93, -19, -52, 120, -71, 23, -59, 36, 44, 63, -135, 3, 13, 36, 7, 4, 62, -9, -13, -57, 45, 65, 175, 127, -323, 309, -115, 30, -141, 264, -36, -176, -578, -76, 301, 76, -450, 207, 1, -91, -144, -116, -44, -267, -44, 218, 283, 337, 205, + 308, -99, 243, 117, -475, -10, 125, 170, 84, -163, 11, -33, 169, -285, -101, 213, -69, 120, 64, -189, -210, -108, -315, -89, -96, 131, 48, -182, -41, -390, -97, 161, -113, -386, -4, 220, -468, 137, 79, 150, -221, -103, -210, 17, -62, -239, -62, -40, 145, 82, 352, 23, 5, 57, -25, -177, 223, 78, -90, 195, 36, -96, 33, -6, 119, 28, 24, 74, -62, 3, -67, 0, -53, 54, -21, 24, 67, 10, -41, 62, 16, 66, 19, -19, 25, 6, 89, -361, 79, 286, 369, 275, 281, 107, -197, 196, + 341, -509, 253, 253, -545, -144, 132, 584, -47, -39, -141, -166, 724, 358, 99, 89, 375, -9, -59, -142, 55, -328, -296, -69, 90, 216, 98, 48, -112, 19, -241, 98, -356, 346, -40, -175, -205, -235, -359, 60, -348, -119, 237, -57, -120, -116, -57, -298, -207, -136, -128, -70, 108, 59, 17, 14, -263, 449, 258, 4, -34, 591, -73, -105, -147, -303, -84, 196, 190, -32, 231, -464, 135, -178, 43, 175, -63, -7, 28, 13, 56, -75, 85, 108, -105, 40, 57, 69, 188, -145, -14, 17, -5, 41, 20, 43, + 58, -54, 37, -19, 4, -104, -23, -27, 85, -89, 671, 231, 144, 327, -363, -217, 212, 226, 499, 75, 141, -331, -16, 168, -435, -138, 179, -144, 9, 123, 327, -107, 130, 69, 75, 279, 244, 297, -229, -153, 323, -403, -131, -132, -24, -108, -255, 254, -6, -277, 17, -108, -288, -361, -198, -216, 432, -135, -106, -252, -18, -128, 70, 507, -91, -164, 89, -28, 295, -337, 576, 117, -548, -399, 149, -369, 9, -396, 5, 87, -47, 431, 541, -254, 69, -104, -395, -147, -213, -258, -56, 197, -132, -305, 206, 15, + -162, -139, 70, 115, -46, -31, -153, 10, -141, -28, -69, 102, 117, 29, -140, 17, 13, 94, 1, -34, 11, -178, -16, -100, -68, 15, 44, -93, 77, -54, -48, 123, -45, -118, -591, 215, 1205, -215, -20, -536, -229, 354, -58, 689, 411, 380, -3, 292, -574, 511, 262, 19, 61, -335, 137, -10, 521, 289, 345, -133, 28, 86, -360, -291, -136, 156, 609, -176, -214, -215, -124, 74, -397, -119, -32, -215, -420, -93, -532, -196, 302, -370, -166, -77, 23, -597, -363, -82, -68, -118, 367, 159, 18, 220, 378, -242, + -104, -328, 140, -259, 210, 243, 292, 537, 147, -413, -73, 904, 290, 506, 240, 150, -42, 57, -222, -280, 118, 86, -279, 68, 184, 168, -269, 200, 63, 143, 165, -6, 76, 138, 52, 163, -24, 31, -60, -118, 18, 142, 15, -69, 230, 146, 122, 0, -35, -44, -13, 3, -45, 78, 58, 61, 65, 32, -133, 624, 683, -692, 168, 506, 305, -194, -369, -319, 712, 58, 267, 374, -215, 105, 155, -437, -466, 377, 127, -676, -158, 878, 419, -2, -503, 164, 130, 534, 175, -260, 348, 62, -149, -51, -108, -416, + -199, 64, 70, -497, -539, -317, -156, -590, 349, -36, -422, 81, 8, -181, -53, 127, -6, 134, 152, 239, -236, -276, 363, 743, 333, 204, 539, -100, 292, 723, 438, 69, 78, -224, -445, 431, -424, 191, -172, 133, -554, 266, -10, -178, -107, 315, -300, -147, -80, 50, -11, 95, -121, -12, -216, -51, -16, 42, -68, 76, -84, 67, -75, 243, 71, -58, -116, 94, 6, 87, 71, -54, 63, 92, -64, 27, 104, -29, 34, 125, 122, 224, -140, -647, 183, -312, -143, -241, -40, 556, 551, -1111, 345, 354, -344, -565, + -736, 131, -215, 137, -256, -202, -119, 689, 176, -59, -11, -109, -204, 174, 116, -3, 277, 60, -57, 99, 252, 710, 73, 88, -350, -150, -165, -177, -20, -59, 237, 340, 18, 392, -90, -66, -79, -44, -687, 776, 22, 55, -56, -202, 208, -54, 317, 17, -300, 81, 336, -238, 312, 75, -473, -82, -100, -864, -293, 220, 225, -354, -201, 205, 31, 576, -458, 209, 260, -38, 228, 208, 258, 97, 116, 102, 87, -40, -45, -150, 62, 214, 41, -160, -59, -91, 54, -71, -56, -107, 143, 78, 98, 8, -248, 99, + -252, 18, 44, 88, -118, -61, -35, 81, 156, 67, 68, 19, 71, -174, 572, 169, 180, -409, 315, -160, 300, -226, 386, -341, -277, 528, 71, 139, -306, -691, -61, 209, 60, 304, -243, 44, 2, -515, -370, 177, -582, -380, 193, 8, -609, -83, -301, 397, 240, 76, -138, -379, -812, 294, -361, 453, -130, -144, -71, -212, 130, 122, -648, -283, 649, 568, -576, 760, 44, 561, -128, -128, -65, -214, 294, -211, -604, -319, 730, -157, -140, -36, 230, 149, 371, -828, 251, 571, 452, -178, -41, -175, -371, 47, 352, 541, + -324, -330, -372, -34, -56, 39, -175, 98, 101, -60, -20, -77, -159, 165, 10, 28, -244, -207, -50, -270, -100, -134, 37, -94, 7, 214, -79, 91, 4, -193, 45, -96, -19, 88, 192, 29, 85, 176, 179, 231, -65, -59, -34, 237, -29, -375, -14, -288, 391, 304, -295, -502, -421, -247, -489, -27, 231, 537, -93, -25, -898, 538, 670, -106, -364, -369, -229, 1009, -614, -1, -73, 273, -46, 1162, 28, -631, -167, -600, 783, 682, -551, 642, 160, 517, 192, -968, 303, 520, -672, -185, -763, -380, 26, -701, -600, -16, + -486, -6, 170, -173, -482, 396, 357, -791, -607, 332, 139, 214, 401, 526, -194, -284, -18, -184, -11, -58, -267, 107, -1101, 376, 534, -566, -469, 356, -360, -323, -156, 200, 27, 684, 4, 400, -41, -277, 147, 207, 212, -178, 3, 23, -27, -114, -274, 181, 285, -145, -481, 124, 39, 510, -51, -197, 155, 58, 252, 2, -157, 6, 205, 156, 49, -53, 37, -93, -82, -237, 117, 116, -166, 81, 69, 46, -30, -78, 18, -227, -172, 5, 243, 608, 1146, 1811, 50, -738, -949, -226, 33, -230, 877, 657, 453, 762, + 553, 446, 26, 359, -476, 659, 763, 48, 794, -333, 61, 181, -749, -505, -181, -447, -527, -82, 816, -15, -163, 98, 171, -115, -1117, -157, 287, -168, -345, 133, 426, 760, 185, 385, 537, 662, -924, -642, 358, -271, 1167, -125, 1003, -815, 476, 817, 28, 130, 489, -891, -416, 20, 503, 11, 580, 234, 216, 592, 211, -82, -254, -705, -166, 38, 183, 12, 13, 13, -386, 197, 131, 330, -117, 248, 406, 241, 101, -3, -51, 84, -144, 82, -138, 3, 82, 82, -122, 182, 175, 222, 23, 17, 91, -81, 150, -115, + 151, 352, -45, -69, 25, 306, -191, 72, -39, -46, -60, 42, 82, 138, 103, 105, 282, -200, 335, -164, -390, 113, 1301, 433, 457, 948, -69, 200, 413, 609, -677, -545, -230, -598, -104, -803, 413, 638, 469, 634, -427, -239, 493, 380, -267, 642, 389, -150, -786, 436, 482, -403, -58, 227, 116, -638, 735, 193, 789, 426, 311, -430, 369, -230, 1201, -947, 106, 359, -176, -613, 392, 379, -72, 372, -362, 974, -450, 254, 216, -624, -266, -860, 368, 247, -634, 591, 513, -445, 369, -51, 995, 320, -492, -368, -351, 308, + -203, 262, -123, 54, 336, 205, 170, -331, 856, 90, -327, -489, 416, 200, 393, -227, 118, 304, 647, 158, -102, 530, -141, -161, -72, 47, 148, -326, -277, 116, -239, -154, 34, -123, -30, -48, -234, 160, 99, -467, 114, -351, -211, -117, 173, 83, 321, 132, -6, 83, 120, 128, 16, 30, 76, 262, -84, -48, -1167, 501, -997, 1005, 1210, -79, 201, -1009, -21, -237, 89, 564, 580, -190, 295, 466, 65, 187, 128, 184, -137, 686, -109, 144, -401, 774, 161, -89, -36, 695, 262, 320, 775, -190, -494, 949, -1033, -457, + -186, 213, 670, 143, -287, -300, -502, -24, -98, 183, 1079, 1043, 664, 939, -93, 1421, -486, 387, -346, 21, 446, -234, 48, -443, -560, -3, -353, 281, -478, 696, -536, -871, -358, -233, -80, 1021, -626, -156, -90, -661, -165, 365, 811, -85, -36, 18, -267, -571, 22, -38, -85, -71, 0, -336, 260, -290, 321, -141, -244, -284, 68, 240, -178, -245, -79, 196, 236, -184, 113, 126, 87, 125, -130, -136, 69, -2, 152, -198, 134, 218, -5, -94, -115, 188, -411, -214, 418, -267, -22, -84, 87, -275, 193, -101, 377, 327, + 5, -407, 1787, 2481, 761, 1934, -424, -1345, -943, -659, 326, 355, -448, -723, 626, 842, 492, 840, 648, 160, 258, 127, -42, -553, 244, -655, 462, 4, -613, 710, 430, 340, 1228, 754, -352, -237, -441, -524, -641, -254, 26, -508, -157, 1060, 1609, 1184, 163, 808, 863, 1318, 605, -699, -1146, -716, -731, 433, 365, -1569, -1074, -277, 663, 1427, -1067, -43, -926, -121, 1169, -642, 442, -932, -150, -279, 789, -873, -495, 14, 350, -709, 1631, -383, -23, 926, -404, 696, -219, -575, -444, 271, 30, 231, 148, -513, 18, -216, 627, 365, + 114, 341, 393, 22, -1, -123, -384, 795, -241, 167, 11, -460, 23, 51, -140, -302, -61, -177, 49, 119, -130, 28, 548, 388, -64, -86, 520, -214, -59, -432, -618, -233, -158, -66, -168, -700, -1362, 169, 762, -629, 1180, -467, 471, -154, -1357, -694, -63, -798, -1833, -513, 665, 1021, -494, -784, -1636, -485, 486, -324, -472, -812, 196, -182, -135, -151, 334, 660, -509, 511, 437, -515, -1493, 125, 124, 389, 183, 981, 102, -1484, 13, -1635, -5, 571, 688, -124, 94, 764, -395, -287, -510, 495, 361, -233, 590, -180, 250, 276, + 964, 131, -338, -1026, -352, 537, 466, 820, 1193, 2063, 1028, 499, -534, -2066, -565, -296, 1584, -263, 100, -4, -497, 71, 466, 224, -9, 26, 10, 6, 769, -274, -227, -252, 534, 207, 271, -206, -653, 219, 278, -295, -43, 170, -37, 54, -115, -938, -308, -72, 433, 680, 81, -560, -549, 255, 92, -48, -92, 35, -58, -24, 503, -549, 71, -471, 503, -272, 11, -679, -107, 466, -143, 254, -393, 199, -207, 323, -315, 111, -1333, -406, 928, -457, -383, -99, -299, -1069, -1189, -1739, -549, 3, -134, 1138, 313, 1487, 918, 460, + -207, -550, -102, 2085, 130, 601, 339, -262, 1039, -434, 839, -916, -90, -661, 790, -1113, -234, 339, 351, 356, -971, 690, -1111, 225, -544, -374, 1108, 64, 74, 380, -419, -26, 290, -1351, 38, 310, -195, 868, -388, -172, 1464, -556, -1216, 1, -458, 96, -91, -66, -975, 520, -157, -1335, 804, -1653, 322, -381, -652, -1046, -133, 279, 482, 39, 390, 478, -568, 1002, -231, 265, -11, 476, -20, -58, -161, 279, -599, -82, 199, 125, -231, -9, -259, -353, 181, 137, 267, 164, -74, 198, 600, -302, -309, 98, -27, 110, 446, -71, + 244, 218, 232, -309, -358, -98, -26, -387, -19, -84, 163, -423, 127, -193, -556, -2015, -2071, -1765, -879, 3715, 1178, -440, -461, -1806, -3849, -415, 1060, 1318, 577, -575, -426, -1120, -1237, 965, -886, 2349, 1764, -2696, 896, 376, -552, 231, 1967, 299, 1362, 2689, -565, -2173, 119, -355, -2027, -538, 1003, -71, 1231, 1982, 191, -1683, -3316, -2841, -2542, -250, 2493, 725, 676, 392, -659, -3320, -2075, -1050, -393, 224, 769, 753, 956, 985, 1214, -1419, -504, -1158, -86, -1269, 815, 821, 1655, 1843, 885, 48, -472, -316, -2234, -1767, 1584, 2479, 1687, 1985, + -459, -855, -1765, -990, 538, 27, 134, 575, 198, 163, -418, -548, -270, -408, 28, 457, 135, 192, -87, 277, -458, 340, -128, -412, -416, -104, -701, -194, -424, 478, 523, 273, 210, -438, -941, -917, 263, -62, 441, 405, 214, -660, -337, -626, -997, 332, 620, 269, 33, 709, -261, -3707, -4151, -2822, -2901, -773, 3262, 2197, 3519, 3917, 5950, 3951, 4092, 2639, -197, -2937, -5075, -5999, -5203, -4108, -2967, -718, -146, -429, 157, 1292, 2134, 2952, 2573, 3498, 3386, 4367, 4001, 1122, 2688, -583, 740, 539, 158, -372, -3886, -4675, -5968, -7011, -6365, -3544, + -3141, -2592, -3236, -3757, -797, 916, 2365, 3451, 5008, 5970, 7676, 10116, 9834, 7459, 6063, 5035, 2674, 4227, -1707, -3456, -8250, -9462, -11749, -11301, -10322, -9795, -9448, -5829, -3599, -1969, 5290, 5374, 8234, 10557, 9169, 8267, 8379, 6568, 5024, 2747, 373, -49, -1540, -1894, -2726, -3554, -4859, -5273, -4783, -5534, -4260, -3930, -3691, -3261, -1667, -342, 1740, 3554, 3356, 5201, 5770, 6339, 7507, 6052, 3551, 1755, -1064, -2773, -2751, -5354, -4937, -6790, -5385, -5631, -3596, -3787, -2195, -298, 1917, 2847, 5058, 5857, 5712, 5520, 5406, 4128, 1491, -969, -1355, -1805, -1960, -2260, -2637, -2485, -1808, -2000, + -1774, -1578, -1100, -524, -324, -276, 92, 308, 238, 281, 805, 996, 1081, 973, 760, 774, 1210, 840, 704, 664, 628, 247, -37, -339, -238, -333, -403, -598, -460, -419, -482, -658, -484, -451, -510, -549, -290, -227, -111, -88, 34, 228, 424, 350, 331, 327, 405, 323, 228, 124, 189, 129, 104, 57, 33, -80, -28, 78, 121, 38, 24, -14, 36, -28, -151, -230, -193, -224, -221, -224, -175, -180, -137, -74, 2, 7, 39, 20, 48, 58, 90, 101, 131, 125, 134, 106, 93, 60, 44, 19, 8, -8, -11, -19, -20, -22, + -20 } + }, + { + {407, 46, -181, 61, -115, 29, -75, -48, -100, 69, 120, 34, 37, -223, 43, 3, 68, 84, 46, 127, -28, -72, 12, 152, 0, -118, -13, 129, 70, 13, 0, 36, -4, 9, 24, -5, -47, -6, 0, 50, -77, -180, 131, 132, 114, 108, -7, 58, 102, -109, -25, -3, -145, 32, 10, 130, 13, 73, 1, 164, 83, -24, 115, 70, -38, -135, 33, 35, -36, 10, -77, -20, 68, 48, 56, 135, -23, -43, 18, 80, 185, -110, 49, 50, 54, -6, -13, 57, -33, 1, 27, -35, -7, 5, 9, -23, + -35, 22, -9, 4, -13, 34, -5, 40, -10, 36, -2, 34, 345, -231, 78, 194, 45, 137, 166, -151, 31, -14, 64, -192, -152, -29, 149, 201, -78, -67, 96, -164, -219, -41, -258, 88, 85, 23, -160, -163, 58, -95, 22, -5, 170, 179, 162, -27, 113, -178, 77, -105, -10, 9, 138, -150, -133, 0, 182, 74, 71, -111, 62, 44, -54, -229, -37, -78, -100, -91, 104, -97, -31, 23, 65, 162, -63, -5, -123, -61, 26, -172, -11, 46, 117, -38, -89, -46, -178, 83, 52, 9, -14, -155, 63, 11, + -55, 55, -22, 12, 51, 4, 11, 58, 27, 11, 2, 46, 18, -10, 20, 26, 55, -118, -217, -51, 42, -64, -108, -58, -217, -120, 237, -6, -100, 127, -183, -39, -229, -45, -180, -92, 219, 15, -40, -239, -148, -51, -100, 45, -126, 16, 84, 262, 130, 100, 115, 212, -172, 2, -49, -131, 60, -24, -49, -138, 78, 153, 19, -104, -65, 385, 5, -106, -149, -224, -300, -34, -154, 40, -27, 89, 20, 45, -136, 25, 27, 188, 66, -134, 12, -39, -37, -29, 70, 103, 101, -86, -84, 59, 30, 40, + 44, -31, -131, -154, -15, 33, -34, 21, 5, -17, -29, -46, -15, -5, -26, -51, 9, 22, -26, 15, -22, 9, -29, -12, 10, 13, -36, 10, -11, -67, 11, -21, 44, -27, -17, -7, -534, 209, -97, 87, -222, -90, -174, -159, 9, -51, -110, 270, 68, -27, -167, -53, 74, -190, -102, -181, -102, 258, 23, 171, -19, -3, -46, 48, 45, -139, -1, 40, 75, 280, -149, -171, -36, 310, 95, 330, 27, 29, -61, 162, -31, 240, -27, -29, -46, -101, 100, 30, -89, 69, 88, 167, -100, -9, -33, 148, + -64, -26, -59, -39, 33, -49, 14, 25, -40, 36, -250, 23, 157, 56, 212, 17, 20, 51, 134, 219, -148, 21, -15, 52, -10, -6, 62, 142, 51, 70, 4, -25, -41, 19, 68, -25, 29, 33, 30, -1, 11, 61, -14, 16, -6, 70, 37, -22, -8, 75, 35, -22, 51, 31, -71, -111, -53, 1, -260, -41, 6, -128, -462, -110, -97, -200, -36, -49, 295, -98, 224, 107, 162, -296, -131, -299, -278, 3, 56, 179, -82, -129, -78, -201, 47, 97, 110, 69, -59, 80, -134, 18, -243, 92, -61, 37, + 57, 96, 101, -91, 6, 242, -125, 119, 124, -4, 75, 121, -46, 50, 118, 10, 206, -103, -139, -65, 69, 3, -268, -134, -298, -323, -53, 92, -264, 122, -41, -1, -89, 93, -156, -22, -53, -220, -195, -62, 119, 7, 103, -39, 67, 56, -122, 4, -22, 74, -81, -136, -44, 23, 2, -50, 26, -30, -11, 26, -6, 5, -1, -28, -5, -27, -19, -16, 1, 18, 3, 44, 17, -15, 153, -430, -18, 137, 88, -227, -25, -143, 40, 47, 34, -248, -334, -226, 42, -180, 203, 67, -321, 237, 207, 166, + 148, -158, 266, 73, 0, -99, 91, 161, -143, -209, 81, -77, -261, -32, -252, -89, 463, -119, -205, -253, 16, 46, 185, 77, -167, 157, -18, -129, -174, -182, 286, 131, 181, -131, -183, 88, 48, -186, -8, -113, 185, -31, 18, -221, 145, 125, -127, -78, -78, 259, 4, 42, -72, 179, -177, -299, -134, 31, -57, 170, -33, -14, -176, -88, 77, 15, -125, -77, 108, 63, -34, 10, 2, 5, -34, 52, 21, 78, 12, 18, 3, 37, -15, 51, -59, 68, -7, -34, -239, -17, 51, -65, -193, -282, -228, 216, + 19, 266, 319, 310, 41, 428, 97, -55, 194, 147, 394, 51, 224, -323, 514, 377, 178, -164, -132, 182, 37, 129, -84, 219, -74, -64, 195, 158, -213, 133, -62, 213, 231, -472, -93, 282, 80, 151, 116, 279, -144, 108, -2, -245, -124, -12, 43, -358, -37, 217, -183, 368, 273, -118, -10, 66, 133, 213, -91, -76, 347, -89, -14, 149, 0, 202, 158, 63, 107, 114, 107, 48, 41, -54, -89, -40, -82, -14, -59, 34, 28, -80, -66, -14, 50, 111, 90, 50, 4, 53, -107, -50, -60, 17, -46, 47, + -123, 8, -9, 95, 33, 0, 10, 99, 25, -94, 23, -13, 17, 83, -10, 23, -8, 903, -478, 63, 370, -39, 10, 491, 538, 61, -45, 111, -30, 119, 152, -201, -65, 317, 279, -135, -262, -278, -290, -157, 234, -186, 100, 10, -338, -25, -226, -29, 92, 144, -438, -206, -350, -110, 519, 73, -52, 44, -52, 23, 150, 88, 256, -16, 190, 114, -187, 113, -282, 6, -283, -292, 105, -321, 129, -6, 158, 127, 112, -172, 193, -291, -11, -135, -51, 362, 8, 180, 175, -38, -75, 139, -306, 119, 280, -427, + -319, -88, 210, -21, -268, 98, -44, 111, -103, 34, -61, 187, -41, 172, 89, 161, 49, 44, -91, 109, 42, -4, 58, 55, -38, 81, 57, -40, -50, -139, -36, -80, -10, -3, -54, 72, -32, 42, 8, 146, -122, 55, 17, 7, -18, -535, 107, 137, -359, 172, 4, 390, -95, -188, 168, -467, -157, 406, 182, -237, -579, 267, -75, 149, -367, -488, -329, 434, 41, 242, -35, -220, -330, 165, -83, -286, -336, 31, -299, -229, -122, -54, -325, 192, 228, 305, -137, 272, -208, 427, -72, -16, 327, 171, -73, -209, + -102, 316, 78, -224, 116, 335, 317, 140, -374, -413, -31, 88, 32, -296, 97, 340, 103, -136, -531, 150, -228, -518, 23, 35, -290, 433, -25, -169, -575, 3, -165, -20, 224, -124, -216, -8, 56, 59, -170, -172, -171, 72, -147, 17, -22, 32, -37, 50, 84, 76, 95, 51, 167, 211, 17, 67, 43, -72, -16, -58, 31, 30, 18, -191, 29, -10, -66, -2, -59, 67, -73, -76, -56, -664, 426, 330, 363, 56, 383, 44, -236, -274, 49, 308, -202, 76, -445, 315, 335, -160, -86, 82, 367, 268, -179, -160, + 253, -289, 110, -398, 7, -113, -533, -552, 116, 328, 158, -470, -249, 371, -396, -161, 333, -81, 414, -136, -274, 113, -402, 480, -41, 90, -212, -106, -10, -438, -262, 42, -63, 51, -134, -465, 99, -384, 184, -92, 292, -464, 222, 87, -123, 357, -34, -235, -451, -57, 113, -367, 287, -246, 190, -486, -491, 244, 202, -196, -147, 165, 120, -102, -78, -130, -163, -11, -269, -25, -29, 26, 89, -47, 90, -50, -6, -147, -64, -37, -8, 228, -55, -27, 140, -136, 108, 59, -43, -30, -129, -127, 6, -73, 31, 12, + -51, -89, 219, -213, 73, 260, 384, -102, 43, -136, -513, -110, -110, 223, -451, -1, -260, 280, -315, -430, 286, 131, 186, 592, -98, -170, 167, -379, -442, 36, 567, 172, 318, -226, -278, -450, 90, 575, -258, 301, 69, 447, -684, -218, -11, 80, 390, 188, -521, -141, -242, -21, -600, -94, -216, 41, -316, -21, 74, -877, 101, -275, 54, -347, -19, 215, 110, -118, -111, -462, 465, 446, 148, 111, -401, 612, 214, 315, -120, -964, 376, -33, 723, 679, 215, -87, 300, 16, 263, 14, 30, -171, 82, -156, -83, -44, + 316, -5, 20, 81, -20, -170, -87, 29, 128, -60, 64, -100, 134, -105, -160, -82, -23, 75, 30, -35, -27, -36, 209, -46, 13, 34, 104, 830, 293, 568, -551, 128, 579, -174, -209, 82, -358, 273, 69, -418, -548, -41, 465, -12, -37, 304, -454, -116, -374, 210, -637, 10, -136, 232, -665, -459, -291, 195, 214, 148, -216, 162, -161, 197, -132, -58, -46, -187, 127, 294, 175, 296, -24, -287, 41, -286, 762, -193, -750, -234, 205, 651, -652, -269, -43, 419, 27, -923, -113, 426, 879, 33, 612, 882, -66, 284, + 417, -115, 752, -101, 908, 145, -249, -787, -493, 6, 237, 113, -120, -153, -245, -334, -297, 361, 106, -4, -518, -58, 19, -94, -295, 77, 156, -45, -153, -111, -289, -174, -85, 182, -36, -157, 157, -226, 162, 164, -142, -273, 250, 371, 57, 11, 22, 216, -65, -259, 30, 251, 207, -257, -218, 40, 41, 4, 74, -40, 348, 421, -726, -706, 186, -166, 21, -282, 657, -297, -190, 228, 164, 5, -302, -221, -367, 147, -22, -178, -30, 437, 656, -712, -46, -695, -75, -180, 686, -291, -278, -135, 417, 138, 114, 174, + 166, -125, 7, -91, 111, -83, 643, -169, 170, 452, -237, -521, 115, 176, -184, -200, -44, 106, 325, -446, 596, 877, 589, -247, -356, -814, -1050, -387, -5, -191, -54, -120, 250, -23, -406, 212, -181, -39, 384, 641, -158, 180, -114, 34, 584, 294, 499, 508, -408, -126, -94, 14, -10, 180, 11, 110, 512, 20, 238, -110, -114, -211, -66, 29, 232, -66, -195, -92, 111, -82, -45, -61, 70, 18, -77, -42, 51, 25, 26, 295, -122, 6, 37, 3, -164, 74, 91, 188, -377, 703, 315, 399, 600, 929, -361, 479, + -962, -121, -433, -946, 379, 220, 284, 123, 371, 111, -681, 568, 1007, -154, -165, 244, 98, -214, -903, 71, 0, -85, 9, 303, -646, 136, 180, -136, -374, -184, -416, 418, -927, -137, -597, 327, 131, 331, -120, 88, -239, 562, 168, 461, -425, 453, -13, -450, 920, -156, 110, 620, -601, 695, 415, -551, 229, -213, 305, -762, 552, 75, 192, -75, 177, -619, 390, 696, -1392, 138, 1338, -869, -280, 91, 651, 460, 159, 401, -185, 241, -104, -300, 145, -70, -52, 248, 364, -35, -144, -126, 106, 230, -311, -120, -213, -136, + -278, 273, 364, -81, 167, -108, 67, 229, 261, -306, 25, 108, -160, 237, 11, -9, 217, 107, -263, -223, 74, 31, -80, 41, 563, -341, -410, -13, -392, -178, -1037, -886, -122, -508, -610, -440, 271, -157, -309, -496, 458, 31, -749, -118, -4, -357, -112, 304, 219, -53, 3, 14, -188, 160, 350, -131, -83, 537, -1008, -165, 284, 1075, -445, -279, -401, -546, 238, 1141, 212, 706, 146, -117, -59, -85, -550, 120, 125, -449, 100, 891, -144, -276, 150, -321, -73, 785, 1163, 313, 698, 806, -286, -338, 93, -268, 46, -799, + -7, -623, 190, 129, 379, -649, -241, -222, -253, -204, -226, 359, 78, 463, -117, 176, 465, -87, 17, -69, -184, -150, -24, -114, -169, -5, 71, -90, 32, 215, -217, -200, 16, 160, 85, -107, -321, -316, -37, 71, -190, -109, 69, -68, 35, 20, 222, 71, 57, -245, 269, -116, -259, 816, 923, -384, 2100, -300, 39, -400, 239, -175, 236, 532, 144, -515, -284, -538, -18, -368, -663, 78, 415, -82, 114, 192, 240, -14, -198, -257, 116, -12, -335, 118, 898, 631, 355, -779, 543, 422, -212, -245, -244, -318, -141, 239, + -566, 43, 61, 324, 856, 157, 170, 37, -112, -185, 366, -237, 864, 271, -93, 372, 64, -599, -432, 486, 564, 203, -152, 371, 401, 573, 1131, 112, -336, -596, -400, 286, 56, 86, -63, 391, 34, -59, -540, -272, 546, 612, -230, -432, -513, -156, 262, 161, 42, -180, 36, -10, -231, -7, -501, -138, -27, 345, -72, -117, -5, 278, -180, 197, -115, -241, 193, 275, 175, 192, -33, 206, 400, 169, 167, 108, -158, -77, 4, -45, 115, -124, 193, 249, 146, 10, -203, 69, 65, 201, 329, -341, 1495, -238, 50, 154, + -128, -34, 364, -293, -346, -187, 474, 424, -1180, 213, 186, 465, -312, -472, -452, 322, 288, -482, -271, -205, 771, 384, 207, -164, -827, 219, 191, 408, -114, 212, -239, 69, -720, 283, 276, 0, -188, -453, -892, 560, -383, 283, 287, 493, 57, -545, 878, 165, -884, -414, 508, 115, 669, 279, 100, -630, -320, 337, -1093, 1154, -843, 38, 685, -196, 1370, 199, 238, -510, 1599, 160, 1036, -720, -331, -232, 396, -51, -176, 723, -617, 697, -849, 173, 73, 146, -174, 614, -86, 310, 268, 406, 223, 115, 277, 316, 0, 113, + 24, -223, 265, 3, 178, 385, 184, 20, -32, 294, 309, 156, -195, 649, -42, -135, -140, 415, -331, 142, -83, 222, 1, 90, 110, -93, -85, 60, 111, 105, 117, 165, -174, 542, 1257, 426, 795, 1008, -29, 1154, -866, -303, -318, -279, 136, 199, -62, -377, -743, 738, 699, 303, 633, -1003, -864, 308, 434, -457, -645, 432, -194, -934, -334, -169, 482, -858, 495, 338, 395, -396, -10, -391, -162, -1147, -268, 572, -1821, -571, -56, -31, 78, -1094, -260, -1653, -124, 339, -459, -510, -200, 510, -154, -590, -669, -1725, -603, 821, + -752, -1158, 993, -298, -1297, 406, 1202, -625, -272, 152, -845, 1077, 490, 692, -342, -68, 368, 1025, 490, 168, -310, -63, 1171, 120, 196, -77, -664, -295, 559, -5, 51, -103, -591, -39, 280, -370, 465, -575, -356, 126, -187, 308, 140, -523, 235, 272, 161, 107, -197, 132, 13, -124, -357, 192, 171, -38, 302, -411, 66, -394, 30, 110, -122, -64, -1, 162, 42, -115, 26, 1429, 1979, -319, -69, -786, -791, -1358, 565, -238, 1977, -428, -866, -1204, 62, 363, -450, 366, 1290, -524, -239, -916, -420, 868, 1005, -1030, -297, 512, + -228, 220, -312, 1264, 1014, 2162, 700, 950, -435, 678, 1462, 465, -101, 331, -57, 946, 494, 1385, 386, -1421, 488, 532, 1154, -662, -560, 661, 723, -359, 1160, -420, 472, -1294, 806, -312, 439, 445, 1017, 875, -711, -747, -242, 1061, 1079, -420, -607, -1166, -136, 803, 918, 604, -274, -775, -727, -134, 499, -509, 697, 164, 486, 79, -253, 547, 347, -91, -239, 167, 469, -691, 272, 335, 457, 245, 648, -221, 227, -311, -449, 252, 545, 476, 733, -13, -12, 216, 193, 1308, 250, -60, -576, -1, 837, 423, 647, 374, -20, 8, + -147, -9, 806, 667, 68, 248, -84, -136, 28, 339, 257, 224, -176, -172, 194, -504, -1629, 96, 2454, 1460, -362, -3638, -536, -384, 265, -428, 50, 362, -157, 148, -807, 488, 586, 1104, -829, -1037, 1038, 1661, 402, -759, -1013, -227, 228, 80, 243, -7, 347, 136, 1072, -362, -1525, -663, 460, 165, -543, -669, 64, 697, 1234, 1144, -49, 9, 449, -456, -1322, 384, -835, 1547, 1681, -44, 456, 235, 314, -763, -136, 1615, -639, 7, -2233, -300, 221, 503, 452, 450, -575, -350, 969, 1456, -288, -69, 112, 583, 683, -337, 209, -800, + -971, 92, 226, 344, -147, -150, -210, -205, 609, -6, -154, -340, -61, 395, 325, -194, 456, 112, 712, 61, 96, 25, -300, -224, -170, -174, -90, -224, -197, 59, 582, 706, 168, 368, 95, 131, 565, -436, 418, 170, 712, -199, 151, 144, -356, 245, -195, 251, -136, 425, -199, -254, 155, 98, 47, 173, 48, 305, 0, 120, -5, 113, 42, 99, 130, 150, -44, 36, -25, 197, 69, 150, -32, 41, 25, 112, 5, 126, -49, 171, -188, -1627, -673, 1303, 1435, 1363, 1848, 318, -795, -2437, -1850, -348, 517, 1546, 1681, 796, + 38, -817, -708, -313, 525, 1443, 820, -189, 53, -117, -792, -1083, -887, 168, 1328, 999, 1997, 1300, 1286, 1811, -527, -1249, -1422, -1888, -2327, -877, -274, 692, 1281, 1851, 1729, 1406, 889, 1778, -348, -1123, -53, -285, 470, 539, 2121, 1854, -689, 333, -483, -1418, -419, 378, -854, 1320, -528, 439, 112, -149, 1140, 1586, 1263, 891, -659, -1602, -1825, 522, -770, 142, -89, 1031, 160, 584, -493, -1122, -1044, -1635, -1424, 607, 339, 827, 1239, 968, 35, -728, -1180, -1595, -877, -405, -591, 267, -216, -182, -192, -482, 2, -212, -326, -381, -249, -48, + 252, -462, -295, 95, 280, -118, 679, 67, -3647, -3839, -3993, -4093, -5407, -588, -1531, -372, 504, 2461, 2798, 2892, 4050, 5598, 5365, 5272, 4236, 3059, 2223, 667, -2556, -1228, -1511, -936, -3070, -511, -1271, -1401, -2540, -1953, -1986, -1800, -1879, -3303, -2924, -1727, -1560, -1961, -2715, -414, -2378, -4508, -3861, -3392, -1787, -2305, -412, -4666, -2065, -2068, -955, -698, -2402, 105, -2406, -292, 375, 1126, 101, 1157, 1730, 2719, 2900, 3988, 2607, 6259, 3956, 7285, 4954, 7258, 8420, 9997, 8213, 8267, 9319, 8360, 8492, 8263, 7166, 4144, 3313, 2336, 1705, 1993, 2978, 1639, -605, -1039, + -1196, -2057, -2666, -3253, -2994, -4923, -4766, -4912, -5947, -5240, -6606, -5852, -6863, -7052, -6641, -7330, -6626, -7402, -5873, -5758, -4770, -5094, -5248, -3693, -3304, -2528, -1287, 428, 1404, 1228, 1571, 1404, 1588, 1823, 2609, 3133, 2834, 2547, 3117, 2899, 3586, 3263, 2386, 2170, 1888, 1662, 1047, 793, 740, 463, 511, 201, 331, 289, 199, 290, 212, 125, 45, -116, -18, -5, -311, -498, -286, -251, -328, -322, -201, -240, -344, -460, -354, -232, -191, -123, -149, -113, -20, 95, 166, 152, 83, 70, 174, 262, 186, 181, 87, 40, 111, 93, 95, 74, 76, 31, + -57, 79, 196, 189, 227, 245, 356, 418, 424, 453, 480, 524, 568, 570, 534, 514, 566, 459, 398, 352, 303, 203, 164, 67, 47, -9, -107, -201, -292, -317, -402, -415, -406, -408, -452, -476, -441, -429, -391, -359, -331, -295, -229, -167, -126, -100, -71, -54, -40, -34, -26, -25, -23, -21 }, + {519, 68, -171, 80, 91, 31, -217, 98, 153, -166, -50, -203, -45, -86, -75, -30, 11, -7, 20, 72, -91, 40, -208, 71, 127, 27, -55, -169, 109, -74, 177, 151, -7, -71, 144, 169, 135, 137, 33, -106, 32, 130, -55, -111, 98, 156, -70, 81, -179, -15, -157, 106, -209, -57, -40, 71, 103, 73, -7, -111, 13, -153, -102, 28, -20, -93, 49, 51, 12, 96, -87, 41, -117, -46, -50, 63, -61, -123, -56, -46, 168, 145, 36, -77, 9, -9, 28, 58, 10, 3, 9, -3, 1, -22, 16, -65, + 2, -5, 26, 14, -21, -29, 5, 11, 11, -5, 1, -13, 297, -298, 12, 6, -75, -89, -95, 32, -168, -165, 24, 81, -5, 96, 75, -91, 38, -327, -79, -73, -75, -103, -113, -288, -224, 32, 69, -15, 157, 126, 54, -55, -30, 147, -56, 19, -20, -153, 52, -51, -104, -40, 127, 305, -115, 35, 75, -55, 97, 44, -105, 63, -250, -116, 4, 104, 161, -97, -44, -10, -363, 63, 189, 11, 28, 104, -58, 162, 218, -27, 63, 131, 125, 25, 8, -60, -86, -54, 40, -82, 182, 122, -3, -88, + -44, 105, 124, -61, 96, -57, 27, -58, -35, -40, 13, 3, 8, 9, -6, -19, -14, -78, -256, 60, 10, -247, 38, 139, 204, 53, -147, 346, -46, -68, 163, -100, -98, 17, -126, 154, 155, -62, -233, -115, 116, -150, 330, 284, -227, -278, 10, 52, -264, -17, 110, 74, -129, -75, 304, -32, 209, -21, -67, -70, -156, 27, -22, 164, -139, 38, -36, 30, -82, -11, 139, 110, -173, 270, 23, -1, -4, -25, 74, -37, -241, -34, -127, 210, 89, 5, 259, -143, 173, 170, 16, -126, -25, -27, -2, -36, + -51, 71, 76, -114, 56, -7, 81, 71, -23, 11, -35, -54, 39, -49, -41, 21, 55, -50, -36, -65, -27, 39, -24, -10, 2, 20, -35, -21, 51, 16, -10, -16, -55, -2, 29, 17, -615, 144, 35, 442, -22, 179, -234, 53, -175, -40, -85, -26, 83, -45, 77, 150, 115, 419, 290, -187, 98, -8, 79, 51, -51, -413, 107, -19, -2, 160, -23, -114, -78, -17, -127, -67, -329, -76, 11, -115, -19, 139, 199, -61, 245, -180, 42, 85, 34, -54, -126, 93, -30, 58, -93, -133, 27, 81, -134, 132, + -91, 312, 331, -98, 122, 128, -15, -41, -42, -400, 170, 165, 7, -65, -166, 20, -47, -203, -457, 32, -112, 120, 2, 0, -74, -50, -84, -6, 49, -58, 72, -72, -40, -29, -16, 40, 33, -23, 17, 13, 28, 43, 34, -19, -46, 37, -18, -34, 16, 14, -19, 28, 44, 16, -3, -133, -203, 200, 114, -19, 232, -126, 208, -236, -227, 109, -361, -129, 90, 218, 286, -51, 213, -9, 203, 74, 32, -35, 10, 202, -98, -23, 36, 16, -201, -26, -109, 413, -199, -202, -49, 194, 196, 167, 225, -40, + 41, -51, -113, 84, -11, -23, -129, 323, 200, -102, 61, 95, -172, 35, 126, -33, 243, -100, -32, -266, -100, -227, 10, 309, -123, 86, 53, 9, -85, -30, 2, -77, 149, -155, -73, -15, 327, 50, -2, 102, -89, -247, 61, 23, -39, 16, 60, -18, 12, 118, 22, -11, 28, 0, -16, -30, 111, -7, 9, -103, 61, 14, 61, -17, -42, -14, 31, 48, 33, -84, 4, 57, -18, -106, -70, -584, 419, 42, -217, -516, -54, 10, -306, -30, 139, 118, 9, -91, 110, 364, 370, -162, -178, -407, 78, -76, + 390, -163, -11, -95, 145, -47, -405, 129, -21, -241, -2, 35, -35, -43, -168, -233, 138, 32, 181, -162, 306, 143, -66, -276, -57, 96, 299, 90, -173, -81, 138, 87, -90, -46, 145, 118, 154, 295, 331, 160, 175, 202, -122, 27, -223, 217, 33, 108, -160, -248, 54, -316, -115, -140, 228, 238, 250, 63, -74, -83, 233, 45, -35, 56, -76, 147, 6, -6, 47, 58, -26, 120, -2, 17, -61, -39, 32, 93, -8, 31, 54, 28, 16, -33, 44, -42, -61, 49, -209, -12, 392, 241, 331, 63, -362, -119, + 385, -110, -243, -253, -249, -264, 146, 148, 95, 87, 90, 370, -45, 161, -317, -357, 240, -12, -194, 14, -497, -162, -167, 61, -17, -46, -350, -229, 40, 242, 394, -156, -153, 210, -269, -19, -13, 90, 173, 140, 273, -146, 396, 186, -426, 213, -236, -283, -235, -343, 311, 73, -364, 42, 78, 34, 59, -67, 258, -149, 199, -318, 242, -161, -146, 31, 108, -13, 175, 498, -41, -268, 159, 326, 27, -36, -258, -113, 242, -41, -15, 8, 50, -68, -37, -6, 72, -42, -7, -48, 137, -100, 22, -94, -115, 30, + 39, -37, 20, -35, -24, -8, -12, -4, -48, -30, 141, -8, 3, -14, 54, 30, 48, 805, -738, 332, 347, -335, -66, 479, 170, 302, 86, -113, 724, -36, -143, -7, -4, 344, 543, 202, -10, 5, 76, 183, -9, 94, -390, 176, 293, -69, 116, -6, 49, -254, -199, 8, -15, 333, 161, 134, -149, -182, -181, 189, 278, -4, -97, 548, 281, 364, -206, -420, -85, -439, -291, -137, -187, -31, 318, -109, 6, -271, -289, 316, -22, 144, 155, -175, 304, 74, 22, -114, -214, 237, -81, -438, 243, 204, 254, 111, + -310, -70, 22, -324, 175, 175, -36, 131, 109, 116, -36, 187, 23, -14, -105, 42, -8, 148, 27, -11, 25, -8, 107, -55, -20, -82, 32, -27, -65, 6, 9, -29, 11, 118, 88, -61, -42, -88, 14, -24, -17, 7, 9, 35, -61, -563, 74, 192, -274, 237, -477, 114, 151, -59, -187, -240, -281, -478, 66, 554, -177, 270, 151, 413, 221, -149, -347, 186, -85, -120, -360, -49, -45, -140, -152, -78, -252, -330, 395, -33, -224, 313, 112, -262, 44, -14, 178, -350, 104, 128, -522, 181, 175, -265, 81, 26, + -82, 200, 21, -31, 27, 138, 358, 289, 365, 256, 132, -87, 542, -131, -273, 604, 43, 368, 81, -109, -552, -506, -125, 39, -200, -91, -156, 360, -306, -83, -50, 93, -299, 225, -21, 76, -24, -109, -194, -124, -152, -118, -35, 28, -93, -60, -51, 137, -148, -124, -106, -119, -4, 112, -44, -42, 76, 27, -36, 59, -92, -94, 80, -111, -192, 77, 175, -83, 20, 126, -39, -87, -97, -942, 464, 816, 59, -459, 213, -83, -30, 136, 81, 212, -244, 31, 732, 562, 492, -533, -20, 133, 282, -255, -285, -71, + 95, 255, 129, -686, -778, 245, -23, 442, 454, -289, 376, 302, 402, -25, -234, -246, 194, -260, -97, 2, -8, 240, 510, 286, -135, -118, -247, -62, 26, 139, -50, -88, 253, 158, -379, -4, 20, 461, -227, -263, -497, -169, 90, 35, 263, -55, 69, -223, -329, -301, -301, -175, 150, -628, 80, -87, -94, -132, 129, 346, 256, 41, -51, -319, -97, -29, -60, 212, 113, 65, 52, 111, 134, -48, -48, 4, -52, 12, 20, 43, 77, -204, 38, -26, 161, 43, -199, -11, -124, -99, -45, -45, -48, -25, -20, 55, + -4, 112, 103, 86, 150, 472, 35, 409, -60, 532, 263, 414, 253, 118, -211, -25, -134, 283, 80, 248, -244, -46, 440, -552, -310, 423, -727, -322, 50, -142, -362, 724, -134, 499, 198, -442, -71, -169, -534, -692, 545, -9, -204, 132, 6, -95, 196, 75, -75, -257, 44, 515, 436, -367, 140, 25, 406, -191, 274, -594, -147, 399, 131, -139, 477, -157, 333, -659, -760, -276, 11, -539, 574, 404, 583, -273, -203, -207, 26, -302, -7, -459, -418, 15, 112, 418, 195, -48, -160, 129, 239, 156, 93, -154, 172, 154, + 194, 143, 103, 156, -223, 181, -137, -71, 284, 252, 167, -34, 6, -81, 144, 43, -65, 77, 146, 19, 112, 110, -155, 47, -119, -36, 31, 660, 475, 744, -658, -494, -1128, 488, -124, -964, -186, 93, 144, -359, 394, 334, 39, -3, 63, -158, -335, 76, -190, -313, -3, 734, 24, -109, -584, 249, 463, -237, -705, -126, 239, 87, -149, 156, 51, 256, -70, 421, 641, 245, -425, 485, 218, -543, -579, 633, 306, -243, -282, -11, -514, 379, 497, -9, 29, 128, -63, 546, 183, 144, -224, 91, 184, 673, -160, 260, + -519, -588, 528, -76, -49, 58, 503, 14, -23, 321, -151, 67, 292, 359, -170, -218, -477, -232, 156, -207, 166, -1, 177, -91, 130, 31, -73, 61, 267, 70, 266, 84, -168, 15, 111, 96, -165, -147, -160, -64, -126, -119, -196, -80, 109, 74, -20, -27, 60, -125, -3, 173, -47, -22, -81, -63, -35, -244, -35, -91, -99, -148, -214, -757, -55, -492, -1007, -1038, -444, -791, -354, -121, 151, 454, 506, 59, -262, 544, -265, 272, -994, -91, -680, -454, 473, 335, 326, 113, 678, -60, -34, -475, -160, -90, -321, -324, + -816, -316, -83, -125, -502, 458, 187, 276, -217, -79, -1242, -352, -337, 297, 648, -387, -53, -720, -45, 382, -112, -238, 171, 545, 924, 200, 37, -43, -238, -359, 253, -234, 839, 171, 365, 1703, -330, -281, -421, -587, -73, 587, 268, 90, 200, -237, -183, -510, -117, 299, -40, -107, -41, -113, 68, -11, 120, 122, 124, 161, 175, 440, 271, -152, 258, 1, 23, 188, -202, 12, -234, -138, -323, -237, -337, -278, -185, 385, -228, -125, -271, 25, 89, -52, 120, 54, -1, -226, -847, 483, 795, -468, 25, 180, -273, -64, + -593, -11, -332, 864, 0, -161, 692, -174, 201, -792, 412, 125, 537, -249, 399, 708, 758, 428, 683, 352, -109, 667, -322, -435, -141, 269, 449, -1078, -75, -696, 553, 254, -15, 194, 775, 36, 692, 299, 1048, 98, -121, 463, 150, -531, 113, -59, -720, 508, -435, -697, -1435, 116, -179, 847, -472, 1133, 370, -14, -175, 445, 462, -820, -355, -605, 210, -270, 617, 203, 206, 305, -145, 59, -219, -69, 15, -75, -640, 258, -4, 196, 4, -181, 18, 268, -427, 373, -158, 7, 39, -348, -33, 224, 107, -247, -108, -53, + -303, 110, -88, 447, -353, 166, 303, 119, -132, -86, 146, 84, 90, -66, 152, -456, 123, 124, 199, -130, -221, 29, 195, 41, 535, -374, -418, -411, 514, 262, 673, 180, 2102, -637, 2, 6, 973, 397, 445, -655, 273, -264, 8, -308, 56, 700, -197, 215, 1363, 421, -631, -738, 75, 885, 457, 160, -356, 752, 120, -123, -847, 246, -143, 351, -770, -474, 30, -203, 90, -719, -34, -443, 191, 618, 493, 154, -982, -2, 87, -887, -792, -529, -438, -437, 684, 148, -29, 442, 712, 182, 615, 7, 404, 2748, -639, 444, + 307, -495, 93, -1848, 28, 903, 229, -516, 693, 159, 258, -469, -114, -402, 128, 24, 25, 147, -579, 201, -322, -237, -789, 184, 170, 146, 191, 966, 138, 95, 103, 67, 574, 59, 237, 194, 436, 169, -36, -108, -90, 64, 273, 328, 90, -522, -245, -123, -123, -179, -545, -139, 179, 401, 1107, -529, -36, -759, -554, 168, 480, -629, 730, 302, -981, 589, -403, -490, -50, -590, 127, -269, 741, -441, -45, 405, -1461, 200, 439, -445, 346, -884, 865, 88, 140, -1666, 1485, 634, 480, 26, -957, 860, -67, -437, 1519, -312, + -684, -361, 173, 436, 407, 105, -270, -1809, -216, 444, 14, 655, -959, 970, 86, 324, -975, -284, 141, 1238, -531, 285, -904, 782, 428, 737, -301, 324, 114, -979, -944, 506, 403, 787, 155, 1012, -1549, -2013, 305, -429, 1119, -745, -176, 125, -870, 37, -526, 439, 614, 58, 495, 557, 150, -514, -274, 900, 454, 112, 141, -277, 4, 546, 291, -451, -271, 508, -91, 314, 302, -202, -281, -270, -17, 269, 104, 345, 482, 36, -36, 404, 5, 77, 109, -176, 119, -305, 149, 56, -15, 127, -148, -1402, 1279, -276, -309, -499, + -146, -1105, -2064, 713, 593, -91, -426, -840, -139, -260, -447, 814, -1846, -788, -975, -290, -1406, -129, -212, -50, -236, -285, 226, -14, -622, -195, -14, -851, -455, -251, 62, 655, -337, 1313, -687, -98, 552, -586, 356, 75, -901, -1347, -331, 344, 1228, 532, -942, -399, -2702, -905, -196, 568, 1466, -79, -1573, 86, 852, -315, -76, 904, 951, 2183, -2416, -470, 340, 609, -764, -907, -1294, -1284, -720, -599, -171, -95, -1495, -621, -550, 549, -285, -151, 1340, 1013, 78, -196, -66, -835, -42, 290, -604, -327, 108, 373, -260, -300, -205, 416, + -286, 436, 25, 450, 318, 321, -259, 158, -636, 315, -91, 181, -564, -441, -71, 132, -322, -4, -714, -137, -95, 288, 362, -463, 908, 3, 329, 188, 654, 650, -46, 406, -779, 205, -307, -1901, 447, -313, 580, -515, -532, 55, -788, 151, -795, -2, -128, -302, 401, -588, -774, -703, -911, -140, -89, 1038, 239, -732, -1098, 161, -12, 279, -205, 635, -719, -275, -1014, -641, -284, 49, -422, 1084, -362, -898, 294, 1124, 815, 344, -774, -495, -70, 1023, 1938, -2, 389, -354, -1877, -398, 181, 728, 1619, -875, -1082, 657, 313, -362, + 60, -583, 379, -1577, -175, 109, 396, -944, 1118, -1542, -1767, -1621, 835, -318, 1570, -2159, -941, 193, 2231, -160, -388, -1204, -441, -124, 1080, -71, 2, 84, 193, 41, -9, -443, -388, 532, 232, 83, -1158, 313, -293, -117, -597, 48, -48, -89, -1365, 148, -298, -135, -114, 254, 0, 107, -5, 30, 0, 28, -496, -75, -318, -254, 242, 270, -398, 37, -283, 395, -135, -614, 98, 1122, 332, -2049, -376, -1419, 610, 100, -2809, 173, -875, -1828, -1423, -2084, 1264, -649, -1640, -750, 515, -989, -850, -673, -401, -740, -728, -1340, -967, -1831, + -1034, -942, -316, -874, -186, -420, -36, 48, 230, 486, -510, 400, 41, 907, 395, 558, 576, -1721, -456, 1340, -244, -868, -962, -730, 537, 2176, -156, -58, -1486, -1531, -327, 285, 1306, -117, 1189, 417, -1460, 2589, 40, 2008, -5, -549, 1083, -1496, -1905, -1245, -4207, -2578, -846, 1890, 1168, -1717, -1119, -2607, 1264, 1667, -1327, -1351, 289, 1088, 1588, 411, 904, -893, -485, -684, -994, -442, -105, 53, 23, -576, 65, 321, 100, -129, -408, -308, -463, -211, -675, -188, 379, -684, -1056, -202, -703, -514, -107, -926, -702, -232, 387, 374, 449, -70, + -406, -124, 120, -286, 609, -34, 437, -39, -44, 406, 325, 462, 1111, 655, 814, -713, -1732, 2014, 1926, -1218, -1580, -8, 1729, -188, -99, -539, 1512, -169, -402, -38, 419, 775, 23, -584, -661, 931, 71, -403, -995, 565, 315, -116, -783, 245, 341, 278, -494, -301, 91, 766, -223, 273, -1128, -318, 6, 742, -1572, -285, 157, 1130, -541, 172, -801, 106, 338, -558, -417, -70, 189, 341, -354, 19, -1399, 755, -229, 1310, -810, 581, -550, 605, 120, 403, 353, -1028, 1162, 222, 673, -1134, 320, -293, 186, -328, 51, -85, 160, 376, + -53, -458, -261, 108, -54, 21, -168, -447, 155, 109, -129, -133, -1, -146, 28, -248, 0, -126, 205, 106, -74, -187, 69, -5, -148, 104, -474, -14, -48, 205, 0, 545, -360, -385, -119, 283, -391, 585, -492, 242, -237, 533, -478, 587, -332, 457, -414, 716, -676, 516, -150, 386, -361, 379, -411, 430, -414, 343, -275, 381, -296, 318, -295, 89, -96, 193, -146, 158, -129, 129, -93, 178, -109, 69, -85, 95, -74, 34, 15, -587, -1309, -1742, 1275, 847, -992, -1415, -692, 660, 347, 876, 943, 187, -471, -135, 332, -320, + -24, 197, 56, 529, 371, 163, -471, -15, -290, 308, -493, -427, 363, -112, -199, -195, -342, -470, 39, 389, 355, 299, -109, -387, -336, -234, 424, 576, -264, -398, -170, 478, 249, 639, -447, -168, 254, -117, 24, -65, 229, 138, 186, 41, -427, 181, 83, -13, 337, -170, -82, 60, -58, 45, -121, 567, 146, -43, 542, 542, -544, -827, -300, -566, 21, 378, 111, -337, -406, -107, -75, 329, 160, 206, 310, 189, -167, 191, 138, -397, -531, 163, -137, 268, 200, -291, -74, -97, -103, -339, -183, -19, 112, 165, 458, -224, + -164, 118, -101, -131, 270, 11, 598, -1454, -3827, -1407, 686, 1991, 4205, 2814, 724, 1066, -562, -1712, -2843, -2473, -1966, -567, 75, 1368, 1508, 3210, 1558, 1028, -81, -684, -1546, -802, -1250, -1441, -888, -743, -56, 402, 1201, 743, 862, 784, 792, 1192, 102, 826, -154, -370, -1006, -599, -1500, -2207, -1929, 23, -329, 606, 1036, 569, 1599, 1397, 2021, 1151, 1370, 68, 67, -1081, -1767, -2064, -2479, -1628, -2026, -170, -9, 975, 1022, 2448, 1922, 2735, 1109, 1279, 532, -11, -1633, -2661, -1783, -2126, -1326, -1439, -135, 223, 849, 1116, 1510, 1543, 1482, 972, + 1061, 277, -193, -364, -1197, -1089, -1432, -1011, -1432, -1090, -115, 256, 753, 1140, 1015, 1048, 1724, 626, 1052, 810, -1089, -1968, -855, -1735, -1096, -594, -125, 156, 552, 1003, 696, 1079, 683, 588, 235, -65, -627, -204, -295, -1097, -1028, -281, -117, 60, 360, 424, 534, 430, 422, 161, 142, -3, -241, -117, -88, -241, -392, -130, -196, -225, -27, 109, 119, 183, 217, 271, 174, 129, 40, -21, -68, -107, -147, -156, -113, -84, -63, -56, 1, 30, 34, 50, 53, 80, 119, 120, 34, 24, 32, -15, -62, -82, -113, -97, -68, -20, + -27, -1, 47, 51, 48, 69, 55, 32, 2, 2, 4, -8, -31, -26, -31, -30, -31, -20, -12, 4, 13, 26, 28, 22, -1, 11, 16, 10, -4, -18, -24, -20, -12, -2, 7, 16, 11, 4, 5, 7, -5, -10, -8, -8, -6, 0, 0, 1, 3, 3, 1, 1, 0, 0 } + }, + { + {233, 25, -63, -66, 40, -113, -2, -220, 157, 200, 140, 197, -236, 19, 54, -84, -65, -58, -277, -47, 164, -283, -230, 134, 121, -182, -64, 120, 15, 146, 63, 152, -96, 29, 21, -41, 71, 56, 103, 43, -46, 10, 116, -31, -53, -20, -140, -309, 183, 89, -97, 135, -54, 15, -5, 63, -82, -21, 182, -172, -69, 59, 30, -27, -9, 80, 9, 71, -123, 124, 64, -160, 127, 11, 46, -19, -48, -187, -58, -14, 96, -25, 78, -47, 9, 23, 9, 55, -10, 3, -7, -38, -17, 7, -20, 2, + -1, -9, 51, 51, 27, 21, 18, 6, 0, 6, 3, -8, -23, -26, -6, -3, 366, -209, 65, -231, 29, 55, -233, -295, 75, -320, 72, -83, -21, -196, -27, -220, -112, 2, -233, 249, 89, -387, 38, -20, -69, -165, 84, 202, 5, -14, 190, -110, 3, -70, 126, -146, 44, 177, -153, 155, 55, 168, -13, 39, -24, -70, 220, -270, 64, -119, -51, -35, -98, -72, -215, -135, -33, 142, -11, 54, 198, -4, -170, -21, 7, 54, -82, 1, -167, 4, -68, 56, 88, 129, 47, -72, -94, 127, -41, -57, + 24, 71, 146, 18, 43, -9, 86, -16, -67, -34, -33, -3, 59, 12, -3, -30, 57, 0, -20, -15, -14, -16, 27, -11, -2, -32, -87, -301, -2, -181, -56, -28, -211, -28, -48, 107, 249, 250, 31, -105, 101, -240, -33, -91, 85, -358, 128, 62, -12, -102, -154, -69, -127, -108, 68, -23, -137, -39, 29, 236, -8, -236, 19, 104, -2, -73, 20, 91, -257, -18, -111, 183, 111, 32, -237, 29, 92, 148, 137, -155, -73, 9, -48, -47, 128, -77, 78, 23, -100, -21, -137, 168, 63, -162, -112, 30, + 87, -128, -163, -26, 8, -107, 24, -43, 56, -102, 155, 85, 117, 35, 16, 107, 142, 19, 40, -11, 20, 5, -6, 18, 12, 19, -22, 3, 11, -6, 2, 50, -28, 13, -33, -24, -22, 7, 18, 15, 1, -28, -21, 51, -513, 167, 150, 250, -63, 158, -442, -120, 140, 18, -218, -56, -72, -387, -156, 41, -17, -276, 174, 247, -251, 193, -329, -111, -29, 115, -1, -133, 92, 46, -21, 149, -71, -94, -29, -53, -97, 147, -111, 42, 110, -21, -86, -161, -19, -115, -35, -133, -36, 301, 7, 184, + -167, 154, -47, -244, -144, 137, -88, -123, 90, -145, 122, 34, -45, 161, 144, 65, -158, -178, -12, 240, 48, 38, -135, 37, 86, -180, -66, 61, 127, 64, 108, -5, 1, 41, 5, -19, 7, -14, -23, -79, -64, 21, -38, -22, 27, 14, 20, -3, 33, -20, 2, -27, 1, -33, 17, 8, 24, -43, -270, -256, -168, 38, -39, 112, -90, 5, 24, -73, -25, 71, -72, 311, -196, 147, -48, -16, -138, -34, -15, 228, -148, 25, 48, -214, -129, -144, -122, -248, -83, 96, 177, 114, -198, -280, -58, 14, + -141, 32, -94, -144, -349, -172, -243, 148, -60, 121, -138, -339, -178, 22, -66, -108, -47, -130, 188, 22, 111, 149, 41, 0, -115, 11, 160, -21, -111, -154, 261, -208, -294, -205, -117, -160, 191, 303, -233, -158, 41, 150, 226, 181, 141, 141, -44, -53, -63, -64, 59, -37, 19, -47, -80, -28, -57, 50, -34, -69, -40, -37, -71, -77, -48, -15, 21, 21, 43, 11, -126, 22, -16, -46, 19, -16, -35, -79, -66, 9, 4, -22, -29, 6, -36, 29, -31, -14, -11, -54, 71, -564, 174, -40, 100, 310, + 121, -76, 105, -232, 144, 169, -307, -65, -156, 174, 150, 236, 272, -354, -183, 59, 304, -115, 141, -338, -103, -118, -73, -204, 50, -334, 232, -65, -60, 171, -11, 40, 179, 6, 147, 100, -43, -57, -21, -234, -174, -213, -15, 449, 103, 88, -12, -61, -5, 269, -59, 86, -517, 477, -117, -83, 26, 293, 104, -46, -179, 511, -100, -4, 161, -126, -3, 76, -117, 103, 98, 423, -211, -260, -51, 129, -161, 38, 106, 38, -95, 45, 109, -67, 7, -117, -41, -32, -101, 133, -96, -75, 56, 0, -114, -6, + 24, 52, 2, 60, -43, -30, -36, 42, -44, 71, 4, -24, 27, 75, -127, -5, -35, 241, 133, 268, -112, -68, 153, -254, 222, 254, -132, -25, -408, 16, 136, 109, -89, -279, -562, 6, -98, -268, 59, 175, -246, -107, -268, 130, 12, -43, -91, -118, 282, 329, 126, 155, -77, -170, 461, 112, -82, -276, 198, 5, 263, -27, 326, 162, 227, 192, 96, 253, 317, -13, 56, -106, -6, 171, 70, 92, -286, -107, -63, -250, -239, -159, 129, 269, 353, 462, 101, 37, 372, -153, -286, -102, -146, 240, 195, 73, + -271, -76, 45, 36, -55, -127, 35, 28, 152, -40, -88, 15, 27, 35, 0, -1, 28, 68, -53, -52, 2, -9, -73, -19, -92, 95, 29, -71, -5, 63, -37, -9, -56, 26, 33, -27, 83, 62, -12, 428, -411, -195, -58, 162, -385, 239, -380, 183, -4, 194, 308, -130, 281, 308, 293, -174, 246, -271, -217, -36, -169, -5, -146, 242, -184, 51, -182, -316, -149, -68, 376, -320, 295, 129, -443, 503, 121, 54, 351, 61, 12, -203, -4, -114, 401, 169, 280, -112, -70, 193, 333, -354, 345, 62, -60, -67, + -335, 158, -160, 66, 11, -302, 98, 253, -235, 160, 102, 355, 34, -26, 212, 310, 21, -180, 205, -243, -130, 63, -102, 64, -82, 30, 131, 97, -103, 85, -55, 68, -73, 216, 18, 206, -29, 51, -48, -19, -70, 130, 51, -109, 109, 131, -19, -19, 76, -6, -11, 109, -8, 26, 66, 46, -22, 83, -74, -13, 11, 22, 14, -5, -15, -83, 35, 124, 31, -349, -250, 378, -486, 122, -259, 288, -309, 471, 163, 45, -409, 208, 345, 91, -211, -137, -121, 321, 174, -448, 63, -317, -18, 36, -272, 355, + 356, -162, 77, 242, -296, -45, -92, -244, 519, -189, -117, -262, -439, -69, 7, -151, 64, -362, 31, 26, -74, 287, -61, -222, 115, 0, -168, 144, 616, -123, 146, 34, -420, -67, 373, 169, 370, -37, 213, -295, 131, 132, 42, -250, 231, 83, -653, 52, -119, 437, -169, 340, 312, 254, -33, 98, 13, 27, -44, -70, 169, 71, -4, -111, -160, -35, 66, 113, 78, 144, 3, -36, -60, -43, 50, 87, -10, 69, 42, 15, 60, -9, 62, -104, -134, -171, -10, 82, 34, -78, -32, -54, -65, 109, 30, 51, + 43, -766, 857, 97, 336, -629, 337, 440, -516, 191, 249, 192, -335, 39, 54, -116, 189, 393, -324, -270, -102, 333, 287, 408, -24, 170, -312, -85, -84, 63, 189, 523, 309, 187, 96, -22, 247, -97, -457, -92, 128, 140, -269, -205, -332, 59, -31, 111, -219, 381, 372, -330, 770, 31, -76, -8, -166, -39, -54, -317, 1, -3, 201, -656, 155, -235, 469, 568, 243, 234, 102, 34, 511, -101, -386, 323, -177, 84, 250, 461, 61, 42, -377, -20, 104, 292, -133, 157, 73, -117, 295, 47, 130, -91, -32, -90, + 10, 31, -50, -6, 86, -53, 87, 58, -69, -10, 38, -30, 3, -65, -207, -61, -36, 208, 257, 23, 34, -78, -92, 19, 24, -112, -90, -60, -54, 68, -126, -8, -94, 318, 65, -213, 208, 310, 269, 172, 320, -379, -241, 48, -343, -82, -55, 81, -86, -221, -280, -166, 142, 243, -415, 93, -41, -7, -501, -448, -76, -346, 168, -395, 28, 218, 310, -268, 368, 98, -34, -76, 545, -147, -25, -431, -243, 360, -25, 139, -417, -454, -123, -254, -43, 25, -167, -212, 131, -197, 20, -292, -159, -3, -488, 50, + 324, 67, 171, 356, 603, -575, 108, -353, -347, -190, -263, -165, -155, 594, 326, 331, 69, 101, -424, 26, -148, 74, -183, 266, 345, 39, -154, -100, -292, 33, 182, 106, -70, 192, 91, 203, -41, -30, 34, 134, -81, 61, -119, -161, 122, 50, 26, 33, -227, -129, 0, 182, -147, 94, -197, -60, -31, 77, 48, -52, -48, -256, 112, 616, 652, 716, -516, 48, 390, 309, -297, -578, -59, -78, -452, -258, 886, 78, 69, 337, -28, 149, -111, -339, 239, 200, -461, -660, -508, -403, -382, 46, 124, 208, -251, 264, + 71, -119, -266, -1, 26, -418, -323, 57, -67, 67, -248, 217, 75, -235, -511, -198, -166, -686, -208, 73, 354, -25, 417, -64, -23, -583, -115, 240, 122, -981, 295, 93, -265, -160, -276, -317, -2, 22, -302, -94, 212, 296, 466, -340, 28, 264, 0, -749, -591, 0, -148, 196, 7, -179, -259, 132, -66, 120, 322, -2, -140, -251, -460, -155, 42, -72, -67, 38, 44, 217, -94, 28, 93, 48, -157, 26, -30, -405, 56, -146, -172, 73, 65, -119, -25, 154, 58, 45, -137, -166, -45, -7, 24, 111, -180, -16, + -113, -71, -149, 252, -196, 698, -580, -354, -110, -1105, -572, 6, -700, 560, -240, -222, 73, 1271, 619, 47, 270, -51, -329, -26, -514, -372, 191, 191, 237, -357, 478, 293, 539, -529, 97, 790, 84, 39, 166, -744, 203, -183, 135, -295, -697, -37, 298, 355, 102, -104, 63, -26, 247, -529, -767, 145, -272, 471, -174, -188, 620, 142, 274, 54, -501, -205, -49, 282, 814, 621, -171, -703, -1, -77, 276, -432, -534, -306, 273, -550, -73, -461, 17, 379, 3, -693, -139, 96, 198, 90, -420, -290, -451, 75, -83, -199, + -140, -199, 55, -81, -178, -52, 152, 2, 9, -234, 10, -20, -134, 15, 307, 99, 69, -298, 133, -32, -18, 48, 10, -5, -44, -177, -181, -162, 220, 177, -64, -444, -146, -165, -18, -237, -1274, 483, 395, -192, -844, -191, -329, -346, 363, 451, -54, 119, -959, 330, -1198, -307, -111, 232, 592, 947, 388, -556, 121, 660, 81, 197, 353, -565, -224, -93, 162, -399, -220, -124, -304, -231, 396, 392, 94, 29, 676, -133, 312, -778, 505, 143, -710, 68, 216, -663, -94, -649, 207, 268, 281, -438, -46, 430, -370, 2, + -67, 713, -433, 524, 258, -670, 576, -494, 367, 494, -511, 280, -438, -535, -813, -672, -744, -178, 121, -223, 631, 664, -293, 585, -101, -126, 736, -168, -512, 346, -87, -393, -312, 293, 41, 151, 222, 40, 180, 295, -92, 332, 216, 165, 176, 26, 103, 282, 215, 286, 29, 237, -58, 16, 194, -104, -388, 176, 45, 0, -7, 168, -346, 169, 218, 188, -235, 193, -1016, -487, -507, 865, 14, 315, -156, 1232, 183, -844, 48, 902, -352, 191, -164, 67, -548, -734, 1131, 802, -327, 612, 232, 800, 911, -283, -232, 810, + 589, 54, -274, -421, -442, 368, 711, 328, -146, 475, -270, 450, -221, 662, 1180, 897, -987, 432, -180, -409, -27, 326, 313, 2170, -235, -35, -370, -400, 410, 776, -208, 587, 497, -81, 3, -437, 418, 351, 1146, 1168, 1419, 583, -381, -310, -674, 631, -990, 692, -930, 525, -338, -563, 382, -1494, -1187, 201, 214, -437, -427, 678, 329, -649, 79, -158, -364, 101, 162, 41, 164, 199, 357, -186, 56, -222, -387, -239, 72, 19, 495, 96, -140, -428, 49, -177, -150, -197, 126, 296, 92, 255, 208, 341, -166, 257, 18, 66, + -42, 10, -226, 236, 577, 306, -81, -79, 494, 417, -344, 137, 259, -163, 706, 174, -1584, 387, 231, -1175, 92, -186, 71, 456, -36, -1085, -174, -333, -40, 799, 960, -516, -112, -430, 253, -828, -1617, -570, -472, 103, 50, 762, -1098, 551, -238, -108, 484, 232, 803, 194, 324, 850, -929, 1205, 968, 508, 909, -329, 360, -815, -141, -403, 758, -636, 181, -1382, -1707, 1170, -29, 760, -501, 507, -319, 120, -172, -1122, -334, -746, -335, 423, 1707, 613, -1459, -324, 418, -332, -197, -969, -482, 769, -259, 195, 174, -600, 412, -78, + 55, -1244, -340, -16, -548, -315, 73, -839, 114, 200, -661, -531, -944, -714, -42, -392, -166, 33, -252, -266, -88, -420, -180, 63, 317, -370, -109, -640, 255, 166, 407, -261, 422, -831, -23, 6, -33, 133, -110, 94, -362, -403, 30, 167, 15, -317, 114, 98, -987, 520, 519, 923, -452, 339, -519, -601, 266, 1226, 1984, -123, -134, 43, -46, -883, 1387, 669, 736, 572, -405, 485, -787, -1125, -198, 847, 545, -400, -265, -52, 679, 33, 493, 492, 804, 274, -514, -479, 457, -539, -412, 245, 882, 825, -942, -718, 476, 582, + 1740, -399, -958, -979, 828, -624, 781, 899, 1789, 3821, -861, -478, -1438, -2267, -735, -1138, 122, 1591, -242, 847, 1185, 793, -452, -1400, -2318, 1298, -101, 1476, -764, -1991, 687, -1175, -1591, -799, -515, 515, 484, 913, -80, -425, -83, -23, -831, -778, 389, -266, 794, 750, -366, 748, -592, 32, 707, 94, -1140, 317, -582, -82, -199, -133, -846, -660, 114, 1002, 1036, -968, -135, 1221, 1131, 22, 223, -1066, -597, 184, 615, -917, 219, 757, 346, 302, 61, 488, 695, 371, -106, 128, -755, 158, -687, -1921, 502, -795, 818, 132, 464, 407, + -1756, -1241, -606, -376, -396, -710, -210, -1189, -750, 592, -767, 1504, -1093, 127, 323, -105, 147, -51, 372, -333, -356, -52, 283, -34, 656, -590, 153, 947, 316, 153, 493, 71, -363, -230, 775, 182, -1180, -519, -954, -430, 1306, 1213, -1223, -125, -1393, -328, -99, 337, 726, -1144, 789, -972, -148, -655, 1502, -289, 1065, 989, 2197, -992, 917, 157, 873, 309, 671, -1080, -982, 1465, 91, -44, -1010, 1185, -377, 613, -1063, 2289, -1200, 1278, -1508, 614, -1131, 646, -1040, 797, -650, 472, -353, 264, -550, -345, -248, -62, 225, 44, 186, 22, + 184, -78, -268, -454, 234, 238, 91, 219, -148, 90, -112, 94, 809, -190, -537, 87, -293, -593, 217, -321, 266, -268, 226, -518, 240, -672, 452, 984, 181, -1711, -733, -1047, 95, -219, -2321, -1036, -583, -1221, -747, -2340, -1969, -333, 888, -1275, -747, -160, -1079, -225, -57, -1045, -254, 250, 86, -1397, -779, -784, -419, -476, -113, -961, 859, 568, 1212, 1744, 1524, 410, 1610, 661, 315, -671, 586, 604, 488, -153, -506, -221, 430, 731, 3639, 519, 778, 560, 1510, 601, 1331, 2387, -1101, -2277, 324, 1505, 2671, 1199, -2238, 339, -530, 3355, + 2484, 3005, 2766, -2337, -1524, 1976, 2374, -648, -1317, -1605, 3722, 2484, -117, -3134, 801, -87, -663, 907, 277, -242, -637, 23, 542, 1404, 1016, -779, -285, -182, -131, 810, 606, 638, 54, 361, 1307, 894, 224, 544, -298, 670, 863, 1110, 1413, 1107, 867, 54, -133, -231, -39, -558, -279, -239, -695, -924, -1050, -1860, -1025, -653, -1089, -2071, -1415, -1192, -1392, -1677, -1765, -560, -628, -935, -482, -549, -328, -505, -478, -477, -337, -455, -269, -363, -250, -289, -149, -329, -20, -325, -440, -581, -1709, 2733, 2207, -1915, 425, -47, 305, -78, -191, 701, + -710, 684, -282, -1, 270, 218, 244, -6, -403, -261, 439, -366, -48, 420, -233, -247, -338, -622, -621, 449, -227, 164, -391, 73, -828, -154, 226, 527, -339, 111, 364, 578, -141, 477, -393, 1532, -572, 525, 70, 295, -289, 402, -164, 1090, -180, 333, -766, 999, -529, -47, -149, 140, -300, 597, -697, 561, -639, 822, -867, 1044, -699, -385, -438, -228, 42, -700, 451, -419, 396, 23, 547, 196, 379, 655, 288, -241, 181, 152, -93, 108, -206, 229, -115, -11, -201, 456, -460, 31, -39, 367, -69, 65, -84, 139, -215, 154, + -183, -113, 363, 308, -92, -340, 216, 269, 314, -298, 246, -212, 187, 25, 77, -321, 332, -139, -369, 295, 310, -276, -40, -77, 95, -270, 359, -344, 134, -376, 331, -279, 287, -231, 350, -394, 419, -390, 214, -331, 327, -375, 302, -249, 373, -415, 416, -368, 349, -279, 324, -301, 276, -242, 225, -247, 217, -229, 244, -251, 240, -210, 213, -217, 204, -197, 228, -195, 223, -163, 193, -159, 163, -167, 199, -147, 152, -120, 172, -128, 126, -114, 85, -87, 109, -74, 116, -89, 119, -90, -669, -1384, -1523, 1299, 330, -399, + -2065, -829, 1154, 237, 834, 929, -333, -581, 30, 222, 173, 155, -363, -267, -201, 3, 561, 304, -25, 127, -159, -269, -171, -140, 12, 166, -125, 214, 226, -758, -335, -335, 407, 283, -24, -352, -476, 417, 94, 280, 390, -703, -467, 129, 569, 287, -800, -493, -649, -310, 169, 147, -267, 295, -120, -281, 127, 269, -199, 64, -7, -251, -22, -89, -568, -574, -34, -613, -458, 19, 187, -134, 677, 499, 285, 21, -64, -301, 375, 183, 219, 210, -189, -80, -14, 107, -353, -432, -59, 189, 29, 239, 168, -226, 75, 131, + 94, -73, 241, -300, -178, 550, 317, -340, -254, -174, -302, 333, -11, 46, 154, 98, -3, -14, -225, 142, 86, 195, -111, -35, 129, -14, -148, 537, -1339, -3650, -1387, 831, 1758, 4145, 2437, 662, 868, -719, -1341, -2936, -1979, -1518, -496, 602, 1617, 1255, 1569, 1515, 1028, -347, -1195, -1036, -1063, -856, -1233, 378, -779, 57, 575, 1060, 600, 992, 1310, 24, 392, 28, -19, -732, -96, -652, -1270, -2007, -1116, -613, 163, 152, 1194, 1654, 1593, 1893, 277, 1242, 494, -113, -1164, -1143, -1549, -2037, -1386, -1578, -997, 5, 491, 1132, 1833, 2695, + 2163, 1956, 1062, -406, -397, -1060, -2250, -1732, -2844, -1873, -827, -633, 892, 1706, 2344, 1650, 1268, 767, 880, 769, -121, -889, -843, -1336, -1473, -1177, -801, -749, -707, 323, 695, 1222, 1456, 1190, 1051, 595, 24, 28, 139, -886, -1495, -616, -1305, -1486, -47, 368, 830, 852, 550, 901, 529, 720, -149, -18, -630, -385, -333, -423, -476, -391, 68, -165, 5, 437, 615, 381, 340, -89, -102, -10, -4, -190, -215, -41, -125, -137, -74, -1, -131, -49, 275, 92, 130, 173, 148, 53, 51, -33, -117, -170, -123, -200, -164, -45, 31, 69, + 136, 108, 100, 129, 90, -56, 24, 52, -39, -106, -112, -91, -7, -41, -65, -40, 37, -4, 38, 98, 96, 80, 45, 7, 1, -30, -29, -48, -45, -35, -30, -48, -26, -25, -18, 14, 59, 33, 49, 56, 47, 28, 7, -18, -31, -49, -37, -41, -38, -14, -1, -15, 8, 35, 43, 28, 17, 19, 21, -5, -18, -20, -17, -16, -8, -6, -1, 1, 3, 1, 2, 2, 2, 0, 1 }, + {247, 158, 5, 9, 195, 49, -96, 67, 130, -65, -107, -384, 21, -129, 257, -127, 129, 105, -13, 85, 143, 40, 33, -69, -84, -65, -106, 94, 56, -49, 84, -57, -85, -101, -49, -79, 7, 2, -15, 177, -102, 145, -52, -36, 97, -59, 30, -59, 106, -30, -301, 91, 11, 38, 151, 79, 11, -33, -100, 259, -136, 101, 52, -105, 109, 50, -126, 101, -130, 9, -13, 115, 19, 120, -46, -265, -57, -63, -126, -112, -112, 93, 40, 33, 56, 57, 11, 28, -31, 20, -23, -9, -65, 1, -22, 51, + -5, -14, -10, 7, -34, 13, -15, 20, -11, 5, -39, -3, -48, -28, -28, 41, 467, -233, 24, -16, -16, 105, -86, -339, -312, 144, -100, -31, 77, 15, 76, 85, -150, 78, 53, -107, 120, 182, -123, -42, 7, -202, -92, 18, 236, -41, -16, -201, 115, -2, -180, -79, 59, -30, 32, -157, -6, 8, -65, 162, 39, 34, 156, -19, 204, -72, -265, 103, 100, -95, -43, -35, 30, 9, 70, -63, 46, -146, -9, 91, -139, -19, 78, 23, -74, 44, -57, 12, 132, 46, -187, 221, 82, 80, -22, 126, + 141, -65, -11, 29, 34, 43, 58, -9, 3, 43, -9, 4, 26, 68, -14, 69, -5, 15, 34, 7, -23, -8, 22, 22, -7, -34, -113, -273, -33, 29, 302, -115, 259, 65, -9, 16, 231, -54, -63, -67, 163, 331, 87, -228, -310, -441, 58, -115, -185, -102, -287, -1, -133, 22, 138, 145, -164, -147, -104, 18, -244, -27, 76, -110, -40, 26, 98, -137, 36, 322, -13, -16, -119, 134, -60, 12, 103, 134, 199, -32, 29, -60, -2, -34, 26, 310, -344, 8, 67, 183, -76, -91, -20, -86, 248, -136, + -324, -22, -97, -136, 81, -321, 119, -34, -89, 6, 227, -67, -85, -87, 109, -102, -28, 19, -9, 39, 4, 15, 67, 5, 18, -17, 54, 12, -11, -61, -33, -5, -32, 63, 38, -36, 47, 5, 7, -33, 18, -15, 2, 16, -504, 188, -158, 211, -190, -17, 146, -291, -50, 89, -79, 425, -178, -54, -170, -142, 218, 243, 94, -286, -345, 319, 53, -323, 121, 12, 153, -96, 146, -193, 94, 312, 129, 134, 71, 6, -80, 65, 24, -213, 3, -67, -157, -156, -60, 124, -225, 31, -163, -17, -25, 74, + 133, 282, 99, -2, 121, -151, -222, -4, 51, 23, 268, -61, -33, -86, -38, 38, 130, -35, 54, -133, 217, -57, -76, -50, 70, -118, 3, 134, -10, -38, 19, 107, 84, -16, 67, -57, 42, -35, 16, 77, -27, 33, 32, -52, 52, 32, 11, -22, -48, -11, 58, 39, -21, 24, -12, 96, -9, -26, -252, -59, -163, -17, 334, 214, 149, -25, -294, 41, -194, -312, -104, 225, -176, -277, 72, 24, -138, 30, 157, 43, -369, -105, 232, 273, 136, -306, -111, 139, -52, -66, 20, 102, 16, 38, 314, 1, + 190, 147, -2, -141, -3, -83, 187, -107, -178, 0, 293, 16, 291, 157, 28, 188, -32, 405, 33, 200, 228, 21, -189, -29, -226, 115, -162, -91, -149, -98, -72, 74, 25, 111, -5, -129, -112, 42, 208, -62, 52, -224, 71, 193, 297, -102, -22, 49, -102, -8, 98, -30, 180, 12, 41, 4, 9, 66, -44, -29, -23, -14, 18, 22, -34, 29, -10, -36, -44, 15, -41, -27, -52, 25, 36, -8, 102, -66, 18, -7, -57, 97, -28, -14, -50, 55, 36, -9, 15, 48, 305, -456, -84, 382, -190, 70, + -295, 130, 538, -73, 29, -23, -380, 31, -24, 570, -180, -28, 249, -157, 354, -238, -36, -360, 408, 6, -160, 5, 149, -189, 283, -30, 251, -2, 132, -394, -253, -184, -59, 237, -357, 191, 148, 50, -148, -215, 491, 98, -56, 190, -173, 103, -231, -227, -94, -152, 530, 158, -105, -158, -202, 167, 138, 50, -186, -23, -75, 226, 21, 183, -428, 233, -37, 11, -47, 75, -189, -88, -297, -97, 108, 181, 192, 71, 70, 45, -106, 63, 44, -8, -71, -119, 64, 59, -90, 47, 7, -75, 49, 13, -32, -18, + 5, 14, -55, 38, 22, -86, -20, -44, 8, 60, 42, -9, 3, -40, 97, 8, -33, 196, 98, 162, 50, 5, -58, -241, -73, -155, 99, -6, 370, -306, -395, -98, 127, -121, -94, 315, 65, -170, -197, -204, 344, -170, 233, -109, 255, -250, 58, 390, 135, -527, 124, 14, -66, -45, 56, -61, 53, -84, 44, -20, -234, 239, 245, -71, 271, -228, -38, -64, -107, 298, -211, -376, -210, 73, -306, -285, -142, -95, -195, -15, 255, 268, 43, 289, 92, 40, 220, -231, -39, 2, -189, 0, -183, 226, -62, -39, + 188, -32, -57, -37, 225, -25, 80, -215, -75, 123, -139, 12, 6, 26, -105, -72, -54, 5, -57, -68, 24, -9, -61, -26, 10, -5, -18, -19, -34, 14, -114, -79, -76, -76, 3, -2, -26, 30, -58, 588, -293, -282, 188, 477, 91, 430, 245, 390, 172, -75, -180, 138, -295, -225, 326, 272, 682, -20, 94, -255, 263, 117, -306, -74, 386, -3, -428, -175, -242, -84, 237, 216, -163, -81, 296, -290, 131, 248, 298, -162, 256, -111, -390, 135, 356, -98, 102, 85, -122, 41, 106, -113, 39, 287, -171, -92, + 266, -59, -55, -444, -157, -269, -440, -298, 220, -146, -188, 378, 380, -98, 408, 162, 268, -77, -212, 175, -220, -440, -264, -115, 216, 98, 362, 62, -78, -61, 0, 61, -113, 5, -66, -11, 64, -13, 10, 115, -43, -23, 117, -87, -44, -58, 35, -65, 43, 24, 18, 60, 79, 34, 142, 16, 97, 31, 73, 82, -73, 65, 72, -53, -15, -9, -102, 28, -53, -298, -319, 431, -72, 986, -406, -191, -23, 240, -138, -134, -406, -470, 212, 41, 648, 210, -67, -74, 430, 440, -364, 264, -348, 91, -150, -179, + -107, 74, -57, 229, 114, 256, -32, -122, -241, -46, 279, 25, -372, -46, 90, -158, 294, 249, 51, 87, -811, -310, 283, -19, 455, 127, 512, -57, -278, 274, -156, 187, 33, 748, 617, 74, 174, -101, 245, 261, 281, 305, 495, -8, 89, -189, -166, 156, -232, -574, -427, -9, 357, -179, -325, -186, -176, -19, -388, -15, 72, -2, -53, -37, 40, 85, -11, 64, -290, -177, -93, -204, 18, -73, -120, -79, -49, 119, 48, -109, 36, 261, 133, -54, -93, -117, -69, -94, -203, 76, -79, -15, 147, 50, -29, 30, + 56, -855, 676, -19, 78, -236, 379, -812, -520, -163, -208, -19, -728, 143, 16, -19, -332, -338, 138, 465, 73, -619, -134, -507, 401, 259, 21, -224, -106, -114, 331, -46, -6, -71, -448, 234, 315, -187, -100, 246, -488, -355, -538, -182, 136, -343, -164, -14, -558, 171, 345, 610, 88, -60, 38, -400, -314, 467, -33, -177, -110, -714, -383, 141, -151, -83, -55, 468, -81, -444, 36, 347, -9, -217, -4, 25, -183, -311, 245, -572, -283, -4, 277, -350, 222, 147, 202, 215, -220, -55, 264, 51, -161, 152, 218, -204, + 76, 196, 185, 291, 19, -89, -50, 48, 4, 128, 107, 10, -27, -93, -32, 64, 129, -215, 27, -41, 88, 207, 10, 145, -78, 96, 118, 174, 136, 170, -13, 97, -32, 74, 444, 407, 142, 696, -324, -156, 106, -194, -63, 221, 747, -131, 145, -14, -55, -22, 824, -413, 424, -14, -554, 172, -550, -340, 305, -295, 214, 3, 22, 364, 291, -458, -516, -392, -136, 136, 139, 45, 93, -621, 86, -338, -777, 515, -159, 483, 520, 21, 190, -291, -350, -616, 132, 546, 91, -254, 26, -133, 78, -336, -274, -336, + 49, -50, -113, 348, 315, 184, 515, 49, -556, 699, -525, -170, -137, -147, 587, -105, -858, 714, -290, -183, 192, 173, 551, 346, 227, 262, 240, 176, 4, 224, 275, 64, -3, 291, -60, 25, -284, -77, -95, -155, 17, -33, 175, 122, 47, -33, 81, 27, 57, 112, -45, -58, 19, -57, 85, 32, 36, 62, 35, 268, 197, 47, 50, 639, 723, 164, -1380, 43, 381, -460, 270, 543, 21, 143, 340, 261, 97, 488, 106, -74, 921, 339, 115, 395, -312, 486, -351, -35, -45, -119, -514, 165, -366, 656, -65, -135, + 965, 125, 136, 318, 31, 181, -223, -428, -54, 281, -507, 577, 520, 383, 96, 226, -352, -364, -576, -257, -313, -298, 130, -60, -564, -252, 486, -13, -467, 257, -31, -318, -754, 48, -1140, 656, -392, 596, 23, 164, 14, -227, 296, 1011, 87, 286, -183, -794, 64, -89, 573, 334, -142, -31, -126, -66, 191, -229, 179, -30, -205, -203, 207, -248, -248, -343, -75, -247, 70, 212, 8, -64, -165, 310, -300, 75, 31, 24, -179, 122, 301, -16, -159, -39, 274, 290, -240, 277, -27, -74, 38, -19, 302, 79, -171, -146, + -8, 33, 175, 385, 288, 755, -1022, 412, -596, 520, -249, -425, -118, -491, -203, -104, 186, 236, -139, 725, -28, -117, -91, -645, -66, 9, -542, 182, -462, -583, -185, 361, -970, -656, -437, 57, -679, -574, -466, -230, -186, -83, -458, 501, 89, -42, -341, -348, 672, -575, -394, 182, 182, 247, -334, -463, -195, -81, 222, -331, -132, -131, -400, -680, -865, 828, -897, -43, 67, -150, -163, -798, 315, -186, -841, -13, -183, 801, 199, 572, 541, -153, 213, -82, -151, 405, -98, 235, -303, 31, -305, 269, 207, 44, 190, -73, + -27, 206, 97, -187, 145, 331, -49, 82, -175, -408, -42, -29, -13, -281, -62, 53, -41, -147, 197, -29, -111, -329, -340, 12, 187, 117, 72, -16, 245, 285, -125, 67, 67, -11, 83, 209, -912, 1063, 171, 110, -181, 541, 10, 889, -239, 611, 330, -869, 381, 147, 417, -67, -230, -344, -126, 431, 941, 104, -135, -589, 226, -638, -100, 653, -584, 6, 43, -96, -220, -244, 1042, -220, -254, -121, 237, 354, 132, 23, -211, 3, 157, 638, -144, 910, 529, 276, -217, 794, 896, -67, -237, -40, -291, 96, -288, 459, + 154, 658, 503, -790, -898, 1085, 800, 135, -153, -420, -592, -223, 606, -563, -618, -79, -167, -979, -220, 228, -383, 62, -3, 61, 80, 174, -292, -170, -300, -99, -2, 54, -164, -68, -29, -477, -163, -222, -108, -2, 43, 31, 81, -20, 18, -245, 147, -209, -255, 193, 78, -445, -50, -131, 226, 448, 9, -359, 298, -72, 78, 117, -121, -74, 27, -185, -262, 477, -376, -116, -73, 101, 23, -569, -1665, 846, -796, 336, 1202, 190, -492, 353, 424, -166, -370, -70, -816, 280, -848, -512, 352, 44, 157, -766, -149, -551, + -466, -681, -232, 244, -402, -409, 414, 64, -25, 137, -784, -41, -608, 536, 154, -1501, 389, 817, -164, 491, 415, 282, 229, 781, 615, 30, -544, -109, 621, 405, -504, 45, -590, -185, 49, 442, 590, -1060, -836, -465, 99, -309, -108, 1002, 172, 243, 783, -306, 169, -189, 801, -395, 42, 87, 596, -155, -53, 223, 250, -23, 127, 391, 25, -4, -6, 381, -179, -113, 99, 169, 119, 57, 186, -74, 11, -163, 5, -119, -9, -167, 296, -208, -307, 307, 206, 214, -214, -280, 10, -509, -131, -259, -260, 113, 7, -268, + 103, 120, -20, -156, -147, 127, 85, 253, 554, 536, -934, 195, -201, -246, -217, 627, 333, -457, -261, 478, -860, 49, 313, 479, -102, 106, -1003, -4, -444, 336, 123, 557, -882, -445, -129, 109, -76, 173, 63, 482, 907, -574, -742, 196, -773, -227, 323, -561, -546, 46, 336, 473, 334, -210, -48, -983, -664, 874, -607, 1180, -501, 241, 172, -9, -867, 1087, -506, -102, -196, 425, 817, -827, -471, 972, -719, -1, -272, 199, 1123, 7, -83, -695, 859, -280, 223, 285, -545, -655, 63, 379, -197, 195, -1557, -725, -223, -793, + -392, 133, 515, -108, -142, -405, 10, -38, -297, -102, 181, 16, 243, 115, 230, -305, -44, -63, 321, 255, -194, 591, 217, -237, 357, 99, -36, -186, 135, -135, -128, 264, 22, -116, -105, 222, -62, 200, -46, 364, 75, 53, -148, -107, -132, -48, 44, 533, -617, 166, 503, 497, 1134, -728, 1041, -189, -689, -674, 168, 432, -307, -144, -476, -198, 882, -629, -62, 708, -235, 421, -289, -140, 751, -31, 34, 725, 501, 174, -94, 611, 836, -861, 785, -761, 396, -550, 110, 647, 218, -1483, 652, 415, -9, 745, -1178, -231, + 794, 675, 109, 1063, -572, 8, -141, -170, 454, 185, 796, 662, -504, 438, -932, -292, 70, -52, -76, -156, -1457, -806, -1126, -767, 830, -524, -130, 90, 1362, -332, -485, 1091, 667, -37, 883, 130, 164, -420, -2, -352, -371, -194, 284, -356, -188, 164, 61, 269, -114, -52, 351, 201, 17, -287, -231, -41, -91, 206, 350, -32, 59, 76, -147, 876, 269, 57, 32, -294, 231, -521, -42, 438, -35, -123, 318, 179, 95, -14, -291, 185, 205, 63, 111, 148, -104, 113, -352, 364, 914, -486, 361, 457, -637, 95, -787, 316, + -73, -414, 646, 30, 1001, -49, -726, 1262, -212, 136, 186, -1162, 367, 1021, 374, -428, -755, 91, 201, 875, 571, -271, -154, -662, 21, 988, -1314, 414, 943, -825, 321, 97, 337, 988, 342, 388, -166, -950, 1010, -174, -493, 2095, 1042, 542, 107, 57, -965, -794, -348, 623, -4, -559, -385, 783, -455, 542, 320, -372, 586, 270, -808, -403, -466, 146, 535, -1023, 358, -1049, -1318, -831, 1302, -434, 284, -290, -426, -54, -511, -358, -263, 75, -489, 69, 319, 9, -427, -323, 178, 60, 591, 86, -634, -245, -354, 548, -87, -208, + -496, 3, 334, 152, 378, -170, -35, 115, 386, 240, 14, -195, 294, -241, -1, 156, -208, 4, 431, -3, 102, -435, -285, -328, 229, -350, -83, 1265, 2118, -367, -83, -1758, -598, -1295, -868, 1178, 73, 312, -1000, 309, -880, -1965, 273, 927, -89, 110, 999, -1350, 1518, 751, 466, -769, 1017, 1972, -405, 602, 1495, 1261, 2233, 477, 795, 600, 536, 1917, -511, -238, 700, 413, -219, 1050, 55, 214, -638, -1729, 58, 1140, 166, 688, -1250, 70, -1659, -4, -1782, 115, 1238, -164, -536, -1698, 2210, 397, 142, 2290, -34, -530, -393, 114, + 454, -131, 3, -186, -1218, 716, 275, -764, -470, 598, -737, -1272, -622, 274, 1211, -1273, 1008, -53, 537, -225, 439, -307, -46, 107, 123, 405, 369, 74, 776, -42, 320, 407, 240, 177, 187, 669, 502, 240, -259, -111, 586, -775, 304, -462, 117, -172, 532, 606, 1238, 689, 1170, 667, 254, 1222, 1277, 1208, 703, -202, 737, 805, 510, 970, 745, 9, 242, 175, 184, 295, 233, -232, -217, 29, 238, -40, 2, -53, -107, -230, -201, -79, -47, -80, 8, -127, -56, -702, -2257, 79, 2981, 410, -643, -610, -1400, -924, 12, 1852, + 302, -1283, -119, 485, 95, 11, -152, 300, -926, -363, 430, 1015, 1022, -1018, -410, 50, 112, 239, -1169, 85, 158, -325, 792, -33, 918, 1401, 654, 271, 592, -833, 707, -677, 1071, 1919, 611, -1072, -934, 858, 293, 1634, 1216, 359, -339, -392, 23, 66, -604, 624, 535, 88, 1468, 1005, -166, 712, 786, 361, 786, 17, -1451, -194, -371, -346, 1590, 728, 235, 1270, 734, 804, 979, 332, -1056, -526, -53, -34, -391, -317, -652, 373, 222, 591, -313, 661, 160, 685, 438, -167, -386, 93, 159, -5, 50, 501, 19, 790, 1041, 297, + -121, 69, 739, 169, -276, -213, 577, -39, -222, -125, 168, 426, 828, -459, 35, -299, 37, 31, 668, -380, 312, 424, 218, -321, 62, 496, 25, 15, 442, 67, 251, 184, 9, -88, 46, -62, 68, 42, 75, 37, 191, 76, 51, 61, 125, 58, 137, 55, 67, 73, 57, 76, 38, 71, 97, 110, 106, 120, 95, 127, 94, 103, 44, 105, 44, 97, 32, 98, 66, 90, 21, 90, 58, 95, 62, 107, 33, 115, 35, 103, 57, 102, 40, 114, 38, 93, 53, 100, 49, 118, -1, -430, -2104, -445, 1196, 651, + 2601, 153, -360, -1148, -2255, -2482, -400, 1086, 1223, 785, -1244, -1654, 4, -194, 680, 1746, 900, -154, -1024, -1403, -871, 67, -853, 347, -711, -351, 1175, 965, 869, 341, -1172, -324, -1120, -868, -440, 679, -109, 720, 1773, 1838, -746, 217, -1335, -918, -628, -111, 270, 1068, 1151, 1568, 1128, 404, -756, -707, -153, 507, -1258, 98, 1510, 1194, -294, 1617, 1457, 816, 1522, -2846, 696, -806, -861, 493, -453, -37, 2893, 2436, 881, -748, -49, -1140, -206, -1535, -528, -256, 612, 1886, 1005, 397, 354, -301, -926, -1215, 22, -801, 662, -68, 15, 724, + 610, 225, 631, 218, 975, -665, 6, -734, 326, -638, -566, 104, -157, 509, 924, 56, -816, -1409, -404, -816, 115, 368, 690, -544, -171, 26, -9, 715, 58, -3666, -4156, -4468, -4514, -6120, -367, -2195, -712, 807, 2040, 2864, 2954, 6041, 6478, 5273, 3922, 4154, 3961, 1525, -593, -2728, -2733, -4192, -1364, -2273, -1695, -161, -3559, -1026, -3179, -867, -3652, -3443, -1591, -2843, -293, -1437, -1328, -2127, -1408, -3210, -2270, -1207, -1106, -1699, -1042, -127, -1375, 460, 2050, -1601, 2426, 1453, 3239, 3252, 2840, 3502, 2959, 4886, 4854, 3870, 5180, 4440, 6785, 6680, 7874, 6126, + 6596, 7187, 6493, 7762, 5753, 8406, 6719, 2559, 3285, 864, 1301, -4552, -3818, -4265, -4537, -4786, -6180, -5821, -6396, -7025, -8256, -6903, -6318, -7026, -7659, -9135, -7325, -8114, -8164, -6197, -6983, -4032, -5001, -3425, -3177, -1685, -1230, -1745, -299, 820, 3968, 3756, 2730, 3083, 3321, 4498, 4611, 4983, 5260, 4520, 4597, 3374, 4783, 4887, 3727, 2618, 2026, 2936, 2909, 2260, 1359, 749, 1146, -299, 159, -537, -421, -2171, -1982, -1450, -998, -1323, -1008, -485, -394, -526, -972, -900, -441, -580, -377, -324, 70, 152, 33, -155, -35, 78, -48, -49, 58, 106, 214, 58, -54, -10, + 73, 61, -48, -21, 116, 73, 61, 68, 124, 102, 28, -10, 87, 83, 92, -20, -97, -49, 34, 119, 142, 79, 30, -73, -115, -86, -85, -168, -275, -347, -355, -368, -402, -440, -511, -571, -617, -611, -555, -511, -512, -496, -467, -303, -208, -151, -33, 81, 173, 266, 363, 418, 486, 483, 466, 464, 416, 345, 267, 214, 173, 128, 88, 53, 32, 15, 11, 7, 5, 3, 2, 2, 3, 5, 7 } + }, + { + {-85, 162, -5, 67, 27, -139, -104, 38, -93, -139, 82, -15, 23, -79, 61, 7, -123, -4, 146, 119, -88, -156, -142, 23, -32, -27, -121, 135, -34, 39, -54, -32, -11, 52, -35, -69, -267, 93, -19, 88, 53, 38, -5, 181, 35, 37, 27, -90, -57, -7, 15, -90, -20, 37, -11, -85, -44, 5, 86, -131, -179, -222, 81, 129, 14, 107, 79, 16, -203, -4, -52, -70, 5, 13, 86, -17, 122, 87, -37, -121, -58, -20, 33, 11, 41, 47, 86, 0, -6, -38, -33, -31, -13, -67, -31, -37, + 23, -3, -7, -20, 34, -47, 97, 127, -29, -1, -181, 162, -207, 81, 350, -74, -130, 20, 182, 20, -52, -25, -52, -32, -164, -63, 81, -130, -74, 8, -7, 145, -88, 28, -34, 32, -18, -83, 160, 272, 69, -15, -51, 294, 14, -122, 8, -218, 1, 115, -168, -20, 36, -133, -40, 156, 22, -16, 149, -98, -157, 90, 59, -108, -54, -116, -138, -147, -82, -83, 120, 86, 23, -2, -83, 78, -18, -56, 101, 114, -80, -15, -38, -50, 16, 130, -65, 30, 122, 83, -28, 33, -22, -2, 52, -6, + 0, 55, -57, 25, 11, -16, -53, 42, 4, -22, 12, 8, -19, 8, -10, -16, -31, 179, -259, -171, -61, -37, 10, 34, -247, 173, -78, 57, 36, 58, 109, 0, -35, -82, 179, -13, 117, 221, -47, 188, 161, -138, 94, 94, 101, -244, -23, 15, -76, -153, 3, 180, -41, -76, -60, 56, 167, 83, -84, -1, -69, 8, -21, -82, 156, -200, -165, -152, 48, -21, -5, -187, -197, 49, -3, 12, -19, -10, -147, -87, -161, 32, 139, -43, 124, 24, 110, -235, 2, 35, -78, -35, 32, -84, -9, 62, + 68, -52, -157, 139, 23, 4, -34, -20, -125, 6, 10, -22, 24, 4, -44, 19, 22, -12, -17, -6, -6, -8, 8, 67, 2, -20, 56, 25, -3, -18, -4, -9, -92, 20, -20, 151, 241, 13, -95, -210, 92, 59, 55, 256, -171, 4, 29, -49, -87, 36, 14, 153, 341, -32, 57, 141, -65, 126, 221, -158, -8, -60, -6, 97, -176, 186, 39, 0, 96, -18, 134, -76, -34, -41, 213, 98, 135, -28, 110, -211, 239, -95, 92, -222, 86, 158, 292, 106, 52, -196, -77, 52, -149, -176, -44, 346, + 400, 76, 92, -117, -54, 224, 41, 97, -16, 67, 58, -31, 49, -35, 36, 26, 140, 114, -181, 158, -55, 80, -59, 59, -50, -68, -4, -107, 14, 76, 15, 39, -40, -48, -27, 18, 1, 17, -9, 11, -33, 10, 9, 56, 1, 38, -21, 34, -42, 4, 4, 40, 167, 2, 18, 235, -203, -239, 366, -98, -62, 238, 142, 15, -425, 453, -86, -61, -50, -28, 16, 25, 140, 210, 138, -34, 237, 148, 75, 61, -90, 106, -174, 134, -28, 54, -147, -215, 25, -30, 76, 124, -65, -206, -120, 46, + -245, 154, 47, -391, 173, 23, 98, 22, 59, 62, -17, -113, -96, -268, -195, -111, -136, -33, 15, -197, -275, -44, 177, 303, -17, -208, 33, -325, 21, -26, -127, 267, 254, 82, -11, -69, -20, -146, 66, 256, 138, 211, 43, -102, 99, 48, -8, 16, 11, 2, 46, 44, 46, -19, 80, 18, 159, 58, 42, 3, 13, 38, -12, 70, 27, 24, -43, 88, 23, -38, -14, 68, -415, 214, -79, -148, -117, -141, -197, 380, -484, 114, 117, 158, 236, 39, 66, 89, 64, 49, 80, 208, 38, -115, 0, -20, + -149, -135, 69, 139, 150, 20, 107, -253, -29, -4, -14, -240, -143, -87, 156, 140, -2, -262, 2, -142, -101, -52, -70, 164, 224, 67, 233, -373, -260, 123, 76, 12, 49, 24, -120, -235, -162, 123, -105, 189, 187, -69, 177, -283, -139, -80, -95, 20, 513, -75, 145, -83, -74, -53, 109, 116, -13, 93, 65, -161, 45, 11, 69, 14, 9, -82, 52, -5, 53, 15, 28, -16, -30, 14, -46, -69, 23, -38, -57, -19, 18, 21, 23, 24, -3, 16, 37, 29, 11, 7, -11, -21, 35, 17, -3, 24, + 424, -82, 11, 178, -404, 277, 141, -228, 252, 283, 95, -436, 269, 11, -41, 221, 238, -14, -71, 7, -169, 158, -93, -162, -340, 79, -369, 99, -91, -41, 106, -301, -124, 250, -22, -117, 153, 10, -131, 113, 41, 11, -56, 86, -183, -19, -267, 253, 252, -315, 210, -225, -85, 217, 304, -22, -152, 92, -19, 44, -372, -294, 58, 52, -81, -77, 96, -12, -132, 157, -152, 53, 113, -26, 178, -179, 180, -2, 286, -99, 87, 162, 18, -103, -30, -11, 84, -28, -135, 113, 24, -57, 50, -38, -2, -53, + -16, 38, -45, 29, 78, -41, 19, 5, -26, 49, 13, 42, -64, 25, -65, -75, 27, -12, 30, 31, 9, 90, 118, 52, -154, 299, -101, 146, -300, -21, -79, -272, 10, 194, 343, 449, -255, -7, -318, -23, -202, 182, -189, -375, 25, -240, -22, 312, -184, -184, 335, 11, 58, -34, -196, 84, 72, 403, -277, 198, -235, 59, 79, -232, -143, 387, 106, -287, -74, -105, -230, -9, 380, 204, 264, 61, 106, -345, -49, 441, 35, -273, 147, 146, -200, -174, -96, -451, -69, 135, 224, 397, -99, -217, -62, -135, + 323, -119, -281, -191, -83, -38, -87, -162, 351, -201, -24, 33, 17, 115, 72, -103, -138, 105, 126, 133, -30, 60, -36, -21, 60, -13, -61, 63, 30, -1, -40, -13, -102, 10, -25, -88, -45, 41, 35, 2, 41, 194, -669, -460, -295, 37, -560, 85, 419, 140, 431, -229, -105, -45, -222, -82, -334, 597, 342, 239, -502, -96, -160, -326, 115, -33, 108, -406, -26, -35, -291, 171, 50, 300, 122, -248, 395, -185, 161, 84, -2, 313, 291, 74, -374, 459, -230, 330, 152, -169, -187, 369, 56, -42, 98, -310, + -110, 181, -24, 327, -186, -293, 123, 85, 12, 325, 142, 67, -205, 237, 94, -179, -23, -18, -102, -74, -85, 143, 358, 601, 281, -100, 33, -136, 140, 186, -1, -152, -88, -199, 126, -108, 32, -93, -23, 134, -13, 16, -119, 131, -66, -57, 74, -118, 134, -90, 73, -64, -10, 31, -87, -62, -36, -144, -143, -63, -5, -50, 119, 108, 65, -431, 560, 227, 642, -300, -358, 611, 13, -72, 128, 39, 355, 475, 55, -457, -727, 93, -207, 36, 12, -319, -28, 384, 312, 244, 496, -122, 419, -308, 370, 117, + 285, -204, 508, 290, 369, -606, -11, 537, 302, 91, -137, 812, 338, -329, -206, 192, -321, -38, -158, 35, 680, 713, 515, 185, -2, 264, -247, -68, 287, -313, 720, 447, 349, 134, -36, -351, 424, 9, 369, -176, 139, -250, -147, -13, 182, -292, 670, 285, -83, -339, -647, 308, 48, -215, -28, 73, -157, 86, 239, -49, -93, 1, -60, -70, 48, -83, -64, -112, 103, 57, -168, 84, 95, 94, -11, -54, -26, -7, 46, -20, 32, -101, 149, -202, -5, 62, 168, 17, 712, -32, -338, -148, -263, -2, -428, 122, + -367, 221, 58, -93, -287, -346, -527, -548, -156, 491, -27, -307, 140, -293, 240, -249, 462, -457, 118, -322, -327, -55, 67, -91, 224, -662, 279, 71, -151, -40, -34, -324, -520, -562, 420, 208, -212, 360, 22, -142, -408, -873, -713, 415, -116, 15, -76, -36, -31, -590, 237, -699, -364, 37, -11, -146, -83, -89, 737, -220, -225, -193, 771, -133, -293, 485, -366, -237, -299, -259, -967, 199, 169, -325, -36, 231, -116, -86, -171, -165, -12, -86, -75, 343, -16, -35, 241, 273, -122, -97, -10, -47, 82, -165, 31, 20, + 43, -98, -109, -50, 124, -45, -78, -13, 83, -214, -21, 121, 21, -86, 128, -75, 115, -2, 111, 102, 120, -189, -6, 1, -1032, -777, -443, 912, -41, -145, -105, -65, -293, 327, 253, 817, -743, -139, 235, -540, -214, -187, 938, -7, 219, 483, 47, 465, -490, -613, -412, -107, -102, 82, 295, -6, -520, -353, -24, -271, -584, 532, -85, -284, -1, 177, 169, 107, -263, 63, -543, -230, -807, 390, 246, -86, -252, 309, -402, -93, 874, -82, 741, 341, 199, -183, -928, -376, -178, -490, -373, -228, 416, -179, 10, -362, + 792, -272, 327, 233, -541, -206, 119, 513, 914, 773, 329, -40, 313, 15, 26, -167, 91, -173, -131, 9, 52, -99, -151, -255, -216, 127, 85, 106, -101, -28, -535, 4, -249, -101, 93, 88, 27, 234, 2, -17, 18, -74, -390, -22, -224, 125, -200, -197, 20, 262, 107, -55, -150, -118, -69, 149, 29, -43, -102, 520, -43, -323, 315, 173, 1107, 22, -4, 379, -523, -367, -117, 75, 166, -153, 460, -309, 51, 430, 186, 149, 151, -347, 48, -27, -176, 51, -254, -443, -237, 16, -434, 526, -53, 37, -88, 356, + 408, -97, -324, -46, -112, 480, 625, -471, -324, -247, 147, 457, -436, 124, -30, 82, -232, -312, 81, 295, 47, -403, 338, 1010, -344, 174, -88, 62, 386, 95, 457, 374, -114, 582, 1078, 27, -413, 1049, -32, 1002, -363, -516, 460, 164, 701, -133, 992, 299, 222, -317, 464, 38, 37, 94, 377, 64, 433, 37, 100, -2, 57, 54, 132, -62, 149, 355, 146, 153, 43, 82, -217, 165, 61, 66, 125, 53, -22, -21, 96, -123, 28, -13, 85, 248, 88, -27, -143, 122, 17, 15, -33, 118, 73, -224, 198, -718, + -240, 1089, 172, -521, 140, -398, 131, 198, -100, -596, -230, -884, 351, 285, -345, 310, 496, 90, -146, -523, 106, 799, -399, 474, 457, 59, 342, 310, 7, 390, 262, -791, -118, -328, 784, 509, -560, 324, -71, 402, 1314, -141, -231, 115, 1182, 471, -80, 135, 209, 669, 599, -432, 721, 316, 668, -495, 67, 117, 138, 398, 613, -421, -325, 471, 240, -186, -180, -18, 738, -1420, 325, -518, -372, 48, -484, -466, -68, -786, 549, -183, 581, -42, 508, -359, 202, -9, 166, -37, -200, 133, 107, 101, 247, -144, 124, 149, + -145, -10, 237, 65, -130, 242, -176, 12, 138, -195, -129, 30, 53, 272, 245, 151, 89, -54, 192, 18, 85, 59, 160, 167, -159, -161, -258, 177, 83, -11, 67, -24, -278, -266, 179, 233, 247, -315, -374, -963, 41, -539, 870, 102, -228, -134, 522, 146, 849, 338, -222, 30, 178, 382, 639, -721, -620, -135, 1075, -337, 137, 301, 471, 566, 817, 701, 62, -174, 764, 54, -486, 253, -451, 320, 82, -408, 369, 1430, 801, -513, -383, -59, -397, -401, -340, 240, -193, -343, 77, 388, 238, 124, 566, 144, -134, 589, + 504, -438, 295, -493, -377, -438, 2, -1049, -305, 717, 538, -256, 363, -95, 29, -648, 148, 376, 614, 335, 408, 213, 198, -282, -236, -299, 168, -72, 28, 114, 133, -23, 321, -109, -134, -160, 227, -300, -112, -367, -14, 60, -149, 3, -80, 212, -37, -482, 13, -43, 147, 173, 66, 198, -7, 329, 77, -39, -2, 25, 22, 5, 139, -89, -399, 316, 254, -504, -220, -1088, -93, 893, 4, -668, 100, 23, -450, 592, 341, -249, 165, 264, 364, 198, 58, -275, 139, 205, 568, 849, -242, -586, -310, 155, 173, 697, + -276, -562, -437, -451, 848, 1556, 563, 69, 1711, 94, 706, 397, -150, -370, 300, -497, -331, 338, 18, -1044, -1077, -278, 442, -569, -707, -396, -525, -438, 357, -308, -800, 347, 26, -242, 181, -190, 396, 1600, -992, 801, -1127, -647, -377, -265, 619, 241, 294, -133, 342, 711, 176, 5, 5, -222, 95, 186, 575, -47, -292, -55, 438, 272, -130, 155, 196, -173, -10, -81, 551, 188, 259, 182, 155, -242, -166, -50, 138, -294, 37, -290, -194, 31, 26, -332, 307, 411, -46, -69, 255, -11, -115, 361, -158, 246, 20, 868, + 557, 501, 739, -871, 329, -912, -40, 1182, 1051, 445, 12, 201, 130, -345, 271, 337, -1499, 87, 216, 450, -552, -847, 614, 287, 154, -365, 729, -108, 566, 468, -60, 67, -169, 571, -345, 171, 344, -35, 734, 421, -44, 373, 426, -28, -336, -1127, -210, 114, -667, 59, 527, -1025, -455, 151, -441, -77, 535, 26, -383, -502, 219, 210, -1033, -349, -88, -2, 645, 311, 70, 1125, -145, -43, 42, -651, 609, -1, 1000, -395, -170, 295, 149, -861, 26, -124, -344, -282, 105, 29, -243, -28, -152, -112, 29, -372, 104, 44, + -53, 133, 37, -248, 48, 62, 63, -240, 340, 60, 442, -334, 40, -283, -99, -58, -493, 97, 44, -28, -68, -96, 181, -229, -172, 207, 285, -224, -288, -1062, -926, 165, -478, -153, -714, -889, -935, -616, 661, 903, 21, -751, 56, 31, 7, 341, 576, 575, 11, -379, -933, -537, -817, -179, 1, 65, 81, 110, 221, 286, 545, -864, 375, 146, 187, 457, 813, 912, -530, 404, -732, -232, -664, -69, -261, 1518, 538, 1092, 44, -593, -255, 698, 758, -452, 1402, -593, 85, 57, 241, 511, 1560, -114, 380, 865, 196, -695, + 436, 1594, -294, -392, -945, -84, 588, 359, 47, -911, -688, 110, -718, 210, 29, -907, -104, 87, -144, 645, 609, 8, -181, -394, 421, -186, 734, -174, 8, 498, 504, 714, 554, -413, -161, 91, -136, 43, -312, -304, -303, 151, -371, -437, 254, 327, 28, -376, 234, 125, -93, -101, -253, -12, 142, -70, -226, -300, -57, -199, 239, 128, 20, -274, -119, -156, 313, 1426, -69, -3, 608, 122, -1956, -612, 1397, 468, -404, -777, -105, -512, 723, 377, 140, -409, -923, 203, -1594, -191, 787, 1071, -118, -902, -612, -1867, 554, -321, + 738, 558, -527, -383, -1655, -1243, 654, 1773, 711, 844, -584, -1048, -1004, -419, 1509, 2029, 1061, -2351, -858, -1801, -960, 2240, 550, 499, -292, -2150, -1759, -1766, -324, 175, 1121, -411, 854, -1705, 1067, 428, 135, 2151, 143, -195, -97, -2911, -885, -195, 923, 481, 425, 1289, -1369, 91, -904, 995, 722, 71, 204, 214, -157, 592, 322, 159, 508, -340, -635, 158, 465, 700, 581, 382, -475, -778, -1087, -96, 84, 886, 1101, -163, -829, -1432, -683, 104, 1101, 1760, 464, -1720, -1761, -1802, -14, 1471, 1300, 1367, -454, -665, -1277, -1294, 480, 875, + 1146, 579, -900, -855, -479, -136, 1064, 561, 180, -49, -645, -470, -92, -128, 281, 350, 160, 141, -831, 1626, 704, 751, -1991, 412, -2777, -606, 3, 404, 171, -1777, 978, -487, -311, -328, -370, -430, -542, 1178, -324, -998, 332, -277, 134, 572, -1124, -399, -59, 483, 60, 1294, -98, -730, 1710, -1431, 852, -1327, -430, 657, -1072, 86, 797, -404, -82, -74, 1023, 1549, 905, -513, -202, -235, 110, 502, -192, -301, 312, 165, -2786, -107, -91, 413, 360, 24, 17, 801, -868, -221, -73, 612, -2233, -310, 2043, -516, -806, -3, 1549, -278, + -355, 423, -592, -629, 962, 1474, -520, -743, 266, 444, -220, -784, -4, 118, -147, -111, -233, -340, 174, 14, -302, -54, 1, -9, -277, 170, -376, -409, -228, -249, 395, -53, -67, -7, -204, 317, -399, 121, 25, 31, 299, -12, -482, 58, -117, 94, 81, -445, 716, -185, -53, -67, 78, 178, -2, -165, -77, -353, -661, -2029, -1663, 1490, 1274, 134, 1359, -1449, -69, -2811, -988, -486, 1385, 1261, 780, -1123, -375, -36, -526, 283, 512, 657, 875, -641, 498, -1209, -757, -180, -243, 46, 826, -952, 851, -360, -519, -200, 96, -1199, + -9, -1084, -392, -413, -1025, 1447, 677, 338, 369, -265, -1445, -2155, -1249, -1263, 884, 219, 951, 1313, 1090, -339, 276, -737, -557, -672, 555, -713, -16, -680, -697, -438, 864, -669, -173, 80, -78, -970, -1037, -629, -359, -1412, -827, 226, 876, 905, 1160, -64, -910, -1194, -907, 483, 171, -140, 575, 1415, 393, 384, -336, -258, -443, -273, -129, -439, -84, 542, -95, -228, -413, -473, -522, -154, 285, -138, 134, 72, -957, 112, -445, 415, 807, -390, 564, -64, 153, 23, -753, -119, -231, -197, 131, -11, -65, -163, -331, -456, 693, -462, + -3064, -4148, -3921, -3729, -4469, -757, -1246, 780, 1247, 3979, 2549, 3372, 4648, 5116, 3485, 4443, 2520, 1172, -193, -846, -1152, -1890, -1861, -2559, -1094, -947, -2416, -1800, -1732, -1959, -3192, -2170, -1682, -1344, -2461, -348, -749, -1023, -2384, -2192, -1820, -1546, -1137, -461, -1523, 430, 762, -1183, 1301, 1830, 1743, 3194, 2580, 1998, 2184, 2214, 2180, 3360, 3764, 3717, 2525, 4009, 3940, 4125, 4176, 4764, 4209, 4466, 5906, 3023, 3032, 3095, 2862, -136, 1296, 1659, -971, -511, -1659, -3000, -2739, -2867, -5191, -3791, -2330, -4039, -4302, -3529, -3787, -3723, -4498, -4097, -4164, -3872, -3640, -3294, + -3077, -3052, -2564, -2135, -3411, -510, -1547, -1742, -419, -208, -1738, -208, -686, -235, 608, 770, 1965, 1194, 1639, 1859, 1984, 1838, 2520, 2499, 2619, 2484, 2935, 3058, 2960, 2433, 3096, 3299, 2521, 1738, 1638, 1032, 850, 265, -127, -70, -560, -454, -390, -180, -497, -479, -495, -182, -492, -567, -367, -71, -425, -519, -460, -322, -639, -725, -769, -489, -466, -533, -487, -49, -126, -291, -201, 22, -99, -173, -168, 26, -105, -191, -226, -89, -141, -45, -86, -114, -180, 32, 92, 73, -18, 53, 21, 84, 48, 125, 109, 132, -45, -41, -67, -31, + -163, -166, -175, -179, -287, -210, -206, -144, -249, -240, -243, -150, -187, -212, -153, -19, -33, -52, 22, 129, 96, 95, 93, 160, 178, 185, 152, 194, 201, 185, 179, 187, 177, 148, 113, 111, 87, 69, 36, 31, 18, 13, 3, 2, -1, -2 }, + {-191, 245, -17, 99, 51, 117, -205, -110, 134, 66, 3, -113, 25, -319, -205, -10, -122, -138, 58, 252, 43, 192, -43, 190, -111, -99, -11, -169, 35, 86, -60, -3, 45, 9, 78, -8, -181, 67, -112, -84, 52, -111, -169, 170, -177, 162, 151, 100, -7, -208, -121, 25, -39, 270, -164, 67, -20, 37, -203, -339, -59, -101, -113, -26, 144, -30, -153, 136, 58, -67, 113, -21, 34, -155, -12, -38, -2, 61, -71, 50, -143, 98, -22, 11, -52, -46, 1, 60, 22, -1, 23, 0, -86, 26, 7, 55, + -9, 3, 0, 2, -5, -30, 132, 132, 20, 236, -1, 103, 128, 0, -113, 14, -162, -207, -78, -236, -244, -78, 163, -56, -55, -126, -31, -222, 110, -61, 56, 136, 47, -45, 93, 89, -108, 77, 11, 22, 83, -193, -83, 140, -88, -5, -55, 155, -195, -15, -164, 108, -9, -10, 150, -62, -71, -50, -138, 12, -62, -9, 10, 96, 97, 34, -42, -162, -268, -81, -18, -64, 145, -56, -82, 117, -73, -113, 255, -53, -142, -11, 24, -41, 126, -14, -112, 4, 5, -22, -33, 102, 23, 16, -59, 15, + -18, 9, 39, -6, 22, 49, 6, -7, -10, 22, -56, -19, -11, -24, 24, 22, -9, 271, -175, -83, -127, 100, 18, -14, 195, 46, 56, -287, 51, -135, -156, -203, -5, 6, 237, -197, 89, -83, 294, -108, -99, 209, -82, 71, 30, -16, 33, -142, 22, 5, 58, 276, 96, 24, -120, 95, -217, -62, -42, 116, 100, 166, 109, -127, -186, -82, 140, -19, 72, -31, -21, 280, 66, -23, -338, -152, 8, 115, 179, 252, 141, -63, 45, -64, -87, 180, -115, 185, 8, -171, 60, -89, 146, -128, -15, 125, + 145, -148, -57, -30, -61, 86, -20, -65, 40, 19, 22, 23, 35, 17, 21, 7, -11, -15, -55, 82, -4, 3, 9, -1, 13, 43, 43, -4, -12, 54, 42, -6, 35, 144, -33, -23, -51, -166, 8, 121, 121, 225, 104, -293, -244, -212, 10, -35, 17, -115, -71, -17, 91, 0, -187, 205, -28, -188, 40, 46, -2, -17, 83, 109, -66, 166, 10, 98, -223, 161, 58, 93, -153, -16, 115, 98, 247, -8, -337, -92, -161, 80, 57, -13, -89, 27, -137, -49, -252, -148, -7, 142, 159, -113, -95, -99, + 164, -55, -18, -243, 148, -239, -82, -10, -49, -65, 257, -21, -57, -68, 53, -153, 20, -266, -213, 79, -73, -39, 97, -48, 129, 25, 60, 90, -22, 44, 31, 17, -17, 33, 15, 8, -18, -21, 7, -78, 1, 49, 14, -3, 12, -48, -13, 29, 18, 79, 23, -10, -10, 72, -84, 130, -97, 4, 177, 319, 222, 51, -242, -181, 70, -38, -154, -48, -200, -83, 413, 52, -40, -72, 4, -91, -62, 281, -283, -29, 32, -57, 76, 172, -73, -90, 46, -113, -111, -262, -95, 77, -235, -35, 123, 185, + 68, -370, -109, 80, 193, -142, 330, -33, -162, -88, -67, -124, 181, -128, -32, -170, -134, -59, -136, 192, -65, -371, 147, 257, 7, 96, -453, 362, 10, -294, 34, -197, -39, 37, -214, -250, 173, 84, -217, -10, 9, -131, -14, -45, 38, -116, -59, -19, -57, -25, -86, 35, -3, 51, -94, 28, 58, 4, -52, 41, -50, 56, 45, -36, 44, -2, -25, -8, 17, 25, 15, 14, -333, 81, -244, 271, 72, -96, -196, -347, -148, -250, 93, 497, 89, -123, -3, -62, -71, -216, -141, -223, 67, -12, 55, -74, + 43, -236, -12, 61, -160, -55, 25, -84, 28, -77, 368, -439, -75, 42, 124, -40, -178, -267, -189, 152, -34, 168, -134, 427, 60, -76, 0, -244, -316, -156, 126, -267, -12, 327, -5, -146, -300, -509, 26, 270, -69, 309, -23, -89, -186, -162, 34, 127, -93, 446, 137, -135, 72, -174, 70, 90, -57, 102, 182, 82, 12, -111, -320, 28, -70, -26, -46, 30, 10, 3, -139, 29, -79, 34, -77, -20, -18, 0, -4, -9, -55, -45, -61, -86, -96, -34, 8, 34, -49, 6, 6, 17, -37, 43, -67, -3, + 286, -130, -337, -94, -253, -132, -111, 352, -92, -121, -152, 225, 201, 178, 496, 521, 239, 323, -126, -153, 213, 319, -143, 139, 96, -281, -267, 154, -42, -5, -267, -336, -83, -273, 303, 572, 115, 225, 62, -69, 201, -393, -109, 80, 214, -130, -321, 461, -5, -143, -117, 189, -61, 168, -120, 264, -27, -8, 323, 101, 147, 58, -54, 244, -377, -150, 135, 421, -261, -30, -57, -60, -181, -39, -96, -121, -22, 28, 114, -50, 334, 123, -199, -47, 20, 129, 41, -59, -122, -26, 70, -75, -71, -58, 64, 43, + 63, 36, -68, -25, -3, -63, -16, 50, 25, -7, -76, 93, -18, 58, -45, 29, -87, -7, -18, 5, -60, -17, 207, -207, -82, 186, -149, 79, 140, -282, -301, 83, 227, -80, 207, -154, -69, 396, -453, 270, -130, 1, 11, 489, -111, 95, 155, 268, 157, 235, -41, -41, 76, 36, 38, -240, 367, -495, -110, -132, 273, -58, 334, -18, 30, -588, -162, 354, 605, -8, -302, -257, 248, 197, 150, 140, -259, -121, -150, 76, 10, -162, 92, 78, -75, -84, -354, -96, -130, 502, 45, 92, 191, 12, -396, 17, + -239, 194, 471, -253, 145, -75, -245, 115, -206, -39, 85, 60, 108, 42, -17, -93, 102, 218, 37, 106, 182, 77, 205, -66, 194, 6, 5, 39, 22, 52, -6, -99, -53, 0, 52, 51, -37, 91, 90, -79, 127, 217, -363, -137, -134, 74, -17, 550, -65, 23, 350, -305, -221, -286, -300, -70, -7, 140, 587, -49, -332, 608, 14, 173, 417, 289, 389, -97, 308, -193, 407, 357, -92, 188, -159, -147, 156, 466, 211, 187, 69, -143, -252, -256, 45, 322, -182, -218, -270, -100, -539, -123, 107, -394, 196, 32, + -179, -464, -310, 5, -617, 198, 140, -10, 176, 116, -57, -319, -193, -33, -202, 195, -212, 518, -343, 22, 229, 24, -152, -589, 106, 294, 73, 21, 324, 181, -181, 4, -19, 28, -10, -99, -206, -59, -223, 17, 59, 31, -56, -113, -51, -74, 101, 33, 131, 95, 76, 32, -8, -40, -37, -98, 50, 11, 50, -45, -4, -82, 8, -63, 29, -758, 265, 345, 608, -3, -453, 127, 217, -469, -488, -305, -13, 259, -14, -192, -11, -168, -113, -303, 503, 393, 147, -619, -186, 98, -36, -138, 781, 286, 245, 229, + 371, 278, 67, 291, -20, -486, 262, -500, 152, -495, 417, -132, 504, -276, 122, -223, 181, 294, 769, 162, -979, -53, -137, 209, 427, -87, -190, 314, -56, -155, 421, 26, -19, 21, 180, 336, 267, -290, -215, -184, -294, 68, -27, 332, 239, -450, -108, -255, 218, -125, -120, 78, 15, -174, 149, 36, 25, -26, 85, 87, 14, -255, 71, 44, -33, -46, -84, 3, -113, 52, 128, -39, -38, 125, 20, -117, -89, -22, 61, -51, -12, -72, 20, -49, 1, 120, -80, 19, 826, -311, -548, -173, 216, -134, 398, 575, + -229, 527, 340, 266, -85, -62, -104, 512, 95, 63, -295, 131, -153, -12, -489, 334, -448, 3, -316, 534, -270, 13, 528, 401, 272, -31, -207, 246, -6, -46, -669, -198, -403, -328, -255, -120, 351, 221, 206, 2, 516, -271, 546, 479, 515, 899, -345, -269, 397, 76, -346, 543, -176, -260, 178, -66, -185, -154, 235, -313, 145, -193, 500, -210, 10, 146, 365, 494, 42, -429, -465, 154, -309, -1002, -526, 161, -9, 291, 40, -163, -17, -94, 45, -173, -74, -118, -48, 15, -19, -312, -80, -204, -182, -144, 66, -13, + 15, -227, -157, -7, -6, 46, 120, 98, 74, -163, 10, 39, -210, 76, 15, 94, 44, 119, 69, -47, 102, -75, -54, -22, -757, -638, -19, 149, -432, 32, 52, 728, -454, -521, 185, -212, 12, -378, 384, -384, -518, -309, 626, -406, -329, -66, 262, -171, -428, 149, -166, 15, 213, -568, -31, 334, 529, -66, 802, 359, -78, 47, 372, -136, -309, 73, 440, 60, 218, 22, -338, 133, -756, 82, 54, -86, -440, -399, 62, -175, -298, -196, -238, 307, -494, -277, -133, 233, -285, 633, -81, -510, -33, -298, -815, -235, + 67, -13, -525, -275, -110, 135, -307, -146, 543, -176, -712, -242, 106, 68, 251, 214, 163, -156, -198, -38, -134, 118, 45, -80, 168, 77, 104, -50, 87, 69, 12, -18, -41, -55, 14, 55, -245, 68, -135, 178, 74, -178, -156, -2, -121, -7, 67, -35, -77, -128, -94, 88, 41, -147, 73, 30, -93, -77, -170, 579, 517, 149, 1067, -208, -383, -345, -165, -588, 775, -478, -179, -389, -203, -188, 85, -560, 2, -3, -83, 147, -589, -158, 393, -406, 15, -523, 486, -7, -881, -464, -164, -29, 237, -542, -304, 354, + -68, 241, 226, 218, -324, 25, 382, 132, -727, 454, 331, -402, 1104, -31, -800, 209, 247, -29, 588, -192, -993, 268, 138, 285, 347, -463, 712, 258, 219, -181, 1080, -95, 16, 728, -129, 326, 582, 189, 85, -152, 279, 0, 492, -229, 480, 430, 25, 425, 260, 336, -179, -14, 398, 276, 213, 116, 136, -277, -32, 0, -124, 4, -45, -126, 231, -251, -45, -247, 202, -113, 242, -220, 34, -158, -203, 127, -77, -20, -198, -310, -218, 214, 23, -109, 26, 269, 208, -101, 102, -12, -77, 278, 13, 176, 216, -767, + -753, 1543, 497, -965, -485, -443, -883, -67, -466, 642, -364, 2, 802, 16, 133, -592, 739, 550, -10, -180, -58, -461, 35, 57, 94, -633, -92, -38, -190, -142, -435, 410, 817, 978, -79, -399, -165, -205, -137, -604, 205, 233, 217, -630, -836, 902, 343, 504, 658, 614, -266, -424, 596, -608, 308, -456, -346, -205, 709, -238, 145, 240, -127, -576, 1185, -719, 75, 854, -774, -355, 93, 310, 883, 154, -509, 11, 110, -123, -212, 123, -356, 271, -294, -420, 227, 123, 320, 139, -9, -148, 39, 85, 101, 336, -17, 43, + 214, -506, 76, -230, 59, 52, -78, -194, -232, -62, -233, 89, 132, 286, -21, -199, 189, 220, 141, 133, -357, 8, 96, -94, 316, -122, 29, 28, 293, -142, 92, 400, 402, -256, 252, 1029, 621, -92, -658, 70, 1055, 840, 178, -834, -321, -720, -53, 565, 698, -51, 266, 829, 882, 1368, 1378, -687, 300, -742, -134, -601, -215, 475, -105, 208, 187, -427, -312, 350, 390, 506, 360, -16, 371, 558, -294, 283, 330, 99, 322, 1068, -801, -689, -154, 660, 633, -374, -4, 1014, 820, -573, -382, 349, -700, 196, -336, -635, + 207, -746, 777, 286, 861, -360, -501, -970, -209, 318, -850, -727, -397, 382, 227, 180, -373, 164, -267, 105, 792, -335, 94, -447, 341, -183, -375, 267, 371, -204, -104, -120, 267, 591, -187, -395, 11, -5, -145, -61, -548, 78, -290, -129, 201, -177, -96, -14, -150, 244, -239, -379, -343, -289, 312, 165, -68, 139, 95, -244, -267, 103, -284, -30, -494, 392, 1021, -80, -333, 651, 123, -51, -997, 851, -440, -948, -331, 50, 1065, 90, 760, 300, -928, -212, -824, 117, -821, -594, -360, 28, 157, -639, 602, -211, 361, 388, + 384, 733, 1347, 785, -273, -682, -36, 1419, 879, -501, 700, -288, 858, -446, 72, -337, -174, -62, -258, 2139, -422, -607, -700, -979, -384, -758, -46, 819, -344, 233, -290, -438, 744, -224, 1262, 223, 1007, -1259, 500, 2175, 784, -1234, 714, 652, 28, 128, -387, 404, 1908, 1008, 419, 570, -613, 1099, -129, 158, 164, 262, 117, 718, -617, -164, 40, 920, -170, 216, 1068, -98, -613, -152, 385, 53, -266, -622, 342, 242, -432, -259, 279, -528, -441, 127, 202, -14, 137, 89, 162, -201, 170, -127, -166, 156, 60, 221, 39, 1498, + 701, 168, -45, -1632, 763, 1027, -738, -537, 1270, 828, -1013, -1077, 40, -629, 276, 105, 263, -1012, 266, -196, -503, 900, -61, -150, 304, 755, 680, 464, -865, 19, -421, -924, 339, 262, 571, -195, -429, 1182, -847, 375, 413, 334, 256, -147, 701, -648, -1117, -188, -1280, 1125, 694, 1104, -87, 217, -889, 927, 1172, 419, -495, -1311, -299, -1730, 28, -323, -1171, -996, 458, 72, 724, -559, 830, 695, -979, 207, -584, -167, -884, 111, 2584, 642, 760, 944, 425, -734, -98, -12, 615, -143, 632, -287, -385, 13, -41, -726, 626, -118, + -174, -227, -504, 70, -236, -327, -468, -374, 234, -271, 229, 253, -176, -305, -403, 183, -69, 170, 628, 384, -2, -56, 205, 385, -379, 339, -382, -295, -198, -1053, 431, 324, -507, 150, -272, -1572, -433, 364, -203, 151, -886, 1109, -1507, 98, -1110, 737, 811, 253, 675, 59, -740, 1205, -594, 111, -4, -722, 1138, 63, 278, 237, 339, 176, 847, 1008, 323, 1181, -1064, -97, -22, 1515, -315, 1204, 660, 1661, 308, -397, -557, 650, -1276, 1168, -736, -439, -220, 223, 876, -226, -1648, -468, 2614, 179, -1681, 394, -1120, 310, 2575, -731, + -732, 1786, -1965, 966, 425, 571, 1670, 1053, -1524, 1834, 1199, 40, 1954, -827, -290, 1413, 924, 155, 366, -17, -36, 157, 474, -458, 502, 517, -459, 215, 345, -650, -74, 222, -74, 106, 791, -2, 522, -298, -6, 374, -257, -218, -542, 76, 470, 308, 442, -864, 463, 541, 241, 83, 219, -53, 495, 889, 211, 422, 404, -223, -245, 416, -544, 199, 642, 878, 1688, 832, -832, 1073, 312, 966, -297, -1837, 1836, 1589, 974, 3015, -296, -2563, -1328, -1220, 2678, 1958, 466, -190, -503, -1799, -856, -596, -1033, 2717, 2211, 3067, 48, -3553, + -5510, -2703, 3056, 4114, 4214, 1681, -3509, -6453, -3952, -2012, 2960, 5023, 2858, 1536, 410, -2298, -3064, -2311, -178, 1752, 3592, 4277, 760, 818, -3417, -5679, -3020, 2796, 4729, 4463, 2799, -1669, -5504, -3586, -4616, -6, 3131, 3361, 1696, -1367, -2898, -2592, -2030, 578, 1930, 1333, 3904, 1387, -872, -2330, -855, 2579, 3802, 1261, -147, -2347, -470, -544, 1503, 548, -381, -1628, -480, 70, -256, -502, -103, 362, 816, 1355, 665, -1371, -1202, -1147, 274, 1429, 1611, 727, 175, -1045, -440, -2030, -1777, -170, 533, 2198, 3334, 1250, -1155, -2759, -3415, -1449, 2691, 4420, 3049, 913, + -2218, -3639, -1770, -21, 669, 644, 1553, 776, 351, -933, -1948, -1487, 216, 979, 1955, 910, 337, -371, -975, 1155, 178, -1639, 227, -416, -649, 512, -494, -187, -870, 67, -323, -645, 280, -59, 237, 123, 565, -522, -165, 183, 77, 272, -213, 571, -373, 399, 198, -160, -393, -158, -751, 856, -58, 48, -127, -179, 64, -4, 40, 344, 211, 12, 488, -384, 163, -363, 440, 279, -300, 246, -370, -416, -336, -653, -55, 530, -445, -896, -612, 77, 577, 34, 435, -852, -213, -80, -64, -832, -199, 50, 139, -284, 904, 380, -275, 842, + -69, -1447, -49, -192, -121, 305, 197, 412, -448, 653, -1069, 333, 200, -24, 9, -49, -65, 384, -59, 86, -154, 6, -308, 103, 10, 652, 2, 301, -284, 57, -139, -350, 122, 13, -178, 472, -80, -94, -177, 353, -120, -601, 133, -100, 198, -242, 32, -53, -377, 376, -334, 266, -319, 195, -27, -96, -185, -880, -1451, -2287, 97, 1910, -713, -1153, -1232, -1164, 259, 256, 2201, -305, -300, -961, 123, 308, 703, -720, 385, -521, 871, 285, 295, 114, -519, -279, -333, -104, 325, -310, -269, 615, -537, -333, 514, -465, -160, -397, + -651, 246, 452, 91, 427, -616, -144, -9, 378, 460, 572, 49, -43, -932, -952, -348, -298, -202, 460, 618, 875, 104, -377, 871, -600, -266, 399, -261, 1147, 66, -173, 200, -397, 337, 800, 651, -216, 251, -746, -489, -266, -180, 581, -65, 568, 155, -166, 74, 115, -653, 409, -481, 320, -217, -122, -27, 376, -336, 59, 68, 331, 559, -265, -75, -423, -170, 167, -166, 136, -128, -164, -298, -463, -257, 452, -165, 231, -308, -57, -19, -84, -275, -112, 38, -18, 10, 16, -420, -55, -91, -73, -1, -10, -14, 600, -1480, + -3462, -2645, -304, 1147, 2989, 2524, 2409, 2461, 1624, 685, -886, -1571, -3001, -2210, -2173, -2165, -1347, 1309, 1762, 2591, 1988, 1667, 550, 1113, -250, -286, -349, -606, -1136, -930, -1914, -696, -1520, -723, -360, 500, 100, 714, 165, 1000, 734, 1209, 1605, 1995, 1275, 858, 1416, 111, -482, -1748, -2052, -2821, -2516, -2350, -902, -1542, -808, 97, 425, 999, 1901, 2028, 2264, 3423, 1925, 2623, 1817, 417, -279, -1072, -2738, -2991, -2851, -3160, -2323, -1617, -1301, -353, 665, 1119, 1417, 2113, 2239, 2362, 2227, 1393, 968, 464, 49, -3, -675, -1097, -1592, -1887, -2010, -1896, + -1337, -596, -540, -199, 353, 950, 1176, 2237, 1571, 1248, 1239, 453, -55, -317, -400, -415, -1087, -967, -707, -731, -543, 77, 163, 220, -136, 362, 4, 427, 428, 149, -157, -11, 86, 67, 60, 207, 35, -92, -324, -64, 61, 0, 183, 161, -45, -20, -147, -97, -86, -38, -75, 54, -53, -19, -29, -64, -133, 1, -14, 85, 165, 132, 78, 115, 6, 12, 10, 31, -35, -23, -45, 11, -18, -63, -76, 7, 5, -7, -68, -70, -74, -67, -40, 38, 32, 65, 64, 63, 4, 35, 25, 41, 34, 73, 56, 58, + 2, -41, -68, -53, -78, -67, -72, -57, -75, -47, -27, 0, 13, 38, 51, 84, 86, 104, 71, 52, 24, 17, -27, -49, -68, -73, -72, -43, -35, -19, -10, 5, 6, 18, 17, 20, 17, 16, 9, 8, 3, 3, 0, -1, -3, -3 } + }, + { + {-284, 220, 11, 101, 100, 285, 134, -105, -133, -185, 133, -162, -118, 27, 41, 18, 167, -55, 156, -40, 140, -133, 61, -59, -142, -10, -271, 41, 66, 121, -99, -1, 105, -78, 118, 112, -67, 80, -90, -42, -67, -97, -124, 111, 163, -122, 72, 131, 106, 161, 20, -24, 93, 71, -170, -6, 19, 11, 53, 110, 24, 40, -59, -37, 77, 110, 60, -58, -102, 113, -92, -29, 63, -19, -5, 48, 11, 3, 102, -100, 75, 42, 49, 95, -39, -10, -33, -13, 3, 47, -37, -6, -26, -14, 1, -3, + -16, -10, 10, 14, -1, -5, -11, 2, -4, 2, -16, -3, 14, -32, -16, 113, -59, 83, 8, -7, -229, 37, 195, -119, 81, -243, -246, -81, -200, -174, -26, 37, 138, 22, -66, 32, 94, -120, 168, -113, -123, 143, -70, 164, 208, 29, -150, 106, 69, 43, -76, -55, 88, 74, 15, -169, -49, -156, 142, -141, -92, 105, 5, 91, 26, 35, 154, 27, 173, -222, -114, -51, 110, 157, 178, 243, 26, -68, -23, -32, -7, -157, -69, -68, -19, 25, -128, -75, -29, -54, -100, 121, -120, -40, 80, -205, + 62, 113, 125, 66, 36, 75, -37, -79, -20, 22, -9, 22, 4, -21, 2, -31, -38, 47, 21, -3, 0, 1, 35, 17, -14, -13, -14, 4, 26, -30, -5, -1, -6, 18, -1, -11, 260, -193, -73, -38, 160, 144, -146, -14, -271, -59, 328, 124, -132, 236, 77, 91, 24, -79, -259, 35, -117, -74, -48, -158, -56, -122, 85, -55, -72, 147, -279, 256, -91, 36, -87, 80, -11, -26, -7, 109, 5, 69, -100, 192, -150, 223, 47, -22, -125, -147, 303, 52, -285, 291, 274, -149, -55, 86, -113, -21, + -70, 69, 175, -107, 40, -80, -73, 29, 235, -216, 131, -223, -172, -161, -29, 4, -1, 135, 208, 54, 50, 102, 82, 45, 51, 61, -23, 66, -31, -65, 110, -6, 15, -20, -33, -19, 0, 47, -12, 10, 4, -42, 0, 23, 29, -4, 20, 68, -106, 6, -203, 184, -283, 6, 285, -533, 363, 142, -145, 111, -15, 315, -38, -270, -190, 103, 119, 31, 4, 131, 36, 18, 180, 71, 48, 128, 91, 452, -130, 117, -11, -79, 114, 69, 42, 53, -79, -131, 4, -5, 2, 62, 135, -147, -155, 61, + -40, -62, -94, 181, -137, 264, 122, 7, 59, 18, 69, 336, 283, 17, 12, 61, -72, 123, -32, 111, 32, 3, -4, -150, 136, 102, -35, -88, 8, 129, 10, -42, 4, -106, 70, 23, 90, -29, 24, 35, 36, 28, 53, 22, 22, -128, -11, 44, 66, -47, 42, 37, 34, 37, 15, 28, 37, 41, 4, 13, 10, 16, 3, 7, 25, 6, -8, -32, 14, 37, -34, 67, -32, 147, 3, 170, -66, 151, -115, 316, -243, -91, -116, 326, 184, 119, 207, -188, -38, 300, 171, 140, 146, 77, 100, -35, + 289, -31, -133, -100, 101, -110, 66, -274, 101, -54, 5, -295, 127, -64, 276, -46, 87, 74, -116, -30, 126, 16, 86, -64, 153, 215, 28, -153, 59, 151, 110, 18, -103, -215, 179, -239, -100, 131, -314, -74, 196, -147, 42, 1, -17, -44, 80, -159, 10, -264, -135, -360, 28, -103, 9, -72, -10, -93, 83, 76, 33, -59, 77, -11, 31, -106, 28, 19, 35, 20, 73, -12, 82, -38, -4, 53, 77, 9, 43, -51, -16, -17, -17, -38, 25, 55, 18, 59, -56, -38, -31, -85, 11, -15, 41, -15, + -14, -89, 90, -574, 106, -178, -102, 137, 105, 75, 29, -420, -41, 137, -225, -55, -309, -154, 73, -33, -284, 304, 184, -87, 36, 240, -149, 68, -101, -160, -109, -293, -108, 229, 108, 291, -143, -464, -200, 119, -148, -301, -50, -53, 281, 147, -323, 222, -228, -10, -165, -156, -151, -356, -212, 30, 233, 353, 225, 69, 141, -156, -266, -162, 170, -79, 184, -52, -169, -5, 17, -79, -190, 15, 145, -465, -308, 440, -141, 12, -240, 118, 66, -25, -18, 163, 119, 39, -49, -57, -10, -64, 38, 50, -92, -44, + 35, 13, 1, 30, 92, -94, -44, -174, -72, -24, -33, 12, 26, 53, 4, 67, -76, -52, 14, 18, 26, -62, -35, -86, -4, 32, 216, -12, 106, -157, 106, -213, -20, 355, -175, 335, 339, 420, 101, 165, 361, 282, 205, -289, 31, 85, 240, -53, -217, 268, 271, -83, 178, -96, -102, 169, 144, -25, 172, 11, -297, -237, 245, 361, -35, -130, 71, 7, -180, -330, 164, -312, -157, 232, 43, 205, 2, 330, 40, 363, -433, 383, -82, -18, 110, 201, -171, -356, -107, 321, -70, -381, -230, -234, 55, 134, + -336, 164, 183, 339, 98, 105, -6, 94, 10, 73, 44, -252, -35, 117, 76, 200, -140, -43, -10, 15, 88, 11, 72, 31, -47, -19, 68, 68, 19, 74, 13, 32, 92, 0, -62, -29, 14, 47, -15, -25, 72, 40, 9, -84, -35, -49, -50, -5, 78, 4, 73, 58, 46, -7, 4, 114, 367, 46, 153, 436, 470, 140, 118, -349, -177, 384, -287, 393, 110, -2, -79, -138, -228, 41, 173, -423, -193, -180, 93, 85, 92, 13, 71, -16, 127, 104, -113, -198, -367, 65, -199, 330, 12, -183, -231, -70, + 152, -287, 179, -96, 58, -3, -206, 204, 256, -176, 215, 62, -18, 617, -156, -399, 75, 151, -101, 34, -175, 420, 242, -41, -91, 298, 283, -59, -244, -175, 581, -53, -82, -234, -154, -46, 55, -60, -156, 252, -81, 299, 85, -93, -34, 55, -3, -50, -53, 107, -134, -31, -37, 174, 14, -36, -6, -86, -83, -9, 16, 183, -44, 109, 39, -56, 35, 10, -89, 70, -45, 96, -11, -93, -72, -52, -72, 2, -24, -27, 30, 36, 49, 22, 156, -317, -87, -97, 31, 141, 321, 281, -439, 14, 56, -41, + -128, -301, -27, 107, 185, 151, -276, -45, -351, 336, 19, -29, 164, -154, -25, -374, 68, -222, 160, -26, -59, -124, -247, -240, -25, -297, -487, -88, -220, -468, -34, -37, -254, 172, 263, -29, 127, -29, -37, 74, 80, -379, -109, 213, -180, 460, 86, 125, -291, 0, -129, -298, -28, 427, 200, 325, 183, -137, -338, -531, 362, 371, -40, 193, -413, 203, 174, 303, 49, -354, -42, -329, -112, 31, -104, 74, -70, -107, -25, 35, -13, -33, 102, -28, 42, -238, 8, -17, -34, -107, -43, 75, -98, -116, -39, -40, + -45, 2, -25, -128, -102, -63, 41, 46, 80, 39, 74, 27, -91, 21, -12, -56, 39, -108, 50, -57, -6, 76, -824, -203, 661, 223, 272, -168, 274, 462, 37, -74, -761, -175, -33, 442, 126, 179, -569, -150, -210, -132, 359, -197, -67, 66, 105, -177, -76, 96, -157, 354, -389, 47, 261, -332, 279, 473, 549, 267, 270, 363, -243, -447, 183, 200, 301, 242, -507, -141, 270, 159, 100, 324, 74, 377, -136, -76, 216, 202, 62, -323, -173, -348, -401, -19, -439, 28, -255, 23, -232, -133, -565, 396, 105, -79, + -100, -59, 78, -205, -28, -488, -269, 177, 225, 97, 77, 25, -257, 124, 120, 97, -246, 62, 11, -191, -65, 40, 32, -96, -146, 54, -71, -85, -21, 27, -17, -6, 51, -40, 71, -6, 101, -38, 90, 145, -98, 84, 8, 60, -60, 0, 82, 71, -121, 71, 65, 521, -251, -214, -190, 359, 455, -283, 730, 155, -309, 374, 108, -302, -355, -286, -22, -153, -104, -473, 192, 199, 658, 90, -110, -295, -309, 80, -35, -414, 75, -153, 22, 322, -247, 425, -371, -312, -20, -486, -581, 96, -65, -672, 48, 9, + -319, 169, -154, 86, -453, -741, 489, -453, 757, 413, -538, -69, -545, -147, -68, 227, -195, 347, 438, 415, -298, -244, 40, -367, -33, -119, -483, 290, 216, -258, 383, -566, -53, 34, -147, -95, 494, 364, 243, -30, -256, -208, -192, 85, 81, -16, 57, -15, -21, 10, -19, 20, 99, -117, 48, -8, 109, -63, -10, 62, 146, 57, 118, -139, -150, 72, -100, 24, 1, -162, -89, -97, 3, 52, 49, 32, 39, -23, -450, -345, 210, 257, 285, 489, -193, 907, -38, -483, 198, 443, 115, 228, -210, -517, 755, 415, + 304, 140, -274, 237, 627, -243, 127, -15, 125, 101, 444, -139, 145, -168, 129, -51, -33, 273, 51, -570, -386, -535, -370, -287, -148, -411, -237, -206, -359, -251, 145, -373, -135, -291, 669, 337, 581, -542, -59, -496, -112, 540, 292, 638, 298, 392, -433, 184, 179, 590, 597, 174, 539, -480, -235, 345, -1249, 15, 194, 19, 298, 192, 689, -61, -106, 750, 219, -74, -349, -14, -4, 614, 73, 10, 40, 119, 184, -41, -45, 194, 86, 59, 96, 139, 102, -14, 15, 13, 197, -43, 99, 194, 137, 217, -108, -80, + 43, 66, -85, 0, 118, 201, -23, 56, 21, 534, 347, -349, 683, 406, -34, -170, -86, 410, 1008, 539, 145, 43, 331, -80, 814, 461, 508, 21, -259, 173, 61, -432, -107, -27, -103, -123, 165, 91, -356, -169, -628, -64, -196, -806, -363, 26, 301, -414, 519, -143, -125, -69, -128, 379, -256, 266, -829, 258, 360, 280, 550, -543, 471, -487, -367, 411, -241, -71, 341, -552, 490, 790, -18, -112, 1003, -214, 191, 569, -1211, -616, 38, 39, 161, 293, 585, 356, -465, -368, -113, -129, -628, -58, -128, 157, -656, 11, + -200, 269, -102, 341, 87, 6, -197, -139, -186, -189, -151, 137, -401, 288, -51, 162, 5, -21, -275, 153, -197, 53, -209, -107, -6, -86, -239, 22, -78, 31, -165, -171, -193, 39, 35, 243, 249, 3, 0, -304, -181, -957, -575, 707, 703, 77, -165, 596, -960, -515, -1039, 456, 127, 48, 203, -472, 241, 331, 433, 733, 753, 633, -24, 144, 9, -274, -56, -228, -117, 873, -202, -800, -201, -164, 73, 1258, -453, -449, 426, -679, 236, -754, 987, 280, -27, 254, -380, -480, 677, -820, -656, -589, 165, 248, 308, -547, + 563, -172, 43, 868, -58, -146, 256, 700, -452, 1161, 44, -1334, -162, -50, -445, -127, 0, -124, -364, -305, 658, 442, -161, 428, -767, 217, 345, 216, 26, 412, -67, -17, 154, 403, -166, -173, -136, 20, 152, -76, -316, -338, 17, -158, 119, -2, 84, 183, -221, -144, 383, -86, 70, -27, 11, -128, -145, -71, -48, -201, 99, 189, 105, -1, 18, 87, -155, 39, 179, -15, 153, -84, -277, -373, 10, 161, -276, -129, 1270, 750, -1033, -835, 1021, 973, 607, 698, -1229, -274, -342, 318, 114, -499, -909, -1374, 396, 356, + 101, 371, -192, -74, -330, 267, 469, 420, 107, 560, 177, -69, -235, -837, -49, -355, -295, 284, -897, 75, 32, -422, 360, 329, 161, -606, -563, -1478, -379, 5, -476, 78, 307, 304, 819, 399, -368, -261, -552, 687, -295, 1193, 998, 272, -644, 1318, 605, -542, 78, 659, 1536, -642, -1181, -613, 12, -431, 182, 419, 351, -315, -485, -272, -404, -446, 118, 472, 379, 209, 187, 63, 318, 37, 48, 461, 363, -28, -157, 99, -247, 254, -96, 260, -140, 100, 66, 170, 224, 127, 102, -228, -438, 45, -224, -119, 128, 33, + -67, -91, 312, 97, 423, -143, 225, -220, 218, -301, 290, 4, -253, 499, 172, -188, -503, 404, -847, -784, -288, 591, -353, -450, -13, 682, 64, 705, -248, 853, 91, 453, -311, -212, 265, -899, -256, 327, -167, -129, -724, -685, 307, -421, -304, 546, 754, -120, 493, -908, 48, -253, 1162, -490, 383, 708, 675, 192, -482, 296, 212, 200, 372, -1159, 2119, 672, -192, 105, 233, 584, -169, 448, 1234, -77, -1536, 634, 529, -550, 716, -164, -325, -827, 1584, -823, 1764, -1170, 433, -28, 1917, 846, -824, 782, 31, -515, 383, 55, + 170, 424, 180, -499, -131, 581, 154, 327, -272, 361, -622, 226, -38, -205, 383, -219, -123, 273, -50, 37, -51, 462, -308, 451, -271, 417, 586, 215, 157, 322, -87, -236, -228, 277, 95, -51, -6, -77, -425, -329, -68, 10, -98, -251, 1461, 177, 794, 407, -800, 53, 478, -140, -696, -131, -1521, -423, -565, -325, 335, -41, 547, -264, 61, 535, -472, 55, 305, -26, -518, 3, -355, 1055, -183, 613, 100, -7, 1079, 780, -473, -553, 274, 492, 593, 722, -12, 257, 682, -33, -273, 217, 25, -600, -13, 402, -594, -796, + -75, -44, -85, -265, -289, -950, 0, 940, 289, 525, 308, -122, -1232, -900, 243, 802, 261, 407, 1620, 1686, 1423, -109, 707, -447, -1194, -1987, 347, 250, -88, 281, -629, 140, -153, 735, -54, 591, -721, 360, -886, -167, 375, 68, -451, 111, -371, -397, -171, 111, 339, 442, 575, -133, -31, 154, -157, 190, -595, -503, -353, -470, -458, -480, 316, 236, -81, -312, -485, 302, 6, 474, -114, 421, 305, 27, 132, 504, -593, -549, 342, -41, -117, -259, -458, -957, 264, -576, 273, -254, -677, -214, -10, 326, -289, 163, -990, 916, + -2070, -213, -521, -429, 272, 1176, 185, 423, -1022, 222, 371, 807, -427, -663, -461, -229, -35, -23, 487, 352, -294, -1497, -712, -1218, 137, 2134, -1517, -605, -236, 1231, -417, 518, -398, 591, -239, -366, -771, 391, -893, 819, 1484, 187, -277, -283, 1231, 323, -14, 648, 211, 231, -240, 1422, -2245, 1619, -1369, 644, 1600, -1290, 2596, 1767, -669, -227, 1785, 648, -172, 1173, 1052, -1377, 1841, -1120, 325, 349, -497, 351, 600, -377, -678, 215, -366, 152, 152, -190, -532, 206, 186, -221, 220, 175, -429, 1040, 111, 17, 19, -216, 157, 136, + 52, -345, 174, 43, -152, -303, 642, -249, 521, 594, -64, -226, 154, 143, 228, 717, 617, -562, 255, -231, -37, 820, -164, 226, 319, -56, 1513, 1442, -1232, 1200, 1105, -1040, -1569, -2319, 539, 3478, 1429, 5, 717, -3329, -1375, -120, 506, 2501, 2448, 421, -945, -1846, -1081, 123, 790, 1194, 1925, 1160, -1553, -3670, -2990, -296, 3326, 3617, 2286, 696, -769, -1480, -2234, -1276, -1359, 2660, 2215, 1397, 1239, -1886, -2639, -3065, -2743, 1053, 3714, 4570, 1546, -1389, -3256, -3909, -1063, 625, 403, 2440, 958, -927, -548, -1885, -411, -2154, 931, 2545, 4768, -294, + -2550, -5543, -217, -1877, -199, 2651, 526, -248, -1185, -2500, -1636, 1193, 1934, 632, -338, -855, -1018, 987, 1140, 699, 610, 267, 569, -61, 54, -560, -257, 57, 1438, 1252, -65, -546, -140, -1290, -862, -39, 491, 1321, 1024, 719, 67, -1796, -1611, -1098, 423, 1719, 3345, 2041, -1542, -2785, -2453, -996, 70, 2283, 2883, 2143, 379, -1720, -3887, -2458, 792, 2404, 2756, 797, -404, -1079, -1267, -735, -234, 262, 606, 758, 607, 139, -53, -533, 27, -314, 1572, 921, -135, 337, 173, -1113, -113, -87, 125, 38, 93, -405, -160, -147, -99, -182, 672, -237, + 291, -500, -47, 211, -20, -149, 1158, 163, -650, -756, 163, 163, -443, 127, 584, 305, 550, -555, 173, -16, 135, -390, 79, 440, 622, 160, -157, 185, 74, -140, 425, -619, 144, -1010, -314, 422, -340, -404, 555, -348, -943, -729, 652, -78, -125, 152, 332, 825, -532, -695, 33, -93, 560, 7, 329, 152, -51, 857, -1109, -160, -153, -650, 171, 369, 20, -386, 177, -85, 115, -334, 251, -15, 44, -27, -78, 436, -431, 36, -70, -154, -135, 53, -184, 201, 260, -263, -63, -99, 238, 261, -126, 321, 36, -44, -210, 232, + 85, -89, -350, 169, -317, 209, -169, -155, 300, 295, -395, 49, -88, -393, 134, -229, 264, -226, -914, -1008, -2405, 701, 693, -45, -2027, -1309, -189, -329, 1361, 919, 444, -895, -367, -234, 853, 97, -238, -523, 352, 159, 426, -19, -169, -212, -482, -239, -291, 816, 437, 100, 125, -530, -25, 69, 744, -49, 349, -271, -189, 155, -302, 206, 92, 221, 726, -59, 637, -4, 410, -311, 30, -459, -597, -627, -537, 182, 97, 51, -793, 397, -690, -74, 39, -429, -467, -244, 11, -822, -557, 518, -247, 483, 78, -128, -445, -512, + -31, 737, 910, -222, -91, -337, -453, -310, 292, 158, 113, 289, -54, -184, 199, 113, 166, 253, -138, 88, -26, 10, -188, 333, 105, 80, -97, 52, -6, 516, 66, 158, -286, 24, -185, 340, 24, 10, -117, 82, -38, 9, 161, 20, 211, -138, 69, 27, -269, -10, 154, 64, -55, 93, 541, -1165, -2888, -2768, -421, 837, 2784, 2406, 2268, 2437, 1356, 328, -1231, -1236, -2570, -1995, -1750, -1110, -1397, 1922, 1580, 2082, 1200, 1701, -63, 448, -274, -663, -381, -793, -924, -919, -908, -1073, -787, -638, -74, 170, 1508, 1267, 666, 718, + 994, 925, 444, 2149, 278, 29, 402, -802, -2466, -704, -1977, -2118, -2240, -1583, -1412, 72, 1168, 1194, 1456, 2652, 1907, 2328, 2285, 1460, 1567, 537, -554, -1790, -2352, -2684, -1748, -2409, -2027, -2313, -1352, -160, 632, 1874, 1785, 1816, 3019, 2107, 2495, 1557, 257, -292, -759, -1249, -1402, -1482, -1448, -1665, -1431, -1044, -644, -331, -254, 725, 685, 971, 1563, 1766, 1116, 1349, 828, -49, -369, -811, -1020, -870, -756, -910, -336, -224, 17, 259, 283, 74, 36, 254, -40, -218, 198, 121, 140, 225, 63, 61, 132, 312, 262, 124, 22, -67, -269, -199, + -245, -208, -87, -160, -145, -77, -66, -85, -27, 102, 96, 125, 194, 134, 92, 129, 46, 56, 53, 38, 31, 14, -36, -77, -148, -113, -122, -96, -52, -20, -47, -28, -39, 7, 34, 59, 111, 111, 43, 46, 20, -15, 27, 22, 6, 38, 11, -14, -33, -27, -33, -26, -29, -9, -18, -21, -67, -76, -75, -53, -13, 23, 63, 81, 83, 90, 71, 78, 53, 26, 4, -11, -41, -62, -75, -67, -71, -57, -56, -47, -22, 4, 16, 38, 55, 64, 61, 53, 36, 22, 4, -3, -14, -16, -18, -16, + -15, -11, -9, -5, -3, -1 }, + {-134, 227, 80, -40, 58, 74, 137, 228, -108, 76, -92, -71, 46, 2, 20, -159, -77, 57, 114, -14, 96, -171, -152, 97, 62, 27, 70, -58, 124, 139, 134, 193, -106, -87, 7, 26, -183, -10, -15, 52, 19, -114, -28, 158, -83, 32, -95, 47, 49, 33, -142, 117, 11, 27, -19, -46, -59, -96, 208, -35, -38, -45, 93, 23, -196, 51, -89, -133, 80, -82, -212, 86, 31, 11, -195, -236, -97, -115, 110, -30, 0, -52, -64, -52, 2, 99, 18, -42, -3, -44, -20, 45, 13, -39, -55, -17, + -23, 23, -14, 10, 8, 25, 6, 35, -14, 10, -8, 26, -1, 24, 27, 131, 14, 10, 116, -178, 28, -149, -188, 52, 173, -110, 81, -83, -41, 34, 7, -88, -258, -256, 3, -66, -4, 132, 20, 162, 219, -118, 189, 22, 192, 11, 228, 28, -130, -37, 12, 103, -30, -36, 21, 78, -97, -8, -31, 68, 84, 3, -88, -8, -17, 48, 89, 159, -57, 103, -48, -142, -126, -86, 78, 84, -48, 137, 3, 49, 6, 167, 111, 123, 50, 71, 44, 66, 137, -31, -8, 193, 38, 4, 40, -75, + 10, 56, -5, -184, 56, 17, -30, -65, 41, 10, 98, -39, -19, -40, -32, 23, 6, 38, 18, 7, -37, -31, -18, -20, 15, -50, 41, -19, 12, -14, -18, -29, 15, -24, -17, -54, 199, -200, -134, -110, -162, 53, 72, -130, 32, 271, -195, 138, 234, 231, -140, -37, 116, 23, 37, -102, 58, -349, 276, 432, 78, 146, -68, -4, 230, -119, -274, -44, 6, 1, -221, 18, 57, -264, -123, 125, 44, -93, -23, 93, -127, 276, 88, 14, -174, -16, 97, -58, 8, -61, -2, -25, -139, 10, -135, 208, + -197, -131, -43, -237, 162, -127, -330, -60, -141, 42, 155, -154, 21, -104, 110, 16, -107, 96, -117, -156, 177, -112, 52, 6, 18, 63, -32, -52, -57, -94, 34, -134, 10, -26, 45, -39, -1, 2, 6, -70, 67, 4, 15, -37, -25, -28, -4, 42, -156, 98, -5, -31, 116, -112, -391, -77, -25, 170, 241, 213, 102, -85, -27, -241, -205, 70, 273, -79, 280, 178, -175, 93, -28, 97, -195, -131, 31, 140, -19, 83, 115, -219, -45, -101, -300, 185, 28, 67, 128, 237, 81, 11, 184, -43, -96, 191, + -102, 323, 147, 128, 5, -93, -114, 158, 214, -160, 37, 205, -38, 67, 452, -137, -56, 88, -229, -9, 39, -101, 109, -73, 67, 225, 6, -51, -155, -12, -192, 81, -72, -93, -41, 37, -56, -54, -48, 11, 68, 53, 13, -16, -23, -15, -12, -31, -58, -10, -19, 31, -2, 16, -59, 25, 28, -20, -52, -17, -54, -26, -25, 40, 2, -7, -6, 10, 4, 22, -82, -20, 24, -102, -561, -47, -14, -114, -175, -59, 298, -215, -320, 117, -131, 43, 55, 199, -139, -43, 37, 185, -90, -125, -39, -108, + 136, 250, 125, 0, -23, -147, -11, 395, 68, -51, 457, -30, 339, -105, 1, 230, 68, 56, 81, 39, 125, 72, -220, 403, 244, 331, 221, 145, -224, 96, 111, 15, -138, 374, 226, 338, 59, -70, -86, 248, -124, -260, 302, 93, -169, -99, 13, -80, 28, -37, 41, -107, -31, -247, 92, -32, -8, 88, -32, -48, 142, -12, 110, 148, 121, 77, 77, 30, 44, -1, -33, -31, 64, -20, -42, -44, 30, -49, -14, -11, 80, 32, 57, -57, 16, -46, -17, 55, -9, -25, -19, -17, -34, -24, 23, -3, + -16, -144, -23, -369, -147, -412, -283, 28, -269, -212, 22, -49, 272, -185, 301, 371, 36, -319, -225, 333, -173, -94, 185, -247, -438, 172, 373, -195, 93, -9, 161, -456, 88, -184, 107, 7, -193, 315, 142, 132, 419, 195, 84, 237, 45, 76, 117, 39, 16, 64, 55, 479, 267, -3, 400, 251, 294, 464, -241, -200, 404, -143, -19, -243, -106, 144, 213, -186, -25, 60, -56, 111, -199, -38, -230, 438, -146, 238, -72, -118, 319, 55, -99, 104, -44, 8, -95, 121, -27, 43, 127, 74, 35, 73, 1, -13, + 48, 12, -94, 18, -23, -43, 77, -1, 35, 32, -23, 15, -57, 10, -53, 3, -24, 58, 11, 50, 9, 60, 12, 27, 32, 6, 138, -150, 47, 20, 46, -214, 276, 160, 375, 72, -52, -426, -228, -161, 108, -222, -369, -104, 93, 39, -412, 332, 25, -26, -351, -203, 82, 42, -389, -123, 142, 14, 39, 198, 232, 134, -61, 116, 36, -141, -288, 494, -125, -243, 5, 121, 160, 369, 61, -9, -139, -6, 206, -28, 257, 490, 42, -109, 15, 422, 530, -266, 74, 72, 287, 150, 51, 86, -211, 130, + 137, 134, -91, 6, 105, 156, -22, 52, 37, -181, 87, 6, -161, -120, 172, -79, 120, -174, -130, -61, 40, -5, 156, 68, 29, 5, 79, 69, 24, -133, 7, -57, 23, -44, -30, -4, -11, -21, -43, -131, -34, 11, -84, -58, -53, 0, -53, -93, -19, 40, 72, -27, 22, -37, 27, -140, 193, -176, -318, 216, -28, -79, 81, 184, -532, 31, 404, -49, 728, 347, -225, -166, -71, -213, -96, 324, -128, -109, 324, 263, 85, 150, 303, 200, 226, -169, -117, 288, -59, 261, -1, -315, -204, 83, 245, -343, + 19, -184, 93, -210, 287, 287, -285, -32, 80, -11, -384, -173, 63, 251, 414, 140, -311, -70, -77, -38, 259, 40, 207, -317, 139, 20, -253, 295, 124, -41, -69, 50, -14, -257, 190, -60, 112, -200, -353, -196, 81, 155, 1, 85, 312, 2, -83, 197, -64, 185, 9, 59, -162, 15, 2, 84, 92, 131, 81, -34, -41, -63, 154, -74, 79, 16, 47, 63, 85, 38, -33, 78, 28, 25, -33, 105, 48, 21, -108, 37, -44, -2, 70, 20, 335, -419, -69, -136, 425, -193, 350, -112, 326, 443, -200, 138, + -116, 251, -99, 209, 173, 163, -40, 171, -90, -224, -108, 244, -291, 43, -3, 217, 443, -410, 12, 396, -12, 362, 48, 157, -52, -34, 97, -566, 54, -17, -226, 146, 91, 405, 202, -44, 774, 190, -410, 105, 38, 268, -178, 49, 227, 15, 138, -44, -448, -461, -1, -158, 366, -625, 797, -8, 443, 505, 121, -138, -103, -243, -318, -31, 101, -84, 158, -111, -256, -165, -130, 42, -41, 24, 170, 82, 80, 59, -73, -92, 4, -23, 48, 8, 18, 50, 98, 55, -199, 32, -39, 140, 144, 80, -15, -47, + 56, 41, -71, -78, -20, -55, 13, -58, -97, 34, 159, -46, 63, -127, 15, 66, 73, -8, 46, 98, -77, 33, -738, -51, 252, 42, -277, -686, 1, 79, -119, -28, -201, 107, -167, 354, 126, -210, -262, -451, 339, -143, 24, 440, 606, 369, -55, 32, -413, -177, -165, 112, -587, 154, 162, 34, -301, 291, 454, -73, -6, 53, -260, -277, 161, 109, 344, -376, 410, -215, 227, -348, -273, -138, -7, -41, 151, -75, -606, -456, -126, 16, -608, 8, 304, -162, -68, 92, 259, -537, 277, -95, -78, -3, 222, 274, + -320, -165, -214, -106, -76, 159, 55, -195, -85, -150, 106, 356, 238, -2, -8, -200, 10, -122, 171, -31, 296, 97, 105, -106, 9, 3, -231, 249, 22, -45, 133, -47, -37, -13, 22, -204, 92, 123, 134, -22, -45, 43, 77, -74, -40, 70, -151, 15, -1, 143, -8, 663, 16, -135, 516, -113, -210, -56, -48, 639, 732, -96, 155, 186, -94, -348, 171, 680, 519, 443, -161, 192, 365, -475, -353, 414, -211, -233, -16, 517, -78, 476, 31, 427, -256, 587, 179, -183, -300, 107, -424, 50, -503, -173, -180, 287, + -288, 474, -581, -1007, 629, 281, -123, 5, 694, 325, 56, -183, 151, -82, 9, -451, -456, 268, -152, 148, 862, -226, 186, -563, 666, -223, -296, -143, -92, 277, -562, 471, -551, 398, -283, -386, 386, -17, 128, -157, 229, -125, -172, -78, -262, 181, -7, -172, -71, 63, 283, 53, 42, 74, -5, -49, 145, -81, 67, 59, -70, -21, -14, 201, 179, -65, -95, -212, -1, -44, -27, -35, 9, 193, 61, -24, 248, 119, -754, -560, -543, 760, 26, 326, 195, -668, -584, 393, -1043, 305, 311, -67, -414, -382, 651, -350, + -45, -109, -336, 494, 158, 447, 261, 308, -97, 502, -45, -329, -386, -89, 219, -294, 391, 250, -293, -1057, -88, -87, -25, 767, 19, -602, -355, -368, 316, -233, -499, -560, -346, -273, -1244, 29, 157, 408, -649, 212, -536, -441, -149, 519, 135, 482, 914, 273, 211, 593, -462, -61, -219, -256, 478, 439, 702, 342, -640, -429, 505, -760, -833, -265, 610, 94, -147, 412, 340, -6, 98, 349, -229, 205, -168, -36, -175, -36, 48, 243, -155, -201, 1, 135, 46, 123, -18, -202, -46, -135, 12, -114, -20, -20, -221, 176, + 29, 179, 233, 314, -118, -175, -12, 25, 18, 350, -341, -702, 181, -19, -23, 16, 87, 138, 295, 89, 247, 131, 294, 776, 17, -1033, -385, 249, 0, -223, -668, -444, 129, 523, 197, -521, 263, 206, -586, -120, -723, 549, -307, -383, 507, -512, 130, 1066, -137, 164, 308, -14, 147, -644, 143, 99, 92, 1403, 948, -118, -504, -340, 434, 503, -578, -329, -772, 1195, 322, 126, -205, -145, -280, -163, 858, -246, 224, 854, 135, -259, -656, 2, 246, -1310, 270, 127, 874, 590, 460, 776, 435, -172, 66, 261, -102, 23, + -69, 110, 57, 723, -34, 288, -143, 277, -38, 375, 70, 93, 343, -45, 134, 224, -8, 178, 260, 104, 204, 303, 169, -136, -38, 54, 64, -14, -143, 46, 69, 21, 155, -41, 251, 127, -124, 259, -53, 22, -182, -829, -120, 569, 319, -929, -1224, 139, 830, 334, 507, -290, 392, 64, 10, -446, -159, -693, 1027, 342, -833, -574, 374, 37, 206, -252, 513, 296, 353, 669, 596, 120, 583, -309, 336, -5, 408, 183, -96, -248, 282, -367, 960, -261, -179, 193, 476, 465, -315, 822, 820, 472, 200, 65, -260, -625, + -1060, -176, 381, -27, 466, 501, 544, 185, 304, 1762, -865, -383, 178, 337, -41, -1382, 327, -218, 210, 241, 614, 119, 14, -558, 578, -210, 87, 500, 233, -541, -112, -306, -99, -235, 42, 18, 221, -55, 268, 256, 347, -7, 1, -212, -90, -282, -184, -87, 369, 113, -53, 21, -139, 49, 324, 356, -67, -335, -2, 17, 160, -95, 112, -161, 248, -467, 52, -146, -159, -3, 97, -302, 150, -60, 148, -156, -274, 103, 461, 454, -252, -342, 100, -329, -1052, 1085, -318, 305, 99, 910, 725, 456, -436, -72, 622, 330, + 732, 1954, -123, -771, -202, 584, -89, -910, 1389, 720, -492, -762, -96, 171, -244, 552, 467, 542, 1036, 174, 291, 186, -404, -966, 566, -657, -496, 763, 398, 430, 224, 157, -46, -954, -849, 16, 504, -630, 595, -279, -710, 224, 618, -114, 117, 617, 605, 632, 44, -384, 357, 1500, 178, 610, 854, 43, -274, -752, -307, -1186, -410, -296, -149, 271, 43, -53, -344, -223, -201, 295, -309, -60, -273, 89, -174, -291, 8, -419, -152, 9, -384, -70, -335, -190, 33, -606, -63, 30, -11, 289, -391, -126, 411, 10, -168, -16, + -144, 82, -183, -133, 202, -12, 9, -326, 541, 444, 3, -371, -544, -954, 160, 572, 786, -684, -729, 875, 389, -44, -98, -375, 160, -180, -391, 396, 486, 333, 25, -81, -285, 50, 199, 116, -320, -1113, 238, -261, -339, 52, -151, 83, -1108, 503, 394, -802, 546, 726, 607, -175, 95, -109, 393, -101, -10, 1955, -598, 153, -535, -316, 1102, 396, 371, 700, -912, -759, 1108, -717, 562, 694, 60, 177, 260, 1255, -438, -494, -1170, -260, -508, 383, -735, 1219, 662, 741, 362, 646, 337, 1163, 281, 554, 424, -588, -284, -234, + 95, 56, 568, 240, -8, -38, 123, 42, -232, -451, -243, -342, 408, -158, -245, 123, -100, 501, 229, -103, 280, -342, 150, 246, -101, 485, 499, 327, -246, 407, 233, -426, -88, 31, -258, 16, 354, -429, -489, 200, 87, -59, 455, -325, 804, -479, 421, 1373, 677, 515, -781, 210, 760, -665, 1080, 383, 574, 515, -344, 534, 456, 190, 1070, 812, -72, -1854, -226, 853, 818, 846, 194, 470, 32, 234, -71, -577, 1173, -35, 1117, 504, 803, -1142, 762, 381, 337, -302, 258, -215, 245, 1130, 441, 1476, 63, 325, 853, -177, + 1347, 668, 109, -901, -573, 494, 47, -151, 19, -154, 96, -656, 428, -698, -1049, -389, -68, -347, -278, 881, -115, 802, -774, 882, 108, -974, 955, 808, -312, -135, 220, 425, 262, -39, -453, 282, -202, -25, 546, -111, -102, -447, -131, 129, 76, -26, 408, 376, -304, 106, -18, 21, 374, 124, -431, 290, -370, 190, -301, -109, -103, -57, 38, 90, 40, 32, -94, 81, -213, 151, 149, -23, -177, 135, -49, 222, -129, -87, -302, 2, -299, 83, -249, -819, -782, -312, -335, 643, -1026, -1281, -1391, -1684, 761, 832, -42, -132, + 2, -398, 105, 213, -349, 1152, 1090, 710, 782, -711, 482, 41, 572, -221, -282, -1053, 952, -951, -1145, -302, -233, 1239, -671, 167, -633, -179, 1203, 222, 387, 591, 1106, 67, -113, -1340, -237, -108, -27, 733, 405, 2493, 136, -78, -816, -68, 1003, 908, -70, -440, -1220, 306, 792, -402, -886, -383, 782, -238, 577, -1789, -986, -1431, -373, 570, 318, -625, -580, -702, 295, 1467, 460, -10, -507, -47, -392, -116, 189, 169, -453, -217, -26, 314, -780, -547, -170, 385, -38, 509, 181, 55, -163, -95, -341, -83, -523, -127, 610, 206, + 288, -421, -729, 362, 369, -224, 18, -316, -39, 85, -21, 271, 193, 174, 375, 188, 300, 293, -40, 233, 151, 226, 31, 30, -229, -523, -283, 1189, 15, -17, 2123, 188, -1615, -1246, 1482, 1313, 60, -1084, -1341, -779, 238, 1277, 1135, 753, -497, 130, -499, 402, 963, 1498, 1639, -230, -909, -1424, -2118, -44, 1097, 4519, -614, -264, -2215, -930, 165, 502, 2683, 1929, 1185, -1395, -797, -1363, -101, 2243, 2073, 2530, -725, -2534, -1850, -2558, 614, 2306, 2025, 3752, -1824, -2214, -1944, -342, 1647, 2203, 3089, 1387, -676, -1232, 264, -114, 863, 2467, + -570, 1525, -575, -1454, -2, 202, 1326, 42, -148, 106, -375, -1261, 494, -193, 400, -373, -1042, -270, -263, 92, 655, 72, -218, 238, -270, -340, -82, 964, 228, 883, -89, 81, -282, 95, 82, 160, 677, 1188, -58, -350, -1132, -1487, 35, 65, 1750, 1120, 170, -637, -2520, -1429, -238, 1108, 2188, 1125, -691, -848, -2611, -985, 1212, 2252, 1814, 96, -1194, -1349, -154, -70, 1052, 626, 567, 14, -553, -325, -26, -255, 322, 343, -189, -1105, 1459, -333, 1722, -1577, 24, -687, -1637, 1205, -857, 1115, -876, -337, -74, 575, 133, -627, -330, -25, + 895, -825, 1026, 734, -550, 129, -692, -702, 1195, -1172, -584, 790, 1822, -13, 253, -166, -788, -222, 748, -257, -1192, 169, -255, -204, 369, -1095, 559, -5, 385, 842, -1898, -1413, -460, -45, 1971, -1043, 720, 1541, -838, -504, -45, 834, 1229, -670, 362, -249, 493, 1896, -695, -2145, 466, 976, 266, -1149, 725, 295, 728, -229, -21, -805, -623, 465, 132, -858, 263, 583, -273, -11, -932, 132, -222, -1046, -22, 458, 418, 160, -13, 250, -695, -184, 267, -353, 561, -341, -123, -323, 17, -344, 538, 85, -396, -364, 0, -25, 878, -311, + 322, -167, 1, 177, -354, -341, 75, -740, -184, 202, -602, 17, -97, -227, 152, 393, 19, 46, -225, -145, -2207, -698, 952, 1302, 1081, -1099, 354, -3074, -1999, -1697, -268, 1444, 929, -62, -675, -832, 410, -508, -50, 1105, 302, 55, -1089, -522, -109, -513, 335, -88, 593, -152, -5, -191, -34, -138, -622, -468, -1044, -735, 535, 1027, 1116, 624, 973, -144, 828, -189, -377, -1301, -49, -717, 560, 218, 1652, -1328, 475, 930, -509, -704, -410, -325, -337, 125, 1174, 759, -311, -39, 843, -969, -1075, 450, -1248, -956, -838, 110, 407, 491, + 1451, 991, -156, 739, -421, 36, 182, 550, 881, 957, 670, 562, 448, 45, -1218, -338, -628, -150, 712, -23, 108, -258, -542, 68, -268, -214, -591, 269, 443, -189, 171, 401, 216, 265, 45, 261, -175, 182, -83, -301, 236, 307, -245, -348, 30, -232, -418, 332, 344, 146, 444, -29, -414, -498, 707, -282, -2634, -3894, -4780, -3777, -5635, -995, -2057, 625, 1185, 4081, 2384, 4228, 4299, 5885, 4296, 4367, 3217, 140, -930, -1702, -1046, -3513, -2400, -1912, -1954, -1933, -1929, -1873, -2021, -2218, -1653, -2579, -2109, -1837, -824, -2167, -668, 799, -1609, -777, + 435, 355, -1362, 1138, 1463, 1852, 2511, 2552, -198, 1518, 2468, 3503, 2761, 5516, 5181, 4576, 3708, 4695, 2332, 3738, 4550, 3505, 2242, 3801, 1234, 1278, 2336, 2343, 1665, 484, 1361, -451, 83, 1191, -1353, -3403, -5087, -2009, -6965, -6092, -5358, -6196, -6894, -5778, -5001, -4825, -3325, -4373, -2244, -2776, -2951, -4476, -3616, -2608, -2135, -1808, -1694, -1062, 424, -3, -100, 1263, 2636, 2198, 2227, 3549, 3035, 3153, 4004, 3776, 3213, 3056, 3666, 3121, 3027, 3211, 3333, 2834, 2479, 2280, 2132, 2786, 2186, 1639, 1715, 1282, 749, -444, -922, -1210, -2166, -1855, -1920, -2287, -2417, -2227, + -1451, -1631, -1475, -1503, -777, -865, -1036, -717, -238, -272, -497, -329, 6, -208, -281, -261, -99, -156, -225, -178, 110, 168, 47, -106, 5, 136, 33, -122, -22, 54, 29, -33, 52, 46, 76, 66, 4, 2, 63, 67, 146, 90, -30, -95, 37, 74, -39, -74, -43, -102, -77, -85, -128, -109, -108, -134, -85, 6, 74, 50, 115, 173, 170, 136, 193, 271, 253, 240, 282, 278, 332, 296, 272, 320, 320, 239, 134, 137, 101, 4, -33, -66, -97, -142, -160, -163, -155, -159, -147, -134, -124, -105, -93, -72, -53, -43, + -36, -27, -19, -17, -14, -12 } + } }; -const Word32 CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[9][BINAURAL_CHANNELS][160] ={ -{ -{ --150290032, --385906048, -472137696, -417386528, -289008352, -147089744, -13842143, 109755208, 218540288, 298677408, 338041312, -333410272, 289806688, 217443456, 128992904, 36413268, -51879448, -131597800, -200934144, -258412080, -302034976, --330471424, -344894464, -348707872, -344730720, -333252960, -313536384, -286524256, -255014224, -221617632, -187685232, --154078192, -121817624, -91618096, -63485524, -37163816, -12640626, 10021769, 31080530, 51114404, 70688720, -90066000, 109184512, 127841848, 145885008, 163238288, 179848000, 195678176, 210733104, 224985424, 238308400, -250543152, 261627936, 271590656, 280449024, 288210560, 294993376, 301048224, 306591936, 311677184, 316297504, -320528032, 324459552, 328051200, 331215520, 334007808, 336570816, 338930368, 341038656, 342981600, 344917536, -346840096, 348636992, 350341568, 352067584, 353748544, 355215264, 356490336, 357713856, 358777408, 359359904, -359345408, 358935264, 358274912, 357210816, 355541152, 353345344, 350922976, 348430304, 345668640, 342328768, -338414432, 334300384, 330307680, 326383680, 322335680, 318261376, 314553728, 311527936, 309160320, 307183584, -305368960, 303734720, 302471456, 301629632, 300942464, 300034592, 298743968, 297124224, 295237664, 293061728, -290523936, 287530880, 284020288, 280054432, 275793824, 271369984, 266854368, 262317280, 257796288, 253253824, -248666256, 244071712, 239462688, 234741440, 229865040, 224886640, 219827696, 214675888, 209514944, 204474272, -199580144, 194803072, 190161280, 185628480, 181089776, 176506512, 171938272, 167363072, 162715904, 158055328, -153382416, 148456624, 143113136, 137447536, 131385736, 124594856, 117059872, 108918760, 99643240, 88533232, -75301512, 57490284, 28663002, -14293114, -59893320, -85520312, -78491600, -48966924, -15633144, }, -{ --150290032, --385906048, -472137696, -417386528, -289008352, -147089744, -13842143, 109755208, 218540288, 298677408, 338041312, -333410272, 289806688, 217443456, 128992904, 36413268, -51879448, -131597800, -200934144, -258412080, -302034976, --330471424, -344894464, -348707872, -344730720, -333252960, -313536384, -286524256, -255014224, -221617632, -187685232, --154078192, -121817624, -91618096, -63485524, -37163816, -12640626, 10021769, 31080530, 51114404, 70688720, -90066000, 109184512, 127841848, 145885008, 163238288, 179848000, 195678176, 210733104, 224985424, 238308400, -250543152, 261627936, 271590656, 280449024, 288210560, 294993376, 301048224, 306591936, 311677184, 316297504, -320528032, 324459552, 328051200, 331215520, 334007808, 336570816, 338930368, 341038656, 342981600, 344917536, -346840096, 348636992, 350341568, 352067584, 353748544, 355215264, 356490336, 357713856, 358777408, 359359904, -359345408, 358935264, 358274912, 357210816, 355541152, 353345344, 350922976, 348430304, 345668640, 342328768, -338414432, 334300384, 330307680, 326383680, 322335680, 318261376, 314553728, 311527936, 309160320, 307183584, -305368960, 303734720, 302471456, 301629632, 300942464, 300034592, 298743968, 297124224, 295237664, 293061728, -290523936, 287530880, 284020288, 280054432, 275793824, 271369984, 266854368, 262317280, 257796288, 253253824, -248666256, 244071712, 239462688, 234741440, 229865040, 224886640, 219827696, 214675888, 209514944, 204474272, -199580144, 194803072, 190161280, 185628480, 181089776, 176506512, 171938272, 167363072, 162715904, 158055328, -153382416, 148456624, 143113136, 137447536, 131385736, 124594856, 117059872, 108918760, 99643240, 88533232, -75301512, 57490284, 28663002, -14293114, -59893320, -85520312, -78491600, -48966924, -15633144, }, -}, -{ -{ -73902968, -124324808, -33054606, -330379616, -581539136, -632991744, -467241440, -182312768, 105196096, 331635360, 486648256, -577677952, 609132672, 585046464, 514585408, 409511712, 280498400, 138183056, -4979478, -136984224, -250866896, --346249536, -425859424, -490726848, -539250304, -570464512, -586600192, -591648384, -588483520, -578389312, -562420032, --541853056, -517614976, -490312384, -460739936, -429676032, -397331168, -363471264, -327923424, -290718816, -252093104, --212628800, -173132816, -134193568, -96038152, -58834608, -22848690, 11643656, 44357884, 75023952, 103676752, -130797864, 156929520, 182224192, 206464448, 229324944, 250495920, 269728768, 286901120, 301999008, 315101344, -326414304, 336174080, 344446720, 351235968, 356772736, 361376928, 365071680, 367741536, 369632416, 371208128, -372593792, 373728192, 374967296, 376884448, 379524256, 382521600, 385921056, 390188640, 395385024, 400983520, -406621728, 412490272, 418835008, 425467520, 431946464, 438020640, 443805408, 449606304, 455618720, 461792192, -467974272, 474057024, 479896576, 485230368, 489764256, 493161568, 494904256, 494442528, 491595520, 486565568, -479537408, 470545888, 459753152, 447557600, 434411232, 420759168, 407075936, 393776576, 381201984, 369796672, -360020256, 351915136, 345023840, 338894944, 333426368, 328718016, 324855744, 321818144, 319275520, 316555744, -313096672, 308839296, 304038048, 298951200, 293826752, 288817216, 283782976, 278508768, 273084768, 267690816, -262201312, 256463232, 250696704, 245142768, 239703728, 234326432, 229221872, 224347072, 219353648, 214260352, -209409184, 204729824, 199928576, 195166528, 190528512, 185382592, 179255824, 172332336, 164206800, 153830704, -140802992, 122852704, 91956320, 41217728, -19471772, -63043140, -69735776, -46819440, -15363098, }, -{ --73902968, --124324808, 33054606, 330379616, 581539136, 632991744, 467241440, 182312768, -105196096, -331635360, -486648256, --577677952, -609132672, -585046464, -514585408, -409511712, -280498400, -138183056, 4979478, 136984224, 250866896, -346249536, 425859424, 490726848, 539250304, 570464512, 586600192, 591648384, 588483520, 578389312, 562420032, -541853056, 517614976, 490312384, 460739936, 429676032, 397331168, 363471264, 327923424, 290718816, 252093104, -212628800, 173132816, 134193568, 96038152, 58834608, 22848690, -11643656, -44357884, -75023952, -103676752, --130797864, -156929520, -182224192, -206464448, -229324944, -250495920, -269728768, -286901120, -301999008, -315101344, --326414304, -336174080, -344446720, -351235968, -356772736, -361376928, -365071680, -367741536, -369632416, -371208128, --372593792, -373728192, -374967296, -376884448, -379524256, -382521600, -385921056, -390188640, -395385024, -400983520, --406621728, -412490272, -418835008, -425467520, -431946464, -438020640, -443805408, -449606304, -455618720, -461792192, --467974272, -474057024, -479896576, -485230368, -489764256, -493161568, -494904256, -494442528, -491595520, -486565568, --479537408, -470545888, -459753152, -447557600, -434411232, -420759168, -407075936, -393776576, -381201984, -369796672, --360020256, -351915136, -345023840, -338894944, -333426368, -328718016, -324855744, -321818144, -319275520, -316555744, --313096672, -308839296, -304038048, -298951200, -293826752, -288817216, -283782976, -278508768, -273084768, -267690816, --262201312, -256463232, -250696704, -245142768, -239703728, -234326432, -229221872, -224347072, -219353648, -214260352, --209409184, -204729824, -199928576, -195166528, -190528512, -185382592, -179255824, -172332336, -164206800, -153830704, --140802992, -122852704, -91956320, -41217728, 19471772, 63043140, 69735776, 46819440, 15363098, }, -}, -{ -{ --20145544, --57005492, -71009768, -39251708, 22138946, 59661392, 41766408, -7079180, -41781980, -43087112, -19023484, -15620796, 45125612, 55299852, 46632072, 35795868, 33863668, 32031330, 16694001, -11273215, -40736692, --65121904, -83812528, -94664304, -94392640, -84812184, -72592464, -62712964, -54888608, -45877232, -33475512, --18580566, -4296041, 6704444, 13525926, 15933792, 13537737, 7094749, -673236, -6847789, -10250476, --10991895, -9116068, -4538707, 2414845, 11190000, 21441550, 33079302, 46294916, 61611844, 79440792, -99501504, 120996208, 143268304, 165959680, 188631744, 210636464, 231415520, 250689184, 268259360, 283752384, -296667360, 306613408, 313304448, 316301792, 315008992, 309058336, 298478752, 283370144, 263717968, 239709104, -211936240, 181145616, 148177440, 114230560, 80630496, 48161080, 17215840, -11276974, -35932232, -56266756, --73105712, -87041272, -97337384, -103227392, -105634184, -106459888, -106354128, -104283952, -99487552, -92931816, --86368568, -80558552, -75020728, -69201584, -63283660, -57914948, -53659172, -50824496, -49467824, -49336828, --49959596, -51011328, -52643952, -55371256, -59494960, -64534032, -69305200, -72741176, -74627208, -75445936, --75603776, -74997648, -73216304, -69868920, -64723548, -57778048, -49296024, -39690868, -29388850, -18817862, --8375186, 1684701, 11204496, 19908784, 27393838, 33374580, 37808596, 40778568, 42390792, 42771968, -42039140, 40359808, 38137700, 35981624, 34367256, 33437932, 33108830, 33072858, 32698660, 31355408, -28982976, 26014080, 22699440, 18895172, 14541149, 9851581, 4925254, -359167, -5902359, -11345156, --16794932, -23118736, -30707406, -37716256, -40249212, -35419520, -24593520, -12728672, -3635690, }, -{ --20145544, --57005492, -71009768, -39251708, 22138946, 59661392, 41766408, -7079180, -41781980, -43087112, -19023484, -15620796, 45125612, 55299852, 46632072, 35795868, 33863668, 32031330, 16694001, -11273215, -40736692, --65121904, -83812528, -94664304, -94392640, -84812184, -72592464, -62712964, -54888608, -45877232, -33475512, --18580566, -4296041, 6704444, 13525926, 15933792, 13537737, 7094749, -673236, -6847789, -10250476, --10991895, -9116068, -4538707, 2414845, 11190000, 21441550, 33079302, 46294916, 61611844, 79440792, -99501504, 120996208, 143268304, 165959680, 188631744, 210636464, 231415520, 250689184, 268259360, 283752384, -296667360, 306613408, 313304448, 316301792, 315008992, 309058336, 298478752, 283370144, 263717968, 239709104, -211936240, 181145616, 148177440, 114230560, 80630496, 48161080, 17215840, -11276974, -35932232, -56266756, --73105712, -87041272, -97337384, -103227392, -105634184, -106459888, -106354128, -104283952, -99487552, -92931816, --86368568, -80558552, -75020728, -69201584, -63283660, -57914948, -53659172, -50824496, -49467824, -49336828, --49959596, -51011328, -52643952, -55371256, -59494960, -64534032, -69305200, -72741176, -74627208, -75445936, --75603776, -74997648, -73216304, -69868920, -64723548, -57778048, -49296024, -39690868, -29388850, -18817862, --8375186, 1684701, 11204496, 19908784, 27393838, 33374580, 37808596, 40778568, 42390792, 42771968, -42039140, 40359808, 38137700, 35981624, 34367256, 33437932, 33108830, 33072858, 32698660, 31355408, -28982976, 26014080, 22699440, 18895172, 14541149, 9851581, 4925254, -359167, -5902359, -11345156, --16794932, -23118736, -30707406, -37716256, -40249212, -35419520, -24593520, -12728672, -3635690, }, -}, -{ -{ --715649, --16108812, -47877076, -62373124, -37880536, 666257, 11227581, -14092861, -43357156, -43741556, -11979738, -31504658, 65659312, 83018496, 89054000, 92615600, 95732136, 91636352, 72837816, 39281772, -2659659, --46311020, -87099256, -121686088, -149177104, -172685600, -196140416, -219172720, -237489680, -248071408, -251337728, --248033824, -236885168, -216649424, -188575904, -155367760, -118897040, -80227304, -41051296, -3727495, 30040076, -59804736, 85767816, 108134392, 127120832, 143185616, 156986416, 168992464, 179110880, 186774704, 191456752, -193076496, 192072016, 189424704, 186549216, 184666416, 184082832, 184314224, 184824256, 185278448, 185259664, -184386160, 182738512, 180678000, 178298592, 175550352, 172689904, 169949712, 166921760, 162953200, 158009168, -152397248, 145799648, 137449152, 127236792, 115769768, 103261216, 89302568, 74002824, 58469536, 43653512, -29442000, 15545634, 2683818, -7992398, -16384226, -23488640, -30015916, -35794256, -40643276, -44896904, --48663592, -51298016, -52166672, -51388748, -49272940, -45472968, -39315056, -30745524, -20431160, -8977019, -3633542, 17806934, 33622076, 50297824, 66501128, 81408424, 95343976, 109124384, 122879552, 135763920, -146691392, 155191120, 161778000, 167630960, 173630496, 179508160, 184133296, 186687200, 187371168, 187117760, -186996976, 187755040, 189415040, 191305904, 192768864, 193786784, 194754752, 195953584, 197472400, 199272528, -201018960, 202128144, 202200080, 201163376, 199014288, 195749040, 191514208, 186435408, 180395600, 173246640, -165060432, 155962080, 146033712, 135544336, 124882616, 114247200, 103758896, 93658744, 83965000, 74382928, -64660196, 53660784, 38013144, 14970645, -11264625, -29461328, -31584652, -21020644, -6886980, }, -{ --715649, --16108812, -47877076, -62373124, -37880536, 666257, 11227581, -14092861, -43357156, -43741556, -11979738, -31504658, 65659312, 83018496, 89054000, 92615600, 95732136, 91636352, 72837816, 39281772, -2659659, --46311020, -87099256, -121686088, -149177104, -172685600, -196140416, -219172720, -237489680, -248071408, -251337728, --248033824, -236885168, -216649424, -188575904, -155367760, -118897040, -80227304, -41051296, -3727495, 30040076, -59804736, 85767816, 108134392, 127120832, 143185616, 156986416, 168992464, 179110880, 186774704, 191456752, -193076496, 192072016, 189424704, 186549216, 184666416, 184082832, 184314224, 184824256, 185278448, 185259664, -184386160, 182738512, 180678000, 178298592, 175550352, 172689904, 169949712, 166921760, 162953200, 158009168, -152397248, 145799648, 137449152, 127236792, 115769768, 103261216, 89302568, 74002824, 58469536, 43653512, -29442000, 15545634, 2683818, -7992398, -16384226, -23488640, -30015916, -35794256, -40643276, -44896904, --48663592, -51298016, -52166672, -51388748, -49272940, -45472968, -39315056, -30745524, -20431160, -8977019, -3633542, 17806934, 33622076, 50297824, 66501128, 81408424, 95343976, 109124384, 122879552, 135763920, -146691392, 155191120, 161778000, 167630960, 173630496, 179508160, 184133296, 186687200, 187371168, 187117760, -186996976, 187755040, 189415040, 191305904, 192768864, 193786784, 194754752, 195953584, 197472400, 199272528, -201018960, 202128144, 202200080, 201163376, 199014288, 195749040, 191514208, 186435408, 180395600, 173246640, -165060432, 155962080, 146033712, 135544336, 124882616, 114247200, 103758896, 93658744, 83965000, 74382928, -64660196, 53660784, 38013144, 14970645, -11264625, -29461328, -31584652, -21020644, -6886980, }, -}, -{ -{ --2120103, --2182380, 2431488, 1641751, -9615358, -22197464, -26419418, -28747290, -43403864, -67200672, -74491912, --44185012, 14663555, 71995464, 107700600, 125167160, 136182672, 143301584, 141180944, 127339336, 104186776, -73414416, 34889092, -9259413, -54247584, -97008816, -137676256, -176203712, -210369104, -237915424, -258347648, --271745280, -277629920, -275695040, -266039936, -248164288, -221443152, -187384048, -150119312, -113909512, -80955304, --51719996, -26036092, -3349001, 17149804, 35995048, 53375168, 69480224, 84347792, 97516696, 108393704, -116807544, 122870424, 126759520, 129085240, 130963752, 133236864, 135994768, 139109152, 142654112, 146571120, -150532704, 154372400, 158137472, 161650224, 164578848, 166909952, 168740672, 169717248, 169319952, 167556880, -164671728, 160303744, 153696480, 144681344, 133714144, 120915680, 105893496, 88800600, 70846024, 53191024, -35800164, 18094160, 470836, -15789374, -30247308, -43886512, -57436596, -70047160, -80413600, -88464512, --94938640, -99840808, -102404368, -102376984, -100438880, -97423280, -93743568, -89524296, -84849224, -79921288, --75102336, -70636104, -66406100, -62290448, -58539332, -55291260, -51955144, -47705812, -42448772, -36826660, --31488552, -26699128, -22258132, -17449378, -11537356, -4669703, 2124398, 7988103, 12854300, 17106318, -21282100, 26047366, 31759136, 38082400, 44502304, 50960324, 57600880, 64343440, 71117144, 77954728, -84510464, 90070832, 94272920, 97199944, 98811088, 99022616, 98195840, 96741992, 94531696, 91417840, -87833688, 84206592, 80507016, 76945952, 74163344, 72266584, 70794480, 69801272, 69661688, 70023000, -70470216, 71217000, 70736504, 64242512, 48515412, 27780922, 10836202, 2334852, 127238, }, -{ -2120103, -2182380, -2431488, -1641751, 9615358, 22197464, 26419418, 28747290, 43403864, 67200672, 74491912, -44185012, -14663555, -71995464, -107700600, -125167160, -136182672, -143301584, -141180944, -127339336, -104186776, --73414416, -34889092, 9259413, 54247584, 97008816, 137676256, 176203712, 210369104, 237915424, 258347648, -271745280, 277629920, 275695040, 266039936, 248164288, 221443152, 187384048, 150119312, 113909512, 80955304, -51719996, 26036092, 3349001, -17149804, -35995048, -53375168, -69480224, -84347792, -97516696, -108393704, --116807544, -122870424, -126759520, -129085240, -130963752, -133236864, -135994768, -139109152, -142654112, -146571120, --150532704, -154372400, -158137472, -161650224, -164578848, -166909952, -168740672, -169717248, -169319952, -167556880, --164671728, -160303744, -153696480, -144681344, -133714144, -120915680, -105893496, -88800600, -70846024, -53191024, --35800164, -18094160, -470836, 15789374, 30247308, 43886512, 57436596, 70047160, 80413600, 88464512, -94938640, 99840808, 102404368, 102376984, 100438880, 97423280, 93743568, 89524296, 84849224, 79921288, -75102336, 70636104, 66406100, 62290448, 58539332, 55291260, 51955144, 47705812, 42448772, 36826660, -31488552, 26699128, 22258132, 17449378, 11537356, 4669703, -2124398, -7988103, -12854300, -17106318, --21282100, -26047366, -31759136, -38082400, -44502304, -50960324, -57600880, -64343440, -71117144, -77954728, --84510464, -90070832, -94272920, -97199944, -98811088, -99022616, -98195840, -96741992, -94531696, -91417840, --87833688, -84206592, -80507016, -76945952, -74163344, -72266584, -70794480, -69801272, -69661688, -70023000, --70470216, -71217000, -70736504, -64242512, -48515412, -27780922, -10836202, -2334852, -127238, }, -}, -{ -{ --3671123, --39192, 10506027, 2583423, -11370389, 9127342, 51194400, 42549168, -43339980, -130446208, -128813048, --42433204, 50480360, 96136400, 103191960, 100044280, 96409128, 88321704, 72801840, 49335216, 19551764, --10698764, -34936336, -51146620, -59889024, -61062088, -56099788, -49212808, -43119860, -37066640, -31124554, --28390808, -30828738, -36359584, -42034844, -47656420, -55036784, -65441880, -78317656, -91272352, -101293584, --106852880, -108556912, -107599128, -104722040, -100854424, -97124240, -93621160, -89277872, -83206400, -75163000, --64862060, -51931524, -36353676, -18156974, 2804077, 26050588, 50218904, 74196632, 97649304, 120020176, -140148000, 157368672, 171831984, 183300608, 190740032, 193442112, 191497024, 184927328, 173375488, 156838784, -135890080, 111140872, 83263848, 53436908, 22994718, -7286412, -36909876, -64856152, -89820112, -111269720, --129658624, -145347600, -157740720, -165909760, -169906224, -170894064, -169792400, -166344624, -159930624, -150722752, --139369536, -126035816, -110575544, -93295280, -74738336, -54994908, -34042448, -12556337, 8343511, 27995134, -46311020, 63115620, 77687904, 88826368, 95461016, 97690640, 97167728, 95783680, 93926640, 90569584, -84949088, 77551000, 69654704, 62543852, 56989920, 52911848, 49627272, 46758772, 44623100, 43604120, -43661028, 44587668, 46148888, 47797616, 48853644, 49056044, 48447768, 46837156, 43954696, 39967892, -35283692, 30098594, 24612310, 19294604, 14492830, 10176925, 6356015, 3180423, 441845, -2350421, --5238250, -7852811, -10191957, -12593381, -14998026, -17055852, -18798534, -20420422, -21658446, -22225918, --22512072, -22933514, -22862648, -21058224, -17082696, -11787538, -6634114, -2837363, -695785, }, -{ -3671123, -39192, -10506027, -2583423, 11370389, -9127342, -51194400, -42549168, 43339980, 130446208, 128813048, -42433204, -50480360, -96136400, -103191960, -100044280, -96409128, -88321704, -72801840, -49335216, -19551764, -10698764, 34936336, 51146620, 59889024, 61062088, 56099788, 49212808, 43119860, 37066640, 31124554, -28390808, 30828738, 36359584, 42034844, 47656420, 55036784, 65441880, 78317656, 91272352, 101293584, -106852880, 108556912, 107599128, 104722040, 100854424, 97124240, 93621160, 89277872, 83206400, 75163000, -64862060, 51931524, 36353676, 18156974, -2804077, -26050588, -50218904, -74196632, -97649304, -120020176, --140148000, -157368672, -171831984, -183300608, -190740032, -193442112, -191497024, -184927328, -173375488, -156838784, --135890080, -111140872, -83263848, -53436908, -22994718, 7286412, 36909876, 64856152, 89820112, 111269720, -129658624, 145347600, 157740720, 165909760, 169906224, 170894064, 169792400, 166344624, 159930624, 150722752, -139369536, 126035816, 110575544, 93295280, 74738336, 54994908, 34042448, 12556337, -8343511, -27995134, --46311020, -63115620, -77687904, -88826368, -95461016, -97690640, -97167728, -95783680, -93926640, -90569584, --84949088, -77551000, -69654704, -62543852, -56989920, -52911848, -49627272, -46758772, -44623100, -43604120, --43661028, -44587668, -46148888, -47797616, -48853644, -49056044, -48447768, -46837156, -43954696, -39967892, --35283692, -30098594, -24612310, -19294604, -14492830, -10176925, -6356015, -3180423, -441845, 2350421, -5238250, 7852811, 10191957, 12593381, 14998026, 17055852, 18798534, 20420422, 21658446, 22225918, -22512072, 22933514, 22862648, 21058224, 17082696, 11787538, 6634114, 2837363, 695785, }, -}, -{ -{ --680752, --6240051, -13836774, -10302016, 5936182, 22024056, 36585604, 67482528, 119403848, 159337376, 144570752, -70390752, -25560424, -103386304, -150596592, -173636400, -178448368, -167961136, -148191936, -126090576, -103611792, --79183088, -52856552, -26375932, -621697, 23176718, 41265508, 50151260, 51460688, 51485384, 55557012, -64254320, 74965968, 85429584, 95057824, 103935528, 111814640, 118245280, 122967600, 125632624, 125466736, -121898152, 115582400, 108234784, 101213592, 94630480, 87911536, 80723376, 73117520, 65205656, 57070988, -48827872, 40585832, 32500018, 24959666, 18582712, 13938243, 11319386, 10739029, 12014097, 14893873, -19206020, 24874304, 31775242, 39685496, 48436492, 57997092, 68278704, 78905528, 89304184, 99037112, -107957760, 115961968, 122647088, 127384432, 129767608, 129741832, 127162168, 121512680, 112373528, 99948720, -84770840, 67046588, 46717968, 24082418, -91805, -25057912, -50365472, -75708464, -100862472, -125715840, --149895968, -172297440, -191387504, -206211584, -216911424, -224116768, -227924256, -227615552, -222445488, -212763552, --200331232, -187362576, -175147152, -163655968, -152441280, -141703856, -132459472, -125884416, -122654064, -122724936, --125530616, -130339912, -136546144, -143768656, -151833536, -160675264, -170103792, -179589232, -188355792, -195788768, --201700784, -206235200, -209647552, -212184800, -213994592, -215094640, -215534336, -215547760, -215372752, -214942720, --213959168, -212257280, -209942304, -207209616, -204216032, -201055472, -197645808, -193645584, -188603824, -182181776, --174221584, -164782864, -154138320, -142549424, -130080600, -116882704, -103449120, -90151360, -76836432, -63378684, --49806052, -34693136, -14782204, 10616085, 34621732, 46091440, 40392020, 24304146, 7576859, }, -{ --680752, --6240051, -13836774, -10302016, 5936182, 22024056, 36585604, 67482528, 119403848, 159337376, 144570752, -70390752, -25560424, -103386304, -150596592, -173636400, -178448368, -167961136, -148191936, -126090576, -103611792, --79183088, -52856552, -26375932, -621697, 23176718, 41265508, 50151260, 51460688, 51485384, 55557012, -64254320, 74965968, 85429584, 95057824, 103935528, 111814640, 118245280, 122967600, 125632624, 125466736, -121898152, 115582400, 108234784, 101213592, 94630480, 87911536, 80723376, 73117520, 65205656, 57070988, -48827872, 40585832, 32500018, 24959666, 18582712, 13938243, 11319386, 10739029, 12014097, 14893873, -19206020, 24874304, 31775242, 39685496, 48436492, 57997092, 68278704, 78905528, 89304184, 99037112, -107957760, 115961968, 122647088, 127384432, 129767608, 129741832, 127162168, 121512680, 112373528, 99948720, -84770840, 67046588, 46717968, 24082418, -91805, -25057912, -50365472, -75708464, -100862472, -125715840, --149895968, -172297440, -191387504, -206211584, -216911424, -224116768, -227924256, -227615552, -222445488, -212763552, --200331232, -187362576, -175147152, -163655968, -152441280, -141703856, -132459472, -125884416, -122654064, -122724936, --125530616, -130339912, -136546144, -143768656, -151833536, -160675264, -170103792, -179589232, -188355792, -195788768, --201700784, -206235200, -209647552, -212184800, -213994592, -215094640, -215534336, -215547760, -215372752, -214942720, --213959168, -212257280, -209942304, -207209616, -204216032, -201055472, -197645808, -193645584, -188603824, -182181776, --174221584, -164782864, -154138320, -142549424, -130080600, -116882704, -103449120, -90151360, -76836432, -63378684, --49806052, -34693136, -14782204, 10616085, 34621732, 46091440, 40392020, 24304146, 7576859, }, -}, -{ -{ --20460150, --40343700, -13508209, 46633144, 91716344, 73947528, -7758322, -95739656, -121552408, -72519448, -544387, -38518876, 38133404, 26581552, 21526376, 20213726, 21106006, 28424094, 36867464, 33590940, 18548354, -6920266, 7955890, 14348412, 15824807, 11763915, 6027987, -1577327, -13320304, -28249074, -42741904, --53768160, -60312080, -63879584, -67890552, -74558488, -82486456, -88451096, -90421944, -87824568, -80701896, --70165272, -58311696, -46536508, -34928284, -23648626, -13455059, -4606890, 3348464, 10569378, 16880296, -22594750, 28263570, 33855616, 39091180, 44140452, 49177912, 53738092, 57185880, 59390808, 60509648, -60608968, 59803660, 58430344, 56992604, 56112136, 56260852, 57352844, 59072980, 61693984, 65859564, -71498320, 77883328, 84850840, 92952216, 102234720, 111824304, 120842664, 128914520, 135716128, 140693472, -143239312, 142800688, 139130096, 132580808, 123537752, 111588616, 96284040, 78704200, 60772176, 42660300, -22346178, -1624571, -28163174, -55070072, -81417008, -107751064, -134499056, -160813232, -185014848, -206087024, --224521568, -241275152, -256022464, -267179712, -273710752, -276195392, -276032704, -274184800, -270631808, -264445424, --254557872, -240999744, -225169024, -208532480, -191526544, -174000944, -156033472, -137935552, -120099632, -103117872, --87445536, -72877544, -58941448, -45649060, -33234456, -21478594, -9917616, 1650341, 13268228, 24788940, -35403416, 44078712, 50786916, 56499756, 61907120, 67092220, 72187664, 77117208, 80982680, 82968568, -83518864, 83573624, 83361560, 82914344, 82702280, 82717848, 82086488, 80413600, 78272560, 76019848, -73696272, 71772664, 69551088, 63401772, 50115288, 32187558, 16374563, 6685117, 1735704, }, -{ --20460150, --40343700, -13508209, 46633144, 91716344, 73947528, -7758322, -95739656, -121552408, -72519448, -544387, -38518876, 38133404, 26581552, 21526376, 20213726, 21106006, 28424094, 36867464, 33590940, 18548354, -6920266, 7955890, 14348412, 15824807, 11763915, 6027987, -1577327, -13320304, -28249074, -42741904, --53768160, -60312080, -63879584, -67890552, -74558488, -82486456, -88451096, -90421944, -87824568, -80701896, --70165272, -58311696, -46536508, -34928284, -23648626, -13455059, -4606890, 3348464, 10569378, 16880296, -22594750, 28263570, 33855616, 39091180, 44140452, 49177912, 53738092, 57185880, 59390808, 60509648, -60608968, 59803660, 58430344, 56992604, 56112136, 56260852, 57352844, 59072980, 61693984, 65859564, -71498320, 77883328, 84850840, 92952216, 102234720, 111824304, 120842664, 128914520, 135716128, 140693472, -143239312, 142800688, 139130096, 132580808, 123537752, 111588616, 96284040, 78704200, 60772176, 42660300, -22346178, -1624571, -28163174, -55070072, -81417008, -107751064, -134499056, -160813232, -185014848, -206087024, --224521568, -241275152, -256022464, -267179712, -273710752, -276195392, -276032704, -274184800, -270631808, -264445424, --254557872, -240999744, -225169024, -208532480, -191526544, -174000944, -156033472, -137935552, -120099632, -103117872, --87445536, -72877544, -58941448, -45649060, -33234456, -21478594, -9917616, 1650341, 13268228, 24788940, -35403416, 44078712, 50786916, 56499756, 61907120, 67092220, 72187664, 77117208, 80982680, 82968568, -83518864, 83573624, 83361560, 82914344, 82702280, 82717848, 82086488, 80413600, 78272560, 76019848, -73696272, 71772664, 69551088, 63401772, 50115288, 32187558, 16374563, 6685117, 1735704, }, -}, -{ -{ -14716705, -11612518, -44376140, -103088880, -108561200, -50594176, 51995412, 175258832, 280116704, 316670080, 267007920, -164680864, 53394496, -54912768, -165113040, -264245712, -327356512, -348953216, -347518144, -340580160, -329331104, --307044512, -271491872, -226984192, -180089056, -135122896, -91693792, -46570332, 1603633, 50771344, 98411120, -143556592, 185511456, 222793376, 254099936, 278945248, 297080736, 308283104, 312712800, 310943808, 303997792, -293564224, 281367072, 267919520, 252631584, 235309440, 216815312, 198282528, 180523920, 164102640, 149081536, -134679440, 119849448, 104216304, 88079576, 71793064, 55604796, 39872328, 25011206, 11287711, -1207960, --12521440, -22782654, -32032940, -40187472, -47247860, -53325776, -58365920, -62188980, -64909304, -66907536, --68314136, -68973416, -68992744, -68787120, -68469296, -67730024, -66509716, -65335580, -64805152, -65041376, --65790844, -66789964, -67883568, -68891816, -69475392, -69215008, -67979672, -66198868, -64583424, -63570884, --63242856, -63801740, -65893388, -70275864, -77108624, -85522464, -93979792, -101276400, -107191648, -111947784, --115108880, -115415432, -111847392, -104569568, -94679336, -83218216, -70549136, -56565256, -41390600, -25843356, --11130945, 1938641, 13379360, 23678692, 33182918, 41803992, 49133352, 54810224, 58946816, 62265216, -65684008, 69705712, 74157976, 78415904, 81871200, 84363360, 86238648, 87949656, 89652608, 91270200, -92726736, 93883688, 94457608, 94284736, 93489088, 92174832, 90220616, 87558816, 84293568, 80338440, -75355736, 69250976, 62268972, 54512260, 45944340, 36912560, 27975806, 19202798, 10374494, 1696512, --6684043, -15480136, -24956982, -32718524, -34671124, -29163902, -19150186, -9488120, -2658048, }, -{ -14716705, -11612518, -44376140, -103088880, -108561200, -50594176, 51995412, 175258832, 280116704, 316670080, 267007920, -164680864, 53394496, -54912768, -165113040, -264245712, -327356512, -348953216, -347518144, -340580160, -329331104, --307044512, -271491872, -226984192, -180089056, -135122896, -91693792, -46570332, 1603633, 50771344, 98411120, -143556592, 185511456, 222793376, 254099936, 278945248, 297080736, 308283104, 312712800, 310943808, 303997792, -293564224, 281367072, 267919520, 252631584, 235309440, 216815312, 198282528, 180523920, 164102640, 149081536, -134679440, 119849448, 104216304, 88079576, 71793064, 55604796, 39872328, 25011206, 11287711, -1207960, --12521440, -22782654, -32032940, -40187472, -47247860, -53325776, -58365920, -62188980, -64909304, -66907536, --68314136, -68973416, -68992744, -68787120, -68469296, -67730024, -66509716, -65335580, -64805152, -65041376, --65790844, -66789964, -67883568, -68891816, -69475392, -69215008, -67979672, -66198868, -64583424, -63570884, --63242856, -63801740, -65893388, -70275864, -77108624, -85522464, -93979792, -101276400, -107191648, -111947784, --115108880, -115415432, -111847392, -104569568, -94679336, -83218216, -70549136, -56565256, -41390600, -25843356, --11130945, 1938641, 13379360, 23678692, 33182918, 41803992, 49133352, 54810224, 58946816, 62265216, -65684008, 69705712, 74157976, 78415904, 81871200, 84363360, 86238648, 87949656, 89652608, 91270200, -92726736, 93883688, 94457608, 94284736, 93489088, 92174832, 90220616, 87558816, 84293568, 80338440, -75355736, 69250976, 62268972, 54512260, 45944340, 36912560, 27975806, 19202798, 10374494, 1696512, --6684043, -15480136, -24956982, -32718524, -34671124, -29163902, -19150186, -9488120, -2658048, }, -}, +const Word16 CRendBin_Combined_BRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955]={ + { + {162, 77, -106, 160, -93, -34, 4, -57, -61, -127, 32, 189, 21, 32, 83, 18, -66, -23, -39, -42, 117, 30, 17, -41, 23, -7, -42, -74, 114, 84, 18, -26, 132, -183, -66, 75, -73, 154, 18, 108, 16, 11, 73, -64, -24, -4, 0, -51, -37, 67, -2, -169, 158, -24, 28, -143, 69, -64, 57, 2, -3, -55, -4, -83, 86, -160, -16, 114, -90, 41, 174, 51, 19, -88, 11, 44, -31, 56, -35, -27, -47, 50, -55, -93, 30, 13, -21, 109, -27, -26, -26, 35, 42, -5, 6, 18, + -21, 18, -42, -20, -6, -11, -22, -3, 0, -7, -12, -3, -22, 10, -10, 25, -16, 18, 29, 17, 334, 62, -47, 102, -50, -42, -53, -22, -125, 177, 103, 77, 83, 78, -82, -111, 149, -32, -116, -220, 36, -65, 69, 2, -18, -49, 70, -82, -41, 109, 207, 54, 95, 18, 104, -21, 111, 70, 13, 62, 6, 18, 6, 152, 32, 40, -34, 23, -10, -21, 123, 141, -50, -51, 29, 130, -210, -11, -57, -155, -63, 22, -66, 70, 57, 5, -94, 45, -20, -90, 117, -160, -75, -171, -84, -24, + 26, 174, -74, -45, 54, -27, -40, 83, -13, -3, -37, -57, -71, -19, 62, 25, 31, 29, 23, 3, -9, -4, 6, 44, 22, 23, -14, 4, 16, 13, 1, 4, 1, -2, -5, -29, -22, -15, 18, 15, -6, 28, 103, 42, -201, -21, 32, 142, -42, -254, 205, -240, 15, -106, -81, -255, -166, -100, -62, 102, 37, -168, 26, -91, 3, -8, 70, 12, -71, 10, 20, 39, -49, -37, -14, -84, -123, 167, 80, 21, -22, 142, 126, -144, 42, 12, -25, -85, 21, -149, 35, -30, -118, 146, 4, -13, + 187, -163, 148, 52, -20, -122, 36, -19, -125, -107, 2, -48, -55, -177, 10, 35, 83, -53, 77, 21, -30, -27, -102, 87, 20, 11, -170, 88, -14, 10, -87, 0, -156, 17, 35, 19, -13, 13, -2, -1, -26, 6, -7, 32, 21, 12, 33, -2, 12, 30, 20, -25, -8, 48, -17, 8, -17, 16, -58, -17, -17, 21, -10, -375, -354, 137, 235, 142, -319, 227, -77, -29, 21, -148, -112, 268, -3, -1, 21, -7, 88, -134, 82, -71, 73, 123, -81, -22, 72, -21, 129, -40, 56, 11, -12, 11, + -109, -152, 144, 19, -27, 1, -142, -177, -4, 3, 93, -165, -140, -30, -292, 114, -22, 60, -22, -71, 46, 375, 209, 109, -112, 148, -1, -193, 1, -201, 172, 24, 21, -115, 2, 117, 44, 23, 16, 13, 127, 88, 17, 85, 52, 68, 185, 77, 91, -85, 70, 52, -21, 145, 45, 0, -12, 44, 78, 10, 0, -28, 19, 64, 36, -14, 7, -52, 16, 14, -22, 6, -2, -1, 37, -6, 38, 52, 19, -29, -57, 10, -35, 28, 26, -36, 16, -84, -538, -41, -129, -19, -90, -306, -13, -82, + -126, -287, -35, 203, -142, 133, -23, 188, -64, 153, -50, -152, -40, 16, -66, -137, -109, -134, 5, -123, 45, 14, 12, 57, -92, -124, 178, -17, 53, 1, -139, -89, -98, 4, -71, 124, 126, 20, -171, -56, 314, 78, -133, -106, -67, -117, -62, 245, 149, -179, 109, 144, 214, -56, 87, -14, 2, -87, -178, -33, 131, 13, 254, 180, 12, 59, 215, -171, -79, -51, -106, 75, 33, 34, -93, 62, -67, 69, -132, -6, -12, -52, -3, -12, 64, 17, 14, -57, -38, -18, -53, -3, -77, -45, 3, -6, + 47, -33, 13, -16, 25, 19, 65, -55, 689, 464, -143, -25, 1, -18, -80, 97, 235, 200, 103, -361, -161, 47, 20, 155, -273, 56, 369, 250, -43, 90, -33, -124, -171, 11, -146, -84, 42, 116, -107, -197, -95, 35, 181, 255, -49, -267, -57, -95, -270, -15, -8, -128, 44, 74, 157, -225, 92, 118, 25, -217, -163, 76, 9, 58, -24, -20, -8, -120, 60, 65, -85, 153, 179, 247, 59, 20, 231, 378, 60, 53, 64, 223, 25, 133, 372, 112, 69, 12, -70, -316, 43, -7, -52, -59, 39, -43, + 79, 37, -42, -22, -11, 66, 41, -16, -12, 45, 95, 2, -24, 35, 4, -42, -88, 66, -83, 52, 35, 63, -4, -8, 1, 22, -115, 5, 17, -9, 13, 365, 6, 78, 86, 177, -70, 113, -96, -58, -301, 121, 203, -183, 153, -75, -264, 275, 160, -47, 162, 322, 223, -163, -93, 163, 50, -34, 123, 116, 165, 12, -74, -141, -254, -6, -211, 28, -70, 119, -168, -382, 83, -93, 176, 47, 13, -104, -227, -188, -19, -17, -172, 242, 310, 325, 130, -229, -21, 308, 28, -51, 142, -38, -78, -288, + 159, 86, 420, 197, -287, 98, 107, -28, -6, 104, -70, 26, -123, -299, 271, 52, 161, 81, -143, 233, -52, 57, 12, -49, 8, 9, 18, 123, 39, 25, 10, -39, -49, -61, -38, 44, -21, -1, -25, 40, -36, -16, 3, -2, 16, -64, 77, -30, 67, 25, -36, -42, 95, -86, 77, -19, -111, -187, -50, -48, -321, 15, 40, 160, -60, -140, 58, 17, 77, 2, 175, 69, 121, 20, -13, 103, 61, -318, -98, -454, 21, -86, 53, 79, 6, 215, 55, 308, 38, -369, 7, -149, -61, -19, -55, -20, + -292, 62, -141, 350, -365, 201, -80, -313, -59, -221, -48, -68, -332, 93, 101, -62, -55, -23, 117, -265, 6, 245, 45, 341, 560, 230, -509, -680, 328, 145, 505, -107, 242, 50, 240, 336, 434, -234, 124, 321, -266, 47, -35, -36, 23, 229, -37, 76, -151, 52, -117, -125, -55, -105, 15, -63, -173, -9, 112, 68, -34, -35, -27, -1, 51, 52, -46, -70, -32, 95, -26, 92, 13, 10, -27, 19, 26, 4, 24, 1, -84, -83, -54, 21, 79, -119, -80, -40, 45, -58, -47, -625, 468, 81, -78, -14, + -277, -235, 246, -70, -75, 246, -183, -206, 15, 245, 109, -85, 11, -148, -16, 15, 137, 1, -314, -320, 74, -48, 78, -37, 129, 239, 459, -13, 285, -75, 82, 190, -188, 367, -52, -238, -326, -69, -271, -349, -94, 152, -105, -273, 134, 183, 297, 376, -312, 112, -87, -294, 108, -328, -59, -532, 209, -164, 77, -102, 82, -571, -563, -349, -133, 304, -303, 584, -210, 51, -56, 102, -55, -427, 60, 41, 113, 89, 48, 154, -95, -152, -1, -2, -142, 55, -182, 93, 58, 74, -29, -9, -57, -148, -104, -66, + -66, 83, -65, -178, 55, 62, -34, 104, -13, -44, -4, 17, -53, -58, 57, 72, 58, 17, -127, -98, -31, -108, 31, -2, -6, -152, -76, -31, 31, -1, -118, -25, -3, -93, 532, 22, 206, 130, 63, 297, 50, -436, 214, 53, 205, -28, -308, 445, 253, 178, -35, -146, 66, -41, -243, 154, 121, -148, 190, 280, 15, 100, 295, -321, 83, -114, 136, -596, 187, 275, -91, 67, 291, 143, 12, 85, -287, 67, -166, 5, 92, 38, -127, 555, -94, -115, -125, -499, -193, -309, -342, -75, 490, 523, -46, 156, + 219, -452, -138, 352, 304, -184, -119, -445, -136, -174, -205, -255, 71, -454, 79, 410, 590, 172, -167, -20, 315, -117, -206, 12, -22, -101, -137, 13, -10, 61, 98, 46, -46, 19, 54, 31, -3, -93, -182, 45, -7, -84, 147, 37, 84, -87, 125, -93, -61, -104, 100, 11, 75, 133, -8, -80, -35, 63, 36, -14, 8, 12, 24, -16, -24, 64, 100, 248, 121, -47, -166, 104, 26, -219, -326, -349, -141, -341, -143, -138, 4, -325, 72, 137, 14, -371, 114, -461, 141, 257, 6, 400, 11, -119, -74, 270, + -99, 371, 131, -128, -129, 65, -191, -102, 12, 351, -13, 185, 104, 32, 245, -111, -227, 100, -163, -75, -443, 248, -157, -131, -91, -487, 580, 150, -71, 253, 81, 123, -260, -388, -443, -214, 21, -446, 164, 322, -502, -183, 181, -231, 118, 554, 15, -91, -150, 124, -305, 196, 104, -274, 86, 192, -113, -324, -279, -146, -14, 86, 72, 58, -60, -83, -44, 69, 0, -48, -186, -220, -64, 12, -159, -189, -133, -81, -76, -167, -145, -79, -106, -212, 31, 192, -25, -22, -84, -63, 60, -78, 9, -169, 0, -52, + -94, -5, -89, 46, 70, -74, 110, -86, -38, -89, -13, 8, 158, 346, 889, 919, 288, 568, -386, -404, -85, -65, 41, 124, 303, 525, 182, 485, 62, 143, 81, -142, 232, -12, 97, 32, -243, -37, -127, -277, -162, -1, 34, -366, -141, 448, 334, 230, 391, -244, 9, -665, 37, 561, -104, -118, 75, -66, 450, -41, -67, 336, -401, -666, -260, 54, -349, 258, 374, -525, -191, -1, -4, -752, -469, 235, 109, -61, 246, -331, -194, -466, 116, 144, 44, 28, -301, -513, 427, -696, 208, -258, 666, 65, 281, -192, + -255, 188, 95, 292, -276, -54, 206, -17, -151, -149, -148, 12, 160, 167, -185, -82, -26, -256, -85, 43, -23, 19, -127, -225, -26, 3, 179, 52, -103, 132, 28, 66, -240, 48, -141, 114, 27, 121, 202, 59, -133, -277, 91, 91, -858, -620, 430, -91, 781, -191, 643, -517, 17, 229, -49, 26, 77, -42, -386, 134, 147, 168, 195, -121, 320, -291, -212, -167, 449, -249, -82, 39, -8, -234, 201, -261, -307, -584, 55, 105, -394, -186, 192, -82, 103, 30, 461, 30, 348, 152, 17, 275, 65, 94, -520, 535, + 192, 419, -254, 110, -278, 434, 333, 530, 87, -141, -385, -26, 70, -331, 470, 73, 75, 502, 115, -153, -199, -19, 302, 359, -115, 449, -537, -568, -245, 129, -170, 244, -59, 130, 434, -22, 217, -182, -162, 186, -14, 300, -91, -5, -91, -190, 40, -113, -41, 122, 45, -173, -153, 88, 232, 235, -21, 192, 214, -300, 141, 277, 224, 121, -219, -272, -277, -286, -277, 20, -95, -43, 35, -210, 150, 129, -103, 154, 60, 71, -193, 160, 396, -935, -43, 487, -312, -104, 359, -390, -791, 157, 134, 122, -104, -468, + 117, 132, 34, 259, -839, 383, -196, 199, -479, 387, -605, -387, 233, -160, -72, -461, 359, 473, -3, 51, -220, 710, 175, 192, -131, -619, -135, 338, -64, 507, 2, -187, 121, -38, 317, -613, -76, -471, 503, -191, 167, -17, -21, -556, -197, 482, 152, 40, -149, 11, 59, -712, -737, 778, -350, -852, 342, 397, -686, -897, -627, -603, 103, 233, -78, -580, -22, -313, -149, -422, -27, 37, 38, -88, 391, -220, 151, -187, -13, 103, -105, -21, -238, 303, -77, 103, -176, -256, -57, 115, 134, 37, -248, 138, -40, -202, + 186, -303, -64, -190, 292, -138, -335, 136, -136, -149, -443, -30, 93, 359, 144, -224, -117, 28, -65, -123, 62, -25, -90, -91, -35, 360, -506, -292, -530, -56, 116, -726, 121, -359, 1007, 46, -895, -214, 442, 261, 219, 447, 462, -657, -161, -258, 615, -221, 717, -7, -406, -334, -631, -736, 48, 79, -115, -382, -156, 43, 120, 245, -353, 175, -415, -499, 100, -111, -127, -520, -484, -240, -147, 694, 68, 230, 396, -17, 883, 351, -290, 41, 456, -182, 576, -155, 75, 35, -775, -800, 121, 552, 15, -178, -867, 52, + 300, 183, -296, -247, -171, 103, -373, 920, 524, 563, 115, -656, 240, 294, 923, 209, 96, 366, 160, -154, 11, 280, -24, 35, 94, -237, -162, 272, 10, -226, 292, -183, -65, -141, -132, 255, -164, -77, 138, -280, 119, -28, -157, 337, -121, -3, -432, 262, -131, -115, -278, -399, 65, -162, 281, -11, 167, 105, 8, -168, 6, 250, -1, -435, -392, 831, -256, -311, -42, -232, -565, 10, 395, -975, -15, 251, 313, -334, 223, -559, 45, -145, 177, -501, 313, -851, 141, 22, 484, 452, 228, -319, 356, -105, 398, -431, + 70, 503, 402, -238, 84, 12, -109, 244, -93, -294, -325, 233, -589, 390, 94, -634, 599, 571, 540, 194, -277, 691, 86, 297, -422, -369, -405, 126, 160, 248, -569, 55, 422, -1096, 43, -360, 689, 443, 347, -97, 458, -430, -20, -299, -657, -28, -605, -508, 299, 810, -759, -180, -137, 814, -199, 356, -231, -142, -29, 288, -168, -71, 26, 196, 146, 104, -106, 30, 87, 403, -317, 337, -71, 247, 3, 66, 88, 155, -209, -47, -39, -261, -232, -232, 163, 130, -46, -104, -133, -183, -112, 16, -79, -1, 245, -5, + -442, 209, -258, -39, 189, -72, 735, 147, 377, -1054, 494, -594, 801, -88, 318, 590, -637, 1145, 837, 616, -274, 160, 800, -206, -245, -192, -33, -605, 167, -325, -716, 695, 241, 186, 97, 156, 280, 732, 164, -467, -31, -485, 103, 62, -832, -42, 466, 27, -52, -263, 902, 178, 389, 190, -474, -351, -255, 549, 336, -117, 345, -56, -600, 584, 80, 671, 83, 63, 22, -905, 131, 18, 108, 552, -212, 873, -1327, -243, 1005, -410, 338, -461, -703, -579, 421, -398, 393, -622, -123, 98, -143, -248, -69, -78, 277, 613, + 74, 361, -111, -68, 460, -72, -120, 119, -217, 195, 402, -269, -31, -108, 81, 68, 195, 693, -118, 240, 22, 162, 263, 122, 48, 383, 430, -123, -50, 168, 101, 145, -532, -51, 524, -121, 116, 196, -19, 533, 185, -1079, -1297, -112, -609, 84, 366, -516, 148, -789, 341, -434, -2166, -137, 1317, -567, -247, 1328, -314, 73, 1586, -378, 348, 150, -235, 1281, -1033, -132, -31, -180, -210, -210, -29, 418, -238, -697, 5, 15, 203, 256, 43, 575, -25, 265, -160, -692, 480, -84, -716, 28, 408, 1261, 634, 1060, 19, 261, + 502, 120, -65, 990, -55, -386, 1156, 203, 202, 8, -167, 662, -4, -386, -438, -90, -90, 1002, -684, 87, 126, -179, 1174, 9, -757, 126, 381, -554, -30, 563, 462, -286, 41, -323, 268, -88, 34, -318, 291, 2, -36, -462, 187, 155, -304, 22, 105, -157, -106, 353, 52, 196, -134, 102, 612, -562, -259, -186, 662, 245, 349, -405, -371, -153, -48, -491, -552, 654, 262, -389, -363, -223, -8, -386, -339, 1, 98, 246, -68, -126, 200, -53, 63, 737, 592, -1211, -594, 934, -173, -907, -10, 20, 328, 987, 875, -539, + 161, -121, 6, -8, -569, 857, -255, -560, 198, -401, 485, 44, 690, -212, -657, -591, 523, -251, 681, -182, 441, -447, -349, -212, 48, -562, 137, 31, 8, 551, -7, 185, -383, 274, -604, 647, -581, 385, 195, 544, -908, 32, 76, -273, -656, -1110, -186, -947, -365, -758, -354, -1386, -431, 631, 797, 435, 464, -73, 504, -987, -225, 155, 639, 178, -1359, -52, -597, -396, 1590, 1070, -752, -305, -528, 179, -1399, 88, 294, -398, -414, 257, 84, 16, -267, -234, -228, -231, 440, 404, -26, -110, -428, -492, -102, -121, 170, 431, + -832, -60, 421, 2, 539, -183, -508, 280, 582, 296, -343, 46, 540, -677, -480, 907, 55, -27, -86, 148, 214, 279, -107, -215, -253, -1592, 461, 256, -848, 337, 306, -605, -475, 723, 83, 388, -200, 480, -158, -70, 367, 186, 116, 15, -259, -429, -271, 684, -246, -584, 994, 623, 72, 461, 128, -513, -1536, 630, -58, -822, 686, -69, -1122, -934, -495, 735, 286, 762, 948, 289, -780, 248, 270, -980, -166, 558, -315, -1068, -821, -1303, -841, -186, 818, 1199, 568, -76, 815, -202, -2026, -1597, 344, -803, -964, 1374, 174, -1841, + -1433, 490, 78, 319, 678, 1655, 940, -135, 1832, 590, -1937, 21, -419, 1002, 292, -629, 303, -471, -290, -409, 620, -111, 451, 390, 489, -106, -506, -157, 336, -210, 281, 191, 201, -428, 45, 180, 2, 782, -34, 350, 69, -124, 409, 105, -69, 467, -228, -66, 276, 121, -51, -183, -269, 34, -308, -219, 154, 227, -238, 1508, 1471, -465, 515, -605, 372, 17, 217, -720, 61, -615, -542, 3, -1259, 29, -533, 139, 375, -12, 434, -623, 945, -467, -13, 649, -609, 238, 473, 576, 87, 207, 146, -909, -502, -148, 137, 139, + -132, 601, -191, -9, -112, -261, 215, 119, -715, 210, -574, 157, -1383, -68, -32, -4, 568, -229, -503, -227, 522, -3, -1337, 1872, -162, -359, 410, -83, -274, -352, -371, -403, 1287, -498, -742, 635, 64, -1016, -237, 422, 339, -336, 695, -124, -188, 639, -470, -435, 813, -361, -126, -46, 345, 164, -6, -59, 22, 151, -165, -15, 161, 166, 204, -500, 130, 248, -482, 38, 104, -89, -194, 192, 58, -178, 30, -20, -79, -613, 349, -364, 112, 100, -549, -34, 30, -7, -5, -190, -24, 152, -20, -1193, -1759, -1692, 3747, 3108, + 3541, 7998, 2095, -2003, 635, -6414, -6798, -1682, -4271, -3304, 2027, -1049, 426, 5099, 2535, 3780, 7261, 4839, 1271, 1056, -2131, -6601, -5040, -3859, -7796, -3153, 196, -1376, -613, 3954, 1056, 537, 4900, 613, 1180, 6954, 5118, 3241, 6579, 3280, -1141, -91, -2067, -10222, -8915, -7204, -11198, -8532, -3013, -4037, 927, 7796, 6967, 9635, 12165, 9052, 7066, 6871, 3810, -1272, -2430, -5567, -7950, -7812, -6764, -7754, -7931, -6377, -3557, -2578, 982, 6105, 8799, 12550, 14118, 8432, 2061, -1192, -8478, -8071, -6143, -4774, -1764, 912, 683, 879, 1101, 520, 1293, 1806, 1347, 2178, 1247, -540, -659, -1899, + -3479, -946, -1078, -1249, 1111, 953, -1172, -1518, -2830, -4635, -1937, 2663, 4529, 8768, 10580, 7195, 4473, 1206, -3947, -5784, -6544, -7656, -7192, -5518, -4467, -3696, -2235, -554, 1945, 6701, 9351, 8301, 5974, 3693, 819, -1424, -2180, -2768, -1967, -514, -74, -554, -931, -1510, -2428, -3161, -3051, -3063, -1784, 316, 1161, 2111, 2774, 2806, 2189, 1494, 858, 483, 699, 950, 972, 859, 517, -197, -1138, -1898, -2325, -2376, -1909, -1508, -1220, -630, 173, 679, 881, 1012, 1080, 1286, 1414, 1268, 728, 319, 94, -186, -269, -165, -258, -148, 50, -82, -364, -443, -725, -1029, -982, -879, + -671, -101, 370, 607, 862, 985, 710, 545, 305, 85, 79, 280, 261, 234, 132, -182, -404, -623, -846, -853, -671, -366, -54, 280, 498, 594, 488, 319, 144, 51, 20, 15, -20, -50, -91, -103, -100, -70, -45, -10, 1, 16, 1 }, + {273, -36, 22, 215, -28, -10, -63, 234, 14, 114, 69, 69, -97, 49, -150, -16, 116, 24, 68, 109, -185, -129, 44, -9, 137, 83, -7, -76, -48, -94, -15, -13, -14, 26, 36, -82, 137, -32, -22, 47, -175, -40, 76, 27, 173, -1, -13, 34, 12, 72, 120, 152, -9, -16, 3, -88, -111, 61, 99, -70, -67, -45, 126, 75, -17, 20, -149, -43, 78, 64, 110, -160, 36, 61, -33, 113, -7, 99, 47, 32, 125, 62, 32, 1, 15, -30, 10, 17, -10, -44, 22, 22, -33, -5, -22, 23, + 36, 1, -5, -2, -33, 16, -12, 28, 13, 9, 6, -15, 9, 4, 14, -27, -13, -6, 4, -36, 355, 98, -81, 181, -88, 189, -63, -86, 96, 176, -5, -87, 47, 37, -7, -251, 59, 73, 20, 157, 211, 113, 208, 141, 127, -34, 141, 68, -107, 40, 65, -137, -174, -27, 69, 3, -63, -84, -82, -41, 94, 189, 160, 60, 123, -198, 12, -51, 2, -227, 84, -22, -54, -9, -62, -112, -79, 80, 19, 61, -83, 155, 40, -180, 74, 23, 50, 98, 30, 181, -58, 20, -211, 40, 20, 6, + 5, -40, 150, -46, -70, 114, -118, -58, -49, -22, -55, 38, 10, 20, -2, -5, 2, -22, 13, 20, -8, -9, -1, -39, -64, 23, 8, -50, -7, -6, -11, -61, 16, 0, -2, 4, 11, 6, -23, -1, -42, -5, 17, -72, -73, -23, 66, -122, 35, -240, 45, 46, -28, 172, 11, -19, 15, 91, -148, 21, 45, 94, -210, -106, -79, 77, 31, -66, -212, 52, -211, -13, 83, -39, 63, -36, 142, 211, 111, -109, 20, 160, 98, -98, 82, 25, -165, 58, 225, 106, 75, 252, 22, -95, -193, -8, + -109, -129, -62, 139, -132, 46, -79, -73, 161, -21, 26, 129, 175, -78, -161, 205, 157, 101, 9, -123, 19, 162, -165, 50, -107, -3, 100, -94, -6, -181, -48, -16, 27, -9, -69, -8, 34, -53, -14, 25, 20, 16, 14, -3, -14, -71, 38, -4, 39, -27, -48, 17, 37, -24, 33, -5, -3, -3, -8, 40, -24, 16, -24, -476, -174, -73, 260, -99, -39, -154, -130, -22, -343, 192, 64, -10, -127, 190, -53, 96, -77, 61, 121, -151, 16, 167, 94, 67, 178, 159, -100, -128, -159, -3, -209, 50, + -276, -53, 203, 107, -70, -22, -208, 94, -89, 183, -106, -188, -39, -78, -155, 60, -36, -98, -100, -333, 45, -100, -247, -66, 152, 78, -128, 105, 135, 131, 48, -170, -29, -38, 118, -120, -46, 62, 63, -186, -222, -399, -68, -232, 76, -9, -56, 117, -25, -53, 51, 80, 77, 60, 139, -59, -49, -37, 20, 7, -32, 38, 55, -12, 13, -24, -32, -6, -21, 6, 12, 2, -35, 5, -24, -9, 20, 45, -20, 54, 65, 10, -19, -57, -12, 38, 25, -25, -414, -166, -74, -123, 141, 184, 174, -346, + -258, 100, 422, 249, 0, 60, 120, -151, 100, -140, 101, 150, 23, 120, 38, -8, 62, 37, -113, -143, 198, 80, -144, 142, -79, -14, 340, -162, 193, 380, 155, -21, 15, -137, 178, -181, -99, -305, 58, 236, -6, -216, -77, -306, -155, -57, -435, -237, -43, 47, -191, 97, -50, -150, 163, 482, 45, 246, 167, 145, -152, 65, -260, 28, 75, 59, -101, 3, -263, -91, -92, -18, 128, 138, -6, 54, 75, -37, -29, -24, 25, 4, 19, 15, 42, -22, -1, -63, -8, -9, 46, 27, -27, -38, -37, -35, + -12, -43, 16, 82, -64, -8, 28, 47, 647, 409, -223, 83, 208, -86, 119, -40, 194, 97, 62, 176, 100, 87, -55, -433, 207, -74, -99, 339, 210, 117, 156, 116, 86, -66, 50, 14, -111, 90, 147, -244, 47, -158, 117, 135, -382, -6, -454, 8, 57, 39, 124, 310, -38, -161, -79, -86, -119, 89, 96, 30, -50, -56, 302, -100, -60, -165, 268, -41, 225, -106, 241, -232, -487, -145, 31, 98, 165, -164, -122, 67, 44, -76, -127, 304, -119, 289, 77, 205, 81, 149, 126, -52, -20, 58, -8, 158, + 4, -52, 15, -177, -35, -41, 12, -59, -23, -20, -4, -21, -93, -76, 23, 6, -104, -7, 16, 15, 43, 18, 103, 4, -34, -4, -14, -48, -56, -23, 16, 303, -116, -201, -9, 32, -288, -225, -72, 79, -43, 374, 224, 10, 357, 129, 104, -305, 287, -53, -72, -258, -117, 229, 226, -64, 150, -310, -44, 209, 157, -116, -220, -123, -136, -170, -141, 34, -232, -22, 320, -154, 37, -12, -74, 125, -51, 209, 0, 295, -76, -185, 107, -146, -145, -146, -418, 49, 173, 250, 180, 328, -33, -126, 189, -232, + 54, 36, -35, 213, 198, -51, -253, 51, -130, -240, -223, 123, 216, 136, -467, 106, 50, -23, 221, 120, 181, 69, -17, 237, 32, 108, 86, 19, -106, 18, -59, -130, 25, 40, 62, -15, 17, 15, 12, 47, 31, 33, -4, -81, 59, -32, -36, -30, -58, 108, 122, 104, 42, 12, 18, -24, 84, -374, -210, 34, -205, -551, 418, -14, -22, 47, 38, -366, 257, -381, 39, 167, -44, 57, 66, -410, -131, -185, -32, 78, -128, -90, -11, -29, 42, 164, 96, 359, -127, 495, -30, 9, -321, -53, 248, -53, + -497, 198, 239, -154, 129, -193, 354, 188, -5, -25, -218, -147, -239, 224, 231, 95, 31, 98, -192, -523, -184, 177, 85, -389, 15, 41, 58, -189, 138, 269, 146, 1, 116, 184, -101, 276, 10, -12, -272, -358, 233, -112, 118, 111, -14, -80, -73, -63, 41, -91, 120, 23, -27, 26, -36, 1, -140, 33, 16, -29, -76, 24, -67, -7, 27, -18, -43, -4, -43, 172, 137, 47, -17, -18, -47, -2, -16, 109, -34, -18, 110, 22, 48, 76, -51, -32, 83, 46, -19, -15, 118, -576, 311, -80, 115, -172, + -91, 240, -278, 270, -168, -328, 149, -177, 696, 102, -242, -340, -59, -421, -191, -453, -25, 300, -213, 184, 306, -284, 2, -331, 186, 63, -11, 192, -205, -297, -249, 15, 56, 246, -357, 252, 51, -530, -290, -428, -174, 160, -143, -144, -810, -19, -177, -77, -520, -183, -68, 38, 425, 384, 328, 186, 409, -443, 343, 45, 160, 113, -314, 486, 304, 190, -214, -291, -207, 281, 33, -1, 154, 72, 162, -145, 430, 223, -46, -73, 97, 84, 53, -28, -26, 37, -6, -10, -178, 8, -102, 4, 57, 17, -10, -2, + 36, 28, -169, -48, 61, -52, -66, -7, 23, 25, 33, -28, -35, 26, -73, -129, -31, -34, -40, 20, -9, 109, 53, -48, 50, 34, 29, -50, -88, -5, 14, 92, -32, -25, 218, 403, 437, 179, 306, 248, 148, -80, 33, -119, 11, -41, -264, 337, 534, 213, -145, 240, 228, -9, 142, -251, -485, -322, -220, 141, -58, -253, 191, -87, -226, -2, 394, 199, 293, 103, 216, 239, -53, 219, -83, -249, 107, -288, 109, 116, -423, -275, 176, 442, -226, 308, 430, -353, 17, 392, 44, -141, -31, -199, -348, 6, + -104, -182, 243, 14, -398, 515, -210, 418, -490, -335, 243, -301, 170, -202, -146, -283, -172, -230, -579, 98, 358, -162, -24, 248, 265, 189, -34, -19, -148, -45, -64, -77, 65, -14, -53, 87, 79, -35, -6, -102, 48, -90, -165, -10, 158, 3, -85, -21, 259, 131, 11, -75, -91, -66, 18, 20, -76, -27, 5, 32, 105, 27, 164, 99, 118, 46, 54, 65, -20, 4, -359, 229, -151, -399, 573, 288, -393, 279, 263, 71, 484, -983, 77, 400, 145, 34, 434, 14, 241, -569, -70, 152, 14, -286, 117, 226, + 117, 106, 309, 249, 408, 313, -117, -131, 317, -193, 225, -354, -184, -452, -198, 247, 94, -106, 377, -441, -586, -962, 305, 330, 267, 201, -220, 151, -125, 361, 976, -152, -197, -423, -127, 361, -240, 206, 364, 57, -1, -283, -75, 132, -664, -622, 69, 82, -231, 339, 267, 488, 800, 314, -177, -98, 174, -6, -431, 206, 190, 155, 59, 202, -2, 111, 101, 61, -93, 7, -4, -15, 169, 47, 4, 83, -168, 48, 37, -23, 177, 32, -44, -31, -100, 302, 26, 51, 133, -46, -40, 170, -180, 169, -130, 140, + -4, -13, -27, 56, -23, 145, -114, -50, 50, -28, -36, -93, -136, 102, 1452, 822, 523, -134, -148, -18, -124, -149, -226, -271, -466, 21, -33, 114, 203, 388, 585, -78, -762, -297, 654, -102, 245, -84, -11, 436, 151, 331, 194, -13, -20, -6, 220, 281, -109, -429, 562, 403, 286, 106, 146, -228, -426, 586, 327, 151, -272, -302, -425, -261, -76, -265, 147, -543, 75, 401, -261, 142, 24, 59, -620, 220, -266, 452, -995, 171, -260, -336, 82, -203, 205, 194, -648, 7, 453, 68, 133, 285, 116, 473, 193, 100, + 32, -69, 305, -602, -11, -35, -55, 24, -17, -5, -52, -89, -116, 187, 157, -82, -13, -288, 28, -18, -284, -1, -422, -321, 142, 54, 222, -251, 108, 218, 48, -9, 57, 117, 10, -63, 232, 2, 76, -136, -102, 96, 139, 24, -893, -458, 66, -784, 180, 569, -274, 692, 812, 103, 405, 501, 224, -480, 313, 382, -19, 97, 269, 239, 573, 98, -221, 366, 131, -57, 8, 245, -335, -151, -142, 205, 106, -472, 139, 395, 10, 476, -450, -850, 68, 381, 576, 535, 276, 254, 203, -577, -169, -24, 433, 685, + -237, 148, -252, 162, 109, 417, 646, -249, -283, -56, 354, 454, 636, 16, -688, -649, -106, 84, 2, -297, 7, -782, -505, -462, -526, 224, 81, 630, 503, 190, -301, -301, -280, -254, -437, 206, 137, 81, 294, 327, 2, 279, 57, 298, -104, 247, -79, -22, 73, -91, 413, 186, 245, 111, 294, 66, 141, 422, 366, 196, -24, -162, -139, -298, -168, -196, -117, -181, -219, -127, 127, 281, 78, -66, 10, -42, 176, 208, 172, -18, 77, -318, 377, -834, 75, -167, 457, -245, -38, 142, 346, -466, -784, -136, -308, 22, + -354, 208, 205, 21, -423, 264, 26, 707, -113, 387, -327, 730, 210, 456, 306, 497, 731, -178, 283, -511, 539, 524, -12, 171, 528, -338, -327, -54, 1063, 173, -297, 528, 69, 405, 582, 170, -39, 55, 91, 385, -134, 412, -284, 403, -223, 908, -132, 781, -708, -777, 1082, -905, -485, 37, -292, -561, 494, -65, -697, -329, -358, -1024, -380, 127, 230, -790, -202, 481, -96, 276, 473, -337, -77, 78, 309, 223, 233, -76, -45, 192, -17, -126, 105, 221, 42, 154, -4, -141, 0, 204, 77, -103, -256, -154, 300, -137, + -403, 97, -231, -438, 1, 167, 16, -112, -32, 122, -92, 8, 158, -7, -73, -93, 285, 548, 30, -190, -159, -87, -257, -53, -108, 108, -700, -467, 136, -916, -534, -636, -647, 789, -19, 27, 235, -230, -1007, -753, -738, -1504, 109, 171, 650, 380, 225, 324, 225, 70, -475, -698, -402, 542, -69, -408, -165, 531, -642, -414, -660, -328, -56, -633, 235, -526, 569, 399, -88, 393, -387, -796, 348, 464, -411, -913, 688, -59, 498, 418, -1306, -928, 9, -212, 850, -488, -564, -152, 313, 48, -79, -296, 1129, -554, -920, -1243, + 891, -213, -1024, 477, 485, 288, 1029, 1101, 1130, 483, -257, -104, -176, 375, -724, 465, 88, 91, 352, 341, -299, 436, -343, 145, -487, -278, -190, -253, -101, -273, -68, 186, 510, 594, 24, 465, -280, 67, 275, 36, -518, 62, 126, -145, -385, -247, -238, 615, 383, 198, 289, 519, -83, -622, -391, -358, -446, -578, 100, -485, -847, -18, -150, -201, -161, 128, -826, -329, 385, 626, 1275, 209, 667, 323, 322, -291, -93, -248, -699, -822, -1154, -420, -1039, -409, -544, -203, 558, 137, 380, 657, 1, 444, 129, 23, -15, -87, + -877, 319, -109, -991, -613, 289, -635, -244, 232, 719, 873, 304, -181, 120, 584, 313, 123, -17, -1728, -348, 383, 439, 175, -66, -582, 404, -519, -392, -102, 106, -289, -923, 494, -118, 1149, 437, 393, 441, 845, 1894, 29, 32, -79, -564, 337, -391, 1377, -122, -493, -444, 582, -747, -504, -98, 1178, 40, 562, 870, 176, 705, 534, -97, 490, 531, 18, -362, -390, 110, 135, 446, 286, -19, -66, 79, 182, -330, -69, -81, -43, -518, 327, -376, 132, -76, -224, 63, 631, 552, 2, -37, -401, -164, -399, -59, -464, -661, + 195, 459, 32, 27, -228, -346, 967, -131, 176, -1058, -358, 1239, -826, -226, -715, -2114, -300, 648, 535, 102, 154, -115, 1185, -1277, -1, -368, -853, -723, -107, 242, 213, 285, 765, 495, -541, -552, 1521, 1242, -99, 145, -166, 404, -5, 886, 323, 471, 133, 68, -1572, 651, -67, -907, -461, 89, -243, -902, 869, -154, -641, -135, 96, 769, 862, 655, 254, 767, 821, -616, -672, -431, -109, 795, 1064, 182, 384, 1019, 614, -956, 708, 257, -209, 37, 1962, -1298, 1001, 1144, -1150, -68, -747, -242, -1653, 476, 734, -996, 603, -862, + -621, 754, -468, -70, -281, 37, -412, 128, 193, -314, -442, -35, -480, 632, 115, -593, 131, -100, -321, -311, 206, 403, 507, 207, -453, 1163, -214, 116, -74, -616, 237, 336, -311, 496, 128, 371, -85, -595, 203, 897, -580, -832, -1359, 272, -264, -428, -553, 303, -337, -154, 886, -276, -55, -696, 52, 448, -984, -616, -591, -286, 351, -1319, -740, -1904, 326, -18, -490, -211, -287, 408, 606, -676, 20, -235, -235, -1190, 256, 914, 236, 692, 862, 778, -1050, -319, -321, -489, 872, -897, -524, 31, 1269, 288, -454, 1284, -729, -679, + 1526, 1467, 135, 373, -424, -1391, -435, 1400, -686, 1269, -465, -1999, -534, -935, 1059, 9, 232, 955, -159, 787, -1035, -1212, 925, -243, -2048, 1260, -657, 344, 407, -714, 1348, -925, 485, -15, 354, 1372, -355, -434, 47, -286, -379, -310, 150, 308, 71, -197, 168, -654, 584, 411, 327, 130, 0, -306, -336, -318, 273, 535, -529, 464, 1079, 363, -931, 89, 335, -345, -616, 576, -522, -12, -49, -555, -717, -8, 402, -237, 928, -313, -620, 430, -277, 32, 360, 710, 47, -1266, 744, 868, -1056, 578, -12, -376, -455, -1511, -674, 535, + 90, 1393, -1123, -628, 255, -151, 885, -1236, -5, 129, -1053, 1049, 567, 321, -498, 719, -855, 471, 358, 222, -67, -473, 190, 953, -508, -181, 179, -745, 753, 31, 192, -1021, 544, 136, 180, -2397, 321, -681, 1113, 928, 977, 504, -1958, -342, 410, 42, 121, 1374, -213, -827, -1001, 40, -1112, -968, -867, 413, -1619, 1144, 2179, -574, -272, -1708, -382, 654, 394, -569, -126, -2067, -735, 2075, 874, -644, 598, -1173, -875, 228, 37, 140, -803, -276, -175, -2, -1160, 247, -156, -362, 145, 475, -637, -316, -107, 226, -492, -130, -91, -458, + -1, -848, 1097, 355, -298, -113, -333, -48, 701, 210, -139, 368, -238, -1055, 41, 46, 215, 465, -284, -201, 452, 552, 229, -510, -1134, -1582, 443, -703, -450, 458, -366, -567, 453, -741, -27, -842, 1208, 4, -853, -274, 37, -104, 294, -598, -386, 114, 257, 123, 134, 435, -507, -218, -1188, 431, 129, -384, 887, 460, -341, 1316, 311, -853, 648, 93, 427, 864, -67, -231, 152, 709, 424, 1, -60, 760, -55, -915, -143, 152, 724, -329, 1237, 1339, -846, 693, 1533, -424, 2321, 1290, -566, -539, -858, -997, -545, 295, -161, -187, + -19, -162, -1602, -637, -1582, 361, 1439, -546, -76, -788, 398, 85, 286, 387, 1209, -70, 555, 546, -889, 28, 9, 186, 404, -61, -202, 364, -45, -217, 58, -383, -79, 265, 62, -170, -851, 35, -387, -42, -324, 711, -231, 343, 444, -352, 533, 327, 15, -194, -319, 73, -28, -196, -24, 351, -267, 148, -91, 251, -671, 2038, 538, -730, 81, -958, -126, 336, -398, -509, -568, -215, 218, -125, -183, 259, 149, 351, -363, -228, 261, -94, 46, -530, 359, -620, 297, 204, -134, -28, 22, -360, 60, 73, -288, 518, -280, 125, + 2, 17, 261, -256, -398, -120, 598, -445, 293, -816, -486, 154, -177, -14, -55, -492, 520, 415, 37, -360, -19, -220, 106, -274, -10, -263, 195, -73, 50, 658, -559, -49, 98, 39, -123, 15, -266, 14, -223, 135, 259, -401, -333, 190, 23, -96, -318, 135, 40, -15, -74, 2, -75, 219, -149, -42, 100, -75, -14, 175, -121, -79, -48, 36, 180, -64, -208, 11, -135, 473, -195, 57, 105, -122, 376, -56, -332, 116, -191, 232, 111, -54, -24, -89, -93, 229, -156, -72, -29, -204, 255, -986, -1436, 998, 4634, 2017, + 2129, -23, -4273, -3108, -1604, -3383, 1646, 2004, 1055, 4355, 1970, -198, 1455, -2832, -3592, -2064, -2514, -553, 1958, 1988, 844, 3346, 1673, -242, 1621, -1494, -2541, -1470, -1910, -3017, 1115, -34, -1073, 3232, 1958, 1090, 3323, 794, -1678, 1626, -2396, -2746, -555, -2888, -2917, 1149, -478, 700, 3690, 2518, 2632, 2473, 306, -1396, -1601, -2695, -3523, -1856, -1001, -736, 1351, 2095, 1977, 2788, 2527, -395, -442, -459, -2587, -782, -1273, -1930, 434, 784, 131, 1789, 803, 11, 1126, -870, -950, 21, -617, -200, 471, -101, 522, 691, -382, 543, 224, -845, 81, -406, -1596, -27, + -405, -686, 1542, 458, 580, 2020, 803, 590, 446, -1008, -1468, -1365, -2286, -1873, -833, 75, 1027, 2347, 2489, 2283, 2024, 1248, -500, -1438, -2862, -3628, -2800, -1683, -595, 1522, 2822, 3243, 3325, 1601, -401, -1100, -1352, -1743, -1260, -1295, -1048, -156, 314, 512, 880, 945, 865, 789, 428, 112, -135, -449, -698, -690, -592, -425, -244, 83, 272, 376, 390, 375, 242, 146, -1, -14, -67, -98, -144, -75, -115, -128, -123, -81, -175, -72, 2, 90, 201, 277, 185, 250, 153, 48, -86, -194, -307, -267, -267, -124, -16, 131, 158, 236, 195, 161, + 58, 27, -75, -73, -120, -103, -93, -23, -45, 25, -7, 38, 28, 28, -10, 61, 29, 70, 19, 29, 1, 4, -69, -44, -87, -47, -52, 3, -6, 54, 29, 66, 29, 46, -3, 18, -27, -3, -38, -1, -32, 8, -20 } + }, + { + {148, 83, -132, -32, -48, -5, 200, 10, -84, 104, 23, 10, 36, 21, 3, 149, 86, -103, -38, -13, -35, 41, 65, 42, -42, -66, 26, -132, -58, 97, 10, 78, 42, -65, 49, 0, -55, 137, -91, -44, 19, 46, -62, -18, -89, -180, 169, -35, -92, 9, 155, -1, 61, -78, -44, -33, 48, -62, 124, 18, 112, -162, 69, -43, 28, 67, -27, -19, -118, 0, 66, 13, -32, -7, 59, -32, -31, 89, -40, 28, -16, -7, -110, -47, -29, 39, -7, -51, -7, -11, -30, 28, -36, 1, 10, 18, + 31, -14, -26, 27, 7, -22, 5, 47, -5, -6, 20, 0, 8, 7, -14, -27, -14, 19, -4, 1, 11, -15, 14, -1, -8, 52, 421, 144, -33, 113, 6, 207, 131, -30, 107, 186, 244, -144, -140, 59, -56, -48, 175, 140, 135, 95, 19, -6, -60, 66, 47, 222, 23, -5, -98, 46, 66, -13, -30, -35, 61, -9, -35, -82, 87, -30, -29, 122, 175, -45, -21, 100, 91, 159, 99, 43, 17, 135, 77, -188, 1, 57, -107, 2, 18, -134, 69, -65, 101, -22, -17, 53, 18, -93, -8, 51, + -18, -23, -26, 9, 107, 18, -107, -26, 26, -33, -13, 157, -31, 18, -18, -41, 36, 58, -15, 26, 29, -30, 14, 26, 7, -20, -55, -18, -33, -16, -3, 17, -10, 20, 12, -6, 145, -11, -275, -128, -54, -59, -150, -137, -86, 149, -164, -76, -78, 30, 248, -37, -20, 61, 142, -217, -36, 45, -96, 77, 121, -134, -9, 17, -78, -197, 34, -83, 27, -76, 113, -136, -127, -313, -85, 108, -18, -120, -59, -15, -126, 7, -21, 87, 68, -32, 4, -32, -133, 163, 28, 110, -41, 1, 28, 48, + 126, -40, -31, 37, -4, 138, 73, -119, -47, -29, -188, -21, -18, 112, -72, 102, 17, -3, -11, -18, -21, 22, -76, 35, -44, 39, 32, 15, 9, 110, 80, -20, 99, -13, -34, -31, 19, -7, 68, -17, 42, 35, -6, 29, 0, 31, 30, 9, 10, 33, 22, -45, -25, -4, 55, 62, 0, -6, 33, 1, -21, -605, -188, -54, -48, -51, 234, -216, 104, -51, 48, -62, -49, -174, 29, -64, 14, -253, 6, -27, -45, -5, 48, 37, -23, -18, -100, 30, -81, 52, 0, 45, 158, -42, -180, -78, + -211, 28, 38, -20, 37, -75, 71, 35, -93, 7, -253, -55, -169, 92, 168, -149, -11, 47, 26, -243, 40, 123, -116, -56, -276, 93, -40, 113, 204, 116, -164, 34, 39, 8, -183, 46, -78, 121, -49, -7, 57, 49, 144, 163, 112, -9, 41, 97, 49, -97, -20, -65, -65, 29, -3, 15, 2, -20, -5, 58, -19, -20, 2, -17, -43, 53, 2, 25, 65, -9, 7, -52, 33, 22, 5, -52, 17, 0, 34, -375, 42, 66, -133, -18, 367, 283, 155, -42, -65, 181, 115, 57, 70, -148, 51, 13, + 173, -165, -74, -33, 23, -35, -188, -130, -132, -159, 89, 104, 69, 46, 5, 45, -23, -22, 13, -59, -15, 82, 66, -130, -142, -15, -143, 85, -42, -245, 31, 122, 177, 120, 8, 113, -172, -57, -76, -14, 14, 76, -58, -161, 195, -178, -83, 118, 282, 64, 57, -275, 298, 34, 208, 316, -69, 32, 39, -132, 265, 60, -85, 71, -35, 128, -215, -118, -220, -45, -97, 86, -55, 35, -102, -29, -19, -69, -3, -27, 29, -7, -27, -18, -12, 50, 16, -42, -88, 48, 52, 7, 2, -4, -36, 13, + -23, 52, 12, 28, -30, -39, -70, 39, 564, 400, -143, -206, 313, 206, 329, 487, -246, 170, 80, 143, 63, 87, 200, 52, 204, 9, -132, 57, -43, 71, -25, 379, 63, 85, 51, 17, 131, 58, 7, -22, 94, -71, 180, -138, 217, -100, 131, 71, 80, 66, 318, 246, 15, -66, -173, 191, -211, 55, -92, 95, 199, 26, -334, -269, 28, -166, -183, -103, -211, 78, 365, 186, -135, 11, 42, -93, -108, -15, 180, 202, -212, 103, 234, 49, 77, 116, 183, -29, -125, 51, -54, -8, -120, 113, 173, 29, + 31, 27, -121, -15, -2, -11, 12, -16, 20, 18, 59, 9, -1, 8, 38, 68, 34, 72, 38, 16, 20, -12, -113, -114, 24, 89, 22, -23, 21, -12, 55, -40, -40, -70, 32, 251, 46, 362, -33, -3, -121, -95, 119, 274, -81, 74, 18, 297, 121, -136, -129, 21, 61, 270, 262, 402, 71, 113, -72, 165, 184, -71, -93, 145, -112, -152, 143, 45, -179, -217, 330, 168, -12, 213, 40, -147, 314, -73, 8, -7, 81, -114, 81, -114, 78, -106, 95, -86, 130, -109, -113, 294, -368, 22, 43, -125, + 24, -412, -204, 198, -166, 122, -45, 83, 35, 71, 43, -186, 100, -108, -13, -237, -130, -59, -58, 69, 223, 131, -181, 71, 34, 2, -88, 13, -17, 45, 20, -45, -62, -23, -18, -34, 129, 25, -50, -27, 30, -53, 5, 27, 1, 8, -137, -55, -35, 21, -39, -5, 86, -7, -23, -25, 9, 27, -294, -251, -2, 111, 204, -238, 68, -214, 176, 137, -296, -60, 31, -345, -198, 212, -28, -14, 49, -21, -364, 333, 20, -234, -115, 45, -31, -225, -69, -129, 37, -10, -73, 74, -315, -139, 80, 412, + -70, -241, -172, -133, 279, -297, -60, -20, -319, -396, 97, -274, -45, 42, 209, 118, 16, 46, 249, -107, -79, 372, -248, 194, -86, -92, -38, -44, 395, 10, 153, -406, -296, 11, -60, 456, 14, 311, 130, 389, 235, -58, -271, -100, 181, 80, 122, -149, -170, -46, -57, 81, -42, -108, -20, -26, -2, -13, 14, -44, -61, 75, -6, 5, -21, -32, -26, 21, 62, -66, 14, -40, -61, 43, -19, -56, -66, -12, 61, 7, 7, 24, 110, -94, -79, -48, 8, 45, -489, 49, -50, 335, 36, -352, 419, 137, + -250, -541, -229, 537, 24, -67, -92, 56, 15, 166, 85, 178, -41, 317, -166, -372, 13, 18, -92, -13, 137, -95, -60, -32, 295, 232, 117, -21, -409, -7, -24, -16, -71, -6, -181, -330, -55, 229, 218, -83, 235, -76, 99, 263, 247, -552, 186, 200, 79, -134, -488, 295, 170, 95, -177, -96, -200, 109, -221, -40, 0, 198, -127, 101, 51, -354, -53, -237, 385, 181, -460, -96, 358, 181, -192, -94, -212, -70, 104, -63, -29, -79, -104, -173, 30, 14, -60, -18, 85, 60, -114, -39, 77, -21, 58, -72, + -54, -14, 12, 93, -103, -71, 46, -113, -13, -80, 44, -63, 104, -39, -23, -56, 64, 46, 118, 35, 305, 370, 381, 290, 374, -470, -306, -162, -151, -225, -171, -377, -127, 25, 225, -1, -214, -11, 225, 10, -185, -88, 511, 49, 193, 58, 212, 43, 70, -314, 176, 11, 74, -329, 115, -505, 1, -160, 126, -47, -368, -9, -366, 67, -304, 278, -157, 438, 15, -8, 222, 47, -68, -65, 91, -150, 105, 270, 140, -201, -104, 579, 46, 462, -427, -90, -44, 336, -372, 53, 181, -372, 262, -233, 70, 362, + 41, 204, 98, 473, 207, -196, -152, -189, 31, 18, 201, -118, -20, 130, 11, 100, 138, 19, -107, 131, 103, -12, 43, 44, -46, -39, -153, 104, -72, -69, -28, -80, 79, -54, -16, -86, -19, -19, 112, 78, -1, -17, -4, 62, 78, 66, 143, -16, -52, -138, -473, 75, 453, 346, 369, -120, -100, 98, -68, 467, 151, 225, 386, -23, 142, -260, 385, 199, -101, -233, -224, 265, -453, 181, 256, -183, -254, -138, 239, 95, -94, -160, 1, -272, -419, 81, -403, -592, -77, 28, 602, -256, -208, 274, 443, 451, + 236, -22, 102, -187, 33, -197, 496, 444, 283, -16, -511, 1, -436, 484, 371, 236, -362, 302, 168, 211, -69, -302, -224, -241, 82, -340, -631, 128, 426, 230, 419, -124, -116, 427, 141, 61, 281, 97, 8, 246, 152, -19, 111, 109, 64, -77, -139, -181, 49, 122, 69, 248, 6, 178, -55, 75, 138, 22, -63, -35, -203, -171, 62, 47, 82, 216, 32, 165, -60, -32, 29, -153, -122, -42, -130, 66, -42, 54, 120, 170, 240, 380, 821, 363, 287, 265, -507, -81, -185, 647, -658, -627, 180, 422, -11, 516, + 471, -24, 182, -312, -224, 491, -193, 337, 120, -221, -114, -99, -108, -230, 192, 203, 171, 14, -255, -331, 426, -421, 330, 29, -516, 258, 492, -12, -133, -64, 41, 26, 336, -20, -252, -107, 286, -522, 126, -89, 424, 444, 299, 347, 461, 329, 121, -301, -337, 161, 225, -18, 195, 263, 702, -398, 444, -265, -168, 480, 74, -290, -251, -268, -432, -150, -211, 344, 9, -279, 152, 94, -58, 160, -329, 214, 15, -33, -35, 181, 32, 46, 192, -81, 32, 138, -210, 147, 9, 54, -94, 117, -41, 12, 164, -1, + -39, 40, 111, 137, 232, 187, 70, -109, -88, -331, 74, -276, -80, -121, -112, 128, 50, -133, -546, -98, 318, -392, 13, -247, -431, 627, 536, 448, 213, 117, 177, 460, 254, 472, -175, 395, -298, 479, 643, 403, 322, 164, 332, 334, -99, 666, 160, -402, 190, -407, -280, -84, -632, 11, -135, -172, -307, -160, -88, -20, -62, 27, 26, -363, -240, 75, -192, 151, 623, -314, -26, -59, 23, -298, 160, -143, 482, 102, 288, 451, 77, -30, -298, -662, 87, 493, 357, -93, -441, 372, 39, 224, -565, -406, -372, -560, + -347, -410, 190, 60, 143, 187, 258, -127, 263, 299, 9, 161, -96, -199, -205, -215, -87, -157, -10, 47, -21, 14, 39, -182, -169, -288, -99, -67, -161, 63, 23, -85, -261, -120, -97, -67, 217, 67, -95, -120, -44, -313, 85, -64, 161, 19, -99, -184, 192, -126, 275, -937, -600, -285, 669, 487, -363, 418, 377, 321, 315, -315, 32, 181, -313, -944, -173, -263, -579, 52, -198, -149, 176, 105, -129, 27, 442, 472, -871, 206, 43, 402, 136, 21, -543, 164, -140, -152, -374, -279, 696, -318, -14, 81, -186, 769, + 365, -345, -209, -605, -88, 575, 168, 172, -191, 350, -85, -154, 323, -195, 536, -129, 399, -819, -278, 465, 113, -78, 130, -907, -429, 134, -362, 135, 35, 97, 553, -211, 222, -47, -452, -82, 339, 490, -18, -211, -384, 6, -535, -178, 44, 623, 558, 72, 233, 66, -96, 306, 233, -128, 256, 190, 101, -221, -17, -117, 186, 126, 165, -19, -258, 235, 9, -125, -251, -18, -22, -241, 162, -177, -274, 300, -125, -110, -140, 62, 41, 239, 52, -49, 99, 145, -278, 69, 76, -113, 170, -408, -1173, -99, -142, -127, + 179, -468, 919, -168, 40, 1014, -1194, -124, -234, -114, -1368, 76, -213, -264, 462, -469, 71, 90, 220, -43, -500, 341, -329, 710, -124, -805, -61, -27, -408, -811, 363, 413, -681, 555, -616, -478, -296, 54, 47, 92, 390, -74, -376, -885, 178, -1196, -638, -411, -961, -567, -279, -58, -453, 686, 702, 157, -215, 779, 348, -88, -178, 561, 410, -190, 738, -621, -322, 812, 378, 1138, -624, -698, 178, -530, 570, 63, 196, 1082, -598, -637, -238, 226, 244, 274, 274, 315, -335, 134, 49, -21, -40, -220, -180, 318, -343, -15, + 67, -162, 41, -166, -14, -15, 70, -270, 138, 344, 100, 85, 376, 280, -28, -360, 332, 88, -127, -267, 345, 55, 10, 214, 267, -342, 178, 116, -248, -99, -385, 246, -47, -435, -217, 108, 913, 517, -84, 1232, -142, 504, -583, 718, 679, -65, -545, 55, 197, -307, 322, -447, -7, -140, -146, -508, -370, -233, -31, -167, -397, 586, 404, 106, -165, 97, 567, 264, 416, 259, -311, -484, 970, -131, -530, -225, -228, -131, 702, 26, -541, -211, -1345, -335, -158, 825, 572, -1639, -704, -402, -9, 78, -653, 476, 257, 414, + 820, -1076, 1049, 749, -341, -724, 46, -184, 279, 951, -495, -558, 779, -922, -1027, -418, 105, -299, -1125, -460, -364, 12, 61, -327, -23, 43, 13, 90, -711, -255, -236, 40, 199, -59, -228, -138, 75, 357, 388, -60, -337, -94, 493, 23, -129, 96, -670, -204, -316, 38, 115, -656, -662, 158, 575, -254, 377, 109, -186, -61, 153, 108, -55, 108, -19, 857, 115, 322, -668, -1055, 1525, 764, 69, 101, -343, -897, 315, -69, 770, 173, 286, 845, 467, -9, -90, 144, -514, -422, -547, -304, 507, -137, 33, 635, -108, 280, + -880, -789, -536, 459, 187, -27, 210, -278, -791, 1001, -949, 440, 452, 358, 159, 607, -390, -969, 719, 2038, -358, 987, -1184, -636, 733, 431, -1099, -307, -92, 958, -237, -101, -1495, -958, -343, -1095, 919, 982, 1545, -1364, 588, 175, -760, -40, -36, -1576, 1127, -465, 532, -158, 88, 2142, -577, 746, 490, -514, 932, 3, -179, 61, 241, 606, 369, 244, -21, 574, -534, -259, 45, 147, 265, -142, 461, 67, 205, -85, 349, -25, -511, 299, -628, -366, -146, 274, -67, 327, 734, 1140, 819, 231, 526, -299, 268, -14, -23, -43, + 109, -229, 322, -306, -1357, -777, -24, -211, -452, 161, 444, 41, -478, -29, -458, 1248, -380, 24, 954, -58, -970, -682, -661, -299, -350, 1039, 112, 168, 524, -290, -287, -180, -293, -641, -145, 1192, 390, 280, -791, 289, 66, -570, -62, -288, 1302, -1031, -882, -316, 166, -310, 44, 346, -672, -185, 1103, -890, 159, -226, -535, -944, -714, 31, -1305, -1586, 379, 320, 258, -1418, 1095, 1323, -447, -388, 86, -59, -296, -738, 536, 1998, 523, -498, 13, 314, 671, 178, -1181, -1060, 1147, -222, -465, -693, 240, 1305, 403, -417, 244, -54, + -230, -117, -68, 576, 322, -200, -318, 259, 154, -51, -130, 209, -308, 190, 503, -48, -276, -85, -177, -306, -560, 80, 430, -288, -353, 174, -441, 1, -718, 344, 449, 1145, -364, -157, -474, -487, 138, 252, 477, -57, -103, -480, 194, 119, 144, -142, -30, 302, 350, -434, -1142, 316, 447, -1693, 928, 39, -482, 162, 618, -875, 541, -813, 220, -48, -409, -228, -110, -599, 429, 375, -17, 206, 26, 331, 433, 418, 621, 533, -330, 83, -677, 718, -555, 175, -107, 146, 35, -513, 467, -260, -496, 1040, -832, 250, -240, -414, + 420, -109, 125, 648, -783, 31, -960, -1892, -48, 602, -227, 2430, 495, -950, 267, -1326, 460, 948, 1120, -386, -221, -1474, -1689, -143, -1053, 249, -67, -920, -215, -456, -1006, 823, 1621, -456, 114, 349, -430, 501, 639, -445, 74, 1, -808, 402, 68, 244, 295, -572, 223, -304, -458, -520, 440, -323, 181, -502, -181, -35, -612, 598, -388, 119, 182, -571, -93, 438, -52, 61, 97, -168, 269, 566, -68, 328, 388, -486, -920, 310, 128, 530, 636, -832, -817, 142, -240, 145, 277, 151, -1207, 249, -88, -703, 316, -456, -309, -567, + 289, -618, 791, -84, 293, -182, 1063, -289, 583, -10, 696, -194, -352, 227, -399, -421, 57, 792, 509, -539, 575, -405, -620, 175, 847, -326, -346, 453, 203, -422, 47, 576, -241, -555, 301, 231, 354, 649, 135, -392, -130, 1426, 1497, -415, -1242, 951, -416, 268, 134, 1605, 220, -834, -305, -203, 44, 248, 387, 521, -621, 198, 140, 930, -233, 655, 705, 390, 336, 203, 561, -540, 604, 769, 555, 93, -1091, -164, -704, 32, 472, 158, -241, -384, -225, -62, -28, 199, -226, 60, -24, -172, 332, 128, -298, -142, -77, 405, + -1, 82, -391, -281, -519, -245, -32, -51, 7, -92, -465, 118, -159, -78, 69, -131, -7, -404, -96, 15, 6, 7, -103, -103, -36, -161, -227, 1692, 713, -766, 186, -800, -432, -56, 290, -129, 622, -740, -22, 290, -24, 302, -43, 105, 72, -531, -165, 138, -493, -499, 43, 127, -350, 250, 244, -149, -247, -41, 55, -88, 210, 52, 165, -219, -92, 386, 1, 19, 188, -126, 208, -199, -366, -239, 380, -302, -220, 22, -298, -323, 462, -460, 730, 159, -322, 318, 51, -541, 48, -98, -94, 256, -7, -318, 621, -373, + -144, 320, 104, -136, 17, 99, -10, -27, -63, 142, 258, -11, -429, 307, -221, -34, 368, -25, -112, -16, -317, 153, 111, -36, 8, 129, -309, 22, -105, 31, 129, 32, -131, 303, -461, 60, 55, -33, 58, -69, -260, 286, -133, 204, 4, -34, 271, 100, -226, 85, -114, -99, 53, 170, 175, -69, -223, 114, -127, 154, -1028, -1229, 1036, 4212, 1643, 1934, 23, -3937, -2906, -1514, -2316, 1041, 1988, 824, 3517, 1995, -136, 831, -1784, -3588, -1437, -2491, -402, 1731, 1452, 1321, 2191, 1357, 368, 606, -167, -2552, -1133, -917, -3534, 658, + 459, -1565, 2539, 2519, -90, 3187, 1561, -1476, 984, -1468, -3065, -240, -1853, -2676, 469, 289, -164, 2500, 2403, 1440, 2139, 1305, -838, -937, -1675, -2861, -2117, -1006, -950, 516, 1612, 1107, 1771, 2684, 1038, -351, -341, -1854, -1504, 139, -1725, -779, 928, 231, 1163, 941, -485, 314, -102, -640, 136, -285, -296, 594, 200, 252, 783, -453, -182, 430, -595, -483, 217, -1409, -241, 484, -1143, 557, 703, 76, 1776, 1696, 383, 689, -502, -1515, -768, -2017, -2297, -1299, -560, 434, 2175, 2529, 2642, 2353, 1336, -294, -1489, -2344, -3278, -2798, -1548, -400, 1309, 2364, + 2350, 2109, 1362, -259, -435, -679, -1033, -730, -652, -761, -421, -216, -195, 148, 430, 584, 755, 703, 540, 240, 19, -286, -427, -557, -594, -589, -251, 19, 203, 202, 305, 327, 347, 251, 71, -34, -21, -126, -106, -98, -187, -218, -49, -76, -54, -35, -26, 81, 217, 164, 169, 165, 93, 27, -34, -168, -185, -202, -150, -90, -6, 22, 94, 136, 143, 71, 46, 12, 10, -15, -26, -51, -18, -29, -24, -42, -41, -53, -29, -38, 19, 52, 92, 86, 82, 43, 29, -28, -47, -65, -72, -86, -32, -23, 7, 14, + 36, 29, 52, 25, 30, 6, 6, -20, -7, -23, -4, -12 }, + {17, 105, -142, -116, -20, 112, 166, -78, 97, -54, -138, -38, -77, 45, -19, -67, 62, 93, 21, 112, -205, -223, -142, 20, 0, -38, 11, 68, -22, 91, 76, -97, 37, -8, 119, 109, 42, -117, 77, -70, 39, 76, -185, 203, 298, 39, 135, -110, -22, -103, -53, 92, -31, -107, -28, -67, 52, -66, -59, 6, 55, -55, -61, -27, 106, 95, -80, -30, -95, 22, 126, 35, -46, -60, 48, -17, -85, -32, -58, -9, -31, 49, 47, 25, -27, -38, 85, -12, 23, 44, -12, -2, -17, 26, 4, 6, + -24, 3, -7, -25, 2, -4, 19, 44, -24, 10, -4, 21, 27, -7, -11, -6, -1, -24, -10, 10, -9, 4, 0, 19, 5, 2, 459, 211, -16, 96, 87, -110, -54, 127, 58, 138, -100, 201, 76, -199, 158, 8, -3, -105, 116, -215, -184, -40, -65, -36, -66, 25, -40, -90, -64, 74, -81, 52, 33, 21, -90, 126, -264, -47, -1, -47, -33, 22, 50, -85, 68, -103, 99, 31, 22, 101, -71, -18, 41, 158, 39, 66, -36, -138, -192, 35, 105, 136, -56, -216, 32, -88, -60, -50, 60, 6, + 210, -7, 71, 41, -32, -55, -59, -220, -64, -36, -30, -43, 41, 110, 31, 104, -1, -10, -33, 28, 38, -11, -42, 37, -22, 14, -18, 19, -31, -20, 30, 9, 17, -12, 10, -21, 248, 57, -208, -238, 66, -73, -195, 222, -109, -37, -30, 174, 37, -102, 123, -96, 186, -257, -168, 203, -212, -215, -86, 173, 77, 83, -20, 155, 95, -17, -206, 55, -57, 73, 66, 55, 179, 47, -176, 15, 123, 179, 61, -100, -23, -147, 63, -259, -10, 278, 15, 29, -143, -178, 27, 38, 205, -46, 18, 20, + -30, 20, 68, 11, 144, -40, 96, 13, 26, 16, 169, 6, -24, 30, -36, -116, -61, -119, -3, 212, 45, -71, -24, -123, 69, -97, -67, 22, 4, 6, -55, -79, -16, 18, -26, 43, -5, -1, 44, 26, 44, 35, -1, 13, -36, 1, -32, -35, 24, 27, 50, 35, -25, -8, 27, -21, -39, 20, 5, 0, 5, -570, -370, -84, 63, 90, 11, -3, -215, -15, -46, -38, 6, -57, -24, -162, 85, -339, -122, 28, -66, -105, -58, -194, -96, -82, -90, 41, -148, -84, 186, 118, 14, 87, 66, -62, + -122, 71, 276, 29, 36, -110, -96, 79, -235, -127, 262, -241, 73, -59, -119, 53, 19, -68, 17, 38, -81, -1, -15, 159, 144, 19, 40, 68, -4, -33, -54, -334, 162, 98, -89, -6, -138, -40, 21, -104, 47, -125, -67, -146, -211, 138, -39, 4, -178, -47, 25, 28, -46, -11, -9, -52, -92, 13, -47, 38, -6, -26, -18, -12, 47, 6, -68, 11, -20, -8, 23, 8, -17, 14, -53, 27, -48, -18, -63, -493, 77, 114, -29, -45, -270, -113, 76, -244, -231, 46, -220, -115, -4, -135, 77, -107, + 168, -89, -56, 51, 118, 213, 136, -241, -11, -19, 120, 176, 303, -135, -116, 155, -162, 37, 49, 253, 95, 141, -187, -85, -256, 203, 216, 245, -2, -54, -163, -35, 167, -77, -104, -98, -127, 27, 32, 38, -175, -3, -171, -10, -24, 70, 63, -54, -77, -220, -11, -18, 137, -85, 227, -129, 30, 104, 207, -158, 49, 107, -182, 92, 2, 226, 78, 51, 141, -14, 40, 107, 45, 1, -37, 2, 47, -14, 59, 88, 74, -33, 42, 6, -22, 36, 48, 0, 23, 57, 43, 46, 24, -21, -34, 44, + -37, 44, -20, 4, 56, 42, -11, 31, 611, 517, -15, 12, 275, 33, 137, -85, 153, -118, 277, 90, 4, 52, 23, 343, 238, -231, -185, 70, 40, -77, -45, 40, 170, 120, 80, 14, 92, -62, -1, 187, -206, 80, 259, 187, 350, -38, -49, -34, 26, -114, 380, 341, 250, -118, -31, 143, 123, -109, 27, 194, -70, -96, 129, -370, -39, 17, 58, -128, -235, 94, 167, -198, -69, -215, 83, 11, -41, -49, -181, 306, -78, 38, -311, -78, -147, 364, -61, -54, 167, 72, 3, -121, 112, -81, -106, 167, + 162, -6, 103, 0, -42, 87, -11, 32, -26, -43, -7, 67, -49, -43, 1, -57, 22, -52, -25, 1, -6, 66, 5, 17, 48, 41, 15, 20, 40, 90, 21, 84, 18, 40, 67, 400, -16, 253, 345, -182, -426, 18, 323, -250, 227, -67, -308, -142, 310, -302, -268, 195, -309, 104, 147, 122, -88, 188, 53, 36, 120, -197, 269, 133, 117, -55, -30, 503, -176, 32, 131, 253, -343, -282, -263, 11, 19, -17, 160, 51, 285, 116, 167, -26, 22, -140, 255, -114, 251, -136, -217, 375, 304, -429, -379, -249, + -195, 136, 22, -86, 198, 219, -262, 155, -21, -523, -173, -263, -240, 92, -81, 173, -39, 27, 314, 321, -29, 85, -28, 51, 45, -107, 90, 27, -4, 271, 81, -1, 8, -47, 80, -8, 53, -57, -3, -60, 17, 71, 23, 1, -8, 63, 40, -37, 6, 0, 10, 33, 14, -24, -29, 10, 18, -2, -226, -320, 192, -184, -133, -115, -369, -40, 166, -101, -21, -136, 306, 46, 196, 148, -245, 252, 379, -117, -153, 40, -65, 163, -467, 178, 406, -55, -131, -116, 177, 362, -85, 91, -161, 248, -298, -115, + 59, -47, -231, 427, 303, 225, -94, -323, -39, -459, 80, -34, -13, -10, -68, 248, 211, -319, 179, -191, 264, -25, -52, -22, -278, -54, -253, -564, -25, 65, 46, -217, -6, -62, -420, 8, 366, -231, 97, 119, -45, 26, -107, -64, 87, 104, 116, -29, -72, -28, -78, 64, 33, -67, -18, -61, -66, -9, -59, -91, 57, -19, -69, 55, -48, 45, 70, 29, 68, 47, 0, 44, 152, 72, -74, -52, -85, 0, -111, 59, -6, 86, -22, 67, -11, -48, 143, 68, -592, 42, 345, 188, -270, -219, 432, 100, + 97, -85, 112, -4, -289, -75, -304, 144, -181, -28, -296, -328, -441, 276, 186, -141, -157, 124, -405, -37, 30, 98, 178, 87, 11, -140, 59, -129, 106, -123, 70, 37, -128, -167, -317, -209, 80, -541, -148, 297, 158, -65, 706, -102, 327, 323, -515, 33, -69, -435, -228, -239, 7, 51, 488, -79, 46, 331, 245, -58, 329, -156, -121, -220, -293, -425, -162, 242, -464, -236, 357, 261, -157, 327, -146, -23, -15, 157, -103, 157, -99, 134, -39, 55, -64, 108, 104, 45, -19, 122, -80, -90, 95, -27, 104, 76, + 51, 70, 43, 20, -179, -33, -2, 50, -48, -76, -63, -171, 65, -4, 108, 61, 105, 80, 22, 32, 408, -72, 133, -200, 119, 169, -102, 144, -224, -249, 379, 204, 245, 299, 0, -249, 328, -287, -381, 4, 361, -53, -310, 41, 425, -63, 118, 39, 595, 36, 129, 291, -36, -153, -283, 39, -38, -275, 11, -163, 111, 401, 6, -244, -70, -227, -118, -37, -94, 53, -299, 321, -169, 543, -136, -397, 24, 18, 194, 81, 106, -407, -328, 236, -341, -479, 138, 93, -107, 514, -418, -583, 219, -399, 39, 53, + 12, -384, -231, -498, 171, -52, -26, -78, -220, -101, -167, -85, -64, 188, -144, 144, 54, 149, 26, 18, -202, -76, 56, -67, -220, 42, -35, -88, -77, 69, -88, 93, -50, 114, -22, 57, -115, -115, -3, 7, -41, 172, -152, -147, -95, 83, 92, -120, 89, 25, -316, 175, 18, 432, 453, 654, 299, 139, 91, 216, -222, 250, -393, 192, -38, -33, -754, -292, -123, 258, -31, 63, 83, 69, -385, 400, -14, 163, 14, 373, -400, 279, -196, -9, 303, -342, -152, -373, -148, -415, 380, 279, 510, -24, 121, -463, + 107, -480, 468, 133, -75, 443, 453, 231, -268, -401, -577, -25, -204, -291, 315, -86, 732, -541, -196, 419, -435, -173, 102, 8, -62, -418, 192, 72, -227, 208, 442, -378, 426, 530, -157, -280, 219, -214, 203, 130, -221, -172, -43, -68, 312, 106, -52, -150, -245, -138, 79, -157, 77, 151, 97, -105, 82, -86, 120, 78, 134, 81, 7, -138, 92, 140, -139, 7, 50, 53, 121, 12, -14, 134, 164, 33, -73, -125, -1, 114, 138, 95, 681, -156, 97, -37, -223, 305, -111, 113, 37, 437, -137, 509, 9, 254, + 226, -40, -164, -496, 237, 517, 28, -3, 360, 304, -21, 56, 616, 386, -110, 134, 406, -102, -447, 11, -324, -51, -205, 19, -618, -185, -224, 11, 131, 131, 604, 667, 353, -460, -270, 375, 527, 112, -478, -78, -112, -500, -314, -378, 465, -172, 65, -470, 687, 507, -55, 210, 1139, -57, -231, -436, -25, 303, 241, -175, 345, 682, -290, 435, -196, 143, -271, -147, -234, -308, -157, 204, 1, -67, 52, 85, 369, -39, 39, -3, -167, -17, -58, 36, 151, -95, -43, -118, -54, 43, 48, -42, -240, -225, -75, -277, + -241, -43, 219, 193, 168, 39, -36, 12, 95, 79, -27, 55, 41, 350, 36, -210, 208, 81, -291, -493, 640, -402, 483, -353, -525, 24, 663, 424, -488, -329, 114, 96, 225, -40, 443, 234, 583, -214, -96, -22, -111, -562, -412, -131, 586, 120, 47, 18, -543, -622, -478, 246, 285, -214, -138, 53, 69, -332, 97, 615, 110, 385, 381, 271, 663, 949, 314, 15, 138, 374, -197, -107, 254, -87, 137, -89, 412, 144, 292, -82, -108, 207, 550, -41, -448, 287, -702, -817, -278, 421, -271, -808, -492, -206, 296, 200, + -435, 782, -250, -550, 145, 214, -179, 272, -282, -112, 103, 73, -148, 138, 27, 247, -136, -296, -171, 49, -64, -60, -23, 2, -23, 200, -34, 33, -81, 92, 166, 32, 159, 49, -246, -109, 1, -213, -252, 122, 178, -138, -269, -295, 121, 50, -13, 192, -111, 70, 262, -1143, 66, 572, -102, -140, 705, -381, -384, -500, -160, -172, -326, 92, 164, 265, 194, -164, -121, -61, -136, 41, 135, 565, -241, -744, 398, -3, -19, -620, 277, 113, -61, 694, -198, 70, -62, 303, 375, -416, -38, -236, -24, 203, -153, 314, + -498, -424, -262, -453, -76, 34, 71, -630, -408, 290, 505, -246, -280, 258, -569, -524, -499, 543, -928, 295, -49, -555, -174, 455, 1182, -166, -325, 382, 906, 318, -204, -227, -41, 240, -17, 108, 540, 27, -201, -389, 316, -458, -306, -232, 159, -194, -326, -215, -198, -12, -240, 74, -186, -26, -61, 220, -173, -145, -355, -115, -63, -129, 336, -258, -319, -30, -280, -266, -117, 28, 252, -43, -108, -59, -168, 108, -338, -40, 348, 155, 228, -99, 86, 101, -84, -143, -191, 57, 90, 142, 158, -67, -642, -1020, -61, 1173, + -189, -82, -776, -57, -53, 82, 254, 37, 211, 17, -14, -550, 77, 504, -341, 624, -264, -37, -554, 355, -277, -177, -639, -862, 439, -420, -417, 154, 87, -184, 41, 491, -147, -464, -292, -595, -75, 173, 412, 87, -124, -100, -249, 146, 428, 74, -271, 492, -470, 53, -809, -234, -160, 998, -631, 207, -206, 134, -118, -107, 17, 408, 121, -730, 805, 251, 287, 108, -323, -242, -94, 106, -19, 166, -438, -450, -75, 226, 489, -299, 415, -98, 161, -324, 186, -531, 599, 31, 66, 201, 270, 31, -375, -176, 100, -350, + 96, 171, 150, -207, -131, 364, 65, -360, -53, 316, -118, -444, 508, -133, 196, -81, -146, -234, 156, 48, 163, 29, 273, 37, 196, -90, 14, 128, -69, -103, -499, -303, 1092, -139, 99, -568, 514, -296, 381, -298, 663, 63, 75, -321, -252, 379, 857, -355, -508, 242, -195, 558, 716, 347, -97, 436, -281, -271, 603, 817, -906, 74, 146, 154, -300, -22, 379, -925, 287, 540, 213, -412, -104, 663, 553, 181, -303, -408, -791, 1142, 217, 587, -76, -243, 138, 342, 21, -18, -920, 144, 887, -156, 851, -504, -217, -351, + 206, 792, -239, -22, 726, 874, -275, -638, -559, -496, -221, -209, 513, -615, 346, 380, -129, 45, 404, -75, -217, 238, 178, 128, 373, 81, -55, 330, 127, 140, 176, -55, 30, -73, 152, -602, -158, 27, -108, 237, -444, -50, 15, 163, -2, 257, 187, -120, 371, 187, -117, 264, 292, 5, -174, 140, 285, 170, -32, -264, -120, 72, 51, 45, -247, 432, 318, 762, -230, 552, -291, -116, 515, -17, 701, -844, 531, 97, 237, -339, 258, 631, 1227, -280, 314, -15, -810, 747, 78, 293, -146, -378, -138, -29, -312, -196, + 1043, 75, 403, -295, 741, 7, 361, 154, -427, -89, -262, 11, 137, 875, 448, 40, 108, -27, -68, 146, 91, 550, 449, 227, -255, 383, 802, -749, 704, 116, 215, -753, -354, -947, -762, -148, 517, 431, -1313, -6, -589, 316, 1321, 664, -841, 466, -343, -433, 730, 370, -367, -204, 643, 526, 291, 815, -214, 502, 444, -514, 730, 203, 846, 260, -73, 499, -46, 133, -585, 449, -283, 235, -209, 106, 280, 674, 181, 411, 109, 134, -215, -45, -73, 59, 342, 292, 511, 191, -55, 85, -113, -62, -502, -81, 132, 166, + 442, 394, 358, 413, -1091, -1714, -430, -206, -406, 80, 587, -614, 878, 302, -1233, -971, -179, 668, 38, 43, -117, -409, -1194, 36, -1001, -854, 425, 313, 311, -155, -380, 901, 561, -401, -778, 591, 318, 129, -359, -939, 365, -447, 152, -801, 972, 12, -371, 82, 255, 779, 508, -214, -26, 266, 287, 294, -167, -1248, -960, 186, -121, 713, -126, -321, -860, 1004, 402, -717, -716, 1030, 988, -20, 728, -105, 38, -305, -167, -568, 702, -136, -144, -307, 297, -887, 428, -265, -152, 617, -1, 91, 170, 566, 306, -241, 438, -134, + 527, 196, -564, 137, -280, 268, -225, 0, -370, -203, 224, -385, 175, 125, 179, -344, -229, -441, -368, 505, -169, 324, 221, -316, -30, -276, 26, -176, 659, 540, 383, 504, -109, -565, -629, -94, 211, 937, 589, -218, -159, -254, -451, -29, 229, 325, 223, 104, 587, 68, -430, -1070, 1692, 52, -1326, -90, -499, 232, 644, 603, -742, -1165, 191, -553, 170, -105, 509, -160, 65, 318, -489, -579, 53, 164, 504, -2, -830, 550, -467, 434, -407, -261, -54, -120, -891, 176, 238, -843, 352, -325, 162, -274, 815, 652, -840, -431, + 559, 722, -859, 1133, 64, 915, 648, 1077, -339, -442, 231, -875, 127, 123, 1546, -471, -1470, 2478, -1174, -886, 1414, 653, -838, 1393, 145, -1115, 1391, 180, 117, -234, 197, 940, -236, -313, -492, 703, -260, -166, -106, -268, -307, -423, 407, -51, -47, -146, -116, 63, -196, -315, 33, -253, -497, -498, 623, -264, 50, 593, -289, -257, 32, 299, 116, 133, 552, -337, 72, -246, -168, -103, 919, 470, -160, 141, -501, 167, -459, -270, 209, -110, -938, 582, 225, -164, -12, -468, -73, 16, -1532, 212, 459, -1150, 526, 304, -403, -115, + -20, -282, -92, -166, -512, 14, -256, -57, -126, 249, 915, 765, -706, -79, 963, -170, -181, -987, 114, 322, -161, 838, 2013, -679, -849, 1431, -96, -775, 894, 587, -464, -696, -858, 260, 460, -384, 1350, 879, -1685, -1619, 942, -763, -986, 1275, 205, 1708, 820, -210, -231, -1237, -964, 2807, 774, -606, -1361, 35, -556, -1218, -191, 1419, 603, 15, 1169, 1020, -327, -1308, 200, 778, -326, -309, 1629, 934, 159, -176, -842, -827, -215, 773, 310, -320, -153, -370, 302, -240, -318, -208, -43, 228, 310, 274, 112, -752, -265, -152, 277, -296, + 47, -83, 681, -448, -313, 703, 193, -364, 553, -201, 158, 38, 121, -434, -122, 577, 565, 231, -233, 147, -267, -216, -167, 300, -486, -107, 373, 1508, 1284, -354, 917, 78, -685, 433, 785, 242, 348, -1023, -190, 103, 219, -163, -862, -331, 331, -229, -78, -757, 1154, 128, -925, 517, 1352, -705, -388, 181, 455, -446, -828, 707, 1231, -113, -464, 143, 358, 539, 793, 36, 1432, -47, -1566, -3, -164, 500, -152, -1305, -22, -573, -531, 759, 420, 426, 570, -1172, -592, -219, -2, 451, 30, -252, 46, -412, -775, 60, 1239, -646, + 130, -506, -337, 822, -1018, -28, 466, -381, 182, 112, 270, 280, -531, -669, 1110, -245, -343, 548, -550, 335, 84, -249, 186, 457, -77, 46, -221, 96, 42, -50, -196, 241, 143, -45, -10, 199, 194, -222, -352, 180, -10, 82, 34, -115, 201, -15, 169, -81, -17, -127, 42, 155, -27, 418, -166, -155, 32, -214, 134, 273, -1326, -1885, -1681, 3373, 3206, 3213, 9046, 3223, -380, 602, -6267, -7618, -2569, -4272, -5937, 769, -337, -986, 6522, 3992, 1657, 10203, 4806, 896, 4641, -1097, -5556, -5308, -5070, -7009, -6876, -1608, -2487, -4039, 4714, 2180, + -1709, 6824, 2195, -796, 7702, 7030, 1610, 7295, 7389, -279, 1828, 842, -7128, -8261, -6164, -11631, -11027, -6614, -8847, -6645, 744, 5470, 6193, 13332, 12109, 10690, 11504, 8496, 4302, 1320, -944, -6484, -7831, -8370, -9446, -8950, -7642, -4929, -3593, -3501, 659, 2126, 4161, 9922, 10291, 7046, 8793, 3724, -1227, -2914, -4527, -6188, -4494, -2996, -2995, -1028, -293, 26, 1576, 2018, 1909, 2945, 1841, 1199, 1472, -878, -826, 249, -2401, -1691, -637, -2308, -1439, -162, -2337, -2454, -1644, -2409, -1596, 1808, 3369, 5383, 7928, 7411, 6328, 5961, 3207, -992, -4985, -8794, -10456, -9418, -7642, -5761, -2723, 852, + 3386, 4775, 5139, 4548, 4041, 3771, 3785, 2638, 1222, 558, -372, -1114, -1029, -1802, -1957, -1390, -1077, -1394, -1371, -1733, -2003, -1982, -1731, -1415, -477, 702, 1613, 2164, 2774, 2743, 2282, 1635, 986, 370, 284, 35, -369, -672, -760, -994, -1121, -1240, -1347, -1414, -971, -546, -174, -4, 206, 382, 675, 692, 482, 218, 360, 534, 561, 524, 502, 439, 503, 453, 237, -50, -212, -551, -677, -727, -761, -861, -761, -793, -721, -441, -61, 304, 797, 1112, 1311, 1245, 961, 444, -7, -390, -531, -630, -542, -443, -285, -190, -93, -83, -7, 14, 77, 69, + 115, 80, 97, 50, 51, -1, 9, -27, 4, -20, 12, -15 } + }, + { + {-111, 420, 225, 185, 105, -46, -12, -44, -86, -123, -85, -126, -51, 117, 42, -7, 1, 77, 38, -50, -51, -41, -218, 90, 25, 1, -44, 28, 6, -62, 34, 80, 2, -101, -24, -44, -45, 11, 99, -26, 25, -116, 76, -143, 93, 19, 7, 0, 92, -110, -79, -149, 42, 26, 9, 84, -90, 19, -10, 2, -65, 58, 29, -50, 94, -147, 69, -80, 151, 67, 28, 10, -27, -183, 141, -44, -2, 23, 41, 33, 39, 44, -11, 12, -18, 43, -1, 24, -53, 19, -6, 12, 24, 59, -1, -10, + 22, 23, -22, 30, -34, 30, 9, 27, 4, 17, -7, 7, 26, 11, -1, 18, -1, 12, 13, -2, 17, -5, 405, 190, 266, 70, 92, -18, 105, 8, 94, -70, 181, -48, -201, -58, 7, 9, -62, 154, 11, 59, 154, 72, 4, -2, 38, -140, -89, 53, 68, -52, 17, 65, -134, 191, -17, 26, -28, 69, 102, 3, -102, -109, 212, 2, -59, -11, 123, 87, -60, -86, -182, -60, -73, 5, -66, 14, -177, -75, 23, -75, 42, 70, -34, -7, 36, -48, 73, -7, 91, -1, -28, -105, 14, -130, + 43, 0, 75, -1, 77, 94, 84, 1, -51, -6, -17, 104, -26, 11, 70, 69, -2, 38, 17, 34, -12, 42, -14, 63, 17, 10, -3, 4, 9, 31, 85, -272, -88, -62, 47, 54, -186, -83, -37, 45, 99, 31, 135, -112, -162, 47, 5, -29, -111, 359, -19, 96, 21, 11, -8, -55, -137, -107, -34, 92, -77, 188, -64, -18, -154, -184, -16, -117, -65, 250, -137, -38, -133, 49, 6, -48, -140, -27, 1, -158, 18, -85, 126, 83, -73, -39, -41, 39, -7, 101, -52, -66, -68, 228, 206, -71, + -199, 27, 61, -6, 58, -82, 16, -96, 68, 5, 219, 135, 208, -190, 82, 127, 5, 96, 69, 14, 143, -26, -16, 37, 20, -59, 57, -45, -39, -4, 14, -6, 21, -34, 16, -4, 4, 19, 26, 13, 30, 29, -22, -29, 22, 8, -52, -21, 41, -25, -895, -143, -259, -291, 77, -98, -256, -209, 34, -206, 28, 311, -78, 134, 99, 262, 66, -181, 40, 285, -134, 142, -211, -190, 61, 83, 222, 14, -138, 131, -93, 100, -13, 142, -121, -76, -134, 3, 23, -51, 101, -234, 29, 238, 50, -66, + 90, -120, -63, -295, -89, -9, 45, 6, 158, -237, 22, -32, 119, 65, -47, 171, -150, -19, -121, -228, -98, -52, -66, 173, -155, -246, 9, 82, -26, -70, 84, 95, -70, -55, -97, -39, 198, -92, 108, -32, -5, -18, -8, -102, 24, -61, -4, -7, -16, 3, -25, -32, -33, -8, 9, -19, 32, 15, -445, 254, 285, -15, 160, 74, 337, 450, 57, 60, 128, 57, 74, -63, 89, -73, 118, 138, -385, 200, -42, -70, -119, -155, 63, 110, 175, 35, 30, -223, 10, -64, -75, -32, 30, 14, -17, 222, + -12, -72, 73, -85, 113, 150, 167, 88, 18, -92, 186, 61, 25, 21, 24, 15, -108, -151, 138, -140, 132, 122, 89, -18, -100, 92, 117, 262, 120, 100, 61, -253, -78, 33, -42, 111, -221, 12, 73, -205, -19, 71, -50, 28, -121, 47, 16, -50, 95, 57, 4, 106, -47, -45, -10, 23, 43, 160, 26, 55, 37, 0, 35, -25, -30, -41, 28, -22, -20, 19, 17, -18, 54, -30, 38, 36, -16, 53, 15, 24, 26, 5, 6, 62, -4, 827, 247, 63, 160, 414, 164, 499, 120, -108, -37, -40, + -49, 137, 211, -97, 44, 151, -57, -205, 163, -17, 76, -68, -105, 171, 38, -14, -50, -186, -95, 104, 24, -63, -34, 31, 69, 191, 58, -173, -41, 13, -56, 65, 89, -174, -214, -10, 52, -20, 163, -301, -65, -135, -172, -17, -14, 47, 161, 1, 23, 55, -27, 218, 137, -175, -157, 121, 261, -20, -123, 261, 136, 62, -114, -121, 127, 9, 96, -56, -188, -101, -128, -79, 73, -102, 14, 47, -38, 46, 31, 39, 21, -66, 37, -19, -36, -14, 50, 42, 6, -56, 51, -21, 89, -12, 12, -83, + -110, 39, -103, -18, -16, -56, -28, 15, -93, -37, -10, 12, -19, 67, 9, -23, 408, 194, 368, -126, 6, -96, 370, -381, -51, 94, -69, -78, 126, -46, -113, 319, 185, 34, 548, -152, -33, -118, 7, 87, -137, -21, -70, 205, -173, 44, 15, -58, 22, 119, 86, -168, -285, 4, 63, 236, 283, 276, 29, -164, 204, -490, -77, -194, -280, 195, -62, -95, 158, -59, -80, 422, 8, -128, 151, 8, 116, 80, 59, 254, -151, -98, 19, -224, 2, 39, -53, 73, 131, 267, -98, 87, 237, 139, 73, 41, + -77, -174, 91, 127, -25, 10, -23, -25, -94, 16, -26, 14, -87, -49, 4, -19, 88, 34, 4, -120, -49, 55, -64, -4, 49, 43, -75, 70, 61, 16, 80, 65, -131, -27, -48, 34, 77, 86, -15, -53, 16, -30, -631, -948, -160, 47, -17, 26, -45, -190, -108, -152, -41, 154, 183, -167, -247, 211, 43, -135, 10, -23, -151, -126, 349, 178, -189, 95, 39, 149, -183, 203, -204, 139, 90, -43, -96, 90, -379, -188, 231, 373, 206, -262, 5, -186, 247, 51, 63, 17, -206, 99, 302, 34, 228, 162, + 104, 175, 371, -104, -377, 181, 0, -90, 18, 322, -133, -225, 108, -60, -40, -86, -52, -102, -177, -89, 214, -296, -187, -110, -214, -207, -14, 127, -196, -5, -74, -83, -177, -112, -203, -12, -157, -13, -6, 140, 98, -73, -79, -104, -33, -74, -71, 84, -139, 50, 10, -88, 8, -58, 31, -31, -114, -138, -3, 35, 55, -27, 22, 42, -2, -73, -12, -93, 8, 41, 31, 39, -362, -241, 65, 56, 489, -428, -288, -167, -77, -56, 160, 149, -222, 229, -51, 102, -159, 342, -64, -133, 226, 158, 133, -238, + -218, 289, -150, 83, 74, -109, 251, 73, 3, 52, 185, 231, 75, -211, 51, -299, 180, 75, -329, 233, 58, -175, 307, 94, -80, 175, -25, 333, -74, -87, -68, -47, 440, 90, 10, 117, -365, -232, -247, 25, 235, 29, 291, -375, -151, -239, -217, 542, -53, 192, 142, -119, -25, -78, 44, 27, 151, 89, 300, -162, 27, -53, 67, -4, -3, -3, -61, -283, 107, 64, 44, -77, -24, -38, -155, -12, -54, -104, 59, -88, 39, 48, 41, 62, -107, -61, -72, -69, 41, 76, 48, -28, -13, -21, -32, 112, + -37, 79, 52, -33, 36, -24, 2, 26, 32, -493, 154, -212, 120, -148, 398, 67, -279, 44, -284, 230, 440, -376, 248, 91, -11, 181, 469, -180, 0, 143, -512, 30, 233, -143, 167, 181, -93, 459, -229, -416, -179, 50, 11, -85, -179, 125, 116, 0, -293, -69, -74, 195, -128, 770, -97, 110, -35, -33, -374, 38, 277, 224, 752, -81, -73, -156, -30, -212, -16, 301, -160, -32, 55, 71, 296, 241, 68, 581, -110, -539, -540, -381, -78, 170, -53, -142, 257, -16, 228, -141, -27, 185, 157, -58, -55, 18, + 48, -61, -126, -182, -61, -78, -23, -130, 96, -40, 29, -66, -93, 124, 56, -64, -17, -53, -56, 53, -35, -62, -123, 96, 38, -54, -93, -124, -23, -86, -86, 103, -62, 20, 4, -46, 44, 19, -17, -24, -28, 875, -630, -480, -152, -304, -345, 424, 174, 85, -132, -85, 518, -150, -214, -617, -87, -15, 294, 108, -122, 39, 259, 116, 163, 396, 500, 139, -181, 129, -294, 206, 171, -105, 14, -229, 98, 8, -443, 438, -35, -201, 274, -412, -91, 458, 265, -3, 22, -571, 207, 323, 188, 109, -26, -420, + -1238, -96, 259, 353, -26, -361, 621, -281, 287, 469, 390, 75, 471, 57, 172, 103, 289, 60, 97, 596, -191, -124, 507, 266, 143, -201, 58, 412, -36, 331, 83, 77, 213, -104, -2, 28, -13, -86, 169, 81, -213, 129, 92, 124, 67, -57, 9, -64, -72, 106, 135, 60, 86, -59, -55, -36, -69, -97, -146, 31, -90, 83, -26, 52, -134, -87, -20, -39, -32, -57, 30, 148, 156, 64, 23, -72, 126, 450, 405, -98, -225, -29, -138, 491, 300, -825, -104, 79, -404, 167, -584, 446, 94, -57, 226, 129, + -132, -182, -152, 625, 13, 6, 124, -73, 235, 735, 284, -96, -139, -96, 408, 159, 414, 304, 201, 132, -196, -194, 179, -420, 63, -219, -202, 24, 286, 51, 13, 116, -104, 506, 634, 747, -14, 346, -448, 179, 243, -191, 365, -291, -610, 89, -324, -38, 18, -309, 70, 445, -274, -249, 210, 413, -28, -139, 362, 42, 74, -246, -62, -8, 297, -146, 16, -63, 58, 3, 51, 87, 46, 10, 22, 76, 78, -61, -147, -16, -29, -120, -165, -3, -80, 121, -114, 94, 141, -2, -253, -18, 41, -79, -123, 24, + 62, 390, 121, 124, -18, 15, -39, 118, -33, 125, 316, 298, -43, -11, -60, 20, 94, 119, 165, 37, -521, 949, 60, 246, 726, -269, 75, -139, 192, -210, 210, -512, -606, -20, -359, -28, -33, -42, -102, 38, -168, 150, -482, -194, -650, -34, 149, 310, 701, 388, 121, 88, 201, 154, 118, 282, 297, -96, -594, -590, -404, -243, 58, 197, -218, -347, -603, 16, -231, 548, -246, 136, -419, -203, -74, -174, -809, -843, 230, 84, 21, 430, 245, 344, 278, -526, -116, 981, -184, -374, 143, -218, 99, -609, 244, -280, + 40, -42, 397, 22, 158, -347, 63, -197, -90, -239, -182, 122, 136, -318, -109, 21, 57, 76, 39, -125, 135, 55, 45, -19, -12, 41, 137, -152, 138, -40, -8, -56, 87, -91, -55, 122, -237, -7, 42, -145, -53, -331, 233, 276, -23, 63, 70, 93, -150, 153, 95, 119, -111, 64, 89, 141, 567, 426, 59, 453, -82, -188, 253, -350, -677, -1018, 88, 20, 396, 285, -376, -195, -989, -68, -459, 106, -229, -113, -188, -75, -74, -346, -152, -403, 324, -82, 278, 710, -372, 203, -55, -178, 187, -382, -644, 309, + 155, 307, 197, -1357, -612, 179, -448, -40, -382, 566, 687, -35, 759, 105, 347, -101, -21, -424, 271, 544, 122, 908, 25, 124, -263, -401, 542, 852, 301, 164, 88, 321, 31, 60, -795, -587, -57, 41, 109, 599, 649, -120, 46, -223, 138, -415, 14, -439, -367, 190, -7, 47, -243, 157, 197, 129, 199, 230, 24, -132, 105, -180, -40, -111, -259, -76, -142, -117, 222, 120, -74, -173, -257, -170, 179, -173, -14, 14, 124, -245, -193, 87, 308, 195, 82, 0, -180, -22, -108, -212, 366, -528, -265, -990, -1241, -915, + -422, 284, -11, -215, -455, 4, 814, 403, -718, -115, -151, -502, -93, 40, 341, 256, -536, 386, -304, 166, -284, 88, -412, -150, 199, -735, -144, -275, 239, -181, -685, 805, 770, 13, -316, 440, -1048, -325, 308, -349, -225, -24, -341, 70, -90, -698, 298, -87, -218, -237, -188, -41, -195, -294, 578, -274, -278, 279, -10, 956, -194, -589, 335, -306, -265, -459, 317, 591, -1151, 92, 966, -155, -63, -381, 657, -44, -362, -46, -340, -268, 476, -285, -27, -157, -203, -334, 139, 114, 172, -38, -274, -184, 7, 50, -415, -116, + -268, 412, -140, 31, 55, 53, 41, -332, 222, 13, -130, 301, 43, 393, -72, 454, 102, 184, 218, -291, -196, 145, -244, -186, 68, 3, -172, -394, 190, -55, -782, 1564, 1117, -22, -298, 247, -938, 14, 1168, -207, -406, 18, 1323, -191, 291, -283, -598, -486, -123, -223, 244, 336, 18, -500, -698, -644, -104, -143, -346, 322, 262, -283, -343, -376, 210, 71, 258, 659, -5, -567, 383, 149, 129, 38, -11, -275, 489, 248, -197, -236, -156, -644, 176, 468, 142, -452, 525, 383, 217, 56, -277, 142, -916, 140, -58, 813, + -294, -407, 172, -214, -18, -593, -108, -161, 791, -519, -962, -630, -1250, 241, -256, -87, -668, -429, -1105, -493, -388, -61, 269, -361, -64, -72, -58, -103, 235, -419, 178, -168, -324, 45, -95, 291, 151, 1, -164, 377, 355, 210, -141, -197, -192, -181, 399, 651, 74, 597, 661, 215, 9, -600, -66, 104, 84, -63, -166, -510, -14, 330, 51, -385, -99, -292, 1485, 60, 245, -247, -489, -655, -218, 187, 434, 362, -317, 0, -658, -238, 234, -551, -298, -208, 801, 420, 440, 419, -466, 87, 167, 191, -46, 543, -121, 240, + 419, 163, 115, 357, 486, -285, -574, 385, -64, 3, -607, -562, 128, -280, -221, 497, -511, 656, 421, -289, 343, -382, -388, -467, 675, -473, 212, 208, -776, 75, 88, -610, -1056, -941, 685, -707, -15, -636, -149, -454, -40, 296, 179, -462, 479, 560, 1165, 307, -787, 278, -485, 263, -692, 372, -298, 54, -144, 285, -88, -278, -664, -658, 71, 66, 416, -295, -31, 655, 183, 455, 135, -116, -52, -153, -439, 159, -529, -309, 111, 439, -577, 323, 58, 415, -142, 234, 415, 461, 460, -208, 224, 362, 387, 78, 231, 124, + -178, 718, 330, 363, -309, -342, 89, 121, 138, -298, 25, -652, -13, 112, 125, -575, -603, -948, 657, 69, 224, -155, 347, -259, -259, 197, 499, 118, 327, 1023, -151, -617, -1315, -187, -510, -250, -315, -610, -432, -911, -109, -15, 316, 943, -789, -304, -133, 308, 331, 934, 124, -1070, -249, 218, 832, 218, -1297, -521, 1167, 105, 1164, -689, 34, 89, 703, -68, 640, 967, 133, 820, 573, 137, 1135, 971, 312, 1515, 1162, 728, -1234, -83, 478, 277, -18, -895, -1070, -555, -1530, -244, -1139, -436, -296, -1637, -1554, -1082, 528, 13, + -363, -23, -122, -37, -306, -163, 375, 148, 61, -55, 56, -78, 231, -43, -412, 705, 110, 167, -215, 31, -30, 368, -24, 213, -133, -392, 150, 296, 780, 693, 41, -11, 496, 246, 580, 483, -160, 557, 309, 110, 347, 224, -205, -94, -454, 271, -405, -182, -709, -430, 208, -831, 887, -377, 576, 303, -772, 125, 457, -286, -806, 536, -229, 460, -280, 126, 169, -476, -72, -204, -24, -787, -641, 787, 22, 325, -626, 645, 553, -416, 347, -609, -147, -337, 436, 1113, -33, 1349, -352, -54, 50, 146, -105, -746, 1300, 866, + -115, 728, 550, 756, -296, -9, -1347, 612, 616, -165, -240, 843, 429, 448, 1027, 182, -546, -636, 183, -195, -779, 642, -901, 45, 186, -626, -999, -665, -263, 77, 786, 541, 243, -1509, -437, 918, -84, -324, 258, -815, -523, 696, -15, 15, -303, 10, 408, -125, -321, 244, -119, -579, -329, 62, -56, -31, -3, -251, -12, -396, -551, 77, -62, -882, -112, -533, -323, -94, 121, 167, 474, -444, -319, 103, 461, -492, -545, 752, -130, -38, -157, 0, -328, 138, 336, 197, 291, 26, 100, 12, 29, 116, 240, -191, -62, 105, + 170, 98, -1133, 647, 986, -12, 1138, 354, -1003, -606, -86, -339, -613, 647, 741, -65, 514, 709, -562, 502, 834, -44, -1144, 454, -40, -218, 306, 865, -281, -425, 204, -369, -500, -27, 747, 651, -1078, 348, 452, -712, -466, 876, -243, -1255, -167, 1069, -352, -1817, 1908, -537, -226, -936, 1231, 410, -431, 907, -534, -388, -236, 2310, 764, -956, -857, 891, -209, 1293, 20, 973, -1332, 1069, 1826, 181, -200, -314, -323, -722, 1723, 1168, -1036, 298, -1088, -178, 114, 234, 150, 328, 28, -1182, 554, 81, -126, -18, 545, -229, 119, -166, + 282, -105, 71, -182, 356, 22, -73, 211, 285, -643, 77, 418, 155, -461, 250, 746, -724, -1114, 220, 147, 438, 439, -60, -1006, -344, 285, 140, 293, -153, 50, -41, -331, 295, -257, -123, 826, 1886, 366, -731, -173, -180, 332, 283, -589, -842, 225, -713, 142, -444, -509, -112, 87, 240, -567, -231, -225, -708, 592, -224, 38, -107, -471, 185, 132, 14, -102, 3, -18, -281, -600, 254, -298, 258, 182, -601, -486, -57, -70, -71, -129, 486, -339, 47, -637, 541, -624, -333, 309, 6, -501, 395, -673, 48, 201, -21, 72, + 319, 152, -695, 349, 46, -419, 591, 233, -660, -73, -527, -71, 210, 174, -672, 851, -454, -249, 471, 313, 75, 315, -29, 441, -200, 89, -58, 213, 165, -129, -157, 169, -216, 21, 34, 26, -128, 19, -119, -194, -107, -211, -14, 155, 271, 99, 30, 142, 177, -252, 382, 98, -14, -256, -146, 118, 301, -62, -8, -152, 48, 41, -127, -173, -153, -399, -146, -158, -1137, -1410, -523, 4278, 3416, 2273, 4132, -1637, -3917, -1249, -6328, -2459, 175, -1476, 2897, 3969, 645, 2525, 4323, 101, 1189, -275, -5088, -4200, -3182, -3150, -1559, 2420, + 1294, 1875, 5309, 2261, 327, 3189, 1476, -1813, 618, -1519, -5156, -1231, -2695, -5300, -884, 132, -1299, 3601, 4144, 1645, 4874, 4943, 920, 1911, 855, -3109, -3498, -3263, -5888, -5192, -1983, -2406, 509, 3164, 4317, 3578, 5515, 4102, 2196, 314, -688, -3171, -3875, -2851, -3405, -2829, -124, -150, 647, 3075, 1478, 1882, 2936, -51, -913, -474, -1839, -1042, -616, -668, 756, 1563, 604, 870, 980, -702, -252, -292, -1875, 270, 787, -2023, -22, -177, -2049, 775, 351, -2313, 1473, 2200, 519, 4420, 2747, -44, 2352, 434, -2974, -2464, -3875, -5495, -4128, -2679, -1440, 1892, 4083, 4789, + 5955, 5841, 4135, 926, -427, -2946, -5391, -5237, -4656, -3904, -832, 439, 697, 2718, 2885, 2013, 2069, 1616, 713, 1001, 732, -144, -331, -820, -1682, -1823, -1809, -1833, -1389, -302, 82, 594, 1246, 1512, 1611, 1606, 1169, 387, 3, -452, -814, -937, -729, -761, -592, -202, -125, -187, 16, 39, 60, 460, 491, 233, 309, 253, 147, 325, 272, 53, 19, -229, -426, -388, -391, -424, -325, -197, -53, 134, 322, 370, 373, 345, 242, 101, 30, -120, -233, -207, -160, -138, -17, 42, 90, 65, 40, -40, -74, -135, -123, -85, -17, 13, 90, 136, + 199, 187, 143, 79, 51, -37, -88, -132, -146, -154, -109, -88, -32, 4, 44, 48, 69, 47, 40, 6 }, + {-155, 481, 184, 117, 37, -101, 1, 93, 173, 3, 16, 11, -64, 17, 59, -11, 57, 89, 118, 50, 48, 63, 55, -108, 110, 207, -98, 59, 32, 58, 11, 123, -80, -28, -72, 71, 205, -34, 99, -2, -46, -169, 63, -87, 78, 40, 87, -9, -52, 28, -36, 118, 15, -93, 119, -26, 93, 72, -4, 69, 134, -37, -47, -38, 67, -55, -72, 84, 1, 57, -89, 133, 8, -37, -15, -14, 53, -49, -79, 47, 71, 68, -63, -94, 38, -3, -11, -36, -34, 47, -12, -7, -29, -34, 7, -24, + 11, 8, 35, 25, -10, 13, 20, -21, -8, 2, -9, -16, 13, 34, 20, 26, 1, -2, 9, -21, 1, 8, 374, 292, 148, 20, -54, 168, -98, -108, -24, -187, 113, 6, -76, 43, 109, 185, -85, 106, 242, -70, 3, 54, 126, -33, 138, 96, 139, 31, 106, -108, 185, -23, 179, 87, -19, 21, -29, -5, -64, -31, -79, -59, 63, -17, -172, -39, 19, -6, -96, -100, -50, -44, 135, -55, -148, -198, -217, -76, -95, -9, 34, 104, -142, -65, 17, -15, -63, 15, -149, -15, -176, 94, -96, -48, + 123, -19, 84, 23, 31, 94, 24, -77, -35, 7, -74, 39, 76, 36, -58, 43, 64, 12, 35, -19, -34, -25, -34, 24, -3, 22, -29, -22, 24, 34, 198, -429, -115, -218, -40, 0, 236, -115, -384, -136, -10, 146, 46, -143, -334, -86, 92, -38, 188, 7, 82, -19, -148, -162, 97, 118, 14, 38, -6, 72, 17, -199, 11, 279, 38, -70, -26, -75, 17, -64, -121, 186, -58, -78, 170, -89, -151, 6, 1, 4, -217, 176, -67, -5, 163, 148, -233, -60, 45, 56, -21, 127, 35, 63, 88, 13, + 71, 106, 23, 0, 100, -266, -59, 6, 135, 74, -33, -28, 98, 91, -106, -16, -38, 2, 58, 73, 15, 91, -9, -67, -31, 7, 7, 8, -25, 63, -13, 22, -10, -30, 19, -2, -13, -25, 5, -24, -4, -41, -31, 7, -6, -33, -62, -24, 13, 51, -854, -336, -173, -241, 76, -83, -82, -9, 107, -97, -117, -168, 33, 154, 33, -115, -145, 44, 127, 119, -165, -241, 18, -225, 120, 0, 84, -5, 81, -88, -38, 238, -287, 133, 66, 33, -102, 65, 141, 39, -175, 37, -111, 87, -238, -8, + -216, 167, -18, -41, -62, 93, -362, 168, -105, -217, 87, 178, 199, 119, 42, -13, 23, -16, 128, -72, 36, 103, 249, 41, 5, -177, 114, -87, 20, 7, 133, -116, 7, 124, -11, -143, -199, 166, 14, 33, 83, -15, 40, 37, -1, 32, -14, 7, 44, 43, 44, -70, 28, -52, -23, -44, 43, -50, -485, 237, 379, 74, 30, 210, 71, 64, 115, 16, 121, 121, -98, -18, 16, -119, -74, -2, 59, -70, 394, 209, -57, 28, 125, 157, 180, -75, 127, 147, 8, 43, 43, 84, 61, 37, 83, 79, + -170, -132, -262, 28, -93, -131, 135, -39, 85, -325, 358, -26, -170, -32, 284, 205, -45, 7, 137, -66, 59, -105, -224, 26, 21, -180, -71, -177, 32, 65, 40, -86, -156, -239, -284, -205, -80, 16, -69, 27, 94, 84, -118, -13, -129, 47, -45, 37, -2, -53, 38, 43, -38, -18, -49, 66, -79, 17, 25, 23, -8, -19, 17, 35, 35, 29, 22, 30, 10, 57, -13, 63, -39, 20, -12, -16, -45, -35, -30, -41, 16, -33, -4, 30, 10, 895, 237, 67, -34, 540, 63, 257, 52, 171, 280, 100, + -156, 167, 193, 31, -14, 42, 353, 26, -121, -214, -63, -5, -246, 42, 73, 142, 60, 101, 271, -83, -43, 168, -26, -72, -14, -241, 157, 104, 6, 157, -78, -211, -458, -166, 169, 189, 6, 133, -129, -139, 373, -214, 169, -188, 40, -275, -291, 317, -120, -112, 436, 35, -49, -203, 160, 253, 13, -134, -256, -38, 187, -58, 64, -111, 92, -41, 30, 201, -214, 69, -60, 16, 25, -22, 230, 74, 34, -66, 3, -52, 97, -45, 77, 79, -80, 3, -12, -50, 110, 21, 51, 7, -38, 25, 1, 4, + 32, 51, 18, 66, 20, -2, 36, 27, -24, 10, -10, 16, 57, 66, 11, -3, 459, 149, 381, -234, 79, 208, -284, -101, -109, 27, -142, -91, 227, -70, -38, -18, 283, -104, -126, 296, 52, -213, 93, -48, 52, 111, -167, -42, -125, -233, 32, 4, 48, -229, -233, 90, -17, 87, -6, 128, 42, -8, -147, -148, 44, 144, 75, -45, 432, 100, 77, 193, 76, 143, 151, 95, 63, 72, -59, -36, 36, -184, 52, -295, 84, -196, 156, -111, 87, -40, -139, 46, -34, 151, -130, 408, 349, 158, -291, 91, + 135, -128, 58, 35, 204, 189, 84, -6, -24, -43, -113, 176, -10, -23, 4, -53, 23, 58, -45, 91, -32, -78, -76, -4, 58, 52, -11, -20, -59, -29, 37, -77, 88, 86, -52, 14, -67, -24, 15, 27, -50, 91, -565, -1087, -46, -218, 188, -56, -301, -29, -244, -269, -231, 355, 184, -238, -137, 270, 156, 241, -167, 156, -148, -149, -47, -66, -460, 125, 262, 112, -274, -64, 48, 69, -245, -55, -351, 76, -167, -16, -123, 66, 373, -41, -71, 187, 273, -167, 74, 102, -232, 122, 114, -272, 41, 174, + -43, -287, -181, -185, 258, 99, 252, -151, -295, 68, 145, -64, -211, 138, 204, 193, -242, -127, -52, 388, -84, 231, 67, -275, -225, -44, 151, -261, -17, -50, 141, -33, 320, 39, -75, -98, -83, -94, -62, -33, 28, -3, -40, -120, -13, -116, -52, 45, -42, 17, -35, -89, 50, -16, 136, -29, -114, -81, 42, -23, 3, -33, -74, 23, 75, -71, -24, 103, 46, -67, 3, 81, -550, -7, 22, 314, 84, -134, 196, -97, 89, -307, -82, -197, -100, -387, -138, -233, 531, 296, 326, -379, -313, -159, 185, -23, + 2, 5, 114, -31, 159, -223, -180, -9, -47, -274, -264, -221, -150, -122, -101, -345, 162, 411, -84, 190, 274, -201, 238, 142, 61, 375, -12, 314, 125, 36, -293, 115, 154, -83, 445, 345, 74, -134, -212, 123, -208, 83, 2, 255, 6, -390, 34, -156, -55, -293, 345, 172, 129, 77, 384, -112, -389, -65, 255, 4, -198, -55, 35, -91, 55, 117, 5, 1, -19, 36, 0, 141, 50, 40, -28, 53, 82, 128, -104, 70, 82, -4, 30, 129, 79, 31, -74, 109, -27, -68, -69, -8, -190, 122, 70, 20, + -87, 107, 116, 192, 128, 30, 40, 7, 168, -501, 225, 168, 213, -233, -419, 123, 123, 23, -354, 338, 95, -178, -312, 141, -139, 540, 625, 94, -102, -232, 354, -404, -147, 502, 123, -96, -272, -248, -143, 10, -333, 76, 351, -43, 131, -257, -238, -78, -197, 514, -190, 232, 188, 209, 53, 104, -357, -355, -343, -75, 255, 592, -239, -425, -100, -195, 108, 93, 328, -199, -6, -265, -52, 475, -62, -256, 337, 112, 54, 179, -381, 60, -130, 38, 173, 417, 115, -482, 176, 44, -76, -200, 9, -50, -27, -11, + 68, 113, 133, 46, 9, -76, 25, -23, 96, -162, 61, 65, -4, 16, 27, -123, -4, -81, 135, 127, 31, 152, -59, 22, 115, -23, 91, 24, 85, 30, -191, -10, -68, -9, 26, 13, -67, 8, -79, 2, -38, 818, -355, -279, -85, 172, -478, 192, -129, 242, -215, -98, 297, 220, 84, -149, -54, 406, 400, -83, 349, -101, 513, -240, -126, 92, 538, 393, 130, -288, -20, -597, -90, 93, 275, 320, 567, 149, -10, -27, -217, -372, -27, -323, 234, 73, 361, 201, -123, 358, -426, 193, -95, 31, -74, 456, + 267, 131, 82, -827, -131, 491, 248, 31, -15, 25, 396, 168, -625, -204, -241, 59, 14, -621, 25, -581, -385, -50, -249, -270, 364, 459, -49, -222, -24, 142, -55, 121, 189, -14, 210, 306, -97, -169, 29, -72, 94, 61, -47, -42, 6, 6, 88, -8, -103, 23, 106, 40, 94, -79, 142, 2, -49, 36, -86, 37, -175, -112, -136, 74, 10, -130, -23, 115, 77, 100, -62, 56, 4, -19, -167, -85, -177, 302, 571, -140, -241, 38, 217, 133, -359, -17, -292, -11, -395, -38, -340, 20, 341, 31, 759, -317, + -159, -269, 307, 513, -413, -133, -638, 123, -11, 177, 151, -351, -215, 280, -109, -75, -349, 698, -98, -740, 204, -192, -226, 271, 204, -211, -241, -69, -434, -255, 139, 99, 145, -128, -315, -357, -365, 301, -535, 11, 124, -161, 10, 0, -75, -418, -81, -168, 265, 346, -67, 536, -34, -3, -167, -31, 764, 77, -349, -136, 295, 225, -429, 11, 57, -286, 237, 59, 266, 44, 37, 44, 17, 120, 158, 17, 77, 263, 16, -91, 41, 128, -103, -26, 11, -120, 109, 107, 126, 28, -147, 35, -54, 26, -35, -24, + 7, -78, 108, -57, -84, -93, 224, 4, -254, 183, 136, 63, -23, 141, 99, -275, -68, 16, 6, -83, -372, 940, -242, -82, 84, 401, 288, -611, -249, -580, 127, 33, -179, -638, 27, -298, 133, 141, 323, 17, 235, 1105, 241, 276, -173, -61, 483, -42, 38, 128, 32, -71, -252, 446, -472, 197, -702, -213, -328, -433, -372, 0, -767, -261, 106, 440, 253, -753, 428, 285, 312, -478, 353, -224, -548, -186, -545, 268, 654, 166, -62, -425, 346, -453, 683, -125, -73, -409, -448, 69, 533, 178, -366, -145, 90, -72, + -146, 353, 181, -159, 452, -32, -639, 807, 428, 335, 153, -103, -38, -62, 241, 59, 37, 533, 208, 15, 27, 80, 277, -216, 157, 21, 54, 56, 179, 93, 13, 303, 230, 26, -102, -100, -37, 250, 124, 143, 133, 169, -199, 208, -51, -47, 189, 300, -40, -74, 0, 286, 323, 130, 200, 153, 514, 98, -331, 151, -97, 156, 564, -794, -362, -638, 363, -127, 63, -209, 461, -452, -458, -206, -107, -325, -566, -271, 106, 374, -521, 346, -196, 43, 676, 519, -8, 275, 131, -105, -81, -915, 128, -91, 91, 181, + -71, 28, 928, -829, 79, 1006, 132, 280, -392, -105, 526, 924, 48, 820, -317, 742, -258, 550, 556, -135, 1083, -177, -44, -318, -487, -515, -236, -308, -751, -348, -158, 281, 277, 38, -384, -62, -107, 487, 152, -250, 417, 96, -49, -56, -299, -44, -117, 129, -303, -143, -210, -209, 389, 152, -125, 119, -95, 76, -228, 348, 20, 100, -5, -231, 218, -26, 83, 248, 175, 107, 24, -360, 178, -137, -12, 314, -2, 117, 80, 151, 215, -74, -163, -111, -129, 66, 195, 322, 192, -374, -40, -406, -352, -1187, -847, -595, + -61, 811, -532, -64, -410, -586, -490, -599, -630, -245, -743, -804, -703, 202, -486, -250, -606, 579, 941, 85, -111, -329, 75, -55, -27, -72, 295, 66, 641, -557, 47, -473, 975, 244, -575, 454, -413, 370, -554, 327, 45, -326, 294, -518, -177, 170, 532, 238, 946, -208, -614, 62, -177, 77, -407, -346, -655, 87, -696, -135, -111, -603, 404, 520, -302, -28, -897, 1033, 1245, 205, -494, 175, 1096, -510, -236, -582, -344, -640, 263, -26, -366, 287, -366, 157, -229, -99, 147, 84, -5, -236, -50, 217, 122, -397, 317, -275, + 145, 190, -128, -231, 126, -186, 156, 119, -252, 98, -35, 103, -151, -400, 110, 77, -168, 111, -151, 296, -6, 125, 32, 382, 49, -498, 283, 194, 85, 322, -963, 1760, 663, -142, -532, -146, -565, 607, 1524, 36, -1014, -461, 549, 207, -203, 730, -142, 94, 416, -41, -421, -134, 342, -437, -401, -159, 142, 25, -77, -181, 323, 37, 478, 382, -494, 246, 588, 333, -457, 180, 97, 401, 10, 142, 107, 168, 830, 790, 486, 1069, -525, 553, -632, 408, -7, 373, 462, 154, 120, 566, 261, -145, 356, 7, 478, -502, + -290, 49, 1152, -790, 77, -994, -119, 122, 394, -481, -96, -495, 130, 624, -379, -888, -190, -82, -242, 224, 156, -246, 90, -210, -211, 207, -31, -114, -403, 226, -17, -248, -204, 198, 545, 60, -155, -65, 199, 496, 98, 51, 408, -4, 112, -29, -79, -10, 149, 240, 140, -56, -85, 215, 148, -297, 293, 88, 567, -131, 145, 351, -232, -133, 193, -311, 1475, 118, 109, -327, -204, 240, 227, 130, 570, 233, -238, 296, 607, -30, 665, -71, 323, -683, 1226, -189, -144, 198, -928, -246, -447, 646, 358, 362, -435, 149, + 155, -586, 158, 485, 418, 135, -145, 49, -281, 921, 138, 411, 340, 492, -833, -77, -254, 143, -312, -375, 682, -667, 498, -428, 524, -132, -561, -66, -841, 503, 472, 565, -1732, 483, 304, -545, -363, -508, 881, -1286, 754, 1771, 25, -869, -351, 502, 1039, 273, -368, -786, -1303, -122, -18, 496, -398, -192, -308, 868, 45, -44, -266, 166, 38, -19, 22, -28, 153, 546, 676, 345, -117, -75, 260, 50, -185, 62, -289, -186, -350, -506, -1038, -425, 141, 29, 558, -430, -308, 715, 256, -213, -322, 218, -93, -303, 709, 63, + -54, -251, 1, -314, -254, -387, -114, -169, -138, -411, 267, -855, 140, -521, 774, 43, 222, -442, 351, -131, -292, 132, -301, -196, -253, -687, -376, 485, 426, 306, 364, -829, -224, 149, -229, 467, 351, 16, 301, 801, -232, -849, 1601, -708, -877, 970, -465, -295, 231, 490, -580, -201, 72, -405, 2080, -34, -327, -146, 30, 499, -1002, -786, -421, -421, -24, -889, 10, -93, 332, 1295, 1334, -528, 1034, -1018, -883, 525, 839, -298, 240, 91, 578, 689, 12, 32, 935, -840, -1630, -196, -643, 351, 783, -90, -508, 1039, 322, 198, + -274, -878, -475, 80, -365, 483, -35, -324, -35, -365, -352, 479, -149, 186, -353, 511, -37, -44, 345, 490, -47, -118, -336, 32, -288, -283, -201, -100, -509, -13, -228, -100, -511, 138, 605, 216, -359, -769, -50, -80, 414, -1032, -204, 228, -203, 464, -3, 278, -14, -90, 66, -587, 635, 17, 385, -397, -632, 589, -626, 200, -150, 554, -5, 129, -336, 113, -239, -796, -642, 278, -56, -13, 126, 607, -275, -176, -509, 225, 180, -55, -104, -1343, 58, 386, -487, 342, -752, -134, 46, 474, 589, 77, -285, 193, 1063, 935, + 922, -37, -87, 202, 109, -421, 273, 1173, -835, -268, -243, 6, 43, 155, -621, -942, -356, -54, 1903, 970, 646, -87, -167, -483, 827, 122, 529, -194, -258, -383, -340, -1406, -624, -741, 584, -53, -275, -43, -578, -269, 612, 922, -144, 813, 437, 342, 49, 386, 486, 411, -104, -24, 6, 555, -439, -563, -274, 305, -53, -396, -259, -396, 235, -88, 504, 1006, 189, 621, 805, 394, 500, 254, 159, 224, -368, 532, -437, -291, 117, 47, -311, 162, 288, 535, 218, -608, 336, 260, 67, 286, -164, -319, 178, -14, -234, -133, + -219, 86, -1298, 728, 642, -38, 1053, 469, -714, -710, 309, -294, -637, 38, 65, 283, -157, 370, -91, 350, 453, -420, -1684, 902, -253, -531, 386, 595, 23, -1135, -147, -49, -1163, -730, 615, -180, -472, -403, 265, -1137, -803, 1529, -129, -891, 350, 830, 359, -1261, 1802, 726, -1108, 615, 816, 128, -750, 778, 873, 528, -691, 653, 1223, 64, 1235, 1524, -814, -488, -567, 1440, 920, -628, 354, -380, -915, 788, 1799, 258, -538, -453, 1082, -102, -1206, -867, 222, -46, 1003, -180, 776, -1504, -228, 59, 261, -314, 322, -15, 34, 171, + 45, -394, 122, -188, 245, 94, -544, 478, 159, -456, -322, 86, -392, 77, 364, 397, 60, -374, -118, 122, -508, 298, 382, 123, 35, 378, 142, -170, 188, -137, 35, -261, 168, 606, -427, 1057, 1702, 684, -704, -262, -590, 360, -287, 464, 309, -783, 398, -798, -267, 4, -292, 42, 416, 322, 23, -637, 144, 506, -193, 73, -229, -745, 751, -452, 520, -768, -450, -112, -627, -190, 638, -626, 841, 50, 685, 266, -342, -924, 754, 463, 314, 189, 777, -581, -293, -339, 242, 286, -77, -732, -34, -106, -734, -297, 115, 192, + 578, -75, -516, 681, -134, -126, 825, 386, -679, 213, -417, 256, -219, 316, -587, 321, -205, 641, 110, 242, -222, -9, -477, 183, 29, 14, -15, 128, -194, -186, -25, 69, -56, 116, -244, -55, 183, -54, -12, -48, 2, 2, -385, 63, 303, -3, -48, -92, -41, -293, 17, -81, -39, -158, -238, -63, 225, -143, -74, 96, 44, 164, -179, -79, -31, -151, -209, -239, -1271, -1471, -806, 4412, 3857, 2353, 5121, -1082, -3868, -1344, -7281, -3799, -87, -1870, 2588, 4777, 657, 2812, 5448, 928, 1894, 194, -5619, -4673, -4148, -4545, -2773, 2273, + 947, 2276, 5890, 3567, 911, 4389, 1988, -2671, 1447, -1946, -5146, -622, -3185, -5826, -2644, -595, -3071, 3425, 3664, 1750, 5842, 6622, 2499, 3280, 3075, -3429, -2251, -4388, -6882, -6310, -4062, -4058, -1177, 2652, 3410, 4581, 6432, 5796, 3373, 2479, 436, -2671, -3907, -2847, -3720, -4574, -1560, -1721, -850, 2869, 1973, 2122, 4440, 1145, -204, 744, -1237, -1914, -1078, -1934, -590, 1255, 468, 696, 1570, -361, 323, 868, -1457, -137, 1819, -1718, 145, 298, -3447, -167, -71, -4104, 325, 1457, -531, 4244, 3846, 713, 4116, 2040, -181, 692, -1112, -4434, -4631, -5719, -6519, -3278, -533, 1326, + 4090, 6808, 7799, 6215, 4593, 2108, -858, -2584, -5698, -7128, -5253, -4208, -4011, 262, 1969, 2418, 3953, 3534, 2325, 2292, 1647, 529, 657, -7, -1251, -1430, -1814, -2323, -2077, -1501, -1125, -419, 557, 841, 1367, 1668, 1436, 1051, 805, 357, -65, -368, -540, -731, -581, -425, -340, -270, -66, -97, -82, -16, -73, -180, -2, -45, 37, 282, 450, 559, 811, 606, 304, -9, -283, -510, -550, -745, -746, -585, -258, -44, 282, 463, 630, 606, 562, 289, 71, -153, -266, -378, -301, -266, -118, -7, 137, 140, 191, 101, 58, -89, -147, -223, -141, -117, + 22, 70, 170, 163, 208, 121, 114, 14, -5, -88, -62, -114, -68, -94, -30, -50, 15, -16, 28, -19 } + }, + { + {-16, 197, -20, 60, -36, 263, -103, -26, -9, 32, -46, 120, -21, -81, -14, 165, 12, -83, 77, 57, 108, 44, -83, -55, 184, 26, -47, -36, -38, 36, 39, -24, -234, -59, 11, 162, 58, -20, -1, -93, 129, -132, -175, 23, 2, -59, -40, -49, 25, 16, 15, -61, 153, 5, 205, -33, -98, 45, -11, 29, 48, 103, 70, -27, -56, -48, 133, -135, 5, 4, -24, -116, 102, -59, 14, 89, -63, -84, -70, 90, -8, -28, -25, 3, -17, -37, 45, 46, 33, 21, 11, 63, 10, -1, 13, -6, + 2, -15, -8, -8, 42, 10, -28, 36, -78, 68, 41, -92, -50, -7, 9, -5, -13, -46, 83, 16, -36, -48, -2, 172, -24, -80, 110, -42, -103, -10, 88, 66, -56, 16, -70, 42, 41, -33, 88, -23, -158, 30, 83, 77, 11, -11, -114, -38, -15, -50, 104, 147, 68, -198, 68, 235, 97, -10, -1, 109, -53, 36, -98, -88, 91, 103, 50, 29, 19, 22, 49, 10, -9, -34, 25, -68, -12, -29, -141, -70, 30, 54, 44, 97, 76, 81, 116, -72, -45, -20, 37, 43, 69, -13, -22, -11, + 42, -29, 38, 11, -15, -11, 13, -6, 24, 11, 5, -8, 14, 13, -4, 20, 6, 6, -14, 5, -3, 2, 25, 4, 11, 11, 5, 137, -11, 57, -89, -130, -83, 72, -61, -60, -66, -85, 82, 13, 60, -26, 17, -177, -115, -80, 112, 22, 24, 63, -64, -31, -15, 21, -136, -25, -92, -98, 4, -87, 57, 56, 233, -58, 118, -79, 48, -54, 11, 205, 31, 89, -99, 63, -89, -41, -15, 131, -66, -33, -117, -61, -138, -18, 128, 31, 8, 23, 117, -117, -207, 48, 63, -134, -12, 18, + -35, 54, 159, 34, -42, 4, -59, 11, 8, -46, -16, -14, -67, -15, -39, 14, -16, -25, 51, -10, -54, 22, -39, 2, -42, -59, 32, -11, -6, 19, 23, 8, 53, -26, -6, 9, -21, -8, -8, -27, -16, 45, 13, 64, 6, 28, -27, 74, -208, 34, -72, -155, -110, 62, -30, -8, 154, 50, -20, 12, 131, -62, 97, -45, 30, -139, -23, 92, -30, 115, 131, 42, 83, 169, -39, -241, 56, -108, 9, -294, 9, 93, -58, 109, 17, -107, 39, -222, -140, -55, -53, -184, 94, 101, 7, 94, + 8, 25, -58, 85, 66, -35, 203, -39, 168, 142, -7, -24, 1, 45, 69, 21, 77, 25, 27, 223, 86, -99, -44, -2, -53, 32, -38, 225, 39, 105, -80, 91, 0, -45, 20, -74, -47, -13, -52, -33, -31, 27, -48, -12, -34, -19, -16, 61, -26, 31, -8, -54, -8, 32, 14, 5, 21, -33, 28, 17, 17, 30, -17, 6, -51, -5, 40, 35, 9, 6, 6, 28, -401, 3, -2, 104, 174, 63, -90, -144, -25, 191, -37, -35, -142, -2, -60, 142, 166, -285, 186, 121, -110, -22, -152, 3, + -47, 5, 97, 192, -73, 46, -51, -64, 70, 133, 88, -81, -137, 96, 65, -47, -26, 18, -176, 65, 52, -68, -118, 47, -90, 157, 67, -272, 124, -115, -302, -86, -24, 62, -125, -4, 65, -131, -132, -135, -43, 36, 285, 47, 53, -60, -150, 197, -60, -227, 10, -229, 16, -20, -85, -251, 76, 5, -57, 64, 152, 72, -30, -24, -2, 86, 13, 23, 46, 84, -8, -36, -50, -48, 19, -2, -41, -38, 36, 38, 70, 17, -3, -2, 26, -10, -2, -9, 44, -3, 23, -4, 61, 250, 65, 55, + 107, 158, -36, 384, -57, 275, -324, 112, 187, -67, 25, -90, -10, 148, 267, -75, -135, -38, 124, 28, 272, 130, -31, 40, -4, -127, 24, -28, -41, 120, 155, -247, 285, -217, -120, 50, -90, 145, 2, -82, 201, 284, -213, -37, -22, 89, -202, -329, -155, -100, 95, -228, -134, -26, 235, 150, -167, 119, 61, -89, -137, -21, -85, -96, 8, -63, 175, -133, -30, 151, -121, 163, 192, 27, -22, 18, -241, -211, -55, 134, 4, -92, 86, 198, -133, -60, 52, -17, -95, 1, 23, -89, 3, -24, 39, 13, + 69, 11, 54, -34, -17, 4, 5, -3, 48, 23, 56, 57, 4, 18, -10, 37, 58, -29, 146, 118, 160, -154, -203, -110, 139, 6, 573, -44, -14, -139, -259, -381, -84, 125, 201, -127, -244, 30, 2, 243, -82, -101, 301, -166, 20, -234, 149, -48, 1, -53, -354, -224, 19, 195, 131, 15, -367, 242, -148, -153, -158, -211, -33, 198, -163, -181, 123, -60, 71, 366, -160, 6, 18, 154, -109, -101, -51, 232, -53, -125, -22, 180, 236, -236, -267, -92, -40, -91, 57, -189, -66, -179, -353, -141, -82, 45, + -324, -92, 5, 228, 7, -201, -4, -10, -61, -112, 5, 45, -21, 33, 32, -46, 66, -29, -66, 69, 88, -40, -84, -5, -17, 13, 70, 24, 1, 47, -27, -45, -34, -49, 70, -188, 159, 192, -141, -173, -145, 78, -14, 279, 489, -275, 19, -12, -33, 44, 142, -402, 361, -284, -139, 362, -83, -174, 121, 133, 9, -21, -279, 174, -39, 60, -184, 230, -20, -387, -411, 137, -75, -214, 105, -19, 639, 106, -116, -191, -376, -135, 74, -93, 295, -63, -438, -44, 302, -133, 40, 259, 177, -149, -27, 210, + 283, -130, 56, 39, -135, 60, -62, -20, 43, -67, -79, -273, -296, -253, 251, 139, 164, 68, 3, 99, -216, -121, -303, 149, -38, -43, -61, -47, -154, -93, 32, -64, 10, 10, 12, 58, 9, 70, -7, 51, -70, 39, -105, 7, -49, 87, 5, -58, -16, 26, -45, -53, -123, -126, -68, 124, 9, 43, 80, 23, 97, 36, -79, -329, 125, -355, 15, 127, -56, -266, -123, -55, 238, 187, -140, -147, 254, 104, -145, -159, -122, -18, 245, -43, 23, -15, -2, 312, 156, 209, -14, -17, 109, -163, -272, 222, + 360, -244, 310, -92, -30, -139, 160, 9, -172, 104, 293, 227, 106, -220, -89, -445, 75, 230, -142, -37, -175, 45, -104, 171, -109, 57, 206, 116, 388, 202, 132, 247, -207, 371, 116, 225, -74, -257, -394, -76, -66, -104, -92, 147, -271, 410, -70, -333, 190, 307, 128, 39, 65, 115, 40, -69, 80, -63, 0, 129, 0, -5, 142, 20, 78, -12, -66, 21, 15, -57, 45, 58, 16, -40, 35, 12, 110, 24, -19, 69, -93, 28, 22, -102, -149, -42, -58, -38, -74, -52, -31, -12, -128, 181, -388, 285, + 102, -61, 426, 326, -535, -362, 342, 581, -51, 84, -47, -75, -55, -26, 151, 86, 355, 85, 340, 94, 150, -47, -187, 80, 30, -157, 262, 25, 107, 59, -50, -240, 35, -272, -88, -315, -206, -128, 268, 37, 134, 322, -135, -28, 42, 116, 40, 8, -86, 239, 532, 253, -415, -299, -306, 364, -50, -337, 202, -189, -15, -55, -18, -26, 17, 319, 533, 200, 460, 292, 153, 60, 120, -146, 490, 157, -248, -339, 156, 112, -87, 243, 464, 106, -170, 286, -20, -209, 50, 161, 33, -27, 25, 89, 161, 70, + 75, 19, 108, -41, -13, -58, -10, 212, -105, 80, -25, 52, 13, -55, 39, 77, 100, -42, 46, -83, 6, 44, -144, 67, -43, -213, 55, 530, 95, 190, -174, 140, -264, -452, 5, 248, 67, 200, 270, 307, 12, -327, -287, -434, -685, -8, -88, 304, 217, -251, -148, 180, 349, -441, -293, -82, -250, -162, -97, 141, 269, 16, -174, -202, 272, -219, -100, -3, 386, -24, 26, -613, -53, 153, 310, 414, 82, -394, 180, 11, 179, 262, 37, 133, 290, 522, -353, -134, -38, 161, 546, 235, 177, 312, -114, -181, + -339, -416, -256, -14, 261, 617, -392, -281, -47, 605, -346, -195, -310, -54, -278, 88, 44, 145, 313, 60, 197, -132, -140, -170, 6, -85, -208, -179, -96, -47, -50, 204, -161, -46, -66, 146, 28, 106, -77, -70, 137, 48, 30, -122, 179, -95, -14, -67, 51, -69, 10, 123, 140, 24, 269, 159, 380, -451, -329, -47, 663, 274, 12, 365, -230, 546, -132, -473, -97, -470, 379, 233, 146, 153, 4, -149, 181, 280, 134, -94, 243, 335, 292, -35, -264, 452, 100, -25, -82, 56, -300, 294, -62, -79, -381, -202, + -237, 526, 181, 7, 63, 273, 383, 200, -511, 460, -61, 266, 106, 404, -100, -527, 158, -23, 211, -93, -223, 197, -92, 133, 657, -80, -314, 2, 79, -322, 527, -238, -331, 472, -283, 241, 24, -343, -252, -343, 100, 286, -179, 166, 309, -177, 216, -74, 368, -134, 104, 122, -112, 0, 6, -172, -31, 155, -248, -47, 167, 89, -3, -148, 64, -41, 50, -155, -157, -85, 23, 36, -188, -113, 158, 20, 64, -184, 74, 14, -92, 34, 16, 57, -106, 5, -57, -12, -153, -62, -22, 96, -35, -99, -61, -22, + 21, 17, -37, -1, -205, 157, -454, -81, 223, 62, -444, 121, -165, 324, 63, 169, -732, 227, 0, 286, 449, 32, -72, 46, -247, 477, -461, 153, 269, 201, 247, -111, -229, -243, -476, 191, 57, 277, 477, -178, 407, 237, -420, -224, -20, 52, 8, 4, 195, 369, 321, 149, -862, 217, 238, 259, -573, 346, -301, 301, 21, 163, -90, 228, -82, 729, 332, -315, 26, -900, 138, -260, -289, 262, 169, -448, -917, 578, 338, -840, 318, -184, 311, -64, 65, 140, -4, -564, -226, -75, 168, 2, -157, 247, -318, -113, + 304, -20, -40, 118, 54, 132, 44, -163, 58, -247, 146, -104, 78, 75, -80, -31, -58, -83, 35, -138, -35, -116, -104, -196, 93, -53, -66, -109, 43, 110, 56, 63, 9, 38, 66, 3, 72, 79, 184, -96, 275, -99, -190, 340, -261, 9, 43, 862, -122, 624, 146, 472, 24, 140, 145, 831, 820, -420, -396, 479, -604, 7, 156, -590, 334, 55, -53, -101, -188, 79, 59, 119, -372, 10, -95, -475, 241, 344, -544, -393, -202, 298, 277, 278, -34, -101, 248, 866, 457, -161, -117, -109, 574, -455, 209, 131, + -728, -291, -38, 107, -618, 430, 270, 131, 112, 301, -585, -62, -486, 30, 294, 511, 305, -309, -174, -17, 12, -357, 812, -56, 104, -184, 276, -53, 159, -65, 97, 86, 173, -12, -1, -58, 38, -4, -50, 250, -76, -169, -15, -11, 119, -172, 37, -141, -240, 155, -48, -152, 9, 6, 24, -132, 185, 59, 228, -276, -23, 144, -76, -222, -8, 260, 110, -151, 155, -74, 392, 614, -45, 42, -381, 34, -19, -268, -455, -84, -212, -336, -250, 386, -327, 280, -101, -75, 534, -369, -210, 84, 214, 34, -712, -434, + 78, -112, 112, -97, -225, 455, 94, -37, -189, -1019, 610, -183, -14, -85, 36, 295, -173, -277, -479, -43, 208, -292, -380, 157, 597, -100, 555, 412, -411, 752, 493, -493, -767, -218, -336, 43, -245, -58, 363, -638, 310, -102, -362, -400, -403, -484, 98, 293, -264, 418, -57, -241, -504, 10, -59, 195, 595, -215, -456, -157, 10, 155, 406, 109, -53, -334, -5, 14, 149, 65, -2, 115, 165, -124, 207, -119, 93, 244, 216, 15, -345, -139, 50, 86, -241, 388, -237, 178, 206, -157, 18, 44, -93, -326, 67, 148, + 24, 276, 190, -186, -181, -48, -647, 1178, 1660, -161, 203, 106, 402, 804, -767, 9, 134, 15, -276, 41, -342, 403, 989, -209, 22, 56, 300, 27, 117, 380, -761, -57, 748, 767, -897, -191, 130, 126, 268, 676, 191, 1363, 228, 421, 202, -214, -282, -16, -956, -1376, -465, -447, -1433, 224, -33, -801, -390, -1341, -146, -185, 915, -896, 560, -612, -49, -402, -317, 360, 822, -633, -237, -57, -186, -67, 348, 659, 704, -502, 1416, 949, 125, -536, -1163, -264, -432, -318, 78, 374, -243, 139, 440, 71, -138, 446, 299, 153, + 197, 468, 474, 4, 40, 189, 179, -77, -139, -81, 88, -12, -58, 30, -92, 65, 310, -13, 111, 376, -96, -135, -142, -16, -207, -42, 181, -98, -55, 36, 4, 32, -27, 148, -98, -104, 246, 172, -187, -10, -99, -41, -592, 1084, 1808, -425, -91, 321, 810, 272, -469, 294, -400, 104, 257, -97, -540, 163, 577, -144, -823, 645, -188, 527, -194, -130, -202, -333, -12, 585, 328, 97, 474, -225, -186, 180, -252, 327, 192, 501, 859, 752, -540, -1009, -367, -64, 790, -302, 141, 318, -312, -465, -743, -764, 602, 641, + -512, -1839, 153, -130, -251, 142, -183, -738, -344, -174, -512, -220, 783, 295, 452, -178, -255, -167, 435, 72, 82, 373, 1085, -96, -159, -549, -518, -758, -81, 427, 292, -310, 226, -144, -180, -317, -287, 260, -223, 253, 120, 142, -162, -238, 266, 163, -67, 199, -279, 115, -38, 163, -93, -161, -91, -82, 186, 90, -10, -198, -47, 388, -281, -10, -273, 332, -182, -79, -253, 32, -109, 32, 283, 282, 57, 0, -111, -216, -238, -30, -390, -52, -322, 174, -456, -744, -163, -123, 138, -253, 574, -340, -1170, -632, 405, -549, + 651, 583, -256, -86, 85, -355, 3, 192, -50, 106, 824, 688, -182, -1088, -826, 64, 579, -436, -187, -513, -658, 63, -185, -771, -841, -1233, 499, 173, 29, 715, 958, -35, -713, -540, -577, -324, -203, 220, 372, -328, -525, -640, 342, 302, -630, -599, -240, -102, -367, 231, 1551, 934, 1812, 608, -962, 1131, -49, -575, 56, -541, -1188, -489, 272, 569, -134, 525, 301, 1156, 1257, 1038, 342, -288, -184, -168, 218, 295, -439, -159, 70, 943, -133, 84, -105, 343, 340, 405, -23, 11, 4, 90, -40, 60, -346, -107, -120, -318, + -335, -151, 117, 400, -260, 63, 136, 454, 608, 421, 387, 438, 93, -161, -340, -483, -607, -473, -285, -571, -587, -223, -107, 56, 255, 1083, -617, 74, 314, -133, -804, 813, 770, -441, -615, 87, 1067, -558, 302, 689, 207, -255, -514, -333, 235, -78, 178, -297, 197, -661, 970, -91, 216, -43, -1227, 385, -341, 635, 378, 678, -266, -1178, 846, 385, -404, -732, 606, 329, 645, 656, -571, 265, 681, -997, 915, 455, -31, 295, -521, 1152, -131, 759, 338, 1337, -95, -231, 186, 546, 359, 381, 1346, 83, 328, 791, -522, 544, + 62, -893, 332, -299, 1012, -743, -899, -930, 796, 1313, -419, 337, -1545, 151, 73, -56, -724, 124, 305, -235, -200, -191, 488, 233, -310, -329, -193, -75, -98, 144, -533, -316, 282, 120, 100, 21, 243, -38, -29, -309, 418, 527, -224, -810, -551, -2, 0, 160, 41, -253, -401, -216, 150, 239, 652, 224, 34, 15, -487, -96, 505, 303, 115, -527, -322, -56, 73, 96, -87, -97, -93, -31, -1980, 108, -242, 61, 1534, 1262, 1816, 959, -483, -370, -752, -1003, 353, 88, 264, 319, -292, 456, 775, 142, -207, -263, -548, -365, + -331, 151, 247, -788, -466, -109, 529, -239, 341, 423, -1119, -1103, 210, 319, 246, -833, -382, -748, -361, -342, 721, -948, -1319, -496, 262, 224, -1017, -817, -642, -487, 550, 775, 35, -263, -322, -180, -171, -350, -1129, 372, 849, 771, 240, 1053, 1425, -124, -183, 1091, -264, -664, -1500, -511, 205, -823, -551, 386, -135, 535, 936, -570, -884, -293, -379, -219, -240, -238, 100, 136, 110, 191, -317, 277, -438, -52, 273, 366, -392, -547, 313, -124, 21, -381, 452, -264, -95, -105, 418, -353, 453, -201, -211, 300, 79, 239, -189, 22, + 89, 489, -57, 116, 75, 1305, 452, 110, 470, -535, 31, -271, -407, 245, 91, -332, -563, -317, -523, -418, 166, -322, -163, 248, -165, 60, -183, 651, -509, 534, 189, 64, -493, -207, 387, 162, -12, 316, -59, -125, -204, -165, -137, 62, -6, 70, -576, 305, -243, -221, 197, 141, 72, -104, 399, 350, -505, 453, -66, 308, 603, -124, 325, 316, -304, -211, -405, 39, 66, -641, 263, 101, 499, -194, -1145, 720, 41, 24, 12, -501, -162, -130, -173, -732, 416, 214, 449, -324, 196, -364, -338, 19, 284, 235, 4, -39, + -106, 29, -172, -31, 484, -195, 94, 56, 135, -296, 321, -9, -65, 79, -36, 78, 105, -269, -41, 8, -54, -47, 145, -170, 213, 318, 115, -193, -14, -38, -187, 233, -68, 129, -669, -1900, -2825, 593, 2222, 93, 6081, 5605, 3852, 6622, 5096, 694, 112, -686, -4852, -4951, -3762, -6485, -6045, -1727, -2014, -2038, 490, 1230, -1008, -335, 1951, 1242, -61, 1450, 1009, 79, 1217, 2872, 1893, 662, 2946, 2180, 178, 2530, 3431, 827, 379, 3497, 965, -1354, 1768, 2696, -1365, 635, 3769, 364, 632, 4546, 3578, 309, 2841, 3762, -1291, -763, 1080, -3061, + -5117, -3453, -5644, -8394, -7705, -8623, -10982, -11592, -10250, -10835, -10201, -7658, -6111, -3179, -780, 1817, 6309, 7337, 7968, 12351, 12079, 8113, 10445, 8163, 3259, 3598, 5085, 2494, 1634, 3802, 2720, 1, 1314, 2960, 754, 223, 2215, 525, -2262, 758, 1819, -505, 1633, 4306, 1721, 984, 3797, 2081, -717, 464, -951, -4500, -5514, -5480, -6914, -7816, -6458, -6210, -7081, -6389, -5275, -6083, -5562, -3739, -2967, -2840, -1148, 711, 845, 2588, 4353, 4576, 4527, 5109, 4726, 3389, 2882, 2571, 1787, 1467, 1799, 1604, 1098, 1143, 1250, 1064, 1042, 1331, 1181, 847, 689, 623, 127, -15, -138, -722, + -967, -906, -756, -632, -385, -187, -148, -32, 256, 480, 628, 622, 472, 319, 118, 15, 64, -20, -222, -234, -358, -649, -719, -694, -930, -1009, -899, -1021, -1228, -1163, -1198, -1329, -1204, -1007, -1055, -950, -641, -508, -458, -131, 56, 109, 308, 568, 612, 641, 781, 759, 691, 792, 869, 878, 908, 971, 884, 838, 846, 854, 723, 621, 454, 235, 68, -11, -69, -125, -182, -209, -223, -209, -184, -148, -159, -147, -137, -131, -130, -100, -87, -60, -43, -9 }, + {114, 158, -93, 7, 5, -113, 151, -60, -59, 43, -157, -70, 167, 38, -69, 119, 37, 25, -25, 58, -1, -201, -10, -75, -9, -5, -192, 3, -124, 7, 19, 85, 102, 34, 25, 19, 88, -49, 30, 5, 13, 18, -27, 79, 118, -228, 105, -60, -137, -88, 174, 87, -60, 99, 28, -63, 61, 1, -1, 9, 11, -24, 1, 13, -11, 75, -47, -105, -102, -1, 33, -7, 4, 57, -23, 100, -107, -32, 81, 88, -62, 99, 34, -26, -68, -32, -30, -27, -28, -14, -5, -15, -29, 8, 19, -41, + -11, -14, 20, -35, -9, 4, 83, 7, -69, 43, -37, -53, 12, -112, -15, -84, 29, 54, 50, 41, -90, -5, -75, 79, -153, -85, 75, -165, -20, -10, 41, 37, 80, 173, 78, -21, -2, -61, -50, -304, -282, -18, 206, -51, 164, 15, 46, -51, -237, 122, 35, -71, 56, -125, -27, 71, 29, 221, -153, 134, -71, -174, -83, -47, -50, 62, 50, -140, -65, -80, -32, 135, 142, 155, -116, 19, -74, -9, -62, -77, -95, -105, 55, 16, -18, -38, 11, 59, -62, -53, -29, 67, -26, -13, -32, -34, + -11, 15, -3, -6, 9, 15, -7, -7, 41, -34, -24, 16, -24, 33, -24, -24, -7, -5, 18, -11, -13, 12, 0, -35, 8, 7, -28, 112, -106, -140, -119, 2, -46, -40, -94, 19, -105, -9, -42, 162, -103, -116, -255, -334, -79, -149, -135, -34, 70, -86, -198, 123, -288, 86, -47, -53, 188, 131, 71, 25, -31, -31, -69, 29, 128, -103, 122, 110, 34, 16, 51, 84, -187, -82, 181, -140, 13, -3, 111, -14, -40, 20, 187, 103, 66, 60, 105, -165, 128, -135, 119, 77, -33, -24, -55, -74, + -118, -6, -36, -96, -104, -60, -60, -11, -6, -29, 143, -58, -25, -96, 99, 1, -20, 21, -40, -69, 3, 39, -3, -7, -43, 13, -13, -40, 4, 9, 24, -5, 16, 13, 35, 12, -35, 2, 20, -5, -30, -19, 48, 25, -24, -11, -8, 68, -178, -3, -84, -160, -77, -29, -114, -37, -106, -39, 80, 112, -184, -103, 58, -35, -201, 134, 236, 51, -58, -110, 25, 116, 214, -108, -47, -137, -112, 120, 118, -166, 97, -52, -109, 170, -2, 93, -234, 17, -150, 35, -186, -115, -32, -42, 383, 123, + 98, 76, -289, 161, 110, -62, -9, 126, -20, 133, 151, 153, -90, 12, -51, 82, -74, -76, 48, -71, 32, 48, 0, 90, 33, -169, -23, -21, 51, -192, -64, -48, 134, -41, -25, -104, -30, 7, -12, -48, -1, -31, 33, 13, -2, 6, 10, -24, -74, 38, 13, -41, 17, -22, 6, 9, 23, -5, -11, -18, 14, -29, 25, -33, -5, -2, 19, -22, -12, -32, -22, -30, -240, -132, 96, -103, 278, 124, 272, -3, -135, -142, -194, 293, -73, 135, 148, 32, 104, 96, 91, 38, -195, -10, -76, -28, + 131, -11, -13, 93, 57, 96, -86, -304, -183, -115, 222, -202, -63, 138, -17, 26, -172, 295, 14, -114, 231, -143, 359, 187, -83, 42, -105, -70, -334, 118, -153, -23, -15, -72, 140, -55, -147, -141, 31, -129, -144, 81, 11, 103, -58, -303, 103, 132, 167, -163, -186, 24, 299, 48, -158, -71, -29, 82, 13, 88, -91, -34, -20, -109, -91, 134, -24, 52, -14, -38, -87, -8, 1, 33, -18, 31, -24, -69, -30, -10, -4, -13, 50, 3, 54, -19, -6, -9, -64, -1, 30, 31, 19, 238, -219, 108, + 285, -206, 59, -117, -219, 326, 126, 303, 284, 39, -222, -140, 119, -17, 51, -245, 28, -434, -178, -339, 210, -193, -4, 60, -53, -89, 105, 100, 301, -44, -63, -230, -192, 189, 44, 64, 360, -110, 6, 188, -82, 86, 69, 188, 174, -120, -15, -244, 255, -167, -215, -212, 136, -80, -112, 247, -74, 256, -155, -122, -30, 167, 222, -18, -233, 84, -147, 306, 67, 179, -244, -110, 70, -65, 152, 21, -81, 88, 201, 277, 218, 2, -47, -4, 50, 3, -45, 32, -37, -8, 83, 3, -35, 84, -23, -46, + 26, 29, 2, -54, 24, -38, 12, -74, -86, 22, 38, -3, 74, -26, 36, 144, -378, 133, 111, 76, -286, 219, 358, -349, 132, -214, 140, 20, 126, -103, -9, 84, -239, -117, -104, 190, 197, -64, 92, -47, 146, 188, 72, 58, -190, -70, -238, -261, -184, 19, -89, -11, -110, -260, -89, 55, 23, -14, 395, -318, 117, -158, -47, -98, -101, 170, -101, 15, -122, -79, -148, 203, -186, 167, -44, 167, -16, 27, -18, 162, 92, -3, 343, 15, -172, 92, -155, -188, -229, 224, 78, 200, 202, 239, 139, -27, + -43, -41, 228, -31, 255, 57, -11, -37, 87, 132, 34, 56, 18, -15, 25, -41, 69, 5, 59, -15, 56, -4, -89, 46, 61, 2, 50, -14, 3, -49, 43, -10, 21, 97, 97, -399, -29, 49, -89, -315, 360, -26, 16, 301, -82, -315, 113, 202, 390, -27, 167, 31, -338, -103, -174, 171, 102, 88, -125, -26, -11, 29, -112, 160, 48, -139, 203, 26, -221, -190, 56, 240, 221, -305, 597, -31, 15, 162, -20, -80, -2, 380, -187, 187, -42, 263, 83, 235, -86, -188, 135, 201, -96, -228, -242, -218, + -94, -45, 230, 5, 201, -25, -60, 194, -165, -329, -83, -210, -193, -366, 277, 237, 103, -567, 138, 119, -37, -17, -192, 270, 144, 107, 71, 248, -16, -18, 24, -3, 63, 28, 7, 76, -40, -10, -53, 17, 26, 84, -53, -9, -17, 65, -24, 25, 44, 52, -39, 125, 6, -3, -39, 49, -71, 28, 10, -19, 34, 62, -5, -109, -31, -15, -230, -11, 13, 169, -242, 16, -41, -95, -498, -56, 229, 184, 235, 32, -270, 705, 291, 481, 46, -205, -88, -64, -302, -15, -121, 153, -3, 19, -100, -123, + -256, 89, 21, 16, 126, -7, 51, -21, -223, -166, 128, 5, 315, -399, 318, 201, -146, -287, -459, 100, 355, -180, 343, -24, -20, 83, -106, -400, 44, 194, 81, -172, -50, -106, 85, 199, -14, 53, -31, 192, -88, -61, 125, -108, 293, -76, -154, 114, -273, -134, -2, 110, -121, 53, -46, 62, -2, 73, 57, -21, 32, -124, 65, -14, -176, -57, -53, -101, -4, 33, -85, -55, -8, -106, 4, 30, -28, -113, 6, 1, -91, 38, 60, -69, -9, 23, 3, 36, 98, 87, -92, -68, 114, 77, -541, 387, + 352, 412, -132, -371, 130, 147, -551, -503, 486, 51, -237, 182, -344, -394, 56, 1019, 474, 188, -277, 3, -99, 6, -116, -59, -129, 35, 290, 56, 358, -144, -119, 63, 250, -50, -36, -536, -23, -303, -16, 411, 295, -112, 288, 572, -274, 163, 475, -352, 502, -44, 206, -122, 21, -70, 69, 114, 498, -194, -64, 127, -233, 144, 76, -136, -227, 488, -33, -273, -90, 302, -129, 204, -2, 12, -325, -356, -170, -304, -273, -298, -19, -73, 143, -22, 25, -30, 180, 112, 12, -227, 7, -45, -167, -51, -86, 84, + 32, -117, -39, -90, -69, -11, 61, 58, 63, 106, -68, 10, 68, -51, -67, 77, -114, -48, -36, 47, 20, 78, 13, 5, 66, -34, -79, 660, 121, 91, -342, -202, 19, 74, 136, 151, -655, 27, 43, 472, 78, 118, -43, 429, -703, 19, 363, -422, 107, 80, 342, 65, 38, -118, 12, -363, 124, -92, 65, 96, -60, -276, 102, -218, -374, 210, -211, 137, -352, -225, -36, -112, 85, -153, 388, -7, 370, -392, -329, -108, 6, -9, -114, 330, 272, 690, -110, 441, -259, -47, 134, -529, 601, -19, 374, -18, + -524, -319, 221, -705, 366, 98, 534, 669, 88, -501, -377, -158, 383, -50, -92, 18, -140, 17, -103, -154, -52, -246, -12, 7, -113, -105, -138, -102, -47, 57, 117, 40, -20, 103, -74, -45, 25, 52, 68, -72, 86, -93, -42, -134, -228, 136, 24, -133, -131, -30, -181, 20, 1, -65, 132, 338, 518, 180, -217, 493, -530, -56, -164, 65, 420, -383, 949, 125, 234, -281, -386, 131, 1, 807, -119, -282, -465, -313, 222, 143, 129, -60, -458, -703, 49, -425, 559, 71, 454, -285, 188, -185, 233, 657, -113, -72, + -103, 170, 216, 110, 44, 65, 282, 255, -152, -230, -208, -230, 750, 295, -447, 338, -105, -366, -264, 130, 271, -520, -678, 71, -306, 881, 455, -156, -106, 183, 394, 98, -73, -122, -616, -33, -155, -668, 245, 413, -74, 204, 110, 421, -240, -68, 147, -72, -198, -223, -12, -137, -330, -73, -156, 135, -69, -185, 117, 43, 11, -117, 117, 27, -210, 64, 73, -102, -289, -146, -59, -38, -11, -114, -22, -87, 31, 25, -63, 5, -13, -93, -183, -32, 29, 93, 43, -141, -4, 94, 38, 36, -146, 43, -62, -71, + -78, -87, 8, -2, -94, 42, -259, -410, 232, -131, 357, 174, -402, -158, -207, 93, -538, 368, 496, -196, 306, -68, -145, 253, -379, 240, 401, 121, 697, 351, -302, 310, 121, 273, 6, 388, 323, 516, 185, -190, -245, -306, -37, 796, 10, 342, -502, 1038, -312, -798, -388, 658, 45, -82, -95, -39, 478, -347, 274, -64, 603, 940, 473, 458, -337, 538, 314, 323, 354, 538, -116, -916, -599, -663, 168, 248, 186, -147, 307, 825, 51, 72, 193, -37, -722, -762, -269, 162, 76, -24, -446, 121, 16, 45, 226, -42, + 142, 59, 280, -63, 185, -142, 29, 39, 326, 161, 325, 46, 163, -50, 32, 151, -97, -206, 44, -119, -248, -182, -58, -44, 318, 77, -6, -89, 45, 11, -121, -123, -101, 82, 201, -17, 14, 35, 88, 74, 215, -212, 135, 340, 399, 144, 188, 311, -245, 723, 285, 140, -206, -555, -224, 303, -30, -786, 1059, -372, -207, 326, 16, -106, 77, -206, -248, -54, -576, 142, -619, 17, -491, -553, -111, -118, -121, -405, 177, 432, 116, 331, -574, 566, 1032, 106, -414, 644, -529, -839, 1395, -144, 99, -98, -624, 481, + -565, 244, 853, -18, 1171, -915, 882, 256, -579, -305, 111, -558, -277, 619, -608, 403, -409, 223, 649, -1424, -627, 654, -1221, 430, 379, 697, 618, 277, -49, 409, 613, -667, 666, -14, 231, -37, 210, 52, -125, 44, -192, -65, 51, -36, -334, 209, -58, 272, 166, -239, 189, 227, 168, 67, 121, 69, 154, -468, 263, -64, -125, 328, -263, -219, 114, -278, -221, -90, -201, -272, 152, -412, -1222, -320, 403, 943, -299, 475, 15, 223, 491, 315, 849, -221, 37, 231, -749, -485, -223, -245, 174, 11, 65, -393, -64, -520, + -420, 201, 1048, 601, -274, -337, 500, 596, -355, 156, 461, -184, 1002, 339, 148, -774, 478, 96, 377, -81, 98, -129, -165, -1220, 324, 841, 417, 111, -23, 423, -684, -1267, 95, 1676, 405, 1329, 1263, 15, 111, -805, -718, -79, -616, 838, -1831, 344, -685, -1465, 326, 683, 1463, 129, 74, -934, 305, 438, -651, -63, 47, 682, -182, -438, 1035, 217, -369, -15, -598, 77, -566, -116, -19, -279, 87, -225, -237, -132, -2, -115, 192, 535, -30, 5, 201, -487, -293, -60, 148, 152, -422, -240, 337, 197, 118, 80, 356, -14, + 7, 36, -238, 43, 340, -174, -323, 898, 1560, 44, 424, 285, -824, -230, 817, 261, 359, -202, 236, 143, -293, 16, 423, 454, 547, -240, -70, -1211, -1142, 160, -707, 28, 608, 151, 70, -208, -139, 395, 953, -691, -402, -88, -678, -46, -654, -199, -694, 613, -840, -65, 148, 409, 1461, 1955, 503, -510, -1044, -89, -715, -277, -1111, 169, 1065, 791, 638, 80, 152, 1097, 1060, 784, -67, 496, 179, 247, -1263, 383, 136, -287, 757, 1035, -146, -14, -510, -2149, -45, 640, -316, 1493, 1055, -489, 95, -545, 367, 106, -203, -325, + -153, -27, 228, 292, 437, 16, -269, -570, 30, -267, 215, -252, -354, -83, -95, 264, 105, -94, 133, 80, 105, 30, -203, -313, -165, 124, 262, -18, 213, 2, -322, -326, 88, -400, -232, 6, -182, -44, 109, 172, -155, -267, -386, 980, 689, -459, 465, 730, 76, -901, -1088, 1017, 339, 240, 791, 24, -351, 861, 221, -642, -334, -228, 284, 25, -393, 157, -434, -36, -198, -202, 578, 1092, -373, 232, 508, -247, -222, 217, 614, 205, -478, -593, -726, 395, 404, 993, -470, -434, 343, 595, 915, -18, -1704, -356, 546, 555, + 244, -324, -15, -672, 100, -285, 705, 1022, -309, 31, -596, -634, -250, -1293, -264, -653, 576, -520, 597, 753, -1509, -116, -640, 656, -268, 238, -471, 87, -401, 456, 494, 866, 824, 420, 793, 380, 46, 432, 269, -107, 352, -381, 188, -189, 162, -483, 292, 15, 231, -352, -209, 250, -97, -109, 425, -322, -79, 359, 169, -218, -75, 155, 785, 437, 341, 479, 30, 520, 168, 170, 262, 16, 421, 133, -730, -324, -197, -234, 91, -142, -351, -501, -811, -192, -449, -836, -1247, 606, 655, 376, -831, -1147, -869, -503, 211, -44, + -1104, -670, -755, 1071, 341, 463, -333, -620, 1371, 331, 432, -268, 86, 397, -274, 314, -95, 645, 926, 34, -737, -602, 734, 494, 644, 179, 165, -335, -139, 100, 451, 959, -3, -1804, -1662, 19, -403, 1074, 1102, -1226, -821, -518, 1525, 1350, -729, 212, -957, -930, 569, -430, 10, -146, -663, 473, 494, 386, 1544, -1132, -299, -108, 399, 122, 638, -2256, -1305, 468, 711, 695, 202, -747, -757, 11, 453, 1300, 320, -436, 137, -845, 527, 454, 30, 728, 1566, 374, -1145, -603, -79, 130, 757, 655, 313, -347, -139, -240, -270, 678, + -79, 61, -270, 658, -305, -128, -16, 571, 251, 202, -121, -721, -258, 232, 574, 97, -799, -1110, -924, -24, 134, 169, 111, -304, -230, 1511, -1004, 944, 936, 602, -2188, -875, 731, -592, 423, -154, -909, 584, 174, 176, -402, -1445, -138, -42, 5, -204, -1055, 791, -652, 1349, -143, -115, 655, 491, -644, -57, -488, 722, 1133, 866, -957, 217, -640, 580, -556, -225, 94, -46, 615, -563, -1328, 344, -475, 499, 517, -1677, -286, -317, 61, 1863, -502, -1351, -360, 1186, 567, -730, -241, 737, -4, 909, -1363, -716, 819, -851, -2077, -609, + -284, 2373, -647, -1221, 651, -1409, 3726, 357, -3463, -918, -612, 2461, 1330, -1541, -816, -16, 1815, 1452, -227, -1135, 445, -381, 1637, -154, -824, -677, 1072, -854, 555, -1640, -9, -58, -97, -92, 344, -906, 880, 78, 645, 31, -1040, -793, 590, 705, 1098, 416, -114, -712, 94, 184, -191, 53, 719, 118, -36, -815, 156, 589, 214, 30, -242, -585, -649, -301, 198, -192, 287, -270, -165, 111, 22, 9, -2000, 560, -31, 683, 1655, 530, 228, -933, -386, -932, -1115, -374, 220, 637, 845, -95, 491, 594, -517, -1050, 557, 200, -853, -290, + 811, -276, -90, 741, 416, 329, 104, 421, -403, -976, -424, 278, -399, -231, 358, 24, -686, 716, 155, -637, 82, -154, 617, 343, -248, 289, -379, -855, 115, 208, -77, 2, 182, -374, 119, -320, 193, 610, -64, 266, 283, -236, 16, -583, 200, 343, -1057, 614, -659, 208, 32, -3, 293, 118, 692, 126, 197, -100, 355, -372, -243, 85, 61, -325, 118, -29, -93, -188, 68, -37, 375, -96, 46, 267, -186, 185, -114, 65, -186, -164, -186, -50, -83, 141, 102, -439, -118, -128, 307, -181, 116, 52, -486, 162, 318, 20, + -117, 52, -142, -73, 107, 1621, -60, -53, -451, -441, 332, -19, 287, 6, -160, -213, 108, -299, 302, -281, 441, -358, 256, -303, -69, -49, -284, -215, 62, -127, -91, -2, -214, 28, -44, 68, -52, 124, -428, 387, -148, -127, 291, -236, 13, -295, -260, 187, 163, -207, -136, 83, -16, -361, 89, 63, -3, 236, -91, -102, -100, -247, -70, 257, -277, 70, -136, -35, 14, -84, 57, 1, 177, -263, -26, 168, -342, 196, -156, 1, 151, -76, -158, 69, -31, -45, -15, -111, -7, 113, -12, -55, 16, -97, 62, 47, + 24, -79, -27, 97, -131, 125, -62, 53, 136, -171, 36, 10, -218, 37, -73, 86, -35, 4, 124, -87, 20, -140, 18, 17, -40, -36, -22, -52, 4, -28, 0, 93, -145, 58, -765, -1279, 471, 4117, 1024, 2272, -95, -2204, -723, -2169, -1863, -652, -453, -147, 1226, 1659, 2181, 2767, 1186, -703, -1285, -2708, -2585, -1047, -868, -570, 1108, 1523, 902, 1413, 1683, 576, 457, 320, -882, -399, -633, -1362, -760, -1011, -1510, -815, 180, 165, 834, 2042, 1388, 1164, 1125, 352, 78, -112, -593, -833, -1066, -1511, -1345, -745, -241, -508, 417, 789, + 661, 1155, 1278, 828, 741, 734, -119, -354, -185, -1041, -871, -217, -862, -912, -586, -820, -406, 240, 522, 957, 1523, 952, 873, 976, 354, -111, -182, -518, -868, -892, -860, -933, -657, -596, -503, -201, 230, 584, 893, 1359, 1422, 1395, 1177, 378, -312, -629, -1024, -1345, -1529, -1518, -1209, -675, -166, 423, 1247, 1396, 1390, 1464, 1203, 639, 198, -338, -977, -1358, -1206, -1120, -889, -408, 35, 338, 670, 766, 748, 602, 268, 131, 48, -104, -128, -122, -170, -204, -164, -225, -157, -122, -89, -103, -36, -5, 64, 78, 143, 174, 211, 156, + 160, 109, 69, -25, -54, -116, -125, -180, -167, -165, -118, -105, -33, 11, 67, 92, 163, 157, 172, 134, 108, 41, 31, -29, -48, -129, -171, -189, -136, -120, -37, 1, 42, 51, 98, 92, 130, 110, 116, 70, 48, -27, -50, -105, -101, -115, -87, -95, -47, -29, 31, 52, 96, 81, 96, 54, 46, -2, -11, -38, -20, -45, -26, -44, -17, -28, 0, -11, 16, 1, 22, 2, 20, 0, 17, -5, 12, -9, 11, -9, 10, -10 } + }, + { + {93, 97, -88, -13, 134, 47, -72, 17, -80, -67, -58, -120, -44, 76, -8, 43, -23, -33, -36, -13, 101, -63, 4, -3, 3, 83, -5, 58, 177, 141, 138, 75, 30, -21, -167, 70, -64, 108, 36, -54, 48, -72, -145, -42, -57, -133, 4, -15, -21, -61, 7, 143, 61, 98, -3, 61, -57, -2, 72, -59, 48, -74, -83, 10, 164, 112, 62, -30, 26, 20, 8, -28, -66, -96, -73, 4, -63, -28, -67, 24, 8, 36, -21, 30, 37, 34, 2, 22, -17, -14, -2, -39, 41, 37, -6, 46, + 11, 11, -22, -11, -28, 10, 12, 1, -10, 17, -12, -36, -13, -23, -4, 9, 7, -38, 5, 27, 61, 32, -106, 249, -6, 15, -27, -131, 97, -68, -66, -153, -118, -49, 95, 137, -28, 81, -32, 149, 154, -307, 56, 2, -30, 104, 164, -50, -24, 4, -10, -78, 64, -78, -62, -6, 82, -46, -173, -76, -118, 14, 11, -153, -18, -66, 32, -4, -23, 38, -51, 53, -82, 81, 118, 182, 76, -79, 65, 77, -28, -205, 14, 108, -82, 62, -119, -1, -76, -208, -63, -108, 53, 78, -70, 34, + -33, 99, 8, 59, 83, -34, 34, 18, 35, 72, -16, 25, 89, 52, 12, 54, 10, 24, -3, 0, -48, 27, 31, 42, 28, 10, 13, 3, 16, -5, -13, -2, 33, 29, 9, 26, 6, 30, 25, 205, 55, -276, 97, 143, 51, -23, 71, -173, 23, 78, -40, 76, -13, 92, 21, -116, 73, 109, 105, -30, 50, 59, 39, -312, 43, -132, -41, -43, 72, 35, -257, -91, -58, -47, 103, -94, -180, 46, 82, 53, -179, -82, 56, -167, -14, -184, 26, 93, -96, -27, 106, 137, -317, -22, -88, 97, + 38, 17, 27, -87, 80, 71, -246, 190, -26, 48, -126, -51, -106, -11, 27, -96, -137, 123, -44, 52, -7, -23, 35, 43, -50, -124, 70, 66, 16, 32, -4, 12, 21, 1, 21, 17, -3, 51, 7, 39, 44, 5, 62, 0, 12, 19, 28, 25, 31, -44, 21, -19, 10, 23, 15, 39, -12, -9, 28, 52, -130, -128, -101, -69, 210, -75, 31, -171, 181, 9, -118, -35, 106, -218, 76, -66, 51, 32, -96, -73, -253, -72, -286, 35, 68, -34, -36, -29, 46, -115, -203, -98, -73, -34, 78, -50, + 125, 52, 97, -130, -4, -9, -104, 27, 87, -11, -50, -127, -113, 75, 119, -6, 234, 180, -162, -44, 4, -177, -196, 299, -2, 6, 98, -194, -60, -126, 301, 78, 19, -239, -185, 23, -74, 151, -76, -4, 45, -95, 37, 90, -136, -1, -219, 22, 87, -66, 36, 24, 112, -18, 21, -24, -1, 45, 52, 43, -30, 12, 1, 18, 5, 18, -29, 68, 4, 18, 14, 20, 20, 18, -15, -20, -12, 13, 51, 53, 14, 23, -42, -19, -346, 173, 100, 176, -94, 96, 103, 181, 45, -348, 88, 14, + 139, 251, 15, 109, 97, -209, 74, 18, 30, -57, -27, 128, 87, 4, -126, -2, -59, -67, 210, 95, -7, -29, -250, -216, -245, 65, 68, -256, 20, 17, -252, 15, 41, -35, 293, -37, -141, -37, 169, -14, -258, 282, 148, -180, 139, 27, 28, -5, 18, -70, -128, -124, 227, -15, -64, -11, 164, -151, -263, 9, 63, 49, -230, -120, 92, -21, 132, 49, -39, -39, -33, -19, 7, 206, 122, 74, 68, 79, 122, -57, -17, -65, -17, 23, 8, -36, -55, 61, 12, 27, 2, -37, 16, 32, -71, -12, + 61, 13, 6, -27, -5, -17, -29, 8, 33, 24, -18, 25, 5, 105, 400, 120, 321, -353, 13, -174, 5, 118, 135, -181, 79, -105, -94, -126, -207, -30, -485, -4, 159, -21, -34, 54, -255, 90, -243, -76, 248, 51, 85, 6, 72, 213, 191, 371, 191, -280, -25, 313, -45, -228, -36, 29, -106, 210, 154, -179, -54, 201, 212, -76, -137, 339, -141, -456, -310, 101, -461, -9, -139, 3, -44, -128, 171, 50, -46, -150, 130, -90, 242, 167, -68, -161, 33, 64, 21, 10, 56, -33, -180, -51, 248, -28, + -103, -27, -54, -128, -127, -69, -62, 15, -3, 125, -12, -45, 16, 45, -31, 26, -44, 85, -4, 52, 6, -81, -10, -9, -87, -23, -54, 39, 1, -13, 28, 14, -10, 16, -98, 21, 27, -390, 184, -33, 98, 131, 211, 49, -187, 254, -95, 114, -114, 95, -18, -459, -96, -77, -55, 33, -111, -75, 61, 102, 34, 250, 114, -239, -18, 2, -136, 287, -171, -164, 301, 318, -40, -2, -198, 72, 43, -102, 52, 198, 121, 237, -59, -184, 115, 29, 56, -220, -115, -129, 52, 128, 46, 35, 226, 273, + 40, -128, 154, 128, -192, 28, 33, -21, 22, -3, 162, -17, -127, 66, 214, 96, 125, 266, -181, 33, -62, 253, 144, 271, -130, -33, 44, -95, 13, 28, -31, 1, 62, 73, -28, 40, 27, 95, 82, -10, -8, -41, 11, -41, 22, -74, 73, 0, -29, 0, -7, 4, -27, -57, 81, -9, 13, -91, -76, -19, 78, -8, -9, 9, -10, 163, -339, -204, 135, -80, -317, 161, -166, -145, 205, -62, -67, -51, 53, 151, 79, 81, 84, -127, -75, -27, 185, 95, -324, 103, 101, -136, 305, 280, 151, 11, + -110, -72, 17, -95, -114, -188, 28, -215, 156, 60, 2, 34, 83, 71, 167, 260, -98, -412, -71, -281, 97, 39, -373, 135, -156, 468, 156, -295, -10, 298, 156, -245, -145, 312, 179, -217, 267, -222, -293, 45, -443, 268, 288, -66, -267, -48, 105, 54, 45, 27, 207, -290, 94, 323, 6, 11, -284, 142, 80, -263, -65, -133, -62, 10, 83, 66, 10, -79, 9, -85, 36, 50, -10, -41, -28, 52, 17, -17, -44, -85, -9, -83, 165, -155, 0, -17, 64, 42, -88, 27, -27, 140, -17, 39, 5, -81, + 34, 17, -10, 90, -1, -266, -197, 7, -320, 2, -752, -236, -87, -410, -144, -85, -180, -139, 98, -197, -376, 101, 236, -383, -106, 119, 193, 332, 211, 196, 214, 78, 379, -225, -97, 81, -188, 72, 107, 199, 26, 326, 68, 81, 224, -98, -192, 4, -294, -187, -340, -13, -15, -446, 161, -202, 92, -421, 51, -319, 477, 25, -425, 511, 625, 177, -209, -154, 163, -53, -20, 186, -298, 196, -308, 164, -122, -173, 74, 165, -89, -8, 193, 52, -94, 109, -47, -175, 24, 166, -31, -64, 66, 49, 135, 28, + 5, 59, -44, 95, 24, 79, 27, 63, 50, 51, 41, -56, 65, -76, -71, 8, 43, 15, 22, 48, 32, 5, -24, -57, 2, -60, 164, -80, 148, 223, 30, 206, -118, 321, -250, -229, -610, -133, -317, -739, 183, -425, -262, -342, 92, -665, 176, 56, -131, -13, -195, -66, 157, -226, -165, 11, 119, -197, -18, 230, -369, -83, 211, -202, -15, 3, -61, 311, -273, 185, -126, 253, 263, -269, -364, 339, -39, 75, 86, 32, -80, 192, -106, -416, 106, 86, -364, -39, -132, 219, 262, 132, 42, -103, -260, 264, + 160, 237, -19, -369, -89, -54, -164, -90, -46, 108, 163, -142, -124, -367, -177, 72, 149, 42, -34, 170, 157, 97, 193, -59, 151, 71, 102, 19, -1, -100, -80, -17, 47, -23, -88, -107, -5, -16, 21, -72, 16, -86, 26, 148, 32, -83, -88, 188, 105, -22, -13, -235, -28, -1, -201, 7, -82, -60, 47, 64, 14, -21, -184, 904, 519, 36, -288, -681, -85, 319, -151, -274, -514, -28, -112, 18, -177, 166, -5, 448, 175, -186, -15, -79, 32, -92, 91, 278, -326, 63, -197, 130, -141, -236, -464, -37, + 263, 89, -60, 98, -36, 253, 398, -139, -93, -462, -504, 139, 73, -212, -185, -416, -288, 166, -56, 1, 19, -32, 189, 109, -345, 15, -315, -27, -171, -97, 330, 685, 1126, 43, 361, -340, -435, -609, -34, -2, 122, 130, -85, -770, 318, -130, -108, 49, -204, 24, -111, -313, 2, -125, 1, 32, 10, 223, 31, 26, -14, 10, -11, 96, 208, 63, -9, 46, 189, 6, 1, 72, -65, 24, -176, 60, 90, -163, 166, 11, 13, -48, -184, -58, 80, 2, -20, -44, 110, -30, 7, 330, 550, -272, 1, 106, + -448, 4, -290, -281, 423, -124, -106, -227, 485, 426, 0, 701, 79, 219, 154, -195, -229, -365, -192, 85, 3, 314, 25, -34, -57, 222, -321, -784, -275, 231, 73, -64, -233, 14, -377, -57, -343, -24, -43, -242, 232, 115, 441, -364, 683, 183, -133, -242, -124, 107, 394, -121, 225, -348, 281, -316, -356, 351, -509, 333, 280, 541, -551, 419, -52, 373, 146, -579, -101, -136, 161, -307, 912, -45, -322, 129, 421, 286, 197, 217, -29, 103, -37, -121, -77, 32, -4, -120, 34, -35, -185, -39, -71, 77, 98, 53, + -25, 180, -29, 99, 40, 127, 48, -65, -80, 21, -10, 87, -36, 8, 75, -46, 128, -61, -70, 35, -53, 133, 48, -40, 80, 39, -381, -511, -1047, -321, -615, 171, -28, -209, -304, -290, -262, -284, -278, 29, -227, -41, -493, -756, 926, -289, 502, -96, 130, 160, 271, 179, -47, -15, -400, -90, -95, -269, -419, 164, -47, 593, -410, 11, 820, -198, -681, -220, 27, -309, 480, 221, -263, 195, 258, -159, -5, 130, 321, -12, -316, -311, 384, 275, -202, -438, 280, 323, -288, -394, 276, -499, 956, 206, -78, 39, + 234, 53, -168, 16, 69, 344, -225, 69, -679, -611, -68, 37, -66, -297, 217, 506, -14, 130, -47, 108, 153, 183, -195, 220, -101, -58, 146, 270, -79, -270, 78, -24, 46, -24, -145, -40, -149, -92, -184, 191, 196, -116, 1, 235, 75, -99, 50, 295, 194, 213, 215, 190, 71, 270, 143, 113, 101, 255, -396, 4, 144, 115, -260, 625, 437, 899, 493, 337, 128, -780, -66, 111, -463, -119, 885, 72, -515, -502, 458, -693, -182, 36, 186, 85, -134, 232, -316, 5, -64, -193, -44, -132, -456, 246, -395, 238, + 207, 276, 49, 186, -165, 744, 99, -776, -688, 71, 310, 607, -197, -462, -208, -54, 69, 360, 78, -269, 812, -985, -164, 197, -690, -349, -180, 111, -1119, -521, 804, -294, 236, -251, -903, -332, 438, -123, 172, 288, 575, -262, 66, -160, 361, 173, 157, 34, -11, 20, 316, 171, 188, -37, -3, 127, -205, -180, 88, 373, 174, 152, -348, 220, 666, 9, -2, -241, 185, 42, -148, -193, 34, 208, 236, 179, -198, 150, -130, 169, -256, -132, -46, -125, -164, -39, -421, -393, 75, -15, -59, 159, 4, -25, 13, 173, + 152, 61, 2, 85, 97, 75, 117, -30, 159, 445, -185, -1456, -364, 70, 413, 384, 367, 350, 659, 1160, -661, 479, -161, -32, -163, -973, -709, -148, -34, 195, 387, 482, -145, -28, -244, -9, -35, -16, 519, 261, 180, 380, 474, -824, 414, -484, -588, -189, 398, 100, -394, 122, 60, 278, -16, -801, -554, -666, -640, 73, 552, -113, 1968, -1291, -952, 577, -160, -405, -120, -120, 34, -1210, 139, -101, 178, 902, -51, 307, 367, 423, 1518, -573, 1917, 515, -38, 236, 123, -796, -678, -27, -155, 84, 309, 220, -121, -684, + -538, 207, -358, 229, 280, 580, 591, 514, 118, 170, 7, -40, 405, -78, -19, 111, -548, -147, 254, -14, -41, 346, 152, -538, 379, -307, -393, -242, -110, 89, 188, 166, -201, 245, 127, 153, 91, 206, -72, 119, -321, -84, -167, 60, 138, -855, 308, 1379, 35, 1439, 753, -83, -558, 1622, 240, -269, 206, -365, -112, -52, -102, 208, 449, 318, 57, 211, -327, -311, 96, -92, 531, 581, 366, -145, 35, -698, -441, -127, -482, -755, -453, 365, -441, -1335, -619, 413, -541, -378, 20, -95, 630, 930, 1218, -640, 347, -5, + 41, -258, -803, -1602, -1055, 562, -1069, -558, 295, 549, -394, 619, 1764, 376, 345, -1326, -1781, -381, -552, -947, -268, -790, 573, 329, 1602, 664, -180, -316, -549, 384, 731, 1453, 1018, -689, -1455, -706, -459, -857, -154, 745, 361, 920, 47, 656, 266, -202, -265, -305, 185, 405, 107, 524, 652, 398, 468, 220, 704, 620, 35, -3, 315, 699, -57, -174, -93, 598, 192, 38, -163, 378, 294, -80, 246, 302, 157, -53, 77, 219, 39, -11, -332, 718, 1477, -797, 1122, 868, -132, -250, -486, 129, 1001, 711, 1172, -529, -220, -262, + -63, -337, 313, -409, 861, 337, -1394, -631, 19, 184, 612, -316, -524, 130, 172, -253, -256, 130, -392, -639, -271, 1292, 553, 195, -665, -246, -563, 303, 646, 186, 47, 349, -220, 813, 483, 20, 284, -61, 1674, 315, -707, 242, 293, 136, 382, -8, -675, 774, 181, 107, 319, 116, 2, -530, 578, 625, 342, 1851, 1341, -754, -1450, -1049, -98, 95, -146, -1267, -611, -470, -507, -539, 461, 328, -128, 45, -109, -724, 201, -160, -37, -742, -682, -155, 290, 307, 43, 329, 155, 423, 66, 58, -774, -493, 330, 57, -215, 373, + 172, 39, -373, 327, 494, 315, 358, 421, -102, 469, 1006, 761, 177, 76, -131, -210, -521, -689, 169, -258, -16, 35, -54, -186, -92, -253, -1724, -204, 404, 497, -412, 617, 163, -225, -661, 158, -180, -932, -328, -321, 44, -1290, -1049, -158, 615, -70, -225, -774, -12, 693, 4, -453, -299, -85, -294, 184, 197, -653, -774, 133, -54, 177, 1203, -736, -106, -31, -1227, -345, -905, -121, -101, 866, 929, 1188, 308, 215, -472, -1008, 15, 434, -382, 1456, 3338, 3248, 446, -2051, -1924, -727, -1219, 3981, 2427, 1557, 1977, -15, -1087, -2806, + -1834, -683, -176, 1156, 2277, 2068, -268, -1676, -1050, -1516, -1230, 232, 1644, 2449, 919, -113, 113, -914, -1126, -1078, 361, 190, 265, 995, 501, -80, -646, -523, -378, -838, -190, 399, -338, 42, -136, 615, 430, -776, -513, -1589, -1313, -1130, 720, 1325, 480, 360, -488, -812, -2541, -1844, -1136, 241, 687, 475, 91, -902, -789, -1442, -2450, -931, 271, 742, 1236, 608, -12, -654, -264, -422, 18, 926, -906, 1038, 158, 145, -1626, -481, 1366, -902, 354, 36, -348, 466, 129, 781, 1148, -656, -956, 278, -594, 775, -997, -472, -642, 108, -196, -524, + 223, 1161, -913, -939, -752, -189, -243, 1547, 60, -6, -1517, -344, 107, 1307, 517, -185, -2174, -1492, 1419, 1625, 1497, -659, -3605, -659, 1565, 1382, 165, -367, 186, -1394, -900, 535, -466, 490, -307, 109, 1468, -1073, -635, 1304, 942, 1942, 756, -2472, 744, 2779, 540, 1434, 301, -711, -70, 1789, 1145, 2359, -3076, 470, -69, -287, 1151, 72, -1623, 191, -119, -271, 182, 45, -1014, 895, -449, 29, -9, -176, -10, 180, -320, -296, -579, -716, 703, 16, 224, 700, -792, 406, -84, -1283, -52, 471, 1386, -326, -2064, -182, 899, 312, 787, -607, + -619, -674, 276, -72, 456, -713, 323, 254, 170, -798, 26, 244, 543, -180, 64, -458, 128, -245, 454, -26, 349, -61, 103, -512, 16, 2, 547, -273, 176, -553, 30, -14, 452, -98, 181, -1779, 201, 318, 170, 1754, 295, -132, -1119, -191, -110, -262, -11, -212, 449, 209, -330, -57, 696, 2, -39, 74, -174, -299, 391, 346, 262, -435, 229, 651, 256, -37, 420, -76, -499, 132, 126, -402, -436, 435, 424, -418, 268, 259, -4, -152, 3, 331, -18, -369, 192, 225, -686, 175, 507, 166, -446, 70, 315, -578, 157, 271, + 115, -150, -551, 649, -702, -62, 676, 11, -116, 15, -635, 281, -9, 363, 672, -304, -48, -388, 514, -108, -57, 527, -687, -302, 382, 312, 137, -559, 194, -123, -35, 268, 204, 38, -142, -72, 27, 152, -488, 356, 73, -68, 138, -64, 310, -459, -83, 10, 28, 46, 213, 141, -779, 413, -83, -91, -32, 159, 214, -193, -77, 363, -310, -40, -237, 173, 1644, 143, -200, -551, -365, 191, -244, 211, -326, -27, 261, -149, 123, 119, -455, 124, -149, -101, -375, 104, -106, -238, -110, 180, -164, -164, 232, -259, 130, 218, + -457, 448, -114, -539, 285, 281, -251, 85, 162, -229, -204, -1, 30, 144, -74, -30, -227, 205, -178, -60, 259, -317, 90, -60, 0, -151, -204, -86, 353, -245, -93, 54, 74, 7, -215, 160, -97, -188, -7, -343, 494, -223, 99, 106, -103, 168, -296, -244, 300, -152, -206, 198, -15, 52, -138, 32, -32, 88, -111, -89, 113, -71, -81, -26, 70, -51, -9, -43, 17, 64, -99, -102, 282, -88, -104, 84, -35, 78, -230, 11, -40, -12, -63, 261, 1, -239, 74, 21, -13, -3, 101, -72, -70, -35, -64, -36, + 27, -78, -5, 17, -13, -822, -1329, 605, 4607, 700, 2304, -545, -2334, -855, -2275, -1505, -472, -255, 113, 1349, 1632, 2255, 2249, 709, -883, -1441, -2630, -2023, -1057, -418, -265, 809, 1370, 1050, 1443, 1390, 518, 447, 175, -1025, -374, -882, -1514, -923, -882, -1321, -276, 611, 472, 1338, 1765, 912, 1177, 878, -119, -43, -78, -951, -1161, -1044, -1561, -1338, -467, -83, 194, 1082, 1005, 960, 1219, 903, 316, 569, 319, -358, -164, -657, -1370, -831, -775, -1087, -517, -351, -604, 511, 979, 1120, 1798, 1686, 718, 416, -19, -616, -722, -754, -1087, -1004, + -913, -846, -521, -213, 4, 406, 966, 1195, 1119, 1341, 936, 448, 196, -159, -684, -782, -1081, -1420, -1423, -1138, -943, -147, 572, 1266, 1706, 1838, 1427, 923, 416, -113, -707, -1046, -1405, -1403, -997, -660, -195, 252, 511, 668, 844, 722, 457, 381, 142, -10, -128, -174, -219, -220, -311, -259, -197, -168, -162, -110, -101, -21, 60, 175, 214, 283, 305, 317, 201, 121, 26, -36, -178, -245, -323, -313, -267, -161, -107, -20, 32, 157, 221, 278, 225, 219, 152, 100, 22, -7, -99, -142, -211, -225, -241, -166, -113, -6, 37, 122, + 153, 192, 146, 155, 108, 89, 15, -23, -88, -95, -135, -117, -130, -94, -83, -17, 4, 70, 84, 128, 106, 113, 53, 34, -15, -8, -46, -41, -79, -62, -80, -47, -50, 0, 5, 50, 39, 61, 32, 47, 13, 24, -10, 4, -23, -3, -27, -2, -22, 4, -16, 9, -12 }, + {-35, 188, -106, 32, -157, 44, 18, 240, -144, 0, -76, 120, 123, -78, -15, -67, -39, -79, -98, 72, 23, -64, 134, 122, 208, -6, 79, 41, -4, -189, 49, 78, -75, 47, -55, -64, -104, 53, 133, 13, 155, -64, -14, 156, 82, 12, -2, 148, 223, -166, 37, -58, -26, -259, -92, 104, -81, 72, 33, -38, -63, 36, -22, 80, 43, 37, 41, -135, 5, -65, 82, 137, 96, -20, 148, 1, 62, -20, -34, 7, 74, 85, -29, -59, -121, -16, -54, -58, -33, -49, -35, -58, -31, -2, -1, 1, + 47, -34, 24, -12, -24, 1, 21, 7, 17, -1, -17, 0, 22, 7, -34, -26, -2, 0, 12, 12, 1, 27, -34, 114, -139, -142, 4, -192, 34, -59, 92, -50, -155, 19, 149, -21, 3, 211, 262, -112, -123, -33, -198, 86, 16, 51, -71, 106, -138, -23, 92, -75, -30, 16, 168, 13, 121, -160, 157, -15, 21, 105, -91, 88, -42, -39, 72, 100, -18, 58, -217, 132, 124, -226, -202, -55, -168, -45, 62, 43, 59, 5, -57, 142, -49, 7, -58, 35, -87, 121, 27, -90, -53, -34, -55, -45, + 119, 160, -9, -30, 4, 53, -35, 112, 61, -43, -10, -26, 46, -44, -3, -10, 5, 19, -5, -12, 28, -21, -10, 8, 18, 4, -42, -26, 6, -24, -24, 29, -16, -47, -33, -37, -12, 8, 45, 338, 65, -126, 157, 20, -106, 309, -207, -298, -174, -181, -60, 88, 109, -103, 157, -196, -106, -24, 66, 49, -59, -77, 175, 33, -11, -98, 131, -96, -21, 0, -10, -14, 52, 27, -26, 109, -50, 66, -4, -178, -69, -71, 190, -105, -126, -231, -268, -49, 15, -108, 206, 28, 111, -82, 178, 76, + -101, 286, -128, -138, 23, 179, 264, 186, 63, -91, -205, 83, -1, 204, 83, -58, -6, 104, 85, 2, -18, 9, -39, -85, -7, 27, 23, 75, -1, 45, -14, 36, -7, 7, -6, -50, 6, -9, -63, 52, -10, 32, -16, -34, 7, 7, -1, -22, 26, 10, -15, -4, -47, 7, -26, 26, -7, 54, -1, -27, -22, -322, 52, -118, 76, 20, 232, -298, -167, -219, 119, 95, 142, -157, 56, -48, 22, -243, -204, -153, -148, 243, -96, -31, -2, 82, -37, -258, 111, -104, -31, 118, 92, 135, 11, 72, + -178, -76, 164, 267, 160, -13, -203, 145, -64, -178, 247, 72, 87, -151, -85, 83, -53, -85, 132, -103, 47, 6, -168, -37, -110, 178, 94, -26, 33, -83, 109, 17, 0, 31, -201, -107, 118, 55, -30, -27, -142, 237, 297, 162, -132, 120, 24, 103, -42, 84, -62, 54, 111, 57, 55, 39, 5, -37, -9, 105, 9, 7, -37, -8, 25, 63, -5, 74, 15, 1, 0, 60, 78, -33, -11, -9, 15, 53, 0, 14, 7, 12, -23, 89, -484, 161, 24, 120, 130, -94, -342, 264, 112, 259, -48, 137, + -3, -93, -7, -242, 296, 67, 28, -152, -88, -103, 88, -136, 226, 10, 78, 126, 69, -15, 73, 70, -53, 59, -252, 65, 114, 117, 226, 78, -152, 75, -77, 154, 29, 112, 172, 28, -38, 135, -94, -147, -55, 94, 238, -57, 14, 4, 28, 46, 99, 33, -64, -12, -86, 61, 19, -152, -134, 53, 83, 84, 149, -232, -125, -169, 197, -88, -124, 64, -114, -165, -61, 4, 175, -63, 56, -71, -42, -11, 52, 23, -33, -27, 32, 87, 28, 50, -26, -17, 58, -3, 3, 22, -43, 77, -26, -6, + -38, -101, -17, -23, -9, -2, -39, 3, 88, -23, -10, -18, -35, 117, 494, 258, 236, 338, 95, 60, -206, -9, -387, -73, 151, 105, 72, 87, 110, -87, -54, 220, 204, 170, -11, 21, -275, -244, -89, 173, 59, -39, 98, -165, 18, -86, 196, 149, 342, -37, 131, 104, -52, -181, 322, -189, -40, 142, 9, 79, 233, -77, 88, -226, -474, -267, -156, -67, 25, -22, -120, -259, -51, -187, 59, -7, 25, -292, -129, 184, 67, -14, -318, -293, 175, 28, 107, -216, -167, 8, -84, -184, -126, 99, -37, 44, + 16, 124, 96, 40, -62, 31, -9, -80, -74, 70, -29, 18, -47, -78, -11, -9, 68, -11, -62, 14, 27, 70, 17, 14, -29, 88, -33, 101, -55, 74, -66, 9, 43, 0, -3, 13, -16, -26, -249, 189, -111, -9, -647, -152, -240, -158, 26, 214, -43, 283, 149, -16, -279, -115, 413, 70, -248, -181, -82, 195, -152, 3, 133, 212, 238, -261, 175, 24, 49, 75, 96, 84, 238, 7, 72, -209, 292, -147, -70, 50, -244, 301, -48, -587, -195, -472, 28, -7, -143, 640, -113, -317, -108, -78, 293, -40, + 140, 173, -121, 220, 302, -154, 115, -269, 131, -97, -77, 311, -115, -30, -139, 8, 5, 119, 175, 186, -50, -53, 7, 241, 114, 125, 4, -197, 78, -96, -108, -59, -3, -6, 12, 44, 45, -12, 130, 21, 57, 23, 25, -37, 34, 13, -39, -57, -38, -99, -78, 68, 54, -84, 22, -5, 23, 94, 20, -37, 10, 30, 2, -76, 34, 293, -410, 81, 85, -131, 56, 308, 333, 122, 119, 157, -256, -46, -273, -7, 176, 109, -57, -218, -70, 145, -284, 8, -20, 129, 271, 24, -145, -113, 290, -188, + -90, 164, -103, -344, -124, 76, 58, -139, 32, 176, 123, 169, -20, 127, 246, -111, 123, 103, -168, 362, -351, 206, 92, -490, 467, -305, 66, -57, 372, -161, -264, -59, 2, 64, 286, -246, -12, 14, 16, -47, 84, -201, -29, -144, -264, -295, 157, 124, 121, -1, 184, -89, -214, 52, -379, -319, -60, 89, -4, -62, -50, 41, -208, -73, -45, -38, 95, -14, 15, 4, -69, 30, -78, 2, 35, -87, -19, 66, -56, -4, -40, -7, 24, -2, -115, -22, -3, -10, -21, -74, -119, -32, -9, -21, 93, 66, + 11, -26, -332, 264, -754, 415, -303, -200, -371, 45, -49, 68, 257, -216, -89, 212, 186, -59, 69, -98, -348, -30, 82, -174, 272, 49, -37, -163, -167, 39, 422, 19, -65, 118, -374, -63, 130, -249, 354, 229, -18, -109, -125, -138, -250, -303, 250, 20, 448, 42, -28, -203, 33, -79, 97, -6, -290, -223, -295, -489, -73, 432, -418, -25, -437, 69, 117, 101, 304, -34, -449, 319, -35, -215, -184, -384, -136, -292, 156, -448, -79, 177, -8, 35, 210, 110, 253, 1, -144, -55, -100, -4, 91, -26, 12, 13, + 6, -75, -113, 69, -81, 34, 10, -15, 30, 12, 10, 155, 24, -9, 26, 49, 30, -78, -16, -164, 58, 85, 125, 46, 41, -3, -87, 50, -7, 322, -118, 286, -280, -148, 196, 63, -377, 24, 490, -565, 33, 264, 635, -272, -162, -70, 492, 483, -511, -24, -392, -188, 255, 257, 336, 191, -67, 236, -293, -158, -30, -45, -424, 37, -10, 560, -87, 276, 66, 163, 374, -227, -102, -553, 380, -488, -88, 112, -67, -282, -72, 80, -201, 55, -34, -43, -623, -441, 29, -320, -438, 80, -405, 128, 261, -237, + 450, 94, 288, 310, 78, -231, -275, -340, 173, -353, 210, 255, 350, 62, -253, -161, 5, 34, -469, -12, -305, -52, -88, 18, -224, 29, -53, -4, -147, -105, 32, 232, 22, -23, 29, -34, -89, -86, -97, -42, -114, 119, 85, -9, -95, 142, 210, -48, -41, -52, -26, -8, 49, -82, 81, 78, 50, -78, -16, 43, 58, 146, -301, 776, 324, 135, 399, -152, 84, -412, -531, 335, 682, 204, -3, -674, 814, 118, 100, 117, 30, 148, 47, -116, -5, 206, -126, 259, 50, -203, -282, -76, 258, -70, 84, -116, + -103, 5, 730, 119, 106, 99, 62, 438, -163, 127, -283, 522, 726, 190, -42, -258, 759, 357, 11, -293, 111, -176, -27, -336, -127, -224, -309, 500, -150, 369, 77, -286, -4, -614, 584, -42, -279, -218, -356, -438, -240, 680, -212, 245, 309, -274, -261, -490, 74, 331, 114, 316, -73, -62, 14, 90, -135, 38, -244, 80, -11, 277, 196, -150, 15, -8, 165, -56, -219, 49, -6, -18, 82, 15, -34, -110, -123, -24, -29, 130, -4, 130, -179, 43, 136, -255, -185, 66, -137, -37, -81, 191, 230, -172, -181, 722, + 709, 875, 527, 173, -222, -231, 131, 254, 311, -465, -13, -56, 234, 184, -322, -398, -1, -151, 380, 446, 0, 236, 78, 94, 516, -315, -417, 329, -546, 47, -168, 301, 154, 5, 353, 324, -294, 367, 0, -157, 87, 398, -153, 170, 296, 133, -636, -369, 63, 33, -432, -296, 145, 206, 176, -590, -411, -411, -32, 255, 374, -938, -688, 114, 145, 541, 192, 198, 395, -43, -100, -144, 969, 334, -152, -507, 464, 302, -150, -138, 72, -140, 248, -90, -52, 145, -35, -59, -75, 152, 398, 2, 29, 13, 174, 221, + -55, -140, 61, -14, 46, 25, 35, -189, -102, 133, 15, -77, 66, 185, 146, -250, -55, -167, -158, 117, -189, 74, -102, 184, 144, -221, -307, -595, -579, -476, 184, -61, 269, -525, -86, 24, -202, -246, 427, -164, 86, -7, 30, -428, -157, -366, 49, 48, 95, 1012, -394, 279, 426, -216, -204, -306, -62, 473, -482, 330, -31, -80, 44, 48, 259, 29, -511, 391, -318, -734, -594, -298, 994, 843, -458, -132, -629, -525, -207, 614, 16, 423, 222, -289, 323, -220, -655, -56, -397, -81, -213, 1293, 12, -1070, 841, -339, + -238, 849, 863, 3, -377, 168, 211, -1162, -500, 31, -170, 608, 258, -882, -132, -71, 400, 254, 174, 158, -183, 31, 71, 369, -45, 50, 73, 63, 218, 102, 6, -252, 320, -29, -1, 14, 1, -137, -211, -146, 30, -53, 94, -15, -93, 101, 236, -314, -101, -96, -44, 88, -5, -91, -175, -67, -44, 162, -517, -317, 154, 125, 277, 884, 149, -20, 203, 49, -369, -222, 194, 48, 716, 173, -48, 263, 383, 394, 418, 25, -299, -79, -678, -89, -765, 428, -467, -177, -1, 620, -361, 346, -255, 211, -318, 396, + 592, 43, -129, -318, -465, 261, 293, 757, -106, 40, 329, 1211, -286, 184, -199, -671, 469, -94, 332, -40, 80, -404, 1116, -1677, 1232, -1924, 827, -992, 305, -777, 277, 519, -128, 386, -202, 1407, -857, 935, -1450, 731, -572, 703, -476, -509, -255, -128, 349, -96, -68, 37, 16, -179, 247, -271, 261, -196, 76, -312, -181, -230, 35, -212, 257, 282, -273, -3, 100, 259, -46, 93, 204, -197, 342, -97, 455, -275, 546, -394, 135, -32, 301, 257, -57, 150, -435, 486, -343, 118, -348, 246, -462, 156, -48, -166, 161, -327, + 49, -160, 159, -159, 91, 57, 43, -122, 427, 344, 1355, -942, 394, 250, -814, -21, -160, -230, -418, -21, 48, 541, 201, 284, 405, 330, 12, 451, -519, -73, 625, 71, -858, -196, -1123, -208, 196, -207, -262, -48, 1003, 255, 77, 124, 251, -74, -576, -175, -64, 108, -133, -268, 727, 392, -150, -33, -156, -656, -539, -393, -328, 734, 177, 272, -442, -428, 138, 300, 275, -123, -87, -497, -329, 436, 20, -1205, 424, 659, 211, -525, -323, -261, 86, -378, 187, -887, -1187, 492, 428, -236, -436, 334, -195, 87, 103, -174, + 190, -108, -112, -64, 285, -202, -60, -221, -3, 19, 191, 198, -22, 117, -140, 231, -161, 189, -437, -198, -60, 127, -143, -284, -219, 104, 225, -8, 291, 82, 115, 18, 189, -107, 181, -43, -360, -276, -106, 164, -202, 119, -302, -133, 138, -1120, 980, 1191, -111, 866, 35, 131, 378, -767, 278, 565, 559, 233, 173, -555, 405, 237, -336, 178, -67, 659, 182, 168, 390, -158, -450, 129, 841, -303, -164, 758, -279, -341, -277, 260, 977, 1357, -85, -883, 1332, 457, -878, 992, 380, -248, -255, -374, -619, -37, 324, -532, + -348, -1123, -153, 651, -1358, -737, 214, 217, 268, 822, 729, -1209, 10, 45, -855, 237, 406, -440, -313, -372, 247, 947, 296, 492, -649, 329, -735, 63, -494, -2008, 1534, 393, -561, 1037, -359, -475, 279, 211, 267, 404, 163, -410, -130, 397, -14, 152, 63, -67, 97, -181, 132, 370, 133, -222, -164, 112, -101, -201, 75, 230, 134, -696, -211, -513, -267, 296, -229, -288, 271, 174, -301, 378, -283, -125, 135, -223, 249, -113, -413, 340, -637, 734, 2432, -776, 21, 188, 1098, 975, -319, -422, -614, 27, 465, -14, -314, -321, + 438, -238, -591, -526, -107, 895, 627, -710, 47, 14, -310, 354, 130, -252, -84, -198, -95, 1142, -425, -756, -531, -429, 1009, 29, -234, 931, 639, 255, 473, 915, -556, 142, 889, 521, 679, -770, -217, -27, 326, 308, -730, 71, -959, -1441, -76, -380, 671, 747, -195, -58, 152, -523, -1397, 942, -677, 147, -260, -471, -273, -546, -1107, 656, 583, 708, 137, -879, -1546, -458, -427, -187, 490, -315, -76, 95, 67, -244, -111, -196, 25, -86, 165, -95, -119, 181, 235, 187, -373, 124, 23, -32, 6, -820, 41, 116, 123, -540, + 354, -76, -449, -367, 221, 292, -52, 174, -276, -194, -188, 24, 338, 87, 323, -6, 151, -476, -72, -112, -88, 375, 180, -11, 121, 58, -375, -121, -1189, -690, -551, -1412, 1629, -43, 861, -201, 48, -986, -531, -511, 119, 762, -30, -805, -593, -1149, -1267, 1086, 408, -996, -302, 483, 914, 121, -1123, -692, 227, 310, 285, 653, -696, -671, -97, -242, 98, 190, -1350, -256, -940, -612, -1256, -484, 1732, 292, 60, 417, 433, 129, 1289, 1010, -331, 339, 1739, -461, -400, -421, -1287, -56, -702, -1611, -1678, -889, -864, 387, -646, 50, + 347, -1150, -414, 1, 0, 289, 753, 491, 907, 1215, 891, -116, -639, -942, -74, 380, 120, -138, -6, 258, 220, 568, -59, 85, 16, -199, 194, 23, -86, 485, 219, 105, -454, 303, -158, 227, -430, -1220, -50, 472, -83, -651, -406, -478, -348, 147, 220, 234, 74, -50, 189, 468, 802, 742, 940, 791, -66, 530, 1224, 81, -522, -766, -754, -1047, -835, -410, -442, -68, -127, 1070, -698, 207, -809, -281, -883, 108, 1081, -31, 670, -1337, 1174, 386, -236, 921, 134, 415, -367, -445, -5, 277, 221, -936, 857, -1037, 129, 281, + -347, 600, -637, -371, -68, -236, -321, -79, 140, -484, -558, -190, -96, -146, 343, 176, 141, -689, 183, 818, 1098, -818, -406, 923, 1277, -783, -477, 528, 227, -624, 511, -1453, -284, 578, 1154, 140, -715, -657, 175, 1371, 120, 196, 41, 448, -89, 1016, -12, -1148, 717, -753, -228, 303, -435, 92, -926, -357, 857, 383, -386, -562, -302, 59, -448, -147, -100, -286, -170, -145, -581, 353, -219, -270, -841, -225, 614, -441, -238, -237, -482, 908, 376, 21, -33, -527, -771, 35, 683, 549, 186, -592, -341, -273, 331, 46, -517, -142, + 30, 187, -461, -323, -273, 701, 363, 31, -448, -400, 398, 845, -12, -387, -533, -196, 236, 2, -125, 14, -108, -99, 80, 256, 4, -57, 1, -2, -66, 16, 2, 6, -93, 59, 13, -1749, -470, 281, -575, 1704, 1267, 812, 448, 1145, 828, 260, 567, -1374, -1820, -267, 27, -483, 255, -100, -468, -612, -480, 936, 835, -673, -75, -104, -156, -247, -335, -512, -691, -146, 1246, -408, -677, -340, 1171, -554, -524, 1785, 649, 291, -427, -999, -679, -1030, 285, 829, 2279, -2005, -835, 1158, 1630, 271, -85, 2068, 1008, -667, 674, -250, + 20, -1451, -714, -514, -2348, -1012, -368, 1260, -675, -409, 961, -74, -113, 216, 681, -656, 485, 711, 31, -148, -1319, 604, 492, -1551, -97, 156, 115, -142, -669, 172, 131, 182, -93, -208, 508, 95, -87, 329, 156, 895, -108, 287, 73, -730, -611, 429, -333, 257, 354, 199, 225, -4, 614, -201, -134, -246, 188, 456, -686, -271, 353, 147, -382, -726, -167, 187, 1507, 550, -123, 388, -74, -141, -552, 264, 232, -439, -210, -1593, -62, 654, -151, -665, 293, -151, 719, 141, -344, -7, 770, -438, 126, 275, -230, -8, -412, 845, + -48, 124, 17, 408, -182, -161, -261, 168, 322, -141, 381, -165, 236, -398, -309, 481, 622, -800, 41, 0, 79, 251, -499, 770, -687, 620, 91, -1079, -55, 841, -1093, 523, 9, 141, -259, -165, 226, -319, 1128, -832, 129, -224, -96, 277, 20, -137, -21, 339, -6, -390, 115, 198, -648, 508, 234, 24, 473, -172, -140, 220, 108, 140, 85, -129, 270, 114, 25, -286, -42, 139, 259, -434, 233, 270, -377, 182, 62, 65, 208, -114, 51, -72, -549, -8, -128, 243, -150, 93, 68, -23, 81, 141, -85, 0, 32, -4, + 48, 169, -165, 158, -118, -797, -2269, -3230, 1082, 2880, 629, 7974, 6559, 4439, 7500, 3913, -274, -935, -2972, -6842, -5660, -5496, -7652, -5651, -1669, -1224, -210, 2659, 1228, -331, 1677, 2789, 1356, 1306, 2528, 1511, 1155, 2298, 3601, 1501, 2108, 3388, 569, 226, 2983, 1768, -1163, 1440, 1847, -1949, -595, 2142, -449, -1293, 2758, 1463, -1738, 1481, 1957, -2643, -2484, -1062, -6380, -8451, -5314, -7473, -9968, -6943, -7114, -9183, -7274, -5041, -5475, -3272, 289, 2022, 4402, 7227, 9002, 11100, 12324, 13475, 14280, 12830, 10075, 9314, 5954, 1790, 1392, -975, -4622, -3627, -1561, -3438, -3544, -764, + -2507, -4767, -2898, -2101, -4278, -3638, -1312, -3237, -3851, -332, -229, -1747, 643, 368, -2807, -2082, -1233, -3971, -5469, -4471, -6105, -7553, -5624, -4517, -4297, -1900, 819, 2218, 3300, 4586, 5170, 4640, 6053, 7786, 8060, 7533, 7660, 7395, 5981, 6771, 6094, 2587, 271, -1583, -3419, -3601, -2997, -3516, -3453, -2995, -2971, -3154, -2625, -2350, -2267, -2144, -1700, -1617, -1696, -1382, -999, -944, -771, -435, -271, -231, 97, 128, 79, 181, 359, 314, 395, 473, 408, 263, 171, 105, 120, 81, 109, 82, -30, -159, -104, -5, 169, 398, 646, 669, 759, 917, 994, 1053, 1242, 1179, + 1002, 903, 856, 610, 523, 484, 286, 77, 98, -75, -286, -422, -613, -922, -1012, -1056, -1103, -1147, -1046, -1006, -937, -795, -590, -506, -358, -252, -216, -154, -13, 51, 157, 211, 280, 304, 336, 339, 356, 300, 291, 252, 231, 180, 180, 136, 128, 89, 89, 50, 51, 22, 31, 3, 13 } + }, + { + {125, 295, 6, 11, -141, -114, 86, 51, 9, 120, -182, -63, 297, 19, 59, -79, -99, 138, 117, -50, 115, 4, 19, -114, 41, -104, -79, -102, 35, 3, -32, -13, 35, 87, -41, -162, 4, -116, -146, -40, 67, -24, 60, 36, 55, -24, -20, -29, -23, 48, -1, 100, -13, 125, 22, 27, 121, 41, 31, 154, -62, 50, -53, -111, 101, -38, 1, 36, -18, -92, -27, 64, -42, -4, -88, 41, 7, -60, 8, -96, 15, -92, -7, -3, -11, 51, 26, 12, 29, -11, 53, 37, -4, 10, 12, -3, + 3, 16, -21, 11, -28, 23, 3, -6, -1, 19, 6, -20, 7, -2, -10, -29, -389, -202, -91, -84, 0, 1, 29, 6, -22, -159, -72, -163, -256, -213, 120, 149, 150, -59, -18, -17, -34, 56, 23, -54, -116, 84, 71, 105, 27, -35, -63, 30, 50, -11, 106, -51, -3, 103, -79, -125, 10, 173, 40, 39, 24, 2, 22, -26, 31, -136, 23, 142, -32, 3, 14, -48, -27, -19, -23, -37, 87, -81, 85, 73, 160, -10, 90, 204, -37, -163, -183, -8, -24, 11, -155, 46, -109, -81, 38, 115, + -46, -86, -103, -19, -11, 30, 10, 66, 39, -3, 34, 10, 65, 50, 31, 15, 15, -10, 44, 3, 14, -4, 2, -31, 1, -5, 272, 211, 92, 107, -69, 48, 189, 90, 203, -80, 83, 114, -4, 146, -75, 91, 19, -96, -22, -19, -4, -28, 13, -49, 17, -36, 186, -44, -8, -2, -81, -235, 135, -57, 53, -94, -86, -101, -64, 59, 179, 138, 61, -11, -36, 55, 129, -30, -40, 156, -68, 74, -76, -63, -35, 57, 64, -112, -74, 2, 120, 152, 85, 118, -14, 110, 46, 116, -64, 46, + 271, 124, 116, -29, -73, -185, 108, 44, -73, -77, -23, 54, -53, -27, -48, 0, 41, -18, -73, 20, 28, 42, 47, 5, 66, 30, 29, 18, -18, 43, 7, -2, -19, -35, -34, 7, 28, 9, 4, 6, 0, 38, -52, -15, 19, -23, 24, 82, 310, 44, 113, 225, 4, -129, -55, -39, 9, -81, -221, 88, 7, 5, 92, -146, -68, 230, -57, -87, -137, 4, -129, -22, -43, -39, 16, 186, -6, -59, 54, -148, 198, -26, -45, 248, -144, 11, -170, -78, 14, 7, 64, 78, -151, 44, 62, 51, + 14, 71, 51, 103, -96, -52, 195, -82, 74, 18, 55, 50, -18, -67, -11, 138, -83, -10, -45, 31, 122, -70, -155, -298, 17, -13, -27, 0, -116, -81, -167, -66, 81, -4, 50, -21, 102, 71, -2, 53, -6, -7, 34, -66, -36, -54, -2, -64, 36, -3, 16, -24, -22, -4, -24, 13, 22, -59, 26, 22, 12, -57, 27, 18, 50, 54, -7, -20, -31, 26, -17, -11, 8, -9, -37, -135, -331, 167, -108, -191, 10, -357, 78, 108, -38, 259, -99, -314, 76, 118, -108, -223, 379, -25, -22, 95, + -83, -50, 39, -187, 109, -21, 54, -40, 178, -46, 100, 86, -174, -87, -98, 180, -90, -56, 139, -50, -102, 79, 254, -130, 124, -135, 167, -94, 88, 15, -89, -261, 146, 185, -17, -61, 108, 129, 128, -180, -20, -159, -14, 53, -109, 40, 124, -133, -2, 23, -125, -94, 119, -86, 94, -57, -161, 31, -156, 38, -58, 52, -172, 157, -129, 14, -120, -7, -6, 30, -12, -4, -37, 39, -116, 38, -95, -80, 3, 67, 35, 10, 23, 1, 43, 86, -74, 71, -47, -14, 49, 34, -52, -4, -135, 170, + -187, -186, -318, 134, 336, 51, -61, -29, -57, 293, -176, -160, -38, -177, -55, -192, -83, -135, -267, -75, -59, -10, -30, 69, 158, 56, 78, -245, 30, -4, -77, 85, 45, -72, -32, -175, -194, -29, 214, -63, -111, -24, -72, -151, 2, -158, 321, 271, 70, -83, -76, 28, 48, 55, 52, -20, 119, -114, 52, -101, 2, -2, 67, 46, 150, -66, -93, -85, -350, 10, 72, -36, 126, 54, -106, 29, -184, -69, 14, 139, 59, 191, 38, -24, 0, 70, -80, -11, 18, -34, 48, -70, 35, -54, -44, -10, + -60, -59, -73, -39, -22, 53, 44, -55, -77, -25, -59, 39, -66, 30, -39, -12, 64, 3, 53, 35, -35, -34, -332, 56, 332, 319, -343, -307, 77, -243, -134, 38, -20, -98, 251, 116, -362, -26, 18, -1, 226, 88, -170, 244, 87, 34, -133, -135, 100, -86, -246, -42, -35, -106, -148, -193, 205, 17, 28, -133, 0, 150, -120, -244, -253, 264, 56, 250, -43, 73, 179, 373, 117, -44, -192, -79, -98, 59, 17, -145, -63, 218, 149, 295, 134, -201, -197, 245, 126, -125, -2, 252, 16, -12, -197, 217, + 158, -36, 295, -43, -89, -310, -44, 18, 163, -213, -16, 98, -56, -153, -148, -18, -18, -26, -185, -159, -98, 60, -7, -72, -28, -8, 13, 17, 24, -14, 58, -48, -16, 3, -39, -118, 5, 72, -25, -104, 6, -24, 35, 8, -16, -7, 32, -14, 62, 35, -5, -57, 41, -44, 41, 55, -135, 53, -50, -27, 165, -274, 165, -180, 32, 144, -2, -73, 54, -189, 7, -147, -426, -131, 180, 116, 65, -104, 87, 38, 454, 78, -154, 169, 33, 35, 302, -88, -86, 104, -214, 255, 236, -7, 133, -51, + -131, -18, -165, 13, -161, 61, -3, 45, 18, -277, -58, -37, 14, -140, 59, 60, -54, 362, -160, -324, 192, 316, 71, 81, -141, 271, -94, 44, 121, 34, -125, 129, 55, 14, -2, -251, -89, 121, 220, -87, -165, -228, -75, 75, 41, 112, -281, 51, 187, 23, -12, 71, -60, -33, -9, -17, 97, -29, 30, -31, -22, -23, -73, -42, 33, -52, 67, -12, -14, -35, -41, -214, 19, 112, -7, 38, -22, 69, 22, -43, -50, 38, 926, -253, 4, -92, -61, -205, -6, -542, 281, -194, -15, 316, 154, -207, + -225, -82, -193, 174, -451, 84, 185, 259, 49, 78, 9, 43, -61, -140, -412, -59, 50, 190, -150, 184, 69, -73, -28, 142, -151, -139, -83, -106, -18, -362, -172, -86, -12, 289, 63, 276, 93, -11, -175, 22, 15, 43, 93, 387, 43, -359, 91, -140, -12, -135, -154, -70, 146, 97, -641, -239, -192, 122, -29, -136, -90, 362, -150, 278, -263, -195, -285, -153, -302, -46, 400, 95, -50, 49, 169, -2, 208, -117, 79, 119, 141, 58, -27, -277, -105, -142, 0, 91, 76, -55, -22, 119, 47, -91, -41, -63, + -30, 6, 59, -48, -50, 151, 124, 41, -20, 55, 101, 9, -93, -8, -95, 25, -86, 51, 153, -48, -142, -157, 117, -291, 18, -678, 165, -222, 66, -231, -500, -77, -116, 354, 150, 127, -12, 470, -354, 86, 134, 363, -419, -239, -83, 34, -28, -119, -39, 125, -226, 46, 133, -26, 18, -183, -209, -130, 562, 5, -137, 218, -135, -284, -232, -154, -41, 99, 20, 19, 312, 285, -52, 101, 69, -362, -248, -16, -29, -95, -247, 302, 365, -300, 197, 184, -59, -287, -463, -449, -346, -204, -399, 35, -327, 195, + 176, 28, 3, -558, 36, 9, 40, -287, 95, 315, 42, 79, -253, -158, -32, -267, 61, 164, -80, -100, -123, 102, 168, -297, -163, -16, 196, 71, -87, 67, -12, -5, 87, -59, 113, -133, -47, 94, 82, -35, 220, 12, -140, -120, -21, -99, -89, 9, 61, -44, -47, -277, -233, -161, -182, -58, -414, 18, 451, -160, 237, -96, 450, 381, 157, -469, -121, 624, -163, 463, 71, -445, -227, 523, 10, -353, 7, -301, -43, 105, 41, -61, -524, -465, 126, 335, -300, -27, 129, -23, 50, 556, 101, 80, 47, 183, + -248, -176, -128, -589, -201, -222, -154, 154, 102, -38, -60, -233, -354, 459, -101, -405, -191, 81, 307, -245, -78, -260, -50, -310, -61, -67, -623, 56, -211, 430, -112, -351, -661, -436, -84, 54, 230, -171, -157, -360, 328, 556, 58, -67, 188, -146, 208, -157, -77, 71, 159, 115, -195, 6, 40, -3, -15, -49, 52, 197, -84, -174, -8, -39, 90, -1, 191, 13, 69, 7, -118, 31, -48, 207, 11, -131, -26, -31, 137, 14, -152, -23, 105, -48, 25, 217, -762, -387, -263, -414, -224, -169, -433, 455, -133, 686, + -347, -515, -102, -345, 587, -201, -312, -142, 156, 301, 255, -60, -71, -133, 63, 488, -15, 48, -158, -59, -256, -81, 111, 86, -212, 12, -313, 64, -95, -91, 125, 61, -147, -56, 264, 102, -222, -288, 482, -21, -772, 403, -87, -325, 154, -45, 34, -73, 266, 106, 26, 742, 729, -256, 78, -547, -118, -103, 232, -82, 36, 228, -168, 425, -180, 49, -574, 240, -150, -399, 200, -91, 805, 194, 152, 300, 32, -279, -24, -114, -71, 83, -101, 167, 99, -121, 204, 119, -136, -33, 11, 23, -57, 46, 71, -17, + -62, 17, 63, 41, 47, -127, 130, -257, 229, -150, -91, -15, 119, 175, 45, -194, 1, -76, -49, 51, -191, -341, 100, 917, -688, -217, -436, -286, 346, -392, 839, -95, 256, 50, 204, -519, 95, 140, -39, -75, -46, 158, -321, -191, -46, -87, -396, -348, -94, -159, 479, -121, -227, -160, 165, -242, -104, -422, 199, -159, 176, -147, 223, -110, -734, -370, 108, -53, -45, -225, -437, -21, 193, 134, -99, 148, 225, 700, -298, 334, -783, 54, 115, -89, -225, 163, 30, 41, 176, 558, 376, 288, -148, -174, 274, -329, + 82, 284, -198, 697, -10, 219, -189, 404, -380, -370, 12, 145, -171, -37, 433, 9, 394, 149, -61, -57, -224, -13, -12, 116, -14, -176, 32, 86, 224, -321, 57, -160, 69, 191, -63, 0, -170, 61, 64, -105, -392, -240, -154, 82, -207, -112, -138, -119, 80, 157, -3, 132, 49, 73, 24, -278, 242, -203, 373, 1076, 773, -212, -474, -332, 663, -787, 48, -204, -186, 313, -567, 70, -287, -14, -393, -314, 52, 14, 22, -391, 619, 118, -269, 105, -75, 47, 920, 282, -250, -231, 50, 277, 82, -691, -163, -480, + -152, -228, 236, -134, -60, -11, -18, -342, -384, 247, -142, 62, -13, 333, -271, -205, 92, 135, -361, 401, -251, -603, -551, -206, -154, -248, -119, -855, 304, -410, -122, -343, 475, 145, 230, -8, -67, -418, -119, 545, -451, 663, 517, 172, -116, 15, -90, 88, -291, -246, -143, 33, -36, 34, 130, -223, -49, 208, 231, -97, 145, -128, -188, -94, -56, 135, 43, 46, -186, -134, 71, -79, 66, 71, 140, 260, 111, 142, -176, -112, -58, 71, -84, 28, -77, 29, 277, 120, 78, -61, 176, 46, -67, -1072, -129, 708, + -869, -351, -17, -270, 320, -184, 990, -102, -211, -166, -40, 287, -192, -192, 809, -592, -68, 186, -126, 502, 288, -36, -59, 213, 290, 311, 260, 532, 174, 229, 143, -174, 896, 112, 171, 225, 137, 643, -42, 159, 226, 186, 109, 425, -247, -203, 427, -78, -423, -110, -742, -254, -139, 706, -664, -86, 33, -23, -34, 417, 1146, -199, 148, 131, 178, 544, -586, -606, -546, 972, 77, -366, 897, -340, 783, -419, 303, 33, -1030, -150, -254, 297, -16, -89, 12, 186, -23, -314, 174, 5, -141, -3, -270, 370, -35, 133, + -170, -158, -152, -210, -14, 6, 359, -16, 45, -141, 45, -335, 112, -322, -54, -69, -282, 153, -222, -229, 57, -320, 105, 256, 245, -120, -106, 62, 104, 223, 291, 17, 637, 53, -633, -1880, 380, -455, -721, 808, -482, -255, -710, 181, -137, -702, -221, -418, 200, -388, 24, 146, 319, 156, 537, 80, 2, -59, -442, -347, -313, 254, 403, 181, 147, -15, 159, 308, 732, -348, -186, 124, -324, 346, 82, -322, 745, 266, -616, 242, -593, 67, 120, 311, -164, -206, 945, 361, -398, 242, 503, -389, -814, 451, -60, -13, + 73, 196, 1277, -122, 165, 240, 2, 289, 177, -678, 149, -362, -308, -192, 160, -1093, -127, 337, 60, 539, -392, 381, -254, -117, -140, 169, 81, -136, 7, -3, -187, 151, -238, 254, 40, 176, 158, -113, -85, 42, -62, 35, 65, -110, -33, -126, -80, -83, -213, 1, 36, 124, -65, 120, 302, -158, 54, -159, 84, 91, -244, 0, 86, -239, -112, 202, 7, 38, 51, 5, 6, -580, -668, 1432, 306, -92, -172, 324, 1294, 594, 155, -37, 434, 1082, 270, 374, 338, 772, -496, 500, 223, -1478, 439, -208, 440, -459, + 349, 233, 461, -2, 197, 74, -418, 211, 418, -347, 211, -337, -202, 1063, 111, 941, -666, 295, -32, -132, -18, -79, 149, 347, 242, -23, 540, -852, -803, 588, -456, -115, -104, -550, 282, -142, 161, 89, 913, 445, 483, 184, 132, -823, -186, 411, -4, 15, 3, -261, -715, 142, 71, -534, 80, -254, -208, 231, 157, 821, -112, 212, 200, -152, -206, -18, -195, -72, 486, 206, 92, 30, -4, 17, -1, -23, -321, -94, 205, -51, 26, -115, -159, -61, 59, 396, -254, -245, 236, 119, -286, 213, 131, -200, 267, 29, + -149, -66, -101, -42, -43, 137, 72, 72, 156, 223, 168, -34, 122, 381, -1307, 1117, -475, 228, 708, -1028, -35, -74, 245, 405, 443, 794, 124, -483, 268, 844, -1182, -674, 782, 58, -13, 55, 61, -3, -27, 422, 241, -546, 29, -140, 975, 613, -207, 79, 112, 142, -12, 377, 30, 294, 996, 159, 100, -131, 252, -932, -417, -380, -47, 122, -845, 351, -751, 272, 769, -150, -700, -354, 284, -118, -1426, 407, -996, -198, -127, 51, -401, 119, 498, -394, -946, -1400, 1106, 354, -176, 333, -337, 355, 613, -621, 1100, 169, + -118, 529, 290, -160, 284, 39, 307, -281, -159, 101, 222, 401, 114, 363, -227, 215, 359, 337, -52, 309, -309, 143, 31, 153, 599, -378, 240, 53, -20, 486, 130, 628, -77, 321, 83, 258, 71, -103, 186, -292, 275, -94, 229, -31, 65, -2, 50, 19, 240, -30, -53, -8, 106, 12, -20, 35, 56, 58, 48, -5, 48, -9, 46, 52, 51, -56, 21, 35, -26, -23, 1598, -1719, 704, 850, -1052, -346, -560, -333, 1585, -725, 1129, -541, -137, -302, 378, 118, -1346, -279, -347, 563, 42, 222, 484, -688, -111, -449, + 250, 528, 356, -884, -138, 144, 127, -82, -392, -196, -762, -171, -96, 682, -620, 1524, 353, -485, 697, -7, 901, 455, 856, 176, 782, 598, 765, 765, 131, 739, -978, -203, 216, -684, -104, 376, -758, -1156, 459, 694, 31, 134, -778, -246, -650, -60, 757, 28, 1408, 601, -348, 1445, 789, -471, -164, -347, -465, -334, 367, -247, -724, 84, 514, -17, -236, -228, -149, -282, -439, 40, -100, -96, -339, -69, -119, 111, 244, -112, 49, -137, -266, 133, -72, -246, -504, 193, -694, -138, -482, -334, -393, -143, -64, -185, -277, -178, + -316, -102, -40, -68, -214, 273, -258, 105, -57, -471, -132, -480, 62, -47, -51, 43, -2244, 2049, -491, -635, -623, 1431, -1094, -135, -338, 24, 714, -797, -110, 367, -286, -74, -15, -435, 635, 77, -1129, -237, -300, 107, -1234, 29, 107, -199, -26, 367, 703, -267, -223, 197, -531, -1502, 97, 1263, -661, -909, 29, 1027, -497, -255, -1315, -168, -11, 951, 386, 155, -1001, -513, 722, -872, 285, 1545, 815, 1206, -600, 719, 397, -1271, -518, -666, -209, 808, -72, 870, 641, -1263, 1413, -845, -40, 111, -702, 1468, -133, -297, 1113, -899, + -198, -1298, -491, 645, -226, 587, 556, -103, -270, 136, -364, -343, -143, -243, -205, -190, 58, -245, 18, -319, -386, -275, 222, -148, -68, 215, 6, -29, -418, -560, -421, -740, 532, 270, 455, 211, -458, -394, -262, -26, 588, -97, -41, 117, -138, -69, -91, -201, 398, -241, 521, 29, 1314, 939, 134, -248, -688, 405, -58, -57, -47, -19, -1, -258, 328, -2, -1180, 299, 102, -402, 12, 512, -175, 39, -854, 624, -306, -87, -89, 357, -464, -12, 101, 19, 94, -214, 626, -325, 1106, -678, -732, 691, -773, 45, 570, -526, + -241, 311, 354, 478, -1697, 544, -20, -382, 1070, -534, 62, 11, -915, 1174, -59, -46, -618, -105, 960, -219, -40, 44, 275, 166, -1194, 592, 1057, -552, 422, -825, 1387, 68, -1301, 23, 721, -68, -809, -176, 1891, -290, -784, 137, 833, -211, -264, -93, -40, 54, 35, -207, 549, -84, -133, 36, 185, 468, -141, -221, 252, 63, -430, -151, 227, 58, -181, -91, 366, -330, -70, 62, 50, -312, -131, 414, -25, -290, -127, 302, -90, -217, -190, 264, 10, -737, -2451, -3710, 249, 3214, 49, 8404, 7614, 4563, 8791, 5772, -953, 338, + -1127, -6915, -3929, -3040, -6758, -5553, -1638, -3257, -3745, -299, 226, -1578, 351, 1441, -1828, -1549, 2458, 510, -591, 1721, 2303, 6, 2363, 4001, 1436, 1104, 4076, 2761, 339, 2998, 4415, 1948, 2261, 5036, 1916, 697, 4807, 4735, 1468, 5701, 8099, 3029, 3330, 5655, 1731, -1813, 334, -1862, -6787, -6469, -6914, -11109, -12013, -12843, -15195, -15893, -15527, -15107, -13302, -11932, -9757, -6438, -4594, -1573, 4406, 7142, 7051, 13049, 13910, 10835, 13195, 13826, 7428, 7753, 9499, 4625, 3741, 6176, 4484, 2121, 2926, 3915, 1676, 1375, 3930, 2091, -332, 2167, 1696, -1193, 194, 1569, -991, -415, 2916, 1172, + 136, 2811, 1855, -241, 180, -1184, -4061, -5534, -6125, -8040, -8606, -8594, -9314, -9398, -9846, -9871, -9023, -8957, -7514, -5790, -4578, -1887, 1727, 3661, 6074, 7591, 8035, 7667, 6997, 5956, 4844, 4230, 3705, 3052, 2754, 2682, 2448, 2304, 2403, 2253, 1900, 1648, 1326, 849, 539, 13, -612, -1089, -1476, -1498, -1427, -1337, -984, -737, -559, -327, -20, 208, 469, 571, 656, 553, 400, 330, 260, 101, 17, -45, -168, -387, -403, -506, -761, -726, -658, -984, -1069, -1068, -1326, -1407, -1271, -1451, -1528, -1356, -1262, -1228, -1041, -873, -814, -665, -413, -314, -191, 46, 286, 398, + 644, 916, 1062, 1184, 1411, 1498, 1479, 1497, 1490, 1327, 1165, 1051, 885, 636, 498, 354, 183, 56, -7, -103, -165, -206, -225, -261, -246, -233, -212, -204, -169, -160, -123, -102, -65, -48, -9 }, + {89, 292, 64, 43, -67, -23, -145, -5, -38, 109, 95, -95, -70, -57, -56, -67, 7, 87, -69, -72, -241, -176, -131, -5, 12, 177, -98, 89, 53, 46, 10, -130, 33, -279, 33, 10, 12, -18, -174, -77, -150, 11, 9, -89, -232, 161, -12, -134, -1, 92, 19, -45, 32, -76, -34, -71, 55, -76, 108, 90, -18, -153, 7, 23, -14, -55, 38, 29, -36, 85, 90, 64, 5, 2, 29, -82, 11, 131, 15, 26, 23, 97, 36, 32, 85, -19, 67, -24, 44, 33, -12, 20, 24, -6, 31, 50, + 11, 3, 34, 47, 36, -3, 13, 17, 17, 7, 3, -1, -12, -34, 23, 5, -309, -348, -24, -138, 107, -171, 44, 78, -115, 94, 348, 19, -31, 190, 27, 191, 4, 87, -136, -182, -9, 68, -125, -41, -12, -36, 35, -38, -66, 62, -31, -27, 137, 194, -60, -105, 39, 155, 60, 199, 9, -29, -5, 178, 12, -128, -70, 139, 102, 108, 30, -70, -144, 28, 68, 84, -31, -76, 156, 104, -25, -88, 6, -61, 163, 49, 30, 52, 19, 33, 100, 17, 101, -20, 160, 19, -158, -63, -55, 78, + 98, -16, 26, -111, -40, -103, -31, -67, -57, -24, 34, 1, 1, 4, 44, 7, 10, -5, -47, -13, 3, -5, 19, 7, 8, -18, 181, 129, 191, 201, -49, 101, -44, -112, -12, 297, 129, 67, 104, -122, 210, 92, 141, -41, -235, 100, -367, 75, -94, 75, 57, -6, -127, 32, 81, -48, 76, 187, -14, -152, -211, 34, 93, -192, 106, -180, -119, 133, -77, -152, -76, -107, 168, 234, 131, -82, 0, 126, 73, -9, -96, -44, -84, 90, 287, -1, -157, -122, 66, 25, -59, -169, -4, -144, -58, 24, + -26, 117, 21, 147, 168, -147, -56, 10, -117, -138, -23, 2, -86, 83, -78, -8, 63, 14, 4, 65, -79, -26, 18, 31, -36, 27, 13, 30, -5, 1, 28, -38, 50, -38, 24, 9, -12, -2, 22, -15, -28, -44, 27, -32, 12, 45, -7, -26, 408, -110, 40, 58, -269, -230, 6, 267, 204, 322, 107, -91, -138, 24, -79, 63, 31, 109, 201, 64, 148, -4, 88, -89, -186, -98, -142, 2, -39, 44, -227, -113, -30, 84, -112, 236, -265, 57, -167, -135, 78, 68, 228, -25, 58, -65, 160, 168, + 47, -36, -170, -23, 60, -131, 132, -144, 63, 239, 201, 3, -76, 38, 239, -29, 60, 37, 196, 2, -51, -121, 86, -182, 67, 380, 94, 179, 19, -251, 92, 47, -98, 103, -31, -27, -124, 53, 124, 56, 25, -57, -122, 29, -23, -19, 9, -6, -22, 40, -41, -38, -35, 57, 24, 45, -24, 41, 4, -39, 44, 24, -34, -67, -23, 57, 5, -14, 29, 26, 62, -2, -22, 40, -30, -147, -256, 130, -183, -185, 37, -89, -601, 60, 91, 550, 176, 42, -250, 230, 98, -98, 118, -19, 198, -118, + -63, -39, -54, -81, -37, 143, 123, 216, 75, 107, -3, -138, -152, 205, -112, 47, -19, -141, 205, -33, -90, 38, 149, -98, 226, -286, -240, -291, 70, -163, -251, -56, 233, -97, 69, 141, -102, -130, 10, 23, 77, 16, -74, -7, 301, 130, -124, -378, -304, 113, 358, 303, -236, 8, -154, 70, 59, -255, -21, 53, 29, -68, 14, 17, 7, 89, 79, -49, -64, 45, -31, 22, -91, 39, 26, -141, -33, 33, 21, 14, 27, -7, 10, 13, 14, -50, -8, 20, -17, -62, -32, 11, 9, 71, -106, 176, + -297, -51, -368, -108, 56, 129, -336, -84, 232, -27, -336, 175, -106, -192, 107, 178, 42, 38, 63, 232, -108, -95, 62, -114, -57, 4, -11, 9, 187, 96, -20, -15, 110, 46, 135, -11, 152, 160, 66, -173, 27, -23, -121, 168, -92, 71, -112, -41, -411, 39, 338, 31, 359, -65, -78, -366, 433, 204, 248, 41, 204, -1, 1, 169, -95, 62, 2, -410, 97, -95, 112, -61, 101, 383, 118, 102, -2, -231, 177, -93, 38, 89, 118, -126, -30, -51, -66, 76, -40, -32, -51, 11, 18, 7, -103, 45, + 22, -22, 35, 17, 31, 24, 55, 2, 15, -5, -20, 66, -8, 92, 18, 40, -23, 52, 21, 42, 44, 37, -471, -19, 360, -81, 214, -231, -154, -413, 237, 118, 275, 124, -131, 226, -55, 216, -141, -137, 20, -52, 193, 37, 163, 176, -104, -95, -60, 115, -21, -79, 27, -164, 86, 54, -82, 116, 212, -87, -92, -29, -156, -80, 243, 29, -147, 289, -319, 48, 175, -77, -103, -27, 140, -249, 126, -103, -208, -161, -125, 2, -58, -137, 60, 360, 203, -52, -123, -354, 39, 193, -112, -391, 13, -64, + 22, 46, 180, -13, -89, -37, -140, -86, -65, 105, -86, 97, -205, 15, -93, -65, 128, -62, -58, -74, 28, -134, -51, -32, -3, 26, -92, 25, -73, 39, 51, 107, 22, 38, 59, 42, -30, 16, 8, 79, 48, -10, 50, -6, 6, -35, 7, -1, -56, 16, -38, -32, 6, 42, -11, 158, -69, 40, 233, 15, 273, 296, 661, 451, 277, -70, -350, -122, 321, 138, -338, 252, -59, -168, -207, 31, 571, -388, 413, 161, -89, 135, -112, 295, -114, 156, 31, -206, -144, -200, 8, 169, -49, -113, 109, 14, + -34, -387, 117, -217, -164, 106, 255, -189, -271, 9, 230, 18, -155, -58, -92, 104, 76, -90, -146, -220, 135, 351, 215, 111, -205, 105, 222, -251, -327, 57, -270, -130, -529, 6, -363, -190, 97, -46, -35, 160, 27, -297, -206, 133, -42, 16, -93, 8, 86, -13, 57, 57, 11, 5, 42, 49, 32, 3, 10, -30, 78, 2, 71, -13, -49, 23, 66, -84, -124, -63, -19, -39, 140, 53, -45, 62, -37, 9, -114, -10, 7, -52, 723, 17, -284, 319, -349, 404, 32, -246, -422, -102, 206, -335, 296, -47, + 191, 228, -196, -81, -119, -156, -61, -146, 24, -178, 185, 117, 155, 315, 162, -47, 376, 192, 69, -202, -221, 113, -170, 38, 118, -252, 214, 573, 43, 407, 192, 197, 290, 16, 153, 162, -372, -253, 255, 16, 240, 42, 252, -42, 90, 62, -533, -36, 135, 355, 78, 311, 30, -75, 101, 139, -300, -506, -268, 68, 123, 16, 369, 129, -582, 146, -86, 2, 166, -235, -10, -127, 105, 148, 8, 31, 107, 3, -3, -52, -57, 18, 9, 2, 89, 64, 21, 52, 33, 0, -91, 69, 56, -37, -10, -15, + 3, 50, 41, 135, -117, -35, 50, -31, 70, -60, 119, -31, -39, 14, 67, 46, -19, -11, -50, -12, -353, -28, -315, -144, 129, -155, 68, 109, -190, -462, 147, -458, -532, 118, -263, 237, 332, -83, 387, -92, 383, 527, -1, 34, -531, -97, 56, 93, -64, -346, 23, -293, 36, -77, 79, -111, -197, 47, -37, -105, 122, 15, -82, 381, 139, 287, -181, 55, -153, 111, -36, 151, -52, -110, -147, -333, -200, 543, 217, 361, -417, 90, 305, -259, 0, 203, -111, 204, 26, -360, -96, -555, -71, 227, 114, 377, + 40, 251, 263, 95, -19, 488, 39, 15, -86, -46, 254, 153, 243, -27, -53, -61, 177, 39, -40, 51, 120, -27, -75, -141, 2, -112, -53, -95, 79, -10, -169, -29, 10, 14, -11, -78, 111, -91, 26, 44, -129, -23, -87, 18, 98, -89, -76, -55, -58, 57, 29, -344, -306, -325, -474, 323, 210, 29, -319, 288, -3, -403, -329, -115, -82, -258, -102, -153, -130, -96, -373, 186, 218, -20, -35, -68, -138, -443, -483, 14, 210, -128, -297, -167, 226, 166, 11, -93, -128, -130, 286, -146, 201, -138, 6, -482, + -105, -38, 363, 100, -85, -271, -188, -379, 611, -281, 581, 74, -250, 383, 377, 651, -639, 264, 107, 86, -127, -184, 283, 146, -48, -300, 334, -175, 359, 296, 281, -254, 554, -409, 228, 357, -205, 44, 10, 310, -82, 137, -162, 331, -10, 58, -190, 151, -10, 156, -45, 210, 103, 66, -124, 40, -104, 6, -88, -120, -24, -106, -70, -11, -53, -105, 72, 87, 129, 30, -120, 11, -81, 81, 34, -59, 16, 57, 34, -136, 27, 136, 54, -21, 39, 521, -870, -931, -587, -96, -410, 252, -337, 36, 166, -23, + 613, 445, 156, -178, -138, 432, -73, 69, -177, -381, 0, 158, 102, -209, 185, 29, -26, 367, 501, 38, -321, -136, -616, -236, -159, -182, 27, 110, -224, -87, -313, 340, 404, 340, 377, 300, 494, 63, 169, 120, -90, 193, 294, -293, -1022, -235, 339, -526, 270, 337, 121, -158, 26, -124, -410, -109, 267, -325, -278, 102, -225, 668, 677, -247, 436, 118, -64, -293, 208, -396, -330, 367, 275, 196, -25, -32, -487, -347, -64, -107, -90, -69, -144, -116, -134, -64, 18, 118, 91, 156, -13, -69, -73, -46, 220, 208, + 106, -15, -14, -43, -82, -124, -56, 27, -38, 93, -47, 38, 43, 42, 84, -93, -2, 24, 71, -113, 203, -79, -51, 839, -707, -8, 114, -667, -203, -279, 96, -200, 578, 80, -12, 732, -46, -640, -522, -312, 244, -33, -630, 164, 169, 333, -377, 193, 312, 279, 217, -73, 374, 412, 134, -907, 661, -323, 252, -63, -99, 178, -408, -227, 424, -193, -60, 390, -437, 392, -154, 364, -481, 639, -287, 987, -133, 65, 250, -215, -165, -117, 77, -48, -499, -620, -175, 364, -190, -224, -638, 294, 62, -865, -15, 13, + 125, 448, -305, 141, -392, -339, -518, -513, -94, -300, 370, -61, 362, -176, 205, -28, -235, -323, -39, 40, 156, -76, 68, 33, 128, -12, -174, -24, -262, -11, 40, 59, 13, -98, -128, 144, 65, -42, 161, -204, -275, -4, 241, 6, 69, 97, 164, 11, 184, -150, 58, 38, 150, 256, -160, 42, -39, 43, 322, 967, 484, -296, 668, 219, -425, 164, 432, -67, -146, -595, -160, 366, 241, 174, 109, -108, -237, -562, 300, -192, 150, -431, -232, -11, -65, 551, 168, 87, 424, 202, -638, -75, 235, -120, 15, 545, + 181, 632, -367, -233, -102, -237, 250, -247, 478, 474, -207, -465, 778, -401, -160, -94, 233, 118, -432, -130, 279, -207, 353, -167, 500, -260, 114, 761, -14, 536, 931, 117, 458, -237, -1117, -759, -144, -49, 637, -22, 214, 53, -157, -519, -1153, 873, 62, 25, 287, 135, -280, 645, 34, 135, -7, 42, -568, -213, -374, -228, -17, -213, -211, 131, -45, -147, 418, -79, -422, -304, 108, 19, -122, 644, 196, -217, -248, 65, -57, -135, 22, 58, -144, 151, -4, 219, 288, 54, -26, -88, 193, 184, 169, -1263, -302, 1319, + -507, -566, 1165, -748, 657, 877, 347, 121, -666, 255, -1169, -576, 256, 608, 69, 140, 443, 1182, 799, 250, 44, -1, 132, 98, -459, 10, 293, 370, 1578, 889, 608, 1139, 466, -163, 342, -22, 1092, 395, -89, -182, 456, -71, 524, -1628, 70, 560, -34, 678, -254, 179, 361, -1516, -586, -119, -486, -628, -740, 692, -453, 137, -139, 694, -1139, -313, -161, 356, -6, -106, 839, 1463, -8, 454, -278, 122, 1024, -1091, -648, -914, -1152, -103, -47, -456, -489, -464, -441, -568, -823, -361, -535, -329, 141, 718, 228, 105, 105, -76, + 157, 66, -517, -467, -137, -656, -263, -292, -228, -262, 292, -243, 13, 37, 123, 351, 540, -14, -145, 389, -209, 244, 89, 46, -115, 62, 41, -244, -318, -345, -56, 107, 685, 604, -568, -2011, -364, 825, 186, -224, -163, 63, -282, -369, 439, 331, 910, 333, 545, -206, 1212, 220, 767, -108, 1118, -426, 727, -712, 2, 80, 518, -205, -395, -942, 520, 70, 103, -455, -850, -51, 94, -104, 255, 545, 78, 390, 1386, -585, 135, -458, 714, 624, -702, 659, 747, -537, 186, 178, 517, 258, 1054, 334, -380, 64, 1364, 434, + -1570, 462, 275, -1346, -379, -431, -956, 69, 582, 644, -387, 1158, -303, -502, -264, 613, -2278, -277, 28, 1833, 237, 1554, 741, 1091, -36, 375, -215, 925, 932, 842, -210, -560, -235, 924, -115, -603, -268, 1094, 146, -681, -239, 987, 276, 411, -20, 373, -289, -20, -28, 161, -33, 175, -144, -320, -386, -464, -68, -339, -8, -61, -140, 327, -381, -153, -378, -137, -687, -506, 677, 12, -792, -1255, 1019, 2172, 154, -1217, 1886, -430, -20, 262, 1073, -619, 54, 2127, -1050, 502, 727, 684, -938, -101, 177, -469, 89, 217, -377, 373, + -644, -191, -253, -55, -383, -348, -118, 200, -703, -671, 1008, 176, -618, -170, 603, 1438, -118, -709, 761, 1101, -313, -88, 37, 395, 11, -5, 512, -1228, 847, -711, 17, -1005, 570, -84, -1485, 731, -98, -584, 1016, 113, 1005, -849, -314, -346, -771, -1216, -1592, 1352, 564, 994, 931, 565, 231, -581, 882, -440, -359, 1176, 403, -229, -97, 354, -829, 210, -322, 549, -204, -364, 538, 84, -614, 44, -286, -180, 141, -142, 123, -40, -440, -233, 203, -155, -274, 274, 451, 428, -339, -149, 517, -867, 268, 309, -360, -861, 440, 48, + -376, 262, -404, -672, 185, 592, -485, -219, 221, 516, -133, -71, 464, 27, -356, 1181, -480, 349, 275, -1227, 1104, 385, -314, 946, 81, 62, 464, -412, 1210, -970, -518, 450, 418, 205, -900, -549, -1003, 555, 135, 507, 3, 545, 222, 182, 24, 465, -208, 256, -457, 345, -423, -4, -558, -398, 26, -499, 236, 1189, 286, -891, 467, 358, 633, 18, 1051, -901, 140, 419, -867, -202, 1757, 988, -2320, -985, 1237, -337, -1100, 435, -111, -849, 626, 1057, -1430, 284, 1273, -861, -771, 1040, 141, -855, 154, 677, -746, -103, 822, -120, + -364, -587, 752, -198, 420, 98, 427, -291, 277, 757, 300, -557, 47, -399, -269, -561, -50, -149, -39, -377, 387, 333, -131, 866, -218, -919, 1108, -131, -209, 205, 389, 52, -102, 935, 515, -656, 57, 266, -476, -393, 677, -348, -1281, 1236, 158, -1249, -36, 659, -469, -1050, 607, 810, -1295, 191, 977, -572, -99, 1069, -78, -436, 251, 452, -585, -160, 627, -143, -546, 460, 275, -318, 1032, -2222, -152, -399, -2457, -448, -754, 235, 429, 722, -319, -968, -358, -1394, 191, 489, 292, 212, -1110, 676, 114, -1348, 984, -1449, -584, -549, + 396, 1034, 1215, -108, -267, -2341, 1006, 2353, 866, 45, -1293, -1910, -776, -170, 998, -1200, -707, -1233, -385, 2196, 2383, -424, -1092, -955, -499, -262, 1202, -580, 362, 239, 801, -230, -533, -1400, -599, 2105, 910, 1397, -1288, -728, -595, 1427, 33, -2354, -2255, 1253, 2181, 3640, 642, -3115, 523, -832, 1059, 1004, -3798, -1225, 746, 1991, 490, -1947, -430, -206, 1128, 948, 260, -1562, -240, 328, 694, 332, -402, 54, -855, -121, -12, 817, -566, 1094, -704, 304, 644, -276, 534, 460, 869, 33, -420, -512, 79, 31, 148, 80, -28, -70, -314, -343, + -66, 537, -141, 4, -115, 172, 41, 295, -279, -373, -718, -367, -43, 392, -384, -35, -1125, 961, -1004, -212, 31, 258, -194, 232, 382, -639, -559, -8, 140, 418, -472, 70, 349, -272, 215, -139, 1083, -11, -171, 630, 336, 560, -288, 359, -120, -11, 452, 330, 69, 141, 612, -573, -181, 66, 828, -9, -195, 780, -205, -334, -343, 647, -160, 285, 165, 102, -233, 119, 244, 92, 720, 364, 200, -311, -54, 281, -525, 190, 191, 539, 1, -60, 297, 70, -608, 681, 201, -155, 557, -379, -53, -282, -255, 557, 400, -35, + 197, -328, 72, -443, -48, -406, 86, 266, 91, 52, -94, -54, 73, -242, 66, -104, 111, -159, -62, -147, -195, 94, -38, -11, -75, 264, 96, -331, -352, -236, 68, 110, 249, 151, -325, -46, -125, 295, -78, 318, 127, -259, -3, 142, -153, 203, -124, 229, -166, -51, 69, -128, 1753, 141, -648, -537, 87, 397, -25, 362, -138, -97, -487, -107, -341, 541, -340, -28, -215, -101, -127, 59, -361, 55, -156, -254, 73, -41, 19, -69, 125, 61, -302, -194, -2, -205, -179, 149, -50, -308, 19, -172, 129, -455, 225, -198, + -347, 104, -160, -179, 45, -4, 19, -76, 74, -140, 152, -96, 14, 253, -185, 84, -51, -28, 67, -210, 188, -221, 188, -47, -12, -142, 177, -212, 11, 74, -281, 276, -172, 117, -131, 111, -102, -124, 203, -131, -28, 202, -134, -3, 14, 31, -148, 10, -16, -65, -44, 33, -49, -79, -42, 87, -84, 65, -26, -11, -29, -62, 53, -42, -51, 59, -67, 46, 19, -40, 6, -12, 13, -124, 114, -128, 18, -21, -70, 15, -40, 84, -215, -849, -1358, 1439, 5024, 958, 1511, -3096, -4295, -1800, -2247, 1734, 4034, 2313, + 1560, 151, -2218, -1971, -1963, -809, 1119, 947, 1020, 909, -27, -152, -230, -321, -463, -67, 620, -59, -355, -145, -514, -295, -87, -133, 992, 915, 547, 580, 33, -719, -726, -1341, -887, 119, 112, 269, 791, 1119, 677, 562, -23, -640, -883, -768, -639, 88, 231, 408, 287, 185, 43, -235, 93, 19, 99, 555, -50, 244, 256, -419, -783, -812, -727, 190, 599, 430, 656, 573, -192, 142, 358, -233, -214, -506, -647, -255, -152, -70, 275, 125, 149, 434, 416, 427, 246, 107, -214, -270, -665, -733, -517, -382, 165, 474, 601, 802, + 576, 365, 6, -252, -393, -835, -882, -314, 158, 420, 337, 291, 338, 241, -16, -65, 36, 7, -146, -133, -446, -295, -12, 160, 220, 172, -66, -9, 162, 126, 10, 87, 78, -53, -210, -190, -182, -43, -48, -4, 38, 186, 207, 186, 89, 59, -88, -161, -198, -117, -70, -1, 10, 68, 60, 111, 75, 45, -19, -9, -27, -17, -68, -62, -53, 37, 43, 53, -13, -19, -31, 29, 6, 28, 6, 32, -14, -14, -31, 17, -6, 9, -33, -12, -28, 11, 3, 39, 7, 18, -3, 28, 0, 4, -42, -24, + -38, 4, -5, 28, 3, 26, 4, 21, -16, 3, -19, 9, -14, 11, -11, 12, -17, 6, -12, 17, -7, 15, -12, 13, -11, 13, -11, 13, -13, 11, -14, 11, -14, 11, -12 } + }, + { + {67, 192, 17, 128, -29, -20, -69, 137, 88, -82, -106, 68, -26, -165, -189, 44, 10, -65, -64, -129, 82, -151, 39, -16, 35, 11, 33, -69, -9, 26, 44, -16, 54, 38, -66, 49, -40, -129, 183, -36, 9, 42, -22, 99, 129, -29, 49, 95, 9, -103, -78, 25, 62, -32, 34, 117, -104, -95, 99, 18, -38, -65, -2, 21, 75, -121, 59, 29, -93, -102, 87, -56, -123, -54, -11, 185, 216, -20, 36, -28, 34, -37, 58, 34, -35, -13, -37, 17, -50, 46, 43, 9, -58, 6, -2, 25, + -15, 39, -20, 6, 3, 24, -5, 8, 8, 25, -1, -237, -102, -163, 107, -79, -111, -75, -100, -20, 37, 179, 31, -96, 151, 6, 156, -150, 241, 112, 262, -47, -89, -18, -144, -12, -10, -52, 49, 5, -115, -28, -1, 35, 114, 26, -171, -143, -54, 96, 6, 5, -87, 142, -4, 10, -62, 18, -37, 75, -24, 238, 2, -31, 90, -60, -107, -44, 80, 143, 24, 88, 21, 15, -76, -74, -121, -6, -126, 31, 102, 109, 76, -39, -56, 98, -70, -29, 61, -56, -10, -29, 63, 112, 58, 33, + -29, -13, 20, -11, 75, 13, -37, -22, -17, -5, 10, 9, 1, -12, 35, 22, 2, 13, -27, -18, -22, -26, -9, -29, -28, -6, 36, 165, 179, 94, 1, 146, -78, -124, 122, 126, 160, 235, 23, -150, 88, -143, -8, 48, 36, 262, 22, -211, -8, 38, 90, -15, -70, -232, -44, 197, 70, 130, 154, 126, 37, -22, 137, -172, -3, -117, 317, -17, 11, 140, -115, -18, 51, -17, 190, -29, 59, 180, -33, 57, 17, -8, 0, -23, -50, 78, 107, -25, 106, 38, 208, 235, -10, 63, 41, -118, + 119, -29, -97, 42, 117, 33, -28, 208, -27, 57, 65, 31, -103, -6, -19, 17, -53, -11, 9, 23, 25, 39, -11, 19, -50, -35, -62, 50, 19, -9, 22, -8, -50, 34, 7, 25, -14, -18, 12, 63, -62, 36, 263, 255, -99, -148, -127, -90, 67, -282, -26, 37, -133, -250, 243, -54, -59, 37, 113, 97, -121, -51, -3, -15, 60, 83, -45, 103, -76, 158, -17, 5, -80, 83, 33, -26, -80, 37, -44, -73, -58, 12, 55, -153, 15, -287, -163, 101, -41, 32, 66, 186, -58, -97, -4, 4, + 81, 74, -86, -40, 210, 6, 34, 16, 95, -175, 8, 86, 164, 32, 72, 244, -58, -25, -131, 0, 43, 84, 2, -55, 77, -8, 138, -1, -3, 15, -170, -91, -100, 94, -15, -30, 0, 11, -5, 49, -15, -31, -37, -21, -52, -37, 41, 1, -14, -29, 13, 9, 4, -26, 45, 17, 29, -9, -2, -33, -34, 21, -16, 28, 40, -2, -168, -257, 109, -82, 3, -131, 102, -297, -248, -280, -97, -57, -199, 103, 268, -196, 40, 320, -75, -84, -148, 29, -3, 143, 44, 104, 69, -100, -203, -93, + 119, -65, -125, 34, 49, 43, 24, 279, -132, 153, -74, 79, -82, 233, -173, 97, -16, -133, 125, -48, -47, 140, 71, -9, -62, 128, 60, -125, -155, 108, 168, 99, 2, -71, 7, 111, -49, 134, -33, -263, 6, -114, 378, 136, -218, -119, -45, -95, 96, 98, 70, -43, 81, 70, 22, -13, -114, 25, 36, -29, 24, 42, -17, -1, 22, -4, -35, -24, 1, 32, -32, 31, 30, -38, -55, -64, 0, 43, -20, 39, -31, 1, 25, -16, -62, 13, 98, -219, -271, 234, -50, -218, 18, -55, 226, 114, + -57, 44, -11, -32, -40, 264, 52, 16, -178, -80, -41, 94, 116, 355, 10, 14, -10, 26, -154, 9, 65, -190, -135, -123, -15, 260, -209, 38, 119, 53, -97, 110, -261, 216, -45, 2, 117, -130, -154, -238, 52, -76, 229, 82, 7, 46, 70, 181, -78, -37, 187, -36, -106, -1, 188, 192, 173, 96, -114, 113, 157, -182, 237, -142, -134, 217, 23, 311, -3, -171, 77, -75, 205, 100, 57, 16, 71, -33, 129, 47, 52, 41, 76, -3, -6, 62, -2, 46, -23, 74, 146, -82, -39, 28, 19, 12, + 37, -5, 12, 33, 72, 8, 135, 35, 16, -58, 16, 47, -60, 16, 27, -1, 17, -1, -482, -320, 87, 154, 332, -203, 179, 31, 188, -11, -86, -115, 117, 341, 30, -32, -326, -275, 3, -203, -117, 10, 42, -208, -60, 48, 122, 63, -132, -2, 155, 123, 27, -128, 24, -79, 38, 41, 72, -99, 123, 296, -29, -24, 59, -168, 79, 238, -236, -281, -144, 21, -361, 7, 11, 49, 4, -7, -171, -95, -111, -17, 247, 362, 11, 22, 178, -76, -30, 80, 409, 50, 147, 285, 53, -188, 78, 84, + -86, 86, 74, -21, -89, 40, 26, -21, -152, 65, 140, 50, 102, 55, 123, -29, -46, 111, 94, -31, -6, -36, 81, 86, -71, 85, 23, 9, 22, 45, 65, 6, 57, -41, -21, -2, -11, 21, -39, 4, -12, 15, -52, -47, 247, 158, -232, -8, 492, 438, 91, 265, 324, 84, -6, 216, -98, 5, -195, 161, -15, 10, 70, 87, 267, -224, -208, 208, 40, 96, -163, 31, -58, 108, 0, 150, 144, -146, 122, 105, -172, 440, 75, 87, -341, -107, -29, 286, 263, -25, -293, 192, -255, -77, 220, -5, + -181, 219, 271, -68, 90, -108, -384, 4, 243, -111, -132, 163, -185, -276, 67, 190, 342, 182, -259, 110, -304, -355, 327, 157, 119, -220, -241, -34, 246, 85, 353, 159, 88, -375, 59, -103, 12, -86, 76, 26, 93, 161, 81, 16, 68, -61, -33, -62, -3, -58, -20, 26, 117, 23, -52, -19, 36, 8, -13, -119, 4, -59, 21, -84, -97, 66, 72, 121, -119, 4, 59, 510, 330, -224, -59, -10, 91, 70, -31, -202, 50, -139, 214, 5, 84, -72, -30, -211, -110, 438, 147, -271, 128, -264, -184, -412, + 179, 5, 7, 95, -10, -188, 310, 175, -67, -314, 313, -216, 83, -11, 103, 59, 199, 226, -53, 124, 363, 44, -113, -106, -64, 54, 243, -69, 99, 16, -221, 6, -54, 105, -333, -9, -556, -340, -310, -82, -306, 203, -76, -257, -68, -32, -205, -93, -7, 17, -123, -270, -267, 11, -58, 62, 150, -27, 75, 34, -1, -8, -145, -10, -3, -121, -9, 106, 212, -41, -101, 75, -131, 107, -109, -45, 21, -84, -98, -5, -61, 11, -23, -103, 49, -8, 123, 79, -87, 70, -49, 65, -40, 42, 43, 29, + 3, 45, -57, -36, -64, -134, 17, 42, -13, 23, -101, -351, -437, -207, -290, 754, -364, 171, -344, -99, 38, -56, -513, -10, -243, 19, 608, -194, 256, 334, 123, 136, 367, 109, -140, 104, 145, 155, 67, -75, 427, 17, -32, -70, 117, -36, -146, 144, -53, 104, -409, 18, -77, 373, -145, 121, 560, -48, 14, -135, -228, -12, -36, -235, 299, -63, 217, 24, 205, -117, -20, 447, 221, -346, -179, 95, 110, 54, 97, -100, 129, 164, 373, -475, 31, -203, 99, -8, 57, 176, 257, -169, 182, -123, -81, -68, + -61, 144, -321, -63, -147, 186, 153, 64, 80, -108, 127, 57, 92, -12, 74, -96, -51, -120, -7, -20, -105, -2, -8, -29, 1, 128, 82, -71, -113, 60, 47, 147, -111, 9, -38, 66, 78, -39, -59, -120, -248, -224, -240, 260, -504, -150, -315, 156, 525, -286, 17, 14, -101, 201, -167, 80, -51, -217, 468, 22, -151, 6, -67, -208, 164, -159, 154, -297, -136, 198, 148, -495, -87, -422, 127, -72, -403, 492, -137, -11, -373, -412, 25, -372, -47, -321, -272, 322, 37, -418, 138, -374, 334, 118, -159, 11, + 108, 347, -268, -384, 388, -272, -152, 201, 293, -543, -265, 306, 230, 117, -27, 36, -387, 131, 131, 212, -67, -413, -297, 143, -354, -313, 132, -23, 6, 127, 301, -2, -11, 277, 27, -48, 49, -41, -56, 57, -72, -55, -140, -138, -95, 22, -79, -2, 58, 43, -7, -5, 62, -74, -111, 31, -3, 104, -102, -33, -116, 132, 143, 28, -7, -92, -36, -128, 11, 17, -70, 18, 28, 27, -31, 256, -396, -649, -521, 234, -624, -32, 475, -44, 35, 338, -224, -194, 754, -300, 177, 285, -52, -684, -56, 70, + -171, -96, -158, 635, 7, 6, -30, -460, 85, -266, -132, 27, 78, 134, 371, 81, -94, 726, 78, -181, -665, -99, 489, -107, -305, -411, -360, -309, -193, 516, 202, 28, 288, 431, 242, -96, -75, 446, -88, -138, 131, 341, 49, -353, 81, -37, -525, -41, 418, -208, -241, -60, 562, -448, -89, -251, 257, 148, 119, 178, -73, -98, 191, 151, 105, -32, 24, 118, -330, -62, 44, -172, 5, 179, -18, 32, -71, -22, 99, 126, 192, 106, -32, 67, -109, -141, 40, -28, -113, 125, 67, 94, 20, 45, 98, 53, + -28, -71, -18, 39, 0, 39, 8, 49, 30, 84, 11, -83, 182, 148, -140, -49, -67, -48, 70, -85, 50, 530, 53, -473, -18, 142, -17, -216, 205, -160, 421, -325, 289, 632, -172, -169, -150, -132, 564, -419, -461, -352, 127, -184, -297, -137, 202, -285, 156, 36, 221, 328, 39, -43, -64, 323, -85, 113, -399, -5, -143, 315, -424, 345, -147, -219, 348, 604, -342, 170, -77, 121, -911, -723, -439, 61, -279, 118, 28, -340, -269, 27, 722, 168, -454, -678, -358, -252, 442, -311, -442, 102, 94, -410, -28, -10, + -204, -49, -13, -20, 196, 46, -236, -211, -117, -302, -166, 46, 334, 53, 60, -101, -279, -46, 224, -14, -131, 205, -318, -159, 44, 46, -8, 31, 19, -110, -224, -83, 165, -102, -82, -92, -200, -222, 78, -83, -51, -210, 48, 130, 160, -12, -101, -119, 114, 36, 103, 915, 592, -152, 56, 594, -236, 25, 250, 643, 371, -107, -145, -216, 54, -117, 7, 21, 669, 1116, -68, 771, 482, 104, 118, -542, -545, -57, 141, -35, 131, -199, -408, -680, -61, -436, -375, -242, -388, -273, -17, 641, -22, -478, -42, 142, + 471, -144, -121, -284, 213, -861, -779, -370, -389, -411, -254, 281, -351, -480, -409, -721, 371, 204, -646, 336, 651, 1282, 704, -3, 233, -730, -301, 401, 334, -184, -498, 70, 104, 457, -58, -459, -81, 745, 473, 541, 427, 752, 703, 216, 192, -160, -295, -77, -25, -248, 0, -287, -217, 344, 152, -87, -293, -107, -34, 0, -326, 332, 6, -269, 166, -164, -140, -37, 104, 456, 223, 545, 4, -101, 64, 211, 140, -64, 287, 19, -89, 48, 238, -110, -97, 94, -17, 84, -938, -93, 1518, -114, 59, 375, -549, 307, + 1077, 988, -997, -963, 3, -1044, -391, -5, 124, 377, 575, 501, 895, 208, 355, 352, -147, -66, 101, 115, 267, -481, 1076, 457, 504, -96, 1092, 133, 660, 270, 209, -258, -162, 553, 218, 256, -581, -315, -484, -287, -351, -3, -704, -771, -41, -298, -1447, -1081, -973, 278, 1062, 1369, -752, 943, 1473, 250, 129, -94, 1015, 77, 919, 393, 433, -610, -2011, -1597, -356, -54, 48, 71, 750, 705, 618, -382, 54, -199, -1034, 105, 88, 523, 86, 769, 700, 172, 609, -255, 414, -363, -403, -150, 167, 668, -145, -188, 104, -330, + -157, 338, -91, 234, -416, 574, 179, 6, -34, 441, -103, 31, 77, -9, 305, -216, -106, -3, 293, -429, 62, 153, -204, 32, 83, 53, -97, 722, -148, -1341, -103, 2102, 400, -408, 559, -187, 368, -181, -216, -708, -248, -87, -103, -345, 513, -463, -472, -45, 91, 432, 213, 111, 202, -192, 17, 650, -324, -799, -144, 59, -253, 540, -274, -196, 477, 120, 364, -825, -904, 295, -163, -322, -379, -495, -996, -7, -75, 327, -633, -1358, 1024, 268, 963, 96, -293, -295, 261, -517, 801, 148, 959, 650, 1417, -148, -1334, -1057, + -582, 766, 793, -601, 632, 1218, -710, -121, 1333, 196, 1027, -160, -505, -1382, -520, 145, 889, 754, -438, 374, 374, 715, 263, -732, -842, -347, 603, 1244, -19, -124, 665, 333, 72, -119, -262, -350, -261, 203, 144, 386, -154, -58, 50, 228, 322, -410, 19, 437, -39, -144, -487, 349, 11, -227, -141, 488, -12, -335, -161, 258, 20, -1115, 1156, 1568, 274, 71, 349, -239, 685, 383, 716, -144, -754, 1679, 11, -630, 79, 1136, 521, 224, -717, 79, -383, -280, 115, -533, 47, 146, 647, -914, -153, -108, 547, -205, -336, -320, + -1, 350, -709, 54, 191, -1454, 204, -392, -1024, 678, -756, -1328, 1762, -11, 106, -136, -485, 1064, -747, -67, 162, -481, -35, 1344, 697, -1179, -1275, 1266, -598, 739, 1216, -1084, -1867, -1292, 2166, -125, -1690, 1553, -1125, -2146, -29, 1857, -75, -2227, -27, -747, 25, 2754, -415, -2021, 299, 1081, 28, 1264, 79, 29, -393, 55, 294, 1021, -207, -271, 1013, -131, 246, 710, -115, -1023, 677, 490, 792, -239, -12, 284, -219, -752, -326, 317, 31, -144, 1004, -25, -1101, 264, 914, 530, -378, 55, -434, -241, 1108, 927, -231, -1051, -329, 439, + 363, 293, -189, -705, -26, -759, 1156, -239, 355, 726, 532, 548, 1360, 577, -327, 205, 339, 433, -485, 1294, 1236, 163, 431, -310, 5, -1338, 616, -710, 479, -62, -483, 713, -281, -546, 294, -767, 510, 14, -138, 202, 321, 464, 489, 452, 1385, -142, 157, 429, 936, -98, 254, -3, 734, 856, -274, 201, -31, -147, -1568, 121, 679, -382, -378, 344, -649, -982, 95, 550, 1172, -1500, 581, -81, -33, 3, 593, 1249, 31, -918, 312, 1013, -542, -808, 87, 443, -422, 802, -147, 616, 64, -620, 769, 608, 114, 479, -261, 298, + -137, 156, 259, 731, -145, -892, -104, 1028, 91, -133, 927, 189, 7, 218, 647, 943, -595, 231, 141, -47, 477, -137, -676, 225, 669, -282, 184, 222, -200, 254, -424, 311, 294, -382, -810, 351, 483, -218, -286, 437, -19, -267, -294, 311, 182, 718, -1355, -1055, -20, -1629, -560, -603, 1253, -37, -465, 577, -297, 319, 80, -622, 741, -1679, -161, 101, -422, 309, 73, -328, -62, 48, 420, 24, -495, -1630, -1191, -906, -453, 1009, -208, 37, -1635, 121, -117, -222, 48, -1579, 841, -767, 385, -315, 1070, -588, -1044, -502, -13, 777, + 1416, 1490, -1846, -1365, -945, 633, 1508, 1829, -324, -462, -1617, -600, 1430, 874, -23, -2, -40, -1364, 906, -276, 874, 2127, -2385, 2881, 809, -1565, 431, -3134, -3066, 2256, 958, 220, 668, -1162, -563, 2102, -86, 1412, -145, -1141, -378, 1247, -423, -31, 399, -104, -736, 403, -599, 270, 790, -833, 778, 260, -112, 294, -55, -190, 123, -292, 140, -593, 515, 541, 104, 14, -189, 275, 94, 108, 262, 520, -658, -224, -611, -464, 39, 19, 509, -677, -524, -653, -419, -178, 955, -1366, 1130, -680, 695, 361, 440, 252, -868, 946, -140, -344, + -310, -381, 293, -202, 416, 242, -53, -104, -726, 418, 174, -192, 163, 379, -108, 213, -369, 432, -162, 51, 178, 181, -194, 669, -26, -637, -41, 287, 145, -489, 236, 559, -106, -278, -267, -42, 156, -73, 662, -450, -170, -163, -333, -33, -101, 238, 176, -278, -41, 250, -268, -142, -80, 405, -253, 171, 275, -639, -255, 199, -662, 999, 269, 315, 464, -298, -7, -91, -455, 87, 151, 362, -72, -159, 224, -236, -95, 215, 3, -58, 186, 52, -118, -10, -130, 289, -277, 440, 20, 94, -185, -21, -67, -143, -72, 102, + 54, 124, -2, -109, -70, -348, 348, -280, 158, -69, 204, -117, -321, 18, 167, -267, 396, -317, 174, -123, 1570, 207, -535, -412, -312, -28, -53, 36, -45, -59, -891, 21, -179, -204, 110, -348, -161, 163, -246, 71, 273, -372, 233, -137, -200, -31, -200, 94, -186, -97, -219, -41, -6, -4, -133, -134, 38, 72, -158, 211, -262, -22, -106, -32, -51, -205, 279, 174, -285, 345, -37, 74, -158, 331, -332, 26, 26, 88, -57, -85, 244, -163, 34, 14, -52, 79, -110, -14, 135, -68, -65, 157, -63, -67, -147, 76, + 69, -320, 382, -216, 85, 27, 3, -124, 51, 159, -120, -59, 82, -118, -10, 97, -42, 39, 19, -87, 13, 12, 76, -142, 9, -16, -59, 60, -73, 34, -48, -124, 67, -108, -65, 40, -71, 25, 60, 7, -97, 100, -22, -62, 80, -772, -1245, 1391, 4698, 473, 1082, -2558, -3900, -986, -2035, 1585, 3277, 1720, 1095, -249, -1265, -1252, -934, -876, 316, 554, 328, 597, 85, 44, 242, 64, 274, 210, -155, -602, -437, -531, -706, -380, 406, 514, 966, 1354, 497, 192, -446, -1080, -1036, -731, -500, 99, 406, 572, 620, 514, + 355, 37, -36, -346, -231, -155, -166, -71, -188, -60, -224, -228, 88, -22, 303, 485, 296, 723, 653, -315, -633, -644, -947, -272, -224, -55, 591, 519, -87, 450, 572, 188, 401, -39, -452, -335, -780, -498, -181, -53, -53, 138, 376, 584, 746, 624, 214, -346, -556, -540, -593, -272, -147, -65, 137, 292, 239, 409, 231, 268, 251, -1, -199, -270, -329, -332, -288, -159, -157, 90, 173, 336, 497, 472, 186, 30, -266, -333, -384, -393, -110, -20, -71, 90, 307, 392, 199, 41, -17, 3, -76, -92, -145, -94, -110, -82, + -46, 0, 5, 87, 175, 180, 94, 42, -46, -72, -104, -79, -88, -44, -41, -2, 20, 72, 66, 79, 27, 19, -12, -17, -38, -14, -18, 3, -16, -21, -57, -3, 7, 34, 26, 55, 17, 13, -34, -13, 9, 31, -13, -28, -59, -21, -1, 34, 10, 14, -11, 13, 6, 29, 11, 19, -14, -1, -29, -18, -33, -6, -13, 15, 5, 36, 24, 29, -4, 4, -21, -4, -25, -13, -22, 8, -3, 18, 1, 15, -7, 14, -4, 13, -9, 4, -15, 4, -11, 9, -8, 9, -9 }, + {122, 198, 52, 175, 3, -180, -124, -131, -20, -90, 212, -158, -40, -72, -25, -127, 122, -75, -59, 103, 170, 193, 30, -14, 40, 10, 27, -87, -94, 46, -85, -85, -114, -120, 37, -79, 106, -132, -18, 59, 56, 49, -205, -37, -114, -20, -48, -125, -2, 150, 46, 73, 69, 81, 10, 102, 64, 113, -64, 76, -37, 52, 6, -104, 122, 138, -74, -93, 41, 127, 31, 34, -42, -8, 69, 43, 11, -25, 9, 58, 71, -8, -110, -67, -37, -47, 26, -10, -10, 53, -39, -13, 0, 9, -26, -7, + 4, -42, -5, 52, -7, 27, -37, 22, 11, -2, -24, -310, -81, -140, 103, -291, 64, -129, -67, 41, 6, 32, 44, 32, 126, -57, 14, -13, -153, 112, 189, -154, -144, 109, 29, 134, 43, 181, -25, 60, -96, -30, 186, 14, -120, -150, -161, 6, 134, 67, -1, 151, 121, 4, -124, 193, 50, 149, 153, -27, 97, 114, -14, 67, 79, -76, 16, -24, 75, -171, -109, 54, -105, -42, 147, -60, 81, -35, -229, 38, -1, 120, -189, -103, 86, 21, -18, 48, -89, 25, 23, -28, -56, 76, 71, 48, + 9, -30, 19, -23, -34, 24, 22, -47, 34, -27, -19, 40, -30, -62, -1, -24, -7, -30, -32, 12, -2, 18, 0, 17, -45, 12, -13, 194, 206, 90, 153, 118, 207, 234, -87, -26, 80, -235, -7, -78, -44, 107, -136, -17, 174, 31, 112, -56, -39, -59, -220, -37, 16, 116, -35, 200, 80, -35, 81, 41, 104, -75, -15, 234, -31, 221, 105, -98, 24, 194, 102, -129, 179, -49, 13, 9, -35, 34, 21, -161, 103, 74, -13, 5, -35, -146, 1, 81, -16, -18, -97, -214, -72, 79, 180, -273, + -144, 50, -118, 69, -5, -2, -163, -125, -72, -107, -52, 6, 19, -39, 63, 49, 11, 45, -49, -19, 2, -74, -15, 7, -92, 39, 23, -18, 4, 19, 46, 5, 7, 0, -44, -6, -13, 33, 24, 45, -31, -7, 288, 306, -61, -128, -140, 293, -254, 7, -42, -118, -161, 57, -44, -219, -267, 10, -20, -139, 50, 74, -98, -148, -138, 195, -210, -25, -246, 3, 137, 47, 23, -138, -133, 121, -93, -141, 18, -51, 86, 2, 35, -141, -52, -40, 135, 92, 94, -278, 44, 78, 64, 78, -79, -51, + 10, 56, 110, -19, 73, -81, 215, -390, 137, 11, -207, -9, 229, -69, -107, -209, -70, 16, -58, 0, 94, 120, 100, -30, -16, -123, -25, -32, -62, 17, -25, -25, 50, -62, -29, 60, -30, 38, -9, -25, -21, -17, -90, -57, 39, 44, -43, -35, -29, 33, -21, -13, -35, 23, 25, -43, 17, -6, -38, -10, -21, 24, -13, 36, 52, -25, -136, -431, 79, -197, 43, 36, -25, 306, 17, -196, 262, 126, 90, -39, 54, -79, 205, -34, 23, 309, 302, 129, 138, 133, 150, 100, -298, -93, -4, -78, + -253, -28, -60, -67, -136, -2, -40, 218, -70, 383, -2, 33, -71, -55, 3, -11, -30, -67, -45, -187, 46, 31, -22, -97, 131, 97, 114, -39, -82, 3, 99, 108, -86, -244, -125, 27, 204, -28, 167, -132, -192, 144, -67, -158, 92, 96, -177, -140, -195, -64, -67, 113, -61, 35, -12, 75, 47, 42, -36, -20, -101, -50, -27, -1, 45, -8, 4, 85, 33, -3, 1, 55, -35, 15, 16, -28, 33, -25, 22, 18, 25, -15, -63, 62, 8, -105, 155, -185, -209, 102, -62, -14, -111, -58, 102, 153, + 75, -30, 20, -14, -37, -138, 45, -378, -114, -117, 103, 136, 9, 70, -241, 70, 34, 70, -217, 411, -21, 80, 51, -187, 28, -270, 175, -54, -232, 51, 16, -110, 10, 30, 180, 333, 140, -61, 104, 140, -307, -107, -142, 90, 68, -45, 46, 111, 66, 142, 253, 11, -97, -21, -13, 206, -146, 6, 91, 276, -1, -175, -178, -10, -218, -24, 80, 337, 283, -28, -154, 128, 7, 41, 29, -6, 40, -6, -44, 42, 45, -41, 65, 67, 58, -12, -51, 44, 51, -3, 14, -36, 4, -4, 76, 34, + 46, 43, 10, 30, -3, 36, 67, 20, 26, 55, 65, -27, -19, 22, 18, 57, 77, -35, -397, -109, -147, 169, 6, -83, -510, -68, -69, 210, 505, -146, 339, 57, -299, -306, 53, 76, -174, 190, -138, 153, -191, 91, 65, -182, -153, -117, 59, 196, -258, 8, -272, -17, -104, 65, 197, 19, -86, -77, 213, -2, 325, 99, -124, -120, -95, 45, 204, -6, 338, -606, -447, -362, -85, -309, 19, -118, 108, 273, 48, 112, 175, 289, 148, 42, -202, -502, -528, 281, 18, 357, -257, -186, 156, -372, 6, -134, + -16, -241, 8, 77, 214, 37, 33, -71, 76, -18, 24, 58, 96, 123, -36, -55, 90, 44, -37, -69, 12, -13, -10, -31, 12, -2, -38, -15, 35, 65, 52, 44, 22, -156, -87, -61, -57, 80, -15, -28, -2, 21, 4, -5, 236, 108, -194, -2, 453, 390, -39, -331, -567, -61, -201, 205, -172, -163, -642, -271, -576, 214, -22, -136, 149, -17, 0, 44, -187, 19, -215, -35, 124, 98, -219, 80, 216, 360, -58, -47, -123, 23, 182, 266, -42, 42, -61, -43, 310, 231, 5, 238, 64, -286, 51, -26, + 370, 149, 43, 183, 238, 69, -217, -363, -88, 79, 192, 103, 8, 79, 286, 66, 90, 136, 74, -184, -215, -181, -212, -188, 318, 48, 244, -216, -197, -35, 204, -128, 106, 66, 29, -108, -75, -100, -74, -114, 42, 40, -37, 78, -55, 38, -25, 10, 30, -101, -69, -102, -72, -124, -41, -103, -55, -59, -85, -4, 86, 31, 33, -31, -14, -10, -27, 73, -39, -18, -27, 797, 178, -249, 146, -146, -471, -99, -462, -258, 244, 318, 127, 64, 30, 57, 307, -218, 433, -280, -281, 342, 156, -556, 245, 141, + 179, 365, 183, 272, -16, 147, -84, 232, 64, 50, 158, -312, -166, -95, 203, 88, 75, 160, 49, 57, -280, 4, 309, -54, 41, 40, 42, 367, 144, 493, 117, -69, 471, -401, -49, -62, -158, -35, 101, 465, 48, -97, -177, 97, -186, -79, -119, -252, -38, 70, 400, -31, -380, -104, -227, -114, 280, 225, 263, -205, 46, -228, -32, -76, -135, -76, -187, -109, -33, -79, -246, -97, -69, -49, -53, -86, 14, -40, -193, -8, -91, -55, -13, -1, 38, -5, 91, 88, 18, 17, -60, -54, -12, -65, 93, 55, + 88, 81, 37, 114, 77, 29, 55, -14, -43, 81, 117, -288, -444, -160, -437, 314, -373, -274, -220, 198, 500, -507, -180, -572, 164, 80, 54, -164, 45, 644, -337, -57, 244, 166, 127, 226, 151, -212, -358, -67, -198, -270, -331, 5, -77, 81, 425, 269, -239, -129, -27, -123, 104, 809, -275, 564, 176, 95, -37, -92, 95, -310, 148, 439, 18, 70, 351, 228, 136, -296, 247, -177, -265, -715, -225, 464, -264, 120, -503, 360, -190, -198, 314, -501, -371, 568, -405, -381, 227, -262, 52, 1, 162, -411, 129, 11, + 410, -305, 102, -43, -232, 304, 61, -253, -184, -174, 27, -1, -128, 3, 159, -13, 112, 126, 100, -228, 127, 116, 183, -5, 13, -166, -66, -82, -86, 38, -19, 106, -151, -95, 57, -146, -123, -155, 53, -324, -240, -33, 368, -174, 646, 601, 119, 192, -349, 43, -282, 451, -90, 133, -215, -139, 78, 61, -206, 346, -97, 74, 130, -226, 87, -289, 2, 165, 198, 5, 262, 329, -23, -616, -102, -182, 442, -372, -461, -329, -219, 65, -260, -205, -130, -37, 83, -902, 572, 445, 652, -206, 106, 436, -414, -385, + 79, 285, 189, -48, 90, -227, -269, -346, -99, 1202, 99, -664, -116, -363, 232, 181, -410, 90, -124, 36, -201, 258, 265, -37, -130, -156, -520, 159, 88, -19, 219, -102, 38, 86, -245, 97, 152, 345, 186, 24, -291, 5, 273, 18, 4, 204, 8, 72, 202, 171, -27, 95, 172, 158, -70, 71, 206, 250, 187, -2, -125, -26, 10, 158, 4, -41, 15, 60, -92, 61, 101, -91, 66, -227, -24, -162, -355, -652, 42, -543, 249, 101, -458, 263, 278, 415, 105, 171, -475, 2, -104, 442, 188, 30, 391, 460, + -66, -204, 39, 565, -373, -275, 273, 167, -379, -71, -352, 644, -553, 160, 324, -194, 297, 122, -167, -154, -179, -248, 342, 488, 82, -357, 25, -395, -168, 273, -64, -192, -161, 76, -552, 25, -70, -302, 407, -406, -42, -87, -321, 333, -40, 196, -170, -24, -33, -189, 137, -174, -48, -171, 472, 216, -592, -120, -967, 556, -17, -423, 370, 48, 42, 147, -8, 227, 254, 67, -85, 154, 274, -160, -118, 123, 26, 77, 70, 152, 182, -124, 87, 67, -172, -138, 109, 31, -32, -100, -111, -166, 152, 179, 13, -109, + -376, 12, 16, 122, -248, 30, 165, -95, 194, 100, -31, 63, 97, 15, 24, 68, 123, -119, -26, -68, 33, 574, 28, -448, -184, 255, 429, 447, 22, -113, 643, 271, 714, 80, 66, -348, -135, -209, 195, 96, 389, -446, 35, -268, 241, -387, 150, 414, -58, -20, -215, 52, -216, -764, 109, -124, 58, -346, -69, 288, 577, -67, -202, 325, 162, 73, 399, 129, -205, -108, 259, -43, 237, -284, -242, 78, -227, -452, -200, -513, -108, 163, -392, -65, -451, -207, 2, 172, -539, 230, 45, -331, 410, -152, 112, 710, + 818, 45, 291, 587, 716, 698, -65, -478, -716, -270, -473, 444, -92, -221, 120, -20, 54, -17, -209, 221, 70, 78, 21, 302, -169, -12, -91, 207, -195, -93, -17, 298, -75, 177, 257, -240, -45, -107, -258, -115, -56, 105, 13, 350, 102, 234, -19, -240, 69, 55, 2, 976, 1119, 59, 358, 343, -48, -806, -22, -33, -306, 227, 210, -439, 238, 307, 49, -117, 165, -112, 569, -98, -269, 3, 128, -54, -40, -11, -911, 262, -23, -629, -263, 108, -62, -429, 146, -506, -49, 49, -814, -146, 345, -261, 34, 510, + 310, 390, 118, -221, -382, 388, -205, 217, -364, -189, 254, 436, 60, 523, -355, 452, -388, -463, -334, 450, 468, -438, 221, -1207, -115, 353, 107, -190, -485, 220, -684, 108, -355, 321, -530, -336, 521, 11, 259, 58, 225, -120, 90, -61, -399, -72, -189, 121, -133, 69, 10, 64, 26, -88, -126, 15, -255, 87, 64, 142, -166, 141, 126, 86, 107, 82, -178, 17, 76, -128, 222, -22, -96, -132, -9, 19, 101, -84, 95, -82, 232, 105, -211, -54, -59, -97, -94, -213, -890, 70, 1090, -735, -75, -59, 53, -288, + 135, -462, -483, -153, -136, 121, -125, 254, -363, 17, 699, -572, -514, -119, 611, 91, -777, 333, -291, -325, 72, 1066, -602, -328, 750, 564, 44, -307, 16, -111, -245, 221, 192, -124, -617, 789, 363, 153, -838, -123, 254, 293, -108, 443, -75, 153, -196, -497, 322, -354, 210, 116, -444, 835, 123, 602, 595, 111, -907, -169, 4, -354, -187, 39, -34, 396, 732, -208, -77, -321, -150, 310, -211, 182, 543, -475, 540, -103, 159, -203, -116, -170, 19, 106, 115, -87, -2, 128, 66, 292, 130, -141, 8, 30, 258, -142, + 72, 125, 36, -7, 5, -339, 164, -123, 160, 218, 24, -32, 105, -9, 79, 31, -40, -124, -133, 257, 39, -58, 67, -157, -34, 262, 343, 46, -313, -1575, 105, -411, 55, 787, 76, -153, 145, 30, -533, -577, -519, -499, 650, -131, 776, 68, -731, -26, 82, 627, 124, -102, -124, 179, -393, -151, 694, -142, -900, -688, 412, -90, -186, 207, -64, -464, 141, 272, 625, -126, -518, 7, -653, 251, 741, -119, -908, 286, -10, 51, 220, -286, 560, 42, -377, 293, -204, -127, 799, -410, -137, -135, 504, 202, -883, 448, + -712, -170, -384, 92, -234, -216, -73, 406, -132, -250, 480, -280, 493, -3, -260, -157, 123, 135, 98, -297, -98, 73, -17, -194, 4, 183, 282, 117, 145, 23, 277, -157, 90, 219, -83, 27, 89, -55, 44, 86, -271, 229, 98, -273, -224, 16, -321, 28, -237, 306, -554, -1, -117, 58, -144, 173, -92, 80, 62, -114, 25, -766, 155, 1271, 824, 380, -632, 474, 594, 885, 424, 106, 29, 555, 952, -214, -119, 542, -1072, 390, 950, -196, -333, 249, 737, 597, -402, -682, -44, 345, -119, 84, 7, 802, -461, 514, + 771, -310, -97, 548, -86, 1919, -808, 346, 1309, -756, 244, 88, -1069, -33, 195, -469, 1037, 79, -147, 81, -437, 1428, 390, -1144, 1100, -462, 37, 339, 406, 733, 353, -198, -720, -963, -366, -386, -71, -296, 600, -368, -643, 71, 171, 129, 227, -362, -357, -214, -238, -759, -326, -259, -529, -253, 182, -224, -497, -24, 185, 329, -84, 154, 353, -22, -250, -16, -154, 199, 280, -403, 347, -209, -2, 52, -193, 371, 136, -523, 314, 48, -193, 384, -446, 175, -90, 187, -113, -123, 65, -73, -53, 135, -88, -300, 130, -29, + 82, -14, 241, -138, 308, -1470, 853, 45, 513, 863, -1422, 330, 722, 171, 537, -539, 592, 181, -561, 14, -356, -1031, 563, 329, 942, -518, -701, -237, 216, -139, -1182, -574, 355, -82, 170, -491, -160, 397, -338, -160, -508, -112, 177, -551, 53, -1209, -1005, 314, -1045, 96, -1093, -757, -531, 517, 1009, 1255, -302, 560, 672, 333, 288, -480, 1386, 1423, -969, 971, -764, 491, 993, 953, 1152, 1384, 973, -1094, -784, -4, 23, 419, -266, -207, -662, -360, -980, 219, 815, -327, 197, 860, 399, -582, 654, -36, 229, -60, -120, 194, + -210, 295, 242, -214, -267, 255, -183, 13, 5, -17, 69, 29, -355, 331, -152, 161, 185, -127, 200, -247, -187, 170, -204, -256, -117, 107, -104, 68, -237, 12, 84, 219, 322, -74, 180, -211, -2, -37, 96, 78, -21, -163, -234, -52, 48, 1827, -1337, -681, 721, -429, 689, -537, -598, 202, -1414, -64, 952, -230, 490, -811, -198, -320, 33, 1015, 308, 226, -180, 557, 180, 1386, 342, 810, 59, -632, -597, 807, -391, 374, -6, -1040, 752, -927, 1803, -1342, 821, 735, -769, -647, -477, 666, -49, 697, -7, 92, -1229, -661, + 289, -604, 203, -368, 364, 207, 948, -561, -191, -238, -461, 1284, 240, 122, -1192, -385, 645, 381, 412, 1112, 714, 984, 1137, -31, 505, -470, 1511, 115, -246, 551, -125, 1159, 25, -231, -235, 141, 817, -615, 424, -194, -63, 244, 166, 319, -195, 209, 384, -97, -140, 260, -38, -38, -25, 72, 46, 126, -272, 365, -209, -116, -54, 224, -308, 34, -219, 305, 553, -181, -147, -70, 381, 188, 398, -29, -224, 183, 194, -53, 192, 149, -529, 86, 617, -78, -286, -2764, 1923, -1194, -826, 15, 399, 490, 95, -446, 1498, 752, + 214, -752, 495, -30, 562, -718, -487, 377, 1121, -1284, 58, 410, 142, -320, -184, -166, 57, -70, 294, 1401, 96, -641, 951, -226, -909, -1185, 1129, 362, -151, 413, 265, 929, -1263, -140, -640, -189, 730, -541, 288, -623, 303, 1932, 152, -1116, -1241, -84, 598, 575, -495, 113, 948, -404, -1822, 1034, -626, -1047, 460, 1724, -1193, 864, 1212, 408, -1042, -882, -534, 427, 381, -371, 1087, 520, -65, -40, 69, -914, -342, -650, 333, 283, 218, 286, 225, 657, -331, -173, 131, -7, -512, 435, -17, 269, -126, 200, -329, -112, -198, 303, + 62, 54, 11, 179, 491, -204, -933, 66, -460, -100, 281, -406, -256, 520, -496, -121, 5, 244, -531, 27, 1583, 521, 105, -116, 251, 446, -142, 208, -240, -2, -190, 744, -835, -94, 499, -1159, 375, -283, 87, -136, -325, 207, -90, -472, 1270, -969, -273, 902, -578, -88, -183, 199, 892, 70, -871, 1193, -645, 426, 743, 332, -278, 66, -656, 161, -398, -312, 1597, -371, -638, 209, -298, 380, -249, 417, 1027, -565, 339, 786, -924, 424, 501, 231, 628, -716, -190, 1099, -759, -166, 313, -307, 1047, -1040, 176, 376, -482, 366, + 399, -991, 352, 846, -10, -254, -41, 544, -113, -931, 756, 359, -410, 155, -227, 336, -132, -416, 489, 27, -108, -362, 340, 65, -484, 173, 322, -67, -159, 71, 298, -44, -312, 318, 207, 39, -17, 265, 50, 93, -370, 469, -259, 500, -331, -893, -2411, -3790, 343, 3629, 296, 8216, 8480, 4222, 8878, 5921, -1231, -129, -1956, -7129, -6259, -3869, -7285, -5702, -1660, -3574, -2993, 1057, 1788, -869, 465, 1597, -1236, -724, 2250, 1999, 226, 2234, 3813, 1272, 2757, 5219, 2503, 1320, 4675, 3907, 516, 2804, 5478, 1080, 1284, 4424, 1901, -487, 3124, 2949, + -285, 2602, 3360, -66, -2479, -1161, -5811, -9591, -8533, -9097, -13888, -12477, -11678, -14199, -13798, -11323, -10213, -9191, -5331, -2064, 1772, 3799, 7294, 10888, 11888, 13246, 17290, 17063, 13418, 14681, 12975, 5352, 5834, 4952, -245, -850, 1409, -238, -2272, 251, 1463, -1490, -617, 1286, -746, -2882, -983, -814, -4155, -2960, -835, -3273, -3702, -307, -1350, -3747, -1832, -1730, -5250, -4982, -4523, -8102, -8756, -7314, -7799, -8411, -6049, -5173, -4501, -3284, -1808, -863, -299, 581, 2761, 3801, 5913, 9702, 10983, 12159, 14220, 13890, 12221, 10394, 7259, 3069, 699, -849, -2451, -2867, -2819, -2858, -2921, -2742, -2493, -2685, + -2746, -2615, -2796, -3059, -2925, -2820, -2749, -2423, -1851, -1393, -920, -280, 198, 415, 568, 602, 496, 438, 328, 76, -133, -321, -552, -623, -619, -683, -669, -561, -546, -488, -321, -319, -349, -201, -138, -204, -83, -43, -94, 130, 356, 430, 670, 925, 1043, 1211, 1399, 1431, 1415, 1477, 1470, 1388, 1304, 1182, 978, 784, 641, 450, 247, 60, -170, -442, -670, -891, -1067, -1224, -1317, -1322, -1277, -1154, -932, -725, -539, -371, -238, -186, -123, -73, -47, -31, 8, 23, 39, 50, 71, 71, 77, 72, 71, 53, 43, 24, 12 } + }, + { + {49, 197, -99, 55, -21, 12, 9, -79, -91, 59, -17, -72, -93, -57, 81, -8, 109, 23, -140, -143, -102, 42, 35, 75, -12, 85, -66, -12, -151, -23, -29, 31, 56, 57, 110, -55, -75, 60, 33, -72, -75, 4, 51, 25, 123, -47, -40, 140, 42, 262, 111, -74, -3, -161, 2, -184, -13, -69, 126, 13, 68, 93, 50, 89, 59, 13, -155, -17, -78, 106, 155, -109, -78, -47, -64, -82, -133, -30, 39, -78, -65, -28, -109, 13, -23, -73, 23, 4, -1, -36, 6, 7, 40, -11, 25, -14, + 18, -5, -25, 7, 31, 5, -29, -29, -4, 54, 12, -11, 8, -16, -18, -309, -330, -26, -95, 13, -72, -20, 184, -33, 99, -46, -88, -122, 23, -25, -146, 168, 51, 11, 90, 86, 139, 98, -9, -103, 96, 22, -139, -62, -63, -42, 124, -43, -212, -72, -24, 44, -66, -138, 5, -14, 160, 24, -1, 59, -4, 216, -37, 20, -48, -86, 0, 93, 42, 25, 88, -81, -134, -96, -19, 18, -31, 4, -101, -22, 53, -32, 105, 55, -6, 20, -99, -84, 163, 37, 69, 47, -29, -10, -124, 9, + -71, 30, -24, 32, 34, 96, -10, -33, 6, 21, 13, 3, 3, -29, -23, 12, -11, -25, 39, -20, 20, 30, -28, -8, 22, -8, 40, -24, 20, -19, -14, -50, 47, 213, -11, 109, 65, 146, 180, -41, 15, 110, 110, 73, 206, 41, -66, 9, 180, 63, 86, 156, 210, 138, -47, -143, 102, 69, -82, -139, 8, -81, 38, 53, -50, -69, 71, 55, 125, -82, -168, -84, -72, -112, -38, -128, 78, -175, 76, 15, 42, -78, 169, 129, -118, 148, 56, -21, 50, -106, -33, 102, 37, 43, 27, 121, + 50, 150, -72, -8, -9, 59, 87, -33, 59, -77, 41, 53, 48, 165, 7, 123, 138, 78, -123, -23, -18, -31, 13, 71, -27, 4, -4, 9, 27, -19, 31, 49, -32, -16, 47, 3, 2, -1, -24, 13, -11, 6, 37, 59, 5, -6, 31, 24, 11, 15, 13, 16, 0, -6, 28, 33, -26, 19, -8, 27, 33, 5, 8, 35, 2, 1, -4, 17, 596, 1, 528, 38, 336, -76, -53, 86, -243, 266, -150, 177, 138, -103, 83, -12, 14, -50, 79, 103, 137, 214, 57, 65, -4, 253, -291, 3, + -19, 67, 129, -160, 63, 66, 40, 99, 59, -124, 61, 226, -39, 66, -35, -40, -8, -169, 258, -8, 28, 186, -23, 10, 239, -351, 98, -11, 107, 276, 87, 64, 100, -35, -76, -57, 71, 21, 153, -59, 126, 54, -40, 21, -97, -68, 15, -33, -134, -91, -138, 79, 126, -37, 40, -33, -91, -8, 53, 47, -165, -11, 17, -30, 11, -38, 5, -41, -79, -6, -52, -47, -65, -1, -64, -24, -62, -52, -1, -27, -32, -8, 10, 26, -33, -3, 12, -238, -289, -117, -42, -110, 234, 98, -184, 205, + -27, -152, 47, 89, -82, -139, -123, -263, -131, 112, -164, -267, 77, 106, 23, -99, 201, 23, 186, -13, -41, 104, 176, -250, -117, 67, -54, 60, -161, -13, 45, 58, -137, -253, -69, 73, -41, -33, 17, 81, -23, 44, -83, 145, -191, -145, -49, -142, -41, -39, 58, -104, 80, 158, -12, 37, 44, 76, 157, -60, -28, -30, -63, 161, -64, -282, -178, -119, 272, 4, 157, 71, 25, 42, -17, -6, 132, -44, -28, 42, -21, 21, -57, -36, 32, -8, 35, -9, 21, 49, 37, 46, 2, 32, -5, 47, + 53, 83, 54, 66, 17, 44, 40, 28, 41, 55, -23, 5, -9, -23, 25, 33, -66, -257, -592, -57, 43, 5, -191, -87, -217, -58, -256, -297, -229, -55, -151, -335, -207, 67, 104, -94, 202, 109, -73, 245, 54, 18, 41, -340, -11, 54, 128, -108, -93, 199, 393, -295, 106, -89, -14, -261, -22, -5, -131, -170, -121, -145, -75, 82, 288, -137, 109, 192, 177, -62, 20, -66, -55, -268, -131, 147, -95, 30, -91, 73, 41, -32, -10, -127, -102, 20, -37, 51, -314, -335, -36, -52, -143, -4, 105, -166, + -126, -142, -242, 167, -18, -40, 65, -13, 59, 109, 39, 59, 35, 79, -25, 11, 13, 15, 27, -25, -21, 1, 25, 28, -21, 23, -30, -61, 30, 19, -23, 70, 33, 1, 28, -49, -49, -17, -27, -24, -66, -14, -52, -373, -68, -448, -95, -319, -33, 55, 84, 337, -209, 72, 96, -189, -80, 271, 33, -84, 39, -230, 209, -294, -92, 125, 85, -34, 54, -61, 99, -128, -214, 11, 109, 82, -170, 44, 200, -205, -251, 199, -170, 129, -121, 70, -1, -185, -232, -149, 68, -13, 92, -127, -116, -305, + 161, -220, -95, 113, 271, -39, -51, -398, -306, -107, -107, 144, -38, -235, -33, 8, -124, -36, -272, 180, 75, 227, 287, 145, 15, 119, 256, -25, -54, -21, -73, -255, 18, 14, 58, 130, -51, 26, 4, -103, -50, 88, 92, 79, -61, 21, 38, 28, 35, 33, 16, 66, 73, 43, -10, 28, -8, 24, 54, 14, 24, -3, -14, -20, 3, -48, -17, 45, 218, 116, 635, 309, 411, -126, -17, -6, -628, 34, 270, -123, -49, 23, 395, -66, 229, -45, 219, 122, 271, 383, 49, 256, -79, 222, -30, 409, + 217, -5, 232, 189, -69, 181, 107, 156, -122, -96, -330, -18, 234, 47, 30, -75, -123, -96, -109, 576, -369, 148, 174, 101, 50, -218, -293, -73, -44, -11, -508, -250, -261, 15, -12, 153, -16, 136, 180, 327, 60, -82, 110, -202, 56, -148, 55, 128, 71, 209, -140, -157, 745, 104, 136, 97, 253, -177, -92, 162, -18, -2, 30, 55, 146, -70, -11, 30, 84, 22, -77, 144, 6, -31, 3, -14, -76, -69, -33, -76, 0, -28, 35, 104, -9, -7, -111, -21, 55, -10, 7, 13, 88, -43, -13, 31, + 33, -95, -82, 979, 100, 150, 105, -56, -400, 271, 277, -154, 119, 131, -242, -29, 227, 137, -422, 110, -118, -210, -8, 126, 30, 0, -11, 184, -59, 105, -329, 134, -36, 132, 71, -56, 230, -314, -139, -310, 270, 132, 442, 223, -4, 98, -363, 0, 103, 118, 107, 27, 61, -93, 100, 322, 427, 188, -199, -106, -47, -83, 157, 219, -154, 131, 238, 76, -334, -653, -326, 133, 284, -122, 83, -23, -63, -1, 296, 56, -249, 405, 181, -468, 20, -55, -153, -52, -73, 0, 161, 69, -128, -67, 94, 175, + -80, 133, 33, -109, -30, 18, 3, -20, 8, -54, -41, 39, 9, -48, -53, 3, -35, -80, 48, -28, -43, 23, 82, -90, -143, -1, -22, -208, -37, 51, -1, -126, -16, -47, 39, 29, 64, 51, -21, -23, -40, -103, -606, 188, 275, -312, 199, 358, -860, 192, 28, 195, -326, 489, -680, 2, -56, -47, -77, -187, -262, -33, 233, 33, -1, -120, 162, -18, -91, 136, 289, -189, 207, -31, 122, 73, 194, 317, -79, 89, -407, -192, -90, -143, -372, 47, -140, -229, 343, -320, -116, -147, -184, 247, -278, 160, + -102, 254, -136, 277, -362, -93, 39, 334, -580, -208, 15, 8, -108, 236, -303, -575, 121, -504, 254, -176, -4, -528, -215, 584, 321, -427, -369, -301, 13, 182, -81, -188, 370, 140, -71, -75, -146, -23, 142, -132, 153, -13, -115, 26, -89, 64, 128, -74, 54, 103, 64, -7, 150, -143, 141, -37, 124, -167, -94, 30, 6, 183, 55, 112, -65, -97, 54, -192, -24, -37, 77, -36, -44, -60, -442, -189, 556, 24, -459, 432, -202, 29, -479, 74, 190, -422, -103, -377, -3, 24, -127, -105, 368, 57, -250, 63, + -535, 322, 509, -165, 213, 362, -27, -74, 45, 44, 212, 36, 49, 111, -299, -21, -343, -351, -144, 148, 209, -11, -413, 82, 109, 204, 442, -453, 664, -550, 25, -110, -95, -266, -510, -688, -267, -78, 176, -52, 29, 102, -5, 486, 230, -497, -77, -10, 318, -343, 23, -693, 130, 542, -483, -189, 69, -5, 136, 759, 12, -100, 40, 387, -262, 104, 142, -57, -27, -5, -9, 173, -55, -39, -148, 251, -53, 74, 26, 45, 63, 183, -126, -32, 194, -140, -196, 163, 9, 80, 111, 62, 201, -155, 94, 111, + -68, 283, 98, 173, 64, -170, -61, -29, -28, -30, 83, -282, -578, 691, 293, -336, 446, 449, 634, -233, -221, 466, -70, -90, 161, 208, 81, 101, -633, -65, 1, 8, 34, -69, 267, 522, 52, 38, -9, 27, 479, 130, -34, -102, 122, 109, -75, 58, -274, -54, 416, -411, -201, -354, 466, -424, 214, -172, 137, -90, 111, -340, 79, 520, -340, 30, -903, -37, -319, 28, -842, -34, -41, -257, -180, 691, -738, 127, -199, -272, 199, -246, -576, -401, 57, 34, 120, -282, -387, 225, 20, 47, 260, -427, 324, -310, + -146, -131, 78, 15, 93, -52, -109, 31, -61, 94, 202, 121, 75, 61, 56, 57, -20, 222, 43, -38, 164, 171, 64, -89, -8, -132, 219, 81, 177, -82, 181, 164, 237, 119, -65, -119, 199, 44, 173, 43, 48, 49, 53, 585, 196, -69, 118, -282, -312, -243, 555, -496, -633, 307, -589, 223, 15, 166, -268, -56, -324, -128, -252, 125, 282, 206, -478, 553, 59, 197, 42, 270, -64, 259, 54, -107, 154, 65, 206, 153, -365, 149, -113, 106, -81, -127, -119, -245, 225, 255, 253, -43, 469, 577, 220, 80, + 250, 597, 283, 651, 406, 486, -527, -516, 97, -101, -150, 45, -270, 221, 152, 106, 482, -112, -328, -263, -245, 61, -123, -1053, -470, -408, -160, -210, -122, -157, -311, 14, -191, -170, 59, -170, -66, -263, 4, 17, -54, -377, 145, 1, 7, -283, 75, 104, 99, 33, 320, -212, -93, 69, 25, -23, 125, -150, -141, -26, 223, -23, 159, 196, -54, -244, -231, -26, 233, 19, -188, 25, -51, -120, -102, -38, 1, -184, -168, 159, 463, 326, -1036, -753, -243, -3, 333, -135, -31, -813, 110, -423, 300, -53, 400, -342, + -93, -407, 65, 343, -167, 104, -243, 23, -559, -148, -33, 45, 404, 539, 13, -485, -351, -154, 44, -125, 150, -559, -181, -73, -152, -312, -80, -142, 378, 560, 370, 141, 224, 237, -274, 933, 558, -730, -639, 686, -542, -307, 100, 78, -526, 508, 28, -1572, 417, 990, -689, 683, 906, -302, -99, 488, -574, -375, 185, -309, -360, 414, -695, -209, 84, 17, 35, -66, 248, -180, 104, 38, -188, 366, 182, -12, -238, 282, -182, 218, -193, 265, 23, 55, 264, -208, -238, 70, -220, -133, -15, 23, -148, -258, 118, -606, + -5, 279, -228, 164, -73, 82, -259, 6, 134, -119, 86, 544, -247, -228, 531, -387, -69, 450, -320, -204, 339, 208, 223, -55, -330, -265, 313, -249, -22, 93, -466, 305, 250, -189, -152, -365, 12, -225, 318, -512, 41, 198, -25, -243, -529, -118, -229, -50, -409, 563, -545, 98, -196, 143, -773, 802, 155, 82, -317, 185, 134, 37, 76, -140, -609, -103, -261, -390, -522, -187, -129, -519, -196, -21, 366, 170, -469, -410, 259, -105, -596, -255, 153, 498, 497, 503, 803, -149, -535, -513, -27, 354, 627, 284, 140, -629, + 363, 137, 612, 426, 281, 212, 7, 59, 363, -80, 32, 68, 110, 128, 122, 178, 436, 140, 39, 153, -3, 143, 47, 31, 274, -317, -222, -80, 128, -157, 114, -65, 343, 19, 64, -169, -209, 25, 203, -178, -13, 233, -178, -4, 115, -317, 404, 220, -62, 102, -6, 3, -86, 232, -60, 385, 989, -871, -40, -339, -482, -267, 445, -239, -287, 247, 576, 384, -458, 299, -480, 354, 4, -41, -240, -336, -295, 70, 49, -538, 333, 68, -65, -198, -248, 400, -548, -15, 565, 692, -627, -31, -137, -386, -528, 570, + 112, 365, -126, 53, -64, 364, -154, 28, -455, 638, 509, -760, -955, -191, -5, -301, 16, -222, 56, -469, 489, -605, -553, -193, 73, 430, -237, 619, 49, -212, -225, -155, -402, 379, 263, -96, 220, 191, -318, -296, -272, 480, 110, -335, 29, 139, 146, -502, 247, 207, 84, -1, -153, 72, -167, -447, 83, -56, -92, -49, 34, -133, -182, -6, -72, 228, -130, -60, 120, -58, -222, 180, -222, -67, -379, 199, 30, -51, 56, -164, 319, -20, 47, 372, 257, -102, -130, 179, 91, -127, 63, -116, -116, -22, 75, -69, + -25, -1372, 2026, -1396, -339, 349, 1100, 868, -312, -368, 71, 36, 573, 192, -729, 208, -148, -275, 85, 289, 8, -571, -478, 245, 224, 329, -176, 410, 111, 484, -40, -185, 381, -60, -383, 54, 470, -35, -512, 245, 620, -577, 233, -618, 250, -777, -487, 824, 794, 353, 1030, -211, 1228, 437, 480, 638, -1091, 914, 328, 361, 439, 88, -528, 73, 1037, 1154, -4, -1339, 661, 21, 287, -61, 41, -303, -988, 187, -156, 210, -176, 480, -552, -616, -414, 73, -173, -285, 331, 113, -422, -470, -352, -283, -40, -85, 246, -20, + -361, 279, 66, -104, 24, 131, -177, -103, 190, -336, -130, -233, 197, 227, -265, 71, -722, 5, 43, 31, -136, -145, -322, -255, 173, 100, 167, 249, -236, 14, 105, 60, -232, -3, 66, -13, -189, -32, -44, 1327, -45, -1585, -796, -935, -352, 5, 526, -1351, -298, 210, -624, -726, -655, -725, -112, 796, 414, -318, 388, 155, -361, 410, -457, -104, 197, 271, -912, 459, -447, 261, -176, -738, 209, 228, 118, 120, -301, -1046, 47, 215, 232, 10, 135, -435, -1, -38, 954, -147, -1557, -706, -165, -1298, 300, -397, -327, -626, + -276, -935, -911, -1124, -107, 1181, 167, -749, 349, 10, -79, -422, -587, 248, 491, 370, 206, -225, -953, -684, -960, 141, 110, -34, 347, -508, -610, -87, -224, -628, 140, 361, 52, 132, 606, -109, -123, -103, 41, -216, -119, 270, 414, 451, 305, -125, 21, 71, -187, 418, -170, 609, -213, 286, -290, -80, 619, 206, 85, -2, -242, 245, 54, -300, 137, -256, -331, 97, 100, -203, -198, 213, 12, 298, 64, 204, -110, 91, 84, 32, 883, -110, 709, 901, -762, -968, -1007, 260, 359, -1394, -797, 22, 44, 412, -1610, 166, + 377, 1113, -1289, 147, 216, -168, 716, -417, 1253, -76, 113, 370, 488, -480, -1007, 581, 715, 157, 904, 167, -112, -345, -761, 1173, -526, 1111, 444, -91, 333, -482, 607, 590, -416, 436, 229, -1182, 856, 862, -108, -607, 115, -38, 40, -220, 1617, -39, -936, -534, 185, -1362, -1771, 233, 2218, 481, -155, -1425, -358, -245, 1512, -1043, -661, -2499, -360, -465, -586, -477, 915, 967, -972, -388, 322, 126, -177, 391, -171, -317, -306, 336, 138, 103, -124, 329, -350, -129, 299, 128, -20, -23, -261, 117, -173, 636, -177, -360, -288, -562, + -188, 416, 480, 1303, 499, -158, -1002, -1394, -649, 11, 565, 449, -370, -561, -281, -235, 342, 586, 130, 24, -76, -222, -181, -171, -32, -80, -85, 70, -151, 51, 20, 37, -115, -24, -86, -79, -113, 66, -72, 121, -2223, 655, 1056, -1409, -135, 812, -350, -626, 566, -604, -344, 61, -470, 765, -259, -328, -136, 411, 1352, -197, -630, -684, 247, 664, 383, -602, -102, 753, 16, -545, 181, -484, 1251, -553, -1364, 485, -233, 664, -915, -882, 896, -58, -1170, -605, -1118, 1458, 692, 404, -1523, 285, 624, -1051, 60, -751, -583, 610, + -519, 698, -429, -911, -211, -214, -139, 333, 109, -564, 1797, -207, 797, 832, 497, -231, 189, -394, 1011, 263, -255, 135, 430, 716, -174, -1512, -103, 489, -151, 819, -341, 291, -122, 34, 333, 93, 203, 424, 245, 490, -113, 168, 254, 46, -489, 600, -243, 16, 92, -281, 153, 43, -77, 421, -183, 43, 592, 6, 331, -276, -185, 331, -73, -207, -308, 28, 44, 86, -102, 88, 186, -54, 127, 167, -82, 202, 37, -198, 135, 83, 41, -11, 1609, 323, 700, -65, 173, 248, -578, 251, 565, 0, -666, -365, -493, -210, + -667, -655, 86, -523, 764, 240, -172, -556, -259, -187, 413, -132, -631, -531, 137, 130, 368, 132, -136, 163, -550, -1694, 74, 2042, -56, -1495, -238, 969, 275, 153, -24, -653, -803, -488, 187, -56, -742, 269, -1496, -274, 1391, 403, 1789, -241, -702, -219, -155, 472, 107, -19, -972, -496, -464, -72, 1133, -158, -274, 366, 460, 68, -600, -945, -66, 375, -40, -472, -118, 257, -196, -181, -306, 562, 600, -306, -157, -282, 245, 348, -163, 46, -62, -55, -111, -455, 50, 251, -272, 62, -65, 15, -243, -88, -102, -165, -185, -195, + -54, 797, -398, -1, -157, 39, 444, -305, -42, -91, 140, -26, 127, -236, -712, -2361, -3648, 861, 3264, 1031, 7984, 7523, 3345, 7757, 3275, -1405, -24, -2331, -6381, -3482, -3341, -6538, -4761, -2733, -4119, -2768, 603, -239, -1318, 1563, 1460, -5, 1565, 4249, 1784, 802, 4067, 3640, 1223, 4336, 5304, -7, 3142, 5348, 2026, 2139, 5451, 3258, -430, 4256, 2987, -1158, 1671, 3386, -1514, -2683, -605, -5673, -9525, -9221, -10254, -16403, -14198, -11712, -15180, -13014, -8363, -9913, -7576, -2095, -675, 3212, 5975, 9850, 13195, 14394, 16788, 18234, 17033, 16134, 17116, 13023, 10325, 12250, 6682, 1071, + 1545, -2470, -9045, -7594, -5618, -8109, -8293, -5172, -5888, -7425, -5442, -4948, -6986, -6267, -4086, -5198, -5584, -1825, -1756, -3294, -344, 1259, -941, 181, 1249, -1776, -2299, -2182, -4785, -5284, -3699, -2778, -2025, 691, 3248, 4414, 6253, 8012, 8366, 8875, 9814, 9309, 8462, 8815, 7982, 5937, 4072, 1075, -1570, -4036, -5878, -6586, -6940, -6192, -4744, -4155, -3502, -2863, -2471, -2176, -1631, -1263, -1164, -1135, -791, -597, -477, -164, 250, 613, 1071, 1113, 1144, 1325, 1308, 1073, 1154, 961, 509, 39, -391, -849, -1023, -1221, -1312, -1222, -1134, -1100, -787, -615, -373, 13, 328, 482, 741, 896, + 1012, 1145, 1196, 1249, 1302, 1310, 1298, 1210, 1193, 1128, 1054, 952, 909, 744, 566, 345, 168, -62, -271, -466, -684, -959, -1143, -1339, -1442, -1533, -1571, -1572, -1505, -1440, -1303, -1184, -996, -780, -480, -250, 72, 307, 527, 717, 898, 946, 1018, 996, 918, 783, 682, 498, 351, 220, 143, 33, 6, -24, -20, -49, -25, -38, -17, -30, 1, -11 }, + {-16, 339, -167, 12, -99, -9, 145, 67, 92, -80, 113, -117, 127, 62, 153, 63, -27, -172, 185, 126, 48, 21, 18, -74, -82, 94, 60, 61, 93, -94, -6, 85, 103, -14, -74, -145, 2, 26, -86, 32, 24, -131, -69, -11, 67, 1, -62, 120, 24, -42, -88, -21, 12, -170, 79, 105, -58, 135, 112, -18, 93, 54, 181, 56, 35, -29, 69, -145, 20, 69, -71, 79, 97, 105, 67, 138, -29, -85, -43, -36, 19, -33, -106, 50, -50, -57, -64, 24, 1, -33, -25, 42, 4, -5, -11, -5, + 21, 28, -4, -2, -23, 7, -43, 4, 30, 39, -27, -30, 8, 25, -25, -322, -227, -31, -146, -123, 60, -183, -178, 52, -81, -71, 73, -57, -127, -13, -11, -35, -59, -33, -145, -8, -105, -74, -5, 130, -30, 187, -98, 113, 127, -143, 49, -36, 27, -101, 50, 67, 98, -50, -122, -41, -67, 39, 46, -146, -20, -100, -82, 28, -121, -192, -37, 190, 41, 67, 9, 44, 25, 70, 74, 213, 15, -94, -123, -26, -59, -15, -247, 52, -18, 79, -34, 22, -60, -28, 240, 49, 220, -75, -41, 17, + 62, 22, 74, -73, 81, -85, -54, 44, 31, -3, 3, 2, -19, 6, -33, -3, -12, -5, 14, 17, -19, -31, -20, 2, 1, 5, 10, -13, -15, -13, 3, -5, 17, 263, 303, 233, 173, 245, 99, 106, -22, 70, 258, 28, 79, -96, -64, 198, -133, -242, 73, -202, 174, 41, 209, -67, -13, -52, 69, 84, -3, -206, -43, 176, -117, 79, 46, -40, -51, 196, 147, 342, 137, 28, 82, -29, 21, 108, 64, 291, -125, -83, 20, 75, -46, 135, -127, 26, -9, -97, 30, 29, -132, -178, -110, 141, + 68, 1, -12, 106, 8, 35, 184, 91, -44, -29, 164, -142, 18, -128, -58, -166, 45, -35, -99, -64, 96, 59, 17, 56, -92, -15, -8, 71, 2, 5, 13, 21, 52, 59, 46, 4, 24, 53, 3, -48, 44, -25, -10, 11, -9, 39, 35, 18, -1, -14, -15, 17, 22, 8, 34, -69, -45, 35, -3, -27, -4, 37, 3, -26, -33, 22, -32, 3, 570, -10, 279, -50, -44, 300, -293, -101, -23, 148, 103, -63, 57, 28, -266, 68, 142, 127, -298, -104, 34, -213, -59, 17, 10, 29, -33, 136, + -96, 109, 223, 224, -65, -128, -23, 252, -14, -13, 2, 25, -130, 23, 106, 16, 25, 102, -67, 69, 40, -27, 177, 18, 141, 28, -47, 62, 94, 81, -4, -138, -126, -166, -74, -5, 0, -19, 124, 107, -80, -163, 6, 85, 102, -99, -18, 97, -8, -13, 128, 60, 61, -47, -41, -7, 56, 83, 2, 63, 23, 6, 12, 21, 77, 58, 87, -43, 41, 6, 11, -12, 9, 13, 4, 12, -14, 42, 41, -37, 10, 23, 26, -12, 80, 31, -12, -151, -427, -109, -146, 29, 69, -71, -87, -801, + 14, 259, -190, -300, 222, -339, -54, -152, -181, -111, -115, 12, 134, -25, 73, -87, 100, -79, -124, 53, -48, -192, -248, 117, 9, 115, 33, 258, 34, 89, -127, -216, -65, -108, 213, -101, 3, 55, -110, 300, 197, 4, -243, -305, -106, 100, -277, -8, -136, -262, 21, -410, -93, -44, -155, 274, -20, -44, -7, 171, 217, 65, -223, -72, -59, 117, 53, 67, -126, -159, 121, 83, 28, 40, -11, 69, 17, 105, 27, 24, -12, -4, 14, 67, 95, 59, -27, 38, -125, 62, 70, -22, -13, 21, -30, -9, + -10, -39, -42, -23, -14, 22, 46, -9, -59, -2, -82, 26, 107, 45, 62, 44, 168, -457, -679, 84, -157, 152, -192, -335, 5, 310, 60, 191, 148, 119, 72, -107, 80, 207, -325, -149, -110, -71, 115, -25, 37, 214, 182, -74, -185, 44, -105, -76, -179, -121, -271, 66, -103, 0, 235, -46, 42, 65, -174, 145, 139, 200, -177, 315, -54, -227, -197, -249, 230, -86, -269, 83, -44, -186, 197, 270, -96, -222, 163, 55, 127, -18, 358, 214, -214, -103, -102, -80, 118, 167, 211, 1, 25, 84, -88, 80, + -26, 140, 194, -265, -122, -133, -87, -136, -13, -96, 42, -4, -11, -11, 33, -65, 164, -20, 69, 26, 32, -32, 4, 5, 7, -56, 9, -36, -61, -88, -28, -5, -17, 4, 8, -18, -14, -33, -33, 53, -2, 18, -38, -634, 2, -117, 44, -3, 241, 173, 249, -42, 339, -159, 232, 279, 54, 278, 63, 71, -76, -30, -115, 220, -11, -27, 315, 187, 6, 82, -24, -12, 206, -118, -198, -2, -25, 102, -565, 340, 372, 144, 75, 8, -177, -380, 253, -154, -169, -117, 228, -160, 142, 139, -131, -90, + -324, 149, -209, 125, 24, 112, 202, 316, 140, -148, -346, -63, 217, 349, 266, -54, -66, -226, -370, -41, 262, 114, 85, -84, 347, -13, 119, 32, -63, 32, -172, -86, -85, 58, -40, -126, -70, -87, -90, 37, -129, -56, 29, 22, 107, 5, 18, 17, -24, 84, -23, 95, 39, -28, -70, -4, 96, 65, -8, -90, -20, 79, 75, 10, -12, -11, -50, -41, 63, 239, 829, 449, -37, 78, 76, 182, 330, -46, 68, 553, 60, -24, 337, 233, -226, 138, 37, 223, 157, -383, 296, -177, -21, 33, 233, 42, + 66, 175, 204, -190, 209, 611, -103, 279, 290, -151, 228, 60, -142, -158, 113, -141, -375, -48, -13, 40, -481, -118, 154, -306, -202, -505, 172, 234, -342, -122, -162, 368, 14, -209, -142, -232, 122, 308, -213, 119, -88, 149, 352, 147, 278, 279, 351, 54, -189, -193, 144, 221, 37, 149, -150, 63, -14, -47, -158, 24, -67, 11, 138, 57, 61, 46, 152, -90, 10, -23, 49, -16, 10, 64, 22, -50, 84, -16, -107, 71, -75, -63, -78, -168, 97, -37, 83, -8, -11, 24, 131, 86, 118, 54, 4, 48, + 135, -51, 122, 854, 224, 39, -52, -119, 2, 163, -106, -192, -294, 26, 205, -254, 124, 174, -76, 577, 200, -139, -101, -39, 203, -81, -194, -206, 129, -455, 13, -126, -171, 151, 30, -165, -107, -158, 227, -72, -366, -41, 6, 30, -214, -293, 25, -52, -43, 104, -65, 281, 55, 169, -180, 408, 115, -199, 265, 515, -149, -123, 260, 245, 99, 150, -318, -82, -344, 103, 318, 147, -403, -79, 125, -394, -623, -52, 18, 179, 562, 47, -66, -174, -135, 90, 141, 122, -11, 65, 4, -123, 75, 99, -160, -150, + 169, -56, 99, 78, 49, -42, 35, -3, 58, 16, 88, 4, 78, 57, 16, -72, 164, 54, 150, -31, -52, 56, -103, -17, 71, -95, 23, 55, 33, 36, 80, -32, -149, -2, -16, -156, 22, -66, -19, 63, 51, 57, -661, 312, 874, -359, 613, -137, -134, -191, -320, 237, 7, 162, 157, -574, 5, 269, -236, -123, -365, 642, -402, 317, 296, -381, -160, -133, 267, -305, -127, 311, -57, -83, -154, 380, 64, -61, -159, 10, -291, 313, -40, 144, 777, 524, -452, -317, 120, -40, 323, -179, -266, -93, -492, -189, + -61, -375, -218, 834, 195, 3, -44, -9, 242, 294, -65, 290, 20, -159, 28, -445, -37, -412, -226, 248, 360, -546, 218, -140, -177, 265, -43, -252, -18, -99, -201, 101, 69, -138, -343, -164, -38, -27, 264, 79, 63, -146, -2, -60, 140, 160, -90, 68, 117, 132, 100, 150, -64, 10, -107, 8, -125, -65, 42, -34, -101, -24, 48, -162, -83, -88, -52, -62, -77, -10, 87, 6, -11, 103, -703, 123, 644, -167, -169, 143, -205, -161, 179, -21, -40, -5, -444, 749, -797, -74, -22, 275, 160, 12, -305, -214, + 91, 586, -51, -255, -180, -411, -32, -241, -197, -83, 126, -11, 15, -278, 52, 82, 175, 151, 176, -378, -2, -75, 246, 66, 503, 112, -121, 47, -280, 0, 218, 288, -439, -336, -36, 456, -715, 189, 817, 453, -223, 78, -445, 188, 402, -692, 152, -336, -99, -938, 1, -394, 363, 28, -440, 293, -31, -561, -78, -354, 229, -196, -298, 403, -81, 73, -137, -171, -51, 174, 125, -94, -27, 10, -102, 65, 94, 144, -146, 59, 73, -167, 8, 78, -125, 15, -82, 191, 98, 232, -111, -83, 74, -215, -26, -60, + -37, -8, 44, -119, 5, -13, 40, 45, 5, -120, -74, -190, -530, 838, 247, 439, -494, -557, -99, 147, -151, -75, 286, 77, 92, 248, -613, -68, 13, 157, -424, 56, 78, -299, -160, -412, -304, -2, 138, -333, 30, -151, -291, 115, 5, 237, -649, -683, 147, -59, 262, 573, 69, -360, 517, -255, -477, -371, -154, 41, -507, -197, 506, 682, 292, 191, 146, -79, 438, 246, -504, -276, 6, 51, 479, 306, 80, -73, -56, -233, 319, 248, 553, 126, 163, 67, 990, 113, 385, -408, 38, 376, -891, 74, 121, 253, + -90, 135, -114, -29, 156, -73, 477, -189, 280, -72, -165, -89, -179, 6, 77, 94, -35, -91, 201, -58, 135, -69, -73, -143, 152, 163, 38, 16, -118, -208, 101, -17, 9, 250, -67, 219, -31, 128, 89, 169, 40, -155, -27, 570, 33, 707, -30, -322, -361, -660, 115, -278, -25, 58, 231, 347, 578, 608, -101, 541, -48, -46, 197, 456, 191, 128, -732, -372, -597, 299, 583, 115, -263, 413, 585, -80, 85, -138, 491, 421, 350, -211, -383, -60, -105, -836, 138, 115, 67, -212, -118, -932, -337, -846, -156, -634, + -336, 611, 155, 644, 35, -527, -264, -549, -1055, 148, -655, -189, 611, 258, 236, 51, -124, -45, 115, -451, 355, -770, -800, -44, -74, -99, -589, -133, 765, -42, 43, -206, -672, 339, -453, -176, -451, -276, -213, -143, -165, -99, 7, 79, -422, -180, 77, 75, 231, 109, -142, -176, 150, -283, -46, 88, -220, 69, 63, 158, -151, -52, -82, -12, 102, -62, -12, -83, 164, 230, -78, -37, 60, 77, 143, 204, 35, -35, -51, -48, 331, 665, 580, 623, -359, -627, 482, -286, 499, 149, -799, 201, 150, -901, 485, -411, + -418, 245, 275, 43, 326, 24, 17, -211, -121, 198, -124, -309, 21, -581, 210, -738, -448, 27, 293, -101, -304, 114, 232, 172, 14, 594, -1365, -310, -373, -454, 593, -478, -65, -1102, -307, -131, 58, 735, -176, 93, -443, 373, -551, -358, 288, -1279, 187, 684, 889, 678, 431, 999, 553, -12, -246, -257, -385, -861, -92, 80, -1217, -482, -367, -275, 391, 1020, 1193, 789, -399, 326, -257, -56, 271, 183, -103, 64, 90, -24, 42, -188, 109, 334, -156, 44, -294, 72, -137, -20, -13, 258, 460, -165, 30, 111, 188, -278, + -428, 8, 336, 97, -272, 256, 137, -279, 197, 124, -105, -86, -28, -53, 52, 103, -96, 186, -1175, 4, 194, 825, -269, 383, 345, 185, 188, -1280, 1011, 554, 1253, 463, -55, -463, -296, -289, -454, 327, 238, -458, -525, 280, 376, 658, 183, -403, -607, 132, 103, 45, 73, 1166, 394, 226, 383, 424, 474, 15, -738, 523, 1622, -162, -452, -983, -212, 1312, 153, 545, 181, -1804, 373, 329, 38, 190, -126, 32, 369, -969, -404, 831, 307, 118, -733, 528, 195, -656, -716, -477, 657, 1370, 1271, 1405, 1421, 62, -631, -515, + -1240, -402, 394, -1002, -8, -815, 12, 1109, 431, 460, 549, 348, -335, -106, -413, 606, -361, -314, 110, -63, -214, -390, -113, 415, 387, -173, 597, -21, 17, -263, 90, 315, -75, -227, -225, 161, -123, 343, 214, 280, 399, -397, 106, 43, 185, -76, -170, 365, 88, 300, -154, 115, -235, -70, -363, 581, 1183, -2398, -846, 187, -1401, -1285, -556, -780, 89, -575, 1520, -162, -538, -218, -1163, -322, -938, -391, 165, -1211, -202, 938, -784, -226, 272, -5, 393, 82, 3, 350, 132, -602, -111, 536, -268, -749, -244, -909, -445, -1592, + 158, -1084, 526, 194, -395, -1404, 133, -150, 1733, 688, 35, 939, 410, 9, 767, -901, -425, 67, 679, -746, -450, 2508, -237, 1299, -1010, -2, -721, 545, -254, 851, 1338, 35, -945, 811, -1007, -458, 340, -1047, -699, -334, 761, 1451, -1726, 1455, 291, 425, 161, 204, 155, -215, 263, 754, -381, 132, -74, 98, -818, -147, -251, 247, 252, 805, -503, -291, -392, 559, -714, 172, 263, 242, 265, -1175, -281, 424, -203, -502, -67, 139, 29, 498, 251, 396, -397, -353, 400, 118, 268, -264, 270, 186, 50, 102, -113, -122, 3, -581, + -566, -904, 1870, -1073, 687, 616, -976, 536, 293, 213, -174, 742, 381, -938, 667, 779, 150, 134, 469, -9, -936, 1219, -695, 278, -517, -116, 153, -225, 991, 226, -131, -235, -52, 198, -1009, 324, -523, -349, -242, 2, -495, -231, 121, 1052, 12, -215, -667, 284, 185, 36, 814, -193, -84, 972, 305, 62, -932, -483, 603, 343, -873, 34, -1985, -978, 1782, -411, 965, 1269, 361, 222, 573, -237, -695, 382, 120, -38, 806, 530, -575, -1379, -284, 573, 183, -25, 452, -515, 781, -372, 294, 373, 162, 544, 408, 657, 77, -158, + 238, 638, -161, 561, 333, -343, 115, 305, 201, 134, 398, 344, 149, 673, -204, 91, -90, -26, -163, 601, 488, 406, -178, 93, 693, -159, 509, 475, 6, 812, -709, 125, 1087, 165, 312, -197, 767, 177, 294, 1063, -329, -1775, 301, -213, 611, 188, -602, 313, 366, -686, -754, -504, -1258, -1266, 872, -201, -1301, -398, 134, 432, 413, -796, -864, 86, 1204, -574, 465, -808, 289, -912, 596, 629, -446, -939, -645, -104, 370, -402, -264, -335, -1194, -1032, 543, -866, -176, 310, -714, -1156, 444, 608, -75, -1392, 625, 548, 1764, 9, + 465, 346, -749, 289, -231, -1521, -230, 932, 225, -769, -1906, 1207, 1546, -458, 1252, 1452, 80, 66, 1152, -743, 63, 1922, -1411, 824, -1207, -333, -92, 828, -274, 120, 472, -15, -1066, 1183, -206, -139, 191, 494, -798, 353, 218, -123, 257, 287, -737, -103, 187, 392, 830, -71, -703, 362, 853, -670, 833, -390, -71, -291, 939, -642, 236, 572, -380, 140, 121, -537, 137, 224, -80, -410, 285, 328, -164, 659, -977, 238, 318, 4, 87, 127, 696, -162, 393, -807, -2525, 677, -286, 1883, -645, -423, -754, -2174, 996, -1270, -733, 30, + 2, 1662, -1191, -846, 1104, 646, 577, -217, 552, -397, -548, -517, 1293, 1064, 1680, -543, -625, 20, -109, 606, -1008, 206, -1060, 557, 1043, 347, -856, 574, -755, 1692, 868, 230, 230, -274, -1335, 743, -1811, 367, 337, 873, 702, -1576, 472, -998, -585, 414, -156, 571, 373, -1443, 584, 1301, 1736, -517, 512, -723, 1218, -1746, -93, -329, 545, 1126, 1635, -1324, 324, -1767, 1124, 2295, -589, -1589, -130, -1202, 1513, 370, -778, -234, 84, -275, 1079, 392, -616, 567, -871, 41, 808, -186, -1004, 1091, -1599, 445, -246, 620, -46, 379, -374, -214, + 155, 123, 162, 738, -781, -668, 28, 156, -187, -825, -598, 1163, 310, -544, -615, -1367, 1605, 1244, -502, -452, -952, 16, 1196, 212, -518, -202, -279, 175, 118, 45, -158, -78, 216, -35, -134, -103, 140, 43, 289, -143, -2015, 1446, -210, -30, 446, 422, 536, 182, 250, -675, 639, 207, -738, 506, -308, 13, 624, 400, -1040, 595, -505, 870, -640, 238, -339, 418, -324, 205, -471, 997, -110, 51, 266, 350, -517, -79, 199, 349, 273, -318, 100, 38, -1012, -58, 233, 388, 135, 257, -913, 166, -75, 114, 181, -152, 170, 172, + 61, -191, -224, -45, 1006, -338, 182, 407, -239, 388, -437, 375, 159, -253, -440, 286, -280, 230, -398, -299, -172, 498, -146, 70, 70, -10, 88, -350, 259, -217, 598, -555, 246, -321, 284, -257, 222, 32, 395, -339, 170, -161, -5, 100, 221, -236, 34, -256, 372, -309, -121, 229, 54, -137, -77, 256, 122, -526, 279, 55, -27, -31, 82, -41, 29, -15, 41, 47, 113, -128, 364, -473, 130, -61, 77, -65, 113, -41, -91, -17, 42, -105, 1582, -114, -512, -781, -355, -438, 574, 332, -417, 35, 49, 188, 26, 398, + 137, 313, -107, -11, -94, 147, 339, -315, -2, -155, 11, 414, -234, 41, -106, 164, 84, -226, -84, 244, -74, 398, 283, -414, 133, 89, 218, 93, -391, 266, -73, 259, 207, -467, 129, 2, 106, -51, -205, 334, -81, 152, 9, -99, 155, -198, -27, 279, -190, -228, 464, -298, 433, -44, -349, 718, -657, 573, -202, -341, 363, -335, 101, 118, -329, 279, -58, -20, 178, -228, 301, -95, -22, 76, -50, 107, -49, 19, 89, -83, 141, -14, -78, 174, -265, 144, -117, -53, 168, 16, -49, 89, -62, 88, 45, -121, + 84, 19, -26, -19, 76, 19, 140, -106, 41, 20, -76, 156, -43, -21, -772, -1332, 1680, 4801, 762, 463, -3509, -4345, -1389, -857, 2940, 4477, 2308, 665, -1505, -3244, -2954, -2479, 198, 3708, 3106, 1777, 607, -1591, -2058, -1639, -1579, -561, 752, 1028, 2134, 1523, 372, -520, -302, -1719, -832, -870, -1173, 697, 1320, 760, 1921, 507, -454, -740, -1274, -1011, -156, -314, 394, 792, 709, 503, 346, -177, -699, -498, -581, 185, 681, 222, 169, -297, -608, -116, 0, -11, 495, 440, 496, 193, -169, -533, -767, -789, -510, 543, 808, 999, 694, -176, + -390, -418, -822, -366, 302, 156, 151, 238, 117, 90, -126, -167, 132, 284, -4, -27, -195, -273, -139, -167, -95, 210, -36, 441, 549, 315, -188, -313, -347, -443, -320, -438, 235, 599, 550, 323, 344, 128, -335, -660, -672, -344, -68, 211, 482, 703, 580, 107, -370, -622, -453, -153, 6, 168, 110, 264, 342, 99, -145, -202, -111, -85, -80, -25, 26, 157, 97, 9, 0, -11, -30, -74, -83, 27, 68, 49, -10, -3, -8, -24, -27, 14, 13, 22, 7, 11, -14, -18, -32, -20, 8, 39, 9, 16, 15, 4, + -20, 1, -21, -57, -38, 37, 44, 46, 23, 1, -30, -12, -19, -10, -18, 8, 1, 7, 3, 23, 11, 22, 2, -3, -21, -16, -32, -15, -7, 25, 21, 38, 18, 6, -30, -25, -28, -7, -8, 22, 16, 18, -2, 3, -11, 2, -9, 4, -8, 5, -5, 7, -6, 5, -4, 8, -4, 6, -6, 5, -7, 6 } + }, + { + {-87, 333, 39, 90, 32, 47, -80, -202, -38, 106, 39, -100, -13, 81, -20, -120, 37, -139, -85, -4, 39, -39, -31, 86, -119, -3, 16, 58, 47, 44, 147, 66, -181, -46, -82, 23, -4, -14, -114, -149, 198, -91, 49, 58, 50, -187, -106, -49, 21, -14, -5, -17, 32, 72, -97, 0, 53, 61, 74, 27, 2, 71, 26, -30, -8, 115, -84, -90, -48, -36, 99, 58, 24, -36, 95, -42, 50, -111, -10, 9, 24, 23, -89, 25, 65, 32, 12, -8, 85, 40, -7, 54, 33, 14, -11, 18, + 16, 12, -15, 21, 7, -16, -12, 30, 8, -2, 2, 2, 6, -26, 21, -7, 17, -20, -188, -115, 82, -187, -261, 50, 24, 31, 39, 36, -224, -38, 67, -144, 151, 145, 126, -52, 13, 33, 97, 21, -2, 18, -64, 59, -23, -25, -30, 184, -110, 63, -69, -61, -62, 48, 102, -110, -53, -60, 75, 68, 114, 75, 16, 97, -83, 58, 23, 24, 208, 47, 103, -171, -45, 68, -84, 79, -36, -64, 23, 123, 84, 56, -30, 24, 93, -114, 148, -22, 122, -51, 101, 118, 101, -58, -148, -221, + -148, 13, -77, 144, 25, 21, 39, -105, -32, -48, 53, -30, -19, 62, -78, -29, 31, -45, 4, -50, -38, -32, -8, 28, 9, 4, -53, 320, 228, 189, 155, 177, 73, -13, -5, -64, -21, 233, -102, -103, 158, 120, 152, -106, 45, -40, 33, 69, 94, 15, -72, -51, -92, -31, -57, -163, -22, 139, -109, -18, 49, -84, -78, 79, -44, -109, -61, 63, -96, -120, -57, -35, 39, -84, -176, 13, -31, -24, 49, -143, -72, 3, -62, 79, -22, 35, -259, -77, 144, -57, -143, 43, 23, 40, -55, -204, + -94, 230, 14, 85, 47, -33, 68, 96, 38, -47, -112, 0, 25, -83, 36, -108, -13, -69, -36, -91, -19, -52, -68, -51, 8, -23, 10, -25, 7, -46, 31, 18, -15, -9, 41, -1, -17, -41, -23, -19, -5, 4, -1, -47, 450, 279, 261, 6, 25, 23, -109, -237, -92, 183, -138, 84, 243, 22, -79, -29, -51, -24, 98, 142, 4, 43, 56, 93, 5, -127, 39, -205, -63, -24, -58, -36, 25, -48, -109, -83, -40, 11, -47, -124, 149, -54, 10, -37, -98, 124, 341, 84, -119, 203, 46, -61, + 61, -33, -132, 2, -55, 52, -114, -196, 7, 34, -239, 73, 49, 135, 76, 178, -60, -118, -70, -36, 86, -30, -154, 106, -75, -139, 95, -139, -77, 45, -51, 50, -33, -56, 46, 120, -27, -57, -21, 1, 42, 85, 24, -23, -31, -29, -10, 21, -60, -20, -18, 93, 47, 66, -11, 6, 50, 35, 24, -1, 9, -9, 26, -16, -12, -231, -370, -111, -186, 265, -62, -30, 97, -241, -173, 148, -120, -108, -8, -8, 24, 98, -43, 45, -66, -46, -7, -40, -109, -8, -25, 113, 110, 100, -134, 63, + 42, 186, -95, -5, -66, -140, 199, -189, -96, -73, 45, 168, -157, 174, -21, 94, 141, 25, 108, -204, 43, -76, 8, -217, 2, -74, -197, -149, 9, 145, 5, -104, 161, -55, 92, -12, -205, 284, -179, -34, -103, 72, 112, 77, 103, 230, 172, -28, 34, 109, 65, -81, 114, 92, -20, 52, -117, -157, -20, -50, 86, -92, -22, -88, -24, -40, -16, 27, 30, 19, -7, -22, 50, 28, -58, 40, -1, -136, -16, -49, 75, -20, -13, 29, -18, 28, 58, -4, 36, 43, -12, 16, 83, 14, 96, -257, + -374, 45, 28, 24, 236, -74, -264, 31, 27, -66, -18, -226, -48, 32, 31, 260, -48, 233, -59, -56, 16, -225, 94, -83, 136, -35, -62, -82, -44, 11, -174, 298, -207, -328, 96, 18, -236, -66, -450, 11, -162, 1, -176, -137, 21, 19, 74, -138, 110, -156, -312, 40, 82, -90, 98, -50, -175, -148, -212, -96, -26, 37, -66, 196, -3, -57, 13, 15, 37, 33, 19, -182, -177, 40, 119, 76, 17, -38, 149, 87, -75, -49, -175, -68, 72, 39, -97, 40, -30, -25, -48, -51, -23, -68, -58, 32, + 10, 45, 69, 9, 60, 6, -47, 64, 34, -10, 5, -32, -39, 2, -1, -36, -3, -9, -6, 2, -13, 42, -68, -8, -24, 6, 17, 43, -3, -574, -143, 22, -146, -108, -183, 46, 65, 130, -98, -123, -138, 68, 155, -78, -66, -40, -23, 72, -320, -80, 181, 58, -93, 33, 160, -17, -41, 55, -10, 391, -169, 95, 32, -167, 55, 36, -188, 132, -267, -27, 237, 51, -7, -51, -183, -159, 42, 100, -69, 48, 196, 96, -81, 119, -174, -411, -54, -181, 114, -117, 291, 144, -13, -49, -377, 117, + 144, -117, 230, -181, 70, -302, 139, 104, -342, -219, -70, 83, 113, 247, -35, -14, 162, 36, 1, -74, 37, 36, 48, 51, 13, -8, -31, -37, -92, -78, 61, 42, 31, 74, -31, 35, 39, -21, 65, -10, -1, -17, -74, -18, 85, 18, 63, -25, 23, -35, 101, 8, 85, 36, -42, 21, 141, 245, 557, 600, 117, 182, -1, 88, 3, 66, -162, 77, -102, 136, 123, 311, 45, -59, 190, 143, 230, 15, 142, 88, -73, 76, 343, 59, -151, -76, 253, 162, 121, 241, -184, 75, 281, -278, -338, 116, + 179, 298, -129, -215, 176, 69, -28, 115, -46, -22, -3, 423, -152, 89, -102, -60, -50, 223, -30, 491, 232, -229, 271, 64, 126, 64, 58, 71, -90, 169, -386, -96, 175, -387, 134, -311, 74, 355, 86, 3, 96, 39, -95, 29, -100, 17, 80, -230, 135, -37, -56, 22, 73, -56, -94, 38, 85, -39, -79, -72, -46, 39, -56, -44, 53, 81, 35, -32, 49, -28, -121, -48, -1, -55, 35, 32, 51, 90, 122, -50, 172, -52, -99, -26, 61, 21, -101, -58, -73, 929, 155, 151, -276, 404, -138, -11, + -111, 28, -265, -14, 116, 35, -217, 269, -69, -130, 32, 88, -277, -376, 153, -152, -231, 50, -7, -110, 193, -194, 60, 199, -40, 288, 83, -351, -379, -154, 19, 74, -301, 113, 102, 62, 89, 136, -312, -147, 84, -336, -129, -2, -360, -184, -127, 78, -187, -379, -188, -200, 441, 222, -42, 67, -125, 361, 420, 54, 280, 214, 77, 57, -170, -30, -151, 213, -278, 15, -71, -412, -132, -54, 221, -201, 108, 104, 37, 28, 93, -94, 73, -54, 81, -16, 123, 44, 5, -61, -31, -157, 82, -16, 133, -127, + -6, -7, 77, -8, 68, 38, 34, 46, 15, -83, 97, 138, -73, -88, -117, -39, -14, -33, 5, -23, -629, 425, 682, -512, -305, 140, 122, -104, 224, 60, -191, -234, -5, -76, -167, 85, -77, 10, 188, -255, 53, 33, -151, 21, -240, 46, 351, 178, -36, -114, -29, -202, -214, 104, 177, -57, -99, -71, 105, 176, 84, 323, -176, 132, -85, 31, 201, -74, -65, -388, -60, -301, 149, 101, 383, -331, -123, -321, -527, -90, 218, -365, 79, -42, -266, -314, -395, 526, 18, 312, 229, 264, -122, -354, -268, -331, + 113, 255, -248, 114, 273, -189, 29, 220, 254, 59, -94, 107, -48, 56, -276, -28, 102, -96, 32, 14, 9, 58, 100, -111, -42, 59, 89, 22, 41, 86, -23, 93, -85, 63, 94, 106, 9, -45, 82, -73, 17, -20, -63, -33, -63, -20, 23, -77, -204, 66, 104, -498, 361, -51, -179, 299, 113, -303, -420, -170, 6, 2, 25, -158, 488, 193, 150, 105, 156, -154, 41, 89, 75, 426, 49, -654, 83, 261, -237, -371, -73, -205, -113, 22, 460, 266, -43, -19, -135, -409, -133, -339, 239, 314, 7, -188, + -63, -83, 150, 197, 220, -513, 99, 8, 46, 341, -203, 134, -185, -144, 38, 220, 414, -75, -266, 76, -480, 374, 208, -58, -198, 93, -111, -248, -197, -226, -102, -56, 15, 192, -155, 548, 23, -96, 32, 156, 7, -18, 181, 113, 93, -5, -89, -80, -22, -25, -82, -239, 119, 102, -87, 19, -128, -107, -45, -37, -5, 187, -43, -76, -35, -25, 120, 210, -75, 112, -37, -153, 158, -165, -125, -94, -127, 12, 91, 34, 93, -13, -41, -24, -104, 45, -62, -130, 81, -60, -62, -59, -8, -48, -4, -42, + -34, -7, -16, -226, -40, 224, -411, -133, 286, -357, -23, -47, -33, -413, 411, 160, -265, -60, -107, -114, -597, -98, -266, -700, 159, 94, -300, -271, -356, -432, 370, 189, 389, 1, 802, 24, 425, 555, -54, 161, 597, -407, 193, -250, 415, -139, 796, 343, -232, -382, 73, 169, 339, 75, -271, -79, 272, 569, -231, 377, -130, 225, -444, 167, -236, 167, 42, 47, -71, 346, 515, -927, 289, 177, 148, -180, 132, -669, 68, -2, -90, -264, -205, -231, -51, 453, -257, -172, -367, -1, 348, -183, -176, 246, 3, 174, + 54, -61, 17, 69, -169, 77, 49, -171, -118, -91, 58, 90, 121, 302, -22, 225, 130, 63, -146, -65, -227, -124, -28, -96, -101, 117, 89, 143, 216, 22, -34, -42, -118, 62, -24, -16, 80, -107, 453, 486, -108, 505, -28, -103, 38, 285, -108, -126, -61, -356, 57, -100, 561, 373, -271, -282, -537, -194, 386, 702, -321, 218, 45, 94, 379, 275, -550, 111, -198, -109, -228, -122, -241, -526, 90, 355, 133, 829, -203, -112, 573, -208, -34, -126, 150, -629, -407, 221, 470, 690, 819, -602, -315, -30, 273, -25, + 930, 261, 137, -721, 48, 7, 348, 458, -342, -111, 141, -146, -2, 520, 185, -511, 132, 272, -248, 808, -281, -429, -607, 449, -99, -506, -405, -90, -21, -200, 10, -218, 41, -304, 20, 152, -107, 120, 22, -183, 19, -1, -37, 22, -127, 154, 0, -76, 173, 179, 7, -47, 77, -164, -70, -132, -26, 140, -109, 62, 135, -248, -90, -49, 41, -45, 107, 245, -69, -143, -71, 159, 44, 17, 126, -70, -52, -43, -70, -56, 110, 958, 451, -249, -83, -880, 67, 235, 60, 1317, -168, -98, -580, -498, 203, -407, + -251, -273, -186, 328, -216, -374, -326, 30, 328, -424, 93, 193, 40, 475, -57, 38, -485, -678, -282, 312, -377, 91, -317, -1185, -641, 356, 23, -679, 102, 946, -46, -25, -372, 207, -411, -731, 15, 111, -287, 140, 272, -68, -242, 197, 252, 474, -277, 356, 454, 192, 792, 89, -498, 579, 31, 96, -109, -118, 355, -356, -55, 881, 688, -429, 439, -129, 815, 344, -288, -655, -32, -241, -288, 183, -260, -9, -69, -230, -387, -77, 320, -351, -2, -218, 29, 135, -145, -410, -76, -195, 244, 148, -104, -272, -116, -293, + 171, -145, 91, 112, 162, 130, -230, -163, -258, 72, 158, 18, 320, 341, 182, 136, -93, 180, -26, -92, -696, -719, -880, 1209, -674, 167, -46, -372, 601, -707, 301, 1286, 777, 192, -1043, -49, -691, -337, -632, -50, 169, -102, 482, -226, 73, 252, 677, 105, 87, 839, -554, -67, 358, -150, -431, -271, 410, -354, 168, 721, -205, -1269, -86, 331, -1579, 959, 724, -585, 968, 672, 428, 1022, 15, 531, 53, 72, 358, -632, 635, 883, 664, -681, -142, 969, -471, 771, 690, 1639, 976, 68, 106, -199, 198, 295, -950, -1338, + -476, 129, 45, -182, 1051, 510, 193, -452, 413, -317, -423, -201, 473, 570, 102, -88, -113, 29, -660, -142, -174, 225, 117, -327, -264, -3, 511, -131, -203, 27, -210, -509, 257, -99, -209, -293, -2, 188, 30, -916, -57, 472, -73, 33, 73, 148, 386, 325, 10, 11, -153, -33, 76, 737, 902, -1774, -1633, 715, -472, -508, -218, -615, 216, -999, 1264, 482, -532, -6, -520, -383, -420, -471, -313, -1206, -1092, -197, -250, 75, 100, 216, -80, 160, 200, 545, 594, -219, -304, -347, -302, -679, 1018, -354, 246, 764, 714, -265, + -309, -564, -377, -462, 782, 90, 95, -963, -346, 1409, -138, 1312, -265, -482, -310, -546, -567, -97, 5, -771, 64, 379, -32, 300, -1798, -719, -504, 962, -228, 165, 326, 1506, 425, -130, -153, 1298, 779, 198, 252, -58, 1025, -419, -583, 324, 482, 863, 796, -458, 541, 412, 436, 138, -309, -606, -520, 334, 452, 249, 164, 541, -50, -138, -28, -35, 280, 176, 364, 641, 449, 732, 199, -640, 210, 183, 569, -1, 447, 199, 430, 20, -812, -95, -174, -44, -363, -207, -939, 1951, -630, -392, 1157, -734, -1107, 1026, -1490, -432, + 351, 255, -1039, -408, 892, 5, -176, -581, 700, -695, 46, 551, -184, 505, 3, -251, 169, 119, -302, 481, -266, -108, 143, -10, 29, -91, 142, 305, 493, 710, 347, -294, -83, -452, 415, -151, -653, 152, 1, -372, -892, 626, 46, -413, 1005, 57, -314, -182, 1489, -1396, -1504, 915, 1427, -2638, 10, -977, -889, -393, 957, -742, 1267, -180, -35, 1706, -485, -1321, 1637, 1932, -1880, 2097, -711, 52, 1730, -580, -668, 476, 461, -223, -93, 322, 59, 42, -418, 571, -2, -36, 5, 78, 252, 157, -214, -226, 233, 570, -499, -455, + -130, 598, -28, 321, -94, 135, -6, 139, -76, -101, -712, -292, 167, -250, -80, -246, -390, 600, 362, -1030, 403, 543, -116, 2, -376, 538, 1151, -532, -746, -191, 174, 1191, 871, -297, -104, 380, 950, -309, -64, 600, -765, -638, 507, -333, -267, -306, -38, -511, 32, 370, -229, 289, -256, -143, -164, -711, 99, -281, 435, 959, 44, 484, 383, 49, 171, 309, 996, -698, 477, 440, -523, 357, 327, 120, -465, -900, -932, 318, 323, -335, -1551, 1269, -431, -662, -398, 1277, -602, 1395, -8, 478, -1307, 1243, -571, 559, -174, -1763, + -568, 365, -1106, 1145, 114, -1615, -1841, -927, 1267, 331, -1146, 1404, -1500, -57, 2686, 420, 146, 285, 197, -690, 729, 72, 369, -457, 700, -373, -380, -294, -47, -1, 207, -52, -111, 158, -254, -491, 457, -151, -87, -585, 270, 155, 256, 93, 296, -203, 65, 860, -104, 31, 437, -453, -107, 48, -54, 350, -344, 390, -134, -922, 55, -222, 418, 326, 283, -320, 371, -593, -1120, -1, -1190, 322, -102, -219, 403, 654, -419, 89, 729, -574, 987, -137, -1078, 922, -443, -205, 830, -1065, 282, 12, 387, -173, -386, -1622, 373, -673, + -1620, 1955, -1318, -557, -260, -454, -995, 552, 1356, -845, 382, -1223, -686, -700, 614, 103, 1778, -313, -147, -538, -1531, -6, 746, -574, 626, 744, -634, 55, -541, -2272, -1187, -705, -2379, 1512, 2003, 934, -2017, -1630, -3619, 515, 4302, 1981, 760, -1140, -3970, -911, 918, 2704, 2720, -1858, -1565, -736, 354, 178, 2954, 40, -362, 231, -295, -732, 1037, 176, -226, 565, -474, -815, 568, 483, -1374, 912, -209, -313, -734, 764, -742, 876, -441, 897, -1076, 417, -305, 2, 769, 1254, 353, -483, -341, -92, 693, -125, 1000, -801, -627, 276, 990, 104, + 600, -805, -239, -268, 615, -54, 91, -188, -1714, 1246, -253, -260, 20, 567, 0, -96, 402, 152, 127, 667, -426, 6, 331, -108, -72, 425, -394, -83, 106, 661, -440, -295, 354, -6, 195, -634, 836, -191, 275, -174, 99, 472, 193, -97, 387, -140, 391, -305, -33, 424, -105, -161, -844, 95, 635, 78, 293, -412, -144, -242, -275, -98, 457, -160, 275, -357, -449, -178, 95, 864, -337, 399, 16, 95, -427, 238, 434, 34, -413, 322, -278, 219, -173, -108, -166, 68, 302, -146, -89, 154, -28, -225, -60, 243, 188, -194, + 26, 223, 0, -118, 25, -195, 145, -2, 70, -83, 31, 146, -76, 169, 21, 155, 101, -221, -245, -69, 405, -252, 279, 242, -176, -415, 315, -262, 357, -22, -69, -138, 53, 73, -31, -36, 23, 49, -172, 1623, 320, -868, -619, -958, -306, 186, 508, -158, -208, -176, -173, -160, 231, -117, -34, -50, -170, -39, 255, 38, -76, -255, 292, -380, 223, -135, -376, 3, 169, 193, 149, -220, 48, -70, -122, 452, -402, -72, -17, -27, 41, -66, -237, 200, -375, 357, -53, -249, 85, -128, 316, -184, -113, 343, -307, 108, + -148, -33, 262, -186, -75, 236, -162, 63, 24, -190, 464, -405, -35, 180, -104, 298, -135, -64, 77, 99, -32, 67, -27, -130, 118, 1, 11, 66, -9, 94, -94, 28, 18, 22, -12, -57, 76, -10, -20, -54, 67, 110, -37, -55, 34, 65, -81, 68, -61, -51, 175, -25, 64, 93, -121, 299, -98, -14, -15, -170, 177, -110, -178, 160, -768, -1153, 1511, 4717, 403, 411, -3216, -4066, -848, -861, 2395, 4078, 2092, 404, -1476, -2870, -2027, -1448, -76, 1987, 2902, 1570, 359, -1017, -1810, -1012, -975, -912, 576, 1184, 1165, 1175, + 282, -508, -209, -773, -1212, -133, -362, -243, 1093, 633, 913, 555, -415, -996, -240, -647, -100, 454, 138, 246, 494, -249, -351, -79, -206, 201, 319, 19, 394, 235, -414, -397, -634, -541, 24, 655, 991, 479, 125, -229, -664, -112, -749, -458, 352, 278, 838, 284, -213, 249, -435, -752, 133, 193, 253, 235, -47, -93, -72, -312, -240, 166, 256, 259, 261, -71, -252, -165, -97, 9, -5, -284, 73, 361, 194, 226, -66, -360, -210, -211, 84, 256, 168, 159, 68, -49, -274, -359, -165, 25, 224, 359, 219, 222, 139, -224, + -420, -537, -350, 154, 303, 396, 546, 169, -163, -272, -222, -162, -155, -156, -45, 125, 242, 215, 168, 120, 28, -148, -262, -251, -128, -2, 114, 155, 143, 76, 47, 19, -22, -95, -117, -95, -32, 41, 71, 59, 15, -15, 11, 10, 16, 7, -23, -45, -14, 24, 7, -37, -19, 11, 9, -5, 29, 64, 59, -25, -67, -51, -17, -3, 0, -6, 20, 43, 43, 7, -8, -8, -18, -33, -26, -17, 7, 17, 30, 24, 9, -6, -8, -19, -17, -15, 1, 12, 20, 8, 3, -8, -8, -12, 0, 7, + 12, 3, 3, -5, -5, -8, 0, 0, 4, 0, 3, -1, 2, -2, 1, -2 }, + {38, 105, 81, -27, 62, 30, 180, -31, -5, 23, 132, -26, -138, -64, -132, 32, -47, -11, -17, 32, 13, 27, 76, 141, -63, -34, 28, -66, -9, 110, -60, 136, 14, -49, 90, -123, -32, -86, 120, -4, -45, -33, 1, 112, 4, 135, 52, -111, 90, -48, -83, -67, 92, -19, 293, 31, 74, 53, -137, 2, -20, 36, -78, -52, 153, 125, 11, 52, -14, 78, -126, 13, 95, 60, 10, -10, 68, -107, -49, 114, -75, 24, 55, 68, 21, -85, -57, 45, 10, 45, -14, 13, -43, -2, -21, -12, + 24, 47, 20, -27, -11, -18, 11, 29, -17, 21, 16, 30, -4, 36, -15, 9, 22, 28, -224, -202, -126, -114, -99, 38, 141, 288, 55, 74, -1, -206, -86, -76, -185, 288, 76, 114, 79, -64, 29, 275, 110, -65, -6, -67, 5, -127, 76, -40, -57, 11, 146, 15, 51, 92, 126, -227, 3, 58, 132, 203, -113, -23, -55, 169, 91, 109, -18, 51, 339, -214, 43, 20, -144, 61, -200, -27, 51, -43, -302, 85, 20, -82, -84, -14, -46, 102, -96, -42, 29, -3, -94, -5, 76, -126, 11, -35, + -31, -39, -23, 19, -74, -56, 10, -44, -59, -60, -21, -40, 73, -65, -19, 10, 36, -5, 2, -23, 4, -39, 29, -26, -26, -8, -57, 305, 25, 110, -14, -80, 5, 215, 108, 139, 219, -96, 1, 215, 67, 95, 11, 28, 124, -113, -35, 160, -110, 63, 89, -67, 65, 215, -102, 80, 16, 9, 2, -43, -147, -44, -123, -12, 50, 103, 107, -18, -184, -16, 266, -98, 53, -47, -282, 165, 40, 123, -21, 140, 134, -238, 95, 8, 89, -17, -169, -7, -24, -30, -32, 107, -1, 21, 216, 43, + 172, 6, 16, 33, -95, -149, 101, -112, 67, 42, -6, 71, -76, -42, 47, 3, -144, 47, 17, 19, -29, 63, 6, -25, 69, -16, -6, -58, 20, -29, 10, 1, -9, 14, -22, 38, 8, -14, 11, -9, 4, -1, -23, -2, 498, 279, 427, 137, -175, 90, -78, 11, 42, -364, -96, -101, 95, 142, -58, -9, 49, 11, 261, -29, -271, 88, -156, 121, 139, 110, 162, -39, -54, 65, -47, -64, 48, -43, 98, 138, -58, -210, 69, -204, -130, -26, -423, 4, -70, 166, 161, 77, 262, 262, 118, 58, + -17, 13, 17, -119, 245, -32, 87, -77, -90, -33, -137, 123, -62, -51, 240, -198, -58, 51, -88, -27, -5, 84, 101, 67, 172, -55, -43, -24, -104, 57, 112, 150, 0, -22, -29, 3, 36, 32, -42, 51, 3, 37, 34, -5, -8, 65, -15, 34, 30, 31, 30, -17, 28, 110, -4, 7, 17, 82, 19, -16, -53, 44, 35, -17, 19, -184, -441, -151, -50, 67, -59, 137, -34, 218, -197, 117, -52, 397, 160, -82, -172, 95, -243, -124, 88, -81, -147, 276, 109, -12, -129, -166, 111, 92, 82, -4, + -46, -101, 156, -205, -93, -6, 145, 117, -14, 167, 17, -73, 30, -73, -83, -89, 112, -81, -6, 156, 225, 236, 93, 86, -18, 135, -56, 193, -36, 124, 91, -75, 7, -82, 90, 84, 30, -26, -162, 116, -176, -17, -190, 73, -16, -14, 34, -156, 6, 45, 257, 88, 42, 65, 100, 49, 51, -73, 57, 48, -108, -5, 4, 27, 44, -48, 33, -30, 6, -2, 65, 11, 7, 12, 21, -9, 59, -28, 22, 27, 57, 32, 79, -53, 29, -9, 91, 40, 32, -7, -13, 12, -18, -14, -61, -204, + -427, -345, 22, -295, -145, -418, -222, -255, 102, -136, -180, -62, 10, -108, -405, 109, -71, 41, -183, 183, 68, 4, -163, -73, 208, 141, 10, -31, -139, 87, 46, 90, -166, -15, -135, -121, -132, 14, 269, -219, 5, -209, 22, 97, 123, -220, 222, 269, -88, -64, -46, -10, 86, 109, 28, 74, -130, -25, -48, 232, -72, 257, -6, -78, 205, -21, -121, 44, 222, 256, -18, -79, -138, 89, -184, -18, 125, -94, 57, -6, 0, -76, 3, -58, -92, -9, 79, 42, 79, -34, -24, -62, 25, -50, 82, 42, + 115, 12, -25, -9, -19, -39, 53, -35, -19, 22, 19, -55, -18, 16, 3, -30, -53, -2, -49, -33, -20, 67, -3, 24, 21, 4, -38, -10, -3, -327, -331, -376, 109, -304, -131, 298, 141, -331, -25, 6, 144, 221, 370, -98, -137, -363, -453, -263, -93, 186, -185, 91, -262, 272, -197, 219, -103, 33, 53, -41, -195, 306, -265, -11, -143, 40, -166, 40, -660, 13, 303, -389, 86, 269, 93, -202, -26, 324, -399, 1, 159, 158, 150, -55, -60, -255, -130, 107, 172, 280, 337, -498, 187, -149, 34, -351, + -146, 292, 68, 41, -197, 2, 184, 138, 81, -173, -116, 183, -51, -76, -42, -127, 106, -20, -105, -38, -38, 27, -69, -69, 21, 26, 25, -39, -61, 51, -40, -132, -15, -39, 77, -61, 1, 7, 29, -83, -50, -30, 5, 89, -14, -21, 51, 1, 50, -25, -63, -22, -104, 23, -5, -70, 39, 393, 655, 364, 427, 65, 151, 574, -18, 17, 393, -192, 1, 113, 196, 324, -264, -376, 207, 115, -219, 47, 134, -84, 77, -203, -46, -237, 72, 258, 80, 226, 174, 184, -448, 23, 521, -62, -10, 485, + -64, -17, 72, -64, -15, 269, 422, -415, -68, 83, -128, 196, -66, 19, 30, -90, 371, -48, -136, 139, -141, -232, 80, 253, 95, -28, 51, 242, 126, 217, 65, 27, -3, -213, -45, -167, -39, -70, -380, -164, 24, 245, -101, 94, -66, -201, 89, 22, -64, 31, -123, 6, 30, 75, 106, -26, 68, -92, -137, -164, -18, 147, -27, -12, 49, 7, 16, 79, -39, -16, -44, 114, 2, -18, 13, -30, -62, -74, 30, 64, 80, 43, 31, -16, -6, 0, -27, -114, 36, 1105, 153, -24, -7, -531, -155, 51, + -124, 234, 103, 379, -48, 0, -82, -161, 254, 47, 97, 142, 199, -188, -189, -219, -152, -126, -55, -301, -59, 483, 227, -93, -34, -58, 39, 170, -85, 690, -121, -20, -315, 124, 300, -53, -232, -32, 115, 230, 99, 324, 485, 157, -12, 287, 234, 86, 181, -608, 139, 14, -538, 195, -14, -233, 149, -247, -240, 282, 222, -129, -477, -217, 112, -275, -58, 117, 464, -78, 92, -246, -514, -278, -248, -114, 242, 30, -172, -55, -109, -106, 154, 127, 48, 108, 129, -114, -84, -86, 15, -94, -137, -134, 54, -48, + -22, 15, 45, -115, 60, -28, -16, -53, -21, -74, 172, -112, -41, 27, -115, -112, -86, 2, 86, 69, -593, 376, -75, -371, -22, 350, -399, -76, -323, 216, 61, -110, -142, -42, 204, 168, 84, 226, 186, 26, 226, 273, 104, 154, -278, -127, -196, 174, 213, 85, 61, -123, -101, -73, -76, -225, 205, 55, 7, -241, -80, 399, -289, -295, -469, 168, -353, 509, 576, 407, 229, 28, 449, -235, 352, -41, -261, 25, 15, -542, -250, 211, 25, -87, 77, 465, 308, -522, -139, -2, -20, 158, 219, -5, -429, 176, + -252, -780, -234, -154, 238, 402, 128, 25, 14, 18, 30, 288, -5, 48, 31, 148, -256, -8, 71, 192, 219, 85, 128, 205, 257, 344, 124, 173, 160, 14, -21, -55, -47, 8, 64, -191, -54, 122, 180, -13, 47, -19, 73, 8, 114, -13, 109, -78, 141, 10, 133, -491, 48, 55, 307, 67, 784, 126, -324, -104, -273, 497, -637, -56, 439, -961, -380, -324, -336, -637, 60, -111, -274, -34, 301, 39, 40, -187, 74, -63, 74, 1, 47, 246, -60, -15, 500, -323, -65, 87, 431, -226, 615, -186, -249, -526, + -685, -199, -510, 249, -155, -382, 52, 62, 282, 239, 100, -48, 871, 482, -55, 86, 298, 223, 145, -117, -17, -156, -203, -187, 132, 680, -474, -116, -270, 490, -128, 152, -69, 230, -537, -402, -138, 229, 73, 198, -118, 122, 185, 162, 78, -32, -228, 145, 55, -194, -135, 122, -127, -97, -3, 132, -121, 159, -98, 226, -124, 26, 80, 41, -107, -206, 162, -62, -45, -16, -20, -65, 154, 190, 133, 116, -20, 67, 219, -117, 88, 38, -3, 48, -12, 12, -76, 101, 32, 96, -28, 42, -16, -79, 58, 15, + 68, 98, -15, -393, -375, 210, -167, -706, 350, -212, 280, -204, 352, 237, 293, 466, 77, 394, 160, 101, 269, 91, 75, 18, -10, -252, 225, -511, 224, 52, -145, -276, -7, 196, -227, -96, -340, -133, -419, 25, 231, -5, -54, -267, -462, -337, 362, 120, -150, -267, -65, -22, -452, 382, 349, -447, -433, -711, -108, -850, 229, 330, 174, -54, -108, -89, 349, 351, 407, -266, -210, 271, -117, -128, -498, 220, 407, 465, -109, 254, -143, 76, 255, 131, -179, 84, -307, -188, -127, 45, 130, 111, -122, -112, -45, -139, + -27, -191, -236, -125, -98, -73, -31, -70, -94, 20, -4, 136, -47, 174, -46, 139, 10, -80, 36, 353, 110, 179, -82, -144, 29, 128, -124, 255, 258, 72, 121, 52, -295, -157, -144, -21, -8, -129, 680, 782, -308, -19, 213, -636, -116, 786, 29, -861, 95, 261, -20, 296, 706, -292, 638, 342, 545, 149, -416, -447, 356, -406, -632, -187, -751, 162, -50, 263, 230, 160, 85, -35, 21, 377, 186, -741, -86, 242, 473, 259, 587, 524, 414, -201, -71, 104, 1068, -453, 78, 221, 418, -179, -595, -131, -151, -364, + -658, -724, 196, -409, -305, 179, 564, 689, 12, -47, -10, 527, -364, -193, 631, -698, 75, -553, -368, 32, 732, -128, -504, 645, -672, 18, -811, -81, -104, 229, 447, -343, -192, -246, 58, 6, -254, 132, -77, -82, -110, -98, -300, 55, -146, 94, 76, -34, -69, 168, -4, -10, -354, 40, -34, -25, 322, 19, 88, -150, 48, -93, -195, 69, -392, 114, -138, 275, -235, -47, 49, -49, -65, -137, 211, -160, 230, -101, -151, 148, 127, 380, -445, -957, -241, -326, -332, -189, 33, -321, -293, 104, 203, -197, 500, -45, + 331, -163, -33, 307, -436, -254, -157, 452, -120, -474, -196, 84, -248, 212, -339, -317, 462, 148, -390, 239, -59, -287, -43, -482, -437, 94, 724, 307, 216, -582, 441, -43, 335, -197, -426, 209, -774, 643, -1043, -643, 224, 575, 29, 687, -311, 187, -485, 645, 189, 482, 203, 120, -164, -150, -326, -100, -34, -540, -343, 56, -846, 55, 917, 286, 320, 98, -439, -311, -102, -94, -46, -157, -239, 193, 106, 176, 247, -259, 156, -94, -161, -101, 218, -72, -273, -381, -20, -227, -127, -233, -84, -150, -112, 371, -217, 90, + 95, -287, 316, 9, 182, 269, -141, 136, 40, -6, 63, 226, -147, -119, 184, 23, 80, -56, -78, 12, 153, -720, -687, 75, 272, -336, -1545, -313, -16, 209, -528, 53, -298, -53, -422, -455, 403, -442, -560, -85, -394, -417, 138, -609, -212, 380, 845, 696, -41, -412, 139, 628, -37, 420, -126, 527, 284, -526, 841, -639, -350, 579, -638, 198, -153, -466, 48, 726, -157, -414, 261, 360, -18, 154, -1041, 257, 35, 529, 244, -445, 442, -234, -47, -412, 215, 613, -133, -112, -628, -870, 491, -56, 394, -472, 357, 299, + -633, 44, 548, 325, -300, -494, 447, 82, -398, 378, 53, 173, 36, 161, 21, 421, -3, 150, -36, 25, 359, -111, 1, 91, -105, 75, 24, 261, -22, -275, -44, 43, -177, -43, 9, -105, 371, -82, -228, 31, 233, 121, -23, 145, 10, -151, -30, 407, 263, -263, -208, 65, -94, 582, 578, -1564, 588, 797, -205, 556, -9, 289, -130, -319, -211, 336, 75, -450, -297, -39, -215, -113, -52, 972, 192, 218, -603, 420, -430, 9, 72, -652, 303, -240, 31, -262, -477, 16, 311, 901, 320, 96, 552, 238, -70, 94, + 11, 160, 88, 612, 263, 187, 97, -75, -193, -597, -507, 73, -76, -367, 49, 453, -690, 666, 167, -241, -31, -175, -59, 405, 172, 134, -470, -92, -641, -194, 174, 236, 228, -273, -225, 497, -62, -798, 111, -12, -13, -470, 151, 357, -53, 512, 339, -168, -14, -218, 271, -21, 86, 45, -120, -94, -26, -97, 107, -216, -26, 16, 114, -110, -136, -154, 4, -35, 83, 53, -9, -95, 101, 83, 11, 119, 16, 86, 72, 113, -36, -399, -20, -111, 80, -184, -1393, 2159, -2134, -964, -488, -145, 1248, 368, 1397, 350, + -286, 1102, 476, -372, 516, 468, 261, 438, 424, -377, -610, -433, 71, -398, 211, 127, 274, -41, 189, 66, 687, 164, 65, 213, -159, -8, 243, -429, -611, -414, -355, 63, 183, -430, -69, -258, -1060, 537, -191, 273, -557, -187, -516, -706, 269, 190, 691, -27, 609, -255, 511, 63, 728, -512, 452, 543, 301, 316, 29, -218, 853, 572, -54, 1030, 248, 124, 442, 665, 11, 308, 385, 178, 170, -73, 37, -596, -150, -77, 99, 130, 122, 403, 180, 207, -153, -18, 160, 21, 17, -138, 168, 144, 83, -107, 212, -27, + 41, -157, -146, -55, 21, 24, -94, -325, 81, 77, -85, -11, -80, 30, -116, 87, -111, 11, 301, -78, -288, 196, 143, 122, -65, -33, 1322, 110, -790, -1171, -615, -491, 160, 961, -13, -413, 866, 66, -695, 623, 684, -130, -11, -72, -616, 681, 40, 384, -216, -556, -959, 169, 122, 142, -135, 295, -319, -11, -615, -774, 270, -105, 244, -118, -285, -703, -1079, 545, -603, 239, 518, -45, -279, -538, -383, 1233, 280, -66, 159, -173, -504, -174, 718, -706, -1174, -419, -375, -1651, -1286, -701, -717, 166, -11, -582, -1099, -444, + -522, -383, -304, -232, -660, -640, 491, -570, 30, 72, -692, -133, -507, -640, -159, -115, 285, 109, 385, -414, 96, 217, -9, -553, -312, -376, -43, 162, -191, -277, 460, 264, 328, -567, 85, -284, -39, 8, 46, -82, 548, 28, -107, 54, 186, 265, 222, -54, 320, -255, -137, -120, -442, -30, -143, -573, -476, 62, 12, -28, -154, -141, -54, -101, 894, -96, 851, 1288, -246, -1375, -1352, -279, 632, 98, -1063, 836, -191, -680, 837, -1584, -345, 17, -292, -236, 1923, -802, 1801, -82, 371, -126, -725, 1168, 299, 1214, -836, -807, + 254, -1307, -403, -204, -923, 1908, -174, -1966, -39, -873, 248, 492, 782, 648, -787, -482, -1220, -349, -569, 525, 336, -60, 350, -237, -867, -347, -1011, 1034, -783, -531, 917, 224, 1555, 762, 130, 829, -1111, -407, -1146, -1103, -177, -156, -1397, 1439, -258, -1108, -1662, 113, -333, 1219, -82, 68, 159, -213, 227, 278, 567, -377, -388, -242, 14, -66, -83, -356, 400, 253, 478, -109, -262, -218, -87, 94, 642, 687, -112, 41, 371, -100, -857, -412, 53, 121, -67, -542, 192, -61, -129, -622, 246, 215, 746, 125, 185, -34, 308, 57, + -175, -328, -24, 40, 244, 114, -140, 24, -2577, 1327, 314, -565, -415, 817, 459, -506, -131, -1223, -504, 510, -1046, 33, 193, -328, -697, -486, 948, 372, -186, -1365, 463, 846, 497, -1058, -697, -3, 1147, 94, -274, 172, 40, 576, -1521, -1327, 1634, 245, 685, -1560, 341, -78, 1140, -1029, -193, -1565, 546, 1113, 265, -700, 448, 1619, -727, -785, -607, 222, 70, 1419, -425, 100, -768, 243, -843, -37, 544, -1064, 1010, 297, -731, -1150, -691, -67, 1019, -1850, -400, 1656, 221, -761, -352, -540, 1570, -184, -1643, -201, 0, -415, 671, -125, + -230, 499, -45, -347, -430, -55, -380, 106, 280, 360, -330, -253, 342, -234, 324, -182, -330, 442, -248, 397, 561, 26, -813, -66, -484, 191, 300, 185, -568, -5, -429, 390, -121, -257, -164, 76, 137, -315, 139, 1700, 881, 389, 401, 406, -265, -273, -570, 69, 191, 147, -28, -986, 475, 189, -677, -583, -291, -343, 259, -257, -285, 80, -20, -525, 672, -483, -151, -502, -448, 321, -189, -69, 172, 208, -51, -667, 161, 1031, 224, -1627, -100, -356, -501, 338, 369, 836, 407, -1062, 1151, -288, -793, 2387, -479, -208, -786, -1905, + 873, 962, 321, 361, -1623, 468, -125, -398, -284, 61, -153, 250, 311, 63, -239, -469, 495, 615, 864, -431, -86, 179, -125, 447, -1114, 103, 199, -528, 88, -440, 172, 3, 138, -77, 32, 38, -22, -20, -148, -121, 299, -170, -11, 215, 49, 4, 365, -306, 223, 256, -16, -58, -309, 244, -577, -168, 376, 103, -158, -396, 118, -97, 468, 60, -977, -2312, -3932, 328, 3983, 392, 8476, 8583, 3103, 8613, 4979, -1440, -144, -768, -6527, -5394, -3802, -6756, -6472, -1833, -4075, -3533, 797, 1145, -883, 1271, 1842, 10, 125, 3691, 2450, 950, + 2716, 5101, 2392, 2818, 6291, 2505, 1129, 5458, 5246, 245, 3355, 5954, 10, 1523, 3520, -123, -2878, 1441, -601, -5522, -5165, -4729, -9222, -13616, -9490, -13247, -17672, -12453, -10107, -13646, -8726, -4182, -4047, -751, 4073, 8232, 9302, 12465, 16939, 16661, 15747, 17754, 17711, 14480, 11644, 12485, 8288, 2968, 3954, 990, -7267, -4655, -4938, -10127, -8566, -6141, -7210, -8328, -5191, -4517, -6309, -5187, -2700, -4311, -5700, -3407, -2413, -4502, -2546, 624, -1408, -1591, 1827, -35, -2286, -264, -1435, -5161, -3599, -2699, -4804, -2122, 1214, 2342, 4280, 7135, 8270, 8698, 9730, 10378, 10202, 9428, 8758, 7462, 5920, 3663, + 2736, 367, -2291, -4007, -6457, -9274, -9036, -7667, -6963, -6016, -4123, -3448, -3095, -2203, -1450, -1271, -521, -283, -202, 67, 591, 981, 1226, 1464, 1669, 1646, 1596, 1376, 1346, 976, 767, 396, 230, -170, -434, -583, -552, -732, -721, -716, -732, -833, -599, -614, -382, 12, 489, 709, 1148, 1345, 1486, 1582, 1801, 1696, 1635, 1575, 1399, 941, 819, 652, 420, 135, 130, -192, -372, -569, -747, -1076, -1158, -1385, -1547, -1694, -1672, -1805, -1766, -1678, -1457, -1276, -862, -555, -180, 66, 445, 612, 823, 911, 1024, 965, 1025, 915, 916, 765, 722, 553, 462, 270, + 225, 65, 58, -38, -9, -93, -43, -99, -35, -86, -15, -66, 0, -52, 16, -34 } + }, + { + {314, -14, -15, 99, -39, 113, -59, -147, 53, 146, 23, -24, 196, 6, 9, -68, -36, 303, 44, -207, -151, 213, -18, 221, 17, -43, -20, 167, 35, 351, 157, 96, -18, 77, 161, -40, -117, -150, -27, 134, 117, 179, 52, -101, -103, -44, 76, -25, 43, -21, -158, -124, 50, 116, 73, -59, -64, -5, 176, 88, -18, -40, 82, 54, 36, -90, 46, 83, -9, 127, 152, -264, 98, 53, 173, 51, 15, 78, -33, -123, -44, -74, -23, -16, 76, -4, -58, 0, 10, 44, -37, 7, -6, 15, 24, 16, + 31, 3, 20, -40, 89, 136, 297, -241, 55, -54, 4, -310, 32, 185, -274, -58, 184, 487, 71, -4, 35, -306, -9, 224, 200, 5, -6, 18, 105, 175, 186, 199, -89, 42, -12, 76, 22, 49, -309, -86, 49, 24, -171, -6, 117, -137, 108, 99, 184, 85, -70, 91, 205, -116, -185, 61, 43, 35, 98, -83, -149, -224, 181, -34, -42, -73, 79, -4, 117, 230, 47, 15, -12, -57, -180, 279, 69, -34, 145, -24, -166, -147, -32, 54, -242, 19, -143, -28, 74, -5, 39, -44, -79, -18, 40, 54, + 41, -9, -24, -2, 40, -22, -40, -31, 8, -16, -146, -125, -158, -223, 124, -2, -108, -42, -55, 49, -90, -153, 34, -99, 261, 349, 275, -190, -8, -12, 73, -105, 215, 136, -32, 105, 163, 14, 39, 58, 159, -15, 58, 192, 19, -1, -84, 138, -208, 84, -30, -42, 137, -133, -18, 5, -181, 76, -37, 84, -7, -77, 54, 58, -10, 161, -12, 185, -4, -122, -56, 8, -85, 165, 85, 142, 159, -70, -160, -103, -1, -29, -35, 131, 164, -24, -91, 58, 44, -63, -87, 30, -125, 31, -3, -3, + -34, -117, 25, -46, 4, 53, -1, -59, 29, -82, -3, 6, -20, 7, 15, -44, 0, 6, -54, 12, -17, -3, -29, 0, 14, 47, -462, -108, -144, -249, 85, 66, -30, 116, -16, 98, 138, -60, -161, -203, -78, -189, 15, 21, -83, 108, -93, 58, -42, -108, -287, -111, 26, 46, 75, -106, 76, 116, 38, 263, 65, -6, 203, -143, 117, 20, -68, -96, 131, 18, 41, -309, -57, -101, 311, 134, 112, 127, 143, 114, 158, -83, -34, 98, 156, -20, 182, -97, 40, -38, 154, 231, -359, 95, -89, 12, + -169, -86, 29, -51, -73, -143, -65, 69, -3, 155, -16, 60, 134, 213, -8, 57, -25, 100, 16, 49, -66, -22, 7, 46, -29, -47, 3, 4, -37, 7, 22, 2, 62, -26, -29, 8, 54, -21, 2, -18, 32, 51, -7, 49, 52, -11, -22, -8, 180, 110, 66, -35, 15, 19, 233, -185, 234, -32, 127, 239, -149, 185, -116, 94, 36, 280, 124, -157, -258, 58, -193, 158, -40, 206, -154, -26, -124, 71, 46, 58, -16, -23, -225, -100, 185, -148, -30, 119, 5, -116, 37, 9, -26, -101, 202, 63, + -288, -131, -233, -42, -206, -355, -81, 154, 436, 94, 36, 205, -6, -162, -141, 114, 44, 76, 125, -310, -77, -285, -63, 78, -113, -264, 26, 112, -57, -99, -47, 44, -40, -12, 57, -37, -40, -54, -39, -122, 42, -33, 55, -22, 32, 75, 10, -22, -8, -65, -43, -103, -93, 13, 10, -1, 35, 58, 41, -1, 37, 31, -29, 22, 23, -54, -23, 499, 122, 361, -168, -26, -118, -31, 389, -332, 113, 35, 508, 266, 338, 58, -81, 156, -108, -422, 82, 21, 52, 328, 34, -197, -15, 6, 107, 111, + -7, -46, 137, -161, -41, -83, -38, 38, 9, 288, 44, 226, 266, 70, 235, -20, 79, 138, -150, -231, 31, 226, -364, 106, -279, -266, -159, -76, -245, -243, -251, -133, -61, 167, 6, 201, 33, -171, 260, -271, -99, -114, -108, -145, -185, 264, 210, -120, 104, 81, 213, -2, 155, -78, 194, 94, -111, 4, -100, 119, -115, 10, 96, 4, 74, -24, 14, 47, -15, -54, 50, -17, 10, -102, -80, -82, -60, -13, -32, -71, -1, 11, -30, 5, 0, -42, 11, -272, -272, -161, -167, -90, -68, -326, -260, -222, + -33, -20, -40, 225, 24, 116, 174, 202, 33, 395, 497, -11, 144, 111, -59, 216, 118, -446, -14, -155, 27, 343, 138, -357, -94, 158, 158, 21, 457, -190, 185, 185, 204, 118, 238, -402, 148, -158, 239, 8, 104, -302, 222, 159, -38, 154, -25, 42, -2, -158, 42, -102, 99, -125, 155, 47, 387, 288, -90, 102, -318, 276, -86, 169, 300, 293, 15, 299, 208, 141, 153, 275, 28, 58, -225, -40, -64, 51, -162, 23, -118, 36, -118, 35, -43, -75, -69, 48, 6, -39, -28, -97, -31, 16, -28, -70, + 11, 70, -164, -103, -91, 65, -101, 61, 1, 34, -83, -125, -27, 23, 262, -234, -60, 207, -110, 356, -113, -253, 475, 643, 144, -256, 179, -135, 265, 153, -57, -271, -176, -460, 121, 194, -404, -49, 236, 60, -19, 8, -49, -220, 54, 271, 12, 57, 99, 384, -253, -8, 280, -257, 376, 18, 529, -440, -395, 217, 20, -54, 114, -37, 148, 89, 294, 279, -230, 41, -150, -92, 177, -23, -90, -40, 9, 262, -501, 382, -119, -172, 285, -230, 228, -309, -172, -58, -228, -80, -161, -257, -172, 55, -57, -62, + -3, -120, -37, -18, 160, -9, 24, 63, -66, -27, -55, 38, 79, 21, -31, 186, 2, 138, -149, -98, -88, -65, 73, 34, 7, 108, -79, 82, 34, 77, 45, 10, -94, -318, -245, -106, -230, -347, -75, 128, 426, 71, -259, -476, -101, 150, -85, 514, 160, -180, -364, -452, -860, -69, -96, 330, 242, -175, 21, -135, -76, 310, -9, 18, -39, 352, 58, -104, -19, -12, 93, -318, -102, -124, 503, 119, -532, 138, -277, -154, 77, -492, 152, 357, 314, 248, 59, 101, -17, 54, -313, 115, -489, -92, 278, 103, + 285, 284, 232, -158, -361, -313, -245, 80, 96, 168, 164, 37, 109, 353, 492, -117, 174, -121, -134, 152, -217, -75, 8, -136, 127, -118, -105, -56, 30, -30, 69, 2, 100, -23, -62, -27, -61, -155, 41, 85, -9, 56, -16, 76, 143, 139, 106, -109, -57, 107, -33, -41, 9, -17, 105, -23, -7, -15, 250, 446, 514, 373, 636, -297, 452, -387, -305, 336, 428, 507, -523, -2, 131, -386, 183, -169, -275, 314, -407, 442, -419, 414, -301, -110, -28, -546, -76, 604, -155, -430, 92, 281, -315, 157, 652, 352, + 132, 289, -345, 231, -207, -593, -180, -154, 44, 270, 333, -146, -261, 238, 2, 182, 113, -96, 32, -235, 36, 76, -3, 78, 536, -66, 53, 154, 32, 67, -273, -298, 207, -354, -483, -505, 394, 256, 76, -26, -59, 189, -30, -141, 181, 497, 335, -130, -84, 155, 89, -33, -78, 58, 70, -19, 20, 271, 65, 40, 106, -86, 20, 87, 180, -16, 13, -174, 57, -90, -66, 185, 148, 11, 116, -98, -48, 57, 1, -51, -101, -107, 70, 33, -47, 65, -413, -655, 233, 851, 417, -160, -658, -229, 42, 92, + -128, 323, 218, -240, -124, -33, -436, 605, -276, 215, -51, -143, -531, 173, 110, -67, 64, 237, -87, 591, -133, -91, 493, -56, -355, -318, -612, 83, -136, -191, -134, -450, -189, -421, 44, -371, 334, -210, -8, 103, 41, 192, -178, -455, 197, -53, 112, -102, -47, 13, 437, 654, 177, -206, 225, 237, 259, -108, -220, 333, 157, 446, 103, 119, 12, 134, 401, 548, 269, 92, 205, 86, -116, -376, -239, 42, 181, 28, -10, -141, -53, 77, 51, -298, -57, 67, -13, -148, -125, -166, 30, -30, 112, 210, 123, 7, + -71, 128, 154, 10, 51, -208, -9, -71, -214, 45, 38, -190, -21, -45, 71, -74, 178, 1, -43, 240, 1274, 28, -336, 1054, 539, 465, 923, 913, 266, 289, 234, 992, 55, -353, 433, 90, -385, -439, 386, 369, 718, -72, 55, 8, 101, -426, 481, 331, 150, -331, 509, -155, -24, -673, -144, -53, -40, -356, 235, -331, -186, -195, 98, -230, -307, -431, 455, -328, 484, 211, 398, 120, -400, -23, -645, -302, -351, 133, -447, -248, -80, 0, 468, 45, -71, -750, 298, 249, -16, -12, -376, 285, 33, -329, 885, 193, + -114, -16, -355, 53, 444, -123, -35, -497, -290, 172, -68, -240, 288, 169, -291, 254, -100, 76, -97, 248, 56, -47, 8, 55, -352, -3, -129, 97, 122, 165, -144, 118, 95, 68, 130, 145, -10, 110, -169, 290, -134, 244, -174, 104, -387, -710, 218, 214, -220, 462, -511, 555, -400, -233, 179, 128, 1432, 559, 214, -894, -24, -212, -474, -138, -173, -157, -53, -743, -14, -281, 9, 362, -394, 469, -154, -520, -463, 372, 285, -116, -256, 474, -256, -242, 373, -11, 115, -384, -13, -226, 478, -72, 686, -257, 103, 206, + -20, 26, 209, -443, -71, 563, 46, 154, -5, -457, 195, -319, 163, 492, 639, 697, 734, -159, 258, -6, 394, 889, -977, 759, -452, 204, 611, -386, 39, 191, 167, -46, 425, -165, -134, 179, -102, 409, -61, 155, -330, -54, -10, -266, -112, -336, 4, 96, 33, 372, -123, 25, 40, 158, 39, 159, -221, 166, 51, -10, 118, 162, -186, 169, -357, -316, 220, -106, -253, -37, 104, -163, 287, -344, -754, -147, 153, 10, 178, -561, -75, -116, -797, -619, 318, 331, 154, 228, -408, -201, -289, 872, 211, 23, 655, 375, + 330, 295, 258, -462, 333, 133, -140, 259, -231, -231, 458, -199, 289, 601, 23, 114, -8, 38, -129, -354, -444, -726, 300, -615, 233, 238, 312, 1, 22, -87, -470, -226, 243, -165, 251, 601, -182, 459, 214, 50, -23, -166, -434, -20, -588, -207, 637, -340, 104, -1047, 500, -195, 164, -808, -714, 66, 196, 368, -829, -90, 15, 566, 469, 524, -163, 10, 84, 273, 70, 150, 439, 245, -161, 156, 47, 30, -5, -94, -354, 124, -169, 52, 147, -6, 37, -6, 148, -90, 591, 158, -18, 325, 203, 26, 104, -12, + -256, 342, -107, 45, 416, 226, -122, 0, -157, 269, 194, 229, 204, 624, -1477, -363, -877, 296, -788, -264, -893, 239, -466, -357, -77, -758, -276, -813, -411, -941, 202, -870, -345, -452, -254, -239, -204, -831, -476, -632, -325, -183, 358, -52, 267, -517, -85, 30, -596, 115, -42, 50, 156, -603, -35, 222, -75, 251, 500, 907, -754, 46, 1008, 5, 495, -354, 624, 114, -150, -839, -494, 696, 429, 680, 24, -474, 173, 246, 486, -912, 6, 173, -504, -168, -218, -305, -731, 1130, -208, -363, -232, 234, 271, -639, -594, -24, + 189, 30, 1, -125, -216, -3, 569, 353, -4, -469, -325, 53, -181, 124, 150, 77, -50, -242, 99, 120, -67, 182, -106, -416, -198, -24, 121, -31, -134, -609, -244, -140, 46, 76, -264, -472, 185, 284, -251, 11, -221, 239, -77, -419, 628, -1060, -11, -210, 459, -233, -654, 571, -1147, -989, -816, 469, -243, 27, -445, -421, -492, 277, 240, 801, 377, 162, 745, -197, 271, -268, 234, 136, 444, 718, 376, -148, -438, -261, -89, 404, -132, 113, 16, -184, 382, -23, 314, 233, -610, 505, 927, 145, 776, 751, 341, 249, + 3, 397, -245, -899, -292, 670, 8, -330, 346, 951, -215, 74, -686, 678, 609, -43, 197, -309, 1560, -976, -847, -800, 70, 30, -234, 696, -973, -15, -621, 240, 279, -42, 680, 158, -55, -365, -2, 173, 496, -336, -432, 183, -256, -66, 64, 120, 44, 5, -29, -407, 43, 100, 285, -240, -133, 161, 79, 112, 14, -265, -26, -302, -227, 308, 159, 174, 124, -8, 64, -81, 189, 28, -79, -16, -263, -98, -173, 110, 1713, -385, 959, 1627, -549, 775, 356, -1041, 951, 133, -443, 685, 304, 643, 3, -561, 529, 169, + 11, 154, -150, -593, -340, -289, -496, -384, -88, 377, -339, -219, -489, 95, 50, 69, 689, -418, 172, -389, -206, 381, -305, -710, -891, 1024, 467, -267, 721, -667, -568, -360, -50, 94, 12, -622, -442, -488, -1043, -667, -559, 192, 360, -40, 617, 105, -621, -553, 830, -717, 106, 710, -88, -1252, 874, -469, 144, 45, 724, -183, -271, -47, -407, 205, -706, 231, -909, -595, 357, -398, -108, -61, -538, 167, -313, 249, -80, -20, 31, 327, -241, -205, 62, -353, -149, 42, -221, -250, -163, -112, -259, -156, 371, -310, 145, 212, + -52, 227, -315, 25, -221, 453, 89, 156, -322, 397, 282, 301, 134, 30, 102, 216, -221, 14, -183, -828, 498, -235, 840, 576, -1333, -168, 146, -814, -129, -133, 991, 712, 663, 822, -27, -576, -442, -458, 26, -1275, 157, 1092, -991, -1797, 187, -672, 1330, -9, 48, 889, -403, 183, -37, -242, 776, -223, 395, 1298, -951, -545, -867, 433, 76, 869, -494, 342, 50, 791, 470, -387, -254, 299, -140, -35, -556, -551, 293, -123, -159, -314, 720, -272, -285, 1202, 1288, 832, -1089, -97, -340, 424, 1603, -202, -1216, -80, -499, 718, + 324, -817, 434, 318, 423, -789, -281, 59, 701, 43, -110, 115, -237, 55, 701, 339, -288, -349, -77, 220, 282, 369, -346, -132, -636, -134, 407, -401, -60, -247, -227, -377, -76, 257, -55, -27, 67, 164, -167, -480, -496, 302, 234, 421, -207, 309, 906, 48, -538, -86, 52, -48, -335, -138, 103, 264, -53, -781, 114, -640, 590, 345, -633, 1078, 1624, 50, -79, -553, -566, 99, 91, -270, 1469, -128, 1095, 884, -1112, -31, -374, -1182, 297, 280, 646, 1115, -36, -313, 363, 407, 872, 371, 78, 724, 756, 265, -176, 665, + 293, 798, 168, 234, 495, 845, -141, -661, -771, -246, -269, 1326, 723, 2045, -96, -1022, 904, -305, -353, -302, -695, 108, 389, -9, -389, 1455, -290, 1716, -469, 926, 80, -282, -933, -1326, 1249, -114, -213, -376, 1161, 6, -1218, 2241, 703, 250, -256, -930, 470, 32, 474, -429, 338, 177, -210, -315, 59, -382, -181, -435, 53, -70, -4, 154, 367, -364, 145, -174, -9, 498, 329, -168, -611, -12, -34, 89, 563, -356, -212, 149, 354, -502, 37, 344, -5, -31, -530, 285, -14, 260, -554, 72, 239, 195, 279, -526, 453, -557, + 359, 1520, -906, -572, 116, 280, -178, 1078, 827, 849, 278, 422, 702, 444, -263, -417, -959, -148, 517, 185, 106, -349, -907, -257, -133, 924, 6, -104, 690, -105, 186, 154, -1557, 403, 413, -266, -669, 132, -881, -440, -1346, 410, -1125, -2212, 251, -25, 1555, -48, 524, 1295, -217, -329, 567, -6, -1131, -388, 142, 193, 824, 351, 733, 645, -466, -340, 309, 947, -398, -193, -871, -592, 224, -1163, 333, -1307, 244, -341, 926, -402, 654, -1401, -292, 197, -842, 216, 143, 149, -637, 336, -623, 181, -53, -259, -118, -58, 192, -211, + -104, -169, 397, -258, 230, -590, 308, -31, -52, 89, 571, 204, 241, -685, 85, -279, -854, 345, -276, -213, -318, 320, -157, 156, 175, -79, 34, -205, 56, 177, -44, 29, -26, -326, 1191, 1266, 2964, 347, -1656, -1247, -914, -1059, 2076, 2766, 941, -266, -868, 29, -1051, 1158, 1099, 324, 161, -688, -97, 1274, 300, 511, 435, 1337, 1129, -435, -992, -1317, -884, -133, 370, 1202, 725, -252, 655, -914, -308, -2055, -321, 2021, 1566, -315, 4100, 1284, 124, -2247, -379, -193, -523, 573, 322, 486, 863, -1833, -1970, -992, -1328, -191, 455, 1658, + -988, 606, 2589, 1292, 454, 724, 532, -1561, -2580, 1321, -635, 569, 1388, 1531, 140, -926, -1215, -995, 1074, 619, 191, 1068, -1060, -185, -166, -471, -546, -47, -11, 347, 112, -152, 8, -13, 23, 92, 203, 309, -304, -421, -1441, -791, -710, 854, 510, 306, -1179, -1159, -1863, -509, 739, 939, 1227, 480, 362, 143, 123, -34, 279, -65, 880, 620, 129, 8, 11, -150, 3, -105, -631, -2712, -647, 1513, 2895, 2551, 6115, 3201, 2171, 1911, 869, -342, -3090, -3878, -5786, -4430, -4546, -1729, 22, 1741, 3237, 2672, 2760, 1903, 2597, 2034, 2875, 1370, + 1072, 513, -740, -1137, -1743, -1053, -3786, -1599, -3584, -2585, -4102, -2437, -3818, -1355, -1893, -616, 292, 1938, 5081, 4840, 6779, 4590, 3130, 4066, 5551, 4887, 4103, 2864, 344, -2776, -2757, -3416, -6503, -7177, -7820, -7807, -8574, -7414, -6247, -5508, -3588, 413, 4079, 7099, 9382, 11698, 13014, 9075, 8652, 5617, 3401, 3216, -194, -1062, -4988, -9556, -10294, -8355, -6460, -3804, -3081, -3135, -1732, -2692, -1092, -299, 2065, 3927, 3223, 4197, 4508, 4812, 4247, 5673, 4213, 3454, 1782, 367, -961, -4395, -3896, -5217, -6921, -6267, -7188, -7384, -2157, 241, 3748, 4593, 4887, 5677, 5925, 5030, 4371, 3355, + 2539, 920, -661, -1957, -3535, -5186, -4863, -4337, -3250, -1528, -678, -320, -197, 478, 993, 1211, 1298, 1077, 856, 935, 755, 570, 1037, 1171, 895, 441, 228, 372, 478, 191, 94, 190, 26, -361, -1080, -1298, -861, -659, -758, -720, -443, -625, -714, -612, -252, 57, 310, 431, 579, 662, 611, 519, 590, 597, 519, 366, 254, 89, -33, -70, -117, -237, -147, -70, -124, -176, -116, -23, 102, 81, -14, -108, -91, -163, -302, -376, -352, -334, -290, -314, -273, -119, 9, 43, 232, 495, 591, 490, 445, 448, 385, 225, 116, 80, -1, -135, + -200, -235, -238, -233, -216, -173, -123, -111, -103, -87, -44, -25, -8, -2, 17, 15, 20, 11, 12, 1 }, + {395, 18, 67, 55, -160, -83, 219, 380, 62, 203, -82, 38, -10, 172, -135, -310, 126, 145, -180, 210, 104, 192, 61, 46, -83, -26, 11, 128, 12, -192, 9, -15, 42, -26, 35, 47, 115, 84, 28, 36, 12, 57, -58, -95, -212, 42, 48, 18, 164, -57, 128, 36, -49, -100, -64, 229, 50, 128, 22, 51, -43, 9, 16, 67, -19, -84, -45, -176, 21, 36, 153, -48, 117, -19, 77, 2, 69, 54, 33, -27, 80, 109, 77, 72, -1, 17, 19, -59, 26, 15, 54, 28, 23, 29, 39, -20, + 24, -15, -1, -6, 149, 139, 67, 55, 80, 91, 141, -63, 146, -1, 156, -36, 275, 90, 92, -188, -24, -45, -239, 130, 114, -79, -314, -147, -45, 152, 215, 131, -83, 43, -133, 4, 14, -113, -53, -289, 26, -38, -118, 10, 19, -41, -7, 272, -64, 221, 46, -175, 15, 14, 128, -59, 38, 27, 12, 168, 62, 173, 131, -93, 162, 75, 119, 8, 40, -43, -74, -147, -176, 183, -183, -145, -151, 83, 80, 32, 36, 106, -68, 79, -51, -77, 121, -112, 21, 53, -90, 20, 15, -17, -12, -11, + 64, -23, 25, -30, 50, -16, 29, -36, -34, -34, -246, -231, 51, 3, -49, 136, -17, -25, 144, -158, 32, -139, -88, -51, 2, 232, 266, -124, 105, -192, -17, -76, 258, -78, -14, 26, -362, -65, -178, -61, -44, 134, 180, 72, 243, -33, -110, -114, 141, 362, 255, -144, -165, 180, -163, 29, 59, 297, -109, -149, 33, -93, 58, 74, 190, -209, -134, 120, 230, -23, -106, -137, -324, 121, 0, 95, 15, 7, -51, 58, -82, 50, 70, 69, -115, 83, -21, -83, 8, -172, 107, 14, 14, -69, -23, -59, + -119, -92, 63, 4, 26, -24, 8, -9, -34, -29, -50, 3, -29, -23, -7, 9, -9, 14, -9, 58, 23, -37, 40, 22, -47, 31, -603, -196, -34, 104, 67, 151, -289, -84, -15, -296, -215, 77, 178, 107, 197, -24, 112, 266, 231, 221, 124, -83, -69, -134, -62, -135, 280, 133, -45, -123, -78, -126, -188, -199, -254, 154, 107, -278, 64, -13, 191, 31, 93, 127, -266, -40, -12, 36, 137, 212, -86, -29, -64, -165, 49, 34, -20, -44, 158, 10, -90, -29, 74, 103, -43, -4, 25, -144, 106, -10, + -219, 26, -267, 43, 196, -65, -10, -297, -147, -221, -136, -18, -25, 138, 25, 162, -99, 55, 86, 30, 85, 11, -60, 34, -27, 28, 1, 12, -12, -40, -16, 37, -41, 28, 67, 36, 16, 2, 1, -14, -28, -44, 32, 44, -27, 29, -28, -20, 333, 121, 59, -85, 246, 91, 140, 382, 420, 13, -65, -151, -224, 80, 168, -88, -14, 20, -37, -136, 159, -156, 75, -444, -61, -111, -104, -221, -43, -31, 6, -115, -157, -129, 20, -87, -167, 98, 148, 9, -136, -159, 60, -123, 140, -175, 113, 37, + 0, -248, -224, 49, -162, 263, 50, 220, -113, 221, 46, 141, 52, 133, -124, -185, -1, 285, -26, -199, -101, 122, -79, -115, 31, -315, 212, 249, -14, -220, -270, -13, 231, 161, -128, 171, 20, -30, -32, -23, -13, 44, -75, -71, 8, 21, -56, 16, -25, -13, 62, -29, -12, 5, -94, 46, 14, 4, 24, 25, -3, 3, -17, -24, -13, -17, -25, 470, 101, 257, -98, 192, 149, 300, -221, -164, -47, 14, 220, -105, 332, -28, 190, 158, -87, 63, 193, 171, 49, 45, 176, -358, 62, 272, 219, -195, + 244, -286, 176, -253, -122, -69, 264, -56, 277, 57, 63, 10, -5, 104, 164, 352, 60, 303, -147, 220, 299, -13, -49, -110, 118, -425, -31, 38, -154, -254, -10, -19, -30, 107, -253, 127, 118, 160, -402, 136, 102, -244, -24, 129, 303, -382, -43, 26, -354, -35, 57, -103, 239, -56, 25, 63, -37, -15, -12, 39, -88, 11, -44, 25, 13, -56, -1, 62, -24, -16, 6, -79, -24, 12, -25, -37, -6, 12, -37, -21, 57, 68, -87, -5, 20, -2, -10, -420, -517, -412, -375, -12, 262, -544, 387, 252, + -613, 386, 162, 133, 60, 60, 138, -95, -101, -200, -7, 236, 198, 117, -349, 239, -250, 8, -220, 274, -146, -112, 86, -409, 40, -135, -123, -43, 29, 404, -191, -61, -154, 308, -187, -99, 94, 93, 86, 110, -128, 149, 37, -335, 461, 185, 74, 49, -3, -214, 264, 223, 92, 298, 31, 132, 297, 153, 63, -204, 245, -107, 469, -50, 12, -127, -493, 65, -120, -58, 252, -21, -268, -151, 216, 182, 28, 211, 55, -154, 73, -14, -52, -42, 16, 125, -60, 16, 21, 71, 26, -56, 90, 14, 24, -5, + 23, 12, -36, 53, -37, 43, 33, -26, 102, -14, 25, -35, -24, 301, 205, -35, -189, 494, 786, -104, -109, 380, 93, 125, 101, -566, 62, -366, 293, 418, -109, -202, 68, 265, -159, 320, -125, 617, -180, 119, -30, 167, 440, -166, 44, -39, 127, -163, -78, 250, 539, 45, 395, -146, 55, -74, 132, 289, 430, 335, 319, 331, 210, -60, 52, -45, 9, 66, -215, -62, 347, -304, 122, -134, -80, -158, -627, 70, 341, 216, -77, -297, -722, -116, 295, -61, 117, -225, 169, -208, 192, 410, -179, -221, -408, 124, + 51, 68, -322, 24, 3, -98, 20, 153, 8, 105, 48, 68, 84, -14, 132, 32, 15, -27, -41, -36, 126, 43, -3, 84, 45, 61, -10, 70, 86, 115, -46, 13, -45, -539, -430, 57, 252, -242, -160, 32, -132, -808, -699, 305, 279, 53, 40, -295, 463, 565, 347, -290, 271, 371, -59, -469, -213, 650, -194, 66, 39, 366, -294, -520, 112, 241, -129, 154, 337, -163, -131, -14, -729, -210, 250, -137, -488, 89, -14, -152, 96, -45, -462, -390, -692, -548, 106, 243, 22, -163, -232, 7, -159, 148, -333, 12, + -119, -95, -113, -29, 129, -150, -664, 100, -96, 164, 181, 13, 125, 154, 48, -37, 80, -93, 36, -206, -110, -92, -115, 48, 182, -95, 28, -234, 26, -23, -175, 77, -56, 45, 70, 42, 31, 149, 31, 20, 48, 1, 19, 21, -43, -111, -23, -113, 53, -86, 126, 2, 181, 84, -111, -72, -61, -6, 264, 848, 753, 589, -63, 576, 187, 804, 341, -16, 980, -203, -51, -623, -164, -12, -439, 264, 394, -127, -5, -353, -607, -358, -462, -134, -279, -87, -43, 280, 72, -57, -249, -85, -166, 90, 8, -247, + 133, 166, 67, -190, -250, 86, 235, -32, -7, -444, 801, 136, -150, -20, 73, 344, 293, -299, 172, -116, 39, -49, -73, -455, -405, -545, 86, -21, -113, 345, -106, 971, -93, -50, -236, -105, 129, 169, 120, -6, 420, 301, -58, -200, 59, -118, 3, 41, -131, -42, 7, -43, 69, -163, 102, 187, -53, 99, -53, -43, -71, 32, 106, -41, 141, 28, 53, 192, 86, -23, 203, 92, 142, 182, 143, 18, 4, 135, -118, 6, 86, 47, 98, 88, 51, 113, -511, -742, -404, 542, 436, -382, -384, 581, 360, -378, + -502, -90, 91, 49, 76, -303, 314, -228, 610, -102, -422, 91, 159, -12, 51, -196, -273, -23, 251, -159, 192, -306, -791, -654, 413, -511, 407, 109, 51, -177, 241, 67, -59, -124, 115, 234, -214, 665, -166, 218, -199, 51, -53, -273, 654, -517, 712, -34, -347, -543, 278, 87, 93, 23, 292, 184, 265, -559, -162, 6, 12, 130, -413, -211, -133, -80, -518, -115, -171, -596, -28, -342, 89, -165, 48, 67, 260, 144, -95, -25, -213, 111, -12, 95, -251, 6, -99, 53, -231, 38, 56, 3, -50, 73, -135, 96, + -211, 74, -151, 67, 43, 97, -77, 260, 108, -4, -160, -142, -23, 171, -35, -96, -82, 115, 10, 108, 1259, 420, -281, 647, 602, -311, -397, 973, -87, 214, -577, 1416, 50, -396, 206, 71, 688, 12, 868, -624, 14, -681, 53, 479, 22, -417, 592, 317, 174, 143, -207, -199, 54, -295, 388, -345, -460, 407, 154, -534, 290, 35, -388, -218, -130, 205, -46, -234, 286, -345, -137, -118, 478, -313, 231, 367, 170, -217, -446, 283, -382, 516, -650, 858, -254, -120, -122, 391, -28, 142, 234, 141, 332, -324, -617, 43, + 524, -350, -166, -365, -219, 97, -36, -105, 227, 163, 120, -57, 346, 212, -160, -84, 68, 19, 293, 186, -24, -95, -74, 320, 30, -164, 203, 61, 9, 169, 77, -30, -172, 48, 211, -156, -38, 240, -15, -49, -60, 142, 28, 4, -63, -753, -93, 689, -201, -429, 191, -202, -37, 312, -747, -439, 290, 385, 525, -37, -99, 212, -50, -739, -506, 870, -65, -762, -442, -306, -251, 71, 256, 14, -127, -380, -581, 79, 78, -20, 476, -324, -912, 370, 269, -1065, 637, -172, -537, -443, -39, 607, 146, -201, -219, 173, + 320, -449, 344, 56, 254, -194, -466, 414, 2, 465, -1441, 184, 224, -213, 402, 466, 1372, 39, -904, -417, -235, -880, -863, 45, -489, 6, -325, 323, -331, -326, 580, 142, -18, -32, 341, -72, -33, 197, 163, -125, 112, -309, -67, 86, -57, -90, -148, -159, -80, -196, 80, -249, 55, -43, 235, -55, -120, -104, -139, -150, -39, -105, -181, -135, 135, -181, -91, -324, 102, 130, 336, 75, -41, 20, -631, 102, 386, 348, -560, 996, 691, -317, 412, -803, -181, -268, 1269, 815, -305, -483, -595, -130, 32, 235, 850, 183, + 143, 186, 21, -280, 32, -52, 391, 531, 670, 439, 283, -65, -126, 108, 607, 98, 106, -618, -317, 1048, 422, 316, 6, 629, 333, 1323, -76, 1364, 95, -420, 439, -366, -277, -46, -254, 17, 251, 547, 92, -114, -599, 195, 47, 396, -470, 128, -209, 73, -598, 305, -526, -61, -715, -977, -166, -150, 805, 221, -28, 155, 249, 318, 51, -9, 11, -565, 178, 12, 527, -211, -28, -138, 374, 79, 341, 0, -402, 199, -23, 136, -306, -133, 70, 88, -228, 26, 204, 133, -201, -216, 386, -387, 161, -116, -322, 106, + 70, 107, 130, -141, -21, 192, 12, 135, -58, -144, -155, -335, -507, 153, -582, -3, 706, 219, 602, -700, -321, 339, 71, 996, -507, 594, -226, -305, -744, -292, -400, 496, 116, -666, 830, -433, -400, 77, 323, -246, 574, -282, -400, -210, 190, -74, -111, 58, 571, -392, 1047, -411, -15, 967, -197, 166, -1326, 54, 235, -304, 582, -1068, -1302, 488, -233, 714, -539, -512, 56, -172, 1103, -140, -53, 240, -1029, 52, -1040, -422, 57, 242, -1298, -585, -162, -70, 416, -562, 660, -279, 71, -858, -46, -759, 281, 156, 556, 706, + -269, 460, 60, -161, 235, 142, -233, -240, -415, -23, -249, -264, 85, -68, 350, -484, -87, -307, 114, 165, -170, -30, -258, -261, 280, 458, 520, 99, 29, -150, 95, 78, -203, -325, 103, -175, -236, 346, 242, 198, -330, -384, -811, 663, -582, -156, 516, 1208, -347, 992, 344, 263, -462, 1098, 167, 518, 44, -629, 229, -631, -642, 409, -639, -127, -152, 655, 52, -206, 206, 297, -136, -598, -146, 478, 1131, 272, -641, 81, -125, 282, 342, 585, -257, 24, 370, 96, -22, 769, 683, 826, 279, 695, 92, 421, -325, -48, + 89, -628, 46, 1088, -139, -227, 225, -7, 288, -633, 848, -524, -240, -137, 42, 109, 108, -925, 1177, -247, -379, -131, 999, -105, 207, -783, -552, 25, 415, 391, 638, -1020, -323, 993, -355, 117, 841, 209, 183, -47, 28, -313, -26, 89, 239, -137, 199, -363, -210, 28, -106, -56, -865, -661, 54, 443, -409, -690, -286, -565, 160, 33, -220, 557, -159, 232, 251, -292, -212, -43, 67, -15, 414, 0, 26, -194, -46, -309, 1930, -117, 390, -21, -194, 50, -888, -385, -271, 341, 250, 431, 53, -474, 494, -404, 569, 411, + -456, -497, 61, 687, -708, 292, 329, -412, 183, -59, 250, -38, -1034, 574, 358, -880, 1054, -565, -133, -353, 851, -176, -722, -9, 12, 695, 715, 40, -550, 793, -129, 134, -1016, 792, 327, 40, -583, -450, -62, 270, -469, -846, -357, 653, 410, -106, 1074, 56, -175, -784, 948, -890, -284, 959, 306, 117, -364, 141, 954, 203, 418, 595, -1562, -351, -259, -139, -648, -124, -77, 939, 257, 54, 482, 668, 475, -346, 181, 396, -80, 147, 175, 207, 140, 664, 365, 32, -196, -314, -583, 75, 1, 147, 192, 81, 1014, -149, + 367, 210, -276, -815, -130, -309, -501, -551, 94, -100, -652, -8, 249, -75, -63, 217, -160, -510, -222, -788, 40, -880, 824, 1248, 602, 703, -1088, -1000, -758, 57, 1382, -270, 522, 872, 462, -509, 43, 632, -824, -718, -588, 662, 487, -897, -1227, 1663, 1050, -1218, 555, -160, 510, 34, -351, -853, 773, -41, -606, -945, 248, 196, -222, 4, -74, -477, -189, -261, 440, -831, 905, -633, 44, 1385, -1346, -349, 1291, 72, 310, -212, -391, 380, -139, -587, 83, -1310, 2193, -237, -2399, 889, 2384, 1379, -2927, -877, 564, 189, -439, -700, + 374, 874, -1097, -329, -1920, -356, 673, 219, -582, -989, 386, 821, -12, -285, -456, 647, 405, 248, -51, -228, 86, 350, 297, -94, -767, -507, 808, 318, -410, -307, 581, 166, -77, -1198, -533, -611, 661, 153, 147, -149, 20, 612, -127, -142, -556, 82, -179, 864, 191, -229, 110, 872, -116, -374, 74, 7, -45, -620, 151, 588, 1411, -597, 467, -751, -1952, 1050, -483, -1084, -733, -1108, 538, 356, -1466, 939, -504, -46, -7, -767, 596, 574, 525, -57, 683, 343, -396, 29, -831, -313, -736, -529, -26, 1207, -1003, -224, -208, -917, + 544, -1033, 542, 453, -685, 541, -1108, 314, -962, 624, -353, -521, -522, -800, -203, 393, 702, -811, 549, 295, 853, 1029, 611, -866, -389, -1624, -398, -476, 549, -1894, -347, -1129, -87, 1121, 1047, 676, 252, 1511, 1672, 1473, -497, -670, 573, 1442, 2688, 188, 637, 321, -133, 489, -472, 286, -115, -12, -301, 497, 591, -208, -470, -369, 450, 190, 509, -279, 204, -104, -211, -148, 506, 974, 478, -513, 268, -181, 361, 152, 183, 474, -299, -650, 63, 491, 398, 128, -87, -227, -877, 865, 252, -210, -912, -221, -624, 310, 361, -305, + 224, 1755, -1037, 656, 797, -368, 72, 306, -98, 851, 43, 617, -788, -111, 685, 114, -1069, 693, -427, -347, -409, -105, -399, 406, 566, 277, -99, -297, 491, -159, -786, 644, -1326, -333, -273, -290, 756, 829, 1485, -434, 635, -22, 286, 975, -71, 106, -649, -2043, 1013, 197, -988, -675, 100, 537, -94, -577, 301, -592, 782, 438, -340, -710, 1417, 158, 76, -127, 197, 103, 63, -474, -1006, 281, -146, -355, -927, -225, -26, 831, 343, -1040, 610, 112, -38, -112, 341, 438, -84, -191, -72, -181, 163, 262, -9, 152, 292, -103, + 421, 182, 131, 224, -115, 528, 92, -107, 346, -409, 137, 243, -94, -172, 476, 685, -605, -108, -210, -204, 248, 216, -378, 217, 175, 157, 183, -338, 251, -21, 151, -423, -104, 89, 1957, 985, 1969, -1819, 165, 932, -356, 1063, 2077, 1126, 75, -567, -566, 98, 905, 951, 227, -12, -1419, -304, 1417, 456, -384, 768, -653, -935, -246, -71, 1097, 1412, 1286, 474, -487, -771, -1404, -1414, 1231, 503, 109, 1879, 123, -588, -765, -795, 390, 797, 650, 1229, 96, 882, -50, -170, 460, 816, 612, 515, -463, -188, -363, -847, -663, -1230, + -401, 317, -192, 878, 1075, -27, 18, -447, -772, 151, 1039, -70, 578, 240, -67, -333, -141, 84, 368, 270, -268, -588, -706, -680, -252, 262, -62, -431, -208, -302, -240, 128, -30, 385, 573, 117, -681, -364, -405, -104, 471, 102, 121, -573, -526, -618, -305, 520, 368, 447, 253, -232, -267, 184, 182, -58, 126, -242, -180, 128, 103, 181, -106, -241, -100, -187, -27, 352, -1037, -2016, 794, 3293, 3344, 2835, 2050, -1264, -1447, -1559, -2078, -3175, -2562, -2221, 1030, 2391, 1774, 3843, 2967, 1550, -573, -1033, -2584, -2014, -1998, -406, -1225, -991, + 294, 543, 1086, 1094, 1496, 1488, 1915, 1120, 490, -277, -326, -841, -1279, -1539, -1886, -1232, -2316, -1540, -1159, 1161, 2194, 2371, 1637, 1119, 1747, 1340, 1676, 1321, 460, -621, -2941, -2076, -2121, -3286, -2065, -1783, -1735, 632, 1741, 2770, 2277, 3256, 2918, 2858, 2034, -1109, -1008, -2284, -3025, -3329, -2734, -1309, -374, -688, 899, 2385, 1678, 1137, 1910, 1608, 572, -376, -383, -122, -470, -1281, -808, -915, -497, -409, -957, -352, 327, -319, 1057, 1399, 1533, 1625, 99, 486, 472, -137, -2226, -1773, -1388, -1237, -977, -923, 1022, 1531, 1661, 1593, 1310, 901, 808, -11, + -241, -1284, -1737, -1553, -1298, -825, -539, 64, 782, 1589, 1188, 758, 547, 152, -11, 3, -317, -412, -342, -402, 97, -150, -555, 75, 266, -97, -138, -113, 64, 106, -144, 33, 363, 228, 107, 225, 217, 39, -41, -67, -144, -203, -151, -109, -139, -115, -52, -21, 32, 68, 69, 63, 109, 88, 97, 41, -37, -45, -4, -42, -81, -52, 36, 84, 105, 83, 80, 20, -42, -88, -132, -177, -166, -146, -91, -39, 34, 126, 224, 250, 250, 201, 125, 28, -61, -180, -234, -254, -219, -157, -76, 17, 105, 127, 150, 132, + 96, 46, 20, -5, -13, -25, -25, -31, -17, -19, -15, -20, -8, -11, -2, -6, 2, -5, 2, -3 } + }, + { + {-104, 104, 86, 198, -270, 59, 175, 325, -37, 184, -9, 167, 38, 255, -7, -81, 169, 245, 229, 137, 35, -92, -76, 24, 116, -58, 53, 16, 132, -63, -5, 35, -161, -91, -49, -165, 38, -46, -3, -21, -140, 109, 164, -33, 12, 16, -28, 177, -214, 0, 87, 25, 27, -50, -178, -44, 67, 82, 89, -15, 2, 2, 34, -29, 183, 6, -18, -120, 15, -86, -68, 74, 78, 191, 5, 188, 20, 21, 11, -98, 5, -34, -52, 21, 59, -37, 23, -38, 46, -49, -17, -25, 26, -15, 24, -21, + 29, 54, 25, -25, -8, -13, -14, 16, 10, -12, 212, 343, 46, 171, -62, 101, 133, -41, -106, 180, 311, -61, 35, 120, -148, 92, 133, -272, 77, 26, -61, 0, -283, 11, 80, -135, 25, 4, 181, 129, -68, -20, -17, -193, -129, 21, 78, 17, 87, -128, 19, 63, 13, -118, -86, -26, 41, 95, 99, 65, 115, 112, -126, -39, 5, 160, -24, 115, -75, -79, -24, -144, -66, 29, 84, -123, 120, -34, -36, -24, -49, -62, 25, 93, 35, 156, -216, -175, -38, 64, -2, -36, 33, 5, 40, 66, + 110, 2, -6, 26, -10, -2, 17, -51, -27, -105, 42, 199, 282, 163, -71, 121, -73, -50, -241, -192, 87, 184, 181, 188, 42, 10, 117, -155, 157, 126, 12, 109, 280, 190, 54, -201, 6, 67, 44, 33, -219, 53, 41, 147, 163, -51, 105, -79, -87, 118, 68, -210, -198, -87, -111, -83, -88, -243, -219, -20, 80, -1, -22, -164, 23, 194, -54, -61, 74, 0, 141, 71, 73, -91, -111, 209, 96, -84, 138, -18, 108, -91, 18, 154, -58, -50, 112, 14, 45, 66, -76, 87, -35, 71, 72, 55, + -48, 18, -23, -42, -52, 3, 7, 35, 31, 8, -2, 27, 10, 19, -389, -230, -71, 73, -160, 48, -43, 111, -27, -218, -173, 150, 124, 311, 276, -42, 200, -300, -48, 232, 71, 54, -30, -98, -45, 32, -26, -10, 119, -147, 34, 53, -3, 92, -100, -83, 54, -65, 84, -165, 28, -99, -38, -110, -81, -125, -184, 113, 0, 193, -180, -155, 0, 37, -20, -38, 14, 116, 57, 25, -79, -77, -43, -145, 24, -38, 18, -7, -155, -13, -11, -165, 6, -31, 20, -28, -182, 16, 83, -37, 122, 33, + -64, 51, 128, 42, 23, 29, -26, 16, 101, -8, -15, 37, 42, 16, 34, 7, 15, -66, 9, -5, -31, -24, -23, -34, 6, -28, 138, -210, 87, -235, -38, 10, -170, 161, 126, -348, -33, 57, -30, -153, -201, 41, -100, -170, -81, 99, 92, 245, 323, -29, 289, -176, 115, 124, -23, 122, -68, 2, -16, -60, -28, -67, 241, -14, -175, -43, 122, 73, 98, 18, -80, 173, 358, 21, 39, 20, -24, 56, -21, 202, -152, 193, 137, -124, 66, 126, 89, -148, -157, -317, -49, -30, 43, 122, -27, 79, + -24, -85, -81, 163, -34, 173, -252, -101, 62, -162, 45, 174, 20, -2, 16, 37, 27, -99, -28, -16, 18, -18, 35, 44, 27, -29, -62, 72, 31, 28, 22, 21, 9, 2, -28, 30, 18, 12, 9, 32, 25, 38, -40, -27, -48, -48, -9, 38, -26, -18, 25, 8, 19, -8, 7, 88, 44, 1, 127, 355, 426, -113, -6, 86, -60, 270, 271, -171, 265, 203, 83, 116, 110, 52, -19, 16, 39, -147, -173, 44, -45, -5, 35, -159, 162, 314, -6, -192, 313, 35, 14, 119, -50, -95, 49, -119, + 51, 314, 140, -5, 117, 169, 450, -75, 197, -40, -189, 125, 16, -67, 92, 271, 75, 47, 0, 108, 399, 175, 54, 38, 108, -116, 206, -54, -386, 46, -37, 234, 282, 118, -114, -109, -97, -15, 91, 7, 63, 38, 66, 175, 81, -142, -56, 18, 53, 8, 1, 4, -72, 80, 24, 15, 13, 15, 12, 60, -20, 43, -40, -14, -65, 13, -22, -5, 9, 28, -480, -50, -206, -235, -67, -167, 4, 150, -228, 235, -499, 73, -151, -261, -358, 373, 180, 27, -318, -203, 113, -405, -289, 99, 82, 417, + -58, 37, 302, -180, 297, 106, 106, -56, -186, -19, 246, -133, 17, 317, -120, -91, -157, -185, -167, -119, -260, -29, 71, -85, 51, -82, -135, 179, -233, 140, -199, -242, 6, 202, 8, -59, 74, -161, -88, -226, -411, -190, 52, -122, 458, 186, -329, -162, -54, -115, 143, 316, 200, -151, 139, -179, 102, 17, 139, -159, -44, 15, -77, -135, -121, 22, -14, -31, 65, 28, 4, -44, 36, -8, -42, -98, -9, -50, 2, 45, -40, -109, -20, -46, -186, -26, -58, 511, 341, 348, -99, -507, -36, -262, 69, 106, + 274, -132, 123, -212, 39, -187, -463, -257, 183, -176, -366, -353, -319, -511, 67, -183, -380, -352, 65, 480, -61, -87, -159, -300, 65, -123, 36, -373, 27, -389, 57, -37, 210, 154, 175, 82, -11, 137, -90, 274, 82, 136, 89, -97, 103, 276, -33, 152, -36, 438, 61, 161, 25, -254, -187, 3, -85, 52, -61, 142, 135, 165, -75, 92, -337, 176, 501, -245, -47, 127, -283, -25, 183, -118, -14, -65, 159, -165, -35, 38, -86, 38, -28, 61, -79, -88, 95, -46, -87, 59, -33, -3, -125, 93, 36, -26, + -18, 51, 23, 49, 43, 5, -52, -102, -25, 53, -250, -722, -121, -252, -381, 206, -727, -94, -259, -140, 209, -231, 306, 265, 41, 239, 20, 127, -191, -334, -369, -205, -338, 263, 343, -15, -183, 100, 98, -127, 24, -574, -305, 267, -148, 8, 261, -25, 161, 139, -76, 159, -4, -306, 339, -240, 15, 19, -190, 125, 201, -120, 230, 26, -20, -212, 260, -2, -214, -71, -428, -179, -245, -31, 291, 84, -30, 5, -278, 62, 210, -278, 14, 425, -177, 42, 30, -303, -184, 193, 160, -493, 97, 368, -4, 44, + 0, 89, -31, 232, -56, -10, 27, 45, -108, 27, 79, 25, 136, 51, -6, -51, -111, -32, 49, -68, 46, -69, -5, 96, 49, -68, -94, 5, 0, 204, -85, 17, 109, 45, 107, 1290, 284, -167, -261, -23, -84, 230, -53, 195, 363, -145, 16, -240, -168, 79, -43, 189, -364, -210, 168, 363, 236, -10, 83, -87, -220, 158, 280, 298, 355, -295, -73, -169, -370, -45, 16, -80, 166, 224, -3, 111, -69, -390, -216, -522, -533, -154, 175, -77, -238, 445, 165, -17, -420, -18, -131, -297, 1, -136, -196, -412, + -56, -152, -457, 0, 344, -233, -114, 129, -198, 78, -196, 283, -94, -273, -427, -696, 135, 118, 530, 215, 182, -2, 159, -125, 169, -16, 58, 85, 200, 93, 6, -37, -13, 81, 48, 211, 163, 111, 34, -43, -114, 61, 134, 12, 6, -26, -101, -17, -17, -47, -37, -76, 61, 93, -90, -89, -7, -12, 47, 288, -1018, -583, 543, -142, 37, -282, 238, -98, -391, 188, 549, 69, -476, 134, -102, -111, 317, 325, -42, -68, 691, 153, -96, -424, 190, -608, -497, -461, 190, -88, -46, 395, 161, -403, -333, 87, + 394, 133, -41, 22, 264, -189, -421, 553, -159, 57, 227, 34, 80, 569, 13, 362, 20, -382, 59, 81, -75, 73, 263, -193, -55, 66, -751, 200, 158, -4, 185, 141, -276, 133, 1040, 445, 260, 75, 256, -796, -373, 403, 20, -4, -301, 270, 330, 273, 50, 58, -105, 5, -185, -68, 154, -33, -91, 78, 11, 75, -106, -46, 42, -20, 80, -132, -41, 95, -101, 77, 32, 10, 8, 2, -81, 43, 84, -39, -35, -91, 45, -5, -680, 476, 518, 162, 288, -194, 824, -100, 317, 210, -375, -159, -171, 473, + -280, -92, 304, 249, -275, -79, -802, 147, -86, -240, 74, 18, 63, 70, 276, 7, 302, 32, 149, -81, -256, -280, 524, -189, -373, -321, -140, -178, 229, 136, 177, 226, 73, -289, 167, -469, -149, -410, 283, -495, -349, -108, -162, 143, 334, -266, 315, 509, 258, 490, -204, 660, 64, 558, 322, 66, -296, -758, -506, -418, -232, -236, -70, -355, 268, 437, -166, -342, -305, -248, -455, 285, 212, -126, -115, -182, 27, -105, 251, -3, 67, -136, -110, -190, -31, -227, -210, 215, -12, 23, 9, 76, -84, -13, -128, 0, + 4, -10, 71, 3, -104, -75, -74, 17, -112, -130, -155, 39, -39, 381, 194, -217, 641, 73, -626, 782, 52, -333, 276, -642, -123, -409, -128, -72, -126, -292, 82, -555, -215, -200, -749, 91, -543, -386, -609, 122, -460, -139, -153, 5, 231, -187, 326, 17, 432, -101, 376, 474, -570, -9, 152, 348, 13, 419, 140, 404, -9, -309, -195, -30, 260, -60, -121, -26, 483, 305, -116, -399, 133, 219, 155, 429, -576, -425, -123, 40, -163, 4, -166, -360, 1007, -498, -579, 431, 247, 374, 114, 138, 76, 219, -209, 579, + -103, 142, -114, 77, 33, -32, 367, 46, 30, -364, 163, 54, -56, -297, -33, -62, 6, -95, 264, 61, 72, -214, 144, -102, 27, 128, -8, -63, -72, -191, 108, 195, -96, -22, -72, 29, -114, -257, -81, -9, -179, 182, -19, -25, 58, -172, -199, -55, 77, -131, -174, 512, 371, 604, -204, -146, -829, 962, 436, -1273, -687, 412, 565, 575, -371, -295, 688, 167, 155, 483, 384, -703, 213, 300, -57, 336, 60, -88, 65, -227, 1175, 311, 150, -30, -150, -77, -672, 131, 193, -155, -223, -1079, -521, 229, 185, -353, + -351, -47, -519, 215, 187, -73, 211, 429, 17, -20, -141, -226, -79, 40, -802, -104, 183, 488, -867, 194, 305, -66, -411, -365, 647, 646, -99, -400, -768, 162, 302, 162, 8, -830, 347, 759, -261, 87, 233, -310, -502, -261, 71, -153, -44, -233, -207, -170, -77, -66, 97, -17, -20, -212, 83, -99, 41, 3, 64, 130, 146, -238, 91, -184, -315, -162, 40, -31, 131, -30, 84, 184, 4, -8, -166, -89, 238, 123, -106, -62, -28, -154, 379, -279, 103, -232, -206, 36, 256, 514, -947, -1234, -859, -1104, 958, -640, + 385, -108, -777, 139, -212, -288, -1009, -923, -691, -263, 35, -534, -156, 141, 433, 34, -271, 1, -290, 416, -525, 723, 622, -150, -200, -859, -502, -523, 61, 114, -142, 700, 198, 567, 110, -68, -260, 510, 351, 159, -516, 274, -871, -99, -94, -578, -97, 5, 662, 439, 11, 306, -14, -657, 332, 91, 544, -311, -633, 374, -1135, -262, 399, -172, -183, 275, -76, -226, 207, -97, -729, -642, -108, 296, 481, 677, 679, -292, -234, 131, 244, 220, 90, -306, 264, 2, -59, 31, 162, 273, -83, 43, 259, -64, -8, -268, + 129, -61, -21, 213, -45, -101, 95, -304, -114, 301, 85, 94, -110, -76, -48, -244, -34, -138, 179, -525, 6, 385, -1242, -108, -793, 56, -586, 535, -421, -36, 97, 204, 628, 221, -294, 694, 207, -1160, 186, -693, -56, 141, -104, 584, -177, 113, 140, 59, -380, 593, -344, -24, -690, 8, 111, -100, -246, -306, -362, 896, 31, 468, -795, 98, -14, 280, 467, -535, 961, 1398, -68, 143, -489, 231, 319, -260, 65, 270, 535, -9, 28, -159, -473, -696, 355, -520, -227, -338, 150, 483, 422, -76, 157, -948, 629, -110, + 134, -273, 614, -850, 1021, 753, 850, -337, -23, -833, -459, -305, 274, 242, -699, -503, 17, -170, -511, 5, -354, -410, -159, -56, 30, -269, 47, 100, 420, 384, -61, 363, -177, -438, -248, -89, -226, -28, -168, 258, 75, 977, 127, -329, -116, 93, -509, -311, 120, 26, -132, 56, 0, -549, -59, 376, -274, 394, 1561, 433, 1138, 350, -1166, 462, 337, -402, 90, 750, 43, 717, 654, -765, 425, -765, -501, -81, 1528, 457, -676, 637, 426, -846, -360, -67, 859, 116, -768, -447, -15, -223, 481, 671, -237, 589, -376, -532, + -9, 1224, 124, -718, 412, -43, -61, 336, -795, -704, -650, 474, -423, 146, 215, 728, 374, 749, 90, -42, 628, 1126, 684, -1132, 33, 100, -180, 207, 321, -876, -121, 163, 160, -1042, -969, -558, -585, 1016, 389, 38, 462, -846, 355, 223, 163, -83, -182, 699, 436, -292, 131, -223, 472, -142, 42, 88, 78, 336, -45, -569, -14, 96, 157, 279, -68, 17, 225, -443, -247, -49, -780, -130, 229, -67, 95, 443, -55, -324, 77, 101, 304, 342, -328, -217, -13, -296, -177, -559, -645, 173, 21, -304, -237, -310, -587, 439, + -1175, 850, 956, 261, 1041, -1066, -517, -290, -1525, 859, 90, 531, 705, 683, 57, -24, 701, -112, -824, -861, 524, -973, 951, -274, 212, 937, 851, -428, 1293, -749, 88, -778, 130, -267, 512, 171, -547, 493, 756, 1103, -634, 235, 683, -932, 48, -375, -1342, -580, 365, -740, 269, -622, -9, 907, -425, 384, 1051, 746, 286, 1389, -2158, -408, 729, -83, 427, -670, -1163, 1421, -14, -716, 313, 899, 2238, 845, -1681, -921, 582, 625, 278, -1178, -95, 259, -357, 797, 292, 509, 613, 454, -302, 351, -928, 136, 508, -59, -489, 291, + -295, 497, 557, -234, -449, -122, 1022, -181, -110, -396, 467, -394, -234, 294, -180, 955, -64, -236, 969, -85, 234, 589, -35, -50, 66, 88, -442, 206, 34, -655, 455, -203, 855, -460, 264, 80, 1143, -1004, -91, -479, -595, 917, -356, 1204, -118, -926, 1444, 2087, -296, -664, -1006, 242, 1110, 220, -231, -688, 166, 166, -150, 174, -96, -336, -344, 323, 458, -31, 619, -590, 1266, 955, 552, -42, 79, 184, -664, -580, -643, -336, -173, 409, 360, 690, -326, -77, -288, 784, 1527, -354, -973, -624, -34, -1319, 1036, -1793, 525, 769, + 790, -778, 190, 801, -1815, -855, 381, -186, -905, -799, -97, -415, 1363, 589, -488, -449, -744, 2083, 455, 1092, -69, 325, 402, 474, -670, -78, 872, 603, 365, -276, -360, 9, 279, 407, 280, -526, 87, 15, 150, 396, 398, -551, 273, -335, -412, 55, 450, 189, -252, 71, -26, -69, -214, 840, -233, 14, -484, 128, -171, 559, 189, -105, -280, 323, 270, -369, 39, -608, -232, 160, 269, 364, 10, 381, -75, 74, 195, -769, 221, 1218, 25, -396, 995, 733, -220, -634, -991, 199, 1915, 436, 977, -75, 75, -66, -237, 12, + 78, 479, 143, -362, 310, -316, -371, -396, 0, 398, 74, 321, 322, 280, -281, -467, 142, -320, -838, -234, 178, -278, 958, -988, 804, -247, -3, 1214, -198, -22, 1562, -231, -648, 126, -556, -114, -526, 1760, -503, 432, -429, -179, -248, 300, -448, -1063, 466, -114, -1198, 632, -319, 672, 1488, -740, -23, -68, -228, -797, -147, 747, 290, 462, -684, 210, 115, -647, -184, 155, 332, 429, 30, 89, 270, -57, -330, 483, -191, -135, 428, 67, -123, 652, -46, -41, 2, 218, -196, 333, -253, -118, -201, 177, -8, -16, 91, 306, + -357, 85, -49, 222, 62, -61, 365, -216, 197, -56, 108, 33, 274, -33, -420, -6, 2013, 1013, 2112, -1184, -298, 690, -651, 498, 2173, 509, 321, -575, -531, 617, -320, 874, -136, -203, -246, -1247, 308, 1494, -782, 903, 798, -509, -144, 621, -986, 494, -62, 748, 263, -624, -191, -1253, -633, 585, 451, 971, 1527, 161, 34, -1315, -793, -786, -637, 343, -526, -154, -113, 393, -994, -163, 530, 268, 838, -112, -386, 823, -139, 504, -623, -383, -87, -212, 415, 599, 858, 239, 81, -585, -154, -300, 720, 8, 1074, 185, 812, -779, + -268, -5, -8, 580, -81, -288, -145, 143, 52, 151, 280, 240, -136, -173, 23, -102, 238, 242, 69, -201, 21, -264, -99, -57, 469, 164, -47, 120, -293, -360, -232, 115, 263, -214, -9, 5, 200, 105, -16, 200, 44, -9, -184, 96, 71, -79, 34, 62, -272, -541, -2072, 64, 3305, 3001, 2802, 1203, -1205, -1645, -1653, -1457, -2706, -1914, -1887, 1462, 2219, 1829, 2891, 2424, 502, -102, -1049, -2013, -1218, -2115, -1165, -701, 1, -274, 523, 922, 1540, 985, 1619, 1250, 1284, 110, -1076, -476, 27, -1155, -1548, -1990, -1976, -1385, -206, 985, + 376, 1429, 994, 1629, 1432, 1580, 1812, 990, -150, -285, -1199, -964, -3221, -2560, -2069, -1600, 178, -693, 36, 2203, 2699, 3715, 2334, 1418, 949, 233, -1430, -1292, -1989, -2550, -2177, -2013, -959, 154, 1015, 1693, 1654, 1424, 883, 959, 398, 265, -56, -778, -695, -617, -707, -362, -789, -549, 183, 75, -463, 255, 632, 373, 723, 1150, 1178, 533, -744, -309, -112, -1489, -1590, -1369, -585, 436, 667, 573, 939, 1082, 1314, 887, 532, -194, -897, -893, -1014, -1345, -970, -524, 453, 743, 467, 298, 849, 588, 344, 90, -136, -265, 20, -320, -399, -135, + 125, -219, -178, 46, 170, 32, -94, -109, 127, 9, -74, -130, 42, 192, 225, 41, 194, 183, 93, -51, -47, -155, -150, -229, -129, -149, -40, 20, 41, -14, 91, 117, 175, -46, -21, 60, 90, -73, -7, -24, 11, 40, 130, -8, 41, 24, 29, -81, -118, -202, -124, -161, -120, -130, 39, 104, 194, 201, 307, 242, 216, 84, 14, -151, -194, -284, -246, -270, -156, -95, 26, 58, 194, 165, 213, 169, 160, 29, 28, -60, -59, -133, -79, -97, -25, -59, 4, -26, 35, -7, 42, -8, 36, -12, 33, -18, + 26 }, + {33, -38, 135, 153, 81, -58, -231, -210, 76, 122, -46, 227, -45, 136, -162, -141, 61, 7, -43, 61, 146, -63, 19, -83, -9, 9, 59, 57, 74, 13, 44, 169, -66, -78, -86, -151, 43, -31, 277, 55, -22, 23, 168, -15, -38, -42, -100, -17, 129, -19, 53, 132, -42, -8, -212, -123, -193, -37, -57, 29, 10, 29, 68, -45, 32, 3, 16, 30, -71, 67, -24, -79, -11, -80, -26, 9, -127, 34, 5, 98, 9, -1, -59, 14, 96, 48, -25, 12, 21, 25, 73, 10, 4, -17, -12, 9, + 2, -6, 48, 28, 28, 22, 14, 7, 14, 27, 157, 369, 146, 87, 103, -217, -25, 94, -29, 37, -198, 195, 264, 45, 118, -56, -154, -239, -262, -174, 208, -196, -124, -166, 53, 138, 26, 19, 77, -8, 49, 170, -24, 141, -135, 129, 90, 82, -71, -220, -47, 126, 75, -61, -7, 44, -9, -106, -22, 90, -31, 10, -52, -12, 7, 30, 155, 65, -79, 13, 13, -53, 28, -77, -9, 126, 41, 141, -101, -87, -52, -22, 72, 160, -92, -116, 138, -13, -2, 5, 48, 34, 116, -33, 54, -71, + -66, 5, 32, -5, 3, 27, 29, 23, -60, 68, -14, 108, 46, -121, -115, -130, -20, -106, -224, -213, 220, -5, 46, -1, 134, -198, 295, 262, 14, 14, 0, 8, -29, 103, 80, 7, -168, 73, -52, 81, -23, 179, -42, -104, -47, -28, 66, -1, 111, -177, 96, 31, -98, 279, -44, -40, -6, -4, -74, -24, 149, 122, -262, -123, 133, 39, -63, 228, 8, 51, 224, 93, 176, 50, -68, -91, -176, -170, 25, 91, 218, 9, -89, -111, 38, -2, -61, 71, -25, -56, 51, 118, 38, -59, 59, 62, + 77, 50, 4, 8, -73, -15, -1, 38, 32, 60, 58, 49, 18, -5, -299, -104, -145, 136, -99, 88, -107, -44, 253, 124, -168, 77, 242, 36, -85, -170, -204, -140, -205, 136, 31, 75, -39, -93, -98, -180, 9, -5, 43, -44, -164, 3, 175, -39, 2, -87, -175, -259, -22, 187, 68, 20, -88, 24, -141, -46, -106, 14, 24, -160, 180, -101, 230, 87, 22, -104, -55, 59, -13, 56, 123, 25, 49, -136, 80, -68, 211, 262, 120, 176, 82, -26, -184, -118, 15, 136, 136, -109, 14, 129, -168, 166, + 10, -85, 55, -35, -8, -94, 18, 27, 16, -75, 20, -53, -71, -24, 5, 32, -47, 12, -20, -65, 7, 55, 23, -47, 30, -35, 100, -241, 32, -258, -1, 39, 24, 116, 12, 18, 456, -57, -202, -217, 229, 153, -173, 42, -193, -83, 6, 218, -271, 79, -11, 43, -21, 277, -144, 78, -44, -74, 42, -14, 83, -85, -79, -235, 36, -78, -51, 18, -83, 69, -133, -79, -233, -7, -207, -88, -246, 182, 37, -76, 160, -187, -1, -355, -20, 122, -10, 105, 225, -80, -32, 282, 119, 109, 172, -90, + -262, -28, -157, 114, 260, -47, 76, 138, 116, -14, -22, 32, 4, -48, 70, 62, -109, 36, 91, -46, -34, -161, -38, -68, -23, -71, 14, -17, 12, -8, 10, 41, -48, 16, -20, -49, -7, -9, -15, 3, 27, 45, -45, 15, -39, 6, -5, -51, -21, -39, -8, -62, 15, 3, -35, 131, 143, 55, -90, 65, 36, 280, -44, -57, -376, -103, 279, 277, 175, 142, 399, 27, -480, -120, -82, -114, 253, -38, -95, 300, 45, -120, -44, 121, -107, -39, 34, -36, -169, -73, -10, -159, -76, -65, 111, -73, + 215, 213, 19, 203, 139, -88, -33, -66, -313, 38, 63, -293, -44, -81, 104, 273, 40, -272, 39, -103, -186, 152, -45, -194, 88, 78, 216, -15, -28, 163, 188, 211, -215, 154, -28, -33, 55, 227, -11, -57, 70, 37, -191, -22, 261, 61, -18, -30, -119, 87, -44, -51, 8, -5, 60, -1, -82, -55, 109, -10, 43, -46, 52, -37, -30, -37, 27, 61, -29, 192, -490, 205, -54, -111, -101, 85, -47, -289, -310, 39, 482, 134, -351, 80, 286, -205, 37, -51, 170, 0, 157, 423, 307, 193, -8, -34, + -195, -208, 83, -545, -87, 260, 29, -26, -262, -92, -11, -11, -127, -269, 303, -103, -67, -48, -251, -281, -9, -136, 20, 136, 103, 115, -224, -57, -110, -69, 360, -37, -164, 13, 462, -245, 78, 341, 11, -77, -171, 105, 20, 246, -132, 209, 168, 322, 155, 242, 26, -156, 34, -5, -90, 147, 207, -170, 113, 64, -154, 22, 55, 45, 57, -86, 51, -95, -29, -25, 7, 20, 42, 55, -10, 81, -5, -33, 28, 55, -17, 34, -82, 35, -26, 54, -60, 283, 403, 248, 40, -86, -152, -334, -98, 222, + -458, -186, 414, -575, -106, 323, 403, -41, -408, 57, -157, 544, 239, -372, -242, -57, -232, -469, -237, -208, -172, -380, 190, 68, 233, -144, -72, -334, -36, -290, 29, -192, 41, 102, -450, -147, -172, -118, 95, 96, -145, 442, -30, -115, -85, 43, -106, -36, 163, 141, 182, 243, 228, 19, 149, -73, 343, 369, -187, -96, 224, -6, -561, 26, -286, 174, 175, 317, -242, 135, -339, -32, 190, -82, 299, -78, -39, 61, 18, 43, -22, 18, 126, -94, -26, 123, -21, 97, -146, -125, 83, -20, 25, 14, -19, 22, + -88, -22, -17, -37, -60, -20, 44, 55, -5, -58, -312, -373, -186, -360, -519, 368, 34, 207, -288, -295, -412, -275, 125, -302, -275, 375, -95, 20, 88, 215, -167, -123, 60, -98, 56, -16, -185, -349, -552, 184, -397, -360, 17, -93, -27, -201, 91, 108, -450, -7, -100, -173, -251, 145, 29, 451, 52, -249, -17, 44, 184, 80, 396, -31, -434, 188, -93, 198, -260, 59, 146, -762, -365, 273, -25, -79, 116, -36, 482, -14, 305, 269, -393, -451, 25, -500, -13, -22, 9, 77, 315, -8, -199, 184, 237, -218, + 38, 75, 238, -113, 8, -115, 80, -3, 50, 83, 128, 134, -5, -121, 5, 97, 29, 23, -115, 16, -115, -13, 62, -14, 112, 88, -5, 28, 91, -80, 161, 1, -71, 77, 264, 1070, -263, -723, -63, -318, 781, 58, 438, 233, -135, -348, -154, -379, -96, 522, -584, 22, -476, 126, 40, 230, 55, -232, -386, -454, -83, -445, -346, 53, 103, 325, -307, -645, -134, -226, 77, -305, -203, 89, -160, -259, -17, 24, -130, 621, -128, -107, 158, 159, -185, -83, 462, 383, 254, 483, 382, -4, 160, 272, -206, -198, + 57, 195, 324, 128, 658, 67, 441, -130, -255, -169, 933, 161, -121, -118, -336, -326, -231, -231, -269, 101, 215, -235, 73, 226, 115, -217, 42, 231, -60, 125, -119, -40, 52, -47, -28, -78, -152, -31, -138, 65, 113, 51, -115, 144, 97, -91, -101, -162, -48, -51, 39, -42, 70, 46, 12, -23, 1, -132, 49, 199, -936, -352, 475, -116, -476, -454, -148, 506, 276, -414, 231, -550, -220, -70, -355, -495, 416, 222, -433, -159, 946, 214, -412, -578, 16, 304, 59, 48, -650, -25, -68, -477, -268, -196, -371, -185, + 117, 9, -392, -405, 58, 244, 1, 329, 570, -402, 356, 256, 118, 69, 431, 125, 269, 168, 243, -87, -44, 476, 764, 118, -169, 85, -101, -294, 489, -243, -399, -650, -213, -756, 381, -313, -122, -52, -100, -277, -37, 289, -333, -39, 165, -107, -325, 158, 35, 84, -15, -49, -111, -22, -54, 168, 54, 40, 36, 48, 10, 81, 69, 148, -213, -36, 26, 136, -53, 112, -126, 36, 40, -39, -66, 117, -51, -21, 81, 12, 15, -190, -415, 353, 210, -61, 234, 176, 500, 387, -815, -269, 904, -712, -212, -431, + 644, 289, 296, 127, 94, 260, 683, 327, -302, -4, 22, -18, 270, 306, 37, 182, 172, -155, 212, 129, 422, -201, -407, -347, -272, 82, -36, 163, 183, 186, 372, -161, 78, -163, -290, -116, 31, -333, 427, 519, -562, 194, -389, 320, -64, 126, -43, -309, -76, 360, -280, -84, 64, -572, -219, 122, -444, -29, 711, 355, -48, -160, 567, 151, 409, -126, -183, 594, -201, 187, 79, 86, -121, -87, -109, -73, -199, -121, -138, 22, 129, -45, -279, -88, -38, 34, -8, -67, 2, 81, 137, -107, -2, -299, 52, -35, + -56, 206, -2, -17, -119, 127, 36, 187, -62, -8, -122, -11, -176, 566, -47, -131, -471, 21, 44, -126, -11, -217, 82, -674, 616, -124, -219, -426, -483, -49, 587, -106, 163, -362, -210, -100, -354, -426, 390, -240, -197, 347, 336, -475, 166, 181, 412, 342, -124, -300, -190, -461, 509, 336, 169, 364, -376, 259, -54, 238, 262, -245, -19, 830, 695, -523, 211, 432, -330, 104, -774, 234, -418, 348, -242, -266, -188, 926, 54, -267, 83, 313, 42, 187, -497, -54, 831, -25, -325, -505, 17, -373, 236, 242, 291, -516, + -540, -142, 93, 181, 58, 6, 15, 200, -131, -50, -39, -84, 99, 86, -164, -111, -253, 159, -91, 71, 113, 167, 132, 60, 258, 20, -57, 126, -188, 110, 76, 56, 172, 185, 36, -21, 109, 16, -14, -196, -259, -45, -18, -28, -508, -21, -58, -89, 156, -749, -336, -423, 358, -183, 529, 311, 672, -336, -20, -528, 450, 800, -244, -646, 70, -137, 997, -249, -381, 372, 215, 153, 380, 122, -1236, -1, -76, 481, 881, -830, 40, 243, -388, -85, -1120, -260, 583, -933, -548, -290, -355, 365, -217, -336, 505, 146, + 189, 508, 65, -181, 373, 533, -515, -394, 808, 546, 194, 250, 198, -365, -511, -5, 16, -111, 173, -319, 232, -440, 186, 1013, -465, -396, 569, 157, -181, 350, 501, 361, 444, 211, -212, 175, -527, 282, 131, 147, -263, -86, 67, -30, -45, -86, 186, 340, -125, -337, 221, 394, 218, 153, -462, 282, 41, 150, -65, -166, -27, 237, 33, -49, -193, -21, -108, -63, -83, 103, 239, -141, 20, 139, -45, -29, -113, 18, -72, -97, 215, 72, 296, 266, 435, -1008, -1859, -858, -130, 632, 45, 696, 644, -197, 104, -160, + -354, -583, -339, -422, -245, 661, -863, -152, -719, -893, -157, -902, -725, 86, -191, -107, 162, 786, 53, -576, 30, -72, -175, -747, -51, 883, 79, -19, 356, 684, 460, 116, -284, 236, -239, -636, -1161, 1096, -143, 912, -81, 7, -334, -535, 962, -555, -451, -52, -709, -667, 545, 398, 207, -76, 275, -495, 184, -403, -566, -617, -483, -203, 467, 23, 164, -290, 161, -377, 263, 202, 185, -128, -23, 231, -72, -296, -225, -293, -33, -219, -57, -82, -85, 76, 26, -122, 40, 142, -48, -104, -233, -10, -163, -30, -35, -115, + 251, -254, -240, -118, 128, -227, -229, 22, -194, -11, -44, 93, -35, 25, -159, 50, -318, -164, -58, -657, 137, -157, -485, -704, -20, -673, -809, -123, -377, -863, -1224, 149, -471, 235, -101, 465, 1006, 63, 92, -507, -568, 472, 244, -364, -12, 311, -704, -521, -51, 885, -767, 20, 4, 412, -657, 679, 337, 199, -32, -270, -761, 1, -194, 278, -420, -982, 801, -589, -281, -34, 783, -600, 265, -491, 293, -173, -750, 358, -952, -200, -285, 333, 751, -437, 268, 783, -639, 109, 171, 188, 213, -1128, -356, -187, 391, 91, + -19, 212, -217, 457, -100, 107, -453, 382, 79, -695, -337, 333, 394, -55, -123, -270, 368, 51, -12, -725, 100, -348, -569, -165, -129, -69, -342, -416, 131, -95, -224, 120, -61, -60, 5, -112, 20, 224, -444, 42, 60, -141, 286, 283, 304, 128, 175, -207, 64, 7, 72, -97, -17, -10, 114, -87, -211, 179, 1326, 139, 558, 1528, -716, -397, -601, -219, 699, 49, 861, 236, -36, -320, 649, -405, 144, -269, 265, -429, 493, -240, -122, -282, 378, 265, -428, -98, 398, 125, -277, 30, -354, -1143, 491, -599, -887, 547, + 235, 591, -62, -571, -221, -151, 335, 459, 501, 850, 829, -369, 108, -883, 2, -643, -1159, -111, -946, 307, -757, -492, -504, -701, 62, -165, 51, -208, -97, -60, -1226, 196, 177, 280, 576, -109, -977, 563, -636, 364, 349, 793, -438, -391, -269, -152, -571, 228, 121, 74, -144, 202, -290, 288, -56, 62, 75, -344, -11, 139, 335, -87, -216, 154, 229, 298, -193, 6, 156, -16, -41, -106, -228, 158, -13, 103, -131, -13, 192, -129, -215, -114, 23, -83, -371, 586, -157, -115, 41, 116, -106, 112, 130, -52, -20, -74, + -123, 956, 1773, -971, -795, -1374, -2808, -689, -300, 630, 372, -239, -547, 769, 929, 84, -52, 9, -746, -433, -531, -400, -789, -8, -205, -92, 529, -732, 581, 555, -180, 287, -40, -1305, -939, -518, -484, -217, 95, 506, 155, 272, 1254, 1149, 251, -851, -452, -36, -447, -808, -2027, -1695, -772, -181, 74, 442, -1409, -806, 716, 843, 1002, -922, -1129, 365, -693, 1661, -847, -96, -503, -267, 219, 491, -256, -657, 599, 591, -145, 677, 591, -1316, 1166, -764, -8, -225, -798, -222, 387, 296, -76, 152, -492, 9, 229, 324, 501, -387, + 65, -112, -222, -548, -80, -528, 450, -88, -573, 86, -654, -46, 63, -152, -291, 15, 36, 63, 194, -44, -25, 369, 106, -381, -448, 113, -303, -615, -226, -579, 171, 175, 432, 61, -463, -333, 330, 1672, -557, 539, -23, -744, 116, -1502, -338, 323, 30, -874, 519, 1532, 1076, -473, -958, -407, 109, 1611, 218, 42, 8, 746, 767, 202, 587, 476, 901, -255, 104, 577, -523, -796, 450, 1323, 288, 642, 63, 395, -1766, 330, -67, 402, 1735, 702, 236, -169, 779, -174, -362, 278, 485, 1024, -327, 638, 118, 180, 404, 521, + -14, -671, -417, 163, 1309, 900, 698, 758, 633, -175, -1616, -1157, -2218, -25, 679, 1284, 201, -926, 310, -571, 187, 448, 136, -263, -148, 12, -123, 366, -243, -638, 14, 223, 289, -409, -188, -768, 194, 347, -297, -259, 196, -143, -190, -158, -602, -120, 624, 400, 565, -293, -637, -462, 416, 338, -149, -16, -38, 128, -179, 387, -425, -227, 30, 84, 246, -512, 109, -372, 1027, -286, 224, -319, 118, 10, 96, -38, -244, -628, -275, 1375, -64, -630, 148, -115, -528, -413, 68, 728, 1953, 885, 1730, 914, 764, 740, -525, -428, + -503, 222, 1416, 463, -1199, 518, -1289, 645, -820, -169, -721, -762, -45, 103, -20, -954, 1240, -250, 461, -1208, 316, -278, -382, 632, -523, 1261, 140, -491, 56, -369, -523, 358, -860, -179, 1062, -229, 430, -54, -784, 855, -466, -1762, 212, 137, -15, 199, -251, -340, -106, 804, -1525, 902, -365, -207, 992, -610, 287, 373, 1443, 510, 634, -98, 860, -687, 681, 118, -272, 189, 35, 34, -381, -91, 60, -154, -287, 595, 4, -36, -180, 203, -237, 532, 299, 289, 59, 4, -56, 447, -358, -444, 168, 238, -27, 403, -175, -71, + 14, -126, -445, -430, -47, 156, -224, 86, 135, 167, -124, 0, 283, -123, -413, -740, 1214, 1126, 3932, 1587, -2137, -1005, -1045, -1644, 1150, 3533, 1418, 672, -881, -242, -55, -40, 1701, 1164, 745, 2555, -3051, 202, 1604, -384, 335, 1678, 300, -474, 910, -1681, -3374, -318, 340, -1306, -141, 1818, 314, 113, 697, -1424, -2905, -2655, -1202, 888, 1741, 3843, 973, -483, -473, -1032, -2284, -689, 1689, 1698, 1783, 1737, 1096, 909, 272, 403, -1463, -896, 231, 423, 767, 937, 2292, 608, 1339, -862, -849, -1536, -324, -1171, -269, 2389, 3066, 78, -110, -1889, + -2178, -1222, -507, 1231, 663, -120, 467, -155, -299, -560, -528, -59, 153, 127, 686, -34, 1, -328, 28, -412, -127, 17, -613, -268, 30, -155, -27, 386, 345, 788, -321, -122, -762, -613, -460, 817, 525, 270, 285, -227, -673, -538, 46, -372, 699, 1029, -16, -219, -692, -238, -2813, -1718, 997, 2652, 3063, 6409, 3891, 2660, 2329, 1832, -326, -2759, -3043, -5875, -6270, -5922, -3803, -1312, 1310, 2292, 3787, 3743, 2609, 2599, 3296, 3185, 2837, 1818, 1246, 1121, -122, -179, -3670, -2595, -3285, -3952, -1677, -3859, -3136, -5692, -5002, -3526, -2374, -338, 2959, 3610, + 3021, 3252, 2988, 5569, 7222, 6477, 6401, 5672, 5453, 4076, 4050, 886, -2747, -5683, -5460, -8139, -6812, -9888, -11807, -10468, -9967, -5978, -4183, 781, 1970, 4675, 6916, 10692, 9237, 13365, 11520, 8277, 8114, 3716, 260, -723, -2902, -5033, -6045, -7194, -6259, -5644, -5472, -4420, -4582, -3738, -3315, -987, -713, 930, 2121, 2467, 3184, 4560, 5485, 5876, 6122, 4523, 3720, 3634, 1332, 906, -2045, -4857, -6505, -6627, -7448, -4705, -5397, -3573, -2601, -695, 1284, 2565, 3859, 4034, 6034, 6227, 5954, 5076, 4529, 1828, 458, -1105, -2566, -4863, -5762, -4760, -3249, -2843, -2007, -1805, -957, -88, 249, 207, + 885, 1031, 1582, 1377, 1263, 1210, 1355, 992, 933, 1089, 1134, 680, 450, 74, 31, 191, -80, -593, -456, -638, -803, -1060, -933, -786, -513, -621, -483, -411, -108, -240, -176, -88, 195, 54, 195, 333, 542, 409, 530, 432, 608, 513, 410, 136, 191, 75, 68, -161, -122, -156, -55, -206, -110, -204, -132, -171, 47, -47, -66, -195, -103, -176, -105, -286, -195, -174, -30, -92, 47, 19, 140, 80, 222, 166, 221, 109, 172, 74, 168, 73, 151, 47, 105, -16, 39, -80, -9, -110, -21, -109, -11, -91, 9, -72, 27, -54, + 42 } + }, + { + {-157, -423, -35, -68, -57, 5, -70, 25, 42, 172, -58, -8, -159, 11, 161, 10, 117, -35, 49, -68, -100, 2, 111, -15, -138, -7, 134, 42, -57, -49, -6, -20, -31, 0, -22, -47, -6, 26, 19, -7, -105, 155, 214, 6, 25, -88, -49, 16, -111, -125, 74, -102, 73, 93, 94, 34, -14, 24, 20, 70, -154, 12, -20, -113, -151, 3, 75, -59, -8, -19, -11, 105, 52, 13, 41, -36, -125, 47, 20, 105, -128, -98, 72, -59, -27, -97, 21, -57, -53, 0, -42, -47, 12, -26, -12, -53, + 31, -8, 2, -15, 25, -6, 8, -11, -9, -1, -18, -2, -390, -89, 148, -21, -122, 51, -289, -110, -44, -52, -151, -157, 83, 131, 110, -147, -218, 25, -129, -231, 51, -14, 63, 260, -88, -27, -166, 225, 15, 112, 75, 184, 92, 57, -185, -20, -170, -46, 5, -70, 54, 48, -82, -156, 97, 163, 44, -77, -123, -74, 36, -135, -174, -48, 83, -47, 40, 108, 66, -80, 154, 15, 131, -111, -96, -54, -68, 94, -55, 6, 156, 57, 2, -149, 39, -59, 109, 162, -30, 14, -76, 62, 140, -49, + 86, 41, 17, 74, 27, 5, 56, 23, -7, 2, 24, 25, -28, 21, 18, 31, -20, -80, 101, 137, 56, -86, 61, -41, 42, 259, 160, -219, 149, -121, -59, -32, 5, 110, 5, 303, 88, -116, -75, -75, 214, 50, 207, 68, 139, 215, 247, 94, -27, -24, 38, -197, -182, 59, -138, 79, 39, -47, -19, 58, 207, -67, -68, -105, 264, -35, -325, -163, -128, -118, 137, 130, 116, 171, 77, 108, -3, -10, -3, 173, 58, 102, -226, 16, 12, 13, 17, 100, 71, 30, -108, -109, 66, 54, -30, -6, + -87, -112, -90, 64, 112, 15, 9, 39, -29, -3, -23, 21, 22, 13, -13, 34, 55, -6, 8, 13, -6, 15, -19, 40, 3, -6, -22, 36, -63, 39, 14, 30, -2, -37, 11, -17, 579, 124, 92, -73, -36, 53, 44, 151, 207, -12, 303, 117, -102, -101, -4, 140, -13, -81, 162, 20, 435, 110, 89, 15, -38, 18, 69, 81, -16, -2, 235, 30, 258, -131, -119, 81, 386, 108, 96, -36, -162, -68, 55, 9, 0, 11, -231, 14, -100, 91, 77, -95, 57, 80, 59, -113, -110, 24, 43, -2, + -142, 35, -54, 91, -10, 16, 62, -25, 36, -55, 19, 333, 41, 116, 7, -95, 58, 17, 107, -189, -127, 61, -24, 36, -46, 69, 63, 5, -80, -34, -110, -23, -23, 70, -49, -16, 15, -13, -24, -30, 24, -31, -35, -3, 4, 18, -73, -32, 22, 8, -80, -23, -3, -109, -42, -14, 87, -129, -20, 127, -63, -202, 1, 329, -21, 258, 135, 357, 45, 32, 132, -102, -212, -283, 68, -144, 333, 188, 236, -45, -95, 28, 54, 108, 312, 36, 131, -142, 101, -101, 44, -55, 104, 177, 26, 169, + 64, 84, -47, -41, 228, -53, -55, 170, -100, -10, 26, -75, -97, 75, -112, -22, -143, -309, -33, -47, -6, -322, -121, -98, -81, 121, 320, -81, 104, 166, -44, 31, 30, 19, -114, 126, -145, 39, 107, 298, 95, 88, 29, -4, 92, -107, 1, 62, 31, 6, -118, 72, 90, 89, -15, 66, 38, 19, 62, 35, 9, 35, -6, 27, 19, 23, 37, 44, 53, 36, 37, 39, -21, 36, -416, 33, 228, 116, -232, -20, 14, 53, 89, -16, -180, -178, 30, 294, 144, 173, 301, -205, 215, 391, -34, 86, + -221, 74, 83, -194, -101, -44, 93, -196, -253, 46, 30, -222, 19, 67, -43, 464, -25, -333, -21, 112, 264, 95, 119, -214, 60, 65, -188, -14, -31, 322, 199, -56, -111, -253, 109, 99, -148, -7, 61, 96, 101, -130, -3, -30, 304, -257, 32, -68, 274, -21, -67, -116, 34, -120, -279, 6, 212, 62, 133, 32, -101, -41, -51, 179, 72, -50, -7, 163, 122, -48, 17, 25, 35, -4, 66, 44, 40, 3, -23, -12, 13, -25, 8, -34, -11, 26, -86, -21, 162, 142, 54, -109, 32, 66, 492, 322, + 246, 342, 141, -33, 51, 124, -347, 175, 6, 188, -140, -75, -224, 60, 396, -391, -245, -415, 208, -98, 13, -192, 24, -75, -188, 67, 91, -297, -41, 48, -65, 149, -424, -211, 432, 38, -9, -49, 14, -226, -235, 8, -341, -85, 33, 85, -148, -40, 421, -34, 147, 308, -294, -108, 67, 68, 55, -96, -211, 233, -28, -230, 162, -47, 37, 56, -122, -80, -53, -98, -133, -164, -153, -200, -61, -89, -21, -32, -5, 18, -82, -70, 43, 47, 85, -12, -39, -121, -35, -138, -87, -25, 23, -17, 15, -40, + -23, 90, 35, 61, -69, 10, 13, 18, -137, 3, 37, -7, 68, -19, -24, 7, 19, -819, -449, 363, -138, -178, 227, 189, -344, -474, -147, -172, -173, -36, -320, -237, 122, 9, -432, -484, -265, -136, -21, 242, -14, -183, 138, -403, 15, -23, 20, 136, 80, -295, -216, 171, 64, 645, 162, -220, 32, 17, 9, 168, 35, 68, -64, -146, 45, -377, -68, -166, -195, 39, -295, 343, -43, 141, 250, 70, 133, -20, -159, -10, -19, -203, 262, -111, 464, -19, -9, 18, -118, -254, 80, -200, -78, 268, -348, -347, + 232, 216, 190, -294, 212, 85, 124, -12, 55, 55, 165, 67, 42, 119, -14, -10, -98, -80, -14, 80, -105, 12, -11, -65, -37, 25, -136, -86, -101, -20, 46, -2, 104, -36, 108, 8, 41, 15, 84, -66, -50, 94, -42, 12, 9, 164, 605, -338, 289, 118, 216, -86, -327, 46, -84, -308, 625, -44, -171, -614, 380, 104, -4, -230, -263, 7, 635, 235, -22, -63, -269, -221, 185, 81, -209, -149, 223, 55, -6, 190, 295, 46, 388, 437, 268, -101, 99, 36, 75, 228, -321, 341, -20, -173, -259, 2, + 227, 157, -307, 68, 248, 38, -221, -484, -437, 116, 198, 33, -167, -23, 355, -161, -262, -511, 58, 100, -378, 144, 385, -173, 300, 103, -349, -261, 31, 363, -34, 382, -62, -133, 84, 195, 56, -65, -98, 66, 176, 140, 28, 227, 46, 163, 45, 223, 38, 138, 2, 110, 63, -54, -158, 15, -186, -26, -73, 31, -20, -7, -164, -15, 83, -82, 16, -19, 17, -10, -117, 19, -21, 731, 477, 111, -148, -76, -104, -499, -204, -5, 318, -228, -131, -106, 4, 529, -412, -108, -25, 249, -88, -301, -509, 183, + -352, -158, -220, -234, 72, -395, -195, 354, 526, 26, -332, -292, 485, -52, -265, 510, 14, 34, 19, -551, 223, -203, 199, 189, -378, -38, -384, 151, -372, -60, 153, 214, -126, 131, -451, 313, -37, 214, 175, 131, -102, -91, 446, -307, 221, -73, -383, -227, -27, 406, -232, 192, 52, -120, 3, -445, 565, 353, -69, -150, 276, 125, -84, -141, 29, -93, 141, -25, 73, 240, 83, 191, -2, 71, 26, -30, 3, -12, 159, 69, 222, 43, -127, 168, -67, 1, 120, -112, -41, -57, -52, 107, 60, 58, 87, -5, + -27, 215, -72, -66, 280, 60, -194, -428, -29, -557, 92, 55, 270, -219, -59, 151, 116, 166, -386, 544, 377, 76, 277, -122, -548, 133, -234, -249, 250, 629, 104, -167, -232, -495, -4, 29, 765, -298, -17, 28, -29, -458, -528, 420, 11, 241, -72, -587, -346, 53, -104, -120, -174, 393, -87, 257, -277, 546, -643, 321, 326, 203, 170, 165, 500, 265, -41, 113, -1, 504, 745, -81, 55, -215, 309, 509, -349, 111, -872, 572, 581, 396, 540, -243, -439, -26, -68, -123, -96, -256, -186, -91, -27, -141, 83, 165, + 58, -240, 45, -131, -147, -85, 99, 100, -46, -56, -25, -37, 23, -232, 76, 39, 151, 39, -13, -2, 31, 139, 44, -118, 96, 5, 12, -631, -93, -807, -414, 317, -330, -718, 67, -387, 18, 14, -460, -438, 198, 422, 127, -492, 235, -553, -194, -204, 173, -227, -104, 265, 45, -182, -393, 416, 404, 525, 69, -59, 19, 168, -40, 215, -237, 283, -111, 326, 262, 197, -95, 13, -507, 173, -128, 382, 69, -887, 136, 437, 588, -338, -462, 553, 251, 389, -693, 343, 868, 914, 58, 22, 520, -360, -480, 307, + -531, 199, -247, -209, -117, -1144, -660, -557, 411, 156, 116, -406, -165, -307, -58, -165, 449, 107, -179, -399, -89, 258, -41, -110, 79, 270, -96, -160, -77, -59, -18, 210, 211, 184, -185, 241, -12, 69, 275, -124, -124, 240, 431, -101, -141, -69, 52, -78, -297, 48, 217, 58, -299, -286, 135, 97, -16, -18, -52, -213, -146, -475, -913, 698, 73, 234, -118, 494, 13, -421, 326, 133, -150, -254, -200, 63, 119, 438, -249, 344, 109, 624, -895, -240, -142, 115, 365, 530, 120, -430, 290, 417, 351, -98, 122, 25, + -148, -60, 25, 135, 48, 309, 50, -389, 363, -403, -516, 80, 372, -181, -134, 135, 181, 321, -184, 152, 724, -289, -771, -998, -505, -676, 306, 587, 375, 143, 352, 207, 389, -334, 440, 229, 178, 459, 596, -186, -134, 163, -40, 537, 207, -82, 90, -656, -460, 91, -27, 116, 43, 138, -124, 345, -184, -211, -205, -345, -127, -69, 112, 92, -53, -297, -19, 98, 31, -119, 69, 4, 113, -124, 49, 23, 136, -67, 211, -132, -153, 44, -28, -111, 33, 146, 11, -23, 912, 89, 142, -189, 331, -1044, -462, -713, + -738, 293, -644, 633, 718, 32, 155, -110, 131, -682, 280, 757, -432, -879, 115, -330, -282, -857, 147, 316, -5, -116, 274, -489, -83, 319, -177, -433, 51, -216, 446, -296, -167, 420, 362, 775, 101, 188, -73, 209, 274, 479, -140, -15, -300, 632, -799, 856, 28, -341, 398, -311, -232, 787, -1138, 185, -242, 222, -444, 212, 448, -233, -45, -120, -191, -101, 834, -950, -328, 1596, -604, -705, 688, 413, 458, -402, 28, -400, -227, -63, -460, 99, 58, -119, 161, 146, -211, -389, -104, -33, 149, -343, -245, 8, -38, 86, + 210, 508, -236, -12, -60, -54, 142, 57, -307, -229, 238, -198, 87, 62, -189, 69, -47, -310, -259, 151, 94, -48, -11, 192, -458, -698, 65, -263, -241, -392, -498, 627, 265, 43, 290, 742, 433, -47, 148, 500, 631, -559, 260, 534, 228, 198, 729, 356, 150, -19, 327, -34, 370, 311, 166, -339, 645, -529, -69, 814, 799, -187, -713, 271, -13, 699, 1194, 271, -186, 88, -689, -78, -184, -144, 11, 614, -264, 272, 733, 128, -682, 453, -37, 290, 688, 976, -277, -254, -86, -767, -1130, 34, -515, -79, -624, -60, + 18, 88, 460, -9, -323, -531, 389, -161, 332, 16, 621, 235, 228, 6, -195, 354, -268, -305, -95, -228, -92, 22, 23, -79, 94, 141, 10, -31, 180, -152, -222, 139, 158, 36, -192, -225, -135, 189, 248, 37, -36, 280, 75, 136, 114, 201, 55, -32, -146, 84, 157, -319, 255, 763, -1430, 787, -603, -1409, -418, -355, -51, -325, 170, -389, -874, -527, -262, -79, 99, -359, 350, 684, 24, -43, 186, 42, -129, -254, -145, 185, 202, -61, 192, 840, 230, -246, -836, -134, 587, -718, -339, -274, 7, -56, 451, -150, + 52, 622, 220, 690, -100, -327, -152, -179, -182, 332, 34, 224, 419, -742, 106, -198, -464, -350, 721, 519, 23, -355, 143, 303, 29, 209, -500, -1231, -572, -452, 447, 43, -60, -210, 85, -141, -392, -405, -213, 495, 372, -558, -697, -274, 45, 418, 167, -137, -189, -146, 95, -311, 43, -214, 14, 314, 336, 86, -179, 106, 241, -12, -56, 177, -253, 343, 308, 117, -9, -18, -38, 287, -118, -158, -179, -254, -248, 75, -94, 101, -74, 48, 180, -94, -181, -262, -75, 115, -187, 401, -552, 667, -43, -1084, 230, -529, + -96, -89, -116, -695, 226, 24, 552, -1179, 30, 564, 80, -289, -580, -58, 349, 492, -408, -162, 282, 563, 536, -520, -94, -836, 394, 405, 268, -247, -55, -237, -78, -287, 89, 587, -213, -250, -197, -354, 690, 572, -49, 811, -29, 280, -720, 584, 274, -833, -257, 924, 397, 240, 190, -456, -341, -488, 821, -436, 636, 636, -732, 1694, -360, 1045, 52, -255, -452, 781, 313, -634, -372, -1344, 536, -199, 616, -834, 918, -717, 274, -289, -205, 584, 60, 38, 338, 217, -151, 376, -46, 97, -273, 35, -36, -193, -275, -9, + -305, 128, 133, -91, 266, -115, -159, -243, 157, 12, -37, -461, 199, -109, -531, -190, 151, -172, -276, 162, -151, 130, -281, 109, -287, -72, -46, 131, -71, 5, -97, -122, 396, 717, 45, -576, 272, -1125, -315, -1020, -1444, 63, -562, 199, -118, -210, -556, -360, 309, 877, -729, -139, -1248, -1071, 289, 451, -690, -696, 34, 173, -1160, 77, 15, 614, -526, 39, 486, -306, -608, -653, -333, -594, -510, -621, 883, -1118, -713, 1043, -42, 306, -868, -133, -254, 39, 1437, -188, -37, 160, 669, 33, -649, -267, -471, 173, 1722, 354, + -619, 1321, 934, -820, 963, 1612, 5, -605, 1077, -171, 1134, 1047, 78, -36, -315, 736, 576, 350, -618, -185, -401, 928, -123, -608, -312, -611, -278, 641, 63, -311, -119, -384, -75, 575, -276, 155, -62, -514, 569, 87, 225, 297, -377, 133, 523, -76, 15, -266, -7, 62, -179, -142, 95, 412, -257, 174, -341, -141, 16, -93, 382, -129, 13, 57, 137, 33, -188, -23, -108, 818, -2058, -1223, -1341, -444, -897, 1112, 407, 913, -144, -1736, -277, 292, 1190, -41, 268, 1112, -423, -790, 71, -45, 1383, 915, -467, -625, 1469, 112, + 729, 365, 1369, 1201, 907, 104, -793, -418, -610, 1161, -569, -783, -445, 48, -48, 516, -517, 189, -2363, 269, 347, 391, -999, -905, 262, 831, -1031, 399, -595, -445, -700, -57, 701, -480, 772, -198, 290, -1460, -962, -34, 756, 546, -1086, -1145, -555, 109, 1194, 502, -140, -854, -1009, -335, 182, 860, -100, 285, 552, -221, 183, -571, 328, 202, -379, -295, 5, 440, -451, -19, 677, 108, 75, -3, -229, -482, 94, -535, 595, 530, 377, 43, -80, -628, 363, -132, 697, -183, -854, -514, -134, 792, 193, -180, -115, -654, -345, -270, + -73, 351, 314, -662, -394, -411, -426, -155, 85, -70, -260, -412, -445, 37, -61, -218, 386, 2625, 291, -1439, -3159, -313, 1908, 449, 845, -112, 1169, -219, 526, -292, 671, 891, 510, -471, -1029, 1210, 1424, -342, -1369, -872, 166, 783, 289, 264, 71, 180, 113, 178, -254, -1636, 10, 969, 784, -343, 96, 587, 1360, 798, 676, -816, -534, -161, -128, -1225, 867, 479, 900, 1777, -910, -620, -66, -525, -416, -813, 1414, -872, -898, -964, -312, 1761, 472, 672, -23, -173, -398, 1087, 912, -483, -1028, 338, -122, 408, -963, -403, -555, -763, + 465, 715, 151, 7, -381, 198, -141, 664, 67, -255, -124, 208, 451, 463, -269, 280, 168, 136, -12, -534, -57, -437, -157, 6, 79, 123, 158, 155, 457, 646, 602, -71, -139, 59, -284, 349, -403, -65, 338, -35, -76, -679, 336, -677, 225, -163, 108, -72, 78, -45, -410, 217, 205, -47, 138, -36, 117, -67, -109, -32, -37, 12, -24, 13, 12, -149, -65, -36, 84, 19, -44, -86, -91, -5, 21, -44, 2, -58, -18, -64, -756, 59, 2040, 1555, 253, 110, -1096, -2135, -1852, -920, 1533, 1659, 1740, 950, -247, -1114, + -1012, -680, 443, 665, 1193, 97, -895, -775, -160, -777, -349, 155, 1235, 1739, 1142, 528, 504, -1111, -123, -2221, -2461, -1559, -738, -692, 1160, 1793, 2009, 1796, 1574, 635, 112, -772, -202, -1235, -2156, -194, 208, 195, 724, 412, 735, -2438, -1317, -882, -1397, -612, 1046, -637, 707, 79, -633, 499, -527, 563, 683, -533, -1033, -2164, -2072, -1571, 768, 249, -290, 382, 120, -12, -985, -717, -1839, -633, -673, -95, 1359, 1424, 219, 725, -439, -1023, -1789, -1206, -1102, -61, 558, 292, 456, 459, -322, 269, -303, 280, 85, -34, -56, 227, 231, 454, + -99, -137, 458, 395, 90, -167, 359, -3641, -1857, -972, 1228, 281, 4671, 4781, 3610, 4661, 4891, 4438, 3192, 2891, 3215, 1275, -187, -1989, -3066, -4246, -4119, -6148, -3725, -2428, -1923, -2742, -1438, -398, -2050, -1597, -1680, -383, -1007, -362, -1365, -697, 820, 843, 256, -255, 893, 718, -2068, 429, 1404, 3064, 2253, 2917, 1201, 1158, 4867, 2632, 4981, 1665, 4671, 3221, 4079, 5495, 5210, 4221, 4745, 5266, 5736, 4895, 5654, 3854, 5735, 4601, 4087, 4353, 2381, 4873, 2362, 1430, -1790, 117, -2645, -2978, -4550, -5377, -8260, -8069, -7618, -7128, -6715, -5679, -6924, -8527, -8406, -6976, + -7380, -6944, -6965, -5947, -6473, -6211, -4630, -5117, -3929, -3673, -3383, -2160, -2787, -638, -1035, 475, 647, 2027, 3003, 3144, 3635, 3224, 4865, 5511, 5463, 6310, 6594, 6529, 4981, 4444, 3903, 3615, 3523, 3612, 3398, 2584, 1666, 1889, 1462, 1133, 757, -594, -769, -812, -989, -1213, -1362, -963, -1057, -850, -864, -754, -542, -654, -534, -524, -636, -591, -651, -521, -428, -578, -660, -300, -147, -207, -186, -36, -50, -113, -117, 49, 232, 246, 254, 252, 237, 337, 355, 357, 246, 174, 134, 225, 242, 143, 40, 48, -32, 103, 81, 86, 62, 86, 72, 72, + 165, 335, 233, 245, 217, 270, 253, 194, 122, 120, 53, 46, -66, -127, -240, -220, -356, -444, -483, -499, -578, -576, -606, -598, -586, -625, -637, -610, -550, -488, -452, -327, -300, -248, -239, -118, -75, -1, 32, 84, 99, 163, 172, 186, 144, 150, 113, 112, 72, 73, 39, 42, 11, 16 }, + {-234, -464, -81, 6, -106, -218, -72, 160, -257, -142, -85, -50, 82, -37, 91, 41, 80, -9, 98, -86, 16, -38, 19, 247, -53, -15, -123, 153, 95, 74, 191, -98, -55, 65, 171, -46, -11, -138, -151, -101, 108, -134, -115, -15, 154, -208, -44, -174, -84, -50, 24, -16, -125, 160, 27, 144, -58, -36, -179, -4, -63, -68, 103, 58, -32, 56, 114, -33, 49, -82, -47, -20, -77, 69, 24, 52, -122, 88, 51, 198, 118, -32, -126, -10, 28, 16, 39, -6, -43, 2, -29, 0, -35, 13, -34, -2, + 38, 13, 20, -24, -17, 18, 26, 12, -4, 2, 0, 16, -382, -137, 109, -101, -46, -42, 51, -19, -101, 159, 142, 48, -18, 74, -196, -28, -194, -97, 143, -23, 25, -19, -22, 4, 299, 274, 122, 147, 173, -33, -20, -59, 153, -14, -58, 44, -89, 62, 110, -55, 124, 141, 273, -106, -129, 118, -71, 5, 57, -158, 9, -82, -93, 211, 124, 152, -87, -113, 80, -132, 93, 407, 23, 29, 91, 41, 37, 232, -124, -30, 42, 31, -115, -84, -118, -55, -43, 107, -18, 108, 109, -109, -118, -29, + 74, 104, -123, -23, -37, -83, -10, -79, 21, -4, 43, -23, 16, -30, -8, -23, 19, -111, 120, 195, -94, 97, 306, 103, 69, -214, 177, 47, -276, 117, -78, -165, 66, -23, 64, 160, -169, -176, -79, 240, 6, 119, 248, -370, -299, 49, 182, -134, 11, 247, 63, -32, -75, 296, 36, -72, 41, -268, 30, -148, 136, 24, 144, -73, -37, 66, 4, 19, 8, 140, 112, -152, 87, 124, -210, 25, -95, 40, -49, -162, 2, 140, 121, 270, -168, 209, -139, -27, 123, -135, -202, -72, 9, -12, -11, -21, + 39, 86, -118, -1, 55, -10, 47, -96, -56, -38, -71, 21, -16, -55, 30, 32, -47, -71, -4, -16, 73, -3, -12, 14, 15, -12, -22, 50, 16, -39, -20, -30, 4, 51, 5, -17, 616, 276, 373, -30, -103, -135, -135, 73, -113, 172, -19, 235, 15, 124, 155, 119, 103, 135, -457, -135, -43, -97, -84, -144, -325, 15, 224, -138, 134, -110, -162, -123, 19, -104, -38, -106, -7, 269, 15, 121, 171, 221, -104, 52, -49, -171, 195, -108, -7, -169, 124, -2, 3, -47, -78, 57, 174, -73, 98, 93, + 78, 298, -299, -127, 8, -165, -213, -85, -261, 39, 308, -212, -100, -242, 16, -76, -115, -284, 167, 218, 87, 152, -77, 25, -57, 63, 3, 151, -38, 65, -2, -38, 53, 36, 70, 58, -9, 14, 38, 15, 30, -2, -28, -54, 28, 14, -36, 27, 30, -9, 14, 36, -10, -32, -11, -10, 189, 275, -153, 144, -126, -58, -51, -337, 244, -70, -38, 392, 241, 263, -108, 11, 44, -59, 85, -198, -8, -135, 157, -154, -109, -15, 25, -190, 35, 22, 249, 3, -346, 199, 183, 265, -44, 68, -192, -142, + -62, -138, 52, 37, -54, -20, 141, 225, -309, -65, -3, -125, -134, 204, -166, 77, -163, -211, -161, -104, 71, 31, 376, -63, -105, 114, -117, -32, -104, 107, -96, 137, -71, -62, 91, 229, 60, -213, -2, -104, -220, 62, 150, -50, 32, 54, 4, -22, 76, 3, -91, 2, -35, -15, -49, 73, -20, -58, -67, 10, 63, -29, -8, -88, 5, 17, 27, -15, -79, -38, 63, -26, -85, 34, -472, 454, 242, -269, -274, 113, 358, -4, 104, 420, 139, 127, -72, 219, 198, 231, -416, -254, -253, 199, 170, 219, + 9, -252, 103, -38, 113, -363, 139, 221, -172, 96, 177, 51, -7, 39, -59, 319, 215, 171, 5, 111, 244, -219, -119, 11, 324, 208, 126, -244, 8, 167, 193, -68, 59, 190, 233, 75, 216, 87, -26, -200, -3, -333, -138, -160, 26, 110, -195, -78, -354, 154, -100, -2, 186, 273, 328, 41, -36, -205, -63, 105, 111, -217, 67, -98, 78, 15, -75, 1, 37, -69, 29, -18, -84, -42, -53, 52, 62, -11, -49, 34, -38, -27, -66, -9, -15, -75, 58, 47, 59, 402, 123, -65, -183, -470, -232, 293, + -104, -432, -118, -66, 64, 244, 365, -18, 106, -81, 181, -202, -220, -232, -420, 226, 125, -346, 9, -251, -99, 228, 126, 187, -54, -45, -62, 400, 307, 331, -151, -277, 220, -34, -101, 285, 48, 281, -11, 158, -197, -7, 138, -592, -92, 32, -437, 116, -113, 410, 257, -246, 18, 374, -40, 192, -126, 258, -120, 53, -100, 9, 177, -239, 259, 137, 148, 46, 345, -133, -399, 72, 273, -127, -248, -175, -128, 288, 4, -119, 10, 10, -57, -52, 16, 58, -34, -34, -22, 64, -34, -104, 28, -115, 107, 73, + -3, -9, 27, -32, 46, 8, 32, 9, 13, 129, 42, -63, 34, 18, 58, -16, 13, -958, -203, 514, -415, -150, 436, 165, -139, 46, -362, 323, -41, -583, 41, -31, 220, 216, -116, -457, -196, -175, 9, -244, -135, -311, -90, 338, -279, -140, -108, -181, -192, -260, 176, 35, 219, 38, -164, -252, -249, -52, 164, 243, -87, -223, 232, 96, -350, -390, -795, -71, -255, -154, 116, 120, 71, 355, -39, -171, -23, -185, 405, 215, -81, 216, -230, 113, 92, -225, -100, -202, 141, 99, -371, 242, 371, -26, -20, -379, + -149, 165, -120, 108, 368, -126, 79, 35, 26, -119, 19, -21, -157, -95, -17, 53, 6, 41, -164, 17, -89, 39, -96, -93, -58, -8, 17, -72, 18, 37, -13, 14, 65, 36, -131, -87, -43, 11, 44, -23, 45, 7, 38, -32, 7, 165, 642, -303, 248, -162, 5, 359, -99, -168, -80, -40, 71, 242, 844, -52, 57, 227, 61, -1, -385, -413, 69, 51, -249, -136, -52, 227, -96, 40, 2, 96, -98, 484, 279, -234, 276, 239, -289, 47, 133, 93, -75, -105, 415, -362, 158, 446, -150, 51, 296, -36, + 258, 134, 11, 133, 223, 292, 194, 20, -4, -209, -219, 4, 32, -715, 472, -113, -213, -251, -514, -593, -375, 67, 299, -111, 43, -52, 297, -112, -227, 129, 77, -102, 43, 194, -184, 34, -235, -85, -102, 54, -21, 121, 85, 23, -28, 60, 93, -6, -169, 95, -1, 146, 151, 68, -65, 127, 36, -24, 3, 4, -110, 127, -5, -90, 133, 248, -43, -57, 136, -54, -83, -37, 118, 865, 860, -21, -719, 144, 143, -78, 184, 111, 59, -4, -124, 702, 126, -108, -781, -433, 181, -44, -274, -463, 62, 83, + 117, -112, -514, -542, 589, 564, 172, 518, -442, 64, 228, -89, -281, -497, -250, 93, -24, -231, 240, 9, 232, 195, 11, -535, -316, -249, -46, 60, 69, -88, -155, 41, 85, -478, -124, 83, 106, -215, -605, -137, -154, 449, -20, 204, -204, -149, -272, -297, -179, 53, -25, 378, -224, 69, 429, -26, 213, 197, 417, 97, -124, -211, -191, -70, 251, 43, 253, 140, -23, -3, 10, 25, -117, -139, -2, -31, -16, 45, -30, 36, -169, -35, 99, -2, 62, -281, -35, -8, -58, 62, 42, 40, 47, 69, 70, 79, + -28, -128, 153, -98, 372, -190, 63, -143, 26, 101, -238, -157, -424, -463, -308, -118, -24, 14, -260, -237, -486, 234, -487, -621, 399, -371, -478, 445, 81, -98, 472, 276, -372, 343, -944, -62, -245, -98, -445, 776, 359, -225, 110, 246, -165, 271, 1, 14, -225, 263, 298, 409, -642, -20, -8, 191, -293, -108, -298, -287, 503, 166, -384, 198, -239, -247, -412, -740, 190, 492, 29, 495, 666, -38, -279, -634, 45, -80, 36, -157, 127, -277, 595, 334, 520, 108, -69, -158, 209, 249, 107, -44, -80, 25, 277, -48, + 113, -176, 72, -293, 23, 38, -135, 279, 155, -70, -188, -158, -58, -13, 83, -185, 42, 35, -20, -128, 43, -279, -63, -65, -85, 50, -12, -541, 76, -1202, -801, -581, 316, 590, -843, 193, 605, 367, -5, 216, 570, -264, -30, -169, 21, -372, 266, 1, 35, 93, 763, -42, -331, -330, 185, 555, -222, -570, 172, 563, 335, -81, 279, 182, 269, 55, 229, 381, -44, -653, 37, 196, -604, -448, 599, 463, -455, -305, 149, -35, 296, 719, -151, -144, 142, -41, 272, 130, -260, -211, -95, 208, 197, -197, -520, -97, + -785, 742, 130, -141, 75, 305, -12, -351, 133, -155, -221, 172, -43, -347, -560, -188, -226, 462, -70, 150, 93, 53, -40, -45, 77, -129, 25, 165, -16, -92, -46, -389, -114, -14, -68, -284, -247, -110, -53, -29, -78, -19, 9, 207, 79, -39, -81, 29, -71, -68, 142, -73, -159, -52, -119, 11, -147, 1, 105, 28, -144, -50, -461, -21, 82, -568, -147, 425, 557, 391, 1037, 623, 940, 349, 249, -485, 529, -178, -57, -389, -256, 508, -164, 1153, 540, 333, -59, 267, -179, -539, -269, -334, 246, -315, -4, -337, + 201, 470, 427, -28, 616, 512, 28, -178, -230, -419, -141, 966, 378, 1113, -354, 6, -34, 260, 897, 307, 26, 575, 662, 695, -59, -409, -146, -112, -114, 462, 319, 438, 672, -414, 1013, -676, -1266, -195, -392, 261, 619, 302, -338, -33, -368, -277, -179, 7, 513, 88, -138, 82, 44, 155, 168, 113, 204, 57, 131, 48, 145, 12, -403, -155, 2, -379, 48, -396, -203, -239, -217, -186, -132, -50, 30, 118, 427, 61, -259, 126, 32, 384, -64, 168, 4, 9, -196, 52, 610, 971, -480, -394, 360, -303, -46, -148, + 139, 417, 469, 670, -741, 828, -297, 61, -382, 334, 643, 243, 124, 26, 781, 172, -20, -276, -113, -817, -102, -408, -954, 61, -53, 371, -994, -217, 239, 348, 836, -251, 247, 431, 73, -138, 240, -244, -52, -1271, 114, -554, -620, -719, 286, -1140, 373, -441, -557, -783, 692, 726, 738, 135, 138, 680, -959, -103, -293, 382, -1140, -402, -115, 358, 294, 227, 465, -436, 172, -524, -149, -317, -118, -113, 17, -497, 227, 300, -50, 14, -237, -83, 239, -323, -3, 148, -387, 172, -347, -3, 223, 45, -284, -195, 115, -166, + 182, 119, 209, -33, -248, 474, -224, -121, -307, 208, -102, 25, -284, 33, -346, -61, 260, -86, -145, -372, 46, 44, -45, -486, -904, -17, -323, 1069, 222, 756, -249, 1032, -651, -1219, 273, 205, 137, -607, -691, -542, 200, -546, 237, -291, 809, -267, -125, 583, 16, -1459, -608, -22, 957, -113, -304, -838, 142, -209, -722, -854, -102, 153, -296, -327, -855, 554, -214, 197, -427, 15, 250, 150, 749, 4, -262, -982, -348, 468, -672, -346, 245, 533, 417, 1068, 815, 11, 618, 632, 214, 20, 369, -323, 1615, -750, -1771, 465, + -1508, -64, -1181, -14, 1438, 175, -690, 223, 242, -454, -372, -514, 107, -160, 459, -371, 306, -617, 168, -27, -103, -146, 415, 793, 247, 318, 550, 161, -555, 153, -208, 362, -118, -180, -24, -46, -151, -463, -301, -210, -28, 56, -36, -297, -654, -416, 96, -124, -14, -258, 86, 461, 181, 667, -1017, -693, -414, -370, 423, 631, -367, 33, 582, -1168, 96, 262, -864, 443, -281, 389, 160, 440, 59, -576, 596, -748, -151, 1419, -576, 514, -330, 578, 546, -197, -617, 656, 1742, -959, 256, -1270, 647, 373, -673, 746, 81, -1523, + 227, 64, 700, -195, -98, -805, -764, -407, 1898, -298, 968, -852, 640, 299, -165, -657, -112, 523, 1070, -395, -349, -122, 216, 915, -227, -228, -679, 201, -1026, -470, 744, 883, 107, -83, -478, -803, -2299, 1429, 553, 817, 87, -759, 831, -474, 355, 482, 484, 1102, -16, 251, 312, -133, -481, -170, 816, 493, -450, -107, -305, -87, 384, 105, -528, -352, 514, 111, -156, 257, -445, -281, -89, 216, 365, 227, 74, 277, -224, -307, 59, -35, -399, 43, -412, -21, -250, -66, 70, -219, -394, 129, -961, 669, 674, -1324, 134, -700, + 92, -1457, 1462, 1257, -123, -669, -223, -273, 713, -732, 918, -1219, -695, 338, 436, 91, 421, 1146, 339, 525, 149, 546, 400, -266, 122, 462, -25, -46, 928, 407, 1216, -117, 696, -4, -877, 899, -460, -107, 286, -844, -559, 320, 1323, 714, 482, -1700, -387, -1193, -4, 1896, 1258, 1434, 120, -1400, 441, 1411, 304, -358, 1267, 132, 849, -2174, -1794, 1290, -87, -588, -1373, -304, -511, 587, 554, 643, 670, -277, 214, 1196, 1115, 1155, 103, 1661, 838, -298, -652, 8, -317, 97, 854, -136, 45, 614, 687, 64, 11, 261, 761, 263, + 361, 510, 191, 397, -11, -226, -89, -87, 40, 528, -194, 92, -424, 639, 320, 279, 2, 322, 10, 1096, 292, 1126, -295, 984, 463, 144, 440, 423, 492, -131, -78, 672, 218, 565, -1255, 740, 990, 75, 338, -896, 700, -408, 336, 32, 3, 592, -183, 385, -123, -718, 192, -49, 804, 702, 999, 334, -764, -630, 649, 729, 338, 65, 231, -198, -626, 108, -232, 889, 620, 543, 704, 723, -995, 1099, 1079, 793, -535, -474, -692, 958, 559, 1572, -955, -942, -730, -1384, -361, 1503, 239, 1181, -1255, -1339, 293, 857, -1174, 189, + -935, 378, -1079, -80, 513, 548, -981, 393, -746, -1481, -49, 1768, 912, 720, -492, -1253, 1915, 1556, 435, -1713, -67, -396, 1226, 635, 760, -886, 673, -393, 440, -610, 219, -683, 1002, -188, 165, -1186, 346, 160, -56, -257, 242, 137, 124, -729, 311, 766, 47, 466, 383, 329, 49, 162, 14, 54, 32, -222, -29, 252, -6, 490, 400, -199, -44, 236, 92, 384, -693, 467, 46, -3, -2434, -477, -66, 47, 841, -2239, -261, 1039, -1668, 393, -382, 1956, 1022, -1169, 289, 1321, 130, -504, 427, 329, 169, -9, -133, 116, 211, 462, + 1341, 1090, 1173, 816, 1477, 733, 1511, 635, 1340, 31, 832, 761, 824, 643, -62, 259, -1031, -603, 1959, 36, -784, -208, 615, 1044, 2109, -273, -1161, -573, -856, 1213, 1374, 1551, 478, -44, 1042, -1759, 1612, 623, -849, -4, -2754, 77, -1820, -2513, -628, -1472, -643, 2872, 2611, 2466, -1930, -186, -219, 1942, 3026, -662, -852, 1688, 1723, 1493, -174, -226, -835, -1042, 156, -375, 467, 740, 636, 452, 46, 297, 813, 152, 8, -216, 49, 68, 223, 180, 169, 851, -70, -486, 516, 622, 146, 986, 234, 484, 1067, 1436, 1045, 774, 312, 156, + 419, 988, 433, 1012, 746, 492, 702, 269, 951, 840, 678, 1040, 595, 204, 291, -689, 1753, 2090, -1728, -1620, 557, 1825, 64, -882, 24, 482, 571, -1543, 585, -222, 823, -855, -384, -999, 1054, -160, -439, -936, 691, 378, -140, -794, 382, 324, 202, -704, -79, -54, 812, -617, -126, -893, -210, 282, 715, -929, -327, 948, 850, -275, -565, -25, -278, 788, -441, -276, 413, 272, 516, -466, 163, -634, 729, 814, 420, 108, -631, 720, -502, 1127, -817, 901, -1425, 955, 149, -108, -994, -328, 358, -284, 126, -276, 316, -152, 351, -342, + -408, -303, 336, -3, -8, -103, -210, 124, 391, -213, -13, -6, 83, -48, 98, -93, 295, -22, 373, -337, 94, -173, 379, -400, 375, -413, 265, 77, 466, -136, 445, -407, -252, -99, 699, -357, 550, -221, 117, 30, 405, -199, 230, 24, 53, -70, 174, -87, -174, 406, -217, 23, -160, 92, -146, 179, -250, 306, -225, 247, -328, 289, -430, 412, -230, 267, -281, 283, -280, 291, -246, 261, -340, 285, -276, 292, -320, 337, -306, -56, -376, 1681, 1789, -1053, -624, 355, 1709, 1062, 637, 613, -272, -715, -216, 402, -6, -168, + 510, 9, 359, 44, -191, -640, -170, -37, 48, -25, -520, 582, 97, -233, -13, -17, 9, 376, 689, 294, 70, -248, -356, -92, 224, 462, 622, -347, -342, 78, 629, 284, 141, -283, -570, 487, -100, 14, 34, 157, 151, -69, -20, -371, 58, 329, -155, 197, -109, -265, 169, -50, 92, -20, 286, 194, -424, 126, 21, -771, -1025, 30, 61, 234, 625, 69, -274, -269, 247, 269, 409, 279, 19, 119, -42, -309, -127, 48, -424, -406, 263, 279, -5, 313, -442, -80, -19, 23, -135, 71, 241, 333, 164, 281, -175, -347, + 206, 33, -84, 238, 134, -163, -591, -2222, 945, 3418, 3158, 2690, 1078, -2559, -1596, -2301, -2571, -2305, -667, 494, 1943, 2018, 2424, 1600, 1620, 37, -1698, -1627, -2000, -1570, -869, -62, -559, 606, 753, 1214, 1339, 1354, 811, 65, 362, -302, 195, -932, -672, -862, -1401, -1117, -851, -606, -996, 136, 1707, 1923, 1078, 2011, 502, 1172, 607, 342, -504, -1078, -1471, -2072, -1584, -2363, -975, -1054, 680, 676, 1977, 2273, 2028, 1802, 1766, 1101, 137, -620, -1885, -1187, -2463, -2105, -2922, -476, -260, 718, 927, 1663, 1962, 1637, 1467, 1083, 643, 88, -543, -788, + -1055, -1635, -1145, -1424, -987, -510, -145, 319, 315, 1555, 1438, 1421, 1112, 811, 98, 503, -563, -939, -728, -2029, -2361, -459, -158, -106, 1153, 940, 1258, 877, 1150, 347, 298, -93, -486, -630, -808, -900, -551, -120, -698, -373, 560, 793, 535, 686, 472, 338, 90, -67, -242, -347, -265, -433, -224, -89, -161, -222, 49, 160, 37, 246, 321, 236, 171, 147, 78, -26, -148, -151, -210, -157, -162, -105, -85, 14, 40, 73, 61, 102, 105, 83, 63, 61, 45, 54, 11, -64, -101, -50, -90, -103, -89, -56, -25, 40, 62, 72, + 48, 93, 60, 37, 20, 11, -37, -40, -47, -18, -36, -33, -34, -5, -14, 10, 8, 32, 23, 39, 20, 25, -3, -9, -17, 10, -18, -13, -33, -11, -12, 15, 9, 25, 9, 14, -12, 2, -10, -3, -21, 2, -8, 9, 0, 13, -4, 11, -4, 7, -8, 6, -8, 7 } + }, + { + {-158, -161, -134, 37, -77, -12, -22, 78, 308, -82, 31, -294, -161, 90, -140, -109, -42, -124, -33, 256, -110, -164, 276, 222, -79, -51, 253, 72, 98, 49, 12, -64, -107, 101, -80, 75, 27, 29, -36, -87, -69, 62, -79, -124, -56, -55, -159, 179, 276, -159, 90, 8, -63, 44, -7, 3, -93, 171, -102, -125, 142, 44, -8, -16, 78, 5, -3, -49, -25, 151, -220, 75, 40, -53, -53, -76, -112, 1, 107, 111, 32, -2, 24, -61, 80, -30, 47, -34, -23, -16, -21, -16, 37, -1, 15, 23, + 13, 39, 48, -16, -12, -21, -16, -31, -10, -20, -17, -31, -13, -3, 19, -12, -486, -76, -178, -43, 39, -132, -296, 217, -73, 51, 145, -46, -15, -18, 67, -51, 244, -10, 189, 277, -332, 70, 231, 16, 46, 160, 295, 43, -66, 149, -39, -76, 67, 53, 66, -83, 301, -138, 76, 113, -1, -14, -147, 24, -170, 143, -173, -133, 96, -161, 111, -113, 47, -91, 62, 131, 257, 79, 29, 125, 2, -221, 30, 63, 85, -55, 12, -30, 43, 124, 75, 169, 59, 23, -102, -52, 100, 78, -98, 118, + 58, 130, -40, -31, -40, 6, -24, -103, -18, 17, 18, 67, 8, -20, -25, 29, 15, -50, -7, -4, 1, 21, 6, -23, -2, -22, -176, 131, 86, 27, 167, -9, 94, 227, 141, 298, 58, -44, -304, 48, -186, -62, 24, 69, -116, 0, 294, -150, -7, -149, 72, 2, 58, 120, 142, -88, 107, 110, 213, 8, -207, 21, 225, -22, -13, -31, 152, -175, 16, 116, 152, 181, -67, -118, -14, 261, 25, 94, -211, -94, 52, 44, -35, 138, -8, -28, 79, -133, 10, -20, 92, 140, -204, -46, 68, 138, + -87, -84, 58, 164, -13, 110, 79, 113, 49, 126, 191, 8, 55, -52, 79, 55, -34, -85, -14, -60, 21, -55, 26, -25, 15, -44, 3, -4, 11, -26, 44, -40, -16, -18, -20, 6, 26, 25, 15, -12, -7, -18, 59, 11, 530, 255, 210, -198, -33, -275, -195, 293, 28, -186, -85, 62, -174, -17, 301, 119, -11, 95, 440, -293, 71, -55, -140, 252, 130, 130, -97, 113, 146, -45, 94, -30, -124, 26, 49, -22, 150, 36, -52, 164, -74, -78, -94, 46, 65, 12, 120, 16, 373, 24, 1, -86, + -76, 89, -275, 12, 167, 132, -148, 219, 5, 98, 177, -49, 137, 105, -46, -157, -119, 99, 250, 71, -106, -53, -59, 171, -143, -8, 143, 164, 24, 21, -43, -68, 5, -16, -56, -11, -24, -28, -42, -22, 60, 40, -10, 76, 24, 31, -8, 26, -11, -6, -1, 9, 11, 22, 43, 11, 7, -12, 129, 33, 347, 85, 208, -10, 47, 57, 59, -58, 212, -89, 230, -112, -86, 60, -149, -43, -45, 64, 97, -60, -219, 101, -265, -107, -43, -6, -40, 53, 241, 136, 19, -248, -236, 9, 164, -84, + 28, -30, -103, -159, 19, 109, 233, 209, -24, 68, -286, 100, 195, 220, -24, 200, 46, 291, 174, 57, 134, -12, -72, -50, -26, 184, -66, -101, -123, 183, -40, -317, 67, 122, 182, 233, 399, -164, -132, 235, 251, 196, 87, -39, -41, -153, -169, -47, -58, 53, -3, -49, -3, -94, 25, -11, 49, 8, -69, -5, 12, -11, -2, 36, 69, 67, 58, 16, 18, -96, 9, 70, -40, 39, 13, -26, -18, -11, 72, 52, 15, -5, 42, 4, 30, 16, -18, 23, -8, -9, -453, 217, 321, 36, 268, 31, + -228, -27, -103, -63, 248, -320, -81, 105, 130, 279, -50, 118, -440, -232, 120, 259, -167, -130, -180, -230, 124, -33, 9, 79, 47, 82, 353, -215, 342, -24, 75, 69, 79, -107, 123, -243, -39, -135, -19, -182, 220, 33, 599, 14, -32, -155, 33, -131, 316, -196, 47, -352, 267, 234, -281, 170, 185, 69, -149, -163, 267, 62, -371, 176, -173, -102, 92, -99, 40, 72, 108, -201, -472, 65, 114, -19, -96, 184, -75, -66, -82, 121, -148, -66, -82, -70, 45, -64, 89, 7, -131, 96, 20, -75, 2, 87, + 36, 0, -6, -29, -67, 2, 27, 5, -1, 38, -76, 5, 22, -96, -63, -82, 201, 39, -4, -170, -286, 101, -154, -62, 277, -377, -157, -278, -28, 238, -22, -197, -273, -306, 119, 324, -93, 202, 304, -84, -71, 119, 169, 362, -53, 203, 29, 430, 316, 86, -102, 43, -239, 417, 96, -185, -205, 241, 203, 146, 104, 71, 215, -94, 95, -144, 20, 11, -218, -291, -104, -206, 131, -126, -94, -317, -200, 60, -109, -39, 151, 316, 399, 207, 164, -148, -327, 5, -229, -527, 3, -38, 195, 132, -130, -294, + -161, 141, -9, -34, -123, 64, 65, 52, -33, -168, 33, 21, 15, -39, -22, -24, 19, -83, -86, -10, 8, -69, 4, -15, 61, 83, -93, -5, 64, -13, -40, 14, 7, 90, -31, 57, 44, -41, -37, -610, -185, 30, 299, -216, 147, 91, -10, 442, -57, 416, -245, 119, 135, 1, -381, -162, -141, -439, 151, -112, 94, -31, 160, -5, -168, 87, -278, 203, 123, 473, -19, 10, 438, -389, 340, 410, -258, 263, -110, -130, -216, 50, 51, 290, 191, -81, -122, -255, 138, 152, -287, -134, 270, -477, 45, -369, + 206, 15, -7, 105, -124, 37, 435, -184, 95, 206, 133, 18, -229, 96, 85, -139, -372, -1, -85, -300, 223, -86, 82, -17, 42, 88, 91, -170, 41, -22, 37, -19, 111, 49, -28, -27, -161, -13, -110, 13, 18, 110, -170, 57, 91, -71, -106, 31, -16, -69, 50, -20, -66, 17, -23, -83, -22, -56, -103, 41, -32, 2, -57, -19, -58, 20, 108, -22, -67, -251, 725, -271, 143, 101, 260, 78, 159, 357, -276, -174, -21, 498, -191, -217, -246, 121, 86, 271, -570, 2, 14, -42, 296, -75, 229, 418, + -304, -141, 122, -233, -287, 191, -266, 392, -65, -411, -52, -237, 132, 319, -4, 160, -18, 59, 387, 8, 281, 107, -207, 214, 188, 22, 158, 548, -90, -252, 133, -318, 27, 523, 181, 79, -98, -155, -100, -190, 320, -213, -54, -134, 363, -667, 229, 230, 401, 91, 32, 348, -98, -156, -197, 1, -164, -20, -141, 111, 12, -131, -132, -116, 44, 134, 112, 20, 10, -63, -143, -52, -36, 56, 63, -28, -34, 25, -85, -4, -83, -46, -110, -154, -40, 47, 168, 23, -45, -48, 66, -20, 161, 68, 29, 18, + 62, 1066, 319, -195, -259, -219, 773, -666, 53, 260, 39, -362, -81, 180, -39, 41, 321, -333, -279, 136, 418, 256, 108, -204, -198, -192, -222, 206, 82, 295, 237, 134, -315, -151, -336, -68, -220, -508, -95, 225, 50, -237, -238, 4, 122, 315, 39, 159, 45, 611, -532, 346, 64, -544, -99, -165, -135, 81, -239, 141, 103, 241, -297, 103, 473, 220, 752, -171, -20, -188, -96, 18, -17, -717, 317, -33, -44, 191, 190, -205, -306, -336, -126, 234, 99, -80, -199, 171, -311, 159, -53, -143, -177, -193, -71, -66, + 27, -82, -56, 36, -60, -56, 30, -158, -74, -14, -56, -92, -43, -161, 19, 114, 156, 183, -139, -170, -121, -154, 2, -4, -96, -109, 36, -18, 100, -36, -12, 76, 76, -69, -352, 82, 199, -12, -215, -156, -469, -567, 122, -254, -114, 79, 0, -63, -246, -129, 3, 194, 216, -313, -172, 191, -272, -140, -449, 436, -52, 393, 40, 145, 426, 315, -181, 93, 220, -228, -86, 205, -72, -507, -88, -356, 524, -58, -132, -299, -427, 152, 98, 99, 219, 2, -73, 221, 63, -45, 85, -127, 349, -83, 223, 638, + 149, 118, 156, 234, -550, -453, 178, -494, 347, -71, 397, 101, 768, 297, 59, -223, -91, -393, -19, 121, 84, 82, 142, 346, -137, -283, -91, -79, 117, 314, 119, -77, 98, 92, -9, -73, -176, 12, 29, -90, -113, -23, -186, 137, 86, -91, -21, -193, -86, 90, 178, -84, -70, -3, -147, 166, 1, 120, -152, 2, -157, 99, 176, -193, -49, -904, -641, 241, -258, -520, -802, -14, 59, -149, -131, 766, 196, -545, 111, -330, -286, -267, -495, -75, 42, -671, -644, -237, 103, 69, 385, 335, 201, -156, -9, 157, + -350, -187, -121, 122, -328, -192, 220, 142, -11, -43, -63, 193, -471, -260, -233, 319, -366, 255, 415, 579, -39, 173, -137, -264, -359, -88, 352, 141, -641, 37, 662, -431, 21, -85, 35, 167, 338, -61, 107, 415, 279, 188, -310, -364, 273, -260, -511, -482, 536, 214, 297, 137, -83, -93, 257, 192, 49, 257, -97, -312, -165, -214, 92, 338, 161, 51, 195, 119, 182, -22, -90, 123, -38, -112, -104, 99, -295, 78, 178, -92, 220, 162, -9, -10, 208, 39, -43, -116, -123, 50, 112, 39, 91, -115, -89, 56, + -75, 61, -44, -520, 282, -419, -777, 149, -477, -259, 895, 73, 668, 621, -133, 654, 879, 644, -805, -94, -380, -363, -239, 28, -338, 706, 197, 393, -334, 377, 271, 106, -423, -310, 651, -108, -625, -29, -722, -90, 190, -243, 7, -569, 259, 541, 278, -65, -294, -94, -80, -86, -275, -702, 475, 285, 245, 316, -413, 644, 72, -177, -147, -489, -228, 340, 195, 553, -65, -604, -1091, -50, -14, 18, -397, -532, -110, 376, -196, -207, 138, -34, 545, -94, -495, -161, 508, 48, 93, -484, -182, -79, 202, 282, -137, 108, + 16, 216, 126, -5, 85, 284, 61, 11, -93, 46, 173, 10, 86, 323, 42, -89, -230, -8, 161, -140, 81, -53, -52, -87, -139, -85, -1, 212, 148, -187, -381, -93, 139, 70, 49, 39, 1165, 720, -94, -683, 151, 326, 203, 481, 746, -334, 70, -668, 195, 45, -246, 1176, 458, 1014, 431, 254, -883, 4, 506, 81, -466, 191, -717, -293, 59, 209, -209, -151, 166, 119, 61, 633, 408, 96, -249, 433, -279, -216, -415, -151, 560, -882, -5, 381, -427, -147, 174, 137, 813, -56, -1, -386, 795, -361, 108, 73, + 553, -137, -189, 509, -867, 218, 92, -373, 708, -885, -103, -303, -579, -304, -44, 239, 558, 897, 451, 589, 921, -382, 176, 219, -382, 517, 18, -710, 375, 183, -248, 14, 548, 397, 128, 311, 104, 94, 304, -64, 134, 254, -57, 47, -41, -26, 194, 26, 27, -174, -90, -124, -224, 40, -120, -380, 149, 211, -69, -15, 106, -139, 3, 380, -52, -120, -240, -1127, 317, 52, 1360, 302, 261, -45, 666, 170, -986, -160, 1067, -322, -218, 81, -68, 16, -188, 1097, 1263, -685, 310, 330, 189, 348, -549, -774, 593, 152, + -418, -741, -215, -258, 673, 536, 311, -629, 344, -279, 221, 26, 291, 619, 148, -1420, -429, 247, -562, 160, 601, 189, 1044, -356, -1561, -48, -621, 532, 474, -183, -331, 470, -749, -147, -404, 341, 491, 404, 456, -353, -635, -1909, -905, -1117, 175, -762, -361, -167, -821, 425, -1479, 445, -1064, -787, 759, 880, -276, -53, 485, 615, -869, 2, 142, -142, 153, 449, -60, 189, -40, 164, -385, -220, -176, -272, -56, 347, 151, 310, 11, -369, -319, 35, 190, -93, 202, 192, 512, 29, 174, 34, 120, -249, -72, 71, -187, -14, + -88, -2, 92, 513, -53, -344, -357, 10, -35, -546, -344, 248, -384, -2, -19, -1449, -230, 992, -1172, 134, 420, 33, 291, -66, -930, -56, 488, 190, 733, 527, -799, -830, -125, -346, -132, -1381, 514, 579, 971, 470, 884, -364, 112, 942, -300, 1023, 269, 553, 169, -231, 485, -583, 21, 1288, -990, 115, -1285, -550, -926, -600, -169, 92, -309, -948, -183, -1591, 1818, 665, 4, -222, -448, 127, -810, 174, -1210, 53, 55, 295, 766, 1137, 33, -1837, -861, 825, -411, -345, -456, -221, 916, 219, -520, 414, -867, 178, -167, -355, + -874, -465, 549, -233, -213, 326, -326, -71, 548, -612, -436, -157, -134, 720, 321, 218, 408, 192, -67, 350, -6, 266, 335, 552, -200, 30, -56, 417, 585, 251, -136, -6, -173, -386, 748, -181, 388, -182, 124, -195, -162, 230, 407, 20, -133, -72, 357, -747, 535, 813, 327, -401, -487, 222, -635, 1015, 882, 1292, -917, -1174, -271, -47, -565, 751, 956, -714, 16, -1256, -346, -606, -1097, 332, 939, 536, -707, -302, 103, 599, 111, -66, 251, -91, -296, -1020, -660, 237, -76, -565, 608, 504, 352, -1044, -916, 862, 550, 635, + -649, -1725, -305, 697, 729, -195, 1741, -235, 1750, -2627, -3215, -1348, -1931, 2, 775, 379, 2121, -260, -122, 372, -405, -1682, -1465, -1668, 1331, 1058, -393, -132, -2740, 747, -22, -1250, 524, 767, 1231, 934, 455, -106, -806, 3, 53, -251, -340, 950, 611, 357, 1003, -785, 194, -236, -462, 598, -87, -1106, 3, 319, -378, 491, -196, 114, -230, 1179, 949, 1090, -930, -238, 1163, 829, -810, -531, -816, -511, 682, 739, -261, -104, 1294, 28, 127, -196, 237, 195, -36, -662, -162, -159, 208, 373, -1251, 1092, 831, 343, 1028, -603, 379, -1702, + -823, 449, 629, 290, 220, 213, 441, -205, 1939, 176, 1208, 348, -581, 1478, -200, 582, 32, 531, -54, -30, 326, 743, 218, 543, 40, -110, 1168, 135, -244, 22, -89, -585, -165, 331, 219, -1313, -319, 168, 307, 1378, 1124, -1358, -747, 115, -298, 1517, 151, 1400, -980, 706, 145, 81, 652, 1439, 935, 195, 1273, 502, -594, -1276, 1126, -1017, 682, -1340, 9, -2128, 2216, -543, 79, -1489, 1346, -517, 428, -1091, 1301, -672, -607, -439, -813, 258, -454, 392, -421, 716, -793, 717, -835, 467, -979, 790, -336, 877, -301, 462, -367, 301, + -419, 22, -459, 535, 220, 156, -181, 58, -365, 291, -375, 674, -548, -650, -293, 273, -777, 611, -189, 339, -218, 196, -355, 176, -181, 210, 260, -47, -2149, -519, -180, 240, 178, -1313, -786, 1217, -479, 459, -545, 134, 1496, 2448, 156, -70, 1209, 549, 494, 1523, 22, 929, 1094, 1079, -427, 477, 945, 1349, 1079, 1655, 914, 2109, 2208, 1622, 1759, 1224, -141, 609, 304, -439, -461, 367, 1024, 255, 39, 14, 502, 1557, 1187, 2602, 513, -1320, 528, 47, 541, -668, 1020, -1851, -2420, 696, 2422, 1078, 480, -2987, 12, 1166, 1813, 2464, + -1042, 174, -4214, -2753, 1121, 1600, -2348, -1977, -1250, 2326, 1532, -2729, -3558, -695, 1446, -1676, 808, -236, -617, -894, 126, 391, 598, -81, -1472, -1246, 157, -370, 618, 111, -152, -532, -370, 261, -32, -1194, -614, -896, -477, 197, -470, -316, -1092, -1425, -2002, -1971, -1687, -1404, -1581, -1542, -1199, -1627, -1756, -1463, -1686, -1057, -286, -932, -1405, -896, 56, -473, -269, -293, 748, 828, 41, 398, 419, 279, 246, 50, 196, 183, 182, 136, 212, 77, 173, 79, 66, -9, 45, -395, -73, -784, 2007, 2285, -2574, -1050, 974, -702, 481, -924, 843, -780, + 188, 12, -388, 208, 40, -231, -185, -622, -173, 151, 73, -634, 610, -580, -209, -502, 54, -480, 998, -12, 260, -260, 259, -277, 280, 622, 828, -217, 274, 317, 725, -448, 464, -399, 872, -224, -509, 294, -229, -258, 90, -69, 367, -193, -514, -479, 64, 103, -887, 275, -149, -78, 136, -237, -164, 98, -155, 130, -487, 561, -1579, 835, -684, 1057, -720, 947, -31, 520, 276, 425, 170, 80, 160, -22, -679, -126, 9, -255, -146, -128, -93, 49, -273, -8, 71, -11, -434, 454, -97, 249, -461, 226, -295, 195, -341, 379, + -488, 673, -152, 108, -705, 488, -62, 360, -673, 183, -299, 121, -163, 83, -456, 233, -120, -238, -9, 550, -630, 64, -271, 335, -456, 422, -376, 134, -283, 332, -158, 194, -174, 215, -286, 166, -160, -18, -79, 143, -97, 76, 5, 108, -134, 52, 18, -61, 86, -81, 46, -115, 97, -124, 70, -93, 83, -68, 72, -91, 117, -115, 101, -108, 122, -93, 123, -123, 145, -152, 132, -157, 128, -125, 152, -176, 160, -152, 142, -195, 157, -189, 166, -141, 152, -143, 130, -151, 136, -167, 98, -411, 1936, 1179, -642, -732, + -67, 2413, 1004, 341, 664, -581, -740, 209, 465, 126, 40, -253, -202, 231, 229, 565, 247, -299, -135, -146, -307, 1, 52, 154, 188, 10, -83, 228, -649, -242, 286, 417, 510, -284, -169, -302, 522, 367, -100, 171, -606, -519, 482, 380, 117, -912, -472, 42, 152, 608, 430, -63, 177, 219, -287, 267, 284, -79, -175, 174, -307, 34, -53, -210, -329, 461, 93, 106, 628, 770, 271, 624, 579, -86, -156, -168, -111, 247, 395, -148, 122, -349, -128, -12, 85, -187, -230, 245, 458, 204, 128, 198, -218, 24, 219, 49, + -67, 61, -20, -260, 544, 183, -431, -403, 167, -74, 430, 233, -52, 167, 58, -81, -17, -116, 129, 203, 34, -44, -166, 153, -30, -135, -1, -694, -1921, 667, 3526, 2777, 2655, 852, -2472, -1479, -2191, -2194, -2004, -697, 1078, 1394, 2187, 1963, 1179, 201, 191, -947, -1501, -2145, -827, -581, 192, -119, 1089, 738, 312, 1459, 817, 626, -128, 549, -990, -744, -618, -718, -950, -570, -379, -963, -669, 258, 1419, 1373, 1557, 1225, 1780, 310, 455, -1182, -877, -750, -1777, -1767, -1588, -748, -931, 220, 688, 993, 1992, 1959, 1873, 1682, 1470, 316, + -865, -1407, -2517, -2160, -1577, -2147, -998, -448, 94, 2109, 1652, 2426, 2395, 1751, 489, -483, -717, -830, -741, -1427, -1767, -1233, -844, -745, 93, 496, 789, 680, 1420, 1553, 1173, 933, 156, -329, -670, -1096, -942, -669, -1052, -1426, -151, 82, -235, 1227, 1620, 1036, 911, 67, 257, -170, -285, -710, -833, -549, -622, 86, -248, 78, 12, 556, 301, 286, 523, 531, 1, -144, -379, -382, -108, -89, -183, -185, 36, 42, -45, 87, 101, 89, 28, 341, 127, -13, 54, -19, -125, -131, -150, -180, -158, -51, -27, 10, 149, 193, 150, 142, + 75, 13, 2, -25, -143, -86, -1, -93, -132, -69, -15, 60, 42, 1, 36, 96, 68, 42, 96, 46, -6, -44, -73, -61, -62, -52, -37, -28, -2, 7, 0, 17, 35, 33, 53, 72, 37, 10, 19, -13, -32, -50, -56, -51, -40, -20, 1, 2, 28, 36, 22, 26, 48, 31, 6, -14, -11, -12, -26, -37, -19, -10, 0, 4, 10, 6, 10, 4, 5, 0, 4, -1, 2, -2, 2 }, + {-98, -131, -184, 60, -88, -190, -115, 81, -231, -134, -283, 96, 132, 159, 93, -104, 221, -153, 48, 1, -27, -161, -77, -177, 11, -77, 101, 60, -79, -30, -15, -163, -3, -39, 74, -7, 148, -55, 186, -83, 6, 25, -129, 88, -37, -55, 19, -40, 73, -282, 133, 164, 27, 91, 55, -127, -13, -137, 185, -52, -111, 106, -165, 4, 67, -194, 25, -48, -70, 62, 16, 14, -88, -61, -304, -40, 67, -52, 16, 35, 164, 137, 9, 44, 21, -28, -22, -42, -21, -14, -30, -29, 0, 29, 21, 19, + -46, -1, -1, -14, -2, 11, -6, 1, -22, -19, -19, -1, -18, 28, 37, 38, -435, -262, 48, -141, 27, -146, -250, -167, 284, 165, -44, 192, 45, 47, 54, -93, -25, 156, -126, 71, 114, -122, -193, 88, -158, 17, 90, 231, -52, -112, -98, 36, 126, -171, -2, 140, 55, 15, -9, -13, 183, -7, 167, 110, -43, 109, -39, -10, -17, -306, 106, 172, -100, -57, 42, 47, 49, 27, -17, -37, 10, -77, 209, -94, 24, 113, 91, -75, 82, 26, 54, 114, 101, -152, 157, 174, -59, 2, -11, 113, + -140, -73, 30, 19, 5, 7, -30, -47, 28, -23, -12, 8, 40, -30, -7, 0, -55, 18, -33, -34, -26, 20, 3, -16, -33, 7, -172, 221, 144, 341, -57, 37, 104, -166, -34, 66, -68, -225, -13, 25, 151, -182, -444, -358, -221, 86, 211, -212, 120, -104, 163, 127, 111, 196, 109, -153, -142, 27, 105, -8, 9, 274, -2, 48, 136, 144, 24, 4, 339, -23, -127, -38, 77, 99, -66, 182, 36, 98, -130, -115, -44, -76, 44, -60, 198, -228, -204, 248, -26, -10, -287, 90, -139, 156, -120, -318, + -15, 164, -136, 212, -127, 98, 198, -56, 83, 199, -13, -147, 12, 98, 45, -71, 137, 9, 72, 28, 20, 52, 10, -20, -1, 7, 21, -55, -28, -29, 53, 7, 54, 56, -52, 13, 14, -30, -22, -10, 10, -27, 11, -28, 531, 125, 142, 61, -121, 255, -120, -72, 324, -24, 261, -28, -298, 105, -101, 329, 173, -23, -294, -206, 272, 323, -376, 189, 151, 113, -24, 37, 32, -29, 373, -17, -64, -103, -125, -160, -52, -9, -215, -77, 56, -150, 9, 9, 223, -84, 7, 104, 9, 213, 96, 222, + 110, 67, -234, 25, -174, -163, 39, 226, -9, 194, -81, -147, -34, 9, 57, 133, -62, -1, -73, 74, 51, -191, 37, 40, 26, -54, 200, -21, -39, 21, 94, 41, -66, -21, -27, -48, 39, -58, 95, -57, -11, 11, -45, -13, 53, -62, -14, -67, 26, 28, 54, -73, 15, -30, 37, -25, -87, -28, 150, 105, 120, 341, 179, -148, -132, -367, -24, -8, -196, 75, 295, 36, -232, 216, 205, -21, 82, 208, 49, -189, -29, 440, 217, 46, -290, -104, 265, 91, -40, 149, 133, 140, -1, 273, -2, -35, + 69, -136, -178, -9, 30, 102, 56, -166, 169, 296, 152, -8, 220, -251, 143, -149, 157, -42, -180, -9, -235, -385, -140, -153, -19, -2, -201, 39, -62, 117, 77, 138, -22, 56, -194, 33, 31, 270, -104, -9, -94, 57, 243, 125, -141, -226, 71, -90, -31, 117, -17, 39, 27, -134, 6, -103, 29, -98, -66, -36, -4, -13, 18, -63, -7, -21, -50, -42, 15, -11, -26, 6, 23, 75, -27, 44, -32, -75, 56, -83, 79, -8, -53, -9, 26, 58, -43, -6, 12, -15, -360, -238, 509, -111, -112, 30, + -18, 546, -160, -294, 7, -290, 72, 232, 249, 79, -507, 417, -328, 174, -224, -170, -126, 208, 224, -335, 26, 147, -104, 67, 98, -121, 15, -276, -186, -426, 252, -59, 430, -200, 93, 287, -72, -85, -127, 329, 240, -403, 115, -228, -77, -88, -227, 136, 72, 356, 250, -446, -73, -192, 261, 91, 22, -260, 39, -27, 219, -36, 27, -299, -7, 213, -196, 33, -62, -58, -159, 32, -21, 377, 166, 173, -69, -42, -66, -103, -55, 84, -116, -37, -113, 86, 72, -61, -35, 80, -107, 53, 16, -29, -34, 29, + -3, -10, -21, 70, -103, 14, 9, 52, 56, 56, -52, 16, -37, 75, 21, 18, 55, 124, -137, 9, -288, -36, -333, 52, -83, 191, -13, 162, -228, -429, 91, 289, 38, -35, 225, 152, -351, -6, -132, 445, -20, 52, 35, 5, -14, -159, 352, -30, -499, -94, 303, -195, 51, -8, 41, -62, 48, -92, 120, -191, 181, 253, -198, -50, -117, -348, 140, -247, 215, -217, -375, -102, 223, -69, -134, 149, 207, 118, 226, 387, 312, -20, 61, 53, -207, 40, -216, -236, 129, -180, 59, -10, 136, 138, -179, 209, + -56, -85, -38, 147, -26, -135, -92, -191, 220, -110, -28, 38, -8, -81, -68, 15, 30, 10, -38, 51, 38, -43, 5, 33, 21, -26, 0, -35, 15, -59, -54, 34, 18, 73, 81, 7, 56, 1, -3, -490, -411, 240, 440, 1, -26, 85, -211, -102, -508, -270, -144, -4, -370, 529, 105, 295, -337, -401, -302, -117, 80, -456, -204, 212, -91, -554, -188, 75, 6, 345, 116, -108, -263, 328, -190, -19, 247, 73, -269, -138, -21, -449, 113, 349, -152, -193, 51, -227, -84, 45, -145, -111, 118, -169, -358, 177, + -204, -267, -367, -183, 36, -146, 61, 452, 255, -55, 430, 438, -189, 61, 121, -226, -147, -479, 49, -153, -388, -3, 204, 362, 222, 107, 40, -325, -41, -74, 85, -123, -14, 8, -5, 79, 15, -29, 70, -28, -103, 84, -69, -91, 14, 35, 31, 8, 100, -9, 64, 39, 8, 21, -1, -77, 18, -106, 25, -170, -43, -6, -113, -133, -18, -131, -25, -27, -151, -313, 796, -32, 488, -246, -697, 199, 61, -28, -326, -32, -215, 552, 405, 361, 265, -433, -2, 59, 385, -658, -74, -161, -192, 99, -216, 84, + 147, 109, 118, 152, -45, -65, -319, -76, -48, 314, 0, -288, -67, 341, -39, 199, 256, -185, -109, -424, -246, 829, 219, 369, 199, 48, 32, -525, 312, 49, 92, 268, 293, 455, -524, -216, -291, -37, 73, -69, -147, -86, -439, -552, -358, -518, -67, -338, -579, -245, 189, 318, -120, -496, -17, -75, 118, -136, 32, 285, 13, -21, -17, 36, 51, -84, -75, -199, -223, 119, -61, 107, 97, -36, 66, 88, 161, 114, -69, 35, 205, 40, -206, -171, -93, -43, 16, -73, 119, 131, -31, 197, 26, -55, -42, 46, + -114, 1069, 242, -154, -222, 34, -343, -671, 494, 2, 318, -240, 230, 549, -54, 61, -138, 478, 403, 156, -647, 47, 96, 400, 583, -172, -119, -77, 157, 208, 173, -294, 135, -339, 260, 347, -165, -343, 217, -374, -341, -14, 100, 487, 59, -67, 415, -77, 373, 688, 345, 8, -437, -41, -251, -204, 440, 172, -443, -5, -338, -86, 583, 268, 85, 250, 352, 182, -470, 242, 393, 135, -321, 133, 38, 67, -251, 388, -106, -93, 467, 494, 73, 141, 538, 32, 266, -188, -5, 310, 180, -137, 160, 280, -75, 3, + 357, 74, 152, -105, -177, -54, 100, 52, 83, 85, -58, -55, -46, 28, 107, 129, -86, -26, 223, 33, 298, -53, 82, -40, 39, 135, 83, 11, -1, -125, -88, -63, -134, 172, 155, -260, -13, -332, -781, 270, -311, 86, 27, 547, -377, -334, -140, -153, -202, 404, -359, -506, 151, -946, 27, -178, -400, 508, -33, -30, 214, -202, 160, -51, -565, -617, -7, 130, 361, 174, -42, -65, -355, -169, 356, -558, 769, 456, 102, 568, -380, -163, -348, -356, -154, 259, 726, 6, -376, -64, 35, -41, -39, -232, 195, 179, + 489, -10, 553, 285, 152, -15, 118, -828, 436, -106, -484, 344, -1, 454, 201, -767, 594, 463, -402, 645, 248, 481, 191, -68, -27, -21, -91, -170, -52, 70, -169, -258, 2, -169, -302, -181, -227, 142, -139, 175, 47, 179, 85, -21, -97, 30, 17, -15, 25, -54, -126, 59, -12, 73, 79, 2, 67, 30, 116, 99, -182, -110, -163, -305, -214, -1467, -109, 861, -156, 21, 760, -181, 12, 87, 205, -233, 204, -84, -250, 239, 290, -860, 103, -766, -18, -400, -427, -100, -127, -423, 211, 63, 266, 354, -516, 647, + 47, -616, 52, -427, -211, -459, -411, -184, 434, -378, 208, 432, -261, -473, -429, -637, -679, -406, -192, 47, -102, 182, 130, -410, -28, 448, 262, -677, 265, -57, -186, -628, 421, -229, 580, 726, 20, 691, -383, 398, -301, 428, 554, 41, -728, -29, -994, 315, 216, 388, 188, -396, -338, -13, -227, 218, -245, -15, -15, -251, -191, 161, -95, -283, -26, 79, 206, 104, 448, -53, 38, -140, 314, -51, -68, 268, -15, 34, 66, 364, -60, -158, 39, 249, 242, -251, -24, 162, -283, 151, -46, 195, 12, -248, -134, 110, + 126, 150, 114, -696, 563, -1327, -78, -127, -110, 122, -761, 52, -150, -66, 348, 136, 405, -313, 287, -150, -676, -274, -496, -310, 328, -592, 78, -220, -447, -81, 438, -588, -564, 230, 340, -20, -266, 316, 336, 409, 354, 145, 485, 572, -306, 85, -270, 718, -57, -498, 601, 262, 145, -286, -377, 87, 230, 229, -19, -314, 239, -365, 12, -360, 1112, 170, -318, 911, -110, 278, -235, 457, 682, -424, 652, 689, 903, 691, 66, 513, -401, -81, 98, -224, 399, 17, -24, -41, -114, 193, 99, 545, -178, 201, -119, 2, + 104, 160, -229, 84, 230, -100, -257, -51, -413, 142, 130, 111, -108, 68, 219, 122, -51, 208, 95, -137, -68, -44, 343, 443, 238, 102, 81, 151, 265, -177, -70, 119, -26, 24, 123, -106, 1371, 353, -228, -203, 322, 88, 140, -36, -542, 456, -1243, 134, 279, -57, -223, -480, -215, 56, 374, 564, -330, -727, -582, -85, 26, -429, 885, -412, -264, 362, -119, 64, -75, 754, 130, -759, 304, 95, 528, -188, 61, -314, 265, 114, 665, -162, 302, 312, -395, -441, 35, 400, -774, -921, -267, -379, -46, -134, 96, 208, + -183, 31, -1058, -903, 721, 761, -916, -708, -882, -464, -363, 458, -480, -854, 29, 36, -519, -112, 747, -113, 45, 239, -4, 42, -29, -264, -323, -18, -89, 213, -31, -21, -233, 118, -362, -9, 115, 121, 179, 199, 40, 112, -78, 19, -183, 67, 22, -211, 219, 215, -335, 21, 250, 204, 385, -79, -441, 123, 148, -219, 144, -244, -112, -38, -75, -207, 78, -758, -96, -181, 226, -357, -101, -1180, 1045, 677, -116, 1440, -144, -784, -75, 326, -490, -639, -138, -435, -23, 126, -663, 973, 30, 108, -611, -172, 64, -170, + 153, 225, 795, 147, -43, 648, 529, -184, 311, -402, 113, 364, 348, 905, -892, 552, 1650, 17, 270, 570, 63, 117, 265, 210, -553, -653, -241, 534, 156, -679, -372, -25, -330, 613, 55, 475, -1044, -641, 303, 721, 437, 294, 991, 585, -417, 689, -516, -99, -75, 390, -82, -420, 369, 167, 35, -483, 338, -1, 6, -212, 285, -227, -188, -172, 136, -180, -359, 126, 25, 4, -195, -31, -244, -202, -195, -116, -75, -85, -74, 42, 7, -455, 311, 130, -146, -335, -487, -4, -265, -171, 176, -121, 303, 159, -106, 61, + 283, -118, -46, -127, 239, 65, 100, -231, 489, -1377, 29, -9, -44, -175, 643, 51, -370, -690, 699, -621, 16, 448, 361, -489, -130, -786, -3, 224, 274, 317, 84, -513, -637, 523, 271, 260, 103, 264, 80, 384, -687, -1165, 323, -178, -247, 647, -113, -348, 574, 539, 450, -44, -292, -503, -129, -664, 1557, -135, 561, 118, -516, 422, -197, -498, 487, 384, -856, 595, -91, 826, -837, -635, 845, -37, -683, 696, -256, 1191, -506, -412, -720, 455, 85, -589, 234, -764, -556, 48, 495, -439, -267, -868, -784, 919, -106, 399, + 647, 872, 5, -90, -67, 229, 352, 64, 162, 536, 237, 295, 177, 134, -104, -51, 332, 251, 435, -206, 287, 301, -472, 120, 120, -259, -131, -1, 121, -210, 343, 18, -77, -98, 291, 10, 92, 26, 83, 65, -263, -132, -196, 24, -2, 145, 189, -169, -394, 1020, -233, 691, -1081, -191, -25, -1291, -284, 186, 634, -318, -303, 27, -100, 905, -87, -456, 960, -120, -50, 180, -384, 829, 55, -170, 397, 340, -453, -156, -211, 645, -1292, -23, -251, -457, 221, -465, 752, -198, -931, -98, 1414, -859, 619, -957, -276, 952, + 696, -515, 241, -627, -824, 175, -363, 358, 103, -58, 140, -1207, -472, -616, -882, 409, -335, -246, -489, -858, -721, 564, -113, 1760, 308, 162, 628, 1107, 144, -800, 971, 735, -622, 164, -158, -620, -488, -419, -49, -383, 143, 259, 90, -298, 516, 80, 238, -72, -92, 244, 149, -249, -224, -215, 236, 112, 285, 303, 10, -164, 229, -133, 493, 234, -597, -118, -441, 52, -146, -213, 618, -34, -196, 158, 191, -227, -49, -312, 134, 223, -47, -99, 31, -210, -60, -34, 287, 687, -407, -516, 580, -922, -110, -188, 53, 654, + -428, 726, 309, 167, 215, -1177, 801, 153, -831, 328, -881, 154, 1180, -143, -700, -740, 317, 540, 433, 235, -780, -530, -242, -140, 1009, -634, -384, 1507, -835, -60, 595, 8, 627, -86, -506, -334, -920, 475, 654, -975, 1467, 494, -1106, -1003, -962, -1147, -933, 55, 461, 97, -777, -287, 519, -7, -487, 543, -1046, 74, -241, -959, -902, 164, -359, 691, -1251, -160, -443, -908, 63, 1484, 378, -644, 317, -795, 326, -317, 28, 54, 418, -35, 143, 536, 6, -281, -134, 432, 299, 205, 103, -817, -84, 74, 464, 243, -429, 3, + 49, 735, 41, 244, -223, -130, 107, 249, -29, -200, -406, 73, -154, -267, 139, -182, -200, 294, -225, -309, -448, -381, -73, 132, 2, -329, 287, 729, -1807, -1647, -1451, -918, 363, -382, 1836, 499, -211, -414, -248, 534, -1218, 1418, 1849, 750, -128, 1482, -483, 899, 1678, -301, 77, 325, 2238, -564, -159, 1347, 491, 437, -387, -1368, 77, -1083, 502, -1344, -1598, -14, -109, -1098, -77, -532, -1150, -900, -1495, -67, 1486, -477, -309, -1386, -765, -509, -498, 472, -362, 2509, -616, -33, -938, 1894, 1532, -1099, 1241, -442, -1862, -328, -201, 387, + -452, -418, -256, -746, 190, 921, -1116, -157, 289, 189, -1293, 822, 555, 1899, -837, 519, 776, -51, 195, -28, 251, -215, 591, 258, 475, 422, 13, 435, 115, -169, 441, -32, 56, 46, 301, 233, -362, -272, -454, 655, -468, 92, 384, 165, 713, 624, 1073, 742, 600, 36, 388, -582, 506, 387, -151, -560, -1063, -414, 280, -588, -240, -429, -1043, -892, -442, -666, -417, -575, -746, -772, -263, -229, -368, -570, -335, -510, -374, -418, -139, -200, -181, -217, -195, -282, -158, -567, 759, 3189, 372, -1999, -496, -707, 154, 995, 1790, 511, + -1501, -29, 1040, 226, 24, -47, 272, -144, -182, 1235, 775, 690, -1050, -682, 716, 276, 423, -365, 132, 1376, 33, 1167, 614, 636, 1141, 164, -605, 139, -693, 173, 483, 122, 1866, -624, -1203, -1161, 1441, 663, 767, 523, -826, -1038, -632, -38, 313, -229, 508, 953, -67, 690, 628, -970, -193, 273, -456, -412, -478, -1599, -273, 687, 58, 1390, 925, -679, 489, 4, -467, -395, -776, -1728, -924, 66, 26, -386, -108, -184, 546, 571, 292, -109, 36, 432, -223, 269, -784, -374, -110, 411, -116, 159, 264, 263, 26, 739, -608, -546, + -554, 382, -364, -570, -568, 387, -198, -417, -228, 289, 60, 426, -742, -484, -102, -54, 126, 331, -179, -294, 467, -261, -327, -274, 448, -131, -275, 135, -56, -262, -24, -348, -247, -158, -54, -111, 43, -90, 3, -33, 22, -177, -11, -66, -8, -99, -2, -155, 14, -118, 10, -101, 10, -43, 37, -69, 16, -92, 0, -99, -26, -128, -18, -94, -24, -84, -19, -53, -23, -88, -15, -38, -7, -52, -2, -71, -9, -48, -24, -30, -19, -49, -14, -37, -34, -22, -17, -31, -12, -30, -213, -742, 53, 2547, 613, 1090, + -559, -2261, -1198, -1656, -604, 1166, 2569, 1193, 255, -1206, -1201, 852, 1261, 674, 1538, -35, -1063, -1474, -767, -201, 1134, 175, 642, 633, 68, 1592, 1061, -89, -183, -1408, -384, 1, -4, 856, 1439, 933, 674, 1414, 765, -1403, -1187, -329, -937, 991, 619, 1451, 1073, 1287, 339, 254, -1063, -1046, -1045, 390, 483, 30, -170, 2271, 534, -121, -244, 1565, -1665, 377, -3141, -662, 746, -1054, 983, 609, -16, 2269, 1028, -1234, -2555, -1180, -1175, -586, -457, -292, 1072, 736, 1457, 214, -1127, -720, -1181, -1035, -1095, 506, 68, 501, 603, -263, 555, 347, + -441, -12, -486, -110, -1012, -1001, -420, -414, -14, -935, 486, -32, 148, 311, -682, -1307, -1250, -26, 235, 318, 769, 239, -434, -717, 220, -247, -410, 193, -3643, -2203, -1224, 1084, 290, 4965, 5268, 3225, 5843, 4801, 5052, 3523, 4272, 3492, 49, -1645, -2379, -2259, -4764, -5687, -5970, -4145, -3285, -1274, 212, -1671, 1014, -2109, -783, -133, -672, 516, -1963, 2690, 442, 2453, 1552, 925, 622, 1363, 864, 1398, 3171, 3041, 2399, 2972, 3729, 3421, 3199, 5910, 2053, 4162, 5391, 3728, 4896, 2620, 3484, 2748, 3270, 3567, 1301, 2314, 1730, 2167, 2069, 582, -423, -2247, + -852, -3002, -2649, -4446, -5062, -5071, -10740, -9070, -9765, -9663, -11303, -11407, -7057, -8183, -6116, -7219, -5511, -5195, -4547, -4537, -2629, -1144, -1678, -1671, -1389, 273, 2157, 1147, 4512, 3910, 5708, 5894, 5412, 6790, 6264, 7287, 5670, 6972, 7357, 8256, 7192, 4319, 4289, 4314, 4350, 4043, 2814, 2665, 1081, 792, -116, 141, 515, -1479, -2226, -2370, -1496, -1288, -2479, -2835, -3355, -2398, -3109, -2830, -2433, -2561, -2663, -2610, -721, -600, -362, -570, 302, -60, -105, -532, -239, 220, 311, 149, 448, 367, 551, 50, 57, -45, 272, -21, 67, 55, 180, 39, 36, -235, -7, -42, + 57, -148, -24, 6, 64, -117, 0, -90, -16, -193, -116, -129, -26, -185, -142, -298, -97, -109, 4, -137, -162, -326, -282, -388, -234, -310, -283, -427, -325, -343, -196, -268, -163, -233, -115, -124, 58, 104, 274, 229, 362, 363, 570, 590, 632, 604, 700, 612, 643, 541, 531, 381, 350, 153, 152, -8, -33, -163, -121, -188, -127, -195, -119, -167, -79, -123, -36, -91, -11, -70, 7, -52, 23, -39, 32 } + }, + { + {168, 3, -62, -14, -150, -103, 67, 6, -94, 118, 79, -25, 7, -16, 95, -131, 49, 98, 87, -189, -132, -94, 127, 31, 42, -53, 136, 51, -33, 4, -38, 27, 51, -30, -39, -114, 121, 202, 24, 128, -23, 26, 46, 56, -153, 11, -160, -36, -22, 51, -80, -2, 35, 16, -93, 4, 11, 77, -99, -124, -16, 169, 271, 1, 45, 19, -58, -162, -41, 114, -52, 113, 44, 116, -6, 45, 41, -97, -131, -13, 50, 76, 37, 34, 23, 26, -45, -71, -48, -38, -18, 2, -27, -3, 24, 40, + 35, -5, 3, 24, 0, -28, 79, -171, -37, -163, 95, 9, -73, 342, -133, -248, 20, 112, -19, -187, -51, -82, -29, -89, -27, 126, -7, -85, 148, 20, 144, -39, -33, 53, 5, 62, -25, 132, 220, -62, -146, -109, 92, -2, -335, -34, -133, -52, 167, -117, -86, 112, -73, -18, 153, 51, -118, 52, -84, -201, 65, 77, -149, -89, -42, -65, 0, 63, 105, 155, 177, -43, 20, -70, 77, 47, -37, 72, 114, -109, -53, 17, 4, 42, 131, -18, -33, 116, 19, -82, -49, -7, -48, 34, -19, -46, + 20, -52, -38, 24, -49, -36, 3, 33, -61, 6, -13, -23, -29, -4, -47, -15, -45, -276, -141, 86, 122, 48, 132, -113, 138, 171, -49, 189, -26, 140, -67, 5, -60, 179, 69, -7, 158, -84, -68, 117, -277, -47, 15, -58, -246, -150, 102, -96, -65, 4, 192, -46, -135, -10, 49, 110, -17, -174, -113, -31, -90, 30, -152, 76, -143, -209, 6, 74, 85, -66, -49, -137, 178, 104, 25, 3, -5, -60, -33, 61, 76, 270, -31, 69, 17, -7, -132, -99, 182, -78, 18, 46, 26, -28, 138, 8, + 5, -149, 145, 82, -56, -32, -16, -42, 20, 105, -1, 42, 32, -14, 24, 55, -6, 1, 17, 26, 22, 32, 56, 22, -41, 44, 20, -29, -24, -4, 6, 1, 68, 82, 74, 175, -116, -175, -140, 87, 195, -37, 150, -134, -161, 132, -67, 12, 50, 166, 62, 264, -115, -143, 62, -80, -74, 149, -235, -146, 24, -47, 107, -81, 29, 187, -176, 130, -106, 83, -100, -30, -16, 194, 37, 5, -143, 5, -171, 62, 42, -116, -3, -49, 295, 38, 19, -258, -151, -218, 168, -112, -13, 87, 376, 264, + -107, -234, -97, -203, 212, -43, -59, -95, -62, -20, -98, -67, -17, -81, 56, -58, 79, -295, 19, -27, -93, -46, -99, -22, -155, 10, -65, -8, 93, -32, -34, -68, -74, -23, 20, -7, -7, -29, -12, -34, -6, 4, 17, -25, -27, -38, -33, -30, -48, 17, -16, -4, -49, -146, 104, -151, -275, 281, 124, -290, 290, -45, -19, -409, 242, 165, -334, 101, -57, 128, 27, 147, 91, 39, -157, 16, 55, -202, -89, -239, -43, -148, -82, 29, -191, -68, -280, 107, 26, 26, 22, -118, -244, -74, 83, -38, + -23, 255, -378, 160, 190, -26, 10, -72, -32, -120, -188, -125, -149, -96, 91, 53, 81, 128, -32, -66, 179, 347, 242, -4, -297, 82, -47, 45, 310, -1, 312, 282, -41, -93, -78, 23, 25, 106, 317, 86, 10, -32, -200, 24, 59, -66, -12, 11, -5, 37, 25, 23, -27, 39, 33, 35, 37, -107, -19, -76, 28, -60, 23, -17, -30, -64, 10, 16, -96, -30, 20, 3, 441, 116, -82, -19, 134, -44, 427, -43, -69, 547, 1, 278, -105, 10, -27, 48, -73, 41, -11, -13, -298, -25, -73, -50, + -126, 192, 86, 115, -169, -15, -265, -102, 46, -18, -162, -46, 85, 200, 117, -60, -246, -6, 66, -38, 126, 89, 172, 244, -81, 1, -263, -313, 295, 163, -14, -10, -13, -112, -129, 0, 236, 141, 40, 294, -226, 68, -186, -138, 122, 132, 103, 442, -19, -195, 31, -191, 85, 54, 157, -84, -1, 23, -151, -23, 100, -12, 24, -61, -36, -7, 68, -35, 42, -65, 3, -85, 25, -44, -33, 17, 41, -51, 56, 41, 68, 7, 39, -15, 23, 16, 23, -24, -4, -22, -7, 16, 34, -29, 12, -6, + -244, -327, 127, -305, 0, 341, -356, 131, 159, -95, -440, 6, 257, -284, 176, -20, -126, -368, -11, -266, 47, -135, -208, -258, 106, -36, -16, 246, -149, 208, -158, -63, 317, 109, -170, 131, 76, -147, 77, 80, -57, -62, 12, -71, -84, 52, 58, 433, -408, 66, 26, -146, 293, 167, -101, -315, 28, -32, -96, -199, -234, 285, 184, 24, -29, 152, 77, -69, 121, 88, -79, 303, -113, 186, -124, 93, 95, 69, -10, -168, 161, -131, -137, -93, 47, 0, 20, -159, 87, 68, -102, 11, -4, -50, 9, -33, + 77, -22, 11, 65, -30, -49, 43, -55, 45, -9, -1, -64, -29, -2, -71, 70, 39, 16, 46, -14, 31, -17, 144, -329, 241, -137, -61, -189, -136, 116, -109, 95, 369, 127, 203, -471, -312, -167, -113, 51, -2, 82, -395, 212, 88, 53, 377, 7, -214, 355, 139, -157, 72, -203, 186, 88, 248, -212, -151, 63, -215, 272, -249, -4, 241, 223, -459, -12, 22, 54, 76, 502, 116, 32, -153, -126, -271, -146, 371, 10, -442, 7, 102, -250, -277, 34, -179, 74, 406, 200, 171, -166, -434, 36, -74, 200, + -39, -363, -44, 96, 100, 99, -31, 309, 58, -195, 254, -18, 152, -4, -38, -131, 188, 130, 73, -95, -37, -24, -63, 37, 0, -80, 41, 26, -46, -59, -25, -45, -7, 58, -58, 31, 72, 87, -22, 38, -46, -580, -173, 165, 449, 65, 233, 797, 132, 136, -123, -382, 216, -185, 199, -48, 527, 385, -203, -431, -343, 261, -229, 320, 140, 104, -110, -42, 379, -74, 335, 336, 173, 236, -261, 255, 137, -136, 371, -163, 337, 26, 38, -494, 298, 28, -93, 245, -345, -136, 206, 169, -318, 51, -203, -116, + 314, 43, 95, -33, -362, 243, 231, 16, 182, 82, -161, -168, -14, 193, -328, -12, 21, 14, -3, 144, 189, 388, 217, 13, -544, -179, -204, -18, 40, -153, -323, -101, -145, 85, 12, -92, 34, -94, 150, -54, -64, -89, 2, 43, -194, 122, -125, 51, -32, -72, 3, -120, 39, -108, -79, -15, -62, -57, 66, 115, 69, 110, 144, -30, 21, 720, 210, 96, -267, -648, 468, 146, -430, 129, -47, 110, 90, -311, -665, -520, 175, 407, -82, 427, -199, 333, 406, 552, -123, 407, -363, 138, -199, 49, 218, -10, + -119, 99, 274, -197, -369, -372, 776, 1, -41, -352, 359, 116, -720, -417, 159, -102, -129, 279, 93, 693, 381, -26, -406, -398, -228, -165, -461, 422, -316, 333, 285, -292, -377, -363, -531, 126, -12, -192, -242, -389, -142, -384, 77, 44, -134, 49, 309, -801, -314, -654, 325, 226, -284, -97, 129, -126, -9, 151, -126, -264, -34, -79, -87, -7, -39, -115, -1, 19, 134, -196, 45, 101, -18, -84, -129, -40, -25, 23, -49, -15, -81, 32, -37, -128, 212, 17, 59, -174, -395, -736, -174, -185, 33, -164, 24, 88, + -88, 329, -420, -116, -399, -10, -202, 463, 500, 415, -572, 411, -211, 315, -123, 235, -194, -231, 81, -302, 195, 253, -36, 156, -292, -25, 479, -374, 13, -103, -163, -299, -23, 490, 626, -386, 186, -38, -387, -379, -425, -180, 794, 494, -153, 268, -174, 234, -441, 269, -17, -226, 604, 326, 121, 211, 171, 582, 72, -470, 194, 381, 286, -830, 512, -345, -320, -144, 50, -318, 362, 821, -142, 129, 411, 84, -69, 112, 41, 249, 211, 141, 387, 213, -108, 278, 164, -102, -236, 147, -32, 159, -67, 58, 118, 61, + -33, -14, 54, 197, 41, -27, 42, 155, -59, 23, 237, 107, -60, 144, 43, 50, 100, 14, 83, -20, -146, -119, 121, -55, 528, 331, 1418, 387, -228, 83, 246, -1, 479, 342, 335, -426, -691, 693, -387, 60, 252, 761, 318, -472, 430, -427, -77, -585, -750, -92, 215, 198, 163, 187, -50, -528, -183, 161, 186, -282, 589, 361, -337, 186, 298, 107, 28, -326, -30, -230, -122, 27, 370, 891, -233, 76, 143, 329, -310, 1131, -88, 105, 106, -521, -495, -821, -336, 442, -146, 219, 192, 777, 136, 135, 52, 611, + 309, -263, 577, -520, 94, 516, 683, 614, 255, -357, -563, -253, -172, -425, -222, -243, -54, -357, 101, -126, -46, -312, -24, -196, 316, 27, 79, -278, -40, -380, 39, 157, 1, 271, 186, -3, 126, -61, -156, -103, -63, -325, 43, 61, 90, 93, -146, 224, 260, 106, -177, -131, -50, 53, 150, 71, -114, -68, -49, -143, -593, 336, 151, 411, -115, -892, 65, -597, -541, 162, 120, 254, -163, 183, -39, -304, 481, -76, -170, -193, -351, -292, 169, -368, 82, -235, -172, -101, 471, -93, 506, 323, -144, 172, 169, 366, + -262, -345, 42, 215, 271, 483, -543, -517, 211, 172, 585, -294, -53, 295, -9, 82, -121, 389, 479, 224, -74, 306, 1016, -228, -312, 380, -54, 599, 132, 279, 326, -111, 224, 693, -202, -836, 574, 169, -288, 78, -1285, 846, -22, 523, -348, 272, 24, -510, -498, -70, 79, -378, -13, 54, -84, -129, -94, -414, -84, -250, -13, -133, -54, -152, 230, -188, -157, -270, -145, -307, -73, 62, -186, -25, -156, -156, -181, -17, -154, -107, 29, -51, 111, -101, -213, -219, -19, 28, -154, -36, -81, 56, -305, -5, -562, -9, + 828, 433, -1109, 185, -215, 109, 160, -39, -581, 92, -106, 501, 928, -144, 286, 637, -47, -163, -180, 259, 926, -7, -85, 790, -336, 221, -18, -1, -223, 304, -888, 38, 255, 645, 654, -544, 3, 620, -57, 1145, -432, -545, 56, 835, 125, -622, -317, 198, -23, 369, -942, 123, 21, -182, -689, -582, 137, -169, -62, 44, -716, -720, 135, 125, -758, -239, -500, 440, -1187, -431, 362, -697, 367, -181, -305, 397, -140, 591, 530, 135, 321, -145, 48, -401, 423, -309, 243, -421, 296, 32, 120, -27, -21, -238, 272, -315, + 33, 47, 143, -346, 162, -134, -123, 122, -99, -157, 216, 111, 232, 123, -51, -111, -147, -23, 23, -160, 35, -114, 35, -333, -204, -131, 150, 212, -138, 55, -76, 96, -297, 628, -12, 353, -655, -36, -621, 650, 271, 847, 577, -285, 101, 671, 327, 347, 203, -549, -172, 287, 33, 337, -726, -519, 311, 1081, 134, -343, 664, 204, 411, 123, 71, -593, -627, 21, -2, -1047, 73, -207, -67, 345, -425, 263, 818, 97, -1366, -964, -171, -290, -349, 0, 234, 224, -345, 385, 343, 332, -222, 287, -166, -343, -96, 319, + -1024, -222, -470, -518, -223, 151, -282, -19, 1099, 642, -441, 12, -1, -183, -212, 106, 732, 281, 99, -223, -182, -379, -461, -468, -123, 69, 133, -159, 117, -32, -123, -33, -142, -410, -119, 4, -121, -354, 31, -123, 379, -192, 118, -33, 147, 5, -334, 34, 367, 66, 328, -88, 160, -103, 96, -17, -253, -98, -41, -36, -63, 5, -88, -169, 224, 441, -612, -150, -262, 165, 1262, 204, -629, 168, 555, -117, 518, 669, -350, 160, 331, 232, 9, -95, -212, 102, 389, 206, 363, -551, -858, -88, 375, 338, 267, -95, + -792, 256, 169, 1181, 1233, 297, -928, 669, -357, -940, -226, -1113, -855, -373, -415, -862, 145, -346, -996, -904, 256, 590, -103, -763, 221, 24, 239, 483, 463, -590, 758, 526, 61, 212, 525, -26, 1384, -990, -480, -32, -1137, 929, 62, 1168, 354, 262, -65, 232, 488, 20, -466, -7, -252, 186, 172, 334, -146, -425, -9, 396, 181, -252, -132, 209, -290, -1, 0, 364, 136, -198, -92, -225, -370, -315, -23, 69, -187, -132, 37, -182, 280, 140, -9, 172, 571, -219, -115, 65, 149, -311, 333, -114, -16, 58, 245, 433, + -625, 170, -1241, -327, -84, -296, 1347, 434, -368, -844, -439, -343, -547, -388, 199, -1235, -275, 919, -116, -95, -957, 912, 441, 27, -368, 393, 183, -209, 405, -635, -178, -321, 176, -143, -412, 465, -353, 198, 5, -617, -397, -91, -788, -759, -1034, -258, 462, -338, -197, 598, -730, -587, 631, 1, -46, 582, -1, -487, -292, 200, 407, -631, -209, 781, 326, 754, 378, -147, 384, -24, -1022, 324, -776, 561, 88, 209, -332, -870, 175, -125, -770, -299, 331, -380, 6, 126, 238, -242, 3, 43, -76, 164, -124, 95, 302, -52, + 97, 88, -213, 69, 139, 91, -162, 211, 132, -9, -222, -427, 78, -337, 267, -344, 218, 292, 2, 22, -3, 168, 14, -143, 325, 275, -145, -91, -216, -348, 920, 327, 30, 117, -246, 371, 565, 1447, 1256, 113, -559, 261, 726, 213, 561, 412, 269, -424, -554, -656, -51, 249, 460, 941, 491, 605, 345, 561, 276, 541, -363, 105, 1008, -24, 775, 210, 625, -997, -168, -291, -300, 237, 384, 728, 1167, 985, -353, 178, -1307, 320, 294, 1150, -917, 729, -242, -636, 484, 154, 403, 722, -239, -917, 470, -588, -817, -382, + 1079, -939, -1343, -672, -228, 708, -80, -478, -929, -694, 435, -60, -23, 601, -657, 189, 662, 263, 441, 650, -445, -218, -377, 498, 103, 258, 174, -443, 547, 139, 81, -216, -816, -771, 70, -366, -160, -347, -311, -131, 135, -2, -349, 438, 358, -47, -395, 66, 225, -275, -134, -157, -5, 190, -95, -189, -164, 134, 102, 214, 256, -137, -126, -156, 148, 168, 903, -282, -1006, 75, -422, -1428, -728, 1883, 259, -844, -935, 110, 14, 393, 485, -652, -439, -1043, 241, -375, -254, 1607, 341, -216, -1656, -101, -885, 880, 1079, 119, + 839, -985, -392, -620, -150, 1641, 2035, 331, -545, -721, -1472, 26, 189, 1784, 991, -253, -2924, -1508, 251, -274, 2567, 867, -1233, -506, -2200, -689, 77, 1446, 1484, 1674, 79, 403, -175, 152, 2051, -749, 1506, -357, -1546, -455, -1639, -518, 2148, 985, 1534, -499, 1203, -1337, -213, 329, 642, 1285, -429, -18, 82, -111, 199, 350, -363, 66, -382, -683, 314, 574, 317, -62, -414, -917, -911, -471, 312, 866, 485, 673, -895, -1166, -905, 114, 1036, 1159, 884, -513, -2240, -1429, 48, 1143, 2443, 959, 205, -1096, -1458, -494, -460, 1293, 1418, 543, + -78, -1210, -913, 296, 429, 1056, 512, -520, -369, -626, -299, 320, 284, 324, 401, -69, -110, -1297, 1439, 8, -382, -2238, -609, -600, -1018, 2178, 18, 979, -1490, 831, 687, -662, 430, -122, 384, 6, 1107, 399, -1083, 658, 533, 3, 746, -548, -289, 948, 656, 634, 310, 552, -1629, 1425, -819, -512, 307, -1133, 1662, -467, 165, 1209, 40, -176, 652, 675, 1177, -281, -1095, -1108, 123, -396, 516, -668, -328, -450, 334, -2088, 34, 1562, 431, 640, -58, -164, 410, -546, -632, 397, 217, -675, -757, 2894, -311, -932, 264, 1360, -36, -1059, + 440, -193, -402, 878, 1108, -803, -1323, 306, 321, -299, -790, 46, 402, -115, -127, -45, -135, 220, 238, -265, 32, 126, 62, -156, 63, -2, -364, 272, 116, 519, 257, -187, 212, -94, 304, -14, -75, 424, -100, 293, -80, -320, -25, 383, -101, 435, -400, 544, 131, -378, 167, 16, 202, -57, -150, -31, 135, 430, -1130, 410, 1756, 2793, -1240, 918, -1846, -530, -1128, -140, 1701, 1827, 1433, -32, -1160, -683, 619, 61, 307, 962, -25, 486, -1214, -294, -705, -836, 460, 404, 20, 866, -728, -10, 186, -1002, -34, 88, -649, -227, + 236, -413, 954, -297, 1448, 1115, -720, -183, -999, -1120, -1481, 490, 678, 1993, 1503, 722, 954, 202, -1090, -700, -611, -721, -159, 434, -41, -489, 131, -493, 322, 756, 143, -746, 599, -347, -391, -746, 398, 363, 175, 116, 1742, 1353, 1089, 208, -251, -1451, -307, -131, 1452, 855, 380, 462, 1259, -176, -497, -654, -565, -243, -123, 140, 19, 35, 656, -50, -384, -212, -128, 40, 328, 608, 261, -47, 366, -575, 242, 581, 233, 1118, -440, 35, 194, -427, 127, -695, -29, 282, 18, 324, 178, -51, -9, -108, -11, 174, -190, -3040, + -1730, -1028, 1756, 795, 4640, 4324, 4506, 4520, 4882, 3402, 1803, 2571, 1574, -795, -1423, -2241, -4301, -3910, -4017, -2945, -2947, -2217, -1806, -990, 113, -1731, -860, -377, -256, -947, 252, 1133, 1311, 460, 1546, 1928, 496, 361, 398, 1894, 2010, 2498, 2834, 2446, 2814, 4233, 1737, 3300, 4546, 2892, 3453, 2682, 1365, 1592, 1798, 1565, 2170, 2103, 1330, 232, 665, 1228, -71, 119, -596, -722, -2133, -991, -3702, -4688, -3727, -4280, -5781, -5616, -3309, -6270, -5659, -5198, -5843, -4963, -3761, -4757, -3477, -994, -2309, -2888, -1129, -1161, -929, -1057, -456, 251, 587, 1109, 1476, 1660, + 1906, 1939, 2780, 1672, 3275, 3636, 1744, 3374, 3237, 2022, 2479, 3571, 2446, 4035, 3066, 3823, 2694, 2419, 2537, 2342, 1858, 2102, 1850, 1434, 1096, 1042, 865, 340, -291, -256, -175, -1325, -2109, -2049, -2081, -2286, -2102, -2365, -1708, -1785, -1452, -1100, -856, -985, -958, -753, -532, -595, -760, -426, -234, -467, -679, -420, -316, -426, -515, -249, -36, 148, -7, 103, 336, 342, -33, 102, 226, 151, -49, 43, 122, 94, -99, 6, 82, 139, 75, 142, 28, 84, 156, 280, 90, 54, 24, 94, 25, 68, -4, 34, -82, -132, -225, -90, -146, -121, + -206, -59, -110, -68, -65, 86, 26, 71, -18, 144, 123, 226, 104, 263, 278, 338, 186, 308, 291, 297, 155, 233, 172, 247, 120, 153, 68, 150, 18, 71, -16, 37, -74, -30, -100, -30, -115, -46, -113, -22, -91, -6, -72, 16, -52, 33 }, + {330, 16, -20, -13, -24, -170, -169, 162, 41, -99, -148, -73, -111, -196, 250, 29, 92, 123, 360, -10, 59, -87, -30, -68, -232, 51, -70, 22, 164, -65, -14, 34, 19, -40, 9, -217, 46, -6, -76, 66, 33, -146, 231, 7, 35, 212, -81, -93, -209, -107, 147, 8, 157, -77, -170, 74, -159, -73, -308, 126, 110, 65, 95, 212, 57, -94, 116, 176, -114, 87, 1, -38, -58, -48, 121, -25, 134, -67, 55, -42, 50, 95, -50, 34, -34, 77, 65, 53, -25, 18, 4, -44, 23, 75, 15, 25, + -43, 29, -23, 17, -33, 7, 45, -131, 37, -82, -164, -17, -193, -238, -148, -114, -259, 9, -93, -54, 82, 276, 27, -67, -30, 43, -4, 114, 199, -18, 223, -27, -13, -28, 128, -168, 28, 19, -39, -11, -98, -167, 229, -78, -15, -42, 102, -109, -91, 39, 36, 158, -107, 130, -75, -132, -9, -55, 37, 71, -1, 92, 46, 67, -86, -104, -169, -126, 18, 203, 28, 165, 45, -86, 116, 54, -121, 215, 38, -204, 55, 92, 20, 61, 55, -144, 55, 50, 38, -9, 108, 35, -25, -35, 1, 42, + 1, 57, 0, 3, 36, -14, -29, -20, 8, -28, -28, 37, -1, 36, 34, -9, -1, -240, -216, 47, 23, 181, -141, 187, -96, -41, -293, -18, 17, -99, -20, 157, 145, 222, -57, -33, 135, 65, 121, -300, 294, -64, -7, 47, -39, -2, -30, -20, 181, -5, 239, -42, -103, -201, 20, -91, -83, 139, 104, 145, 1, 18, -218, -155, -6, 195, 64, -25, 62, -82, 204, -11, -184, -228, -85, 255, 189, 197, 88, 7, -218, -96, -34, -125, 128, -23, -64, 112, -309, 91, -43, 72, -27, -87, 135, 52, + -148, -154, 75, -40, 88, 25, -69, 47, 55, -3, 19, 0, 4, -26, -3, -42, -2, -37, 58, 33, -49, 23, -15, 16, 13, 21, -37, -30, 8, 23, -66, -36, 59, -67, -134, -20, -104, 49, 165, 67, 4, -66, -388, -253, -10, 114, 134, 9, 26, -53, 133, 61, 106, -167, 158, 93, -183, 70, 165, -7, 52, 29, 150, -116, 88, -14, -22, -143, 7, 157, -100, -70, -137, 183, -19, 37, -144, -404, -120, 62, 36, 152, -109, -65, -63, -25, -132, 6, -119, 268, 92, 219, -221, -41, -92, 205, + -63, -35, -170, 107, -5, -111, 172, 56, 20, 201, 41, -172, -25, 23, -48, -56, 0, -145, 292, 123, 42, 185, 78, 75, 133, -36, 113, -63, 19, 14, 6, -31, 20, 11, -12, -17, -20, 17, -16, 4, 97, 13, -4, 1, -2, -10, 77, 23, 49, 6, -50, -9, 109, -87, 70, 5, -43, 182, 141, -15, -249, -335, -257, 95, 2, -145, -36, 16, -31, 375, 66, -272, -71, -82, 15, -129, 214, -160, -207, 194, -80, 53, 53, -90, -243, 32, -129, -116, -118, -15, 193, -27, -41, 282, 54, 43, + -362, -41, 196, 227, -124, 61, 33, -359, -46, -22, -34, 90, 6, -201, 28, -161, 157, -55, 201, 40, -226, 101, 430, -166, 6, -319, 80, 269, -479, 69, -32, -41, 122, -77, -123, 226, 218, -186, -20, 142, -60, 34, 69, 42, 16, -54, 123, -3, 81, 4, 110, 74, 70, -5, 26, 120, 16, -24, 45, 38, 17, 100, -53, 32, 19, -21, 10, 37, 28, 13, -7, 5, 326, 36, 149, 224, -277, -90, -210, 104, 129, 244, 484, 72, -361, -38, -87, -42, -153, -3, -13, 177, 149, 49, -8, 4, + -51, -45, 213, -71, -23, 152, -14, 88, -10, 194, -146, -302, 377, -25, 94, -283, 26, -88, 418, 62, 192, -42, 171, 108, -367, -62, -204, -183, 31, 260, 39, -56, 414, -46, -225, -179, -115, 198, 623, -4, 177, 42, -190, -46, 10, 180, 287, 23, 232, 199, -363, 10, -59, -12, 192, -85, 55, 85, -22, -192, -125, -279, 73, 108, -7, 41, 48, 32, 4, -88, 25, 39, 2, 36, -38, 72, 1, 35, -13, -15, -28, 8, -11, 11, 69, 96, 89, 11, 29, 59, 41, 1, 42, 11, -1, 73, + -105, -481, 112, -53, 168, 100, 448, 84, -80, 101, 343, 370, 159, 259, 275, -215, -159, -345, -363, 35, 162, -316, -217, -22, -355, -303, 155, 43, -156, -112, -232, 190, 147, 316, 616, -73, -170, -71, -298, -9, -231, -266, 317, 30, 47, -409, 419, 77, -256, -89, 217, 9, 50, -13, 38, 116, -195, 227, 8, -169, -43, -286, 47, -294, -252, 214, 231, -235, -361, 86, -172, -32, -94, 116, -101, 155, 54, 189, -42, 139, 78, -333, -112, 74, 45, -1, -159, -98, -46, 101, -60, -61, 7, 80, 70, -11, + -2, -100, -48, 11, -20, -16, 79, 1, -3, -76, 68, 14, -23, -20, -44, -16, -49, 63, -15, 25, -18, 123, -184, -196, 237, -71, -60, 141, -203, -208, 239, 326, 2, -17, 106, -276, 471, -289, 31, 229, -112, 214, 252, 87, -273, 292, -47, 111, -215, -37, -405, 140, -242, 94, -417, 244, -306, -209, 168, 241, 76, 28, 6, -258, -245, -152, 624, 346, -103, -581, -86, 165, 335, -191, 23, -401, -142, -49, 101, 60, -94, -7, 172, -198, -15, -226, 120, 149, 430, 185, -215, 90, -121, -328, -45, 190, + 23, 541, -313, -151, 80, -281, 140, 45, -57, 275, 64, 121, -2, 10, -47, 136, 198, 49, -62, 148, -81, 46, -143, -47, -4, -184, -7, -72, -36, -72, -123, -55, 37, 46, 28, -39, -10, 81, -138, 14, 8, -417, -58, 82, 247, 117, 322, 56, -379, 241, -320, -348, 12, -34, 266, 325, 303, 436, 110, -455, 498, 269, -197, 379, -46, 45, -331, -118, -93, -150, 323, -539, -118, -254, -237, 43, 262, -124, -307, -330, -425, -434, -217, -75, 190, -341, -437, -262, -108, -217, -141, 382, -212, 35, 207, -349, + -203, -236, 381, -162, 250, 540, -49, 120, 56, -167, -214, -150, 259, -39, 296, 17, 225, 51, -368, 460, -195, -60, -391, 242, 522, 87, -67, 137, 64, -332, -151, 19, -75, -36, -139, -141, -19, 24, 24, 240, -24, 30, -116, 91, 14, 181, 82, 81, 38, -22, -74, -66, -105, -24, -78, 54, 32, -2, -53, -48, -38, -17, 23, -20, 103, 772, 480, 356, -259, -549, -153, 340, -527, -281, 6, 415, 291, 243, -307, 233, -86, 233, -64, 598, 352, -25, -551, -52, 410, 356, 10, 724, 322, -141, -5, 54, + -90, -197, -282, -40, -783, 225, -272, 41, -32, 207, 285, 11, 73, -344, 243, -122, 511, 16, 69, -1253, -59, 339, 168, 361, -127, -348, 191, 72, -293, 278, 51, -272, -1, 16, 92, -98, -465, -457, -24, -162, 150, 166, 63, 177, -568, -189, 24, 129, 131, -220, 172, 45, -86, 63, 154, -102, 16, -30, 61, -104, -174, -53, 195, -148, 16, -109, 75, -43, 66, 120, -20, -111, 89, -15, -140, -82, 43, 66, 2, -50, 21, -7, 77, -35, 155, -51, -16, 98, -531, -852, 137, 296, 306, 8, 708, -503, + 165, 98, -145, -447, -190, -254, 300, -131, -277, -455, -43, -168, -88, -343, 182, -21, -162, 186, 234, 280, -363, 662, 39, -94, -408, -381, -79, -50, -398, -412, -318, 267, -185, 442, 140, 738, 252, 280, -96, 396, -70, 96, 559, -170, 202, -673, -859, 187, -42, -544, 33, 14, -742, 209, -219, -146, -290, 279, -271, 15, -31, 135, -1, -405, 236, -58, 93, -511, -707, -628, 34, -149, -716, -150, 685, 362, 158, 131, -318, 10, -74, 31, -106, -85, -5, -8, 26, -1, -223, -53, 57, -42, 105, 175, 145, -2, + -26, -76, 231, 134, 152, 127, 93, -17, -90, -80, 180, -140, 107, 153, 59, 75, 11, 45, -123, 11, -36, -105, 50, 70, 139, 517, 680, -20, 183, 427, 354, -37, -860, 590, -55, 160, -173, 302, -18, -373, 109, 679, 108, -445, 396, 281, 188, -335, 365, 268, 36, 432, -167, 116, 700, 507, 25, 161, 346, -655, -127, -41, -97, -574, 153, 175, 39, -445, -1, -762, 47, -544, -101, 282, -226, -329, -258, 163, 140, -303, 128, -108, 384, -194, -213, 198, 359, -32, 161, 138, -825, -17, -53, -422, 52, 545, + 174, -150, -58, 399, 287, 176, -103, 632, 15, -519, 79, 633, 336, 323, 198, 38, -146, -174, 123, 107, 159, 241, -48, 191, 124, 23, -22, -14, 94, -80, -22, -79, 9, -34, 104, -184, 44, 71, 32, 151, -244, -101, 56, 56, -13, 155, -42, -42, -58, 24, 109, 120, -129, 29, 80, -123, -69, -64, -51, 344, -776, 337, -803, -925, -619, 52, -530, 516, -172, -618, -35, -148, 72, 130, -161, -69, 402, -112, 145, -215, -240, 673, -237, -64, -34, 162, 393, -819, -71, 456, 415, 414, 39, -139, 840, 301, + 254, 345, 137, -109, -9, 515, 148, -344, 173, 938, -505, 652, 219, -967, 221, 668, -87, 307, -19, -731, 359, 935, 36, 639, -396, 567, 444, -4, -99, 521, 254, -660, 655, -155, -169, 418, -213, -230, -315, 115, 19, 122, -45, -125, 487, -440, 61, -83, -164, -358, -366, 216, -43, -217, -328, -252, -461, -305, -35, -209, -148, -23, -248, 106, -220, -200, -74, 61, 56, -96, -31, -318, 112, -334, 244, -79, -40, -142, -100, -9, 374, 205, -59, 102, 251, 155, -167, -63, 87, -127, 201, 57, -105, 82, -305, -519, + 1258, 635, -1485, -600, 148, -236, 418, 510, 530, 625, -387, 1176, -184, 38, -391, 448, 578, -414, -490, -93, -286, 60, 225, 45, -312, -106, 472, -30, 235, 67, 570, 876, 321, -409, -986, -73, -174, 119, -235, 331, 533, 58, -209, -438, 1060, 943, -133, 465, -263, -333, -1038, 578, -489, -102, -39, -313, 172, 641, 88, -270, 291, -120, -434, 655, 122, -887, 1139, -769, -425, 453, 447, 391, -2, -948, -91, 93, -65, -305, 176, -155, 59, 128, -406, 468, 311, 163, 53, -179, -149, 0, 153, 23, 116, -66, -317, 102, + -460, -134, 134, -124, 237, -200, -40, -169, 187, 26, 232, 290, 184, 17, -222, 163, 252, -43, -40, -271, -133, 334, -121, 228, -29, -114, 105, 118, -17, -176, 326, -169, -408, 46, 582, 173, -791, -634, -152, 989, 103, -474, -1276, -354, -58, 303, 877, 673, -94, 9, 577, 470, 21, 129, -1722, -1085, -529, -850, 73, -474, 761, -174, -60, -3, -307, -350, 551, 344, 195, -78, -264, -235, 274, -617, -232, 109, -215, -300, 256, -891, -1248, 297, 389, 484, -729, -387, 403, 153, -1217, -1068, 64, -517, -536, 199, -983, 499, + -381, 410, 392, -244, -555, -1280, -449, -384, 717, -621, -406, 219, 733, 428, 3, -250, -83, 220, -221, 742, -461, -360, -175, -65, 203, -547, 321, 247, -230, -383, 88, -22, 372, -478, -624, -158, 98, -345, -52, -417, 18, 102, -188, 291, -79, -206, 90, -139, 85, -119, -433, -19, 32, 414, 325, -199, 2, -22, -244, -313, 152, -79, -114, 95, 507, 697, -111, -937, 425, -141, -391, -808, 241, 345, -1199, 452, 426, 1080, 98, -272, 67, -1324, -385, -162, 17, 241, -453, 809, 324, 1001, -202, 880, 565, 347, 802, 405, + 529, 680, 28, -897, -845, 169, 964, 694, -1289, -41, -220, -185, -137, -896, 226, -639, 569, -429, 1287, -344, -1853, -202, -641, 363, 272, 522, 1197, 263, -167, 652, -392, 1336, 222, 891, 418, 75, -344, -315, 2198, 6, -1524, -313, 1210, -734, 155, -343, 529, 1107, 639, -1295, -88, -1276, 171, -184, -755, -98, -208, -342, -7, -659, -718, 237, 264, -46, -803, 565, -712, -1105, -472, 261, -277, -499, -634, 103, 259, -582, -441, 199, -258, -473, 369, 286, -34, -71, 15, -119, -195, -215, 66, -439, 242, -167, 87, -555, 593, 276, + -1271, -459, -1442, 231, 1246, -915, -884, 845, 378, -1411, -1363, 446, 58, 211, 446, -43, -419, -193, 849, -604, 1051, 187, -263, 241, 601, 11, -198, -1127, -514, 140, -625, 540, 773, 70, 116, -802, 958, -329, -449, 806, -319, 15, -583, -45, -414, -1389, 467, -144, 1028, 1349, -34, -226, -861, -255, -250, 1284, -1223, -841, -2018, 60, -844, 243, 681, -362, -119, 1379, 867, 636, 93, 75, 1023, -1113, -63, 332, -147, 633, 283, 2650, 402, -709, -55, -482, -1315, -503, 34, 233, -265, -258, -261, -917, -27, -65, -508, 143, 316, -785, + 37, -529, 196, -26, -203, -96, 31, 480, 258, 32, 504, -308, -83, -141, 473, 338, 217, 514, 218, -348, -188, -48, 233, -441, -132, 25, -526, 566, -155, 90, 1222, -899, 313, -311, -434, -428, 1845, -252, 906, -736, 1258, -442, 19, 672, 726, 1729, 82, 277, 254, -744, 894, 270, -528, 865, -366, 1091, 838, -268, 729, 25, 680, 128, 1155, -716, 575, -1179, -295, 382, 1251, -66, 99, 529, -7, -434, -1512, -945, 255, -660, -32, 464, -1319, 792, -62, 944, -460, -909, -160, 2459, 557, -2265, 392, 558, 135, 2433, -153, -1820, + 1866, -648, -127, 2032, -227, 1331, 211, -1236, 45, 2077, -1717, 879, -1056, -1201, 868, 508, -1089, -416, -680, -385, -402, 175, -671, -157, 255, -701, -497, 331, -806, -216, 271, 88, -194, 574, -270, -226, -300, -565, 251, -373, -414, -120, 57, 771, -9, 199, -672, 40, 831, -186, -115, -95, 27, 30, 575, -342, -379, -212, -581, -701, 161, -366, -298, 396, 117, 248, -117, -1779, -168, 314, -707, -162, -1929, 1238, 1817, -776, 232, -1370, -4131, -750, 161, 2118, 1719, -1677, -1556, -1503, -1293, -857, 1055, -152, 2361, 1655, -512, -1942, -4976, -3166, + 193, 5526, 4148, 801, -2185, -5368, -5566, -367, 3192, 5022, 5435, 600, -1799, -2201, -2999, -2636, 148, 1884, 3410, 2405, 1862, -2430, -3054, -3515, -4308, 515, 5093, 5087, 996, -1789, -4839, -6269, -2163, 520, 2312, 5785, 2086, 19, -3204, -2563, -1125, 1340, 2217, 3980, 1000, 2093, -200, -2618, -2225, 153, 2516, 2810, -1302, -2391, -3000, -717, 450, 729, 418, -1456, -1318, -506, 912, 24, -21, 235, 722, 635, 437, -238, -1842, -1178, 98, 952, 1687, 856, -525, -1123, -1551, -927, -646, -772, 1690, 1827, 1944, 1666, -805, -3143, -2721, -1427, 1179, 4015, 3832, 234, -2489, -3810, + -3487, -209, 1869, 1815, 830, 805, 1, -1013, -1277, -1544, -281, 1467, 1739, 1276, 114, -1185, -1128, -503, 898, 663, -1540, 2, 816, -658, 901, -51, -146, -78, 195, 658, -248, 778, 555, 308, 375, 258, -52, -468, 758, -24, 469, -284, 420, -152, -41, 260, -350, -400, 74, -180, 617, 580, -526, 258, -306, 360, 25, 232, 111, 305, -369, 256, -427, -205, -44, -62, 378, -691, -116, -292, -587, -65, -219, 133, 594, -184, -780, 118, 514, 957, -24, 75, -503, -407, 469, 31, -152, 3, 809, 339, 268, 416, 747, -834, 349, -151, + -1211, -153, 972, -186, 867, -47, 546, -632, 405, -433, -106, 825, -219, 68, 38, -12, 325, -10, -104, -79, -2, -67, 174, 231, 371, 31, -278, -143, -365, 137, -380, 209, 186, -132, 246, 64, -394, -1, 21, 125, -692, 242, 180, 55, 3, -205, 256, -369, 387, -36, -21, 90, -151, 300, -322, 89, -167, 186, -580, 1464, 2488, 227, -1648, 562, -135, 2040, 940, 2006, -200, -933, -270, 456, 826, 669, -381, 79, 344, 273, 780, -538, 122, -731, -132, 26, 180, 404, 74, -303, 595, -40, -547, 747, -136, -245, 183, -92, + 558, 924, 11, 254, -316, -174, 514, 397, 424, 103, -286, -553, -596, -619, 499, 578, 539, 836, 867, 397, 37, -748, 460, -64, -705, 877, -72, 583, 287, -842, 229, -237, 175, 601, 100, -700, -520, -405, -763, 479, -55, 812, -16, 149, 8, -408, -284, 171, -655, 216, -15, -105, 226, -339, 211, 163, -37, -283, 392, -80, 347, -576, -448, -238, -239, 304, -126, -52, -83, -277, -169, -161, -6, 577, 68, -118, -15, -299, 229, -156, -37, -99, 257, 1, 29, -32, -196, -105, 282, -77, 201, -35, 105, -156, -871, -1984, + 145, 2722, 3625, 3092, 2150, -101, 144, -1591, -1870, -3170, -2377, -2547, -812, 204, 837, 1379, 3457, 2858, 1942, 616, -293, -1256, -917, -1305, -1637, -927, -932, -1170, -529, -773, 172, 529, 464, 1458, 1366, 1193, 797, 901, 584, 1081, 274, 934, 53, -256, -1637, -726, -1975, -2318, -2571, -2034, -1510, -549, 401, 1474, 1592, 1237, 2576, 2070, 2233, 2049, 1931, 762, 1253, -508, -1224, -1305, -3039, -3057, -2933, -3142, -2573, -892, -424, 687, 1760, 1897, 2340, 2795, 2513, 1941, 1783, 1296, 499, -57, -1038, -1554, -1547, -1786, -1480, -1681, -1731, -1480, -1135, -582, 79, 751, + 1474, 1361, 1362, 1585, 1771, 1355, 1376, 602, -629, -476, -1114, -1440, -1184, -990, -680, -877, -618, 69, 194, 298, 784, 673, 443, 100, 303, 290, 100, 369, -223, -264, -197, 136, -31, 1, -9, -55, -270, -201, -72, 266, 9, 120, 51, -151, -170, -96, -116, 36, 4, 44, 40, 62, -58, 64, -34, 15, 58, 170, 81, 198, 36, -4, -47, -43, -126, -11, -67, -35, -96, -8, -45, 20, -88, -14, 0, 65, -41, -13, -63, 35, 4, 85, 84, 116, 37, 76, -4, 4, -36, 37, -26, 26, -23, 13, -75, -51, + -136, -65, -79, -14, -52, 24, -13, 47, 13, 96, 51, 103, 51, 94, 40, 69, -6, 6, -82, -42, -97, -56, -113, -39, -69, 9, -9, 58, 8, 64, 13, 59, 3, 50, -11, 34, -24, 22, -32, 20, -32, 20, -31, 22, -28, 25 } + }, + { + {318, 167, -18, 109, 29, 24, -346, -152, -171, 134, -18, -114, 124, 126, 9, 121, -50, -5, -6, -77, -38, -168, 87, -248, 104, -130, 106, 195, 91, -39, -55, 144, -22, 5, 138, -148, -3, -51, -84, 17, -20, 29, 142, 230, -73, 3, 193, 13, 51, -72, -107, -17, 33, -183, -47, 94, 13, 33, 57, -28, -56, -55, -63, 69, 58, -35, -103, -130, 64, 0, -106, 111, -24, -9, 18, 30, -52, 65, -71, -26, 88, -62, 36, -104, -78, -40, -25, -8, 14, -43, -51, -7, -29, 10, -10, -11, + -14, 9, 4, -13, -21, -15, -7, -4, -11, -9, -16, 13, -23, -17, 19, -114, -31, 0, -108, -110, -65, 262, -184, -76, -128, -234, 88, 40, 10, 201, 191, 190, 62, -36, 30, 143, -61, 62, 73, -170, 242, 47, 76, 178, -68, -178, 13, 121, -85, -39, -113, 120, -3, -13, -197, -9, -24, 121, 63, -109, 217, 80, 45, 76, -35, 121, -47, 6, -150, -180, 145, 113, 201, 19, 55, -155, -239, -118, -72, -70, -110, -96, 50, -28, 73, -90, -34, 39, 45, -27, 123, 37, -91, 184, -72, 57, + 233, 50, 32, -72, 4, -79, -94, -15, 54, -1, 7, 3, -25, -8, 3, -23, 55, 35, -20, -5, 2, 14, 8, -36, -19, -9, 5, 16, -16, -26, 23, -13, 18, -9, -14, -18, -225, -211, 124, 28, 173, -267, -37, -106, 29, 317, 182, -278, 105, 26, -116, -129, -157, -256, 9, 30, -95, 45, -54, 9, 77, 59, 165, -145, 260, -159, 151, 119, -97, 70, 13, 108, -43, 56, 99, 33, 16, -40, 77, 23, -34, 184, -241, 16, -146, 291, 103, -254, 99, 332, -312, -149, 38, -26, -118, 99, + -41, 221, -186, -19, -62, -13, -11, 214, -198, -66, -21, -206, 111, 85, 221, 89, 188, 169, 28, -69, 53, -7, -24, -52, -5, -79, -31, -18, -110, 69, 6, -77, -13, -63, 6, -4, 42, -16, -25, 4, -35, -2, 36, 12, -8, -26, 100, -155, 19, -97, 102, 37, -157, 453, -288, 91, 489, -346, 160, -9, 159, -43, -297, -65, 243, 219, 59, -2, 122, 60, 3, 102, 102, -86, 130, -37, 205, -167, -259, 54, -226, 77, 3, -65, -74, -103, -154, 29, 52, 5, 37, 43, -96, -198, 153, 34, + 23, -11, 226, 45, 93, 239, -150, 57, 7, 71, 166, 131, -222, -194, -52, -111, -28, 6, -97, 49, -178, 7, -172, 82, 80, -100, -131, 13, 68, 11, -151, 19, -88, 62, 50, 22, -31, -44, 26, -6, -19, -3, -42, -34, -105, -28, 89, 38, -30, -21, 61, -25, 16, -31, -3, -10, 0, -40, -28, -17, -14, -16, -19, 0, -14, -26, -23, 9, 43, 14, 137, -55, 123, -18, 58, -68, 3, -43, 37, -17, -288, 220, 131, 359, -238, 151, -293, -43, 169, 195, -208, 64, -239, 23, -280, 96, + -211, -248, -234, 120, -190, 14, -222, 34, 25, -27, -164, 105, 132, 88, 58, -163, 85, -171, -62, 114, -3, -19, -54, -1, 106, -125, -258, -47, 71, -47, -193, -183, -274, 70, -84, -245, 173, -155, -164, 309, -116, -54, 18, -49, -105, 30, -173, -77, -146, -104, -53, 96, 223, 17, 131, 17, 96, 77, 178, -8, -11, 25, 62, -32, 1, -13, 129, 0, 59, 15, 19, -18, 23, -78, 84, 8, -5, -62, -24, -86, 36, -41, 24, -7, 84, -39, 11, -74, -71, 0, -35, 28, 51, 17, 22, -35, + 7, 233, -336, 60, 296, -110, 324, 89, 22, -95, -224, -149, 386, -207, 0, -72, 32, 231, 209, -127, 302, 299, -139, -74, 184, -155, -133, -10, -205, -5, -59, 26, 362, 123, 22, -165, -477, -58, 271, 66, -177, 138, 221, 191, 234, -378, 79, 19, -185, 102, -166, 121, -93, 150, 339, 444, 283, 129, -181, -50, -217, -230, -46, 261, 67, 5, 64, -254, 69, 33, 1, -128, 72, 140, -144, -277, 636, 83, -110, 40, 72, 290, -54, 81, 102, 145, -96, -47, -103, 53, -26, 58, 57, -36, -55, 109, + 19, 30, -16, 67, -107, -77, -49, -18, 128, 48, 87, 65, 70, 7, 19, -25, -73, 79, 24, 35, -49, -16, 2, 36, 102, 28, -170, -54, -102, -46, 86, -115, 503, -54, 145, 353, 51, -58, -230, 127, -122, -163, -469, -217, 99, -30, -88, -347, 123, 184, -265, -145, -69, -287, 116, 15, -146, -127, -48, -386, -132, 184, 320, -245, -296, -92, -14, -248, -197, 71, 136, -272, 537, -2, 220, -127, 207, -143, 64, -384, -77, 150, -377, 99, -83, -198, -428, -14, 241, -1, -452, -74, 85, 178, 335, -128, + 151, 384, 132, 43, -175, -39, -109, 18, -130, 25, -247, -38, 192, 49, 38, -113, -192, 102, -34, 105, -40, 9, -24, -61, -50, 67, 29, -20, -25, -3, -74, 30, -76, -101, -60, 28, 5, -5, -72, 51, -9, -43, -102, -38, 6, 8, 41, 103, 34, 19, 54, -21, -8, -34, 84, 142, -43, -153, 185, 27, -272, -439, -351, -454, 392, -240, -54, 123, -422, -181, -292, -136, -91, 188, -369, -203, 122, 143, 219, -8, 11, -71, 3, -92, 57, -300, -156, -265, 184, 85, 143, 176, -356, -31, -36, 322, + -120, 98, 181, -72, 194, -130, 216, 293, -114, -26, 259, -224, 357, -157, -560, 82, 294, -117, 36, -15, 226, 275, -282, -129, 69, 188, -332, -260, -201, 400, -7, -471, -98, -199, 162, 15, 123, -180, 290, 6, 54, 77, -263, -96, 22, -39, -65, -83, 77, -80, -69, 50, 87, 37, -154, -20, -60, -52, 67, 51, 133, -24, -62, 44, -145, -24, 1, -102, 15, 2, -34, 12, -165, -37, -18, 12, 23, 63, -7, 72, 47, 34, 7, -17, -262, -105, 178, 68, 256, 89, 125, -504, -199, 198, -134, -94, + -169, 53, 262, 70, 62, -337, -115, -60, 125, 299, -361, 172, -294, -76, -271, 36, 37, -12, 113, -251, -73, -235, -97, 6, -11, -295, 170, 193, -71, 229, 445, 48, 338, 435, 34, 16, 105, -89, 144, 32, -94, -143, 544, -54, 318, 143, -160, -183, -129, 154, -123, 200, 480, 245, -63, 10, -400, -274, -244, 380, 593, -257, -1, -237, -38, 365, -113, -19, -569, -73, -102, -57, 218, 18, 47, 69, -113, 94, 50, 84, -66, 121, -55, -10, -143, -31, 128, -43, -2, -21, 123, -27, -85, 55, 56, 34, + 45, 48, -45, 16, 88, 151, 131, 87, 48, 13, 14, -88, -5, 62, -53, 65, -18, 25, 84, -31, 150, -12, 347, 941, 418, -134, -27, -181, 442, -442, -243, -674, -2, 324, 416, 69, -157, -406, -288, 290, -54, 464, 4, -156, 227, 75, 2, -122, 312, -62, 270, -9, -138, 572, -132, 229, 573, 194, -18, -282, -46, -457, -523, 110, 345, -86, 53, -582, -214, 330, 187, -155, 116, -176, -77, -268, -437, 22, -99, -317, -505, -445, -138, -409, 192, -186, 70, 48, 3, 5, -60, -95, 268, 516, -345, 59, + -142, 184, -190, -12, -136, -68, 485, 344, 85, -58, 11, -200, 74, 191, -31, -174, -91, 165, -199, 14, 94, 78, -66, -70, 79, 88, -64, 105, 70, 87, -3, 116, -6, 72, 44, 41, 34, -31, 148, -143, -14, 26, -35, -39, -59, 59, 12, -124, -38, 74, -80, -387, -445, 118, 166, 533, -451, 147, 134, -742, -38, 9, -626, -335, -223, 163, -53, 42, -179, 267, 410, 222, -61, -628, -278, -339, 126, 44, -280, -17, 216, -179, 374, -334, -12, -193, -635, 113, -271, -298, 233, 354, -394, 157, 460, -146, + 201, 164, -110, 68, -515, 782, 304, 189, 740, -900, -70, -120, 94, 375, 382, 153, 181, 480, -47, -317, -562, 223, -214, 27, 150, -106, 227, 614, -377, 289, -184, -168, 458, 41, 142, 452, 366, -156, -188, -387, -101, 8, 203, 221, -1, 57, 29, -2, 41, 56, 15, 128, -62, 25, 86, 55, 24, -48, 116, 83, 16, -60, -95, -216, 131, -2, -22, 74, -108, -6, 73, 109, 152, 94, 41, 50, -3, 54, 113, 485, 572, 142, 353, -231, 167, 160, -937, 264, 304, 63, -299, -8, -579, 680, 411, -216, + -229, -340, -177, 491, -499, -287, -75, -85, -108, 70, -331, -339, -199, -261, -71, -339, -47, -228, -742, -475, -184, -119, 103, 122, -5, 20, 214, 102, 109, 520, 108, 175, 325, 699, 599, 30, -238, -462, 418, -105, 1131, 227, 507, -57, 64, -451, -19, 391, 226, 296, -341, -226, -438, -831, 477, -733, -90, 963, 63, 385, 183, 283, 7, -523, 505, -11, -459, -411, 14, 158, 339, 90, -402, 19, -81, 79, -159, -133, 69, 63, -126, 10, -42, -13, -166, -62, -54, 74, -46, -102, 129, -83, -34, -234, -248, -1, + 4, -103, -67, 79, 58, -105, -167, -12, -174, 100, -663, 191, 259, -456, -340, 0, 284, 648, -26, -512, -502, -34, -281, 78, 100, -571, -479, -928, -265, -275, -620, -432, 3, -299, -176, -173, -44, -627, -325, -389, -182, 183, -520, 32, 446, 515, -115, 135, 306, -525, 299, -232, 467, -230, 49, -248, -45, 905, -180, 336, -660, -118, 7, -641, 598, 14, -209, 416, -166, 101, 845, -341, -451, 308, -80, -950, 390, -1256, -662, 492, 399, 72, 272, -7, 1, -950, -498, -230, 94, -544, 140, 66, 229, -358, 29, 261, + 213, 147, 26, 119, -299, -205, -199, -67, -35, -36, 255, -136, 138, 238, -114, 67, -188, -159, -1, 55, -168, 68, -213, 185, -70, -48, 17, 165, -47, 61, -147, 131, 114, 313, 84, 255, -253, -96, -302, -96, -161, -156, 1266, 692, 2, -652, 336, -680, -552, 100, 563, 1110, -174, 561, -200, 398, 674, 376, 431, 230, -125, -552, -569, -173, -538, -159, -98, -122, 432, -74, -1106, 65, 268, 255, 663, -69, -1320, 751, -590, 193, -129, 444, 648, -720, -50, -360, -627, 455, -312, -774, 304, 452, 744, 197, -115, 81, + 610, -490, 962, -302, -267, -86, 586, -609, 57, 74, -1695, -251, 526, -244, 89, 236, 124, -83, 139, 582, 696, -550, 200, -403, -68, 688, -14, -71, 27, -46, -355, 99, 25, -208, -527, 8, -125, 162, -242, -227, -285, 244, 58, 150, 121, 11, 90, -116, -240, 370, -36, -178, -4, -128, -79, -148, 21, 47, -20, 104, 271, -9, -64, -109, 27, -136, -75, 155, -116, -97, -142, -355, -197, 51, 233, -185, -52, 728, 478, -1345, -769, 926, 1067, -572, -198, -1514, -842, 221, -72, 204, -810, -503, -556, 821, 1213, -57, + 325, -196, -110, -13, 276, 530, 125, -185, -104, -121, -730, -410, -742, -96, 225, -308, 452, -335, -130, 710, -347, 400, 273, -128, -685, -491, -410, 125, 1270, 226, 681, 809, 628, 470, 415, -701, 13, -113, 939, 450, 548, 986, -487, -661, 239, 834, -1415, -24, 108, 658, -1145, -1718, -310, 484, 116, 197, 535, 36, -386, -563, 14, 79, 107, 522, 767, 367, 53, 4, -13, 65, 73, -193, 280, 37, -265, -456, 52, -193, 94, 52, -46, 31, -195, 200, -107, 135, -209, -130, -369, -357, 12, 192, -167, 381, 5, 115, + -120, 408, 28, 188, -206, -107, -70, -70, -258, -43, 267, -467, 358, -13, -352, -608, 225, -294, -604, 435, 823, 258, -321, 496, 828, 311, 169, 62, -95, 395, -697, 44, -1001, 537, -809, -65, 432, 242, -462, 100, -535, 1094, 139, 356, 567, 1206, -499, 393, -578, 210, 431, 970, 227, -195, 990, 136, -72, -569, 36, 624, -212, 599, -738, 1135, 1174, -1412, -39, -88, 307, -240, -188, 609, -515, -1507, 16, 1342, -1060, 532, -247, -133, -647, 1481, -98, 246, 133, -995, 1286, 101, 1144, -2269, 213, -213, -688, -184, 395, -528, + 351, -476, -321, -627, 787, -304, 50, -669, 25, -492, -172, 227, -343, 157, 16, -454, 404, -187, 53, -195, 366, -281, 53, 24, -109, 490, -290, -347, -206, -389, -544, -273, 46, 31, -394, -223, -267, -378, -304, 126, 80, -16, -166, 947, 122, -740, 83, -1496, -331, 67, -280, -1194, -124, -787, -186, 706, 173, 928, 396, 345, 227, -328, 758, -389, 0, 347, 170, -468, 380, 145, 896, 358, -153, 529, -421, 718, 255, -805, -815, 417, 539, 214, 93, -395, -520, 153, -511, -788, -234, -139, -712, -274, 274, -498, -804, 221, + 305, 21, -94, -54, -133, 284, 1382, 274, -41, -59, -483, -793, -345, 1128, 1223, 618, 120, 1100, 536, -256, -1535, -1179, -962, -1844, -1067, 254, 1497, -667, 509, -746, 246, -66, 517, -245, -83, -666, -376, -166, -585, 747, -114, -396, -183, 73, -423, 302, 228, 483, 115, 134, -475, -562, -62, -415, -257, -484, -690, 34, -178, 41, 53, 529, 534, -199, -102, -236, 516, 339, 226, 79, -101, 293, -402, -162, -63, -465, -897, 473, -13, -289, -278, -166, -125, 336, 642, -278, 826, -946, 763, -102, 1018, -663, 589, -975, 847, -789, + -329, 1170, 273, 938, 1351, 133, -108, -569, -44, 851, 217, -310, -948, 75, 188, 442, 275, 367, 233, -560, -883, -381, 855, 321, 2728, -873, -729, 883, 1401, 287, -24, 362, 93, 443, -411, 156, 655, 717, 483, 2111, -269, -280, -137, 1086, 653, -560, 572, -18, 187, -462, 970, -973, 68, 1489, -1101, 3203, -1473, 1530, 1409, -1389, -1264, 1422, 62, -830, -349, 783, -2167, 335, -255, -1400, 913, -1097, 87, 77, -440, -1083, 293, -87, -48, 204, -223, -359, 194, 450, -172, 66, 352, -333, 490, 375, -780, 109, -438, 196, -31, 61, + -399, 163, 105, -5, -200, 600, 136, -25, 576, -411, -372, 58, 249, 59, 277, 140, -803, -420, 207, -475, 691, -314, -392, -19, -272, 547, 697, -1643, -705, 1017, -2131, -1312, -894, 1494, 3167, 883, -2491, -555, -2545, -1320, 2069, 1244, 1945, 1077, -1477, -2332, -1785, -421, 1052, 1206, 719, 411, -621, -2550, -3078, -659, 2351, 4204, 2843, -530, -1973, -2820, -2100, -1689, -2, 684, 2289, 2454, -1329, -823, -3082, -2855, -1033, 289, 2967, 4394, 1943, -1289, -4602, -3402, -2505, 1214, 2614, 1641, 1030, 886, -2748, -497, -1569, 588, -221, 1631, 2549, 2034, -2389, -4803, + -3620, 408, 2807, -63, 3894, 169, -1008, -1166, -866, 18, 2812, 2438, 442, -961, -351, -172, 1473, 1638, 191, 78, -259, -36, -318, -391, -268, -138, 561, 889, 717, -1057, -1212, -458, -505, -471, 1094, 906, 1151, 347, -501, -861, -1685, -1063, 700, 1491, 2242, 1547, 123, -3458, -3052, -1031, 1246, 1957, 2600, 1973, -159, -1963, -2910, -2795, -517, 3058, 3152, 1613, -767, -2100, -1477, -981, 82, 639, 832, 749, 450, 39, -479, -587, -611, -485, -565, 1124, 350, -911, -859, 3, -1385, -171, 205, 158, -120, 35, -466, -58, -55, 239, -161, 638, -169, -123, + -178, -200, 398, 114, -192, 618, 39, -1099, -549, 303, 538, -183, 66, 753, -19, 103, -616, -275, 190, -134, -137, -82, 498, 180, -195, -589, -235, -35, -538, 52, -614, -411, -286, -546, 855, -154, -387, 362, -6, -841, -49, 840, 681, -390, 527, 89, 503, -561, -829, 318, 365, 322, 279, -312, 308, -618, 418, -843, -742, 549, -434, 375, 513, 38, -397, 128, 145, -33, -33, -13, 334, -280, 217, -293, 392, -342, -188, 145, -119, -12, 154, 38, 103, 303, -242, -142, 173, 105, 345, -279, 95, -32, -217, -216, 88, 57, + -214, -316, 91, 6, -61, 205, -305, 354, 104, -302, -340, 285, -477, 328, -55, 228, -26, 80, 426, -679, 1357, 2065, -268, -766, -655, 1904, 864, 1843, 997, 1, -854, -192, 473, 865, 417, -402, -96, 413, 613, 75, 140, -428, 81, -207, 281, 311, 810, 694, -366, 60, -412, 107, 371, 549, 44, -262, 2, -474, 398, -110, 166, 368, 11, 490, -239, -135, -112, -506, -300, -771, -143, -879, 63, -303, 726, 107, 216, -680, 290, 5, -299, 498, -266, -140, 127, 329, -37, -181, 1122, 364, 262, 420, -300, -15, -98, 585, + 816, 782, -463, -510, -67, -203, 207, 527, 550, 24, 310, -37, -81, 179, 352, -33, 277, -230, 53, 4, 99, -79, 310, 179, -29, -86, 96, 54, 337, 19, -194, -214, -120, 94, 117, 214, -257, 36, -68, 172, -124, 243, -79, 91, -133, -113, 80, -212, 4, 234, 62, -96, 25, -11, -768, -1679, -223, 2210, 3417, 2862, 2268, -156, 270, -1667, -1883, -3078, -1767, -1940, -607, 240, 1342, 950, 2919, 2535, 842, 174, -449, -994, -1563, -577, -1602, -431, -778, -508, -371, 82, 31, 542, 791, 1195, 1301, 1555, 1348, -165, 134, -20, + 256, -774, 315, -827, -2058, -1015, -1540, -2596, -757, -228, -1047, 353, 800, 1808, 2137, 3147, 1992, 1618, 1614, 1000, -309, 161, -1586, -1371, -2298, -2738, -3156, -2303, -1770, -187, -83, 248, 926, 1560, 2818, 2781, 2774, 2220, 956, 1431, 228, -722, -1081, -2566, -2328, -2067, -1778, -1428, -860, -526, -176, 126, 866, 1021, 1352, 1115, 1602, 1445, 950, 1089, 736, -202, -590, -687, -1629, -1417, -1271, -957, -518, -22, -61, 414, 644, 497, 598, 378, 122, -15, 175, 38, -198, 213, 261, 16, 141, -42, -57, 22, 98, -6, -220, -297, -287, -337, -225, -70, + -76, 95, 39, 26, 113, 128, 104, 138, 219, 185, 106, 126, 43, -48, -15, -60, -89, -44, -80, -77, -93, -118, -128, -124, -70, 0, 6, 69, 71, 52, 39, 67, 67, 111, 75, 94, 48, -21, -51, -20, -64, -9, -3, -29, -17, -21, -63, -47, -41, -17, -20, -3, -4, 5, -19, -21, -32, 25, 38, 93, 93, 106, 77, 53, 20, 0, -29, -34, -79, -71, -83, -71, -81, -49, -33, 0, 2, 34, 28, 65, 65, 75, 56, 66, 34, 25, -11, -17, -43, -34, -46, -26, -35, -11, -19, 2, + -9, 10, -4, 12, -5, 9 }, + {227, 84, -112, -21, 80, -15, 85, -208, -146, -38, -173, 72, -37, -21, -116, -54, 111, 108, -41, -35, -71, -168, 188, 109, 6, 18, -9, 4, 151, -77, 29, -241, -195, -51, 19, -168, -30, 58, 16, 2, -82, -66, 158, -74, -65, -23, -21, 68, -35, -104, -2, 89, -127, 4, -136, 9, -99, 152, -7, -162, -22, -17, 21, -231, -26, 18, -152, 70, 5, -178, 82, 108, -93, -109, -193, 101, 60, 180, 90, -28, 36, -26, 56, 56, 126, 31, -53, -3, 16, -5, 73, 18, -23, -35, 36, 27, + 55, 26, 22, 31, 30, 11, 19, -4, -8, 11, 9, 13, -6, 15, -20, -1, -168, 76, -210, -57, -30, -105, 100, 234, -96, -30, 10, -96, 66, -14, -79, -133, -72, 211, 202, 115, 235, 140, 74, 223, -139, 49, 94, -4, 37, -66, 42, -308, 6, -18, 110, -69, -40, -21, 84, -97, -17, 28, 59, 59, -17, -104, 19, 37, 74, 57, 87, -98, -60, -18, -176, -21, 45, 150, 166, -23, 91, 69, -14, 62, 73, 108, -45, -1, -82, 14, -71, 48, -105, -98, 57, -1, -194, -18, -146, -39, + -22, -24, -193, 18, 66, -57, -56, 33, 23, 14, -39, -103, -7, -45, 38, 1, 1, -12, -44, -47, -55, 4, -25, 23, -35, 13, 6, -31, -2, -34, -14, 2, -1, -30, -9, -5, -213, -198, 73, -22, 164, 168, 13, 5, 319, -85, -9, 270, 10, -154, -229, 166, -68, 2, -142, 45, -102, 113, 499, -181, -148, -179, -196, 37, -160, -392, -11, 41, 0, -155, -34, 129, -162, -94, 233, 78, -60, -54, 150, -73, 107, 100, -214, -140, -127, 141, -109, -63, -59, -70, -12, -142, 1, -42, 35, -18, + -313, 146, -175, 139, 25, -255, 52, 173, 53, 287, -121, 17, 33, 68, 102, -111, 43, 39, -166, 229, 16, -31, 97, -31, 43, -40, -87, -5, -56, 76, -19, 16, 89, 32, 34, -18, 48, 10, -13, 33, 65, -45, 4, -48, 31, -15, 96, -134, 64, 66, -70, 31, -34, -288, 90, 268, 226, 251, 46, -56, -215, -115, -100, -83, 226, 310, 24, -22, 224, -361, 9, -30, -5, -118, -119, 130, 163, 4, -34, 64, -174, -133, 135, -147, 281, 252, 44, 155, 133, 26, -113, 39, -5, -198, 193, -18, + 91, 155, -184, -73, -219, -51, 51, 206, -211, -85, 156, -33, -135, 226, -188, -397, 68, -224, -99, 107, -95, 18, 24, -98, 170, -156, -175, -212, -23, -93, 15, 55, -129, 33, 38, 9, -61, 33, 28, 87, 14, -29, -60, -40, -26, -17, -21, -39, 12, 16, 26, 7, -11, -31, -12, 43, -44, -48, -14, -2, -4, 33, 40, 36, -23, 12, 8, 14, 8, -14, 86, -42, 5, -358, 76, 338, 27, 53, 102, 317, 43, -304, 337, 149, 122, 206, 178, 2, -64, 194, 148, 51, -140, 169, 79, 250, + 291, 111, -73, 7, -3, 122, 369, 220, -206, 358, 14, -44, 47, -264, 293, -39, 4, -35, 74, -40, 151, -213, 299, 255, -10, -48, -168, -318, -110, 126, -75, -120, 167, 197, -135, -120, -409, -142, -52, -21, -457, 231, 24, -272, -225, 74, -107, 27, -69, 14, -121, -28, -109, 76, 151, -44, 114, 12, -50, 135, 46, 5, 111, -14, -53, -72, -82, -85, -81, -99, -73, 3, -41, -93, -47, 7, -22, -36, 17, 35, 16, -44, -62, -76, 6, -72, 62, -41, -43, -40, -1, -30, 4, 15, 29, -35, + 35, 164, -208, -6, 6, 4, 347, 184, 1, 424, 201, 382, 96, 126, 416, -167, -271, -178, 389, 90, -214, 290, -77, -176, 266, 619, -158, 27, 103, 115, -159, 17, 347, 33, 425, -96, 456, 317, 112, 265, 173, -165, 116, -45, -37, 39, 34, -33, 122, 79, 296, 193, -242, 82, 113, -185, 13, -430, -550, 217, -139, -365, -75, -198, 240, 48, -110, -276, 216, -201, 132, -225, 35, -93, 337, 59, -129, 125, -284, 256, 44, -249, 13, -29, -69, -33, 37, 69, -70, 116, -25, -51, -53, -46, -104, -13, + -36, -107, -37, 33, -63, 61, 11, -41, 18, -72, -12, -52, -5, -6, 4, 29, 41, 41, 3, 19, -2, 18, -33, 25, -24, 17, -246, 37, 6, 68, -152, 171, 180, -16, -127, -420, -368, -276, 127, 42, 64, -344, 217, 160, 271, -294, 279, 222, -175, -138, -90, 292, 195, -123, 25, 440, 217, 117, 249, 178, 64, -140, 29, 24, -65, -156, 384, 185, -364, 248, 239, 245, 185, 55, -229, 11, -34, 342, 41, 155, 303, -51, -339, 78, 177, 345, -459, -253, 121, 9, 38, -266, -70, -257, -40, 128, + -90, -139, -178, 78, -47, -83, -219, 12, -292, -1, -32, -142, -166, 189, -67, -42, -96, -173, 59, 90, 55, 71, 45, -94, -57, -26, -28, -88, -177, -73, -8, -55, -9, -89, 4, -46, -39, -63, -80, -36, 71, -51, -31, 15, 26, 24, -41, 61, 82, 91, -28, -2, -6, 14, 11, 160, 22, -284, 289, 183, -85, 113, 174, -192, -63, 734, -23, 285, 202, -615, -325, -36, -25, -9, 350, 77, -169, 359, 222, -47, -58, 114, -58, -129, -273, -326, 180, -73, -152, -17, -505, -95, 34, 277, -333, -98, + 44, 21, 73, 23, 357, -417, -138, 91, -13, -246, -51, 322, 278, 239, -66, -415, -188, 148, -47, 276, -16, -7, -206, -129, 242, -298, 203, 157, -214, -107, -50, 33, -230, 111, 80, -114, -35, -315, 114, 242, 347, 29, 93, 164, 51, -276, 188, -67, 31, 0, -88, -96, -51, 127, 22, 106, -12, 17, -153, -53, -71, 114, -12, -51, 79, -60, 62, -38, 10, -127, 29, -30, -27, -82, 28, -14, -72, -132, -30, 12, -53, 52, -14, -87, -558, -33, 75, 376, 45, -14, 225, -163, 490, -489, -49, -104, + 81, -23, -42, 127, -94, -166, -113, -98, -296, -46, 207, -47, -133, 312, -7, 376, -368, -209, 462, -46, -30, 28, -294, -33, -367, 108, -440, -10, 323, -105, 219, 292, 167, 230, -298, 296, 30, -770, -132, 113, -66, -85, -333, 261, -285, -55, -322, -299, -467, 415, 0, 483, -243, 364, 479, -316, 390, -483, -405, -437, -155, -308, 96, 146, -20, -57, -6, -346, 24, 4, 197, 79, 75, 143, 77, -75, -6, -141, -87, 4, 54, 3, 62, -46, 67, -21, 34, -214, 10, 82, 59, 119, -71, -95, -129, -3, + -14, -100, -113, 11, -21, 18, -3, -32, 53, 171, -46, -40, -26, -47, 150, 6, 14, -54, 87, -100, -23, 66, 362, 615, 86, -161, -333, 208, 563, 7, 160, 31, 224, 158, 171, 310, -373, -27, -140, 487, 358, -16, 557, 297, 48, -523, -262, -399, -187, 43, 149, -142, 20, 570, -108, 3, 28, 586, -358, -142, -146, -55, -350, 404, 26, 272, -420, 59, -46, -247, -100, -460, 144, 11, 97, -55, -29, -535, -183, 212, 341, -97, 89, 716, -47, 44, 131, 324, -303, 72, 361, -212, 262, 79, 273, -362, + -186, 52, 83, 187, 209, 202, -138, 60, 123, 244, 377, 177, -180, -81, -141, 63, 79, 167, 149, 93, 157, -167, -35, -171, 149, -196, 201, 147, -151, 92, -19, -89, 22, 33, -55, 49, 250, -5, -1, -151, 78, -4, -5, -137, 143, -116, 45, 65, 113, -10, -54, -333, -509, 141, -55, -513, 140, 52, 465, 411, -382, -458, 102, -349, -185, 14, 692, 10, -89, -619, -311, -54, -463, -702, 480, -181, -223, -40, 521, -164, 56, -105, -106, -304, -163, 51, -735, -472, -137, -268, -250, -86, -289, 249, 112, 80, + -177, 126, -1060, 984, 576, -100, -136, 553, 31, -332, -474, -60, -168, -197, -286, -290, 360, 338, -156, 742, -415, -339, -309, 1, 240, -870, 254, -275, 452, -493, 213, -45, -170, 340, -644, 602, 31, -9, -139, 17, -12, -305, 56, -85, 155, 202, -189, 92, 126, 284, 7, -93, -20, -26, -117, 82, -48, -69, 69, -114, -40, 26, 78, 96, -231, -175, -155, 24, 89, -2, 57, 51, 148, 78, -128, 113, 18, -143, 504, 42, 1175, 383, -24, 51, -455, -589, 734, -217, 83, 974, -254, -47, -208, 760, 146, -314, + 449, -163, 666, 350, 166, 99, -74, -255, -83, -69, -714, -179, -115, 395, -221, 75, 131, -512, -762, -27, 658, -44, 585, -101, -817, -316, 37, 185, 148, -665, 6, -190, 483, -493, 611, 903, 586, -184, 110, 364, -129, 708, 819, 722, 236, 792, -27, -319, 103, -414, -522, 286, -224, 647, 335, 172, -221, -796, -721, 507, -319, -644, 431, 860, 517, -275, 411, 252, -88, -203, 245, -305, -92, -32, -209, 28, -44, 177, 108, -41, -279, 157, 144, 99, -59, 10, -260, 22, -1, 68, 63, 7, 158, -54, 218, 244, + 65, 198, 20, -156, -369, 85, 11, 80, -61, -266, -594, 348, 434, -7, 212, 143, 210, 174, 79, -48, 102, -125, 225, -404, -1126, -452, 615, 35, -185, -378, -4, 517, 660, 139, -408, -73, 527, -643, 59, -82, 472, 538, -436, 818, 157, 30, 1156, 3, -366, 403, -196, 55, -250, 83, 767, 85, 978, 410, -859, -942, -208, 240, 521, -731, -260, -110, 880, 804, -696, -32, -426, 262, -150, 919, 8, -209, 603, -129, -722, -368, -122, 739, -666, 394, 1154, 542, 773, -215, 311, -217, -486, -470, 238, -336, -28, -126, + 206, -13, 465, -114, -222, -85, -100, 107, -81, 172, -329, 229, -220, -107, 60, -95, -107, 141, -148, -64, -49, -127, -404, -235, -46, -57, -124, -167, -44, 107, -77, 58, -69, -16, 82, -317, 26, -55, -238, -22, -558, 419, 588, 512, -883, -404, 538, 1677, 89, 373, -495, 162, -36, -67, -466, 148, -171, 810, 622, -825, -382, 894, 437, 328, 82, 488, 545, 188, 321, 317, -415, 70, -406, -167, 97, -68, 56, -331, -317, 247, -74, 336, 246, -763, 566, 125, 454, -512, 288, 479, -374, -586, -611, -650, -671, -537, + 186, 986, 249, 311, 453, 42, -18, -371, 644, -819, -1672, 579, -389, 82, -1420, 358, 441, 87, 274, 247, -216, -351, -566, 187, 118, -417, 306, -153, -728, -385, -14, -120, 71, 58, 209, 109, 34, -5, 165, -95, -236, -401, -251, -256, -97, -137, 147, 241, 169, -317, -32, -128, -2, 197, 53, -280, -539, -37, 18, 53, -195, -72, -204, -31, -265, -265, 173, -259, 106, 54, -143, -46, 165, -145, 60, -198, 397, 283, 379, -541, -279, -77, 346, -721, 1198, 567, -97, 651, 393, 621, -327, -421, -406, 752, 268, 134, + 680, -597, -1927, -130, 129, 227, -1084, 839, 612, -1167, -896, 27, 480, 39, 273, 615, -164, 381, -563, -646, -514, -671, -1042, 288, 108, -702, 923, 357, -226, -222, -545, -411, -950, -518, 337, 841, -322, 82, 346, -750, 539, 728, 107, -189, 624, 169, 69, -450, -524, -41, 932, -289, -863, -17, -1099, -1146, -1192, -573, -630, -404, 511, -74, 459, -97, -154, -433, -118, -129, 245, -192, -278, -57, -111, 38, -404, 74, -188, -163, 209, -194, -67, 67, -146, 311, -202, 45, 504, 60, 293, -115, -182, 513, 73, -274, 6, 4, + 35, 72, -151, 320, 14, -26, -161, 29, -163, -422, -729, -382, -392, 475, 935, 345, -426, -901, 967, 520, -467, -252, -249, 54, 227, -298, 502, 467, 26, -314, -298, -281, -37, 181, -142, -311, -739, 227, 648, -373, 573, 17, 384, -323, 427, 1241, -467, 541, 1078, 186, -190, -301, 312, 22, 549, -423, 1479, -460, -996, 227, -455, 1170, 382, -369, 65, -709, -972, 1188, 134, -323, 1173, -612, 150, -347, 678, -872, -979, -700, 213, 416, 777, 330, 821, 1289, -163, 256, -175, 159, -46, 48, -955, 31, -1317, -443, -264, 228, + -50, 282, -109, -398, -418, -100, -279, -308, -529, -6, -61, 391, 163, -329, 288, 131, 236, 314, -425, 110, -181, -86, 412, -147, 201, 276, -177, -462, -240, 159, -757, -242, 8, -114, -178, 330, -363, -400, 265, 446, -218, 371, -262, 899, -125, 17, 1097, 108, -586, -701, -602, 1107, -742, 433, 531, -369, 114, -625, -133, 488, -440, 349, -144, -783, -1689, -162, 1527, 627, 159, -312, -455, -94, -599, 185, -845, 1005, 77, 113, 85, -352, -1020, -401, 822, -680, -170, -474, 368, -342, 1137, -193, 235, -424, -1059, 225, -809, -192, + -71, -1495, -1252, -1194, 394, -229, -641, -427, -410, -389, -572, -397, -99, -1344, 372, 138, 491, -307, 1158, -132, 223, -413, -160, 613, -1237, 513, 810, -844, -539, 38, 130, -233, -401, -664, -41, 2, -393, 320, -291, -532, -288, -237, 327, -24, 10, -27, 244, -653, -185, -92, -126, -60, 9, -781, 22, -264, -204, -83, -345, 77, -100, 51, 11, -85, -88, -209, -35, -176, -40, 88, -177, -300, 5, -88, -67, -196, -315, -232, -84, -61, -61, 88, -232, -251, 452, 288, 549, -201, -1168, 344, 8, 1934, 1961, 248, 11, 473, + 224, 505, 842, 326, 874, 1343, -341, 185, -1104, -146, 135, -132, -334, -655, -567, 319, 300, -1446, 1031, 291, 1459, -80, -298, 489, -109, 1553, 386, -69, 290, 315, -421, -933, -746, -361, 1146, 25, 1260, 165, 1232, -348, -1710, -628, -501, 892, 102, -818, -1205, -829, -173, 1045, -907, -776, -523, 934, -461, -260, -1199, -1179, 370, 210, 1595, 420, -174, -424, 497, 528, 1704, 39, -558, -732, -52, -68, 35, 273, 242, -390, -93, 136, 353, -375, -314, 487, 704, 335, 213, 282, -301, -121, -190, -33, -43, 161, 0, 928, 191, -34, + -284, -480, 461, 753, -273, 16, 28, 97, 428, 190, 318, 328, 82, 256, 83, -14, 83, -227, -77, 57, -137, -92, -298, -18, 97, 20, 1183, 442, -568, 1104, -64, -2187, -660, 1369, 1532, -1082, -1073, -1101, 614, 929, 1873, 559, 244, -1074, -106, -74, 423, 928, 682, 47, -1130, -2207, -581, -1121, 1655, 1742, 3057, -925, -2939, -650, -1010, 2275, 777, 2307, 597, -785, -2240, -1525, 81, 268, 2510, 1009, -89, -2078, -3607, -954, 75, 1654, 3791, 815, 1141, -2457, -3748, 149, 857, 2970, 1750, 1240, -696, -2427, -1978, -33, 553, -66, 1501, -1258, + -1168, -303, -2666, 401, 123, 711, -540, -1091, -584, -470, -1223, 265, 350, -405, -67, -1158, 157, 316, 370, 517, 163, -601, 198, -200, -108, 71, 921, 144, -37, -252, -713, -154, -289, 258, -136, 287, 189, -662, -1473, -737, -1084, 864, 878, 1037, 596, -1382, -1240, -1921, -468, 1529, 1702, 1651, 73, -1854, -1385, -1087, -31, 2726, 1894, 761, -1480, -1726, -1291, 615, 643, 935, 489, -306, -434, -823, -359, 230, 28, 275, 391, -26, -1275, 1686, -60, 266, -724, -1558, 919, -1569, 1665, 267, 127, 377, -1039, 1028, 75, 721, -997, 364, -15, 1230, + -504, 317, 783, -897, -552, 108, -860, 1378, -327, -541, 1199, 1423, -398, -1020, -278, -897, -191, 584, -110, -1122, 115, 632, -422, 711, -595, 286, 721, -279, 468, -1280, -1327, 1348, 721, 2070, -104, -503, 1722, -977, -904, 628, 569, 1004, -916, -411, 247, -174, 968, -772, -2462, 652, 1349, 34, -1150, 231, 678, -257, -313, -896, -311, -737, 741, 201, -548, -128, 888, -626, -245, -564, -84, 455, -654, 357, 930, 379, -29, -253, -68, -333, -456, 732, -314, 342, -115, -348, -18, 95, 53, 278, 300, -528, -181, 290, 213, 560, -86, -451, + 171, -528, 247, -479, -294, 28, -121, -315, 754, -315, 144, 355, 59, 283, 496, 12, -104, 46, -43, -650, -399, 2475, 678, 689, -2097, -523, -1642, -1387, 1253, 1319, 2609, 1207, -346, -501, -300, 827, 577, 22, 1271, 251, -501, -595, -478, 915, 6, 801, 378, 485, 126, -196, 99, -1, 126, -203, -46, 265, 226, 1713, 1382, 1128, -92, 311, -690, -111, -427, -780, -811, 251, 453, 654, 803, 661, -405, -1045, 1602, -1136, -492, -288, 554, 75, 788, 817, 720, -957, -337, 133, -370, -1545, 1043, -361, -272, 587, 1209, 1366, 1002, 976, + 848, -895, 124, -228, -272, 513, 414, 547, 272, -249, -440, -647, -694, -1406, -555, 207, -73, 857, 5, -392, -124, -561, 219, 64, -35, -9, 371, 801, -92, 38, 449, 30, 12, -164, -46, -194, -178, 45, -376, 167, 225, -286, -410, 111, 90, -156, 415, 544, -69, 77, -173, -559, -228, 111, 100, -3201, -1593, -2199, 1589, 349, 4545, 4694, 4681, 5345, 5268, 3781, 2357, 2949, 1308, 274, -2486, -2168, -5434, -4755, -4265, -2516, -3170, -2419, -195, -773, -308, -382, 23, -6, 148, 620, 670, 636, 1879, 1924, 2043, 1457, 4083, 1067, 1719, 2856, + 3188, 1184, 3208, 3856, 3044, 2641, 2689, 297, 1612, 3246, 3211, 2068, 2696, 2354, -26, -869, -608, -1602, -1973, -252, -2219, -3390, -2638, -3158, -4667, -2136, -3154, -3500, -4954, -4030, -4568, -5222, -3475, -5905, -6983, -7012, -3811, -4743, -5975, -1172, -2657, -1246, -664, 1965, 880, 2881, 1535, 2722, 2595, 1706, 1349, 2112, 3911, 3976, 3993, 4075, 4237, 5144, 4599, 3817, 4695, 5294, 4235, 3186, 3803, 3199, 2071, 2611, 1771, 883, 387, 813, 246, -319, -216, -414, -1005, -1537, -1527, -1666, -1421, -1781, -2808, -2524, -2902, -3275, -3817, -3806, -3150, -3163, -2589, -1639, -1850, -1254, -877, 115, + 3, 27, 171, 591, 676, 243, 538, 854, 680, 317, 359, 643, 382, 180, 268, 376, 342, 240, 293, 474, 453, 214, 73, 158, 281, 168, 0, 114, 213, 167, 81, 145, 155, 121, 106, 53, 41, 119, 95, 104, 43, -66, -84, 48, 100, -22, -69, 19, 0, 20, 59, 42, 71, 129, 120, 191, 257, 300, 233, 237, 260, 218, 153, 174, 208, 161, 77, 100, 60, 47, -3, -79, -73, -101, -208, -290, -285, -250, -326, -306, -280, -251, -244, -201, -162, -110, -92, -57, -34, -9, 3, 26, 26, 47, 32, 38, + 24, 33, 15, 19, 4, 9 } + } }; -const Word32 CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[9][BINAURAL_CHANNELS][80] ={ -{ -{ -458548416, -288004928, 36019744, -187976224, -327024704, -388965120, -402463680, -378622848, -315303744, -217801008, -101255464, -18409304, 126339688, 208903984, 259983504, 282743072, 282130496, 261101264, 224144144, 176714288, 121097136, -59304908, -2450816, -59071368, -112419160, -165159216, -213866816, -254361920, -287706976, -315477152, -335894912, --349012800, -358507904, -365523744, -368087296, -367405472, -366872896, -365766400, -361818784, -357276864, -354698816, --351249952, -344377984, -337027168, -330979840, -322771072, -311363104, -300767968, -291396352, -279003744, -264058880, --251057488, -238803408, -223079520, -206383376, -193078640, -179949472, -163271040, -147447296, -135569040, -122029144, --104452528, -89380416, -77912320, -62358632, -43022688, -28498718, -16430397, 2892124, 24889872, 39438536, -55137716, 83652008, 112425064, 131199440, 166224368, 237659328, 303841568, 310876160, 281195808, }, -{ -458548416, -288004928, 36019744, -187976224, -327024704, -388965120, -402463680, -378622848, -315303744, -217801008, -101255464, -18409304, 126339688, 208903984, 259983504, 282743072, 282130496, 261101264, 224144144, 176714288, 121097136, -59304908, -2450816, -59071368, -112419160, -165159216, -213866816, -254361920, -287706976, -315477152, -335894912, --349012800, -358507904, -365523744, -368087296, -367405472, -366872896, -365766400, -361818784, -357276864, -354698816, --351249952, -344377984, -337027168, -330979840, -322771072, -311363104, -300767968, -291396352, -279003744, -264058880, --251057488, -238803408, -223079520, -206383376, -193078640, -179949472, -163271040, -147447296, -135569040, -122029144, --104452528, -89380416, -77912320, -62358632, -43022688, -28498718, -16430397, 2892124, 24889872, 39438536, -55137716, 83652008, 112425064, 131199440, 166224368, 237659328, 303841568, 310876160, 281195808, }, -}, -{ -{ --6680285, -164793056, 343598464, 346121216, 119204136, -232472624, -541734400, -697761472, -693628096, -586175552, -429270720, --248121328, -57235272, 124696320, 282600256, 410929056, 505404384, 559695424, 573703488, 555786496, 514943488, -457637344, 390174144, 316517088, 236630688, 152837488, 72540920, -216896, -68562176, -134133440, -193402384, --245631328, -294658912, -340661248, -380098688, -414168000, -447189312, -478065824, -503238624, -524577632, -544824640, --560739648, -569639872, -575469248, -580737024, -581515456, -576584320, -570787712, -564958400, -554609152, -540835136, --529266688, -518326848, -502419360, -483915040, -467812128, -450364896, -427169920, -403682368, -384242272, -362739520, --336320096, -312757376, -293879392, -270810048, -243498336, -222114240, -204527952, -179219328, -150961664, -132316128, --114280488, -82068232, -49047452, -29818348, 4310000, 85765128, 181594976, 229271264, 229039328, }, -{ -6680285, --164793056, -343598464, -346121216, -119204136, 232472624, 541734400, 697761472, 693628096, 586175552, 429270720, -248121328, 57235272, -124696320, -282600256, -410929056, -505404384, -559695424, -573703488, -555786496, -514943488, --457637344, -390174144, -316517088, -236630688, -152837488, -72540920, 216896, 68562176, 134133440, 193402384, -245631328, 294658912, 340661248, 380098688, 414168000, 447189312, 478065824, 503238624, 524577632, 544824640, -560739648, 569639872, 575469248, 580737024, 581515456, 576584320, 570787712, 564958400, 554609152, 540835136, -529266688, 518326848, 502419360, 483915040, 467812128, 450364896, 427169920, 403682368, 384242272, 362739520, -336320096, 312757376, 293879392, 270810048, 243498336, 222114240, 204527952, 179219328, 150961664, 132316128, -114280488, 82068232, 49047452, 29818348, -4310000, -85765128, -181594976, -229271264, -229039328, }, -}, -{ -{ -56929792, -32702954, -17035988, -65899832, -70332240, -23156854, 30343408, 43584792, 15283104, -24489904, -51496656, --56739204, -39491152, -9847823, 13324599, 21841520, 27769648, 43945568, 64601140, 74967584, 70637720, -56937308, 36863168, 10703059, -16742856, -38056096, -51105280, -59698972, -67841152, -76534168, -84198000, --87912608, -85837608, -79298520, -71068824, -62506268, -54630912, -50245212, -51711944, -57933740, -66320736, --76117560, -87351048, -98688144, -108890840, -118427280, -127745752, -136126304, -143473376, -150588000, -156772208, --159970352, -159729840, -157088960, -151699312, -142245552, -129212480, -113966960, -96036008, -74430176, -50194208, --24536612, 3521873, 34633544, 66910760, 99025840, 132155608, 166103024, 197674800, 225691408, 252471600, -277316896, 295024512, 305051648, 314057120, 321451456, 309289184, 259698416, 184246048, 126319824, }, -{ -56929792, -32702954, -17035988, -65899832, -70332240, -23156854, 30343408, 43584792, 15283104, -24489904, -51496656, --56739204, -39491152, -9847823, 13324599, 21841520, 27769648, 43945568, 64601140, 74967584, 70637720, -56937308, 36863168, 10703059, -16742856, -38056096, -51105280, -59698972, -67841152, -76534168, -84198000, --87912608, -85837608, -79298520, -71068824, -62506268, -54630912, -50245212, -51711944, -57933740, -66320736, --76117560, -87351048, -98688144, -108890840, -118427280, -127745752, -136126304, -143473376, -150588000, -156772208, --159970352, -159729840, -157088960, -151699312, -142245552, -129212480, -113966960, -96036008, -74430176, -50194208, --24536612, 3521873, 34633544, 66910760, 99025840, 132155608, 166103024, 197674800, 225691408, 252471600, -277316896, 295024512, 305051648, 314057120, 321451456, 309289184, 259698416, 184246048, 126319824, }, -}, -{ -{ -13747653, -24179592, 14550812, -24625194, -59763932, -56667260, -25659746, -7880728, -26664768, -66838280, -96977680, --99336688, -78250008, -48997524, -22731114, 686121, 28130962, 62903016, 99795712, 129662376, 146496496, -149463792, 140745008, 123942552, 103496360, 82495584, 59947008, 31973884, -3155727, -42750492, -83415784, --124656056, -166657616, -206721600, -240942832, -268026368, -288604096, -302155232, -307542208, -305552032, -298326816, --287198560, -272998336, -257139152, -240664192, -223538016, -205876032, -188226944, -170212240, -151019104, -131421704, --113209432, -97021160, -82820928, -71288944, -62351112, -53964116, -44628468, -35070556, -25678536, -15246060, --3839164, 6704981, 16334297, 26765700, 37558952, 47022912, 56507276, 68250792, 80564456, 91340536, -103145784, 117800752, 131357280, 142814112, 158838624, 177448720, 178645408, 151044336, 119084944, }, -{ -13747653, -24179592, 14550812, -24625194, -59763932, -56667260, -25659746, -7880728, -26664768, -66838280, -96977680, --99336688, -78250008, -48997524, -22731114, 686121, 28130962, 62903016, 99795712, 129662376, 146496496, -149463792, 140745008, 123942552, 103496360, 82495584, 59947008, 31973884, -3155727, -42750492, -83415784, --124656056, -166657616, -206721600, -240942832, -268026368, -288604096, -302155232, -307542208, -305552032, -298326816, --287198560, -272998336, -257139152, -240664192, -223538016, -205876032, -188226944, -170212240, -151019104, -131421704, --113209432, -97021160, -82820928, -71288944, -62351112, -53964116, -44628468, -35070556, -25678536, -15246060, --3839164, 6704981, 16334297, 26765700, 37558952, 47022912, 56507276, 68250792, 80564456, 91340536, -103145784, 117800752, 131357280, 142814112, 158838624, 177448720, 178645408, 151044336, 119084944, }, -}, -{ -{ -368293, --3048890, -1468879, 7374996, 13603772, 9038222, 481573, -840203, -845572, -20397874, -66472136, --115881976, -136780208, -120776088, -85447304, -49606872, -16407312, 19768660, 60117196, 100017976, 135532528, -165566688, 188641408, 201786160, 203722640, 196553808, 182668176, 161795184, 132951784, 97609040, 58577984, -17105780, -26522496, -70843872, -114004536, -155064960, -192145024, -221224640, -239529248, -248493392, -251313040, --249691680, -244772864, -238466784, -231702208, -223685120, -214202368, -204148928, -193284272, -180464320, -166262480, --152371488, -138978704, -125753424, -114062520, -104983496, -97000224, -88618064, -80697064, -73618424, -65599720, --56105156, -46832324, -37693168, -26623966, -14120242, -2343442, 9921911, 25036438, 40991168, 55364812, -71156336, 90472416, 108683072, 124603984, 146057872, 170790448, 175328080, 145876960, 110227648, }, -{ --368293, -3048890, 1468879, -7374996, -13603772, -9038222, -481573, 840203, 845572, 20397874, 66472136, -115881976, 136780208, 120776088, 85447304, 49606872, 16407312, -19768660, -60117196, -100017976, -135532528, --165566688, -188641408, -201786160, -203722640, -196553808, -182668176, -161795184, -132951784, -97609040, -58577984, --17105780, 26522496, 70843872, 114004536, 155064960, 192145024, 221224640, 239529248, 248493392, 251313040, -249691680, 244772864, 238466784, 231702208, 223685120, 214202368, 204148928, 193284272, 180464320, 166262480, -152371488, 138978704, 125753424, 114062520, 104983496, 97000224, 88618064, 80697064, 73618424, 65599720, -56105156, 46832324, 37693168, 26623966, 14120242, 2343442, -9921911, -25036438, -40991168, -55364812, --71156336, -90472416, -108683072, -124603984, -146057872, -170790448, -175328080, -145876960, -110227648, }, -}, -{ -{ -4243428, --4525285, 1450088, 13779329, 980326, -21391622, 2690797, 72931768, 105982616, 41259604, -73534672, --141541728, -127762928, -73687680, -26748520, 3726421, 29141354, 55375012, 80288512, 99776384, 109567304, -107421424, 95509336, 78276312, 59301152, 41651520, 28340342, 20354924, 16241419, 14893873, 16932908, -22392348, 28755880, 32857574, 34234648, 35179540, 37076844, 37903088, 34362960, 25459492, 12666932, --2234457, -17712446, -32049046, -44368624, -55446416, -66281544, -77069432, -88304528, -100865696, -114238080, --126841656, -138443440, -149727936, -159640176, -166064912, -168644576, -167984224, -163220032, -153458640, -139938080, --123814784, -104166912, -80791016, -55704652, -29579440, -913217, 29350196, 57663696, 83715352, 109902848, -134050760, 150826368, 161287296, 170820512, 175198160, 159931168, 119301304, 68813968, 34583076, }, -{ --4243428, -4525285, -1450088, -13779329, -980326, 21391622, -2690797, -72931768, -105982616, -41259604, 73534672, -141541728, 127762928, 73687680, 26748520, -3726421, -29141354, -55375012, -80288512, -99776384, -109567304, --107421424, -95509336, -78276312, -59301152, -41651520, -28340342, -20354924, -16241419, -14893873, -16932908, --22392348, -28755880, -32857574, -34234648, -35179540, -37076844, -37903088, -34362960, -25459492, -12666932, -2234457, 17712446, 32049046, 44368624, 55446416, 66281544, 77069432, 88304528, 100865696, 114238080, -126841656, 138443440, 149727936, 159640176, 166064912, 168644576, 167984224, 163220032, 153458640, 139938080, -123814784, 104166912, 80791016, 55704652, 29579440, 913217, -29350196, -57663696, -83715352, -109902848, --134050760, -150826368, -161287296, -170820512, -175198160, -159931168, -119301304, -68813968, -34583076, }, -}, -{ -{ --6826851, --6057515, -15246597, -32778116, -43596604, -44637596, -48894980, -55131272, -34748432, 33612416, 127658776, -196816336, 210170464, 177002048, 124192200, 68890200, 16225313, -29956324, -65310348, -90420872, -109859360, --125607392, -135870224, -139659456, -137849664, -130121400, -116014584, -99597072, -88147760, -84653272, -85240072, --84846544, -81829864, -76485312, -68936912, -59672128, -49427020, -37944964, -24684788, -10306848, 4103305, -18002356, 30329448, 39567388, 46104328, 52113524, 58238684, 63140852, 66578436, 69650944, 72033584, -72430328, 71256728, 69492032, 66113504, 60049548, 52780316, 45839648, 38427608, 30284888, 23361400, -18210124, 13047037, 8094403, 5720897, 5493263, 5160403, 6211597, 11516955, 19177028, 26549340, -36696200, 51961588, 67656472, 82720536, 105781288, 134890432, 144971792, 119775904, 86061480, }, -{ --6826851, --6057515, -15246597, -32778116, -43596604, -44637596, -48894980, -55131272, -34748432, 33612416, 127658776, -196816336, 210170464, 177002048, 124192200, 68890200, 16225313, -29956324, -65310348, -90420872, -109859360, --125607392, -135870224, -139659456, -137849664, -130121400, -116014584, -99597072, -88147760, -84653272, -85240072, --84846544, -81829864, -76485312, -68936912, -59672128, -49427020, -37944964, -24684788, -10306848, 4103305, -18002356, 30329448, 39567388, 46104328, 52113524, 58238684, 63140852, 66578436, 69650944, 72033584, -72430328, 71256728, 69492032, 66113504, 60049548, 52780316, 45839648, 38427608, 30284888, 23361400, -18210124, 13047037, 8094403, 5720897, 5493263, 5160403, 6211597, 11516955, 19177028, 26549340, -36696200, 51961588, 67656472, 82720536, 105781288, 134890432, 144971792, 119775904, 86061480, }, -}, -{ -{ -19251654, --18982144, -61636000, -64225332, -8608725, 72361608, 113291576, 74142408, -16891570, -88233664, -95866888, --59329604, -25140592, -13041131, -11723113, -10652056, -11085847, -10317585, 361314, 17995912, 26939646, -21286932, 13588740, 15809238, 24864102, 32784022, 39150236, 46495168, 52472688, 53149684, 48338248, -39996348, 30160870, 21744346, 16369731, 11051488, 1435593, -12585328, -28260348, -44339096, -59943248, --72372880, -80202072, -85403816, -89399208, -90870232, -89631672, -87996904, -86639152, -83959632, -80319112, --77761456, -75691280, -72060424, -67717672, -64384244, -60509108, -54260468, -47500192, -42052560, -36249524, --29358248, -24135568, -21457656, -18673980, -15665893, -15128485, -15772731, -13948980, -11482595, -11852499, --11142756, -4625143, 2744484, 6984154, 18542984, 45823008, 73170672, 79101488, 70233992, }, -{ -19251654, --18982144, -61636000, -64225332, -8608725, 72361608, 113291576, 74142408, -16891570, -88233664, -95866888, --59329604, -25140592, -13041131, -11723113, -10652056, -11085847, -10317585, 361314, 17995912, 26939646, -21286932, 13588740, 15809238, 24864102, 32784022, 39150236, 46495168, 52472688, 53149684, 48338248, -39996348, 30160870, 21744346, 16369731, 11051488, 1435593, -12585328, -28260348, -44339096, -59943248, --72372880, -80202072, -85403816, -89399208, -90870232, -89631672, -87996904, -86639152, -83959632, -80319112, --77761456, -75691280, -72060424, -67717672, -64384244, -60509108, -54260468, -47500192, -42052560, -36249524, --29358248, -24135568, -21457656, -18673980, -15665893, -15128485, -15772731, -13948980, -11482595, -11852499, --11142756, -4625143, 2744484, 6984154, 18542984, 45823008, 73170672, 79101488, 70233992, }, -}, -{ -{ --148713, -38926900, 55264416, 7113003, -82071992, -162379296, -201008768, -177901296, -80883360, 68788200, 213079232, -305129504, 345367456, 354848576, 334543584, 273673696, 182609664, 91002304, 16658568, -45738180, -106727256, --167042560, -220613680, -262422496, -291595520, -311575712, -327321056, -340128672, -346870688, -345117280, -335773024, --319985792, -297351872, -268227152, -234532064, -197647952, -158186336, -117700896, -78248936, -40883256, -6394133, -23968064, 50220516, 74125768, 96413424, 115648440, 130894496, 143004160, 152630784, 159769024, 165597840, -171820704, 178088672, 182780928, 185774512, 187760944, 188035280, 185756256, 181894016, 177441200, 171699904, -164425840, 157017568, 149826176, 141460112, 132021928, 123266096, 114913464, 105238512, 95279016, 87270512, -79717816, 70102456, 60736744, 54407572, 46471008, 30596274, 10727755, -2694018, -6955163, }, -{ --148713, -38926900, 55264416, 7113003, -82071992, -162379296, -201008768, -177901296, -80883360, 68788200, 213079232, -305129504, 345367456, 354848576, 334543584, 273673696, 182609664, 91002304, 16658568, -45738180, -106727256, --167042560, -220613680, -262422496, -291595520, -311575712, -327321056, -340128672, -346870688, -345117280, -335773024, --319985792, -297351872, -268227152, -234532064, -197647952, -158186336, -117700896, -78248936, -40883256, -6394133, -23968064, 50220516, 74125768, 96413424, 115648440, 130894496, 143004160, 152630784, 159769024, 165597840, -171820704, 178088672, 182780928, 185774512, 187760944, 188035280, 185756256, 181894016, 177441200, 171699904, -164425840, 157017568, 149826176, 141460112, 132021928, 123266096, 114913464, 105238512, 95279016, 87270512, -79717816, 70102456, 60736744, 54407572, 46471008, 30596274, 10727755, -2694018, -6955163, }, -}, +const Word16 CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS][2885]={ {-1, 0, 0, 0, 0, 0, -1, 0, -3, 2, 0, 2, 0, 1, 5, -1, -6, -6, -2, -4, 1, -3, -8, 2, -2, -1, 2, 1, -3, -4, -5, 1, -3, -2, 1, -6, 5, 5, -3, -1, -2, -6, 1, -5, -4, 4, -2, 8, 33, -15, 15, -6, 5, 0, 8, -3, 2, 3, 4, 4, 7, -2, 1, 13, 10, -27, 5, -3, 1, -9, 6, -11, 11, 9, 5, -2, -4, -4, 8, 7, -3, 2, 14, -5, 0, -5, 2, 2, 0, -4, 7, 1, -2, 5, 134, -10, + 18, -1, 6, 2, 4, 3, 13, -8, 5, -3, 2, 7, 11, 4, 2, -5, 10, -7, 4, -4, -11, 1, 3, 0, -3, 1, -4, 7, -14, 3, -3, 4, 0, -20, -7, 2, 3, 2, -4, -5, -4, 3, 8, -3, 3, 81, -95, 19, -23, 13, -15, 12, -20, -6, -12, -2, -10, 1, 19, 28, 12, 6, 1, 9, 20, 14, -9, -10, -14, -7, -8, 1, -1, -1, 1, 4, -6, 9, -9, -11, 4, 0, 1, 3, -8, -9, 3, -5, -7, -1, 1, 6, -185, 37, -9, 5, + 4, -15, -7, 15, -2, 2, 17, 6, -6, -11, 12, 1, -14, -20, -29, 10, -13, 3, -4, 6, -3, 2, -15, -15, -9, -4, -9, 3, -4, 6, 18, 3, 3, 12, 3, 3, 0, -2, -11, -2, 3, -2, 0, -221, 83, -20, 27, -13, 19, -10, -3, -19, 15, -22, 15, -4, 21, -28, 8, 27, 8, -22, -8, -13, -5, 9, 5, 6, -3, -7, -10, -10, 0, -12, -2, -11, -7, -31, -8, -4, 2, 1, 11, 5, 11, -1, 13, 3, 2, 3, 27, 96, -27, 42, -26, 11, + -28, 22, -2, 24, -2, -3, 23, -4, -4, 20, -10, -19, -31, 27, -3, 18, 2, 13, 6, -18, 7, 7, -2, 9, 13, -18, 2, -1, -2, -10, -5, -10, 2, -2, 7, 22, 0, 11, -2, 2, -3, 3, 9, -4, -9, 291, -72, 27, -14, 24, -11, 19, -11, 6, -29, 13, -27, 20, -9, 6, -8, 29, 4, 7, -14, 19, -2, -9, 16, -13, -20, 0, -6, 9, 0, -3, -7, 3, -1, 3, -14, 3, -6, 21, -4, 10, 2, 8, 15, -11, 0, 3, -6, 12, -3, -6, + 25, -151, 60, -46, 28, -23, 8, -30, 20, -12, 28, -3, 12, -24, -10, -1, -9, -8, 32, -23, 4, 15, -29, 8, 11, -7, 10, 4, 6, -18, -1, -6, 12, -9, 7, -22, -4, 16, 8, 5, -5, -3, -16, -18, 10, 4, 0, -2, -1, 2, 2, -4, -3, 2, 3, -6, -4, -4, -244, 81, -43, 12, -4, 14, -18, 20, -8, -6, -2, 15, -7, -11, 9, 28, -3, 2, -46, 4, 1, 23, -7, -3, -35, -12, 1, 1, 13, 17, -26, -24, 16, 5, -27, -21, 11, 7, + -1, 0, -10, 11, -3, 4, 2, -14, -6, 8, -22, -11, -4, 5, -4, 1, -11, 0, -8, 1, -244, 108, -59, 46, -41, 21, -47, 11, -31, 49, -24, 18, -3, 1, -22, -6, -9, 45, -8, 23, 36, 21, 6, -4, 9, -7, 20, 20, 3, -9, 4, 4, -13, -6, 10, 15, -11, -10, -11, 1, -4, 7, -11, 8, -17, 5, -9, 0, 2, -6, -9, -11, -11, -14, 2, -13, -6, 1, 90, 94, -35, 31, -39, 5, 11, 0, -16, 17, 4, 37, 19, 42, -7, 24, -7, 15, + 22, -3, -31, 29, -4, 12, -7, -1, 4, 35, 5, -20, -7, 4, -11, 27, 11, -5, -8, -16, 11, -15, 15, 16, -13, 9, 8, 4, -2, 26, 16, 19, -1, 2, 8, -6, -3, -2, -6, -1, 1, 2, -5, -11, -12, 2, 6, 275, -99, 34, -47, 31, -31, 40, -14, 1, -31, 60, -9, 54, 3, 9, -37, 13, 54, -17, -47, 6, 1, 21, -34, 27, -1, 2, -4, -33, -10, 5, -39, 6, 15, 12, -12, -4, -2, 18, 5, -4, -9, 14, 9, 35, 8, -6, 19, 7, + -3, 6, 14, 9, 1, 2, -12, 2, -2, 14, -2, 5, -2, 5, -1, 4, 92, -133, 80, -59, 25, 9, -6, -5, 16, -33, -21, -17, -13, -46, 24, -42, -1, -34, 13, -25, -20, -10, 39, 6, 38, 20, 26, 37, 2, -5, -5, 11, 29, -2, -2, -19, 15, -2, -11, 11, 9, 30, 13, 14, -21, -10, -1, -4, 15, -43, 10, -10, -7, -13, -15, -5, -14, 6, -10, -2, -22, -22, 0, -8, 19, -282, -61, 13, -53, -22, 3, -1, -45, 13, -45, 2, 37, -6, -6, 20, + 14, 21, 2, 25, -13, 7, 29, -2, -1, -18, 28, -21, -11, 8, 12, 21, 65, -17, -10, -27, 2, -20, 5, -8, -30, -2, 39, 11, -26, -13, 13, -16, -19, 4, -9, 3, 5, 25, 4, 12, 7, -20, -10, 13, 13, -8, 8, -1, -9, 1, -347, 286, -100, 85, -63, 48, -18, 31, -33, 21, 24, 35, -22, 42, 21, 71, -11, 6, -38, 10, -13, -23, -29, -33, -31, 46, -2, 55, 14, 10, -1, 7, -24, 4, -9, 12, 33, 6, 11, 2, 3, -25, -14, -1, -2, 3, + -8, -23, 0, 25, -8, 7, 7, -20, 14, 6, 8, -4, 2, -2, -6, 2, 22, 0, 1, 202, -31, -66, -23, -14, -11, -58, -31, 16, 9, 16, 20, -39, 15, -8, 13, 61, -63, 21, 21, 16, -17, -37, 28, 8, 20, 38, 0, 52, 4, 24, 2, 16, -15, 19, 14, 19, -8, 6, -2, 24, 30, -45, 60, 5, 16, 2, 10, 11, -13, 36, 19, 1, 33, 14, -18, -2, -12, -13, -10, 6, -3, 2, -1, -37, 19, -15, 5, -5, -2, -9, -6, 160, 14, 32, -42, -8, + -103, 24, -5, -70, 58, -33, 2, 43, 19, 32, -25, 14, -33, 0, -28, 10, -43, 60, 43, 35, 41, 9, -14, -26, 11, 33, 0, 22, -17, 4, 22, 15, 19, 1, 7, -3, -15, 14, -10, 6, 5, -15, 19, -27, 23, -13, 16, 26, -32, 3, 3, -13, -25, 17, -41, -31, 19, 8, 9, 8, 24, 24, -9, 3, 14, -6, -1, 253, -210, 71, -52, 19, 66, 54, -35, 64, 36, 39, -26, 18, -13, 76, 21, 22, 30, 32, 21, 22, -62, 10, -113, -39, -10, -64, 16, 35, + -24, -35, -41, -39, -21, 23, 18, -57, -66, -5, -34, 18, 15, 7, -5, 32, -16, 2, -4, -14, -43, 33, 56, -7, -7, 27, -40, 48, 12, -24, -1, -22, -9, -5, -16, -4, -11, -33, 9, 12, 11, 12, 4, -390, 40, -34, 15, 41, 29, 81, -32, -2, 7, 96, 34, -74, -48, 43, 57, -13, -20, -1, 27, 59, 60, 0, -105, -30, -10, -12, 62, -27, 37, 4, -6, -54, 5, 45, -70, -41, -16, -12, -33, -27, -65, -11, -44, 1, 10, 48, -32, -21, 5, -4, 8, -40, + 17, 16, 6, 3, -30, -27, -15, -8, -2, -52, 11, 16, -22, -48, 20, -2, -24, -4, -11, -7, 31, -230, 243, -35, 15, 57, 68, -53, 33, 12, 42, 28, 59, 33, -41, -68, 9, 71, 142, -35, -49, 37, 23, -28, -71, -15, -15, -64, 55, 66, 1, 15, -2, 51, -41, -127, 53, -16, 42, 19, 1, -32, -49, 33, 39, 28, -6, -4, 43, 24, 13, -27, 36, 30, -5, -11, -22, 24, 1, -63, 51, 30, -12, 14, -8, 1, -1, 14, 4, 18, 30, 15, -5, -19, -12, 43, + 17, -9, -14, -3, 68, 2, -53, -109, 26, -6, -90, 30, -30, 4, -34, -27, 28, 68, 8, 90, 40, -46, -60, 98, -43, -3, 8, -93, -1, 49, -54, -14, 61, 4, 32, 1, 40, -7, -28, -4, 54, 73, -25, 15, 12, 49, -30, -5, 9, -13, 31, 14, 2, -17, 25, 28, 1, 1, 20, 33, -40, 0, 10, 18, -21, 16, 7, 0, 11, -13, 5, 13, 27, 33, -27, 3, 511, -50, 8, 31, -47, -80, -47, -21, -91, -98, 7, -87, -38, -26, -22, 52, 61, 19, 128, 23, + -64, 110, -12, 78, -26, -9, -74, 2, 64, -3, -32, -13, 6, -17, -14, 24, -59, 23, 8, -28, -56, -38, 42, 41, 49, -85, 47, 12, -3, 3, 8, 8, 10, -8, 4, 44, -13, 17, 20, -20, 37, 41, 7, -5, 39, 27, 21, 25, -33, -16, 7, -5, -5, 1, 17, 4, -32, -300, -504, 183, -12, 77, -88, 5, -102, -13, -147, 64, 68, -3, -11, -1, 14, -35, -125, 232, 16, -29, 80, 15, -41, 112, 124, -53, 73, 15, -15, -115, -63, 91, -46, 13, -6, 62, -94, -106, + 15, 2, -72, 44, 9, -44, 32, -49, -41, 20, 19, 3, -13, -23, 30, 50, 7, 16, -14, -14, 43, 6, 10, -44, -10, -29, 24, 37, 0, 30, 0, 40, -32, 20, 0, -1, -30, 0, -26, -3, -162, 488, -216, 37, 32, 123, -15, 79, -77, 5, -147, -28, 1, 60, 10, 62, -42, -89, 12, -134, -142, 5, -46, -2, 13, 21, -35, -23, -50, -76, 31, 38, -100, -45, -126, 3, -55, 46, 53, -103, 17, 87, 78, -39, 28, -29, -14, 25, -47, -9, 44, 35, 30, 38, 20, -10, + 29, 20, -21, 0, 59, -5, -27, -7, 24, -24, -60, -3, -21, 17, 13, -8, -24, -35, -43, 44, -14, 0, -10, -2, -5, -402, -124, 47, -62, 59, -25, 2, -117, -141, -18, -49, 61, 18, -16, -294, 149, 12, 130, 162, 112, -153, -36, -14, -37, 34, 38, -1, -55, 64, -103, -55, 94, 6, -38, 110, 4, 115, -38, -17, 15, 37, -80, -59, -13, 65, -22, 12, -24, 44, 55, 12, 4, -93, -8, 47, 53, -28, 60, 20, -15, 16, -57, -17, -38, 40, 8, -13, 16, -100, 2, 20, + 50, 17, -25, 48, 6, -62, -27, -31, -7, 14, 256, 86, -157, -28, -68, 53, -95, 77, -19, 90, 62, 109, -150, 177, -111, 103, -62, 61, 10, 52, -97, -219, 83, 151, -57, 61, -79, 17, -52, 159, -3, -17, 36, -78, -56, -46, 68, 0, -28, -1, -16, 109, 72, -42, 34, 41, -47, -27, -43, -84, -13, 1, -13, -31, -86, -4, 127, 69, -56, 71, -10, -2, 58, 31, -63, 23, 12, 63, 74, -61, 25, 44, 56, -6, -4, -21, -13, 32, -7, 59, -15, 546, -445, -74, 22, -8, + -123, 42, 32, 175, -57, 35, 143, 4, 86, 284, -61, -18, -147, -138, 6, 47, -62, 27, 250, 145, 21, 10, 20, 139, -115, -51, -6, 72, -11, 18, -59, 23, -104, -61, -79, 2, -70, 17, -125, 58, -251, -64, 34, 47, -9, -57, 19, 8, 30, -68, 30, -40, -45, -110, -82, -24, -14, 6, 19, 36, 7, 18, -66, 0, -81, -12, -6, 3, 27, 81, -50, -22, -5, -42, -74, 17, -344, -239, -17, -47, 182, 7, 35, -225, 13, 32, 14, 19, 138, -169, 37, -35, -116, -56, 110, -37, + 89, -29, 52, 29, -17, -12, 59, -7, 0, -145, 73, 67, 63, 72, -130, -134, 80, 118, -140, 53, 21, 123, 71, 13, 83, -42, -84, -11, -163, -118, -13, -5, 27, -77, 28, -61, -209, -60, -56, -206, 1, -32, -24, 25, 65, -60, 40, 28, -93, -58, -71, -14, -21, 0, -29, 41, -45, -10, -38, 69, -75, 46, -12, -15, 4, 21, -17, -215, 329, -172, -73, -100, 27, 29, 49, -20, 144, 108, -102, -182, 69, -68, 169, 14, 73, 89, -63, -61, 224, -128, -30, -65, 9, -26, 31, -38, + -14, -172, 153, -53, -12, 180, -122, -155, 15, -70, -101, 0, -51, 41, -223, -74, -54, -5, 80, 1, 17, 41, -37, 31, 54, 46, 51, -28, -46, -41, 58, -135, -28, -32, -32, 89, -59, -95, 98, 29, 59, 114, -40, -38, 58, -61, -76, -72, 44, 33, -41, 39, 15, 46, 10, -86, 59, -28, -450, 227, 244, 125, 114, -80, 116, -194, 7, -228, -29, -99, 107, -108, -90, -24, -167, 50, -76, 75, -157, 264, -86, 125, -107, 12, -107, -34, 60, 169, 189, -94, 1, -55, -99, -75, -269, -6, + 46, -253, 99, 51, 70, 122, 77, 42, -85, -27, -95, -47, 51, -202, 80, 41, 13, -95, -56, 53, 164, 70, 43, -64, 68, 10, -77, 22, -56, -88, -46, -20, -80, 92, 52, 75, 41, -66, 22, 115, -22, 107, 56, 40, 72, -37, -43, 28, 19, 375, -256, -106, -31, 0, 183, -33, 61, -104, 58, -64, -294, -202, -74, 107, -11, -162, -152, -321, -103, 42, 45, 16, -32, -18, -99, 27, 43, 56, 14, -14, -37, -153, -38, -34, 78, -15, -121, -47, 37, -137, 25, -141, 80, 112, -104, -205, + -39, -64, -93, 11, 20, 21, 52, 3, -80, 130, 201, -96, 84, 34, 96, -144, 56, 19, 53, -208, 166, 21, 20, -25, -118, 31, 16, 30, 37, -130, -68, 26, 62, -32, 1, 49, 20, -23, -61, 45, 607, -339, 31, -34, -72, -253, -14, -14, 206, 94, 416, -166, 16, 45, 100, -43, -19, 169, -106, 243, 147, -338, 322, 113, -116, -84, -127, -66, 23, 15, -91, 214, 27, -103, -91, 21, -113, -199, 1, 118, 47, 144, -67, 45, 154, 222, 52, -230, 75, -74, -127, 33, 97, 56, -29, -209, + -183, 257, -35, 199, 22, -78, 97, -172, -77, 83, -23, 171, -138, -272, -78, -13, -85, -65, 168, -57, 30, -155, -153, 74, 38, 63, -67, 64, 5, -36, -9, -684, -444, 165, -230, 75, -114, -413, -305, 555, -253, 251, 142, -143, 130, -81, 175, 194, -11, -54, 333, -107, -374, 7, -156, 40, 37, 226, 120, 48, 111, -100, 1, 247, 158, -43, 64, -216, -334, -246, -172, -47, -47, 63, -30, -92, 216, 58, -161, -150, -43, 64, -162, 66, 202, -3, 76, -137, 108, 79, 26, 81, -120, -186, -263, 134, + 105, 10, 104, 21, -120, -24, 10, -210, -19, -327, -180, 56, -83, 64, 8, -42, -44, -30, -60, 59, 2, -8, -818, 280, -64, -52, 148, 37, 83, 358, 214, 271, 137, 369, -64, -357, 54, -39, -153, -316, -138, 279, 64, -18, 59, -20, 5, 236, 31, 88, -35, 60, 234, -63, -156, 120, -278, -278, -179, -34, 8, 118, 274, 6, -94, -270, -446, -155, -65, -25, -2, 167, -204, 370, 192, -33, 106, -143, 27, 5, 171, 331, 222, -191, -81, 57, -31, -39, 17, -98, -319, -22, -59, -20, 50, -122, + -42, -215, -23, 33, 228, 115, 32, 40, 58, 10, -193, 43, -45, 55, -24, -22, -106, 331, 335, 112, 223, 161, 352, -313, 366, -451, -81, 418, 574, 118, -39, 208, -179, -208, 414, 65, -66, 99, 333, -90, 203, -69, -86, -42, 149, -390, -49, 186, -88, 18, -139, 79, 305, -285, 90, -86, 99, -150, 205, 16, 73, 82, -345, 166, -480, -99, 269, 27, -172, 297, -105, -183, 216, -91, -63, -36, 130, -22, 33, -263, 94, 22, 509, -386, -169, 43, -100, 113, 143, -187, 356, 131, -3, 56, 118, -60, + -195, 74, -101, 29, -40, 91, -124, 35, 0, -68, 81, -31, 683, -429, 16, -69, -115, 13, -157, -67, -507, -425, -422, 140, -89, 138, -97, -308, 489, 340, -228, -192, -269, -58, 104, 160, 198, -16, 153, -46, -194, -238, 147, -109, 446, 278, 412, 56, 150, 404, 281, -91, 74, -20, 5, 41, -189, -138, 73, -239, -243, 234, 268, -296, -9, 520, 364, -21, -172, -41, 109, 96, -70, -197, 234, -18, 58, 165, 213, -225, 96, -39, 89, -348, 65, 309, -310, -258, -132, 136, 247, -142, 136, -123, -11, 4, + 52, 89, -42, -22, 57, 48, 2, -11, 42, 554, 213, -74, -18, 174, -208, -270, 231, -322, -417, 111, -224, -289, -151, 276, 676, 280, -368, 693, 80, -109, 125, -405, 103, 56, -290, 251, -78, 50, -209, 117, -191, 351, -415, -153, -143, 198, 228, 203, -221, 65, -231, -66, 123, 293, 135, -135, 285, 146, 230, 15, 268, -117, 148, -409, 459, -40, 64, -122, -239, 12, 153, 367, 108, -439, 187, -177, 361, 31, -138, 70, -119, 76, -255, 102, 24, 23, 41, -50, 26, -69, -107, 143, 90, 83, -189, 63, + -103, 89, 20, -11, 44, 22, -1136, 49, 188, 444, 145, -699, 928, 339, -427, 152, 923, 206, -226, -29, -562, 287, 25, -145, 79, 191, -365, 193, -457, 47, -417, -374, -160, 174, 266, -205, 232, -406, -60, 453, 41, -165, -55, 88, -107, -301, -336, -45, -155, 327, -462, 487, 154, 62, -165, -55, 225, -184, 304, 75, 274, -102, -161, -483, 164, -49, -499, 149, -35, 302, 486, -207, 109, 240, 255, 52, -150, -30, -604, -30, 53, 148, -5, 404, 86, 201, -229, -163, 301, -32, -63, 183, -44, -52, -5, -11, + 18, -33, 167, 1407, 642, 134, 229, -288, -193, -68, 532, -376, 61, -313, -865, -414, 199, -221, 143, -342, -17, -368, 316, -373, -268, -802, -150, -126, -211, 419, -136, -334, 109, 323, 120, 110, -48, -67, -212, 165, -273, -73, -170, -478, 73, -332, 134, 43, -97, -10, -349, -19, -79, 510, -147, -12, 208, -279, -124, 518, -302, 198, 14, 461, 654, -38, 85, 66, 226, 119, -499, 46, 126, 176, -214, -332, 35, 97, -87, -126, -535, -264, -308, 22, 68, -101, -147, -167, -41, -84, -94, 112, -53, 54, -193, 14, + -74, -133, 31, 78, -104 }, + {-1, 0, -1, 0, 0, 1, 1, -4, 0, -2, -3, 1, 2, 2, 1, -5, -3, 1, -2, 0, 1, 1, 2, -2, -2, -3, -2, 0, -7, 0, -1, -2, 2, -4, -4, -8, -1, -7, -2, 0, 5, 1, 4, -2, 4, -1, 1, 5, 32, -25, 16, -20, 10, -10, -10, -6, -5, 6, 7, -24, -1, 4, -2, -4, -14, -5, 10, 15, 8, 24, 5, -4, 5, 4, -3, 8, 17, -7, 0, 7, 0, -2, -12, 0, 6, 5, 1, 0, -4, 4, 0, 1, 0, -4, 116, -8, + 10, -7, 7, -9, 2, -2, -2, 7, -6, -21, 6, 2, 6, 14, 7, 5, -2, -12, -4, 5, -2, -2, 12, -15, -5, 0, -3, -4, 6, 6, 8, 2, 3, -3, 11, -1, 8, 6, -2, -1, 4, 0, -2, -1, 0, 85, -81, 13, -22, 12, -1, 9, -8, 15, -6, 9, -19, 1, -11, 3, -2, -3, -5, -14, -1, 2, -7, 12, -5, -8, -11, 7, -7, 17, -2, 0, 5, 0, 0, -7, -6, -2, 2, -3, -7, 6, 5, 12, -3, 4, -2, 2, -199, 24, -15, 1, + -2, -16, 18, -4, 2, 8, 3, 21, -1, -8, 25, 10, 23, 0, -30, -18, -14, 13, -15, 2, -5, -5, 2, 5, -4, -9, -7, 6, 7, 13, -1, -2, -1, 8, -9, 3, 4, 6, -7, 8, -9, -1, 3, -252, 92, -37, 43, -29, 20, -32, 18, -23, 9, 18, 1, 7, 16, -10, 12, -13, -9, -29, 27, -17, 18, 2, 0, -28, -1, 6, -4, -1, -1, 12, -1, -8, 9, 3, -3, 1, 1, 1, 6, -7, 20, -1, -12, -1, -6, 0, 12, 115, -25, 43, -20, 15, + -16, 54, -10, 29, -3, -2, 7, 0, -37, 8, -3, -17, -4, 1, -47, -1, 4, 15, 0, -9, -2, 16, 3, -8, -16, 24, -15, -1, -22, -2, 0, 4, -5, 6, 10, -9, 8, 0, 6, 0, 11, -6, -3, 10, 14, 302, -89, 13, -16, 19, 0, -1, -41, 18, -18, 12, 4, 6, 13, 20, 3, 7, -35, 12, 12, -23, -5, 23, 14, 14, 32, 18, 4, 8, -13, 10, -4, 18, 24, -4, 8, 15, -7, 5, -22, -6, 21, 0, -16, -6, 6, 15, -2, 9, -1, -13, + 22, -161, 68, -47, 31, -28, 37, -23, 2, -20, -24, -34, 3, -20, 10, 12, 27, -43, 27, -10, 37, 8, -2, 3, 3, -8, -7, 6, -17, 12, 21, -28, -6, -1, 12, -11, 30, -31, 6, 0, 2, -13, 2, -8, 8, 1, 2, -9, -1, -19, -6, -1, 5, 2, -7, -25, 0, -5, -261, 83, -53, -3, -11, 17, -45, 3, 15, 12, -15, 9, -20, -33, -13, 4, -20, 69, 2, -19, -6, -23, -11, 21, 13, 28, -2, 13, -15, 7, -14, -4, -8, 5, 9, -4, -13, 4, + 5, 19, -3, -7, -25, -20, -9, -4, 5, 4, -10, -4, 2, 9, 5, 2, -4, 10, -3, 16, -251, 118, -55, 53, -27, 31, 16, 10, -28, 4, -14, 5, -37, 14, 24, 8, -40, -19, -20, -21, -13, 29, 7, 20, 16, -7, -1, -30, 39, -11, -4, 3, -8, -12, -14, -3, -31, 10, -17, 13, 11, 18, -5, 2, -20, 8, 15, 4, -3, 3, 12, 18, 8, 17, 1, 3, -1, -3, 81, 101, -46, 27, -14, 10, -11, 6, 9, 49, -18, 20, 46, -13, -2, -8, 11, 24, + 24, 32, 8, 27, -7, -16, -55, 11, -9, -28, -20, -1, -5, 17, -3, -32, -33, 9, -29, 4, 17, -26, -17, -11, 12, 11, -1, -4, 19, 4, -8, 7, -17, 2, -9, -13, -9, 13, -7, 10, -8, -16, 4, 9, -6, 5, -7, 290, -101, 55, -38, 54, -38, 33, -13, 34, 8, 24, -28, 28, -10, -24, -3, -25, -41, -21, -5, 21, -28, -37, -46, -8, -4, 36, 20, 23, -16, 19, -15, -14, -8, 24, 21, 6, 0, -1, 1, -7, -4, 17, 3, 41, -16, -5, -34, 22, + -9, -5, -8, -2, 2, -6, 6, -9, 0, -13, -6, 3, 13, -7, -1, -5, 81, -125, 73, -47, 57, -1, 35, 10, -55, -26, -19, 6, 14, 7, 61, -35, 49, 8, 6, -34, -7, 42, -3, -36, 41, 31, 7, -17, -14, -4, -3, 19, -10, 8, -23, -5, 13, -33, 13, -13, 12, -10, -3, 39, 17, 22, -2, 9, 14, -3, -11, -18, 6, 8, 14, 17, 4, -4, -17, -8, -18, -16, 2, 0, -13, -309, -62, -8, -51, -21, 47, 20, -13, -12, -37, -24, -30, -33, -28, -17, + -25, -43, -37, 15, -37, 13, -50, 2, -20, -16, 44, -4, -21, 29, -31, 30, 9, 32, 22, 0, -15, 34, 0, -5, 31, -12, -41, -46, -12, 16, 10, -13, -1, -12, 3, 1, 3, 30, 12, -21, -7, 4, 19, 5, 28, 8, -2, -14, -12, 1, -363, 316, -129, 88, -83, 20, -41, 54, 10, 6, -26, 36, 7, -65, 7, 10, -33, -50, 50, 62, -20, -16, 10, 29, -17, 56, -2, 14, -41, -14, -24, 37, -8, 8, 8, -21, 35, 34, 9, 12, 41, -25, -7, -5, -30, 7, + -20, 8, -1, 3, 34, -1, -8, 8, 2, 22, -21, 8, -2, 44, -13, -2, -17, -4, -11, 242, -30, -51, -12, 32, 16, 14, -2, -34, 8, 20, 23, -16, -15, 48, 16, -39, 8, 63, -80, 52, 6, 67, -5, 3, 13, 13, 35, -27, -10, 13, 25, -10, -1, 3, 6, 16, -33, -1, 19, 5, -18, -6, 42, 30, 14, -16, -12, 12, -6, -11, 7, -13, -20, 43, 17, 27, 4, 21, 17, 18, 2, 22, 11, 16, -13, 3, 6, -19, 7, -10, -2, 115, 33, 28, -17, -11, + -31, -22, 6, -12, -15, -45, 38, 26, -28, 48, -45, -14, 20, -33, 19, 31, 47, 42, 40, 21, -84, 0, -18, 17, -8, 33, 22, -11, -21, 22, -15, 56, 0, 18, 56, 54, -41, 3, -27, -48, -5, 9, -6, -10, -5, 4, -23, 3, -27, -7, -3, 7, 0, -15, -17, 34, -12, 5, 15, 19, -10, -10, -5, -27, -18, 3, 6, 272, -192, 70, -73, -6, -51, 46, 46, 15, 9, 43, 119, -104, -15, -27, -42, 92, 69, -14, -63, 26, -52, -41, -72, 9, -74, -24, 44, 6, + -23, -61, 0, -15, 37, 34, 16, -28, 4, -2, 15, 29, -19, -9, -33, 50, -6, 7, 45, -9, -4, 18, -23, -2, 19, -33, 8, -6, -3, -35, 17, -7, 3, 9, -13, 23, -18, -5, -37, 3, -5, 15, 16, -424, 59, 6, 30, -32, -53, 0, 36, 57, -3, 86, 48, -58, -52, 40, 7, -41, -77, -88, -56, -65, -73, 13, 23, 20, -54, -52, 8, -13, -9, -7, -43, 37, -74, -27, -11, -2, 24, 9, -5, 34, -10, 34, 20, -26, 4, 56, -22, -22, 2, 33, 9, -23, + -29, 27, 2, -38, 54, 60, 8, -17, 7, -1, 13, 27, -2, 36, 23, 21, 18, 10, 15, -17, -1, -260, 222, -74, 47, -1, 37, -90, 35, -61, 0, -42, 83, 71, 27, 6, -69, -46, -7, -28, 79, -65, -3, -32, 116, -37, 10, -3, 20, 9, 20, 14, -19, 10, -5, 40, 6, 76, 40, -25, -5, -10, 1, -29, -21, -8, 14, 93, 8, 6, -26, 38, -14, -20, 12, -20, 12, -24, -52, 26, 23, -8, 55, 11, 13, 19, -15, 6, 18, -45, -21, -4, -21, 21, 32, -12, + 55, 37, -1, -15, -11, -4, 169, -4, 38, -115, -19, 15, -93, 8, 129, -22, 9, -58, -79, 20, -73, 114, -79, 27, 27, 61, 47, -12, -70, -8, -6, 36, -49, -9, -14, -23, -17, 34, 21, 92, 31, -34, 38, -25, -26, 28, 79, -11, -41, -38, 42, -1, -57, -52, 27, 25, -24, -43, -72, 20, 27, 18, -41, 31, 19, 13, -14, -4, 22, -54, -7, 24, 28, -5, 14, 1, 576, -37, 23, 52, -51, -22, -18, -136, 91, -15, -85, 18, -44, 49, 39, 63, -23, 85, 73, 46, + -76, 57, -104, -61, -71, 27, -55, -10, -19, -69, -38, 58, -44, -33, -66, 21, 21, 49, -28, 84, 21, 96, -12, 17, 19, -54, 38, 98, -35, -3, 26, -29, -40, 23, -40, -22, -52, -35, 38, 34, 23, 37, 46, 44, 66, 10, -20, 34, 23, -1, -7, 2, -25, -6, 5, 6, -2, -254, -499, 187, 3, 12, -49, -52, -11, 19, -31, 132, -59, -113, 8, 9, -14, -39, 90, 18, -39, 43, -78, 102, -55, -28, -67, 113, -47, -15, -67, -30, 62, -27, 67, -84, -98, 10, 18, 19, + -2, -50, 11, 28, 14, 53, 1, 83, 12, 78, 101, 22, -7, 20, -55, -13, -93, -82, 25, 26, 17, -4, -26, -12, -22, -11, -22, 2, -1, 19, -5, -9, -31, -1, -36, -3, -49, -5, -18, -4, -167, 489, -222, 102, -47, 156, -24, -68, -71, 41, -21, -9, 4, 31, -164, -80, -42, 66, 55, 96, 18, -14, -15, 116, -149, 87, -72, -14, -76, 119, 48, -77, 10, -33, 13, 51, -214, -89, 18, 76, -44, 17, 55, -22, -24, -7, 83, 34, 14, 10, 32, 98, -59, 45, -137, -23, + 31, 67, 13, 10, 3, 37, -27, 5, -10, -31, -28, 52, 50, -18, -26, -84, -36, -18, -15, 63, -24, -22, -42, -37, -3, -439, -95, 43, -104, 26, 19, 64, 0, 123, 80, 44, -33, -60, -3, 130, -111, -42, -86, -2, -235, -185, 12, 115, 158, 37, -57, 54, -51, -34, -35, 16, 42, 10, 62, -47, -83, 69, 46, 145, -18, 24, -21, 117, -122, -61, -29, -92, 59, -38, 50, -99, 99, 96, 89, -36, 79, 4, 28, 46, 33, -41, 8, -13, -2, 90, 34, -39, 73, -12, -63, -21, + -4, -89, -3, 37, 49, 8, -1, -37, 14, 22, 318, 206, -66, 93, -212, 148, 54, 111, -39, -29, -116, -60, -198, -35, -158, -48, -98, -100, -134, 52, -183, 24, 78, -36, 24, -79, -2, -25, -27, -108, -15, 12, -8, -17, -57, -50, 32, 34, 46, 232, -94, -6, 93, -23, -40, -90, 27, 78, 130, 43, 108, -107, -161, 14, 104, 58, -87, 99, -76, 48, 19, 90, 51, 33, 61, -62, 38, 32, 18, 89, 20, 72, -12, -30, 11, 16, 14, 86, -15, -50, -6, 643, -415, -22, 48, 13, + 51, 88, -17, -14, 50, -74, -71, -11, 57, 232, 10, 80, -74, 5, -228, 142, -138, -196, 46, 56, -73, 66, 28, 153, 169, -28, -64, -48, -252, -137, 198, 66, 73, -113, -117, 35, -23, -100, 88, -19, -63, -72, 50, -65, -35, 233, -141, 44, -51, 54, -64, -26, -173, 30, -64, -43, 138, 34, 39, 84, 100, 30, 69, -30, -8, -113, 52, 94, -21, 7, -10, -23, -29, 11, -30, -13, -398, -195, 76, -23, 147, -18, -36, -113, -127, 71, -133, -45, -75, -13, -79, -53, -63, -31, -78, -151, + 90, -301, -1, 274, 68, 1, -72, 21, -272, 115, 71, 21, 101, 150, -114, -59, -119, 20, 7, -70, -80, -89, -52, -2, 63, 7, 52, 30, 8, 191, 48, -28, 152, -71, -167, -50, -18, -22, -9, -57, -11, -71, -15, -72, 10, 42, -79, -21, -42, 5, -80, -103, -43, 45, 77, 32, -22, -1, 31, -11, -15, -35, 20, 41, 11, 0, -43, -245, 333, -162, -80, -270, 213, -73, 126, 9, 9, -81, 167, -40, 55, 42, -75, -25, -23, -143, 30, 27, -110, -185, -114, -171, -40, 94, 50, -100, + -99, 151, 105, -129, 121, -64, 107, -163, -128, -124, 46, -110, 72, -49, 31, -30, -14, 27, 121, -261, -31, 53, -22, -79, -187, -16, 175, 0, 152, 111, 34, -21, 117, -113, -91, 74, -25, -70, 51, 15, -53, -81, 140, -128, -68, -76, 80, 4, -53, -31, 43, -118, 3, 32, 26, 3, -38, -57, -564, 214, 93, -139, 73, -158, 148, 129, 110, -287, 179, 311, -40, 108, 8, -93, -123, 342, -2, -27, -184, -366, -197, 22, -160, 139, -239, -77, -140, 42, -53, -177, 33, -38, 121, -37, -139, -51, + -431, 81, -11, 204, -120, -133, 189, 42, 33, -72, -114, 45, 87, 65, -28, 69, 38, 11, -36, -38, -141, 14, -55, -80, 77, 45, 213, 47, -141, -140, 33, -90, -66, 27, -68, 0, -31, -38, 42, -53, 22, -4, -10, -18, -30, -66, -82, -23, -71, 466, -193, -4, 20, 191, -32, -45, 129, 226, -164, -188, 135, -34, 117, 172, 142, 121, 96, 114, 453, -46, 28, 82, 247, -59, -99, 91, -13, -90, -108, -96, -4, -123, 169, 257, -20, -73, 105, -71, 152, 106, -2, -144, 98, -18, -50, 14, + -24, 300, -31, 127, -73, 266, -31, 17, -100, -173, 135, -90, 271, 53, 126, -6, -4, 73, 17, 190, 106, 29, 95, -123, 39, 84, 6, -40, 158, 33, -57, -61, 61, -37, -4, 84, -32, 48, 19, -58, 614, -175, 59, -57, 29, 80, 208, -158, 88, -2, 13, 113, -89, 121, -321, -145, 56, 121, 87, 258, -253, 41, -36, -349, 151, -135, -86, -50, -285, 94, 104, 45, -147, -251, 101, -155, 139, -240, 6, -288, -68, -192, -164, 170, 268, 37, 101, -122, 52, -205, 90, -135, 41, 196, 103, -70, + 123, 19, 107, -89, 176, 295, 20, -179, -120, -81, -29, 18, 137, 25, 220, -2, 87, -197, -25, -143, -23, -22, 49, -179, 29, -15, 58, 18, 38, 16, 19, -622, -522, 223, -64, 259, -18, 86, -311, -292, -176, 100, -240, -165, -69, 51, 179, 65, -353, 98, 201, -502, -58, 26, -533, -182, 241, -494, 245, 257, 6, -70, -18, -117, -129, 91, 112, 374, -217, -113, -90, -171, 13, -293, -71, 24, -6, -94, -13, -160, -31, 92, -38, -104, 125, -56, -118, -170, 368, -14, 225, 31, 86, 243, 37, 166, + -107, 184, 135, 41, 50, 46, 162, 74, 32, 155, -63, 24, -15, -239, 115, 59, 35, -146, -39, 29, 49, -41, -1011, 384, -110, -453, -109, 13, -116, 177, -392, 191, -30, -451, -310, 64, 181, 172, 126, 268, 78, 440, 241, 516, 68, 419, -320, -251, 88, 38, -254, 73, 55, -33, -96, 249, 49, -543, -242, 185, 64, -114, 157, 161, 249, 55, 75, 49, 73, 93, -189, 31, 36, -401, 191, 142, 172, -274, -160, 204, 1, -51, -41, -116, -104, 3, -138, -308, 106, 333, -232, 35, -131, -51, -96, -27, + 171, 43, 142, 44, -149, -104, -121, -70, -99, 27, -63, -11, -95, 33, 50, 57, -28, 431, 293, 204, 114, 19, -94, -146, 139, -419, 453, -272, 78, -455, -11, 438, 176, -148, 280, -432, 180, 87, 36, -533, -156, 38, 92, 351, -524, -66, -171, -494, -104, 125, 255, 379, 296, 294, -19, -181, 196, 63, -109, 73, -238, 393, 187, 136, -197, -438, -113, 15, -532, -430, -109, -385, 256, 102, 83, -175, -187, 80, 60, 38, 126, -70, 96, 261, 122, 48, 40, -164, -136, -122, 80, -40, -339, -270, -22, -217, + -191, -52, -279, -174, -39, 20, -35, -14, 73, -50, -15, 20, 490, -381, 103, -54, -49, 9, 136, -237, 318, -91, 218, -21, -177, 339, 334, 240, -112, 514, 190, -573, 591, 55, -2, 429, 19, -184, -248, 423, -265, -351, 341, 299, -194, -468, 184, -160, 65, -328, -271, -111, 319, 289, 37, 265, -383, 125, -101, -141, 183, 28, 56, -534, -147, 300, -384, -98, -481, -87, -180, 83, -117, 57, 49, -14, 48, -126, -428, -78, 217, -26, 150, -162, -375, -64, 82, 241, 57, 133, -15, 57, 89, 58, -131, 36, + -54, 59, -105, 65, 24, 11, -13, -86, -46, 444, 35, -128, -317, -10, -151, 119, -261, 168, 107, -228, -234, 356, -417, -15, 271, -302, 99, 348, -275, 239, 176, 256, -418, 363, -420, 128, -319, 41, -163, 286, 10, 175, 91, -298, -181, -412, 242, -279, 243, -336, -382, -641, 64, 338, -50, -9, 108, 292, -97, 79, -354, 91, 472, -47, 428, 560, -3, 95, 116, -238, 125, -288, -13, -296, -287, 18, -108, -487, 332, 9, 247, -287, -146, -109, 127, -2, -75, -75, -48, -18, 29, 32, -57, 67, -65, -65, + -36, 94, 71, 78, -37, 59, -1004, 255, 376, 105, -435, -63, 709, -814, -20, -137, -532, -134, -360, 133, 132, 312, 127, -425, -151, 307, -485, -137, -519, 444, 133, 347, 591, -207, -124, -97, -296, 284, -138, -352, -395, -68, 152, -10, 81, 97, 230, -100, -10, 172, -164, 336, 381, 360, -291, 40, -90, 173, 718, 540, 1028, 83, 407, 330, -156, -34, -53, -94, 130, 32, 371, 280, -125, -36, -219, -430, 174, -4, 148, -30, -298, -42, 46, -165, 101, -104, -144, 6, -144, 1, -40, -34, 2, 24, -90, 15, + 6, 2, 37, 1563, 756, 272, 246, -366, 243, -295, 362, 297, 279, 74, -506, -282, 561, 100, -28, -114, 627, -672, -280, -166, -46, -475, 118, -410, -227, 72, -258, 390, -369, -157, -88, 417, -682, -128, -507, -11, 1, -445, 77, 356, 195, -5, -207, 23, 215, -278, 571, 775, -45, -476, -448, 321, -111, -100, 667, -137, 215, -14, 420, -80, 58, -76, -261, -733, -437, -65, -195, -504, -331, 195, 431, -31, -52, -42, -65, 238, 152, 38, -141, 168, -92, -333, -319, 46, 225, -258, 176, -13, -97, -83, 10, -142, + -110, 11, -40, -17, -66 } }; -const Word32 CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[9][BINAURAL_CHANNELS][80] ={ -{ -{ --150242784, --386995328, -475354080, -421303008, -292915168, -152560464, -21282636, 102001176, 210548960, 288762464, 326451872, -321788608, 277569792, 203039216, 113307680, 20830054, -68543384, -150520352, -220697424, -278116864, -323314400, --353931616, -368772320, -372753760, -370811904, -361272800, -341630816, -315185088, -286076512, -254237360, -220177200, --187673968, -158032784, -128915592, -100644504, -76050984, -54178328, -32091996, -11112154, 6548752, 23648626, -42909408, 61489436, 77180560, 93131536, 110697416, 126071248, 138471360, 151995136, 166570640, 177748288, -186292064, 196535552, 206622816, 212256752, 216339120, 223023152, 228599104, 229724912, 231484784, 236698864, -239321488, 237591152, 238633744, 242894352, 242224880, 237895024, 239066464, 242346208, 237767248, 231694160, -234890144, 236814832, 225951792, 219453504, 228795600, 217105760, 147807536, 56675852, 7899519, }, -{ --150242784, --386995328, -475354080, -421303008, -292915168, -152560464, -21282636, 102001176, 210548960, 288762464, 326451872, -321788608, 277569792, 203039216, 113307680, 20830054, -68543384, -150520352, -220697424, -278116864, -323314400, --353931616, -368772320, -372753760, -370811904, -361272800, -341630816, -315185088, -286076512, -254237360, -220177200, --187673968, -158032784, -128915592, -100644504, -76050984, -54178328, -32091996, -11112154, 6548752, 23648626, -42909408, 61489436, 77180560, 93131536, 110697416, 126071248, 138471360, 151995136, 166570640, 177748288, -186292064, 196535552, 206622816, 212256752, 216339120, 223023152, 228599104, 229724912, 231484784, 236698864, -239321488, 237591152, 238633744, 242894352, 242224880, 237895024, 239066464, 242346208, 237767248, 231694160, -234890144, 236814832, 225951792, 219453504, 228795600, 217105760, 147807536, 56675852, 7899519, }, -}, -{ -{ -74029664, -123262344, -36468568, -334473248, -585478144, -638618176, -475035200, -190333616, 97043712, 321375232, 474565440, -565700864, 596585472, 570107008, 498283840, 393476448, 263353440, 118538416, -25469692, -157250560, -272816320, --370608960, -450563552, -515463200, -566206592, -599546816, -615617536, -621153216, -620634560, -612218624, -595934208, --576471616, -555134720, -528948832, -499031712, -469789952, -440383392, -407037280, -371374016, -336737248, -300843136, --261334272, -222230736, -186545456, -150669600, -113003808, -78191488, -47489992, -16384226, 14923401, 41378788, -64410552, 89771792, 115551264, 136379168, 155176624, 176510272, 195635760, 208058416, 219536720, 233740704, -243804896, 247442192, 253084176, 261829792, 264259680, 261447008, 264335904, 269670784, 265524000, 258725072, -262996416, 267509360, 257564896, 252369600, 271103168, 277647072, 221355104, 119831200, 33008972, }, -{ --74029664, --123262344, 36468568, 334473248, 585478144, 638618176, 475035200, 190333616, -97043712, -321375232, -474565440, --565700864, -596585472, -570107008, -498283840, -393476448, -263353440, -118538416, 25469692, 157250560, 272816320, -370608960, 450563552, 515463200, 566206592, 599546816, 615617536, 621153216, 620634560, 612218624, 595934208, -576471616, 555134720, 528948832, 499031712, 469789952, 440383392, 407037280, 371374016, 336737248, 300843136, -261334272, 222230736, 186545456, 150669600, 113003808, 78191488, 47489992, 16384226, -14923401, -41378788, --64410552, -89771792, -115551264, -136379168, -155176624, -176510272, -195635760, -208058416, -219536720, -233740704, --243804896, -247442192, -253084176, -261829792, -264259680, -261447008, -264335904, -269670784, -265524000, -258725072, --262996416, -267509360, -257564896, -252369600, -271103168, -277647072, -221355104, -119831200, -33008972, }, -}, -{ -{ --20371030, --57393648, -71328672, -39834212, 21123186, 58579060, 40715752, -8485782, -43569220, -44861472, -20837570, -13379360, 42582452, 52821120, 44016972, 32712618, 30575872, 28821914, 13238700, -15201500, -44768056, --69100656, -88148296, -99440304, -99179920, -89612344, -77847896, -68340448, -60458644, -51561084, -39687108, --25069724, -10693395, 64961, 6320581, 8561480, 6248641, -579821, -8911520, -15140297, -18519362, --19791746, -18435610, -13812615, -6946573, 1161252, 10977936, 22731652, 35697084, 50230716, 67742368, -87943752, 108973520, 130375344, 152889568, 175663088, 196932304, 216781488, 236027776, 253572720, 267981808, -279923424, 289984384, 296387648, 297804448, 295468512, 289735264, 278325152, 260736192, 239791776, 215955248, -185889936, 150080112, 114561272, 79510584, 34376920, -24792162, -76450416, -84927072, -37017248, }, -{ --20371030, --57393648, -71328672, -39834212, 21123186, 58579060, 40715752, -8485782, -43569220, -44861472, -20837570, -13379360, 42582452, 52821120, 44016972, 32712618, 30575872, 28821914, 13238700, -15201500, -44768056, --69100656, -88148296, -99440304, -99179920, -89612344, -77847896, -68340448, -60458644, -51561084, -39687108, --25069724, -10693395, 64961, 6320581, 8561480, 6248641, -579821, -8911520, -15140297, -18519362, --19791746, -18435610, -13812615, -6946573, 1161252, 10977936, 22731652, 35697084, 50230716, 67742368, -87943752, 108973520, 130375344, 152889568, 175663088, 196932304, 216781488, 236027776, 253572720, 267981808, -279923424, 289984384, 296387648, 297804448, 295468512, 289735264, 278325152, 260736192, 239791776, 215955248, -185889936, 150080112, 114561272, 79510584, 34376920, -24792162, -76450416, -84927072, -37017248, }, -}, -{ -{ --721018, --16355772, -48549772, -63205276, -38740068, -514859, 9650792, -15756624, -45094472, -45867568, -14446659, -29004452, 63013612, 79938472, 85708216, 89261232, 92144768, 87597472, 68616936, 35043712, -7224135, --51310364, -92200600, -126849176, -154753040, -178648624, -202140496, -225311296, -244109840, -255003488, -258269808, --255208032, -244579600, -224563440, -196490464, -163644160, -127695280, -89146344, -50016504, -13178570, 20107426, -49838800, 75661216, 97430800, 116016728, 132107824, 145625696, 156951520, 166787008, 174487344, 178700704, -179602640, 178454288, 175783344, 172221216, 169642624, 169055280, 169106288, 168690208, 168543648, 168626864, -167282528, 164463968, 161977712, 159704608, 155989984, 151719712, 148803440, 145611744, 139777024, 133182640, -127603480, 119584240, 107209360, 94890856, 81585592, 55024972, 13564044, -17212618, -12549358, }, -{ --721018, --16355772, -48549772, -63205276, -38740068, -514859, 9650792, -15756624, -45094472, -45867568, -14446659, -29004452, 63013612, 79938472, 85708216, 89261232, 92144768, 87597472, 68616936, 35043712, -7224135, --51310364, -92200600, -126849176, -154753040, -178648624, -202140496, -225311296, -244109840, -255003488, -258269808, --255208032, -244579600, -224563440, -196490464, -163644160, -127695280, -89146344, -50016504, -13178570, 20107426, -49838800, 75661216, 97430800, 116016728, 132107824, 145625696, 156951520, 166787008, 174487344, 178700704, -179602640, 178454288, 175783344, 172221216, 169642624, 169055280, 169106288, 168690208, 168543648, 168626864, -167282528, 164463968, 161977712, 159704608, 155989984, 151719712, 148803440, 145611744, 139777024, 133182640, -127603480, 119584240, 107209360, 94890856, 81585592, 55024972, 13564044, -17212618, -12549358, }, -}, -{ -{ --2051921, --2245194, 2023467, 1197759, -9941776, -22747758, -27280558, -29560112, -44152800, -68251864, -75788992, --45372572, 13457743, 70434776, 105979392, 123585536, 134480800, 141224960, 139040432, 125328760, 101947488, -70818104, 32322314, -11746199, -57064548, -100129112, -140690784, -179227904, -213805088, -241569360, -261852352, --275380960, -281725152, -279901952, -270098144, -252496288, -226240080, -192179920, -154821760, -119033944, -86504400, --57167624, -31504122, -9376987, 10785200, 29796336, 46982648, 62418224, 77075872, 90415504, 100867840, -108550464, 114552144, 118527672, 120150096, 121297392, 123652112, 126288144, 128381408, 131267624, 135355888, -138809584, 141280272, 144532096, 148162416, 149919584, 150498336, 152006416, 152676416, 149898656, 145910784, -142762032, 136395808, 124553512, 112371376, 98595808, 68726456, 20487530, -16538308, -13313862, }, -{ -2051921, -2245194, -2023467, -1197759, 9941776, 22747758, 27280558, 29560112, 44152800, 68251864, 75788992, -45372572, -13457743, -70434776, -105979392, -123585536, -134480800, -141224960, -139040432, -125328760, -101947488, --70818104, -32322314, 11746199, 57064548, 100129112, 140690784, 179227904, 213805088, 241569360, 261852352, -275380960, 281725152, 279901952, 270098144, 252496288, 226240080, 192179920, 154821760, 119033944, 86504400, -57167624, 31504122, 9376987, -10785200, -29796336, -46982648, -62418224, -77075872, -90415504, -100867840, --108550464, -114552144, -118527672, -120150096, -121297392, -123652112, -126288144, -128381408, -131267624, -135355888, --138809584, -141280272, -144532096, -148162416, -149919584, -150498336, -152006416, -152676416, -149898656, -145910784, --142762032, -136395808, -124553512, -112371376, -98595808, -68726456, -20487530, 16538308, 13313862, }, -}, -{ -{ --3833795, --144418, 10765872, 2765422, -11487427, 9198746, 51580948, 42736000, -43378096, -130186904, -128332552, --42242076, 50558744, 96583616, 103735808, 100252056, 96642672, 88947160, 73382736, 49586472, 19973208, --9914932, -34335044, -50814296, -59253368, -60146184, -55480776, -48753248, -42253888, -36046048, -30475478, --27751932, -29727616, -35259536, -41327248, -46785616, -53705880, -64280092, -77505904, -90120224, -99746320, --105634720, -107579264, -106121664, -102978280, -99567544, -95905008, -91781840, -87356952, -81819128, -73615200, --62632436, -49852760, -34813396, -16184511, 5441187, 28271622, 51984672, 76691472, 100694968, 122358248, -142214960, 160475552, 175245408, 185673040, 193137168, 197190000, 195082240, 186992144, 175870864, 160953904, -138726368, 111200464, 84099752, 55515136, 17514876, -26816166, -57793080, -56541096, -23185308, }, -{ -3833795, -144418, -10765872, -2765422, 11487427, -9198746, -51580948, -42736000, 43378096, 130186904, 128332552, -42242076, -50558744, -96583616, -103735808, -100252056, -96642672, -88947160, -73382736, -49586472, -19973208, -9914932, 34335044, 50814296, 59253368, 60146184, 55480776, 48753248, 42253888, 36046048, 30475478, -27751932, 29727616, 35259536, 41327248, 46785616, 53705880, 64280092, 77505904, 90120224, 99746320, -105634720, 107579264, 106121664, 102978280, 99567544, 95905008, 91781840, 87356952, 81819128, 73615200, -62632436, 49852760, 34813396, 16184511, -5441187, -28271622, -51984672, -76691472, -100694968, -122358248, --142214960, -160475552, -175245408, -185673040, -193137168, -197190000, -195082240, -186992144, -175870864, -160953904, --138726368, -111200464, -84099752, -55515136, -17514876, 26816166, 57793080, 56541096, 23185308, }, -}, -{ -{ --573378, --6264747, -14272713, -10745471, 5682779, 21516712, 35712652, 66712116, 118752088, 158329136, 143282800, -69283728, -26658862, -104909408, -152286656, -175110656, -180047184, -170008768, -150282512, -127980896, -105768936, --81764904, -55362128, -28752658, -3396782, 20049444, 38305740, 47199544, 48008072, 47788492, 52076480, -60621852, 70771936, 81123344, 90956672, 99496672, 106806176, 113260432, 118105696, 120241368, 119555248, -116121960, 109772920, 101717712, 94278288, 87892744, 80907520, 72868416, 64984464, 57250304, 48546016, -39359080, 30993558, 22948548, 14470819, 7118372, 2479807, -396748, -2342905, -2013266, 912681, -4436701, 8243116, 14269492, 22054120, 29117730, 36207648, 45651208, 55477020, 62553516, 68924024, -76705432, 81624776, 81155552, 80529024, 78124920, 57773216, 15537581, -18662170, -13961865, }, -{ --573378, --6264747, -14272713, -10745471, 5682779, 21516712, 35712652, 66712116, 118752088, 158329136, 143282800, -69283728, -26658862, -104909408, -152286656, -175110656, -180047184, -170008768, -150282512, -127980896, -105768936, --81764904, -55362128, -28752658, -3396782, 20049444, 38305740, 47199544, 48008072, 47788492, 52076480, -60621852, 70771936, 81123344, 90956672, 99496672, 106806176, 113260432, 118105696, 120241368, 119555248, -116121960, 109772920, 101717712, 94278288, 87892744, 80907520, 72868416, 64984464, 57250304, 48546016, -39359080, 30993558, 22948548, 14470819, 7118372, 2479807, -396748, -2342905, -2013266, 912681, -4436701, 8243116, 14269492, 22054120, 29117730, 36207648, 45651208, 55477020, 62553516, 68924024, -76705432, 81624776, 81155552, 80529024, 78124920, 57773216, 15537581, -18662170, -13961865, }, -}, -{ -{ --20308752, --40316860, -13951128, 46215460, 91573000, 73531984, -8588861, -96410744, -122033440, -73396160, -1735167, -37586332, 37263136, 25230786, 19996294, 18992346, 19787988, 26591754, 35009352, 32031330, 16721381, -4603131, 5762236, 12380243, 13429289, 8958765, 3470871, -4042638, -16344498, -31551366, -45719388, --56838524, -64023468, -67703720, -71378064, -78357920, -86946248, -92844848, -94548336, -92495880, -85982024, --75213464, -63250908, -52242372, -41119480, -29488172, -19435264, -11538967, -3883187, 3729642, 9561671, -14200236, 19799800, 25705380, 30043834, 33976412, 39186208, 43818332, 45879916, 47028280, 48526152, -48228724, 45480484, 43227236, 42264088, 40182104, 37747932, 38270308, 40305048, 40321152, 41117868, -46702400, 52560200, 54000088, 57706644, 68199248, 70951248, 50789064, 20022064, 2858838, }, -{ --20308752, --40316860, -13951128, 46215460, 91573000, 73531984, -8588861, -96410744, -122033440, -73396160, -1735167, -37586332, 37263136, 25230786, 19996294, 18992346, 19787988, 26591754, 35009352, 32031330, 16721381, -4603131, 5762236, 12380243, 13429289, 8958765, 3470871, -4042638, -16344498, -31551366, -45719388, --56838524, -64023468, -67703720, -71378064, -78357920, -86946248, -92844848, -94548336, -92495880, -85982024, --75213464, -63250908, -52242372, -41119480, -29488172, -19435264, -11538967, -3883187, 3729642, 9561671, -14200236, 19799800, 25705380, 30043834, 33976412, 39186208, 43818332, 45879916, 47028280, 48526152, -48228724, 45480484, 43227236, 42264088, 40182104, 37747932, 38270308, 40305048, 40321152, 41117868, -46702400, 52560200, 54000088, 57706644, 68199248, 70951248, 50789064, 20022064, 2858838, }, -}, -{ -{ -14657113, -11670500, -44009992, -102688912, -108263240, -50097036, 52770652, 175993808, 280796384, 317618208, 268177216, -165755680, 54485956, -53506164, -163560400, -262813344, -325818912, -347082752, -345586496, -338761248, -327312480, --304706976, -269174176, -224736304, -177553408, -132315056, -88971320, -43842488, 4690105, 54058068, 101572752, -146826144, 189182032, 226574016, 257752800, 282824128, 301369792, 312586112, 316927776, 315509920, 308942368, -298435808, 286237024, 273256032, 258277856, 240819888, 222455152, 204482320, 186932016, 170351280, 155632976, -141848816, 127101504, 111341656, 95715496, 80057656, 63812476, 48059612, 33942052, 20797306, 8108362, --3027415, -12296491, -21097954, -29569240, -36134096, -40969156, -45819248, -50071804, -51808580, -52351356, --54154168, -55454472, -53721452, -52272436, -55008332, -56615184, -47854524, -29224568, -9227200, }, -{ -14657113, -11670500, -44009992, -102688912, -108263240, -50097036, 52770652, 175993808, 280796384, 317618208, 268177216, -165755680, 54485956, -53506164, -163560400, -262813344, -325818912, -347082752, -345586496, -338761248, -327312480, --304706976, -269174176, -224736304, -177553408, -132315056, -88971320, -43842488, 4690105, 54058068, 101572752, -146826144, 189182032, 226574016, 257752800, 282824128, 301369792, 312586112, 316927776, 315509920, 308942368, -298435808, 286237024, 273256032, 258277856, 240819888, 222455152, 204482320, 186932016, 170351280, 155632976, -141848816, 127101504, 111341656, 95715496, 80057656, 63812476, 48059612, 33942052, 20797306, 8108362, --3027415, -12296491, -21097954, -29569240, -36134096, -40969156, -45819248, -50071804, -51808580, -52351356, --54154168, -55454472, -53721452, -52272436, -55008332, -56615184, -47854524, -29224568, -9227200, }, -}, +const Word16 CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS][2885]={ {-74, 41, -24, 10, -13, 3, -10, -3, 0, 20, -13, 9, -21, 15, -24, -32, -28, 6, -3, 4, 1, -15, 8, 15, -8, 12, -2, -5, -10, -2, 3, 8, -6, 12, -5, 8, 11, -8, -8, 1, -8, 2, 0, -4, 8, 1, -4, 28, -29, -5, -6, -7, -2, 0, -6, -4, 0, 1, -4, 3, -9, -2, -2, 6, -31, -3, 6, -3, -4, 3, 0, 2, 14, -7, -5, -7, -2, 4, 6, -6, -5, 8, -7, -10, -1, -3, 3, -3, -3, 2, 3, -6, 2, 3, -99, -67, + -27, -31, -17, -16, -15, -7, -19, -15, -6, -11, -2, -4, -10, -13, -15, -6, -9, -15, -2, -19, 0, -1, -3, -12, -2, -9, 0, -11, -7, 4, -8, 1, -19, -4, 9, 6, 0, -3, -6, 2, 2, 9, -5, -1, -3, -130, -7, 17, 0, 5, -1, 0, -10, 11, 5, 13, 10, 27, 20, 1, -11, -6, -2, 5, -4, -24, -22, -11, -3, 1, 3, 4, -1, 1, 3, -5, -1, -1, -15, 9, 4, -2, 0, -6, -8, 5, 2, -6, 5, 4, 6, -3, 146, 102, 20, 39, + 8, 13, 32, 17, 5, 19, 8, -9, -4, 7, 11, -20, -2, -12, 26, 13, 7, 13, 7, 7, 0, -1, -6, 10, 13, 11, 13, 16, 10, 23, 5, -1, 9, 1, -4, -2, -3, -5, 0, 11, 3, 2, 7, 218, 92, 28, 25, 18, 11, 4, 1, 24, 5, 14, 18, 10, -2, -6, 38, -3, -21, -12, 9, 1, 20, 7, 2, -3, -10, -2, -5, 9, -2, 4, 1, 2, -5, 8, 26, 17, 17, 16, 13, 7, 5, 3, 8, -7, 5, -3, 72, -75, -23, -33, -28, -15, + -5, 10, -10, 1, -28, 9, -10, -25, 7, -18, -24, -17, 23, 17, -8, 9, -16, 6, -29, 1, 5, -5, -7, 6, -23, -11, 3, -8, -7, -5, 2, 2, 12, 1, 20, -8, -5, -7, -10, -3, -5, 3, -9, -13, -2, -258, -131, -47, -37, -40, -25, -35, -22, -38, -7, -17, -4, 1, -15, -5, 3, 0, -24, -16, -11, 2, -32, 3, -14, -29, 3, -1, 2, -1, -10, -8, 0, -3, 0, -11, 0, 2, 9, 3, -11, 6, -11, 7, -19, -13, 3, -11, 1, -4, -15, -5, + -153, 80, 33, 13, 20, 4, 5, 18, 20, 11, 13, -10, -5, -16, 19, 4, 3, 27, 1, -18, 31, -21, 2, 26, -8, 7, 3, 0, -13, -3, 7, 8, 1, -4, 0, -9, 30, 3, -1, -11, -6, -7, -7, 16, 15, -4, 1, -1, 4, 1, -1, -3, 3, 3, -5, -4, 1, 4, 230, 97, 26, 52, 31, 13, 23, 20, 0, 14, 23, 5, 0, 11, 32, -11, -6, -26, 7, 29, 13, 1, -16, -9, -7, 31, 10, 16, 9, -15, -23, 27, 15, -17, -8, 26, 22, -1, + 6, -3, 12, 7, -2, 5, -9, -4, 14, -7, -5, 15, 13, 7, 3, 3, 3, 11, 6, 17, 272, 59, 46, 20, 21, 8, 22, 25, 41, 24, -7, 31, -6, 8, 7, 27, 40, 25, -6, 44, -8, -5, -23, 6, -7, 7, 12, -14, -18, -8, 4, -15, -5, 7, 10, -18, -15, -6, 6, 0, 5, -7, 0, -4, -6, 7, -10, 9, -10, -4, -8, 2, -3, 11, 5, -1, 15, 5, 32, -121, -39, -43, -28, 7, -7, -26, 15, 1, 18, -2, 2, -28, -20, -13, -20, 2, + -22, -42, 8, 5, -19, -4, -18, 4, 6, -4, -43, -12, 3, -5, 4, 12, -31, -9, -19, 10, -2, -2, 20, -21, -1, 6, -3, -7, 10, 5, -12, -15, -24, -4, -18, -15, -8, -10, -6, -3, -6, -9, -12, -7, 4, 8, -1, -283, -96, -58, -14, -30, -1, -17, -21, -26, 32, 0, -12, -3, -47, -27, -23, 38, -32, -68, 6, 8, 6, -25, -6, 14, -31, -4, -32, -10, 18, -16, 5, 34, 4, -8, -8, 9, 11, 8, -10, -2, 12, 15, 10, 5, -29, 5, -1, -15, + -5, 3, -4, -15, -10, -16, -4, 0, 3, -3, -11, -2, -8, -1, -9, 0, -188, 44, 2, -22, 33, -21, -17, 9, -32, -18, -7, 14, -25, 35, 0, 0, 15, 16, 25, -2, 34, 50, 35, 12, 30, -9, 19, -22, -23, -9, 2, 16, -13, -21, -12, 0, 13, -20, 15, 6, 11, -5, -20, -25, -31, 9, -16, 9, -33, -9, 14, -20, 3, -14, 9, -4, 9, 3, -6, 0, -13, 25, 10, 23, 9, 126, 207, 60, 54, 75, 60, 12, 48, 43, 23, 91, 21, 16, 39, 37, + 19, 16, 9, 15, -12, 46, -12, 5, -14, 29, 1, -7, 24, 29, 10, 38, -27, -44, -10, -2, 10, -3, 19, -17, 17, 39, 16, -33, -7, 18, 7, -16, 24, 10, 14, 16, 21, 8, -6, 6, -19, -5, 18, 17, -9, 0, 4, -8, 3, 14, 476, 49, -4, 29, 0, 41, 1, 11, 6, 43, 20, -18, 15, 20, 11, -26, -53, -25, -22, 9, -33, -6, -2, 9, 60, 33, 12, 24, -36, -2, -19, -7, -15, 22, -8, 37, -17, -7, -19, -9, -27, -13, 7, 6, -1, 0, + -15, 9, 26, 2, -13, 16, -22, 10, 10, -2, -7, -5, -1, -4, 2, 15, -1, -14, 3, -138, -165, -31, -9, -7, -26, -11, 50, 30, 10, 14, -22, -4, 37, -14, 61, -47, -13, 50, -10, -6, -29, 34, 38, 1, 37, -14, 16, -1, -21, -3, -17, -7, -11, 20, -15, -4, -23, 16, -12, 34, -54, 23, 19, -33, 1, -22, 6, -25, 8, 10, -31, -5, -12, -47, -27, -13, -23, -5, -4, 2, -19, 3, -37, 10, 4, -13, 4, -13, -4, -8, -4, -122, -69, -95, -48, -63, + -7, 60, -63, 48, 32, -35, 70, -11, 14, -46, -4, -21, -3, 0, 17, 8, 37, 69, -18, 9, -33, -35, -30, 7, 29, -11, -10, -10, -21, 24, -7, -2, -21, -17, -14, -22, -2, -1, -18, 11, -28, 10, -16, -3, 10, -21, 26, -45, -14, 4, -13, -24, 12, -7, -26, 43, 25, 6, 9, 8, 11, -23, -14, 5, -8, -16, 17, -339, -38, 27, -24, 56, 26, -69, 10, 11, -22, -58, -21, -14, 17, 4, -53, -20, -28, -51, -43, -100, -52, -59, -71, 56, -37, 20, 43, -31, + -48, -19, -10, 11, 32, 18, -39, -50, 40, 24, 31, 43, 7, 0, 18, -2, -19, 11, -10, -7, 26, 65, -21, -33, 16, -21, -1, 33, -64, -1, -21, -4, -1, 0, -7, 13, -19, 23, 26, 11, -1, 0, -21, 271, 236, 64, 144, 40, 83, -13, -13, 40, 54, 29, -94, -31, 58, 66, -24, -32, 11, 28, 31, 5, -49, -105, -40, 58, -5, 59, -14, -18, 12, -48, -28, -28, 54, -67, -46, 12, 11, -17, -2, -19, 20, 28, 24, 54, 31, 1, -44, 41, -4, 23, -21, 16, + 33, -5, -9, -20, -24, 15, 3, 21, -21, 18, 42, -8, -23, 30, 38, -15, 17, 20, 15, 37, 31, 330, 61, -64, 53, 35, -63, -13, 31, 2, 9, -5, -14, -68, -68, 30, 63, 66, -66, -131, 18, -2, -54, -67, -13, 34, -24, 50, 79, -30, -27, -11, -13, -16, -123, 64, 57, -2, 37, -37, -13, -34, 48, 53, 5, -13, -20, 29, 6, -17, -32, 0, 25, -40, -26, -22, 6, 13, -51, 25, 54, -45, -2, -11, -9, -1, 4, 3, -4, 10, -16, -30, -36, -15, -10, -19, + -34, -27, -8, 24, -11, -91, -59, 8, 82, -83, 59, 26, 13, 16, 15, 53, 87, 2, 26, 9, -74, -68, 66, 8, -76, 44, -65, 10, 81, -6, -22, 91, 15, 5, 8, 2, 9, -41, 25, 36, 61, -49, -24, 9, 9, -23, -43, 27, -16, 19, 11, -16, -14, 5, 28, -22, -9, -6, 16, -45, -20, 20, 5, -16, -7, 18, -18, 5, -12, -4, 15, 3, 9, -39, -27, 9, -354, -324, -73, -150, -133, -74, -23, -56, -68, 46, 12, -15, 77, 29, 92, 72, 20, 29, 33, -142, + 66, -11, -31, -26, -85, -26, -30, 81, -28, -48, -25, 13, -11, -16, 17, -21, -15, 50, -49, -4, -16, 89, 35, 36, -69, 5, 60, -32, 14, 0, 14, 0, 4, -5, 38, -5, -13, 28, -21, 16, 33, -16, -24, 10, 12, -25, -11, -47, -38, 12, -5, -8, -2, 6, -4, -30, -15, -223, 469, 292, 96, 27, 33, 32, 54, 45, 100, 197, 13, 21, 44, 39, 52, -38, 194, 136, -126, 93, 19, -22, 48, 115, -107, -32, 10, -92, -60, -66, 133, -7, -22, 16, 9, -41, -105, 72, + 61, -19, 34, 74, -49, 40, 6, -21, 61, 50, 13, 6, 8, 40, 59, 0, -9, -1, -17, 40, 10, -17, -19, -16, 32, 13, 71, -22, 27, -16, 19, -29, -9, 8, -14, -21, 3, 3, 11, 18, 508, -179, -175, 79, 20, -67, -58, -94, -91, -68, -56, 83, 20, 9, -47, -42, -147, -1, -58, -103, 86, 56, 18, 52, 16, -19, -32, -3, -27, 42, 74, -78, -28, 0, 41, 100, 31, 135, -68, 42, 114, 66, -55, -17, 14, -29, 50, -8, 4, 71, 41, 11, 8, -2, -29, -1, + 10, -33, -17, 31, -11, -62, -7, 1, -9, -64, 18, 13, 18, 17, -12, -27, -7, -14, 54, 22, -18, 14, -3, 10, 3, 163, 309, 122, 82, 97, -29, 32, -89, 154, 60, 148, 44, 57, -135, 169, 249, 33, 161, -32, -131, -129, 118, -37, 95, 18, 38, -72, 73, -25, -26, 122, 84, -62, 113, 14, 21, -22, -85, 25, 6, -46, -54, 51, 70, 24, -25, 34, 3, 76, -45, -5, -74, 10, 73, 50, -34, 1, 26, -65, -5, -44, -25, 15, 17, 46, -52, 24, -60, 7, 74, 28, + 15, -46, 7, 7, -78, -19, 9, 15, 31, 14, 0, -362, -18, -83, 104, -79, 86, 1, 69, -11, 59, -182, 54, -23, -64, 30, -78, 47, -79, -44, -176, 99, 213, -85, -27, -26, -34, 31, 43, 60, -156, 45, -97, -30, -5, 79, 31, -42, 18, 16, 58, 57, -97, -34, 15, -73, -63, -14, -45, 18, 55, 6, 10, -15, 52, 136, 78, -86, 18, 30, -42, 47, 13, -56, -5, 60, 7, 58, -80, -20, 49, 1, -26, -57, -4, -31, 46, -15, 29, -16, -6, -664, -247, 133, 50, -87, + 96, 76, 126, -31, -53, 107, 6, -75, 149, -167, -214, -103, -114, 74, 110, -4, 30, 170, 77, -175, -77, -108, 34, -163, -139, -10, 24, -63, -66, -100, -49, -91, -86, -34, 10, -33, -3, -62, -7, -48, -100, 220, 20, 51, -88, 58, -4, 29, -70, -4, -10, -61, -36, -28, 74, 52, 59, 34, 46, -11, 3, -53, -7, -3, -2, 67, 21, 39, 44, -32, -71, 31, -26, -14, 33, 86, -8, 347, 128, 279, 45, 18, -111, 43, 168, 63, 13, 112, -100, -45, 92, -70, 33, 161, 53, 22, + 52, -29, 71, -53, 3, 28, 11, -41, -43, 18, 167, -53, 42, -152, -80, 70, 176, -134, 2, 85, 23, 33, -110, -38, -95, -167, -43, -93, -97, 80, 33, 28, -56, -34, -10, -160, -13, 91, -62, 74, 151, 24, 100, 66, 7, -29, 87, -107, -3, -5, 70, 34, 65, 4, 72, -3, 16, 12, 76, 2, 3, 68, -34, 43, 17, 13, -19, 424, -95, -127, 19, 99, 77, 83, -26, 89, 25, -101, -209, 141, 35, 103, 58, -53, 22, -77, -138, 143, -90, -166, 16, -25, 19, -15, -19, -41, + -69, 52, 112, -162, 159, -137, -183, 20, 47, -100, 79, -12, 49, -86, -45, 152, 60, 154, 39, 14, 47, 2, 4, 82, -8, 16, -72, -46, -43, 58, -57, -45, 89, 0, 100, 18, -75, 124, 93, -5, 60, -60, -103, 42, -39, -71, 5, 67, 87, -31, 26, 45, -7, 21, -90, 36, 29, -42, 355, 430, -65, 2, -216, -25, -157, -119, -37, -82, 123, -1, 95, -203, 169, -128, 173, 5, 137, -50, 173, 56, -81, 36, -121, 80, -67, 193, 59, 127, -211, -122, -51, -108, -44, -74, 8, 261, + -120, 131, 223, 31, 98, 1, -49, -104, -78, 10, -56, 133, -86, 61, 163, -22, -12, -14, 133, 143, 46, -67, -57, -36, 57, -132, 26, -24, -35, 1, 88, 7, 124, 112, 23, 26, -52, -3, 127, -17, 9, 52, -66, 1, -76, -84, 13, 12, -16, -335, -302, 135, -41, 167, -96, -77, -114, -91, -44, -264, -98, 103, 141, 60, -186, -51, -90, 80, 266, 151, 64, 12, 19, 16, 46, 140, 10, 38, -79, 8, -114, 46, 54, 102, 12, -66, -35, 134, -62, 52, 26, 50, 168, -92, -143, 56, + 120, 34, 119, 146, 69, 102, 38, 24, 79, 242, -134, 2, 39, 24, -104, -16, 80, 1, -93, 39, 174, -139, 46, -132, 77, 55, 21, 8, -63, -61, 122, 69, 25, -35, 86, -10, 0, -57, 63, 26, -675, -238, -14, -69, -165, 100, 138, 228, 77, 143, -132, -284, 133, -69, 9, -154, 151, -92, -6, 137, -384, 35, 202, -376, -97, -134, 20, 12, 93, -106, 123, 15, -195, -103, 25, -27, -96, 84, 230, 47, 65, -39, -55, 131, 26, -69, -326, -54, 43, -168, 80, 65, 15, -130, -114, -139, + 296, 76, -44, 55, -249, 27, -116, -137, 131, -24, 3, -87, -312, 40, 96, 53, -22, 183, 7, -80, -11, -124, 193, 102, 55, -34, 14, 59, -56, 22, 28, 8, 718, 180, 186, 157, -45, 6, 739, 213, -60, 450, -252, 188, 40, 115, 185, -57, -128, 139, -24, -446, 115, 115, 95, 212, 136, 138, -124, 28, -120, -63, 133, 44, -259, -155, -217, -324, -48, 67, 160, 137, 119, 99, -46, 170, 96, -206, -77, 55, 157, 4, 35, 274, -47, -23, -69, -14, 142, -119, 4, -168, -148, -95, 178, 242, + -68, 20, -44, -149, -99, 40, -171, -45, -44, -111, 310, 68, 105, 91, -6, 2, 56, 17, 99, 62, 4, -8, 733, 428, 34, 271, 212, 57, 320, 86, 2, -102, -70, -209, -556, -45, 58, -194, -106, -25, 394, 125, -98, 1, 30, -59, 168, -31, -98, -72, -93, 59, -137, -347, 11, -182, -275, 52, 123, 171, 101, 151, -102, -299, -190, -269, 108, 247, 209, 130, 252, 3, 159, 335, -277, 48, -123, -2, 100, 98, 168, -18, -339, -267, 60, -78, -94, -68, -71, -237, 24, 156, -14, 118, -69, -9, + -10, 58, 236, 161, 145, -137, 11, -84, 13, -218, 47, 33, 27, -7, -23, -65, 57, 179, -366, 46, -281, 126, -534, -13, -178, -274, 490, 279, -177, -441, -114, -160, -388, 302, 14, -266, -101, 155, -255, -171, -135, -299, -117, -5, -244, -219, 306, -114, -99, -28, -71, 263, -293, -135, 59, -77, -3, -65, 149, -275, 96, -440, 42, -126, -179, 463, 45, -171, 85, 97, -376, 259, -66, -80, -31, 148, -65, 7, -182, 97, 118, 208, -183, -461, 319, -37, 130, 158, -99, 91, 235, -304, 13, -107, -37, -316, + 104, -49, 9, -8, 38, -54, -52, 86, -84, 62, 15, -60, -701, -384, 83, -243, 25, -174, -97, -258, -185, 137, 387, 416, 61, 295, -205, 511, 367, -292, -271, 88, 79, 433, 151, 279, -104, 114, -61, -42, -96, 405, 174, 388, 343, 71, -26, -165, 163, -16, -356, -230, -72, -177, -46, -182, -169, 115, -55, -114, 288, 349, -204, -62, 466, 196, -327, -312, -119, 123, -20, -55, -234, 197, 54, -71, 48, 57, -289, -121, 22, -103, -143, -145, 380, -298, -276, 115, 192, 285, -148, -42, 22, -126, 129, -17, + 96, -81, -40, 30, 34, -45, -48, 0, -57, -266, -388, -336, -1, -265, -337, 86, -28, -473, 338, 59, -27, 167, 520, 495, 215, -608, 227, 160, -594, -9, -286, -140, 308, -361, 210, -1, -61, -129, 63, -31, 104, -70, -318, 309, 147, 370, -38, -126, -178, 149, -161, 437, 93, 262, -340, 271, 12, 96, -220, 74, -262, -42, -269, 110, 187, -359, 15, -296, 139, 174, 171, -24, -506, 1, 135, -44, 226, -485, 125, -202, 66, -171, 36, 125, -54, -2, -52, -63, 20, -131, 165, 37, -3, -208, -18, 22, + -14, 87, -89, 20, -9, -46, 729, 884, 370, 308, -509, 490, 712, -778, 93, 505, 88, -929, -93, -504, 163, 185, -235, -92, 169, -426, -34, -167, -209, 83, -323, 348, 248, 450, -223, 74, -49, -184, 569, -11, -262, -124, 123, -123, -149, -175, 289, 107, 402, -29, 147, 528, -335, 70, -228, 419, -165, 196, 83, -17, -159, -299, -202, 84, 378, -357, 319, 377, 190, 441, -216, -176, 287, -50, -54, -408, -26, -337, 69, 425, 209, 107, 195, 115, -183, -83, -320, 361, 15, -144, 95, 32, -168, 87, -24, 103, + -18, 156, 75, -340, -1156, -485, -831, -449, -355, 191, -533, -546, -261, -729, -237, 549, -17, 21, -148, -130, -69, 49, -9, -489, -77, -97, 707, -93, 629, 50, -169, 162, 518, -28, 5, -210, -61, -220, 123, -94, -186, 93, -251, 203, 208, 39, 453, -206, 231, -193, 255, 171, 478, 64, -195, 256, -33, -161, 607, -46, -37, 348, 108, 469, -366, -359, -55, -156, -49, -580, -132, 200, -79, -250, -407, 27, 124, -205, -195, -355, -126, 149, 155, 313, -50, -30, -11, 104, 125, 20, 199, 54, 21, -27, -19, 142, + -61, 140, 158, -7, 47 }, + {-85, 45, -24, 28, -17, 23, -49, 2, -2, -6, 11, 24, -1, -2, -27, -11, 12, 7, -3, 11, -3, 4, -12, -8, -8, -3, 1, -6, -4, 14, -8, 9, -8, -1, -7, 8, 3, 7, 11, 14, 5, 4, -1, 2, 2, -3, 3, 30, -34, -5, -6, -8, 6, -17, 6, 0, 8, 7, -14, -5, 21, -2, 4, -4, 9, 19, 22, 4, 9, 0, -17, -1, 2, -4, 0, 9, -10, -13, 6, -6, -6, -9, 0, 10, 2, -3, -4, -4, 0, 2, -5, 2, -6, 4, -86, -61, + -30, -22, -17, -17, -6, -13, -4, -8, -21, 4, 11, -2, 6, -4, -11, -11, -17, -6, 4, 1, -10, 6, -12, -11, 7, 0, 0, 6, 6, 2, -3, -3, -5, 2, 1, -6, 3, -12, -5, -3, -1, -8, -2, -3, 0, -122, -16, 9, 2, 8, 1, -7, 5, -6, -5, -11, -9, 4, -3, 7, -7, 0, -7, 2, 13, -4, 10, 0, -8, -2, 12, 5, 8, 8, -11, 7, -4, -1, -6, -3, 4, 5, 3, -3, 10, 7, 5, -3, -5, 0, -4, 1, 144, 114, 27, 51, + 13, 39, 28, 8, 28, 11, 22, 9, -7, 21, 15, -6, -2, -40, -4, 2, 25, 3, 1, 12, 1, 11, 11, 2, 0, 4, 17, 13, 11, -1, -4, 1, 8, -3, 0, 9, 3, -4, 0, 2, -8, 11, -6, 253, 92, 46, 26, 17, 15, 16, 25, 7, 41, 7, 3, 19, -11, 5, -5, -3, -8, 28, 14, -1, 20, -13, -4, -4, 31, -2, 11, 4, 15, 4, -5, 9, 10, -4, 3, 6, 2, 8, -3, 9, 6, -19, 4, 4, 3, 15, 98, -73, -24, -34, -20, -21, + 14, -12, -29, -9, -39, -11, -16, -39, -9, 7, -23, -9, 5, -28, 0, 30, 8, 3, -13, -1, 12, -1, -12, -15, 15, -3, -18, 0, -7, 21, 0, 9, -3, 18, -12, 6, 3, 3, 1, 3, 0, -8, 13, 7, 1, -267, -149, -32, -37, -27, -32, -47, -3, 0, -13, 10, -12, 1, -1, -16, -16, -28, -9, 25, -24, -4, 24, 14, -3, 7, -3, -27, -12, -22, -7, 0, -5, 11, -22, -19, 0, -23, -17, -17, -18, 17, -5, -25, -7, 5, 7, -9, -12, -7, -22, -12, + -166, 96, 33, 18, 14, 17, 5, -15, 2, -8, -5, 32, 15, 28, 23, 29, -25, 14, 26, 7, 23, -27, 3, -5, -4, -8, 8, -1, -2, 29, -29, -5, 8, 18, -9, 15, -13, -15, 19, -8, -3, -3, 6, 0, 8, -7, -6, -6, -5, -5, 14, 5, 3, -7, -14, 4, 14, 4, 244, 98, 23, 54, 45, 7, 21, 51, 25, -3, 13, 5, -6, 14, 47, 9, 55, 25, -43, 7, 3, 8, 41, 21, 18, -5, -4, -7, -5, 5, -7, 12, 6, 17, -2, -6, 8, 14, + 10, -3, -18, -9, -9, 16, 14, 19, 13, 2, 5, 16, 15, 10, 4, 2, 10, 8, 6, 13, 272, 77, 35, 41, 8, 40, -5, -17, 0, 9, 6, -2, 9, 41, -5, -27, -17, 19, 6, 22, 39, 32, -1, 21, -22, 2, -17, 24, 16, -29, 18, -14, 3, -12, 18, -11, 22, 16, 15, 26, 10, -1, -5, -1, 5, 29, 1, 0, 3, 14, 11, 0, -2, -5, -15, -3, -11, -5, 39, -117, -45, -20, -25, -13, -9, 0, 18, -18, -30, 28, -36, -37, -5, -10, 18, -12, + 1, -36, -19, -43, -44, -52, -6, 10, -34, -11, 6, 2, 3, -6, -34, -23, 17, 4, -7, 32, -21, -12, 10, 19, 18, -4, -4, 6, 6, -23, 3, -14, -4, 0, -7, 0, 16, 2, -2, 2, -15, 8, 15, -4, 1, 0, -1, -296, -92, -56, -22, -41, -31, -10, -22, -10, -30, -42, -29, -11, -60, -15, -24, -38, -4, 6, 20, -22, -30, -12, 26, 31, 40, 20, 0, -20, -8, 0, -23, 9, 17, 20, -13, -13, -11, -6, -4, -9, 16, -5, 11, -21, -35, -15, -1, 17, + -30, 10, -14, 14, -14, 8, -12, -1, -8, -1, 6, 11, -7, -11, 0, -11, -169, 45, 12, 0, 30, -28, 7, -65, -21, 23, 16, 42, -3, 46, -27, -7, 22, -40, -15, -24, 45, -3, -37, 19, 36, -32, -25, -29, 8, -7, 15, -11, -9, -8, -18, 25, -21, 5, 16, -2, 19, -11, 42, 6, -5, -15, -15, 0, -17, -21, -13, 3, 14, -2, 4, -18, -18, -26, -11, -9, -7, 7, 10, -11, 1, 146, 211, 72, 74, 99, 73, -11, 15, -8, 14, 12, 19, 13, 37, 13, + 24, 7, 72, 16, 36, 20, 20, 56, 15, 70, 38, -14, 51, 13, 26, 49, 12, 29, -13, -5, 16, 22, -28, 26, -16, -33, -17, 27, 43, 31, -4, 10, 11, 15, 23, 12, 26, 15, -21, 0, 19, 24, 9, 8, 6, -23, -7, -14, 16, -1, 507, 36, -23, 38, -25, 55, 20, 58, -27, 3, 3, 34, -61, 10, 43, -11, -7, 51, 85, -37, -17, 8, 43, -20, 29, -1, -24, -24, -19, 16, 28, 27, -18, 30, -18, 29, 31, -9, -16, 9, -27, -44, 12, -31, 15, 1, + 8, 16, 3, 20, 5, -30, 14, -9, 17, -23, -1, 2, 18, -13, -33, -8, -13, 2, -9, -172, -167, -38, 13, -7, -26, -27, -38, -10, 27, -9, -10, -39, 40, -2, -34, -29, 70, -64, 6, 46, -6, 7, -62, 19, -27, 14, -43, -28, 6, 11, -21, -23, 2, -9, 2, -26, -15, 27, -4, -13, -8, 34, 15, -20, -31, -27, 8, -4, -13, 3, 5, -15, 41, 22, -5, -4, -12, 5, -13, -12, -13, -3, -24, -19, -32, 7, -34, -2, -9, -9, -3, -69, -56, -71, -48, -38, + -23, 4, 1, -19, -5, 15, 62, -54, 28, -19, -31, 41, -2, 7, 57, 7, 25, -37, -7, -103, -10, 18, 14, 7, 12, 13, -21, -32, 25, -4, 24, 10, -25, 21, -1, -74, -58, -11, -54, 6, 19, -5, -13, -8, 4, -18, -4, -5, -8, 16, 6, 4, -8, -9, 29, 6, -16, 18, -3, -14, -28, -1, -14, -6, 22, 15, 23, -329, -75, 5, -65, 26, 7, 79, -37, 5, -22, 53, -108, -104, 44, -50, 78, 28, -62, -110, -2, -31, -53, -22, 13, 18, -26, 94, 5, -9, + -39, 32, 36, 38, 41, -5, -24, -9, 24, -2, 29, -28, -11, -10, 34, 27, -30, 39, -21, -27, 3, -12, -25, 26, -30, -4, 8, -7, -12, 7, 25, -16, 24, -20, 16, -11, -12, -8, 5, 31, 6, 29, -19, 301, 265, 55, 71, -14, 87, 69, 87, -4, 35, 21, -82, -69, 38, 8, -58, -62, -34, 4, 35, 10, 83, 76, 34, -17, -18, 50, 47, 4, 42, -13, 53, 3, -11, 73, 39, 60, 39, 13, 43, 21, 15, 39, -21, 8, 52, 0, -32, 31, 31, 22, -23, 0, + 31, 46, -22, 55, 63, -11, -33, 6, 15, 10, 28, 0, 11, 22, -14, 2, -21, -5, -28, -16, -3, 366, 29, -10, 25, 18, -60, 16, 16, 1, 38, 56, 83, -37, -38, -58, -48, 55, -5, 78, -19, -18, 32, 68, 27, -67, 53, -19, 43, -22, 33, -40, 25, -3, 39, 5, 22, 13, -69, -37, -7, -13, -7, -21, 33, 13, 71, -10, -49, -28, -5, 5, -54, 19, -19, -2, -6, -31, 28, 56, -18, 29, 6, -30, -3, -29, -25, 6, -43, -30, 18, -2, 9, 30, -41, 49, + 5, -20, -49, 14, -18, 105, -25, -101, -68, -91, 84, -67, 19, 103, -4, -104, 7, -110, 91, -32, 91, 1, -34, 78, 3, 16, -59, -74, -12, 26, 16, -14, -34, 35, -10, 26, 40, 48, 22, 27, -98, 8, -22, -33, 14, 49, -41, -75, -33, 22, 9, -66, -27, 31, 45, -40, -26, -30, 46, 61, 13, -21, 7, 44, -21, -2, -29, 31, -36, -4, 43, 26, -12, -6, -1, -14, -369, -374, -60, -183, -114, -65, -101, -13, 77, -168, 61, -35, 56, 9, 34, -70, 18, -9, -36, -154, + -31, -80, -98, -11, 25, 5, -33, 21, -32, -10, 82, -2, -27, 5, 53, 71, 48, 0, 38, 44, -4, 0, -80, 29, -66, 12, 64, -44, -80, 23, -45, -43, 9, -1, -38, 18, -9, 86, 48, 26, 11, 31, -3, 9, -34, -62, -10, 5, -44, -31, -24, -21, -25, 13, -13, -4, -27, -220, 408, 319, 20, 65, 26, 71, 109, 25, 105, 19, -110, 73, 89, 26, 27, 66, 88, -87, 73, -46, 65, 9, -52, 10, 73, 41, -85, 41, -34, 125, -10, 29, -18, -81, 82, 81, 39, 20, + -3, 29, 87, 20, 63, 7, 44, 23, -5, 46, -55, -88, -37, -67, -55, -29, -57, 78, 57, 7, -13, -28, -8, -2, 2, 4, 12, 16, 11, -2, -19, -18, -1, -2, -6, 9, -8, 47, -9, 62, 548, -215, -114, 18, 1, -29, -150, -66, 41, -9, -20, -31, 25, -126, -34, 63, 123, 65, 56, -40, -35, -73, 86, -120, -19, 28, -76, 24, 36, 94, -143, -14, -1, -32, 41, -136, -68, 147, 100, 19, -23, 87, -24, -13, 19, 68, 42, -44, 11, -27, 59, -92, -39, -56, -56, 110, + 33, 12, -47, -6, -14, -21, -49, 7, -47, -4, 19, 41, -72, -53, -63, -21, 37, 5, 49, -8, -59, -8, -25, 27, -1, 163, 373, 62, 142, 129, 123, 42, 92, 58, -27, -75, -49, -21, 105, -90, -101, -6, -5, -40, -77, 227, 212, 161, 7, -91, 16, 16, -46, 53, 33, 92, 10, 38, -5, -62, 103, 87, 62, -14, -82, 6, -7, -22, -168, 122, -77, 140, 8, 76, -16, 84, 126, 26, -57, -3, 23, -41, 22, -15, -54, -29, 17, -12, 53, 20, -90, 6, -13, -96, -23, 20, + -37, 11, 81, 34, -5, -28, -22, 3, 35, -9, 39, -392, -52, -245, 3, 43, -83, -143, -165, -157, -93, -128, -31, -9, -33, 41, -25, 8, 101, 45, -10, 237, -52, 47, -35, 19, 35, 12, -13, 34, 111, 33, 40, 12, 45, 93, 130, 40, 157, -43, -135, 136, -43, -29, -27, 77, 120, 90, -2, -32, -69, -176, 108, 122, 87, -105, 63, 16, -10, 99, 17, 66, -55, 32, -69, -7, 60, -18, 45, -10, -25, -25, -84, 8, 6, -1, 16, -19, -104, 7, 5, -687, -307, 139, -26, -25, + 25, -87, -74, -27, -33, -121, 86, 8, 180, -101, -85, -148, -81, -152, 13, 54, -225, 144, 126, -19, 26, 94, 15, 82, -170, -173, -95, -114, -86, 278, 92, -63, -99, -144, 69, 37, -67, 54, 56, -102, 10, 21, 80, -95, 230, -102, -79, 35, -24, -3, -68, -27, 8, 145, -44, 209, 46, 12, 24, 55, -62, -24, -82, -68, -63, -2, 114, -75, -53, -33, -42, -41, -4, -27, -38, -36, 108, 347, 178, 111, 75, -122, 13, -99, 155, -17, -20, 53, 34, 36, -4, 55, 20, 58, -47, 151, + 21, -13, 453, 25, -34, -115, 68, -107, 102, 244, -18, 60, 61, -125, -139, 5, 4, 108, -68, 4, -6, 79, 82, 136, 52, 48, 57, 6, 91, 42, -164, 36, -84, -211, -17, 60, 2, 19, -27, 5, -5, 0, 28, 6, 98, -57, -7, 20, 22, 4, -35, 68, 115, 112, 25, -22, -10, 41, -3, -13, 0, 23, 54, -8, -18, -36, -21, 512, -152, -52, -142, 260, 91, 25, 48, -34, -63, 94, 5, -85, 19, -113, -92, 10, -122, 20, 35, -84, -158, 19, 5, 108, 168, 123, -84, 3, + 103, 198, -207, 81, -42, 1, -96, -127, 8, 121, 31, 57, 71, -4, 46, -8, 32, 79, -139, -91, 208, -13, -10, -44, 81, 278, 65, 46, 86, -68, -84, 4, -64, -152, 98, 17, -81, 47, 21, -40, -77, 104, -37, -114, 53, 60, 81, -78, 5, 41, -17, -27, 123, -5, 21, -51, -10, 3, 436, 409, -132, 110, 36, 85, 223, -29, -113, -42, 429, -241, -43, -120, -93, -196, 216, -63, -287, -218, -262, -103, 237, -29, 113, -43, -117, 103, 34, 131, -124, 116, 97, 47, 58, -209, 63, -175, + 150, 310, 93, 93, -194, 278, 78, -30, -40, -57, 91, 139, 37, -33, -4, 37, -64, -48, -61, -50, -2, 102, -64, 152, 59, 93, -28, -219, -143, 56, 19, -65, 85, -4, -4, 44, -27, 64, -7, -7, 35, -38, -3, -41, -21, -51, 38, 3, 15, -405, -247, 62, 28, 1, -184, 110, 56, -105, -298, 243, 54, 92, 131, 83, -43, 46, -79, 202, -171, -285, -14, -12, -141, -310, 5, -62, -169, -89, -56, 71, 7, 116, 224, -96, -195, 61, -27, 3, 89, -133, -128, -16, 105, -145, 115, -41, + 228, -33, -79, -27, -4, 47, -272, 39, -237, 236, -5, 148, 82, -90, -18, -120, 53, -13, 40, 44, -165, -24, -160, -68, 62, -47, -100, 44, -8, -159, -85, 16, -1, -66, 63, -36, -47, 33, -102, 49, -572, -254, -102, -57, -24, 66, -203, -135, 46, -159, 45, -177, -64, -171, -221, 233, 88, 40, -20, -181, -324, 165, -422, 157, 0, -127, 15, -76, 25, 296, -152, -9, -319, 252, -79, 118, -116, -30, -32, -5, 139, 56, 297, 371, -45, 12, -127, 20, -53, 63, 110, 21, 257, 81, -104, 49, + 48, 8, -25, 15, 194, -143, -308, -117, -2, 78, 46, 158, -22, 71, -83, -115, -174, -128, 5, -36, 76, 28, -53, -14, 138, 4, 74, -28, 21, -28, -40, -54, 719, 323, 221, 94, -84, -129, -227, 127, 214, 91, -102, 256, 142, 256, 16, -182, -73, 384, -400, -80, 262, -154, -89, 619, -79, 178, 558, -88, -38, -14, 68, -29, 241, 158, 199, -140, -332, 134, -132, 161, -63, 60, 235, 139, 13, 106, 47, 102, 227, 131, -25, 224, 92, 34, 52, 410, 244, 3, 221, -96, 280, -68, 61, -77, + 33, 164, -90, -4, -17, 58, 5, -103, 3, -88, -162, 30, -216, 86, 131, -51, -93, -59, 115, 37, 6, -45, 933, 418, -186, 79, 483, 9, 349, -104, 140, 287, -216, 24, 507, 452, 371, 129, 319, 51, 280, 95, 86, -176, -202, -292, -573, 181, 9, -158, -53, 197, -128, -22, 25, 110, -507, -84, 372, 283, -101, 186, 163, 102, -60, -120, -49, -81, -49, -190, -157, 129, -315, 103, 263, -79, -183, -291, 274, -10, -135, -91, -60, -101, 60, -47, -98, 102, 426, -213, -125, 53, -80, 96, 7, 217, + 45, -23, -16, -228, -104, -37, 22, 16, 84, 49, 12, 35, 45, 132, 14, 2, -84, 29, -369, -101, -444, -94, -443, 214, -422, 228, -75, -242, -75, -112, 513, 82, -376, 9, -246, -191, 252, -284, -266, -296, 448, -58, 295, -454, -245, 184, -214, 176, 496, 329, 306, 55, -54, -239, -344, -16, 75, -315, 6, -184, 91, 143, -364, -306, -571, -86, 39, -242, -353, 350, 17, 360, 350, -40, -50, -139, 202, 178, 25, 90, -29, -14, 171, -41, -200, -150, -252, -208, -78, -6, -34, -314, -184, 108, 24, -109, + 137, -24, 8, 219, 178, 119, 46, 142, 21, 8, 65, 50, -622, -114, 61, -63, 6, 165, -134, 146, 149, -105, 199, -275, 343, 226, 17, -253, 25, 159, -728, 147, 305, -531, 222, -275, -380, -357, 184, -93, -542, 289, 163, -337, -549, 107, 71, -180, -35, -290, 273, 216, 395, -317, 56, -420, -151, 66, -259, 105, -27, -214, -307, -343, 500, -339, -152, -131, 26, 221, 140, 160, 7, 188, -60, 25, -77, -211, 46, 433, 74, 4, 4, -288, 189, 289, 314, 56, 29, -19, -19, 39, 12, -146, 3, 22, + 26, -4, 9, 103, -32, 8, -22, 0, 196, -417, -222, -440, 125, -78, 174, -120, 83, 145, -148, -251, 375, -98, -167, 436, -90, -101, 498, -288, 73, 123, 39, -439, 1, -64, -264, 152, -208, 280, -49, 312, -341, 212, -603, 7, -329, 368, -57, 51, -63, -334, -24, 292, 769, 58, 48, 164, 263, -44, -74, 25, -13, 677, -61, 105, 272, -263, -451, 2, -476, -58, -245, -174, -96, -200, 113, 169, -277, 351, 291, -41, -72, -285, 200, 72, 190, -159, 78, -30, 143, 18, 139, -69, 102, -16, 3, 35, + 157, 77, 48, -51, 4, 16, 726, 789, 7, -244, -194, 660, -434, -497, 517, -470, 302, 90, 418, 383, 260, 40, -263, -229, 542, -232, -23, 131, 462, 667, -20, 455, -374, -392, 44, -146, 216, 135, -333, 44, 212, 548, 188, 223, 207, 244, 63, -21, 349, 60, 279, 445, 93, -186, -156, 401, 106, 824, 193, 324, -337, -532, -51, -620, -396, -143, -211, 21, -31, 3, 9, -464, -383, -204, -395, 142, 157, -122, -31, -369, -58, 106, -105, -34, 38, -234, 97, -73, 28, 39, 1, 14, 50, -57, 9, 52, + -2, 11, 16, -345, -1213, -501, -990, -222, -346, -140, 90, -325, -393, -629, -500, 447, -79, -400, -425, 96, -565, -798, 132, -186, -171, -171, 154, -476, 501, -291, 340, -237, -227, 6, 275, -388, -370, 199, -70, 548, -240, 314, 472, 225, -172, -78, -49, 387, -136, 260, 523, -439, -766, -301, 260, 319, -361, 595, -191, -215, -71, -65, -184, -481, -203, -497, -476, -295, 352, 83, -84, 33, 544, 511, 37, -236, 98, -53, 225, 71, -97, -224, -20, -44, -357, -92, 137, 372, -165, 1, 142, -207, -6, -14, 7, -108, + 140, 9, 37, -16, 22 } }; -const Word32 CRendBin_FOA_HRIR_coeff_re_48kHz_fx[4][BINAURAL_CHANNELS][240] ={ -{ - { - 518734336, - 393704608, 199261792, 7454990, -137047568, -230714912, -291816192, -333582048, -354289696, -345745408, -304985632, - -237554112, -153483344, -62846108, 25924960, 106383656, 174758464, 230512512, 275441632, 311386208, 338533632, - 356124736, 364643264, 366513184, 364196576, 358214784, 347733440, 332698912, 314550528, 294970304, 274820448, - 254486480, 234499840, 215327648, 196919952, 178905792, 161172400, 144017232, 127764536, 112381576, 97512400, - 82796232, 68108520, 53500796, 39045548, 24810416, 10904385, -2594697, -15731928, -28598576, -41189812, - -53421876, -65249144, -76661408, -87611968, -98029944, -107895488, -117252608, -126151776, -134618768, -142656800, - -150280912, -157536720, -164452144, -170977824, -177055200, -182730992, -188127088, -193307888, -198289520, -203156784, - -208030496, -212934816, -217845040, -222834720, -228031632, -233469584, -239137344, -245106272, -251453696, -258109824, - -264947408, -271934240, -279045632, -286107648, -292885632, -299275456, -305308832, -311048512, -316541760, -321774112, - -326614016, -330890720, -334563456, -337721856, -340449696, -342790464, -344823072, -346637152, -348259584, -349701056, - -351036256, -352379520, -353825856, -355444512, -357255904, -359210656, -361293728, -363633408, -366375200, -369470816, - -372702752, -375887488, -378943904, -381830656, -384545056, -387131712, -389604544, -391920064, -394076672, -396146304, - -398176224, -400158336, -402088928, -403956160, -405682208, -407207456, -408578080, -409852096, -410993472, -411950176, - -412744736, -413410464, -413956992, -414451456, -415008736, -415649760, -416303648, -416950048, -417620608, -418300832, - -418970304, -419683264, -420468160, -421242336, -421935968, -422575936, -423158976, -423617472, -423979296, -424366944, - -424799104, -425193696, -425563072, -425980224, -426386112, -426662048, -426816128, -426899360, -426870880, -426727008, - -426590112, -426518176, -426442464, -426383424, -426451584, -426590112, -426624480, -426572384, -426569696, -426569696, - -426460736, -426345312, -426347456, -426357632, -426271744, -426204640, -426201408, -426114976, -425975392, -426027456, - -426272832, -426502048, -426786592, -427343328, -428008000, -428506208, -429004960, -429715776, -430357344, -430720256, - -431144384, -431780032, -432186464, -432283616, -432612192, -433128128, -433130816, -432782368, -432935392, -433196320, - -432360928, -430898496, -430319200, -430133984, -428731680, -427129664, -427792160, -429743168, -429505312, -426881632, - -424250976, -419948480, -409561088, -395892384, -390180064, -398706656, -413332608, -420260928, -415048448, -404883360, - -398317408, -396604800, -395113920, -391861536, -393665952, -410828640, -443115008, -474512832, -487703744, -482296384, - -472652032, -468896064, -468109568, -465181472, -462957760, -466247168, -472453920, -475371264, -474698048, }, - { - 518734336, - 393704608, 199261792, 7454990, -137047568, -230714912, -291816192, -333582048, -354289696, -345745408, -304985632, - -237554112, -153483344, -62846108, 25924960, 106383656, 174758464, 230512512, 275441632, 311386208, 338533632, - 356124736, 364643264, 366513184, 364196576, 358214784, 347733440, 332698912, 314550528, 294970304, 274820448, - 254486480, 234499840, 215327648, 196919952, 178905792, 161172400, 144017232, 127764536, 112381576, 97512400, - 82796232, 68108520, 53500796, 39045548, 24810416, 10904385, -2594697, -15731928, -28598576, -41189812, - -53421876, -65249144, -76661408, -87611968, -98029944, -107895488, -117252608, -126151776, -134618768, -142656800, - -150280912, -157536720, -164452144, -170977824, -177055200, -182730992, -188127088, -193307888, -198289520, -203156784, - -208030496, -212934816, -217845040, -222834720, -228031632, -233469584, -239137344, -245106272, -251453696, -258109824, - -264947408, -271934240, -279045632, -286107648, -292885632, -299275456, -305308832, -311048512, -316541760, -321774112, - -326614016, -330890720, -334563456, -337721856, -340449696, -342790464, -344823072, -346637152, -348259584, -349701056, - -351036256, -352379520, -353825856, -355444512, -357255904, -359210656, -361293728, -363633408, -366375200, -369470816, - -372702752, -375887488, -378943904, -381830656, -384545056, -387131712, -389604544, -391920064, -394076672, -396146304, - -398176224, -400158336, -402088928, -403956160, -405682208, -407207456, -408578080, -409852096, -410993472, -411950176, - -412744736, -413410464, -413956992, -414451456, -415008736, -415649760, -416303648, -416950048, -417620608, -418300832, - -418970304, -419683264, -420468160, -421242336, -421935968, -422575936, -423158976, -423617472, -423979296, -424366944, - -424799104, -425193696, -425563072, -425980224, -426386112, -426662048, -426816128, -426899360, -426870880, -426727008, - -426590112, -426518176, -426442464, -426383424, -426451584, -426590112, -426624480, -426572384, -426569696, -426569696, - -426460736, -426345312, -426347456, -426357632, -426271744, -426204640, -426201408, -426114976, -425975392, -426027456, - -426272832, -426502048, -426786592, -427343328, -428008000, -428506208, -429004960, -429715776, -430357344, -430720256, - -431144384, -431780032, -432186464, -432283616, -432612192, -433128128, -433130816, -432782368, -432935392, -433196320, - -432360928, -430898496, -430319200, -430133984, -428731680, -427129664, -427792160, -429743168, -429505312, -426881632, - -424250976, -419948480, -409561088, -395892384, -390180064, -398706656, -413332608, -420260928, -415048448, -404883360, - -398317408, -396604800, -395113920, -391861536, -393665952, -410828640, -443115008, -474512832, -487703744, -482296384, - -472652032, -468896064, -468109568, -465181472, -462957760, -466247168, -472453920, -475371264, -474698048, }, - }, - { - { - 37328636, - 189374768, 383476160, 475285376, 383028416, 133840848, -171073376, -432745888, -603796160, -683916096, -690635008, - -641510272, -552180864, -436797088, -306463104, -169717248, -34593816, 91378648, 202743392, 296894976, 374149632, - 437277600, 489349248, 531198880, 561826816, 581349568, 592261504, 597636096, 599314368, 598031232, 594031552, - 587127936, 577005760, 563930304, 548784640, 532358496, 514886592, 496108448, 475500672, 452722304, 428125568, - 402665536, 377180800, 352018208, 327308192, 303174240, 279620640, 256611408, 234338784, 213113056, 192994352, - 173741088, 155053152, 136726528, 118736520, 101311840, 84780504, 69293928, 54891828, 41746544, 30001958, - 19447076, 9730248, 790811, -7295002, -14765024, -22013318, -29103772, -35866736, -42364484, -48842368, - -55338508, -61733712, -68128920, -74811888, -81897512, -89285928, -96952984, -105030744, -113582560, -122484952, - -131581152, -140860432, -150426928, -160311264, -170375984, -180435872, -190413088, -200370432, -210518896, -221234832, - -232860784, -245344096, -258222016, -271105856, -283991296, -296971232, -309841088, -322147776, -333463936, -343533504, - -352343008, -360091680, -366892736, -372482656, -376434560, -378663104, -379509216, -379385728, -378569152, -377280672, - -375758624, -374254848, -373029728, -372255552, -371887264, -371805120, -372115424, -373099520, -374873888, -377288192, - -380094400, -382999936, -385673568, -387967072, -390036704, -392070400, -394039616, -395879488, -397664032, -399435168, - -401066208, -402452384, -403620640, -404609536, -405454592, -406308736, -407351328, -408589888, -409931008, -411351552, - -412853184, -414413888, -416115744, -418142976, -420566432, -423312512, -426339392, -429601952, -432933248, -436230176, - -439630176, -443259968, -447025024, -450868480, -454913280, -459126624, -463203648, -466963872, -470473408, -473698400, - -476477216, -478859872, -481021312, -482905728, -484371392, -485500416, -486368000, -486850656, -486995072, -487141088, - -487406848, -487615168, -487850304, -488395776, -489068448, -489370720, -489218784, -488805920, -488051104, -486929568, - -485842944, -484988256, -484049792, -483024384, -482375296, -482025248, -481413216, -480660000, -480307264, -480132256, - -479703296, -479427328, -479558880, -479476192, -479256064, -479838592, -480622400, -480185920, -479861120, -481702592, - -483188640, -481178592, -480039360, -485045696, -488822048, -479682880, -464048672, -461323520, -473385376, -481892096, - -481580192, -489001888, -506634336, -507556160, -475460384, -435317472, -421685248, -435285280, -450985536, -452022752, - -439289248, -422705856, -415015712, -414360736, -386421952, -295605952, -168432512, -90038080, -111629424, -189907888, - -245691456, -256092800, -255994016, -268771552, -274996032, -247346624, -187443104, -122430728, -81640352, }, - { - -37328636, - -189374768, -383476160, -475285376, -383028416, -133840848, 171073376, 432745888, 603796160, 683916096, 690635008, - 641510272, 552180864, 436797088, 306463104, 169717248, 34593816, -91378648, -202743392, -296894976, -374149632, - -437277600, -489349248, -531198880, -561826816, -581349568, -592261504, -597636096, -599314368, -598031232, -594031552, - -587127936, -577005760, -563930304, -548784640, -532358496, -514886592, -496108448, -475500672, -452722304, -428125568, - -402665536, -377180800, -352018208, -327308192, -303174240, -279620640, -256611408, -234338784, -213113056, -192994352, - -173741088, -155053152, -136726528, -118736520, -101311840, -84780504, -69293928, -54891828, -41746544, -30001958, - -19447076, -9730248, -790811, 7295002, 14765024, 22013318, 29103772, 35866736, 42364484, 48842368, - 55338508, 61733712, 68128920, 74811888, 81897512, 89285928, 96952984, 105030744, 113582560, 122484952, - 131581152, 140860432, 150426928, 160311264, 170375984, 180435872, 190413088, 200370432, 210518896, 221234832, - 232860784, 245344096, 258222016, 271105856, 283991296, 296971232, 309841088, 322147776, 333463936, 343533504, - 352343008, 360091680, 366892736, 372482656, 376434560, 378663104, 379509216, 379385728, 378569152, 377280672, - 375758624, 374254848, 373029728, 372255552, 371887264, 371805120, 372115424, 373099520, 374873888, 377288192, - 380094400, 382999936, 385673568, 387967072, 390036704, 392070400, 394039616, 395879488, 397664032, 399435168, - 401066208, 402452384, 403620640, 404609536, 405454592, 406308736, 407351328, 408589888, 409931008, 411351552, - 412853184, 414413888, 416115744, 418142976, 420566432, 423312512, 426339392, 429601952, 432933248, 436230176, - 439630176, 443259968, 447025024, 450868480, 454913280, 459126624, 463203648, 466963872, 470473408, 473698400, - 476477216, 478859872, 481021312, 482905728, 484371392, 485500416, 486368000, 486850656, 486995072, 487141088, - 487406848, 487615168, 487850304, 488395776, 489068448, 489370720, 489218784, 488805920, 488051104, 486929568, - 485842944, 484988256, 484049792, 483024384, 482375296, 482025248, 481413216, 480660000, 480307264, 480132256, - 479703296, 479427328, 479558880, 479476192, 479256064, 479838592, 480622400, 480185920, 479861120, 481702592, - 483188640, 481178592, 480039360, 485045696, 488822048, 479682880, 464048672, 461323520, 473385376, 481892096, - 481580192, 489001888, 506634336, 507556160, 475460384, 435317472, 421685248, 435285280, 450985536, 452022752, - 439289248, 422705856, 415015712, 414360736, 386421952, 295605952, 168432512, 90038080, 111629424, 189907888, - 245691456, 256092800, 255994016, 268771552, 274996032, 247346624, 187443104, 122430728, 81640352, }, - }, - { - { - 60022168, - 49746996, 10565083, -45541684, -70657584, -40651864, 11245835, 38012608, 30652644, 9220221, -13295071, - -34076808, -43962748, -34187940, -14217952, -2735357, -2489471, 1039919, 17454748, 41131828, 62984084, - 80743776, 94916632, 103083512, 102638448, 95371360, 86412056, 79781168, 75625248, 70895952, 62644244, - 50934016, 38225208, 26533234, 16660715, 9768903, 7541963, 10284299, 16239808, 23172960, 29753922, - 35461936, 40116604, 43666932, 45964204, 46811924, 46316392, 44748728, 41918880, 37129456, 29789894, - 19681688, 6796249, -8666707, -26332444, -45959372, -67415952, -90271088, -113905216, -138052064, -162602624, - -186969056, -210371264, -232554224, -253434208, -272316480, -288309344, -301175456, -310986240, -317375008, -319892384, - -318597984, -313612064, -304732768, -292141536, -276765536, -259301664, -239675824, -218124752, -196026608, -174841680, - -154810480, -135496560, -117300392, -101607648, -89267136, -79482128, -70801464, -63117764, -57910116, -56150792, - -56747792, -57774288, -58577984, -59801516, -61881888, -64522756, -67282808, -69747584, -71321688, -71554696, - -70534640, -68598680, -65859564, -62138512, -56994752, -49916108, -40994924, -31270046, -21858700, -12998182, - -4407174, 3896609, 11694659, 18927920, 25387014, 30523796, 33960844, 35690640, 35647156, 33712808, - 30168924, 25445534, 19543712, 12341589, 4201552, -4342212, -13083007, -21811454, -30077120, -37672232, - -44685912, -50859392, -55713780, -59406376, -62608812, -65666828, -68755984, -72400800, -76803144, -81170584, - -84679576, -87438016, -89740120, -91313152, -92022360, -92261264, -92120608, -91264832, -89894736, -88617520, - -87414936, -85963232, -84606560, -83760992, -82992728, -81849728, -80668616, -79576616, -77946144, -75635984, - -73285024, -70879848, -67727880, -63979980, -60372744, -56759068, -52786220, -49230524, -46776488, -44691820, - -42433204, -40787156, -39968964, -38850128, -37123548, -35539780, -33543158, -29846802, -25129316, -20710870, - -15674483, -8952322, -2120640, 3613678, 9954660, 17568564, 24113558, 29132764, 35056596, 41430864, - 45571212, 49248780, 55470576, 60667488, 61601644, 64684892, 73870752, 78956528, 74776456, 76883672, - 92792232, 99237368, 84040696, 83722336, 126914136, 165098000, 129345624, 42492260, -3980361, 17639430, - 46632072, 49243948, 66058744, 115501336, 138135808, 87157768, 7816304, -27060978, -12878459, 3414499, - -471910, -5507222, 11730093, 54191748, 98788544, 103766408, 48269528, -26941256, -51353312, -8629126, - 44756780, 56989920, 40558988, 35066260, 45074072, 45548128, 27823872, 8046085, -1290101, }, - { - 60022168, - 49746996, 10565083, -45541684, -70657584, -40651864, 11245835, 38012608, 30652644, 9220221, -13295071, - -34076808, -43962748, -34187940, -14217952, -2735357, -2489471, 1039919, 17454748, 41131828, 62984084, - 80743776, 94916632, 103083512, 102638448, 95371360, 86412056, 79781168, 75625248, 70895952, 62644244, - 50934016, 38225208, 26533234, 16660715, 9768903, 7541963, 10284299, 16239808, 23172960, 29753922, - 35461936, 40116604, 43666932, 45964204, 46811924, 46316392, 44748728, 41918880, 37129456, 29789894, - 19681688, 6796249, -8666707, -26332444, -45959372, -67415952, -90271088, -113905216, -138052064, -162602624, - -186969056, -210371264, -232554224, -253434208, -272316480, -288309344, -301175456, -310986240, -317375008, -319892384, - -318597984, -313612064, -304732768, -292141536, -276765536, -259301664, -239675824, -218124752, -196026608, -174841680, - -154810480, -135496560, -117300392, -101607648, -89267136, -79482128, -70801464, -63117764, -57910116, -56150792, - -56747792, -57774288, -58577984, -59801516, -61881888, -64522756, -67282808, -69747584, -71321688, -71554696, - -70534640, -68598680, -65859564, -62138512, -56994752, -49916108, -40994924, -31270046, -21858700, -12998182, - -4407174, 3896609, 11694659, 18927920, 25387014, 30523796, 33960844, 35690640, 35647156, 33712808, - 30168924, 25445534, 19543712, 12341589, 4201552, -4342212, -13083007, -21811454, -30077120, -37672232, - -44685912, -50859392, -55713780, -59406376, -62608812, -65666828, -68755984, -72400800, -76803144, -81170584, - -84679576, -87438016, -89740120, -91313152, -92022360, -92261264, -92120608, -91264832, -89894736, -88617520, - -87414936, -85963232, -84606560, -83760992, -82992728, -81849728, -80668616, -79576616, -77946144, -75635984, - -73285024, -70879848, -67727880, -63979980, -60372744, -56759068, -52786220, -49230524, -46776488, -44691820, - -42433204, -40787156, -39968964, -38850128, -37123548, -35539780, -33543158, -29846802, -25129316, -20710870, - -15674483, -8952322, -2120640, 3613678, 9954660, 17568564, 24113558, 29132764, 35056596, 41430864, - 45571212, 49248780, 55470576, 60667488, 61601644, 64684892, 73870752, 78956528, 74776456, 76883672, - 92792232, 99237368, 84040696, 83722336, 126914136, 165098000, 129345624, 42492260, -3980361, 17639430, - 46632072, 49243948, 66058744, 115501336, 138135808, 87157768, 7816304, -27060978, -12878459, 3414499, - -471910, -5507222, 11730093, 54191748, 98788544, 103766408, 48269528, -26941256, -51353312, -8629126, - 44756780, 56989920, 40558988, 35066260, 45074072, 45548128, 27823872, 8046085, -1290101, }, - }, - { - { - 31920734, - 46136540, 45763412, 14942728, -23592256, -34102576, -10480257, 17888538, 19763828, -8626442, -47391744, - -75476000, -85082768, -81128712, -73625400, -69166152, -65736620, -55586004, -33918432, -3300146, 30547418, - 63887640, 94476392, 119725968, 138947024, 155736592, 174775104, 196526960, 217297424, 234043504, 246777552, - 256118032, 260794704, 258744400, 249421104, 233813184, 212831728, 186947584, 157384784, 126632816, 97257384, - 70578120, 46705084, 25389162, 6402186, -10662256, -26432302, -41385768, -55461448, -68065568, -78422344, - -85960552, -90507848, -92429304, -92740152, -92838936, -93768800, -95774016, -98702104, -102485432, -106901736, - -111312664, -115221624, -118802552, -122387240, -125823216, -128891968, -131853888, -134915120, -137633840, -139581600, - -141094512, -142585392, -143600080, -143395536, -141987856, -139721728, -136213808, -130733976, -123400312, -115025128, - -105831216, -95274184, -83281024, -70845488, -59068148, -48165912, -37769944, -27663884, -17735530, -7606924, - 2993055, 13587666, 23325430, 32034550, 40264780, 48121352, 54684060, 58984932, 61139396, 62108448, - 62512712, 61899068, 59082644, 53230216, 44786844, 35209068, 25565792, 15585899, 4358855, -8272107, - -21323976, -33465312, -43962212, -53104588, -61926448, -71250288, -80840408, -89663344, -96920768, -102593344, - -107195408, -111458160, -116062368, -121186264, -126389080, -131220912, -135749952, -140284368, -144986288, -150000656, - -155531504, -161549824, -167774848, -174053008, -180381648, -186606128, -192506880, -198077984, -203331808, -208018688, - -211882016, -214886880, -216935040, -217763424, -217331248, -215891360, -213601072, -210547344, -207094736, -203652848, - -200254464, -196862512, -193756720, -191131952, -188817504, -186823024, -185553856, -185114704, -185130800, -185469568, - -186309232, -187417872, -188285456, -188920048, -189658784, -190536560, -191623728, -193379296, -195891312, -198575664, - -201206864, -204152688, -207264928, -209902032, -212141856, -214416048, -216199520, -216748752, -216459376, -215771648, - -213953792, -210683184, -207064128, -203521328, -199073344, -193881264, -189422016, -185501248, -180827248, -176279952, - -173140336, -169690400, -164839232, -161581504, -160694592, -157216208, -150669600, -148856048, -152050976, -148304688, - -137272528, -137371840, -149848720, -143919520, -108989088, -91152088, -131908112, -196136656, -217179856, -194179232, - -179810416, -184189136, -167261600, -129284960, -128454952, -186015568, -244544160, -253234496, -235377088, -235451184, - -251041376, -256067024, -247692912, -230110384, -189109552, -125137632, -82403776, -100727184, -155899264, -188265600, - -180487408, -169009648, -181035552, -197899744, -193123744, -179249920, -193284272, -243472032, -290958272, }, - { - 31920734, - 46136540, 45763412, 14942728, -23592256, -34102576, -10480257, 17888538, 19763828, -8626442, -47391744, - -75476000, -85082768, -81128712, -73625400, -69166152, -65736620, -55586004, -33918432, -3300146, 30547418, - 63887640, 94476392, 119725968, 138947024, 155736592, 174775104, 196526960, 217297424, 234043504, 246777552, - 256118032, 260794704, 258744400, 249421104, 233813184, 212831728, 186947584, 157384784, 126632816, 97257384, - 70578120, 46705084, 25389162, 6402186, -10662256, -26432302, -41385768, -55461448, -68065568, -78422344, - -85960552, -90507848, -92429304, -92740152, -92838936, -93768800, -95774016, -98702104, -102485432, -106901736, - -111312664, -115221624, -118802552, -122387240, -125823216, -128891968, -131853888, -134915120, -137633840, -139581600, - -141094512, -142585392, -143600080, -143395536, -141987856, -139721728, -136213808, -130733976, -123400312, -115025128, - -105831216, -95274184, -83281024, -70845488, -59068148, -48165912, -37769944, -27663884, -17735530, -7606924, - 2993055, 13587666, 23325430, 32034550, 40264780, 48121352, 54684060, 58984932, 61139396, 62108448, - 62512712, 61899068, 59082644, 53230216, 44786844, 35209068, 25565792, 15585899, 4358855, -8272107, - -21323976, -33465312, -43962212, -53104588, -61926448, -71250288, -80840408, -89663344, -96920768, -102593344, - -107195408, -111458160, -116062368, -121186264, -126389080, -131220912, -135749952, -140284368, -144986288, -150000656, - -155531504, -161549824, -167774848, -174053008, -180381648, -186606128, -192506880, -198077984, -203331808, -208018688, - -211882016, -214886880, -216935040, -217763424, -217331248, -215891360, -213601072, -210547344, -207094736, -203652848, - -200254464, -196862512, -193756720, -191131952, -188817504, -186823024, -185553856, -185114704, -185130800, -185469568, - -186309232, -187417872, -188285456, -188920048, -189658784, -190536560, -191623728, -193379296, -195891312, -198575664, - -201206864, -204152688, -207264928, -209902032, -212141856, -214416048, -216199520, -216748752, -216459376, -215771648, - -213953792, -210683184, -207064128, -203521328, -199073344, -193881264, -189422016, -185501248, -180827248, -176279952, - -173140336, -169690400, -164839232, -161581504, -160694592, -157216208, -150669600, -148856048, -152050976, -148304688, - -137272528, -137371840, -149848720, -143919520, -108989088, -91152088, -131908112, -196136656, -217179856, -194179232, - -179810416, -184189136, -167261600, -129284960, -128454952, -186015568, -244544160, -253234496, -235377088, -235451184, - -251041376, -256067024, -247692912, -230110384, -189109552, -125137632, -82403776, -100727184, -155899264, -188265600, - -180487408, -169009648, -181035552, -197899744, -193123744, -179249920, -193284272, -243472032, -290958272, }, + +/* Sample Rate = 32000 */ + +const Word16 CRendBin_Combined_BRIR_max_num_iterations_32kHz = 22; +const Word16 CRendBin_Combined_BRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]={{22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22} }; +const Word16 CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {40, 40}; +const Word16 CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]={{{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 136, 134, 129, 128, 160},{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 136, 134, 129, 128, 160}},{{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 138, 132, 131, 128, 160},{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 138, 132, 131, 128, 160}},{{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 127, 160},{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 127, 160}},{{102, 116, 116, 121, 116, 114, 115, 121, 125, 122, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 124, 160},{102, 116, 116, 121, 116, 114, 115, 121, 125, 122, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 124, 160}},{{115, 115, 115, 119, 121, 119, 124, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 139, 146, 127, 131, 160},{115, 115, 115, 119, 121, 119, 124, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 139, 146, 127, 131, 160}},{{112, 106, 118, 121, 115, 117, 128, 123, 128, 125, 130, 129, 131, 131, 130, 134, 133, 148, 130, 132, 126, 160},{112, 106, 118, 121, 115, 117, 128, 123, 128, 125, 130, 129, 131, 131, 130, 134, 133, 148, 130, 132, 126, 160}},{{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 123, 133, 130, 129, 134, 134, 135, 127, 120, 160},{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 123, 133, 130, 129, 134, 134, 135, 127, 120, 160}},{{110, 113, 123, 113, 121, 120, 120, 125, 131, 122, 127, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160},{110, 113, 123, 113, 121, 120, 120, 125, 131, 122, 127, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160}},{{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 126, 136, 128, 126, 127, 132, 132, 129, 125, 121, 160},{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 126, 136, 128, 126, 127, 132, 132, 129, 125, 121, 160}},{{99, 100, 111, 117, 114, 113, 118, 116, 121, 123, 124, 121, 125, 130, 127, 132, 132, 129, 133, 128, 131, 160},{99, 100, 111, 117, 114, 113, 118, 116, 121, 123, 124, 121, 125, 130, 127, 132, 132, 129, 133, 128, 131, 160}},{{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 135, 127, 129, 160},{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 135, 127, 129, 160}},{{105, 100, 112, 114, 115, 108, 116, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 138, 154, 116, 160},{105, 100, 112, 114, 115, 108, 116, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 138, 154, 116, 160}},{{110, 106, 113, 110, 122, 116, 118, 125, 123, 127, 125, 127, 128, 127, 133, 129, 132, 132, 142, 147, 127, 160},{110, 106, 113, 110, 122, 116, 118, 125, 123, 127, 125, 127, 128, 127, 133, 129, 132, 132, 142, 147, 127, 160}},{{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 134, 126, 160},{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 134, 126, 160}},{{110, 117, 106, 118, 118, 115, 121, 124, 128, 125, 122, 121, 126, 130, 124, 130, 133, 131, 137, 133, 131, 160},{110, 117, 106, 118, 118, 115, 121, 124, 128, 125, 122, 121, 126, 130, 124, 130, 133, 131, 137, 133, 131, 160}}}; +const Word16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz = 97; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_Q_32kHz_fx = 15; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{7346, 7453, 7924, 6788, 7148, 7306, 7607, 8132, 8167, 8572, 8072, 9147, 9365, 8603, 8909},{7346, 7453, 7924, 6788, 7148, 7306, 7607, 8132, 8167, 8572, 8072, 9147, 9365, 8603, 8909}}; +const Word16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]={{47, 47, 47, 47, 47, 47, 50, 50, 56, 56, 56, 62, 62, 63, 63, 63, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 93, 93, 93, 93, 93, 97},{47, 47, 47, 47, 47, 47, 50, 50, 56, 56, 56, 62, 62, 63, 63, 63, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 93, 93, 93, 93, 93, 97}}; +const Word16 CRendBin_Combined_BRIR_coeff_Q_32kHz_fx = 14; +const Word16 CRendBin_Combined_BRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2818]={ + { + {-149, 153, -57, 0, 143, -82, 56, -11, 20, -98, -204, -42, 80, -52, 49, 71, 60, -45, 34, -126, -23, 31, 52, -4, -3, 16, 31, -106, -88, 37, 73, -37, 76, 146, -196, 28, -94, -64, 44, -24, 121, -37, 109, 57, 18, -8, 58, 3, -12, -61, 176, -122, -37, 62, 68, -3, -60, 34, -66, 68, 13, 25, -1, -23, -22, 91, -235, 55, -30, -136, -23, 115, 56, 71, -103, 83, -36, 52, 32, 40, -43, 17, 62, -41, -92, 37, -85, 16, 63, 0, -31, -36, 17, 33, -14, 40, + 2, 29, 25, -11, -6, 11, -13, -8, -10, 11, -18, 9, -27, -7, -25, -4, -8, -29, -6, -273, 212, -102, 47, 39, 6, -59, -5, -154, -191, 52, -37, 60, 60, 172, -141, 20, 118, 113, -114, -122, -64, -106, 10, -36, -82, -64, 1, -194, -184, -39, 37, -17, 16, -22, 43, -102, 118, -42, 67, -15, 48, -93, 32, 64, 78, 33, 16, 28, -33, -77, 157, 118, 50, -59, 195, 131, -54, 123, -9, -97, -23, -35, -85, 56, 65, 31, -65, 137, -90, 80, 117, -23, 13, -171, -75, -184, + 28, 87, -87, -27, 35, -83, -22, 40, -4, 29, -18, -45, -120, -60, -21, -29, -9, -3, 8, -15, -19, -45, -19, 1, 11, 9, -23, -5, 0, 6, -4, 6, -1, 12, -1, -22, -35, -38, -3, -23, 8, 230, 106, -87, 40, 31, 366, -107, 106, 179, -34, 163, 67, 111, -144, -53, -169, -78, 115, -2, -80, 20, -118, -8, -77, 110, -47, -14, -42, 59, 26, 2, -13, 48, -178, -137, 62, 17, -17, -90, 213, 62, -27, 71, 85, 1, 42, 21, -105, 96, -125, -94, 113, -133, 116, 53, + -101, 175, 94, 68, -47, 158, 37, -20, -46, 49, 18, -26, -186, -26, -36, 58, -109, 148, -51, 122, -126, 5, -14, 151, -70, -48, 27, 57, -2, 31, -23, -137, -16, -9, -8, -18, -3, 2, -19, -25, -29, -31, 2, -12, 0, 20, -24, 16, 18, 42, -50, 33, 14, 26, -3, 39, 14, -17, -30, -8, -15, 382, -317, -278, -89, 292, -41, -158, 200, -133, 95, -7, -218, -148, 184, -119, 91, -124, 122, -54, -33, -14, -120, 64, 88, -120, 30, -61, 25, 55, -17, 79, 24, 65, 103, -131, + -96, 119, 7, 93, 91, -83, -124, -49, 22, 164, -176, 74, -197, -240, -56, -137, -22, -162, -309, -164, 145, 135, 88, -102, 297, -91, 51, -163, -154, 42, 1, -14, -195, -63, -10, -39, -37, -105, -84, 23, -26, -57, 7, -101, 19, 59, 102, 57, -85, 91, -58, -5, 102, 44, 16, -32, 53, 60, 47, 11, -25, 10, 73, 38, 47, 21, -26, 39, 8, -4, 12, -20, 8, 11, -20, 40, 60, 70, -4, -4, 11, -44, 65, -3, 41, 489, -160, 229, -61, 307, -60, -48, 52, 62, -52, -354, + 35, -35, -94, -6, -17, 125, -40, 300, -39, 33, -21, 169, -33, 58, -140, -6, -96, -102, -28, -30, 2, 108, -193, -59, 66, -24, 134, 29, -33, -90, -88, -96, -176, 65, 76, 64, -308, -47, 218, 120, -49, -12, -95, -214, -224, 222, -68, -152, -83, 119, 97, 9, 109, 43, 106, -54, -219, -77, -99, -114, 162, 105, -18, 178, 270, -66, 115, -106, -13, 0, 118, -11, 30, 25, 37, 91, -92, 71, -48, 6, -59, 8, 31, 65, 48, -3, 18, 3, -7, 33, -87, -14, -70, 15, -12, -13, + -30, -20, -36, 38, 19, -733, 401, 145, -35, -34, 1, -113, -205, -46, 98, 309, 207, -284, -55, -170, 114, -16, -383, -114, 233, 143, 79, 197, 119, -22, -26, 57, -146, -87, 32, 172, -74, -147, -212, -107, 104, 340, 23, -61, 71, -72, -254, 18, -180, -142, -168, 103, -11, -239, 43, 89, 92, -258, -143, -97, -65, -29, -96, -47, -124, -250, -30, -213, -255, -159, -46, 42, -152, -225, 65, 178, -10, -34, -22, 129, -196, 144, 229, 222, 175, 300, 3, -125, 80, 12, -33, -29, -1, -70, 98, 4, + 7, -62, -18, 31, 37, -37, -33, 18, 102, -15, 38, 33, 87, -73, 4, -3, -80, 11, 10, 66, 7, 13, 57, 35, -99, 36, -36, -303, 114, -150, -26, 39, 89, -13, 156, 4, -32, -425, 197, -79, -91, 152, -247, -339, 138, -119, -159, -50, 306, 192, -112, -66, 142, -42, -15, 41, 139, 254, 162, 206, -32, -9, 5, -136, 34, -57, 347, -265, -154, -140, -132, 83, 47, 124, -21, -175, -235, -68, -292, -407, -82, 11, 316, 62, -251, -64, 237, -101, 79, 71, 133, -188, -283, -125, -144, 456, + 50, -146, 99, 76, -34, 57, 104, -13, 202, -268, -241, 78, -111, 243, -113, -6, 130, -40, 115, -7, -6, -8, -40, -4, 104, 38, 101, 57, 50, 3, -38, -17, 42, -13, 12, -21, 72, -60, 42, -54, 73, -70, 6, -7, -8, 52, 68, -73, 51, 28, -25, 107, 263, 84, -20, 182, -32, -223, -40, -18, 223, -123, -28, -66, 38, -67, 15, 74, 106, 153, 101, 50, 390, 155, 129, -14, -304, 22, -253, 80, -171, 44, 2, 101, 479, 138, -73, 174, -133, 148, -82, 251, -135, 1, -186, 116, + 191, -220, 451, -108, 35, -67, -119, 50, -133, -383, 67, -95, -19, -236, 58, -82, -394, -177, -108, -348, 201, 506, 614, -581, -443, -245, 27, 147, -177, 85, -202, 56, 285, 438, -298, 490, 159, 59, 86, 90, -105, 170, 157, 189, 146, 63, 220, 4, 71, -1, 3, 120, -31, -140, -35, 96, 76, 32, 2, -6, -9, 97, 79, 36, -80, 24, 27, 4, 104, 46, 66, 2, 79, 46, 79, 108, 113, 10, 8, -52, 125, 111, -8, -30, 16, 81, 227, -408, 609, 20, 360, 135, -117, -121, 334, -186, + 213, 262, -26, -172, 17, 271, 155, 142, 124, -17, 49, 96, 341, 242, -172, -145, -20, -70, -30, -168, -110, 175, 301, 82, 451, -117, 492, 29, 235, 543, 386, 129, 116, 249, -47, -209, 5, 235, -125, -241, 15, -32, 496, 401, 1, 561, -43, 305, 163, 243, -25, -183, 254, -42, 296, 206, 620, -336, -53, -686, 153, -333, -41, 327, -125, 139, -51, 381, -92, -252, -14, -81, 117, -9, 187, 220, 62, -48, 174, -29, 78, 9, -106, 85, 84, 156, 82, 174, 80, 5, 12, -43, 8, 171, -52, -114, + 76, 0, 30, 142, 36, 42, 61, 97, -22, -7, 64, 117, 178, 168, 5, 85, 7, 2, 81, 122, -401, -294, 145, -237, 137, -143, 40, 370, -63, -348, 94, -146, 355, -372, -261, 153, 171, 261, 8, -25, 167, -101, -256, 160, -106, -202, 59, 200, -148, 376, 150, -12, 47, 185, 78, -637, 259, -64, -70, -109, 337, 4, 359, 17, 29, 42, -99, -37, 173, -203, 46, 583, 48, 429, 30, -85, -50, -285, -601, -433, 194, 277, -122, 460, 192, -324, -194, 422, 294, 281, 81, -125, 0, -19, -262, -76, + -155, -700, -307, -12, 468, 109, -114, 55, 401, -96, 16, 7, 98, -128, -69, -95, -62, -30, 92, 0, -23, -1, 71, 67, 113, -79, -138, 53, -146, -71, 11, 57, 10, -18, 140, -62, -50, -162, 58, -146, 114, 60, 73, -122, 5, -15, 56, -67, 42, -59, 73, -135, -3, -160, 186, 390, 154, 136, 447, 375, 314, 20, 122, 32, -63, -78, 80, -27, -255, 65, 266, 5, -67, 87, -635, 221, -248, 167, 225, 204, -233, 138, -17, 2, 388, 286, 11, 157, 118, -44, -210, 61, 193, 12, 279, 89, + 253, 491, 33, 203, 215, 267, -3, -158, 425, -154, 345, -389, -319, 466, -15, 159, 277, 407, 524, 226, 79, -244, 121, -43, -454, 400, 252, -369, -14, 32, -466, 168, 385, 231, 5, 153, 111, -212, 420, 48, -73, 221, 416, 169, -8, -133, -103, -40, 78, 124, 177, 64, 37, 61, 205, 185, 227, 6, -15, 96, 196, 10, 26, -29, 95, 24, -13, -62, 53, -126, -232, -2, 144, 6, 104, -106, 82, 14, 92, 22, -56, 64, -35, -26, -7, -137, 112, -44, 52, 90, 13, -11, -58, -84, -1065, -663, + 215, 225, 436, 722, -201, -114, -232, -214, -274, -292, 22, 116, 90, 456, 18, 448, -25, 154, 205, 159, 331, 237, 14, 293, -6, -35, -172, 199, -30, -437, -381, 238, -58, 522, 308, 336, 121, -656, 155, 413, -67, 121, -104, 83, 515, -17, 431, 725, 37, -273, -12, 8, -459, 615, 288, -81, -40, 446, 205, -538, -444, 175, -196, 259, 181, 83, -219, -382, -24, 99, 66, 417, -564, 84, -44, -470, -232, -473, 408, -139, 567, -449, 35, -214, 318, 144, -148, -25, 292, 21, 86, -171, -100, -144, 258, 135, + -10, 74, 71, -241, 8, -65, 77, 55, -62, -246, -97, -181, 210, -160, 26, -40, 207, -42, -49, -74, -146, -4, -101, 91, 229, 213, -26, -215, 267, 754, -898, -251, -438, -19, 142, 24, 602, -622, 294, -85, 120, -75, 331, -183, -308, -26, -90, 234, -20, 158, 350, -73, -263, -35, 394, -232, 94, 88, 16, -36, 391, -15, -101, -654, 210, -162, -413, -360, -95, -399, -235, -346, 164, -409, 407, -375, 253, -194, 494, -479, -278, -72, 286, 117, 3, -197, -391, 39, 153, 559, 293, 121, -319, 190, -283, -321, + 279, -311, 148, 362, 303, -81, -115, -263, 437, 42, 418, 675, -132, -355, -158, -119, -243, 106, -403, 175, 132, 120, 319, -226, 12, -42, 81, 289, 9, 227, -82, -7, 29, -131, -46, 136, 73, -187, -242, -116, 107, 94, -106, 344, 102, -254, 128, 183, 460, 372, 210, 76, 45, -195, -151, -8, -153, 27, -89, -284, 156, -96, -39, 31, 154, 1, 502, 695, -729, 541, 378, 21, 273, 923, -256, -262, 90, 274, 385, 129, -357, 410, -147, 816, -19, -131, 265, 217, 214, -6, 765, -631, 157, -8, 212, -261, + -525, 265, 209, 217, -182, -137, 640, 242, 803, 76, -294, -29, 180, -66, 834, -101, 455, -77, 749, 276, 204, -178, -40, 414, 10, 443, 334, 392, -514, 87, 371, 447, 333, 258, 599, 736, -557, -63, 1116, -264, -300, 725, 974, 22, -8, -522, -431, -25, 490, -68, -90, 26, -36, -131, -373, -133, -27, -218, 17, 231, -125, 294, -291, 260, -58, 227, -218, 12, 167, 101, 284, -46, -147, -62, 86, 263, 78, -88, 359, -107, 190, 193, -30, -36, -79, 524, -188, 71, 135, 198, -92, -333, -194, -54, 395, 195, + -28, 28, 142, -21, 6, 144, 76, 40, 5, 307, 689, -41, 216, -586, 561, -297, -182, -513, -332, 1055, 17, -742, -329, -22, 5, -98, 818, 381, -68, -341, -30, 214, -99, 1085, 233, 477, 167, -245, -612, 143, -5, 95, -474, -52, -319, 364, 5, 58, 383, -346, -249, 73, 20, 111, -523, -416, -899, -474, 42, -518, 73, -377, -220, 666, 214, -329, 204, 72, 1, 640, -106, 776, 302, -340, -948, 162, 156, 523, -281, -689, -239, 193, 39, -169, -488, -164, -691, -799, 253, -50, 818, -266, -490, -436, -34, 568, + -25, 205, 374, 275, -120, 180, 258, 77, 264, 246, -173, -33, 368, -79, 57, 336, -59, 196, -248, 91, 205, -125, 125, 105, -230, 307, -290, 143, 166, 241, -54, -182, 344, -54, 257, -369, -166, -274, -213, 22, -174, 126, 28, 46, -351, 491, -551, -36, 829, -182, 243, 83, 107, -784, 645, -68, -628, -370, 325, -97, 161, -8, -262, -197, 110, -198, -48, -15, -908, -241, -610, 130, 213, -10, -270, 103, -130, 350, -804, 49, 137, 454, -351, 423, -346, 267, 70, 328, -526, 155, -262, -562, 359, -455, -908, 128, + -88, 708, -347, 95, 325, 468, 533, 53, -186, -342, 8, 250, 350, -709, 786, -11, -536, -404, -713, 284, 169, 278, 122, 748, -271, 814, -448, 187, -184, -385, -1144, 639, 120, -307, -777, -50, 140, -71, 279, -214, -252, -45, 117, -222, -218, -142, -44, 115, -72, -74, -311, 223, 3, -173, 136, -127, 232, -78, 114, 152, 288, -106, 260, 25, 9, -292, -231, 65, 102, 35, 9, -61, -194, -109, -96, -210, -101, 354, -186, -209, 104, -453, -672, -4, 368, -149, -728, -118, -1063, 512, -1175, 699, -813, -710, 201, 606, + 453, -406, 425, 763, 135, 112, 179, 67, -452, 546, -922, -574, 51, -60, -60, -125, -230, 120, 846, 216, 117, 76, -399, 489, -90, -856, -132, 15, 18, -587, -413, 446, -147, 767, 143, -3, -627, -347, 231, 96, -171, 656, -522, -320, -23, -42, 622, 47, 728, -3, -594, 145, -507, 383, -71, 524, 998, -1538, 523, 209, 282, 578, 145, -707, -163, -67, -126, 356, -720, 65, -188, -106, -495, -270, -749, 80, -46, 74, 208, -308, -54, 361, -223, 68, -123, -373, 174, 221, -258, -31, -408, -27, -591, 210, 149, -77, + 66, -153, 28, 118, -92, -114, 342, 411, -90, 134, 70, 422, 192, -538, 75, 304, -171, 308, 104, 140, 1256, 1086, -309, -418, -23, -824, 483, -45, 183, 66, -416, 1255, -537, -2209, -322, 443, -1487, -253, 467, -1258, 176, 822, -578, 820, -784, 705, 873, -555, 238, -78, 20, -234, -344, -61, 537, -344, -575, -312, -463, -47, -363, -57, 193, -84, 526, -461, -568, 455, -601, -890, -1143, -396, -26, 225, 638, -264, 286, 301, -209, -96, 1050, -691, -26, 721, 223, 567, -141, 208, 798, 413, -43, -95, -492, 204, 803, -744, + 568, -736, 216, 1047, 241, -584, 594, 97, -374, -290, 718, 239, 310, -41, 54, 199, 236, -19, -72, 308, 266, 59, -355, 393, 48, -132, 96, 137, -259, -66, 199, 41, 332, -408, 617, 481, -85, -388, -159, 413, 470, 760, -23, 148, 124, 418, -632, -335, 635, 399, 43, -101, 54, 177, -332, -258, -223, 48, 200, -359, -257, 1102, 747, -1064, -215, 949, -290, -589, -416, -591, -349, 959, 585, -78, 435, -106, 531, -335, -186, 1065, -444, 191, -309, -117, -12, 290, 867, 333, -587, -174, -27, -90, 488, 64, 872, -259, + 151, -92, 255, -734, 440, -677, 457, -38, 671, -177, 498, -231, 157, 284, -290, 294, 678, 844, -448, 864, 364, 1026, -295, 191, -38, -129, -197, -74, -340, -1688, -1061, -329, -21, 236, 119, 387, 635, -931, -53, -378, 1405, -101, -428, -125, -1234, -1035, 1552, 628, 346, -243, 485, 37, -1128, 227, 76, -433, -441, 67, 5, 116, -237, -124, -554, -472, 197, 242, 213, 161, -289, -427, -259, -552, 345, 113, -974, -120, -284, -72, 473, -453, -630, -144, 404, 131, -439, 254, 559, -1051, -284, 366, -22, -87, -203, -50, 179, 305, + 70, 838, -1205, 1140, -329, -337, 296, 533, -944, -187, 20, 192, 54, -24, 478, -285, 64, 253, 280, 399, 331, 113, -517, -102, 710, -683, -584, 735, 253, 520, 803, 1243, -278, -786, 1052, -421, -174, 1097, 347, -399, -1139, -752, -112, -420, 540, 1082, 556, -368, 1112, 375, -399, 308, 1240, 361, 242, -258, -988, -1327, -1054, -73, 804, 248, 509, 1897, 937, -1131, -761, 506, -1567, -718, 1358, 487, -1743, -1454, -673, -1113, -1045, -624, 954, -267, -196, 2483, 420, -711, -194, -767, 1320, -274, 289, 94, 22, -717, -276, -54, -362, 90, + 285, 648, 87, -435, -16, 1, -286, 136, 190, 222, -569, 150, -527, 95, 281, -28, 425, -100, -25, 431, -85, 242, 477, -158, 144, 331, 359, 296, 61, 77, 250, -258, -99, 175, -1690, 1174, 505, 382, 473, -179, 580, 477, 680, -126, 932, -582, 707, -255, -539, -169, -885, 94, -324, 316, -224, -341, 852, -975, 631, -31, -424, -168, 378, 428, 308, 806, 649, -464, -96, -415, 362, -368, 283, 390, 178, 220, 145, -228, 889, -81, 264, 91, 410, 229, -1063, 71, -636, 164, 469, -85, -450, -411, 989, -1044, -846, 1554, + -660, 404, 154, 500, -235, 263, -1082, 76, 1050, -561, -426, 907, -63, -750, -557, 336, -295, -173, 561, -412, 139, 702, -789, 54, 460, -254, -158, -204, 282, 80, 113, -101, 159, 123, -157, 14, 26, 419, 208, -389, 477, 122, -247, 142, 144, -41, -146, 346, -3, 118, 40, 446, -209, -165, 266, -396, 497, -35, -287, -44, -35, 63, -10, -190, -34, 265, 538, -995, -4054, -4374, -153, -2507, 2230, 8051, 3512, 4859, 6136, -2309, -1632, -646, -5502, -3846, -1244, -6033, -2627, -532, -2463, 594, 5671, 5152, 5574, 7224, 4355, -385, 1627, -1613, + -6416, -3484, -2577, -5330, -3654, 209, -4103, -1346, 913, -4100, -2100, 3079, 1197, 3339, 8309, 6758, 5466, 9830, 7137, -115, 1031, -1830, -8792, -8403, -8667, -13501, -9143, -5648, -5529, 71, 4388, 4943, 6925, 10482, 9701, 8192, 8088, 4635, 1632, 262, -494, -3672, -6324, -7765, -8317, -11230, -9338, -7200, -3524, 3767, 11115, 10355, 11343, 7957, 975, -1075, -3398, -4671, -3158, -1547, -1562, -689, -714, -1133, 12, 170, 830, 2589, 2349, 1734, 2380, -222, -1536, -204, -1804, -1560, 969, 1051, 243, 242, -2750, -7032, -6660, -5667, -4271, 2079, 6407, 7836, 9893, 8870, 5469, 3799, 1347, -1577, -3309, -3948, + -5126, -6289, -7099, -8290, -7373, -2548, 1809, 4259, 5509, 5977, 4470, 3095, 1550, -42, -179, 711, 1112, 1184, 1229, 931, -146, -1143, -2084, -3396, -3165, -2387, -1692, -567, 537, 1251, 1355, 1211, 819, 520 }, + {-237, 115, -270, 53, 20, 17, -184, -65, 51, -40, 60, 96, 58, -3, 76, -208, 5, -8, -5, 114, 174, -183, -41, -111, -36, 65, 119, 19, 30, -45, -59, -48, -37, -83, 45, -84, -57, 95, -81, 68, 11, -206, -70, -114, -27, 87, -61, -18, -60, -62, -43, 85, 130, 24, 72, 57, -69, -131, 70, 58, -29, -113, -94, 85, 17, 63, 30, -173, -57, -65, 96, 39, -174, 46, -93, -29, -9, -63, 50, -58, 13, 66, 69, 42, 47, 31, -6, 33, 41, 4, -34, 46, 10, 0, -14, -31, + 15, 29, 5, 24, -9, -16, 0, -24, 26, -5, 30, -6, 6, -3, 28, 15, -2, -12, 18, -335, 222, -160, 22, -21, -61, 170, -149, -99, 0, 180, -66, -10, -19, 149, -89, -238, -53, -122, -166, 7, -13, 28, 97, 159, 99, 16, 243, 95, 9, 173, 182, -14, -97, 7, 80, 65, -1, -34, -140, -124, -61, 139, 58, 240, 136, -10, 80, 98, 33, -148, 161, -63, 84, -6, 51, -177, -28, -56, 63, -54, -66, 185, -12, -138, 55, -105, 87, -59, 139, 120, 133, 45, -128, 71, -19, 70, + -55, 20, 182, -70, 89, 120, -18, 8, -5, -21, -48, 31, -2, 46, -1, 37, 3, 4, 27, 45, 19, 43, 48, -8, -34, 62, 7, -1, 5, 38, -10, -33, 18, -8, 10, 2, 37, 13, 21, 13, 67, 75, 4, -65, 70, 27, 21, 33, -265, 86, -169, 28, 55, 58, -78, 141, 22, -52, -25, 164, 118, -72, -92, -76, 63, 117, -71, -77, 22, -300, -1, -128, -51, -128, -168, -21, 152, 42, -137, -36, 130, 39, -84, 148, -65, -206, -62, 116, -52, 137, 261, 211, 29, -3, 73, -32, + -155, 2, 57, -110, 92, -219, -34, 14, -94, -71, 95, 191, -150, -156, 96, 98, 179, 58, -106, 144, 123, -41, 137, -153, 154, 38, 104, 21, -83, -47, -16, 34, 2, -75, 25, 1, -45, -36, 9, -11, 33, 2, 55, -41, -31, -2, 6, 49, -26, -49, 21, 2, -12, 33, -9, 20, -23, 20, 28, 4, 46, 451, -175, -77, -29, 325, -32, 246, -179, 217, -215, -188, 45, 103, -127, -31, 65, -17, 85, -131, 151, 55, -162, -6, 65, 51, 29, 306, 244, 191, 0, 124, 12, 36, 92, -282, + -43, 172, 112, 134, -3, -50, 63, -11, 346, -52, 58, 35, 17, -102, 207, -23, 216, -119, -124, 89, -83, -287, -132, 58, -27, -205, 58, 1, 268, 23, 23, -82, 98, 99, -22, -16, 235, 173, 172, -113, -161, -141, -276, 23, -195, -66, 13, -106, -121, -68, -14, -41, 65, 121, -22, -14, -54, 28, -39, -45, 20, 33, 1, 43, -25, 2, -24, -16, -13, 25, -15, -15, -9, -39, -44, 3, -5, -54, 46, 46, 56, -1, -39, -23, 44, 331, -264, -7, -276, -182, -108, 238, 139, -333, -455, -176, + 160, 113, -69, 155, 1, -40, 17, -240, 71, -32, 19, 75, 15, -2, 100, 87, -159, -159, 180, -58, -90, 110, -311, 73, 64, -287, 103, 295, 179, 203, 41, 111, 281, 52, 53, -324, 170, 243, 199, 37, 202, -231, 226, -69, -227, -349, -4, -223, -179, -78, -213, -531, 22, 27, -18, 82, 260, 97, 105, 69, -190, 27, 88, 75, 67, 76, -195, -59, -246, -111, -18, 56, -90, 86, 17, 15, -62, -11, -33, 0, -36, 32, 10, 24, -9, -45, -38, -38, 37, 24, 0, -18, -34, -37, -36, -111, + 16, 15, -84, -44, -31, -716, 352, 45, -279, 67, -31, -83, -57, -158, 84, -81, 16, 103, 95, 310, -126, -297, 161, -377, -163, 61, 51, 43, 121, 151, 129, -3, 171, 11, -69, 228, 141, -70, 135, -237, 446, 17, 82, -42, -385, -67, -144, -135, 58, 320, 8, 13, -42, -89, -208, 65, -35, 114, -262, 88, 138, 61, -194, -69, 50, 25, 155, 31, 541, -155, -233, -263, -81, 5, 193, -262, -35, -112, 118, -383, -18, -104, -162, 48, -48, 104, -15, 192, 120, -1, 39, 15, 23, 222, 25, 159, + 56, -40, 3, 6, 45, -29, 22, -8, 66, 13, -52, -73, 58, -28, -89, -38, -47, -20, -28, -1, 107, 2, 29, 13, 42, -43, -25, -93, 323, -105, -78, 69, 95, -262, -264, -242, -228, -371, 233, -218, 64, 89, 336, -57, -81, 263, 60, 54, -311, -204, 151, 65, 120, 181, -327, 2, 138, 310, -5, 28, -48, -1, -214, -41, -68, -397, -33, 120, -229, 96, -249, -3, -173, -36, -55, 21, 318, -94, 3, 162, -93, 94, -267, -473, -258, -145, -69, 49, 313, -150, 83, 75, -228, 75, -176, -63, + 113, 318, -51, -19, 100, -9, -303, -286, -121, 282, -36, -427, 28, -281, -126, -60, -32, 93, -110, -34, 103, -32, 122, 106, 75, -52, 119, -110, -84, -79, 16, -15, -26, -28, -24, -40, 21, -12, 76, -57, -38, 31, -50, -30, -126, -151, -16, 9, 70, 7, 41, 1, 315, 331, -101, 31, 347, -353, -314, 266, -63, 36, 241, -48, -66, 241, -446, 190, -20, 76, 218, 224, -250, 47, -343, 106, -103, -37, -238, -12, -342, 33, -296, 208, -104, 39, 370, 172, 166, -296, 55, 343, -81, -488, 262, -60, + 48, -96, -226, 322, 116, 263, 66, 38, -216, -281, 102, 131, 142, 187, 432, -15, -334, -218, 260, -38, -287, -76, -17, -79, -363, 6, 51, 91, -131, 210, -10, 23, 300, 153, 312, -306, -127, 56, -167, 139, 86, 85, -12, -39, -25, -5, -120, 154, -56, 94, -24, 110, -43, -55, 8, 63, -53, -2, -13, -61, -30, 28, -66, -21, -141, -111, 61, 98, 52, 45, -14, -12, -65, -11, 74, -95, -12, 44, -18, 77, 76, -53, -20, 69, 49, -36, 251, -305, 358, -80, 378, -309, 280, 31, -30, 472, + -246, 28, -239, -71, 719, 347, 153, 104, 204, -115, -1, -608, 113, -25, -263, 291, 218, -9, 52, -351, 309, -164, 328, 215, 175, -252, -44, -212, 315, 73, -115, 559, 267, -63, 29, -463, 79, 22, 368, -165, -471, -81, -131, -91, -666, -332, -709, -361, -254, 84, -178, 335, 41, -382, 231, -256, 362, -322, -262, 189, 322, 318, 1, -298, -238, 146, -195, 8, -99, 120, -134, -197, 347, 161, 47, -55, 131, 74, 161, -15, 109, 39, 180, 4, -9, 11, -89, 3, 46, 22, 20, 5, 139, 64, -110, 12, + 63, -35, -42, -26, 8, 27, 70, -17, 48, 82, -17, -82, -8, -90, -40, -83, -54, 72, 5, -46, -440, -522, -346, -50, -7, -68, 124, 189, 131, 0, 70, -166, 109, -337, -469, 15, 360, 63, -127, 288, 171, 279, 469, 61, -145, -299, -239, 137, -274, -190, 71, -217, -478, -262, -26, -55, 112, -108, 265, 77, 101, 367, -59, 44, 85, -293, 346, 57, -320, -523, 133, 47, -380, 402, 261, -352, 119, 338, 190, 91, 280, -128, -113, 21, -155, -249, 426, -380, -42, 159, 37, 662, -575, 175, -73, -3, + 185, 8, 40, -155, 88, -341, -723, -41, -9, -372, -236, -52, 136, 119, 51, 30, -120, -4, -169, -85, -33, -98, -152, 52, -29, 26, -78, -57, 36, -124, -264, -93, 18, -72, -254, -142, 105, 72, 50, -51, -98, -123, -23, -62, -144, -120, -170, -90, -115, -116, -4, -29, 46, -46, -32, 93, -127, -341, 300, -617, -438, 325, -15, -562, 288, -329, 636, 127, -837, -107, 76, -212, 63, 146, 297, 254, -486, -22, 46, -101, -445, -69, -92, -153, -136, -7, 33, 378, 415, -129, 224, 193, 189, 413, 6, 111, + -477, -165, 169, -95, 231, 568, 84, -498, -1108, -3, -341, 314, -209, -113, -217, -599, 261, 799, 48, 209, -627, 129, -70, -283, 73, 306, 161, 247, -269, 397, 234, -464, -687, -44, -522, -490, -311, -362, 49, 645, 249, 23, -85, 415, -210, -310, -48, 64, -47, 76, 66, 3, 67, 158, 61, -18, 14, -62, -59, 166, -48, 164, 7, -94, 23, -49, -66, 198, -45, 107, -241, -32, 122, -2, 52, 202, -149, 184, -15, 20, 60, -63, 145, 20, 12, 24, 11, 64, 187, -77, 68, 71, 75, 79, -1207, -762, + 548, 442, 718, -2, 284, 71, 227, -9, 147, -318, -381, -236, -341, -220, -243, 293, 691, 151, -842, -199, 148, -223, 206, -481, -38, -16, 29, 235, 179, 34, -57, -107, 197, 381, -305, -473, 316, 151, 414, 189, 602, -416, -145, 384, 574, 499, 296, 141, -122, 38, -72, 3, 199, -748, 403, -59, 110, -49, 569, -173, -8, -124, 361, 306, -638, 458, -542, -27, -275, -273, 249, 45, -847, -75, -66, -156, -98, -20, -107, 440, 44, 421, -132, 498, 236, -257, 110, -64, 29, 32, 48, 67, 26, -96, -159, 248, + 111, 203, 58, -121, 235, 9, 13, 176, -494, -229, -219, 69, -6, -336, 15, 56, -15, -63, 0, 115, -122, -5, 134, 67, 164, -142, -69, 41, 178, 671, -746, -17, -424, -1196, -141, -442, -945, 189, -6, -183, 60, 508, -33, -537, 185, 22, -172, -129, -95, 27, 586, -131, -21, 266, 197, -84, 284, 259, -125, -123, -235, 326, -77, -560, 86, -37, 193, 735, -490, -787, -496, -230, 109, 263, 140, 560, 280, -394, -227, -537, 466, 287, 52, 99, -308, 33, -326, 564, 553, 40, -257, -143, 55, 514, 1024, 631, + -97, -228, 15, 327, 142, 302, 416, -410, -19, -793, -534, -509, -341, 214, 488, 336, 54, -96, -45, -440, -554, -139, -294, -277, 64, -55, -70, 5, 19, 128, -140, 285, -287, 123, -366, -122, 0, 70, -10, 66, 142, -98, 18, 339, 413, 497, 273, 312, 142, 61, 25, 11, 20, -84, -266, -259, -42, 207, 1, 34, -108, -75, 33, 253, 159, 301, 212, 256, -585, -69, -303, 439, -486, 93, 42, 860, -533, -157, -548, -119, -541, -455, -329, 169, -582, -423, -633, -162, -96, -194, -286, -705, 184, -499, 201, -523, + 643, 98, 288, -125, -608, 325, 188, -205, 325, 455, -247, -656, -351, 877, -376, -29, 22, -150, 193, 568, 100, 241, -184, 406, 5, 320, 97, 108, -10, 32, 695, 210, 1665, -1017, 648, 912, -242, 20, 471, -342, -100, 764, 303, -128, 406, -174, -741, -548, 186, 30, -990, -276, -101, -514, 264, 154, -334, -274, -202, 29, 91, 209, -174, 24, 122, -55, -220, 61, 46, 69, 206, 36, -125, 16, 238, 211, 103, -237, -5, 435, -124, -92, 242, -236, -409, -117, 22, -53, -210, -64, -12, -231, -48, 25, -64, -240, + -396, 152, 427, 155, -8, 16, -79, -251, -200, 935, 1044, 24, 756, 753, -32, 345, -740, -222, 672, 73, 664, 927, 764, -142, 501, -758, -1189, -502, -439, 299, 11, 319, 342, 732, 567, 205, -562, -59, 579, 194, -272, 378, 795, -78, 282, -631, 315, -496, -130, -311, -659, 420, 54, 210, 805, -420, -478, 299, 834, -638, -428, 280, -203, 1178, 870, -810, -303, -638, 41, 723, -324, -483, -219, 55, 178, -580, 148, 1201, 92, -784, -1209, 992, -1167, -973, -570, -492, -843, 238, 220, 1374, 346, 610, -296, 662, -75, -268, + 250, 40, -59, 678, 89, 352, 428, 241, 513, -135, 140, -100, -39, -100, -428, -307, -353, 419, 147, 375, 452, -89, 272, 595, 212, -178, 302, 361, 121, -72, -423, -369, 379, 171, 252, 510, 1108, 488, 279, 215, 313, -155, -38, 571, -362, 205, -199, 194, 113, -1084, -628, -816, 214, 450, 158, 692, 622, 878, 272, 959, 428, 618, -306, -122, -308, -743, -533, -1147, -681, -222, -669, 145, -27, -20, 272, 222, 103, 552, -140, -462, 663, 59, -878, -381, -95, -1057, -801, -781, 72, 374, 102, -407, -51, 439, 272, 1049, + 196, -1415, -471, -246, 226, 218, -162, -377, 523, -784, -145, -629, 476, -1234, -763, -1007, -807, 37, -455, -354, -810, 406, 1457, -39, 942, -524, 232, -693, -3, 1036, 248, -492, 56, 398, -700, -1086, -583, 276, -843, 361, -12, -25, 542, 281, -144, 627, 626, 501, -165, -175, -109, -9, 437, 312, 221, 10, 456, 251, 71, 58, 338, -142, -114, 233, -349, 315, -303, -300, -357, 626, 391, 581, 215, 219, 53, 40, 287, -440, -704, 54, 199, 175, -287, 807, 330, 814, -1329, 576, 998, -97, 1150, -610, -1756, -909, -13, -175, + 193, -629, 606, 858, -773, 681, -424, -518, -1227, -501, -705, -465, -564, 552, 81, -1098, -1406, 1061, 239, 380, -330, 85, -382, 10, 322, 490, 443, 1189, 37, -855, 1153, -123, -301, -536, 486, -950, -639, 538, -495, -740, -929, -813, -175, 108, 87, -251, 999, 850, -83, -486, -837, -960, 236, 202, -190, -95, 1373, 92, -402, 593, 284, -906, 720, 1307, -1435, 2316, 618, 668, 253, 672, -184, -1430, 978, 83, -178, 1016, -1207, 211, 211, -7, -118, 50, -95, -334, 177, 357, -298, -39, -441, -506, 654, -146, -322, 149, -176, -403, + -729, -169, -248, 636, -611, -63, 748, -160, 597, -215, -525, 271, -107, -250, 308, 72, 825, -112, -15, 544, 1659, 729, 39, -555, 793, -13, 58, -380, 724, -839, 613, 589, 621, 301, -227, 823, 1033, -210, 427, -639, 1039, 443, 348, -661, -1445, 289, -442, -330, -586, -739, 448, 201, -358, 83, 37, -390, -1766, -110, -374, -181, -25, 1247, 853, -415, 323, -821, 94, 616, -937, -870, -714, 1129, -809, 235, 908, -1220, -1132, 1045, 832, 877, 1173, 434, -1497, 339, 445, -131, 2449, -253, -372, -1106, -956, 495, -881, 576, 201, 651, + 1343, -860, -587, 1635, -994, -1098, 718, -1414, 1029, -1075, 246, 370, -778, 324, -903, 630, 1153, -46, 201, 237, 43, -352, -332, -75, 335, -149, 226, -234, -716, 308, 63, 488, 242, 426, -145, -141, -709, 498, -96, -647, 151, 1333, 368, -340, 392, 718, -356, 79, 551, -277, 550, 187, -173, -860, 145, -329, -22, 1066, -487, -285, 370, 1231, 106, -1045, 1499, 366, -97, 1069, 532, 866, 326, -1280, -279, -477, 607, 1499, -945, 245, -452, 670, 768, -1005, 845, -806, -726, 375, 696, 34, 233, 544, -813, 725, 60, 884, -153, -228, + 290, 1307, -582, 1057, -506, 217, 279, 1057, -58, -64, 366, 1591, 108, -1235, -97, -1488, 900, 8, 2449, 528, -711, -212, 544, -536, 863, 1599, 1096, 28, 468, 695, -74, -738, -98, -165, -2550, 1597, 1193, 1100, 269, -1103, -327, 838, 436, 730, 396, -2443, -870, 1505, 416, 487, 1296, -913, -26, -126, 735, 187, -69, -197, 580, -149, -664, 333, -319, -381, 349, 509, -373, -117, -11, 402, -511, 418, -451, 215, -782, -802, 798, 104, 73, -92, -576, -178, 535, 57, 184, 886, -134, -674, -62, -384, 306, 331, -318, -273, 353, 734, + 932, 961, -595, 978, -896, 150, 468, -461, 65, 183, -245, -482, -907, 1380, -310, -273, -461, -78, -191, 448, -929, -269, -581, 198, -584, 559, -4, 287, -644, -1174, 55, -858, -896, 404, -687, -583, 1133, -421, -663, 84, -682, 319, 428, -126, -557, -164, 325, 285, -253, -25, 1000, -179, -617, -785, -113, -344, -1180, 1106, 382, -1355, 833, -61, -568, 2603, 1466, 1198, 636, 365, -618, 95, 286, 306, 117, 1140, 256, -340, -562, -2307, 471, 302, -11, -451, -869, -173, -559, -501, -36, 727, -499, 1257, 184, -251, -88, -108, 100, 529, + -206, 133, 372, 128, 71, 289, -470, 228, 85, 737, -256, -185, -203, -187, -585, -320, 214, -639, 476, -130, -304, 438, 279, 368, -137, -58, 49, 70, -403, 211, 29, -20, -36, 263, -1192, 2014, 257, 660, 360, -499, 375, 568, 142, -57, -486, -85, 138, -227, -172, 85, 227, 587, -405, 247, 25, 468, -164, 93, 155, -537, 438, 71, 109, 157, 163, -340, 364, -293, 76, 348, -188, 341, -146, 430, 335, 194, -531, 399, 305, 243, 666, -639, -54, -6, -134, 196, -328, -529, 365, 410, 208, -50, 89, -57, 215, -185, + 89, -392, 360, -609, 578, 321, -191, -8, 241, 17, 217, 4, 27, -20, -205, 296, 403, -354, -79, 74, 225, -160, -166, 47, 76, -40, 43, -130, 52, 165, -126, 35, 100, -133, 117, 144, -10, -47, -66, 28, 302, -113, 42, -278, 20, 308, -216, 230, -103, 17, 514, -90, 13, -11, -154, 264, 111, 113, 111, -84, 71, 289, -81, 197, -126, -22, 385, -1610, -3746, -602, 2188, 1986, 4896, 2556, -1321, -408, -2717, -4611, -321, -2097, -294, 3355, 1432, 2592, 3980, -466, -586, -2025, -3441, -2737, -179, -1030, -391, 2852, 903, 1853, + 3371, 549, -17, 346, -2054, -3111, 532, -3215, -2104, 710, -326, 519, 4135, 472, 1584, 3376, -676, 102, 750, -3260, -2719, -965, -3709, -1438, 469, 682, 2548, 3589, 2558, 1804, 1572, -601, -2172, -1784, -2684, -2820, -1211, -717, 16, 2363, 2820, 881, 2203, 641, -702, 462, -1542, -2141, -422, -996, -668, 1203, -47, 838, 1495, -413, -36, -2, -761, -236, -55, -570, 631, 227, -152, 1033, 327, -151, 993, -352, -1071, 20, -1635, -1144, 350, -1088, 229, 1258, 922, 1714, 1868, 679, 658, -80, -1545, -2155, -2218, -2315, -1473, -112, 739, 1596, 2771, 2977, 2470, 1936, + -119, -1824, -2617, -3344, -3413, -1819, -551, 1423, 3004, 2716, 1631, 1203, 347, -249, -403, -1161, -1328, -989, -812, -569, -121, 110, 429, 618, 618, 597, 534, 289, 80, -74, -175, -295, -356, -334 } }, -}; -const Word32 CRendBin_FOA_HRIR_coeff_im_48kHz_fx[4][BINAURAL_CHANNELS][240] ={ -{ - { - -124898720, - -332729504, -439877120, -442557728, -379344384, -293460096, -205276352, -113285672, -12222940, 93858992, 192837584, - 272809888, 327290464, 355045632, 358171296, 341044576, 309595744, 269720736, 225325264, 177752592, 127412352, - 75906568, 26075284, -20146080, -63114544, -104128800, -143182400, -178805936, -209827408, -236391248, -259223824, - -278753568, -295292960, -309494272, -322090880, -333362464, -343166816, -351456640, -358579840, -365063616, -371221536, - -377014368, -382244032, -386783808, -390602048, -393683136, -396049120, -397818112, -399115744, -399944128, -400236192, - -399987072, -399253728, -398069376, -396445888, -394451392, -392200320, -389782240, -387236384, -384578336, -381834944, - -379053408, -376263296, -373443648, -370585344, -367778592, -365158656, -362774944, -360603296, -358668416, -357025056, - -355635648, -354415328, -353371648, -352556672, -351920480, -351348192, -350802720, -350258880, -349570624, -348561824, - -347180992, -345422208, -343174880, -340324096, -336925696, -333160608, -329167360, -324992672, -320619840, -315976448, - -311015776, -305840320, -300658464, -295617216, -290763904, -286148960, -281828768, -277802784, -274047904, -270602816, - -267524928, -264817488, -262432160, -260293808, -258303088, -256404720, -254646464, -253053024, -251462288, -249616512, - -247390656, -244834080, -242033760, -239064864, -236007920, -232902656, -229728672, -226498320, -223285152, -220122448, - -216968320, -213787904, -210567744, -207265456, -203864912, -200441824, -197074032, -193735776, -190386768, -187074272, - -183864336, -180773568, -177833664, -175100448, -172536896, -170028624, -167533248, -165088336, -162686384, -160296240, - -157944208, -155640496, -153303488, -150872544, -148402928, -145936016, -143440096, -140947408, -138565312, -136292192, - -134017472, -131727720, -129487360, -127250216, -124917512, -122529512, -120187144, -117889336, -115630184, -113507392, - -111558016, -109682192, -107845016, -106118976, -104446088, -102671192, -100828112, -99078456, -97401808, -95681672, - -93997504, -92467960, -90984048, -89425512, -87905632, -86504936, -85102096, -83697640, -82489680, -81455664, - -80349176, -79179336, -78134584, -77073192, -75731544, -74264816, -72914584, -71460200, -69692824, -67927592, - -66353488, -64584496, -62504660, -60603600, -58905476, -56793964, -54370528, -52408800, -50643568, -48081084, - -45197552, -43396888, -42245300, -40205724, -37985228, -37478420, -37489696, -34875672, -29977262, -25905096, - -22486302, -17277042, -13460964, -19048716, -34682396, -48724792, -49633716, -39305932, -29730300, -29189134, - -35735740, -42936788, -48927192, -58810452, -77185392, -97927936, -105323336, -90025200, -61538828, -38875360, - -30039002, -27507654, -23304492, -19342922, -19663970, -20865488, -16995722, -9038222, -2388002, }, - { - -124898720, - -332729504, -439877120, -442557728, -379344384, -293460096, -205276352, -113285672, -12222940, 93858992, 192837584, - 272809888, 327290464, 355045632, 358171296, 341044576, 309595744, 269720736, 225325264, 177752592, 127412352, - 75906568, 26075284, -20146080, -63114544, -104128800, -143182400, -178805936, -209827408, -236391248, -259223824, - -278753568, -295292960, -309494272, -322090880, -333362464, -343166816, -351456640, -358579840, -365063616, -371221536, - -377014368, -382244032, -386783808, -390602048, -393683136, -396049120, -397818112, -399115744, -399944128, -400236192, - -399987072, -399253728, -398069376, -396445888, -394451392, -392200320, -389782240, -387236384, -384578336, -381834944, - -379053408, -376263296, -373443648, -370585344, -367778592, -365158656, -362774944, -360603296, -358668416, -357025056, - -355635648, -354415328, -353371648, -352556672, -351920480, -351348192, -350802720, -350258880, -349570624, -348561824, - -347180992, -345422208, -343174880, -340324096, -336925696, -333160608, -329167360, -324992672, -320619840, -315976448, - -311015776, -305840320, -300658464, -295617216, -290763904, -286148960, -281828768, -277802784, -274047904, -270602816, - -267524928, -264817488, -262432160, -260293808, -258303088, -256404720, -254646464, -253053024, -251462288, -249616512, - -247390656, -244834080, -242033760, -239064864, -236007920, -232902656, -229728672, -226498320, -223285152, -220122448, - -216968320, -213787904, -210567744, -207265456, -203864912, -200441824, -197074032, -193735776, -190386768, -187074272, - -183864336, -180773568, -177833664, -175100448, -172536896, -170028624, -167533248, -165088336, -162686384, -160296240, - -157944208, -155640496, -153303488, -150872544, -148402928, -145936016, -143440096, -140947408, -138565312, -136292192, - -134017472, -131727720, -129487360, -127250216, -124917512, -122529512, -120187144, -117889336, -115630184, -113507392, - -111558016, -109682192, -107845016, -106118976, -104446088, -102671192, -100828112, -99078456, -97401808, -95681672, - -93997504, -92467960, -90984048, -89425512, -87905632, -86504936, -85102096, -83697640, -82489680, -81455664, - -80349176, -79179336, -78134584, -77073192, -75731544, -74264816, -72914584, -71460200, -69692824, -67927592, - -66353488, -64584496, -62504660, -60603600, -58905476, -56793964, -54370528, -52408800, -50643568, -48081084, - -45197552, -43396888, -42245300, -40205724, -37985228, -37478420, -37489696, -34875672, -29977262, -25905096, - -22486302, -17277042, -13460964, -19048716, -34682396, -48724792, -49633716, -39305932, -29730300, -29189134, - -35735740, -42936788, -48927192, -58810452, -77185392, -97927936, -105323336, -90025200, -61538828, -38875360, - -30039002, -27507654, -23304492, -19342922, -19663970, -20865488, -16995722, -9038222, -2388002, }, - }, - { - { - 75367016, - 152898688, 60698088, -183234576, -462790784, -646732928, -670164672, -552847104, -356891904, -137474384, 73971688, - 261569408, 416582848, 535674240, 619246208, 668629760, 685797824, 674825792, 641893568, 594021376, 537820096, - 477885440, 415636320, 350830656, 284640896, 220209952, 160159328, 104857328, 53330608, 4641786, -41893112, - -86666000, -129419176, -169462768, -206496656, -240911696, -273358560, -304294688, -333708768, -360983936, -385256416, - -406153568, -423995424, -439282816, -452334144, -463416768, -472780864, -480480672, -486499008, -491077984, -494679840, - -497635328, -500009344, -501677952, -502400032, -501986112, -500507040, -498200096, -495197920, -491626656, -487864256, - -484330592, -481093248, -478047040, -475357312, -473303776, -471816640, -470609760, -469671328, -469199392, -469178464, - -469423808, -469963360, -470982880, -472453376, -474128416, -475874848, -477738336, -479691488, -481542592, -483125312, - -484456192, -485635712, -486656832, -487370336, -487655968, -487559840, -487253824, -486930112, -486741120, -486666496, - -486328800, -485141792, -482780640, -479371488, -475091552, -469790496, -463164992, -455119968, -445847136, -435704576, - -425084736, -414195904, -402933440, -391173280, -379205888, -367657248, -357015936, -347438144, -338942720, -331559680, - -325298144, -320120032, -315899680, -312377280, -309302080, -306654752, -304536800, -302828480, -301160960, -299198144, - -296754848, -293748384, -290283968, -286679392, -283180064, -279745728, -276271616, -272813632, -269422752, -266000752, - -262489616, -258998336, -255647728, -252489856, -249618672, -247114160, -244883472, -242755840, -240685136, -238706224, - -236819664, -235067312, -233545296, -232212240, -230879728, -229424800, -227802912, -225917968, -223729680, -221395904, - -219032592, -216511984, -213710592, -210693920, -207425440, -203653920, -199291312, -194540000, -189516512, -184160688, - -178572928, -172972288, -167346416, -161570224, -155748928, -150033952, -144372112, -138797232, -133573480, -128747016, - -124037584, -119380760, -114943528, -110526152, -105692704, -100490960, -95319816, -90263032, -85287848, -80689552, - -76599128, -72645616, -68697464, -65106336, -61799212, -58229020, -54474680, -51085416, -47885128, -44364864, - -40817220, -37582036, -34133716, -30340722, -26945014, -23608898, -19145354, -14457397, -11223286, -7551090, - -877247, 5522254, 7752953, 11690901, 25166898, 40288404, 40982576, 30000884, 27510876, 38634840, - 47277388, 50246824, 68518152, 108822664, 141658752, 139589120, 116141288, 105104832, 118624312, 144289968, - 167411376, 181297008, 192171328, 222071824, 281490016, 330403776, 302403264, 188827168, 66482336, 14287209, - 28991566, 52163988, 55246700, 60433948, 89120032, 125949376, 137805104, 106897440, 40123048, }, - { - -75367016, - -152898688, -60698088, 183234576, 462790784, 646732928, 670164672, 552847104, 356891904, 137474384, -73971688, - -261569408, -416582848, -535674240, -619246208, -668629760, -685797824, -674825792, -641893568, -594021376, -537820096, - -477885440, -415636320, -350830656, -284640896, -220209952, -160159328, -104857328, -53330608, -4641786, 41893112, - 86666000, 129419176, 169462768, 206496656, 240911696, 273358560, 304294688, 333708768, 360983936, 385256416, - 406153568, 423995424, 439282816, 452334144, 463416768, 472780864, 480480672, 486499008, 491077984, 494679840, - 497635328, 500009344, 501677952, 502400032, 501986112, 500507040, 498200096, 495197920, 491626656, 487864256, - 484330592, 481093248, 478047040, 475357312, 473303776, 471816640, 470609760, 469671328, 469199392, 469178464, - 469423808, 469963360, 470982880, 472453376, 474128416, 475874848, 477738336, 479691488, 481542592, 483125312, - 484456192, 485635712, 486656832, 487370336, 487655968, 487559840, 487253824, 486930112, 486741120, 486666496, - 486328800, 485141792, 482780640, 479371488, 475091552, 469790496, 463164992, 455119968, 445847136, 435704576, - 425084736, 414195904, 402933440, 391173280, 379205888, 367657248, 357015936, 347438144, 338942720, 331559680, - 325298144, 320120032, 315899680, 312377280, 309302080, 306654752, 304536800, 302828480, 301160960, 299198144, - 296754848, 293748384, 290283968, 286679392, 283180064, 279745728, 276271616, 272813632, 269422752, 266000752, - 262489616, 258998336, 255647728, 252489856, 249618672, 247114160, 244883472, 242755840, 240685136, 238706224, - 236819664, 235067312, 233545296, 232212240, 230879728, 229424800, 227802912, 225917968, 223729680, 221395904, - 219032592, 216511984, 213710592, 210693920, 207425440, 203653920, 199291312, 194540000, 189516512, 184160688, - 178572928, 172972288, 167346416, 161570224, 155748928, 150033952, 144372112, 138797232, 133573480, 128747016, - 124037584, 119380760, 114943528, 110526152, 105692704, 100490960, 95319816, 90263032, 85287848, 80689552, - 76599128, 72645616, 68697464, 65106336, 61799212, 58229020, 54474680, 51085416, 47885128, 44364864, - 40817220, 37582036, 34133716, 30340722, 26945014, 23608898, 19145354, 14457397, 11223286, 7551090, - 877247, -5522254, -7752953, -11690901, -25166898, -40288404, -40982576, -30000884, -27510876, -38634840, - -47277388, -50246824, -68518152, -108822664, -141658752, -139589120, -116141288, -105104832, -118624312, -144289968, - -167411376, -181297008, -192171328, -222071824, -281490016, -330403776, -302403264, -188827168, -66482336, -14287209, - -28991566, -52163988, -55246700, -60433948, -89120032, -125949376, -137805104, -106897440, -40123048, }, - }, - { - { - -13802414, - -47165184, -74663712, -61562988, -5680631, 44969380, 48283484, 14860050, -17733384, -32172526, -32605782, - -20424180, 4682051, 29864518, 39075612, 35302484, 35977332, 47849692, 60231548, 62271120, 54360864, - 41108744, 23409720, 1344325, -21242908, -39104604, -50457276, -57920320, -65591668, -75411576, -85669032, - -93073016, -96052648, -95194192, -91170344, -84228600, -75784160, -68624448, -64906084, -64931316, -67952824, - -73216848, -80197776, -88596584, -98254896, -108864536, -120063128, -131917240, -144824688, -158827888, -173410384, - -187899456, -201657312, -214070304, -224739536, -233464752, -239878224, -243509072, -244260688, -242253872, -237237344, - -228833168, -217214752, -202791168, -185459904, -165003520, -141917536, -117023360, -90644744, -62943284, -34586836, - -6352794, 21360482, 47988208, 72470056, 94116152, 113059648, 129223216, 141668960, 149715584, 154010544, - 155682896, 154889408, 151030912, 144291568, 136228304, 128406640, 120784680, 112138376, 102228272, 92739080, - 85502600, 80518824, 76525576, 72917808, 70152384, 68733432, 68791952, 70391296, 73414416, 77299744, - 81420768, 85580448, 89894200, 94476936, 99248640, 103607496, 106430904, 106961328, 105525200, 102881648, - 99245416, 94438816, 88469880, 81362248, 72924784, 63197760, 52652540, 41703060, 30578556, 19728932, - 9671193, 468151, -7982197, -15341086, -21146272, -25388626, -28208808, -29520920, -29410862, -28273770, - -26246546, -23247584, -19720342, -16474958, -13775571, -11426224, -9436580, -7648263, -5215701, -1505386, - 3038689, 7768522, 12746926, 18064096, 23278186, 28182502, 33059438, 37783900, 41834592, 45306000, - 48689896, 51856900, 54507428, 57112328, 60180008, 63370632, 66406636, 69755104, 73511048, 76987824, - 80063024, 83345984, 86687472, 89292904, 91239600, 93041336, 94253592, 94427000, 94436664, 95038496, - 95600600, 95852936, 96855272, 98945848, 101201776, 103691784, 107325328, 111333608, 114234856, 116669568, - 119715768, 122031832, 122400664, 122425360, 123050280, 122258928, 119496192, 117220392, 115557168, 112020800, - 107722072, 105553656, 102967544, 96880504, 92161944, 92340184, 89240832, 78376176, 72368592, 77343768, - 74270184, 53761180, 44733160, 64812668, 69371240, 11631308, -66325568, -77721728, -18441516, 31005906, - 32542968, 30531848, 48058000, 36233416, -32217086, -97196184, -92901752, -39170100, -446140, 4465156, - 5751498, 25180856, 52560736, 61572652, 29836600, -35614404, -84488984, -65874060, 5120138, 56609280, - 47454020, 10870025, -4068408, 2501819, 12885, -17770964, -29529510, -23487028, -8164196, }, - { - -13802414, - -47165184, -74663712, -61562988, -5680631, 44969380, 48283484, 14860050, -17733384, -32172526, -32605782, - -20424180, 4682051, 29864518, 39075612, 35302484, 35977332, 47849692, 60231548, 62271120, 54360864, - 41108744, 23409720, 1344325, -21242908, -39104604, -50457276, -57920320, -65591668, -75411576, -85669032, - -93073016, -96052648, -95194192, -91170344, -84228600, -75784160, -68624448, -64906084, -64931316, -67952824, - -73216848, -80197776, -88596584, -98254896, -108864536, -120063128, -131917240, -144824688, -158827888, -173410384, - -187899456, -201657312, -214070304, -224739536, -233464752, -239878224, -243509072, -244260688, -242253872, -237237344, - -228833168, -217214752, -202791168, -185459904, -165003520, -141917536, -117023360, -90644744, -62943284, -34586836, - -6352794, 21360482, 47988208, 72470056, 94116152, 113059648, 129223216, 141668960, 149715584, 154010544, - 155682896, 154889408, 151030912, 144291568, 136228304, 128406640, 120784680, 112138376, 102228272, 92739080, - 85502600, 80518824, 76525576, 72917808, 70152384, 68733432, 68791952, 70391296, 73414416, 77299744, - 81420768, 85580448, 89894200, 94476936, 99248640, 103607496, 106430904, 106961328, 105525200, 102881648, - 99245416, 94438816, 88469880, 81362248, 72924784, 63197760, 52652540, 41703060, 30578556, 19728932, - 9671193, 468151, -7982197, -15341086, -21146272, -25388626, -28208808, -29520920, -29410862, -28273770, - -26246546, -23247584, -19720342, -16474958, -13775571, -11426224, -9436580, -7648263, -5215701, -1505386, - 3038689, 7768522, 12746926, 18064096, 23278186, 28182502, 33059438, 37783900, 41834592, 45306000, - 48689896, 51856900, 54507428, 57112328, 60180008, 63370632, 66406636, 69755104, 73511048, 76987824, - 80063024, 83345984, 86687472, 89292904, 91239600, 93041336, 94253592, 94427000, 94436664, 95038496, - 95600600, 95852936, 96855272, 98945848, 101201776, 103691784, 107325328, 111333608, 114234856, 116669568, - 119715768, 122031832, 122400664, 122425360, 123050280, 122258928, 119496192, 117220392, 115557168, 112020800, - 107722072, 105553656, 102967544, 96880504, 92161944, 92340184, 89240832, 78376176, 72368592, 77343768, - 74270184, 53761180, 44733160, 64812668, 69371240, 11631308, -66325568, -77721728, -18441516, 31005906, - 32542968, 30531848, 48058000, 36233416, -32217086, -97196184, -92901752, -39170100, -446140, 4465156, - 5751498, 25180856, 52560736, 61572652, 29836600, -35614404, -84488984, -65874060, 5120138, 56609280, - 47454020, 10870025, -4068408, 2501819, 12885, -17770964, -29529510, -23487028, -8164196, }, - }, - { - { - 2309082, - -7234873, -37503116, -60254632, -48443472, -12577275, 10147397, -2160369, -35461936, -59278600, -56376276, - -31350576, 663036, 27338540, 45566920, 60905320, 80859200, 106576392, 131569344, 148690160, 155850944, - 154335888, 145383568, 131094216, 115861040, 103072232, 91095184, 75183400, 53037476, 26343718, -2804077, - -34502548, -69370168, -106144752, -142213344, -175659328, -205599552, -230928576, -250000912, -261924288, -267514720, - -268606720, -266771696, -262940576, -257793056, -251920240, -245549184, -238379280, -229870944, -219733216, -208211968, - -196043248, -184249264, -173954224, -166030016, -160578624, -156850064, -153904784, -151193584, -148343344, -144844544, - -140460464, -135593184, -130700152, -125659472, -120207544, -114529064, -108797968, -102629320, -95687040, -88352312, - -81032072, -73312408, -64610804, -55194624, -45687716, -36024576, -25857314, -15668041, -6466074, 1472100, - 8615168, 14911053, 19421306, 21477520, 21525302, 20476256, 18765248, 16413218, 13526999, 10101763, - 5584531, -674310, -8546985, -17314624, -26815092, -37737732, -50499152, -64369748, -78146928, -91418912, - -104832632, -119221312, -134563472, -149674240, -163011728, -174004688, -183435904, -192284608, -200426256, -206776368, - -210514064, -211870192, -211941072, -211923344, -212261584, -212319568, -211092272, -208314496, -204679344, -201145136, - -198363072, -196546288, -195386656, -194201776, -192571840, -190721776, -189060160, -187668592, -186454192, -185362736, - -184190752, -182566704, -180319376, -177512608, -174104560, -169967968, -165173712, -159845792, -153880096, -147178336, - -139914464, -132272104, -124278640, -116138064, -108303504, -101065952, -94503776, -88835496, -84283904, -80689552, - -77795816, -75673032, -74375952, -73611448, -73210936, -73373608, -74038256, -74690552, -75090520, -75417480, - -75559752, -75160856, -74377024, -73704320, -73223288, -72819024, -72660648, -72660648, -72174776, -70936216, - -69346544, -67405216, -64584496, -60988536, -57164940, -52844740, -47495360, -41670308, -36098128, -30372398, - -24268176, -18858128, -14650133, -10692321, -6896107, -4516695, -3376918, -2033130, -936303, -1328756, - -1907502, -1430761, -2157147, -5008469, -6088116, -4768488, -7297150, -14030048, -15298137, -10843182, - -15439871, -29652454, -29951492, -12583717, -16997334, -66874788, -116566488, -107866496, -57849988, -30122216, - -35472672, -31592706, -14981920, -32949378, -91176784, -126126544, -98512592, -49836116, -31690954, -34299608, - -22535694, 5040681, 32548872, 61380452, 87701088, 79558360, 20339354, -48292076, -69578472, -44501768, - -23336704, -32086090, -45628660, -37964828, -24686936, -36248452, -67124968, -75412112, -33794412, }, - { - 2309082, - -7234873, -37503116, -60254632, -48443472, -12577275, 10147397, -2160369, -35461936, -59278600, -56376276, - -31350576, 663036, 27338540, 45566920, 60905320, 80859200, 106576392, 131569344, 148690160, 155850944, - 154335888, 145383568, 131094216, 115861040, 103072232, 91095184, 75183400, 53037476, 26343718, -2804077, - -34502548, -69370168, -106144752, -142213344, -175659328, -205599552, -230928576, -250000912, -261924288, -267514720, - -268606720, -266771696, -262940576, -257793056, -251920240, -245549184, -238379280, -229870944, -219733216, -208211968, - -196043248, -184249264, -173954224, -166030016, -160578624, -156850064, -153904784, -151193584, -148343344, -144844544, - -140460464, -135593184, -130700152, -125659472, -120207544, -114529064, -108797968, -102629320, -95687040, -88352312, - -81032072, -73312408, -64610804, -55194624, -45687716, -36024576, -25857314, -15668041, -6466074, 1472100, - 8615168, 14911053, 19421306, 21477520, 21525302, 20476256, 18765248, 16413218, 13526999, 10101763, - 5584531, -674310, -8546985, -17314624, -26815092, -37737732, -50499152, -64369748, -78146928, -91418912, - -104832632, -119221312, -134563472, -149674240, -163011728, -174004688, -183435904, -192284608, -200426256, -206776368, - -210514064, -211870192, -211941072, -211923344, -212261584, -212319568, -211092272, -208314496, -204679344, -201145136, - -198363072, -196546288, -195386656, -194201776, -192571840, -190721776, -189060160, -187668592, -186454192, -185362736, - -184190752, -182566704, -180319376, -177512608, -174104560, -169967968, -165173712, -159845792, -153880096, -147178336, - -139914464, -132272104, -124278640, -116138064, -108303504, -101065952, -94503776, -88835496, -84283904, -80689552, - -77795816, -75673032, -74375952, -73611448, -73210936, -73373608, -74038256, -74690552, -75090520, -75417480, - -75559752, -75160856, -74377024, -73704320, -73223288, -72819024, -72660648, -72660648, -72174776, -70936216, - -69346544, -67405216, -64584496, -60988536, -57164940, -52844740, -47495360, -41670308, -36098128, -30372398, - -24268176, -18858128, -14650133, -10692321, -6896107, -4516695, -3376918, -2033130, -936303, -1328756, - -1907502, -1430761, -2157147, -5008469, -6088116, -4768488, -7297150, -14030048, -15298137, -10843182, - -15439871, -29652454, -29951492, -12583717, -16997334, -66874788, -116566488, -107866496, -57849988, -30122216, - -35472672, -31592706, -14981920, -32949378, -91176784, -126126544, -98512592, -49836116, -31690954, -34299608, - -22535694, 5040681, 32548872, 61380452, 87701088, 79558360, 20339354, -48292076, -69578472, -44501768, - -23336704, -32086090, -45628660, -37964828, -24686936, -36248452, -67124968, -75412112, -33794412, }, + { + {-135, 142, 36, -77, -34, -171, -46, 144, -76, -55, 45, -22, -5, 9, -46, -37, 175, 85, -21, 9, -26, -52, 24, 63, 96, -24, 37, 45, -154, -47, 0, -30, 95, 9, -32, 85, -65, 29, 132, -73, 9, 18, 101, -38, 139, -196, -71, 86, -39, -166, 12, 34, 56, 57, -18, -71, 6, -65, -44, 20, 82, 76, -110, 98, -121, 109, 6, 95, -37, -78, -35, 64, -12, -16, -19, 89, -95, 49, 23, 24, 30, 71, 23, -46, -51, -28, 39, -8, -38, 7, -46, -10, -3, -47, -19, -26, + 6, 25, -31, -23, 13, -7, -45, -1, 25, -18, -2, 9, -4, 18, 13, 1, -34, -11, 1, -16, 1, -4, -24, 13, -40, -467, 153, -170, -68, -139, -143, 81, -48, -120, -65, 164, 244, -133, -50, -12, -175, -165, 12, -17, 107, 36, 80, -70, -44, -91, 26, 157, 68, 31, -101, 77, 23, 47, -66, 6, 23, 35, -90, -66, 25, -124, -127, 54, 96, -108, -54, -42, 8, 96, 77, 34, 15, 248, 97, -78, 97, 69, -69, 117, -44, -29, -1, -51, 104, -59, 27, 63, 50, -93, 37, 17, + 19, -32, -46, -19, 146, 10, -43, -31, 34, -131, 25, 78, -5, 50, -29, -47, 32, 29, -12, 49, 25, -14, 35, 36, 61, 8, 0, -4, -18, -26, -3, -5, -16, 18, -6, 61, 355, 141, -25, 16, 81, 42, -24, -154, 5, 136, -140, -16, -262, 69, 107, 7, -63, 192, 135, -124, 60, 7, -108, 171, 94, -11, 69, 163, -51, -34, 11, 1, 4, 39, 200, 40, 30, -324, -17, 15, 39, -147, 34, -118, -91, -125, -82, 1, 38, -76, 76, -186, -107, -11, -3, 60, -75, -17, -67, 40, + 101, -61, 11, -53, -10, 156, 122, -49, 115, -55, -98, -122, -9, -11, -82, 74, -13, 21, -9, -27, 6, -18, -67, -4, -106, 12, -52, -34, -89, 104, -32, 35, 71, 28, -36, -8, -41, -3, 18, -40, 41, -3, 4, 6, -15, 24, 14, 8, 3, 59, 28, -19, -40, -36, 35, 48, 0, 12, 560, -244, 46, -20, -103, 89, 157, -102, 169, -9, 180, 50, 64, -78, 102, 40, 105, -221, 118, -130, 41, -109, 139, -38, 139, -82, 51, -54, -12, -6, -14, 55, 290, 13, 85, -80, -134, 6, + 3, 6, 44, -93, 190, -12, 159, 11, -69, -87, -239, 118, 78, -112, 13, 96, 51, -278, 166, -9, 118, -167, -180, -87, -175, -32, 203, 42, -78, 12, 115, -38, -92, -48, -103, 74, -157, -27, -120, -46, 0, 135, 63, 15, 42, 170, 89, 21, 62, -47, -19, 12, 3, 28, 14, -28, 17, 60, -4, 14, 22, -28, -39, 38, -47, 56, 33, 52, 1, -19, 32, 52, 13, -20, 17, 147, -344, 70, -108, -314, -242, 129, 144, 189, -94, -49, 130, 62, 195, 63, -22, 20, 124, 242, -62, 71, + -3, 196, 45, -12, -39, -149, -227, 3, -33, 68, -13, 54, 40, 14, 15, 45, -78, 9, 108, 169, -83, 20, -73, -97, 140, -107, -267, -105, -68, 128, 11, 142, 130, -69, 6, -111, -15, -48, 166, -209, -6, 70, -221, -249, 4, 77, 158, -110, -263, 137, -243, 284, 161, 47, 121, -3, -117, 361, -33, 175, -7, 253, 174, 92, -26, -49, -85, -31, 38, 9, 70, -71, 44, -38, -26, -27, -29, 34, -18, -1, -53, -2, 33, 61, -61, -75, 11, 33, 0, 40, -22, 5, -29, -9, 21, 38, + 46, 28, -36, -761, 156, 38, -382, -482, -78, -372, 302, 86, -225, 14, -105, 33, -154, 19, -9, 2, 213, -77, -50, -89, -79, -201, -135, 202, -84, 127, -113, 55, 3, 115, -118, 87, -118, 51, -45, -74, 73, -188, 72, -96, -35, -137, 331, 157, 290, -124, 122, 98, -58, 51, -137, 145, 318, 251, -175, -47, 74, -127, -85, -222, -415, -141, 213, 76, -102, 42, 22, -113, -197, -199, 142, 16, -305, 32, 30, -15, -23, 101, 221, -23, 0, 31, 0, -58, -202, 67, 68, 42, 94, 57, -86, 22, + -54, 11, -46, -18, -51, 1, 12, -6, -37, -36, -11, 16, -1, 74, 27, 69, 75, 81, -97, -99, -37, 74, -25, 27, -29, 41, 43, 28, -47, -27, -298, -124, -77, 225, -59, 54, -232, -242, 12, 70, -142, -81, -133, 276, 61, -92, -201, -198, -194, -54, 94, 277, 90, 157, -124, 295, 169, 55, 4, 304, -176, 29, 97, 206, -331, -168, 146, 59, -45, 347, -151, 99, 210, 66, 36, 153, 63, 77, 79, 34, 91, -4, 133, -30, 325, -234, 267, 212, -183, 210, 40, 179, 181, -395, -9, -15, + -118, 64, -106, 110, -44, 253, -26, 40, 105, 72, 102, -160, -53, -164, -151, -87, 247, 37, -76, 73, 69, 32, -40, 26, -28, 97, 38, 31, -45, 30, -90, -8, 109, 56, -16, 36, 40, -29, 47, 31, 106, 58, -56, -23, -32, 32, -90, 27, 398, -103, -60, -96, 284, 150, 32, 109, -190, 424, 141, -32, 161, 205, -344, -22, 83, 42, 1, 293, -139, -176, 403, 62, -27, -39, 211, 17, -29, -38, -96, 106, -59, 141, 99, -251, -238, 31, 475, -4, 98, -291, 146, 196, -120, 146, 180, -295, + -180, -36, -379, -200, -226, 68, -77, -83, -41, 268, -365, 163, 81, -117, 224, -142, 22, -306, -5, 187, 168, 351, -413, -101, -459, -97, -8, -108, 52, -21, 419, 326, 184, -207, 11, 82, 204, 252, -5, 3, -35, 7, 143, -6, -12, -4, 3, 9, 18, 59, -59, -17, 60, 11, 55, -1, 6, -47, 76, 48, 1, 73, -36, -3, 66, 19, -11, -81, -6, 20, 12, -28, 85, 144, -26, -3, -65, 49, 272, -302, 12, -184, 521, -218, -125, 452, 341, 65, -627, -152, 291, 25, -29, -88, -48, -47, + 45, 99, 90, 86, 558, -114, -79, 2, 74, -164, 99, 61, -19, -181, -113, 203, 217, 409, 106, -166, 104, -3, 106, 10, 228, -187, -280, -288, 191, -81, 41, 78, -102, -17, 485, 167, -407, 292, 94, 492, -253, -238, 143, 266, 183, 104, -44, 18, 127, -157, -45, 7, 209, -149, 419, -13, -4, -214, -243, 480, 143, -390, -90, 332, 230, 48, 84, -197, 64, 55, 65, 39, 72, -90, -110, 17, -2, -90, -29, 88, 85, -121, 34, 2, 55, 76, -19, -19, -29, 52, 148, -104, 82, -4, 5, -60, + -13, -44, -30, 73, -23, -38, -94, 0, -53, -376, -319, -127, 112, 115, 572, 555, -68, 41, 21, 0, -10, -119, -378, -292, -152, 129, -108, -330, -95, 58, -27, -504, -150, 106, -54, 43, 32, 146, 217, 31, -162, 158, 166, 114, -9, 214, -441, 142, -391, 479, -346, 128, -367, -65, -410, -220, -256, -280, 186, -247, -49, 80, -5, -134, -95, -47, -400, 8, 24, 192, -623, 9, -18, 285, 346, -242, -147, 8, 266, -520, 328, -237, -155, 20, -502, -32, -42, -84, -91, -68, 500, 199, 101, -126, -114, -132, + 14, 117, -202, -12, -37, -60, 25, 142, -57, -101, 92, 51, -3, 98, 55, 81, -54, -74, 125, -98, 31, -127, -24, -2, -25, -52, -106, -123, -124, 23, -7, -34, -89, -91, -35, -52, 27, 118, 90, -298, -772, -310, -149, 131, 205, -255, -98, -321, -283, 145, -249, 251, 101, 179, -33, -253, 434, 170, 242, -316, 130, 54, -457, 278, 166, 13, -312, -123, 150, 158, -10, 52, 218, -220, -163, 256, -521, -515, -675, -155, 213, -594, -495, -303, 7, 208, 64, 55, 7, -175, -239, -562, 290, 78, 671, -166, + 14, -423, -503, 58, 319, 17, -318, 202, 81, 454, 42, 52, -226, -48, 192, -457, -847, -241, -214, 40, 219, -410, -208, 126, -144, -39, 129, -84, -71, 167, 40, -22, 83, 128, 148, 22, -104, -274, -27, -170, 42, 23, 32, 105, -98, 94, 136, 86, 76, 71, -201, -189, -71, -164, 16, 38, 51, 179, -45, 111, 71, -86, -42, -121, -155, -49, -204, -74, -46, -720, -554, -255, 380, -33, 651, 129, -57, -366, 130, 671, -703, -633, -209, -105, -441, 418, 122, 227, 270, -441, -53, 177, -279, 521, 7, 118, + -153, 129, -345, -196, -119, 196, 91, 317, -520, 47, -6, -386, 421, -252, -619, 123, 221, 46, -186, -44, -259, 44, 208, 91, -424, 167, -98, -467, -279, -574, 10, -88, -18, 76, 350, 440, 362, -185, -321, 107, -84, -52, -250, 459, 374, -79, 699, -446, 231, 445, 473, 15, 299, -194, -81, -390, -170, 238, -84, -303, 187, -172, 196, -87, -213, 112, -46, -116, -96, 83, -106, 73, 137, -145, 187, -20, -109, 75, 18, 17, -92, 117, -176, 63, 59, 12, -119, -7, -73, 92, 153, 349, 169, 280, -20, 3, + 135, -169, 41, -232, -103, 263, -625, 79, 7, -395, 57, -879, -760, -182, -7, 32, -20, -313, -12, -90, 281, 55, -18, 53, -665, 229, 123, 368, 152, 159, 432, 215, 62, 1082, 231, 416, 573, 27, 404, 101, -226, 263, 18, 127, -221, 16, -144, 92, -144, 305, 36, -190, -238, 32, -644, 373, 251, -33, -59, 147, -172, -142, -212, -254, 211, -203, 350, 408, 399, 425, -100, -645, 9, 272, 649, -151, -25, 308, 453, 670, -88, 295, -200, -115, -540, -420, -185, -191, -156, 112, 21, -231, 259, 164, 203, 368, + 145, 138, -46, 0, -57, -106, 1, 66, -2, 194, 153, 95, -14, -160, 6, -115, -130, 81, 95, 29, -202, -45, -292, -71, 91, 142, -96, 118, -169, -193, -101, -117, 102, 55, -173, -117, 531, 689, -510, -533, -705, 640, -64, -255, 224, 217, 600, 501, 36, 549, 778, 224, -390, 376, -361, -200, -71, -251, -302, 164, -150, -147, -365, 847, 110, -443, 5, -55, 382, 404, 162, -256, 407, -103, 254, -764, 46, 327, -325, 117, -354, -287, 802, 337, 246, -49, -700, -165, 210, 159, 120, -160, 566, -387, 317, -178, + 212, 234, 450, 607, -691, -11, 364, 181, 510, 496, -690, 9, -187, -354, -17, -370, 161, 296, -135, 530, -112, -306, -373, 333, 380, 379, -96, 72, -16, -532, -516, -483, 309, 159, 103, 250, -10, -129, 374, 58, 3, 233, 363, 223, 33, 46, -100, 224, 114, 464, -37, 62, 327, 267, 95, -38, 211, 0, -37, 367, -283, 22, 228, 25, -61, -102, -50, 6, 246, 52, 23, 273, 199, -164, 527, 1057, 39, -514, 137, -346, 214, -302, -325, 960, -740, 1207, 737, -185, 238, 580, 79, -920, 353, -746, 170, 61, + -372, 10, -56, 524, -271, -31, -27, -166, 1110, -69, -174, 139, 370, -385, -810, 630, -108, -53, 717, -429, -124, -511, 129, -358, 402, 373, 764, -224, 209, 511, -737, 86, -472, -737, -945, -497, -1022, -1144, -167, 71, -544, -580, 351, -43, -332, -625, 442, -335, 110, 564, -1074, -310, -204, 472, 1268, -605, 29, -384, -574, 273, -685, 544, 942, -272, -452, -471, -127, -113, 1, 308, 218, -250, 243, -32, 189, 11, -239, -65, 270, -462, 208, -242, 55, -196, -85, -277, 54, -266, -425, -199, 89, -307, -10, 95, 446, -261, + -163, 152, 177, -326, -215, 96, -100, -172, 308, 59, -260, 226, 52, -381, 65, -312, 341, -155, -495, -732, -556, 613, -503, 247, 584, 248, 375, -699, 1002, 629, 547, -405, 718, -81, 475, 310, 105, 257, 349, 210, -117, -181, -160, 70, -482, -572, 320, 139, 186, -471, 128, 140, 351, 520, 787, -448, 119, 1117, 242, 117, 108, -235, 82, 1111, 324, 718, 206, -777, -321, -567, 1618, 653, -625, -396, -557, 90, -365, -884, 202, -671, 991, -75, -819, 1075, 877, 119, -237, 142, -499, 660, 1190, -324, 565, 1324, -209, -223, + -151, 802, -58, -453, -419, -433, -7, -60, -371, 22, -155, 400, 102, -400, -246, -455, -48, 52, -72, -322, -348, -258, 220, 359, 58, -394, -55, 477, 4, 436, 235, -262, -22, -400, 382, 158, -500, -954, 87, -74, -285, 296, -2, -179, -134, 82, 26, -53, -767, 303, -106, 759, -1591, -1092, 628, 300, 227, 534, -544, -708, -391, -584, 329, -626, 182, 415, 682, 22, 571, 332, 93, -183, -599, -422, 347, -731, 371, 85, 621, 474, -234, -910, -592, -55, -47, -241, 622, -1101, -86, 38, -1154, -23, -143, -92, 122, 675, + -659, -1812, 675, 738, 439, 1413, -1164, -149, 783, 600, -731, -339, -203, 1112, 218, 1062, -1537, 224, -1834, -1097, -1064, 1260, 398, -812, 738, 87, -715, 726, -1069, -1120, 166, -1163, 344, -1986, 302, 628, -848, 931, -423, -223, 620, -214, -173, -442, -35, 147, 341, -40, 317, 627, -473, -50, -377, 224, -247, -64, 134, 79, 81, -81, 643, -212, 50, 278, -573, -499, -556, -255, -934, -425, -344, 804, 155, 716, 304, 147, 321, 229, 25, 274, 54, 558, 1373, 508, -492, -321, 190, -348, -409, -48, 639, -111, 120, -679, -141, 940, + -685, 520, 1226, 614, -52, -233, -403, -783, -576, 676, -385, 634, 456, 218, 30, 248, -196, -995, -346, 714, 565, 593, -631, 1089, -281, 424, -805, 738, 1268, -254, -453, -46, 46, -281, 276, 556, -1042, 685, 662, -161, 767, 409, 330, -485, 99, 689, -1451, -1290, -539, 344, -669, -1962, 821, 541, -256, -331, 13, -113, -675, -1804, -111, 1285, 309, -226, -155, 279, 1048, 838, -1234, -506, 820, -171, -332, -1405, -84, 775, 254, -214, 473, -174, 48, -528, -90, 325, 482, -272, -103, 103, 277, -170, 170, 26, -348, 211, 586, 105, + 173, 114, 263, -274, -490, 51, 522, -427, 185, -142, 44, -414, -809, -434, 297, 986, -104, 468, -655, -282, -444, 276, 186, 314, -225, -329, -28, -32, 669, 886, 21, -997, 1323, -370, -921, 828, -131, -501, 641, 172, -132, 541, -738, 703, -249, 25, -214, -183, -1030, 409, -392, 164, -412, -33, -307, 296, -179, 1115, 198, 729, -282, 183, 462, -194, 320, -62, 558, -27, -186, 881, -785, 440, 603, -352, 682, -416, -16, 351, -265, 801, 717, 150, 1193, -734, -1681, -282, -1039, -687, 2457, -62, 755, -114, -1036, -26, 1033, 1463, + 890, 1474, -792, -236, -354, -841, 559, -236, -519, -54, -1020, -1866, 471, 658, -551, 372, -115, -556, 595, 438, -216, 612, -224, -545, 281, -271, 726, 69, 55, 411, 138, -462, -193, 238, -151, 453, -630, 407, -661, -168, 166, -469, 300, 19, -703, -114, 46, -188, -1, -131, -515, 212, 155, -82, 518, 795, -433, -620, -39, -296, 862, 886, -521, 750, -789, 948, -571, 131, -1, 99, -728, -112, -658, -545, 3, -214, -497, -198, 366, -424, 337, -200, 1021, -472, 306, 62, -252, -818, -299, 624, 114, -203, 818, -604, -609, -83, + 781, -709, -98, 140, 213, -790, 239, 275, -282, -826, 16, -642, 273, 147, 248, -1264, -539, 722, 1946, -880, -121, 157, -327, -548, -10, 1624, 375, -165, -141, -429, -98, -328, 631, 33, -401, -432, 24, 292, -646, 506, 151, 552, 24, 702, 296, -489, 660, 629, 1558, 496, 123, 161, -566, 191, 511, 527, 184, -35, 23, -62, 198, 220, -49, 284, -70, -28, 540, 230, 95, -159, 162, 409, 431, 494, 182, 182, -273, 0, -13, 92, 281, -10, -217, 254, -227, 212, -7, 250, 41, -201, -52, 19, 61, 126, -25, 90, + 71, -1, -1234, 1641, 227, 374, 394, -378, -436, 17, -168, 234, 541, -758, 252, -159, 198, 186, 129, 434, 339, -323, 305, 266, -262, -452, 139, -160, -375, 226, 185, -31, -245, 8, -179, -86, 18, 99, 173, -338, -50, 273, -121, 245, 47, 177, 357, 107, -364, 40, 340, -192, -18, 166, -579, -34, -143, -538, 745, -188, -31, 444, 76, -331, 131, -316, -64, 248, -298, -106, 551, -584, 62, 55, 200, -258, 177, -87, 165, -221, 10, -52, 555, -252, -25, 147, -281, -25, 384, -79, 247, -167, -160, 31, 148, -144, + 283, 1, -63, -59, -90, -87, 241, -203, 236, 133, -313, 78, -32, -23, 183, -256, -105, 41, -174, 183, -179, -23, 292, 56, -56, 137, -148, -113, -72, 146, 244, -72, -72, 31, 383, -1626, -3306, -427, 2073, 1594, 4578, 2202, -1070, -935, -2174, -3807, -483, -1477, -459, 2686, 1712, 1827, 3496, -124, -776, -1320, -3459, -1910, -616, -644, 95, 1572, 1216, 1291, 2436, 1425, -899, 1299, -1367, -3188, 407, -2140, -2979, 1160, -257, -553, 3661, 1199, 973, 3156, -341, -623, 959, -2118, -2630, -708, -2252, -2012, 425, 435, 907, 2751, 2436, 1475, 1746, 337, + -1380, -1486, -1839, -2527, -1181, -642, -860, 763, 2434, 1589, 1569, 1290, -912, -11, 256, -2089, -862, -524, -612, 956, 489, -121, 781, -182, -164, 132, -564, -425, 276, -350, 565, 711, -268, 385, 724, -425, 474, 237, -1421, 251, -463, -1544, 22, -882, -790, 1122, 1213, 1172, 2172, 692, 690, 736, -952, -1896, -2117, -2708, -2018, -609, 352, 1641, 2720, 3016, 2355, 1718, 339, -1600, -2412, -2944, -2737, -1418, -91, 771, 1951, 1798, 978, 979, 377, -29, -14, -299, -573, -470, -577, -690, -500, -342, -76, 185, 437, 514, 541, 491, 352, 159, -21, -276, + -418, -435 }, + {-32, 82, 142, -106, -92, -142, 129, 64, 11, 190, -19, -2, -58, -47, 41, -51, -99, 56, 16, 159, 217, -57, -128, -158, -10, -90, -87, -60, -12, -126, 121, -45, -47, -83, -61, 23, 136, -14, -39, 41, -134, 100, -83, -299, 148, 99, 165, 171, 32, 90, -89, 25, 129, 10, -2, -31, -17, 69, -63, -46, 3, 66, -55, -68, -100, 128, 51, 16, -31, -128, -5, 96, 59, -18, -24, 96, -12, -7, -42, -40, -59, -69, 4, 15, 33, -71, -28, 40, -49, 43, 11, 19, -19, -1, 9, 21, + 5, -8, 13, -9, -24, -8, -40, 27, 14, -12, 0, -18, 24, 25, 8, 2, 9, 9, -25, 1, -5, -6, -10, -3, 14, -449, 233, -23, 6, 81, 114, -168, -22, -31, 95, 36, -103, 318, -35, -21, 141, 116, 37, 80, 260, -130, 7, -67, 25, -81, 6, 7, 29, -145, 12, -35, -55, -7, 90, -51, 84, 122, -213, 28, -87, -24, -131, 64, -78, -14, -44, -134, 50, -90, 60, 33, -66, -97, 2, 89, 67, 162, 75, -71, -201, -14, 35, 252, -79, -39, -3, -50, -132, -64, -123, -17, + 101, -24, 121, 77, 62, 87, 15, -159, -38, -103, -65, -176, -7, -51, 23, 47, 20, -27, -36, 5, 46, -40, -11, 0, -15, -5, -17, 18, -61, -22, -15, 1, -6, -12, 0, -86, 327, 170, -53, -132, 187, -219, -37, 121, -91, -66, -95, 216, -77, 66, 18, 66, 295, -297, 88, 148, -100, -275, -144, -19, 16, -39, -51, 115, 166, -14, -119, 9, -151, 44, -95, 53, 178, 65, -181, -5, 10, 268, 49, 134, -39, 59, 46, -324, 4, 153, 70, 171, -153, -93, -152, 41, 96, -31, 32, 8, + -77, 29, -58, 52, 48, -11, 78, 16, -13, 35, 192, 36, 100, 126, 69, 3, -4, -181, -1, 193, 67, 86, -4, -13, 120, -90, 9, -8, 61, 33, 0, -78, 12, -39, -12, 14, -26, -18, 18, -2, 62, 27, 56, 28, 17, 31, -24, -31, 3, 4, 71, 44, 10, 25, 67, -11, 6, 22, 675, -174, -63, -102, 138, 92, 230, 91, -34, 110, -5, 123, 48, 171, 3, 144, 187, -208, 37, 54, 34, 33, 46, -123, -1, -142, -21, -5, -241, -163, 60, -1, -9, 96, 93, -49, -208, 62, + 187, 123, 174, -47, 94, 173, -289, 92, 126, -143, 178, -124, -27, 18, 35, -96, 84, -25, -33, -100, -82, 100, 100, 45, 98, 154, 84, 214, -46, -240, 232, 38, 114, 49, -40, 61, 44, 10, 159, -49, 157, -226, -53, 30, 70, 16, -124, -57, 20, 7, -14, 8, 47, -60, -35, -34, -45, 26, -14, -16, -37, -26, 68, -16, -24, 0, -25, -19, 34, -13, 36, -7, 2, 30, -9, 299, -344, 228, 48, 233, 54, -132, 43, 180, -216, -46, 24, -243, -48, -187, -115, -137, -150, 63, -232, -145, + -185, -48, 178, 64, -223, -87, -233, -58, 50, 333, -269, 110, -69, -99, -201, 9, 34, 213, 112, 26, -182, -316, -5, 92, 248, 86, 79, -184, 66, 155, 12, 23, -98, -98, -33, 90, 16, -64, 2, -202, -29, -171, 107, -37, 107, -167, -141, -230, -27, -148, -64, 58, -223, -97, 26, 122, -267, 155, -126, -136, -142, -120, 80, -81, 37, 45, -71, 9, 55, 42, 3, -64, -10, -31, -72, -14, 53, 30, -36, 48, -42, -33, -8, 16, -54, 3, -7, 35, 28, 59, -48, 13, -11, -22, 19, -56, + -20, 27, 15, -834, 134, 95, -241, -54, -1, 8, -46, -80, -62, -248, 191, -120, 26, -207, -74, 299, 271, -172, -104, 9, -5, -141, -165, -117, 19, 13, 5, -17, 69, -204, 63, 7, -360, -43, -108, 164, 240, 38, -43, 12, -211, -264, 141, 261, 290, -78, 53, 170, 175, -90, 161, 263, -12, 222, 187, -220, 72, 13, 237, -145, -156, 137, 179, -55, 15, -260, 182, -145, 193, -323, 34, 77, 154, 11, -136, -276, -170, 233, -230, -10, 25, 126, -70, -48, 97, -184, -161, 66, 43, -13, 131, -61, + 30, 35, 34, 51, 10, -51, 31, 69, -29, 10, -15, -34, 27, -85, -13, -91, -19, -17, -31, -46, 18, -26, -2, -71, 28, -12, 24, 30, 10, 13, -323, 115, -286, 362, 348, 11, -471, 195, 27, -88, 325, 1, -281, -30, 354, -444, 14, -111, -350, -97, 6, -69, -179, 103, -149, 121, -127, -237, 126, -18, 181, -353, 144, 278, -112, 23, 279, 408, -109, -84, -344, 20, -284, -23, -198, 10, 28, 165, 79, 151, -109, 28, 93, -18, 377, -250, -124, 496, 498, -98, -31, -313, -160, 16, -87, -207, + 301, 93, -78, 442, 86, -212, -6, -406, -204, -230, -197, -54, -317, -229, 131, 121, -23, 71, -94, 106, -71, -104, 18, -149, -68, 191, 15, 96, -51, 20, 15, 45, 41, -8, -4, -95, -1, 20, 15, -27, -27, 64, 19, -14, 2, -16, 2, 36, 402, -106, -3, 277, -65, 164, -88, -349, -22, 2, -71, -206, -231, 122, -182, 326, -99, -234, 202, 408, -100, 115, -108, 236, 6, -493, 177, 276, 28, -81, -286, 242, 162, 157, 33, 99, 324, -226, 41, 65, -179, -346, 332, 186, 618, -30, 273, -89, + -193, 34, -29, -7, -54, -200, 444, 12, 36, 64, -61, 365, 47, 306, 128, 53, 327, -152, -364, -71, 69, 48, -150, 180, -107, -511, 47, 103, -282, 133, -28, 56, 2, -115, -127, 0, 49, 157, -13, 45, -59, -44, 72, 47, -8, 48, -51, -5, 5, -69, -100, 64, -111, -28, -48, -98, -26, -12, -35, 44, -16, -41, -11, 189, 75, 72, -37, 27, -58, -76, -24, -26, 34, -50, 92, -117, -36, 26, 324, -538, 88, 241, 359, -377, -54, 256, 178, 218, 39, 461, 85, 191, -57, 27, 190, 104, + 219, 17, -305, -444, 236, 114, -85, 52, 132, -415, 4, -262, 123, -14, 272, -87, 122, -63, 71, 37, -12, 153, 205, 73, 119, -326, 135, -57, -568, -377, 97, -415, -29, 343, -250, 681, 246, -137, 369, 17, -121, -275, -272, -378, -59, 221, -270, -34, 245, 112, 138, 499, 61, 326, 2, 64, -536, 148, 40, -488, -462, 266, -176, 31, 140, -79, -126, 28, -28, -33, 28, -87, 78, -63, 17, -154, 83, 26, 34, -8, 190, -154, 13, -43, -39, 38, 39, 53, 91, 153, 94, -98, 24, -12, 139, -46, + 90, -142, -108, -82, -69, -9, -8, 71, 83, -279, -7, 178, -1, 125, -286, 225, -16, 67, 210, -387, -265, 72, -4, 215, 441, -39, 111, 474, -174, -319, -17, 347, -73, -397, 34, 148, -77, -123, -28, 513, -96, 442, 334, 403, 24, 34, 237, 80, -80, 84, -317, 242, 405, 254, 36, 226, -175, 174, -170, 254, -226, 6, -16, -16, 718, -106, -38, -61, 101, 199, 379, 432, -233, 104, 430, -239, -297, 181, -128, 186, 820, -386, 57, 78, -211, 93, 269, 188, 24, -167, -402, 192, -174, 222, -150, 32, + -198, -43, -332, 29, -104, -117, -40, 41, 86, 166, 72, -94, -22, 170, -98, -87, 13, 13, -151, -1, -75, -37, -27, -27, 60, 37, 121, -76, -75, 9, -90, 43, 189, -94, -99, -186, 97, -47, -47, -277, -437, -336, -455, -175, 51, 364, 270, 98, 384, 115, 235, 216, -104, 333, 361, 255, -487, -273, -282, 106, -194, 14, 139, -141, -343, 222, -163, 79, 74, 350, -365, 568, -561, 580, -1, 291, -282, 103, -627, -349, -305, 277, 128, 401, -40, -1, -203, -503, 329, -275, -142, 239, 571, 552, 259, -37, + -373, 220, -573, -44, -325, 185, 619, -593, 217, 276, -369, -36, -63, 208, -245, -352, 71, -142, -518, 264, -51, -487, 362, 479, -157, 17, 68, -205, 311, 144, -87, -77, -203, -116, 249, 143, 142, -10, -224, -67, -76, -249, -53, 76, -15, -72, -22, -177, 24, -60, 122, 68, 26, -205, 171, 17, -89, -51, -33, -9, 101, -75, -31, 79, 210, 106, 62, -125, 168, -417, -487, -138, 314, -373, 247, -513, -92, -197, -181, -407, -36, -152, -245, 196, -273, 294, 62, 229, -360, -673, -56, 139, -282, -206, 110, 88, + -330, -156, 469, 228, -62, 257, 673, 24, 85, 69, -51, -11, 99, 91, -518, -188, -633, -200, -590, -278, 32, 690, 322, -341, -401, 258, 544, 345, -244, 418, -159, -31, -731, -217, -94, -90, -500, -800, 256, -1, -586, 150, 917, 120, 104, -579, -52, -8, 128, -650, 601, 95, 166, 333, 128, 361, -28, 169, -142, -281, -235, 124, -189, -59, -252, 85, 206, 4, 173, 20, -70, -3, -145, 101, 104, 19, 19, -99, -41, 55, 151, 110, -133, -47, -55, -304, -422, -310, -102, -39, 48, -72, -120, -129, -1, -87, + -113, -189, -103, 305, -189, 370, -562, -116, 132, -271, 644, -534, -550, -448, 623, 277, -364, -328, -220, -70, -198, -204, 29, 231, 615, -70, 261, 227, 220, -414, -516, -371, 429, -77, 522, 172, -60, -718, -586, -63, 45, -418, -262, -197, -202, -942, -207, -232, -341, -168, -224, -434, 301, 585, 324, 15, 344, 439, -159, 138, 110, 42, -21, -114, 306, 123, 516, -122, 49, 183, 1018, -13, 540, 685, -62, -600, 49, 595, 85, -511, -460, -585, 379, -478, -132, 683, -297, -459, 139, -126, 11, 186, -289, -129, 54, -86, + -133, -26, 50, 341, -35, -178, -155, -2, -134, -108, -98, -173, -84, 65, -85, -17, -237, 60, -25, 47, 231, 146, -141, 64, 48, -206, -317, 117, 123, 18, -324, -347, -58, -243, -82, -36, 576, 420, -966, 307, 386, -169, 280, 919, 76, 205, -321, 213, -339, -217, -181, 68, 237, 331, -47, 136, -100, -56, -177, 243, 867, -283, -279, 311, 219, 31, -630, 409, -502, 288, 362, 40, 92, -104, 597, 451, 6, 304, -238, 383, 65, 433, 633, -14, 161, -83, -233, -16, 276, 310, -603, -367, 142, 655, -317, 435, + 292, 84, -702, 85, 110, -839, 495, -470, -558, -1062, 259, 644, -291, -593, 123, 714, 456, 79, -93, 10, 253, -219, 337, 548, 523, -39, 222, 542, -85, -7, -59, 467, -68, 115, -218, 119, -134, 18, 7, -37, -105, 102, 276, 93, 79, -249, 64, -257, 78, 404, -147, 6, 54, -192, -250, -288, -65, 182, -84, 49, -174, -18, 7, -533, -136, -23, 113, 135, -110, 189, 101, 101, -158, -155, 237, 666, 483, -167, -1301, 153, 651, 311, 142, -571, -4, -394, 92, -38, 108, 196, 273, 116, -708, 410, -99, 124, + 537, 207, 100, -193, 666, -24, 662, -805, -237, 256, -469, -405, 28, -106, -367, 43, 585, -20, 38, -308, -641, -409, -183, 265, -71, 61, -315, -343, -168, 508, -351, 292, 196, 164, 56, -528, -751, -62, 502, -625, 301, -538, 336, -566, -29, -558, 789, -722, -432, 185, 129, 361, 301, -188, -100, -189, 97, -9, 470, -587, -233, -753, 388, -269, 28, -33, 204, -168, 76, -309, -468, 299, -243, 6, 76, 398, 158, -288, 60, -99, -371, -70, 85, 115, -336, -165, 367, -39, -312, -138, 431, -509, -174, 102, -120, 179, + -40, -224, -302, -98, -136, -95, -101, 81, -25, 187, -201, 103, 34, -92, 201, -1110, -158, 332, 81, -265, -396, 36, -377, -36, -582, 544, -218, 340, -757, -430, -16, 927, -759, -67, -594, -474, -145, 580, -135, 257, 271, -310, -659, 926, 403, -532, 102, 67, 256, -518, 463, -43, -971, 101, 194, 249, -805, -194, 101, 707, 135, 393, -1038, -633, 318, -2, 677, -183, -115, 50, 344, 313, 120, -1320, 371, -156, 302, 701, -222, -65, -803, 258, 363, -425, -251, 726, 1149, 298, 187, -328, -135, -630, 48, 6, -775, 280, + -23, -229, -59, 362, -297, -202, -35, -85, -28, 319, -139, 4, 185, 71, 255, 212, 163, 112, 305, 355, -479, 149, -299, 234, 36, -306, -205, -121, -100, -201, 184, -104, -196, 326, -52, -107, 188, 335, -1, -125, 94, 313, 344, 213, -112, 54, 65, 282, -953, -623, -215, -11, -543, 430, -1126, 54, -692, 358, -257, -769, -68, -208, -271, -876, -639, 182, 690, -464, 851, -727, -478, 155, -71, 385, -242, -254, -353, -100, -1195, -345, 34, -54, -200, -472, 374, -418, 638, -200, -80, -455, -418, -794, -346, 291, 120, -50, + 51, -287, -216, -369, -309, 159, 235, 108, -688, 784, 106, -344, 628, 447, 749, -145, 437, -1031, -557, -975, 987, -323, -691, -668, -1410, -593, 974, -68, -496, 353, -963, -648, 241, -61, -803, -788, -10, -455, 119, 162, -597, 576, -356, -526, 44, -314, 829, -325, 372, 54, 504, -263, -149, 43, -231, -14, -486, -373, -95, 196, 9, 330, 135, 243, -219, -7, -422, -109, -153, 120, 401, 179, 160, 185, 165, 38, -550, -170, -381, -101, 62, 252, 1229, 1574, -150, -699, -167, -264, -707, 304, 19, -512, 1505, 522, -357, -1044, + -94, 252, 275, 306, 720, -207, -356, 338, -1306, -873, -341, -94, 140, -697, -637, 671, 534, -411, -790, 501, 14, 885, -721, -166, -246, -45, -570, -849, 713, -527, -333, -649, -146, 429, 402, -262, 56, 75, 537, 824, 606, -1055, -508, -626, -157, 360, 131, -721, -1037, 880, 55, -861, -1431, 722, -187, 389, 358, 380, 49, 281, -564, -213, 385, 71, -265, 161, -69, -758, 381, -962, -65, -46, -169, -344, -136, 425, -31, -95, 215, -309, 935, -72, 81, -67, 7, 236, -18, 228, -482, 107, -91, -332, 31, 163, 309, -155, + 84, -796, -265, -41, -422, 359, -52, -93, -229, -325, -490, -677, 202, -65, 494, 597, 372, -400, -568, -709, -273, 659, 527, 96, 241, -223, -413, -300, 139, 551, 683, -850, -713, 2022, -165, -199, -305, -640, -71, 729, 1172, -542, -328, -120, -536, -134, -303, 465, -484, 533, 253, -184, -675, -50, -279, 1009, -557, -14, -1, -101, 454, -291, -41, 210, -141, -987, 501, -450, -524, -120, -559, -323, -1013, 966, 42, -644, -1187, 689, -701, -682, 6, -531, 236, 437, 1342, -383, 523, -114, -654, -553, -165, 2023, -1789, -131, 1855, -1702, + -649, 958, -145, -770, 1795, -891, -374, 826, 201, 352, -538, 596, 835, 393, -219, -55, 843, -124, 480, -12, 334, -485, -68, 223, 132, 93, 18, 34, 347, -162, 86, 130, 114, -762, -319, 244, -651, 194, 363, -273, -293, -222, 149, -312, 363, 313, -47, 181, -235, -458, -453, 888, 153, 554, 107, 110, 345, -303, -79, 565, -343, -771, 570, 962, -1211, 1100, -180, -673, 595, 213, -103, 130, 87, -125, 221, -229, -298, -132, -416, -346, -787, -297, 690, 650, -980, 337, 530, 445, -163, -967, -81, -475, -1133, 725, 1832, -1041, + -107, 1304, -362, -456, 1060, 789, 393, -419, -843, 290, -340, -530, 1918, 1413, -1147, -842, 1039, -1876, -656, -526, -318, 1322, 881, 582, 638, -2203, -764, 2112, 1227, 257, -555, 732, -735, -1495, -994, 740, -541, -111, 858, 1583, -183, -881, 121, 631, -1068, -391, 1126, 1015, 1016, 709, -194, -631, -310, 863, 254, 368, -157, 105, 397, 43, -148, -174, -237, 199, 145, 829, 238, -154, -320, 90, 49, -112, -280, 91, 643, -666, -194, 620, -131, -6, 413, -145, 308, 137, 360, -671, -89, 154, 785, 198, 381, 335, 188, -139, 265, 380, + -407, 216, -1870, 810, 10, -191, 960, -162, -723, 365, 333, 939, 532, -506, 28, 146, 644, 150, -739, -27, -42, 152, -688, -749, 1088, -390, -1136, 586, 1010, -566, -193, 68, 692, -823, -1083, 299, 916, -197, -390, -225, -223, 400, 170, 240, 2309, 129, -295, 33, 73, 1249, 39, -441, 281, -973, -573, 255, 5, 1073, 850, -548, -161, -518, 24, 386, 97, 121, 384, -274, -1135, 291, 765, -360, 676, -1049, 494, 319, -922, 160, 18, -399, 42, -170, 458, 449, -772, -473, 1029, -783, 378, -71, -302, 228, -31, -459, 263, 162, + 188, -12, -79, 54, 143, -173, -167, 143, 100, -94, -8, 231, 384, -224, -155, 52, -68, 138, -95, -48, 89, -1, 230, -69, 114, -294, 181, -204, 192, 341, -30, 10, 47, -385, 643, -1209, -3975, -4704, -424, -3263, 1281, 7955, 4280, 6463, 6812, -741, -1964, 582, -4964, -6067, -1875, -6679, -5362, 1359, -3857, -1051, 7683, 2781, 5430, 9382, 5582, 2496, 1898, 663, -4180, -5202, -1718, -7103, -7109, 940, -5317, -4363, 2624, -4476, -4605, 3476, 1411, -635, 8207, 7687, 4907, 10421, 9819, 3354, 3906, 3045, -4944, -4954, -6265, -12400, -14636, -10524, -10478, -7727, 263, 714, + 5100, 8821, 10872, 9908, 11498, 9854, 5811, 3908, 1300, -1944, -4371, -6217, -5344, -7748, -8680, -7197, -8415, -6313, 999, 2025, 4898, 9827, 7821, 6028, 4553, 1794, -1491, -1215, -2463, -3079, -2352, -2674, -2585, -1101, -1047, 59, 1595, 1136, 2240, 2694, 466, 1955, 1876, -523, 622, 439, -1434, 60, 459, -1657, -1812, -2523, -5189, -5798, -4511, -4308, -1415, 2113, 3808, 6201, 9355, 10106, 9373, 6570, 2001, -2124, -4547, -6784, -8374, -8231, -6427, -4408, -2094, -644, 255, 739, 1853, 3042, 3099, 2835, 2861, 1982, 1772, 1545, 641, 205, 481, 472, 407, 432, 79, -375, -628, -919, -1270, -1317, + -1243, -1412 } }, -}; -const Word32 CRendBin_FOA_HRIR_coeff_re_32kHz_fx[4][BINAURAL_CHANNELS][160] ={ -{ - { - 542228352, - 417208832, 222760096, 30935576, -113568600, -207234320, -268353856, -310141728, -330854752, -322319584, -281589344, - -214183040, -130122480, -39506720, 49225692, 129657008, 198014640, 253733776, 298617792, 334531776, 361652896, - 379196768, 387664832, 389500928, 387146208, 381105856, 370570304, 355496576, 337296672, 317647744, 297440448, - 277059744, 257007616, 237758112, 219289760, 201218144, 183405312, 166167456, 149848720, 134395440, 119433376, - 104629696, 89868968, 75175888, 60615948, 46289012, 32301376, 18699750, 5448166, -7515656, -20201378, - -32552094, -44502304, -56018184, -67078800, -77631536, -87627000, -97096328, -106124880, -114741128, -122914984, - -130664720, -138069776, -145147344, -151816896, -158036544, -163882000, -169452560, -174786912, -179930672, -184988544, - -190046928, -195118224, -200214736, -205414320, -210807200, -216429840, -222309648, -228507824, -235063568, -241926912, - -249005024, -256238816, -263574096, -270871232, -277919296, -284573248, -290850880, -296859552, -302651328, -308166048, - -313277056, -317860320, -321860544, -325323360, -328355616, -331044256, -333434432, -335579232, -337548992, -339382944, - -341105760, -342814624, -344658784, -346716608, -348950528, -351314912, -353855904, -356685216, -359889280, -363451392, - -367210592, -370939136, -374508800, -377934048, -381254048, -384445728, -387496768, -390440992, -393292288, -396038944, - -398732960, -401455968, -404184864, -406817696, -409322208, -411727392, -414018208, -416174816, -418247136, -420258240, - -422126016, -423831680, -425517984, -427292864, -429124128, -431028960, -433117376, -435350240, -437575552, -439858880, - -442404704, -445151360, -447922144, -450866336, -454171328, -457579904, -460929984, -464710624, -469181152, -473900800, - -479337152, -486478592, -491026976, -480117760, -442511552, -384772160, -330747904, -299777440, -290169600, }, - { - 542228352, - 417208832, 222760096, 30935576, -113568600, -207234320, -268353856, -310141728, -330854752, -322319584, -281589344, - -214183040, -130122480, -39506720, 49225692, 129657008, 198014640, 253733776, 298617792, 334531776, 361652896, - 379196768, 387664832, 389500928, 387146208, 381105856, 370570304, 355496576, 337296672, 317647744, 297440448, - 277059744, 257007616, 237758112, 219289760, 201218144, 183405312, 166167456, 149848720, 134395440, 119433376, - 104629696, 89868968, 75175888, 60615948, 46289012, 32301376, 18699750, 5448166, -7515656, -20201378, - -32552094, -44502304, -56018184, -67078800, -77631536, -87627000, -97096328, -106124880, -114741128, -122914984, - -130664720, -138069776, -145147344, -151816896, -158036544, -163882000, -169452560, -174786912, -179930672, -184988544, - -190046928, -195118224, -200214736, -205414320, -210807200, -216429840, -222309648, -228507824, -235063568, -241926912, - -249005024, -256238816, -263574096, -270871232, -277919296, -284573248, -290850880, -296859552, -302651328, -308166048, - -313277056, -317860320, -321860544, -325323360, -328355616, -331044256, -333434432, -335579232, -337548992, -339382944, - -341105760, -342814624, -344658784, -346716608, -348950528, -351314912, -353855904, -356685216, -359889280, -363451392, - -367210592, -370939136, -374508800, -377934048, -381254048, -384445728, -387496768, -390440992, -393292288, -396038944, - -398732960, -401455968, -404184864, -406817696, -409322208, -411727392, -414018208, -416174816, -418247136, -420258240, - -422126016, -423831680, -425517984, -427292864, -429124128, -431028960, -433117376, -435350240, -437575552, -439858880, - -442404704, -445151360, -447922144, -450866336, -454171328, -457579904, -460929984, -464710624, -469181152, -473900800, - -479337152, -486478592, -491026976, -480117760, -442511552, -384772160, -330747904, -299777440, -290169600, }, - }, - { - { - 67749352, - 219783680, 413881824, 505693216, 413422816, 164215392, -140707424, -402389056, -573466176, -653612416, -660346368, - -611244736, -521953408, -406601856, -276291488, -139582672, -4507032, 121427856, 232758240, 326858272, 404057088, - 467141056, 519165440, 560950656, 591515776, 610986496, 621836608, 627133952, 628743488, 627398080, 623321600, - 616330496, 606132096, 592982528, 577744000, 561221248, 543665536, 524797760, 504082048, 481199552, 456508864, - 430941984, 405336480, 380061120, 355244256, 330986272, 307298464, 284168448, 261772880, 240404352, 220141232, - 200755360, 181926224, 163439616, 145293904, 127723200, 111030272, 95366528, 80797464, 67489504, 55560232, - 44813152, 34916472, 25793426, 17500382, 9822053, 2378875, -4919348, -11912629, -18633178, -25326348, - -32058172, -38705172, -45339824, -52262236, -59613072, -67275296, -75201656, -83548392, -92396560, -101594768, - -110973904, -120557048, -130451576, -140654272, -151033056, -161435472, -171772928, -182076016, -192575600, -203677008, - -215695936, -228556688, -241831360, -255146832, -268460160, -281857760, -295178080, -307964192, -319747424, -330286208, - -339607360, -347886432, -355202400, -361324320, -365856064, -368671392, -370090880, -370577280, -370416224, -369777344, - -368903872, -368102848, -367618048, -367569728, -367946080, -368677312, -369823520, -371629024, -374272032, -377629088, - -381383424, -385236032, -388935584, -392324864, -395482208, -398631488, -401827488, -404948320, -408002560, -411121248, - -414235648, -417136352, -419830368, -422491104, -425155040, -427839936, -430786304, -434164288, -437787616, -441505984, - -445513728, -449924128, -454603488, -459719328, -465710816, -472510816, -479760736, -487769248, -496962624, -506955392, - -518123904, -532091680, -545398016, -543641408, -511176800, -451464416, -390454400, -352648480, -339506976, }, - { - -67749352, - -219783680, -413881824, -505693216, -413422816, -164215392, 140707424, 402389056, 573466176, 653612416, 660346368, - 611244736, 521953408, 406601856, 276291488, 139582672, 4507032, -121427856, -232758240, -326858272, -404057088, - -467141056, -519165440, -560950656, -591515776, -610986496, -621836608, -627133952, -628743488, -627398080, -623321600, - -616330496, -606132096, -592982528, -577744000, -561221248, -543665536, -524797760, -504082048, -481199552, -456508864, - -430941984, -405336480, -380061120, -355244256, -330986272, -307298464, -284168448, -261772880, -240404352, -220141232, - -200755360, -181926224, -163439616, -145293904, -127723200, -111030272, -95366528, -80797464, -67489504, -55560232, - -44813152, -34916472, -25793426, -17500382, -9822053, -2378875, 4919348, 11912629, 18633178, 25326348, - 32058172, 38705172, 45339824, 52262236, 59613072, 67275296, 75201656, 83548392, 92396560, 101594768, - 110973904, 120557048, 130451576, 140654272, 151033056, 161435472, 171772928, 182076016, 192575600, 203677008, - 215695936, 228556688, 241831360, 255146832, 268460160, 281857760, 295178080, 307964192, 319747424, 330286208, - 339607360, 347886432, 355202400, 361324320, 365856064, 368671392, 370090880, 370577280, 370416224, 369777344, - 368903872, 368102848, 367618048, 367569728, 367946080, 368677312, 369823520, 371629024, 374272032, 377629088, - 381383424, 385236032, 388935584, 392324864, 395482208, 398631488, 401827488, 404948320, 408002560, 411121248, - 414235648, 417136352, 419830368, 422491104, 425155040, 427839936, 430786304, 434164288, 437787616, 441505984, - 445513728, 449924128, 454603488, 459719328, 465710816, 472510816, 479760736, 487769248, 496962624, 506955392, - 518123904, 532091680, 545398016, 543641408, 511176800, 451464416, 390454400, 352648480, 339506976, }, - }, - { - { - 53941032, - 43702904, 4514011, -51625508, -76724224, -46684684, 5194763, 31938450, 24610700, 3203509, -19339164, - -40128416, -49972480, -40184788, -20243792, -8751533, -8460549, -4931696, 11458436, 35162896, 57057028, - 74803832, 88963272, 97172560, 96759704, 89472760, 80515608, 73936792, 69800736, 65049964, 56818660, - 45163192, 32460826, 20752746, 10919954, 4079145, 1846299, 4584878, 10595147, 17570174, 24138254, - 29859686, 34579856, 38158100, 40441948, 41324028, 40896140, 39342976, 36506684, 31771484, 24495810, - 14389751, 1512902, -13879187, -31491238, -51121920, -72550584, -95323576, -118918520, -143068048, -167566544, - -191847600, -215225104, -237401632, -258206992, -277008224, -292987648, -305829056, -315546400, -321864864, -324374176, - -323030944, -317938720, -309003584, -296401056, -280948320, -263374368, -243707184, -222131408, -199928576, -178637360, - -158576640, -139213856, -120889904, -105102144, -92734784, -82870320, -74046312, -66282084, -61039540, -59164784, - -59612536, -60572996, -61320860, -62394064, -64327336, -66911296, -69582768, -71866080, -73303816, -73477224, - -72325640, -70185672, -67324152, -63525788, -58201640, -50907172, -41873784, -32037772, -22395034, -13316546, - -4615479, 3850975, 11926587, 19372986, 25957172, 31324808, 35078072, 37015100, 37134824, 35510788, - 32312112, 27798638, 22127134, 15321759, 7548405, -763967, -9174050, -17416092, -25295210, -32601486, - -39150236, -44744968, -49178988, -52473764, -55037860, -57417272, -60014116, -63075352, -66614944, -70174400, - -73039144, -74910136, -76040784, -76593224, -76336064, -75163536, -73348376, -71009232, -67909872, -64094872, - -59985124, -55124832, -47452948, -35123168, -19442780, -5198521, 2906619, 4354560, 3023657, }, - { - 53941032, - 43702904, 4514011, -51625508, -76724224, -46684684, 5194763, 31938450, 24610700, 3203509, -19339164, - -40128416, -49972480, -40184788, -20243792, -8751533, -8460549, -4931696, 11458436, 35162896, 57057028, - 74803832, 88963272, 97172560, 96759704, 89472760, 80515608, 73936792, 69800736, 65049964, 56818660, - 45163192, 32460826, 20752746, 10919954, 4079145, 1846299, 4584878, 10595147, 17570174, 24138254, - 29859686, 34579856, 38158100, 40441948, 41324028, 40896140, 39342976, 36506684, 31771484, 24495810, - 14389751, 1512902, -13879187, -31491238, -51121920, -72550584, -95323576, -118918520, -143068048, -167566544, - -191847600, -215225104, -237401632, -258206992, -277008224, -292987648, -305829056, -315546400, -321864864, -324374176, - -323030944, -317938720, -309003584, -296401056, -280948320, -263374368, -243707184, -222131408, -199928576, -178637360, - -158576640, -139213856, -120889904, -105102144, -92734784, -82870320, -74046312, -66282084, -61039540, -59164784, - -59612536, -60572996, -61320860, -62394064, -64327336, -66911296, -69582768, -71866080, -73303816, -73477224, - -72325640, -70185672, -67324152, -63525788, -58201640, -50907172, -41873784, -32037772, -22395034, -13316546, - -4615479, 3850975, 11926587, 19372986, 25957172, 31324808, 35078072, 37015100, 37134824, 35510788, - 32312112, 27798638, 22127134, 15321759, 7548405, -763967, -9174050, -17416092, -25295210, -32601486, - -39150236, -44744968, -49178988, -52473764, -55037860, -57417272, -60014116, -63075352, -66614944, -70174400, - -73039144, -74910136, -76040784, -76593224, -76336064, -75163536, -73348376, -71009232, -67909872, -64094872, - -59985124, -55124832, -47452948, -35123168, -19442780, -5198521, 2906619, 4354560, 3023657, }, - }, - { - { - 45164804, - 59395104, 59016608, 28177670, -10354629, -20856362, 2749853, 31099858, 32979444, 4588636, -34200288, - -62302260, -71905808, -67962488, -60489784, -56045028, -52616572, -42487964, -20854214, 9752260, 43591772, - 76899776, 107454176, 132692480, 151896352, 168645120, 187650336, 209389312, 230131856, 246830704, 259533056, - 268856352, 273493312, 271391456, 262039168, 246406032, 225373584, 199436800, 169846096, 139058160, 109621528, - 82890720, 58987080, 37622840, 18567144, 1453310, -14353781, -29368986, -43517684, -56170120, -66573068, - -74185896, -78808352, -80779208, -81148576, -81333256, -82338280, -84396648, -87398288, -91276648, -95767032, - -100239704, -104238320, -107920720, -111578952, -115089016, -118263000, -121329072, -124467616, -127275984, -129343480, - -130962144, -132537320, -133660456, -133586904, -132287144, -130116032, -126737504, -121397784, -114174728, -105911208, - -96866544, -86456616, -74579960, -62278100, -50669340, -39919036, -29651380, -19704236, -9961640, 9664, - 10463614, 20870320, 30408368, 38951596, 47011100, 54650236, 61000348, 65122980, 67074504, 67797672, - 67977520, 67164160, 64105608, 57980984, 49299244, 39490612, 29562260, 19283330, 7798050, -5105643, - -18489298, -30955976, -41740104, -51208896, -60412472, -70090112, -80010944, -89225800, -96917008, -102980968, - -107974408, -112707456, -117801824, -123369176, -129046584, -134440528, -139526304, -144577728, -149865360, -155550288, - -161723232, -168367008, -175324864, -182408336, -189498256, -196508720, -203339328, -209896128, -216090000, -221804464, - -226880576, -231135808, -234416624, -236663440, -237896096, -238160768, -237642144, -236757392, -235874768, -235141408, - -234983568, -235941344, -236356880, -230784160, -213989760, -188165200, -163468608, -148763712, -143858320, }, - { - 45164804, - 59395104, 59016608, 28177670, -10354629, -20856362, 2749853, 31099858, 32979444, 4588636, -34200288, - -62302260, -71905808, -67962488, -60489784, -56045028, -52616572, -42487964, -20854214, 9752260, 43591772, - 76899776, 107454176, 132692480, 151896352, 168645120, 187650336, 209389312, 230131856, 246830704, 259533056, - 268856352, 273493312, 271391456, 262039168, 246406032, 225373584, 199436800, 169846096, 139058160, 109621528, - 82890720, 58987080, 37622840, 18567144, 1453310, -14353781, -29368986, -43517684, -56170120, -66573068, - -74185896, -78808352, -80779208, -81148576, -81333256, -82338280, -84396648, -87398288, -91276648, -95767032, - -100239704, -104238320, -107920720, -111578952, -115089016, -118263000, -121329072, -124467616, -127275984, -129343480, - -130962144, -132537320, -133660456, -133586904, -132287144, -130116032, -126737504, -121397784, -114174728, -105911208, - -96866544, -86456616, -74579960, -62278100, -50669340, -39919036, -29651380, -19704236, -9961640, 9664, - 10463614, 20870320, 30408368, 38951596, 47011100, 54650236, 61000348, 65122980, 67074504, 67797672, - 67977520, 67164160, 64105608, 57980984, 49299244, 39490612, 29562260, 19283330, 7798050, -5105643, - -18489298, -30955976, -41740104, -51208896, -60412472, -70090112, -80010944, -89225800, -96917008, -102980968, - -107974408, -112707456, -117801824, -123369176, -129046584, -134440528, -139526304, -144577728, -149865360, -155550288, - -161723232, -168367008, -175324864, -182408336, -189498256, -196508720, -203339328, -209896128, -216090000, -221804464, - -226880576, -231135808, -234416624, -236663440, -237896096, -238160768, -237642144, -236757392, -235874768, -235141408, - -234983568, -235941344, -236356880, -230784160, -213989760, -188165200, -163468608, -148763712, -143858320, }, + { + {-272, -324, 167, 10, 252, 91, 111, 71, 102, -3, -3, -57, -165, -96, 44, -9, -30, -20, 88, 68, 1, 79, -74, -188, 60, -44, 21, -96, 75, -79, -39, -32, 135, -32, -1, -57, -15, -153, 51, -27, 82, -73, 10, -35, -122, 38, -12, -34, 54, 99, -21, -62, -178, 15, -106, 48, 2, -70, -3, -31, -25, -130, 83, -115, 63, -46, -76, -66, -137, 74, 7, 37, 83, -89, -141, 89, -135, 3, -90, 28, -70, 60, -35, 31, -60, 10, -28, 35, -29, -33, -31, -30, -54, 7, 13, -11, + -42, 28, -32, 3, -21, -38, -14, -14, -6, -9, -5, -32, -16, 3, -18, -11, -10, -480, -6, -64, 126, 2, 48, -40, 62, 12, 54, -56, 309, -68, -44, -134, 44, -161, -52, 12, -79, -2, 113, 65, 43, 76, 110, -135, -52, -3, 70, -127, 123, -106, -54, 99, -19, 23, -79, 91, 95, 103, -158, -48, 170, -2, -26, -38, 186, 121, 144, 2, -34, -43, -11, -4, 21, 56, -180, -16, -84, -106, -14, 31, -94, 25, -72, -26, -29, -2, 62, 58, -33, -21, -41, -146, -35, -90, 2, -119, + 32, 2, 120, -41, 16, -104, 9, 15, -49, -50, 51, 2, 13, -4, 35, -9, 14, -5, -9, 44, 19, 19, 6, -4, 163, 193, -135, 17, -115, 177, 32, -74, -104, -92, -20, 22, 47, 235, -140, -23, -56, 92, -264, -31, 168, -5, 141, 62, 113, 117, 51, -23, -124, 40, -35, 15, 196, 49, 168, -89, -46, 12, -227, 26, 169, -50, 15, -142, 107, -3, 47, -168, 98, -113, -63, -118, -139, 79, 27, -45, -71, -67, -50, -34, 78, -78, -141, -217, 200, 153, 8, -217, 65, -104, 85, -71, + 15, -133, -84, -173, -78, -25, 168, 100, -189, 81, 4, -17, 82, -11, 65, 134, 7, 28, 89, 18, 18, 88, -16, -2, 7, 11, 19, 22, -20, 25, -18, 6, 4, 22, 5, 56, 49, 3, -3, 54, 28, -41, 8, 20, 817, -302, 366, -290, 26, 88, 87, -239, -81, -80, -401, -1, 22, -144, -23, -1, 288, 54, -200, 147, 160, 37, 292, -216, -78, -115, 62, 234, -16, 16, 87, -41, 105, 48, 267, -39, 105, -174, 160, -121, 179, -2, -185, -27, 269, -11, 182, 110, 175, 17, -138, -112, + 3, -83, 144, 96, -141, 21, -110, 190, -51, 153, 182, 33, 188, -8, -90, -30, -115, 6, 246, -153, -157, -59, 70, -107, -66, 49, 119, -48, 44, -237, 59, 17, -16, 85, 6, 24, 57, -6, -30, 27, -54, 18, -22, 8, 11, -7, -19, -47, -3, -37, -23, -15, -82, -679, 74, -200, -143, -219, -266, 105, 238, -36, 93, 38, 122, 28, 9, 74, -146, 338, -18, -197, 222, -68, 94, -222, -138, -157, 68, 41, 173, 5, -108, 18, -96, -106, -117, -41, -163, -83, 152, -142, -10, -111, -174, -77, + 22, 56, 110, -87, -80, 109, 19, 41, 29, 67, 102, -166, -56, -17, -233, 62, -17, 136, -137, -104, -128, 22, 144, 112, 254, 171, -158, 64, -72, 120, 75, -170, 122, 33, -189, 24, -35, 16, -36, -129, 23, -93, -98, 35, -54, 22, 68, -47, -63, -64, -97, -18, 73, -20, 76, 0, 51, 35, 26, -35, -14, 13, -35, -38, 8, -36, -15, 10, -69, 38, -36, -12, 7, -2, 4, 22, -31, 19, 44, -865, 238, -258, -215, -155, 29, -45, 510, 50, 122, -57, 2, -209, 208, 61, -30, 42, + 272, -136, -47, 63, 19, 136, -119, -53, 150, 55, 138, 17, -147, -96, 82, -14, -50, -91, -53, -6, 257, 65, -47, 6, 19, -78, 185, 142, -45, -195, 48, -103, 176, 137, -138, 54, -179, -159, -140, -175, -61, 39, -106, 9, -117, -98, 202, 129, -173, -232, 25, 198, -154, -113, 166, 132, 190, -123, -7, 54, 78, 215, 57, -28, -10, -156, -25, -3, -136, 10, -41, -61, 1, -18, 64, -16, -28, 31, -22, -56, -39, 12, 52, -26, -22, 2, -15, 101, 16, 130, -95, 24, 4, -54, -4, -5, + -72, 18, -16, -77, -74, -38, -71, -52, 15, -34, -455, -45, 77, 222, -43, -116, 52, 326, -410, 95, -83, -76, -184, 111, -329, -214, 114, -172, 105, 469, -82, 190, -220, 226, -58, 68, -197, 92, 57, -106, 47, -21, -101, -7, 129, 202, -157, -252, -199, -185, 25, 148, 393, -4, 265, 276, -256, 197, -377, -138, 25, -168, -156, 105, -364, -72, 255, -110, -95, 34, -111, 104, -110, 178, 231, -64, 72, 10, -232, 20, -150, -104, -183, 105, 81, -177, 15, 132, 124, 156, 162, -25, -152, 127, 67, 76, + 42, 92, -9, -3, 14, 38, 45, -63, -18, -51, -33, 74, 64, 71, -128, 26, -15, -53, -61, 67, -40, -71, 19, 17, -22, 157, 53, -31, -34, -73, -19, 64, 99, 25, 1, 98, 1082, -50, -425, -52, -17, 43, 138, 57, -48, -43, -213, -100, 123, 266, -215, -134, 178, 16, -62, 73, -15, -249, -253, 349, -30, -20, -56, 180, -12, 21, 116, -188, 204, 86, 35, 79, 204, -483, -215, -116, 449, 60, 36, -136, -149, 136, -18, 157, -53, -308, 36, 40, -45, 153, 70, 43, 250, 606, -45, -49, + 232, 72, -69, 160, 472, -50, 92, 172, 139, 124, 127, 142, 110, -122, 190, 338, -75, 131, 4, -40, -230, 147, 57, -17, 73, 82, 22, 11, -76, -88, -33, -177, -77, -119, 158, 78, 62, -23, -21, 11, -100, 2, 41, -140, 128, -60, 25, -42, 10, 49, 60, -109, -107, -90, 15, -17, -28, -7, 80, -19, 11, -44, -94, -52, 218, 243, -309, -89, -262, 260, 487, -233, -55, -267, -116, -324, 231, -197, -80, -21, 2, -129, -159, 291, -264, -97, 30, 199, 212, -304, -89, 117, -262, 149, -207, -84, + 76, 7, -114, -31, 62, 340, 42, 77, 0, -290, 318, -155, -238, 191, -170, -191, 250, -113, 32, -55, 33, 330, -56, 75, -288, -22, 335, 76, 331, 285, -94, -72, -386, 60, -65, 257, 313, -179, 78, -566, -156, 189, -196, 295, 19, 65, -105, -21, -137, 25, -94, 209, 203, -8, 69, -2, 115, 51, 83, 176, -53, -196, 90, 46, 124, -31, 132, -26, -47, 35, -81, -52, 13, -137, 38, -47, 122, 55, -10, -25, -82, -121, -11, 18, 49, -43, 26, -114, -3, 9, -62, 79, 7, 4, 32, -36, + 5, 3, 196, -248, 85, -232, -25, -314, 516, -151, 35, -163, -470, 272, 95, -351, 218, -158, -116, 123, 489, -243, 472, -9, -331, 14, 110, -291, 322, -168, 239, 518, 51, -242, -67, -27, 119, -205, -112, -27, 256, -91, -102, -339, -11, -401, -74, 455, -102, 260, 25, 70, -596, 9, -381, 308, 534, 165, 135, 34, 80, -310, 110, 167, -138, -38, -122, -77, 241, 6, 292, 895, 327, 90, -307, -285, -185, 177, -304, -25, -27, 63, 173, -166, -31, 168, 183, 39, 32, 125, 158, 132, -1, -28, -29, 15, + -64, -80, 72, -40, 111, -134, -42, 95, 80, -7, 73, -69, 34, 51, 68, -75, -75, 108, 76, 61, -27, -52, 26, -149, -39, 26, -80, 38, -55, -38, 18, 14, -12, -29, -112, 934, -506, -14, -251, -474, -633, 175, -203, 185, -599, 117, 213, 192, -252, -550, -434, -364, 4, -212, -402, -277, -141, -328, -230, 53, 412, -12, 58, -17, -365, 222, -35, 64, -83, -243, 203, -303, -422, 374, -412, 78, -6, -577, -345, 222, -12, 273, -186, -613, -5, 18, 225, 240, 567, -334, -1176, -414, -403, 259, -767, -262, + -130, -704, -236, -16, -136, -136, 151, -193, -19, -181, 162, -417, 146, 327, -420, -214, 203, 158, 136, -432, 99, 1, -63, 223, -59, 182, 162, -41, 49, 32, -54, -146, 231, -81, -167, 1, -9, 121, 42, -4, 36, -127, -129, 10, 42, 71, 131, -20, 59, -17, 51, -147, -65, -103, -94, -19, -22, 49, -165, -78, -125, -90, -173, -213, -189, -24, -20, 19, -118, -151, -542, 213, 267, -90, -105, -271, -298, 687, 250, -643, 222, -351, -34, -319, -660, 193, -344, -145, 27, 18, -168, -559, -346, 273, -342, -11, + -302, -465, -181, 514, 83, 90, -449, -152, -92, -60, 183, 225, 292, 359, -175, 202, 72, -210, 129, -352, -304, -265, 115, -306, 16, -460, -400, -208, 477, 370, 362, 397, -364, 497, 19, 228, 688, -142, -124, 110, -328, 135, -152, -428, 59, 347, -409, -296, -47, 373, -310, 34, 119, 224, 61, -95, -209, 55, 164, -90, 25, -112, 40, -107, 47, 5, 64, -42, 46, 73, 199, -27, 2, 13, 96, -147, -54, -162, -38, -39, -175, 31, 171, -19, -209, -41, -12, -192, -203, -313, -120, 114, 28, 79, -38, -60, + -102, -21, -262, -55, 173, 253, -3, 73, -143, -256, -601, 694, -537, 718, 403, 275, 156, 284, 308, 285, 772, -267, 57, -49, -131, -20, 98, -69, 150, -47, 243, 205, -41, -130, -765, -270, -554, -23, 295, 299, 96, 154, 223, 186, 216, 552, 821, 553, 113, -101, -157, -232, 288, 295, 329, -240, -191, -299, -49, 403, 5, 482, -289, 260, 155, 433, -896, -639, -262, -357, -368, 114, -150, 568, 168, -626, -51, 1023, -343, 322, -153, 423, -195, -124, 15, -170, -227, -13, 172, 256, 176, -62, 198, -49, 92, -256, + -177, 170, 106, -257, -114, -107, -35, 69, -69, -124, 58, 15, 42, -17, -75, 120, 37, -62, 153, -18, 44, -25, 180, -150, 160, 75, -153, 104, 4, 30, -159, -457, 171, 8, 31, -49, 174, -39, -85, 60, 135, 118, -71, 145, -443, -222, 366, 160, 270, 705, 60, 471, 689, 478, -313, -702, -25, -322, 755, 217, 590, -85, -318, -117, -347, 136, -267, 32, -297, 154, -218, -91, -477, -471, -48, -675, 368, 254, -203, 345, -166, 134, 383, -427, -561, 99, -124, 939, 397, -1032, -280, -293, -534, -564, -1154, 202, + -415, -109, 163, 41, 235, -46, -138, -873, 101, -397, 105, 510, 105, 342, -522, -691, 137, 427, 286, 160, 271, 444, 554, 572, -512, -307, -370, -263, -431, 603, 351, 340, 90, 260, 220, -22, 312, -487, -174, -59, 37, -106, -348, 19, -73, 44, 109, 352, 16, 165, 162, 26, 172, 5, -110, 21, -268, -108, 138, 203, 59, 37, -327, -32, 8, -156, -111, 48, 100, -297, -332, -150, 108, 96, 164, 41, -109, 74, -345, -303, 1245, 822, 1143, 74, -227, -777, -229, 130, 180, -186, -601, -218, 988, 408, -137, 302, + -23, -364, -106, -238, 674, -52, 39, 290, 19, 329, -4, 466, -430, 537, 109, -251, -152, -278, 485, -674, -727, 459, 760, 35, 525, 721, -813, 269, 166, -46, -8, 119, -305, 566, -344, -275, 229, 27, -62, -133, -170, 80, -537, -162, 432, -531, -122, -359, 13, 1069, -337, 67, 286, 3, -247, -672, 654, 303, -1349, 332, 339, 249, -303, -143, 689, 28, 50, 174, -480, 16, 304, -127, 175, -41, -156, -402, 60, -56, 369, -38, -17, -269, 292, -102, -103, -425, -213, 145, -273, 19, -135, 165, -160, -343, 170, -370, + -102, -170, 16, 18, -139, 359, -47, 485, 297, -55, 50, 308, -220, 51, 35, 296, -276, -169, -548, -1325, 1195, 716, 384, 273, 594, -1338, 561, 630, 274, -854, 488, 880, 412, 970, 359, 25, -30, -22, -156, 416, 691, 659, 235, -191, -331, 89, -301, -353, 388, 270, 80, -354, -345, -69, -299, 165, 792, -131, -246, 273, 150, 241, 282, -52, -151, 639, 425, 215, 286, -42, -620, 154, 424, 63, -459, 632, 170, 876, 39, 788, 90, -247, -76, 196, 1117, -132, 406, 282, 532, 284, 9, -25, 349, 1590, 80, 643, + -530, -392, 207, 257, 314, 135, 56, -769, -302, -806, 50, -132, -263, -220, -85, -335, 48, -28, -356, 266, -416, -197, -375, -252, -20, 50, -299, -345, 90, 232, 267, -46, -96, -447, -589, 67, 77, -263, 543, 529, 776, 278, -166, 112, 242, 299, 355, 58, -364, 99, 473, 247, 27, 194, -871, 951, -17, 842, 19, 56, -768, -237, -347, 584, 147, 258, 152, -590, 56, 46, -520, -741, -759, 255, -284, 688, 37, -219, -182, 148, -270, 44, 198, -289, 159, 232, 76, 66, 517, 875, -175, -6, 436, 361, 523, -390, + -157, 160, -528, 52, 41, -695, 893, -43, 449, 392, 270, -528, 46, 453, -372, 806, 217, -293, 661, 503, 345, -1119, -233, 224, -387, 62, -630, -155, -952, -270, -150, -260, -1055, -104, -292, 1581, -232, 323, -167, 254, -138, -256, 166, -214, -38, -114, 419, 154, 181, -678, -614, -452, -194, 123, -861, -135, -74, 67, 309, 241, -31, 336, -305, 11, 13, -490, -687, 139, -204, -628, -178, -293, 38, -670, -82, -290, 393, 12, -294, -100, 118, 163, -70, 311, -315, -186, 390, 384, 492, 432, 322, -232, 202, 539, 521, 230, + -626, -727, 325, -99, 236, -133, 620, -460, -94, -158, 541, -404, 947, 1163, 1187, 74, -218, 194, -152, 291, -49, -5, -345, -949, -315, -909, 524, 493, -559, -418, -561, -261, -79, 1244, 17, -632, -679, -39, 871, 417, -1739, -354, -305, 231, 657, -754, -237, -448, 200, -1030, 516, -170, -20, 288, 45, -503, 1021, -101, 487, 1091, 2237, 1342, -30, 755, 1143, 1468, 1593, 457, 977, 280, 16, 599, -467, 982, 424, -425, -1458, -1062, 142, -414, -296, -268, -158, -177, -597, -392, 26, -91, -29, -188, -49, -312, 394, -648, -262, 191, + 125, 61, -163, -201, -110, 134, -98, 338, -388, -491, -489, -302, 382, 425, -152, -71, 160, -78, 706, 154, 68, 564, 358, 324, 803, 526, 606, 189, 296, 658, 260, 274, -220, -497, 577, -722, 1215, -141, -220, 25, 969, -643, -112, -26, 15, 353, -248, 508, 178, -93, 120, 60, 400, -1214, -381, -35, 131, -118, -883, 728, -38, 101, 265, -576, -261, -1339, 357, -313, 259, 981, -267, 207, -125, 468, -800, -1071, 941, -87, 82, 160, 946, 689, 821, -13, -1095, 651, 307, -259, -386, 622, -112, 786, 1302, 1011, 174, 88, + 962, -189, 297, 790, -536, 913, 561, 326, -644, -320, -860, -25, 298, 1284, 543, -1192, -108, 770, -111, 375, 518, -844, -207, 412, 101, 231, -367, 274, 466, 61, 9, 680, 132, -146, -175, 226, -58, 366, 59, 277, 317, -48, -325, 670, -95, -207, -41, -456, -456, -301, -314, 217, 398, -400, -339, 78, 598, -862, -206, 331, -100, 0, -115, -95, -617, -11, -163, 170, 50, 101, 10, 52, -49, -1684, 385, -279, -67, 1314, 564, -413, -321, -5, -852, -1043, 87, 9, -588, 623, 74, -602, 379, 1132, -153, -652, 408, -384, + -420, 211, 917, -299, 133, 252, -285, -683, -450, 907, 317, -894, 763, 301, -615, -320, 1259, -409, -970, -497, 1674, -1654, -769, 983, -446, -532, -1579, 1231, -1012, 362, 50, -188, -1782, -525, 1520, 961, -1206, -328, -524, -245, 244, 332, 393, -2100, 1146, 883, 922, 16, 481, -1028, -919, 1802, 735, 201, 721, -967, 192, -427, 459, -260, 1259, -512, -442, 177, 149, -475, 284, 141, 103, -88, 60, 104, 99, -116, -72, 266, 12, -138, 549, 165, -496, 56, 470, 126, -472, 630, 1122, -551, -650, -173, -149, 383, 820, 252, -766, -252, + -115, 116, 228, -126, 333, -242, -33, 200, -1387, 242, 1735, 543, 188, 49, 132, 745, 1020, -232, 192, 265, -174, 616, -323, -86, -244, 473, 352, -192, 323, -462, -376, 472, -302, 519, -344, -152, -9, 284, -17, 212, 86, 528, -377, -74, 10, -209, 510, 443, -364, -129, -224, 118, -471, 255, 146, 234, -188, -142, 581, -696, -120, 295, -189, -126, 304, -855, 207, -309, 52, -302, 741, -240, -319, 305, -168, -484, 942, -25, 97, -210, -362, -427, 476, -534, -257, 544, -742, -323, 96, -69, 91, -11, 106, 331, -118, 130, + -151, 347, 190, -14, 30, 212, -185, 154, 25, 170, -76, 263, -133, 71, -228, -196, -312, 59, 19, 105, -152, 350, -115, -59, 300, 265, 142, -122, -200, 181, 239, 150, 103, -2, 216, 235, 104, 200, 26, 456, -1290, -3652, -3001, 1589, 457, 3635, 6495, 966, 2050, 747, -5179, -1637, -3513, -4247, 121, 680, -1770, 2569, 3362, 1888, 5360, 3092, -687, -1269, -2483, -4835, -3818, -1124, -3403, -472, 2941, 494, 687, 4445, 2268, 1403, 4634, 715, -1278, 1813, -2426, -4808, -2011, -4057, -5078, -74, -1060, -1336, 3383, 3729, 2373, 5624, 4538, 2141, 1936, 1122, + -3753, -3452, -4372, -5772, -4627, -1952, -1341, 120, 3321, 4039, 4228, 4054, 3757, 803, 71, -637, -2864, -3137, -1813, -3291, -1384, 288, -718, 1653, 2972, 910, 1257, 560, -809, -504, -1240, -1613, -193, 455, 14, 1333, 1230, 141, 1184, 1, -1497, 1322, 398, -1333, 937, -987, -2003, 916, -1426, -3533, 55, -1555, -1029, 3499, 1583, 1663, 5003, 3317, 1840, 2182, -544, -3159, -4017, -5454, -6035, -3830, -2450, -423, 2298, 5122, 5655, 5247, 5462, 2920, 129, -1396, -3597, -4587, -2965, -3292, -2614, -526, 87, 340, 1233, 1043, 889, 1538, 1487, 1238, 1402, 933, 257, -212, -694, -1274, + -1318, -971, -804, -324, 126, 552, 857 }, + {-323, -393, 198, -72, 173, -86, -88, -176, 41, 37, -8, 3, -20, -135, -16, -77, -89, -84, -3, 10, -7, -15, 67, -18, -203, 127, 63, -69, 20, -2, 2, 29, 131, -73, 8, -230, 115, 23, 52, 80, 129, -72, -55, -26, -116, 9, -18, 100, -54, -7, -56, -64, 122, -92, -45, 11, -84, 70, -3, -39, 75, 138, 9, -5, -20, 118, -118, 1, -19, 62, -29, -54, 129, -2, 27, -36, 27, 69, -56, -78, 4, 68, 113, -51, -35, 28, 6, 17, -52, -17, 31, -7, 22, -41, -13, -25, + -36, -26, -24, 18, 3, -18, 18, 12, -16, -5, -4, -22, -40, -11, 0, 8, 22, -468, 80, 55, 164, -64, 50, 191, -74, 52, -116, -170, 62, -116, -132, -133, 40, 51, -226, 133, 88, -39, -83, 53, -21, -52, 16, 75, 55, 120, 23, -36, 123, -62, 269, 60, 165, 64, 145, 65, 100, 54, 12, 6, 203, 35, -33, 13, 107, 80, 12, -9, -42, 23, 248, 71, 115, -120, -62, -126, -80, -123, 92, 58, -79, -56, 55, -58, 62, -28, -19, -85, -143, 62, -233, -33, -50, -59, 12, -54, + 11, 88, 42, -60, 11, -47, -102, -16, 48, -5, -78, 28, 14, 30, 53, 2, 7, -37, -23, -5, -1, 19, -43, -36, 264, 363, -111, 98, -180, -10, 11, 464, -47, -123, -200, 5, 133, 214, -48, -280, -81, -107, -77, 95, -21, 178, 20, -101, -227, 68, -21, 53, -27, 26, 111, 41, -285, 35, 183, 90, 23, 44, -46, 127, -169, -16, 139, -96, 0, 226, -104, -10, -77, 139, -146, -108, 68, -151, -75, 198, 116, -176, -65, -26, -44, -80, 63, -69, 73, -2, 11, 32, 149, -17, 205, 106, + -158, -72, -77, 124, 37, -8, -63, 166, 64, -3, -4, -41, -38, 49, 19, 55, 129, 47, -7, 9, 10, 42, -9, 16, 62, 14, 76, 3, 27, 39, 47, 17, 30, 34, 28, 44, -13, 14, 30, 45, -4, -34, -40, 10, 866, -320, 176, -244, -25, 9, -18, -130, 71, 100, 24, -94, -201, -7, 123, 87, -88, -151, -12, 136, 247, -133, -18, -101, -216, 24, -109, 66, -81, 168, -295, 200, -13, -176, 43, 74, -21, -93, 6, 231, -9, 38, -33, 89, 41, -55, -87, -190, 123, -40, -56, 73, + 1, -319, 245, -344, -199, -243, 52, -28, 146, -80, 77, -146, 70, -38, -60, -162, 99, 114, 195, -47, -19, 53, -59, -35, 37, 113, -149, 74, 107, 119, -189, -154, 64, -96, 49, -1, -12, 17, 23, -8, 44, -55, 26, -17, 110, 7, 27, 25, 7, -43, -4, 11, -13, -684, 69, 7, -59, -106, 119, -93, 79, -25, -2, 110, 143, -89, 106, -32, -59, -193, -10, -260, -191, 228, 81, -89, -33, -27, 158, 83, -82, 144, 96, 56, 49, 61, 109, 94, 93, 255, 229, 99, 25, -159, 176, -236, + 46, -66, 191, -145, -188, 322, -76, -173, -154, 239, 147, 8, 123, 174, 79, 281, -17, -45, 159, 97, 9, 6, -147, 87, 91, 227, 92, 141, -88, -117, -249, -57, -135, -107, -114, 125, -5, 9, -73, -85, -24, -74, 22, -50, -83, 33, -9, 3, -77, -12, 3, -97, -14, -24, 6, -44, -51, -32, -19, 1, -17, 15, -23, 27, 6, 23, 53, -13, 56, 11, 36, -26, 11, -49, -19, -9, -59, -19, -29, -912, 244, -195, -288, -285, 176, -212, 155, -266, 145, 124, 76, -280, 191, -4, 115, -232, + 128, 273, 209, 7, -99, 38, -60, -296, -60, -142, 67, -186, 159, 156, -62, -8, 219, -49, 148, -120, -192, 99, -4, 102, 269, 164, -11, -471, -226, -66, 65, -73, 258, -410, 129, 55, -5, 127, -54, 198, -429, -201, 165, -431, -81, 200, 71, -96, -288, 106, 185, 135, -52, -302, -27, 2, -35, -17, -148, 66, -237, 145, 20, -141, 27, -169, 12, -202, -57, 70, 73, 6, -20, -70, -53, 13, -119, 94, 6, -58, 0, -103, -82, 22, -43, 55, -55, -31, -36, -39, -70, -12, -39, -16, 18, -17, + -32, 25, -13, -27, -28, -62, -44, 7, 31, -10, -428, 46, 71, 336, -317, 366, 104, -30, -86, -40, 34, -268, -51, 86, -88, -158, -42, 254, -262, -57, 263, 1, -104, 92, -127, 193, 85, -3, 97, -112, -176, -13, 14, 144, -309, -167, -136, -96, -91, -94, 47, 15, 26, -232, -237, -189, 8, -298, -163, 177, -119, 39, 20, -6, 75, 105, 101, 118, 176, -32, 190, -13, 97, -17, -120, -8, -195, 120, -228, 213, -255, -5, -263, 24, -264, -257, 122, 351, 108, -228, 164, -1, -99, -61, -103, 138, + 122, 170, 33, 132, -111, -14, 133, 14, 43, 24, -62, 77, -5, 28, 119, 32, -27, -72, -30, 46, 50, 36, 16, -56, 7, -14, -119, 116, 17, 41, 8, -31, -55, 39, -56, -30, 1191, 14, -343, 54, -186, 475, -78, 134, 35, 23, -418, -214, 232, 204, -329, -58, -10, 293, 144, 112, 287, 45, 19, 249, -87, -379, 56, 290, 172, -110, 6, 202, 123, 55, -11, -213, 103, -231, 23, -436, 114, 135, -35, -201, 277, 146, -58, 216, 99, -181, 332, 36, -118, 77, 341, 53, -9, -284, -166, 40, + 115, 389, -128, -154, 34, 212, -137, -168, -15, 283, 202, -70, -217, -11, 247, -98, 512, 112, 76, -262, 223, 14, -57, -133, 13, -74, 14, 317, 144, 116, 60, 37, 5, -20, 29, 64, 114, 18, 21, 43, -87, 2, 38, -19, 100, -70, -2, -34, 39, 169, 58, -52, -13, 41, 14, 57, -11, -72, 67, 61, -57, -15, 148, 52, 269, 143, -424, -44, -214, 426, -160, 198, 38, 267, 105, 39, -22, 108, -122, -181, -502, -371, 122, 330, 443, -163, -217, -191, 98, -105, -23, -18, 59, 67, 295, -158, + 27, 73, 144, -143, -107, -236, -161, -165, -282, -713, -9, -96, -307, 69, -35, -387, 129, -328, 83, -40, -27, 166, 215, -6, -320, 94, -201, -221, 307, 278, 309, -101, 50, 41, -159, 25, -77, 486, -81, -50, -49, -3, -297, -367, 87, -27, -28, 83, 528, -65, -248, -104, 277, -40, -91, -79, -6, -225, 54, -43, 42, -113, 4, -142, -13, -8, 57, -59, -30, -87, 118, 8, -87, 20, 39, -92, 23, 38, 144, -29, 33, 103, 62, -52, 60, -109, -180, 23, 16, -66, -168, -33, -42, 150, 54, 101, + -18, 126, 137, -467, 171, 56, 492, -332, -188, -111, 262, -252, -242, 217, 146, -255, -257, -252, -562, 368, 345, 366, -159, 115, 363, -528, 0, 345, 320, 145, -1, -170, 35, -82, -457, 57, 125, 66, 302, -268, 28, -500, -64, 98, -274, 105, 84, 222, 273, 379, -78, -150, -459, -328, 141, 672, -209, -29, -310, -165, -246, 144, 149, -52, 22, -493, -65, 332, -266, -231, 197, -90, 289, 71, -213, 34, -322, -93, -85, 619, -62, -182, 136, 126, -55, -106, -32, -85, -115, -108, -82, 43, 48, 99, -26, -2, + -60, 60, 15, -160, 42, -2, -17, 57, -4, -88, -86, -207, 69, -66, 61, 78, -97, 43, 28, -22, 78, -1, 223, 30, -40, 4, -64, -12, 39, 5, -19, 17, -87, 69, -292, 668, -333, -172, -16, -25, -478, 28, -353, 251, -661, -98, -213, 223, -229, -231, -560, 374, -231, 152, -181, 110, 295, -218, -367, -125, 248, 517, 165, 215, 24, -525, -281, -284, -146, 89, 472, 202, 274, 257, -74, -113, -161, -440, 22, -307, 472, -219, 325, 68, -172, 107, -115, -150, -259, 387, 100, 654, 142, -709, -178, 224, + 182, 101, -41, 61, 738, 368, -127, 78, -201, 534, -22, -23, 207, -475, -206, -163, -507, -601, 117, 211, -58, -297, -79, -96, -233, 1, -49, -186, 180, 277, -63, -44, -44, -113, 78, 16, -34, -60, -51, -36, 90, -57, -134, -35, -8, 39, 24, -84, 196, -69, 118, -27, 98, 49, -34, -138, -131, 40, -37, -207, -77, -54, 72, 15, -18, 53, 91, 27, -58, -88, -407, 246, 548, -52, -22, -11, 509, 159, 123, 88, 62, 88, -199, 39, -628, 92, -302, 264, 646, -83, 48, -507, 680, 330, 290, -83, + -371, 46, -126, 345, 248, -307, 18, 182, 130, -238, -210, 995, -229, -173, 211, -253, -183, 317, 312, 13, 121, 113, -383, -191, -15, 132, 339, 84, 81, -434, -39, 129, -591, 130, -163, -60, -107, 175, -174, -322, -342, -545, 71, -221, -104, 349, -116, 113, -613, -1, 569, 133, -284, -170, 346, 176, -375, 212, -271, -210, -88, -53, 130, -37, 24, -58, -73, 45, 70, -96, 84, 250, 41, -35, 109, 158, -65, 107, -68, -98, 29, 71, 210, 54, -18, 75, -30, 107, -59, 98, -73, 32, 89, 25, -142, -82, + 265, -112, -209, 104, 57, 77, -54, 338, 101, -315, -317, 749, -450, 116, -288, 883, 187, 162, -284, -336, 31, 252, -272, -434, -258, -630, -246, -371, -2, -847, 58, 457, 281, 373, -262, 96, 405, -48, 294, 108, 458, -232, 382, 303, 217, 496, -279, 295, -153, -178, -118, 109, -966, -310, -601, 693, -438, -495, -106, 391, 10, -178, 546, -196, -173, -397, -976, 46, 90, 405, -409, 0, -250, -330, 521, -107, 261, -569, -553, -346, 435, -46, -276, -294, -12, -483, -329, 46, -202, -360, 530, -728, -692, 180, 3, 305, + 35, -35, -223, -198, 33, -344, -138, 291, 39, 49, -169, 172, 65, -189, 89, -140, -28, -144, 125, -191, -47, 128, 253, 27, 12, -275, -82, -20, 41, -41, 234, -11, -88, 148, -172, -161, 100, 212, -58, -152, -204, 164, 134, 264, -365, -5, 484, 61, -150, 248, -398, 784, 491, -7, -362, -410, 167, -105, -39, -24, 716, -355, 11, -248, 262, -449, -411, -807, 184, -330, -455, -58, -767, -379, 214, 160, -107, 395, 35, 480, -215, -668, -103, -490, -95, -149, -641, 81, 518, -1468, 183, 1, 361, -75, -458, -872, + 344, -109, 322, 191, -108, 504, -632, 881, -223, 490, 1029, 410, 732, 286, 191, -103, 382, -145, -403, -544, -351, -21, 303, -53, -238, -339, -302, 406, -184, -150, 365, 64, 275, -31, -41, -114, 64, 136, -188, -33, -459, -334, 224, -114, -12, -69, -9, -178, -275, 196, -166, 256, -265, -124, -30, -188, -93, 128, 54, 311, -79, -190, 118, -376, 6, 43, -58, 22, -41, 181, 265, 42, -9, -131, -221, -111, 13, 432, 219, -223, 1234, 1005, 906, -206, 3, -769, 575, 714, 243, 690, 276, 235, 242, -121, 96, 191, + -175, -741, -450, -27, -492, -574, -1348, 296, 233, 352, -258, -92, -179, 10, -421, -12, -321, 373, 311, -192, -261, -711, 1198, -374, 237, 0, 78, 191, -495, 597, -301, 204, 135, -446, -459, -85, -40, 277, 1264, -105, 189, 42, 382, 271, 284, -223, -66, 109, -610, 124, -522, -834, 291, 26, 67, -611, -1469, 635, 665, 457, -833, 794, 844, 312, 245, 7, -242, -555, 416, -391, 26, 7, -219, 167, -397, -42, -77, 197, -109, -184, -246, 379, -207, -91, 100, -341, 191, 155, -117, -120, 35, -317, 295, -107, -78, -27, + 26, 216, -168, -400, 121, -223, -67, -229, -201, 31, -162, -75, -151, 514, -226, -419, 68, -151, -724, -1444, 1198, 192, 212, -481, -347, -1537, 424, 1099, 337, -974, -488, 158, -380, -241, 450, -507, 283, 252, 208, -564, 201, 174, -265, -528, -306, -203, -137, -504, -435, -239, -519, 409, -194, -670, -232, 411, -85, -465, -256, -237, -2, -369, -223, -611, -581, 247, -207, 762, 501, 49, 455, -666, 431, -632, 531, -91, 272, -282, 943, -235, 528, -135, 776, 312, 189, -801, 869, 695, 303, 323, -625, -120, 256, 427, -111, 103, + -691, 443, 758, -17, -542, -32, -359, -307, 148, -2, -150, 174, -395, -93, 15, 112, -272, -375, 144, -183, -353, -635, -46, 197, -52, -320, -385, -119, 246, -265, 102, 142, 41, 104, -32, -170, -143, -48, 178, 59, -67, -238, 327, -211, -183, -154, 67, 379, -255, 373, 318, -127, 117, 199, -1002, 856, -99, 411, -551, -178, -135, -127, -126, 501, 18, -414, 338, 60, 245, 425, 431, 24, -365, 1515, -411, 1166, 13, 72, -654, -286, 114, 565, 284, -181, 467, 97, -630, 109, 100, 658, -18, 395, -476, 3, 451, 223, + 379, 987, 796, -120, 417, -59, 783, -618, 526, 213, -19, 467, -235, 1208, -198, 585, -428, -386, 30, 1286, 428, -1187, 1066, -18, 381, -894, 316, 107, -1789, 759, 1386, 532, -564, -358, 290, 1362, 783, 1040, -365, -497, -447, 223, 293, -41, -505, -224, 654, 121, 159, -215, 307, -69, 147, -131, -162, -199, 401, 659, 643, 150, 348, 607, 409, 430, 587, 334, 561, 426, 164, -823, -150, -380, 245, 493, -541, -188, 666, 368, 87, -142, 566, -423, 113, 583, 463, 261, 315, 360, 303, 357, 235, -273, -133, -485, 621, 98, + 415, -329, 829, -286, 388, 131, 175, 124, 76, -860, -496, 9, 82, 594, 491, -700, 75, -384, -349, 177, 47, -238, 294, 1142, -751, -57, 1747, -1058, 128, 627, -317, -253, 364, 579, -625, 313, -1136, -119, 1700, 79, 483, -175, 930, 937, -255, -11, -438, 112, -323, -822, -530, -981, -726, 1103, 443, 330, 1461, -1030, -612, 192, 548, -401, 267, -430, 809, 492, 280, 602, 2121, -495, -167, -584, -684, -35, 890, -690, -92, 644, 679, 816, 468, -535, 138, -291, -67, 481, 150, -28, 350, -630, 41, 24, 171, -132, -168, 404, + -147, -83, 430, 569, 441, 209, 185, 380, 106, 42, 250, 40, -148, 126, -7, -24, -725, 191, 462, 777, -182, -200, -256, 404, 434, -966, 112, -421, -68, 71, 58, 168, -248, -518, 414, -129, 952, -875, 215, -69, -283, -259, -130, 288, 177, 194, -50, 530, 90, -707, -556, -82, -328, -409, 88, 437, -66, -107, -645, 310, -106, 650, -226, -1269, 152, -381, -193, -5, -1027, -546, -883, 9, -66, -254, -1168, -481, -104, 603, 673, 47, 51, 321, 74, -808, 702, 949, -416, 137, -416, 165, -4, 721, -818, -601, -1870, -671, + 471, 746, 536, 479, -461, -161, 374, 350, 813, 377, 348, 617, 159, -698, -736, -1009, 420, -649, 58, -570, -862, -1318, 188, -388, -407, 107, 126, -59, -185, 17, 434, 289, 114, -177, 316, 694, -152, -396, -312, 335, -179, -169, -624, -619, -463, -1050, -52, -9, -410, 172, 286, 193, 523, 131, 616, 28, 175, 660, -321, -31, 108, -18, -460, -30, -82, 800, -43, -351, 263, 87, 246, 502, 178, -1496, 630, -446, 57, 1065, 892, -353, -148, 549, -341, -360, -298, 74, -102, -40, 129, -118, 527, 1251, -527, -981, 980, -760, + -204, 6, 1223, 93, -368, 358, 342, -1279, -374, 208, -48, -609, -44, 238, -1876, -872, 932, -930, -1030, -640, 762, -990, -1543, 1553, -456, -977, -55, 604, -593, -1048, -24, 472, -52, -1346, 318, -23, -599, 1408, 1332, -104, -539, -1051, 1624, 222, 289, 557, -396, -1578, 712, 1200, 966, -600, 351, 1310, 766, -912, -197, -716, 323, 194, 830, 812, -976, -37, -99, 144, -377, 391, -245, 225, 210, 164, -271, 212, -407, 680, -341, -177, 441, 377, -388, 61, -177, -463, -239, 183, 371, 220, -365, 208, -231, -574, 37, 101, -83, -48, + 399, 24, 53, 183, -43, 98, -604, 461, -1549, 170, 1461, 795, 205, -19, -264, 379, -515, 1213, -92, 323, 449, -419, 17, -54, -462, -3, 176, 680, -2, -424, 211, 546, -90, 867, -673, 139, 197, 225, 753, -414, 67, -30, -981, 137, -320, -539, 231, -207, 774, 554, -404, -884, 420, 83, 178, 490, 1074, -186, 224, -438, 617, 437, 461, -514, 706, -245, -306, -619, -53, -247, 913, -683, 51, 222, -206, -418, 1276, -59, 305, -120, 156, -109, 360, -48, -153, -106, -134, 423, 299, 398, 226, 125, -272, 293, 26, 162, + 144, 357, -48, 11, 61, 113, 122, 266, -218, 167, 150, 130, 114, 90, 265, 100, -340, 207, 242, 248, 112, 267, 78, -18, 155, 86, 197, -17, -167, 41, 271, -136, 115, 13, 295, 260, 106, 183, 275, 509, -1355, -3803, -3616, 1570, 153, 3475, 7365, 1612, 2969, 1583, -5466, -2448, -3677, -5401, -363, 637, -2551, 2266, 3856, 2361, 6640, 4074, 38, -615, -2348, -5862, -4746, -2046, -4495, -1327, 2572, 763, 651, 6074, 2344, 1477, 5626, 263, -284, 2593, -1292, -4644, -2247, -4642, -6776, -754, -3077, -2515, 2169, 4204, 1947, 7427, 5921, 3429, 4495, 1520, + -2201, -3396, -4523, -7247, -5807, -3901, -3319, -1036, 2525, 3830, 4275, 5741, 4839, 2264, 826, 1243, -1940, -2980, -2112, -4451, -3345, -581, -1996, 789, 3257, 1160, 1663, 2359, 253, 137, -574, -2229, -1164, 15, -886, 683, 945, -387, 1197, 1022, -1611, 1226, 1439, -1021, 2347, 352, -2308, 1610, -1265, -4520, -745, -2749, -3329, 2049, 263, 517, 4340, 2751, 3071, 4921, 3628, 1194, 521, -3439, -6237, -6218, -6226, -5901, -3593, 177, 3396, 4974, 6832, 6331, 5992, 4706, 803, -2172, -2361, -4975, -6115, -3677, -3263, -1818, 319, 826, 1005, 1935, 1672, 1528, 2117, 1678, 1037, 864, 184, -465, + -722, -809, -999, -685, -438, -319, -8 } }, -}; -const Word32 CRendBin_FOA_HRIR_coeff_im_32kHz_fx[4][BINAURAL_CHANNELS][160] ={ -{ - { - -124746248, - -332286592, -439153952, -441538208, -378021536, -291850528, -203384416, -111092552, -9728638, 96636768, 195902592, - 276180352, 330958912, 358995904, 362415232, 345596160, 314441536, 274850528, 230755712, 183491744, 133441952, - 82224464, 32700808, -13212930, -55892020, -96611528, -135351600, -170669120, -201400688, -227661728, -250176480, - -269402368, -285648608, -299537472, -311814080, -322783968, -332288192, -340256960, -347059136, -353240128, -359089344, - -364553600, -369461664, -373696512, -377195296, -379940320, -381985792, -383444480, -384410304, -384898848, -384869856, - -384300800, -383224352, -381696416, -379749728, -377424000, -374818048, -372054752, -369180352, -366176576, -363069152, - -359940256, -356811936, -353631488, -350401696, -347243808, -344273856, -341512704, -338963648, -336672288, -334662240, - -332880896, -331277280, -329867456, -328667552, -327624416, -326662880, -325738368, -324787584, -323680544, -322275008, - -320497440, -318308608, -315630720, -312372448, -308554208, -304337088, -299901472, -295304224, -290483680, -285365696, - -279950272, -274330848, -268670080, -263132240, -257809168, -252722320, -247888864, -243344800, -239099760, -235146240, - -231518064, -228269456, -225366592, -222675808, -220095600, -217629744, -215315296, -213116816, -210895248, -208448720, - -205616720, -202393360, -198915504, -195302896, -191572720, -187729792, -183824608, -179889872, -175917024, -171932912, - -167981008, -164011376, -159920416, -155695248, -151405648, -147074176, -142689552, -138297408, -133931040, -129537288, - -125114008, -120789512, -116638424, -112566264, -108506440, -104497088, -100477536, -96285648, -91947200, -87612504, - -83182776, -78420200, -73369312, -68145560, -62472984, -56077776, -49192944, -41836204, -33221036, -22813792, - -10376641, 7129646, 35794796, 75874352, 112670416, 124075160, 101861056, 60357176, 18902152, }, - { - -124746248, - -332286592, -439153952, -441538208, -378021536, -291850528, -203384416, -111092552, -9728638, 96636768, 195902592, - 276180352, 330958912, 358995904, 362415232, 345596160, 314441536, 274850528, 230755712, 183491744, 133441952, - 82224464, 32700808, -13212930, -55892020, -96611528, -135351600, -170669120, -201400688, -227661728, -250176480, - -269402368, -285648608, -299537472, -311814080, -322783968, -332288192, -340256960, -347059136, -353240128, -359089344, - -364553600, -369461664, -373696512, -377195296, -379940320, -381985792, -383444480, -384410304, -384898848, -384869856, - -384300800, -383224352, -381696416, -379749728, -377424000, -374818048, -372054752, -369180352, -366176576, -363069152, - -359940256, -356811936, -353631488, -350401696, -347243808, -344273856, -341512704, -338963648, -336672288, -334662240, - -332880896, -331277280, -329867456, -328667552, -327624416, -326662880, -325738368, -324787584, -323680544, -322275008, - -320497440, -318308608, -315630720, -312372448, -308554208, -304337088, -299901472, -295304224, -290483680, -285365696, - -279950272, -274330848, -268670080, -263132240, -257809168, -252722320, -247888864, -243344800, -239099760, -235146240, - -231518064, -228269456, -225366592, -222675808, -220095600, -217629744, -215315296, -213116816, -210895248, -208448720, - -205616720, -202393360, -198915504, -195302896, -191572720, -187729792, -183824608, -179889872, -175917024, -171932912, - -167981008, -164011376, -159920416, -155695248, -151405648, -147074176, -142689552, -138297408, -133931040, -129537288, - -125114008, -120789512, -116638424, -112566264, -108506440, -104497088, -100477536, -96285648, -91947200, -87612504, - -83182776, -78420200, -73369312, -68145560, -62472984, -56077776, -49192944, -41836204, -33221036, -22813792, - -10376641, 7129646, 35794796, 75874352, 112670416, 124075160, 101861056, 60357176, 18902152, }, - }, - { - { - 75551160, - 153462400, 61649960, -181907440, -461093184, -644651520, -667696128, -550006528, -353678208, -133872520, 77957952, - 265927200, 421319648, 540801856, 624756160, 674512256, 692065792, 681486208, 648934144, 601438208, 545628352, - 486087232, 424217664, 359794784, 294002336, 229964896, 170295456, 115383760, 64259692, 15963320, -30186640, - -74560096, -116906328, -156557456, -193199984, -227206448, -259244224, -289785216, -318798784, -345656832, -369518592, - -390016320, -407445824, -422309088, -434948128, -445623808, -454563232, -461833536, -467435264, -471597088, -474762464, - -477283072, -479235680, -480473696, -480748576, -479894400, -477985824, -475232768, -471772640, -467756288, -463552064, - -459556672, -455851712, -452353472, -449206336, -446673920, -444710592, -443041984, -441627328, -440660416, -440154688, - -439923840, -439966240, -440475744, -441451232, -442630752, -443856960, -445195904, -446641696, -447974208, -449013056, - -449805472, -450459392, -450933984, -451080544, -450812128, -450166784, -449283648, -448369344, -447608064, -446953632, - -446004960, -444204320, -441246144, -437220704, -432293824, -426354976, -419100768, -410395936, -400439136, -389628704, - -378339904, -366740800, -354755712, -342292256, -329602240, -317287488, -305881664, -295553344, -286270304, -278059392, - -270983456, -264992496, -259904576, -255485600, -251535296, -247990880, -244910304, -242226496, -239601728, -236631760, - -233112032, -229034496, -224499008, -219741808, -215028080, -210395952, -205689744, -200887424, -196107136, -191308576, - -186331248, -181236352, -176257936, -171451344, -166762304, -162288016, -158070896, -153847872, -149404736, -144890192, - -140407856, -135756944, -130899328, -126020784, -120862528, -114834544, -107882064, -100117832, -90797216, -79146048, - -64960308, -45236744, -12382391, 36526548, 86974160, 112453520, 99419368, 61046516, 19385872, }, - { - -75551160, - -153462400, -61649960, 181907440, 461093184, 644651520, 667696128, 550006528, 353678208, 133872520, -77957952, - -265927200, -421319648, -540801856, -624756160, -674512256, -692065792, -681486208, -648934144, -601438208, -545628352, - -486087232, -424217664, -359794784, -294002336, -229964896, -170295456, -115383760, -64259692, -15963320, 30186640, - 74560096, 116906328, 156557456, 193199984, 227206448, 259244224, 289785216, 318798784, 345656832, 369518592, - 390016320, 407445824, 422309088, 434948128, 445623808, 454563232, 461833536, 467435264, 471597088, 474762464, - 477283072, 479235680, 480473696, 480748576, 479894400, 477985824, 475232768, 471772640, 467756288, 463552064, - 459556672, 455851712, 452353472, 449206336, 446673920, 444710592, 443041984, 441627328, 440660416, 440154688, - 439923840, 439966240, 440475744, 441451232, 442630752, 443856960, 445195904, 446641696, 447974208, 449013056, - 449805472, 450459392, 450933984, 451080544, 450812128, 450166784, 449283648, 448369344, 447608064, 446953632, - 446004960, 444204320, 441246144, 437220704, 432293824, 426354976, 419100768, 410395936, 400439136, 389628704, - 378339904, 366740800, 354755712, 342292256, 329602240, 317287488, 305881664, 295553344, 286270304, 278059392, - 270983456, 264992496, 259904576, 255485600, 251535296, 247990880, 244910304, 242226496, 239601728, 236631760, - 233112032, 229034496, 224499008, 219741808, 215028080, 210395952, 205689744, 200887424, 196107136, 191308576, - 186331248, 181236352, 176257936, 171451344, 166762304, 162288016, 158070896, 153847872, 149404736, 144890192, - 140407856, 135756944, 130899328, 126020784, 120862528, 114834544, 107882064, 100117832, 90797216, 79146048, - 64960308, 45236744, 12382391, -36526548, -86974160, -112453520, -99419368, -61046516, -19385872, }, - }, - { - { - -13823352, - -47267724, -74880608, -61845920, -6009196, 44543644, 47750372, 14274324, -18374406, -32921998, -33450816, - -21314312, 3723200, 28790776, 37921340, 34105800, 34695284, 46452756, 58769112, 60761440, 52750788, - 39390220, 21638046, -484794, -23184234, -41142564, -52540336, -60076392, -67866392, -77767896, -88068840, - -95563024, -98660768, -97868880, -93894424, -87059520, -78726752, -71621264, -67964640, -68108520, -71229352, - -76540072, -83599392, -92124368, -101866424, -112522776, -123819072, -135798272, -148773904, -162830800, -177528720, - -192135904, -205949584, -218430224, -229228848, -238058224, -244521072, -248239440, -249127424, -247208112, -242242064, - -233946864, -222463744, -208111568, -190840432, -170512880, -147554144, -122718488, -96416648, -68859600, -40615360, - -12434467, 15179488, 41655816, 66042640, 87632904, 106451840, 122465624, 134834592, 142813024, 146960352, - 148492048, 147635744, 143687056, 136782896, 128596152, 120716496, 112976968, 104157248, 94144608, 84591528, - 77207944, 72052912, 67976984, 64288680, 61347704, 59770376, 59760176, 61251064, 64079840, 67826664, - 71883256, 75900128, 80009336, 84478784, 89176944, 93355408, 95978024, 96419328, 94885488, 92028264, - 88208424, 83328808, 77226200, 69879656, 61287572, 51490752, 40765684, 29568702, 18323404, 7390028, - -2895345, -12336220, -20874614, -28348932, -34424164, -38874284, -41757284, -43234216, -43418900, -42440184, - -40466644, -37689412, -34455300, -31303332, -28665148, -26590680, -24850144, -23074712, -20723218, -17311940, - -12910672, -8087424, -3198140, 1877975, 7174743, 12360379, 17249662, 22040162, 26753888, 31093416, - 35297652, 40359808, 46330348, 50592032, 49059264, 39942124, 26100516, 12942884, 3613141, }, - { - -13823352, - -47267724, -74880608, -61845920, -6009196, 44543644, 47750372, 14274324, -18374406, -32921998, -33450816, - -21314312, 3723200, 28790776, 37921340, 34105800, 34695284, 46452756, 58769112, 60761440, 52750788, - 39390220, 21638046, -484794, -23184234, -41142564, -52540336, -60076392, -67866392, -77767896, -88068840, - -95563024, -98660768, -97868880, -93894424, -87059520, -78726752, -71621264, -67964640, -68108520, -71229352, - -76540072, -83599392, -92124368, -101866424, -112522776, -123819072, -135798272, -148773904, -162830800, -177528720, - -192135904, -205949584, -218430224, -229228848, -238058224, -244521072, -248239440, -249127424, -247208112, -242242064, - -233946864, -222463744, -208111568, -190840432, -170512880, -147554144, -122718488, -96416648, -68859600, -40615360, - -12434467, 15179488, 41655816, 66042640, 87632904, 106451840, 122465624, 134834592, 142813024, 146960352, - 148492048, 147635744, 143687056, 136782896, 128596152, 120716496, 112976968, 104157248, 94144608, 84591528, - 77207944, 72052912, 67976984, 64288680, 61347704, 59770376, 59760176, 61251064, 64079840, 67826664, - 71883256, 75900128, 80009336, 84478784, 89176944, 93355408, 95978024, 96419328, 94885488, 92028264, - 88208424, 83328808, 77226200, 69879656, 61287572, 51490752, 40765684, 29568702, 18323404, 7390028, - -2895345, -12336220, -20874614, -28348932, -34424164, -38874284, -41757284, -43234216, -43418900, -42440184, - -40466644, -37689412, -34455300, -31303332, -28665148, -26590680, -24850144, -23074712, -20723218, -17311940, - -12910672, -8087424, -3198140, 1877975, 7174743, 12360379, 17249662, 22040162, 26753888, 31093416, - 35297652, 40359808, 46330348, 50592032, 49059264, 39942124, 26100516, 12942884, 3613141, }, - }, - { - { - 2399276, - -6981470, -37100464, -59681792, -47691316, -11667816, 11209328, -922881, -34048352, -57713088, -54652384, - -29446296, 2738042, 29563870, 47957604, 63478544, 83597240, 109465832, 134631648, 151935008, 159254160, - 157895888, 149123408, 135013376, 119935888, 107310296, 95519000, 79781704, 57790396, 31268436, 2309082, - -29219736, -63930052, -100523712, -136403872, -169684496, -199461504, -224601552, -243487072, -255247760, -260666400, - -261562976, -259544336, -255550016, -250220496, -244148496, -237598672, -230261792, -221560176, -211221120, -199524848, - -187181120, -175184192, -164689440, -156591280, -150953600, -147014048, -143871744, -140983920, -137935024, -134219872, - -129642512, -124592168, -119487064, -114226800, -108583752, -102711992, -96756488, -90368256, -83233784, -75692360, - -68136968, -60199336, -51301236, -41661720, -31911608, -22032108, -11659226, -1228898, 8220568, 16375100, - 23738284, 30291330, 35051228, 37327560, 37614248, 36836860, 35376036, 33252174, 30627412, 27485106, - 23219666, 17203492, 9615895, 1139240, -8105677, -18764176, -31217432, -44790604, -58303644, -71284648, - -84368192, -98453536, -113515984, -128303024, -141292080, -151974736, -161100464, -169590544, -177366048, -183394032, - -186791344, -187751280, -187439888, -187079104, -187031872, -186655520, -185028272, -181873072, -177797152, -173789408, - -170582144, -168336944, -166671040, -164970224, -162876432, -160525472, -158280288, -156321776, -154579632, -152888480, - -151038432, -148774448, -145900032, -142354544, -138143328, -133252968, -127670048, -121401008, -114444232, -106790600, - -98462664, -89550072, -80235360, -70754752, -61323544, -52166136, -43558484, -35611184, -28093382, -20743082, - -13269838, -4217121, 9205726, 27543626, 44898516, 51582020, 43380780, 26081188, 8227547, }, - { - 2399276, - -6981470, -37100464, -59681792, -47691316, -11667816, 11209328, -922881, -34048352, -57713088, -54652384, - -29446296, 2738042, 29563870, 47957604, 63478544, 83597240, 109465832, 134631648, 151935008, 159254160, - 157895888, 149123408, 135013376, 119935888, 107310296, 95519000, 79781704, 57790396, 31268436, 2309082, - -29219736, -63930052, -100523712, -136403872, -169684496, -199461504, -224601552, -243487072, -255247760, -260666400, - -261562976, -259544336, -255550016, -250220496, -244148496, -237598672, -230261792, -221560176, -211221120, -199524848, - -187181120, -175184192, -164689440, -156591280, -150953600, -147014048, -143871744, -140983920, -137935024, -134219872, - -129642512, -124592168, -119487064, -114226800, -108583752, -102711992, -96756488, -90368256, -83233784, -75692360, - -68136968, -60199336, -51301236, -41661720, -31911608, -22032108, -11659226, -1228898, 8220568, 16375100, - 23738284, 30291330, 35051228, 37327560, 37614248, 36836860, 35376036, 33252174, 30627412, 27485106, - 23219666, 17203492, 9615895, 1139240, -8105677, -18764176, -31217432, -44790604, -58303644, -71284648, - -84368192, -98453536, -113515984, -128303024, -141292080, -151974736, -161100464, -169590544, -177366048, -183394032, - -186791344, -187751280, -187439888, -187079104, -187031872, -186655520, -185028272, -181873072, -177797152, -173789408, - -170582144, -168336944, -166671040, -164970224, -162876432, -160525472, -158280288, -156321776, -154579632, -152888480, - -151038432, -148774448, -145900032, -142354544, -138143328, -133252968, -127670048, -121401008, -114444232, -106790600, - -98462664, -89550072, -80235360, -70754752, -61323544, -52166136, -43558484, -35611184, -28093382, -20743082, - -13269838, -4217121, 9205726, 27543626, 44898516, 51582020, 43380780, 26081188, 8227547, }, + { + {-154, -60, 35, -29, -89, -7, 205, -106, 24, -45, -3, -79, 148, -77, -82, -93, 176, -105, -28, -50, 49, 81, 103, -146, -1, 139, 61, 23, -8, -18, 63, 141, 34, -183, -94, -99, 159, -17, 121, -77, 56, 159, -78, -121, 42, -45, -8, -108, -44, -81, 30, -146, -48, -38, -5, 196, -65, -30, -7, -52, -21, -19, 119, 61, 73, -103, 75, 78, -70, 32, 47, -53, -72, 83, -126, 88, 54, 23, -117, -41, 43, -11, -24, -32, -3, -63, -73, -12, -12, 8, -27, 0, 43, -2, 16, 6, + 8, 0, -8, -32, -19, 21, -11, 1, -4, -97, 102, 12, -44, -66, -18, -34, 0, -82, -63, 46, -13, -32, -143, -22, 133, -90, -22, 100, -58, -107, -82, 68, 1, -11, -21, -103, 35, -46, -24, 116, -64, -158, -47, 8, 47, 41, 14, -120, -28, -146, -133, -36, 139, -24, -274, -13, 92, 80, -57, 54, 59, 5, 82, -148, -104, -14, 43, 6, 31, -16, 39, 35, 57, -9, 35, 33, -28, 56, -14, -145, -118, -77, -61, -65, 20, -33, 112, 92, -17, -45, -39, -21, 34, 52, 7, -31, + 6, 7, -30, 39, 0, -10, -15, -4, -23, 15, -4, 2, -26, 15, -16, 0, 0, 10, -4, -13, -5, -25, -10, 2, -12, 1, -20, 125, 70, 188, 12, -37, -23, 133, -36, 71, -122, -13, -3, 70, 48, 119, 84, -62, -121, -99, 67, -42, 92, 57, 12, -6, 76, 53, -56, 62, -130, -18, -120, -103, -145, 42, 82, -16, 114, -90, 106, -216, 82, 36, 159, 46, 57, 85, -4, -55, 59, 138, 47, 67, -23, -3, -197, -14, 31, 37, -29, 104, 197, -67, -142, 94, 21, -101, -2, -47, + -102, 12, 142, 35, 51, 23, -15, 53, 33, -4, 47, 2, -13, -11, -27, 27, -40, -6, 66, -15, -2, 24, -16, 44, -63, -29, 1, -26, -28, 6, -16, 21, 48, -19, 27, 6, 3, 0, 7, -55, -14, -13, 11, 44, 26, 69, 103, 99, -96, 152, -54, -101, -149, 35, -197, -12, 20, 55, -126, 81, -2, 18, 53, 32, 45, -170, -11, -39, -111, 65, 33, 25, 95, 334, -25, 17, 48, 83, 33, -274, 57, -46, -32, 150, 4, 75, 108, -136, -76, -39, -132, -282, 13, -106, -17, -25, + -6, -65, -138, 39, -132, -42, 30, -147, 152, 53, 43, -62, -11, -24, 30, -47, 78, -121, 40, 184, 152, -53, 77, -72, 33, -137, -5, 85, 98, 88, -15, 164, 15, 82, 73, -3, 34, 18, 6, -28, 16, 26, -10, 3, -18, -45, -7, 31, -24, 66, -18, -34, -29, 23, -17, 29, -6, -28, 17, -8, 34, 21, 20, 14, -59, -14, 8, 26, 1, 5, -16, 223, -284, 12, -175, 89, 129, 157, -25, -150, 3, 155, 33, 29, -117, -16, -205, 271, -15, -209, 226, 56, 67, -15, -82, -27, + -108, -107, 83, 118, -25, 111, -93, -58, 0, 156, 147, -42, -84, 121, 77, 11, 103, 24, -121, 127, 79, -10, -42, 35, -131, 347, -18, -13, 258, -24, -159, -86, -19, 63, -165, 112, 34, 3, -150, -126, -264, -24, 123, 61, 149, -83, -59, 312, -87, 52, -44, -130, 10, 57, -136, -240, 10, -148, -150, -73, 78, 7, -23, -92, -32, 10, -35, -26, 24, 85, 12, 21, -61, -31, -6, -1, -86, -63, -54, -4, 20, 8, -28, 2, -6, -9, -45, -17, -7, -18, -24, -300, -5, -127, -143, 42, + -172, 3, 115, 62, 243, -409, 260, -45, 113, -80, -60, -216, 190, 167, 41, -192, -12, -112, -15, 197, 137, 29, 187, -4, 8, 17, -8, -134, 281, -30, 1, 327, -213, 77, -102, -23, 102, -46, -169, 315, 245, -10, 79, 131, 340, -46, -63, -187, 31, 63, -197, -210, -185, 219, 4, -92, 150, 106, 1, -54, 48, -120, -32, -131, -30, 121, -241, 56, -51, -167, 101, 159, 67, 165, 143, -123, -196, -98, 85, -78, -151, 97, 163, -120, 20, 35, 18, -112, 64, -50, -40, -72, -38, -56, -6, -7, + 21, 34, -29, -25, -11, -45, -26, -12, -18, 35, 44, 11, 65, -60, 44, -52, -24, 45, 224, 238, 40, -205, -28, -195, 81, 513, 127, 356, 131, 5, -332, -81, 55, 321, -142, -71, -124, 31, 258, -189, 126, 223, 50, 82, -146, 276, -59, 359, -3, -110, -337, 42, 1, 402, -121, -33, 255, 2, 34, -83, -264, 28, 152, -189, -149, 40, -316, 174, 176, -53, -21, 89, 179, -15, -110, -4, 263, -33, -40, -99, 340, 345, 23, -62, 54, -14, 90, 160, -13, 231, -90, -128, -186, 63, -15, -283, + -204, -117, 223, -65, -104, -29, 0, -96, -145, -51, -43, -86, 14, -54, -48, 46, -92, -95, 30, 76, -46, -61, -46, -80, -38, 25, -28, 14, 42, -14, -24, -70, 43, 6, -226, 229, 174, 14, -150, -168, -73, -335, 389, 293, -63, 108, 35, -64, 295, -24, -137, 437, -473, 122, 204, -2, -193, 208, 32, 301, -116, -32, 80, 120, 20, -41, 437, 189, -200, -302, 210, -302, -88, -348, -45, 521, 213, 252, 2, -276, -46, -135, -60, 390, -61, -429, -35, 84, -273, -45, 176, 139, -184, -96, 188, 249, + -72, 259, 4, 65, 97, 22, 102, 156, 150, 147, -77, -312, -345, 86, -69, 246, -44, 292, 99, 136, -156, -139, 104, -5, 21, 27, 13, -139, -64, -22, -116, -3, -100, 18, -57, 43, -14, 75, 0, 41, 13, -37, -33, -45, 92, 11, -27, 29, 48, 40, 9, -68, -191, -108, 1, -92, -2, 189, -27, 176, -359, 126, 99, 50, -236, -198, -252, 192, 99, -181, -180, 242, 77, -22, -152, -250, -103, 98, -161, 16, -299, -86, 32, 99, 191, -34, 121, 166, -175, -415, 281, 10, -68, 267, -45, 8, + -185, 235, -155, -196, -78, 192, 293, 245, 74, 47, -525, 234, -35, 97, -183, -37, -205, -73, -53, -271, -138, -113, -150, 275, -93, 358, -47, -23, 223, 255, 432, 296, -9, -144, -20, -2, -212, 50, -138, -232, 442, -286, -304, -46, 164, 22, 50, 19, 185, -5, 50, 64, -74, 9, 113, -66, 46, 81, 66, 142, 31, 1, 78, 13, -28, 52, 81, 31, -1, 24, 12, 165, 13, 134, 89, 19, 141, 155, 15, -5, 21, 21, 19, -14, -19, 39, -97, -140, -554, 123, -382, -228, 361, 281, -633, -581, + 20, 248, -147, 153, -209, -23, -368, -96, -332, -24, -91, 11, 127, 105, 207, -26, -176, 153, -210, -84, 67, 13, 107, 219, -36, 28, 50, -89, -23, -321, -381, -368, 0, -371, 124, 49, -147, -172, -74, -62, -32, -221, -349, -20, 553, 305, -78, -331, -342, 381, -359, -118, -64, -240, -182, -244, -286, -397, -538, -78, -87, -77, 179, 170, 44, 149, -123, -150, 497, 210, -134, -367, 113, -217, -258, -2, 416, -84, -5, 286, -33, -192, 7, 67, -7, -79, -77, -3, 69, 33, 46, 28, 141, -43, 75, -207, + 94, 49, -39, 43, -45, 75, -39, -61, -36, 68, 58, 7, 78, -118, 115, -59, 35, -456, 51, 228, 248, 230, 97, 455, -181, -334, -88, 57, -69, 144, 303, 612, 384, 223, 284, -238, -454, -157, -341, 383, 85, -83, -277, 435, 373, -141, -30, -4, -228, -191, -342, 99, 115, 192, -324, 27, 90, -149, -315, 7, 180, 238, 39, -614, -221, -304, 123, 363, -2, -346, 80, -334, 181, -83, 27, -237, 491, 387, -124, -117, -287, -22, 392, 88, 483, 465, 387, 227, 78, -315, -176, -418, 478, 480, -41, -369, + 234, 558, -9, 69, -137, -15, -369, 57, -291, 197, 68, 278, 276, 150, 22, 24, 170, 62, -42, -114, -38, -174, 29, 133, -115, -65, -132, 94, -31, 202, -193, 51, -8, 192, -94, 63, 116, 21, -7, 7, 33, -89, -36, 115, -301, -75, 222, 386, -404, -491, -424, 468, -193, 313, -4, 6, 752, -90, 55, -332, -519, 131, -77, 141, 91, -40, -297, 85, 111, 53, -280, 187, 135, 549, -253, 39, 300, 308, 12, 311, -78, 14, 277, 235, 63, -119, -441, -333, 259, -6, -101, -86, 66, 594, -36, -206, + 302, -144, 285, 70, 855, -167, -27, -1, 127, 293, -57, -99, 190, -400, 327, 602, 178, -126, 336, -128, -18, 682, -393, 151, 268, -114, 568, 136, 122, -217, -326, 59, 149, -350, 356, 0, 90, 3, 104, 329, -74, 332, 157, 110, 185, 165, -96, 210, 195, -170, 65, 145, 266, 64, 77, 133, 156, 237, 24, 9, -14, 162, 137, -148, -2, 108, 151, 119, -88, 226, -6, 79, 28, 187, 95, 88, 89, 130, 73, 86, 149, -426, -121, 294, -141, -222, -198, -203, 38, 296, -36, -653, 2, -496, 195, 215, + 6, 102, -217, -27, 266, -625, 161, -135, 351, 244, 159, 29, -248, -563, -29, -492, 307, 6, -148, 523, 272, -205, -163, -106, -78, -143, -279, 53, 82, 756, -24, -536, 1, 370, 29, -274, 176, -415, 281, -174, 186, -240, 114, -424, 1126, 46, 779, -72, -212, 205, -250, -243, 435, 425, -368, -977, 934, -324, -255, -120, -130, 127, -85, 75, 403, 99, -324, -260, -196, 123, -205, -27, 187, -505, -43, 35, -79, -147, 57, -103, 277, -108, 123, -122, -90, 9, -129, 77, 66, -52, 70, -117, 58, -30, -9, -52, + 1, -211, -156, -29, -87, -172, -231, -128, -57, -91, -20, -153, -1, -136, -40, -177, 96, -98, -55, -481, -171, -146, -413, -728, -180, 11, -387, 189, -166, 323, -279, -117, -398, 948, 802, -180, 179, 550, -579, 587, -244, -245, 211, 77, 100, -87, -128, 16, 190, 164, -257, 294, -277, -462, 335, 294, -384, -478, -552, -81, -92, 154, -361, -452, -231, 756, 265, 257, -324, 291, 398, -311, 743, 137, -266, -349, 199, -293, -635, 154, -7, 14, 347, 323, -279, 52, -814, -102, -321, 673, 40, 94, -393, 318, -692, -85, + 271, 77, -75, -80, 84, -33, 78, -104, 19, 57, 164, 40, 52, -38, 98, -102, 31, 306, -60, 13, -98, 136, 64, -17, 161, -170, -161, 174, -147, -55, -134, 73, -196, -90, -64, 157, 158, -253, 40, 128, -87, -285, -137, 210, -138, -352, 446, 470, 425, 287, -4, 389, 353, 59, -67, 157, 1, -398, -47, 151, -311, 444, -463, 370, 404, -116, -91, 171, 538, 403, -487, -106, -130, -39, 121, -227, -238, 528, 13, 758, -495, -470, 382, -253, 138, -298, 255, 291, 192, -119, -436, 43, 145, -363, -665, -23, + 61, -393, 719, -82, -203, 954, 899, 90, -124, -34, -191, 216, -471, 442, 59, -257, 534, 85, 109, -153, -290, -718, 158, -245, -118, 331, 135, -158, -468, -130, -533, 228, 480, -68, -362, -254, -361, 4, 195, 233, -49, -256, -133, -140, 34, -78, -122, 103, -19, -76, 127, -290, 83, 74, 448, 40, -99, -230, 198, -240, -31, 167, -318, 296, 63, -13, 61, 199, -101, -314, 8, -94, -39, 301, 288, -787, -1824, 611, 579, -204, 129, -439, 788, 504, -446, 127, 107, 11, -201, -145, -942, 399, 465, -107, 0, -53, + 313, -236, 597, 177, -709, -402, 901, 591, -586, -138, -208, -359, 56, -143, 129, 1170, 319, 1226, 701, 790, 721, 1413, -92, -131, 338, -100, -1185, 961, -416, 551, -783, -623, -1169, 232, -107, -393, 286, -549, 2, -785, -783, 220, 458, -637, -169, -442, -613, -689, -495, 377, -299, -861, 1237, 775, 1247, -162, -268, -248, -439, -707, -45, -155, -534, -179, 158, -379, -341, 40, -55, -168, -138, 307, 328, 11, 83, 233, 293, 60, -24, -45, 138, -58, 35, -53, -205, -5, 195, -201, 266, 335, 142, 12, 55, 36, -222, 19, + 128, -114, 2, -52, 37, -79, 31, 125, -170, -145, 270, 111, -33, 42, -659, -1736, 760, 906, -402, -172, -40, 1026, 38, 224, 221, -235, 209, 481, -90, -452, 120, 874, -455, -283, 196, -116, 656, -157, 299, -329, -396, -396, 431, -123, 384, 446, -108, 64, 8, -355, 125, -321, 391, 950, 1558, -14, -39, -652, 361, 514, -10, 576, 821, 348, 469, -710, -424, 600, 1556, -279, -904, 237, -297, -11, 426, 13, -409, -193, -208, -1049, -435, 12, 181, 373, -55, -401, -228, 104, -159, -403, 426, 1020, 445, 552, 61, -134, + -820, -178, 240, 187, -179, 473, -127, 267, -572, 38, -194, -161, 11, 165, 162, -158, -309, 309, -114, 255, 28, -58, 26, 58, 237, 12, -31, -115, -127, 204, 71, 188, -387, 278, 164, 79, -137, -48, 290, -30, 17, -215, 26, -333, -66, 102, 292, 147, 258, 552, 183, 289, 113, 833, -264, -106, -328, 193, -204, 182, 946, 186, -1004, -246, -293, -860, 545, 256, -100, 119, 53, -387, -4, -29, -383, -117, 825, 1211, 572, -426, -669, 313, 555, 59, 444, -312, -214, 453, 144, 3, -1019, -1333, -43, -781, -451, 275, + 1113, 237, 56, -326, -384, -561, -490, 87, 336, -123, -551, -893, 354, 19, -494, -833, -560, -917, -1645, -998, -148, -202, 1981, -247, -73, 1136, 135, 59, 688, -415, -1001, -1170, -179, -563, -616, -662, -716, 134, 650, 1024, 613, 120, 69, -271, 533, 103, -159, -670, 139, 476, -21, -9, -236, 127, 271, 435, 127, 181, 173, 214, 278, 279, -77, 210, 48, -160, -344, -422, 46, 92, -410, -210, -394, 123, 209, 309, 468, 776, 588, 591, 361, 226, -138, 56, 9, -373, -556, -429, -473, 625, -888, 224, 141, -387, -1245, 846, + 251, -81, -1261, 335, 196, -667, 111, 584, 359, 169, -571, -117, -213, 100, -215, 52, -442, -637, 697, -482, 1059, -655, -592, -402, -744, 64, -14, 1112, -825, -871, 449, 286, -720, -959, -106, -541, 621, 131, -794, 514, -135, -1221, 801, -545, 523, -908, -222, -27, -381, -158, 104, 1143, -309, -109, -329, 325, -541, 422, 894, -57, 900, 704, -107, 1440, -84, 164, -42, 405, 1455, -122, -402, -1558, 1205, 427, 1028, 347, -807, 357, 231, 146, -716, 407, 85, 116, -384, -115, 491, 417, 20, -53, -49, -59, 121, 305, -629, -189, + -86, 98, -128, 137, 137, 196, -145, -338, 521, 811, 287, -421, -356, -157, -120, 217, 113, -85, -512, -371, -414, -44, 402, 172, 340, 125, -559, -104, 248, 852, -1644, 63, -1850, -620, -315, 563, 1708, 1452, 535, 857, -558, -470, 82, -127, 395, 125, -387, 573, 844, 701, 524, 443, -15, 79, -288, 798, 372, -153, -493, 164, 327, -88, 1044, 1091, -632, -467, 23, 848, 528, 135, 103, -203, -384, 211, 1304, -530, -647, -704, 681, 278, -393, -609, -976, -1155, 125, 252, 207, -256, -87, -318, 226, -921, -1512, -682, -107, -258, + -592, 755, 1262, -286, 650, 1395, 909, 322, -966, 154, 171, -854, -474, -138, -681, 739, 1052, -65, -246, -133, -311, -174, -433, -425, -158, -212, 149, -97, -120, 204, -643, -81, 49, 647, -669, -112, -155, 120, -427, -152, 126, -236, -395, -68, -33, -388, 448, -623, -73, -232, 134, -70, -186, -366, 8, 177, -133, -1047, 841, -109, 722, 437, 15, 478, -213, -56, 412, 505, 76, 1, -19, -464, -302, 122, -646, 16, -245, 14, -548, 91, 28, -498, 412, 174, 278, -625, -171, 116, -35, 43, 355, 77, 97, -73, -141, -99, + -54, 229, -107, -400, 320, -549, -175, -190, 63, -270, -321, 416, -56, -420, 253, -584, 464, 144, 19, 480, 532, 73, 149, -403, 516, -255, -358, -32, 74, 981, -445, -726, 618, -238, 618, -106, 37, -273, 373, -632, -527, -208, 244, 147, -42, 301, -378, -380, -255, 89, 106, 22, -20, -115, 61, -523, 102, 106, -130, -49, 154, -84, -228, 271, -139, 33, -15, -69, 179, 79, -194, -22, -49, -170, -41, -63, -352, 107, 208, 170, -162, 159, -258, -79, 2, 505, -233, -2731, -5202, -1856, -4075, -4644, 1129, -164, 1549, 6006, + 6513, 4597, 6560, 5391, 1784, 1883, 1391, -3632, -3741, -2084, -3630, -3922, -1319, -1161, -3307, -2493, -412, -1481, -1810, -457, -1388, -2447, -1398, 445, -988, -1214, 1424, -252, -1365, 1228, 2281, -538, 563, 3540, 479, -1148, 2344, 2048, -2050, 1159, 2585, -817, 274, 4487, 3420, 1720, 6302, 7018, 3584, 6463, 8345, 5237, 4940, 6863, 4409, 2804, 3105, 1614, -1897, -3662, -4968, -8474, -10313, -11690, -13221, -13036, -14130, -12621, -9370, -9367, -7386, -665, -388, 186, 5281, 4171, 1383, 2764, 4114, 1519, 1830, 4180, 3039, 615, 2504, 3540, 1516, 1905, 4355, 1628, -702, 2006, 1398, -975, 1891, 4214, + 1977, 3105, 6724, 5594, 5295, 7898, 7289, 5025, 4364, 3916, 1462, -59, 206, -823, -2626, -2610, -3001, -5135, -5750, -5509, -6187, -7422, -6503, -6281, -6703, -5176, -3492, -2716, -1700, 94, 719, 616, 986, 1091, 594, 553, 1000, 886, 623, 735, 844, 680, 807, 1104, 1102, 975, 1035, 1053, 859, 934, 790, 523, 376 }, + {-133, 111, 119, -56, 119, -72, -16, 159, -65, 76, 46, -176, -79, 132, -51, -25, 83, 55, 59, 16, 204, 35, -52, 46, -70, 126, -36, -69, -30, -164, -55, -121, 40, -2, 45, -48, 69, 33, -7, 21, 11, 16, 23, -87, 218, 32, -79, 161, -38, -139, -152, 149, -29, -12, 99, 11, -25, 77, -8, 45, 13, 57, -29, 62, -28, 73, 107, 58, -63, -65, -32, 29, -67, 48, -33, 59, 77, -95, -54, 83, 25, -26, 128, 74, 61, -6, 34, -2, 17, -15, 20, 8, 10, -29, 48, 16, + 4, -8, 20, 31, -16, 34, -1, 139, 27, 32, 117, 2, 85, 40, -9, 9, -91, 43, 7, 144, 51, 47, 7, 43, 157, -148, 84, 22, -98, -44, -61, -20, -56, 40, 182, 114, 136, 108, 185, 135, -168, -304, -38, 15, -74, 161, -7, 241, -112, -112, 104, 6, 9, 96, -175, 45, -126, 167, 98, 0, 253, 12, -24, -31, -44, -62, 120, 64, -61, -20, -176, -77, -23, 185, 126, 23, 93, 4, 99, 1, 41, -105, -68, 26, 14, -5, -53, 50, 58, -14, -55, -9, 59, -9, 31, -27, + -16, -21, 19, -19, 3, -1, 30, -24, 29, 45, -21, 11, 4, 0, 54, -16, 14, -19, 21, 17, 9, -5, 47, -2, 2, 21, 111, 252, 74, 11, 8, 71, 66, 15, 40, 57, -4, -5, 72, 285, 95, 223, -126, -103, -42, -133, -156, -62, 116, -193, -27, -22, -303, 61, -306, -101, -41, 73, 1, 64, -60, -3, -207, 77, -69, -115, 22, 59, -10, 16, 89, 158, -264, 73, 18, -78, -84, -16, 37, -35, -159, -37, 43, 83, -11, 198, 17, 9, 81, -126, 187, 60, 111, 50, 93, -19, + -18, 56, 33, -25, -56, -45, -93, -2, -125, 9, 73, -6, -53, -98, 87, -52, 35, 14, -15, -93, 8, -8, 23, -28, -27, 8, -30, -51, -28, -21, -5, -33, -6, -19, 44, -8, -24, -8, 23, -9, -40, -42, 45, 1, 4, -27, 150, 164, -5, 181, 12, -23, 22, 15, -33, -1, -126, -72, 113, 133, -155, -37, 65, -103, -297, 74, 110, 130, -68, -78, -106, 163, 185, 32, 73, -145, -117, 138, 52, -108, 191, -191, 32, 19, 179, 66, -39, 30, -62, 99, -233, -69, -336, -146, 171, -14, + 262, -35, -218, 139, 31, -89, -10, 11, -88, 59, 157, 177, 5, 85, -8, 201, -102, 87, -18, -3, 7, 70, -20, 252, 26, 23, -38, 149, 51, -49, -105, 3, 102, 36, 30, -65, -3, 21, -9, -17, -17, -34, 28, 3, 13, 22, 54, -20, -54, 61, -15, 7, 2, -7, -6, 25, 23, 30, -10, 28, 0, 16, 28, -6, 4, 24, 36, 20, 23, 8, 4, 184, -249, -34, -169, -175, 63, 34, 364, 19, 134, -303, -72, 67, -157, 104, 31, 26, 89, 103, 239, 106, -37, 76, -118, 35, + 97, -6, 20, 106, 137, 330, 65, -49, -225, -9, 172, -267, 30, -19, 85, -134, -157, 286, -182, 59, -11, -179, 414, 107, 217, 117, 238, -43, -88, 151, -138, 116, -110, 64, 164, 91, -72, -12, 85, -144, -105, 9, -16, 245, -133, -228, -33, 127, 207, -127, -215, -47, 302, 40, 1, -107, 16, -6, 94, 96, -4, 46, 53, -146, -32, 51, -5, 86, 36, 9, -60, -6, -7, 33, -8, 90, -15, -9, -42, 10, -54, 3, -4, 23, 54, 2, 46, -3, -50, -10, 7, -96, 110, -395, 224, 66, + -88, 120, -323, -269, 35, -133, 306, 272, 289, -193, 112, 4, 288, 20, 204, 81, -86, -259, -235, 75, -313, -5, -74, -152, -209, -123, 2, 251, 1, 98, -358, -200, -38, -225, 16, 224, -243, 100, -3, -83, -23, -52, 248, 133, 123, -60, -75, 340, -103, -93, -281, 205, -398, 54, -131, 62, 142, -96, -213, -132, 15, 288, -145, -32, -188, -152, 94, 100, 229, -268, -2, -142, -93, 55, -105, -210, -120, -19, 192, 195, 68, 10, 29, 88, 8, 13, 41, -56, 6, 80, -24, 8, 99, -25, -4, 15, + 72, -2, 11, 25, 12, 59, -71, -80, -5, -30, 1, 43, -19, 80, 51, -369, 98, 34, 61, -508, 453, 9, -10, -9, -165, 53, 5, 162, -143, 182, 51, -114, -196, -245, 122, 21, -22, 16, -142, 152, 113, 280, 166, 111, 154, -37, -156, -116, 8, -82, 121, -137, -208, -228, 12, -312, 141, 163, -187, 190, -226, 113, -333, 44, -62, 24, -89, -5, -310, -52, -107, -196, -54, -153, 47, -138, -81, -198, 86, -189, -15, 303, -53, 9, 97, -68, -310, -352, -60, -246, 10, -67, 227, 17, 84, -231, + 19, -52, -44, 167, 40, -20, -93, 45, 63, 23, 86, -4, 47, -27, -11, 13, 13, 31, -10, 97, -30, -83, 32, -1, 23, 32, 19, -12, -45, 25, -77, 29, 145, 99, -316, -11, 55, -294, -335, 181, -329, 62, 217, -160, -378, -163, 8, 247, -102, 437, -31, -36, -254, -181, -31, 87, 24, -92, -77, -22, -95, -189, 154, -157, -96, 163, 48, -266, -283, -261, 223, -243, -261, 424, -268, 186, -38, 113, -385, 174, 21, -64, -20, -77, 123, 89, 360, -93, -70, 169, 348, 94, 69, -167, -110, -290, + -62, -10, -4, 206, -67, 109, 365, -59, -14, -45, -8, -375, -426, 19, 280, 1, -566, 145, -199, 92, -353, -222, -56, 8, -130, 54, 129, -19, -19, -15, -62, 55, -70, 55, 7, 16, -61, -44, -85, 36, 5, -29, -82, -21, -26, -55, -61, 33, -69, -29, 56, 14, -34, -8, 0, -90, 7, 157, -25, 186, -27, -77, -112, 158, 98, -86, 72, 161, -83, -541, -235, -105, -59, 244, -425, -310, 262, 164, 658, 187, 152, 182, 84, -116, 14, -122, 210, 12, 212, 9, -5, -286, 150, -193, 152, -28, + 160, 66, 214, -331, 39, -229, 279, 20, -279, 372, 273, 178, -168, -559, 162, -58, -70, 278, -27, 130, 266, -56, -338, 0, 151, 102, -91, -34, -248, 95, 33, 56, -38, 38, 213, -129, 97, -32, -9, 388, -104, 180, 126, -117, -136, 51, 28, -61, 31, -63, 61, -56, 145, 17, 138, 31, -5, 180, 61, -48, 48, -37, -57, 30, 68, -62, 43, -30, -70, 1, 68, -28, -78, 28, -38, -113, 49, 5, -63, -31, -22, -62, -8, 92, 122, -113, 141, -154, -611, 126, 150, 621, -129, -99, 295, 387, + -628, -357, 345, -177, 13, 142, -400, -876, -344, 500, 397, 337, -101, 190, -101, 175, -182, 63, -441, 110, -155, 228, 221, 9, -208, 208, 131, 358, -36, -220, -109, -560, -286, 140, -37, -375, 257, 352, -496, 482, -45, -51, 303, 64, 286, -36, 103, -107, -57, 146, 574, -205, 366, -29, 35, 139, 319, -292, 35, 468, 140, -212, 125, 186, 44, 368, 265, 463, -41, 134, -4, 18, -256, -176, -203, -97, 0, -41, -82, -71, 138, 201, 91, -100, 160, -45, -25, -94, -77, 103, 34, -35, 7, -105, -91, -103, + 2, -56, 94, 60, -40, 44, 109, -65, 50, 66, -58, -50, -62, -8, -18, 70, -26, -397, -99, 414, 264, 313, -199, -99, -30, -41, 443, 59, -452, -200, -137, 294, 59, 65, 249, 544, -798, 533, -103, -92, -205, 160, 165, 314, 50, 300, -29, -77, 94, -47, 154, 276, 34, -18, 361, -265, -48, 90, -30, 320, -373, 37, -319, 55, -338, -45, 12, 189, 461, -266, -146, -275, -15, -404, -263, -264, 181, 334, 5, 660, -416, 590, -413, -94, 182, 136, 584, 339, -436, 231, -182, -601, -14, -380, 483, 735, + 467, -89, -259, -93, 410, -58, 214, 27, 95, 147, 46, 60, 49, -176, 125, 5, 53, -66, -59, -167, -95, -56, 104, -49, 70, 91, -34, -19, 2, 103, 64, 40, 187, 0, 195, -171, -77, 129, 121, -70, 41, -58, -128, 18, -406, -257, 0, 513, -89, 232, 477, -388, 179, -626, 391, -381, -183, 622, 216, 670, -276, 12, -293, 199, 856, 226, 294, -421, -76, 29, 333, 297, 549, -434, -147, -473, -402, 38, 39, 293, -273, 208, -647, 418, 317, 156, -105, -69, 48, 203, 70, 63, 2, 453, 386, 173, + 40, -328, -326, 925, 39, 123, 516, 235, -139, -99, 330, 669, -473, -190, -534, -492, 651, 298, 12, -118, 219, 500, 319, 516, 147, -218, 372, -253, -667, 208, 29, 20, 7, 291, 491, -90, 262, 296, 265, 40, 63, 260, 8, -68, -50, -96, 250, -133, -36, 71, 143, 29, -18, 271, 59, -46, 202, 260, 120, -95, 3, -38, 81, 12, 5, 3, -54, 97, 38, 32, 89, 121, -16, -112, -43, -6, 152, 62, 25, -20, 199, -427, -319, -124, -397, 449, -50, -113, -379, -62, -353, -873, 152, -106, -276, 199, + -463, -27, -253, -699, -160, -302, -332, 561, -150, -200, -102, -11, -142, -196, -32, 150, 473, 359, -14, -26, -796, 51, 108, 328, -185, -163, 1206, -205, -591, -571, 499, -333, 143, -677, 168, -188, -365, -312, -774, 127, 220, 552, 160, -295, 431, 54, 405, 455, 1301, 353, 88, -504, -571, -150, 58, -70, -517, 234, 595, 141, 422, 661, 587, -247, -474, -319, 39, 108, -60, -497, 94, -403, 122, -177, 24, -221, 145, -33, 91, 16, -99, -226, -56, -2, 132, 191, 144, 219, 9, 188, 318, 12, 58, 185, 59, -158, + -96, -272, -85, 171, 91, 26, -40, 111, 56, -53, -133, -237, 28, 44, -38, -74, -22, -80, -174, -526, -227, -81, 163, -192, 314, -162, -215, 609, 317, 693, 10, -200, -272, 735, -629, -234, 857, -516, 172, 179, 223, 51, 482, -149, 434, -163, 96, 104, -221, 322, -486, -338, -315, -145, -432, -798, -144, -238, 129, -205, -1060, 296, 669, -38, -140, 1044, -1291, -279, 723, -176, 561, -410, -253, 195, -1231, 399, -418, 617, 455, -654, 1295, 192, 71, -66, 512, -935, 385, -43, -147, 252, -603, 858, 780, -1437, 209, -286, + -1348, -232, -600, 333, 88, 235, -542, 847, -81, -226, 393, -15, 280, -58, 441, 12, 221, 69, -17, -45, 248, -176, -197, 5, -232, 352, -74, -181, 22, 162, 80, 167, 67, 408, 99, -220, 424, -228, 243, 364, -98, 83, 257, -174, 254, 42, 793, -353, -1020, -1023, 83, 129, -449, 269, -569, 185, -257, 530, 678, 24, 656, 597, -329, -6, -421, -104, -97, 232, -40, -63, -69, -683, -1033, -414, 542, 420, -442, -509, 300, 305, -671, 342, -446, -81, 523, 726, 7, -427, 280, 58, 454, 81, 379, 391, -107, -1482, + 171, 42, 603, -216, 615, 609, -403, -2007, -267, 85, -239, 1211, 1271, 888, 1263, -323, 596, -494, 846, 594, -991, 1259, -1295, -1103, -1039, 335, 788, 656, 222, -811, 755, 108, -266, -345, 48, 713, -545, -216, 1086, 204, 499, 99, 57, 271, -405, 224, -164, 12, 114, -101, -209, -136, -182, -408, 96, 386, -72, 395, 306, -246, -194, -181, 245, 156, -498, -286, 30, 29, -71, 71, 333, -4, 266, 32, -191, -793, -1501, 320, 558, -78, 766, 295, -946, -236, 205, 237, 265, -189, 444, 41, -280, -127, 160, 629, 821, 621, + 983, -939, -258, -241, -960, -228, 169, 52, 111, -381, -431, 492, 1104, -518, 572, -369, 152, -340, -55, -856, -309, -47, -1186, -693, -1160, -980, 655, 1537, 1229, 38, -73, 6, -272, -525, -1856, -619, -263, 154, 84, -654, -454, 243, 822, 490, 268, 537, 922, 361, -915, 705, -540, -284, 549, 1228, 268, 1575, -371, -1634, -185, -526, -998, 1513, 433, 493, 1, -133, 441, 362, 25, -60, -258, -51, -74, 414, 502, 597, -64, -21, -20, -20, 395, -166, -127, -228, -176, 224, -42, -6, 70, 143, 233, 285, -35, -167, -291, 149, + 60, 141, 373, 325, -159, 83, 171, -285, -84, -64, -271, -126, -7, 252, -642, -1051, 648, -103, -635, 305, 688, 595, -1228, -1061, 263, -494, 124, 599, -328, -242, 991, 268, -140, -317, -283, 371, -225, -45, -31, -405, -158, -673, -896, 317, 486, -566, 411, 280, -197, -394, 59, 705, 405, 125, -710, -794, -388, 212, 885, -666, -354, -304, 528, 1427, 376, -1398, -312, -166, 715, 15, 369, -184, -333, -311, -792, 735, 778, 313, 823, -260, 532, -249, -597, -661, -707, 123, -1322, 1383, -67, -528, -765, -627, -44, -411, -125, -728, + -450, -1292, -361, -852, 312, -304, 250, 287, 308, -215, 711, -163, 515, 18, 123, -42, 224, -112, -287, 57, 81, 264, -428, -151, 110, -423, 1, 153, -527, -232, 125, -74, -403, -624, -375, 226, -119, 284, 68, 10, 422, 28, 363, 139, 226, 848, 508, -240, 129, 1068, 801, 305, 157, 502, 454, -728, -1050, 355, 816, 1169, 4, -264, -734, -432, 489, -16, -627, -1261, -1262, 263, -382, 704, -1453, -480, 278, 207, 272, -460, 207, -40, -276, -55, -684, 626, 770, 574, -920, -491, -26, 310, 457, 492, 392, -105, -69, -125, + 652, 1818, 1145, -948, -936, -593, -1204, 1412, 750, -439, -1248, -1193, 1351, 833, 178, 1042, -1087, -120, 63, -280, 102, -404, -1100, 272, -842, 1121, 1057, -406, -192, 11, 118, 1193, 1218, -1938, -1084, -623, 240, 543, 522, -751, -808, -951, -121, 983, 18, 195, -228, -1051, 238, -442, -553, 239, 1838, 622, -348, -473, -445, -365, 480, 575, 662, -120, 426, -652, 154, 237, 293, -235, 123, 543, -145, -154, -95, 536, 345, 835, 207, -298, -229, 310, 1031, 843, 172, -621, -768, -246, -187, 180, -380, 711, -1164, 1014, 1495, 1623, -1831, 336, + -58, -158, 774, -331, -546, 537, 272, 1113, -115, -882, 25, -402, 656, -1013, -361, -476, -677, 924, -678, -96, 634, 370, -227, -353, -950, 123, 1245, 760, -56, 371, -284, 1020, -690, 472, -383, 634, 1050, -234, -687, 339, -937, 1546, 178, -819, -284, -1278, 159, 1832, -338, -1076, -757, 1124, 331, -588, -34, 290, 625, 1544, -1263, 562, 1260, -190, -1500, -1447, -853, 2539, -1862, 631, -1962, -938, 4082, 395, -1787, -1711, -1978, 2490, 315, -468, -1981, -472, 611, 2014, -727, 222, -876, 301, 1215, 748, -1100, 519, 194, 477, 414, -1108, 31, -261, + -428, 224, -416, -816, 307, -238, 1058, 162, -988, -1115, -364, 35, 849, 649, 142, -517, 212, -17, -425, 35, 537, 487, 108, -821, 195, 329, 513, 471, 325, 664, -1720, 301, -1545, 682, 730, 1443, 639, 331, 377, -450, -1104, -768, -725, 309, 180, -189, 660, 1018, -456, -640, 707, 125, -942, -217, 426, -777, -138, 171, 395, 210, 558, 958, 169, -612, -71, 184, -487, -218, 448, -341, -616, 855, -207, -213, -342, -337, 554, 141, 126, 738, -354, -571, -34, 55, -243, 188, -41, -203, -38, -719, 159, 141, -124, 387, 260, 135, + 172, -743, 878, -330, -320, 269, -806, 262, -604, 70, -479, 155, 209, 326, 28, 289, 434, -168, -100, 242, -16, -153, 131, 31, -102, -154, -142, -92, 313, -301, 303, 21, 81, 153, 89, 223, -15, -6, -138, -30, -190, 379, 25, -170, -279, -90, 144, -270, 356, -174, -458, 26, 190, -26, -16, 47, -218, -798, 1293, -65, 733, -662, 84, -119, 233, 211, 394, -199, 290, -178, 160, -27, 127, 314, -37, 485, -193, 367, 20, -14, -136, 236, -185, 213, -123, 17, -102, 117, -83, 277, -85, -191, 442, -303, 231, 187, + 69, 216, -269, -186, 203, 191, -118, -23, 217, -17, -300, 134, -152, 157, 210, 101, 73, 70, -323, 160, 92, -95, 119, -150, 75, -74, -14, -39, 114, 220, -301, 272, -53, -104, 156, -208, 100, 150, -36, -74, 104, -39, 61, -26, -107, -14, 116, -28, 45, -21, -78, 53, 47, 84, -114, 94, -8, -45, 109, -119, 189, 99, -71, 195, -15, -74, 8, -74, 116, -124, 133, 56, 71, 36, -76, 67, 30, 18, 12, 8, -31, 38, -80, 100, 38, 321, -1090, -3395, -500, 1648, 852, 4007, 745, 861, 542, -1081, + -1523, -1085, -1952, -1678, -952, -391, 1115, 3045, 2415, 2080, 1181, -938, -1526, -1123, -2102, -1990, -611, -280, -466, 770, 1204, 797, 1469, 1136, 347, 1045, 212, -157, 95, -632, -1662, -1412, -1201, -1684, -706, 491, 336, 1076, 1218, 1065, 1092, 1116, 706, 691, 74, -622, -1161, -793, -1093, -1444, -712, -663, -541, 202, 545, 522, 1018, 1273, 615, 897, 766, -215, 87, 343, -426, -385, -682, -1224, -1228, -976, -1010, -199, 423, 282, 802, 1203, 948, 875, 900, 600, 197, 56, -280, -526, -565, -842, -1065, -1133, -976, -877, -501, 111, 552, 1264, 1673, 1467, + 1217, 1032, 597, 123, -516, -1064, -1449, -1518, -1673, -1234, -515, -131, 350, 994, 1285, 1386, 1429, 1194, 507, -38, -369, -815, -1059, -996, -883, -638, -261, 31, 350, 452, 347, 378, 301, 204, 160, 162, 53, 48, -23, -93, -111, -105, -143, -158, -158, -133, -107, -66, -18, 55, 102, 136, 166 } }, -}; -const Word32 CRendBin_FOA_HRIR_coeff_re_16kHz_fx[4][BINAURAL_CHANNELS][80] ={ -{ - { - 572464896, - 446544000, 252232688, 61201672, -83722336, -178265840, -238997216, -280229984, -301735936, -293937376, -252640720, - -185028800, -102048424, -11938935, 77425912, 157634960, 224741136, 280230496, 325673408, 360901792, 386732288, - 404316960, 413118400, 413817952, 410262784, 404473728, 393900032, 377298368, 358098272, 338798304, 318054688, - 295855616, 275074400, 256112656, 236518480, 216469568, 198215968, 181007632, 162929040, 145482896, 130317360, - 115066472, 97917736, 81350976, 66697084, 51218020, 34267932, 19015430, 5561446, -9485435, -25609280, - -39352100, -51927764, -66678292, -81533512, -93280248, -104763920, -118843352, -131907032, -141742512, -152884192, - -166880960, -178507968, -187327680, -199386336, -213892592, -224269776, -233192032, -248051536, -264364896, -274931584, - -287834752, -310893344, -332552864, -347976096, -380855136, -437410208, -466602016, -425214112, -361132128, }, - { - 572464896, - 446544000, 252232688, 61201672, -83722336, -178265840, -238997216, -280229984, -301735936, -293937376, -252640720, - -185028800, -102048424, -11938935, 77425912, 157634960, 224741136, 280230496, 325673408, 360901792, 386732288, - 404316960, 413118400, 413817952, 410262784, 404473728, 393900032, 377298368, 358098272, 338798304, 318054688, - 295855616, 275074400, 256112656, 236518480, 216469568, 198215968, 181007632, 162929040, 145482896, 130317360, - 115066472, 97917736, 81350976, 66697084, 51218020, 34267932, 19015430, 5561446, -9485435, -25609280, - -39352100, -51927764, -66678292, -81533512, -93280248, -104763920, -118843352, -131907032, -141742512, -152884192, - -166880960, -178507968, -187327680, -199386336, -213892592, -224269776, -233192032, -248051536, -264364896, -274931584, - -287834752, -310893344, -332552864, -347976096, -380855136, -437410208, -466602016, -425214112, -361132128, }, - }, - { - { - 106724032, - 257402224, 451714592, 544733376, 451847200, 201333568, -102984728, -363801440, -536040384, -617267328, -623113856, - -573654080, -485942816, -371313344, -239997936, -103555960, 29695404, 155337696, 267583984, 360738048, 436065344, - 499282432, 551908672, 592087040, 620928768, 640871936, 651791872, 654910016, 655111872, 654414528, 649687360, - 640095616, 628916352, 616357888, 599612352, 580264064, 562188672, 543567808, 520421184, 494704544, 469889824, - 443905824, 414950752, 387043136, 362318624, 336644384, 308771648, 283371200, 260980464, 236863696, 211723632, - 190507040, 171147472, 148254752, 124722632, 105695920, 87316688, 65259344, 44970992, 30302068, 14660871, - -4860829, -20713016, -31747324, -47103980, -66554812, -80329312, -91495152, -111316424, -134142032, -148395408, - -164614288, -196001376, -227258000, -247551712, -288954112, -372055840, -441701408, -434066560, -385475456, }, - { - -106724032, - -257402224, -451714592, -544733376, -451847200, -201333568, 102984728, 363801440, 536040384, 617267328, 623113856, - 573654080, 485942816, 371313344, 239997936, 103555960, -29695404, -155337696, -267583984, -360738048, -436065344, - -499282432, -551908672, -592087040, -620928768, -640871936, -651791872, -654910016, -655111872, -654414528, -649687360, - -640095616, -628916352, -616357888, -599612352, -580264064, -562188672, -543567808, -520421184, -494704544, -469889824, - -443905824, -414950752, -387043136, -362318624, -336644384, -308771648, -283371200, -260980464, -236863696, -211723632, - -190507040, -171147472, -148254752, -124722632, -105695920, -87316688, -65259344, -44970992, -30302068, -14660871, - 4860829, 20713016, 31747324, 47103980, 66554812, 80329312, 91495152, 111316424, 134142032, 148395408, - 164614288, 196001376, 227258000, 247551712, 288954112, 372055840, 441701408, 434066560, 385475456, }, - }, - { - { - 55647208, - 46043660, 6731825, -50016504, -74868256, -44260712, 7266011, 33517388, 26650808, 5660230, -17415556, - -38504920, -47735876, -37747932, -18445810, -7008313, -6036040, -2559801, 13178033, 37095096, 59641528, - 77079096, 90673736, 99350112, 99463928, 91642792, 82303384, 76399416, 72578504, 67134632, 58783068, - 47932372, 35269196, 22805740, 13168370, 7159711, 4658429, 6695854, 13236015, 20955146, 26955752, - 32157494, 37723772, 41839960, 43308840, 43981000, 44657460, 43328704, 39527656, 35013648, 29002840, - 18725520, 4880694, -9757092, -26069378, -46313168, -68515464, -89910848, -112319840, -137518944, -162332576, - -184521456, -206985744, -230567808, -250843264, -266689008, -282178272, -296575008, -304221120, -306310624, -308853248, - -308671232, -298050336, -281906080, -269787296, -252016336, -207995600, -140258592, -77732464, -44070660, }, - { - 55647208, - 46043660, 6731825, -50016504, -74868256, -44260712, 7266011, 33517388, 26650808, 5660230, -17415556, - -38504920, -47735876, -37747932, -18445810, -7008313, -6036040, -2559801, 13178033, 37095096, 59641528, - 77079096, 90673736, 99350112, 99463928, 91642792, 82303384, 76399416, 72578504, 67134632, 58783068, - 47932372, 35269196, 22805740, 13168370, 7159711, 4658429, 6695854, 13236015, 20955146, 26955752, - 32157494, 37723772, 41839960, 43308840, 43981000, 44657460, 43328704, 39527656, 35013648, 29002840, - 18725520, 4880694, -9757092, -26069378, -46313168, -68515464, -89910848, -112319840, -137518944, -162332576, - -184521456, -206985744, -230567808, -250843264, -266689008, -282178272, -296575008, -304221120, -306310624, -308853248, - -308671232, -298050336, -281906080, -269787296, -252016336, -207995600, -140258592, -77732464, -44070660, }, - }, - { - { - 44819596, - 59101436, 58700928, 27790586, -10742787, -21221434, 2320356, 30586072, 32460826, 4057134, -34835944, - -63029180, -72648296, -68759744, -61424476, -57075820, -53681184, -43654048, -22186728, 8320426, 42098732, - 75254808, 105620760, 130752760, 149856784, 166403136, 185202208, 206822544, 227415840, 243862880, 256345120, - 265526160, 269954816, 267554448, 257967008, 242157232, 220848288, 194568464, 164723808, 133708776, 103919416, - 76802072, 52618180, 30959198, 11466489, -6078990, -22204980, -37602440, -52282100, -65415572, -76193792, - -84300008, -89560272, -92070144, -92894240, -93715648, -95483568, -98152888, -101720392, -106421240, -111830208, - -117003496, -121723128, -126485176, -131264936, -135584064, -139702400, -144242720, -148783568, -152498176, -155868656, - -159711040, -163078832, -164956816, -167140800, -170631536, -168793824, -151206464, -119230440, -92601104, }, - { - 44819596, - 59101436, 58700928, 27790586, -10742787, -21221434, 2320356, 30586072, 32460826, 4057134, -34835944, - -63029180, -72648296, -68759744, -61424476, -57075820, -53681184, -43654048, -22186728, 8320426, 42098732, - 75254808, 105620760, 130752760, 149856784, 166403136, 185202208, 206822544, 227415840, 243862880, 256345120, - 265526160, 269954816, 267554448, 257967008, 242157232, 220848288, 194568464, 164723808, 133708776, 103919416, - 76802072, 52618180, 30959198, 11466489, -6078990, -22204980, -37602440, -52282100, -65415572, -76193792, - -84300008, -89560272, -92070144, -92894240, -93715648, -95483568, -98152888, -101720392, -106421240, -111830208, - -117003496, -121723128, -126485176, -131264936, -135584064, -139702400, -144242720, -148783568, -152498176, -155868656, - -159711040, -163078832, -164956816, -167140800, -170631536, -168793824, -151206464, -119230440, -92601104, }, + { + {-109, 82, 52, -107, -19, 137, 41, 34, 75, -18, 21, -36, -143, -56, -7, -32, 41, -44, -14, -121, 0, 21, -86, -19, -108, -38, -34, -131, -60, 42, 57, 146, 87, 187, -20, -31, 27, -65, 163, 10, 77, 129, 22, -52, 53, -69, -92, -23, -40, -51, -170, -55, 0, 26, 50, 14, 86, -96, 76, -1, 18, 54, -67, -150, -65, 64, 93, 71, 5, 72, 54, 98, 49, 42, -66, 5, -11, -13, -56, -69, -30, -16, -7, -53, 0, 7, 20, 5, 37, -21, 17, -33, -51, 25, -8, -1, + 34, 24, 30, 2, 2, -29, 16, 5, 9, -4, 46, -10, 2, -20, -17, -23, 19, -15, -44, -78, 75, -121, -74, 194, -31, 172, -88, 17, 85, 38, 6, -115, -164, -171, 18, 4, -48, 23, -151, 301, 34, -167, 45, -88, -96, 90, 128, -2, 29, 61, -9, 1, 100, -55, -24, 6, 183, -4, -21, -69, -108, 56, -27, -111, -50, -133, 18, -121, 3, -92, -30, -80, -168, -69, -11, 158, 23, -46, 86, 145, 22, -197, 91, 0, 37, 65, -46, 125, -62, -112, -116, -206, 19, -70, -73, -93, + -97, -6, -106, 34, -17, -60, -22, -68, 1, -3, -78, -32, 32, -11, 5, 18, 7, 13, 10, -21, -70, -13, -26, 20, -9, 8, -13, 1, -1, -15, -44, -36, -6, -16, -17, -14, -33, -12, -151, 253, -63, -229, 18, 79, 7, 73, 59, -182, 65, -42, -7, 8, -33, 139, -43, -90, -8, 111, 70, 42, 66, 270, 71, -92, 122, -112, 38, -90, 253, 40, -82, -49, -82, -28, 168, -134, -113, -34, 139, 80, -128, 37, 29, -75, 4, -275, 92, -63, -52, -174, 265, 15, -138, -108, -135, 11, + -29, 15, -1, -159, 210, -118, -109, 83, 22, 83, -59, -12, -129, 12, 28, -164, -122, 12, -114, 41, -102, -29, -29, 73, -132, -137, -28, -22, -33, -9, -59, -15, -43, -36, -28, -43, -52, -5, -69, 18, -46, 0, 4, -17, -26, -4, -18, 36, -5, -30, -2, -54, -11, -33, 3, 7, -37, 220, 7, 48, -182, 56, 104, 76, -8, -91, 236, 41, -47, 113, 93, -110, 145, -97, 239, 34, 213, -23, 38, -84, -241, 26, 5, 8, -42, 50, 127, -32, -124, -82, -176, -49, -87, -93, 16, 61, + 96, -113, 79, -76, -94, -13, 81, 15, 20, -176, -170, -32, -50, -129, 281, 130, -18, 54, 113, -283, -143, 190, -106, 178, 40, -37, -190, -140, 226, 120, 214, -224, -16, -156, -12, 56, -83, 27, 17, -140, 126, 14, 19, -23, -249, 27, -60, -78, -78, -15, 43, -40, 19, -87, -19, -40, 56, -11, -7, -28, 2, -30, 19, -49, -24, 17, -14, -3, -3, 0, 23, 15, -4, -35, -36, -37, 32, 15, 47, 25, 19, -372, 18, -50, 98, -226, 70, -78, 372, -101, -196, -73, -165, 49, 137, -46, + 260, 25, -79, 61, 30, 66, -95, -18, 95, 151, 59, -33, 72, -139, -45, 191, 136, 224, 159, -6, -117, -244, 165, -29, -178, 89, -48, -273, 5, -228, -20, 202, -36, -154, -72, 193, -171, -279, 279, -55, -70, 63, 34, 31, 66, 65, 36, -206, -79, 155, -23, -63, 46, 268, -139, -152, -70, 108, 55, -246, -110, -86, -108, 78, -16, -21, -92, -74, -194, -113, 45, 4, 29, -10, 113, 116, 19, 41, -61, 11, 4, 46, -75, -36, 8, -1, 33, -4, -43, 40, 14, -83, -17, 21, 13, 12, + -22, 9, -41, -41, -35, 18, -19, -22, -7, -325, -8, 86, 311, 322, -105, 160, -209, 67, 136, 207, -61, 310, -60, 263, -145, 220, -112, -369, -85, 91, -128, 141, -81, -89, 39, -404, -131, -9, -71, -25, -196, -68, -71, 63, 409, 236, -240, 130, 327, 81, -117, 81, -88, -99, 235, 164, -166, -23, 167, 352, -115, 191, 522, 224, -242, 97, 59, -292, 42, -241, 106, -263, -63, 10, 123, -172, -49, -85, -157, 201, 172, -10, -116, 31, 29, 28, 47, 149, 28, -199, -5, 241, 6, 54, 48, 73, + -76, -35, -122, -52, -112, -9, 65, -15, -64, 35, -14, 14, -35, -24, 44, -3, 107, 26, -24, 57, -2, -25, -41, -55, 23, -29, -15, 28, -3, 50, 2, -66, 143, -70, -327, 76, -263, 43, -87, 342, -173, 49, 90, 35, 124, -49, 374, 30, -242, -44, -178, -28, -58, -166, -209, -53, -135, -63, 239, 89, -201, 79, -240, -45, 176, -328, -290, 166, 156, 81, -9, -199, 80, -98, -188, -87, 11, 60, 313, -123, -35, 17, 146, 77, -108, -139, -250, -76, -55, -137, -160, 103, 209, 0, -133, 232, + 45, -113, 29, -33, -30, -79, -45, 151, -119, -178, -103, 94, -138, 245, 110, -40, -100, -113, 70, 153, 311, -89, 159, 6, 0, 18, 50, -56, 2, 39, 66, -40, 46, -34, 151, 58, 114, 2, 77, -3, 69, -13, -6, 81, 30, 11, 43, 10, 79, -57, 19, 55, 73, 63, -24, -79, -1, 51, 11, 10, 170, 324, -242, -8, 221, -106, -158, 203, -320, -20, 59, -42, -120, -141, -68, 56, -17, 153, 77, -51, -122, -89, 252, 10, -308, 144, -195, -191, 117, 222, 226, 172, -6, 116, 79, 110, + -101, -5, -91, -222, 93, -57, -12, -49, 22, -37, 245, 457, 75, -79, -1, -326, 316, -222, -144, -214, -262, 444, 24, -246, -89, 306, 158, -232, -173, 351, 28, 36, 454, -216, 125, -163, -451, 212, 217, 37, -260, -36, -57, 54, -113, 165, 102, -356, 151, 171, 217, 38, -190, 319, 54, -28, -25, -106, -112, -40, 20, 97, 0, 8, -11, -85, 36, 39, 17, -39, -24, 65, 23, 74, -48, 18, -112, 13, 105, -140, 19, -110, 128, -53, -3, -85, -1, 75, -9, 103, 0, 153, 196, 363, 333, -14, + 284, 127, 289, 279, -466, 168, -151, -202, -147, -45, -297, -63, 72, -254, -521, 119, -37, -470, -345, -308, -172, 16, -88, 111, -62, 186, 363, -209, 123, -82, -167, -122, 22, -36, -15, 270, -11, 273, 354, 105, 152, 234, -31, 47, -350, 326, -285, -101, -91, 28, -79, -273, -240, -526, 476, -537, -520, 87, 499, 177, -65, -126, 229, -253, 287, -84, 36, 29, -191, 200, -226, -185, -22, 72, -216, -34, 115, -18, -59, 153, -102, -194, -45, 97, -128, -76, -88, -20, 58, -42, 17, -33, -71, 19, -46, 44, + -48, 64, -20, 120, -18, 46, 65, -43, -83, -10, -21, -6, -26, 55, 2, 72, -66, 25, -140, 5, 5, -52, 42, 218, 284, 284, 309, 728, 327, 416, -205, 674, -385, 19, 149, -3, -253, 84, -70, -575, 218, -145, 62, -54, -190, 1, 171, -232, -120, -36, 135, -350, 222, 84, -321, -25, 131, -291, 109, -349, 161, -30, -113, -13, -228, 294, 347, -330, -189, 150, -117, 93, 84, 23, 12, 400, -101, -267, 248, -10, -210, -176, -332, 64, 91, 166, 160, -153, -258, 145, 73, 500, 53, -62, 13, 34, + -147, -66, -185, 205, 119, 134, -39, -320, -291, -95, -26, -114, -201, 57, -88, 132, 24, -21, 82, 85, 136, 127, 103, -1, -30, 36, 91, 71, -40, -38, -25, 23, 0, -25, 2, -157, 20, 103, 79, -122, -88, 176, 94, 174, 69, -127, 121, -31, -96, 19, -137, -75, -35, 53, -27, -393, -442, 737, 514, 659, 42, -423, 149, 344, 245, -108, -268, -79, -99, -130, -231, -93, -194, 492, 78, 81, 4, 28, 52, -182, 325, 183, -20, 118, -47, 335, 61, -30, -548, -41, 34, 52, -103, 68, -260, 445, + 360, 348, 303, -239, -331, 253, 78, 124, -22, -385, -279, 22, -217, 2, -182, -79, 230, 73, -165, 59, -425, 13, -721, -366, -681, 588, 530, 566, 686, 332, -114, -305, -93, -17, 98, 544, -180, -413, 315, -263, 137, -60, -60, 127, -123, -223, -63, -275, -58, -247, -57, 34, -22, -30, -67, -87, -171, -3, 89, 14, -86, 30, 149, -20, 100, 55, 59, 42, -198, 173, -77, -63, 116, 40, 128, 13, -164, -31, 3, 28, -101, -261, -352, 310, 403, -198, 374, 53, -159, 150, -542, -168, 153, -173, -333, -627, + 308, -269, 72, 406, 97, 473, 362, 206, 78, -279, -82, -146, 26, 263, 137, 54, 225, 643, -34, -547, -240, 88, 131, -31, 14, 52, -233, 14, -515, 116, -539, -197, -417, 205, -208, -343, 523, 146, 43, -235, -313, 78, 124, 46, 170, -267, 587, -713, 185, -297, -433, -243, 374, 112, -406, 287, -323, 792, -74, -87, -386, 46, -514, -276, 686, -276, -311, -203, 205, 26, 291, 145, 152, 212, 115, -19, 22, 101, 43, -56, 170, -53, -59, -128, -115, -52, 63, -101, 7, 49, -42, 43, 8, 168, 88, 0, + -34, 0, -12, 100, -89, 91, -25, 40, 140, -45, 7, -19, -71, 172, -25, 745, 766, 723, 155, -193, -121, -465, 379, 11, 222, -139, 72, -170, -131, -269, 146, -280, 461, -1202, -350, 9, -364, 259, -374, 77, -144, 378, 67, 364, 27, -86, -6, 133, -421, -302, -327, -46, 410, -808, 281, 704, 87, -517, -20, -436, -418, 290, -55, -356, 198, 30, -133, -201, 115, 292, 178, -413, -302, 236, 356, -291, -384, 190, 399, -485, -17, -433, -595, 708, -118, 109, -133, 439, -103, 108, -236, 382, 212, 352, 407, -405, + -447, -182, -85, -268, -672, 74, 37, 0, -49, -109, -90, 193, -17, -83, 178, -196, -104, 73, 350, -106, -108, 17, -44, 121, -42, -19, -61, -98, -246, -353, 63, -25, -269, -134, 71, -93, -304, -169, -20, -53, 24, 87, 37, -1, 250, 86, 394, -146, -20, -583, -276, -140, -495, -708, -139, -242, 653, 191, 974, 170, -290, 122, 179, -811, 38, 697, 440, -475, 57, 344, -652, -111, -330, 266, -260, 173, 36, -135, 27, -9, -215, 212, -445, -178, -196, -557, -123, -80, 1, 32, -158, -180, 996, 295, -397, -717, + -265, 65, 717, -183, -102, -412, -116, -292, 586, -490, 522, 664, -687, 441, 161, -296, -265, 157, 306, -1490, -205, -10, -213, 383, -210, -1116, -441, -331, -511, -497, 76, 87, -294, -260, -472, 39, -182, 31, -212, -243, -277, 53, -66, 153, -241, 103, -40, -244, -502, -132, -41, 150, -82, -661, 121, 307, 113, -24, -242, 223, -46, -84, -407, -76, -150, 316, -64, 43, -13, 61, 192, -160, -3, 2, -87, 9, 74, -476, -417, -162, -340, -236, -106, -215, -275, -214, 164, 981, -34, -1152, -647, -714, -138, -397, -21, -587, + 952, 566, -108, 750, 17, 809, 189, -471, -644, -405, -521, -232, 120, 348, -120, 113, -432, 71, -620, -57, -42, 210, -237, 982, 120, -27, 645, -254, -471, -272, 392, -31, -271, 109, -12, 837, 198, 2, -334, -505, -1285, 83, -1023, 514, 1729, -1242, -275, 282, -224, -218, -358, 292, -368, -1200, -330, -1196, -262, -33, -763, -104, -1093, 472, -120, -684, 1675, 134, 676, 580, 919, -569, -50, -341, -137, -230, 429, 284, 384, -815, -177, -442, -588, -478, -309, -61, 307, 269, 170, 239, -79, 80, 445, -80, 440, 139, -409, -103, + 126, -165, -82, 539, -6, -156, 582, -271, -57, -485, -135, -336, 242, -255, -133, -93, 82, -109, 217, 13, 224, 75, -108, -364, -2028, -217, -523, -572, 730, 578, -715, -566, 1383, -164, 444, 66, -79, -166, -158, -457, -12, 155, 242, 162, 490, -396, -16, -386, -233, 148, 697, 447, 615, 552, -132, 196, 328, -5, -578, -109, 784, -147, -1137, -503, 117, -963, -422, -987, -682, -619, 900, 616, -205, 616, 231, 871, 580, 277, -1549, -349, 61, -1358, -999, -385, -272, -1590, 333, 872, 1166, 1404, -483, -923, -20, -931, -699, -1292, + -1441, -1016, -862, 944, 32, 186, -876, -913, -825, -86, 1232, 1572, 31, -583, -456, -641, -1667, -745, -749, -209, -76, -381, 420, -8, -143, -596, -784, -409, -449, -686, -166, -180, -82, -189, -328, 405, 238, -50, -392, 264, 432, 27, -401, -209, 297, 78, -103, -376, 296, -82, -138, 29, 226, 56, -89, 31, 172, -621, -1509, 595, 78, -1024, 967, 484, 301, -218, -916, -225, 32, 905, 1198, 78, 328, 86, 42, -47, 166, -490, 1684, 413, -543, -538, -239, 85, 825, -386, -120, 11, 419, -387, 223, 40, -89, -1374, -431, 457, + 722, 268, -152, -387, -913, -86, 153, -203, 19, -224, -588, 610, -135, 228, -629, -116, 1616, 138, -177, 205, 212, 169, 814, -280, -366, 624, -68, 378, 225, 547, -203, -581, 304, -258, 48, 2303, 2199, 1008, -195, -92, 278, 1056, 479, -286, -34, -115, -583, -597, 340, 193, 88, 539, -69, -264, 307, 154, 453, -634, -537, -644, 99, -275, 37, -108, 242, 298, 562, 354, -598, -412, 214, -339, -210, 75, 193, -217, -588, -36, 19, -20, 259, 100, -475, 178, 764, 914, 655, 786, 537, 713, -186, -7, 586, 1086, 118, -1213, + -343, 229, 144, -316, 859, 410, 315, -328, 1011, -96, -6, -314, 525, 335, -831, -1200, -358, 162, 36, -257, -1103, -141, 351, 52, -393, -182, -354, -446, 220, 271, -719, -804, -300, -989, 227, 805, -768, 772, -412, -479, -859, -1183, -1328, -1258, -665, -35, 429, 180, 427, -679, -1477, -602, -1421, -2463, -962, 1923, 3314, 1930, -859, -694, -3016, -2709, 1823, 291, 2406, 2499, 2595, 854, -1090, -1338, -1496, -1699, -282, 1627, 2767, 865, 251, -161, -1440, -2083, -1424, 236, 1894, 872, 1211, 988, 331, -766, -859, 4, -497, 125, 902, 973, 695, 116, + 331, -17, -687, 104, 213, -133, 60, -216, 1324, 765, 820, 493, -527, -1243, -1767, 225, 541, 1122, 1107, 1463, 670, -1141, -1442, -1717, -358, -37, 851, 491, 224, 458, -909, -2528, -1736, -1572, -422, 153, 492, -199, -409, -108, 234, -762, 1068, 514, 948, -2084, 473, 283, -641, 468, -480, -236, -143, -298, 898, 1657, -481, 334, -231, 398, 841, -256, -154, -457, 241, -289, -914, 667, 1124, -147, -591, -538, -1187, -324, 896, 613, 311, -1303, -760, -567, 1153, 1006, 877, -2548, -1701, -203, 1258, 2696, 8, -3235, -1193, 112, 1088, -86, 596, 456, + -1417, -615, -395, -843, 55, -1587, 245, 635, -1928, -1227, -604, -241, 2125, -7, -3275, 320, 455, 505, 1283, 607, -1403, 77, -60, 2805, 1968, -1633, 1488, -867, 588, 1552, 548, -839, 768, -330, 192, 544, -65, -565, 1050, -670, 767, -353, 409, -117, 843, -287, 660, -1156, -211, -2, -163, 388, 716, -729, 1484, -572, -526, -1005, 735, 1584, 298, -2053, 155, -450, 993, 510, 441, -816, -71, -514, 488, -200, -347, -105, 667, -147, -433, -494, 369, 77, 348, -210, -5, -369, -46, -63, 159, 70, 377, 721, -1723, 244, -1265, 230, 1074, 950, + 311, -616, 123, -366, -91, -455, -336, 233, 63, -662, -76, 344, -74, 39, 125, -422, -418, -11, 276, 36, -672, 56, 345, 108, 80, 703, -78, -188, 252, 269, -476, -528, 391, 75, -405, 272, 118, 131, -283, 114, 319, 38, -399, 541, -66, -607, 19, 474, 148, -397, 361, 119, -553, 227, 29, 564, -512, 46, 389, -897, 29, 387, -15, 268, -149, -575, 76, -608, 571, 294, 161, -226, -238, 471, -406, 420, 462, -661, -214, 28, 511, 8, -296, 189, -358, -22, 52, 301, 21, 49, -185, 313, -104, -368, 334, -149, + 145, -84, 242, 303, -348, 60, -188, 81, -191, 674, -190, -380, 306, -172, -56, -194, 200, 183, -272, 152, 267, -139, 19, -379, -853, 1398, 198, 633, -544, 242, -117, 170, 154, -233, 95, 257, -147, 559, 26, 19, 191, 184, -20, -141, 239, -36, -163, -32, 240, -256, 57, 118, -327, 412, -80, -196, 632, -257, -369, 291, 162, -172, 275, 221, -74, -87, -47, 84, 160, 94, 2, -107, 327, -344, 314, 51, -35, 89, 102, 103, 17, -305, 89, 267, -185, 1, 4, 204, -17, -76, 309, -153, 167, -314, -114, 309, + -288, 297, -73, 196, 241, -267, -88, 335, -274, -12, 39, 103, 29, -36, 16, 27, 157, -129, 38, 100, -6, -66, 21, 60, -9, 22, -54, 71, 100, -165, -22, 292, -136, 85, -17, 167, 51, -89, 23, -16, -92, -65, 346, -56, -74, 51, 43, -25, 77, 142, 9, 38, 18, -28, 26, 43, -61, 47, 0, 327, -1153, -3688, -187, 1988, 893, 4236, 362, 895, 38, -1235, -1556, -1054, -1897, -1327, -834, 31, 1450, 2854, 2101, 1828, 596, -993, -1458, -1311, -1545, -1713, -694, -328, -149, 836, 1110, 837, 1552, 1002, 372, 1041, + 25, -452, -298, -935, -1917, -1166, -1122, -1145, 61, 534, 370, 1410, 1157, 797, 1138, 1209, 344, 362, -128, -1041, -1445, -1105, -1448, -1031, -359, -255, 90, 789, 619, 557, 1116, 921, 679, 1151, 317, -237, -46, -463, -1000, -583, -1265, -1601, -942, -797, -344, 929, 1255, 1168, 1350, 1108, 632, 607, 297, -131, -341, -644, -948, -952, -1073, -1131, -964, -331, -112, 379, 974, 1081, 1073, 1251, 998, 744, 622, 202, -482, -863, -1401, -1793, -1675, -1330, -666, 168, 900, 1231, 1421, 1477, 1279, 900, 463, -296, -724, -963, -1113, -979, -733, -510, -207, 232, + 313, 419, 486, 425, 341, 266, 184, 158, 78, -44, -71, -74, -114, -129, -169, -208, -234, -214, -185, -139, -74, 18, 80, 106, 143, 205, 235 }, + {-84, 20, 99, -9, 9, -146, -74, 22, 194, -125, 41, -202, 207, 14, 76, -24, 33, -39, -71, -175, 74, -176, -82, -99, 100, 80, 38, 83, 156, 10, -141, 93, 15, -6, 77, -28, -51, -207, 34, -59, 46, 87, -112, -44, 103, 33, 13, -105, 267, 161, 26, 129, 106, 103, -243, 16, -23, -64, 60, 41, -39, -45, -13, -72, 72, -27, 142, -5, -36, -67, -123, -22, 96, -3, 22, 113, 31, 131, -2, 20, -13, 140, 124, 126, 28, 1, 56, -2, 18, 3, 7, -10, -38, -32, -7, -37, + 18, 20, -15, 42, -15, -11, -8, 18, 5, 38, 4, 1, 4, 48, 24, -3, -12, 3, -6, 13, 50, 12, 63, 221, -107, 74, -61, -95, -39, -66, 121, -99, -185, -47, 49, -154, -93, 174, 300, -51, 115, -103, -108, -5, 32, -13, -3, 111, -190, 62, -14, -40, -160, 14, 4, 90, 27, -126, 166, -132, 155, -17, 28, 63, -18, -77, 121, 30, 162, 25, -142, 258, 206, -72, -21, -50, -179, -97, -29, -31, 73, -99, 8, 71, 1, -3, -11, -17, -97, 156, 6, -4, -49, -18, -143, -128, + 43, 104, -12, -27, 1, -1, -73, 140, 20, 46, -36, 38, 25, -6, -2, -6, 3, 33, -17, 21, 23, -5, -5, 17, 38, 33, -23, 9, 13, -19, -9, 52, -6, -3, -40, -38, -62, -24, -231, 281, -63, -35, 201, -80, 103, 448, -55, 12, -174, -140, -216, 123, -90, 59, 116, -136, -117, -86, 8, 43, -168, -67, 71, 61, -68, -29, 100, -106, 15, -54, -21, -75, 61, -69, 26, 58, -29, 187, 6, -27, -141, 15, 200, 26, 67, -186, -266, -97, -229, -202, -7, -88, -10, -245, 206, -227, + 31, 153, -141, -237, -169, -51, 155, 137, 207, -125, -110, -88, -76, 150, 37, -64, -35, 71, 80, 24, 36, 51, -13, -88, -16, -59, 20, 6, 18, 16, 3, 35, 3, 41, 3, -33, 42, -52, -34, 9, -15, 42, -28, -21, -10, 5, -18, -31, 27, -11, 19, -27, -26, -31, -36, -23, -33, 245, 25, -98, 14, -82, -18, 171, 287, -98, -101, -261, 33, 66, 148, -98, 160, 25, 247, -198, 32, -374, -41, 45, -91, -84, -33, 138, -113, -196, 55, -288, -63, -138, 63, -31, 97, 13, -220, -237, + 6, 127, 235, -47, -96, 197, -217, -118, 104, 94, 155, -148, 5, 60, -94, -31, 91, -134, 175, -76, -33, -187, -156, 76, -1, 4, -27, -114, 108, -72, 135, -2, -179, -187, 68, -94, 33, -267, -256, -40, 240, 2, -50, 13, 34, 26, -12, 39, -126, 24, 20, 39, 47, 54, 27, -69, 4, 63, 28, 18, -36, -42, 9, 1, -15, 59, -2, -3, -41, 74, 59, -2, 4, -34, 20, 24, 9, 5, 23, -31, 147, -398, 93, -172, 147, 168, -188, -349, 50, -46, 223, -132, 322, -135, 213, -262, + -97, 111, 159, 45, 0, -161, -20, -126, -158, 89, -134, 54, 32, 66, -76, 150, -27, 129, -28, -245, -40, -78, 26, 246, 16, -21, -12, -99, 86, -93, 131, 141, 52, 55, 249, -61, -44, -198, 142, 125, 27, 33, 27, 11, 74, 151, 102, 58, 56, -38, 198, 68, -39, -151, 78, -44, 289, 164, 38, -132, -48, 220, -84, 29, 128, -70, -87, -173, 23, 64, -12, 84, -67, -25, -52, 62, -4, -18, -82, 21, 23, 51, 60, -19, 11, 66, -4, 67, -3, 21, 99, 21, 102, -7, -20, -5, + -7, 4, 9, -74, 29, 62, 8, 26, -17, -513, -279, 104, -100, 207, 207, 312, 129, 126, 77, -374, -83, -51, 34, -37, 117, 83, -144, -115, 97, 183, 231, 199, 262, -143, -142, -190, 202, -116, 167, -42, -8, -178, -106, -102, 152, 187, 33, 187, 267, -106, 68, 313, -157, 102, 107, 12, 236, 302, 230, 524, 98, -74, -97, -90, -5, 92, 159, -29, -51, -56, -140, 59, 76, 135, -326, -45, 83, 216, 152, -279, -206, 52, 53, 226, -199, 12, -20, 24, -283, -77, -97, -69, -116, -49, 9, 108, + 0, 6, 43, 51, -108, -18, 9, 0, 39, -38, -70, -49, -54, 76, -74, -37, -85, 21, -18, 54, -78, 32, -26, 31, 30, 4, 68, -65, 34, 36, 12, 78, 125, 249, -31, 52, 213, 313, 176, -343, 2, -365, -259, -156, -30, -223, 268, 100, 159, -455, -32, 299, 152, -133, -191, -116, 117, -347, -19, -223, 344, -44, -99, 38, -11, -58, 61, -90, 160, 114, 230, -16, 13, 354, -111, 238, -38, -40, 623, 75, -66, -139, -481, 52, -493, -82, 520, -145, -100, -360, -105, 14, -193, 105, -18, -263, + 282, 102, 92, 79, -195, 216, -335, 98, 130, 15, -44, -135, -106, -137, -44, 113, 144, -35, -117, -68, 161, 67, 307, -4, 24, 126, -12, -55, -42, -37, -33, -49, 37, -56, -2, 64, 24, 65, 62, 51, 6, 94, 68, 42, 29, 30, -96, -80, 71, 12, -59, 12, -67, 21, 78, 30, -12, 30, 67, 17, 31, 205, -406, 179, -141, -204, -194, 158, 201, 119, 347, 257, 54, 106, -267, 58, 124, 270, 54, -125, 100, 128, -239, 38, -245, 196, 179, 230, -218, 138, 246, -107, 65, 326, -7, -197, + -156, 75, -51, -200, -81, 7, 50, 113, -137, 228, 140, -48, 275, -31, 106, 360, -376, 702, -319, 99, 213, -70, -36, 92, 476, -23, -63, -11, -110, 233, 261, -79, 113, 95, 87, 161, 206, 20, 222, 51, -186, -288, 72, 32, 136, 60, 441, -41, 247, 201, -133, -246, -27, 32, 67, -64, 115, 56, -105, -26, -100, -34, 66, -30, 97, -21, 36, 28, -41, 54, 60, -84, 61, 42, 21, 24, -1, 20, 107, 36, -35, 22, 31, 55, 67, -16, -70, -18, -61, -44, 80, 231, 304, 187, -326, 621, + -197, 117, -458, 180, -405, 311, 31, -89, -230, 294, 39, 187, 194, 98, -342, 172, -207, -40, 153, 165, 38, -65, -342, 45, 313, 33, 203, 225, -357, 194, -182, -181, 262, 289, 151, 161, 45, 155, -368, -167, -118, 8, 391, 185, 155, -32, 172, -12, 430, 156, 163, 63, -24, -640, 236, 147, -59, -48, -476, 1, -182, 110, 414, -73, -237, 479, -22, 269, -161, -2, -301, -32, 6, -527, -155, -94, -235, -113, -46, 28, 262, 15, -6, -55, -134, -27, 25, -55, 19, 1, 71, -128, -47, -22, -112, 1, + -72, -52, -36, -97, -46, 101, -35, 13, -28, 110, -4, 46, -74, -176, -50, -14, 74, 23, 106, -14, -32, 81, -108, 131, -2, 409, -350, 52, 149, 186, -609, 406, 114, -433, -277, 238, 545, -191, -98, -375, 779, 303, 49, 131, -408, -264, -16, 35, 404, 88, 312, 351, -14, 23, 244, -63, -259, -247, -62, 347, -186, 439, -202, 644, 287, 520, -140, 85, 417, -324, 195, 189, 177, -185, 223, 54, 71, 190, 397, 334, -337, -78, 175, -329, -209, -86, -674, 181, -333, -208, 66, -83, 231, 431, 276, 175, + -232, -54, -14, -456, 84, 39, 565, 122, 127, -122, 436, -3, -12, 2, -142, -64, 18, -26, -154, 14, -39, 28, -183, -199, -65, 159, -26, 62, 60, 49, -13, -42, -55, -110, -184, 63, 9, -45, -218, 160, 109, 62, -19, 13, -75, 54, -40, -72, 25, 92, 55, -58, -15, -24, 68, -486, -717, 387, -292, 317, 104, 153, 188, -483, -877, 77, 127, 493, -487, -535, 461, -185, 210, -102, 110, 72, 122, -244, 118, -36, -76, 303, 114, -45, -395, -55, -11, -74, -18, -215, -524, -235, 386, -166, 190, -299, + 221, 112, -3, -152, -650, 358, 350, 447, -313, -135, 611, 537, 250, 114, 346, 125, 311, -168, 270, -516, -31, 141, -132, 609, 25, 332, -198, -332, 709, -15, 283, -96, 12, -836, -68, 174, -320, 389, 299, 70, -169, -637, -12, -132, 160, 189, 34, -81, 151, 3, 75, -44, -189, -74, -172, 303, 97, -10, -4, 34, 286, -53, -65, 39, -19, -1, 130, 65, 117, -87, -8, -136, 29, -3, 123, 114, -129, 208, 221, -175, 17, -359, -471, -137, -110, -806, -756, -198, 4, 570, 463, 459, -177, -74, -115, 490, + 211, -205, -36, -163, 354, 275, -204, -286, -262, -536, 224, 15, 15, 117, -80, 204, 754, -429, 228, 45, -291, -166, -345, 131, -153, -173, 391, 48, -130, 395, -54, -174, 138, 288, -158, 310, 556, 536, -366, -5, 134, 302, -464, -96, -128, 578, 246, -62, -351, -390, -346, 522, 433, -827, -690, -523, -368, 125, -332, 202, 56, 82, -665, -213, 602, 464, -201, -427, 416, 218, -49, 7, -52, -101, 237, -211, 52, 37, -8, -153, -279, 54, 228, -22, 26, -97, 216, 237, 24, -31, 80, -8, 96, 104, 149, -199, + -18, 74, 1, -123, 34, 251, 234, -88, 179, -272, 69, -87, -75, -109, -170, 665, 523, 324, 49, -437, -228, -69, 177, 275, -387, 98, 22, -331, -158, 264, -198, 209, 89, 246, -310, -3, -689, 101, -870, 355, 351, -339, 397, 473, 12, 133, -562, 328, 31, -235, 301, -74, 2, -8, 35, 583, -68, -3, 716, -10, -334, -952, -783, 865, 538, 211, 216, -366, -734, -362, 113, -284, 569, -34, 73, 613, -129, -194, -141, -391, -662, -527, 1488, -727, -331, 425, -758, -547, 538, 756, 247, -141, 890, 429, -722, -252, + -404, -395, 809, 56, -544, -377, -423, 115, -90, 244, -9, -128, -200, 15, 222, -124, 101, -121, 109, 99, 310, -125, -49, 265, 18, 134, 137, 188, 33, -116, -66, -32, -48, 114, -40, -129, 249, 257, -147, 63, -167, 56, 58, 157, -44, -20, -84, 79, 183, -611, -450, -314, -559, -49, 532, -37, 111, 263, 175, -450, -217, -372, -198, 480, -145, -51, -64, 292, 291, 865, 139, 637, -36, 216, -344, -259, 229, -438, -488, 18, 155, -249, 202, -293, 91, -772, 433, 243, 355, 46, -314, -647, -230, -56, 536, -406, + -240, 151, 1224, -336, 1244, -761, 302, -279, 546, -215, 944, -885, 1351, -126, 279, 586, -1000, 894, -1068, 723, -1742, 947, -895, 796, -1168, 1030, 36, 668, 290, -544, 476, -389, 1183, -537, 195, -703, 192, -46, 130, -251, 329, -322, 233, -114, 76, 100, 105, 138, -80, -185, -151, -177, -409, 238, 61, -281, -131, -84, 183, -313, 299, -239, 60, -128, 145, 50, -3, 454, -401, 246, -387, 584, -111, 571, -225, 179, 258, 87, 89, 0, 273, -408, 447, -311, 293, -536, -486, 566, 976, -808, 1237, -72, 0, -48, 215, -368, + -271, -552, -123, 18, 1, -3, 487, 83, 534, 522, -332, 192, 1112, 363, 238, 167, -964, 49, -156, -121, -884, -187, 509, 143, 170, 255, 645, 168, -198, -67, -55, 241, -438, -271, 666, 413, 311, 514, 381, -225, -112, -768, -336, 311, 247, 578, -416, -209, -145, 425, 250, 381, 159, -303, -280, 956, -292, -932, 216, 672, 463, -13, -79, 82, 156, 94, 858, -1033, -879, 101, 349, -445, -228, 73, -348, 164, -169, -46, 94, -69, -233, 7, 197, -127, 4, -343, -58, -302, 223, -98, 205, -125, 129, 50, 173, 265, + -269, -124, -78, 208, -129, -248, -446, -5, -176, -70, 71, 42, 16, 85, 150, -32, 456, 52, -32, -354, 65, -69, -16, -379, -1956, 541, -238, -124, 480, -332, 516, -69, -848, -155, 83, 298, 379, 88, -601, 596, -233, -54, -369, -166, 319, -64, 285, 480, -111, -619, 138, 680, -633, 233, 528, -96, -418, -781, -527, 551, 1413, -435, -563, 1592, -104, -229, 1147, 668, 570, 460, 189, -337, 583, 542, 374, 173, -1053, 658, 582, -1112, -643, -399, -311, -306, 1213, 606, -693, 648, -256, -649, 283, 330, -286, -275, -1018, 115, + 174, 745, 357, 92, 623, -495, 1290, -1370, -1597, 1128, -689, -43, 791, -498, -342, -99, -94, 98, 485, 238, -397, -24, 189, -48, 270, -11, 149, 29, -211, 113, 431, 297, -19, 58, 288, -47, -35, 73, 667, 342, -107, 145, -591, -26, 156, -272, -367, 345, -159, -10, 355, -309, 136, -53, -89, 442, -251, -523, -2132, 652, 1198, -747, -158, -582, 1234, 829, 519, -101, -436, 86, 496, 229, -218, -50, 679, -48, -254, -917, -436, 768, 445, -489, 386, -355, -115, 228, 214, -215, 137, -803, 226, 1079, -141, -214, -1067, -643, + 513, -843, -459, 189, 210, -263, 694, 655, -682, 250, 374, 1088, 996, -161, 323, -30, 1139, 493, 460, 1079, -487, -710, -366, -908, 760, 356, 370, 195, 1292, -862, -204, 550, -310, 611, -33, 68, 283, -754, -1141, 139, 215, 1246, 948, 19, -926, -150, -1011, -10, -36, -287, -262, 132, -91, -80, -259, -170, -230, -140, 31, -274, -250, -46, 248, 124, -331, 293, -170, 548, -177, -497, -184, 239, -156, -378, 422, -97, -392, -606, 89, -102, 67, 127, -235, -203, -530, -123, -143, 31, 94, 188, 165, -408, 501, 847, 740, 762, + 980, -555, 773, -1494, -649, 573, 141, 1101, 506, 940, -401, 129, -805, 556, 915, 832, 89, 591, -1434, -933, 900, 265, -891, -458, 116, 1325, 413, -532, -672, 139, -192, 817, 883, -82, -137, 179, -243, 1056, 308, -245, 218, -496, -291, -2351, -795, 424, -362, -348, -6, -421, -419, 1083, 728, -539, 989, 2042, 425, 1456, 206, 299, 1071, 708, -568, -647, -1140, -708, -70, -1127, 425, -132, -1090, -782, -778, -981, -592, -392, -518, 159, 940, 1145, 607, -115, -826, -102, 39, 74, -399, -69, -267, 226, 327, 39, 242, -4, -155, 276, + -288, 40, 266, 562, 83, -2, 384, 163, 1018, -251, -816, -39, 562, 102, -217, -248, -661, -629, -351, -249, -109, -377, -541, -581, -312, -45, 88, 775, 567, -206, 908, 1602, 1114, 779, 492, 306, -382, -250, -378, -13, 937, -95, 797, -505, 217, -1747, 500, -260, 908, -218, -1043, 1061, -390, 168, 607, 455, 973, -141, 154, -178, 1108, -228, 216, 772, -876, 762, -214, 468, 740, -191, 172, 128, 84, -230, 335, 323, -121, -425, -71, -496, -155, -90, 420, -205, -791, -520, 852, 859, -796, -668, 1018, 1193, -449, -110, 863, 42, + 449, 628, -1425, -417, -88, 1397, 137, -92, -1358, 278, 547, 359, 58, 375, 151, 197, 1755, -47, 101, 1035, -606, 690, 137, 522, 346, -785, -251, 948, 633, 367, -213, 336, 174, 7, 135, 247, -104, 417, -260, -65, 434, 257, 96, -881, 90, 446, -323, 163, -779, -494, 565, 276, 466, 404, -304, -857, -230, 303, 763, 464, -101, -159, -252, 625, 0, -117, -241, 335, 150, -128, -617, -391, 410, 404, 296, -426, -593, 310, 810, 377, 67, -387, -80, 188, 7, 21, 58, -82, -151, 1007, -1708, -119, -1446, -1340, 336, 282, + 245, 33, 1274, 726, 1641, 1796, -198, -885, 187, -241, -165, 388, 173, -145, -827, -906, 980, 451, -112, 148, 159, 88, 180, -95, -234, -1338, 30, 764, -224, -1033, -337, 843, -1569, -543, 994, 598, 1187, -38, 88, -1097, -1103, -1395, 1173, 1654, -2182, -1092, -113, 1104, -864, -146, 2003, 809, 510, 1319, 970, 1449, -522, 1440, -218, -1140, -1665, -397, 642, -1328, -256, 279, -276, -472, 285, 249, -906, 671, 335, 978, -234, -972, 1207, 236, -1092, -1, -251, 449, -481, -505, -251, -59, -12, -385, -452, 347, -472, -12, -466, 251, 454, 62, + 676, 452, -670, -261, 6, -617, 107, -112, 248, -169, 219, 577, 8, 103, -404, 620, 408, -456, -124, 439, 430, -73, -641, -95, -1267, 974, -84, 297, 377, 365, 11, -428, 691, 173, 667, -145, -1419, -130, 409, -467, -520, -319, -479, 576, -149, -505, -30, 536, -723, 504, -251, 268, -712, -178, 287, -62, -66, 87, 398, -72, -65, -498, 247, -137, 79, 153, 52, 368, -540, -413, 565, 487, -678, 322, -548, 631, -529, 237, 163, -448, 991, 96, -1104, 508, 133, -854, 478, -314, 510, -741, 379, -785, 360, 557, -506, 289, + -537, 18, 18, 51, -353, 7, 269, -15, -485, 365, -304, -653, 281, -290, 142, 303, -231, -140, 55, -43, 197, -104, -72, 176, 223, 75, -225, -135, 216, 129, -509, 465, -67, -175, 65, -37, 110, 249, -62, 472, -139, -206, -230, -93, 45, -223, 59, -76, -91, 57, 76, -93, -2, -26, -99, 97, 65, -109, 296, 625, -297, -3395, -6136, -2032, -4754, -4703, 2553, 541, 3546, 7998, 7208, 5913, 7220, 4423, 998, 1400, -1013, -5338, -5276, -3945, -5125, -3510, -718, -2365, -3267, -1410, -397, -1690, -798, -20, -839, -1504, 330, 1321, -433, 1828, + 2726, 77, 534, 3684, 1831, 33, 3455, 2828, -650, 1345, 3227, -51, 273, 4548, 2446, 1023, 5494, 6053, 2980, 5738, 7131, 1877, 965, 2909, -1150, -3436, -2002, -4473, -7945, -7928, -9004, -11994, -12085, -11596, -11869, -10619, -9106, -7292, -4779, -2427, 1180, 5257, 6928, 8454, 11444, 10066, 8995, 10048, 7417, 3468, 4071, 4601, 1701, 2221, 4603, 2263, 426, 1977, 1778, -1012, -4, 1238, -1832, -2335, 525, -468, -768, 2569, 2201, 223, 1999, 2906, 500, -229, 150, -2995, -5410, -5646, -7204, -9057, -8587, -7679, -7002, -6243, -4595, -4357, -4767, -3197, -1064, 265, 1147, 3093, 3706, 4201, 7542, 8795, + 8111, 7469, 5924, 3728, 3166, 2673, 1602, 1116, 998, 350, -172, -209, -354, -637, -772, -639, -840, -1090, -1021, -948, -1035, -1028, -931, -1009, -952, -846, -899 } + }, + { + {-259, 29, 170, 58, 111, -162, -89, 7, -29, 43, 135, -325, -2, 107, 64, 98, -94, -131, 142, -2, 40, 88, 117, 43, 24, 106, -16, -34, -91, 49, -26, -15, -47, 61, 154, 1, -32, 73, -99, -148, -82, -30, -96, 9, -22, 62, -60, 17, -120, -12, -99, -5, -45, -39, 50, -57, -6, 81, -43, 97, 117, 8, 158, -81, -5, 76, -27, 51, 72, 39, -83, 33, 38, 27, 5, -70, 93, -25, 44, -15, -19, 6, -96, -8, -75, -35, -3, -13, -3, -7, -40, 48, 6, 13, 3, 27, + -16, 34, -2, 14, -6, -15, 19, 2, -6, 0, 27, 6, -5, 17, 9, -3, 430, -122, 41, -94, -8, -40, 49, 33, 147, 45, 26, 57, -36, -298, -285, -89, 38, 87, -73, 16, -93, -33, 4, 50, -127, -138, -41, -9, 74, 24, -31, -100, 17, -55, 2, 69, -101, 48, 89, -70, -185, -49, 67, -12, 54, -10, 47, -9, 52, 10, -173, 34, 70, -28, 47, 8, -10, -35, 1, -102, -10, -28, -129, -22, -5, 113, -113, 187, 218, 171, -75, -35, -40, 83, -32, -48, 52, -124, -113, 13, + 99, -4, -51, -111, -66, -85, -45, -78, 29, -47, -13, -49, -26, 2, 25, 2, 26, -18, 2, 21, 11, 16, 16, 9, -21, 21, -406, -3, -63, 28, -14, -210, -40, -44, 66, 102, -141, 112, -36, 77, 78, -42, 169, 10, 7, -30, 29, -42, 31, -47, 6, -111, 12, 122, 0, 51, 128, -126, -133, 55, -60, 102, -104, -32, -217, -168, -145, 63, 19, 77, -79, -56, -16, 136, -151, 62, 26, 11, 77, -53, -69, -91, 55, 29, -133, -147, -171, -5, -37, 55, -8, -33, 16, 23, 76, -205, + 25, 116, 173, 177, 147, -26, -108, 159, 49, 31, -79, 46, 33, 5, -20, -47, -7, 54, -42, -70, -28, -30, 12, -6, -17, 47, 4, 60, -5, 17, 41, 38, 30, 21, -24, -27, -8, 24, -4, 23, -16, 41, 35, -36, 2, 2, -58, 44, -237, 147, -126, 176, 229, 143, -2, 68, 16, 187, -102, -103, 54, -28, 77, 144, -206, 66, 185, 87, -13, -1, 23, -86, -1, -81, -113, -29, 175, -66, 82, -61, -107, 210, -183, 141, 154, 31, 98, -135, -37, -54, -43, 98, 30, -146, 24, -14, + 28, -31, 53, 50, 175, -183, 88, 70, -18, 69, 19, 108, 101, 64, -59, 86, 151, -4, 89, -64, 179, 185, 203, -58, -142, 46, -20, 73, 52, -1, -11, -204, -53, -47, -16, -42, -61, 70, 27, 22, 82, -5, 83, 52, 27, -12, 14, -18, -35, 25, 6, 40, -12, 10, -3, -27, 45, -2, -39, 16, 37, 4, -51, 13, -23, 69, 51, 51, -6, 16, 40, 4, 20, 333, -31, -104, 317, -125, 142, -76, -302, 54, -87, 10, 363, -140, -172, 14, 191, -307, -114, 230, -81, 74, 109, -82, + 99, -64, -106, 21, -29, -37, -39, 128, -102, 250, 63, 5, -143, -43, 153, -175, 38, 61, -27, -245, 168, 44, 42, 22, -33, 126, -74, 172, 99, -67, -297, 132, 81, -8, -83, 72, 193, 195, -20, 115, -174, 127, -30, -61, 77, 151, -105, 149, 28, -64, -52, 122, -101, 289, -148, 120, -99, 26, -88, 115, -103, 5, 67, -21, 14, -90, -29, -13, 2, 24, -38, 50, -4, -36, 53, -103, -102, -60, 3, -11, -19, 2, -69, 86, 7, -7, 62, -51, -8, 67, 31, 23, 110, 99, 313, 41, + -79, -399, 124, 227, 136, 89, -34, 116, 435, -53, 201, 20, 113, 43, 8, 87, -36, -186, -52, -138, -36, -195, 71, 6, 228, 45, -106, 76, -32, -56, 147, 53, 110, 64, -63, -254, 16, 148, -10, -49, 67, -134, -57, -237, -294, 153, 170, 133, -41, -48, 3, -4, 87, -14, 95, 86, -2, 88, -81, 24, -43, 53, 64, 277, 1, 227, -84, -232, -21, -31, -88, 186, -14, 77, 18, -131, -158, -55, -33, 19, 164, 55, 18, 70, 110, -45, 83, -8, 71, 45, 19, 99, -9, 58, 34, 31, + -17, -24, -56, -24, 59, 90, -20, 9, -48, -6, 5, -48, 37, -91, 5, -3, 1, 144, -354, -12, 361, 496, -206, 56, 79, -173, -101, 19, -144, -150, 348, 48, -231, -37, -151, -86, 226, -71, -100, 205, 126, 207, -88, 42, 202, 9, -122, 55, -18, 25, -256, -175, 76, -18, 61, -236, 110, 86, 55, -416, -244, -106, -52, 59, -182, -122, 40, 318, 210, 113, -57, -35, -121, 92, -35, -236, -180, -22, -4, 333, 184, -166, -185, 230, 46, -140, 1, 207, 78, 5, -270, 296, -105, 197, 260, 273, + 24, -102, -82, 140, 161, -142, 113, 152, 108, -48, -36, 21, 93, 75, -81, -126, -118, 57, -56, -38, -82, -17, -59, 29, -48, 35, 29, -11, 0, 66, -49, -101, -18, 90, -55, -51, -52, -39, -6, -3, -61, -3, -45, -23, 17, 60, -40, -3, -13, 56, 68, -96, 147, -188, 215, -20, -58, 114, -217, 74, 118, 24, 83, 102, -58, 239, -112, -408, -243, -54, 16, -86, -174, -191, -129, 401, -111, -32, 58, -83, 48, 329, -158, 156, -102, -211, 190, 137, 88, 295, 7, 139, -13, 35, -11, -97, + 65, -22, 214, 43, -147, -38, -42, -10, -239, 96, -236, 58, 318, -207, -397, 92, 56, 182, -80, -3, 187, -115, 92, 137, 39, -83, 184, 40, 237, 50, -146, -139, 154, 258, 91, -2, -212, -43, -68, 153, 39, -289, 46, 77, 22, 30, 113, -50, 48, -79, 50, 46, 37, 60, 27, 40, 37, -66, 23, -20, -10, 66, 28, 37, 75, -22, -232, 23, -15, 18, -20, -13, 66, 44, -37, -43, -318, 730, -172, 327, 30, 136, 98, -3, -411, 348, -512, 164, 122, 460, -217, 207, -326, 211, -106, -351, + -169, 81, 89, 127, 64, 183, 119, 278, -88, -229, -207, 79, -4, -114, 185, 80, -40, 110, 230, -22, 58, -36, 113, 66, -297, -130, -389, -90, -67, -10, 185, 165, 23, -108, -4, -59, -94, 51, 543, 48, -14, 172, -15, 197, -87, 2, -131, 546, 127, -226, -259, -173, 20, -13, -352, 19, 71, 23, 380, -100, 54, -238, -80, -644, -113, 33, 23, -248, 63, -120, 79, 37, -119, -15, 82, 130, 241, 63, -90, -84, -198, -76, 16, 32, -115, -44, 104, 37, -32, -28, -86, -78, -40, 22, -165, -115, + 28, 65, -2, -42, 38, 133, 20, 10, -14, -59, 1, -191, 384, 35, 320, 195, 314, 106, -314, 311, -201, 538, -345, -101, -478, -100, -49, 215, -222, 314, 254, -151, 19, 359, 505, -159, 14, -65, 159, 4, -57, 74, 140, -239, 182, 35, 209, 80, 33, -409, -65, 476, -55, 160, 366, 106, -27, -126, -167, -100, 18, -156, -92, 276, 256, 81, 425, 282, -87, -42, 59, 99, -128, -336, 441, 194, -89, 403, 423, 470, 205, 71, -169, 12, -237, -191, -120, -471, 191, -60, 403, -95, -314, -60, 32, -47, + -419, 67, 113, 191, 204, -142, 66, -97, -272, 53, 107, -22, -80, -207, 218, 122, -192, -220, -122, 125, -21, -63, 60, -98, 62, -26, 38, 94, -139, -66, 63, -31, 3, 279, 93, 17, -18, 65, -93, -55, -8, 418, 24, 76, -64, 34, -55, -636, 73, -7, -115, -48, -313, 357, 367, 410, -668, 214, 137, 16, 657, 269, -328, -39, 648, 75, 115, 131, -191, 107, 133, 402, 204, -309, -507, 191, 120, -257, -49, 23, -312, 34, 380, 161, 213, 308, 500, 46, 441, 86, -176, -27, -261, -138, 109, 148, + 114, 220, -314, -143, 561, -43, -121, -315, 266, 240, 83, 99, -5, 153, -245, 400, -202, -241, -195, -136, 544, 145, 113, -595, -326, -489, 35, -55, -48, -464, -642, -21, 288, -161, 82, -45, -44, 158, -224, -99, -102, 191, 32, -146, -3, -27, -4, -72, -135, 30, 214, -108, -71, -142, -63, -101, -48, 89, -32, 144, -49, -37, -85, -68, 225, -28, -16, -112, -18, 128, 36, -170, 37, 7, 47, 591, 696, -180, 194, -52, -206, 39, -469, -290, -22, -95, 935, -423, 118, -596, -89, 362, -154, -332, -349, -128, + 142, 184, -25, -31, -392, 91, 272, 137, 166, 49, 59, -229, -76, 152, 54, -1, 16, -276, 121, -290, -48, -9, 83, -322, -35, 157, 229, -367, -194, 649, -251, -514, 429, -418, -133, -185, -76, -321, -223, -68, -324, -461, 740, 408, 329, 225, -290, -114, -196, 207, -351, 246, -188, 105, 247, 161, 49, -476, 463, -568, -150, -550, -225, 360, -23, 204, 414, 131, -44, 79, -147, 7, -46, -158, 186, -67, -89, 213, 112, -58, 13, 8, 32, -98, 92, 28, 49, -117, 77, -55, 202, -93, 142, -45, -73, 214, + -146, -64, -131, 85, 211, 97, -62, 99, -88, 101, 147, -163, -31, 979, -441, 425, -878, 240, -559, -106, 309, -29, 198, 324, 258, -384, 284, 57, 209, -84, 291, 270, -62, 56, 174, 197, -284, -98, -413, -52, 360, 8, -174, 36, 132, 24, -152, -294, 72, -199, 187, -188, 695, -67, -382, -430, 94, -236, 217, -482, -379, -489, 110, -413, -101, -593, 420, 85, 282, 174, -640, 47, -60, -240, -359, -99, -306, -385, -214, 175, 250, 365, -214, 49, 156, -538, 243, -369, -36, 300, 126, 120, 53, 619, -359, -133, + -138, 160, -532, 40, -46, -8, 341, 197, 167, 59, -132, 18, -67, 247, -100, -35, -144, 281, 111, -103, 75, -255, 170, 85, 133, 18, -54, 156, 286, 95, -144, -196, -82, 69, -199, -48, -301, -221, -121, -4, -167, 115, -133, 288, -234, -9, -5, -815, -234, 919, 814, 458, -391, 404, 609, -400, 539, -431, 498, 119, -31, 166, -9, 263, -389, -109, -175, 201, -369, -331, 524, -48, -107, 52, -502, -9, 813, 445, 94, -5, 175, 770, 329, 14, 131, -210, -89, -180, 332, -169, 222, 44, 396, -465, -8, -26, + 14, -129, 222, 356, -82, -98, 359, 44, 46, 811, 129, 14, -369, 166, -274, 377, -432, -381, 60, -375, -403, -614, 167, -203, 320, -101, 181, -899, 185, -302, -546, 289, 379, 201, 118, 72, 159, 245, -116, -136, -165, -7, -181, 118, 25, -256, -179, 153, 90, 16, 267, -89, -27, -208, -44, 6, 111, 74, -178, -105, -49, -210, -40, -197, 82, 60, 240, 168, -17, -92, 0, 7, -69, -10, -251, -39, 102, 117, 31, -37, 242, 46, 681, -1049, 440, 458, -746, -76, -639, -211, -574, -260, 656, -225, -48, -462, + -90, 106, -685, -27, 437, -845, 31, -577, -312, 11, 62, -382, -307, -320, -93, -275, -18, 146, -84, 214, -413, -263, 550, -258, 297, -328, 309, 284, 48, 75, 288, 13, 411, 521, -99, 77, 774, 46, 397, -28, -309, -610, 102, 423, -674, 9, -397, -208, -873, 377, 575, -151, 277, -142, 626, 693, -57, -687, -669, 952, -743, 278, 109, 99, 711, -304, 1160, -20, -264, -303, -211, 185, -74, -89, -8, 299, -76, -188, 250, -91, 125, -231, -140, 219, 16, 328, -109, 140, -243, -69, -332, 68, 133, 164, 30, 168, + 15, -51, 177, -280, 184, -237, -86, 144, -292, -73, -168, -488, -132, 33, 175, -239, -126, -210, -70, 52, 192, 1139, 1284, -76, -968, 956, -1059, 149, 449, 111, -113, -489, 551, -247, -197, -498, -289, -155, -621, -342, -278, -155, -102, 431, -6, 373, 3, -161, -544, -596, -151, -22, -8, -91, -223, -258, 285, 686, -373, 236, -233, -240, 273, -266, -431, 964, -106, 88, 47, -539, -118, -113, 273, -696, -308, 735, 118, -313, 400, 747, -425, -527, 274, -447, 7, -836, 270, 710, -72, 370, 217, 124, 816, 255, -3, 470, + -68, -66, 288, 308, -1182, 107, -514, 417, -19, 15, 294, -90, -112, -156, 159, 60, -115, 157, -169, 16, -89, -229, 105, -115, 256, 140, -4, 0, 71, -69, 152, 73, 48, 61, -42, 55, -101, -199, -108, -52, 28, -259, 211, 140, 12, 75, -172, 240, 31, -145, 89, 103, -308, -65, 32, -26, 6, 55, 39, -1562, -1094, 457, -463, -437, -1329, -383, 284, 110, -262, -739, -9, 375, -27, 51, 389, 690, -598, 1571, -404, -521, -158, -88, 7, -621, 15, -109, 332, -209, 469, -194, -399, 164, 194, -356, 390, -1195, + 10, -95, 478, 578, -418, 539, -206, 154, -257, -86, -158, 431, -57, 568, 886, -770, -215, 416, -519, 315, -589, -325, -293, -345, -602, -308, 281, 230, 462, 600, 435, -726, 91, 135, 173, 147, 464, -227, -492, 282, -128, -384, 75, -658, -273, -573, 52, 337, -209, 324, 173, -20, -125, -10, -511, -191, 168, 85, 111, 35, 56, 45, 158, 43, -344, -48, 51, -35, 88, -158, -145, -336, 85, 296, -338, -237, 171, -86, -345, 225, -169, -138, 203, -16, -66, -106, -154, -205, -217, -57, -186, -111, -97, 147, -12, 218, + -325, -1064, 803, -1362, 957, -137, -610, -520, -581, -393, -306, 29, 702, -57, -589, 625, 886, -1361, -364, 95, -113, -212, -69, -189, -242, -395, 504, -177, -378, -647, -643, 633, 164, -116, -71, 0, -142, -173, 139, -570, 310, 647, 483, 301, 618, 720, -415, 153, -597, 644, -370, -107, -5, -940, 304, 772, 130, -318, -259, 1009, -408, -437, 282, -1031, -122, -512, 21, -1009, 420, 175, 412, -1637, -1405, 229, -492, -330, -205, -1097, 361, -649, -708, 533, -477, -281, 225, -115, -216, -40, -61, 228, -542, -256, -523, 0, -231, 104, + -77, -413, -171, 145, -29, 29, 108, -452, 56, -573, 262, 87, -418, 132, -496, -107, -183, 37, 259, -195, 268, -145, 458, -211, 287, -162, -54, -15, -59, 94, -50, 0, -41, -105, -2, 166, -49, -71, -60, 53, -61, -61, -46, -30, 10, -29, -23, -27, -59, -26, 21, 100, 1212, -1669, 1713, 509, -51, 148, -1225, 262, 586, -209, 1461, -406, 636, -504, 1609, -49, -209, -604, -218, 243, -155, 658, 511, -161, 50, -621, 246, 652, 657, -700, 303, -131, 701, -179, 458, -411, -324, -937, 69, -591, -881, 1268, -553, -102, + -235, -292, 175, 114, 449, -201, 688, 74, 1244, 486, 1376, 1176, -113, 790, 599, -195, 704, 963, -406, -941, 544, 362, 781, 410, -74, 1, -1016, -86, -298, -359, 1356, -145, -14, 1693, 1126, 617, 752, 398, 49, 203, 977, 24, -255, 301, 820, 397, 468, 243, 568, -18, 163, 224, 398, 148, 101, 84, 45, 335, 483, 219, 639, 60, 394, 405, 720, 3, 492, 451, 93, 383, 20, 97, -122, 167, 200, 115, 104, 42, -86, 37, 168, -72, 91, 345, -73, 521, -1171, 2249, -305, -250, -143, 1637, -1005, 821, -1100, 1043, + 212, -204, 27, 611, -262, 570, -264, -5, 1151, 352, -294, -5, 288, 225, -1115, 297, -405, -102, -587, 567, 541, 82, 257, 958, -317, -1530, 367, 998, -386, -1008, 269, 714, 244, -3, -1202, -582, -711, 665, 274, 685, -1447, 88, -265, -1607, -412, 230, 728, 1002, -533, 1876, 370, 26, -384, -767, -521, 347, -868, 1768, -564, 64, 1057, -702, 647, -686, -382, 1465, -740, 957, 898, 313, 412, -1288, -146, -78, -439, 589, 550, 208, 173, 572, -131, 215, -62, 161, -243, 194, -34, 161, 146, 24, -425, -90, 70, -172, -41, 294, + 183, 496, -222, 90, -827, -722, -90, -61, 511, 356, -225, -194, -655, -22, 243, -128, 12, 140, -197, 130, -479, 7, -151, -215, 341, -1322, 754, 483, 755, -301, -215, 306, 2, 87, 28, 149, 35, -208, 977, -228, -674, 285, -18, -594, 206, 137, 403, -274, -449, 482, -389, -53, -116, 395, -683, 233, -424, 345, -602, 213, -202, 103, 1318, -908, 171, 290, -819, 296, 377, -607, -127, -233, 1097, 91, -1270, 759, -1027, 185, 531, -494, 607, -736, -606, 833, -142, 353, -1250, 233, 269, -68, -193, -12, 507, 17, -1663, 1006, + -105, 385, -438, -511, 1586, -44, -1015, 86, 512, 115, -1543, 53, 1430, -264, -662, 155, 691, -94, 2, -124, -72, 97, -250, -148, 469, -206, -13, -279, 275, 417, -75, -66, 444, 143, -306, -75, 191, 126, -260, 137, 305, -258, 65, 74, 197, -477, 30, 294, 112, -333, 18, 231, 39, -248, -166, 619, -223, -3273, -6959, -2780, -5242, -6384, 2254, -32, 2312, 8810, 7694, 4375, 8433, 4699, 525, 2910, 1787, -3199, -2263, -671, -3544, -4284, -1430, -2172, -3391, -858, -162, -4317, -2978, -460, -2628, -3400, -998, -1673, -3694, -716, 367, -2075, -1584, 1552, + -569, -2226, 458, 1460, -1103, 892, 3222, -483, -870, 3189, 1698, -806, 5300, 7206, 4482, 7597, 11367, 8742, 8319, 12158, 10540, 7756, 9518, 8653, 5504, 4869, 2620, -909, -3805, -6807, -9670, -11509, -14432, -15421, -16262, -18422, -18409, -13913, -14234, -12961, -5836, -4514, -4390, 1947, 3715, 79, 3869, 5369, 1836, 2557, 5034, 3762, 2190, 3554, 4402, 1871, 2740, 5466, 3251, 2139, 5039, 3779, 1524, 3275, 3742, 479, 1933, 4507, 2584, 3101, 6352, 5974, 6295, 8149, 8204, 6581, 6225, 5315, 3250, 2348, 1256, -180, -1264, -3455, -4726, -6397, -8533, -9506, -10745, -12510, -11906, -10679, -9413, -6855, -4463, -2331, + -818, 434, 849, 1021, 1295, 1367, 1168, 1235, 1345, 1298, 1410, 1743, 1887, 1911, 2001, 1932, 1828, 1810, 1573, 1308, 949, 589, 505 }, + {-219, 6, 174, 119, 120, 76, 48, -69, 3, -78, 186, 114, 45, 27, 27, -2, -59, 91, 128, 123, 75, -94, -135, -148, -140, -15, 73, -145, 121, -29, 211, -35, 134, 2, -175, 50, -23, 141, 10, -17, -71, -120, 11, 68, -154, -210, 147, -122, -112, -106, 83, -84, 35, -37, -10, -124, -37, -84, -123, 40, 95, -36, -135, -27, -28, -68, -117, -9, -95, -112, -20, 8, 26, -38, 16, -21, -158, -35, 19, -44, -41, -50, 51, -61, 52, -4, 9, 20, -39, 38, 0, -21, 9, -10, -33, 5, + 25, -17, -14, -2, 40, 18, 6, 6, 21, 15, 25, 7, 32, -27, -12, -12, 412, -144, -94, -128, -88, 10, -276, 47, -137, -270, -58, 231, -166, 45, -20, 78, 117, 125, 202, -43, -116, 52, 49, -93, -13, -63, -41, 25, -106, -66, -15, -133, -157, 80, 121, -72, -180, -32, -42, 25, 146, 10, -60, -10, 195, 24, -119, -115, 50, 37, 156, 88, -10, -148, 8, -9, 128, -137, -46, 75, 148, -42, 13, -112, -63, 69, 4, 14, 40, -44, 54, 16, 66, 41, 26, 258, 79, -11, -35, -76, + 111, 69, 120, 85, 30, 32, -25, 24, -48, -52, -40, 14, -18, -13, -8, 42, 7, 54, 5, -17, -7, -5, -8, 18, 13, 22, -302, -71, -142, 139, 35, 4, 99, -58, -233, -123, 156, -8, 160, -12, -90, 178, 67, 389, -73, 169, 25, -183, 46, -155, 101, 36, 40, -166, 83, -29, -58, 69, 265, 99, -1, -212, 184, -38, 1, 131, -193, -36, 134, -79, -69, -218, -238, -18, 145, 85, -95, -2, 94, 118, 47, -24, -45, -208, 99, 260, 119, -74, -36, 83, 124, -9, -38, 31, -172, -31, + -120, -56, -11, -74, 199, 173, -51, 87, 65, -33, -117, 28, -90, -34, 27, -117, -25, 12, -34, 33, 50, -74, -27, -5, 5, -58, 16, -27, 44, -52, 49, -35, 12, 8, -25, 20, 9, -19, 17, 19, 20, -38, -18, 1, -54, 7, 32, -11, -227, 254, -219, 232, -2, -185, -436, -172, -125, 65, 229, 179, -55, -35, -53, -125, -36, -141, 48, 52, 87, 144, 85, 275, 1, 56, -97, -22, -65, 101, 31, -128, -185, 8, -133, 17, 126, -209, 148, -352, -97, -261, 45, -16, 5, -102, -138, 49, + 126, 90, 34, -209, 65, -144, -55, -41, -285, -111, 86, 111, -9, -196, 35, 76, -37, -38, 25, 172, 63, -38, -54, 31, -407, 30, 105, 98, 289, 41, -160, 182, -62, 28, 65, 61, -41, -133, 9, 80, 76, 123, -37, -39, 22, -22, -14, 20, -34, 13, 29, -16, -65, -49, -2, 9, 18, -31, 63, -32, -17, 41, 48, -13, -72, -37, 30, -36, -19, -22, 17, 57, -10, 290, -75, 3, 191, -100, -94, 286, -220, -520, -341, -202, 310, 132, 42, -301, 317, -138, 88, -83, 124, 152, -14, 3, + -4, -53, -165, -134, -41, 16, 143, 81, 224, 106, -99, -54, 199, -146, 245, -198, 52, 107, 69, -161, 216, -22, 232, 306, 46, -124, -120, 129, -149, -313, -82, 64, -201, 113, 92, -68, -126, -54, -49, 59, -25, -177, -68, 302, 243, 130, -363, -357, -195, 340, 172, -28, 47, -170, 215, -11, -168, -60, 22, -18, -85, -14, -67, -37, 63, 93, -56, -2, 8, 14, 13, -95, 107, -9, -107, -64, -15, -35, 1, -9, -14, -12, 25, 4, -50, -4, 18, -13, -77, -53, -72, -26, 50, 146, 215, -12, + 83, -339, -114, 55, 116, -420, -47, 181, -127, -274, 170, -318, -233, -126, 28, -116, -79, -11, 236, -201, 52, -64, -83, -169, -47, -247, -74, -8, 47, -173, -36, -109, 16, -56, -77, 45, 194, 49, -101, 96, -149, -37, 57, -57, 97, -32, -11, -685, 45, -238, 116, 99, 151, -377, -384, 51, 13, 89, 2, 204, -83, 111, 138, -66, 321, -101, -209, -45, -173, -7, -343, 5, 170, 79, 256, -72, -70, 112, -135, 31, 83, 165, -89, 94, -134, 26, 5, 17, -66, -32, -49, 52, -61, -98, -2, -47, + -61, -23, -48, -21, -30, 27, -48, 27, -97, -11, -58, -25, 8, 6, -14, -47, 4, 265, -534, 143, 23, 148, 215, 39, -207, -455, 32, -184, 346, -141, 71, 25, 74, 261, -115, -8, -121, -68, 68, -66, 245, 182, 52, -52, 3, 164, -17, 79, -4, -135, 119, -35, -101, 145, 245, 1, 96, 17, -163, -101, 298, -144, 142, 217, -288, 205, 110, 104, -128, 211, 61, -36, 269, 10, -3, -126, -72, 0, -118, -288, -76, 294, 222, 242, -27, -255, 106, 309, -58, -219, -11, -154, -40, -26, 240, -23, + 123, -32, 11, -169, 44, -29, 66, 66, -117, 79, -185, 18, 66, 5, -48, -3, 36, -128, -24, -120, 37, -76, -48, -74, -124, -82, -32, 18, -38, -3, 39, 13, -33, -23, -37, 71, 2, 26, 46, 29, 32, -17, 60, -9, 1, 25, -24, -33, 15, -254, -75, -409, -120, -237, -280, -265, -94, 357, 388, 535, 120, -204, -126, 443, -2, -103, 339, -36, 15, -530, 240, 133, -354, 490, -68, 220, -60, 115, 218, 0, 385, 147, 109, -45, -137, 37, 233, -63, 69, 109, 309, -15, -94, 199, -234, -147, + 106, 341, -151, -183, -58, 281, 2, 40, -105, -48, 101, 148, 13, -121, -389, 46, 114, 370, 107, -30, 284, 508, -105, 178, 120, 210, -41, -179, 105, -422, -115, -64, -137, -85, 219, 76, -273, -161, 8, -89, -10, -209, -6, -72, -53, -29, 21, -58, -15, -29, 45, -17, 41, -57, -2, 9, 19, 85, 2, -33, 79, 115, -9, -71, -45, -100, -87, 120, -20, 32, 44, 42, 40, -92, 45, -34, -463, 648, -327, 147, -24, -224, 494, 116, 61, -523, 136, -209, -238, 58, -232, 265, 160, -44, 53, -128, + -58, -190, -122, -228, -352, -87, -246, -66, 134, -100, -133, 279, 175, 280, -229, -26, -46, -252, 2, -134, -628, 55, 11, -97, 218, -23, 240, 204, 75, 378, 336, -332, -91, 3, -12, 118, 45, 321, -69, 513, -1, -302, -245, 39, 92, 105, 373, 98, 93, 351, 467, 19, -287, -271, -26, -91, -66, 603, 43, -274, 196, -240, 229, 38, -48, -72, -184, 51, 61, -27, 54, 102, 56, 69, -27, -26, 7, -34, -29, 68, 27, 49, 61, 108, 6, -51, 101, 57, 19, 23, -21, 15, -4, 108, 168, -91, + 80, -20, 70, 9, 15, 143, -8, 14, 12, 118, 78, 86, 389, 30, 262, -287, 128, 23, -21, 173, 411, -114, -38, 379, -502, -280, -219, -574, 113, -182, -81, 69, -392, 429, 323, 456, 204, -284, 26, 18, 341, -63, -11, -13, -212, 17, -125, 190, -225, -85, -76, -97, -264, 124, -387, -59, -28, 242, 143, 32, 4, -68, 28, 3, 201, 46, 58, -32, -605, -281, 69, 250, 299, -473, 316, 94, -187, 45, 102, -112, 458, 4, 87, -108, -640, -219, -292, -76, 11, -178, 92, 136, -132, -27, 411, 12, + 209, -252, 32, -4, 236, 209, 150, -57, 48, 171, 104, -8, 180, 176, 192, 25, 73, 66, 31, -25, -25, 166, 31, -88, 15, -13, 91, -64, 29, 86, -68, 134, 46, -18, 11, -116, 85, 86, -14, -26, -71, 592, 94, 239, -357, -323, 186, 307, 36, -109, 568, 179, 2, -158, 123, -44, -63, -22, -98, 26, -190, -452, 148, 46, 137, 44, 250, 76, -270, -549, 14, 41, -45, -481, -235, -73, 134, -105, 53, -421, 20, -94, 2, 42, 116, -46, -396, -364, -227, 152, 113, -97, -83, -635, -359, -13, + -619, 568, -584, -161, -378, 609, 195, -430, 216, -51, 230, -367, -122, 15, 248, -349, -140, -119, -354, 24, 235, -45, -65, 423, -672, 528, -88, 111, -303, 212, -34, 168, -154, 8, 134, 145, -42, -74, 0, 14, 17, -50, 165, 173, 122, 31, 124, -13, 152, -57, 28, -8, -58, -60, 10, -127, -153, -45, -10, 153, -10, -26, -43, -107, 74, -35, -56, -39, 79, -18, -173, -24, 61, 13, -17, 520, 1139, -155, -357, -335, -296, -424, 68, -721, -8, -558, -259, 170, 348, 199, -252, -36, 330, -25, 382, -230, + -232, -205, 179, -136, -177, 60, -211, -215, 258, 611, 229, 260, 114, -363, -88, -295, -279, -46, -52, -232, -371, -743, -72, -271, 94, -139, 275, 256, 144, 268, 187, -30, 517, 739, 175, -869, 174, -157, -510, 69, 246, 121, 20, 236, -17, -415, 23, 194, -417, -219, -391, -721, 564, 77, -45, 394, 306, 21, 20, 389, -534, -233, 57, 287, 240, 369, 264, -220, -130, -50, -87, -33, -56, -107, -142, -217, -220, -157, -86, -24, 104, -60, -47, -248, -172, 25, 127, 89, 50, 52, 34, -35, -130, -62, -82, -71, + 21, -137, 25, -98, 100, -12, -39, -93, 82, -86, -31, 172, -6, 841, -623, 727, -61, -87, -370, -137, -368, -312, 389, -345, 201, 873, 325, -129, -394, -330, 390, -318, -538, -221, 56, 52, -614, 44, -186, 321, -194, -8, 72, 917, -221, -292, 445, -353, 535, -312, 392, 66, -282, -258, 497, -641, 490, -276, 51, -153, 268, -221, -113, -8, -197, 936, -269, 639, 248, 293, -4, 242, 410, 459, -125, -444, 3, 379, 153, -67, -559, 749, -156, -495, -137, -304, 235, 324, 14, 543, -146, 278, -616, -109, -657, -205, + -240, -15, 37, -127, 235, 77, -177, -302, -224, -65, -28, -152, -33, -54, 186, -55, 8, -71, -285, -86, -114, 35, -47, -160, -249, 98, -168, 77, 110, -174, -426, -102, -67, -114, -152, 17, -71, 45, 50, -194, -25, -195, 181, 111, -102, 49, -171, -954, -407, 585, -115, -239, 681, 66, -353, 259, 371, 315, 50, -587, -242, 90, 87, 308, 204, 347, -299, -236, 117, -81, 284, -551, -93, -596, -192, 109, -81, -74, 639, 134, -473, -71, 39, -483, -65, 25, 292, 736, -260, 247, -410, 63, -241, -310, 300, 644, + -509, 50, 573, -257, -52, -214, 375, 92, -465, -5, -162, -150, -46, -227, 347, -821, 175, 70, -346, 462, 707, 500, 1347, 410, -346, -478, -396, -215, 495, -178, 687, 64, 836, -993, -637, 300, -163, -102, 401, -270, -31, 427, 190, 317, 467, 366, -79, 150, -286, 11, -11, -200, -220, 147, -303, -25, 458, 42, -274, -356, 66, -448, -166, 483, 250, -78, -111, 93, -90, -151, 32, -110, -172, -29, -236, 167, 144, 160, -88, -62, 101, 247, 674, -1563, -57, 899, -1187, -49, 239, -1227, 556, 155, 992, -94, 354, 296, + -1080, -893, -345, -82, -538, -662, -348, 622, 437, 379, 45, 75, 199, 44, -782, -289, -1005, -317, 569, 174, 386, 1275, 335, 485, -16, 260, 1123, 847, 239, 558, 511, 1122, 922, -1212, 767, -63, 734, 748, 313, 1346, 1188, -647, 590, -3, 563, -973, 100, 112, 41, -215, 625, 678, -646, -214, -378, 243, -535, -664, 635, 1081, 399, 1125, -318, 1527, 1493, 422, 785, -222, -387, 356, 349, 173, 122, 97, 204, -205, -380, -268, -716, -749, -301, 359, -6, 317, 58, 196, 463, 570, -179, 265, -24, -226, -190, -159, -472, -212, + 11, -404, -142, -363, -201, 86, 519, -237, 188, 152, -85, 292, 169, 224, 9, 386, 245, 172, -150, -223, -498, 731, 1313, -175, -1787, -568, 185, -136, -295, -389, 8, -1020, -612, -846, -135, -243, 286, -602, -173, 170, 286, -1, 318, 626, 129, 900, -574, 222, 37, 859, 224, -159, -856, 578, -147, 785, -651, -510, -493, -255, -790, -100, -136, -736, 411, 857, -409, 135, -1100, 1068, -333, -566, 484, 433, -628, 66, -391, 150, -286, 1335, -48, -101, -325, 2348, 61, -304, 1002, 817, -849, 676, -1040, -565, -1087, 845, -748, 415, + 573, 470, -964, 1232, -219, -1580, -1818, -702, -223, -513, 424, 433, 719, 134, 63, -524, 543, 868, 1249, 346, -358, 139, 1063, 195, -588, -128, 1135, 278, -673, -156, 560, 343, 510, 363, 718, 26, 393, 160, 507, 261, 806, 289, 509, -79, 158, 60, -63, 238, -75, 303, 502, 100, 290, 61, 378, -838, -204, 689, -503, -2405, 173, 1548, -933, -622, 1244, -902, -57, -255, 1194, -2047, 1147, 682, -577, 216, 1120, 801, -391, 460, 206, -310, 527, -9, 320, 487, -206, 120, -51, 234, -296, -236, -18, 418, -1214, -598, 605, -133, + -805, -948, 165, 1187, -513, -753, 583, 887, -193, 226, -156, 826, -447, 1237, -167, 6, 676, 18, 156, -871, 1376, -707, -861, 657, -912, -297, 154, 460, 1271, -447, 793, -157, 415, -2150, -1648, -298, -643, 334, 297, 823, -129, -167, 976, -1063, -24, 689, 674, -243, 751, 100, -161, 2, -168, 725, -401, -35, 701, 167, -160, 283, -349, 96, -27, 19, 283, 140, -400, -85, 123, -304, -457, 1, 332, 593, -495, 579, 195, -564, 473, 550, -275, -639, 593, -287, 108, 336, -328, -849, 279, 240, -478, -440, 31, 335, -379, -181, + -809, -383, 582, -1008, 974, -859, -1076, 599, -524, -356, 612, -471, 510, -372, 233, 1199, -1086, -86, -172, 1009, 130, 88, -973, -914, -330, -273, -148, -300, 171, 45, -106, 143, 210, 96, 161, -194, 467, -316, 446, -867, 22, -704, -910, -540, 1192, -525, -536, -401, 267, -247, 526, 769, -824, 722, 122, -1136, -573, 2321, 1200, -1774, -341, 1113, -577, -653, 443, -566, -1229, 868, 391, -1669, 675, 833, -985, -654, 983, -252, -755, 162, 484, -1213, 219, 204, 337, -928, -282, -89, -304, -73, 50, 92, -571, 78, 819, 277, 42, 263, + -24, -149, -466, -152, -257, -346, -791, 197, -456, -135, 949, -860, -565, 695, -521, -198, -231, 306, -563, -213, 872, 455, -441, 483, 268, -381, -244, 1190, -971, -760, 1272, -20, -1034, 127, 621, -619, -1285, 835, 95, -1418, 229, 371, -1018, -38, 649, -199, -443, 310, 251, -653, -83, 1470, 2080, -822, 2328, -176, -628, -484, -779, -59, 397, 1377, 54, 429, -341, -1175, 29, 50, 786, 155, -886, 1667, -702, 317, 753, -821, -665, -1174, -510, 736, 915, 1129, -417, -2739, 615, 1441, 1845, 1587, -19, -780, -969, 339, 944, -592, -311, -2429, + -1487, 1316, 2208, 458, -56, -528, -959, -219, 615, -846, 338, -114, 1396, -53, 547, -2714, -342, 40, 1675, 1302, -32, -808, -222, 1996, 903, -2328, -2891, -1123, 585, 4501, 488, -773, 622, -1195, 3195, 981, -2539, -1582, -314, 2261, 340, -930, -866, -796, 644, 1220, 611, -1298, -106, -441, 1081, -108, 655, -221, -273, -859, 340, -257, -90, 683, -1058, 629, -158, -152, 7, 499, 1053, 540, 74, -198, 225, 0, 429, 150, 472, 127, 121, -522, 250, 291, 194, 14, 160, 109, 469, 230, -376, 958, -1102, 35, -443, 256, -682, 642, 179, -364, + -688, -338, -129, 201, -940, 218, -459, -179, -735, -347, 599, -628, -220, -86, 294, 198, -243, 338, -537, -43, 9, 290, -351, 512, 385, -389, -449, -172, 732, -525, 233, 542, 124, -528, -199, 227, -328, 246, 28, 119, -484, 102, -393, -17, 372, 465, 366, -269, 350, 44, -429, -65, 3, 517, -137, 109, 455, -98, -581, 818, -327, 484, 361, 83, 120, -347, -419, 563, 93, 495, 157, 269, 146, -17, -18, -435, 58, 114, 162, 169, -45, 198, 44, -29, 65, 23, 216, -59, 171, -202, -41, -3, 26, -116, -53, 380, + 253, -69, -263, -315, -104, -130, 362, 31, -94, -236, -107, 28, -180, 398, 50, -170, 82, -14, -60, 108, -105, 345, -316, 235, -307, -889, 1666, 152, 92, -671, 387, -56, 438, 334, 513, 58, 132, -287, 84, 470, -45, 258, -39, 83, 105, 191, -197, 356, -240, 34, -38, 122, -30, 73, 271, 297, -141, 132, 59, -65, -126, 396, -120, 85, -111, 208, 0, -187, 398, -245, -84, 107, -185, -111, -56, 18, -70, 8, -36, -101, 136, -253, 162, 111, -86, 171, -127, 202, -101, 40, 41, -118, 199, 2, 29, -60, + 268, -313, 338, -236, 42, 60, -7, 65, -52, 197, -181, 16, 170, -199, 129, 117, -27, 28, 116, 57, -50, 79, 23, -23, 18, 70, 11, -82, 26, 38, -41, 101, -19, 83, -49, 16, 66, -38, 13, 47, -60, 110, -7, 56, -11, 116, -37, 17, 108, -89, 125, -67, 56, -69, 123, 318, -1519, -3782, 588, 2881, 2678, 4645, -1185, -1244, -3163, -4320, -890, 1563, 1673, 3149, 1711, 135, -817, -2199, -1562, -270, -244, 783, 727, 420, 268, 211, -115, -540, -41, 623, 5, 131, -35, -468, -357, -796, -779, 353, 327, 723, + 1100, 824, 404, 145, -1187, -841, -649, -652, -725, 151, 464, 804, 1029, 850, 186, -101, -681, -696, -412, -202, 68, 114, 231, 20, -222, 75, -354, 185, 303, 34, 606, 731, 228, -140, -804, -1061, -426, -197, -122, 538, 419, -111, 475, 513, 289, 354, -195, -383, -305, -440, -347, -66, -333, -134, 20, 267, 381, 546, 474, 434, 347, -181, -409, -690, -848, -496, -367, 46, 407, 595, 693, 545, 505, 323, -426, -765, -688, -339, -97, -33, 53, 290, 259, 122, 60, 238, 138, 207, 60, -322, -350, -233, -91, 109, 80, -116, + -63, 106, 57, 44, 143, 224, 104, 2, -112, -128, -99, -113, -139, -101, 2, 93, 125, 144, 127, 51, -33, -92, -106 } + }, + { + {-178, -2, 39, 30, 127, 17, -16, -82, 187, 116, 6, -23, 186, 63, -59, -163, 104, -47, 81, -155, 10, -37, -115, -31, -58, -21, 9, 1, -84, -52, -13, -16, -52, 56, -5, -56, 100, -166, -79, 79, -99, 14, -62, -91, 62, 56, -49, 62, 120, 67, -62, -73, 13, 23, -73, 79, 132, -113, -36, 65, 49, -27, -34, -55, 73, 22, -87, 99, 48, -82, -61, 104, -79, -101, -190, -165, 90, 104, 8, 46, -18, 37, -70, 106, -9, 49, -49, 27, -44, -35, 2, 68, -15, -18, -30, 10, + -23, 5, 8, -14, -16, 2, -1, -6, -18, 9, -7, 238, -23, -48, -97, 152, -81, -9, -124, -132, -166, -78, 130, -135, -50, -47, 45, -34, -185, 96, 46, 360, -37, 168, -34, -9, -16, 19, -76, 139, -37, -28, -84, -15, -30, 216, 40, -22, -202, -21, -39, 61, -129, -36, 35, 29, -36, -22, -80, -30, -96, -43, 186, -55, 59, 104, -25, -101, -133, 34, 31, 40, 83, 98, 81, 47, -37, -36, -43, -187, -45, -19, 91, 77, -46, -5, 100, -104, 41, 3, -26, -60, -92, -1, 54, 55, + 58, -24, 24, -22, 5, 82, 33, 6, 1, -12, -2, 5, 16, -10, -11, 35, 18, 36, 37, 8, 21, -5, 6, 3, -17, -42, -8, -315, -77, -6, -68, -47, 110, -222, -186, -109, -73, 31, 249, -54, -1, 30, -179, -47, -149, -23, 263, -21, -129, -84, 3, 53, 52, -74, -334, -160, -45, -129, 12, 6, 135, -88, 120, 29, -62, -179, -150, 207, -172, 113, 33, -110, -41, -98, -71, 97, -184, 95, 32, -3, 31, 13, -19, 4, -93, -128, 9, -39, -95, -38, -146, 169, 116, 29, 139, 16, + -59, 172, -91, -57, -59, 131, -128, 57, 92, 5, 57, 143, 52, -4, 9, 30, 24, -28, -17, 2, -8, 46, 22, 48, 36, 14, -44, -51, 31, -2, -3, 47, -33, -26, -1, 11, 15, -5, -53, 44, 12, -212, 260, 295, 81, 79, -84, 138, 69, -172, 54, 111, -206, -180, 181, -157, -23, -101, 182, 40, -21, -67, -1, -118, 110, -59, 67, -28, -1, 119, 47, 17, -46, 117, 74, 35, -10, 121, -9, 23, -76, 147, 33, 59, 108, -294, -95, -57, -105, -102, 30, 165, -70, -43, -89, -40, + 36, 73, -202, -12, 71, 9, -16, 89, 58, -189, -53, -41, 118, -124, 166, 180, 95, 38, -83, -4, 15, 121, -32, 15, 15, 19, 178, 20, 190, 71, 3, -90, -51, 78, -15, 1, 8, 5, 18, 80, 23, 32, 4, 30, -63, -5, 20, 26, -16, -9, 1, 26, -18, -13, 27, 26, 48, 23, 45, -25, 4, 6, -17, 42, 326, -61, -5, 119, 77, 58, 110, 290, -81, -27, -280, 5, -240, -305, 11, 130, -394, 133, 128, 70, -120, -95, -130, -50, 7, 8, 125, 165, -23, -163, -99, 122, + -175, -87, -148, 32, -239, 119, 19, -16, 38, -8, -55, 0, 154, -178, 215, -163, -19, 40, -109, -89, 84, 41, -35, -83, 160, 67, -112, -224, 26, 52, 131, -5, -58, 11, 69, -53, 311, -104, -51, -222, -148, 352, 142, -78, -20, -122, -137, -11, 49, 9, -67, 76, 41, 105, -12, -76, 30, 3, -35, 31, 29, -8, 13, 42, 13, -10, -32, 17, 10, -29, 57, 49, 15, -29, -75, 5, -6, -3, 32, -37, 23, 39, -24, 90, 210, -281, -166, 196, -147, -157, -172, -206, 148, -52, -6, -47, + 8, -229, -46, 105, 114, 26, -121, -176, -146, -185, 37, 221, 30, 71, 76, 74, -130, 136, 85, -97, -78, -300, 46, 67, -236, -19, 72, -44, 29, -22, -253, 215, -236, 185, 10, 93, -265, -149, -237, -187, 34, -67, -84, -106, -1, 118, -220, -4, 64, -71, -245, -154, -51, 46, 119, 51, -202, 215, -70, -48, 214, -281, -93, -57, -50, 336, -123, -6, -127, -106, 61, 46, -8, 35, -27, -48, 62, 0, 25, 26, 81, -32, 23, 17, 5, 21, -93, 120, 109, -38, -19, 17, -16, 20, 3, -9, + -45, 27, -23, 10, 106, 67, 57, -44, 75, 30, -31, 34, 11, 25, 434, -384, -202, -256, 187, 71, -130, 88, -1, 259, 18, 4, -247, 177, 286, 300, 250, -137, -20, 39, -157, -108, 43, 19, -227, -111, -95, 113, -16, -172, -78, 58, 139, 18, -46, 3, -120, -2, -6, 20, -260, 154, 182, 38, 95, 108, -210, 304, 275, 52, -187, 110, -65, -279, -69, -87, -2, 19, -3, -168, -149, -346, -288, 6, 178, -158, 76, 25, -105, -282, -26, 168, -107, 151, 296, 91, -118, 171, 2, -16, 83, 134, + -9, -21, 39, 87, -44, -188, 14, -3, 23, 26, 67, 142, -47, -22, 109, 98, 24, 16, -64, 137, 19, -7, 84, 28, 33, 16, 76, 67, 76, 121, 13, 74, 14, 82, 41, 47, 35, 77, 70, -412, 44, -154, -552, -425, 107, 4, -95, 99, 267, -42, 160, 142, 83, -42, -143, 118, -122, 15, -105, 167, 305, -273, -78, 17, 111, 30, -84, -49, -101, -7, -125, 161, 36, -192, 215, -214, -68, 263, 232, 196, -222, -146, -199, 232, 315, -4, -64, 250, -366, 46, 99, -35, -307, 278, 98, 141, + 261, 14, -371, 98, 153, -95, -27, 257, -265, -249, -214, 27, 331, 179, -47, 379, -503, -185, 7, 243, 114, -72, -399, -62, -160, 45, 153, 390, 67, -109, 52, -66, -25, -128, 2, -106, 37, 107, 61, 98, 112, 36, 25, 1, 21, -53, -55, 6, 118, 45, -13, 21, 48, 95, 14, -31, 17, -30, 77, -138, -83, -61, 89, 76, -444, 449, 183, -10, -45, 38, 78, 244, -46, 27, -77, -56, 138, 71, 160, 71, 93, -303, -125, 510, 52, 152, 215, 81, -172, -320, 100, -133, 13, 113, -159, -187, + 229, 268, -139, -99, 208, -255, 112, -196, 89, -190, 276, 39, -36, 97, 475, 131, 184, -53, 24, 81, 350, -30, 502, 15, 239, -8, 453, 160, 338, 257, -57, -151, -41, -173, -191, 266, -53, -104, 41, 4, -136, -66, 42, 119, 33, -227, -225, -117, -230, -6, -5, -67, 64, -4, 93, -14, -94, 19, -40, -173, -109, 25, 231, -97, 86, -26, -2, 108, -81, 37, 53, -59, -40, -29, -66, 33, -83, -108, -41, -117, 147, -41, 9, -12, -9, 16, -49, 22, 37, 19, 60, 80, 14, 59, -44, -127, + 25, -35, 53, -52, 521, -137, -5, -642, -23, 343, -180, 298, -409, 59, 41, -12, -542, -25, -903, 42, -100, -378, -66, 50, -198, 34, 228, 35, -207, 38, -64, 200, -222, 13, 289, 65, 23, -43, 221, -143, 23, -1, 170, 33, -305, -163, -216, 252, -572, 276, 227, 195, 108, 42, -250, 178, -371, -88, -78, -77, -17, 23, 118, -285, -112, 479, 200, -175, -204, 52, -85, 146, -98, -30, -156, 435, 221, -149, 26, -222, 50, -168, -59, 173, 160, -50, 317, -125, 157, -208, 221, 32, -130, -175, -262, 66, + -30, 119, -34, -77, 47, 49, 78, 64, 144, -6, 46, -113, 90, -81, -42, -61, -13, -143, -26, 56, 128, -123, -61, -89, 87, 68, -58, -11, -97, 73, 330, 334, 194, 173, -162, 193, 321, -239, -9, -619, 355, 242, -88, 143, -40, 49, 221, -139, 346, -312, 30, 389, 170, 24, 300, -106, 138, 79, 161, 266, -157, -32, 490, 245, -11, 68, -332, 451, -380, -24, 395, 123, 426, -267, 68, -17, -104, 57, -411, -289, 388, -193, -83, -131, -437, 310, -103, -72, -194, 191, 444, -350, -71, 299, -329, -144, + 267, 373, -617, -165, -53, 263, -9, 307, -75, -226, 15, 164, 399, 201, -268, -14, 196, -397, -243, -76, -203, -207, -24, 188, -178, 44, 196, 54, 35, 137, -34, 88, 85, 83, 48, -16, -119, -41, -33, -109, -49, 17, 14, -17, 17, 120, -99, -33, -73, 57, 57, -24, -82, -182, 92, 69, 119, 32, 29, -14, -112, 45, -45, -53, -32, 323, 684, 132, -404, -144, 134, -897, 28, 5, -141, -44, 415, -678, 149, 317, -249, 281, 524, 130, -484, 131, -122, -9, -474, -143, 432, -49, 396, -104, -139, 65, + -335, -189, -242, -179, -132, 323, -358, 58, 625, 422, 141, -635, 106, 417, 174, 25, -227, -276, -678, -469, 97, -232, -232, -14, 290, 205, -204, 9, 412, -159, -70, 19, 542, 21, -27, 275, 86, -617, 173, 179, -3, -511, 216, 299, -224, -160, -419, 112, -154, 159, 80, -99, -177, 116, 53, 178, -88, 278, 99, -191, 23, -10, -262, 5, 22, -1, -5, -138, -119, -56, -3, 175, 59, 91, 142, -65, -83, 67, -136, -122, -4, -7, 44, -40, 32, 86, 93, 11, -53, -13, -6, -15, 2, -23, 12, -3, + 121, -68, -84, 217, 157, -20, 62, -201, 707, 39, -142, -9, 313, -150, 87, -76, 74, 269, -488, 517, 585, 165, 248, -198, 332, 771, 26, -87, -141, 328, -115, -185, -64, 117, -382, 171, -336, 387, 89, 390, -243, 355, 107, 465, 78, 99, -165, 290, 74, -91, 418, -162, -296, 591, 472, 175, 446, 646, 783, -242, -244, -275, 99, -358, 425, -51, -37, -600, 141, 683, 696, -26, -89, -475, 9, 454, -230, -281, 258, 42, -246, 89, -39, -150, -32, -128, -4, 264, 197, -52, 49, -62, -261, -341, -62, 172, + 71, 242, -47, -226, -61, 251, -116, 144, 232, -230, -60, -21, 61, -11, 156, 114, 58, -230, 61, 128, 40, 54, 85, -204, -94, 2, -9, -107, -264, -85, 25, 139, 32, -107, -928, -649, 337, 129, -488, 48, 212, -445, -281, -193, 525, 234, 166, -170, -132, -136, -331, -441, -775, 400, 342, -166, 869, 417, 834, 572, 51, -270, 219, 101, 378, 435, 481, -71, -87, 204, -221, -52, -195, -363, -597, -175, 603, -152, -244, -344, 238, 365, 241, 23, 354, 694, -417, -191, -322, -233, -672, -165, 167, -306, -241, -772, + -1100, 119, -726, -1139, -826, -348, 734, 254, 447, 336, -762, -322, 63, 380, -380, -449, -435, -136, 223, -258, -949, -597, -139, -193, -71, -141, 531, 486, 502, 514, 168, -6, 190, 53, -19, 151, -429, -166, 182, 249, -15, -140, -157, 62, -235, -338, 307, -252, -131, 27, -297, -278, -504, -196, -121, 35, 414, -108, -65, -133, 210, -113, 8, 203, 13, -145, 91, 203, -128, -31, -10, 108, -1760, -276, 565, -599, 246, -234, -955, -298, 1023, 1289, -685, 24, -236, -1052, -838, -792, -845, -452, -552, -46, 180, -147, 215, 198, + -346, -95, -475, 199, -747, -673, 160, 115, -204, -247, 584, -173, 812, 179, 753, -512, 327, 212, 912, 487, 319, 86, 137, -110, 267, 375, -297, -414, 638, -90, -804, -1540, -1852, -1336, 219, -4, -1725, 557, 291, 429, -590, 72, 200, 74, 881, 899, 1799, 596, -964, -1237, -762, -685, -793, -705, -28, 381, 513, -336, 677, -587, -819, -637, -425, -321, -641, 395, -49, 377, 288, 40, 664, -355, -158, -670, 219, 350, -61, -65, 196, -645, 18, -233, 116, -314, -445, 260, -19, -189, -76, 306, -252, 155, -235, 178, 153, -97, + -234, 137, 150, -477, 189, -126, -146, -151, 94, -313, -144, 987, -264, -1865, -534, 1537, -213, 343, 218, 288, 538, 442, 153, -303, -114, 78, -333, -76, 564, -504, -302, -505, -122, 89, 64, 136, 263, -383, 342, 843, -16, -488, 44, -319, -112, 501, -527, 62, 166, 613, 883, -559, -322, 345, 47, 100, 102, -370, -953, -167, -444, 870, -1646, -1078, -446, -176, 475, 103, -581, -94, -669, -718, -260, -519, 94, 433, 1977, 370, -295, -1269, -1047, 315, -33, -1191, 645, 646, -1217, -19, 315, 355, 1310, 580, 273, -1291, -668, -889, + 812, -77, -267, -140, 252, 862, 727, -378, -769, -1117, 271, 669, -236, -110, 584, 340, 509, 135, 180, -427, -131, -199, 219, 237, -63, -94, -67, 317, 346, -502, 292, 230, 418, -262, -190, 271, 91, -360, -41, 441, 79, -312, -654, -2213, 314, 341, -75, -38, -173, -639, 248, -142, 1127, -1167, -240, 1188, -57, -807, -101, 700, 851, 522, -156, 608, -465, 410, -190, -161, -402, 666, 452, -440, -204, -67, 676, -67, 69, -439, 454, 294, -506, 909, 37, -824, 721, -896, -474, 808, -1737, -1109, 939, -603, 694, -1103, 241, 399, + -608, 19, -52, -1137, -267, 1166, 1230, -1409, -470, 424, -1130, 1450, 1453, 204, -2090, -1099, 2215, -1176, -238, 1796, -1060, -2160, -488, 1943, -422, -1425, -353, -2598, -123, 2096, -769, -2099, -217, -592, -286, 619, -79, -29, -767, -503, -247, 835, -1069, 49, 167, -337, 35, 996, -643, -808, -110, 278, 625, -253, 313, 475, 52, -730, -390, 13, -581, -284, 1103, -421, -1081, -293, 626, 257, -84, 136, -979, -567, 742, 1100, 132, -822, -401, 32, 290, 548, -323, -1224, -1155, -36, -1456, -434, -624, -587, -446, 936, -112, -307, -406, 179, -517, -1213, + 928, 289, 800, 248, 828, -337, -524, 180, -881, 674, -799, -172, 514, -605, -134, -370, -965, 139, -730, -527, -638, -473, -295, -648, 107, 707, -488, -177, 82, 652, -305, 227, -679, 1089, 337, 464, 295, 1044, -66, -1238, 267, 442, -347, -9, 644, -863, -854, -1000, 855, 249, -1227, 471, -811, -164, -1146, 499, 809, 162, -1269, 705, 585, -168, -1115, 294, -674, -236, -50, -346, 549, -504, -903, 441, -203, 371, -6, -41, -7, -252, -282, 183, 804, -106, -1138, -323, 473, -571, -240, 538, -206, -87, -456, 884, 524, -272, 401, -80, + 180, 714, -131, -643, 265, 403, -326, 511, -84, 312, 38, -246, 436, 624, -362, -679, 263, 401, -329, -77, 383, 121, 1078, 2024, -485, 1004, 197, -477, -903, -526, 1179, -385, 220, 458, -117, 1087, -158, 853, 892, -1092, 565, -285, 28, 402, 334, -36, 180, 325, 1091, 1121, 866, -631, -213, -1487, -42, 352, 675, 156, -1229, 541, -737, 957, -861, -603, 65, -722, -121, -417, 1476, -804, -391, -1542, -499, -809, 2181, 1324, -456, -1466, -1569, -934, 1086, 1413, 720, 208, -1883, -876, 624, 529, 86, 683, -388, -1243, 592, -2109, 2298, -215, + -1479, 3451, 499, 1201, 2073, -3426, -2463, 683, -199, 523, 753, -2140, -154, 431, 47, 1791, 132, -939, -93, 963, -554, 420, 500, 18, -387, 471, -1241, 951, -238, -399, 543, 142, 43, 562, -128, 336, -63, 215, -157, -657, 403, 275, 381, -6, 17, 255, 149, 97, 767, 843, 54, 552, -516, 76, -337, 639, 592, 87, -163, -389, -896, 74, -896, 606, -1266, 784, -521, 1286, -580, -60, 733, 130, 65, -332, -287, 33, -493, 543, -63, 577, -452, -446, 152, 23, -458, 289, -57, 252, -140, -124, 241, -230, -18, 179, -92, -110, + 914, -63, -305, -164, 435, -40, -496, 264, 536, 108, 14, -317, 114, -257, 247, 649, -229, 296, -243, -73, -266, -127, 173, 209, -377, 228, 70, -49, -377, 64, 140, -282, 410, 341, -683, 174, -627, -716, 494, -255, 597, 323, 20, 304, -92, -370, -86, 21, 416, -187, 129, 170, -235, -44, 146, -73, -43, 239, 0, 91, -194, 82, -17, -204, 389, 33, 318, -155, 262, -130, 21, -204, 176, -99, 385, -120, 364, -372, 86, 24, -74, 12, 49, 286, -9, -338, 227, -191, 40, 204, -205, 357, -743, 1575, 298, 388, + -199, 145, -45, 300, 95, 673, 47, -363, 222, -236, 105, 139, -307, 18, 76, -331, 305, 80, -135, 410, -145, 163, -124, 78, 79, 39, -50, -119, -54, 59, 11, -66, -197, 150, -132, 76, 132, -134, 30, -125, 38, -199, -325, 339, -180, -85, 144, 68, -56, 40, 291, -317, 140, -118, 252, -266, 154, 77, -46, 61, 8, 6, 124, -168, 97, 86, -44, -15, 221, -32, 76, -253, 345, -264, -2, 174, -153, 119, 40, 43, -160, 133, 138, -83, 56, 69, -113, 43, 59, -23, 121, 7, -1, -11, 109, 85, + -66, 95, -46, 44, 49, -10, 135, -58, 3, 87, -103, 10, -9, -73, 13, 78, -20, -61, 135, -83, 297, -1398, -3471, 750, 2886, 1952, 4072, -1332, -1139, -2344, -3747, -370, 1168, 1540, 2009, 1013, 111, -328, -869, -1239, -188, -331, 122, 284, -15, 71, 150, 66, 490, 582, 362, -67, 67, -431, -904, -963, -473, -632, 520, 960, 1018, 1119, 613, -181, -442, -822, -869, -603, -340, -39, 219, 422, 452, 381, 328, -56, 88, -97, 43, -72, -45, -26, -308, -322, -234, -486, 0, -91, 61, 828, 1089, 369, 369, -298, -600, -414, + -722, -579, 204, -49, -350, 270, 287, 344, 815, 340, 357, 90, -439, -431, -355, -385, -490, -416, -250, 78, 544, 822, 768, 313, 155, -199, -373, -333, -370, -425, -196, -176, -15, 146, 110, 333, 439, 320, 216, 78, -28, -206, -216, -333, -378, -294, -266, -65, 281, 424, 454, 407, 164, 78, -204, -319, -173, -235, -323, -240, 44, 220, 201, 116, 125, 115, 84, 30, -21, -27, -77, -92, -85, -87, -102, -44, 59, 91, 94, 65, 24, -12, -28, -43 }, + {-196, 25, 62, 60, 309, 84, 65, -91, 12, -157, 37, 144, -73, 7, -30, -77, -124, 96, -208, -105, -104, 113, 124, 65, 30, 89, 74, 148, -51, 52, 92, 20, 30, -107, -46, -45, -40, 100, -191, 32, -66, 200, 5, -36, -50, -82, -27, -86, -252, -80, -49, -41, -56, 26, -47, -12, -16, 88, 40, -11, 56, -49, 108, -71, -117, 113, 119, -51, -113, 11, 62, 47, 54, -53, 1, 44, 59, 26, -16, 7, 73, 141, 68, -17, -2, -33, -35, 30, -46, 29, 35, -13, -5, 16, 14, -14, + 12, 8, -65, 10, 5, 20, 12, -25, 23, 19, -2, 279, -52, -27, 30, 77, -206, 128, -244, -11, -118, -17, -78, -18, -19, 123, -104, 133, -139, -152, 64, 204, -240, -67, -116, 2, -60, 65, 86, 44, 88, -139, 5, 196, 77, 25, -142, -203, -122, 31, -104, -59, 40, 132, -119, -117, 48, -86, 152, 51, -15, 107, 101, 0, 170, 84, 53, 45, 112, 175, -115, 34, 48, -123, 11, 100, -39, 253, -78, -67, -53, 94, 129, -164, -67, 45, -30, 40, 16, -72, 32, 15, -53, -87, 36, 24, + 80, 7, 25, 37, -3, -26, 59, 3, 0, 50, -27, 24, 67, -6, -14, 13, -10, 21, -41, -13, -19, 3, -6, 26, 3, -26, 1, -359, -58, -80, -64, -32, -44, 191, 228, -52, 186, 71, -103, 48, -156, 27, 33, -210, -31, 32, 36, 145, -28, 126, -85, -161, -170, -49, -86, -129, 133, -53, -26, -24, 28, 72, -206, 0, 28, -98, 245, 19, -61, -54, 262, -19, 33, 155, 4, 94, 37, 8, 144, -1, -101, 129, 69, 83, 117, 38, -96, 68, 96, 93, 145, 0, -134, -108, 170, 236, + -216, 43, -57, -39, 49, 90, 87, -70, -28, -67, -112, -98, -36, -62, -96, 21, -26, 36, 31, -30, 17, 5, -78, 26, -53, -95, 6, -28, -40, -43, -12, 16, -15, 27, -18, -33, -44, -41, -18, 7, 31, -264, 282, 261, 197, -137, 154, 278, -70, 217, 82, 33, -34, 240, 113, -56, -172, 100, -71, -91, 97, 115, 50, -170, 28, 153, -74, 52, -335, 49, -27, 162, 40, -69, -101, 207, -178, 15, -144, 17, -44, 116, -24, -37, -176, -42, -31, 219, 11, -200, -7, -11, 69, 105, -89, 1, + -113, 122, -26, 147, -79, 219, 108, -240, 255, -36, -176, 31, 233, 48, 36, -188, -12, -72, -102, -98, 9, 90, 115, 63, 63, -73, 55, -63, -7, -3, -29, -12, 66, -104, 28, -10, 9, 36, 29, -2, 45, 6, -69, -74, 44, 21, -3, -49, -10, 13, -7, -21, -48, 31, -1, -29, 33, -19, -13, -38, -24, -14, -49, 35, 303, -106, -221, -12, -331, -1, -285, -100, 194, -203, -224, 66, 18, 19, -53, -74, -163, 109, -318, -98, 31, 196, 11, 198, 70, 437, 167, -5, 18, 208, -51, -63, + -40, 34, -139, -69, -233, -17, -108, -65, 286, 4, 178, -73, 72, -19, 106, -36, 99, -99, -123, -20, 34, -124, -124, 10, 62, 132, -20, -63, -28, 126, 214, 11, -147, -210, 2, 57, 21, 286, -180, -10, 127, -48, -151, 201, 92, 35, -101, -108, -180, -71, -20, -94, -48, -81, 14, 20, 44, 5, 12, -101, -53, -108, -38, -32, -83, -53, 27, -10, -36, -10, 26, -68, 33, -49, -7, -21, -38, -13, -2, 30, -48, -71, 35, 18, 271, -209, -43, 17, -17, -8, -172, -133, -19, 113, 41, 45, + 48, 119, -25, 109, 89, -284, -109, -333, 86, -118, 167, -108, -147, -108, 86, -222, -184, 256, -141, 278, -66, 83, -99, -189, 207, -160, -179, -19, -98, -211, -162, -266, 11, 169, 98, -104, 294, 107, -108, -138, -213, 8, -80, -150, -75, -64, -105, 55, 235, -15, 15, -161, 75, 78, -139, -111, 56, 285, 114, -72, -38, -61, -295, -234, -196, 204, 218, -33, -102, 94, -65, 82, -43, 38, 7, 3, -95, 63, -56, -41, -15, 56, 43, -7, -80, 49, -12, 36, -27, -19, -70, -32, -2, -10, 14, 12, + -9, 11, -58, 25, 6, 7, -21, 71, 46, -4, -28, 6, -44, 81, 391, -74, -1, -64, 254, 241, 83, -402, -67, -488, 289, 122, 8, 505, 239, -44, -226, 208, -96, 52, 71, 33, 166, -146, 283, 108, 28, -85, -143, 192, 162, -31, 106, -240, 46, -321, 132, 18, 164, -263, 55, -86, 59, 300, 255, 12, 74, -186, 246, 7, 522, 552, -72, -147, -149, -119, -319, -89, -416, 26, -34, -23, -84, 147, 248, 387, 360, 277, -454, -324, -13, 23, 479, -336, 258, -17, -95, -49, -11, -94, -263, -172, + -49, 78, 26, -6, -71, 42, -92, -8, -49, 102, 114, -27, -20, 106, 82, 14, -14, 39, 8, 16, -19, 46, -2, -26, -41, 14, 47, 68, 147, 114, -54, 14, -102, -19, 48, -8, -19, 4, 23, -141, 281, 61, -207, -114, 527, 518, 581, -57, -24, -98, 98, 285, 328, 95, -140, -279, -568, 169, -336, -73, -34, -72, 39, -16, -104, -12, -329, -130, 21, -60, -367, -155, 32, 268, -75, 8, -292, -98, 5, 195, -118, 120, -327, -91, 77, 125, -89, 441, -89, -55, -228, -75, 178, 61, -19, 230, + 319, 371, -64, -185, -209, 4, 45, 88, -148, 120, 159, 133, 131, 372, 252, 166, -18, 84, -368, -69, 40, 190, 301, -56, -167, 53, 105, -86, 155, 123, 167, 26, 74, -8, -12, -120, 95, -37, 63, 55, 19, 88, 9, 142, 102, 64, 42, 40, 2, -18, 13, -59, -2, -74, -117, -47, 26, 21, 53, -24, 36, -49, 24, 63, -537, 671, -18, 99, 367, 8, -128, 20, -653, -397, -186, 106, -128, 76, -305, 213, -106, -2, 404, -392, -261, 379, -118, -552, 40, -340, 71, -27, 208, 90, 105, 43, + -66, 247, -27, 317, 193, -111, -189, -176, 86, -86, 87, 62, 186, 56, -349, 22, 119, -119, 15, -239, -53, 23, 16, 554, -96, 394, 470, -128, 252, -76, -14, -260, 166, 401, 279, 64, 110, 249, -16, 207, -84, -113, -200, 110, 511, 116, -66, 42, -359, -120, 8, 339, 247, 108, 219, -61, 215, -1, 135, 18, -11, -24, 150, -15, -95, -57, -38, -21, -38, -74, 108, -69, -94, -26, -124, -83, -105, -59, -74, -93, 32, 24, 40, 35, -56, -28, -97, -125, -12, -69, 41, -32, 10, 63, 64, 46, + 111, -28, -11, 87, 642, 93, 160, -152, -77, 436, -288, -67, -567, 531, 277, 38, -193, -535, 54, -142, 65, -600, 214, 317, -349, -83, 52, 37, 116, 344, 423, 2, -1, 80, 16, -256, -294, -194, -387, -190, 329, 154, -124, -163, -108, -679, 147, 164, -319, 522, 18, 389, -140, 253, -84, -336, 30, 310, -171, 171, 198, 554, 153, 175, 529, 303, 200, -732, 151, 113, 142, 16, -300, 533, -396, 304, 317, -478, -105, 656, -584, 100, -138, -62, -211, 256, -110, -217, -187, 115, 247, -230, 287, -237, -105, 328, + 119, -26, -145, -152, -5, -59, -250, -27, -54, -68, -24, 198, -18, -180, 16, 78, 187, 119, 148, -58, 77, -107, 4, -35, 77, 158, -117, 74, 72, -7, 42, 34, -347, -518, -234, -222, -692, 455, 63, 486, 18, 62, -246, -132, 232, -28, 240, -257, -89, 36, -122, -212, 288, -312, 345, -133, 106, -85, -250, -225, 94, -87, -12, 174, 700, 42, -100, -248, 92, 565, -115, -102, -343, -124, 38, -324, -125, -459, 280, -560, -1007, -112, 23, 468, -501, 449, 288, -241, -474, -82, 67, 128, 8, 281, -202, -80, + -993, -139, 1007, 92, -180, -142, -536, 389, -178, -157, -139, -83, -237, -347, 93, 189, -18, 142, -295, -531, -27, -283, -87, 3, -281, 57, -207, -358, -268, -133, 106, 154, -38, -422, -112, 20, -213, -98, -25, -197, -120, 45, -16, -156, -67, 62, 18, -206, -86, -2, 176, 197, 47, -68, -81, -31, 130, -37, -21, 4, 45, -174, 149, -41, 98, 477, 426, -130, -168, -37, -673, 451, -424, -348, -270, 173, 73, 419, 55, -222, -261, -269, 217, -101, -143, 384, 427, 149, -281, 354, 566, -210, -120, 492, 128, 103, + -314, 5, 466, -677, 473, -97, 67, 287, 343, 2, 173, -317, -260, 182, 650, 179, 161, 251, -324, 74, 290, 172, -51, 237, 146, -382, 317, -372, 87, 282, -298, 234, -364, -140, 69, 19, 236, -144, 203, -148, 30, 81, -67, -145, -295, 799, 86, 244, -344, -803, 572, -544, -238, 3, -126, -77, -47, -221, 142, 120, 61, -204, 260, 205, -87, -84, 77, -68, 72, -68, 275, 107, 25, 201, 206, -114, 1, 104, 143, 64, 68, -124, -171, 142, 177, 262, -36, -228, -34, 28, 114, -354, 135, -114, -54, 90, + 83, -83, 124, 17, 98, -51, 235, -444, 473, -172, -465, -603, -168, -60, 357, -531, -84, -61, 282, 531, 440, 275, 43, -134, -80, -53, 374, 308, -70, 50, -79, 241, -577, 347, 192, 272, 94, 64, 501, -195, -422, 4, -138, 30, -587, -325, -32, 494, -330, -104, 83, -19, 17, 485, 197, -74, 45, 238, 159, 565, -163, 259, 289, 155, -89, 94, -610, 263, -112, 29, -138, -336, -451, 93, -213, -615, 151, -523, -382, -89, -787, -478, 122, 338, -391, 86, 35, 909, 865, 814, -21, 47, -423, -256, 343, -182, + -116, 57, -105, 191, -229, -115, -5, 73, -136, 176, 180, 9, -71, 50, 176, -138, -180, -46, 159, -208, 359, 205, -12, 162, -52, -145, -228, -125, -202, -110, 126, 23, 362, -82, -799, -884, 528, 475, 160, 514, 860, 246, -327, 279, -129, -242, 394, 29, -351, 217, 284, 66, 101, 23, 45, 788, -16, 170, 74, 489, 30, 781, -3, -342, 625, 129, -275, -96, 331, -67, -5, 260, -474, 475, -99, -693, -194, 69, -693, -77, -72, 306, 296, 523, -365, 81, 84, 110, 224, -331, -373, 198, -8, 400, 325, 101, + 834, -138, -127, -568, 851, 151, 591, 362, -948, 137, 87, 583, -308, 249, 6, -251, -30, -203, 470, -897, -108, -63, 5, 42, 145, 221, -2, 415, -15, -58, -132, -85, 28, -143, 50, -38, 126, 89, -42, 36, -48, -250, -13, 14, 65, -255, 138, -52, 145, 114, 204, -206, 239, -128, 78, 172, 156, -52, 7, -93, 135, -8, 67, -3, -26, 346, 195, 5, 162, 48, 168, 523, -1106, 656, 668, -285, 159, 93, 181, 4, 532, -388, -84, -417, -3, -236, 38, 112, -607, 273, 660, -454, -435, -445, 878, -384, + -215, 81, -300, -910, 160, 659, -906, -412, 314, 485, 133, -139, 211, -323, -150, -18, 450, -619, -490, 347, 565, 221, -704, -230, 18, -34, -122, 367, -108, 554, -451, -100, 0, -519, 329, -604, -413, 191, -268, 584, 848, 498, -559, 295, -163, -170, -394, -125, -643, 491, 365, 174, 21, -307, -169, 197, -671, 541, -126, -95, 286, 49, 261, -75, -38, -232, -64, 20, 49, -182, -60, -88, -62, 303, 35, -7, -143, 122, 125, -110, 70, 138, 35, 234, -81, -168, 38, -272, 143, 99, 38, -10, 111, -25, 179, 54, + 129, -216, -60, 197, 15, 79, 106, -202, 34, 203, 642, 1070, -8, -811, 171, -968, 165, 439, 206, 58, 581, 430, -26, -89, -801, -432, 11, -375, 1083, -198, -246, -468, 58, 407, 285, -15, 209, 317, -480, 164, 929, 328, -638, -450, 301, -316, -43, 226, -142, -527, -126, 63, 886, -192, 197, -237, -716, 125, 899, -243, -539, 156, -330, 219, -189, -220, 617, -159, -71, 301, -532, 191, 653, -271, 56, -383, 1149, -210, 137, 373, -267, -64, -307, 161, -347, -293, -274, 440, -598, 88, -89, -178, 464, 10, -159, -197, + 24, 174, 135, -266, -48, 12, -74, -329, -198, -60, 78, 26, 26, 46, 268, -271, 282, 56, 81, 19, 223, -127, 367, -81, -6, 282, 368, -193, 241, -121, 80, -214, 186, 156, -318, -16, -128, -44, -160, 115, -196, 176, -312, -1771, -621, -32, 566, -297, -887, -334, -130, 435, 113, -118, -439, 464, 823, -374, 623, 156, -1178, 440, 553, -194, -479, -90, 726, 775, -64, -587, 41, -67, -76, -489, 121, 223, -776, 536, 456, -547, 102, -614, 218, 1503, -1342, 1390, 629, 63, 851, 423, -869, 523, -653, -146, 715, 34, + 205, -364, -635, 1935, -454, 29, 763, -367, 149, 59, 471, 1090, 1036, 981, 62, -18, -157, 51, -264, 74, 833, -220, -288, 84, 116, 484, 564, 161, 158, 401, 171, -305, 100, -157, -451, -202, 238, -339, -489, -371, -16, 46, -280, 145, 319, 51, -102, -18, -358, 426, -62, -92, 295, -243, 201, -181, -145, 502, -1, -370, 475, -290, 286, 135, -185, 144, -64, 346, -157, 122, 18, 30, -36, 369, -188, -42, -26, 66, -53, 161, 453, -120, -1307, 594, -950, 1336, 157, -1162, 262, 10, 545, 257, -282, 989, 241, 50, + 660, -528, -735, 24, 384, 1333, -188, 4, -140, 960, 104, -762, -451, 145, -85, 425, -742, 357, 120, 220, -67, -289, 168, 299, 2, 893, -1440, 127, -509, -315, -187, -1052, -1530, -1582, -1152, 123, 5, -917, -9, -166, 97, -568, -1473, 1451, -28, -213, 293, -1437, -101, -357, 268, 424, 1974, 1475, -168, -17, -49, 390, 595, 364, 270, -54, -242, -1400, 262, -27, -549, -243, 912, -127, -170, 438, -40, 480, -189, 242, -30, -98, 334, 415, -193, 60, 179, -76, 83, 23, -9, 284, -124, -142, 230, -271, 357, 0, 191, 304, + -156, 77, 257, -61, -178, -61, 24, -45, 66, -353, -28, -279, 291, 47, 194, 145, -49, 12, -26, 139, 178, 155, -371, 1798, -1713, 296, -328, 68, 728, -528, 184, 30, -1855, 48, -206, 92, 217, -828, -307, -1372, -351, -65, 78, -518, -388, -596, -246, 595, 132, 1200, 296, -403, -422, 738, -816, 1411, -1098, 322, -886, 20, 851, -1539, 1455, 258, 171, -1057, -209, -199, 3, 510, 510, 641, -1219, -29, -477, -414, -467, -656, -452, 25, 702, -745, 204, -1373, -457, 350, 413, 77, -1561, -845, -555, -795, -657, 58, -517, 836, + 254, 420, -286, -430, 1401, -466, 379, -278, 113, 1052, 144, 192, -583, 599, 350, -243, 557, -412, 157, -151, 379, 79, -120, 207, 481, -159, 157, 174, 148, -53, 133, -64, 333, -104, 60, 315, -59, -116, 101, 139, -207, -42, -586, 376, 259, 8, -322, -128, 36, 130, 458, -68, -117, 164, 123, -62, 465, 94, -551, 153, 557, 781, -1447, 2228, -1663, -168, -1000, 207, 30, -602, -855, 1018, 686, 325, -433, 454, 146, 962, -747, -490, 600, 999, -1257, 519, -38, 609, -448, 184, -553, 123, -1042, 352, 1132, -30, -80, 1406, + 250, -637, -1359, 1176, -611, 534, -495, 1405, 623, -146, 150, -802, 114, 355, -384, 398, -1685, 671, 1540, 1206, -657, -681, -685, 783, 69, -238, 69, 1986, -959, -443, 772, -651, -1781, 767, 405, -1270, 723, 1246, 1098, -325, -483, -864, 473, -530, -339, 803, 546, 254, 702, 402, -264, -242, -894, 219, -372, 321, -328, 650, 447, 108, -116, 619, -328, -38, 83, 244, 146, 292, 263, 31, -143, -78, 221, 125, 91, 40, 345, 1115, -30, -77, 168, -373, 139, 408, -566, 261, 297, -207, -157, 271, 149, -317, -1432, 764, -85, 199, + -526, 458, 9, 251, 75, 83, -300, 228, 774, -990, 850, -145, -525, 175, -358, 231, -366, -299, 249, -789, -84, 1052, -1520, 429, 69, -253, -470, -550, -362, 1104, -912, -129, 353, -921, 231, 509, 335, 176, 156, -519, 406, -1357, 15, 1192, -502, -131, -271, -333, -14, -958, 505, 389, -799, 749, 203, -902, 367, -172, 651, 577, -848, 298, 930, -877, 488, -623, 489, 578, -902, 510, -71, -470, 677, 41, -1084, 337, 473, 151, -306, 58, 810, -371, -770, 818, -41, 68, -43, -96, 492, -366, -186, 360, 128, -80, -373, 547, + -213, -346, 22, 292, -177, -123, -92, 430, -337, -162, 22, 238, -211, 173, -16, 427, -273, 76, 26, 51, 711, -280, -3272, -7183, -2839, -4770, -6503, 2478, 891, 2142, 9713, 8094, 5341, 8344, 5674, 687, 1420, 1031, -4434, -2857, -1965, -5073, -5178, -1427, -1441, -3213, -952, -685, -3871, -3328, -1078, -1830, -3659, -890, -612, -2866, -329, 2002, -863, -695, 2954, 1815, -1200, 2619, 4316, 486, 2429, 5296, 2591, 1340, 5711, 4176, 3107, 6932, 9375, 7416, 8610, 11156, 7286, 4770, 6255, 4032, -1118, -271, -2768, -6870, -9717, -10454, -13997, -15926, -16911, -16361, -15726, -15637, -13062, -9998, + -9382, -6123, 492, 2602, 3374, 10213, 10022, 6914, 10179, 9329, 5063, 4919, 6488, 3925, 1848, 4536, 4627, 2079, 3739, 5645, 3744, 2229, 4805, 3981, 799, 2439, 3534, 392, 665, 3866, 2360, 1266, 4094, 4057, 1473, 3228, 2782, -742, -2040, -2115, -4848, -6556, -6476, -7472, -8238, -8544, -8369, -8588, -9555, -9887, -9468, -10562, -9054, -6180, -4738, -1639, 2675, 5641, 8261, 10651, 10787, 9188, 8289, 6748, 5047, 4018, 3319, 2628, 2008, 1779, 1611, 1169, 966, 852, 470, 50, -188, -530, -926, -1187, -1264, -1417, -1503, -1441 } + }, + { + {-122, 74, 119, -42, 105, -17, 111, 56, -24, -44, 113, 10, 22, -128, -21, -9, -6, 175, 86, -6, -132, -96, -57, 16, -3, 38, 81, 25, 30, -133, -20, -129, 5, -71, 85, 84, -34, -70, 88, 19, -33, -119, -16, -77, 21, 73, -121, -59, -20, -47, 309, 74, 179, 13, 59, -1, -89, -83, -105, 50, -87, 63, 2, 76, 78, 190, 57, -16, -10, -113, 184, 169, 30, 52, 48, 52, -11, -94, 28, 55, -36, 16, -29, -86, 41, -72, -49, -22, 6, -32, -35, -41, -1, -2, -7, 8, + -15, 27, -15, -26, -3, 34, 13, -14, -47, -14, 43, 3, 19, 17, 427, -101, -89, -35, -85, 20, -203, 16, 40, 10, 138, 16, -29, -122, 78, -172, -148, 54, -72, -35, -26, 29, 116, 159, 12, -25, 188, 68, -11, 7, -77, 2, 207, 0, -96, -78, -22, 70, -96, -118, -121, -99, 94, -93, 35, -113, 40, 137, 9, 97, -41, -77, -38, 67, -4, 104, 152, 22, -46, -79, -4, -12, 7, 5, -134, -14, -63, -68, 65, 14, 42, 50, -160, -89, 66, -30, 118, 22, 100, -20, -25, -28, + -58, -14, -64, -26, 2, 93, -23, -2, -16, 30, -1, 36, 7, -8, -24, 29, -46, 0, 2, -26, 21, 27, -39, 13, -19, 17, 16, 0, 27, 3, -14, -305, -151, -66, -209, -73, -200, 58, -18, -125, -144, -22, -118, -3, 97, -8, -179, -67, 2, -70, -58, 51, 167, 215, -35, -58, 120, 137, -44, -33, -28, -98, 29, 44, -88, -66, -21, 82, 183, 11, -63, -1, -93, -35, -148, -70, -66, -234, -25, -107, -74, -257, 158, -112, -99, 45, -17, -19, 33, -213, -56, -77, -17, -123, -17, -59, + 56, 73, -70, -38, -102, 35, -16, -22, 0, -158, -4, -143, 21, -10, -45, 41, 173, 82, -41, 9, -31, -68, 6, 26, -34, -6, -42, 0, -18, -53, 21, 19, -55, -26, 15, -24, 7, -37, -28, -30, -52, -56, -5, 13, -29, -34, 0, -17, -7, -19, -1, -11, -19, -47, 24, -17, -22, -23, -564, -44, -278, 250, -145, 450, -287, 284, -255, -15, -3, -196, 154, 6, -73, 46, -64, -26, -191, -2, -144, 115, 41, 140, -82, 209, 189, -182, 52, -155, 166, 2, -115, 10, -16, -6, 122, 18, + -180, 75, 131, -8, 154, -71, 126, -187, -94, 123, -107, 31, 166, -150, 245, 97, -240, 59, -231, 84, 130, 88, 125, 179, 61, -22, -14, 12, 58, 129, -44, 243, 48, 167, 91, 49, 13, 168, 31, 42, -95, -130, 68, 90, 11, 144, -16, -1, -26, 171, 53, -61, 40, 29, 26, 58, 10, 106, -15, 37, 21, 41, -26, 20, 11, 2, 11, -36, -31, 14, -39, -18, -42, 28, 1, 373, 2, -101, -34, -139, -166, 272, -53, -40, 250, -19, -48, 111, 195, 56, 97, -5, -212, -56, 160, -242, + -240, -90, 53, -171, -102, 3, -24, 167, -64, -37, 177, 246, -213, 56, -51, 90, 25, -95, -20, 102, 157, -42, -221, -50, -19, -59, -110, 16, -14, 40, -30, 30, 207, -153, 20, -117, -94, -160, -48, -93, -221, -8, 16, -86, -17, -92, 86, 107, -17, 32, -79, -23, 268, -36, -111, -364, -165, -5, -124, 83, -35, 31, 0, -73, -13, 105, -89, 20, -25, 10, 1, -76, -56, -33, -58, -12, -93, -20, -52, 10, -36, -13, -50, -55, -53, -14, -5, 18, 14, -8, 15, 12, -3, 51, 45, -1, + 27, -22, -28, 6, 483, 543, 103, -197, 124, 214, 215, 121, 162, 73, 266, -27, -32, -108, 167, -98, -234, -322, 37, -154, -133, 114, -34, -85, 272, -19, 337, 4, -133, -91, 119, 79, -66, -266, 385, 223, 3, 209, 125, 136, -126, 154, 79, 31, -46, -68, -169, -239, 68, 116, -186, 75, 162, 241, 65, 218, 102, 186, -271, 81, 26, 55, 8, -18, 117, 106, 103, 149, -48, 73, 44, 214, 263, -132, -154, 24, -62, -138, 60, 146, -88, 62, -260, -191, 46, -132, -61, -42, -117, 1, 0, 16, + -1, 53, 63, -3, 33, 12, 48, 50, 2, 5, -2, 55, 29, 31, 69, -11, -33, 51, -13, 1, 79, 48, 74, 101, 17, 46, 28, 67, 444, 140, 196, -162, 64, -402, 22, -290, 220, 148, -122, 186, 105, -196, -49, 285, -9, 196, -54, 40, 227, -282, -22, 47, 83, 19, 91, 12, 275, -127, -79, -82, 208, 27, -98, 127, 351, -244, 43, 48, -21, 143, -71, 269, 90, 69, -220, -21, -58, 125, 93, 135, -151, -97, 127, -262, -148, 61, 283, 173, 250, -271, -87, -276, -72, 85, -24, -260, + 34, -159, -3, -285, -348, -140, -251, 16, 88, 52, -108, 140, 222, 64, 65, 130, -41, -211, -14, -145, 76, 26, -15, 42, 19, -154, -81, -42, 77, 14, -56, -16, -6, -20, 12, -29, -16, 14, 70, 21, 22, 19, -15, 24, 46, 28, 61, 21, 31, 7, 48, -73, -523, -472, -340, 103, 104, 391, -174, 371, -153, -614, -55, -58, -238, -398, -146, -9, -246, -3, -378, 27, -398, 227, -101, 165, -79, -8, -124, -144, 244, 47, -72, 277, 30, 44, 94, 255, 224, 171, 3, -304, -33, 145, 43, 185, + -90, 82, -447, 140, 267, -338, 197, 68, 316, 242, -2, -85, -10, 214, 104, -285, -233, -394, -192, -265, -62, -327, -72, -111, 330, -157, 162, -88, -51, -110, -232, -125, -76, -78, 207, -631, -137, 292, 11, 55, 155, 296, -190, 34, 76, -16, -6, -46, 79, 121, -57, 8, -15, 135, -54, -6, 136, 26, 46, 62, 62, -25, 8, -40, -57, -33, -99, 25, 59, 41, 22, -127, -3, -19, -9, -61, 31, 53, -33, -8, 62, -687, 532, -146, 316, 185, -10, -454, 363, 52, -29, 230, 164, -186, -1, 391, + 131, -172, 278, -148, -118, -80, 91, 4, -48, 40, 121, 108, 111, -283, 179, -234, 325, -198, 323, 106, 33, -312, -318, -104, -104, 376, 108, 301, 128, -265, 12, -59, 130, 9, 115, -31, -177, -103, 192, 476, 343, 40, 119, -32, -64, 245, 206, -85, 302, 425, 593, 14, -337, -407, 144, 76, -15, 105, 4, -129, -13, 359, -63, -154, 639, 163, -106, 189, 7, -5, -18, -99, -12, 196, 98, -60, -91, 138, 112, -6, 261, 77, 51, 31, 119, 47, 111, 78, 41, 25, 140, 79, 76, 24, 139, -14, + 56, 85, 59, -7, 155, 178, 57, -23, 184, 19, -80, -9, 136, 13, -7, -22, -19, 13, 39, 92, 321, -468, 395, 163, -319, 750, 113, -382, 89, 210, 20, 152, 538, -513, 336, -207, 298, -112, 64, -475, 81, -50, 192, -181, 27, 38, 5, -278, 269, 30, -29, 128, -53, 126, -66, 380, 299, 376, 373, -58, 130, 164, 17, -194, 264, -310, 96, 313, -185, 167, -346, 113, -30, -80, -30, 29, 107, 106, 364, -236, -12, 245, 519, -457, 117, -110, 157, -81, 758, -463, 166, -256, -145, 72, 78, 46, + -665, -346, 548, 305, -62, -292, -345, -131, 121, -364, -203, 186, 100, -3, -13, -253, 46, -70, -100, 124, -66, -74, -33, -220, 74, -53, -80, -76, 100, -103, 122, -13, -36, 50, 41, 169, -171, -29, -131, -20, 77, 69, 208, -62, 112, 34, 350, -462, -99, 651, -197, -14, 349, 81, 215, -488, 466, 30, 34, -124, -294, -41, -46, -315, -190, 347, -112, 66, -172, -766, 258, 34, -237, 145, 295, -29, 32, -61, 73, 200, 63, 322, 220, 50, 281, -228, -225, -320, 119, 184, 53, -507, 142, -433, 625, -149, + 221, 534, -212, 339, 84, 369, 148, -179, -549, -394, -308, -43, -323, -65, -282, -183, 550, 119, -236, -209, 110, 204, -49, 80, -1005, 403, 67, -322, -397, -103, -664, 71, 328, 36, -286, 176, 147, -234, 115, 69, -60, 7, -151, 39, 50, 38, -197, -107, 79, -123, 27, -74, -49, 47, 163, -209, 71, 162, -196, -183, 23, -168, 37, -112, 114, 63, -196, 109, -129, -83, 132, 31, 300, 93, -2, -19, 22, 217, -621, -761, 456, -375, -436, -126, 286, 591, -393, 29, 280, -88, -125, 150, 97, 444, 147, -432, + -18, -220, -17, -258, -338, 49, 334, -27, 148, -281, 80, 329, 256, 36, 24, 205, 195, 123, 302, -388, 420, 301, 102, -321, 21, 242, -254, 282, -202, 320, -88, 418, -665, 700, 162, 659, 40, -143, -49, 236, 13, -556, 19, -42, -576, 178, 405, -548, 451, -483, 147, 182, 97, -604, -293, -298, 55, 41, -354, -518, 97, -456, 305, -222, -122, 152, -286, -221, -293, -123, -165, 5, -235, -176, -215, -316, -156, -69, -75, -83, -96, -64, -153, -166, 103, -199, -111, -53, 146, -77, 0, -253, -185, -85, -10, -60, + -218, -33, -23, 169, 106, -144, -137, 25, -75, 124, -77, 65, -137, -351, 533, 108, 351, 340, 95, -262, 58, 899, -618, 149, -109, -338, 20, 121, 145, -4, 2, -177, -260, -404, -204, 305, -256, -406, 234, -145, 90, -54, 182, -173, 382, -138, 42, -9, 41, 353, 120, -164, 188, -150, 289, -174, 119, -413, -302, -221, 72, -206, -361, 152, 268, 79, -192, 124, 189, 215, 578, 797, 1083, -109, 173, 263, 153, 148, 174, -220, 430, -59, 562, 695, 509, 208, 286, 98, 970, 282, -177, -151, -138, -52, -62, 55, + -77, -178, 162, -283, 85, -61, 90, -138, -114, -84, 220, -209, -205, -10, 91, -102, -264, -82, 16, -120, 142, 274, -152, -11, 57, -20, 91, 163, -72, -177, -30, 98, -89, 250, 290, 185, -81, -186, -24, 292, 34, 2, 128, 50, -1, -37, 72, 83, -190, -8, 1081, 866, -378, -174, -450, 259, 126, 529, -93, -230, -104, -345, 77, 12, 500, -188, 187, -674, 371, -54, 261, -5, 237, 39, -383, -199, -328, -251, 277, 665, 291, -81, -206, -11, -55, 165, 226, -428, -8, -151, -142, -465, -357, -753, 15, -40, + 272, -227, 482, -368, -160, 962, 955, -662, 148, 551, -320, -155, 286, -109, -402, 1068, -265, -1630, 543, -24, -837, 639, 687, -246, 482, 607, -287, 18, 389, -423, 178, 333, -599, -86, -196, 29, -218, 0, 86, -257, 207, -298, -133, 139, 292, -171, 19, 54, -41, 94, -209, 308, -156, 325, 322, -12, 20, 212, -155, 42, -5, 267, -200, 159, 54, -640, 126, -85, -115, 29, -14, 62, -354, 43, -89, -322, 59, 537, -507, 162, 303, -444, 3, 232, -407, -203, 74, 187, 357, 172, -294, -57, 264, -309, 304, -156, + -395, 349, 179, 172, -101, -102, -142, -23, 293, -617, 301, -17, 507, -327, -2, -405, 171, -656, 69, 25, -263, -201, 101, -444, -762, 455, -46, 134, -453, 271, -76, 291, 313, 153, -321, 257, -156, -74, -591, 80, -422, -462, -672, -279, 103, 181, -694, -345, 33, -251, -930, -739, -759, -161, -456, 395, 559, 150, -563, -653, -760, -75, -60, 408, -369, -635, -314, -424, 138, 3, 145, 70, -212, 40, 149, -168, -74, -143, -92, -105, -207, -15, 244, 3, 67, 67, -49, 182, -128, 285, 254, -108, -239, -17, -96, -136, + -153, -136, 203, 4, 191, -211, -229, -46, 102, -362, 55, 30, -267, 51, -221, -472, 281, -117, 30, -83, 43, -244, -68, -473, 822, 913, -216, 617, -171, -237, -236, 601, -518, -116, -245, 952, 40, 351, 128, -85, 477, 269, 391, 126, -56, -161, 375, -57, -359, 458, -8, 402, -439, 315, 114, -446, -344, 829, 539, -45, 300, 252, -519, -338, 178, 138, 371, 52, 85, 149, 452, 190, 119, -439, 1237, 834, 100, -548, 280, -180, 158, -120, 268, -175, 46, 686, -466, -220, -628, 184, -168, -104, 583, 189, 78, 57, + -235, -465, 346, 7, 11, 375, 368, -22, -265, -304, 602, -55, -32, -109, 453, -29, -311, 214, 170, 289, 131, 107, 419, -77, -149, 153, -8, 25, 39, 199, -106, 7, -135, 54, 202, -85, 49, 260, -88, 62, 184, 21, -49, -378, 252, -208, 166, -250, -56, 114, -163, -55, 369, 278, 31, -48, 345, 78, 164, 163, 77, -52, 147, -296, -642, 1670, -1873, -216, -986, 1212, 328, 214, -470, 114, -383, 1086, -190, -69, 113, -53, -422, 163, 249, 329, -730, -384, -375, 151, -219, -197, -21, -6, 483, -247, 27, 363, + -42, -483, 64, 383, -42, -762, 573, 69, 14, -1, -318, 252, -1407, -985, -134, -353, 68, 108, -657, 1039, -407, 1430, -198, -500, 494, 82, 441, 662, 214, -680, -184, 764, 1779, 59, -449, 739, 69, 872, 146, 1181, -300, -48, -26, 275, 47, 453, 836, 48, -170, -149, 271, -226, -91, 541, 402, 58, -94, -205, -222, -142, -179, 389, -234, -170, 201, 68, -67, 173, 207, -113, 179, 275, -136, 16, -385, 494, 6, 396, 35, -420, 12, 40, 118, 41, 9, -361, -321, -24, -183, 259, 107, -127, -2, 203, 53, -125, + 22, 146, 12, -78, 68, 2438, 753, 265, -83, -268, -357, 793, 726, -849, 495, 375, 80, -260, -455, -1157, -439, 363, 112, -376, 687, -231, 274, 273, -176, -168, 717, 14, -284, 447, -403, 884, -444, -270, -57, 342, 176, 895, -285, -544, -200, 233, 53, 477, 124, 37, -205, 383, 1682, 713, -638, 537, -339, -519, 407, -25, 112, -40, 291, -454, -690, -1810, -485, 637, -249, -626, 260, -151, 259, -730, -644, -306, 261, 281, 851, 145, -72, -682, -966, -126, -441, 76, 333, -463, -479, -109, -593, -979, -335, -266, -531, -129, + 276, -279, -155, -320, -85, -700, -453, -449, 0, 56, 238, -396, 205, -531, 9, -316, -53, 153, -175, 236, -700, -145, 220, 89, 201, -96, -201, 326, -81, -79, 220, -352, -287, -60, 49, -466, -232, -258, -155, -49, -22, 28, -222, 10, -381, 543, -433, 1493, 1254, 588, -341, -523, 897, 770, -1005, -202, -615, 867, -144, -1225, -533, 440, 770, -1417, 572, -980, 367, -577, -147, 685, -226, 107, 440, 912, -591, -996, 227, -76, 113, 935, 239, 698, -878, -160, 287, -785, 1290, -148, 775, -105, -176, 635, 637, -361, 1421, -330, + -612, 686, 1222, 71, 226, 61, 542, -570, 436, 1848, 855, -56, 812, 995, -730, -2257, 178, 1365, 1547, 423, -142, -664, 807, 1704, 801, 417, -1661, 317, -938, -586, -1463, 1251, 279, -429, -576, 441, -414, 239, 176, 223, -536, -114, -58, 292, -178, 248, 225, -247, -150, 343, 26, 368, -145, 138, -229, 132, 705, 132, 143, -87, -731, -375, -446, 246, 1267, 1181, 1082, -83, -761, -735, -334, 497, 571, -41, -242, -399, -563, 153, 343, 270, 272, 198, 24, 1032, -2055, 1562, 321, -945, 9, 871, -587, 20, 483, -616, 49, -554, + -352, 575, -502, -289, -1050, 448, 1014, 280, -460, -783, -127, 577, 313, -670, -20, 791, -108, 47, -275, -203, 1874, -908, -232, -217, 313, 864, -929, -529, 1233, -155, -81, -1488, -1225, 502, 829, 444, -1516, 1028, -30, -242, 215, -1093, -302, -152, -538, 961, -762, -434, -819, -484, -1079, 312, -1686, -486, 196, -852, 206, 453, 204, -26, -303, -621, 892, -209, -87, -336, 539, 1067, 162, -1478, 129, -667, 97, 119, -267, 85, -438, -165, -37, -349, 6, -113, 257, 210, -80, 96, 479, -235, -171, 470, -355, 305, -172, -185, 37, -229, + -100, 277, -579, 154, 138, 194, 417, -314, 52, 288, 115, -129, -271, -78, -63, -16, -278, 61, -46, -1177, 718, -19, 929, -188, 961, 123, -120, 431, 1115, 535, 288, 225, 145, 440, -558, -43, -418, -439, 687, 428, 264, -195, -169, -79, 718, 111, -314, -515, -21, -120, 540, 84, 452, 847, -233, -2139, 143, 1742, 184, -1275, -163, 494, 388, 686, 624, -49, -402, -412, 546, -329, 63, 192, -2222, -384, -426, 355, 1748, -30, 141, -403, 120, 362, 734, 385, -432, -226, -1079, -63, 743, -325, -154, 276, 755, 614, -163, -766, + 5, 283, 86, -508, 63, 64, -39, -438, -571, 498, 407, -18, -89, -428, 341, 143, 77, 135, 109, 200, 13, -475, 267, 16, -30, 30, 127, 63, -65, 2, 18, -154, -93, -657, 104, 470, -328, 170, -534, 304, 139, -76, -148, -50, -53, 67, -118, 612, -59, -3499, -6591, -2643, -4459, -5127, 3204, 1126, 2946, 8839, 5790, 4674, 7001, 3500, 236, 2775, 699, -2788, -1955, -2220, -5111, -4150, -1788, -3715, -4093, -1688, -2515, -4225, -2178, 338, -2652, -2427, 548, -520, -2420, 2730, 1785, -2035, 2028, 3071, 472, 1759, 6169, 2933, 1856, 7255, 5088, 2947, + 7152, 9582, 5936, 8591, 11126, 7949, 5275, 6947, 3660, -3532, -2322, -4666, -10873, -10905, -11044, -16677, -16466, -16547, -17239, -16279, -15835, -12468, -9978, -7547, -3105, 922, 2431, 6172, 10723, 9083, 12176, 17308, 14551, 13585, 16541, 12253, 6292, 6813, 6396, 2405, 1717, 3434, 1278, -292, 1157, 415, -2371, -2121, -1273, -4253, -4884, -2127, -3714, -5121, -2107, -1353, -2785, -31, 914, -917, -130, -676, -3906, -5634, -6313, -7886, -9281, -8331, -7611, -7089, -5319, -3388, -2411, -439, 1883, 2924, 4242, 6987, 8497, 9912, 10626, 10065, 8967, 6852, 4677, 2600, 354, -452, -761, -1230, -1382, -1409, -1626, -1722, -1572, -1431, + -1583, -1698, -1621, -1653, -1760, -1639, -1479, -1133, -683, -404, -102, 361, 611, 781, 1038 }, + {-212, -20, 198, -177, 68, -299, 3, -108, 120, -101, 27, -69, -125, -32, -12, 91, 113, -108, -188, 98, 33, 69, 41, 78, -109, -82, 19, -21, 98, 70, -83, -18, 74, 138, 85, 1, -109, 58, -19, -58, 76, 33, -100, -84, -68, 56, -98, -53, 82, 31, -3, -103, 37, -88, -227, 22, -78, -147, 67, -42, -42, -51, 3, 111, 67, 37, 51, 84, -171, 89, -68, -66, -38, 56, 11, 120, 174, 68, 13, 19, -3, 111, -47, -5, 54, 3, -46, -48, 16, -2, -52, -27, 16, -3, -7, -21, + -26, 17, 11, 18, -8, 6, -6, -49, -19, 22, 39, -22, -26, 8, 454, -38, 83, 100, -46, 47, 181, -141, -25, 52, -70, -13, 133, -43, -30, -9, 52, -25, 64, -45, -44, -20, -103, -175, -33, -56, -23, 104, -186, 229, 2, 4, 8, 44, -5, -88, 14, 71, 173, 9, -1, -26, -58, 115, 55, -42, 64, -114, 20, 37, -86, -297, -93, -7, -17, -14, -26, -38, -21, -56, 73, 219, 125, 10, 0, -6, 77, -45, -199, -7, -104, 66, -118, 67, -288, -2, -40, 98, 158, -24, -37, 24, + 0, 85, 32, 14, 115, -84, -10, 15, 42, 0, 42, 2, 27, 12, -5, 9, -9, -1, 25, 36, 5, -10, -13, 5, -5, 21, 16, 10, -6, 4, 15, -399, -385, -145, -57, -55, 0, 97, 23, 79, -181, 89, 113, 109, 128, -99, 28, 301, -186, -7, -132, -192, -23, -14, 167, -81, 18, -143, 92, 57, 72, -321, 50, -59, -113, -30, -2, -239, -154, -133, -11, 199, 69, 66, 96, -89, 56, -80, 171, 262, -25, -24, 75, 18, 68, 147, -69, 152, -24, -5, 90, 123, -47, -178, -164, 63, + -22, -31, -72, 81, -137, 51, 103, 173, -101, 166, 109, 54, 83, 20, -28, -112, 80, -53, -104, -132, 55, -43, 80, 14, -51, -62, -31, 26, -32, -12, -42, -19, -2, 41, 22, -1, 24, 80, -8, 0, 47, -25, 13, -18, -13, 23, 34, 34, 22, -1, -10, 25, 12, 55, 66, -52, -5, 29, -438, 188, -197, 350, -328, 256, 130, -137, -171, -96, 66, 59, -93, 206, -75, -199, -41, 213, 146, -218, 34, -28, -228, -95, -147, -35, -174, -47, -73, -240, -86, 120, 173, -35, -206, -43, 145, -46, + 4, 9, 3, -205, -7, -26, -52, -11, 35, -147, 83, -158, -4, -2, 3, 115, 2, -55, 47, 79, 191, 86, 43, -57, -119, -113, -47, -123, -88, 71, 125, -93, -155, -107, 49, 26, -146, -51, 18, -123, -57, 16, 37, 49, -57, -68, -93, 3, -12, -36, 28, -31, -11, -71, -16, -25, 61, 30, -26, 30, -4, 9, -31, 3, -18, -2, -26, -48, 33, -4, -45, -29, -5, -42, -48, 536, 214, -34, 123, -84, 301, 129, 541, 12, -520, 136, 318, -186, 57, 220, -166, 156, -134, -27, -166, -157, + -49, 47, -16, 75, -70, 234, -137, 68, 44, 153, -274, -141, -107, -30, -96, 29, 170, 123, 269, -36, -19, -150, -49, 172, -163, 142, -153, -62, 247, 357, 255, 48, -186, 134, 98, -96, 207, -133, 42, 36, -376, 0, -356, -140, 58, -91, -170, -142, 31, 249, 62, -97, -124, -106, 26, 43, 118, -182, -167, 15, -32, 15, -47, -24, -29, -12, 56, 18, 26, -20, -38, -34, 11, 102, 33, 75, 23, -108, 85, 42, 16, 21, 49, -7, 42, 13, -1, -30, -26, -44, 14, 51, -9, -18, -26, -154, + -18, -15, 5, -20, 331, 671, -292, -217, -59, -79, 234, -223, -407, -141, 29, -100, 117, 56, 203, 85, -81, 292, 274, -126, 20, -188, -32, 11, -116, -22, 204, 293, 12, 48, 121, 77, 47, 20, -111, -210, 24, -303, 11, 70, -96, 119, -77, -167, -13, 163, 72, -73, 495, -1, 160, -294, -66, 202, -94, -218, 128, -255, -229, 52, 280, -229, -129, -68, 12, -104, -103, 378, 221, -34, 21, -178, -128, -72, 114, 150, 13, 120, 78, -24, 111, -102, 378, 214, 42, 12, 35, -64, -24, -63, -67, -2, + -2, -61, 33, -92, -28, 72, -26, 74, 42, 70, 3, 48, 55, 50, 9, 83, 27, 12, -60, 6, -22, 0, 4, 30, -4, 28, -57, -2, 265, -477, -65, -358, -205, -325, -83, -51, -50, -125, 144, -458, 234, -157, 139, 60, 190, 10, 78, -185, -79, 85, -184, -134, 224, 61, 101, 89, -23, 60, 333, -120, 32, -151, 268, -163, -597, 184, 94, 251, 136, 346, -234, -93, 209, -87, -200, -95, 108, -291, 287, -11, 191, -245, -108, -89, -266, -54, -211, -97, 22, 305, 246, -28, -375, -214, -69, 297, + 245, 179, 165, -106, -434, -111, -13, 101, -137, -43, 222, -43, 262, 3, 182, 69, 9, -67, -7, 99, 26, -46, 9, -120, -21, -7, -161, -96, -103, -50, 31, -65, 26, -87, -12, -25, -47, 70, 34, -15, -110, -43, 43, 71, 1, -106, -56, 24, 55, 15, 26, 8, -628, -758, -429, 306, 22, -144, -163, -244, -28, 79, -424, -43, 263, -166, -118, 294, 76, -199, 72, -193, 438, -145, -107, 140, -232, -147, -137, 72, -162, -63, 71, 50, -520, 228, 223, -152, 398, 151, 36, 382, 217, 66, 52, 413, + -44, -74, -30, 253, 141, -380, 144, 115, -5, -203, -610, 266, -42, -152, -383, -218, 232, -52, -113, -256, -496, 48, -70, -265, -112, -470, -77, -107, -90, -22, 166, 357, 152, -122, -258, 98, 16, 148, 93, -60, 108, 38, -13, -141, 11, -228, -15, -52, 36, -90, 106, 61, -26, -21, -23, 13, -52, -15, 61, -26, -23, 115, -47, -32, 93, -74, 56, -192, -124, -72, -101, -12, -100, -135, -100, -30, -21, 43, -5, -83, 47, -646, 520, 29, 266, -47, -22, 49, 287, 29, -36, -390, 139, -43, -302, 79, + -197, -151, 560, 160, 173, -121, 201, 243, 234, -135, 204, 106, -236, 154, -229, -79, 147, 70, -23, -127, -119, 373, -108, -163, -104, 77, 81, -177, -300, -21, -322, -37, -291, -109, -69, 58, -148, -251, 318, -130, -350, 225, 374, -180, -119, 190, 137, 372, 240, 39, -3, -379, 92, 367, 294, -258, 280, 305, -203, -564, -182, -505, 85, 293, 147, 37, -152, -203, -23, 29, 88, -44, 166, -72, -58, 67, 176, -256, -34, -30, -79, 5, 71, -12, -8, -38, -5, -38, 14, 0, -6, 28, 92, -76, -46, 56, + 59, 197, -19, 84, 76, -79, 69, 35, -72, 23, 28, 27, 78, 173, 36, -52, 113, -31, -63, 14, 126, -1028, 496, 142, -46, 697, -39, 354, -309, -71, 57, 7, 400, 255, -538, 340, 28, 205, -484, -17, 283, -475, 599, 164, -4, -211, 38, 261, -426, 42, 111, 78, -262, -95, 252, 144, -25, 39, -172, -295, 125, -500, -19, 722, 705, -223, 89, -29, 203, 508, 45, 244, 82, -263, -18, -49, -760, -342, 474, 24, 147, -182, -45, 170, 230, -19, 589, 10, 460, 59, 99, 62, -298, -375, 466, 109, + -240, 339, -274, 27, 287, 48, -71, 135, -121, -116, 144, 197, 16, -261, -124, -281, -99, 72, 93, 47, -108, -50, -202, 148, -1, -81, -35, 63, 36, 184, 165, 107, 108, 37, 132, -86, 62, 71, 68, -75, 133, 70, -17, -22, -32, -31, 345, -751, 302, 473, -65, 141, 213, -115, -73, 292, -110, 443, -422, 231, 548, -587, 24, -279, 346, 146, 287, -297, -232, -3, 740, 9, 374, -166, 23, -51, -66, -328, -13, -92, 151, -147, -213, -179, -14, -62, 334, 58, -185, -168, -171, -62, -81, 546, 24, 275, + 19, -131, -120, 454, 339, -131, -428, 242, 166, -942, 54, 532, 518, 121, 412, -568, 932, 82, 178, 185, 444, -34, -399, -121, -472, 537, -238, -158, 468, -14, -185, -142, -353, 334, -575, -84, 55, -14, 81, -118, -247, -156, 76, 64, -117, 31, -112, -119, -89, 106, 54, -135, 126, 27, -167, 76, -31, -57, -128, -143, 26, 71, 296, -129, 175, 23, -61, -20, -36, -77, 44, -7, -90, -28, -63, 25, 59, 284, -561, -449, 394, 331, 814, -293, -220, -150, 150, -351, -46, 132, -28, 436, 279, -356, 28, 99, + 250, -405, 417, -11, 183, -75, -196, -425, 144, -77, -182, 80, -262, -255, -60, 128, 506, -764, -464, -414, -465, -135, 525, -317, -19, 517, -81, -239, -456, -126, -199, -939, -730, -209, 160, -94, 159, -212, -154, 439, 263, -472, -246, -527, -212, 38, 205, -98, 52, -451, -362, -331, -14, 72, 24, -427, 9, 564, 241, 644, -516, 789, 66, -498, -86, 18, 135, -87, 212, -306, 139, -271, 122, 178, -62, 401, -38, 91, -114, -151, -87, 7, 88, -160, -32, 48, -39, 152, -51, -83, -266, 111, 13, 133, 54, -92, + -251, 75, -319, 76, -86, -17, 30, -72, 21, 46, 215, 82, -99, -400, 77, -44, 922, 101, 444, -385, -262, -94, -435, -276, -420, -195, -272, 501, 126, 127, 516, -14, -30, 233, 464, 726, 530, -109, -197, -835, 230, 262, 102, -520, 602, 241, 353, -98, 33, 343, 752, 734, 422, 89, 782, 21, -234, 255, 474, 387, 704, 373, 15, 86, -426, 185, -1063, -181, -107, 236, 833, 470, 122, 607, -441, -398, 85, -1029, -247, 44, 197, 240, 271, -60, 451, 58, 233, 837, -516, -266, -144, 161, -100, -787, -151, 539, + -41, 683, -368, 20, 280, -65, 77, -283, -141, -219, -150, -243, -204, 55, 39, -490, -231, -276, -77, 92, 146, -218, -12, 67, -350, 53, -143, -225, -122, 19, 81, -154, -43, -236, -23, -63, -82, -172, -259, 65, 80, -138, -102, -101, -83, 47, 163, 48, 48, -709, -222, 131, 539, 989, -395, 19, 165, -180, 917, 164, -450, 804, -164, -268, 576, -520, -303, 36, 52, 73, 378, 203, 307, -92, 164, 461, 30, 315, 59, 13, 510, -662, -239, -224, 444, -337, -86, -198, 440, -185, 977, 714, -663, 327, -797, 116, + 290, 156, 174, -1016, -196, -980, 132, 82, 121, -154, -176, 470, -845, 292, -365, -1593, -595, -521, 264, -231, 244, 799, 853, 483, 450, 417, 123, -634, 668, 2, -736, -586, -925, -1226, -631, -123, 983, 354, 62, 377, -298, -6, 190, 158, -77, 144, 48, 100, 43, -303, 246, 163, 122, 49, -157, 87, -234, -84, -365, 306, 233, -50, 36, 244, 390, -174, -376, -114, 310, -68, -223, 329, -26, -191, 229, 91, 17, -56, -6, -162, 113, -103, -44, 236, -1277, -600, -452, 221, -978, 333, -590, 809, -973, -1230, -276, -188, + 943, 454, 413, -257, 99, -603, -487, 98, 188, -773, -720, -508, -76, 371, 263, -546, -686, -403, -410, -925, -540, 392, -267, -18, -138, 285, 459, -136, -1381, 566, 1133, 415, -37, -1386, -340, 588, -183, 1524, -175, -1249, 193, -220, 91, 23, -259, 320, 400, -1316, -360, 60, 451, -254, -676, 580, 48, -455, -1312, -1521, -788, -108, 101, 1198, 1698, 869, 660, 281, -1001, 350, -14, -530, -158, -1643, -353, -22, 4, 46, 703, 255, 204, -304, -102, 606, -429, -18, -34, 108, -321, -527, -584, 244, -277, -106, 330, 0, 47, -451, + 141, 130, 69, -373, -190, -250, -387, 39, -227, 397, 153, -290, 46, -115, 275, -396, -58, -29, 194, 169, 86, 207, -11, 104, 2294, 2107, -891, 1093, 968, -273, -165, -504, -274, -593, -418, 1750, -97, 1019, 11, 49, 12, -691, 163, 143, -1520, 226, 365, -799, -169, -246, -111, 225, -48, 47, 665, 271, -328, 207, 1062, 19, 488, -25, 397, -587, -713, -396, -1307, 350, 142, -578, -1588, -1034, -1484, 1080, -772, 170, 263, 247, 201, 1152, -1111, 8, -625, 1219, -2734, 562, 206, 876, 790, 6, -257, -416, -126, -791, 578, 1612, + -128, 335, 1011, -707, 398, 498, -900, -617, -1664, 1376, -272, -1206, 805, -200, 524, -34, 453, 81, -361, 571, 538, 91, 305, 520, 301, -346, -156, -337, -157, 439, 828, -34, -162, -32, 528, -844, 477, -227, 1121, 226, -680, -135, 492, -261, -361, -262, -213, -258, 265, 196, 711, -602, 26, -69, 383, 27, -64, 235, 272, 220, 455, 58, 523, -796, -755, 933, -1901, 1310, -784, -548, -345, 119, -551, -429, 597, -183, -1301, 449, -80, 230, -293, 1157, -944, 40, 480, -328, 364, -770, 64, -662, -335, 720, 93, 289, -409, 696, + -200, -325, 268, -426, -354, -228, -234, -719, -963, -268, 536, 9, -300, -962, 39, -760, -49, 307, -751, -185, 556, 562, 410, -933, -440, 643, 211, -18, 523, -3061, -706, -341, -1389, 137, 384, -81, 259, 658, -377, -651, 168, -591, -177, 639, 1015, -383, -1219, -736, 82, -651, 105, -504, -474, 129, -975, 13, -607, -186, -331, 139, 251, -95, -602, 136, -37, -380, 478, -18, -443, -151, -113, -166, -306, 171, -279, 235, 326, -123, 42, -184, -418, -594, 112, 84, 283, -687, 151, 2, -440, 350, -178, 253, 571, -1253, 263, 185, + 374, -201, -119, 426, 24, 2053, -264, -572, 75, -232, 1016, 188, -89, 965, 979, 319, 377, 535, -1214, -674, 1002, -142, -997, -508, -454, 681, 364, -370, -1438, 441, 222, 185, 233, -178, 143, -1081, 959, 663, 352, -544, -460, -8, 480, -111, 499, 213, -1138, -511, 178, -1150, 66, 212, -1008, -1424, -200, 421, -825, -1727, -755, -457, 1115, -685, 1259, -267, 59, 531, 73, -1934, -129, 73, 900, -1723, -2371, 164, -155, -1519, 853, 395, -57, -12, 1397, -2006, 1640, 339, 220, 657, -718, -659, -124, 303, -408, -37, 842, -720, -570, 736, + -419, -216, 314, 198, -832, 418, -276, -83, 299, 283, -886, -151, -688, 381, 543, 29, -1141, 804, -193, -25, 494, -129, -411, -82, 651, -980, 671, 30, -68, 238, 134, -616, 287, -9, 34, -802, 553, -527, 611, 85, -722, 55, 98, -212, 107, 966, 379, 2272, -950, -991, -410, -35, 2159, -294, 1789, -1248, -489, 761, -1360, -444, -1280, 217, 1307, -1787, -654, -147, 546, -9, 202, 503, -124, -1129, -1046, 60, 744, 1997, -440, 547, -570, 990, 36, 122, -273, -1168, 41, 1092, -184, -56, -402, -1018, 1354, 523, 904, 1215, -57, 79, + 752, -1920, 669, -965, 2285, -207, 228, 351, -662, -663, 233, -962, 1451, -838, -1063, -1071, 1518, 522, 882, -187, 881, 898, -904, -254, -838, -435, 1583, 1127, 152, 315, -2385, 1648, 2155, 257, -168, -399, -1276, 1865, -102, 135, -359, 63, -803, 1746, -409, 856, 142, -293, -94, 1684, -919, 835, 283, -702, 106, -219, 470, 143, 686, -273, 80, 137, 2, 681, 1159, -344, -49, 142, 641, 191, -873, -582, 1256, 253, 622, -1213, -1459, 1370, 913, 435, -93, -1125, -12, 201, -1694, 1159, -1205, 146, -555, 447, -47, 638, -102, -552, 951, -334, + -133, 146, -399, -347, 1098, -259, -151, -129, -56, 503, -384, 118, -281, 251, -245, -187, -588, 860, -531, 285, 138, 596, -669, 149, -273, 676, 89, 53, 536, 159, -887, -132, -152, 246, 389, 324, -806, 345, -609, 430, -347, 91, -199, 425, -166, 122, -901, 212, 439, -414, 411, 55, 152, 254, -363, 622, 247, -36, -195, 302, -189, 565, -473, -143, -450, 585, -579, 531, -482, 646, -549, 338, -541, 474, -35, 48, -155, 24, -92, -85, -165, 281, 113, -40, 95, -88, -150, 282, 46, 106, -181, 10, 287, -329, -77, 189, + 7, -99, -208, 513, -160, -261, 137, 45, -78, 53, -26, 48, -84, 72, -148, 250, -206, 289, 131, -706, 1425, 118, 179, -571, -421, -906, 607, -255, -186, -394, -16, -352, -44, -47, 159, 177, -29, -43, -258, 239, 224, -214, 100, -486, 192, 93, -86, -76, -162, 153, 33, -346, -94, -102, -287, 469, 48, -301, 45, -119, 409, -143, -192, 78, -245, 477, 13, -266, 75, -109, 233, -303, -61, 98, -110, 209, -120, 60, 95, -273, 37, 269, -414, -28, 125, -385, 698, -640, 318, 114, -366, 721, -492, 115, 92, -307, + 238, -126, -236, 229, -281, 181, -130, -96, 207, -174, 66, -71, -3, 39, -95, 43, -6, -93, 196, -168, 146, 4, -138, 133, -243, -25, 64, -41, -34, 33, -126, 153, -79, -56, 16, 15, -99, -16, -57, 52, 77, -112, 96, -107, -21, 101, -77, 333, -1526, -3524, 925, 3263, 2759, 3703, -1825, -2366, -3558, -3637, 251, 2713, 2995, 3281, 1092, -714, -2603, -4309, -2360, 1096, 1698, 2873, 2178, 595, -385, -907, -2156, -1397, -1329, -243, 1137, 1742, 917, 1163, 589, -655, -102, -1401, -1951, -333, -455, 345, 1843, 1062, 916, 271, -689, -710, + -611, -1011, -264, 45, 434, 529, 881, 252, -30, -444, -818, -70, 296, 303, 517, -131, -411, -197, -411, -323, 89, 233, 663, 562, 537, 32, -287, -1075, -999, -407, 65, 832, 892, 369, 379, -41, -717, -439, -51, -167, 39, 76, 173, 145, -92, -234, 139, 217, 178, 185, -16, -134, -84, -364, -150, -201, -343, 204, 499, 583, 193, 211, -113, -135, -520, -772, -298, 89, 242, 301, 634, 590, 286, -233, -496, -559, -524, -387, -26, 473, 729, 579, 167, -274, -330, -327, -190, -124, -143, 141, 325, 239, 52, -38, -24, -78, + -88, -123, -59, 64, 54, 36, 39, 35, 25, -46, -63, -25, 10, 23, 12 } + }, + { + {-169, -149, 185, -38, 148, 43, 220, -51, -114, -79, 135, 4, -49, -13, 152, -41, 28, 53, -102, -78, -33, 28, -106, 27, 21, -123, -40, -74, 10, -54, 20, 200, 103, -59, 9, -95, 73, -26, 118, -246, -27, 38, -88, 16, 119, 91, -111, -82, -89, -17, -71, -36, -108, 41, -10, -125, -65, -51, -7, 26, -28, -13, 53, 21, -59, 31, 133, -69, -18, -143, -55, -11, 59, -61, 17, 24, 19, 46, -111, -4, -63, 52, -41, -107, -31, -4, -2, -47, -50, 52, -24, -10, 19, 30, 1, -7, + 5, 18, 1, -12, 23, 4, -21, -19, 22, -8, 7, -15, 19, -19, -13, -3, -5, 7, 230, -86, 75, 192, -156, -176, -26, -44, -2, 98, 55, -245, 39, -140, -193, -12, 71, 77, -63, -8, -20, 105, -21, 87, -40, 10, 19, 26, -122, 51, 95, -44, 121, -67, -13, -151, 108, 27, -39, -117, -115, -53, -39, 59, -12, 51, 51, -104, 65, -139, 50, 81, 154, 148, -127, 63, -8, -34, 91, -69, -81, -62, 74, 37, 96, -95, 145, -47, -7, 43, 25, 84, -63, 120, 153, 266, 124, 85, + -156, -29, -102, -74, 97, -13, 120, 49, -9, -24, -20, 69, -51, 55, 66, -51, 32, 24, 8, 39, -24, -7, -51, -282, -303, 35, -25, 72, 67, 200, 91, 96, 49, -98, 38, 253, -169, -19, 8, 203, 122, 28, 90, -16, 70, 94, 208, 115, 117, 63, 50, 102, 37, -145, 89, 120, -42, 87, 115, -40, 37, 144, 53, -34, 52, 147, -7, -1, -29, 41, 138, -40, -77, 40, -47, 73, 87, -102, 22, -66, 6, 42, 116, 95, -243, 0, 119, -62, -101, 14, 19, 120, -9, -259, -113, 84, + -72, 123, -33, 1, 32, 154, 97, 65, -78, 126, -15, 78, 38, 16, 27, 27, -1, -20, 17, -10, -62, -26, -25, -8, -14, 0, -18, -45, 23, 10, -23, 6, 43, 32, 15, -6, -7, -4, -2, 41, -512, 72, 53, 239, -9, 187, 96, 48, -300, 1, -4, -233, 38, 175, 33, -3, -22, -93, -106, 48, 69, -8, 46, 54, 210, 24, 93, 98, -110, 24, -26, -30, -14, 77, -12, -52, -84, -50, 27, -149, -106, 63, -118, 39, -195, -233, -59, 289, -76, -17, 171, 57, 13, 183, -26, 21, + -23, 54, 117, -45, -182, 117, -106, -202, -80, -56, 0, 75, 219, 2, -2, -85, -8, 130, -61, -67, 156, -132, -10, 72, -160, -31, -55, -54, 18, -85, -121, 8, 75, -34, -52, -68, -69, -9, 50, 23, -7, -20, -54, 3, -18, -65, -97, -82, -1, -10, 39, -64, -3, -9, 31, -5, 13, 457, 15, -27, -173, -99, 241, -97, 188, 162, -184, -30, 141, -103, -49, -48, -66, 31, 51, 9, 88, -40, 14, 33, -37, -86, -90, -102, 9, 119, 52, -100, 10, 47, 227, -67, 204, -185, 84, 147, + -96, -59, -188, 89, -1, -132, 132, -164, 185, -10, 261, 60, 29, 63, 109, 58, -83, 129, -23, -137, -214, -58, 92, -107, -69, 84, -119, 236, -226, -1, 152, -129, -50, -237, -17, -93, -51, -71, 207, 81, 22, 9, 179, 18, -14, 143, 118, 107, 221, -47, 23, -62, 63, 73, 16, 22, -36, -1, -51, -26, 6, 20, 36, -17, -6, 71, 34, -26, 138, -7, -33, -56, -35, 51, -45, 5, -4, -47, 23, 15, -12, 35, 38, -36, 39, 221, 390, -114, -170, 45, -69, 108, 356, 2, -82, 113, + 61, 105, 64, -193, 8, -172, 97, 84, 51, 325, -15, 242, -6, -6, 74, -2, 255, 34, 161, -59, 218, -98, 116, 431, -70, -108, 304, 64, 198, -5, -188, 59, -108, 130, -227, -30, -118, 129, -19, 27, 235, -114, -235, 66, -20, -11, 191, 37, 28, -86, -154, -164, -54, -136, -102, 141, -70, -13, -51, 17, 1, 126, 79, -144, -207, -48, 7, 57, -56, -51, 171, 98, 85, 25, -138, -64, 76, 3, -45, 61, -18, 37, -44, 4, -25, -79, -93, -25, -82, 22, -11, 8, 58, -15, -43, 70, + 16, 45, 27, 5, -25, 35, -8, -8, -1, -7, 4, -14, 21, 44, -53, 15, -63, 10, -30, 535, -281, 188, 7, 93, -129, -101, -59, 116, 150, 32, -82, -156, 82, 148, -29, 47, -79, 162, 60, -303, -100, 98, -18, -129, -6, 138, -101, 47, -197, 115, 249, -103, 264, 9, -48, 176, -7, 13, 159, -344, 52, 104, 146, 99, 114, -154, -119, -6, 55, -167, 55, 162, 146, 54, 445, -140, -56, -201, -86, -132, -185, 229, 96, 223, -35, -358, 209, -127, 115, 102, 50, 62, -283, 335, 73, -156, + -271, -170, -170, 24, 139, -127, 11, 85, 73, 0, -59, 14, -6, 53, 56, 60, 42, 40, 21, -99, -88, 4, -32, 32, 40, -46, 64, -16, 24, 53, 23, 41, 12, -105, -7, -2, 37, 27, 13, -24, -28, 56, -16, 138, 24, 59, -642, -540, -498, 111, 102, 42, 22, -36, -39, 13, -85, -181, -126, -317, -140, -154, 189, -243, -108, -138, 41, 3, -63, 71, -21, -252, -5, 232, 30, -225, -199, 87, -81, 194, 137, -213, 210, 332, -278, -285, -152, 105, 264, -188, -194, 100, -112, 21, -25, -24, + -303, 58, 183, -94, 105, -150, -179, -177, -88, -306, 524, -111, -35, 91, 57, 112, 71, 163, 75, 142, 324, -419, 293, -100, -80, -14, -468, -21, 143, 13, 18, 131, 48, -11, 78, -158, 183, -66, -106, 99, -65, -58, 19, 81, -63, -99, 34, 79, 3, -34, -87, -47, 12, -122, -82, -43, 58, -28, 4, 65, 1, -122, -28, -104, -92, -87, -54, -96, 81, -29, 5, 174, -35, -53, -47, 95, 24, -32, -631, 483, 128, 105, -117, 473, -75, 223, -1, 201, -282, 111, 111, 43, -139, 422, -114, 128, + 97, 438, -295, -19, 122, -76, -217, 131, -204, 53, 56, -239, 93, 19, 12, 481, 301, -40, -197, -154, 107, -26, -289, 82, -25, 85, 217, 320, -220, 218, 109, -145, 104, 83, -227, -123, -143, 229, -248, -211, -568, -416, 115, -78, -82, -219, -440, 169, 34, -13, 216, 183, 260, 154, 63, -8, 42, 293, -217, 402, -148, -114, -367, 58, -68, -188, -33, 44, -92, 107, -44, 4, -45, -15, -39, -9, 66, 105, 8, 87, -98, -70, -50, 36, 76, -100, -38, -47, 15, -56, 45, -10, 39, 66, 1, -107, + 150, 144, 60, 1, -65, -4, -34, -16, 170, -763, 706, 507, -207, -175, 191, 2, 17, 337, 239, 10, -50, 136, -78, -49, 95, -151, 190, 130, -158, 205, -22, 55, -15, -336, -19, 245, 254, 100, 109, 136, -156, -198, 86, 153, -6, -76, -173, 72, -50, 216, 255, -28, 294, -153, 327, 177, 395, 29, 58, -113, -161, -30, 303, 494, 30, 377, -162, -361, 49, 137, -315, 329, -108, 117, -695, -299, -4, -167, 135, 230, 484, 101, 4, -236, -420, 109, 19, -352, 145, 77, -254, -72, 62, 279, 7, 85, + 86, 146, 120, -235, 85, -4, -46, 6, -11, -37, 101, 95, -97, -40, 0, 68, -37, 97, 15, 71, 64, -76, 59, 71, 183, 17, 105, 114, 29, 134, 50, 69, 32, 18, 50, 157, -66, -144, 37, 188, -296, 509, -218, 61, 380, 394, -29, -226, -121, -120, 29, -293, -232, 245, 62, 158, 192, 227, -102, 147, -56, 176, 734, 173, -354, 344, 395, 17, -65, 21, -195, -269, -141, 402, 270, 223, 342, 69, -59, -158, -435, 202, 230, 127, -69, -54, -150, 61, 354, 244, -406, 268, -342, 361, 77, 135, + 161, -60, -193, -59, 145, 624, -99, 312, -139, -282, 331, 298, 76, 68, 301, 105, 18, -34, -191, -59, -280, 90, -218, -109, 442, -23, 12, 9, 204, -67, 61, 135, 205, 222, 185, 72, 97, 101, 186, -29, -148, 210, 84, 116, 128, 5, -15, 13, -93, 58, 200, 22, 26, -42, -74, 167, 179, 35, 318, -40, 137, 243, 16, 67, -35, -93, 25, 53, 88, 175, 77, 131, 49, 31, 183, 260, -131, 264, 337, -387, 260, 151, -93, 24, 179, -162, -342, 513, 111, 98, 96, 305, 89, -307, 328, -440, + -514, 46, 62, -284, -93, -840, -595, -448, -151, -461, -227, 175, -414, 290, 267, -338, 436, 232, -85, -44, -226, 10, -403, 884, 259, 138, -441, 107, -136, 586, -118, -15, -535, 523, 35, 205, 170, 305, 173, -118, 175, -260, 264, -96, 156, -417, 945, 144, -438, 238, 276, 216, 322, 275, -426, 339, -8, 274, -215, 81, -548, 230, 239, 69, -131, -414, -27, 283, -367, -50, -43, -2, 112, 85, -83, 159, -9, -78, 126, 97, -115, -93, -240, -15, -223, 134, 38, 22, 176, 271, 172, 128, 86, -96, -37, 3, + -174, -144, -40, -58, 95, 220, 70, 139, -31, -682, 192, -93, -66, 405, -74, -69, 40, 363, -94, 212, -177, -209, -267, -339, 589, 307, 214, -185, -539, -661, 319, 219, -234, 158, -159, 16, 586, 256, -165, 316, -106, 164, -194, 198, -432, -635, -246, -283, -48, 744, -605, 350, 202, 152, -133, 293, 132, -581, -739, -263, -337, 838, 608, -203, -372, -31, -382, -81, 610, 564, 321, -497, 108, -389, 612, 290, -64, 2, 207, -361, 82, 539, 294, -488, 531, -271, 318, 842, 323, -198, -248, 720, 81, -44, -326, 127, + -153, 46, -95, -17, -20, -358, 47, -44, -101, 158, -26, -127, 25, -75, 22, -94, -138, 124, -153, -99, 75, 187, -8, 132, 111, -25, 1, -180, 26, 61, -151, 205, 103, -125, -82, -87, -37, -201, 121, 191, 11, -150, -85, 99, -41, 95, 137, 10, 51, -542, -212, 908, 421, 524, 128, -755, 233, -613, 403, 1136, 404, 713, -321, 206, 331, -34, 86, -291, 74, 447, 24, -119, -403, 222, 167, -411, 215, -156, 315, 449, 477, 575, 58, -446, 121, 272, -5, 783, 69, -900, -564, 256, -229, -1063, 39, 453, + 168, 48, -96, 560, -439, -545, -105, -195, -530, -29, 39, -309, -456, -280, 23, 66, -659, 197, -274, 160, 762, -104, -264, 531, -92, 442, -418, 286, 20, -485, -540, 977, 96, 132, 47, 1, 980, 800, 254, -73, 385, -188, 132, 229, -41, 301, 131, 88, -444, 265, 144, -25, 42, -151, 130, 346, -56, -112, -190, -209, 210, 246, 15, 1, -187, -203, 38, -291, 43, -96, 307, 109, 15, -192, -334, -76, -161, -226, 133, 136, 265, 768, 100, -1052, -476, 653, -941, 535, -891, 72, -142, -1289, -170, 580, 1187, 378, + -172, 288, -455, -153, -1035, -57, -703, -101, -154, -485, -515, -171, 296, -466, 321, 592, -610, 221, 197, 105, -649, -99, -7, -681, 178, 867, -66, -1259, 446, -760, -1942, 548, -803, -998, 54, -457, 139, 343, -191, 511, -427, 446, -352, -868, 5, 621, 596, -1128, 166, -135, -840, -224, -208, 1462, 730, 858, 391, 373, 905, 1301, -297, -616, -673, 118, -835, -257, 432, 703, 99, 64, 609, -141, -346, -470, 367, 417, 409, 96, 469, 195, -288, -64, -279, 429, 69, -50, -481, 146, 385, 42, 7, 377, -301, -201, 208, 21, + -151, -289, -93, 443, -21, -979, -91, -24, -224, -191, -259, -158, 213, 191, 113, -202, 1701, 1839, -1078, -427, 822, -372, 332, -512, 154, -526, -986, 1345, 197, 423, 347, 127, 178, 41, 273, 335, -953, -786, -688, -650, -486, -306, -254, -510, -289, -433, 493, 375, 190, -238, 101, -1009, -506, 275, -917, -84, 448, 793, 117, 154, -338, -592, -698, 563, -75, 557, -1959, 123, -227, 227, 1199, 148, 201, 136, -350, -402, 12, -79, -1098, 237, -402, 988, 67, -1080, -1471, -913, -185, -1033, -1012, -627, 715, -184, -696, -939, 787, -100, + 466, -528, 286, 775, -513, -744, -312, -384, 810, 172, -354, 320, 239, 705, 438, 206, -625, -623, -136, 74, -163, 114, 436, -94, -35, -316, -231, -171, -328, -60, 137, 201, 1025, 70, -255, -79, 139, 322, -17, 508, 214, 1171, 183, -6, 45, 217, -323, -503, 1916, -1110, 728, 1358, -650, 194, 1086, -1371, 56, 156, 670, -1539, 87, 106, 508, -670, 10, 279, -905, 138, -67, -167, 500, -147, -135, 213, -117, -151, 491, -454, 137, -186, 127, -290, -161, -355, 7, 72, 960, 321, 467, -94, 13, 713, -28, -266, 400, 296, + -318, -926, 854, -923, 154, 447, 585, -908, 975, 1566, -853, -1586, 2129, 755, -1048, 489, -1009, -1253, -624, -227, -1310, 1066, -1827, 553, 877, -723, -2445, 2319, -399, -593, 1546, -1533, 797, 1321, -391, -357, 412, 456, -243, 167, 138, 421, -203, -147, 470, 3, 108, -44, 90, 378, 280, -46, -331, 552, 595, -108, -506, -50, 254, 59, 368, 7, 322, 140, 471, 351, 396, -578, 153, -6, 27, 8, -353, -625, 926, -143, -851, 317, 210, 96, -138, -584, -465, 1063, -703, -563, -1122, -517, 664, 515, -301, -375, 353, 882, -381, 665, + 797, -568, -83, 486, -128, -4, -163, 41, -817, 221, -183, 25, 194, -166, 166, -340, -684, -325, -1190, 146, -5, -179, 218, 111, -79, -273, 476, 753, -796, 1158, -133, 153, 166, 1024, 469, 749, -944, -236, -179, 1335, -1249, -428, 608, -47, -1441, 96, -299, -248, 655, 719, 49, -542, 1161, -492, 1939, 24, -903, -2, -158, -1021, 1949, 391, -292, -2312, -1156, 650, -852, -766, 903, -3385, 83, 665, 488, -275, 949, -583, -77, 4, 494, -141, 100, 673, -48, -170, -215, -243, -12, 75, -46, -102, 435, -611, -138, 73, 101, -365, + -620, -157, -191, -88, -53, 120, -687, 53, 518, -324, 396, 305, -300, 19, -221, 87, 145, -320, 898, -437, -405, -520, 434, 589, 359, 1465, -282, 332, -140, -757, 379, -482, -272, 302, 658, -694, 758, 87, -38, 1545, -314, -172, 1158, -741, 1023, 441, -242, 407, 431, 953, 991, 288, -805, 1684, -1690, 57, 1538, -828, 341, -183, -199, -1783, 1211, 320, 538, 567, -371, -888, -668, -542, 85, 1694, 11, 1328, -442, -1023, 56, 381, -840, 1362, 554, 669, 1346, 871, -1440, 549, -2065, -2552, 53, 2149, 1348, 174, -1521, -5434, -999, 1680, + 1921, 2722, -138, -3453, -1948, -1799, 2760, 2109, -380, -1379, -807, -1677, -214, 2158, -210, 505, 360, -354, -782, 1176, -478, 655, 481, -45, -1093, 1499, -591, -284, 434, 389, -812, 13, -255, -307, 103, -30, 600, -1073, 569, -1291, -203, -216, 1533, 44, 416, -936, 489, -353, 678, 809, -392, -933, 336, 240, 787, 220, -1331, 1118, -837, -145, -542, 520, -609, -26, -64, -165, 125, 573, -605, 266, 48, -140, 9, 404, -512, -140, -75, 839, -850, 225, -372, 556, -620, -176, 212, -120, 117, -401, -71, 363, -110, 140, 115, 76, 454, -420, + 285, 328, 405, -57, -941, 121, 112, 383, 350, -68, 94, -158, -427, -73, 196, -80, 571, -465, -154, -927, 277, 100, -146, 207, 181, -13, -479, 149, 468, -91, -68, 184, -189, 350, -215, 59, -440, 208, 84, -70, -120, 255, -121, -185, -265, 277, -11, -140, -59, 275, -108, 121, -152, -93, -14, 9, -2, -152, 17, 4, -127, 130, -120, 360, 58, 48, -499, 140, -9, -200, 227, 422, -305, -70, -10, -221, 336, -57, 49, -222, 117, -48, 43, -142, -758, 1841, 502, 455, -243, -589, -566, 162, 358, 57, -20, -1, + -268, -48, 130, -71, 57, -28, -268, -13, 135, 211, -186, 52, 136, -268, 442, -267, -232, -231, 62, 129, 206, -223, 287, -410, 274, 243, -180, -18, -12, -47, 214, -228, 68, -73, -294, 420, -233, -8, -172, -54, 294, -381, 157, 106, -165, 140, -324, 94, 137, -241, 8, 130, -222, 224, -307, 86, 318, -463, 135, -177, 34, 182, -136, -71, 35, 40, -26, 130, -97, -86, 66, -76, 44, -30, 57, 51, -72, 37, -12, 67, -59, -18, 48, 1, -33, -108, 71, 71, -13, -75, 74, -4, -31, 72, -151, -32, + 90, -112, 164, -100, 11, 266, -74, 191, -106, -12, 215, -150, -53, 276, -1422, -3336, 945, 3266, 2247, 3553, -1978, -2106, -2871, -3325, 72, 2566, 2651, 2768, 544, -914, -1814, -2604, -2207, 172, 1715, 2033, 1830, 438, -505, -315, -1427, -1597, -673, -43, 614, 1347, 658, 489, 675, -337, -801, -131, -1281, -601, 14, 204, 977, 1138, 101, -172, -107, -839, -227, -12, -174, 290, 562, -120, -44, -220, -350, 72, 35, -38, 634, 429, 159, -16, -597, -864, -683, 49, 644, 552, 725, 99, 19, 165, -900, -512, -423, -77, 691, 156, 232, 644, + -371, -541, -126, -92, 200, 232, 73, 129, 57, -332, -344, -84, 0, 247, 358, 118, -50, -78, -102, 90, -100, -422, -66, 100, 196, 421, 103, -87, -202, -346, -75, 35, 112, 197, 247, 194, -99, -299, -315, -275, -31, 137, 152, 406, 418, 204, -90, -513, -543, -252, -190, 191, 503, 372, 160, 1, -40, -63, -146, -241, -230, -96, 35, 97, 148, 209, 192, 73, -60, -142, -161, -136, -76, -3, 45, 77, 97 }, + {-134, -89, 38, -34, -42, -65, 16, 130, -42, 1, 13, 223, -4, 43, -92, -64, -23, -60, -64, -60, -41, -57, -76, 64, 106, -58, 16, 4, -120, 4, -3, -85, 161, -82, 91, 35, -25, -92, -85, 83, -43, -31, -127, -32, -12, -60, 170, -37, -11, 71, -12, -141, -73, -124, -84, 194, -54, 215, -1, -9, -39, 25, 9, -128, -136, 100, 11, 68, -9, 79, 48, -124, -1, 42, 67, 0, 56, 103, -137, 37, 35, -68, 0, 32, 98, 65, -69, -20, -4, 23, 31, 24, 26, -18, 13, -37, + -24, 0, 50, 22, -2, -3, -34, 20, -3, -11, -3, 18, 7, 13, 32, -10, 14, 39, 295, -22, -35, -74, -160, -197, -181, 21, 163, 57, 217, 75, -97, 27, -256, -217, 102, -76, 143, -12, -113, -56, 284, 64, 120, -5, 92, -41, -34, 57, -38, -123, -8, 46, -14, -7, 181, 112, -193, 5, -122, 205, 121, 9, -72, -74, 95, 53, 153, -141, 243, 297, -81, 290, 0, 152, 95, -53, 51, 232, -26, -155, 135, 44, -1, -17, -27, 11, 136, -86, 50, 37, 72, -111, 128, 30, -10, 41, + 19, 13, -5, 30, 76, -52, 31, 21, 32, -47, 4, -77, 14, 37, -44, -28, 11, 22, 26, 8, 24, 1, 1, -255, -200, 62, -113, 80, -141, -201, -186, 25, -139, 126, 92, -178, -37, 72, 17, 88, -53, 91, 113, -158, 50, 51, -127, 74, 13, -150, 111, 106, -53, 116, 17, 95, 86, 35, -56, -15, -179, -55, -89, 94, 99, 38, -287, 54, 121, -66, 202, -166, -219, 16, -65, 69, -156, 284, -15, -96, 28, 3, 162, -10, -95, -7, -64, -89, -111, 51, -200, 20, 7, 58, 134, 43, + 96, 147, -101, -19, 33, -128, 87, -44, 74, 57, -39, -31, 108, -36, -99, 13, -10, -5, -53, 77, -61, 29, 30, 39, -16, -18, 5, -32, 12, -22, 2, -14, -30, 37, -15, 7, -5, 1, 1, 5, -614, -14, -78, 426, 6, 22, 88, -64, 213, 50, -235, -128, -276, 44, -23, -97, -82, -103, -67, 331, -158, -80, -91, -259, -15, -67, 83, 122, -45, -6, 71, -82, -25, -37, -96, 98, 202, -29, -38, 159, -220, 136, -176, -352, -224, -350, -57, -201, -136, 32, 134, 66, 95, -55, 116, -151, + -37, 121, -4, 170, -76, 50, -126, -96, 87, -215, 53, 155, -210, 18, -58, -99, -139, -126, -44, -57, 29, 145, -75, 43, -127, -136, -108, 47, 67, 16, -36, -42, -59, 28, -50, -44, -22, -41, -8, 5, -70, -18, -11, -54, -16, -25, -3, -11, -95, 9, 36, -20, -39, -6, 54, 27, -25, 390, 2, -218, -210, -72, -153, -59, -115, 30, 18, -173, -102, -190, 359, 152, 33, -21, 194, -291, -5, -6, -184, -245, 218, 4, 155, -245, -108, -85, 84, -9, 104, -169, 50, 69, -184, -176, -160, 38, + -54, -49, 154, -45, 16, 3, -32, -175, -108, -20, -264, -171, -140, 74, 49, 106, -27, 47, -4, -26, 121, -94, 212, 31, 63, -27, -72, 86, 64, 169, -52, 28, 101, -59, 0, -221, 103, -170, 107, -125, -125, -238, -48, 62, 25, -39, 54, 26, 108, 20, -35, 98, 51, -83, 19, -67, 73, -28, 11, -17, -11, -59, -4, 6, 10, -33, 27, -49, 18, -7, -28, -43, 10, -28, 62, 21, -20, -25, -28, 53, 31, 51, 2, 8, 23, 459, 435, 324, -112, 118, 163, 95, 91, -164, -144, -214, + 187, -201, -27, -147, 249, -280, -210, -106, -47, -155, -233, 64, 10, 12, -282, -156, 71, 57, 77, -78, -113, 7, 81, 105, -81, 100, -151, -41, -366, 131, 41, -65, -72, -270, -125, 32, -68, -378, 200, 82, -3, -104, -82, -161, 46, -59, 105, -26, -57, -216, -45, -24, -121, 232, -174, 1, 136, -61, -188, -106, 155, 227, 110, -20, -10, 119, -251, 98, -30, -15, 8, 51, -18, -13, 9, -51, -153, -43, -50, 43, 28, 14, -62, -33, -71, -85, -25, -6, 94, 7, 9, 9, -39, -23, 41, -55, + -13, 15, 24, -65, -4, -8, 32, -47, -15, -29, -48, -98, -48, -8, -46, -3, 0, -8, -57, 559, 188, -81, -64, 197, -376, -70, 307, 154, -212, -4, -144, 60, 236, 579, 191, 451, -159, -32, -437, 150, -127, 124, -191, -9, 19, -67, 158, -69, 75, 195, -148, 89, 247, -66, 83, 2, 100, 137, 139, -741, 272, -84, -348, -59, 213, 67, -269, 147, 212, -436, 35, -122, 257, 60, 212, -50, -153, -305, 19, -184, 579, 109, -95, 195, 24, 189, -456, -58, 70, 143, 33, -212, -34, 80, 203, 173, + -142, 6, 199, -7, 94, -68, -35, 142, 13, -9, -20, 9, 68, -64, -30, -7, 53, 54, -8, -16, 137, -42, -25, -71, 9, 40, -37, 5, 41, 58, -50, -20, -83, 8, 63, -29, 11, 32, 32, 113, 13, 56, -5, -46, 71, 20, -662, -726, -249, -57, 13, 155, -310, 98, 366, -210, 195, 254, -177, 6, -86, 310, 433, -207, -244, 218, 21, -207, 98, 4, 54, 62, -111, -80, -462, -23, -132, -10, -14, 314, 93, -563, 9, 272, -308, 82, 332, -72, 117, 7, -87, -214, 426, 360, -273, 144, + -102, -14, 133, -94, 111, -168, -19, 361, -102, 77, 170, -122, -296, -12, 101, 53, -142, 20, 80, 129, 263, 164, 290, 154, 56, 136, -48, 262, -9, -206, -278, 35, 90, -48, 208, -107, -112, 83, -26, 23, 10, -128, -18, -77, 94, 43, 76, 149, 18, -52, -216, -16, 50, -54, -23, 23, -48, 47, 48, 7, -51, -35, 105, -14, 49, 27, 34, -75, -80, -46, 18, 37, 63, 48, 30, 30, 79, -20, -713, 796, -46, 513, 40, -297, -89, -172, -208, -27, 15, 371, -58, 255, -256, -13, 64, 60, + 30, 323, 322, 118, 52, -40, -62, -17, -53, -535, -182, 248, 161, -59, 28, -253, 130, -310, 69, 496, 55, 109, -410, 221, 193, 54, -275, -119, -127, 24, -247, 255, 311, 189, -26, 466, 166, 681, 267, -179, 567, 15, -204, 411, -65, 137, 260, -184, -157, 381, 409, 243, -328, 128, -1, -150, -269, 204, 363, 220, 526, 75, -113, -114, -320, -120, 202, 34, -57, 16, -199, -138, 30, 55, -4, 219, 173, 79, 9, 67, 105, 56, -98, -37, 32, -19, -32, 95, 11, -22, 76, 32, 26, 33, -64, 21, + 192, -82, 122, 60, 8, -81, -92, -44, 175, -384, 509, -148, -336, 112, 221, -223, -113, -470, 196, -172, -58, -431, -190, -146, -75, -194, 101, -87, -107, 101, 141, 250, 245, -106, -90, -347, 136, 7, 227, 63, 60, -79, 90, -217, -185, 102, 51, 104, -424, 142, 276, -1, -374, -389, -305, -898, 126, -103, 433, -213, 359, 116, 23, 465, 69, -53, 332, 124, -457, -226, 53, -145, -260, -157, 585, 271, -279, -33, -157, -76, 84, 416, 5, -111, 547, -196, -501, -476, -567, -100, 41, -14, -101, -68, -243, -47, + 68, -74, -74, 48, 44, -354, -148, -277, 11, -93, -92, -148, -49, 41, 213, 3, 262, 131, 192, 22, 89, -90, 175, 0, -130, -189, 107, 19, 58, -49, 33, -59, 59, -20, 70, -14, -33, 48, -12, 224, -367, -91, -98, -47, -25, 980, 161, 359, -173, 314, 632, -540, 821, 488, -219, 9, 51, -294, -494, 36, -286, -440, -197, 41, 1, -53, -198, -32, -192, -12, -222, -15, 154, -345, 191, 294, -227, -210, 151, 116, -19, 882, 78, 588, -421, -39, -511, -373, 91, -374, -516, -342, -392, -84, -104, -433, + -473, 620, 97, 41, -83, 322, 178, 388, -38, 367, -204, 85, -683, 560, 270, 46, -375, -26, 170, 38, 66, 278, 385, -296, -383, -250, -60, -4, 42, -222, 26, 67, 159, 208, -26, -124, 215, 109, -160, -8, 78, -93, -169, 34, -57, -53, -5, -71, 197, -205, 114, -3, 218, -224, -55, 42, -58, -83, -37, -176, -198, -34, 21, 62, 72, -131, 136, 107, -81, 126, -24, 74, 6, 74, -55, 476, -196, -160, 531, -449, -343, -85, -273, -45, -535, 119, -330, 251, 34, 85, 304, 86, 214, 295, 280, 231, + 392, 45, 266, 239, -289, 496, 120, 228, -269, 387, 173, 271, 68, 96, -52, -359, 90, 201, 237, 259, 54, -437, -277, 312, 169, 70, -167, 215, -160, -438, 639, 390, 284, -248, -123, -326, -1014, -32, -143, 129, -238, -256, -448, 77, 141, 565, -449, 180, 6, 259, -396, -485, -296, 311, 93, 96, 164, -134, 53, 364, 128, 184, 231, -95, -87, -155, 2, 158, 196, 6, 80, 38, 30, 149, -95, -81, -133, -75, -138, -6, -209, -85, -220, -14, -134, -39, -33, -77, 60, -56, -283, -43, 109, 121, 228, -36, + -140, 64, -57, -205, 185, 157, 150, 355, 230, -815, 472, 503, -246, 429, 149, -687, -119, 910, -126, -600, -91, -55, -521, 370, 79, -261, 399, 266, 939, 551, 18, 72, 885, -223, 226, -357, -515, -152, -349, 82, -22, 181, -23, -60, -146, 698, 37, -545, -431, -96, -109, -16, 231, 638, 410, 137, -382, 497, 907, -188, 414, 387, 1091, 210, 211, 332, 467, 260, -369, -355, 254, -663, -397, -474, 457, 400, 281, -105, 338, 701, -394, 559, 558, -71, 549, -508, -221, -175, 1145, -553, 565, 354, 212, 163, -499, -46, + -391, 429, 410, -3, 36, -200, 308, -115, 36, 118, 130, 3, 191, -124, -62, -47, -121, 61, 118, -90, 57, 135, 238, 39, -206, 94, -224, 45, 215, 139, 227, -34, 362, -137, 269, -65, -77, -43, 22, 290, -201, 141, 2, 143, -162, 48, 77, -73, 383, 182, 625, 1114, 121, -114, 119, -59, -182, 34, 118, -271, -361, 124, -187, -102, 285, -13, 559, -292, 548, 270, 56, -316, 105, 546, 160, -276, 110, -65, 18, 321, -441, -233, 497, 12, -120, 431, -19, 153, 100, -410, -747, -158, 263, 482, 107, -368, + 483, -156, 978, -492, 659, -382, 238, 563, -827, -857, -2, -241, 226, 275, 43, -125, -503, 343, -69, 610, 280, 568, 160, 331, -134, 437, 162, -260, 58, -7, -1252, -37, 226, 305, 537, 451, -141, 39, -88, 85, 5, -139, -327, 145, -188, 436, 57, 85, 220, 127, -131, 126, 322, 277, -88, -50, 52, -67, -39, -197, -29, -413, -50, 142, -337, 239, -252, -211, 69, -214, 226, 85, -74, 142, -9, -24, 99, 303, -202, 47, 54, 726, 939, -206, -37, 331, 1243, 34, -736, -295, 149, 141, -233, 237, -168, 385, + -625, 32, 389, -262, -282, 53, -617, -191, -201, -983, -829, -481, 362, 425, -75, -700, 79, 24, -25, 139, -351, 837, -239, 106, 930, -815, 393, 136, -284, 337, -220, -662, 14, 570, -255, -416, 238, 75, 545, 3, -838, 66, -495, 825, -299, 123, 203, 98, -118, -538, 224, 561, 164, 579, -850, -470, -140, -9, 92, -659, 589, -83, -626, -211, 396, 367, -346, -483, 476, -385, -239, -11, -58, -54, -31, -142, -26, 236, -53, 217, -250, 172, 230, -63, 125, 35, -45, 1, 32, 407, 23, -80, 36, 89, -202, 71, + -259, -23, 303, -110, -236, -90, 137, 3, 12, 176, 16, -240, -121, 432, 319, -644, 948, 27, -1623, 651, -223, 127, 166, 219, 399, 146, -294, -71, 402, 272, -322, -17, -255, -132, -798, -101, 385, 477, 108, -189, 529, -544, 602, -346, -194, 72, -186, 161, -479, -648, -725, -232, 376, -145, 4, 442, 123, 78, -13, 15, -152, 6, 477, 294, 504, 427, 505, 344, -299, -191, 125, -32, -578, 390, -104, -547, 687, -7, 112, -19, -249, -82, 289, 418, 348, 11, 214, -701, -99, -250, 383, 132, -195, -223, 884, -270, + -302, -96, 143, -219, -581, -33, -99, -314, 546, 111, 206, -168, -28, 126, 34, 160, 174, -57, 107, -106, 121, 45, -96, -74, 90, 125, 35, -112, -91, -101, -73, 1, 63, -91, -108, 25, -7, -21, 96, -46, 151, 44, 440, -39, -54, -99, -189, -247, 2208, -2173, -111, -2363, -368, -901, -112, 574, -295, -657, 1028, -282, -182, 31, 315, -40, 854, 564, 337, -509, 31, -348, -353, -238, 10, -111, -97, -289, -66, 470, 55, 310, 310, -29, 415, 605, 30, -128, -320, -383, 149, 163, -318, 513, -685, -693, 73, -245, + 366, -643, 270, -1233, -658, -987, -89, -489, -47, -300, -373, -325, -33, 80, -964, 106, -214, 107, 1, -448, -786, 537, -474, -88, 481, -53, -155, 317, 398, -86, 396, 258, 479, 263, 485, 228, -293, -84, -258, 9, -214, 42, 174, 247, 271, -125, 124, 89, 176, -46, -72, 91, 212, 26, 47, 235, 119, 242, -38, 9, -29, 117, 166, -33, -285, 152, -50, 58, -91, 37, -83, -44, 12, -237, 1, 320, -204, -214, 25, 108, 109, 36, -211, 1800, 909, 445, -423, -215, -925, 216, 760, -137, -169, 1238, -210, -264, + 618, 909, 165, 927, -220, 143, 551, 621, 976, 790, -32, -340, 300, 360, 342, 422, 732, 362, 928, -348, -15, 277, 259, 786, 462, 842, -592, -182, 342, -641, 533, 539, 519, 224, -644, -232, 1248, 326, 844, 699, 769, -149, 1016, 1582, 552, 145, 1114, 769, -416, -256, -525, -422, 475, 546, 57, -451, 19, -403, -9, -177, 276, -955, -100, 101, -477, 371, 74, -296, 265, -600, -383, -665, -215, -319, 245, 76, -302, 73, 445, 131, -134, -263, -404, -158, 146, -582, -264, -48, 478, 159, -191, 99, -307, -86, -89, -261, + -160, 439, -93, -31, -99, 103, 288, 198, 248, 603, 8, 486, 30, 48, 313, 259, -395, -236, -25, 90, 49, -1, -572, 276, -688, 1191, 1693, 984, -442, -938, -350, 836, -255, -701, 1261, -883, 751, 423, -1002, -417, -111, -1647, 59, 185, -799, 1614, -562, 1499, -1132, 164, 65, 1095, 1610, -136, 542, 761, -902, 598, -1218, -336, 2293, -132, -643, -126, -1296, 54, -414, 1439, 540, 669, -229, -382, -726, -665, 159, 91, -5, 958, -241, 182, -1003, -516, 655, -1481, -593, -446, -515, 1383, 91, 1495, 1062, 477, 564, -334, -800, 671, + -1086, -656, 1318, 405, -810, -1317, -808, -937, 743, -808, 409, -583, -62, -500, 523, 314, 36, -433, -92, -298, 77, -590, -422, -221, 118, 334, -24, -239, -350, -548, -407, 353, 465, -147, 317, 674, 307, -619, -198, -225, 378, -375, -265, -85, 129, -494, -689, -474, -176, 281, -25, 67, -112, 385, 102, 1081, -1785, 1906, -44, 150, -607, 1540, 364, 993, 377, -646, 224, 553, -939, 662, 14, 440, -1254, -95, 310, 1160, -480, -951, -40, 1153, 609, -436, -989, -46, 832, 112, 60, 233, 605, 1527, -2146, -351, 209, 1198, 269, -648, + -160, 459, 1096, -107, 55, -2058, 599, 326, 564, -1492, 1325, 1143, 431, -672, -67, -744, 561, 979, 411, 460, -83, 743, -1075, 1025, -300, -360, 1202, 993, 66, -370, -985, 727, 794, -2111, -166, 1221, 305, -10, -755, -321, 2069, -154, -705, -85, -379, -455, 689, -576, 211, 318, 421, -285, 43, -290, -352, -231, 318, 322, -322, -60, 160, -252, 627, -596, 158, -103, -194, 228, 1038, 73, 3, -161, -363, 7, 564, 140, -25, -103, -264, 485, -123, -22, -281, 281, -1591, 784, 155, 501, 603, 875, 313, 285, -411, 454, 87, 1038, + -114, -303, 817, 629, -132, 59, -343, 16, 262, -74, -203, 469, -364, 54, 631, -129, 366, -632, -126, 92, -259, -95, 78, 464, -112, -757, 34, 1531, 320, -819, 251, -835, -573, -427, -114, 982, -102, -767, 1578, -1693, 293, 1746, 188, 1230, -928, -1731, 566, 70, 1391, 84, -777, 654, -171, -134, -328, -45, -482, 254, 72, 382, -590, -500, -199, 628, 796, -252, 426, -52, 668, 481, -829, 678, -166, 111, -136, -246, 2, 9, 96, -50, 75, 73, 53, 109, -269, 28, 159, -216, -24, 161, -142, 207, 218, -300, 385, 169, + 399, -73, 188, 331, -592, 8, 189, 364, -208, -143, -199, -133, 353, 693, -293, -3234, -7436, -2945, -4475, -6555, 3530, 978, 2034, 9349, 7209, 4207, 7700, 5746, 987, 1902, 1585, -3643, -3115, -1525, -5571, -5328, -2037, -2736, -3861, -1614, -1383, -3930, -3277, -269, -1863, -3185, -1089, 1020, -2312, 699, 3453, -263, -491, 4686, 3747, -164, 5482, 6348, 2584, 5965, 8374, 4992, 4342, 10039, 8016, 6022, 7143, 9466, 3389, 1341, 3966, -3127, -8962, -6502, -9911, -16059, -14378, -15267, -17749, -18099, -15601, -13594, -13628, -9587, -4240, -2878, -429, 4652, 8560, 8633, 10726, 15418, 13486, 12319, 17031, 13528, + 7654, 11156, 7821, 3034, 2755, 3604, 383, -1135, 711, 104, -2514, -1346, 236, -2011, -3716, -1789, -2545, -5430, -3410, -1320, -4047, -2727, 563, -1288, -1882, 933, -1108, -4472, -3414, -5490, -9265, -8735, -8362, -8698, -7629, -5136, -3998, -2416, -455, 2041, 3638, 5560, 7034, 8721, 9093, 9629, 10749, 10177, 9346, 8817, 5849, 2045, 206, -874, -2453, -2900, -2505, -2837, -3145, -2784, -2790, -2743, -2311, -2271, -2308, -2175, -1853, -1514, -1202, -787, -447, -48, 148, 413, 674, 854, 878 } + }, + { + {-261, 155, -199, 24, -84, -26, 77, -123, -224, -57, 19, -129, -74, 109, -65, 50, -281, -24, 190, 101, -314, -108, -82, -83, 106, -46, -163, -103, -117, -119, 207, 64, 133, -86, 175, 159, 113, -63, -149, -117, 12, 29, 238, 84, 45, -112, 26, 10, 27, 94, 56, -162, -137, -71, 87, 20, -30, -173, -53, 68, 78, -70, -26, 4, 83, -18, -91, 0, 13, -118, 251, 16, -170, -1, -26, 161, 13, 109, 151, 56, -10, 7, -55, -36, -36, 95, -31, -13, -43, 33, 12, -19, -4, -25, 5, -4, + 20, 19, 32, -172, -156, 177, 162, -131, 98, 10, 50, -431, 167, -64, -295, -384, 10, 278, 17, 180, 7, -347, -120, 40, 122, -61, -29, -146, 20, -26, 246, 125, 52, 44, 67, 85, 224, 136, -197, -17, 46, 48, -235, 77, -70, -149, -42, -6, 161, 42, -90, 163, 254, -54, -96, 62, -18, 139, 142, 111, -170, -129, 122, -51, -42, -130, 14, -193, 115, 104, 137, 35, 159, -171, -108, 223, 12, 83, 263, 102, 26, -106, 154, 19, -78, 45, -186, 6, -19, 28, 50, -21, -83, -45, -13, 41, + 38, 13, -23, 23, 53, 10, -17, 220, 20, 85, -184, -156, 90, -43, -67, -85, -80, 67, -213, -122, -264, -317, -58, 265, 171, -106, -29, -36, -61, -228, 165, -57, -58, 15, 108, -51, 10, -8, 156, -144, 157, 86, 188, -64, 145, 65, -89, 131, -88, 76, 139, -105, 146, -87, -70, -22, -43, 74, -42, -111, 45, -96, 22, 13, 16, 220, 43, -50, 2, -90, -125, 65, -30, 210, 215, 87, -59, -33, -1, -84, -97, 108, 170, 6, -18, 105, 113, -15, 40, 36, -81, 78, -14, 112, -55, -21, + -4, -46, -5, 81, -17, 25, 24, -57, 19, -10, -11, 23, 22, -37, 43, -14, -17, 3, -4, -7, -33, -25, 418, -177, 171, -214, -180, 1, -50, -46, 58, -90, 181, 176, 151, -46, -20, -79, -194, 30, -117, -22, 21, -65, 110, 41, -14, -319, -134, -201, 7, -132, -203, -89, -112, -124, 201, -161, 141, 12, -58, 79, 68, -144, -40, 3, 155, -15, -213, -270, -281, 73, -103, 6, -23, 41, 94, 156, -108, -57, 51, 54, 19, 196, -110, 121, -225, 440, 54, -47, 85, 42, 84, -123, -22, 34, + -14, -26, -223, -74, -152, -45, -18, -109, -107, 79, 92, 28, 18, -10, 78, 46, 89, -45, 7, 3, 82, -33, -5, -5, 9, -65, 16, -47, 23, 33, -16, -55, 10, 17, -17, -18, -60, 16, -7, -29, 37, 43, -6, -203, 31, 39, 15, -31, -121, 74, 60, -184, 219, -270, 336, -31, 113, 51, -5, -35, 70, 315, 353, -66, 65, -41, -48, 48, 76, 242, -29, 74, -120, 133, 31, 191, 93, 179, -255, 110, 95, -79, -1, 195, 2, 17, 60, 119, -38, -15, 375, 179, 35, 35, -76, 171, + -224, -329, -398, -23, 212, -5, 106, 285, 114, -49, -98, 153, -28, 367, 166, 56, 53, -198, 44, 152, -75, -223, 41, 82, -8, -77, -27, 40, -71, 44, 43, 40, -13, 45, -70, -65, -20, -41, 24, -65, 40, 67, 45, 51, 51, 17, 33, -91, -77, -28, -40, -47, -9, 32, 19, -2, 59, 33, -3, 74, 47, -486, 53, -36, 334, -250, 147, -515, 203, -48, -262, -288, -202, 155, 121, 392, 52, 131, 375, -65, -272, 42, -210, 52, 306, 57, -85, -36, -58, 90, 119, -25, 80, 158, -98, 50, + -184, -14, -230, -36, 32, -109, 171, 117, 146, 291, 19, 352, 270, 131, -182, 403, 174, 71, 354, -38, 9, 30, 118, -73, -102, -241, -233, -190, 3, -150, 310, -186, 129, 193, -108, 10, -88, -52, -303, -348, 160, -60, -116, -103, 31, 41, 25, 68, -120, 285, 21, 86, -57, 16, 86, -138, 48, 6, 49, 65, 1, 50, 99, 0, 29, 70, 79, 101, -3, 17, -50, -14, 7, -24, -71, 5, -19, -32, 408, 16, 6, -37, -79, 74, 18, -207, -266, -360, -188, -377, -240, -128, -279, -176, -121, -145, + -377, 260, 163, 11, 138, 64, -104, 470, 30, -161, -84, -317, -136, 350, 18, -292, -293, 44, -296, 96, 105, -230, 10, 73, 17, 345, 104, -156, 35, -187, 174, 26, 78, -420, 291, -144, 122, 11, 57, 70, 12, -121, -9, -163, 1, -330, -1, -357, 472, -79, 301, -220, -103, -46, -227, -126, 185, -5, -7, 138, 178, 30, 290, 252, 349, 187, 75, 44, 159, 86, 53, 66, 36, 79, -21, 128, 23, -7, -26, 100, 41, 72, 36, -45, 34, 41, 33, -75, 147, 80, -13, -110, -11, -15, -79, 31, + 15, 85, -67, -152, -209, -1, 154, -402, 0, -174, -139, 284, -464, -438, 114, 584, 15, 55, 45, -89, 320, 310, 179, 88, -84, -475, 281, 2, -380, -123, 88, -19, 3, 39, -92, -374, -21, 15, -69, -156, 112, 324, -419, 260, -157, -79, 25, 207, 681, -441, -111, 43, -44, -81, 22, -169, 59, -153, 468, 161, 87, 129, -99, -27, 247, -39, 107, -206, 359, 16, -254, 502, -320, 231, 66, 114, 365, -146, 155, -18, 0, 44, -25, -247, -131, -16, -109, -39, -60, -152, -155, -116, 72, -133, 76, -36, + -6, -116, -80, -86, 68, -161, 16, 15, 97, 152, -60, -29, -138, -118, 8, -103, 29, -19, -92, 2, -28, 41, 55, -39, 498, 39, 130, 148, -83, -286, -224, 35, 498, 283, 62, -445, 65, -245, 2, 499, 480, 242, 324, -292, -605, -317, -436, 242, -4, -73, -1, -330, -98, 102, -62, -125, -121, 353, -22, 96, -100, 232, 50, -133, -280, -215, 640, -27, -144, 205, -365, 115, -208, -638, -143, -83, 194, 74, 170, 54, 253, 10, 18, 140, -622, -98, -167, -44, 61, 358, 396, 143, -103, -273, -358, -120, + -210, 45, -104, -112, -246, 370, 267, 108, 340, -81, 136, 208, -132, 124, -85, 27, 125, -38, -81, -34, -44, -32, -2, 8, 124, 5, 16, 38, -67, -189, 9, -44, -24, -34, -110, -13, 38, 168, 139, -78, 20, 111, -22, 26, -39, 25, 107, 13, 117, -721, -472, -110, -172, 368, 252, -61, 634, -642, -150, -243, 677, 325, -223, 249, 95, -264, 468, -517, 255, -238, 40, 56, -173, 451, -318, 277, -133, -665, -111, 463, -281, -454, 6, -57, -679, -127, 272, 115, 362, 266, -77, 653, -157, -202, -322, -300, + -290, 179, 244, -211, -237, 78, -206, 273, -76, 148, -111, -170, -131, -4, -384, 104, 277, -65, 120, 166, 197, 354, -254, 114, 277, -36, -590, -628, 69, -60, 47, -230, -96, 46, -227, -413, -126, 311, 252, -124, -50, 96, 85, -49, -100, 7, -13, -162, -60, 172, -49, 138, 25, -43, -85, 111, 110, 129, 16, -72, 75, -193, -116, 95, 45, 82, 151, -77, 32, 59, 74, 14, -87, -126, 57, -69, 521, -322, -818, 8, 590, 752, 144, -272, -203, 81, -129, -114, 334, 338, -159, 326, -403, -46, 300, -140, + 362, 172, -44, -487, 193, -111, -111, 29, -31, -49, 678, -327, 349, 580, 405, 214, 13, -378, 387, -210, 369, -202, 90, -398, -71, -376, -243, 61, -347, -94, -117, -11, 320, -367, -312, -113, -176, -72, -309, -404, -503, 54, 402, -25, -245, 45, 91, 317, -339, -195, -104, -6, 243, 7, 73, -236, -92, 127, 485, 217, 338, 387, 507, 197, -59, -172, 130, 157, 229, 99, 30, 5, 312, 113, -102, 29, 179, 74, 51, -106, -99, -72, -141, 15, 153, 143, 41, -76, 210, 121, 264, 137, 19, 175, 14, -125, + 205, 4, -14, -68, 51, -41, 9, 175, -1379, -655, 460, -1126, -781, -50, -460, -315, 344, 393, 120, -72, 142, 1125, -138, 180, 433, 494, -513, -266, -243, 416, 453, 228, 83, 425, -125, -212, 298, 575, 41, 186, 584, 432, 351, -261, 110, 178, -2, -9, 375, -122, -6, -37, 250, 10, -411, -274, 82, -556, 422, -123, 932, 38, 511, 103, -23, -299, -15, 121, -395, -201, -461, -57, 235, 322, -141, -748, 271, -118, 255, -267, -322, 237, -487, -370, 723, 12, 332, -67, -315, 89, 425, 105, 338, -547, -29, -35, + -92, -470, 459, -273, 32, -52, 54, -173, -19, 99, 139, -115, 300, -72, -99, -175, -153, -151, 143, -57, -109, -43, 36, -114, 209, -61, 237, -147, 99, 39, 93, 157, 29, 559, -254, -646, 278, -337, 142, -8, -322, 596, -796, -32, -961, 24, 778, 1088, 515, -186, 503, -38, -69, 54, -84, 268, -32, -508, 31, -706, 250, -218, -157, 474, -9, -543, -606, 141, 85, -303, -251, 455, -658, -3, -132, 233, -176, -143, -526, -224, -231, -98, 382, -451, 164, -55, -76, 59, 165, -762, -79, 104, -66, 282, -239, -337, + -152, -853, -375, -372, 20, 365, 551, -259, 417, -712, 1144, 79, -203, 598, -706, 600, 270, -160, 15, 201, 18, 96, 548, -233, 235, -126, 171, 273, 270, 328, -110, 277, 68, 42, -43, -367, 17, -260, 123, 170, -54, -40, 52, 38, 187, 86, -130, 200, 1, 24, 250, 169, 102, 448, -363, 4, 167, 2, -284, 71, -179, -172, 697, 37, -502, -14, -78, 322, 212, -307, 350, 4, -789, -860, -84, -261, 212, -39, -305, -775, -676, 365, -576, -131, 34, 179, 41, 548, 44, -281, 367, -52, 52, 338, -451, -32, + 95, -460, 276, 378, 164, 336, 175, 522, 141, 379, -539, -170, -87, -723, -5, -80, 300, -51, 344, -60, -420, -287, -23, -668, 290, 16, -131, 387, 245, 321, 334, 100, -42, 280, -904, 272, 112, 402, -161, -640, 401, -99, 690, -1021, -364, -716, 487, -210, -656, -733, -482, -218, 232, 181, -201, -209, -110, -15, -222, -86, 371, 56, -36, 108, 81, 67, 202, -159, -209, -7, -362, -2, -128, -53, -234, -64, -319, -286, 360, -203, -13, 120, 173, -32, 302, -253, -81, 124, -296, -82, 347, 124, 78, -120, -180, 134, + 478, 443, 1621, 1225, 166, 355, 103, 941, 26, 458, -427, 1115, -442, 1011, -45, 646, -75, 456, -453, 109, 228, -249, -81, -134, -104, 301, 8, -261, -358, -542, -687, -331, -115, 3, 217, -580, 247, -320, -491, -103, -359, 163, -87, -756, -178, -385, -454, -479, 435, 579, -1211, 274, 109, 339, 122, -154, 734, 411, 385, -1015, -452, -15, 252, 838, 33, -115, 43, 710, 641, -607, 686, 49, 155, -117, 403, -865, -301, 888, -135, -60, -341, 591, 389, -309, -517, -92, -20, 50, 10, -113, -481, -168, 379, 492, 309, -276, + -70, -83, -232, 73, 81, 226, -48, -165, 146, 52, 89, 445, 63, -128, -168, 74, 164, 345, 73, -342, -178, -258, 104, 126, -277, -600, 196, -53, -97, -213, -365, 437, -184, 379, 595, -690, 203, -398, 1129, -682, 634, 584, -234, -1071, -627, -79, -291, -40, -496, -783, -1038, -599, -694, 287, -595, 236, 61, -76, -69, -491, -158, -504, 137, 434, 572, 2, -172, -518, -130, 42, -311, 78, -426, -281, -68, -424, 320, -375, -1091, 31, -42, -366, 453, 352, 517, 192, 405, 827, 132, -840, -198, 382, -191, -700, 378, 538, + 176, -13, -943, 826, -48, 672, -574, 681, 1685, -160, -57, -837, 437, -683, 560, 278, -378, -93, -922, 200, -506, -3, 343, 342, -21, -246, -212, 240, 610, -310, -56, 85, -277, -89, -93, 119, -38, 249, -127, -308, -173, 79, 227, -305, -99, -15, 33, 208, 40, -85, 70, -509, -293, -41, -53, 93, 22, 30, -17, -97, 247, -24, 183, -23, -62, -195, -134, -1328, 453, -1742, 1154, 415, -296, 1230, -116, -624, 1091, -417, -58, 233, 383, 1010, 43, -80, 713, 304, 599, 734, 544, 53, 380, 63, -37, -397, 258, 386, + 94, -20, -431, 211, -403, 490, 482, 87, 569, -346, 376, 593, 377, -792, -854, 1009, -96, 632, 977, 27, 2, -97, 193, 568, 536, 60, 445, 5, -506, -628, -936, 21, -380, 18, 532, 503, -876, 80, 341, -764, 128, 1076, -464, -529, 576, -613, 143, -168, 1124, -321, 694, -339, 583, -49, 217, 471, -733, -218, 279, -480, 356, -430, -121, -240, -224, 37, -121, -194, 117, 340, -168, 97, 122, -284, 51, 46, -75, -199, -85, -152, -472, -181, 101, -613, 223, -311, 238, -138, -60, -427, -227, 12, 119, -185, -424, 77, + 28, 234, 97, 7, 275, 228, 22, 126, -610, 135, -706, 1450, 355, -776, 294, -181, -691, -814, -826, 243, -41, 728, 1080, 518, 261, -132, 358, 33, -1360, 595, 1411, -925, -971, -840, -1187, 857, -1169, 524, 7, -148, -8, -381, -452, 578, -1203, 1234, 709, 162, -792, -600, -525, 108, 206, -515, -72, -381, 851, 384, -155, -28, 349, 76, 399, -699, -276, -69, -124, -650, -456, 382, -1232, -729, 93, 1436, 694, -442, -31, -1098, 532, 1668, 58, -363, -252, -793, 1028, -335, -399, -38, 609, 379, -530, -481, -171, 533, -144, 153, + -43, -430, -139, 676, 389, 52, -317, -55, -49, 527, 431, 212, 195, -634, 240, 223, -95, 139, -99, -95, -552, -63, -28, -83, -176, 143, 202, 102, -648, -562, -275, -6, 39, -658, 233, 818, 166, -233, 16, 123, -1, -678, -468, -1353, 292, -997, -1490, 347, 820, 200, 218, -633, -791, -207, -1170, -577, 302, -980, 1537, 297, -381, 328, -740, -1460, -491, -1117, 174, 323, -411, -795, -404, -492, 425, -584, -215, -79, 656, -479, -90, -226, 166, 272, 47, -200, 677, 886, 566, -458, -376, -1311, -730, -302, 343, 2193, -378, 23, + 974, -92, 413, -502, -522, -424, 461, -1242, 7, -168, -18, 1069, -474, 1620, 141, 1227, -1572, -474, 452, -35, -684, -578, 1271, -1317, -1085, 1558, 273, 1353, -541, -94, -96, 432, 184, -128, 459, 458, -27, 214, 144, 45, -163, -296, -69, -197, -261, 238, 138, -223, 156, -483, -49, 335, 590, -51, -374, -32, -425, 239, 405, -287, -233, 224, 270, -608, 216, 23, 394, -261, -266, -7, 125, 181, -682, 107, -289, 538, -188, -81, -1347, 641, 988, -717, -590, -202, -648, -780, 208, 231, 606, 26, 529, 942, 983, 653, 225, -722, + 70, 375, 497, 764, 7, -396, -576, -218, 774, -318, 304, 673, 65, 1322, 152, -844, 729, 721, 207, 311, 668, 107, 55, -775, 1674, -1786, -1315, -1524, -507, 316, -898, 460, 997, -296, 96, 881, 279, -954, -333, -738, -108, 55, 46, 851, 834, -192, -214, 535, 1286, 224, 1058, -894, 941, -413, 310, -188, -605, -418, -99, 428, 258, 1053, -1366, 694, -542, -335, -269, 505, -244, -47, 105, -545, 337, -266, -23, -414, 123, -83, 14, -466, 65, -42, 88, -45, -514, 204, -295, -263, -126, 380, 434, 487, -422, 835, -634, -188, + 42, -67, -471, -249, -34, -347, 92, -28, -22, -40, -352, 45, -65, -762, -1533, -1543, -1117, 229, 2867, 725, -396, -867, -2073, -2915, 658, 1208, 1450, -305, 126, -855, -1488, 429, 270, 484, 70, -1247, -381, 305, -251, -49, -236, 1624, 1426, 962, -88, -697, -1184, -783, -709, 1109, -184, 812, 367, 380, -499, -2701, -1860, 919, -1463, -499, 3117, 2143, 1610, -1221, 882, -845, 62, 62, 452, 1321, 2328, -891, -82, -1534, -1239, -2031, 221, -84, -2186, -524, 1409, 526, 984, 1334, 2404, -1751, -1050, 139, -1429, -184, 800, 1873, 953, 292, -1142, -1095, + 740, -311, 1104, 970, -261, 444, 179, -186, -366, -213, -137, 329, 97, -8, 115, -34, 160, 5, 700, 575, 912, 165, -499, -1053, -859, 351, 820, 938, -117, -598, -2419, -1242, -1144, 29, 124, 249, -7, 182, -272, 0, -404, -361, 514, 454, 265, 267, 136, 62, 708, -1153, -3814, -3550, -2038, -2217, -554, 3674, 1867, 3780, 3356, 5260, 3757, 3231, 521, -1405, -3174, -5086, -4319, -4349, -2273, -1092, -257, 35, 124, 896, 1198, 3021, 1834, 3565, 2323, 3057, 1107, 2954, 1027, 723, 699, -177, -830, -2003, -2311, -4290, -2938, -5436, -4300, -6597, -3910, -3105, + -749, 1811, 963, 160, 1808, 3864, 5163, 6768, 8068, 6902, 5043, 6286, 5188, 2906, 1307, -325, -2164, -5009, -5947, -7966, -10284, -11904, -10742, -9471, -6740, -4604, 1411, 4438, 5411, 8330, 6956, 8686, 9130, 8953, 10322, 6773, 1760, -1707, -3305, -4093, -2648, -3833, -3284, -3836, -5188, -5250, -6110, -3620, -2816, -2403, -1341, -82, 363, 1485, 4036, 4251, 6039, 5255, 6907, 5077, 3395, 3500, 1336, -918, -1495, -6652, -8571, -7982, -7038, -4123, -3232, -1769, 158, 1796, 2743, 3724, 4452, 5292, 5032, 4756, 4194, 2343, -3, -1184, -2754, -2882, -2458, -2003, -2074, -2091, -1623, -1152, -662, -260, -234, -169, + 66, -180, -233, 201, 498, 509, 236, 86, 272, 440, 373, 400, 502, 708, 567, 72 }, + {-367, 135, -209, 111, -119, -242, -418, 72, 11, 104, 91, -30, -32, 30, 251, -180, -320, 105, -133, -215, 3, -33, 131, 46, 93, -97, -25, -64, 213, -60, -88, -78, -39, -53, -87, -77, -54, 41, 17, 27, 6, 54, 90, 45, -82, -244, -4, -170, 23, -13, -78, 107, 6, -1, -243, -100, 31, -20, 83, 5, 74, -72, 30, -32, 147, -54, 77, -135, -134, -169, 7, -41, -50, 0, -60, -3, -70, 13, 2, -30, -107, 9, 10, 59, 52, -1, 56, -8, -46, -16, -22, 21, -2, 2, 31, 22, + -5, 28, -21, -262, -55, -35, -75, -34, -90, 86, -36, -31, -8, 1, -6, -64, 231, 149, 242, -114, 241, -144, -101, 93, 266, -6, -163, -240, -173, -33, 189, 74, 63, 84, -85, 129, 15, 97, -49, -218, 58, -151, -105, -106, -27, -277, -14, 13, -117, 259, -51, -84, -106, -3, 27, -111, 2, -136, -53, 4, -58, 186, 4, -50, 102, 67, 170, 69, 205, 51, 167, -193, 48, 155, -55, -138, -192, -4, -17, -38, 45, 56, -43, 148, -130, 49, 49, -95, 67, 16, -72, 37, -20, 15, -67, 21, + 6, 13, -10, -4, 30, 9, 57, 297, -134, -103, 30, -65, -48, 150, -115, 144, 66, 4, 74, -95, -91, -167, -181, 240, 114, 85, 129, -83, -55, -60, 302, -116, 331, -10, -83, -78, -174, -187, -227, -13, -57, 43, 221, -17, -103, -306, 11, 246, 359, -167, 93, 68, -91, -80, 94, 341, -81, 55, -29, -48, -31, 165, 236, -176, -96, 75, 309, 53, 219, -177, -165, -7, -27, 64, 47, -2, 20, 34, -80, 39, 100, 79, -60, 199, -50, 126, -64, -66, 74, 64, 67, 17, 70, 15, -102, -68, + 20, -3, 38, -17, 57, -1, 32, -29, -5, -1, -15, -34, -3, -20, -5, -24, -22, 58, -1, -25, 61, 3, 485, -337, -76, -141, 36, 127, 232, -236, 158, -63, -250, -403, -85, -172, 26, -40, -172, -89, 91, 97, 311, 172, 157, 14, 47, -164, -112, 250, 190, 129, 58, 119, 23, -1, -212, -299, 196, -81, -203, -97, -128, 105, -113, 251, 56, -147, -73, -113, -99, 122, 183, -17, 123, -93, -105, -1, 23, -99, -41, 144, -1, -62, -74, 78, 86, -13, 105, 14, -78, 251, -38, 27, 10, -305, + 116, 94, 155, 102, -114, -27, -277, -127, -254, -93, -115, 0, 21, -167, 5, -41, -2, 69, -28, -32, -8, -47, 6, -25, 16, -29, -65, -32, -18, -105, -12, -6, 19, -8, 10, -7, 0, -56, -75, 6, -13, -33, 10, -330, 88, 6, -96, -180, 78, -172, -30, 303, 458, 227, 253, -16, -124, 191, 171, 73, 92, 227, -31, 166, 161, 235, 225, -181, 152, -10, 55, -168, 54, -21, 154, -57, -41, -118, 113, -184, -150, 17, 162, 90, -95, -48, -28, -62, 99, -222, 208, 1, 259, -363, 27, -326, + -102, -102, 91, -32, -73, 74, 29, 91, 143, 235, -27, -185, 42, 316, 66, -89, -22, 196, -101, 120, -97, -333, 195, 208, 192, -164, -247, -177, 212, -20, -31, 152, 57, 39, 27, -8, 59, 80, -24, -40, 45, 7, -13, 29, -41, 15, 69, -26, 73, -27, -51, 28, 0, 3, 37, 30, 38, 31, 28, 1, 37, -501, 8, -112, 45, -281, 33, 45, 371, -298, 3, -400, 90, -242, -60, 14, -131, 114, 50, -210, 3, -4, 192, -127, 310, -5, -270, -139, 330, -33, 132, 87, -55, 197, -219, -208, + -162, 21, -210, 222, -123, 142, -203, -4, -247, 161, 21, 193, 173, -166, 326, 277, 262, 50, 276, 225, -234, 199, 96, 17, -217, 99, -185, 182, -80, -147, -18, 272, 97, -317, 300, -26, -106, -182, 306, 263, -228, 224, -16, -274, 3, -156, -85, 148, -131, 105, -11, 45, -63, 79, -11, -10, -18, -32, 29, 14, -76, 25, 38, -2, 29, 31, -71, 13, -8, -1, -60, 19, -24, -39, -80, 90, 20, -46, 714, 121, -28, -246, -462, 118, -68, -679, 596, -289, -431, 91, -27, 80, -28, 116, 172, 2, + -11, -347, -29, -33, 409, -75, 11, 151, -72, -50, -166, 349, -262, 252, -62, -209, 39, -234, -119, -380, 67, 175, -102, -190, -150, 230, -356, -84, -175, -5, -51, 47, -309, 301, -421, -288, 115, 51, -15, 113, -218, -315, 40, -85, -14, 155, -188, 140, 98, 347, -96, 50, -26, 5, 482, 41, 478, -115, -179, 55, -245, -22, 245, 20, -285, -250, 71, -26, 2, 245, 20, -46, 102, -14, -9, -114, 43, 54, -57, -1, -27, 95, -42, -19, 50, 13, 30, -9, 55, -17, 1, 29, -59, 75, -46, 28, + 64, 35, 60, 17, -526, -71, -109, -427, -734, 223, 377, -271, -131, 212, -81, 453, -53, -246, -148, -685, 228, 75, -64, -482, 111, -269, -72, -236, -122, 338, -329, 138, -486, 307, 60, 4, -141, 34, -65, -273, -511, 96, -1, 107, 212, -126, -43, -330, -170, -90, 137, 91, 240, 383, 300, 153, 228, 67, 238, 213, -212, 245, 278, -60, 372, -41, 437, -197, -473, -80, 299, 328, 379, -76, -660, -69, -36, 22, -24, -165, 93, -483, 373, 233, 225, -254, -239, -55, 138, -20, -267, 0, -131, -219, -88, -39, + -105, 7, -89, 41, -56, -33, 68, 10, 30, -37, -96, -108, 73, -87, -4, -34, 44, -37, -23, -37, 109, 55, 33, -37, 700, -154, -168, 234, 377, -27, 176, 437, 316, -717, -659, 5, -63, 97, -295, -524, 124, 420, 277, -304, 494, 399, 374, -629, 178, 329, 17, 50, 281, 647, -125, -296, 197, 146, -88, 350, 523, 97, 542, 236, -406, 45, 449, -49, -184, 232, 38, 88, 472, 302, 161, 55, -547, -558, -46, 88, 146, -173, -24, -145, 49, 69, -208, 78, -128, -33, -177, 19, 349, -207, -503, -79, + -428, 94, -152, -12, -57, 201, -75, 146, -1, 125, 60, -59, -68, -88, -248, 89, 33, 61, 9, -193, 97, -151, -126, -45, -161, -36, -52, -62, -50, 104, -46, 69, -6, 55, 11, 135, -58, 35, -109, -30, -93, -88, -17, -65, 210, 86, 9, -31, -28, -1175, -735, -226, 207, -77, -297, 47, -290, 814, -337, 520, 803, 433, 393, -322, 281, -163, -381, 321, 376, 247, 539, -3, -34, -247, -253, -217, -345, -337, -233, 120, 39, -10, -220, -123, -335, 130, -291, -265, -122, 131, -8, -181, -486, 51, -149, 167, + -572, -444, 488, -83, -103, -236, -148, 364, 113, -84, 196, -63, 204, 161, 234, -180, -292, -725, 42, -703, -55, -597, -93, 550, -78, 91, -406, -180, -213, 37, -263, -156, 243, 304, -40, -40, 28, -150, 45, -24, -148, -65, -127, -55, -76, -331, 48, -62, -50, 12, -96, -113, -230, -60, -137, -162, -37, -202, -98, 24, -129, -150, 10, -127, 31, 37, 131, -93, 89, 37, -135, -57, -39, -68, 17, -37, 805, 16, -583, -495, 505, 396, -373, -361, 678, 430, 25, -403, 49, -170, 322, -251, 39, -107, -74, 700, + -99, -192, 131, 118, 210, 215, 24, -278, 210, 105, 241, 540, 249, -781, -222, -129, -596, 230, -103, 11, -332, 280, -128, 52, -432, 292, -352, 27, 349, -58, 368, -288, 459, -588, 294, 5, -210, 765, 206, -161, -456, 197, -92, 61, -68, 278, 420, 561, -355, 251, -140, 502, 187, 70, -45, 300, 56, -203, 247, -177, -294, -131, -400, 2, -448, -41, -302, 344, -108, 220, -241, 6, -134, 207, -65, -23, -133, 68, -99, -166, -92, 67, -155, 92, -123, 55, -79, -82, -79, -177, -99, 1, -125, -118, 162, 135, + 77, -84, -201, -25, 90, -11, -156, -98, -1176, -763, 626, -467, -439, 238, 548, -915, -156, 212, 54, -480, -717, 1334, -581, 177, -660, 357, -233, 621, 552, 52, 94, -748, -5, 347, -305, -447, 348, 95, 376, 297, -67, 122, -87, -52, 556, -480, -284, 445, -22, -364, 472, -19, -108, -326, -146, 171, -255, -33, 164, -323, -330, -217, 238, -696, 327, -36, 655, -622, 202, -474, 171, -286, -363, 589, -331, -149, -322, 253, -368, 212, -127, 430, 443, -60, -697, 274, 286, -37, -25, -400, -277, -70, -344, -279, -99, -12, + -172, -230, 256, 83, -163, -139, -167, -178, 185, 65, 43, -266, -102, 222, -133, -165, 104, -119, -1, 78, 130, -58, -219, 40, 128, -293, 5, 71, 5, -156, -88, 4, -70, 589, 286, -663, 226, 714, -63, 2, 329, -213, 500, 453, -600, -367, -111, 317, 572, 102, 303, 646, 483, -679, -73, 1079, 266, -72, -128, -203, -317, 95, 263, 295, 273, -192, -461, 124, -240, 253, 743, -198, -749, 895, -271, -493, 724, -130, -217, -776, -141, 321, 152, -168, -329, 300, 31, -359, 307, -72, 706, -520, 72, -101, 808, 277, + -1152, 361, -482, -201, -413, 499, 1646, 603, 94, 382, 478, -607, -260, -171, -349, -209, -387, 364, -849, -224, 74, 102, -280, 53, 146, -82, -110, 288, 50, 193, 157, -173, 46, 143, 51, 120, -90, 74, -168, 23, -53, -157, -87, -35, 254, 15, 63, 11, -58, -52, 18, -22, -243, -28, 34, -56, -189, -429, -161, -129, 248, -43, 50, -249, -870, -369, 61, -352, -1096, 954, -181, 431, 83, -502, -865, -833, 938, 572, 217, -328, -625, -467, -742, -189, 279, -114, 62, 120, -121, -383, -369, -630, -225, -119, 312, 219, + 343, -167, -282, -117, 448, 66, 397, -1320, -310, 0, 291, -420, -18, -486, 383, 339, 65, 1636, 27, 513, 673, 32, 218, 13, -117, -193, 339, 500, 650, -12, -122, 47, 428, 391, 15, 317, 272, 215, -86, 642, -184, 823, -811, -403, -997, -308, 179, 27, -258, 56, -3, 449, -91, 537, -245, -196, -269, 141, 300, -46, -146, -159, 185, 6, 623, -96, -43, 115, 175, 260, -216, -17, 83, 130, -298, 106, 113, 385, -378, 218, 144, -159, 324, -180, -222, 4, -75, 169, 83, -131, -4, 139, 32, 336, -16, 221, + 619, -114, 27, 163, -848, 35, 121, 533, 814, -693, 153, -437, 581, 526, 67, 1010, 315, 402, -368, -59, -645, 1009, -587, 158, 617, -147, -397, 312, -91, 158, 662, 17, -210, -61, 124, -21, -393, 291, -38, -112, 1132, -870, 819, 529, 1023, 416, -723, 559, 11, 520, 1347, -971, -402, -125, 26, 915, -542, 48, -582, 46, 1031, -116, 1070, 302, 183, 487, -653, -108, 471, 666, -1082, -38, -928, 416, -482, -16, 220, 302, 23, -330, -263, -1015, -115, -721, 585, 51, -45, 455, 26, -2, 437, 326, 220, 5, -147, 206, + -342, -25, -235, 235, 245, -207, -40, -440, 196, -27, 0, -12, -427, -516, -170, 167, 391, 199, 176, -62, 327, 227, -14, -166, 285, -405, -114, 84, 459, 379, 82, -184, -655, 184, -1146, -1011, 15, 14, -642, 521, 151, -176, -596, 810, -189, 1206, -176, 259, 435, -589, -196, 183, -700, -396, -613, 524, -491, -135, -162, 453, -414, -700, -974, -31, 809, 46, -447, -193, -566, -193, 4, 334, -638, -75, -139, -458, -627, 26, 104, 401, 138, 692, 192, 874, -367, 720, -186, -570, -148, 1174, -510, 533, -374, 860, -458, 287, + 547, -37, -227, 100, -314, 782, -722, -276, 785, -102, -656, 26, 600, 329, 600, -611, -516, -333, -67, 586, 715, -1271, 67, 361, -695, 109, 438, 336, 321, 309, 210, -102, 23, 236, 269, 214, 541, -170, 284, 115, 586, 344, -453, -578, 182, 610, -175, -176, -392, -673, 77, -575, -179, 125, -379, 348, 101, -124, -313, -66, -325, -32, 181, 80, 51, -63, -79, -1087, 1199, -396, 1021, -210, 821, 71, -254, -557, -394, -71, 15, 605, -227, -43, 175, -545, 887, 334, 36, -725, 502, 266, -578, 571, 52, -86, 146, -14, + 749, -167, -935, 1017, -520, -78, 756, -328, -162, -446, 1193, -529, -145, -740, -142, 95, 1067, -494, 203, 344, 635, -162, -673, 740, 449, 602, -289, -138, 78, 666, -364, -770, -863, 465, -604, 160, 649, 605, -420, -140, 873, -1384, -31, 197, 483, -59, -505, -96, 797, -149, 1634, 643, -465, -58, 50, -191, -588, -718, -527, 459, -340, -135, -11, 716, 311, -241, 316, 235, -7, 110, 134, -3, 101, 734, 603, 586, 398, 61, -357, 199, -278, 355, -429, 474, 687, 233, 869, 940, 382, -3, 493, 175, -87, -291, 512, -127, + -406, 0, 250, -111, 218, 408, 155, 416, -232, -265, -1536, 523, 299, 1370, 1200, -178, -443, -1412, 41, 473, -605, 462, 827, 805, -373, 969, 866, 42, -522, -559, 884, 756, -1073, -1463, 1946, 102, -137, 257, 145, 723, 718, -287, -245, 1015, 483, -180, -673, 411, 82, 57, 362, 53, -31, -403, 229, -119, -495, 913, -1449, 1014, 840, -1370, -94, 703, 178, 801, -186, 115, 732, -93, 375, -673, -1070, 3021, -1233, -1733, -378, 3366, 1454, -1430, -323, 597, 413, -27, -864, 1268, 710, 534, 127, -1703, -278, 281, 510, -697, -1156, 105, + 369, 163, -544, -576, 282, 159, 423, -75, -138, -39, 452, 574, 398, -857, -329, 610, 451, -430, 5, 498, 883, 346, -459, -624, -815, 390, -258, 362, -688, 392, 206, 441, -312, -165, -551, -234, 554, 103, -451, 254, 220, -600, -379, 756, 1309, 91, 2174, -964, -371, 1262, 62, -71, -649, -1296, 1077, -675, -736, 560, -817, 406, -774, -856, -145, 189, 121, -200, 1030, 260, 628, 303, 17, 18, -465, -987, 316, 989, -806, 691, -821, -83, -45, -1268, 905, -438, 352, 27, -374, 24, -920, 947, -666, 318, -1070, -647, -1404, 533, + -657, -735, -597, -304, 0, 1495, 533, 741, -206, -695, -885, 237, 53, -1519, -710, -2674, -1262, -1032, -157, -1231, -1019, -220, 979, 1121, -911, -1146, -1323, 669, 1578, 84, 1268, 36, 765, 311, 90, 373, 134, -27, -461, 659, 540, 295, -550, -213, -76, 285, 293, -105, 318, -138, -372, -639, 77, 899, 319, -102, 249, -285, 476, -172, 622, 610, 68, -649, 105, 149, 706, 177, 803, -537, -337, 749, 769, 210, -206, -137, -768, -359, -1530, 360, 540, -1325, 735, 146, -385, 79, -375, -37, 285, 387, 679, -799, 78, 921, -103, -439, + 828, -364, 58, -491, -199, -979, 255, 23, 553, -386, 41, 687, -325, 11, 709, -1393, 90, -1595, -508, -1069, 853, 302, -63, 358, -313, 391, 1085, 292, 1684, -939, -1077, 992, 270, -728, -683, -279, 621, -597, -23, -517, -667, 391, 489, -994, -578, 854, -16, 301, -186, 468, 208, 863, -503, -374, 219, 199, -250, -903, -661, -715, 955, -445, -740, 214, -194, -244, -488, 183, 218, -82, -145, -266, -449, -80, -102, -329, 12, -162, -309, 186, -182, 170, -180, -154, 451, -181, 213, 157, -431, 190, 56, -175, -522, 706, 465, -203, + 109, -350, -265, 214, -7, -449, 156, -182, 406, -111, -76, 76, 189, -1033, -2091, -1044, -397, 917, 1194, -2283, 395, -906, -1238, -252, 1432, 917, 782, -491, -551, -657, 723, 512, 1115, 148, -1446, -564, 1088, -164, 320, 976, -465, -671, -1057, -1056, 7, 693, 1491, 1106, 732, 302, -1525, -1622, 568, -1119, 265, 1436, 570, 100, -723, -1294, -223, -556, 435, 342, 243, 901, -141, -170, 235, 655, 1055, 1097, 370, 978, 326, 353, -216, -1087, -430, -469, -896, 678, 628, 472, 464, -204, -1077, 182, 319, -13, 714, 465, 373, -81, 47, 110, + 734, 746, 561, 168, -138, -539, -103, 322, 90, -156, -6, -427, -205, -245, -288, 230, 801, 401, -151, -76, -606, -57, 207, 412, 447, -137, -197, -932, -546, -130, 2, 382, 308, -179, -230, 157, 55, 103, 225, -256, -99, -47, 148, 256, 19, -82, -76, -387, 648, -1840, -3704, -1912, 359, 1447, 3527, 3451, 1438, 1469, 1055, 57, -1757, -2978, -4488, -1340, -1877, -327, 1832, 3265, 2744, 2424, 1336, -30, -854, -1145, -245, -1983, -1575, -1496, -981, -804, -373, -69, 684, 1610, 1657, 1629, 1193, 1553, 823, 889, -290, -64, -732, -1923, -2786, -3366, + -1631, -656, 524, -86, 356, 784, 1023, 2184, 2516, 3335, 2127, 216, 972, -502, -1840, -1609, -3205, -3739, -2796, -1727, -743, -585, 1347, 1523, 4223, 3460, 2531, 2479, 1187, -149, -1677, -2424, -1770, -2122, -2915, -1383, 80, -284, 83, 1275, 1775, 1313, 684, 664, 1131, 484, -84, -135, -555, -92, -495, -1304, -690, -972, -1582, -277, -274, 1268, 1154, 696, 1241, 2149, 1537, -375, -258, -1032, -920, -2157, -2238, -1081, -457, 187, 759, 901, 1340, 1530, 1477, 1554, 396, -157, -828, -1009, -1336, -1476, -1482, -636, 330, 443, 637, 664, 457, 488, 505, 162, 115, -164, + -175, 280, -199, -461, 2, 69, -78, -132, -171, -6, -25, -178, -33, 142, 131, 113 } }, + { + {-139, -216, -158, 61, -24, -371, -211, -16, 53, -114, 39, -138, 27, -100, 260, -212, -93, -93, 166, 114, 265, 70, 55, -121, 125, 16, 34, -15, 100, 137, 10, 137, 130, -63, 73, -77, -86, 10, -71, 44, -111, -200, 54, 72, -50, 56, -96, 90, 123, -212, 41, -12, 79, 68, 11, -209, -63, -92, 69, -2, 21, -67, 38, -107, 5, 116, 74, 8, -60, 38, -171, -96, -126, 23, 21, -11, 180, 1, 157, 2, 16, 15, -1, -85, 64, -5, 31, -18, 20, 30, -12, -30, -12, -9, -9, -5, + -46, 8, 47, 27, 0, 5, -13, -21, 20, -428, -14, 23, 6, 70, -151, 111, 62, -79, -255, 168, 172, -41, 143, 103, -142, 281, 58, -127, 151, 11, 141, 21, -245, 93, -47, -91, -95, -74, 160, 124, 10, 130, 47, -123, -152, -14, -36, 65, 44, -120, 28, 62, 59, -105, -88, -139, -49, -35, 28, -34, 187, 80, -29, -95, 35, 78, 40, 201, -34, 101, -12, -66, -122, 86, -28, -57, 118, -36, 39, -26, -25, -136, 30, -39, 160, 198, -119, -121, -85, 33, -77, -39, -50, -49, -53, 32, + 73, -5, 19, 22, -8, 2, -36, -81, -127, -291, -174, -64, 209, 26, 39, 127, 34, 55, -305, -281, -179, -47, -1, 128, -92, 100, -53, -189, 59, -28, -129, -3, 180, 262, 119, -121, 70, 8, 189, -2, -151, -6, -88, 185, 81, 87, 188, -33, 14, 252, 221, -9, -1, 17, -14, 67, 18, -185, -245, -87, -31, 0, -81, -273, -29, 75, -149, -73, -97, -83, 29, 34, 90, -191, -152, 146, -62, -34, 30, -12, 95, -184, 72, 67, -73, -70, 73, -80, 116, -46, 1, -1, -46, 23, 86, 47, + 10, 52, 15, -24, -47, -26, -27, 10, 13, -8, -7, 12, -4, 389, -149, -118, -19, 7, -145, 1, -102, 187, -46, -232, -323, -83, -214, 298, 24, 211, 178, -282, -16, 118, 86, 150, 28, -18, -26, 70, -93, 108, 60, -101, 62, 5, 73, 162, -87, 64, -10, 92, 80, -33, 110, -31, 95, -73, 87, -229, -97, -84, 64, 198, -145, -96, -54, 12, -66, -88, -46, 80, 65, 114, -38, 65, -67, -71, -7, -43, 79, -1, -119, 67, -70, -118, -44, -73, 52, -86, -233, -33, -101, -99, 51, -64, + -140, -29, 30, -10, 8, -1, -88, 3, 46, -33, -37, 9, -2, 17, 15, 46, 13, -40, 26, -7, -14, -15, -39, -37, -40, 66, 102, -39, 155, -242, 109, -144, -159, 235, 88, -276, 29, 2, 84, -198, -127, -17, -161, -293, -284, -187, -284, 123, -29, 44, 154, -249, 165, -70, 77, 51, -25, 26, -36, -35, -162, -97, 213, -78, -176, -162, -15, -72, 67, -155, -240, 38, 224, -33, 136, -77, 74, -119, 92, 38, -164, 242, 43, -50, 57, 223, 205, 108, -22, -247, -42, -206, 60, -45, 35, 36, + 58, -187, -1, -13, 91, 193, -240, 33, -70, -225, -25, 66, -23, -5, -22, 74, 15, -65, -45, -47, -29, -77, 3, -6, 43, -93, -66, -7, -13, -11, 4, -7, 15, -34, -35, -9, -6, -25, -6, -7, 42, 39, -1, 1, -43, -70, -25, 4, -275, -264, -171, -291, -344, -328, 139, 152, -211, -56, -191, -312, 167, -82, -271, 93, -18, 14, 28, 92, 30, -10, 70, 93, -156, -150, -40, -183, -13, -195, -336, -27, 204, -244, -187, 131, -128, 15, 52, -126, -101, -107, -363, -158, 78, -105, -120, -230, + 102, 203, -74, 313, -174, -83, -1, -77, -266, -20, 61, -10, -56, -233, -38, 227, 115, 66, 119, 83, -60, 435, -137, -171, -162, -196, 77, 247, 170, 17, -40, -127, -45, -5, -59, 9, -79, 29, 182, 116, -89, -21, -32, 64, -38, 70, -76, -40, 11, 13, -19, 22, -44, 45, 2, 35, 31, 20, -21, -37, -9, -37, 490, 334, -14, 305, -24, 46, 60, -165, 279, 4, 246, 236, -188, 306, 6, -231, -382, 351, 171, 349, -290, 201, 110, -320, -316, -186, -89, 336, -318, 283, -26, -31, 205, 193, + 263, 97, -142, 128, 247, -148, 247, 374, 160, 227, 95, 65, 65, 10, -203, 76, 22, 15, 173, -121, 104, 115, -48, 326, -190, -116, -72, 282, -50, 233, 119, 157, 143, 28, -397, -62, -318, -173, 416, 217, -184, -11, -227, -204, -105, 345, 32, 119, 69, -54, 73, 124, 218, -61, 128, 91, 80, -74, -45, 34, -36, -2, 61, 80, 35, 34, 98, 94, 37, 3, 49, -20, 84, 125, 62, 3, 139, -428, 273, 262, 772, 31, 68, -38, -105, -49, 262, 239, 208, 301, 123, 475, 140, -187, 46, 414, + 164, 43, 65, -211, -304, 196, -151, -298, -632, -9, 253, -19, 149, -219, -115, -81, 48, -69, -189, -92, -509, -133, -432, 37, -228, 175, -248, 95, -238, -83, -15, 8, 37, 49, -316, 153, -47, 70, -165, 5, 253, 102, 349, 196, -106, -20, -72, -35, -82, -111, -5, 143, 93, 107, 69, -499, 330, 324, -121, 185, 145, -264, 128, 79, 17, -56, 47, 171, -149, 99, -41, 9, -11, 38, 92, -76, -33, 127, -88, 7, 5, 48, -57, -106, 67, 4, -31, -32, 18, -4, 62, 70, 81, 1, -82, 831, + 299, -139, 410, -270, 286, 190, -391, 83, -492, 10, -167, -347, 186, 6, 142, 203, 252, 405, 169, -29, -104, -276, -496, 176, 195, 54, -173, 268, 35, 283, 169, -517, -196, 70, -380, 20, -27, -72, 113, 84, -89, 382, -220, 15, 215, -188, 148, -82, -231, 155, -1, -30, 221, 145, 9, -114, 456, 20, 257, 26, -141, -158, -380, -147, 161, -10, 137, -43, -296, 119, 100, -436, 128, 225, -115, 240, 58, -247, -250, 286, -4, -572, 74, 62, 26, -58, 36, -78, 17, 171, -50, 28, 46, 51, -141, 44, + -49, 40, 109, 113, 84, 40, -92, 43, -5, -8, 41, -105, 2, 73, 102, -65, -37, -123, 25, 130, -124, 53, 49, -863, -286, 902, 251, 144, -136, -24, -138, 184, -292, 395, 226, 185, 191, -140, -13, -16, 127, 266, -400, -237, -127, 304, 110, 170, 183, -42, -286, 94, 23, 551, 434, 114, 330, 18, -158, 68, -45, -76, 213, 261, 215, 534, 258, 209, 235, -242, -396, -186, 181, -338, -167, 329, 351, 192, -158, 310, -122, 34, 75, 178, -91, -193, 111, -174, -546, 24, 177, -298, 39, -54, -77, -54, + -176, 445, -46, 255, -638, -607, -514, -234, 53, 63, -16, 35, -10, -135, 67, -149, -43, -65, 156, 25, 57, -120, -22, -106, -38, 85, 135, 145, 139, -2, -92, 76, 123, 76, 122, 43, -11, 52, 18, 25, -36, -83, 99, 110, -36, -31, -24, -18, 444, 698, -1030, -146, 61, -8, -124, -257, 282, -330, -525, -54, 511, -74, -300, 94, -419, -228, 16, 268, -439, 48, 478, 491, 12, 173, 428, -246, -384, -536, 51, -534, -115, 224, 211, -473, -447, -272, 191, -126, -84, -125, 426, -634, -186, 98, -342, -118, + 0, -400, 18, 164, -23, 523, -36, -213, 44, -27, -173, 100, 257, -239, 366, -182, -685, 32, -268, -147, -20, -74, -904, -152, 413, 357, 249, 539, 548, -744, -84, 48, 153, -216, -371, -7, 167, 198, 168, 132, 62, 106, -199, 1, 117, -63, -47, 22, 37, 107, -120, 22, -49, 50, 68, -159, 21, -16, -111, 46, -27, 21, 3, -3, -140, 70, 7, 37, -94, -69, -63, -58, -985, 275, -184, 335, -316, -4, 515, -173, 732, 168, 141, -315, 138, 363, -224, -46, 473, 305, 356, 50, -548, 348, -354, -33, + -213, 54, -272, 158, -71, 154, 146, 262, 265, 294, -350, 83, 557, 119, -101, -112, -281, -226, -2, 21, 100, 470, 40, 259, 251, -18, -120, -114, 426, -498, -109, -440, -363, -102, 3, -738, 192, -232, 452, -94, 19, 314, 64, 759, 626, 904, 342, 39, -106, -92, -153, -44, -182, -498, 337, 413, 196, -67, 45, -350, -477, 222, 58, 66, -154, -65, -167, -90, 145, 49, 191, -12, 41, -109, 132, -394, -106, -13, -18, -74, 68, 19, 24, -27, -98, -19, -42, -26, 121, 15, 13, -80, 24, 21, -9, -175, + -131, -288, 389, -114, -85, 908, -187, -199, 1010, -14, 575, 424, 34, 238, -135, 187, 175, 112, 142, 467, -322, 563, -310, -9, 115, -76, -408, -364, -11, -590, -189, -645, -45, -383, -287, -210, -185, 97, -519, 603, 95, -391, -293, -18, -76, -96, 156, 83, 593, 68, -7, -303, 50, 123, -22, -323, -140, 372, 405, -24, -344, 141, -68, 529, 589, -230, -152, -109, 67, -226, 238, -733, -69, 868, -783, -386, -181, 56, 69, 104, -71, 233, -139, -39, 422, -66, 306, -207, 308, -269, 211, 172, 419, -8, -71, 177, + 276, 25, -66, -43, 28, -150, -46, 141, 186, 59, -60, 181, -141, 149, 124, 136, 75, 5, -220, 221, 131, 102, 49, 104, 193, 44, -152, 76, -124, -96, 160, -39, 139, 150, -59, -109, 62, -528, -289, -83, 409, 493, 338, -314, -805, 1394, 351, -875, -878, -132, 213, 594, -764, -135, 143, -11, -110, 798, 171, -469, 250, 33, -22, 420, -77, 230, -520, -176, 914, 338, 721, 228, 652, 114, -239, 459, 418, 655, 323, -740, -281, 160, 382, -297, 113, -286, -478, 48, -55, -286, 222, 310, 269, 196, 184, -141, + 495, -4, -491, -357, 445, 241, -772, 336, 137, 248, -675, -462, 434, 670, 379, -151, -722, 163, -32, 615, -206, -828, 347, 482, -183, 502, 413, 170, -330, 43, -4, 96, 36, -23, -176, -74, -221, -23, -44, 115, -135, -81, -45, -102, -62, -54, -62, 256, 77, 3, 250, -63, -235, -158, -126, -102, 11, -172, 72, 104, 88, 65, -226, -88, 190, 156, -23, 333, 650, 251, 686, 115, 315, 235, 1143, 1555, 122, 312, -990, -314, 599, -504, 1178, -234, 186, 317, 690, 383, -164, -499, -585, -193, -96, -734, -348, -292, + 471, -273, 140, -471, 63, -185, -686, 714, 495, 575, 253, -351, -339, -800, 15, -721, -219, -62, 95, 369, 291, -234, -166, 306, 675, 181, 258, 493, -627, 445, -356, -330, -633, -278, 290, 245, 41, 740, -162, -275, 114, 193, 1019, -336, 409, 402, -980, 0, 122, -217, -144, 338, -194, 28, 415, 214, -602, -724, -698, -327, -260, 581, 507, -140, -222, 29, 65, 383, -43, -121, 238, -45, -40, -102, 173, 236, -126, 226, 214, 219, 39, -93, 193, -134, 116, 246, 18, 147, 197, -334, -14, 163, 182, 245, 29, 219, + 12, 14, -75, 126, 185, 973, -231, 142, -435, -125, -581, 461, -835, 38, -673, 133, 288, 104, -403, 1381, -97, -186, 125, -786, 45, -531, 18, 149, -159, -18, 325, -289, 12, 417, 34, 105, -676, 86, -57, -42, -171, -838, -467, 207, 69, 372, -972, 106, -905, 459, -617, -987, 500, 910, 157, 447, -682, 675, -167, 101, -418, 562, 226, 583, 183, 707, -641, 122, 35, -110, -509, -415, -478, 542, -145, 737, -459, -352, 82, 98, -410, 213, -242, -962, 422, 636, 1057, 369, 749, -433, 1, -489, 802, 270, -154, -320, + 380, -275, -78, 40, -243, -409, -273, -194, -163, -545, -238, -455, 349, -87, 207, 408, 107, -310, -31, -310, -134, -463, -256, -489, -87, 799, 161, -62, 178, 239, -464, -214, -29, -63, -194, 202, -93, -711, -63, -165, -1611, 198, -515, 1492, -281, -753, 300, -43, -751, -129, 125, -452, 1127, 160, 108, 511, -634, -976, -601, 1375, -109, -293, 909, 512, -433, -431, -242, 1089, 153, -267, -426, -207, -851, 573, -99, 232, 548, -195, -881, -109, 1138, -50, -283, 547, -249, 679, 447, -59, -840, -430, -115, -780, -456, -450, 61, -108, + 657, -458, -158, -4, 1688, 585, -290, 341, 200, -100, 858, 416, -324, 134, 694, 783, -478, -342, -1147, -922, 525, -345, 567, -16, -674, 164, -53, 213, -448, -343, 635, 160, 85, -63, -73, 421, -201, 217, -107, 262, 534, 141, -385, 63, -148, 290, 241, 79, 348, 540, -212, 436, -42, -579, -149, 18, -323, 130, 421, -8, -212, 26, -78, 548, 471, 48, 223, 283, 149, 367, -470, -351, 169, 95, -99, -42, -78, -177, -174, -1822, 624, -391, 969, 985, -572, 465, -977, -1467, 35, -1032, 135, -130, 797, -593, 568, 488, + 799, -1219, 132, -746, -684, 73, -882, -569, 799, -234, 303, 933, -186, 307, -771, 88, -849, 786, -704, -468, -520, 877, 703, -505, 962, 637, -204, 955, -54, -1011, -280, -120, -788, 177, -1666, 166, -424, -800, -646, 743, -445, 1542, 1145, -1725, 0, -46, 82, 797, -1355, -945, 931, -777, -972, -1119, 75, 2297, 1141, -1069, -674, 93, 836, 320, -1117, 166, -747, -438, -40, -134, 43, 736, 174, 436, 289, -858, 231, 385, -122, -309, 46, -733, 653, 237, 178, -973, 162, 502, 142, -230, -182, 432, -710, -45, -529, -292, 695, -734, + -30, 438, -368, 343, 416, 109, 62, 306, 99, -391, 571, -441, -346, -199, -605, -208, -564, -540, 197, 846, -968, 466, -1617, -254, -639, -557, 834, -1109, -1724, 986, 1489, 352, -306, -1379, 78, 522, 519, -241, -563, 56, -151, -191, 158, -213, -474, -906, 97, -549, 117, -494, -1036, 622, 449, 768, 11, 832, 455, 116, -290, -442, -720, -512, -300, 189, 467, -335, -176, -1172, 1074, 1283, 702, -668, 672, -908, -31, 198, -1983, 153, 178, 922, -1191, 1508, 579, -1093, -632, 450, -206, -802, -992, -1058, -1450, 1050, -467, 161, -2209, -877, + 120, 19, 488, -354, 74, 369, 378, -1051, -255, 166, 565, 417, -105, -406, -187, -91, 526, 88, -355, -44, -279, -105, 486, 228, -264, 533, -549, -314, -414, 516, -221, 61, -253, 225, -756, 110, 294, 117, -145, -323, -294, -378, 361, 82, -141, -432, 435, 27, 18, 67, -772, -369, -509, 67, -159, -1502, -204, 541, -707, -660, 615, 622, 124, -598, -2032, -304, 393, 236, 877, -25, 508, -138, -16, -262, 35, 530, 59, 15, 519, -146, -128, -692, -66, -117, -79, 110, 413, 560, -114, -8, 444, -109, -861, -67, -765, 103, + 102, -1009, 724, -1388, 307, 371, -606, -52, 1786, -515, 602, -387, 318, -1348, 143, 773, -22, 665, -158, 60, -44, 853, -556, -679, 766, -719, -875, -23, -1397, 921, 775, -292, 299, 117, -9, -1203, -196, -104, 524, 184, -502, 459, -34, -619, -411, -390, 81, 68, -82, -28, 380, -389, -108, 247, -399, -231, 309, -426, 28, 349, 24, -117, 159, -29, 37, 303, -115, -113, -242, 91, -152, -162, 141, 158, -340, 40, -317, 293, -361, 186, -1, -81, 38, -96, -40, -743, -2241, -1055, -353, 729, 1647, -1514, 328, -440, -1527, -216, + 1368, 367, 1126, -955, 281, -332, 64, 665, 110, 360, -218, -1944, 573, 94, -827, 845, 644, -588, 595, 71, -635, 193, -393, 1214, 147, 491, 21, -1247, -1001, -337, -743, 811, 1164, 1199, 963, -334, 132, -980, -150, -99, -415, -517, 81, 95, -1349, -394, -529, -37, 600, -662, -156, 233, -2, 693, -771, -31, -873, -457, -647, 355, 228, 693, -97, -72, -824, -246, -393, -103, 343, 475, 971, -625, 173, -541, 190, 365, 97, -298, -127, -104, -127, -44, 252, 271, -82, -32, -136, -192, 119, 270, 85, 30, 67, -227, -271, -247, + 403, -11, 277, 234, -46, -319, -349, 51, 88, -264, -92, -230, 162, -166, 50, 49, 170, -89, -113, 44, 56, -136, 583, -941, -3714, -1959, 402, 1563, 3499, 2673, 1507, 507, 786, -250, -1472, -2848, -3788, -959, -1097, 57, 1846, 2631, 1765, 2357, 543, 499, -275, -1192, -1349, -1092, -1159, -1434, -1149, -492, -73, -18, 920, 1193, 2282, 1078, 356, 937, 1457, 464, 279, -1176, -1609, -2631, -1215, -1380, -998, -595, -466, 194, 324, 1104, 2264, 1820, 1987, 1470, 1802, 1340, -1083, -994, -2502, -1940, -1418, -3190, -2466, -1510, 121, 1933, 1845, 2177, 2726, 2329, + 1256, 1511, 61, -594, -1597, -2323, -2330, -1925, -1155, -251, 333, 560, 647, 1074, 779, 1257, 798, 313, 207, -51, -123, -33, -870, -612, -122, -408, -1039, -295, -372, -390, -70, 776, 1475, 1218, 131, 1197, 848, -160, -985, -1566, -1450, -661, -716, -453, -248, 410, 912, 1259, 1438, 1031, 407, 439, -274, -791, -1324, -1193, -525, -58, -387, -132, 382, 476, 496, 463, 121, 189, 298, -59, -263, 10, 97, -196, -214, -48, 65, 23, -151, -89, 25, 10, -58, -100, -35, 110, 116, 57 }, + {-48, -68, -130, 75, 121, 215, 58, -151, -269, 58, -126, 10, 84, 32, 217, -180, -45, -25, -15, -155, 95, 40, 19, 4, -76, -58, -55, -18, 7, 36, -57, 82, 194, -7, 86, -138, -81, -165, -80, 175, 8, -36, 31, 186, 20, 93, -24, -88, -28, 106, -92, 166, 102, 188, 92, 12, -58, -125, -70, -108, -17, -79, 31, 7, -43, 27, -37, 67, -17, -19, 94, -10, -7, 13, -93, 42, -68, -109, -63, -48, 47, -9, -8, -123, -21, 32, 23, -49, 4, -48, 21, 35, 25, 10, -9, -20, + 5, -38, -21, 8, 5, 17, 16, 15, 2, -375, -85, 154, 27, 209, 112, -173, 45, -4, 69, -62, -288, 166, 102, 190, 238, 205, 72, 3, -293, -30, 134, -134, -116, -306, -21, -51, -36, -78, 36, -183, 83, -32, 77, 23, -123, 95, 79, 212, -25, -170, -88, 92, 37, -43, 9, 68, 9, -124, -1, 26, -14, 8, -79, -34, -105, -21, 128, 46, -44, 55, -17, -7, 19, -149, -14, -7, 83, 162, -48, -16, -105, -81, 41, 184, -163, -25, 41, -9, -45, -3, -43, 60, 62, 33, 102, -49, + -32, -10, 24, -23, 4, 17, 14, -12, -43, 32, -43, 207, 78, 70, -69, 5, 20, 20, -356, -193, -16, -89, -110, -5, -93, -362, 216, 50, 98, -38, 74, -96, 5, 13, 187, -66, -39, -31, -31, -30, -13, 202, -39, -3, -115, -6, -56, 66, 33, -196, 152, -198, -4, 174, -25, 7, 13, -4, -122, -86, 200, 116, -247, -132, 39, -145, -105, 106, -178, 35, 43, 102, 213, 163, 100, 76, -145, -151, -129, 42, 185, 72, -32, -83, 61, -70, -30, 43, -69, -104, -14, 83, -15, -71, 9, 1, + 81, 34, 75, 17, -34, -35, -28, -15, -9, 24, 47, 56, 59, 272, -67, -69, -81, 77, -91, 133, -258, -33, 192, 100, -194, 144, 236, 223, 142, 27, -9, -146, -188, 80, -18, 188, -15, 112, -117, -78, -63, 19, 60, -11, -229, 48, 79, 58, 99, 61, -124, -306, -99, 45, 59, 14, -13, 58, -126, -2, -228, 107, -235, -62, -100, -155, 113, 50, 48, -135, -66, -40, -136, 13, -12, 72, -58, -114, -87, -271, 86, 31, 116, 172, 219, 85, -86, -129, -61, 119, 119, -135, 147, 6, -95, 212, + -41, 48, 36, 62, -4, -47, 14, 66, 24, -10, 71, -37, -29, -52, 24, 6, -26, 39, -38, -68, -29, 52, -12, -12, 19, 136, 126, -22, 89, -263, 31, -125, 14, 39, -165, 60, 484, 53, -42, -272, 390, -1, 164, 19, -8, -212, 206, 53, -113, 27, 16, -84, 83, 217, -63, 230, -68, 99, -3, 152, 135, 151, 2, -82, 119, -87, 105, -30, 106, 102, 99, -13, -30, 39, -85, -123, -314, 206, -203, 142, 19, 60, -36, -375, -81, -101, -182, 25, 114, -241, -76, 109, 20, 171, 298, -8, + -80, -71, -309, 95, 60, -69, 17, 123, 127, 37, 33, 89, 11, -14, 133, 78, -72, 136, 100, 133, 41, -23, 10, -9, -9, -49, 18, -30, 31, -38, 63, 22, 6, 52, 5, -16, 15, -11, -4, -18, 62, 38, 13, 44, -13, 70, 10, 23, -137, -166, -16, 89, -53, -80, -121, 35, 220, 99, 35, -500, -230, -70, 102, -60, 169, 571, 177, -209, 32, -248, -80, 174, -197, -50, 254, 62, -64, 36, 144, -86, 70, 76, 75, -141, 65, -66, -81, -209, -82, -122, -233, 102, 8, -16, 235, 172, + 60, 189, 1, -239, 201, -23, -164, -129, -238, 11, 286, 20, -126, 122, -213, -133, 110, -172, -230, -120, -73, 130, -203, -63, -95, 261, 38, -90, 128, -78, -95, 15, 207, -39, 14, 115, 66, -264, -10, 161, 77, 94, -21, -51, 118, -71, 20, -58, 34, 45, 61, -134, 1, 14, 34, 8, 1, 63, -12, -12, -59, 46, 174, 125, -324, 307, -116, 28, -142, 263, -37, -178, -579, -77, 301, 74, -452, 206, 0, -93, -145, -118, -45, -269, -45, 217, 282, 336, 204, 306, -101, 241, 116, -477, -11, 124, + 169, 82, -164, 9, -34, 168, -286, -103, 212, -70, 119, 63, -191, -212, -109, -317, -90, -98, 130, 47, -183, -42, -391, -99, 160, -115, -387, -6, 219, -469, 136, 78, 149, -223, -103, -212, 16, -64, -240, -64, -40, 144, 81, 351, 22, 3, 56, -27, -178, 221, 77, -92, 194, 35, -97, 31, -6, 117, 27, 22, 74, -64, 3, -68, 0, -55, 54, -23, 23, 65, 9, -43, 62, 14, 66, 17, -19, -359, 81, 288, 371, 277, 283, 110, -195, 198, 344, -507, 255, 255, -544, -142, 134, 587, -45, -37, + -139, -164, 726, 360, 101, 91, 377, -6, -57, -140, 57, -326, -294, -67, 92, 219, 100, 50, -111, 22, -239, 100, -355, 349, -38, -173, -204, -232, -358, 63, -346, -116, 239, -55, -118, -113, -55, -296, -206, -133, -126, -67, 109, 62, 18, 17, -262, 452, 260, 7, -33, 594, -71, -102, -146, -300, -82, 199, 191, -29, 233, -461, 137, -175, 44, 178, -62, -3, 29, 16, 57, -72, 86, 111, -103, 43, 59, 73, 189, -141, -13, 21, -3, 45, 21, 47, 60, -51, 38, -16, 5, -101, -22, -23, 86, 668, + 228, 141, 324, -366, -220, 209, 223, 496, 72, 138, -334, -19, 165, -438, -141, 176, -147, 6, 120, 325, -110, 127, 66, 72, 276, 241, 294, -232, -156, 320, -406, -134, -135, -27, -110, -259, 252, -9, -280, 14, -111, -291, -364, -202, -219, 429, -138, -109, -255, -21, -130, 67, 505, -95, -166, 86, -31, 292, -339, 573, 114, -551, -402, 145, -372, 6, -398, 2, 84, -51, 429, 538, -257, 65, -107, -399, -150, -217, -261, -60, 195, -136, -307, 202, 12, -166, -141, 66, 112, -50, -33, -157, 7, -145, -30, -73, + 99, 113, 26, -144, 14, 9, 91, -2, -37, 7, -181, -20, -103, -72, 13, 40, -96, 73, -56, -52, 121, -49, -120, -583, 224, 1213, -207, -11, -528, -221, 362, -50, 698, 420, 388, 5, 300, -567, 520, 271, 27, 70, -327, 146, -2, 530, 297, 354, -125, 37, 94, -351, -283, -127, 164, 618, -168, -205, -207, -114, 82, -388, -111, -23, -207, -412, -85, -523, -189, 312, -363, -157, -70, 32, -590, -354, -75, -59, -111, 376, 167, 28, 228, 388, -234, -95, -320, 150, -251, 220, 251, 302, 545, 157, -406, -63, + 912, 300, 514, 251, 158, -31, 65, -211, -273, 128, 93, -269, 75, 195, 175, -258, 208, 74, 151, 176, 2, 87, 146, 63, 171, -12, 39, -48, -111, 29, 149, 27, -61, 242, 154, 134, 8, -24, -36, -1, 11, -33, 86, 70, 68, 77, 39, -120, 625, 685, -691, 170, 508, 307, -192, -367, -318, 715, 59, 269, 375, -213, 106, 157, -437, -464, 378, 129, -676, -155, 879, 422, -1, -501, 165, 132, 534, 177, -260, 350, 62, -146, -50, -105, -416, -196, 64, 73, -497, -536, -318, -153, -591, 352, -37, -419, + 80, 11, -182, -50, 127, -2, 134, 156, 238, -232, -277, 367, 742, 337, 203, 543, -102, 296, 722, 443, 68, 82, -226, -441, 430, -420, 189, -167, 131, -550, 264, -6, -181, -103, 313, -296, -150, -76, 47, -6, 92, -117, -15, -211, -54, -11, 39, -63, 73, -78, 63, -70, 240, 76, -62, -111, 91, 11, 83, 77, -58, 69, 88, -58, 23, 110, -33, 40, 120, 127, 219, -141, -648, 182, -313, -144, -242, -41, 555, 550, -1113, 344, 353, -346, -566, -738, 130, -217, 137, -258, -203, -120, 689, 174, -60, -12, + -110, -206, 174, 114, -3, 276, 60, -59, 98, 250, 710, 71, 87, -352, -151, -167, -177, -22, -59, 235, 340, 16, 393, -92, -67, -81, -44, -690, 777, 19, 55, -58, -202, 205, -53, 314, 18, -302, 82, 333, -238, 310, 76, -476, -81, -103, -864, -296, 221, 222, -353, -204, 206, 28, 578, -461, 210, 257, -37, 225, 209, 255, 98, 113, 103, 84, -38, -48, -149, 58, 216, 37, -158, -63, -89, 50, -69, -60, -106, 139, 79, 94, 10, -253, 101, -257, 20, 40, 90, -122, -58, -39, 83, 152, 69, 63, + 22, -181, 565, 161, 173, -417, 308, -168, 293, -234, 379, -348, -285, 521, 63, 132, -314, -699, -69, 202, 52, 297, -251, 37, -6, -522, -378, 170, -590, -387, 185, 0, -617, -90, -309, 389, 232, 69, -146, -387, -821, 287, -369, 446, -138, -152, -79, -219, 122, 115, -657, -291, 641, 561, -585, 753, 36, 554, -136, -135, -73, -221, 286, -218, -613, -326, 721, -164, -149, -42, 221, 142, 363, -835, 243, 565, 444, -185, -50, -182, -381, 40, 343, 535, -334, -337, -382, -41, -65, 32, -185, 91, 91, -67, -30, -84, + -169, 158, 0, 22, -255, -214, -60, -277, -110, -141, 27, -100, -3, 208, -89, 85, -7, -200, 35, -103, -29, 81, 181, 23, 74, 169, 168, 225, -76, -65, -46, 231, -41, -382, -26, 390, 303, -296, -503, -422, -248, -489, -28, 231, 536, -93, -26, -899, 538, 670, -107, -365, -371, -230, 1008, -615, -3, -73, 272, -46, 1161, 28, -633, -167, -601, 783, 681, -551, 640, 160, 515, 193, -971, 304, 518, -672, -187, -763, -382, 26, -704, -600, -18, -486, -8, 171, -175, -482, 394, 359, -794, -606, 330, 140, 212, 402, + 524, -193, -286, -16, -186, -10, -60, -266, 104, -1101, 374, 536, -570, -468, 354, -358, -326, -155, 197, 29, 682, 6, 398, -38, -280, 149, 205, 215, -181, 6, 21, -24, -117, -271, 179, 288, -148, -478, 121, 43, 507, -47, -200, 159, 55, 256, -1, -154, 3, 209, 153, 53, -56, 41, -96, -78, -239, 122, 113, -161, 78, 74, 43, -25, -81, 23, -230, 256, 621, 1159, 1824, 63, -725, -937, -213, 46, -217, 891, 670, 466, 775, 567, 459, 39, 371, -464, 672, 777, 60, 808, -322, 74, 193, -737, -493, -168, + -436, -514, -70, 829, -4, -150, 110, 184, -104, -1105, -145, 300, -157, -332, 145, 440, 772, 198, 397, 551, 674, -912, -631, 372, -260, 1181, -114, 1016, -804, 490, 828, 41, 141, 502, -880, -402, 31, 517, 22, 594, 245, 230, 603, 225, -71, -240, -696, -152, 49, 197, 22, 26, 24, -373, 208, 145, 340, -103, 258, 419, 251, 114, 7, -38, 94, -130, 92, -124, 12, 95, 91, -108, 192, 189, 231, 36, 26, 105, -72, 164, -106, 165, 360, -32, -60, 38, 314, -177, 80, -25, -38, -47, 50, 96, 146, 116, + 113, 296, -193, 349, -158, 1310, 442, 466, 958, -60, 211, 422, 619, -669, -535, -222, -588, -96, -793, 422, 650, 477, 645, -419, -229, 501, 391, -259, 654, 397, -139, -779, 447, 489, -392, -50, 239, 123, -626, 742, 205, 795, 439, 317, -418, 376, -217, 1208, -935, 112, 372, -171, -600, 398, 392, -67, 386, -358, 988, -445, 268, 220, -610, -262, -846, 372, 261, -630, 606, 516, -430, 372, -36, 999, 335, -490, -353, -349, 324, -201, 278, -121, 70, 339, 221, 172, -315, 859, 106, -325, -473, 417, 217, 394, -210, 119, + 321, 648, 176, -102, 548, -141, -143, -72, 65, 148, -308, -278, 134, -240, -136, 33, -104, -32, -29, -236, 179, 98, -449, 112, -332, -213, -98, 170, 102, 317, 151, -10, 102, 116, 148, 11, 51, 72, 283, -90, -1161, 506, -992, 1011, 1216, -73, 206, -1003, -17, -230, 94, 571, 585, -183, 300, 473, 69, 194, 132, 192, -133, 694, -105, 152, -398, 782, 164, -81, -33, 703, 265, 329, 778, -181, -492, 958, -1031, -448, -184, 222, 672, 153, -285, -292, -501, -15, -96, 193, 1082, 1054, 666, 950, -93, 1432, -485, 398, + -346, 32, 447, -223, 49, -432, -560, 8, -353, 293, -478, 708, -537, -859, -359, -221, -81, 1034, -628, -144, -91, -649, -167, 378, 810, -71, -38, 32, -269, -557, 20, -24, -87, -57, -2, -321, 257, -275, 318, -126, -248, -268, 64, 256, -182, -229, -84, 213, 232, -168, 108, 143, 81, 143, -136, -119, 64, 16, 145, -179, 128, 237, -12, -74, -122, 208, -418, -194, 411, -247, -31, -63, 79, -253, 185, -79, 377, 327, 5, -408, 1787, 2481, 761, 1935, -424, -1347, -944, -660, 326, 356, -450, -724, 626, 842, 492, 840, + 648, 160, 257, 127, -43, -553, 243, -655, 461, 4, -614, 710, 429, 340, 1226, 754, -353, -237, -443, -524, -643, -254, 24, -508, -159, 1061, 1609, 1186, 161, 809, 862, 1319, 603, -700, -1150, -717, -734, 433, 362, -1569, -1077, -278, 660, 1427, -1071, -43, -930, -121, 1166, -643, 438, -933, -154, -279, 786, -875, -501, 14, 346, -711, 1628, -385, -28, 926, -409, 695, -225, -576, -449, 269, 24, 229, 142, -515, 11, -218, 621, 364, 107, 339, 386, 20, -8, -126, -393, 794, -250, 165, 3, -464, 15, 48, -150, -306, -70, -181, + 40, 115, -140, 24, 537, 383, -75, -91, 509, -219, -70, -438, -631, -239, -171, -75, -176, -709, -1371, 160, 754, -639, 1172, -477, 463, -164, -1367, -705, -71, -808, -1843, -523, 659, 1013, -502, -794, -1645, -495, 479, -334, -480, -822, 189, -192, -142, -161, 327, 650, -516, 500, 430, -526, -1500, 114, 118, 378, 177, 971, 96, -1497, 7, -1648, -11, 560, 684, -136, 89, 752, -401, -299, -515, 483, 356, -245, 585, -193, 245, 264, 959, 119, -343, -1039, -357, 524, 462, 808, 1190, 2052, 1025, 486, -539, -2082, -570, -310, 1582, -277, + 97, -18, -501, 57, 462, 210, -13, 11, 7, -9, 765, -289, -230, -267, 531, 191, 268, -222, -656, 203, 276, -312, -45, 153, -39, 37, -117, -956, -310, -90, 431, 663, 80, -577, -549, 237, 91, -66, -93, 16, -58, -43, 503, -568, 71, -491, 505, -292, 12, -702, -107, 446, -143, 232, 108, -1336, -408, 925, -459, -386, -101, -302, -1072, -1192, -1742, -552, 2, -137, 1138, 311, 1487, 916, 460, -211, -551, -105, 2085, 127, 600, 336, -263, 1036, -435, 836, -917, -94, -661, 786, -1113, -237, 339, 347, 356, -976, 691, -1117, + 225, -549, -374, 1105, 65, 69, 381, -424, -25, 286, -1352, 33, 311, -200, 869, -393, -171, 1459, -555, -1221, 3, -463, 98, -96, -65, -981, 522, -163, -1334, 799, -1652, 317, -379, -658, -1045, -139, 282, 476, 43, 385, 482, -574, 1006, -237, 269, -18, 480, -26, -54, -168, 284, -605, -77, 192, 130, -238, -4, -266, -348, 175, 143, 260, 170, -81, 204, 594, -296, -316, 104, -34, 117, 439, -64, 237, 226, 224, -301, -366, -90, -34, -379, -27, -75, 155, -414, -578, -2037, -2093, -1787, -901, 3694, 1157, -462, -483, -1830, -3874, + -438, 1040, 1297, 557, -598, -448, -1144, -1259, 943, -908, 2328, 1745, -2721, 876, 354, -573, 208, 1947, 275, 1342, 2666, -585, -2197, 99, -378, -2048, -562, 983, -94, 1212, 1960, 171, -1708, -3340, -2868, -2565, -274, 2476, 702, 657, 368, -679, -3346, -2095, -1075, -412, 200, 750, 728, 937, 960, 1195, -1444, -524, -1184, -106, -1295, 796, 796, 1637, 1819, 866, 23, -492, -342, -2256, -1796, 1567, 2455, 1669, 1961, -478, -882, -1785, -1017, 520, 0, 116, 548, 180, 136, -437, -575, -289, -435, 10, 430, 117, 165, -105, 250, -477, 312, -146, -441, -435, + -133, -720, -223, -442, 449, 505, 244, 193, -467, -958, -946, 246, -92, 424, 374, 196, -691, -354, -658, -1015, 301, 606, 708, -263, -3708, -4153, -2823, -2904, -773, 3261, 2198, 3519, 3921, 5953, 3956, 4093, 2643, -200, -2938, -5084, -6004, -5212, -4109, -2974, -717, -150, -427, 152, 1295, 2129, 2956, 2568, 3503, 3382, 4372, 3996, 1126, 2682, -580, 733, 543, 151, -369, -3897, -4675, -5982, -7014, -6380, -3543, -3153, -2590, -3250, -3757, -807, 921, 2357, 3459, 5001, 5978, 7668, 10123, 9824, 7465, 6052, 5041, 2662, 4234, -1719, -3449, -8264, -9458, -11767, -11301, -10343, -9796, -9471, + -5827, -3616, -1963, 5284, 5390, 8230, 10579, 9164, 8285, 8373, 6585, 5013, 2761, 360, -36, -1555, -1882, -2740, -3540, -4874, -5258, -4797, -5519, -4276, -3916, -3708, -3247, -1684, -326, 1726, 3577, 3344, 5226, 5762, 6367, 7500, 6078, 3537, 1775, -1083, -2753, -2769, -5332, -4954, -6764, -5401, -5606, -3615, -3764, -2217, -275, 1896, 2874, 5045, 5894, 5702, 5558, 5393, 4159, 1466, -941, -1373, -1765, -1962, -2196, -2601, -2387, -1778, -1896, -1709, -1467, -1080, -500, -358, -287, -50, 179, 92, 161, 464, 677, 781, 847, 715, 746, 1031 } + }, + { + {409, 48, -178, 63, -112, 31, -73, -45, -98, 72, 123, 37, 39, -221, 45, 5, 71, 87, 48, 130, -25, -70, 15, 154, 3, -115, -10, 132, 72, 16, 3, 38, -2, 12, 27, -2, -45, -4, 3, 53, -75, -178, 134, 134, 117, 110, -4, 61, 105, -107, -23, -1, -143, 34, 12, 133, 15, 75, 4, 166, 85, -22, 117, 72, -36, -133, 36, 37, -34, 12, -74, -18, 71, 50, 59, 138, -21, -41, 21, 83, 188, -108, 52, 52, 56, -4, -10, 59, -30, 3, 29, -33, -4, 7, 12, -21, + -32, 24, -6, 6, -11, 36, -2, 42, -8, 346, -231, 78, 195, 46, 138, 166, -151, 32, -13, 65, -191, -152, -28, 149, 202, -77, -66, 97, -163, -219, -40, -258, 89, 86, 24, -160, -162, 58, -94, 22, -4, 170, 180, 162, -26, 113, -177, 77, -104, -10, 10, 139, -149, -133, 2, 182, 76, 71, -110, 62, 46, -54, -227, -37, -77, -100, -89, 104, -95, -31, 24, 65, 164, -63, -3, -124, -59, 25, -170, -11, 47, 117, -36, -89, -44, -179, 85, 52, 11, -15, -153, 63, 14, -55, 57, -22, + 14, 51, 6, 10, 60, 26, 13, 1, 48, 17, -8, 19, 29, -122, -221, -55, 38, -68, -112, -62, -221, -124, 233, -10, -103, 124, -187, -43, -233, -49, -184, -96, 216, 11, -44, -243, -152, -55, -104, 41, -130, 13, 80, 258, 126, 97, 112, 209, -175, -2, -53, -135, 56, -28, -53, -142, 74, 149, 16, -108, -69, 381, 2, -110, -153, -229, -305, -38, -158, 36, -31, 85, 16, 41, -140, 21, 23, 184, 62, -138, 8, -43, -41, -33, 66, 99, 97, -90, -88, 55, 26, 36, 40, -35, -135, -159, + -19, 29, -38, 16, 1, -22, -33, -50, -19, -10, -30, -55, 5, 18, -30, 10, -26, 5, -33, -17, 7, 9, -40, 6, -15, -71, 7, -25, 40, -532, 211, -95, 89, -220, -89, -172, -158, 11, -50, -108, 271, 70, -25, -164, -52, 76, -188, -100, -179, -100, 259, 25, 173, -16, -2, -43, 49, 48, -137, 2, 41, 78, 281, -147, -170, -34, 311, 98, 331, 29, 31, -58, 164, -28, 241, -24, -28, -43, -100, 103, 31, -86, 70, 91, 167, -97, -8, -30, 149, -61, -25, -56, -38, 36, -49, 18, + 25, -36, 37, -247, 24, 161, 56, 215, 17, 23, 52, 137, 220, -145, 21, -11, 52, -7, -6, 66, 142, 55, 70, 8, -25, -37, 19, 72, -25, 33, 33, 35, -1, 15, 60, -10, 16, -2, 70, 41, -23, -4, 75, 39, -23, 56, 31, -114, -56, -2, -263, -44, 2, -131, -466, -113, -101, -203, -40, -52, 292, -101, 221, 103, 159, -300, -135, -303, -281, 0, 53, 176, -85, -132, -81, -205, 44, 93, 107, 66, -62, 76, -137, 15, -246, 89, -64, 34, 54, 92, 98, -94, 4, 239, -128, 116, + 121, -8, 73, 117, -48, 46, 116, 6, 204, -107, -141, -68, 67, -1, -271, -138, -300, -327, -56, 88, -266, 119, -43, -5, -91, 89, -159, -26, -55, -224, -197, -66, 117, 4, 100, -43, 65, 52, -124, 0, -25, 70, -83, -140, -46, 19, 0, -54, 24, -34, -13, 22, -7, 1, -3, -32, -7, -31, -21, -20, -1, 14, 2, 39, 15, -19, 150, -433, -21, 135, 85, -230, -28, -146, 38, 44, 31, -251, -337, -230, 39, -183, 201, 64, -324, 234, 205, 162, 146, -161, 264, 70, -2, -103, 89, 158, + -145, -213, 79, -80, -263, -35, -254, -93, 461, -123, -207, -257, 15, 42, 184, 73, -169, 154, -19, -133, -175, -186, 284, 127, 179, -135, -185, 83, 46, -191, -9, -117, 184, -36, 17, -225, 144, 120, -128, -83, -79, 255, 3, 37, -73, 175, -178, -304, -135, 26, -58, 165, -34, -19, -177, -94, 77, 10, -126, -82, 108, 58, -34, 4, 2, 0, -34, 46, 21, 72, 12, 12, 3, 31, -15, 45, -59, 62, -233, -10, 57, -59, -186, -276, -221, 222, 26, 273, 326, 316, 48, 434, 104, -49, 201, 153, + 401, 58, 231, -317, 521, 383, 185, -158, -125, 188, 43, 135, -77, 225, -67, -58, 202, 164, -206, 139, -55, 219, 238, -467, -86, 288, 87, 157, 124, 285, -137, 114, 6, -240, -117, -7, 50, -352, -29, 223, -175, 374, 281, -113, -3, 72, 141, 218, -84, -70, 354, -84, -7, 154, 8, 207, 166, 68, 115, 120, 115, 53, 49, -49, -82, -35, -74, -9, -52, 39, 36, -75, -58, -9, 58, 116, 98, 55, 12, 58, -98, -45, -52, 22, -38, 52, -115, 13, -1, 100, 41, 5, 19, 104, 33, -89, + 31, -8, 906, -474, 66, 374, -36, 14, 495, 543, 64, -41, 114, -26, 123, 156, -198, -61, 321, 283, -132, -258, -276, -286, -155, 238, -183, 105, 13, -334, -23, -222, -27, 96, 146, -433, -204, -345, -108, 524, 75, -46, 46, -47, 25, 156, 90, 262, -15, 196, 116, -181, 115, -276, 7, -277, -291, 111, -320, 136, -4, 164, 129, 119, -171, 200, -290, -5, -134, -44, 363, 14, 181, 182, -38, -68, 140, -299, 120, 288, -427, -312, -88, 218, -21, -260, 98, -36, 112, -95, 34, -53, 187, -33, 172, 98, + 161, 58, 44, -83, 109, 51, -5, 67, 55, -29, 81, 67, -41, -40, -140, -26, -81, 0, -5, -44, 71, -22, 41, 18, 144, -112, -541, 101, 130, -366, 165, -3, 383, -101, -195, 162, -474, -163, 399, 175, -244, -586, 260, -81, 143, -374, -496, -336, 428, 35, 236, -41, -227, -336, 158, -90, -293, -342, 24, -305, -236, -128, -61, -331, 185, 222, 299, -143, 265, -214, 421, -78, -23, 321, 164, -79, -217, -108, 309, 72, -231, 110, 328, 311, 133, -380, -421, -37, 81, 26, -303, 91, 333, 97, -143, -538, + 143, -234, -526, 17, 27, -296, 426, -31, -176, -582, -4, -171, -28, 219, -131, -222, -16, 50, 52, -176, -179, -177, 65, -153, 9, -28, 24, -42, 42, 78, 69, 90, 44, 161, 204, 12, 59, 38, -80, -22, -66, 25, 22, 12, -199, 23, -18, -72, -10, -65, 59, -79, -84, -669, 420, 324, 357, 51, 377, 39, -241, -279, 43, 303, -208, 71, -451, 311, 330, -165, -93, 77, 361, 264, -185, -165, 247, -294, 103, -402, 1, -118, -540, -556, 110, 324, 151, -475, -256, 367, -403, -165, 326, -85, 407, -140, + -281, 109, -410, 477, -48, 87, -220, -110, -17, -442, -269, 39, -70, 47, -142, -468, 91, -387, 177, -95, 284, -467, 214, 84, -131, 354, -42, -238, -460, -59, 104, -370, 279, -249, 182, -489, -500, 242, 193, -198, -156, 163, 111, -104, -87, -132, -172, -13, -278, -27, -39, 24, 79, -49, 80, -51, -16, -149, -74, -38, -18, 227, -65, -28, 131, -137, 98, 59, -53, -31, -140, -127, -5, -73, -89, 219, -212, 73, 261, 385, -101, 43, -136, -513, -109, -110, 224, -451, 0, -260, 281, -315, -429, 286, 133, 186, + 594, -98, -168, 167, -378, -442, 38, 566, 174, 318, -224, -278, -449, 90, 577, -258, 303, 69, 449, -685, -216, -12, 82, 390, 190, -523, -139, -243, -19, -602, -92, -217, 44, -317, -19, 73, -874, 100, -272, 53, -344, -20, 218, 109, -115, -112, -460, 464, 450, 146, 114, -403, 616, 212, 319, -122, -962, 375, -30, 723, 683, 213, -84, 298, 19, 261, 18, 29, -167, 80, -152, -85, -40, 314, -1, 17, 85, -22, -166, -89, 33, 126, -56, 62, -96, 131, -100, -163, -77, -25, 80, 27, -30, -30, -31, 206, + -41, 10, 39, 102, 831, 293, 569, -551, 129, 580, -174, -208, 82, -358, 274, 70, -418, -548, -41, 466, -11, -37, 305, -454, -115, -373, 211, -636, 11, -136, 232, -664, -459, -290, 195, 215, 149, -215, 162, -160, 198, -131, -58, -45, -186, 127, 295, 176, 297, -24, -287, 42, -286, 764, -192, -750, -233, 206, 652, -651, -268, -42, 419, 28, -922, -112, 426, 880, 33, 613, 883, -65, 285, 418, -115, 753, -101, 910, 145, -249, -788, -493, 6, 238, 114, -119, -153, -244, -334, -296, 361, 106, -4, -517, -58, 20, + -94, -294, 77, 156, -44, -152, -111, -288, -174, -84, 182, -35, -157, 158, -226, 163, 164, -141, -274, 251, 372, 58, 11, 23, 216, -64, -258, 31, 251, 209, -257, -217, 40, 42, 4, 76, -40, 350, 423, -724, -705, 188, -164, 23, -280, 660, -295, -188, 230, 166, 7, -300, -220, -366, 148, -20, -177, -28, 439, 659, -711, -44, -693, -73, -179, 689, -290, -276, -133, 419, 140, 117, 176, 169, -124, 9, -89, 113, -81, 645, -167, 172, 454, -235, -520, 117, 178, -182, -199, -42, 108, 328, -445, 598, 879, 591, + -246, -354, -812, -1048, -385, -3, -189, -52, -119, 252, -21, -404, 214, -178, -38, 387, 644, -156, 181, -112, 36, 587, 296, 502, 510, -406, -124, -92, 15, -8, 182, 14, 112, 514, 22, 241, -108, -111, -210, -63, 31, 236, -64, -192, -91, 115, -80, -41, -60, 73, 19, -73, -40, 55, 27, 29, 296, -118, 8, 41, 5, -160, 75, 95, 190, -373, 707, 319, 403, 604, 933, -357, 483, -959, -117, -430, -943, 383, 225, 288, 127, 375, 115, -678, 573, 1011, -150, -162, 248, 101, -210, -899, 75, 4, -81, 13, + 307, -643, 140, 183, -131, -371, -180, -413, 423, -924, -133, -594, 331, 134, 336, -117, 92, -236, 567, 171, 466, -422, 457, -10, -446, 924, -152, 114, 624, -598, 699, 418, -546, 232, -208, 308, -758, 555, 80, 195, -70, 180, -616, 393, 701, -1391, 143, 1343, -866, -278, 96, 654, 465, 162, 406, -182, 245, -101, -295, 147, -65, -50, 253, 366, -30, -142, -121, 109, 235, -309, -115, -212, -131, -277, 279, 367, -76, 169, -103, 69, 234, 263, -301, 26, 113, -158, 242, 13, -3, 218, 113, -261, -218, 75, 37, -79, + 46, 561, -343, -412, -15, -395, -180, -1040, -888, -125, -510, -613, -442, 269, -158, -311, -498, 456, 29, -752, -120, -7, -358, -115, 303, 216, -54, 0, 13, -191, 158, 347, -132, -86, 536, -1012, -166, 281, 1075, -449, -280, -404, -548, 235, 1141, 209, 707, 143, -117, -63, -86, -554, 120, 122, -450, 96, 891, -148, -276, 146, -321, -77, 785, 1159, 313, 695, 806, -290, -338, 89, -267, 43, -799, -11, -623, 186, 130, 376, -649, -246, -221, -257, -203, -231, 360, 74, 465, -122, 177, 461, -86, 13, -68, -188, -149, -29, + -112, -173, -3, 67, -88, 27, 217, -222, -198, 11, 163, 81, -105, -327, -314, -42, 74, -195, -106, 64, -65, 30, 23, 217, 75, 52, -241, 264, -112, 828, 935, -372, 2112, -288, 50, -389, 250, -163, 247, 544, 155, -504, -273, -527, -7, -357, -653, 90, 427, -70, 125, 204, 251, -2, -187, -245, 127, 0, -324, 130, 909, 643, 366, -767, 554, 434, -201, -233, -234, -306, -131, 252, -556, 56, 71, 337, 867, 170, 181, 50, -102, -172, 377, -225, 875, 284, -83, 385, 74, -586, -422, 499, 574, 216, -142, 384, + 411, 587, 1142, 126, -327, -584, -391, 300, 66, 99, -53, 405, 44, -45, -531, -259, 556, 626, -220, -419, -503, -142, 272, 174, 51, -166, 45, 4, -222, 7, -492, -124, -18, 359, -63, -103, 4, 292, -171, 211, -106, -227, 202, 289, 184, 206, -24, 220, 409, 184, 175, 123, -149, -62, 13, -30, 124, -109, 201, 265, 154, 25, -196, 84, 73, 214, 342, -328, 1509, -224, 64, 167, -114, -21, 379, -281, -332, -174, 489, 437, -1167, 225, 201, 478, -298, -461, -438, 334, 303, -470, -256, -193, 787, 395, 222, -152, + -811, 231, 207, 420, -98, 223, -223, 80, -704, 294, 292, 11, -172, -443, -876, 571, -367, 294, 304, 504, 74, -535, 896, 175, -867, -404, 526, 124, 687, 289, 117, -620, -302, 347, -1075, 1163, -826, 47, 704, -188, 1390, 208, 257, -502, 1619, 168, 1056, -713, -313, -224, 416, -44, -157, 731, -597, 705, -830, 181, 93, 153, -154, 622, -66, 317, 288, 413, 243, 122, 298, 323, 21, 119, 45, -217, 286, 9, 200, 391, 205, 26, -10, 300, 331, 162, -173, 654, -19, -129, -117, 420, -308, 147, -60, 226, 24, 95, + 134, -89, -62, 65, 136, 109, 141, 168, -187, 530, 1245, 414, 782, 997, -42, 1143, -880, -315, -332, -291, 122, 187, -76, -389, -758, 727, 686, 292, 619, -1015, -880, 297, 419, -468, -660, 422, -209, -945, -349, -179, 466, -868, 479, 328, 379, -406, -26, -401, -179, -1158, -285, 563, -1840, -581, -73, -40, 61, -1104, -278, -1663, -142, 330, -477, -519, -219, 502, -172, -598, -687, -1733, -622, 814, -772, -1166, 974, -305, -1317, 399, 1183, -633, -292, 146, -866, 1072, 471, 687, -363, -74, 347, 1021, 470, 163, -331, -69, 1150, 115, + 175, -82, -686, -300, 537, -9, 28, -107, -614, -43, 257, -374, 442, -579, -380, 123, -211, 306, 116, -526, 211, 270, 136, 105, -222, 131, -13, -125, -383, 191, 145, -39, 275, -411, 38, -394, 2, 111, -151, -63, -29, 164, 13, 1453, 2002, -295, -46, -763, -768, -1335, 588, -214, 2002, -404, -844, -1181, 84, 388, -428, 391, 1314, -500, -217, -892, -399, 894, 1027, -1005, -275, 537, -207, 246, -291, 1289, 1035, 2188, 722, 976, -415, 704, 1483, 491, -81, 357, -37, 973, 514, 1413, 407, -1397, 508, 559, 1175, -636, -541, 687, + 742, -334, 1180, -394, 491, -1268, 824, -286, 458, 471, 1036, 901, -693, -721, -224, 1088, 1098, -394, -590, -1141, -120, 831, 936, 631, -258, -749, -712, -107, 515, -483, 713, 191, 501, 106, -238, 574, 362, -64, -225, 193, 483, -664, 286, 362, 471, 272, 661, -195, 239, -285, -437, 279, 558, 503, 745, 14, -1, 242, 204, 1335, 260, -34, -567, 25, 845, 448, 654, 399, -13, 34, -140, 16, 813, 693, 74, 273, -79, -112, 31, 362, 260, 246, -174, -150, 192, -485, -1610, 115, 2474, 1478, -343, -3622, -516, -367, 286, -412, + 71, 379, -136, 164, -786, 504, 609, 1121, -807, -1023, 1062, 1677, 426, -745, -989, -213, 253, 94, 268, 6, 372, 148, 1097, -350, -1499, -652, 487, 177, -516, -659, 91, 709, 1264, 1156, -21, 19, 478, -447, -1294, 394, -805, 1558, 1713, -35, 487, 244, 345, -755, -104, 1623, -607, 14, -2201, -294, 255, 509, 486, 456, -541, -345, 1005, 1462, -252, -64, 149, 588, 721, -333, 248, -798, -933, 95, 265, 347, -107, -148, -170, -203, 650, -5, -112, -339, -18, 395, 368, -195, 501, 111, 758, 60, 141, 23, -254, -227, -123, -177, + -42, -228, -149, 55, 632, 702, 219, 363, 147, 125, 618, -442, 472, 163, 768, -207, 208, 135, -298, 236, -136, 241, -75, 415, -137, -266, 218, 87, 111, 161, 114, 289, 67, 107, 63, 102, 110, 88, 188, 132, 34, 29, 54, 165, 133, 127, 66, 167, -192, -1631, -677, 1299, 1432, 1360, 1846, 314, -799, -2444, -1855, -353, 514, 1543, 1680, 792, 35, -824, -712, -319, 523, 1439, 818, -195, 51, -123, -794, -1089, -889, 161, 1327, 992, 1996, 1293, 1285, 1805, -528, -1257, -1425, -1897, -2330, -886, -276, 685, 1282, 1845, 1730, 1399, + 889, 1772, -349, -1132, -53, -294, 470, 530, 2122, 1845, -689, 324, -483, -1427, -418, 368, -853, 1311, -527, 430, 113, -160, 1143, 1577, 1267, 881, -659, -1615, -1826, 511, -769, 130, -87, 1020, 162, 572, -492, -1135, -1042, -1648, -1422, 593, 341, 812, 1241, 954, 38, -743, -1178, -1611, -874, -421, -588, 252, -213, -198, -189, -499, 5, -228, -323, -399, -245, -65, 256, -480, -291, 677, 64, -3650, -3842, -3996, -4096, -5412, -591, -1534, -374, 502, 2462, 2798, 2894, 4052, 5603, 5369, 5276, 4238, 3060, 2222, 666, -2561, -1230, -1514, -938, -3073, -512, -1273, + -1402, -2542, -1954, -1988, -1801, -1882, -3305, -2928, -1729, -1564, -1964, -2720, -416, -2383, -4513, -3868, -3395, -1791, -2306, -412, -4669, -2068, -2067, -955, -696, -2403, 106, -2408, -291, 373, 1126, 99, 1157, 1727, 2718, 2897, 3988, 2604, 6261, 3955, 7290, 4955, 7264, 8426, 10008, 8220, 8277, 9328, 8370, 8499, 8271, 7168, 4145, 3310, 2335, 1700, 1992, 2974, 1638, -608, -1039, -1198, -2055, -2667, -3251, -2994, -4920, -4767, -4910, -5949, -5239, -6611, -5854, -6871, -7057, -6649, -7336, -6635, -7408, -5880, -5759, -4773, -5093, -5249, -3688, -3303, -2522, -1285, 433, 1403, 1231, 1569, 1406, 1586, 1825, 2606, + 3137, 2834, 2552, 3119, 2906, 3590, 3270, 2385, 2171, 1882, 1657, 1037, 788, 727, 459, 495, 202, 325, 289, 207, 288, 201, 130, 70, -53, 15, 6, -248, -383, -221, -215, -277, -320, -302, -274 }, + {520, 69, -170, 81, 92, 32, -216, 99, 154, -165, -49, -202, -44, -86, -74, -29, 12, -7, 21, 73, -90, 41, -207, 72, 128, 27, -54, -168, 110, -74, 178, 152, -6, -70, 145, 169, 136, 138, 34, -105, 33, 130, -54, -110, 99, 157, -69, 82, -178, -14, -156, 107, -208, -56, -39, 72, 104, 74, -6, -110, 14, -152, -101, 28, -19, -92, 51, 52, 13, 97, -86, 42, -116, -46, -49, 64, -60, -123, -55, -46, 169, 146, 37, -77, 10, -9, 30, 59, 11, 4, 11, -2, 3, -21, 17, -64, + 3, -5, 27, 14, -20, -28, 6, 12, 13, 297, -299, 11, 5, -76, -90, -96, 31, -169, -166, 24, 81, -6, 96, 75, -91, 38, -328, -80, -73, -76, -103, -114, -289, -225, 31, 68, -15, 157, 125, 53, -56, -31, 147, -57, 18, -21, -154, 52, -51, -105, -40, 126, 305, -116, 34, 74, -56, 96, 43, -106, 62, -251, -116, 3, 103, 160, -98, -45, -11, -364, 62, 188, 10, 28, 103, -59, 161, 217, -27, 62, 131, 124, 25, 7, -60, -87, -54, 39, -83, 182, 122, -4, -88, -45, 105, 123, + -61, 95, -58, 26, -59, -36, -40, 12, 3, 7, 8, -7, -19, -79, -256, 59, 9, -248, 38, 139, 204, 52, -147, 346, -47, -68, 163, -101, -98, 17, -127, 154, 154, -62, -233, -115, 116, -150, 329, 284, -227, -278, 10, 52, -265, -17, 109, 74, -130, -75, 304, -32, 209, -21, -68, -71, -157, 27, -22, 164, -140, 38, -37, 30, -83, -11, 138, 110, -173, 270, 22, -1, -4, -25, 73, -37, -241, -34, -128, 210, 88, 6, 258, -143, 173, 170, 16, -126, -26, -27, -3, -36, -52, 72, 76, -114, + 55, -7, 80, 71, -23, 11, -35, -54, 38, -49, -42, 21, 54, -50, -37, -65, -28, 39, -25, -9, 1, 20, -36, -20, 50, 17, -11, -16, -56, -617, 142, 33, 440, -24, 177, -237, 51, -177, -43, -87, -28, 81, -48, 75, 148, 113, 418, 288, -190, 96, -10, 77, 49, -53, -415, 105, -21, -4, 157, -25, -116, -81, -20, -129, -69, -332, -78, 9, -117, -21, 137, 197, -64, 243, -182, 40, 83, 32, -57, -128, 90, -32, 56, -95, -135, 25, 79, -137, 130, -93, 310, 329, -100, 120, 126, -17, + -43, -44, -402, 168, 163, 5, -68, -168, 18, -50, -205, -460, 30, -114, 118, 0, -2, -77, -52, -87, -9, 47, -60, 70, -74, -43, -31, -19, 37, 31, -25, 14, 10, 25, 41, 31, -22, -49, 34, -21, -37, 13, 12, -22, 25, 41, 14, -132, -202, 201, 115, -18, 233, -125, 209, -235, -226, 110, -360, -128, 91, 220, 287, -50, 214, -7, 204, 75, 33, -33, 11, 203, -97, -21, 37, 18, -200, -25, -109, 414, -198, -201, -49, 195, 196, 169, 226, -39, 41, -50, -112, 86, -10, -21, -128, 325, + 200, -100, 62, 96, -172, 36, 126, -32, 244, -98, -32, -265, -100, -225, 10, 311, -122, 88, 53, 11, -85, -29, 3, -76, 149, -153, -73, -14, 328, 52, -2, 104, -89, -246, 61, 25, -39, 18, 60, -16, 12, 120, 22, -9, 28, 2, -16, -28, 111, -5, 9, -101, 61, 16, 61, -15, -42, -12, 31, 50, 32, -83, 4, 59, -18, -104, -68, -582, 422, 44, -214, -514, -51, 13, -304, -27, 142, 121, 11, -88, 112, 368, 373, -160, -175, -404, 81, -73, 393, -160, -9, -92, 148, -44, -402, 132, + -19, -238, 0, 38, -33, -41, -165, -230, 140, 35, 183, -159, 308, 146, -64, -273, -54, 99, 302, 94, -171, -78, 140, 91, -88, -43, 148, 121, 156, 299, 333, 163, 177, 205, -120, 30, -221, 221, 35, 112, -158, -245, 56, -313, -113, -137, 230, 242, 253, 67, -72, -80, 236, 48, -33, 60, -74, 151, 8, -2, 49, 62, -23, 124, 0, 21, -59, -35, 34, 97, -6, 35, 56, 32, 19, -29, 46, -38, -209, -12, 391, 241, 331, 63, -362, -119, 385, -111, -244, -254, -250, -265, 145, 148, 95, 87, + 90, 370, -46, 161, -318, -358, 239, -13, -195, 14, -498, -163, -168, 61, -18, -46, -350, -229, 39, 242, 393, -156, -155, 210, -270, -19, -14, 90, 172, 140, 273, -146, 395, 187, -427, 213, -238, -283, -236, -343, 310, 73, -365, 42, 77, 34, 58, -67, 257, -149, 197, -318, 241, -161, -147, 32, 107, -12, 174, 499, -42, -268, 158, 327, 26, -36, -259, -113, 240, -41, -16, 8, 48, -67, -39, -6, 71, -41, -9, -47, 136, -100, 21, -94, -117, 31, 38, -37, 18, -34, -26, -7, -13, -3, -50, -29, + 139, -7, 811, -731, 338, 353, -329, -59, 486, 176, 308, 92, -107, 731, -29, -137, -1, 2, 351, 550, 208, -4, 11, 83, 189, -3, 100, -384, 182, 299, -63, 122, 0, 56, -247, -193, 14, -8, 339, 168, 140, -143, -176, -175, 195, 284, 2, -91, 555, 287, 371, -200, -414, -79, -433, -285, -131, -180, -25, 324, -103, 13, -265, -283, 323, -16, 151, 161, -169, 310, 81, 28, -108, -208, 244, -75, -432, 250, 211, 261, 118, -304, -64, 28, -317, 181, 182, -30, 137, 115, 123, -30, 194, 29, -8, -98, + 48, -2, 155, 33, -4, 32, -1, 114, -48, -14, -75, 39, -20, -59, 13, 16, -22, 17, 125, 94, -54, -35, -81, 21, -17, -11, -567, 70, 187, -279, 232, -481, 110, 147, -63, -191, -245, -285, -483, 62, 550, -181, 265, 148, 409, 217, -154, -351, 181, -88, -125, -363, -54, -49, -145, -155, -83, -255, -335, 392, -38, -227, 307, 109, -268, 41, -20, 175, -356, 101, 123, -526, 176, 173, -271, 79, 21, -84, 195, 19, -37, 24, 132, 356, 282, 363, 250, 130, -94, 540, -137, -275, 598, 41, 361, 79, + -116, -554, -513, -127, 33, -202, -98, -158, 353, -308, -90, -52, 86, -301, 218, -23, 69, -25, -117, -195, -132, -154, -125, -36, 20, -94, -67, -52, 129, -149, -132, -107, -127, -5, 104, -45, -51, 75, 18, -37, 51, -93, -103, 80, -120, -193, 68, 174, -92, 19, 117, -39, -96, -944, 462, 814, 56, -462, 210, -85, -32, 133, 79, 210, -247, 28, 730, 561, 490, -535, -23, 132, 280, -257, -288, -73, 92, 253, 126, -688, -781, 243, -26, 440, 451, -291, 373, 300, 398, -27, -238, -247, 190, -262, -101, 0, + -12, 239, 507, 285, -139, -120, -251, -64, 22, 137, -54, -89, 249, 157, -383, -5, 16, 460, -232, -264, -502, -170, 86, 34, 259, -56, 65, -224, -334, -303, -306, -176, 146, -630, 75, -88, -99, -133, 125, 345, 251, 40, -56, -320, -102, -30, -65, 211, 108, 64, 47, 110, 128, -49, -54, 3, -58, 11, 14, 42, 71, -205, 32, -26, 155, 42, -206, -11, -130, -100, -51, -46, -55, -26, 116, 107, 90, 154, 476, 39, 413, -56, 536, 268, 418, 257, 122, -207, -21, -130, 287, 85, 252, -240, -42, 445, + -548, -306, 427, -723, -319, 54, -138, -358, 728, -130, 503, 202, -438, -67, -165, -530, -688, 550, -5, -200, 136, 10, -91, 200, 79, -71, -253, 49, 520, 441, -363, 144, 29, 411, -187, 278, -590, -143, 403, 135, -135, 481, -153, 337, -655, -756, -272, 15, -536, 579, 409, 588, -270, -199, -204, 31, -298, -3, -456, -414, 19, 117, 422, 200, -44, -156, 133, 244, 160, 98, -150, 176, 158, 199, 147, 108, 159, -218, 184, -132, -67, 289, 256, 172, -30, 10, -77, 148, 47, -61, 81, 150, 23, 117, 114, -150, + 50, -114, -33, 36, 659, 474, 743, -659, -496, -1130, 487, -126, -966, -187, 92, 143, -361, 394, 332, 38, -4, 62, -160, -336, 74, -191, -315, -4, 732, 23, -111, -585, 247, 462, -239, -706, -128, 238, 85, -150, 154, 50, 254, -71, 419, 641, 243, -426, 483, 218, -546, -581, 632, 306, -246, -283, -14, -514, 377, 496, -12, 28, 125, -63, 543, 183, 141, -225, 88, 183, 671, -161, 257, -519, -592, 528, -79, -49, 55, 504, 11, -24, 318, -152, 63, 292, 356, -170, -222, -477, -235, 156, -211, 166, -5, 176, + -95, 130, 27, -73, 57, 267, 66, 266, 80, -168, 11, 111, 92, -165, -152, -161, -69, -126, -124, -196, -85, 109, 69, -20, -32, 60, -131, -3, 167, -47, -28, -81, -69, -35, -249, -35, -97, -107, -156, -222, -765, -63, -501, -1015, -1047, -453, -799, -362, -129, 143, 447, 499, 51, -270, 537, -273, 265, -1003, -99, -688, -462, 466, 327, 318, 106, 670, -68, -42, -483, -168, -97, -329, -332, -824, -324, -91, -133, -510, 451, 179, 269, -225, -87, -1251, -361, -345, 290, 641, -395, -61, -728, -53, 375, -119, -246, 164, + 537, 916, 193, 29, -51, -246, -367, 245, -242, 832, 164, 358, 1697, -338, -289, -429, -595, -81, 580, 261, 83, 193, -245, -191, -518, -124, 291, -48, -114, -49, -121, 61, -19, 112, 114, 116, 153, 167, 432, 264, -160, 252, -7, 16, 181, -210, 4, -242, -146, -331, -245, -345, -286, -192, 378, -235, -132, -278, 17, 82, -60, 113, 46, -8, -234, -849, 481, 794, -470, 24, 178, -275, -67, -594, -13, -334, 862, -1, -163, 692, -177, 201, -796, 412, 122, 537, -252, 399, 705, 758, 425, 683, 349, -110, 663, -322, + -438, -141, 266, 450, -1082, -75, -700, 554, 250, -15, 190, 776, 32, 693, 295, 1050, 94, -121, 459, 151, -537, 114, -63, -720, 503, -435, -702, -1435, 110, -178, 842, -471, 1127, 371, -20, -174, 439, 463, -827, -354, -611, 212, -277, 619, 196, 208, 299, -144, 52, -218, -77, 16, -83, -639, 251, -2, 188, 5, -189, 20, 259, -425, 364, -156, -2, 41, -358, -31, 214, 109, -258, -106, -63, -301, 100, -86, 437, -352, 155, 305, 108, -130, -98, 148, 71, 92, -79, 153, -469, 125, 111, 201, -143, -219, 15, 197, + 26, 546, -364, -407, -401, 525, 273, 683, 190, 2113, -627, 12, 16, 984, 408, 456, -645, 284, -254, 18, -298, 66, 711, -187, 226, 1374, 431, -622, -728, 85, 896, 467, 171, -346, 763, 130, -112, -837, 257, -133, 362, -760, -464, 40, -193, 101, -709, -24, -432, 202, 630, 503, 165, -973, 9, 97, -876, -783, -518, -428, -427, 694, 159, -19, 453, 722, 193, 625, 17, 414, 2761, -630, 455, 317, -485, 103, -1840, 37, 915, 239, -506, 704, 170, 268, -458, -104, -391, 138, 35, 35, 158, -569, 212, -312, -226, -779, + 194, 180, 156, 201, 978, 148, 105, 112, 77, 585, 69, 247, 205, 446, 180, -27, -98, -81, 75, 283, 338, 100, -511, -235, -113, -113, -169, -534, -129, 411, 1117, -519, -26, -749, -544, 178, 490, -620, 741, 311, -972, 599, -393, -481, -40, -582, 138, -260, 752, -433, -34, 414, -1450, 208, 451, -437, 358, -876, 877, 96, 152, -1658, 1497, 642, 492, 33, -945, 868, -55, -429, 1533, -305, -672, -354, 186, 444, 421, 112, -257, -1803, -203, 452, 27, 662, -945, 977, 100, 331, -960, -277, 156, 1244, -517, 291, -890, 788, + 443, 744, -286, 330, 130, -975, -930, 512, 420, 794, 172, 1019, -1534, -2009, 322, -424, 1136, -740, -159, 131, -853, 42, -508, 444, 632, 63, 513, 562, 169, -509, -255, 906, 473, 117, 160, -272, 24, 552, 311, -447, -251, 513, -70, 320, 324, -198, -260, -265, 5, 274, 127, 350, 504, 41, -13, 409, 28, 82, 133, -172, 143, -301, 174, 61, 10, 126, -149, -1403, 1278, -277, -310, -500, -147, -1107, -2067, 712, 592, -92, -427, -843, -140, -262, -449, 813, -1849, -790, -976, -292, -1407, -130, -213, -51, -236, -286, 225, -15, + -623, -195, -15, -852, -456, -252, 61, 655, -337, 1314, -687, -99, 553, -587, 356, 75, -902, -1349, -331, 344, 1229, 533, -942, -398, -2703, -904, -195, 568, 1467, -78, -1572, 87, 853, -315, -75, 905, 952, 2186, -2416, -469, 342, 611, -763, -906, -1293, -1284, -718, -596, -168, -92, -1492, -618, -546, 553, -281, -147, 1344, 1018, 82, -192, -61, -829, -36, 296, -599, -321, 114, 379, -254, -294, -199, 423, -280, 444, 32, 458, 326, 330, -252, 167, -628, 325, -82, 191, -555, -430, -62, 144, -312, 8, -704, -123, -84, 302, 374, -449, + 922, 19, 343, 205, 669, 669, -30, 425, -798, 186, -326, -1921, 429, -333, 562, -535, -550, 35, -807, 131, -813, -22, -145, -323, 385, -609, -792, -724, -929, -160, -106, 1018, 222, -753, -1115, 140, -28, 258, -221, 614, -735, -297, -1030, -663, -299, 27, -437, 1062, -378, -921, 280, 1103, 802, 322, -789, -519, -84, 1001, 1926, -25, 376, -377, -1891, -422, 168, 704, 1607, -899, -1095, 633, 301, -386, 48, -607, 367, -1602, -187, 85, 384, -969, 1107, -1568, -1780, -1648, 826, -344, 1561, -2187, -952, 168, 2223, -185, -398, -1230, -450, -149, + 1070, -97, -7, 58, 184, 15, -18, -469, -396, 506, 225, 56, -1167, 287, -301, -144, -604, 22, -55, -116, -1373, 121, -304, -162, -119, 228, -5, 80, -10, 3, -4, 1, -500, -102, -322, -281, 239, 244, -401, 10, -285, 369, -137, 1138, 348, -2032, -361, -1402, 626, 117, -2796, 191, -860, -1812, -1410, -2068, 1280, -631, -1627, -731, 530, -970, -837, -653, -387, -720, -714, -1320, -954, -1810, -1020, -921, -303, -852, -173, -398, -23, 70, 243, 509, -498, 424, 54, 932, 408, 584, 590, -1697, -444, 1369, -231, -842, -950, -702, 550, 2206, + -143, -28, -1473, -1502, -314, 316, 1319, -85, 1202, 450, -1446, 2623, 54, 2043, 8, -514, 1098, -1461, -1892, -1209, -4197, -2543, -832, 1932, 1185, -1679, -1105, -2568, 1281, 1711, -1312, -1308, 307, 1133, 1605, 457, 922, -845, -467, -635, -975, -391, -85, 104, 43, -523, 86, 377, 122, -72, -386, -249, -440, -151, -652, -125, 405, -620, -1030, -135, -675, -445, -77, -854, -671, -158, 418, 450, 482, 9, -371, -42, 157, -201, 648, 55, 479, 55, 1, 506, 374, 566, 1161, 761, 866, -713, -1732, 2014, 1926, -1218, -1581, -7, 1729, -187, -101, -539, + 1512, -167, -404, -36, 417, 777, 20, -583, -664, 934, 69, -400, -998, 568, 313, -113, -786, 248, 338, 281, -498, -298, 87, 770, -227, 277, -1133, -314, 1, 747, -1578, -280, 152, 1137, -547, 178, -807, 111, 332, -553, -424, -64, 183, 348, -361, 26, -1406, 762, -236, 1317, -817, 589, -557, 612, 112, 412, 345, -1020, 1154, 231, 665, -1126, 311, -285, 177, -319, 42, -75, 151, 386, -63, -448, -271, 118, -64, 31, -179, -436, 144, 120, -140, -121, -12, -134, 17, -236, -11, -113, 194, 119, -86, -174, 57, 9, -161, 118, + -487, 0, -61, 219, -13, 560, -374, -370, -133, 298, -404, 600, -506, 258, -251, 548, -492, 603, -347, 474, -430, 734, -693, 535, -167, 404, -378, 397, -426, 445, -426, 357, -287, 390, -303, 322, -296, 107, -108, 197, -152, 161, -132, 136, -98, 159, -109, -591, -1313, -1745, 1272, 844, -996, -1419, -696, 657, 344, 874, 941, 184, -475, -139, 329, -324, -27, 194, 53, 527, 368, 160, -475, -18, -294, 305, -497, -430, 360, -115, -203, -198, -346, -473, 35, 387, 352, 296, -113, -390, -340, -237, 421, 574, -268, -401, -174, 476, + 245, 637, -451, -171, 251, -120, 20, -68, 225, 136, 182, 38, -431, 178, 79, -16, 333, -173, -86, 58, -62, 43, -125, 565, 142, -46, 538, 540, -549, -830, -305, -569, 17, 376, 107, -340, -411, -109, -80, 327, 155, 203, 305, 187, -171, 189, 134, -399, -536, 160, -142, 267, 195, -294, -79, -100, -108, -341, -188, -21, 108, 163, 454, -226, -169, 116, -106, 598, -1454, -3827, -1407, 686, 1991, 4207, 2815, 725, 1067, -563, -1714, -2846, -2476, -1969, -568, 76, 1369, 1510, 3213, 1560, 1028, -81, -685, -1546, -803, -1250, -1442, -887, + -743, -56, 401, 1201, 742, 862, 783, 792, 1192, 103, 826, -153, -372, -1007, -600, -1501, -2211, -1931, 22, -328, 606, 1038, 568, 1601, 1397, 2023, 1151, 1372, 67, 68, -1082, -1766, -2065, -2478, -1630, -2025, -171, -8, 974, 1023, 2449, 1925, 2736, 1111, 1279, 534, -12, -1634, -2666, -1784, -2130, -1326, -1442, -134, 222, 851, 1114, 1511, 1541, 1483, 970, 1062, 276, -192, -366, -1195, -1091, -1432, -1013, -1432, -1092, -114, 255, 756, 1140, 1018, 1048, 1728, 625, 1055, 809, -1089, -1971, -854, -1737, -1094, -596, -123, 154, 553, 1000, 697, 1076, 684, 586, 237, + -67, -626, -207, -294, -1102, -1028, -284, -116, 58, 361, 420, 531, 421, 415, 153, 138, -4, -225, -109, -69, -208, -335, -106, -156, -180, -14, 83, 75, 111, 122, 136, 48, 13, -26, -44 } + }, + { + {233, 25, -63, -66, 41, -113, -2, -220, 158, 200, 140, 197, -236, 19, 54, -84, -65, -58, -277, -46, 165, -283, -230, 134, 122, -182, -63, 121, 16, 146, 63, 153, -96, 29, 21, -40, 71, 56, 104, 44, -46, 10, 116, -31, -53, -20, -140, -309, 184, 89, -97, 136, -54, 15, -5, 63, -81, -21, 183, -172, -69, 60, 30, -27, -8, 80, 9, 71, -122, 125, 64, -160, 127, 11, 46, -19, -47, -187, -58, -14, 96, -25, 79, -47, 9, 23, 10, 56, -10, 4, -7, -38, -17, 7, -20, 3, + -1, -9, 51, 51, 27, 21, 19, 7, 0, 7, 3, -8, -23, -26, 365, -210, 64, -232, 28, 54, -234, -296, 74, -321, 71, -84, -22, -197, -29, -221, -114, 1, -234, 249, 87, -388, 37, -21, -70, -166, 83, 201, 4, -15, 189, -111, 2, -71, 125, -147, 43, 176, -154, 154, 54, 167, -15, 38, -25, -71, 219, -272, 62, -121, -52, -36, -99, -73, -217, -136, -34, 141, -12, 53, 197, -5, -171, -22, 6, 53, -84, 0, -168, 3, -69, 55, 87, 128, 46, -73, -95, 126, -43, -58, 23, 70, + 145, 17, 42, -10, 85, -17, -68, -35, -34, -4, 58, 11, -4, -31, 56, -1, -21, -16, -15, -17, 26, -12, -3, -33, -88, -302, -4, -182, -57, -30, -212, -29, -49, 105, 248, 249, 30, -107, 100, -241, -35, -92, 84, -360, 127, 61, -13, -104, -155, -71, -128, -110, 67, -24, -138, -40, 28, 235, -9, -237, 19, 102, -3, -75, 20, 89, -258, -20, -112, 181, 110, 31, -238, 27, 92, 146, 137, -157, -74, 7, -49, -49, 127, -79, 78, 21, -100, -23, -138, 166, 62, -164, -113, 28, 87, -130, + -164, -28, 8, -109, 23, -45, 55, -104, 155, 83, 117, 33, 15, 105, 142, 17, 40, -13, 20, 2, -6, 16, 12, 16, -22, 1, 11, -8, 3, 47, -27, 11, -33, -26, -22, 5, 18, 12, 2, -31, -20, -514, 166, 148, 249, -65, 156, -444, -122, 139, 16, -220, -58, -73, -389, -158, 39, -18, -277, 173, 246, -253, 191, -331, -113, -30, 113, -2, -134, 90, 45, -22, 147, -72, -96, -30, -55, -98, 145, -112, 41, 108, -23, -87, -163, -20, -116, -36, -135, -37, 299, 6, 182, -168, 152, -48, + -246, -145, 135, -89, -125, 89, -147, 121, 32, -46, 159, 144, 63, -159, -180, -13, 238, 47, 36, -136, 35, 85, -183, -67, 59, 127, 62, 107, -7, 1, 39, 5, -21, 6, -16, -23, -81, -65, 19, -39, -24, 27, 12, 19, -6, 33, -22, 1, -29, 0, -35, 17, 5, 23, -45, -276, -263, -174, 31, -45, 106, -96, -1, 18, -79, -31, 65, -79, 305, -202, 141, -54, -22, -144, -40, -21, 222, -154, 19, 42, -220, -135, -151, -128, -255, -89, 90, 171, 108, -204, -287, -64, 7, -147, 25, -100, + -151, -355, -179, -249, 141, -66, 115, -144, -347, -184, 16, -72, -115, -53, -137, 183, 15, 106, 142, 35, -7, -121, 4, 154, -28, -117, -162, 255, -215, -300, -212, -123, -167, 185, 297, -239, -165, 35, 143, 221, 174, 136, 134, -49, -61, -69, -72, 53, -44, 13, -54, -86, -36, -62, 43, -39, -77, -45, -45, -77, -85, -54, -23, 15, 14, 38, 4, -131, 14, -21, -54, 14, -24, -41, -86, -71, 1, -1, -30, -34, -1, 70, -564, 174, -40, 100, 309, 121, -77, 105, -233, 144, 169, -308, -66, -156, + 173, 151, 235, 273, -355, -183, 58, 305, -116, 142, -339, -102, -119, -72, -205, 51, -336, 232, -66, -59, 170, -10, 38, 181, 5, 148, 99, -42, -59, -20, -236, -173, -216, -14, 448, 104, 86, -10, -63, -4, 267, -57, 83, -516, 474, -115, -85, 27, 290, 106, -49, -177, 509, -98, -7, 163, -129, -1, 73, -115, 100, 100, 420, -209, -264, -48, 126, -158, 35, 109, 34, -92, 41, 111, -71, 10, -121, -38, -36, -98, 129, -93, -80, 59, -4, -111, -10, 27, 47, 6, 56, -40, -35, -33, 37, -41, + 67, 8, -29, 31, 69, -1, -32, 244, 137, 272, -109, -64, 157, -251, 226, 258, -129, -22, -405, 19, 140, 113, -85, -275, -559, 9, -95, -265, 62, 178, -242, -103, -264, 134, 15, -39, -88, -114, 285, 333, 130, 159, -74, -167, 464, 116, -79, -272, 201, 9, 267, -23, 330, 165, 231, 196, 100, 257, 321, -9, 59, -102, -3, 175, 73, 95, -283, -104, -59, -246, -235, -155, 132, 273, 356, 466, 104, 41, 376, -149, -283, -98, -143, 244, 199, 77, -268, -73, 48, 39, -51, -123, 38, 32, 156, -37, + -85, 19, 31, 39, 4, 3, 32, 72, -49, -48, 6, -5, -70, -15, -89, 99, 33, -67, -2, 67, -34, -5, -52, 30, 36, -23, 86, 431, -408, -192, -55, 165, -382, 242, -377, 186, -1, 197, 312, -127, 285, 311, 296, -171, 250, -269, -214, -33, -165, -3, -142, 245, -181, 54, -178, -313, -146, -66, 379, -318, 299, 131, -440, 505, 125, 56, 355, 63, 16, -201, -1, -112, 405, 171, 284, -110, -67, 195, 337, -352, 349, 64, -56, -66, -331, 160, -156, 68, 15, -301, 102, 254, -231, 161, 106, 356, + 38, -24, 217, 312, 26, -179, 210, -242, -125, 64, -97, 65, -78, 31, 135, 98, -98, 86, -50, 69, -69, 217, 22, 207, -24, 52, -43, -18, -66, 131, 56, -108, 114, 132, -14, -18, 81, -6, -6, 109, -3, 27, 71, 46, -16, 83, -69, -13, 17, 22, 19, -5, -9, -84, 40, 124, -348, -249, 379, -485, 122, -258, 289, -308, 471, 164, 46, -409, 209, 347, 92, -210, -137, -120, 322, 175, -449, 64, -317, -17, 36, -271, 355, 357, -162, 79, 242, -295, -45, -90, -245, 521, -189, -116, -262, -437, + -70, 9, -151, 66, -363, 33, 26, -72, 287, -59, -223, 117, 0, -166, 143, 618, -124, 148, 34, -418, -68, 375, 168, 372, -38, 216, -296, 134, 131, 45, -252, 234, 82, -652, 51, -117, 436, -167, 339, 315, 252, -30, 97, 16, 25, -41, -72, 172, 69, -1, -113, -157, -37, 69, 111, 81, 142, 6, -38, -57, -46, 53, 85, -6, 67, 46, 12, 63, -12, 66, -107, -130, -174, -6, 79, 38, -82, -28, -57, -61, 106, 34, 47, -762, 861, 102, 340, -625, 341, 444, -512, 195, 254, 196, -331, 44, + 59, -112, 193, 398, -319, -266, -97, 338, 292, 413, -20, 174, -307, -80, -80, 68, 194, 527, 314, 192, 100, -17, 252, -93, -452, -88, 133, 145, -265, -201, -328, 64, -26, 115, -215, 385, 377, -326, 775, 36, -71, -4, -161, -35, -49, -313, 6, 1, 206, -652, 160, -231, 474, 572, 248, 238, 107, 38, 517, -97, -382, 327, -172, 88, 256, 466, 66, 46, -373, -16, 109, 295, -128, 160, 78, -113, 300, 51, 135, -87, -27, -86, 15, 34, -46, -3, 91, -50, 92, 62, -64, -7, 43, -27, 8, -62, + -202, -58, -31, 211, 262, 26, 39, -75, -87, 22, 29, -110, -85, -57, -49, 70, -121, -6, 313, 60, -218, 203, 305, 265, 167, 316, -384, -245, 43, -348, -87, -59, 77, -90, -226, -284, -171, 139, 238, -419, 88, -45, -12, -505, -453, -80, -352, 164, -401, 25, 213, 307, -274, 365, 92, -37, -82, 542, -153, -28, -438, -246, 354, -28, 133, -421, -461, -127, -261, -46, 19, -170, -219, 128, -203, 17, -299, -161, -9, -490, 43, 322, 60, 169, 349, 601, -583, 105, -360, -349, -197, -265, -172, -157, 588, 324, + 325, 68, 94, -426, 19, -150, 66, -185, 259, 344, 32, -156, -108, -294, 25, 181, 98, -71, 185, 90, 195, -42, -38, 33, 126, -82, 53, -120, -170, 121, 41, 25, 25, -228, -138, -1, 173, -147, 85, -197, -69, -31, 67, 48, -62, -48, -266, 605, 641, 705, -527, 37, 379, 298, -309, -589, -70, -89, -464, -269, 875, 67, 58, 327, -40, 139, -123, -350, 227, 190, -473, -671, -520, -413, -394, 36, 112, 198, -263, 254, 59, -129, -278, -11, 13, -428, -336, 48, -79, 57, -260, 208, 63, -245, -524, -208, + -178, -696, -221, 64, 341, -35, 404, -73, -36, -593, -128, 231, 109, -991, 281, 84, -278, -169, -290, -326, -15, 14, -316, -103, 198, 287, 453, -349, 15, 255, -13, -759, -606, -8, -162, 188, -8, -188, -273, 123, -80, 112, 307, -10, -155, -259, -475, -163, 27, -80, -82, 29, 29, 209, -110, 21, 77, 40, -173, 18, -45, -413, 40, -154, -188, 65, 49, -126, -41, 147, 41, 38, -154, -173, -62, -14, 8, 105, 242, -206, 688, -589, -363, -120, -1115, -582, -3, -711, 552, -250, -231, 63, 1264, 610, 39, 260, + -59, -339, -34, -525, -380, 180, 183, 226, -365, 467, 285, 528, -537, 86, 782, 73, 32, 154, -751, 191, -190, 123, -303, -710, -44, 286, 349, 90, -111, 51, -33, 235, -536, -780, 139, -285, 465, -187, -194, 607, 136, 261, 48, -514, -211, -62, 277, 800, 616, -185, -709, -15, -82, 262, -438, -549, -312, 258, -556, -88, -466, 2, 375, -12, -699, -154, 92, 182, 86, -436, -294, -466, 71, -99, -203, -156, -203, 38, -85, -195, -56, 135, -1, -8, -237, -7, -23, -152, 12, 290, 97, 52, -301, 115, -34, -36, + 46, -9, -7, -63, -179, -200, -164, 200, 175, -84, -446, -167, -166, -38, -1267, 489, 402, -186, -838, -185, -322, -340, 370, 457, -46, 125, -952, 336, -1192, -301, -103, 238, 601, 954, 396, -551, 129, 666, 90, 203, 362, -560, -215, -88, 171, -394, -211, -119, -295, -226, 406, 397, 103, 34, 686, -128, 321, -774, 515, 148, -701, 73, 227, -660, -84, -645, 218, 273, 292, -434, -36, 434, -360, 6, -56, 716, -422, 528, 269, -666, 588, -491, 379, 497, -500, 284, -426, -532, -801, -670, -733, -175, 133, -221, 645, 668, + -280, 589, -88, -123, 750, -165, -498, 349, -72, -390, -298, 296, 55, 154, 237, 42, 195, 298, -77, 334, 232, 167, 193, 28, 119, 284, 232, 288, 46, 239, -41, 17, 211, -102, -370, 177, 63, 1, 12, 169, -327, 170, 237, 189, -215, 208, -1001, -472, -491, 880, 29, 331, -141, 1248, 199, -830, 63, 918, -337, 206, -149, 82, -533, -719, 1147, 817, -311, 628, 248, 816, 927, -268, -216, 825, 605, 70, -258, -406, -427, 383, 727, 343, -130, 490, -255, 465, -205, 677, 1198, 913, -972, 447, -164, -395, -11, 341, + 329, 2186, -219, -21, -354, -385, 427, 790, -192, 601, 513, -67, 20, -423, 434, 366, 1163, 1183, 1436, 598, -365, -295, -658, 646, -975, 708, -915, 540, -322, -550, 399, -1481, -1172, 215, 231, -423, -410, 692, 345, -634, 95, -144, -347, 115, 179, 55, 181, 213, 374, -172, 74, -208, -370, -226, 90, 33, 513, 110, -123, -414, 67, -164, -133, -183, 144, 309, 110, 269, 225, 355, -148, 271, 36, 80, -24, 24, -208, 250, 596, 320, -62, -66, 474, 397, -364, 118, 239, -182, 686, 155, -1605, 369, 211, -1194, 71, -204, + 50, 438, -57, -1104, -196, -352, -61, 782, 939, -534, -134, -448, 231, -845, -1639, -587, -495, 86, 27, 746, -1121, 534, -261, -124, 460, 217, 780, 178, 300, 835, -954, 1191, 945, 493, 886, -345, 336, -831, -166, -418, 733, -651, 156, -1397, -1733, 1156, -54, 746, -527, 494, -345, 107, -198, -1135, -360, -759, -362, 411, 1682, 601, -1488, -336, 391, -344, -225, -982, -510, 758, -287, 183, 146, -612, 383, -90, 26, -1255, -369, -27, -577, -325, 44, -849, 85, 190, -691, -541, -975, -724, -72, -401, -197, 25, -283, -274, -119, -429, + -211, 55, 286, -378, -141, -647, 222, 159, 374, -268, 389, -837, -57, 0, -66, 128, -144, 89, -397, 118, 102, -983, 524, 523, 927, -447, 342, -515, -599, 272, 1230, 1991, -121, -128, 45, -41, -883, 1394, 671, 743, 573, -399, 486, -780, -1125, -191, 848, 553, -400, -257, -53, 687, 32, 501, 491, 813, 273, -506, -481, 466, -542, -403, 243, 893, 823, -934, -722, 487, 580, 1752, -403, -949, -983, 840, -628, 792, 895, 1801, 3817, -849, -483, -1425, -2272, -722, -1143, 135, 1585, -229, 841, 1199, 786, -439, -1409, -2308, 1292, -87, + 1470, -751, -2002, 703, -1185, -1578, -809, -500, 506, 499, 902, -64, -436, -66, -35, -814, -790, 406, -279, 811, 738, -348, 735, -573, 18, 727, 80, -1122, 303, -563, -97, -179, -149, -826, -677, 136, 986, 1057, -985, -113, 1202, 1152, 3, 246, -1085, -574, 163, 639, -939, 244, 736, 372, 280, 86, 465, -770, 143, -702, -1936, 487, -809, 803, 118, 448, 393, -1773, -1256, -623, -391, -413, -725, -226, -1204, -767, 579, -784, 1491, -1110, 114, 307, -118, 131, -64, 355, -346, -373, -64, 266, -47, 638, -603, 135, 934, 299, 140, 475, + 59, -382, -243, 758, 170, -1200, -532, -974, -443, 1288, 1202, -1243, -137, -1413, -340, -118, 325, 706, -1156, 770, -984, -168, -667, 1482, -300, 1045, 978, 2177, -1004, 897, 146, 852, 298, 650, -1092, -1006, 1457, 69, -54, -1034, 1176, -401, 604, -1087, 2280, -1224, 1268, -1532, 605, -1155, 637, -1064, 788, -676, 463, -379, 255, -576, -353, -275, -71, 199, 36, 160, 14, 157, -86, -297, -463, 206, 231, 62, 212, -178, 83, -142, 87, 778, -197, -568, 80, -325, -599, 184, -327, 233, -274, 192, -524, 205, -678, 948, 145, -1747, -771, -1084, + 57, -255, -2360, -1073, -621, -1258, -785, -2378, -2009, -368, 851, -1311, -785, -195, -1118, -261, -95, -1082, -293, 214, 47, -1433, -818, -820, -459, -512, -153, -998, 819, 531, 1171, 1708, 1484, 374, 1570, 625, 274, -708, 545, 568, 447, -190, -549, -258, 387, 694, 3599, 482, 735, 523, 1466, 563, 1286, 2349, -1146, -2316, 278, 1467, 2625, 1159, -2285, 300, -577, 3317, 2437, 2967, 2719, -2381, -1576, 1937, 2326, -692, -1370, -1650, 3673, 2443, -171, -3181, 747, -132, -719, 863, 221, -288, -694, -24, 484, 1356, 956, -828, -345, -230, -192, 760, 543, 587, + -11, 309, 1242, 841, 156, 490, -369, 613, 792, 1053, 1341, 1047, 792, -8, -211, -294, -119, -622, -360, -306, -778, -992, -1137, -1932, -1115, -728, -1184, -2154, -1516, -1277, -1497, -1766, -1873, -652, -739, -1027, -598, -648, -453, -601, -608, -578, -1706, 2737, 2210, -1912, 427, -43, 308, -73, -190, 706, -709, 690, -281, 4, 271, 224, 245, 0, -403, -255, 439, -360, -48, 426, -234, -240, -339, -615, -622, 456, -229, 172, -393, 81, -830, -146, 223, 536, -342, 120, 361, 587, -144, 487, -397, 1544, -577, 536, 65, 305, -294, 413, -170, 1102, + -186, 345, -773, 1012, -536, -35, -157, 153, -308, 611, -705, 574, -647, 836, -876, 1059, -709, -370, -448, -213, 32, -685, 441, -403, 385, 40, 536, 214, 366, 674, 275, -222, 166, 172, -108, 129, -222, 250, -131, 11, -218, 479, -478, 54, -58, 391, -88, 90, -105, 165, -237, 181, -206, -86, 340, 337, -117, -310, 189, 301, 285, -265, 216, -177, 156, 62, 44, -283, 297, -100, -406, 336, 273, -235, -79, -35, 56, -227, 320, -300, 93, -329, 286, -229, 238, -178, 292, -325, 346, -306, 143, -235, -671, -1386, -1525, 1297, + 328, -402, -2068, -831, 1152, 235, 832, 929, -335, -584, 27, 220, 170, 154, -366, -269, -204, 1, 559, 302, -28, 126, -162, -270, -174, -142, 9, 165, -128, 213, 223, -759, -339, -336, 404, 282, -27, -353, -480, 417, 91, 280, 387, -704, -471, 129, 566, 287, -804, -494, -653, -310, 166, 147, -270, 295, -123, -280, 123, 269, -203, 64, -10, -251, -25, -88, -572, -574, -38, -613, -463, 20, 183, -133, 674, 501, 282, 22, -68, -300, 372, 185, 216, 212, -192, -78, -17, 109, -357, -429, -62, 191, 25, 242, 165, -223, + 71, 134, 90, -70, 238, -297, -182, 554, 314, -337, -258, -170, -305, 337, -14, 51, 151, 103, -6, -9, -228, 147, 83, 201, -114, -29, 125, 537, -1340, -3650, -1388, 831, 1758, 4147, 2438, 663, 868, -719, -1343, -2939, -1982, -1520, -497, 603, 1618, 1257, 1570, 1517, 1028, -347, -1197, -1036, -1065, -855, -1234, 379, -780, 58, 573, 1061, 598, 993, 1309, 25, 390, 30, -21, -732, -98, -651, -1273, -2008, -1119, -612, 162, 154, 1193, 1658, 1593, 1897, 275, 1245, 492, -111, -1167, -1141, -1551, -2034, -1388, -1576, -1000, 7, 488, 1134, 1830, 2699, + 2161, 1960, 1060, -403, -401, -1059, -2256, -1732, -2851, -1873, -831, -630, 890, 1712, 2342, 1655, 1265, 771, 876, 772, -124, -885, -846, -1332, -1477, -1173, -805, -746, -712, 327, 691, 1227, 1454, 1195, 1048, 601, 20, 32, 134, -883, -1502, -613, -1311, -1482, -51, 373, 825, 857, 545, 905, 523, 725, -154, -13, -636, -379, -339, -418, -483, -386, 62, -160, -1, 443, 609, 387, 332, -81, -107, -3, -12, -181, -214, -34, -129, -130, -83, 0, -111, -33, 212, 95, 126, 157, 134, 82, 55, -7, -89, -167, -160 }, + {246, 158, 4, 8, 194, 48, -97, 66, 129, -66, -107, -386, 21, -130, 258, -128, 129, 104, -13, 84, 143, 39, 33, -70, -84, -66, -106, 93, 56, -51, 84, -58, -85, -102, -49, -81, 7, 1, -15, 176, -102, 144, -52, -37, 97, -61, 31, -61, 107, -32, -301, 89, 11, 36, 152, 78, 12, -35, -99, 257, -135, 99, 53, -107, 109, 47, -125, 99, -129, 6, -12, 113, 20, 118, -45, -267, -56, -65, -125, -115, -111, 91, 42, 31, 57, 54, 12, 25, -30, 17, -22, -12, -63, -2, -20, 48, + -3, -17, -8, 3, -32, 10, -13, 16, -9, 1, -37, -7, -47, -32, 468, -232, 25, -15, -14, 106, -85, -338, -311, 145, -99, -30, 79, 16, 78, 87, -149, 79, 54, -106, 122, 184, -121, -41, 8, -200, -91, 19, 237, -40, -14, -200, 116, -1, -179, -77, 61, -28, 34, -155, -5, 9, -64, 163, 41, 36, 158, -18, 205, -71, -264, 105, 102, -94, -41, -34, 31, 10, 72, -62, 47, -144, -7, 93, -138, -18, 79, 24, -73, 46, -55, 13, 133, 47, -186, 223, 83, 81, -20, 128, 143, -63, + -10, 31, 36, 44, 60, -7, 4, 44, -7, 6, 28, 69, -12, 70, -3, 16, 36, 9, -21, -7, 24, 23, -5, -33, -114, -275, -34, 28, 301, -116, 258, 64, -10, 15, 230, -55, -65, -68, 162, 331, 86, -230, -312, -443, 57, -116, -187, -103, -289, -2, -135, 21, 137, 144, -165, -148, -106, 17, -245, -28, 74, -112, -42, 25, 97, -138, 34, 322, -15, -17, -120, 134, -61, 11, 101, 133, 197, -33, 28, -61, -4, -35, 25, 309, -346, 7, 65, 182, -78, -92, -22, -87, 246, -137, -326, -23, + -98, -137, 79, -322, 117, -35, -91, 6, 226, -68, -87, -88, 107, -102, -29, 19, -11, 39, 2, 15, 66, 5, 16, -17, 53, 12, -12, -61, -34, -5, -34, 63, 37, -36, 45, 5, 5, -33, 16, -15, 0, -504, 188, -158, 211, -190, -17, 146, -292, -50, 89, -79, 425, -178, -54, -170, -142, 218, 243, 94, -286, -345, 319, 54, -324, 121, 12, 153, -96, 146, -194, 95, 312, 129, 133, 71, 5, -79, 65, 25, -214, 4, -68, -156, -157, -59, 123, -225, 30, -162, -17, -24, 74, 134, 282, 100, + -2, 122, -152, -221, -5, 52, 22, 269, -62, -32, -87, -37, 37, 131, -36, 55, -134, 218, -58, -75, -51, 71, -119, 5, 133, -9, -40, 21, 106, 85, -18, 69, -59, 44, -36, 18, 75, -26, 31, 34, -53, 54, 31, 13, -24, -46, -13, 60, 38, -19, 22, -10, 95, -7, -28, -251, -58, -163, -16, 335, 214, 150, -25, -294, 42, -193, -312, -103, 225, -176, -277, 73, 24, -137, 30, 158, 44, -369, -104, 232, 274, 137, -305, -110, 140, -52, -65, 20, 103, 17, 38, 314, 1, 190, 148, -2, + -141, -3, -83, 188, -107, -178, 1, 294, 17, 292, 158, 29, 189, -31, 405, 33, 201, 228, 22, -188, -28, -225, 116, -161, -90, -149, -98, -71, 75, 25, 112, -4, -129, -112, 42, 209, -62, 52, -224, 71, 194, 297, -102, -22, 49, -102, -7, 98, -30, 180, 12, 41, 5, 9, 67, -44, -28, -23, -13, 18, 23, -34, 30, -10, -36, -44, 15, -42, -27, -52, 25, 36, -7, 102, -66, 18, -7, -58, 97, -28, -14, 305, -456, -84, 382, -190, 70, -295, 130, 538, -73, 28, -23, -381, 31, -25, + 571, -181, -28, 249, -157, 353, -239, -36, -361, 407, 6, -161, 5, 149, -189, 283, -30, 251, -2, 131, -394, -254, -184, -60, 238, -358, 191, 147, 50, -149, -215, 491, 98, -56, 191, -174, 104, -232, -227, -95, -152, 530, 159, -106, -157, -203, 167, 137, 50, -187, -23, -76, 227, 20, 184, -429, 233, -38, 12, -49, 76, -190, -88, -298, -97, 107, 182, 191, 71, 69, 45, -107, 64, 42, -7, -72, -118, 62, 60, -92, 47, 5, -74, 48, 14, -33, -17, 4, 15, -56, 39, 20, -86, -21, -44, 6, + 61, 40, -9, 1, -39, 5, -36, 193, 95, 159, 47, 2, -61, -245, -76, -158, 96, -9, 368, -309, -399, -101, 123, -125, -97, 312, 62, -174, -200, -207, 341, -173, 230, -113, 252, -253, 55, 387, 132, -530, 121, 11, -69, -48, 53, -65, 50, -88, 41, -23, -238, 236, 242, -74, 268, -231, -41, -68, -111, 295, -215, -379, -213, 70, -310, -289, -145, -98, -199, -18, 252, 265, 39, 286, 89, 37, 216, -234, -42, -1, -193, -3, -187, 223, -66, -42, 185, -36, -60, -40, 221, -29, 76, -218, -78, 120, + -142, 9, 3, 23, -108, -75, -58, 2, -60, -71, 21, -12, -64, -29, 7, -8, -21, -23, -37, 10, -118, -82, -80, -79, 0, -6, -29, 590, -291, -280, 190, 479, 93, 432, 246, 392, 174, -73, -178, 141, -294, -223, 328, 274, 685, -18, 95, -254, 264, 120, -305, -72, 387, -1, -427, -172, -241, -82, 238, 219, -162, -78, 297, -288, 132, 250, 299, -160, 258, -109, -389, 138, 357, -95, 103, 87, -121, 44, 107, -111, 40, 289, -170, -90, 267, -57, -54, -442, -157, -267, -439, -295, 220, -143, -188, 381, + 380, -95, 409, 165, 269, -75, -212, 178, -220, -438, -264, -112, 216, 101, 362, 65, -78, -58, 0, 64, -113, 8, -66, -8, 63, -10, 10, 118, -43, -20, 116, -84, -44, -55, 34, -62, 42, 28, 18, 63, 78, 37, 141, 19, 96, 34, 72, 85, -74, 68, 71, -50, -17, -5, -103, 32, -298, -319, 432, -72, 986, -406, -191, -23, 241, -137, -134, -406, -470, 213, 41, 650, 210, -66, -74, 432, 440, -364, 264, -347, 91, -149, -179, -106, 74, -56, 228, 115, 256, -32, -122, -240, -47, 280, 25, -371, + -47, 91, -159, 295, 249, 52, 86, -811, -311, 284, -19, 456, 127, 514, -58, -277, 274, -154, 187, 34, 747, 619, 73, 176, -102, 247, 261, 283, 305, 497, -9, 90, -190, -165, 155, -231, -576, -426, -10, 359, -181, -324, -187, -174, -20, -387, -16, 73, -3, -51, -39, 42, 83, -9, 63, -289, -178, -91, -206, 20, -75, -118, -81, -47, 117, 50, -111, 38, 259, 135, -56, -91, -119, -67, -96, -201, 74, -77, -17, 149, 48, -27, 28, -856, 675, -20, 76, -238, 378, -813, -522, -165, -209, -20, -730, 142, + 14, -20, -334, -340, 137, 464, 71, -621, -135, -508, 400, 258, 20, -225, -107, -115, 330, -48, -7, -72, -449, 233, 314, -189, -101, 244, -489, -357, -540, -183, 135, -345, -165, -15, -559, 170, 344, 610, 88, -61, 37, -402, -315, 466, -34, -178, -111, -715, -384, 139, -151, -84, -56, 467, -81, -445, 35, 346, -9, -219, -5, 24, -184, -312, 245, -574, -284, -4, 277, -351, 222, 147, 202, 215, -220, -56, 264, 50, -161, 151, 218, -204, 76, 196, 185, 290, 19, -89, -50, 48, 4, 128, 108, 10, -26, -93, + -32, 64, 130, -215, 28, -41, 89, 207, 11, 145, -77, 97, 119, 175, 137, 171, -12, 98, 84, 453, 417, 151, 706, -315, -147, 115, -184, -54, 231, 756, -121, 154, -4, -46, -12, 834, -403, 433, -4, -546, 182, -541, -331, 314, -285, 222, 13, 31, 374, 300, -448, -508, -381, -127, 146, 148, 56, 102, -611, 95, -328, -769, 526, -150, 495, 529, 32, 198, -281, -342, -606, 141, 557, 99, -243, 34, -122, 86, -325, -266, -325, 58, -38, -105, 359, 323, 195, 523, 60, -548, 711, -517, -158, -129, -136, 596, + -93, -851, 727, -282, -172, 200, 186, 560, 358, 235, 275, 248, 189, 12, 237, 283, 77, 5, 304, -52, 38, -276, -64, -87, -142, 25, -20, 184, 136, 56, -20, 89, 41, 66, 126, -36, -44, 27, -43, 93, 46, 44, 76, 44, 282, 205, 62, 646, 730, 171, -1373, 50, 389, -453, 277, 550, 28, 150, 348, 267, 105, 495, 113, -68, 930, 346, 123, 402, -305, 493, -343, -29, -37, -113, -506, 171, -357, 661, -56, -129, 974, 131, 145, 324, 40, 187, -215, -423, -45, 287, -498, 583, 529, 389, 105, 232, + -343, -360, -568, -252, -305, -293, 140, -55, -555, -248, 496, -8, -457, 262, -21, -314, -745, 53, -1131, 661, -382, 601, 34, 168, 24, -223, 307, 1017, 98, 290, -173, -791, 75, -85, 584, 337, -131, -27, -115, -62, 202, -226, 190, -26, -193, -200, 219, -245, -236, -340, -63, -244, 83, 215, 21, -62, -153, 314, -287, 78, 45, 27, -165, 125, 315, -13, -146, -37, 288, 292, -225, 279, -12, -72, 53, -17, 318, 81, 379, 282, 748, -1029, 406, -603, 514, -256, -433, -124, -499, -210, -112, 180, 229, -146, 719, -34, + -125, -97, -653, -72, 2, -549, 175, -468, -590, -191, 354, -976, -663, -443, 49, -685, -582, -471, -238, -192, -91, -463, 493, 84, -49, -346, -356, 668, -583, -399, 174, 177, 239, -339, -471, -200, -89, 218, -339, -137, -139, -404, -688, -869, 820, -901, -51, 63, -158, -167, -806, 311, -195, -846, -21, -186, 794, 196, 565, 538, -162, 210, -90, -154, 397, -101, 227, -306, 23, -307, 261, 205, 36, 187, -81, -29, 198, 95, -196, 144, 323, -50, 74, -177, -416, -44, -37, -14, -289, -62, 46, -41, -154, 197, -36, -111, + -337, -339, 5, 187, 110, 73, -23, 246, 278, -124, 60, 69, -19, 85, -915, 1059, 168, 107, -183, 538, 7, 886, -241, 608, 328, -874, 379, 144, 415, -71, -233, -348, -128, 427, 940, 99, -137, -594, 225, -643, -101, 648, -585, 1, 42, -101, -221, -250, 1041, -225, -255, -127, 237, 349, 132, 17, -212, -4, 156, 632, -145, 905, 530, 269, -217, 788, 897, -74, -237, -48, -291, 89, -288, 451, 155, 650, 504, -798, -897, 1077, 802, 127, -151, -428, -591, -232, 608, -572, -617, -88, -165, -990, -219, 219, -382, 52, + -1, 51, 82, 163, -289, -181, -297, -109, 1, 43, -161, -79, -26, -489, -160, -233, -105, -14, 46, 19, 85, -33, 21, -258, 151, -223, -252, 180, 82, -459, -46, -145, 229, 434, 13, -373, 302, -87, 82, 102, -116, -89, 32, -201, -258, 469, -384, -125, -81, 93, 15, -578, -1674, 839, -805, 328, 1195, 183, -501, 345, 417, -174, -379, -79, -825, 272, -857, -521, 344, 35, 148, -774, -158, -559, -474, -690, -241, 236, -411, -417, 405, 56, -34, 129, -794, -49, -617, 529, 146, -1511, 381, 810, -173, 483, 407, 274, + 220, 773, 606, 22, -553, -117, 612, 397, -513, 37, -599, -193, 40, 434, 581, -1068, -845, -473, 90, -318, -118, 994, 163, 235, 775, -315, 160, -198, 793, -404, 32, 79, 587, -164, -62, 214, 241, -31, 117, 383, 15, -12, -16, 373, -189, -121, 89, 161, 109, 49, 176, -82, 0, -172, -5, -128, -19, -176, 286, -217, -318, 299, 195, 205, -224, -289, -1, -517, -142, -267, -271, 104, -4, -277, 92, 111, -32, -165, -159, 118, 73, 245, 553, 535, -935, 194, -202, -247, -218, 626, 332, -459, -262, 477, -861, 47, + 312, 478, -103, 105, -1005, -5, -445, 334, 123, 556, -883, -447, -129, 107, -76, 171, 63, 480, 907, -576, -742, 194, -773, -230, 324, -564, -546, 44, 337, 471, 336, -213, -47, -987, -664, 873, -607, 1179, -500, 238, 173, -11, -866, 1084, -505, -105, -194, 422, 819, -829, -470, 969, -718, -4, -270, 197, 1126, 4, -81, -699, 863, -283, 226, 282, -543, -659, 66, 376, -194, 191, -1554, -729, -220, -796, -389, 130, 518, -111, -139, -408, 14, -42, -294, -105, 185, 12, 247, 112, 235, -309, -40, -67, 326, 252, -189, 588, + 222, -241, 363, 95, -31, -190, 140, -138, -122, 261, 28, -119, -98, 218, -56, 197, -40, 361, 82, 53, 542, -607, 176, 513, 507, 1144, -719, 1051, -180, -680, -666, 178, 442, -298, -135, -467, -190, 892, -621, -53, 717, -225, 430, -279, -131, 761, -22, 44, 733, 511, 182, -84, 620, 846, -852, 796, -753, 407, -543, 120, 655, 229, -1477, 663, 424, 1, 754, -1169, -224, 805, 683, 120, 1072, -562, 16, -130, -162, 465, 192, 807, 669, -493, 445, -921, -285, 81, -44, -65, -148, -1447, -800, -1116, -760, 843, -517, -118, + 98, 1375, -325, -474, 1100, 680, -30, 896, 137, 176, -413, 10, -345, -358, -187, 296, -349, -175, 171, 74, 276, -101, -45, 364, 208, 30, -281, -218, -34, -78, 212, 364, -26, 73, 82, -134, 882, 283, 63, 46, -288, 245, -515, -28, 444, -20, -118, 333, 184, 110, -9, -277, 191, 221, 68, -364, 352, 902, -498, 348, 445, -650, 83, -800, 304, -86, -427, 634, 19, 989, -61, -741, 1252, -225, 125, 172, -1175, 353, 1011, 360, -439, -769, 80, 187, 864, 557, -282, -169, -673, 6, 978, -1329, 403, 929, -836, 306, + 87, 322, 979, 326, 378, -182, -961, 995, -185, -509, 2087, 1026, 532, 91, 48, -982, -804, -365, 613, -21, -569, -402, 773, -473, 533, 302, -381, 569, 261, -827, -412, -485, 137, 517, -1034, 340, -1059, -1340, -842, 1284, -443, 265, -300, -446, -64, -532, -368, -284, 66, -510, 60, 297, 0, -449, -333, 156, 51, 569, 77, -657, -255, -378, 539, -111, -218, -521, -7, 310, 143, 354, -180, -60, 105, 359, 230, -12, -205, 267, -251, -28, 146, -236, -6, 402, -13, 73, -445, -316, -339, 199, -360, 1279, 2131, -353, -69, -1744, + -585, -1282, -855, 1193, 86, 326, -988, 323, -868, -1953, 286, 943, -76, 125, 1013, -1337, 1532, 766, 479, -755, 1030, 1986, -393, 617, 1507, 1275, 2245, 492, 807, 615, 548, 1932, -500, -224, 712, 427, -208, 1066, 66, 229, -628, -1717, 69, 1155, 177, 702, -1241, 84, -1651, 10, -1774, 129, 1247, -151, -527, -1685, 2218, 411, 150, 2303, -26, -517, -386, 127, 461, -118, 10, -174, -1213, 729, 282, -753, -465, 611, -732, -1262, -618, 285, 1217, -1263, 1013, -42, 541, -214, 441, -297, -43, 117, 124, 414, 370, 83, 777, -34, 319, 415, + 238, 185, 185, 677, 499, 247, -264, -105, 581, -771, 297, -459, 110, -168, 523, 609, 1227, 690, 1158, 667, 242, 1221, 1262, 1206, 687, -207, 719, 801, 490, 963, 721, -4, 213, 158, 150, 272, 193, -252, -251, -1, 182, -668, -2223, 112, 3016, 443, -608, -577, -1366, -892, 48, 1886, 339, -1252, -83, 517, 132, 42, -115, 331, -889, -333, 468, 1046, 1061, -988, -371, 79, 151, 268, -1129, 113, 198, -297, 832, -6, 959, 1428, 695, 298, 634, -807, 750, -651, 1115, 1947, 655, -1048, -891, 884, 337, 1660, 1262, 384, -295, -369, + 68, 89, -559, 647, 582, 110, 1514, 1027, -119, 734, 834, 383, 834, 38, -1403, -173, -322, -327, 1642, 749, 285, 1291, 786, 824, 1032, 351, -1006, -509, 0, -16, -338, -300, -598, 390, 276, 606, -257, 676, 216, 700, 495, -153, -329, 107, 217, 8, 109, 513, 79, 803, 1104, 309, -60, 80, 802, 179, -213, -204, 642, -31, -157, -118, 235, 432, 895, -453, 104, -294, 107, 34, 740, -378, 385, 426, 292, -321, 137, 497, 101, 15, 516, 67, 325, 183, 87, -81, 124, -53, 144, 50, 149, 46, -16, -444, -2119, -459, + 1181, 638, 2586, 140, -377, -1161, -2274, -2497, -418, 1075, 1207, 774, -1263, -1667, -14, -205, 662, 1737, 882, -164, -1045, -1414, -891, 57, -873, 338, -732, -360, 1153, 957, 847, 333, -1195, -332, -1144, -876, -464, 672, -133, 714, 1751, 1834, -772, 211, -1361, -925, -654, -117, 244, 1063, 1124, 1564, 1101, 400, -784, -711, -182, 504, -1287, 95, 1479, 1191, -325, 1615, 1427, 815, 1492, -2851, 664, -809, -895, 492, -488, -39, 2862, 2438, 846, -750, -85, -1142, -243, -1536, -565, -256, 573, 1886, 966, 398, 315, -300, -967, -1213, -19, -800, 620, -66, + -29, 727, 566, 227, 587, 221, 930, -664, -41, -732, 278, -635, -616, 107, -208, 513, 872, 60, -868, -1403, -457, -811, 60, 372, 633, -539, -230, 722, 64, -3659, -4150, -4462, -4509, -6115, -360, -2189, -706, 815, 2049, 2875, 2965, 6056, 6492, 5287, 3933, 4167, 3972, 1534, -587, -2722, -2728, -4187, -1358, -2266, -1689, -154, -3553, -1018, -3172, -859, -3646, -3436, -1585, -2836, -286, -1429, -1323, -2120, -1404, -3205, -2266, -1200, -1102, -1693, -1037, -118, -1371, 470, 2059, -1592, 2435, 1465, 3248, 3265, 2849, 3514, 2967, 4896, 4861, 3879, 5186, 4450, 6791, 6690, 7882, 6139, + 6606, 7202, 6505, 7780, 5765, 8426, 6733, 2571, 3294, 873, 1306, -4551, -3821, -4264, -4540, -4784, -6184, -5818, -6398, -7020, -8255, -6896, -6317, -7018, -7658, -9127, -7325, -8109, -8167, -6194, -6988, -4030, -5007, -3424, -3182, -1681, -1231, -1740, -298, 830, 3975, 3771, 2735, 3096, 3325, 4509, 4612, 4991, 5258, 4526, 4594, 3381, 4780, 4894, 3725, 2627, 2024, 2945, 2909, 2269, 1355, 752, 1138, -301, 145, -540, -435, -2161, -1978, -1436, -997, -1290, -988, -473, -398, -503, -901, -807, -407, -507, -333, -265, 11, 67, 2, -118, -67, -10, -44, 30, 42 } + }, + { + {-87, 160, -6, 66, 25, -140, -105, 37, -95, -141, 80, -17, 21, -81, 59, 6, -125, -6, 144, 117, -90, -158, -144, 21, -33, -28, -123, 133, -36, 38, -56, -34, -12, 51, -36, -70, -269, 91, -21, 87, 52, 37, -7, 179, 34, 36, 25, -92, -59, -9, 13, -92, -22, 36, -13, -87, -46, 3, 85, -133, -180, -223, 79, 128, 13, 106, 77, 15, -205, -5, -54, -72, 3, 11, 85, -18, 121, 86, -38, -123, -60, -22, 31, 9, 39, 46, 84, -2, -8, -40, -35, -33, -15, -68, -32, -39, + 21, -5, -9, -21, 32, -48, 97, 126, -29, -2, -181, 161, -208, 80, 349, -75, -130, 20, 182, 19, -52, -26, -53, -33, -165, -64, 81, -131, -75, 7, -8, 144, -88, 27, -34, 31, -19, -84, 159, 271, 68, -16, -51, 293, 13, -123, 8, -219, 0, 114, -169, -22, 36, -135, -41, 155, 22, -17, 149, -100, -157, 89, 59, -110, -55, -118, -138, -148, -82, -85, 120, 85, 23, -4, -83, 77, -18, -57, 102, 112, -80, -16, -38, -51, 16, 129, -65, 29, 123, 81, -28, 31, -22, -3, 52, -7, + 1, 53, -57, 23, 12, -18, -52, 40, 5, -23, 12, 6, -19, 6, -10, -17, -31, 178, -260, -172, -62, -38, 9, 33, -248, 172, -78, 56, 36, 57, 108, -1, -36, -83, 179, -14, 116, 221, -48, 188, 160, -139, 93, 94, 101, -245, -24, 15, -77, -154, 2, 180, -42, -77, -60, 55, 167, 82, -85, -1, -70, 7, -22, -83, 156, -201, -166, -153, 47, -21, -6, -188, -198, 48, -4, 11, -20, -11, -148, -88, -162, 32, 138, -43, 123, 23, 109, -236, 1, 34, -79, -36, 31, -84, -11, 62, + 67, -52, -158, 139, 22, 3, -35, -20, -127, 6, 9, -22, 23, 4, -45, 19, 20, -13, -18, -6, -8, -9, 7, 67, 1, -20, 55, 25, -4, -18, -6, -89, 22, -18, 153, 244, 15, -93, -207, 95, 62, 58, 258, -169, 6, 31, -47, -85, 38, 16, 156, 344, -30, 59, 144, -62, 128, 223, -156, -6, -58, -3, 99, -174, 188, 42, 2, 99, -16, 137, -74, -32, -39, 216, 100, 137, -26, 113, -209, 242, -94, 95, -220, 89, 160, 295, 108, 55, -194, -74, 54, -147, -174, -41, 348, 403, + 77, 95, -115, -51, 225, 44, 99, -14, 69, 61, -30, 52, -33, 39, 27, 143, 116, -179, 159, -52, 82, -56, 60, -47, -66, -1, -106, 17, 78, 18, 40, -38, -47, -24, 19, 3, 18, -7, 12, -30, 11, 11, 57, 3, 39, -18, 34, 170, 5, 21, 238, -201, -236, 369, -95, -59, 241, 144, 18, -423, 457, -84, -58, -48, -25, 18, 28, 143, 213, 141, -30, 239, 152, 77, 65, -88, 109, -172, 137, -26, 58, -145, -211, 27, -26, 78, 128, -63, -202, -118, 50, -243, 158, 49, -387, 175, + 27, 101, 26, 61, 66, -15, -109, -94, -264, -194, -107, -134, -29, 16, -193, -273, -40, 179, 308, -15, -204, 35, -321, 23, -21, -126, 272, 256, 87, -9, -65, -19, -141, 68, 261, 140, 216, 44, -97, 101, 53, -6, 22, 13, 7, 47, 49, 47, -13, 82, 23, 160, 63, 43, 9, 14, 43, -11, 76, 28, 30, -42, 94, 24, -32, -13, -415, 215, -79, -147, -117, -141, -197, 381, -484, 114, 117, 159, 237, 39, 66, 89, 64, 50, 80, 209, 38, -114, 0, -20, -149, -135, 69, 140, 150, 21, + 107, -252, -29, -3, -14, -239, -143, -86, 156, 141, -2, -262, 2, -142, -101, -51, -70, 165, 224, 68, 233, -372, -260, 124, 76, 13, 49, 25, -121, -234, -162, 124, -105, 190, 187, -68, 177, -282, -139, -79, -95, 21, 514, -74, 145, -82, -74, -52, 109, 117, -14, 95, 64, -160, 44, 13, 69, 15, 8, -80, 52, -3, 52, 17, 27, -15, -31, 16, -47, -67, 23, -37, -58, -17, 17, 23, 23, 26, -3, 18, 36, 31, 10, 9, -12, -19, 34, 425, -81, 12, 179, -404, 278, 141, -227, 253, + 283, 95, -436, 270, 12, -41, 221, 239, -13, -70, 7, -169, 159, -92, -161, -339, 80, -369, 99, -90, -41, 107, -300, -123, 250, -22, -116, 153, 10, -131, 114, 41, 11, -56, 87, -183, -19, -267, 253, 253, -315, 211, -224, -85, 218, 304, -22, -151, 92, -19, 44, -371, -293, 59, 53, -80, -76, 97, -11, -131, 157, -152, 54, 114, -26, 179, -178, 181, -1, 287, -98, 87, 162, 19, -103, -29, -10, 84, -28, -135, 114, 25, -56, 51, -38, -1, -53, -15, 39, -45, 29, 79, -41, 19, 6, -26, + 50, 14, 43, -63, 26, -65, -74, 28, -12, 30, 32, 10, 117, 51, -155, 298, -102, 145, -301, -21, -80, -273, 9, 193, 343, 449, -256, -7, -319, -24, -203, 181, -190, -376, 24, -241, -23, 311, -185, -184, 334, 10, 57, -35, -197, 83, 71, 403, -278, 197, -236, 59, 78, -233, -144, 387, 106, -288, -75, -106, -231, -10, 379, 203, 264, 60, 105, -346, -50, 440, 35, -274, 146, 145, -201, -175, -97, -452, -70, 134, 223, 397, -100, -217, -63, -135, 322, -120, -282, -192, -83, -39, -88, -163, 351, -201, + -25, 32, 17, 114, 71, -104, -139, 104, 125, 132, -31, 60, -37, -22, 59, -13, -62, 62, 29, -2, -41, -14, -103, 9, -26, -89, -45, 40, 35, 1, 41, 193, -670, -462, -296, 35, -562, 84, 418, 138, 430, -231, -106, -47, -224, -84, -336, 597, 341, 238, -504, -97, -162, -328, 113, -34, 106, -407, -28, -36, -292, 170, 48, 299, 120, -250, 393, -186, 160, 83, -3, 312, 290, 73, -376, 459, -232, 329, 150, -170, -189, 369, 54, -43, 96, -311, -112, 179, -26, 326, -188, -294, 121, 83, 10, 324, + 140, 66, -207, 236, 92, -181, -25, -19, -104, -75, -88, 142, 356, 600, 279, -101, 30, -138, 138, 185, -3, -153, -90, -200, 123, -109, 29, -94, -26, 133, -16, 15, -122, 130, -69, -58, 71, -120, 131, -92, 70, -65, -12, 30, -90, -63, -39, -145, -147, -64, -8, -51, 115, 107, 62, -423, 569, 236, 650, -292, -349, 620, 21, -64, 136, 48, 363, 484, 63, -449, -720, 101, -198, 44, 21, -311, -20, 392, 321, 252, 505, -114, 428, -300, 379, 125, 294, -196, 517, 298, 378, -599, -3, 545, 311, 99, + -129, 821, 346, -321, -198, 200, -313, -30, -150, 43, 689, 722, 524, 193, 6, 272, -239, -60, 296, -305, 729, 455, 358, 142, -28, -343, 433, 16, 378, -168, 147, -242, -139, -6, 191, -285, 679, 293, -74, -332, -640, 315, 56, -207, -19, 80, -149, 94, 247, -42, -84, 9, -52, -63, 56, -76, -56, -105, 111, 64, -160, 91, 104, 101, -3, -47, -18, -1, 54, -13, 40, -94, 157, -196, 4, 68, 176, 702, -42, -348, -158, -273, -11, -438, 112, -378, 212, 47, -103, -298, -355, -538, -558, -167, 482, -37, + -316, 129, -301, 229, -258, 451, -466, 107, -331, -339, -63, 56, -99, 212, -670, 268, 63, -163, -47, -46, -332, -532, -570, 408, 201, -224, 353, 10, -149, -421, -881, -726, 409, -128, 8, -89, -43, -44, -597, 224, -705, -377, 31, -24, -152, -97, -95, 723, -226, -239, -199, 757, -139, -308, 480, -380, -242, -314, -264, -983, 195, 154, -330, -50, 227, -130, -90, -185, -169, -27, -89, -90, 340, -31, -39, 225, 270, -138, -101, -26, -50, 66, -168, 15, 17, 27, -101, -126, -52, 108, -47, -94, -14, 67, -216, -38, + 119, 4, -87, 111, -76, 98, -2, 93, 102, 102, -189, -23, -1037, -783, -448, 906, -46, -151, -111, -71, -299, 321, 248, 812, -749, -146, 231, -548, -219, -194, 935, -14, 216, 476, 43, 458, -494, -621, -416, -114, -106, 74, 292, -14, -523, -361, -27, -279, -587, 524, -87, -293, -4, 168, 167, 98, -265, 54, -546, -239, -810, 381, 245, -96, -254, 299, -403, -103, 873, -92, 740, 331, 198, -194, -929, -386, -179, -500, -374, -238, 416, -190, 9, -374, 793, -284, 327, 222, -541, -218, 119, 501, 915, 762, 330, -52, + 314, 2, 27, -179, 92, -185, -129, -3, 54, -112, -149, -268, -213, 113, 88, 93, -99, -42, -533, -11, -246, -116, 97, 73, 31, 219, 5, -32, 22, -90, -386, -38, -220, 109, -195, -213, 25, 245, 112, -72, -145, -135, -64, 131, 35, -61, 539, -25, -305, 333, 191, 1126, 40, 14, 398, -506, -348, -99, 94, 184, -135, 478, -290, 69, 450, 204, 168, 169, -328, 65, -8, -159, 71, -237, -424, -219, 36, -416, 545, -36, 57, -71, 376, 425, -77, -307, -26, -95, 500, 643, -451, -308, -227, 164, 478, -420, + 145, -14, 103, -216, -292, 97, 316, 63, -383, 354, 1031, -328, 195, -73, 83, 401, 116, 472, 395, -98, 604, 1095, 48, -398, 1072, -17, 1025, -349, -495, 475, 186, 717, -111, 1008, 322, 237, -295, 479, 61, 52, 117, 392, 87, 447, 60, 114, 21, 71, 77, 146, -39, 163, 379, 161, 177, 57, 106, -204, 188, 75, 90, 138, 77, -9, 4, 109, -98, 41, 12, 98, 273, 100, -2, -130, 147, 29, 41, -20, 144, 85, 210, -706, -228, 1102, 184, -509, 152, -385, 143, 212, -89, -583, -219, -872, 362, 299, + -335, 325, 507, 104, -135, -509, 117, 815, -389, 489, 467, 74, 352, 326, 16, 406, 271, -775, -109, -312, 793, 526, -552, 340, -63, 419, 1323, -125, -223, 132, 1191, 489, -72, 152, 216, 687, 607, -414, 728, 334, 675, -477, 73, 136, 144, 417, 619, -402, -319, 491, 246, -166, -175, 2, 744, -1401, 331, -498, -368, 68, -480, -446, -64, -766, 554, -162, 585, -20, 512, -337, 206, 13, 170, -15, -196, 155, 109, 124, 250, -121, 126, 173, -143, 14, 239, 89, -128, 267, -175, 36, 139, -170, -129, 55, 53, 298, + 246, 177, 89, -27, 191, 44, 84, 86, 159, 194, -160, -133, -260, 206, 80, 18, 64, -273, -262, 183, 238, 251, -310, -370, -958, 45, -535, 875, 107, -225, -129, 526, 152, 853, 344, -219, 36, 182, 388, 642, -715, -618, -129, 1078, -331, 140, 308, 474, 573, 820, 707, 64, -167, 766, 60, -485, 260, -449, 327, 84, -402, 371, 1439, 803, -507, -382, -51, -396, -394, -339, 248, -192, -335, 77, 396, 239, 132, 567, 152, -134, 597, 505, -429, 295, -485, -378, -430, 1, -1041, -306, 727, 538, -247, 362, -86, 28, + -640, 147, 386, 613, 344, 407, 223, 196, -272, -238, -289, 165, -62, 25, 124, 130, -12, 318, -99, -137, -150, 224, -289, -116, -357, -18, 71, -153, 14, -84, 224, -42, -471, 8, -32, 141, 184, 61, 209, -12, 340, 71, -27, -8, 37, 15, 17, -390, 324, 262, -496, -212, -1080, -85, 902, 12, -660, 108, 32, -443, 602, 349, -241, 172, 273, 372, 207, 66, -266, 147, 214, 575, 858, -234, -577, -303, 164, 180, 706, -269, -552, -430, -442, 855, 1567, 570, 79, 1719, 104, 714, 407, -144, -360, 306, -487, -324, + 349, 24, -1035, -1072, -268, 449, -559, -701, -386, -518, -427, 363, -297, -794, 358, 32, -231, 187, -179, 402, 1612, -987, 813, -1122, -637, -372, -254, 626, 253, 300, -121, 348, 724, 182, 17, 10, -209, 101, 199, 580, -34, -286, -42, 443, 285, -124, 168, 202, -159, -5, -68, 557, 202, 264, 196, 160, -229, -162, -35, 144, -280, 42, -276, -190, 45, 30, -317, 312, 425, -41, -54, 259, 4, -110, 377, -154, 262, 24, 872, 561, 506, 743, -867, 333, -908, -37, 1187, 1056, 450, 16, 206, 134, -341, 275, 342, -1497, + 92, 220, 455, -548, -842, 618, 292, 157, -360, 732, -103, 569, 473, -57, 73, -166, 577, -342, 176, 347, -30, 737, 427, -42, 379, 430, -22, -333, -1122, -207, 120, -665, 65, 530, -1019, -453, 157, -439, -70, 537, 32, -381, -496, 221, 216, -1031, -343, -86, 5, 647, 318, 72, 1132, -143, -36, 44, -645, 611, 6, 1003, -388, -168, 302, 151, -854, 28, -117, -342, -275, 106, 36, -242, -20, -150, -105, 31, -365, 105, 51, -52, 141, 38, -240, 49, 71, 64, -232, 341, 69, 444, -326, 41, -274, -98, -49, -492, + 106, 45, -19, -67, -87, 181, -219, -172, 216, 285, -284, -1059, -923, 169, -475, -149, -711, -886, -932, -613, 665, 908, 24, -748, 59, 35, 10, 345, 580, 580, 15, -375, -930, -533, -814, -175, 4, 69, 84, 115, 224, 291, 548, -860, 378, 150, 190, 462, 816, 917, -528, 409, -730, -228, -662, -65, -258, 1525, 541, 1098, 46, -589, -253, 703, 761, -447, 1405, -589, 88, 62, 244, 516, 1563, -109, 383, 870, 199, -690, 438, 1600, -292, -387, -944, -79, 590, 364, 49, -907, -687, 115, -717, 216, 32, -902, -103, 92, + -142, 651, 611, 13, -178, -388, 423, -180, 736, -168, 9, 504, 506, 720, 556, -407, -160, 97, -135, 49, -310, -298, -302, 158, -370, -431, 255, 334, 30, -369, 235, 131, -91, -94, -251, -5, 144, -63, -225, -293, -56, -192, 241, 136, -125, -161, 308, 1420, -74, -9, 602, 116, -1963, -618, 1393, 463, -410, -783, -111, -518, 718, 372, 134, -415, -930, 199, -1601, -196, 781, 1067, -124, -907, -618, -1872, 548, -325, 732, 553, -533, -388, -1662, -1249, 649, 1770, 706, 840, -591, -1054, -1011, -425, 1504, 2027, 1057, -2358, -864, -1807, + -966, 2237, 545, 495, -298, -2155, -1765, -1771, -330, 171, 1114, -415, 848, -1710, 1061, 424, 129, 2148, 137, -200, -104, -2918, -892, -199, 918, 479, 419, 1287, -1378, 88, -911, 992, 716, 68, 198, 211, -163, 589, 316, 156, 502, -343, -641, 155, 459, 698, 575, 379, -482, -781, -1095, -98, 78, 885, 1096, -166, -836, -1436, -689, 102, 1095, 1759, 458, -1721, -1766, -1802, -20, 1469, 1293, 1365, -460, -667, -1284, -1297, 474, 876, 1143, 580, -908, -857, -485, -136, 1056, 558, 173, -49, -640, -459, -96, 130, -842, 1616, 694, 741, -2002, 402, + -2790, -617, -8, 394, 160, -1789, 968, -497, -323, -338, -382, -440, -554, 1169, -336, -1008, 320, -287, 122, 562, -1137, -408, -71, 474, 47, 1285, -111, -738, 1698, -1441, 839, -1336, -443, 649, -1086, 77, 785, -412, -96, -83, 1011, 1543, 892, -522, -216, -243, 96, 494, -207, -309, 298, 157, -2800, -114, -106, 406, 345, 17, 2, 795, -883, -228, -88, 606, -2251, -317, 2030, -522, -823, -9, 1536, -284, -371, 418, -608, -635, 946, 1469, -536, -749, 250, 439, -237, -788, -21, 113, -164, -116, -251, -344, 157, 10, -320, -58, -17, -12, + -295, 167, -394, -413, -246, -253, 377, -56, -86, -10, -223, 315, -418, 118, 6, 29, 280, -14, -502, 57, -138, 93, 61, -447, 697, -185, -73, -68, 58, 178, -23, -373, -681, -2049, -1683, 1471, 1254, 115, 1340, -1469, -90, -2833, -1010, -505, 1366, 1244, 760, -1144, -397, -55, -548, 264, 491, 639, 855, -660, 477, -1228, -778, -199, -265, 28, 805, -970, 830, -378, -541, -218, 74, -1218, -31, -1103, -414, -431, -1048, 1432, 656, 322, 347, -282, -1468, -2175, -1272, -1280, 862, 203, 929, 1297, 1068, -356, 253, -753, -579, -688, 533, -729, + -38, -696, -719, -454, 841, -685, -195, 65, -101, -986, -1061, -645, -383, -1429, -851, 212, 854, 892, 1138, -78, -933, -1208, -930, 469, 148, -153, 552, 1401, 370, 371, -359, -270, -466, -286, -152, -452, -107, 530, -118, -240, -437, -486, -546, -166, 263, -150, 111, 61, -980, 101, -469, 405, 783, -400, 541, -74, 130, 13, -775, -128, -254, 702, -453, -3054, -4139, -3912, -3721, -4461, -749, -1236, 788, 1259, 3991, 2564, 3384, 4665, 5129, 3501, 4456, 2535, 1180, -181, -840, -1140, -1885, -1849, -2554, -1082, -941, -2402, -1795, -1718, -1954, -3177, -2165, -1667, + -1340, -2447, -344, -735, -1020, -2371, -2191, -1806, -1545, -1122, -459, -1508, 433, 780, -1181, 1320, 1835, 1762, 3199, 2600, 2002, 2203, 2217, 2200, 3362, 3784, 3718, 2544, 4010, 3960, 4126, 4196, 4765, 4231, 4468, 5930, 3025, 3055, 3097, 2886, -138, 1318, 1658, -953, -516, -1641, -3009, -2723, -2876, -5176, -3801, -2313, -4048, -4283, -3537, -3767, -3731, -4477, -4106, -4144, -3881, -3620, -3305, -3058, -3065, -2546, -2149, -3394, -523, -1527, -1757, -397, -221, -1718, -221, -663, -249, 631, 756, 1989, 1178, 1662, 1841, 2005, 1817, 2540, 2476, 2639, 2461, 2956, 3035, 2981, 2408, 3118, 3275, 2539, + 1705, 1651, 993, 856, 221, -121, -115, -548, -490, -379, -233, -485, -508, -471, -236, -463, -579, -362, -135, -360, -496, -417, -315, -466, -597, -628, -391, -324, -559 }, + {-193, 243, -19, 98, 49, 115, -207, -112, 133, 64, 1, -115, 23, -321, -207, -11, -123, -139, 57, 251, 42, 191, -44, 189, -113, -101, -13, -170, 34, 84, -62, -4, 44, 8, 77, -9, -182, 65, -113, -85, 51, -112, -170, 169, -179, 161, 150, 99, -8, -210, -122, 23, -40, 269, -165, 65, -22, 35, -204, -340, -60, -102, -114, -27, 143, -32, -154, 134, 57, -69, 112, -22, 33, -157, -13, -40, -3, 60, -72, 48, -144, 96, -23, 10, -53, -48, 0, 58, 21, -2, 22, -2, -87, 24, 6, 54, + -10, 1, -1, 1, -6, -31, 131, 130, 19, 235, -3, 102, 126, -1, -115, 12, -163, -209, -79, -238, -246, -80, 162, -58, -56, -128, -32, -224, 109, -63, 55, 134, 46, -47, 92, 87, -109, 76, 10, 20, 82, -195, -84, 138, -89, -7, -56, 153, -197, -16, -165, 107, -10, -12, 149, -64, -71, -51, -139, 10, -63, -11, 9, 95, 96, 32, -43, -164, -268, -83, -19, -66, 144, -58, -83, 115, -74, -115, 255, -55, -143, -13, 23, -43, 126, -16, -112, 2, 5, -24, -34, 100, 23, 14, -60, 12, + -18, 7, 39, -9, 22, 46, 6, -9, -10, 20, -57, -21, -11, -26, 24, 20, -9, 273, -173, -82, -126, 101, 20, -12, 197, 47, 58, -285, 53, -133, -155, -201, -3, 8, 239, -195, 90, -82, 296, -106, -98, 211, -80, 73, 32, -14, 35, -141, 23, 7, 60, 278, 97, 26, -118, 98, -216, -60, -41, 119, 101, 168, 110, -126, -185, -80, 142, -17, 74, -29, -20, 283, 67, -21, -337, -150, 9, 118, 180, 254, 142, -61, 46, -62, -86, 183, -115, 188, 9, -169, 61, -87, 146, -125, -14, 128, + 146, -146, -56, -27, -60, 88, -20, -62, 41, 22, 22, 25, 35, 20, 21, 10, -10, -12, -54, 85, -3, 6, 10, 2, 14, 46, 44, -1, -11, 57, 43, 34, 143, -34, -24, -53, -167, 7, 120, 120, 224, 103, -295, -246, -214, 9, -36, 16, -116, -72, -18, 89, -1, -189, 204, -29, -189, 39, 45, -4, -18, 82, 108, -68, 165, 8, 97, -225, 160, 57, 92, -155, -17, 113, 97, 246, -9, -340, -93, -163, 80, 55, -14, -91, 26, -139, -49, -253, -149, -9, 141, 157, -114, -97, -100, 162, + -55, -20, -243, 147, -240, -83, -10, -51, -65, 256, -22, -59, -68, 51, -154, 18, -267, -215, 78, -75, -40, 95, -48, 127, 25, 58, 90, -24, 43, 29, 17, -19, 33, 13, 8, -20, -21, 5, -78, -1, 49, 12, -3, 9, -48, -16, 29, -14, 68, -88, 125, -101, 0, 173, 315, 218, 47, -247, -185, 66, -42, -158, -52, -204, -88, 410, 47, -44, -76, 0, -95, -66, 277, -287, -34, 28, -61, 72, 167, -77, -95, 42, -118, -115, -267, -99, 72, -239, -40, 119, 180, 64, -375, -113, 75, 189, + -147, 326, -38, -166, -92, -71, -129, 177, -133, -35, -175, -137, -64, -140, 187, -69, -376, 144, 252, 3, 91, -457, 357, 7, -300, 30, -203, -43, 32, -218, -255, 170, 79, -221, -15, 6, -137, -17, -51, 34, -121, -63, -24, -60, -31, -89, 29, -6, 46, -97, 23, 55, -2, -55, 35, -54, 51, 41, -41, 40, -8, -29, -14, 14, 19, 12, -338, 76, -249, 266, 68, -101, -201, -352, -153, -255, 88, 493, 85, -128, -7, -67, -75, -222, -146, -228, 63, -17, 51, -80, 39, -241, -16, 56, -163, -60, + 21, -89, 25, -82, 365, -444, -78, 36, 120, -46, -182, -272, -193, 147, -38, 163, -138, 422, 56, -81, -3, -250, -319, -161, 122, -273, -16, 321, -8, -152, -304, -515, 22, 264, -72, 303, -26, -95, -189, -168, 31, 121, -96, 440, 134, -141, 69, -181, 68, 83, -59, 95, 180, 76, 10, -118, -322, 22, -72, -33, -48, 23, 8, -4, -142, 23, -81, 27, -80, -27, -20, -7, -6, -16, -57, -52, -62, -94, -98, -42, 6, 26, -51, -2, 4, 10, -39, 289, -127, -334, -91, -250, -130, -109, 354, -89, + -119, -150, 228, 205, 181, 500, 524, 243, 326, -123, -151, 216, 321, -140, 141, 99, -279, -264, 156, -39, -3, -264, -334, -80, -271, 307, 574, 118, 227, 66, -67, 205, -392, -105, 82, 218, -129, -317, 463, -1, -142, -113, 190, -57, 170, -116, 266, -22, -7, 328, 102, 151, 59, -50, 245, -373, -149, 140, 422, -257, -30, -52, -59, -176, -39, -91, -121, -17, 29, 119, -50, 339, 124, -195, -47, 25, 130, 46, -59, -117, -25, 75, -75, -66, -58, 70, 43, 69, 36, -62, -25, 2, -63, -11, 49, 31, + -8, -70, 93, -12, 58, -39, 28, -81, -8, -12, 4, -54, 209, -205, -79, 189, -147, 82, 143, -280, -298, 86, 230, -78, 210, -152, -67, 399, -451, 273, -128, 4, 13, 492, -109, 97, 157, 271, 159, 238, -39, -38, 78, 39, 40, -237, 369, -492, -108, -129, 275, -55, 336, -15, 32, -586, -160, 358, 608, -5, -301, -254, 250, 201, 151, 144, -258, -118, -149, 79, 11, -158, 94, 82, -74, -81, -353, -93, -129, 505, 47, 96, 192, 16, -395, 20, -238, 198, 473, -250, 146, -71, -245, 119, -205, -35, + 86, 64, 108, 46, -17, -89, 103, 221, 38, 110, 182, 81, 206, -62, 195, 10, 5, 43, 22, 56, -6, -95, -53, 5, 52, 55, -37, 95, 90, -75, 126, 213, -367, -141, -138, 70, -21, 546, -69, 19, 347, -309, -225, -290, -304, -74, -11, 136, 584, -54, -336, 605, 10, 169, 413, 285, 386, -101, 305, -197, 404, 352, -96, 183, -162, -151, 153, 462, 208, 182, 66, -148, -255, -261, 42, 317, -185, -224, -274, -105, -542, -128, 104, -400, 193, 27, -182, -469, -313, -1, -620, 193, 137, -15, 173, 111, + -61, -325, -196, -38, -205, 189, -215, 512, -346, 16, 226, 18, -155, -596, 103, 289, 70, 15, 322, 175, -184, -2, -22, 22, -13, -105, -209, -65, -226, 10, 56, 25, -59, -119, -54, -81, 98, 27, 128, 89, 74, 25, -11, -48, -40, -106, 47, 3, 47, -53, -7, -89, 5, -71, 26, -757, 266, 346, 609, -2, -452, 128, 218, -468, -487, -304, -12, 260, -14, -191, -10, -167, -113, -302, 504, 394, 148, -618, -185, 100, -35, -137, 782, 287, 246, 231, 371, 279, 68, 292, -20, -485, 263, -499, 153, -494, + 418, -130, 505, -275, 123, -222, 182, 296, 771, 163, -980, -51, -136, 211, 428, -86, -190, 315, -55, -154, 421, 27, -19, 22, 181, 338, 267, -289, -215, -182, -294, 70, -27, 334, 240, -449, -109, -254, 218, -123, -120, 80, 15, -172, 149, 37, 25, -25, 84, 89, 14, -253, 71, 46, -33, -44, -85, 4, -113, 54, 128, -38, -38, 127, 19, -116, -90, -20, 61, -50, -12, -71, 19, -47, 0, 122, -81, 824, -313, -550, -175, 214, -136, 396, 573, -231, 526, 339, 264, -87, -64, -106, 510, 93, 61, -298, + 129, -156, -14, -491, 332, -451, 2, -318, 532, -272, 11, 526, 399, 270, -33, -209, 244, -8, -48, -672, -200, -406, -330, -258, -122, 349, 219, 204, 0, 514, -273, 544, 478, 513, 897, -347, -271, 394, 74, -348, 541, -178, -262, 175, -68, -188, -156, 232, -315, 142, -195, 497, -212, 8, 145, 363, 493, 39, -432, -469, 152, -313, -1005, -529, 159, -12, 289, 36, -165, -20, -96, 42, -175, -77, -120, -51, 13, -23, -315, -83, -207, -186, -146, 63, -16, 12, -230, -161, -10, -10, 43, 117, 95, 70, -166, 7, + 36, -214, 73, 11, 91, 40, 116, 65, -50, 98, -78, -59, -769, -650, -31, 137, -444, 20, 39, 716, -467, -534, 173, -225, -1, -390, 372, -397, -531, -321, 614, -419, -342, -79, 249, -184, -440, 136, -178, 2, 200, -581, -44, 321, 517, -79, 790, 346, -90, 35, 359, -148, -321, 61, 428, 48, 206, 9, -351, 121, -770, 70, 42, -98, -453, -412, 50, -188, -311, -209, -250, 294, -506, -289, -146, 220, -298, 621, -93, -522, -45, -311, -829, -248, 55, -25, -539, -288, -123, 123, -320, -159, 532, -189, -725, -255, + 94, 55, 238, 201, 150, -169, -210, -50, -147, 105, 32, -93, 155, 64, 91, -63, 75, 56, 0, -31, -53, -68, 2, 42, -258, 55, -148, 166, 61, -191, -169, -15, -133, -20, 54, -49, -90, -142, -107, 74, 28, -160, 60, 17, -106, -91, 587, 525, 157, 1075, -200, -376, -336, -158, -579, 783, -469, -171, -380, -196, -178, 92, -551, 9, 7, -76, 157, -582, -148, 400, -396, 22, -513, 492, 3, -875, -454, -158, -19, 243, -531, -298, 365, -62, 252, 232, 229, -319, 36, 387, 144, -723, 467, 337, -390, 1110, + -19, -796, 222, 252, -16, 592, -180, -989, 280, 142, 298, 351, -450, 716, 271, 223, -168, 1084, -81, 19, 742, -126, 340, 586, 203, 87, -138, 282, 15, 496, -215, 482, 445, 27, 440, 262, 351, -177, 2, 400, 291, 215, 132, 137, -261, -31, 16, -123, 20, -44, -110, 232, -235, -45, -230, 202, -96, 243, -202, 34, -140, -204, 146, -78, -1, -199, -291, -219, 233, 22, -89, 24, 289, 207, -81, 100, 9, -80, 300, 11, 216, -767, -753, 1544, 498, -965, -485, -443, -884, -66, -467, 643, -364, 3, 803, 17, + 133, -591, 740, 552, -10, -179, -58, -460, 34, 58, 93, -631, -92, -37, -190, -141, -436, 412, 816, 981, -81, -398, -166, -203, -138, -603, 204, 235, 215, -628, -839, 906, 341, 507, 657, 617, -268, -422, 595, -606, 307, -453, -348, -202, 707, -235, 143, 243, -130, -572, 1183, -716, 73, 858, -777, -351, 90, 314, 882, 158, -513, 15, 107, -120, -216, 127, -359, 275, -297, -416, 224, 127, 316, 143, -13, -144, 35, 90, 97, 340, -21, 48, 210, -502, 71, -226, 54, 57, -83, -189, -237, -57, -238, 94, 127, 292, + -27, -193, 184, 226, 135, 139, -363, 14, 90, -88, 309, -115, 22, 35, 286, -136, 84, 401, -258, 251, 1028, 619, -94, -660, 68, 1055, 840, 176, -837, -323, -723, -55, 564, 697, -52, 264, 828, 881, 1368, 1377, -689, 299, -744, -135, -603, -217, 474, -107, 207, 186, -429, -314, 348, 388, 504, 358, -18, 369, 557, -297, 282, 328, 97, 320, 1067, -804, -692, -157, 658, 631, -377, -6, 1012, 818, -575, -384, 347, -702, 194, -338, -637, 204, -748, 775, 284, 859, -363, -505, -973, -212, 316, -854, -730, -401, 380, 224, + 178, -377, 161, -270, 102, 789, -338, 91, -450, 338, -186, -378, 264, 367, -207, -108, -123, 263, 588, -191, -398, 7, -9, -149, -65, -553, 75, -295, -133, 197, -182, -100, -18, -155, 240, -244, -383, -348, -293, 306, 160, -74, 134, 89, -249, -273, 98, -481, 406, 1034, -67, -320, 664, 137, -38, -985, 866, -427, -936, -318, 64, 1080, 104, 774, 314, -916, -199, -811, 131, -808, -581, -347, 41, 170, -626, 615, -198, 374, 402, 398, 746, 1361, 799, -259, -669, -23, 1434, 893, -488, 714, -275, 872, -433, 85, -324, -161, + -49, -245, 2155, -410, -594, -687, -966, -372, -744, -33, 832, -331, 246, -277, -425, 757, -211, 1275, 236, 1020, -1246, 513, 2190, 797, -1222, 727, 667, 40, 142, -375, 417, 1923, 1023, 432, 583, -601, 1113, -116, 171, 177, 275, 129, 732, -603, -150, 53, 933, -157, 229, 1081, -85, -601, -139, 398, 66, -254, -610, 356, 255, -420, -246, 292, -515, -428, 140, 215, -1, 150, 102, 175, -188, 183, -114, -152, 169, 74, 234, 37, 1496, 698, 167, -47, -1635, 761, 1026, -741, -539, 1268, 827, -1018, -1079, 36, -631, 272, 104, 260, + -1014, 262, -197, -508, 901, -65, -150, 300, 755, 675, 465, -870, 20, -426, -923, 333, 262, 566, -194, -435, 1184, -853, 376, 407, 336, 250, -146, 695, -647, -1125, -187, -1288, 1128, 687, 1107, -95, 219, -898, 930, 1164, 422, -503, -1308, -308, -1727, 19, -320, -1180, -993, 449, 76, 715, -556, 821, 700, -990, 211, -595, -163, -896, 115, 2576, 648, 750, 950, 414, -730, -109, -7, 604, -137, 620, -282, -397, 19, -53, -720, 613, -111, -187, -221, -517, 77, -250, -320, -482, -367, 220, -264, 215, 262, -191, -297, -418, 191, -84, + 178, 612, 393, -18, -47, 189, 394, -396, 349, -399, -169, -1023, 460, 353, -478, 179, -243, -1544, -404, 394, -174, 181, -858, 1139, -1480, 128, -1082, 767, 841, 283, 704, 89, -711, 1236, -565, 141, 25, -692, 1167, 93, 307, 267, 368, 206, 876, 1038, 352, 1211, -1036, -67, 7, 1546, -287, 1236, 689, 1693, 337, -368, -529, 681, -1249, 1199, -708, -409, -192, 253, 904, -196, -1620, -438, 2642, 210, -1652, 425, -1092, 341, 2604, -700, -704, 1818, -1939, 998, 454, 603, 1701, 1086, -1498, 1868, 1229, 71, 1984, -797, -262, 1446, 952, 187, + 394, 14, -8, 189, 502, -426, 529, 549, -431, 247, 373, -618, -47, 255, -47, 138, 819, 31, 550, -266, 21, 408, -231, -184, -515, 110, 497, 342, 469, -830, 490, 575, 267, 117, 246, -19, 522, 924, 238, 457, 431, -188, -220, 452, 657, 893, 1703, 847, -818, 1089, 326, 983, -284, -1822, 1851, 1607, 988, 3036, -284, -2549, -1318, -1204, 2692, 1978, 478, -172, -493, -1781, -847, -577, -1024, 2737, 2220, 3087, 56, -3532, -5501, -2682, 3065, 4137, 4223, 1703, -3504, -6436, -3948, -1991, 2970, 5052, 2868, 1562, 417, -2277, -3062, -2289, -174, 1777, + 3599, 4305, 765, 844, -3414, -5655, -3017, 2823, 4732, 4489, 2801, -1642, -5503, -3559, -4616, 22, 3133, 3392, 1698, -1339, -2901, -2565, -2033, 608, 1931, 1366, 3909, 1420, -876, -2302, -859, 2612, 3801, 1294, -149, -2315, -474, -511, 1498, 581, -385, -1594, -486, 103, -263, -466, -109, 399, 809, 1393, 658, -1336, -1213, -1111, 265, 1469, 1603, 768, 165, -1005, -451, -1990, -1789, -129, 519, 2238, 3318, 1292, -1168, -2714, -3429, -1404, 2677, 4470, 3036, 960, -2242, -3601, -1793, 27, 650, 693, 1530, 822, 328, -872, -1932, -1393, 196, -383, -987, 1143, 166, -1652, 215, -429, + -661, 499, -506, -201, -882, 53, -334, -659, 270, -73, 227, 109, 555, -537, -176, 169, 66, 258, -223, 556, -383, 384, 188, -176, -402, -173, -760, 840, -67, 33, -137, -195, 55, -20, 31, 328, 203, -5, 480, -401, 155, -381, 433, 262, -308, 228, -378, -434, -344, -671, -63, 512, -452, -915, -619, 58, 570, 15, 428, -871, -220, -99, -70, -852, -205, 31, 133, -304, 900, 361, -281, 823, -75, -1469, -55, -213, -126, 284, 192, 391, -454, 631, -1074, 311, 196, -46, 5, -71, -69, 361, -63, 63, -158, -18, -312, 79, + 7, 629, -1, 277, -287, 33, -142, -375, 119, -12, -181, 446, -82, -120, -179, 326, -122, -627, 131, -127, 196, -270, 32, -82, -379, 348, -335, 238, -320, 166, -27, -892, -1464, -2299, 84, 1899, -726, -1165, -1246, -1177, 246, 245, 2190, -316, -314, -974, 110, 297, 690, -732, 372, -532, 858, 274, 281, 104, -533, -290, -347, -114, 311, -321, -283, 605, -551, -344, 500, -475, -174, -408, -666, 236, 438, 81, 412, -626, -159, -18, 364, 451, 558, 40, -58, -942, -968, -358, -314, -211, 444, 609, 859, 95, -393, 862, -616, -275, + 383, -270, 1131, 58, -190, 192, -415, 329, 784, 643, -234, 244, -764, -498, -284, -188, 564, -73, 550, 147, -184, 66, 97, -660, 390, -489, 301, -224, -140, -34, 357, -343, 40, 61, 312, 553, -285, -82, -443, -177, 148, -173, 116, -135, -185, -305, -485, -264, 431, -172, 209, -314, -79, -25, -106, -282, -134, 32, -40, 4, -7, 600, -1480, -3462, -2646, -304, 1147, 2990, 2525, 2411, 2462, 1626, 685, -886, -1574, -3004, -2214, -2174, -2169, -1348, 1309, 1765, 2591, 1991, 1666, 551, 1111, -248, -288, -347, -608, -1135, -932, -1913, -698, -1519, + -725, -358, 497, 102, 712, 167, 998, 737, 1207, 1609, 1995, 1279, 856, 1421, 108, -480, -1753, -2051, -2826, -2515, -2355, -899, -1546, -805, 93, 429, 994, 1904, 2024, 2267, 3419, 1929, 2620, 1822, 412, -275, -1077, -2737, -3000, -2851, -3170, -2322, -1625, -1299, -359, 670, 1115, 1423, 2109, 2246, 2358, 2233, 1387, 974, 458, 54, -9, -668, -1103, -1585, -1893, -2003, -1903, -1331, -603, -534, -207, 361, 944, 1185, 2233, 1581, 1242, 1249, 446, -48, -326, -392, -424, -1079, -976, -699, -740, -535, 68, 172, 211, -127, 352, 13, 417, 437, 139, -148, -22, 96, + 57, 70, 196, 46, -102, -310, -74, 70, -12, 185, 140, -36, -33, -126, -96, -67, -52, -65, 33, -34, -31, -22, -61, -77, 0, -2, 49, 144, 105 } + }, + { + {-284, 220, 11, 101, 101, 285, 134, -105, -133, -185, 133, -162, -118, 27, 41, 18, 168, -54, 157, -40, 141, -132, 62, -58, -142, -10, -270, 41, 67, 121, -98, -1, 106, -77, 119, 112, -67, 81, -90, -42, -66, -97, -123, 111, 164, -122, 73, 132, 107, 161, 21, -24, 94, 71, -170, -6, 20, 11, 54, 110, 25, 40, -59, -37, 78, 110, 61, -58, -101, 113, -91, -30, 63, -19, -4, 48, 12, 3, 103, -100, 76, 42, 50, 95, -38, -11, -32, -13, 4, 46, -36, -7, -25, -14, 2, -4, + -15, -10, 11, 14, 0, -6, -10, 2, -3, 2, -15, -3, 15, -33, 112, -60, 82, 8, -7, -229, 37, 195, -120, 81, -244, -246, -81, -200, -175, -26, 36, 138, 22, -66, 31, 94, -121, 168, -114, -123, 142, -71, 164, 208, 29, -150, 105, 69, 42, -76, -55, 87, 73, 15, -170, -49, -157, 142, -142, -92, 104, 5, 90, 26, 35, 154, 26, 173, -223, -114, -52, 110, 156, 178, 242, 26, -69, -23, -33, -7, -158, -69, -69, -19, 24, -128, -76, -29, -55, -100, 120, -120, -41, 80, -206, 62, + 112, 125, 65, 36, 75, -36, -80, -20, 21, -8, 21, 4, -22, 2, -32, -38, 46, 21, -4, 0, -1, 35, 16, -13, -15, -14, 2, 26, -31, -5, -2, -5, 17, -1, -13, 261, -193, -72, -38, 161, 145, -146, -13, -271, -59, 329, 124, -132, 237, 77, 91, 25, -79, -258, 35, -116, -73, -47, -157, -55, -122, 86, -55, -71, 148, -278, 257, -90, 37, -87, 80, -10, -25, -6, 109, 6, 69, -99, 192, -149, 224, 48, -22, -125, -147, 304, 53, -284, 292, 275, -149, -54, 86, -112, -21, -69, + 69, 175, -106, 40, -79, -72, 29, 236, -216, 132, -223, -171, -161, -28, 5, 0, 135, 209, 55, 51, 102, 83, 46, 52, 61, -22, 66, -30, -64, 111, -5, 16, -20, -33, -19, 1, 47, -11, 11, 5, -42, 1, 23, 30, -3, 26, 74, -100, 12, -197, 190, -277, 12, 292, -527, 369, 148, -139, 117, -9, 322, -32, -264, -184, 109, 126, 37, 10, 138, 42, 24, 186, 77, 54, 135, 97, 458, -124, 123, -5, -73, 120, 75, 48, 60, -73, -125, 10, 2, 8, 68, 141, -140, -149, 67, -34, + -56, -89, 188, -131, 271, 128, 14, 65, 25, 75, 343, 288, 24, 18, 68, -67, 130, -26, 117, 37, 10, 2, -143, 141, 109, -29, -81, 14, 137, 15, -35, 10, -99, 76, 30, 96, -22, 30, 42, 41, 36, 59, 29, 27, -121, -5, 51, 72, -40, 48, 44, 40, 45, 20, 35, 43, 48, 10, 20, 16, 24, 9, 15, 31, 14, -3, -24, -33, 68, -31, 149, 4, 172, -65, 152, -114, 318, -242, -90, -115, 328, 186, 121, 208, -187, -37, 302, 172, 142, 147, 79, 101, -34, 289, -29, -133, + -98, 102, -108, 67, -272, 102, -51, 6, -293, 127, -62, 276, -44, 88, 77, -116, -28, 126, 18, 86, -61, 153, 218, 28, -150, 58, 154, 109, 21, -103, -212, 179, -236, -100, 134, -314, -71, 195, -144, 41, 4, -18, -41, 80, -156, 9, -261, -136, -357, 27, -99, 8, -68, -11, -90, 82, 80, 32, -55, 76, -7, 30, -102, 26, 23, 33, 24, 71, -8, 80, -33, -5, 57, 75, 13, 42, -47, -18, -12, -19, -33, 23, 60, 16, 63, -59, -33, -33, -80, -93, 86, -579, 101, -183, -106, 132, + 100, 70, 25, -426, -46, 132, -229, -60, -314, -159, 69, -37, -289, 300, 180, -92, 31, 236, -154, 63, -106, -165, -114, -298, -113, 224, 104, 286, -147, -469, -205, 114, -153, -306, -54, -58, 277, 142, -328, 217, -233, -15, -169, -161, -155, -361, -216, 25, 229, 348, 221, 64, 136, -161, -270, -167, 166, -84, 179, -57, -173, -10, 13, -84, -195, 10, 141, -471, -313, 435, -145, 7, -244, 113, 62, -30, -22, 158, 115, 34, -53, -62, -14, -69, 34, 45, -96, -49, 31, 8, -3, 25, 88, -99, -48, -180, + -76, -29, -37, 7, 22, 48, 0, 62, -80, -57, 10, 13, 221, -6, 112, -152, 111, -207, -15, 360, -170, 340, 345, 425, 107, 170, 367, 287, 212, -284, 37, 90, 246, -48, -211, 273, 277, -78, 185, -92, -96, 174, 150, -21, 178, 16, -290, -232, 252, 365, -28, -126, 78, 11, -174, -326, 171, -309, -150, 236, 50, 209, 9, 335, 47, 367, -426, 387, -75, -14, 117, 205, -164, -353, -100, 324, -63, -377, -223, -231, 63, 137, -329, 167, 191, 343, 106, 108, 2, 97, 18, 76, 52, -249, -27, 120, + 84, 203, -132, -40, -2, 17, 97, 13, 80, 33, -38, -16, 76, 70, 27, 77, 22, 34, 101, 2, -53, -28, 23, 49, -6, -23, 82, 42, 19, -83, -26, -47, -41, -4, 87, 5, 83, 115, 368, 47, 154, 437, 472, 141, 119, -348, -175, 385, -285, 394, 112, -2, -78, -138, -227, 42, 175, -423, -191, -180, 95, 85, 94, 13, 73, -16, 129, 104, -111, -199, -365, 64, -197, 330, 14, -184, -229, -71, 155, -288, 181, -96, 61, -4, -203, 203, 259, -177, 218, 61, -15, 617, -154, -401, 78, 150, + -98, 33, -172, 418, 245, -42, -88, 297, 286, -60, -240, -177, 585, -54, -78, -236, -150, -48, 59, -62, -153, 250, -77, 297, 89, -95, -30, 52, 1, -52, -49, 104, -130, -34, -33, 171, 19, -39, -1, -89, -79, -12, 20, 179, -39, 106, 44, -60, 40, 6, -84, 66, -40, 92, -6, -97, -67, -56, -67, -3, -19, -32, 36, 31, 54, 150, -323, -92, -103, 25, 135, 316, 276, -444, 9, 51, -46, -134, -307, -33, 102, 180, 146, -282, -50, -357, 332, 13, -34, 158, -160, -31, -379, 62, -227, 154, + -31, -65, -129, -253, -245, -31, -303, -493, -93, -226, -473, -40, -42, -261, 168, 257, -34, 121, -34, -43, 69, 74, -384, -115, 208, -187, 455, 80, 120, -297, -4, -136, -302, -35, 423, 194, 321, 176, -142, -345, -536, 356, 367, -47, 189, -420, 198, 168, 298, 42, -359, -49, -334, -118, 26, -111, 69, -77, -112, -32, 31, -20, -37, 95, -32, 35, -243, 1, -21, -42, -111, -50, 71, -105, -120, -46, -44, -52, -2, -33, -132, -109, -67, 33, 42, 73, 35, 67, 23, -98, 18, -20, -60, 31, -111, 43, + -61, -827, -207, 658, 220, 268, -172, 271, 459, 34, -77, -765, -179, -36, 438, 123, 176, -573, -155, -213, -137, 356, -201, -70, 61, 102, -181, -79, 92, -160, 349, -392, 42, 259, -337, 276, 469, 547, 262, 268, 358, -246, -452, 180, 196, 299, 237, -510, -146, 268, 154, 98, 319, 72, 372, -138, -81, 213, 196, 60, -329, -175, -353, -403, -24, -441, 23, -257, 17, -234, -139, -567, 391, 104, -85, -102, -65, 76, -211, -29, -495, -270, 171, 224, 91, 75, 18, -259, 117, 118, 90, -247, 55, 10, -199, -66, + 32, 31, -103, -148, 47, -73, -93, -22, 19, -18, -13, 50, -48, 70, -14, 100, -47, 89, 137, -99, 75, 7, 51, -61, -9, 80, 62, -122, 62, 64, 519, -253, -217, -192, 357, 453, -285, 728, 153, -312, 373, 106, -304, -357, -288, -24, -155, -107, -476, 190, 198, 656, 89, -113, -297, -311, 78, -38, -416, 73, -155, 19, 320, -249, 424, -373, -314, -22, -488, -584, 94, -68, -674, 46, 7, -321, 168, -157, 84, -456, -743, 487, -455, 754, 412, -541, -70, -548, -148, -70, 226, -198, 346, 435, 414, -301, + -244, 37, -368, -36, -120, -486, 289, 213, -259, 380, -568, -56, 34, -150, -96, 491, 364, 241, -30, -259, -208, -195, 85, 78, -16, 54, -15, -24, 10, -22, 20, 97, -117, 45, -8, 106, -63, -13, 63, 143, 57, 115, -139, -153, 72, -103, 25, -2, -162, -92, -96, 0, 53, 46, 33, 36, -441, -335, 220, 267, 295, 499, -183, 917, -28, -474, 208, 453, 125, 238, -200, -508, 766, 425, 315, 149, -264, 247, 638, -233, 138, -6, 135, 110, 455, -130, 156, -159, 140, -42, -23, 282, 62, -561, -375, -526, + -359, -279, -137, -403, -227, -197, -348, -242, 156, -364, -124, -282, 680, 346, 592, -533, -48, -487, -101, 549, 303, 646, 310, 400, -422, 193, 190, 599, 609, 183, 551, -472, -224, 354, -1239, 24, 206, 27, 311, 200, 702, -53, -94, 759, 231, -66, -337, -6, 8, 622, 85, 18, 53, 127, 196, -33, -33, 202, 99, 67, 109, 147, 115, -6, 27, 21, 210, -36, 112, 202, 150, 225, -95, -73, 56, 74, -72, 8, 132, 209, -10, 533, 347, -350, 682, 405, -35, -171, -86, 409, 1009, 538, 145, 41, 331, -82, + 815, 459, 509, 19, -260, 171, 61, -435, -107, -29, -103, -125, 165, 88, -355, -172, -628, -66, -195, -809, -363, 23, 302, -418, 520, -146, -124, -73, -127, 376, -255, 262, -829, 254, 362, 277, 552, -547, 473, -491, -365, 406, -239, -75, 343, -557, 492, 786, -16, -117, 1006, -219, 194, 565, -1209, -622, 42, 34, 165, 288, 589, 351, -462, -374, -109, -135, -625, -64, -124, 151, -652, 4, -196, 262, -98, 334, 91, -1, -193, -145, -181, -196, -147, 129, -396, 281, -47, 155, 11, -29, -270, 145, -192, 45, -204, -116, + 0, -94, -234, 13, -72, 22, -158, -180, -186, 30, 41, 233, 255, -7, 7, -184, -961, -579, 704, 700, 74, -168, 594, -964, -518, -1043, 454, 125, 44, 200, -476, 238, 328, 430, 731, 751, 630, -27, 141, 7, -277, -58, -232, -120, 870, -205, -804, -204, -167, 70, 1255, -456, -453, 424, -683, 234, -758, 986, 277, -29, 251, -383, -484, 675, -825, -659, -593, 162, 245, 306, -550, 560, -176, 40, 864, -61, -150, 253, 697, -455, 1157, 41, -1339, -165, -54, -449, -131, -2, -128, -367, -309, 656, 438, -164, 424, -771, + 213, 342, 211, 23, 408, -70, -21, 151, 398, -168, -178, -139, 15, 150, -80, -319, -343, 14, -163, 116, -7, 81, 178, -224, -150, 381, -92, 67, -33, 8, -134, -148, -77, -51, -207, 96, 182, 102, -7, 15, 80, -159, 32, 176, -22, 150, -91, -281, -381, 167, -270, -123, 1276, 757, -1027, -830, 1028, 980, 614, 705, -1224, -268, -337, 324, 120, -494, -904, -1370, 402, 363, 107, 378, -186, -68, -324, 273, 475, 426, 112, 566, 182, -63, -230, -831, -44, -349, -290, 291, -893, 81, 37, -416, 366, 336, 166, -600, + -559, -1473, -374, 12, -472, 85, 312, 312, 825, 406, -363, -254, -547, 694, -291, 1200, 1002, 279, -640, 1325, 610, -535, 83, 667, 1542, -636, -1178, -607, 17, -424, 187, 427, 356, -308, -481, -265, -400, -439, 123, 481, 383, 217, 191, 72, 322, 46, 53, 469, 368, -19, -153, 108, -243, 262, -92, 268, -136, 108, 70, 178, 228, 136, 106, -219, -435, 53, -220, -110, 131, 41, -64, -82, 314, 106, 425, -134, 228, 230, -290, 302, 16, -242, 511, 184, -176, -492, 416, -836, -773, -277, 603, -342, -439, -2, 695, 76, + 718, -237, 866, 102, 465, -300, -199, 276, -887, -245, 339, -155, -116, -713, -673, 317, -409, -293, 559, 765, -108, 504, -897, 59, -241, 1174, -479, 394, 722, 687, 204, -472, 308, 222, 213, 382, -1146, 2131, 685, -181, 118, 244, 596, -158, 461, 1245, -64, -1527, 647, 539, -537, 726, -151, -316, -815, 1595, -811, 1776, -1158, 443, -15, 1928, 861, -815, 796, 41, -503, 392, 68, 180, 438, 189, -485, -122, 593, 163, 340, -263, 375, -613, 239, -29, -192, 392, -206, -114, 286, -41, 50, -43, 476, -300, 464, -263, 430, 595, + 228, 166, 335, -79, -222, -220, 290, 103, -37, 2, -64, -418, -316, -61, 23, -258, 1454, 170, 788, 400, -806, 46, 472, -148, -703, -138, -1529, -432, -572, -334, 329, -50, 542, -273, 55, 527, -478, 46, 299, -35, -524, -6, -361, 1046, -188, 603, 95, -16, 1074, 771, -478, -563, 270, 482, 588, 712, -17, 247, 678, -44, -278, 207, 20, -612, -18, 391, -599, -809, -80, -56, -90, -277, -293, -962, -4, 928, 285, 512, 304, -135, -1236, -913, 240, 789, 258, 394, 1618, 1674, 1421, -123, 705, -461, -1199, -2004, 344, 235, + -91, 267, -633, 124, -156, 719, -58, 575, -724, 344, -888, -183, 371, 51, -454, 94, -374, -415, -174, 94, 337, 425, 573, -152, -33, 135, -160, 171, -599, -523, -356, -490, -462, -500, 313, 215, -84, -334, -489, 280, 2, 451, -118, 398, 302, 3, 128, 480, -598, -576, 338, -68, -441, -940, 281, -560, 290, -237, -660, -197, 7, 343, -272, 180, -974, 934, -2055, -196, -504, -413, 290, 1194, 203, 440, -1005, 239, 388, 824, -410, -646, -443, -212, -18, -6, 504, 369, -276, -1480, -695, -1202, 155, 2152, -1501, -588, -219, 1249, + -400, 535, -381, 609, -221, -349, -754, 409, -876, 836, 1503, 204, -259, -266, 1249, 340, 4, 665, 229, 248, -222, 1439, -2227, 1636, -1351, 661, 1619, -1275, 2617, 1786, -652, -210, 1806, 666, -154, 1191, 1072, -1361, 1862, -1104, 345, 366, -478, 368, 620, -360, -657, 232, -346, 169, 173, -173, -511, 224, 207, -204, 241, 192, -408, 1059, 132, 34, 40, -199, 178, 154, 74, -328, 196, 61, -130, -285, 664, -231, 544, 612, -41, -208, 178, 160, 252, 736, 642, -545, 280, -214, -13, 324, -50, 1518, 1447, -1228, 1206, 1110, -1035, -1566, + -2315, 544, 3488, 1435, 11, 722, -3326, -1373, -114, 510, 2510, 2454, 428, -942, -1839, -1079, 130, 793, 1202, 1928, 1167, -1550, -3662, -2987, -288, 3330, 3625, 2289, 704, -768, -1473, -2233, -1269, -1358, 2671, 2220, 1408, 1242, -1880, -2641, -3060, -2744, 1063, 3718, 4583, 1548, -1380, -3256, -3900, -1062, 635, 404, 2450, 959, -916, -548, -1874, -411, -2144, 931, 2559, 4772, -282, -2553, -5538, -218, -1868, -201, 2667, 526, -236, -1187, -2490, -1639, 1208, 1935, 645, -339, -841, -1019, 1000, 1138, 713, 608, 282, 567, -46, 52, -545, -259, 72, 1437, 1269, -68, -531, -143, + -1277, -868, -23, 488, 1340, 1022, 737, 63, -1779, -1616, -1081, 418, 1736, 3339, 2058, -1546, -2764, -2457, -976, 66, 2306, 2882, 2167, 373, -1704, -3902, -2440, 787, 2427, 2745, 815, -405, 21, -319, 1567, 916, -140, 332, 168, -1119, -119, -92, 120, 34, 88, -410, -166, -152, -105, -187, 667, -242, 286, -505, -53, 207, -26, -154, 1153, 159, -656, -761, 158, 158, -449, 123, 578, 300, 544, -560, 167, -21, 129, -395, 72, 436, 616, 156, -164, 181, 67, -145, 419, -624, 138, -1015, -321, 418, -347, -409, 548, -353, -949, -734, 646, -82, + -132, 148, 326, 821, -540, -700, 26, -97, 554, 3, 322, 148, -59, 854, -1118, -165, -161, -655, 163, 365, 12, -391, 168, -89, 107, -338, 242, -19, 36, -31, -87, 431, -440, 32, -79, -159, -144, 49, -194, 197, 250, -268, -72, -104, 229, 257, -136, 317, 26, -49, -221, 227, 74, -94, -361, 165, -328, 205, -180, -160, 289, 291, -408, 45, -101, -398, 121, -235, 251, -918, -1013, -2409, 696, 689, -49, -2032, -1314, -194, -334, 1358, 916, 440, -900, -372, -239, 850, 93, -243, -529, 348, 154, 423, -24, -173, -217, -486, + -243, -294, 811, 434, 95, 121, -535, -29, 64, 741, -54, 345, -276, -192, 151, -306, 201, 88, 217, 723, -64, 635, -9, 407, -316, 26, -464, -601, -632, -541, 177, 93, 46, -796, 392, -693, -79, 36, -435, -470, -249, 8, -828, -560, 514, -250, 478, 76, -133, -448, -518, -34, 733, 909, -227, -93, -342, -455, -315, 289, 153, 111, 283, -56, -189, 197, 108, 164, 248, -139, 83, -27, 5, -189, 328, 104, 74, -99, 47, -7, 512, 66, 153, -287, 18, -186, 334, 23, 4, -118, 77, -38, 4, 161, 15, 210, + -143, 69, 21, -269, -15, 155, 59, -55, 541, -1165, -2888, -2769, -421, 837, 2786, 2407, 2270, 2438, 1358, 328, -1232, -1239, -2572, -1998, -1752, -1112, -1398, 1923, 1583, 2082, 1201, 1701, -62, 447, -274, -665, -380, -794, -923, -920, -907, -1075, -786, -639, -73, 168, 1510, 1267, 668, 717, 996, 924, 446, 2150, 280, 27, 404, -804, -2467, -707, -1977, -2122, -2240, -1585, -1411, 70, 1170, 1192, 1458, 2650, 1908, 2325, 2287, 1458, 1569, 535, -552, -1794, -2352, -2689, -1748, -2414, -2027, -2319, -1352, -163, 635, 1873, 1789, 1815, 3024, 2106, 2500, 1555, 260, -294, + -756, -1252, -1400, -1485, -1445, -1668, -1428, -1046, -641, -334, -250, 723, 689, 968, 1568, 1765, 1121, 1348, 833, -53, -366, -816, -1017, -875, -753, -914, -333, -228, 21, 255, 286, 70, 39, 250, -37, -222, 202, 117, 144, 221, 66, 57, 136, 309, 267, 119, 26, -71, -262, -202, -236, -207, -81, -157, -130, -73, -47, -69, -13, 90, 86, 92, 151, 89, 65, 75, 2, -8, -10, -41, -17, -10 }, + {-135, 226, 79, -41, 57, 73, 136, 227, -109, 75, -93, -72, 45, 0, 19, -161, -78, 56, 113, -15, 95, -172, -153, 96, 61, 26, 70, -59, 123, 137, 133, 191, -107, -88, 7, 24, -184, -12, -16, 50, 18, -115, -29, 157, -84, 30, -96, 46, 48, 31, -143, 115, 10, 26, -20, -47, -59, -98, 207, -37, -38, -47, 92, 21, -196, 50, -90, -135, 79, -84, -213, 85, 31, 9, -196, -238, -97, -117, 110, -32, 0, -54, -64, -54, 2, 97, 18, -44, -4, -46, -20, 43, 13, -41, -56, -20, + -23, 21, -14, 8, 8, 23, 6, 33, -14, 8, -8, 23, -1, 21, 133, 16, 11, 118, -176, 30, -147, -186, 54, 175, -108, 83, -81, -39, 35, 9, -86, -257, -255, 5, -64, -2, 134, 21, 163, 221, -116, 191, 24, 193, 12, 229, 29, -128, -35, 13, 105, -28, -34, 23, 79, -95, -6, -29, 70, 86, 5, -87, -6, -16, 50, 90, 161, -56, 105, -47, -140, -125, -84, 79, 86, -47, 139, 5, 51, 7, 169, 112, 125, 51, 74, 45, 68, 138, -29, -7, 196, 39, 6, 41, -73, 11, + 58, -4, -182, 57, 20, -29, -63, 42, 13, 99, -36, -18, -38, -31, 25, 7, 40, 19, 9, -36, -28, -17, -18, 16, -47, 42, -17, 12, -11, -17, -26, 16, -21, -16, -51, 196, -203, -137, -113, -165, 50, 69, -133, 29, 269, -198, 136, 231, 229, -143, -40, 113, 21, 34, -105, 55, -351, 274, 430, 75, 144, -71, -7, 227, -121, -278, -47, 3, -2, -224, 16, 54, -266, -126, 122, 40, -95, -26, 91, -131, 274, 84, 12, -178, -18, 93, -61, 4, -64, -5, -27, -143, 8, -138, 205, -200, + -133, -46, -239, 158, -129, -333, -62, -145, 40, 151, -156, 18, -106, 107, 14, -111, 94, -120, -158, 174, -114, 49, 4, 15, 61, -36, -54, -61, -96, 31, -136, 6, -28, 41, -41, -5, 0, 2, -72, 63, 3, 11, -39, -29, -29, -3, 43, -155, 99, -4, -30, 117, -111, -390, -76, -24, 171, 242, 214, 103, -84, -26, -241, -204, 70, 275, -79, 281, 179, -173, 93, -27, 97, -194, -131, 32, 140, -18, 83, 117, -219, -44, -101, -299, 186, 30, 67, 130, 237, 83, 11, 186, -44, -95, 191, -100, + 323, 149, 128, 7, -93, -113, 158, 215, -160, 39, 205, -36, 67, 454, -137, -54, 88, -227, -9, 41, -102, 111, -74, 69, 225, 8, -52, -153, -13, -190, 80, -70, -94, -39, 36, -54, -55, -46, 10, 71, 52, 15, -16, -21, -16, -10, -32, -56, -11, -17, 29, 1, 15, -56, 24, 31, -22, -49, -19, -52, -28, -23, 38, 5, -9, -3, 9, -78, -15, 28, -98, -557, -43, -10, -110, -171, -55, 302, -211, -316, 122, -127, 48, 59, 203, -135, -39, 42, 189, -86, -121, -35, -103, 140, 255, 129, + 4, -19, -142, -7, 399, 72, -47, 461, -25, 343, -101, 5, 234, 72, 60, 85, 43, 129, 77, -216, 408, 248, 335, 225, 149, -220, 100, 115, 19, -134, 379, 229, 342, 62, -65, -82, 253, -120, -256, 306, 98, -165, -94, 17, -76, 32, -33, 45, -103, -27, -242, 96, -27, -4, 93, -28, -43, 146, -7, 114, 152, 125, 82, 81, 34, 48, 3, -29, -26, 68, -16, -38, -39, 33, -45, -10, -7, 84, 37, 61, -52, 19, -41, -13, 60, -5, -20, -16, -12, -140, -19, -365, -143, -408, -279, 32, + -264, -208, 27, -45, 276, -181, 306, 375, 40, -316, -221, 337, -168, -90, 190, -244, -434, 176, 378, -192, 98, -5, 166, -453, 93, -181, 112, 11, -188, 318, 147, 135, 425, 198, 90, 241, 50, 79, 123, 42, 22, 67, 60, 482, 273, 0, 406, 254, 300, 467, -235, -197, 410, -141, -13, -241, -100, 146, 219, -183, -19, 63, -50, 114, -193, -35, -224, 441, -140, 241, -66, -116, 326, 58, -92, 106, -37, 10, -89, 123, -20, 45, 133, 76, 42, 75, 8, -11, 55, 14, -87, 20, -16, -41, 84, 1, + 42, 34, -15, 16, -50, 12, -45, 5, -17, 59, 19, 51, 139, -148, 48, 22, 47, -213, 277, 161, 377, 73, -51, -425, -227, -159, 109, -221, -368, -102, 94, 41, -411, 334, 26, -25, -350, -201, 83, 44, -389, -120, 142, 16, 39, 200, 233, 137, -60, 118, 36, -139, -288, 497, -125, -241, 5, 124, 160, 372, 61, -6, -140, -3, 206, -25, 257, 493, 41, -106, 15, 425, 530, -263, 74, 75, 286, 153, 50, 89, -211, 133, 137, 138, -92, 9, 104, 159, -23, 56, 36, -178, 86, 10, -162, -116, + 171, -76, 118, -171, -132, -57, 39, -1, 154, 72, 27, 9, 77, 73, 22, -129, 5, -53, 20, -40, -33, 0, -14, -17, -45, -126, -36, 16, -87, -53, -56, 4, -56, -88, -22, 45, 69, -137, 196, -173, -315, 220, -24, -76, 84, 187, -529, 34, 408, -46, 732, 351, -222, -163, -67, -210, -92, 328, -124, -106, 328, 267, 89, 153, 307, 203, 230, -166, -113, 291, -55, 264, 3, -312, -200, 86, 250, -340, 23, -181, 97, -207, 292, 291, -281, -29, 84, -8, -380, -170, 67, 254, 418, 143, -307, -67, + -73, -35, 264, 43, 212, -314, 143, 23, -248, 298, 128, -39, -65, 52, -9, -254, 194, -58, 117, -198, -349, -194, 85, 158, 6, 88, 317, 4, -78, 199, -59, 187, 13, 62, -158, 17, 6, 87, 96, 133, 86, -32, -36, -61, 159, -73, 84, 18, 52, 65, 90, 40, -28, 80, 33, 27, -28, 107, 53, 23, -103, 39, -39, 0, 75, 339, -415, -65, -132, 429, -189, 354, -108, 330, 447, -196, 142, -112, 256, -95, 213, 177, 167, -36, 176, -86, -220, -105, 249, -287, 47, 1, 221, 447, -406, 16, + 401, -8, 366, 51, 162, -49, -29, 100, -561, 57, -12, -223, 151, 94, 411, 205, -39, 778, 195, -408, 110, 41, 273, -175, 54, 230, 20, 141, -39, -445, -456, 2, -153, 369, -620, 800, -3, 446, 511, 123, -133, -101, -238, -316, -26, 103, -79, 161, -105, -254, -160, -128, 47, -39, 30, 172, 88, 82, 64, -71, -86, 5, -17, 49, 13, 20, 55, 99, 61, -198, 38, -37, 146, 146, 86, -13, -41, 57, 47, -70, -73, -18, -49, 14, -53, -96, 39, 160, -40, 64, -122, 16, 72, 73, -3, 47, + 104, -741, -54, 250, 40, -279, -688, -2, 77, -122, -30, -204, 105, -170, 352, 123, -212, -265, -453, 336, -145, 21, 439, 604, 368, -58, 30, -417, -179, -169, 110, -590, 152, 159, 32, -304, 289, 450, -74, -10, 52, -264, -279, 158, 108, 340, -377, 407, -216, 223, -349, -277, -139, -11, -42, 147, -76, -610, -457, -130, 15, -612, 8, 300, -162, -72, 92, 255, -537, 272, -95, -83, -3, 218, 274, -325, -165, -219, -106, -80, 159, 51, -195, -89, -150, 102, 357, 233, -2, -12, -199, 5, -122, 166, -31, 291, + 98, 100, -105, 4, 3, -237, 250, 16, -44, 128, -46, -42, -12, 17, -203, 87, 124, 129, -21, -51, 45, 71, -73, -46, 72, -157, 17, -7, 145, -14, 664, 16, -134, 516, -113, -210, -55, -47, 641, 733, -95, 156, 187, -94, -348, 171, 682, 520, 445, -161, 193, 366, -474, -354, 415, -211, -232, -16, 519, -78, 477, 31, 429, -256, 589, 179, -182, -300, 108, -425, 52, -504, -171, -181, 289, -289, 476, -582, -1007, 630, 282, -124, 6, 694, 326, 55, -181, 150, -80, 8, -450, -457, 270, -153, 150, 861, + -224, 185, -561, 666, -222, -297, -142, -93, 279, -565, 473, -553, 400, -285, -385, 385, -15, 126, -155, 227, -124, -174, -77, -264, 183, -9, -170, -73, 65, 281, 54, 40, 76, -8, -47, 143, -79, 64, 61, -74, -20, -17, 203, 176, -64, -98, -210, -5, -42, -31, -33, 5, 195, 57, -22, 243, -754, -561, -544, 759, 26, 326, 194, -669, -585, 394, -1044, 305, 310, -67, -416, -382, 651, -350, -46, -109, -337, 495, 158, 448, 260, 309, -98, 502, -46, -328, -387, -89, 218, -293, 390, 251, -294, -1057, -89, -87, + -26, 769, 17, -602, -357, -368, 316, -232, -501, -559, -348, -272, -1246, 30, 155, 410, -651, 214, -538, -439, -151, 521, 133, 484, 912, 275, 209, 596, -464, -59, -221, -254, 477, 442, 701, 345, -643, -427, 504, -758, -836, -262, 609, 97, -149, 415, 338, -3, 96, 352, -231, 209, -170, -32, -177, -32, 46, 247, -157, -197, -1, 140, 44, 127, -20, -198, -48, -130, 10, -109, -22, -15, -223, 181, 27, 184, 230, 320, -120, -169, -14, 368, -323, -684, 199, -1, -5, 34, 105, 156, 313, 108, 264, 150, 312, 795, + 34, -1016, -367, 268, 18, -205, -651, -425, 146, 542, 214, -502, 280, 224, -569, -101, -706, 567, -290, -364, 524, -493, 147, 1085, -120, 183, 325, 5, 164, -625, 161, 119, 109, 1424, 966, -99, -488, -320, 452, 523, -561, -310, -755, 1215, 339, 146, -188, -125, -263, -143, 875, -226, 241, 874, 152, -239, -639, 23, 264, -1291, 287, 148, 892, 612, 478, 798, 452, -151, 83, 282, -85, 45, -51, 132, 74, 745, -17, 310, -126, 300, -21, 398, 87, 116, 360, -23, 152, 247, 10, 201, 278, 127, 222, 326, 187, -113, + -21, 77, 81, 10, -125, 70, 86, 45, 172, -17, 269, 152, -107, 284, -36, -180, -828, -119, 571, 320, -928, -1223, 141, 831, 337, 508, -288, 392, 66, 10, -444, -159, -691, 1028, 345, -834, -571, 373, 41, 206, -249, 512, 300, 353, 673, 595, 124, 582, -305, 334, 0, 406, 188, -98, -244, 280, -362, 958, -256, -182, 198, 474, 471, -318, 828, 818, 478, 197, 71, -264, -619, -1065, -170, 377, -20, 461, 507, 539, 191, 300, 1769, -870, -376, 173, 345, -47, -1376, 321, -211, 204, 248, 609, 126, 7, -551, 572, + -202, 79, 508, 225, -533, -120, -298, -107, -227, 33, 26, 212, -47, 259, 265, 337, 2, -9, -203, -100, -273, -195, -77, 358, 123, -65, 31, -151, 59, 313, 366, -80, -325, -14, 27, 147, -85, 98, -151, 234, -457, 37, -135, -174, 8, 81, -292, 134, -49, -155, -272, 104, 463, 456, -250, -341, 102, -328, -1051, 1088, -317, 306, 101, 913, 728, 458, -434, -71, 624, 331, 735, 1957, -120, -770, -200, 585, -86, -909, 1391, 721, -489, -761, -93, 171, -241, 553, 471, 543, 1040, 174, 295, 186, -402, -967, 570, -658, + -494, 764, 401, 431, 227, 158, -43, -954, -846, 16, 508, -630, 599, -279, -706, 224, 622, -114, 121, 617, 609, 631, 48, -385, 361, 1501, 182, 611, 859, 42, -271, -754, -304, -1188, -406, -297, -146, 270, 47, -54, -341, -225, -197, 293, -304, -61, -268, 88, -170, -292, 13, -421, -148, 7, -380, -72, -331, -192, 38, -609, -58, 29, -6, 288, -386, -127, 416, 8, -162, -18, -139, 80, -177, -135, 207, -14, 15, 555, 457, 16, -358, -530, -941, 174, 586, 800, -671, -716, 889, 402, -30, -85, -362, 173, -166, -378, + 410, 499, 347, 38, -67, -272, 64, 212, 130, -308, -1099, 251, -246, -327, 66, -138, 97, -1095, 517, 406, -788, 559, 741, 621, -161, 108, -94, 406, -86, 2, 1972, -586, 168, -523, -302, 1115, 411, 383, 715, -900, -744, 1120, -702, 574, 709, 72, 193, 272, 1271, -426, -479, -1159, -245, -497, 399, -724, 1237, 674, 757, 374, 662, 349, 1180, 293, 570, 435, -573, -273, -218, 107, 72, 579, 256, 4, -22, 135, 59, -220, -435, -231, -325, 419, -141, -234, 140, -88, 519, 241, -86, 292, -325, 162, 264, -90, 502, 511, + 345, -235, 425, 244, -408, -76, 49, -247, 34, 366, -411, -479, 218, 99, -40, -316, 813, -470, 430, 1382, 687, 524, -772, 218, 771, -657, 1091, 392, 584, 523, -335, 542, 467, 197, 1082, 820, -61, -1848, -216, 860, 830, 852, 205, 476, 43, 240, -60, -571, 1185, -30, 1129, 509, 815, -1138, 774, 386, 349, -297, 270, -211, 258, 1136, 454, 1481, 75, 329, 866, -173, 1361, 671, 121, -898, -560, 496, 59, -149, 32, -152, 110, -654, 441, -697, -1036, -388, -55, -347, -265, 882, -102, 803, -761, 883, 122, -976, 970, 807, + -299, -136, 234, 424, 276, -41, -439, 279, -187, -28, 561, -114, -88, -451, -116, 124, 91, -31, 423, 371, -289, 100, -3, 15, 390, 117, -416, 283, -356, 182, -287, -117, -88, -67, 53, 80, 55, 21, -79, 70, -198, 139, 164, -35, -162, 122, -34, 207, -114, -102, -288, -15, -255, -824, -788, -317, -342, 638, -1032, -1286, -1399, -1689, 755, 829, -48, -136, -5, -402, 98, 210, -356, 1150, 1084, 707, 775, -714, 474, 38, 565, -223, -290, -1055, 943, -953, -1154, -304, -242, 1238, -680, 166, -643, -180, 1195, 221, 378, 591, + 1098, 67, -123, -1342, -247, -108, -38, 734, 395, 2495, 125, -78, -827, -67, 992, 909, -81, -439, -1232, 307, 781, -401, -898, -382, 770, -236, 565, -1788, -1000, -1429, -386, 574, 305, -623, -594, -700, 281, 1473, 446, -6, -522, -42, -406, -111, 174, 174, -468, -211, -42, 319, -795, -541, -185, 391, -54, 515, 165, 61, -180, -88, -358, -75, -541, -120, 594, 214, 271, -413, -746, 371, 351, -216, 0, -307, -57, 94, -40, 280, 174, 184, 356, 199, 281, 305, -60, 246, 131, -204, -499, -259, 1214, 40, 7, 2149, 213, -1591, + -1222, 1508, 1338, 86, -1061, -1317, -755, 264, 1303, 1161, 778, -472, 154, -474, 427, 989, 1523, 1664, -206, -884, -1400, -2093, -20, 1122, 4544, -588, -240, -2190, -906, 190, 527, 2710, 1954, 1212, -1373, -773, -1341, -75, 2269, 2101, 2557, -701, -2513, -1826, -2536, 640, 2331, 2051, 3777, -1798, -2190, -1918, -318, 1673, 2227, 3114, 1411, -650, -1209, 290, -91, 889, 2493, -545, 1550, -550, -1433, 24, 226, 1353, 66, -122, 130, -350, -1238, 521, -169, 426, -349, -1016, -246, -237, 116, 680, 96, -192, 262, -244, -316, -56, 988, 254, 908, -63, 105, -256, + 119, 108, 185, 705, 1214, -33, -327, -1107, -1464, 62, 90, 1775, 1144, 195, -612, -2492, -1403, -212, 1133, 2215, 1151, -666, -823, -2592, -962, 1240, 2282, 1843, 122, -1165, -1317, -125, -196, -1111, 1452, -339, 1715, -1583, 16, -693, -1645, 1201, -865, 1112, -885, -342, -82, 572, 125, -632, -339, -29, 887, -829, 1018, 731, -560, 126, -702, -704, 1185, -1174, -595, 788, 1812, -14, 242, -168, -800, -223, 737, -258, -1205, 169, -267, -204, 357, -1096, 546, -4, 373, 844, -1914, -1413, -474, -43, 1958, -1042, 706, 1543, -853, -501, -59, 837, 1214, -667, + 347, -245, 477, 1900, -712, -2142, 449, 982, 249, -1145, 708, 300, 711, -224, -39, -800, -643, 472, 113, -852, 243, 589, -293, -4, -952, 139, -242, -1038, -43, 465, 396, 168, -35, 259, -718, -175, 244, -344, 539, -332, -147, -314, -7, -334, 515, 97, -422, -353, -26, -14, 853, -299, 296, -155, -26, 189, -381, -328, 47, -727, -212, 216, -632, 32, -126, -213, 123, 408, -12, -228, -148, -2210, -701, 949, 1300, 1079, -1103, 352, -3080, -2003, -1702, -271, 1442, 928, -66, -678, -837, 408, -512, -52, 1102, 300, 51, -1092, -527, -111, + -518, 333, -92, 591, -156, -6, -195, -35, -142, -623, -473, -1046, -740, 534, 1023, 1116, 620, 973, -149, 828, -195, -379, -1308, -50, -723, 560, 213, 1652, -1335, 474, 925, -509, -710, -410, -331, -337, 119, 1174, 752, -311, -45, 844, -976, -1076, 444, -1249, -964, -838, 104, 408, 485, 1454, 986, -155, 733, -420, 29, 184, 543, 883, 950, 672, 554, 449, 38, -1215, -346, -626, -158, 715, -32, 111, -266, -540, 60, -265, -222, -588, 261, 448, -198, 175, 393, 221, 256, 49, 252, -170, 173, -78, -311, 241, 297, -240, -357, 36, + -242, -412, 322, 351, 136, 452, -40, -407, 704, -285, -2637, -3897, -4784, -3781, -5640, -999, -2061, 622, 1183, 4082, 2384, 4230, 4302, 5889, 4299, 4369, 3218, 137, -934, -1706, -1049, -3518, -2404, -1915, -1957, -1937, -1933, -1876, -2024, -2221, -1655, -2582, -2111, -1840, -827, -2170, -671, 797, -1613, -780, 433, 353, -1367, 1137, 1462, 1851, 2511, 2552, -201, 1518, 2468, 3504, 2761, 5518, 5181, 4576, 3708, 4695, 2331, 3738, 4549, 3504, 2241, 3801, 1233, 1278, 2336, 2344, 1665, 484, 1362, -452, 82, 1193, -1355, -3408, -5094, -2012, -6975, -6099, -5365, -6203, -6901, -5783, -5006, -4828, + -3329, -4375, -2248, -2778, -2954, -4478, -3620, -2610, -2139, -1810, -1699, -1064, 421, -4, -104, 1264, 2637, 2202, 2228, 3555, 3038, 3159, 4007, 3781, 3215, 3060, 3667, 3126, 3027, 3215, 3333, 2839, 2480, 2287, 2135, 2794, 2190, 1649, 1720, 1293, 754, -436, -921, -1202, -2165, -1846, -1913, -2268, -2394, -2189, -1424, -1582, -1421, -1425, -730, -797, -952, -642, -203, -221, -412, -257, -2, -150, -194, -190, -107, -89, -88, -102, 13, 111 } + } }; -const Word32 CRendBin_FOA_HRIR_coeff_im_16kHz_fx[4][BINAURAL_CHANNELS][80] ={ -{ - { - -124641560, - -330995936, -435895168, -437441344, -373644960, -285947648, -195637904, -102814000, -970663, 107208824, 208084192, - 288674400, 344239488, 374285984, 379003488, 362399136, 332406304, 294898912, 251757024, 204752896, 156264864, - 107070312, 58171572, 12713103, -28032714, -66919348, -105292736, -139822128, -168325136, -193051264, -215338928, - -233332688, -247173216, -259894384, -271925120, -281149088, -288219680, -295403552, -301753120, -305660480, -309210816, - -314223552, -318274272, -319749568, -321241536, -323750336, -324336608, -322656192, -322037728, -322309920, -320046464, - -316118720, -313960512, -311962272, -306865216, -301171712, -297990208, -294138688, -287096544, -280967104, -277678752, - -272357312, -263981040, -258198944, -254881616, -247710624, -238365312, -233833584, -230562976, -221124784, -211508880, - -209043040, -203756464, -188322512, -177797680, -174789600, -141778480, -58569396, 18691698, 21820582, }, - { - -124641560, - -330995936, -435895168, -437441344, -373644960, -285947648, -195637904, -102814000, -970663, 107208824, 208084192, - 288674400, 344239488, 374285984, 379003488, 362399136, 332406304, 294898912, 251757024, 204752896, 156264864, - 107070312, 58171572, 12713103, -28032714, -66919348, -105292736, -139822128, -168325136, -193051264, -215338928, - -233332688, -247173216, -259894384, -271925120, -281149088, -288219680, -295403552, -301753120, -305660480, -309210816, - -314223552, -318274272, -319749568, -321241536, -323750336, -324336608, -322656192, -322037728, -322309920, -320046464, - -316118720, -313960512, -311962272, -306865216, -301171712, -297990208, -294138688, -287096544, -280967104, -277678752, - -272357312, -263981040, -258198944, -254881616, -247710624, -238365312, -233833584, -230562976, -221124784, -211508880, - -209043040, -203756464, -188322512, -177797680, -174789600, -141778480, -58569396, 18691698, 21820582, }, - }, - { - { - 75593568, - 155059056, 65981972, -176542480, -455539808, -637033280, -657530496, -539268608, -342454912, -120152784, 93872416, - 282080576, 438413088, 560683840, 646364096, 696203456, 715256448, 707575488, 676227584, 628872896, 575156800, - 518422432, 457256192, 393254176, 330107968, 268590080, 209222352, 155216352, 107179296, 60949880, 14872935, - -27944668, -66942436, -105086576, -141653920, -173350256, -201999824, -231627056, -260288432, -284058944, -304740288, - -324854688, -341365088, -352426752, -362333632, -372995360, -380162592, -383072960, -386599680, -390847392, -391133536, - -388979616, -389657152, -390702976, -386790784, -381270688, -378934752, -375216384, -366126112, -357851296, -353983680, - -347605664, -336765696, -329902336, -327582528, -320349792, -309751968, -306260704, -305536992, -296023104, -285476800, - -286087776, -284915232, -269088832, -259352672, -266973552, -245536832, -154669296, -45682884, 1611, }, - { - -75593568, - -155059056, -65981972, 176542480, 455539808, 637033280, 657530496, 539268608, 342454912, 120152784, -93872416, - -282080576, -438413088, -560683840, -646364096, -696203456, -715256448, -707575488, -676227584, -628872896, -575156800, - -518422432, -457256192, -393254176, -330107968, -268590080, -209222352, -155216352, -107179296, -60949880, -14872935, - 27944668, 66942436, 105086576, 141653920, 173350256, 201999824, 231627056, 260288432, 284058944, 304740288, - 324854688, 341365088, 352426752, 362333632, 372995360, 380162592, 383072960, 386599680, 390847392, 391133536, - 388979616, 389657152, 390702976, 386790784, 381270688, 378934752, 375216384, 366126112, 357851296, 353983680, - 347605664, 336765696, 329902336, 327582528, 320349792, 309751968, 306260704, 305536992, 296023104, 285476800, - 286087776, 284915232, 269088832, 259352672, 266973552, 245536832, 154669296, 45682884, -1611, }, - }, - { - { - -13516799, - -47047608, -75309032, -62113280, -5710159, 44517336, 47165720, 14072460, -18145164, -33218350, -34133716, - -21449066, 3812857, 28223304, 37196028, 34013456, 34574488, 45631344, 58047556, 60662120, 52355652, - 38347616, 20948702, -663572, -23905252, -42361264, -53194780, -60423748, -68946576, -79115448, -88714696, - -96179352, -100115152, -99302864, -94590752, -88048976, -80552648, -73115376, -68803768, -69573640, -73409584, - -78094856, -84709640, -94160176, -104377368, -114173656, -125358288, -138490688, -151593024, -164659376, -179687472, - -195560592, -209066656, -220571808, -232225664, -242282320, -247946848, -250888368, -253211952, -252287984, -246004992, - -237357616, -227911360, -214068144, -194943200, -174967840, -154628480, -129406824, -100615512, -74480104, -49318036, - -18799608, 12666395, 36197448, 58251032, 91465624, 125506464, 131118912, 95768640, 34258268, }, - { - -13516799, - -47047608, -75309032, -62113280, -5710159, 44517336, 47165720, 14072460, -18145164, -33218350, -34133716, - -21449066, 3812857, 28223304, 37196028, 34013456, 34574488, 45631344, 58047556, 60662120, 52355652, - 38347616, 20948702, -663572, -23905252, -42361264, -53194780, -60423748, -68946576, -79115448, -88714696, - -96179352, -100115152, -99302864, -94590752, -88048976, -80552648, -73115376, -68803768, -69573640, -73409584, - -78094856, -84709640, -94160176, -104377368, -114173656, -125358288, -138490688, -151593024, -164659376, -179687472, - -195560592, -209066656, -220571808, -232225664, -242282320, -247946848, -250888368, -253211952, -252287984, -246004992, - -237357616, -227911360, -214068144, -194943200, -174967840, -154628480, -129406824, -100615512, -74480104, -49318036, - -18799608, 12666395, 36197448, 58251032, 91465624, 125506464, 131118912, 95768640, 34258268, }, - }, -{ - { - 2524904, - -6667400, -36648956, -59020904, -46782932, -10592463, 12430709, 528281, -32361504, -55874840, -52653616, - -27202712, 5201206, 32166620, 50741816, 66517232, 86834576, 112838992, 138209904, 155768800, 163266208, - 162048048, 153503744, 139643344, 124723168, 112251120, 100708392, 85207320, 63358284, 37009196, 8313983, - -22997940, -57576184, -93972272, -129579160, -162667584, -192314672, -217229248, -235842016, -247436288, -252719104, - -253362272, -251080032, -246946128, -241466288, -235115104, -228319920, -220868160, -211994224, -201354512, -189441344, - -177004736, -164805408, -153993376, -145716960, -140006272, -135824576, -132352104, -129337032, -126228552, -122214368, - -117293944, -112182400, -107019848, -101358544, -95343440, -89495848, -83437256, -76397808, -68776384, -61350388, - -53382684, -43865036, -33872260, -24074902, -10565620, 10658498, 32707786, 38097432, 17067126, }, - { - 2524904, - -6667400, -36648956, -59020904, -46782932, -10592463, 12430709, 528281, -32361504, -55874840, -52653616, - -27202712, 5201206, 32166620, 50741816, 66517232, 86834576, 112838992, 138209904, 155768800, 163266208, - 162048048, 153503744, 139643344, 124723168, 112251120, 100708392, 85207320, 63358284, 37009196, 8313983, - -22997940, -57576184, -93972272, -129579160, -162667584, -192314672, -217229248, -235842016, -247436288, -252719104, - -253362272, -251080032, -246946128, -241466288, -235115104, -228319920, -220868160, -211994224, -201354512, -189441344, - -177004736, -164805408, -153993376, -145716960, -140006272, -135824576, -132352104, -129337032, -126228552, -122214368, - -117293944, -112182400, -107019848, -101358544, -95343440, -89495848, -83437256, -76397808, -68776384, -61350388, - -53382684, -43865036, -33872260, -24074902, -10565620, 10658498, 32707786, 38097432, 17067126, }, +const Word16 CRendBin_Combined_BRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2818]={ + { + {160, 79, -108, 162, -95, -33, 2, -56, -62, -126, 30, 191, 20, 34, 81, 19, -68, -21, -40, -41, 116, 32, 15, -40, 21, -5, -44, -72, 112, 86, 16, -24, 130, -181, -67, 77, -75, 155, 16, 110, 14, 12, 71, -63, -26, -2, -2, -49, -39, 69, -3, -167, 157, -22, 27, -141, 67, -63, 55, 4, -5, -53, -5, -82, 84, -159, -18, 116, -92, 43, 173, 52, 17, -86, 9, 46, -33, 58, -36, -25, -49, 52, -57, -91, 29, 15, -23, 111, -28, -24, -27, 37, 40, -3, 4, 20, + -22, 20, -43, -18, -7, -9, -23, -1, -2, -5, -14, -1, -24, 12, -12, 27, -18, 20, 27, 334, 62, -47, 102, -50, -42, -53, -22, -125, 177, 103, 77, 82, 79, -82, -111, 149, -32, -116, -221, 36, -65, 69, 1, -19, -49, 69, -82, -41, 109, 207, 54, 94, 18, 104, -22, 111, 70, 13, 62, 6, 18, 6, 151, 32, 40, -34, 22, -11, -21, 123, 141, -51, -52, 28, 129, -211, -11, -57, -156, -63, 22, -66, 69, 56, 5, -95, 44, -20, -91, 117, -161, -76, -172, -85, -24, 26, + 173, -75, -45, 54, -27, -41, 82, -14, -3, -38, -58, -72, -19, 61, 24, 30, 28, 22, 2, -10, -4, 5, 43, 21, 23, -15, 4, 15, 12, 0, 3, 0, -3, -6, -30, -23, -16, 17, 14, -7, 101, 45, -203, -19, 30, 145, -44, -252, 203, -238, 13, -104, -83, -253, -168, -98, -64, 105, 35, -166, 23, -89, 1, -5, 68, 15, -73, 12, 18, 41, -52, -35, -16, -82, -125, 170, 78, 24, -24, 145, 125, -142, 40, 14, -27, -82, 19, -147, 33, -27, -121, 149, 2, -11, 185, -161, + 146, 55, -22, -119, 34, -17, -127, -105, 1, -45, -57, -174, 8, 38, 81, -50, 76, 24, -31, -24, -104, 90, 18, 14, -172, 91, -16, 13, -89, 3, -158, 20, 33, 22, -14, 16, -4, 2, -28, 9, -9, 35, 19, 15, 31, 1, 10, 33, 18, -22, -10, 52, -19, 11, -19, 20, -60, -14, -19, 25, -12, -375, -355, 138, 235, 142, -320, 228, -77, -29, 20, -148, -113, 269, -4, 0, 20, -6, 88, -134, 81, -71, 73, 123, -82, -22, 71, -20, 128, -40, 56, 11, -13, 11, -109, -152, + 143, 19, -28, 1, -143, -177, -5, 3, 92, -165, -141, -30, -293, 114, -23, 60, -23, -71, 45, 375, 208, 109, -112, 148, -2, -193, 0, -201, 171, 24, 20, -115, 1, 117, 43, 23, 15, 13, 126, 88, 16, 85, 51, 68, 184, 76, 90, -85, 69, 52, -22, 145, 44, 0, -13, 43, 77, 9, -1, -29, 18, 64, 35, -15, 6, -52, 15, 13, -24, 5, -4, -1, 35, -7, 37, 51, 18, -30, -58, 9, -37, 28, 25, -37, 15, -538, -41, -129, -19, -90, -305, -13, -82, -126, -286, -35, + 203, -142, 134, -24, 189, -64, 153, -51, -152, -41, 16, -67, -136, -110, -134, 4, -122, 45, 14, 12, 58, -92, -123, 178, -16, 53, 2, -140, -89, -99, 5, -71, 124, 126, 21, -171, -56, 315, 78, -133, -106, -67, -117, -62, 246, 150, -178, 109, 145, 214, -55, 87, -13, 2, -87, -178, -32, 131, 13, 255, 181, 12, 59, 215, -171, -79, -51, -106, 76, 33, 35, -92, 63, -67, 69, -131, -6, -12, -52, -3, -11, 64, 18, 14, -56, -38, -18, -53, -2, -77, -45, 3, -6, 48, -33, 13, + -16, 26, 19, 66, -55, 690, 463, -143, -26, 2, -19, -79, 96, 236, 199, 104, -362, -161, 47, 21, 154, -273, 55, 370, 249, -42, 89, -32, -125, -170, 10, -145, -85, 43, 115, -106, -198, -94, 34, 182, 254, -48, -269, -57, -96, -270, -16, -8, -129, 45, 73, 158, -226, 93, 117, 26, -219, -162, 75, 10, 57, -24, -21, -7, -121, 60, 63, -85, 152, 180, 245, 59, 18, 231, 377, 60, 52, 64, 222, 25, 131, 373, 110, 69, 10, -70, -319, 43, -9, -52, -61, 39, -44, 79, 35, -42, + -23, -11, 64, 41, -18, -12, 43, 95, 0, -24, 33, 4, -45, -88, 64, -83, 50, 35, 61, -4, -11, 1, 20, -116, 3, 17, -11, 363, 8, 76, 88, 175, -68, 112, -94, -60, -299, 119, 205, -185, 155, -77, -262, 273, 162, -49, 164, 320, 224, -165, -92, 161, 51, -36, 125, 114, 166, 11, -72, -142, -253, -8, -210, 26, -68, 118, -167, -385, 85, -95, 178, 45, 14, -106, -226, -190, -17, -19, -170, 241, 312, 323, 131, -231, -20, 306, 30, -53, 143, -40, -76, -291, 161, 84, 422, 195, + -286, 96, 108, -30, -5, 102, -69, 23, -122, -302, 273, 50, 163, 79, -142, 231, -51, 55, 13, -51, 9, 7, 19, 121, 41, 23, 11, -41, -48, -63, -37, 42, -19, -3, -23, 38, -35, -18, 4, -5, 17, -67, 78, -33, 69, 22, -35, -44, 97, -88, 78, -21, -112, -186, -50, -48, -322, 16, 40, 161, -61, -139, 58, 18, 76, 3, 175, 70, 121, 21, -14, 104, 61, -317, -98, -453, 21, -84, 52, 81, 6, 217, 55, 310, 38, -367, 8, -148, -61, -17, -55, -19, -292, 64, -140, 352, + -365, 203, -79, -311, -58, -219, -47, -66, -331, 96, 102, -60, -55, -21, 117, -263, 7, 247, 46, 344, 561, 232, -508, -677, 329, 148, 507, -104, 243, 53, 242, 339, 436, -231, 126, 325, -265, 50, -34, -33, 25, 232, -35, 80, -149, 55, -115, -121, -53, -101, 17, -59, -171, -6, 114, 71, -31, -31, -25, 3, 53, 56, -44, -66, -29, 99, -24, 96, 15, 15, -24, 24, 29, 9, 27, 6, -80, -78, -51, 26, 82, -114, -76, -35, 48, -53, -620, 463, 86, -82, -8, -282, -229, 241, -64, -79, + 252, -187, -200, 11, 251, 106, -79, 7, -142, -20, 21, 133, 7, -318, -314, 70, -41, 75, -30, 126, 246, 456, -6, 283, -68, 79, 197, -191, 375, -54, -230, -329, -61, -273, -341, -96, 160, -107, -265, 132, 192, 296, 385, -314, 121, -88, -285, 107, -319, -60, -522, 209, -154, 77, -92, 82, -562, -563, -339, -133, 315, -303, 595, -210, 62, -56, 113, -55, -417, 60, 52, 114, 100, 49, 166, -94, -141, 0, 10, -140, 67, -180, 106, 60, 86, -27, 4, -55, -135, -101, -53, -63, 97, -63, -164, 58, + 76, -31, 119, -10, -29, -1, 32, -49, -43, 60, 88, 62, 33, -123, -82, -27, -92, 36, 15, -1, -82, 521, 34, 195, 141, 52, 309, 39, -425, 203, 65, 194, -16, -320, 457, 242, 189, -46, -134, 55, -30, -255, 166, 110, -137, 179, 292, 4, 112, 283, -309, 71, -102, 125, -585, 176, 286, -103, 79, 280, 155, 1, 97, -299, 79, -177, 16, 81, 50, -139, 567, -106, -104, -136, -488, -204, -298, -354, -64, 479, 534, -57, 167, 207, -440, -149, 364, 292, -173, -130, -434, -148, -162, -217, -243, 60, + -443, 67, 423, 580, 184, -178, -8, 304, -105, -218, 24, -34, -89, -148, 25, -21, 73, 86, 58, -57, 31, 43, 43, -15, -82, -194, 57, -19, -73, 135, 49, 73, -76, 114, -81, -73, -92, 88, 23, 63, 145, -20, -68, -47, 75, 24, -2, -4, 24, 13, -4, -36, 76, 89, 122, -48, -165, 103, 28, -220, -325, -350, -139, -342, -141, -139, 6, -326, 74, 137, 16, -372, 117, -461, 144, 258, 9, 400, 14, -119, -71, 270, -95, 372, 134, -128, -125, 66, -187, -102, 16, 352, -9, 186, 108, 33, + 249, -110, -223, 101, -159, -74, -439, 250, -152, -129, -87, -486, 585, 152, -66, 255, 86, 125, -254, -386, -437, -211, 26, -444, 170, 324, -496, -181, 187, -228, 125, 557, 22, -88, -144, 127, -298, 200, 111, -271, 93, 196, -106, -321, -272, -142, -6, 90, 80, 62, -52, -79, -36, 73, 8, -43, -178, -215, -55, 17, -151, -184, -124, -76, -66, -161, -136, -74, -97, -206, 41, 198, -15, -16, -73, -57, 70, -71, 20, -162, 11, -45, -83, 2, -77, 54, 82, -67, 122, -79, -26, -81, 0, 16, 357, 879, + 929, 277, 578, -396, -394, -95, -55, 31, 134, 293, 536, 172, 496, 52, 153, 71, -132, 222, -2, 87, 42, -253, -27, -137, -267, -172, 9, 24, -355, -151, 459, 324, 241, 382, -233, 0, -655, 28, 572, -114, -108, 65, -56, 441, -30, -77, 347, -411, -656, -270, 64, -359, 268, 365, -515, -200, 10, -13, -741, -479, 245, 100, -50, 237, -320, -203, -455, 106, 155, 35, 39, -310, -503, 418, -686, 199, -247, 658, 76, 272, -181, -265, 199, 86, 304, -286, -43, 197, -5, -160, -138, -157, 23, 151, 178, -194, + -71, -34, -245, -94, 55, -31, 31, -136, -213, -35, 15, 170, 63, -111, 144, 19, 78, -248, 60, -150, 126, 18, 133, 193, 71, -142, -265, 83, 103, -860, -619, 429, -89, 779, -190, 642, -516, 16, 231, -51, 28, 75, -40, -388, 136, 146, 170, 193, -119, 319, -289, -214, -165, 448, -247, -83, 40, -9, -233, 200, -259, -309, -582, 53, 107, -395, -185, 191, -80, 102, 32, 460, 32, 346, 155, 15, 278, 63, 96, -522, 537, 190, 421, -256, 112, -280, 437, 331, 533, 85, -139, -387, -24, 68, -329, 468, + 76, 73, 504, 113, -151, -201, -16, 300, 362, -118, 452, -540, -566, -248, 132, -172, 247, -61, 133, 432, -19, 214, -179, -164, 189, -17, 303, -93, -2, -93, -187, 38, -110, -44, 125, 43, -170, -156, 92, 230, 239, -24, 196, 212, -296, 138, 281, 221, 125, -222, -267, -280, -281, -280, 24, -98, -38, 32, -206, 147, 134, -107, 160, 56, 76, -197, 396, -935, -43, 487, -311, -104, 359, -389, -791, 158, 135, 123, -103, -468, 119, 134, 36, 261, -838, 386, -194, 201, -477, 390, -604, -385, 235, -157, -69, -458, + 362, 476, 0, 54, -217, 714, 178, 196, -128, -615, -131, 343, -60, 512, 6, -183, 125, -34, 322, -608, -72, -466, 509, -186, 172, -12, -15, -550, -191, 488, 158, 46, -143, 18, 65, -705, -731, 785, -343, -845, 349, 405, -680, -891, -620, -596, 111, 242, -71, -572, -15, -304, -141, -413, -19, 46, 47, -79, 400, -210, 160, -177, -4, 113, -95, -10, -228, 314, -66, 114, -166, -244, -46, 127, 145, 50, -238, 151, -29, -189, 198, -290, -52, -176, 304, -124, -322, 150, -123, -135, -430, -15, 106, 375, 158, -208, + -103, 45, -51, -107, 76, -8, -75, -73, -20, 374, -520, -278, -544, -42, 102, -712, 107, -345, 993, 60, -910, -200, 429, 275, 204, 462, 448, -643, -175, -244, 601, -207, 703, 7, -421, -320, -646, -722, 34, 92, -129, -368, -170, 57, 106, 258, -367, 189, -430, -486, 86, -97, -142, -507, -499, -227, -161, 708, 54, 244, 382, -4, 869, 365, -304, 54, 442, -168, 562, -142, 60, 49, -789, -787, 106, 566, 0, -165, -882, 65, 286, 196, -311, -234, -185, 116, -388, 935, 510, 577, 101, -644, 226, 307, 909, 221, + 82, 379, 146, -141, -4, 292, -39, 47, 80, -225, -176, 284, -4, -214, 278, -171, -79, -129, -146, 267, -179, -66, 124, -269, 104, -17, -171, 348, -135, 8, -446, 273, -145, -105, -292, -389, 50, -152, 267, -2, 153, 114, -6, -159, -8, -433, -394, 833, -258, -309, -44, -230, -568, 12, 392, -975, -17, 253, 311, -333, 220, -558, 42, -144, 174, -500, 310, -851, 138, 23, 481, 453, 224, -318, 353, -104, 394, -431, 67, 504, 398, -237, 81, 12, -113, 244, -97, -294, -329, 233, -594, 390, 89, -635, 596, 572, + 536, 194, -282, 691, 81, 297, -427, -369, -410, 126, 155, 247, -574, 55, 417, -1097, 38, -361, 685, 443, 342, -98, 453, -431, -26, -301, -664, -28, -612, -510, 294, 810, -766, -182, -144, 813, -206, 355, -238, -144, -36, 287, -175, -72, 18, 195, 139, 102, -114, 28, 80, 402, -325, 335, -79, 244, -5, 64, 80, 153, -218, -50, -47, -264, -241, -235, 154, 127, -55, -107, -142, -186, -121, 13, -89, -5, 235, -9, -453, 206, -268, -43, 725, 157, 367, -1044, 484, -584, 791, -78, 308, 601, -648, 1156, 828, 626, + -285, 170, 791, -196, -256, -182, -43, -595, 157, -315, -727, 705, 230, 196, 86, 166, 269, 742, 153, -458, -42, -475, 92, 72, -844, -33, 455, 37, -63, -253, 892, 188, 378, 201, -486, -342, -267, 559, 325, -108, 334, -46, -612, 594, 69, 681, 72, 73, 10, -895, 119, 28, 96, 563, -224, 884, -1341, -234, 994, -400, 326, -452, -716, -570, 409, -388, 381, -612, -136, 108, -156, -238, -82, -68, 265, 623, 61, 372, -124, -57, 447, -61, -133, 130, -230, 206, 389, -258, -45, -98, 68, 79, 182, 705, -132, 252, + 8, 173, 249, 133, 34, 395, 416, -112, -64, 180, 86, 157, -546, -39, 510, -109, 102, 209, -34, 531, 187, -1082, -1294, -115, -607, 82, 369, -518, 152, -792, 345, -436, -2165, -139, 1322, -569, -245, 1328, -311, 72, 1590, -380, 352, 149, -232, 1280, -1030, -133, -27, -181, -207, -211, -25, 417, -234, -698, 9, 14, 207, 255, 47, 575, -21, 265, -156, -694, 484, -85, -713, 27, 413, 1261, 639, 1060, 24, 261, 507, 120, -60, 991, -51, -385, 1161, 203, 207, 9, -162, 663, 1, -385, -434, -90, -84, 1005, -680, 88, + 131, -178, 1181, 11, -752, 127, 387, -553, -24, 565, 468, -284, 47, -321, 274, -86, 40, -316, 297, 5, -29, -459, 193, 159, -297, 25, 112, -154, -99, 358, 59, 200, -127, 106, 620, -557, -251, -181, 670, 251, 357, -400, -363, -147, -40, -485, -543, 661, 271, -383, -355, -216, 2, -379, -330, 10, 107, 254, -58, 65, 735, 594, -1214, -592, 931, -171, -910, -8, 18, 330, 986, 878, -542, 163, -124, 8, -11, -568, 855, -254, -563, 200, -405, 487, 41, 692, -215, -655, -595, 524, -254, 682, -185, 442, -450, -348, + -216, 49, -565, 139, 28, 10, 548, -6, 182, -382, 271, -603, 644, -580, 382, 196, 541, -908, 28, 77, -277, -656, -1114, -186, -951, -364, -761, -353, -1390, -431, 627, 798, 432, 465, -77, 505, -992, -226, 151, 640, 174, -1361, -56, -598, -401, 1591, 1067, -754, -309, -529, 175, -1400, 84, 293, -403, -415, 253, 83, 11, -268, -238, -230, -236, 438, 400, -28, -115, -431, -498, -104, -126, 168, 426, -835, -65, 419, -4, 536, -189, -511, 275, 579, 290, -346, 41, 536, -683, -484, 902, 51, -33, -91, 142, 210, 273, -113, + -222, -1599, 468, 250, -841, 331, 314, -612, -468, 717, 90, 381, -192, 474, -150, -77, 375, 179, 124, 9, -252, -436, -264, 678, -239, -591, 1002, 617, 80, 455, 137, -519, -1528, 624, -50, -828, 695, -75, -1114, -940, -486, 730, 296, 757, 958, 284, -771, 243, 280, -987, -157, 553, -305, -1075, -811, -1309, -831, -191, 828, 1193, 578, -81, 826, -207, -2015, -1602, 354, -808, -954, 1370, 184, -1848, -1424, 486, 89, 315, 691, 1653, 953, -141, 1846, 587, -1927, 17, -407, 998, 305, -634, 315, -476, -277, -414, 633, -116, 465, 385, + 503, -111, -492, -162, 350, -215, 295, 186, 215, -433, 59, 175, 16, 779, -18, 346, 85, -129, 425, 100, -53, 462, -211, -70, 293, 116, -33, -187, -251, 30, -290, -224, 174, 223, 1514, 1465, -459, 509, -599, 366, 23, 211, -714, 56, -610, -549, 9, -1266, 36, -540, 145, 370, -5, 429, -617, 940, -461, -19, 656, -615, 245, 468, 583, 81, 214, 141, -902, -507, -141, 132, 146, -137, 608, -197, -2, -117, -255, 211, 126, -721, 218, -580, 164, -1389, -61, -37, 3, 563, -222, -508, -219, 517, 5, -1342, 1880, -167, + -352, 405, -75, -279, -345, -376, -395, 1283, -491, -748, 644, 59, -1009, -243, 431, 335, -328, 691, -116, -193, 648, -475, -427, 808, -352, -131, -38, 341, 172, -11, -51, 18, 160, -169, -7, 156, 175, 199, -492, 126, 257, -487, 47, 99, -80, -199, 202, 53, -169, 26, -11, -84, -604, 344, -354, 107, 109, -553, -25, 25, 3, -10, -180, -29, 163, -24, -1189, -1762, -1689, 3743, 3112, 3538, 8005, 2093, -2001, 633, -6416, -6809, -1681, -4280, -3305, 2025, -1047, 423, 5108, 2534, 3787, 7263, 4846, 1268, 1060, -2136, -6599, -5045, -3857, -7801, + -3150, 192, -1372, -616, 3959, 1054, 542, 4900, 618, 1177, 6963, 5119, 3248, 6583, 3289, -1145, -86, -2072, -10231, -8930, -7209, -11213, -8536, -3019, -4035, 923, 7802, 6965, 9639, 12161, 9055, 7063, 6873, 3806, -1269, -2434, -5565, -7956, -7812, -6771, -7757, -7942, -6381, -3565, -2578, 979, 6115, 8808, 12571, 14135, 8448, 2063, -1188, -8486, -8072, -6149, -4772, -1768, 915, 680, 882, 1098, 524, 1291, 1809, 1344, 2180, 1243, -539, -664, -1900, -3487, -946, -1084, -1249, 1110, 956, -1178, -1520, -2838, -4640, -1943, 2666, 4528, 8771, 10575, 7195, 4467, 1207, -3947, -5779, -6542, -7652, -7194, -5519, -4474, + -3701, -2241, -555, 1949, 6720, 9369, 8313, 5974, 3688, 815, -1413, -2157, -2731, -1950, -544, -125, -584, -936, -1460, -2258, -2820, -2554, -2396, -1191, 640, 1445, 2165, 2525, 2273, 1495, 722, 148, -173, -94 }, + {273, -36, 22, 214, -27, -11, -62, 234, 14, 113, 70, 68, -96, 48, -149, -17, 116, 23, 68, 109, -185, -130, 44, -10, 137, 83, -7, -77, -48, -95, -15, -13, -14, 25, 36, -83, 138, -32, -21, 46, -175, -41, 76, 26, 173, -1, -13, 33, 12, 71, 120, 151, -9, -17, 3, -88, -111, 60, 99, -71, -67, -46, 127, 74, -17, 19, -149, -44, 78, 63, 110, -162, 36, 60, -33, 112, -7, 98, 47, 31, 125, 61, 32, 0, 15, -31, 10, 16, -10, -46, 22, 21, -33, -6, -22, 22, + 36, 0, -5, -3, -34, 15, -12, 27, 13, 7, 6, -16, 9, 3, 14, -28, -13, -7, 3, 354, 99, -82, 182, -89, 190, -64, -85, 95, 178, -6, -86, 46, 38, -8, -250, 58, 75, 19, 158, 211, 115, 207, 143, 126, -33, 140, 69, -107, 41, 64, -136, -175, -25, 68, 4, -64, -83, -83, -39, 94, 190, 160, 62, 122, -197, 12, -49, 2, -226, 84, -20, -54, -7, -62, -111, -79, 81, 19, 63, -83, 157, 40, -178, 74, 25, 50, 100, 30, 183, -58, 22, -211, 42, 20, 8, 5, + -38, 150, -44, -70, 116, -118, -56, -49, -20, -55, 40, 10, 22, -1, -3, 2, -19, 13, 22, -7, -7, -1, -37, -63, 26, 8, -48, -6, -3, -10, -59, 16, 2, -1, 7, 11, 9, -22, 2, -41, 20, -74, -70, -26, 68, -124, 38, -243, 47, 43, -26, 170, 13, -21, 17, 89, -146, 19, 47, 92, -208, -108, -77, 75, 33, -68, -210, 49, -209, -15, 86, -41, 66, -38, 144, 209, 113, -111, 22, 158, 101, -101, 85, 23, -163, 56, 228, 104, 78, 250, 25, -98, -191, -10, -106, -132, + -60, 137, -129, 44, -76, -75, 163, -23, 29, 127, 177, -80, -159, 203, 159, 98, 12, -125, 22, 160, -162, 48, -105, -6, 102, -96, -3, -183, -46, -18, 30, -12, -66, -10, 37, -55, -12, 23, 23, 14, 17, -5, -11, -73, 41, -6, 42, -30, -45, 15, 40, -27, 35, -8, 0, -5, -5, 38, -21, 13, -21, -477, -174, -74, 261, -99, -39, -154, -130, -23, -343, 192, 64, -10, -126, 189, -53, 96, -76, 61, 122, -151, 17, 166, 95, 67, 179, 159, -99, -128, -158, -3, -209, 50, -276, -53, + 204, 107, -69, -22, -207, 94, -88, 183, -105, -188, -38, -78, -154, 60, -35, -99, -100, -334, 46, -100, -246, -66, 153, 78, -127, 105, 137, 131, 50, -170, -27, -38, 119, -120, -45, 62, 64, -187, -221, -399, -67, -232, 77, -9, -54, 117, -24, -53, 52, 80, 78, 60, 140, -59, -48, -37, 22, 7, -30, 38, 56, -12, 14, -24, -30, -6, -19, 6, 13, 2, -34, 6, -22, -9, 21, 45, -19, 54, 67, 10, -17, -57, -10, 38, 27, -414, -166, -74, -123, 142, 184, 174, -347, -258, 99, 422, + 249, 0, 59, 121, -152, 101, -141, 102, 149, 24, 120, 38, -9, 63, 36, -113, -144, 198, 79, -144, 141, -78, -15, 340, -163, 193, 379, 155, -23, 15, -138, 178, -183, -99, -306, 58, 235, -6, -217, -77, -307, -156, -58, -436, -238, -43, 45, -191, 96, -51, -152, 163, 480, 45, 244, 166, 143, -153, 63, -260, 27, 74, 57, -101, 1, -265, -93, -93, -20, 128, 136, -7, 52, 74, -39, -29, -26, 24, 2, 18, 13, 41, -24, -2, -65, -9, -11, 44, 24, -29, -40, -38, -37, -13, -46, 15, + 80, -65, -10, 27, 45, 644, 412, -226, 86, 205, -83, 116, -37, 191, 100, 59, 179, 97, 90, -58, -431, 204, -71, -102, 342, 207, 120, 153, 119, 83, -63, 47, 17, -114, 93, 143, -241, 44, -155, 114, 138, -385, -3, -458, 11, 54, 42, 121, 313, -41, -158, -82, -83, -123, 92, 93, 33, -54, -53, 298, -97, -64, -162, 264, -38, 222, -103, 237, -229, -490, -142, 27, 101, 161, -161, -126, 70, 41, -73, -131, 308, -123, 293, 73, 208, 77, 152, 122, -50, -23, 61, -12, 161, 0, -50, 11, + -174, -39, -38, 9, -56, -26, -17, -8, -18, -97, -73, 19, 9, -108, -4, 11, 18, 39, 21, 99, 7, -39, -1, -18, -45, -60, -19, 302, -115, -202, -8, 31, -287, -226, -71, 77, -42, 373, 225, 9, 358, 127, 105, -307, 288, -55, -72, -260, -116, 228, 227, -66, 150, -312, -43, 207, 157, -118, -220, -125, -136, -172, -141, 32, -231, -24, 320, -156, 37, -14, -74, 123, -51, 207, 0, 293, -76, -188, 107, -149, -146, -149, -419, 46, 173, 247, 179, 325, -34, -129, 189, -235, 54, 33, -35, 209, + 198, -54, -254, 48, -131, -244, -224, 120, 216, 133, -469, 102, 49, -26, 220, 116, 180, 65, -18, 234, 31, 104, 85, 15, -107, 14, -60, -134, 24, 36, 61, -19, 16, 11, 10, 43, 29, 28, -6, -86, 57, -37, -38, -35, -60, 103, 120, 99, 40, 7, 16, -29, 79, -368, -216, 39, -210, -545, 413, -9, -27, 52, 33, -361, 253, -376, 34, 172, -49, 63, 61, -405, -136, -180, -37, 83, -133, -84, -16, -23, 37, 170, 91, 365, -132, 500, -35, 14, -327, -48, 243, -48, -503, 204, 234, -149, + 124, -187, 349, 194, -10, -20, -223, -142, -244, 230, 227, 100, 26, 104, -197, -518, -189, 183, 80, -383, 10, 47, 53, -183, 133, 275, 142, 7, 111, 190, -106, 282, 5, -6, -278, -353, 228, -106, 113, 117, -19, -74, -78, -57, 36, -85, 115, 29, -32, 32, -41, 7, -145, 39, 11, -22, -81, 30, -72, -1, 22, -12, -48, 3, -48, 179, 132, 53, -21, -11, -52, 5, -21, 116, -39, -11, 105, 29, 43, 83, -56, -25, 78, 53, -24, -8, -573, 308, -77, 113, -169, -94, 243, -281, 273, -171, + -325, 146, -175, 694, 105, -245, -337, -62, -418, -194, -451, -28, 303, -216, 187, 303, -281, -1, -328, 183, 66, -14, 195, -207, -295, -252, 18, 54, 249, -360, 255, 48, -528, -293, -426, -177, 163, -146, -141, -814, -16, -180, -74, -523, -180, -71, 41, 422, 387, 325, 189, 406, -439, 341, 48, 158, 116, -317, 490, 301, 194, -218, -288, -211, 285, 30, 2, 151, 75, 159, -142, 427, 227, -49, -69, 94, 87, 50, -25, -29, 41, -9, -7, -181, 11, -106, 7, 54, 20, -14, 2, 33, 32, -172, -44, 57, + -48, -69, -3, 20, 29, 30, -24, -38, 30, -77, -125, -35, -30, -44, 24, -13, 113, 49, -44, 46, -25, 217, 404, 437, 179, 306, 248, 148, -80, 33, -120, 10, -41, -265, 337, 534, 213, -146, 239, 228, -9, 141, -252, -486, -323, -221, 140, -59, -254, 189, -87, -227, -3, 393, 198, 291, 102, 214, 238, -55, 218, -85, -250, 105, -290, 108, 115, -426, -277, 174, 440, -229, 307, 428, -355, 15, 390, 42, -143, -33, -201, -350, 3, -106, -185, 241, 11, -401, 513, -213, 416, -494, -338, 241, -305, 167, + -205, -149, -286, -175, -233, -583, 95, 355, -165, -27, 245, 262, 185, -38, -23, -152, -49, -68, -81, 61, -18, -57, 83, 75, -39, -10, -107, 43, -94, -169, -14, 154, -1, -90, -26, 255, 126, 6, -80, -96, -71, 13, 14, -81, -33, 0, 27, 100, 21, 159, 94, 113, 41, 49, -28, 13, -367, 237, -160, -391, 565, 296, -402, 288, 254, 80, 476, -976, 69, 409, 137, 42, 426, 22, 232, -561, -79, 160, 5, -278, 109, 234, 108, 114, 300, 257, 399, 322, -126, -123, 309, -185, 216, -346, -193, -444, + -207, 255, 85, -98, 368, -433, -596, -955, 296, 338, 258, 210, -229, 159, -134, 369, 966, -145, -207, -415, -136, 369, -250, 214, 355, 65, -11, -275, -84, 140, -675, -615, 60, 90, -242, 347, 257, 497, 791, 323, -188, -90, 164, 2, -441, 214, 180, 163, 48, 210, -12, 119, 90, 69, -103, 15, -14, -7, 158, 54, -7, 91, -178, 56, 27, -16, 167, 40, -55, -23, -111, 311, 15, 59, 122, -38, -51, 178, -191, 177, -141, 148, -15, -5, -38, 64, -34, 153, -126, -42, 39, -20, -47, -84, 100, 1454, + 820, 525, -135, -147, -19, -122, -151, -224, -273, -465, 19, -32, 113, 205, 386, 588, -79, -761, -299, 656, -103, 247, -86, -10, 435, 152, 330, 196, -15, -18, -7, 222, 280, -108, -430, 564, 402, 288, 104, 148, -230, -424, 586, 329, 150, -271, -304, -423, -263, -74, -267, 149, -544, 77, 400, -259, 140, 26, 58, -618, 218, -265, 451, -994, 170, -259, -337, 84, -204, 207, 193, -648, 6, 456, 67, 135, 284, 118, 472, 195, 99, 33, -70, 306, -603, -10, -36, -54, 22, -16, -6, -51, -90, -114, 186, 159, + -83, -12, -290, 30, -19, -283, -3, -421, -322, 144, 53, 224, -252, 110, 217, 50, -10, 58, 116, 12, -64, 233, 0, 77, -137, -100, 95, 140, 23, -892, -460, 67, -785, 181, 568, -273, 691, 813, 102, 407, 500, 226, -482, 315, 381, -18, 96, 271, 237, 574, 97, -220, 365, 132, -58, 9, 244, -334, -153, -141, 203, 107, -474, 140, 393, 11, 475, -449, -851, 69, 380, 578, 534, 277, 253, 204, -579, -169, -25, 434, 684, -236, 146, -252, 161, 110, 416, 646, -250, -282, -58, 354, 453, 637, 14, -687, + -650, -105, 83, 3, -299, 8, -784, -505, -464, -526, 223, 82, 630, 505, 189, -301, -302, -280, -256, -436, 205, 138, 80, 295, 325, 3, 278, 58, 296, -103, 246, -78, -24, 74, -92, 414, 185, 246, 110, 295, 64, 142, 421, 367, 195, -23, -163, -138, -300, -167, -197, -116, -182, -218, -128, 128, 280, 78, -67, 11, -43, 176, 207, 173, -19, 78, 378, -835, 76, -168, 458, -246, -38, 140, 347, -468, -784, -138, -307, 21, -354, 207, 206, 19, -423, 263, 27, 706, -113, 386, -327, 728, 211, 454, 306, 495, + 731, -180, 283, -513, 539, 522, -12, 168, 528, -340, -327, -56, 1064, 171, -298, 526, 69, 403, 582, 167, -40, 52, 90, 381, -135, 409, -285, 399, -223, 904, -133, 777, -708, -780, 1081, -909, -485, 33, -293, -566, 494, -69, -698, -333, -359, -1030, -382, 123, 230, -796, -203, 477, -97, 272, 472, -342, -79, 73, 308, 217, 232, -81, -46, 187, -18, -132, 103, 216, 40, 148, -7, -148, -2, 198, 75, -110, -258, -161, 298, -144, -406, 90, -234, -446, -2, 159, 13, -120, -35, 113, -94, -1, 155, -16, -76, -102, + 282, 539, 27, -201, -163, -98, -261, -64, -111, 107, -699, -468, 138, -916, -533, -637, -646, 789, -18, 27, 237, -230, -1006, -754, -736, -1505, 111, 172, 653, 381, 228, 326, 228, 72, -472, -696, -399, 544, -65, -406, -161, 533, -639, -412, -656, -326, -53, -631, 240, -523, 573, 402, -84, 397, -383, -793, 353, 468, -406, -910, 693, -55, 504, 423, -1301, -924, 14, -207, 856, -483, -558, -146, 320, 53, -73, -291, 1135, -549, -914, -1238, 899, -207, -1018, 484, 493, 295, 1037, 1109, 1139, 492, -249, -96, -168, 383, -716, 473, + 96, 99, 361, 350, -290, 445, -334, 155, -478, -268, -181, -243, -92, -262, -59, 197, 521, 606, 34, 478, -270, 79, 285, 49, -508, 75, 136, -131, -374, -233, -226, 629, 394, 213, 301, 534, -71, -605, -379, -341, -435, -561, 113, -468, -836, -191, -172, 138, -836, -319, 374, 637, 1265, 219, 657, 334, 311, -281, -104, -238, -711, -813, -1166, -411, -1051, -399, -555, -194, 548, 147, 369, 667, -10, 453, 118, 32, -26, -77, -888, 329, -121, -982, -625, 299, -648, -235, 220, 729, 862, 313, -193, 129, 573, 322, 112, -9, + -1741, -340, 371, 447, 164, -58, -594, 413, -531, -383, -114, 114, -301, -915, 482, -110, 1136, 445, 380, 450, 833, 1903, 17, 40, -92, -557, 325, -384, 1366, -115, -507, -437, 570, -740, -517, -91, 1166, 47, 550, 877, 163, 711, 522, -90, 478, 538, 5, -356, -403, 117, 122, 453, 274, -12, -79, 86, 169, -325, -82, -75, -56, -512, 314, -370, 119, -70, -237, 69, 618, 558, -12, -31, -414, -158, -412, -53, -477, -658, 183, 466, 20, 32, 961, -125, 170, -1053, -364, 1246, -833, -220, -722, -2110, -307, 654, 529, 108, + 148, -110, 1180, -1273, -7, -363, -860, -718, -114, 247, 207, 290, 759, 501, -548, -546, 1515, 1247, -106, 150, -173, 409, -12, 891, 317, 476, 126, 73, -1581, 656, -74, -903, -468, 94, -251, -899, 862, -150, -649, -131, 88, 773, 855, 659, 246, 771, 813, -612, -680, -427, -117, 798, 1056, 186, 376, 1023, 606, -954, 700, 260, -218, 40, 1956, -1297, 994, 1148, -1160, -65, -757, -239, -1662, 479, 725, -994, 594, -860, -630, 756, -477, -67, -290, 39, -422, 130, 184, -312, -452, -33, -490, 634, 106, -592, 122, -98, -331, -310, + 196, 404, 497, 208, -463, 1164, -223, 116, -84, -615, 226, 336, -321, 496, 118, 371, -96, -597, 192, 893, -576, -836, -1355, 268, -260, -432, -548, 300, -333, -157, 891, -279, -50, -701, 57, 445, -980, -620, -586, -290, 356, -1323, -735, -1908, 331, -22, -484, -215, -281, 405, 612, -679, 26, -239, -229, -1193, 262, 912, 242, 689, 869, 776, -1045, -322, -315, -492, 879, -901, -518, 29, 1277, 286, -447, 1283, -722, -681, 1533, 1465, 142, 372, -416, -1392, -427, 1399, -678, 1268, -457, -2001, -526, -937, 1068, 8, 241, 955, -151, 787, + -1027, -1215, 935, -244, -2042, 1261, -648, 343, 416, -715, 1357, -925, 494, -15, 364, 1371, -346, -434, 56, -286, -369, -310, 160, 309, 81, -197, 179, -654, 595, 413, 338, 132, 11, -306, -326, -318, 285, 536, -517, 465, 1090, 364, -918, 90, 347, -344, -603, 578, -509, -11, -35, -555, -705, -7, 418, -236, 943, -312, -602, 365, 705, 53, -1271, 750, 864, -1050, 574, -5, -381, -449, -1517, -668, 532, 97, 1391, -1117, -632, 262, -154, 893, -1240, 2, 127, -1046, 1047, 575, 319, -490, 717, -847, 469, 366, 221, -59, -474, 199, + 953, -499, -182, 189, -746, 764, 30, 202, -1023, 554, 136, 190, -2400, 332, -681, 1124, 930, 988, 505, -1948, -341, 421, 43, 132, 1375, -202, -825, -989, 42, -1100, -966, -855, 416, -1607, 1148, 2194, -571, -259, -1707, -369, 659, 408, -565, -113, -2065, -722, 2081, 888, -640, 612, -1168, -861, 233, 52, 145, -788, -270, -160, 5, -1145, 254, -142, -355, 161, 483, -622, -309, -91, 234, -476, -122, -75, -450, 15, -839, 1115, 365, -281, -104, -316, -37, 718, 221, -121, 379, -220, -1044, 59, 58, 233, 478, -266, -188, 471, 567, 247, + -496, -1565, 426, -687, -467, 475, -383, -551, 436, -724, -44, -826, 1192, 21, -872, -258, 20, -88, 277, -583, -403, 130, 240, 140, 116, 452, -524, -201, -1205, 447, 112, -368, 869, 476, -358, 1332, 293, -838, 630, 109, 409, 880, -85, -216, 134, 726, 406, 17, -78, 776, -73, -901, -161, 167, 706, -315, 1219, 1354, -865, 708, 1514, -409, 2302, 1305, -585, -524, -877, -983, -564, 310, -180, -173, -38, -148, -1623, -623, -1603, 376, 1422, -532, -95, -775, 379, 100, 267, 401, 1190, -56, 536, 560, -908, 41, -10, 199, 385, -48, + -221, 377, -64, -205, 39, -370, -99, 278, 42, -157, -872, 48, -407, -29, -345, 724, -251, 355, 424, -340, 513, 339, -5, -182, -339, 85, -48, -185, -44, 362, -288, 160, -112, 262, 2036, 540, -731, 83, -960, -124, 335, -396, -511, -566, -216, 221, -126, -181, 259, 152, 351, -361, -228, 264, -95, 49, -531, 362, -621, 300, 204, -131, -28, 25, -360, 63, 73, -284, 518, -276, 126, 6, 18, 265, -256, -395, -119, 603, -445, 297, -816, -482, 156, -173, -12, -51, -490, 524, 417, 41, -358, -15, -217, 110, -272, -5, + -261, 200, -71, 55, 661, -554, -46, 103, 42, -117, 18, -261, 17, -218, 138, 265, -398, -328, 194, 29, -92, -312, 139, 46, -11, -68, 6, -68, 223, -142, -37, 107, -71, -8, 180, -114, -74, -41, 41, 187, -58, -201, 16, -128, 480, -187, 63, 113, -116, 384, -50, -324, 123, -183, 239, 120, -47, -15, -82, -84, 236, -148, -64, -20, -196, 265, -977, -1444, 1006, 4626, 2027, 2121, -14, -4284, -3101, -1613, -3378, 1640, 2015, 1048, 4369, 1964, -190, 1448, -2827, -3605, -2058, -2525, -545, 1950, 1998, 836, 3355, 1664, -234, 1612, + -1485, -2549, -1461, -1918, -3008, 1107, -26, -1083, 3242, 1950, 1099, 3318, 804, -1689, 1636, -2408, -2741, -564, -2883, -2929, 1159, -487, 709, 3684, 2528, 2625, 2482, 297, -1387, -1610, -2686, -3531, -1848, -1009, -727, 1343, 2104, 1969, 2797, 2520, -387, -451, -451, -2599, -775, -1283, -1925, 426, 794, 123, 1800, 796, 20, 1118, -862, -959, 29, -625, -191, 462, -93, 513, 699, -390, 551, 216, -837, 73, -397, -1605, -19, -414, -679, 1536, 466, 572, 2032, 796, 599, 439, -1002, -1479, -1358, -2296, -1865, -841, 83, 1019, 2354, 2479, 2289, 2015, 1255, -508, -1431, -2872, + -3624, -2813, -1678, -604, 1532, 2819, 3254, 3317, 1605, -407, -1086, -1346, -1709, -1243, -1253, -1014, -141, 291, 492, 796, 857, 760, 690, 358, 124, -87, -310, -499, -465, -442, -350, -305, -124, -47 } + }, + { + {147, 84, -133, -30, -49, -4, 199, 11, -85, 105, 21, 11, 35, 22, 2, 150, 85, -102, -39, -12, -36, 42, 64, 43, -44, -65, 25, -131, -60, 98, 8, 79, 40, -64, 48, 1, -56, 138, -92, -43, 17, 47, -63, -17, -91, -179, 168, -34, -94, 10, 154, 0, 59, -77, -45, -32, 47, -61, 123, 19, 111, -161, 68, -42, 27, 69, -28, -18, -119, 1, 64, 15, -33, -6, 57, -30, -32, 91, -42, 29, -17, -5, -112, -46, -31, 41, -9, -50, -9, -10, -32, 30, -38, 2, 8, 19, + 30, -13, -27, 28, 5, -20, 3, 48, -7, -5, 19, 2, 6, 8, -15, -26, -15, 21, -5, 2, 10, -14, 13, 0, -9, 421, 144, -33, 114, 6, 208, 130, -29, 107, 187, 244, -144, -141, 60, -57, -47, 175, 141, 134, 96, 18, -5, -61, 67, 46, 222, 22, -5, -98, 46, 65, -13, -30, -35, 60, -9, -36, -81, 86, -29, -29, 123, 174, -45, -21, 101, 90, 160, 99, 44, 16, 136, 77, -187, 0, 57, -108, 3, 18, -133, 68, -65, 100, -22, -17, 54, 17, -92, -8, 51, -18, + -23, -27, 10, 107, 19, -107, -26, 25, -32, -14, 158, -32, 19, -19, -40, 36, 59, -15, 27, 29, -29, 14, 26, 6, -19, -55, -17, -33, -16, -4, 18, -10, 21, 12, -5, 146, -11, -275, -128, -53, -59, -150, -137, -86, 149, -164, -76, -78, 30, 249, -37, -20, 61, 142, -218, -35, 44, -96, 77, 122, -134, -8, 17, -78, -197, 34, -83, 27, -77, 113, -136, -127, -313, -84, 108, -17, -120, -59, -15, -126, 6, -21, 87, 69, -32, 4, -32, -133, 163, 28, 110, -40, 0, 29, 47, 126, + -40, -30, 37, -3, 137, 74, -119, -47, -30, -188, -21, -18, 112, -72, 102, 18, -4, -10, -18, -20, 22, -76, 35, -43, 38, 33, 15, 10, 109, 81, -20, 100, -14, -33, -32, 20, -7, 69, -18, 43, 35, -6, 29, 0, 30, 30, 9, 11, 33, 22, -45, -24, -5, 56, 62, 1, -7, 34, -604, -189, -53, -49, -50, 233, -215, 104, -50, 47, -61, -50, -173, 28, -63, 13, -252, 5, -26, -45, -4, 47, 38, -24, -17, -101, 31, -81, 54, 0, 46, 157, -41, -180, -77, -211, 30, 38, + -19, 36, -73, 70, 37, -94, 9, -254, -54, -170, 94, 167, -147, -12, 49, 25, -241, 40, 125, -117, -55, -276, 94, -40, 115, 204, 117, -165, 36, 38, 10, -183, 48, -78, 123, -50, -5, 57, 51, 144, 165, 112, -7, 41, 99, 49, -95, -20, -63, -65, 31, -3, 17, 1, -18, -6, 60, -20, -18, 1, -15, -44, 55, 2, 27, 65, -6, 7, -49, 33, 24, 5, -49, 17, 3, -373, 40, 68, -135, -15, 365, 285, 153, -40, -68, 183, 113, 60, 68, -146, 49, 15, 171, -163, -76, -30, + 21, -32, -191, -127, -134, -156, 86, 107, 67, 48, 3, 47, -25, -19, 11, -56, -17, 84, 64, -128, -145, -12, -145, 87, -45, -243, 29, 125, 175, 123, 6, 116, -175, -55, -78, -11, 12, 79, -60, -158, 193, -175, -85, 121, 280, 67, 55, -273, 296, 36, 206, 319, -71, 35, 37, -129, 263, 63, -87, 74, -37, 131, -217, -115, -222, -42, -99, 89, -57, 38, -104, -26, -21, -66, -5, -24, 27, -4, -29, -15, -14, 53, 14, -39, -91, 51, 50, 10, 0, -1, -38, 17, -26, 55, 10, 31, + -32, -36, -72, 566, 399, -142, -208, 314, 205, 331, 486, -245, 169, 81, 141, 64, 85, 202, 50, 206, 7, -131, 55, -42, 70, -24, 377, 64, 83, 52, 15, 133, 56, 8, -24, 95, -73, 181, -140, 218, -102, 132, 69, 81, 64, 320, 244, 16, -69, -172, 189, -210, 53, -92, 93, 200, 24, -334, -271, 29, -169, -182, -105, -210, 75, 366, 183, -134, 8, 43, -96, -107, -18, 180, 200, -212, 100, 235, 47, 77, 113, 183, -32, -125, 48, -53, -11, -119, 110, 173, 26, 31, 24, -121, -18, -2, + -14, 12, -19, 20, 14, 59, 6, -1, 5, 38, 65, 34, 69, 38, 12, 20, -15, -113, -118, 24, 85, 22, -26, 21, -16, 54, -44, -40, -74, 32, 248, 49, 359, -30, -6, -118, -98, 122, 272, -78, 71, 21, 295, 124, -139, -126, 18, 64, 268, 265, 400, 75, 111, -69, 162, 188, -73, -90, 143, -109, -155, 146, 43, -176, -219, 334, 165, -9, 211, 44, -150, 318, -75, 12, -9, 84, -116, 84, -116, 82, -108, 99, -88, 134, -111, -109, 293, -365, 20, 47, -127, 28, -413, -200, 197, -161, + 121, -41, 81, 39, 70, 47, -188, 104, -109, -9, -238, -126, -60, -53, 68, 228, 130, -177, 70, 39, 1, -83, 12, -13, 44, 25, -46, -57, -24, -13, -35, 134, 24, -45, -28, 36, -53, 10, 26, 6, 7, -132, -55, -29, 21, -33, -5, 92, -292, -253, 0, 109, 206, -240, 70, -216, 179, 136, -295, -62, 33, -347, -196, 211, -26, -16, 51, -22, -362, 331, 23, -236, -113, 44, -29, -226, -66, -130, 39, -12, -71, 72, -313, -140, 83, 411, -67, -242, -170, -135, 282, -299, -58, -21, -317, -398, + 99, -276, -42, 41, 211, 117, 19, 45, 252, -108, -76, 370, -246, 193, -83, -93, -36, -45, 397, 9, 156, -407, -294, 10, -57, 456, 17, 311, 133, 389, 238, -59, -268, -101, 184, 80, 125, -150, -167, -46, -55, 81, -40, -109, -18, -26, 1, -13, 17, -44, -58, 75, -3, 5, -19, -32, -24, 21, 65, -66, 17, -40, -58, 43, -16, -55, -64, -12, 64, 7, 10, 24, 113, -93, -76, -47, 11, 46, -487, 46, -48, 332, 39, -354, 422, 135, -248, -544, -226, 536, 27, -69, -90, 54, 18, 165, + 88, 176, -38, 316, -163, -374, 16, 17, -89, -14, 140, -97, -57, -33, 298, 231, 120, -23, -406, -8, -21, -17, -67, -7, -178, -332, -52, 228, 222, -84, 239, -77, 103, 262, 251, -553, 190, 199, 83, -135, -485, 294, 174, 94, -173, -97, -196, 109, -217, -40, 4, 198, -122, 101, 55, -355, -48, -237, 390, 181, -456, -97, 363, 180, -187, -94, -207, -70, 109, -63, -24, -79, -99, -173, 35, 14, -55, -17, 90, 60, -108, -39, 82, -21, 63, -72, -49, -14, 18, 94, -98, -70, 51, -112, -7, -79, + 50, -62, 109, -37, -18, -55, 70, 47, 125, 39, 301, 374, 377, 295, 370, -466, -310, -159, -156, -222, -176, -374, -132, 29, 221, 3, -219, -7, 221, 14, -190, -84, 507, 52, 188, 62, 207, 46, 64, -311, 171, 14, 68, -326, 110, -503, -5, -157, 121, -44, -374, -7, -372, 70, -310, 281, -163, 441, 9, -6, 216, 50, -74, -62, 84, -148, 99, 272, 133, -199, -110, 581, 39, 464, -434, -88, -51, 338, -379, 54, 174, -371, 255, -232, 63, 363, 34, 205, 91, 474, 199, -195, -160, -188, 23, 19, + 193, -117, -28, 131, 3, 101, 130, 20, -115, 131, 94, -12, 35, 44, -54, -39, -161, 104, -81, -70, -37, -81, 70, -55, -25, -87, -28, -20, 103, 77, -10, -18, -13, 61, 68, 65, 133, -17, -143, -468, 70, 458, 341, 374, -125, -95, 93, -64, 462, 156, 219, 391, -29, 147, -266, 389, 193, -97, -239, -220, 259, -449, 175, 260, -189, -250, -145, 243, 89, -90, -167, 4, -279, -416, 74, -400, -599, -74, 21, 606, -263, -206, 267, 447, 444, 239, -30, 104, -195, 35, -205, 499, 437, 286, -23, -509, + -6, -434, 476, 373, 228, -360, 294, 170, 202, -67, -310, -222, -249, 84, -349, -630, 119, 428, 221, 420, -133, -115, 419, 141, 52, 282, 87, 8, 237, 153, -29, 111, 99, 64, -87, -139, -191, 49, 112, 69, 238, 6, 167, -56, 64, 138, 11, -64, -46, -204, -183, 61, 36, 80, 204, 31, 153, -62, -44, 27, -164, -124, -54, -133, 53, -45, 41, 117, 157, 233, 387, 814, 370, 280, 272, -514, -75, -192, 655, -666, -621, 173, 429, -18, 524, 464, -18, 175, -306, -231, 498, -201, 343, 113, -214, -121, + -92, -115, -224, 185, 209, 164, 21, -262, -324, 419, -414, 323, 35, -523, 265, 486, -6, -140, -58, 33, 33, 329, -13, -259, -101, 279, -517, 119, -83, 416, 451, 291, 353, 453, 334, 113, -295, -344, 167, 218, -12, 188, 269, 695, -392, 437, -260, -175, 487, 67, -285, -259, -263, -440, -144, -219, 350, 1, -273, 145, 100, -66, 166, -337, 219, 7, -27, -43, 187, 25, 52, 184, -76, 24, 143, -219, 152, 1, 59, -102, 122, -49, 17, 156, 4, -47, 45, 103, 141, 224, 191, 61, -104, -97, -327, 65, + -272, -89, -117, -121, 132, -546, -97, 318, -392, 12, -247, -431, 628, 537, 449, 213, 117, 177, 461, 255, 473, -175, 396, -298, 479, 644, 404, 322, 164, 332, 335, -99, 666, 160, -402, 191, -406, -279, -83, -632, 11, -135, -171, -307, -160, -88, -20, -62, 28, 27, -363, -240, 75, -192, 151, 624, -314, -25, -59, 23, -298, 161, -143, 482, 103, 288, 451, 77, -30, -297, -662, 88, 493, 358, -93, -441, 372, 39, 224, -565, -406, -372, -561, -347, -410, 191, 61, 144, 187, 259, -126, 264, 299, 10, 161, -96, + -199, -204, -215, -86, -157, -9, 47, -20, 14, 40, -182, -168, -289, -98, -67, -160, 64, 25, -85, -260, -120, -95, -67, 218, 66, -94, -120, -43, -313, 86, -64, 163, 18, -98, -185, 194, 274, -936, -600, -284, 669, 489, -363, 419, 377, 323, 315, -314, 32, 183, -313, -944, -173, -261, -580, 54, -198, -147, 177, 107, -129, 29, 443, 475, -870, 208, 45, 404, 137, 24, -542, 167, -139, -149, -372, -276, 698, -315, -12, 85, -184, 774, 367, -342, -207, -602, -86, 579, 170, 177, -189, 355, -82, -150, 326, -190, + 539, -124, 402, -814, -275, 470, 117, -73, 133, -902, -426, 140, -359, 141, 39, 103, 557, -205, 226, -41, -449, -75, 344, 498, -14, -204, -380, 14, -531, -170, 49, 631, 562, 80, 238, 74, -91, 315, 238, -119, 261, 199, 106, -212, -12, -108, 192, 136, 171, -9, -253, 246, 14, -114, -246, -7, -17, -229, 168, -165, -268, 313, -119, -98, -134, 75, 47, 253, 58, -35, 106, 160, -272, 84, 183, -421, -1160, -112, -129, -140, 192, -481, 932, -181, 53, 1002, -1183, -138, -222, -128, -1357, 63, -201, -278, 475, -484, + 83, 75, 231, -57, -488, 326, -317, 696, -113, -820, -50, -42, -397, -826, 374, 398, -671, 540, -606, -493, -286, 38, 58, 76, 401, -90, -366, -901, 189, -1213, -628, -427, -951, -584, -269, -75, -443, 669, 712, 140, -205, 762, 358, -106, -169, 544, 420, -208, 748, -640, -313, 794, 388, 1121, -616, -717, 187, -549, 579, 44, 205, 1064, -590, -656, -229, 207, 252, 254, 282, 295, -327, 114, 57, -42, -33, -241, -172, 297, -336, -36, 75, -184, 48, -188, -6, -38, 77, -293, 145, 322, 107, 62, 383, 257, -21, -384, + 338, 63, -121, -292, 351, 30, 16, 189, 273, -368, 184, 90, -244, -126, -392, 252, -53, -429, -223, 114, 908, 524, -90, 1240, -148, 511, -589, 725, 674, -58, -551, 61, 192, -301, 317, -441, -13, -133, -151, -501, -375, -226, -36, -160, -402, 593, 399, 113, -170, 104, 562, 271, 412, 266, -315, -477, 966, -123, -535, -217, -233, -123, 698, 34, -546, -203, -1350, -327, -162, 833, 568, -1630, -708, -393, -12, 87, -656, 485, 253, 423, 816, -1068, 1046, 758, -344, -716, 43, -175, 277, 961, -498, -550, 777, -914, -1031, -409, + 103, -290, -1128, -451, -366, 22, 60, -318, -25, 53, 12, 100, -713, -246, -237, 50, 198, -49, -229, -128, 75, 368, 388, -50, -338, -84, 494, 33, -129, 107, -670, -193, -316, 49, 116, -645, -661, 169, 576, -243, 378, 121, -184, -49, 155, 120, -53, 120, 854, 117, 320, -666, -1058, 1528, 762, 71, 98, -341, -901, 317, -72, 773, 170, 288, 843, 469, -12, -88, 141, -513, -426, -546, -308, 509, -141, 34, 631, -107, 276, -879, -793, -535, 455, 188, -32, 211, -283, -791, 997, -949, 435, 453, 353, 161, 603, -389, + -975, 720, 2034, -358, 982, -1184, -643, 734, 425, -1098, -313, -92, 951, -236, -107, -1494, -965, -343, -1102, 919, 975, 1546, -1372, 589, 167, -760, -48, -35, -1586, 1129, -474, 534, -167, 89, 2135, -577, 737, 491, -523, 933, -7, -178, 51, 242, 596, 370, 234, -20, 564, -533, -270, 46, 136, 266, -153, 463, 55, 206, -97, 351, -37, -510, 286, -627, -380, -144, 261, -64, 312, 737, 1125, 821, 216, 530, -314, 271, -29, -20, -59, 114, -246, 316, -301, -1363, -772, -29, -206, -457, 166, 439, 46, -483, -24, -463, 1255, -386, + 29, 950, -53, -976, -678, -667, -294, -355, 1045, 108, 173, 520, -285, -292, -175, -298, -635, -150, 1197, 385, 285, -796, 294, 62, -566, -67, -283, 1299, -1027, -888, -312, 162, -305, 39, 352, -677, -181, 1100, -886, 155, -221, -539, -939, -719, 36, -1309, -1581, 375, 325, 254, -1413, 1092, 1328, -451, -384, 82, -54, -300, -735, 532, 2005, 520, -495, 9, 319, 668, 182, -1186, -1056, 1145, -218, -469, -689, 237, 1309, 400, -413, 240, -50, -233, -114, -71, 580, 320, -196, -321, 263, 152, -48, -133, 213, -311, 194, 502, -46, -278, + -83, -180, -303, -563, 82, 427, -286, -355, 176, -443, 3, -720, 346, 447, 1148, -367, -156, -477, -487, 137, 254, 476, -57, -104, -478, 192, 118, 303, 349, -433, -1143, 317, 447, -1693, 927, 41, -483, 163, 618, -875, 541, -812, 219, -46, -410, -227, -111, -597, 429, 377, -18, 208, 26, 333, 433, 420, 621, 535, -330, 85, -677, 720, -555, 177, -107, 148, 35, -512, 467, -259, -496, 1043, -833, 252, -240, -412, 421, -107, 125, 650, -784, 33, -960, -1890, -48, 604, -227, 2433, 495, -948, 268, -1323, 461, 950, 1121, -383, + -220, -1472, -1690, -140, -1053, 252, -66, -918, -215, -453, -1006, 827, 1624, -453, 115, 352, -429, 504, 640, -442, 75, 4, -806, 405, 69, 247, 297, -569, 225, -301, -457, -517, 443, -320, 183, -500, -180, -32, -611, 602, -386, 122, 185, -568, -91, 441, -50, 65, 100, -164, 272, 569, -66, 332, 390, -482, -918, 314, 131, 535, 641, -831, -815, -1205, 248, -87, -704, 318, -458, -307, -569, 291, -619, 794, -85, 295, -183, 1066, -290, 586, -10, 698, -195, -351, 227, -397, -421, 59, 792, 511, -540, 578, -405, -618, 174, 849, + -326, -344, 453, 205, -423, 49, 577, -239, -555, 304, 231, 357, 650, 138, -392, -127, 1428, 1502, -415, -1240, 952, -413, 269, 137, 1607, 223, -833, -302, -202, 48, 249, 390, 523, -618, 200, 144, 932, -229, 657, 710, 392, 340, 205, 566, -539, 609, 772, 559, 95, -1088, -162, -700, 34, 476, 160, -237, -381, -221, -59, -24, 202, -222, 63, -20, -169, 337, 132, -294, -138, -72, 409, 4, 86, -387, -278, -514, -241, -27, -47, 12, -88, -460, 123, -154, -73, 74, -126, -1, -399, -91, 20, 12, 12, -97, -98, -30, + -156, -221, 1699, 706, -759, 178, -793, -440, -49, 283, -121, 615, -733, -29, 298, -31, 310, -50, 113, 65, -524, -173, 146, -501, -492, 36, 135, -358, 258, 237, -142, -255, -33, 48, -80, 202, 60, 158, -212, -99, 394, -6, 27, 181, -118, 201, -191, -374, -232, 373, -294, -228, 31, -305, -315, 455, -452, 723, 167, -329, 326, 44, -533, 41, -89, -101, 264, -14, -310, 614, -365, -151, 329, 97, -128, 10, 107, -17, -18, -70, 151, 252, -2, -436, 316, -228, -25, 361, -16, -119, -7, -324, 162, 103, -27, 1, + 138, -316, 31, -113, 39, 122, 41, -138, 312, -468, 69, 48, -25, 51, -60, -267, 296, -140, 214, -3, -25, 264, 109, -233, 94, -121, -90, 45, 180, 168, -60, -231, 123, -134, -1025, -1232, 1039, 4210, 1647, 1932, 26, -3943, -2904, -1518, -2315, 1039, 1994, 822, 3525, 1994, -133, 828, -1782, -3595, -1435, -2497, -399, 1728, 1456, 1318, 2194, 1353, 371, 602, -164, -2555, -1129, -920, -3531, 655, 463, -1570, 2544, 2517, -87, 3186, 1567, -1482, 988, -1474, -3066, -244, -1852, -2683, 473, 286, -161, 2498, 2408, 1437, 2143, 1302, -835, -941, -1671, -2864, + -2114, -1010, -946, 512, 1616, 1103, 1776, 2682, 1043, -355, -338, -1860, -1502, 135, -1724, -785, 933, 228, 1168, 938, -481, 310, -99, -644, 140, -289, -292, 590, 203, 248, 787, -457, -178, 426, -591, -486, 222, -1414, -237, 481, -1140, 553, 709, 72, 1783, 1695, 388, 685, -499, -1522, -764, -2023, -2293, -1303, -556, 429, 2179, 2522, 2644, 2347, 1340, -299, -1485, -2350, -3277, -2808, -1546, -406, 1316, 2363, 2358, 2103, 1365, -264, -427, -679, -1012, -724, -628, -734, -391, -205, -166, 133, 412, 524, 659, 589, 463, 182, 30, -231, -365, -492, -486, -479, + -221, -96 }, + {16, 105, -143, -116, -20, 113, 166, -78, 97, -54, -138, -38, -77, 45, -19, -67, 61, 93, 21, 112, -206, -222, -143, 21, -1, -38, 11, 68, -22, 92, 76, -97, 37, -7, 119, 110, 41, -116, 76, -69, 39, 76, -186, 203, 298, 39, 135, -110, -22, -103, -54, 93, -31, -107, -28, -67, 51, -65, -60, 6, 54, -54, -61, -26, 106, 95, -81, -30, -95, 22, 126, 35, -46, -60, 47, -17, -86, -31, -58, -8, -31, 50, 46, 25, -28, -38, 85, -11, 23, 44, -13, -1, -18, 26, 3, 7, + -25, 4, -8, -25, 1, -4, 18, 45, -25, 11, -5, 22, 27, -6, -11, -5, -2, -24, -10, 11, -9, 5, -1, 20, 4, 459, 211, -16, 96, 87, -110, -54, 127, 58, 139, -101, 201, 76, -199, 158, 8, -4, -105, 115, -215, -185, -40, -66, -36, -66, 25, -40, -90, -65, 74, -82, 52, 33, 21, -90, 126, -265, -47, -2, -47, -34, 22, 49, -85, 67, -103, 98, 31, 21, 101, -72, -18, 41, 158, 39, 66, -37, -138, -193, 35, 104, 136, -56, -216, 31, -89, -61, -51, 59, 5, 210, + -7, 70, 40, -33, -56, -59, -221, -65, -37, -31, -43, 40, 109, 30, 104, -2, -11, -34, 28, 37, -11, -43, 36, -23, 14, -19, 18, -33, -21, 29, 9, 16, -13, 9, -21, 247, 58, -209, -236, 65, -72, -196, 223, -110, -36, -31, 175, 36, -101, 122, -94, 185, -255, -169, 205, -213, -214, -87, 175, 76, 84, -21, 157, 94, -15, -206, 57, -58, 75, 65, 57, 179, 49, -177, 17, 123, 181, 61, -98, -24, -145, 62, -258, -10, 280, 15, 31, -143, -176, 27, 40, 205, -44, 17, 23, -31, + 22, 68, 13, 144, -38, 96, 15, 26, 18, 169, 8, -24, 33, -36, -113, -61, -117, -3, 215, 45, -69, -24, -120, 69, -94, -67, 25, 4, 9, -55, -76, -16, 21, -26, 46, -5, 1, 44, 29, 44, 38, 0, 16, -35, 4, -31, -32, 24, 30, 51, 38, -24, -4, 27, -18, -38, 24, 6, -567, -372, -81, 61, 92, 9, 0, -218, -12, -48, -35, 4, -54, -26, -160, 82, -337, -125, 31, -69, -102, -60, -191, -99, -79, -92, 44, -150, -81, 183, 121, 11, 90, 64, -59, -125, 75, 274, + 32, 34, -107, -98, 82, -237, -124, 261, -238, 71, -56, -121, 57, 17, -65, 15, 42, -84, 2, -17, 163, 142, 23, 38, 71, -5, -30, -56, -330, 160, 102, -91, -2, -139, -36, 19, -100, 46, -122, -69, -142, -213, 141, -41, 8, -180, -43, 23, 31, -48, -7, -10, -48, -93, 16, -48, 42, -8, -22, -19, -8, 45, 10, -69, 15, -21, -4, 22, 12, -18, 18, -54, 31, -49, -14, -491, 76, 115, -31, -43, -272, -111, 74, -243, -233, 48, -222, -114, -6, -134, 75, -105, 166, -88, -58, 52, + 116, 215, 134, -239, -13, -18, 118, 177, 300, -134, -119, 156, -165, 38, 47, 254, 93, 142, -190, -84, -259, 204, 214, 246, -5, -53, -166, -35, 165, -77, -107, -98, -130, 28, 30, 39, -178, -2, -174, -9, -27, 71, 60, -53, -80, -220, -14, -18, 134, -85, 224, -129, 27, 104, 204, -159, 46, 107, -185, 92, -1, 226, 74, 51, 138, -14, 37, 107, 42, 1, -41, 2, 44, -15, 56, 88, 70, -33, 38, 5, -25, 35, 45, 0, 20, 56, 40, 45, 20, -22, -38, 43, -41, 43, -24, 3, + 52, 41, -15, 607, 521, -19, 16, 271, 37, 133, -81, 149, -115, 274, 94, 0, 56, 19, 347, 234, -227, -190, 74, 36, -73, -50, 44, 166, 124, 75, 18, 87, -58, -5, 191, -210, 84, 254, 191, 346, -34, -53, -30, 21, -110, 376, 346, 246, -115, -35, 147, 119, -105, 23, 198, -75, -92, 125, -366, -43, 20, 53, -124, -240, 98, 163, -194, -73, -211, 78, 15, -45, -45, -186, 310, -82, 42, -316, -75, -151, 369, -66, -50, 163, 76, -2, -117, 108, -77, -111, 171, 158, -2, 98, 4, -46, + 91, -15, 36, -31, -40, -11, 71, -54, -40, -4, -53, 18, -48, -29, 5, -10, 70, 1, 21, 43, 45, 10, 24, 35, 94, 16, 88, 13, 44, 62, 400, -15, 253, 346, -183, -425, 18, 324, -251, 228, -68, -308, -142, 311, -303, -268, 195, -310, 103, 148, 121, -88, 187, 53, 35, 121, -198, 269, 132, 117, -56, -30, 502, -176, 31, 131, 253, -343, -283, -263, 10, 19, -18, 160, 50, 285, 115, 167, -27, 22, -141, 255, -116, 251, -137, -217, 374, 304, -430, -380, -250, -195, 135, 21, -87, 198, + 218, -262, 154, -22, -525, -174, -265, -240, 91, -82, 172, -40, 26, 314, 320, -30, 84, -28, 50, 45, -108, 89, 26, -5, 269, 80, -2, 8, -48, 79, -9, 52, -58, -4, -62, 16, 70, 22, 0, -9, 61, 39, -39, 5, -2, 9, 31, 13, -228, -318, 190, -182, -135, -113, -371, -38, 165, -99, -23, -134, 305, 48, 194, 150, -247, 254, 378, -115, -155, 42, -66, 165, -469, 181, 405, -52, -133, -114, 176, 365, -87, 93, -162, 250, -300, -113, 58, -45, -233, 430, 302, 228, -96, -321, -40, -457, + 79, -31, -15, -7, -69, 251, 210, -316, 178, -188, 263, -22, -53, -20, -279, -51, -254, -561, -26, 68, 45, -214, -7, -60, -421, 11, 366, -229, 96, 122, -46, 29, -108, -61, 86, 107, 115, -26, -73, -25, -79, 67, 32, -64, -19, -58, -66, -6, -60, -88, 56, -16, -69, 58, -48, 49, 70, 33, 67, 50, 0, 48, 151, 76, -75, -48, -86, 4, -111, 62, -6, 90, -22, 71, -11, -44, 143, 72, -589, 39, 347, 186, -267, -221, 435, 98, 100, -87, 114, -7, -287, -78, -302, 142, -179, -30, + -294, -330, -439, 274, 188, -144, -155, 122, -402, -39, 33, 95, 180, 85, 14, -142, 61, -131, 109, -125, 73, 35, -126, -169, -315, -211, 82, -544, -145, 295, 160, -67, 709, -104, 330, 322, -513, 31, -66, -437, -225, -241, 10, 49, 490, -81, 49, 329, 248, -60, 332, -158, -119, -222, -290, -428, -160, 241, -462, -239, 361, 259, -154, 326, -144, -25, -12, 156, -100, 155, -96, 132, -37, 54, -61, 107, 106, 43, -16, 121, -77, -92, 98, -29, 107, 75, 54, 69, 46, 18, -176, -35, 1, 48, -45, -77, + -60, -173, 67, -5, 111, 59, 108, 78, 25, 35, 406, -70, 130, -198, 117, 172, -105, 147, -226, -247, 377, 207, 243, 303, -2, -247, 326, -284, -384, 7, 360, -50, -312, 44, 423, -59, 116, 43, 594, 39, 127, 295, -37, -150, -284, 42, -39, -271, 9, -159, 109, 405, 4, -241, -72, -223, -120, -33, -95, 57, -300, 325, -170, 547, -137, -393, 23, 22, 193, 85, 105, -403, -329, 240, -342, -474, 137, 98, -108, 519, -419, -579, 218, -394, 39, 58, 12, -379, -232, -494, 171, -47, -27, -73, -221, -96, + -167, -79, -64, 193, -144, 149, 54, 154, 26, 24, -202, -70, 56, -61, -220, 48, -35, -82, -77, 75, -88, 100, -50, 120, -21, 64, -114, -108, -3, 14, -40, 179, -151, -140, -94, 90, 93, -112, 27, -318, 178, 16, 434, 451, 656, 297, 141, 89, 218, -224, 252, -396, 195, -40, -31, -758, -290, -126, 260, -34, 65, 80, 71, -388, 402, -17, 165, 12, 375, -402, 281, -199, -7, 300, -340, -155, -371, -151, -414, 378, 281, 508, -23, 119, -462, 104, -479, 466, 135, -78, 445, 450, 233, -271, -400, -580, + -24, -207, -289, 312, -84, 729, -539, -199, 420, -438, -172, 99, 10, -65, -417, 189, 73, -230, 209, 439, -378, 424, 532, -161, -279, 217, -214, 200, 130, -224, -171, -46, -68, 309, 106, -55, -149, -248, -138, 76, -157, 74, 151, 94, -105, 80, -86, 117, 78, 131, 81, 5, -138, 89, 140, -142, 7, 47, 53, 118, 12, -17, 133, 161, 32, -76, -126, -5, 113, 137, 96, 680, -155, 95, -36, -225, 306, -113, 114, 36, 438, -139, 511, 7, 255, 224, -40, -167, -496, 235, 518, 26, -3, 358, 305, -23, + 57, 614, 386, -113, 134, 403, -101, -450, 11, -327, -51, -208, 19, -622, -185, -228, 11, 128, 131, 602, 667, 350, -461, -274, 375, 524, 111, -482, -79, -116, -501, -318, -379, 461, -173, 62, -471, 683, 505, -59, 209, 1136, -58, -236, -438, -29, 302, 237, -177, 341, 681, -294, 434, -200, 141, -276, -149, -239, -310, -162, 201, -4, -69, 46, 83, 364, -42, 33, -6, -173, -20, -64, 33, 145, -98, -49, -121, -60, 40, 42, -45, -246, -228, -82, -281, -247, -46, 212, 189, 161, 35, -42, 8, 88, 75, -35, + 51, 33, 346, 28, -215, -297, -487, 634, -397, 477, -348, -532, 29, 658, 430, -494, -324, 108, 101, 219, -35, 437, 239, 577, -209, -102, -17, -118, -557, -418, -126, 580, 125, 41, 23, -550, -618, -485, 251, 278, -209, -145, 57, 62, -328, 90, 620, 103, 389, 375, 276, 657, 954, 307, 19, 131, 378, -204, -103, 247, -83, 129, -86, 404, 148, 285, -79, -115, 211, 542, -38, -456, 290, -710, -815, -286, 424, -279, -806, -500, -204, 289, 203, -444, 786, -259, -548, 137, 216, -188, 274, -290, -110, 94, 75, -156, + 140, 19, 248, -144, -295, -180, 50, -73, -59, -32, 3, -32, 202, -43, 34, -90, 93, 157, 33, 150, 50, -256, -109, -8, -213, -261, 121, 168, -138, -278, -296, 111, 49, -23, 191, -121, 257, -1138, 61, 578, -107, -135, 700, -375, -389, -494, -165, -167, -331, 98, 159, 271, 189, -158, -127, -55, -142, 47, 130, 571, -246, -739, 393, 4, -24, -614, 272, 120, -66, 700, -203, 76, -67, 309, 370, -409, -43, -230, -29, 210, -157, 321, -503, -418, -267, -446, -80, 41, 67, -624, -413, 297, 501, -239, -284, 264, + -573, -517, -503, 550, -932, 302, -53, -548, -178, 463, 1179, -159, -329, 389, 904, 325, -208, -220, -45, 248, -20, 115, 536, 35, -205, -382, 313, -450, -310, -225, 155, -186, -329, -207, -202, -4, -244, 81, -190, -18, -65, 227, -177, -138, -359, -108, -67, -121, 334, -251, -323, -23, -283, -258, -120, 36, 249, -36, -112, -51, -171, 115, -341, -32, 345, 163, 225, -92, 83, 108, -87, -137, -194, 64, 164, -72, -636, -1026, -56, 1167, -184, -88, -771, -63, -48, 76, 260, 31, 216, 11, -10, -557, 82, 498, -336, 618, + -260, -43, -550, 349, -272, -184, -634, -868, 444, -426, -413, 147, 91, -191, 45, 484, -143, -472, -288, -603, -71, 166, 416, 80, -120, -107, -246, 139, 432, 67, -268, 485, -467, 46, -806, -242, -157, 990, -628, 199, -204, 126, -115, -116, 20, 400, 123, -739, 808, 242, 289, 100, -322, -251, -92, 98, -18, 157, -437, -460, -74, 217, 491, -309, 416, -107, 162, -334, 188, -541, 599, 21, 67, 192, 270, 21, -375, -186, 101, -361, 96, 162, 150, -217, -132, 354, 65, -371, -54, 306, -119, -455, 507, -144, 195, -92, + -147, -245, 154, 37, 161, 18, 271, 26, 194, -102, 11, 117, -72, -114, -508, -294, 1084, -130, 90, -559, 506, -287, 372, -290, 655, 71, 67, -312, -261, 388, 849, -347, -518, 251, -204, 567, 707, 356, -106, 445, -291, -263, 594, 825, -915, 83, 137, 163, -309, -13, 370, -917, 278, 549, 204, -404, -114, 673, 544, 189, -313, -400, -801, 1152, 207, 596, -85, -235, 128, 351, 11, -10, -930, 153, 878, -148, 841, -496, -227, -343, 196, 800, -249, -14, 716, 884, -285, -630, -570, -488, -232, -201, 503, -607, 336, 389, + -140, 53, 394, -67, -227, 247, 167, 136, 362, 90, -66, 338, 116, 149, 166, -46, 19, -65, 141, -594, -169, 36, -120, 246, -456, -41, 3, 172, -13, 267, 175, -111, 360, 196, -129, 273, 280, 15, -186, 150, 273, 180, -45, -254, -133, 82, 38, 56, 432, 318, 763, -231, 552, -293, -117, 513, -17, 700, -845, 529, 97, 235, -340, 256, 631, 1226, -282, 311, -17, -814, 746, 75, 291, -149, -381, -142, -31, -316, -199, 1039, 72, 399, -298, 736, 3, 356, 150, -433, -93, -268, 7, 132, 871, 442, 35, 101, + -32, -75, 142, 85, 545, 442, 222, -263, 377, 794, -755, 696, 110, 207, -759, -363, -953, -771, -155, 508, 423, -1323, -13, -599, 309, 1312, 657, -852, 459, -354, -442, 720, 362, -379, -213, 633, 517, 280, 807, -225, 492, 431, -523, 717, 193, 834, 250, -86, 489, -59, 122, -600, 437, -297, 224, -224, 94, 265, 663, 166, 400, 93, 122, -231, -59, -90, 46, 325, 278, 494, 177, -73, 71, -131, -77, -521, -96, 113, 150, 423, 379, 343, 428, -1107, -1699, -446, -191, -422, 95, 572, -599, 863, 317, -1251, -958, -195, + 683, 22, 57, -133, -395, -1211, 50, -1018, -840, 409, 327, 295, -142, -397, 915, 544, -388, -795, 604, 301, 143, -376, -926, 348, -435, 135, -789, 956, 24, -389, 94, 237, 792, 490, -202, -44, 278, 270, 306, -185, -1237, -978, 198, -139, 725, -144, -310, -878, 1015, 383, -706, -735, 1041, 970, -9, 710, -95, 19, -295, -186, -559, 684, -127, -163, -298, 278, -879, 409, -256, -172, 626, -20, 100, 150, 574, 286, -233, 418, -125, 507, 204, -584, 145, -300, 275, -245, 7, -391, -196, 204, -379, 155, 131, 159, -339, -250, + -436, -389, 510, -191, 329, 200, -311, -51, -272, 4, -172, 637, 544, 361, 508, -132, -563, -653, -92, 189, 941, 567, -216, -182, -251, -470, -27, 95, 596, 59, -420, -1079, 1702, 43, -1317, -99, -491, 223, 654, 594, -733, -1176, 201, -563, 179, -114, 519, -170, 74, 308, -480, -589, 62, 155, 513, -12, -821, 540, -458, 424, -398, -271, -45, -130, -883, 166, 247, -854, 361, -336, 171, -285, 825, 643, -832, -441, 568, 712, -851, 1124, 73, 905, 657, 1068, -330, -452, 240, -885, 135, 112, 1555, -482, -1461, 2468, -1166, -897, + 1423, 643, -831, 1384, 154, -1127, 1402, 170, 126, -245, 206, 930, -227, -324, -484, 693, -252, -177, -97, -279, -298, -434, 415, -62, -39, -157, -107, 52, -188, -327, 41, -265, -489, -510, 633, -276, 59, 583, -281, -270, 41, 288, 124, 121, 561, -348, 81, -258, -159, -115, 927, 458, -151, 129, -492, 155, -450, -283, 218, -123, -931, 571, 235, -1533, 214, 458, -1148, 525, 306, -404, -113, -21, -280, -94, -163, -514, 16, -257, -54, -127, 252, 916, 769, -707, -76, 964, -166, -181, -983, 114, 326, -161, 842, 2013, -674, -848, + 1436, -95, -770, 895, 592, -464, -692, -858, 265, 462, -380, 1353, 885, -1685, -1615, 944, -758, -985, 1282, 207, 1715, 823, -204, -229, -1231, -961, 2814, 777, -599, -1358, 42, -553, -1210, -188, 1427, 607, 22, 1173, 1029, -323, -1301, 204, 787, -323, -301, 1636, 944, 164, -167, -838, -819, -211, 782, 315, -311, -148, -360, 307, -230, -313, -197, -37, 239, 316, 285, 119, -741, -260, -140, 284, -284, 53, -71, 690, -437, -307, 717, 200, -351, 561, -188, 166, 52, 129, -419, -113, 591, 573, 246, -224, 162, -258, -200, -158, 317, -477, + -91, 383, 1526, 1267, -337, 900, 96, -702, 451, 769, 260, 331, -1007, -207, 121, 202, -146, -880, -313, 315, -211, -95, -740, 1138, 146, -942, 536, 1336, -687, -404, 199, 439, -428, -845, 726, 1214, -94, -481, 161, 342, 558, 777, 55, 1417, -28, -1585, 16, -181, 520, -169, -1288, -39, -554, -548, 779, 404, 446, 553, -1153, -608, -199, -19, 471, 13, -233, 29, -392, -791, 80, 1223, -627, 114, -486, -354, 843, -1035, -7, 451, -361, 166, 133, 254, 302, -548, -648, 1095, -224, -359, 570, -567, 357, 67, -227, 169, 479, -94, + 69, -238, 119, 26, -27, -213, 264, 126, -22, -26, 222, 177, -199, -370, 204, -27, 106, 16, -90, 184, 10, 151, -56, -35, -101, 25, 181, -45, 444, -184, -129, 15, -188, 117, -1319, -1892, -1673, 3367, 3214, 3208, 9057, 3218, -373, 596, -6266, -7633, -2565, -4284, -5937, 763, -330, -994, 6537, 3989, 1666, 10205, 4817, 890, 4651, -1105, -5550, -5316, -5063, -7016, -6867, -1613, -2477, -4043, 4724, 2174, -1702, 6820, 2202, -804, 7716, 7030, 1619, 7297, 7406, -287, 1837, 835, -7130, -8278, -6163, -11650, -11030, -6626, -8845, -6655, 752, 5463, 6201, 13324, 12115, 10681, + 11510, 8487, 4309, 1312, -936, -6494, -7827, -8382, -9446, -8965, -7642, -4943, -3590, -3514, 668, 2123, 4175, 9929, 10313, 7047, 8809, 3719, -1220, -2923, -4521, -6196, -4486, -3004, -2986, -1035, -284, 18, 1583, 2008, 1916, 2935, 1848, 1189, 1479, -889, -819, 241, -2397, -1702, -629, -2321, -1433, -171, -2332, -2467, -1636, -2418, -1587, 1801, 3379, 5372, 7933, 7398, 6334, 5949, 3216, -1001, -4978, -8813, -10460, -9444, -7648, -5782, -2717, 845, 3402, 4766, 5140, 4514, 4014, 3704, 3722, 2555, 1194, 531, -309, -987, -817, -1509, -1576, -1065, -740, -1023, -939, -1263, -1480, -1509, -1284, -1281, -905, -552, + -328, -236 } + }, + { + {-112, 422, 223, 186, 104, -45, -13, -43, -88, -122, -86, -125, -53, 119, 40, -6, 0, 78, 36, -49, -53, -40, -220, 91, 23, 2, -45, 29, 4, -61, 32, 80, 0, -100, -26, -43, -47, 12, 97, -25, 23, -115, 74, -142, 91, 20, 5, 1, 90, -109, -81, -149, 39, 27, 7, 85, -92, 20, -13, 2, -67, 59, 27, -49, 91, -146, 67, -80, 149, 68, 26, 11, -30, -183, 139, -44, -5, 24, 39, 33, 36, 44, -14, 13, -21, 43, -4, 24, -56, 19, -9, 12, 22, 59, -4, -10, + 20, 23, -25, 30, -37, 30, 6, 26, 1, 17, -10, 6, 23, 11, -5, 17, -5, 403, 192, 263, 72, 90, -15, 103, 11, 92, -68, 179, -45, -204, -56, 4, 11, -65, 157, 9, 61, 151, 74, 2, 0, 36, -138, -91, 55, 66, -50, 14, 67, -137, 193, -20, 29, -31, 72, 99, 5, -105, -107, 209, 5, -61, -9, 121, 89, -62, -84, -185, -57, -76, 8, -69, 16, -180, -73, 21, -73, 39, 72, -37, -5, 34, -46, 70, -5, 89, 1, -31, -103, 11, -128, 40, 2, 72, 1, 74, + 96, 82, 3, -53, -4, -20, 106, -29, 14, 67, 71, -5, 40, 14, 36, -15, 44, -17, 65, 15, 12, -6, 6, 6, 85, -272, -88, -62, 47, 53, -186, -84, -37, 44, 99, 31, 136, -112, -162, 46, 6, -29, -111, 359, -19, 95, 22, 11, -8, -56, -136, -108, -33, 91, -76, 188, -64, -18, -154, -184, -16, -117, -65, 250, -137, -38, -133, 48, 7, -49, -139, -27, 1, -159, 19, -86, 127, 83, -73, -39, -40, 38, -7, 100, -52, -66, -68, 228, 206, -71, -198, 27, 62, -7, 59, -83, + 17, -96, 69, 5, 220, 135, 209, -190, 83, 127, 5, 96, 70, 14, 144, -27, -15, 36, 21, -59, 58, -45, -38, -5, 15, -7, 22, -34, 18, -5, 5, 18, 27, 12, 31, 28, -21, -29, 24, 8, -51, -22, 42, -26, -894, -145, -258, -292, 79, -99, -254, -211, 35, -208, 30, 310, -77, 133, 101, 261, 68, -182, 42, 284, -132, 141, -209, -191, 63, 81, 223, 13, -136, 130, -91, 99, -11, 141, -119, -77, -133, 2, 25, -52, 103, -235, 31, 237, 52, -67, 92, -121, -61, -297, -87, -10, + 47, 5, 160, -238, 24, -32, 121, 64, -45, 170, -148, -20, -118, -229, -95, -52, -64, 172, -153, -247, 11, 81, -24, -71, 86, 95, -68, -56, -95, -39, 201, -92, 111, -33, -2, -18, -5, -103, 27, -61, -1, -7, -13, 3, -22, -32, -30, -8, 12, -20, 35, 15, -444, 253, 287, -16, 161, 72, 339, 448, 58, 58, 130, 55, 76, -65, 90, -75, 119, 137, -384, 199, -41, -72, -118, -157, 64, 109, 176, 34, 31, -225, 11, -66, -74, -34, 31, 12, -17, 220, -11, -74, 74, -87, 114, 149, + 168, 86, 19, -94, 187, 59, 26, 19, 25, 13, -107, -153, 138, -142, 133, 120, 89, -20, -100, 89, 118, 260, 121, 97, 61, -256, -78, 30, -41, 109, -221, 10, 73, -208, -19, 68, -50, 25, -121, 45, 16, -53, 95, 55, 4, 103, -47, -47, -11, 20, 42, 157, 26, 53, 37, -3, 34, -28, -30, -44, 28, -25, -21, 16, 16, -21, 53, -33, 37, 33, -16, 50, 14, 21, 25, 2, 5, 59, -5, 825, 249, 61, 161, 412, 166, 497, 122, -110, -36, -42, -48, 135, 213, -99, 46, 149, + -55, -207, 164, -20, 78, -71, -104, 169, 39, -16, -48, -188, -93, 102, 26, -65, -33, 28, 71, 189, 60, -175, -40, 11, -55, 63, 90, -176, -213, -12, 53, -23, 164, -303, -64, -138, -170, -19, -13, 45, 162, -2, 25, 52, -26, 216, 138, -178, -156, 118, 262, -23, -122, 258, 137, 60, -114, -124, 128, 6, 97, -59, -188, -104, -128, -81, 74, -105, 15, 44, -37, 43, 32, 37, 22, -68, 38, -22, -35, -17, 51, 39, 7, -59, 52, -24, 90, -15, 13, -86, -110, 36, -103, -21, -16, -59, + -28, 12, -92, -39, -9, 9, -19, 64, 9, -26, 405, 197, 365, -123, 3, -93, 367, -378, -54, 97, -73, -75, 123, -43, -117, 323, 182, 37, 545, -149, -36, -115, 4, 90, -141, -18, -73, 208, -176, 47, 12, -55, 19, 122, 83, -165, -289, 7, 59, 239, 280, 279, 25, -161, 201, -487, -80, -191, -284, 198, -65, -92, 154, -56, -83, 425, 5, -125, 148, 11, 112, 83, 55, 257, -154, -95, 15, -221, -2, 42, -56, 76, 127, 271, -102, 90, 234, 142, 69, 44, -81, -171, 87, 130, -29, 13, + -27, -22, -98, 19, -30, 17, -91, -46, 0, -16, 84, 37, 0, -117, -53, 58, -69, -1, 45, 46, -80, 74, 57, 19, 75, 68, -136, -24, -53, 37, 73, 90, -19, -50, 11, -27, -631, -949, -160, 47, -16, 26, -44, -191, -107, -152, -41, 154, 184, -167, -246, 211, 44, -136, 11, -23, -150, -126, 350, 178, -188, 96, 40, 150, -182, 203, -203, 140, 91, -43, -95, 90, -378, -188, 232, 374, 208, -262, 6, -185, 249, 51, 65, 18, -205, 100, 304, 34, 230, 163, 106, 176, 373, -103, -375, 182, + 1, -89, 19, 323, -131, -224, 110, -59, -38, -85, -50, -101, -175, -88, 217, -295, -185, -109, -211, -206, -12, 128, -194, -3, -71, -82, -174, -110, -200, -10, -154, -12, -3, 142, 101, -71, -76, -102, -30, -72, -68, 86, -136, 52, 13, -87, 11, -57, 35, -29, -110, -137, 1, 37, 59, -25, 26, 44, 2, -71, -7, -91, 12, 43, 42, -365, -238, 62, 59, 487, -425, -291, -164, -80, -53, 158, 152, -225, 232, -54, 105, -162, 346, -67, -130, 223, 161, 130, -235, -221, 292, -153, 86, 71, -106, 248, + 76, 0, 55, 182, 234, 72, -208, 48, -297, 177, 78, -333, 236, 55, -173, 305, 97, -83, 178, -28, 337, -77, -84, -71, -43, 437, 93, 7, 120, -367, -229, -250, 28, 232, 32, 289, -372, -154, -236, -220, 545, -56, 195, 139, -116, -27, -75, 41, 30, 149, 92, 298, -160, 25, -50, 65, -1, -6, 0, -64, -280, 104, 67, 41, -73, -27, -35, -157, -9, -57, -101, 57, -85, 36, 51, 39, 66, -110, -58, -74, -66, 39, 79, 45, -25, -15, -18, -35, 115, -40, 82, 50, -30, 33, -21, -1, + 30, 30, -493, 154, -211, 120, -148, 398, 67, -279, 44, -285, 231, 440, -375, 248, 92, -11, 182, 469, -179, -1, 144, -513, 30, 233, -142, 167, 182, -94, 460, -229, -415, -179, 50, 11, -85, -179, 126, 116, 1, -293, -68, -74, 196, -128, 772, -97, 111, -36, -32, -374, 39, 278, 225, 752, -80, -73, -155, -30, -211, -16, 302, -160, -30, 55, 72, 297, 242, 68, 583, -110, -539, -540, -380, -78, 171, -53, -141, 257, -15, 228, -140, -26, 186, 157, -56, -55, 20, 48, -59, -126, -180, -61, -76, -23, + -128, 97, -38, 29, -65, -93, 125, 56, -63, -17, -51, -55, 55, -34, -61, -122, 98, 39, -52, -92, -123, -23, -84, -85, 105, -61, 22, 5, -44, 45, 21, -16, -22, -27, 877, -632, -479, -153, -303, -347, 426, 173, 85, -134, -85, 516, -150, -217, -618, -89, -15, 292, 108, -125, 39, 256, 116, 160, 396, 497, 138, -185, 128, -298, 205, 168, -106, 10, -230, 93, 7, -448, 437, -39, -203, 270, -414, -96, 456, 260, -6, 17, -574, 202, 321, 183, 107, -31, -423, -1244, -99, 254, 350, -32, -365, 614, + -285, 280, 465, 383, 71, 464, 53, 165, 98, 281, 55, 89, 591, -199, -129, 500, 261, 135, -207, 50, 407, -45, 325, 74, 71, 204, -111, -11, 21, -22, -92, 159, 74, -223, 121, 82, 117, 57, -65, -1, -72, -83, 98, 124, 51, 75, -68, -66, -45, -81, -106, -158, 21, -102, 73, -39, 41, -147, -97, -33, -50, -46, -69, 16, 136, 143, 51, 8, -85, 112, 438, 417, -110, -213, -42, -126, 479, 312, -838, -92, 67, -393, 154, -573, 434, 105, -69, 238, 116, -121, -194, -141, 613, 25, -7, 136, + -86, 246, 722, 295, -108, -128, -109, 420, 146, 425, 291, 212, 119, -185, -207, 190, -434, 74, -232, -191, 11, 297, 38, 24, 103, -93, 493, 645, 734, -3, 333, -438, 165, 254, -205, 375, -304, -599, 75, -314, -52, 29, -323, 81, 432, -265, -263, 220, 400, -18, -153, 372, 28, 84, -260, -52, -22, 307, -160, 26, -77, 68, -11, 60, 72, 56, -5, 31, 61, 87, -76, -138, -31, -19, -135, -156, -18, -71, 106, -105, 79, 151, -17, -244, -34, 50, -95, -114, 8, 71, 374, 130, 108, -9, -1, -30, + 102, -24, 109, 324, 282, -35, -28, -52, 3, -522, 950, 59, 247, 725, -268, 74, -138, 191, -209, 209, -511, -607, -18, -360, -27, -34, -40, -103, 39, -169, 152, -482, -192, -650, -32, 149, 312, 701, 390, 121, 90, 201, 156, 118, 284, 297, -94, -594, -588, -404, -241, 59, 200, -218, -345, -603, 18, -230, 551, -245, 139, -418, -201, -73, -171, -808, -840, 231, 87, 22, 432, 246, 347, 279, -523, -114, 985, -182, -371, 145, -215, 101, -606, 247, -278, 42, -39, 400, 25, 161, -344, 66, -194, -87, -236, -179, + 125, 140, -314, -105, 24, 61, 80, 43, -121, 139, 59, 49, -15, -7, 45, 142, -149, 143, -36, -3, -52, 92, -87, -49, 126, -232, -3, 48, -141, -46, -326, 239, 280, -16, 68, 77, 97, -143, 158, 103, 124, -103, 68, 98, 144, 564, 429, 56, 456, -85, -186, 250, -347, -680, -1016, 85, 22, 393, 288, -379, -193, -994, -66, -463, 109, -233, -110, -191, -73, -77, -344, -155, -401, 321, -80, 274, 712, -376, 205, -58, -176, 183, -380, -647, 311, 152, 310, 194, -1357, -616, 181, -452, -38, -386, 568, 684, + -33, 756, 107, 343, -100, -25, -422, 268, 546, 118, 909, 22, 125, -267, -400, 538, 854, 298, 166, 84, 323, 28, 62, -800, -587, -61, 42, 106, 601, 647, -119, 42, -222, 135, -414, 11, -438, -371, 191, -11, 48, -246, 158, 193, 130, 196, 231, 20, -132, 102, -180, -44, -111, -263, -76, -145, -118, 219, 120, -78, -174, -260, -171, 175, -173, -17, 13, 120, -246, -196, 86, 305, 194, 78, -1, -184, -24, -112, -214, 364, -532, -262, -993, -1238, -918, -419, 281, -8, -218, -452, 1, 818, 400, -715, -118, -147, + -506, -90, 37, 345, 253, -533, 383, -301, 163, -280, 85, -408, -153, 203, -738, -140, -278, 243, -184, -681, 802, 774, 11, -312, 437, -1045, -328, 312, -352, -221, -27, -337, 67, -86, -701, 302, -89, -214, -240, -184, -44, -191, -297, 582, -277, -273, 276, -6, 954, -189, -591, 340, -309, -261, -462, 322, 589, -1147, 90, 972, -158, -59, -384, 663, -47, -358, -48, -336, -271, 480, -288, -22, -160, -198, -336, 144, 112, 177, -40, -269, -186, 12, 47, -410, -119, -263, 411, -135, 29, 61, 51, 46, -334, 228, 11, -125, + 299, 49, 391, -67, 452, 107, 182, 224, -293, -190, 143, -238, -188, 74, 1, -167, -397, 197, -783, 1565, 1116, -21, -298, 249, -939, 16, 1168, -206, -406, 20, 1325, -189, 291, -281, -599, -484, -122, -221, 244, 339, 19, -497, -697, -641, -103, -140, -345, 325, 263, -279, -341, -372, 211, 75, 260, 663, -3, -563, 385, 153, 131, 43, -9, -270, 492, 254, -194, -231, -153, -639, 179, 474, 145, -446, 528, 389, 220, 62, -274, 148, -912, 147, -54, 820, -290, -400, 176, -207, -14, -586, -104, -154, 797, -511, -959, -623, + -1247, 250, -251, -78, -664, -421, -1101, -484, -382, -51, 274, -351, -58, -62, -52, -92, 241, -408, 184, -156, -318, 57, -89, 304, 158, 13, -157, 391, 363, 224, -134, -184, -184, -167, 407, 665, 82, 612, 669, 230, 17, -584, -58, 120, 93, -46, -157, -492, -5, 349, 61, -367, -89, -272, 1493, 52, 253, -255, -481, -663, -211, 178, 442, 354, -309, -9, -651, -247, 241, -560, -291, -217, 809, 412, 448, 410, -460, 78, 175, 182, -39, 534, -114, 231, 425, 153, 122, 347, 493, -295, -568, 376, -57, -6, -601, -572, + 135, -290, -215, 488, -506, 648, 428, -299, 350, -392, -383, -477, 681, -483, 217, 198, -771, 65, 94, -621, -1051, -951, 690, -718, -10, -646, -144, -465, -35, 286, 183, -473, 484, 550, 1170, 297, -784, 268, -482, 253, -689, 362, -295, 44, -141, 274, -85, -289, -662, -668, 73, 55, 418, -306, -29, 644, 185, 444, 137, -127, -51, -164, -438, 148, -528, -320, 112, 428, -577, 312, 59, 404, -141, 222, 415, 450, 459, -219, 223, 351, 385, 67, 229, 112, -181, 708, 328, 352, -300, 27, -654, -10, 110, 128, -577, -600, + -951, 661, 68, 228, -157, 351, -261, -255, 196, 504, 118, 332, 1024, -147, -618, -1311, -187, -506, -250, -311, -610, -428, -910, -104, -14, 320, 944, -784, -303, -127, 309, 337, 936, 130, -1069, -243, 220, 839, 220, -1293, -519, 1175, 107, 1172, -687, 41, 92, 711, -65, 647, 970, 141, 823, 581, 141, 1143, 975, 320, 1519, 1170, 733, -1226, -78, 487, 282, -10, -890, -1062, -550, -1523, -239, -1131, -431, -287, -1632, -1546, -1076, 538, 20, -353, -16, -112, -29, -296, -156, 386, 156, 72, -47, 67, -69, 242, -34, -402, 716, 122, + 177, -204, 41, -18, 379, -12, 225, -120, -381, 164, 309, 793, 705, 55, 2, 510, 259, 594, 496, -145, 572, 324, 125, 364, 240, -189, -79, -438, 288, -389, -165, 224, -846, 904, -392, 592, 287, -756, 109, 473, -301, -790, 521, -212, 445, -264, 111, 186, -492, -55, -219, -8, -802, -625, 772, 38, 310, -609, 630, 570, -431, 364, -623, -130, -351, 453, 1099, -16, 1335, -335, -69, 68, 132, -87, -761, 1320, 853, -97, 715, 569, 742, -278, -23, -1330, 598, 635, -179, -222, 830, 448, 435, 1046, 168, -527, -650, 202, + -208, -760, 630, -882, 32, 206, -639, -981, -679, -244, 64, 807, 529, 264, -1523, -418, 907, -64, -337, 278, -828, -503, 683, 5, 3, -283, -3, 429, -137, -301, 231, -98, -591, -308, 50, -35, -43, 19, -264, 10, -409, -531, 65, -41, -896, -90, -545, -301, -106, 144, 155, 496, -456, -296, 90, 483, -504, -522, 740, -108, -50, -135, -12, -306, 126, 359, 186, 313, 15, 122, 0, 51, -1123, 638, 996, -22, 1148, 344, -993, -616, -76, -349, -604, 638, 752, -75, 524, 700, -553, 493, 845, -54, -1135, 444, -30, -228, + 316, 856, -272, -435, 213, -379, -490, -37, 757, 641, -1068, 338, 462, -722, -457, 866, -233, -1267, -158, 1060, -343, -1829, 1920, -548, -217, -947, 1242, 401, -422, 898, -524, -398, -226, 2300, 774, -966, -847, 881, -199, 1283, 29, 963, -1322, 1059, 1836, 171, -191, -325, -313, -733, 1734, 1160, -1027, 288, -1080, -188, 124, 224, 160, 318, 38, -1192, 564, 70, -116, -28, 554, -240, 129, -176, 291, -115, 81, -193, 365, 12, -64, 201, 295, -655, 87, 409, 165, -472, 260, 737, -715, -1126, 229, 137, 448, 428, -50, -1015, -334, 275, + 149, 283, -144, 40, -31, -341, 305, -268, 825, 1887, 365, -730, -174, -179, 331, 284, -590, -841, 225, -712, 142, -443, -510, -111, 86, 241, -568, -230, -225, -707, 593, -223, 38, -105, -472, 187, 132, 16, -102, 5, -17, -279, -600, 256, -298, 260, 183, -600, -486, -56, -70, -69, -129, 488, -338, 49, -637, 543, -624, -331, 310, 8, -500, 397, -672, 51, 202, -18, 73, 321, 152, -693, 350, 49, -418, 594, 234, -658, -72, -525, -70, 213, 175, -670, 853, -451, -248, 475, 315, 78, 317, -26, 443, -197, 91, -55, + 215, 168, -127, -154, 171, -212, 23, 37, 29, -125, 21, -116, -192, -104, -209, -10, 158, 275, 102, 34, 145, 180, -249, 385, 101, -11, -252, -142, 121, 305, -59, -5, -149, 51, 44, -124, -170, -149, -396, -1134, -1414, -520, 4274, 3420, 2270, 4138, -1642, -3916, -1254, -6330, -2465, 179, -1482, 2904, 3970, 649, 2525, 4332, 98, 1195, -278, -5088, -4206, -3180, -3155, -1555, 2417, 1298, 1872, 5313, 2257, 331, 3184, 1478, -1818, 621, -1524, -5155, -1236, -2693, -5309, -882, 128, -1297, 3602, 4153, 1644, 4883, 4946, 925, 1910, 859, -3115, -3496, -3268, -5886, + -5197, -1980, -2410, 513, 3160, 4320, 3575, 5519, 4099, 2200, 311, -685, -3176, -3875, -2857, -3405, -2836, -121, -154, 651, 3075, 1483, 1882, 2944, -54, -910, -478, -1837, -1045, -613, -672, 759, 1560, 607, 867, 983, -705, -250, -297, -1873, 266, 790, -2028, -18, -180, -2049, 773, 354, -2321, 1478, 2200, 523, 4423, 2754, -46, 2356, 432, -2971, -2466, -3870, -5494, -4123, -2680, -1437, 1888, 4084, 4787, 5960, 5844, 4142, 925, -427, -2957, -5403, -5251, -4662, -3906, -829, 436, 692, 2679, 2827, 1958, 1993, 1534, 663, 901, 636, -136, -298, -712, -1391, -1474, -1400, -1273, -834, + -4, 353, 672, 941, 885, 713, 267 }, + {-155, 480, 184, 117, 38, -102, 1, 92, 174, 2, 17, 10, -63, 17, 59, -12, 58, 89, 118, 50, 49, 62, 55, -109, 110, 207, -98, 59, 33, 58, 11, 122, -80, -29, -72, 70, 205, -35, 100, -3, -46, -170, 63, -88, 78, 39, 87, -10, -52, 27, -36, 117, 15, -94, 119, -27, 93, 71, -4, 68, 135, -38, -47, -39, 67, -56, -72, 83, 1, 56, -89, 132, 8, -38, -15, -15, 53, -50, -79, 46, 71, 67, -63, -95, 38, -4, -11, -37, -34, 46, -12, -8, -29, -35, 7, -26, + 11, 6, 35, 23, -10, 12, 20, -22, -9, 0, -10, -17, 12, 33, 19, 24, 0, 373, 293, 147, 22, -56, 170, -100, -106, -25, -186, 112, 8, -78, 44, 108, 186, -87, 108, 241, -69, 1, 56, 125, -31, 136, 97, 138, 32, 105, -107, 184, -22, 177, 89, -20, 23, -30, -4, -65, -30, -80, -58, 62, -16, -173, -38, 18, -4, -97, -99, -51, -42, 134, -53, -149, -197, -219, -75, -97, -7, 33, 106, -143, -64, 16, -14, -65, 16, -151, -14, -178, 95, -97, -46, 122, -17, 83, 25, 30, + 96, 23, -76, -36, 8, -75, 40, 75, 37, -59, 44, 62, 13, 33, -18, -35, -23, -35, 25, -5, 23, -30, -21, 23, 198, -429, -115, -217, -41, 0, 236, -115, -385, -135, -10, 147, 46, -143, -334, -86, 91, -37, 188, 8, 82, -18, -148, -161, 97, 119, 14, 39, -6, 73, 17, -198, 11, 280, 38, -69, -26, -74, 17, -63, -121, 188, -58, -77, 170, -88, -151, 8, 1, 6, -217, 177, -67, -3, 163, 149, -233, -58, 45, 57, -21, 128, 35, 64, 89, 14, 71, 108, 23, 1, 100, -265, + -59, 8, 136, 76, -33, -26, 99, 93, -106, -14, -38, 4, 59, 75, 15, 93, -9, -65, -31, 8, 7, 10, -24, 65, -13, 24, -9, -28, 19, 0, -12, -23, 6, -21, -3, -39, -31, 10, -6, -30, -62, -21, 14, 54, -852, -338, -170, -244, 78, -85, -80, -12, 110, -99, -115, -171, 36, 151, 36, -118, -142, 42, 129, 116, -162, -243, 20, -228, 123, -3, 86, -8, 83, -90, -35, 235, -284, 130, 69, 31, -99, 62, 143, 36, -172, 34, -108, 84, -236, -10, -214, 165, -15, -44, -59, 90, + -360, 166, -102, -220, 90, 175, 202, 116, 45, -15, 26, -19, 131, -75, 39, 100, 252, 39, 7, -180, 117, -90, 23, 4, 135, -119, 9, 121, -8, -146, -197, 164, 16, 30, 86, -18, 43, 34, 1, 29, -11, 4, 47, 40, 46, -73, 31, -55, -21, -47, 45, -53, -486, 238, 378, 74, 30, 211, 71, 65, 115, 16, 120, 122, -98, -18, 16, -119, -74, -1, 58, -70, 394, 210, -58, 29, 125, 158, 179, -75, 126, 148, 8, 43, 42, 84, 60, 37, 83, 80, -171, -132, -263, 29, -94, -131, + 135, -38, 85, -325, 358, -26, -171, -31, 284, 206, -46, 8, 137, -65, 59, -104, -224, 27, 20, -179, -72, -177, 31, 66, 40, -86, -157, -238, -285, -204, -80, 17, -70, 28, 94, 84, -119, -12, -129, 47, -45, 37, -2, -52, 37, 43, -38, -18, -50, 67, -79, 17, 25, 24, -8, -18, 17, 36, 35, 29, 22, 30, 9, 57, -13, 63, -40, 20, -12, -16, -45, -35, -30, -41, 16, -33, -5, 30, 10, 895, 237, 66, -33, 539, 63, 256, 53, 170, 281, 99, -156, 166, 193, 30, -14, 41, + 354, 24, -121, -215, -63, -7, -246, 41, 73, 141, 60, 99, 271, -85, -43, 166, -26, -74, -14, -242, 157, 102, 5, 156, -78, -213, -459, -168, 169, 187, 6, 131, -130, -141, 373, -216, 169, -191, 39, -278, -291, 315, -121, -114, 435, 32, -49, -205, 159, 251, 12, -136, -257, -41, 186, -60, 63, -114, 91, -44, 29, 198, -215, 66, -62, 13, 24, -26, 229, 71, 33, -69, 1, -55, 96, -48, 76, 76, -82, -1, -14, -54, 108, 17, 50, 3, -40, 21, -1, 1, 30, 47, 16, 62, 18, -7, + 34, 22, -26, 6, -12, 12, 55, 61, 8, -8, 454, 153, 376, -230, 75, 213, -289, -97, -113, 32, -146, -87, 223, -66, -43, -14, 279, -101, -130, 301, 48, -210, 89, -45, 47, 115, -172, -38, -129, -229, 27, 8, 43, -225, -237, 94, -21, 91, -10, 132, 37, -4, -152, -145, 40, 148, 70, -41, 428, 104, 72, 197, 71, 147, 147, 98, 58, 76, -63, -32, 31, -180, 47, -291, 79, -192, 151, -107, 82, -36, -144, 50, -39, 155, -135, 412, 344, 161, -297, 95, 130, -124, 53, 38, 199, 193, + 79, -3, -29, -39, -118, 180, -15, -20, -1, -49, 18, 61, -51, 94, -37, -75, -82, -1, 53, 55, -16, -18, -65, -26, 31, -74, 82, 89, -57, 17, -72, -22, 10, 30, -56, 94, -565, -1087, -46, -218, 189, -56, -301, -29, -244, -269, -230, 356, 185, -238, -136, 271, 157, 242, -166, 156, -147, -149, -46, -65, -460, 126, 263, 113, -273, -63, 49, 70, -243, -54, -350, 77, -166, -15, -122, 67, 375, -40, -69, 188, 275, -166, 75, 104, -230, 124, 116, -271, 43, 176, -41, -285, -179, -184, 260, 101, + 255, -150, -292, 70, 147, -62, -209, 140, 206, 195, -240, -125, -49, 390, -81, 233, 70, -274, -222, -42, 154, -259, -14, -48, 144, -31, 323, 41, -72, -95, -80, -92, -58, -30, 32, 0, -36, -117, -9, -114, -48, 48, -38, 20, -31, -86, 55, -13, 140, -26, -109, -77, 47, -20, 8, -30, -69, 26, 80, -67, -19, 107, 52, -63, 87, -556, 0, 15, 321, 78, -128, 190, -91, 83, -301, -89, -191, -106, -381, -145, -227, 526, 302, 320, -374, -320, -153, 179, -17, -4, 11, 107, -25, 152, -217, -187, + -3, -53, -268, -270, -216, -157, -116, -108, -340, 156, 418, -91, 196, 268, -196, 232, 148, 55, 382, -19, 320, 118, 42, -300, 121, 147, -77, 438, 351, 67, -129, -219, 128, -216, 89, -5, 261, -1, -384, 27, -150, -62, -288, 338, 178, 122, 83, 377, -106, -397, -60, 248, 9, -205, -50, 27, -85, 47, 122, -2, 7, -27, 42, -8, 147, 43, 46, -35, 59, 75, 134, -111, 75, 74, 2, 22, 135, 72, 37, -82, 115, -35, -62, -77, -2, -198, 127, 61, 26, -95, 113, 108, 198, 120, 36, 32, + 13, 160, -503, 227, 166, 215, -235, -418, 121, 125, 21, -352, 336, 96, -180, -310, 140, -138, 539, 628, 92, -101, -235, 356, -406, -146, 500, 124, -98, -271, -250, -141, 8, -331, 74, 352, -46, 132, -259, -237, -81, -196, 512, -189, 230, 189, 207, 54, 101, -356, -357, -342, -77, 256, 590, -239, -428, -99, -198, 109, 91, 328, -202, -5, -267, -51, 472, -61, -259, 338, 110, 54, 177, -380, 57, -129, 36, 173, 415, 116, -485, 176, 41, -76, -203, 9, -53, -27, -14, 68, 110, 133, 43, 9, -79, 25, + -26, 96, -166, 61, 62, -4, 13, 27, -126, -4, -84, 135, 124, 31, 149, -60, 19, 115, -26, 91, 21, 84, 27, -191, -14, -69, -13, 25, 9, -68, 4, -80, -2, -39, 817, -354, -280, -84, 171, -478, 190, -128, 240, -214, -99, 298, 219, 85, -151, -53, 405, 401, -85, 350, -103, 514, -242, -125, 90, 538, 391, 131, -290, -20, -599, -90, 91, 275, 318, 567, 147, -10, -29, -217, -375, -27, -325, 234, 71, 362, 199, -124, 356, -427, 191, -95, 29, -74, 454, 267, 128, 81, -829, -132, 488, 247, + 28, -16, 23, 395, 165, -626, -207, -242, 56, 13, -625, 24, -584, -386, -53, -251, -273, 363, 457, -50, -225, -25, 138, -57, 118, 187, -18, 208, 303, -98, -172, 28, -75, 92, 58, -49, -45, 3, 2, 86, -12, -106, 19, 104, 36, 92, -83, 140, -2, -52, 32, -89, 33, -178, -116, -139, 70, 6, -134, -27, 111, 74, 96, -66, 52, 1, -24, -171, -90, -181, 296, 577, -146, -235, 32, 223, 127, -353, -23, -286, -17, -390, -44, -335, 14, 347, 26, 766, -323, -154, -275, 313, 508, -408, -138, -632, + 117, -4, 171, 157, -356, -209, 275, -103, -80, -343, 693, -91, -746, 211, -198, -219, 266, 211, -217, -235, -74, -428, -260, 146, 94, 152, -133, -308, -363, -359, 296, -528, 6, 131, -166, 17, -6, -68, -424, -74, -174, 272, 341, -60, 531, -26, -8, -160, -36, 772, 72, -343, -141, 303, 220, -422, 6, 65, -291, 245, 54, 274, 39, 45, 39, 25, 115, 167, 12, 86, 258, 25, -96, 50, 123, -95, -31, 19, -125, 118, 102, 136, 23, -138, 30, -44, 20, -25, -29, 17, -83, 118, -62, -74, -98, 234, + -1, -244, 179, 147, 58, -12, 136, 110, -281, -371, 939, -240, -84, 85, 399, 290, -613, -248, -582, 129, 31, -178, -641, 28, -300, 134, 139, 324, 14, 236, 1104, 242, 274, -172, -64, 484, -44, 39, 126, 33, -73, -251, 443, -472, 194, -702, -216, -328, -436, -372, -3, -767, -264, 106, 437, 254, -758, 429, 282, 313, -482, 353, -228, -549, -190, -546, 264, 653, 162, -62, -429, 346, -457, 682, -129, -73, -413, -449, 65, 533, 174, -367, -150, 89, -77, -147, 349, 180, -164, 451, -37, -641, 802, 427, 330, 151, + -109, -40, -67, 239, 54, 35, 528, 206, 9, 25, 75, 276, -221, 155, 15, 52, 50, 177, 87, 11, 298, 227, 20, -105, -106, -40, 243, 122, 136, 131, 162, -202, 201, -54, -54, 186, 292, -43, -82, -3, 278, 321, 122, 197, 151, 516, 96, -330, 149, -95, 154, 566, -797, -360, -641, 365, -129, 64, -212, 463, -454, -457, -209, -106, -327, -566, -274, 107, 372, -520, 344, -195, 41, 677, 517, -7, 272, 132, -108, -80, -917, 128, -93, 92, 179, -71, 25, 929, -833, 80, 1005, 132, 277, -393, -108, 526, + 922, 48, 817, -318, 739, -259, 547, 556, -137, 1082, -180, -45, -321, -488, -518, -237, -311, -752, -351, -159, 279, 276, 35, -386, -65, -109, 485, 151, -253, 416, 93, -51, -59, -302, -46, -120, 126, -305, -146, -213, -212, 386, 149, -128, 116, -98, 74, -232, 346, 16, 97, -9, -233, 214, -28, 78, 246, 170, 105, 19, -363, 173, -139, -17, 312, -7, 116, 74, 149, 209, -76, -170, -112, -137, 65, 188, 322, 185, -376, -49, -411, -348, -1192, -843, -600, -56, 807, -528, -69, -405, -592, -485, -604, -626, -250, -739, + -809, -699, 198, -482, -255, -602, 575, 946, 80, -106, -334, 80, -60, -22, -77, 299, 61, 646, -562, 51, -478, 980, 239, -571, 450, -409, 365, -550, 323, 50, -332, 299, -524, -173, 165, 537, 233, 951, -214, -610, 57, -173, 72, -403, -352, -651, 82, -692, -140, -107, -609, 408, 514, -298, -33, -894, 1029, 1251, 200, -491, 170, 1101, -516, -232, -589, -341, -646, 267, -31, -362, 281, -362, 151, -225, -105, 151, 78, -1, -242, -46, 212, 125, -403, 320, -281, 149, 184, -125, -238, 129, -192, 159, 113, -249, 91, -32, + 96, -148, -407, 113, 70, -165, 104, -148, 288, -3, 117, 35, 375, 52, -506, 286, 186, 88, -961, 1758, 666, -145, -530, -148, -563, 605, 1527, 33, -1013, -464, 551, 205, -202, 728, -141, 91, 418, -44, -420, -137, 344, -440, -400, -162, 143, 22, -76, -185, 324, 34, 479, 378, -494, 242, 589, 329, -456, 176, 98, 397, 10, 138, 107, 164, 831, 786, 487, 1066, -525, 549, -633, 404, -7, 369, 462, 149, 120, 561, 261, -149, 356, 2, 478, -507, -290, 44, 1153, -795, 77, -1000, -119, 116, 394, -487, -97, -502, + 130, 619, -380, -895, -191, -88, -243, 217, 155, -253, 89, -216, -212, 201, -33, -120, -404, 219, -18, -256, -206, 191, 544, 53, -157, -72, 198, 489, 97, 43, 407, -12, 110, -38, -81, -18, 147, 231, 138, -65, -87, 206, 146, -306, 290, 79, 565, -141, 143, 341, -235, -144, 192, -322, 1472, 121, 107, -324, -206, 244, 225, 135, 568, 237, -240, 300, 607, -25, 665, -66, 323, -678, 1227, -184, -144, 204, -928, -240, -447, 653, 359, 369, -433, 156, 156, -578, 160, 492, 420, 143, -143, 58, -278, 931, 141, 420, + 344, 501, -830, -68, -250, 153, -308, -366, 688, -658, 504, -418, 530, -122, -555, -55, -834, 514, 479, 577, -1725, 495, 312, -533, -355, -496, 890, -1274, 764, 1786, 35, -857, -342, 517, 1051, 288, -358, -773, -1293, -107, -7, 512, -386, -177, -296, 884, 58, -28, -253, 183, 52, -2, 36, -11, 168, 564, 692, 363, -101, -57, 277, 69, -168, 81, -272, -166, -332, -487, -1020, -405, 161, 50, 578, -409, -287, 737, 278, -191, -299, 240, -70, -280, 734, 87, -29, -228, 27, -290, -386, 243, -831, 116, -496, 750, 69, 198, + -417, 328, -106, -316, 158, -325, -171, -277, -662, -400, 512, 403, 333, 341, -803, -247, 176, -252, 494, 328, 44, 279, 828, -254, -821, 1579, -681, -899, 998, -487, -267, 210, 519, -603, -173, 51, -377, 2062, -5, -348, -118, 9, 529, -1023, -758, -442, -392, -44, -859, -11, -63, 312, 1324, 1314, -498, 1014, -988, -902, 556, 819, -268, 221, 122, 560, 721, -7, 64, 918, -810, -1651, -165, -662, 383, 766, -58, -527, 1072, 305, 231, -292, -845, -492, 113, -382, 516, -52, -290, -51, -331, -368, 514, -166, 220, -369, 547, -52, + -10, 331, 526, -62, -83, -351, 67, -303, -247, -215, -63, -523, 24, -242, -63, -524, 176, 592, 253, -372, -732, -62, -42, 403, -996, -216, 268, -214, 504, -13, 317, 77, -598, 647, 6, 396, -409, -622, 577, -616, 189, -140, 543, 6, 117, -326, 101, -229, -810, -633, 266, -46, -25, 136, 595, -265, -188, -500, 212, 190, -68, -95, -1356, 67, 373, -477, 329, -743, -148, 55, 461, 598, 64, -277, 180, 1073, 923, 932, -51, -78, 189, 117, -435, 282, 1160, -828, -282, -235, -8, 51, 141, -614, -956, -349, -68, 1910, + 956, 653, -101, -161, -498, 835, 108, 537, -209, -251, -398, -334, -1422, -618, -757, 590, -68, -269, -58, -572, -284, 618, 907, -138, 798, 443, 326, 54, 370, 491, 394, -99, -40, 11, 540, -435, -580, -270, 289, -49, -413, -256, -413, 239, -105, 508, 991, 192, 605, 809, 378, 502, 237, 161, 208, -366, 515, -434, -308, 119, 31, -310, 146, 290, 519, 220, -627, 338, 242, 67, 267, -162, -1304, 733, 637, -33, 1048, 474, -720, -705, 304, -289, -643, 43, 60, 288, -163, 376, -97, 356, 448, -416, -1691, 907, -259, -527, + 380, 600, 17, -1130, -152, -44, -1169, -725, 609, -176, -477, -399, 260, -1133, -809, 1535, -134, -888, 345, 835, 354, -1259, 1798, 731, -1115, 620, 811, 132, -756, 783, 868, 532, -696, 657, 1217, 68, 1229, 1527, -820, -484, -572, 1444, 915, -624, 348, -377, -921, 792, 1796, 262, -545, -450, 1078, -99, -1214, -864, 217, -43, 999, -177, 771, -1501, -233, 62, 255, -311, 316, -13, 29, 174, 40, -391, 117, -185, 240, 96, -549, 480, 154, -455, -328, 88, -397, 78, 360, 399, 55, -373, -123, 124, -513, 299, 378, 124, 30, 379, + 137, -170, 184, -137, 31, -262, 164, 607, 1060, 1699, 687, -707, -258, -593, 364, -289, 469, 307, -780, 396, -795, -269, 8, -294, 46, 415, 327, 22, -633, 142, 512, -194, 78, -231, -740, 750, -446, 519, -762, -451, -106, -628, -185, 637, -620, 841, 57, 686, 273, -342, -918, 755, 471, 314, 196, 778, -574, -294, -331, 243, 295, -76, -724, -33, -98, -733, -288, 116, 201, 579, -66, -515, 690, -132, -116, 827, 396, -678, 223, -415, 267, -217, 327, -585, 331, -202, 653, 112, 253, -219, 2, -475, 194, 32, 26, -12, + 141, -191, -173, -22, 82, -52, 130, -241, -41, 187, -40, -8, -34, 6, 17, -381, 78, 308, 12, -43, -76, -36, -278, 22, -64, -34, -141, -233, -46, 231, -125, -69, 115, 50, 183, -173, -60, -25, -131, -1259, -1483, -795, 4401, 3869, 2342, 5135, -1094, -3859, -1357, -7277, -3815, -76, -1883, 2603, 4772, 670, 2804, 5467, 918, 1908, 183, -5611, -4688, -4138, -4558, -2762, 2263, 959, 2265, 5900, 3554, 920, 4376, 1998, -2684, 1458, -1959, -5137, -634, -3176, -5843, -2636, -607, -3063, 3418, 3681, 1742, 5860, 6619, 2514, 3271, 3089, -3442, -2241, -4401, -6872, + -6322, -4051, -4070, -1166, 2641, 3421, 4570, 6443, 5785, 3384, 2468, 447, -2684, -3899, -2861, -3713, -4591, -1552, -1735, -840, 2862, 1987, 2115, 4457, 1135, -193, 733, -1227, -1926, -1068, -1946, -580, 1244, 479, 685, 1579, -373, 332, 856, -1448, -148, 1830, -1730, 156, 289, -3441, -177, -61, -4121, 335, 1449, -521, 4241, 3862, 705, 4129, 2032, -171, 682, -1102, -4442, -4619, -5726, -6506, -3286, -523, 1316, 4102, 6805, 7818, 6216, 4610, 2101, -853, -2600, -5697, -7137, -5236, -4201, -3976, 245, 1936, 2350, 3830, 3377, 2216, 2138, 1522, 480, 598, -3, -1009, -1118, -1353, -1658, -1348, + -918, -646, -254, 210, 154, 285, 166 } + }, + { + {-16, 197, -21, 60, -36, 263, -104, -25, -10, 33, -47, 121, -21, -81, -15, 165, 12, -83, 77, 57, 108, 45, -83, -54, 184, 26, -48, -36, -38, 36, 39, -24, -235, -59, 11, 162, 57, -20, -1, -93, 128, -132, -176, 23, 1, -59, -41, -49, 25, 16, 15, -61, 152, 5, 204, -33, -98, 45, -11, 29, 47, 103, 70, -27, -57, -48, 132, -135, 5, 4, -24, -116, 102, -59, 13, 89, -63, -84, -70, 90, -9, -28, -26, 3, -17, -37, 44, 46, 33, 21, 11, 62, 10, -2, 13, -6, + 2, -15, -8, -8, 42, 10, -29, 36, -78, 68, 40, -91, -51, -7, 8, -4, -14, -46, 83, 17, -36, -48, -3, 172, -24, -80, 110, -42, -104, -10, 88, 66, -57, 16, -71, 42, 40, -33, 87, -23, -159, 30, 82, 77, 10, -11, -115, -38, -16, -50, 103, 147, 67, -198, 67, 235, 96, -11, -2, 109, -54, 36, -99, -88, 90, 103, 49, 28, 18, 21, 48, 10, -10, -34, 24, -69, -14, -29, -143, -70, 29, 54, 43, 97, 75, 81, 114, -72, -47, -20, 36, 43, 67, -14, -23, -12, + 41, -29, 37, 10, -16, -12, 12, -6, 22, 10, 3, -9, 12, 12, -6, 19, 4, 5, -16, 4, -5, 1, 23, 3, 10, 10, 136, -10, 56, -88, -131, -82, 71, -59, -61, -64, -86, 83, 12, 61, -27, 18, -178, -114, -81, 114, 21, 25, 62, -63, -32, -14, 20, -134, -26, -91, -99, 6, -88, 59, 55, 234, -59, 119, -80, 49, -55, 12, 205, 33, 89, -97, 62, -87, -42, -14, 130, -64, -34, -116, -62, -137, -19, 129, 31, 10, 22, 118, -117, -205, 47, 64, -134, -10, 18, -33, + 54, 160, 33, -41, 3, -57, 10, 10, -46, -14, -15, -65, -15, -37, 14, -14, -26, 53, -10, -52, 22, -37, 1, -40, -59, 34, -11, -4, 19, 25, 7, 54, -26, -5, 9, -20, -8, -6, -27, -14, 45, 15, 64, 8, 29, -25, 75, -209, 35, -73, -154, -112, 63, -31, -7, 153, 51, -21, 14, 130, -61, 96, -43, 29, -137, -24, 94, -31, 116, 130, 43, 82, 170, -40, -239, 55, -106, 8, -293, 8, 95, -59, 110, 16, -106, 38, -220, -141, -53, -54, -183, 93, 102, 6, 95, 7, + 26, -59, 86, 65, -34, 202, -38, 167, 144, -8, -23, 0, 46, 68, 22, 76, 26, 26, 224, 85, -97, -45, -1, -54, 34, -39, 226, 38, 107, -81, 92, -1, -44, 19, -72, -48, -12, -52, -32, -32, 28, -49, -11, -35, -17, -17, 63, -26, 33, -9, -52, -9, 33, 13, 6, 20, -31, 27, 19, 16, 31, -18, 8, -52, -3, 39, 36, 9, 7, 5, 30, -399, 1, -1, 103, 176, 62, -88, -146, -23, 190, -36, -36, -141, -3, -58, 141, 168, -287, 188, 120, -109, -23, -150, 1, -45, + 4, 99, 191, -71, 44, -50, -65, 71, 132, 89, -83, -136, 95, 66, -49, -24, 17, -175, 64, 53, -70, -117, 45, -89, 156, 69, -274, 125, -117, -301, -87, -22, 60, -123, -6, 67, -133, -131, -137, -42, 34, 286, 45, 55, -62, -149, 195, -59, -229, 12, -231, 18, -22, -84, -253, 77, 3, -55, 62, 154, 70, -29, -26, 0, 84, 14, 20, 47, 81, -7, -38, -48, -51, 20, -4, -39, -41, 38, 36, 72, 15, -1, -4, 27, -13, -1, -12, 46, -6, 25, -7, 249, 66, 54, 108, 157, + -35, 383, -56, 274, -324, 111, 188, -68, 26, -91, -9, 147, 269, -76, -134, -40, 125, 26, 273, 129, -30, 39, -3, -128, 25, -29, -40, 119, 157, -248, 286, -218, -119, 48, -89, 144, 3, -83, 202, 283, -212, -39, -21, 88, -201, -330, -154, -101, 97, -229, -132, -27, 236, 148, -165, 117, 62, -90, -136, -22, -84, -97, 9, -65, 176, -134, -29, 150, -120, 162, 193, 26, -21, 17, -240, -213, -54, 133, 5, -94, 88, 196, -132, -61, 53, -18, -94, -1, 24, -91, 4, -25, 40, 12, 70, 10, + 55, -36, -16, 2, 6, -4, 49, 21, 58, 55, 5, 16, -9, 37, 57, -29, 146, 119, 159, -154, -204, -110, 138, 6, 573, -44, -14, -139, -259, -381, -84, 125, 201, -126, -244, 31, 2, 244, -82, -101, 301, -165, 19, -233, 149, -47, 1, -53, -354, -223, 19, 196, 131, 15, -367, 243, -149, -153, -159, -211, -33, 199, -163, -180, 123, -60, 71, 366, -161, 7, 18, 155, -109, -101, -51, 232, -53, -124, -22, 181, 236, -236, -267, -92, -40, -90, 57, -189, -66, -178, -353, -141, -82, 46, -325, -91, + 5, 228, 7, -201, -4, -10, -61, -112, 5, 46, -21, 34, 32, -45, 66, -28, -66, 70, 88, -39, -84, -4, -16, 14, 70, 25, 1, 48, -27, -44, -34, -48, 69, -187, 158, 194, -142, -172, -146, 79, -15, 281, 489, -274, 18, -11, -34, 46, 141, -401, 361, -283, -140, 363, -84, -173, 120, 134, 8, -20, -280, 175, -40, 61, -185, 231, -21, -386, -412, 138, -76, -213, 104, -17, 639, 108, -117, -190, -377, -133, 73, -91, 294, -62, -439, -42, 301, -131, 39, 261, 176, -148, -28, 211, 282, -128, + 55, 41, -136, 61, -63, -19, 42, -65, -80, -272, -298, -251, 251, 141, 163, 70, 2, 101, -217, -119, -304, 151, -39, -41, -62, -45, -155, -91, 31, -62, 9, 12, 10, 60, 7, 72, -8, 54, -71, 41, -106, 10, -51, 89, 4, -55, -17, 29, -46, -51, -124, -123, -69, 127, 8, 46, 79, -327, 124, -353, 14, 129, -57, -264, -125, -54, 237, 188, -141, -146, 253, 105, -146, -158, -123, -17, 244, -41, 22, -14, -3, 314, 155, 210, -15, -15, 108, -162, -273, 223, 359, -242, 309, -90, -31, -138, + 159, 10, -173, 106, 292, 229, 106, -219, -90, -443, 74, 232, -143, -35, -176, 47, -105, 173, -109, 59, 206, 118, 387, 204, 131, 249, -208, 373, 115, 228, -74, -255, -395, -74, -66, -102, -93, 149, -272, 413, -70, -331, 190, 309, 128, 41, 65, 117, 39, -66, 79, -61, -1, 131, 0, -3, 142, 22, 78, -10, -66, 24, 14, -54, 45, 60, 16, -38, 35, 14, 110, 27, -19, 72, -93, 30, 22, -99, -148, -39, -58, -35, -73, -49, -30, -10, 183, -390, 287, 99, -59, 424, 328, -538, -360, 339, + 583, -54, 86, -50, -73, -58, -24, 147, 88, 352, 87, 337, 95, 147, -46, -190, 82, 26, -155, 258, 27, 103, 60, -53, -239, 31, -271, -92, -314, -210, -127, 264, 38, 130, 324, -140, -27, 38, 116, 35, 8, -91, 240, 527, 254, -420, -299, -311, 364, -55, -337, 197, -189, -21, -55, -24, -26, 11, 319, 528, 200, 455, 292, 147, 59, 114, -147, 484, 157, -254, -340, 150, 112, -93, 243, 457, 106, -177, 285, -27, -210, 43, 160, 26, -28, 18, 88, 154, 68, 68, 17, 100, -43, -20, -60, -17, + 211, -113, 78, -33, 50, 5, -56, 31, 75, 92, -44, 37, -85, -3, 42, -153, -218, 61, 525, 100, 184, -168, 134, -259, -458, 11, 243, 73, 195, 276, 303, 18, -332, -281, -440, -679, -13, -82, 299, 223, -256, -142, 175, 355, -446, -287, -86, -243, -167, -91, 136, 276, 11, -167, -207, 279, -224, -94, -8, 393, -29, 32, -618, -46, 150, 317, 411, 89, -398, 187, 7, 186, 258, 44, 129, 298, 519, -345, -138, -30, 158, 553, 232, 185, 309, -106, -184, -332, -420, -248, -18, 269, 615, -384, -284, -39, + 603, -338, -198, -302, -57, -271, 85, 52, 143, 321, 58, 206, -134, -132, -172, 14, -87, -200, -181, -88, -48, -41, 203, -153, -47, -57, 145, 37, 105, -68, -71, 146, 47, 39, -123, 188, -96, -5, -67, 60, -70, 20, 123, 150, 273, 154, 385, -455, -325, -51, 668, 270, 17, 362, -225, 543, -127, -477, -92, -474, 385, 230, 151, 150, 9, -152, 187, 277, 140, -97, 249, 332, 298, -37, -258, 450, 106, -27, -75, 54, -293, 292, -55, -81, -374, -204, -231, 525, 188, 6, 70, 272, 391, 199, -504, 459, + -53, 266, 114, 403, -92, -527, 166, -24, 219, -93, -215, 197, -83, 134, 665, -80, -305, 2, 89, -322, 537, -238, -322, 474, -274, 242, 33, -342, -242, -342, 110, 288, -169, 167, 320, -175, 226, -72, 378, -132, 114, 124, -101, 3, 17, -169, -19, 158, -237, -44, 179, 92, 8, -144, 77, -37, 63, -151, -145, -81, 35, 41, -175, -109, 171, 25, 77, -178, 87, 20, -78, 40, 30, 63, -92, 11, -43, -6, -190, 142, -440, -95, 237, 47, -430, 106, -151, 309, 77, 155, -719, 212, 14, 272, 464, 17, + -58, 31, -233, 463, -447, 138, 283, 185, 261, -127, -215, -258, -462, 175, 71, 261, 491, -193, 421, 221, -406, -240, -6, 36, 22, -12, 209, 353, 335, 133, -850, 202, 252, 243, -560, 330, -287, 285, 35, 146, -76, 211, -68, 712, 346, -332, 40, -916, 152, -277, -275, 245, 183, -466, -904, 562, 351, -859, 332, -202, 325, -81, 78, 123, 9, -582, -213, -93, 182, -16, -144, 229, -304, -131, 318, -38, -26, 99, 67, 114, 58, -181, 72, -266, 160, -123, 92, 56, -66, -50, -44, -102, 49, -158, -21, -136, + -89, -216, 107, -73, -52, -130, 57, 89, 70, 43, 23, 17, 80, -18, 87, 57, 199, -118, -105, -184, 333, -255, 3, 49, 856, -116, 618, 152, 466, 29, 133, 151, 826, 827, -427, -391, 473, -599, 1, 162, -597, 340, 48, -48, -108, -182, 72, 64, 112, -367, 3, -90, -482, 246, 336, -539, -401, -197, 291, 282, 271, -29, -109, 254, 860, 463, -169, -112, -117, 580, -463, 214, 123, -723, -299, -33, 99, -613, 422, 275, 123, 117, 293, -580, -70, -482, 22, 299, 503, 310, -318, -169, -25, 17, -366, 818, + -65, 109, -193, 281, -62, 164, -74, 102, 77, 178, -21, 3, -67, 42, -13, -46, 241, -72, -178, -10, -20, 124, -182, 42, -151, -236, 145, -44, -162, 13, -4, 28, -143, 189, 48, 232, -287, -19, 133, -72, -233, -4, 249, 113, -77, 394, 611, -42, 40, -378, 32, -17, -271, -452, -87, -209, -339, -248, 383, -325, 278, -98, -78, 537, -372, -207, 82, 217, 31, -710, -437, 81, -115, 115, -100, -223, 452, 97, -40, -186, -1021, 613, -185, -11, -87, 39, 292, -170, -279, -477, -46, 211, -295, -378, 155, 600, + -102, 558, 410, -408, 750, 496, -496, -765, -221, -333, 40, -242, -60, 366, -640, 313, -105, -360, -402, -401, -487, 101, 291, -261, 416, -54, -244, -502, 7, -56, 193, 598, -217, -453, -159, 13, 153, 409, 107, -51, -336, -2, 12, 152, 63, 1, 112, 168, -126, 209, -122, 96, 242, 219, 13, -343, -142, 52, 84, -238, 386, -234, 176, 209, -159, 21, 42, -90, -328, 70, 146, 26, 275, 192, -188, -648, 1179, 1659, -160, 202, 107, 402, 805, -769, 9, 133, 15, -278, 42, -343, 405, 989, -209, 21, 57, 299, + 28, 116, 381, -762, -56, 747, 768, -898, -190, 129, 127, 267, 676, 190, 1364, 227, 421, 201, -214, -283, -16, -958, -1377, -467, -446, -1435, 225, -34, -801, -391, -1342, -147, -184, 914, -895, 559, -612, -50, -402, -318, 360, 821, -633, -238, -57, -188, -67, 346, 659, 703, -502, 1416, 950, 123, -537, -1166, -264, -434, -317, 76, 375, -245, 140, 439, 72, -140, 447, 297, 154, 195, 469, 472, 5, 38, 191, 177, -76, -141, -80, 86, -11, -60, 31, -95, 66, 308, -12, 108, 378, -99, -134, -144, -15, -209, -41, 178, + -97, -57, 37, 1, 34, -30, 150, -101, -102, 244, 174, -190, -8, -102, -592, 1085, 1807, -425, -92, 322, 810, 273, -469, 296, -401, 105, 257, -96, -541, 165, 578, -142, -824, 648, -188, 529, -193, -128, -202, -332, -11, 587, 329, 99, 475, -222, -185, 183, -250, 330, 193, 504, 861, 755, -540, -1007, -366, -61, 793, -300, 143, 322, -311, -462, -742, -761, 605, 645, -510, -1836, 155, -126, -249, 146, -180, -734, -341, -170, -509, -216, 786, 300, 455, -173, -253, -163, 439, 77, 85, 378, 1090, -91, -156, -545, -515, -754, + -77, 433, 297, -305, 231, -139, -175, -312, -283, 265, -218, 259, 125, 148, -157, -232, 271, 169, -62, 206, -273, 121, -32, 170, -87, -155, -84, -75, 193, 97, -3, -191, -40, 396, -274, -3, -266, 340, -174, -71, -245, 41, -101, 41, 292, 292, 67, 9, -102, -384, -57, -317, 168, -451, -749, -158, -128, 143, -258, 580, -346, -1166, -639, 411, -556, 656, 577, -251, -92, 90, -361, 8, 186, -45, 100, 829, 682, -177, -1094, -821, 58, 584, -442, -182, -519, -654, 57, -181, -778, -837, -1241, 503, 167, 33, 710, 963, + -41, -710, -547, -573, -331, -200, 214, 376, -334, -521, -646, 346, 296, -626, -605, -237, -109, -364, 224, 1555, 927, 1816, 601, -960, 1125, -46, -583, 59, -549, -1186, -497, 275, 563, -132, 518, 304, 1149, 1261, 1031, 345, -295, -181, -175, 220, 288, -436, -167, 73, 936, -131, 76, -102, 336, 343, 397, -21, 3, 6, 82, -38, 51, -344, -116, -119, -327, -333, -159, 119, 392, -259, 54, 138, 446, 609, 413, 389, 430, 94, -170, -339, -492, -607, -483, -284, -581, -586, -232, -105, 1079, -613, 70, 318, -137, -800, 809, 774, + -446, -612, 83, 1073, -563, 307, 686, 211, -259, -511, -337, 239, -82, 183, -301, 202, -666, 974, -95, 220, -47, -1223, 381, -337, 631, 382, 674, -262, -1183, 851, 381, -400, -737, 611, 325, 649, 653, -569, 261, 686, -1003, 920, 451, -27, 291, -517, 1148, -127, 755, 342, 1333, -91, -235, 190, 542, 363, 377, 1350, 78, 332, 787, -519, 540, 66, -898, 336, -303, 1017, -749, -896, -936, 801, 1310, -417, 332, -1543, 147, 76, -60, -721, 120, 308, -240, -197, -195, 491, 228, -306, -334, -190, -80, -94, 139, -531, -321, 286, + 116, 103, 16, 247, -43, -26, -314, 422, 523, -221, -815, -547, -7, 4, 155, 44, -257, -397, -221, 154, 234, 656, 220, 37, 10, -484, -100, 510, 298, -1981, 108, -243, 62, 1533, 1263, 1816, 959, -484, -370, -753, -1004, 353, 88, 263, 319, -293, 457, 775, 142, -208, -263, -549, -365, -332, 151, 246, -788, -466, -109, 528, -239, 340, 422, -1120, -1103, 209, 319, 245, -833, -384, -749, -363, -343, 721, -949, -1322, -497, 261, 224, -1019, -819, -643, -487, 550, 775, 34, -264, -323, -180, -173, -351, -1130, 371, 848, 771, 239, + 1053, 1424, -125, -185, 1091, -266, -666, -1504, -513, 203, -825, -553, 385, -136, 534, 935, -571, -886, -294, -381, -221, -242, -239, 98, 134, 107, 189, -319, 275, -441, -54, 271, 364, -394, -549, 312, -126, 18, -384, 450, -266, -98, -107, 416, -356, 451, -203, -214, 298, 76, 236, -192, 19, 86, 486, -60, 114, 1300, 457, 105, 476, -540, 36, -276, -402, 240, 96, -338, -559, -323, -519, -424, 171, -327, -158, 243, -160, 54, -178, 646, -505, 529, 194, 58, -488, -212, 392, 157, -8, 311, -54, -131, -199, -171, -133, 57, + -1, 64, -573, 300, -239, -227, 202, 135, 77, -111, 404, 344, -501, 447, -61, 302, 608, -130, 330, 309, -300, -218, -400, 33, 71, -647, 267, 95, 503, -201, -1142, 713, 45, 17, 16, -508, -158, -137, -169, -740, 421, 207, 453, -332, 200, -372, -334, 11, 288, 227, 9, -46, -102, 21, -167, -39, 488, -202, 98, 48, 139, -304, 325, -17, -61, 71, -32, 70, 110, -277, -37, 0, -50, -55, 149, -179, 217, 309, 119, -202, -9, -47, -183, 224, -63, -671, -1899, -2828, 595, 2220, 94, 6080, 5608, 3851, 6628, 5097, + 695, 108, -687, -4863, -4957, -3771, -6493, -6057, -1730, -2021, -2041, 484, 1230, -1015, -337, 1944, 1239, -69, 1446, 1001, 76, 1210, 2869, 1886, 659, 2939, 2177, 170, 2527, 3425, 822, 369, 3494, 955, -1363, 1758, 2692, -1378, 628, 3762, 357, 620, 4541, 3568, 301, 2829, 3753, -1305, -773, 1066, -3072, -5132, -3463, -5660, -8406, -7722, -8638, -11004, -11611, -10274, -10858, -10228, -7680, -6135, -3194, -796, 1809, 6303, 7335, 7962, 12353, 12073, 8105, 10432, 8151, 3241, 3583, 5066, 2479, 1615, 3787, 2701, -14, 1295, 2944, 733, 206, 2194, 506, -2288, 738, 1797, -528, 1609, 4290, 1697, + 961, 3774, 2058, -749, 435, -984, -4532, -5550, -5512, -6948, -7846, -6492, -6241, -7116, -6423, -5314, -6121, -5607, -3782, -3015, -2887, -1195, 670, 801, 2551, 4315, 4536, 4479, 5051, 4655, 3320, 2803, 2488, 1712, 1383, 1679, 1478, 978, 995, 1075, 878, 804, 985, 792, 488, 370, 355, 84, 31, -22, -268, -252, -105 }, + {115, 158, -93, 6, 5, -114, 152, -61, -59, 43, -156, -70, 168, 38, -68, 119, 37, 25, -24, 58, -1, -201, -9, -75, -9, -5, -192, 3, -123, 7, 19, 86, 103, 34, 26, 19, 89, -49, 30, 6, 14, 18, -27, 79, 118, -228, 106, -60, -137, -88, 175, 87, -59, 99, 29, -63, 62, 1, 0, 9, 12, -24, 1, 13, -10, 75, -47, -105, -102, -1, 34, -6, 5, 57, -23, 101, -106, -32, 82, 88, -61, 100, 35, -26, -67, -31, -29, -27, -27, -13, -4, -15, -28, 9, 20, -40, + -10, -13, 21, -35, -8, 5, 84, 6, -67, 42, -36, -54, 13, -114, -14, -85, 30, 53, 51, 40, -89, -6, -73, 78, -152, -86, 76, -166, -19, -11, 42, 36, 82, 172, 79, -22, -1, -62, -48, -304, -280, -19, 207, -52, 166, 14, 47, -52, -236, 122, 37, -71, 58, -125, -26, 70, 31, 221, -152, 134, -70, -174, -81, -48, -48, 61, 52, -141, -63, -80, -30, 135, 144, 155, -114, 19, -72, -10, -60, -77, -93, -105, 58, 16, -16, -38, 14, 59, -60, -53, -27, 67, -24, -13, -30, -34, + -9, 15, -1, -6, 11, 15, -4, -7, 43, -34, -22, 17, -21, 33, -21, -23, -5, -4, 21, -11, -11, 12, 3, -34, 11, 8, 113, -107, -138, -120, 4, -48, -38, -95, 21, -106, -8, -44, 163, -105, -115, -257, -333, -81, -148, -137, -32, 69, -84, -200, 124, -290, 87, -49, -52, 187, 132, 69, 26, -33, -30, -71, 31, 127, -102, 120, 112, 32, 17, 50, 86, -189, -81, 179, -139, 11, -2, 110, -13, -42, 21, 186, 104, 65, 61, 103, -164, 127, -133, 117, 78, -35, -23, -56, -73, -120, + -5, -38, -95, -106, -59, -62, -10, -7, -28, 141, -58, -27, -95, 98, 1, -22, 22, -41, -68, 1, 40, -5, -6, -45, 14, -15, -40, 3, 10, 22, -4, 14, 13, 33, 12, -36, 3, 19, -4, -32, -19, 46, 25, -25, -10, -10, 67, -176, -4, -83, -162, -75, -30, -113, -38, -104, -41, 82, 110, -183, -104, 60, -36, -200, 133, 238, 50, -56, -111, 26, 115, 215, -109, -46, -138, -111, 119, 119, -167, 98, -54, -107, 169, 0, 92, -232, 16, -149, 34, -185, -116, -30, -43, 386, 122, 100, + 75, -287, 160, 112, -63, -7, 125, -18, 132, 153, 152, -88, 11, -49, 81, -72, -77, 50, -72, 34, 48, 3, 90, 36, -170, -21, -22, 54, -193, -62, -49, 136, -42, -23, -104, -28, 7, -10, -49, 1, -32, 35, 12, 0, 6, 13, -25, -72, 38, 16, -41, 20, -23, 9, 9, 26, -6, -9, -18, 16, -30, 28, -34, -2, -3, 22, -23, -9, -33, -19, -30, -238, -133, 98, -104, 280, 123, 274, -4, -134, -143, -192, 293, -72, 134, 150, 31, 105, 95, 93, 37, -193, -11, -75, -29, 132, + -12, -12, 92, 58, 95, -84, -305, -182, -116, 224, -203, -61, 137, -15, 25, -170, 295, 16, -115, 233, -143, 361, 186, -81, 42, -103, -71, -332, 118, -151, -24, -13, -73, 142, -56, -145, -142, 33, -129, -142, 81, 13, 102, -56, -304, 105, 132, 170, -164, -184, 24, 301, 48, -155, -71, -26, 82, 15, 88, -88, -34, -17, -109, -89, 134, -22, 52, -11, -38, -85, -8, 4, 33, -15, 31, -22, -69, -27, -10, -1, -12, 53, 3, 57, -19, -3, -9, -61, 0, 32, 32, 241, -221, 111, 282, -204, + 56, -114, -222, 329, 123, 306, 282, 42, -225, -137, 117, -14, 49, -243, 25, -431, -182, -336, 208, -191, -7, 62, -56, -87, 102, 103, 298, -41, -66, -228, -195, 191, 41, 66, 357, -108, 2, 191, -86, 88, 65, 191, 171, -118, -19, -242, 252, -165, -219, -210, 133, -77, -115, 249, -77, 258, -158, -120, -33, 169, 218, -16, -236, 86, -151, 308, 64, 181, -248, -109, 66, -63, 149, 23, -84, 90, 197, 279, 215, 4, -51, -3, 46, 5, -48, 34, -41, -6, 79, 5, -39, 86, -27, -44, 22, 31, + -2, -53, 20, -36, 8, -72, -90, 23, 34, -2, 70, -24, 31, 142, -377, 131, 113, 75, -285, 217, 360, -351, 134, -216, 142, 19, 127, -105, -7, 82, -238, -119, -102, 188, 199, -66, 94, -49, 147, 186, 73, 56, -189, -72, -236, -263, -183, 17, -87, -13, -109, -262, -88, 53, 24, -16, 396, -321, 118, -160, -46, -100, -101, 168, -100, 12, -121, -82, -147, 201, -185, 165, -43, 165, -15, 24, -17, 159, 93, -5, 343, 13, -172, 90, -155, -191, -229, 222, 79, 198, 202, 236, 140, -29, -42, -44, + 228, -34, 256, 54, -11, -40, 88, 129, 34, 53, 18, -18, 26, -44, 69, 2, 59, -18, 56, -7, -89, 43, 62, -1, 50, -17, 3, -53, 43, -13, 21, 94, 95, -396, -32, 51, -92, -312, 357, -23, 13, 303, -85, -313, 110, 205, 388, -25, 164, 33, -342, -100, -178, 174, 99, 91, -128, -23, -15, 31, -116, 162, 44, -137, 200, 28, -224, -188, 52, 242, 217, -304, 594, -30, 11, 163, -24, -78, -6, 382, -192, 189, -47, 264, 79, 237, -91, -187, 131, 202, -101, -227, -247, -217, -99, -44, + 225, 5, 196, -24, -65, 195, -170, -329, -88, -210, -198, -366, 273, 238, 98, -567, 133, 119, -43, -17, -198, 271, 138, 107, 66, 249, -22, -18, 18, -3, 58, 28, 1, 76, -46, -10, -59, 17, 20, 84, -59, -9, -23, 65, -30, 24, 38, 52, -45, 124, -1, -4, -46, 48, -78, 27, 3, -114, -27, -19, -226, -15, 18, 164, -238, 12, -36, -99, -494, -60, 234, 180, 240, 28, -265, 702, 296, 477, 50, -209, -83, -68, -297, -19, -116, 149, 2, 15, -95, -127, -251, 85, 26, 12, 131, -11, + 56, -25, -218, -170, 133, 1, 320, -403, 324, 198, -141, -291, -454, 96, 360, -184, 349, -27, -14, 80, -101, -404, 50, 191, 86, -175, -45, -110, 91, 196, -9, 50, -25, 189, -83, -64, 130, -112, 298, -79, -149, 111, -267, -137, 4, 107, -115, 50, -41, 59, 4, 70, 63, -24, 38, -127, 71, -17, -170, -60, -47, -103, 2, 30, -79, -58, -2, -109, 10, 28, -22, -115, 12, -2, -85, 36, 67, -71, -2, 21, 9, 34, 104, 85, -85, -70, 78, -543, 388, 350, 414, -134, -369, 129, 148, -553, + -502, 485, 53, -239, 184, -346, -392, 55, 1022, 473, 190, -279, 5, -100, 8, -118, -57, -130, 37, 289, 58, 357, -142, -120, 66, 249, -48, -37, -534, -24, -301, -17, 414, 294, -109, 288, 575, -275, 166, 475, -350, 502, -42, 206, -119, 20, -68, 69, 117, 498, -191, -64, 130, -233, 147, 76, -134, -227, 492, -33, -270, -90, 305, -129, 207, -2, 15, -325, -353, -171, -301, -273, -295, -19, -70, 143, -18, 25, -27, 180, 115, 13, -223, 8, -42, -167, -47, -86, 88, 33, -114, -38, -87, -69, -8, 62, + 61, 64, 110, -67, 14, 69, -48, -65, 81, -113, -44, -35, 51, 22, 82, 14, -32, -82, 662, 119, 94, -345, -199, 17, 77, 134, 154, -658, 30, 41, 475, 76, 121, -45, 432, -706, 22, 361, -420, 105, 83, 340, 67, 36, -115, 11, -360, 122, -89, 64, 99, -62, -273, 100, -215, -376, 213, -213, 140, -354, -222, -38, -109, 84, -150, 387, -4, 369, -389, -330, -105, 5, -6, -115, 333, 271, 694, -111, 444, -260, -43, 133, -525, 600, -15, 374, -14, -525, -315, 221, -701, 366, 102, 534, 674, 87, + -498, -377, -154, 383, -46, -93, 22, -140, 21, -103, -150, -52, -242, -12, 12, -113, -100, -138, -97, -47, 62, 117, 44, -19, 108, -73, -40, 25, 57, 68, -67, 86, -88, -42, -129, -227, 141, 24, -128, -130, -24, -180, 25, 2, 134, 336, 521, 178, -214, 491, -528, -58, -162, 63, 424, -385, 954, 124, 237, -283, -383, 130, 4, 806, -115, -283, -461, -314, 226, 142, 133, -61, -454, -704, 54, -425, 564, 71, 458, -285, 192, -185, 238, 658, -108, -72, -99, 170, 221, 111, 50, 66, 288, 255, -147, -229, + -203, -229, 756, 296, -441, 339, -99, -364, -259, 131, 277, -518, -672, 73, -299, 883, 461, -154, -99, 186, 401, 100, -66, -120, -610, -31, -148, -666, 253, 416, -66, 207, 117, 424, -232, -65, 155, -68, -190, -219, -4, -133, -322, -68, -147, 139, -61, -181, 126, 48, 20, -113, 126, 32, -201, 69, 83, -97, -280, -141, -49, -32, -1, -108, -12, -80, 41, 32, -53, 11, -2, -86, -172, -25, 40, 100, 54, -134, -84, 31, -248, -421, 243, -142, 367, 163, -391, -169, -196, 82, -528, 357, 507, -208, 318, -79, + -135, 242, -369, 229, 412, 110, 708, 340, -291, 299, 132, 262, 16, 377, 333, 505, 195, -201, -234, -317, -26, 786, 21, 331, -493, 1028, -302, -811, -378, 648, 55, -94, -85, -51, 489, -359, 285, -75, 614, 928, 484, 446, -327, 527, 324, 311, 364, 527, -106, -928, -589, -675, 179, 236, 196, -159, 317, 815, 62, 60, 203, -49, -713, -775, -259, 150, 87, -36, -436, 109, 26, 33, 236, -54, 152, 47, 290, -75, 195, -154, 39, 27, 336, 149, 336, 34, 173, -62, 42, 139, -87, -219, 54, -132, -238, -195, + -48, -56, 328, 64, 4, -101, 55, -2, -111, -135, -92, 70, 211, -29, 24, 23, 98, 62, -212, 134, 341, 399, 145, 187, 312, -246, 724, 285, 140, -207, -555, -225, 304, -31, -787, 1059, -372, -208, 327, 15, -105, 76, -205, -249, -54, -577, 143, -620, 18, -491, -552, -111, -117, -122, -404, 177, 433, 116, 332, -576, 567, 1033, 107, -416, 646, -530, -839, 1396, -143, 98, -97, -625, 482, -567, 245, 852, -17, 1170, -914, 881, 257, -580, -304, 110, -557, -278, 621, -609, 404, -410, 224, 648, -1425, -629, 656, -1224, + 432, 379, 699, 618, 278, -50, 410, 612, -665, 664, -12, 229, -35, 208, 54, -127, 46, -194, -63, 49, -35, -336, 211, -60, 275, 164, -237, 187, 230, 166, 69, 119, 72, 151, -465, 260, -61, -127, 330, -266, -216, 110, -274, -224, -270, 150, -410, -1224, -319, 401, 945, -301, 477, 13, 226, 490, 317, 848, -219, 36, 233, -752, -483, -224, -243, 173, 13, 63, -391, -65, -518, -422, 203, 1047, 603, -275, -335, 499, 599, -356, 159, 460, -182, 1002, 342, 147, -773, 477, 99, 376, -79, 97, -127, -167, -1218, 323, + 844, 416, 114, -24, 426, -686, -1265, 94, 1679, 403, 1332, 1262, 18, 110, -801, -719, -75, -617, 842, -1833, 348, -687, -1463, 325, 687, 1464, 133, 73, -931, 305, 443, -652, -59, 46, 685, -184, -434, 1034, 221, -370, -11, -599, 81, -567, -113, -20, -275, 86, -222, -238, -128, -3, -111, 192, 540, -31, 9, 200, -483, -294, -55, 147, 157, -423, -236, 335, 201, 116, 84, 354, -10, 6, 40, -240, 47, -317, 892, 1566, 38, 431, 279, -818, -236, 823, 256, 365, -209, 242, 137, -287, 10, 429, 448, 554, -246, -64, + -1218, -1136, 154, -701, 21, 614, 145, 76, -214, -133, 389, 959, -697, -395, -94, -672, -52, -648, -205, -688, 608, -835, -71, 154, 403, 1469, 1951, 510, -517, -1039, -95, -709, -283, -1105, 163, 1072, 785, 645, 74, 159, 1091, 1066, 778, -60, 490, 186, 240, -1257, 377, 143, -294, 764, 1030, -140, -21, -504, -2159, -38, 634, -309, 1488, 1063, -496, 102, -552, 374, 99, -196, -332, -146, -34, 235, 284, 444, 9, -262, -578, 37, -275, 223, -260, -347, -91, -87, 257, 113, -102, 140, 72, 112, 22, -195, -321, -157, 116, 269, + -27, 220, -7, -314, -334, 95, -408, -225, -3, -175, -54, 118, 163, -148, -381, 975, 695, -464, 471, 724, 82, -907, -1083, 1012, 345, 234, 797, 18, -347, 855, 226, -649, -329, -235, 289, 18, -388, 150, -429, -43, -193, -209, 583, 1085, -369, 225, 512, -255, -218, 209, 618, 197, -474, -601, -723, 388, 408, 986, -466, -443, 347, 587, 920, -27, -1702, -365, 550, 547, 247, -333, -12, -681, 103, -295, 708, 1013, -305, 22, -593, -644, -248, -1304, -262, -663, 579, -531, 601, 744, -1509, -126, -638, 646, -265, 227, -468, 76, + -399, 445, 497, 855, 827, 409, 795, 368, 48, 420, 271, -119, 355, -393, 190, -201, 165, -496, 295, 2, 233, -366, -207, 237, -95, -123, 428, -337, -77, 346, 171, -232, -73, 140, 788, 422, 344, 463, 33, 504, 171, 154, 265, 0, 425, 117, -728, -342, -194, -358, -495, -817, -186, -455, -830, -1253, 613, 650, 382, -838, -1141, -876, -497, 206, -38, -1111, -664, -761, 1079, 337, 470, -338, -613, 1367, 339, 427, -261, 82, 405, -278, 322, -100, 652, 921, 42, -742, -595, 730, 501, 640, 187, 161, -328, -144, 108, 448, + 968, -7, -1798, -1668, 27, -407, 1083, 1100, -1218, -824, -510, 1522, 1359, -732, 220, -959, -922, 566, -422, 8, -137, -665, 482, 492, 395, 1544, -1124, -302, -99, 398, 131, 637, -2250, -1309, 479, 711, 706, 202, -737, -757, 21, 453, 1310, 320, -425, 137, -834, 527, 465, 31, 739, 1568, 385, -1144, -593, -77, 142, 761, 668, 316, -336, -137, -228, -267, 691, -75, 73, -266, 670, -301, -115, -12, 584, 256, 216, -115, -707, -252, 247, 582, 113, -793, -1097, -919, -8, 142, 185, 119, 1508, -1001, 941, 939, 599, -2186, -879, 735, + -595, 426, -157, -907, 582, 177, 173, -400, -1450, -135, -45, 8, -207, -1053, 789, -650, 1347, -140, -118, 658, 488, -642, -60, -485, 719, 1136, 862, -954, 214, -638, 577, -554, -229, 97, -49, 619, -567, -1326, 341, -473, 495, 521, -1682, -283, -321, 64, 1861, -499, -1355, -357, 1182, 570, -734, -238, 733, -1, 905, -1360, -720, 822, -856, -2075, -613, -281, 2372, -645, -1226, 655, -1415, 3734, 353, -3464, -924, -609, 2460, 1334, -1546, -813, -21, 1819, 1447, -223, -1139, 449, -386, 1640, -159, -820, -682, 1076, -860, 559, -1647, -5, -64, -94, + -97, 348, -912, 885, 73, 649, 26, -1037, -799, 594, 699, 1101, 410, -110, -718, 98, 178, -188, 46, 723, 112, -33, -824, 160, 584, 218, 23, -239, -592, -2001, 561, -33, 684, 1654, 531, 227, -932, -388, -932, -1118, -373, 219, 639, 844, -94, 491, 596, -519, -1050, 556, 201, -855, -290, 810, -275, -92, 743, 415, 330, 102, 422, -405, -975, -425, 279, -401, -230, 356, 25, -689, 717, 154, -636, 81, -153, 616, 344, -250, 290, -382, -855, 114, 209, -79, 3, 180, -373, 117, -319, 191, 610, -66, 267, 281, -236, 14, + -582, 198, 344, -1060, 615, -662, 209, 30, -3, 291, 119, 690, 126, 195, -99, 353, -371, -246, 86, 58, -325, 116, -29, -96, -187, 66, -37, 373, -96, 43, 268, -189, 186, -117, 65, -189, -164, -189, -49, -86, 142, 100, -439, -121, -128, 304, -181, 113, 53, -489, 162, 315, 21, -121, 53, -145, -72, 1619, -59, -54, -450, -442, 333, -20, 289, 5, -158, -214, 110, -300, 304, -282, 443, -359, 258, -304, -68, -49, -282, -216, 64, -128, -89, -3, -212, 28, -42, 67, -50, 123, -425, 387, -146, -127, 294, -236, + 16, -295, -258, 187, 166, -207, -134, 83, -13, -361, 92, 63, 0, 236, -88, -102, -97, -246, -67, 258, -274, 70, -133, -34, 17, -84, 60, 1, 180, -262, -23, 169, -339, 197, -153, 2, 155, -75, -155, 70, -28, -44, -12, -110, -3, 114, -8, -54, 20, -96, 66, 48, 28, -77, -23, 99, -127, 126, -58, 55, 140, -169, 40, 11, -214, 39, -68, 88, -30, 6, 129, -86, 25, -138, 23, 20, -34, -33, -17, -50, 10, -25, 5, 95, -139, -761, -1284, 476, 4113, 1029, 2268, -90, -2210, -718, -2175, -1859, + -658, -449, -152, 1232, 1656, 2188, 2765, 1193, -709, -1282, -2716, -2582, -1053, -863, -576, 1113, 1518, 907, 1408, 1688, 571, 462, 315, -876, -404, -628, -1368, -756, -1017, -1507, -820, 186, 160, 840, 2040, 1395, 1161, 1130, 347, 82, -117, -588, -839, -1061, -1516, -1340, -750, -236, -513, 421, 784, 666, 1150, 1283, 823, 746, 729, -114, -359, -181, -1047, -867, -223, -858, -918, -581, -826, -401, 235, 527, 953, 1529, 947, 878, 971, 359, -117, -177, -523, -863, -897, -854, -938, -652, -601, -498, -207, 235, 579, 899, 1356, 1429, 1392, 1184, 374, -308, + -635, -1020, -1352, -1525, -1524, -1205, -680, -161, 418, 1252, 1390, 1394, 1458, 1207, 633, 203, -343, -972, -1364, -1202, -1127, -886, -414, 39, 333, 675, 761, 752, 595, 272, 124, 52, -107, -120, -126, -163, -207, -158, -224, -144, -120, -71, -85, -2, 18, 95, 98, 160, 151, 179, 108, 105, 18 } + }, + { + {95, 95, -86, -15, 136, 45, -70, 15, -78, -69, -56, -122, -42, 75, -6, 41, -21, -35, -34, -15, 103, -65, 6, -5, 5, 81, -3, 56, 179, 139, 140, 73, 32, -23, -165, 68, -62, 106, 38, -56, 50, -74, -143, -44, -55, -136, 6, -17, -19, -64, 9, 142, 63, 96, -1, 59, -55, -4, 74, -61, 50, -76, -80, 8, 167, 110, 64, -32, 28, 18, 10, -30, -64, -98, -71, 2, -61, -30, -65, 22, 10, 34, -19, 28, 39, 32, 4, 20, -15, -16, 0, -41, 43, 35, -4, 44, + 13, 9, -20, -13, -26, 9, 14, 0, -8, 15, -10, -38, -11, -25, -1, 7, 9, -40, 7, 61, 31, -105, 249, -5, 15, -26, -132, 97, -69, -66, -153, -118, -50, 95, 137, -28, 81, -32, 148, 154, -308, 56, 1, -30, 104, 164, -51, -24, 3, -10, -78, 64, -79, -62, -7, 82, -47, -173, -77, -118, 14, 10, -154, -19, -67, 32, -5, -24, 38, -52, 52, -83, 81, 118, 181, 75, -80, 65, 76, -29, -206, 13, 107, -83, 61, -120, -2, -77, -209, -64, -110, 52, 77, -71, 33, -34, + 98, 7, 57, 82, -36, 34, 16, 34, 71, -17, 24, 88, 50, 11, 53, 9, 23, -5, -2, -49, 25, 30, 40, 27, 9, 12, 1, 14, -7, -15, -4, 32, 27, 7, 24, 5, 28, 23, 204, 56, -277, 99, 142, 52, -24, 72, -175, 25, 77, -39, 74, -12, 91, 22, -118, 74, 107, 106, -31, 51, 58, 40, -314, 44, -134, -40, -45, 73, 33, -256, -93, -57, -49, 104, -96, -179, 44, 83, 51, -178, -84, 57, -169, -14, -187, 27, 91, -95, -30, 106, 135, -316, -24, -88, 95, 39, + 15, 27, -89, 80, 69, -245, 188, -25, 46, -125, -53, -106, -14, 27, -99, -137, 121, -44, 49, -7, -25, 35, 41, -50, -127, 70, 63, 16, 29, -4, 9, 21, -2, 21, 14, -3, 48, 7, 36, 44, 2, 62, -3, 12, 16, 28, 22, 31, -48, 21, -22, 9, 20, 15, 36, -13, -12, -133, -125, -104, -66, 207, -72, 28, -168, 178, 12, -121, -32, 103, -215, 73, -64, 48, 35, -99, -70, -257, -69, -289, 37, 65, -31, -39, -26, 43, -113, -206, -96, -76, -32, 75, -47, 122, 54, 94, + -127, -7, -6, -107, 30, 84, -8, -53, -125, -116, 78, 116, -4, 231, 183, -165, -42, 0, -174, -200, 301, -5, 8, 94, -191, -63, -124, 297, 80, 15, -237, -188, 25, -78, 154, -79, -2, 42, -93, 34, 93, -140, 2, -223, 24, 84, -64, 32, 27, 109, -16, 17, -21, -4, 47, 48, 45, -34, 15, -2, 20, 1, 20, -33, 70, 1, 20, 11, 22, 16, 20, -19, -18, -16, 16, 47, 56, 10, 25, -46, -348, 174, 99, 177, -95, 97, 102, 182, 43, -347, 87, 15, 138, 252, 13, 110, + 96, -208, 73, 19, 29, -56, -29, 129, 86, 5, -127, -1, -61, -66, 208, 96, -9, -28, -251, -216, -247, 66, 67, -256, 18, 17, -254, 16, 39, -34, 292, -36, -143, -36, 168, -14, -260, 282, 146, -180, 138, 27, 27, -5, 16, -70, -130, -123, 226, -15, -66, -11, 162, -150, -265, 9, 61, 50, -232, -120, 90, -21, 130, 49, -41, -39, -35, -18, 5, 206, 120, 75, 66, 80, 120, -57, -19, -65, -20, 23, 6, -36, -58, 61, 9, 27, -1, -37, 13, 32, -73, -13, 59, 13, 4, -27, + -8, -17, -32, 8, 30, 24, -21, 24, 2, 104, 402, 119, 322, -355, 14, -176, 6, 117, 136, -183, 80, -106, -93, -127, -205, -31, -484, -5, 161, -22, -33, 53, -254, 89, -242, -77, 250, 50, 87, 5, 74, 212, 193, 370, 193, -281, -23, 312, -43, -229, -34, 28, -104, 209, 156, -181, -52, 200, 214, -77, -135, 338, -139, -457, -308, 100, -459, -10, -137, 2, -42, -129, 172, 49, -45, -151, 132, -91, 244, 166, -66, -162, 35, 63, 23, 9, 58, -34, -179, -53, 250, -29, -101, -28, -52, -129, + -125, -70, -60, 14, -1, 124, -10, -46, 18, 44, -30, 26, -43, 84, -2, 52, 8, -82, -8, -9, -85, -24, -52, 39, 3, -14, 30, 13, -8, 15, -95, 20, 28, -391, 186, -34, 100, 130, 212, 48, -185, 253, -93, 113, -112, 94, -16, -460, -95, -79, -53, 32, -110, -76, 62, 101, 36, 249, 116, -240, -17, 1, -134, 286, -170, -165, 302, 317, -38, -4, -196, 71, 44, -103, 54, 197, 122, 237, -58, -185, 117, 28, 58, -221, -113, -130, 53, 127, 47, 34, 228, 272, 42, -129, 156, 127, + -191, 27, 34, -22, 24, -4, 164, -18, -126, 65, 215, 95, 127, 266, -180, 32, -61, 252, 145, 270, -129, -34, 46, -96, 15, 27, -29, 0, 64, 72, -26, 40, 29, 94, 84, -11, -6, -42, 13, -42, 23, -75, 75, -1, -28, -1, -5, 3, -25, -58, 83, -10, 15, -92, -74, -20, 80, -8, -7, 8, 164, -340, -203, 135, -79, -318, 162, -167, -144, 204, -61, -68, -50, 52, 152, 78, 82, 83, -126, -76, -26, 184, 96, -325, 104, 101, -135, 305, 281, 150, 12, -111, -71, 16, -94, -115, + -187, 27, -214, 155, 61, 1, 35, 82, 72, 166, 261, -99, -412, -72, -280, 96, 40, -374, 136, -157, 470, 155, -294, -11, 299, 155, -243, -146, 313, 179, -215, 266, -221, -294, 47, -445, 269, 288, -65, -268, -47, 105, 56, 44, 28, 206, -289, 93, 325, 5, 13, -285, 143, 79, -261, -66, -131, -63, 12, 81, 67, 9, -78, 7, -83, 35, 52, -12, -39, -29, 54, 16, -15, -45, -83, -11, -81, 164, -153, -1, -15, 62, 44, -90, 29, -29, 142, -19, 42, 3, -79, -9, 90, -1, -266, -197, + 6, -320, 1, -752, -237, -86, -411, -144, -86, -180, -139, 98, -198, -376, 100, 236, -384, -106, 118, 193, 331, 212, 195, 214, 77, 379, -226, -97, 80, -188, 71, 108, 199, 26, 325, 68, 80, 224, -99, -192, 3, -295, -189, -340, -14, -16, -448, 161, -203, 92, -423, 51, -320, 477, 24, -425, 510, 625, 175, -209, -155, 162, -55, -21, 184, -299, 194, -308, 163, -123, -174, 74, 164, -89, -10, 193, 50, -95, 108, -48, -177, 23, 164, -32, -66, 65, 47, 134, 26, 4, 57, -45, 93, 23, 77, 27, + 61, 50, 50, 40, -58, 64, -78, -72, 6, 42, 13, 21, 46, 30, 3, -25, -59, 0, -62, 162, -82, 146, 221, 32, 204, -115, 319, -248, -231, -608, -135, -315, -742, 186, -428, -260, -345, 95, -668, 179, 54, -128, -15, -192, -68, 160, -228, -162, 8, 122, -200, -16, 228, -366, -85, 214, -204, -13, 1, -58, 309, -271, 183, -123, 251, 266, -271, -361, 337, -37, 73, 88, 30, -78, 190, -103, -419, 109, 84, -362, -41, -129, 217, 265, 130, 45, -105, -257, 262, 163, 235, -16, -372, -87, -57, -162, + -92, -43, 106, 165, -144, -122, -369, -175, 70, 152, 40, -31, 168, 159, 94, 196, -61, 153, 69, 105, 17, 2, -102, -77, -19, 50, -25, -86, -109, -3, -19, 24, -74, 18, -89, 29, 146, 34, -85, -85, 186, 108, -24, -10, -237, -25, -4, -199, 4, -80, -63, 49, 61, 17, -24, -183, 902, 521, 35, -286, -683, -83, 318, -150, -276, -513, -30, -111, 17, -176, 164, -3, 446, 177, -188, -13, -81, 34, -94, 92, 276, -325, 62, -196, 128, -140, -238, -463, -39, 265, 88, -58, 97, -34, 252, 400, + -141, -91, -465, -503, 138, 74, -214, -184, -419, -287, 164, -54, 0, 21, -34, 191, 108, -343, 13, -313, -28, -169, -98, 332, 684, 1128, 41, 363, -342, -434, -611, -32, -3, 124, 128, -83, -772, 320, -132, -106, 47, -202, 22, -110, -315, 4, -127, 3, 30, 12, 221, 32, 24, -12, 8, -9, 95, 210, 61, -7, 44, 191, 4, 2, 71, -63, 23, -174, 58, 91, -165, 168, 9, 15, -50, -182, -60, 82, 0, -18, -47, 7, 330, 550, -272, 1, 106, -449, 4, -290, -281, 423, -124, -107, -227, 485, + 427, -1, 702, 78, 219, 154, -195, -229, -365, -193, 86, 3, 314, 24, -34, -58, 222, -321, -783, -275, 231, 72, -64, -234, 14, -378, -56, -345, -24, -44, -242, 232, 116, 441, -364, 683, 184, -134, -242, -125, 108, 393, -121, 225, -348, 280, -316, -356, 351, -509, 334, 279, 541, -552, 419, -53, 374, 145, -579, -102, -136, 161, -307, 912, -45, -323, 130, 421, 287, 197, 218, -30, 104, -38, -121, -78, 32, -5, -120, 33, -35, -186, -38, -72, 78, 97, 53, -27, 180, -30, 100, 39, 128, 47, -64, -81, + 22, -11, 88, -37, 9, 73, -45, 126, -60, -72, 36, -54, 134, 47, -39, 39, -381, -511, -1047, -322, -615, 171, -28, -210, -305, -290, -262, -284, -279, 29, -227, -41, -494, -757, 927, -289, 502, -96, 129, 159, 270, 178, -48, -16, -401, -91, -96, -270, -420, 163, -48, 592, -412, 10, 820, -199, -683, -221, 26, -310, 480, 220, -265, 194, 257, -160, -6, 129, 320, -13, -317, -312, 383, 273, -203, -439, 278, 322, -290, -395, 275, -501, 955, 204, -79, 38, 233, 51, -170, 14, 67, 342, -227, 67, -682, -614, + -70, 35, -69, -299, 214, 504, -16, 128, -49, 106, 151, 180, -197, 217, -103, -60, 143, 268, -82, -273, 75, -27, 43, -27, -148, -43, -153, -95, -188, 189, 193, -120, -2, 233, 72, -102, 47, 291, 191, 209, 211, 186, 68, 267, 140, 110, 98, 253, -394, 1, 145, 112, -259, 623, 439, 897, 495, 334, 129, -784, -65, 107, -463, -123, 886, 68, -515, -507, 459, -698, -182, 31, 186, 81, -134, 227, -317, 0, -65, -198, -45, -138, -458, 241, -397, 232, 205, 270, 47, 179, -167, 738, 97, -784, -691, 63, + 307, 600, -200, -470, -211, -62, 65, 352, 73, -277, 807, -994, -169, 188, -695, -358, -186, 102, -1125, -531, 799, -304, 230, -261, -910, -343, 432, -134, 165, 277, 568, -273, 59, -171, 354, 162, 149, 22, -19, 9, 307, 159, 179, -49, -12, 114, -215, -193, 78, 360, 164, 139, -359, 206, 655, -5, -13, -256, 173, 27, -160, -208, 21, 193, 222, 163, -211, 134, -144, 153, -271, -148, -61, -142, -179, -56, -437, -412, 59, -34, -76, 141, -14, -44, -5, 139, 465, -205, -1436, -385, 90, 393, 404, 347, 370, 639, + 1181, -683, 500, -182, -13, -184, -954, -731, -129, -55, 215, 366, 502, -166, -8, -265, 10, -57, 3, 498, 280, 159, 399, 452, -805, 392, -465, -610, -170, 376, 119, -416, 141, 38, 297, -38, -783, -577, -648, -663, 92, 529, -94, 1946, -1273, -975, 595, -183, -386, -143, -101, 11, -1192, 116, -83, 154, 921, -74, 325, 344, 442, 1496, -555, 1895, 534, -62, 255, 99, -779, -704, -8, -180, 102, 284, 238, -146, -666, -563, 225, -383, 247, 254, 598, 565, 533, 92, 189, -19, -21, 379, -59, -46, 130, -576, -129, 227, + 5, -69, 365, 124, -520, 350, -288, -421, -223, -139, 108, 159, 185, -230, 264, 97, 172, 61, 225, -102, 139, -352, -65, -860, 313, 1373, 40, 1433, 758, -89, -554, 1617, 243, -276, 210, -372, -109, -59, -99, 201, 452, 311, 60, 204, -325, -319, 98, -101, 532, 572, 367, -154, 36, -707, -441, -136, -482, -765, -453, 356, -441, -1346, -620, 403, -542, -389, 19, -106, 630, 920, 1218, -653, 346, -17, 40, -270, -806, -1615, -1059, 549, -1072, -571, 292, 536, -397, 605, 1760, 362, 340, -1341, -1787, -396, -557, -963, -273, -806, + 568, 314, 1598, 650, -186, -333, -556, 368, 725, 1438, 1011, -706, -1463, -724, -468, -875, -163, 727, 352, 901, 38, 637, 256, -222, -275, -325, 174, 385, 96, 504, 641, 377, 456, 199, 692, 599, 22, -26, 301, 677, -71, -198, -107, 574, 177, 14, -179, 353, 278, -105, 230, 276, 140, -79, 60, 193, 21, -351, 736, 1458, -778, 1104, 888, -150, -230, -504, 148, 984, 732, 1156, -510, -237, -242, -80, -317, 296, -389, 845, 358, -1411, -611, 3, 205, 596, -295, -539, 152, 156, -231, -271, 152, -407, -617, -286, 1315, 538, + 218, -680, -223, -578, 327, 633, 210, 34, 373, -233, 838, 471, 44, 272, -37, 1663, 339, -720, 266, 281, 161, 370, 17, -687, 800, 170, 133, 308, 142, -8, -504, 569, 651, 333, 1879, 1333, -728, -1461, -1023, -107, 122, -155, -1241, -620, -443, -515, -511, 453, 356, -136, 73, -116, -695, 194, -131, -43, -713, -688, -125, 285, 337, 38, 359, 151, 454, 62, 89, -779, -463, 327, 89, -217, 405, 170, 71, -375, 360, 493, 348, 357, 454, -102, 503, 1006, 796, 179, 112, -130, -174, -519, -655, 172, -72, -273, -1705, -224, + 423, 477, -393, 596, 182, -247, -643, 137, -161, -955, -310, -343, 62, -1313, -1032, -181, 633, -93, -208, -797, 5, 670, 21, -477, -282, -108, -277, 161, 213, -677, -759, 108, -38, 153, 1219, -761, -91, -56, -1214, -371, -891, -147, -87, 840, 945, 1163, 323, 189, -458, -1036, 29, 406, -368, 1429, 3352, 3220, 459, -2078, -1911, -756, -1207, 3952, 2440, 1529, 1991, -44, -1075, -2839, -1824, -714, -164, 1127, 2292, 2040, -257, -1710, -1041, -1550, -1220, 201, 1656, 2418, 930, -146, 124, -947, -1115, -1112, 371, 156, 274, 961, 510, -115, -637, -559, + -370, -875, -182, 363, -330, 5, -128, 578, 439, -816, -506, -1629, -1306, -1170, 728, 1285, 487, 319, -481, -852, -2532, -1885, -1129, 199, 694, 432, 97, -947, -785, -1490, -2450, -977, 278, 697, 1240, 559, -4, -692, -249, 881, -862, 994, 203, 100, -1582, -526, 1412, -948, 400, -9, -303, 422, 174, 737, 1195, -702, -911, 233, -549, 730, -953, -518, -597, 62, -151, -570, 269, 1116, -867, -985, -706, -235, -197, 1501, 107, -52, -1472, -390, 153, 1261, 565, -232, -2129, -1540, 1468, 1580, 1546, -708, -3561, -708, 1615, 1336, 213, -415, 235, -1443, + -851, 487, -417, 440, -257, 60, 1517, -1122, -585, 1254, 993, 1892, 808, -2525, 796, 2731, 592, 1384, 353, -765, -18, 1738, 1200, 2309, -3025, 417, -15, -341, 1206, 18, -1568, 136, -63, -327, 238, -11, -957, 838, -391, -29, 49, -234, 49, 121, -261, -357, -518, -779, 767, -46, 288, 638, -728, 341, -18, -1349, 16, 405, 1453, -394, -1994, -250, 968, 242, 858, -678, -546, -747, 351, -146, 533, -791, 402, 177, 251, -880, 110, 159, 630, -268, 155, -545, 224, -341, 546, -132, 443, -166, 218, -1778, 200, 319, 169, 1755, 295, -131, + -1121, -191, -111, -262, -12, -212, 449, 210, -331, -56, 697, 3, -40, 74, -175, -299, 390, 346, 262, -435, 228, 652, 255, -37, 420, -76, -499, 132, 126, -401, -438, 436, 423, -418, 267, 260, -5, -152, 2, 331, -19, -369, 192, 226, -687, 176, 507, 166, -447, 70, 314, -578, 156, 271, 114, -150, -552, 649, -703, -62, 675, 11, -117, 15, -636, 281, -10, 363, 672, -304, -49, -389, 514, -107, -59, 528, -689, -302, 381, 312, 136, -559, 192, -122, -36, 268, 203, 39, -144, -71, 25, 152, -490, 356, 72, -68, + 137, -64, 309, -460, -84, 10, 26, 46, 212, 141, -781, 413, -84, -91, -33, 159, 212, -193, -79, 363, -311, -40, -239, 173, 1643, 144, -201, -550, -365, 193, -245, 212, -327, -26, 261, -147, 123, 120, -456, 126, -149, -99, -376, 106, -106, -237, -110, 182, -164, -162, 232, -257, 130, 220, -457, 450, -114, -537, 285, 283, -251, 87, 163, -227, -203, 1, 30, 146, -74, -28, -226, 207, -177, -57, 260, -315, 91, -57, 1, -148, -203, -83, 354, -242, -92, 57, 75, 10, -214, 163, -96, -185, -5, -340, 496, -220, + 101, 109, -102, 172, -295, -241, 302, -149, -205, 202, -13, 56, -136, 36, -30, 92, -109, -85, 115, -67, -79, -22, 72, -47, -6, -38, 20, 69, -96, -98, 285, -84, -101, 89, -32, 83, -228, 15, -37, -7, -60, 266, 4, -234, 77, 26, -9, 2, 104, -67, -67, -30, -60, -30, 30, -73, -1, 22, -9, -816, -1334, 610, 4602, 706, 2299, -539, -2341, -850, -2282, -1501, -478, -250, 107, 1357, 1628, 2264, 2245, 715, -889, -1436, -2638, -2019, -1064, -413, -271, 815, 1364, 1056, 1437, 1395, 513, 453, 170, -1019, -380, -876, + -1520, -917, -889, -1316, -282, 617, 467, 1346, 1761, 919, 1173, 884, -125, -38, -84, -946, -1168, -1039, -1568, -1333, -473, -77, 188, 1088, 999, 965, 1213, 908, 311, 575, 314, -352, -169, -652, -1377, -826, -782, -1083, -523, -346, -610, 518, 974, 1128, 1795, 1693, 713, 422, -24, -611, -728, -748, -1092, -998, -919, -840, -527, -207, -2, 412, 961, 1201, 1114, 1348, 932, 454, 190, -154, -691, -778, -1089, -1417, -1431, -1134, -949, -141, 567, 1272, 1700, 1842, 1420, 929, 410, -107, -712, -1040, -1411, -1398, -1003, -655, -201, 258, 507, 675, 840, 728, + 451, 385, 135, -4, -130, -161, -214, -201, -297, -233, -188, -151, -162, -109, -123, -47, -7, 99, 123, 208, 217, 256, 181, 182, 139, 131, 21 }, + {-35, 188, -106, 32, -157, 44, 18, 240, -144, 0, -76, 120, 123, -78, -15, -67, -39, -79, -98, 72, 24, -64, 134, 122, 209, -6, 79, 41, -3, -188, 49, 78, -74, 47, -55, -64, -103, 54, 133, 14, 155, -63, -13, 157, 82, 13, -2, 149, 224, -166, 37, -57, -26, -259, -92, 105, -80, 73, 34, -38, -63, 37, -21, 81, 44, 38, 42, -134, 5, -64, 83, 137, 96, -19, 149, 1, 63, -19, -33, 8, 75, 86, -28, -58, -121, -15, -53, -57, -32, -48, -35, -57, -30, -1, 0, 2, + 48, -32, 25, -11, -23, 2, 22, 9, 18, 1, -16, 1, 23, 8, -33, -25, -1, 1, 14, 3, 25, -32, 112, -137, -144, 5, -194, 36, -61, 94, -52, -154, 17, 151, -23, 5, 210, 264, -114, -121, -34, -196, 84, 18, 49, -69, 105, -136, -25, 93, -77, -28, 14, 170, 11, 123, -162, 159, -17, 23, 103, -89, 86, -40, -41, 74, 98, -17, 56, -215, 130, 126, -228, -200, -57, -166, -47, 63, 41, 60, 4, -55, 140, -47, 5, -56, 33, -85, 119, 29, -92, -51, -36, -53, -47, 121, + 158, -7, -32, 6, 51, -33, 111, 63, -45, -8, -28, 48, -46, -1, -12, 7, 18, -3, -14, 30, -23, -8, 6, 20, 2, -40, -28, 8, -26, -22, 27, -14, -49, -31, -39, -10, 6, 47, 339, 65, -125, 157, 20, -107, 309, -208, -297, -174, -180, -61, 88, 109, -103, 156, -196, -107, -24, 65, 49, -60, -77, 175, 34, -12, -98, 130, -95, -22, 0, -11, -14, 51, 27, -27, 109, -51, 66, -5, -178, -70, -71, 189, -105, -127, -231, -270, -49, 14, -108, 205, 28, 110, -83, 177, 76, -103, + 286, -129, -138, 22, 179, 262, 186, 62, -91, -207, 82, -3, 204, 82, -58, -7, 104, 83, 2, -20, 9, -41, -86, -8, 27, 21, 74, -3, 45, -16, 35, -9, 7, -8, -50, 5, -9, -64, 52, -12, 32, -17, -35, 5, 6, -3, -23, 24, 10, -17, -5, -50, 6, -28, 25, -9, 54, -24, -320, 50, -116, 74, 22, 230, -296, -170, -217, 116, 98, 140, -155, 53, -45, 19, -241, -207, -151, -150, 246, -99, -28, -5, 84, -39, -256, 108, -101, -34, 120, 89, 138, 9, 74, -181, -73, 161, + 270, 157, -10, -205, 147, -66, -176, 245, 74, 84, -149, -88, 85, -56, -83, 129, -100, 45, 8, -171, -35, -113, 180, 91, -23, 30, -81, 106, 19, -3, 33, -204, -105, 115, 57, -34, -25, -145, 240, 295, 164, -135, 122, 21, 105, -45, 86, -65, 56, 107, 60, 51, 41, 2, -35, -12, 107, 5, 8, -40, -6, 22, 65, -8, 76, 12, 3, -3, 62, 74, -31, -14, -7, 11, 55, -3, 16, 4, 14, -27, -484, 161, 25, 120, 130, -94, -342, 264, 112, 260, -48, 138, -3, -93, -6, -242, + 296, 68, 28, -152, -88, -103, 88, -136, 227, 10, 78, 126, 70, -14, 73, 70, -53, 59, -252, 66, 115, 118, 226, 79, -151, 76, -76, 154, 30, 112, 172, 28, -38, 135, -93, -147, -54, 94, 239, -57, 15, 4, 29, 47, 100, 34, -63, -11, -85, 62, 20, -151, -133, 53, 84, 84, 150, -231, -124, -169, 199, -87, -123, 64, -113, -165, -59, 5, 177, -62, 57, -70, -41, -10, 54, 23, -31, -27, 34, 88, 30, 50, -24, -17, 60, -2, 5, 22, -41, 78, -24, -5, -36, -100, -15, -22, + -7, -1, -37, 4, 90, -22, -8, -17, -32, 119, 491, 261, 233, 340, 93, 62, -208, -7, -389, -70, 148, 108, 69, 90, 107, -84, -57, 223, 201, 173, -13, 24, -278, -241, -91, 176, 57, -37, 96, -162, 15, -84, 194, 152, 340, -34, 128, 107, -55, -178, 320, -186, -42, 145, 7, 82, 231, -74, 86, -223, -477, -265, -158, -64, 22, -19, -123, -256, -53, -184, 57, -4, 23, -289, -131, 187, 65, -11, -320, -290, 173, 31, 105, -213, -169, 11, -86, -181, -129, 102, -39, 47, 14, 127, 93, 44, + -65, 34, -11, -77, -76, 73, -31, 22, -49, -74, -13, -6, 66, -7, -64, 18, 25, 73, 15, 18, -31, 92, -35, 105, -57, 78, -68, 12, 41, 4, -5, 17, -16, -27, -248, 188, -110, -9, -647, -153, -239, -158, 26, 214, -42, 282, 150, -17, -278, -116, 415, 69, -248, -181, -82, 194, -151, 2, 134, 211, 239, -261, 176, 24, 50, 74, 97, 84, 239, 6, 73, -210, 293, -147, -69, 49, -243, 301, -47, -589, -194, -473, 29, -7, -143, 640, -112, -317, -107, -78, 294, -41, 141, 172, -120, 219, + 303, -154, 116, -270, 132, -97, -76, 311, -114, -30, -138, 8, 6, 119, 176, 186, -49, -53, 8, 241, 115, 125, 5, -197, 79, -96, -107, -59, -2, -6, 13, 44, 46, -12, 131, 21, 58, 23, 26, -37, 35, 13, -38, -58, -37, -99, -77, 68, 55, -84, 23, -5, 24, 94, 21, -37, 11, 31, 3, -76, 294, -411, 82, 84, -130, 55, 310, 332, 123, 119, 158, -257, -45, -274, -6, 175, 111, -58, -217, -70, 147, -284, 10, -20, 131, 271, 26, -146, -111, 290, -186, -90, 167, -103, -342, -124, + 78, 58, -137, 32, 178, 123, 172, -20, 130, 247, -108, 123, 106, -168, 365, -351, 209, 93, -488, 467, -302, 67, -54, 373, -158, -263, -56, 3, 68, 287, -243, -11, 18, 18, -43, 86, -198, -28, -141, -263, -292, 158, 128, 123, 3, 186, -85, -213, 56, -377, -315, -58, 93, -2, -58, -48, 46, -206, -68, -43, -33, 97, -9, 17, 9, -67, 35, -75, 7, 38, -82, -16, 72, -54, 2, -37, -1, 27, 4, -112, -16, 0, -4, -18, -67, -116, -26, -6, -14, 96, 73, -327, 259, -750, 411, -299, + -205, -367, 40, -44, 64, 262, -221, -85, 208, 190, -64, 74, -103, -344, -35, 86, -178, 277, 44, -33, -167, -162, 35, 427, 15, -60, 114, -369, -67, 135, -254, 359, 224, -13, -114, -121, -142, -246, -307, 255, 15, 453, 37, -24, -208, 38, -84, 102, -10, -286, -227, -291, -494, -68, 428, -413, -29, -432, 65, 122, 97, 309, -38, -445, 315, -31, -219, -180, -389, -132, -296, 161, -453, -75, 173, -3, 30, 215, 106, 258, -3, -139, -59, -95, -9, 95, -30, 17, 9, 10, -79, -109, 65, -76, 30, 14, + -19, 34, 8, 15, 151, 28, -13, 30, 45, 35, -82, -11, -168, 62, 81, 129, 42, 45, -6, -82, 46, -3, 321, -117, 285, -278, -149, 197, 62, -376, 24, 492, -566, 35, 264, 637, -273, -160, -70, 494, 483, -510, -25, -391, -188, 257, 257, 338, 191, -65, 236, -291, -158, -28, -45, -422, 37, -8, 560, -85, 276, 68, 164, 377, -227, -100, -554, 383, -488, -85, 112, -64, -282, -69, 80, -199, 55, -31, -43, -620, -440, 33, -319, -435, 81, -402, 129, 265, -237, 453, 95, 292, 311, 82, -230, -272, + -340, 177, -353, 214, 256, 354, 63, -249, -161, 9, 35, -465, -11, -300, -51, -83, 20, -219, 30, -48, -2, -142, -104, 37, 234, 27, -21, 34, -32, -84, -84, -91, -40, -108, 121, 91, -7, -89, 144, 217, -46, -34, -49, -19, -6, 56, -80, 88, 80, 58, -76, -8, 46, 66, 149, -300, 775, 325, 134, 400, -154, 85, -413, -530, 334, 684, 203, -2, -676, 816, 117, 101, 116, 31, 147, 48, -117, -4, 205, -125, 258, 51, -204, -281, -77, 259, -71, 85, -117, -102, 4, 732, 118, 107, 98, 63, + 438, -162, 126, -282, 522, 728, 189, -41, -259, 761, 357, 12, -294, 112, -176, -27, -337, -126, -225, -308, 499, -149, 368, 78, -287, -4, -615, 585, -42, -279, -218, -356, -439, -240, 681, -212, 245, 310, -275, -261, -491, 74, 331, 114, 316, -73, -62, 14, 90, -135, 38, -244, 80, -11, 277, 196, -150, 15, -8, 165, -56, -220, 49, -7, -18, 82, 15, -35, -110, -124, -23, -30, 131, -5, 131, -180, 44, 135, -254, -186, 68, -81, 191, 230, -171, -182, 723, 709, 876, 527, 174, -223, -231, 131, 255, 311, + -465, -14, -55, 233, 185, -323, -398, -2, -151, 379, 447, 0, 237, 78, 95, 515, -315, -417, 329, -547, 47, -169, 302, 154, 6, 353, 324, -295, 367, -1, -157, 87, 399, -154, 171, 296, 134, -638, -369, 63, 34, -433, -296, 144, 206, 175, -590, -412, -411, -33, 256, 373, -938, -689, 115, 144, 542, 191, 199, 395, -42, -101, -143, 969, 335, -153, -507, 463, 303, -152, -138, 71, -139, 247, -89, -53, 146, -36, -58, -76, 153, 397, 3, 28, 14, 173, 222, -57, -140, 60, -13, 44, 26, 34, -188, -103, + 133, 13, -77, 65, 185, 144, -249, -56, -166, -160, 118, -190, 74, -103, 185, -221, -307, -595, -579, -476, 184, -61, 269, -525, -87, 25, -203, -246, 427, -164, 86, -6, 30, -428, -158, -366, 49, 48, 95, 1012, -394, 280, 426, -216, -204, -306, -62, 473, -482, 330, -32, -80, 44, 48, 259, 29, -512, 392, -319, -735, -595, -298, 995, 844, -459, -132, -630, -526, -208, 614, 16, 424, 221, -289, 323, -220, -655, -55, -397, -81, -213, 1293, 12, -1071, 840, -339, -239, 850, 864, 3, -379, 169, 211, -1164, -501, 31, + -172, 609, 258, -882, -132, -70, 399, 255, 174, 158, -184, 32, 70, 369, -46, 51, 72, 63, 217, 103, 5, -252, 319, -29, -2, 15, 0, -136, -213, -146, 28, -52, 92, -15, -95, 101, 234, -313, -102, -96, -46, 89, -7, -90, -177, -66, -47, 159, -514, -320, 157, 122, 280, 881, 152, -23, 207, 46, -366, -225, 198, 45, 720, 170, -45, 261, 387, 392, 422, 23, -295, -82, -675, -92, -762, 425, -464, -179, 3, 618, -357, 344, -251, 209, -315, 394, 596, 41, -125, -321, -462, 259, 297, 756, -102, 38, + 334, 1211, -282, 181, -195, -674, 474, -96, 337, -42, 84, -406, 1120, -1679, 1237, -1927, 832, -994, 310, -780, 282, 517, -123, 384, -197, 1407, -853, 934, -1447, 730, -567, 703, -471, -511, -249, -130, 356, -97, -62, 35, 22, -181, 253, -272, 267, -197, 83, -314, -174, -232, 42, -213, 264, 281, -266, -4, 107, 258, -39, 92, 212, -198, 350, -97, 463, -275, 554, -395, 143, -32, 309, 256, -49, 150, -426, 486, -334, 118, -340, 246, -454, 156, -38, -167, 171, 429, 342, 1357, -944, 396, 248, -812, -23, -158, -232, -417, + -23, 50, 540, 203, 282, 408, 328, 14, 450, -518, -75, 627, 69, -856, -198, -1121, -210, 198, -208, -260, -49, 1005, 253, 79, 122, 253, -76, -574, -177, -62, 107, -131, -269, 729, 391, -149, -35, -155, -658, -538, -395, -326, 733, 179, 270, -440, -430, 140, 298, 277, -125, -85, -499, -327, 435, 22, -1207, 426, 658, 213, -527, -322, -263, 88, -379, 189, -890, -1187, 492, 431, -238, -435, 333, -194, 86, 105, -175, 192, -109, -110, -65, 287, -203, -58, -223, -1, 18, 192, 197, -21, 116, -139, 231, -160, 188, -436, + -200, -59, 126, -142, -286, -217, 103, 226, -9, 292, 81, 116, 17, 190, -108, 182, -44, -359, -278, -106, 163, -202, 119, -1119, 980, 1192, -112, 866, 35, 132, 377, -766, 278, 567, 559, 234, 173, -555, 405, 238, -337, 179, -67, 660, 182, 168, 390, -157, -450, 130, 841, -302, -164, 759, -279, -340, -277, 261, 977, 1359, -85, -882, 1333, 459, -879, 995, 381, -247, -256, -374, -620, -36, 325, -532, -348, -1122, -152, 652, -1359, -736, 214, 219, 268, 823, 729, -1207, 10, 46, -854, 238, 407, -439, -313, -371, 248, 949, + 297, 494, -649, 331, -735, 64, -495, -2009, 1537, 394, -560, 1039, -358, -474, 280, 212, 267, 406, 165, -408, -129, 398, -13, 153, 65, -66, 98, -179, 133, 373, 135, -220, -163, 114, -100, -200, 76, 232, 135, -695, -210, -511, -265, 298, -227, -286, 272, 175, -299, 380, -281, -123, 137, -221, 251, -112, -413, -637, 734, 2433, -777, 21, 187, 1099, 974, -319, -423, -614, 26, 466, -16, -314, -323, 440, -240, -591, -528, -107, 895, 627, -711, 48, 13, -310, 352, 130, -254, -84, -200, -95, 1141, -425, -758, -531, -431, 1010, + 28, -234, 930, 639, 254, 473, 915, -557, 141, 890, 520, 680, -772, -218, -29, 325, 307, -731, 70, -960, -1443, -76, -382, 670, 745, -196, -59, 151, -525, -1398, 941, -678, 145, -261, -473, -275, -549, -1110, 655, 583, 707, 137, -882, -1548, -460, -429, -190, 489, -317, -78, 93, 65, -246, -113, -198, 23, -89, 163, -98, -121, 179, 233, 185, -376, 122, 20, -34, 3, -824, 38, 113, 120, -543, 351, -79, -453, -370, 217, 289, -56, 171, -280, -197, -192, 21, 334, 84, 319, -9, 146, -480, -77, 115, 63, -380, -115, + -1195, -685, -557, -1407, 1625, -37, 856, -195, 43, -981, -536, -506, 114, 769, -35, -800, -598, -1144, -1273, 1092, 403, -990, -307, 489, 909, 128, -1128, -685, 222, 316, 280, 659, -701, -665, -102, -236, 93, 197, -1356, -249, -946, -605, -1262, -478, 1730, 299, 55, 425, 429, 136, 1285, 1017, -335, 346, 1735, -453, -404, -413, -1291, -49, -707, -1604, -1683, -882, -868, 395, -650, 58, 343, -1143, -419, 9, -4, 298, 750, 500, 904, 1225, 888, -107, -644, -934, -78, 389, 115, -129, -10, 268, 216, 578, -63, 94, 12, -189, 190, 32, + -91, 495, 215, 115, -459, 314, -163, 237, -435, -1212, -54, 483, -88, -641, -410, -467, -352, 158, 215, 245, 69, -38, 184, 480, 797, 754, 937, 804, -71, 543, 1222, 92, -528, -754, -758, -1030, -834, -392, -440, 1077, -705, 214, -816, -274, -890, 116, 1075, -23, 664, -1330, 1170, 395, -242, 931, 128, 424, -373, -437, -10, 286, 216, -928, 852, -1029, 125, 290, -351, 609, -642, -362, -73, -226, -326, -69, 136, -474, -562, -180, -100, -136, 339, 187, 137, -679, 180, 831, 1097, -808, -410, 936, 1275, -772, -480, 540, 224, -612, + 508, -1441, -286, 590, 1152, 152, -717, -644, 174, 1385, 119, 210, 40, 462, -90, 1031, -13, -1135, 717, -740, -229, 317, -436, 107, -927, -342, 857, 398, -386, -547, -302, 75, -447, -132, -100, -270, -169, -129, -580, 370, -218, -254, -841, -208, 617, -424, -237, -219, -481, 928, 378, 40, -31, -509, -769, 54, 687, 568, 188, -573, -338, -253, 335, 66, -513, -122, 33, 208, -457, -302, -269, 724, 369, 53, -444, -379, 403, 866, -7, -361, -522, -169, 235, 27, -116, 37, -96, -65, 75, -1734, -486, 297, -591, 1719, 1252, 827, + 433, 1162, 813, 276, 552, -1360, -1837, -252, 12, -469, 239, -85, -484, -598, -496, 952, 820, -658, -91, -89, -172, -232, -350, -497, -706, -131, 1231, -392, -693, -325, 1155, -539, -540, 1801, 634, 306, -443, -985, -696, -1016, 270, 845, 2266, -1992, -852, 1174, 1615, 287, -101, 2084, 992, -652, 658, -235, 4, -1436, -730, -499, -2364, -997, -384, 1276, -691, -394, 946, -59, -129, 231, 665, -641, 470, 727, 15, -133, -1336, 620, 476, -1537, -113, 171, 99, -127, -685, 187, 115, 197, -109, -193, 492, 110, -103, 344, 140, 911, -125, 302, + 57, -716, -628, 445, -350, 272, 338, 215, 209, 10, 598, -187, -150, -232, 171, 471, -702, -256, 337, 161, -398, -712, -183, 201, 1504, 552, -126, 390, -76, -139, -555, 266, 230, -437, -213, -1593, -65, 656, -154, -664, 291, -149, 717, 144, -347, -5, 767, -436, 123, 277, -233, -7, -415, 847, -51, 126, 14, 409, -185, -159, -265, 169, 318, -139, 378, -164, 233, -398, -313, 483, 619, -800, 38, 1, 75, 252, -503, 772, -691, 621, 87, -1078, -59, 841, -1097, 524, 5, 142, -263, -164, 222, -318, 1124, -832, 125, -223, + -101, 278, 16, -136, -26, 340, -10, -390, 110, 198, -653, 508, 230, 24, 469, -171, -145, 221, 102, 140, 80, -129, 264, 114, 20, -286, -47, 140, 254, -434, 227, 271, -384, 182, 56, 65, 203, -114, 45, -71, -556, -8, -134, 243, -157, 93, 61, -23, 74, 141, -92, 0, 25, -4, 40, 169, -173, 159, -126, -802, -2264, -3234, 1088, 2877, 635, 7975, 6569, 4439, 7512, 3914, -268, -938, -2968, -6853, -5660, -5504, -7654, -5659, -1663, -1227, -202, 2661, 1238, -331, 1687, 2791, 1366, 1306, 2538, 1511, 1164, 2298, 3610, 1501, 2118, 3390, + 580, 228, 2997, 1772, -1152, 1445, 1862, -1949, -584, 2147, -438, -1292, 2773, 1467, -1728, 1486, 1972, -2641, -2472, -1059, -6368, -8447, -5300, -7467, -9952, -6937, -7099, -9177, -7260, -5037, -5461, -3268, 304, 2030, 4422, 7240, 9028, 11120, 12357, 13501, 14317, 12856, 10107, 9336, 5982, 1804, 1415, -964, -4603, -3617, -1540, -3426, -3522, -751, -2483, -4751, -2872, -2085, -4250, -3620, -1284, -3219, -3824, -312, -198, -1729, 675, 390, -2780, -2063, -1201, -3953, -5442, -4451, -6076, -7532, -5588, -4490, -4258, -1870, 858, 2246, 3337, 4613, 5207, 4668, 6092, 7818, 8107, 7572, 7714, 7440, 6035, 6816, 6147, 2618, + 308, -1557, -3372, -3556, -2936, -3443, -3351, -2897, -2831, -2976, -2421, -2136, -2005, -1880, -1457, -1370, -1383, -1115, -772, -738, -609, -424, -328, -295, -62, -95, -39 } + }, + { + {124, 296, 5, 12, -142, -113, 85, 52, 8, 121, -183, -62, 296, 20, 58, -78, -100, 139, 116, -49, 114, 5, 18, -113, 40, -103, -80, -101, 34, 4, -33, -12, 34, 88, -42, -161, 2, -115, -147, -39, 66, -23, 59, 37, 54, -23, -21, -28, -24, 49, -2, 102, -14, 126, 21, 28, 120, 43, 30, 155, -63, 51, -54, -110, 100, -37, 0, 37, -19, -91, -28, 65, -43, -2, -89, 43, 6, -59, 7, -94, 14, -91, -9, -1, -13, 52, 25, 14, 28, -10, 52, 38, -5, 12, 11, -2, + 1, 17, -23, 12, -29, 24, 2, -4, -2, 20, 5, -19, 6, -1, -11, -28, -389, -202, -91, -84, 0, 1, 29, 6, -22, -159, -72, -163, -256, -214, 121, 149, 150, -59, -18, -17, -34, 55, 23, -54, -116, 83, 71, 104, 27, -35, -64, 30, 50, -12, 106, -52, -3, 103, -79, -125, 10, 173, 40, 38, 24, 1, 22, -27, 31, -137, 22, 142, -33, 2, 14, -48, -27, -20, -23, -38, 87, -81, 85, 72, 159, -11, 89, 203, -38, -164, -184, -9, -24, 10, -156, 45, -110, -82, 37, 114, + -47, -87, -104, -20, -12, 29, 9, 65, 39, -4, 33, 9, 64, 49, 31, 14, 14, -11, 43, 2, 13, -5, 1, -33, 0, -6, 270, 213, 91, 109, -71, 49, 187, 92, 201, -78, 81, 116, -6, 148, -77, 93, 17, -94, -24, -17, -6, -26, 11, -47, 15, -34, 184, -42, -10, 0, -83, -234, 133, -55, 51, -93, -88, -99, -66, 61, 177, 140, 59, -10, -38, 56, 127, -28, -42, 158, -70, 76, -78, -61, -38, 59, 62, -110, -76, 3, 118, 153, 83, 119, -16, 112, 44, 118, -66, 47, + 269, 125, 114, -27, -76, -183, 106, 46, -76, -76, -25, 56, -56, -25, -50, 2, 38, -16, -75, 22, 26, 43, 45, 6, 63, 31, 26, 20, -21, 45, 4, 0, -22, -33, -36, 9, 26, 11, 2, 8, -2, 40, -55, -13, 16, -22, 22, 84, 310, 44, 113, 225, 4, -128, -55, -39, 9, -81, -221, 89, 7, 5, 92, -146, -68, 231, -57, -87, -137, 5, -129, -21, -43, -39, 17, 186, -6, -58, 55, -148, 198, -25, -45, 248, -143, 12, -169, -77, 14, 8, 65, 79, -151, 45, 63, 52, + 14, 71, 52, 104, -96, -51, 196, -81, 75, 19, 56, 51, -17, -66, -10, 138, -82, -9, -44, 32, 124, -69, -154, -298, 19, -12, -26, 1, -115, -80, -166, -65, 83, -3, 52, -20, 104, 72, -1, 54, -4, -6, 36, -64, -34, -52, 0, -62, 37, -2, 18, -23, -20, -2, -22, 15, 24, -58, 28, 24, 14, -55, 30, 20, 52, 55, -5, -19, -29, 28, -14, -10, 11, -132, -335, 170, -112, -187, 6, -354, 75, 111, -42, 262, -102, -311, 73, 121, -111, -220, 376, -22, -25, 98, -86, -46, + 36, -183, 106, -18, 51, -37, 175, -43, 97, 89, -177, -84, -101, 184, -93, -52, 136, -46, -105, 82, 251, -127, 121, -131, 164, -90, 85, 19, -92, -258, 143, 189, -20, -58, 105, 133, 125, -177, -23, -156, -17, 57, -112, 44, 121, -130, -5, 27, -128, -90, 116, -83, 91, -53, -164, 34, -159, 42, -61, 56, -175, 161, -132, 18, -123, -3, -9, 34, -15, 0, -40, 43, -119, 42, -98, -76, 1, 71, 32, 14, 20, 5, 40, 91, -77, 75, -50, -9, 46, 39, -55, 0, -134, 170, -187, -186, + -318, 134, 337, 51, -60, -29, -56, 293, -176, -161, -38, -177, -54, -192, -83, -135, -266, -75, -59, -10, -29, 69, 159, 56, 79, -245, 31, -4, -76, 85, 46, -72, -31, -175, -193, -28, 215, -63, -110, -24, -71, -151, 3, -158, 322, 271, 71, -83, -75, 28, 49, 55, 53, -20, 120, -114, 53, -100, 4, -1, 68, 47, 151, -65, -92, -85, -349, 11, 73, -35, 127, 55, -105, 30, -183, -68, 16, 140, 61, 192, 39, -23, 2, 71, -79, -10, 19, -33, 50, -69, 37, -52, -42, -9, -58, -58, + -71, -38, -20, 54, 46, -53, -76, -23, -58, 41, -64, 32, -37, -11, 66, 5, 55, -329, 53, 335, 316, -340, -310, 80, -247, -131, 35, -17, -101, 254, 113, -359, -29, 21, -4, 229, 85, -167, 241, 90, 31, -130, -138, 103, -89, -243, -45, -32, -109, -145, -197, 208, 14, 31, -137, 3, 147, -117, -248, -250, 262, 59, 247, -40, 70, 182, 370, 120, -48, -190, -82, -94, 55, 20, -149, -60, 215, 152, 292, 137, -204, -194, 241, 129, -129, 1, 249, 19, -15, -194, 213, 161, -39, 299, -46, -86, + -314, -41, 14, 166, -217, -13, 95, -53, -156, -145, -21, -14, -30, -182, -162, -95, 56, -3, -76, -25, -12, 16, 14, 27, -17, 61, -52, -13, 0, -36, -122, 8, 68, -22, -108, 9, -27, 38, 4, -13, -11, 35, -18, 65, 32, -2, -61, 44, -48, 55, -135, 53, -50, -27, 165, -274, 165, -180, 32, 144, -2, -73, 54, -189, 7, -147, -426, -131, 180, 116, 66, -104, 87, 39, 454, 78, -154, 169, 33, 36, 302, -88, -85, 105, -214, 256, 236, -6, 134, -51, -131, -18, -165, 13, -161, 62, + -3, 46, 18, -276, -57, -36, 15, -140, 60, 60, -53, 362, -159, -324, 192, 317, 72, 81, -141, 272, -93, 45, 122, 35, -124, 129, 56, 15, -1, -250, -88, 122, 221, -87, -164, -228, -74, 76, 41, 113, -280, 52, 188, 24, -11, 71, -59, -32, -8, -16, 98, -28, 31, -30, -21, -22, -72, -41, 34, -51, 68, -11, -12, -33, -40, -213, 20, 113, -6, 39, -20, 70, 24, -42, -49, 39, 928, -254, 6, -94, -59, -207, -5, -544, 283, -196, -14, 315, 156, -209, -224, -84, -192, 173, -450, 83, + 186, 257, 50, 76, 10, 42, -60, -142, -411, -61, 52, 188, -148, 182, 71, -75, -27, 141, -149, -141, -82, -108, -17, -365, -171, -88, -11, 288, 64, 275, 94, -13, -174, 20, 16, 41, 94, 385, 44, -361, 92, -142, -11, -137, -153, -72, 147, 95, -640, -241, -191, 120, -28, -138, -89, 360, -149, 277, -262, -198, -284, -155, -302, -48, 401, 93, -49, 47, 170, -5, 209, -120, 80, 116, 142, 55, -26, -280, -105, -145, 1, 89, 77, -58, -21, 116, 48, -94, -40, -66, -30, 4, 59, -50, -49, 148, + 125, 38, -19, 53, 102, 6, -93, -11, -95, 22, -86, 48, -143, -156, 116, -289, 17, -677, 164, -221, 66, -230, -501, -76, -117, 356, 150, 129, -13, 472, -355, 88, 133, 365, -420, -238, -84, 36, -29, -118, -39, 127, -226, 47, 133, -24, 18, -181, -209, -128, 563, 7, -137, 221, -136, -282, -233, -152, -41, 102, 21, 21, 312, 288, -52, 104, 69, -359, -248, -14, -29, -93, -246, 304, 365, -298, 197, 187, -59, -284, -462, -446, -346, -202, -399, 38, -327, 198, 177, 31, 4, -556, 37, 13, 41, -284, + 96, 319, 43, 83, -252, -154, -31, -264, 62, 168, -78, -96, -122, 106, 169, -293, -161, -12, 198, 76, -86, 72, -10, -1, 89, -54, 115, -129, -46, 98, 84, -30, 222, 17, -138, -115, -19, -94, -87, 15, 63, -276, -234, -160, -184, -56, -415, 19, 450, -158, 236, -94, 449, 383, 156, -468, -123, 627, -164, 465, 70, -444, -228, 525, 8, -352, 5, -300, -44, 107, 40, -60, -525, -463, 125, 336, -301, -26, 128, -22, 48, 558, 100, 81, 46, 185, -250, -175, -130, -588, -202, -221, -155, 155, 101, -37, + -61, -232, -355, 460, -102, -404, -192, 82, 306, -244, -79, -259, -51, -310, -62, -66, -625, 57, -212, 432, -113, -351, -663, -436, -84, 55, 230, -171, -158, -360, 328, 556, 58, -66, 188, -145, 208, -157, -77, 72, 159, 115, -195, 7, 40, -3, -15, -49, 52, 198, -84, -174, -8, -39, 90, -2, 192, 13, 70, 7, -118, 31, -47, 206, 12, -131, -25, -32, 138, 14, -151, -24, 107, -49, 26, 215, -760, -389, -261, -417, -222, -171, -431, 453, -131, 685, -345, -518, -100, -348, 590, -204, -311, -145, 158, 299, + 258, -63, -69, -136, 65, 485, -13, 46, -156, -62, -254, -84, 113, 83, -210, 9, -311, 62, -93, -94, 127, 59, -145, -59, 267, 99, -220, -291, 485, -24, -771, 400, -85, -328, 156, -49, 36, -76, 268, 103, 28, 739, 731, -259, 80, -551, -116, -107, 234, -86, 38, 224, -166, 422, -179, 45, -573, 237, -149, -403, 202, -95, 807, 190, 154, 296, 34, -283, -22, -118, -69, 79, -99, 162, 101, -125, 206, 114, -134, -38, 13, 19, -55, 42, 73, -22, -60, 12, 65, 36, 49, -132, 133, -262, 232, -155, + -88, -20, 121, 169, 47, -200, 3, -82, -46, 45, -188, -348, 915, -686, -219, -434, -288, 348, -394, 841, -98, 258, 47, 205, -521, 97, 138, -37, -78, -44, 155, -319, -194, -44, -90, -395, -351, -93, -162, 480, -124, -226, -163, 166, -245, -103, -425, 200, -162, 177, -150, 225, -113, -734, -374, 110, -57, -44, -229, -437, -24, 194, 130, -99, 145, 226, 697, -298, 331, -783, 50, 116, -92, -224, 160, 30, 37, 176, 554, 376, 284, -148, -178, 274, -333, 82, 281, -198, 693, -11, 215, -189, 400, -380, -374, 12, + 140, -172, -42, 432, 4, 394, 144, -61, -62, -225, -18, -12, 111, -15, -180, 31, 81, 223, -326, 56, -166, 69, 186, -64, -5, -171, 56, 63, -111, -393, -246, -156, 76, -208, -118, -140, -125, 78, 151, -5, 126, 48, 67, 22, -285, 240, -210, 367, 1083, 767, -206, -480, -325, 658, -781, 42, -198, -192, 320, -573, 77, -293, -7, -399, -308, 46, 21, 16, -385, 614, 125, -275, 111, -81, 54, 914, 289, -255, -225, 44, 284, 76, -684, -168, -473, -158, -221, 231, -127, -65, -4, -24, -335, -390, 254, -148, + 69, -18, 341, -277, -197, 87, 143, -366, 409, -256, -596, -556, -198, -160, -241, -125, -847, 299, -402, -128, -335, 470, 153, 225, 0, -72, -410, -124, 555, -456, 672, 512, 181, -121, 24, -95, 97, -297, -237, -148, 42, -41, 43, 125, -214, -54, 218, 226, -88, 140, -119, -194, -84, -61, 145, 38, 55, -192, -124, 65, -69, 61, 81, 135, 270, 106, 153, -182, -102, -63, 81, -89, 39, -83, 41, 271, 132, 72, -49, 170, 58, -73, -1068, -132, 712, -873, -347, -21, -267, 317, -181, 987, -98, -215, -163, -44, + 290, -196, -189, 806, -589, -72, 189, -130, 506, 284, -33, -63, 216, 286, 314, 255, 535, 170, 231, 139, -171, 892, 114, 166, 228, 133, 646, -46, 161, 222, 188, 105, 427, -252, -201, 423, -76, -428, -108, -747, -252, -144, 709, -669, -84, 28, -21, -39, 419, 1140, -197, 142, 132, 172, 547, -591, -604, -552, 975, 71, -364, 893, -339, 778, -418, 298, 35, -1037, -149, -260, 298, -22, -88, 6, 188, -29, -312, 168, 6, -147, -2, -276, 371, -41, 134, -177, -158, -158, -209, -21, 7, 353, -15, 38, -141, 38, + -334, 106, -322, -61, -69, -289, 154, -229, -229, 50, -319, 97, 256, 238, -120, -114, 62, 96, 223, 283, 633, 58, -638, -1875, 376, -450, -725, 813, -487, -250, -715, 186, -142, -698, -226, -414, 196, -384, 20, 150, 315, 160, 533, 84, -3, -54, -447, -343, -318, 259, 398, 186, 142, -11, 154, 312, 727, -343, -190, 128, -329, 351, 77, -317, 741, 271, -622, 247, -598, 72, 115, 316, -169, -201, 941, 366, -403, 246, 498, -384, -818, 456, -65, -8, 69, 201, 1273, -117, 160, 245, -3, 294, 172, -674, 145, -358, + -313, -188, 155, -1089, -132, 342, 55, 544, -397, 386, -259, -112, -145, 174, 77, -131, 2, 1, -192, 156, -242, 258, 36, 181, 154, -108, -89, 47, -67, 39, 61, -105, -37, -121, -85, -79, -217, 6, 32, 129, -69, 124, 298, -153, 50, -154, 80, 96, -249, 4, 82, -235, -116, 208, 3, 43, 47, 9, -580, -668, 1432, 306, -93, -173, 323, 1295, 594, 155, -38, 434, 1082, 269, 373, 337, 771, -497, 499, 222, -1481, 439, -209, 439, -461, 348, 231, 460, -4, 195, 72, -419, 209, 417, -349, 210, -339, -204, + 1061, 109, 940, -668, 293, -34, -135, -21, -82, 146, 344, 240, -26, 538, -856, -806, 585, -459, -119, -107, -553, 279, -146, 158, 85, 909, 441, 479, 179, 129, -827, -190, 407, -8, 10, -1, -266, -720, 137, 67, -540, 76, -259, -213, 226, 152, 816, -117, 207, 195, -158, -211, -23, -201, -78, 480, 200, 86, 23, -9, 11, -7, -29, -327, -101, 199, -58, 19, -122, -166, -68, 52, 390, -261, -252, 229, 111, -293, 205, 123, -208, 260, 20, -157, -74, -109, -50, -51, 128, 64, 64, 147, 215, 159, -44, 372, + -1298, 1107, -467, 219, 717, -1038, -27, -84, 253, 395, 451, 784, 131, -494, 276, 835, -1176, -685, 790, 47, -6, 44, 68, -14, -20, 411, 248, -557, 36, -152, 982, 601, -201, 66, 118, 129, -7, 364, 36, 281, 1003, 146, 105, -145, 257, -947, -413, -394, -43, 108, -842, 337, -747, 258, 773, -164, -697, -369, 287, -133, -1423, 392, -994, -214, -124, 35, -399, 103, 501, -411, -945, -1418, 1109, 338, -174, 317, -336, 339, 615, -639, 1102, 152, -117, 512, 290, -177, 284, 21, 307, -299, -159, 83, 222, 382, 114, 344, + -228, 196, 358, 318, -54, 289, -312, 123, 29, 133, 597, -400, 237, 32, -23, 466, 127, 607, -80, 300, 79, 236, 67, -125, 181, -314, 270, -116, 224, -54, 60, -26, 45, -5, 235, -54, -59, -32, 99, -12, -27, 11, 47, 32, 39, -30, 38, -35, 36, 24, 42, 1582, -1703, 689, 866, -1067, -329, -574, -316, 1572, -708, 1116, -524, -150, -284, 366, 137, -1360, -260, -360, 583, 31, 242, 473, -668, -122, -429, 239, 549, 346, -863, -148, 165, 117, -60, -401, -174, -771, -148, -104, 706, -629, 1549, 346, -462, 690, + 18, 896, 480, 850, 201, 777, 624, 760, 791, 125, 765, -983, -177, 212, -657, -108, 404, -761, -1128, 456, 723, 29, 163, -780, -216, -652, -30, 757, 58, 1410, 633, -349, 1478, 790, -440, -163, -315, -464, -302, 369, -214, -722, 117, 517, 17, -232, -193, -145, -247, -434, 76, -95, -60, -333, -33, -112, 149, 252, -75, 57, -99, -258, 172, -62, -207, -494, 233, -684, -97, -471, -294, -381, -102, -51, -142, -263, -135, -301, -58, -25, -24, -198, 318, -242, 151, -2211, 2016, -458, -668, -589, 1398, -1061, -168, -305, -9, 748, + -831, -77, 335, -252, -107, 19, -469, 669, 44, -1096, -270, -267, 74, -1200, -4, 141, -232, 8, 334, 737, -300, -189, 165, -497, -1535, 131, 1231, -627, -943, 63, 995, -463, -288, -1282, -201, 24, 920, 421, 123, -967, -546, 758, -905, 320, 1513, 851, 1174, -565, 686, 432, -1304, -482, -698, -174, 775, -37, 838, 676, -1296, 1450, -878, -4, 79, -667, 1438, -97, -329, 1150, -932, -162, -1331, -456, 613, -190, 555, 592, -135, -234, 104, -327, -375, -107, -275, -168, -223, 95, -277, 55, -351, -350, -307, 259, -180, -32, 184, 43, + -61, -382, -592, -384, -772, 569, 239, 492, 179, -421, -426, -224, -58, 625, -129, -4, 85, -100, -101, -54, -234, 436, -274, 560, -3, 1318, 935, 138, -252, -685, 401, -54, -61, -43, -23, 3, -262, 332, -6, -1177, 296, 106, -407, 16, 509, -171, 35, -851, 620, -303, -91, -86, 353, -461, -16, 105, 15, 98, -218, 630, -329, 1111, -683, -729, 687, -770, 41, 574, -531, -237, 307, 358, 475, -1695, 541, -16, -387, 1075, -538, 66, 7, -912, 1170, -56, -50, -614, -109, 964, -223, -36, 40, 278, 162, -1191, 589, 1061, + -556, 425, -830, 1392, 64, -1300, 20, 725, -72, -807, -180, 1896, -294, -781, 133, 836, -215, -261, -97, -37, 51, 38, -211, 552, -88, -129, 32, 189, 464, -138, -225, 255, 59, -428, -155, 230, 54, -179, -95, 369, -334, -67, 59, 53, -315, -128, 411, -22, -293, -125, 298, -87, -220, -188, 261, -739, -2449, -3713, 250, 3212, 50, 8404, 7618, 4561, 8797, 5772, -955, 333, -1130, -6930, -3935, -3050, -6768, -5565, -1642, -3267, -3751, -307, 222, -1588, 346, 1431, -1834, -1560, 2452, 500, -596, 1712, 2299, -4, 2358, 3992, 1430, 1093, 4071, 2750, + 329, 2987, 4409, 1934, 2253, 5026, 1906, 681, 4800, 4722, 1457, 5688, 8091, 3011, 3318, 5637, 1716, -1833, 318, -1882, -6803, -6491, -6930, -11132, -12032, -12869, -15219, -15924, -15556, -15143, -13333, -11969, -9787, -6470, -4618, -1598, 4395, 7130, 7043, 13041, 13906, 10820, 13183, 13806, 7408, 7727, 9476, 4596, 3717, 6146, 4460, 2092, 2902, 3885, 1651, 1344, 3904, 2058, -363, 2132, 1666, -1234, 160, 1531, -1029, -457, 2884, 1129, 97, 2767, 1813, -292, 134, -1238, -4110, -5588, -6173, -8092, -8653, -8648, -9364, -9457, -9903, -9941, -9090, -9037, -7590, -5871, -4652, -1961, 1669, 3599, 6016, 7515, 7947, 7548, + 6864, 5801, 4683, 4045, 3514, 2840, 2528, 2411, 2158, 1962, 1999, 1797, 1431, 1141, 865, 478, 306, -9, -295, -476, -560, -393, -89 }, + {90, 291, 65, 42, -66, -24, -144, -6, -37, 108, 96, -97, -69, -58, -55, -69, 8, 86, -68, -73, -240, -177, -130, -6, 13, 176, -97, 87, 54, 45, 11, -132, 34, -280, 34, 9, 13, -19, -173, -79, -149, 9, 10, -90, -232, 159, -11, -136, -1, 90, 20, -47, 33, -77, -33, -73, 56, -78, 109, 88, -18, -154, 8, 21, -14, -57, 39, 27, -35, 83, 91, 63, 6, 0, 29, -84, 12, 129, 15, 25, 24, 95, 37, 30, 86, -21, 67, -26, 44, 31, -12, 18, 25, -8, 31, 48, + 11, 1, 34, 45, 36, -5, 14, 15, 18, 5, 3, -4, -11, -36, 23, 3, -310, -348, -25, -137, 106, -170, 43, 79, -116, 95, 348, 20, -32, 191, 26, 192, 3, 88, -137, -181, -10, 69, -126, -40, -13, -35, 35, -37, -67, 63, -31, -26, 137, 195, -61, -105, 39, 156, 59, 200, 8, -28, -5, 179, 11, -127, -70, 141, 102, 109, 30, -69, -144, 29, 68, 85, -31, -75, 156, 105, -26, -87, 5, -60, 162, 50, 30, 53, 18, 34, 100, 18, 100, -19, 160, 20, -158, -62, -55, 80, + 98, -15, 26, -110, -40, -102, -31, -66, -57, -23, 33, 3, 1, 5, 44, 8, 10, -4, -47, -12, 2, -4, 19, 8, 8, -17, 182, 128, 192, 200, -48, 100, -43, -113, -11, 297, 130, 66, 106, -124, 211, 91, 142, -42, -235, 99, -366, 74, -93, 74, 58, -7, -126, 31, 82, -49, 77, 186, -13, -154, -210, 33, 94, -193, 107, -181, -118, 132, -77, -153, -75, -108, 170, 233, 132, -83, 1, 125, 74, -10, -95, -45, -83, 89, 288, -2, -156, -123, 67, 24, -58, -170, -3, -146, -57, 23, + -25, 116, 22, 146, 169, -148, -55, 9, -116, -139, -22, 1, -85, 82, -77, -9, 64, 13, 5, 64, -78, -27, 19, 30, -35, 26, 14, 29, -4, 0, 29, -40, 51, -40, 25, 8, -11, -3, 23, -16, -27, -45, 28, -33, 12, 43, -6, -27, 408, -110, 40, 58, -269, -230, 6, 267, 204, 323, 106, -91, -139, 24, -80, 64, 31, 109, 201, 64, 148, -4, 88, -89, -187, -98, -143, 2, -40, 44, -227, -114, -30, 84, -112, 236, -266, 57, -167, -136, 77, 68, 228, -25, 58, -65, 159, 168, + 47, -36, -171, -24, 59, -131, 132, -144, 62, 239, 200, 3, -77, 37, 239, -30, 59, 37, 195, 2, -52, -121, 85, -183, 67, 380, 93, 179, 18, -252, 91, 47, -99, 103, -32, -27, -125, 52, 123, 55, 24, -57, -123, 28, -25, -19, 8, -6, -23, 40, -42, -38, -36, 56, 22, 44, -25, 41, 2, -40, 43, 23, -36, -68, -25, 56, 3, -15, 28, 25, 61, -3, -24, -149, -255, 128, -182, -187, 39, -91, -599, 58, 93, 549, 178, 41, -249, 229, 99, -100, 120, -21, 200, -120, -62, -41, + -53, -83, -36, 141, 124, 214, 77, 105, -2, -139, -151, 203, -111, 45, -18, -143, 206, -34, -89, 36, 150, -100, 228, -289, -239, -293, 71, -165, -250, -58, 234, -99, 70, 139, -100, -132, 11, 21, 78, 14, -73, -9, 302, 128, -123, -380, -303, 111, 359, 301, -235, 6, -154, 68, 60, -258, -20, 51, 30, -70, 15, 15, 8, 87, 80, -52, -63, 42, -30, 19, -90, 36, 27, -144, -32, 30, 22, 11, 28, -10, 10, 10, 14, -53, -7, 18, -17, -64, -32, 8, 10, 68, -107, 177, -298, -50, + -370, -107, 55, 130, -337, -83, 231, -27, -338, 176, -108, -192, 106, 179, 40, 38, 61, 233, -110, -95, 61, -113, -58, 4, -13, 9, 185, 96, -22, -15, 108, 47, 133, -10, 150, 160, 63, -173, 25, -23, -124, 168, -95, 71, -115, -41, -413, 39, 336, 31, 357, -65, -80, -366, 431, 204, 245, 41, 201, -1, -2, 169, -98, 62, -1, -411, 95, -96, 109, -61, 98, 383, 115, 102, -5, -231, 174, -94, 35, 88, 115, -127, -34, -52, -69, 75, -43, -33, -54, 9, 14, 6, -107, 43, 19, -24, + 31, 15, 27, 23, 51, 1, 11, -6, -25, 64, -12, 91, 14, 38, -28, 50, 17, -474, -16, 357, -78, 211, -228, -157, -410, 234, 122, 272, 127, -134, 229, -58, 219, -145, -134, 16, -49, 190, 40, 160, 179, -108, -91, -64, 118, -25, -76, 24, -161, 83, 57, -85, 119, 209, -84, -96, -25, -159, -77, 241, 33, -150, 293, -323, 51, 172, -74, -107, -24, 137, -246, 123, -100, -212, -158, -128, 5, -61, -134, 57, 364, 200, -49, -126, -351, 36, 196, -115, -388, 10, -60, 19, 50, 178, -10, -92, + -34, -143, -83, -68, 108, -89, 100, -208, 18, -96, -62, 125, -59, -60, -71, 25, -131, -54, -29, -6, 30, -95, 28, -76, 43, 48, 110, 19, 41, 56, 45, -32, 19, 6, 82, 46, -7, 48, -3, 3, -32, 4, 2, -58, 18, -41, -29, 3, 45, 158, -70, 40, 233, 15, 273, 296, 661, 451, 277, -70, -351, -122, 321, 139, -339, 253, -59, -168, -207, 31, 572, -388, 413, 161, -89, 136, -112, 296, -114, 156, 31, -205, -144, -200, 8, 169, -49, -113, 109, 14, -34, -387, 117, -217, -164, 107, + 255, -189, -271, 9, 230, 19, -155, -58, -92, 105, 76, -89, -146, -220, 136, 352, 216, 111, -204, 106, 223, -250, -327, 57, -270, -129, -529, 7, -363, -189, 98, -46, -35, 161, 27, -297, -206, 134, -41, 16, -92, 9, 87, -13, 57, 58, 12, 5, 43, 50, 33, 4, 10, -30, 78, 2, 72, -13, -48, 23, 67, -84, -124, -63, -18, -39, 141, 53, -44, 62, -36, 9, -113, -10, 8, -52, 723, 16, -283, 319, -349, 404, 33, -246, -421, -102, 207, -335, 297, -48, 192, 228, -196, -82, -118, -156, + -61, -146, 24, -178, 186, 117, 156, 316, 163, -47, 377, 192, 70, -202, -220, 113, -168, 39, 119, -252, 216, 574, 44, 408, 193, 197, 292, 17, 155, 163, -371, -252, 256, 17, 242, 43, 254, -41, 92, 63, -531, -35, 137, 356, 80, 312, 32, -74, 103, 140, -298, -505, -266, 69, 125, 17, 371, 131, -581, 148, -84, 3, 168, -233, -7, -126, 107, 150, 10, 32, 109, 4, 0, -50, -55, 20, 12, 4, 91, 66, 24, 55, 36, 2, -88, 71, 59, -35, -7, -12, 5, 52, 44, 138, -114, -33, + 53, -28, 74, -57, 122, -28, -35, 18, 71, 50, -15, -7, -349, -32, -310, -148, 133, -159, 72, 105, -185, -467, 152, -463, -528, 114, -259, 233, 337, -87, 392, -96, 388, 523, 3, 30, -527, -102, 60, 89, -59, -350, 27, -297, 41, -81, 84, -115, -193, 43, -32, -109, 127, 11, -78, 378, 144, 283, -177, 51, -148, 107, -31, 148, -47, -114, -142, -337, -195, 539, 222, 357, -412, 86, 310, -263, 6, 199, -105, 200, 32, -364, -91, -559, -66, 224, 120, 374, 46, 248, 269, 91, -13, 484, 44, 11, + -80, -49, 260, 149, 249, -31, -47, -64, 183, 35, -34, 47, 127, -31, -69, -144, 9, -116, -47, -99, 86, -14, -163, -33, 16, 10, -4, -81, 118, -95, 33, 40, -122, -26, -80, 14, 105, -93, -69, -59, -50, -340, -310, -322, -478, 327, 206, 32, -323, 292, -6, -400, -333, -112, -86, -256, -105, -151, -134, -93, -377, 189, 215, -17, -38, -66, -142, -440, -487, 17, 206, -125, -301, -165, 222, 169, 7, -91, -132, -127, 282, -144, 197, -136, 2, -480, -109, -36, 359, 102, -90, -269, -193, -377, 607, -279, + 576, 76, -255, 385, 373, 654, -644, 266, 102, 88, -132, -182, 278, 148, -54, -299, 329, -174, 354, 298, 276, -253, 549, -408, 223, 359, -211, 46, 5, 312, -88, 139, -168, 333, -16, 60, -196, 153, -16, 157, -51, 212, 97, 68, -131, 41, -110, 7, -95, -118, -31, -104, -77, -10, -60, -104, 65, 89, 122, 31, -127, 12, -88, 83, 27, -58, 9, 58, 27, -135, 19, 137, 46, -20, 31, 516, -865, -935, -583, -101, -406, 248, -333, 32, 170, -28, 618, 440, 160, -183, -134, 428, -69, 64, -173, -387, + 4, 153, 106, -214, 189, 24, -22, 361, 504, 33, -318, -141, -612, -241, -156, -187, 31, 105, -221, -92, -310, 335, 408, 335, 381, 294, 498, 58, 173, 115, -87, 188, 298, -299, -1019, -241, 342, -532, 273, 331, 123, -164, 28, -130, -407, -115, 270, -331, -275, 95, -223, 662, 680, -254, 439, 112, -62, -300, 211, -403, -328, 360, 277, 189, -23, -39, -485, -354, -62, -114, -89, -77, -142, -123, -132, -71, 20, 111, 93, 149, -11, -76, -71, -54, 222, 200, 107, -23, -12, -51, -81, -132, -55, 19, -36, 85, + -46, 29, 43, 34, 85, -102, -1, 16, 72, -122, 204, -88, 833, -701, -14, 120, -673, -197, -285, 102, -207, 585, 73, -6, 727, -40, -648, -517, -319, 251, -40, -625, 158, 176, 326, -371, 186, 318, 272, 223, -80, 379, 405, 139, -914, 667, -330, 258, -70, -93, 170, -402, -235, 430, -200, -54, 383, -432, 385, -149, 357, -476, 632, -282, 980, -127, 57, 255, -223, -160, -125, 82, -56, -494, -628, -170, 356, -185, -232, -633, 286, 68, -874, -10, 5, 131, 440, -301, 133, -387, -348, -514, -523, -89, -309, 376, + -70, 367, -185, 210, -37, -230, -332, -34, 30, 161, -86, 73, 23, 133, -22, -169, -34, -258, -21, 45, 49, 18, -108, -123, 134, 70, -53, 166, -215, -270, -15, 246, -5, 73, 86, 169, -1, 189, -162, 63, 26, 154, 245, -156, 30, -34, 30, 317, 973, 479, -290, 663, 224, -430, 169, 427, -62, -151, -590, -165, 372, 236, 180, 104, -102, -243, -557, 295, -186, 145, -426, -237, -6, -70, 557, 163, 93, 419, 208, -643, -69, 231, -115, 10, 551, 177, 639, -372, -227, -107, -231, 246, -241, 474, 481, -212, + -459, 775, -395, -164, -88, 229, 124, -436, -124, 275, -200, 349, -161, 496, -253, 110, 768, -18, 543, 928, 123, 454, -230, -1122, -753, -148, -42, 634, -15, 210, 60, -161, -512, -1158, 881, 58, 32, 283, 143, -284, 652, 30, 143, -11, 50, -572, -205, -378, -220, -21, -205, -214, 139, -48, -139, 415, -71, -426, -296, 104, 28, -125, 653, 193, -208, -251, 75, -60, -126, 19, 67, -147, 161, -7, 229, 285, 64, -29, -79, 191, 195, 167, -1262, -304, 1321, -508, -564, 1165, -746, 656, 880, 347, 123, -667, 258, -1170, + -574, 256, 612, 69, 144, 444, 1187, 801, 254, 46, 3, 133, 102, -457, 15, 295, 375, 1580, 895, 611, 1145, 469, -158, 345, -16, 1096, 401, -86, -176, 460, -64, 528, -1623, 74, 568, -30, 686, -250, 187, 366, -1509, -581, -111, -480, -620, -735, 701, -447, 146, -132, 703, -1133, -304, -154, 367, 2, -96, 847, 1475, 0, 465, -270, 133, 1033, -1082, -641, -904, -1144, -91, -38, -444, -480, -452, -430, -556, -812, -348, -524, -316, 152, 732, 240, 120, 118, -61, 170, 81, -504, -452, -124, -641, -250, -277, -214, -246, 308, + -227, 28, 55, 138, 369, 557, 4, -128, 407, -191, 263, 107, 66, -96, 83, 61, -223, -298, -325, -35, 696, 593, -558, -2022, -354, 815, 197, -235, -152, 53, -271, -379, 451, 322, 922, 324, 557, -216, 1225, 211, 779, -118, 1131, -436, 739, -722, 14, 70, 530, -214, -382, -951, 532, 61, 115, -464, -838, -60, 106, -112, 267, 537, 90, 382, 1400, -594, 147, -466, 727, 616, -690, 652, 761, -545, 199, 170, 530, 250, 1067, 327, -367, 57, 1377, 427, -1556, 455, 289, -1354, -366, -438, -943, 63, 597, 639, -373, 1154, + -289, -509, -251, 607, -2266, -283, 42, 1829, 252, 1550, 756, 1087, -22, 370, -200, 920, 947, 837, -195, -564, -220, 920, -99, -607, -253, 1092, 162, -685, -224, 985, 292, 409, -4, 370, -273, -22, -12, 159, -17, 173, -128, -322, -369, -464, -51, -339, 10, -60, -122, 328, -363, -152, -360, -136, -670, -505, 697, 14, -1246, 1010, 2181, 145, -1209, 1878, -421, -28, 271, 1065, -610, 45, 2139, -1060, 512, 719, 694, -948, -92, 169, -461, 80, 226, -386, 382, -653, -181, -262, -46, -393, -339, -127, 209, -712, -661, 999, 185, -627, + -160, 594, 1448, -127, -700, 753, 1112, -323, -78, 28, 405, 2, 5, 503, -1219, 839, -701, 8, -996, 561, -74, -1494, 741, -107, -573, 1007, 123, 996, -839, -323, -336, -781, -1206, -1602, 1364, 555, 1006, 923, 576, 223, -572, 873, -430, -369, 1188, 394, -218, -107, 365, -839, 221, -332, 560, -214, -353, 529, 95, -623, 55, -295, -168, 131, -130, 114, -29, -449, -222, 194, -144, -284, 287, 442, 440, -349, -137, 507, -855, 258, 322, -370, -848, 429, 60, -387, 274, -414, -659, 174, 606, -496, -206, 211, 530, -144, -57, 29, + -358, 1182, -482, 350, 272, -1227, 1102, 386, -317, 947, 78, 63, 462, -412, 1208, -971, -522, 451, 415, 205, -905, -550, -1008, 555, 131, 507, -1, 544, 217, 182, 19, 463, -213, 255, -463, 343, -428, -5, -565, -401, 20, -501, 230, 1188, 281, -894, 461, 356, 627, 16, 1045, -904, 133, 416, -875, -206, 1750, 985, -2327, -989, 1230, -340, -1107, 431, -119, -854, 617, 1053, -1439, 279, 1266, -867, -781, 1037, 132, -861, 145, 672, -757, -109, 813, -126, -374, -593, 742, -204, 409, 91, 416, -297, 265, 750, 289, -564, 35, -406, + -281, -570, -61, -157, -51, -386, 375, 325, -144, 858, -232, -930, 1096, -140, -224, 195, 375, 43, -116, 925, 500, -666, 41, 256, -491, -404, 661, -359, -1298, 1226, 142, -1264, -53, 648, -487, -1064, 589, 796, -1307, 177, 946, -573, -115, 1020, -93, -423, 211, 407, -545, -157, 526, 1012, -2201, -172, -378, -2477, -427, -774, 256, 410, 743, -339, -948, -377, -1374, 173, 511, 274, 235, -1130, 699, 96, -1327, 967, -1428, -603, -527, 378, 1057, 1197, -85, -285, -2318, 989, 2376, 849, 69, -1310, -1887, -794, -146, 982, -1177, -724, -1210, -402, + 2224, 2369, -400, -1110, -931, -516, -236, 1187, -555, 347, 265, 785, -204, -549, -1374, -614, 2132, 895, 1424, -1303, -701, -610, 1455, 19, -2328, -2271, 1282, 2170, 3673, 629, -3091, 510, -804, 1046, 1034, -3816, -1197, 733, 2022, 477, -1918, -443, -176, 1115, 978, 247, -1531, -252, 359, 681, 363, -414, 86, -868, -89, -24, 851, -578, 1128, -716, 337, 634, -243, 524, 494, 860, 67, -431, -477, 70, 66, 138, 115, -38, -33, -323, -306, -75, 575, -150, 42, -124, 211, 34, 335, -1109, 945, -988, -228, 47, 242, -179, 216, 398, -655, -544, + -24, 156, 402, -457, 54, 366, -288, 232, -155, 1099, -27, -155, 615, 352, 545, -273, 344, -104, -27, 468, 314, 85, 125, 628, -589, -166, 50, 844, -25, -179, 765, -189, -350, -328, 632, -144, 269, 181, 86, -217, 103, 260, 77, 736, 349, 216, -327, -38, 265, -508, 175, 207, 523, 17, -76, 313, 54, -592, 665, 218, -171, 574, -395, -37, -298, -239, 542, 417, -51, 214, -344, 88, -460, -31, -422, 103, 250, 108, 35, -77, -70, 90, -258, 83, -120, 128, -175, -45, -163, -178, 77, -21, -28, -58, 248, 114, + -348, -335, -253, 86, 93, 266, 135, -307, -63, -107, 278, -60, 301, 145, -275, 15, 125, -134, 186, -105, 213, -147, -68, 88, -146, 1755, 140, -647, -538, 88, 396, -23, 361, -137, -98, -486, -108, -340, 541, -338, -29, -213, -102, -125, 58, -359, 54, -154, -255, 75, -41, 21, -70, 128, 60, -300, -194, 1, -205, -177, 149, -48, -308, 21, -172, 132, -455, 228, -198, -344, 105, -157, -179, 48, -3, 23, -76, 77, -139, 155, -96, 17, 253, -182, 85, -47, -27, 70, -210, 192, -220, 191, -46, -8, -141, 181, + -212, 15, 75, -277, 278, -168, 118, -127, 113, -98, -123, 208, -130, -24, 203, -129, -2, 19, 32, -143, 11, -11, -63, -39, 35, -43, -78, -37, 88, -79, 66, -21, -9, -24, -60, 59, -41, -45, 61, -61, 48, 25, -38, 12, -10, 20, -122, 120, -126, 25, -19, -63, 17, -33, 86, -843, -1363, 1446, 5019, 964, 1506, -3092, -4303, -1796, -2255, 1741, 4033, 2321, 1556, 157, -2226, -1967, -1971, -804, 1114, 954, 1015, 916, -33, -146, -236, -315, -469, -61, 614, -53, -361, -139, -520, -289, -93, -127, 986, 922, 541, 586, + 27, -713, -733, -1336, -895, 125, 106, 275, 786, 1127, 671, 568, -29, -634, -889, -762, -645, 94, 225, 414, 280, 191, 37, -229, 87, 25, 93, 561, -56, 250, 250, -413, -790, -807, -734, 197, 594, 437, 650, 580, -198, 148, 352, -227, -220, -500, -653, -249, -158, -64, 269, 131, 143, 440, 410, 433, 240, 113, -221, -264, -672, -728, -524, -377, 159, 481, 595, 810, 571, 371, 0, -246, -400, -829, -888, -308, 152, 426, 331, 297, 331, 247, -22, -59, 30, 13, -153, -127, -453, -289, -19, 166, 213, 178, -73, -3, + 153, 130, 2, 92, 69, -43, -207, -172, -175, -25, -40, 14, 28, 160, 154, 150, 43, 23, -103, -116, -151, -62, -42 } + }, + { + {66, 193, 16, 129, -30, -19, -70, 138, 87, -81, -107, 69, -27, -164, -190, 45, 9, -64, -65, -128, 81, -151, 38, -15, 34, 12, 32, -68, -10, 26, 43, -16, 53, 38, -67, 50, -41, -129, 182, -35, 8, 43, -23, 100, 128, -28, 48, 96, 8, -103, -79, 25, 61, -31, 33, 118, -105, -94, 98, 18, -39, -64, -3, 22, 74, -120, 58, 30, -94, -101, 86, -55, -124, -53, -12, 186, 215, -19, 35, -27, 32, -36, 57, 35, -36, -12, -39, 18, -51, 47, 42, 9, -60, 7, -4, 25, + -16, 40, -22, 7, 2, 25, -6, 8, 6, 25, -2, -237, -102, -164, 107, -79, -111, -75, -100, -20, 37, 179, 31, -96, 151, 6, 156, -150, 242, 112, 262, -47, -89, -18, -144, -12, -10, -52, 49, 5, -115, -28, 0, 35, 114, 26, -171, -143, -54, 96, 6, 4, -87, 142, -4, 10, -62, 18, -37, 75, -24, 238, 2, -32, 90, -60, -107, -45, 80, 143, 24, 88, 21, 15, -76, -74, -121, -6, -126, 31, 102, 109, 76, -39, -56, 98, -70, -29, 61, -56, -10, -29, 63, 112, 58, 33, + -29, -13, 20, -12, 75, 12, -37, -22, -17, -6, 10, 9, 1, -12, 35, 22, 1, 13, -28, -18, -22, -26, -9, -29, -28, -7, 35, 166, 179, 95, 0, 146, -79, -124, 121, 126, 160, 235, 23, -150, 88, -143, -9, 48, 35, 262, 22, -211, -8, 38, 90, -15, -70, -232, -44, 197, 70, 130, 153, 126, 37, -22, 137, -173, -4, -117, 317, -17, 10, 140, -115, -18, 51, -18, 190, -29, 58, 180, -33, 56, 16, -9, 0, -24, -50, 78, 106, -25, 105, 38, 207, 235, -11, 63, 40, -119, + 118, -29, -98, 41, 116, 32, -29, 208, -28, 56, 64, 31, -105, -6, -20, 17, -55, -12, 7, 22, 23, 38, -12, 19, -51, -35, -63, 49, 17, -10, 21, -9, -52, 33, 6, 24, -15, -19, 10, 62, -63, 262, 256, -101, -147, -128, -88, 66, -281, -27, 38, -134, -249, 242, -53, -60, 38, 112, 99, -122, -49, -4, -14, 59, 84, -46, 104, -77, 160, -18, 6, -81, 84, 33, -25, -80, 39, -45, -72, -58, 14, 54, -152, 15, -286, -164, 103, -41, 34, 66, 188, -59, -95, -5, 6, 81, + 76, -86, -39, 210, 8, 34, 18, 94, -173, 8, 88, 163, 34, 71, 246, -58, -23, -131, 2, 43, 86, 2, -53, 77, -6, 139, 2, -3, 17, -170, -89, -100, 96, -15, -27, 0, 13, -5, 51, -14, -28, -36, -18, -52, -34, 42, 3, -13, -27, 14, 11, 5, -23, 46, 20, 30, -6, -1, -30, -33, 23, -15, 31, 41, -166, -260, 111, -85, 5, -134, 104, -300, -246, -283, -95, -60, -197, 101, 271, -199, 42, 318, -73, -86, -146, 26, 0, 141, 47, 101, 71, -103, -201, -96, 121, -68, + -123, 31, 51, 40, 26, 277, -130, 151, -72, 76, -80, 230, -171, 94, -14, -136, 128, -51, -45, 137, 73, -12, -60, 125, 62, -128, -153, 105, 170, 96, 4, -74, 9, 109, -46, 131, -31, -267, 9, -117, 380, 133, -216, -122, -42, -98, 98, 95, 72, -46, 84, 67, 24, -16, -111, 22, 39, -32, 26, 39, -15, -5, 25, -7, -33, -28, 3, 29, -30, 28, 33, -42, -53, -67, 2, 40, -18, 36, -29, -3, 27, -19, 12, 100, -221, -269, 232, -48, -220, 20, -57, 227, 112, -56, 42, -9, + -34, -38, 262, 53, 14, -177, -82, -40, 92, 117, 353, 11, 12, -9, 24, -153, 7, 66, -192, -134, -124, -14, 258, -208, 36, 120, 51, -96, 108, -260, 215, -44, 0, 118, -132, -153, -240, 53, -78, 230, 79, 8, 44, 71, 179, -77, -39, 188, -38, -105, -4, 189, 189, 174, 94, -113, 111, 158, -185, 238, -144, -133, 214, 24, 309, -2, -173, 78, -77, 206, 98, 58, 14, 72, -36, 130, 45, 53, 39, 77, -6, -5, 59, -1, 43, -22, 71, 147, -85, -38, 26, 19, 9, 38, -7, 13, + 30, 73, 5, 135, 32, 17, -60, 16, 44, -59, 13, 27, -4, 18, -484, -319, 86, 155, 331, -202, 178, 33, 187, -10, -87, -114, 116, 343, 29, -30, -327, -274, 2, -201, -119, 12, 41, -206, -62, 50, 121, 65, -133, 0, 154, 125, 26, -126, 23, -77, 37, 43, 70, -97, 122, 299, -31, -22, 58, -166, 78, 241, -237, -279, -145, 24, -362, 9, 10, 51, 3, -5, -172, -92, -112, -15, 246, 364, 10, 25, 177, -74, -31, 83, 409, 52, 147, 288, 52, -186, 77, 87, -86, 89, 74, -19, + -89, 43, 26, -19, -152, 68, 139, 53, 101, 58, 122, -26, -46, 114, 93, -28, -7, -33, 81, 89, -71, 88, 23, 12, 22, 48, 65, 10, 57, -38, -21, 1, -10, 24, -38, 7, -12, 18, -51, 250, 155, -228, -11, 495, 435, 94, 262, 327, 81, -3, 213, -95, 1, -192, 157, -11, 7, 73, 83, 271, -228, -205, 204, 44, 93, -159, 28, -55, 104, 3, 147, 147, -150, 125, 102, -169, 436, 78, 84, -338, -110, -26, 282, 266, -29, -290, 189, -252, -81, 224, -8, -178, 215, 274, -71, 94, + -111, -380, 0, 246, -114, -129, 159, -182, -280, 71, 187, 345, 178, -256, 106, -301, -359, 331, 153, 122, -224, -238, -38, 250, 81, 356, 155, 91, -379, 63, -107, 16, -90, 80, 22, 96, 157, 85, 12, 72, -65, -29, -66, 1, -62, -16, 22, 120, 19, -48, -23, 39, 3, -9, -123, 8, -64, 24, -88, -94, 61, 76, 116, -115, 512, 329, -222, -61, -8, 90, 72, -33, -200, 48, -137, 213, 7, 82, -70, -32, -209, -112, 441, 145, -269, 127, -262, -186, -410, 178, 7, 6, 97, -12, -186, 309, + 177, -69, -312, 312, -214, 82, -8, 102, 62, 198, 229, -54, 127, 362, 46, -115, -104, -65, 56, 242, -67, 98, 19, -223, 8, -55, 108, -334, -6, -557, -337, -311, -78, -307, 206, -77, -254, -69, -28, -206, -89, -8, 21, -124, -267, -268, 15, -59, 65, 149, -24, 74, 37, -2, -4, -146, -6, -4, -117, -10, 110, 211, -36, -102, 79, -132, 111, -110, -41, 20, -80, -99, -1, -62, 15, -24, -99, 48, -4, 123, 83, -88, 75, -49, 70, -41, 47, 43, 34, 2, 50, -58, -31, -65, -129, 16, + 47, -14, 29, -102, -349, -439, -205, -292, 756, -366, 173, -346, -97, 36, -54, -516, -9, -245, 21, 607, -192, 255, 336, 121, 138, 365, 111, -142, 106, 143, 156, 65, -74, 424, 18, -34, -69, 115, -34, -148, 146, -55, 105, -412, 19, -80, 374, -147, 122, 558, -47, 12, -134, -231, -11, -38, -234, 296, -62, 215, 25, 203, -116, -22, 448, 218, -344, -182, 96, 107, 55, 95, -100, 126, 165, 370, -475, 28, -202, 97, -7, 54, 177, 254, -169, 180, -122, -84, -68, -64, 144, -324, -63, -150, 186, 150, + 65, 77, -108, 124, 58, 89, -12, 70, -96, -54, -120, -10, -19, -109, -1, -12, -29, -2, 129, 79, -71, -116, 61, 44, 147, -114, 9, -41, 66, 75, -62, -117, -250, -222, -242, 263, -507, -147, -318, 159, 523, -284, 14, 17, -104, 204, -170, 83, -54, -214, 467, 25, -154, 9, -69, -205, 162, -156, 152, -294, -138, 201, 146, -492, -90, -419, 125, -69, -406, 496, -139, -8, -375, -409, 23, -369, -49, -318, -274, 325, 35, -415, 136, -371, 332, 122, -161, 15, 107, 351, -270, -380, 386, -268, -154, 204, + 292, -540, -266, 310, 229, 121, -29, 40, -389, 135, 130, 216, -69, -410, -299, 147, -355, -309, 131, -19, 5, 131, 299, 2, -13, 281, 26, -44, 48, -36, -57, 62, -74, -50, -141, -134, -97, 26, -80, 3, 57, 47, -8, 0, 61, -69, -112, 35, -4, 108, -103, -28, -117, 137, 143, 32, -7, -87, -36, -123, 10, 22, -70, 23, 28, 257, -397, -648, -523, 236, -626, -30, 474, -42, 34, 340, -226, -193, 754, -299, 176, 287, -54, -684, -57, 72, -172, -95, -159, 637, 6, 7, -32, -459, 83, -264, + -133, 28, 76, 136, 369, 82, -96, 728, 76, -180, -667, -97, 488, -106, -306, -410, -362, -309, -195, 518, 201, 30, 287, 433, 241, -94, -77, 447, -89, -137, 129, 342, 48, -351, 80, -36, -526, -40, 417, -207, -243, -59, 562, -448, -91, -250, 256, 149, 118, 180, -75, -97, 189, 152, 104, -31, 22, 119, -331, -61, 42, -171, 3, 180, -19, 33, -72, -21, 98, 127, 190, 107, -33, 68, -111, -140, 39, -28, -115, 126, 66, 95, 19, 46, 97, 54, -29, -71, -19, 39, -1, 40, 7, 50, 29, 85, + 10, -83, 181, 149, -141, -48, -68, 530, 53, -473, -18, 142, -17, -216, 206, -160, 422, -324, 290, 634, -171, -169, -149, -132, 566, -419, -461, -351, 128, -183, -296, -136, 203, -284, 157, 37, 222, 329, 41, -42, -63, 325, -84, 115, -398, -3, -142, 317, -423, 348, -146, -218, 350, 606, -341, 173, -75, 123, -910, -721, -437, 63, -277, 120, 30, -337, -267, 30, 725, 171, -451, -675, -356, -249, 444, -307, -440, 106, 97, -407, -25, -6, -202, -46, -10, -16, 200, 50, -234, -207, -114, -299, -163, 51, 337, 58, + 64, -96, -276, -42, 227, -9, -128, 210, -315, -154, 48, 52, -4, 37, 23, -105, -220, -78, 169, -96, -78, -87, -196, -216, 83, -76, -47, -203, 52, 137, 164, -5, -97, -112, 108, 910, 597, -157, 61, 589, -232, 19, 255, 638, 376, -112, -141, -222, 59, -123, 11, 15, 674, 1111, -64, 766, 486, 98, 122, -548, -541, -63, 145, -41, 135, -206, -404, -687, -58, -443, -372, -249, -385, -280, -14, 635, -19, -486, -39, 135, 474, -151, -119, -291, 216, -869, -777, -377, -387, -419, -251, 273, -349, -488, -407, -728, + 373, 196, -644, 328, 653, 1274, 706, -12, 234, -739, -300, 393, 336, -192, -497, 61, 105, 449, -57, -468, -80, 737, 474, 532, 427, 743, 704, 207, 192, -168, -295, -86, -25, -257, 0, -296, -217, 335, 152, -97, -294, -117, -34, -9, -327, 323, 5, -279, 165, -174, -141, -46, 103, 446, 221, 534, 3, -111, 62, 201, 138, -74, 285, 9, -91, 37, 237, -122, -100, 83, -20, -947, -85, 1509, -106, 50, 383, -559, 315, 1069, 996, -1008, -957, -7, -1038, -401, 2, 114, 384, 566, 508, 886, 214, 344, 359, -158, + -61, 90, 121, 256, -475, 1064, 463, 493, -91, 1081, 138, 648, 274, 197, -254, -175, 558, 205, 260, -594, -311, -498, -284, -365, 0, -718, -768, -55, -295, -1461, -1079, -988, 280, 1047, 1371, -767, 945, 1458, 252, 113, -93, 1000, 78, 903, 394, 417, -610, -2030, -1599, -373, -55, 31, 71, 734, 705, 602, -383, 37, -200, -1053, 104, 70, 521, 68, 767, 681, 170, 590, -258, 395, -365, -423, -154, 147, 666, -166, -192, 83, -334, -178, 335, -112, 230, -438, 570, 157, 1, -57, 436, -126, 26, 54, -14, 281, -222, -129, + -9, 269, -436, 38, 146, -230, 25, 58, 45, -115, 740, -166, -1323, -121, 2120, 382, -390, 541, -169, 351, -163, -234, -691, -267, -70, -121, -328, 496, -446, -490, -27, 73, 450, 195, 128, 184, -174, -1, 668, -342, -781, -162, 76, -271, 557, -292, -179, 459, 138, 346, -808, -923, 313, -182, -305, -398, -478, -1016, 10, -93, 345, -652, -1342, 1006, 286, 945, 114, -311, -278, 243, -500, 782, 165, 940, 668, 1399, -131, -1353, -1040, -601, 784, 775, -585, 614, 1237, -729, -104, 1316, 214, 1009, -142, -524, -1366, -539, 163, 870, + 772, -457, 391, 355, 732, 244, -715, -860, -330, 585, 1262, -38, -107, 647, 351, 53, -102, -281, -334, -281, 220, 125, 403, -173, -41, 31, 245, 303, -392, 0, 454, -58, -126, -505, 366, -7, -211, -160, 506, -30, -319, -179, -1115, 1156, 1568, 273, 71, 349, -240, 685, 383, 716, -146, -756, 1680, 9, -632, 78, 1136, 520, 222, -720, 77, -386, -282, 112, -536, 45, 143, 645, -917, -157, -111, 544, -208, -339, -323, -5, 347, -713, 51, 187, -1459, 200, -397, -1029, 675, -761, -1334, 1759, -15, 100, -140, -491, 1060, -753, + -72, 156, -486, -42, 1339, 691, -1185, -1282, 1260, -605, 733, 1209, -1090, -1875, -1299, 2160, -131, -1699, 1548, -1134, -2155, -38, 1853, -84, -2237, -36, -755, 16, 2749, -424, -2030, 289, 1074, 18, 1256, 68, 20, -404, 47, 283, 1012, -218, -279, 1002, -140, 235, 701, -127, -1034, 665, 481, 780, -250, -25, 274, -233, -763, -341, 307, 16, -155, 989, -36, -1116, 253, 897, 519, -394, 43, -451, -253, 1091, 916, -249, -1066, -349, 428, 345, 281, -209, -46, -740, 1137, -220, 335, 745, 512, 568, 1340, 596, -348, 224, 319, 452, -506, 1314, + 1217, 181, 411, -292, -16, -1321, 596, -693, 458, -45, -505, 730, -303, -528, 273, -750, 488, 31, -160, 219, 299, 481, 467, 469, 1364, -126, 134, 446, 914, -82, 231, 13, 711, 873, -298, 218, -55, -131, -1593, 136, 655, -366, -402, 359, -673, -966, 71, 565, 1147, -1485, 556, -66, -58, 17, 569, 1265, 6, -905, 287, 1029, -568, -795, 61, 458, -448, 817, -174, 631, 37, -606, 743, 622, 87, 493, -289, 312, -165, 170, 231, 745, -173, -879, -132, 1042, 62, -120, 900, 202, -22, 231, 619, 957, -625, 244, 112, -34, + 447, -124, -706, 237, 638, -270, 154, 234, -231, 266, -455, 323, 263, -371, -843, 363, 453, -207, -319, 449, -51, -255, 708, -1345, -1065, -9, -1639, -550, -613, 1265, -46, -455, 568, -287, 311, 92, -632, 753, -1690, -150, 93, -411, 300, 84, -337, -51, 40, 432, 16, -483, -1638, -1179, -914, -441, 1001, -196, 29, -1623, 113, -105, -230, 60, -1587, 854, -775, 398, -322, 1084, -595, -1033, -509, 0, 772, 1430, 1485, -1834, -1371, -932, 627, 1522, 1823, -310, -467, -1603, -605, 1444, 869, -8, -7, -25, -1370, 921, -281, 889, 2125, -2372, + 2880, 825, -1571, 447, -3142, -3054, 2254, 974, 217, 683, -1165, -547, 2099, -70, 1410, -129, -1143, -361, 1245, -406, -33, 416, -106, -719, 402, -582, 269, 809, -835, 797, 260, -95, 294, -37, -190, 142, -291, 159, -593, 534, 542, 123, 16, -169, 277, 114, 110, 283, 523, -637, -220, -590, -461, 61, 23, 533, -674, -502, -649, -395, -173, -1359, 1124, -674, 689, 367, 434, 258, -874, 953, -146, -338, -317, -375, 287, -196, 410, 249, -59, -98, -733, 425, 168, -185, 157, 386, -114, 220, -375, 439, -168, 58, 172, 188, -200, 675, + -31, -631, -47, 294, 139, -482, 230, 567, -112, -272, -273, -35, 150, -66, 657, -444, -176, -156, -338, -26, -107, 245, 170, -272, -47, 256, -273, -136, -85, 411, -258, 177, 270, -633, -261, 205, -667, 1007, 264, 322, 459, -293, -12, -85, -461, 93, 147, 369, -77, -153, 220, -230, -99, 221, -1, -52, 182, 58, -122, -4, -135, 294, -281, 446, 17, 99, -189, -15, -71, -138, -76, 107, 51, 129, -5, -104, -73, -344, 346, -276, 155, -65, 201, -113, -323, 22, 165, -262, 394, -313, 172, -119, 1572, 205, -532, -414, + -310, -30, -50, 34, -43, -61, -889, 19, -177, -206, 113, -350, -158, 162, -243, 69, 276, -374, 235, -139, -198, -32, -198, 92, -183, -98, -216, -43, -3, -6, -130, -136, 41, 70, -155, 210, -259, -23, -103, -34, -48, -206, 283, 173, -282, 344, -34, 73, -155, 330, -329, 24, 29, 87, -53, -86, 247, -164, 38, 13, -49, 79, -106, -15, 139, -69, -61, 156, -59, -68, -143, 75, 73, -321, 387, -217, 89, 27, 7, -124, 55, 158, -115, -59, 87, -118, -6, 97, -38, 39, 23, -87, 17, 11, 81, -142, + 14, -16, -54, 60, -68, 34, -43, -124, 72, -108, -60, 40, -65, 25, 65, 7, -92, 100, -17, -61, -768, -1250, 1396, 4694, 478, 1078, -2555, -3907, -982, -2041, 1591, 3276, 1726, 1092, -245, -1270, -1250, -940, -873, 312, 559, 324, 601, 80, 48, 238, 68, 270, 215, -159, -598, -441, -527, -711, -376, 402, 518, 962, 1359, 493, 197, -451, -1077, -1042, -728, -505, 104, 402, 577, 616, 519, 351, 41, -40, -342, -236, -151, -170, -66, -193, -55, -228, -224, 84, -18, 298, 489, 291, 728, 649, -311, -638, -640, -953, -268, -229, + -51, 588, 524, -91, 455, 568, 193, 397, -35, -457, -331, -784, -494, -185, -48, -58, 142, 371, 588, 742, 628, 210, -342, -561, -536, -599, -268, -152, -61, 133, 297, 235, 415, 226, 273, 247, 3, -204, -266, -334, -327, -292, -154, -161, 95, 168, 341, 492, 477, 181, 35, -272, -329, -389, -389, -115, -16, -75, 95, 301, 393, 191, 44, -22, 8, -77, -79, -139, -81, -104, -66, -42, 11, 2, 76, 126, 132, 40, 12, -60, -48, -65, -20, -29 }, + {122, 198, 52, 175, 3, -180, -124, -131, -20, -90, 212, -158, -40, -72, -25, -127, 122, -75, -59, 103, 170, 193, 30, -14, 40, 10, 27, -87, -94, 46, -85, -85, -114, -120, 37, -79, 106, -132, -18, 59, 56, 49, -206, -37, -114, -20, -48, -125, -2, 150, 46, 73, 69, 81, 10, 102, 64, 114, -64, 76, -37, 53, 6, -104, 122, 139, -74, -92, 41, 128, 31, 34, -42, -8, 69, 43, 11, -25, 9, 59, 71, -8, -110, -67, -37, -47, 26, -10, -10, 53, -38, -13, 0, 10, -26, -7, + 4, -41, -5, 52, -7, 28, -37, 22, 11, -2, -24, -310, -81, -140, 102, -290, 64, -128, -68, 41, 6, 32, 43, 33, 126, -56, 13, -13, -153, 113, 189, -154, -144, 110, 28, 135, 43, 182, -25, 61, -96, -29, 185, 15, -121, -149, -161, 7, 133, 68, -1, 152, 121, 5, -124, 194, 49, 150, 152, -27, 97, 115, -14, 68, 78, -76, 15, -24, 75, -171, -109, 55, -106, -41, 146, -59, 80, -34, -230, 39, -1, 121, -189, -102, 86, 22, -18, 49, -89, 26, 23, -27, -56, 77, 70, 49, + 9, -29, 19, -22, -34, 25, 22, -46, 33, -26, -20, 41, -30, -61, -1, -23, -8, -29, -32, 13, -2, 19, 0, 18, -45, 13, -13, 195, 206, 90, 152, 119, 206, 235, -87, -25, 79, -235, -8, -77, -45, 107, -137, -16, 174, 32, 111, -55, -40, -58, -221, -36, 15, 117, -36, 201, 79, -35, 80, 42, 103, -75, -16, 234, -31, 221, 104, -97, 23, 195, 102, -129, 178, -49, 12, 9, -36, 34, 20, -161, 102, 75, -14, 6, -36, -145, 0, 81, -17, -17, -98, -214, -74, 79, 179, -272, + -145, 51, -119, 70, -6, -1, -164, -125, -73, -107, -53, 6, 18, -38, 61, 49, 10, 45, -50, -19, 1, -73, -16, 7, -94, 39, 22, -18, 2, 19, 44, 5, 6, 1, -46, -6, -14, 33, 22, 45, -33, 287, 306, -62, -127, -141, 294, -255, 8, -42, -118, -162, 58, -45, -219, -268, 11, -21, -139, 50, 75, -99, -147, -139, 196, -211, -25, -246, 4, 136, 48, 23, -137, -133, 122, -94, -140, 17, -50, 86, 3, 34, -140, -53, -39, 135, 94, 93, -278, 44, 79, 63, 79, -80, -50, 10, + 57, 110, -18, 72, -80, 215, -389, 137, 12, -208, -8, 229, -68, -108, -208, -71, 17, -58, 1, 94, 121, 100, -29, -17, -122, -25, -31, -62, 18, -25, -23, 50, -61, -29, 61, -30, 40, -9, -24, -22, -16, -90, -55, 39, 45, -43, -34, -29, 34, -21, -12, -35, 24, 25, -41, 17, -5, -38, -8, -22, 25, -13, 38, 52, -136, -432, 79, -197, 43, 36, -25, 306, 17, -196, 262, 126, 90, -40, 54, -80, 205, -35, 23, 309, 302, 129, 138, 132, 150, 100, -298, -94, -4, -79, -254, -28, + -60, -68, -136, -3, -40, 218, -70, 382, -2, 32, -71, -56, 3, -12, -31, -68, -45, -188, 45, 30, -23, -98, 131, 96, 113, -41, -82, 1, 98, 106, -87, -246, -126, 26, 204, -29, 166, -134, -193, 143, -68, -159, 91, 95, -178, -141, -196, -66, -68, 111, -62, 33, -13, 74, 45, 40, -38, -22, -102, -52, -28, -2, 44, -10, 2, 83, 32, -5, 0, 53, -37, 13, 14, -30, 31, -27, 20, 16, 23, -17, -65, 60, -108, 159, -188, -205, 99, -59, -17, -108, -62, 105, 150, 78, -34, 23, + -17, -34, -141, 48, -382, -111, -121, 106, 133, 11, 66, -238, 66, 37, 66, -214, 407, -18, 77, 54, -191, 31, -274, 177, -57, -230, 48, 18, -114, 13, 27, 183, 329, 143, -65, 107, 136, -304, -111, -139, 86, 70, -49, 49, 107, 68, 138, 256, 7, -94, -25, -10, 202, -144, 2, 93, 272, 2, -179, -175, -14, -215, -28, 82, 333, 286, -32, -151, 123, 10, 37, 31, -11, 42, -11, -42, 37, 48, -46, 67, 63, 60, -17, -49, 39, 54, -8, 16, -41, 7, -9, 78, 29, 49, 38, 12, + 25, 0, 31, 70, 15, 29, 50, 68, -33, -17, 16, 20, 51, 80, -398, -108, -148, 170, 5, -82, -511, -67, -69, 212, 504, -145, 338, 59, -300, -305, 52, 78, -175, 192, -139, 154, -191, 92, 64, -181, -153, -116, 59, 198, -259, 10, -272, -15, -104, 66, 197, 21, -87, -76, 213, -1, 325, 100, -124, -118, -96, 47, 204, -4, 339, -605, -447, -361, -85, -308, 19, -116, 108, 274, 48, 114, 175, 290, 148, 44, -202, -500, -528, 283, 18, 359, -257, -184, 156, -371, 6, -132, -15, -239, 8, 80, + 215, 39, 34, -69, 77, -16, 25, 60, 97, 126, -35, -53, 91, 46, -36, -66, 13, -11, -9, -28, 13, 1, -37, -12, 37, 68, 54, 47, 24, -153, -85, -59, -55, 82, -13, -25, 0, 23, 5, 239, 105, -191, -5, 456, 387, -36, -334, -564, -64, -198, 202, -169, -166, -639, -274, -573, 211, -19, -139, 153, -20, 3, 42, -184, 16, -211, -37, 128, 95, -215, 78, 220, 358, -54, -50, -119, 20, 186, 264, -38, 39, -57, -46, 314, 229, 9, 236, 68, -289, 55, -29, 374, 146, 47, 181, 243, + 67, -213, -365, -84, 76, 196, 100, 13, 77, 290, 64, 95, 134, 78, -186, -210, -183, -208, -190, 323, 46, 249, -219, -193, -37, 208, -130, 111, 64, 33, -110, -70, -102, -70, -116, 47, 38, -32, 77, -50, 36, -20, 9, 35, -103, -64, -103, -67, -126, -36, -104, -50, -60, -79, -5, 92, 30, 38, -32, -9, -11, -21, 72, -33, 800, 175, -246, 143, -143, -474, -96, -465, -255, 241, 322, 124, 67, 27, 61, 305, -215, 431, -277, -283, 346, 153, -553, 243, 144, 176, 368, 181, 275, -18, 151, -86, + 235, 62, 53, 156, -309, -168, -92, 201, 91, 73, 164, 47, 61, -282, 7, 307, -50, 39, 44, 40, 371, 142, 498, 115, -65, 469, -397, -51, -58, -159, -31, 100, 470, 46, -93, -179, 102, -188, -75, -120, -248, -39, 74, 399, -27, -382, -100, -228, -109, 279, 230, 262, -200, 45, -223, -33, -71, -136, -71, -188, -104, -33, -74, -247, -92, -69, -44, -54, -80, 14, -35, -194, -3, -92, -49, -14, 5, 38, 1, 91, 94, 18, 23, -60, -48, -11, -59, 93, 61, 88, 88, 38, 120, 78, 36, 56, + -7, -43, 88, 118, -287, -445, -159, -438, 315, -374, -273, -221, 200, 499, -507, -182, -571, 163, 81, 52, -163, 43, 646, -338, -55, 243, 168, 126, 228, 150, -211, -359, -66, -200, -269, -332, 6, -78, 83, 424, 271, -240, -128, -28, -122, 103, 811, -276, 566, 176, 96, -39, -90, 94, -309, 147, 441, 17, 71, 350, 229, 135, -295, 246, -176, -266, -713, -226, 465, -265, 122, -505, 361, -191, -197, 313, -501, -373, 570, -407, -381, 227, -261, 52, 2, 161, -411, 128, 12, 409, -304, 101, -42, -233, 305, 61, + -252, -185, -173, 26, 0, -128, 4, 158, -12, 112, 128, 100, -227, 126, 117, 183, -4, 13, -165, -67, -81, -87, 39, -20, 106, -151, -95, 56, -145, -123, 53, -323, -241, -33, 367, -174, 646, 602, 118, 193, -350, 43, -284, 452, -91, 133, -217, -140, 76, 61, -208, 346, -99, 73, 128, -227, 85, -290, 0, 164, 196, 4, 259, 328, -26, -617, -105, -184, 439, -374, -465, -331, -223, 63, -264, -207, -134, -40, 79, -905, 569, 443, 648, -208, 102, 434, -419, -388, 74, 283, 185, -51, 85, -230, -274, -349, + -104, 1199, 94, -668, -122, -367, 226, 177, -416, 86, -130, 32, -207, 255, 259, -42, -136, -160, -527, 155, 81, -24, 212, -107, 31, 81, -252, 92, 144, 340, 178, 18, -299, -1, 265, 13, -5, 198, 0, 66, 194, 165, -36, 89, 163, 152, -79, 64, 196, 243, 177, -9, -135, -33, 0, 151, -6, -48, 4, 53, -104, 53, 90, -99, 55, -174, -344, -663, 54, -554, 261, 89, -446, 252, 290, 404, 117, 160, -463, -10, -92, 431, 201, 19, 403, 449, -54, -216, 51, 554, -361, -286, 285, 156, -367, -82, + -340, 633, -541, 150, 337, -205, 310, 111, -155, -165, -167, -259, 355, 478, 95, -368, 38, -406, -155, 262, -50, -203, -148, 66, -539, 14, -57, -313, 420, -416, -28, -98, -307, 322, -26, 185, -157, -35, -19, -199, 151, -184, -34, -181, 487, 206, -579, -130, -953, 546, -2, -433, 385, 38, 57, 137, 6, 217, 269, 57, -70, 144, 289, -170, -103, 113, 42, 67, 85, 142, 198, -134, 103, 58, -156, -148, 126, 21, -16, -110, -95, -176, 169, 169, 30, -119, -359, 2, 33, 112, -230, 20, 183, -105, 212, 90, + -14, 53, 115, 4, 42, 58, 142, 581, 22, -442, -190, 261, 423, 453, 16, -107, 637, 277, 709, 86, 60, -342, -141, -203, 189, 102, 383, -440, 29, -262, 235, -381, 144, 421, -64, -13, -221, 59, -222, -757, 103, -117, 52, -339, -75, 295, 571, -60, -208, 332, 156, 80, 393, 136, -211, -102, 253, -36, 231, -278, -247, 85, -233, -445, -206, -506, -114, 170, -398, -58, -457, -200, -4, 179, -545, 237, 40, -324, 405, -145, 107, 719, 813, 52, 285, 595, 711, 706, -70, -471, -723, -263, -479, 451, -98, -213, + 115, -12, 48, -9, -215, 229, 64, 86, 16, 310, -175, -4, -96, 215, -201, -85, -22, 306, -81, 185, 252, -232, -51, -98, -264, -106, -61, 113, 8, 358, 96, 242, -24, -231, 7, 972, 1123, 55, 363, 339, -43, -810, -18, -36, -302, 223, 215, -443, 243, 303, 54, -121, 171, -116, 574, -102, -264, 0, 133, -58, -34, -14, -906, 258, -18, -632, -257, 105, -56, -432, 152, -509, -43, 46, -808, -149, 351, -264, 41, 508, 317, 388, 125, -224, -376, 386, -198, 215, -357, -192, 261, 434, 67, 520, -348, 450, + -380, -465, -327, 448, 476, -440, 229, -1210, -107, 352, 116, -193, -478, 219, -677, 107, -347, 319, -521, -338, 530, 9, 268, 57, 234, -121, 99, -63, -389, -74, -179, 119, -123, 67, 20, 63, 36, -90, -115, 14, -245, 86, 75, 140, -155, 139, 137, 84, 119, 81, -166, 15, 89, -129, 234, -23, -83, -133, 4, 18, 114, -86, 109, -83, 247, 104, -197, -55, -45, -98, -79, -884, 65, 1095, -741, -69, -64, 59, -293, 140, -468, -478, -158, -130, 116, -120, 249, -359, 12, 705, -578, -509, -124, 617, 86, -772, + 328, -286, -330, 77, 1060, -596, -333, 756, 559, 49, -313, 21, -117, -239, 216, 198, -129, -612, 784, 369, 148, -834, -128, 260, 288, -103, 438, -70, 148, -191, -503, 328, -359, 215, 111, -439, 830, 128, 598, 600, 107, -902, -174, 9, -359, -182, 34, -28, 392, 738, -213, -72, -326, -145, 306, -206, 178, 548, -479, 545, -107, 164, -207, -111, -174, 24, 102, 120, -91, 3, 124, 71, 288, 135, -145, 12, 26, 263, -146, 77, 121, 41, -10, 9, -343, 169, -126, 165, 215, 29, -35, 109, -11, 84, 28, -35, + -126, -128, 255, 44, -60, 72, -159, -30, 261, 342, 47, -314, -1574, 103, -410, 54, 789, 75, -151, 144, 31, -535, -577, -520, -499, 650, -129, 776, 70, -733, -25, 81, 629, 124, -100, -125, 180, -394, -150, 694, -140, -901, -687, 411, -88, -187, 208, -65, -463, 140, 274, 625, -125, -519, 8, -655, 253, 741, -117, -909, 288, -10, 53, 219, -285, 559, 44, -377, 295, -204, -125, 799, -408, -137, -133, 504, 204, -884, 450, -712, -168, -384, 94, -234, -214, -73, 408, -132, -249, 481, -279, 494, -1, -260, -155, 123, + 138, 98, -294, -98, 75, -16, -192, 5, 185, 282, 119, 146, 25, 278, -155, 91, 221, -82, 30, 90, -53, 45, 89, -270, 232, 99, -271, -222, 18, -320, 30, -235, 308, -552, 1, -116, 61, -142, 175, -90, 83, 64, -769, 157, 1269, 827, 378, -630, 472, 597, 883, 427, 104, 31, 553, 956, -216, -117, 541, -1070, 389, 955, -198, -330, 248, 741, 597, -399, -683, -40, 344, -115, 83, 11, 801, -457, 514, 776, -310, -93, 548, -82, 1920, -805, 346, 1315, -757, 249, 88, -1065, -33, 200, -470, 1043, 79, -142, + 81, -432, 1428, 395, -1144, 1106, -461, 43, 339, 412, 733, 359, -198, -714, -962, -359, -386, -64, -295, 608, -368, -636, 72, 179, 131, 235, -361, -350, -213, -230, -758, -318, -258, -521, -251, 191, -222, -488, -23, 194, 331, -75, 156, 363, -20, -241, -14, -144, 201, 291, -402, 358, -208, 8, 54, -183, 373, 148, -522, 326, 50, -181, 387, -434, 177, -77, 190, -100, -121, 79, -70, -39, 138, -74, -298, 145, -26, 98, -12, 257, 314, -1477, 860, 38, 520, 856, -1416, 323, 729, 164, 544, -547, 599, 174, -555, 7, + -350, -1039, 570, 322, 949, -526, -695, -244, 223, -146, -1175, -581, 362, -89, 176, -498, -153, 390, -331, -167, -501, -119, 183, -558, 59, -1217, -1000, 307, -1040, 89, -1088, -765, -525, 510, 1017, 1249, -295, 554, 679, 326, 295, -487, 1393, 1416, -963, 964, -757, 484, 1000, 946, 1158, 1378, 981, -1101, -778, -11, 29, 413, -260, -214, -657, -368, -975, 212, 823, -334, 203, 853, 406, -589, 660, -43, 235, -67, -113, 187, -204, 288, 249, -221, -261, 249, -177, 6, 11, -24, 75, 22, -349, 325, -146, 154, 192, -134, 207, -255, + -181, 163, -198, -263, -111, 100, -98, 61, -230, 5, 90, 213, 328, -80, 187, -218, 4, -43, 103, 71, -15, -169, 1827, -1337, -680, 721, -429, 688, -537, -599, 202, -1416, -64, 952, -230, 489, -812, -200, -321, 32, 1015, 307, 226, -181, 557, 179, 1386, 341, 809, 57, -633, -599, 806, -393, 373, -8, -1041, 750, -928, 1801, -1344, 820, 734, -772, -649, -480, 666, -51, 697, -9, 91, -1234, -663, 286, -606, 200, -370, 361, 205, 945, -563, -194, -240, -464, 1281, 237, 120, -1196, -388, 642, 378, 408, 1111, 711, 982, 1134, + -34, 502, -473, 1509, 112, -250, 549, -130, 1157, 20, -234, -240, 138, 812, -618, 419, -198, -68, 240, 160, 315, -200, 205, 378, -101, -146, 256, -44, -42, -31, 67, 40, 122, -279, 361, -216, -121, -61, 219, -315, 29, -226, 300, 545, -186, -154, -76, 373, 182, 390, -35, -232, 177, 185, -60, 184, 143, -539, 79, 607, -86, -2758, 1918, -1189, -831, 21, 394, 496, 90, -441, 1494, 759, 210, -746, 491, -23, 558, -712, -492, 385, 1118, -1278, 54, 418, 138, -312, -188, -158, 53, -62, 291, 1409, 93, -632, 948, -218, + -912, -1177, 1126, 371, -154, 422, 262, 939, -1268, -131, -644, -180, 728, -531, 285, -613, 300, 1944, 149, -1106, -1244, -73, 596, 587, -497, 125, 946, -392, -1824, 1046, -628, -1034, 458, 1737, -1195, 878, 1211, 422, -1045, -869, -537, 441, 380, -356, 1087, 536, -66, -25, 67, -899, -344, -634, 331, 300, 217, 303, 223, 674, -332, -155, 129, 11, -514, 454, -18, 288, -128, 220, -331, -92, -199, 325, 61, 76, 9, 201, 490, -181, -934, 90, -461, -76, 279, -380, -257, 546, -497, -94, 4, 272, -533, 55, 1593, 511, 115, -126, + 261, 436, -132, 198, -230, -12, -180, 734, -826, -104, 509, -1170, 385, -293, 97, -146, -315, 198, -80, -482, 1280, -979, -263, 892, -568, -98, -173, 189, 902, 60, -861, 1184, -635, 416, 753, 322, -269, 56, -647, 151, -388, -322, 1609, -381, -629, 199, -289, 370, -239, 408, 1038, -575, 350, 776, -914, 414, 512, 221, 638, -726, -180, 1089, -749, -176, 323, -317, 1058, -1051, 186, 366, -473, 356, 410, -1002, 362, 837, 0, -264, -31, 535, -103, -941, 766, 349, -400, 145, -216, 326, -122, -426, 500, 18, -97, -372, 350, 55, + -474, 163, 333, -77, -149, 61, 309, -54, -301, 308, 218, 29, -6, 256, 61, 84, -359, 459, -248, 491, -894, -2410, -3790, 346, 3630, 299, 8221, 8488, 4226, 8888, 5928, -1228, -127, -1954, -7136, -6263, -3872, -7289, -5705, -1656, -3574, -2989, 1063, 1796, -864, 473, 1602, -1229, -720, 2257, 2003, 233, 2240, 3823, 1279, 2768, 5229, 2515, 1329, 4689, 3919, 527, 2816, 5495, 1090, 1297, 4438, 1915, -478, 3140, 2962, -273, 2615, 3375, -55, -2467, -1151, -5799, -9580, -8518, -9084, -13873, -12463, -11662, -14186, -13784, -11312, -10201, -9181, -5318, -2051, 1790, 3818, 7320, 10919, 11923, + 13282, 17334, 17107, 13459, 14721, 13015, 5381, 5864, 4979, -219, -827, 1435, -213, -2244, 278, 1493, -1460, -584, 1318, -710, -2849, -946, -779, -4121, -2927, -798, -3242, -3670, -271, -1314, -3716, -1795, -1693, -5215, -4947, -4484, -8066, -8714, -7272, -7753, -8365, -6002, -5127, -4455, -3240, -1765, -822, -256, 624, 2807, 3849, 5967, 9766, 11052, 12229, 14289, 13947, 12259, 10412, 7263, 3080, 726, -798, -2354, -2730, -2658, -2660, -2669, -2451, -2175, -2276, -2264, -2090, -2166, -2305, -2163, -2044, -1971, -1747, -1351, -1044, -784, -406, -98 } + }, + { + {50, 197, -98, 54, -20, 11, 9, -80, -90, 59, -17, -73, -93, -57, 82, -9, 110, 23, -139, -144, -102, 42, 35, 74, -11, 85, -65, -12, -150, -23, -28, 31, 57, 57, 111, -56, -74, 60, 34, -73, -74, 3, 52, 25, 123, -47, -39, 140, 43, 262, 111, -74, -3, -162, 3, -184, -12, -69, 127, 13, 68, 93, 50, 89, 59, 12, -154, -18, -77, 106, 155, -109, -78, -47, -63, -83, -132, -30, 40, -78, -64, -28, -109, 12, -22, -74, 23, 4, 0, -37, 6, 6, 40, -12, 26, -14, + 19, -6, -24, 6, 32, 5, -29, -30, -3, 54, 13, -11, 9, -16, -309, -331, -26, -95, 13, -72, -19, 184, -33, 99, -45, -88, -122, 22, -25, -146, 168, 51, 12, 90, 86, 139, 98, -9, -103, 96, 22, -139, -61, -63, -42, 124, -43, -212, -72, -24, 44, -66, -138, 4, -14, 161, 24, -1, 59, -4, 217, -37, 20, -48, -86, 0, 93, 42, 25, 88, -81, -134, -96, -19, 18, -31, 4, -101, -22, 53, -32, 105, 55, -6, 20, -99, -84, 163, 37, 70, 47, -29, -10, -124, 9, -71, + 30, -24, 32, 34, 96, -10, -34, 6, 21, 13, 3, 3, -29, -23, 12, -10, -25, 39, -20, 20, 30, -28, -8, 22, -9, 40, -24, 20, -19, -14, -50, 46, 214, -12, 110, 64, 146, 179, -41, 15, 111, 109, 73, 205, 42, -68, 9, 179, 63, 85, 156, 209, 138, -48, -143, 101, 69, -84, -139, 7, -81, 36, 53, -51, -69, 69, 55, 123, -83, -170, -85, -74, -113, -40, -129, 76, -176, 75, 15, 40, -78, 167, 128, -120, 148, 54, -22, 47, -107, -35, 101, 35, 42, 25, 120, 47, + 149, -75, -9, -11, 58, 85, -35, 56, -78, 38, 52, 45, 164, 4, 122, 135, 77, -126, -24, -21, -33, 9, 69, -30, 2, -7, 8, 23, -20, 28, 48, -35, -18, 44, 1, -1, -2, -28, 11, -14, 4, 33, 57, 1, -8, 27, 22, 7, 13, 9, 14, -4, -8, 24, 31, -31, 16, -12, 591, 5, 523, 42, 332, -71, -57, 91, -248, 271, -154, 182, 134, -99, 79, -7, 10, -46, 75, 107, 133, 219, 53, 70, -9, 258, -295, 8, -23, 71, 125, -155, 59, 71, 36, 103, 55, -119, + 57, 231, -43, 71, -39, -35, -11, -165, 255, -3, 24, 191, -27, 16, 236, -346, 95, -6, 103, 281, 83, 69, 96, -29, -79, -52, 68, 27, 150, -53, 123, 59, -43, 27, -100, -63, 12, -28, -138, -86, -141, 84, 122, -32, 37, -28, -94, -2, 50, 53, -168, -5, 14, -24, 8, -33, 2, -35, -82, 0, -55, -41, -68, 5, -67, -18, -65, -46, -4, -21, -35, -2, 7, 33, -35, -236, -291, -115, -44, -108, 232, 100, -186, 207, -29, -151, 45, 91, -85, -138, -125, -262, -133, 114, -167, -266, + 75, 108, 21, -98, 199, 25, 184, -11, -43, 106, 174, -248, -119, 68, -56, 61, -163, -11, 43, 59, -140, -252, -72, 74, -44, -31, 14, 82, -26, 46, -86, 147, -193, -143, -51, -140, -43, -38, 55, -103, 77, 159, -15, 38, 42, 77, 154, -59, -31, -29, -66, 162, -67, -281, -181, -119, 269, 5, 154, 72, 22, 43, -20, -5, 129, -43, -31, 43, -24, 22, -60, -35, 28, -7, 31, -8, 18, 50, 34, 46, -1, 33, -9, 48, 50, 84, 51, 67, 14, 45, 36, 28, 38, 56, -27, 5, + -13, -23, 21, 33, -67, -255, -594, -55, 41, 7, -193, -85, -219, -56, -258, -295, -231, -53, -153, -333, -208, 69, 103, -92, 200, 111, -74, 247, 53, 21, 40, -338, -12, 57, 127, -106, -94, 202, 392, -293, 106, -86, -15, -258, -23, -3, -132, -167, -121, -142, -76, 85, 288, -134, 108, 195, 176, -59, 20, -63, -56, -265, -131, 151, -95, 33, -91, 76, 40, -29, -10, -123, -102, 24, -37, 55, -314, -332, -35, -48, -142, 0, 106, -163, -125, -139, -241, 171, -17, -36, 66, -9, 59, 113, 39, 63, + 36, 83, -24, 16, 14, 20, 28, -21, -20, 5, 26, 33, -20, 27, -29, -56, 32, 23, -22, 75, 34, 6, 29, -44, -48, -12, -25, -19, -369, -73, -444, -100, -315, -38, 59, 80, 342, -213, 77, 92, -185, -84, 275, 29, -80, 34, -226, 205, -290, -96, 130, 80, -30, 49, -57, 95, -123, -218, 15, 105, 87, -174, 49, 196, -201, -255, 204, -174, 133, -125, 74, -5, -181, -236, -145, 64, -9, 88, -123, -120, -301, 157, -215, -99, 117, 267, -34, -56, -393, -310, -103, -111, 148, -42, -230, -37, + 12, -129, -31, -276, 184, 71, 232, 283, 150, 12, 124, 253, -21, -58, -17, -77, -251, 14, 19, 54, 135, -55, 30, 0, -98, -53, 92, 88, 84, -64, 26, 35, 32, 31, 37, 12, 70, 69, 48, -14, 33, -12, 28, 50, 18, 20, 2, -17, -15, -1, -43, -20, 219, 115, 636, 308, 412, -128, -16, -7, -628, 33, 271, -125, -48, 21, 396, -67, 230, -47, 220, 121, 272, 381, 49, 255, -78, 220, -29, 408, 217, -7, 232, 187, -68, 179, 108, 154, -122, -98, -330, -20, 234, 45, 30, -77, + -123, -99, -109, 574, -369, 146, 175, 99, 50, -221, -293, -75, -44, -14, -508, -252, -261, 12, -12, 150, -17, 134, 180, 325, 60, -84, 109, -206, 56, -151, 55, 125, 71, 207, -140, -160, 746, 101, 135, 93, 253, -180, -93, 158, -19, -5, 29, 51, 146, -74, -12, 26, 84, 18, -78, 140, 5, -35, 3, -18, -77, -73, -34, -81, -1, -33, 34, 100, -10, -12, -113, -25, 54, -14, 6, 8, 87, -48, -14, 26, 32, 975, 105, 145, 110, -61, -395, 267, 283, -158, 124, 127, -236, -33, 233, 133, + -417, 106, -112, -214, -2, 123, 36, -4, -5, 180, -53, 102, -323, 131, -30, 128, 77, -60, 236, -317, -133, -313, 277, 129, 449, 220, 3, 96, -356, -3, 110, 115, 115, 24, 68, -95, 108, 320, 435, 186, -191, -108, -39, -85, 166, 218, -145, 129, 246, 74, -326, -654, -317, 132, 293, -123, 92, -24, -54, -2, 306, 55, -240, 405, 190, -469, 29, -56, -143, -52, -63, 0, 171, 69, -118, -67, 105, 175, -69, 134, 43, -108, -19, 18, 14, -20, 19, -53, -30, 40, 21, -47, -41, 4, -23, -79, + 61, -27, -31, 24, 95, -88, -130, 1, -9, -206, -24, 54, 12, -123, -2, -44, 53, 32, 79, 54, -596, 178, 286, -322, 209, 348, -850, 182, 39, 185, -315, 480, -670, -8, -46, -57, -66, -198, -252, -44, 244, 23, 9, -130, 172, -29, -80, 126, 300, -199, 217, -41, 133, 63, 204, 307, -68, 79, -397, -202, -79, -154, -361, 37, -129, -239, 354, -330, -106, -157, -173, 237, -267, 150, -91, 244, -125, 267, -351, -103, 50, 324, -569, -218, 26, -2, -97, 226, -292, -586, 132, -515, 265, -186, 7, -539, + -204, 575, 333, -438, -358, -311, 24, 171, -70, -198, 382, 130, -60, -86, -134, -34, 154, -142, 165, -23, -103, 15, -77, 53, 141, -85, 66, 93, 76, -17, 163, -153, 154, -47, 136, -177, -82, 20, 19, 172, 68, 101, -52, -108, 67, -203, -442, -190, 557, 23, -459, 432, -202, 29, -479, 73, 190, -423, -103, -378, -3, 24, -127, -105, 369, 56, -250, 62, -535, 321, 510, -165, 213, 361, -27, -74, 45, 43, 212, 36, 49, 111, -299, -22, -344, -352, -144, 147, 209, -11, -414, 81, 109, 203, 443, -454, + 664, -551, 24, -111, -95, -267, -511, -689, -267, -79, 175, -53, 28, 101, -5, 484, 229, -498, -78, -11, 318, -345, 23, -695, 130, 542, -485, -191, 68, -6, 135, 759, 11, -101, 39, 386, -263, 103, 141, -58, -29, -6, -11, 171, -57, -40, -149, 250, -55, 73, 25, 44, 62, 182, -128, -33, 193, -141, -198, 162, 7, 79, 109, 61, 199, -156, 92, 110, -70, 281, 96, 172, 62, -171, -63, -30, -31, -284, -576, 689, 294, -338, 447, 448, 636, -235, -220, 464, -68, -92, 162, 206, 83, 99, -633, -67, + 2, 5, 35, -72, 269, 520, 53, 35, -8, 25, 479, 127, -33, -105, 123, 106, -75, 55, -273, -57, 417, -414, -201, -357, 466, -427, 214, -175, 137, -93, 111, -343, 79, 517, -340, 27, -903, -41, -319, 24, -843, -38, -41, -260, -181, 687, -738, 123, -200, -276, 199, -251, -577, -406, 56, 30, 119, -287, -389, 221, 18, 42, 259, -432, 323, -314, -147, -136, 76, 10, 92, -57, -110, 26, -63, 90, 200, 116, 73, 55, 54, 52, -23, 217, 40, -44, 162, 166, 62, -95, -11, -138, 217, 75, 174, -88, + 178, 158, 233, 113, -68, -125, 196, 38, 169, 36, 44, 42, 49, 578, 203, -76, 125, -289, -305, -250, 563, -503, -626, 300, -582, 216, 23, 159, -260, -62, -316, -134, -244, 118, 291, 200, -469, 547, 67, 192, 51, 264, -56, 253, 63, -112, 163, 59, 215, 148, -356, 144, -104, 101, -72, -133, -109, -250, 235, 251, 263, -49, 480, 572, 230, 75, 261, 593, 294, 646, 416, 482, -516, -521, 107, -105, -139, 41, -259, 217, 163, 102, 494, -115, -317, -267, -234, 58, -111, -1057, -459, -411, -148, -214, -110, -160, + -299, 11, -179, -173, 71, -173, -53, -266, 17, 14, -41, -379, 158, -1, 20, -286, 88, 102, 112, 31, 334, -214, -80, 68, 39, -24, 139, -152, -126, -28, 238, -24, 174, 194, -39, -245, -216, -27, 248, 19, -172, 24, -35, -120, -86, -38, 18, -184, -152, 470, 319, -1029, -760, -237, -10, 340, -142, -24, -820, 116, -430, 307, -60, 407, -349, -86, -414, 72, 336, -161, 97, -236, 16, -553, -155, -26, 38, 411, 532, 19, -492, -344, -161, 51, -132, 157, -566, -174, -80, -146, -319, -73, -149, 385, 554, 377, + 134, 230, 230, -268, 927, 565, -737, -633, 679, -536, -314, 107, 71, -520, 501, 34, -1579, 423, 983, -683, 676, 913, -309, -93, 482, -568, -383, 192, -316, -355, 408, -690, -216, 90, 10, 41, -73, 255, -187, 110, 31, -182, 359, 188, -19, -232, 275, -176, 210, -187, 258, 29, 48, 270, -215, -232, 63, -214, -140, -9, 16, -142, -266, 124, -614, 1, 272, -223, 157, -67, 75, -253, -2, 140, -127, 92, 536, -241, -236, 537, -396, -64, 443, -321, -203, 338, 208, 222, -55, -331, -265, 312, -249, -23, 93, -469, + 305, 249, -190, -154, -366, 9, -226, 315, -514, 38, 197, -28, -244, -533, -120, -232, -52, -412, 561, -549, 96, -201, 141, -777, 800, 151, 79, -322, 182, 129, 34, 72, -144, -614, -107, -267, -394, -528, -191, -134, -524, -202, -25, 360, 166, -475, -415, 253, -110, -602, -260, 146, 493, 489, 498, 796, -155, -543, -519, -35, 349, 620, 278, 131, -636, 355, 131, 604, 419, 272, 206, -2, 52, 354, -87, 22, 61, 100, 120, 112, 170, 425, 132, 28, 145, -14, 135, 35, 23, 262, -326, -235, -89, 115, -167, 101, + -75, 330, 9, 50, -179, -224, 15, 189, -188, -27, 222, -194, -15, 99, -328, 388, 208, -79, 91, -24, -9, -104, 220, 371, 1003, -885, -26, -353, -468, -281, 459, -252, -273, 235, 592, 372, -444, 286, -466, 342, 19, -53, -225, -349, -280, 58, 64, -551, 349, 56, -49, -210, -232, 389, -532, -26, 581, 681, -611, -42, -120, -398, -511, 560, 129, 355, -108, 42, -47, 354, -137, 18, -438, 629, 528, -770, -937, -201, 13, -311, 34, -232, 74, -479, 508, -615, -534, -202, 91, 421, -218, 611, 68, -221, -206, -163, + -383, 372, 283, -104, 240, 183, -298, -304, -252, 473, 130, -342, 50, 132, 167, -509, 268, 200, 105, -7, -132, 65, -145, -453, 105, -62, -70, -55, 57, -139, -160, -11, -50, 224, -108, -65, 144, -62, -199, 176, -198, -71, -355, 195, 54, -54, 80, -167, 343, -22, 71, 370, 282, -104, -105, 178, 116, -128, 88, -118, -91, -24, 100, -1358, 2012, -1382, -353, 364, 1086, 883, -327, -354, 57, 50, 560, 207, -743, 223, -162, -261, 72, 304, -6, -556, -492, 260, 210, 344, -190, 426, 97, 499, -54, -170, 367, -44, + -397, 69, 456, -19, -526, 260, 607, -562, 219, -604, 237, -763, -501, 841, 781, 368, 1018, -196, 1215, 453, 467, 655, -1105, 930, 315, 377, 426, 104, -541, 89, 1024, 1171, -17, -1323, 648, 37, 274, -44, 29, -287, -1002, 204, -169, 227, -189, 497, -565, -600, -427, 90, -186, -268, 318, 129, -435, -453, -365, -265, -52, -68, 234, -3, -374, 296, 53, -87, 11, 149, -189, -86, 178, -319, -143, -216, 185, 245, -278, 89, -735, 23, 30, 49, -148, -127, -335, -236, 161, 119, 154, 267, -249, 33, 93, 79, -244, 15, + 54, 6, -202, -13, 1332, -51, -1580, -802, -929, -358, 11, 520, -1347, -304, 215, -631, -722, -662, -721, -119, 801, 408, -314, 381, 160, -369, 414, -465, -100, 190, 275, -920, 463, -454, 265, -184, -734, 201, 231, 110, 124, -310, -1044, 38, 218, 224, 13, 126, -432, -10, -35, 946, -144, -1568, -705, -175, -1297, 290, -395, -337, -624, -286, -933, -921, -1122, -118, 1182, 156, -748, 338, 10, -90, -421, -599, 248, 480, 371, 194, -225, -966, -685, -973, 141, 98, -34, 335, -509, -623, -88, -237, -629, 127, 360, 40, 131, 592, + -110, -137, -105, 28, -218, -133, 268, 400, 449, 291, -127, 7, 68, -203, 415, -186, 607, -229, 283, -306, -84, 603, 202, 69, -6, -258, 240, 36, -305, 119, -261, -349, 92, 81, -209, -218, 207, -7, 293, 45, 198, -130, 84, 64, 869, -95, 695, 916, -776, -953, -1021, 275, 346, -1380, -811, 37, 31, 428, -1625, 182, 365, 1131, -1303, 163, 203, -151, 705, -401, 1241, -59, 101, 387, 477, -462, -1018, 598, 704, 175, 893, 185, -124, -327, -772, 1192, -538, 1131, 434, -72, 323, -463, 597, 610, -427, 456, 219, -1163, + 847, 882, -118, -587, 105, -17, 30, -199, 1607, -18, -945, -513, 176, -1341, -1780, 255, 2211, 503, -164, -1404, -367, -222, 1506, -1021, -670, -2478, -368, -442, -594, -453, 908, 992, -981, -362, 314, 151, -185, 417, -178, -291, -313, 363, 132, 129, -130, 356, -356, -101, 293, 156, -26, 5, -267, 146, -179, 666, -183, -331, -294, -532, -193, 447, 475, 1334, 494, -127, -1006, -1360, -653, 44, 561, 482, -375, -527, -285, -201, 339, 623, 127, 60, -80, -185, -185, -2210, 642, 1069, -1423, -122, 798, -337, -641, 579, -618, -332, 47, -458, + 751, -246, -343, -124, 397, 1366, -212, -619, -699, 259, 649, 395, -618, -90, 738, 27, -560, 193, -500, 1263, -568, -1353, 469, -222, 649, -905, -898, 908, -73, -1161, -622, -1109, 1444, 704, 389, -1515, 269, 636, -1069, 70, -768, -574, 594, -509, 681, -419, -928, -202, -232, -130, 316, 118, -581, 1806, -224, 806, 815, 506, -249, 197, -412, 1020, 245, -247, 117, 438, 698, -167, -1532, -96, 471, -144, 801, -334, 273, -115, 15, 340, 74, 210, 405, 251, 471, -107, 149, 260, 26, -483, 581, -237, -4, 98, -302, 158, 23, -72, + 402, -178, 22, 597, -14, 336, -297, -180, 310, -69, -229, -303, 7, 47, 64, -98, 66, 189, -77, 1599, 333, 690, -55, 163, 258, -588, 261, 555, 10, -676, -355, -503, -200, -678, -645, 76, -513, 755, 251, -182, -546, -269, -176, 404, -122, -641, -520, 128, 141, 359, 143, -145, 174, -559, -1683, 65, 2054, -65, -1485, -247, 981, 266, 164, -33, -642, -812, -477, 178, -44, -752, 281, -1506, -263, 1384, 414, 1781, -229, -711, -207, -163, 484, 98, -7, -980, -484, -472, -60, 1125, -146, -282, 379, 453, 80, -608, -934, -74, + 388, -48, -460, -126, 269, -204, -169, -314, 574, 593, -294, -164, -269, 237, 360, -170, 58, -69, -42, -118, -442, 43, 264, -279, 75, -72, 28, -250, -75, -109, -153, -191, -183, -60, 811, -405, 12, -163, 52, 437, -292, -48, -78, 134, -13, 121, -222, -707, -2366, -3643, 857, 3269, 1027, 7994, 7523, 3353, 7760, 3285, -1409, -17, -2337, -6382, -3489, -3339, -6549, -4760, -2739, -4116, -2773, 611, -241, -1311, 1563, 1469, -5, 1575, 4249, 1793, 800, 4074, 3638, 1230, 4334, 5313, -9, 3152, 5351, 2037, 2142, 5467, 3263, -421, 4261, 3000, -1160, 1682, + 3388, -1506, -2686, -597, -5677, -9522, -9225, -10247, -16406, -14190, -11712, -15169, -13012, -8352, -9912, -7566, -2094, -666, 3213, 5988, 9856, 13214, 14407, 16815, 18255, 17063, 16154, 17148, 13041, 10349, 12267, 6702, 1075, 1559, -2468, -9037, -7593, -5607, -8106, -8280, -5168, -5875, -7420, -5427, -4942, -6969, -6259, -4069, -5191, -5567, -1815, -1737, -3286, -323, 1272, -922, 193, 1273, -1766, -2280, -2171, -4766, -5273, -3676, -2761, -1996, 710, 3277, 4433, 6279, 8027, 8391, 8891, 9841, 9330, 8496, 8844, 8023, 5969, 4113, 1100, -1542, -4022, -5854, -6567, -6900, -6151, -4688, -4101, -3433, -2805, -2401, -2112, -1568, -1216, -1085, + -1046, -680, -456, -285, 15, 443, 739, 1127, 1173, 1183, 1220, 1144, 788, 628, 245 }, + {-17, 340, -169, 13, -101, -8, 144, 68, 90, -79, 112, -116, 126, 63, 151, 64, -29, -171, 184, 127, 47, 22, 17, -73, -83, 95, 58, 62, 91, -93, -7, 86, 101, -13, -76, -144, 0, 27, -87, 33, 23, -130, -70, -10, 66, 2, -64, 121, 22, -41, -90, -20, 10, -169, 78, 106, -59, 136, 111, -18, 92, 54, 179, 57, 33, -28, 67, -145, 18, 70, -72, 80, 95, 106, 65, 139, -30, -84, -44, -35, 18, -32, -108, 51, -51, -56, -66, 25, -1, -33, -27, 43, 2, -5, -12, -4, + 19, 29, -5, -1, -25, 7, -45, 5, 29, 39, -29, -29, 6, 26, -323, -226, -32, -145, -125, 61, -184, -177, 51, -80, -72, 74, -58, -126, -14, -9, -36, -57, -34, -144, -9, -104, -75, -4, 129, -29, 186, -97, 112, 129, -144, 50, -37, 28, -102, 51, 66, 99, -51, -121, -42, -66, 39, 47, -147, -18, -101, -81, 27, -120, -193, -36, 189, 42, 66, 11, 43, 26, 69, 75, 212, 16, -95, -122, -26, -58, -16, -246, 51, -17, 78, -33, 22, -58, -29, 242, 48, 222, -76, -40, 17, 63, + 21, 76, -74, 82, -86, -53, 43, 32, -4, 4, 1, -18, 6, -32, -3, -11, -6, 15, 16, -17, -32, -19, 2, 2, 5, 11, -14, -14, -14, 4, -6, 18, 262, 303, 233, 173, 244, 100, 106, -22, 69, 258, 27, 79, -96, -64, 197, -132, -242, 74, -203, 175, 41, 210, -67, -13, -52, 69, 83, -3, -206, -42, 176, -117, 79, 47, -40, -50, 195, 148, 341, 137, 28, 82, -29, 21, 107, 64, 291, -125, -84, 21, 74, -46, 134, -126, 26, -8, -98, 30, 29, -131, -179, -110, 140, 68, + 0, -11, 106, 8, 35, 185, 91, -44, -30, 164, -143, 19, -129, -58, -167, 45, -35, -98, -65, 96, 59, 17, 56, -92, -16, -8, 71, 2, 4, 13, 21, 52, 58, 46, 3, 25, 53, 3, -49, 45, -25, -10, 10, -8, 39, 36, 17, 0, -14, -14, 16, 22, 8, 34, -70, -44, 34, -2, 570, -10, 279, -51, -44, 300, -294, -102, -23, 148, 103, -63, 57, 28, -266, 67, 142, 126, -298, -105, 34, -214, -59, 16, 9, 29, -33, 136, -97, 108, 223, 223, -65, -128, -23, 251, -15, -14, + 1, 24, -131, 22, 105, 15, 25, 101, -68, 68, 39, -28, 176, 17, 140, 27, -48, 60, 93, 80, -5, -139, -127, -167, -75, -7, -1, -21, 123, 105, -81, -164, 4, 84, 101, -101, -20, 95, -10, -15, 127, 59, 60, -49, -42, -9, 54, 81, 1, 61, 21, 3, 11, 19, 75, 56, 85, -46, 39, 4, 9, -15, 7, 11, 2, 9, -16, 39, 39, -40, 8, 21, 24, -15, 78, -153, -425, -111, -144, 27, 71, -73, -85, -804, 16, 257, -188, -302, 225, -342, -52, -154, -179, -113, -113, 10, + 136, -27, 76, -89, 103, -81, -122, 52, -46, -194, -245, 115, 11, 114, 35, 257, 36, 88, -125, -218, -63, -109, 215, -103, 5, 54, -107, 299, 199, 2, -240, -307, -104, 99, -275, -9, -134, -264, 24, -412, -91, -46, -152, 273, -17, -46, -5, 170, 220, 64, -221, -74, -56, 116, 55, 66, -124, -160, 124, 82, 31, 39, -8, 68, 20, 104, 30, 22, -9, -6, 17, 66, 98, 58, -24, 37, -122, 61, 73, -23, -10, 20, -28, -10, -7, -40, -40, -24, -12, 21, 49, -10, -56, -2, -80, 25, + 109, 45, 65, 44, 170, -459, -677, 82, -155, 150, -190, -337, 8, 308, 63, 189, 151, 117, 75, -109, 82, 205, -323, -151, -108, -73, 117, -27, 40, 213, 185, -76, -182, 42, -102, -78, -177, -123, -268, 64, -101, -2, 237, -48, 45, 63, -171, 144, 142, 199, -175, 314, -51, -229, -194, -251, 233, -88, -267, 81, -41, -188, 200, 269, -93, -224, 166, 53, 131, -19, 361, 212, -211, -105, -99, -82, 121, 166, 215, 0, 29, 82, -85, 78, -23, 139, 197, -267, -119, -135, -83, -137, -10, -97, 46, -6, + -8, -12, 37, -66, 168, -22, 72, 25, 36, -33, 8, 4, 11, -57, 13, -38, -57, -89, -24, -6, -13, 2, 12, -19, -10, -34, -29, 51, -632, 0, -115, 42, -1, 239, 175, 247, -40, 337, -157, 229, 281, 52, 280, 61, 73, -78, -29, -118, 222, -14, -25, 313, 189, 3, 84, -26, -10, 203, -116, -201, 0, -28, 103, -568, 342, 369, 146, 72, 10, -181, -379, 251, -153, -172, -115, 225, -158, 139, 141, -135, -89, -327, 151, -213, 126, 21, 113, 199, 318, 136, -146, -349, -62, 214, 350, 263, + -53, -69, -225, -374, -40, 259, 116, 82, -83, 344, -12, 116, 33, -67, 33, -176, -85, -89, 58, -44, -125, -74, -87, -94, 37, -134, -56, 25, 23, 103, 5, 14, 17, -29, 84, -27, 96, 34, -28, -74, -4, 92, 65, -12, -90, -24, 79, 70, 10, -17, -11, -55, 61, 242, 826, 452, -40, 80, 74, 184, 327, -44, 65, 555, 57, -22, 334, 235, -230, 140, 34, 225, 154, -382, 293, -176, -24, 35, 230, 43, 63, 176, 200, -188, 206, 613, -107, 280, 286, -150, 225, 61, -146, -157, 110, -140, + -379, -47, -17, 41, -486, -117, 150, -306, -206, -505, 168, 235, -346, -122, -167, 368, 9, -208, -146, -232, 118, 308, -218, 120, -93, 149, 347, 147, 274, 279, 347, 54, -195, -193, 139, 221, 32, 149, -156, 63, -19, -47, -163, 23, -73, 10, 132, 57, 55, 46, 146, -90, 5, -24, 43, -17, 4, 63, 16, -51, 78, -17, -114, 70, -81, -64, -84, -169, 91, -39, 76, -9, -17, 22, 124, 84, 111, 52, -3, 46, 128, 849, 229, 34, -48, -123, 7, 159, -102, -197, -289, 22, 209, -259, 129, 170, + -71, 574, 205, -143, -96, -44, 208, -85, -190, -211, 134, -460, 18, -130, -166, 146, 34, -169, -102, -163, 231, -77, -362, -45, 10, 26, -209, -298, 30, -57, -38, 100, -61, 277, 60, 165, -176, 404, 120, -204, 270, 511, -145, -127, 265, 241, 103, 146, -314, -86, -339, 99, 323, 143, -398, -83, 130, -398, -619, -56, 23, 175, 567, 43, -62, -178, -131, 87, 146, 118, -6, 61, 8, -127, 80, 95, -156, -154, 174, -59, 103, 74, 54, -45, 40, -7, 62, 12, 93, 0, 82, 53, 21, -76, 169, 50, + 154, -35, -48, 52, -98, -20, 75, -98, 28, 52, 37, 33, 84, -35, -145, -5, -13, -160, 26, -69, -659, 310, 876, -360, 615, -139, -133, -193, -318, 236, 9, 161, 159, -576, 8, 268, -234, -124, -363, 642, -400, 316, 299, -382, -157, -134, 269, -306, -125, 310, -54, -84, -151, 379, 67, -62, -156, 10, -289, 312, -37, 144, 780, 523, -449, -318, 123, -41, 327, -180, -263, -94, -490, -189, -58, -376, -215, 833, 199, 3, -41, -9, 245, 294, -62, 290, 23, -159, 32, -445, -33, -412, -223, 249, 364, -547, + 222, -140, -173, 265, -38, -252, -14, -98, -197, 101, 74, -137, -339, -163, -33, -26, 269, 80, 68, -145, 3, -60, 145, 161, -85, 69, 123, 133, 105, 151, -58, 11, -102, 9, -119, -64, 48, -33, -95, -23, 54, -160, -77, -87, -46, -61, -698, 119, 649, -172, -165, 139, -201, -166, 184, -26, -36, -10, -440, 746, -794, -78, -18, 270, 164, 8, -301, -219, 96, 581, -47, -259, -175, -416, -27, -245, -193, -87, 131, -16, 20, -282, 57, 77, 180, 147, 181, -383, 2, -80, 251, 61, 508, 107, -117, 43, + -275, -4, 222, 284, -435, -340, -31, 452, -710, 184, 821, 449, -218, 74, -440, 184, 407, -696, 157, -340, -94, -943, 6, -399, 369, 23, -436, 289, -26, -566, -74, -359, 235, -201, -293, 399, -76, 69, -132, -176, -46, 169, 130, -98, -22, 6, -97, 61, 99, 140, -142, 55, 78, -172, 13, 73, -120, 10, -77, 187, 103, 228, -107, -87, 79, -220, -21, -64, -32, -13, 48, -124, 10, -18, 45, 40, 10, -190, -530, 838, 246, 439, -494, -557, -99, 147, -151, -75, 286, 76, 92, 248, -614, -69, 13, 156, + -425, 55, 78, -300, -161, -413, -305, -3, 137, -334, 29, -152, -292, 114, 4, 235, -650, -685, 146, -60, 260, 572, 67, -363, 516, -257, -479, -373, -156, 39, -509, -199, 505, 681, 290, 189, 144, -81, 436, 244, -506, -279, 4, 49, 477, 304, 77, -75, -58, -236, 317, 246, 550, 123, 161, 64, 988, 109, 383, -412, 35, 373, -895, 71, 118, 249, -93, 131, -117, -33, 153, -77, 473, -193, 277, -77, -169, -94, -183, 2, 74, 89, -39, -96, 197, -63, 131, -75, -77, -149, 147, 158, 33, 11, -123, -214, + 96, -23, 5, 244, -72, 213, -36, 122, 84, 162, 35, -161, -32, 565, 38, 703, -25, -327, -356, -665, 120, -283, -20, 53, 236, 343, 584, 604, -96, 537, -42, -51, 202, 452, 196, 123, -727, -376, -592, 295, 589, 111, -257, 408, 590, -84, 90, -143, 496, 417, 355, -215, -378, -64, -99, -841, 144, 111, 73, -217, -113, -937, -332, -851, -150, -638, -331, 608, 160, 640, 41, -531, -258, -552, -1049, 144, -649, -193, 617, 254, 242, 47, -118, -49, 121, -455, 362, -774, -795, -47, -68, -102, -584, -136, 772, -45, + 49, -209, -667, 336, -448, -179, -445, -279, -207, -146, -159, -102, 13, 77, -416, -183, 83, 72, 237, 107, -137, -179, 156, -286, -40, 85, -214, 66, 69, 155, -145, -54, -75, -14, 108, -64, -6, -85, 170, 228, -72, -39, 66, 75, 149, 202, 42, -37, -45, 331, 666, 580, 624, -360, -627, 482, -285, 498, 150, -800, 202, 149, -902, 485, -411, -419, 247, 275, 44, 326, 25, 16, -211, -122, 199, -125, -308, 21, -580, 210, -737, -448, 28, 293, -100, -305, 116, 231, 173, 14, 596, -1367, -309, -374, -453, 594, + -477, -65, -1102, -308, -129, 58, 737, -177, 95, -443, 374, -552, -356, 287, -1278, 187, 685, 889, 680, 430, 1001, 552, -10, -247, -255, -386, -860, -93, 82, -1219, -480, -368, -273, 391, 1024, 1194, 792, -400, 328, -258, -53, 270, 186, -103, 67, 89, -21, 41, -185, 108, 338, -157, 48, -295, 76, -138, -17, -14, 262, 460, -161, 29, 115, 187, -274, -429, 12, 335, 101, -273, 260, 135, -274, 195, 129, -107, -81, -29, -48, 51, 109, -97, 192, -1173, 2, 196, 823, -268, 380, 346, 182, 189, -1284, 1012, 551, 1255, + 460, -55, -467, -297, -293, -455, 324, 238, -463, -525, 276, 375, 654, 183, -408, -609, 127, 102, 40, 71, 1161, 392, 220, 381, 418, 472, 8, -741, 517, 1621, -169, -455, -992, -216, 1306, 150, 538, 178, -1814, 369, 321, 34, 182, -131, 23, 364, -978, -409, 821, 301, 108, -738, 518, 189, -666, -723, -488, 651, 1361, 1266, 1395, 1415, 50, -640, -527, -1250, -414, 386, -1016, -16, -829, 4, 1097, 423, 447, 540, 334, -344, -120, -423, 591, -371, -329, 100, -79, -225, -406, -124, 400, 376, -190, 587, -38, 5, -281, 78, + 297, -88, -245, -237, 142, -137, 324, 201, 260, 385, -416, 91, 23, 170, -97, -186, 344, 73, 278, -171, 92, -252, -93, 564, 1200, -2415, -829, 171, -1384, -1302, -539, -797, 106, -591, 1539, -178, -522, -234, -1147, -338, -922, -407, 183, -1227, -185, 923, -767, -242, 289, -20, 411, 67, 21, 334, 149, -617, -93, 520, -251, -765, -226, -925, -428, -1608, 176, -1101, 545, 179, -377, -1421, 151, -164, 1754, 674, 53, 925, 429, -6, 786, -915, -406, 53, 697, -760, -431, 2494, -218, 1285, -991, -17, -702, 531, -235, 837, 1359, 21, + -927, 798, -989, -473, 361, -1062, -680, -348, 781, 1439, -1708, 1442, 312, 412, 181, 191, 175, -228, 283, 740, -360, 119, -53, 85, -798, -160, -229, 234, 274, 793, -482, -305, -371, 547, -693, 159, 286, 230, 288, -1189, -258, 411, -179, -515, -43, 126, 53, 486, 276, 383, -372, -365, 425, 106, 294, -278, 296, 173, 76, 89, -86, -135, 31, -906, 1872, -1076, 689, 613, -974, 534, 294, 210, -173, 739, 383, -943, 668, 776, 151, 130, 470, -14, -937, 1216, -695, 274, -517, -121, 153, -230, 991, 220, -132, -241, -53, 191, + -1010, 318, -524, -356, -243, -5, -496, -239, 119, 1045, 10, -223, -669, 276, 183, 28, 812, -201, -86, 964, 303, 53, -935, -492, 600, 333, -876, 24, -1988, -988, 1778, -422, 961, 1257, 357, 210, 570, -249, -700, 370, 116, -50, 803, 518, -580, -1394, -289, 560, 178, -39, 448, -530, 776, -387, 289, 357, 157, 527, 403, 640, 71, -175, 232, 620, -166, 543, 328, -363, 109, 285, 195, 113, 393, 323, 143, 651, -210, 68, -96, -50, -168, 576, 482, 380, -183, 67, 687, -186, 504, 446, 1, 783, -715, 94, 1085, 133, + 308, -232, 765, 141, 1063, -328, -1776, 302, -214, 612, 187, -603, 312, 367, -687, -755, -505, -1260, -1268, 872, -202, -1303, -400, 133, 431, 412, -798, -866, 85, 1203, -576, 464, -810, 287, -914, 594, 627, -449, -940, -648, -105, 368, -404, -267, -337, -1198, -1035, 541, -869, -179, 309, -719, -1158, 440, 608, -80, -1394, 621, 547, 1760, 8, 460, 344, -755, 288, -236, -1523, -236, 930, 219, -771, -1913, 1206, 1540, -459, 1245, 1453, 72, 65, 1146, -745, 54, 1924, -1421, 824, -1218, -333, -102, 828, -284, 121, 461, -14, -1077, 1183, -218, + -138, 179, 494, -811, 354, 205, -121, 243, 289, -753, -101, 171, 394, 815, -68, -722, 366, 836, -667, 815, -387, -90, -287, 919, -637, 215, 577, -402, 145, 98, -531, 113, 230, -104, -403, 259, 337, -192, 669, -1008, 249, 288, 17, 54, 689, -155, 387, -800, -2532, 685, -292, 1892, -651, -415, -760, -2168, 991, -1263, -739, 39, -3, 1673, -1198, -837, 1100, 656, 573, -207, 547, -387, -552, -507, 1289, 1074, 1676, -533, -629, 31, -112, 617, -1012, 218, -1063, 569, 1041, 359, -859, 586, -758, 1706, 867, 242, 229, -262, -1337, 756, + -1813, 380, 337, 886, 702, -1564, 471, -984, -586, 427, -156, 585, 373, -1429, 584, 1316, 1738, -503, 514, -709, 1221, -1733, -92, -314, 548, 1143, 1639, -1310, 327, -1753, 1129, 2313, -587, -1573, -126, -1185, 1517, 386, -773, -218, 89, -258, 1084, 409, -611, 585, -866, 58, 815, -168, -999, 1111, -1595, 465, -240, 640, -39, 398, -366, -195, 164, 142, 171, 758, -771, -648, 38, 176, -177, -804, -588, 1184, 321, -524, -604, -1349, 1621, 1268, -491, -432, -940, 37, 1207, -1988, 1420, -184, -56, 473, 395, 563, 155, 276, -702, 666, 180, -713, + 480, -282, -14, 652, 374, -1014, 569, -479, 844, -614, 212, -313, 391, -298, 179, -444, 971, -84, 24, 292, 324, -490, -105, 225, 322, 300, -345, 127, 12, -986, -85, 260, 361, 162, 230, -887, 139, -48, 87, 209, -179, 198, 145, 88, -218, -197, -72, 1034, -365, 209, 379, -211, 361, -410, 348, 187, -281, -412, 259, -252, 202, -371, -327, -144, 470, -118, 42, 99, -38, 117, -379, 288, -246, 628, -583, 275, -350, 314, -286, 252, 3, 425, -368, 200, -190, 25, 71, 252, -266, 64, -286, 403, -339, -91, 199, 85, + -167, -46, 225, 154, -556, 311, 24, 6, -62, 114, -73, 61, -46, 74, 15, 146, -160, 398, -506, 1582, -114, -512, -782, -355, -439, 575, 332, -417, 34, 50, 187, 26, 398, 138, 313, -107, -12, -94, 146, 340, -316, -2, -156, 11, 413, -235, 40, -106, 163, 84, -227, -84, 243, -75, 397, 283, -415, 133, 87, 218, 91, -392, 265, -73, 258, 206, -469, 128, 1, 105, -53, -206, 333, -82, 151, 8, -101, 154, -200, -28, 277, -191, -230, 463, -300, 432, -46, -350, 716, -658, 572, -203, -344, 363, -338, 100, + 116, -330, 277, -60, -22, 177, -230, 300, -98, -23, 73, -51, 105, -50, 16, 87, -85, 140, -17, -80, 171, -267, 141, -119, -56, 166, 13, -51, 86, -64, 85, 43, -125, 83, 16, -29, -22, 74, 15, 138, -110, 39, 17, -78, 152, -45, -25, -775, -1329, 1677, 4805, 759, 466, -3514, -4344, -1393, -854, 2939, 4484, 2307, 669, -1510, -3245, -2961, -2479, 195, 3715, 3106, 1781, 604, -1589, -2062, -1637, -1583, -558, 749, 1031, 2131, 1526, 369, -517, -305, -1716, -835, -867, -1176, 700, 1318, 763, 1920, 511, -457, -738, -1279, -1009, -159, + -312, 391, 795, 707, 506, 343, -174, -702, -495, -584, 188, 678, 225, 166, -295, -611, -114, -3, -8, 493, 443, 494, 196, -172, -530, -770, -787, -513, 546, 807, 1003, 692, -174, -393, -415, -825, -363, 299, 159, 148, 241, 114, 93, -129, -165, 129, 287, -7, -24, -198, -271, -142, -164, -98, 213, -38, 445, 548, 318, -191, -311, -350, -440, -323, -436, 232, 601, 547, 325, 341, 130, -337, -657, -674, -341, -70, 214, 480, 707, 579, 109, -374, -621, -456, -150, 4, 170, 106, 264, 335, 100, -142, -191, -108, -79, -77, + -21, 17, 137, 84, 16, 2, -4, -26, -53, -66, 15, 34, 42, 4, 4 } + }, + { + {-88, 334, 39, 91, 32, 48, -81, -202, -39, 107, 38, -100, -14, 82, -21, -120, 36, -138, -86, -4, 38, -39, -31, 86, -120, -3, 15, 58, 46, 44, 146, 66, -182, -46, -83, 23, -5, -13, -114, -149, 197, -91, 48, 58, 49, -187, -107, -49, 21, -14, -6, -17, 31, 72, -98, 0, 52, 61, 73, 27, 1, 71, 25, -30, -9, 115, -85, -90, -49, -36, 98, 58, 23, -37, 94, -42, 49, -112, -11, 9, 23, 23, -90, 24, 64, 32, 11, -8, 83, 40, -9, 53, 32, 14, -13, 18, + 14, 12, -16, 20, 5, -17, -14, 29, 6, -3, 0, 1, 5, -27, 19, -8, 15, -21, -190, -114, 81, -186, -262, 51, 23, 32, 38, 37, -226, -37, 66, -143, 150, 146, 126, -51, 12, 34, 96, 22, -3, 19, -65, 61, -24, -24, -31, 185, -111, 64, -70, -60, -63, 49, 101, -108, -54, -59, 74, 70, 113, 77, 15, 99, -84, 59, 23, 26, 207, 49, 102, -170, -46, 70, -85, 81, -37, -62, 22, 124, 84, 57, -30, 25, 93, -112, 148, -20, 121, -49, 100, 119, 101, -56, -149, -220, + -149, 14, -78, 145, 24, 23, 39, -104, -32, -47, 52, -28, -20, 64, -78, -28, 31, -43, 4, -48, -39, -31, -9, -52, 319, 229, 188, 156, 176, 74, -14, -4, -65, -20, 232, -101, -104, 160, 119, 154, -108, 47, -41, 35, 68, 96, 14, -70, -52, -90, -32, -56, -164, -20, 138, -108, -19, 51, -85, -77, 78, -42, -110, -59, 63, -94, -121, -55, -36, 41, -84, -175, 12, -29, -24, 51, -143, -70, 3, -60, 79, -20, 34, -257, -78, 146, -57, -141, 42, 25, 40, -52, -204, -92, 230, 16, + 85, 49, -33, 71, 96, 41, -47, -109, 0, 28, -83, 38, -108, -10, -69, -33, -91, -17, -52, -65, -51, 11, -22, 13, -25, 10, -46, 34, 18, -12, -8, 44, -1, -14, -41, -20, -18, -2, 4, 2, 452, 278, 263, 5, 26, 21, -108, -239, -90, 181, -136, 82, 245, 20, -77, -30, -49, -26, 99, 141, 5, 42, 58, 92, 6, -129, 40, -207, -62, -26, -57, -38, 26, -50, -108, -85, -39, 9, -46, -126, 150, -56, 12, -39, -97, 123, 342, 82, -118, 202, 47, -63, 62, -36, -131, 0, + -54, 50, -113, -198, 8, 32, -238, 71, 50, 133, 77, 176, -59, -120, -69, -38, 87, -32, -153, 104, -74, -141, 96, -141, -76, 43, -50, 47, -33, -59, 47, 118, -27, -59, -21, -1, 42, 82, 25, -25, -31, -32, -10, 19, -60, -22, -17, 90, 47, 64, -10, 4, 51, 33, 25, -4, 9, -233, -368, -113, -184, 263, -60, -32, 99, -243, -171, 146, -118, -110, -6, -10, 26, 96, -40, 44, -63, -47, -4, -42, -107, -10, -23, 111, 113, 99, -132, 61, 45, 185, -93, -7, -63, -141, 201, -191, + -94, -74, 48, 167, -155, 173, -19, 93, 144, 23, 111, -206, 45, -78, 11, -218, 4, -75, -195, -150, 12, 144, 8, -105, 164, -56, 95, -13, -202, 283, -177, -35, -100, 71, 115, 76, 107, 230, 176, -29, 37, 108, 69, -82, 117, 91, -17, 52, -114, -157, -16, -51, 89, -92, -19, -89, -20, -41, -13, 27, 33, 18, -4, -22, 54, 27, -55, 40, 3, -136, -12, -49, 78, -21, -9, 29, -15, 27, 62, -4, 40, 43, -8, 16, 87, 99, -260, -371, 42, 31, 21, 240, -77, -261, 28, 31, + -69, -15, -229, -45, 29, 34, 257, -45, 230, -55, -59, 20, -228, 98, -86, 139, -38, -58, -84, -41, 9, -170, 295, -204, -331, 100, 16, -232, -68, -447, 8, -159, -2, -172, -140, 25, 17, 78, -141, 114, -159, -308, 37, 86, -93, 102, -52, -171, -150, -208, -98, -22, 35, -62, 194, 1, -60, 18, 12, 41, 31, 23, -185, -173, 38, 124, 73, 21, -40, 154, 85, -70, -52, -170, -70, 77, 37, -92, 38, -25, -27, -43, -53, -18, -70, -53, 30, 15, 43, 74, 6, 65, 4, -42, 62, 39, + -12, 10, -34, -34, 0, 4, -39, 3, -11, -1, 0, -7, 40, -63, -10, -18, 4, 23, 41, -573, -145, 23, -147, -106, -184, 48, 64, 131, -99, -122, -139, 70, 154, -77, -67, -39, -24, 74, -321, -79, 180, 59, -95, 35, 159, -15, -42, 56, -11, 393, -170, 96, 31, -165, 54, 37, -189, 133, -268, -26, 236, 52, -8, -49, -184, -158, 42, 102, -69, 50, 196, 98, -82, 121, -175, -409, -55, -179, 113, -115, 290, 146, -14, -47, -377, 119, 144, -115, 230, -179, 70, -300, 139, 106, -342, -217, + -70, 85, 113, 250, -35, -12, 162, 38, 1, -72, 37, 38, 49, 54, 13, -6, -31, -35, -92, -76, 61, 44, 32, 77, -31, 38, 39, -19, 66, -8, 0, -15, -74, -15, 86, 20, 64, -23, 24, -33, 102, 11, 85, 38, -41, 23, 144, 242, 560, 597, 120, 179, 2, 85, 6, 63, -160, 74, -99, 132, 126, 308, 48, -62, 193, 139, 232, 11, 144, 84, -71, 72, 345, 55, -149, -80, 255, 158, 123, 237, -182, 71, 283, -282, -337, 111, 181, 294, -127, -219, 178, 64, -27, 111, -44, -27, + -2, 418, -151, 85, -101, -65, -49, 218, -29, 486, 233, -234, 272, 59, 127, 58, 59, 66, -89, 164, -385, -102, 176, -393, 134, -317, 75, 350, 87, -2, 96, 33, -94, 23, -100, 11, 81, -236, 135, -43, -56, 16, 73, -62, -94, 31, 85, -45, -79, -79, -46, 32, -56, -51, 53, 74, 35, -40, 48, -35, -122, -55, -2, -62, 35, 25, 51, 82, 121, -58, 171, -60, -100, -35, 61, 13, -102, -67, 923, 161, 145, -270, 398, -132, -18, -104, 22, -259, -20, 123, 29, -211, 263, -63, -137, 39, + 82, -271, -382, 159, -158, -225, 44, 0, -116, 200, -201, 67, 193, -33, 282, 90, -358, -373, -160, 25, 68, -294, 106, 109, 56, 96, 130, -306, -154, 90, -343, -123, -9, -354, -190, -120, 71, -180, -386, -181, -206, 447, 215, -35, 61, -118, 354, 427, 47, 287, 208, 84, 51, -164, -36, -144, 207, -271, 9, -64, -419, -126, -61, 228, -207, 115, 97, 44, 21, 100, -100, 80, -61, 88, -22, 130, 37, 12, -68, -24, -164, 89, -23, 140, -134, 1, -14, 84, -15, 75, 31, 41, 39, 22, -89, 104, + 131, -66, -95, -110, -46, -6, -40, 12, -630, 425, 682, -512, -305, 141, 122, -104, 224, 61, -191, -233, -5, -75, -167, 85, -77, 11, 189, -254, 53, 34, -151, 22, -239, 47, 352, 180, -35, -113, -29, -200, -213, 105, 178, -56, -98, -70, 107, 178, 85, 325, -175, 134, -84, 33, 203, -72, -64, -386, -59, -299, 151, 103, 385, -329, -121, -318, -525, -88, 219, -362, 81, -39, -264, -311, -393, 529, 20, 315, 231, 268, -120, -351, -266, -328, 116, 259, -246, 117, 276, -185, 32, 224, 257, 63, -91, 111, + -45, 60, -272, -24, 105, -91, 36, 18, 12, 62, 104, -107, -38, 64, 92, 27, 45, 91, -19, 98, -81, 68, 99, 111, 13, -40, 86, -68, 22, -14, -59, -28, -58, -14, 28, -71, -199, 72, 110, -492, 356, -45, -185, 305, 108, -297, -425, -164, 1, 9, 20, -152, 483, 200, 146, 112, 152, -147, 36, 96, 70, 434, 45, -647, 79, 269, -242, -363, -77, -197, -117, 30, 457, 274, -47, -10, -138, -400, -136, -331, 236, 323, 4, -180, -66, -74, 148, 206, 218, -505, 97, 18, 44, 351, -205, 144, + -187, -134, 36, 230, 412, -65, -268, 87, -481, 384, 207, -47, -199, 104, -112, -237, -198, -215, -103, -45, 14, 204, -156, 560, 23, -85, 32, 167, 7, -6, 181, 125, 93, 8, -88, -68, -21, -12, -81, -226, 120, 115, -86, 32, -126, -93, -44, -23, -3, 202, -41, -61, -33, -10, 123, 225, -73, 127, -34, -138, 161, -149, -122, -79, -123, 28, 95, 51, 98, 4, -36, -7, -100, 62, -57, -213, -52, 236, -423, -120, 274, -344, -35, -34, -46, -401, 399, 173, -278, -48, -119, -102, -610, -86, -278, -688, + 147, 107, -313, -259, -368, -420, 358, 202, 377, 13, 790, 37, 413, 568, -66, 174, 586, -394, 181, -238, 403, -126, 785, 357, -244, -369, 62, 182, 328, 88, -284, -65, 260, 583, -243, 391, -142, 239, -456, 180, -248, 181, 30, 60, -83, 360, 503, -914, 278, 191, 136, -167, 121, -656, 56, 12, -102, -251, -218, -217, -63, 468, -269, -158, -379, 14, 336, -168, -188, 260, -9, 189, 42, -46, 5, 83, -181, 92, 37, -156, -130, -76, 46, 106, 109, 317, -33, 240, 118, 78, -158, -49, -239, -108, -40, -80, + -113, 133, 77, 159, 203, 38, -46, -26, -130, 455, 484, -106, 503, -26, -105, 40, 283, -106, -128, -59, -358, 59, -103, 564, 371, -269, -285, -535, -196, 389, 700, -319, 216, 47, 92, 381, 273, -548, 109, -196, -111, -226, -123, -239, -528, 93, 354, 135, 828, -201, -114, 575, -210, -32, -128, 153, -632, -406, 220, 473, 689, 822, -604, -313, -32, 275, -27, 932, 259, 140, -723, 51, 5, 350, 456, -340, -113, 143, -148, 0, 519, 188, -513, 134, 271, -246, 808, -279, -432, -606, 448, -96, -508, -403, -92, -18, + -202, 12, -220, 43, -306, 22, 150, -105, 118, 24, -185, 21, -3, -35, 20, -125, 153, 2, -78, 175, 177, 9, -49, 79, -167, -68, -134, -24, 138, -107, 60, 137, -250, -88, -51, 43, -47, 109, 243, -67, -145, -69, 158, 46, 15, 127, -72, -50, -45, 112, 956, 453, -251, -80, -882, 69, 234, 62, 1317, -166, -100, -578, -500, 206, -409, -249, -274, -184, 327, -213, -376, -323, 29, 331, -425, 96, 192, 43, 475, -54, 37, -482, -679, -279, 311, -374, 91, -314, -1186, -638, 356, 27, -680, 106, 947, -43, + -25, -369, 207, -407, -731, 20, 111, -282, 140, 276, -68, -238, 197, 257, 475, -272, 357, 459, 193, 797, 90, -493, 581, 36, 98, -105, -117, 360, -355, -49, 884, 695, -428, 445, -127, 821, 346, -282, -654, -27, -239, -282, 185, -254, -7, -63, -228, -381, -74, 326, -348, 4, -216, 36, 138, -139, -408, -69, -192, 252, 152, -97, -269, -109, -290, 178, -141, 98, 115, 170, 134, -223, -159, -250, 76, 166, 23, 328, 346, 191, 142, -687, -729, -871, 1200, -665, 158, -37, -382, 610, -717, 310, 1278, 786, 182, -1036, + -58, -684, -347, -624, -60, 177, -113, 491, -236, 81, 242, 685, 95, 95, 829, -546, -78, 366, -160, -424, -282, 418, -365, 175, 710, -198, -1282, -78, 320, -1574, 949, 732, -598, 976, 661, 435, 1012, 22, 519, 60, 61, 364, -644, 641, 871, 670, -693, -136, 957, -465, 759, 696, 1627, 982, 55, 112, -212, 204, 282, -945, -1354, -471, 116, 50, -196, 1058, 497, 199, -467, 419, -332, -418, -215, 478, 555, 107, -103, -108, 14, -655, -157, -169, 209, 122, -343, -259, -19, 517, -147, -199, 11, -206, -527, 262, -116, -205, + -310, 2, 171, 34, -933, -53, 455, -70, 15, 76, 129, 390, 307, 13, -8, 733, 906, -1778, -1629, 711, -468, -513, -213, -620, 221, -1005, 1269, 478, -529, -11, -517, -389, -417, -477, -309, -1212, -1089, -203, -247, 70, 104, 211, -76, 155, 203, 539, 597, -225, -301, -353, -299, -685, 1021, -360, 249, 758, 717, -272, -307, -571, -375, -469, 786, 84, 98, -970, -344, 1404, -136, 1307, -263, -489, -308, -552, -566, -104, 7, -778, 66, 372, -31, 293, -1797, -727, -503, 955, -228, 157, 327, 1500, 426, -138, -152, 1292, 781, 191, + 253, -66, 1026, -427, -583, 316, 482, 855, 796, -465, 541, 405, 436, 130, -310, -614, -520, 326, 452, 242, 163, 533, -51, -147, -29, -44, 279, 167, 363, 633, 448, 724, 197, -649, 208, 175, 566, -9, 444, 190, 427, 11, -815, -104, -177, -53, -939, 1951, -629, -393, 1158, -734, -1107, 1027, -1490, -432, 353, 255, -1040, -409, 894, 5, -175, -582, 702, -696, 47, 551, -183, 506, 5, -251, 171, 120, -301, 481, -264, -108, 145, -10, 31, -91, 144, 305, 495, 711, 350, -295, -81, -452, 418, -151, -651, 152, 4, -372, + -890, 627, 49, -413, 1008, 57, -311, -183, 1492, -1396, -1500, 915, 1430, -2638, 14, -977, -885, -393, 962, -742, 1272, -181, -30, 1708, -481, -1324, 1644, 1934, -1877, 2099, -705, 51, 1738, -581, -663, 475, 468, -224, -86, 321, 66, 40, -411, 570, 5, -38, 13, 76, 259, 156, -206, -229, 242, 569, -491, -458, -121, 596, -18, 317, -84, 132, 5, 135, -65, -106, -700, -296, 179, -255, -67, -251, -377, 594, 376, -1037, 418, 537, -101, -5, -361, 531, 1162, -543, -735, -203, 185, 1180, 882, -309, -94, 369, 962, -321, -54, 590, + -756, -650, 518, -345, -257, -318, -28, -524, 42, 358, -220, 277, -246, -155, -155, -724, 109, -293, 444, 947, 53, 472, 392, 36, 180, 296, 1007, -712, 487, 427, -514, 344, 337, 107, -456, -915, -924, 304, 332, -349, -1543, 1255, -422, -676, -390, 1262, -593, 1380, 1, 464, -1299, 1228, -562, 544, -166, -1779, -560, 350, -1099, 1131, 122, -1632, -1835, -945, 1277, 315, -1138, 1389, -1492, -74, 2696, 403, 154, 267, 205, -707, 737, 54, 377, -475, 708, -391, -372, -313, -39, -20, 215, -71, -104, 139, -247, -511, 465, -172, -80, -607, + 277, 134, 263, 72, 303, -225, 71, 837, -98, 8, 444, -477, -101, 24, -48, 325, -338, 366, -128, -950, 62, -249, 278, -315, 366, -588, -1125, 5, -1195, 328, -107, -213, 399, 661, -424, 95, 725, -569, 984, -131, -1083, 929, -447, -199, 826, -1059, 279, 18, 384, -166, -389, -1616, 370, -667, -1624, 1962, -1322, -550, -263, -447, -998, 560, 1354, -839, 380, -1217, -689, -693, 612, 111, 1778, -306, -149, -530, -1535, 2, 745, -567, 625, 753, -636, 64, -542, -2264, -1188, -697, -2380, 1521, 2003, 942, -2019, -1623, -3622, 524, 4306, 1992, + 761, -1133, -3975, -903, 919, 2717, 2724, -1851, -1566, -728, 354, 187, 2956, 50, -361, 240, -293, -721, 1039, 186, -224, 575, -472, -805, 571, 494, -1373, 924, -206, -303, -732, 776, -740, 888, -438, 909, -1073, 428, -300, 13, 773, 1265, 358, -471, -336, -80, 698, -113, 1005, -788, -622, 289, 997, 117, 608, -1704, 1236, -243, -270, 30, 557, 10, -106, 411, 142, 137, 658, -417, -4, 341, -118, -63, 415, -385, -93, 116, 652, -431, -305, 364, -17, 204, -644, 845, -201, 285, -184, 108, 461, 202, -108, 396, -151, 400, -316, -24, + 414, -96, -172, -836, 85, 645, 68, 302, -423, -135, -253, -267, -109, 466, -171, 284, -368, -440, -189, 104, 853, -328, 387, 25, 84, -418, 227, 443, 23, -404, 311, -270, 208, -165, -120, -158, 57, 311, -158, -80, 143, -19, -237, -51, 231, 196, -206, 34, 211, 8, -130, 33, -207, 154, -14, 78, -95, 39, 134, -68, 157, 29, 143, 109, -234, -238, -81, 413, -265, 287, 229, -169, -428, 323, -275, 365, -35, -62, -151, 60, 60, -23, -49, 30, 1621, 323, -870, -617, -961, -304, 184, 511, -160, -206, -178, -171, + -162, 234, -119, -32, -52, -168, -41, 257, 36, -73, -257, 295, -382, 225, -137, -373, 1, 171, 191, 151, -222, 50, -72, -120, 450, -400, -74, -15, -29, 43, -68, -235, 198, -373, 356, -51, -251, 88, -130, 318, -186, -111, 341, -305, 106, -145, -35, 264, -188, -73, 234, -160, 61, 26, -192, 466, -407, -33, 178, -102, 296, -133, -66, 79, 97, -30, 65, -25, -132, 120, -1, 13, 64, -7, 92, -92, 27, 20, 20, -10, -58, 78, -11, -18, -55, 69, 109, -35, -57, 36, 63, -79, 66, -59, -53, 177, + -27, 66, 92, -119, 297, -96, -16, -13, -172, 179, -111, -176, 158, -768, -1153, 1512, 4717, 404, 411, -3217, -4069, -848, -862, 2398, 4082, 2095, 403, -1477, -2874, -2029, -1450, -75, 1989, 2906, 1570, 360, -1018, -1810, -1013, -975, -913, 577, 1183, 1166, 1175, 283, -509, -209, -774, -1212, -134, -361, -244, 1095, 633, 915, 555, -414, -998, -240, -648, -100, 454, 139, 245, 495, -250, -350, -80, -206, 200, 320, 18, 394, 234, -413, -397, -634, -542, 25, 655, 993, 478, 126, -230, -664, -113, -749, -459, 353, 277, 840, 283, -213, 248, -434, + -754, 134, 192, 254, 234, -46, -93, -71, -313, -239, 165, 257, 258, 262, -71, -252, -167, -96, 8, -4, -285, 74, 361, 195, 225, -66, -361, -209, -213, 85, 255, 168, 158, 69, -50, -273, -360, -164, 24, 225, 358, 220, 221, 141, -226, -420, -540, -350, 153, 305, 395, 546, 167, -160, -270, -217, -159, -147, -151, -43, 116, 227, 195, 149, 100, 24, -125, -204, -198, -108, -23, 66, 111, 125, 91, 70, 19 }, + {39, 104, 82, -28, 63, 29, 181, -32, -4, 22, 133, -27, -137, -65, -132, 32, -47, -12, -16, 31, 13, 26, 77, 140, -62, -35, 29, -67, -9, 109, -59, 135, 14, -49, 91, -124, -31, -86, 121, -4, -44, -33, 2, 111, 5, 134, 52, -111, 90, -49, -82, -68, 93, -20, 294, 30, 74, 53, -136, 1, -20, 35, -77, -53, 154, 125, 12, 51, -13, 77, -126, 12, 95, 59, 10, -10, 68, -108, -49, 114, -75, 24, 56, 67, 21, -86, -57, 45, 10, 44, -13, 12, -42, -3, -21, -13, + 25, 46, 20, -28, -10, -19, 11, 28, -17, 21, 16, 30, -4, 35, -14, 9, 22, 28, -224, -202, -126, -115, -99, 38, 142, 288, 55, 74, 0, -206, -86, -77, -185, 288, 77, 114, 79, -64, 30, 275, 110, -65, -5, -67, 6, -127, 77, -40, -57, 11, 147, 16, 51, 92, 127, -227, 3, 58, 133, 204, -113, -23, -54, 170, 92, 110, -18, 51, 340, -214, 44, 20, -143, 61, -199, -27, 52, -43, -301, 85, 22, -81, -83, -13, -45, 102, -95, -42, 31, -3, -92, -4, 77, -126, 12, -34, + -29, -39, -21, 20, -73, -55, 12, -43, -57, -59, -19, -39, 74, -64, -17, 11, 38, -4, 4, -22, 6, -38, 31, -55, 303, 28, 108, -12, -83, 8, 212, 110, 136, 222, -99, 3, 213, 70, 93, 13, 25, 127, -115, -32, 158, -107, 61, 92, -69, 68, 212, -100, 77, 18, 7, 4, -46, -145, -47, -121, -15, 52, 101, 109, -21, -182, -19, 268, -101, 55, -50, -280, 162, 42, 120, -19, 137, 136, -241, 97, 5, 91, -20, -166, -10, -22, -33, -30, 104, 1, 18, 218, 40, 174, 3, 18, + 30, -93, -152, 104, -116, 69, 39, -4, 68, -74, -46, 49, 0, -143, 44, 19, 16, -28, 60, 7, -28, 71, -19, -4, -61, 22, -32, 12, -3, -7, 11, -21, 35, 10, -18, 12, -12, 6, -5, -22, 497, 280, 425, 138, -177, 91, -80, 12, 41, -363, -97, -100, 93, 143, -59, -8, 47, 12, 259, -28, -273, 89, -158, 121, 138, 110, 160, -39, -56, 65, -49, -63, 46, -42, 96, 138, -60, -210, 67, -204, -132, -26, -425, 4, -72, 167, 158, 77, 260, 262, 115, 58, -20, 13, 14, -119, + 242, -33, 84, -77, -93, -34, -139, 122, -65, -52, 237, -199, -62, 50, -92, -28, -8, 83, 98, 66, 169, -56, -47, -25, -108, 56, 108, 149, -3, -23, -32, 1, 32, 31, -45, 49, -1, 35, 30, -6, -12, 64, -19, 32, 26, 29, 26, -19, 24, 108, -8, 5, 12, 80, 14, -18, -57, -189, -436, -156, -45, 62, -54, 132, -29, 213, -192, 112, -47, 392, 165, -87, -168, 90, -239, -129, 93, -86, -142, 271, 114, -17, -125, -171, 116, 87, 87, -9, -41, -107, 161, -211, -88, -12, 150, 112, + -9, 162, 22, -79, 35, -78, -78, -94, 117, -87, -1, 150, 229, 231, 97, 80, -13, 130, -51, 187, -31, 119, 95, -80, 12, -88, 94, 78, 34, -32, -158, 110, -172, -23, -186, 67, -12, -20, 38, -162, 10, 40, 262, 82, 46, 59, 104, 43, 55, -79, 61, 42, -103, -11, 9, 21, 48, -54, 37, -36, 10, -8, 69, 5, 11, 6, 25, -16, 63, -34, 26, 21, 60, 25, 83, -59, 33, -15, 95, 33, 36, -14, -9, 5, -14, -62, -203, -428, -345, 21, -294, -146, -417, -223, -254, 101, + -136, -181, -62, 9, -107, -406, 109, -72, 41, -184, 183, 67, 4, -164, -73, 207, 142, 9, -31, -140, 87, 44, 90, -167, -15, -136, -122, -133, 14, 268, -220, 4, -209, 21, 97, 121, -221, 221, 269, -90, -64, -48, -11, 85, 108, 26, 74, -132, -26, -50, 231, -74, 256, -8, -79, 203, -22, -123, 43, 220, 255, -20, -80, -140, 87, -187, -19, 123, -96, 55, -7, -3, -77, 0, -60, -94, -10, 77, 41, 77, -36, -27, -64, 23, -52, 80, 40, 112, 10, -28, -11, -22, -42, 51, -37, -22, + 20, 16, -58, -21, 13, 0, -33, -56, -5, -52, -36, -23, 64, -7, 21, 18, 1, -41, -14, -331, -328, -380, 112, -308, -127, 295, 145, -335, -21, 3, 148, 218, 374, -102, -133, -367, -449, -267, -90, 183, -181, 88, -258, 269, -193, 216, -99, 30, 58, -44, -191, 303, -261, -14, -139, 36, -162, 37, -656, 10, 307, -392, 91, 267, 98, -205, -21, 321, -395, -2, 164, 155, 154, -58, -56, -258, -125, 104, 177, 277, 342, -501, 192, -152, 39, -354, -141, 289, 73, 39, -192, -1, 190, 135, 86, -176, + -111, 181, -46, -78, -37, -130, 112, -23, -99, -40, -33, 25, -63, -71, 26, 23, 30, -41, -56, 48, -35, -134, -9, -41, 83, -63, 7, 5, 35, -85, -44, -32, 11, 86, -8, -23, 57, -1, 56, -27, -57, -24, -98, 21, 2, -72, 40, 392, 656, 363, 428, 64, 152, 574, -17, 16, 394, -193, 2, 112, 197, 324, -263, -378, 208, 114, -218, 46, 135, -85, 78, -204, -45, -238, 74, 257, 81, 225, 176, 183, -447, 23, 522, -63, -8, 485, -63, -18, 73, -65, -13, 268, 424, -416, -67, 82, + -127, 195, -65, 19, 32, -91, 373, -48, -134, 139, -139, -232, 81, 253, 97, -29, 52, 242, 128, 217, 66, 27, -2, -213, -43, -167, -37, -70, -379, -165, 25, 245, -100, 94, -64, -201, 90, 22, -63, 31, -121, 6, 31, 75, 108, -26, 70, -92, -136, -163, -16, 148, -26, -12, 50, 8, 17, 80, -38, -15, -43, 114, 3, -17, 14, -29, -60, -73, 31, 65, 82, 45, 33, -14, -5, 1, -26, -113, 1105, 153, -24, -7, -530, -155, 51, -124, 234, 103, 380, -48, 1, -82, -161, 255, 48, 98, + 143, 200, -188, -189, -218, -152, -125, -55, -300, -59, 484, 228, -92, -33, -57, 41, 171, -84, 692, -120, -19, -314, 125, 302, -52, -231, -30, 116, 232, 100, 326, 487, 159, -10, 289, 236, 88, 183, -606, 141, 16, -536, 197, -12, -231, 151, -245, -238, 284, 224, -126, -475, -215, 114, -273, -55, 120, 467, -76, 95, -243, -512, -275, -245, -111, 245, 34, -170, -51, -105, -103, 157, 130, 51, 111, 133, -111, -81, -82, 19, -90, -134, -130, 58, -44, -18, 19, 49, -111, 64, -24, -12, -49, -17, -69, 176, + -108, -37, 31, -111, -108, -81, 7, 90, -586, 369, -68, -379, -15, 343, -393, -83, -317, 209, 68, -117, -135, -49, 211, 160, 91, 218, 193, 19, 233, 266, 110, 146, -272, -134, -189, 167, 219, 77, 68, -131, -95, -81, -70, -233, 211, 47, 14, -249, -74, 391, -283, -304, -463, 160, -347, 502, 583, 399, 235, 20, 456, -243, 358, -49, -255, 16, 21, -551, -244, 203, 31, -96, 83, 456, 314, -531, -134, -11, -14, 149, 225, -14, -424, 167, -246, -790, -229, -164, 244, 393, 133, 16, 20, 8, 35, 279, + 1, 38, 36, 139, -250, -17, 76, 182, 224, 75, 133, 195, 262, 334, 129, 163, 165, 4, -16, -66, -43, -3, 68, -202, -50, 111, 185, -25, 51, -30, 77, -3, 118, -24, 113, -90, 145, -2, 137, -491, 49, 54, 308, 66, 785, 125, -324, -105, -273, 496, -637, -57, 441, -963, -380, -325, -336, -638, 60, -112, -274, -35, 302, 38, 40, -188, 75, -64, 74, 0, 48, 246, -60, -16, 500, -324, -65, 86, 431, -227, 616, -187, -249, -528, -686, -201, -511, 249, -155, -384, 52, 62, 282, 238, 100, -49, + 871, 482, -55, 85, 298, 223, 145, -118, -17, -157, -203, -188, 131, 679, -475, -117, -271, 490, -129, 152, -70, 230, -538, -403, -139, 228, 73, 197, -119, 121, 184, 161, 77, -32, -229, 144, 54, -195, -137, 121, -128, -98, -4, 131, -122, 158, -99, 226, -126, 25, 79, 41, -109, -207, 160, -62, -47, -17, -22, -66, 151, 189, 131, 115, -23, 66, 217, -118, 85, 37, -6, 47, -15, 11, -80, -391, -376, 212, -169, -705, 349, -210, 279, -203, 351, 239, 292, 468, 75, 396, 159, 103, 268, 93, 73, 20, + -12, -251, 223, -509, 223, 54, -147, -274, -8, 198, -228, -94, -341, -131, -420, 28, 230, -3, -55, -265, -464, -335, 361, 122, -152, -265, -66, -20, -454, 385, 348, -444, -434, -708, -109, -848, 228, 333, 174, -51, -109, -86, 348, 354, 406, -263, -211, 274, -118, -125, -499, 224, 407, 469, -110, 258, -144, 79, 255, 134, -180, 87, -308, -184, -128, 49, 129, 114, -122, -109, -46, -135, -28, -187, -237, -121, -99, -69, -32, -65, -95, 24, -5, 141, -48, 179, -47, 144, 9, -75, 35, 358, 109, 185, -82, -138, + 29, 133, -124, 261, 258, 79, 121, 59, -296, 677, 785, -311, -16, 210, -633, -119, 790, 26, -858, 93, 265, -22, 300, 705, -289, 637, 347, 544, 154, -418, -443, 355, -402, -634, -183, -752, 166, -51, 268, 229, 165, 84, -29, 21, 383, 186, -736, -87, 248, 474, 265, 587, 531, 415, -195, -71, 111, 1069, -447, 78, 228, 419, -172, -595, -124, -150, -357, -657, -716, 197, -401, -304, 187, 565, 697, 13, -38, -8, 536, -363, -184, 634, -689, 77, -545, -366, 42, 735, -118, -502, 657, -670, 29, -809, -70, -102, + 240, 450, -331, -189, -234, 61, 18, -251, 144, -74, -69, -107, -85, -297, 69, -143, 107, 80, -20, -65, 182, 0, 5, -350, 55, -30, -10, 327, 35, 93, -134, 53, -76, -190, 86, -387, 132, -133, 293, -231, -29, 54, -29, -60, -118, 216, -139, 234, -79, 139, 368, -433, -969, -229, -338, -319, -201, 45, -332, -281, 93, 216, -209, 514, -56, 344, -174, -21, 296, -423, -265, -144, 442, -107, -485, -183, 73, -235, 201, -325, -327, 475, 138, -377, 228, -46, -297, -29, -493, -424, 84, 739, 298, 230, -592, 456, + -53, 349, -207, -412, 200, -760, 634, -1029, -652, 238, 566, 44, 677, -297, 177, -470, 635, 204, 473, 218, 111, -149, -159, -311, -109, -19, -549, -328, 48, -832, 46, 934, 278, 336, 90, -423, -319, -86, -102, -30, -165, -222, 185, 122, 168, 264, -266, 173, -101, -144, -109, 235, -79, -256, -388, -3, -234, -110, -240, -66, -157, -94, 366, -199, 84, 114, -293, 334, 3, 200, 263, -122, 130, 59, -12, 82, 221, -127, -124, 203, 18, 161, -729, -679, 67, 280, -344, -1537, -322, -8, 201, -520, 45, -290, -61, -414, + -463, 412, -450, -552, -93, -386, -425, 147, -617, -204, 372, 853, 689, -33, -420, 148, 620, -28, 412, -118, 519, 292, -534, 850, -648, -342, 572, -630, 190, -145, -475, 56, 719, -149, -423, 270, 353, -10, 146, -1033, 249, 44, 521, 253, -453, 450, -242, -39, -420, 224, 605, -124, -120, -620, -878, 500, -64, 403, -481, 366, 292, -625, 36, 557, 318, -291, -503, 456, 74, -390, 370, 62, 165, 45, 153, 30, 414, 7, 142, -27, 17, 368, -119, 10, 83, -95, 67, 34, 254, -12, -283, -34, 36, -167, -50, 19, + -113, 382, -90, -218, 24, 243, 114, -12, 138, 20, -158, -19, 400, 274, -271, 579, 581, -1567, 591, 794, -202, 553, -6, 287, -127, -322, -208, 334, 79, -453, -294, -42, -212, -116, -49, 970, 195, 215, -600, 417, -427, 6, 75, -655, 306, -243, 34, -265, -474, 13, 315, 898, 323, 93, 556, 235, -67, 91, 14, 157, 91, 610, 267, 184, 101, -78, -190, -601, -504, 70, -72, -370, 53, 450, -686, 663, 171, -244, -28, -178, -55, 401, 176, 131, -467, -95, -638, -197, 178, 233, 232, -277, -222, 494, -59, -802, + 115, -15, -9, -473, 155, 353, -49, 508, 343, -172, -9, -221, 275, -24, 91, 41, -116, -97, -21, -101, 112, -220, -22, 12, 119, -114, -132, -158, 9, -39, 87, 50, -4, -99, 106, 79, 16, 115, 21, 82, 77, 109, -31, -403, -15, -116, -1393, 2159, -2134, -965, -488, -146, 1249, 367, 1398, 349, -286, 1102, 477, -373, 517, 468, 261, 438, 424, -379, -611, -435, 70, -400, 211, 125, 273, -43, 189, 64, 686, 162, 64, 211, -160, -10, 242, -431, -613, -417, -357, 61, 181, -433, -71, -261, -1063, 535, -192, 270, + -559, -190, -518, -710, 268, 187, 690, -30, 607, -258, 509, 59, 726, -515, 449, 539, 298, 313, 26, -222, 851, 569, -57, 1027, 245, 119, 439, 662, 7, 304, 382, 174, 166, -78, 33, -601, -154, -82, 95, 125, 118, 398, 175, 202, -157, -23, 156, 16, 12, -144, 163, 138, 78, -112, 207, -33, 36, -163, -152, -61, 15, 18, -100, -331, 75, 71, -91, -18, -86, 24, -123, 80, -118, 4, 294, -85, -296, 190, 136, 115, -73, -40, 1318, 114, -794, -1166, -619, -487, 157, 966, -16, -408, 864, 72, -699, 629, + 682, -125, -13, -66, -619, 688, 39, 390, -218, -550, -961, 175, 121, 149, -136, 302, -320, -3, -616, -767, 270, -97, 244, -110, -285, -695, -1079, 554, -603, 248, 519, -36, -278, -530, -382, 1243, 282, -56, 161, -164, -503, -165, 720, -696, -1172, -409, -372, -1641, -1283, -690, -713, 177, -8, -571, -1096, -433, -518, -371, -300, -220, -656, -628, 497, -558, 35, 85, -687, -120, -501, -628, -152, -102, 291, 122, 392, -401, 103, 230, -1, -539, -305, -362, -35, 176, -183, -263, 469, 279, 338, -552, 95, -269, -30, 24, 56, -66, + 559, 44, -97, 71, 197, 281, 233, -37, 331, -238, -125, -102, -430, -12, -130, -556, -463, 80, 25, -9, -140, -123, 905, -107, 862, 1277, -235, -1386, -1342, -290, 643, 87, -1054, 826, -180, -692, 849, -1597, -335, 6, -283, -247, 1935, -814, 1813, -93, 381, -138, -715, 1156, 308, 1202, -826, -819, 264, -1319, -393, -216, -913, 1897, -165, -1979, -29, -885, 258, 481, 792, 637, -779, -494, -1213, -361, -561, 514, 344, -72, 358, -249, -859, -359, -1003, 1023, -775, -543, 924, 212, 1563, 750, 138, 818, -1104, -419, -1140, -1116, -170, -168, + -1392, 1430, -251, -1122, -1658, 102, -327, 1209, -76, 56, 165, -224, 232, 267, 572, -388, -383, -252, 19, -76, -78, -368, 404, 242, 482, -119, -258, -229, -83, 84, 646, 678, -110, 31, 374, -110, -856, -423, 55, 111, -66, -552, 193, -71, -129, -631, 246, 205, 745, 116, 184, -43, 308, 48, -178, -2585, 1336, 305, -556, -423, 827, 451, -497, -139, -1215, -512, 520, -1055, 43, 186, -319, -705, -477, 942, 382, -193, -1356, 457, 857, 490, -1049, -703, 7, 1140, 105, -280, 183, 34, 587, -1527, -1316, 1629, 256, 680, -1550, 335, + -67, 1136, -1018, -199, -1554, 542, 1126, 260, -689, 443, 1633, -733, -773, -613, 236, 65, 1432, -429, 114, -773, 257, -847, -23, 539, -1050, 1006, 311, -735, -1137, -696, -53, 1016, -1837, -404, 1673, 217, -747, -356, -524, 1568, -168, -1648, -185, -3, -399, 668, -108, -233, 516, -48, -330, -433, -38, -382, 123, 278, 378, -333, -235, 341, -216, 323, -163, -332, 462, -250, 417, 560, 46, -815, -46, -486, 212, 299, 206, -569, 16, -429, 411, -121, -235, -164, 98, 137, 1709, 872, 398, 393, 415, -273, -264, -578, 78, 184, 156, -36, + -977, 468, 198, -685, -574, -298, -334, 252, -248, -292, 90, -27, -516, 666, -474, -158, -492, -455, 331, -195, -59, 165, 219, -57, -657, 155, 1042, 218, -1617, -105, -346, -508, 349, 364, 848, 402, -1053, 1147, -277, -799, 2400, -485, -197, -792, -1893, 868, 973, 316, 372, -1627, 480, -129, -386, -288, 73, -157, 262, 308, 75, -243, -458, 492, 628, 862, -419, -89, 191, -128, 460, -1117, 116, 197, -515, 86, -428, 170, 16, 136, -64, 30, 51, -23, -7, -149, -108, 298, -157, -11, 228, 49, 18, 365, -293, 224, 270, -15, + -45, -308, 258, -577, -154, 378, 117, -156, -382, 119, -83, 469, 75, -964, -2325, -3919, 314, 3997, 379, 8494, 8575, 3119, 8608, 4998, -1453, -130, -781, -6521, -5413, -3792, -6777, -6465, -1847, -4065, -3548, 812, 1133, -868, 1260, 1858, -1, 141, 3681, 2465, 938, 2730, 5089, 2405, 2805, 6307, 2492, 1144, 5450, 5266, 234, 3375, 5950, 26, 1514, 3539, -136, -2868, 1429, -588, -5541, -5155, -4745, -9213, -13635, -9479, -13262, -17659, -12466, -10092, -13658, -8711, -4195, -4033, -765, 4088, 8221, 9319, 12458, 16966, 16662, 15776, 17759, 17745, 14483, 11672, 12485, 8312, 2957, 3971, 977, -7258, + -4672, -4925, -10144, -8553, -6156, -7196, -8342, -5176, -4532, -6294, -5200, -2683, -4323, -5684, -3418, -2394, -4515, -2528, 616, -1388, -1603, 1851, -44, -2268, -273, -1415, -5176, -3580, -2709, -4782, -2128, 1241, 2337, 4307, 7128, 8294, 8690, 9754, 10371, 10228, 9425, 8791, 7465, 5957, 3665, 2771, 364, -2267, -4018, -6434, -9278, -8991, -7644, -6890, -5967, -4049, -3415, -3015, -2182, -1416, -1273, -508, -315, -150, 98, 624, 900, 1175, 1281, 1451, 1363, 1348, 1069, 1080, 732, 523, 72 } + }, + { + {313, -13, -17, 100, -41, 114, -60, -146, 51, 147, 22, -23, 195, 7, 8, -67, -37, 304, 42, -206, -153, 214, -19, 222, 16, -42, -21, 168, 33, 352, 155, 97, -19, 78, 159, -39, -119, -149, -29, 135, 116, 180, 51, -100, -104, -43, 75, -24, 41, -20, -160, -123, 49, 117, 72, -58, -66, -4, 174, 89, -19, -39, 81, 55, 35, -89, 45, 84, -11, 128, 151, -263, 97, 54, 172, 52, 14, 78, -35, -123, -46, -74, -25, -15, 75, -4, -60, 1, 9, 45, -39, 7, -8, 16, 23, 16, + 29, 3, 18, 88, 137, 296, -241, 54, -53, 3, -309, 31, 186, -275, -57, 184, 488, 70, -3, 35, -306, -10, 225, 200, 6, -6, 19, 105, 176, 185, 200, -89, 43, -12, 77, 22, 50, -310, -85, 48, 25, -171, -5, 117, -136, 108, 100, 184, 86, -70, 92, 205, -115, -185, 62, 43, 36, 97, -82, -150, -223, 180, -33, -42, -72, 79, -3, 117, 231, 47, 16, -12, -56, -180, 281, 69, -33, 145, -23, -166, -146, -32, 55, -243, 20, -144, -27, 74, -4, 39, -43, -79, -17, 40, 55, 41, + -8, -24, -1, 40, -21, -40, -30, -145, -126, -157, -224, 125, -3, -107, -43, -55, 49, -89, -154, 35, -100, 263, 349, 276, -191, -7, -13, 74, -106, 217, 136, -31, 105, 164, 13, 40, 57, 159, -15, 59, 191, 19, -2, -83, 137, -207, 84, -29, -43, 138, -134, -17, 5, -180, 75, -36, 84, -6, -78, 55, 57, -9, 160, -11, 185, -3, -123, -55, 7, -84, 165, 86, 142, 161, -70, -159, -104, 0, -29, -34, 131, 165, -25, -90, 58, 45, -63, -86, 30, -124, 30, -2, -4, -33, -117, 27, + -46, 5, 53, 0, -60, 30, -82, -1, 5, -19, 7, 16, -45, 1, 6, -53, 11, -16, -3, -28, -1, 15, -461, -109, -144, -250, 85, 65, -30, 116, -16, 98, 139, -61, -161, -204, -78, -190, 15, 21, -82, 107, -93, 58, -42, -108, -287, -112, 26, 45, 76, -107, 76, 115, 38, 262, 65, -7, 203, -144, 117, 19, -68, -97, 131, 18, 41, -310, -57, -102, 311, 133, 112, 126, 143, 113, 158, -84, -34, 97, 155, -21, 181, -98, 40, -39, 154, 230, -360, 94, -89, 11, -170, -87, 28, -52, + -73, -144, -65, 68, -4, 154, -16, 59, 133, 212, -8, 56, -25, 99, 16, 48, -66, -23, 7, 45, -30, -48, 2, 2, -38, 5, 21, 1, 62, -28, -29, 7, 54, -22, 1, -20, 32, 49, -7, 47, 52, -13, -23, 180, 111, 65, -34, 15, 20, 233, -185, 234, -31, 127, 239, -150, 186, -116, 95, 36, 282, 124, -157, -258, 59, -193, 159, -40, 207, -154, -25, -124, 72, 46, 59, -15, -22, -225, -98, 185, -147, -30, 121, 6, -115, 38, 11, -26, -100, 203, 65, -288, -130, -232, -40, -205, + -354, -80, 155, 437, 96, 36, 206, -5, -161, -140, 115, 45, 78, 126, -309, -76, -284, -62, 80, -112, -262, 27, 114, -56, -97, -46, 46, -38, -10, 58, -35, -38, -52, -38, -120, 44, -31, 56, -20, 33, 77, 12, -20, -6, -63, -41, -101, -91, 15, 12, 1, 38, 61, 43, 1, 40, 33, -26, 24, 26, -52, 502, 119, 364, -170, -24, -121, -28, 386, -330, 111, 37, 506, 270, 336, 61, -84, 159, -111, -420, 80, 24, 49, 331, 31, -194, -17, 9, 105, 114, -10, -43, 135, -158, -44, -80, + -41, 41, 6, 291, 42, 229, 264, 73, 233, -17, 77, 141, -153, -228, 28, 230, -367, 109, -282, -263, -161, -73, -248, -240, -254, -130, -63, 170, 4, 204, 31, -168, 257, -268, -102, -111, -110, -142, -187, 267, 208, -117, 102, 84, 211, 1, 152, -75, 192, 97, -113, 7, -102, 122, -117, 13, 94, 7, 72, -21, 11, 50, -17, -51, 47, -14, 8, -99, -82, -79, -62, -10, -35, -68, -3, 15, -32, 8, -269, -274, -159, -169, -88, -70, -324, -263, -219, -35, -18, -42, 227, 21, 118, 172, 204, 31, + 398, 495, -9, 142, 113, -62, 218, 116, -444, -16, -153, 24, 346, 136, -355, -96, 160, 156, 23, 455, -188, 183, 188, 202, 120, 235, -400, 146, -155, 237, 10, 101, -300, 220, 162, -40, 157, -28, 45, -4, -156, 39, -99, 97, -123, 153, 50, 385, 290, -93, 105, -320, 279, -89, 172, 298, 296, 12, 302, 206, 144, 151, 278, 25, 61, -228, -38, -67, 53, -165, 26, -121, 38, -120, 38, -46, -72, -72, 50, 3, -36, -30, -94, -33, 19, -30, -68, 8, 73, -167, -100, -93, 68, -103, 64, -2, + 37, -86, -121, -30, 24, 261, -232, -62, 209, -112, 357, -115, -252, 474, 646, 142, -254, 177, -134, 264, 155, -59, -270, -178, -459, 119, 196, -406, -48, 234, 62, -21, 10, -51, -219, 52, 272, 10, 59, 97, 385, -255, -7, 279, -256, 375, 20, 527, -440, -398, 219, 18, -52, 112, -36, 146, 91, 292, 281, -233, 43, -153, -91, 174, -21, -92, -38, 7, 263, -503, 383, -121, -170, 283, -229, 226, -308, -175, -56, -231, -78, -163, -256, -174, 57, -60, -61, -5, -119, -40, -17, 157, -7, 21, 65, -69, + -25, -58, 40, 76, 22, -34, 188, -1, 140, -152, -96, -91, -63, 70, 36, 3, 110, -83, 84, 31, 78, 42, 12, -97, -320, -243, -107, -228, -348, -73, 126, 428, 69, -258, -479, -99, 148, -83, 513, 162, -182, -363, -454, -860, -71, -94, 329, 244, -176, 23, -137, -74, 309, -8, 16, -37, 350, 60, -106, -17, -13, 95, -319, -100, -126, 505, 117, -531, 137, -275, -155, 79, -495, 154, 356, 317, 246, 61, 99, -15, 52, -311, 113, -487, -94, 280, 102, 287, 282, 234, -160, -359, -315, -243, 79, 98, + 166, 166, 36, 111, 352, 494, -119, 177, -123, -132, 151, -216, -77, 10, -138, 129, -120, -103, -58, 32, -32, 71, 1, 102, -25, -60, -29, -59, -157, 43, 83, -6, 54, -14, 75, 145, 137, 109, -111, -55, 105, -31, -43, 11, -19, 108, -25, -5, -17, 252, 445, 516, 372, 637, -299, 453, -388, -304, 335, 429, 506, -523, -4, 132, -388, 184, -171, -274, 312, -407, 441, -418, 413, -300, -111, -27, -548, -76, 602, -154, -432, 92, 279, -314, 155, 652, 350, 132, 288, -345, 230, -207, -596, -180, -157, 44, + 269, 333, -149, -261, 236, 2, 180, 113, -98, 32, -238, 36, 74, -3, 76, 536, -68, 53, 152, 32, 64, -273, -300, 207, -358, -484, -509, 394, 254, 76, -29, -59, 186, -30, -144, 180, 495, 335, -133, -85, 152, 88, -37, -79, 54, 69, -23, 19, 267, 64, 36, 105, -90, 19, 83, 179, -20, 12, -178, 56, -94, -68, 181, 146, 7, 114, -102, -50, 52, -1, -56, -103, -112, 68, 28, -49, -413, -655, 233, 852, 416, -159, -659, -228, 42, 92, -128, 324, 218, -239, -124, -32, -436, 606, -276, 216, + -51, -142, -531, 174, 110, -66, 64, 238, -87, 592, -133, -90, 493, -54, -354, -316, -612, 85, -136, -189, -134, -448, -188, -420, 45, -370, 335, -208, -7, 105, 42, 195, -178, -454, 198, -51, 113, -100, -46, 15, 438, 656, 178, -204, 227, 239, 261, -106, -219, 336, 159, 448, 105, 121, 13, 136, 403, 551, 271, 94, 207, 89, -114, -374, -237, 44, 183, 30, -8, -139, -51, 79, 54, -295, -55, 69, -11, -146, -122, -164, 33, -27, 115, 213, 126, 9, -68, 131, 157, 13, 54, -205, -5, -68, -210, 47, + 41, -188, -17, -42, 74, -72, 181, 3, 248, 1266, 37, -345, 1063, 531, 474, 915, 922, 258, 298, 226, 1002, 46, -345, 425, 99, -394, -431, 378, 378, 710, -63, 47, 17, 93, -418, 473, 339, 141, -323, 500, -146, -32, -664, -152, -44, -48, -347, 226, -322, -194, -186, 90, -221, -315, -422, 448, -319, 476, 221, 390, 130, -409, -13, -653, -293, -359, 142, -456, -238, -88, 10, 460, 55, -79, -741, 290, 258, -24, -2, -384, 295, 25, -320, 878, 204, -122, -6, -363, 64, 436, -113, -44, -487, -298, 183, -76, + -229, 279, 180, -300, 265, -109, 87, -105, 259, 47, -36, 0, 66, -360, 8, -138, 109, 113, 177, -153, 130, 87, 80, 121, 157, -19, 122, -178, 302, -143, 256, -183, 116, -387, -709, 218, 214, -220, 462, -511, 555, -401, -233, 179, 129, 1433, 560, 215, -895, -24, -212, -474, -138, -173, -157, -53, -743, -14, -281, 9, 362, -394, 469, -154, -520, -463, 372, 285, -116, -256, 474, -256, -242, 373, -11, 115, -385, -13, -226, 479, -72, 687, -257, 103, 207, -20, 26, 209, -442, -71, 564, 46, 155, -5, -457, 195, + -319, 163, 493, 639, 698, 734, -158, 258, -6, 394, 891, -979, 761, -453, 204, 611, -386, 39, 192, 166, -46, 425, -165, -135, 180, -102, 410, -61, 155, -330, -54, -10, -266, -112, -335, 3, 97, 32, 373, -124, 25, 40, 159, 39, 160, -222, 167, 51, -9, 118, 163, -186, 170, -358, -315, 219, -105, -254, -36, 103, -162, 287, -341, -758, -145, 150, 13, 174, -559, -79, -113, -802, -617, 315, 334, 151, 230, -412, -199, -293, 875, 207, 26, 652, 378, 326, 297, 255, -460, 329, 136, -144, 261, -235, -228, 454, + -197, 285, 603, 19, 116, -13, 40, -133, -353, -449, -725, 295, -614, 229, 240, 307, 2, 16, -86, -475, -224, 238, -164, 245, 602, -187, 461, 209, 51, -29, -164, -440, -19, -594, -206, 632, -339, 98, -1047, 494, -194, 158, -808, -721, 67, 190, 369, -836, -89, 8, 568, 462, 525, -170, 11, 77, 274, 62, 151, 431, 246, -169, 157, 39, 30, -13, -93, -362, 125, -177, 53, 139, -5, 28, -6, 139, -89, 582, 158, -27, 326, 194, 26, 94, -11, -265, 342, -117, 45, 406, 227, -133, 1, -169, 270, 183, + 226, 207, 620, -1474, -367, -874, 293, -785, -268, -890, 236, -463, -361, -73, -762, -273, -817, -407, -945, 207, -874, -341, -456, -250, -242, -200, -834, -472, -635, -321, -186, 362, -55, 271, -520, -81, 27, -593, 112, -38, 48, 160, -607, -31, 220, -71, 248, 505, 906, -751, 44, 1013, 2, 499, -356, 629, 112, -146, -841, -490, 694, 434, 678, 29, -476, 177, 244, 490, -914, 10, 171, -500, -170, -214, -307, -728, 1130, -204, -365, -228, 233, 275, -641, -590, -25, 193, 28, 6, -126, -212, -4, 573, 351, 0, -470, -321, + 52, -177, 123, 154, 76, -46, -243, 103, 120, -63, 181, -102, -417, -195, -24, 125, -31, -130, -610, -240, -140, 49, 76, -260, -472, 188, 284, -247, 12, -217, 239, -76, -420, 630, -1062, -10, -212, 460, -235, -653, 570, -1147, -992, -816, 467, -242, 25, -445, -424, -492, 275, 241, 799, 378, 160, 746, -200, 271, -270, 234, 133, 445, 716, 376, -151, -438, -264, -89, 401, -132, 110, 16, -187, 382, -26, 314, 230, -611, 502, 927, 142, 776, 748, 341, 246, 2, 394, -246, -903, -293, 666, 7, -333, 345, 947, -217, + 70, -687, 675, 607, -47, 195, -313, 1560, -982, -850, -805, 68, 26, -236, 693, -977, -20, -625, 236, 276, -47, 677, 153, -58, -369, -5, 168, 493, -341, -435, 179, -260, -71, 60, 116, 40, 0, -33, -413, 39, 95, 281, -246, -138, 156, 74, 108, 9, -271, -31, -307, -232, 302, 154, 169, 119, -13, 58, -86, 184, 22, -84, -21, -269, -104, -179, 105, 1704, -376, 949, 1637, -558, 785, 347, -1032, 942, 143, -452, 695, 295, 653, -7, -551, 520, 179, 1, 164, -159, -583, -349, -279, -506, -374, -97, 388, -348, + -208, -498, 105, 41, 80, 680, -408, 163, -378, -215, 392, -314, -700, -901, 1037, 459, -257, 713, -656, -577, -349, -59, 106, 4, -611, -451, -477, -1052, -656, -567, 204, 351, -28, 609, 117, -630, -541, 822, -705, 98, 723, -97, -1241, 866, -457, 136, 57, 716, -171, -280, -35, -416, 218, -714, 244, -917, -582, 349, -385, -116, -48, -546, 180, -321, 262, -88, -7, 23, 341, -249, -191, 54, -340, -157, 56, -229, -237, -171, -98, -267, -142, 363, -296, 137, 227, -60, 242, -323, 39, -229, 468, 81, 171, -330, 412, 274, + 316, 125, 45, 93, 232, -230, 29, -824, 494, -231, 836, 580, -1337, -164, 142, -810, -133, -130, 988, 717, 660, 826, -31, -573, -447, -455, 21, -1273, 153, 1096, -997, -1795, 182, -669, 1325, -6, 43, 892, -408, 186, -42, -239, 771, -220, 390, 1301, -957, -543, -872, 436, 71, 872, -500, 345, 45, 795, 465, -385, -259, 302, -145, -33, -561, -550, 288, -121, -165, -312, 714, -270, -290, 1204, 1283, 834, -1095, -96, -346, 426, 1599, -201, -1224, -79, -506, 720, 319, -817, 428, 319, 417, -789, -287, 59, 696, 44, -116, 115, + -243, 56, 695, 340, -294, -349, -83, 220, 276, 369, -352, -132, -643, -134, 402, -402, -67, -248, -234, -378, -83, 257, -61, -28, 61, 163, -173, -482, -502, 299, 227, 419, -214, 307, 900, 45, -545, -89, 45, -51, -785, 118, -645, 594, 341, -630, 1074, 1629, 45, -75, -558, -564, 94, 95, -276, 1474, -134, 1100, 880, -1110, -36, -371, -1188, 300, 274, 649, 1110, -33, -318, 366, 402, 875, 365, 81, 718, 758, 259, -174, 659, 295, 792, 170, 227, 497, 839, -140, -668, -770, -253, -268, 1321, 725, 2039, -95, -1030, 905, + -312, -352, -310, -694, 101, 390, -16, -388, 1448, -289, 1709, -468, 919, 80, -290, -934, -1335, 1250, -122, -214, -385, 1162, -2, -1219, 2234, 703, 242, -257, -940, 470, 24, 473, -438, 337, 168, -211, -324, 57, -391, -183, -444, 52, -80, -6, 145, 365, -374, 143, -184, -12, 489, 327, -178, -615, -22, -37, 79, 560, -367, -216, 138, 350, -513, 33, 333, -9, -42, -535, 273, -19, 249, -560, 60, 235, 184, 274, -538, -564, 366, 1514, -900, -579, 123, 273, -172, 1072, 835, 843, 285, 416, 710, 438, -257, -424, -953, -155, + 524, 178, 113, -356, -901, -264, -126, 917, 13, -111, 697, -112, 193, 147, -1551, 397, 420, -272, -663, 125, -875, -447, -1340, 404, -1119, -2221, 259, -32, 1564, -55, 532, 1290, -210, -335, 574, -12, -1124, -394, 149, 187, 831, 345, 740, 640, -459, -345, 316, 942, -391, -198, -865, -599, 231, -1170, 340, -1314, 251, -347, 934, -408, 662, -1408, -286, 192, -837, 211, 149, 144, -630, 331, -617, 175, -46, -264, -112, -63, 199, -216, -98, -174, 403, -263, 236, -595, 314, -35, -47, 84, 577, 199, 247, -690, 91, -283, -850, 340, + -272, -218, -313, 315, -152, 151, 179, -84, 38, -210, 61, 173, -40, -28, -324, 1190, 1268, 2963, 349, -1659, -1246, -917, -1059, 2075, 2770, 939, -265, -871, 31, -1054, 1160, 1097, 325, 159, -687, -99, 1276, 298, 513, 432, 1339, 1127, -434, -995, -1316, -886, -132, 367, 1203, 722, -251, 653, -914, -311, -2056, -324, 2024, 1565, -315, 4102, 1286, 120, -2249, -383, -193, -527, 574, 319, 486, 860, -1833, -1974, -992, -1332, -190, 451, 1658, -992, 607, 2585, 1292, 450, 725, 528, -1563, -2587, 1323, -640, 570, 1386, 1533, 135, -927, -1222, -996, 1071, + 619, 186, 1068, -1065, -185, -171, -471, -552, -47, -17, 346, 107, -153, 2, -14, 17, 92, 197, 309, -310, -422, -1449, -793, -717, 855, 505, 305, -1187, -1161, -1870, -509, 733, 938, 1219, 478, 355, 142, 116, -36, 271, -67, 872, 619, 121, 6, 3, -152, -6, -630, -2712, -647, 1512, 2896, 2552, 6118, 3202, 2173, 1912, 870, -343, -3093, -3883, -5793, -4436, -4551, -1731, 23, 1742, 3241, 2673, 2762, 1903, 2598, 2034, 2876, 1370, 1073, 513, -739, -1137, -1743, -1054, -3787, -1600, -3585, -2588, -4104, -2441, -3821, -1358, -1894, -617, 292, 1939, 5086, 4843, + 6786, 4592, 3132, 4067, 5555, 4889, 4106, 2864, 345, -2778, -2757, -3418, -6503, -7179, -7819, -7809, -8575, -7417, -6248, -5511, -3589, 412, 4084, 7104, 9393, 11710, 13031, 9084, 8664, 5621, 3406, 3218, -193, -1064, -4990, -9563, -10297, -8359, -6459, -3807, -3079, -3137, -1730, -2694, -1089, -301, 2068, 3925, 3227, 4197, 4514, 4814, 4254, 5677, 4221, 3456, 1787, 364, -960, -4404, -3898, -5227, -6926, -6276, -7189, -7389, -2154, 237, 3750, 4586, 4887, 5669, 5925, 5023, 4373, 3351, 2544, 916, -658, -1966, -3538, -5204, -4871, -4352, -3250, -1534, -672, -324, -189, 466, 979, 1168, 1249, 1000, 783, 824, + 658, 445, 849, 926, 696, 297, 179, 335, 523, 331, 273, 268, 301, 93, -288, -266 }, + {394, 18, 66, 55, -161, -83, 219, 381, 61, 203, -82, 39, -10, 172, -136, -310, 126, 146, -181, 210, 103, 192, 61, 46, -84, -27, 10, 128, 12, -192, 8, -15, 42, -27, 34, 46, 114, 83, 27, 36, 11, 56, -59, -96, -213, 41, 47, 17, 163, -58, 127, 35, -51, -100, -65, 228, 49, 127, 21, 50, -44, 8, 15, 66, -20, -85, -46, -177, 19, 35, 151, -49, 116, -20, 76, 1, 68, 53, 32, -28, 78, 108, 75, 71, -3, 15, 17, -60, 25, 13, 52, 27, 21, 28, 37, -22, + 22, -17, -3, 146, 141, 64, 58, 77, 93, 138, -60, 143, 2, 153, -34, 273, 93, 90, -186, -26, -42, -242, 132, 111, -76, -317, -144, -48, 154, 212, 134, -85, 45, -136, 6, 11, -111, -55, -287, 23, -36, -120, 12, 16, -39, -9, 274, -66, 223, 43, -173, 12, 17, 125, -57, 35, 29, 9, 171, 59, 175, 129, -90, 160, 78, 116, 11, 38, -41, -77, -145, -179, 185, -186, -143, -154, 85, 77, 34, 33, 108, -71, 81, -53, -75, 118, -110, 18, 55, -93, 22, 13, -15, -15, -9, 62, + -21, 23, -28, 47, -14, 26, -34, -247, -230, 49, 5, -50, 138, -18, -24, 143, -157, 31, -137, -89, -50, 1, 234, 265, -123, 104, -191, -18, -75, 258, -76, -15, 27, -363, -63, -179, -59, -45, 135, 179, 74, 243, -31, -111, -112, 140, 364, 255, -142, -166, 182, -164, 31, 58, 299, -110, -147, 33, -91, 57, 76, 190, -208, -135, 122, 229, -21, -106, -135, -324, 123, -1, 97, 15, 9, -51, 60, -83, 52, 70, 71, -115, 85, -21, -80, 8, -170, 107, 17, 14, -67, -23, -57, -119, -90, 63, + 6, 26, -22, 8, -6, -34, -26, -50, 6, -28, -21, -7, 12, -9, 17, -9, 61, 23, -34, 41, 25, -47, -601, -198, -32, 102, 69, 149, -287, -86, -13, -298, -213, 75, 180, 105, 198, -26, 114, 264, 233, 219, 126, -85, -68, -136, -61, -137, 282, 131, -44, -126, -77, -128, -187, -201, -253, 151, 108, -281, 65, -16, 193, 28, 94, 124, -266, -43, -11, 34, 138, 209, -85, -32, -63, -168, 50, 32, -18, -47, 159, 7, -89, -32, 75, 100, -42, -7, 26, -147, 107, -13, -219, 23, -267, 40, + 197, -68, -9, -301, -147, -224, -136, -21, -24, 135, 26, 159, -98, 52, 87, 27, 85, 7, -59, 31, -27, 25, 2, 9, -12, -44, -16, 34, -40, 24, 67, 32, 17, -1, 1, -18, -28, -48, 32, 40, -27, 25, -28, 330, 125, 56, -82, 243, 94, 137, 385, 417, 16, -68, -148, -227, 84, 165, -85, -17, 24, -40, -133, 156, -153, 72, -441, -64, -107, -107, -218, -46, -28, 3, -111, -160, -125, 18, -83, -169, 102, 146, 12, -139, -155, 57, -120, 137, -171, 111, 41, -2, -244, -227, 53, -164, + 267, 48, 224, -116, 226, 44, 145, 49, 138, -126, -180, -4, 290, -28, -194, -103, 127, -81, -111, 30, -310, 210, 254, -16, -215, -272, -8, 229, 166, -130, 176, 18, -25, -34, -18, -15, 49, -77, -66, 6, 27, -58, 21, -27, -8, 61, -24, -13, 10, -96, 51, 13, 9, 22, 31, -4, 9, -19, -18, -14, -11, 474, 97, 261, -102, 195, 145, 304, -225, -160, -51, 18, 216, -101, 328, -24, 187, 162, -91, 67, 189, 175, 45, 49, 172, -355, 59, 276, 215, -191, 240, -283, 172, -249, -126, -65, + 261, -53, 273, 61, 59, 14, -9, 108, 160, 356, 56, 307, -151, 224, 295, -9, -53, -106, 114, -422, -35, 42, -158, -250, -14, -16, -34, 111, -257, 130, 114, 164, -406, 140, 98, -240, -28, 133, 299, -379, -47, 29, -358, -31, 53, -99, 235, -52, 21, 67, -41, -11, -16, 42, -93, 14, -48, 29, 8, -52, -6, 66, -29, -12, 2, -75, -29, 15, -29, -34, -11, 15, -42, -17, 53, 72, -92, -1, -421, -516, -414, -373, -13, 263, -545, 388, 251, -612, 385, 164, 132, 61, 59, 139, -97, -100, + -202, -6, 235, 199, 115, -348, 238, -249, 6, -219, 273, -145, -114, 87, -410, 41, -136, -122, -44, 30, 403, -190, -62, -153, 306, -186, -101, 95, 92, 87, 108, -127, 147, 38, -337, 463, 183, 75, 48, -2, -216, 265, 221, 93, 296, 32, 130, 298, 151, 64, -206, 246, -109, 470, -52, 13, -129, -493, 63, -120, -60, 253, -23, -267, -154, 217, 180, 28, 209, 55, -156, 73, -17, -52, -45, 17, 123, -59, 14, 22, 68, 26, -59, 91, 11, 24, -7, 23, 9, -36, 50, -36, 41, 34, -29, 103, + -16, 25, -37, -23, 301, 205, -35, -189, 494, 786, -104, -109, 380, 92, 125, 101, -567, 62, -367, 293, 418, -110, -202, 68, 265, -159, 320, -126, 617, -181, 119, -31, 167, 439, -166, 43, -39, 126, -163, -79, 250, 538, 45, 394, -147, 54, -75, 131, 288, 430, 335, 318, 331, 209, -61, 50, -46, 7, 65, -216, -62, 346, -305, 120, -134, -81, -159, -628, 70, 339, 215, -78, -298, -724, -117, 293, -62, 115, -226, 167, -209, 190, 410, -181, -223, -411, 123, 49, 67, -325, 23, 1, -99, 17, 152, 5, + 104, 45, 67, 82, -15, 129, 31, 12, -28, -44, -37, 123, 41, -6, 83, 42, 60, -13, 69, 83, 114, -50, 12, -48, -543, -427, 53, 256, -246, -156, 29, -128, -812, -696, 302, 283, 49, 44, -299, 468, 562, 351, -294, 275, 368, -55, -472, -209, 647, -190, 63, 43, 362, -290, -524, 116, 237, -125, 151, 341, -166, -127, -18, -725, -213, 254, -141, -484, 86, -10, -155, 100, -48, -459, -394, -688, -551, 110, 240, 26, -166, -227, 4, -154, 145, -328, 9, -114, -98, -109, -32, 133, -153, -659, 98, -92, + 162, 185, 11, 130, 152, 52, -40, 85, -96, 41, -209, -106, -95, -110, 45, 186, -98, 33, -237, 31, -26, -170, 74, -51, 42, 75, 39, 36, 146, 37, 17, 54, -2, 25, 19, -38, -114, -18, -115, 58, -88, 132, -1, 187, 82, -105, -74, -55, -9, 264, 848, 754, 589, -63, 576, 187, 804, 341, -17, 981, -204, -51, -625, -165, -13, -441, 264, 394, -128, -5, -355, -608, -359, -463, -135, -280, -88, -44, 278, 71, -58, -250, -87, -167, 88, 6, -249, 131, 164, 65, -193, -252, 84, 233, -34, -9, + -447, 800, 133, -152, -23, 71, 341, 290, -301, 169, -118, 36, -52, -76, -458, -408, -548, 82, -24, -116, 342, -110, 968, -96, -54, -240, -109, 125, 165, 116, -10, 417, 298, -63, -204, 54, -122, -2, 37, -136, -46, 2, -47, 64, -167, 97, 182, -58, 95, -58, -48, -76, 28, 101, -46, 136, 23, 47, 187, 80, -28, 197, 87, 136, 177, 136, 12, -3, 130, -125, 1, 78, 41, 90, 83, 44, -522, -732, -414, 552, 426, -372, -394, 592, 350, -368, -513, -80, 81, 59, 66, -293, 304, -218, 600, -92, + -432, 101, 149, -2, 40, -186, -283, -14, 240, -149, 182, -296, -802, -644, 403, -501, 397, 119, 41, -167, 231, 77, -69, -114, 105, 244, -225, 675, -176, 228, -209, 61, -63, -263, 644, -508, 701, -25, -358, -534, 267, 97, 82, 32, 281, 194, 254, -550, -173, 16, 1, 140, -424, -201, -144, -71, -529, -106, -183, -587, -39, -332, 78, -155, 36, 77, 249, 153, -107, -15, -224, 120, -24, 104, -262, 15, -111, 62, -242, 47, 44, 13, -61, 83, -147, 106, -224, 83, -163, 76, 31, 106, -89, 270, 96, 5, + -172, -132, -36, 180, -48, -87, -94, 124, 108, 1259, 420, -281, 647, 603, -312, -397, 973, -87, 213, -578, 1417, 49, -398, 205, 70, 688, 11, 869, -626, 13, -683, 52, 478, 22, -419, 591, 315, 174, 141, -208, -201, 53, -297, 387, -347, -462, 405, 153, -537, 289, 33, -390, -220, -132, 203, -48, -236, 284, -348, -139, -121, 476, -316, 229, 364, 168, -220, -449, 280, -384, 513, -653, 855, -257, -124, -125, 388, -31, 138, 231, 137, 329, -328, -621, 40, 522, -354, -169, -370, -223, 93, -40, -110, 223, 159, 116, + -62, 342, 207, -164, -89, 64, 14, 288, 181, -28, -100, -79, 315, 25, -169, 198, 55, 4, 164, 72, -35, -178, 43, 205, -162, -44, 233, -21, -56, -66, 135, 22, -2, -69, -747, -99, 694, -207, -424, 185, -196, -42, 318, -754, -434, 284, 391, 520, -31, -104, 218, -56, -734, -512, 876, -71, -756, -447, -301, -257, 77, 251, 20, -132, -374, -586, 85, 73, -14, 471, -318, -917, 377, 264, -1060, 633, -166, -543, -437, -44, 614, 141, -194, -224, 180, 315, -442, 340, 62, 249, -187, -471, 421, -2, 471, -1446, + 190, 219, -206, 397, 473, 1368, 46, -909, -411, -240, -874, -868, 52, -494, 13, -330, 330, -335, -320, 576, 149, -22, -25, 337, -65, -36, 204, 159, -118, 108, -302, -70, 93, -61, -83, -151, -152, -83, -189, 77, -242, 52, -36, 232, -48, -123, -97, -142, -143, -41, -98, -184, -128, 133, -174, -94, -316, 99, 137, 333, 83, -44, 18, -629, 100, 388, 346, -558, 994, 693, -320, 415, -806, -179, -271, 1272, 814, -303, -486, -594, -133, 34, 233, 853, 181, 145, 184, 24, -282, 35, -54, 393, 530, 673, 437, 286, + -67, -124, 106, 610, 96, 109, -620, -314, 1047, 426, 315, 9, 627, 336, 1322, -73, 1363, 98, -423, 442, -368, -274, -48, -250, 15, 254, 545, 96, -116, -595, 193, 51, 394, -467, 125, -205, 71, -594, 303, -523, -63, -712, -981, -162, -153, 810, 219, -23, 152, 254, 315, 56, -11, 15, -567, 183, 9, 532, -214, -23, -141, 379, 76, 347, -3, -397, 196, -17, 133, -301, -137, 77, 85, -223, 23, 211, 130, -194, -220, 394, -391, 168, -120, -315, 102, 78, 103, 138, -146, -13, 188, 20, 131, -50, -149, -147, + -332, -509, 156, -584, 0, 704, 222, 600, -697, -323, 343, 69, 1000, -510, 598, -228, -302, -747, -289, -402, 500, 115, -663, 829, -429, -402, 81, 321, -242, 572, -278, -401, -205, 189, -70, -112, 62, 571, -388, 1047, -407, -16, 972, -198, 171, -1329, 59, 235, -299, 582, -1064, -1304, 494, -234, 719, -540, -507, 55, -167, 1102, -135, -54, 246, -1030, 58, -1041, -416, 57, 248, -1299, -579, -162, -64, 417, -557, 661, -273, 72, -852, -46, -753, 281, 163, 557, 714, -269, 468, 60, -153, 236, 149, -233, -233, -414, -15, -248, + -256, 85, -61, 352, -477, -86, -300, 115, 174, -169, -22, -257, -253, 281, 467, 522, 108, 31, -141, 96, 87, -202, -315, 105, -166, -235, 356, 244, 208, -329, -375, -802, 654, -573, -164, 525, 1200, -339, 984, 353, 254, -454, 1090, 175, 509, 52, -639, 237, -641, -634, 400, -632, -136, -144, 646, 60, -216, 214, 288, -128, -607, -137, 469, 1139, 262, -633, 71, -117, 273, 350, 576, -249, 14, 378, 86, -14, 760, 691, 817, 287, 686, 99, 412, -318, -58, 96, -638, 53, 1078, -132, -237, 232, -17, 295, -643, 855, + -534, -233, -147, 49, 99, 115, -936, 1185, -257, -373, -141, 1007, -116, 214, -795, -547, 14, 422, 381, 645, -1031, -317, 982, -349, 106, 847, 198, 189, -57, 34, -324, -20, 78, 246, -148, 205, -374, -204, 17, -100, -67, -860, -673, 60, 432, -403, -702, -281, -577, 165, 21, -215, 545, -154, 220, 255, -304, -207, -55, 71, -27, 419, -12, 30, -206, -42, -322, 1926, -113, 386, -16, -198, 54, -892, -381, -274, 347, 247, 436, 50, -469, 492, -399, 567, 417, -459, -492, 58, 693, -711, 298, 327, -406, 181, -52, 248, + -32, -1036, 581, 357, -873, 1053, -558, -134, -346, 851, -169, -724, -1, 11, 704, 716, 48, -551, 803, -129, 142, -1017, 801, 327, 49, -583, -441, -61, 279, -468, -837, -356, 662, 411, -97, 1075, 65, -173, -774, 950, -880, -283, 970, 308, 127, -362, 152, 958, 214, 422, 607, -1561, -340, -257, -127, -645, -112, -73, 951, 261, 67, 486, 680, 479, -333, 185, 409, -76, 160, 180, 220, 145, 678, 370, 46, -191, -300, -579, 90, 7, 162, 198, 96, 1021, -134, 373, 225, -269, -799, -123, -292, -494, -534, 101, -83, -645, + 9, 258, -58, -55, 236, -151, -492, -772, 24, -864, 809, 1264, 587, 719, -1104, -984, -774, 74, 1368, -254, 508, 890, 448, -492, 28, 649, -840, -702, -602, 680, 473, -880, -1242, 1681, 1036, -1201, 542, -142, 496, 52, -364, -835, 759, -22, -619, -927, 235, 215, -235, 23, -87, -458, -202, -242, 428, -813, 893, -614, 32, 1406, -1359, -329, 1280, 92, 298, -192, -402, 400, -150, -566, 72, -1289, 2182, -216, -2411, 911, 2375, 1401, -2940, -856, 554, 211, -450, -679, 365, 897, -1108, -306, -1932, -334, 664, 242, -592, -965, 377, 845, + -21, -261, -465, 672, 397, 272, -59, -203, 77, 375, 289, -69, -776, -482, 802, 344, -418, -282, 575, 193, -84, -1173, -541, -585, 655, 180, 140, -122, 13, 639, -134, -114, -562, 110, -184, 893, 186, -201, 106, 902, -609, 140, 599, 1400, -587, 456, -741, -1964, 1061, -495, -1074, -745, -1098, 527, 367, -1479, 951, -515, -36, -18, -757, 585, 585, 514, -47, 672, 353, -408, 39, -842, -303, -747, -519, -37, 1217, -1015, -214, -219, -907, 533, -1024, 531, 464, -697, 552, -1121, 324, -975, 635, -366, -512, -534, -791, -215, 402, 691, + -802, 537, 304, 841, 1038, 599, -857, -401, -1615, -410, -467, 537, -1886, -360, -1121, -99, 1131, 1036, 686, 240, 1523, 1662, 1484, -511, -662, 561, 1453, 2677, 197, 625, 330, -145, 498, -484, 295, -127, -3, -313, 506, 579, -199, -482, -361, 438, 199, 497, -270, 191, -95, -224, -139, 494, 985, 466, -505, 256, -172, 348, 161, 171, 483, -311, -641, 51, 499, 386, 137, -99, -218, -890, 875, 241, -202, -926, -212, -637, 320, -309, 228, 1751, -1034, 652, 800, -373, 75, 302, -95, 848, 46, 613, -786, -116, 688, 109, -1068, 688, + -425, -353, -406, -111, -396, 401, 569, 271, -97, -302, 493, -165, -783, 638, -1324, -339, -272, -296, 758, 824, 1487, -440, 637, -28, 287, 970, -71, 99, -649, -2052, 1014, 191, -988, -682, 100, 530, -94, -585, 301, -599, 782, 431, -340, -718, 1417, 151, 75, -135, 197, 95, 62, -482, -1008, 274, -148, -364, -930, -234, -28, 824, 341, -1049, 608, 104, -40, -121, 339, 430, -87, -200, -75, -189, 160, 253, -12, 143, 289, -113, 418, 173, 128, 215, -119, 519, 88, -117, 342, -420, 132, 233, -99, -182, 471, 675, -611, -118, + -216, -214, 241, 205, -384, 206, 168, 146, 176, -349, 244, -32, 143, -114, 98, 1948, 994, 1961, -1811, 156, 941, -365, 1073, 2070, 1136, 66, -558, -576, 107, 897, 961, 218, -2, -1429, -294, 1409, 466, -393, 778, -662, -925, -254, -62, 1088, 1422, 1277, 484, -495, -761, -1413, -1405, 1224, 513, 100, 1891, 114, -579, -774, -786, 382, 808, 643, 1240, 88, 892, -59, -160, 452, 826, 604, 525, -471, -178, -372, -837, -671, -1220, -409, 327, -200, 888, 1068, -17, 10, -437, -781, 161, 1032, -59, 571, 251, -75, -323, -149, 95, 360, + 281, -276, -577, -714, -669, -260, 272, -70, -421, -216, -292, -247, 138, -37, 396, 566, 128, -689, -354, -413, -93, 465, 113, 114, -563, -534, -608, -312, 531, 362, 458, 246, -221, -274, 195, 176, -47, 119, -231, -187, 139, 97, 192, -112, -231, -107, -177, -34, -1035, -2018, 796, 3292, 3347, 2834, 2053, -1267, -1446, -1562, -2078, -3181, -2562, -2226, 1033, 2391, 1778, 3846, 2972, 1549, -572, -1036, -2584, -2017, -1997, -408, -1223, -994, 296, 541, 1088, 1092, 1499, 1487, 1918, 1118, 492, -279, -324, -844, -1278, -1543, -1886, -1236, -2317, -1544, -1159, 1159, + 2199, 2371, 1640, 1117, 1751, 1339, 1680, 1319, 463, -623, -2939, -2079, -2118, -3288, -2062, -1785, -1732, 630, 1744, 2769, 2280, 3256, 2923, 2858, 2038, -1113, -1007, -2289, -3027, -3335, -2736, -1313, -373, -692, 901, 2384, 1681, 1135, 1912, 1606, 574, -379, -381, -125, -468, -1283, -806, -917, -495, -411, -955, -354, 330, -321, 1060, 1399, 1537, 1626, 101, 485, 474, -139, -2226, -1776, -1387, -1239, -976, -926, 1023, 1528, 1660, 1589, 1311, 899, 809, -12, -240, -1288, -1739, -1558, -1300, -829, -540, 63, 784, 1588, 1186, 754, 543, 149, -10, 3, -308, -398, -328, -383, + 84, -142, -500, 60, 227, -70, -87, -55, 75, 120, -35, 72, 248, 152, 41, 13 } + }, + { + {-101, 102, 88, 196, -268, 57, 177, 323, -35, 181, -7, 165, 40, 253, -5, -83, 171, 242, 231, 135, 38, -95, -74, 22, 118, -61, 55, 13, 134, -66, -3, 32, -159, -94, -46, -168, 40, -48, -1, -24, -138, 107, 166, -36, 14, 14, -26, 174, -213, -2, 89, 22, 29, -53, -176, -47, 69, 80, 91, -18, 4, 0, 36, -32, 185, 4, -16, -123, 17, -88, -66, 71, 80, 189, 7, 186, 22, 18, 13, -101, 7, -37, -50, 18, 61, -40, 25, -41, 48, -52, -15, -27, 28, -18, 26, -24, + 31, 51, 27, -28, -6, -15, -12, 13, 12, 212, 344, 46, 171, -62, 102, 133, -41, -107, 180, 311, -61, 34, 120, -149, 93, 133, -272, 76, 27, -61, 0, -283, 12, 79, -135, 25, 5, 181, 129, -68, -19, -17, -193, -130, 21, 78, 17, 86, -127, 19, 64, 13, -118, -86, -26, 41, 95, 99, 66, 115, 113, -127, -39, 5, 160, -24, 115, -76, -78, -24, -144, -66, 30, 84, -123, 120, -34, -36, -24, -49, -62, 25, 94, 35, 156, -217, -175, -39, 65, -2, -36, 33, 5, 40, 66, 110, + 2, -7, 26, -10, -2, 17, -50, -27, -105, 41, 200, 281, 164, -71, 121, -74, -49, -241, -192, 87, 185, 180, 189, 42, 11, 116, -155, 156, 127, 11, 109, 279, 190, 53, -200, 6, 68, 43, 33, -220, 53, 40, 148, 162, -51, 104, -79, -88, 119, 67, -210, -200, -87, -112, -83, -89, -243, -220, -20, 79, -1, -24, -164, 22, 195, -55, -61, 73, 0, 140, 71, 72, -91, -112, 209, 95, -83, 137, -18, 107, -91, 17, 154, -59, -50, 111, 14, 44, 66, -77, 87, -36, 71, 71, 55, -50, + 18, -25, -42, -54, 3, 6, 35, 29, 8, -3, 27, 8, 19, -389, -229, -72, 74, -161, 49, -44, 112, -28, -218, -174, 151, 123, 312, 275, -42, 199, -300, -49, 233, 70, 54, -31, -98, -46, 32, -27, -9, 118, -147, 32, 53, -4, 93, -101, -83, 53, -65, 83, -164, 27, -99, -39, -110, -83, -125, -186, 113, -2, 194, -182, -155, -2, 37, -22, -37, 12, 116, 55, 25, -80, -77, -44, -145, 22, -38, 16, -7, -156, -13, -13, -165, 4, -31, 18, -28, -184, 16, 82, -37, 121, 33, -66, + 51, 127, 41, 21, 28, -28, 15, 99, -8, -17, 36, 40, 15, 32, 6, 13, -67, 7, -6, -34, -25, -25, -35, 4, -29, 135, -208, 85, -233, -41, 13, -173, 164, 124, -346, -35, 59, -32, -151, -204, 43, -103, -168, -84, 101, 89, 247, 320, -27, 286, -175, 112, 126, -26, 124, -71, 4, -19, -58, -31, -65, 238, -13, -178, -42, 119, 75, 95, 20, -84, 175, 355, 23, 35, 22, -27, 57, -24, 204, -156, 195, 134, -122, 62, 127, 86, -147, -161, -315, -52, -29, 39, 123, -31, 80, -28, + -84, -85, 164, -38, 174, -257, -101, 58, -162, 41, 175, 16, -1, 12, 38, 23, -98, -32, -16, 13, -17, 31, 45, 22, -28, -67, 73, 27, 28, 18, 21, 4, 2, -33, 30, 13, 12, 4, 32, 20, 38, -45, -27, -53, -48, -14, 38, -32, 4, 92, 41, 5, 123, 358, 422, -110, -10, 89, -64, 274, 267, -168, 262, 206, 79, 119, 107, 55, -23, 19, 35, -144, -177, 46, -50, -2, 30, -156, 157, 316, -10, -190, 309, 38, 9, 121, -55, -93, 45, -117, 46, 316, 135, -2, 113, 172, + 446, -73, 192, -38, -195, 127, 11, -65, 87, 273, 69, 48, -5, 109, 394, 177, 48, 40, 103, -114, 201, -52, -392, 47, -43, 235, 276, 120, -120, -108, -103, -14, 85, 8, 57, 39, 60, 176, 75, -141, -62, 19, 47, 9, -5, 5, -79, 81, 17, 16, 7, 16, 6, 60, -27, 44, -47, -14, -72, 13, -29, -5, 24, -476, -55, -201, -240, -62, -172, 9, 145, -223, 231, -495, 69, -146, -266, -353, 369, 186, 22, -313, -207, 119, -409, -284, 95, 88, 413, -52, 33, 308, -184, 303, 102, 112, + -60, -180, -23, 252, -137, 23, 314, -114, -94, -151, -189, -161, -123, -253, -32, 78, -88, 57, -84, -129, 176, -226, 137, -192, -244, 13, 199, 14, -61, 81, -163, -80, -228, -404, -192, 59, -124, 465, 184, -322, -164, -47, -117, 150, 314, 208, -153, 147, -181, 110, 16, 147, -160, -36, 14, -69, -136, -112, 21, -6, -32, 73, 27, 13, -45, 44, -9, -33, -99, -1, -51, 10, 45, -31, -110, -11, -46, 516, 336, 353, -104, -502, -41, -257, 64, 111, 270, -127, 118, -207, 34, -182, -468, -252, 178, -171, + -371, -348, -324, -506, 62, -177, -385, -346, 60, 486, -66, -82, -163, -295, 60, -118, 31, -368, 23, -384, 53, -32, 205, 159, 171, 88, -15, 142, -95, 280, 78, 142, 84, -92, 99, 282, -38, 157, -41, 443, 56, 167, 21, -249, -191, 9, -89, 57, -65, 147, 130, 171, -79, 98, -341, 181, 497, -240, -51, 133, -287, -19, 179, -112, -18, -59, 155, -160, -39, 44, -90, 44, -31, 66, -83, -82, 92, -41, -91, 65, -36, 3, -129, 99, 33, -21, -21, 57, 20, 55, 40, 10, -55, -96, -28, -249, + -724, -119, -253, -380, 204, -726, -95, -258, -142, 211, -232, 308, 264, 43, 238, 22, 125, -189, -335, -368, -207, -337, 262, 345, -16, -181, 98, 100, -128, 26, -575, -303, 266, -146, 7, 263, -26, 163, 138, -74, 158, -1, -308, 342, -241, 17, 18, -188, 124, 204, -121, 233, 25, -18, -214, 263, -3, -212, -72, -425, -180, -243, -32, 293, 83, -28, 4, -275, 61, 212, -279, 16, 425, -175, 41, 33, -304, -182, 193, 163, -494, 100, 368, -2, 43, 3, 88, -28, 231, -53, -11, 30, 44, -105, 26, 82, + 24, 139, 50, -3, -52, -109, -32, 52, -68, 49, -70, -2, 95, 52, -68, -91, 4, 3, 203, -82, 16, 112, 44, 109, 1288, 286, -169, -258, -25, -82, 228, -51, 193, 365, -148, 18, -242, -166, 77, -40, 187, -361, -212, 170, 361, 239, -12, 86, -89, -218, 156, 283, 296, 358, -297, -70, -171, -368, -47, 19, -81, 169, 222, 0, 109, -66, -392, -213, -524, -531, -156, 178, -78, -235, 444, 168, -19, -417, -20, -128, -299, 4, -137, -193, -414, -53, -153, -454, -1, 348, -234, -110, 127, -195, 77, -193, + 282, -90, -275, -424, -699, 139, 117, 534, 214, 185, -4, 163, -126, 173, -17, 62, 84, 204, 92, 10, -38, -9, 80, 52, 210, 167, 110, 38, -44, -110, 60, 139, 11, 11, -27, -97, -18, -12, -48, -33, -77, 66, 92, -85, -90, -2, -13, 52, 290, -1020, -581, 541, -140, 35, -280, 236, -97, -394, 190, 547, 71, -479, 135, -104, -109, 315, 327, -44, -66, 689, 154, -99, -423, 187, -607, -500, -460, 187, -87, -49, 396, 158, -401, -336, 88, 391, 134, -45, 23, 261, -188, -425, 555, -163, 58, 224, + 35, 77, 570, 10, 363, 16, -381, 55, 82, -79, 73, 259, -193, -59, 67, -754, 200, 154, -4, 181, 141, -280, 133, 1037, 446, 256, 75, 252, -797, -378, 404, 16, -4, -306, 270, 326, 273, 45, 57, -110, 4, -190, -69, 149, -34, -96, 78, 6, 75, -111, -47, 37, -20, 75, -133, -46, 94, -106, 76, 27, 9, 2, 0, -86, 42, 78, -40, -41, -92, 39, -6, -684, 481, 514, 166, 283, -189, 820, -96, 313, 215, -379, -155, -175, 478, -284, -88, 300, 254, -280, -75, -807, 152, -90, -236, 69, + 23, 59, 75, 272, 12, 298, 37, 145, -76, -260, -276, 520, -184, -378, -316, -145, -174, 225, 142, 174, 232, 68, -284, 163, -465, -153, -406, 279, -490, -353, -103, -166, 148, 329, -261, 311, 514, 254, 496, -208, 665, 60, 564, 318, 71, -301, -753, -510, -413, -236, -231, -74, -350, 265, 443, -170, -337, -309, -243, -459, 290, 209, -121, -118, -177, 23, -100, 247, 2, 63, -131, -113, -185, -34, -222, -214, 220, -16, 28, 5, 82, -88, -7, -132, 5, 1, -5, 68, 8, -108, -70, -77, 23, -116, -125, -159, + 44, 381, 194, -217, 642, 73, -626, 782, 53, -333, 276, -642, -123, -409, -128, -72, -125, -292, 82, -555, -215, -200, -749, 91, -543, -386, -609, 123, -460, -138, -152, 5, 232, -187, 326, 17, 433, -101, 377, 475, -570, -8, 153, 349, 14, 419, 141, 405, -8, -309, -194, -29, 262, -60, -120, -26, 484, 306, -115, -398, 134, 219, 156, 429, -574, -425, -121, 41, -162, 5, -165, -359, 1009, -498, -578, 432, 249, 376, 116, 138, 78, 220, -207, 580, -101, 143, -112, 78, 35, -31, 369, 47, 33, -363, 165, 55, + -53, -296, -30, -61, 8, -94, 267, 62, 75, -214, 147, -101, 30, 129, -5, -63, -69, -190, 111, 196, -92, -21, -69, 30, -110, -256, -77, -8, -175, 183, -16, -24, 62, -172, -195, 80, -134, -171, 508, 374, 601, -200, -149, -826, 959, 440, -1278, -684, 409, 569, 572, -368, -298, 692, 164, 159, 480, 388, -706, 216, 297, -53, 333, 64, -91, 69, -230, 1178, 309, 154, -33, -146, -79, -669, 128, 197, -158, -219, -1083, -517, 227, 189, -356, -348, -49, -516, 213, 191, -75, 215, 426, 21, -23, -137, -229, -75, + 38, -797, -107, 187, 486, -863, 191, 310, -69, -407, -368, 653, 644, -94, -403, -764, 160, 306, 160, 13, -834, 351, 757, -257, 85, 238, -312, -497, -264, 76, -155, -39, -235, -202, -172, -73, -68, 101, -19, -15, -215, 88, -101, 46, 1, 69, 129, 151, -240, 96, -186, -311, -164, 45, -33, 135, -31, 88, 182, 9, -10, -161, -91, 243, 122, -102, -64, 380, -280, 104, -233, -205, 36, 258, 514, -947, -1236, -859, -1106, 961, -640, 387, -108, -777, 139, -210, -289, -1008, -924, -689, -263, 37, -534, -154, 141, 434, + 34, -269, 1, -288, 416, -523, 724, 625, -149, -198, -859, -500, -522, 64, 116, -139, 703, 201, 570, 113, -67, -257, 512, 355, 161, -513, 276, -868, -97, -91, -576, -94, 8, 666, 441, 14, 308, -11, -655, 335, 93, 548, -309, -630, 377, -1133, -259, 403, -169, -179, 279, -72, -223, 212, -93, -726, -638, -104, 300, 485, 682, 683, -287, -230, 136, 249, 224, 95, -302, 268, 7, -54, 36, 167, 279, -79, 49, 264, -59, -3, -262, 134, -55, -16, 220, -40, -95, 100, -297, -108, 308, 90, 102, -105, -68, -42, + -236, -28, -130, 185, -517, -1234, -116, -786, 48, -579, 527, -413, -45, 104, 196, 636, 213, -287, 686, 214, -1170, 194, -702, -49, 133, -97, 576, -170, 104, 147, 50, -373, 584, -338, -33, -683, -2, 117, -109, -240, -315, -356, 886, 37, 458, -789, 88, -9, 270, 474, -546, 968, 1389, -62, 132, -484, 220, 325, -271, 71, 259, 541, -20, 33, -170, -468, -708, 360, -532, -222, -349, 154, 471, 427, -88, 161, -961, 633, -122, 138, -285, 619, -864, 1026, 742, 855, -349, -20, -846, -456, -318, 277, 228, -696, -516, 20, + -183, -508, -8, -352, -424, -156, -70, 32, -283, 49, 85, 422, 370, -59, 348, -176, -454, -247, -104, -225, -43, -167, 242, 75, 961, 128, -344, -115, 76, -508, -328, 120, 9, -132, 39, -1, -568, -59, 359, -275, 1550, 444, 1127, 361, -1177, 474, 326, -391, 79, 761, 32, 729, 643, -755, 415, -755, -512, -70, 1519, 469, -688, 649, 415, -835, -371, -56, 848, 127, -780, -436, -26, -212, 470, 682, -248, 600, -388, -521, -20, 1236, 113, -708, 401, -32, -73, 347, -807, -694, -663, 486, -435, 158, 204, 740, 363, 760, + 79, -31, 616, 1137, 672, -1121, 21, 111, -192, 219, 309, -865, -133, 174, 148, -1031, -982, -547, -598, 1029, 377, 50, 450, -835, 343, 235, 150, -71, -194, 712, 423, -281, 118, -211, 459, -130, 29, 100, 65, 348, -58, -557, -27, 109, 143, 292, -82, 30, 212, -431, -262, -36, -795, -117, 214, -54, 80, 456, -70, -311, 62, 114, 288, 355, -344, -204, -28, -282, -193, -546, -663, 188, 4, -290, -254, -296, -590, 442, -1179, 853, 953, 264, 1038, -1064, -521, -288, -1530, 862, 86, 534, 702, 686, 53, -22, 697, -111, + -829, -860, 520, -971, 947, -272, 207, 938, 846, -426, 1289, -748, 83, -777, 125, -266, 507, 172, -552, 495, 752, 1105, -640, 236, 678, -933, 42, -375, -1349, -581, 359, -741, 263, -622, -16, 907, -432, 384, 1044, 746, 278, 1389, -2166, -408, 721, -84, 420, -671, -1172, 1421, -22, -717, 305, 900, 2233, 845, -1691, -923, 574, 624, 269, -1181, -105, 257, -366, 796, 283, 507, 603, 453, -312, 349, -938, 133, 498, -62, -499, 289, -307, 495, 546, -237, -461, -125, 1012, -184, -123, -400, 455, -397, -248, 291, -194, 953, -78, -239, + 955, -89, 219, 585, -50, -54, 50, 84, -458, 202, 18, -660, 439, -208, 839, -461, 265, 78, 1143, -1005, -90, -481, -595, 916, -356, 1203, -119, -929, 1445, 2087, -298, -668, -1008, 239, 1109, 217, -233, -692, 164, 162, -153, 170, -99, -341, -346, 318, 455, -36, 615, -595, 1262, 950, 548, -47, 75, 178, -669, -587, -649, -342, -178, 403, 355, 684, -332, -83, -295, 778, 1521, -361, -980, -632, -41, -1327, 1028, -1801, 517, 760, 781, -787, 181, 792, -1825, -864, 372, -196, -917, -809, -107, -425, 1354, 579, -500, -460, -756, 2075, + 443, 1083, -82, 315, 388, 463, -684, -90, 857, 591, 350, -287, -375, -3, 263, 394, 263, -539, 70, 2, 132, 383, 380, -565, 254, -350, -433, 41, 430, 175, -274, 57, -48, -84, -236, 824, -257, -2, -508, 112, -196, 541, 163, -122, -306, 306, 244, -388, 11, -628, -261, 142, 239, 345, -784, 236, 1203, 40, -411, 1010, 718, -206, -650, -978, 184, 1931, 421, 992, -90, 89, -81, -224, -4, 91, 463, 157, -378, 324, -332, -357, -412, 13, 382, 87, 305, 335, 263, -268, -483, 155, -337, -825, -251, 191, -295, 972, + -1006, 817, -264, 9, 1198, -186, -39, 1576, -248, -637, 109, -545, -131, -514, 1743, -492, 415, -417, -196, -237, 283, -437, -1081, 477, -131, -1187, 615, -309, 655, 1499, -758, -13, -86, -218, -816, -137, 730, 300, 444, -675, 192, 124, -665, -174, 137, 342, 411, 39, 71, 279, -75, -322, 464, -182, -154, 436, 48, -115, 634, -39, -59, 10, 200, -189, 314, -247, -137, -194, 158, -1, -35, 98, 287, -351, 66, -43, 203, 68, -80, 371, -235, 202, -75, 113, 14, -427, 1, 2006, 1020, 2105, -1177, -306, 697, -659, 505, 2167, + 516, 313, -570, -539, 624, -329, 881, -145, -198, -255, -1242, 300, 1501, -791, 909, 789, -503, -153, 627, -995, 500, -71, 754, 254, -619, -201, -1249, -642, 591, 442, 977, 1519, 166, 24, -1312, -804, -782, -647, 348, -537, -150, -123, 397, -1005, -159, 520, 272, 828, -108, -397, 826, -149, 508, -634, -380, -99, -209, 403, 602, 847, 242, 69, -583, -166, -298, 709, 10, 1063, 188, 801, -777, -280, -3, -20, 582, -93, -286, -158, 145, 39, 153, 267, 242, -148, -171, 10, -101, 225, 243, 55, -201, 7, -264, -113, -57, 456, + 165, -62, 120, -308, -360, -247, 115, 248, -214, -23, 5, 185, 105, -31, 200, 29, -9, -199, 95, 55, -80, 18, -552, -2061, 53, 3317, 2991, 2814, 1192, -1195, -1657, -1643, -1470, -2698, -1927, -1878, 1452, 2232, 1821, 2905, 2416, 513, -113, -1039, -2025, -1208, -2127, -1154, -713, 12, -285, 534, 911, 1551, 975, 1630, 1239, 1295, 100, -1065, -487, 38, -1167, -1539, -2004, -1967, -1398, -196, 975, 387, 1420, 1006, 1619, 1444, 1570, 1824, 979, -139, -296, -1188, -975, -3210, -2571, -2058, -1611, 189, -704, 47, 2192, 2711, 3706, 2347, 1408, 961, 222, -1420, + -1305, -1981, -2565, -2169, -2027, -949, 143, 1027, 1683, 1666, 1413, 894, 947, 410, 253, -44, -789, -684, -629, -696, -374, -777, -561, 195, 64, -451, 244, 645, 362, 736, 1140, 1192, 522, -733, -322, -100, -1503, -1579, -1382, -572, 424, 679, 560, 950, 1068, 1325, 873, 544, -207, -884, -907, -1003, -1360, -960, -539, 467, 732, 481, 285, 863, 573, 356, 75, -120, -275, 36, -327, -370, -141, 135, -231, -157, 14, 165, 4, -64, -95, 148, 23, 30, -58, 98, 119, 170, -36, 29 }, + {34, -39, 136, 152, 82, -59, -230, -211, 77, 121, -45, 227, -44, 135, -161, -142, 62, 6, -42, 60, 147, -64, 20, -84, -8, 8, 60, 56, 75, 12, 45, 168, -65, -79, -85, -152, 44, -32, 278, 54, -21, 22, 169, -16, -37, -43, -99, -18, 130, -20, 54, 131, -41, -10, -211, -124, -193, -38, -56, 28, 10, 28, 68, -46, 33, 2, 17, 29, -70, 66, -23, -80, -10, -81, -25, 7, -126, 33, 5, 97, 10, -2, -58, 13, 96, 47, -24, 11, 21, 23, 73, 9, 4, -18, -11, 7, + 3, -8, 48, 26, 29, 20, 15, 6, 14, 156, 370, 146, 88, 102, -217, -26, 94, -30, 37, -198, 195, 264, 46, 118, -55, -155, -239, -263, -174, 208, -196, -125, -166, 53, 138, 26, 19, 77, -7, 48, 170, -24, 142, -135, 129, 89, 82, -71, -220, -47, 126, 74, -61, -8, 44, -10, -106, -23, 90, -31, 10, -53, -11, 6, 30, 155, 65, -80, 14, 13, -52, 28, -77, -9, 126, 41, 142, -101, -86, -52, -22, 72, 161, -93, -116, 138, -13, -3, 5, 47, 34, 116, -32, 54, -71, -67, + 5, 31, -5, 2, 27, 29, 22, -60, 67, -14, 108, 46, -122, -115, -130, -20, -106, -224, -213, 221, -5, 47, -2, 134, -199, 295, 262, 14, 14, 1, 8, -29, 103, 80, 7, -168, 73, -52, 81, -23, 179, -41, -104, -47, -28, 66, -1, 111, -178, 96, 31, -98, 280, -44, -40, -6, -4, -73, -24, 149, 122, -262, -123, 133, 38, -62, 228, 9, 51, 224, 93, 176, 50, -67, -91, -176, -171, 25, 91, 219, 8, -89, -111, 38, -2, -61, 71, -24, -56, 51, 118, 39, -59, 60, 62, 77, + 50, 4, 7, -73, -15, -1, 38, 32, 60, 59, 49, 19, -5, -299, -104, -145, 136, -99, 88, -107, -45, 254, 124, -168, 77, 242, 35, -85, -170, -204, -140, -205, 136, 31, 75, -39, -93, -98, -181, 10, -6, 43, -44, -164, 2, 175, -39, 2, -88, -175, -259, -22, 186, 68, 19, -88, 24, -141, -46, -106, 13, 24, -160, 181, -102, 230, 87, 22, -105, -55, 59, -13, 56, 123, 25, 49, -137, 81, -69, 211, 261, 120, 176, 82, -27, -184, -119, 15, 135, 136, -109, 14, 128, -168, 166, 11, + -85, 55, -36, -8, -95, 19, 27, 16, -76, 20, -54, -71, -25, 5, 31, -47, 11, -20, -66, 7, 54, 23, -47, 31, -36, 100, -241, 32, -258, -1, 40, 24, 117, 12, 19, 457, -57, -202, -217, 229, 154, -173, 42, -193, -82, 6, 219, -271, 79, -11, 43, -21, 277, -143, 78, -43, -73, 42, -13, 83, -84, -79, -234, 37, -78, -50, 19, -83, 70, -132, -78, -233, -7, -207, -87, -246, 183, 37, -75, 161, -186, -1, -354, -19, 123, -9, 106, 226, -79, -31, 283, 120, 110, 173, -89, -261, + -27, -156, 115, 261, -46, 77, 139, 117, -13, -21, 33, 6, -47, 71, 64, -108, 37, 92, -45, -32, -160, -37, -67, -21, -69, 15, -16, 14, -6, 12, 43, -46, 18, -18, -47, -5, -7, -13, 5, 29, 47, -44, 17, -37, 8, -3, -49, -19, -33, 129, 146, 53, -88, 63, 38, 278, -42, -60, -375, -106, 282, 275, 177, 139, 401, 25, -479, -123, -80, -116, 256, -41, -93, 297, 47, -123, -42, 119, -105, -42, 37, -38, -166, -76, -8, -161, -74, -68, 113, -76, 217, 211, 21, 200, 141, -91, + -31, -69, -311, 35, 65, -296, -42, -84, 106, 270, 41, -274, 41, -106, -184, 149, -43, -197, 89, 76, 218, -17, -26, 160, 190, 208, -213, 151, -27, -36, 57, 225, -9, -60, 72, 34, -190, -25, 262, 58, -16, -33, -117, 84, -42, -54, 10, -8, 62, -4, -80, -58, 110, -14, 44, -49, 54, -41, -29, -40, 29, 58, 191, -490, 204, -53, -112, -101, 84, -46, -291, -309, 38, 483, 133, -351, 79, 287, -206, 37, -52, 171, -1, 158, 422, 308, 192, -7, -35, -195, -209, 83, -547, -86, 259, 29, + -27, -262, -93, -11, -12, -127, -271, 304, -105, -66, -49, -251, -282, -9, -138, 20, 135, 103, 114, -224, -58, -110, -70, 360, -38, -164, 12, 462, -246, 78, 340, 11, -78, -171, 104, 20, 245, -132, 207, 169, 321, 156, 241, 26, -157, 34, -6, -91, 145, 207, -171, 113, 62, -154, 20, 55, 43, 56, -88, 50, -96, -29, -27, 7, 18, 42, 53, -11, 79, -6, -35, 28, 53, -18, 32, -82, 33, 281, 404, 247, 41, -87, -151, -336, -97, 221, -457, -188, 416, -577, -104, 322, 405, -42, -407, 56, + -156, 543, 241, -374, -240, -58, -230, -470, -235, -209, -170, -381, 191, 67, 235, -145, -70, -335, -34, -291, 30, -194, 43, 101, -449, -148, -171, -119, 97, 96, -143, 442, -29, -116, -83, 42, -104, -37, 164, 140, 184, 242, 230, 18, 151, -74, 345, 368, -186, -97, 226, -7, -560, 25, -285, 173, 177, 316, -241, 135, -337, -33, 192, -83, 301, -79, -37, 60, 20, 42, -20, 17, 128, -95, -24, 123, -19, 96, -144, -125, 84, -20, 26, 13, -17, 22, -86, -23, -15, -38, -58, -20, 46, 55, -3, -310, + -375, -184, -363, -517, 366, 36, 205, -286, -298, -411, -278, 127, -305, -274, 373, -93, 18, 90, 213, -165, -126, 61, -101, 58, -19, -184, -352, -551, 182, -395, -363, 19, -96, -25, -204, 92, 105, -449, -10, -99, -176, -250, 142, 30, 449, 54, -252, -16, 41, 185, 77, 398, -35, -433, 185, -92, 195, -259, 56, 147, -765, -364, 270, -24, -82, 117, -39, 483, -17, 306, 266, -392, -455, 26, -505, -12, -25, 10, 73, 316, -11, -198, 181, 238, -222, 39, 71, 239, -117, 8, -119, 81, -7, 51, 79, 129, + 130, -4, -126, 5, 92, 29, 19, -115, 12, -115, -17, 62, -19, 113, 83, -5, 23, 91, -85, 161, -4, -71, 72, 261, 1073, -265, -720, -66, -315, 779, 61, 436, 237, -137, -345, -156, -376, -98, 526, -587, 25, -479, 130, 38, 234, 52, -228, -388, -450, -85, -442, -348, 57, 102, 329, -309, -640, -136, -222, 76, -301, -205, 93, -162, -255, -19, 28, -132, 626, -129, -102, 157, 164, -187, -78, 462, 389, 254, 488, 381, 1, 159, 278, -207, -193, 56, 200, 324, 134, 658, 73, 441, -124, -255, -164, 934, + 167, -122, -112, -336, -321, -232, -225, -269, 108, 215, -228, 73, 233, 115, -210, 43, 237, -59, 132, -118, -33, 53, -40, -27, -71, -151, -23, -137, 73, 115, 59, -114, 152, 99, -83, -100, -154, -46, -42, 41, -33, 72, 54, 13, -15, 3, -123, 51, 208, -944, -344, 466, -107, -485, -446, -156, 515, 268, -406, 223, -542, -229, -61, -363, -486, 409, 231, -441, -150, 939, 223, -420, -569, 8, 313, 51, 57, -658, -16, -75, -468, -276, -187, -379, -176, 109, 18, -400, -396, 51, 254, -7, 339, 563, -393, 349, + 266, 111, 79, 424, 135, 262, 178, 236, -77, -51, 486, 757, 128, -176, 95, -109, -284, 482, -233, -406, -640, -220, -746, 375, -303, -129, -41, -107, -267, -45, 300, -341, -28, 158, -96, -332, 169, 28, 95, -22, -37, -118, -11, -61, 180, 47, 51, 30, 60, 3, 93, 62, 160, -221, -24, 19, 149, -60, 124, -133, 48, 33, -27, -73, 130, -58, -8, 75, 25, 8, -177, -414, 352, 212, -63, 236, 174, 501, 386, -814, -271, 906, -714, -210, -433, 646, 287, 298, 125, 95, 258, 685, 326, -301, -6, 23, + -19, 272, 304, 38, 180, 173, -157, 213, 127, 424, -203, -406, -349, -271, 80, -35, 161, 184, 184, 374, -164, 80, -165, -290, -118, 32, -335, 429, 518, -562, 192, -389, 318, -63, 123, -42, -311, -75, 358, -279, -86, 64, -574, -219, 120, -444, -31, 712, 353, -48, -163, 568, 149, 409, -129, -183, 592, -201, 185, 79, 84, -122, -89, -109, -76, -199, -123, -139, 20, 128, -47, -280, -90, -39, 31, -9, -70, 1, 79, 137, -109, -3, -302, 51, -38, -57, 203, -4, -20, -120, 124, 34, 184, -63, -11, -124, + -14, 565, -46, -132, -470, 20, 45, -127, -10, -219, 83, -676, 617, -125, -218, -428, -483, -51, 589, -107, 163, -364, -210, -102, -354, -428, 391, -242, -196, 345, 337, -476, 166, 179, 412, 339, -124, -302, -190, -464, 509, 334, 169, 362, -376, 257, -55, 235, 262, -247, -19, 828, 695, -526, 210, 429, -331, 102, -774, 231, -419, 345, -243, -268, -189, 923, 53, -270, 82, 310, 41, 184, -499, -58, 831, -28, -327, -509, 16, -377, 235, 239, 290, -520, -542, -145, 91, 177, 56, 2, 13, 197, -133, -54, -41, -88, + 97, 82, -166, -115, -255, 155, -94, 67, 111, 163, 130, 55, 256, 15, -60, 122, -190, 105, 73, 51, 169, 180, 33, -26, 107, 11, -17, -201, -262, -50, -21, -33, -512, -27, -61, 149, -742, -344, -416, 351, -176, 522, 318, 665, -329, -28, -521, 443, 809, -252, -640, 62, -130, 990, -242, -389, 379, 207, 160, 372, 129, -1245, 6, -84, 488, 873, -824, 32, 250, -396, -78, -1129, -254, 575, -927, -556, -283, -364, 372, -226, -329, 497, 153, 181, 515, 56, -175, 364, 540, -524, -388, 800, 552, 185, 256, 189, + -358, -520, 1, 6, -105, 163, -313, 223, -434, 177, 1020, -475, -390, 560, 163, -191, 356, 492, 368, 435, 218, -221, 182, -537, 289, 121, 154, -273, -79, 57, -23, -55, -80, 176, 347, -135, -331, 211, 401, 208, 159, -473, 288, 30, 157, -76, -160, -38, 243, 22, -43, -204, -15, -119, -57, -94, 109, 227, -135, 8, 145, -57, -23, -125, 24, -84, -91, 295, 267, 435, -1007, -1860, -857, -130, 634, 45, 699, 645, -195, 105, -158, -354, -582, -339, -420, -245, 664, -863, -150, -719, -891, -156, -899, -724, 89, -189, + -104, 164, 789, 55, -572, 32, -69, -172, -744, -49, 887, 82, -15, 359, 689, 464, 121, -281, 240, -236, -632, -1159, 1102, -139, 918, -77, 12, -330, -530, 967, -549, -446, -46, -704, -661, 550, 404, 212, -70, 280, -489, 190, -397, -561, -611, -477, -196, 474, 31, 170, -283, 168, -370, 270, 210, 192, -120, -15, 239, -65, -288, -217, -285, -24, -210, -49, -74, -76, 85, 35, -113, 50, 151, -39, -95, -224, -1, -153, -20, -24, -106, 262, -245, -229, -108, 140, -216, -218, 32, -182, 0, -31, 103, -22, 35, -146, + 61, -305, -154, -45, -647, -473, -717, -7, -686, -796, -135, -364, -875, -1211, 137, -458, 223, -87, 454, 1021, 52, 106, -518, -554, 462, 258, -375, 2, 301, -690, -531, -37, 875, -752, 10, 19, 403, -642, 670, 353, 190, -17, -280, -746, -8, -178, 270, -404, -992, 818, -598, -265, -42, 800, -608, 281, -500, 311, -181, -733, 351, -935, -207, -267, 326, 768, -444, 285, 777, -621, 102, 190, 182, 231, -1135, -338, -192, 410, 86, 0, 207, -198, 453, -81, 103, -435, 378, 99, -700, -317, 329, 414, -59, -103, -274, 388, + 48, 9, -727, 121, -350, -548, -167, -108, -71, -321, -418, 153, -96, -202, 120, -39, -60, 28, -112, 43, 225, -421, 43, 83, -140, 309, 284, 327, 130, 199, -204, 89, 11, 97, -93, 8, -6, 140, -83, -186, 1336, 129, 568, 1519, -707, -407, -592, -229, 709, 40, 872, 227, -26, -329, 660, -414, 154, -279, 275, -438, 504, -249, -112, -291, 388, 257, -418, -107, 408, 116, -267, 21, -344, -1152, 501, -608, -877, 539, 246, 583, -51, -580, -211, -160, 346, 452, 512, 843, 841, -377, 119, -892, 12, -651, -1149, -119, + -936, 299, -747, -500, -494, -709, 72, -173, 62, -215, -86, -67, -1216, 189, 188, 273, 588, -116, -967, 556, -625, 358, 360, 787, -427, -398, -258, -158, -560, 221, 132, 67, -132, 195, -279, 281, -45, 56, 87, -351, 0, 133, 346, -93, -205, 148, 241, 293, -182, 0, 167, -22, -30, -111, -217, 153, -2, 97, -120, -18, 203, -134, -204, -119, 34, -88, -360, 581, -146, -120, 52, 111, -96, 107, 142, -57, -14, -80, -117, 951, 1779, -977, -789, -1379, -2804, -695, -294, 626, 379, -244, -541, 766, 937, 80, -45, 4, + -740, -438, -525, -404, -782, -12, -198, -96, 536, -736, 588, 551, -172, 283, -32, -1309, -932, -521, -476, -221, 103, 503, 163, 270, 1263, 1148, 260, -855, -444, -39, -439, -811, -2020, -1699, -764, -183, 83, 440, -1400, -808, 726, 841, 1011, -924, -1120, 363, -683, 1660, -838, -97, -493, -268, 229, 490, -246, -659, 610, 591, -135, 677, 603, -1318, 1178, -765, 3, -226, -787, -222, 398, 295, -64, 152, -480, 10, 241, 324, 514, -387, 78, -112, -209, -548, -67, -528, 464, -87, -560, 87, -641, -45, 77, -151, -278, 17, 51, 66, + 208, -41, -10, 371, 121, -378, -432, 116, -287, -612, -211, -576, 188, 179, 450, 61, -463, -333, 330, 1672, -557, 539, -23, -745, 116, -1504, -338, 323, 30, -876, 519, 1533, 1077, -475, -959, -409, 109, 1610, 217, 40, 7, 744, 766, 199, 586, 474, 900, -257, 103, 574, -524, -799, 449, 1321, 287, 640, 62, 393, -1769, 327, -69, 399, 1736, 699, 235, -173, 778, -179, -364, 274, 484, 1019, -328, 633, 116, 175, 402, 515, -15, -676, -419, 157, 1308, 895, 696, 753, 632, -182, -1620, -1165, -2223, -32, 678, 1279, 200, -935, + 309, -579, 186, 440, 134, -272, -150, 3, -125, 356, -245, -647, 13, 213, 288, -419, -189, -779, 193, 336, -299, -270, 195, -155, -192, -171, -604, -132, 624, 388, 565, -307, -638, -476, 415, 323, -150, -31, -38, 113, -179, 371, -425, -244, 30, 67, 246, -531, 109, -391, 1029, -306, 225, -339, -637, -266, 1366, -56, -640, 156, -124, -520, -423, 76, 719, 1963, 877, 1740, 905, 773, 731, -518, -438, -496, 212, 1425, 453, -1192, 508, -1282, 635, -813, -179, -714, -772, -38, 92, -13, -965, 1247, -260, 468, -1219, 323, -288, -375, + 623, -517, 1252, 147, -503, 63, -380, -517, 348, -854, -190, 1069, -240, 436, -65, -778, 843, -460, -1773, 218, 126, -9, 187, -245, -351, -100, 792, -1520, 890, -360, -219, 998, -623, 292, 362, 1450, 498, 640, -110, 866, -700, 686, 105, -267, 177, 40, 21, -376, -104, 65, -167, -282, 582, 8, -50, -176, 189, -233, 518, 304, 275, 63, -10, -52, 433, -355, -460, 172, 223, -24, 388, -172, -86, 18, -142, -441, -446, -44, 140, -221, 69, 138, 150, -121, -17, -416, -738, 1211, 1128, 3930, 1589, -2141, -1005, -1049, -1645, 1147, + 3537, 1416, 673, -887, -242, -59, -40, 1698, 1165, 741, 2556, -3058, 201, 1599, -385, 329, 1677, 294, -476, 904, -1683, -3381, -321, 333, -1309, -148, 1815, 306, 109, 690, -1429, -2916, -2662, -1212, 884, 1735, 3844, 966, -488, -482, -1038, -2295, -695, 1680, 1693, 1773, 1731, 1086, 903, 261, 396, -1474, -903, 220, 415, 756, 929, 2281, 600, 1328, -872, -862, -1546, -337, -1183, -283, 2382, 3056, 68, -124, -1901, -2193, -1234, -522, 1220, 648, -132, 452, -168, -314, -573, -543, -72, 138, 113, 671, -48, -15, -344, 11, -428, -145, 1, -632, -284, 13, + -173, -45, 369, 327, 771, -339, -140, -781, -632, -480, 796, 505, 250, 264, -248, -694, -560, 24, -395, 678, 1008, -39, -260, -2791, -1740, 1019, 2630, 3085, 6389, 3915, 2640, 2353, 1812, -305, -2784, -3025, -5904, -6255, -5951, -3786, -1335, 1332, 2271, 3811, 3723, 2632, 2578, 3319, 3164, 2859, 1796, 1268, 1098, -101, -203, -3650, -2619, -3266, -3977, -1657, -3884, -3117, -5719, -4986, -3552, -2356, -361, 2983, 3590, 3044, 3231, 3011, 5551, 7250, 6460, 6427, 5652, 5476, 4054, 4072, 863, -2726, -5706, -5438, -8162, -6791, -9911, -11786, -10493, -9948, -6003, -4163, 759, 1994, 4656, 6946, + 10682, 9271, 13360, 11558, 8265, 8147, 3698, 283, -745, -2880, -5058, -6024, -7219, -6238, -5668, -5450, -4443, -4559, -3760, -3291, -1009, -689, 908, 2145, 2446, 3209, 4541, 5513, 5860, 6153, 4506, 3748, 3616, 1358, 884, -2025, -4887, -6488, -6656, -7427, -4729, -5374, -3597, -2577, -720, 1305, 2538, 3880, 4008, 6058, 6205, 5983, 5059, 4560, 1807, 481, -1133, -2548, -4895, -5739, -4777, -3213, -2852, -1964, -1808, -919, -129, 248, 158, 846, 903, 1461, 1211, 1151, 1010, 1213, 860, 889, 912, 1062, 732, 692, 323, 312, 282, 274 } + }, + { + {-158, -423, -36, -68, -58, 6, -71, 26, 41, 173, -59, -7, -160, 12, 161, 11, 116, -34, 49, -67, -101, 3, 110, -14, -138, -6, 134, 44, -57, -48, -6, -18, -31, 2, -23, -46, -6, 28, 19, -6, -105, 157, 214, 7, 25, -86, -49, 17, -112, -124, 74, -100, 73, 95, 94, 36, -14, 26, 20, 72, -153, 14, -20, -111, -151, 5, 75, -57, -8, -17, -11, 107, 53, 15, 42, -34, -125, 49, 20, 107, -128, -96, 72, -56, -27, -94, 22, -55, -52, 2, -42, -44, 12, -24, -11, -51, + 32, -5, 3, -13, 26, -4, 8, -8, -8, -387, -91, 151, -23, -119, 49, -287, -113, -41, -54, -148, -159, 85, 128, 113, -149, -216, 22, -126, -233, 53, -17, 66, 258, -85, -30, -164, 222, 18, 110, 78, 182, 94, 55, -182, -23, -168, -48, 8, -73, 57, 46, -79, -158, 100, 161, 46, -80, -120, -77, 39, -138, -171, -51, 85, -49, 42, 106, 69, -82, 157, 12, 134, -113, -94, -56, -65, 91, -52, 4, 158, 55, 4, -151, 41, -61, 111, 160, -27, 12, -73, 60, 142, -52, 89, 39, 19, + 72, 29, 2, 59, 21, -4, -1, 26, 23, -26, 19, 20, 29, -79, 100, 138, 56, -86, 60, -40, 42, 259, 160, -219, 148, -120, -60, -31, 4, 111, 4, 304, 88, -116, -77, -75, 213, 51, 205, 68, 138, 215, 246, 94, -28, -24, 37, -197, -184, 59, -139, 79, 38, -47, -21, 58, 205, -67, -70, -105, 262, -35, -328, -163, -130, -119, 135, 130, 114, 171, 76, 107, -5, -10, -5, 172, 56, 101, -228, 15, 10, 12, 15, 99, 69, 29, -111, -110, 64, 53, -33, -7, -89, -113, -93, 63, + 109, 14, 6, 38, -32, -4, -25, 20, 19, 12, -15, 33, 52, -8, 5, 12, -9, 14, -22, 39, 0, -7, -25, 34, -66, 37, 11, 28, -5, 575, 127, 88, -69, -40, 57, 40, 155, 203, -8, 299, 121, -106, -97, -8, 145, -17, -77, 158, 24, 432, 114, 85, 19, -42, 22, 65, 85, -20, 2, 231, 34, 255, -126, -122, 86, 383, 113, 92, -31, -166, -63, 52, 13, -4, 16, -235, 18, -103, 96, 74, -91, 54, 84, 55, -108, -113, 29, 40, 2, -146, 40, -57, 95, -14, 20, 59, + -20, 33, -50, 16, 338, 38, 121, 4, -90, 55, 22, 104, -185, -130, 66, -27, 41, -49, 73, 60, 10, -83, -29, -113, -18, -26, 75, -52, -11, 12, -7, -27, -25, 21, -26, -38, 2, 1, 23, -76, -27, 19, 14, -83, -17, -6, -104, -12, 85, -127, -22, 129, -65, -200, -1, 330, -23, 259, 133, 359, 43, 34, 130, -101, -214, -281, 66, -143, 331, 189, 233, -44, -98, 30, 52, 110, 309, 38, 128, -141, 98, -100, 42, -54, 101, 178, 23, 170, 61, 85, -50, -41, 226, -53, -58, 171, + -103, -9, 23, -74, -100, 76, -115, -21, -146, -309, -36, -47, -10, -322, -125, -98, -85, 121, 316, -81, 100, 166, -48, 31, 26, 19, -118, 127, -149, 38, 104, 298, 91, 88, 25, -4, 88, -108, -3, 61, 27, 5, -123, 72, 85, 88, -19, 66, 33, 18, 57, 34, 4, 34, -11, 26, 14, 22, 32, 43, 48, 35, 31, 38, -26, 35, -419, 37, 224, 119, -235, -17, 10, 56, 85, -13, -184, -175, 26, 297, 140, 176, 298, -202, 212, 394, -37, 89, -225, 77, 79, -191, -105, -41, 89, -193, + -257, 49, 26, -219, 15, 70, -47, 467, -29, -331, -25, 115, 260, 97, 115, -212, 56, 67, -192, -12, -35, 325, 195, -53, -115, -251, 105, 101, -152, -5, 56, 99, 97, -127, -7, -28, 300, -255, 27, -66, 270, -19, -71, -115, 30, -119, -284, 8, 208, 64, 129, 33, -105, -40, -55, 181, 67, -49, -11, 164, 118, -46, 13, 26, 31, -3, 61, 46, 35, 4, -28, -10, 8, -24, 3, -33, -16, 27, 159, 145, 51, -106, 29, 69, 490, 325, 243, 345, 139, -30, 48, 128, -349, 178, 4, 192, + -142, -71, -226, 63, 394, -387, -247, -412, 207, -94, 11, -188, 22, -70, -189, 71, 90, -293, -42, 52, -66, 153, -426, -206, 432, 43, -9, -44, 13, -222, -236, 13, -342, -80, 33, 90, -148, -35, 421, -28, 146, 313, -294, -103, 67, 73, 55, -91, -211, 239, -28, -224, 163, -41, 37, 62, -122, -74, -53, -92, -132, -158, -153, -194, -60, -82, -21, -25, -4, 25, -81, -63, 44, 53, 87, -5, -37, -113, -33, -131, -85, -17, 25, -9, 17, -33, -20, 99, 37, 69, -67, 18, 15, 27, -134, 11, + 39, 1, -812, -455, 370, -144, -171, 220, 196, -351, -468, -153, -166, -179, -29, -326, -231, 116, 15, -438, -478, -272, -129, -27, 249, -21, -177, 132, -397, 9, -16, 14, 142, 73, -288, -222, 177, 58, 652, 156, -213, 26, 24, 3, 175, 29, 75, -70, -140, 39, -371, -74, -160, -201, 46, -301, 350, -48, 148, 244, 77, 127, -13, -165, -3, -25, -196, 256, -104, 459, -11, -15, 25, -124, -247, 74, -193, -84, 276, -354, -340, 227, 224, 184, -287, 207, 92, 119, -4, 50, 62, 160, 75, 36, 126, -20, + -3, -103, -72, -20, 88, -111, 20, -16, -58, -43, 33, -142, -79, -107, -12, 41, 5, 98, -28, 103, 15, 36, 23, 79, -58, -56, 168, 602, -335, 285, 121, 212, -83, -331, 50, -88, -305, 621, -41, -175, -612, 376, 108, -9, -227, -268, 10, 631, 238, -26, -60, -273, -218, 181, 83, -214, -147, 219, 58, -11, 192, 290, 48, 383, 440, 263, -99, 94, 38, 70, 230, -327, 343, -26, -172, -265, 3, 222, 159, -313, 70, 243, 39, -227, -482, -443, 118, 192, 34, -173, -21, 349, -160, -268, -510, 51, + 101, -385, 145, 379, -172, 294, 104, -357, -261, 24, 365, -41, 383, -70, -132, 77, 196, 48, -64, -106, 66, 169, 141, 20, 227, 38, 163, 36, 223, 29, 138, -6, 110, 55, -54, -167, 14, -195, -26, -82, 30, -30, -7, -173, -16, 74, -82, 6, -20, 7, -11, -127, 18, 724, 484, 104, -141, -83, -97, -506, -198, -12, 324, -235, -124, -113, 10, 523, -406, -115, -18, 243, -82, -308, -503, 176, -346, -166, -215, -242, 78, -402, -189, 347, 531, 19, -326, -300, 490, -60, -260, 503, 19, 26, 25, -560, + 229, -211, 205, 181, -374, -46, -379, 143, -368, -68, 159, 206, -121, 123, -447, 304, -32, 206, 180, 123, -97, -99, 451, -315, 225, -81, -379, -236, -23, 398, -228, 184, 56, -129, 7, -454, 570, 344, -65, -160, 280, 116, -80, -151, 34, -102, 145, -35, 77, 230, 87, 181, 2, 61, 29, -40, 7, -22, 163, 59, 225, 33, -124, 159, -64, -10, 124, -123, -38, -67, -49, 96, 63, 48, 209, -67, -71, 285, 55, -189, -433, -24, -563, 97, 50, 276, -225, -54, 146, 122, 161, -381, 539, 382, 70, 283, + -127, -543, 128, -228, -254, 256, 624, 110, -172, -226, -501, 1, 23, 770, -303, -12, 23, -23, -464, -523, 415, 17, 236, -67, -593, -341, 48, -99, -125, -169, 388, -81, 252, -271, 541, -637, 316, 332, 198, 176, 160, 506, 260, -36, 108, 5, 499, 751, -86, 61, -221, 315, 504, -344, 106, -868, 568, 587, 391, 547, -249, -434, -31, -62, -129, -90, -261, -180, -97, -21, -146, 89, 159, 64, -245, 51, -136, -141, -91, 105, 95, -41, -61, -19, -42, 29, -237, 82, 35, 157, 34, -7, -7, 37, 134, 50, + -123, 102, 0, 18, -631, -94, -807, -415, 318, -331, -718, 66, -387, 17, 14, -461, -438, 197, 424, 127, -491, 235, -553, -195, -203, 172, -227, -104, 266, 45, -182, -394, 417, 403, 525, 68, -58, 18, 169, -41, 216, -238, 284, -112, 327, 261, 198, -96, 14, -509, 173, -129, 383, 69, -888, 135, 438, 588, -338, -463, 554, 250, 389, -694, 343, 866, 914, 57, 22, 519, -360, -481, 308, -532, 200, -249, -209, -119, -1145, -662, -557, 410, 156, 114, -406, -167, -307, -60, -165, 448, 107, -180, -399, -90, 259, -43, + -110, 78, 271, -98, -160, -79, -59, -20, 211, 210, 184, -188, 241, -14, 69, 274, -124, -126, 240, 429, -101, -143, -68, 50, -77, -299, 48, 214, 59, -301, -286, 132, 97, -19, -18, -55, -213, -145, -476, -912, 697, 73, 234, -118, 494, 13, -422, 327, 133, -149, -255, -199, 63, 120, 438, -249, 343, 110, 624, -895, -240, -141, 115, 366, 530, 121, -431, 291, 417, 352, -98, 123, 25, -147, -60, 26, 135, 49, 309, 51, -390, 364, -404, -515, 80, 373, -181, -133, 135, 182, 321, -183, 152, 726, -289, -770, + -998, -504, -676, 308, 587, 376, 144, 354, 208, 391, -334, 442, 230, 180, 460, 599, -186, -133, 164, -39, 539, 209, -82, 91, -656, -458, 91, -25, 117, 45, 138, -122, 346, -182, -211, -203, -344, -125, -68, 114, 93, -51, -296, -17, 99, 34, -119, 71, 5, 115, -124, 52, 25, 139, -65, 213, -131, -151, 46, -25, -110, 36, 148, 13, -22, 914, 87, 144, -190, 333, -1046, -460, -715, -736, 292, -642, 632, 721, 31, 157, -111, 133, -684, 282, 756, -430, -881, 118, -331, -279, -858, 150, 315, -2, -117, 277, + -490, -80, 318, -174, -434, 54, -217, 450, -297, -164, 420, 366, 776, 104, 187, -70, 208, 277, 479, -137, -16, -297, 632, -796, 856, 31, -341, 402, -311, -228, 787, -1135, 186, -239, 223, -440, 213, 452, -233, -41, -120, -187, -101, 839, -951, -324, 1599, -600, -705, 693, 414, 463, -402, 33, -399, -222, -63, -455, 100, 63, -119, 166, 147, -205, -388, -98, -32, 154, -343, -239, 9, -33, 87, 216, 509, -230, -11, -54, -53, 148, 58, -301, -228, 245, -196, 94, 63, -182, 71, -40, -309, -251, 152, 102, -46, -3, + 194, -454, -702, 69, -267, -237, -396, -495, 623, 269, 39, 293, 739, 437, -52, 151, 496, 635, -564, 263, 530, 232, 194, 733, 352, 153, -23, 330, -38, 373, 307, 169, -344, 648, -534, -66, 809, 802, -192, -711, 266, -10, 695, 1198, 266, -183, 83, -687, -83, -181, -149, 14, 610, -262, 267, 735, 123, -680, 448, -35, 285, 691, 971, -274, -260, -83, -772, -1128, 29, -513, -85, -622, -66, 20, 83, 462, -15, -322, -537, 391, -167, 335, 11, 623, 229, 230, 1, -194, 348, -267, -311, -93, -234, -90, 16, 25, + -85, 96, 135, 11, -37, 181, -158, -221, 133, 160, 30, -191, -232, -134, 183, 249, 31, -35, 274, 75, 129, 114, 195, 55, -38, -146, 77, 157, -326, 761, -1428, 785, -601, -1411, -416, -356, -48, -326, 173, -391, -872, -529, -260, -81, 102, -361, 354, 684, 27, -44, 190, 41, -126, -255, -141, 185, 206, -61, 196, 840, 234, -246, -831, -134, 592, -718, -335, -274, 11, -55, 456, -150, 57, 624, 225, 692, -95, -327, -147, -177, -177, 334, 39, 226, 424, -741, 112, -196, -458, -347, 726, 522, 29, -353, 149, 306, + 35, 212, -494, -1229, -567, -450, 454, 47, -53, -207, 92, -138, -385, -402, -206, 499, 380, -554, -690, -270, 53, 422, 175, -133, -182, -141, 103, -306, 51, -208, 22, 320, 344, 92, -171, 112, 250, -6, -47, 184, -244, 350, 317, 124, 0, -11, -29, 294, -108, -150, -169, -246, -239, 82, -84, 110, -64, 57, 190, -86, -170, -254, -65, 124, -176, 413, -564, 678, -54, -1072, 219, -517, -107, -77, -126, -683, 216, 36, 542, -1168, 20, 577, 70, -276, -591, -45, 340, 505, -418, -148, 273, 577, 527, -506, -103, -822, + 385, 419, 260, -233, -63, -222, -86, -273, 81, 603, -222, -235, -205, -339, 684, 589, -56, 828, -36, 296, -728, 601, 267, -817, -264, 941, 390, 257, 184, -439, -347, -470, 815, -419, 630, 654, -738, 1712, -365, 1063, 47, -238, -457, 800, 309, -616, -377, -1327, 532, -180, 612, -816, 915, -698, 271, -269, -209, 604, 57, 59, 335, 237, -153, 397, -48, 118, -275, 56, -37, -172, -276, 13, -307, 150, 133, -69, 266, -93, -160, -220, 157, 35, -37, -437, 199, -84, -530, -165, 152, -147, -274, 187, -149, 155, -279, 135, + -285, -46, -42, 158, -67, 32, -92, -94, 410, 703, 58, -590, 286, -1139, -302, -1035, -1432, 49, -550, 185, -105, -224, -544, -375, 322, 863, -718, -154, -1237, -1087, 301, 436, -678, -711, 46, 158, -1148, 62, 26, 598, -515, 23, 497, -323, -597, -670, -323, -611, -500, -638, 895, -1136, -703, 1027, -32, 290, -858, -150, -244, 23, 1449, -205, -27, 143, 679, 16, -639, -284, -461, 155, 1731, 336, -609, 1304, 943, -838, 973, 1595, 14, -624, 1087, -190, 1144, 1029, 87, -55, -307, 718, 585, 331, -610, -205, -394, 909, -115, -628, + -305, -631, -271, 620, 71, -331, -112, -404, -68, 554, -269, 134, -56, -535, 576, 67, 231, 276, -372, 112, 530, -98, 21, -288, -1, 39, -174, -164, 100, 389, -252, 151, -336, -164, 21, -116, 387, -153, 17, 33, 142, 9, -184, 805, -2045, -1235, -1328, -456, -883, 1101, 421, 903, -130, -1749, -262, 282, 1207, -51, 284, 1103, -408, -800, 87, -54, 1401, 907, -449, -633, 1487, 104, 747, 357, 1388, 1194, 927, 98, -773, -424, -590, 1156, -548, -788, -425, 43, -27, 512, -496, 185, -2344, 265, 370, 388, -977, -909, 286, 829, + -1008, 397, -571, -447, -675, -59, 727, -481, 798, -199, 316, -1460, -935, -34, 783, 547, -1059, -1145, -527, 111, 1224, 505, -111, -852, -981, -332, 213, 866, -69, 290, 583, -216, 215, -566, 361, 208, -345, -288, 39, 447, -417, -11, 712, 116, 111, 6, -192, -473, 131, -525, 634, 543, 416, 55, -41, -616, 403, -119, 738, -169, -813, -500, -92, 808, 236, -164, -70, -636, -299, -251, -27, 371, 361, -642, -347, -390, -378, -133, 135, -47, -209, -388, -392, 60, -8, -195, 362, 2649, 267, -1416, -3183, -289, 1886, 473, 823, -88, + 1147, -195, 504, -268, 650, 917, 489, -447, -1052, 1236, 1403, -317, -1391, -847, 144, 808, 268, 289, 50, 206, 92, 204, -274, -1610, -10, 995, 765, -317, 76, 613, 1341, 825, 657, -791, -554, -135, -147, -1200, 849, 506, 882, 1805, -929, -593, -84, -498, -434, -786, 1396, -845, -915, -937, -329, 1789, 456, 699, -39, -146, -414, 1115, 897, -455, -1045, 366, -137, 436, -979, -375, -570, -736, 451, 744, 137, 36, -395, 227, -155, 692, 54, -227, -136, 236, 438, 492, -282, 309, 157, 165, -23, -506, -68, -409, -167, 34, 70, 152, + 150, 183, 450, 675, 594, -43, -146, 88, -291, 378, -408, -36, 332, -6, -80, -650, 333, -649, 222, -135, 107, -44, 78, -17, -410, 245, 206, -21, 140, -10, 119, -41, -101, -7, -29, 34, -17, 33, 16, -111, -52, -8, 80, 39, -22, -39, -58, -46, -775, 78, 2021, 1574, 234, 129, -1115, -2118, -1872, -902, 1516, 1680, 1723, 970, -266, -1096, -1032, -662, 425, 685, 1175, 117, -914, -756, -178, -757, -368, 174, 1216, 1759, 1123, 548, 486, -1091, -142, -2201, -2480, -1540, -757, -672, 1143, 1815, 1993, 1818, 1558, 656, 94, -752, + -221, -1216, -2177, -174, 190, 216, 706, 433, 716, -2418, -1336, -861, -1415, -591, 1028, -615, 688, 101, -651, 520, -546, 584, 665, -512, -1052, -2145, -2094, -1551, 750, 271, -309, 405, 101, 10, -1005, -696, -1860, -610, -693, -72, 1339, 1446, 200, 748, -459, -999, -1808, -1183, -1122, -37, 539, 316, 437, 484, -343, 294, -324, 305, 65, -10, -77, 252, 210, 480, -120, -111, 437, 355, -3638, -1860, -969, 1225, 284, 4670, 4787, 3609, 4668, 4891, 4445, 3191, 2897, 3214, 1280, -192, -1989, -3075, -4247, -4127, -6150, -3733, -2427, -1929, -2740, -1443, -394, -2055, + -1594, -1686, -381, -1014, -360, -1372, -696, 813, 845, 249, -253, 887, 721, -2076, 432, 1400, 3071, 2250, 2924, 1197, 1163, 4866, 2637, 4978, 1668, 4667, 3225, 4074, 5499, 5205, 4224, 4739, 5269, 5731, 4899, 5651, 3860, 5733, 4608, 4085, 4361, 2378, 4882, 2360, 1435, -1798, 120, -2657, -2981, -4565, -5383, -8278, -8077, -7635, -7132, -6728, -5679, -6935, -8526, -8416, -6974, -7390, -6942, -6975, -5947, -6485, -6211, -4644, -5120, -3944, -3676, -3398, -2162, -2802, -638, -1048, 478, 638, 2034, 2999, 3153, 3631, 3233, 4861, 5519, 5457, 6316, 6584, 6533, 4971, 4448, 3893, 3620, 3513, 3619, 3391, + 2592, 1659, 1899, 1455, 1141, 748, -591, -782, -810, -1002, -1207, -1367, -953, -1056, -832, -857, -723, -534, -615, -520, -497, -606, -530, -594, -471, -430, -526, -592, -280, -195, -219, -221, -111, -59, 6 }, + {-235, -463, -82, 7, -107, -218, -72, 161, -257, -141, -85, -50, 81, -36, 90, 42, 79, -8, 98, -85, 16, -37, 18, 248, -53, -15, -123, 154, 95, 74, 191, -97, -56, 66, 171, -46, -12, -137, -152, -101, 108, -134, -116, -14, 154, -208, -45, -173, -85, -49, 24, -15, -125, 161, 27, 145, -58, -36, -179, -3, -63, -67, 103, 59, -32, 56, 114, -32, 49, -81, -47, -19, -77, 69, 24, 53, -123, 89, 51, 199, 118, -32, -126, -9, 27, 17, 39, -5, -43, 3, -29, 1, -35, 13, -34, -1, + 38, 14, 20, -24, -17, 19, 26, 13, -4, -381, -137, 110, -101, -45, -43, 52, -20, -100, 159, 143, 47, -17, 73, -196, -29, -193, -98, 144, -24, 26, -20, -22, 3, 299, 273, 123, 146, 174, -34, -19, -60, 153, -15, -57, 43, -88, 61, 111, -57, 125, 140, 274, -107, -129, 117, -70, 4, 58, -159, 10, -83, -93, 210, 124, 151, -86, -115, 81, -133, 94, 406, 23, 28, 92, 39, 38, 231, -123, -32, 43, 30, -115, -85, -117, -56, -43, 106, -18, 107, 110, -110, -117, -31, 75, 103, -123, + -24, -36, -85, -10, -80, 21, -6, 43, -25, 17, -31, -8, -24, -112, 121, 194, -93, 96, 306, 102, 70, -215, 178, 46, -276, 117, -77, -166, 67, -23, 64, 160, -168, -177, -79, 240, 7, 119, 249, -371, -298, 48, 182, -134, 12, 247, 64, -32, -74, 295, 36, -72, 42, -269, 31, -148, 137, 24, 145, -74, -36, 65, 5, 19, 9, 139, 112, -153, 88, 123, -210, 25, -94, 39, -48, -162, 3, 139, 122, 269, -167, 209, -138, -28, 124, -136, -201, -73, 10, -13, -10, -22, 40, 86, -117, -2, + 56, -11, 48, -96, -55, -38, -70, 20, -15, -56, 31, 31, -46, -71, -3, -17, 73, -4, -12, 13, 16, -13, -22, 49, 17, -40, -20, -30, 5, 616, 276, 373, -30, -103, -135, -135, 73, -113, 172, -20, 236, 14, 125, 155, 120, 102, 136, -458, -135, -43, -97, -85, -144, -326, 15, 223, -138, 134, -110, -163, -123, 18, -104, -39, -106, -8, 269, 14, 121, 170, 222, -104, 52, -50, -171, 194, -109, -8, -169, 123, -2, 3, -47, -79, 57, 173, -73, 97, 92, 77, 298, -300, -127, 7, -165, -214, + -85, -262, 39, 307, -212, -102, -242, 15, -77, -116, -284, 166, 218, 86, 152, -78, 24, -58, 63, 2, 150, -40, 65, -4, -39, 52, 36, 68, 58, -11, 14, 37, 15, 29, -3, -30, -55, 26, 14, -38, 26, 29, -10, 12, 35, -12, -33, -12, 191, 273, -151, 142, -123, -60, -49, -339, 246, -72, -36, 391, 243, 261, -106, 9, 47, -61, 87, -200, -5, -137, 160, -156, -107, -17, 27, -192, 37, 20, 252, 1, -344, 197, 186, 264, -42, 66, -190, -144, -60, -140, 55, 36, -52, -22, 144, 223, + -307, -67, 0, -127, -131, 202, -163, 76, -160, -213, -158, -106, 73, 29, 379, -65, -102, 112, -114, -34, -101, 105, -94, 136, -68, -64, 94, 227, 63, -215, 1, -106, -217, 61, 154, -52, 36, 53, 8, -24, 79, 1, -88, 0, -32, -17, -46, 71, -17, -60, -63, 8, 67, -31, -4, -90, 8, 15, 30, -17, -75, -40, 66, -28, -81, 32, -471, 453, 243, -270, -273, 112, 360, -5, 105, 419, 141, 126, -71, 219, 200, 230, -415, -255, -252, 199, 171, 219, 10, -253, 104, -38, 115, -364, 141, 220, + -171, 95, 178, 50, -5, 38, -57, 319, 217, 171, 6, 111, 246, -220, -118, 11, 325, 208, 128, -245, 9, 167, 194, -68, 60, 190, 235, 74, 217, 86, -24, -200, -1, -334, -137, -160, 28, 110, -193, -78, -353, 154, -98, -3, 188, 273, 330, 41, -34, -205, -61, 105, 113, -217, 69, -98, 80, 15, -73, 1, 39, -69, 31, -18, -82, -42, -51, 52, 64, -11, -47, 34, -36, -26, -64, -9, -13, -74, 62, 399, 125, -68, -181, -473, -229, 290, -101, -435, -116, -69, 67, 241, 368, -21, 109, -84, + 184, -205, -218, -235, -417, 224, 128, -348, 11, -254, -97, 226, 128, 184, -51, -48, -59, 397, 310, 328, -148, -279, 222, -37, -99, 283, 51, 278, -8, 156, -194, -10, 141, -595, -89, 29, -435, 113, -110, 407, 260, -249, 21, 371, -38, 189, -124, 255, -118, 51, -98, 6, 180, -242, 262, 134, 151, 43, 348, -136, -396, 69, 276, -131, -246, -178, -125, 285, 7, -122, 13, 7, -54, -55, 19, 55, -31, -37, -20, 61, -31, -107, 31, -119, 110, 70, 0, -12, 30, -35, 49, 4, 34, 6, 16, 126, + 45, -66, -959, -203, 514, -415, -150, 437, 165, -138, 46, -362, 323, -41, -584, 42, -31, 221, 217, -116, -457, -196, -174, 10, -244, -133, -311, -89, 339, -278, -140, -106, -181, -190, -259, 177, 36, 221, 39, -162, -251, -248, -51, 166, 244, -86, -222, 234, 97, -349, -389, -794, -70, -253, -153, 118, 121, 73, 357, -37, -170, -21, -183, 407, 216, -78, 217, -228, 114, 94, -223, -97, -200, 144, 101, -369, 244, 374, -24, -17, -378, -146, 167, -117, 110, 371, -123, 82, 38, 30, -117, 23, -19, -154, -93, -13, + 55, 10, 44, -160, 20, -85, 41, -92, -90, -54, -5, 21, -69, 22, 40, -9, 17, 70, 39, -127, -84, -39, 14, 49, -20, 50, 171, 636, -297, 242, -155, -2, 365, -105, -162, -86, -34, 64, 248, 839, -46, 51, 233, 54, 4, -392, -408, 63, 56, -256, -130, -59, 233, -103, 46, -5, 102, -105, 490, 272, -228, 269, 244, -296, 52, 126, 98, -83, -100, 408, -357, 151, 452, -157, 57, 289, -31, 251, 139, 4, 138, 215, 297, 186, 24, -11, -204, -227, 9, 25, -711, 464, -109, -221, -247, -522, + -589, -384, 72, 291, -107, 35, -47, 289, -108, -236, 134, 69, -97, 35, 198, -192, 39, -244, -81, -110, 59, -30, 125, 76, 27, -36, 64, 84, -2, -178, 99, -10, 151, 142, 72, -74, 131, 27, -20, -7, 8, -120, 131, -14, -86, 123, 251, -52, -53, 126, -51, -93, -33, 861, 865, -25, -715, 139, 147, -83, 188, 107, 63, -8, -120, 699, 130, -113, -778, -438, 185, -49, -270, -467, 67, 79, 121, -117, -510, -546, 593, 560, 176, 514, -438, 60, 232, -93, -277, -502, -246, 88, -19, -236, 244, 4, + 237, 191, 15, -540, -312, -254, -41, 55, 73, -92, -151, 37, 89, -482, -119, 79, 111, -219, -601, -141, -149, 445, -15, 200, -200, -153, -268, -302, -175, 49, -21, 374, -220, 65, 435, -30, 218, 193, 422, 93, -120, -215, -187, -74, 256, 39, 258, 136, -18, -7, 15, 21, -112, -143, 3, -35, -11, 41, -25, 32, -164, -39, 105, -6, 67, -285, -29, -12, -53, 58, 47, 36, 52, 65, -131, 156, -100, 375, -193, 66, -145, 29, 99, -236, -160, -421, -466, -306, -120, -21, 12, -258, -239, -483, 233, -484, + -623, 402, -373, -475, 443, 84, -100, 475, 274, -369, 341, -941, -63, -242, -100, -442, 775, 363, -227, 114, 244, -162, 270, 4, 12, -221, 262, 302, 408, -639, -22, -4, 189, -289, -110, -294, -289, 507, 164, -380, 196, -235, -249, -408, -741, 194, 491, 33, 494, 671, -40, -275, -636, 50, -81, 41, -158, 131, -279, 601, 333, 525, 107, -65, -159, 214, 248, 112, -45, -75, 24, 283, -49, 119, -178, 77, -294, 29, 37, -130, 278, 161, -71, -183, -160, -53, -15, 89, -187, 49, 34, -14, -129, 49, -280, -57, + -66, -78, 48, -5, -537, 72, -1198, -805, -577, 312, 594, -848, 197, 601, 371, -9, 220, 567, -260, -34, -165, 17, -368, 262, 5, 31, 97, 760, -38, -335, -326, 181, 559, -226, -566, 168, 567, 331, -77, 276, 186, 266, 59, 225, 385, -48, -649, 33, 200, -609, -444, 595, 467, -460, -301, 145, -31, 292, 724, -156, -140, 138, -37, 268, 134, -264, -207, -100, 212, 193, -193, -524, -93, -789, 747, 126, -137, 71, 310, -16, -347, 129, -151, -225, 176, -47, -343, -565, -184, -230, 466, -74, 154, 89, 57, -44, + -40, 73, -125, 20, 169, -20, -88, -50, -385, -119, -10, -72, -281, -252, -106, -57, -25, -82, -15, 5, 211, 75, -35, -85, 33, -76, -64, 137, -69, -163, -48, -123, 15, -151, 5, 101, 32, -145, -49, -463, -20, 80, -568, -149, 426, 555, 393, 1036, 625, 939, 350, 248, -486, 527, -178, -59, -389, -259, 509, -167, 1154, 537, 333, -62, 266, -182, -539, -272, -335, 243, -316, -7, -338, 197, 469, 424, -28, 613, 512, 24, -179, -235, -421, -145, 967, 375, 1113, -359, 5, -38, 259, 893, 306, 21, 573, 657, + 694, -63, -411, -151, -114, -119, 460, 314, 437, 667, -417, 1009, -678, -1273, -197, -398, 259, 613, 300, -345, -36, -374, -280, -186, 4, 507, 85, -145, 79, 37, 152, 161, 110, 197, 53, 123, 45, 137, 8, -411, -159, -6, -383, 40, -400, -212, -243, -226, -190, -141, -54, 21, 114, 419, 57, -269, 121, 22, 379, -74, 163, -6, 4, -207, 47, 602, 979, -488, -386, 352, -295, -54, -140, 131, 426, 461, 678, -749, 837, -305, 69, -390, 342, 636, 251, 116, 34, 774, 180, -28, -268, -121, -809, -110, -400, -961, + 69, -60, 379, -1001, -209, 232, 356, 829, -243, 240, 440, 66, -130, 233, -236, -60, -1264, 107, -547, -628, -712, 279, -1133, 366, -433, -565, -775, 685, 734, 730, 143, 131, 688, -966, -95, -301, 390, -1148, -394, -122, 367, 287, 236, 459, -428, 165, -517, -156, -310, -125, -105, 10, -489, 220, 308, -57, 22, -244, -75, 232, -315, -10, 156, -394, 180, -354, 5, 216, 53, -291, -188, 108, -159, 175, 126, 202, -25, -256, 482, -232, -114, -314, 216, -109, 32, -291, 41, -353, -53, 253, -79, -152, -365, 39, 52, -52, + -480, -906, -15, -325, 1071, 221, 758, -251, 1035, -653, -1217, 272, 207, 136, -605, -693, -540, 200, -544, 237, -288, 809, -264, -125, 586, 16, -1456, -608, -19, 957, -110, -304, -834, 143, -205, -721, -851, -101, 157, -295, -323, -855, 559, -214, 202, -427, 20, 251, 156, 751, 9, -261, -977, -347, 474, -672, -340, 246, 539, 418, 1074, 816, 17, 619, 638, 215, 27, 371, -316, 1618, -743, -1770, 472, -1507, -56, -1180, -6, 1442, 183, -688, 231, 245, -447, -369, -505, 110, -151, 461, -362, 308, -608, 171, -18, -100, -136, 418, + 803, 250, 328, 554, 172, -553, 165, -205, 374, -115, -169, -21, -34, -148, -452, -298, -197, -24, 70, -32, -284, -650, -402, 99, -109, -10, -243, 89, 477, 678, -1027, -682, -425, -360, 413, 642, -378, 43, 572, -1159, 86, 272, -875, 454, -291, 400, 150, 451, 49, -566, 587, -738, -161, 1430, -587, 524, -340, 589, 536, -187, -627, 667, 1732, -949, 246, -1259, 637, 384, -683, 757, 71, -1513, 217, 75, 691, -185, -108, -795, -775, -397, 1889, -288, 958, -842, 630, 310, -176, -647, -122, 534, 1060, -384, -359, -112, 206, 925, + -238, -218, -690, 212, -1037, -460, 735, 895, 97, -73, -489, -794, -2312, 1441, 543, 828, 77, -749, 821, -463, 344, 493, 474, 1112, -26, 261, 302, -123, -491, -160, 807, 502, -461, -98, -315, -78, 374, 114, -539, -342, 505, 121, -167, 267, -456, -272, -99, 225, 354, 236, 63, 286, -235, -298, 48, -27, -411, 52, -424, -13, -262, -58, 59, -212, -407, 139, -971, 678, 664, -1316, 124, -691, 82, -1449, 1453, 1267, -134, -661, -234, -265, 703, -725, 908, -1212, -707, 346, 425, 99, 410, 1154, 327, 533, 137, 553, 388, -259, + 110, 469, -38, -39, 915, 414, 1203, -110, 683, 2, -891, 906, -474, -101, 272, -839, -575, 326, 1309, 720, 468, -1696, -403, -1189, -20, 1902, 1242, 1439, 104, -1395, 425, 1416, 287, -354, 1250, 136, 833, -2171, -1812, 1296, -104, -584, -1392, -300, -529, 592, 537, 648, 653, -273, 196, 1201, 1097, 1160, 84, 1665, 818, -294, -672, 11, -337, 100, 833, -133, 24, 617, 666, 66, -10, 264, 739, 266, 339, 513, 169, 400, -34, -224, -113, -85, 17, 531, -218, 95, -449, 642, 295, 281, -23, 324, -15, 1099, 266, 1129, -321, 988, + 437, 146, 414, 425, 465, -129, -106, 673, 216, 566, -1257, 741, 988, 75, 336, -896, 698, -408, 333, 31, 0, 591, -186, 384, -127, -721, 189, -51, 801, 701, 996, 331, -769, -633, 644, 726, 333, 62, 226, -201, -632, 104, -237, 884, 615, 538, 698, 719, -1002, 1094, 1073, 787, -542, -481, -700, 952, 553, 1566, -963, -951, -739, -1393, -369, 1495, 231, 1172, -1264, -1348, 285, 847, -1182, 178, -944, 367, -1088, -92, 504, 536, -991, 381, -757, -1496, -59, 1756, 904, 706, -502, -1270, 1907, 1541, 426, -1731, -76, -414, 1217, 616, + 750, -905, 662, -412, 430, -630, 209, -704, 991, -210, 154, -1209, 336, 137, -67, -282, 232, 112, 113, -756, 300, 740, 36, 438, 373, 300, 38, 132, 4, 23, 21, -254, -39, 218, -17, 455, 389, -236, -55, 198, 81, 345, -705, -22, -2415, -496, -48, 28, 860, -2259, -244, 1020, -1652, 373, -366, 1938, 1041, -1191, 306, 1302, 147, -525, 444, 308, 185, -31, -116, 94, 227, 441, 1357, 1068, 1188, 794, 1492, 711, 1526, 613, 1355, 8, 847, 739, 839, 621, -48, 235, -1018, -627, 1975, 12, -772, -232, 628, 1021, 2123, -298, + -1150, -598, -845, 1189, 1386, 1526, 489, -70, 1053, -1784, 1622, 597, -839, -30, -2745, 51, -1811, -2542, -619, -1501, -635, 2849, 2624, 2442, -1924, -213, -211, 1917, 3037, -690, -844, 1662, 1732, 1466, -167, -254, -828, -1069, 162, -403, 473, 712, 641, 423, 52, 268, 818, 122, 12, -246, 53, 39, 227, 150, 172, 823, -67, -516, 519, 592, 148, 956, 235, 453, 1068, 1405, 1045, 743, 312, 126, 419, 958, 433, 983, 745, 462, 701, 239, 951, 809, 675, 1007, 588, 171, 284, -673, 1737, 2106, -1745, -1604, 541, 1842, 48, -866, 8, 499, + 555, -1528, 569, -205, 807, -840, -402, -983, 1038, -143, -457, -919, 674, 395, -158, -777, 364, 341, 184, -687, -97, -37, 794, -599, -144, -876, -228, 300, 697, -911, -346, 967, 831, -257, -586, -6, -299, 808, -462, -257, 392, 293, 495, -445, 140, -613, 707, 835, 397, 129, -654, 742, -526, 1149, -841, 924, -1450, 980, 123, -84, -1021, -303, 332, -259, 99, -250, 288, -125, 322, -315, -438, -275, 306, 26, -39, -73, -243, 154, 358, -182, -47, 27, 47, -14, 62, -59, 258, 13, 335, -301, 54, -135, 338, -361, 333, -372, + 221, 120, 421, -92, 398, -361, -302, -51, 648, -308, 497, -170, 62, 83, 348, -144, 171, 81, -9, -11, 109, -24, -242, 474, -290, 94, -238, 168, -229, 261, -338, 391, -319, 339, -422, 383, -520, 500, -338, 370, -388, 390, -389, 400, -374, 381, -437, -56, -376, 1681, 1789, -1053, -624, 355, 1710, 1062, 637, 613, -272, -716, -217, 402, -6, -169, 510, 9, 360, 44, -191, -641, -170, -38, 47, -25, -521, 581, 97, -234, -13, -18, 8, 375, 689, 294, 70, -248, -357, -93, 224, 462, 623, -348, -343, 78, 629, 284, + 140, -285, -571, 487, -101, 13, 33, 157, 150, -69, -21, -372, 57, 328, -156, 196, -110, -265, 168, -51, 91, -21, 285, 193, -426, 125, 20, -773, -1027, 29, 60, 233, 625, 68, -276, -270, 246, 268, 407, 277, 17, 118, -44, -310, -129, 47, -425, -407, 261, 278, -7, 312, -444, -81, -21, 22, -138, 70, 239, 332, 162, 280, -178, -349, 203, 32, -86, -594, -2219, 942, 3422, 3156, 2694, 1075, -2557, -1601, -2299, -2577, -2304, -671, 498, 1942, 2024, 2423, 1605, 1618, 40, -1703, -1625, -2004, -1567, -873, -58, -562, 609, 750, + 1217, 1336, 1358, 808, 69, 359, -298, 192, -929, -676, -859, -1406, -1115, -855, -603, -1000, 140, 1705, 1928, 1075, 2016, 498, 1176, 604, 346, -507, -1075, -1474, -2069, -1588, -2360, -979, -1050, 676, 679, 1973, 2276, 2026, 1806, 1764, 1105, 134, -618, -1890, -1185, -2470, -2104, -2929, -473, -264, 722, 925, 1668, 1960, 1641, 1464, 1087, 639, 91, -546, -784, -1058, -1631, -1148, -1420, -990, -507, -149, 322, 312, 1560, 1436, 1426, 1110, 816, 95, 507, -568, -937, -732, -2029, -2366, -456, -161, -102, 1150, 943, 1254, 880, 1145, 350, 294, -89, -489, -626, -812, + -897, -555, -117, -704, -370, 557, 798, 532, 690, 467, 340, 85, -62, -241, -333, -257, -406, -213, -72, -146, -198, 33, 136, 17, 195, 234, 162, 96, 91, 25, -27, -102, -49, -72, 2 } }, + { + {-158, -161, -133, 37, -76, -12, -22, 77, 309, -83, 31, -294, -161, 90, -140, -109, -41, -124, -33, 256, -110, -164, 277, 222, -78, -51, 253, 72, 98, 49, 12, -65, -107, 100, -80, 75, 27, 29, -35, -87, -68, 62, -79, -124, -56, -56, -158, 179, 277, -159, 90, 8, -62, 44, -7, 2, -93, 171, -101, -125, 142, 43, -7, -16, 78, 5, -2, -49, -25, 150, -220, 75, 40, -53, -53, -77, -112, 1, 108, 110, 32, -2, 25, -61, 80, -31, 47, -34, -22, -17, -20, -16, 37, -2, 15, 22, + 14, 38, 49, -16, -11, -22, -15, -31, -9, -21, -17, -32, -12, -4, -486, -77, -178, -44, 39, -133, -296, 217, -73, 51, 146, -46, -15, -18, 67, -52, 245, -10, 189, 277, -332, 70, 231, 16, 46, 160, 295, 42, -66, 148, -39, -77, 67, 52, 66, -83, 301, -139, 76, 112, -1, -15, -147, 24, -170, 143, -174, -134, 96, -162, 111, -113, 47, -92, 62, 131, 256, 78, 29, 124, 2, -222, 29, 62, 84, -56, 12, -31, 42, 123, 75, 168, 58, 22, -103, -53, 100, 77, -99, 117, 58, 128, + -40, -32, -41, 5, -25, -105, -19, 16, 17, 66, 7, -21, -26, 27, 14, -52, -8, -5, 0, 19, 5, -25, -3, -24, -177, 132, 85, 28, 166, -8, 93, 228, 140, 299, 57, -43, -306, 49, -188, -61, 23, 70, -118, 1, 293, -149, -9, -148, 71, 3, 56, 121, 140, -87, 105, 111, 211, 9, -209, 22, 224, -21, -15, -30, 151, -175, 14, 117, 151, 183, -69, -117, -16, 262, 24, 95, -212, -94, 51, 45, -37, 139, -10, -27, 77, -132, 8, -20, 91, 141, -206, -45, 66, 139, -89, -84, + 57, 164, -15, 111, 78, 114, 47, 127, 189, 8, 53, -52, 77, 56, -36, -84, -16, -60, 20, -55, 24, -24, 13, -44, 1, -4, 9, -26, 42, -40, -18, -17, -22, 6, 24, 25, 14, -12, -9, -18, 57, 528, 256, 208, -197, -35, -274, -196, 295, 27, -185, -86, 63, -176, -15, 299, 120, -12, 97, 439, -292, 70, -54, -142, 253, 128, 132, -98, 114, 145, -44, 93, -29, -125, 27, 47, -21, 149, 37, -54, 165, -75, -77, -95, 47, 63, 13, 118, 17, 372, 25, 0, -86, -78, 90, -277, + 12, 166, 132, -149, 220, 4, 99, 175, -49, 135, 106, -48, -157, -121, 100, 249, 72, -108, -52, -62, 172, -145, -8, 141, 165, 23, 21, -45, -68, 3, -15, -58, -11, -26, -28, -44, -22, 58, 40, -12, 76, 22, 31, -10, 26, -13, -6, -3, 9, 9, 22, 41, 11, 5, -12, 127, 34, 346, 87, 206, -9, 46, 59, 57, -57, 211, -88, 228, -111, -89, 61, -151, -42, -48, 65, 95, -60, -221, 101, -267, -107, -46, -5, -42, 53, 239, 136, 16, -248, -239, 9, 161, -84, 25, -29, -106, + -159, 16, 109, 230, 209, -27, 68, -290, 100, 192, 220, -27, 200, 42, 291, 171, 57, 131, -12, -76, -50, -30, 183, -70, -102, -127, 182, -44, -318, 63, 121, 178, 232, 395, -166, -136, 234, 247, 195, 83, -41, -46, -154, -174, -48, -63, 51, -8, -51, -8, -96, 20, -13, 44, 5, -74, -7, 7, -13, -7, 34, 64, 64, 53, 13, 13, -99, 4, 67, -45, 36, 7, -29, -24, -14, 66, 49, 9, -8, 36, 1, -459, 223, 314, 42, 262, 37, -235, -21, -110, -57, 242, -314, -88, 111, 124, + 286, -56, 124, -447, -226, 114, 265, -174, -124, -186, -223, 118, -27, 2, 85, 41, 89, 346, -209, 336, -18, 69, 76, 73, -100, 117, -237, -45, -129, -25, -176, 214, 39, 594, 20, -38, -149, 26, -125, 310, -190, 41, -346, 260, 241, -287, 177, 178, 75, -156, -157, 261, 69, -378, 182, -179, -96, 86, -93, 34, 78, 102, -196, -479, 71, 108, -13, -103, 191, -82, -60, -89, 127, -155, -59, -88, -63, 39, -57, 82, 14, -138, 103, 13, -69, -4, 93, 30, 6, -12, -23, -73, 8, 20, 11, -8, + 44, -83, 11, 15, -90, -82, 202, 39, -4, -170, -286, 101, -153, -62, 278, -378, -157, -278, -28, 239, -22, -197, -273, -307, 120, 324, -92, 203, 305, -84, -70, 119, 170, 362, -52, 204, 30, 430, 317, 87, -101, 44, -238, 418, 98, -184, -204, 241, 204, 147, 105, 72, 217, -94, 96, -143, 21, 12, -217, -290, -103, -205, 132, -125, -92, -316, -199, 61, -108, -38, 153, 317, 401, 208, 166, -147, -325, 6, -228, -527, 5, -37, 197, 133, -128, -293, -159, 142, -6, -32, -121, 65, 68, 53, -31, -167, + 36, 22, 17, -38, -20, -22, 22, -81, -83, -9, 11, -68, 7, -13, 64, 85, -90, -3, 67, -11, -37, 16, 10, 92, -27, 59, 47, -607, -188, 34, 295, -213, 144, 95, -13, 446, -61, 420, -248, 123, 132, 5, -385, -158, -144, -436, 148, -108, 91, -27, 157, 0, -171, 91, -281, 207, 120, 477, -21, 15, 435, -385, 337, 415, -261, 267, -113, -125, -219, 55, 49, 295, 189, -76, -124, -251, 136, 157, -289, -129, 268, -472, 43, -365, 204, 20, -9, 110, -125, 42, 433, -179, 93, 212, 132, 23, + -231, 102, 83, -133, -374, 4, -87, -295, 222, -80, 81, -12, 41, 94, 90, -165, 40, -16, 36, -13, 110, 56, -29, -20, -162, -6, -111, 19, 17, 116, -171, 63, 91, -64, -107, 38, -17, -62, 50, -13, -67, 24, -23, -76, -22, -49, -103, 48, -32, 10, -57, -12, -58, 27, 108, -14, -248, 722, -268, 140, 104, 257, 81, 156, 361, -279, -171, -24, 502, -194, -214, -250, 124, 83, 275, -574, 5, 11, -39, 294, -71, 226, 421, -307, -137, 119, -230, -289, 194, -269, 396, -68, -408, -55, -234, 129, + 323, -7, 163, -21, 63, 384, 12, 279, 110, -210, 218, 186, 26, 156, 552, -92, -249, 131, -314, 24, 527, 179, 83, -101, -151, -102, -187, 317, -209, -56, -131, 361, -664, 227, 234, 399, 94, 30, 352, -100, -153, -200, 5, -166, -17, -143, 115, 10, -127, -134, -112, 42, 137, 110, 24, 8, -59, -145, -49, -38, 60, 61, -25, -36, 28, -87, 0, -85, -43, -111, -150, -42, 51, 166, 27, -46, -45, 65, -16, 159, 72, 28, 22, 1066, 318, -194, -259, -218, 773, -666, 53, 261, 39, -361, -82, 181, + -39, 42, 321, -332, -279, 137, 418, 258, 108, -202, -198, -190, -222, 207, 82, 297, 238, 136, -315, -149, -335, -66, -220, -506, -94, 227, 50, -235, -237, 6, 123, 318, 40, 161, 46, 614, -532, 348, 65, -542, -98, -163, -134, 84, -237, 144, 104, 243, -296, 105, 474, 223, 754, -168, -19, -185, -95, 21, -15, -715, 319, -30, -42, 195, 192, -202, -305, -333, -124, 237, 101, -77, -197, 174, -309, 162, -51, -139, -175, -189, -68, -63, 30, -79, -53, 40, -57, -53, 33, -155, -71, -10, -53, -88, -39, -157, + 23, 119, 160, 187, -135, -165, -117, -149, 6, 0, -92, -104, 41, -13, 104, -32, -7, 81, -64, -357, 87, 194, -7, -219, -152, -474, -564, 117, -250, -119, 83, -5, -59, -252, -125, -2, 198, 211, -309, -178, 195, -277, -136, -454, 440, -57, 396, 35, 149, 421, 318, -187, 96, 214, -224, -92, 209, -77, -505, -94, -354, 519, -55, -138, -296, -433, 156, 92, 103, 214, 5, -79, 224, 57, -42, 79, -124, 343, -81, 216, 640, 143, 121, 150, 236, -557, -451, 172, -492, 341, -69, 391, 104, 762, 300, 52, + -221, -98, -392, -26, 123, 77, 84, 135, 348, -144, -281, -98, -78, 109, 316, 112, -76, 91, 93, -16, -72, -183, 13, 21, -89, -121, -23, -195, 137, 78, -91, -29, -193, -94, 90, 169, -84, -78, -3, -155, 165, -7, 119, -160, 1, -166, 98, -197, -45, -908, -637, 236, -254, -525, -798, -19, 64, -155, -128, 762, 200, -550, 115, -336, -283, -273, -492, -81, 45, -677, -641, -243, 106, 63, 388, 329, 204, -163, -6, 150, -347, -193, -119, 115, -326, -199, 223, 135, -9, -50, -61, 186, -470, -268, -232, 312, + -364, 248, 417, 572, -38, 165, -136, -272, -358, -96, 353, 133, -641, 29, 663, -440, 21, -94, 35, 158, 338, -70, 107, 407, 279, 179, -311, -374, 273, -270, -513, -492, 536, 205, 296, 127, -85, -103, 255, 181, 48, 246, -98, -322, -167, -224, 90, 327, 159, 40, 193, 108, 180, -34, -93, 111, -40, -125, -107, 87, -298, 66, 175, -105, 216, 149, -12, -23, 204, 26, -47, -129, -127, 36, 108, 25, 87, -129, -531, 293, -430, -766, 138, -466, -271, 906, 61, 678, 610, -123, 643, 890, 633, -796, -107, -370, + -375, -229, 16, -328, 694, 206, 380, -325, 364, 281, 93, -414, -322, 660, -121, -616, -42, -713, -103, 199, -256, 16, -583, 268, 528, 287, -78, -285, -107, -71, -100, -267, -716, 484, 271, 253, 302, -406, 630, 80, -191, -140, -504, -221, 325, 203, 539, -57, -619, -1084, -65, -7, 3, -390, -548, -103, 361, -190, -223, 145, -50, 553, -110, -489, -177, 515, 31, 99, -501, -176, -96, 208, 265, -131, 91, 22, 198, 132, -22, 90, 266, 67, -7, -88, 28, 178, -8, 91, 305, 46, -108, -227, -27, 166, -160, 85, + -73, -48, -107, -136, -105, 3, 191, 151, -208, -378, -114, 141, 49, 51, 1156, 729, -104, -673, 142, 336, 193, 491, 737, -325, 61, -659, 186, 54, -256, 1188, 450, 1025, 423, 264, -893, 14, 497, 91, -475, 201, -726, -283, 50, 219, -218, -141, 157, 129, 52, 643, 399, 106, -258, 443, -288, -207, -424, -141, 552, -873, -14, 392, -436, -137, 166, 148, 805, -46, -10, -376, 787, -350, 99, 83, 545, -127, -197, 519, -876, 228, 83, -363, 700, -875, -112, -293, -589, -294, -53, 250, 550, 909, 442, 601, 914, -371, + 168, 230, -391, 529, 10, -699, 366, 194, -257, 25, 539, 409, 120, 323, 95, 106, 296, -52, 125, 266, -66, 59, -50, -14, 186, 38, 19, -162, -99, -112, -232, 52, -129, -368, 140, 223, -78, -2, 98, -126, -6, 392, -61, -107, -249, -1121, 311, 59, 1354, 309, 255, -37, 661, 178, -992, -153, 1062, -315, -224, 90, -73, 24, -193, 1106, 1259, -677, 306, 339, 184, 357, -553, -765, 589, 162, -423, -731, -219, -248, 669, 546, 307, -619, 341, -268, 217, 37, 288, 631, 145, -1411, -432, 259, -565, 172, 599, 201, + 1042, -345, -1565, -36, -624, 545, 472, -170, -332, 484, -751, -134, -406, 355, 489, 418, 455, -339, -636, -1895, -906, -1103, 175, -748, -362, -152, -823, 442, -1481, 462, -1065, -771, 760, 898, -275, -36, 486, 633, -868, 20, 142, -124, 153, 467, -59, 207, -39, 183, -384, -201, -175, -253, -55, 367, 153, 331, 13, -349, -317, 56, 193, -72, 205, 214, 514, 51, 177, 57, 123, -226, -69, 95, -184, 10, -84, 22, 96, 539, -49, -319, -354, 36, -20, -562, -329, 233, -369, -18, -5, -1466, -216, 977, -1159, 117, 434, 16, + 304, -83, -918, -73, 501, 172, 746, 509, -787, -849, -113, -365, -120, -1401, 526, 560, 983, 450, 895, -383, 123, 922, -290, 1003, 279, 532, 179, -252, 495, -605, 30, 1268, -982, 93, -1277, -573, -918, -622, -160, 69, -301, -971, -176, -1614, 1825, 642, 11, -246, -441, 102, -803, 149, -1204, 28, 61, 270, 772, 1113, 38, -1866, -858, 800, -407, -373, -452, -248, 920, 192, -517, 387, -864, 150, -164, -383, -872, -494, 551, -263, -212, 296, -325, -101, 548, -643, -437, -188, -135, 689, 321, 186, 407, 159, -69, 318, -8, 233, + 332, 518, -203, -5, -59, 382, 580, 215, -141, -43, -178, -423, 742, -219, 382, -221, 117, -235, -171, 337, -727, 516, 833, 308, -382, -507, 243, -654, 1036, 864, 1314, -937, -1155, -290, -27, -584, 773, 938, -694, -2, -1237, -365, -585, -1116, 353, 921, 558, -725, -281, 85, 621, 93, -44, 233, -69, -314, -999, -678, 260, -93, -543, 591, 528, 335, -1023, -934, 886, 534, 659, -666, -1704, -322, 721, 714, -172, 1726, -211, 1734, -2603, -3231, -1324, -1946, 26, 759, 403, 2106, -235, -137, 396, -420, -1659, -1481, -1645, 1319, 1084, -407, + -107, -2758, 774, -35, -1226, 511, 794, 1219, 961, 442, -79, -818, 31, 41, -223, -352, 978, 599, 385, 991, -757, 183, -207, -473, 627, -97, -1079, -7, 348, -389, 521, -206, 144, -239, 1210, 941, 1121, -939, -207, 1154, 860, -817, -499, -823, -478, 675, 773, -267, -70, 1291, 62, 122, -162, 233, 230, 212, 369, -1248, 1088, 834, 338, 1032, -608, 383, -1708, -821, 445, 633, 286, 223, 209, 445, -211, 1943, 172, 1211, 344, -579, 1474, -197, 577, 35, 526, -52, -35, 328, 737, 220, 538, 42, -115, 1170, 129, -242, 16, -88, + -591, -165, 325, 221, -1321, -318, 162, 308, 1373, 1125, -1366, -747, 108, -298, 1511, 151, 1393, -980, 699, 145, 74, 652, 1432, 935, 188, 1272, 495, -595, -1284, 1126, -1025, 682, -1350, 8, -2138, 2217, -552, 78, -1498, 1345, -525, 426, -1099, 1298, -680, -610, -447, -815, 250, -457, 384, -424, 707, -796, 708, -839, 459, -983, 782, -340, 869, -305, 454, -372, 292, -424, 12, -464, 527, 215, 147, -186, 48, -371, 282, -381, 664, -554, -659, -299, 264, -784, 601, -196, 330, -226, 187, -364, 167, -190, 200, -62, -2135, -534, -165, 225, + 192, -1330, -772, 1201, -466, 443, -532, 117, 1511, 2434, 169, -87, 1223, 532, 506, 1506, 34, 912, 1107, 1061, -416, 458, 956, 1330, 1089, 1636, 925, 2089, 2219, 1602, 1770, 1205, -131, 590, 314, -460, -453, 346, 1034, 233, 48, -9, 511, 1536, 1197, 2581, 521, -1345, 535, 22, 547, -692, 1026, -1876, -2414, 671, 2427, 1051, 485, -3014, 17, 1139, 1818, 2438, -1039, 146, -4213, -2784, 1126, 1573, -2348, -2009, -1250, 2298, 1536, -2762, -3559, -727, 1448, -1710, 809, -269, -617, -928, 125, 356, 596, -117, -1474, -1282, 155, -407, 614, 73, -157, -571, + -375, 221, -37, -1237, -622, -940, -485, 154, -478, -361, -1102, -1472, -2014, -2019, -1699, -1453, -1594, -1592, -1213, -1679, -1772, -1518, -1704, -1114, -305, -992, -1428, -958, 35, -535, -291, -355, 727, 764, 21, 331, 393, 208, 224, -21, 161, -820, 2044, 2249, -2538, -1086, 1011, -738, 518, -961, 881, -817, 225, -24, -351, 173, 77, -267, -148, -658, -136, 115, 111, -670, 648, -617, -171, -538, 92, -516, 1036, -48, 299, -297, 298, -315, 320, 585, 868, -255, 314, 279, 766, -487, 505, -438, 914, -263, -468, 256, -188, -297, 132, -108, 410, -232, + -471, -519, 107, 64, -843, 235, -105, -119, 181, -278, -119, 57, -110, 88, -441, 519, -1533, 792, -637, 1014, -672, 904, 19, 475, 327, 380, 222, 34, 212, -69, -627, -174, 63, -303, -92, -177, -37, -1, -217, -59, 129, -63, -375, 401, -37, 195, -400, 170, -232, 138, -276, 321, -422, 614, -83, 46, -635, 425, 11, 295, -599, 116, -223, 52, -85, 12, -375, 160, -37, -314, 77, 473, -542, -18, -178, 250, -359, 332, -272, 37, -171, 225, -37, 78, -42, 86, -135, 25, 0, -162, 87, -30, 101, -414, 1940, 1176, + -640, -736, -64, 2411, 1007, 338, 668, -585, -739, 206, 468, 122, 42, -257, -200, 227, 231, 561, 250, -303, -134, -150, -305, -3, 54, 149, 190, 6, -81, 224, -647, -246, 288, 413, 512, -288, -168, -306, 524, 362, -99, 166, -606, -524, 483, 376, 118, -917, -472, 38, 153, 603, 431, -68, 177, 214, -287, 262, 284, -84, -175, 169, -307, 29, -53, -216, -329, 456, 93, 101, 629, 765, 271, 619, 579, -92, -157, -174, -112, 241, 395, -154, 122, -355, -129, -18, 84, -194, -231, 239, 457, 197, 127, 191, -220, 18, + 218, 42, -68, 55, -22, -267, 543, 177, -434, -410, 165, -81, 428, 226, -55, 159, 55, -89, -20, -124, 125, 196, 31, -52, -169, 145, -33, -696, -1919, 665, 3529, 2775, 2658, 850, -2471, -1483, -2191, -2198, -2004, -699, 1081, 1393, 2192, 1963, 1183, 199, 193, -950, -1501, -2148, -825, -583, 194, -121, 1091, 736, 314, 1457, 819, 624, -126, 547, -988, -746, -616, -721, -948, -572, -378, -966, -668, 257, 1423, 1373, 1561, 1225, 1784, 308, 457, -1185, -876, -752, -1776, -1769, -1586, -750, -929, 218, 689, 991, 1993, 1957, 1875, 1681, 1473, 314, + -864, -1410, -2518, -2164, -1578, -2152, -998, -449, 96, 2111, 1656, 2428, 2399, 1752, 491, -485, -717, -831, -741, -1428, -1765, -1234, -843, -746, 93, 495, 789, 679, 1421, 1553, 1174, 934, 156, -329, -671, -1098, -944, -670, -1054, -1428, -151, 82, -235, 1228, 1621, 1037, 910, 67, 256, -170, -286, -709, -833, -548, -624, 88, -250, 79, 11, 559, 299, 288, 522, 533, -1, -141, -380, -378, -110, -86, -184, -177, 31, 41, -50, 86, 94, 99, 32, 292, 114, 24, 41, -9, -99, -107, -154, -162, -179, -88, -25 }, + {-102, -127, -188, 64, -92, -186, -119, 85, -235, -130, -287, 100, 128, 163, 89, -101, 218, -149, 44, 5, -31, -157, -81, -173, 7, -74, 97, 64, -83, -26, -19, -159, -7, -35, 70, -3, 144, -51, 182, -79, 2, 29, -133, 92, -41, -51, 15, -36, 69, -278, 129, 168, 23, 95, 51, -123, -18, -134, 181, -48, -115, 110, -169, 8, 63, -190, 21, -44, -75, 66, 12, 18, -92, -57, -308, -37, 63, -48, 12, 39, 160, 141, 5, 48, 17, -24, -26, -38, -25, -10, -34, -25, -4, 33, 16, 23, + -51, 3, -5, -10, -7, 15, -10, 5, -26, -15, -24, 2, -22, 32, -436, -261, 48, -141, 26, -145, -251, -166, 283, 166, -44, 193, 45, 48, 54, -93, -26, 157, -126, 71, 114, -122, -193, 89, -158, 18, 90, 232, -53, -111, -98, 37, 125, -171, -2, 141, 55, 15, -10, -13, 183, -6, 167, 111, -43, 110, -39, -9, -18, -305, 106, 174, -101, -56, 42, 48, 49, 28, -17, -36, 10, -76, 209, -93, 24, 114, 91, -74, 82, 27, 54, 116, 101, -151, 157, 175, -60, 4, -11, 115, -140, -72, + 30, 21, 5, 8, -30, -46, 28, -21, -12, 9, 40, -29, -7, 2, -55, 19, -33, -33, -26, 21, 3, -15, -33, 9, -171, 219, 146, 340, -55, 35, 106, -167, -33, 65, -67, -227, -12, 23, 153, -183, -444, -361, -220, 84, 213, -214, 121, -106, 164, 125, 112, 194, 110, -155, -141, 25, 106, -10, 10, 272, -1, 46, 137, 142, 25, 2, 340, -26, -126, -40, 78, 97, -65, 180, 37, 96, -130, -117, -44, -78, 45, -63, 199, -231, -204, 245, -25, -12, -287, 87, -139, 153, -119, -321, -14, 162, + -136, 210, -127, 95, 199, -58, 83, 197, -13, -150, 13, 95, 45, -74, 137, 6, 73, 24, 20, 49, 10, -24, -1, 4, 21, -58, -28, -32, 53, 3, 54, 53, -52, 10, 13, -33, -23, -14, 10, -31, 11, 530, 126, 140, 62, -122, 256, -122, -71, 323, -23, 260, -26, -299, 107, -102, 330, 172, -22, -296, -205, 271, 324, -378, 190, 150, 115, -26, 38, 30, -27, 372, -16, -65, -102, -126, -158, -54, -7, -216, -75, 55, -149, 7, 10, 222, -83, 6, 105, 8, 215, 95, 223, 109, 69, -236, + 26, -175, -161, 38, 227, -10, 195, -82, -146, -35, 10, 56, 135, -63, 0, -74, 76, 50, -190, 36, 41, 25, -53, 200, -20, -40, 22, 93, 42, -67, -20, -28, -47, 38, -57, 94, -56, -12, 12, -45, -12, 52, -61, -15, -66, 25, 29, 53, -72, 14, -29, 36, -24, -88, -27, 150, 105, 120, 341, 179, -148, -132, -368, -24, -8, -196, 75, 295, 36, -232, 216, 205, -21, 82, 208, 50, -189, -29, 441, 217, 46, -290, -104, 265, 91, -39, 149, 134, 140, -1, 274, -2, -35, 69, -136, -178, + -9, 31, 102, 56, -166, 169, 297, 153, -8, 221, -250, 144, -149, 158, -41, -180, -9, -234, -384, -140, -152, -18, -1, -201, 40, -61, 117, 78, 139, -21, 56, -193, 34, 31, 271, -104, -8, -93, 58, 244, 126, -140, -225, 72, -90, -30, 118, -16, 40, 29, -134, 7, -102, 30, -96, -65, -35, -3, -12, 19, -61, -5, -20, -49, -41, 16, -10, -25, 8, 24, 76, -25, 45, -31, -74, 57, -81, 80, -6, -52, -8, -359, -238, 510, -112, -111, 30, -17, 546, -159, -295, 8, -291, 73, 232, 250, + 79, -507, 417, -328, 174, -224, -171, -125, 208, 224, -336, 27, 146, -104, 67, 99, -121, 16, -276, -185, -426, 253, -60, 430, -200, 94, 287, -71, -85, -127, 329, 241, -404, 116, -229, -76, -89, -227, 136, 73, 356, 251, -447, -73, -192, 261, 91, 23, -261, 39, -28, 220, -37, 28, -300, -7, 213, -196, 33, -62, -59, -159, 32, -21, 378, 167, 173, -69, -42, -65, -103, -55, 84, -115, -37, -113, 86, 72, -62, -34, 80, -106, 53, 16, -29, -34, 29, -3, -10, -20, 70, -103, 14, 9, 52, 56, + 56, -52, 16, -37, 75, 18, 55, 124, -137, 9, -288, -36, -333, 52, -83, 191, -13, 162, -228, -430, 91, 289, 38, -35, 226, 151, -351, -6, -132, 444, -20, 51, 35, 4, -14, -160, 352, -31, -499, -94, 303, -196, 50, -9, 40, -63, 48, -93, 119, -192, 180, 253, -199, -51, -118, -349, 139, -248, 215, -218, -376, -103, 223, -71, -134, 148, 206, 117, 226, 386, 311, -21, 60, 52, -208, 38, -217, -238, 129, -182, 58, -12, 136, 137, -180, 207, -57, -87, -39, 145, -27, -137, -93, -193, 219, -111, + -29, 36, -10, -83, -70, 13, 29, 8, -39, 49, 37, -45, 3, 31, 19, -28, -1, -37, 13, -61, -55, 31, 16, 71, 79, 5, 54, -494, -408, 237, 443, -2, -23, 82, -208, -105, -505, -273, -141, -7, -366, 527, 109, 292, -334, -405, -299, -120, 84, -459, -201, 209, -87, -557, -185, 72, 9, 342, 119, -111, -259, 325, -186, -22, 251, 71, -265, -140, -17, -452, 117, 347, -148, -195, 55, -230, -80, 43, -141, -113, 123, -172, -354, 175, -200, -269, -363, -186, 41, -149, 65, 450, 259, -57, 435, 436, + -185, 59, 126, -228, -143, -482, 54, -155, -384, -5, 209, 360, 227, 105, 45, -328, -36, -76, 90, -124, -10, 7, 0, 77, 20, -31, 75, -30, -98, 82, -64, -93, 19, 33, 36, 7, 105, -11, 69, 37, 13, 20, 5, -78, 23, -107, 30, -171, -37, -8, -107, -134, -12, -133, -19, -28, -311, 795, -30, 487, -244, -699, 201, 59, -26, -328, -30, -217, 555, 404, 364, 263, -432, -4, 61, 384, -656, -76, -159, -193, 100, -218, 86, 145, 111, 116, 154, -47, -63, -321, -74, -50, 316, -1, -286, -69, + 344, -41, 201, 255, -184, -111, -422, -248, 831, 217, 371, 197, 50, 30, -524, 310, 51, 90, 270, 291, 457, -525, -215, -292, -35, 72, -67, -148, -84, -441, -551, -360, -516, -68, -337, -581, -243, 188, 320, -122, -495, -18, -73, 117, -135, 31, 287, 12, -19, -18, 38, 49, -82, -76, -197, -224, 121, -62, 108, 96, -35, 65, 90, 160, 116, -71, 37, 204, 41, -208, -170, -94, -42, 15, -71, 118, 132, -32, 199, 26, -54, -43, 47, 1069, 242, -154, -222, 34, -344, -671, 494, 2, 318, -241, 230, 549, + -55, 61, -139, 478, 402, 156, -648, 47, 95, 400, 582, -172, -120, -77, 156, 208, 172, -295, 134, -340, 259, 346, -166, -344, 216, -374, -343, -15, 99, 487, 58, -67, 414, -78, 372, 688, 344, 7, -439, -43, -253, -205, 439, 171, -445, -6, -340, -87, 582, 267, 84, 249, 350, 181, -472, 241, 391, 133, -323, 131, 36, 66, -253, 387, -108, -95, 465, 493, 71, 139, 536, 30, 264, -190, -7, 308, 178, -139, 158, 277, -77, 0, 354, 72, 150, -108, -180, -56, 98, 50, 80, 82, -60, -58, -48, 25, + 105, 127, -89, -28, 220, 30, 295, -56, 79, -43, 36, 132, 80, 8, -4, -129, -91, -66, 171, 156, -261, -12, -333, -780, 269, -310, 85, 29, 547, -376, -335, -139, -154, -200, 404, -357, -507, 153, -947, 30, -179, -398, 508, -31, -31, 216, -202, 163, -52, -562, -617, -4, 130, 364, 174, -39, -65, -353, -168, 359, -558, 773, 458, 106, 570, -378, -163, -345, -355, -151, 260, 730, 7, -373, -63, 38, -40, -36, -230, 199, 181, 493, -8, 557, 286, 155, -13, 122, -827, 440, -104, -481, 347, 3, 457, 206, + -766, 599, 467, -398, 648, 252, 485, 195, -65, -23, -18, -87, -166, -48, 74, -165, -254, 6, -165, -298, -177, -222, 147, -135, 180, 52, 184, 90, -16, -92, 35, 22, -9, 30, -49, -121, 65, -7, 79, 84, 9, 72, 37, 121, 106, -177, -103, -296, -224, -1458, -119, 871, -166, 30, 751, -171, 3, 97, 196, -223, 195, -74, -259, 249, 282, -851, 95, -757, -27, -390, -436, -90, -136, -413, 203, 73, 257, 364, -525, 657, 39, -606, 44, -417, -219, -449, -419, -173, 426, -368, 200, 443, -269, -462, -438, -627, + -688, -395, -201, 58, -110, 193, 122, -398, -36, 460, 254, -666, 257, -46, -194, -616, 413, -218, 573, 739, 13, 703, -391, 410, -309, 441, 547, 54, -736, -17, -1002, 328, 209, 401, 181, -384, -346, 0, -234, 231, -253, -2, -23, -238, -199, 175, -103, -270, -34, 93, 199, 118, 440, -39, 31, -126, 307, -37, -75, 283, -23, 49, 58, 379, -67, -143, 31, 265, 235, -235, -31, 178, -290, 167, -53, 211, 5, -232, -689, 556, -1320, -85, -121, -118, 129, -769, 59, -157, -60, 341, 142, 398, -308, 279, -144, -685, + -268, -505, -304, 320, -587, 70, -215, -455, -76, 430, -583, -573, 235, 331, -15, -276, 320, 326, 413, 345, 150, 475, 576, -317, 89, -280, 723, -67, -495, 591, 266, 135, -282, -388, 91, 219, 232, -30, -311, 228, -362, 1, -357, 1100, 173, -329, 914, -122, 281, -247, 460, 671, -422, 640, 692, 891, 694, 54, 516, -415, -79, 85, -223, 387, 18, -38, -39, -128, 194, 86, 546, -192, 202, -133, 3, 90, 161, -244, 85, 215, -100, -272, -51, -429, 143, 115, 112, -124, 68, 203, 122, -68, 208, 79, -138, -85, + -45, 326, 442, 220, 101, 63, 150, 247, -179, -88, 117, -45, 22, 104, 1365, 359, -235, -197, 315, 95, 133, -29, -549, 463, -1250, 141, 272, -50, -230, -474, -222, 62, 368, 571, -337, -721, -590, -78, 19, -423, 878, -405, -271, 369, -126, 71, -81, 761, 124, -752, 298, 101, 522, -182, 54, -308, 258, 121, 659, -156, 296, 319, -402, -436, 29, 407, -781, -916, -273, -373, -52, -129, 89, 214, -189, 36, -1065, -897, 715, 767, -923, -702, -889, -459, -370, 464, -487, -850, 22, 42, -526, -107, 742, -108, 39, 244, + -10, 47, -35, -259, -329, -14, -95, 218, -37, -17, -239, 122, -368, -5, 110, 125, 174, 203, 35, 116, -84, 22, -189, 71, 17, -208, 214, 219, -341, 23, 245, 207, 380, -77, -445, 126, 143, -217, 139, -242, -117, -36, -79, -206, 74, -761, -93, -184, 229, -361, -98, -1184, 1048, 674, -114, 1438, -141, -789, -73, 323, -488, -644, -135, -439, -20, 122, -661, 970, 33, 104, -609, -176, 66, -174, 156, 221, 797, 143, -41, 644, 531, -189, 314, -407, 115, 360, 351, 901, -891, 547, 1654, 11, 272, 565, 65, 112, + 267, 205, -552, -659, -239, 529, 158, -684, -370, -30, -328, 607, 56, 469, -1043, -647, 304, 715, 438, 288, 993, 579, -417, 683, -515, -106, -74, 384, -81, -428, 371, 160, 36, -490, 339, -9, 7, -220, 286, -234, -188, -180, 137, -188, -358, 119, 25, -4, -195, -40, -244, -211, -195, -125, -75, -94, -74, 33, 8, -465, 312, 121, -146, -344, -487, -14, -265, -181, 177, -131, 303, 148, -106, 50, 284, -129, -46, -138, 240, 54, 100, -243, 481, -1369, 21, -1, -52, -167, 635, 59, -378, -683, 691, -614, 8, 456, + 353, -481, -139, -779, -12, 232, 266, 325, 75, -505, -646, 531, 262, 267, 94, 272, 71, 392, -696, -1158, 314, -170, -257, 655, -123, -341, 565, 547, 441, -36, -302, -496, -139, -658, 1549, -128, 552, 125, -527, 430, -207, -491, 477, 391, -866, 602, -101, 833, -847, -628, 835, -30, -694, 703, -266, 1199, -517, -406, -731, 463, 75, -583, 224, -759, -568, 55, 484, -433, -278, -862, -796, 926, -117, 406, 635, 878, -7, -84, -79, 235, 340, 70, 150, 543, 224, 301, 164, 140, -117, -45, 320, 257, 423, -201, 274, 307, + -486, 126, 107, -253, -145, 4, 107, -205, 328, 24, -92, -92, 276, 16, 77, 31, 68, 71, -279, 188, -168, -395, 1022, -234, 692, -1082, -189, -26, -1290, -284, 188, 634, -317, -303, 29, -100, 908, -87, -455, 961, -118, -50, 183, -384, 832, 55, -168, 398, 342, -453, -153, -210, 648, -1291, -20, -250, -454, 222, -462, 754, -195, -931, -94, 1418, -856, 622, -955, -274, 956, 699, -511, 244, -624, -822, 179, -360, 363, 106, -54, 143, -1202, -469, -611, -879, 414, -332, -242, -486, -853, -718, 569, -109, 1768, 313, 167, 634, + 1114, 150, -795, 977, 741, -617, 170, -153, -614, -483, -413, -43, -376, 149, 265, 96, -292, 523, 86, 245, -65, -85, 251, 156, -242, -217, -209, 244, 119, 294, 311, 18, -157, 238, -126, 502, 241, -588, -111, -431, 60, -136, -205, 627, -26, -185, 166, 203, -219, -38, -304, 147, 233, -35, -91, 296, 677, -398, -526, 589, -932, -101, -198, 62, 645, -419, 717, 318, 158, 224, -1188, 810, 143, -823, 319, -874, 144, 1190, -153, -692, -751, 325, 530, 441, 225, -772, -540, -234, -151, 1017, -645, -376, 1497, -828, -70, 604, + -3, 635, -97, -499, -345, -913, 465, 662, -988, 1476, 484, -1100, -1015, -956, -1159, -926, 43, 467, 86, -770, -299, 525, -19, -480, 531, -1040, 62, -235, -972, -897, 152, -353, 679, -1247, -173, -438, -922, 69, 1473, 385, -658, 323, -808, 333, -331, 35, 40, 424, -48, 149, 522, 11, -295, -129, 418, 304, 190, 109, -832, -79, 59, 470, 229, -425, -11, 54, 721, 45, 230, -219, -145, 111, 233, -25, -216, -401, 57, -149, -283, 142, -198, -197, 278, -221, -326, -445, -398, -70, 116, 5, -346, 717, -1794, -1659, -1439, -930, + 376, -393, 1851, 489, -197, -425, -234, 524, -1204, 1410, 1866, 741, -112, 1475, -468, 891, 1696, -310, 94, 317, 2256, -572, -141, 1339, 509, 430, -368, -1374, 96, -1089, 521, -1350, -1579, -19, -89, -1104, -57, -537, -1130, -905, -1475, -71, 1510, -481, -287, -1391, -743, -512, -475, 470, -338, 2508, -592, -35, -913, 1892, 1557, -1100, 1267, -443, -1836, -329, -174, 387, -425, -418, -228, -747, 219, 923, -1088, -156, 320, 191, -1264, 824, 587, 1903, -806, 522, 809, -47, 228, -24, 286, -210, 626, 262, 510, 428, 50, 440, 153, -163, 479, -26, + 96, 53, 342, 241, -321, -265, -413, 664, -426, 102, 428, 175, 758, 634, 1119, 753, 648, 48, 437, -568, 557, 401, -99, -546, -1010, -399, 336, -573, -184, -414, -987, -877, -383, -649, -354, -554, -675, -743, -194, -210, -287, -553, 746, 3203, 359, -1985, -508, -693, 142, 1011, 1780, 527, -1514, -13, 1031, 242, 13, -30, 262, -127, -191, 1254, 767, 708, -1059, -664, 708, 295, 415, -346, 125, 1395, 26, 1186, 608, 656, 1136, 185, -611, 160, -699, 194, 479, 143, 1864, -604, -1208, -1141, 1440, 685, 766, 545, -829, -1017, -634, -15, + 313, -206, 508, 976, -66, 713, 629, -946, -191, 297, -452, -388, -475, -1575, -268, 712, 63, 1416, 933, -655, 497, 29, -460, -371, -769, -1705, -916, 92, 36, -360, -97, -158, 558, 597, 305, -83, 50, 458, -208, 295, -768, -348, -92, 437, -98, 185, 284, 289, 47, 766, -586, -521, -531, 408, -339, -545, -541, 412, -169, -392, -198, 314, 92, 450, -708, -460, -66, -31, 165, 352, -138, -274, 513, -243, -280, -258, 502, -117, -218, 146, 5, -252, 42, -338, -171, -154, 23, -112, 122, -94, 86, -48, -179, -776, 87, 2513, + 646, 1056, -526, -2296, -1165, -1692, -570, 1133, 2605, 1160, 289, -1242, -1169, 818, 1296, 640, 1573, -70, -1030, -1510, -734, -236, 1168, 140, 675, 598, 102, 1557, 1095, -124, -150, -1443, -351, -35, 29, 821, 1474, 898, 707, 1380, 799, -1441, -1155, -365, -906, 956, 652, 1416, 1106, 1252, 372, 218, -1031, -1082, -1012, 354, 516, -6, -137, 2234, 567, -157, -211, 1530, -1633, 341, -3111, -699, 779, -1092, 1017, 572, 16, 2235, 1062, -1274, -2526, -1218, -1143, -625, -424, -329, 1104, 698, 1489, 176, -1094, -758, -1149, -1073, -1063, 467, 100, 462, 636, -302, + 588, 308, -409, -51, -454, -149, -982, -1042, -388, -454, 19, -976, 519, -73, 181, 270, -649, -1348, -1217, -68, 267, 276, 801, 197, -402, -760, 252, 178, -3629, -2218, -1210, 1069, 305, 4953, 5286, 3213, 5863, 4792, 5072, 3514, 4292, 3482, 65, -1660, -2366, -2275, -4753, -5705, -5959, -4161, -3270, -1287, 229, -1684, 1031, -2122, -765, -145, -654, 503, -1945, 2678, 460, 2441, 1571, 912, 640, 1351, 883, 1386, 3193, 3032, 2421, 2964, 3753, 3413, 3222, 5904, 2076, 4154, 5416, 3719, 4919, 2610, 3506, 2737, 3291, 3556, 1323, 2303, 1753, 2157, 2094, 574, -397, -2255, + -825, -3010, -2624, -4457, -5040, -5084, -10726, -9089, -9751, -9684, -11290, -11430, -7037, -8200, -6092, -7232, -5484, -5204, -4517, -4545, -2599, -1153, -1648, -1681, -1360, 262, 2185, 1136, 4542, 3899, 5740, 5887, 5447, 6787, 6304, 7286, 5710, 6972, 7402, 8258, 7237, 4314, 4328, 4307, 4389, 4034, 2852, 2656, 1121, 785, -73, 136, 560, -1483, -2179, -2374, -1448, -1291, -2432, -2843, -3309, -2405, -3059, -2835, -2374, -2557, -2590, -2592, -649, -593, -283, -555, 360, -66, -26, -493, -132, 179, 345, 104, 452, 253, 483, 11, 142, -85, 248, -51, 190, -30, 123 } + }, + { + {168, 3, -62, -15, -150, -104, 67, 5, -94, 117, 79, -26, 7, -16, 95, -132, 50, 98, 87, -190, -132, -94, 127, 30, 42, -53, 136, 50, -33, 3, -38, 26, 51, -31, -39, -114, 121, 201, 24, 128, -23, 25, 46, 55, -153, 10, -160, -37, -22, 50, -81, -3, 35, 15, -93, 3, 11, 76, -99, -125, -17, 168, 271, 0, 44, 18, -58, -163, -41, 113, -52, 112, 44, 115, -6, 44, 41, -98, -132, -15, 50, 75, 37, 33, 23, 25, -45, -72, -49, -40, -19, 1, -27, -4, 24, 38, + 34, -6, 2, 22, -1, -29, 77, -170, -39, -161, 93, 10, -74, 343, -134, -246, 19, 114, -21, -185, -53, -81, -30, -88, -29, 127, -9, -83, 146, 21, 142, -38, -35, 55, 4, 64, -27, 134, 219, -60, -147, -108, 90, 0, -337, -32, -135, -50, 165, -115, -88, 114, -75, -16, 151, 52, -120, 53, -86, -199, 64, 78, -151, -88, -44, -64, -1, 65, 103, 156, 175, -42, 18, -69, 75, 48, -39, 73, 112, -107, -55, 18, 2, 43, 129, -16, -35, 117, 17, -81, -51, -6, -50, 36, -21, -45, + 18, -51, -40, 25, -51, -35, 1, 34, -63, 7, -15, -22, -31, -3, -49, -14, -47, -276, -140, 85, 122, 48, 133, -114, 139, 171, -48, 189, -26, 139, -66, 4, -59, 178, 69, -7, 159, -85, -67, 116, -276, -48, 15, -59, -246, -150, 102, -97, -64, 3, 192, -46, -135, -11, 50, 109, -17, -175, -113, -32, -89, 29, -152, 75, -143, -211, 7, 74, 86, -67, -48, -138, 179, 103, 25, 2, -5, -61, -32, 60, 76, 269, -30, 68, 18, -8, -132, -101, 183, -79, 18, 45, 26, -29, 138, 7, + 5, -150, 145, 81, -56, -34, -16, -44, 20, 104, -1, 41, 32, -15, 24, 54, -6, 0, 17, 25, 22, 30, 56, 21, -41, 43, 20, -31, -24, -5, 6, 67, 82, 74, 176, -117, -174, -141, 88, 195, -36, 149, -133, -162, 133, -67, 14, 50, 167, 62, 266, -116, -142, 62, -79, -74, 150, -235, -145, 23, -46, 107, -80, 29, 189, -176, 131, -106, 85, -100, -28, -16, 196, 37, 7, -143, 7, -171, 64, 42, -114, -3, -47, 295, 40, 19, -256, -150, -216, 169, -110, -12, 89, 376, 266, -106, + -232, -97, -201, 213, -41, -59, -93, -62, -17, -97, -64, -16, -79, 57, -55, 80, -293, 20, -24, -92, -43, -98, -20, -153, 13, -63, -5, 94, -30, -32, -66, -73, -21, 21, -4, -6, -26, -11, -31, -4, 8, 19, -22, -25, -35, -31, -27, -47, -149, 107, -154, -273, 279, 126, -293, 293, -47, -17, -411, 245, 163, -332, 99, -55, 126, 30, 145, 94, 37, -154, 14, 57, -205, -87, -241, -41, -150, -80, 27, -188, -70, -278, 105, 28, 24, 25, -120, -242, -76, 86, -39, -20, 254, -376, 158, 193, + -28, 13, -73, -29, -122, -185, -127, -146, -98, 94, 52, 84, 127, -29, -68, 182, 346, 245, -5, -294, 81, -44, 43, 313, -2, 316, 281, -38, -94, -75, 22, 28, 105, 320, 85, 14, -33, -197, 23, 62, -67, -9, 10, -2, 37, 29, 22, -24, 38, 36, 34, 40, -107, -16, -77, 31, -60, 26, -17, -27, -65, 13, 16, -93, -30, 23, 443, 113, -79, -21, 136, -47, 430, -46, -66, 545, 3, 276, -102, 8, -24, 45, -70, 38, -9, -16, -296, -28, -70, -53, -123, 189, 88, 113, -166, -18, + -262, -105, 49, -21, -159, -49, 88, 198, 120, -63, -244, -9, 69, -41, 129, 86, 175, 241, -78, -2, -260, -316, 299, 160, -11, -13, -10, -115, -126, -2, 239, 138, 43, 291, -223, 66, -183, -141, 125, 129, 106, 439, -16, -199, 34, -195, 88, 51, 161, -87, 3, 20, -148, -26, 103, -16, 27, -64, -33, -10, 71, -38, 45, -68, 6, -88, 28, -47, -30, 14, 44, -55, 59, 38, 72, 4, 43, -19, 26, 13, 26, -28, 0, -26, -4, 13, 37, -244, -327, 127, -306, 0, 340, -356, 130, 160, + -96, -440, 6, 257, -285, 177, -20, -126, -369, -10, -266, 47, -135, -207, -259, 106, -37, -15, 246, -149, 207, -157, -63, 318, 109, -170, 131, 77, -147, 78, 80, -56, -63, 13, -71, -84, 52, 58, 433, -408, 66, 26, -146, 293, 167, -100, -316, 28, -32, -95, -199, -233, 285, 185, 24, -28, 152, 77, -69, 122, 87, -79, 303, -112, 186, -124, 92, 96, 68, -9, -169, 162, -131, -137, -94, 47, 0, 20, -160, 87, 67, -101, 10, -4, -51, 10, -34, 78, -22, 12, 65, -29, -49, 43, -56, 46, + -10, 0, -65, -29, -2, -70, 70, 40, 16, 47, -15, 32, 144, -330, 242, -138, -60, -189, -136, 115, -108, 94, 370, 127, 204, -472, -312, -168, -112, 51, -2, 81, -395, 212, 89, 53, 378, 6, -214, 354, 140, -158, 73, -203, 186, 88, 248, -213, -151, 63, -215, 271, -249, -5, 241, 222, -459, -13, 23, 53, 76, 502, 116, 31, -153, -127, -271, -147, 371, 9, -442, 7, 102, -251, -277, 33, -179, 73, 406, 199, 171, -167, -434, 35, -74, 199, -39, -364, -44, 95, 100, 98, -31, 308, 58, -196, + 254, -19, 152, -5, -38, -132, 188, 129, 73, -96, -38, -25, -63, 35, 0, -82, 41, 25, -46, -61, -25, -46, -7, 57, -59, 29, 72, 86, -22, 36, -46, -581, -173, 164, 449, 64, 233, 797, 133, 136, -123, -383, 217, -186, 200, -48, 529, 384, -203, -432, -343, 260, -228, 319, 141, 104, -109, -42, 380, -75, 336, 335, 174, 235, -260, 254, 138, -137, 372, -164, 338, 25, 39, -495, 299, 27, -92, 244, -344, -137, 208, 169, -317, 51, -202, -117, 316, 42, 96, -33, -361, 243, 232, 16, 184, 82, + -159, -169, -13, 193, -327, -12, 22, 14, -2, 144, 190, 388, 219, 13, -544, -179, -203, -18, 42, -153, -322, -102, -144, 85, 14, -92, 36, -94, 151, -54, -63, -89, 3, 43, -193, 122, -124, 51, -31, -72, 5, -120, 40, -108, -77, -15, -61, -57, 68, 115, 70, 111, 145, -30, 23, 718, 212, 95, -265, -649, 470, 145, -429, 128, -45, 110, 93, -312, -664, -521, 177, 407, -79, 427, -197, 333, 409, 552, -120, 408, -361, 138, -196, 49, 221, -10, -116, 99, 278, -197, -365, -372, 780, 1, -37, -351, + 363, 117, -717, -416, 163, -101, -125, 281, 97, 696, 386, -25, -402, -397, -223, -163, -456, 424, -311, 335, 290, -290, -372, -361, -525, 129, -6, -189, -236, -387, -136, -381, 83, 47, -127, 52, 316, -799, -308, -652, 332, 230, -277, -94, 137, -123, -1, 155, -118, -260, -26, -75, -80, -3, -31, -110, 7, 23, 142, -192, 54, 106, -9, -79, -121, -36, -16, 28, -40, -10, -72, 37, -27, -122, 221, 23, 69, -386, -745, -165, -193, 41, -173, 32, 79, -80, 320, -413, -125, -392, -19, -195, 454, 508, 406, -566, + 402, -204, 305, -117, 225, -188, -242, 87, -312, 201, 242, -30, 146, -286, -36, 485, -385, 19, -114, -158, -311, -17, 479, 631, -398, 191, -50, -383, -392, -421, -193, 799, 483, -149, 257, -170, 222, -437, 257, -13, -239, 608, 313, 124, 198, 174, 569, 75, -484, 197, 368, 289, -844, 515, -359, -319, -158, 53, -332, 365, 808, -140, 115, 413, 69, -68, 97, 42, 235, 212, 126, 387, 198, -108, 262, 164, -118, -236, 132, -33, 143, -68, 42, 117, 45, -34, -31, 53, 180, 39, -44, 40, 138, -62, 6, 235, + 89, -63, 127, 40, 33, 96, -4, 79, -39, -150, -138, 116, 518, 341, 1408, 396, -238, 93, 236, 8, 469, 352, 325, -417, -702, 703, -398, 69, 242, 771, 308, -463, 419, -419, -88, -577, -761, -83, 204, 207, 152, 196, -61, -519, -194, 170, 175, -274, 578, 370, -348, 194, 287, 115, 16, -318, -41, -223, -134, 35, 359, 899, -245, 84, 131, 337, -322, 1139, -100, 112, 94, -514, -507, -814, -348, 449, -158, 227, 180, 784, 124, 142, 40, 618, 296, -256, 565, -514, 81, 523, 672, 621, 243, -351, -577, -247, + -185, -419, -235, -238, -68, -352, 88, -120, -59, -306, -37, -191, 303, 32, 65, -273, -54, -375, 25, 161, -13, 276, 172, 1, 112, -57, -171, -99, -77, -322, 28, 65, 75, 96, -160, 227, 245, 109, -192, -129, -65, 55, 135, 74, -129, -66, -148, -587, 331, 157, 406, -109, -897, 71, -602, -534, 158, 127, 250, -157, 180, -32, -308, 489, -80, -163, -197, -344, -295, 177, -372, 90, -238, -163, -104, 479, -96, 514, 320, -135, 169, 178, 364, -253, -347, 52, 214, 281, 482, -534, -519, 222, 171, 596, -295, -43, + 295, 2, 82, -110, 389, 490, 224, -62, 307, 1027, -228, -300, 381, -42, 600, 144, 280, 338, -110, 237, 695, -189, -835, 588, 172, -275, 80, -1273, 849, -8, 527, -334, 274, 39, -507, -483, -66, 94, -374, 2, 58, -69, -124, -78, -409, -68, -246, 3, -128, -37, -147, 247, -183, -140, -264, -128, -302, -56, 68, -168, -19, -138, -149, -162, -9, -135, -100, 49, -43, 131, -93, -192, -210, 1, 37, -133, -26, -60, 66, -284, -543, -27, 847, 415, -1090, 167, -197, 91, 179, -57, -562, 74, -87, 485, 948, -161, + 305, 620, -28, -180, -160, 243, 946, -24, -65, 773, -316, 205, 2, -18, -203, 288, -868, 22, 275, 629, 675, -560, 24, 605, -36, 1130, -411, -561, 77, 820, 147, -638, -296, 183, -1, 354, -921, 108, 43, -197, -667, -597, 159, -184, -39, 29, -694, -734, 157, 111, -736, -253, -478, 427, -1165, -445, 386, -712, 391, -194, -282, 385, -117, 579, 555, 122, 345, -158, 72, -414, 448, -322, 268, -433, 321, 19, 145, -39, 5, -250, 297, -327, 59, 35, 168, -358, 188, -146, -98, 111, -73, -169, 243, 100, 259, 112, + -24, -122, -120, -33, 51, -170, 63, -124, 63, -342, -176, -141, 178, 202, -110, 46, -48, -285, 616, 1, 341, -643, -48, -609, 638, 284, 835, 590, -297, 114, 660, 340, 336, 217, -561, -159, 275, 46, 325, -713, -531, 325, 1070, 147, -354, 678, 192, 424, 111, 85, -604, -613, 11, 12, -1058, 87, -218, -53, 335, -411, 253, 833, 87, -1354, -975, -157, -301, -335, -11, 248, 214, -330, 375, 358, 322, -208, 277, -151, -353, -82, 309, -1009, -232, -455, -528, -208, 141, -267, -29, 1116, 633, -427, 3, 14, -193, -197, + 97, 749, 272, 115, -233, -166, -389, -445, -477, -107, 60, 150, -168, 134, -41, -107, -42, -126, -419, -102, -5, -104, -363, 48, -132, 397, -200, 136, -41, 165, -3, -317, 26, 385, 57, 346, -95, 178, -111, 114, -25, -234, -106, -23, -43, -44, -2, 228, 436, -607, -155, -258, 161, 1268, 200, -625, 164, 560, -121, 523, 666, -345, 157, 336, 229, 14, -99, -207, 98, 395, 203, 369, -555, -853, -92, 380, 334, 273, -98, -787, 252, 174, 1178, 1239, 294, -922, 666, -351, -944, -221, -1117, -850, -376, -410, -866, 151, + -349, -991, -907, 262, 588, -97, -766, 227, 21, 245, 481, 469, -592, 764, 524, 67, 210, 532, -28, 1391, -992, -474, -34, -1131, 928, 68, 1167, 361, 261, -59, 231, 495, 19, -460, -8, -245, 185, 179, 333, -139, -426, -2, 395, 188, -253, -126, 208, -283, -1, 7, 364, 143, -198, -85, -225, -364, -316, -16, 70, -180, -132, 44, -181, 287, 140, -2, 173, 578, -218, -108, 66, 156, -309, 340, -112, -9, 60, 253, 425, -617, 162, -1233, -335, -76, -304, 1356, 427, -359, -852, -431, -351, -539, -397, 208, -1244, -267, + 912, -107, -103, -949, 905, 450, 19, -359, 385, 192, -217, 414, -642, -169, -329, 185, -151, -404, 458, -344, 191, 14, -625, -388, -98, -780, -768, -1026, -266, 471, -346, -187, 591, -721, -595, 640, -6, -36, 575, 9, -494, -283, 193, 417, -638, -199, 774, 336, 747, 388, -154, 395, -31, -1013, 317, -766, 555, 98, 202, -322, -878, 185, -132, -760, -306, 342, -388, 17, 118, 249, -249, 14, 35, -65, 157, -113, 87, 313, -59, 108, 80, -201, 62, 151, 84, -150, 204, 144, -17, -211, -435, 90, -344, 279, -351, 230, + 284, 15, 15, 10, 161, 27, -151, 337, 267, -132, -211, -352, 924, 323, 34, 113, -242, 367, 570, 1444, 1261, 109, -556, 257, 731, 209, 566, 409, 274, -428, -550, -661, -46, 245, 465, 938, 496, 601, 349, 557, 281, 537, -359, 101, 1013, -27, 780, 207, 631, -1001, -163, -295, -295, 233, 390, 725, 1173, 983, -349, 174, -1303, 316, 299, 1147, -913, 725, -237, -639, 489, 151, 408, 718, -234, -920, 476, -592, -812, -386, 1085, -943, -1339, -676, -222, 706, -74, -481, -925, -698, 442, -63, -18, 598, -652, 186, 668, 260, + 447, 648, -439, -221, -371, 495, 109, 255, 180, -446, 553, 137, 87, -219, -811, -774, 77, -369, -154, -350, -305, -134, 142, -5, -343, 436, 365, -49, -388, 63, 232, -277, -126, -159, 2, 188, -88, -192, -156, 132, 110, 212, 264, -140, 151, 164, 906, -286, -1003, 71, -419, -1433, -725, 1880, 263, -849, -933, 105, 16, 389, 488, -657, -437, -1049, 244, -380, -252, 1603, 344, -221, -1654, -107, -883, 875, 1081, 114, 840, -991, -390, -626, -148, 1637, 2038, 326, -544, -728, -1472, 20, 190, 1780, 993, -260, -2927, -1516, 252, -281, + 2569, 861, -1233, -513, -2201, -696, 77, 1439, 1485, 1667, 79, 395, -176, 144, 2051, -757, 1507, -365, -1548, -463, -1641, -527, 2149, 978, 1535, -508, 1204, -1347, -215, 321, 641, 1277, -431, -27, 80, -121, 197, 341, -365, 56, -383, -694, 312, 564, 314, -73, -417, -929, -915, -482, 310, 856, 482, 663, -900, -1179, -910, 103, 1033, 1147, 881, -525, -2244, -1441, 44, 1130, 2437, 945, 200, -1109, -1463, -508, -466, 1280, 1415, 530, -84, -1228, -921, 282, 423, 1041, 505, -534, -373, -635, -299, 296, 271, -1302, 1444, 3, -377, -2245, -605, -606, + -1013, 2174, 23, 974, -1487, 825, 693, -669, 435, -129, 389, 0, 1112, 393, -1079, 652, 538, -4, 751, -555, -285, 942, 661, 627, 314, 546, -1625, 1419, -816, -520, 311, -1141, 1667, -474, 168, 1203, 43, -184, 656, 668, 1181, -289, -1094, -1117, 126, -404, 519, -676, -326, -458, 336, -2097, 37, 1554, 433, 632, -56, -173, 412, -555, -631, 389, 219, -684, -756, 2888, -310, -942, 265, 1353, -35, -1070, 442, -202, -402, 870, 1109, -812, -1323, 297, 321, -308, -790, 37, 401, -124, -127, -55, -135, 210, 238, -275, 31, 117, 61, -166, + 62, -12, -366, 262, 114, 510, 255, -197, 210, -103, 303, -24, -77, 414, -102, 283, -82, -330, -27, 373, -104, 425, -404, 535, 127, -389, 163, 6, 199, -68, -154, 420, -1120, 399, 1767, 2783, -1231, 907, -1838, -542, -1120, -153, 1711, 1816, 1443, -45, -1153, -697, 628, 47, 315, 949, -17, 472, -1208, -308, -698, -850, 467, 389, 26, 851, -722, -26, 191, -1018, -28, 72, -644, -243, 241, -430, 959, -314, 1454, 1100, -717, -201, -997, -1139, -1479, 473, 682, 1976, 1507, 704, 957, 183, -1088, -719, -609, -740, -157, 414, -40, -509, + 132, -513, 323, 736, 143, -768, 600, -369, -392, -769, 397, 341, 174, 94, 1743, 1332, 1089, 185, -253, -1476, -309, -155, 1450, 830, 377, 438, 1255, -201, -501, -679, -569, -269, -128, 113, 14, 8, 652, -77, -391, -241, -135, 12, 322, 581, 253, -76, 358, -605, 234, 551, 224, 1088, -449, 4, 184, -458, 116, -727, -40, 250, 6, -210, -3020, -1750, -1008, 1737, 816, 4623, 4347, 4490, 4545, 4868, 3426, 1787, 2595, 1557, -775, -1443, -2222, -4324, -3893, -4039, -2925, -2967, -2196, -1824, -967, 97, -1708, -876, -353, -272, -924, 235, 1156, 1295, + 483, 1530, 1952, 480, 384, 383, 1919, 1996, 2524, 2822, 2474, 2803, 4263, 1725, 3328, 4537, 2920, 3442, 2710, 1353, 1618, 1785, 1591, 2157, 2130, 1318, 259, 654, 1256, -81, 147, -606, -693, -2143, -961, -3713, -4662, -3738, -4254, -5795, -5592, -3320, -6247, -5673, -5174, -5856, -4937, -3770, -4729, -3484, -963, -2314, -2856, -1133, -1128, -933, -1024, -460, 283, 583, 1141, 1472, 1693, 1904, 1972, 2780, 1706, 3277, 3674, 1745, 3414, 3242, 2060, 2484, 3612, 2452, 4075, 3072, 3863, 2700, 2458, 2543, 2381, 1865, 2143, 1858, 1477, 1108, 1087, 879, 387, -277, -210, -159, -1281, -2096, + -2005, -2064, -2238, -2078, -2307, -1675, -1717, -1407, -1031, -818, -908, -893, -665, -484, -507, -672, -346, -185, -336, -549, -326, -238, -269, -395, -225, -60, 113, -160, -101 }, + {329, 17, -22, -11, -26, -168, -171, 164, 39, -98, -149, -72, -113, -195, 249, 30, 90, 124, 359, -9, 57, -86, -32, -66, -234, 52, -71, 23, 162, -64, -16, 35, 17, -39, 8, -216, 45, -5, -78, 68, 31, -145, 229, 8, 33, 214, -83, -92, -211, -107, 145, 9, 155, -76, -172, 75, -161, -72, -310, 127, 108, 66, 93, 212, 55, -93, 114, 176, -116, 87, -1, -37, -60, -48, 119, -24, 132, -67, 53, -41, 47, 96, -53, 35, -37, 78, 62, 53, -27, 18, 1, -43, 21, 76, 13, 26, + -46, 30, -25, 18, -35, 8, 44, -130, 35, -81, -165, -16, -195, -236, -149, -113, -261, 11, -94, -52, 80, 278, 25, -66, -32, 45, -6, 115, 197, -17, 221, -25, -15, -26, 126, -167, 26, 20, -41, -9, -100, -166, 228, -77, -17, -41, 100, -108, -93, 40, 34, 159, -109, 131, -77, -131, -10, -54, 36, 71, -3, 93, 44, 68, -88, -103, -171, -125, 16, 204, 26, 166, 43, -85, 114, 54, -123, 216, 36, -203, 53, 92, 18, 61, 53, -144, 52, 50, 35, -8, 106, 36, -27, -35, -1, 42, + -1, 58, -2, 3, 33, -14, -32, -20, 6, -28, -30, 37, -4, 36, 31, -9, -3, -242, -215, 46, 24, 180, -139, 185, -95, -42, -292, -19, 19, -101, -18, 156, 147, 221, -55, -35, 137, 64, 123, -301, 296, -65, -6, 46, -38, -3, -28, -22, 183, -6, 241, -43, -101, -203, 22, -92, -82, 138, 106, 145, 3, 17, -217, -156, -4, 194, 66, -26, 63, -83, 206, -12, -182, -229, -83, 254, 191, 196, 90, 6, -216, -97, -32, -126, 130, -24, -62, 112, -307, 90, -41, 72, -25, -88, 137, 52, + -146, -155, 77, -41, 90, 24, -67, 47, 57, -3, 21, 0, 6, -26, -1, -43, 0, -37, 60, 33, -47, 23, -12, 16, 16, 21, -35, -30, 10, 22, -64, 61, -69, -133, -22, -103, 47, 166, 65, 6, -68, -387, -255, -8, 112, 136, 8, 27, -55, 134, 59, 108, -169, 160, 92, -182, 68, 167, -9, 54, 27, 151, -118, 90, -15, -20, -145, 9, 155, -99, -72, -136, 182, -18, 35, -143, -407, -119, 60, 37, 150, -108, -67, -62, -27, -131, 4, -118, 266, 93, 217, -220, -43, -91, 203, -62, + -38, -169, 105, -4, -113, 173, 54, 21, 199, 42, -174, -25, 21, -48, -59, 1, -148, 293, 121, 42, 183, 79, 72, 134, -39, 113, -65, 19, 12, 7, -34, 20, 9, -11, -20, -19, 14, -15, 1, 97, 10, -3, -2, -2, -13, 77, 20, 108, -86, 69, 6, -44, 184, 140, -14, -250, -334, -258, 96, 0, -144, -38, 17, -33, 376, 65, -272, -72, -81, 14, -128, 212, -159, -208, 195, -82, 53, 51, -89, -245, 33, -131, -115, -120, -15, 191, -26, -44, 282, 52, 43, -365, -41, 194, 227, -126, + 62, 31, -359, -48, -22, -37, 90, 4, -202, 26, -161, 154, -55, 198, 39, -229, 101, 428, -167, 3, -320, 77, 268, -482, 68, -35, -42, 119, -78, -126, 226, 215, -187, -23, 141, -64, 33, 66, 41, 13, -55, 119, -4, 78, 3, 107, 73, 67, -6, 22, 119, 12, -25, 41, 37, 13, 99, -57, 31, 15, -23, 6, 35, 24, 11, -11, 322, 40, 144, 228, -281, -86, -215, 108, 125, 248, 480, 75, -366, -34, -92, -38, -158, 1, -18, 181, 144, 53, -13, 7, -56, -42, 208, -68, -28, 155, + -19, 91, -15, 198, -151, -299, 372, -22, 88, -280, 21, -85, 413, 65, 187, -39, 166, 111, -373, -59, -210, -180, 25, 263, 33, -53, 408, -43, -231, -176, -121, 200, 617, -1, 171, 44, -196, -43, 3, 183, 281, 26, 226, 201, -370, 12, -66, -9, 185, -83, 48, 87, -28, -190, -132, -277, 66, 110, -14, 43, 41, 34, -3, -86, 18, 41, -5, 38, -45, 74, -6, 37, -20, -13, -36, 9, -19, 13, 61, 98, 81, 12, 21, 60, 33, 2, 34, -110, -476, 108, -48, 163, 105, 443, 89, -84, + 106, 339, 376, 155, 264, 271, -210, -163, -340, -368, 40, 158, -311, -221, -17, -360, -298, 151, 48, -160, -107, -236, 195, 143, 322, 612, -68, -174, -66, -302, -4, -236, -261, 313, 35, 43, -404, 416, 82, -260, -84, 214, 14, 46, -7, 34, 121, -199, 232, 5, -164, -46, -280, 43, -288, -256, 220, 227, -229, -364, 92, -176, -27, -98, 122, -105, 161, 51, 195, -45, 146, 75, -327, -115, 80, 42, 5, -162, -92, -49, 107, -63, -55, 4, 86, 67, -4, -5, -94, -51, 17, -22, -10, 76, 8, -6, + -69, 66, 21, -25, -14, -47, -9, -51, 69, -18, 32, -20, -182, -198, 239, -74, -57, 139, -200, -210, 242, 324, 5, -20, 109, -279, 475, -292, 34, 227, -109, 212, 255, 84, -270, 290, -44, 109, -212, -40, -402, 138, -239, 92, -414, 242, -303, -211, 172, 239, 80, 26, 9, -260, -242, -154, 628, 345, -100, -583, -83, 163, 339, -192, 27, -403, -139, -51, 104, 58, -91, -8, 176, -200, -11, -228, 123, 147, 434, 183, -211, 88, -117, -329, -41, 189, 27, 540, -309, -152, 84, -283, 144, 44, -53, 274, + 69, 120, 3, 9, -42, 135, 203, 48, -58, 147, -77, 46, -139, -48, 1, -185, -2, -72, -32, -72, -118, -56, 42, 46, 33, -40, -5, 80, -133, 13, 13, -414, -61, 85, 245, 119, 319, 58, -382, 243, -323, -346, 10, -31, 263, 327, 301, 439, 107, -453, 496, 271, -200, 382, -49, 47, -334, -115, -96, -148, 320, -536, -121, -252, -240, 45, 259, -122, -310, -328, -428, -432, -220, -73, 187, -339, -441, -260, -111, -216, -144, 385, -216, 37, 204, -348, -206, -234, 378, -160, 247, 542, -52, 122, 53, -165, + -217, -148, 256, -37, 293, 18, 222, 52, -372, 462, -199, -58, -395, 243, 519, 88, -71, 138, 60, -331, -154, 20, -78, -35, -142, -139, -23, 25, 21, 242, -27, 31, -119, 92, 10, 182, 79, 82, 35, -21, -78, -65, -108, -23, -81, 55, 28, -1, -56, -48, -41, -16, 19, -19, 100, 768, 484, 352, -255, -553, -149, 336, -524, -285, 10, 411, 295, 239, -304, 229, -82, 229, -60, 595, 357, -29, -547, -56, 415, 353, 15, 721, 326, -145, 0, 50, -85, -201, -278, -43, -779, 221, -268, 37, -28, 204, + 290, 8, 77, -348, 248, -126, 516, 12, 74, -1258, -54, 336, 173, 357, -122, -352, 195, 68, -288, 274, 56, -276, 4, 12, 96, -102, -460, -461, -19, -166, 155, 163, 68, 173, -564, -193, 29, 125, 136, -225, 177, 41, -81, 59, 160, -106, 21, -34, 66, -108, -169, -57, 201, -152, 21, -114, 80, -47, 71, 116, -14, -115, 94, -20, -135, -86, 48, 62, 7, -55, 27, -11, 83, -39, 161, -55, -10, -530, -853, 138, 295, 307, 7, 709, -505, 166, 97, -144, -448, -189, -255, 301, -132, -276, -456, -42, + -169, -87, -344, 183, -22, -161, 185, 235, 279, -362, 661, 40, -95, -407, -382, -78, -51, -397, -414, -318, 266, -184, 442, 141, 738, 253, 280, -95, 395, -69, 95, 560, -171, 203, -675, -859, 186, -41, -545, 33, 13, -741, 208, -219, -147, -290, 279, -271, 15, -30, 134, 0, -406, 237, -59, 94, -513, -707, -630, 34, -150, -716, -151, 686, 361, 159, 130, -318, 10, -73, 30, -105, -85, -4, -9, 27, -2, -222, -54, 58, -42, 106, 174, 146, -3, -25, -77, 232, 133, 153, 127, 93, -18, -89, -81, 181, + -141, 108, 152, 59, 74, 12, 44, -123, 10, -36, -106, 50, 137, 519, 678, -19, 180, 429, 351, -35, -863, 592, -58, 162, -176, 304, -21, -373, 105, 680, 104, -445, 393, 281, 184, -335, 362, 268, 32, 432, -171, 116, 695, 507, 21, 161, 342, -656, -132, -42, -102, -575, 148, 174, 34, -446, -6, -764, 42, -546, -107, 281, -232, -330, -265, 162, 134, -305, 122, -110, 377, -196, -220, 196, 352, -34, 154, 135, -832, -20, -61, -426, 45, 542, 166, -153, -66, 396, 279, 173, -112, 629, 7, -523, 70, 629, + 327, 319, 189, 34, -155, -178, 114, 102, 149, 236, -59, 186, 114, 18, -32, -19, 84, -85, -33, -84, -2, -40, 92, -190, 32, 65, 20, 145, -257, -107, 43, 49, -26, 148, -55, -49, -72, 17, 95, 113, -143, 21, 65, -131, -84, -72, 332, -763, 324, -790, -937, -607, 40, -518, 504, -159, -631, -22, -160, 85, 118, -148, -81, 415, -124, 158, -226, -227, 662, -224, -76, -21, 151, 407, -830, -57, 445, 429, 403, 52, -150, 854, 291, 269, 334, 151, -120, 5, 505, 162, -356, 187, 929, -491, 642, 234, + -979, 236, 659, -72, 297, -5, -741, 374, 924, 51, 629, -381, 557, 459, -14, -84, 512, 270, -670, 671, -164, -154, 409, -198, -240, -300, 106, 34, 114, -29, -134, 504, -449, 77, -92, -147, -366, -349, 207, -27, -225, -312, -260, -444, -314, -18, -217, -131, -31, -230, 98, -203, -208, -57, 53, 74, -104, -13, -326, 131, -342, 263, -87, -21, -149, -82, -16, 393, 198, -40, 95, 270, 148, -148, -69, 107, -133, 221, 51, -85, -297, -527, 1266, 627, -1477, -609, 157, -245, 427, 503, 539, 617, -379, 1169, -176, 30, + -383, 441, 587, -423, -483, -101, -278, 52, 234, 36, -304, -115, 481, -38, 243, 59, 579, 868, 329, -417, -978, -82, -166, 110, -227, 323, 542, 49, -201, -447, 1070, 936, -124, 457, -255, -341, -1030, 570, -481, -110, -31, -321, 180, 633, 97, -278, 300, -128, -425, 647, 131, -895, 1148, -777, -417, 445, 456, 383, 6, -957, -83, 85, -56, -314, 185, -164, 68, 120, -398, 460, 320, 154, 61, -188, -140, -9, 162, 15, 125, -74, -308, 93, -451, -143, 143, -133, 247, -209, -31, -178, 197, 17, 242, 282, 193, 8, + -213, 155, 261, -52, -31, -280, -124, 325, -111, 220, -19, -122, 115, 109, -7, -185, 337, -408, 46, 583, 173, -791, -634, -152, 990, 103, -475, -1277, -355, -58, 303, 879, 673, -94, 8, 578, 470, 22, 129, -1722, -1086, -529, -851, 74, -475, 762, -175, -60, -4, -307, -350, 552, 344, 195, -78, -263, -236, 275, -617, -231, 109, -214, -301, 258, -893, -1249, 297, 390, 485, -729, -388, 403, 153, -1217, -1068, 65, -517, -535, 199, -983, 498, -380, 410, 393, -244, -554, -1281, -449, -385, 719, -622, -406, 219, 735, 429, 4, + -250, -82, 220, -220, 743, -460, -361, -174, -64, 204, -547, 322, 247, -229, -383, 89, -22, 372, -478, -624, -158, 99, -345, -52, -418, 18, 102, -188, 291, -79, -206, 90, -140, 85, -119, -434, -19, 32, 413, 324, -199, 1, -23, -245, -313, 151, -80, 506, 698, -113, -936, 424, -139, -392, -807, 241, 348, -1200, 455, 426, 1085, 97, -269, 67, -1322, -385, -158, 17, 245, -453, 814, 325, 1005, -201, 884, 566, 351, 803, 409, 530, 685, 30, -892, -844, 174, 966, 700, -1288, -35, -218, -179, -135, -891, 228, -634, 572, + -423, 1291, -338, -1852, -195, -638, 370, 274, 529, 1200, 270, -163, 660, -388, 1344, 226, 900, 422, 84, -340, -306, 2204, 15, -1522, -304, 1216, -725, 159, -333, 534, 1119, 645, -1286, -83, -1266, 176, -172, -751, -86, -203, -330, -2, -646, -712, 249, 269, -33, -798, 579, -707, -1092, -466, 275, -271, -486, -628, 118, 266, -568, -435, 214, -252, -457, 376, 303, -27, -55, 22, -102, -187, -197, 74, -421, 249, -148, 95, -537, 606, 263, -1258, -472, -1429, 218, 1260, -928, -871, 833, 391, -1425, -1351, 433, 71, 198, 460, -56, -406, + -206, 863, -618, 1066, 174, -249, 228, 616, -2, -184, -1139, -500, 127, -611, 527, 787, 57, 130, -815, 973, -341, -435, 794, -305, 2, -569, -57, -400, -1403, 482, -157, 1043, 1338, -20, -238, -847, -267, -236, 1272, -1209, -853, -2003, 48, -829, 231, 695, -374, -105, 1368, 882, 625, 108, 63, 1038, -1125, -49, 321, -133, 622, 298, 2642, 418, -721, -40, -494, -1301, -515, 48, 221, -250, -269, -246, -928, -12, -76, -493, 132, 331, -796, 53, -539, 212, -36, -188, -106, 47, 471, 275, 22, 521, -318, -67, -151, 490, 329, 233, + 504, 235, -357, -171, -57, 250, -450, -115, 16, -508, -157, 92, 1220, -897, 311, -308, -435, -425, 1845, -248, 906, -732, 1259, -437, 19, 678, 728, 1736, 83, 283, 256, -738, 897, 277, -526, 873, -364, 1099, 841, -260, 732, 33, 684, 137, 1159, -707, 580, -1170, -290, 393, 1257, -55, 104, 540, -1, -424, -1508, -934, 262, -649, -25, 477, -1313, 805, -54, 957, -451, -895, -152, 2474, 566, -2250, 401, 573, 145, 2449, -143, -1804, 1878, -631, -115, 2052, -215, 1350, 223, -1220, 58, 2098, -1707, 899, -1043, -1183, 883, 528, -1076, -396, + -666, -364, -386, 196, -655, -135, 271, -678, -481, 354, -789, -192, 290, 112, -176, 600, -251, -200, -281, -539, 272, -347, -394, -92, 79, 801, 13, 229, -649, 71, 854, -154, -90, -63, 52, 63, 601, -308, -352, -177, -554, -667, 190, -330, 147, 219, -87, -1808, -138, 286, -677, -191, -1900, 1210, 1849, -805, 263, -1400, -4106, -779, 192, 2092, 1752, -1706, -1525, -1532, -1263, -885, 1088, -180, 2394, 1628, -480, -1970, -4944, -3192, 226, 5501, 4181, 774, -2154, -5396, -5536, -393, 3228, 5001, 5474, 575, -1768, -2229, -2969, -2664, 182, 1861, 3447, 2383, + 1898, -2456, -3021, -3541, -4274, 491, 5128, 5063, 1031, -1813, -4803, -6292, -2128, 496, 2348, 5764, 2123, -4, -3171, -2588, -1090, 1318, 2256, 3963, 1039, 2074, -163, -2644, -2191, 131, 2556, 2790, -1264, -2414, -2963, -738, 488, 708, 456, -1477, -1280, -528, 951, 3, 20, 216, 762, 616, 476, -259, -1805, -1200, 138, 934, 1730, 839, -484, -1143, -1511, -947, -606, -792, 1732, 1808, 1985, 1647, -761, -3159, -2676, -1444, 1222, 3998, 3878, 216, -2450, -3834, -3450, -225, 1919, 1803, 876, 789, 47, -1024, -1220, -1539, -224, 1415, 1727, -488, 883, 678, -1556, 16, 801, -644, + 886, -37, -162, -65, 179, 672, -264, 792, 540, 322, 360, 272, -68, -455, 743, -11, 453, -271, 404, -139, -57, 273, -366, -387, 58, -167, 601, 593, -543, 271, -323, 373, 9, 245, 94, 318, -387, 268, -445, -194, -61, -50, 361, -680, -134, -281, -605, -54, -237, 145, 577, -173, -798, 129, 496, 967, -42, 85, -521, -396, 451, 41, -171, 14, 791, 350, 250, 427, 729, -826, 330, -141, -1232, -144, 953, -176, 848, -38, 526, -623, 385, -423, -126, 834, -240, 77, 18, -3, 305, -1, -125, -71, -23, -59, 153, 239, + 350, 39, -300, -135, -387, 145, -402, 216, 165, -124, 224, 71, -416, 6, -1, 132, -713, 248, 158, 61, -20, -198, 233, -363, 365, -30, -44, 96, -175, 306, -345, 173, -568, 1451, 2500, 214, -1637, 549, -124, 2029, 953, 1995, -188, -947, -258, 443, 838, 657, -370, 65, 355, 259, 791, -553, 133, -745, -121, 12, 191, 390, 85, -317, 605, -55, -536, 732, -126, -260, 193, -107, 569, 910, 22, 239, -306, -189, 525, 382, 435, 88, -277, -570, -587, -636, 509, 562, 548, 820, 876, 381, 46, -764, 469, -81, -696, 860, + -64, 566, 296, -859, 238, -254, 184, 584, 108, -719, -512, -423, -756, 462, -47, 795, -9, 131, 15, -427, -276, 152, -647, 197, -7, -124, 233, -358, 218, 143, -30, -303, 399, -100, 354, -597, -442, -259, -233, 284, -120, -73, -77, -299, -163, -183, 0, 555, 74, -140, -9, -322, 235, -179, -32, -122, 263, -22, 34, -56, -191, -884, -1972, 132, 2735, 3613, 3105, 2139, -89, 131, -1580, -1884, -3161, -2392, -2538, -825, 217, 826, 1392, 3449, 2873, 1931, 628, -306, -1244, -930, -1294, -1650, -914, -944, -1158, -542, -761, 160, 542, 451, + 1471, 1354, 1206, 786, 914, 572, 1095, 262, 948, 40, -245, -1651, -715, -1990, -2309, -2586, -2024, -1523, -537, 388, 1487, 1580, 1249, 2564, 2082, 2220, 2061, 1918, 774, 1240, -495, -1237, -1292, -3053, -3046, -2948, -3133, -2588, -881, -437, 701, 1750, 1912, 2330, 2812, 2504, 1956, 1772, 1310, 486, -44, -1052, -1541, -1560, -1773, -1492, -1667, -1744, -1466, -1148, -570, 66, 764, 1461, 1375, 1350, 1599, 1760, 1370, 1365, 616, -644, -463, -1130, -1429, -1200, -978, -695, -864, -633, 83, 180, 311, 769, 687, 429, 114, 288, 304, 85, 383, -238, -251, -212, 150, -46, + 16, -24, -40, -284, -185, -87, 277, -9, 131, 31, -128, -179, -70, -122, 53, -21, 55, 18, 83, -68, 77, -41, 55, 32, 151, 36, 186, 21, 39 } + }, + { + {317, 169, -19, 111, 28, 25, -347, -151, -172, 135, -19, -113, 123, 127, 8, 122, -51, -4, -7, -75, -39, -167, 86, -247, 103, -129, 105, 196, 90, -37, -55, 145, -23, 7, 137, -147, -4, -50, -85, 18, -21, 30, 141, 232, -74, 4, 193, 15, 51, -71, -108, -16, 32, -182, -48, 95, 12, 34, 56, -26, -57, -54, -64, 70, 58, -34, -104, -128, 63, 1, -106, 112, -25, -7, 17, 32, -53, 67, -72, -24, 88, -61, 35, -103, -79, -38, -25, -7, 14, -41, -52, -5, -29, 12, -11, -9, + -14, 11, 3, -11, -21, -13, -8, -2, -11, -7, -16, 15, -24, -15, -114, -31, 1, -108, -109, -66, 262, -184, -76, -129, -234, 87, 40, 9, 201, 190, 191, 62, -36, 30, 144, -62, 62, 73, -170, 242, 47, 75, 179, -69, -178, 12, 121, -85, -39, -114, 120, -3, -12, -198, -9, -24, 122, 62, -109, 216, 80, 45, 76, -35, 121, -47, 6, -151, -180, 144, 113, 200, 19, 54, -155, -240, -118, -72, -70, -111, -96, 49, -28, 73, -90, -35, 40, 45, -27, 122, 37, -92, 185, -72, 57, 233, + 50, 32, -72, 3, -79, -95, -15, 53, -1, 7, 3, -26, -8, 2, -23, 54, 35, -21, -5, 1, 14, 8, -36, -20, -9, 4, 16, -17, -26, 22, -13, 17, -9, -15, -18, -226, -210, 123, 28, 173, -267, -38, -106, 29, 318, 181, -278, 105, 27, -116, -129, -158, -256, 9, 31, -95, 46, -55, 10, 77, 60, 165, -144, 260, -158, 151, 120, -97, 70, 13, 108, -43, 57, 99, 33, 15, -39, 77, 24, -35, 185, -242, 17, -146, 292, 103, -254, 99, 333, -313, -149, 38, -25, -118, 100, -41, + 222, -186, -18, -62, -12, -11, 215, -199, -66, -21, -205, 111, 86, 222, 91, 189, 170, 28, -68, 54, -6, -23, -51, -5, -78, -31, -17, -109, 70, 6, -76, -13, -62, 6, -2, 42, -14, -25, 5, -35, -1, 37, 14, -8, -25, 101, -155, 20, -98, 103, 37, -157, 452, -288, 90, 490, -347, 161, -10, 160, -43, -296, -65, 245, 219, 61, -3, 124, 60, 4, 102, 103, -85, 131, -37, 207, -167, -257, 54, -224, 77, 4, -65, -72, -103, -153, 29, 54, 5, 39, 44, -94, -198, 155, 34, 25, + -10, 228, 46, 95, 240, -148, 58, 10, 72, 168, 132, -220, -193, -50, -110, -25, 8, -95, 50, -176, 8, -169, 83, 83, -98, -129, 14, 71, 13, -149, 21, -85, 64, 53, 24, -28, -42, 30, -4, -16, -1, -38, -32, -102, -25, 93, 41, -27, -18, 65, -22, 20, -29, 1, -7, 4, -37, -25, -14, -10, -13, -15, 3, -10, -23, -19, 12, 143, -61, 129, -24, 65, -74, 9, -49, 43, -24, -282, 214, 138, 354, -232, 145, -287, -49, 175, 190, -202, 58, -233, 17, -274, 90, -205, -254, -228, + 114, -184, 8, -216, 28, 32, -33, -158, 99, 139, 83, 65, -169, 92, -177, -56, 109, 4, -25, -48, -7, 112, -131, -252, -53, 78, -53, -187, -189, -268, 64, -77, -251, 179, -161, -157, 303, -109, -60, 25, -55, -99, 24, -166, -83, -140, -110, -46, 90, 230, 12, 138, 11, 103, 71, 185, -14, -4, 19, 69, -38, 8, -18, 136, -6, 65, 9, 26, -24, 30, -84, 91, 2, 2, -68, -17, -92, 44, -47, 31, -13, 92, -45, 18, -80, -64, -7, -28, 22, 234, -337, 61, 295, -109, 323, 90, + 20, -94, -226, -148, 385, -207, -2, -71, 30, 232, 208, -126, 300, 300, -141, -74, 183, -154, -135, -10, -207, -5, -61, 27, 360, 123, 19, -165, -479, -58, 269, 66, -180, 138, 219, 191, 231, -379, 77, 18, -188, 102, -169, 121, -96, 150, 336, 444, 280, 129, -184, -51, -220, -231, -49, 260, 64, 4, 61, -255, 66, 32, -2, -129, 69, 140, -148, -278, 633, 82, -114, 39, 68, 289, -58, 79, 98, 143, -100, -49, -108, 51, -30, 56, 52, -37, -59, 107, 14, 28, -21, 65, -111, -79, -54, -20, + 124, 46, 83, 63, 65, 5, 14, -28, -78, 76, 18, 32, -174, -49, -107, -41, 81, -110, 499, -49, 141, 359, 47, -53, -235, 132, -127, -158, -474, -212, 95, -25, -92, -342, 119, 189, -269, -140, -72, -281, 112, 21, -149, -121, -51, -380, -136, 190, 316, -239, -300, -86, -18, -242, -200, 78, 133, -266, 535, 4, 217, -120, 204, -137, 61, -378, -80, 156, -379, 106, -86, -191, -431, -8, 239, 5, -454, -67, 83, 185, 333, -121, 149, 392, 130, 50, -177, -31, -111, 26, -132, 33, -249, -30, 191, 57, + 37, -106, -193, 110, -36, 113, -41, 17, -25, -53, -51, 75, 28, -11, -25, 6, -75, 38, -77, -93, -60, 37, 5, 4, -72, 60, -9, -34, -102, -29, 6, 17, 42, 112, 35, 29, 55, 148, -48, -147, 180, 33, -278, -434, -356, -449, 387, -234, -59, 129, -427, -176, -298, -131, -96, 194, -375, -198, 117, 149, 214, -2, 6, -65, -2, -86, 52, -294, -161, -259, 179, 91, 138, 183, -361, -25, -41, 329, -125, 104, 176, -66, 189, -124, 211, 300, -119, -19, 254, -218, 352, -151, -565, 89, 290, -110, + 32, -9, 222, 281, -286, -123, 65, 194, -337, -253, -205, 407, -11, -465, -103, -193, 157, 22, 118, -174, 286, 13, 50, 84, -268, -90, 18, -33, -69, -77, 73, -73, -74, 57, 83, 44, -158, -13, -64, -45, 63, 58, 130, -17, -66, 51, -149, -17, -3, -95, 11, 10, -38, 19, -169, -30, -22, 19, 20, 71, -10, 79, 43, 41, 4, -261, -106, 179, 66, 257, 88, 126, -505, -198, 197, -133, -95, -168, 52, 263, 69, 63, -339, -115, -62, 125, 297, -361, 170, -294, -78, -271, 35, 37, -14, 113, + -253, -73, -237, -97, 4, -11, -297, 170, 191, -71, 227, 446, 46, 338, 433, 34, 14, 104, -91, 143, 29, -95, -146, 544, -57, 318, 140, -160, -186, -129, 152, -124, 197, 479, 243, -64, 8, -402, -277, -245, 377, 592, -260, -2, -241, -40, 362, -115, -22, -571, -77, -104, -61, 216, 15, 45, 66, -115, 91, 48, 81, -69, 117, -57, -13, -145, -34, 125, -47, -4, -25, 121, -31, -88, 51, 53, 30, 42, 44, -48, 12, 85, 147, 128, 83, 44, 9, 11, -93, -9, 58, -57, 61, -21, 21, 80, + -35, 341, 947, 413, -129, -33, -176, 437, -437, -249, -669, -8, 330, 410, 74, -163, -401, -294, 296, -60, 469, -1, -151, 221, 81, -4, -117, 306, -57, 264, -4, -144, 577, -138, 234, 567, 200, -24, -277, -52, -452, -530, 115, 339, -81, 47, -578, -220, 335, 181, -150, 110, -172, -83, -264, -443, 27, -105, -313, -511, -441, -144, -405, 186, -181, 64, 52, -4, 10, -66, -91, 262, 521, -352, 63, -148, 188, -197, -8, -142, -64, 479, 348, 78, -54, 4, -196, 67, 195, -38, -170, -98, 169, -206, 19, 86, + 82, -73, -66, 72, 92, -71, 110, 63, 91, -11, 120, -14, 76, 36, 45, 27, -27, 140, -139, -22, 30, -43, -35, -67, 63, 4, -120, -46, 78, -87, -390, -441, 115, 170, 530, -448, 143, 138, -746, -34, 6, -623, -339, -220, 160, -49, 38, -176, 263, 414, 218, -58, -632, -275, -344, 129, 39, -277, -21, 218, -184, 377, -339, -10, -197, -632, 109, -269, -303, 236, 350, -392, 152, 464, -151, 204, 159, -108, 64, -513, 779, 307, 185, 743, -906, -67, -125, 97, 370, 385, 148, 184, 475, -45, -322, -560, + 217, -212, 21, 152, -112, 230, 609, -375, 284, -182, -174, 461, 35, 144, 447, 369, -162, -186, -393, -99, 2, 205, 214, 1, 51, 31, -8, 43, 49, 17, 121, -60, 18, 88, 48, 26, -55, 118, 76, 18, -67, -94, -223, 134, -9, -20, 67, -106, -13, 75, 102, 154, 86, 43, 42, -1, 111, 487, 570, 144, 351, -228, 165, 163, -940, 267, 303, 66, -300, -5, -581, 683, 410, -213, -230, -337, -178, 495, -500, -284, -76, -81, -109, 74, -331, -335, -200, -258, -71, -336, -47, -224, -742, -471, -184, -115, + 103, 127, -4, 24, 215, 106, 110, 525, 109, 180, 326, 705, 600, 35, -237, -457, 420, -100, 1132, 232, 508, -52, 65, -446, -17, 397, 228, 302, -339, -221, -436, -825, 480, -728, -88, 970, 66, 392, 186, 289, 11, -517, 509, -4, -455, -405, 17, 164, 343, 96, -399, 26, -77, 87, -155, -126, 74, 70, -121, 18, -37, -6, -161, -54, -49, 82, -40, -94, 135, -75, -29, -226, -242, 7, 10, -95, -60, 87, 64, -96, -160, 110, -673, 201, 250, -447, -350, 10, 274, 658, -36, -503, -513, -24, -291, 88, + 90, -562, -490, -920, -275, -265, -630, -423, -7, -290, -186, -163, -54, -618, -336, -379, -192, 193, -530, 41, 436, 525, -126, 145, 296, -515, 289, -222, 457, -221, 39, -238, -55, 916, -191, 346, -671, -109, -4, -632, 588, 24, -220, 425, -177, 110, 835, -331, -462, 317, -90, -940, 380, -1248, -673, 502, 388, 81, 262, 2, -10, -942, -510, -221, 83, -535, 129, 75, 218, -349, 18, 271, 202, 156, 15, 128, -309, -196, -210, -57, -46, -27, 244, -127, 127, 248, -125, 77, -200, -150, -12, 64, -180, 78, -225, 194, + -81, -39, 5, 174, -59, 70, -159, 139, 102, 321, 72, 264, -265, -88, -315, -161, -155, 1265, 693, 1, -652, 335, -680, -553, 101, 562, 1112, -175, 562, -201, 399, 674, 377, 430, 231, -127, -551, -571, -172, -540, -158, -100, -121, 430, -73, -1108, 65, 266, 256, 661, -68, -1322, 752, -592, 194, -130, 445, 647, -721, -51, -360, -630, 455, -314, -774, 303, 452, 743, 197, -117, 81, 608, -490, 960, -302, -269, -87, 584, -609, 55, 74, -1697, -252, 524, -244, 87, 236, 122, -83, 137, 582, 694, -551, 197, -404, -71, + 688, -16, -71, 24, -46, -358, 98, 22, -208, -530, 7, -128, 162, -246, -228, -289, 243, 54, 149, 118, 10, 87, -117, -244, 370, -39, -180, -8, -129, -83, -150, 17, 45, -24, 102, 267, -10, -68, -110, 22, -137, -80, 154, -120, -99, -147, -358, -203, 49, -188, -49, 725, 481, -1349, -766, 924, 1071, -576, -195, -1519, -839, 219, -69, 202, -807, -506, -553, 819, 1218, -59, 329, -198, -107, -16, 280, 527, 128, -188, -101, -124, -726, -412, -739, -98, 229, -311, 456, -338, -126, 708, -343, 398, 277, -130, -682, -494, + -406, 123, 1276, 224, 686, 808, 633, 468, 419, -703, 17, -115, 943, 448, 552, 984, -483, -662, 244, 833, -1411, -26, 113, 657, -1141, -1722, -305, 483, 122, 195, 541, 35, -381, -565, 20, 78, 113, 521, 773, 365, 58, 3, -7, 64, 79, -195, 286, 35, -259, -458, 58, -196, 100, 50, -40, 29, -189, 198, -101, 133, -203, -132, -363, -359, 19, 190, -160, 379, 12, 113, -113, 405, 35, 186, -199, -109, -62, -252, -49, 273, -472, 364, -19, -346, -614, 232, -299, -598, 430, 831, 253, -314, 491, 836, 307, 176, + 58, -88, 391, -690, 40, -995, 533, -801, -69, 439, 239, -455, 96, -527, 1091, 147, 353, 575, 1204, -491, 390, -570, 207, 440, 968, 236, -198, 1001, 133, -62, -573, 45, 622, -203, 597, -728, 1134, 1184, -1415, -29, -90, 317, -241, -177, 608, -505, -1508, 26, 1341, -1050, 532, -236, -134, -637, 1482, -87, 245, 145, -997, 1299, 101, 1157, -2271, 225, -214, -676, -184, 408, -529, 364, -476, -308, -626, 799, -304, 63, -668, 38, -491, -159, 229, -330, 159, 30, -453, 419, -186, 67, -194, 381, -279, 67, 26, -95, 493, -276, + -344, -191, -386, -529, -270, 61, 34, -379, -220, -252, -375, -289, 131, 96, -11, 959, 111, -728, 71, -1485, -343, 78, -292, -1184, -136, -776, -198, 718, 161, 940, 385, 357, 215, -317, 747, -378, -12, 358, 158, -457, 368, 156, 884, 369, -165, 541, -433, 729, 244, -794, -827, 428, 528, 225, 81, -384, -532, 164, -524, -778, -247, -128, -725, -263, 262, -488, -817, 232, 293, 32, -107, -43, -145, 295, 1370, 285, -53, -48, -495, -782, -357, 1139, 1211, 629, 108, 1112, 524, -246, -1549, -1170, -976, -1836, -1081, 265, 1487, -658, + 497, -736, 233, -56, 504, -235, -96, -655, -388, -156, -598, 757, -127, -387, -195, 83, -436, 311, 216, 492, 102, 144, -489, -553, -75, -407, -270, -476, -704, 43, -191, 50, 40, 538, 520, -191, -116, -228, 502, 347, 213, 87, -115, 301, -416, -155, -77, -458, -912, 481, -27, -283, -132, 343, 635, -271, 820, -939, 757, -94, 1012, -656, 583, -968, 841, -782, -336, 1179, 267, 948, 1346, 142, -113, -560, -50, 860, 211, -300, -953, 85, 183, 452, 270, 377, 229, -550, -887, -371, 851, 332, 2725, -863, -734, 895, 1398, 299, + -28, 373, 89, 455, -416, 167, 651, 729, 479, 2124, -273, -268, -141, 1099, 650, -547, 569, -5, 183, -449, 967, -960, 65, 1503, -1104, 3220, -1477, 1546, 1408, -1376, -1268, 1439, 59, -816, -351, 799, -2172, 351, -257, -1385, 912, -1081, 85, 94, -442, -1065, 291, -69, -50, 222, -224, -341, 192, 468, -173, 85, 351, -314, 489, 395, -783, 129, -440, 217, -32, 82, -401, 185, 104, 17, -201, 623, 135, -1, 575, -386, -373, 83, 247, 85, 276, 167, -805, -393, 206, -448, 691, -255, 530, 714, -1659, -688, 1001, -2115, -1329, -877, + 1478, 3187, 867, -2477, -572, -2531, -1339, 2088, 1229, 1964, 1062, -1461, -2351, -1769, -438, 1070, 1189, 736, 394, -604, -2566, -3059, -675, 2369, 4188, 2860, -547, -1956, -2837, -2083, -1706, 16, 668, 2309, 2441, -1312, -840, -3068, -2875, -1016, 273, 2989, 4382, 1963, -1306, -4586, -3419, -2487, 1198, 2633, 1624, 1048, 869, -2729, -514, -1550, 572, -203, 1616, 2569, 2019, -2372, -4824, -3605, 392, 2830, -79, 3919, 153, -990, -1184, -848, 1, 2835, 2424, 462, -977, -330, -188, 1494, 1622, 211, 61, -239, -53, -298, -407, -246, -154, 582, 873, 739, -1075, -1192, -475, -484, + -488, 1118, 891, 1176, 331, -479, -879, -1664, -1081, 722, 1473, 2265, 1529, 147, -3472, -3026, -1047, 1270, 1940, 2626, 1957, -136, -1985, -2892, -2819, -492, 3048, 3181, 1596, -740, -2108, -1436, -560, 1119, 356, -916, -854, -3, -1380, -177, 210, 153, -115, 29, -461, -63, -50, 234, -156, 634, -165, -128, -173, -206, 403, 108, -187, 613, 44, -1105, -544, 297, 542, -189, 70, 747, -14, 97, -612, -281, 194, -140, -132, -88, 503, 175, -191, -596, -230, -41, -534, 45, -610, -417, -281, -552, 861, -160, -383, 356, -1, -847, -45, 834, 686, -397, + 532, 82, 508, -568, -824, 311, 370, 316, 283, -320, 312, -626, 423, -851, -739, 542, -430, 367, 518, 31, -393, 121, 149, -40, -28, -21, 339, -288, 221, -301, 396, -351, -183, 137, -115, -20, 159, 30, 107, 295, -238, -151, 177, 97, 349, -288, 100, -41, -212, -225, 92, 48, -210, -325, 95, -4, -56, 195, -300, 344, 109, -313, -336, 275, -473, 318, -50, 218, -20, 421, -674, 1352, 2071, -273, -762, -660, 1910, 859, 1849, 992, 6, -861, -188, 468, 871, 412, -398, -102, 418, 607, 79, 134, -423, 75, -203, 275, + 315, 804, 699, -373, 64, -418, 112, 365, 554, 37, -258, -5, -470, 391, -106, 159, 372, 4, 495, -246, -131, -119, -502, -307, -768, -150, -876, 56, -299, 719, 111, 208, -676, 282, 8, -307, 501, -273, -137, 119, 333, -45, -177, 1115, 368, 254, 424, -309, -11, -107, 590, 809, 786, -472, -507, -75, -199, 199, 530, 541, 28, 301, -33, -90, 183, 343, -30, 268, -226, 43, 8, 89, -75, 301, 182, -40, -82, 86, 58, 327, 23, -206, -211, -131, 98, 106, 218, -268, 40, -80, 176, -136, 247, -91, 95, -145, + -109, 68, -207, -8, 239, 49, -92, 12, -773, -1675, -227, 2215, 3413, 2867, 2264, -152, 265, -1664, -1889, -3077, -1773, -1938, -612, 245, 1340, 955, 2917, 2542, 838, 178, -454, -990, -1568, -573, -1607, -427, -782, -504, -376, 86, 27, 546, 787, 1199, 1297, 1560, 1345, -161, 130, -15, 252, -771, 311, -824, -2065, -1012, -1546, -2594, -762, -225, -1053, 357, 796, 1812, 2133, 3151, 1988, 1622, 1610, 1003, -313, 165, -1590, -1368, -2303, -2735, -3162, -2300, -1775, -183, -87, 252, 923, 1566, 2818, 2789, 2775, 2227, 954, 1437, 225, -719, -1085, -2563, -2333, -2063, + -1781, -1424, -863, -522, -179, 130, 862, 1025, 1348, 1119, 1599, 1450, 948, 1093, 734, -199, -594, -685, -1635, -1416, -1277, -955, -522, -19, -64, 417, 641, 500, 594, 380, 118, -12, 171, 41, -201, 215, 258, 18, 138, -39, -60, 24, 96, -4, -223, -294, -289, -332, -226, -67, -77, 95, 37, 30, 106, 124, 96, 121, 181, 150, 70, 92, 20, -45, -26, -62, -84, -31, -51, -15, 4, 2 }, + {226, 86, -113, -19, 79, -14, 84, -207, -148, -36, -174, 73, -39, -19, -118, -52, 109, 109, -43, -33, -73, -167, 186, 111, 5, 20, -10, 5, 150, -76, 27, -240, -197, -49, 18, -167, -31, 60, 14, 3, -84, -65, 157, -73, -67, -22, -22, 69, -37, -103, -4, 90, -129, 6, -138, 10, -101, 153, -9, -161, -24, -16, 19, -230, -28, 19, -154, 71, 3, -177, 80, 109, -95, -109, -195, 102, 58, 181, 89, -27, 34, -25, 54, 58, 124, 32, -55, -2, 14, -4, 70, 18, -25, -35, 34, 28, + 53, 27, 20, 32, 28, 12, 17, -3, -10, 11, 7, 14, -9, 16, -2, -167, 75, -208, -58, -29, -106, 101, 233, -95, -32, 11, -97, 67, -15, -78, -134, -71, 210, 204, 114, 237, 139, 76, 222, -138, 49, 95, -5, 39, -67, 43, -308, 7, -18, 112, -70, -39, -22, 86, -98, -15, 27, 60, 58, -16, -105, 20, 36, 76, 56, 88, -99, -58, -19, -174, -21, 47, 149, 168, -23, 93, 68, -12, 62, 75, 108, -43, -2, -81, 14, -69, 48, -103, -98, 59, -1, -193, -19, -144, -40, -20, + -25, -192, 18, 68, -57, -54, 33, 25, 14, -37, -103, -5, -45, 40, 1, 3, -12, -42, -48, -53, 4, -23, 23, -33, 13, 9, -31, 0, -34, -12, 2, 1, -30, -7, -5, -211, -200, 74, -24, 166, 166, 14, 4, 320, -87, -7, 268, 11, -156, -227, 165, -66, 0, -141, 43, -100, 112, 500, -183, -147, -181, -195, 35, -159, -394, -10, 39, 1, -157, -33, 127, -161, -96, 234, 76, -59, -57, 151, -76, 108, 97, -213, -143, -126, 139, -108, -65, -59, -72, -11, -145, 1, -45, 36, -21, -312, + 144, -174, 136, 26, -258, 52, 170, 53, 284, -121, 14, 34, 65, 103, -114, 43, 36, -166, 226, 17, -34, 97, -34, 44, -43, -86, -8, -56, 73, -19, 12, 89, 29, 34, -22, 48, 7, -13, 30, 65, -49, 4, -51, 31, -18, 93, -131, 61, 69, -73, 34, -36, -285, 87, 271, 223, 254, 43, -53, -218, -112, -103, -80, 223, 313, 21, -19, 221, -358, 6, -27, -7, -115, -122, 133, 161, 7, -37, 67, -176, -130, 133, -144, 278, 256, 41, 158, 131, 29, -116, 42, -8, -195, 190, -15, 88, + 158, -187, -70, -222, -47, 49, 209, -214, -82, 153, -30, -137, 229, -190, -394, 65, -221, -101, 111, -98, 22, 22, -94, 168, -153, -178, -209, -25, -89, 12, 59, -131, 37, 35, 12, -63, 37, 26, 91, 12, -26, -62, -37, -29, -13, -23, -35, 10, 20, 24, 11, -14, -28, -14, 46, -47, -44, -16, 1, -6, 36, 38, 40, -25, 16, 6, 17, 87, -43, 6, -359, 77, 338, 28, 53, 103, 317, 44, -305, 339, 148, 123, 206, 179, 1, -63, 194, 149, 51, -139, 169, 80, 250, 292, 111, -71, + 7, -1, 122, 371, 220, -204, 358, 15, -44, 48, -264, 295, -39, 6, -35, 76, -40, 153, -213, 301, 256, -9, -48, -166, -318, -108, 126, -73, -119, 170, 198, -133, -119, -406, -141, -49, -20, -455, 232, 27, -272, -222, 75, -105, 28, -66, 15, -119, -26, -106, 78, 154, -43, 117, 14, -47, 137, 49, 7, 114, -13, -50, -70, -78, -83, -78, -97, -70, 5, -38, -91, -44, 10, -18, -34, 21, 38, 19, -41, -58, -74, 9, -70, 66, -38, -39, -37, 3, -27, 168, -212, -2, 2, 8, 343, 189, + -3, 428, 198, 387, 92, 131, 413, -163, -275, -174, 386, 95, -218, 295, -80, -171, 263, 624, -161, 32, 100, 120, -162, 22, 343, 38, 422, -91, 454, 322, 109, 270, 171, -160, 113, -40, -40, 45, 31, -28, 120, 84, 293, 199, -245, 87, 110, -179, 11, -425, -553, 223, -142, -359, -77, -192, 238, 54, -112, -270, 214, -195, 130, -219, 33, -87, 335, 65, -131, 132, -286, 263, 42, -243, 11, -23, -70, -27, 35, 76, -71, 123, -27, -44, -54, -39, -106, -5, -38, -99, -38, 40, -64, 69, 10, -33, + 17, -65, -13, -44, -6, 1, 3, 37, 41, 49, 2, 27, -242, 33, 10, 64, -147, 167, 184, -20, -123, -425, -364, -280, 131, 38, 68, -348, 221, 156, 275, -299, 284, 218, -171, -142, -86, 288, 200, -127, 29, 436, 222, 113, 254, 174, 69, -144, 34, 20, -61, -160, 389, 181, -360, 244, 244, 242, 190, 51, -224, 7, -29, 338, 46, 151, 308, -55, -334, 75, 181, 342, -454, -256, 126, 5, 43, -269, -65, -261, -35, 125, -85, -142, -173, 74, -42, -86, -214, 9, -287, -5, -26, -145, -161, 186, + -62, -45, -90, -177, 64, 86, 61, 68, 50, -97, -52, -29, -22, -91, -171, -76, -3, -58, -3, -92, 10, -49, -34, -67, -74, -39, 77, -54, -25, 12, 32, 21, -35, 58, 88, 88, -22, 161, 21, -282, 288, 185, -86, 114, 173, -191, -65, 736, -24, 287, 201, -614, -327, -34, -26, -7, 349, 79, -170, 361, 221, -45, -59, 115, -59, -127, -274, -324, 179, -71, -153, -15, -505, -93, 33, 279, -334, -96, 43, 23, 73, 26, 357, -415, -138, 93, -14, -245, -52, 324, 278, 241, -66, -413, -189, 151, + -47, 279, -16, -4, -206, -127, 242, -295, 203, 160, -214, -105, -50, 36, -230, 114, 80, -112, -35, -313, 114, 245, 348, 32, 94, 166, 51, -273, 189, -64, 31, 3, -88, -93, -50, 130, 23, 109, -11, 20, -152, -50, -70, 118, -11, -48, 81, -57, 63, -35, 11, -124, 30, -27, -26, -79, 30, -11, -70, -128, -28, 15, -52, 55, -13, -555, -37, 78, 373, 49, -17, 229, -166, 494, -493, -45, -107, 84, -26, -38, 124, -90, -169, -109, -101, -293, -48, 212, -50, -129, 310, -3, 373, -364, -212, 466, + -49, -26, 26, -290, -36, -362, 105, -435, -13, 328, -108, 224, 290, 172, 228, -294, 294, 35, -773, -128, 111, -61, -87, -329, 260, -280, -57, -317, -301, -462, 413, 5, 481, -238, 363, 485, -318, 395, -485, -400, -439, -150, -310, 102, 145, -14, -58, 0, -347, 30, 3, 203, 78, 81, 142, 83, -76, 0, -142, -81, 3, 61, 2, 68, -47, 73, -22, 40, -215, 16, 82, 66, 119, -65, -95, -123, -3, -7, -101, -106, 11, -14, 18, 4, -32, 60, 171, -38, -40, -18, -47, 157, 6, 22, -53, 95, + -100, 366, 611, 90, -165, -330, 204, 567, 3, 164, 27, 227, 154, 175, 306, -370, -32, -136, 484, 362, -20, 561, 293, 52, -528, -259, -403, -184, 38, 153, -146, 23, 566, -105, -2, 31, 581, -355, -147, -143, -60, -347, 400, 29, 267, -417, 54, -44, -253, -97, -466, 147, 6, 100, -60, -26, -540, -180, 207, 343, -102, 91, 710, -44, 38, 133, 319, -300, 66, 364, -218, 265, 74, 276, -368, -184, 46, 85, 182, 211, 197, -136, 55, 125, 239, 379, 172, -178, -87, -140, 58, 81, 161, 151, 87, 159, + -173, -33, -177, 150, -202, 202, 142, -150, 86, -18, -95, 23, 27, -54, 43, 251, -11, 0, -157, 79, -10, -4, -143, 143, -122, 45, 59, 114, -16, -54, -336, -506, 139, -52, -515, 143, 49, 467, 409, -380, -460, 105, -352, -182, 12, 696, 8, -86, -622, -309, -56, -461, -704, 484, -183, -220, -42, 524, -165, 59, -107, -103, -305, -160, 49, -732, -473, -134, -269, -247, -87, -286, 248, 116, 79, -174, 125, -1058, 984, 580, -101, -133, 553, 35, -333, -470, -61, -164, -197, -282, -291, 364, 337, -151, 742, -411, + -340, -304, 1, 244, -871, 259, -276, 457, -494, 218, -45, -165, 340, -640, 602, 36, -8, -134, 18, -7, -304, 61, -84, 160, 203, -184, 93, 131, 284, 12, -93, -14, -25, -112, 84, -43, -68, 74, -113, -34, 28, 84, 98, -226, -174, -149, 26, 95, 0, 63, 53, 154, 80, -122, 115, 24, 505, 41, 1176, 382, -23, 50, -454, -590, 735, -219, 84, 974, -254, -48, -208, 760, 147, -316, 449, -164, 667, 349, 166, 98, -74, -256, -83, -70, -714, -181, -115, 394, -221, 73, 131, -513, -763, -29, 659, -45, + 585, -103, -819, -318, 37, 184, 148, -667, 5, -192, 483, -495, 611, 902, 585, -185, 109, 363, -130, 706, 818, 720, 235, 790, -28, -320, 102, -416, -524, 284, -225, 646, 334, 170, -223, -799, -724, 506, -321, -647, 429, 858, 516, -278, 409, 250, -91, -205, 242, -307, -94, -34, -212, 26, -47, 175, 105, -43, -282, 154, 141, 96, -63, 7, -264, 19, -5, 66, 59, 5, 154, -56, 214, 242, 61, 196, 16, -158, -374, 82, 6, -267, -593, 347, 435, -7, 213, 143, 211, 175, 81, -47, 103, -124, 226, -404, + -1125, -451, 617, 36, -183, -377, -2, 519, 663, 141, -406, -71, 530, -641, 62, -80, 474, 541, -433, 821, 160, 33, 1160, 6, -363, 406, -193, 58, -247, 86, 772, 89, 984, 415, -856, -938, -204, 244, 526, -727, -256, -105, 885, 809, -691, -26, -421, 267, -144, 925, 14, -203, 609, -123, -716, -362, -116, 747, -660, 401, 1162, 550, 780, -208, 318, -209, -480, -462, 245, -328, -20, -117, 213, -5, 472, -105, -215, -76, -92, 117, -73, 182, -321, 240, -211, -96, 69, -84, -98, 152, -140, -52, -40, -116, -395, -223, + -36, -45, -115, -154, -34, 120, -67, 72, -59, -1, 93, -302, 36, -40, -228, -540, 401, 606, 494, -865, -421, 556, 1660, 108, 356, -477, 144, -17, -85, -448, 131, -153, 794, 642, -843, -364, 877, 456, 311, 101, 471, 564, 170, 340, 300, -396, 53, -387, -184, 117, -85, 75, -348, -298, 230, -55, 320, 266, -780, 587, 109, 474, -529, 308, 463, -355, -603, -591, -667, -651, -554, 206, 969, 269, 294, 473, 26, 2, -388, 665, -836, -1652, 563, -368, 66, -1400, 342, 462, 70, 296, 231, -195, -368, -546, 171, 140, + -435, 328, -170, -707, -402, 8, -137, 93, 41, 231, 93, 56, -21, 188, -112, -213, -417, -228, -273, -74, -154, 170, 225, 192, -335, -8, -145, 21, 181, 77, -297, -516, -54, 42, 36, -171, -89, -179, -49, -240, -282, 198, -276, 131, 37, -118, -63, 191, -163, -196, 395, 285, 378, -539, -280, -76, 345, -720, 1198, 569, -98, 654, 393, 623, -328, -419, -408, 755, 268, 136, 680, -596, -1929, -128, 128, 229, -1086, 841, 611, -1165, -897, 29, 480, 41, 272, 618, -164, 384, -564, -645, -514, -670, -1043, 291, 108, -700, + 925, 359, -226, -220, -546, -409, -951, -516, 338, 843, -321, 85, 347, -748, 540, 731, 108, -187, 624, 171, 70, -448, -524, -38, 934, -287, -862, -15, -1099, -1145, -1193, -572, -629, -402, 513, -72, 461, -95, -152, -431, -116, -127, 247, -189, -275, -54, -108, 40, -402, 76, -185, -161, 213, -193, -64, 70, -143, 313, -199, 47, 509, 62, 297, -114, -178, 515, 77, -273, 10, 5, 40, 73, -146, 321, 20, -24, -155, -162, -424, -727, -384, -390, 474, 937, 344, -424, -903, 970, 520, -464, -252, -247, 54, 230, -299, 506, + 467, 29, -314, -295, -280, -33, 182, -138, -310, -735, 228, 653, -372, 578, 18, 389, -321, 432, 1244, -462, 543, 1084, 188, -185, -299, 317, 24, 556, -421, 1487, -458, -992, 230, -449, 1174, 389, -366, 72, -706, -966, 1191, 141, -319, 1180, -608, 158, -343, 686, -868, -971, -695, 222, 422, 786, 336, 831, 1296, -155, 262, -166, 166, -37, 54, -947, 38, -1309, -436, -254, 235, -40, 290, -99, -390, -408, -92, -268, -300, -518, 2, -50, 400, 175, -320, 300, 140, 249, 324, -413, 120, -168, -77, 425, -137, 215, 286, -164, + -452, -226, 169, -742, -230, 23, -102, -163, 342, -347, -388, 282, 459, -202, 385, 912, -138, 30, 1085, 122, -599, -688, -615, 1122, -755, 448, 520, -355, 102, -611, -145, 504, -452, 365, -156, -768, -1702, -147, 1517, 643, 149, -296, -466, -77, -609, 201, -855, 1022, 67, 130, 75, -335, -1030, -383, 813, -663, -180, -456, 359, -324, 1129, -175, 227, -406, -1069, 244, -818, -174, -79, -1476, -1260, -1175, 386, -209, -648, -408, -417, -369, -579, -376, -106, -1323, 366, 159, 485, -286, 1153, -111, 218, -392, -166, 636, -1244, 536, 806, -822, + -544, 60, 126, -210, -405, -641, -45, 25, -397, 344, -294, -508, -291, -212, 324, 1, 7, -1, 241, -629, -187, -67, -129, -34, 7, -756, 20, -238, -206, -56, -347, 104, -101, 79, 10, -56, -89, -181, -35, -147, -40, 117, -177, -271, 5, -58, -66, -166, -315, -202, -83, -30, -223, -260, 461, 279, 558, -210, -1160, 335, 16, 1927, 1972, 239, 19, 465, 233, 497, 851, 318, 884, 1336, -332, 176, -1096, -155, 144, -141, -326, -664, -558, 310, 308, -1455, 1040, 281, 1467, -89, -290, 480, -101, 1545, 394, -78, 298, 307, + -414, -943, -739, -370, 1154, 16, 1269, 157, 1240, -356, -1704, -637, -494, 883, 108, -827, -1199, -837, -166, 1037, -901, -784, -516, 926, -455, -269, -1194, -1188, 376, 202, 1603, 413, -169, -433, 504, 521, 1711, 32, -553, -740, -46, -75, 40, 267, 247, -397, -89, 130, 357, -381, -309, 481, 708, 329, 218, 276, -297, -127, -187, -39, -39, 156, 3, 925, 194, -39, -282, -484, 464, 750, -271, 13, 30, 94, 429, 188, 319, 326, 83, 254, 84, -15, 84, -228, -77, 57, -138, 91, 26, 1178, 448, -573, 1111, -69, -2182, -665, + 1377, 1530, -1076, -1078, -1095, 612, 937, 1873, 567, 242, -1068, -108, -65, 421, 937, 680, 55, -1131, -2198, -583, -1112, 1653, 1752, 3057, -914, -2939, -640, -1010, 2286, 778, 2320, 598, -774, -2242, -1515, 82, 280, 2515, 1022, -87, -2069, -3609, -943, 78, 1668, 3796, 828, 1145, -2444, -3745, 163, 861, 2983, 1754, 1254, -691, -2413, -1974, -18, 558, -50, 1508, -1243, -1163, -287, -2663, 418, 130, 729, -534, -1075, -578, -453, -1217, 283, 359, -387, -59, -1140, 165, 334, 379, 536, 173, -581, 209, -180, -98, 90, 932, 165, -25, -231, -703, -133, -278, + 280, -123, 310, 202, -641, -1462, -715, -1071, 888, 892, 1060, 610, -1358, -1224, -1895, -452, 1553, 1717, 1676, 90, -1830, -1370, -1064, -14, 2759, 1917, 789, -1462, -1699, -1269, 640, 658, -1250, 1662, -36, 241, -699, -1584, 944, -1595, 1690, 242, 152, 353, -1016, 1004, 100, 696, -974, 339, 9, 1205, -481, 292, 808, -924, -529, 82, -836, 1352, -304, -567, 1222, 1397, -375, -1046, -255, -924, -168, 558, -87, -1149, 138, 606, -400, 685, -573, 259, 745, -306, 492, -1308, -1306, 1322, 744, 2044, -82, -531, 1744, -1004, -882, 600, 591, 977, -894, -439, + 268, -202, 990, -801, -2442, 624, 1371, 6, -1130, 202, 700, -286, -293, -926, -291, -766, 762, 172, -529, -157, 909, -655, -224, -593, -64, 426, -633, 328, 949, 349, -9, -283, -49, -363, -437, 702, -295, 312, -96, -379, 1, 64, 72, 247, 320, -561, -163, 258, 232, 529, -68, -483, 190, -560, 265, -512, -276, -5, -104, -348, 772, -349, 162, 322, 75, 249, 514, -23, -88, -49, -643, -405, 2482, 672, 695, -2104, -518, -1650, -1382, 1247, 1326, 2606, 1214, -353, -496, -307, 834, 571, 28, 1266, 258, -507, -589, -485, 922, 0, + 807, 372, 492, 120, -189, 93, 5, 120, -197, -53, 272, 220, 1720, 1376, 1135, -99, 318, -697, -105, -433, -775, -819, 257, 447, 660, 797, 667, -411, -1039, 1596, -1130, -498, -282, 549, 81, 782, 824, 714, -950, -343, 140, -376, -1540, 1038, -355, -278, 595, 1204, 1374, 997, 984, 843, -890, 118, -222, -278, 521, 408, 554, 266, -242, -446, -640, -699, -1398, -561, 215, -79, 864, -1, -384, -130, -554, 214, 72, -40, -1, 366, 811, -98, 46, 444, 38, 6, -155, -52, -186, -183, 54, -381, 176, 220, -276, -415, 121, 85, + -146, 410, 554, -74, 88, -178, -550, -233, 97, -3199, -1596, -2197, 1586, 352, 4544, 4699, 4681, 5352, 5269, 3788, 2356, 2955, 1306, 276, -2493, -2168, -5443, -4758, -4273, -2516, -3176, -2418, -199, -772, -312, -380, 20, -4, 145, 622, 666, 638, 1875, 1926, 2039, 1459, 4080, 1069, 1715, 2859, 3185, 1186, 3206, 3861, 3042, 2644, 2686, 298, 1608, 3250, 3208, 2070, 2691, 2355, -32, -869, -614, -1602, -1980, -253, -2225, -3390, -2644, -3158, -4673, -2136, -3160, -3501, -4962, -4032, -4576, -5227, -3483, -5911, -6996, -7020, -3819, -4749, -5987, -1172, -2665, -1247, -669, 1967, 876, 2882, + 1531, 2723, 2589, 1706, 1343, 2112, 3905, 3975, 3987, 4075, 4232, 5145, 4595, 3818, 4693, 5298, 4233, 3186, 3800, 3199, 2065, 2610, 1763, 879, 378, 809, 237, -324, -226, -419, -1014, -1541, -1535, -1670, -1429, -1785, -2817, -2529, -2912, -3283, -3830, -3817, -3161, -3170, -2596, -1639, -1848, -1247, -871, 114, 2, 29, 167, 564, 634, 222, 487, 769, 598, 262, 287, 502, 277, 121, 158, 207, 199, 156, 119, 160, 180, 75 } + } }; -//BRIR coeff diffuse tables in Q31 -const Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS][2885] ={ -{ - -77309, - -23622, -40802, -27917, -64425, -12885, -103079, -27917, -339302, 229781, -17180, - 231928, -47245, 98784, 642098, -79457, -753767, -760209, -242666, -472446, 68719, - -386547, -1015760, 279173, -249108, -195421, 283468, 73014, -339302, -560493, -700080, - 79457, -418759, -279173, 163209, -775242, 689342, 691490, -397284, -70867, -251256, - -738734, 77309, -674310, -502511, 478889, -322123, 1037235, 4367982, -1913408, 1932735, - -833224, 685047, -38655, 1007170, -453119, 244813, 423054, 513249, 545461, 955630, - -249108, 105227, 1752347, 1314260, -3481071, 685047, -457414, 169651, -1194001, 775242, - -1501091, 1479616, 1217623, 605590, -206158, -470299, -560493, 1050120, 955630, -438087, - 206158, 1816771, -693637, -38655, -633508, 212601, 266288, -51540, -528281, 852551, - 115964, -261993, 633508, 17557826, -1297080, 2422362, -70867, 749472, 311385, 566936, - 373662, 1657857, -996432, 682900, -371515, 264141, 897648, 1415192, 547608, 253403, - -719407, 1286343, -979253, 474594, -470299, -1408749, 115964, 455267, 21475, -457414, - 92342, -508954, 878321, -1891933, 405874, -457414, 463856, -42950, -2645700, -932008, - 236223, 388695, 270583, -478889, -620623, -534723, 339302, 989990, -450972, 423054, - 10630044, -12513387, 2529736, -2989297, 1677185, -1928440, 1552631, -2645700, -773094, -1623498, - -272730, -1348620, 148176, 2486786, 3609920, 1524713, 826781, 88047, 1155346, 2583423, - 1894081, -1144609, -1372242, -1851131, -858993, -1060857, 133144, -152471, -128849, 73014, - 579821, -850404, 1144609, -1125281, -1490354, 577673, 15032, 133144, 358630, -1041530, - -1166084, 384400, -693637, -968515, -146029, 156766, 809601, -24262270, 4885526, -1183264, - 654983, 564788, -1995012, -876173, 1973538, -277025, 206158, 2207613, 743029, -788127, - -1468879, 1550483, 173946, -1795296, -2583423, -3762391, 1267015, -1651415, 433792, -508954, - 753767, -350040, 311385, -1937030, -1904818, -1176821, -476741, -1191853, 410169, -558346, - 736587, 2317135, 438087, 433792, 1552631, 453119, 395137, -15032, -251256, -1471026, - -311385, 384400, -234076, -36507, -29021094, 10904922, -2682207, 3526168, -1672890, 2553358, - -1357210, -358630, -2445984, 1943473, -2901251, 1990717, -472446, 2770254, -3680787, 1002875, - 3489661, 1060857, -2886218, -985695, -1726577, -680752, 1133871, 614180, 846109, -408022, - -964220, -1352915, -1342177, -62277, -1544041, -221191, -1434519, -979253, -4032974, -1078037, - -545461, 281320, 118112, 1468879, 627065, 1449552, -120259, 1677185, 405874, 208306, - 423054, 3579855, 12605729, -3536906, 5566278, -3455301, 1421634, -3723737, 2845416, -313533, - 3105261, -300648, -360777, 3049427, -556198, -478889, 2665027, -1374390, -2529736, -4015795, - 3478924, -337155, 2366527, 229781, 1668595, 777389, -2342905, 927713, 891206, -208306, - 1144609, 1760937, -2327872, 249108, -111669, -249108, -1352915, -644245, -1324997, 296353, - -307090, 938450, 2927020, 60130, 1464584, -324270, 251256, -373662, 416612, 1144609, - -584116, -1125281, 38158636, -9461813, 3590593, -1866163, 3173981, -1447404, 2426657, -1415192, - 809601, -3762391, 1687922, -3594888, 2680060, -1129576, 764504, -1078037, 3790309, 481036, - 925565, -1883343, 2465311, -270583, -1189706, 2083059, -1683627, -2611340, 32212, -848256, - 1189706, -60130, -416612, -884763, 339302, -133144, 448824, -1814624, 382252, -828929, - 2720862, -564788, 1286343, 197569, 1075889, 2010045, -1447404, 57982, 448824, -753767, - 1589138, -386547, -749472, 3253438, -19782620, 7859790, -6081674, 3642132, -3012920, 1082332, - -3981435, 2641405, -1571958, 3676492, -375810, 1625645, -3171833, -1314260, -178241, -1127429, - -1058710, 4239133, -3066607, 573378, 1984275, -3798899, 1015760, 1395864, -936303, 1361505, - 468151, 801011, -2418067, -173946, -758062, 1548336, -1191853, 865436, -2858301, -539018, - 2134599, 1063004, 693637, -691490, -410169, -2158221, -2319282, 1318555, 496069, -60130, - -322123, -158914, 229781, 251256, -470299, -431644, 309238, 354335, -783832, -586263, - -481036, -31969590, 10554882, -5609228, 1518271, -466004, 1853278, -2338610, 2656437, -998580, - -837519, -255551, 1941325, -951335, -1434519, 1157494, 3674345, -435939, 216896, -5987185, - 586263, 158914, 3017215, -897648, -386547, -4563403, -1516124, 115964, 156766, 1666447, - 2278480, -3435974, -3137474, 2128156, 590558, -3545496, -2695092, 1410897, 852551, -156766, - -34360, -1327145, 1483911, -380105, 586263, 238371, -1816771, -743029, 1080184, -2862596, - -1387274, -530428, 687195, -534723, 122407, -1404454, -53687, -1005022, 173946, -31930934, - 14194867, -7776039, 5985037, -5413807, 2753074, -6167573, 1477469, -4007205, 6438156, -3193308, - 2304250, -356482, 94489, -2890513, -785979, -1172526, 5834713, -1063004, 3004330, 4724464, - 2742337, 727997, -573378, 1159641, -970663, 2658585, 2592013, 395137, -1221918, 481036, - 541166, -1715839, -730144, 1359357, 1962800, -1406602, -1350767, -1428077, 154619, -575526, - 874026, -1378685, 1065152, -2183991, 712965, -1185411, -19327, 253403, -816044, -1176821, - -1464584, -1410897, -1838246, 261993, -1670742, -833224, 68719, 11800423, 12266427, -4638565, - 4035122, -5083094, 700080, 1445257, 60130, -2078764, 2231236, 513249, 4818954, 2473901, - 5452461, -921271, 3189013, -962073, 2014340, 2830384, -457414, -4105989, 3777424, -496069, - 1550483, -979253, -68719, 472446, 4636417, 620623, -2615635, -944893, 558346, -1486059, - 3483219, 1432372, -614180, -1002875, -2068027, 1498944, -2027225, 1937030, 2059437, -1644973, - 1157494, 1017907, 506806, -238371, 3384434, 2046552, 2463164, -182536, 249108, 1045825, - -788127, -369367, -287763, -828929, -70867, 94489, 261993, -700080, -1479616, -1578401, - 272730, 760209, 36030480, -12966506, 4404489, -6101001, 4037269, -4045859, 5209796, -1889786, - 176094, -4041564, 7861938, -1219771, 7075959, 365072, 1155346, -4870493, 1642825, 7103876, - -2276333, -6128919, 826781, 173946, 2740189, -4443144, 3508988, -120259, 249108, -466004, - -4271345, -1320703, 639950, -5145371, 779537, 1971390, 1632088, -1509681, -461709, -279173, - 2314987, 624918, -461709, -1127429, 1793149, 1185411, 4535486, 1093069, -736587, 2469606, - 974958, -358630, 796716, 1851131, 1232656, 171799, 257698, -1586990, 272730, -244813, - 1853278, -296353, 704375, -309238, 629213, -139586, 581968, 12120398, -17433272, 10494753, - -7735236, 3298535, 1209033, -758062, -631360, 2113124, -4367982, -2761664, -2250563, -1737314, - -5985037, 3081639, -5557688, -186831, -4443144, 1679332, -3339337, -2611340, -1316408, 5117454, - 734439, 4982162, 2617783, 3427384, 4913443, 296353, -601295, -706522, 1398012, 3803194, - -296353, -229781, -2493229, 1954210, -289910, -1453846, 1408749, 1206886, 3940633, 1649268, - 1864016, -2731599, -1282048, -111669, -504659, 1964948, -5607080, 1264868, -1370095, -895501, - -1733019, -1919850, -657130, -1896228, 801011, -1309965, -216896, -2907693, -2905546, 55835, - -1030792, 2426657, -37005440, -8042327, 1754494, -6972880, -2849711, 356482, -167504, -5933498, - 1769527, -5907728, 227633, 4857608, -843961, -740882, 2686502, 1786706, 2733747, 216896, - 3296388, -1739462, 970663, 3824669, -208306, -176094, -2420214, 3644280, -2729452, -1462436, - 985695, 1513976, 2780991, 8506183, -2267743, -1309965, -3592740, 270583, -2634963, 706522, - -1026497, -3906273, -204011, 5147519, 1473174, -3360812, -1662152, 1754494, -2035815, -2529736, - 528281, -1157494, 339302, 605590, 3240553, 526134, 1610613, 912681, -2654290, -1309965, - 1726577, 1653562, -1047972, 1015760, -176094, -1174674, 68719, -45425720, 37499360, -13103945, - 11145440, -8207683, 6279242, -2381559, 4002910, -4355097, 2686502, 3126736, 4531191, -2946348, - 5484673, 2707977, 9326521, -1462436, 794569, -4937065, 1260573, -1735167, -3070902, -3826816, - -4385162, -4054449, 6055904, -279173, 7267085, 1876901, 1344325, -128849, 938450, -3210488, - 530428, -1176821, 1526861, 4288525, 788127, 1406602, 272730, 438087, -3249143, -1801739, - -107374, -261993, 457414, -1009317, -2989297, 57982, 3251290, -1054415, 974958, 925565, - -2645700, 1818919, 811749, 992137, -526134, 287763, -266288, -850404, 261993, 2884071, - 51540, 169651, 26416196, -4127464, -8596377, -3021510, -1855426, -1428077, -7578470, -4007205, - 2042257, 1236951, 2091649, 2624225, -5111011, 1988570, -1047972, 1765232, 8057359, -8250632, - 2778844, 2787434, 2153926, -2166811, -4797479, 3648575, 1047972, 2598455, 4945655, -40802, - 6835441, 551903, 3150359, 225486, 2119566, -1937030, 2553358, 1836099, 2435247, -1002875, - 775242, -240518, 3137474, 3891240, -5879810, 7818988, 618475, 2153926, 296353, 1327145, - 1477469, -1698660, 4668630, 2503966, 135291, 4277788, 1791001, -2415919, -242666, -1629940, - -1756642, -1331440, 738734, -375810, 223338, -143881, -4864051, 2443837, -1954210, 642098, - -691490, -319975, -1236951, -723702, 20933670, 1788854, 4230543, -5473936, -1071594, -13531294, - 3182571, -693637, -9206262, 7636452, -4282083, 225486, 5598490, 2486786, 4194036, -3294240, - 1831804, -4301410, 45097, -3687230, 1324997, -5579163, 7887708, 5665062, 4645007, 5398774, - 1178969, -1857573, -3457449, 1488206, 4318590, -42950, 2933463, -2199023, 571231, 2826089, - 2005750, 2538326, 156766, 874026, -354335, -1906966, 1812476, -1337882, 833224, 697932, - -1917703, 2518998, -3519726, 3064459, -1664300, 2149631, 3345780, -4174708, 388695, 418759, - -1705102, -3302830, 2269890, -5319317, -4086662, 2463164, 1041530, 1114544, 998580, 3210488, - 3128884, -1202591, 423054, 1848983, -777389, -79457, 33116346, -27489938, 9358734, -6824703, - 2445984, 8619999, 7015829, -4589173, 8407398, 4741644, 5091684, -3448859, 2385854, -1750199, - 9979357, 2785286, 2841121, 3871913, 4243428, 2688650, 2909840, -8158291, 1340030, -14759655, - -5111011, -1355062, -8435316, 2143189, 4571993, -3176128, -4561256, -5385889, -5153961, -2750927, - 3012920, 2366527, -7492571, -8693014, -635655, -4428112, 2409477, 1945620, 863288, -609885, - 4155381, -2151779, 244813, -562641, -1810329, -5581310, 4370129, 7370164, -957778, -912681, - 3496104, -5177583, 6335077, 1632088, -3152506, -109522, -2924873, -1241246, -710817, -2113124, - -526134, -1425929, -4299263, 1136019, 1599875, 1471026, 1586990, 502511, -51105816, 5196911, - -4458176, 1992865, 5330055, 3859028, 10559177, -4183298, -253403, 953483, 12616466, 4453881, - -9689446, -6289980, 5626407, 7509751, -1750199, -2686502, -98784, 3521873, 7752416, 7879118, - -6442, -13799730, -3917010, -1329292, -1565516, 8177618, -3603478, 4818954, 566936, -777389, - -7114614, 676457, 5849746, -9126806, -5310727, -2065879, -1516124, -4273493, -3558381, -8525510, - -1494649, -5748814, 152471, 1367947, 6317897, -4140349, -2697240, 635655, -530428, 1069447, - -5267778, 2203318, 2130304, 770947, 395137, -3955665, -3588445, -1949915, -1065152, -221191, - -6841883, 1507534, 2110977, -2894808, -6281390, 2645700, -221191, -3096672, -543313, -1389422, - -977105, 4127464, -30163556, 31842888, -4645007, 1937030, 7436736, 8942122, -6882685, 4264903, - 1627793, 5495411, 3685082, 7791071, 4352950, -5398774, -8942122, 1187559, 9272834, 18640158, - -4617090, -6423124, 4801774, 2972117, -3676492, -9283572, -1979980, -1917703, -8443906, 7239168, - 8592082, 75162, 1915555, -234076, 6730214, -5396627, -16649441, 6917045, -2098092, 5478231, - 2536178, 180389, -4211216, -6410239, 4286378, 5160403, 3685082, -790274, -461709, 5682242, - 3096672, 1720134, -3536906, 4778151, 3904125, -710817, -1378685, -2841121, 3178276, 66572, - -8291435, 6676527, 3889093, -1559073, 1795296, -1052267, 85899, -191126, 1857573, 493921, - 2312840, 3929895, 1979980, -633508, -2538326, -1612760, 5654325, 2220498, -1129576, -1801739, - -335007, 8939974, 322123, -6977175, -14229227, 3375844, -785979, -11759620, 3910568, -3932043, - 504659, -4490389, -3496104, 3629247, 8866960, 1039382, 11761768, 5295695, -5978595, -7868380, - 12876312, -5662915, -450972, 1093069, -12156905, -156766, 6378027, -7099581, -1900523, 8050916, - 481036, 4172561, 94489, 5276368, -934155, -3695819, -515396, 7026567, 9554155, -3212636, - 1917703, 1593433, 6365142, -3878356, -693637, 1170379, -1640678, 4071629, 1851131, 266288, - -2199023, 3238405, 3665755, 113817, 161061, 2680060, 4292820, -5261335, -36507, 1363652, - 2351495, -2735894, 2130304, 979253, 60130, 1417339, -1651415, 635655, 1702955, 3491809, - 4312147, -3575560, 384400, 67025112, -6560563, 1013612, 4078072, -6124624, -10511932, -6150393, - -2695092, -11935714, -12818330, 878321, -11366631, -5044439, -3358665, -2864743, 6813966, 7975755, - 2445984, 16797618, 2957085, -8450348, 14439680, -1544041, 10194105, -3377992, -1189706, -9663676, - 253403, 8398809, -399432, -4211216, -1752347, 788127, -2237678, -1870458, 3161096, -7707319, - 2980707, 1069447, -3732327, -7312182, -5025112, 5508296, 5379447, 6485401, -11184095, 6146098, - 1586990, -330712, 380105, 1032940, 1097364, 1372242, -1067299, 528281, 5723044, -1709397, - 2173254, 2684355, -2566243, 4797479, 5428839, 874026, -629213, 5080947, 3528316, 2783139, - 3322157, -4367982, -2136746, 947040, -616328, -689342, 143881, 2248416, 472446, -4232691, - -39352636, -66065188, 24013162, -1612760, 10030896, -11510512, 618475, -13344463, -1666447, -19271518, - 8426726, 8976482, -358630, -1449552, -167504, 1855426, -4552666, -16426102, 30419106, 2156074, - -3816079, 10456098, 1921998, -5437429, 14643691, 16237124, -6882685, 9597104, 1930588, -2020782, - -15109695, -8272107, 11940009, -6064494, 1750199, -781684, 8143258, -12348031, -13846975, 2003602, - 279173, -9380209, 5757404, 1185411, -5798206, 4183298, -6395207, -5366562, 2643552, 2493229, - 416612, -1713692, -2976412, 3876208, 6562710, 962073, 2115272, -1851131, -1791001, 5680094, - 751619, 1279900, -5703717, -1324997, -3783866, 3193308, 4810364, 47245, 3972845, -53687, - 5269925, -4202626, 2680060, -62277, -178241, -3972845, 27917, -3408057, -380105, -21206402, - 63977832, -28329604, 4853313, 4243428, 16097537, -1973538, 10305774, -10052371, 700080, -19331648, - -3631395, 152471, 7894150, 1350767, 8128226, -5506148, -11688753, 1574106, -17624398, -18614388, - 633508, -6083821, -249108, 1642825, 2772402, -4582730, -2995740, -6618545, -10000831, 4110284, - 5001490, -13114683, -5847598, -16499117, 373662, -7267085, 6060199, 6992207, -13509820, 2186138, - 11368778, 10159745, -5126044, 3721589, -3751654, -1891933, 3300682, -6137509, -1191853, 5772436, - 4619238, 3964255, 4962835, 2604898, -1292785, 3816079, 2643552, -2815351, 0, 7756711, - -663572, -3543348, -981400, 3208341, -3161096, -7898445, -418759, -2750927, 2179696, 1694365, - -996432, -3197603, -4608500, -5572720, 5815386, -1887638, -60130, -1247688, -236223, -695785, - -52632676, -16187732, 6111739, -8177618, 7700877, -3313567, 240518, -15393163, -18532784, -2368675, - -6380174, 7999377, 2394444, -2102387, -38482908, 19572166, 1539746, 17078938, 21187074, 14718853, - -20044612, -4756677, -1797444, -4870493, 4518306, 4971425, -188979, -7183333, 8332237, -13488345, - -7148973, 12311524, 781684, -5044439, 14351633, 500364, 15047418, -4964982, -2226941, 1956358, - 4818954, -10477573, -7720204, -1690070, 8542690, -2866891, 1513976, -3169686, 5757404, 7224135, - 1516124, 566936, -12219182, -1095217, 6204081, 6981470, -3723737, 7799661, 2652142, -1904818, - 2132451, -7524783, -2267743, -4969277, 5242008, 1000727, -1662152, 2042257, -13050258, 287763, - 2660732, 6524056, 2229088, -3251290, 6255620, 788127, -8171176, -3573413, -4121021, -962073, - 1896228, 33601676, 11207717, -20525648, -3661460, -8955007, 6891275, -12470438, 10075993, -2488934, - 11751031, 8085276, 14306536, -19685982, 23244364, -14577119, 13539884, -8072391, 8061654, 1331440, - 6826851, -12674448, -28709708, 10874857, 19765440, -7436736, 8042327, -10337986, 2269890, -6865505, - 20798380, -418759, -2173254, 4769561, -10260677, -7290707, -6053757, 8950712, -4295, -3605625, - -85899, -2035815, 14267881, 9401683, -5463199, 4425964, 5375152, -6195491, -3545496, -5604933, - -10969346, -1733019, 137439, -1709397, -4086662, -11276437, -539018, 16621523, 9064528, -7284265, - 9328669, -1251983, -244813, 7655779, 4045859, -8287140, 2954938, 1546188, 8224863, 9702331, - -7984344, 3337190, 5731634, 7346542, -749472, -476741, -2808909, -1647120, 4194036, -957778, - 7687992, -2007897, 71625024, -58344984, -9758166, 2946348, -1093069, -16110422, 5448166, 4245575, - 22898618, -7464653, 4531191, 18805514, 545461, 11315091, 37179384, -8057359, -2379412, -19318762, - -18036716, 839666, 6186901, -8147553, 3566970, 32751274, 18988050, 2725157, 1284195, 2669322, - 18172006, -15118285, -6637872, -837519, 9399536, -1451699, 2299955, -7670812, 2950643, -13625784, - -7956427, -10303627, 225486, -9229885, 2267743, -16436840, 7642895, -32839320, -8340827, 4496831, - 6128919, -1236951, -7503308, 2531883, 1037235, 3925600, -8912057, 3985730, -5188321, -5950677, - -14418205, -10812580, -3113851, -1821066, 785979, 2443837, 4720169, 867583, 2295660, -8665097, - 17180, -10574209, -1511829, -747324, 360777, 3491809, 10617159, -6614250, -2858301, -719407, - -5538361, -9764608, 2261300, -45105748, -31346818, -2171106, -6221260, 23890756, 938450, 4548371, - -29545080, 1698660, 4243428, 1864016, 2452426, 18083960, -22174916, 4885526, -4606353, -15238544, - -7303592, 14364518, -4808216, 11720966, -3786014, 6854768, 3796751, -2244121, -1593433, 7739531, - -856846, 32212, -18955838, 9603547, 8738111, 8235600, 9494025, -17035988, -17529910, 10438918, - 15526307, -18330920, 6972880, 2774549, 16125455, 9300752, 1707250, 10844792, -5471789, -11025181, - -1503239, -21365314, -15509127, -1649268, -616328, 3504693, -10065256, 3659312, -8035884, -27421218, - -7887708, -7337952, -26961658, 122407, -4252018, -3098819, 3283503, 8521215, -7803956, 5278515, - 3635690, -12195560, -7647190, -9360881, -1825361, -2733747, -64425, -3835406, 5392332, -5909875, - -1329292, -5016522, 9109626, -9822590, 6079526, -1516124, -1990717, 579821, 2710124, -2280628, - -28166396, 43095700, -22503482, -9545565, -13134010, 3496104, 3768834, 6438156, -2660732, 18876382, - 14218489, -13376676, -23875724, 9073118, -8927090, 22136262, 1864016, 9521942, 11615739, -8211978, - -8038032, 29384018, -16720308, -3914863, -8469676, 1161789, -3468186, 4024384, -4915590, -1803886, - -22533546, 20061792, -6919193, -1623498, 23596550, -15988016, -20319490, 2001455, -9204115, -13228499, - -55835, -6700149, 5366562, -29197188, -9730248, -7039452, -672162, 10514080, 163209, 2235531, - 5381594, -4861903, 4116726, 7090991, 6000070, 6738804, -3730179, -6043019, -5413807, 7642895, - -17744658, -3697967, -4161823, -4202626, 11647951, -7683697, -12412455, 12792560, 3861176, 7780334, - 14961519, -5282810, -4967130, 7580618, -8057359, -10020159, -9401683, 5804649, 4303557, -5349382, - 5166846, 1926293, 6090264, 1299228, -11218455, 7726646, -3723737, -58961312, 29693256, 31978180, - 16449725, 14944339, -10441065, 15187004, -25398290, 959925, -29862908, -3826816, -12964359, 14044543, - -14214194, -11796128, -3131031, -21891448, 6590628, -9953587, 9844065, -20549272, 34561600, -11224897, - 16396038, -14050986, 1513976, -14078903, -4406637, 7883413, 22177064, 24809878, -12264279, 169651, - -7194070, -12990129, -9848360, -35246648, -727997, 5985037, -33105608, 13022341, 6667937, 9163313, - 16015933, 10084583, 5448166, -11102490, -3534758, -12390981, -6206228, 6715182, -26454852, 10529112, - 5315022, 1750199, -12442520, -7359427, 6936372, 21464100, 9122511, 5583458, -8336532, 8974334, - 1350767, -10127533, 2847563, -7316477, -11486890, -6006512, -2632815, -10471130, 12060268, 6805376, - 9835475, 5433134, -8643622, 2907693, 15043123, -2929168, 13980119, 7385197, 5233418, 9371619, - -4784594, -5589900, 3715147, 2448131, 49147312, -33496450, -13945759, -4108136, 8590, 24017458, - -4355097, 7977902, -13587129, 7554848, -8390219, -38530152, -26456998, -9747428, 14014478, -1492501, - -21245056, -19883552, -42069204, -13458280, 5534066, 5871221, 2080912, -4185446, -2362232, -12925704, - 3549791, 5654325, 7290707, 1803886, -1812476, -4898410, -20016696, -4975720, -4464619, 10286447, - -1997160, -15908559, -6204081, 4808216, -17944374, 3251290, -18511310, 10520522, 14654428, -13675176, - -26839250, -5059472, -8375186, -12186970, 1391569, 2587718, 2746632, 6762426, 429497, -10432476, - 16982300, 26383984, -12573517, 11025181, 4475356, 12575664, -18923626, 7310035, 2488934, 6919193, - -27260158, 21749714, 2692945, 2568391, -3257733, -15483357, 4127464, 2106682, 3895535, 4896263, - -16973710, -8875550, 3420942, 8123931, -4252018, 105227, 6388764, 2626373, -3017215, -8050916, - 5963562, 79590040, -44493712, 4058744, -4483946, -9496173, -33202244, -1808181, -1851131, 26989574, - 12335146, 54541788, -21713208, 2076617, 5954972, 13045963, -5596343, -2544768, 22106196, -13913547, - 31823560, 19273666, -44266080, 42150808, 14856292, -15255724, -11008001, -16640851, -8673686, 2989297, - 1924145, -11978664, 28016072, 3547643, -13445395, -11942157, 2720862, -14774687, -26025354, 195421, - 15513422, 6118181, 18869938, -8834748, 5862631, 20160576, 29085518, 6792491, -30122754, 9807558, - -9702331, -16681653, 4378719, 12650826, 7316477, -3768834, -27335320, -24026048, 33711200, -4554813, - 26053272, 2877628, -10262824, 12659416, -22591528, -10125385, 10900627, -3042984, 22417582, -18146236, - -35682588, -10157598, -1739462, -11106785, -8544837, 22056804, -7417409, 3929895, -20366734, -20063940, - 9758166, 4949950, 8224863, -8839043, 8398809, 682900, -4733054, -1206886, -89620936, -58177480, - 21592948, -30148522, 9852655, -14980846, -54159536, -40035536, 72703056, -33217278, 32923072, 18663780, - -18773302, 17057462, -10582799, 22995254, 25479894, -1477469, -7020124, 43621836, -13962939, -48964776, - 968515, -20420422, 5179731, 4797479, 29577292, 15736760, 6285685, 14544907, -13067438, 143881, - 32373316, 20731808, -5641440, 8433168, -28275918, -43836584, -32244466, -22531398, -6191196, -6126771, - 8308614, -3974992, -12081743, 28310276, 7582765, -21064668, -19651622, -5592048, 8362302, -21227876, - 8699456, 26414048, -360777, 9964324, -17897128, 14134737, 10376641, 3345780, 10580652, -15790447, - -24404004, -34497176, 17547088, 13731010, 1363652, 13625784, 2731599, -15779710, -3171833, 1305670, - -27502824, -2426657, -42820824, -23547158, 7355132, -10894185, 8420283, 1099512, -5512591, -5787469, - -3869766, -7928510, 7799661, 292058, -1097364, -107176616, 36754184, -8370892, -6865505, 19344532, - 4887673, 10857677, 46952584, 28071906, 35508644, 17918604, 48423608, -8327942, -46787228, 7069516, - -5085242, -19995220, -41420664, -18023830, 36590972, 8381629, -2312840, 7718056, -2564096, 633508, - 30878668, 4011500, 11592117, -4526896, 7806103, 30659624, -8231305, -20446192, 15747498, -36395552, - -36442796, -23480586, -4410932, 1101659, 15425375, 35888748, 788127, -12275017, -35450660, -58405112, - -20336670, -8461086, -3246995, -324270, 21837762, -26738318, 48528836, 25142738, -4325032, 13945759, - -18743238, 3511136, 670015, 22376780, 43411380, 29137058, -25097642, -10630044, 7509751, -4060892, - -5104569, 2252710, -12799003, -41766408, -2845416, -7687992, -2671470, 6567005, -15940771, -5480379, - -28174986, -3023657, 4357245, 29873646, 15017353, 4194036, 5190468, 7544110, 1318555, -25284472, - 5600638, -5896990, 7148973, -3094524, -2920578, -13855564, 43364136, 43898860, 14721000, 29278792, - 21045340, 46080704, -41047004, 47921096, -59105192, -10604274, 54741504, 75172664, 15479062, -5057324, - 27206470, -23448374, -27290222, 54314156, 8549132, -8665097, 13039521, 43619688, -11785390, 26658862, - -9064528, -11239929, -5512591, 19557134, -51065012, -6442451, 24438364, -11512660, 2342905, -18217104, - 10290742, 40007620, -37372656, 11761768, -11250667, 12932147, -19666656, 26813480, 2050847, 9554155, - 10711648, -45210972, 21741124, -62861140, -13005161, 35313220, 3577708, -22576496, 38989712, -13737453, - -23927262, 28284508, -11972221, -8319352, -4756677, 17018808, -2849711, 4365835, -34482144, 12264279, - 2896956, 66752380, -50594716, -22089016, 5695127, -13108240, 14811195, 18713172, -24496346, 46645492, - 17212082, -362925, 7380902, 15530602, -7900593, -25524990, 9704479, -13234942, 3865471, -5304285, - 11875585, -16226386, 4574140, 27917, -8875550, 10636487, -4105989, 89526448, -56173876, 2055142, - -9105331, -15071040, 1705102, -20581484, -8800388, -66406636, -55649892, -55364276, 18356690, -11611444, - 18133352, -12700218, -40355512, 64046552, 44502304, -29845728, -25196426, -35218732, -7548405, 13675176, - 20952998, 25898652, -2040110, 20040318, -5991480, -25396142, -31172872, 19314468, -14325863, 58512488, - 36436356, 53972708, 7352984, 19617264, 52918292, 36846524, -11931419, 9706626, -2639258, 665720, - 5357972, -24775518, -18126910, 9562745, -31286690, -31913754, 30618822, 35188668, -38860864, -1236951, - 68184752, 47749300, -2770254, -22604412, -5315022, 14239964, 12539157, -9212705, -25853556, 30674656, - -2405182, 7567733, 21569326, 27910844, -29506426, 12594992, -5149666, 11660836, -45679124, 8471823, - 40510132, -40617504, -33846488, -17239998, 17761838, 32388348, -18642306, 17879948, -16134045, -1468879, - 508954, 6863358, 11652246, -5493263, -2937758, 7492571, 6335077, 242666, -1376537, 5471789, - 72606424, 27940910, -9715216, -2362232, 22763326, -27206470, -35373352, 30307436, -42258184, -54715736, - 14523432, -29368986, -37845104, -19752554, 36135708, 88650272, 36689760, -48262548, 90806344, 10531260, - -14235669, 16357383, -53027812, 13481902, 7325067, -38016904, 32877974, -10228465, 6489696, -27373974, - 15375983, -25016038, 45958296, -54432268, -20044612, -18807662, 25930866, 29920890, 26667452, -28930900, - 8461086, -30245160, -8677981, 16116865, 38416336, 17731772, -17643726, 37415608, 19088982, 30182882, - 2029372, 35184372, -15382425, 19454054, -53560388, 60185376, -5216238, 8381629, -15949361, -31376884, - 1617055, 20104742, 48088600, 14139032, -57490284, 24524264, -23248658, 47373488, 4114579, -18081812, - 9199820, -15635828, 9899900, -33481418, 13415330, 3197603, 2954938, 5366562, -6517613, 3459596, - -8978629, -14029511, 18801220, 11766063, 10861972, -24820616, 8237748, -13460428, 11647951, 2615635, - -1477469, 5815386, 2845416, -148921552, 6358699, 24691766, 58244052, 19007378, -91684664, 121678568, - 44498008, -56008520, 19896436, 121023592, 27064736, -29639570, -3841848, -73652248, 37572372, 3302830, - -18949396, 10389526, 24985972, -47826608, 25303800, -59882580, 6146098, -54593328, -49067852, -21006686, - 22840636, 34806416, -26897232, 30419106, -53203908, -7801808, 59431608, 5332202, -21642340, -7174743, - 11493332, -13973676, -39492224, -44079248, -5959267, -20325932, 42900280, -60591252, 63872608, 20222854, - 8070244, -21599390, -7148973, 29448444, -24099062, 39786428, 9805410, 35948876, -13428215, -21120502, - -63359356, 21453362, -6483253, -65373696, 19475530, -4582730, 39603892, 63739464, -27090506, 14340896, - 31437014, 33429878, 6805376, -19698868, -3895535, -79136920, -3938485, 7005092, 19417548, -618475, - 52982716, 11276437, 26310970, -30041148, -21410412, 39483636, -4133906, -8302172, 23976654, -5813238, - -6805376, -685047, -1378685, 2347200, -4352950, 21900038, 184451664, 84091168, 17529910, 29991756, - -37752764, -25338160, -8894877, 69720208, -49340584, 7937100, -41042708, -113359216, -54320600, 26029650, - -28915868, 18747532, -44869524, -2252710, -48249664, 41467908, -48850960, -35165044, -105149392, -19606526, - -16471200, -27633820, 54863912, -17798344, -43840880, 14302241, 42341936, 15700253, 14413910, -6298570, - -8821863, -27801324, 21620866, -35794256, -9607842, -22241488, -62672164, 9562745, -43471512, 17583596, - 5667210, -12773233, -1359357, -45704896, -2551211, -10400263, 66911296, -19245748, -1535451, 27200028, - -36621040, -16275779, 67901288, -39603892, 25982404, 1778117, 60393684, 85755464, -5010080, 11085311, - 8589935, 29673930, 15539192, -65420940, 6027987, 16544214, 23109072, -27998892, -43548820, 4578435, - 12674448, -11390253, -16548509, -70177616, -34617436, -40364104, 2838974, 8864812, -13224204, -19288698, - -21904334, -5379447, -10992969, -12281459, 14626511, -6889128, 7086696, -25252260, 1808181, -9756018, - -17493402, 4101694, 10284299, -13623636, }, - { - -92342, - -25770, -98784, 6442, -64425, 146029, 96637, -463856, 6442, -302795, -360777, - 96637, 302795, 294205, 107374, -670015, -410169, 133144, -210453, 34360, 135291, - 173946, 281320, -208306, -227633, -423054, -244813, -2147, -962073, -21475, -96637, - -281320, 197569, -556198, -485331, -985695, -137439, -871878, -268435, -23622, 691490, - 188979, 528281, -274878, 560493, -152471, 109522, 674310, 4179003, -3274913, 2037962, - -2589865, 1318555, -1262720, -1247688, -751619, -710817, 753767, 865436, -3206193, -178241, - 470299, -322123, -539018, -1879048, -685047, 1333587, 2025077, 1011465, 3193308, 646393, - -569083, 652835, 551903, -330712, 1043677, 2267743, -871878, -25770, 968515, -32212, - -221191, -1629940, -62277, 822486, 661425, 130997, 47245, -543313, 575526, -62277, - 70867, 30065, -554051, 15154792, -1002875, 1305670, -974958, 962073, -1168231, 227633, - -298500, -283468, 854699, -816044, -2770254, 779537, 268435, 837519, 1846836, 981400, - 652835, -264141, -1612760, -562641, 719407, -231928, -274878, 1541893, -1990717, -639950, - -49392, -352187, -504659, 734439, 805306, 1002875, 270583, 347892, -433792, 1395864, - -79457, 1067299, 745177, -266288, -158914, 500364, -4295, -315680, -161061, 2147, - 11162620, -10640781, 1685775, -2866891, 1556926, -182536, 1127429, -1009317, 2018635, -841814, - 1228361, -2534031, 113817, -1464584, 435939, -223338, -335007, -674310, -1857573, -180389, - 236223, -912681, 1548336, -682900, -1099512, -1398012, 856846, -891206, 2196876, -219043, - 21475, 650688, 23622, 55835, -955630, -809601, -210453, 229781, -356482, -932008, - 850404, 603443, 1513976, -341450, 508954, -201863, 296353, -26124138, 3103114, -1928440, - 90194, -268435, -2160369, 2407329, -549756, 244813, 1037235, 337155, 2785286, -103079, - -1086627, 3330747, 1367947, 3008625, -27917, -3912715, -2327872, -1870458, 1662152, -2027225, - 206158, -717260, -661425, 270583, 646393, -566936, -1202591, -891206, 833224, 932008, - 1756642, -107374, -204011, -79457, 1101659, -1166084, 345745, 500364, 826781, -944893, - 1054415, -1151051, -171799, 423054, -33002528, 12010876, -4791036, 5577015, -3809636, 2579128, - -4133906, 2409477, -3060164, 1234803, 2338610, 156766, 919123, 2151779, -1322850, 1559073, - -1707250, -1241246, -3811784, 3549791, -2224793, 2394444, 210453, 34360, -3655017, -85899, - 747324, -474594, -88047, -88047, 1574106, -178241, -1047972, 1217623, 388695, -418759, - 109522, 105227, 165356, 725850, -964220, 2617783, -176094, -1550483, -133144, -818191, - -60130, 1625645, 15025943, -3231963, 5699422, -2617783, 1956358, -2123861, 7103876, -1370095, - 3790309, -438087, -279173, 959925, -4295, -4885526, 1108102, -442382, -2203318, -534723, - 81604, -6146098, -169651, 504659, 1941325, -47245, -1168231, -238371, 2104534, 386547, - -1043677, -2068027, 3161096, -1960653, -77309, -2922725, -322123, 8590, 508954, -710817, - 775242, 1264868, -1236951, 1002875, -47245, 801011, -45097, 1449552, -730144, -438087, - 1305670, 1823214, 39575976, -11632919, 1653562, -2033667, 2536178, -45097, -100932, -5405217, - 2321430, -2405182, 1565516, 496069, 770947, 1644973, 2613488, 341450, 867583, -4561256, - 1584843, 1582696, -2950643, -635655, 2976412, 1889786, 1879048, 4234838, 2353642, 551903, - 1084479, -1692217, 1312113, -463856, 2424509, 3146064, -511101, 1007170, 1971390, -934155, - 646393, -2888366, -809601, 2725157, -6442, -2055142, -727997, 762357, 2029372, -234076, - 1127429, -103079, -1730872, 2862596, -21159156, 8972187, -6139656, 4084514, -3635690, 4812511, - -3062312, 244813, -2600603, -3204046, -4507568, 362925, -2662880, 1355062, 1556926, 3478924, - -5574868, 3506841, -1307818, 4851166, 1088774, -236223, 412317, 418759, -1103807, -914828, - 760209, -2239826, 1533303, 2765959, -3663607, -764504, -193274, 1533303, -1382980, 3936338, - -4028679, 835371, 17180, 294205, -1720134, 326418, -1071594, 1078037, 180389, 246961, - -1219771, -167504, -2551211, -822486, -128849, 616328, 216896, -889058, -3238405, -64425, - -646393, -34144992, 10870562, -6964290, -431644, -1391569, 2173254, -5869073, 453119, 1906966, - 1586990, -2031520, 1206886, -2602750, -4288525, -1657857, 577673, -2559801, 9101036, 274878, - -2480344, -798864, -2995740, -1395864, 2804614, 1683627, 3629247, -302795, 1638530, -2003602, - 871878, -1812476, -586263, -1052267, 642098, 1142461, -534723, -1720134, 468151, 676457, - 2527588, -414464, -874026, -3221226, -2604898, -1241246, -472446, 627065, 481036, -1309965, - -504659, 257698, 1232656, 635655, 251256, -564788, 1251983, -386547, 2108829, -32867238, - 15474767, -7243463, 6925635, -3560528, 4118874, 2055142, 1282048, -3710852, 493921, -1876901, - 597000, -4870493, 1881196, 3098819, 1032940, -5186173, -2546916, -2594160, -2692945, -1760937, - 3779571, 925565, 2673617, 2138894, -882616, -184684, -3899830, 5113159, -1406602, -487479, - 367220, -1063004, -1518271, -1816771, -373662, -4116726, 1275605, -2173254, 1702955, 1471026, - 2424509, -618475, 311385, -2665027, 1067299, 2007897, 523986, -416612, 453119, 1576253, - 2368675, 1030792, 2207613, 122407, 386547, -103079, -435939, 10647224, 13179107, -6006512, - 3502546, -1874753, 1292785, -1458141, 725850, 1127429, 6438156, -2327872, 2634963, 6043019, - -1690070, -285615, -1058710, 1436667, 3109556, 3182571, 4155381, 1093069, 3532611, -949188, - -2136746, -7168301, 1471026, -1123134, -3607773, -2594160, -150324, -717260, 2272038, -371515, - -4166118, -4312147, 1123134, -3753802, 472446, 2214056, -3360812, -2276333, -1443109, 1612760, - 1479616, -154619, -463856, 2450279, 508954, -1009317, 979253, -2201171, 249108, -1181116, - -1644973, -1142461, 1677185, -914828, 1260573, -1007170, -2102387, 517544, 1133871, -781684, - 642098, -970663, 38019052, -13247827, 7168301, -4973572, 7127498, -5042292, 4367982, -1640678, - 4436701, 1069447, 3120294, -3648575, 3725884, -1288490, -3107409, -332860, -3337190, -5327907, - -2813204, -590558, 2690797, -3655017, -4876936, -5980742, -1078037, -536871, 4767414, 2600603, - 3062312, -2110977, 2476049, -1909113, -1866163, -1039382, 3146064, 2703682, 846109, -36507, - -115964, 70867, -884763, -515396, 2177549, 408022, 5362267, -2074469, -646393, -4488241, - 2927020, -1185411, -695785, -1071594, -277025, 242666, -743029, 796716, -1196148, -2147, - -1696512, -768799, 380105, 1728724, -908386, -135291, -609885, 10660109, -16344498, 9545565, - -6128919, 7410966, -107374, 4591320, 1279900, -7176891, -3416647, -2435247, 850404, 1771674, - 977105, 8055211, -4567698, 6433861, 1099512, 796716, -4440996, -979253, 5555540, -388695, - -4765266, 5373004, 4093104, 891206, -2248416, -1775969, -496069, -397284, 2473901, -1245541, - 1088774, -3042984, -695785, 1722282, -4383014, 1647120, -1715839, 1539746, -1288490, -405874, - 5113159, 2199023, 2901251, -244813, 1185411, 1864016, -412317, -1436667, -2293513, 755914, - 1011465, 1806034, 2183991, 498216, -523986, -2291365, -1058710, -2319282, -2078764, 246961, - 42950, -1745904, -40443560, -8134668, -1043677, -6713034, -2757369, 6103149, 2630668, -1720134, - -1524713, -4814659, -3182571, -3897683, -4376572, -3624953, -2291365, -3274913, -5602785, -4784594, - 1909113, -4859756, 1683627, -6554120, 266288, -2682207, -2130304, 5802501, -536871, -2744484, - 3768834, -4116726, 3981435, 1232656, 4198331, 2879776, -25770, -1928440, 4415227, -2147, - -609885, 4026532, -1591285, -5340792, -6043019, -1509681, 2089502, 1355062, -1752347, -120259, - -1617055, 448824, 152471, 373662, 3891240, 1563368, -2695092, -981400, 566936, 2486786, - 631360, 3682935, 1063004, -242666, -1784559, -1632088, 96637, -47620448, 41461468, -16883516, - 11512660, -10819023, 2658585, -5312875, 7022272, 1329292, 826781, -3393024, 4763119, 966368, - -8546985, 867583, 1275605, -4307852, -6584185, 6515466, 8100309, -2615635, -2121714, 1344325, - 3740917, -2194728, 7380902, -242666, 1881196, -5360119, -1887638, -3199751, 4816806, -1082332, - 1060857, 1024350, -2740189, 4638565, 4481799, 1202591, 1550483, 5437429, -3309272, -904091, - -678605, -3987877, 869731, -2611340, 987843, -148176, 373662, 4432406, -150324, -1041530, - 1009317, 206158, 2937758, -2738042, 1045825, -208306, 5738077, -1737314, -204011, -2282775, - -459562, -1479616, 31731218, -3893388, -6700149, -1638530, 4213363, 2145336, 1870458, -294205, - -4479651, 1035087, 2624225, 2982855, -2078764, -1960653, 6354404, 2132451, -5074504, 1017907, - 8239895, -10426033, 6869800, 781684, 8800388, -644245, 448824, 1683627, 1733019, 4606353, - -3493956, -1355062, 1690070, 3294240, -1374390, -141734, 380105, 732292, 2055142, -4303557, - -148176, 2433099, 657130, -2388002, -775242, 5441724, 3992172, 1881196, -2143189, -1576253, - 1531156, -743029, -1395864, 929860, -1733019, -2673617, 5596343, 2179696, 3582003, 539018, - 2692945, 2192581, 2390149, 242666, 2905546, 1445257, 2052994, -1733019, 354335, 762357, - -2546916, 878321, -1249836, -268435, 15098958, 4385162, 3642132, -2214056, -1481764, -4103841, - -2931315, 745177, -1608465, -2020782, -5877663, 5003637, 3466039, -3663607, 6259915, -5896990, - -1782411, 2624225, -4365835, 2534031, 4065187, 6206228, 5482526, 5220533, 2712272, -11046656, - 4295, -2321430, 2214056, -1069447, 4322885, 2924873, -1421634, -2690797, 2838974, -1977833, - 7292855, -4295, 2413772, 7383049, 7078106, -5345087, 450972, -3526168, -6352257, -691490, - 1198296, -816044, -1299228, -682900, 554051, -2980707, 399432, -3476776, -968515, -414464, - 929860, 21475, -2025077, -2166811, 4434554, -1567663, 685047, 1975685, 2454574, -1357210, - -1374390, -652835, -3493956, -2388002, 384400, 758062, 35680440, -25104084, 9139690, -9536975, - -734439, -6663642, 6030134, 5989332, 1932735, 1217623, 5665062, 15571404, -13683766, -1902671, - -3556233, -5527623, 12081743, 9096741, -1861868, -8278550, 3356517, -6764574, -5405217, -9476845, - 1213328, -9704479, -3204046, 5714454, 826781, -2978560, -8005819, 12885, -1930588, 4864051, - 4475356, 2063732, -3635690, 543313, -227633, 1964948, 3863323, -2454574, -1236951, -4344360, - 6582038, -820339, 972810, 5864778, -1211181, -541166, 2347200, -2954938, -304943, 2540473, - -4361540, 985695, -809601, -388695, -4548371, 2203318, -974958, 384400, 1118839, -1690070, - 2982855, -2355790, -609885, -4876936, 438087, -685047, 2022930, 2128156, -55548960, 7703024, - 792421, 3917010, -4254165, -6919193, -15032, 4666482, 7406671, -433792, 11254962, 6279242, - -7582765, -6762426, 5272073, 966368, -5394479, -10039486, -11519102, -7376607, -8493298, -9509058, - 1750199, 3062312, 2568391, -7028714, -6755984, 1065152, -1754494, -1127429, -874026, -5602785, - 4801774, -9665824, -3592740, -1445257, -317828, 3135326, 1129576, -635655, 4516158, -1329292, - 4503273, 2602750, -3397319, 586263, 7295002, -2860448, -2858301, 225486, 4290673, 1136019, - -2972117, -3837553, 3594888, 225486, -5044439, 7026567, 7926362, 989990, -2201171, 977105, - -96637, 1709397, 3532611, -304943, 4670777, 2976412, 2695092, 2355790, 1251983, 1969243, - -2259153, -135291, -34048352, 29072634, -9749576, 6199786, -180389, 4829691, -11802570, 4544076, - -8053064, 25770, -5458904, 10907069, 9268539, 3500398, 730144, -8985072, -5980742, -936303, - -3635690, 10355166, -8497593, -345745, -4224101, 15171972, -4855461, 1352915, -455267, 2609193, - 1163936, 2602750, 1885491, -2514703, 1340030, -614180, 5272073, 816044, 10020159, 5211943, - -3270618, -682900, -1279900, 184684, -3865471, -2705830, -989990, 1795296, 12221329, 1114544, - 790274, -3362960, 4967130, -1853278, -2647847, 1617055, -2574833, 1511829, -3189013, -6854768, - 3371549, 3038689, -985695, 7166153, 1494649, 1702955, 2544768, -1919850, 818191, 2325725, - -5961415, -2783139, -489626, -2699387, 2697240, 4234838, -1556926, 7269232, 4829691, -163209, - -1932735, -1462436, -504659, 22215718, -487479, 5016522, -15079630, -2499671, 1917703, -12167642, - 983548, 16879222, -2929168, 1221918, -7599945, -10417443, 2662880, -9517648, 14877767, -10314364, - 3577708, 3524021, 7971460, 6199786, -1614908, -9201967, -1058710, -841814, 4724464, -6448894, - -1241246, -1887638, -3062312, -2181844, 4518306, 2778844, 12066711, 4099546, -4479651, 5007932, - -3272765, -3451006, 3717294, 10327249, -1475321, -5323612, -4980015, 5491116, -126702, -7471096, - -6878390, 3532611, 3292093, -3098819, -5684389, -9446781, 2619930, 3521873, 2375117, -5334350, - 4015795, 2467459, 1677185, -1894081, -573378, 2924873, -7088844, -925565, 3131031, 3682935, - -670015, 1795296, 154619, 75520560, -4870493, 2987150, 6865505, -6674379, -2877628, -2323577, - -17862768, 11903502, -1992865, -11100343, 2327872, -5723044, 6433861, 5078799, 8192650, -2997887, - 11141145, 9536975, 6077379, -9938554, 7524783, -13612899, -8055211, -9283572, 3588445, -7146826, - -1342177, -2476049, -9090298, -4964982, 7563438, -5731634, -4348655, -8682276, 2740189, 2723009, - 6397354, -3706557, 11053098, 2716567, 12607876, -1513976, 2244121, 2493229, -7054484, 4930623, - 12910672, -4526896, -418759, 3466039, -3826816, -5291400, 3021510, -5272073, -2866891, -6874095, - -4522601, 4992900, 4453881, 2976412, 4786741, 6025839, 5744519, 8665097, 1372242, -2643552, - 4471061, 3015067, -90194, -923418, 324270, -3320010, -736587, 633508, 760209, -238371, - -33247342, -65399468, 24535000, 433792, 1544041, -6358699, -6807523, -1382980, 2456721, -4056597, - 17334488, -7741679, -14774687, 1067299, 1144609, -1799591, -5080947, 11847667, 2314987, -5080947, - 5632850, -10206990, 13338021, -7198365, -3635690, -8802535, 14867029, -6191196, -1930588, -8727374, - -3914863, 8111046, -3524021, 8768176, -10954314, -12889197, 1267015, 2400887, 2454574, -212601, - -6551973, 1378685, 3678640, 1857573, 7000797, 85899, 10866267, 1602023, 10198400, 13209172, - 2927020, -871878, 2671470, -7219840, -1677185, -12139725, -10711648, 3315715, 3448859, 2252710, - -554051, -3388729, -1625645, -2884071, -1462436, -2879776, 268435, -171799, 2497524, -650688, - -1221918, -4088809, -113817, -4767414, -377957, -6360847, -639950, -2308545, -502511, -21912924, - 64132452, -29149944, 13423920, -6152541, 20405390, -3169686, -8939974, -9345849, 5398774, -2761664, - -1155346, 496069, 4041564, -21509196, -10458245, -5527623, 8626442, 7226283, 12629351, 2327872, - -1846836, -1960653, 15144055, -19561428, 11420318, -9397388, -1891933, -9902047, 15648713, 6279242, - -10048076, 1372242, -4359392, 1705102, 6687264, -28093382, -11660836, 2340757, 9968619, -5759551, - 2173254, 7239168, -2834679, -3152506, -929860, 10907069, 4395899, 1887638, 1320703, 4219806, - 12889197, -7735236, 5954972, -17927194, -2989297, 4065187, 8772471, 1642825, 1372242, 438087, - 4810364, -3493956, 663572, -1247688, -4101694, -3672197, 6841883, 6543383, -2332167, -3382287, - -11029476, -4715874, -2360085, -1992865, 8287140, -3100967, -2901251, -5461051, -4784594, -395137, - -57488136, -12393128, 5639292, -13623636, 3448859, 2521146, 8439611, -25770, 16076063, 10503343, - 5819681, -4387309, -7870528, -390842, 17005924, -14512694, -5538361, -11242077, -236223, -30760556, - -24257976, 1550483, 15075335, 20755430, 4799626, -7522635, 7084549, -6676527, -4460324, -4537633, - 2063732, 5454609, 1337882, 8096014, -6111739, -10922102, 9075266, 5989332, 19048180, -2304250, - 3111704, -2701535, 15365246, -15945066, -8010114, -3747359, -12113955, 7750269, -4990752, 6515466, - -12977244, 12987981, 12579959, 11605002, -4700842, 10292889, 564788, 3618510, 6023692, 4327180, - -5418101, 996432, -1677185, -249108, 11819750, 4462471, -5177583, 9614284, -1537598, -8216273, - -2727304, -539018, -11628624, -405874, 4872641, 6401649, 1024350, -176094, -4797479, 1831804, - 2832531, 41624676, 27041114, -8609262, 12225624, -27790586, 19402514, 7067369, 14585709, -5100274, - -3770981, -15247134, -7866233, -26010322, -4569845, -20725364, -6352257, -12801150, -13106093, -17622250, - 6878390, -24049670, 3137474, 10271414, -4694400, 3176128, -10406706, -227633, -3309272, -3511136, - -14151917, -1990717, 1529008, -1058710, -2259153, -7462506, -6491843, 4234838, 4520453, 5976447, - 30356828, -12384538, -801011, 12223477, -3051574, -5179731, -11781095, 3496104, 10241350, 16986596, - 5667210, 14143327, -14033806, -21058224, 1898376, 13612899, 7582765, -11422466, 13035226, -10024454, - 6227703, 2499671, 11839077, 6624987, 4279935, 7960722, -8169028, 5031554, 4194036, 2321430, - 11626476, 2572686, 9373766, -1539746, -3897683, 1380832, 2147484, 1844689, 11278584, -1947768, - -6517613, -738734, 84217864, -54445152, -2916283, 6354404, 1737314, 6670084, 11577084, -2289218, - -1808181, 6502581, -9676561, -9259949, -1477469, 7492571, 30346092, 1301375, 10520522, -9730248, - 665720, -29927332, 18564996, -18092550, -25750476, 6027987, 7305740, -9554155, 8677981, 3637837, - 20068234, 22164178, -3616363, -8340827, -6242735, -33077690, -17972290, 25960930, 8626442, 9562745, - -14858439, -15305116, 4610648, -2957085, -13112535, 11510512, -2433099, -8235600, -9451076, 6524056, - -8456791, -4552666, 30492120, -18530636, 5708012, -6644315, 7127498, -8338679, -3347927, -22686018, - 3901978, -8398809, -5577015, 18137646, 4456029, 5059472, 11050951, 13153337, 3996467, 9105331, - -3977140, -1078037, -14828375, 6813966, 12382391, -2813204, 884763, -1367947, -3021510, -3839701, - 1458141, -3949223, -1713692, -52104396, -25512106, 9998684, -2959233, 19288698, -2403034, -4707284, - -14847702, -16666621, 9255655, -17435420, -5849746, -9764608, -1698660, -10320806, -6987912, -8233453, - -4093104, -10277857, -19765440, 11798275, -39483636, -133144, 35886600, 8972187, 92342, -9446781, - 2804614, -35699768, 15135465, 9330816, 2761664, 13292924, 19608674, -14959371, -7752416, -15577846, - 2609193, 854699, -9133248, -10453950, -11639361, -6777459, -274878, 8196945, 923418, 6775311, - 3942780, 1101659, 24973088, 6240588, -3706557, 19887846, -9300752, -21945136, -6573448, -2302103, - -2931315, -1123134, -7432441, -1408749, -9332964, -1984275, -9496173, 1318555, 5527623, -10346576, - -2768107, -5551245, 715112, -10492605, -13477607, -5609228, 5836861, 10075993, 4196183, -2869038, - -100932, 4084514, -1505386, -1911261, -4544076, 2564096, 5405217, 1421634, 45097, -5695127, - -32089848, 43628276, -21288006, -10473278, -35358320, 27876486, -9631464, 16492674, 1157494, 1159641, - -10634339, 21891448, -5291400, 7243463, 5519033, -9781788, -3255585, -3051574, -18691698, 3925600, - 3536906, -14375256, -24298778, -14985141, -22348862, -5278515, 12298639, 6571300, -13112535, -12964359, - 19754702, 13722421, -16879222, 15824807, -8360154, 14027363, -21427592, -16808354, -16312286, 6049462, - -14439680, 9423158, -6468221, 4116726, -3912715, -1846836, 3474629, 15921444, -34218004, -4099546, - 6927782, -2886218, -10350871, -24500640, -2130304, 22975928, 8590, 19947976, 14577119, 4473209, - -2742337, 15300821, -14847702, -11952894, 9650792, -3317862, -9201967, 6635725, 1909113, -6968585, - -10591389, 18303004, -16737488, -8849780, -9987946, 10520522, 562641, -6929930, -4039417, 5628555, - -15461882, 341450, 4191888, 3466039, 399432, -4975720, -7509751, -73916384, 28112708, 12148315, - -18279380, 9631464, -20729660, 19447612, 16844862, 14385993, -37666864, 23444078, 40763536, -5186173, - 14134737, 1022202, -12146168, -16056735, 44865228, -221191, -3502546, -24081882, -47908212, -25812754, - 2871186, -21030308, 18249316, -31318902, -10106058, -18352396, 5546951, -6970732, -23212150, 4297115, - -5037997, 15850577, -4810364, -18247168, -6713034, -56549688, 10604274, -1455994, 26703960, -15792595, - -17422534, 24818468, 5568425, 4320737, -9410273, -14948634, 5836861, 11441793, 8506183, -3730179, - 9012989, 4939213, 1410897, -4726612, -4960687, -18515604, 1881196, -7217693, -10531260, 10086731, - 5948530, 27908698, 6199786, -18431852, -18337362, 4337917, -11738146, -8714489, 3513283, -8974334, - -15032, -4030827, -5046587, 5473936, -6964290, 2901251, -513249, -1294933, -2336462, -3893388, - -8632884, -10791105, -3002182, -9279277, 61132416, -25333864, -485331, 2583423, 25037512, -4176856, - -5922760, 16928614, 29654602, -21444772, -24676734, 17716740, -4432406, 15307263, 22486302, 18650896, - 15895674, 12644384, 14963666, 59390808, -6002217, 3627100, 10808285, 32407676, -7786776, -12970801, - 11879880, -1692217, -11753178, -14156212, -12605729, -470299, -16112570, 22181358, 33681132, -2574833, - -9524090, 13711683, -9352291, 19965156, 13922136, -223338, -18811956, 12880607, -2308545, -6573448, - 1879048, -3171833, 39320424, -4105989, 16582869, -9562745, 34924528, -4032974, 2280628, -13144747, - -22724672, 17637284, -11774653, 35521528, 7009387, 16492674, -801011, -466004, 9547712, 2183991, - 24921548, 13851270, 3762391, 12425340, -16125455, 5164698, 10952167, 751619, -5267778, 20699594, - 4305705, -7503308, -7943542, 7999377, -4904853, -463856, 11014444, -4194036, 6320045, 2463164, - -7627862, 80474800, -22943716, 7750269, -7486128, 3798899, 10533407, 27215060, -20744692, 11544872, - -266288, 1707250, 14804752, -11710228, 15807627, -42011224, -19024558, 7365869, 15880642, 11441793, - 33758444, -33170032, 5345087, -4702989, -45758580, 19838454, -17742510, -11323681, -6599218, -37325412, - 12300786, 13565654, 5927055, -19301584, -32858648, 13249974, -20347408, 18184892, -31499290, 801011, - -37705516, -8897025, -25183540, -21487722, 22314502, 35126392, 4827543, 13176960, -16041703, 6880538, - -26912266, 11824045, -17695266, 5317170, 25701084, 13544179, -9122511, 16058883, 2518998, 13975824, - -11678016, 23117662, 38635380, 2566243, -23514946, -15700253, -10576357, -3783866, 2362232, 17912162, - 3309272, 28778428, -251256, 11353746, -25823490, -3236258, -18700288, -2952790, -2948495, 6380174, - -23461258, 3768834, -1986422, 7593502, 2308545, 4984310, 2126009, 2471754, -81559280, -68373728, - 29280940, -8332237, 34003256, -2342905, 11308649, -40733468, -38210176, -23117662, 13129715, -31467078, - -21640192, -9101036, 6644315, 23514946, 8555575, -46263240, 12814035, 26336740, -65779572, -7578470, - 3446711, -69808248, -23796266, 31525060, -64688648, 32122060, 33743412, 727997, -9118216, -2347200, - -15375983, -16935056, 11903502, 14652281, 48964776, -28479928, -14867029, -11791833, -22368190, 1644973, - -38360500, -9313637, 3184718, -777389, -12322261, -1649268, -21023864, -3998615, 12105365, -4995047, - -13627931, 16430397, -7316477, -15455440, -22310208, 48290464, -1780264, 29551522, 4080219, 11291469, - 31840740, 4898410, 21758304, -14014478, 24152748, 17703856, 5415954, 6612102, 6077379, 21197812, - 9717364, 4211216, 20353850, -8227010, 3137474, -2001455, -31284542, 15066745, 7670812, 4645007, - -19086834, -5149666, 3764539, 6459631, -5362267, -132559872, 50304804, -14448270, -59332824, -14319421, - 1737314, -15189152, 23237920, -51359220, 25074020, -3951370, -59055800, -40675488, 8364449, 23744726, - 22492744, 16518444, 35169340, 10168335, 57685704, 31630286, 67572720, 8933532, 54941220, -41942504, - -32920924, 11493332, 5020817, -33238752, 9616432, 7249905, -4387309, -12573517, 32682554, 6365142, - -71236328, -31726924, 24247238, 8409546, -14892799, 20602958, 21146272, 32637456, 7273527, 9786083, - 6360847, 9575630, 12154757, -24711094, 4075924, 4702989, -52587580, 25054692, 18650896, 22565758, - -35946728, -20918638, 26749056, 152471, -6721624, -5353677, -15193447, -13593571, 403727, -18126910, - -40336184, 13937169, 43679816, -30384746, 4552666, -17231408, -6708739, -12537010, -3603478, 22443352, - 5697274, 18556406, 5718749, -19567872, -13630079, -15880642, -9214852, -12977244, 3474629, -8201240, - -1432372, -12423193, 4340065, 6541235, 7466801, -3728032, 56446608, 38392712, 26761942, 14879914, - 2439542, -12264279, -19078244, 18195628, -54891828, 59392956, -35652524, 10161893, -59652800, -1498944, - 57466664, 23008140, -19411104, 36724116, -56639880, 23618026, 11375221, 4722317, -69911328, -20461224, - 5010080, 12075301, 46033460, -68743096, -8705899, -22357452, -64716568, -13630079, 16355235, 33389076, - 49694920, 38809324, 38588132, -2521146, -23703924, 25690346, 8214125, -14261439, 9614284, -31226560, - 51455856, 24492052, 17847736, -25771952, -57445188, -14815490, 1986422, -69709464, -56296284, -14265734, - -50429360, 33532958, 13353053, 10919954, -22877144, -24567212, 10475425, 7836168, 4928475, 16486232, - -9186935, 12631499, 34235184, 15977278, 6335077, 5267778, -21504902, -17856326, -16030965, 10486163, - -5304285, -44386340, -35450660, -2907693, -28430536, -25031070, -6781754, -36515812, -22776212, -5153961, - 2619930, -4632122, -1825361, 9592809, -6515466, -2003602, 2611340, 64171108, -49984828, 13499082, - -7017977, -6463926, 1239098, 17766132, -31095564, 41732048, -11957189, 28619514, -2699387, -23212150, - 44470092, 43780748, 31432718, -14665166, 67355824, 24889336, -75067440, 77524160, 7204808, -236223, - 56178172, 2454574, -24169928, -32549410, 55465208, -34688304, -46059228, 44721348, 39208756, -25477746, - -61291332, 24056112, -20912196, 8484708, -43046308, -35504348, -14489072, 41843720, 37840808, 4902705, - 34752728, -50236084, 16402480, -13267154, -18453326, 23957328, 3620658, 7292855, -69965016, -19299436, - 39335456, -50272592, -12788265, -63052268, -11446088, -23602992, 10907069, -15300821, 7417409, 6403796, - -1846836, 6234145, -16520592, -56034292, -10219875, 28436978, -3461744, 19692426, -21189222, -49196704, - -8349417, 10737418, 31595926, 7514046, 17467632, -1924145, 7406671, 11690901, 7584912, -17182016, - 4735202, -7110319, 7784628, -13720273, 8508330, 3176128, 1380832, -1664300, -11317239, -6034429, - 58254788, 4614943, -16758962, -41487236, -1267015, -19754702, 15625091, -34243776, 22007412, 14068165, - -29923038, -30696132, 46669116, -54713588, -2007897, 35558036, -39573828, 12938589, 45612552, -36039072, - 31329638, 23046794, 33520072, -54795192, 47586092, -55022828, 16763257, -41854456, 5381594, -21341692, - 37497212, 1279900, 23003844, 11929272, -39056284, -23766202, -54043572, 31737660, -36565204, 31913754, - -43997644, -50115824, -84022448, 8345122, 44311176, -6607807, -1166084, 14100378, 38210176, -12771085, - 10353019, -46349140, 11948599, 61873300, -6109591, 56109452, 73360192, -335007, 12386686, 15197742, - -31164282, 16387448, -37782828, -1760937, -38785704, -37576668, 2325725, -14147622, -63808180, 43465068, - 1131724, 32371168, -37617472, -19110456, -14328011, 16670916, -268435, -9829033, -9848360, -6294275, - -2360085, 3826816, 4215511, -7441031, 8768176, -8557722, -8564165, -4670777, 12339441, 9283572, - 10269267, -4829691, 7758859, -131621424, 33436320, 49329848, 13718126, -57015692, -8310762, 92876520, - -106646184, -2660732, -17946520, -69735240, -17540646, -47238196, 17388176, 17282948, 40864468, 16582869, - -55714316, -19752554, 40288940, -63606320, -18010946, -68027984, 58181776, 17489106, 45530948, 77500536, - -27193586, -16292958, -12674448, -38744900, 37260988, -18148384, -46110768, -51777980, -8963597, 19939386, - -1324997, 10640781, 12773233, 30208652, -13114683, -1355062, 22501334, -21502754, 43997644, 49954764, - 47221016, -38087768, 5274220, -11830487, 22688164, 94173600, 70759584, 134786816, 10877005, 53334904, - 43288976, -20394652, -4436701, -6977175, -12365211, 17087528, 4179003, 48578228, 36745592, -16359530, - -4737349, -28729036, -56324200, 22801982, -581968, 19406810, -3871913, -39011188, -5482526, 5974300, - -21575768, 13297219, -13662291, -18897856, 794569, -18936510, 173946, -5192616, -4436701, 221191, - 3178276, -11800423, 1949915, 843961, 216896, 4844723, 204930064, 99151464, 35676144, 32192928, - -48019880, 31879394, -38686916, 47470128, 38978976, 36571648, 9753871, -66378720, -36919540, 73508368, - 13144747, -3704409, -14957224, 82218560, -88018912, -36715528, -21726092, -6085969, -62206160, 15451145, - -53693532, -29753386, 9442486, -33833604, 51133732, -48318384, -20598664, -11512660, 54619100, -89425512, - -16831976, -66432408, -1440962, 143881, -58282708, 10106058, 46662672, 25514254, -605590, -27144194, - 2952790, 28239410, -36494336, 74790416, 101515848, -5912023, -62337156, -58727236, 42133628, -14568529, - -13159780, 87383256, -18017388, 28185722, -1900523, 55106576, -10473278, 7565585, -10005126, -34194384, - -96091304, -57286272, -8572755, -25497074, -66073776, -43374876, 25559350, 56515328, -4114579, -6768869, - -5471789, -8581345, 31241592, 19868518, 4917738, -18418968, 22080426, -12006581, -43608952, -41856604, - 6036577, 29478508, -33865816, 23111220, -1642825, -12764643, -10915659, 1342177, -18661632, -14441828, - 1449552, -5302137, -2272038, -8710194, }, +const Word16 CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS][2868]={ {-1, 0, 0, 0, -1, 0, -1, 0, -4, 3, 0, 3, -1, 1, 7, -1, -9, -9, -3, -5, 1, -4, -12, 3, -3, -2, 3, 1, -4, -6, -8, 1, -5, -3, 2, -8, 7, 8, -4, -1, -3, -8, 1, -7, -5, 5, -4, 8, 33, -14, 15, -6, 5, 0, 8, -3, 2, 3, 4, 4, 7, -2, 1, 14, 10, -26, 5, -3, 1, -9, 6, -11, 11, 9, 5, -1, -4, -4, 8, 7, -3, 2, 14, -5, 0, -5, 2, 2, 0, -4, 7, 1, -2, 5, 134, -10, + 19, 0, 6, 3, 5, 3, 13, -7, 5, -3, 2, 7, 11, 4, 2, -5, 10, -7, 4, -3, -11, 1, 4, 0, -3, 1, -4, 7, -14, 3, -3, 4, 0, -20, -7, 2, 3, 2, -3, -5, -4, 3, 8, -3, 3, 81, -96, 19, -23, 13, -15, 12, -20, -6, -13, -2, -10, 1, 19, 27, 12, 6, 1, 9, 20, 14, -9, -11, -14, -7, -8, 1, -1, -1, 0, 4, -7, 9, -9, -12, 4, 0, 1, 3, -8, -9, 3, -5, -7, -1, 1, 6, -185, 37, -9, 5, + 4, -16, -7, 15, -2, 1, 17, 5, -6, -12, 12, 1, -14, -20, -29, 9, -13, 3, -4, 5, -3, 2, -15, -15, -9, -4, -9, 3, -5, 5, 17, 3, 3, 12, 3, 3, 0, -2, -11, -3, 3, -2, -1, -222, 83, -21, 27, -13, 19, -11, -3, -19, 15, -22, 15, -4, 21, -28, 7, 26, 8, -22, -8, -13, -5, 8, 4, 6, -3, -8, -11, -10, -1, -12, -2, -11, -8, -31, -9, -4, 2, 1, 11, 5, 11, -1, 12, 3, 1, 3, 28, 97, -27, 43, -26, 11, + -28, 22, -2, 24, -2, -2, 24, -4, -3, 21, -10, -19, -30, 27, -2, 18, 2, 13, 6, -18, 7, 7, -1, 9, 14, -17, 2, -1, -1, -10, -4, -10, 3, -2, 8, 23, 1, 11, -2, 2, -2, 3, 9, -4, 291, -72, 28, -14, 25, -11, 19, -10, 6, -28, 13, -27, 21, -8, 6, -8, 29, 4, 7, -14, 19, -2, -9, 16, -13, -20, 1, -6, 9, 0, -3, -6, 3, -1, 4, -13, 3, -6, 21, -4, 10, 2, 8, 16, -11, 1, 4, -5, 12, -3, 25, -151, + 60, -47, 28, -23, 8, -31, 20, -12, 28, -3, 12, -24, -10, -2, -9, -8, 32, -24, 4, 15, -29, 8, 10, -7, 10, 3, 6, -19, -2, -6, 12, -9, 6, -22, -4, 16, 8, 5, -6, -3, -17, -18, 10, 4, -1, -3, -2, 2, 2, -4, -4, 2, 2, -6, -244, 80, -43, 11, -4, 14, -18, 20, -8, -7, -2, 14, -8, -11, 8, 28, -4, 1, -46, 4, 1, 23, -7, -3, -35, -12, 0, 1, 12, 17, -27, -24, 16, 4, -27, -21, 10, 6, -2, -1, -11, 11, + -3, 4, 1, -14, -6, 8, -22, -11, -4, 5, -4, 0, -11, -1, -244, 108, -60, 45, -42, 21, -47, 11, -31, 49, -25, 17, -3, 0, -22, -6, -9, 44, -8, 23, 36, 21, 5, -5, 9, -8, 20, 19, 3, -10, 3, 4, -13, -6, 10, 15, -11, -11, -11, 1, -5, 6, -11, 8, -17, 5, -9, -1, 2, -7, -9, -12, -11, -15, 2, -13, 91, 94, -35, 31, -38, 6, 12, 1, -15, 18, 5, 37, 20, 42, -6, 25, -7, 16, 22, -3, -31, 29, -3, 12, -7, 0, + 4, 36, 5, -19, -7, 5, -11, 27, 12, -4, -7, -15, 12, -15, 15, 16, -12, 9, 8, 4, -1, 26, 16, 19, -1, 2, 9, -6, -2, -2, -6, 0, 1, 2, -5, -11, 275, -98, 34, -46, 31, -30, 40, -14, 2, -30, 61, -9, 55, 3, 9, -37, 13, 55, -17, -46, 7, 2, 21, -33, 27, 0, 2, -3, -32, -9, 5, -39, 6, 16, 13, -11, -3, -1, 18, 5, -3, -8, 14, 10, 35, 9, -5, 20, 8, -2, 6, 15, 10, 2, 2, -11, 2, -1, 15, -1, + 6, -2, 92, -133, 80, -59, 25, 9, -6, -5, 16, -34, -21, -17, -14, -46, 23, -43, -2, -34, 13, -26, -20, -10, 39, 5, 38, 20, 26, 37, 2, -5, -6, 11, 29, -2, -2, -19, 15, -2, -11, 11, 9, 30, 12, 14, -21, -10, -1, -4, 15, -43, 9, -11, -7, -13, -15, -5, -15, 6, -10, -2, -23, -22, 0, -283, -62, 13, -54, -22, 2, -2, -46, 13, -46, 1, 37, -7, -6, 20, 13, 20, 1, 25, -14, 7, 29, -2, -2, -19, 27, -21, -12, 7, 11, 21, + 64, -18, -10, -28, 2, -21, 5, -8, -30, -2, 39, 11, -26, -13, 13, -16, -20, 4, -9, 2, 4, 24, 4, 12, 6, -21, -10, 13, 12, -8, 7, -2, -347, 286, -100, 85, -63, 48, -18, 30, -33, 20, 24, 35, -22, 42, 21, 71, -11, 6, -38, 10, -13, -24, -29, -34, -31, 46, -2, 55, 14, 10, -1, 7, -24, 4, -9, 12, 33, 6, 11, 2, 3, -25, -14, -1, -2, 3, -8, -23, 1, 25, -8, 7, 7, -20, 14, 6, 8, -4, 2, -2, -6, 2, 22, 202, + -31, -65, -23, -14, -10, -57, -30, 16, 10, 16, 20, -39, 16, -8, 14, 62, -63, 22, 22, 17, -16, -36, 28, 8, 20, 38, 0, 53, 5, 24, 2, 17, -14, 20, 14, 19, -7, 6, -1, 24, 30, -45, 60, 5, 17, 3, 11, 12, -13, 36, 20, 1, 33, 14, -18, -1, -12, -13, -10, 6, -2, 2, -1, -37, 19, -15, 5, -5, -2, -9, -5, 160, 14, 33, -41, -8, -103, 25, -5, -70, 59, -32, 2, 43, 19, 32, -25, 14, -32, 1, -28, 10, -42, 61, 44, 36, + 42, 9, -14, -26, 12, 33, 0, 23, -16, 5, 22, 16, 20, 1, 7, -2, -14, 14, -10, 7, 6, -14, 20, -27, 24, -12, 17, 26, -31, 3, 4, -13, -25, 18, -40, -31, 19, 8, 9, 8, 25, 24, -9, 3, 15, -6, 0, 253, -210, 71, -52, 19, 66, 53, -35, 64, 36, 39, -26, 18, -13, 76, 21, 21, 29, 32, 20, 22, -62, 10, -113, -39, -10, -65, 16, 35, -24, -35, -41, -40, -21, 23, 18, -57, -66, -5, -34, 18, 15, 6, -5, 31, -17, 2, -4, -14, + -43, 33, 56, -8, -7, 26, -40, 48, 12, -24, -1, -23, -10, -6, -16, -4, -11, -33, 9, 12, 11, 12, 4, -391, 39, -35, 14, 40, 29, 80, -33, -3, 6, 95, 33, -75, -49, 42, 56, -14, -21, -2, 26, 58, 59, -1, -106, -31, -11, -13, 62, -28, 36, 3, -7, -55, 4, 44, -71, -41, -17, -12, -34, -28, -66, -12, -45, 0, 10, 47, -33, -21, 4, -5, 7, -41, 16, 15, 5, 2, -31, -28, -16, -9, -3, -53, 11, 15, -23, -49, 19, -2, -25, -5, -12, -8, + 31, -230, 244, -35, 15, 57, 69, -52, 33, 13, 43, 29, 60, 34, -41, -68, 10, 72, 143, -35, -49, 37, 23, -27, -70, -14, -14, -64, 56, 66, 1, 15, -1, 52, -41, -126, 53, -15, 42, 20, 2, -31, -49, 34, 40, 29, -6, -3, 44, 25, 13, -26, 37, 31, -5, -10, -21, 25, 1, -62, 51, 31, -12, 15, -8, 2, -1, 15, 4, 19, 30, 16, -5, -18, -12, 44, 17, -8, -13, -2, 69, 3, -53, -108, 26, -6, -89, 30, -30, 4, -34, -26, 28, 68, 8, 90, + 41, -45, -60, 99, -43, -3, 9, -92, -1, 49, -54, -14, 62, 4, 32, 1, 41, -7, -28, -4, 54, 73, -24, 15, 13, 49, -29, -5, 9, -12, 32, 14, 3, -17, 25, 28, 1, 1, 21, 33, -40, 0, 11, 18, -20, 16, 8, 1, 11, -12, 6, 13, 27, 33, -27, 3, 512, -49, 9, 32, -46, -79, -46, -19, -90, -97, 8, -86, -37, -25, -21, 53, 62, 20, 129, 24, -63, 111, -11, 79, -25, -8, -73, 3, 65, -2, -31, -12, 7, -16, -13, 25, -58, 24, 9, -27, + -55, -37, 43, 42, 51, -84, 48, 13, -2, 4, 9, 10, 11, -7, 5, 45, -12, 18, 21, -18, 38, 43, 8, -3, 40, 28, 22, 27, -32, -15, 8, -3, -4, 2, 18, 5, -31, -301, -505, 182, -13, 76, -89, 4, -103, -14, -148, 63, 68, -4, -12, -2, 13, -36, -126, 231, 16, -30, 79, 14, -42, 111, 123, -54, 73, 14, -16, -116, -64, 90, -47, 12, -7, 61, -95, -107, 15, 1, -72, 43, 8, -45, 31, -50, -42, 19, 19, 2, -14, -24, 29, 49, 7, 15, -15, -15, + 43, 5, 9, -45, -11, -30, 24, 35, 0, 29, -1, 39, -32, 19, -1, -3, -31, -1, -26, -4, -162, 488, -217, 37, 32, 122, -16, 78, -77, 5, -148, -28, 1, 60, 10, 61, -42, -90, 12, -135, -143, 4, -47, -3, 12, 20, -35, -24, -51, -77, 31, 37, -100, -45, -126, 2, -56, 46, 53, -104, 16, 86, 77, -40, 28, -29, -15, 24, -47, -10, 44, 34, 30, 37, 20, -11, 29, 19, -22, -1, 59, -6, -27, -8, 24, -25, -60, -4, -21, 16, 13, -8, -25, -36, -43, 44, + -14, -1, -10, -3, -5, -403, -125, 45, -64, 58, -27, 1, -119, -143, -19, -50, 60, 17, -17, -295, 148, 11, 129, 161, 111, -154, -38, -15, -39, 33, 37, -3, -56, 62, -104, -56, 93, 5, -40, 108, 2, 114, -39, -18, 13, 36, -81, -60, -14, 64, -23, 10, -26, 43, 54, 10, 3, -94, -10, 46, 52, -30, 58, 19, -16, 15, -59, -18, -39, 39, 6, -14, 14, -101, 1, 19, 48, 16, -26, 47, 4, -63, -29, -32, -9, 13, 258, 87, -155, -27, -67, 54, -94, 78, -17, 91, + 63, 111, -149, 179, -110, 105, -60, 63, 12, 53, -95, -218, 85, 152, -55, 63, -77, 19, -51, 160, -2, -15, 38, -77, -54, -45, 70, 1, -26, 1, -14, 110, 74, -41, 36, 42, -46, -26, -41, -83, -11, 2, -11, -30, -84, -3, 129, 70, -54, 72, -8, -1, 60, 32, -61, 24, 14, 64, 76, -60, 27, 45, 58, -5, -2, -20, -11, 33, -5, 60, -13, 546, -446, -75, 22, -9, -124, 41, 32, 174, -58, 34, 143, 3, 86, 283, -62, -19, -148, -139, 6, 46, -63, 26, 249, 144, + 20, 9, 20, 138, -116, -52, -7, 71, -12, 17, -59, 22, -104, -62, -79, 1, -71, 16, -126, 57, -251, -65, 34, 46, -10, -58, 19, 7, 30, -69, 30, -41, -46, -111, -83, -25, -14, 5, 18, 35, 6, 16, -66, -1, -81, -13, -6, 2, 26, 80, -51, -23, -6, -44, -75, 16, -346, -241, -19, -50, 180, 5, 32, -228, 11, 30, 12, 16, 136, -172, 35, -37, -119, -58, 108, -39, 87, -31, 50, 27, -19, -15, 57, -9, -2, -147, 71, 64, 61, 70, -132, -136, 78, 116, -142, 51, + 19, 121, 69, 11, 81, -44, -86, -14, -165, -121, -15, -7, 25, -79, 26, -64, -211, -63, -58, -208, -1, -35, -26, 23, 63, -62, 38, 25, -95, -61, -73, -16, -23, -3, -31, 39, -47, -13, -40, 67, -77, 44, -13, -18, 3, 18, -19, -216, 328, -172, -74, -101, 26, 28, 48, -21, 143, 108, -103, -183, 68, -69, 168, 14, 72, 88, -64, -62, 223, -128, -31, -65, 8, -27, 30, -38, -15, -172, 152, -53, -14, 180, -123, -155, 14, -71, -102, -1, -53, 41, -224, -75, -55, -5, 79, 1, + 16, 41, -39, 31, 53, 46, 50, -28, -48, -41, 57, -135, -30, -32, -34, 89, -60, -95, 96, 30, 58, 114, -42, -38, 56, -61, -78, -72, 42, 33, -43, 40, 13, 47, 8, -85, 57, -28, -451, 225, 243, 124, 113, -81, 115, -195, 6, -229, -30, -100, 106, -110, -91, -25, -168, 49, -77, 74, -158, 263, -87, 124, -108, 10, -109, -35, 59, 168, 188, -95, 0, -56, -100, -77, -270, -7, 45, -254, 98, 49, 69, 121, 76, 40, -86, -29, -96, -49, 50, -204, 79, 39, 12, -97, -57, 51, + 163, 68, 42, -65, 68, 9, -78, 20, -57, -89, -47, -22, -81, 90, 51, 73, 41, -68, 21, 113, -23, 105, 56, 38, 71, -38, -44, 27, 18, 373, -257, -108, -33, -2, 182, -35, 59, -105, 56, -66, -296, -204, -76, 105, -13, -164, -154, -323, -104, 41, 43, 14, -34, -20, -100, 26, 41, 54, 12, -15, -39, -154, -40, -36, 77, -17, -123, -49, 35, -138, 23, -143, 79, 111, -106, -206, -40, -65, -95, 9, 18, 20, 50, 2, -81, 128, 199, -97, 82, 33, 94, -146, 54, 18, 51, -209, + 164, 19, 18, -26, -120, 30, 14, 29, 35, -131, -70, 25, 60, -34, -1, 48, 18, -24, -63, 44, 608, -339, 32, -34, -72, -253, -13, -14, 207, 95, 417, -165, 17, 46, 100, -42, -19, 169, -105, 243, 148, -338, 323, 114, -116, -84, -126, -66, 24, 15, -90, 214, 28, -102, -90, 21, -112, -198, 3, 119, 48, 144, -66, 45, 155, 222, 53, -230, 76, -74, -126, 33, 98, 56, -27, -209, -182, 257, -33, 199, 23, -78, 98, -172, -76, 83, -22, 171, -137, -273, -76, -14, -83, -66, 170, -57, + 32, -156, -152, 74, 39, 63, -66, 64, 7, -37, -7, -687, -447, 161, -234, 72, -118, -417, -309, 551, -257, 248, 139, -147, 127, -85, 172, 191, -15, -57, 330, -110, -377, 4, -159, 36, 33, 222, 117, 44, 108, -103, -2, 243, 155, -47, 61, -220, -338, -250, -175, -51, -50, 60, -34, -96, 213, 54, -164, -154, -46, 60, -165, 63, 198, -7, 73, -140, 104, 75, 22, 77, -124, -190, -267, 130, 101, 7, 101, 17, -124, -28, 7, -214, -22, -331, -183, 52, -86, 60, 5, -46, -47, -33, -64, 56, + -1, -12, -819, 279, -65, -54, 146, 36, 82, 357, 213, 270, 136, 368, -65, -359, 53, -41, -154, -318, -139, 278, 63, -20, 58, -22, 4, 234, 30, 86, -35, 57, 233, -65, -157, 118, -278, -280, -180, -36, 8, 115, 274, 4, -94, -273, -447, -158, -65, -27, -3, 164, -205, 368, 192, -36, 106, -146, 27, 2, 171, 328, 222, -194, -81, 54, -31, -42, 17, -101, -319, -25, -59, -23, 50, -125, -42, -218, -23, 30, 228, 111, 32, 36, 58, 7, -193, 39, -45, 51, -23, -26, -105, 16, -111, 336, + 340, 117, 228, 165, 356, -309, 371, -446, -76, 423, 579, 123, -34, 213, -174, -204, 419, 70, -62, 104, 338, -85, 208, -64, -81, -37, 154, -385, -45, 191, -83, 23, -134, 83, 310, -280, 94, -81, 103, -145, 209, 20, 78, 87, -341, 171, -476, -95, 274, 32, -168, 303, -100, -178, 220, -87, -59, -31, 134, -17, 38, -258, 98, 27, 514, -381, -164, 48, -96, 118, 147, -182, 361, 136, 2, 61, 123, -55, -190, 79, -97, 34, -36, 96, -119, 40, 5, -63, 86, -26, -18, -7, 685, -427, 17, -68, + -114, 15, -156, -65, -506, -423, -422, 142, -87, 140, -96, -306, 490, 342, -227, -190, -268, -56, 105, 162, 199, -13, 154, -43, -193, -236, 148, -107, 447, 280, 413, 59, 150, 406, 282, -89, 75, -18, 6, 44, -189, -136, 73, -236, -244, 237, 269, -294, -9, 523, 365, -18, -172, -38, 109, 99, -70, -194, 234, -15, 58, 168, 213, -222, 96, -36, 89, -345, 64, 313, -311, -255, -132, 139, 247, -139, 136, -120, -12, 8, 52, 93, -43, -19, 56, 52, 1, -6, 41, 555, 214, -73, -17, 174, -207, -269, + 232, -322, -417, 111, -224, -289, -150, 277, 678, 281, -368, 694, 81, -108, 126, -404, 104, 56, -289, 251, -77, 50, -208, 118, -190, 351, -414, -153, -143, 198, 229, 204, -220, 65, -230, -66, 124, 294, 136, -135, 287, 146, 232, 16, 270, -117, 150, -409, 460, -40, 65, -122, -238, 12, 155, 367, 109, -439, 188, -178, 363, 31, -137, 70, -118, 75, -254, 102, 26, 22, 42, -50, 28, -69, -106, 143, 91, 82, -188, 62, -101, 88, 21, -12, 46, 21, -1133, 52, 192, 448, 148, -696, 932, 343, -424, 155, + 927, 210, -223, -26, -560, 290, 28, -141, 82, 194, -362, 197, -454, 50, -414, -371, -157, 178, 268, -202, 235, -402, -57, 457, 43, -162, -52, 91, -104, -298, -334, -42, -152, 331, -460, 492, 157, 65, -162, -51, 228, -180, 307, 79, 277, -99, -158, -479, 166, -45, -496, 153, -32, 306, 489, -203, 112, 244, 258, 56, -148, -26, -602, -26, 56, 153, -2, 409, 89, 205, -227, -159, 304, -27, -61, 188, -42, -47, -3, -6, 20, -28, 170, 1403, 637, 129, 224, -293, -198, -73, 528, -381, 56, -318, -870, -420, + 194, -226, 139, -347, -22, -373, 312, -378, -273, -808, -154, -131, -215, 414, -140, -339, 105, 318, 116, 105, -52, -72, -216, 160, -277, -78, -174, -484, 69, -337, 130, 38, -102, -16, -353, -25, -83, 506, -151, -17, 204, -285, -128, 513, -306, 193, 10, 456, 650, -43, 81, 60, 223, 113, -503, 41, 123, 171, -217, -338, 31, 91, -91, -132, -540, -270, -312, 16, 64, -106, -151, -173, -45, -90, -97, 106, -56, 48, -196, 8, -78, -139, 28, 73 }, + {-1, 0, -1, 0, -1, 2, 1, -5, 0, -3, -4, 1, 3, 3, 1, -8, -5, 2, -2, 0, 2, 2, 3, -2, -3, -5, -3, 0, -11, 0, -1, -3, 2, -6, -5, -11, -1, -9, -3, 0, 7, 2, 6, -3, 6, -2, 1, 5, 32, -25, 16, -20, 10, -10, -9, -6, -5, 6, 7, -24, -1, 4, -2, -4, -14, -5, 10, 16, 8, 24, 5, -4, 5, 4, -2, 8, 17, -7, 0, 7, 0, -2, -12, 0, 6, 5, 1, 0, -4, 4, 0, 1, 0, -4, 116, -7, + 10, -7, 8, -9, 2, -2, -2, 7, -6, -21, 6, 2, 7, 14, 8, 5, -2, -12, -4, 6, -2, -2, 12, -15, -5, 0, -2, -4, 6, 6, 8, 2, 3, -3, 11, 0, 8, 6, -2, -1, 4, 0, -2, -1, 0, 85, -81, 13, -22, 12, -1, 9, -8, 15, -6, 9, -19, 1, -11, 3, -2, -3, -5, -14, -1, 2, -7, 12, -5, -9, -11, 6, -7, 17, -2, 0, 5, 0, 0, -7, -6, -2, 2, -3, -7, 6, 5, 11, -3, 4, -2, 2, -200, 23, -15, 0, + -2, -17, 18, -4, 2, 8, 2, 21, -1, -9, 25, 10, 23, 0, -30, -18, -15, 12, -16, 1, -6, -5, 2, 5, -5, -9, -7, 6, 7, 13, -1, -2, -1, 8, -9, 2, 4, 6, -7, 8, -9, -2, 3, -252, 91, -37, 42, -29, 19, -32, 18, -24, 9, 18, 1, 7, 16, -10, 12, -13, -10, -29, 27, -17, 18, 1, 0, -28, -1, 5, -4, -1, -1, 12, -2, -8, 9, 3, -4, 1, 0, 1, 5, -8, 20, -2, -12, -1, -7, -1, 13, 115, -24, 44, -20, 15, + -16, 54, -10, 29, -3, -2, 8, 0, -37, 9, -3, -17, -4, 1, -47, -1, 4, 15, 0, -9, -2, 16, 3, -8, -15, 24, -15, 0, -22, -2, 0, 4, -5, 6, 10, -9, 8, 0, 6, 0, 11, -5, -3, 10, 303, -88, 13, -15, 20, 0, 0, -41, 18, -18, 13, 4, 6, 13, 21, 3, 7, -34, 13, 13, -22, -4, 23, 15, 15, 33, 19, 5, 9, -12, 11, -3, 19, 25, -3, 8, 16, -6, 5, -21, -6, 21, 0, -15, -5, 6, 16, -1, 9, 0, 21, -162, + 68, -47, 31, -28, 36, -24, 1, -20, -25, -35, 2, -21, 10, 12, 26, -43, 26, -10, 37, 8, -2, 3, 3, -9, -7, 5, -18, 11, 21, -28, -6, -2, 11, -11, 30, -31, 6, 0, 2, -13, 2, -8, 8, 1, 1, -10, -2, -20, -7, -1, 4, 1, -7, -25, -261, 83, -53, -4, -11, 16, -45, 3, 14, 12, -16, 9, -20, -33, -13, 4, -20, 69, 2, -19, -6, -23, -11, 21, 13, 27, -3, 12, -16, 6, -14, -5, -8, 4, 8, -5, -13, 3, 5, 19, -3, -7, + -25, -20, -10, -4, 5, 3, -10, -4, 2, 9, 5, 1, -5, 9, -251, 118, -56, 52, -28, 31, 15, 9, -29, 3, -15, 4, -38, 14, 23, 7, -40, -20, -20, -21, -14, 28, 7, 20, 16, -7, -2, -30, 39, -11, -4, 2, -8, -12, -14, -3, -32, 9, -17, 13, 11, 18, -5, 2, -21, 8, 15, 4, -3, 3, 12, 18, 8, 16, 1, 2, 82, 101, -46, 27, -14, 10, -11, 6, 9, 49, -17, 20, 46, -13, -2, -8, 11, 24, 25, 32, 9, 27, -7, -16, -54, 11, + -8, -27, -19, -1, -5, 18, -2, -32, -33, 9, -28, 4, 17, -25, -17, -11, 13, 11, -1, -3, 19, 4, -7, 8, -16, 2, -9, -12, -8, 13, -7, 10, -7, -16, 4, 9, 290, -101, 55, -38, 54, -38, 33, -12, 34, 8, 24, -28, 29, -10, -24, -2, -25, -41, -21, -4, 21, -28, -37, -46, -8, -4, 36, 20, 23, -16, 19, -14, -14, -8, 24, 21, 6, 0, -1, 1, -7, -4, 17, 3, 41, -16, -5, -34, 22, -9, -5, -8, -2, 2, -6, 6, -9, 0, -13, -6, + 3, 13, 82, -125, 73, -47, 57, -1, 35, 10, -55, -26, -18, 7, 14, 8, 62, -35, 49, 9, 6, -34, -7, 43, -3, -36, 41, 31, 7, -17, -13, -4, -3, 19, -9, 9, -23, -5, 13, -33, 13, -13, 12, -10, -3, 39, 17, 22, -2, 9, 14, -3, -11, -17, 6, 8, 14, 17, 4, -4, -17, -8, -18, -16, 2, -310, -63, -9, -52, -22, 46, 19, -14, -13, -38, -25, -31, -35, -29, -19, -26, -44, -38, 13, -38, 12, -51, 1, -22, -17, 43, -5, -22, 28, -32, 29, + 8, 31, 21, -1, -16, 33, -1, -6, 30, -13, -42, -47, -13, 15, 9, -15, -2, -13, 2, 0, 2, 29, 11, -22, -9, 3, 18, 4, 27, 7, -3, -15, -363, 316, -129, 88, -83, 20, -41, 53, 10, 6, -26, 36, 7, -65, 7, 10, -33, -50, 50, 62, -20, -16, 10, 28, -17, 56, -2, 14, -41, -15, -24, 37, -8, 8, 8, -21, 36, 34, 9, 12, 42, -26, -7, -6, -30, 6, -20, 7, -1, 2, 34, -2, -8, 7, 2, 22, -21, 8, -1, 43, -13, -2, -17, 243, + -29, -50, -12, 33, 17, 15, -1, -33, 9, 21, 24, -15, -14, 49, 17, -38, 9, 64, -79, 53, 7, 68, -4, 4, 14, 14, 36, -26, -9, 14, 26, -10, 0, 4, 6, 17, -32, 0, 19, 6, -17, -5, 42, 31, 15, -15, -11, 13, -5, -10, 8, -12, -20, 44, 17, 28, 5, 21, 18, 19, 3, 23, 12, 17, -12, 4, 7, -19, 8, -9, -1, 115, 34, 28, -17, -11, -31, -22, 6, -12, -15, -45, 38, 27, -28, 48, -45, -14, 20, -33, 20, 31, 48, 42, 40, 21, + -84, 0, -17, 17, -8, 33, 23, -11, -20, 22, -15, 56, 0, 18, 57, 54, -40, 3, -27, -49, -5, 9, -6, -10, -5, 4, -22, 3, -26, -8, -3, 7, 1, -16, -16, 34, -12, 5, 15, 19, -10, -11, -5, -27, -18, 3, 6, 272, -191, 70, -73, -6, -51, 46, 46, 15, 9, 43, 119, -104, -14, -27, -42, 92, 70, -14, -63, 26, -52, -41, -72, 9, -74, -24, 44, 6, -23, -61, 0, -15, 37, 34, 16, -28, 4, -2, 15, 30, -19, -9, -33, 50, -6, 7, 45, -9, + -4, 18, -22, -2, 20, -33, 8, -6, -3, -35, 17, -7, 3, 9, -13, 23, -18, -5, -37, 3, -5, 15, 16, -424, 58, 5, 29, -33, -53, -1, 35, 56, -4, 85, 47, -58, -52, 40, 7, -42, -77, -89, -57, -65, -73, 13, 23, 19, -54, -52, 8, -14, -9, -7, -43, 36, -74, -28, -12, -3, 23, 8, -5, 34, -11, 34, 19, -27, 4, 55, -22, -22, 1, 32, 8, -23, -30, 27, 1, -39, 53, 60, 7, -17, 7, -1, 12, 26, -3, 35, 22, 20, 17, 9, 14, -18, + -2, -260, 222, -74, 47, -1, 37, -90, 35, -61, 0, -41, 83, 71, 27, 6, -69, -45, -7, -28, 79, -65, -3, -32, 116, -37, 10, -3, 20, 9, 20, 15, -19, 10, -5, 41, 6, 77, 40, -25, -5, -9, 1, -29, -21, -7, 14, 94, 8, 6, -26, 38, -14, -20, 12, -19, 11, -24, -52, 26, 23, -7, 55, 12, 13, 20, -15, 7, 18, -45, -21, -3, -21, 21, 32, -12, 55, 37, -1, -15, -11, -4, 169, -4, 38, -115, -19, 14, -93, 7, 129, -23, 9, -58, -80, 20, + -73, 113, -79, 27, 27, 61, 47, -13, -70, -8, -7, 36, -49, -10, -15, -24, -17, 34, 21, 92, 31, -34, 38, -25, -27, 28, 79, -12, -41, -38, 42, -1, -57, -53, 27, 25, -24, -44, -72, 20, 27, 18, -41, 30, 19, 13, -15, -5, 22, -54, -7, 24, 28, -5, 14, 1, 577, -36, 24, 53, -50, -21, -17, -135, 92, -14, -84, 19, -43, 50, 40, 63, -22, 86, 74, 47, -75, 58, -103, -61, -70, 28, -54, -9, -18, -68, -37, 59, -43, -32, -65, 22, 22, 50, -27, 85, + 22, 97, -11, 18, 20, -53, 39, 100, -34, -2, 27, -28, -40, 24, -39, -21, -52, -34, 39, 35, 24, 37, 47, 45, 67, 11, -19, 35, 24, 0, -6, 3, -25, -5, 6, 7, -1, -255, -501, 185, 2, 10, -50, -54, -12, 17, -33, 131, -61, -115, 7, 7, -15, -41, 89, 16, -40, 41, -80, 100, -57, -30, -69, 112, -49, -17, -68, -32, 60, -29, 65, -86, -100, 8, 17, 17, -3, -52, 9, 26, 13, 51, -1, 81, 11, 76, 99, 20, -8, 18, -57, -15, -94, -84, 24, 24, + 16, -6, -27, -14, -23, -13, -23, 0, -3, 17, -6, -11, -33, -3, -38, -5, -50, -7, -19, -6, -168, 489, -223, 102, -48, 155, -25, -69, -72, 40, -22, -10, 3, 30, -165, -81, -43, 65, 55, 96, 17, -15, -15, 115, -150, 86, -72, -15, -76, 119, 48, -78, 10, -34, 13, 50, -215, -90, 18, 75, -44, 16, 55, -23, -24, -8, 83, 32, 14, 9, 32, 97, -59, 44, -137, -24, 31, 66, 12, 9, 3, 35, -27, 4, -10, -33, -28, 51, 50, -19, -26, -86, -36, -19, -15, 62, + -24, -24, -42, -38, -3, -439, -95, 43, -104, 26, 19, 64, 0, 122, 80, 44, -34, -60, -3, 130, -111, -43, -86, -2, -235, -185, 11, 115, 158, 36, -58, 54, -51, -34, -35, 16, 41, 10, 61, -47, -84, 69, 45, 145, -18, 24, -21, 117, -122, -61, -29, -93, 59, -38, 49, -99, 99, 96, 88, -36, 78, 4, 27, 46, 33, -41, 7, -13, -2, 90, 34, -40, 73, -12, -63, -21, -5, -89, -4, 37, 48, 8, -2, -37, 13, 22, 319, 207, -65, 94, -211, 149, 55, 112, -38, -28, + -115, -59, -198, -34, -157, -47, -97, -99, -133, 54, -183, 25, 80, -35, 25, -78, -1, -24, -26, -107, -14, 13, -7, -16, -56, -49, 33, 36, 47, 233, -93, -5, 94, -22, -38, -89, 28, 79, 131, 44, 109, -106, -160, 16, 105, 59, -86, 101, -75, 49, 20, 91, 52, 34, 62, -61, 40, 33, 19, 90, 21, 73, -11, -29, 12, 17, 15, 87, -14, -49, -4, 642, -416, -23, 48, 13, 50, 88, -18, -14, 49, -75, -71, -12, 57, 231, 9, 80, -75, 4, -229, 141, -139, -197, 46, 55, + -73, 65, 27, 152, 169, -28, -64, -48, -253, -138, 198, 65, 73, -114, -117, 34, -23, -101, 88, -19, -63, -73, 49, -65, -35, 232, -142, 43, -51, 54, -64, -26, -173, 29, -64, -43, 138, 33, 38, 83, 100, 30, 69, -31, -9, -114, 52, 94, -22, 6, -11, -24, -30, 10, -30, -14, -401, -198, 73, -26, 144, -22, -40, -117, -131, 67, -137, -48, -78, -17, -82, -57, -67, -35, -82, -155, 86, -305, -5, 270, 65, -3, -76, 18, -276, 112, 68, 17, 98, 146, -118, -63, -122, 16, 3, -74, + -83, -93, -55, -6, 59, 3, 48, 26, 5, 187, 44, -32, 148, -75, -171, -54, -21, -26, -12, -61, -14, -75, -19, -76, 7, 38, -82, -25, -46, 2, -84, -107, -46, 41, 73, 28, -25, -5, 28, -15, -18, -39, 16, 37, 7, -4, -47, -247, 331, -165, -82, -272, 210, -76, 124, 7, 6, -83, 165, -42, 53, 40, -77, -27, -26, -145, 27, 25, -112, -187, -117, -172, -43, 92, 47, -102, -102, 149, 102, -130, 118, -65, 104, -165, -131, -126, 43, -112, 69, -51, 28, -31, -17, 25, 119, -263, + -34, 52, -25, -80, -190, -17, 172, -1, 149, 110, 31, -22, 113, -114, -95, 73, -29, -71, 47, 14, -57, -82, 136, -129, -71, -77, 77, 4, -57, -31, 39, -119, -1, 32, 23, 3, -42, -58, -568, 211, 89, -143, 70, -162, 145, 125, 106, -291, 176, 308, -43, 104, 4, -97, -126, 339, -5, -31, -187, -370, -200, 18, -164, 135, -242, -81, -143, 38, -56, -181, 30, -43, 118, -41, -142, -55, -435, 77, -14, 200, -124, -137, 187, 38, 30, -76, -117, 40, 84, 61, -31, 64, 35, 6, -39, -42, + -144, 10, -58, -85, 74, 41, 210, 43, -143, -144, 30, -94, -69, 22, -71, -5, -33, -43, 39, -58, 20, -9, -12, -23, -32, -71, -85, -28, -73, 473, -186, 3, 27, 198, -25, -38, 136, 234, -157, -181, 142, -27, 124, 179, 149, 129, 103, 122, 460, -39, 34, 90, 254, -52, -93, 98, -7, -82, -102, -89, 3, -115, 175, 265, -13, -65, 111, -64, 159, 114, 4, -136, 104, -10, -44, 22, -18, 308, -25, 135, -67, 275, -25, 26, -95, -165, 140, -82, 277, 62, 131, 2, 2, 81, 22, 199, + 111, 37, 100, -114, 45, 92, 11, -31, 163, 42, -52, -52, 66, -29, 2, 93, -27, 57, 24, -49, 612, -177, 57, -59, 27, 79, 206, -160, 86, -3, 11, 112, -92, 120, -323, -146, 54, 120, 85, 257, -256, 40, -38, -350, 149, -136, -89, -51, -287, 93, 101, 45, -150, -251, 98, -156, 136, -241, 3, -288, -71, -193, -167, 170, 265, 37, 97, -123, 49, -205, 87, -135, 37, 196, 100, -69, 119, 20, 103, -89, 172, 295, 16, -179, -124, -80, -33, 19, 132, 26, 215, -1, 82, -196, -29, -142, + -27, -21, 44, -178, 24, -14, 53, 19, 33, 18, 14, -624, -524, 221, -66, 257, -20, 84, -313, -294, -179, 98, -242, -167, -72, 49, 177, 63, -356, 96, 199, -504, -60, 24, -535, -184, 238, -496, 243, 256, 3, -71, -20, -119, -132, 89, 109, 372, -220, -115, -92, -173, 10, -295, -74, 23, -8, -96, -15, -162, -33, 91, -41, -106, 123, -57, -120, -172, 366, -15, 223, 30, 84, 241, 35, 164, -109, 183, 133, 40, 48, 45, 159, 73, 30, 154, -65, 22, -18, -240, 113, 57, 33, -147, -42, 27, + 47, -42, -1013, 382, -112, -455, -111, 11, -118, 175, -394, 190, -32, -453, -312, 62, 180, 170, 125, 267, 76, 439, 240, 514, 67, 417, -322, -253, 86, 36, -255, 71, 54, -36, -97, 247, 47, -546, -243, 183, 63, -116, 156, 159, 248, 53, 74, 46, 72, 90, -190, 29, 35, -404, 190, 140, 171, -277, -161, 202, 0, -54, -42, -118, -105, 0, -139, -310, 105, 331, -233, 32, -132, -54, -97, -30, 171, 41, 141, 41, -150, -107, -122, -73, -100, 24, -63, -14, -95, 30, 49, 54, -29, -96, 2, 425, + 287, 199, 108, 13, -99, -151, 133, -424, 448, -278, 72, -461, -17, 434, 170, -154, 275, -438, 175, 82, 30, -539, -162, 33, 86, 346, -530, -72, -176, -499, -110, 120, 249, 374, 290, 289, -25, -186, 190, 58, -115, 68, -244, 388, 181, 131, -203, -444, -119, 10, -538, -435, -115, -390, 250, 97, 77, -180, -194, 75, 54, 32, 120, -75, 90, 256, 116, 43, 34, -169, -143, -128, 74, -46, -345, -276, -29, -222, -198, -57, -285, -179, -46, 15, -42, -19, 67, -55, -22, 15, 9, -83, 489, -382, 103, -54, + -50, 9, 135, -238, 318, -92, 218, -21, -177, 339, 334, 239, -112, 514, 190, -574, 592, 54, -2, 428, 19, -185, -248, 422, -264, -352, 342, 298, -194, -469, 184, -161, 65, -330, -270, -112, 320, 288, 38, 264, -383, 124, -100, -143, 184, 26, 57, -536, -146, 299, -383, -99, -480, -89, -179, 81, -115, 55, 50, -16, 49, -128, -426, -80, 219, -29, 152, -164, -374, -66, 84, 239, 59, 131, -13, 54, 91, 55, -129, 33, -52, 57, -103, 62, 26, 8, -10, -89, -44, 443, 34, -129, -318, -11, -152, 118, + -263, 167, 106, -230, -236, 355, -419, -17, 270, -304, 98, 347, -276, 238, 175, 255, -420, 362, -421, 127, -321, 40, -164, 285, 9, 174, 90, -299, -183, -414, 241, -280, 242, -337, -384, -643, 63, 337, -52, -10, 107, 291, -99, 78, -355, 90, 471, -48, 427, 559, -4, 93, 115, -239, 124, -289, -14, -297, -288, 17, -109, -488, 331, 8, 246, -288, -147, -110, 126, -3, -76, -76, -49, -19, 28, 31, -58, 66, -66, -66, -37, 93, 70, 77, -38, 58, -1004, 255, 377, 105, -435, -63, 709, -814, -20, -137, + -532, -134, -360, 133, 132, 312, 127, -426, -150, 308, -485, -137, -519, 444, 134, 347, 592, -208, -124, -97, -295, 284, -138, -352, -395, -69, 153, -10, 82, 97, 231, -101, -10, 171, -164, 336, 382, 360, -290, 40, -90, 173, 720, 540, 1030, 83, 408, 330, -155, -34, -52, -95, 131, 31, 371, 280, -124, -37, -218, -431, 175, -5, 149, -30, -297, -43, 47, -166, 103, -105, -143, 5, -144, 0, -39, -35, 3, 23, -89, 14, 7, 1, 38, 1558, 751, 267, 241, -371, 238, -300, 357, 293, 274, 69, -512, -287, + 556, 95, -33, -119, 623, -677, -285, -171, -51, -480, 113, -415, -232, 67, -263, 385, -374, -163, -93, 411, -687, -134, -512, -16, -4, -450, 72, 351, 190, -10, -212, 17, 211, -284, 566, 770, -50, -482, -454, 316, -116, -106, 662, -143, 210, -20, 415, -86, 53, -82, -266, -739, -442, -71, -200, -510, -336, 189, 427, -37, -57, -48, -70, 233, 147, 31, -146, 162, -97, -339, -325, 40, 220, -265, 171, -19, -102, -90, 5, -149, -115, 4, -46, -24 } }; -const Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS][2885] ={ -{ - -9659381, - 5362267, -3098819, 1329292, -1745904, 399432, -1284195, -347892, 55835, 2576981, -1692217, - 1123134, -2744484, 2025077, -3098819, -4211216, -3702262, 850404, -397284, 579821, 79457, - -1915555, 1105954, 1917703, -1084479, 1535451, -242666, -670015, -1357210, -244813, 399432, - 1078037, -785979, 1612760, -654983, 1028645, 1501091, -1097364, -1056562, 68719, -1110249, - 298500, 27917, -508954, 1103807, 180389, -513249, 3689377, -3813931, -676457, -818191, - -858993, -294205, -38655, -743029, -500364, -15032, 180389, -549756, 328565, -1198296, - -326418, -212601, 736587, -4054449, -358630, 811749, -362925, -513249, 373662, 53687, - 307090, 1833951, -876173, -616328, -970663, -206158, 569083, 811749, -831076, -661425, - 1011465, -932008, -1329292, -171799, -345745, 448824, -380105, -408022, 244813, 392990, - -811749, 251256, 337155, -12947179, -8793946, -3573413, -4080219, -2280628, -2134599, -2022930, - -914828, -2439542, -1921998, -839666, -1498944, -197569, -539018, -1307818, -1767379, -1979980, - -779537, -1148904, -1995012, -261993, -2497524, 6442, -188979, -347892, -1511829, -261993, - -1142461, 8590, -1475321, -942745, 508954, -1086627, 191126, -2521146, -463856, 1228361, - 753767, -47245, -367220, -725850, 206158, 227633, 1168231, -702227, -115964, -362925, - -17038136, -910533, 2173254, -19327, 637803, -100932, 0, -1346472, 1436667, 590558, - 1733019, 1264868, 3569118, 2652142, 186831, -1398012, -831076, -315680, 654983, -461709, - -3180423, -2826089, -1488206, -420907, 122407, 420907, 571231, -94489, 83752, 367220, - -678605, -70867, -105227, -1930588, 1131724, 491774, -229781, 0, -760209, -1063004, - 659278, 279173, -721555, 697932, 562641, 846109, -382252, 19097572, 13387413, 2647847, - 5173288, 1090922, 1700807, 4247723, 2164664, 689342, 2529736, 1052267, -1133871, -536871, - 869731, 1492501, -2600603, -326418, -1567663, 3463891, 1698660, 901943, 1700807, 895501, - 874026, 64425, -180389, -824634, 1335735, 1655710, 1378685, 1760937, 2089502, 1279900, - 3058017, 719407, -184684, 1118839, 193274, -508954, -253403, -450972, -616328, 42950, - 1415192, 369367, 225486, 858993, 28509992, 12066711, 3697967, 3292093, 2368675, 1402307, - 500364, 73014, 3161096, 594853, 1771674, 2319282, 1284195, -201863, -826781, 4939213, - -408022, -2755222, -1518271, 1202591, 109522, 2628520, 914828, 296353, -448824, -1271310, - -309238, -599148, 1209033, -231928, 526134, 88047, 225486, -667867, 989990, 3427384, - 2226941, 2267743, 2110977, 1681480, 977105, 642098, 435939, 1105954, -910533, 665720, - -408022, 9382356, -9887015, -2985002, -4271345, -3687230, -2016487, -590558, 1367947, -1370095, - 139586, -3652870, 1241246, -1327145, -3324305, 882616, -2379412, -3158949, -2274185, 3030100, - 2265595, -1060857, 1144609, -2091649, 798864, -3809636, 182536, 633508, -665720, -889058, - 779537, -3015067, -1389422, 395137, -1075889, -886911, -708670, 251256, 298500, 1526861, - 66572, 2630668, -1041530, -717260, -852551, -1294933, -429497, -646393, 341450, -1116692, - -1754494, -266288, -33844344, -17119740, -6178311, -4795331, -5280663, -3268470, -4569845, -2929168, - -4973572, -874026, -2269890, -551903, 184684, -2029372, -605590, 343597, -17180, -3098819, - -2115272, -1391569, 249108, -4185446, 371515, -1887638, -3786014, 341450, -98784, 279173, - -143881, -1301375, -1063004, 62277, -337155, -27917, -1451699, 64425, 324270, 1148904, - 373662, -1434519, 775242, -1434519, 927713, -2480344, -1760937, 395137, -1440962, 88047, - -581968, -1988570, -652835, -20029580, 10522670, 4372277, 1664300, 2675765, 534723, 693637, - 2411624, 2628520, 1473174, 1739462, -1314260, -603443, -2068027, 2523293, 566936, 429497, - 3519726, 81604, -2304250, 4112431, -2714419, 302795, 3459596, -1065152, 934155, 412317, - -42950, -1750199, -373662, 916976, 1024350, 137439, -575526, 38655, -1174674, 3880503, - 371515, -90194, -1501091, -803159, -955630, -959925, 2153926, 1999307, -485331, 171799, - -94489, 584116, 186831, -161061, -377957, 455267, 356482, -618475, -513249, 83752, - 504659, 30129196, 12751758, 3451006, 6869800, 4041564, 1685775, 3040837, 2555506, 38655, - 1859721, 3019362, 661425, 40802, 1498944, 4241280, -1451699, -736587, -3354370, 882616, - 3809636, 1655710, 152471, -2130304, -1187559, -895501, 4015795, 1290638, 2089502, 1217623, - -1939178, -3051574, 3481071, 1958505, -2171106, -989990, 3382287, 2903398, -165356, 749472, - -373662, 1533303, 938450, -296353, 676457, -1163936, -577673, 1870458, -983548, -710817, - 1945620, 1711545, 916976, 371515, 395137, 450972, 1385127, 798864, 2192581, 35654672, - 7681549, 5985037, 2576981, 2774549, 1112397, 2854006, 3272765, 5325760, 3201898, -947040, - 4121021, -751619, 1084479, 977105, 3483219, 5239860, 3309272, -848256, 5768141, -1052267, - -629213, -3004330, 796716, -858993, 923418, 1612760, -1782411, -2385854, -1037235, 526134, - -1979980, -592706, 869731, 1340030, -2317135, -1906966, -837519, 801011, -36507, 654983, - -852551, 32212, -581968, -725850, 914828, -1273458, 1245541, -1370095, -511101, -1030792, - 219043, -341450, 1404454, 685047, -124554, 1999307, 663572, 4136054, -15805480, -5053029, - -5656472, -3622805, 962073, -886911, -3401614, 1949915, 128849, 2394444, -281320, 261993, - -3708704, -2592013, -1730872, -2669322, 214748, -2841121, -5523328, 1101659, 631360, -2544768, - -575526, -2308545, 472446, 790274, -466004, -5671505, -1625645, 369367, -650688, 493921, - 1509681, -4037269, -1230508, -2521146, 1292785, -307090, -236223, 2652142, -2703682, -176094, - 805306, -337155, -906238, 1284195, 654983, -1604170, -1992865, -3133179, -502511, -2394444, - -1967095, -1022202, -1370095, -798864, -397284, -734439, -1236951, -1623498, -955630, 584116, - 1073742, -191126, -37052684, -12517682, -7614977, -1879048, -3964255, -103079, -2164664, -2705830, - -3438121, 4254165, 53687, -1567663, -442382, -6103149, -3543348, -2952790, 4973572, -4179003, - -8974334, 788127, 1050120, 749472, -3330747, -820339, 1836099, -4056597, -470299, -4140349, - -1297080, 2390149, -2059437, 622770, 4516158, 547608, -989990, -1056562, 1191853, 1464584, - 1097364, -1309965, -298500, 1520418, 1964948, 1262720, 633508, -3796751, 682900, -135291, - -1995012, -676457, 332860, -470299, -2016487, -1256278, -2091649, -539018, 57982, 337155, - -356482, -1380832, -304943, -1063004, -139586, -1140314, -53687, -24631638, 5761699, 298500, - -2924873, 4337917, -2710124, -2216203, 1183264, -4213363, -2405182, -947040, 1797444, -3337190, - 4548371, 34360, -45097, 2027225, 2160369, 3216931, -274878, 4453881, 6562710, 4625680, - 1559073, 3949223, -1226213, 2486786, -2881923, -3077344, -1185411, 313533, 2042257, -1644973, - -2763812, -1591285, 8590, 1698660, -2669322, 1926293, 758062, 1473174, -622770, -2559801, - -3298535, -4069482, 1129576, -2106682, 1172526, -4310000, -1155346, 1861868, -2609193, 390842, - -1810329, 1236951, -528281, 1200443, 373662, -807454, 10737, -1763084, 3279208, 1299228, - 3034395, 1219771, 16460462, 27092654, 7902740, 7024419, 9824738, 7911330, 1599875, 6270653, - 5641440, 3030100, 11907797, 2808909, 2059437, 5119601, 4801774, 2488934, 2158221, 1236951, - 2029372, -1541893, 6045167, -1612760, 637803, -1889786, 3852586, 182536, -916976, 3133179, - 3801046, 1314260, 5025112, -3517578, -5748814, -1314260, -272730, 1260573, -335007, 2503966, - -2257005, 2280628, 5068062, 2151779, -4380867, -921271, 2340757, 889058, -2108829, 3148211, - 1307818, 1866163, 2138894, 2813204, 994285, -781684, 760209, -2536178, -597000, 2375117, - 2241973, -1221918, 38655, 586263, -1002875, 343597, 1793149, 62337156, 6390912, -571231, - 3837553, -62277, 5308580, 115964, 1417339, 730144, 5596343, 2675765, -2323577, 1937030, - 2675765, 1496796, -3403762, -6990060, -3244848, -2905546, 1236951, -4271345, -770947, -221191, - 1148904, 7801808, 4292820, 1513976, 3096672, -4769561, -304943, -2473901, -977105, -1937030, - 2901251, -1058710, 4861903, -2183991, -884763, -2443837, -1120987, -3554086, -1685775, 884763, - 783832, -133144, 40802, -1924145, 1123134, 3412352, 272730, -1750199, 2106682, -2911988, - 1299228, 1361505, -289910, -865436, -627065, -75162, -551903, 206158, 2018635, -167504, - -1840394, 444529, -18126910, -21575768, -4009352, -1204738, -882616, -3433826, -1417339, 6541235, - 3874061, 1374390, 1786706, -2862596, -571231, 4907000, -1810329, 7992934, -6212670, -1702955, - 6519761, -1264868, -732292, -3798899, 4466766, 4932770, 90194, 4861903, -1775969, 2149631, - -103079, -2735894, -431644, -2166811, -904091, -1410897, 2686502, -1992865, -476741, -3060164, - 2059437, -1595580, 4498978, -7123204, 2982855, 2465311, -4301410, 77309, -2845416, 749472, - -3238405, 1009317, 1340030, -4118874, -627065, -1509681, -6116034, -3554086, -1702955, -3053722, - -667867, -528281, 324270, -2501819, 341450, -4818954, 1333587, 569083, -1666447, 581968, - -1662152, -463856, -1084479, -521839, -15988016, -9083856, -12416750, -6292127, -8312909, -880468, - 7913477, -8274255, 6350109, 4140349, -4595615, 9135395, -1494649, 1816771, -5989332, -588411, - -2697240, -330712, -19327, 2287070, 1037235, 4788889, 9032316, -2415919, 1191853, -4301410, - -4604205, -3990025, 856846, 3824669, -1393717, -1277753, -1269163, -2768107, 3090229, -949188, - -274878, -2710124, -2229088, -1791001, -2901251, -201863, -188979, -2360085, 1507534, -3633542, - 1290638, -2095944, -448824, 1367947, -2778844, 3386582, -5896990, -1780264, 481036, -1694365, - -3180423, 1559073, -927713, -3470334, 5675800, 3281355, 723702, 1127429, 1084479, 1440962, - -2976412, -1876901, 667867, -1005022, -2085207, 2199023, -44420700, -5025112, 3545496, -3197603, - 7325067, 3455301, -9021579, 1271310, 1475321, -2838974, -7559143, -2727304, -1868311, 2207613, - 506806, -6899865, -2662880, -3650722, -6732361, -5581310, -13164075, -6771016, -7703024, -9242770, - 7359427, -4883378, 2671470, 5607080, -4041564, -6244883, -2465311, -1290638, 1479616, 4230543, - 2388002, -5160403, -6521908, 5188321, 3173981, 4118874, 5669357, 897648, -51540, 2310693, - -298500, -2443837, 1417339, -1286343, -893353, 3423089, 8506183, -2753074, -4292820, 2063732, - -2744484, -180389, 4372277, -8358007, -141734, -2701535, -483184, -98784, 30065, -923418, - 1664300, -2430952, 3040837, 3408057, 1382980, -113817, -40802, -2761664, 35577360, 30983894, - 8422431, 18833432, 5242008, 10838350, -1735167, -1739462, 5304285, 7118909, 3816079, -12324409, - -4052302, 7662222, 8701604, -3210488, -4146791, 1398012, 3644280, 4088809, 646393, -6414534, - -13722421, -5177583, 7548405, -672162, 7756711, -1833951, -2415919, 1556926, -6354404, -3710852, - -3676492, 7069516, -8768176, -6079526, 1629940, 1475321, -2222646, -279173, -2478196, 2647847, - 3652870, 3098819, 7033009, 4069482, 171799, -5708012, 5430986, -500364, 3036542, -2785286, - 2136746, 4264903, -590558, -1129576, -2600603, -3143916, 1997160, 446677, 2800319, -2716567, - 2349347, 5538361, -1095217, -3012920, 3917010, 5022965, -1962800, 2252710, 2576981, 2025077, - 4851166, 4105989, 43228844, 7934952, -8340827, 6899865, 4636417, -8276402, -1754494, 4065187, - 317828, 1230508, -601295, -1818919, -8967892, -8935679, 3972845, 8227010, 8656507, -8609262, - -17175574, 2293513, -234076, -7022272, -8774618, -1675037, 4421669, -3161096, 6549825, 10363756, - -3917010, -3554086, -1398012, -1681480, -2033667, -16170552, 8388071, 7505456, -289910, 4791036, - -4861903, -1679332, -4423817, 6332930, 6914898, 631360, -1730872, -2660732, 3850438, 785979, - -2263448, -4209068, 2147, 3277060, -5209796, -3373697, -2843268, 734439, 1649268, -6695854, - 3322157, 7080254, -5916318, -227633, -1438814, -1166084, -66572, 569083, 384400, -571231, - 1271310, -2104534, -3886946, -4711579, -2031520, -1271310, -2508261, -4494684, -3526168, -1022202, - 3111704, -1462436, -11905649, -7713762, 1028645, 10771778, -10851235, 7722351, 3403762, 1737314, - 2087354, 1909113, 6882685, 11366631, 206158, 3466039, 1151051, -9665824, -8933532, 8680129, - 1065152, -9990094, 5821828, -8523363, 1307818, 10597832, -779537, -2828236, 11931419, 1926293, - 712965, 1039382, 249108, 1133871, -5407364, 3221226, 4741644, 7990787, -6420976, -3079492, - 1120987, 1151051, -3008625, -5654325, 3526168, -2035815, 2435247, 1393717, -2098092, -1801739, - 697932, 3655017, -2858301, -1168231, -732292, 2117419, -5890548, -2654290, 2561948, 614180, - -2068027, -966368, 2304250, -2398739, 642098, -1608465, -523986, 1995012, 450972, 1181116, - -5102421, -3508988, 1213328, -46415712, -42518028, -9571335, -19673098, -17373142, -9764608, -3034395, - -7318625, -8927090, 6073084, 1548336, -2016487, 10052371, 3753802, 12090333, 9455371, 2639258, - 3807489, 4363687, -18592914, 8712341, -1402307, -4017942, -3455301, -11098195, -3380139, -3901978, - 10621454, -3620658, -6296422, -3231963, 1713692, -1464584, -2087354, 2250563, -2774549, -1904818, - 6502581, -6440304, -532576, -2145336, 11675869, 4535486, 4679367, -9058086, 708670, 7885560, - -4176856, 1810329, 53687, 1842541, 62277, 571231, -601295, 4986457, -654983, -1758789, - 3710852, -2731599, 2083059, 4329327, -2070174, -3184718, 1374390, 1589138, -3330747, -1471026, - -6148246, -4975720, 1610613, -667867, -1088774, -221191, 803159, -504659, -3908420, -1947768, - -29186450, 61467424, 38315404, 12524125, 3588445, 4385162, 4174708, 7054484, 5871221, 13153337, - 25769804, 1655710, 2785286, 5828271, 5145371, 6856916, -5007932, 25366076, 17779018, -16529182, - 12184822, 2473901, -2854006, 6238440, 15053860, -14085345, -4224101, 1350767, -12008729, -7889855, - -8622147, 17493402, -912681, -2888366, 2156074, 1144609, -5310727, -13707388, 9498320, 8057359, - -2493229, 4483946, 9745281, -6382322, 5250598, 747324, -2703682, 7990787, 6530498, 1743757, - 775242, 987843, 5237713, 7763154, -57982, -1178969, -195421, -2207613, 5194763, 1305670, - -2272038, -2458869, -2050847, 4232691, 1756642, 9369471, -2881923, 3476776, -2147484, 2486786, - -3850438, -1129576, 1024350, -1836099, -2720862, 433792, 345745, 1380832, 2383707, 66520452, - -23514946, -22883586, 10305774, 2671470, -8808978, -7552700, -12275017, -11950747, -8924942, -7361574, - 10894185, 2677912, 1228361, -6122476, -5544803, -19325206, -120259, -7567733, -13460428, 11252814, - 7310035, 2415919, 6788196, 2052994, -2439542, -4185446, -459562, -3517578, 5540508, 9665824, - -10224170, -3605625, 55835, 5338645, 13138305, 4108136, 17652316, -8970039, 5510443, 14922864, - 8630737, -7232725, -2280628, 1870458, -3837553, 6541235, -1075889, 517544, 9365176, 5347235, - 1432372, 1075889, -313533, -3777424, -191126, 1335735, -4318590, -2196876, 4114579, -1425929, - -8117488, -957778, 167504, -1174674, -8448201, 2409477, 1653562, 2330020, 2272038, -1511829, - -3545496, -944893, -1821066, 7054484, 2849711, -2409477, 1833951, -377957, 1376537, 356482, - 21393232, 40450000, 15990163, 10797548, 12775380, -3745212, 4170413, -11607149, 20233590, 7894150, - 19441170, 5748814, 7473243, -17693118, 22157736, 32654636, 4260608, 21163452, -4140349, -17224966, - -16911434, 15522012, -4887673, 12390981, 2420214, 4954245, -9405978, 9588514, -3212636, -3448859, - 16000901, 11014444, -8181913, 14815490, 1812476, 2697240, -2836826, -11196980, 3266323, 824634, - -6066642, -7054484, 6721624, 9210557, 3189013, -3253438, 4518306, 350040, 9981504, -5918465, - -687195, -9756018, 1316408, 9543417, 6601365, -4432406, 148176, 3354370, -8480413, -650688, - -5729487, -3294240, 1995012, 2284923, 6015102, -6837588, 3156801, -7866233, 884763, 9758166, - 3624953, 1928440, -5978595, 921271, 938450, -10172630, -2497524, 1191853, 1941325, 4041564, - 1846836, -51540, -47493748, -2415919, -10861972, 13595719, -10408853, 11212012, 156766, 9017284, - -1410897, 7797513, -23828478, 7106024, -2959233, -8377334, 3972845, -10239202, 6189048, -10340134, - -5725192, -23029614, 12996571, 27902256, -11085311, -3549791, -3367254, -4415227, 4035122, 5637145, - 7853348, -20478404, 5957120, -12713103, -3874061, -603443, 10368051, 4125316, -5516886, 2323577, - 2046552, 7645042, 7507603, -12768938, -4445291, 1937030, -9584220, -8280697, -1797444, -5896990, - 2330020, 7260642, 749472, 1314260, -1913408, 6771016, 17886392, 10280004, -11336566, 2308545, - 3889093, -5448166, 6161131, 1720134, -7340099, -616328, 7930657, 927713, 7580618, -10447508, - -2673617, 6358699, 77309, -3399467, -7531225, -504659, -4103841, 6083821, -1943473, 3818226, - -2033667, -725850, -87061136, -32411970, 17452600, 6549825, -11345156, 12537010, 9990094, 16492674, - -4123169, -6919193, 14055280, 826781, -9775346, 19591494, -21889300, -28048284, -13524852, -14944339, - 9730248, 14480482, -502511, 3914863, 22308060, 10142565, -22950158, -10048076, -14181982, 4443144, - -21320218, -18199924, -1286343, 3113851, -8257075, -8592082, -13054553, -6436009, -11959336, -11297911, - -4498978, 1260573, -4367982, -410169, -8111046, -953483, -6247030, -13166222, 28898688, 2639258, - 6730214, -11562052, 7554848, -472446, 3798899, -9223442, -517544, -1249836, -8040179, -4657892, - -3732327, 9738838, 6766721, 7687992, 4473209, 6032282, -1460289, 395137, -6968585, -942745, - -450972, -221191, 8806830, 2742337, 5117454, 5778879, -4146791, -9324374, 4020090, -3382287, - -1827509, 4264903, 11327976, -1075889, 45479408, 16823386, 36633924, 5871221, 2420214, -14590004, - 5602785, 22065394, 8231305, 1707250, 14727443, -13086765, -5916318, 12120398, -9148280, 4307852, - 21105470, 6923488, 2888366, 6867653, -3828963, 9326521, -6955700, 390842, 3612068, 1385127, - -5351530, -5645735, 2323577, 21897890, -6983617, 5551245, -19978040, -10537702, 9227737, 23072564, - -17529910, 324270, 11108933, 2965675, 4279935, -14366666, -5001490, -12386686, -21917218, -5613523, - -12141873, -12723841, 10544145, 4383014, 3715147, -7346542, -4518306, -1290638, -21028160, -1767379, - 11976516, -8160438, 9637907, 19756850, 3103114, 13161927, 8667244, 962073, -3760244, 11458973, - -14040248, -429497, -697932, 9171903, 4477504, 8473970, 478889, 9375914, -403727, 2145336, - 1565516, 9972914, 246961, 362925, 8890582, -4430259, 5613523, 2192581, 1660005, -2540473, - 55624120, -12431783, -16709570, 2435247, 13015898, 10069551, 10883447, -3365107, 11716671, 3309272, - -13290776, -27457726, 18494130, 4614943, 13460428, 7591355, -6942815, 2931315, -10114648, -18047452, - 18762564, -11821897, -21818434, 2093797, -3328600, 2476049, -1900523, -2486786, -5317170, -9012989, - 6816113, 14669461, -21257940, 20841328, -17937930, -24043226, 2617783, 6148246, -13131863, 10353019, - -1597728, 6487548, -11263552, -5959267, 19986630, 7838316, 20235738, 5091684, 1821066, 6143951, - 253403, 558346, 10750303, -1093069, 2156074, -9494025, -6034429, -5692979, 7666517, -7417409, - -5866926, 11697343, -30065, 13121125, 2347200, -9871982, 16228534, 12212740, -693637, 7907035, - -7827578, -13559212, 5478231, -5070209, -9322227, 670015, 8826158, 11392401, -4030827, 3446711, - 5927055, -925565, 2729452, -11731703, 4773856, 3856881, -5448166, 46471548, 56390772, -8557722, - 244813, -28321014, -3317862, -20637318, -15614354, -4849018, -10707353, 16101832, -90194, 12515535, - -26626650, 22157736, -16804060, 22625888, 706522, 17989470, -6554120, 22645216, 7318625, -10617159, - 4662187, -15902116, 10535555, -8811125, 25284472, 7675107, 16589311, -27635968, -15979426, -6693707, - -14147622, -5772436, -9706626, 1017907, 34213708, -15734613, 17162690, 29186450, 4039417, 12902082, - 92342, -6395207, -13647259, -10228465, 1367947, -7346542, 17471926, -11246372, 7971460, 21356724, - -2869038, -1627793, -1773822, 17491254, 18698140, 6008659, -8785356, -7509751, -4670777, 7468948, - -17263622, 3360812, -3150359, -4602058, 178241, 11484743, 949188, 16209207, 14654428, 3051574, - 3470334, -6856916, -410169, 16662326, -2192581, 1118839, 6874095, -8682276, 111669, -9957882, - -11050951, 1739462, 1533303, -2059437, -43862352, -39612484, 17740362, -5392332, 21908628, -12524125, - -10037339, -14918569, -11937862, -5753109, -34561600, -12887049, 13563507, 18539226, 7902740, -24350318, - -6682969, -11755325, 10468983, 34896608, 19816980, 8435316, 1582696, 2534031, 2035815, 6038724, - 18333068, 1359357, 4988605, -10415296, 1080184, -14879914, 6019397, 7127498, 13342316, 1610613, - -8701604, -4578435, 17521320, -8108899, 6781754, 3463891, 6530498, 21992380, -12000139, -18706730, - 7286412, 15665893, 4440996, 15659451, 19142670, 9053791, 13363791, 4999342, 3109556, 10322954, - 31726924, -17532056, 285615, 5130339, 3096672, -13602161, -2093797, 10428181, 135291, -12197707, - 5158256, 22789096, -18242874, 6027987, -17257178, 10146860, 7226283, 2791729, 1007170, -8308614, - -7934952, 16035260, 9000104, 3264175, -4567698, 11237782, -1271310, 32212, -7475391, 8284992, - 3425237, -88409752, -31151398, -1773822, -9062381, -21642340, 13131863, 18041010, 29858612, 10097468, - 18689550, -17349520, -37276020, 17467632, -8978629, 1136019, -20175608, 19836306, -12013024, -725850, - 18015240, -50343460, 4642860, 26493506, -49289044, -12768938, -17617956, 2572686, 1586990, 12199855, - -13883482, 16103980, 2022930, -25527138, -13501230, 3236258, -3547643, -12549894, 10965052, 30096984, - 6137509, 8461086, -5055177, -7258495, 17190606, 3369402, -9025874, -42777876, -7106024, 5600638, - -22048214, 10522670, 8529805, 1919850, -17104708, -14882062, -18221398, 38738456, 9957882, -5708012, - 7187628, -32613834, 3569118, -15178414, -17918604, 17235704, -3199751, 384400, -11407433, -40853728, - 5239860, 12625056, 6912750, -2834679, 23965918, 968515, -10468983, -1466731, -16230681, 25295210, - 13391708, 7189776, -4460324, 1866163, 7793218, -7327214, 2864743, 3618510, 1060857, 94128504, - 23607288, 24365350, 20544976, -5903433, 745177, 96812856, 27867896, -7889855, 59017144, -33021856, - 24595130, 5302137, 15017353, 24270860, -7505456, -16722455, 18169860, -3173981, -58437324, 15077483, - 15122580, 12513387, 27788438, 17770428, 18148384, -16292958, 3620658, -15721728, -8291435, 17482664, - 5750961, -33917356, -20349556, -28394028, -42528768, -6326487, 8798241, 20974472, 17965848, 15655156, - 12994424, -6094559, 22293028, 12592844, -27036820, -10144713, 7273527, 20620138, 545461, 4627828, - 35974648, -6197638, -2972117, -9062381, -1799591, 18549964, -15547782, 523986, -22018150, -19383188, - -12491912, 23274428, 31722628, -8905615, 2662880, -5815386, -19516332, -13022341, 5218386, -22447646, - -5920613, -5781026, -14568529, 40587440, 8965744, 13786845, 11890617, -850404, 204011, 7284265, - 2276333, 13000866, 8151848, 562641, -1108102, 96125664, 56098716, 4492536, 35465692, 27844272, - 7406671, 41897404, 11265699, 285615, -13303661, -9133248, -27455578, -72924248, -5854041, 7550553, - -25445534, -13849122, -3227668, 51627656, 16361678, -12869870, 124554, 3974992, -7733089, 22009560, - -4035122, -12887049, -9468255, -12124693, 7700877, -18013092, -45417132, 1436667, -23892904, -36013300, - 6753836, 16125455, 22419730, 13254269, 19801946, -13348758, -39170100, -24891482, -35272420, 14106820, - 32319628, 27348204, 17033840, 33062658, 453119, 20817706, 43946104, -36271000, 6231998, -16146930, - -212601, 13157632, 12837657, 21968758, -2325725, -44424996, -35021164, 7874823, -10172630, -12326556, - -8931384, -9369471, -31080530, 3141769, 20426864, -1797444, 15472620, -9096741, -1196148, -1290638, - 7548405, 30900142, 21105470, 19005230, -17978734, 1466731, -10967199, 1700807, -28585154, 6124624, - 4275640, 3526168, -964220, -2987150, -8512625, 7511898, 23478438, -47983376, 6094559, -36777804, - 16531329, -70044472, -1728724, -23381802, -35867272, 64276332, 36633924, -23229330, -57773752, -14888504, - -20987358, -50861004, 39528732, 1859721, -34855808, -13265006, 20362440, -33386928, -22417582, -17671642, - -39140036, -15337328, -682900, -32042604, -28703266, 40160092, -15000173, -12912819, -3637837, -9337259, - 34475704, -38405596, -17718888, 7735236, -10071698, -360777, -8572755, 19509888, -36054104, 12534862, - -57690000, 5538361, -16460462, -23405424, 60694332, 5950677, -22374632, 11205570, 12708808, -49327700, - 33998960, -8660802, -10518375, -4090956, 19443316, -8486855, 876173, -23843510, 12762495, 15483357, - 27292370, -23987392, -60462404, 41790032, -4849018, 17001628, 20648056, -12957916, 11899207, 30764850, - -39893804, 1685775, -14083198, -4801774, -41422812, 13647259, -6485401, 1185411, -1095217, 4992900, - -7030862, -6753836, 11317239, -10982231, 8169028, 1909113, -7857643, -91905856, -50298364, 10819023, - -31862214, 3317862, -22870700, -12764643, -33814276, -24296630, 17914308, 50667728, 54470924, 7952132, - 38603168, -26882200, 67005784, 48142288, -38281044, -35581656, 11574937, 10333691, 56717192, 19743964, - 36515812, -13597866, 14970109, -7937100, -5467494, -12543452, 53053584, 22853520, 50837380, 45021996, - 9326521, -3347927, -21685290, 21391084, -2091649, -46641196, -30118458, -9403831, -23227184, -5972152, - -23890756, -22101902, 15040975, -7161858, -14931454, 37718404, 45773612, -26710402, -8179765, 61042224, - 25690346, -42829412, -40928892, -15618649, 16108275, -2647847, -7209103, -30678952, 25832080, 7127498, - -9270687, 6350109, 7456063, -37879464, -15893526, 2854006, -13544179, -18747532, -19035296, 49787260, - -39073464, -36127116, 15028091, 25211458, 37368364, -19400368, -5521181, 2879776, -16527034, 16954384, - -2188286, 12560632, -10634339, -5252745, 3882651, 4466766, -5918465, -6247030, -42950, -7483981, - -34930968, -50813760, -44012676, -180389, -34673272, -44165148, 11248519, -3629247, -61976380, 44313324, - 7718056, -3588445, 21848498, 68199784, 64879776, 28194312, -79729624, 29725468, 21000242, -77846280, - -1202591, -37505800, -18395344, 40325448, -47285444, 27543626, -109522, -7971460, -16962974, 8244190, - -4020090, 13655849, -9176198, -41635412, 40475772, 19333796, 48496624, -4926328, -16458315, -23364622, - 19591494, -21045340, 57299160, 12208445, 34389804, -44581760, 35538708, 1507534, 12537010, -28898688, - 9680856, -34346852, -5506148, -35238060, 14394583, 24573656, -47019156, 2020782, -38749196, 18229988, - 22797686, 22374632, -3103114, -66256312, 83752, 17637284, -5765994, 29611652, -63541892, 16393890, - -26459146, 8632884, -22426172, 4728759, 16376710, -7039452, -274878, -6798933, -8291435, 2645700, - -17149804, 21629456, 4814659, -438087, -27318140, -2420214, 2836826, -1846836, 11411728, -11667279, - 2587718, -1138166, -6051609, 95490008, 115833120, 48451528, 40387724, -66780300, 64233384, 93258776, - -102039832, 12210592, 66179004, 11521250, -121708632, -12150462, -66071628, 21328808, 24206436, -30764850, - -12045236, 22194244, -55886116, -4462471, -21897890, -27457726, 10900627, -42384884, 45653356, 32545114, - 59042916, -29250874, 9646497, -6378027, -24088324, 74549896, -1479616, -34316788, -16228534, 16103980, - -16080358, -19529216, -22932978, 37920268, 14061723, 52718576, -3768834, 19323058, 69170448, -43920336, - 9148280, -29828548, 54872504, -21588654, 25645250, 10879152, -2239826, -20828444, -39172248, -26474178, - 10969346, 49604724, -46757160, 41848012, 49456548, 24865714, 57805964, -28308130, -23089744, 37673304, - -6607807, -7043747, -53470196, -3410204, -44132936, 9019431, 55718612, 27341762, 13962939, 25546466, - 15129022, -24017458, -10913512, -41916732, 47259672, 1945620, -18934364, 12474733, 4151086, -22054658, - 11394548, -3199751, 13460428, -2321430, 20484846, 9814000, -44571024, -151485648, -63621352, -108920368, - -58911920, -46544560, 25063282, -69913480, -71567040, -34168612, -95614560, -31035434, 71902048, -2177549, - 2733747, -19449760, -17040282, -9012989, 6416681, -1148904, -64087356, -10144713, -12768938, 92721904, - -12161200, 82441896, 6541235, -22166326, 21294448, 67875512, -3672197, 708670, -27474906, -7975755, - -28829968, 16138340, -12270722, -24388972, 12165495, -32948842, 26628798, 27204322, 5119601, 59435904, - -27064736, 30296700, -25312390, 33436320, 22460532, 62618476, 8415988, -25516400, 33513630, -4290673, - -21131240, 79527760, -6083821, -4797479, 45657648, 14128295, 61523260, -48037060, -47029892, -7142531, - -20456930, -6463926, -75995152, -17248588, 26175678, -10292889, -32785632, -53362820, 3478924, 16312286, - -26819924, -25559350, -46533824, -16533477, 19593640, 20336670, 40980432, -6592775, -3895535, -1464584, - 13606456, 16408923, 2686502, 26027502, 7071664, 2798171, -3586298, -2482491, 18556406, -7965017, - 18341658, 20746840, -968515, 6156836, }, - { - -11093901, - 5963562, -3131031, 3644280, -2179696, 3064459, -6444599, 283468, -264141, -738734, 1475321, - 3195456, -122407, -311385, -3536906, -1413044, 1507534, 867583, -427349, 1387274, -440234, - 483184, -1602023, -1086627, -1095217, -371515, 139586, -818191, -581968, 1881196, -1110249, - 1144609, -1093069, -186831, -856846, 1050120, 377957, 865436, 1473174, 1859721, 691490, - 502511, -176094, 208306, 279173, -386547, 358630, 3919158, -4483946, -597000, -826781, - -1110249, 721555, -2222646, 751619, -49392, 1009317, 891206, -1769527, -624918, 2688650, - -279173, 571231, -498216, 1166084, 2471754, 2851858, 487479, 1226213, -40802, -2259153, - -66572, 240518, -487479, 4295, 1243393, -1299228, -1739462, 753767, -839666, -781684, - -1219771, -60130, 1284195, 317828, -380105, -470299, -511101, -12885, 285615, -693637, - 253403, -790274, 474594, -11257109, -7954280, -3925600, -2909840, -2278480, -2291365, -826781, - -1687922, -558346, -1054415, -2806761, 554051, 1391569, -214748, 781684, -521839, -1471026, - -1432372, -2207613, -732292, 493921, 75162, -1256278, 835371, -1513976, -1451699, 927713, - 6442, 15032, 777389, 839666, 236223, -371515, -429497, -609885, 300648, 118112, - -762357, 375810, -1522566, -693637, -377957, -195421, -1086627, -257698, -401579, -62277, - -16026670, -2080912, 1172526, 302795, 1103807, 191126, -938450, 644245, -736587, -687195, - -1490354, -1142461, 521839, -384400, 959925, -916976, -40802, -884763, 242666, 1685775, - -481036, 1271310, 10737, -1043677, -279173, 1535451, 682900, 1022202, 1028645, -1464584, - 977105, -558346, -180389, -760209, -450972, 513249, 607738, 423054, -425202, 1251983, - 970663, 682900, -408022, -697932, 53687, -562641, 75162, 18850612, 14944339, 3584150, - 6670084, 1655710, 5151814, 3687230, 1086627, 3712999, 1438814, 2828236, 1174674, -964220, - 2763812, 2016487, -792421, -204011, -5220533, -508954, 240518, 3219078, 337155, 176094, - 1593433, 182536, 1440962, 1400159, 197569, -51540, 498216, 2220498, 1642825, 1453846, - -150324, -496069, 81604, 1065152, -386547, -42950, 1114544, 433792, -560493, 38655, - 238371, -1037235, 1378685, -736587, 33208688, 12000139, 5978595, 3358665, 2239826, 2022930, - 2149631, 3264175, 953483, 5400922, 882616, 388695, 2499671, -1406602, 702227, -691490, - -459562, -1032940, 3682935, 1840394, -148176, 2585570, -1711545, -586263, -504659, 4058744, - -238371, 1387274, 485331, 1934883, 513249, -715112, 1236951, 1294933, -481036, 392990, - 740882, 272730, 1020055, -377957, 1146756, 779537, -2506114, 487479, 491774, 414464, - 2016487, 12841952, -9539122, -3148211, -4496831, -2559801, -2735894, 1881196, -1632088, -3781719, - -1142461, -5076652, -1382980, -2136746, -5158256, -1142461, 955630, -3036542, -1228361, 607738, - -3700114, -42950, 3882651, 1024350, 399432, -1752347, -109522, 1526861, -161061, -1606318, - -2007897, 1971390, -362925, -2310693, 23622, -923418, 2750927, 17180, 1123134, -375810, - 2342905, -1582696, 807454, 438087, 377957, 126702, 433792, 21475, -1045825, 1651415, - 977105, 158914, -34999688, -19593640, -4166118, -4793184, -3517578, -4179003, -6208375, -444529, - 12885, -1670742, 1363652, -1546188, 96637, -73014, -2151779, -2102387, -3631395, -1125281, - 3251290, -3167539, -536871, 3169686, 1801739, -423054, 962073, -392990, -3536906, -1619203, - -2937758, -889058, -53687, -648540, 1415192, -2909840, -2516851, -64425, -3051574, -2188286, - -2216203, -2332167, 2276333, -717260, -3214783, -953483, 624918, 940598, -1224066, -1546188, - -901943, -2879776, -1561221, -21728240, 12620761, 4262755, 2353642, 1769527, 2218351, 605590, - -1943473, 277025, -1015760, -717260, 4176856, 2025077, 3648575, 3064459, 3837553, -3219078, - 1829656, 3442416, 962073, 2961380, -3500398, 427349, -612033, -562641, -1080184, 1084479, - -133144, -236223, 3775276, -3805341, -691490, 1050120, 2336462, -1204738, 2012192, -1677185, - -1926293, 2461016, -985695, -397284, -380105, 758062, 40802, 987843, -970663, -794569, - -839666, -612033, -680752, 1773822, 594853, 388695, -856846, -1793149, 513249, 1806034, - 508954, 32006096, 12844100, 2950643, 7071664, 5877663, 919123, 2740189, 6682969, 3335042, - -343597, 1675037, 676457, -803159, 1788854, 6109591, 1211181, 7254200, 3251290, -5585605, - 919123, 423054, 1030792, 5418101, 2768107, 2314987, -616328, -588411, -861141, -654983, - 657130, -914828, 1582696, 749472, 2211908, -249108, -749472, 1097364, 1784559, 1284195, - -347892, -2310693, -1209033, -1176821, 2145336, 1887638, 2441689, 1662152, 261993, 614180, - 2076617, 1984275, 1329292, 481036, 219043, 1346472, 1063004, 841814, 1692217, 35704064, - 10033044, 4604205, 5396627, 1078037, 5209796, -706522, -2211908, 49392, 1221918, 738734, - -319975, 1187559, 5323612, -637803, -3575560, -2229088, 2503966, 848256, 2946348, 5072357, - 4151086, -120259, 2720862, -2942053, 204011, -2246268, 3161096, 2063732, -3852586, 2342905, - -1898376, 435939, -1554778, 2372970, -1498944, 2933463, 2080912, 1956358, 3446711, 1340030, - -184684, -697932, -98784, 657130, 3837553, 68719, 2147, 455267, 1812476, 1447404, - 53687, -313533, -663572, -1906966, -444529, -1421634, -618475, 5089536, -15307263, -5961415, - -2637110, -3279208, -1758789, -1120987, 47245, 2349347, -2396592, -3908420, 3633542, -4733054, - -4872641, -678605, -1275605, 2317135, -1520418, 77309, -4718022, -2523293, -5654325, -5821828, - -6869800, -747324, 1359357, -4488241, -1451699, 843961, 302795, 380105, -798864, -4447439, - -3075197, 2186138, 575526, -901943, 4176856, -2755222, -1520418, 1267015, 2480344, 2366527, - -584116, -489626, 850404, 822486, -3042984, 433792, -1872606, -581968, 12885, -974958, - -49392, 2108829, 221191, -225486, 279173, -1967095, 1099512, 1928440, -581968, 90194, - 45097, -176094, -38732016, -12079596, -7389491, -2942053, -5340792, -4110284, -1322850, -2909840, - -1335735, -3912715, -5486821, -3777424, -1408749, -7909183, -2003602, -3169686, -4937065, -515396, - 743029, 2684355, -2927020, -3912715, -1567663, 3358665, 4116726, 5242008, 2677912, -64425, - -2639258, -1082332, -60130, -3068754, 1226213, 2211908, 2604898, -1756642, -1653562, -1387274, - -807454, -545461, -1187559, 2158221, -691490, 1425929, -2750927, -4550518, -2025077, -105227, - 2237678, -3929895, 1245541, -1848983, 1801739, -1883343, 1043677, -1563368, -167504, -992137, - -191126, 749472, 1395864, -934155, -1421634, 23622, -1417339, -22207128, 5927055, 1627793, - 34360, 3871913, -3719442, 977105, -8572755, -2813204, 2989297, 2089502, 5538361, -431644, - 6038724, -3547643, -889058, 2860448, -5254893, -1958505, -3094524, 5854041, -380105, -4911295, - 2445984, 4655745, -4183298, -3219078, -3770981, 1047972, -893353, 1984275, -1458141, -1234803, - -1030792, -2323577, 3298535, -2720862, 618475, 2130304, -302795, 2467459, -1490354, 5454609, - 792421, -605590, -1964948, -1967095, 42950, -2257005, -2731599, -1724429, 384400, 1825361, - -309238, 461709, -2394444, -2407329, -3395172, -1389422, -1120987, -936303, 895501, 1314260, - -1408749, 156766, 19142670, 27608050, 9442486, 9635759, 13000866, 9524090, -1378685, 1986422, - -1071594, 1881196, 1559073, 2531883, 1730872, 4844723, 1767379, 3096672, 889058, 9444633, - 2149631, 4722317, 2675765, 2568391, 7303592, 1919850, 9161165, 4932770, -1870458, 6672232, - 1692217, 3395172, 6470368, 1531156, 3854733, -1748052, -665720, 2050847, 2918430, -3721589, - 3390877, -2048699, -4286378, -2289218, 3573413, 5587753, 4063039, -521839, 1327145, 1494649, - 2018635, 3073049, 1636383, 3444564, 1947768, -2763812, -62277, 2503966, 3098819, 1198296, - 1024350, 822486, -3023657, -959925, -1859721, 2031520, -124554, 66486092, 4694400, -3055869, - 5025112, -3287798, 7191923, 2568391, 7567733, -3569118, 453119, 350040, 4436701, -8033737, - 1350767, 5686537, -1415192, -912681, 6631430, 11184095, -4797479, -2194728, 1052267, 5699422, - -2662880, 3822521, -90194, -3165391, -3182571, -2454574, 2040110, 3644280, 3547643, -2396592, - 3944928, -2364380, 3826816, 4028679, -1187559, -2080912, 1157494, -3558381, -5781026, 1606318, - -4026532, 1934883, 156766, 989990, 2132451, 352187, 2641405, 590558, -3985730, 1900523, - -1200443, 2196876, -2965675, -139586, 219043, 2312840, -1709397, -4350802, -1011465, -1655710, - 227633, -1232656, -22546430, -21938692, -4945655, 1668595, -959925, -3341485, -3564823, -4937065, - -1305670, 3579855, -1185411, -1284195, -5053029, 5263483, -324270, -4425964, -3788161, 9152575, - -8362302, 801011, 6081674, -785979, 981400, -8115341, 2540473, -3521873, 1894081, -5669357, - -3691525, 841814, 1451699, -2692945, -2967823, 197569, -1239098, 317828, -3466039, -2022930, - 3541201, -478889, -1722282, -1103807, 4511863, 1921998, -2639258, -4054449, -3560528, 1090922, - -586263, -1767379, 337155, 652835, -1982127, 5308580, 2886218, -665720, -468151, -1509681, - 601295, -1683627, -1623498, -1735167, -367220, -3165391, -2478196, -4215511, 899796, -4505421, - -214748, -1219771, -1125281, -347892, -9021579, -7380902, -9281424, -6328635, -4962835, -2967823, - 502511, 118112, -2506114, -702227, 1956358, 8078834, -7075959, 3657165, -2514703, -4114579, - 5330055, -259846, 884763, 7505456, 858993, 3285650, -4786741, -865436, -13522705, -1299228, - 2310693, 1868311, 942745, 1571958, 1666447, -2729452, -4194036, 3270618, -554051, 3103114, - 1247688, -3287798, 2697240, -66572, -9640054, -7546258, -1503239, -7129646, 758062, 2521146, - -700080, -1666447, -1041530, 551903, -2364380, -461709, -622770, -1060857, 2089502, 826781, - 560493, -1108102, -1148904, 3837553, 755914, -2143189, 2319282, -375810, -1879048, -3624953, - -92342, -1885491, -839666, 2894808, 1977833, 3064459, -43089260, -9805410, 622770, -8551280, - 3444564, 871878, 10320806, -4821101, 601295, -2826089, 6912750, -14111115, -13567802, 5727339, - -6582038, 10206990, 3676492, -8175470, -14366666, -313533, -4075924, -6951405, -2869038, 1653562, - 2310693, -3350075, 12277164, 674310, -1234803, -5123896, 4172561, 4670777, 5001490, 5405217, - -680752, -3176128, -1219771, 3201898, -261993, 3861176, -3631395, -1408749, -1256278, 4471061, - 3566970, -3889093, 5053029, -2808909, -3539053, 448824, -1614908, -3339337, 3446711, -3955665, - -536871, 1024350, -970663, -1604170, 897648, 3337190, -2070174, 3201898, -2643552, 2153926, - -1471026, -1634235, -1039382, 657130, 4108136, 760209, 3848291, -2435247, 39498668, 34720516, - 7256347, 9290014, -1848983, 11358041, 9092446, 11441793, -466004, 4610648, 2761664, -10694469, - -9070971, 5016522, 983548, -7645042, -8104604, -4494684, 534723, 4647155, 1363652, 10892037, - 9923522, 4391604, -2272038, -2351495, 6577743, 6197638, 506806, 5441724, -1717987, 6942815, - 408022, -1410897, 9586367, 5053029, 7868380, 5145371, 1752347, 5585605, 2796024, 1999307, - 5123896, -2699387, 1052267, 6863358, -36507, -4258460, 4054449, 4093104, 2894808, -2957085, - -38655, 4052302, 5978595, -2860448, 7221988, 8319352, -1382980, -4325032, 807454, 2005750, - 1320703, 3721589, 32212, 1413044, 2830384, -1868311, 253403, -2707977, -667867, -3695819, - -2136746, -337155, 47991964, 3839701, -1286343, 3317862, 2385854, -7922067, 2128156, 2074469, - 79457, 5044439, 7400229, 10896332, -4812511, -5014375, -7666517, -6322192, 7146826, -609885, - 10286447, -2510409, -2400887, 4157528, 8948564, 3474629, -8834748, 7002944, -2525441, 5592048, - -2864743, 4329327, -5289252, 3244848, -352187, 5091684, 704375, 2881923, 1657857, -9088151, - -4889821, -891206, -1748052, -897648, -2738042, 4310000, 1737314, 9266392, -1361505, -6425271, - -3635690, -689342, 637803, -7140383, 2471754, -2461016, -236223, -736587, -4063039, 3723737, - 7290707, -2319282, 3790309, 811749, -3970697, -433792, -3775276, -3259880, 723702, -5697274, - -3936338, 2308545, -212601, 1215476, 3951370, -5396627, 6451041, 682900, -2641405, -6412386, - 1857573, -2342905, 13821205, -3285650, -13230647, -8914205, -11929272, 11035918, -8817568, 2461016, - 13443248, -575526, -13675176, 955630, -14353781, 11965779, -4172561, 11927124, 68719, -4514011, - 10234907, 401579, 2123861, -7685844, -9736691, -1546188, 3425237, 2113124, -1900523, -4471061, - 4531191, -1367947, 3386582, 5224828, 6326487, 2944200, 3502546, -12807592, 1075889, -2890513, - -4378719, 1775969, 6365142, -5338645, -9844065, -4331475, 2894808, 1140314, -8647917, -3511136, - 4045859, 5922760, -5194763, -3369402, -3994320, 6060199, 8031589, 1638530, -2690797, 927713, - 5757404, -2738042, -216896, -3760244, 4041564, -4709432, -543313, 5624260, 3367254, -1617055, - -841814, -122407, -1795296, -48320528, -49012020, -7913477, -24043226, -14877767, -8555575, -13303661, - -1655710, 10073846, -21996676, 8040179, -4533338, 7335804, 1226213, 4501126, -9148280, 2325725, - -1185411, -4739497, -20186346, -4095251, -10520522, -12799003, -1385127, 3242700, 631360, -4350802, - 2738042, -4129611, -1277753, 10700911, -281320, -3560528, 609885, 7000797, 9347996, 6305012, - -53687, 5033702, 5757404, -569083, -6442, -10462540, 3781719, -8647917, 1554778, 8336532, - -5808944, -10473278, 2959233, -5877663, -5684389, 1155346, -154619, -4967130, 2338610, -1183264, - 11212012, 6330782, 3377992, 1389422, 4063039, -418759, 1170379, -4456029, -8078834, -1329292, - 609885, -5723044, -4045859, -3146064, -2757369, -3246995, 1702955, -1672890, -575526, -3601330, - -28771986, 53437984, 41873784, 2660732, 8493298, 3438121, 9264244, 14229227, 3214783, 13825500, - 2454574, -14441828, 9622874, 11671574, 3420942, 3536906, 8662949, 11506217, -11469710, 9612137, - -6062347, 8454643, 1234803, -6867653, 1322850, 9558450, 5355824, -11169062, 5430986, -4507568, - 16335908, -1262720, 3796751, -2403034, -10584947, 10767483, 10550587, 5177583, 2667175, -339302, - 3777424, 11428908, 2594160, 8216273, 981400, 5759551, 3027952, -594853, 6079526, -7232725, - -11523397, -4891968, -8796093, -7262790, -3835406, -7460358, 10239202, 7473243, 863288, -1657857, - -3689377, -1024350, -294205, 264141, 481036, 1619203, 2123861, 1378685, -236223, -2514703, - -2327872, -186831, -234076, -783832, 1140314, -985695, 6178311, -1187559, 8121783, 71766760, - -28237262, -14948634, 2372970, 81604, -3762391, -19619410, -8703751, 5319317, -1181116, -2594160, - -4101694, 3311420, -16544214, -4408784, 8276402, 16168404, 8467528, 7398081, -5304285, -4569845, - -9612137, 11237782, -15685221, -2437394, 3631395, -9934259, 3141769, 4653597, 12262132, -18788334, - -1806034, -68719, -4142496, 5332202, -17845590, -8937827, 19228568, 13058848, 2465311, -3062312, - 11405286, -3126736, -1700807, 2437394, 8877697, 5504001, -5808944, 1468879, -3474629, 7713762, - -12090333, -5080947, -7400229, -7297150, 14355928, 4271345, 1610613, -6146098, -734439, -1898376, - -2763812, -6455336, 889058, -6105296, -468151, 2482491, 5411659, -9408126, -6908455, -8282845, - -2808909, 4904853, 620623, 6420976, -1017907, -7677254, -1037235, -3309272, 3513283, -70867, - 21335250, 48859548, 8119636, 18595060, 16956530, 16110422, 5493263, 12025908, 7539815, -3582003, - -9846213, -6380174, -2778844, 13786845, -11748883, -13179107, -807454, -663572, -5272073, -10101763, - 29759828, 27803470, 21068962, 970663, -11875585, 2065879, 2085207, -6025839, 6925635, 4318590, - 12068858, 1342177, 4986457, -620623, -8138963, 13518410, 11347304, 8063801, -1840394, -10801843, - 762357, -869731, -2901251, -22013854, 15934329, -10052371, 18360986, 1000727, 9977209, -2134599, - 10992969, 16501264, 3408057, -7520488, -453119, 2997887, -5351530, 2873333, -2014340, -7058779, - -3743064, 2265595, -1604170, 6897718, 2557653, -11768210, 848256, -1647120, -12521977, -3006477, - 2675765, -4842576, 1490354, 10677289, 4505421, -661425, -3605625, -2884071, 332860, 4636417, - -1185411, 5134634, -51430084, -6786049, -32074816, 397284, 5596343, -10840497, -18777598, -21633750, - -20590074, -12128988, -16801912, -4075924, -1187559, -4299263, 5330055, -3311420, 1039382, 13179107, - 5851893, -1273458, 31059056, -6805376, 6176163, -4524748, 2553358, 4541928, 1597728, -1724429, - 4511863, 14592151, 4325032, 5179731, 1571958, 5849746, 12242804, 16978006, 5267778, 20596516, - -5572720, -17723182, 17854180, -5667210, -3837553, -3599183, 10065256, 15734613, 11781095, -292058, - -4153234, -8987219, -23008140, 14139032, 15981573, 11370926, -13771813, 8297877, 2065879, -1374390, - 12923557, 2203318, 8654359, -7258495, 4181151, -9049496, -951335, 7853348, -2370822, 5905580, - -1329292, -3307125, -3315715, -11027329, 1026497, 822486, -178241, 2115272, -2531883, -13608604, - 944893, 704375, -90067608, -40235252, 18169860, -3375844, -3216931, 3330747, -11403138, -9762461, - -3521873, -4335770, -15887084, 11244224, 1075889, 23633058, -13282186, -11160473, -19370302, -10636487, - -19943680, 1735167, 7099581, -29442000, 18915036, 16527034, -2501819, 3393024, 12270722, 1960653, - 10778220, -22282290, -22701050, -12390981, -14942191, -11267847, 36378372, 12030203, -8205535, -12994424, - -18867792, 8989367, 4866198, -8761733, 7133941, 7322919, -13357348, 1350767, 2785286, 10507637, - -12416750, 30204358, -13344463, -10398116, 4533338, -3131031, -330712, -8952859, -3586298, 1045825, - 18951544, -5830418, 27382564, 5980742, 1627793, 3182571, 7189776, -8162586, -3143916, -10767483, - -8957154, -8229158, -206158, 14948634, -9844065, -7002944, -4262755, -5443871, -5340792, -530428, - -3590593, -5016522, -4675072, 14214194, 45466524, 23394686, 14514842, 9878425, -15990163, 1644973, - -12929999, 20250770, -2177549, -2649995, 6895570, 4496831, 4724464, -554051, 7155416, 2632815, - 7556995, -6146098, 19797652, 2735894, -1754494, 59332824, 3274913, -4443144, -15118285, 8912057, - -14055280, 13320841, 31978180, -2403034, 7879118, 7975755, -16368120, -18268644, 618475, 506806, - 14093935, -8967892, 579821, -843961, 10408853, 10776073, 17858474, 6822556, 6249178, 7509751, - 835371, 11877732, 5555540, -21434034, 4715874, -10967199, -27616640, -2231236, 7898445, 317828, - 2426657, -3502546, 650688, -704375, -25770, 3680787, 732292, 12824772, -7434589, -974958, - 2594160, 2862596, 508954, -4636417, 8879845, 15060303, 14693083, 3277060, -2918430, -1254131, - 5342940, -448824, -1653562, -51540, 3042984, 7110319, -1013612, -2381559, -4709432, -2761664, - 67121752, -19907174, -6878390, -18549964, 34026880, 11866995, 3255585, 6322192, -4413079, -8310762, - 12298639, 616328, -11143293, 2538326, -14849849, -12090333, 1262720, -16020228, 2617783, 4610648, - -10984379, -20673826, 2435247, 627065, 14197014, 22011708, 16179142, -10988674, 358630, 13503377, - 26012470, -27135604, 10602127, -5452461, 92342, -12618614, -16580721, 1020055, 15906411, 4078072, - 7423851, 9274982, -517544, 6055904, -987843, 4213363, 10415296, -18234284, -11924977, 27270894, - -1644973, -1275605, -5708012, 10647224, 36406292, 8564165, 5970005, 11222750, -8866960, -11057393, - 577673, -8353712, -19960860, 12824772, 2278480, -10632192, 6225555, 2692945, -5229123, -10030896, - 13664438, -4883378, -15000173, 6917045, 7834021, 10657961, -10267119, 637803, 5373004, -2274185, - -3536906, 16172699, -706522, 2686502, -6723772, -1318555, 425202, 57183196, 53633404, -17257178, - 14437533, 4737349, 11164767, 29227252, -3818226, -14787572, -5540508, 56186764, -31638876, -5647882, - -15792595, -12139725, -25668872, 28280212, -8278550, -37632504, -28516436, -34299608, -13490492, 31054762, - -3837553, 14858439, -5602785, -15298674, 13514115, 4428112, 17164836, -16297253, 15264314, 12661564, - 6182606, 7537668, -27423366, 8291435, -22905060, 19709604, 40660456, 12253542, 12156905, -25486336, - 36412732, 10222022, -3874061, -5188321, -7473243, 11903502, 18189186, 4913443, -4301410, -581968, - 4891968, -8340827, -6350109, -8001524, -6597070, -197569, 13338021, -8452496, 19954418, 7694434, - 12206297, -3639985, -28656022, -18693846, 7290707, 2461016, -8551280, 11203422, -536871, -459562, - 5765994, -3502546, 8396661, -899796, -962073, 4614943, -4939213, -330712, -5338645, -2695092, - -6698002, 4943508, 365072, 1969243, -53068616, -32396938, 8128226, 3693672, 133144, -24053964, - 14368813, 7344394, -13795435, -39051992, 31797790, 7142531, 12034498, 17199196, 10827613, -5645735, - 6075231, -10310069, 26420492, -22348862, -37310380, -1861868, -1604170, -18461916, -40604620, 644245, - -8164733, -22123376, -11626476, -7380902, 9339406, 874026, 15191299, 29388314, -12622909, -25520696, - 7969312, -3601330, 429497, 11613592, -17495550, -16789028, -2072322, 13808320, -18957986, 15126875, - -5400922, 29832842, -4284230, -10312216, -3528316, -577673, 6174016, -35704064, 5098126, -31003222, - 30975304, -642098, 19445464, 10784663, -11826192, -2330020, -15693810, 6893423, -1709397, 5293547, - 5774584, -21633750, -3195456, -20907900, -8903467, 8121783, -6148246, -13166222, 5830418, -1032940, - -20879984, -11123965, 2134599, -152471, -8684424, 8207683, -4767414, -6221260, 4318590, -13408888, - 6414534, -75026640, -33316062, -13350906, -7438884, -3161096, 8615704, -26665304, -17688822, 5967857, - -20811264, 5961415, -23210004, -8375186, -22413286, -28935194, 30543660, 11469710, 5304285, -2628520, - -23684598, -42408508, 21580064, -55351392, 20607254, -32212, -16630113, 2029372, -9994389, 3330747, - 38813620, -19950124, -1187559, -41796476, 33056216, -10353019, 15509127, -15264314, -3974992, -4170413, - -700080, 18234284, 7402376, 38884488, 48586816, -5849746, 1548336, -16627966, 2611340, -6987912, - 8300025, 14377403, 2733747, 33717640, 10636487, -13681618, 6375879, 6335077, 1060857, -3264175, - 1941325, 25439092, -18734648, -40346924, -15360951, -238371, 10191957, 6040872, 20740398, -2823941, - 9360881, -10838350, -15021648, -22840636, -16716013, 672162, -4760971, 9910637, 3730179, -6889128, - -1881196, 18122614, 581968, 9700184, -3655017, 2780991, -3712999, -5179731, -7050189, 94280976, - 42402064, 28943784, 12313671, -10965052, -16960826, -29693256, 16582869, 28074054, 11909944, -13430363, - 33599528, 18592914, 33595236, 2078764, -23897198, -9554155, 50332720, -52473764, -10501195, 34396244, - -20237886, -11665131, 81146968, -10322954, 23377506, 73181944, -11514807, -4992900, -1885491, 8952859, - -3805341, 31643172, 20721070, 26055420, -18285824, -43486544, 17592186, -17248588, 21090436, -8269960, - 7838316, 30739080, 18174154, 1666447, 13872744, 6122476, 13372381, 29721174, 17126182, -3317862, - 29328184, 12038793, 4443144, 6777459, 53775140, 31950262, 375810, 29016800, -12539157, 36717676, - -8860518, 8005819, -10136123, 4297115, 21436182, -11817603, -511101, -2194728, 7664369, 715112, - -13486197, 455267, -11497627, -21268678, 3899830, -28278064, 11315091, 17197050, -6710887, -12154757, - -7739531, 15058155, 4851166, 732292, -5952825, 122228328, 54840288, -24421184, 10385231, 63292784, - 1215476, 45788648, -13636521, 18285824, 37671160, -28293098, 3193308, 66486092, 59201828, 48692044, - 16842714, 41860900, 6745246, 36737004, 12461848, 11325829, -23031762, -26452704, -38296076, -75086768, - 23785528, 1196148, -20708184, -6908455, 25844966, -16827682, -2830384, 3253438, 14431090, -66488240, - -11038066, 48788680, 37095632, -13172665, 24434068, 21378200, 13432510, -7868380, -15749645, -6423124, - -10666551, -6440304, -24893630, -20641612, 16892106, -41293964, 13563507, 34477848, -10335839, -24034636, - -38169376, 35944580, -1316408, -17652316, -11957189, -7876970, -13226352, 7838316, -6210523, -12899934, - 13335873, 55778740, -27895812, -16320876, 6893423, -10428181, 12614319, 854699, 28404766, 5871221, - -2957085, -2044404, -29865056, -13662291, -4784594, 2884071, 2123861, 10980084, 6401649, 1593433, - 4610648, 5881958, 17355962, 1808181, 326418, -11010149, 3738769, -48408576, -13209172, -58136676, - -12356621, -58095876, 28067612, -55357832, 29923038, -9773198, -31668942, -9869835, -14682346, 67242008, - 10735271, -49340584, 1224066, -32285270, -25013890, 33034740, -37209448, -34868692, -38845832, 58656368, - -7614977, 38665444, -59547576, -32087700, 24142012, -28067612, 23048942, 64969972, 43119324, 40149356, - 7249905, -7056632, -31263066, -45092860, -2044404, 9871982, -41289668, 792421, -24174224, 11942157, - 18781892, -47766480, -40091372, -74788264, -11280732, 5057324, -31705448, -46269684, 45932528, 2261300, - 47175920, 45820860, -5207648, -6532646, -18197776, 26426934, 23368918, 3279208, 11783243, -3773129, - -1885491, 22370338, -5435281, -26214332, -19658066, -32996086, -27227946, -10234907, -785979, -4511863, - -41212360, -24161338, 14100378, 3201898, -14319421, 18008798, -3126736, 985695, 28752658, 23379654, - 15560667, 6030134, 18625126, 2765959, 1047972, 8465381, 6517613, -81585048, -14903537, 7960722, - -8312909, 833224, 21562884, -17514876, 19095424, 19469086, -13711683, 26102664, -36000416, 44936096, - 29615946, 2224793, -33217278, 3328600, 20862804, -95451352, 19228568, 39928164, -69591352, 29055454, - -35983236, -49808736, -46774340, 24105504, -12236362, -71083856, 37864432, 21361020, -44197360, -71927816, - 13973676, 9281424, -23600846, -4567698, -38057704, 35809288, 28252294, 51775832, -41598904, 7372312, - -55009940, -19816980, 8630737, -34005404, 13705241, -3590593, -27986006, -40248140, -45017700, 65487512, - -44394928, -19924354, -17171280, 3438121, 29012504, 18367428, 20959440, 949188, 24648818, -7818988, - 3315715, -10048076, -27593018, 6025839, 56751552, 9650792, 575526, 508954, -37793564, 24831354, - 37931004, 41109280, 7312182, 3745212, -2525441, -2484639, 5076652, 1535451, -19192062, 339302, - 2942053, 3455301, -491774, 1125281, 13505525, -4200478, 1050120, -2849711, -21475, 25649544, - -54606216, -29083372, -57662084, 16391743, -10198400, 22870700, -15672336, 10819023, 18951544, -19355270, - -32893008, 49140868, -12839805, -21951578, 57193932, -11789685, -13247827, 65270616, -37705516, 9586367, - 16056735, 5068062, -57505316, 169651, -8323647, -34632468, 19868518, -27210766, 36715528, -6468221, - 40860172, -44637596, 27831388, -79023104, 964220, -43121472, 48202416, -7425999, 6672232, -8293582, - -43750684, -3193308, 38306812, 100824360, 7546258, 6335077, 21530672, 34458524, -5740224, -9715216, - 3262028, -1733019, 88789856, -8040179, 13776108, 35605280, -34441344, -59075128, 307090, -62431644, - -7541963, -32053340, -22866406, -12526272, -26231512, 14832670, 22104050, -36361192, 46027016, 38132868, - -5321465, -9442486, -37366216, 26195006, 9431748, 24848534, -20884278, 10277857, -3949223, 18796924, - 2304250, 18187040, -9105331, 13340168, -2108829, 335007, 4582730, 20630876, 10028749, 6326487, - -6637872, 536871, 2042257, 95163592, 103386304, 874026, -31928786, -25396142, 86558624, -56910464, - -65165392, 67703720, -61570504, 39586712, 11834782, 54784456, 50242528, 34129956, 5278515, -34419868, - -29974576, 71066680, -30361124, -3008625, 17115444, 60544008, 87359632, -2632815, 59609852, -48958332, - -51380692, 5808944, -19123342, 28286654, 17688822, -43662636, 5729487, 27797028, 71792528, 24590836, - 29283088, 27109834, 31978180, 8323647, -2772402, 45732812, 7799661, 36578088, 58295592, 12242804, - -24326694, -20422570, 52518860, 13851270, 107994808, 25293062, 42410656, -44130788, -69677256, -6659347, - -81314472, -51924008, -18743238, -27704686, 2783139, -4114579, 384400, 1129576, -60881160, -50182396, - -26776974, -51820928, 18676666, 20605106, -15955804, -4009352, -48374216, -7546258, 13913547, -13696651, - -4402342, 4924180, -30636002, 12698071, -9605694, 3635690, 5111011, 184684, 1801739, 6597070, - -7529078, 1140314, 6788196, -272730, 1408749, 2057289, -45202384, -158937408, -65622804, -129708016, - -29115584, -45341968, -18339510, 11834782, -42548092, -51500952, -82390360, -65483220, 58538256, -10402411, - -52417928, -55679956, 12607876, -74098920, -104576008, 17280800, -24346022, -22391812, -22477712, 20139102, - -62328564, 65622804, -38137164, 44581760, -31024696, -29759828, 725850, 36017596, -50820200, -48513804, - 26064010, -9148280, 71798968, -31419834, 41156524, 61924840, 29433410, -22499186, -10271414, -6418829, - 50785840, -17763984, 34106336, 68560560, -57535380, -100364792, -39517996, 34119220, 41811508, -47324096, - 77990160, -25037512, -28151364, -9356586, -8504035, -24079734, -63088776, -26620208, -65184720, -62395136, - -38656852, 46166604, 10928544, -11016591, 4269198, 71350144, 67010080, 4814659, -30906584, 12852690, - -6942815, 29435558, 9285719, -12695923, -29416232, -2555506, -5823976, -46737836, -12025908, 17931488, - 48717816, -21644488, 163209, 18657338, -27193586, -747324, -1769527, 938450, -14100378, 18339510, - 1221918, 4868346, -2121714, 2881923, }, +const Word16 CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS][2868]={ {-73, 41, -23, 10, -13, 3, -9, -2, 1, 20, -12, 9, -20, 15, -23, -31, -27, 7, -3, 4, 1, -14, 8, 14, -7, 11, -1, -4, -9, -1, 3, 8, -5, 11, -4, 7, 10, -7, -6, 1, -7, 2, 0, -3, 7, 1, -3, 28, -29, -5, -6, -7, -2, 0, -5, -4, 0, 1, -4, 2, -9, -3, -1, 5, -31, -3, 6, -3, -4, 3, 1, 2, 14, -7, -5, -8, -1, 4, 6, -7, -5, 8, -7, -10, -1, -3, 4, -3, -3, 2, 3, -6, 2, 2, -99, -67, + -27, -31, -17, -16, -15, -7, -19, -15, -6, -12, -1, -4, -10, -14, -15, -6, -9, -15, -2, -19, 0, -2, -3, -12, -2, -9, 0, -11, -7, 4, -8, 1, -19, -4, 10, 6, 0, -3, -5, 2, 2, 9, -5, -1, -3, -130, -7, 17, 0, 5, -1, 0, -11, 11, 4, 13, 9, 27, 20, 2, -11, -6, -3, 5, -4, -24, -22, -11, -3, 1, 3, 5, -1, 1, 3, -5, -1, -1, -15, 9, 4, -2, 0, -6, -8, 5, 2, -5, 5, 4, 6, -3, 146, 102, 20, 40, + 8, 13, 32, 17, 5, 19, 8, -9, -4, 7, 11, -20, -3, -12, 26, 13, 7, 13, 7, 7, 0, -1, -6, 10, 12, 11, 13, 16, 10, 23, 5, -1, 8, 2, -4, -2, -4, -5, 0, 11, 3, 2, 6, 217, 92, 28, 25, 18, 11, 4, 1, 24, 5, 13, 18, 9, -1, -7, 38, -3, -21, -12, 9, 1, 20, 7, 3, -4, -9, -3, -4, 9, -2, 4, 1, 1, -5, 7, 26, 17, 18, 16, 13, 7, 5, 3, 9, -7, 5, -3, 71, -75, -23, -32, -28, -15, + -5, 11, -11, 1, -28, 10, -10, -25, 7, -18, -24, -17, 23, 18, -8, 9, -16, 6, -29, 2, 5, -5, -7, 6, -23, -10, 3, -8, -7, -5, 2, 3, 11, 1, 20, -8, -6, -6, -10, -3, -5, 3, -9, -13, -258, -131, -47, -37, -40, -25, -35, -23, -38, -7, -17, -5, 2, -16, -4, 2, 0, -24, -16, -11, 2, -32, 3, -15, -28, 2, 0, 2, -1, -10, -8, 0, -2, -1, -11, 0, 3, 8, 3, -11, 6, -11, 8, -19, -13, 3, -11, 0, -4, -15, -152, 80, + 34, 12, 21, 4, 6, 18, 20, 11, 14, -10, -4, -16, 20, 4, 4, 27, 1, -18, 32, -21, 3, 26, -8, 7, 3, -1, -13, -3, 7, 7, 1, -5, 1, -9, 30, 2, 0, -12, -6, -8, -7, 16, 16, -4, 2, -1, 5, 1, -1, -3, 4, 2, -4, -4, 230, 98, 26, 53, 31, 13, 23, 20, 0, 14, 23, 5, 0, 12, 32, -11, -6, -25, 6, 29, 12, 1, -17, -9, -7, 31, 10, 16, 9, -15, -24, 27, 15, -16, -8, 26, 22, -1, 5, -3, 11, 7, + -3, 5, -9, -4, 14, -7, -6, 15, 13, 7, 2, 3, 3, 11, 272, 59, 45, 20, 21, 9, 21, 25, 40, 25, -8, 32, -6, 9, 7, 27, 40, 26, -7, 44, -9, -4, -23, 6, -7, 7, 12, -13, -19, -8, 3, -15, -5, 7, 10, -17, -15, -6, 6, 0, 4, -6, 0, -4, -6, 7, -10, 10, -11, -4, -8, 2, -3, 11, 5, -1, 31, -120, -39, -43, -28, 8, -7, -26, 15, 1, 18, -2, 2, -28, -20, -13, -21, 2, -22, -42, 8, 5, -20, -4, -18, 4, + 6, -3, -44, -12, 3, -5, 4, 12, -31, -9, -19, 10, -3, -1, 20, -20, -2, 7, -3, -6, 10, 5, -12, -15, -24, -3, -18, -15, -8, -10, -6, -3, -6, -9, -13, -7, -282, -96, -58, -15, -30, -1, -16, -21, -26, 32, 1, -13, -3, -47, -26, -23, 39, -32, -68, 6, 9, 5, -25, -7, 15, -31, -3, -32, -9, 18, -15, 4, 35, 4, -7, -9, 10, 11, 9, -10, -2, 11, 16, 9, 6, -29, 6, -1, -14, -6, 3, -4, -15, -10, -15, -5, 1, 2, -2, -11, + -2, -9, -187, 43, 3, -23, 34, -21, -16, 8, -32, -19, -7, 13, -25, 34, 1, -1, 16, 16, 25, -3, 35, 50, 36, 11, 31, -10, 20, -23, -23, -10, 3, 15, -12, -22, -12, -1, 13, -21, 15, 5, 12, -5, -19, -26, -31, 8, -16, 8, -32, -9, 15, -21, 3, -14, 10, -5, 10, 2, -6, -1, -13, 24, 10, 125, 207, 60, 54, 75, 61, 12, 48, 43, 23, 91, 22, 15, 39, 36, 19, 16, 10, 15, -12, 46, -12, 5, -14, 29, 2, -7, 24, 29, 10, 38, + -27, -44, -10, -2, 10, -3, 19, -18, 18, 38, 17, -34, -7, 18, 7, -16, 24, 10, 14, 16, 22, 7, -6, 5, -19, -5, 18, 17, -9, 0, 5, -8, 475, 49, -5, 30, -1, 41, 0, 11, 5, 43, 20, -17, 14, 21, 11, -26, -54, -24, -23, 10, -33, -5, -2, 9, 59, 33, 11, 24, -37, -2, -19, -7, -15, 23, -9, 38, -17, -6, -19, -8, -28, -12, 6, 6, -1, 1, -15, 9, 26, 3, -14, 17, -23, 10, 10, -2, -7, -4, -1, -4, 1, 16, -2, -138, + -165, -31, -9, -7, -26, -11, 50, 30, 11, 14, -22, -4, 38, -14, 61, -47, -13, 50, -10, -6, -29, 34, 38, 1, 37, -14, 16, -1, -21, -3, -16, -7, -11, 21, -15, -4, -23, 16, -12, 34, -54, 23, 19, -33, 1, -22, 6, -25, 8, 10, -31, -5, -11, -47, -27, -13, -23, -5, -4, 3, -19, 3, -37, 10, 5, -13, 5, -13, -3, -8, -4, -122, -70, -94, -48, -63, -7, 61, -64, 49, 31, -35, 69, -11, 14, -45, -5, -20, -3, 0, 17, 8, 36, 69, -19, 10, + -33, -35, -31, 7, 29, -10, -10, -9, -21, 24, -8, -2, -21, -17, -14, -22, -2, -1, -18, 12, -28, 10, -16, -3, 10, -21, 26, -45, -14, 4, -13, -24, 12, -7, -27, 44, 25, 6, 8, 9, 11, -22, -15, 6, -8, -15, 17, -339, -39, 27, -25, 56, 26, -68, 9, 12, -22, -57, -21, -14, 17, 4, -53, -20, -28, -51, -43, -100, -52, -58, -71, 57, -38, 21, 42, -30, -48, -18, -10, 12, 32, 19, -40, -49, 39, 25, 31, 44, 6, 0, 17, -2, -19, 11, -10, -6, + 26, 65, -21, -32, 15, -21, -2, 34, -64, -1, -21, -3, -1, 1, -7, 13, -19, 24, 26, 11, -1, 0, -22, 271, 237, 64, 144, 40, 83, -13, -13, 40, 54, 29, -94, -31, 59, 66, -24, -32, 11, 28, 31, 5, -49, -105, -39, 57, -5, 59, -14, -19, 12, -49, -28, -28, 54, -67, -46, 12, 11, -17, -2, -19, 20, 28, 24, 53, 31, 1, -44, 41, -4, 23, -21, 16, 32, -5, -9, -20, -24, 15, 3, 21, -21, 17, 42, -9, -23, 29, 38, -16, 17, 19, 15, 37, + 31, 329, 61, -64, 54, 35, -62, -14, 32, 2, 10, -5, -13, -69, -67, 30, 64, 65, -65, -132, 18, -3, -53, -68, -12, 33, -23, 49, 80, -31, -26, -11, -12, -16, -122, 63, 58, -3, 38, -38, -12, -34, 49, 52, 6, -14, -19, 29, 7, -18, -31, -1, 26, -40, -25, -22, 7, 12, -50, 25, 55, -46, -1, -12, -8, -1, 5, 2, -3, 9, -15, -30, -35, -16, -9, -19, -35, -26, -8, 24, -12, -90, -59, 8, 82, -82, 58, 27, 13, 17, 14, 53, 86, 2, 26, 9, + -74, -68, 66, 9, -77, 45, -66, 11, 80, -5, -22, 92, 14, 6, 7, 3, 8, -41, 24, 37, 61, -48, -24, 9, 8, -22, -44, 28, -16, 19, 10, -15, -14, 6, 27, -21, -9, -5, 16, -44, -21, 20, 4, -15, -8, 18, -19, 6, -13, -3, 15, 4, 9, -38, -27, 10, -354, -325, -73, -150, -132, -75, -23, -56, -68, 46, 12, -16, 77, 28, 93, 72, 21, 29, 34, -142, 67, -11, -30, -27, -84, -26, -29, 81, -27, -48, -24, 13, -11, -16, 18, -21, -14, 49, -49, -4, + -16, 89, 35, 36, -69, 5, 61, -32, 14, 0, 15, 0, 5, -5, 39, -5, -13, 28, -20, 16, 34, -16, -24, 10, 13, -25, -10, -47, -37, 12, -4, -8, -1, 6, -3, -30, -14, -222, 468, 293, 94, 28, 32, 33, 53, 46, 99, 198, 11, 22, 43, 40, 51, -37, 193, 137, -127, 94, 18, -21, 46, 116, -109, -31, 9, -91, -61, -65, 132, -6, -23, 17, 7, -40, -106, 73, 60, -18, 33, 75, -50, 41, 4, -20, 60, 51, 12, 7, 6, 41, 58, 0, -10, -1, -18, 40, + 9, -16, -20, -15, 31, 14, 70, -21, 25, -16, 17, -29, -10, 9, -16, -20, 2, 3, 9, 19, 507, -179, -175, 79, 20, -66, -59, -93, -92, -67, -57, 84, 20, 10, -48, -42, -149, 0, -59, -102, 85, 57, 18, 53, 15, -18, -33, -3, -28, 43, 73, -77, -28, 1, 40, 101, 30, 135, -69, 43, 113, 67, -56, -17, 13, -29, 49, -8, 3, 72, 40, 12, 7, -2, -30, -1, 9, -32, -18, 32, -12, -61, -8, 2, -10, -64, 17, 13, 17, 18, -13, -27, -8, -13, 53, 22, + -20, 15, -4, 11, 2, 163, 309, 121, 83, 97, -28, 31, -88, 154, 61, 148, 44, 56, -135, 169, 250, 32, 162, -32, -131, -130, 119, -38, 95, 18, 38, -72, 74, -25, -26, 121, 84, -63, 113, 13, 21, -22, -85, 24, 7, -47, -54, 51, 71, 24, -25, 34, 3, 75, -45, -6, -74, 9, 73, 50, -34, 0, 26, -66, -5, -45, -25, 14, 18, 45, -52, 23, -60, 6, 75, 27, 15, -47, 7, 6, -78, -20, 9, 14, 31, 13, -2, -361, -20, -82, 103, -78, 84, 3, 68, -9, + 58, -181, 53, -21, -65, 32, -79, 49, -80, -42, -177, 101, 212, -83, -28, -24, -35, 32, 42, 61, -157, 47, -98, -28, -6, 81, 30, -41, 17, 17, 57, 59, -99, -32, 14, -72, -64, -12, -46, 19, 55, 7, 9, -13, 51, 138, 78, -85, 17, 31, -42, 49, 12, -54, -6, 62, 6, 60, -81, -19, 48, 2, -27, -56, -5, -29, 46, -13, 28, -14, -6, -663, -249, 135, 49, -85, 94, 78, 124, -30, -54, 109, 5, -73, 148, -166, -216, -102, -116, 76, 109, -2, 28, 172, 76, -174, + -78, -107, 32, -161, -140, -9, 22, -62, -67, -98, -51, -90, -88, -33, 8, -32, -5, -61, -9, -46, -102, 222, 19, 53, -90, 59, -5, 30, -72, -3, -11, -60, -37, -27, 73, 53, 57, 35, 44, -10, 1, -52, -9, -2, -3, 68, 19, 40, 42, -31, -73, 32, -28, -13, 31, 88, -9, 348, 128, 280, 44, 19, -112, 43, 168, 63, 12, 113, -101, -45, 92, -69, 32, 162, 52, 22, 51, -29, 70, -53, 2, 28, 10, -41, -44, 18, 166, -53, 41, -152, -82, 71, 175, -134, 1, 85, + 21, 33, -111, -38, -96, -167, -44, -93, -99, 81, 32, 28, -58, -35, -11, -161, -15, 91, -64, 73, 149, 24, 99, 66, 6, -29, 86, -107, -5, -6, 68, 34, 63, 3, 70, -3, 15, 12, 74, 1, 1, 67, -36, 42, 15, 12, -21, 422, -93, -130, 21, 97, 79, 81, -23, 87, 27, -104, -208, 139, 37, 101, 60, -55, 25, -80, -136, 141, -88, -169, 18, -28, 21, -17, -17, -43, -67, 50, 114, -165, 161, -139, -181, 18, 49, -103, 81, -15, 52, -88, -44, 150, 62, 152, 41, 11, + 49, -1, 6, 80, -6, 14, -71, -49, -42, 56, -55, -47, 91, -3, 102, 15, -73, 121, 95, -8, 62, -62, -102, 39, -37, -74, 7, 65, 89, -33, 28, 43, -5, 18, -88, 34, 31, -44, 354, 431, -66, 3, -217, -25, -158, -118, -38, -81, 122, 0, 95, -203, 168, -128, 172, 6, 136, -49, 172, 57, -82, 36, -122, 81, -68, 194, 58, 127, -212, -121, -52, -107, -45, -73, 7, 262, -121, 132, 222, 31, 98, 1, -50, -104, -79, 11, -57, 134, -87, 61, 162, -21, -13, -13, 132, 143, + 45, -66, -58, -35, 56, -131, 25, -24, -36, 2, 87, 8, 123, 112, 22, 27, -54, -3, 126, -16, 7, 53, -67, 1, -77, -84, 12, 12, -17, -336, -301, 134, -40, 166, -94, -78, -113, -92, -43, -265, -97, 102, 143, 59, -185, -52, -89, 79, 268, 150, 65, 11, 20, 14, 47, 138, 11, 36, -79, 7, -113, 44, 55, 100, 13, -68, -34, 132, -61, 50, 27, 48, 169, -93, -142, 54, 120, 32, 120, 144, 70, 100, 39, 22, 79, 240, -133, 0, 40, 22, -103, -18, 80, -1, -93, 37, + 174, -141, 46, -134, 78, 53, 22, 5, -63, -63, 123, 66, 25, -37, 86, -12, 1, -59, 64, 24, -676, -236, -15, -67, -167, 102, 136, 230, 75, 144, -134, -283, 132, -67, 7, -152, 150, -90, -7, 139, -386, 37, 201, -375, -99, -133, 18, 14, 92, -104, 121, 17, -196, -101, 23, -25, -97, 85, 228, 49, 63, -37, -57, 133, 24, -67, -328, -52, 41, -167, 79, 67, 13, -129, -115, -137, 294, 78, -45, 57, -250, 29, -117, -135, 130, -23, 2, -85, -313, 42, 95, 55, -23, 185, 6, -78, + -12, -122, 192, 104, 54, -32, 13, 61, -57, 24, 26, 9, 717, 181, 185, 157, -46, 6, 738, 213, -61, 451, -253, 188, 40, 115, 184, -57, -129, 139, -25, -446, 114, 116, 94, 212, 134, 139, -126, 28, -121, -63, 132, 44, -260, -155, -218, -325, -50, 67, 159, 137, 118, 99, -48, 170, 95, -207, -79, 55, 156, 4, 34, 274, -49, -23, -71, -14, 140, -119, 2, -169, -150, -96, 176, 241, -70, 19, -47, -150, -102, 39, -174, -46, -46, -112, 308, 67, 103, 90, -9, 0, 53, 16, 97, 61, + 2, -10, 730, 432, 31, 274, 209, 60, 316, 90, -1, -98, -73, -206, -561, -41, 54, -191, -109, -21, 391, 128, -102, 4, 27, -56, 164, -27, -102, -69, -96, 62, -141, -343, 7, -179, -278, 55, 119, 175, 97, 155, -106, -296, -194, -266, 104, 250, 205, 134, 249, 7, 155, 339, -281, 51, -127, 2, 97, 101, 164, -14, -343, -264, 56, -74, -98, -65, -75, -234, 20, 159, -17, 122, -73, -6, -14, 61, 232, 165, 141, -134, 7, -80, 9, -215, 43, 36, 23, -4, -27, -62, 53, 3, 97, 178, + -365, 45, -279, 125, -533, -14, -177, -275, 492, 279, -176, -442, -112, -161, -387, 301, 16, -267, -99, 155, -253, -172, -133, -300, -115, -6, -242, -220, 309, -115, -96, -28, -69, 262, -291, -136, 61, -77, 0, -66, 151, -276, 98, -441, 45, -126, -176, 463, 48, -171, 88, 97, -374, 259, -63, -80, -28, 148, -62, 7, -179, 97, 121, 208, -180, -461, 322, -37, 133, 158, -96, 91, 238, -304, 16, -107, -33, -316, 108, -49, 13, -8, 42, -53, -48, 87, -80, 63, 19, -59, 36, 10, -696, -388, 87, -248, + 30, -179, -93, -263, -181, 132, 392, 411, 66, 290, -201, 507, 373, -297, -267, 84, 84, 429, 156, 274, -99, 110, -56, -46, -91, 400, 179, 383, 348, 67, -21, -170, 168, -20, -351, -234, -67, -182, -41, -187, -164, 111, -50, -118, 293, 345, -199, -67, 471, 192, -322, -317, -114, 119, -15, -59, -229, 193, 60, -75, 54, 53, -284, -125, 27, -107, -138, -149, 386, -302, -270, 111, 198, 282, -143, -46, 28, -130, 135, -21, 102, -85, -34, 26, 40, -49, -42, -4, -51, -265, -389, -334, -3, -263, -339, 87, + -29, -472, 337, 61, -29, 169, 519, 497, 214, -607, 226, 162, -596, -7, -288, -139, 307, -359, 209, 1, -62, -127, 62, -29, 103, -68, -319, 311, 146, 372, -39, -124, -179, 152, -162, 440, 92, 265, -342, 273, 11, 98, -222, 76, -263, -40, -270, 112, 187, -357, 15, -293, 138, 176, 170, -21, -506, 3, 134, -42, 225, -483, 124, -200, 65, -169, 35, 128, -54, 0, -53, -61, 20, -128, 165, 39, -4, -206, -19, 24, -15, 90, -89, 22, -9, -43, 729, 883, 370, 308, -509, 490, 713, -780, 94, 505, + 89, -930, -92, -505, 164, 184, -234, -92, 170, -427, -33, -168, -209, 83, -323, 348, 249, 450, -222, 73, -48, -184, 570, -12, -261, -124, 124, -123, -148, -175, 291, 107, 404, -29, 149, 528, -334, 70, -227, 419, -164, 196, 84, -17, -158, -299, -201, 84, 380, -357, 320, 377, 191, 441, -215, -176, 289, -50, -52, -408, -25, -337, 70, 426, 210, 107, 197, 116, -182, -83, -319, 361, 16, -144, 97, 32, -167, 88, -23, 103, -16, 157, 76, -337, -1159, -482, -834, -446, -359, 194, -537, -543, -264, -727, -240, 552, + -20, 24, -152, -127, -72, 52, -12, -487, -81, -95, 704, -90, 625, 52, -173, 165, 514, -26, 1, -207, -65, -218, 119, -92, -191, 95, -256, 205, 203, 41, 449, -205, 227, -192, 251, 173, 473, 66, -200, 258, -38, -160, 602, -45, -42, 350, 103, 471, -372, -357, -60, -155, -55, -579, -137, 201, -84, -249, -413, 28, 119, -204, -201, -355, -132, 150, 149, 314, -57, -29, -18, 105, 119, 21, 192, 55, 15, -27, -26, 142, -68, 140, 151, -7 }, + {-84, 46, -24, 28, -16, 23, -49, 2, -2, -5, 11, 24, -1, -2, -26, -10, 11, 7, -3, 10, -3, 4, -11, -8, -8, -2, 1, -6, -4, 13, -7, 8, -7, -1, -6, 7, 3, 6, 9, 12, 4, 3, -1, 1, 2, -2, 2, 30, -34, -5, -6, -8, 6, -17, 6, 0, 8, 7, -13, -5, 21, -2, 4, -4, 9, 19, 22, 4, 9, 0, -17, -1, 2, -4, 0, 9, -10, -13, 6, -6, -6, -9, 0, 10, 2, -3, -4, -4, 0, 2, -5, 2, -6, 4, -86, -61, + -30, -22, -17, -18, -6, -13, -4, -8, -21, 4, 11, -2, 6, -4, -11, -11, -17, -6, 4, 1, -9, 6, -11, -11, 7, 0, 0, 6, 7, 2, -3, -3, -5, 2, 1, -6, 3, -12, -5, -3, -1, -8, -2, -3, 0, -122, -16, 9, 2, 9, 1, -7, 5, -5, -5, -11, -9, 4, -3, 8, -7, 0, -7, 2, 13, -3, 10, 0, -8, -2, 12, 5, 8, 8, -11, 8, -4, -1, -6, -3, 4, 5, 3, -3, 9, 8, 5, -3, -6, 1, -4, 1, 144, 114, 27, 51, + 13, 39, 28, 8, 28, 11, 21, 9, -7, 21, 15, -6, -2, -40, -4, 2, 24, 3, 1, 12, 1, 11, 11, 2, -1, 4, 17, 13, 11, -1, -4, 1, 8, -3, 0, 9, 3, -4, 0, 2, -8, 11, -6, 253, 92, 45, 26, 17, 16, 16, 25, 7, 41, 6, 3, 19, -11, 5, -5, -4, -8, 28, 14, -1, 20, -13, -4, -4, 31, -2, 11, 3, 15, 4, -5, 9, 10, -4, 3, 5, 2, 7, -3, 8, 6, -19, 4, 3, 3, 15, 98, -72, -24, -34, -20, -21, + 14, -12, -29, -8, -39, -10, -17, -39, -9, 8, -23, -9, 4, -28, -1, 30, 8, 3, -14, -1, 11, -1, -12, -15, 15, -2, -18, 1, -7, 21, 0, 9, -3, 18, -12, 7, 3, 3, 1, 4, 0, -8, 12, 8, -267, -150, -32, -37, -27, -32, -47, -4, 0, -13, 11, -12, 1, -1, -16, -16, -27, -9, 25, -24, -4, 24, 14, -3, 8, -3, -27, -13, -22, -7, 0, -5, 11, -22, -19, -1, -23, -17, -17, -18, 18, -6, -24, -7, 5, 7, -9, -12, -6, -22, -165, 96, + 33, 17, 14, 16, 5, -15, 3, -8, -5, 31, 16, 27, 24, 29, -24, 13, 27, 7, 23, -27, 4, -5, -4, -9, 9, -2, -1, 28, -29, -6, 9, 17, -9, 15, -12, -15, 19, -8, -3, -4, 6, 0, 8, -8, -6, -7, -4, -6, 14, 4, 3, -7, -13, 3, 244, 98, 22, 54, 44, 7, 20, 51, 25, -2, 12, 6, -7, 14, 46, 10, 55, 25, -43, 7, 3, 8, 41, 21, 17, -4, -5, -6, -5, 5, -7, 12, 5, 17, -2, -5, 8, 14, 9, -2, -18, -9, + -9, 17, 14, 19, 12, 2, 4, 16, 15, 10, 3, 2, 10, 8, 272, 77, 35, 42, 8, 40, -6, -17, 0, 10, 5, -2, 9, 41, -5, -27, -17, 19, 6, 23, 38, 32, -1, 21, -23, 2, -18, 24, 15, -29, 17, -14, 3, -12, 18, -11, 22, 16, 15, 27, 10, -1, -6, -1, 5, 30, 0, 0, 3, 14, 11, 1, -3, -5, -15, -3, 38, -116, -46, -20, -25, -13, -9, 1, 18, -18, -30, 28, -36, -37, -6, -9, 17, -11, 0, -36, -20, -43, -45, -52, -6, 11, + -35, -11, 6, 3, 3, -6, -34, -23, 16, 5, -7, 32, -21, -11, 9, 19, 18, -4, -4, 7, 6, -23, 3, -14, -5, 1, -8, 0, 16, 2, -2, 3, -15, 9, 14, -4, -295, -92, -56, -23, -40, -32, -10, -22, -10, -30, -42, -29, -10, -61, -15, -24, -37, -4, 6, 20, -22, -30, -12, 25, 32, 40, 21, -1, -20, -9, 0, -24, 10, 17, 20, -14, -12, -11, -6, -4, -9, 16, -5, 11, -21, -35, -15, -1, 17, -30, 10, -14, 14, -15, 8, -12, -1, -8, -1, 5, + 11, -7, -169, 45, 13, 0, 30, -28, 8, -66, -21, 23, 16, 42, -3, 46, -27, -7, 22, -40, -15, -24, 45, -3, -37, 19, 36, -32, -24, -29, 8, -7, 15, -11, -9, -8, -18, 25, -21, 5, 16, -2, 19, -11, 42, 6, -5, -15, -15, 0, -17, -21, -13, 3, 14, -2, 4, -18, -18, -26, -10, -9, -7, 7, 10, 146, 210, 72, 73, 99, 72, -10, 15, -8, 14, 12, 19, 13, 37, 14, 23, 7, 72, 16, 36, 20, 19, 56, 14, 70, 37, -14, 51, 13, 26, 49, + 11, 29, -14, -5, 15, 22, -29, 26, -16, -33, -18, 27, 42, 31, -4, 10, 11, 15, 23, 12, 26, 15, -22, -1, 19, 23, 9, 8, 6, -23, -8, -14, 506, 37, -24, 39, -26, 56, 19, 59, -28, 5, 2, 35, -62, 11, 42, -10, -8, 52, 84, -36, -18, 9, 42, -19, 28, 0, -25, -23, -20, 17, 27, 28, -19, 31, -19, 30, 30, -8, -17, 10, -28, -43, 11, -30, 14, 2, 6, 17, 2, 21, 3, -29, 13, -8, 16, -22, -2, 3, 17, -12, -34, -7, -14, -172, + -167, -38, 13, -7, -25, -27, -38, -10, 27, -9, -10, -39, 40, -2, -34, -29, 70, -64, 6, 46, -6, 8, -62, 19, -27, 15, -43, -28, 7, 11, -20, -23, 2, -9, 3, -26, -15, 27, -3, -13, -8, 35, 15, -20, -31, -27, 9, -4, -13, 3, 5, -15, 41, 22, -5, -3, -11, 5, -12, -12, -13, -3, -24, -19, -32, 7, -34, -1, -9, -8, -2, -68, -57, -70, -49, -37, -24, 5, 0, -18, -6, 16, 61, -53, 27, -18, -32, 42, -3, 8, 56, 7, 24, -36, -7, -102, + -11, 19, 13, 8, 11, 14, -22, -31, 24, -3, 23, 10, -26, 21, -1, -73, -58, -11, -55, 7, 18, -4, -14, -7, 3, -17, -4, -4, -9, 17, 5, 5, -9, -8, 28, 7, -17, 19, -4, -13, -28, 0, -15, -5, 21, 16, 23, -329, -75, 5, -65, 26, 7, 79, -37, 5, -22, 53, -108, -103, 44, -50, 78, 28, -63, -110, -3, -31, -53, -22, 13, 18, -26, 94, 5, -9, -39, 32, 36, 38, 41, -5, -24, -9, 24, -2, 29, -28, -11, -9, 34, 27, -30, 39, -22, -27, + 3, -12, -26, 26, -30, -4, 8, -7, -12, 7, 25, -16, 24, -20, 16, -11, -13, -8, 5, 31, 6, 29, -19, 301, 265, 55, 71, -14, 87, 69, 87, -4, 35, 21, -82, -69, 38, 8, -59, -62, -34, 4, 35, 10, 83, 76, 33, -17, -18, 50, 47, 4, 41, -13, 53, 3, -11, 73, 38, 60, 39, 13, 42, 21, 15, 39, -21, 8, 52, 0, -33, 31, 31, 22, -23, 0, 31, 46, -22, 55, 63, -11, -33, 6, 15, 10, 28, 0, 10, 21, -15, 2, -21, -5, -29, -17, + -3, 366, 30, -10, 26, 18, -60, 16, 16, 0, 39, 56, 84, -37, -38, -59, -48, 54, -4, 78, -19, -19, 32, 68, 27, -68, 54, -20, 43, -22, 34, -41, 25, -3, 39, 5, 23, 12, -69, -38, -6, -14, -6, -21, 34, 13, 71, -11, -48, -28, -5, 4, -54, 18, -18, -2, -5, -32, 29, 55, -17, 28, 7, -31, -3, -29, -24, 5, -43, -31, 18, -2, 10, 30, -41, 49, 5, -20, -49, 14, -18, 106, -25, -101, -68, -91, 84, -67, 19, 103, -5, -104, 7, -109, 91, -32, + 91, 1, -35, 78, 3, 16, -59, -74, -12, 26, 16, -14, -34, 35, -11, 26, 40, 48, 22, 27, -98, 8, -22, -33, 13, 49, -41, -75, -33, 22, 9, -66, -27, 31, 45, -39, -26, -30, 46, 61, 12, -20, 7, 44, -21, -1, -29, 31, -36, -4, 43, 26, -12, -6, -1, -14, -369, -374, -61, -183, -114, -65, -102, -12, 77, -168, 61, -34, 56, 10, 34, -70, 18, -9, -36, -154, -31, -80, -98, -10, 25, 5, -33, 21, -32, -9, 82, -2, -27, 5, 53, 72, 48, 0, 38, 44, + -4, 0, -80, 29, -66, 12, 64, -44, -80, 23, -45, -43, 9, -1, -38, 18, -9, 86, 48, 26, 11, 32, -3, 9, -34, -61, -10, 5, -44, -30, -24, -20, -25, 14, -13, -4, -27, -219, 407, 320, 19, 66, 25, 72, 108, 25, 105, 20, -111, 74, 88, 27, 26, 67, 87, -87, 72, -46, 63, 10, -54, 11, 72, 42, -86, 42, -36, 125, -11, 30, -19, -80, 81, 81, 38, 21, -4, 29, 86, 20, 61, 8, 43, 24, -6, 47, -57, -88, -39, -67, -57, -29, -58, 79, 56, 7, + -14, -28, -9, -2, 1, 4, 11, 16, 9, -2, -21, -18, -3, -2, -8, 9, -9, 47, -11, 62, 546, -214, -116, 20, -1, -27, -152, -65, 39, -7, -22, -30, 24, -125, -35, 65, 122, 66, 55, -39, -37, -72, 84, -118, -20, 29, -78, 26, 34, 95, -145, -12, -2, -30, 39, -135, -70, 148, 98, 20, -25, 89, -26, -11, 17, 69, 40, -43, 9, -25, 57, -91, -41, -55, -58, 111, 31, 14, -49, -4, -16, -19, -51, 8, -49, -2, 17, 43, -74, -51, -65, -20, 35, 6, 47, -6, + -61, -6, -27, 28, -3, 162, 373, 61, 143, 129, 124, 41, 92, 57, -27, -76, -48, -22, 106, -90, -100, -7, -4, -41, -77, 227, 213, 160, 8, -91, 16, 15, -45, 52, 34, 91, 11, 37, -4, -63, 104, 86, 62, -15, -82, 5, -6, -23, -168, 121, -76, 140, 8, 75, -16, 83, 127, 25, -57, -4, 23, -42, 23, -16, -53, -29, 18, -13, 53, 19, -89, 6, -12, -96, -22, 20, -36, 11, 82, 34, -4, -28, -21, 2, 36, -10, 39, -392, -52, -244, 3, 43, -83, -143, -165, -157, + -93, -128, -31, -9, -33, 41, -25, 8, 100, 45, -10, 238, -52, 48, -35, 20, 34, 13, -13, 35, 111, 33, 39, 12, 44, 94, 129, 41, 157, -42, -135, 137, -43, -29, -28, 77, 120, 91, -2, -31, -69, -175, 108, 123, 87, -105, 63, 16, -11, 99, 17, 67, -55, 32, -69, -7, 60, -18, 45, -10, -25, -25, -84, 8, 6, -1, 16, -19, -104, 8, 5, -686, -308, 140, -27, -23, 24, -86, -76, -26, -34, -120, 85, 9, 179, -100, -86, -147, -82, -151, 12, 55, -226, 145, 125, -18, + 25, 95, 14, 83, -171, -172, -96, -113, -87, 279, 91, -62, -100, -143, 67, 38, -68, 55, 55, -101, 9, 22, 79, -94, 229, -101, -81, 36, -25, -2, -70, -26, 7, 146, -46, 210, 44, 13, 23, 56, -64, -23, -84, -67, -64, -1, 113, -74, -55, -32, -43, -40, -5, -27, -40, -35, 108, 347, 178, 111, 75, -122, 12, -98, 154, -16, -21, 53, 33, 36, -5, 55, 19, 58, -48, 151, 20, -13, 452, 25, -35, -115, 67, -107, 101, 244, -19, 60, 60, -125, -141, 5, 3, 107, -70, 4, + -8, 79, 81, 136, 51, 47, 56, 6, 89, 42, -165, 36, -85, -211, -19, 60, 1, 18, -28, 4, -7, -1, 26, 5, 96, -57, -9, 19, 20, 3, -37, 67, 113, 111, 23, -23, -12, 40, -6, -14, -3, 22, 52, -9, -20, -37, -23, 508, -148, -56, -138, 256, 94, 21, 52, -37, -60, 90, 8, -89, 23, -117, -89, 6, -119, 16, 39, -88, -154, 15, 8, 104, 171, 119, -81, -1, 106, 194, -204, 77, -38, -3, -93, -131, 11, 117, 34, 52, 74, -8, 49, -12, 35, 75, -136, -95, + 211, -17, -7, -48, 84, 273, 68, 41, 89, -72, -81, 0, -61, -157, 101, 13, -78, 43, 23, -45, -74, 100, -35, -119, 56, 55, 84, -83, 8, 36, -15, -32, 126, -10, 23, -56, -7, -2, 434, 411, -134, 112, 34, 87, 221, -27, -115, -40, 427, -240, -46, -119, -95, -194, 214, -61, -290, -216, -265, -101, 234, -28, 111, -41, -119, 105, 31, 133, -127, 118, 94, 49, 55, -208, 60, -173, 147, 312, 91, 94, -198, 279, 75, -28, -43, -56, 88, 140, 34, -32, -8, 38, -67, -48, -64, -49, + -5, 103, -68, 153, 55, 94, -31, -218, -146, 56, 15, -65, 82, -4, -7, 45, -31, 65, -11, -7, 31, -37, -7, -41, -25, -51, 34, 3, 11, -408, -244, 59, 32, -2, -180, 106, 60, -109, -294, 240, 59, 89, 135, 80, -39, 43, -75, 199, -166, -288, -10, -15, -137, -313, 9, -65, -164, -91, -52, 69, 11, 113, 229, -99, -190, 58, -23, 1, 94, -136, -123, -18, 111, -147, 121, -43, 233, -35, -73, -29, 1, 45, -267, 37, -231, 235, 1, 147, 88, -92, -12, -121, 58, -14, 46, 43, + -159, -25, -153, -69, 68, -48, -94, 44, -1, -160, -78, 16, 5, -67, 69, -37, -41, 33, -95, 49, -565, -261, -95, -64, -17, 59, -197, -142, 52, -166, 52, -184, -57, -178, -214, 226, 94, 34, -13, -188, -317, 158, -416, 150, 7, -134, 22, -83, 32, 289, -145, -16, -312, 245, -72, 111, -110, -38, -25, -13, 146, 49, 304, 364, -38, 5, -120, 13, -47, 56, 116, 14, 264, 74, -98, 41, 55, 1, -18, 7, 201, -150, -301, -125, 5, 70, 53, 151, -15, 64, -76, -122, -168, -135, 12, -44, + 82, 21, -46, -22, 145, -3, 81, -36, 28, -36, -33, -55, 721, 322, 222, 92, -82, -131, -225, 125, 216, 89, -101, 255, 143, 255, 17, -184, -72, 382, -399, -82, 264, -156, -88, 617, -77, 176, 560, -90, -37, -16, 70, -31, 243, 156, 200, -142, -331, 132, -131, 159, -62, 58, 236, 137, 14, 104, 48, 100, 228, 128, -24, 222, 93, 31, 53, 408, 245, 0, 222, -98, 281, -70, 62, -80, 34, 161, -89, -7, -16, 56, 6, -106, 4, -91, -162, 27, -215, 84, 132, -54, -92, -62, 116, 34, + 6, -48, 930, 420, -188, 81, 481, 11, 347, -102, 137, 290, -218, 26, 506, 454, 370, 131, 317, 53, 278, 97, 84, -174, -204, -291, -575, 183, 7, -156, -55, 199, -131, -20, 22, 112, -510, -82, 370, 285, -103, 188, 161, 104, -63, -119, -51, -80, -52, -189, -160, 131, -318, 105, 261, -77, -186, -290, 272, -9, -137, -90, -63, -99, 57, -46, -101, 103, 423, -211, -127, 54, -82, 98, 4, 218, 42, -21, -18, -227, -107, -35, 19, 17, 81, 50, 9, 36, 42, 134, 11, 4, -87, 44, 65, 27, + -368, -103, -442, -96, -442, 212, -421, 227, -73, -244, -74, -114, 515, 80, -376, 7, -245, -193, 254, -286, -265, -299, 449, -60, 296, -457, -244, 182, -213, 173, 497, 326, 307, 53, -53, -241, -343, -18, 76, -318, 7, -188, 92, 141, -364, -309, -571, -89, 39, -245, -353, 348, 18, 357, 350, -43, -50, -142, 202, 175, 25, 86, -29, -18, 171, -45, -200, -154, -252, -212, -78, -10, -35, -319, -185, 104, 24, -113, 137, -28, 7, 215, 178, 115, 45, 138, 20, 4, 64, 45, -30, 13, -628, -108, 55, -58, + 1, 170, -139, 151, 143, -99, 194, -269, 338, 232, 12, -248, 20, 165, -734, 152, 299, -526, 216, -269, -386, -351, 178, -88, -548, 294, 157, -332, -554, 112, 65, -175, -40, -285, 268, 221, 390, -312, 51, -415, -157, 72, -265, 110, -33, -208, -313, -338, 494, -333, -158, -125, 21, 227, 135, 166, 2, 194, -65, 31, -82, -205, 40, 439, 68, 10, -2, -283, 184, 295, 308, 62, 23, -14, -25, 45, 6, -141, -3, 28, 21, 2, 3, 109, -38, 14, -28, 6, 190, -417, -222, -440, 125, -78, 175, -120, + 83, 144, -148, -252, 376, -99, -167, 436, -90, -102, 499, -289, 73, 122, 39, -440, 1, -64, -264, 151, -208, 280, -49, 311, -341, 212, -603, 7, -329, 367, -57, 50, -63, -335, -25, 292, 770, 57, 48, 164, 263, -45, -74, 24, -13, 677, -62, 104, 272, -264, -451, 1, -477, -59, -245, -175, -96, -201, 113, 168, -278, 350, 291, -42, -73, -287, 200, 71, 189, -161, 78, -31, 143, 16, 138, -71, 101, -17, 2, 34, 157, 75, 48, -52, 3, 14, 725, 790, 5, -242, -195, 662, -436, -496, 516, -469, + 301, 92, 417, 385, 260, 42, -264, -228, 542, -231, -24, 132, 461, 668, -21, 456, -375, -391, 43, -144, 215, 136, -334, 45, 211, 549, 187, 225, 206, 246, 63, -20, 348, 61, 279, 447, 93, -184, -157, 403, 105, 826, 192, 325, -338, -530, -52, -619, -397, -141, -212, 23, -32, 4, 8, -463, -384, -203, -396, 144, 157, -120, -31, -368, -58, 108, -105, -32, 37, -232, 97, -72, 27, 41, 1, 15, 50, -56, 8, 54, -2, 13, 16, -345, -1213, -500, -990, -222, -346, -140, 90, -325, -394, -629, -500, 447, + -80, -400, -426, 96, -566, -799, 132, -186, -171, -172, 153, -476, 500, -291, 340, -237, -228, 5, 274, -388, -371, 198, -71, 547, -241, 313, 472, 224, -173, -79, -50, 387, -137, 260, 523, -440, -768, -303, 259, 318, -362, 594, -192, -216, -73, -66, -185, -482, -204, -498, -477, -296, 351, 82, -86, 31, 543, 510, 35, -237, 97, -54, 223, 70, -99, -226, -21, -46, -359, -93, 135, 370, -167, 0, 141, -209, -8, -15, 5, -109, 138, 7, 35, -18 } }; -const Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS][2870] ={ -{ - -118112, - -34360, -64425, -38655, -98784, -17180, -158914, -36507, -513249, 352187, -34360, - 354335, -77309, 156766, 947040, -105227, -1127429, -1114544, -369367, -685047, 90194, - -554051, -1509681, 429497, -380105, -268435, 399432, 128849, -508954, -790274, -1030792, - 139586, -620623, -375810, 216896, -1082332, 966368, 1013612, -581968, -68719, -373662, - -1009317, 90194, -908386, -719407, 700080, -466004, 1050120, 4378719, -1900523, 1943473, - -820339, 695785, -25770, 1017907, -438087, 255551, 435939, 523986, 558346, 966368, - -234076, 115964, 1765232, 1322850, -3468186, 693637, -442382, 178241, -1178969, 783832, - -1486059, 1488206, 1234803, 612033, -188979, -463856, -543313, 1058710, 970663, -429497, - 223338, 1823214, -676457, -32212, -616328, 219043, 283468, -45097, -511101, 858993, - 133144, -257698, 650688, 17585744, -1269163, 2450279, -42950, 777389, 339302, 592706, - 403727, 1683627, -968515, 710817, -343597, 292058, 925565, 1440962, 575526, 279173, - -691490, 1312113, -949188, 500364, -440234, -1382980, 143881, 481036, 49392, -431644, - 122407, -483184, 908386, -1866163, 435939, -431644, 493921, -19327, -2615635, -908386, - 266288, 414464, 302795, -453119, -590558, -511101, 371515, 1013612, -418759, 448824, - 10608569, -12532715, 2508261, -3008625, 1655710, -1947768, 1531156, -2665027, -794569, -1642825, - -294205, -1367947, 126702, 2467459, 3588445, 1505386, 805306, 70867, 1133871, 2568391, - 1870458, -1161789, -1395864, -1868311, -882616, -1075889, 109522, -169651, -154619, 57982, - 556198, -865436, 1118839, -1140314, -1516124, 564788, -10737, 118112, 332860, -1054415, - -1191853, 371515, -719407, -981400, -173946, 143881, 783832, -24303072, 4844723, -1224066, - 616328, 523986, -2035815, -916976, 1932735, -315680, 165356, 2168959, 702227, -828929, - -1511829, 1511829, 130997, -1833951, -2626373, -3801046, 1226213, -1690070, 390842, -547608, - 710817, -388695, 268435, -1973538, -1947768, -1215476, -519691, -1228361, 367220, -594853, - 693637, 2280628, 392990, 397284, 1509681, 416612, 350040, -49392, -296353, -1505386, - -356482, 350040, -277025, -70867, -29053306, 10872710, -2712272, 3491809, -1705102, 2518998, - -1389422, -392990, -2476049, 1906966, -2931315, 1954210, -500364, 2733747, -3710852, 966368, - 3461744, 1022202, -2914135, -1022202, -1752347, -719407, 1108102, 575526, 820339, -446677, - -989990, -1393717, -1367947, -103079, -1569811, -261993, -1458141, -1020055, -4056597, -1120987, - -566936, 238371, 96637, 1425929, 605590, 1404454, -141734, 1632088, 384400, 163209, - 403727, 3627100, 12652974, -3489661, 5613523, -3405909, 1468879, -3674345, 2892661, -264141, - 3152506, -251256, -315680, 3098819, -511101, -429497, 2710124, -1322850, -2486786, -3964255, - 3521873, -285615, 2409477, 281320, 1711545, 828929, -2299955, 979253, 934155, -154619, - 1187559, 1814624, -2287070, 302795, -68719, -193274, -1312113, -590558, -1284195, 350040, - -266288, 992137, 2965675, 115964, 1503239, -266288, 289910, -317828, 455267, 1200443, - -545461, 38201588, -9421011, 3631395, -1823214, 3214783, -1404454, 2467459, -1372242, 848256, - -3717294, 1726577, -3549791, 2718714, -1084479, 803159, -1032940, 3828963, 526134, 964220, - -1836099, 2501819, -223338, -1153199, 2130304, -1649268, -2561948, 66572, -798864, 1224066, - -10737, -382252, -835371, 373662, -83752, 483184, -1763084, 416612, -779537, 2753074, - -513249, 1318555, 249108, 1108102, 2061584, -1415192, 111669, 478889, -702227, 1619203, - -332860, 3219078, -19814832, 7825431, -6113886, 3607773, -3045132, 1047972, -4013647, 2607045, - -1604170, 3642132, -405874, 1589138, -3201898, -1350767, -208306, -1163936, -1086627, 4200478, - -3096672, 534723, 1956358, -3837553, 987843, 1357210, -962073, 1320703, 442382, 760209, - -2443837, -214748, -783832, 1507534, -1217623, 824634, -2884071, -581968, 2110977, 1020055, - 670015, -734439, -433792, -2201171, -2340757, 1273458, 474594, -103079, -343597, -204011, - 208306, 206158, -489626, -478889, 289910, 307090, -803159, -32031866, 10492605, -5671505, - 1455994, -528281, 1791001, -2398739, 2594160, -1058710, -901943, -313533, 1876901, -1009317, - -1498944, 1099512, 3609920, -493921, 152471, -6045167, 521839, 100932, 2950643, -955630, - -453119, -4621385, -1582696, 60130, 88047, 1610613, 2209761, -3491809, -3204046, 2074469, - 521839, -3599183, -2763812, 1357210, 783832, -210453, -105227, -1380832, 1415192, -433792, - 517544, 186831, -1887638, -796716, 1009317, -2914135, -1458141, -581968, 616328, -584116, - 51540, -1455994, -126702, -31976032, 14151917, -7818988, 5939940, -5454609, 2705830, -6208375, - 1432372, -4048007, 6390912, -3234110, 2254858, -395137, 47245, -2929168, -835371, -1211181, - 5785321, -1099512, 2952790, 4687957, 2690797, 693637, -624918, 1125281, -1024350, 2624225, - 2536178, 360777, -1275605, 446677, 485331, -1748052, -785979, 1327145, 1906966, -1438814, - -1408749, -1458141, 96637, -605590, 816044, -1406602, 1005022, -2211908, 652835, -1213328, - -81604, 225486, -878321, -1202591, -1529008, -1434519, -1902671, 238371, -1735167, 11877732, - 12343736, -4559108, 4112431, -5005785, 775242, 1524713, 137439, -1999307, 2306398, 592706, - 4894115, 2555506, 5525476, -839666, 3262028, -880468, 2087354, 2911988, -384400, -4024384, - 3850438, -414464, 1623498, -895501, 2147, 556198, 4707284, 706522, -2544768, -858993, - 627065, -1400159, 3551938, 1520418, -545461, -914828, -1999307, 1586990, -1958505, 2025077, - 2126009, -1556926, 1224066, 1105954, 573378, -150324, 3448859, 2134599, 2527588, -90194, - 315680, 1136019, -723702, -277025, -225486, -736587, -8590, 188979, 324270, -605590, - -1417339, -1483911, 36105644, -12891344, 4477504, -6025839, 4110284, -3968550, 5282810, -1812476, - 246961, -3962107, 7930657, -1140314, 7146826, 446677, 1224066, -4788889, 1709397, 7185481, - -2209761, -6047314, 893353, 257698, 2804614, -4359392, 3573413, -34360, 313533, -377957, - -4209068, -1234803, 702227, -5057324, 839666, 2061584, 1692217, -1419487, -401579, -186831, - 2372970, 717260, -403727, -1035087, 1848983, 1277753, 4591320, 1187559, -682900, 2566243, - 1028645, -261993, 848256, 1947768, 1284195, 270583, 309238, -1488206, 322123, -143881, - 1902671, -195421, 753767, -206158, 676457, 12088185, -17463338, 10462540, -7765301, 3266323, - 1181116, -792421, -659278, 2076617, -4395899, -2796024, -2276333, -1773822, -6010807, 3045132, - -5583458, -225486, -4466766, 1640678, -3362960, -2649995, -1337882, 5078799, 712965, 4941360, - 2596308, 3386582, 4891968, 253403, -620623, -749472, 1378685, 3758097, -313533, -274878, - -2510409, 1906966, -304943, -1501091, 1393717, 1159641, 3925600, 1602023, 1851131, -2780991, - -1292785, -163209, -515396, 1913408, -5617817, 1213328, -1380832, -949188, -1741609, -1973538, - -665720, -1952063, 794569, -1365800, -223338, -2965675, -2909840, -2147, -37061272, -8098161, - 1698660, -7030862, -2905546, 298500, -223338, -5991480, 1713692, -5967857, 171799, 4799626, - -897648, -798864, 2632815, 1726577, 2680060, 156766, 3242700, -1799591, 916976, 3764539, - -259846, -236223, -2471754, 3584150, -2780991, -1524713, 934155, 1451699, 2731599, 8443906, - -2317135, -1372242, -3644280, 208306, -2686502, 642098, -1075889, -3970697, -253403, 5085242, - 1425929, -3423089, -1709397, 1690070, -2083059, -2594160, 478889, -1221918, 292058, 541166, - 3193308, 461709, 1563368, 846109, -2701535, -1374390, 1681480, 1586990, -1093069, 949188, - -221191, -45427868, 37495064, -13106093, 11141145, -8207683, 6274947, -2381559, 3996467, -4355097, - 2682207, 3128884, 4524748, -2944200, 5478231, 2710124, 9320079, -1458141, 785979, -4932770, - 1251983, -1728724, -3081639, -3820374, -4395899, -4050154, 6043019, -272730, 7256347, 1883343, - 1331440, -122407, 925565, -3201898, 515396, -1168231, 1511829, 4299263, 770947, 1417339, - 255551, 448824, -3266323, -1788854, -124554, -249108, 438087, -996432, -3008625, 73014, - 3231963, -1039382, 953483, 940598, -2667175, 1833951, 790274, 1009317, -547608, 304943, - -289910, -833224, 238371, 2903398, 26472030, -4071629, -8540542, -2967823, -1799591, -1372242, - -7524783, -3951370, 2098092, 1290638, 2147484, 2677912, -5057324, 2044404, -992137, 1818919, - 8111046, -8196945, 2834679, 2843268, 2207613, -2110977, -4743792, 3704409, 1103807, 2654290, - 4999342, 15032, 6891275, 607738, 3204046, 279173, 2175401, -1881196, 2607045, 1889786, - 2488934, -947040, 828929, -184684, 3191161, 3944928, -5826123, 7874823, 672162, 2209761, - 350040, 1382980, 1531156, -1644973, 4720169, 2559801, 188979, 4331475, 1844689, -2360085, - -191126, -1574106, -1705102, -1275605, 792421, -319975, 274878, -88047, -4810364, 2497524, - -1900523, 697932, -639950, -264141, -1185411, -667867, 20980916, 1836099, 4275640, -5426691, - -1026497, -13481902, 3225521, -644245, -9161165, 7685844, -4239133, 274878, 5641440, 2538326, - 4236985, -3240553, 1872606, -4249870, 85899, -3635690, 1363652, -5525476, 7926362, 5718749, - 4681515, 5454609, 1217623, -1801739, -3420942, 1544041, 4355097, 12885, 2969970, -2141041, - 607738, 2884071, 2040110, 2596308, 188979, 934155, -322123, -1846836, 1844689, -1277753, - 865436, 760209, -1887638, 2581275, -3489661, 3128884, -1634235, 2214056, 3375844, -4110284, - 416612, 483184, -1677185, -3236258, 2295660, -5252745, -4060892, 2529736, 1067299, 1183264, - 1022202, 3281355, 3152506, -1133871, 444529, 1919850, -755914, -6442, 33094870, -27511414, - 9335111, -6846178, 2424509, 8598525, 6992207, -4610648, 8383776, 4722317, 5065914, -3468186, - 2360085, -1769527, 9953587, 2768107, 2815351, 3854733, 4215511, 2671470, 2881923, -8173323, - 1314260, -14774687, -5138929, -1370095, -8463233, 2128156, 4541928, -3191161, -4589173, -5398774, - -5184026, -2765959, 2980707, 2351495, -7524783, -8705899, -667867, -4440996, 2377265, 1934883, - 831076, -622770, 4121021, -2162516, 210453, -573378, -1844689, -5592048, 4335770, 7359427, - -994285, -921271, 3461744, -5186173, 6298570, 1625645, -3191161, -118112, -2963528, -1247688, - -749472, -2119566, -566936, -1432372, -4340065, 1131724, 1559073, 1466731, 1546188, 498216, - -51217484, 5083094, -4571993, 1879048, 5218386, 3745212, 10445360, -4297115, -365072, 839666, - 12504797, 4340065, -9801115, -6405944, 5514738, 7393786, -1859721, -2800319, -208306, 3408057, - 7642895, 7763154, -115964, -13915694, -4028679, -1443109, -1675037, 8061654, -3712999, 4702989, - 457414, -893353, -7221988, 560493, 5740224, -9242770, -5418101, -2183991, -1623498, -4391604, - -3665755, -8643622, -1602023, -5866926, 47245, 1249836, 6210523, -4258460, -2804614, 517544, - -635655, 951335, -5375152, 2085207, 2022930, 650688, 289910, -4075924, -3693672, -2070174, - -1170379, -341450, -6944962, 1387274, 2005750, -3015067, -6386617, 2523293, -324270, -3219078, - -646393, -1509681, -1080184, 4005057, -30081950, 31924492, -4561256, 2014340, 7520488, 9019431, - -6796786, 4342212, 1715839, 5570573, 3773129, 7864085, 4443144, -5325760, -8851928, 1258425, - 9365176, 18708878, -4524748, -6354404, 4896263, 3038689, -3579855, -9217000, -1881196, -1853278, - -8345122, 7303592, 8693014, 137439, 2016487, -171799, 6833293, -5336497, -16544214, 6975027, - -1992865, 5534066, 2643552, 234076, -4103841, -6356552, 4395899, 5211943, 3796751, -738734, - -347892, 5731634, 3208341, 1767379, -3423089, 4825396, 4020090, -667867, -1260573, -2796024, - 3296388, 107374, -8169028, 6717329, 4009352, -1520418, 1917703, -1015760, 210453, -154619, - 1984275, 528281, 2441689, 3962107, 2108829, -603443, -2407329, -1582696, 5705864, 2272038, - -1080184, -1750199, -287763, 8993662, 369367, -6923488, -14181982, 3431679, -738734, -11701638, - 3955665, -3876208, 547608, -4430259, -3453154, 3689377, 8909910, 1099512, 11802570, 5355824, - -5939940, -7806103, 12914967, -5598490, -412317, 1155346, -12120398, -90194, 6414534, -7033009, - -1864016, 8117488, 515396, 4241280, 126702, 5345087, -901943, -3627100, -485331, 7097434, - 9584220, -3141769, 1947768, 1666447, 6393059, -3805341, -667867, 1245541, -1614908, 4146791, - 1876901, 343597, -2175401, 3317862, 3689377, 191126, 182536, 2759517, 4314295, -5179731, - -17180, 1445257, 2368675, -2652142, 2147484, 1063004, 77309, 1503239, -1636383, 721555, - 1715839, 3577708, 4325032, -3487514, 395137, 67171144, -6414534, 1159641, 4226248, -5978595, - -10363756, -6004365, -2544768, -11791833, -12670154, 1022202, -11216307, -4900558, -3206193, -2723009, - 6966437, 8117488, 2598455, 16939352, 3111704, -8310762, 14594299, -1404454, 10348724, -3238405, - -1035087, -9526237, 412317, 8536248, -242666, -4075924, -1595580, 923418, -2078764, -1735167, - 3322157, -7572028, 3141769, 1204738, -3571265, -7179038, -4861903, 5641440, 5542656, 6618545, - -11020886, 6277095, 1752347, -199716, 547608, 1163936, 1264868, 1503239, -899796, 659278, - 5892695, -1580548, 2342905, 2813204, -2396592, 4926328, 5600638, 1000727, -455267, 5207648, - 3702262, 2907693, 3498251, -4243428, -1960653, 1071594, -440234, -564788, 322123, 2372970, - 652835, -4110284, -39462160, -66170412, 23903640, -1717987, 9919227, -11613592, 504659, -13447543, - -1782411, -19372450, 8310762, 8877697, -476741, -1546188, -287763, 1758789, -4672925, -16522739, - 30298846, 2063732, -3938485, 10363756, 1799591, -5527623, 14519137, 16149077, -7009387, 9509058, - 1801739, -2106682, -15238544, -8358007, 11809013, -6148246, 1617055, -863288, 8007967, -12427488, - -13984414, 1926293, 141734, -9457518, 5617817, 1110249, -5939940, 4110284, -6536940, -5439576, - 2499671, 2422362, 272730, -1782411, -3122441, 3809636, 6414534, 897648, 1964948, -1913408, - -1941325, 5617817, 599148, 1219771, -5858336, -1382980, -3940633, 3135326, 4653597, -8590, - 3813931, -107374, 5108864, -4254165, 2518998, -111669, -341450, -4022237, -137439, -3455301, - -547608, -21272974, 63909112, -28394028, 4782446, 4179003, 16026670, -2037962, 10234907, -10114648, - 627065, -19391778, -3706557, 92342, 7816841, 1292785, 8050916, -5561983, -11768210, 1518271, - -17703856, -18668076, 551903, -6137509, -330712, 1591285, 2688650, -4632122, -3079492, -6667937, - -10086731, 4063039, 4915590, -13161927, -5935645, -16542067, 283468, -7310035, 5967857, 6951405, - -13602161, 2145336, 11274289, 10121090, -5220533, 3685082, -3848291, -1928440, 3201898, -6171868, - -1290638, 5740224, 4520453, 3932043, 4861903, 2574833, -1393717, 3788161, 2540473, -2843268, - -105227, 7730941, -768799, -3566970, -1088774, 3184718, -3270618, -7919920, -528281, -2770254, - 2068027, 1677185, -1108102, -3212636, -4722317, -5585605, 5699422, -1900523, -176094, -1258425, - -354335, -704375, -52800180, -16357383, 5944235, -8349417, 7535520, -3485366, 73014, -15564961, - -18698140, -2542621, -6545530, 7825431, 2231236, -2278480, -38646116, 19396072, 1378685, 16902844, - 21028160, 14542759, -20203526, -4937065, -1954210, -5048734, 4361540, 4791036, -345745, -7365869, - 8175470, -13670881, -7303592, 12126840, 627065, -5229123, 14199162, 313533, 14894947, -5151814, - -2379412, 1767379, 4668630, -10666551, -7870528, -1879048, 8392366, -3058017, 1365800, -3360812, - 5611375, 7030862, 1370095, 373662, -12365211, -1290638, 6060199, 6786049, -3867618, 7602092, - 2510409, -2104534, 1990717, -7724499, -2409477, -5168993, 5102421, 798864, -1799591, 1838246, - -13187697, 83752, 2523293, 6317897, 2091649, -3459596, 6120329, 579821, -8306467, -3783866, - -4254165, -1172526, 1765232, 33792804, 11394548, -20332376, -3474629, -8761733, 7075959, -12277164, - 10258529, -2291365, 11931419, 8284992, 14486925, -19486266, 23422604, -14375256, 13715978, -7868380, - 8235600, 1537598, 6998649, -12468290, -28537910, 11083163, 19935090, -7226283, 8209830, -10125385, - 2437394, -6650757, 20963736, -204011, -2010045, 4988605, -10097468, -7071664, -5894843, 9171903, - 154619, -3382287, 73014, -1810329, 14424648, 9629317, -5308580, 4655745, 5527623, -5963562, - -3395172, -5370857, -10819023, -1498944, 285615, -1473174, -3940633, -11038066, -395137, 16862042, - 9206262, -7041599, 9468255, -1005022, -105227, 7904888, 4185446, -8038032, 3092377, 1797444, - 8360154, 9957882, -7851200, 3594888, 5862631, 7604240, -620623, -216896, -2680060, -1385127, - 4320737, -691490, 7812546, -1739462, 71534824, -58435176, -9850507, 2858301, -1187559, -16196322, - 5351530, 4161823, 22799834, -7548405, 4430259, 18726058, 444529, 11235634, 37076304, -8134668, - -2484639, -19393924, -18144090, 764504, 6077379, -8218420, 3457449, 32682554, 18876382, 2656437, - 1170379, 2602750, 18056042, -15182709, -6755984, -901943, 9279277, -1511829, 2179696, -7730941, - 2828236, -13683766, -8080981, -10359461, 98784, -9283572, 2138894, -16490527, 7511898, -32890860, - -8473970, 4447439, 5995775, -1284195, -7638600, 2486786, 899796, 3882651, -9053791, 3944928, - -5330055, -5991480, -14562087, -10851235, -3259880, -1857573, 637803, 2409477, 4569845, 835371, - 2143189, -8695161, -137439, -10602127, -1668595, -775242, 201863, 3466039, 10456098, -6637872, - -3021510, -740882, -5703717, -9783936, 2093797, -45397804, -31638876, -2461016, -6515466, 23602992, - 644245, 4260608, -29841432, 1410897, 3947075, 1578401, 2153926, 17798344, -22473416, 4602058, - -4904853, -15522012, -7604240, 14081050, -5108864, 11441793, -4088809, 6575595, 3493956, -2523293, - -1898376, 7460358, -1161789, -242666, -19260780, 9328669, 8431021, 7960722, 9186935, -17308718, - -17839146, 10166188, 15217069, -18601504, 6661495, 2503966, 15814070, 9032316, 1393717, 10576357, - -5785321, -11291469, -1818919, -21631602, -15824807, -1913408, -934155, 3242700, -10383083, 3399467, - -8355859, -27681064, -8207683, -7595650, -27283780, -135291, -4574140, -3354370, 2961380, 8265665, - -8128226, 5025112, 3309272, -12446815, -7973607, -9612137, -2153926, -2982855, -395137, -4082367, - 5061619, -6156836, -1660005, -5261335, 8776766, -10065256, 5744519, -1756642, -2325725, 341450, - 2375117, -2518998, -28271622, 42988328, -22604412, -9657234, -13230647, 3382287, 3676492, 6320045, - -2750927, 18756122, 14132590, -13503377, -23959476, 8944269, -9006546, 22003118, 1788854, 9386651, - 11542725, -8349417, -8106751, 29242284, -16784732, -4060892, -8529805, 1013612, -3526168, 3869766, - -4969277, -1960653, -22585086, 19900730, -6966437, -1786706, 23551454, -16155519, -20360292, 1829656, - -9238475, -13404593, -88047, -6878390, 5336497, -29379724, -9756018, -7224135, -693637, 10325101, - 146029, 2042257, 5368709, -5059472, 4108136, 6889128, 5993627, 6534793, -3732327, -6251325, - -5411659, 7430294, -17738214, -3914863, -4153234, -4423817, 11662984, -7907035, -12393128, 12562779, - 3884798, 7546258, 14987288, -5519033, -4937065, 7337952, -8022999, -10264972, -9363029, 5555540, - 4346507, -5602785, 5214091, 1666447, 6141803, 1037235, -11162620, 7460358, -3663607, -59126668, - 29527900, 31814970, 16282221, 14783277, -10608569, 15025943, -25567940, 801011, -30034706, -3983582, - -13136157, 13887777, -14385993, -11952894, -3307125, -22046068, 6414534, -10106058, 9665824, -20699594, - 34383360, -11375221, 16215649, -14199162, 1331440, -14227079, -4589173, 7735236, 21992380, 24665998, - -12451110, 25770, -7380902, -13131863, -10037339, -35388384, -919123, 5845451, -33298882, 12882754, - 6474663, 9025874, 15820512, 9947144, 5250598, -11237782, -3734474, -12526272, -6405944, 6579890, - -26656714, 10398116, 5108864, 1619203, -12648679, -7488276, 6728067, 21335250, 8912057, 5454609, - -8546985, 8847633, 1138166, -10252087, 2632815, -7441031, -11703786, -6131066, -2851858, -10593537, - 11839077, 6685117, 9609989, 5312875, -8869107, 2789581, 14815490, -3047279, 13750338, 7269232, - 5001490, 9257802, -5018670, -5703717, 3476776, 2334315, 48930416, -33711200, -14160507, -4327180, - -206158, 23798414, -4567698, 7758859, -13799730, 7333657, -8600672, -38753488, -26665304, -9970767, - 13808320, -1717987, -21449066, -20109036, -42273216, -13683766, 5330055, 5643587, 1876901, -4413079, - -2564096, -13155485, 3350075, 5424544, 7090991, 1571958, -2010045, -5130339, -20212116, -5209796, - -4657892, 10052371, -2190433, -16144782, -6395207, 4571993, -18135500, 3015067, -18700288, 10282152, - 14467597, -13913547, -27026082, -5297842, -8559870, -12427488, 1209033, 2345052, 2564096, 6521908, - 249108, -10677289, 16806208, 26139170, -12749610, 10780368, 4299263, 12330851, -19097572, 7063074, - 2317135, 6672232, -27429808, 21500606, 2523293, 2321430, -3423089, -15732465, 3962107, 1857573, - 3732327, 4647155, -17134772, -9126806, 3259880, 7872675, -4408784, -148176, 6231998, 2372970, - -3171833, -8304320, 5811091, 79675936, -44409960, 4148939, -4404489, -9401683, -33124936, -1713692, - -1778117, 27088358, 12406013, 54644868, -21644488, 2181844, 6019397, 13153337, -5534066, -2433099, - 22166326, -13799730, 31879394, 19389630, -44214540, 42271068, 14907831, -15133317, -10960757, -16514149, - -8628589, 3118146, 1964948, -11845520, 28052578, 3680787, -13411035, -11802570, 2753074, -14632954, - -25997438, 339302, 15539192, 6266358, 18891414, -8684424, 5881958, 20313048, 29100550, 6949257, - -30109868, 9966472, -9693741, -16518444, 4383014, 12818330, 7316477, -3599183, -27337466, -23854248, - 33704756, -4376572, 26044682, 3055869, -10273562, 12841952, -22606560, -9938554, 10881300, -2854006, - 22393960, -17952964, -35708360, -9962177, -1769527, -10904922, -8579197, 22258668, -7453916, 4138201, - -20405390, -19853486, 9713069, 5164698, 8177618, -8622147, 8347269, 904091, -4788889, -981400, - -90089088, -58643484, 21124796, -30614526, 9380209, -15446850, -54631984, -40501540, 72230616, -33681132, - 32450626, 18202072, -19250044, 16595754, -11059541, 22535694, 25003152, -1937030, -7499013, 43164420, - -14441828, -49422188, 489626, -20877836, 4698694, 4342212, 29096256, 15283641, 5802501, 14091788, - -13552769, -307090, 31887984, 20280836, -6126771, 7984344, -28763396, -44285408, -32734094, -22980222, - -6680822, -6573448, 7818988, -4421669, -12575664, 27865748, 7090991, -21507048, -20145544, -6034429, - 7866233, -21668110, 8201240, 25973814, -858993, 9526237, -18395344, 13696651, 9876277, 2909840, - 10080288, -16226386, -24908662, -34930968, 17044578, 13297219, 858993, 13194140, 2226941, -16211354, - -3680787, 876173, -28011776, -2854006, -43329776, -23972360, 6844031, -11321534, 7907035, 676457, - -6027987, -6210523, -4385162, -8351564, 7282117, -128849, -1614908, -107359152, 36565204, -8549132, - -7058779, 19172734, 4690105, 10690174, 46748572, 27910844, 35298188, 17763984, 48208860, -8478265, - -47010564, 6923488, -5312875, -20134806, -41654740, -18159122, 36352604, 8252780, -2557653, 7593502, - -2815351, 515396, 30620970, 3897683, 11330124, -4636417, 7537668, 30556544, -8504035, -20544976, - 15468325, -36487896, -36728412, -23568634, -4702989, 1020055, 15126875, 35811436, 483184, -12348031, - -35762044, -58471684, -20654498, -8523363, -3571265, -380105, 21509196, -26787712, 48191680, 25097642, - -4668630, 13907104, -19093278, 3476776, 313533, 22346714, 43046308, 29113436, -25469156, -10647224, - 7131793, -4073777, -5491116, 2244121, -13191992, -41768556, -3244848, -7685844, -3077344, 6575595, - -16355235, -5467494, -28598040, -3002182, 3925600, 29899414, 14579266, 4224101, 4743792, 7580618, - 863288, -25243670, 5136781, -5849746, 6676527, -3040837, -3401614, -13795435, 2080912, -14538464, - 43974024, 44510892, 15335181, 29890824, 21657372, 46690588, -40432824, 48528836, -58491012, -9996536, - 55357832, 75780400, 16095390, -4449586, 27822798, -22842784, -26673894, 54919748, 9167608, -8059506, - 13657996, 44223132, -11164767, 27262304, -8443906, -10636487, -4891968, 20160576, -50442244, -5839008, - 25061134, -10911364, 2967823, -17615808, 10915659, 40608916, -36747740, 12363063, -10623602, 13531294, - -19037442, 27412628, 2680060, 10153303, 11340861, -44613972, 22370338, -62264140, -12373801, 35910220, - 4209068, -21979496, 39623220, -13140452, -23291608, 28879360, -11336566, -7724499, -4121021, 17613660, - -2211908, 4960687, -33842196, 12859132, 3536906, 67345088, -49954764, -21494164, 6337224, -12515535, - 15453292, 19305878, -23852100, 47238196, 17858474, 229781, 8027294, 16123307, -7254200, -24932286, - 10353019, -12642236, 4516158, -4711579, 12528420, -15635828, 5224828, 620623, -8222715, 11227045, - -3451006, -2390149, -876173, 89730456, -55963424, 2252710, -8888435, -14877767, 1928440, -20396800, - -8570607, -66228396, -55413668, -55192476, 18599356, -11443940, 18382460, -12541305, -40102108, 64201172, - 44764296, -29697552, -24930138, -35076996, -7273527, 13808320, 21234318, 26027502, -1752347, 20160576, - -5697274, -25280178, -30872224, 19421842, -14018773, 58613420, 36749888, 54067196, 7672959, 19705310, - 53244708, 36928128, -11598559, 9781788, -2297808, 734439, 5703717, -24715390, -17772574, 9618579, - -30925912, -31866510, 30986042, 35229468, -38487200, -1202591, 68567008, 47775068, -2381559, -22585086, - -4917738, 14252849, 12942884, -9206262, -25443386, 30672508, -1986422, 7559143, 21994528, 27893666, - -29072634, 12571369, -4711579, 11630771, -45232448, 8433168, 40965400, -40662604, -33384780, -17293686, - 18229988, 32328218, -18163416, 17811230, -15648713, -1546188, 1002875, 6779606, 12154757, -5585605, - -2428804, 7393786, 6852621, 135291, -852551, 5355824, 72690176, 28028956, -9633612, -2272038, - 22842784, -27114128, -35296040, 30401926, -42183020, -54619100, 14596446, -29268054, -37774236, -19651622, - 36202280, 88753352, 36754184, -48157320, 90868624, 10640781, -14175540, 16469052, -52971980, 13593571, - 7378754, -37903088, 32929514, -10110353, 6536940, -27253714, 15418933, -24895778, 45999100, -54309860, - -20005958, -18680960, 25965224, 30047592, 26699664, -28799904, 8489003, -30112016, -8654359, 16250009, - 38437808, 17867064, -17626546, 37553048, 19104014, 30322470, 2040110, 35326108, -15375983, 19597936, - -53556096, 60329260, -5218386, 8527658, -15953656, -31228708, 1608465, 20255066, 48075716, 14291504, - -57505316, 24678882, -23270132, 47528108, 4088809, -17925046, 9171903, -15476915, 9865540, -33320356, - 13376676, 3358665, 2911988, 5529771, -6564858, 3624953, -9032316, -13862007, 18743238, 11933567, - 10797548, -24650964, 8169028, -13288629, 11574937, 2787434, -1556926, 5989332, 2759517, -148502784, - 6779606, 25108378, 58669252, 19419694, -91255168, 122088744, 44929652, -55600500, 20332376, 121429464, - 27502824, -29237990, -3401614, -73252816, 38014756, 3697967, -18500572, 10782515, 25436944, -47435768, - 25759066, -59491740, 6603512, -54206784, -48608292, -20622286, 23304492, 35188668, -26429082, 30799210, - -52731460, -7425999, 59908352, 5708012, -21163452, -6801081, 11978664, -13604309, -39004744, -43709884, - -5467494, -19958714, 43396348, -60226180, 64372968, 20585778, 8577050, -21238614, -6640020, 29807074, - -23583666, 40142912, 10322954, 36303212, -12904229, -20768314, -62831076, 21805548, -5948530, -65023656, - 20014548, -4234838, 40147208, 64085208, -26542898, 14684493, 31991064, 33773476, 7365869, -19357418, - -3328600, -78797616, -3367254, 7342247, 19997368, -281320, 53566832, 11611444, 26901528, -29706142, - -20813412, 39814348, -3530463, -7971460, 24588688, -5484673, -6186901, -356482, -753767, 2675765, - -3719442, 22226456, 183854672, 83496312, 16930762, 29399052, -38358352, -25926570, -9502615, 69133944, - -49950468, 7355132, -41656888, -113939040, -54936928, 25454124, -29534342, 18174154, -45492292, -2823941, - -48874580, 40900972, -49478024, -35729832, -105780752, -20169166, -17104708, -28192166, 54226108, -18352396, - -44480828, 13750338, 41699836, 15150497, 13767518, -6844031, -9472550, -28342490, 20968030, -36331128, - -10262824, -22776212, -63329292, 9030169, -44132936, 17055316, 5001490, -13297219, -2029372, -46226732, - -3223373, -10919954, 66236984, -19761144, -2214056, 26686780, -37301792, -16784732, 67216240, -40108552, - 25295210, 1277753, 59702192, 85259392, -5705864, 10593537, 7892003, 29184302, 14836965, -65906272, - 5321465, 16063178, 22402550, -28477780, -44259636, 4103841, 11959336, -11860552, -17267916, -70643624, - -35341140, -40825812, 2113124, 8407398, -13954349, -19741818, -22640920, -5828271, -11731703, -12725988, - 13883482, -7329362, 6339372, -25686052, 1056562, -10185515, -18249316, 3676492, 9524090, }, - { - -137439, - -40802, -150324, 8590, -96637, 221191, 146029, -695785, 8590, -453119, -541166, - 143881, 450972, 440234, 158914, -994285, -609885, 199716, -311385, 53687, 199716, - 259846, 412317, -300648, -335007, -616328, -360777, 0, -1402307, -25770, -139586, - -401579, 285615, -796716, -697932, -1406602, -197569, -1234803, -382252, -25770, 979253, - 274878, 743029, -375810, 783832, -201863, 154619, 685047, 4189741, -3266323, 2046552, - -2579128, 1329292, -1254131, -1236951, -740882, -700080, 764504, 874026, -3195456, -167504, - 481036, -313533, -528281, -1868311, -674310, 1344325, 2035815, 1022202, 3204046, 654983, - -558346, 661425, 562641, -319975, 1054415, 2278480, -861141, -17180, 979253, -23622, - -208306, -1619203, -51540, 831076, 672162, 139586, 57982, -534723, 586263, -53687, - 83752, 38655, -543313, 15180562, -979253, 1331440, -951335, 987843, -1142461, 251256, - -272730, -259846, 880468, -792421, -2744484, 803159, 294205, 861141, 1872606, 1005022, - 678605, -240518, -1586990, -539018, 743029, -208306, -249108, 1565516, -1964948, -618475, - -23622, -328565, -478889, 758062, 831076, 1024350, 296353, 371515, -405874, 1417339, - -53687, 1090922, 770947, -242666, -130997, 521839, 21475, -294205, -135291, 25770, - 11151883, -10651519, 1672890, -2877628, 1544041, -193274, 1114544, -1020055, 2005750, -850404, - 1215476, -2542621, 100932, -1475321, 423054, -231928, -347892, -682900, -1872606, -188979, - 221191, -921271, 1533303, -691490, -1114544, -1406602, 841814, -899796, 2179696, -227633, - 6442, 644245, 8590, 49392, -972810, -816044, -227633, 223338, -373662, -936303, - 831076, 599148, 1496796, -345745, 491774, -206158, 277025, -26160646, 3068754, -1962800, - 55835, -304943, -2194728, 2370822, -586263, 210453, 1002875, 302795, 2748779, -137439, - -1123134, 3296388, 1331440, 2974265, -62277, -3947075, -2362232, -1904818, 1627793, -2059437, - 171799, -751619, -697932, 236223, 612033, -601295, -1239098, -923418, 796716, 897648, - 1720134, -141734, -240518, -111669, 1065152, -1198296, 309238, 468151, 788127, -977105, - 1017907, -1185411, -210453, 390842, -33039036, 11974369, -4825396, 5538361, -3846143, 2542621, - -4168266, 2370822, -3094524, 1198296, 2304250, 118112, 884763, 2113124, -1357210, 1520418, - -1741609, -1282048, -3843996, 3508988, -2257005, 2353642, 178241, -6442, -3687230, -126702, - 715112, -517544, -118112, -128849, 1544041, -221191, -1078037, 1172526, 358630, -461709, - 81604, 60130, 137439, 680752, -992137, 2572686, -201863, -1597728, -161061, -865436, - -85899, 1662152, 15060303, -3195456, 5735929, -2581275, 1990717, -2087354, 7138236, -1333587, - 3822521, -399432, -246961, 996432, 27917, -4846871, 1140314, -403727, -2171106, -496069, - 113817, -6105296, -139586, 545461, 1973538, -8590, -1138166, -197569, 2134599, 427349, - -1013612, -2025077, 3191161, -1919850, -47245, -2879776, -294205, 51540, 536871, -665720, - 803159, 1307818, -1211181, 1047972, -19327, 846109, -17180, 1494649, -704375, -392990, - 1331440, 39653284, -11557757, 1728724, -1956358, 2611340, 32212, -25770, -5327907, 2394444, - -2325725, 1638530, 575526, 843961, 1724429, 2686502, 418759, 940598, -4481799, 1655710, - 1664300, -2879776, -556198, 3047279, 1971390, 1949915, 4316442, 2424509, 633508, 1155346, - -1610613, 1380832, -382252, 2493229, 3227668, -442382, 1090922, 2040110, -850404, 712965, - -2804614, -743029, 2808909, 60130, -1969243, -661425, 848256, 2093797, -146029, 1191853, - -15032, 2811056, -21210696, 8916352, -6191196, 4028679, -3685082, 4756677, -3111704, 188979, - -2649995, -3262028, -4556961, 304943, -2710124, 1297080, 1509681, 3418794, -5622112, 3446711, - -1352915, 4791036, 1043677, -298500, 367220, 354335, -1146756, -977105, 717260, -2304250, - 1492501, 2701535, -3704409, -831076, -234076, 1466731, -1421634, 3869766, -4067334, 766652, - -19327, 225486, -1756642, 255551, -1108102, 1007170, 143881, 176094, -1254131, -238371, - -2585570, -893353, -161061, 543313, 184684, -964220, -3268470, -34190088, 10825465, -7007239, - -476741, -1434519, 2128156, -5909875, 405874, 1864016, 1539746, -2072322, 1157494, -2643552, - -4335770, -1698660, 530428, -2598455, 9051644, 236223, -2529736, -837519, -3045132, -1432372, - 2755222, 1644973, 3577708, -339302, 1586990, -2040110, 818191, -1846836, -639950, -1086627, - 588411, 1108102, -590558, -1752347, 414464, 642098, 2471754, -446677, -929860, -3251290, - -2662880, -1273458, -528281, 597000, 423054, -1337882, -564788, 229781, 1172526, 605590, - 191126, -592706, 1191853, -32916630, 15425375, -7292855, 6876243, -3607773, 4067334, 2007897, - 1232656, -3758097, 442382, -1921998, 545461, -4915590, 1827509, 3053722, 979253, -5231270, - -2600603, -2639258, -2746632, -1806034, 3723737, 882616, 2617783, 2095944, -938450, -227633, - -3955665, 5070209, -1462436, -528281, 311385, -1103807, -1576253, -1857573, -433792, -4157528, - 1215476, -2211908, 1642825, 1432372, 2364380, -657130, 249108, -2703682, 1005022, 1971390, - 461709, -453119, 388695, 1539746, 2306398, 996432, 2143189, 88047, 322123, 10683731, - 13217762, -5970005, 3541201, -1836099, 1329292, -1419487, 762357, 1166084, 6472516, -2289218, - 2669322, 6083821, -1655710, -244813, -1024350, 1479616, 3141769, 3223373, 4187593, 1133871, - 3564823, -906238, -2104534, -7125351, 1503239, -1078037, -3577708, -2549063, -120259, -672162, - 2302103, -326418, -4136054, -4267050, 1151051, -3706557, 500364, 2261300, -3332895, -2229088, - -1415192, 1662152, 1505386, -105227, -438087, 2499671, 534723, -959925, 1005022, -2149631, - 274878, -1131724, -1619203, -1090922, 1700807, -863288, 1284195, -955630, -2078764, 571231, - 1155346, -727997, 38029788, -13234942, 7181186, -4960687, 7138236, -5029407, 4378719, -1625645, - 4447439, 1082332, 3131031, -3635690, 3734474, -1273458, -3098819, -317828, -3328600, -5312875, - -2804614, -575526, 2699387, -3637837, -4868346, -5963562, -1069447, -519691, 4776004, 2617783, - 3068754, -2093797, 2482491, -1891933, -1859721, -1022202, 3150359, 2720862, 850404, -17180, - -111669, 90194, -880468, -493921, 2181844, 427349, 5364414, -2052994, -644245, -4466766, - 2929168, -1163936, -693637, -1050120, -277025, 264141, -743029, 818191, -1196148, 19327, - -1696512, -745177, 380105, 1752347, -908386, 10683731, -16320876, 9569187, -6105296, 7432441, - -83752, 4614943, 1303523, -7155416, -3393024, -2411624, 876173, 1793149, 1002875, 8078834, - -4541928, 6455336, 1125281, 820339, -4415227, -957778, 5581310, -367220, -4737349, 5394479, - 4121021, 912681, -2220498, -1754494, -470299, -375810, 2501819, -1226213, 1116692, -3021510, - -667867, 1741609, -4355097, 1666447, -1687922, 1559073, -1260573, -386547, 5141076, 2218351, - 2931315, -227633, 1213328, 1883343, -384400, -1417339, -2265595, 775242, 1039382, 1825361, - 2211908, 517544, -493921, -2274185, -1028645, -2299955, -2048699, 264141, -40583144, -8274255, - -1183264, -6852621, -2899103, 5963562, 2491081, -1859721, -1666447, -4954245, -3324305, -4037269, - -4518306, -3762391, -2433099, -3412352, -5744519, -4924180, 1767379, -4997195, 1541893, -6691559, - 124554, -2819646, -2274185, 5665062, -680752, -2881923, 3624953, -4254165, 3837553, 1095217, - 4054449, 2742337, -169651, -2065879, 4271345, -139586, -753767, 3891240, -1735167, -5476084, - -6189048, -1644973, 1945620, 1219771, -1898376, -255551, -1763084, 313533, 6442, 240518, - 3747359, 1428077, -2841121, -1114544, 420907, 2351495, 483184, 3547643, 916976, -375810, - -1930588, -47629040, 41452876, -16889958, 11501922, -10823318, 2645700, -5317170, 7009387, 1327145, - 811749, -3393024, 4745939, 966368, -8566312, 869731, 1254131, -4303557, -6605660, 6521908, - 8076686, -2609193, -2147484, 1352915, 3712999, -2183991, 7352984, -229781, 1848983, -5347235, - -1917703, -3184718, 4784594, -1065152, 1026497, 1041530, -2776696, 4657892, 4443144, 1224066, - 1511829, 5461051, -3352222, -878321, -721555, -3959960, 826781, -2581275, 940598, -118112, - 326418, 4464619, -199716, -1007170, 957778, 240518, 2884071, -2701535, 992137, -169651, - 5680094, -1696512, -261993, -2239826, 31845036, -3779571, -6586333, -1524713, 4327180, 2259153, - 1984275, -180389, -4365835, 1146756, 2740189, 3094524, -1964948, -1848983, 6468221, 2246268, - -4958540, 1129576, 8353712, -10314364, 6983617, 893353, 8916352, -532576, 564788, 1795296, - 1848983, 4715874, -3377992, -1243393, 1808181, 3405909, -1258425, -30065, 496069, 843961, - 2171106, -4191888, -30065, 2544768, 773094, -2278480, -657130, 5551245, 4110284, 1990717, - -2027225, -1466731, 1649268, -633508, -1275605, 1039382, -1614908, -2564096, 5714454, 2289218, - 3700114, 648540, 2811056, 2299955, 2510409, 350040, 3023657, 1552631, 2173254, -1625645, - 474594, 869731, -2426657, 985695, -1129576, -161061, 15116137, 4400194, 3655017, -2196876, - -1468879, -4084514, -2920578, 766652, -1597728, -1999307, -5869073, 5027259, 3474629, -3639985, - 6266358, -5871221, -1778117, 2652142, -4363687, 2561948, 4069482, 6234145, 5482526, 5250598, - 2714419, -11014444, 2147, -2287070, 2211908, -1032940, 4318590, 2959233, -1425929, -2652142, - 2832531, -1939178, 7284265, 34360, 2405182, 7423851, 7067369, -5302137, 440234, -3481071, - -6365142, -646393, 1183264, -768799, -1316408, -635655, 534723, -2933463, 380105, -3427384, - -987843, -362925, 906238, 73014, -2046552, -2113124, 4410932, -1511829, 657130, 2031520, - 2426657, -1299228, -1404454, -592706, -3526168, -2325725, 352187, 820339, 35689032, -25095494, - 9148280, -9526237, -725850, -6655052, 6038724, 6000070, 1939178, 1228361, 5673652, 15582141, - -13677323, -1891933, -3549791, -5514738, 12088185, 9109626, -1853278, -8267812, 3362960, -6751689, - -5398774, -9463960, 1219771, -9691594, -3197603, 5727339, 833224, -2963528, -7999377, 25770, - -1926293, 4876936, 4481799, 2076617, -3631395, 558346, -223338, 1979980, 3867618, -2441689, - -1232656, -4329327, 6586333, -805306, 977105, 5881958, -1206886, -523986, 2349347, -2939905, - -302795, 2557653, -4359392, 1002875, -807454, -371515, -4546223, 2220498, -972810, 401579, - 1118839, -1670742, 2982855, -2336462, -607738, -4857608, 438087, -665720, 2025077, 2147484, - -55624120, 7627862, 717260, 3843996, -4329327, -6994354, -90194, 4593468, 7331509, -508954, - 11179800, 6204081, -7657927, -6837588, 5196911, 891206, -5469641, -10114648, -11594264, -7451769, - -8568460, -9584220, 1675037, 2989297, 2493229, -7103876, -6828998, 989990, -1829656, -1202591, - -949188, -5675800, 4726612, -9740986, -3667902, -1520418, -392990, 3060164, 1054415, -708670, - 4443144, -1402307, 4430259, 2527588, -3472481, 513249, 7221988, -2935610, -2933463, 150324, - 4215511, 1063004, -3045132, -3910568, 3521873, 152471, -5117454, 6953552, 7853348, 916976, - -2274185, 904091, -169651, 1636383, 3457449, -375810, 4597763, 2903398, 2622078, 2282775, - 1178969, 1896228, -2332167, -206158, -34029024, 29091960, -9728101, 6216965, -158914, 4846871, - -11778948, 4559108, -8029442, 40802, -5433134, 10922102, 9292162, 3513283, 755914, -8972187, - -5952825, -923418, -3607773, 10365904, -8469676, -335007, -4194036, 15180562, -4823249, 1359357, - -423054, 2617783, 1198296, 2607045, 1919850, -2510409, 1374390, -609885, 5308580, 818191, - 10056666, 5214091, -3231963, -680752, -1241246, 184684, -3824669, -2705830, -949188, 1793149, - 12262132, 1112397, 833224, -3367254, 5012227, -1857573, -2602750, 1612760, -2527588, 1507534, - -3141769, -6863358, 3418794, 3030100, -936303, 7157563, 1544041, 1694365, 2594160, -1930588, - 869731, 2312840, -5909875, -2796024, -433792, -2714419, 2753074, 4219806, -1584843, 7241315, - 4799626, -191126, -1962800, -1490354, -532576, 22187802, -517544, 4988605, -15109695, -2525441, - 1887638, -12193412, 953483, 16853452, -2959233, 1196148, -7630010, -10445360, 2632815, -9545565, - 14845554, -10340134, 3545496, 3498251, 7939247, 6171868, -1644973, -9227737, -1090922, -867583, - 4692252, -6474663, -1273458, -1913408, -3096672, -2207613, 4483946, 2753074, 12032351, 4073777, - -4514011, 4982162, -3307125, -3476776, 3682935, 10303627, -1509681, -5349382, -5014375, 5467494, - -161061, -7496866, -6914898, 3506841, 3255585, -3124589, -5720897, -9470403, 2583423, 3496104, - 2336462, -5357972, 3977140, 2441689, 1638530, -1917703, -614180, 2901251, -7129646, -949188, - 3090229, 3659312, -710817, 1769527, 113817, 75634376, -4754529, 3103114, 6979322, -6560563, - -2763812, -2207613, -17746804, 12019466, -1876901, -10986526, 2443837, -5607080, 6549825, 5194763, - 8308614, -2881923, 11257109, 9650792, 6193343, -9824738, 7640747, -13496935, -7939247, -9167608, - 3704409, -7030862, -1226213, -2362232, -8974334, -4851166, 7679402, -5617817, -4232691, -8568460, - 2856153, 2836826, 6513318, -3592740, 11169062, 2830384, 12725988, -1400159, 2360085, 2607045, - -6938520, 5044439, 13026636, -4413079, -300648, 3579855, -3710852, -5177583, 3137474, -5160403, - -2750927, -6760279, -4406637, 5104569, 4571993, 3088082, 4904853, 6139656, 5860483, 8778913, - 1490354, -2531883, 4589173, 3126736, 25770, -811749, 442382, -3208341, -618475, 745177, - 878321, -128849, -33474976, -65624952, 24305220, 208306, 1314260, -6582038, -7039452, -1604170, - 2222646, -4275640, 17100412, -7960722, -15008763, 850404, 906238, -2016487, -5319317, 11632919, - 2076617, -5295695, 5392332, -10419591, 13095355, -7408819, -3880503, -9012989, 14624364, -6399502, - -2175401, -8935679, -4161823, 7902740, -3773129, 8562017, -11203422, -13093208, 1013612, 2199023, - 2201171, -414464, -6805376, 1178969, 3420942, 1660005, 6743099, -111669, 10606422, 1406602, - 9936407, 13013751, 2665027, -1065152, 2407329, -7413114, -1941325, -12330851, -10977936, 3124589, - 3180423, 2063732, -824634, -3575560, -1896228, -3070902, -1737314, -3066607, -8590, -356482, - 2220498, -833224, -1501091, -4271345, -395137, -4945655, -659278, -6539088, -923418, -2486786, - -788127, -21996676, 64048700, -29231548, 13335873, -6231998, 20315196, -3246995, -9032316, -9421011, - 5304285, -2834679, -1251983, 427349, 3940633, -21577916, -10559177, -5592048, 8523363, 7164006, - 12521977, 2265595, -1954210, -2018635, 15034533, -19617264, 11306501, -9453223, -2005750, -9955734, - 15530602, 6227703, -10168335, 1322850, -4481799, 1657857, 6562710, -28138478, -11787538, 2297808, - 9839770, -5800354, 2040110, 7200513, -2969970, -3186866, -1067299, 10874857, 4256313, 1857573, - 1178969, 4189741, 12743168, -7763154, 5806796, -17952964, -3139621, 4043712, 8619999, 1623498, - 1215476, 418759, 4651450, -3511136, 502511, -1260573, -4264903, -3682935, 6674379, 6534793, - -2501819, -3388729, -11203422, -4720169, -2536178, -1995012, 8108899, -3100967, -3081639, -5458904, - -4969277, -390842, -57526792, -12431783, 5602785, -13662291, 3410204, 2480344, 8403104, -66572, - 16039555, 10462540, 5785321, -4428112, -7904888, -433792, 16971564, -14557792, -5572720, -11287174, - -268435, -30807800, -24290188, 1503239, 15045270, 20708184, 4769561, -7569880, 7054484, -6723772, - -4490389, -4587025, 2035815, 5405217, 1309965, 8044474, -6137509, -10973641, 9049496, 5937793, - 19022410, -2357937, 3088082, -2753074, 15341623, -15998753, -8033737, -3803194, -12135430, 7696582, - -5012227, 6459631, -12998719, 12932147, 12558484, 11547020, -4722317, 10234907, 545461, 3560528, - 6006512, 4267050, -5435281, 936303, -1694365, -309238, 11804718, 4400194, -5192616, 9552007, - -1552631, -8280697, -2740189, -603443, -11641509, -472446, 4859756, 6335077, 1011465, -244813, - -4808216, 1765232, 2823941, 41764260, 27180700, -8469676, 12363063, -27648852, 19542102, 7206955, - 14723148, -4960687, -3631395, -15107547, -7728794, -25868588, -4432406, -20583630, -6214818, -12659416, - -12968654, -17480516, 7015829, -23905788, 3274913, 10415296, -4556961, 3320010, -10269267, -83752, - -3171833, -3367254, -14014478, -1846836, 1666447, -912681, -2123861, -7316477, -6356552, 4380867, - 4657892, 6122476, 30492120, -12236362, -665720, 12373801, -2916283, -5029407, -11645804, 3646427, - 10378788, 17136920, 5804649, 14293651, -13896367, -20905754, 2035815, 13765370, 7720204, -11269994, - 13172665, -9869835, 6365142, 2654290, 11976516, 6779606, 4419522, 8117488, -8031589, 5188321, - 4331475, 2480344, 11763915, 2731599, 9513353, -1380832, -3758097, 1539746, 2287070, 2005750, - 11420318, -1786706, -6375879, -575526, 84140560, -54520316, -2995740, 6277095, 1657857, 6594923, - 11495480, -2364380, -1889786, 6429566, -9760313, -9330816, -1561221, 7421704, 30260192, 1232656, - 10432476, -9798968, 577673, -29996052, 18474802, -18159122, -25840670, 5963562, 7213398, -9616432, - 8585640, 3575560, 19973746, 22104050, -3710852, -8400956, -6339372, -33135672, -18068928, 25900800, - 8527658, 9504763, -14959371, -15360951, 4509716, -3012920, -13213467, 11456825, -2536178, -8289287, - -9556302, 6472516, -8564165, -4604205, 30384746, -18580028, 5598490, -6693707, 7017977, -8385924, - -3459596, -22733262, 3788161, -8443906, -5690832, 18090402, 4337917, 5016522, 10932839, 13110388, - 3876208, 9062381, -4097399, -1118839, -14950781, 6775311, 12257837, -2851858, 760209, -1406602, - -3148211, -3876208, 1329292, -3983582, -1844689, -52585432, -25993142, 9517648, -3442416, 18809810, - -2886218, -5186173, -15330886, -17145510, 8770323, -17914308, -6335077, -10243497, -2186138, -10797548, - -7475391, -8708046, -4582730, -10752451, -20255066, 11323681, -39975408, -607738, 35394824, 8499740, - -399432, -9919227, 2310693, -36172216, 14641544, 8860518, 2267743, 12820477, 19112604, -15429670, - -8248485, -16048145, 2110977, 384400, -9631464, -10924249, -12139725, -7245610, -775242, 7728794, - 420907, 6309307, 3440269, 633508, 24468428, 5774584, -4213363, 19421842, -9807558, -22411140, - -7080254, -2765959, -3440269, -1589138, -7943542, -1872606, -9846213, -2448131, -10009421, 854699, - 5014375, -10808285, -3283503, -6012954, 197569, -10954314, -13997298, -6070937, 5317170, 9614284, - 3674345, -3330747, -624918, 3622805, -2029372, -2370822, -5072357, 2104534, 4876936, 959925, - -485331, -6156836, -32371168, 43340516, -21565030, -10763188, -35631048, 27580132, -9899900, 16192027, - 895501, 854699, -10894185, 21580064, -5544803, 6927782, 5272073, -10101763, -3500398, -3373697, - -18930068, 3597035, 3302830, -14708116, -24528558, -15324443, -22574348, -5622112, 12079596, 6223408, - -13327284, -13316546, 19546396, 13363791, -17083232, 15461882, -8559870, 13660143, -21623012, -17179870, - -16503412, 5673652, -14624364, 9040906, -6648610, 3730179, -4086662, -2239826, 3304977, 15524159, - -34383360, -4501126, 6768869, -3292093, -10505490, -24910810, -2278480, 22559316, -133144, 19527068, - 14439680, 4045859, -2875481, 14869177, -14974403, -12388833, 9528385, -3760244, -9320079, 6189048, - 1797444, -7421704, -10696616, 17845590, -16836272, -9313637, -10080288, 10052371, 474594, -7402376, - -4121021, 5149666, -15539192, -141734, 4121021, 2976412, 335007, -5471789, -7567733, -74390984, - 27635968, 11678016, -18758270, 9165460, -21212844, 18985902, 16357383, 13926431, -38156488, 22988812, - 40269612, -5639292, 13636521, 573378, -12644384, -16503412, 44362716, -663572, -4009352, -24522116, - -48419312, -26248692, 2357937, -21461952, 17731772, -31748398, -10627897, -18777598, 5022965, -7391639, - -23740432, 3878356, -5568425, 15436112, -5347235, -18659486, -7252053, -56957708, 10063108, -1859721, - 26158498, -16194174, -17972290, 24421184, 5014375, 3925600, -9968619, -15339476, 5276368, 11055246, - 7941395, -4112431, 8443906, 4559108, 837519, -5102421, -5536213, -18887118, 1301375, -7584912, - -11113228, 9721658, 5360119, 27547920, 5609228, -18788334, -18932216, 3985730, -12337294, -9062381, - 2909840, -9320079, -622770, -4370129, -5656472, 5138929, -7578470, 2568391, -1133871, -1623498, - -2961380, -4217658, -9262097, -11111080, -3633542, -9594957, 62038656, -24431922, 427349, 3481071, - 25956634, -3285650, -4997195, 17815524, 30584462, -20564304, -23740432, 18590766, -3491809, 16176994, - 23435490, 19514184, 16849156, 13501230, 15923591, 60243360, -5037997, 4473209, 11778948, 33251636, - -6809671, -12135430, 12863427, -861141, -10765336, -13331578, -11609297, 350040, -15111842, 22995254, - 34688304, -1765232, -8510478, 14516989, -8332237, 20764020, 14948634, 569083, -17779018, 13668733, - -1267015, -5789616, 2924873, -2392297, 40374840, -3335042, 17641578, -8796093, 35991824, -3272765, - 3354370, -12388833, -21644488, 18388902, -10685879, 36266704, 8104604, 17231408, 300648, 268435, - 10657961, 2911988, 26040386, 14574972, 4887673, 13144747, -14991583, 5875516, 12094628, 1458141, - -4116726, 21399674, 5463199, -6809671, -6777459, 8688719, -3730179, 221191, 12195560, -3515431, - 7511898, 3135326, -6425271, 80257904, -23149874, 7524783, -7683697, 3562675, 10344429, 26970248, - -20925080, 11293617, -438087, 1445257, 14641544, -11980811, 15655156, -42292544, -19168440, 7073811, - 15747498, 11141145, 33633888, -33479270, 5226975, -5022965, -45865956, 19512036, -17841294, -11662984, - -6689412, -37673304, 12221329, 13209172, 5858336, -19668802, -32920924, 12874164, -20398948, 17798344, - -31542240, 403727, -37737732, -9302899, -25209310, -21904334, 22299470, 34699040, 4821101, 12741020, - -16039555, 6433861, -26899380, 11364483, -17671642, 4849018, 25733296, 13065291, -9081708, 15569256, - 2570538, 13475460, -11617887, 22606560, 38706244, 2044404, -23435490, -16232829, -10488310, -4329327, - 2461016, 17355962, 3416647, 28211492, -133144, 10773925, -25694642, -3826816, -18562848, -3556233, - -2798171, 5765994, -23302346, 3141769, -1816771, 6955700, 2486786, 4331475, 2317135, 1806034, - -81836304, -68650760, 29006062, -8611409, 33730524, -2624225, 11038066, -41016936, -38480760, -23401130, - 12861280, -31752694, -21906480, -9386651, 6380174, 23227184, 8293582, -46553152, 12554189, 26044682, - -66037268, -7870528, 3191161, -70104600, -24051816, 31228708, -64942052, 31825708, 33492154, 429497, - -9367324, -2647847, -15625091, -17237852, 11658689, 14347338, 48719960, -28784870, -15109695, -12098923, - -22606560, 1335735, -38596724, -9622874, 2948495, -1088774, -12554189, -1960653, -21255794, -4312147, - 11875585, -5308580, -13853417, 16114717, -7541963, -15773267, -22531398, 47972636, -1999307, 29229400, - 3861176, 10969346, 31625992, 4574140, 21545704, -14338748, 23942296, 17379586, 5207648, 6285685, - 5871221, 20869246, 9513353, 3882651, 20154134, -8557722, 2937758, -2334315, -31479962, 14733885, - 7477538, 4310000, -19275814, -5484673, 3575560, 6122476, -5546951, -132785360, 50072876, -14671608, - -59566900, -14538464, 1498944, -15406048, 22997402, -51571820, 24831354, -4161823, -59302760, -40881648, - 8113193, 23542864, 22237194, 16320876, 34911640, 9970767, 57423712, 31439160, 67306432, 8744553, - 54672788, -42127188, -33191508, 11310796, 4743792, -33416994, 9335111, 7073811, -4668630, -12745315, - 32394790, 6195491, -71526240, -31892280, 23953032, 8248485, -15189152, 20444044, 20845624, 32482838, - 6968585, 9633612, 6051609, 9427453, 11841225, -24854976, 3758097, 4561256, -52907556, 24917252, - 18326626, 22432614, -36273148, -21049634, 26416196, 25770, -7056632, -5476084, -15532749, -13711683, - 60130, -18245022, -40684076, 13825500, 43327632, -30494268, 4198331, -17336636, -7067369, -12637941, - -3968550, 22344568, 5327907, 18461916, 5345087, -19660212, -14008036, -15968688, -9597104, -13060996, - 3088082, -8282845, -1823214, -12500502, 3944928, 6468221, 7069516, -3796751, -12530567, 208306, - 55727200, 37671160, 26046830, 14158360, 1724429, -12987981, -19789062, 17467632, -55602648, 58662812, - -36359044, 9429601, -60359324, -2233383, 56760140, 22269406, -20115480, 35985384, -57342108, 22877144, - 10677289, 3979287, -70609264, -21208548, 4314295, 11325829, 45339824, -69496864, -9397388, -23113366, - -65408056, -14388140, 15665893, 32628866, 49007724, 38044820, 37900940, -3287798, -24391120, 24919400, - 7529078, -15034533, 8931384, -32003948, 50772956, 23712514, 17166984, -26555782, -58123792, -15603616, - 1307818, -70499744, -56972740, -15058155, -51105816, 32736240, 12678743, 10118943, -23551454, -25372520, - 9801115, 7028714, 4256313, 15674483, -9859097, 11815455, 33565168, 15159087, 5662915, 4443144, - -22174916, -18683108, -16700980, 9652939, -5972152, -45221712, -36120676, -3749507, -29098404, -25879326, - -7451769, -37366216, -23444078, -6008659, 1952063, -5493263, -2493229, 8727374, -7183333, -2875481, - 1943473, 1151051, -10902774, 64126008, -50034220, 13462575, -7075959, -6493991, 1174674, 17742510, - -31166430, 41717016, -12036646, 28610924, -2785286, -23214298, 44377748, 43785044, 31331786, -14654428, - 67248448, 24906516, -75183400, 77549928, 7082401, -204011, 56049324, 2493229, -24305220, -32502166, - 55323472, -34634616, -46209552, 44781476, 39049844, -25409026, -61456688, 24131274, -21086142, 8566312, - -43226700, -35414152, -14675903, 41938208, 37645388, 5005785, 34548716, -50124416, 16192027, -13149042, - -18672370, 24084030, 3395172, 7425999, -70199096, -19159850, 39092792, -50126564, -13037373, -62895500, - -11705933, -23439784, 10640781, -15129022, 7142531, 6579890, -2130304, 6418829, -16810502, -55841016, - -10520522, 28638842, -3770981, 19900730, -21509196, -48977660, -8677981, 10965052, 31260920, 7748121, - 17121888, -1681480, 7052337, 11942157, 7219840, -16922172, 4361540, -6839736, 7402376, -13441100, - 8115341, 3463891, 977105, -1367947, -11729556, -5727339, 58100172, 4460324, -16915728, -41641856, - -1421634, -19909320, 15468325, -34398392, 21852794, 13913547, -30077656, -30850750, 46512348, -54868208, - -2164664, 35403416, -39730596, 12783970, 45457932, -36193688, 31172872, 22892176, 33365454, -54949812, - 47431472, -55177444, 16608639, -42006928, 5226975, -21494164, 37342592, 1127429, 22849226, 11776800, - -39208756, -23916526, -54196044, 31587336, -36717676, 31763430, -44150116, -50266148, -84174920, 8196945, - 44160852, -6758131, -1316408, 13952201, 38059852, -12919262, 10202695, -46497316, 11798275, 61725124, - -6259915, 55963424, 73209864, -481036, 12238509, 15053860, -31312460, 16243566, -37931004, -1902671, - -38933880, -37718404, 2179696, -14287209, -63952064, 43323336, 987843, 32231582, -37761352, -19250044, - -14471892, 16533477, -410169, -9964324, -9987946, -6429566, -2501819, 3693672, 4078072, -7574175, - 8630737, -8688719, -8701604, -4801774, 12204150, 9154723, 10136123, -4956393, 7625715, -131593504, - 33462090, 49362060, 13741748, -56981332, -8289287, 92913024, -106629008, -2622078, -17931488, -69694432, - -17527762, -47195248, 17398912, 17328046, 40873056, 16632261, -55710020, -19703162, 40291088, -63552632, - -18010946, -67972152, 58177480, 17549236, 45524504, 77560664, -27204322, -16230681, -12687333, -38680476, - 37245956, -18079664, -46130096, -51709260, -8985072, 20010252, -1348620, 10713796, 12745315, 30283814, - -13146895, -1275605, 22466974, -21421150, 43958992, 50038516, 47180216, -38001872, 5231270, -11740293, - 22640920, 94263792, 70708048, 134879152, 10823318, 53429392, 43233140, -20298016, -4496831, -6878390, - -12429635, 17190606, 4110284, 48681308, 36672580, -16254304, -4814659, -28619514, -56403660, 22913650, - -665720, 19520626, -3959960, -38895224, -5574868, 6092411, -21670258, 13417478, -13763223, -18775450, - 689342, -18814104, 66572, -5065914, -4550518, 350040, 3062312, -11669426, 1827509, 977105, - 90194, 4980015, 204264352, 98490040, 35010424, 31533650, -48687748, 31220118, -39356932, 46812996, - 38306812, 35914516, 9079561, -67033704, -37595996, 72855528, 12466143, -4355097, -15637976, 81570016, - -88701816, -37364068, -22411140, -6734509, -62895500, 14804752, -54385024, -30399778, 8748848, -34477848, - 50435800, -48960480, -21296596, -12154757, 53916872, -90067608, -17538498, -67072356, -2149631, -496069, - -58995672, 9466108, 45947560, 24874304, -1324997, -27781996, 2229088, 27601608, -37220188, 74152608, - 100785704, -6549825, -63071596, -59365036, 41394896, -15206332, -13900662, 86745456, -18762564, 27550068, - -2649995, 54470924, -11227045, 6929930, -10765336, -34832184, -96855808, -57921928, -9341554, -26134876, - -66849020, -44012676, 24779814, 55877524, -4900558, -7406671, -6262063, -9219147, 30444876, 19228568, - 4114579, -19061064, 21270826, -12646531, -44424996, -42498700, 5214091, 28834262, -34694744, 22466974, - -2478196, -13411035, -11759620, 695785, -19512036, -15088220, 590558, -5950677, -3139621, }, + +/* Sample Rate = 16000 */ + +const Word16 CRendBin_Combined_BRIR_max_num_iterations_16kHz = 23; +const Word16 CRendBin_Combined_BRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]={{23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23} }; +const Word16 CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {40, 40}; +const Word16 CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][23]={{{77, 77, 77, 79, 77, 78, 79, 79, 79, 77, 78, 77, 78, 78, 77, 79, 79, 79, 79, 78, 79, 77, 80},{77, 77, 77, 79, 77, 78, 79, 79, 79, 77, 78, 77, 78, 78, 77, 79, 79, 79, 79, 78, 79, 77, 80}},{{78, 77, 78, 78, 79, 79, 78, 78, 79, 79, 77, 79, 78, 79, 76, 79, 78, 78, 76, 79, 79, 78, 80},{78, 77, 78, 78, 79, 79, 78, 78, 79, 79, 77, 79, 78, 79, 76, 79, 78, 78, 76, 79, 79, 78, 80}},{{77, 76, 74, 79, 74, 77, 77, 77, 76, 79, 77, 78, 76, 78, 76, 78, 79, 78, 79, 79, 78, 78, 80},{77, 76, 74, 79, 74, 77, 77, 77, 76, 79, 77, 78, 76, 78, 76, 78, 79, 78, 79, 79, 78, 78, 80}},{{76, 78, 78, 78, 78, 79, 76, 77, 79, 78, 77, 79, 79, 79, 78, 79, 78, 77, 78, 79, 78, 78, 80},{76, 78, 78, 78, 78, 79, 76, 77, 79, 78, 77, 79, 79, 79, 78, 79, 78, 77, 78, 79, 78, 78, 80}},{{78, 77, 77, 76, 79, 77, 79, 78, 76, 78, 78, 78, 79, 79, 78, 78, 79, 78, 78, 79, 78, 77, 80},{78, 77, 77, 76, 79, 77, 79, 78, 76, 78, 78, 78, 79, 79, 78, 78, 79, 78, 78, 79, 78, 77, 80}},{{78, 76, 78, 77, 78, 78, 78, 78, 79, 78, 79, 79, 78, 78, 78, 77, 79, 77, 78, 79, 78, 78, 80},{78, 76, 78, 77, 78, 78, 78, 78, 79, 78, 79, 79, 78, 78, 78, 77, 79, 77, 78, 79, 78, 78, 80}},{{78, 76, 75, 78, 76, 78, 79, 77, 79, 78, 77, 77, 79, 79, 78, 77, 78, 79, 78, 79, 76, 78, 80},{78, 76, 75, 78, 76, 78, 79, 77, 79, 78, 77, 77, 79, 79, 78, 77, 78, 79, 78, 79, 76, 78, 80}},{{78, 76, 78, 77, 75, 77, 77, 79, 79, 79, 78, 79, 78, 79, 79, 78, 78, 79, 79, 79, 79, 76, 80},{78, 76, 78, 77, 75, 77, 77, 79, 79, 79, 78, 79, 78, 79, 79, 78, 78, 79, 79, 79, 79, 76, 80}},{{78, 79, 78, 76, 77, 78, 77, 77, 78, 78, 79, 79, 76, 78, 78, 79, 79, 79, 78, 79, 78, 77, 80},{78, 79, 78, 76, 77, 78, 77, 77, 78, 78, 79, 79, 76, 78, 78, 79, 79, 79, 78, 79, 78, 77, 80}},{{75, 75, 78, 78, 78, 79, 78, 78, 78, 78, 78, 79, 76, 78, 78, 78, 79, 79, 78, 79, 79, 76, 80},{75, 75, 78, 78, 78, 79, 78, 78, 78, 78, 78, 79, 76, 78, 78, 78, 79, 79, 78, 79, 79, 76, 80}},{{76, 76, 77, 76, 79, 79, 76, 79, 76, 77, 79, 77, 79, 77, 78, 75, 78, 79, 78, 79, 78, 79, 80},{76, 76, 77, 76, 79, 79, 76, 79, 76, 77, 79, 77, 79, 77, 78, 75, 78, 79, 78, 79, 78, 79, 80}},{{76, 79, 76, 74, 78, 78, 77, 77, 78, 79, 78, 78, 77, 77, 79, 77, 79, 78, 79, 79, 77, 78, 80},{76, 79, 76, 74, 78, 78, 77, 77, 78, 79, 78, 78, 77, 77, 79, 77, 79, 78, 79, 79, 77, 78, 80}},{{76, 78, 79, 78, 76, 78, 78, 78, 77, 78, 74, 77, 79, 78, 78, 79, 79, 79, 79, 79, 77, 79, 80},{76, 78, 79, 78, 76, 78, 78, 78, 77, 78, 74, 77, 79, 78, 78, 79, 79, 79, 79, 79, 77, 79, 80}},{{75, 78, 78, 76, 78, 77, 78, 78, 77, 78, 78, 79, 79, 79, 75, 77, 79, 79, 79, 76, 79, 77, 80},{75, 78, 78, 76, 78, 77, 78, 78, 77, 78, 78, 79, 79, 79, 75, 77, 79, 79, 79, 76, 79, 77, 80}},{{78, 77, 77, 78, 76, 78, 78, 76, 78, 79, 79, 79, 79, 79, 76, 79, 79, 79, 79, 76, 78, 79, 80},{78, 77, 77, 78, 76, 78, 78, 76, 78, 79, 79, 79, 79, 79, 76, 79, 79, 79, 79, 76, 78, 79, 80}}}; +const Word16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz = 77; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_Q_16kHz_fx = 15; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{7302, 7423, 8167, 6838, 7204, 7193, 7556, 8147, 8234, 8647, 7988, 9214, 9265, 8574, 8959},{7302, 7423, 8167, 6838, 7204, 7193, 7556, 8147, 8234, 8647, 7988, 9214, 9265, 8574, 8959}}; +const Word16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]={{46, 46, 46, 46, 46, 46, 46, 49, 49, 53, 53, 53, 54, 54, 59, 59, 59, 65, 65, 65, 65, 65, 65, 65, 65, 71, 71, 71, 71, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 77},{46, 46, 46, 46, 46, 46, 46, 49, 49, 53, 53, 53, 54, 54, 59, 59, 59, 65, 65, 65, 65, 65, 65, 65, 65, 71, 71, 71, 71, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 77}}; +const Word16 CRendBin_Combined_BRIR_coeff_Q_16kHz_fx = 14; +const Word16 CRendBin_Combined_BRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1799]={ + { + {177, 44, -69, 3, -35, 44, 178, -15, -117, -177, 19, -133, -38, -40, 30, 94, -136, -67, -42, 7, -81, -142, -55, -120, -64, 25, -6, -55, -11, -16, 15, -127, -32, 51, 109, 55, -16, -16, 5, -121, -82, 26, 8, 31, -32, 26, -26, 47, -25, 89, 91, -9, -2, 69, 27, -6, 7, -148, -92, -24, 55, -62, -129, -83, -61, -93, 56, -169, 51, 164, -87, -44, -79, 73, -31, -96, 14, -151, 151, -58, -2, 142, -84, 55, -13, 19, -100, -205, -45, 79, -55, 48, 68, 59, -48, 34, + -129, -23, 28, 52, -8, -3, 12, 31, -110, -87, 33, 73, -41, 77, 141, -195, 23, -93, -69, 45, -30, 122, -43, 110, 51, 19, -14, 60, -3, -10, -68, 178, -129, -35, 55, 71, -10, -57, 26, -63, 60, 17, 16, 3, -33, -18, 82, -230, 45, -26, -144, -18, 102, 55, 43, -77, 37, -37, -284, 202, -113, 37, 29, -4, -69, -16, -165, -202, 41, -48, 49, 49, 161, -152, 10, 106, 103, -125, -133, -76, -117, -1, -47, -94, -75, -11, -205, -196, -51, 25, -28, 4, -34, 30, -114, 106, + -53, 55, -27, 35, -105, 19, 52, 65, 21, 2, 14, -47, -91, 142, 104, 35, -73, 179, 116, -71, 108, -26, -113, -41, -52, -105, 37, 44, 10, -88, 112, -114, 47, 79, -50, -15, -173, -82, -172, 7, 229, 105, -88, 39, 30, 366, -109, 105, 178, -34, 161, 67, 109, -144, -55, -169, -80, 115, -5, -80, 18, -118, -11, -77, 107, -46, -17, -42, 55, 27, -1, -12, 45, -177, -141, 63, 13, -16, -94, 215, 57, -25, 66, 86, -4, 44, 15, -103, 90, -123, -100, 115, -140, 118, 45, -99, + 167, 96, 59, -45, 149, 39, -30, -44, 39, 20, -37, -183, -37, -36, 41, -114, 114, -42, 83, -82, 1, -35, 380, -319, -280, -92, 290, -43, -161, 199, -136, 93, -10, -220, -150, 182, -121, 90, -126, 120, -56, -35, -16, -121, 61, 87, -123, 29, -63, 24, 53, -18, 77, 24, 63, 103, -133, -97, 117, 7, 91, 91, -85, -123, -51, 23, 162, -175, 72, -195, -241, -54, -138, -20, -163, -307, -164, 148, 135, 92, -102, 302, -90, 57, -162, -147, 44, 9, -11, -184, -57, 0, -29, -19, -77, -59, + 21, 15, -51, 491, -158, 231, -59, 310, -58, -45, 53, 65, -51, -351, 36, -31, -93, -2, -16, 129, -40, 305, -39, 38, -21, 174, -34, 63, -141, -1, -97, -96, -29, -24, 0, 114, -194, -52, 64, -17, 132, 37, -36, -83, -90, -88, -179, 74, 72, 74, -311, -37, 214, 131, -53, -1, -100, -202, -229, 234, -74, -139, -89, 133, 91, 24, 103, 59, 99, -37, -225, -59, -102, -94, 153, 104, -6, 170, 218, -26, 77, -742, 392, 136, -44, -43, -9, -122, -215, -55, 89, 299, 198, -293, -64, -179, + 105, -25, -392, -123, 224, 134, 70, 188, 111, -31, -35, 48, -155, -96, 24, 163, -82, -156, -220, -116, 96, 331, 15, -70, 64, -80, -262, 9, -187, -150, -175, 94, -18, -246, 37, 81, 86, -266, -149, -104, -70, -36, -101, -53, -128, -256, -33, -218, -258, -163, -47, 41, -151, -222, 66, 177, -9, -26, -16, 109, -142, 136, 121, 145, -312, 105, -159, -36, 31, 79, -21, 146, -4, -42, -433, 186, -86, -101, 145, -257, -345, 127, -125, -171, -57, 294, 186, -124, -72, 129, -48, -28, 36, 125, 250, 148, + 201, -46, -13, -9, -140, 20, -61, 332, -269, -169, -143, -147, 81, 31, 122, -38, -177, -252, -70, -310, -409, -100, 10, 297, 62, -270, -65, 216, -101, 58, 71, 110, -189, -307, -125, -168, 451, 24, -142, 68, 78, -58, 66, 59, -47, 198, -216, 270, 91, -12, 189, -25, -217, -32, -12, 231, -117, -20, -60, 46, -61, 25, 79, 116, 157, 111, 54, 400, 159, 140, -11, -293, 26, -241, 84, -159, 48, 15, 104, 492, 141, -58, 177, -119, 151, -67, 254, -118, 3, -168, 118, 209, -217, 469, -106, 55, + -65, -98, 53, -110, -381, 91, -92, 6, -232, 86, -79, -364, -173, -76, -343, 236, 515, 652, -568, -396, -219, 74, 168, -96, 121, -89, 54, 282, 360, -107, 244, -391, 627, 37, 377, 152, -100, -104, 351, -169, 231, 278, -8, -155, 35, 287, 173, 159, 142, 0, 67, 112, 359, 259, -154, -129, -2, -54, -12, -152, -92, 190, 320, 98, 470, -102, 511, 44, 254, 558, 405, 144, 135, 264, -27, -194, 25, 249, -105, -227, 35, -19, 516, 414, 22, 574, -22, 318, 184, 255, -3, -171, 276, -30, 319, 219, + 642, -322, -30, -656, 168, -290, -21, 307, -48, 163, -22, -394, -287, 151, -230, 142, -135, 45, 379, -58, -339, 99, -136, 359, -362, -257, 163, 174, 271, 11, -14, 169, -89, -254, 172, -104, -190, 61, 213, -147, 389, 150, 2, 47, 199, 78, -623, 258, -48, -71, -92, 336, 21, 357, 34, 26, 60, -102, -18, 169, -183, 41, 604, 43, 451, 25, -63, -56, -263, -606, -408, 187, 301, -129, 487, 184, -297, -202, 448, 281, 301, 66, -84, -5, 11, -236, 50, -95, -485, 207, 412, 175, 158, 468, 397, 335, + 42, 143, 54, -43, -56, 100, -5, -234, 88, 286, 27, -46, 110, -615, 244, -228, 190, 245, 227, -214, 161, 2, 26, 407, 309, 31, 181, 137, -20, -191, 85, 212, 36, 297, 114, 271, 516, 51, 228, 233, 292, 15, -132, 443, -127, 363, -363, -301, 493, 2, 187, 295, 436, 542, 256, 98, -213, 141, -11, -434, 433, 272, -325, 7, 59, -412, 181, 374, 305, 91, -1077, -674, 202, 214, 422, 712, -215, -124, -247, -224, -289, -301, 6, 108, 73, 448, 0, 440, -43, 147, 186, 153, 311, 232, -7, 288, + -28, -40, -194, 194, -53, -441, -405, 234, -83, 519, 282, 333, 93, -658, 126, 411, -97, 119, -136, 82, 481, -18, 396, 725, 1, -272, -49, 10, -499, 617, 247, -79, -83, 448, 159, -536, -493, 177, -247, 262, 127, 84, -273, -369, -83, 77, 14, 390, -562, 50, -209, -156, 756, -896, -250, -436, -17, 144, 25, 604, -621, 296, -84, 122, -74, 333, -181, -305, -25, -87, 235, -17, 159, 354, -72, -259, -34, 398, -231, 98, 90, 20, -35, 395, -14, -97, -652, 215, -160, -408, -358, -90, -397, -229, -344, 170, + -406, 413, -372, 259, -192, 501, -476, -270, -70, 295, 121, 12, -193, -381, 44, 164, 563, 305, 127, -307, 196, -270, -314, 295, -299, 159, 371, 313, -49, -56, -270, 388, -17, 262, 533, 725, -699, 571, 409, 51, 304, 953, -225, -232, 121, 303, 415, 158, -326, 438, -116, 845, 12, -102, 296, 245, 245, 23, 796, -603, 188, 19, 242, -234, -495, 292, 239, 243, -153, -112, 669, 268, 833, 101, -266, -5, 208, -44, 861, -79, 481, -56, 774, 295, 229, -160, -16, 432, 32, 459, 355, 405, -495, 98, 387, 455, + 347, 262, 609, 736, -552, -72, 1106, -275, -286, 661, 853, -11, -50, -521, -376, 346, 729, -3, 257, -549, 603, -261, -139, -478, -288, 1090, 61, -708, -283, 11, 52, -66, 865, 412, -18, -310, 21, 244, -46, 1116, 287, 506, 222, -217, -555, 172, 54, 123, -413, -25, -257, 392, 70, 85, 450, -320, -180, 99, 91, 137, -448, -389, -820, -447, 123, -491, 157, -349, -132, 696, 307, -298, 302, 105, 105, 675, 5, 815, 422, -297, -820, 213, 297, 577, -117, -574, -52, 263, 272, -39, -308, -128, -384, -12, 472, -570, + -56, 811, -203, 225, 63, 89, -806, 628, -90, -645, -392, 308, -120, 145, -31, -278, -221, 94, -222, -63, -41, -924, -267, -625, 103, 198, -37, -284, 75, -145, 322, -818, 20, 123, 424, -365, 391, -360, 235, 57, 294, -539, 121, -275, -596, 345, -491, -921, 90, -101, 669, -361, 54, 311, 425, 518, 7, -201, -389, -8, 200, 334, -763, 770, -67, -556, -461, -727, 222, 124, 201, 64, 427, -322, 560, -135, -404, -702, -34, 339, -179, -758, -148, -1093, 482, -1205, 668, -842, -741, 171, 575, 423, -436, 395, 731, 105, + 80, 149, 35, -482, 514, -952, -607, 21, -92, -90, -158, -260, 87, 815, 183, 86, 43, -431, 455, -122, -891, -164, -20, -15, -622, -446, 408, -180, 729, 107, -41, -663, -387, 194, 56, -210, 614, -563, -365, -65, -88, 576, -2, 679, -56, -651, 87, -566, 319, -134, 440, 891, -1568, 374, 37, 132, 322, 34, -804, -48, 97, 1212, 1043, -353, -460, -69, -866, 438, -86, 137, 25, -463, 1214, -584, -2245, -370, 404, -1534, -291, 417, -1296, 126, 786, -629, 784, -836, 669, 821, -590, 186, -113, -33, -267, -398, -95, 484, + -376, -631, -345, -519, -78, -420, -88, 135, -115, 465, -490, -627, 427, -661, -918, -1206, -424, -89, 199, 574, -290, 220, 275, -276, -122, 980, -718, -100, 696, 148, 540, -218, 178, 700, 377, -106, -57, -544, 67, 575, -424, 115, -399, -366, -264, 1097, 739, -1069, -225, 946, -301, -592, -428, -592, -362, 958, 570, -78, 419, -104, 513, -332, -205, 1068, -465, 196, -331, -112, -36, 296, 841, 339, -615, -166, -57, -82, 456, 73, 840, -250, 115, -82, 217, -724, 400, -666, 414, -26, 625, -165, 449, -219, 105, 296, -345, 307, + 619, 857, -512, 877, 296, 1037, -369, 202, -117, -119, -283, -66, -434, -1686, -1160, -330, -125, 167, -2, 364, 407, -765, -22, 82, 478, 824, -1220, 1126, -343, -352, 282, 517, -958, -203, 7, 176, 41, -41, 465, -302, 52, 235, 268, 381, 319, 94, -528, -120, 699, -703, -595, 716, 243, 500, 793, 1224, -288, -807, 1044, -442, -183, 1077, 338, -421, -1148, -773, -119, -441, 533, 1058, 549, -390, 1104, 352, -404, 285, 1235, 338, 237, -281, -993, -1350, -1058, -96, 800, 225, 507, 1877, 937, -1156, -761, 483, -1559, -737, 1316, 446, + -1628, -1321, -622, -725, -987, -526, 391, -9, -1652, 1211, 543, 418, 512, -143, 620, 513, 720, -91, 972, -547, 748, -220, -497, -135, -843, 128, -282, 349, -181, -309, 896, -943, 676, 0, -379, -137, 424, 459, 355, 837, 697, -434, -48, -385, 412, -338, 334, 419, 230, 248, 198, -199, 943, -53, 321, 118, 468, 256, -1003, 98, -574, 191, 534, -58, -383, -383, 1058, -1015, -772, 1583, -583, 435, 236, 534, -148, 300, -978, 124, 1098, -485, -312, 911, 56, -688, -115, 523, -1009, -4071, -4389, -171, -2522, 2215, 8045, 3497, 4850, 6118, + -2319, -1650, -655, -5515, -3849, -1262, -6033, -2645, -536, -2483, 590, 5652, 5152, 5555, 7227, 4335, -385, 1605, -1613, -6441, -3482, -2600, -5325, -3676, 218, -4128, -1340, 888, -4095, -2126, 3092, 1177, 3355, 8278, 6762, 5431, 9833, 7105, -91, 1009, -1803, -8821, -8381, -8694, -13475, -9164, -5610, -5544, 116, 4370, 4989, 6911, 10548, 9706, 8262, 8076, 4672, 1592, 278, -547, -3585, -6182, -7164, -7097, -8523, -4600, -966, 2028, 7215 }, + {268, 57, -7, -45, -87, -66, 78, 102, 51, 83, 15, -60, -9, 4, -62, -63, -122, 174, -80, 151, -108, -133, 17, 213, -15, 86, -25, 60, 89, 67, 113, 72, -213, 12, -118, 35, -56, -27, -42, 7, -19, -41, 1, -22, 108, 31, 11, 90, 86, 16, -49, -43, -47, 50, -4, 6, -84, 218, 99, 52, -40, -47, 95, 25, -9, 29, -49, 26, -69, 1, 53, -92, -59, -30, 10, 16, 24, -242, 110, -274, 48, 15, 12, -189, -70, 46, -45, 55, 92, 53, -7, 71, -212, 0, -12, -10, + 110, 169, -187, -46, -115, -41, 61, 115, 15, 25, -49, -64, -52, -42, -87, 41, -87, -61, 92, -86, 65, 7, -209, -74, -117, -32, 84, -65, -21, -64, -65, -48, 83, 126, 21, 68, 55, -73, -133, 67, 56, -32, -114, -97, 84, 15, 64, 29, -172, -57, -62, 92, 41, -155, 43, -70, -8, 8, -328, 228, -153, 29, -14, -55, 177, -143, -92, 6, 187, -61, -2, -13, 156, -84, -230, -47, -114, -161, 15, -8, 36, 102, 168, 104, 25, 248, 104, 13, 183, 186, -5, -93, 17, 85, 74, 3, + -24, -136, -113, -56, 150, 62, 250, 140, 1, 84, 110, 37, -136, 165, -51, 88, 7, 55, -163, -24, -42, 67, -39, -62, 200, -8, -123, 60, -88, 92, -41, 143, 134, 135, 56, -105, 77, -2, 64, 63, 71, -1, -69, 66, 24, 17, 30, -270, 82, -174, 25, 50, 54, -83, 138, 17, -55, -30, 161, 112, -74, -98, -78, 57, 114, -77, -80, 16, -303, -8, -130, -58, -130, -175, -23, 145, 40, -144, -38, 122, 38, -92, 146, -73, -207, -70, 114, -60, 136, 252, 211, 19, -4, 64, -33, -165, + 1, 47, -111, 81, -219, -45, 13, -106, -72, 83, 190, -161, -153, 77, 90, 154, 46, -108, 90, 84, 1, 88, 454, -173, -75, -27, 328, -30, 249, -177, 219, -213, -186, 47, 105, -125, -29, 67, -14, 86, -128, 153, 57, -160, -4, 67, 53, 31, 308, 246, 193, 2, 126, 13, 38, 93, -281, -42, 174, 113, 135, -2, -49, 63, -10, 346, -51, 59, 36, 17, -101, 208, -23, 216, -118, -125, 89, -83, -288, -133, 57, -28, -206, 57, 0, 267, 22, 22, -83, 95, 95, -25, -18, 224, 160, 140, + -101, -146, -141, 323, -271, -15, -283, -190, -115, 230, 132, -342, -462, -185, 153, 104, -75, 145, -5, -49, 11, -249, 65, -42, 14, 64, 10, -12, 94, 76, -165, -170, 175, -70, -94, 98, -316, 61, 60, -300, 99, 283, 175, 189, 37, 97, 277, 37, 50, -338, 167, 227, 195, 21, 199, -248, 224, -87, -229, -368, -6, -242, -181, -98, -215, -553, 21, 4, -21, 58, 256, 71, 98, 39, -186, -7, 69, 40, 58, 7, -127, -720, 349, 42, -282, 64, -35, -85, -61, -161, 81, -84, 12, 100, 91, 307, + -130, -299, 157, -379, -167, 59, 47, 41, 117, 149, 125, -5, 167, 9, -73, 227, 136, -71, 131, -238, 442, 16, 78, -43, -389, -67, -148, -135, 54, 319, 3, 13, -47, -88, -213, 66, -40, 115, -267, 89, 134, 62, -198, -67, 46, 28, 152, 34, 539, -151, -236, -258, -83, 13, 190, -244, -20, -92, 106, -304, -12, -35, -40, 29, -104, 311, -116, -90, 57, 82, -273, -277, -253, -240, -382, 220, -229, 52, 78, 323, -67, -94, 252, 47, 44, -324, -214, 138, 55, 106, 171, -341, -7, 124, 300, -19, + 19, -63, -10, -229, -51, -82, -406, -48, 111, -244, 87, -264, -11, -188, -45, -71, 13, 301, -102, -14, 155, -111, 87, -284, -480, -276, -151, -87, 42, 294, -156, 63, 69, -249, 69, -195, -67, 90, 303, -70, -35, 80, -22, -267, -254, -191, 167, 324, 339, -92, 39, 356, -345, -305, 274, -54, 44, 251, -40, -56, 248, -435, 197, -9, 82, 228, 231, -238, 54, -332, 112, -91, -31, -227, -6, -330, 39, -284, 213, -91, 45, 384, 177, 180, -291, 69, 348, -67, -483, 277, -55, 63, -92, -210, 326, 132, + 266, 83, 42, -200, -278, 119, 135, 159, 190, 450, -12, -315, -215, 281, -35, -267, -73, 5, -76, -335, 7, 72, 89, -99, 190, 29, 47, 277, 59, 229, 245, -311, 352, -86, 372, -315, 274, 25, -36, 466, -253, 23, -245, -76, 712, 342, 146, 99, 198, -120, -8, -612, 106, -30, -270, 287, 212, -13, 45, -355, 302, -168, 321, 211, 168, -256, -51, -215, 309, 69, -122, 556, 260, -66, 22, -466, 72, 19, 361, -168, -478, -83, -137, -94, -673, -334, -716, -362, -260, 82, -184, 334, 36, -383, 226, -255, + 357, -319, -263, 190, 307, 313, 6, -239, -207, 130, -96, -467, -550, -373, -78, -34, -96, 98, 161, 105, -29, 44, -195, 83, -366, -495, -15, 334, 33, -153, 257, 145, 248, 443, 29, -171, -332, -265, 104, -300, -224, 44, -252, -505, -298, -53, -92, 85, -145, 239, 39, 74, 328, -86, 3, 58, -334, 317, 14, -348, -568, 104, 0, -410, 354, 230, -403, 87, 284, 157, 34, 246, -188, -149, -43, -195, -318, 383, -454, -91, 75, -17, 543, -593, 31, -198, -100, 41, -333, -49, 77, -143, -358, 285, -634, -454, + 308, -30, -579, 273, -346, 621, 109, -851, -125, 62, -230, 49, 127, 283, 236, -500, -40, 32, -120, -458, -88, -105, -173, -148, -26, 21, 359, 404, -149, 212, 173, 178, 394, -6, 91, -487, -185, 158, -115, 220, 546, 74, -519, -1118, -24, -350, 293, -218, -135, -226, -620, 253, 777, 39, 187, -635, 107, -79, -307, 65, 281, 151, 216, -266, 345, 176, -456, -513, -76, -386, -1207, -763, 549, 441, 720, -4, 286, 69, 230, -11, 150, -321, -377, -240, -336, -224, -237, 287, 696, 145, -835, -206, 155, -230, 214, -489, + -30, -24, 38, 226, 188, 23, -47, -118, 208, 370, -293, -486, 329, 137, 429, 175, 617, -430, -129, 368, 591, 481, 314, 122, -103, 19, -51, -18, 221, -771, 427, -82, 134, -74, 596, -200, 21, -153, 392, 277, -607, 426, -506, -57, -238, -279, 229, 44, -601, -107, 80, -102, 679, -738, -9, -416, -1189, -133, -433, -937, 198, 2, -175, 67, 517, -25, -527, 192, 31, -165, -120, -88, 37, 593, -121, -14, 276, 204, -74, 291, 270, -117, -112, -227, 337, -70, -549, 93, -25, 200, 748, -483, -775, -489, -217, 116, + 276, 147, 573, 287, -380, -220, -523, 473, 302, 59, 115, -302, 49, -320, 580, 558, 57, -253, -126, 58, 531, 1030, 647, -93, -210, 12, 318, 131, 239, 316, -335, -26, -547, -233, 260, 304, -537, -21, -255, 488, -438, 142, 90, 909, -485, -107, -500, -70, -494, -405, -281, 219, -535, -372, -586, -111, -48, -143, -238, -654, 232, -447, 249, -471, 692, 152, 337, -72, -560, 379, 237, -150, 374, 511, -198, -599, -302, 934, -326, 29, 72, -90, 243, 629, 152, 304, -131, 471, 58, 386, 151, 176, 45, 104, 751, 285, + 1724, -940, 710, 996, -178, 107, 537, -240, -21, 802, 333, -53, 452, 25, -583, 905, 1015, -7, 729, 722, -59, 311, -766, -257, 648, 37, 640, 889, 741, -180, 480, -796, -1208, -543, -458, 257, -7, 276, 326, 688, 552, 159, -576, -106, 567, 145, -282, 328, 786, -130, 274, -686, 309, -552, -134, -368, -661, 360, 53, 149, 806, -483, -473, 234, 840, -706, -419, 210, -192, 1107, 886, -885, -285, -715, 63, 642, -297, -566, -187, -30, 214, -666, 188, 1106, 145, -835, -1097, 854, -1025, -882, -284, -485, -354, 250, 153, -251, + 143, 60, -1134, -682, -865, 160, 402, 103, 645, 566, 831, 215, 913, 370, 573, -364, -166, -366, -785, -593, -1190, -742, -263, -731, 105, -89, -58, 209, 185, 39, 516, -205, -497, 597, 25, -946, -414, -163, -1089, -870, -811, 2, 345, 31, -434, -124, 414, 197, 1025, 120, -1438, -548, -266, 147, 201, -242, -391, 441, -796, -228, -639, 391, -1243, -850, -1011, -887, 35, -516, -372, -816, 317, 1075, -154, 771, -375, -50, -336, -293, 799, 326, 805, -1333, 566, 998, -110, 1151, -624, -1754, -924, -10, -192, 198, -647, 612, 837, -764, + 660, -414, -541, -1215, -525, -692, -491, -549, 525, 98, -1127, -1387, 1030, 260, 347, -307, 50, -357, -27, 349, 452, 473, 1149, 69, -896, 1186, -168, -264, -584, 525, -1000, -596, 486, -450, -796, -881, -873, -123, 45, 142, -318, 1058, 779, -20, -563, -772, -1042, 305, 119, -117, -201, 1424, -1, -300, 574, 42, -801, 735, 921, -587, 550, 1665, 735, 44, -549, 798, -6, 62, -373, 728, -832, 617, 597, 624, 308, -223, 831, 1035, -201, 429, -630, 1041, 453, 350, -652, -1446, 299, -442, -320, -586, -728, 448, 212, -359, 95, 35, + -378, -1771, -98, -377, -168, -29, 1260, 848, -401, 318, -806, 88, 629, -943, -856, -722, 1145, -819, 251, 899, -1205, -1143, 1061, 819, 893, 1158, 451, -1516, 356, 427, -116, 2423, -244, -378, -1081, -897, 482, -927, 657, -170, 669, 511, -919, -230, 425, 1285, 161, -991, 1555, 420, -42, 1124, 587, 920, 381, -1226, -224, -423, 662, 1550, -889, 297, -396, 721, 824, -954, 901, -755, -670, 426, 752, 84, 288, 593, -757, 774, 115, 933, -97, -180, 345, 1355, -527, 1104, -451, 262, 333, 1101, -4, -19, 418, 1633, 161, -1193, -45, -1447, + 952, 47, 2502, 565, -660, -177, 592, -504, 910, 1631, 1143, 54, 511, 718, -38, -705, -68, -147, -2427, 1577, 1121, 989, 548, -1038, -1028, 982, -573, 997, -872, 168, 493, -445, 92, 198, -217, -468, -877, 1391, -278, -262, -428, -69, -156, 456, -892, -262, -543, 204, -544, 564, 38, 290, -600, -1173, 100, -858, -848, 402, -637, -586, 1186, -425, -610, 78, -626, 312, 487, -134, -495, -174, 387, 273, -187, -39, 1069, -194, -545, -802, -38, -362, -1102, 1087, 464, -1376, 919, -85, -478, 2578, 1563, 1172, 736, 334, -513, 63, 381, 276, + 292, 977, 415, -291, -458, -1813, 331, -129, -1172, 2034, 277, 681, 380, -479, 394, 589, 161, -36, -468, -63, 156, -205, -154, 107, 245, 608, -388, 269, 42, 491, -148, 116, 172, -514, 454, 95, 125, 181, 178, -315, 379, -269, 90, 373, -174, 367, -132, 456, 348, 220, -519, 425, 316, 270, 676, -609, -44, 23, -125, 225, -320, -500, 373, 441, 214, -19, 94, -25, 218, -153, 90, -360, 360, -577, 576, 353, -190, 26, 224, 49, 192, 41, 31, -29, -189, 385, -1610, -3748, -601, 2188, 1988, 4897, 2558, -1324, -407, -2719, + -4607, -323, -2093, -297, 3353, 1426, 2591, 3973, -463, -590, -2022, -3448, -2735, -185, -1027, -397, 2857, 896, 1857, 3363, 554, -24, 352, -2064, -3107, 522, -3213, -2116, 718, -335, 527, 4122, 478, 1570, 3378, -685, 111, 739, -3249, -2731, -956, -3724, -1429, 458, 694, 2535, 3599, 2543, 1814, 1556, -587, -2188, -1773, -2708, -2812, -1228, -697, -7, 2325, 2687, 795, 1991, 568, -665, 695, -899, -1436, 222, -842 } + }, + { + {231, 49, -64, -23, -213, -114, 50, -11, -11, 186, 156, 34, -45, -38, -103, 93, 10, -62, -32, -59, -28, -15, -141, -129, 115, 107, 46, -132, -62, -31, 58, -49, -66, -11, 5, 28, 62, 13, 89, -114, -107, -142, -105, -57, 13, -18, -20, -60, 21, -16, 11, 102, 75, -38, -77, -55, 28, 24, 9, -8, 197, 123, 18, -38, 8, -115, 4, -7, 27, -16, -68, 102, -137, -3, -11, -10, -74, 17, -138, 139, 33, -80, -37, -174, -49, 141, -79, -58, 42, -25, -8, 6, -48, -40, 172, 82, + -24, 5, -28, -55, 22, 59, 93, -28, 34, 41, -157, -51, -3, -34, 92, 5, -35, 81, -67, 25, 130, -77, 6, 14, 98, -43, 136, -200, -74, 81, -42, -171, 9, 28, 52, 52, -21, -77, 3, -71, -48, 13, 78, 69, -115, 90, -126, 100, 1, 85, -43, -88, -40, 47, -20, -21, -30, 46, -93, -467, 153, -170, -68, -139, -143, 81, -48, -120, -65, 164, 243, -133, -50, -12, -176, -165, 12, -16, 107, 36, 79, -70, -44, -91, 25, 158, 68, 31, -102, 77, 23, 48, -66, 7, 23, 36, + -90, -65, 24, -123, -127, 56, 96, -107, -55, -40, 8, 98, 77, 35, 15, 250, 98, -76, 97, 71, -68, 120, -43, -26, 0, -48, 105, -55, 29, 68, 52, -86, 40, 22, 23, -20, -42, -14, 130, 13, 4, 63, 358, 144, -22, 19, 84, 45, -22, -151, 7, 139, -137, -13, -260, 71, 109, 10, -60, 194, 137, -121, 62, 10, -106, 174, 97, -8, 72, 166, -48, -31, 13, 4, 6, 42, 203, 43, 32, -321, -15, 18, 41, -144, 37, -115, -88, -122, -79, 4, 40, -74, 79, -183, -104, -8, + 1, 63, -71, -14, -64, 43, 104, -58, 14, -50, -7, 158, 125, -47, 117, -54, -91, -114, -4, -25, -63, 38, -12, 571, -233, 57, -10, -93, 100, 168, -92, 180, 1, 191, 60, 75, -67, 113, 50, 116, -210, 129, -120, 52, -99, 150, -27, 151, -71, 63, -43, 0, 5, -2, 66, 302, 24, 98, -69, -122, 17, 16, 17, 57, -81, 204, 0, 173, 23, -54, -75, -224, 130, 93, -99, 29, 109, 68, -265, 184, 5, 137, -152, -160, -71, -154, -15, 227, 62, -52, 34, 142, -13, -57, -19, -65, + 103, -91, 31, -4, 19, 43, 150, -340, 73, -105, -311, -238, 132, 148, 192, -90, -46, 134, 65, 199, 66, -17, 22, 129, 244, -57, 72, 2, 198, 50, -10, -34, -148, -222, 4, -27, 70, -7, 55, 46, 15, 21, 46, -71, 9, 115, 170, -75, 21, -65, -97, 147, -107, -259, -105, -60, 129, 20, 142, 139, -69, 16, -111, -5, -48, 176, -209, 5, 70, -209, -249, 17, 77, 171, -107, -243, 136, -215, 255, 149, 41, 130, 54, 20, 225, -768, 149, 31, -390, -490, -85, -380, 295, 79, -232, 6, + -112, 26, -161, 12, -16, -6, 206, -84, -57, -97, -86, -209, -142, 194, -91, 120, -120, 47, -4, 107, -124, 79, -125, 44, -52, -81, 67, -196, 66, -104, -41, -144, 324, 150, 284, -131, 116, 91, -63, 44, -143, 139, 313, 245, -180, -53, 70, -133, -89, -227, -418, -146, 211, 72, -104, 39, 21, -115, -191, -189, 137, 21, -256, -6, 13, -9, -1, -297, -124, -77, 225, -59, 53, -231, -243, 13, 70, -140, -82, -131, 275, 63, -93, -199, -200, -192, -56, 96, 275, 93, 155, -121, 293, 172, 52, 7, + 301, -173, 26, 100, 202, -328, -172, 149, 55, -41, 343, -147, 94, 214, 61, 40, 148, 68, 71, 83, 28, 95, -11, 138, -37, 330, -242, 273, 205, -177, 202, 46, 170, 187, -405, -3, -25, -112, 53, -99, 96, -37, 223, -18, 32, 100, 28, 82, -34, 406, -95, -52, -88, 292, 158, 40, 118, -182, 432, 149, -23, 169, 214, -335, -13, 91, 51, 9, 302, -131, -166, 411, 72, -19, -29, 219, 27, -21, -28, -88, 116, -51, 151, 107, -241, -231, 43, 484, 7, 106, -279, 154, 208, -111, 158, 189, + -282, -171, -22, -370, -186, -216, 83, -67, -68, -30, 284, -354, 180, 92, -99, 237, -122, 37, -285, 10, 211, 184, 373, -376, -68, -393, -55, 62, -7, 90, 23, 201, 279, -294, 19, -177, 528, -210, -117, 460, 349, 72, -620, -144, 298, 33, -22, -80, -41, -39, 52, 107, 97, 94, 565, -106, -73, 10, 81, -156, 106, 69, -13, -173, -107, 211, 223, 417, 111, -158, 110, 5, 111, 17, 233, -179, -274, -280, 196, -73, 46, 85, -98, -10, 490, 174, -403, 299, 97, 498, -250, -232, 145, 271, 185, 108, + -44, 20, 126, -156, -49, 8, 197, -138, 379, -8, -46, -156, -173, 388, 208, -380, -324, -131, 108, 110, 568, 550, -72, 36, 18, -5, -13, -124, -381, -296, -155, 123, -110, -335, -98, 52, -30, -510, -152, 101, -56, 38, 30, 140, 216, 26, -164, 152, 165, 109, -10, 209, -442, 137, -391, 474, -346, 122, -366, -71, -409, -225, -255, -284, 188, -251, -47, 76, -2, -138, -92, -51, -396, 5, 29, 190, -618, 8, -12, 284, 355, -242, -137, 9, 271, -504, 328, -208, -137, 6, -405, 16, 72, -317, -791, -329, + -167, 112, 188, -275, -116, -341, -300, 125, -266, 230, 84, 158, -50, -274, 418, 149, 226, -337, 114, 32, -474, 256, 150, -9, -327, -145, 135, 135, -25, 29, 204, -243, -176, 233, -535, -539, -688, -179, 200, -618, -507, -328, -5, 182, 53, 29, -4, -202, -249, -589, 281, 51, 662, -194, 6, -451, -511, 29, 311, -13, -326, 172, 73, 421, 35, 21, -227, -74, 179, -439, -731, -189, -182, -47, 163, -709, -543, -243, 390, -20, 661, 142, -48, -352, 138, 686, -695, -617, -202, -89, -434, 434, 128, 244, 275, -423, + -48, 197, -275, 542, 10, 139, -149, 151, -343, -173, -118, 220, 93, 342, -520, 73, -5, -359, 420, -223, -620, 153, 219, 77, -189, -11, -262, 77, 204, 126, -430, 204, -104, -429, -286, -533, 3, -45, -26, 122, 341, 488, 353, -135, -332, 159, -93, 0, -253, 503, 339, -1, 577, -334, 244, 323, 206, 262, -625, 78, 6, -396, 57, -880, -761, -183, -8, 31, -20, -314, -12, -91, 280, 53, -19, 50, -665, 227, 123, 366, 152, 157, 432, 212, 61, 1079, 230, 412, 572, 23, 403, 97, -227, 258, 16, 121, + -223, 10, -146, 85, -146, 297, 33, -198, -241, 24, -647, 364, 247, -44, -64, 134, -177, -156, -218, -270, 204, -221, 340, 388, 388, 404, -115, -671, -10, 241, 619, -171, -44, 266, 332, 519, -85, 128, -240, -188, 556, 714, -486, -509, -682, 665, -41, -230, 248, 242, 623, 526, 59, 574, 801, 250, -366, 401, -337, -173, -48, -224, -279, 191, -126, -120, -341, 875, 134, -415, 29, -27, 406, 433, 187, -227, 432, -73, 278, -734, 70, 358, -300, 149, -328, -254, 826, 370, 271, -16, -673, -131, 237, 194, 147, -124, + 595, -350, 346, -140, 241, 273, 481, 648, -662, 30, 398, 226, 535, 520, -645, 58, -121, -268, 96, -152, 525, 1055, 37, -516, 135, -348, 211, -303, -328, 959, -743, 1205, 732, -185, 234, 579, 75, -919, 348, -746, 165, 61, -377, 11, -61, 525, -276, -30, -32, -164, 1105, -67, -180, 142, 364, -383, -817, 634, -115, -50, 710, -426, -131, -506, 122, -353, 394, 377, 755, -219, 201, 516, -745, 92, -481, -732, -955, -490, -1031, -1136, -177, 78, -555, -574, 341, -35, -342, -613, 432, -317, 93, 533, -1025, -316, -218, 584, + 1070, -622, 130, 52, -325, 328, -169, -508, -747, -568, 598, -516, 232, 572, 233, 363, -715, 989, 612, 534, -422, 706, -99, 462, 292, 93, 238, 336, 190, -130, -203, -173, 48, -496, -595, 306, 114, 172, -498, 112, 112, 336, 491, 771, -479, 103, 1083, 224, 81, 90, -271, 63, 1071, 303, 676, 185, -824, -346, -617, 1593, 598, -651, -454, -585, 26, -396, -955, 169, -750, 950, -161, -862, 947, 777, 5, -333, -44, -584, 381, 977, -392, -789, 282, -128, 739, -1615, -1113, 605, 281, 203, 515, -568, -727, -416, -601, 302, + -642, 155, 398, 654, 7, 543, 318, 65, -197, -628, -435, 318, -743, 341, 74, 591, 464, -265, -919, -624, -64, -79, -248, 590, -1107, -120, 34, -1187, -25, -177, -93, 87, 674, -694, -1809, 639, 742, 402, 1421, -1203, -140, 745, 612, -769, -324, -242, 1130, 178, 1084, -1578, 247, -1871, -1069, -1090, 1255, 346, -700, 630, 47, -453, 404, -612, -629, 564, 1378, 515, -488, -314, 193, -341, -408, -39, 640, -101, 120, -668, -141, 950, -686, 532, 1222, 626, -56, -220, -408, -769, -582, 692, -392, 652, 449, 236, 21, 267, -206, -976, + -357, 735, 553, 616, -645, 1113, -296, 448, -821, 763, 1250, -228, -471, -17, 26, -251, 254, 587, -1066, 718, 637, -127, 740, 445, 301, -447, 68, 730, -1484, -1246, -574, 393, -706, -1913, 782, 590, -268, -271, -104, -86, -637, -1322, -214, -37, 664, 881, 16, -1003, 1319, -376, -928, 823, -137, -507, 635, 166, -138, 534, -743, 696, -255, 18, -219, -189, -1036, 402, -399, 156, -419, -41, -314, 288, -186, 1106, 190, 721, -291, 174, 453, -205, 310, -73, 547, -38, -197, 869, -797, 427, 588, -365, 667, -429, -32, 336, -283, 786, + 699, 133, 1172, -752, -1704, -302, -1065, -708, 2428, -85, 723, -142, -1075, -56, 986, 1409, 836, 1367, -770, -212, -439, -775, 454, -385, -193, 89, 774, -764, 972, -546, 155, 25, 122, -702, -90, -631, -523, 31, -192, -468, -176, 394, -402, 367, -179, 1051, -451, 337, 84, -220, -797, -266, 645, 148, -183, 854, -583, -572, -62, 820, -688, -58, 161, 255, -769, 282, 297, -236, -804, 63, -618, 322, 170, 299, -1239, -484, 747, 2005, -854, -60, 185, -262, -519, 60, 1654, 450, -130, -61, -392, -11, -286, 729, 83, -292, -367, 141, + 360, -446, 594, 294, 468, 196, 662, 507, 459, -1217, 1657, 244, 391, 411, -361, -420, 33, -151, 251, 558, -741, 269, -142, 215, 203, 146, 450, 356, -306, 322, 283, -245, -435, 156, -143, -359, 244, 202, -13, -228, 26, -161, -68, 35, 117, 191, -320, -32, 292, -103, 264, 65, 196, 375, 126, -345, 59, 359, -171, 2, 187, -559, -12, -123, -516, 767, -165, -10, 467, 98, -306, 155, -291, -40, 276, -272, -75, 574, -542, 85, 101, 209, -141, 180, -90, 199, -115, 383, -1626, -3307, -427, 2073, 1595, 4580, 2204, -1072, + -934, -2176, -3804, -485, -1475, -462, 2684, 1707, 1827, 3490, -122, -779, -1318, -3465, -1909, -620, -641, 91, 1575, 1212, 1294, 2430, 1428, -903, 1303, -1373, -3187, 400, -2140, -2988, 1166, -263, -548, 3652, 1202, 963, 3157, -346, -615, 951, -2110, -2639, -703, -2263, -2006, 417, 443, 898, 2758, 2425, 1481, 1736, 346, -1391, -1479, -1855, -2522, -1193, -628, -866, 762, 2313, 1468, 1430, 1116, -797, 167, 147, -1223, -140, -564 }, + {172, 20, -151, -39, -40, -17, -40, 74, 176, 26, 143, 53, -35, -79, 66, -24, 141, 99, -49, -90, -105, 52, -35, 12, -76, -32, -20, 60, -74, 59, -24, -83, 106, 107, 17, 40, 21, -22, -70, -226, 62, -73, 68, -73, -88, 64, -77, 37, 41, -160, 6, 23, 39, -63, 84, -84, -54, -29, -38, 54, -9, 26, 48, 69, -12, -76, -75, 4, -157, -69, -14, 137, 42, 48, 40, 56, 13, 16, -34, 80, 140, -108, -94, -144, 127, 62, 9, 188, -21, -5, -60, -49, 39, -53, -101, 53, + 14, 157, 215, -59, -130, -160, -12, -93, -89, -62, -14, -128, 119, -48, -50, -86, -63, 20, 134, -17, -41, 38, -136, 97, -85, -302, 146, 95, 162, 168, 30, 87, -92, 22, 127, 6, -4, -35, -20, 65, -66, -50, 0, 61, -58, -74, -104, 122, 46, 9, -36, -132, -8, 79, 51, -28, -39, 73, -12, -450, 232, -24, 5, 80, 113, -169, -23, -32, 93, 35, -104, 317, -36, -21, 140, 115, 36, 79, 258, -131, 6, -67, 23, -82, 4, 7, 27, -146, 10, -36, -57, -8, 88, -52, 81, 122, + -216, 27, -90, -25, -134, 64, -81, -15, -48, -134, 47, -91, 56, 32, -70, -98, -2, 88, 62, 161, 70, -72, -206, -15, 29, 250, -85, -41, -10, -53, -140, -66, -129, -23, 84, -26, 102, 61, 28, 53, -59, -77, 336, 179, -45, -123, 196, -210, -28, 130, -82, -57, -86, 225, -68, 76, 26, 75, 304, -288, 97, 158, -91, -266, -135, -10, 26, -30, -41, 124, 176, -4, -110, 18, -142, 54, -86, 63, 188, 76, -171, 5, 20, 278, 59, 145, -29, 70, 56, -312, 15, 165, 81, 184, -142, -81, + -141, 54, 107, -18, 44, 22, -65, 43, -46, 67, 61, 5, 92, 34, 4, 55, 197, 53, 94, 146, 71, 23, 47, 682, -167, -56, -95, 145, 100, 236, 99, -28, 118, 1, 131, 53, 179, 9, 152, 192, -199, 42, 62, 40, 41, 51, -115, 4, -133, -16, 4, -237, -155, 64, 8, -5, 105, 97, -40, -205, 71, 190, 133, 177, -38, 96, 183, -287, 101, 128, -133, 179, -114, -26, 27, 35, -86, 83, -15, -34, -90, -84, 110, 97, 55, 95, 163, 79, 223, -52, -232, 222, 44, 101, 49, -45, + 57, 17, -20, 111, -13, 98, 284, -358, 213, 34, 218, 40, -148, 29, 164, -229, -62, 11, -259, -61, -203, -127, -153, -162, 46, -244, -162, -197, -65, 167, 46, -234, -105, -244, -76, 40, 314, -280, 91, -79, -119, -211, -11, 24, 193, 103, 6, -191, -337, -13, 71, 239, 64, 72, -206, 60, 132, 5, 1, -104, -121, -38, 66, 11, -88, -2, -227, -32, -195, 105, -61, 106, -192, -141, -252, -26, -164, -61, 24, -192, -94, -3, 93, -226, 22, -836, 132, 94, -244, -55, -4, 7, -49, -81, -65, -249, + 187, -120, 22, -206, -78, 299, 266, -171, -109, 10, -10, -140, -170, -115, 14, 15, -1, -14, 63, -201, 57, 10, -367, -40, -115, 168, 232, 42, -51, 16, -219, -259, 132, 266, 281, -72, 43, 176, 165, -84, 151, 271, -22, 230, 176, -212, 60, 22, 225, -135, -168, 148, 166, -44, 2, -248, 167, -130, 174, -297, 23, 67, 100, 34, -126, -213, -76, -329, 108, -292, 355, 342, 4, -477, 189, 21, -94, 320, -5, -287, -37, 348, -450, 8, -118, -356, -104, 1, -76, -185, 96, -154, 114, -132, -244, 121, + -25, 176, -360, 139, 270, -117, 15, 275, 401, -114, -91, -349, 12, -289, -31, -203, 2, 23, 157, 74, 143, -114, 19, 89, -27, 373, -259, -128, 487, 493, -107, -36, -322, -165, 6, -92, -217, 295, 82, -82, 419, 69, -210, -23, -376, -161, -213, -134, -56, 400, -107, -4, 276, -66, 163, -89, -351, -22, 0, -71, -209, -231, 119, -182, 323, -99, -237, 202, 405, -100, 112, -108, 233, 7, -497, 178, 272, 29, -85, -286, 238, 163, 151, 33, 94, 325, -233, 42, 58, -178, -353, 333, 178, 618, -38, 274, + -98, -192, 25, -28, -18, -54, -211, 445, 0, 36, 51, -61, 351, 47, 290, 127, 35, 325, -173, -369, -94, 61, 23, -157, 137, -109, -478, 46, 60, -228, 15, -90, 341, -521, 105, 258, 376, -360, -37, 273, 195, 235, 56, 477, 103, 208, -40, 44, 207, 121, 237, 35, -287, -427, 253, 131, -67, 70, 151, -398, 22, -245, 141, 3, 291, -70, 140, -45, 89, 55, 7, 171, 224, 91, 138, -308, 155, -39, -547, -359, 117, -397, -7, 361, -229, 700, 269, -119, 392, 36, -97, -255, -247, -358, -33, 242, + -245, -12, 273, 135, 165, 515, 86, 335, 31, 82, -408, 120, 41, -245, -231, -282, -10, 175, -3, 122, -288, 221, -18, 62, 208, -392, -267, 67, -5, 209, 440, -45, 110, 467, -175, -326, -17, 340, -74, -405, 33, 140, -77, -133, -28, 503, -96, 431, 334, 392, 23, 22, 236, 67, -81, 70, -318, 226, 403, 238, 35, 209, -177, 155, -173, 234, -229, -16, -20, -40, 714, -131, -44, -89, 95, 168, 371, 399, -244, 68, 418, -280, -313, 132, -147, 116, 739, -423, 18, -18, -161, -39, -50, -279, -440, -338, + -458, -177, 48, 363, 266, 97, 379, 115, 230, 216, -109, 333, 355, 255, -492, -272, -288, 108, -201, 16, 132, -139, -351, 225, -171, 82, 65, 354, -374, 572, -570, 585, -11, 297, -292, 108, -638, -343, -316, 283, 115, 408, -53, 7, -217, -494, 314, -266, -158, 250, 555, 563, 242, -25, -391, 232, -593, -31, -347, 199, 598, -581, 193, 289, -392, -28, -89, 199, -235, -263, 1, -95, -391, 119, 145, -440, -510, -160, 291, -396, 224, -535, -115, -219, -205, -429, -60, -173, -268, 174, -296, 272, 38, 208, -384, -694, + -81, 118, -307, -227, 85, 67, -355, -177, 443, 207, -88, 236, 647, 4, 59, 50, -78, -30, 73, 71, -545, -207, -660, -219, -618, -297, 3, 671, 293, -359, -431, 239, 515, 327, -274, 400, -190, -48, -762, -233, -127, -106, -534, -818, 223, -17, -618, 129, 861, 91, 71, -567, -113, -51, 106, -503, 491, 368, -563, -117, 130, -271, 641, -534, -554, -447, 619, 278, -368, -327, -224, -68, -203, -201, 23, 234, 609, -67, 254, 231, 213, -410, -525, -367, 420, -72, 512, 177, -70, -713, -597, -56, 34, -411, -274, -190, + -215, -935, -220, -224, -356, -159, -239, -425, 284, 593, 306, 24, 325, 449, -180, 148, 88, 52, -44, -103, 282, 134, 489, -111, 20, 195, 988, -4, 504, 684, -100, -570, 0, 515, 60, -429, -423, -401, 67, -426, 626, 470, -916, 357, 436, -119, 330, 970, 125, 256, -272, 265, -290, -164, -132, 120, 285, 383, 1, 190, -51, -3, -129, 298, 916, -229, -231, 366, 268, 87, -582, 465, -454, 345, 410, 98, 141, -46, 646, 511, 54, 364, -190, 445, 113, 495, 681, 51, 210, -16, -183, 52, 327, 381, -552, -295, + 194, 730, -264, 513, 346, 167, -646, 174, 170, -745, 560, -367, -474, -932, 330, 714, -127, -372, 196, 794, 223, 653, 468, -178, -1317, 142, 635, 301, 124, -580, -22, -402, 72, -45, 87, 190, 251, 111, -730, 406, -123, 121, 513, 205, 74, -194, 639, -24, 633, -804, -267, 258, -500, -403, -4, -103, -401, 47, 550, -15, 2, -302, -678, -401, -223, 272, -113, 71, -358, -333, -214, 520, -398, 306, 148, 178, 5, -513, -804, -46, 445, -607, 242, -520, 274, -547, -94, -538, 711, -686, -489, 202, 50, 328, 145, -64, + -329, -217, -215, 221, -1091, -138, 351, 101, -246, -377, 55, -357, -17, -562, 563, -198, 359, -736, -411, 4, 945, -738, -48, -573, -455, -123, 599, -114, 276, 294, -290, -636, 946, 427, -512, 126, 87, 280, -498, 488, -22, -946, 123, 220, 271, -778, -172, 129, 729, 163, 417, -1008, -608, 349, 24, 710, -158, -82, 77, 378, 340, 156, -1291, 409, -126, 341, 733, -180, -31, -757, 296, 414, -372, -187, 730, 1091, 281, 285, -205, -88, -358, -973, -644, -236, -31, -564, 410, -1147, 34, -712, 338, -277, -789, -89, -227, -291, + -895, -659, 163, 669, -483, 831, -745, -498, 137, -91, 368, -261, -272, -372, -116, -1214, -361, 15, -69, -218, -487, 357, -433, 621, -213, -97, -467, -434, -805, -361, 279, 105, -59, 38, -295, -228, -377, -320, 154, 225, 105, -697, 782, 99, -343, 623, 451, 747, -139, 439, -1023, -552, -953, 982, -299, -625, -632, -1244, -467, 766, -13, -537, 12, 235, 1212, 1558, -168, -715, -186, -279, -728, 291, -2, -525, 1483, 510, -380, -1054, -118, 242, 249, 297, 694, -215, -383, 332, -1335, -879, -370, -99, 110, -702, -669, 667, 501, -413, + -824, 500, -21, 885, -757, -165, -284, -44, -609, -847, 672, -523, -375, -644, -190, 433, 356, -256, 8, 82, 488, 832, 554, -1047, -562, -616, -214, 370, 72, -711, -1101, 890, -9, -852, -1494, 721, -243, 372, 246, 328, -29, 211, -712, -287, 151, 564, 695, -837, -702, 2037, -153, -185, -294, -625, -61, 744, 1181, -525, -318, -103, -526, -116, -293, 484, -475, 552, 262, -165, -666, -30, -270, 1030, -548, 8, 8, -78, 463, -267, -32, 235, -133, -961, 509, -423, -516, -91, -550, -292, -1003, 998, 50, -609, -1177, 726, -692, -644, + 16, -490, 247, 481, 1353, -335, 536, -61, -640, -496, -149, 2091, -1773, -60, 1876, -1606, -612, 1020, -93, -565, 1610, -503, -236, 638, 344, 639, 1000, -1173, 1139, -142, -635, 634, 252, -64, 168, 126, -86, 260, -190, -259, -93, -376, -306, -746, -258, 730, 690, -939, 377, 572, 486, -121, -927, -39, -434, -1090, 767, 1876, -999, -62, 1347, -316, -413, 1108, 834, 441, -374, -794, 336, -288, -482, 1967, 1460, -1091, -791, 1094, -1824, -598, -473, -259, 1380, 944, 641, 704, -2140, -694, 2176, 1302, 325, -476, 808, -648, -1414, -894, 826, -420, + -12, 946, 1576, 76, -661, 93, 538, -333, 310, -1852, 829, 28, -172, 978, -143, -706, 385, 350, 959, 549, -486, 45, 166, 660, 171, -722, -6, -25, 174, -672, -728, 1105, -368, -1121, 609, 1026, -543, -177, 91, 707, -799, -1068, 323, 931, -172, -376, -200, -208, 426, 185, 266, 2322, 156, -280, 61, 87, 1276, 54, -412, 295, -944, -559, 285, 19, 1105, 864, -516, -147, -485, 38, 420, 111, 157, 398, -238, -1122, 329, 767, -313, 675, -963, 463, 367, -876, 389, -90, -486, 633, -1218, -3985, -4714, -433, -3273, 1272, 7952, 4271, + 6456, 6800, -749, -1974, 574, -4969, -6066, -1884, -6679, -5370, 1352, -3869, -1057, 7675, 2778, 5423, 9384, 5574, 2493, 1886, 659, -4192, -5203, -1727, -7104, -7122, 937, -5335, -4371, 2616, -4476, -4611, 3483, 1406, -628, 8188, 7680, 4895, 10417, 9807, 3366, 3906, 3063, -4948, -4943, -6270, -12392, -14638, -10505, -10468, -7701, 264, 733, 5103, 8856, 10898, 9954, 11502, 9831, 5713, 3787, 1199, -1899, -3822, -4849, -3433, -4343, -3620, -3144, -4246, -2897 } + }, + { + {-6, 65, 73, 211, -26, 34, 25, -13, 120, 90, -165, -93, -150, -89, -17, -107, 2, 11, 8, -15, -9, -147, -23, 34, 57, -71, 91, 27, -72, -49, 17, 90, -30, -32, -45, -123, 25, -159, -13, -79, -72, -53, 34, -54, -89, -64, -8, -47, -125, -55, -34, -33, -92, 12, -44, 107, 23, -128, -71, 151, -44, 40, -82, 38, 72, 61, -112, 54, 83, 52, -3, -74, -33, -61, 34, -26, 42, -280, -332, 160, 3, 245, 84, 104, 64, 96, -11, -10, -65, -171, -104, 38, -17, -37, -28, 82, + 59, -5, 70, -80, -197, 54, -53, 16, -105, 70, -88, -44, -41, 129, -42, -6, -67, -20, -163, 46, -37, 77, -84, 5, -46, -126, 27, -16, -45, 50, 88, -25, -75, -182, 3, -110, 35, -2, -83, -6, -45, -28, -144, 80, -131, 60, -62, -80, -83, -140, 55, 0, 15, 72, -98, -123, 40, -475, 0, -58, 131, 8, 53, -34, 67, 18, 59, -50, 314, -61, -39, -127, 49, -154, -48, 19, -74, 6, 118, 73, 47, 84, 114, -127, -48, 6, 74, -118, 127, -97, -50, 108, -16, 32, -76, 101, + 99, 113, -155, -38, 173, 9, -23, -27, 189, 133, 147, 15, -31, -30, -8, 10, 24, 70, -177, -1, -81, -90, -11, 48, -90, 44, -67, -6, -23, 19, 68, 80, -24, 0, -22, 169, 199, -128, 24, -108, 184, 39, -67, -98, -85, -13, 29, 53, 242, -134, -16, -49, 99, -257, -24, 174, 2, 148, 69, 120, 125, 58, -16, -117, 48, -28, 23, 203, 57, 175, -80, -39, 21, -219, 35, 177, -41, 24, -132, 115, 7, 56, -158, 108, -102, -53, -107, -128, 91, 38, -33, -60, -54, -37, -20, 91, + -63, -126, -200, 216, 172, 26, -195, 85, -76, 106, -39, 52, -79, -43, -86, -31, 18, 166, 817, -302, 366, -290, 26, 88, 87, -239, -81, -80, -401, -1, 22, -144, -23, -1, 288, 54, -200, 147, 160, 36, 292, -216, -79, -115, 62, 233, -17, 15, 87, -42, 104, 47, 267, -40, 104, -175, 159, -123, 178, -4, -186, -29, 268, -13, 181, 108, 174, 14, -139, -115, 2, -86, 142, 93, -144, 17, -113, 186, -54, 148, 179, 27, 184, -14, -95, -38, -119, -4, 229, -151, -150, -63, -85, -682, 71, -203, + -146, -222, -269, 102, 235, -38, 89, 35, 119, 25, 6, 71, -149, 335, -21, -199, 218, -70, 91, -224, -142, -159, 64, 39, 170, 3, -112, 16, -100, -107, -121, -42, -167, -84, 148, -143, -14, -112, -177, -78, 18, 54, 106, -88, -84, 108, 15, 40, 25, 67, 98, -166, -60, -17, -237, 61, -21, 136, -142, -105, -133, 22, 139, 111, 246, 169, -156, 57, -67, 93, 43, -128, 50, -877, 226, -269, -227, -166, 17, -56, 498, 39, 110, -68, -10, -221, 196, 50, -43, 31, 259, -147, -60, 52, 6, 125, + -132, -64, 137, 44, 125, 5, -160, -107, 69, -25, -64, -103, -67, -17, 243, 54, -62, -6, 4, -90, 170, 130, -60, -207, 33, -115, 160, 125, -155, 41, -196, -172, -158, -189, -79, 25, -125, -6, -137, -114, 182, 114, -195, -249, 2, 179, -175, -129, 127, 95, 140, -149, -34, 7, -456, -45, 77, 221, -43, -117, 53, 326, -410, 95, -83, -77, -184, 110, -328, -215, 114, -173, 105, 467, -81, 188, -219, 225, -57, 66, -196, 91, 58, -107, 49, -23, -99, -8, 132, 200, -155, -254, -196, -187, 28, 146, + 396, -6, 268, 274, -252, 195, -372, -139, 29, -169, -151, 103, -360, -73, 260, -111, -89, 32, -104, 103, -103, 178, 239, -64, 81, 10, -219, 21, -134, -96, -147, 101, 92, -118, 57, 1085, -47, -422, -49, -13, 46, 142, 60, -44, -40, -209, -98, 127, 268, -210, -132, 182, 18, -57, 74, -11, -247, -249, 350, -26, -19, -52, 181, -7, 21, 120, -188, 208, 85, 39, 78, 208, -485, -211, -118, 453, 57, 40, -139, -146, 132, -14, 152, -50, -314, 38, 33, -42, 145, 72, 33, 251, 595, -45, -61, 231, + 58, -72, 143, 468, -71, 84, 148, 124, 93, 102, 97, 80, -139, 145, 243, 214, 239, -313, -93, -267, 257, 483, -236, -60, -270, -121, -326, 226, -199, -86, -23, -4, -130, -165, 290, -270, -98, 23, 198, 205, -304, -97, 117, -269, 149, -215, -84, 68, 7, -122, -30, 54, 342, 33, 79, -10, -288, 308, -152, -248, 194, -180, -188, 239, -109, 20, -50, 22, 335, -69, 80, -301, -16, 321, 82, 317, 292, -109, -64, -403, 69, -82, 265, 295, -165, 60, -518, -158, 179, -179, 277, 59, 10, -61, 201, -243, + 91, -227, -19, -309, 522, -147, 41, -158, -464, 276, 102, -346, 224, -153, -109, 127, 495, -239, 479, -5, -324, 18, 118, -288, 330, -165, 247, 522, 59, -238, -59, -24, 128, -203, -103, -25, 265, -88, -93, -337, -1, -398, -63, 456, -91, 261, 36, 71, -584, 10, -369, 309, 547, 166, 148, 35, 94, -310, 125, 168, -123, -37, -106, -76, 258, 8, 307, 878, 338, 99, -250, -238, -129, 187, -158, -133, 913, -527, -34, -273, -495, -654, 155, -224, 166, -621, 98, 192, 172, -274, -569, -455, -383, -18, -230, -424, + -295, -163, -346, -252, 36, 391, -29, 36, -33, -387, 206, -57, 48, -105, -258, 182, -317, -444, 360, -433, 65, -27, -589, -366, 210, -34, 262, -207, -623, -25, 9, 205, 232, 548, -340, -1196, -418, -421, 256, -784, -263, -147, -703, -252, -10, -148, -125, 141, -174, -23, -143, 167, -350, 168, 266, -291, -86, -528, 226, 281, -78, -90, -259, -282, 699, 267, -633, 240, -341, -15, -310, -640, 201, -323, -137, 49, 25, -146, -553, -323, 279, -318, -5, -277, -461, -154, 518, 111, 94, -420, -149, -62, -58, 215, 227, 325, + 361, -141, 202, 108, -210, 166, -352, -265, -266, 155, -308, 59, -462, -356, -211, 524, 367, 412, 393, -312, 493, 74, 223, 747, -148, -62, 105, -262, 131, -82, -417, 123, 335, -311, -240, 15, 353, -267, -612, 683, -548, 708, 393, 265, 146, 273, 298, 274, 762, -278, 46, -60, -141, -32, 87, -80, 140, -59, 232, 193, -52, -143, -776, -283, -565, -36, 284, 285, 85, 140, 211, 172, 204, 538, 809, 538, 100, -117, -170, -248, 275, 278, 315, -258, -204, -317, -63, 383, -10, 462, -306, 238, 138, 410, -914, -663, + -282, -383, -389, 85, -173, 537, 143, -662, -80, 971, -373, 269, -170, 321, -243, -139, -44, -122, -222, -454, -233, 355, 149, 259, 694, 49, 460, 678, 467, -324, -713, -35, -334, 744, 206, 579, -96, -328, -129, -357, 125, -278, 20, -308, 142, -228, -103, -488, -483, -59, -687, 357, 243, -214, 334, -177, 123, 373, -439, -572, 87, -134, 926, 387, -1043, -290, -305, -543, -575, -1163, 191, -424, -120, 154, 29, 226, -58, -147, -885, 93, -410, 97, 499, 98, 331, -529, -700, 129, 403, 251, 160, 241, 409, 501, 461, 1241, + 818, 1138, 69, -231, -783, -233, 124, 176, -192, -604, -224, 984, 401, -140, 295, -25, -371, -109, -245, 671, -61, 37, 281, 16, 320, -6, 456, -432, 527, 106, -262, -154, -290, 483, -686, -730, 446, 758, 21, 522, 706, -816, 254, 162, -62, -11, 102, -309, 547, -348, -295, 224, 6, -67, -156, -176, 56, -544, -188, 423, -559, -131, -390, 3, 1038, -349, 31, 264, -40, -258, -663, 560, 257, -1149, 108, 258, 135, -557, -1334, 1186, 708, 375, 265, 585, -1347, 551, 622, 264, -862, 477, 871, 400, 960, 346, 16, -43, + -31, -169, 406, 677, 649, 220, -202, -347, 78, -318, -365, 370, 258, 61, -367, -365, -83, -321, 150, 769, -147, -272, 256, 123, 222, 252, -73, -183, 615, 389, 189, 247, -72, -662, 122, 379, 27, -510, 592, 112, 829, -25, 735, 17, -309, -161, 122, 1018, -221, 283, 163, 371, 143, -217, -206, -7, 1092, -85, 356, -402, -848, 975, 7, 867, 41, 81, -747, -211, -326, 611, 168, 285, 173, -562, 75, 74, -500, -711, -740, 285, -266, 718, 54, -188, -165, 180, -254, 76, 214, -256, 174, 266, 90, 101, 531, 911, + -163, 29, 448, 398, 534, -353, -147, 198, -518, 91, 50, -654, 900, -2, 455, 435, 276, -485, 50, 498, -369, 852, 218, -245, 660, 551, 344, -1070, -238, 275, -393, 109, -636, -99, -915, -182, -150, -191, -912, -10, -275, 1035, 544, 484, 374, -180, 253, 593, 572, 283, -577, -674, 375, -45, 285, -78, 668, -405, -45, -102, 589, -348, 994, 1220, 1234, 131, -172, 251, -106, 348, -4, 53, -300, -891, -271, -851, 567, 552, -517, -361, -519, -203, -38, 1303, 57, -572, -639, 19, 907, 475, -1701, -295, -270, 289, 692, -697, + -205, -392, 231, -975, 542, -117, 2, 337, 63, -458, 1034, -59, 491, 1123, 2208, 1341, -48, 717, 990, 1321, 1132, 52, 581, 333, 393, 336, -155, -436, 643, -663, 1283, -83, -152, 81, 1039, -588, -40, 28, 89, 405, -172, 558, 255, -44, 199, 108, 481, -1168, -298, 9, 216, -75, -797, 770, 51, 141, 356, -538, -168, -1303, 453, -278, 358, 1014, -166, 238, -20, 497, -691, -1043, 1051, -63, 197, 182, 1065, 709, 944, 4, -970, 666, 439, -247, -249, 631, 32, 792, 1452, 1016, 330, 93, 1127, -183, 464, 790, -349, 904, + 720, 313, -507, -125, -440, 25, 591, 824, -57, -1691, 375, -285, -78, 1311, 552, -415, -335, -6, -868, -1042, 70, 11, -606, 626, 54, -596, 357, 1139, -176, -643, 384, -373, -446, 224, 890, -284, 104, 269, -315, -664, -482, 929, 284, -871, 729, 327, -652, -291, 1221, -378, -1009, -462, 1630, -1615, -812, 1021, -492, -488, -1627, 1279, -1062, 413, -2, -133, -1836, -464, 1462, 1025, -1265, -257, -588, -169, 179, 416, 329, -2004, 1075, 963, 816, 117, 414, -866, -872, 1762, 462, 351, -1383, 246, 1741, 547, 193, 52, 137, 748, 1027, -229, + 198, 267, -167, 617, -315, -85, -236, 474, 360, -192, 332, -462, -367, 472, -293, 518, -334, -154, 1, 282, -6, 209, 97, 525, -365, -78, 22, -214, 523, 438, -351, -134, -210, 112, -456, 248, 161, 227, -172, -150, 597, -705, -104, 286, -172, -136, 322, -866, 226, -320, 71, -315, 761, -254, -300, 290, -147, -500, 953, -38, 126, -223, -301, -404, 465, -406, -181, 385, 456, -1290, -3653, -3001, 1590, 458, 3639, 6499, 967, 2050, 747, -5177, -1635, -3510, -4240, 121, 680, -1769, 2568, 3360, 1888, 5361, 3095, -688, -1269, -2486, -4837, -3821, + -1123, -3404, -469, 2940, 495, 684, 4447, 2267, 1408, 4639, 721, -1279, 1817, -2429, -4803, -2012, -4047, -5071, -66, -1061, -1331, 3376, 3732, 2370, 5632, 4539, 2148, 1930, 1126, -3760, -3443, -4379, -5762, -4636, -1946, -1353, 125, 3317, 4048, 4207, 4018, 3674, 771, -41, -685, -2575, -2741, -1302, -2045, -622, 1357, 384 }, + {-22, 38, 109, 142, 2, -78, 99, 56, 117, 144, -58, -17, -117, 65, 20, -49, -139, 47, 71, 95, 5, -132, -75, 77, -91, 80, -20, 27, 31, 30, -134, 42, 49, -92, -155, -148, 8, 12, 30, -9, 1, -43, 72, -13, 63, -95, -12, 100, 184, 15, -4, 24, 108, 70, -132, 35, 64, 41, 0, 71, 63, 41, 41, 26, -34, -77, 99, 44, -62, -11, -50, 65, 0, -46, 47, 40, 7, -326, -396, 195, -75, 170, -89, -92, -179, 38, 35, -11, 0, -23, -137, -19, -79, -92, -86, -7, + 8, -11, -18, 63, -21, -208, 124, 59, -71, 16, -4, -2, 27, 126, -75, 3, -232, 110, 21, 47, 78, 125, -74, -60, -27, -121, 8, -23, 99, -59, -8, -62, -65, 117, -93, -50, 11, -89, 70, -9, -39, 69, 139, 2, -5, -26, 119, -124, 2, -25, 62, -35, -53, 113, -1, 22, -36, -471, 76, 52, 161, -67, 46, 188, -77, 49, -119, -173, 59, -119, -136, -135, 36, 48, -230, 130, 84, -41, -87, 50, -25, -54, 12, 72, 51, 117, 19, -39, 119, -65, 264, 58, 161, 61, 141, 62, + 95, 51, 7, 2, 198, 31, -38, 10, 102, 76, 6, -13, -47, 19, 243, 67, 109, -124, -68, -131, -86, -127, 85, 53, -85, -61, 48, -64, 54, -33, -26, -92, -144, 53, -216, 271, 370, -104, 105, -173, -3, 18, 472, -40, -116, -193, 12, 140, 221, -41, -273, -73, -100, -69, 103, -13, 186, 27, -94, -219, 76, -14, 60, -20, 33, 119, 49, -277, 42, 192, 98, 31, 52, -37, 135, -160, -8, 148, -87, 9, 234, -95, -2, -67, 148, -137, -99, 78, -142, -64, 207, 127, -166, -54, -16, -32, + -70, 76, -58, 86, 10, 25, 45, 162, -2, 216, 124, -121, -42, -36, 109, 36, 15, -18, 859, -327, 169, -252, -33, 2, -25, -137, 64, 93, 17, -101, -208, -14, 115, 80, -96, -158, -20, 129, 240, -140, -26, -108, -224, 18, -117, 59, -88, 162, -303, 193, -21, -183, 35, 67, -29, -100, -2, 225, -17, 31, -41, 82, 32, -61, -95, -197, 115, -47, -65, 66, -8, -327, 237, -351, -208, -251, 43, -36, 136, -88, 68, -155, 60, -47, -71, -170, 86, 103, 176, -55, -30, 42, -13, -685, 69, 6, + -59, -107, 119, -94, 79, -26, -1, 109, 144, -91, 106, -33, -58, -194, -9, -262, -190, 225, 82, -92, -31, -30, 160, 80, -80, 140, 97, 52, 52, 56, 112, 89, 95, 250, 232, 93, 27, -165, 179, -243, 49, -73, 193, -152, -185, 314, -73, -182, -152, 230, 150, -2, 126, 162, 82, 269, -15, -58, 162, 83, 11, -11, -146, 69, 90, 202, 87, 106, -90, -122, -228, -72, -133, -924, 231, -208, -301, -298, 163, -225, 143, -279, 133, 111, 64, -294, 179, -18, 103, -246, 117, 259, 197, -8, -110, 23, + -71, -311, -71, -158, 56, -202, 148, 140, -73, -24, 208, -65, 138, -137, -202, 82, -14, 85, 259, 146, -20, -489, -235, -84, 55, -92, 249, -429, 120, 35, -14, 107, -62, 177, -437, -222, 157, -453, -89, 177, 63, -121, -297, 80, 175, 106, -62, -319, -37, -20, -36, -52, -177, 24, -419, 56, 81, 345, -307, 376, 115, -21, -75, -31, 45, -260, -40, 94, -76, -149, -30, 261, -249, -49, 276, 9, -91, 100, -114, 200, 99, 5, 111, -105, -161, -6, 29, 151, -293, -160, -119, -89, -74, -87, 65, 22, + 45, -224, -216, -181, 28, -289, -141, 185, -96, 47, 44, 3, 101, 114, 129, 129, 205, -20, 222, 0, 131, -3, -83, 8, -154, 140, -181, 229, -192, 26, -173, 70, -143, -184, 126, 1208, 31, -326, 71, -170, 493, -61, 151, 52, 40, -401, -197, 248, 221, -312, -40, 7, 310, 161, 129, 304, 63, 36, 267, -70, -362, 73, 308, 189, -92, 23, 220, 141, 74, 6, -195, 121, -213, 41, -418, 132, 153, -18, -182, 295, 165, -39, 235, 117, -162, 351, 56, -99, 97, 360, 74, 11, -263, -146, 61, 136, + 410, -107, -131, 56, 236, -114, -143, 10, 304, 225, -30, -142, 21, 221, -44, 257, 131, -436, -55, -227, 415, -173, 188, 25, 256, 92, 29, -36, 98, -136, -190, -516, -380, 108, 321, 428, -172, -232, -199, 83, -113, -39, -26, 43, 60, 279, -165, 11, 66, 127, -149, -124, -242, -178, -170, -300, -718, -28, -100, -326, 64, -55, -391, 109, -332, 63, -43, -48, 163, 193, -9, -342, 92, -224, -224, 283, 276, 285, -103, 25, 39, -185, 22, -103, 473, -114, -52, -78, -21, -279, -236, 12, -113, -62, 140, -464, + 174, 58, 495, -331, -185, -109, 266, -251, -238, 218, 150, -254, -252, -251, -557, 368, 351, 366, -153, 115, 370, -529, 7, 345, 327, 144, 6, -171, 42, -84, -449, 55, 133, 64, 311, -270, 38, -502, -54, 95, -264, 102, 94, 219, 283, 374, -66, -154, -446, -333, 154, 668, -195, -34, -296, -170, -231, 139, 165, -58, 39, -499, -47, 328, -247, -235, 217, -90, 301, 60, -182, 16, -262, -76, -73, -304, 656, -345, -185, -28, -37, -491, 16, -365, 239, -674, -111, -225, 210, -241, -243, -572, 361, -244, 139, -194, + 97, 282, -231, -381, -138, 235, 503, 152, 201, 10, -538, -295, -298, -161, 75, 458, 188, 260, 242, -89, -128, -176, -455, 6, -323, 455, -235, 307, 50, -190, 89, -133, -169, -278, 367, 80, 634, 121, -730, -200, 201, 159, 76, -67, 33, 710, 335, -155, 45, -236, 460, -60, -92, 112, -435, -277, -176, -417, 236, 538, -63, -32, -22, 500, 148, 113, 78, 52, 77, -208, 28, -637, 81, -311, 253, 635, -94, 39, -518, 671, 319, 281, -95, -381, 34, -135, 333, 239, -319, 9, 171, 121, -250, -220, 983, -238, + -185, 202, -265, -192, 304, 302, 0, 112, 100, -392, -204, -24, 118, 329, 70, 72, -448, -49, 115, -601, 117, -174, -73, -119, 161, -186, -337, -354, -558, 58, -231, -114, 320, -123, 72, -559, -76, -313, -314, 752, -448, 119, -286, 887, 189, 166, -283, -332, 32, 256, -271, -428, -258, -624, -246, -365, -2, -840, 58, 464, 281, 381, -263, 105, 405, -39, 293, 118, 457, -221, 381, 314, 216, 508, -281, 308, -154, -165, -120, 124, -967, -294, -602, 709, -440, -477, -108, 410, 9, -157, 545, -174, -175, -373, -977, 74, + 89, 435, -409, 34, -249, -294, 525, -65, 265, -517, -534, -292, 423, 13, -179, -191, 62, -487, -423, -375, -15, 474, 51, -159, 238, -407, 773, 483, -19, -371, -421, 159, -117, -47, -37, 707, -368, 3, -261, 255, -462, -419, -821, 177, -344, -462, -72, -774, -393, 207, 145, -113, 380, 29, 464, -221, -685, -109, -508, -100, -167, -645, 62, 513, -1484, 179, -19, 357, -96, -462, -893, 341, -131, 319, 169, -111, 480, -635, 855, -227, 463, 1025, 381, 728, 254, 183, -140, 366, -185, -397, -548, -349, -66, 222, -24, 1259, + 1030, 931, -182, 28, -745, 601, 738, 269, 713, 301, 258, 268, -98, 122, 214, -149, -718, -423, -4, -465, -551, -1321, 319, 261, 374, -230, -70, -151, 32, -393, 10, -293, 395, 339, -171, -233, -690, 1227, -353, 266, 20, 106, 211, -466, 616, -271, 223, 163, -427, -430, -67, -10, 296, 1295, -88, 218, 59, 409, 287, 312, -208, -39, 123, -586, 136, -498, -822, 310, 26, 91, -580, -1318, 566, 503, 455, -742, 455, -729, -1449, 1192, 188, 206, -485, -353, -1541, 418, 1096, 330, -976, -494, 155, -386, -243, 442, -509, 275, + 251, 200, -566, 192, 174, -275, -529, -316, -204, -147, -503, -445, -238, -530, 410, -206, -670, -243, 413, -97, -464, -269, -236, -15, -367, -236, -609, -594, 248, -222, 763, 484, 50, 438, -666, 414, -633, 513, -93, 253, -285, 921, -240, 505, -143, 751, 304, 157, -810, 822, 657, 257, 276, -613, -109, 117, 229, -133, -145, -463, -937, 920, -34, 476, -487, -113, -70, -62, -61, 566, 83, -348, 403, 125, 311, 490, 497, 89, -298, 1580, -344, 1231, 81, 137, -586, -220, 183, 632, 353, -114, 536, 164, -560, 177, 171, 726, + 55, 464, -404, 73, 524, 294, 453, 1058, 871, -47, 493, 16, 860, -542, 605, 291, 62, 547, -152, 1291, -113, 670, -340, -297, 121, 1379, 522, -1091, 1168, 88, 487, -776, 425, 233, -1590, 888, 1378, 547, -329, -63, 427, 917, 299, 354, 230, -274, -140, -486, 614, 98, 406, -328, 819, -283, 377, 135, 163, 129, 62, -853, -511, 16, 66, 602, 474, -691, 57, -374, -369, 189, 25, -224, 271, 1157, -776, -41, 1722, -1042, 100, 645, -347, -234, 333, 600, -658, 335, -1169, -94, 1660, 104, 443, -148, 887, 965, -302, 18, + -487, 143, -375, -790, -586, -947, -787, 1137, 377, 364, 1393, -999, -689, 222, 459, -363, 154, -356, 730, 524, 267, 446, 1288, -52, -165, 187, -230, -499, 432, -110, 971, -856, 233, -49, -266, -239, -113, 308, 194, 214, -33, 550, 107, -684, -538, -60, -311, -386, 105, 460, -49, -83, -628, 334, -89, 675, -210, -1244, 169, -355, -176, 23, -1012, -518, -866, 38, -49, -223, -1150, -449, -87, 634, 688, 81, 67, 356, 90, -772, 719, 988, -400, 177, -401, 207, 13, 765, -802, -554, -1857, -623, 491, 800, 556, 532, -421, -110, + 361, 399, 586, 234, 196, 530, -56, -188, 203, -1471, 654, -421, 81, 1092, 917, -327, -124, 575, -317, -333, -275, 101, -78, -13, 152, -89, 550, 1280, -504, -952, 1004, -730, -181, 37, 1246, 125, -345, 390, 365, -1246, -350, 243, -24, -574, -20, 275, -1853, -834, 956, -890, -1006, -598, 784, -946, -1517, 1594, -432, -931, -30, 652, -568, -999, 2, 525, -26, -1291, 344, 34, -571, 1468, 1361, -42, -511, -989, 1658, 290, 329, 609, -329, -1410, 701, 1009, 1006, -203, 382, 1067, -1522, 197, 1488, 823, 232, 8, -237, 407, -488, 1241, + -65, 350, 476, -391, 44, -26, -434, 25, 204, 707, 26, -396, 239, 575, -62, 895, -646, 167, 225, 253, 782, -385, 96, -1, -953, 167, -291, -510, 260, -177, 804, 584, -374, -853, 450, 114, 208, 520, 1104, -154, 255, -406, 649, 470, 495, -480, 740, -210, -271, -583, -17, -209, 952, -644, 91, 264, -164, -372, 1308, -11, 356, -53, 210, -37, 405, -38, -17, 65, 511, -1353, -3802, -3614, 1572, 157, 3479, 7373, 1613, 2973, 1583, -5460, -2446, -3669, -5395, -357, 635, -2544, 2262, 3860, 2358, 6648, 4075, 45, -619, -2344, -5869, -4742, + -2050, -4487, -1330, 2579, 758, 658, 6072, 2356, 1476, 5643, 261, -275, 2585, -1284, -4649, -2234, -4643, -6755, -760, -3065, -2525, 2177, 4192, 1959, 7421, 5940, 3419, 4507, 1504, -2190, -3407, -4510, -7258, -5795, -3920, -3315, -1059, 2542, 3813, 4274, 5652, 4745, 2114, 651, 1062, -1671, -2450, -1133, -2790, -1838, 942, -701 } + }, + { + {-44, 1, 66, -124, -36, -78, -109, -9, 136, 24, -73, -69, 187, -84, 18, -60, -62, -96, -23, 235, 16, -11, 44, 61, 20, -75, 130, 5, -4, -57, 17, -43, 20, 87, 7, -3, -5, -5, -20, -114, 27, 98, -29, -56, 90, -104, -8, -44, 66, -168, 63, -12, 25, -37, -35, -4, -48, 8, 51, 39, -11, 35, 151, -94, -77, 10, -37, -69, 18, -73, 39, -82, 11, -34, -72, -13, -153, -58, 37, -28, -88, -6, 207, -105, 25, -44, -1, -78, 149, -76, -80, -92, 178, -104, -26, -49, + 51, 82, 105, -145, 2, 140, 64, 24, -5, -17, 65, 142, 37, -182, -91, -98, 162, -16, 124, -77, 59, 159, -75, -120, 46, -45, -5, -108, -40, -81, 34, -146, -44, -38, 0, 196, -60, -31, -2, -53, -15, -20, 125, 60, 79, -104, 81, 78, -63, 30, 52, -51, -60, 65, -109, 70, 36, 10, -13, -1, -6, -98, 101, 11, -46, -67, -20, -35, -1, -83, -64, 45, -15, -33, -144, -23, 131, -91, -24, 99, -59, -109, -83, 67, -1, -12, -22, -104, 33, -47, -26, 115, -65, -158, -48, 8, + 46, 41, 12, -120, -29, -146, -134, -36, 137, -24, -275, -12, 91, 80, -58, 54, 58, 6, 81, -147, -105, -13, 43, 8, 30, -14, 39, 38, 58, -6, 36, 37, -26, 58, -5, -117, -98, -63, -52, -43, -15, 130, 75, 193, 18, -32, -18, 138, -31, 76, -117, -9, 2, 74, 54, 123, 90, -57, -115, -94, 73, -38, 98, 61, 18, -2, 82, 57, -49, 66, -123, -15, -114, -100, -138, 45, 89, -12, 121, -86, 113, -212, 89, 39, 166, 49, 64, 88, 3, -53, 67, 141, 55, 69, -15, -1, + -189, -11, 39, 39, -21, 106, 205, -65, -134, 96, 29, -99, 7, -44, -89, 17, 137, 28, 56, 16, -7, 36, 108, 104, -92, 157, -49, -96, -145, 40, -193, -7, 25, 60, -121, 87, 2, 24, 57, 38, 49, -164, -7, -32, -107, 71, 37, 32, 99, 341, -21, 24, 51, 90, 36, -267, 61, -38, -28, 159, 8, 83, 112, -127, -72, -30, -128, -272, 17, -96, -13, -14, -2, -55, -134, 50, -128, -30, 34, -135, 156, 65, 48, -49, -7, -10, 35, -33, 83, -104, 46, 197, 153, -32, 81, -40, + 38, -72, 33, 80, 221, -286, 9, -178, 86, 126, 154, -27, -152, 1, 152, 30, 27, -120, -19, -207, 268, -18, -212, 223, 54, 64, -18, -85, -30, -111, -109, 80, 115, -28, 108, -96, -61, -4, 153, 144, -45, -87, 118, 73, 8, 98, 21, -126, 123, 74, -14, -47, 31, -136, 343, -24, -17, 253, -29, -165, -91, -26, 57, -172, 106, 26, -3, -158, -134, -274, -32, 112, 51, 135, -92, -74, 270, -89, 43, -65, -150, -59, 22, -295, 0, -122, -138, 47, -167, 8, 121, 67, 248, -404, 266, -40, + 118, -75, -54, -211, 195, 171, 46, -187, -6, -107, -9, 201, 142, 33, 193, 0, 14, 21, -2, -130, 287, -26, 7, 331, -208, 81, -97, -19, 108, -42, -162, 318, 251, -7, 85, 134, 346, -42, -57, -184, 38, 67, -191, -207, -179, 222, 10, -89, 157, 109, 7, -51, 55, -118, -26, -127, -23, 119, -228, 67, -28, -163, 65, -68, 36, -60, -31, 37, 217, 230, 32, -213, -36, -203, 74, 505, 119, 347, 123, -4, -339, -90, 47, 312, -149, -80, -131, 21, 250, -199, 118, 213, 41, 71, -154, 265, + -68, 348, -12, -122, -347, 29, -8, 389, -131, -47, 245, -13, 23, -98, -275, 12, 140, -207, -163, 21, -331, 154, 160, -75, -37, 66, 160, -40, -131, -32, 240, -64, -67, -134, 308, 300, -16, -105, 7, -73, 23, 115, -89, 53, 51, 13, -219, 237, 182, 21, -143, -161, -66, -327, 396, 300, -56, 116, 42, -56, 301, -16, -131, 444, -467, 130, 210, 7, -188, 216, 38, 309, -111, -24, 85, 129, 25, -32, 442, 198, -196, -293, 215, -294, -84, -339, -41, 529, 216, 260, 5, -267, -43, -126, -58, 398, + -59, -421, -33, 93, -273, -37, 176, 146, -185, -89, 185, 256, -77, 265, -1, 68, 87, 23, 89, 146, 126, 137, -99, -284, -225, 81, 63, 193, -22, 180, -355, 130, 104, 54, -232, -195, -247, 195, 104, -177, -175, 245, 83, -19, -146, -246, -97, 101, -154, 19, -293, -83, 39, 102, 198, -31, 129, 169, -167, -412, 289, 13, -60, 271, -36, 11, -176, 238, -145, -192, -68, 196, 303, 249, 85, 51, -513, 239, -22, 102, -170, -32, -191, -67, -38, -264, -122, -105, -133, 283, -74, 368, -26, -12, 246, 266, + 450, 303, 19, -95, 16, 30, -129, 108, -75, -108, -150, -565, 112, -392, -239, 351, 270, -644, -592, 9, 237, -158, 142, -219, -34, -378, -106, -342, -34, -101, 0, 118, 95, 197, -36, -186, 143, -219, -94, 58, 4, 98, 210, -44, 19, 42, -97, -31, -330, -388, -376, -7, -378, 118, 42, -153, -178, -80, -67, -37, -225, -353, -24, 551, 302, -80, -332, -342, 381, -358, -117, -62, -236, -177, -238, -278, -386, -522, -63, -55, -54, 178, 224, 63, 87, -119, 47, -445, 63, 239, 261, 240, 110, 465, -168, -325, + -74, 66, -54, 152, 317, 619, 400, 230, 300, -231, -437, -151, -323, 389, 104, -78, -258, 439, 392, -137, -9, 0, -207, -188, -321, 102, 138, 194, -301, 29, 114, -148, -290, 8, 205, 237, 65, -614, -193, -306, 152, 361, 28, -348, 111, -337, 214, -87, 61, -242, 526, 381, -87, -124, -248, -29, 433, 82, 523, 452, 423, 194, 118, -318, -110, -347, 401, 332, 228, -260, -34, 263, 428, -363, -449, -383, 510, -153, 356, 36, 49, 792, -46, 96, -288, -478, 175, -37, 186, 131, 5, -257, 131, 151, 100, -240, + 234, 175, 597, -212, 88, 340, 357, 53, 361, -37, 65, 318, 287, 104, -66, -399, -279, 301, 50, -58, -30, 109, 652, 7, -146, 347, -83, 331, 134, 902, -101, 20, 67, 176, 363, -7, -26, 243, -324, 384, 682, 241, -33, 391, -21, 60, 739, -302, 252, 302, -82, 352, 45, 59, 121, -453, -150, 268, -170, -248, -228, -229, 8, 270, -67, -677, -30, -519, 162, 191, -27, 79, -251, -50, 231, -648, 126, -158, 315, 221, 122, 7, -286, -585, -67, -514, 267, -16, -189, 501, 230, -227, -206, -128, -122, -165, + -325, 31, 34, 733, -73, -558, -50, 348, -24, -298, 122, -440, 224, -199, 127, -267, 51, -452, 1061, 15, 709, -106, -290, 166, -337, -279, 327, 333, -420, -942, 634, -397, -258, -28, -145, -58, -484, -174, -150, -416, -733, -182, 7, -389, 185, -168, 319, -281, -122, -399, 942, 800, -185, 178, 545, -580, 581, -245, -251, 212, 71, 101, -93, -127, 10, 191, 157, -256, 288, -275, -469, 338, 287, -382, -486, -549, -89, -88, 147, -356, -459, -226, 747, 269, 249, -318, 284, 405, -319, 750, 130, -258, -356, 207, -300, -625, + 147, 4, 7, 360, 317, -265, 48, -790, -102, -290, 641, 60, 87, -326, 271, -495, -20, -141, -356, 443, 466, 422, 283, -7, 385, 351, 54, -70, 152, -2, -402, -50, 145, -313, 438, -465, 364, 401, -123, -94, 164, 536, 396, -489, -114, -133, -47, 119, -236, -241, 519, 10, 749, -499, -481, 379, -264, 134, -310, 251, 278, 188, -133, -440, 28, 139, -378, -671, -40, 54, -412, 712, -103, -212, 932, 889, 65, -135, -61, -205, 185, -488, 407, 38, -297, 504, 41, 71, -218, -328, -731, 71, -148, -79, -22, -31, + -804, -1841, 595, 563, -221, 113, -456, 771, 487, -463, 111, 90, -5, -218, -161, -958, 381, 447, -124, -17, -70, 296, -253, 580, 160, -727, -419, 883, 574, -604, -155, -226, -376, 38, -161, 110, 1153, 301, 1210, 683, 773, 702, 1395, -111, -148, 318, -116, -1203, 943, -436, 534, -804, -641, -1192, 215, -129, -411, 263, -567, -21, -803, -808, 201, 433, -658, -196, -462, -637, -704, -516, 338, -307, -838, 1004, 646, 907, -291, -260, -683, -1761, 736, 881, -426, -198, -62, 1000, 16, 197, 199, -262, 187, 453, -110, -480, 99, 844, + -474, -313, 176, -147, 636, -189, 280, -362, -415, -430, 413, -157, 365, 410, -126, 27, -9, -393, 108, -361, 374, 910, 1541, -56, -55, -695, 345, 466, -25, 527, 805, 299, 454, -763, -441, 546, 1541, -336, -921, 177, -313, -75, 410, -55, -426, -267, -226, -1130, -455, -73, 154, 262, -74, -478, -207, -27, -153, -358, 196, 538, 169, 275, 98, 820, -279, -119, -344, 179, -220, 169, 930, 173, -1019, -258, -309, -871, 528, 244, -116, 109, 37, -398, -20, -39, -399, -126, 809, 1203, 556, -434, -685, 306, 539, 53, 428, -318, + -230, 449, 129, 0, -1034, -1335, -57, -781, -465, 274, 1098, 239, 43, -323, -397, -557, -501, 95, 326, -113, -559, -878, 348, 37, -498, -810, -561, -889, -1641, -962, -134, -149, 1952, -182, -31, 1149, 288, 224, 618, -428, -827, -471, 626, -885, 225, 144, -387, -1241, 847, 257, -81, -1255, 333, 202, -668, 118, 580, 367, 166, -562, -121, -203, 95, -204, 47, -430, -643, 710, -489, 1073, -662, -577, -410, -728, 56, 3, 1103, -807, -881, 468, 275, -700, -970, -84, -553, 643, 118, -767, 500, -109, -1234, 829, -560, 553, -924, -191, + -43, -348, -175, 141, 1123, -270, -130, -287, 303, -498, 397, 944, -83, 943, 668, -35, 1291, -12, 163, 74, 141, 1194, 273, -37, 834, -1662, 45, -1869, -639, -333, 545, 1691, 1435, 517, 839, -576, -488, 64, -145, 376, 106, -406, 554, 824, 682, 504, 423, -36, 58, -309, 778, 351, -175, -515, 142, 304, -110, 1021, 1068, -657, -492, -3, 823, 503, 109, 76, -231, -411, 181, 1273, -559, -677, -736, 649, 244, -426, -646, -1012, -1195, 87, 209, 166, -303, -129, -369, 179, -977, -1567, -745, -165, -327, -657, 669, 1149, -376, 513, + 1148, 681, 124, -876, 289, 248, -1042, 846, -104, 728, 443, 20, 484, -207, -51, 417, 510, 82, 5, -13, -459, -296, 125, -639, 19, -237, 17, -541, 95, 35, -495, 420, 178, 286, -622, -163, 118, -27, 46, 363, 79, 106, -72, -133, -98, -46, 231, -99, -399, 328, -548, -166, -189, 71, -270, -312, 415, -47, -421, 262, -587, 474, 142, 29, 477, 541, 70, 158, -407, 524, -260, -352, -36, 78, 965, -431, -701, 588, -246, 492, -159, 93, -216, 293, 427, -311, -2809, -5281, -1935, -4155, -4724, 1054, -241, 1475, 5930, 6437, + 4519, 6482, 5310, 1711, 1807, 1319, -3703, -3808, -2157, -3699, -3997, -1387, -1232, -3373, -2563, -475, -1550, -1872, -525, -1448, -2512, -1454, 383, -1040, -1275, 1375, -310, -1414, 1172, 2235, -590, 525, 3491, 449, -1182, 2320, 2012, -2068, 1129, 2576, -837, 273, 4483, 3438, 1728, 6334, 7037, 3636, 6509, 8423, 5311, 5049, 6974, 4556, 2940, 3285, 1790, -1608, -3152, -4248, -7340, -8211, -8550, -9989, -9265, -9301, -10202, -9032 }, + {30, 34, 66, 78, 88, 64, 13, -3, -63, 62, -99, -75, 31, 28, -95, 178, -55, 53, -57, -51, 38, -15, -31, -17, 11, -56, -27, -111, 67, 51, -88, -38, -39, -97, 31, 18, -4, 23, 36, 8, 31, 102, -144, 28, -23, 98, 82, -66, 190, -116, -125, 32, 84, 54, -23, -27, -21, 29, 30, -9, -76, -60, -41, -94, 10, 63, 16, -20, -18, 115, 43, 46, 75, 36, 18, 33, -132, 112, 120, -55, 121, -70, -14, 160, -64, 77, 47, -174, -78, 134, -50, -23, 84, 57, 60, 18, + 204, 37, -51, 47, -69, 128, -35, -67, -29, -163, -55, -119, 41, 0, 45, -46, 70, 35, -7, 23, 12, 18, 23, -85, 218, 34, -79, 163, -38, -136, -152, 152, -29, -9, 99, 14, -25, 80, -8, 48, 13, 60, -29, 65, -28, 77, 107, 62, -62, -59, -30, 32, -60, 50, -27, 63, 78, -17, 1, 141, 29, 33, 119, 3, 86, 42, -8, 11, -90, 45, 9, 145, 52, 49, 8, 44, 158, -146, 85, 24, -97, -42, -60, -18, -56, 42, 182, 116, 136, 110, 186, 137, -167, -302, -38, 17, + -74, 163, -7, 243, -112, -110, 103, 8, 8, 97, -176, 47, -127, 169, 97, 2, 252, 13, -26, -29, -46, -61, 118, 66, -64, -18, -179, -76, -27, 185, 121, 23, 84, 6, 85, 7, 28, -96, -58, 35, 104, 245, 67, 5, 1, 65, 59, 9, 33, 51, -11, -11, 65, 279, 88, 217, -134, -108, -49, -139, -164, -68, 108, -198, -35, -28, -312, 56, -315, -107, -50, 68, -8, 59, -69, -8, -217, 71, -79, -120, 11, 53, -21, 10, 77, 152, -276, 67, 6, -83, -97, -22, 23, -41, -173, -43, + 29, 77, -26, 191, 1, 2, 63, -133, 168, 52, 91, 40, 69, -30, -45, 37, 5, -35, -82, -36, -121, -42, 151, 165, -5, 182, 12, -23, 23, 16, -33, -1, -126, -72, 114, 133, -154, -37, 66, -103, -296, 74, 111, 129, -67, -79, -105, 162, 186, 32, 74, -145, -116, 137, 53, -109, 192, -192, 33, 18, 180, 65, -39, 28, -61, 97, -232, -70, -335, -148, 171, -16, 262, -37, -218, 136, 31, -91, -10, 8, -88, 55, 156, 173, 4, 80, -10, 196, -105, 80, -22, -11, 1, 56, -22, 210, + 3, 15, -26, 123, 191, -242, -27, -162, -168, 70, 41, 371, 26, 141, -296, -65, 74, -150, 111, 38, 33, 96, 110, 246, 113, -30, 83, -111, 42, 104, 1, 28, 113, 145, 337, 73, -42, -217, -3, 180, -260, 38, -13, 92, -127, -149, 292, -174, 66, -3, -172, 421, 113, 225, 123, 245, -37, -80, 158, -130, 123, -102, 69, 172, 96, -65, -6, 92, -139, -99, 13, -9, 246, -123, -217, -34, 124, 192, -104, -143, -5, 203, 34, -105, 100, -404, 215, 56, -97, 111, -332, -279, 26, -143, 297, 262, + 280, -202, 104, -6, 279, 10, 195, 71, -94, -269, -243, 65, -321, -15, -82, -163, -216, -133, -6, 241, -6, 87, -365, -211, -45, -236, 9, 214, -250, 89, -10, -94, -29, -63, 241, 121, 117, -71, -82, 329, -109, -105, -287, 194, -404, 43, -137, 51, 136, -107, -219, -143, 9, 277, -150, -43, -188, -157, 89, 83, 196, -221, 36, 64, 34, -385, 81, 18, 44, -524, 435, -6, -29, -24, -184, 38, -14, 147, -162, 167, 32, -127, -216, -258, 102, 8, -42, 4, -162, 139, 92, 268, 145, 99, 132, -48, + -178, -127, -14, -92, 98, -147, -232, -237, -11, -320, 117, 154, -212, 182, -251, 105, -358, 38, -88, 18, -116, -10, -337, -56, -135, -199, -82, -155, 18, -139, -111, -199, 56, -189, -45, 302, -80, 6, 63, -58, -274, -301, -79, -178, 140, 94, -321, -17, 51, -301, -339, 174, -332, 55, 214, -168, -380, -171, 6, 238, -103, 428, -32, -45, -255, -191, -31, 77, 24, -103, -76, -34, -94, -201, 156, -170, -94, 149, 51, -281, -280, -276, 228, -258, -257, 408, -263, 169, -32, 95, -378, 155, 28, -83, -12, -97, + 132, 68, 370, -115, -59, 146, 359, 69, 82, -193, -97, -317, -48, -38, 11, 177, -52, 81, 366, -90, -2, -71, -37, -391, -283, -70, 222, 156, -26, 185, -29, -78, -113, 157, 96, -87, 71, 159, -84, -542, -237, -106, -61, 242, -426, -312, 260, 162, 656, 185, 150, 181, 82, -118, 12, -124, 207, 10, 209, 7, -8, -288, 148, -195, 150, -30, 157, 63, 211, -334, 37, -231, 275, 17, -282, 368, 270, 175, -170, -564, 159, -62, -73, 274, -30, 125, 262, -62, -342, -6, 146, 94, -96, -43, -253, 87, + 25, 46, -47, 27, 169, -114, 77, -71, -55, 146, -149, -606, 131, 155, 627, -124, -94, 300, 392, -623, -353, 349, -172, 17, 147, -394, -871, -338, 505, 402, 342, -96, 194, -97, 179, -177, 67, -437, 114, -151, 233, 226, 14, -204, 212, 136, 363, -32, -216, -105, -557, -282, 143, -33, -371, 260, 355, -491, 485, -41, -48, 307, 66, 290, -34, 106, -105, -54, 147, 577, -205, 368, -29, 37, 138, 319, -292, 35, 458, 128, -208, 105, 157, 14, 237, 137, -31, -401, -104, 410, 259, 309, -205, -103, -36, -44, + 438, 57, -458, -202, -143, 291, 52, 63, 242, 542, -806, 532, -111, -93, -213, 160, 157, 314, 41, 300, -39, -76, 84, -46, 143, 277, 23, -17, 350, -263, -61, 92, -43, 322, -386, 40, -333, 58, -353, -41, -4, 194, 445, -260, -165, -270, -34, -397, -283, -257, 160, 342, -17, 670, -440, 600, -437, -85, 157, 142, 543, 329, -417, 231, -182, -382, -54, -345, 241, -375, -225, 32, 545, -58, 263, 509, -357, 211, -594, 422, -349, -151, 654, 247, 701, -244, 44, -261, 232, 888, 258, 327, -389, -44, 62, 366, + 329, 582, -401, -115, -440, -369, 72, 73, 327, -239, 242, -614, 452, 351, 190, -70, -34, 83, 238, 105, 99, 38, 489, 422, 210, 76, -291, -289, 964, 77, 162, 555, 275, -100, -57, 371, 713, -431, -145, -489, -442, 692, 348, 74, -40, 247, 557, 373, 466, 174, -72, 370, 21, -25, 194, -431, -325, -128, -404, 447, -57, -115, -386, -63, -360, -873, 143, -107, -284, 199, -473, -26, -263, -698, -171, -300, -343, 565, -161, -196, -114, -7, -155, -191, -45, 156, 460, 366, -28, -18, -811, 59, 93, 337, -200, -153, + 1188, -194, -607, -558, 482, -320, 125, -663, 149, -173, -385, -296, -794, 143, 198, 568, 136, -277, 406, 73, 379, 476, 1274, 372, 57, -470, -591, -115, -15, -50, -431, 207, 332, -55, 151, -171, -523, -224, -78, 167, -190, 318, -160, -211, 611, 322, 694, 15, -199, -267, 735, -623, -233, 863, -515, 179, 180, 230, 52, 490, -149, 442, -163, 104, 104, -212, 322, -476, -338, -305, -144, -421, -798, -132, -238, 141, -205, -1046, 296, 680, -37, -126, 1043, -1275, -278, 739, -175, 579, -409, -235, 198, -1212, 403, -397, 621, 475, + -648, 1319, 199, 95, -57, 538, -919, 410, -22, -109, 278, -535, 762, 828, -1215, 254, -129, 294, 82, 834, -313, -979, -984, 124, 168, -408, 309, -527, 224, -214, 568, 720, 63, 698, 635, -285, 32, -377, -66, -53, 270, 6, -25, -23, -644, -987, -376, 589, 458, -394, -470, 350, 343, -622, 381, -395, -42, 576, 766, 61, -387, 334, 98, 509, 121, 436, 432, -48, -1440, 232, 85, 668, -172, 681, 655, -334, -1959, -194, 134, -162, 1266, 1355, 946, 1351, -258, 684, -391, 904, 602, -733, 1193, -1026, -825, -613, 578, 262, + -765, -1472, 347, 588, -51, 797, 322, -915, -211, 238, 262, 298, -164, 478, 64, -244, -104, 196, 651, 858, 643, 1022, -918, -218, -221, -919, -208, 212, 72, 155, -361, -385, 511, 1151, -499, 620, -351, 201, -322, -4, -838, -255, -29, -1129, -675, -1101, -962, 715, 1552, 1291, 54, -7, 23, -203, -509, -1784, -603, -186, 171, 165, -637, -368, 260, 915, 509, 367, 560, 1025, 384, -783, 718, -367, -167, 585, 1088, 439, 1344, 376, -653, -1061, 638, -113, -646, 295, 678, 586, -1240, -1071, 252, -503, 113, 589, -339, -251, 978, 259, + -151, -326, -295, 362, -237, -54, -43, -414, -170, -681, -908, 310, 474, -573, 399, 273, -210, -401, 46, 699, 393, 120, -722, -799, -400, 207, 870, -670, -366, -308, 514, 1422, 363, -1403, -325, -170, 702, 12, 356, -186, -346, -313, -805, 733, 765, 312, 812, -262, 519, -245, -605, -639, -679, 131, -1240, 1249, -206, -491, -914, 942, 675, 180, 30, 377, 327, -854, -1179, 230, 687, 1045, -126, -388, -864, -556, 357, -140, -760, -1384, -1395, 139, -516, 580, -1590, -606, 141, 82, 134, -586, 66, -166, -417, -181, -828, 500, 625, 447, + -1069, -620, -176, 180, 304, 361, 236, -237, -228, -259, 489, 1681, 979, -1087, -1106, -735, -1380, 1269, 570, -587, -1434, -1344, 1158, 677, -24, 877, -1301, -298, -161, -470, -141, -608, -1316, 27, -1129, 696, 533, -524, -342, -221, -447, -366, 723, -1148, 1024, 1514, 1632, -1812, 342, -36, -154, 799, -330, -518, 535, 301, 1109, -84, -887, 58, -410, 692, -1024, -323, -489, -637, 910, -636, -113, 679, 350, -179, -376, -900, 97, 1298, 733, -1, 341, -227, 987, -630, 435, -318, 595, 1116, -276, -617, 292, -862, 1496, 255, -872, -203, -1335, 244, + 1774, -249, -1140, -664, 1055, 431, -661, 72, 214, 738, 1462, -1147, 471, 1368, -287, -1250, -1400, -713, 1906, -1538, 516, -679, -1306, 1808, 663, -1720, 300, -1546, 680, 731, 1441, 640, 328, 378, -454, -1103, -772, -723, 305, 181, -193, 662, 1012, -453, -645, 710, 120, -939, -223, 431, -784, -133, 164, 400, 202, 565, 950, 175, -621, -64, 175, -479, -227, 456, -351, -607, 844, -198, -223, -331, -348, 564, 128, 138, 725, -342, -585, -21, 40, -229, 174, -26, -219, -21, -735, 177, 124, -105, 371, 281, 118, 192, -753, 881, -327, -289, + 231, -656, 192, -494, 165, -211, -784, 1307, -52, 746, -649, 97, -105, 246, 225, 407, -184, 303, -163, 173, -13, 140, 328, -25, 500, -180, 382, 33, 1, -123, 251, -173, 228, -111, 32, -90, 133, -71, 292, -73, -175, 453, -287, 243, 203, 80, 232, -258, -169, 214, 207, -107, -7, 227, -1, -290, 151, -142, 174, 220, 118, 82, 88, -314, 178, 101, -77, 127, -132, 83, -55, -7, -20, 121, 237, -286, 276, -43, -74, 141, -137, 85, 95, -22, 320, -1090, -3397, -500, 1647, 853, 4008, 745, 860, 542, -1083, -1521, + -1087, -1949, -1678, -950, -394, 1116, 3040, 2416, 2076, 1184, -943, -1524, -1128, -2100, -1996, -608, -285, -463, 765, 1208, 791, 1474, 1131, 351, 1039, 216, -164, 100, -639, -1656, -1418, -1194, -1690, -700, 481, 342, 1068, 1225, 1057, 1100, 1108, 714, 682, 82, -631, -1152, -802, -1084, -1453, -703, -673, -530, 194, 558, 512, 1025, 1251, 625, 887, 782, -120, 236, 413, -265, -170, -516, -1140, -1109 } + }, + { + {48, 83, 12, 47, 104, -32, 111, 29, 21, -128, -31, -127, -15, 128, 93, -9, 59, -18, 49, -16, 61, 51, 66, 157, 66, -115, -10, -131, 68, 49, -19, 13, 15, -28, -40, 78, -35, 25, 71, -70, 118, -28, 1, 56, -24, 18, 14, 59, 93, 2, 15, -34, -4, 5, -51, -50, 59, 158, -13, -89, -78, 49, 79, 89, 52, 127, 9, 91, -71, -51, 60, -21, 69, -10, -11, 31, 37, -1, -109, 82, 51, -108, -20, 137, 40, 34, 75, -18, 20, -36, -144, -56, -8, -32, 40, -44, + -15, -121, -2, 21, -87, -18, -110, -38, -36, -130, -62, 42, 55, 147, 85, 188, -22, -30, 25, -64, 161, 11, 74, 130, 20, -51, 50, -68, -95, -22, -43, -49, -173, -53, -3, 28, 47, 16, 82, -94, 72, 1, 15, 56, -71, -148, -69, 66, 89, 72, 1, 73, 47, 96, 41, 41, -57, 4, -26, -81, 72, -123, -76, 192, -34, 170, -90, 15, 83, 36, 4, -118, -166, -173, 16, 2, -50, 21, -153, 299, 32, -170, 43, -90, -98, 88, 126, -4, 27, 59, -11, -1, 98, -57, -27, 4, + 181, -6, -23, -71, -110, 54, -29, -113, -52, -135, 16, -123, 1, -94, -32, -83, -170, -71, -12, 156, 22, -48, 84, 142, 20, -200, 89, -3, 35, 62, -48, 121, -64, -110, -114, -198, 13, -62, -76, -77, -158, 246, -70, -237, 11, 71, 1, 65, 53, -189, 59, -50, -13, 0, -39, 131, -49, -98, -14, 103, 64, 33, 60, 261, 66, -101, 116, -121, 32, -100, 248, 30, -88, -59, -88, -38, 163, -144, -118, -45, 134, 69, -134, 25, 24, -87, -1, -287, 87, -76, -57, -187, 260, 2, -143, -122, + -140, -4, -34, 0, -6, -175, 205, -135, -114, 65, 16, 63, -66, -33, -133, -13, 14, -169, -118, -17, 219, 6, 47, -182, 56, 104, 76, -8, -91, 236, 41, -48, 113, 92, -110, 144, -97, 238, 34, 212, -23, 36, -83, -243, 26, 3, 9, -43, 50, 125, -32, -126, -82, -178, -48, -89, -93, 14, 61, 93, -113, 76, -75, -97, -12, 78, 16, 17, -176, -174, -32, -54, -129, 277, 131, -22, 54, 108, -283, -148, 190, -112, 178, 34, -38, -198, -142, 217, 117, 199, -217, -25, -153, -31, 30, -70, + -56, -7, -85, 22, -369, 20, -47, 101, -223, 72, -75, 375, -99, -193, -70, -162, 51, 139, -44, 262, 27, -77, 64, 32, 69, -92, -16, 98, 154, 61, -30, 74, -136, -42, 194, 139, 227, 162, -3, -115, -241, 168, -25, -176, 93, -46, -269, 8, -224, -17, 205, -33, -150, -69, 197, -168, -275, 282, -51, -66, 68, 38, 36, 70, 70, 40, -201, -74, 161, -17, -56, 53, 272, -127, -134, -56, 109, 35, -226, -91, -320, -3, 91, 317, 327, -100, 165, -203, 72, 142, 211, -56, 315, -54, 268, -140, + 225, -107, -364, -79, 96, -123, 146, -75, -85, 44, -399, -126, -5, -66, -21, -190, -64, -65, 67, 415, 240, -235, 134, 333, 85, -111, 85, -82, -95, 240, 167, -160, -19, 173, 355, -110, 194, 528, 227, -237, 99, 65, -289, 47, -239, 111, -261, -58, 12, 128, -171, -44, -85, -151, 189, 162, -16, -90, 34, 36, 22, 113, 88, 136, -77, -334, 70, -270, 37, -94, 336, -180, 43, 83, 29, 117, -55, 366, 25, -249, -49, -185, -33, -65, -171, -217, -58, -142, -67, 232, 86, -209, 76, -248, -48, 168, + -331, -298, 163, 148, 79, -17, -201, 72, -100, -196, -88, 3, 60, 305, -123, -43, 17, 139, 78, -115, -138, -258, -74, -62, -134, -167, 107, 203, 4, -138, 238, 41, -106, 25, -24, -32, -65, -42, 155, -105, -122, -95, 156, -50, 201, 173, 327, -238, -6, 225, -103, -154, 205, -316, -18, 64, -40, -114, -140, -62, 56, -12, 154, 83, -51, -116, -89, 259, 9, -302, 143, -188, -192, 125, 221, 234, 170, 3, 114, 88, 107, -92, -8, -82, -226, 103, -61, -2, -53, 32, -41, 257, 451, 87, -85, 11, + -332, 330, -229, -131, -221, -248, 436, 39, -254, -73, 298, 175, -241, -155, 342, 47, 27, 468, -220, 151, -173, -389, 206, 224, 58, 142, 185, 352, 322, -25, 273, 116, 279, 268, -476, 157, -162, -213, -158, -56, -307, -74, 62, -266, -531, 107, -47, -482, -355, -320, -182, 4, -98, 99, -72, 174, 353, -221, 113, -95, -177, -135, 12, -49, -25, 258, -21, 259, 344, 92, 142, 220, -41, 33, -360, 312, -296, -116, -101, 13, -89, -288, -250, -542, 465, -554, -532, 70, 488, 158, -78, -146, 215, -271, 264, -108, + 23, 0, -210, 126, -163, -174, -42, 53, 229, 296, 295, 321, 740, 340, 427, -193, 685, -372, 29, 162, 7, -240, 94, -56, -565, 232, -135, 76, -45, -176, 9, 186, -223, -105, -28, 151, -342, 238, 92, -305, -17, 148, -284, 126, -342, 179, -23, -95, -7, -210, 299, 365, -324, -170, 155, -99, 97, 103, 27, 31, 405, -81, -264, 268, -7, -189, -174, -311, 65, 112, 166, 181, -155, -236, 142, 93, 487, 77, -65, 37, 4, -123, -55, -144, 45, -390, -439, 740, 517, 662, 46, -421, 153, 346, 249, -106, + -264, -77, -95, -128, -227, -91, -190, 493, 83, 82, 8, 30, 56, -181, 330, 184, -15, 118, -42, 335, 66, -30, -544, -41, 39, 51, -98, 67, -256, 443, 364, 346, 307, -241, -326, 251, 82, 121, -19, -388, -276, 18, -215, -2, -180, -85, 232, 67, -164, 52, -425, 5, -723, -376, -685, 578, 525, 547, 660, 303, -131, -299, -118, -52, 93, 361, -154, -256, -346, 315, 408, -193, 380, 57, -153, 155, -536, -164, 159, -169, -325, -622, 315, -265, 80, 410, 105, 477, 370, 210, 86, -276, -73, -143, 35, 267, + 147, 58, 235, 647, -23, -543, -229, 92, 144, -28, 26, 56, -220, 18, -501, 120, -523, -192, -401, 210, -191, -337, 541, 152, 63, -229, -291, 85, 148, 54, 196, -258, 616, -702, 218, -284, -398, -224, 413, 136, -352, 310, -241, 772, 7, 20, -239, 139, -353, -236, 743, 765, 721, 153, -195, -123, -468, 377, 9, 220, -141, 69, -172, -133, -271, 144, -282, 459, -1203, -352, 7, -366, 257, -376, 76, -146, 377, 65, 362, 24, -87, -8, 132, -423, -304, -330, -48, 408, -811, 279, 702, 84, -519, -22, -437, -419, + 287, -57, -358, 196, 28, -135, -203, 113, 290, 175, -416, -304, 233, 353, -293, -387, 186, 398, -490, -19, -437, -595, 696, -120, 100, -127, 400, -84, -27, -245, 251, 78, 30, -185, -58, -622, -315, -179, -535, -748, -177, -281, 614, 151, 935, 130, -329, 82, 139, -849, -1, 656, 400, -516, 17, 304, -693, -152, -371, 225, -301, 131, -5, -177, -14, -52, -257, 169, -488, -222, -239, -602, -167, -125, -43, -14, -203, -228, 948, 245, -444, -767, -313, 14, 668, -236, -153, -468, -169, -349, 531, -549, 465, 602, -747, 376, + 98, -367, -335, 81, 230, -1557, -283, -111, -307, 231, -280, -1065, -444, -481, -540, -214, 164, 982, -35, -1150, -649, -712, -140, -393, -24, -582, 948, 571, -111, 755, 13, 815, 184, -463, -649, -396, -527, -223, 114, 359, -127, 125, -440, 84, -628, -43, -51, 225, -247, 999, 110, -9, 635, -235, -482, -251, 381, -8, -283, 134, -24, 863, 185, 32, -346, -473, -1298, 117, -1036, 552, 1717, -1201, -288, 327, -235, -168, -368, 347, -376, -1142, -334, -1129, -260, 36, -744, -26, -1054, 550, -34, -409, 1308, 146, 397, -375, -2039, -228, + -535, -583, 719, 568, -727, -577, 1371, -174, 432, 56, -91, -176, -169, -466, -24, 145, 230, 153, 478, -405, -29, -395, -246, 140, 685, 439, 602, 544, -145, 188, 315, -12, -591, -117, 771, -154, -1151, -510, 103, -969, -435, -993, -695, -624, 885, 609, -219, 610, 217, 866, 567, 272, -1563, -353, 47, -1362, -1012, -388, -285, -1592, 320, 874, 1156, 1407, -495, -918, -48, -955, -706, -1212, -1343, -835, -339, 1025, -13, -217, -584, -1471, 633, 115, -986, 1005, 523, 339, -180, -879, -186, 70, 944, 1234, 118, 364, 126, 79, -7, 203, + -449, 1721, 454, -507, -498, -203, 126, 862, -345, -84, 53, 456, -344, 260, 83, -52, -1332, -394, 502, 760, 313, -114, -341, -874, -41, 190, -157, 57, -178, -549, 657, -96, 277, -590, -68, 1657, 187, -136, 255, 253, 220, 855, -230, -323, 676, -24, 431, 269, 596, -139, -497, 349, -143, 23, 1880, 1753, 788, -163, 483, 983, 14, -1316, -448, 127, 37, -418, 752, 309, 206, -429, 901, -196, -117, -413, 412, 236, -943, -1298, -472, 64, -80, -355, -1221, -239, 232, -45, -513, -279, -475, -542, 97, 175, -845, -900, -427, -1086, + 98, 708, -901, 676, -547, -574, -996, -1279, -1468, -1352, -808, -130, 282, 84, 277, -776, -1633, -700, -1581, -2560, -1125, 1824, 3143, 1833, -1035, -795, -3204, -2815, 1637, 181, 2180, 2338, 2336, 751, -1114, -1070, -1405, -1791, -972, 433, -125, 215, -778, 1048, 499, 928, -2099, 450, 271, -666, 458, -505, -245, -170, -304, 870, 1649, -510, 329, -261, 395, 811, -258, -186, -457, 208, -287, -947, 672, 1089, -141, -626, -530, -1223, -314, 860, 625, 273, -1290, -799, -550, 1114, 1025, 837, -2522, -1739, -178, 1215, 2723, -34, -3203, -1235, 148, 1048, -46, 556, + 501, -1456, -565, -432, -788, 19, -1526, 213, 706, -1959, -1144, -623, -142, 2059, 128, -3125, 453, 612, 633, 855, 957, -1417, 928, 716, -1730, 240, -1273, 227, 1067, 948, 302, -618, 113, -366, -103, -453, -349, 235, 49, -658, -91, 348, -90, 44, 107, -416, -437, -3, 257, 46, -694, 67, 322, 120, 56, 717, -103, -173, 225, 286, -505, -510, 362, 95, -437, 293, 84, 155, -319, 139, 282, 66, -438, 571, -108, -575, -26, 509, 101, -360, 311, 160, -606, 271, -28, 612, -573, 96, 327, -845, -35, 431, -73, 296, -198, -434, + 20, -508, 263, 361, 222, -834, 1417, 217, 651, -524, 261, -98, 188, 174, -215, 115, 275, -126, 576, 47, 37, 212, 201, 2, -124, 261, -19, -142, -16, 263, -240, 79, 135, -304, 428, -57, -180, 655, -242, -346, 307, 186, -157, 300, 236, -49, -72, -22, 98, 185, 108, 27, -93, 353, -330, 341, 64, -8, 102, 129, 116, 45, -293, 118, 279, -156, 13, 34, 216, 14, -66, 340, -141, 198, -295, -83, 313, -229, 277, -37, 177, 231, 326, -1154, -3690, -188, 1987, 893, 4237, 363, 893, 39, -1238, -1555, -1057, -1894, + -1329, -832, 27, 1450, 2848, 2103, 1823, 599, -998, -1456, -1317, -1542, -1720, -690, -334, -144, 830, 1115, 830, 1558, 996, 379, 1035, 31, -461, -292, -944, -1909, -1173, -1113, -1153, 68, 523, 378, 1399, 1167, 787, 1149, 1199, 354, 351, -116, -1052, -1432, -1115, -1434, -1042, -345, -268, 106, 779, 637, 544, 1125, 894, 676, 1105, 349, -171, 111, -168, -518, -87, -526, -1102, -872 }, + {-16, -9, -17, 123, 80, 14, -46, 63, 110, -34, 122, -77, -24, 79, 27, -137, 44, 85, -189, -4, 157, -92, -131, 131, -105, 26, -77, 11, 11, 11, -6, -96, 138, -63, -31, -85, -87, 5, -18, -65, -108, -88, 168, -19, 66, 45, -9, 127, 36, 88, -8, -68, 89, -124, -65, 0, -11, 11, 32, 90, -29, -20, -35, 23, -10, -26, 61, -5, 76, -16, -50, -50, 6, 9, -13, 16, 112, -15, -80, 24, 103, -5, 13, -143, -70, 26, 199, -121, 45, -198, 211, 18, 80, -20, 37, -35, + -67, -171, 79, -172, -78, -95, 104, 84, 43, 87, 161, 15, -137, 98, 20, -2, 81, -23, -47, -202, 38, -54, 50, 92, -107, -39, 108, 38, 18, -100, 272, 166, 32, 135, 112, 109, -237, 22, -17, -58, 66, 47, -32, -38, -5, -65, 80, -19, 151, 4, -26, -55, -108, -8, 99, 16, 32, 108, 71, 17, 54, 16, 68, 225, -102, 78, -56, -92, -35, -62, 125, -96, -180, -43, 53, -150, -88, 177, 305, -47, 120, -99, -103, -1, 37, -10, 2, 115, -185, 66, -8, -36, -155, 17, 10, 94, + 33, -122, 172, -129, 161, -14, 35, 66, -11, -74, 128, 33, 169, 28, -135, 262, 214, -68, -13, -47, -170, -94, -20, -28, 82, -95, 18, 74, 11, 1, 0, -12, -83, 156, 20, 0, -24, -3, -68, -103, -242, 270, -74, -46, 189, -92, 91, 437, -67, 1, -185, -151, -227, 112, -102, 48, 105, -147, -129, -97, -4, 32, -180, -78, 59, 50, -80, -40, 88, -117, 3, -65, -33, -86, 48, -80, 14, 47, -42, 177, -6, -38, -154, 4, 187, 15, 53, -197, -279, -109, -242, -213, -20, -99, -23, -256, + 193, -238, 18, 141, -155, -249, -183, -63, 140, 125, 193, -137, -124, -99, -87, 128, 19, -68, -45, 45, 247, 27, -96, 15, -79, -17, 174, 289, -96, -100, -258, 34, 69, 149, -95, 160, 29, 247, -194, 32, -369, -41, 49, -92, -79, -34, 143, -113, -191, 55, -282, -64, -132, 62, -24, 96, 20, -221, -229, 5, 135, 234, -38, -97, 206, -218, -108, 103, 104, 154, -137, 4, 73, -95, -18, 91, -120, 174, -61, -33, -171, -156, 93, 0, 23, -25, -93, 111, -47, 138, 24, -159, -155, 76, -53, 47, + -158, -147, -19, 160, -386, 106, -160, 160, 181, -175, -337, 63, -34, 236, -121, 335, -123, 227, -250, -83, 122, 173, 57, 14, -149, -6, -115, -143, 100, -120, 65, 47, 77, -61, 161, -12, 140, -13, -234, -24, -67, 42, 258, 33, -9, 5, -88, 103, -82, 148, 152, 70, 66, 267, -50, -25, -187, 162, 136, 48, 44, 48, 22, 95, 163, 125, 70, 80, -25, 223, 81, -12, -134, 101, -29, 298, 161, 70, -76, -54, -507, -272, 110, -93, 213, 214, 318, 137, 132, 85, -369, -75, -46, 42, -33, 126, + 87, -135, -111, 106, 186, 240, 202, 272, -140, -133, -187, 212, -114, 177, -40, 2, -176, -95, -101, 163, 187, 44, 187, 279, -107, 80, 312, -145, 100, 119, 9, 248, 299, 243, 520, 111, -79, -83, -95, 8, 85, 173, -37, -37, -64, -126, 49, 91, 124, -313, -58, 96, 199, 161, -283, -185, 32, 65, 174, -165, -37, -40, -36, 129, 253, -28, 56, 216, 317, 180, -339, 5, -361, -256, -151, -27, -218, 270, 105, 161, -448, -30, 305, 154, -126, -189, -109, 118, -340, -18, -215, 345, -36, -98, 46, -10, + -49, 62, -80, 161, 124, 230, -6, 13, 365, -110, 249, -37, -29, 623, 88, -65, -126, -480, 66, -492, -67, 522, -129, -99, -342, -103, 33, -190, 126, -14, -241, 288, 127, 99, 106, -184, 242, -304, 127, 135, 87, -3, -34, -69, -95, 42, 217, -395, 190, -130, -193, -183, 170, 212, 130, 358, 268, 65, 118, -256, 69, 135, 281, 65, -114, 111, 139, -229, 50, -235, 208, 189, 242, -208, 149, 256, -95, 75, 337, 2, -185, -147, 87, -41, -189, -72, 18, 59, 125, -129, 240, 148, -37, 282, -19, 113, + 371, -369, 714, -313, 110, 219, -59, -31, 102, 480, -12, -59, -1, -107, 243, 262, -71, 111, 101, 84, 155, 163, 4, 216, 94, 237, 311, 193, -319, 627, -190, 122, -451, 185, -398, 316, 39, -84, -221, 298, 47, 190, 203, 101, -332, 175, -198, -38, 163, 167, 48, -64, -331, 46, 324, 33, 214, 225, -345, 193, -170, -182, 274, 287, 163, 159, 57, 152, -355, -170, -105, 4, 404, 180, 168, -37, 186, -18, 445, 149, 178, 55, -9, -648, 252, 137, -42, -59, -458, -11, -164, 98, 431, -85, -215, 442, + -8, 231, -127, 30, -221, -45, -30, -121, 117, -16, 396, -365, 39, 135, 173, -625, 394, 98, -445, -292, 226, 528, -202, -115, -385, 761, 292, 31, 120, -427, -274, -36, 25, 384, 78, 291, 341, -36, 13, 222, -73, -282, -257, -87, 338, -211, 430, -229, 635, 260, 510, -168, 75, 387, -333, 164, 179, 145, -195, 188, 44, 35, 179, 358, 322, -377, -90, 131, -342, -255, -101, -725, 165, -386, -229, 7, -106, 158, 364, 186, 112, -261, 5, -111, -316, -480, -711, 394, -286, 324, 110, 160, 195, -476, -871, 84, + 133, 500, -481, -528, 467, -178, 216, -95, 116, 79, 128, -237, 124, -29, -70, 310, 120, -38, -389, -48, -5, -67, -13, -208, -519, -227, 391, -158, 196, -291, 227, 120, 2, -143, -644, 366, 355, 455, -308, -127, 617, 546, 256, 123, 351, 134, 316, -158, 275, -506, -27, 151, -129, 621, 29, 342, -194, -318, 697, 1, 264, -76, 38, -660, -77, 131, -420, -371, -483, -149, -122, -819, -768, -211, -8, 558, 452, 446, -188, -86, -125, 477, 200, -218, -47, -177, 344, 262, -215, -300, -273, -550, 215, 2, 6, 104, + -89, 190, 745, -443, 219, 31, -299, -181, -354, 117, -161, -188, 383, 34, -137, 380, -60, -189, 131, 273, -164, 295, 551, 522, -371, -20, 130, 287, -467, -111, -130, 563, 245, -76, -352, -403, -345, 510, 434, -829, -675, -505, -348, 100, -286, 153, 94, 168, -584, -211, 652, 511, 312, 36, -449, -242, -80, 163, 264, -402, 88, 7, -341, -173, 253, -214, 199, 72, 237, -327, -12, -707, 92, -889, 347, 333, -347, 377, 466, -8, 126, -582, 321, 10, -241, 280, -80, -20, -13, 12, 578, -93, -8, 690, -14, -359, + -954, -809, 861, 509, 208, 186, -369, -765, -365, 81, -286, 535, -35, 38, 612, -166, -195, -180, -392, -702, -525, 1444, -717, -356, 408, -741, -535, 392, 536, 178, 113, 439, 86, 72, 176, -618, -458, -321, -566, -56, 525, -44, 103, 256, 167, -457, -224, -378, -206, 472, -152, -58, -72, 284, 283, 858, 131, 630, -44, 209, -353, -266, 220, -446, -496, 10, 147, -257, 194, -300, 82, -781, 424, 235, 346, 37, -322, -655, -240, -65, 525, -415, -250, 141, 1214, -347, 1234, -772, 291, -291, 535, -228, 931, -899, 1339, -143, + 266, 568, -1016, 873, -1081, 694, -1730, 896, -878, 707, -1053, 857, -154, 506, -17, -525, -474, 578, 987, -797, 1249, -60, 11, -35, 226, -356, -260, -540, -112, 30, 12, 9, 497, 95, 543, 534, -322, 204, 1123, 375, 248, 178, -956, 60, -148, -110, -876, -176, 516, 154, 176, 266, 651, 178, -193, -57, -50, 250, -433, -261, 669, 420, 313, 521, 382, -218, -111, -762, -338, 316, 244, 582, -421, -206, -152, 425, 241, 379, 148, -310, -295, 947, -310, -939, 186, 629, 403, -54, -83, -22, 99, -31, 381, -368, -1946, 551, + -227, -115, 493, -323, 529, -61, -835, -147, 96, 305, 393, 95, -586, 601, -218, -48, -353, -161, 336, -59, 302, 484, -93, -616, 156, 683, -614, 235, 548, -94, -398, -780, -506, 552, 1436, -435, -541, 1593, -80, -230, 1170, 665, 595, 458, 216, -339, 610, 540, 403, 169, -1024, 655, 615, -1116, -609, -404, -275, -311, 1251, 601, -653, 645, -213, -652, 330, 331, -229, -265, -912, 81, 139, 766, 317, -101, 833, -906, -522, -2130, 653, 1201, -747, -156, -582, 1237, 829, 522, -102, -432, 84, 499, 227, -214, -53, 683, -51, -250, + -921, -432, 763, 450, -495, 391, -362, -110, 220, 218, -224, 141, -814, 230, 1068, -137, -227, -1064, -657, 517, -859, -456, 171, 212, -282, 695, 633, -679, 225, 375, 1061, 997, -192, 322, -64, 1137, 456, 455, 1037, -493, -756, -375, -960, 747, 300, 350, 129, 1259, -929, -236, 434, -361, 459, -97, -214, 108, -905, -845, 538, 884, 776, 800, 1015, -517, 808, -1455, -616, 613, 174, 1141, 538, 981, -369, 172, -773, 599, 944, 876, 119, 636, -1406, -887, 929, 312, -864, -410, 143, 1374, 439, -482, -646, 191, -167, 870, 908, -28, + -113, 234, -220, 1112, 330, -187, 238, -435, -270, -2285, -774, 489, -343, -282, 13, -351, -401, 1156, 746, -463, 1007, 2120, 443, 1540, 225, 388, 1093, 802, -547, -548, -1103, -600, -33, -953, 417, -117, -876, -380, -192, -247, 33, 984, -50, 845, -461, 265, -1704, 550, -217, 958, -175, -992, 1103, -338, 209, 659, 496, 1025, -101, 208, -138, 1163, -189, 271, 811, -820, 800, -157, 505, 798, -154, 231, 164, 143, -195, 395, 358, -59, -391, -9, -462, -92, -56, 484, -171, -724, -488, 916, 889, -728, -637, 1087, 1224, -379, -80, 935, + 71, 522, 657, -1351, -389, -11, 1425, 217, -66, -1279, 303, 632, 382, 146, 395, 252, 192, 1669, 107, 370, 731, -587, 611, 1002, -1713, -125, -1449, -1348, 334, 274, 244, 24, 1275, 716, 1642, 1784, -196, -896, 190, -254, -160, 374, 179, -161, -822, -923, 987, 434, -104, 129, 168, 68, 190, -116, -224, -1361, 41, 740, -212, -1060, -324, 816, -1555, -572, 1009, 566, 1202, -70, 106, -1130, -1083, -1430, 1192, 1616, -2162, -1134, -90, 1063, -842, -191, 2026, 762, 534, 1267, 995, 1395, -498, 1385, -192, -1204, -1636, -463, 637, -1365, -199, 162, + -237, -641, 268, 453, -948, -1278, 963, -95, 286, 365, 353, -1, -440, 680, 161, 655, -156, -1430, -141, 396, -478, -532, -329, -492, 566, -162, -515, -42, 526, -736, 495, -265, 258, -725, -188, 274, -72, -80, 77, 384, -81, -79, -507, 233, -146, 65, 144, 37, 359, -554, -421, 549, 478, -693, 314, -563, 623, -545, 230, 147, -456, 976, 88, -1120, 502, 115, -859, 460, -319, 490, -745, 359, -783, 334, 545, -513, 256, -483, 31, -53, 96, -451, 428, -494, -3592, -6335, -2228, -4953, -4901, 2358, 348, 3351, 7805, 7011, 5718, 7019, + 4229, 805, 1212, -1202, -5518, -5462, -4126, -5313, -3691, -903, -2544, -3453, -1586, -577, -1861, -976, -189, -1015, -1670, 157, 1161, -601, 1678, 2569, -67, 383, 3549, 1685, -98, 3309, 2700, -780, 1232, 3105, -145, 170, 4468, 2356, 959, 5428, 6015, 2933, 5724, 7111, 1898, 983, 2974, -1077, -3311, -1867, -4289, -7754, -7653, -8669, -11451, -11385, -10630, -10394, -8763, -6973, -4208, -928, 1355, 4815, 8409, 8326 } + }, + { + {221, -115, 53, -16, 20, -32, 113, 172, -83, 60, -20, 59, -79, -10, 45, -105, -105, 33, 54, -123, 55, -69, -92, 5, -49, -92, -116, -22, 96, -22, 36, 63, 35, 45, 54, 46, 112, -166, 43, -109, 60, 115, 7, -26, -101, 38, -17, 16, 35, 18, -40, -88, -65, -114, 24, -1, 14, 51, 72, 20, 129, 6, -81, 86, -25, -18, -28, -122, 102, 46, 87, -103, -159, -48, 68, 28, -94, -27, -258, 29, 171, 59, 111, -162, -88, 8, -28, 44, 135, -324, -2, 107, 64, 99, -94, -130, + 142, -2, 40, 89, 118, 44, 25, 106, -16, -33, -91, 50, -26, -14, -48, 62, 154, 2, -32, 74, -99, -147, -82, -29, -96, 10, -23, 63, -60, 19, -121, -10, -99, -3, -46, -37, 49, -55, -7, 83, -44, 98, 116, 10, 157, -79, -7, 78, -29, 53, 70, 39, -83, 32, 31, 24, -4, -70, 426, -126, 37, -98, -12, -44, 45, 29, 143, 41, 21, 53, -41, -302, -290, -94, 33, 83, -77, 12, -98, -38, 0, 46, -132, -142, -46, -13, 69, 20, -36, -104, 12, -59, -3, 65, -107, 44, + 84, -75, -191, -53, 61, -16, 48, -14, 41, -14, 45, 5, -180, 29, 63, -33, 40, 3, -18, -40, -7, -108, -18, -34, -138, -29, -14, 107, -123, 179, 204, 159, -85, -41, -56, 56, -54, -63, -6, -112, -404, 0, -60, 30, -11, -208, -38, -42, 68, 105, -138, 115, -33, 80, 81, -40, 172, 13, 11, -27, 33, -40, 34, -45, 10, -108, 15, 124, 3, 54, 132, -124, -129, 58, -57, 105, -100, -29, -213, -165, -141, 66, 23, 80, -74, -53, -12, 140, -146, 66, 32, 15, 82, -49, -63, -87, + 61, 34, -127, -142, -164, 0, -30, 62, 0, -26, 25, 30, 85, -192, 33, 117, 175, 166, 128, -11, -62, -219, 166, -107, 194, 247, 161, 16, 86, 34, 206, -83, -84, 73, -10, 96, 163, -187, 84, 204, 106, 6, 17, 42, -67, 18, -62, -94, -11, 195, -47, 101, -42, -87, 229, -163, 160, 174, 50, 118, -116, -17, -34, -22, 118, 51, -125, 45, 6, 49, -11, 74, 72, 197, -161, 111, 92, 5, 92, 43, 131, 125, 88, -34, 111, 178, 22, 117, -36, 208, 212, 227, -19, -94, 77, 31, + 79, 64, 31, 332, -31, -105, 317, -126, 143, -78, -302, 52, -86, 7, 365, -143, -169, 11, 193, -310, -111, 226, -77, 70, 113, -87, 103, -70, -102, 15, -25, -44, -34, 121, -97, 242, 68, -3, -137, -51, 160, -185, 45, 51, -20, -255, 175, 33, 50, 9, -24, 113, -65, 158, 108, -83, -288, 116, 91, -25, -73, 53, 203, 174, -10, 93, -164, 103, -20, -87, 86, 121, -96, 113, 25, -86, -48, 84, -83, 157, -71, 122, 111, 324, 53, -67, -388, 135, 239, 148, 101, -22, 128, 447, -40, 213, + 32, 124, 56, 20, 100, -25, -173, -40, -125, -24, -182, 82, 19, 240, 58, -94, 89, -21, -42, 158, 67, 121, 78, -51, -240, 28, 163, 2, -34, 78, -119, -45, -221, -281, 168, 182, 149, -29, -31, 15, 12, 100, 3, 108, 103, 11, 107, -68, 44, -29, 73, 80, 298, 18, 246, -65, -187, 8, 1, -42, 207, 18, 67, 146, -352, -10, 363, 498, -204, 57, 82, -172, -98, 20, -141, -149, 351, 49, -227, -37, -147, -86, 230, -72, -96, 205, 131, 206, -84, 41, 207, 7, -117, 54, -13, 23, + -251, -177, 82, -21, 67, -239, 117, 83, 61, -419, -237, -109, -46, 55, -175, -126, 48, 314, 217, 107, -49, -41, -113, 85, -27, -243, -172, -30, 4, 325, 193, -175, -177, 220, 53, -149, 8, 185, 76, 2, -214, 254, -112, 177, 217, 62, 74, -90, 153, -182, 221, -14, -52, 120, -211, 80, 124, 29, 89, 108, -52, 245, -106, -402, -236, -48, 23, -81, -168, -185, -123, 407, -105, -26, 65, -77, 55, 335, -151, 162, -95, -206, 197, 143, 95, 301, 14, 145, -5, 42, -3, -90, 73, -16, 222, 50, + -138, -31, -33, -2, -230, 104, -226, 66, 329, -198, -386, 102, 68, 194, -67, 9, 200, -99, 107, 149, 37, -55, 199, 41, 196, -1, -77, -26, -309, 739, -163, 336, 38, 145, 106, 6, -403, 357, -505, 174, 129, 469, -210, 216, -319, 221, -99, -341, -162, 92, 95, 137, 70, 194, 125, 289, -82, -218, -202, 90, 1, -102, 190, 92, -35, 122, 234, -10, 62, -24, 116, 78, -294, -117, -386, -77, -65, 3, 186, 178, 24, -95, -4, -46, -94, 65, 542, 62, -16, 187, -18, 212, -91, 15, -136, 557, + 121, -207, -259, -148, -10, 0, -292, -5, -128, -8, 380, 31, 316, 192, 310, 103, -319, 309, -206, 535, -351, -103, -484, -102, -56, 212, -228, 312, 247, -152, 12, 358, 497, -161, 6, -66, 150, 2, -67, 73, 129, -240, 171, 34, 197, 79, 20, -411, -78, 475, -70, 158, 350, 104, -43, -128, -184, -102, -1, -159, -113, 273, 235, 76, 401, 277, -113, -48, 31, 91, -158, -345, 408, 184, -127, 390, 380, 449, 154, 47, -221, -7, -256, -191, -150, -506, 63, -82, 157, 410, 16, 67, -72, 25, -62, -645, + 65, -16, -123, -58, -321, 347, 359, 399, -674, 204, 130, 5, 649, 258, -335, -51, 641, 64, 108, 119, -199, 94, 125, 388, 196, -323, -516, 176, 111, -272, -57, 7, -322, 17, 371, 143, 203, 289, 489, 26, 429, 65, -187, -49, -274, -162, 95, 122, 99, 192, -330, -173, 543, -75, -141, -351, 244, 201, 59, 55, -33, 102, -275, 333, -241, -254, -221, -285, 270, 25, -3, -410, 585, 690, -187, 188, -59, -212, 32, -475, -298, -28, -103, 929, -430, 113, -604, -94, 353, -159, -341, -353, -137, 137, 175, -29, + -40, -396, 82, 268, 127, 162, 39, 56, -239, -79, 142, 52, -12, 13, -287, 119, -301, -50, -20, 81, -334, -36, 144, 228, -379, -194, 636, -251, -527, 430, -432, -132, -199, -75, -335, -221, -83, -321, -478, 744, 391, 333, 207, -286, -133, -187, 179, -320, 244, -139, 68, 270, 42, -156, -54, 956, -463, 402, -900, 216, -581, -130, 288, -53, 176, 300, 237, -409, 263, 32, 189, -109, 271, 244, -81, 29, 154, 170, -303, -125, -432, -80, 341, -20, -193, 7, 113, -5, -170, -324, 54, -229, 170, -219, 678, -98, + -399, -462, 77, -269, 201, -515, -394, -523, 94, -449, -116, -629, 406, 48, 267, 136, -653, 7, -73, -282, -372, -142, -319, -429, -226, 130, 236, 319, -221, -2, 129, -581, 210, -360, -86, 42, -808, -228, 927, 820, 466, -386, 413, 615, -391, 543, -421, 501, 129, -28, 175, -6, 273, -387, -98, -173, 212, -368, -320, 525, -36, -107, 65, -503, 5, 812, 458, 92, 9, 172, 785, 326, 30, 127, -194, -94, -164, 326, -151, 216, 62, 388, -445, -17, -6, 4, -109, 211, 378, -94, -76, 346, 66, 31, 835, 113, + 40, -385, 194, -293, 407, -451, -352, 40, -344, -415, -571, 128, -173, 292, -40, 143, -610, 181, 661, -1069, 419, 439, -767, -96, -661, -231, -595, -279, 635, -244, -70, -481, -111, 86, -706, -46, 414, -864, 8, -596, -335, -7, 39, -401, -331, -339, -116, -294, -42, 128, -108, 195, -437, -282, 525, -277, 273, -347, 284, 265, 22, 56, 261, -6, 383, 501, -127, 57, 745, 25, 368, -49, -339, -632, 71, 401, -706, -15, -430, -234, -910, 350, 538, -181, 235, -172, 572, 641, -91, -685, -667, 781, -639, 125, -57, 197, + 1143, 1289, -72, -963, 960, -1054, 152, 455, 113, -107, -487, 557, -245, -190, -497, -281, -155, -613, -342, -269, -156, -93, 430, 3, 371, 13, -163, -533, -598, -139, -25, 4, -94, -211, -262, 298, 682, -360, 231, -219, -246, 287, -272, -415, 956, -90, 81, 64, -546, -101, -121, 292, -706, -289, 726, 138, -324, 421, 735, -403, -539, 297, -460, 31, -851, 295, 694, -46, 354, 227, 100, 758, 254, 21, 361, 82, -212, 229, 20, -1580, -1113, 438, -483, -455, -1349, -402, 265, 92, -281, -757, -29, 357, -47, 34, 368, 672, + -618, 1553, -424, -538, -179, -105, -14, -638, -7, -126, 310, -226, 447, -210, -421, 148, 171, -373, 367, -1212, -14, -111, 454, 562, -442, 523, -232, 139, -283, -101, -185, 416, -85, 553, 859, -786, -245, 401, -550, 299, -621, -339, -327, -360, -637, -325, 244, 212, 424, 576, 391, -735, 45, 112, 144, 73, 400, -199, -556, 175, -369, -1107, 759, -1405, 913, -180, -655, -562, -626, -435, -352, -12, 656, -98, -634, 584, 839, -1400, -410, 54, -160, -252, -116, -229, -290, -435, 455, -217, -427, -686, -693, 594, 114, -155, -121, -38, + -194, -211, 87, -608, 257, 610, 430, 264, 564, 681, -468, 115, -651, 607, -425, -144, -60, -978, 247, 736, 73, -355, -317, 973, -468, -473, 222, -1068, -184, -547, -43, -1039, 352, 128, 319, -1550, -1309, 184, -510, -419, -21, 165, 1276, -1604, 1777, 576, 12, 216, -1164, 331, 648, -140, 1522, -336, 696, -432, 1667, 23, -149, -530, -158, 317, -96, 735, 569, -84, 108, -542, 304, 732, 715, -619, 360, -48, 758, -95, 515, -324, -267, -849, 126, -500, -824, 1359, -496, -7, -178, -195, 232, 213, 506, -99, 746, 179, 1304, 595, + 1437, 1289, -50, 906, 662, -74, 770, 1090, -338, -811, 619, 501, 860, 559, 25, 188, -835, 61, -143, 33, 1235, 76, 268, 1481, 548, -1143, 2275, -277, -225, -114, 1662, -976, 846, -1071, 1067, 242, -180, 58, 633, -230, 591, -231, 16, 1184, 373, -260, 15, 323, 245, -1080, 316, -370, -84, -550, 584, 578, 99, 295, 974, -279, -1516, 406, 1014, -347, -994, 309, 727, 286, 11, -1159, -568, -668, 676, 317, 697, -1404, 99, -220, -1597, -367, 241, 774, 1011, -485, 1885, 419, 34, -335, -761, -471, 354, -810, 1754, -483, 76, 1061, + -580, 694, -630, -265, 1045, -878, -1331, 746, 473, 747, -312, -222, 295, -5, 76, 22, 137, 30, -220, 971, -241, -678, 271, -22, -607, 203, 122, 401, -289, -451, 467, -390, -70, -117, 379, -683, 215, -423, 328, -601, 195, -200, 84, 1323, -928, 176, 269, -814, 275, 382, -627, -120, -255, 1103, 69, -1261, 736, -1018, 162, 542, -518, 619, -761, -593, 807, -127, 328, -1234, 207, 289, -94, -172, -37, 529, -7, -1604, 947, -78, 396, -337, -546, 1206, 355, -640, 528, -315, -3366, -7054, -2873, -5338, -6479, 2163, -122, 2222, 8722, 7602, + 4285, 8337, 4609, 437, 2822, 1699, -3281, -2349, -754, -3631, -4367, -1515, -2251, -3475, -935, -244, -4394, -3060, -534, -2706, -3468, -1070, -1737, -3766, -778, 299, -2137, -1652, 1495, -631, -2274, 404, 1420, -1146, 858, 3177, -510, -905, 3169, 1672, -814, 5295, 7220, 4490, 7628, 11394, 8794, 8366, 12234, 10623, 7874, 9647, 8815, 5665, 5064, 2823, -606, -3420, -6191, -8466, -9803, -12278, -11836, -11927, -14192, -13369, -10284, -13231 }, + {252, -80, 59, 44, -85, 102, 79, -26, 139, -1, 59, -198, 74, 74, -103, 208, 26, 102, -15, -26, 12, 144, 158, -159, -50, -71, 103, -50, -38, 22, -85, -132, 71, -125, 71, 70, 70, -3, 39, -2, 102, -36, 16, -103, -26, -196, -92, 24, 70, -9, 98, -10, 50, -123, 34, 60, 71, 17, -55, 4, -26, 45, 54, 22, -4, -44, -25, 99, -25, 44, 84, 51, -42, 91, 3, 22, -17, 79, -219, 6, 173, 119, 120, 76, 47, -69, 2, -78, 185, 114, 44, 27, 26, -2, -60, 92, + 127, 124, 74, -93, -136, -147, -142, -14, 72, -144, 119, -28, 210, -34, 133, 3, -176, 52, -24, 143, 9, -15, -73, -118, 10, 70, -155, -207, 145, -119, -113, -103, 82, -80, 34, -33, -11, -119, -38, -79, -123, 46, 95, -29, -135, -20, -27, -60, -115, 0, -91, -100, -14, 16, 32, -20, 21, 8, 413, -143, -93, -127, -87, 11, -274, 48, -135, -269, -56, 232, -164, 46, -18, 78, 119, 126, 204, -43, -114, 52, 51, -92, -11, -62, -38, 25, -103, -66, -13, -133, -154, 80, 124, -72, -177, -32, + -39, 25, 149, 9, -56, -10, 199, 24, -115, -115, 55, 36, 160, 87, -5, -150, 14, -10, 133, -138, -40, 73, 155, -44, 20, -115, -56, 66, 12, 12, 47, -46, 57, 11, 70, 32, 33, 209, 87, 35, -304, -73, -144, 137, 34, 2, 97, -60, -235, -125, 154, -10, 159, -14, -92, 176, 65, 387, -75, 167, 23, -185, 45, -158, 99, 34, 38, -168, 82, -31, -60, 66, 263, 96, -3, -215, 183, -42, -1, 128, -195, -39, 132, -82, -71, -221, -240, -22, 142, 81, -98, -7, 92, 113, 44, -29, + -49, -214, 95, 254, 114, -81, -41, 75, 119, -18, -45, 21, -178, -41, -124, -68, -20, -82, 133, 126, -60, -232, 249, -224, 227, -7, -190, -441, -177, -130, 60, 224, 174, -60, -40, -58, -130, -41, -146, 44, 47, 82, 139, 81, 270, -4, 51, -101, -28, -70, 96, 26, -133, -189, 3, -137, 12, 122, -214, 144, -357, -100, -266, 41, -21, 1, -107, -141, 44, 122, 85, 31, -214, 62, -149, -57, -46, -287, -116, 85, 107, -10, -201, 34, 72, -37, -42, 25, 169, 63, -39, -45, 34, -360, 29, 69, + 70, 231, 52, 290, -76, 3, 191, -100, -95, 287, -221, -520, -342, -201, 309, 132, 41, -301, 315, -137, 86, -83, 122, 153, -16, 4, -6, -52, -168, -132, -44, 18, 140, 82, 221, 108, -103, -52, 196, -144, 242, -196, 48, 109, 65, -159, 211, -20, 227, 308, 41, -122, -126, 131, -155, -312, -88, 66, -208, 115, 84, -66, -133, -53, -57, 60, -35, -177, -79, 302, 230, 127, -368, -348, -192, 310, 131, -42, 18, -156, 122, 41, 136, 205, -22, 73, -349, -124, 45, 106, -430, -56, 171, -136, -283, 160, + -328, -243, -136, 18, -126, -88, -21, 227, -211, 43, -74, -93, -179, -56, -257, -83, -18, 38, -183, -46, -120, 7, -66, -85, 35, 186, 39, -110, 86, -157, -48, 48, -68, 88, -43, -19, -696, 37, -249, 108, 88, 143, -388, -391, 40, 6, 78, -4, 193, -90, 99, 131, -79, 311, -111, -207, -63, -157, -28, -265, 11, 124, -3, 269, -530, 147, 26, 153, 218, 44, -205, -450, 35, -179, 348, -135, 73, 31, 75, 267, -114, -2, -120, -62, 69, -59, 245, 189, 52, -45, 3, 171, -18, 87, -5, -127, + 118, -26, -104, 153, 242, 9, 93, 26, -167, -92, 293, -134, 137, 226, -293, 215, 103, 114, -135, 220, 52, -27, 260, 19, -14, -117, -83, 9, -131, -279, -90, 303, 206, 249, -46, -247, 83, 292, -71, -211, -24, -122, -59, -16, 83, -248, -69, -404, -114, -232, -274, -260, -88, 362, 395, 540, 126, -199, -119, 447, 5, -99, 346, -32, 22, -527, 247, 137, -347, 494, -61, 223, -52, 118, 225, 3, 392, 150, 117, -43, -129, 38, 241, -62, 77, 110, 316, -14, -87, 199, -227, -148, 113, 340, -145, -185, + -51, 279, 9, 36, -99, -52, 106, 143, 18, -127, -384, 39, 118, 362, 110, -41, 284, 489, -105, 155, 96, 173, -54, -166, 36, -400, -65, 31, -452, 660, -316, 159, -13, -212, 505, 129, 72, -510, 146, -195, -228, 72, -223, 278, 169, -30, 62, -113, -49, -175, -114, -212, -344, -70, -239, -49, 142, -82, -125, 297, 182, 299, -223, -6, -39, -232, 9, -113, -622, 77, 18, -75, 224, 1, 246, 228, 81, 403, 342, -306, -86, 30, -7, 147, 50, 352, -63, 544, 4, -268, -241, 75, 98, 143, 380, 138, + 103, 386, 460, 66, -239, -216, -11, -38, -10, 520, 403, 44, 276, -272, 143, 38, -7, 188, 426, -98, -24, 394, -487, -263, -205, -558, 126, -166, -67, 86, -378, 446, 338, 474, 218, -266, 41, 37, 355, -44, 3, 6, -197, 37, -110, 212, -210, -64, -61, -75, -248, 147, -370, -35, -11, 268, 160, 59, 21, -39, 46, 34, 221, 78, 79, 2, -582, -244, 94, 290, 326, -430, 345, 142, -154, 99, 140, -52, 497, 74, 144, -15, -523, -110, -217, 69, 87, 104, 125, 576, 79, 223, -372, -339, 170, 291, + 21, -125, 554, 162, -13, -174, 109, -61, -78, -38, -112, 10, -204, -468, 134, 30, 123, 28, 237, 59, -284, -566, 1, 24, -57, -497, -247, -89, 122, -122, 42, -438, 9, -111, -9, 25, 106, -62, -406, -380, -236, 136, 104, -114, -90, -651, -367, -29, -625, 554, -589, -175, -382, 596, 192, -443, 215, -61, 232, -375, -117, 10, 253, -331, -120, -120, -276, 21, 244, -105, 8, 232, 494, 1113, -180, -384, -360, -323, -449, 41, -746, -36, -582, -287, 146, 318, 175, -281, -59, 300, -47, 351, -253, -264, -228, 147, + -158, -209, 38, -245, -237, 224, 590, 195, 239, 79, -384, -124, -316, -316, -67, -90, -253, -410, -763, -111, -291, 53, -160, 233, 234, 100, 246, 142, -52, 470, 717, 126, -892, 123, -180, -563, 44, 189, 96, -40, 209, -81, -446, -47, 156, -483, -257, -459, -681, 457, 48, -55, 237, 44, -26, 821, -643, 706, -80, -109, -389, -159, -387, -335, 370, -369, 183, 848, 307, -154, -411, -355, 372, -344, -555, -249, 39, 24, -632, 15, -203, 291, -211, -39, 55, 885, -238, -325, 428, -388, 518, -348, 375, 29, -300, -297, + 479, -681, 470, -319, 31, -198, 248, -269, -134, -58, -219, 884, -292, 583, 223, 233, -31, 178, 380, 390, -159, -521, -36, 296, 107, -161, -613, 626, -215, -563, -217, -381, 98, 75, -153, 14, -960, -414, 579, -122, -246, 674, 59, -360, 252, 364, 309, 43, -593, -249, 84, 80, 302, 196, 341, -307, -242, 109, -87, 277, -557, -101, -602, -200, 103, -89, -80, 631, 128, -481, -77, 30, -489, -74, 19, 283, 731, -269, 241, -419, 57, -251, -315, 289, 637, -520, 44, 562, -264, -65, -221, 362, 85, -478, -12, -177, + -158, -62, -237, 330, -834, 155, 57, -365, 443, 677, 461, 1223, 387, -342, -449, -273, -357, -32, 612, -1626, -119, 837, -1249, -112, 178, -1290, 495, 92, 931, -157, 292, 232, -1140, -957, -407, -148, -600, -729, -411, 554, 374, 311, -20, 5, 135, -27, -847, -361, -1071, -390, 502, 99, 318, 1200, 266, 408, -86, 180, 1052, 765, 166, 473, 436, 1034, 843, -1300, 686, -156, 650, 651, 227, 1245, 1099, -754, 495, -116, 463, -1091, -6, -16, -72, -354, 502, 528, -783, -383, -531, 43, -697, -817, 391, 737, 144, 716, -368, -494, + 734, 1318, -173, -1784, -566, 190, -133, -289, -387, 15, -1018, -605, -844, -128, -242, 294, -600, -164, 170, 296, 0, 329, 626, 141, 901, -561, 224, 50, 860, 239, -157, -840, 580, -129, 788, -633, -507, -473, -251, -768, -95, -112, -729, 436, 863, -381, 144, -1070, 1078, -301, -555, 520, 447, -590, 82, -349, 170, -240, 1356, 4, -75, -268, 2385, 126, -268, 1078, 865, -758, 725, -895, -411, -839, 884, -586, 382, 353, -176, -1078, -531, -2434, 146, 1520, -961, -652, 1218, -933, -84, -286, 1168, -2078, 1121, 650, -602, 183, 1095, 767, + -415, 425, 183, -345, 504, -44, 298, 451, -228, 83, -73, 196, -317, -274, -39, 380, -1234, -637, 585, -173, -825, -990, 146, 1146, -532, -794, 563, 843, -210, 181, -173, 781, -464, 1192, -183, -41, 660, -30, 139, -920, 1359, -757, -877, 605, -929, -351, 138, 403, 1255, -505, 773, -218, 378, -2091, -1517, -229, -607, 347, 367, -239, -869, -441, 522, -1066, 913, -916, -1139, 543, -587, -412, 548, -526, 445, -426, 168, 1144, -1152, -138, -240, 956, 61, 36, -1043, -966, -401, -324, -221, -350, 98, -5, -181, 93, 133, 48, 83, -243, + 387, -365, 365, -915, -61, -750, -995, -587, 1103, -571, -625, -446, 175, -292, 432, 724, -923, 679, 21, -1179, -677, 2277, 1091, -1814, -451, 1074, -692, -695, 326, -609, -1345, 805, 261, -1658, 504, 666, -999, -668, 442, -180, -555, 1501, 2109, -791, 2357, -144, -601, -452, -752, -26, 424, 1411, 80, 464, -315, -1138, 54, 87, 809, 192, -863, 1706, -680, 356, 775, -781, -644, -1133, -490, 778, 936, 1172, -398, -2695, 634, 1486, 1864, 1634, 0, -734, -952, 387, 961, -543, -295, -2376, -1469, 1366, 2221, 511, -41, -473, -945, -163, 630, -788, + 353, -55, 1410, 9, 560, -2650, -327, 106, 1693, 1372, -15, -736, -208, 2058, 930, -2135, -2738, -1019, 427, 3880, 915, -571, -63, -1660, 224, -382, 951, -1108, 27, -448, 248, -687, 634, 175, -373, -691, -348, -132, 191, -941, 207, -461, -190, -736, -358, 599, -640, -220, -98, 295, 185, -241, 325, -535, -56, 12, 275, -348, 498, 389, -405, -444, -189, 737, -541, 239, 524, 131, -545, -191, 209, -319, 227, 37, 100, -473, 82, -382, -38, 385, 443, 380, -292, 364, 20, -412, -90, 20, 492, -120, 82, 472, -124, -548, 767, -285, + 422, 273, 46, 99, -227, -186, -872, 1683, 170, 109, -654, 404, -37, 455, 353, 529, 76, 147, -268, 99, 489, -30, 277, -25, 103, 119, 212, -183, 377, -227, 55, -24, 143, -17, 94, 284, 319, -129, 154, 71, -42, -114, 419, -108, 108, -100, 231, 11, -163, 408, -220, -74, 131, -175, -86, -47, 44, -61, 34, -28, -74, 144, -226, 170, 138, -78, 199, -120, 231, -96, 70, 46, -89, 204, 32, 35, -24, 259, -259, 318, -148, 0, 114, 14, 318, -1519, -3784, 589, 2882, 2680, 4647, -1185, -1246, -3163, -4321, -889, + 1559, 1673, 3143, 1711, 132, -814, -2200, -1559, -273, -241, 780, 731, 416, 272, 207, -112, -544, -37, 618, 10, 126, -30, -473, -352, -802, -774, 347, 333, 717, 1106, 816, 409, 138, -1178, -846, -641, -658, -718, 143, 472, 797, 1038, 843, 195, -110, -672, -705, -403, -211, 77, 104, 241, 9, -212, 64, -343, 168, 297, 10, 556, 638, 252, -76, -510, -647, -317, 46, 186 } + }, + { + {219, -4, 84, 91, 32, 32, 47, 73, 137, 64, -11, -53, 8, -73, -71, 12, -14, 28, -15, -29, -78, 100, 19, -5, -137, 11, 95, 136, -91, -21, -26, 69, -11, -6, 30, 10, -20, 50, -57, 24, -140, -101, 44, 54, 196, -75, -75, -43, 80, -64, -117, -81, -138, 14, -92, 81, 105, 25, 44, -64, 39, -11, -155, 178, 119, 85, 29, -61, -29, 70, -50, 17, 0, -2, -25, -31, -108, -99, -179, -3, 38, 29, 127, 16, -16, -83, 186, 115, 5, -24, 185, 62, -60, -163, 103, -47, + 80, -155, 9, -37, -116, -32, -59, -22, 8, 0, -85, -52, -14, -16, -53, 56, -6, -56, 99, -166, -79, 79, -100, 14, -62, -91, 61, 56, -49, 62, 119, 67, -63, -73, 13, 24, -74, 80, 132, -113, -36, 65, 48, -27, -35, -55, 72, 22, -88, 99, 48, -80, -61, 95, -70, -94, -150, -131, 244, -17, -42, -92, 158, -76, -3, -118, -126, -161, -72, 136, -128, -45, -41, 50, -27, -180, 103, 52, 366, -32, 175, -28, -2, -11, 26, -71, 147, -31, -21, -79, -8, -25, 224, 45, -14, -197, + -12, -34, 70, -123, -27, 40, 38, -30, -12, -75, -20, -91, -33, 192, -44, 65, 115, -19, -89, -127, 47, 37, 53, 89, 112, 88, 62, -29, -19, -33, -167, -31, 1, 96, 93, -29, 27, -319, -81, -11, -71, -51, 106, -226, -190, -113, -76, 27, 245, -59, -4, 25, -182, -51, -153, -28, 260, -25, -132, -88, 0, 49, 50, -79, -337, -165, -48, -134, 9, 1, 133, -92, 118, 25, -64, -184, -152, 203, -173, 109, 32, -114, -43, -102, -72, 93, -185, 91, 32, -7, 31, 9, -18, 0, -93, -131, + 10, -42, -93, -42, -144, 167, 119, 27, 142, 15, -53, 165, -80, -53, -49, 115, -88, 47, 66, -209, 262, 298, 83, 83, -82, 141, 71, -169, 56, 115, -204, -176, 183, -153, -21, -97, 184, 45, -19, -62, 0, -113, 111, -53, 68, -23, 0, 125, 47, 23, -45, 123, 74, 41, -10, 127, -9, 29, -76, 154, 33, 66, 107, -286, -96, -49, -106, -94, 29, 173, -71, -34, -91, -30, 35, 83, -203, -1, 70, 20, -17, 100, 56, -177, -55, -28, 116, -109, 162, 187, 94, 44, -82, 11, 32, 316, + -70, -15, 109, 67, 48, 100, 280, -91, -36, -289, -4, -250, -314, 1, 120, -403, 124, 118, 61, -130, -104, -141, -59, -3, -2, 115, 155, -33, -173, -109, 112, -185, -97, -158, 22, -250, 109, 8, -27, 28, -18, -66, -10, 143, -188, 204, -174, -30, 29, -120, -99, 73, 30, -46, -94, 148, 55, -124, -235, 14, 40, 118, -18, -71, -2, 56, -66, 294, -117, -64, -222, -157, 290, 120, -68, -11, -120, -34, 80, 200, -291, -176, 186, -157, -167, -182, -217, 139, -63, -15, -58, -1, -240, -54, 93, 106, + 14, -129, -187, -154, -197, 30, 209, 22, 59, 69, 62, -137, 124, 78, -110, -84, -312, 40, 55, -241, -31, 67, -57, 24, -34, -257, 202, -239, 172, 7, 81, -268, -161, -240, -200, 33, -79, -85, -117, -1, 106, -218, -15, 66, -82, -242, -164, -46, 38, 124, 45, -187, 197, -50, -43, 197, -204, -85, -74, -22, 447, -371, -188, -243, 201, 84, -116, 101, 14, 271, 33, 15, -232, 188, 302, 310, 266, -126, -3, 50, -140, -97, 61, 29, -209, -101, -76, 123, 4, -162, -57, 67, 160, 28, -24, 13, + -97, 7, 18, 29, -236, 163, 207, 48, 121, 118, -182, 314, 303, 62, -157, 120, -33, -268, -36, -76, 33, 30, 34, -155, -110, -332, -246, 21, 224, -140, 126, 46, -50, -249, 34, 190, -53, 165, 325, 126, -27, -401, 55, -142, -541, -414, 118, 16, -83, 110, 278, -31, 172, 153, 95, -31, -131, 129, -110, 26, -92, 178, 317, -262, -65, 29, 124, 41, -71, -38, -88, 4, -112, 173, 50, -180, 229, -202, -54, 275, 247, 208, -207, -134, -184, 244, 330, 8, -48, 262, -350, 59, 116, -22, -290, 292, + 116, 156, 280, 29, -351, 114, 173, -79, -7, 274, -244, -231, -192, 46, 345, 193, -23, 373, -426, -117, 119, 246, 120, -78, -437, 456, 190, -4, -39, 45, 84, 251, -39, 34, -71, -49, 144, 78, 166, 77, 99, -296, -119, 517, 58, 159, 221, 88, -166, -313, 106, -127, 18, 119, -154, -181, 234, 275, -134, -93, 213, -249, 117, -190, 93, -184, 281, 44, -32, 102, 478, 136, 188, -49, 28, 86, 354, -26, 505, 19, 241, -5, 455, 163, 340, 259, -55, -150, -39, -173, -191, 264, -56, -104, 37, -5, + -130, -51, 27, 100, -3, -162, 508, -149, -18, -654, -36, 332, -194, 287, -423, 49, 26, -22, -557, -34, -918, 33, -116, -387, -83, 42, -215, 26, 211, 27, -225, 31, -83, 193, -241, 6, 270, 59, 4, -49, 201, -148, 2, -6, 148, 29, -327, -166, -238, 249, -594, 273, 202, 193, 83, 41, -277, 178, -398, -88, -106, -76, -46, 25, 88, -282, -143, 483, 168, -171, -239, 57, -121, 150, -133, -32, -194, 401, 168, -106, -46, -147, -27, 336, 339, 199, 178, -157, 197, 327, -235, -3, -616, 361, 245, -82, + 146, -33, 52, 228, -136, 353, -310, 38, 391, 178, 25, 308, -106, 146, 80, 169, 266, -148, -32, 499, 244, -2, 66, -323, 450, -371, -26, 405, 120, 435, -270, 78, -21, -94, 53, -400, -293, 398, -199, -72, -137, -426, 304, -92, -80, -182, 182, 455, -359, -59, 290, -317, -155, 280, 360, -597, -178, -32, 233, -18, 231, -69, -240, -95, 317, 678, 126, -410, -151, 129, -905, 23, -2, -145, -51, 410, -685, 145, 308, -253, 272, 520, 121, -487, 122, -125, -18, -477, -153, 430, -58, 395, -114, -140, 54, -337, + -199, -242, -190, -133, 312, -358, 46, 625, 410, 142, -647, 107, 404, 176, 12, -224, -289, -675, -482, 100, -246, -228, -28, 294, 190, -199, -7, 417, -175, -63, 2, 549, 4, -20, 259, 94, -626, 172, 160, 20, -487, 216, 245, -148, -175, -312, 92, -195, 713, 46, -136, -3, 319, -144, 92, -69, 80, 276, -483, 524, 590, 172, 252, -190, 336, 777, 30, -80, -138, 336, -112, -178, -61, 124, -380, 178, -335, 394, 90, 396, -242, 362, 107, 472, 77, 105, -166, 296, 72, -85, 415, -156, -299, 595, 466, 179, + 440, 650, 776, -239, -252, -273, 89, -357, 413, -52, -50, -601, 126, 680, 679, -32, -111, -485, -17, 435, -249, -286, 218, 8, -297, 0, -86, -132, -83, -39, -961, -682, 304, 97, -522, 16, 178, -477, -316, -224, 490, 203, 130, -200, -168, -166, -368, -470, -812, 371, 304, -195, 831, 389, 796, 545, 12, -297, 180, 74, 338, 409, 440, -97, -128, 179, -262, -78, -237, -388, -639, -199, 560, -175, -287, -367, 194, 342, 197, 1, 309, 673, -463, -211, -368, -253, -719, -184, 119, -324, -289, -789, -1149, 104, -775, -1155, + -873, -356, 688, 251, 407, 341, -745, -298, -14, 257, -468, -628, 68, -1801, -316, 524, -638, 204, -271, -999, -335, 979, 1253, -729, -11, -282, -1085, -884, -824, -892, -484, -600, -78, 130, -179, 164, 168, -398, -125, -528, 170, -801, -701, 105, 88, -261, -274, 527, -199, 753, 154, 693, -536, 265, 189, 848, 464, 253, 64, 69, -130, 197, 355, -369, -433, 564, -109, -882, -1558, -1933, -1352, 135, -21, -1815, 541, 197, 411, -691, 52, 97, 49, 763, 809, 1561, 465, -1031, -1217, -827, -375, -322, -153, 980, -274, -1872, -545, 1532, + -225, 339, 207, 284, 525, 439, 140, -305, -128, 77, -348, -76, 548, -502, -318, -503, -139, 93, 46, 141, 245, -377, 323, 850, -36, -480, 24, -309, -133, 513, -549, 75, 144, 628, 860, -543, -345, 363, 23, 119, 78, -347, -977, -143, -468, 897, -1671, -1050, -470, -143, 451, 140, -605, -54, -693, -674, -282, -467, 73, 490, 1954, 432, -305, -1163, -993, 429, -134, -1034, 242, 609, -584, -713, -2273, 256, 282, -133, -98, -230, -700, 191, -204, 1070, -1229, -296, 1123, -113, -870, -157, 633, 795, 455, -211, 541, -520, 341, -245, + -231, -457, 595, 398, -512, -259, -141, 621, -142, 14, -516, 400, 215, -562, 828, -18, -907, 665, -979, -530, 719, -1791, -1197, 880, -695, 636, -1199, 182, 300, -670, -84, -116, -1245, -332, 1052, 1161, -1529, -543, 298, -1212, 1315, 1369, 51, -2163, -1238, 2046, -1294, -392, 1363, -1374, -2041, 63, 1067, -1458, -327, -1228, -1158, -41, -1458, -440, -626, -594, -447, 929, -111, -314, -404, 171, -514, -1220, 929, 280, 804, 238, 833, -347, -518, 170, -874, 664, -790, -183, 524, -617, -122, -381, -952, 127, -716, -539, -622, -485, -277, -660, 127, 696, + -466, -188, 105, 639, -278, 215, -650, 1076, 368, 452, 328, 1035, -29, -1248, 309, 434, -302, -15, 694, -867, -798, -1003, 920, 253, -1156, 479, -723, -142, -1000, 487, 870, 72, -1042, 728, 428, -57, 1065, 2010, -498, 990, 185, -492, -914, -542, 1169, -401, 210, 441, -127, 1068, -167, 834, 883, -1110, 557, -305, 21, 381, 328, -58, 174, 304, 1086, 1098, 861, -654, -217, -1511, -46, 327, 672, 130, -1232, 514, -739, 930, -862, -632, 65, -751, -120, -446, 1474, -834, -389, -1574, -497, -843, 2185, 1292, -453, -1502, -1566, -970, 1091, 1373, + 725, 169, -1878, -918, 631, 490, 94, 637, -385, -1255, 647, -2019, 2137, -245, -1587, 2830, 503, 707, 1508, 83, -888, 615, -1258, 793, -513, 1297, -573, -50, 741, 141, 72, -321, -280, 44, -486, 554, -57, 588, -445, -434, 158, 35, -452, 302, -52, 266, -135, -110, 246, -215, -14, 195, -88, -94, 918, -47, -301, -147, 439, -22, -493, 282, 539, 127, 17, -296, 116, -235, 249, 671, -227, 320, -241, -49, -264, -101, 175, 237, -375, 258, 72, -17, -375, 100, 143, -244, 414, 378, -662, 217, -580, -628, 470, -146, 448, -727, + 1591, 314, 404, -183, 162, -29, 316, 111, 689, 63, -346, 238, -219, 120, 156, -291, 35, 91, -314, 321, 97, -120, 427, -129, 180, -108, 95, 95, 57, -34, -101, -39, 77, 27, -48, -182, 168, -116, 94, 148, -116, 46, -106, 54, -180, -308, 358, -163, -66, 161, 87, -40, 60, 308, -297, 157, -98, 270, -245, 172, 98, -28, 82, 27, 28, 144, -143, 117, 107, -19, 16, 216, 17, 110, -205, 288, -135, 297, -1398, -3472, 750, 2887, 1953, 4074, -1332, -1141, -2343, -3748, -369, 1165, 1540, 2005, 1014, 109, -326, -871, + -1236, -191, -328, 119, 287, -18, 75, 146, 70, 486, 586, 357, -63, 63, -426, -909, -959, -478, -627, 515, 966, 1013, 1124, 606, -175, -448, -815, -874, -596, -346, -32, 212, 429, 445, 389, 320, -48, 79, -89, 34, -64, -54, -16, -318, -314, -244, -476, -10, -83, 46, 812, 1021, 329, 335, -208, -449, -140, -436, -286, 227, -189 }, + {190, 1, 248, 11, -80, -20, 1, 22, 115, -49, 59, -118, 39, -13, 80, -55, 116, 29, -60, 8, -119, 132, -13, -28, -1, 19, 27, 19, 97, -173, 12, 108, 21, -9, -20, -11, -5, -15, -177, -15, 51, -62, 59, -139, 0, 76, -82, 154, 150, 111, 95, 122, 15, 61, -59, -26, -102, -42, -6, -89, -30, -127, 17, -108, -140, 26, -102, 76, 11, -111, 74, 45, -116, 30, 19, 112, 29, -102, -195, 26, 64, 62, 310, 86, 67, -90, 13, -155, 38, 146, -72, 9, -29, -75, -123, 98, + -206, -103, -103, 114, 125, 67, 31, 91, 75, 149, -50, 54, 93, 21, 32, -106, -45, -43, -39, 102, -190, 34, -65, 202, 6, -34, -49, -80, -26, -84, -250, -77, -48, -38, -55, 29, -45, -9, -14, 91, 41, -9, 58, -47, 110, -68, -115, 117, 121, -48, -109, 15, 63, 45, 55, -47, -1, 38, 282, -50, -24, 32, 80, -204, 131, -242, -9, -116, -15, -76, -16, -17, 125, -101, 136, -136, -149, 66, 206, -238, -64, -114, 4, -58, 68, 88, 46, 90, -136, 7, 198, 79, 28, -140, -200, -120, + 34, -102, -55, 42, 135, -116, -114, 50, -82, 153, 54, -13, 110, 104, 4, 172, 88, 56, 49, 114, 180, -113, 38, 51, -119, 14, 105, -36, 259, -75, -60, -49, 95, 127, -142, -54, 57, -359, -58, -80, -64, -32, -44, 191, 229, -52, 187, 71, -102, 49, -156, 27, 34, -210, -31, 32, 37, 145, -27, 126, -84, -162, -170, -49, -86, -130, 134, -53, -25, -25, 28, 71, -206, -1, 29, -99, 246, 17, -60, -55, 262, -21, 33, 152, 4, 92, 36, 5, 144, -5, -102, 126, 68, 78, 116, 33, + -98, 61, 93, 86, 141, -8, -140, -118, 162, 220, -220, 26, -68, -50, 33, 51, 55, -97, -59, -264, 282, 261, 197, -138, 154, 278, -70, 217, 82, 32, -34, 239, 113, -57, -172, 99, -71, -92, 97, 114, 50, -171, 28, 152, -75, 51, -335, 47, -27, 160, 39, -71, -101, 205, -178, 13, -144, 15, -44, 114, -24, -40, -177, -44, -32, 216, 10, -203, -8, -14, 67, 101, -90, -3, -115, 117, -28, 142, -81, 213, 106, -246, 252, -43, -181, 23, 227, 39, 29, -190, -25, -71, -100, -99, -4, 299, + -110, -226, -17, -336, -6, -290, -104, 190, -208, -229, 62, 13, 15, -58, -79, -168, 104, -323, -103, 26, 191, 5, 194, 64, 432, 161, -10, 12, 203, -57, -68, -46, 29, -145, -74, -240, -22, -115, -70, 279, -1, 171, -78, 65, -24, 98, -42, 90, -105, -132, -27, 24, -131, -134, 3, 52, 124, -31, -72, -40, 116, 201, 1, -162, -223, -14, 43, 1, 263, -194, -26, 95, -61, -165, 124, 15, -9, 37, 20, 273, -208, -41, 18, -15, -7, -171, -131, -17, 115, 43, 47, 49, 121, -23, 111, 91, + -282, -107, -331, 88, -116, 169, -106, -144, -106, 89, -220, -181, 258, -138, 280, -63, 85, -95, -186, 210, -158, -175, -16, -93, -208, -158, -262, 15, 173, 103, -100, 300, 111, -103, -133, -207, 13, -73, -144, -68, -58, -97, 62, 245, -7, 26, -151, 87, 89, -123, -98, 70, 283, 125, -51, 2, -43, -168, -169, -109, 404, -61, 13, -51, 268, 254, 97, -389, -53, -475, 303, 135, 22, 517, 253, -32, -211, 220, -82, 64, 85, 45, 180, -134, 297, 120, 43, -73, -128, 204, 177, -19, 120, -228, 61, -309, + 147, 30, 180, -252, 71, -74, 75, 312, 270, 24, 90, -175, 262, 18, 539, 563, -56, -136, -133, -108, -302, -78, -400, 36, -17, -13, -68, 157, 265, 397, 377, 285, -431, -309, 4, 25, 456, -293, 229, 2, -33, -138, 284, 64, -203, -111, 531, 521, 585, -54, -20, -96, 103, 286, 332, 97, -135, -278, -562, 170, -330, -72, -28, -72, 45, -16, -97, -12, -322, -130, 27, -61, -360, -155, 40, 267, -67, 7, -284, -100, 13, 193, -109, 118, -318, -93, 86, 122, -79, 438, -80, -58, -218, -79, 189, 57, + -8, 226, 330, 367, -53, -190, -198, -2, 56, 81, -137, 113, 169, 125, 139, 353, 248, 160, 8, 91, -300, -25, 49, 46, -554, 654, -34, 83, 351, -9, -144, 4, -670, -413, -203, 89, -145, 59, -322, 196, -123, -18, 387, -409, -279, 362, -135, -569, 22, -357, 53, -44, 189, 73, 86, 26, -85, 230, -46, 300, 174, -129, -209, -195, 66, -104, 66, 44, 165, 36, -370, 2, 96, -140, -8, -261, -77, 1, -9, 532, -123, 370, 442, -153, 222, -103, -45, -289, 132, 369, 241, 27, 66, 206, -63, 162, + -133, -122, -204, 85, 405, 22, 636, 87, 154, -158, -83, 430, -294, -74, -573, 524, 272, 31, -198, -543, 49, -151, 61, -608, 209, 308, -353, -93, 48, 27, 112, 334, 419, -9, -5, 69, 12, -267, -298, -206, -391, -202, 325, 141, -128, -177, -112, -693, 143, 149, -323, 505, 14, 372, -145, 235, -89, -355, 25, 290, -177, 149, 192, 531, 146, 150, 521, 277, 191, -761, 141, 83, 128, -18, -311, 481, -412, 262, 240, -431, -102, 426, -522, 24, 16, -365, -536, -252, -240, -711, 437, 45, 469, 0, 44, -264, + -150, 213, -45, 221, -275, -107, 18, -141, -230, 269, -330, 326, -151, 87, -103, -270, -243, 74, -105, -32, 156, 680, 24, -121, -267, 72, 546, -136, -121, -364, -143, 17, -344, -147, -478, 258, -580, -1030, -133, -1, 447, -526, 427, 263, -264, -499, -105, 39, 104, -21, 256, -233, -106, -1026, -168, 962, 52, -210, -174, -553, 299, -280, -228, -106, 509, 458, -98, -136, -4, -642, 484, -393, -316, -239, 206, 104, 452, 85, -188, -231, -235, 248, -66, -113, 418, 457, 184, -251, 390, 596, -174, -90, 528, 159, 139, -284, + 42, 496, -640, 504, -59, 97, 326, 374, 41, 203, -277, -229, 222, 680, 220, 191, 292, -293, 117, 322, 215, -19, 281, 179, -337, 351, -325, 121, 330, -263, 284, -328, -89, 107, 74, 275, -85, 245, -76, 62, 133, -16, -76, -174, 582, -64, 441, -443, 475, -172, -463, -604, -165, -60, 361, -532, -80, -62, 286, 529, 445, 272, 50, -137, -73, -56, 382, 304, -62, 46, -70, 237, -567, 342, 203, 266, 105, 58, 513, -202, -409, -3, -123, 23, -572, -333, -16, 486, -313, -112, 102, -27, 36, 476, 219, -83, + 68, 229, 184, 556, -137, 250, 318, 145, -58, 85, -577, 255, -76, 22, -98, -342, -408, 91, -164, -609, 201, -501, -316, -38, -665, -447, 160, 269, 62, 434, -770, -856, 557, 503, 189, 543, 890, 274, -297, 307, -100, -213, 424, 57, -320, 245, 314, 94, 131, 50, 76, 816, 15, 197, 106, 516, 61, 808, 29, -316, 657, 155, -242, -70, 364, -41, 28, 286, -441, 501, -65, -668, -159, 94, -658, -52, -37, 331, 331, 547, -329, 105, 121, 134, 262, -307, -335, 221, 31, 423, 366, 125, 876, -114, -84, -545, + 895, 176, 629, 382, -850, 159, 145, 561, -203, 231, 32, -165, 506, -1123, 638, 652, -305, 143, 73, 166, -17, 518, -410, -97, -439, -16, -259, 26, 87, -617, 248, 650, -480, -444, -471, 870, -412, -223, 53, -307, -939, 155, 629, -911, -442, 310, 454, 130, -172, 209, -357, -151, -53, 451, -654, -488, 310, 568, 183, -699, -268, 25, -74, -114, 326, -99, 512, -439, -143, 14, -563, 345, -649, -393, 144, -246, 538, 876, 451, -529, 245, -136, -208, -347, -128, -532, 426, 283, 70, 189, 627, 1056, -23, -825, 156, -982, + 149, 426, 190, 45, 565, 416, -43, -102, -817, -444, -6, -387, 1065, -210, -265, -481, 39, 395, 265, -27, 189, 305, -501, 152, 908, 317, -659, -462, 280, -328, -66, 215, -165, -539, -150, 51, 860, -204, 171, -248, -741, 113, 872, -255, -566, 144, -358, 207, -217, -233, 587, -172, -101, 287, -563, 177, 621, -286, 22, -399, 1107, -224, 89, 345, -282, -78, -336, 82, -312, -116, -283, -297, -1757, -606, -17, 581, -283, -873, -320, -116, 449, 128, -104, -424, 478, 837, -359, 636, 170, -1163, 454, 567, -180, -465, -76, 740, + 789, -51, -573, 54, -53, -63, -475, 134, 237, -764, 550, 469, -534, 114, -601, 230, 1516, -1330, 1402, 639, 76, 859, 435, -858, 535, -644, -134, 723, 45, 213, -353, -629, 1945, -449, 39, 765, -358, 150, 67, 470, 1098, 1032, 977, 49, -15, -171, 13, -270, 66, 624, -150, -120, 91, 113, 453, -119, -1308, 595, -952, 1338, 156, -1160, 259, 14, 542, 262, -286, 994, 236, 57, 654, -520, -740, 32, 377, 1342, -195, 14, -148, 972, 95, -750, -461, 159, -95, 441, -752, 373, 109, 238, -78, -270, 156, 320, -11, 916, + -1453, 151, -523, -287, -202, -1021, -1545, -1549, -1168, 158, -12, -880, -26, -125, 79, -523, -1492, 1499, -49, -161, 271, -1383, -124, -296, 248, 490, 1941, 1510, -149, 56, -1, 395, 492, 556, 162, -152, -334, 1835, -1675, 333, -290, 105, 767, -491, 223, 66, -1815, 85, -166, 129, 258, -790, -265, -1333, -309, -28, 121, -480, -344, -558, -201, 635, 179, 1240, 344, -362, -373, 779, -765, 1454, -1046, 366, -832, 65, 908, -1493, 1514, 306, 232, -1006, -145, -147, 70, 563, 579, 697, -1146, 30, -400, -352, -386, -590, -366, 96, 794, -669, + 302, -1291, -351, 439, 530, 174, -1432, -730, -407, -638, -477, 222, -235, 824, 441, 545, 288, -47, 944, 770, -1459, 2218, -1675, -178, -1013, 198, 16, -610, -869, 1010, 671, 319, -448, 448, 129, 956, -763, -494, 582, 996, -1276, 516, -58, 607, -470, 183, -575, 123, -1065, 353, 1108, -28, -104, 1409, 225, -634, -1387, 1182, -640, 541, -525, 1412, 591, -136, 117, -789, 81, 368, -420, 412, -1723, 687, 1501, 1225, -700, -661, -730, 806, 21, -212, 18, 2017, -1015, -413, 718, -620, -1829, 788, 350, -1206, 642, 1079, 886, -297, -325, -1459, + 737, -111, 171, -552, 430, -17, 223, 49, 55, -325, 199, 749, -1018, 824, -174, -549, 146, -381, 201, -390, -329, 226, -820, -107, 1022, -1544, 398, 47, -284, -492, -582, -384, 1072, -933, -161, 332, -955, 211, 475, 315, 142, 136, -553, 387, -1390, -3, 1155, -519, -167, -288, -369, -31, -996, 489, 352, -815, 711, 188, -940, 354, -212, 639, 537, -862, 259, 919, -914, 469, -652, 459, 500, -762, 310, -139, -227, 487, -107, 426, -565, -3556, -7471, -3123, -5059, -6788, 2194, 611, 1857, 9434, 7807, 5061, 8054, 5396, 406, 1150, 752, -4696, + -3132, -2228, -5350, -5441, -1702, -1698, -3483, -1202, -949, -4117, -3591, -1320, -2090, -3895, -1143, -837, -3111, -544, 1768, -1068, -923, 2758, 1594, -1386, 2406, 4140, 291, 2274, 5115, 2458, 1183, 5598, 4039, 3021, 6825, 9325, 7342, 8596, 11122, 7320, 4790, 6359, 4130, -932, -90, -2498, -6599, -9316, -9988, -13268, -14993, -15450, -14302, -13094, -12249, -8411, -4714, -3970, 232, 5362, 3956 } + }, + { + {357, -22, -4, 39, -42, -45, -32, 84, -214, 81, -58, 1, 11, -8, -27, 14, 48, 90, -42, 101, -81, -89, -64, 46, -84, -53, 65, 13, -27, 81, -19, 1, 52, 29, -40, -54, -59, -66, -153, 42, -37, -11, 231, 22, -48, 134, -49, 4, -61, -109, 136, -42, -24, 3, -96, 33, -5, 72, -15, 72, 26, -16, 82, -8, 29, 45, -5, -186, -5, -22, -73, 52, -16, -26, -18, -39, 10, 43, -119, 76, 121, -40, 108, -15, 114, 58, -22, -42, 115, 11, 25, -126, -18, -7, -3, 177, + 88, -5, -129, -94, -54, 18, -1, 39, 83, 26, 32, -131, -18, -128, 8, -70, 87, 85, -31, -69, 91, 20, -31, -119, -14, -76, 24, 73, -119, -59, -18, -48, 311, 73, 181, 12, 60, -3, -88, -84, -104, 48, -86, 60, 3, 73, 78, 186, 57, -21, -12, -117, 173, 152, 21, 32, 22, 41, 421, -107, -95, -40, -91, 14, -209, 11, 34, 5, 132, 11, -35, -127, 71, -177, -155, 49, -79, -39, -33, 24, 109, 154, 5, -29, 181, 64, -19, 3, -85, -2, 199, -4, -104, -82, -31, 67, + -105, -122, -130, -102, 85, -96, 26, -116, 30, 133, -1, 94, -52, -80, -49, 64, -15, 101, 141, 20, -58, -81, -17, -14, -6, 2, -148, -17, -77, -71, 50, 10, 25, 41, -152, -84, 37, -45, 69, -14, -318, -164, -79, -222, -86, -214, 45, -32, -138, -158, -35, -131, -16, 83, -21, -193, -79, -12, -83, -72, 39, 153, 203, -50, -70, 106, 125, -58, -44, -43, -110, 14, 32, -103, -78, -36, 71, 168, 0, -78, -12, -109, -46, -163, -81, -81, -245, -41, -117, -90, -268, 142, -123, -116, 34, -33, + -30, 16, -223, -72, -87, -34, -134, -34, -69, 39, 63, -87, -48, -118, 22, -31, -30, -26, -148, -18, -128, -561, -42, -275, 252, -141, 452, -284, 285, -251, -14, 1, -196, 158, 6, -68, 47, -58, -26, -185, -2, -138, 114, 47, 139, -75, 208, 196, -184, 59, -157, 173, -1, -107, 7, -7, -9, 131, 14, -171, 71, 140, -13, 164, -76, 136, -192, -83, 117, -95, 25, 178, -157, 257, 89, -227, 51, -218, 75, 144, 78, 140, 169, 77, -33, 2, 0, 74, 116, -27, 226, 59, 148, 112, 29, 22, + 366, -4, -108, -41, -146, -173, 266, -59, -47, 244, -26, -54, 104, 188, 48, 90, -12, -218, -63, 154, -249, -246, -97, 47, -178, -108, -4, -30, 160, -70, -45, 171, 238, -219, 48, -56, 81, 19, -103, -26, 94, 152, -51, -226, -59, -25, -68, -115, 7, -19, 31, -36, 21, 202, -163, 15, -127, -99, -171, -53, -104, -226, -20, 11, -98, -22, -104, 80, 94, -22, 17, -80, -41, 240, -45, -111, -276, 496, 556, 117, -185, 137, 227, 228, 134, 176, 85, 280, -15, -19, -96, 181, -86, -219, -310, 52, + -143, -118, 126, -19, -74, 286, -8, 352, 15, -118, -80, 134, 89, -51, -256, 400, 233, 18, 219, 140, 146, -111, 163, 94, 40, -30, -60, -153, -231, 84, 124, -170, 83, 178, 248, 80, 224, 117, 191, -256, 87, 41, 60, 22, -15, 131, 108, 116, 149, -35, 71, 53, 193, 245, -124, -142, 28, -92, 451, 148, 203, -154, 71, -393, 28, -282, 226, 157, -117, 195, 111, -186, -44, 295, -4, 207, -49, 51, 231, -270, -18, 58, 86, 32, 94, 25, 278, -114, -76, -69, 210, 41, -96, 142, 352, -229, + 45, 64, -20, 159, -70, 286, 90, 86, -220, -3, -59, 144, 93, 155, -152, -77, 127, -240, -148, 84, 282, 197, 249, -246, -88, -249, -73, 115, -23, -228, 36, -122, 3, -228, -321, -90, -232, 37, 117, 87, -17, -541, -490, -358, 85, 86, 373, -192, 354, -171, -632, -74, -75, -257, -415, -165, -27, -265, -20, -397, 10, -417, 210, -120, 148, -98, -25, -144, -161, 224, 31, -92, 261, 10, 28, 74, 239, 204, 155, -17, -320, -53, 129, 23, 170, -111, 67, -466, 125, 247, -352, 177, 55, 296, 228, -22, + -98, -30, 201, 85, -297, -252, -405, -211, -275, -80, -336, -89, -117, 310, -158, 141, -81, -56, -122, -154, -66, -49, -52, 235, -659, 560, -118, 343, 214, 17, -424, 389, 82, -3, 260, 190, -155, 25, 421, 156, -140, 302, -116, -94, -47, 115, 38, -24, 74, 144, 143, 134, -247, 202, -198, 348, -161, 346, 143, 56, -274, -295, -64, -82, 416, 130, 342, 150, -222, 34, -15, 152, 54, 137, 15, -156, -56, 214, 525, 366, 91, 142, 20, -42, 299, 228, -29, 326, 485, 619, 77, -308, -337, 171, 146, 34, + 165, 34, -38, 39, 334, 79, -66, 314, -474, 388, 157, -327, 745, 105, -387, 81, 205, 12, 147, 529, -517, 326, -211, 288, -116, 53, -479, 70, -54, 180, -184, 14, 35, -8, -281, 255, 27, -44, 126, -69, 124, -83, 378, 282, 374, 355, -61, 111, 161, -4, -196, 242, -313, 73, 309, -209, 163, -373, 109, -58, -85, -60, 23, 75, 99, 329, -244, -50, 235, 478, -470, 71, -125, 105, -101, 689, -480, 95, -269, -186, -6, -69, 10, -593, -406, 335, -476, -113, 637, -212, -28, 334, 67, 200, -502, 451, + 15, 19, -139, -309, -56, -61, -329, -205, 332, -127, 51, -187, -781, 243, 19, -253, 130, 280, -44, 16, -76, 58, 185, 47, 307, 204, 34, 265, -244, -241, -336, 103, 167, 36, -523, 125, -450, 607, -167, 204, 516, -230, 320, 66, 350, 129, -199, -568, -414, -327, -65, -344, -88, -305, -208, 527, 91, -260, -235, 80, 168, -97, 54, -840, 218, 22, -142, -248, 193, -645, -785, 432, -398, -461, -149, 261, 569, -418, 7, 254, -109, -151, 129, 70, 422, 120, -452, -47, -241, -46, -279, -368, 28, 304, -48, 117, + -302, 48, 309, 223, 16, -9, 184, 160, 102, 266, -409, 383, 280, 63, -342, -19, 220, -295, 260, -245, 297, -133, 395, -712, 676, 113, 636, -11, -169, -104, 209, -45, -583, -43, -72, -644, 146, 334, -586, 370, -525, 57, 115, -9, -639, -382, -370, -26, -88, -412, -345, 538, 114, 356, 346, 101, -256, 63, 906, -614, 155, -104, -331, 25, 127, 150, 2, 7, -171, -256, -398, -201, 312, -253, -400, 237, -140, 93, -48, 184, -167, 384, -133, 43, -4, 42, 358, 120, -159, 188, -146, 288, -170, 117, -410, -304, + -219, 69, -205, -365, 153, 263, 78, -198, 123, 181, 212, 568, 793, 1070, -116, 158, 253, 135, 135, 151, -239, 399, -84, 511, 640, 432, 159, 167, 64, 667, 133, -155, -170, 10, 1101, 884, -358, -157, -431, 276, 147, 546, -72, -215, -82, -329, 100, 27, 523, -174, 210, -660, 395, -41, 286, 8, 262, 51, -357, -188, -302, -240, 305, 675, 319, -72, -177, -2, -26, 173, 257, -422, 24, -144, -109, -460, -323, -748, 49, -36, 307, -225, 519, -367, -122, 963, 995, -663, 189, 549, -278, -159, 330, -115, -356, 1062, + -218, -1642, 593, -33, -785, 627, 725, -248, 483, 569, -237, 34, 345, -355, 162, 141, 202, -436, -233, 45, 157, 329, 142, -321, -88, 236, -340, 277, -187, -421, 317, 153, 139, -127, -135, -167, -56, 268, -650, 277, -51, 484, -361, -26, -440, 148, -691, 46, -11, -285, -237, 80, -480, -784, 419, -66, 97, -472, 234, -95, 254, 295, 115, -337, 219, -171, -112, -606, 42, -436, -501, -686, -318, 91, 142, -704, -384, 24, -290, -938, -778, -764, -196, -455, 358, 546, 112, -534, -605, -654, -117, -27, 323, -242, -432, 862, + 955, -177, 660, -133, -194, -198, 646, -481, -71, -208, 998, 75, 398, 163, -36, 510, 318, 424, 177, -24, -110, 406, -5, -328, 512, 22, 456, -410, 370, 142, -389, -317, 888, 566, 15, 325, 314, -495, -275, 201, 202, 393, 117, 106, 217, 471, 260, 138, -368, 1256, 908, 117, -472, 296, -101, 173, -38, 282, -89, 59, 776, -455, -128, -618, 281, -153, -2, 592, 271, 95, 192, -187, -297, 302, 258, -39, -268, -613, 1698, -1844, -190, -956, 1239, 359, 240, -438, 139, -351, 1110, -157, -45, 147, -30, -387, 185, 285, + 350, -694, -364, -338, 171, -181, -177, 18, 13, 523, -229, 67, 381, -1, -466, 106, 399, 0, -746, 617, 84, 59, 13, -272, 265, -1358, -971, -86, -341, 117, 119, -607, 1050, -356, 1441, -145, -492, 547, 89, 495, 667, 269, -677, -129, 768, 1837, 58, -392, 728, 119, 835, 196, 1114, -142, -47, -22, 289, 22, 229, 45, 2416, 730, 243, -107, -289, -382, 772, 701, -870, 468, 354, 52, -280, -483, -1175, -468, 343, 81, -394, 655, -250, 240, 254, -210, -187, 681, -5, -322, 429, -442, 865, -485, -289, -100, 323, 131, + 875, -333, -565, -250, 212, 0, 455, 68, 14, -264, 358, 1617, 687, -705, 509, -411, -550, 331, -58, 29, -76, 200, -493, -789, -1856, -594, 586, -369, -689, 126, -225, 104, -818, -796, -420, -31, 37, 498, -147, -376, -517, -746, -372, 552, -424, 1503, 1264, 598, -332, -515, 907, 778, -996, -194, -606, 875, -136, -1216, -524, 447, 778, -1408, 580, -973, 374, -571, -140, 692, -220, 113, 446, 918, -585, -991, 233, -72, 118, 939, 243, 702, -874, -159, 290, -785, 1292, -149, 776, -109, -176, 628, 635, -368, 1418, -340, -617, 674, + 1216, 56, 216, 42, 530, -595, 419, 1816, 834, -95, 784, 949, -769, -2311, 127, 1267, 1432, 290, -168, -746, 508, 1291, 823, -319, -1339, 1001, -2086, 1530, 291, -978, -20, 839, -617, -14, 454, -650, 20, -589, -380, 539, -528, -324, -1076, 411, 988, 243, -486, -820, -152, 539, 289, -708, -44, 752, -131, 8, -297, -243, 1853, -949, -253, -258, 294, 823, -949, -571, 1215, -198, -99, -1529, -1239, 457, 813, 399, -1529, 982, -42, -289, 204, -1140, -312, -199, -546, 914, -768, -480, -823, -532, -1082, 266, -1687, -531, 200, -887, 207, 380, + 207, -81, -239, -526, 561, -134, -546, -147, -1169, 726, -10, 936, -178, 967, 134, -115, 443, 1119, 548, 291, 238, 147, 454, -555, -28, -417, -423, 686, 445, 263, -178, -172, -61, 715, 130, -319, -496, -27, -100, 533, 105, 444, 869, -243, -2118, 132, 1767, 171, -1251, -177, 519, 372, 711, 606, -22, -421, -384, 525, -300, 39, 222, -2250, -354, -454, 386, 1717, 2, 107, -370, 82, 397, 693, 420, -480, -191, -1125, -27, 664, -289, -199, 307, 670, 424, -269, 404, -268, -3709, -6801, -2853, -4668, -5338, 3001, 920, 2743, 8632, 5585, + 4465, 6792, 3291, 36, 2568, 502, -2987, -2148, -2418, -5303, -4349, -1977, -3913, -4283, -1883, -2699, -4416, -2356, 151, -2828, -2613, 374, -703, -2590, 2555, 1628, -2202, 1881, 2916, 333, 1608, 6030, 2784, 1729, 7111, 4971, 2826, 7055, 9478, 5860, 8508, 11076, 7890, 5242, 6907, 3653, -3537, -2281, -4620, -10773, -10799, -10884, -16518, -16241, -16272, -16823, -15709, -14953, -11437, -8667, -5714, -1214, 2492, 5285, 9734, 12437, 12029, 15341 }, + {386, 41, 72, 125, -169, -46, -96, -20, -44, -105, -12, -15, -103, 129, -84, -53, -9, -47, 111, -50, -79, 33, 41, 118, -12, 25, -75, -14, 9, 35, 8, -3, 120, -70, 27, 8, -75, -173, -69, 37, 60, 63, -169, 132, -65, -70, 71, 29, -148, 58, -152, -44, 64, -118, -47, 103, -39, -67, -87, -168, 131, 48, -54, -51, -114, -129, -149, -31, -97, 0, -7, -5, 12, -11, -80, -73, -27, 3, -217, -24, 194, -182, 64, -304, -1, -113, 116, -106, 23, -74, -129, -38, -16, 85, 110, -114, + -191, 92, 30, 62, 38, 71, -112, -89, 17, -28, 95, 63, -86, -25, 72, 131, 83, -7, -111, 50, -21, -66, 75, 24, -101, -92, -69, 47, -99, -62, 81, 22, -4, -113, 37, -99, -228, 11, -78, -158, 67, -54, -42, -63, 3, 98, 67, 23, 51, 69, -170, 70, -67, -77, -42, 28, 5, 91, 454, -38, 84, 100, -45, 48, 182, -141, -24, 52, -69, -14, 134, -43, -28, -9, 53, -25, 66, -45, -42, -21, -101, -176, -31, -57, -21, 103, -184, 228, 4, 3, 11, 42, -2, -89, 17, 69, + 176, 7, 2, -28, -54, 113, 59, -44, 68, -116, 24, 35, -82, -299, -88, -9, -12, -16, -20, -40, -15, -58, 80, 217, 132, 8, 8, -8, 86, -46, -188, -7, -89, 61, -104, 75, -227, 9, 3, 70, -397, -382, -142, -55, -53, 3, 100, 26, 82, -179, 92, 115, 112, 130, -96, 30, 303, -183, -4, -130, -189, -21, -11, 169, -78, 20, -140, 94, 60, 75, -318, 52, -56, -110, -27, 1, -235, -152, -130, -8, 203, 72, 70, 98, -85, 59, -76, 173, 266, -22, -20, 77, 23, 70, 152, -67, + 157, -21, 0, 93, 129, -44, -173, -162, 69, -20, -25, -69, 86, -131, 53, 101, 171, -88, 154, 62, 18, -437, 188, -196, 350, -327, 256, 131, -136, -170, -95, 67, 60, -92, 206, -75, -198, -41, 214, 146, -217, 34, -27, -227, -94, -146, -34, -174, -46, -72, -239, -85, 122, 174, -33, -205, -41, 146, -44, 6, 11, 4, -203, -5, -23, -51, -8, 37, -144, 85, -154, -2, 1, 5, 119, 4, -51, 50, 84, 194, 91, 47, -51, -115, -107, -43, -117, -83, 79, 129, -83, -143, -89, 50, 32, -110, + 546, 225, -23, 133, -73, 312, 140, 551, 23, -510, 147, 328, -175, 67, 231, -156, 167, -124, -16, -156, -145, -39, 59, -6, 87, -61, 246, -127, 80, 54, 166, -265, -128, -98, -17, -87, 42, 179, 137, 278, -22, -9, -135, -39, 186, -154, 157, -143, -46, 256, 373, 265, 64, -176, 151, 109, -79, 218, -115, 52, 55, -364, 20, -345, -119, 71, -68, -155, -117, 46, 266, 78, -56, -89, -65, 38, 47, 338, 677, -286, -210, -53, -72, 240, -216, -401, -134, 34, -92, 123, 63, 208, 93, -76, 300, 279, + -118, 25, -180, -27, 19, -111, -14, 209, 302, 16, 57, 125, 86, 51, 29, -107, -201, 28, -293, 15, 80, -93, 129, -73, -157, -9, 174, 76, -62, 498, 10, 163, -283, -62, 215, -91, -205, 132, -242, -224, 66, 285, -215, -124, -53, 17, -89, -98, 394, 225, -17, 25, -151, -113, -40, 107, 145, 81, 265, -477, -65, -358, -205, -325, -84, -50, -50, -125, 144, -457, 234, -156, 139, 61, 189, 11, 78, -184, -79, 86, -185, -133, 223, 62, 100, 91, -24, 61, 333, -119, 31, -150, 267, -161, -599, 186, + 93, 253, 134, 348, -235, -91, 207, -85, -201, -92, 107, -288, 285, -7, 190, -242, -109, -86, -267, -51, -213, -93, 21, 309, 245, -24, -376, -210, -69, 301, 242, 180, 158, -92, -384, -92, -19, 88, -77, 38, 140, -645, -775, -446, 290, 5, -161, -180, -261, -45, 62, -441, -60, 246, -183, -135, 277, 58, -216, 55, -210, 421, -162, -125, 123, -249, -164, -154, 55, -179, -80, 54, 33, -537, 211, 206, -169, 381, 134, 18, 365, 200, 49, 34, 396, -61, -91, -48, 236, 123, -396, 126, 98, -23, -220, -629, + 249, -61, -169, -402, -234, 213, -69, -132, -273, -517, 31, -90, -280, -132, -476, -103, -117, -115, -39, 124, 284, 74, -70, -117, -639, 527, 37, 272, -39, -16, 58, 293, 38, -30, -381, 144, -32, -297, 90, -193, -140, 564, 171, 176, -108, 204, 256, 237, -122, 206, 121, -234, 169, -228, -63, 147, 86, -23, -110, -120, 391, -109, -145, -106, 96, 79, -158, -303, -1, -325, -16, -294, -87, -73, 81, -153, -227, 313, -105, -356, 252, 367, -152, -127, 220, 128, 403, 230, 72, -14, -345, 80, 399, 279, -215, 252, + 326, -185, -423, -134, -346, -2, 137, 133, -1021, 502, 149, -40, 704, -33, 361, -303, -64, 63, 14, 406, 262, -531, 346, 33, 212, -478, -10, 289, -468, 605, 171, 1, -204, 43, 268, -421, 49, 116, 85, -257, -89, 256, 150, -20, 46, -167, -288, 129, -493, -15, 728, 707, -216, 92, -23, 206, 513, 47, 249, 84, -259, -17, -45, -761, -339, 472, 26, 145, -181, -50, 170, 224, -22, 580, 5, 440, 48, 70, 49, -271, -323, 349, 44, -158, 184, 350, -745, 307, 479, -60, 146, 218, -109, -68, 298, -105, + 449, -417, 236, 552, -581, 28, -273, 350, 152, 290, -291, -229, 3, 744, 15, 377, -160, 25, -45, -64, -323, -11, -86, 152, -141, -212, -173, -13, -57, 335, 63, -186, -163, -171, -57, -83, 550, 21, 278, 16, -127, -124, 458, 334, -128, -434, 244, 159, -941, 47, 532, 509, 120, 401, -573, 917, 76, 156, 166, 401, -40, -390, -116, -434, 273, -111, -249, 195, 280, -564, -453, 392, 327, 812, -298, -222, -155, 149, -357, -47, 126, -29, 429, 280, -363, 29, 92, 252, -413, 420, -19, 185, -83, -193, -433, 149, + -86, -177, 72, -256, -264, -54, 119, 514, -774, -455, -424, -455, -145, 536, -328, -6, 506, -67, -250, -441, -137, -182, -950, -711, -219, 181, -103, 183, -221, -128, 430, 293, -479, -213, -534, -175, 35, 247, -98, 99, -439, -307, -300, 25, 105, 69, -302, 72, 425, 53, -404, 72, -48, 918, 97, 439, -388, -267, -98, -441, -279, -426, -198, -279, 498, 118, 124, 508, -16, -38, 230, 455, 723, 521, -112, -208, -839, 219, 259, 89, -524, 589, 236, 339, -103, 18, 338, 736, 728, 405, 83, 763, 14, -255, 246, 451, + 377, 679, 362, -11, 74, -455, 172, -1095, -197, -142, 219, 796, 450, 80, 583, -488, -425, 33, -1063, -307, 5, 126, 188, 180, -114, 330, 7, 107, 550, -361, -300, -26, -68, -713, -226, 127, 537, 985, -398, 14, 164, -186, 917, 158, -449, 797, -163, -275, 577, -527, -301, 28, 54, 64, 381, 193, 311, -102, 168, 451, 35, 304, 65, 1, 516, -674, -232, -237, 452, -351, -78, -212, 449, -199, 986, 698, -651, 311, -784, 99, 302, 139, 188, -1034, -181, -1000, 147, 62, 138, -175, -158, 448, -825, 269, -344, -1618, + -573, -546, 289, -256, 271, 767, 866, 451, 450, 336, 181, -528, 623, 265, -513, -601, 263, -1250, -573, -425, 249, -951, 361, -563, 837, -946, -1202, -249, -159, 968, 483, 439, -228, 125, -572, -460, 128, 215, -742, -694, -477, -49, 404, 291, -513, -658, -369, -382, -891, -512, 427, -238, 18, -109, 322, 489, -98, -1351, 605, 1163, 455, -6, -1342, -307, 631, -150, 1569, -141, -1203, 229, -171, 128, 74, -220, 374, 439, -1258, -318, 121, 496, -188, -630, 652, 100, -369, -1217, -1350, -668, -6, 164, 1035, 1059, 690, 359, 82, 2272, + 2085, -913, 1071, 946, -296, -187, -527, -296, -615, -439, 1726, -119, 995, -11, 26, -10, -714, 141, 120, -1542, 203, 344, -823, -191, -270, -133, 201, -69, 23, 644, 248, -349, 183, 1042, -6, 467, -50, 376, -611, -735, -421, -1327, 325, 120, -603, -1607, -1057, -1505, 1055, -793, 145, 242, 222, 180, 1128, -1132, -16, -646, 1194, -2756, 539, 184, 854, 771, -16, -273, -436, -139, -764, 525, 1496, -151, 397, 515, -604, 711, -734, -693, 995, -1840, 1374, -723, -485, -284, 184, -490, -364, 656, -117, -1240, 515, -20, 298, -233, 1225, -884, + 110, 540, -256, 424, -698, 124, -589, -274, 796, 154, 366, -347, 775, -138, -244, 331, -344, -290, -142, -168, -632, -895, -177, 604, 102, -231, -864, 109, -659, 24, 411, -676, -76, 634, 677, 492, -814, -354, 767, 301, 115, 619, -2923, -605, -189, -1279, 303, 510, 98, 392, 808, -190, -464, 347, -341, -43, 731, 681, 43, -2, 2028, -290, -598, 49, -257, 990, 165, -117, 942, 952, 296, 349, 512, -1242, -695, 972, -163, -1026, -528, -484, 660, 334, -390, -1469, 422, 191, 166, 201, -196, 110, -1098, 926, 646, 319, -561, -494, + -23, 445, -126, 464, 198, -1174, -524, 140, -1161, 28, 200, -1045, -1434, -240, 412, -866, -1738, -796, -465, 1074, -692, 1216, -271, 15, 526, 28, -1940, -175, 69, 854, -1723, -2384, 143, -221, -1382, 732, 284, -34, -49, 802, -1592, 1220, 208, 1066, 481, 2372, -847, -893, -306, 62, 2266, -198, 1896, -1152, -380, 855, -1249, -350, -1167, 311, 1419, -1693, -539, -54, 664, 84, 321, 596, -3, -1037, -923, 152, 870, 2089, -312, 639, -439, 1082, 170, 215, -136, -1077, 183, 1184, -39, 38, -252, -924, 1506, 616, 1062, 1310, 108, 175, 924, -1824, + 848, -865, 2471, -105, 424, 456, -458, -553, 450, -846, 1683, -712, -816, -927, 1768, 670, 1201, -67, 1062, 978, -403, 513, 149, -818, 1379, 200, -1694, 1157, -1204, 142, -553, 442, -43, 631, -97, -560, 957, -343, -125, 136, -389, -358, 1107, -272, -138, -143, -43, 488, -369, 102, -265, 233, -227, -207, -569, 838, -510, 262, 161, 571, -646, 124, -248, 649, 117, 24, 565, 128, -855, -164, -118, 211, 424, 287, -768, 306, -569, 390, -304, 48, -154, 380, -118, 75, -850, 163, 491, -466, 467, 1, 209, 199, -303, 560, 300, -93, + -126, 225, -58, 342, -259, -278, -61, 150, -714, 1417, 111, 171, -579, -429, -914, 599, -262, -193, -402, -24, -359, -52, -55, 151, 169, -36, -51, -266, 231, 216, -223, 92, -494, 185, 85, -93, -84, -170, 145, 26, -354, -101, -111, -295, 461, 41, -310, 38, -127, 402, -152, -199, 69, -252, 467, 6, -274, 68, -118, 226, -312, -67, 89, -117, 199, -127, 49, 88, -284, 31, 258, -421, -40, 118, -396, 687, -646, 303, 98, -358, 650, -463, 118, 39, 333, -1527, -3525, 925, 3265, 2761, 3706, -1827, -2366, -3560, -3636, 249, + 2712, 2991, 3279, 1088, -711, -2602, -4304, -2362, 1098, 1696, 2877, 2177, 598, -388, -904, -2160, -1394, -1332, -239, 1133, 1746, 914, 1168, 585, -651, -106, -1398, -1957, -329, -459, 350, 1836, 1066, 908, 275, -694, -703, -617, -1004, -271, 52, 428, 537, 875, 259, -38, -436, -826, -61, 287, 312, 509, -122, -421, -187, -419, -308, 79, 235, 603, 516, 407, -87, -239, -672, -545, 113, 421 } + }, + { + {333, 145, 156, 2, -61, -151, -54, -109, -113, 24, -92, -57, -15, 93, -6, 32, -99, -51, -118, -192, 106, 76, -80, 42, -49, -10, 123, -71, -13, -92, -56, 48, 67, 93, 83, -131, 20, 69, 4, 99, 14, 31, -102, -56, 20, -30, 27, 8, -60, 109, 78, -133, -3, -8, 36, 114, 49, -126, 21, 42, -90, 34, 47, -19, 54, -15, -21, -13, -70, -19, -24, -58, -2, -10, -2, -14, 0, -144, -170, -150, 184, -39, 147, 42, 219, -52, -115, -80, 134, 3, -50, -14, 151, -42, 27, 52, + -103, -79, -34, 27, -107, 26, 21, -124, -41, -75, 10, -55, 19, 199, 102, -60, 9, -97, 72, -27, 118, -248, -28, 37, -88, 14, 119, 90, -111, -83, -89, -18, -71, -37, -108, 40, -10, -127, -65, -52, -6, 24, -27, -15, 54, 20, -59, 29, 133, -70, -17, -142, -50, -14, 50, -54, 14, 12, -14, 18, -45, 237, -79, 82, 199, -149, -169, -19, -37, 5, 105, 62, -238, 46, -134, -185, -6, 78, 83, -55, -2, -13, 111, -14, 93, -32, 16, 27, 32, -114, 57, 103, -38, 129, -61, -4, + -145, 116, 33, -30, -111, -106, -47, -30, 64, -3, 56, 60, -98, 75, -133, 61, 87, 165, 154, -116, 69, 4, -27, 102, -62, -69, -55, 87, 43, 110, -88, 159, -38, 9, 50, 43, 89, -43, 116, 153, 248, 104, 104, -280, -302, 36, -23, 73, 69, 201, 92, 96, 50, -98, 40, 253, -167, -19, 10, 203, 124, 28, 92, -16, 72, 93, 211, 115, 120, 62, 53, 100, 40, -146, 92, 118, -39, 85, 118, -42, 40, 141, 57, -37, 55, 143, -4, -5, -25, 36, 141, -45, -73, 35, -43, 68, + 91, -108, 26, -72, 10, 35, 120, 88, -238, -9, 124, -71, -97, 4, 23, 109, -7, -260, -103, 68, -61, 98, -12, -520, 65, 46, 232, -16, 180, 89, 41, -308, -6, -12, -240, 30, 168, 25, -10, -30, -99, -115, 41, 60, -14, 37, 48, 201, 18, 84, 92, -119, 18, -35, -36, -24, 71, -22, -58, -94, -56, 16, -155, -117, 57, -130, 33, -206, -239, -72, 282, -89, -23, 157, 51, -1, 176, -40, 13, -38, 46, 101, -53, -199, 108, -124, -211, -100, -67, -21, 63, 193, -13, -28, -91, -32, + 81, -92, -68, 72, 460, 19, -24, -170, -96, 245, -94, 192, 166, -181, -26, 144, -99, -46, -44, -63, 35, 54, 13, 91, -36, 17, 38, -34, -82, -87, -97, 11, 124, 55, -95, 13, 52, 230, -61, 207, -179, 87, 153, -93, -52, -185, 96, 2, -125, 135, -157, 188, -2, 265, 68, 33, 72, 113, 67, -79, 138, -19, -127, -209, -47, 97, -96, -63, 97, -112, 250, -216, 15, 158, -106, -38, -178, 13, -38, 7, -35, 162, 220, 390, -114, -170, 44, -70, 107, 355, 2, -82, 112, 61, 105, 63, + -194, 7, -173, 95, 83, 50, 325, -16, 242, -7, -6, 73, -2, 254, 33, 159, -60, 216, -99, 114, 430, -72, -109, 302, 63, 196, -6, -191, 58, -112, 129, -230, -31, -121, 127, -23, 25, 231, -115, -240, 65, -25, -13, 186, 35, 22, -88, -161, -166, -61, -138, -109, 138, -77, -17, -56, 10, -7, 115, 52, -150, -166, -21, 547, -269, 199, 19, 104, -117, -90, -47, 128, 162, 43, -70, -145, 94, 159, -16, 57, -66, 172, 73, -293, -87, 108, -4, -118, 7, 149, -88, 57, -183, 126, 264, -93, + 278, 19, -33, 186, 7, 24, 174, -333, 67, 114, 162, 109, 130, -143, -103, 5, 72, -156, 73, 173, 164, 65, 463, -129, -37, -190, -66, -120, -164, 241, 117, 237, -13, -345, 232, -110, 139, 115, 74, 70, -220, 312, 104, -87, -666, -565, -523, 87, 77, 18, -3, -60, -64, -11, -111, -205, -152, -340, -166, -177, 163, -267, -134, -161, 14, -20, -90, 48, -49, -276, -33, 209, 2, -248, -228, 64, -109, 172, 108, -236, 181, 309, -308, -308, -183, 82, 233, -211, -226, 77, -144, -3, -58, -47, -336, 34, + 149, -118, 70, -175, -215, -202, -125, -331, 485, -137, -76, 64, 15, 83, 26, 132, 25, 104, 265, -437, 208, -105, -147, -39, -398, -47, -634, 480, 126, 102, -119, 469, -76, 219, -2, 196, -283, 106, 110, 37, -138, 415, -114, 122, 98, 430, -294, -27, 124, -85, -214, 122, -201, 43, 59, -249, 96, 9, 16, 470, 305, -52, -192, -167, 113, -39, -283, 68, -19, 70, 224, 304, -213, 201, 116, -161, 112, 66, -219, -142, -134, 209, -239, -231, -558, -438, 125, -102, -71, -244, -431, 143, 45, -40, 224, 151, + 259, 115, 73, -43, 44, 200, -211, 227, 180, -753, 716, 517, -197, -165, 201, 12, 27, 347, 249, 20, -40, 146, -68, -39, 105, -141, 200, 140, -148, 215, -12, 66, -5, -326, -8, 255, 264, 110, 119, 147, -146, -187, 96, 163, 4, -66, -162, 83, -40, 227, 265, -17, 304, -141, 338, 188, 405, 40, 69, -102, -150, -19, 314, 506, 41, 389, -151, -348, 60, 149, -303, 342, -96, 129, -682, -285, 7, -148, 150, 234, 463, 102, 66, -158, -309, 2, 57, 217, -267, 539, -189, 91, 411, 423, 1, -197, + -91, -91, 60, -263, -201, 274, 92, 187, 223, 256, -70, 177, -24, 206, 767, 202, -322, 373, 427, 47, -32, 51, -162, -239, -107, 433, 305, 254, 377, 101, -24, -126, -400, 233, 265, 160, -32, -21, -113, 94, 392, 278, -367, 303, -302, 398, 118, 173, 204, -20, -149, -17, 191, 668, -51, 359, -87, -233, 386, 350, 139, 131, 355, 163, 76, 72, -75, 31, -120, 304, 263, -127, 267, 341, -384, 265, 153, -88, 26, 185, -161, -336, 514, 117, 98, 103, 304, 96, -307, 336, -441, -505, 44, 71, -286, -84, + -843, -585, -451, -141, -464, -216, 170, -403, 285, 279, -343, 448, 226, -72, -51, -212, 2, -389, 875, 272, 129, -426, 97, -121, 575, -102, -28, -519, 511, 52, 191, 187, 289, 191, -135, 193, -279, 282, -116, 173, -440, 956, 117, -417, 189, 286, 168, 234, 181, -319, -654, 221, -65, -37, 434, -45, -40, 69, 392, -65, 240, -148, -180, -237, -310, 618, 335, 244, -156, -508, -633, 349, 248, -204, 186, -128, 44, 617, 284, -134, 344, -75, 193, -163, 227, -400, -607, -214, -255, -15, 773, -571, 379, 236, 181, -99, + 322, 166, -551, -703, -233, -300, 868, 646, -172, -335, 0, -343, -50, 649, 595, 362, -466, 150, -356, 656, 325, -20, 39, 248, -311, 128, 521, 323, -414, 458, -125, 505, -517, -186, 934, 448, 548, 155, -731, 262, -589, 432, 1159, 434, 735, -290, 228, 362, -12, 117, -270, 107, 468, 57, -99, -369, 242, 202, -391, 251, -137, 352, 468, 516, 594, 98, -428, 162, 290, 37, 802, 113, -883, -520, 273, -182, -1045, 87, 469, 217, 64, -44, 577, -385, -529, -48, -178, -470, -12, 103, -290, -389, -261, 94, 86, -584, + 221, -193, 187, 849, -71, -159, 556, 1, 487, -273, 342, 291, -11, -260, 757, 89, -1064, -487, 642, -952, 524, -901, 61, -152, -1301, -179, 568, 1176, 365, -181, 275, -463, -165, -1043, -70, -711, -114, -161, -499, -523, -184, 289, -480, 315, 579, -616, 208, 192, 91, -655, -113, -11, -694, 174, 854, -70, -1272, 442, -773, -1942, 533, -805, -1012, 51, -472, 137, 330, -193, 497, -429, 432, -353, -883, 3, 605, 593, -1145, 163, -152, -846, -244, -211, 1431, 719, 820, 334, 291, 770, 1169, -222, -433, -218, 234, -236, 1667, 1807, + -1113, -459, 787, -403, 296, -542, 118, -555, -1022, 1316, 159, 395, 308, 100, 138, 15, 234, 310, -994, -810, -729, -673, -528, -328, -295, -531, -331, -452, 451, 357, 147, -255, 58, -1025, -551, 261, -962, -97, 403, 782, 72, 145, -384, -598, -744, 557, -122, 554, -2007, 123, -274, 229, 1153, 153, 154, 144, -396, -390, -35, -62, -1147, 257, -450, 1012, 24, -1045, -1474, -818, -230, -938, -1003, -580, 713, -32, -644, -363, -266, -446, 1975, -1055, 789, 1412, -588, 246, 1150, -1321, 122, 205, 738, -1490, 157, 152, 580, -624, 85, 322, + -828, 180, 12, -125, 582, -106, -51, 253, -30, -113, 581, -417, 230, -149, 223, -255, -61, -319, 110, 107, 1067, 355, 579, -60, 130, 745, 95, -233, 529, 329, -183, -894, 997, -889, 304, 482, 746, -872, 1145, 1604, -669, -1543, 2329, 806, -834, 551, -773, -1170, -356, -117, -978, 1117, -1334, 699, 964, -452, -1122, 2041, -570, -461, 1067, -700, -557, -1120, -511, 666, 523, -300, -367, 353, 890, -382, 674, 794, -557, -86, 497, -132, 7, -168, 53, -823, 235, -190, 40, 186, -151, 157, -324, -695, -308, -1201, 164, -17, -160, 205, + 131, -94, -252, 460, 775, -812, 1181, -151, 178, 145, 1049, 446, 776, -968, -208, -205, 1365, -1278, -397, 578, -14, -1473, 131, -333, -209, 619, 762, 8, -499, 1120, -443, 1874, 65, -935, 93, -212, -802, 1694, 342, -1169, -1231, 461, 616, 386, 1492, -256, 360, -115, -729, 404, -454, -247, 331, 682, -664, 781, 116, -14, 1574, -290, -141, 1181, -710, 1046, 473, -220, 440, 453, 987, 1013, 321, -783, 1719, -1669, 92, 1559, -793, 361, -147, -180, -1747, 1231, 358, 556, 607, -351, -847, -649, -499, 102, 1736, 29, 1374, -425, -977, 73, + 431, -823, 1414, 571, 723, 1365, 928, -1420, 611, -2048, -2491, 81, 2208, 1363, 250, -1403, -5041, -669, 1519, 1369, 2029, -417, -2351, -263, 221, -1329, 1119, -835, -145, -539, 520, -606, -27, -60, -166, 129, 571, -600, 264, 53, -143, 14, 401, -505, -144, -68, 835, -843, 221, -364, 551, -612, -182, 221, -126, 127, -407, -61, 356, -100, 133, 126, 68, 466, -429, 297, 319, 418, -66, -925, 111, 127, 373, 365, -79, 110, -169, -411, -84, 213, -92, 589, -476, -135, -938, 297, 88, -125, 194, 204, -27, -453, 133, 489, -103, -47, + 156, -107, 239, -188, 8, -192, -754, 1845, 506, 459, -239, -585, -562, 165, 363, 61, -16, 2, -264, -45, 135, -67, 61, -25, -264, -10, 139, 215, -182, 56, 141, -265, 447, -263, -227, -228, 66, 133, 211, -219, 292, -407, 279, 247, -175, -15, -6, -43, 219, -224, 74, -69, -288, 423, -227, -3, -166, -50, 300, -377, 164, 111, -158, 145, -316, 100, 145, -236, 16, 136, -213, 231, -297, 92, 326, -445, 143, -162, 48, 176, -105, -35, 18, 276, -1422, -3337, 945, 3268, 2248, 3555, -1979, -2107, -2872, -3325, 72, 2564, + 2649, 2764, 543, -914, -1813, -2603, -2206, 172, 1715, 2034, 1831, 438, -505, -316, -1428, -1597, -673, -44, 615, 1346, 658, 488, 675, -337, -801, -131, -1281, -602, 15, 203, 977, 1136, 101, -172, -106, -839, -227, -12, -175, 290, 563, -120, -44, -221, -350, 72, 35, -38, 634, 429, 159, -16, -599, -864, -682, 50, 632, 534, 695, 108, 5, 116, -821, -473, -67, 46, 441 }, + {334, 209, 79, -9, 170, 13, 3, -33, 67, 134, 19, -88, 120, 89, -50, 13, 28, -89, -52, 60, 19, 115, -69, 69, -95, -4, 25, -94, 30, -44, 87, -115, 160, -22, -85, -153, 56, 126, -45, 28, -68, 33, 91, -4, -32, -32, -31, 77, -76, -68, 20, 37, 55, 7, -59, 164, 19, 21, 100, -31, 48, 0, -29, -15, -14, 57, 110, -18, 27, 19, 129, -25, -44, -35, -44, -36, -13, 3, -131, -85, 41, -31, -39, -62, 19, 134, -38, 5, 17, 227, -1, 47, -88, -59, -20, -55, + -61, -56, -38, -52, -73, 69, 109, -53, 19, 10, -117, 9, 0, -79, 164, -76, 94, 41, -22, -86, -83, 90, -40, -24, -124, -25, -9, -52, 172, -29, -8, 79, -9, -133, -70, -115, -81, 204, -51, 226, 3, 2, -35, 37, 13, -115, -131, 114, 17, 83, -1, 95, 57, -98, 9, 47, 80, 41, 65, 88, -92, 302, -15, -27, -67, -153, -190, -174, 28, 170, 65, 224, 82, -90, 34, -249, -209, 109, -68, 150, -5, -107, -49, 291, 71, 127, 3, 99, -34, -27, 64, -32, -115, -2, 53, -7, + 1, 187, 120, -186, 13, -116, 212, 128, 17, -66, -66, 100, 60, 159, -133, 248, 305, -76, 297, 5, 159, 100, -46, 55, 239, -22, -149, 138, 50, 2, -12, -25, 15, 136, -80, 45, 38, 61, -92, 109, 31, -23, 52, -261, -205, 56, -119, 74, -147, -207, -191, 19, -144, 119, 87, -185, -42, 64, 12, 81, -57, 84, 109, -166, 46, 43, -131, 66, 9, -158, 107, 98, -57, 107, 13, 86, 83, 26, -59, -24, -182, -64, -92, 84, 97, 28, -289, 44, 119, -76, 200, -177, -221, 4, -67, 57, + -158, 272, -16, -109, 27, -10, 161, -24, -96, -21, -65, -104, -112, 35, -201, 2, 5, 38, 124, 14, 75, 124, -92, -630, -30, -94, 410, -10, 6, 72, -80, 197, 33, -251, -145, -291, 27, -38, -114, -97, -121, -82, 313, -173, -98, -106, -277, -29, -85, 69, 104, -60, -24, 56, -101, -40, -56, -110, 79, 188, -48, -52, 139, -234, 116, -190, -372, -238, -370, -70, -222, -150, 11, 120, 44, 81, -77, 102, -174, -51, 98, -18, 146, -90, 25, -140, -122, 73, -242, 38, 126, -224, -13, -72, -126, -149, + -144, -55, -60, 11, 392, 4, -216, -209, -70, -152, -56, -115, 33, 19, -169, -102, -186, 358, 156, 32, -16, 193, -285, -6, -1, -186, -239, 217, 11, 154, -238, -110, -78, 82, -1, 101, -161, 48, 78, -187, -167, -164, 49, -57, -38, 150, -34, 12, 15, -36, -161, -112, -6, -268, -156, -144, 90, 45, 123, -32, 65, -9, -7, 116, -74, 207, 53, 59, -3, -75, 112, 62, 196, -49, 54, 99, -14, 11, -145, 84, -89, 109, 452, 428, 317, -119, 111, 156, 88, 84, -171, -151, -221, 180, -208, -34, + -154, 241, -287, -217, -113, -55, -162, -240, 57, 2, 4, -289, -163, 63, 49, 69, -85, -121, 0, 74, 98, -89, 93, -159, -49, -374, 123, 33, -72, -80, -277, -133, 24, -76, -386, 191, 74, -12, -112, -91, -170, 37, -67, 96, -35, -66, -225, -54, -34, -130, 223, -183, -10, 126, -71, -192, -115, 132, 182, 79, -26, -22, 70, 558, 187, -82, -66, 196, -378, -72, 305, 153, -214, -5, -146, 59, 233, 577, 189, 450, -161, -33, -440, 149, -130, 124, -194, -10, 16, -68, 154, -70, 72, 194, -151, 88, + 243, -67, 79, 1, 95, 136, 135, -742, 267, -85, -352, -60, 207, 65, -274, 145, 206, -437, 29, -123, 251, 59, 206, -52, -160, -307, 11, -186, 571, 106, -105, 192, 14, 185, -466, -63, 55, 134, 18, -202, -45, 59, 175, 105, -672, -736, -259, -66, 4, 145, -320, 89, 356, -219, 185, 244, -187, -4, -96, 301, 422, -216, -254, 208, 11, -217, 88, -5, 44, 53, -122, -90, -473, -33, -143, -20, -25, 305, 82, -573, -2, 263, -320, 72, 320, -82, 105, -3, -99, -224, 413, 349, -286, 133, -115, -24, + 119, -105, 97, -180, -34, 349, -117, 64, 154, -135, -313, -26, 84, 39, -161, 3, 57, 108, 232, 133, 247, 99, 3, 128, -74, 180, -692, 817, -25, 533, 61, -276, -67, -151, -187, -6, 36, 392, -37, 276, -234, 7, 86, 80, 52, 343, 344, 138, 74, -20, -40, 2, -30, -516, -160, 268, 183, -39, 51, -233, 152, -291, 92, 516, 78, 128, -388, 240, 216, 73, -252, -100, -105, 43, -224, 273, 333, 207, -4, 484, 188, 699, 289, -162, 588, 32, -183, 428, -44, 153, 280, -171, -139, 392, 423, 249, + -305, 117, 15, -130, -205, 211, 242, 48, 193, -365, 527, -128, -318, 131, 238, -203, -97, -449, 212, -151, -41, -409, -174, -124, -59, -172, 116, -64, -92, 125, 156, 275, 259, -81, -76, -321, 149, 33, 241, 90, 73, -51, 103, -188, -172, 131, 64, 134, -412, 173, 288, 31, -361, -356, -292, -862, 137, -68, 445, -176, 371, 154, 35, 504, 81, -13, 344, 165, -446, -183, 64, -100, -249, -110, 599, 320, -260, 18, -136, -12, 95, 388, 22, -54, 430, -64, -298, 245, -346, -70, -76, -26, -3, 1002, 184, 380, + -151, 335, 655, -519, 843, 507, -195, 29, 74, -273, -470, 56, -262, -420, -173, 61, 26, -32, -173, -11, -167, 8, -197, 5, 180, -325, 218, 314, -200, -189, 179, 136, 9, 902, 107, 608, -391, -18, -480, -352, 122, -353, -485, -321, -360, -61, -71, -411, -438, 642, 133, 64, -46, 346, 217, 414, 2, 393, -160, 112, -617, 576, 307, 80, -305, 26, 185, 56, 13, 63, 440, -231, -196, 496, -486, -378, -122, -308, -81, -570, 82, -364, 214, 0, 47, 270, 48, 180, 256, 246, 191, 359, 5, 233, 198, -323, + 455, 86, 187, -303, 344, 139, 228, 33, 52, -86, -404, 55, 155, 202, 213, 19, -484, -312, 263, 133, 20, -203, 164, -197, -491, 601, 336, 246, -304, -163, -385, -1055, -93, -185, 66, -282, -322, -495, 8, 93, 490, -500, 99, -52, 172, -427, -532, -351, 149, -28, -785, 501, 533, -218, 460, 177, -657, -92, 942, -99, -568, -65, -22, -495, 403, 104, -227, 423, 300, 962, 586, 41, 108, 909, -187, 249, -320, -494, -114, -328, 121, -2, 220, -4, -20, -127, 740, 56, -504, -413, -53, -92, 27, 248, 682, 425, + 183, -366, 543, 921, -140, 428, 436, 1105, 260, 223, 384, 478, 313, -359, -300, 264, -606, -389, -416, 468, 462, 290, -40, 344, 755, -327, 538, 504, -81, 493, -254, 7, 192, 636, 1124, 132, -106, 132, -51, -169, 41, 132, -265, -346, 129, -171, -97, 301, -10, 576, -290, 566, 271, 74, -316, 125, 546, 180, -277, 131, -67, 39, 318, -418, -237, 521, 7, -95, 425, 7, 146, 127, -419, -720, -168, 292, 470, 137, -381, 514, -171, 1009, -509, 693, -401, 272, 543, -792, -880, 34, -267, 263, 246, 82, -158, -465, + 307, -30, 571, 319, 518, 195, 263, -103, 357, 176, -267, 68, -72, -678, 688, 901, -244, -74, 292, 1206, -5, -774, -334, 112, 102, -270, 197, -205, 345, -661, -8, 351, -302, -318, 13, -654, -232, -238, -1025, -866, -523, 325, 383, -111, -742, 42, -19, -62, 95, -388, 794, -277, 61, 893, -861, 355, 91, -321, 290, -258, -707, -24, 521, -294, -465, 199, 26, 505, -48, -880, 14, -537, 771, -342, 69, 159, 41, -165, -598, 176, 499, 112, 506, -890, -524, -195, -89, 14, -666, 307, -10, -652, -344, -638, 954, 35, + -1619, 659, -218, 136, 170, 228, 403, 156, -291, -59, 404, 284, -321, -4, -256, -119, -799, -87, 383, 493, 105, -173, 526, -527, 598, -329, -199, 91, -192, 180, -486, -628, -733, -211, 368, -123, -6, 466, 112, 102, -25, 41, -165, 33, 462, 321, 487, 456, 488, 374, -319, -160, 104, 1, -600, 423, -128, -511, 661, 29, 83, 19, -282, -44, 254, 453, 308, 65, 148, -618, -121, -284, 226, 148, -179, -252, -179, -237, 2218, -2163, -101, -2354, -358, -890, -102, 585, -285, -645, 1038, -270, -171, 43, 326, -27, 865, 577, + 349, -495, 43, -334, -341, -223, 23, -95, -84, -272, -52, 487, 70, 328, 325, -9, 431, 626, 47, -107, -302, -360, 168, 187, -297, 538, -662, -664, 97, -214, 392, -609, 299, -1197, -627, -948, -54, -446, -8, -253, -329, -273, 17, 139, -908, 174, -146, 186, 82, -350, -659, 596, -328, 8, 563, 198, 96, 513, 486, -169, 1842, 951, 486, -381, -175, -883, 255, 803, -98, -125, 1277, -167, -226, 661, 946, 209, 963, -176, 178, 595, 655, 1019, 824, 12, -308, 343, 392, 385, 452, 775, 390, 971, -320, 28, 303, 301, + 811, 503, 865, -551, -161, 383, -621, 572, 555, 557, 238, -605, -219, 1286, 335, 881, 707, 803, -146, 1048, 1582, 583, 141, 1143, 762, -389, -269, -502, -443, 494, 518, 67, -484, 21, -409, -51, -236, 91, -890, -277, 94, -596, 254, -715, 1171, 1665, 966, -473, -955, -383, 821, -290, -713, 1223, -893, 710, 413, -1043, -424, -156, -1652, 11, 181, -849, 1613, -616, 1499, -1188, 165, 7, 1098, 1548, -131, 477, 768, -971, 606, -1292, -327, 2220, -120, -723, -114, -1380, 68, -502, 1454, 446, 687, -327, -362, -830, -644, 49, 112, -122, + 980, -366, 204, -1135, -493, 513, -1459, -747, -425, -682, 1404, -88, 1499, 855, 464, 354, -305, -977, 531, -1201, -502, 549, 408, -1027, 1086, -1780, 1911, -39, 154, -602, 1545, 369, 998, 382, -642, 229, 557, -933, 665, 19, 443, -1248, -91, 315, 1163, -476, -948, -35, 1156, 614, -434, -985, -44, 836, 113, 63, 234, 608, 1527, -2145, -352, 212, 1197, 271, -651, -158, 455, 1096, -111, 55, -2061, 597, 319, 561, -1501, 1321, 1134, 426, -685, -73, -758, 553, 962, 400, 440, -96, 720, -1093, 999, -323, -395, 1168, 945, 34, -398, -1007, + 665, 581, -1886, -213, 622, 81, -1557, 819, 189, 537, 637, 912, 347, 321, -378, 491, 120, 1076, -82, -265, 848, 667, -100, 99, -311, 57, 293, -34, -172, 511, -334, 96, 662, -87, 396, -589, -96, 136, -229, -50, 107, 510, -83, -711, 63, 1580, 349, -770, 280, -785, -543, -376, -85, 1031, -73, -714, 1606, -1640, 322, 1804, 218, 1289, -899, -1671, 596, 131, 1421, 148, -746, 723, -138, -64, -292, 29, -439, 328, 113, 439, -510, -373, -91, 536, 827, 539, -446, -3388, -7591, -3101, -4629, -6713, 3383, 826, 1887, 9196, 7059, 4051, + 7547, 5586, 841, 1748, 1442, -3790, -3252, -1673, -5707, -5478, -2173, -2886, -3998, -1762, -1514, -4075, -3403, -411, -1988, -3328, -1213, 878, -2433, 562, 3345, -392, -592, 4567, 3653, -281, 5386, 6225, 2494, 5847, 8290, 4892, 4280, 9953, 7969, 5951, 7114, 9410, 3371, 1294, 3969, -3148, -8925, -6482, -9829, -16002, -14260, -15174, -17577, -17908, -15264, -13164, -12990, -8846, -3324, -1936, 513, 5689, 9683, 8921, 12251, 16646, 13541 } + }, + { + {-4, -2, 9, -203, 36, -6, 6, -125, 37, -223, -120, 56, -48, 71, 118, -72, 83, -113, -12, 102, -31, 63, -173, 21, -1, 51, -41, 60, -86, -47, 60, -149, 44, 42, -48, -81, 214, -50, 57, -86, -30, 28, -178, -115, -95, -68, -86, -88, -2, 4, -84, 29, 6, 84, -70, -34, -8, 36, -43, -121, 130, 99, 56, -39, 52, 11, 81, -100, -189, -158, 17, -93, 62, 134, 28, -265, 151, -203, 20, -88, -31, 74, -128, -228, -62, 15, -133, -77, 104, -68, 46, -284, -29, 187, 96, -317, + -113, -85, -89, 103, -51, -166, -108, -119, -124, 204, 59, 131, -92, 173, 153, 111, -69, -150, -123, 11, 24, 237, 78, 44, -118, 25, 4, 27, 88, 55, -168, -138, -78, 87, 13, -30, -180, -52, 61, 79, -77, -25, -3, 85, -25, -89, -7, 15, -122, 245, 6, -154, -9, -4, -170, -154, 179, 164, -129, 100, 12, 52, -429, 169, -61, -293, -381, 12, 281, 18, 183, 8, -344, -119, 43, 123, -58, -29, -143, 20, -23, 246, 129, 53, 48, 67, 89, 224, 140, -197, -12, 46, 52, -235, 81, -70, + -144, -42, -1, 161, 46, -90, 168, 254, -49, -97, 67, -19, 144, 141, 116, -171, -124, 120, -46, -44, -124, 12, -188, 113, 110, 134, 41, 152, -161, -105, 214, 12, 71, 206, 28, 33, 217, 17, 82, -187, -160, 87, -47, -70, -89, -83, 63, -216, -126, -266, -321, -61, 260, 168, -110, -32, -41, -63, -233, 163, -61, -60, 10, 106, -56, 8, -12, 154, -149, 155, 80, 186, -69, 144, 59, -91, 125, -90, 70, 138, -111, 145, -93, -71, -29, -44, 67, -43, -118, 44, -104, 21, 5, 15, 211, 43, + -60, 1, -100, -126, 55, -31, 199, 213, 74, -61, -44, -6, -95, -76, 75, 143, -31, -9, 421, -175, 174, -211, -177, 3, -47, -43, 61, -88, 184, 179, 154, -43, -17, -77, -190, 32, -113, -19, 24, -63, 113, 44, -10, -317, -130, -199, 11, -129, -199, -86, -108, -121, 205, -159, 146, 15, -53, 82, 73, -141, -35, 6, 160, -12, -207, -266, -275, 76, -97, 10, -16, 45, 102, 160, -101, -52, 59, 59, 28, 201, -101, 127, -216, 448, 64, -39, 96, 52, 95, -100, -7, 43, 8, 12, -125, -71, + -199, 35, 44, 19, -27, -117, 79, 64, -179, 223, -265, 340, -27, 117, 55, -2, -30, 74, 319, 356, -62, 68, -37, -45, 52, 79, 247, -26, 79, -118, 138, 33, 196, 96, 184, -253, 114, 97, -75, 1, 199, 4, 20, 62, 123, -37, -12, 375, 182, 35, 39, -76, 174, -224, -326, -399, -21, 211, -3, 105, 287, 112, -48, -101, 154, -32, 366, 160, 53, 44, -195, 29, 126, -70, -196, 30, 62, -3, -85, -468, 71, -18, 353, -232, 166, -498, 223, -30, -243, -271, -182, 172, 141, 409, 72, 148, + 395, -47, -251, 58, -189, 69, 327, 74, -64, -19, -36, 107, 141, -8, 102, 175, -75, 67, -161, 3, -207, -19, 57, -92, 196, 134, 172, 307, 45, 368, 296, 148, -154, 420, 202, 89, 383, -20, 39, 48, 149, -54, -69, -221, -198, -170, 39, -129, 349, -162, 170, 218, -64, 43, -35, -18, -206, -248, 237, -35, -5, 412, 20, 9, -33, -76, 79, 21, -202, -263, -355, -186, -372, -237, -122, -277, -170, -119, -138, -375, 267, 165, 18, 139, 72, -103, 479, 31, -153, -83, -308, -135, 360, 19, -282, -291, + 55, -295, 108, 106, -218, 12, 86, 19, 359, 106, -141, 38, -171, 177, 43, 80, -402, 294, -124, 126, 32, 62, 92, 17, -97, -2, -137, 9, -302, 9, -325, 485, -42, 314, -173, -76, 4, -174, -43, 193, 61, 84, 257, -213, -6, 150, -406, -4, -179, -143, 279, -467, -443, 111, 578, 12, 50, 42, -95, 316, 304, 176, 81, -87, -482, 279, -5, -383, -130, 86, -27, 1, 30, -94, -383, -23, 6, -71, -166, 110, 314, -421, 250, -159, -90, 23, 194, 678, -452, -113, 30, -46, -95, 20, -184, 56, + -169, 465, 143, 84, 110, -103, -47, 242, -61, 102, -231, 352, -11, -264, 470, -330, 194, 41, 75, 300, -186, 77, -67, -42, -47, 502, 44, 134, 152, -79, -282, -220, 39, 502, 287, 66, -440, 68, -240, 6, 503, 483, 247, 328, -287, -601, -311, -432, 248, 0, -68, 3, -324, -94, 108, -58, -119, -118, 360, -19, 103, -96, 239, 53, -126, -276, -208, 643, -19, -140, 212, -360, 123, -204, -629, -139, -73, 198, 85, 175, 65, 258, 21, 23, 152, -617, -85, -162, -31, 67, 374, 403, 158, -95, -251, -336, + -87, -177, 48, -52, -96, -106, 311, -707, -458, -96, -158, 382, 266, -47, 648, -628, -136, -228, 691, 339, -209, 264, 108, -249, 481, -501, 269, -223, 54, 71, -159, 467, -304, 293, -118, -649, -96, 480, -267, -437, 20, -40, -665, -110, 287, 134, 377, 285, -61, 672, -141, -181, -305, -278, -273, 200, 260, -188, -220, 101, -188, 298, -57, 174, -92, -143, -110, 25, -363, 135, 300, -32, 145, 202, 224, 388, -218, 154, 301, 7, -492, -433, 165, -29, -60, 560, -283, -779, 47, 630, 792, 184, -233, -163, 121, -90, + -74, 373, 378, -119, 366, -363, -5, 339, -98, 402, 214, -4, -445, 234, -68, -70, 72, 10, -5, 720, -283, 391, 625, 449, 260, 57, -331, 432, -162, 415, -153, 136, -347, -24, -324, -194, 113, -296, -40, -65, 45, 375, -308, -256, -52, -118, -8, -247, -336, -438, 126, 472, 52, -170, 129, 174, 409, -243, -88, 8, 121, 350, 146, 157, -65, 121, 393, 586, -1393, -669, 445, -1140, -796, -64, -475, -328, 328, 381, 104, -84, 126, 1113, -155, 169, 415, 482, -531, -277, -261, 405, 435, 218, 64, 415, -145, -223, + 278, 565, 20, 176, 562, 422, 329, -271, 88, 169, -25, -18, 351, -131, -31, -46, 225, 1, -436, -282, 55, -565, 394, -132, 904, 29, 481, 93, -54, -309, -48, 111, -428, -212, -497, -68, 198, 310, -181, -760, 222, -123, 181, -279, -345, 177, -547, -249, 574, -240, -631, 292, -322, 156, 8, -308, 612, -782, -16, -947, 40, 791, 1104, 529, -169, 517, -20, -55, 73, -70, 287, -18, -489, 45, -687, 265, -198, -141, 496, 7, -521, -590, 164, 102, -278, -234, 481, -640, 23, -113, 260, -156, -113, -505, -193, -210, + -65, 403, -416, 187, -18, -51, 99, 193, -720, -50, 150, -34, 333, -203, -280, -112, -792, -329, -301, 75, 445, 609, -152, 460, -527, 1058, 266, -40, 553, -296, 698, 38, -501, -13, -77, 323, 213, -307, 351, 4, -788, -859, -83, -260, 212, -39, -303, -774, -674, 365, -574, -131, 36, 179, 42, 548, 46, -281, 369, -52, 54, 338, -449, -32, 97, -461, 278, 378, 166, 336, 178, 522, 144, 379, -535, -170, -85, -722, -3, -81, 302, -51, 347, -61, -418, -288, -21, -669, 292, 15, -129, 385, 247, 318, 337, 96, + -40, 273, -893, 257, 102, 359, -128, -537, 298, -187, 301, -902, 487, 452, 1630, 1234, 174, 364, 111, 950, 34, 467, -420, 1123, -434, 1019, -38, 654, -68, 464, -446, 117, 235, -241, -74, -126, -98, 309, 14, -253, -352, -534, -681, -324, -110, 11, 222, -573, 251, -313, -487, -97, -355, 170, -84, -749, -176, -379, -451, -473, 436, 583, -1211, 278, 108, 343, 120, -151, 731, 413, 380, -1013, -459, -15, 242, 837, 22, -120, 27, 702, 614, -614, 634, 33, 122, -123, 294, -810, -330, 697, 392, -229, 334, 551, -736, 160, + -444, 1086, -729, 591, 537, -277, -1118, -669, -127, -333, -89, -537, -832, -1079, -649, -735, 237, -636, 184, 21, -128, -110, -544, -198, -558, 97, 379, 531, -54, -212, -575, -170, -16, -352, 18, -467, -342, -109, -485, 278, -439, -1131, -34, -84, -434, 410, 282, 473, 120, 360, 751, 85, -919, -247, 298, -243, -790, 322, 444, 116, -117, -1007, 704, -129, 527, -605, 525, 1376, -348, -109, -991, 143, -691, -1310, 471, -1724, 1171, 435, -281, 1252, -102, -602, 1106, -395, -45, 256, 395, 1033, 54, -55, 722, 330, 607, 760, 551, 79, + 387, 90, -32, -370, 261, 415, 96, 9, -430, 240, -404, 520, 480, 117, 566, -316, 371, 624, 370, -760, -862, 1039, -108, 664, 961, 59, -15, -65, 173, 600, 514, 92, 419, 36, -537, -597, -970, 50, -419, 46, 488, 529, -930, 101, 281, -744, 51, 1053, -535, -464, 403, -654, 141, -98, 663, -9, 98, -638, 106, -734, 1421, 329, -807, 269, -212, -716, -846, -850, 211, -65, 693, 1056, 483, 239, -167, 337, -3, -1381, 558, 1392, -964, -992, -879, -1207, 817, -1188, 484, -11, -189, -26, -424, -470, 535, -1220, 1191, 694, + 117, -807, -647, -539, 61, 192, -563, -85, -431, 837, 332, -167, -82, 337, 21, 386, -756, -290, -129, -138, -711, -471, 316, -1250, -800, 75, 1362, 673, -519, -65, -1141, 477, 1419, 78, -416, -351, -803, 752, -24, -702, -491, -1378, 271, -1024, -1512, 321, 801, 173, 199, -661, -808, -236, -1186, -606, 286, -1009, 1521, 266, -395, 297, -753, -1494, -503, -1151, 164, 289, -420, -830, -412, -527, 418, -621, -220, -115, 653, -517, -91, -264, 166, 234, 50, -239, 680, 845, 572, -499, -366, -1351, -718, -344, 359, 2153, -359, -20, 998, -134, + 441, -545, -489, -466, 500, -1286, 52, -209, 33, 1028, -407, 1563, 191, 1140, -1331, -439, 417, -144, -76, -278, 1426, -100, -1367, 622, 967, -736, -612, -220, -671, -798, 185, 214, 581, 10, 504, 925, 956, 636, 198, -736, 42, 360, 468, 750, -23, -411, -608, -232, 742, -332, 270, 659, 30, 1308, 115, -859, 690, 707, 166, 296, 626, 92, 11, -791, 1627, -1801, -1361, -1539, -555, 296, -950, 440, 942, -318, 38, 858, 217, -980, -399, -765, -178, 24, -30, 817, 753, -232, -305, 489, 1179, 169, 909, -924, 755, -481, 200, -300, + -686, -566, 25, -415, -739, -1510, -1520, -1094, 252, 2892, 747, -372, -845, -2049, -2894, 683, 1228, 1474, -284, 151, -833, -1460, 449, 297, 504, 97, -1227, -353, 326, -222, -29, -207, 1645, 1456, 982, -57, -676, -1152, -763, -676, 1132, -150, 834, 403, 402, -463, -2678, -1820, 938, -1424, -478, 3152, 2163, 1650, -1198, 924, -822, 107, 85, 499, 1345, 2377, -866, -30, -1508, -1183, -2006, 281, -55, -2128, -490, 1472, 557, 1032, 1337, 2363, -1561, -715, 366, -1100, 685, -1177, -3839, -3575, -2063, -2242, -578, 3653, 1844, 3759, 3332, 5237, 3731, 3207, 496, -1424, + -3194, -5101, -4339, -4368, -2296, -1112, -279, 16, 102, 878, 1176, 3004, 1813, 3548, 2302, 3042, 1086, 2939, 1005, 706, 678, -193, -851, -2017, -2329, -4301, -2956, -5446, -4318, -6605, -3927, -3110, -764, 1804, 948, 155, 1794, 3862, 5157, 6775, 8068, 6912, 5043, 6296, 5192, 2926, 1324, -293, -2139, -4970, -5918, -7911, -10178, -11661, -10431, -8994, -6449, -4373, 945, 3924, 5845, 9063, 7817, 8959 }, + {136, -53, 80, -208, -19, -79, 100, 19, -85, 129, -112, -27, 103, -39, 45, -172, -30, -21, -180, 24, 3, -5, 51, -90, 22, -32, -11, 190, -20, -129, -62, 14, 45, -124, 33, -94, -2, -35, -57, 105, 101, -71, 134, 137, -169, -27, -18, -157, -68, -109, -125, 29, 30, -14, 14, 61, 64, -34, 20, 60, 160, 94, 71, -79, 6, -42, 99, -110, -83, 90, -53, 97, -101, -33, -26, -371, 131, -213, 107, -123, -246, -422, 68, 7, 99, 87, -34, -35, 26, 247, -184, -323, 100, -136, -219, -1, + -37, 128, 42, 90, -102, -28, -68, 211, -64, -90, -82, -41, -57, -89, -82, -56, 37, 15, 23, 5, 51, 89, 41, -83, -247, -4, -173, 23, -16, -78, 104, 7, -4, -242, -103, 33, -23, 85, 3, 77, -72, 34, -32, 153, -53, 84, -132, -124, -161, 16, -35, -35, 15, -38, -264, -56, -36, -77, -35, -92, 85, -38, -32, -10, 1, -8, -64, 229, 148, 239, -114, 238, -143, -104, 94, 264, -6, -166, -239, -176, -33, 186, 75, 60, 85, -89, 131, 11, 98, -53, -217, 54, -150, -109, -104, -31, + -275, -19, 15, -122, 261, -56, -81, -111, 0, 21, -108, -3, -133, -59, 7, -64, 190, -2, -46, 96, 72, 165, 75, 199, 57, 161, -186, 42, 154, -55, -126, -170, 13, -37, -10, 45, 298, -133, -102, 31, -65, -48, 150, -114, 145, 67, 5, 75, -94, -90, -167, -180, 240, 114, 86, 129, -82, -54, -60, 303, -115, 332, -10, -83, -78, -173, -187, -227, -13, -56, 43, 222, -18, -102, -307, 12, 245, 360, -167, 94, 67, -90, -80, 95, 340, -80, 54, -28, -50, -31, 163, 236, -179, -96, 72, 309, + 50, 219, -181, -165, -12, -28, 59, 45, -8, 17, 26, -83, 19, 85, 69, -50, 155, -19, 477, -345, -84, -149, 28, 120, 224, -244, 150, -71, -258, -411, -93, -180, 18, -48, -180, -97, 82, 89, 302, 164, 148, 6, 38, -173, -122, 241, 181, 120, 49, 110, 14, -9, -222, -308, 186, -90, -213, -106, -139, 95, -124, 241, 45, -157, -85, -123, -111, 111, 171, -28, 110, -105, -119, -13, 8, -112, -56, 131, -17, -76, -92, 63, 68, -29, 84, -5, -99, 225, -63, 2, -33, -289, 68, 21, 57, -46, + -320, 98, 16, -86, -169, 89, -161, -19, 314, 468, 237, 263, -6, -114, 201, 181, 84, 103, 237, -20, 176, 171, 246, 236, -170, 162, 1, 65, -157, 65, -10, 165, -46, -30, -107, 124, -173, -139, 28, 174, 101, -83, -37, -16, -51, 110, -211, 220, 13, 271, -351, 40, -315, -89, -91, 104, -20, -60, 86, 43, 103, 158, 247, -13, -173, 57, 329, 81, -74, -3, 205, -78, 127, -62, -251, 204, 160, 140, 5, -504, 5, -115, 43, -284, 31, 42, 369, -302, 1, -403, 88, -246, -61, 10, -133, 110, + 49, -214, 2, -9, 191, -132, 310, -10, -271, -144, 330, -39, 131, 81, -55, 190, -220, -215, -162, 15, -210, 215, -123, 135, -203, -11, -247, 153, 22, 185, 174, -174, 327, 268, 263, 41, 277, 216, -234, 189, 96, 6, -216, 88, -184, 170, -79, -159, -17, 259, 97, -327, 293, -40, -96, -185, 270, 203, -161, 114, 31, 722, 130, -20, -237, -454, 127, -59, -670, 605, -279, -422, 100, -19, 90, -19, 125, 180, 12, -2, -337, -20, -23, 418, -65, 20, 161, -63, -40, -157, 360, -253, 264, -53, -198, 49, + -222, -109, -368, 77, 188, -93, -176, -140, 244, -345, -70, -165, 10, -40, 62, -298, 318, -410, -271, 127, 69, -3, 132, -205, -294, 53, -64, 1, 179, -172, 166, 116, 374, -74, 82, -3, 40, 489, 72, 425, -36, -163, -19, -539, -84, -122, -440, -747, 211, 365, -283, -144, 200, -94, 441, -66, -258, -161, -696, 215, 62, -78, -494, 97, -281, -86, -249, -136, 326, -343, 126, -500, 295, 45, -9, -156, 22, -80, -285, -527, 84, -17, 94, 196, -139, -59, -343, -187, -103, 120, 78, 222, 370, 281, 139, 209, + 53, 218, 199, -233, 229, 255, -76, 349, -58, 412, -215, -501, -100, 270, 303, 342, -104, -678, -104, -72, -49, -64, -138, 10, -443, 701, -154, -167, 234, 378, -27, 177, 436, 317, -718, -658, 4, -62, 95, -293, -525, 126, 417, 279, -306, 496, 396, 377, -632, 181, 326, 20, 46, 283, 643, -122, -301, 199, 141, -85, 344, 526, 91, 545, 230, -404, 38, 452, -56, -181, 224, 40, 79, 474, 293, 163, 45, -545, -570, -44, 76, 148, -185, -22, -158, 51, 55, -207, 63, -127, -50, -177, 1, 341, -222, -486, + -95, -389, 27, -153, -48, -73, 130, -1215, -775, -267, 167, -118, -337, 6, -330, 773, -377, 478, 764, 391, 353, -364, 242, -205, -420, 278, 337, 203, 500, -47, -73, -291, -292, -262, -385, -382, -272, 75, 0, -56, -259, -170, -375, 83, -330, -313, -162, 83, -48, -230, -525, 1, -189, 116, -612, -496, 447, -135, -144, -290, -190, 309, 71, -140, 153, -120, 160, 101, 189, -242, -339, -790, -6, -771, -108, -662, -149, 449, -140, -9, -426, -225, -273, -50, -268, 817, 26, -571, -485, 519, 405, -360, -353, 693, 438, 40, + -396, 65, -164, 338, -245, 56, -102, -55, 703, -80, -189, 150, 120, 230, 216, 45, -278, 232, 103, 263, 538, 272, -785, -199, -134, -572, 224, -78, 3, -307, 271, -102, 42, -405, 279, -324, 13, 376, -74, 396, -307, 488, -609, 323, -18, -181, 738, 235, -191, -427, 163, -65, 22, -42, 234, 443, 508, -333, 185, -115, 406, 203, -37, -52, 80, 21, -321, 64, -1169, -755, 633, -459, -432, 247, 555, -906, -150, 222, 60, -470, -711, 1344, -576, 188, -655, 369, -228, 633, 556, 64, 98, -735, -2, 361, -302, -433, + 351, 110, 378, 313, -65, 138, -86, -35, 558, -463, -283, 463, -21, -345, 472, 1, -108, -305, -145, 193, -255, -10, 164, -300, -331, -192, 238, -671, 327, -9, 654, -594, 202, -444, 171, -255, -362, 625, -328, -112, -312, 292, -354, 230, -103, 407, 340, -80, 565, 262, -688, 202, 690, -87, -23, 306, -239, 477, 428, -623, -393, -135, 290, 547, 75, 279, 618, 458, -706, -98, 1051, 241, -100, -153, -232, -343, 65, 238, 264, 247, -224, -487, 91, -267, 219, 717, -233, -777, 859, -300, -530, 694, -169, -248, -816, -172, + 278, 119, -213, -364, 253, -6, -410, 268, -126, 664, -578, 28, -164, 760, 208, -1208, 286, -544, -286, -481, 400, 1535, 471, -10, 246, 319, -676, -298, -233, -433, 47, -253, -874, -373, 58, -357, -1100, 950, -184, 427, 80, -506, -866, -837, 935, 567, 215, -333, -626, -472, -743, -195, 278, -119, 62, 115, -121, -389, -369, -636, -225, -126, 312, 212, 344, -174, -281, -124, 450, 58, 399, -1327, -307, -8, 294, -428, -13, -495, 388, 329, 70, 1626, 32, 502, 679, 20, 225, 0, -109, -207, 347, 485, 659, -29, -113, 29, + 435, 370, 22, 283, 258, 165, -31, 529, -81, 623, -581, -372, 661, -73, 69, 204, -806, 77, 164, 575, 857, -652, 196, -396, 623, 567, 109, 1050, 358, 443, -325, -19, -602, 1050, -544, 198, 661, -107, -354, 351, -48, 197, 706, 57, -167, -22, 167, 18, -350, 330, 6, -73, 1176, -832, 862, 567, 1064, 454, -679, 596, 54, 557, 1389, -935, -361, -89, 68, 951, -502, 82, -543, 80, 1069, -84, 1108, 333, 219, 516, -621, -82, 500, 683, -1014, -17, -780, 373, -372, 128, -20, 176, -203, -673, 165, -1164, -1031, -1, + -7, -658, 499, 136, -198, -610, 787, -202, 1181, -189, 234, 423, -614, -207, 156, -711, -423, -622, 496, -499, -164, -169, 423, -421, -730, -980, -62, 804, 13, -452, -226, -570, -227, 1, 300, -640, -110, -141, -494, -627, -12, 104, 362, 139, 652, 195, 834, -365, 679, -183, -612, -145, 1130, -505, 488, -369, 813, -453, 238, 554, -90, -218, 49, -298, 670, -651, -299, 527, -14, -391, -42, 274, -42, -1053, 1232, -362, 1054, -176, 854, 107, -222, -522, -362, -35, 46, 641, -196, -6, 205, -506, 917, 373, 66, -685, 532, 307, + -549, 613, 82, -43, 175, 30, 778, -122, -906, 1063, -491, -31, 786, -280, -133, -396, 1223, -478, -115, -687, -111, 150, 1096, -437, 234, 401, 666, -102, -641, 803, 482, 667, -256, -70, 113, 737, -329, -695, -826, 545, -565, 244, 695, 696, -366, -40, 911, -1238, 70, 245, 415, -30, -341, 65, 618, -155, 435, -212, -245, -1516, 542, 319, 1390, 1222, -159, -423, -1393, 62, 491, -583, 480, 847, 822, -351, 986, 887, 59, -501, -542, 905, 773, -1053, -1447, 1967, 118, -116, 273, 166, 738, 739, -273, -224, 1030, 504, -166, -654, + 424, 102, 69, 382, 65, -11, -391, 247, -108, -476, 922, -1432, 1023, 859, -1365, -78, 708, 193, 805, -170, 119, 746, -92, 387, -676, -1063, 3020, -1223, -1725, -361, 3243, 1373, -1416, -372, 570, 378, -109, -1153, 170, -649, -430, 708, 1257, 44, 2122, -1011, -425, 1217, 8, -116, -704, -1338, 1020, -716, -791, 519, -873, 367, -832, -894, -203, 153, 62, -235, 971, 226, 568, 272, -43, -11, -526, -1014, 255, 964, -868, 668, -884, -104, -107, -1286, 842, -453, 290, 16, -436, 16, -980, 942, -727, 319, -1130, -642, -1462, 545, -713, -716, + -650, -277, -51, 1531, 488, 789, -244, -635, -910, 312, 47, -1394, -661, -2362, -1114, -631, -63, -502, -481, -472, 226, -369, -1542, 352, 526, -1333, 719, 141, -403, 76, -395, -39, 264, 387, 655, -796, 52, 924, -129, -433, 799, -356, 27, -481, -232, -968, 220, 38, 516, -370, 1, 705, -367, 32, 665, -1370, 44, -1571, -557, -1042, 802, 332, -117, 390, -371, 426, 1022, 330, 1618, -896, -1144, 1037, 199, -680, -759, -228, 543, -543, -107, -459, -755, 452, 396, -931, -678, 923, -118, 369, -290, 524, 94, 884, -576, -271, 127, 118, + -321, -694, -421, -731, -1019, -2077, -1030, -384, 932, 1208, -2270, 409, -891, -1225, -237, 1445, 932, 794, -476, -537, -641, 736, 527, 1128, 163, -1434, -549, 1102, -149, 333, 993, -452, -655, -1044, -1040, 20, 710, 1504, 1124, 745, 320, -1514, -1606, 581, -1101, 278, 1453, 582, 118, -709, -1274, -209, -537, 448, 361, 257, 920, -127, -151, 250, 675, 1070, 1117, 386, 999, 343, 376, -199, -1067, -412, -446, -875, 696, 641, 476, 424, -172, -899, 273, 435, 650, -1839, -3704, -1911, 360, 1450, 3530, 3456, 1439, 1472, 1055, 61, -1757, -2972, -4484, -1334, + -1877, -322, 1829, 3268, 2742, 2429, 1334, -25, -858, -1141, -248, -1979, -1580, -1491, -985, -799, -378, -63, 678, 1616, 1651, 1636, 1187, 1560, 817, 896, -298, -58, -742, -1913, -2792, -3353, -1639, -647, 512, -78, 343, 793, 1010, 2195, 2503, 3344, 2109, 226, 953, -490, -1861, -1598, -3233, -3732, -2819, -1702, -750, -542, 1324, 1552, 3938, 3046, 2039, 1963, 471, -1070, -1861, -2120 } + }, + { + {298, -57, 89, -10, 116, 144, 100, 183, -113, 197, -67, 26, -184, 8, -192, 41, 33, 16, 5, 71, -103, -121, 99, -9, 75, 45, -18, -83, 15, 151, 92, 49, 58, 45, 16, 55, -13, 7, -13, 172, -36, 89, -65, 76, 201, -53, 188, 29, -81, 57, 83, -27, -34, 6, 142, -45, 44, -26, 89, 39, 122, -40, -11, 49, -52, -100, 16, -31, -16, -37, 75, 18, 43, -18, 93, 51, -140, -217, -158, 61, -25, -371, -212, -16, 52, -114, 38, -137, 25, -99, 258, -211, -95, -92, 164, 115, + 263, 71, 53, -120, 123, 17, 31, -13, 97, 139, 7, 139, 127, -61, 70, -75, -90, 13, -74, 47, -114, -197, 50, 75, -53, 60, -99, 94, 119, -207, 37, -7, 75, 73, 7, -203, -67, -86, 65, 4, 17, -60, 34, -100, 1, 125, 70, 17, -62, 47, -166, -79, -117, 34, 17, 15, -423, -9, 27, 11, 75, -147, 116, 67, -74, -251, 173, 176, -35, 147, 108, -137, 286, 63, -122, 155, 16, 145, 26, -241, 99, -42, -85, -91, -68, 164, 130, 14, 136, 51, -117, -148, -8, -32, 72, 49, + -113, 33, 69, 63, -98, -84, -132, -45, -27, 32, -26, 191, 88, -25, -86, 40, 87, 45, 210, -29, 111, -7, -56, -117, 97, -22, -45, 125, -23, 47, -11, -14, -103, 40, -26, 126, 145, -37, -81, -127, -291, -175, -64, 208, 26, 38, 128, 33, 55, -306, -280, -179, -47, -2, 129, -93, 101, -54, -188, 57, -27, -130, -2, 179, 263, 117, -120, 69, 9, 187, 0, -152, -4, -90, 188, 80, 89, 187, -31, 12, 255, 219, -6, -3, 20, -16, 71, 17, -181, -246, -82, -33, 5, -83, -267, -30, + 81, -150, -66, -98, -76, 28, 43, 90, -180, -149, 154, -55, -15, 34, -4, 86, -131, 384, -154, -123, -24, 2, -151, -4, -107, 182, -51, -236, -328, -87, -219, 293, 18, 206, 172, -287, -22, 114, 79, 146, 22, -23, -32, 66, -100, 103, 53, -105, 55, 0, 66, 158, -95, 60, -18, 88, 72, -37, 102, -35, 87, -77, 79, -232, -106, -87, 55, 194, -154, -100, -63, 8, -76, -92, -56, 76, 54, 110, -49, 61, -79, -75, -19, -47, 66, -5, -130, 56, -79, -113, -53, -64, 21, -110, -190, -11, + 57, 93, -49, 146, -251, 99, -154, -169, 226, 78, -285, 20, -7, 74, -208, -136, -26, -170, -302, -294, -196, -293, 114, -39, 35, 145, -258, 155, -79, 68, 42, -35, 17, -46, -45, -172, -106, 203, -87, -187, -171, -26, -82, 56, -164, -251, 28, 213, -43, 125, -87, 63, -130, 80, 28, -176, 232, 31, -61, 44, 211, 192, 97, -35, -260, -56, -219, 44, -59, 16, 18, 33, -186, -11, -33, 50, 114, -158, -11, -292, -281, -188, -308, -361, -346, 123, 134, -228, -74, -208, -330, 151, -100, -286, 75, -34, + -5, 12, 73, 15, -29, 55, 75, -171, -169, -55, -202, -28, -214, -351, -47, 189, -264, -201, 112, -142, -5, 38, -146, -115, -127, -376, -178, 65, -125, -133, -250, 90, 182, -86, 293, -186, -104, -13, -98, -277, -41, 50, -31, -67, -254, -49, 206, 105, 45, 109, 61, -68, 404, -142, -187, -146, -167, 59, 158, 499, 342, -5, 313, -15, 53, 69, -158, 289, 11, 256, 242, -178, 311, 17, -226, -370, 356, 183, 353, -278, 205, 122, -317, -303, -184, -75, 338, -304, 285, -12, -29, 219, 194, 278, 97, -127, + 128, 263, -149, 263, 373, 177, 226, 112, 62, 82, 7, -185, 72, 40, 11, 191, -126, 122, 109, -29, 320, -170, -123, -53, 273, -30, 223, 140, 147, 163, 15, -374, -72, -284, -168, 389, 204, -120, -3, -172, -120, -13, -429, 272, 261, 772, 30, 68, -39, -105, -51, 262, 237, 208, 299, 123, 472, 140, -189, 47, 411, 165, 40, 66, -214, -303, 194, -149, -301, -631, -12, 254, -22, 151, -222, -113, -85, 50, -72, -187, -96, -507, -136, -430, 33, -225, 170, -245, 91, -235, -87, -12, 3, 40, 44, -313, + 149, -44, 66, -162, 0, 256, 97, 352, 191, -103, -26, -68, -41, -78, -116, -1, 130, 97, 78, 85, -413, 248, 841, 309, -129, 420, -260, 296, 201, -382, 94, -483, 20, -158, -336, 195, 17, 152, 214, 262, 415, 179, -18, -95, -265, -487, 187, 205, 65, -163, 279, 45, 294, 178, -506, -186, 81, -371, 31, -17, -61, 123, 96, -79, 394, -210, 28, 224, -175, 158, -69, -221, 169, 9, -16, 231, 160, 20, -99, 467, 36, 268, 42, -129, -141, -368, -129, 174, 9, 151, -22, -270, 137, 106, -370, 124, + 216, -55, 219, -857, -280, 908, 257, 150, -129, -19, -132, 190, -285, 400, 233, 190, 197, -135, -6, -12, 135, 270, -392, -233, -120, 308, 118, 173, 191, -38, -278, 97, 31, 554, 442, 117, 338, 21, -150, 71, -36, -74, 222, 263, 225, 535, 268, 211, 244, -240, -386, -185, 191, -337, -157, 329, 362, 193, -147, 310, -111, 34, 86, 178, -79, -194, 124, -175, -534, 24, 190, -293, 50, -53, -69, -43, -160, 370, -19, 183, -396, -340, 430, 684, -1045, -160, 46, -22, -139, -271, 267, -344, -540, -67, 496, -87, + -315, 81, -434, -241, 0, 255, -455, 36, 462, 479, -4, 161, 412, -258, -400, -548, 35, -546, -131, 213, 194, -484, -464, -282, 175, -136, -101, -134, 409, -643, -203, 89, -359, -127, -16, -408, 1, 156, -39, 516, -53, -220, 27, -33, -188, 94, 241, -243, 352, -185, -699, 30, -280, -146, -30, -75, -873, -136, 382, 338, 238, 463, 396, -57, -984, 277, -183, 338, -316, -1, 515, -170, 731, 171, 140, -311, 136, 366, -226, -42, 470, 309, 353, 55, -552, 353, -358, -28, -219, 59, -278, 164, -78, 160, 139, 268, + 257, 301, -359, 90, 548, 126, -111, -106, -292, -220, -14, 27, 86, 476, 25, 265, 234, -11, -138, -108, 406, -493, -130, -436, -387, -98, -24, -735, 162, -232, 420, -96, -18, 309, 21, 739, 563, 848, 273, 18, -120, -187, -252, -58, -199, -267, -273, 405, -98, -69, 923, -171, -185, 1027, 0, 592, 438, 51, 252, -117, 201, 194, 125, 161, 480, -302, 576, -290, 4, 136, -63, -387, -351, 11, -578, -167, -633, -22, -371, -263, -197, -160, 109, -495, 616, 121, -379, -265, -6, -48, -83, 185, 96, 623, 82, 25, + -289, 84, 138, 13, -308, -102, 388, 445, -7, -302, 160, -22, 551, 639, -206, -99, -79, 126, -184, 302, -654, -11, 868, -636, -211, -79, 222, -96, 75, -515, -276, -70, 423, 506, 352, -301, -791, 1406, 364, -862, -863, -119, 226, 605, -749, -123, 157, 0, -95, 810, 186, -458, 265, 44, -8, 431, -62, 240, -505, -166, 929, 348, 736, 237, 667, 123, -225, 467, 433, 663, 338, -731, -265, 168, 398, -289, 129, -279, -463, 56, -39, -280, 239, 316, 285, 202, 201, -136, 511, 1, -475, -354, 463, 244, -751, 334, + 152, 228, -608, -381, 457, 529, 414, -12, -747, 349, 667, 267, 704, 131, 333, 250, 1162, 1571, 141, 326, -970, -300, 619, -491, 1197, -221, 207, 330, 711, 395, -142, -488, -563, -182, -73, -724, -324, -283, 495, -264, 165, -463, 88, -178, -661, 721, 522, 581, 280, -345, -312, -795, 42, -717, -191, -59, 123, 370, 320, -234, -137, 304, 705, 179, 288, 488, -598, 438, -327, -338, -605, -290, 318, 229, 67, 721, -138, -290, 146, 151, 955, -394, 279, 209, 966, -238, 135, -442, -133, -588, 453, -843, 30, -680, 125, 281, + 96, -409, 1371, -103, -194, 119, -795, 39, -540, 12, 139, -165, -28, 319, -299, 6, 407, 28, 95, -682, 75, -63, -53, -177, -851, -473, 196, 62, 360, -978, 93, -910, 445, -624, -999, 491, 896, 149, 434, -690, 661, -176, 86, -427, 548, 216, 568, 172, 692, -652, 108, 24, -126, -523, -432, -493, 521, -166, 681, -434, -273, -12, 54, -440, 330, -65, -1627, 183, -530, 1477, -296, -769, 285, -58, -766, -144, 110, -467, 1111, 145, 92, 496, -649, -990, -617, 1359, -126, -308, 893, 497, -450, -447, -259, 1074, 136, -282, + -443, -221, -868, 558, -116, 217, 531, -210, -900, -125, 1120, -65, -302, 531, -267, 663, 428, -74, -859, -445, -134, -795, -477, -466, 41, -124, 636, -474, -179, -21, 1664, 568, -315, 323, 174, -118, 831, 396, -345, 110, 635, 720, -451, -242, -1042, -843, 409, -274, 376, -44, -143, -140, -1790, 659, -358, 1004, 1019, -538, 498, -941, -1433, 71, -998, 171, -97, 833, -560, 606, 520, 838, -1185, 171, -713, -644, 107, -842, -535, 841, -200, 346, 968, -142, 343, -725, 124, -803, 824, -656, -430, -470, 917, 755, -464, 1014, 678, -148, + 996, 4, -966, -219, -72, -724, 226, -1600, 219, -354, -744, -570, 803, -366, 1606, 1232, -1657, 92, 33, 185, 885, -1222, -818, 1051, -610, -756, -850, 141, 1780, 1035, -927, -195, -551, -528, 210, 859, -956, 479, -1605, -242, -625, -545, 848, -1096, -1709, 997, 1501, 364, -292, -1365, 92, 535, 534, -228, -548, 70, -135, -177, 174, -200, -457, -891, 115, -535, 135, -479, -1018, 637, 469, 784, 31, 848, 476, 133, -268, -424, -696, -493, -275, 208, 492, -315, -149, -1151, 1103, 1307, 733, -643, 706, -881, 5, 227, -1943, 185, 223, 960, + -1144, 1549, 632, -1029, -554, 476, -191, -636, -749, -800, -1135, 969, -226, 221, -161, -1504, -206, 538, -710, -664, 613, 619, 122, -601, -2033, -307, 392, 232, 875, -29, 507, -142, -16, -265, 35, 527, 59, 11, 520, -151, -128, -697, -65, -122, -78, 105, 415, 555, -112, -13, 447, -115, -859, -73, -761, 96, 107, -1015, 728, -1392, 312, 363, -600, -59, 1793, -523, 609, -395, 326, -1357, 152, 764, -12, 655, -148, 50, -33, 844, -545, -690, 780, -724, -851, -31, -1326, 865, 686, -307, 160, 87, 133, -961, -773, -2272, -1085, -384, + 700, 1618, -1544, 298, -469, -1558, -245, 1337, 337, 1095, -983, 250, -360, 34, 635, 80, 332, -249, -1974, 543, 66, -858, 818, 613, -616, 563, 43, -666, 165, -425, 1187, 115, 464, -10, -1275, -1033, -364, -774, 784, 1131, 1171, 930, -360, 100, -1005, -182, -124, -447, -542, 49, 70, -1382, -418, -561, -61, 568, -685, -187, 210, -32, 672, -802, -53, -898, -475, -661, 316, 171, 620, -63, -47, -784, -151, -491, 305, 584, -941, -3713, -1960, 405, 1563, 3505, 2673, 1512, 504, 791, -253, -1465, -2850, -3777, -963, -1089, 50, 1853, 2623, 1774, + 2350, 553, 490, -264, -1203, -1338, -1103, -1147, -1447, -1136, -506, -59, -32, 936, 1178, 2299, 1061, 372, 919, 1476, 445, 298, -1196, -1587, -2650, -1193, -1402, -974, -620, -443, 167, 349, 1076, 2291, 1791, 2015, 1437, 1830, 1303, -1052, -1031, -2471, -1981, -1387, -3238, -2431, -1547, 159, 1866, 1857, 2053, 2608, 2083, 1163, 1228, -9, -798, -1722, -2331 }, + {258, -32, 122, -42, -4, 233, -123, -12, 66, -24, 78, 89, -202, 81, 76, 43, -9, -66, 139, -176, -149, -33, 4, 72, -151, -111, -16, -98, 162, 8, -68, 128, -117, 14, -26, -70, -10, 100, 103, 60, 159, 131, -11, 40, -65, 167, 105, -75, 18, 23, 18, -102, 90, 30, -14, 177, -93, -108, -13, 53, 13, -23, -64, -44, 58, -50, -9, -39, 61, -27, 133, 58, -73, -55, 78, -74, -46, -66, -128, 77, 122, 216, 59, -150, -268, 60, -125, 12, 85, 34, 218, -178, -43, -23, -13, -153, + 96, 42, 20, 6, -75, -56, -54, -16, 8, 38, -56, 85, 195, -4, 87, -136, -80, -163, -79, 178, 9, -33, 31, 189, 20, 96, -23, -84, -27, 109, -91, 170, 103, 192, 93, 16, -57, -121, -69, -104, -17, -75, 32, 12, -42, 33, -36, 73, -15, -12, 91, -2, -8, 21, -68, 35, -375, -85, 153, 27, 209, 111, -173, 45, -4, 68, -62, -288, 165, 101, 190, 237, 204, 72, 2, -293, -31, 135, -134, -116, -307, -21, -52, -35, -79, 36, -183, 83, -33, 78, 22, -123, 94, 80, 212, -24, + -171, -87, 91, 38, -43, 10, 67, 10, -125, 0, 25, -12, 7, -77, -35, -103, -22, 130, 45, -42, 55, -14, -7, 22, -149, -11, -7, 87, 161, -43, -13, -94, -74, 35, 173, -115, 2, 14, -12, -43, 32, -43, 207, 78, 70, -69, 6, 20, 20, -355, -192, -16, -88, -109, -5, -92, -362, 217, 50, 99, -38, 75, -96, 6, 13, 188, -66, -38, -31, -30, -30, -12, 203, -37, -3, -113, -6, -54, 66, 35, -195, 154, -198, -1, 174, -22, 7, 16, -3, -119, -86, 203, 117, -244, -131, 43, + -144, -101, 107, -173, 36, 49, 104, 219, 165, 106, 80, -132, -137, -116, 40, 177, 59, 273, -65, -68, -80, 78, -90, 135, -257, -31, 193, 102, -193, 145, 237, 224, 143, 29, -8, -143, -187, 82, -17, 191, -14, 115, -117, -75, -62, 21, 60, -8, -229, 51, 80, 61, 99, 64, -124, -303, -98, 49, 59, 18, -13, 62, -125, 2, -228, 111, -235, -57, -100, -150, 114, 56, 48, -129, -65, -33, -135, 20, -11, 80, -57, -106, -86, -262, 88, 42, 118, 177, 207, 90, -62, -89, -30, 88, 159, -107, + 140, 129, -18, 93, -259, 35, -122, 18, 43, -161, 64, 488, 57, -39, -268, 393, 3, 168, 23, -4, -208, 210, 57, -109, 31, 20, -80, 87, 221, -59, 235, -64, 103, 1, 156, 139, 156, 6, -78, 123, -82, 109, -25, 110, 107, 103, -8, -25, 44, -80, -118, -310, 211, -198, 148, 24, 66, -31, -369, -75, -95, -176, 32, 121, -234, -69, 118, 28, 179, 303, 7, -57, -59, -249, 114, 56, -34, 54, 100, -140, -168, -19, 87, -56, -83, -124, 33, 217, 96, 32, -502, -232, -72, 99, -62, 166, + 568, 174, -212, 30, -250, -83, 172, -200, -52, 252, 59, -67, 34, 141, -88, 67, 74, 72, -143, 62, -68, -84, -211, -84, -124, -236, 100, 6, -17, 233, 170, 58, 188, -1, -240, 200, -24, -166, -130, -239, 10, 285, 19, -127, 121, -214, -134, 111, -173, -229, -119, -71, 128, -189, -51, -68, 231, -9, -52, 168, 119, -330, 301, -122, 22, -147, 257, -43, -184, -585, -84, 295, 67, -456, 198, -5, -100, -150, -125, -49, -276, -50, 209, 279, 329, 200, 299, -104, 233, 113, -485, -14, 116, 166, 74, -167, + 1, -37, 160, -288, -111, 211, -79, 118, 54, -191, -220, -109, -326, -90, -107, 131, 38, -182, -52, -389, -108, 162, -124, -383, -15, 224, -479, 142, 69, 156, -229, -93, -213, 26, -69, -206, -32, -39, 132, 129, 179, 11, -345, 94, 303, 385, 292, 296, 125, -183, 214, 356, -492, 268, 271, -531, -126, 146, 603, -33, -20, -128, -146, 738, 378, 112, 110, 388, 13, -46, -121, 67, -306, -284, -46, 102, 240, 109, 72, -101, 44, -230, 123, -346, 372, -30, -148, -195, -207, -350, 89, -339, -89, 246, -27, -111, + -84, -48, -266, -198, -101, -119, -34, 116, 96, 25, 53, -255, 490, 268, 48, -22, 616, -51, -47, -108, -217, 0, 663, 224, 136, 320, -372, -225, 204, 219, 491, 67, 133, -338, -25, 161, -444, -145, 170, -150, 0, 116, 318, -114, 120, 63, 65, 273, 234, 291, -239, -159, 312, -409, -142, -138, -35, -113, -267, 249, -18, -284, 4, -114, -301, -367, -212, -222, 418, -141, -120, -259, -32, -134, 55, 502, -107, -171, 73, -36, 278, -345, 558, 108, -568, -409, 129, -381, -13, -407, -19, 70, -67, 393, 454, -261, + 32, -58, -398, -554, 253, 1243, -178, 18, -499, -191, 392, -20, 727, 450, 417, 35, 329, -535, 549, 301, 56, 101, -298, 177, 27, 562, 326, 386, -96, 69, 124, -319, -254, -94, 194, 651, -138, -171, -177, -80, 113, -353, -80, 13, -176, -374, -53, -484, -156, 351, -330, -117, -36, 74, -556, -312, -40, -14, -74, 423, 204, 76, 266, 439, -194, -41, -278, 208, -206, 282, 302, 368, 592, 233, -332, 38, 895, 347, 423, 296, 233, -38, 619, 679, -698, 164, 500, 302, -200, -372, -327, 710, 50, 265, 365, -216, + 96, 154, -447, -466, 366, 127, -688, -157, 867, 421, -15, -502, 151, 132, 520, 177, -276, 351, 46, -146, -68, -104, -435, -195, 45, 75, -518, -534, -339, -150, -613, 355, -61, -415, 55, 15, -209, -46, 98, 2, 103, 161, 206, -228, -312, 372, 704, 342, 162, 547, -146, 298, 675, 439, 14, 74, -275, -420, 337, -379, 91, -189, -36, -137, -644, 185, -309, -141, -238, -38, 560, 553, -1109, 347, 357, -343, -561, -735, 134, -214, 141, -255, -198, -117, 694, 177, -55, -9, -104, -203, 180, 117, 2, 278, 66, -56, + 104, 253, 717, 74, 94, -349, -143, -164, -169, -19, -51, 237, 348, 18, 401, -89, -57, -78, -34, -687, 788, 23, 66, -54, -189, 209, -39, 318, 33, -299, 99, 338, -220, 314, 95, -466, -57, -88, -784, -252, 246, 231, -208, -146, 242, 115, -214, 531, 128, 139, -450, 274, -201, 259, -267, 344, -381, -319, 488, 29, 99, -348, -731, -104, 169, 17, 264, -287, 4, -42, -555, -414, 137, -627, -420, 147, -33, -655, -123, -347, 356, 193, 35, -186, -421, -862, 252, -410, 411, -180, -186, -122, -254, 77, 79, -702, + -327, 594, 524, -633, 716, -14, 515, -189, -175, -128, -263, 228, -262, -675, -372, 658, -214, -218, -96, 144, 68, 264, -834, 124, 331, 187, -306, 394, 306, -291, -501, -418, -246, -485, -26, 237, 538, -87, -25, -892, 538, 676, -106, -357, -371, -221, 1008, -606, -3, -63, 271, -35, 1161, 39, -634, -155, -603, 796, 679, -537, 639, 175, 514, 209, -974, 321, 516, -655, -189, -744, -384, 46, -705, -578, -20, -463, -10, 195, -176, -456, 394, 387, -794, -575, 331, 173, 213, 437, 526, -155, -283, 25, -180, 36, -50, -212, + 117, -1010, 386, 565, -450, -375, 306, -90, -169, 290, 655, 1194, 1858, 98, -693, -902, -181, 81, -185, 926, 702, 502, 806, 602, 490, 75, 402, -427, 703, 814, 90, 845, -292, 112, 222, -699, -465, -130, -408, -475, -42, 868, 24, -111, 137, 224, -78, -1066, -119, 341, -132, -291, 169, 481, 795, 239, 420, 592, 696, -869, -611, 415, -241, 1225, -95, 1061, -786, 535, 844, 87, 156, 549, -867, -357, 44, 563, 34, 633, 253, 273, 604, 268, -62, -107, 1293, 426, 448, 942, -80, 195, 402, 605, -691, -549, -244, -601, + -119, -805, 397, 637, 451, 634, -445, -239, 473, 381, -288, 645, 367, -148, -811, 439, 457, -399, -84, 233, 88, -633, 705, 200, 758, 434, 277, -423, 335, -222, 1165, -939, 67, 368, -218, -603, 349, 389, -117, 384, -411, 987, -501, 266, 162, -613, -323, -847, 308, 260, -698, 605, 445, -434, 297, -39, 912, 321, -562, -324, -383, 309, -330, 108, -139, 283, -1123, 545, -953, 1050, 1255, -34, 245, -965, 22, -191, 132, 610, 623, -144, 338, 512, 107, 233, 170, 231, -95, 733, -67, 191, -360, 822, 202, -41, 5, 743, + 303, 369, 816, -141, -454, 998, -994, -408, -146, 262, 710, 193, -247, -250, -463, 27, -58, 234, 1119, 1095, 704, 993, -54, 1476, -447, 441, -307, 76, 486, -178, 90, -385, -518, 58, -309, 344, -432, 761, -485, -784, -295, -153, -21, 968, -559, -109, 1, -383, -68, 339, 290, -35, -444, 1747, 2447, 719, 1901, -468, -1381, -989, -693, 280, 323, -496, -754, 577, 811, 441, 810, 596, 130, 204, 98, -98, -582, 186, -683, 402, -23, -675, 684, 366, 314, 1162, 729, -421, -263, -514, -550, -716, -278, -51, -532, -237, 1035, 1525, + 1160, 76, 784, 773, 1295, 510, -726, -1249, -743, -837, 405, 255, -1596, -1190, -307, 540, 1397, -1201, -78, -1067, -162, 1010, -681, 278, -970, -352, -356, 608, -876, -271, -122, -78, -180, -713, -1375, 157, 751, -642, 1169, -479, 458, -166, -1371, -706, -77, -809, -1847, -524, 652, 1011, -509, -795, -1652, -496, 473, -334, -487, -822, 182, -191, -150, -159, 319, 652, -524, 504, 422, -523, -1510, 118, 109, 383, 168, 976, 86, -1490, -4, -1639, -21, 567, 671, -128, 77, 762, -414, -290, -530, 494, 340, -233, 567, -180, 225, 278, 939, 132, + -367, -1025, -381, 540, 427, 788, 1095, 1877, 903, 488, -425, -1647, -396, -149, 114, -1330, -402, 931, -453, -380, -94, -296, -1066, -1187, -1736, -546, 9, -132, 1144, 316, 1493, 920, 467, -205, -543, -100, 2094, 133, 609, 343, -255, 1043, -426, 843, -908, -87, -651, 794, -1103, -229, 350, 356, 368, -967, 703, -1106, 238, -537, -361, 1115, 79, 82, 395, -410, -10, 302, -1336, 50, 329, -182, 889, -372, -150, 1481, -532, -1194, 27, -434, 126, -61, -32, -937, 553, -115, -1238, 831, -1452, 369, -295, -232, -850, 136, -581, -2040, -2096, -1792, + -903, 3692, 1156, -468, -484, -1836, -3875, -443, 1038, 1290, 556, -604, -447, -1150, -1258, 936, -906, 2321, 1748, -2731, 880, 345, -568, 199, 1952, 266, 1348, 2656, -578, -2207, 107, -389, -2041, -574, 993, -107, 1222, 1947, 182, -1721, -3323, -2879, -2547, -289, 2489, 686, 674, 352, -661, -3367, -2077, -1095, -391, 178, 772, 704, 960, 935, 1220, -1473, -498, -1212, -79, -1316, 817, 762, 1624, 1701, 817, 77, -553, -655, -1854, -1346, 1744, 653, -319, -3764, -4211, -2880, -2963, -828, 3208, 2146, 3465, 3867, 5896, 3900, 4035, 2587, -255, -2988, -5134, -6051, -5264, -4159, + -3027, -765, -202, -475, 100, 1249, 2079, 2912, 2520, 3460, 3333, 4329, 3949, 1084, 2637, -618, 692, 509, 111, -402, -3938, -4707, -6018, -7037, -6409, -3564, -3179, -2607, -3274, -3773, -831, 912, 2345, 3464, 5003, 5996, 7679, 10144, 9840, 7500, 6093, 5106, 2735, 4331, -1634, -3355, -8152, -9277, -11437, -10800, -9588, -8745, -7793, -3851, -1242, 1021, 6443, 7054, 9482 } + }, + { + {-212, 352, -95, 58, -115, 45, -250, 13, -75, 90, -136, -98, -26, 91, -19, -16, -52, -71, -167, -36, -140, -75, -118, 52, -25, 9, 59, 35, -82, 37, -29, -7, -31, -27, -74, 5, -134, 168, -51, -41, -26, 10, -1, 19, -156, 11, 67, 5, 29, -4, 35, 127, -40, 78, 92, -135, -42, -33, 126, -24, 39, 142, 1, -41, 32, 41, 43, 11, 74, 0, -19, 57, -55, 11, -12, -95, 416, 54, -172, 70, -106, 38, -66, -39, -91, 78, 129, 43, 46, -215, 52, 12, 77, 93, 55, 136, + -19, -64, 22, 161, 9, -109, -4, 138, 79, 22, 9, 45, 5, 18, 33, 4, -38, 2, 9, 59, -68, -171, 140, 140, 123, 116, 2, 67, 111, -101, -17, 5, -137, 41, 18, 139, 21, 81, 9, 172, 90, -16, 122, 78, -31, -127, 40, 42, -30, 17, -68, -15, 72, 45, 51, 123, 1, -8, -29, 348, -228, 81, 198, 48, 141, 169, -148, 34, -10, 67, -188, -150, -24, 151, 206, -75, -63, 98, -159, -218, -36, -256, 93, 87, 28, -159, -158, 59, -89, 23, 1, 171, 185, 163, -20, 115, + -171, 78, -98, -9, 16, 140, -142, -132, 9, 183, 83, 72, -102, 63, 54, -53, -219, -36, -68, -99, -80, 106, -85, -29, 35, 67, 176, -60, 9, -120, -45, 30, -151, -4, 64, 116, -18, -54, -29, -133, -233, -67, 27, -80, -124, -73, -232, -136, 222, -21, -115, 112, -199, -54, -245, -60, -196, -107, 203, 0, -56, -255, -164, -66, -117, 30, -142, 2, 68, 247, 114, 86, 99, 198, -189, -13, -66, -146, 42, -39, -66, -152, 60, 138, 1, -119, -84, 370, -13, -120, -168, -240, -320, -49, -174, 26, + -47, 74, -1, 30, -157, 10, 5, 173, 43, -150, -12, -55, -62, -47, 40, 75, 65, -526, 216, -89, 94, -214, -84, -166, -153, 17, -45, -101, 276, 77, -20, -157, -47, 84, -184, -92, -175, -92, 263, 33, 177, -8, 2, -35, 53, 56, -134, 11, 45, 87, 285, -138, -167, -24, 315, 108, 334, 40, 34, -48, 166, -17, 244, -13, -25, -32, -98, 115, 34, -74, 73, 104, 170, -83, -5, -16, 152, -46, -22, -41, -35, 52, -45, 35, 30, -18, 42, -215, 33, 179, 67, 199, 24, 51, 45, -120, + -63, -9, -269, -50, -4, -138, -472, -120, -106, -210, -45, -59, 286, -108, 215, 96, 153, -306, -140, -310, -287, -7, 48, 169, -90, -139, -86, -212, 39, 86, 102, 59, -67, 69, -141, 8, -251, 82, -68, 27, 50, 85, 94, -101, 0, 231, -131, 108, 118, -15, 70, 110, -51, 39, 113, -1, 201, -114, -143, -75, 65, -8, -273, -145, -302, -334, -57, 80, -259, 107, -40, -21, -73, 81, -133, 6, -36, 144, -440, -27, 128, 80, -237, -33, -153, 33, 37, 27, -259, -341, -237, 35, -191, 197, 55, -327, + 225, 202, 153, 143, -170, 261, 60, -4, -112, 87, 148, -146, -223, 77, -91, -265, -46, -255, -104, 461, -135, -207, -269, 15, 29, 184, 60, -167, 140, -17, -147, -173, -201, 287, 112, 183, -151, -181, 67, 51, -207, -3, -134, 191, -54, 24, -244, 152, 102, -118, -96, -72, 216, 11, 28, -72, 87, -133, -222, 0, 68, -48, -175, -266, -210, 233, 37, 283, 337, 326, 59, 444, 116, -39, 212, 163, 413, 67, 242, -308, 533, 393, 197, -150, -114, 197, 55, 143, -65, 233, -55, -51, 214, 172, -194, 146, + -43, 226, 250, -460, -74, 294, 99, 163, 135, 290, -126, 120, 17, -235, -105, -2, 62, -349, -18, 226, -165, 376, 291, -111, 7, 73, 150, 218, -76, -72, 358, -86, -3, 143, 15, 170, 138, 32, 74, 929, -451, 89, 397, -14, 37, 517, 567, 86, -17, 135, -1, 143, 182, -178, -34, 340, 310, -112, -230, -256, -258, -135, 267, -164, 134, 32, -305, -4, -192, -9, 127, 165, -402, -186, -313, -90, 557, 93, -13, 64, -12, 43, 191, 107, 298, 3, 234, 133, -142, 132, -236, 24, -236, -274, 154, -303, + 180, 13, 210, 146, 168, -153, 252, -272, 50, -113, 15, 384, 79, 202, 236, -8, 20, 151, -148, 64, 248, -559, 84, 113, -382, 147, -19, 365, -117, -214, 146, -493, -179, 380, 160, -263, -600, 240, -96, 122, -388, -516, -350, 407, 21, 214, -55, -249, -350, 136, -103, -316, -355, 1, -318, -260, -140, -85, -343, 160, 210, 274, -154, 240, -225, 394, -89, -50, 311, 137, -89, -245, -118, 280, 62, -261, 101, 298, 302, 102, -388, -453, -46, 48, 18, -338, 83, 298, 88, -180, -540, 94, -229, -511, -2, -50, + -279, 336, -52, -205, -690, 399, 304, 336, 31, 356, 19, -264, -299, 20, 284, -231, 52, -474, 292, 306, -182, -117, 59, 336, 246, -210, -182, 222, -311, 77, -419, -26, -134, -567, -572, 82, 309, 123, -490, -284, 352, -432, -180, 297, -99, 377, -154, -312, 96, -441, 463, -81, 74, -253, -123, -51, -455, -305, 26, -106, 35, -179, -481, 52, -399, 137, -108, 243, -481, 171, 70, -177, 332, -89, -253, -489, -83, 30, -315, 206, -255, 10, -98, 209, -221, 63, 252, 374, -109, 32, -143, -525, -116, -122, 217, -463, + -6, -273, 275, -329, -434, 272, 128, 171, 590, -113, -172, 151, -380, -459, 36, 550, 173, 301, -225, -296, -449, 71, 579, -277, 305, 49, 452, -705, -212, -32, 87, 368, 196, -544, -132, -265, -11, -625, -83, -240, 54, -341, -7, 48, -861, 74, -258, 27, -328, -47, 236, 82, -95, -140, -432, 424, 456, 115, 149, -368, 581, 135, 304, 141, 846, 309, 585, -536, 145, 595, -157, -194, 100, -344, 292, 83, -400, -534, -22, 478, 7, -25, 324, -442, -96, -362, 231, -626, 32, -126, 253, -655, -438, -281, 217, 223, + 171, -208, 184, -153, 221, -125, -35, -40, -163, 132, 319, 179, 321, -21, -263, 43, -261, 763, -168, -752, -209, 203, 677, -657, -244, -48, 443, 18, -899, -126, 448, 864, 52, 592, 900, -92, 294, 376, -124, 672, -82, 804, 64, -303, -654, 348, 422, -727, -706, 185, -165, 20, -281, 656, -295, -192, 230, 162, 8, -305, -219, -370, 150, -26, -175, -34, 441, 653, -708, -51, -690, -79, -175, 682, -285, -283, -128, 412, 146, 109, 183, 161, -116, 1, -81, 104, -73, 636, -157, 163, 464, -244, -507, 108, 191, -191, + -185, -51, 124, 319, -428, 590, 898, 582, -224, -362, -788, -1055, -358, -7, -158, -54, -80, 254, 20, -373, 244, -145, 2, 324, 462, 56, -364, 716, 328, 412, 613, 942, -348, 492, -951, -109, -421, -934, 392, 233, 297, 135, 384, 123, -669, 581, 1021, -142, -152, 257, 111, -202, -890, 83, 13, -73, 23, 316, -633, 149, 194, -123, -360, -172, -403, 431, -914, -125, -583, 340, 145, 344, -107, 101, -225, 576, 182, 475, -411, 467, 2, -436, 936, -142, 126, 634, -584, 711, 432, -534, 247, -195, 324, -739, 566, 100, + 196, -52, 207, -539, 417, 607, -860, 338, 869, 566, -337, -407, -9, -390, -174, -1036, -882, -121, -504, -609, -435, 272, -151, -308, -490, 458, 37, -749, -112, -4, -350, -113, 312, 218, -45, 2, 23, -189, 169, 348, -121, -85, 547, -1011, -154, 283, 1088, -448, -267, -404, -533, 236, 1155, 209, 722, 143, -101, -63, -68, -554, 139, 122, -430, 96, 912, -148, -254, 147, -296, -77, 812, 1160, 342, 696, 838, -290, -305, 88, -228, 41, -689, 12, -526, 243, 149, 386, 847, 954, -353, 2132, -269, 69, -370, 270, -145, 267, + 563, 175, -486, -253, -508, 12, -339, -633, 108, 446, -52, 145, 221, 270, 15, -168, -228, 146, 17, -305, 146, 928, 659, 385, -752, 573, 450, -183, -218, -215, -292, -113, 265, -537, 69, 89, 348, 884, 180, 198, 59, -86, -165, 392, -219, 890, 288, -70, 387, 87, -587, -412, 494, 582, 206, -138, 368, 409, 560, 1115, 105, -327, -607, -413, 178, 163, 188, -152, -5, 215, 344, -327, 1512, -224, 67, 167, -111, -22, 382, -282, -328, -176, 493, 434, -1161, 223, 205, 475, -292, -464, -432, 331, 310, -474, -249, -197, + 795, 391, 231, -157, -802, 225, 216, 414, -88, 217, -213, 73, -693, 287, 304, 3, -159, -451, -862, 562, -353, 284, 318, 495, 89, -546, 912, 164, -852, -415, 542, 112, 704, 275, 135, -637, -284, 330, -1058, 1146, -800, 26, 713, -194, 1337, 100, 333, -528, 1442, 74, 701, -250, 467, 1182, 350, 720, 933, -105, 1079, -943, -380, -394, -356, 60, 122, -137, -454, -818, 661, 624, 226, 558, -1081, -941, 231, 359, -535, -720, 355, -269, -1012, -408, -247, 407, -937, 421, 259, 321, -475, -85, -471, -237, -1228, -342, 492, -1895, + -651, -129, -111, 5, -1175, -333, -1736, -196, 258, -531, -593, -272, 427, -225, -672, -737, -1808, -671, 741, -819, -1243, 931, -375, -1348, 304, 1094, -652, -296, 207, -773, 705, 342, 558, 141, 1466, 2014, -281, -36, -748, -760, -1319, 595, -196, 2007, -384, -841, -1159, 86, 410, -427, 414, 1311, -474, -220, -865, -403, 922, 1022, -976, -284, 569, -216, 279, -303, 1324, 1022, 2224, 706, 1014, -433, 744, 1465, 533, -103, 400, -61, 1017, 487, 1457, 377, -1345, 476, 610, 1139, -583, -579, 743, 702, -277, 1137, -335, 444, -1205, 773, -221, 403, + 539, 977, 973, -757, -649, -291, 1146, 1003, -297, -587, -1001, -151, 821, 725, 682, -365, -236, -417, -1542, 183, 2544, 1547, -273, -3557, -446, -300, 357, -344, 142, 446, -64, 231, -713, 570, 682, 1187, -733, -956, 1137, 1745, 502, -679, -913, -146, 330, 161, 347, 74, 452, 216, 1179, -282, -1417, -583, 572, 246, -431, -588, 179, 780, 1351, 1227, 70, 93, 571, -372, -1198, 470, -707, 1637, 1816, 45, 592, 327, 453, -669, 9, 1712, -489, 108, -2079, -196, 388, 617, 627, 568, -372, -176, 1101, 1461, -59, 89, 380, 674, 142, -217, + -1658, -701, 1271, 1410, 1331, 1825, 283, -821, -2476, -1875, -386, 494, 1506, 1659, 754, 16, -862, -730, -360, 505, 1396, 800, -240, 32, -170, -812, -1139, -907, 108, 1308, 936, 1978, 1235, 1267, 1744, -549, -1324, -1446, -1967, -2351, -959, -298, 605, 1255, 1759, 1702, 1308, 860, 1675, -380, -1237, -88, -405, 432, 411, 2079, 1715, -736, 184, -537, -1580, -481, 200, -935, 1121, -620, 216, 0, -446, 818, 1082, 775, 371, -615, -1418, -1129, 904, 292, -3424, -3614, -3773, -3869, -5191, -360, -1312, -143, 723, 2692, 3015, 3122, 4264, 5827, 5576, 5501, 4445, 3287, + 2428, 892, -2360, -1007, -1319, -718, -2883, -294, -1087, -1185, -2362, -1741, -1815, -1594, -1717, -3104, -2772, -1532, -1415, -1772, -2579, -229, -2251, -4333, -3749, -3229, -1693, -2156, -335, -4532, -2007, -1947, -913, -592, -2388, 186, -2426, -245, 315, 1132, -6, 1120, 1569, 2628, 2670, 3813, 2264, 5934, 3434, 6685, 4146, 6237, 7119, 8450, 6370, 6058, 6537, 5809, 5844, 6841 }, + {-289, 317, -184, 13, -154, 72, 35, 53, -170, -117, 4, -109, -12, 71, -13, -38, -19, 79, -33, -53, 218, 0, -171, -79, 73, 18, 68, -151, 17, -159, 24, 133, -16, 84, 87, 80, -89, -39, -52, 29, -22, 56, -147, -71, -62, 8, -37, 83, 108, 171, -67, -92, -44, 42, 112, 128, 104, -23, -149, 190, -125, 68, -131, 110, -87, 65, -79, 5, -83, -60, -5, -26, 64, 30, -16, -106, 523, 72, -167, 84, 95, 35, -213, 102, 157, -162, -46, -199, -41, -83, -70, -26, 15, -4, 24, 76, + -86, 43, -204, 74, 132, 30, -50, -165, 114, -71, 182, 155, -2, -68, 150, 172, 141, 140, 39, -103, 38, 133, -49, -107, 104, 160, -63, 85, -173, -12, -151, 110, -202, -53, -32, 75, 111, 77, 1, -107, 22, -148, -92, 33, -9, -87, 61, 58, 24, 102, -70, 49, -87, -26, -29, 64, -50, -56, 39, 295, -300, 10, 4, -77, -91, -97, 30, -170, -167, 22, 80, -8, 95, 73, -92, 36, -329, -82, -74, -78, -104, -116, -290, -226, 30, 66, -16, 155, 125, 51, -56, -33, 146, -59, 18, -23, + -154, 49, -52, -107, -40, 124, 304, -118, 34, 72, -56, 93, 43, -109, 62, -255, -116, 0, 103, 157, -97, -49, -11, -368, 62, 184, 10, 22, 103, -65, 159, 208, -28, 50, 126, 100, 33, 16, -61, -81, -259, 57, 6, -250, 35, 136, 201, 50, -150, 344, -50, -71, 159, -103, -101, 14, -130, 152, 151, -65, -237, -117, 112, -152, 326, 282, -231, -280, 6, 50, -269, -20, 105, 72, -134, -78, 299, -35, 204, -23, -73, -73, -162, 25, -28, 161, -146, 35, -43, 28, -89, -14, 132, 107, -180, 266, + 15, -5, -13, -29, 64, -42, -252, -40, -139, 204, 75, -2, 238, -148, 148, 142, 7, -623, 135, 27, 434, -30, 170, -243, 45, -183, -49, -93, -34, 75, -54, 69, 142, 107, 411, 282, -196, 90, -17, 71, 42, -60, -422, 99, -28, -10, 150, -31, -123, -87, -27, -135, -77, -338, -86, 2, -125, -28, 129, 190, -72, 236, -190, 33, 74, 24, -66, -136, 81, -40, 46, -103, -146, 17, 68, -145, 119, -103, 298, 319, -113, 109, 113, -29, -58, -58, -408, 144, 138, -14, -90, -168, -24, -57, -158, -128, + -197, 206, 119, -13, 237, -120, 213, -230, -222, 115, -356, -123, 95, 224, 290, -45, 218, -2, 208, 81, 37, -28, 15, 209, -94, -16, 40, 23, -197, -19, -106, 420, -195, -195, -46, 202, 199, 175, 228, -33, 44, -44, -110, 92, -8, -15, -126, 332, 202, -94, 64, 103, -170, 44, 128, -25, 245, -91, -31, -257, -99, -217, 11, 319, -122, 96, 54, 19, -80, -20, 2, -57, 134, -128, -50, 12, 138, -59, -573, 430, 53, -206, -505, -43, 22, -296, -18, 150, 130, 19, -78, 120, 377, 380, -150, -167, + -394, 89, -63, 401, -150, -1, -82, 156, -33, -395, 143, -11, -227, 8, 49, -25, -29, -158, -218, 148, 47, 191, -146, 316, 159, -55, -259, -46, 112, 310, 108, -162, -63, 149, 106, -79, -27, 157, 138, 166, 316, 343, 181, 188, 224, -108, 50, -208, 241, 50, 133, -135, -205, 84, -257, -62, -87, 204, -211, -14, 390, 239, 329, 61, -365, -121, 382, -112, -246, -255, -252, -265, 143, 147, 92, 86, 87, 369, -49, 160, -321, -358, 236, -13, -198, 14, -501, -163, -171, 61, -21, -46, -354, -229, 35, 243, + 390, -155, -158, 211, -274, -18, -18, 92, 167, 142, 268, -145, 391, 188, -432, 216, -243, -281, -241, -340, 304, 76, -371, 45, 70, 38, 51, -63, 249, -144, 187, -304, 224, -147, -144, 63, 64, -62, 113, 835, -708, 362, 376, -306, -36, 509, 199, 332, 115, -83, 754, -6, -114, 23, 25, 375, 572, 232, 19, 35, 105, 213, 20, 125, -362, 207, 322, -38, 145, 25, 78, -222, -170, 40, 14, 365, 191, 167, -120, -149, -152, 222, 307, 30, -67, 582, 311, 399, -175, -385, -54, -404, -260, -100, -155, 6, + 350, -70, 40, -231, -254, 358, 14, 188, 194, -128, 344, 123, 69, -59, -146, 281, -3, -312, 283, 256, 119, -576, 62, 178, -286, 223, -489, 100, 140, -74, -197, -256, -291, -495, 56, 537, -186, 252, 143, 395, 213, -168, -355, 166, -92, -140, -367, -70, -51, -161, -158, -101, -257, -353, 390, -57, -228, 288, 108, -288, 40, -41, 175, -378, 101, 99, -524, 151, 173, -296, 80, -6, -83, 166, 21, -66, 26, 100, 357, 249, 364, 214, 131, -132, 541, -178, -277, 553, 36, 307, 66, -170, -541, -523, -122, -30, + -138, -205, -111, 144, -974, 432, 784, 27, -492, 181, -115, -62, 104, 48, 180, -277, -1, 699, 531, 459, -564, -54, 102, 249, -287, -319, -103, 61, 224, 94, -718, -813, 213, -58, 409, 418, -322, 340, 270, 365, -58, -272, -279, 156, -294, -136, -32, -47, 206, 470, 252, -175, -153, -288, -98, -16, 102, -93, -125, 209, 120, -424, -42, -26, 421, -274, -304, -546, -213, 40, -11, 210, -102, 17, -270, -370, -341, -367, -216, 60, -453, 100, 126, 116, 100, 163, 487, 47, 425, -49, 548, 275, 431, 264, 135, -201, + -7, -124, 301, 90, 266, -235, -27, 450, -533, -302, 444, -719, -302, 57, -120, -355, 746, -128, 522, 204, -418, -66, -144, -529, -667, 551, 18, -200, 160, 10, -66, 199, 105, -72, -226, 47, 548, 438, -333, 141, 60, 408, -153, 275, -554, -147, 440, 131, -95, 477, -110, 334, -610, -756, -220, 18, -456, 556, 408, 519, -142, -46, -72, 52, 659, 474, 743, -660, -496, -1131, 487, -126, -966, -187, 92, 142, -361, 393, 332, 37, -4, 61, -160, -337, 74, -192, -315, -5, 733, 22, -111, -587, 247, 460, -239, -708, + -128, 236, 84, -153, 153, 47, 253, -75, 418, 637, 241, -430, 481, 212, -546, -586, 629, 299, -247, -290, -16, -523, 375, 487, -14, 17, 122, -76, 540, 169, 137, -242, 83, 165, 664, -181, 246, -531, -576, 458, -75, -100, -55, 317, -62, -125, -174, -240, -782, -81, -518, -1034, -1064, -471, -816, -381, -145, 124, 430, 479, 35, -289, 521, -293, 249, -1023, -114, -708, -477, 446, 312, 298, 91, 650, -82, -63, -497, -189, -111, -350, -346, -846, -337, -113, -146, -532, 439, 157, 257, -247, -98, -1272, -371, -368, 279, 617, + -406, -85, -739, -78, 365, -145, -256, 137, 528, 889, 184, 1, -59, -276, -376, 215, -249, 792, 152, 308, 1580, -349, -272, -338, -508, -229, -832, 498, 811, -454, 42, 193, -257, -52, -576, 2, -314, 876, 19, -150, 711, -163, 221, -783, 432, 134, 557, -241, 420, 716, 780, 435, 705, 359, -88, 672, -300, -430, -118, 273, 473, -1076, -52, -695, 578, 255, 9, 194, 800, 36, 716, 298, 1073, 95, -96, 460, 176, -537, 139, -65, -695, 501, -410, -705, -1409, 107, -153, 837, -446, 1122, 397, -28, -149, 425, 485, -822, + -326, -590, 227, -259, 569, -1, 133, 191, -119, 578, -330, -375, -366, 556, 308, 714, 226, 2144, -591, 41, 54, 1012, 446, 484, -605, 311, -214, 46, -257, 92, 753, -162, 268, 1399, 475, -598, -684, 108, 940, 490, 217, -324, 810, 151, -65, -817, 306, -113, 412, -742, -413, 58, -141, 118, -655, -8, -377, 217, 686, 518, 223, -961, 68, 109, -816, -772, -456, -418, -363, 702, 223, -14, 518, 727, 261, 630, 83, 418, 2756, -590, 498, 307, -340, 43, -1398, -66, 484, 1191, -447, 48, -678, -469, 249, 566, -550, 818, + 381, -894, 668, -314, -412, 40, -513, 218, -192, 834, -365, 50, 482, -1367, 276, 537, -370, 445, -809, 966, 163, 242, -1591, 1590, 709, 587, 100, -850, 936, 44, -362, 1633, -237, -568, -286, 291, 511, 529, 181, -145, -1733, -88, 523, 147, 735, -822, 1051, 228, 407, -826, -198, 295, 1327, -370, 377, -737, 882, 607, 846, -93, 414, 312, -830, -600, 550, 368, 1056, 173, 924, 193, -81, -1337, 1347, -211, -240, -435, -75, -1043, -1994, 777, 666, -28, -351, -778, -63, -198, -369, 877, -1767, -726, -893, -227, -1322, -66, -125, 14, + -146, -220, 319, 52, -527, -128, 84, -784, -353, -182, 168, 728, -226, 1389, -572, -22, 671, -507, 481, 157, -769, -1262, -193, 435, 1375, 629, -789, -297, -2541, -796, -21, 685, 1651, 50, -1370, 228, 1075, -154, 169, 1088, 1219, 2375, -2062, -199, 721, 964, -318, -475, -501, -721, -282, -808, 176, -336, -1930, 418, -342, 551, -543, -562, 28, -819, 124, -825, -28, -158, -328, 371, -614, -804, -729, -942, -165, -119, 1016, 208, -756, -1131, 138, -44, 257, -236, 614, -751, -296, -1047, -661, -316, 31, -454, 1068, -395, -914, 262, 1110, 782, + 332, -807, -506, -104, 1014, 1905, -7, 355, -358, -1916, -399, 144, 730, 1580, -869, -1122, 669, 272, -346, 20, -564, 341, -1548, -208, 132, 349, -795, 986, -1378, -1686, -1329, 561, 554, 1028, 1148, 357, -2022, -352, -1391, 635, 130, -2789, 204, -852, -1797, -1401, -2051, 1287, -614, -1618, -713, 536, -950, -829, -632, -379, -697, -706, -1295, -945, -1783, -1010, -891, -292, -820, -162, -364, -11, 107, 257, 550, -483, 468, 71, 980, 427, 635, 610, -1640, -421, 1425, -206, -778, -922, -634, 581, 2283, -108, 53, -1435, -1413, -271, 413, 1367, 20, 1256, + 563, -1388, 2752, 126, 2178, 90, -368, 1156, -1209, -1629, -782, -3386, -1876, -773, 1240, 1540, -301, -702, -1723, 2028, 1934, -1204, -1577, 10, 1733, -168, -100, -518, 1511, -144, -406, -12, 412, 803, 13, -553, -673, 966, 58, -367, -1012, 604, 297, -75, -804, 288, 318, 324, -519, -252, 63, 819, -255, 329, -1164, -260, -32, 804, -1613, -221, 114, 1198, -587, 243, -850, 181, 285, -480, -475, 13, 128, 429, -419, 111, -1468, 850, -303, 1410, -889, 686, -633, 714, 34, 514, 263, -909, 1054, 325, 528, -953, 219, -173, 125, -251, -604, -1326, + -1760, 1259, 830, -1010, -1434, -709, 643, 331, 859, 928, 169, -487, -153, 316, -338, -39, 179, 41, 511, 356, 144, -487, -34, -306, 289, -509, -447, 348, -131, -214, -216, -357, -491, 25, 369, 342, 278, -124, -409, -350, -256, 410, 553, -278, -421, -184, 455, 235, 616, -460, -193, 242, -142, 12, -91, 217, 112, 175, 14, -438, 153, 73, -43, 326, -201, -93, 31, -67, 17, -111, 476, 94, -138, 327, 391, -263, 598, -1455, -3828, -1409, 687, 1992, 4210, 2816, 725, 1066, -562, -1714, -2843, -2475, -1966, -568, 76, 1367, 1509, 3211, + 1561, 1027, -80, -687, -1546, -805, -1249, -1444, -886, -746, -54, 399, 1203, 740, 865, 781, 795, 1190, 104, 823, -152, -374, -1004, -602, -1498, -2211, -1928, 19, -327, 603, 1039, 565, 1603, 1394, 2026, 1148, 1374, 65, 70, -1084, -1765, -2069, -2477, -1634, -2025, -174, -5, 965, 1019, 2413, 1892, 2654, 1153, 1303, 634, 171, -1124, -1822, -1646, -1755 } + }, + { + {-192, 184, -148, 217, -44, -138, 42, 110, -52, 26, 101, -153, -105, -29, -94, 294, -117, 289, 83, 97, -39, -63, -103, -135, 3, 125, 10, 16, -77, 83, 115, 9, -64, -153, 102, -29, 117, -51, 21, 52, -86, 0, -150, 203, -3, 29, -19, -179, -47, -53, 14, 28, 104, 46, -71, -109, 52, -66, -34, 129, -72, 91, -128, 69, -148, 74, -99, -52, 149, 69, 80, -19, 13, 25, 43, 42, 234, 25, -63, -66, 41, -113, -2, -220, 158, 201, 140, 197, -236, 20, 54, -84, -65, -57, -277, -46, + 164, -283, -231, 135, 121, -181, -64, 121, 15, 147, 62, 153, -96, 30, 21, -39, 70, 57, 103, 45, -47, 11, 115, -30, -54, -18, -141, -307, 182, 91, -98, 137, -56, 17, -6, 65, -83, -19, 181, -170, -71, 62, 28, -25, -11, 82, 7, 72, -124, 123, 59, -150, 118, 12, 40, -13, -49, -99, 366, -208, 65, -231, 29, 56, -233, -295, 75, -320, 72, -82, -21, -195, -27, -220, -112, 2, -232, 250, 89, -387, 39, -20, -68, -165, 86, 203, 6, -13, 191, -109, 5, -69, 128, -145, 46, 179, + -151, 157, 58, 169, -11, 40, -21, -68, 223, -269, 67, -117, -47, -32, -94, -69, -211, -132, -28, 146, -5, 58, 205, 1, -162, -15, 16, 61, -72, 10, -153, 14, -52, 61, 95, 138, 55, -31, -44, 151, 22, -94, -309, -10, -189, -64, -36, -219, -36, -56, 99, 242, 243, 23, -113, 93, -248, -41, -99, 78, -366, 121, 54, -19, -110, -161, -77, -134, -117, 62, -31, -143, -47, 22, 228, -14, -244, 13, 96, -8, -81, 15, 83, -263, -26, -117, 175, 106, 25, -243, 22, 88, 141, 133, -162, -77, + 3, -52, -53, 124, -82, 76, 19, -102, -25, -139, 165, 63, -163, -110, 29, 86, -117, -143, -3, 30, -77, 33, 15, -517, 163, 145, 245, -68, 152, -446, -126, 136, 12, -222, -62, -75, -393, -159, 34, -20, -282, 171, 240, -254, 186, -332, -118, -30, 108, -2, -140, 90, 39, -22, 141, -71, -102, -29, -61, -97, 138, -110, 34, 110, -29, -85, -170, -17, -123, -33, -142, -33, 292, 10, 174, -163, 145, -43, -253, -139, 127, -83, -133, 96, -155, 129, 24, -37, 152, 153, 56, -147, -182, -2, 220, 53, + 30, -95, 28, -298, -284, -195, 9, -67, 84, -117, -23, -3, -101, -52, 43, -100, 282, -223, 118, -75, -45, -164, -63, -42, 199, -174, -4, 22, -243, -156, -174, -149, -278, -109, 66, 150, 84, -224, -311, -84, -17, -167, 1, -121, -175, -375, -204, -269, 116, -86, 89, -164, -372, -205, -10, -92, -141, -74, -164, 162, -12, 85, 114, 14, -35, -143, -24, 133, -57, -140, -191, 228, -241, -315, -228, -145, -188, 115, 187, -168, -99, 73, -562, 177, -39, 103, 310, 125, -76, 109, -233, 149, 168, -302, -67, -150, + 172, 157, 233, 279, -357, -176, 55, 312, -119, 150, -343, -94, -124, -63, -210, 60, -341, 242, -73, -49, 163, 1, 31, 192, -4, 160, 90, -29, -68, -7, -246, -159, -227, 1, 435, 119, 73, 5, -77, 12, 252, -41, 67, -499, 457, -98, -104, 45, 271, 124, -71, -159, 483, -81, -30, 170, -139, 16, 30, -81, 83, 85, 212, 9, -22, 254, 148, 282, -98, -55, 168, -241, 237, 267, -118, -12, -393, 29, 151, 122, -74, -266, -547, 18, -83, -257, 74, 187, -230, -95, -252, 142, 28, -31, -75, -107, + 298, 340, 143, 166, -61, -160, 478, 122, -65, -266, 215, 15, 281, -17, 344, 171, 246, 201, 115, 262, 336, -4, 75, -98, 12, 178, 89, 98, -267, -102, -43, -245, -220, -154, 148, 270, 364, 456, 115, 43, 328, -130, -200, -53, -109, 435, -404, -188, -50, 169, -377, 246, -371, 189, 5, 200, 318, -125, 291, 314, 303, -169, 257, -267, -207, -32, -158, -1, -134, 246, -172, 54, -170, -313, -137, -66, 389, -318, 309, 131, -430, 504, 136, 55, 366, 61, 28, -203, 11, -115, 417, 167, 297, -114, -52, 191, + 352, -357, 365, 59, -40, -71, -314, 154, -138, 62, 35, -307, 123, 249, -209, 155, 130, 347, 67, -30, 232, 277, 56, -164, 206, -134, -348, -248, 379, -484, 123, -257, 289, -307, 471, 165, 45, -407, 208, 348, 91, -208, -137, -118, 320, 178, -450, 67, -319, -14, 35, -267, 354, 361, -164, 83, 240, -291, -47, -86, -247, 526, -192, -111, -265, -432, -73, 15, -155, 72, -366, 40, 22, -64, 282, -51, -227, 126, -5, -157, 138, 629, -128, 159, 29, -405, -73, 389, 164, 388, -42, 232, -299, 151, 126, 59, + -242, 242, 92, -561, 40, -69, 329, -64, -749, 874, 114, 353, -613, 354, 457, -499, 208, 266, 209, -318, 56, 71, -99, 206, 410, -306, -253, -84, 350, 305, 425, -7, 187, -295, -68, -67, 80, 207, 539, 327, 204, 113, -5, 265, -81, -439, -76, 147, 156, -252, -189, -314, 75, -13, 126, -201, 396, 390, -315, 789, 46, -57, 6, -147, -25, -35, -303, 20, 10, 220, -643, 175, -222, 490, 582, 261, 246, 120, 58, 492, -71, -301, 303, 50, -229, 193, 294, 256, 155, 307, -397, -254, 30, -356, -100, -67, + 63, -97, -240, -291, -185, 132, 223, -425, 72, -50, -28, -510, -470, -84, -369, 161, -418, 22, 195, 304, -292, 363, 73, -38, -101, 542, -172, -28, -458, -245, 333, -26, 112, -417, -483, -122, -283, -41, -5, -164, -243, 136, -228, 26, -324, -151, -35, -478, 18, 336, 34, 184, 324, 616, -603, 119, -374, -308, -166, -183, -187, -95, 378, 580, 616, 680, -553, 12, 354, 274, -335, -613, -97, -113, -491, -292, 847, 44, 30, 304, -68, 116, -151, -372, 198, 168, -503, -693, -551, -435, -425, 15, 81, 176, -294, 233, + 27, -150, -311, -31, -20, -448, -370, 28, -114, 37, -296, 188, 27, -264, -561, -227, -216, -715, -260, 45, 302, -54, 364, -93, -78, -612, -171, 211, 64, -1011, 235, 65, -327, -191, -340, -342, -65, -15, -344, -147, 95, 205, 342, -335, -44, -131, 236, -212, 683, -596, -368, -127, -1120, -590, -7, -719, 548, -259, -234, 53, 1260, 599, 36, 248, -61, -351, -36, -537, -381, 168, 182, 213, -366, 453, 285, 513, -537, 70, 783, 57, 33, 137, -751, 173, -189, 104, -301, -730, -42, 265, 351, 67, -109, 27, -30, 209, + -534, -807, 141, -314, 468, -217, -192, 574, 139, 226, 50, -551, -210, -103, 277, 758, 614, -234, -709, -67, -108, 172, -456, -527, -255, 165, -481, -346, -1234, 522, 435, -153, -805, -152, -290, -306, 404, 491, -13, 159, -918, 370, -1157, -267, -69, 272, 634, 988, 431, -516, 164, 702, 125, 239, 398, -523, -179, -50, 208, -356, -173, -80, -257, -186, 446, 440, 144, 76, 729, -84, 365, -729, 560, 194, -653, 121, 275, -609, -33, -593, 271, 328, 348, -375, 24, 497, -296, 72, 11, 788, -349, 606, 349, -582, 676, -395, + 470, 591, -357, 355, -280, -242, -553, -403, -228, -62, 244, -966, -437, -456, 916, 64, 366, -105, 1284, 234, -795, 99, 952, -301, 241, -114, 116, -497, -685, 1182, 851, -277, 662, 282, 850, 961, -235, -183, 857, 638, 102, -225, -374, -394, 415, 760, 374, -99, 521, -224, 495, -175, 706, 1226, 940, -943, 474, -138, -368, 14, 366, 353, 2210, -197, 0, -333, -367, 445, 807, -176, 615, 526, -56, 28, -418, 437, 365, 1153, 1164, 1378, 572, -323, -331, -659, 543, -753, 154, -1146, 440, 456, 380, -384, 102, 218, -197, 664, + 142, -1630, 356, 186, -1206, 44, -215, 22, 428, -87, -1111, -227, -359, -95, 776, 904, -539, -171, -452, 192, -849, -1681, -590, -539, 84, -19, 745, -1170, 535, -311, -123, 409, 218, 725, 180, 242, 837, -1015, 1192, 878, 497, 816, -340, 262, -826, -245, -414, 650, -647, 66, -1392, -1828, 1157, -158, 747, -639, 493, -466, 100, -332, -1150, -503, -781, -553, 340, 1359, 504, -1507, -324, 171, -441, 14, 44, 28, -1057, 450, 449, 853, -522, 268, -589, -673, 197, 1155, 1915, -195, -203, -30, -116, -957, 1317, 595, 667, 497, -477, 409, + -859, -1204, -271, 769, 473, -481, -338, -134, 604, -51, 418, 407, 727, 188, -593, -569, 377, -631, -493, 151, 798, 728, -1028, -818, 387, 479, 1649, -507, -1056, -1092, 728, -742, 675, 776, 1676, 3687, -979, -618, -1568, -2424, -877, -1307, -35, 1398, -416, 622, 926, 514, -550, -1411, -2086, 641, -553, 178, -1201, -832, 81, -763, -2001, 428, -875, 746, 52, 392, 326, -1829, -1324, -677, -461, -466, -796, -278, -1276, -819, 504, -835, 1416, -1160, 36, 258, -198, 83, -146, 309, -429, -419, -150, 221, -135, 595, -694, 93, 843, 256, 45, 433, + -39, -423, -344, 717, 65, -1238, -640, -1012, -556, 1251, 1085, -1281, -261, -1451, -470, -156, 189, 667, -1300, 729, -1138, -211, -832, 1436, -475, 989, 785, 2093, -1203, 803, -158, 789, -97, 803, -1292, -708, 642, 348, 1074, 270, -1620, -647, -956, 181, -126, -2239, -944, -499, -1129, -665, -2247, -1888, -238, 967, -1179, -669, -64, -1003, -128, 18, -948, -181, 349, 158, -1299, -710, -686, -352, -377, -48, -862, 923, 667, 1275, 1845, 1585, 510, 1668, 761, 368, -573, 636, 701, 535, -56, -462, -125, 469, 825, 3679, 612, 809, 650, 1535, 688, 1349, + 2468, -1088, -2200, 326, 1574, 2667, 1260, -2263, 384, -560, 3357, 2380, 2880, 2519, -2112, -1297, 1506, 1757, -300, -2008, -1077, -575, -1699, 2737, 2221, -1916, 441, -50, 325, -84, -169, 692, -685, 672, -254, -17, 302, 199, 279, -28, -365, -286, 481, -395, -3, 389, -185, -282, -287, -661, -565, 406, -168, 117, -327, 22, -761, -209, 297, 470, -265, 50, 443, 513, -58, 408, -305, 1458, -479, 446, 169, 211, -185, 314, -55, 998, -65, 235, -645, 895, -400, -156, -13, 25, -156, 478, -545, 436, -476, 686, -686, 882, -494, -439, -277, -222, + 286, -453, -676, -1391, -1531, 1293, 323, -406, -2075, -836, 1148, 231, 827, 925, -340, -586, 22, 217, 165, 151, -371, -271, -209, -1, 554, 301, -33, 125, -167, -271, -178, -142, 5, 166, -132, 214, 219, -758, -342, -334, 402, 286, -29, -349, -481, 422, 89, 285, 386, -697, -470, 137, 567, 297, -802, -482, -650, -297, 171, 163, -263, 312, -115, -260, 134, 293, -190, 93, 8, -217, -1, -46, -523, -504, 21, -456, -310, 153, 102, -52, 469, 536, -1341, -3651, -1390, 832, 1757, 4151, 2436, 665, 865, -717, -1347, -2935, -1985, -1515, + -502, 605, 1610, 1260, 1563, 1522, 1022, -341, -1205, -1031, -1074, -849, -1243, 387, -790, 66, 563, 1069, 588, 1003, 1299, 36, 379, 41, -34, -720, -111, -638, -1285, -1991, -1132, -597, 145, 169, 1176, 1675, 1577, 1915, 257, 1264, 473, -91, -1186, -1118, -1570, -2010, -1411, -1554, -1024, 33, 466, 1161, 1794, 2687, 2069, 1904, 1019, -267, -274, -650, -1419, -606, -1334, -765, -739 }, + {-189, 174, -178, 136, -77, 35, -253, 140, 35, -8, -45, 107, -131, -28, -53, 111, -281, -79, -160, -74, 59, 43, 137, -218, 66, 23, 13, -89, -24, -116, -15, -159, 52, -176, -15, -150, -120, 25, -133, -169, -207, 55, -24, -41, 82, 61, -80, 2, 221, -113, -72, -169, -49, 96, 53, 54, -79, 69, -96, 11, -117, -13, 8, -123, -45, 18, -17, -138, -256, -109, -91, -36, -9, -58, -60, -11, 245, 156, 3, 6, 193, 46, -98, 63, 129, -68, -108, -389, 20, -133, 257, -131, 129, 100, -13, 80, + 143, 34, 34, -75, -83, -71, -105, 87, 57, -56, 86, -64, -83, -108, -47, -87, 10, -6, -12, 169, -99, 136, -49, -45, 100, -69, 34, -70, 110, -42, -297, 79, 15, 26, 156, 66, 16, -47, -94, 244, -131, 86, 58, -123, 114, 31, -121, 81, -125, -13, -10, 85, 20, 86, -32, -215, -39, -46, 473, -227, 31, -10, -9, 111, -80, -332, -306, 151, -94, -24, 84, 22, 83, 92, -143, 84, 60, -100, 128, 189, -116, -35, 14, -195, -85, 25, 243, -34, -8, -194, 123, 5, -172, -71, 68, -22, + 40, -149, 2, 16, -56, 170, 48, 42, 166, -11, 214, -64, -255, 112, 111, -86, -32, -25, 42, 19, 83, -52, 59, -134, 6, 104, -124, -5, 96, 39, -54, 61, -31, 32, 143, 70, -123, 206, 94, 76, -11, -109, -269, -28, 34, 306, -110, 263, 70, -5, 21, 236, -49, -59, -62, 167, 337, 91, -223, -306, -436, 62, -109, -182, -96, -284, 5, -129, 28, 142, 152, -160, -140, -100, 26, -240, -19, 80, -103, -36, 34, 103, -129, 40, 331, -9, -6, -114, 144, -55, 22, 107, 144, 204, -20, 35, + -48, 3, -21, 32, 323, -338, 23, 74, 200, -68, -73, -10, -66, 257, -112, -296, 2, -69, -97, 70, -202, 85, -25, -502, 190, -155, 214, -188, -15, 149, -289, -48, 91, -77, 427, -176, -51, -168, -140, 220, 245, 96, -283, -343, 322, 56, -321, 123, 15, 155, -93, 148, -190, 96, 315, 131, 137, 73, 9, -78, 69, 26, -210, 6, -64, -154, -152, -57, 127, -222, 35, -160, -12, -23, 79, 136, 287, 102, 3, 124, -145, -219, 2, 55, 30, 272, -53, -28, -77, -33, 48, 136, -23, 58, -111, 201, + -29, -57, -8, -262, -69, -174, -27, 324, 204, 139, -36, -305, 31, -204, -322, -114, 215, -187, -287, 61, 14, -149, 19, 147, 33, -380, -115, 221, 263, 125, -316, -123, 129, -64, -76, 8, 92, 4, 27, 301, -10, 177, 137, -16, -152, -17, -94, 173, -118, -193, -11, 279, 5, 276, 145, 12, 176, -48, 392, 15, 187, 210, 8, -207, -43, -246, 100, -184, -108, -173, -117, -96, 55, -5, 86, -36, -154, -118, -3, 89, 25, 303, -458, -86, 380, -191, 68, -297, 127, 537, -76, 27, -26, -381, 28, -25, + 567, -180, -31, 249, -161, 354, -243, -36, -365, 408, 1, -160, 0, 150, -194, 284, -35, 252, -7, 133, -400, -252, -190, -57, 232, -355, 184, 150, 43, -145, -222, 494, 90, -52, 183, -170, 95, -227, -236, -90, -162, 535, 148, -100, -168, -196, 156, 144, 39, -180, -35, -68, 214, 27, 166, -405, 210, -23, -13, -28, 66, -116, 0, -9, -49, 180, 82, 146, 34, -12, -74, -258, -90, -171, 83, -23, 354, -323, -411, -115, 110, -138, -110, 299, 49, -188, -214, -221, 328, -187, 217, -127, 238, -268, 41, 373, + 118, -545, 107, -4, -83, -63, 39, -80, 36, -103, 26, -39, -253, 219, 226, -90, 252, -248, -57, -85, -127, 278, -232, -398, -231, 51, -327, -308, -164, -119, -218, -39, 231, 242, 17, 257, 66, 6, 165, -235, -68, 6, -189, -50, -167, 594, -287, -276, 194, 484, 97, 437, 250, 397, 177, -69, -175, 145, -290, -218, 330, 279, 686, -12, 97, -248, 266, 126, -303, -66, 389, 5, -426, -166, -240, -76, 239, 225, -161, -72, 297, -281, 132, 257, 299, -153, 257, -102, -390, 144, 355, -88, 101, 94, -123, 51, + 105, -104, 37, 297, -174, -83, 263, -50, -58, -435, -161, -260, -445, -289, 214, -137, -194, 382, 364, -91, 380, 154, 219, -73, -159, 228, -296, -317, 433, -70, 988, -404, -190, -20, 242, -135, -133, -404, -469, 215, 41, 651, 210, -64, -74, 434, 440, -361, 263, -345, 90, -147, -181, -104, 72, -54, 226, 116, 253, -30, -126, -239, -51, 281, 20, -371, -52, 91, -165, 294, 242, 51, 79, -812, -319, 281, -29, 452, 116, 510, -70, -283, 260, -162, 170, 24, 728, 606, 51, 160, -128, 226, 229, 255, 264, 452, + -55, 44, -218, -194, 7, -239, -527, -405, -855, 676, -19, 78, -237, 380, -814, -520, -165, -207, -20, -726, 142, 18, -20, -329, -339, 142, 464, 77, -621, -129, -509, 407, 258, 27, -225, -99, -115, 338, -47, 2, -72, -439, 234, 326, -188, -89, 246, -476, -355, -525, -181, 152, -341, -147, -11, -539, 175, 365, 616, 111, -54, 63, -393, -287, 477, -2, -165, -75, -699, -344, 158, -106, -61, -3, 497, -19, -404, 106, 391, 67, -160, 110, 107, 476, 440, 174, 730, -293, -122, 137, -159, -32, 256, 778, -96, 175, + 22, -25, 15, 855, -376, 454, 24, -525, 211, -521, -301, 335, -255, 243, 43, 51, 405, 320, -416, -487, -348, -107, 181, 169, 91, 123, -575, 116, -290, -747, 564, -129, 534, 550, 73, 221, -238, -319, -562, 165, 604, 125, -194, 61, -71, 114, -272, -236, -268, 90, 23, -70, 426, 364, 266, 563, 146, -443, 753, -344, 52, 12, 47, 675, 760, 200, -1344, 79, 419, -424, 307, 580, 58, 179, 378, 297, 134, 524, 143, -38, 959, 375, 153, 431, -274, 523, -312, 0, -6, -83, -476, 201, -326, 692, -25, -99, + 1005, 161, 176, 355, 71, 218, -183, -392, -13, 318, -466, 614, 561, 421, 138, 265, -310, -326, -534, -217, -271, -258, 175, -19, -519, -210, 531, 31, -420, 302, 18, -273, -705, 97, -1083, 703, -331, 636, 80, 196, 74, -150, 373, 958, 98, 266, 359, 263, 728, -1047, 385, -621, 493, -273, -454, -141, -520, -226, -134, 164, 206, -160, 695, -48, -148, -110, -676, -84, -22, -560, 151, -479, -615, -201, 329, -985, -688, -451, 24, -691, -608, -477, -263, -196, -116, -466, 468, 83, -74, -346, -381, 669, -607, -395, 150, 183, + 215, -332, -495, -190, -111, 230, -360, -122, -160, -385, -707, -847, 804, -875, -65, 95, -167, -128, -798, 351, -172, -726, -29, -103, 637, 263, 421, 550, -923, 1051, 161, 97, -190, 528, 2, 875, -246, 596, 324, -887, 376, 128, 413, -87, -234, -365, -129, 408, 939, 80, -137, -616, 225, -666, -100, 624, -584, -25, 44, -129, -218, -279, 1045, -256, -252, -160, 241, 314, 136, -20, -207, -43, 161, 590, -140, 859, 534, 221, -213, 738, 902, -130, -234, -107, -289, 25, -286, 382, 154, 575, 501, -881, -905, 988, 789, 24, + -171, -530, -606, -356, 489, -662, -552, -177, -190, -782, 443, -410, -151, -107, 66, -11, -605, -1700, 812, -831, 301, 1170, 155, -525, 317, 391, -201, -403, -106, -849, 245, -881, -549, 321, 7, 125, -803, -181, -588, -498, -719, -264, 207, -434, -447, 383, 26, -57, 99, -817, -79, -640, 498, 123, -1540, 358, 778, -195, 452, 384, 243, 198, 743, 585, -9, -576, -148, 590, 366, -534, 6, -619, -223, 22, 406, 565, -1098, -856, -496, 84, -328, -123, 901, 159, 161, 559, -90, 120, -124, 578, 559, -910, 218, -177, -224, -192, + 650, 359, -436, -235, 500, -833, 70, 340, 500, -74, 126, -975, 16, -416, 356, 153, 577, -853, -426, -98, 128, -45, 191, 95, 500, 939, -556, -709, 214, -740, -210, 359, -544, -511, 64, 373, 491, 373, -192, -9, -965, -624, 893, -566, 1200, -459, 259, 217, 10, -822, 1106, -459, -82, -147, 446, 868, -806, -420, 998, -664, 25, -212, 236, 1148, 17, -83, -596, 659, -511, 281, 177, -114, 65, 555, -596, 189, 524, 521, 1155, -706, 1062, -165, -670, -651, 187, 457, -288, -119, -457, -173, 900, -604, -45, 735, -218, 449, + -272, -112, 768, -2, 50, 754, 517, 204, -79, 643, 851, -829, 801, -729, 410, -517, 124, 683, 232, -1446, 665, 453, 4, 784, -1165, -190, 807, 718, 122, 1110, -561, 56, -128, -118, 467, 240, 810, 722, -488, 503, -914, -223, 95, 24, -46, -82, -1377, -677, -1018, -568, 767, -136, -43, 362, 1324, -379, 337, 887, -512, 333, 432, -667, 70, -817, 291, -102, -440, 616, 5, 970, -74, -758, 1237, -244, 112, 153, -1188, 333, 998, 339, -453, -791, 66, 164, 850, 533, -296, -193, -688, -20, 963, -1358, 388, 901, -853, 277, + 70, 290, 960, 293, 359, -216, -980, 957, -206, -549, 2064, 985, 509, 46, 21, -1030, -833, -417, 580, -78, -603, -464, 735, -542, 489, 225, -433, 477, 179, -890, -482, -582, -38, 303, -1008, 43, -730, -1105, 1279, 2132, -353, -69, -1745, -584, -1283, -854, 1193, 88, 326, -986, 322, -865, -1952, 289, 941, -73, 123, 1015, -1339, 1535, 765, 483, -756, 1034, 1986, -388, 616, 1513, 1275, 2251, 491, 814, 615, 555, 1932, -493, -225, 721, 427, -199, 1066, 75, 230, -617, -1713, 80, 1156, 190, 705, -1227, 89, -1636, 15, -1757, 137, 1267, + -141, -504, -1671, 2243, 426, 180, 2328, 8, -492, -342, 158, 495, -56, 55, -60, -1000, 835, 17, -149, -139, 192, -606, -2160, 175, 3080, 506, -546, -515, -1304, -829, 110, 1949, 401, -1188, -20, 580, 194, 106, -53, 396, -827, -268, 530, 1112, 1124, -923, -309, 146, 213, 335, -1067, 181, 260, -230, 895, 62, 1023, 1498, 759, 367, 699, -737, 813, -580, 1178, 2017, 719, -973, -825, 957, 403, 1735, 1329, 460, -227, -292, 137, 168, -488, 727, 653, 193, 1588, 1114, -42, 823, 914, 477, 919, 133, -1268, -52, -182, -241, 1502, 681, + 329, 1056, -64, -491, -2169, -505, 1130, 594, 2535, 97, -432, -1203, -2330, -2537, -476, 1034, 1145, 735, -1324, -1703, -79, -241, 596, 1702, 814, -198, -1116, -1448, -965, 25, -950, 307, -811, -390, 1071, 927, 762, 304, -1284, -361, -1236, -904, -559, 645, -233, 687, 1645, 1805, -880, 185, -1475, -950, -774, -142, 118, 1037, 992, 1537, 960, 372, -933, -741, -343, 471, -1461, 57, 1298, 1149, -527, 1551, 1198, 741, 1275, -2743, 340, -906, -1248, 175, -908, -240, 1190, 1039, 381, -3343, -3835, -4148, -4196, -5803, -46, -1874, -392, 1130, 2361, 3186, 3272, 6360, + 6792, 5590, 4234, 4470, 4272, 1837, -289, -2424, -2436, -3895, -1072, -1978, -1409, 130, -3277, -740, -2902, -587, -3385, -3174, -1333, -2585, -45, -1188, -1092, -1888, -1183, -2983, -2057, -994, -911, -1507, -870, 41, -1230, 602, 2174, -1486, 2524, 1542, 3300, 3300, 2850, 3489, 2904, 4799, 4722, 3706, 4965, 4176, 6451, 6253, 7302, 5397, 5610, 5823, 4808, 5552, 3272, 4857, 3048, -601, -503, -2297, -2736 } + }, + { + {-105, -70, -93, -114, -107, 107, -248, 29, -44, -87, 223, -72, -66, 143, 22, -106, 34, -43, 38, 29, -18, 117, -39, -123, -10, 37, 61, 77, 2, 47, -31, 174, 118, -130, -74, -62, 51, -91, -107, 126, -54, -2, -11, 34, 114, 104, -48, -30, 81, 38, 25, 9, 68, -97, -64, 7, 58, -70, 49, -123, -8, 86, 62, -42, 73, 9, 102, 38, -48, 138, 180, 66, -32, -7, 4, -91, 156, -11, 61, 21, -145, -110, 32, -100, -145, 76, -21, 16, -85, 55, 2, -130, -10, 139, 113, -95, + -162, -149, 17, -38, -32, -128, 129, -41, 34, -61, -38, -18, 47, -42, -74, -275, 88, -26, 83, 46, 33, -13, 176, 28, 32, 19, -95, -65, -12, 7, -95, -28, 33, -19, -90, -53, 0, 78, -136, -188, -226, 71, 125, 5, 103, 69, 11, -212, -10, -62, -72, -6, 15, 69, -12, 82, 61, 95, 125, -31, -3, -183, 160, -209, 78, 348, -77, -131, 18, 181, 17, -53, -28, -53, -36, -165, -67, 80, -133, -75, 5, -8, 141, -88, 24, -34, 28, -18, -87, 159, 268, 69, -19, -51, 290, 14, + -127, 9, -223, 1, 110, -167, -26, 37, -139, -39, 150, 23, -21, 151, -104, -156, 84, 61, -115, -52, -123, -135, -154, -79, -91, 123, 79, 27, -10, -78, 70, -14, -56, 95, 91, -59, -23, -4, 4, 177, -262, -173, -64, -39, 7, 32, -250, 171, -80, 55, 34, 56, 107, -2, -38, -84, 177, -16, 114, 219, -50, 186, 158, -140, 91, 92, 99, -246, -26, 13, -78, -155, 1, 178, -44, -78, -62, 54, 165, 81, -87, -3, -72, 6, -24, -84, 154, -202, -168, -154, 46, -22, -7, -189, -200, 48, + -6, 11, -21, -11, -149, -88, -164, 31, 137, -44, 121, 23, 105, -227, 0, 19, -73, -36, 24, -82, 29, -11, 160, 251, 22, -86, -201, 102, 68, 65, 264, -161, 12, 39, -41, -77, 44, 24, 161, 351, -25, 67, 149, -55, 133, 231, -151, 2, -54, 5, 104, -166, 192, 50, 6, 107, -13, 145, -72, -23, -36, 224, 102, 145, -24, 121, -208, 250, -93, 103, -220, 97, 160, 303, 107, 63, -196, -67, 51, -139, -178, -34, 343, 410, 71, 100, -123, -48, 210, 42, 79, -7, 41, 61, -47, 75, + -93, 180, 15, 31, 249, -191, -225, 378, -84, -50, 253, 153, 30, -414, 469, -75, -45, -39, -12, 26, 42, 151, 227, 148, -16, 247, 167, 85, 80, -80, 125, -164, 154, -19, 75, -138, -194, 34, -8, 85, 147, -56, -182, -111, 71, -235, 179, 56, -364, 182, 51, 108, 50, 68, 92, -8, -82, -86, -235, -185, -76, -125, 4, 27, -157, -262, -1, 194, 349, 4, -153, 58, -245, 41, 40, -33, 297, 298, -411, 218, -75, -144, -113, -137, -194, 385, -481, 119, 121, 163, 241, 43, 70, 94, 68, 54, + 84, 213, 41, -110, 4, -15, -145, -130, 73, 145, 154, 25, 111, -247, -25, 2, -10, -234, -139, -80, 161, 146, 2, -256, 6, -135, -97, -45, -66, 171, 229, 75, 238, -365, -255, 132, 82, 21, 56, 33, -114, -224, -154, 134, -96, 201, 197, -56, 188, -267, -125, -61, -80, 37, 486, -37, 141, -34, -78, 8, 431, -75, 18, 185, -398, 284, 147, -222, 259, 289, 101, -430, 276, 18, -35, 228, 244, -7, -65, 14, -164, 166, -87, -154, -334, 87, -363, 107, -85, -34, 112, -293, -118, 258, -16, -109, + 159, 19, -126, 122, 47, 20, -51, 96, -177, -10, -261, 263, 258, -304, 216, -214, -79, 229, 310, -10, -145, 104, -13, 57, -364, -279, 66, 68, -72, -60, 106, 7, -120, 174, -128, 63, 117, 10, 164, -123, 123, 28, 119, 53, -153, 300, -101, 147, -300, -19, -78, -271, 11, 195, 344, 451, -255, -4, -318, -21, -202, 184, -190, -373, 25, -238, -22, 315, -185, -181, 334, 14, 57, -31, -197, 88, 71, 408, -279, 203, -237, 64, 78, -228, -144, 392, 105, -282, -76, -99, -232, -3, 378, 210, 262, 68, + 104, -339, -52, 448, 33, -265, 144, 154, -203, -166, -99, -443, -72, 145, 220, 396, -101, -189, -47, -106, 275, -90, -256, 174, -689, -481, -315, 16, -581, 65, 399, 119, 411, -250, -126, -66, -243, -103, -355, 577, 320, 219, -524, -117, -183, -347, 93, -54, 86, -427, -49, -56, -314, 150, 27, 279, 98, -270, 371, -207, 137, 62, -27, 291, 266, 52, -400, 436, -257, 306, 124, -192, -216, 346, 27, -66, 68, -336, -141, 155, -57, 300, -220, -321, 87, 55, -26, 294, 101, 32, -249, 196, 42, -211, -86, -73, + -164, -115, -86, 85, 131, -408, 584, 251, 665, -276, -335, 636, 35, -48, 150, 64, 377, 500, 77, -433, -706, 117, -186, 60, 33, -295, -8, 409, 333, 269, 516, -97, 439, -284, 389, 141, 303, -180, 526, 313, 386, -584, 5, 561, 318, 114, -123, 835, 352, -307, -193, 214, -309, -17, -147, 55, 690, 733, 524, 203, 4, 280, -243, -53, 289, -300, 719, 457, 345, 140, -46, -350, 407, 3, 338, -171, 106, -260, -155, -42, 57, -233, 508, 701, -42, -349, -157, -275, -10, -440, 114, -380, 215, 45, -99, -301, + -351, -541, -553, -170, 487, -42, -310, 124, -295, 224, -250, 446, -457, 102, -321, -344, -53, 50, -88, 206, -657, 262, 77, -169, -33, -52, -316, -539, -553, 401, 220, -230, 373, 4, -127, -426, -857, -731, 436, -133, 37, -92, -12, -46, -563, 223, -667, -377, 72, -21, -106, -92, -43, 735, -165, -215, -128, 751, -57, -259, 477, -283, -134, -106, -110, -652, -1043, -789, -453, 900, -51, -157, -116, -78, -303, 314, 244, 804, -752, -153, 227, -554, -222, -201, 931, -21, 213, 468, 40, 450, -497, -630, -418, -123, -108, 65, + 290, -23, -524, -370, -28, -289, -588, 515, -88, -303, -4, 159, 166, 88, -265, 43, -545, -249, -809, 370, 246, -107, -253, 289, -402, -114, 875, -103, 741, 320, 200, -204, -928, -398, -176, -513, -372, -250, 414, -201, 4, -358, 707, -256, 273, 232, -409, -43, 372, 604, 40, -240, 397, 257, 1191, 106, 78, 465, -442, -282, -35, 161, 248, -67, 541, -222, 132, 518, 268, 237, 232, -259, 129, 63, -95, 142, -173, -352, -156, 109, -352, 619, 28, 131, -6, 452, 491, 0, -242, 52, -29, 580, 709, -370, -240, -144, + 232, 562, -351, 232, 56, 192, -145, -200, 171, 411, 138, -284, 431, 1132, -247, 302, 11, 196, 492, 236, 568, 523, 13, 719, 1149, 232, -257, 1083, 196, 1176, -121, 146, 256, -659, -183, 1150, 228, -460, 194, -335, 185, 263, -49, -530, -180, -817, 400, 354, -297, 381, 542, 162, -101, -450, 151, 876, -357, 551, 499, 138, 382, 391, 45, 473, 300, -707, -82, -242, 820, 598, -528, 414, -39, 495, 1345, -46, -201, 213, 1210, 572, -53, 238, 234, 776, 624, -323, 744, 429, 689, -378, 86, 239, 156, 525, 632, -290, + -308, 610, 260, -41, -153, 125, 739, -1178, 337, -285, -315, -270, -257, 185, 243, 253, -304, -370, -952, 45, -527, 874, 116, -227, -119, 522, 162, 848, 355, -224, 48, 175, 401, 635, -702, -627, -115, 1069, -315, 129, 324, 461, 590, 806, 725, 50, -149, 751, 80, -502, 281, -469, 349, 63, -379, 348, 1460, 778, -482, -408, -26, -425, -368, -370, 275, -224, -308, 43, 424, 201, 162, 526, 183, -178, 629, 457, -400, 242, -454, -432, -391, -71, -973, -365, 669, 426, -108, 304, -364, 350, 287, -470, -186, -1054, -60, 929, + 38, -633, 133, 59, -417, 629, 374, -212, 197, 302, 397, 236, 91, -237, 172, 245, 602, 890, -208, -546, -277, 196, 206, 739, -242, -519, -403, -408, 883, 1602, 598, 114, 1749, 140, 743, 444, -113, -321, 338, -447, -291, 390, 59, -992, -1036, -223, 487, -512, -661, -336, -475, -374, 409, -242, -744, 419, 88, -165, 249, -102, 467, 1654, -872, 892, -916, -443, -247, -88, 564, 341, 580, 37, 885, 573, 519, 755, -855, 345, -896, -25, 1201, 1067, 464, 27, 219, 145, -326, 285, 356, -1486, 106, 230, 469, -539, -828, 627, + 307, 166, -345, 741, -88, 577, 488, -49, 87, -159, 592, -336, 191, 353, -16, 743, 441, -36, 392, 434, -9, -329, -1107, -204, 134, -662, 78, 532, -1008, -452, 169, -439, -59, 535, 41, -384, -488, 215, 222, -1040, -341, -96, 5, 628, 303, 56, 1065, -171, -83, -1, -510, 192, 40, 706, -274, -1048, -913, 180, -466, -138, -703, -875, -924, -601, 673, 920, 32, -734, 66, 48, 17, 358, 585, 593, 20, -361, -926, -519, -810, -159, 8, 85, 88, 131, 227, 307, 550, -843, 379, 168, 191, 479, 817, 935, -529, 427, + -731, -209, -664, -46, -261, 1541, 535, 1116, 40, -570, -261, 723, 752, -429, 1395, -571, 75, 79, 230, 532, 1546, -96, 362, 882, 173, -678, 399, 1564, -314, -329, -837, -95, 469, 248, -247, -615, -360, -124, -160, 309, 1422, -73, -7, 604, 118, -1963, -616, 1394, 465, -409, -779, -110, -513, 718, 376, 135, -411, -928, 203, -1600, -192, 783, 1073, -123, -902, -617, -1866, 551, -318, 735, 561, -530, -379, -1659, -1240, 653, 1780, 711, 851, -585, -1041, -1005, -410, 1511, 2040, 1064, -2340, -855, -1788, -956, 2259, 557, 518, -283, -2132, -1748, + -1743, -311, 201, 1136, -381, 874, -1670, 1092, 474, 165, 2167, 199, -129, -21, -2450, -666, 83, 76, -897, 1562, 638, 687, -2060, 348, -2848, -670, -66, 341, 102, -1840, 909, -548, -382, -389, -441, -490, -615, 1119, -398, -1058, 258, -336, 59, 513, -1201, -457, -136, 426, -18, 1238, -178, -786, 1632, -1489, 771, -1384, -513, 603, -1157, 31, 711, -458, -169, -128, 934, 1496, 814, -567, -295, -288, 15, 450, -290, -354, 212, 113, -2886, -159, -197, 361, 252, -29, -95, 747, -980, -278, -207, 515, -2193, -331, 1574, -599, -430, 169, 706, -505, + -416, -725, -2091, -1729, 1430, 1209, 74, 1294, -1510, -137, -2872, -1057, -543, 1316, 1205, 710, -1179, -446, -90, -599, 230, 439, 606, 803, -692, 424, -1259, -832, -228, -319, -1, 750, -997, 774, -403, -597, -242, 18, -1241, -88, -1124, -472, -450, -1105, 1411, 596, 304, 288, -296, -1526, -2187, -1331, -1290, 805, 197, 872, 1294, 1012, -355, 198, -748, -632, -678, 484, -713, -85, -673, -752, -412, 787, -615, -178, 17, -251, -934, -846, -117, 889, -267, -2867, -3956, -3724, -3540, -4273, -567, -1045, 969, 1451, 4169, 2754, 3557, 4852, 5297, 3689, 4623, 2725, + 1347, 10, -676, -951, -1726, -1664, -2401, -897, -791, -2220, -1649, -1537, -1813, -3000, -2032, -1494, -1214, -2279, -224, -570, -908, -2210, -2086, -1650, -1450, -975, -377, -1371, 497, 900, -1133, 1428, 1866, 1857, 3212, 2679, 1990, 2258, 2171, 2221, 3277, 3764, 3586, 2480, 3826, 3840, 3866, 3977, 4360, 3822, 3809, 5132, 1997, 1872, 1738, 1111, -1990, -564, -610, -2564, -1856 }, + {56, 47, 37, 85, -26, 8, -37, -126, -236, 50, -90, -127, -171, 42, 33, 128, 36, 152, -21, -224, 85, -118, -14, 49, -94, -146, 21, -95, -14, -48, 88, 88, 29, -209, -44, -80, 162, 34, 50, 189, 91, 85, -2, 51, 297, 146, -49, 14, -141, 102, -7, 16, -174, -23, -92, -120, -47, 132, 103, 1, 2, -115, -106, -40, -108, -227, 118, -95, -17, -211, -51, 112, 65, -17, -45, -196, 240, -22, 95, 46, 112, -210, -115, 130, 61, -2, -119, 20, -324, -209, -15, -126, -143, 54, 247, 39, + 187, -47, 185, -115, -105, -15, -174, 31, 81, -64, -8, 42, 4, 75, -13, -184, 61, -115, -89, 49, -116, -172, 165, -180, 157, 149, 95, -9, -213, -123, 20, -40, 266, -165, 62, -21, 32, -204, -343, -59, -105, -113, -30, 146, -34, -151, 132, 60, -67, 113, -18, 41, -135, -13, -39, 7, 37, 128, 127, 16, 232, -5, 98, 124, -5, -117, 9, -166, -212, -82, -242, -248, -84, 159, -62, -58, -132, -34, -228, 108, -67, 54, 130, 44, -51, 91, 83, -110, 71, 9, 16, 81, -200, -85, 133, -89, + -11, -57, 148, -197, -21, -164, 102, -9, -17, 149, -70, -71, -57, -138, 5, -62, -17, 11, 89, 98, 27, -40, -170, -266, -89, -16, -72, 148, -63, -78, 107, -66, -116, 238, -49, -97, -19, 14, -27, 281, -165, -74, -118, 110, 27, -4, 205, 56, 65, -277, 60, -124, -147, -192, 4, 17, 246, -186, 97, -72, 303, -97, -91, 221, -74, 83, 38, -3, 41, -130, 29, 18, 66, 289, 103, 38, -112, 109, -210, -48, -35, 131, 107, 180, 116, -113, -179, -67, 147, -3, 79, -15, -15, 298, 73, -6, + -331, -134, 15, 134, 186, 272, 149, -42, 53, -42, -78, 202, -102, 204, 21, -127, 60, -52, 150, 32, 141, -37, -26, -55, -169, 4, 119, 117, 223, 100, -295, -249, -214, 5, -37, 12, -117, -76, -18, 86, -1, -193, 204, -33, -189, 34, 46, -8, -17, 77, 109, -72, 167, 3, 99, -230, 163, 52, 95, -160, -14, 107, 101, 240, -5, -345, -88, -169, 85, 49, -8, -97, 32, -146, -42, -260, -141, -15, 150, 150, -103, -104, -88, 155, -43, -27, -229, 140, -219, -83, 13, -52, -30, 207, -19, -18, + -105, -23, 59, -97, 116, -109, -9, 165, 306, 210, 37, -255, -195, 58, -52, -166, -62, -211, -98, 402, 37, -51, -87, -7, -106, -73, 266, -294, -45, 21, -72, 65, 156, -84, -106, 36, -129, -121, -279, -105, 60, -246, -53, 113, 167, 58, -388, -119, 62, 183, -161, 321, -52, -171, -107, -76, -144, 172, -148, -40, -191, -142, -81, -144, 171, -73, -395, 139, 233, -2, 69, -450, 318, -6, -284, -7, -176, -46, -350, 64, -261, 254, 56, -114, -213, -365, -165, -268, 77, 480, 73, -141, -18, -81, -86, -235, + -156, -242, 52, -31, 40, -94, 28, -256, -26, 41, -173, -75, 12, -104, 15, -98, 355, -460, -87, 21, 112, -62, -191, -289, -201, 130, -46, 146, -145, 404, 48, -99, -11, -268, -327, -180, 116, -292, -22, 302, -14, -171, -309, -535, 17, 244, -77, 283, -31, -116, -191, -187, 23, 87, -91, 324, 84, -127, 61, -77, 291, -125, -332, -90, -247, -129, -106, 356, -86, -118, -146, 229, 208, 181, 503, 524, 246, 326, -119, -151, 221, 321, -135, 141, 104, -280, -260, 155, -34, -5, -259, -336, -75, -273, 312, 572, + 124, 224, 71, -71, 211, -396, -99, 78, 224, -133, -311, 458, 5, -147, -107, 184, -51, 163, -110, 259, -16, -14, 333, 94, 157, 50, -45, 235, -369, -161, 144, 407, -252, -43, -50, -80, -167, -46, -58, -106, -33, -62, 217, -197, -72, 197, -139, 90, 150, -272, -291, 94, 237, -69, 217, -143, -59, 407, -444, 281, -121, 12, 20, 501, -102, 107, 164, 281, 166, 247, -32, -28, 85, 48, 47, -227, 377, -482, -101, -119, 283, -44, 343, -4, 40, -574, -152, 369, 615, 7, -292, -241, 259, 213, 160, 156, + -249, -105, -139, 93, 22, -144, 105, 97, -62, -65, -341, -75, -114, 524, 66, 119, 201, 39, -334, 59, -162, 203, 361, 191, -389, -164, -160, 47, -44, 523, -91, -4, 324, -333, -247, -313, -326, -97, -33, 112, 562, -78, -358, 580, -12, 144, 391, 260, 363, -126, 282, -222, 381, 327, -118, 158, -185, -178, 130, 435, 185, 155, 42, -176, -280, -289, 18, 288, -209, -252, -298, -134, -567, -158, 79, -430, 167, -4, -209, -501, -340, -34, -648, 159, 108, -51, 143, 74, -92, -364, -229, -81, -238, 138, -238, 419, + -344, -65, 171, 52, -144, -750, 273, 353, 615, 6, -446, 136, 224, -460, -482, -296, -7, 269, -9, -182, -5, -158, -108, -292, 508, 404, 152, -608, -182, 110, -32, -127, 785, 298, 248, 242, 373, 290, 69, 304, -19, -473, 264, -487, 153, -482, 418, -117, 504, -261, 121, -208, 180, 310, 768, 178, -983, -37, -140, 226, 424, -71, -195, 331, -61, -137, 415, 44, -26, 40, 173, 356, 256, -268, -217, -155, -286, 81, -26, 316, 146, -312, -47, 822, -315, -553, -178, 211, -138, 393, 572, -235, 525, 334, 263, -92, + -65, -111, 509, 88, 60, -303, 128, -162, -15, -498, 331, -458, 1, -326, 531, -281, 10, 517, 398, 260, -34, -219, 243, -19, -49, -685, -202, -419, -332, -271, -124, 334, 216, 187, -2, 496, -276, 525, 474, 493, 893, -370, -278, 370, 67, -375, 532, -208, -271, 143, -79, -226, -170, 190, -332, 91, -214, 421, -232, -67, 92, 287, 335, 7, -519, -747, -802, -683, -65, 104, -478, -12, 6, 684, -501, -566, 139, -256, -35, -421, 337, -427, -566, -352, 578, -449, -378, -109, 213, -213, -477, 108, -215, -26, 163, -609, + -82, 293, 478, -106, 751, 319, -129, 8, 320, -175, -362, 35, 387, 22, 164, -15, -392, 97, -811, 46, -1, -121, -497, -435, 7, -210, -355, -229, -294, 274, -551, -308, -191, 203, -343, 607, -138, -536, -89, -323, -845, -239, 28, -9, -476, -223, -193, -183, -298, 607, 544, 178, 1094, -178, -358, -314, -141, -557, 799, -445, -156, -355, -181, -153, 106, -525, 22, 33, -64, 185, -571, -119, 411, -367, 32, -482, 502, 35, -866, -421, -150, 15, 250, -497, -292, 401, -57, 290, 237, 268, -315, 76, 390, 184, -720, 508, + 337, -346, 1109, 26, -798, 268, 249, 32, 589, -131, -994, 332, 134, 350, 341, -397, 704, 327, 209, -113, 1064, -22, 9, 783, -132, 344, 548, 258, 163, -55, 344, 229, 225, -758, -745, 1553, 506, -956, -478, -433, -877, -56, -459, 653, -357, 14, 809, 28, 140, -580, 746, 563, -4, -167, -52, -448, 40, 71, 99, -618, -87, -23, -185, -127, -431, 426, 821, 996, -76, -383, -162, -188, -134, -587, 208, 251, 219, -610, -834, 922, 344, 525, 660, 636, -265, -403, 598, -586, 309, -433, -346, -181, 708, -212, 145, 268, + -129, -548, 1185, -685, 73, 868, -737, -280, 101, 334, 675, 416, -242, 266, 1044, 635, -78, -646, 84, 1070, 856, 190, -821, -309, -706, -41, 579, 709, -36, 277, 844, 894, 1384, 1390, -674, 310, -729, -124, -588, -207, 488, -98, 221, 195, -415, -306, 362, 397, 518, 365, -5, 376, 570, -291, 293, 332, 108, 323, 1077, -801, -682, -156, 668, 630, -369, -9, 1019, 813, -570, -391, 351, -712, 196, -352, -637, 188, -752, 754, 278, 826, -375, -525, -912, -272, 262, -810, -433, -310, -453, 435, 1062, -37, -293, 695, 163, -7, + -960, 898, -402, -903, -293, 97, 1102, 138, 796, 349, -893, -163, -790, 167, -788, -544, -327, 79, 190, -588, 634, -159, 392, 442, 415, 787, 1378, 841, -244, -627, -8, 1477, 908, -444, 728, -230, 885, -386, 98, -277, -148, -1, -233, 2205, -399, -546, -677, -916, -362, -693, -24, 882, -323, 300, -269, -369, 764, -152, 1284, 296, 1027, -1151, 516, 2135, 758, -1016, 815, 454, 220, 296, 223, -17, 1443, 643, 114, -103, -1688, 704, 976, -799, -590, 1209, 777, -1076, -1127, -24, -679, 211, 56, 197, -1061, 199, -244, -572, 855, -131, + -195, 233, 711, 607, 421, -940, -24, -497, -966, 261, 221, 492, -236, -511, 1144, -931, 335, 327, 296, 168, -185, 611, -685, -1210, -224, -1376, 1091, 598, 1071, -187, 183, -993, 894, 1065, 386, -605, -1342, -414, -1763, -89, -352, -1294, -1025, 324, 50, 562, -530, 626, 543, -1065, 188, -286, 61, -385, -137, -992, 493, 384, -445, 209, -209, -1515, -369, 422, -138, 209, -821, 1166, -1441, 154, -1043, 792, 879, 308, 744, 113, -671, 1260, -524, 164, 68, -670, 1211, 115, 352, 288, 414, 227, 924, 1059, 401, 1232, -986, -48, 58, 1565, + -234, 1254, 742, 1710, 393, -348, -471, 699, -1189, 1217, -647, -392, -127, 269, 973, -179, -1548, -421, 2716, 227, -1575, 443, -1012, 364, 2693, -671, -609, 1820, -1761, 975, 513, 624, 1543, 1114, -599, 1225, 509, 671, 908, 1717, 863, -806, 1105, 338, 999, -273, -1806, 1861, 1624, 996, 3051, -275, -2526, -1308, -1181, 2698, 1999, 485, -150, -486, -1760, -842, -555, -1019, 2762, 2224, 3111, 57, -3507, -5499, -2656, 3066, 4166, 4228, 1735, -3506, -6410, -3951, -1961, 2966, 5078, 2860, 1590, 409, -2241, -3066, -2253, -182, 1814, 3591, 4347, 755, 885, -3428, -5611, -3027, + 2866, 4714, 4537, 2787, -1594, -5532, -3514, -4633, 74, 3092, 3404, 1601, -1236, -2855, -2215, -1475, 1343, -423, -1026, 1103, 127, -1693, 176, -470, -701, 459, -545, -241, -920, 12, -373, -700, 231, -114, 189, 68, 518, -579, -213, 127, 29, 216, -260, 514, -420, 342, 151, -219, -439, -216, -797, 797, -104, -11, -173, -239, 19, -64, -5, 284, 166, -49, 443, -445, 119, -425, 397, 218, -344, 185, -415, -478, -381, -715, -100, 468, -490, -957, -657, 16, 533, -27, 392, -914, -255, -138, -96, -904, -187, -55, 133, -263, 732, 187, -293, 434, + -913, -1485, -2320, 62, 1881, -749, -1184, -1270, -1195, 222, 228, 2165, -332, -339, -988, 83, 282, 662, -745, 343, -545, 829, 262, 251, 93, -565, -300, -380, -124, 277, -330, -317, 596, -587, -351, 463, -482, -213, -414, -706, 231, 397, 76, 370, -629, -203, -21, 318, 448, 511, 38, -107, -944, -1019, -358, -366, -211, 390, 610, 802, 98, -453, 865, -681, -274, 316, -268, 1055, 60, -270, 195, -505, 296, 620, 484, -220, 296, 591, -1490, -3472, -2657, -313, 1138, 2984, 2516, 2404, 2453, 1617, 675, -894, -1582, -3008, -2221, -2180, -2177, -1354, + 1298, 1758, 2582, 1985, 1657, 545, 1101, -255, -298, -353, -618, -1140, -942, -1918, -708, -1524, -735, -362, 489, 99, 704, 165, 990, 735, 1199, 1606, 1985, 1277, 850, 1421, 105, -477, -1757, -2050, -2831, -2513, -2356, -892, -1543, -796, 96, 438, 1000, 1917, 2038, 2290, 3439, 1945, 2618, 1818, 415, -230, -941, -2349, -2330, -1955, -1976, -1092, -591, -318, 137 } + }, + { + {75, -21, 51, 38, 71, -14, -59, 111, -17, -178, -52, -198, 137, 26, -31, 27, -39, 25, -166, 135, -18, 47, -156, -57, -58, -215, -83, -19, -4, -15, 80, -32, -80, -63, -167, -16, -166, -11, 36, 40, -44, 3, -31, -7, -58, -55, 35, -36, -42, 64, 218, 9, 95, 174, -17, -37, 163, -91, -13, -38, 7, 67, 29, -75, -87, 92, 52, 102, -63, -60, -81, -38, -32, -33, -53, -4, -7, -38, -285, 219, 10, 100, 100, 284, 133, -106, -134, -187, 132, -164, -118, 25, 40, 16, 167, -56, + 156, -42, 140, -135, 61, -61, -142, -12, -271, 39, 66, 119, -99, -4, 105, -80, 118, 109, -67, 77, -90, -45, -67, -100, -124, 107, 163, -126, 72, 127, 106, 157, 20, -29, 93, 66, -171, -12, 19, 5, 53, 104, 23, 34, -61, -44, 76, 102, 58, -66, -104, 100, -91, -38, 50, -32, -13, 18, 25, 113, -59, 83, 9, -6, -229, 37, 196, -120, 82, -243, -245, -81, -199, -174, -25, 36, 139, 22, -65, 31, 95, -121, 169, -114, -122, 142, -69, 164, 210, 29, -148, 105, 71, 42, -74, -55, + 90, 73, 17, -170, -47, -157, 144, -141, -89, 104, 8, 91, 29, 35, 158, 26, 177, -223, -110, -51, 115, 157, 183, 243, 32, -68, -16, -31, 0, -155, -60, -64, -8, 28, -114, -66, -4, -31, -52, 131, 259, -195, -74, -40, 159, 143, -148, -15, -273, -61, 327, 123, -134, 235, 75, 89, 22, -80, -260, 34, -118, -75, -49, -159, -58, -123, 83, -56, -73, 147, -280, 255, -92, 36, -89, 79, -12, -26, -9, 108, 4, 68, -101, 191, -151, 223, 46, -22, -127, -147, 302, 53, -287, 292, 273, -149, + -56, 87, -114, -20, -70, 71, 174, -104, 39, -76, -73, 33, 233, -204, 124, -205, -149, -137, -11, 21, 16, 123, 50, 98, -76, 36, -174, 214, -254, 36, 316, -503, 393, 172, -115, 141, 15, 345, -8, -240, -159, 133, 150, 61, 35, 162, 67, 48, 211, 101, 79, 159, 122, 482, -98, 148, 21, -49, 146, 100, 74, 85, -47, -99, 37, 27, 35, 94, 168, -114, -121, 93, -6, -29, -60, 215, -102, 298, 158, 42, 95, 54, 106, 373, 321, 55, 52, 100, -32, 163, 11, 152, 76, 49, 41, -73, + 165, 144, -26, 76, -23, 157, 11, 180, -59, 161, -108, 327, -236, -80, -110, 338, 190, 132, 212, -175, -34, 314, 175, 155, 150, 92, 103, -20, 291, -15, -131, -84, 103, -93, 67, -257, 102, -35, 5, -276, 126, -45, 275, -26, 86, 95, -118, -9, 123, 38, 83, -40, 149, 240, 23, -128, 53, 177, 104, 46, -109, -185, 172, -208, -107, 164, -322, -39, 189, -110, 35, 39, -20, 1, 67, -99, 25, -156, -114, -216, -109, 70, -595, 86, -199, -122, 116, 85, 54, 10, -442, -61, 115, -244, -77, -328, + -176, 54, -55, -303, 282, 166, -110, 17, 218, -168, 45, -119, -183, -127, -316, -126, 206, 91, 268, -160, -488, -218, 96, -165, -325, -66, -77, 264, 123, -340, 197, -245, -34, -181, -181, -167, -382, -227, 5, 218, 328, 210, 43, 126, -181, -280, -187, 157, -104, 171, -77, -181, -30, 2, -101, -195, -15, 118, -390, -221, 294, -119, 230, 3, 122, -143, 121, -199, -4, 368, -159, 348, 356, 432, 118, 177, 379, 293, 224, -278, 50, 95, 259, -43, -197, 278, 291, -75, 199, -88, -81, 177, 165, -18, 194, 18, + -274, -231, 269, 367, -11, -126, 95, 12, -156, -326, 189, -309, -131, 234, 70, 207, 30, 332, 68, 364, -405, 384, -52, -19, 140, 200, -140, -358, -75, 318, -37, -385, -196, -237, 90, 130, -289, 152, 196, 281, 145, 104, 112, 365, 44, 151, 434, 469, 137, 116, -353, -178, 381, -288, 389, 109, -6, -80, -143, -228, 36, 174, -429, -192, -186, 94, 79, 92, 7, 72, -22, 127, 96, -112, -206, -366, 56, -197, 322, 14, -193, -230, -80, 154, -297, 180, -106, 60, -14, -204, 192, 258, -189, 217, 49, -16, + 604, -155, -414, 76, 135, -101, 17, -175, 402, 242, -60, -93, 277, 279, -83, -242, -196, 535, -75, -76, -228, -156, -37, 117, 135, -338, -108, -118, 10, 120, 300, 261, -460, -6, 35, -61, -149, -321, -48, 86, 164, 131, -297, -65, -372, 317, -3, -50, 143, -175, -47, -395, 46, -242, 138, -46, -81, -145, -269, -261, -47, -318, -510, -108, -243, -489, -57, -58, -277, 152, 239, -50, 103, -51, -62, 52, 56, -401, -134, 191, -206, 438, 60, 102, -318, -23, -157, -322, -57, 403, 170, 298, 149, -163, -364, -534, + 301, 279, -66, 92, -429, 84, -75, -838, -218, 648, 209, 258, -183, 261, 447, 24, -89, -774, -191, -45, 425, 114, 163, -582, -167, -222, -150, 347, -215, -78, 48, 94, -196, -87, 77, -168, 335, -400, 27, 251, -352, 268, 453, 539, 246, 260, 341, -254, -469, 172, 178, 290, 218, -517, -164, 260, 135, 90, 299, 64, 352, -147, -103, 205, 174, 51, -352, -184, -377, -413, -50, -452, -4, -267, -11, -242, -172, -555, 343, 90, -140, -100, -67, 58, -97, 25, 510, -262, -225, -202, 349, 444, -294, 719, 144, -322, + 364, 96, -312, -367, -296, -34, -162, -117, -483, 179, 191, 646, 82, -124, -303, -323, 72, -49, -422, 62, -160, 8, 315, -261, 419, -385, -318, -34, -492, -596, 91, -80, -676, 33, 5, -333, 166, -169, 83, -468, -744, 474, -455, 742, 414, -554, -67, -561, -144, -83, 231, -211, 352, 423, 422, -314, -237, 25, -355, -46, -104, -460, 254, 154, -251, 288, -340, 84, 221, -418, -313, 243, 289, 319, 520, -159, 939, -3, -454, 233, 472, 150, 258, -173, -488, 792, 444, 342, 168, -235, 265, 667, -216, 167, 12, 166, + 128, 486, -113, 188, -143, 172, -26, 11, 299, 97, -546, -340, -511, -323, -263, -99, -387, -187, -182, -307, -227, 198, -350, -81, -268, 726, 361, 641, -519, 2, -472, -49, 564, 359, 662, 369, 418, -360, 212, 258, 619, 675, 208, 630, -409, -125, 309, -962, 119, 435, 46, 239, 535, 349, -349, 685, 406, -32, -171, -83, 409, 1012, 538, 148, 40, 335, -83, 818, 457, 513, 17, -255, 168, 66, -438, -102, -33, -97, -130, 170, 83, -350, -178, -622, -74, -190, -818, -357, 13, 308, -428, 526, -157, -119, -85, -121, + 362, -249, 247, -823, 237, 366, 258, 556, -568, 476, -514, -363, 381, -238, -103, 344, -589, 490, 750, -20, -158, 1000, -267, 179, 505, -1197, -663, 24, -53, 104, 60, 443, 149, -388, -544, -181, -957, -576, 708, 703, 78, -165, 598, -962, -514, -1041, 458, 127, 49, 202, -470, 239, 333, 431, 736, 752, 636, -27, 147, 7, -271, -59, -226, -121, 876, -206, -797, -205, -160, 69, 1262, -458, -446, 422, -676, 232, -750, 983, 284, -32, 258, -385, -476, 671, -817, -662, -585, 159, 253, 302, -542, 556, -168, 36, 871, -67, + -142, 247, 705, -463, 1165, 32, -1330, -175, -53, -427, -112, -16, -120, -249, -239, 232, -205, -57, 1342, 822, -963, -765, 1094, 1046, 679, 770, -1158, -202, -271, 390, 186, -427, -837, -1302, 469, 430, 175, 446, -118, 1, -256, 342, 544, 496, 181, 636, 252, 8, -159, -760, 28, -276, -217, 365, -819, 157, 112, -338, 442, 414, 243, -519, -479, -1389, -293, 97, -389, 172, 398, 403, 914, 501, -271, -154, -449, 798, -189, 1312, 1113, 398, -524, 1454, 737, -388, 224, 799, 1617, -381, -801, -309, 98, -233, 224, 255, 255, -264, + 326, 43, -220, 540, 205, -147, -472, 447, -817, -741, -259, 636, -325, -404, 13, 729, 90, 754, -224, 904, 114, 504, -290, -160, 285, -846, -237, 382, -149, -72, -708, -627, 321, -362, -292, 608, 765, -57, 503, -844, 56, -186, 1168, -421, 386, 778, 677, 264, -484, 371, 208, 277, 366, -1080, 2111, 755, -205, 190, 217, 671, -189, 539, 1213, 14, -1564, 723, 492, -445, 680, -61, -311, -601, 1221, -575, 1498, -1007, 614, -255, 1458, 173, 792, 402, -803, 47, 477, -147, -698, -138, -1523, -432, -566, -334, 335, -51, 548, -275, + 62, 523, -471, 42, 307, -40, -516, -12, -353, 1039, -181, 595, 103, -25, 1082, 761, -471, -575, 278, 470, 596, 699, -9, 232, 686, -60, -270, 188, 28, -630, -9, 371, -591, -832, -72, -81, -83, -303, -286, -990, 2, 896, 291, 479, 311, -172, -1233, -956, 242, 724, 258, 300, 1547, 1464, 1317, -185, 552, -563, -745, -1292, -375, -873, 347, -491, 354, -168, -597, -126, 70, 416, -211, 254, -913, 1008, -1994, -120, -445, -335, 347, 1272, 260, 521, -949, 321, 444, 908, -355, -561, -389, -124, 36, 84, 557, 461, -224, -1387, + -644, -1106, 206, 2253, -1451, -486, -169, 1354, -351, 643, -333, 720, -175, -233, -708, 529, -831, 962, 1549, 334, -215, -131, 1291, 481, 46, 811, 272, 402, -177, 1601, -2177, 1796, -1274, 806, 1618, -980, 2507, 1684, -368, 93, 1142, 1242, -484, 325, -48, 1518, 1451, -1230, 1211, 1108, -1031, -1570, -2309, 539, 3494, 1428, 19, 715, -3312, -1378, -102, 502, 2522, 2445, 442, -953, -1825, -1091, 147, 781, 1221, 1914, 1186, -1565, -3640, -3002, -265, 3314, 3653, 2274, 734, -785, -1443, -2254, -1236, -1378, 2704, 2193, 1442, 1215, -1836, -2663, -3013, -2770, 1112, 3695, + 4640, 1523, -1324, -3285, -3837, -1089, 705, 374, 2526, 930, -834, -577, -1787, -436, -2034, 912, 2634, 4621, -216, -2391, -4774, -47, -934, 16, -326, 1562, 910, -145, 325, 164, -1128, -122, -101, 117, 24, 85, -420, -167, -163, -106, -198, 666, -253, 285, -518, -53, 193, -26, -169, 1154, 144, -654, -777, 160, 141, -446, 105, 581, 281, 548, -581, 171, -42, 134, -417, 79, 411, 623, 130, -155, 153, 77, -174, 429, -655, 149, -1049, -308, 383, -334, -447, 563, -393, -932, -777, 664, -128, -114, 99, 344, 767, -518, -731, 24, -136, 502, + -25, 200, 74, 46, 585, -935, -1029, -2426, 680, 672, -66, -2050, -1331, -210, -350, 1342, 900, 424, -915, -387, -254, 834, 77, -258, -544, 333, 140, 408, -38, -188, -231, -501, -257, -309, 797, 420, 82, 108, -548, -42, 52, 729, -66, 334, -287, -204, 141, -316, 192, 79, 208, 715, -71, 627, -14, 402, -320, 22, -467, -604, -632, -541, 180, 96, 51, -790, 401, -683, -65, 52, -416, -446, -219, 40, -774, -484, 536, -160, 511, 73, -139, -349, -304, -37, 534, -1173, -2895, -2778, -426, 829, 2783, 2400, 2267, 2429, 1354, 318, + -1234, -1247, -2572, -2006, -1751, -1122, -1397, 1911, 1582, 2070, 1202, 1690, -61, 434, -272, -679, -377, -809, -920, -935, -903, -1090, -781, -656, -66, 152, 1519, 1251, 677, 701, 1006, 907, 456, 2130, 292, 10, 418, -820, -2451, -723, -1961, -2140, -2223, -1602, -1389, 56, 1194, 1177, 1484, 2635, 1938, 2315, 2325, 1449, 1603, 513, -528, -1798, -2276, -2583, -1585, -2086, -1395, -1272, -382, 905, 1123, 1844 }, + {-30, -32, -89, -194, 8, -16, -134, 27, -7, -37, -34, 131, 129, 32, 186, -143, 132, 84, -124, 103, -232, -62, -373, -56, 79, -78, 56, 53, 20, -12, -36, -73, -19, 61, 69, 7, 89, -37, -72, 73, 90, 58, -149, -139, -97, -88, -94, 104, 71, -82, -139, -235, -26, -85, 58, 106, 31, -54, 4, 99, -86, 110, 5, -17, -278, -61, -112, -31, 141, -21, -68, -17, 107, -86, 11, -6, 53, -43, -136, 225, 77, -43, 56, 71, 135, 225, -110, 73, -94, -74, 44, -2, 18, -162, -79, 54, + 112, -18, 94, -174, -153, 93, 60, 24, 69, -61, 122, 135, 133, 189, -107, -91, 6, 21, -185, -15, -16, 47, 18, -118, -29, 153, -84, 27, -96, 42, 48, 28, -143, 112, 11, 22, -20, -51, -59, -102, 208, -41, -38, -51, 93, 17, -196, 46, -89, -139, 80, -87, -205, 75, 26, 6, -146, -189, -85, 140, 23, 19, 125, -169, 37, -140, -179, 61, 182, -101, 90, -74, -32, 43, 16, -79, -250, -247, 11, -57, 4, 141, 28, 171, 227, -108, 197, 32, 200, 20, 236, 37, -122, -27, 19, 113, + -22, -26, 29, 88, -89, 3, -24, 79, 91, 13, -81, 2, -10, 59, 95, 170, -51, 113, -42, -131, -120, -75, 83, 95, -43, 148, 8, 60, 11, 178, 115, 133, 53, 80, 42, 67, 127, -8, -42, 147, 188, -210, -145, -120, -173, 43, 61, -140, 20, 262, -207, 129, 222, 223, -153, -46, 103, 15, 24, -110, 45, -357, 263, 425, 64, 139, -83, -12, 216, -126, -289, -51, -9, -6, -237, 12, 41, -270, -139, 119, 27, -98, -40, 88, -145, 271, 69, 10, -193, -20, 77, -62, -12, -65, -22, -28, + -161, 8, -157, 205, -220, -132, -67, -238, 137, -128, -356, -60, -167, 41, 120, -150, -10, -100, 79, 10, -97, 70, 3, 49, -148, 105, 3, -24, 125, -105, -383, -70, -17, 176, 249, 220, 111, -78, -18, -235, -196, 76, 283, -74, 290, 184, -165, 98, -18, 102, -185, -127, 41, 144, -9, 87, 126, -216, -35, -98, -290, 189, 39, 70, 139, 239, 92, 13, 196, -42, -85, 193, -90, 324, 159, 129, 17, -93, -102, 158, 226, -161, 50, 204, -25, 65, 466, -140, -43, 85, -214, -11, 49, -102, 104, -74, + 69, 165, -66, -4, 39, -86, -546, -31, 1, -97, -161, -42, 312, -198, -306, 135, -118, 61, 68, 217, -127, -25, 50, 204, -77, -106, -27, -89, 148, 270, 136, 20, -12, -126, 0, 416, 78, -30, 467, -8, 349, -83, 10, 252, 77, 79, 89, 62, 134, 96, -212, 428, 252, 356, 228, 171, -218, 123, 117, 43, -132, 403, 231, 368, 64, -38, -81, 282, -119, -225, 306, 128, -150, -52, 20, -20, 27, -6, 69, -47, -135, -14, -360, -138, -404, -274, 36, -259, -204, 33, -42, 283, -178, 313, 377, 48, + -313, -213, 338, -160, -89, 198, -243, -425, 177, 387, -192, 108, -5, 176, -453, 103, -182, 123, 9, -178, 317, 159, 133, 437, 196, 102, 238, 63, 76, 136, 38, 36, 62, 75, 477, 288, -5, 422, 248, 317, 460, -218, -204, 428, -149, 6, -250, -80, 137, 240, -194, 3, 52, -25, 104, -158, -43, -162, 345, -92, 162, 3, 140, -147, 49, 23, 48, -212, 278, 163, 377, 75, -51, -423, -227, -157, 108, -219, -368, -100, 94, 43, -412, 336, 25, -22, -352, -199, 81, 46, -391, -118, 140, 19, 36, 202, + 230, 139, -64, 120, 32, -137, -293, 499, -130, -239, -1, 126, 154, 373, 54, -4, -147, -2, 197, -24, 248, 494, 31, -106, 3, 424, 517, -264, 59, 73, 270, 149, 30, 83, -232, 122, 103, 109, -128, 6, 43, 140, -125, 208, -161, -302, 232, -12, -64, 97, 199, -516, 45, 421, -35, 745, 361, -208, -152, -53, -199, -78, 338, -110, -96, 343, 277, 104, 163, 322, 213, 245, -156, -97, 301, -39, 273, 20, -303, -183, 96, 267, -331, 41, -172, 116, -198, 310, 299, -261, -20, 104, 1, -359, -161, 89, + 263, 441, 152, -283, -58, -49, -26, 290, 52, 240, -306, 174, 33, -215, 307, 163, -24, -13, 59, 29, -136, 208, -14, 166, 354, -400, -50, -117, 443, -174, 368, -93, 344, 463, -183, 158, -98, 271, -82, 229, 190, 183, -24, 192, -74, -203, -92, 265, -275, 64, 13, 239, 459, -388, 28, 418, 3, 384, 63, 180, -38, -11, 111, -543, 68, 7, -212, 169, 104, 429, 214, -20, 787, 214, -399, 129, 49, 292, -167, 73, 238, 39, 148, -20, -438, -436, 8, -133, 375, -601, 805, 18, 445, 519, 125, -100, + -79, -167, -252, -11, 95, -80, 43, -743, -55, 248, 39, -282, -689, -5, 77, -125, -30, -207, 105, -174, 353, 119, -211, -269, -451, 332, -143, 17, 442, 599, 371, -63, 34, -422, -174, -174, 115, -596, 158, 153, 39, -311, 296, 444, -67, -16, 60, -271, -269, 152, 118, 334, -366, 400, -203, 217, -336, -283, -124, -17, -26, 142, -59, -615, -438, -134, 36, -615, 31, 297, -136, -74, 122, 256, -501, 273, -55, -79, 37, 212, 311, -190, -65, -174, -59, -94, 653, 6, -145, 506, -123, -221, -65, -59, 632, 721, + -105, 144, 178, -106, -356, 158, 672, 506, 436, -175, 184, 352, -483, -368, 407, -227, -240, -32, 511, -94, 469, 15, 421, -274, 581, 161, -190, -319, 100, -444, 44, -524, -179, -201, 281, -310, 468, -604, -1013, 605, 274, -149, -2, 669, 318, 28, -190, 122, -89, -21, -458, -488, 262, -186, 141, 828, -234, 147, -566, 615, -237, -326, -162, -141, 247, -519, 349, -416, 359, -752, -558, -541, 762, 28, 329, 197, -667, -583, 397, -1042, 308, 312, -64, -413, -378, 652, -346, -44, -105, -335, 499, 160, 452, 263, 314, -95, + 508, -44, -323, -384, -83, 221, -287, 393, 257, -291, -1050, -86, -79, -23, 776, 21, -592, -353, -358, 319, -222, -496, -549, -343, -261, -1242, 42, 162, 423, -645, 227, -531, -425, -144, 536, 140, 500, 922, 293, 219, 611, -446, -43, -185, -211, 452, 453, 674, 263, -416, -54, 225, 409, -281, -642, 240, 41, 36, 77, 146, 199, 354, 151, 305, 194, 352, 838, 75, -970, -327, 313, 58, -159, -610, -379, 187, 590, 255, -454, 321, 273, -528, -51, -664, 618, -249, -313, 566, -441, 189, 1140, -77, 238, 369, 62, 208, + -566, 205, 179, 155, 1485, 1013, -35, -440, -254, 502, 592, -510, -238, -701, 1289, 395, 226, -129, -42, -200, -53, 946, -129, 319, 971, 251, -113, -496, 139, 343, -958, 404, 264, 669, 683, -176, -823, -115, 576, 323, -923, -1221, 147, 834, 343, 510, -282, 393, 73, 11, -436, -159, -683, 1026, 353, -836, -564, 371, 49, 203, -241, 509, 309, 348, 682, 590, 133, 575, -296, 327, 9, 398, 197, -108, -235, 269, -354, 946, -247, -195, 207, 458, 478, -334, 835, 799, 486, 177, 78, -287, -614, -1090, -166, 348, -17, 430, + 509, 505, 191, 261, 1769, -914, -382, 123, 324, -108, -1320, 207, -230, 19, 204, -169, -286, 89, 449, 440, -264, -357, 89, -345, -1064, 1070, -329, 288, 89, 892, 715, 437, -446, -92, 612, 309, 723, 1934, -132, -795, -212, 559, -99, -937, 1379, 692, -502, -792, -106, 139, -255, 519, 456, 507, 1025, 136, 278, 145, -419, -1009, 550, -703, -513, 713, 379, 378, 203, 100, -69, -1018, -877, -52, 474, -705, 560, -362, -751, 131, 571, -219, 57, 498, 529, 486, -41, -530, 211, 1167, 18, 335, 575, -198, -451, -805, 561, 464, + 22, -350, -525, -934, 179, 595, 805, -663, -712, 898, 406, -20, -81, -351, 176, -155, -376, 421, 501, 359, 39, -55, -271, 77, 213, 143, -308, -1085, 251, -232, -327, 81, -139, 112, -1098, 534, 405, -771, 557, 758, 617, -143, 104, -75, 402, -67, -2, 1992, -591, 190, -529, -279, 1110, 435, 377, 740, -906, -715, 1113, -673, 568, 741, 65, 225, 267, 1301, -423, -421, -1113, -188, -471, 348, -693, 1092, 656, 628, 711, -301, 828, -456, 446, 1397, 703, 538, -757, 232, 787, -645, 1107, 404, 600, 534, -318, 552, 482, 207, + 1097, 830, -46, -1840, -200, 868, 845, 860, 220, 482, 58, 245, -45, -567, 1199, -27, 1143, 511, 829, -1138, 787, 385, 361, -300, 281, -216, 268, 1127, 463, 1470, 83, 317, 874, -188, 1367, 653, 125, -921, -558, 470, 61, -178, 32, -186, 106, -694, 436, -742, -1046, -430, -76, -401, -264, 696, -138, 640, -559, 627, -31, -784, -287, -855, -821, -347, -375, 610, -1067, -1314, -1435, -1716, 718, 803, -86, -160, -44, -425, 58, 187, -397, 1129, 1041, 688, 732, -733, 430, 21, 519, -240, -338, -1070, 895, -968, -1203, -317, -293, 1227, + -733, 155, -696, -190, 1141, 213, 323, 584, 1040, 62, -180, -1344, -307, -111, -99, 733, 333, 2499, 62, -75, -892, -63, 926, 916, -147, -428, -1300, 322, 716, -382, -967, -360, 692, -219, 485, -1649, -981, -1286, -382, 341, 176, -271, 199, -129, -424, -183, 1288, 117, 81, 2228, 287, -1515, -1150, 1585, 1411, 163, -987, -1238, -683, 342, 1372, 1240, 848, -393, 223, -394, 496, 1070, 1593, 1746, -138, -802, -1333, -2012, 45, 1203, 4610, -507, -177, -2111, -844, 274, 591, 2794, 2015, 1294, -1310, -689, -1280, 6, 2324, 2181, 2613, -619, -2459, -1746, + -2485, 721, 2384, 2131, 3826, -1718, -2141, -1840, -275, 1747, 2270, 3190, 1448, -587, -1174, 346, -72, 896, 2295, -485, 1420, -452, -998, -186, -1100, 1460, -326, 1722, -1569, 20, -676, -1645, 1220, -866, 1132, -887, -319, -87, 596, 117, -604, -349, 0, 875, -798, 1005, 765, -577, 162, -721, -667, 1164, -1134, -618, 829, 1786, 29, 213, -122, -831, -176, 703, -208, -1243, 221, -308, -149, 313, -1036, 498, 56, 320, 906, -1971, -1349, -535, 25, 1895, -972, 635, 1616, -929, -425, -143, 913, 1123, -590, 247, -170, 369, 1966, -830, -2036, 320, 915, 111, + -1005, 583, 298, 194, -127, -304, -224, -2288, -778, 873, 1224, 1003, -1180, 274, -3157, -2081, -1778, -349, 1364, 849, -141, -755, -912, 329, -588, -131, 1026, 222, -25, -1171, -602, -190, -593, 254, -168, 512, -231, -86, -270, -116, -217, -704, -549, -1127, -815, 454, 948, 1034, 544, 891, -224, 746, -269, -460, -1382, -132, -798, 478, 137, 1571, -1411, 391, 848, -592, -786, -493, -407, -422, 42, 1093, 679, -396, -127, 749, -1023, -1100, 378, -1140, -814, -694, 38, 215, 97, 1077, 836, -155, -2503, -3770, -4650, -3656, -5506, -874, -1923, 747, 1324, 4203, + 2525, 4345, 4439, 5998, 4437, 4479, 3360, 247, -789, -1599, -905, -3417, -2261, -1817, -1814, -1843, -1789, -1786, -1880, -2135, -1512, -2502, -1970, -1767, -688, -2104, -533, 859, -1477, -725, 567, 401, -1234, 1175, 1585, 1875, 2627, 2563, -93, 1515, 2569, 3489, 2854, 5488, 5262, 4521, 3766, 4610, 2363, 3619, 4553, 3350, 2206, 3597, 1134, 981, 2113, 1894, 1190, -163, 487, -1494, -1297, -1082, -3135, -4593, -5995, -4852 } + } }; -const Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS][2870] ={ -{ - -9622874, - 5398774, -3060164, 1363652, -1702955, 433792, -1239098, -309238, 92342, 2585570, -1634235, - 1140314, -2660732, 2018635, -2989297, -4069482, -3554086, 854699, -343597, 588411, 113817, - -1788854, 1082332, 1831804, -974958, 1453846, -184684, -586263, -1198296, -195421, 395137, - 983548, -657130, 1434519, -532576, 906238, 1309965, -899796, -846109, 77309, -867583, - 259846, 53687, -377957, 878321, 152471, -354335, 3665755, -3788161, -702227, -794569, - -882616, -268435, -62277, -717260, -523986, 10737, 154619, -523986, 304943, -1172526, - -350040, -186831, 710817, -4028679, -382252, 837519, -386547, -485331, 350040, 81604, - 283468, 1861868, -897648, -590558, -994285, -180389, 545461, 839666, -852551, -633508, - 989990, -904091, -1352915, -143881, -369367, 476741, -401579, -380105, 223338, 420907, - -833224, 279173, 315680, -12934294, -8804683, -3560528, -4093104, -2267743, -2145336, -2010045, - -925565, -2426657, -1932735, -826781, -1507534, -184684, -549756, -1292785, -1778117, -1967095, - -788127, -1133871, -2003602, -246961, -2503966, 23622, -197569, -330712, -1518271, -244813, - -1151051, 23622, -1481764, -925565, 502511, -1069447, 184684, -2503966, -470299, 1245541, - 749472, -30065, -371515, -708670, 199716, 246961, 1163936, -682900, -120259, -343597, - -17012366, -938450, 2201171, -47245, 663572, -128849, 27917, -1374390, 1462436, 560493, - 1758789, 1234803, 3594888, 2622078, 212601, -1428077, -805306, -345745, 680752, -491774, - -3154654, -2854006, -1462436, -450972, 148176, 390842, 594853, -124554, 109522, 337155, - -654983, -100932, -81604, -1960653, 1157494, 461709, -206158, -32212, -736587, -1093069, - 682900, 246961, -697932, 665720, 584116, 813896, -358630, 19078244, 13406740, 2628520, - 5192616, 1069447, 1720134, 4226248, 2181844, 667867, 2549063, 1030792, -1116692, -560493, - 886911, 1468879, -2585570, -352187, -1550483, 3440269, 1713692, 876173, 1713692, 869731, - 886911, 38655, -167504, -850404, 1348620, 1627793, 1391569, 1733019, 2100239, 1251983, - 3068754, 689342, -173946, 1088774, 201863, -539018, -242666, -481036, -607738, 10737, - 1423782, 337155, 234076, 824634, 28469190, 12107513, 3657165, 3332895, 2327872, 1443109, - 457414, 111669, 3120294, 633508, 1728724, 2355790, 1241246, -163209, -869731, 4977867, - -453119, -2718714, -1561221, 1239098, 66572, 2662880, 869731, 330712, -493921, -1234803, - -354335, -564788, 1163936, -197569, 481036, 122407, 178241, -633508, 942745, 3459596, - 2181844, 2299955, 2063732, 1713692, 929860, 672162, 388695, 1136019, -959925, 697932, - -455267, 9350144, -9854802, -3015067, -4239133, -3719442, -1984275, -620623, 1402307, -1400159, - 173946, -3682935, 1275605, -1357210, -3289945, 852551, -2345052, -3186866, -2237678, 3002182, - 2304250, -1088774, 1183264, -2117419, 837519, -3835406, 221191, 607738, -627065, -914828, - 818191, -3038689, -1350767, 369367, -1035087, -910533, -667867, 227633, 339302, 1505386, - 107374, 2609193, -998580, -738734, -809601, -1316408, -386547, -667867, 386547, -1136019, - -1711545, -33797096, -17166984, -6131066, -4840428, -5231270, -3313567, -4520453, -2976412, -4924180, - -919123, -2218351, -594853, 236223, -2074469, -554051, 300648, 34360, -3141769, -2061584, - -1434519, 300648, -4228396, 425202, -1930588, -3732327, 300648, -45097, 238371, -90194, - -1340030, -1007170, 23622, -281320, -66572, -1393717, 25770, 380105, 1110249, 431644, - -1473174, 833224, -1471026, 985695, -2516851, -1702955, 358630, -1380832, 51540, -521839, - -2025077, -19986630, 10479720, 4413079, 1623498, 2716567, 491774, 734439, 2368675, 2669322, - 1428077, 1780264, -1359357, -562641, -2113124, 2561948, 521839, 468151, 3474629, 120259, - -2349347, 4151086, -2761664, 341450, 3412352, -1028645, 886911, 448824, -90194, -1713692, - -420907, 953483, 977105, 171799, -622770, 73014, -1221918, 3917010, 322123, -55835, - -1550483, -768799, -1007170, -925565, 2104534, 2031520, -536871, 206158, -146029, 616328, - 135291, -128849, -429497, 485331, 304943, -588411, -564788, 30094836, 12783970, 3416647, - 6902013, 4007205, 1715839, 3004330, 2587718, 2147, 1887638, 2982855, 689342, 2147, - 1526861, 4202626, -1423782, -777389, -3326452, 841814, 3835406, 1617055, 178241, -2171106, - -1163936, -936303, 4039417, 1247688, 2113124, 1174674, -1917703, -3094524, 3502546, 1913408, - -2151779, -1037235, 3403762, 2856153, -143881, 702227, -356482, 1486059, 955630, -343597, - 693637, -1213328, -562641, 1821066, -966368, -762357, 1958505, 1660005, 929860, 319975, - 408022, 397284, 1398012, 35592392, 7743826, 5922760, 2637110, 2710124, 1172526, 2789581, - 3332895, 5261335, 3262028, -1011465, 4179003, -816044, 1142461, 910533, 3541201, 5175436, - 3367254, -914828, 5826123, -1118839, -571231, -3070902, 852551, -927713, 979253, 1544041, - -1726577, -2454574, -981400, 457414, -1926293, -663572, 923418, 1269163, -2263448, -1977833, - -785979, 730144, 17180, 584116, -801011, -40802, -530428, -798864, 964220, -1346472, - 1294933, -1443109, -461709, -1105954, 266288, -416612, 1453846, 609885, -77309, 4093104, - -15760382, -5095979, -5611375, -3663607, 1007170, -927713, -3354370, 1909113, 176094, 2353642, - -231928, 223338, -3657165, -2630668, -1681480, -2705830, 266288, -2877628, -5469641, 1067299, - 682900, -2579128, -519691, -2342905, 528281, 758062, -410169, -5703717, -1569811, 337155, - -592706, 463856, 1569811, -4065187, -1172526, -2549063, 1352915, -335007, -173946, 2626373, - -2641405, -201863, 869731, -360777, -841814, 1260573, 719407, -1625645, -1928440, -3156801, - -435939, -2415919, -1900523, -1041530, -1301375, -818191, -328565, -753767, -1168231, -1640678, - -884763, 566936, -36975372, -12594992, -7537668, -1956358, -3884798, -178241, -2085207, -2780991, - -3356517, 4181151, 135291, -1640678, -360777, -6176163, -3459596, -3025805, 5059472, -4249870, - -8890582, 719407, 1136019, 680752, -3242700, -889058, 1924145, -4123169, -382252, -4204773, - -1206886, 2325725, -1969243, 558346, 4606353, 485331, -897648, -1118839, 1286343, 1404454, - 1191853, -1370095, -204011, 1460289, 2059437, 1202591, 730144, -3854733, 779537, -193274, - -1896228, -734439, 431644, -526134, -1917703, -1309965, -1990717, -592706, 161061, 283468, - -253403, -1432372, -201863, -1114544, -34360, -24556476, 5686537, 373662, -3000035, 4410932, - -2785286, -2143189, 1108102, -4140349, -2480344, -874026, 1722282, -3264175, 4471061, 105227, - -122407, 2100239, 2083059, 3287798, -352187, 4524748, 6485401, 4696547, 1479616, 4020090, - -1303523, 2557653, -2961380, -3008625, -1264868, 384400, 1962800, -1576253, -2843268, -1522566, - -73014, 1767379, -2748779, 1995012, 676457, 1541893, -704375, -2491081, -3380139, -4000762, - 1045825, -2040110, 1088774, -4243428, -1239098, 1928440, -2692945, 457414, -1894081, 1301375, - -614180, 1264868, 287763, -743029, -75162, -1698660, 3193308, 1363652, 16428250, 27124866, - 7870528, 7054484, 9792525, 7939247, 1567663, 6300717, 5607080, 3058017, 11871290, 2836826, - 2025077, 5147519, 4765266, 2514703, 2121714, 1262720, 1992865, -1516124, 6008659, -1589138, - 599148, -1868311, 3813931, 206158, -957778, 3154654, 3760244, 1335735, 4984310, -3496104, - -5789616, -1294933, -315680, 1277753, -377957, 2523293, -2302103, 2297808, 5022965, 2168959, - -4425964, -904091, 2293513, 904091, -2156074, 3163244, 1260573, 1879048, 2091649, 2826089, - 944893, -768799, 710817, -2525441, -648540, 2385854, 2190433, -1211181, -15032, 597000, - -1054415, 62281320, 6448894, -627065, 3895535, -118112, 5364414, 60130, 1473174, 672162, - 5652177, 2619930, -2267743, 1881196, 2733747, 1440962, -3345780, -7045894, -3186866, -2961380, - 1292785, -4327180, -715112, -277025, 1206886, 7745974, 4350802, 1458141, 3152506, -4825396, - -246961, -2529736, -919123, -1992865, 2957085, -1114544, 4919885, -2239826, -828929, -2499671, - -1063004, -3609920, -1627793, 828929, 839666, -188979, 96637, -1979980, 1178969, 3356517, - 328565, -1806034, 2164664, -2965675, 1357210, 1305670, -231928, -921271, -569083, -128849, - -496069, 150324, 2074469, -221191, -18129056, -21573620, -4009352, -1202591, -882616, -3429532, - -1417339, 6545530, 3876208, 1380832, 1786706, -2856153, -571231, 4915590, -1808181, 7999377, - -6208375, -1694365, 6524056, -1256278, -727997, -3790309, 4473209, 4943508, 96637, 4872641, - -1769527, 2162516, -96637, -2723009, -425202, -2153926, -895501, -1395864, 2695092, -1977833, - -466004, -3045132, 2068027, -1580548, 4509716, -7106024, 2993592, 2482491, -4290673, 94489, - -2832531, 768799, -3223373, 1030792, 1355062, -4097399, -612033, -1488206, -6098854, -3532611, - -1685775, -3030100, -652835, -504659, 341450, -2476049, 360777, -4793184, 1352915, 597000, - -1644973, 609885, -1642825, -435939, -1065152, -491774, -15934329, -9137543, -12360916, -6345814, - -8257075, -934155, 7969312, -8325794, 6405944, 4086662, -4537633, 9083856, -1436667, 1767379, - -5931350, -639950, -2637110, -380105, 38655, 2237678, 1095217, 4739497, 9092446, -2463164, - 1254131, -4350802, -4541928, -4037269, 919123, 3777424, -1331440, -1324997, -1206886, -2813204, - 3152506, -994285, -210453, -2755222, -2164664, -1836099, -2836826, -244813, -124554, -2405182, - 1571958, -3678640, 1357210, -2138894, -382252, 1324997, -2712272, 3345780, -5830418, -1821066, - 549756, -1735167, -3111704, 1518271, -858993, -3508988, 5746666, 3242700, 794569, 1088774, - 1153199, 1402307, -2905546, -1913408, 738734, -1041530, -2014340, 2162516, -44373456, -5072357, - 3592740, -3244848, 7372312, 3408057, -8974334, 1224066, 1520418, -2886218, -7514046, -2776696, - -1823214, 2158221, 549756, -6947110, -2617783, -3700114, -6687264, -5630702, -13118978, -6820408, - -7657927, -9292162, 7402376, -4932770, 2714419, 5557688, -3998615, -6294275, -2420214, -1342177, - 1522566, 4179003, 2430952, -5209796, -6478958, 5136781, 3214783, 4067334, 5710159, 846109, - -10737, 2259153, -257698, -2497524, 1458141, -1337882, -852551, 3369402, 8544837, -2806761, - -4252018, 2010045, -2703682, -234076, 4410932, -8411693, -100932, -2757369, -444529, -152471, - 68719, -977105, 1702955, -2484639, 3077344, 3352222, 1421634, -169651, -4295, -2817499, - 35553740, 31005368, 8398809, 18852758, 5216238, 10857677, -1760937, -1722282, 5276368, 7133941, - 3788161, -12311524, -4082367, 7675107, 8669391, -3197603, -4179003, 1406602, 3609920, 4099546, - 609885, -6405944, -13758928, -5171141, 7509751, -667867, 7718056, -1829656, -2456721, 1559073, - -6397354, -3708704, -3721589, 7067369, -8813273, -6081674, 1582696, 1473174, -2269890, -283468, - -2527588, 2643552, 3603478, 3090229, 6981470, 4063039, 118112, -5718749, 5377299, -513249, - 2978560, -2798171, 2078764, 4249870, -648540, -1144609, -2662880, -3161096, 1934883, 427349, - 2735894, -2735894, 2284923, 5519033, -1161789, -3034395, 3848291, 4999342, -2033667, 2226941, - 2506114, 1999307, 4778151, 4075924, 43115028, 8046621, -8452496, 7013682, 4524748, -8162586, - -1864016, 4181151, 210453, 1346472, -710817, -1700807, -9075266, -8817568, 3865471, 8347269, - 8551280, -8489003, -17278654, 2415919, -337155, -6899865, -8877697, -1552631, 4320737, -3036542, - 6448894, 10488310, -4015795, -3425237, -1496796, -1554778, -2130304, -16041703, 8291435, 7636452, - -384400, 4922033, -4954245, -1548336, -4516158, 6466074, 6822556, 766652, -1821066, -2527588, - 3760244, 923418, -2351495, -4071629, -83752, 3414499, -5297842, -3234110, -2929168, 874026, - 1563368, -6554120, 3238405, 7221988, -5997922, -83752, -1520418, -1022202, -146029, 715112, - 304943, -425202, 1194001, -1958505, -3964255, -4563403, -2106682, -1120987, -2426657, -4576288, - -3444564, -1101659, 3193308, -1541893, -11821897, -7793218, 1112397, 10692321, -10767483, 7645042, - 3489661, 1662152, 2173254, 1833951, 6968585, 11291469, 294205, 3390877, 1239098, -9738838, - -8845485, 8607114, 1155346, -10063108, 5912023, -8594230, 1398012, 10526965, -689342, -2899103, - 12023761, 1857573, 805306, 970663, 341450, 1065152, -5312875, 3154654, 4836133, 7924215, - -6324340, -3146064, 1217623, 1084479, -2909840, -5716602, 3624953, -2098092, 2534031, 1331440, - -1999307, -1861868, 798864, 3594888, -2757369, -1228361, -629213, 2057289, -5787469, -2712272, - 2665027, 558346, -1962800, -1022202, 2409477, -2452426, 747324, -1664300, -416612, 1941325, - 558346, 1129576, -4995047, -3562675, 1322850, -46364172, -42567420, -9519795, -19722490, -17319456, - -9809705, -2978560, -7365869, -8871255, 6027987, 1608465, -2059437, 10112500, 3712999, 12150462, - 9414568, 2703682, 3770981, 4428112, -18631568, 8778913, -1438814, -3951370, -3489661, -11029476, - -3412352, -3833258, 10589242, -3547643, -6324340, -3158949, 1685775, -1389422, -2113124, 2325725, - -2800319, -1825361, 6478958, -6360847, -554051, -2063732, 11654394, 4617090, 4660040, -8974334, - 691490, 7971460, -4191888, 1896228, 38655, 1930588, 51540, 661425, -612033, 5078799, - -663572, -1666447, 3704409, -2639258, 2076617, 4425964, -2074469, -3088082, 1372242, 1687922, - -3330747, -1370095, -6146098, -4872641, 1612760, -562641, -1082332, -115964, 809601, -397284, - -3899830, -1838246, -29038274, 61319248, 38461432, 12375948, 3734474, 4234838, 4316442, 6902013, - 6012954, 13000866, 25909390, 1501091, 2922725, 5671505, 5284958, 6700149, -4872641, 25209310, - 17914308, -16688095, 12317966, 2312840, -2720862, 6075231, 15184857, -14248554, -4093104, 1185411, - -11879880, -8057359, -8495445, 17323750, -785979, -3058017, 2282775, 972810, -5188321, -13879187, - 9620727, 7885560, -2372970, 4307852, 9865540, -6560563, 5368709, 569083, -2585570, 7812546, - 6646462, 1563368, 891206, 805306, 5353677, 7580618, 55835, -1363652, -81604, -2394444, - 5306432, 1116692, -2160369, -2649995, -1943473, 4039417, 1864016, 9176198, -2774549, 3281355, - -2042257, 2289218, -3745212, -1329292, 1127429, -2035815, -2619930, 231928, 444529, 1176821, - 2482491, 66413080, -23407572, -22993108, 10413148, 2559801, -8701604, -7662222, -12169790, -12062416, - -8821863, -7475391, 10997264, 2564096, 1329292, -6236293, -5443871, -19441170, -19327, -7683697, - -13361643, 11134703, 7406671, 2297808, 6884833, 1934883, -2342905, -4305705, -362925, -3637837, - 5634997, 9543417, -10129680, -3728032, 148176, 5214091, 13228499, 3983582, 17742510, -9096741, - 5600638, 14796162, 8718784, -7361574, -2192581, 1741609, -3749507, 6412386, -992137, 386547, - 9448928, 5214091, 1516124, 942745, -229781, -3910568, -109522, 1200443, -4239133, -2332167, - 4194036, -1561221, -8040179, -1093069, 244813, -1312113, -8373039, 2269890, 1728724, 2190433, - 2345052, -1651415, -3472481, -1086627, -1750199, 6912750, 2918430, -2553358, 1902671, -521839, - 1443109, 210453, 21324512, 40516572, 15921444, 10861972, 12704513, -3682935, 4097399, -11547020, - 20158430, 7952132, 19366008, 5806796, 7395934, -17637284, 22078280, 32708324, 4179003, 21214990, - -4221953, -17173426, -16995186, 15571404, -4973572, 12438225, 2334315, 4999342, -9494025, 9633612, - -3302830, -3408057, 15908559, 11053098, -8276402, 14854144, 1717987, 2733747, -2933463, -11160473, - 3167539, 856846, -6167573, -7022272, 6618545, 9238475, 3085934, -3225521, 4413079, 375810, - 9874130, -5894843, -796716, -9734543, 1206886, 9564892, 6489696, -4413079, 34360, 3369402, - -8596377, -637803, -5847598, -3283503, 1874753, 2295660, 5892695, -6831146, 3032247, -7859790, - 758062, 9760313, 3498251, 1928440, -6107444, 919123, 807454, -10176925, -2630668, 1185411, - 1806034, 4032974, 1711545, -219043, -47324096, -2581275, -10690174, 13432510, -10234907, 11048803, - 332860, 8856223, -1232656, 7638600, -23650238, 6949257, -2778844, -8534100, 4155381, -10393821, - 6371584, -10492605, -5538361, -23179938, 13185550, 27754078, -10896332, -3695819, -3176128, -4561256, - 4228396, 5493263, 8046621, -20620138, 6154688, -12852690, -3676492, -740882, 10567767, 3987877, - -5312875, 2188286, 2250563, 7511898, 7713762, -12899934, -4236985, 1808181, -9373766, -8409546, - -1584843, -6023692, 2542621, 7136088, 964220, 1191853, -1694365, 6650757, 18107582, 10161893, - -11113228, 2190433, 4112431, -5564130, 6386617, 1606318, -7112466, -730144, 8160438, 818191, - 7812546, -10554882, -2439542, 6251325, 313533, -3504693, -7292855, -605590, -3863323, 5982890, - -1698660, 3719442, -1788854, -822486, -86872160, -32600950, 17639430, 6358699, -11158325, 12345883, - 10176925, 16299401, -3938485, -7112466, 14239964, 631360, -9590662, 19393924, -21706764, -28245852, - -13344463, -15141907, 9910637, 14280766, -322123, 3715147, 22486302, 9940702, -22771916, -10249939, - -14005888, 4239133, -21144124, -18406082, -1112397, 2905546, -8083129, -8800388, -12882754, -6644315, - -11785390, -11506217, -4327180, 1050120, -4198331, -622770, -7941395, -1166084, -6079526, -13380971, - 29066192, 2422362, 6895570, -11781095, 7720204, -691490, 3964255, -9444633, -354335, -1471026, - -7876970, -4881231, -3571265, 9513353, 6927782, 7462506, 4632122, 5804649, -1301375, 165356, - -6811818, -1172526, -294205, -453119, 8961449, 2508261, 5272073, 5544803, -3992172, -9560597, - 4172561, -3620658, -1677185, 4024384, 11478300, -1166084, 45567456, 16728898, 36717676, 5774584, - 2501819, -14693083, 5677947, 21960168, 8306467, 1597728, 14798310, -13198435, -5849746, 12004434, - -9083856, 4187593, 21165598, 6801081, 2944200, 6743099, -3777424, 9195525, -6906308, 255551, - 3657165, 1247688, -5310727, -5785321, 2362232, 21751862, -6949257, 5403069, -19945828, -10690174, - 9255655, 22917946, -17506286, 165356, 11128260, 2802466, 4297115, -14532022, -4986457, -12556337, - -21906480, -5787469, -12135430, -12902082, 10546292, 4200478, 3715147, -7533373, -4522601, -1479616, - -21036750, -1960653, 11963631, -8358007, 9622874, 19552838, 3081639, 12955769, 8643622, 751619, - -3788161, 11244224, -14072460, -648540, -734439, 8948564, 4438849, 8246337, 435939, 9143985, - -450972, 1909113, 1513976, 9732396, 188979, 118112, 8828305, -4679367, 5546951, 1939178, - 1589138, -2798171, 55334212, -12141873, -17001628, 2725157, 12721693, 10357314, 10587094, -3079492, - 11420318, 3592740, -13587129, -27174258, 18193482, 4898410, 13159780, 7872675, -7243463, 3210488, - -10417443, -17768280, 18457622, -11544872, -22125524, 2368675, -3635690, 2750927, -2209761, -2214056, - -5626407, -8742406, 6506876, 14940044, -21569326, 21109764, -18251464, -23776938, 2302103, 6414534, - -13449690, 10617159, -1915555, 6749541, -11583527, -5697274, 19666656, 8098161, 19913616, 5349382, - 1498944, 6401649, -70867, 811749, 10426033, -839666, 1829656, -9242770, -6362994, -5441724, - 7337952, -7168301, -6197638, 11944304, -362925, 13368086, 2014340, -9627169, 15893526, 12455405, - -1030792, 8147553, -8166881, -13320841, 5138929, -4833986, -9663676, 904091, 8482560, 11626476, - -4374424, 3678640, 5581310, -695785, 2381559, -11504070, 4425964, 4082367, -5798206, 46366320, - 56493852, -8665097, 345745, -28428388, -3214783, -20746840, -15513422, -4958540, -10608569, 15992311, - 8590, 12403866, -26530012, 22043920, -16707423, 22512072, 801011, 17873506, -6459631, 22529250, - 7410966, -10735271, 4754529, -16020228, 10625749, -8931384, 25372520, 7554848, 16677358, -27758374, - -15893526, -6818261, -14061723, -5896990, -9622874, 893353, 34297460, -15861314, 17246442, 29059748, - 4121021, 12773233, 171799, -6526203, -13569949, -10359461, 1445257, -7479686, 17549236, -11381663, - 8046621, 21221434, -2793876, -1763084, -1700807, 17353816, 18769008, 5869073, -8714489, -7649337, - -4602058, 7327214, -17194902, 3219078, -3083787, -4743792, 242666, 11340861, 1013612, 16063178, - 14718853, 2905546, 3532611, -7002944, -350040, 16514149, -2132451, 968515, 6932077, -8834748, - 169651, -10110353, -10995116, 1584843, 1586990, -2214056, -44027708, -39451424, 17572858, -5233418, - 21738976, -12369506, -10211285, -14763950, -12116103, -5602785, -34744136, -12738873, 13380971, 18683108, - 7715909, -24208584, -6871948, -11617887, 10275709, 35031900, 19621558, 8568460, 1382980, 2665027, - 1831804, 6165426, 18129056, 1483911, 4778151, -10295037, 867583, -14761803, 5804649, 7241315, - 13123273, 1722282, -8924942, -4468914, 17295834, -8003672, 6551973, 3566970, 6298570, 22091164, - -12236362, -18610094, 7048042, 15760382, 4198331, 15751793, 18895708, 9141838, 13114683, 5085242, - 2856153, 10404558, 31469226, -17452600, 23622, 5207648, 2832531, -13526999, -2362232, 10499048, - -137439, -12131135, 4881231, 22851374, -18522046, 6088116, -17540646, 10204842, 6938520, 2845416, - 715112, -8257075, -8229158, 16084653, 8699456, 3309272, -4870493, 11280732, -1580548, 70867, - -7786776, 8321499, 3109556, -88624504, -30934502, -1988570, -8843338, -21854942, 13350906, 17828410, - 30077656, 9884867, 18910742, -17559974, -37054832, 17257178, -8757438, 927713, -19952270, 19628000, - -11787538, -932008, 18240726, -50549616, 4870493, 26289494, -49063560, -12970801, -17390322, 2372970, - 1816771, 12000139, -13653701, 15906411, 2254858, -25722560, -13269301, 3038689, -3315715, -12745315, - 11196980, 29903710, 6371584, 8269960, -4818954, -7449621, 17426830, 3180423, -8787503, -42964704, - -6869800, 5413807, -21809844, 10337986, 8770323, 1735167, -16864190, -15062450, -17978734, 38558068, - 10198400, -5886253, 7430294, -32789928, 3811784, -15354508, -17673790, 17061758, -2957085, 212601, - -11162620, -41023380, 5486821, 12457553, 7159711, -3000035, 24212878, 803159, -10222022, -1629940, - -15981573, 25132002, 13640816, 7028714, -4209068, 1707250, 8044474, -7483981, 3115999, 3463891, - 1144609, 94038312, 23684598, 24270860, 20620138, -6004365, 811749, 96705480, 27930172, -8001524, - 59075128, -33137820, 24646670, 5179731, 15064598, 24144158, -7464653, -16855600, 18204218, -3311420, - -58407260, 14933601, 15146202, 12363063, 27805618, 17613660, 18161270, -16454020, 3627100, -15889232, - -8289287, 17310866, 5746666, -34095596, -20358144, -28576564, -42543800, -6515466, 8776766, 20781200, - 17940078, 15455440, 12962211, -6300717, 22254374, 12380243, -27081916, -10361609, 7224135, 20396800, - 489626, 4398047, 35912368, -6431714, -3040837, -9305047, -1872606, 18300856, -15629386, 270583, - -22106196, -19643032, -12586402, 23008140, 31621696, -9176198, 2555506, -6094559, -19630148, -13305809, - 5100274, -22739704, -6045167, -6077379, -14699526, 40282500, 8826158, 13475460, 11744588, -1168231, - 51540, 6959995, 2115272, 12668006, 7984344, 225486, -1282048, 95657512, 56566868, 4024384, - 35931696, 27376122, 7872675, 41424960, 11731703, -186831, -12839805, -9603547, -26989574, -73398840, - -5390184, 7078106, -24983824, -14323716, -2765959, 51150912, 16823386, -13346611, 586263, 3498251, - -7271380, 21532818, -3575560, -13365938, -9010841, -12603582, 8158291, -18491982, -44959716, 955630, - -23435490, -36494336, 7209103, 15644418, 22874996, 12771085, 20255066, -13831942, -38716984, -25374666, - -34819300, 13623636, 32772748, 26862872, 17486960, 32575180, 904091, 20330228, 44397076, -36758476, - 6680822, -16634408, 236223, 12668006, 13284334, 21479132, -1879048, -44914620, -34574488, 7383049, - -9728101, -12818330, -8486855, -9861245, -30633854, 2647847, 20869246, -2291365, 15915001, -9590662, - -753767, -1784559, 7990787, 30404074, 21545704, 18509162, -17538498, 968515, -10526965, 1202591, - -28144920, 5626407, 4715874, 3027952, -526134, -3485366, -8074539, 7011534, 360777, 12691628, - 23295902, -47794396, 5918465, -36582384, 16361678, -69844760, -1891933, -23173496, -36024040, 64488932, - 36483600, -23008140, -57917632, -14660871, -21124796, -50626928, 39397736, 2100239, -34980360, -13015898, - 20244328, -33133526, -22529250, -17409650, -39247412, -15068893, -783832, -31767726, -28797756, 40441412, - -15088220, -12625056, -3719442, -9040906, 34400540, -38102804, -17787608, 8046621, -10136123, -42950, - -8630737, 19834158, -36105644, 12867722, -57735096, 5877663, -16499117, -23059680, 60662120, 6302865, - -22400402, 11566347, 12689481, -48960480, 33986076, -8284992, -10526965, -3706557, 19441170, -8096014, - 880468, -23444078, 12773233, 15891379, 27309550, -23570780, -60438780, 42215232, -4818954, 17433272, - 20684562, -12517682, 11942157, 31215822, -39844412, 2145336, -14027363, -4333622, -41360536, 14124000, - -6418829, 1670742, -1020055, 5486821, -6949257, -6249178, 11405286, -10471130, 8265665, 2433099, - -7756711, 4683662, 1286343, -91293824, -50906100, 11433203, -32469952, 3936338, -23474144, -12146168, - -34415572, -23673860, 17315160, 51292648, 53873924, 8579197, 38008312, -26252988, 66413080, 48773648, - -38871600, -34948148, 10986526, 10971494, 56130928, 20383914, 35933844, -12955769, 14390288, -7290707, - -6045167, -11894912, 52478056, 23504208, 50264004, 45674828, 8755291, -2692945, -22254374, 22050362, - -2656437, -45977624, -30683246, -8740258, -23789824, -5304285, -24449102, -21431886, 14484777, -6489696, - -15485505, 38394860, 45221712, -26031796, -8729521, 61725124, 25144886, -42142220, -41472204, -14929306, - 15567109, -1956358, -7748121, -29983166, 25297358, 7825431, -9803263, 7052337, 6925635, -37175088, - -16421807, 3560528, -14070313, -18036716, -19557134, 50502372, -39593156, -35407712, 14510547, 25933012, - 36855116, -18674518, -6032282, 3607773, -17038136, 17686676, -2695092, 13297219, -11138998, -4511863, - 3380139, 5211943, -6416681, -5497558, -539018, -6730214, -34724812, -51017768, -43802224, -380105, - -34462816, -44362716, 11463268, -3824669, -61757336, 44122200, 7939247, -3777424, 22073984, 68012952, - 65107408, 28011776, -79499848, 29545080, 21234318, -78024520, -966368, -37679748, -18156974, 40155796, - -47042776, 27376122, 135291, -8136816, -16716013, 8083129, -3768834, 13496935, -8920647, -41790032, - 40733468, 19179176, 48756468, -5076652, -16194174, -23510650, 19859928, -21189222, 57569740, 12068858, - 34662532, -44719200, 35815732, 1374390, 12816182, -29029684, 9962177, -34475704, -5218386, -35362612, - 14682346, 24451248, -46724948, 1902671, -38454988, 18116172, 23098334, 22262962, -2800319, -66363688, - 388695, 17534204, -5454609, 29512868, -63226212, 16297253, -26143466, 8540542, -22104050, 4638565, - 16700980, -7125351, 53687, -6880538, -7958575, 2568391, -16814796, 21554294, 5156108, -508954, - -26972394, -2484639, 3184718, -1909113, 11766063, -11725261, 2944200, -1191853, -5690832, 95575904, - 115749368, 48541720, 40306120, -66685808, 64156072, 93355408, -102114992, 12309376, 66108136, 11622182, - -121777352, -12045236, -66138200, 21436182, 24144158, -30655330, -12105365, 22308060, -55941948, -4346507, - -21951578, -27339614, 10853382, -42264624, 45610404, 32669668, 59002112, -29124174, 9607842, -6249178, - -24122684, 74683040, -1509681, -34183644, -16254304, 16241419, -16101832, -19391778, -22952306, 38062000, - 14046691, 52862456, -3779571, 19469086, 69164008, -43770012, 9143985, -29676076, 54874648, -21434034, - 25649544, 11035918, -2229088, -20669530, -39157216, -26310970, 10988674, 49770080, -46733540, 42015516, - 49484464, 25033216, 57840324, -28138478, -23053236, 37847252, -6564858, -6867653, -53422952, -3231963, - -44081396, 9199820, 55778740, 27526446, 14027363, 25733296, 15197742, -23830626, -10838350, -41725608, - 47341276, 2136746, -18848464, 12668006, 4243428, -21859236, 11493332, -3000035, 13565654, -2119566, - 20596516, 10018011, -44154412, -151910848, -63211180, -109354160, -58510340, -46986944, 25456272, -70362304, - -71182640, -34628172, -95236608, -31501438, 72271416, -2652142, 3096672, -19935090, -16685948, -9504763, - 6762426, -1649268, -63748052, -10653666, -12438225, 92204360, -11839077, 81915760, 6856916, -22701050, - 21601538, 67330056, -3371549, 154619, -27180700, -8540542, -28544352, 15564961, -11993696, -24970940, - 12436078, -33539400, 26890790, 26605174, 5373004, 58826020, -26817776, 29676076, -25071872, 32804960, - 22694608, 61978524, 8641474, -26167088, 33730524, -4952098, -20920786, 78855600, -5881958, -5480379, - 45853072, 13434658, 61710092, -48741436, -46849504, -7859790, -20287278, -7191923, -75831944, -17987324, - 26332444, -11042361, -32637456, -54123032, 3620658, 15539192, -26686780, -26345330, -46409268, -17332340, - 19709604, 19522774, 41089952, -7419556, -3794604, -2302103, 13700946, 15556372, 2772402, 25159918, - 7146826, 1917703, -3517578, -3377992, 18616536, -8875550, 18393198, 19823422, -925565, }, - { - -11068131, - 5985037, -3105261, 3661460, -2151779, 3077344, -6393059, 304943, -238371, -708670, 1481764, - 3173981, -96637, -281320, -3433826, -1352915, 1486059, 861141, -386547, 1350767, -397284, - 478889, -1490354, -1000727, -1000727, -326418, 150324, -730144, -508954, 1717987, -974958, - 1037235, -942745, -146029, -723702, 916976, 339302, 743029, 1243393, 1544041, 577673, - 416612, -122407, 176094, 231928, -279173, 283468, 3914863, -4479651, -601295, -824634, - -1114544, 725850, -2224793, 755914, -51540, 1013612, 889058, -1765232, -627065, 2692945, - -283468, 575526, -500364, 1170379, 2469606, 2856153, 485331, 1230508, -42950, -2254858, - -68719, 244813, -489626, 8590, 1241246, -1294933, -1741609, 758062, -841814, -777389, - -1221918, -53687, 1282048, 322123, -380105, -466004, -513249, -8590, 283468, -687195, - 251256, -785979, 472446, -11248519, -7962870, -3914863, -2918430, -2267743, -2299955, -816044, - -1696512, -547608, -1063004, -2796024, 545461, 1404454, -223338, 794569, -528281, -1458141, - -1438814, -2194728, -738734, 506806, 66572, -1243393, 828929, -1498944, -1458141, 942745, - 0, 30065, 770947, 854699, 231928, -356482, -435939, -594853, 296353, 133144, - -768799, 390842, -1526861, -678605, -382252, -180389, -1090922, -240518, -405874, -45097, - -16003048, -2106682, 1196148, 277025, 1127429, 165356, -914828, 618475, -712965, -710817, - -1466731, -1168231, 545461, -410169, 983548, -942745, -17180, -910533, 266288, 1662152, - -457414, 1245541, 34360, -1069447, -255551, 1509681, 706522, 996432, 1052267, -1490354, - 1000727, -584116, -156766, -785979, -427349, 487479, 631360, 397284, -401579, 1226213, - 992137, 657130, -386547, -723702, 77309, -588411, 98784, 18839874, 14955076, 3573413, - 6680822, 1644973, 5162551, 3674345, 1095217, 3700114, 1449552, 2813204, 1185411, -979253, - 2772402, 2001455, -783832, -219043, -5211943, -523986, 246961, 3204046, 343597, 158914, - 1599875, 167504, 1447404, 1382980, 204011, -68719, 504659, 2201171, 1647120, 1436667, - -146029, -513249, 83752, 1045825, -382252, -62277, 1116692, 414464, -556198, 17180, - 240518, -1058710, 1378685, -758062, 33174328, 12034498, 5942088, 3393024, 2205466, 2057289, - 2113124, 3298535, 916976, 5433134, 846109, 420907, 2461016, -1374390, 665720, -659278, - -496069, -1002875, 3644280, 1872606, -186831, 2617783, -1750199, -556198, -545461, 4088809, - -279173, 1417339, 446677, 1964948, 472446, -687195, 1196148, 1322850, -521839, 420907, - 697932, 298500, 977105, -350040, 1103807, 807454, -2549063, 513249, 448824, 440234, - 1973538, 12805445, -9502615, -3182571, -4458176, -2596308, -2699387, 1846836, -1593433, -3816079, - -1103807, -5108864, -1344325, -2171106, -5119601, -1174674, 996432, -3068754, -1187559, 575526, - -3659312, -75162, 3923453, 992137, 442382, -1782411, -68719, 1496796, -118112, -1636383, - -1964948, 1943473, -319975, -2340757, 68719, -951335, 2793876, -10737, 1166084, -403727, - 2388002, -1608465, 852551, 412317, 425202, 100932, 478889, -4295, -998580, 1625645, - 1024350, -34965328, -19630148, -4129611, -4827543, -3481071, -4213363, -6169721, -476741, 51540, - -1702955, 1402307, -1578401, 137439, -105227, -2108829, -2132451, -3588445, -1155346, 3294240, - -3195456, -491774, 3141769, 1846836, -450972, 1007170, -418759, -3489661, -1642825, -2892661, - -912681, -6442, -674310, 1462436, -2933463, -2467459, -85899, -3002182, -2209761, -2166811, - -2351495, 2327872, -736587, -3163244, -972810, 678605, 923418, -1172526, -1563368, -848256, - -2896956, -21653078, 12543452, 4337917, 2278480, 1844689, 2141041, 678605, -2022930, 350040, - -1093069, -644245, 4097399, 2098092, 3569118, 3135326, 3755949, -3148211, 1748052, 3513283, - 880468, 3032247, -3582003, 496069, -695785, -493921, -1163936, 1153199, -216896, -169651, - 3691525, -3738769, -775242, 1116692, 2250563, -1138166, 1926293, -1610613, -2014340, 2525441, - -1073742, -332860, -468151, 820339, -49392, 1050120, -1060857, -732292, -929860, -549756, - -770947, 1833951, 504659, 448824, -949188, -1733019, 420907, 31952410, 12897787, 2896956, - 7123204, 5823976, 970663, 2684355, 6732361, 3279208, -294205, 1619203, 727997, -858993, - 1840394, 6053757, 1260573, 7196218, 3298535, -5643587, 968515, 365072, 1078037, 5360119, - 2813204, 2254858, -569083, -648540, -813896, -715112, 702227, -974958, 1627793, 689342, - 2257005, -311385, -704375, 1035087, 1829656, 1219771, -304943, -2375117, -1166084, -1241246, - 2186138, 1823214, 2482491, 1597728, 302795, 547608, 2115272, 1917703, 1367947, 414464, - 257698, 1279900, 1099512, 35661112, 10078141, 4559108, 5439576, 1032940, 5252745, -751619, - -2168959, 4295, 1262720, 691490, -279173, 1140314, 5364414, -685047, -3536906, -2276333, - 2544768, 798864, 2985002, 5022965, 4189741, -169651, 2759517, -2993592, 242666, -2297808, - 3199751, 2012192, -3816079, 2291365, -1861868, 384400, -1518271, 2321430, -1464584, 2879776, - 2115272, 1902671, 3481071, 1286343, -150324, -753767, -66572, 601295, 3871913, 12885, - 34360, 399432, 1844689, 1391569, 85899, -369367, -633508, -1964948, -414464, 5042292, - -15257871, -6010807, -2585570, -3326452, -1707250, -1170379, 96637, 2302103, -2345052, -3955665, - 3682935, -4780299, -4818954, -725850, -1224066, 2269890, -1466731, 32212, -4664335, -2568391, - -5600638, -5866926, -6816113, -792421, 1413044, -4531191, -1398012, 798864, 358630, 335007, - -745177, -4490389, -3019362, 2143189, 631360, -944893, 4232691, -2798171, -1462436, 1226213, - 2538326, 2325725, -526134, -530428, 908386, 781684, -2985002, 395137, -1814624, -620623, - 73014, -1015760, 10737, 2070174, 281320, -264141, 341450, -2005750, 1159641, 1891933, - -519691, 51540, -38695508, -12116103, -7350837, -2978560, -5302137, -4146791, -1284195, -2946348, - -1297080, -3949223, -5448166, -3813931, -1370095, -7945690, -1962800, -3206193, -4896263, -551903, - 783832, 2649995, -2886218, -3949223, -1526861, 3324305, 4157528, 5207648, 2718714, -98784, - -2600603, -1116692, -19327, -3103114, 1267015, 2177549, 2645700, -1791001, -1612760, -1421634, - -766652, -577673, -1144609, 2126009, -648540, 1391569, -2707977, -4584878, -1982127, -137439, - 2280628, -3964255, 1288490, -1881196, 1844689, -1915555, 1086627, -1595580, -124554, -1024350, - -148176, 717260, 1440962, -966368, -1376537, -22194244, 5916318, 1640678, 21475, 3884798, - -3732327, 989990, -8585640, -2800319, 2978560, 2104534, 5527623, -416612, 6027987, -3534758, - -899796, 2873333, -5265630, -1945620, -3105261, 5866926, -390842, -4898410, 2435247, 4670777, - -4194036, -3204046, -3779571, 1063004, -901943, 1999307, -1466731, -1219771, -1039382, -2308545, - 3289945, -2705830, 609885, 2145336, -309238, 2482491, -1498944, 5471789, 783832, -588411, - -1971390, -1949915, 36507, -2239826, -2738042, -1709397, 377957, 1842541, -315680, 478889, - -2400887, -2388002, -3399467, -1372242, -1127429, -919123, 891206, 1331440, 19166292, 27584428, - 9463960, 9609989, 13022341, 9496173, -1359357, 1956358, -1054415, 1848983, 1574106, 2499671, - 1745904, 4810364, 1780264, 3062312, 899796, 9408126, 2158221, 4683662, 2682207, 2527588, - 7310035, 1876901, 9165460, 4889821, -1868311, 6624987, 1694365, 3350075, 6470368, 1481764, - 3854733, -1797444, -670015, 1999307, 2911988, -3775276, 3384434, -2102387, -4294968, -2345052, - 3562675, 5527623, 4052302, -581968, 1314260, 1432372, 2003602, 3008625, 1619203, 3377992, - 1930588, -2830384, -83752, 2435247, 3077344, 1127429, 1000727, 751619, -3049427, -1032940, - -1885491, 66346508, 4833986, -3197603, 5164698, -3429532, 7331509, 2426657, 7707319, -3710852, - 592706, 208306, 4574140, -8175470, 1490354, 5544803, -1277753, -1054415, 6768869, 11042361, - -4660040, -2336462, 1189706, 5557688, -2523293, 3678640, 47245, -3307125, -3045132, -2596308, - 2177549, 3500398, 3685082, -2538326, 4082367, -2506114, 3964255, 3884798, -1052267, -2224793, - 1294933, -3702262, -5643587, 1462436, -3889093, 1791001, 292058, 846109, 2267743, 208306, - 2776696, 446677, -3850438, 1754494, -1065152, 2050847, -2830384, -285615, 354335, 2166811, - -1574106, -4496831, -876173, -1801739, -22552874, -21930104, -4952098, 1679332, -966368, -3330747, - -3569118, -4922033, -1307818, 3594888, -1187559, -1269163, -5053029, 5280663, -324270, -4408784, - -3786014, 9174050, -8358007, 822486, 6085969, -764504, 985695, -8091719, 2546916, -3498251, - 1902671, -5641440, -3682935, 869731, 1462436, -2665027, -2954938, 227633, -1226213, 347892, - -3451006, -1990717, 3558381, -444529, -1705102, -1069447, 4529043, 1958505, -2619930, -4015795, - -3539053, 1129576, -562641, -1726577, 362925, 695785, -1956358, 5351530, 2914135, -622770, - -440234, -1464584, 631360, -1636383, -1591285, -1685775, -335007, -3115999, -2443837, -4163971, - 936303, -4451734, -178241, -1166084, -1086627, -292058, -8907762, -7494718, -9167608, -6442451, - -4849018, -3081639, 618475, 6442, -2392297, -813896, 2070174, 7967165, -6959995, 3545496, - -2398739, -4226248, 5446019, -371515, 1000727, 7395934, 974958, 3173981, -4670777, -977105, - -13406740, -1410897, 2428804, 1758789, 1060857, 1462436, 1784559, -2838974, -4075924, 3161096, - -435939, 2993592, 1365800, -3397319, 2815351, -176094, -9521942, -7653632, -1385127, -7239168, - 878321, 2413772, -579821, -1773822, -921271, 444529, -2244121, -569083, -502511, -1168231, - 2209761, 719407, 682900, -1213328, -1028645, 3732327, 876173, -2248416, 2441689, -481036, - -1756642, -3730179, 30065, -1990717, -717260, 2789581, 2102387, 2961380, -43074228, -9820443, - 637803, -8568460, 3461744, 856846, 10335839, -4836133, 618475, -2841121, 6929930, -14128295, - -13550622, 5710159, -6564858, 10189810, 3691525, -8192650, -14351633, -328565, -4058744, -6966437, - -2851858, 1638530, 2327872, -3365107, 12292196, 657130, -1219771, -5141076, 4187593, 4655745, - 5018670, 5390184, -665720, -3191161, -1204738, 3186866, -246961, 3846143, -3614215, -1423782, - -1241246, 4456029, 3582003, -3904125, 5070209, -2823941, -3524021, 433792, -1597728, -3354370, - 3463891, -3970697, -521839, 1009317, -955630, -1617055, 914828, 3324305, -2055142, 3186866, - -2628520, 2138894, -1455994, -1647120, -1024350, 642098, 4123169, 745177, 3863323, -2450279, - 39507256, 34709780, 7264937, 9279277, -1840394, 11345156, 9101036, 11428908, -461709, 4597763, - 2765959, -10709501, -9066676, 4999342, 987843, -7662222, -8102456, -4514011, 534723, 4629975, - 1363652, 10872710, 9921374, 4372277, -2274185, -2372970, 6575595, 6176163, 502511, 5418101, - -1722282, 6919193, 403727, -1436667, 9579925, 5027259, 7859790, 5117454, 1743757, 5557688, - 2787434, 1969243, 5113159, -2729452, 1041530, 6831146, -49392, -4290673, 4039417, 4060892, - 2879776, -2991445, -53687, 4015795, 5961415, -2896956, 7204808, 8282845, -1400159, -4361540, - 788127, 1964948, 1301375, 3682935, 10737, 1372242, 2808909, -1911261, 229781, -2750927, - -691490, -3738769, -2160369, -382252, 47916804, 3914863, -1359357, 3393024, 2310693, -7846905, - 2055142, 2149631, 6442, 5119601, 7325067, 10971494, -4885526, -4937065, -7741679, -6247030, - 7073811, -534723, 10213432, -2433099, -2473901, 4234838, 8875550, 3551938, -8905615, 7080254, - -2596308, 5669357, -2935610, 4406637, -5360119, 3322157, -423054, 5168993, 633508, 2959233, - 1586990, -9008694, -4960687, -813896, -1816771, -818191, -2806761, 4389457, 1668595, 9345849, - -1430224, -6345814, -3704409, -609885, 569083, -7060926, 2403034, -2383707, -304943, -657130, - -4129611, 3803194, 7224135, -2239826, 3723737, 891206, -4037269, -354335, -3841848, -3180423, - 657130, -5615670, -4000762, 2388002, -277025, 1294933, 3886946, -5315022, 6470368, 663572, - -2622078, -6431714, 1879048, -2362232, 13840532, -3304977, -13211319, -8935679, -11909944, 11016591, - -8798241, 2441689, 13462575, -594853, -13653701, 936303, -14332306, 11946452, -4153234, 11907797, - 90194, -4533338, 10256382, 384400, 2145336, -7705172, -9715216, -1563368, 3444564, 2093797, - -1879048, -4490389, 4552666, -1387274, 3408057, 5207648, 6347962, 2927020, 3524021, -12826920, - 1097364, -2907693, -4357245, 1758789, 6386617, -5357972, -9822590, -4350802, 2916283, 1123134, - -8626442, -3528316, 4067334, 5905580, -5171141, -3386582, -3972845, 6040872, 8053064, 1621350, - -2667175, 908386, 5781026, -2755222, -193274, -3777424, 4065187, -4726612, -519691, 5607080, - 3390877, -1634235, -816044, -139586, -1771674, -48348448, -48984104, -7939247, -24011014, -14903537, - -8523363, -13327284, -1623498, 10050223, -21960168, 8018704, -4498978, 7314330, 1262720, 4481799, - -9111773, 2308545, -1144609, -4754529, -20145544, -4110284, -10477573, -12811887, -1340030, 3231963, - 676457, -4361540, 2785286, -4140349, -1228361, 10692321, -231928, -3566970, 661425, 6994354, - 9401683, 6298570, 0, 5029407, 5813238, -571231, 51540, -10464688, 3839701, -8647917, - 1614908, 8338679, -5746666, -10471130, 3021510, -5873368, -5619965, 1159641, -88047, -4960687, - 2407329, -1176821, 11280732, 6339372, 3451006, 1398012, 4136054, -408022, 1243393, -4443144, - -8003672, -1316408, 689342, -5708012, -3966402, -3131031, -2675765, -3229816, 1786706, -1653562, - -489626, -3582003, -28658170, 53322020, 41987600, 2540473, 8602819, 3315715, 9371619, 14106820, - 3322157, 13698798, 2557653, -14568529, 9723806, 11540577, 3519726, 3403762, 8759586, 11370926, - -11375221, 9474698, -5970005, 8315057, 1324997, -7007239, 1410897, 9414568, 5441724, -11315091, - 5512591, -4655745, 16415365, -1413044, 3874061, -2555506, -10509785, 10610717, 10625749, 5018670, - 2738042, -498216, 3846143, 11267847, 2660732, 8053064, 1045825, 5592048, 3090229, -762357, - 6139656, -7404524, -11467563, -5065914, -8740258, -7438884, -3783866, -7638600, 10288594, 7290707, - 910533, -1840394, -3644280, -1209033, -251256, 77309, 521839, 1428077, 2160369, 1185411, - -201863, -2710124, -2295660, -384400, -204011, -983548, 1168231, -1189706, 6204081, -1391569, - 8143258, 71541272, -28011776, -15176267, 2598455, -148176, -3539053, -19849192, -8478265, 5089536, - -957778, -2826089, -3878356, 3081639, -16323023, -4640712, 8497593, 15934329, 8686571, 7166153, - -5085242, -4803921, -9390946, 11003706, -15466177, -2673617, 3850438, -10170483, 3358665, 4417374, - 12479027, -19026706, -1589138, -307090, -3925600, 5093831, -17628694, -9178345, 19443316, 12818330, - 2680060, -3304977, 11620034, -3369402, -1488206, 2194728, 9090298, 5259188, -5596343, 1224066, - -3262028, 7468948, -11879880, -5327907, -7189776, -7546258, 14566382, 4022237, 1818919, -6397354, - -526134, -2149631, -2555506, -6708739, 1095217, -6358699, -261993, 2229088, 5617817, -9663676, - -6702297, -8538395, -2604898, 4647155, 824634, 6161131, -813896, -7934952, -833224, -3569118, - 3715147, -330712, 21251498, 48943300, 8035884, 18678812, 16870632, 16194174, 5407364, 12109660, - 7456063, -3500398, -9932112, -6296422, -2864743, 13870597, -11834782, -13097503, -893353, -581968, - -5357972, -10020159, 29673930, 27885076, 20980916, 1050120, -11963631, 2145336, 1997160, -5946382, - 6837588, 4400194, 11980811, 1421634, 4898410, -541166, -8229158, 13600014, 11257109, 8143258, - -1932735, -10722386, 672162, -790274, -2991445, -21934398, 15841987, -9972914, 18268644, 1080184, - 9884867, -2055142, 10898480, 16580721, 3313567, -7441031, -547608, 3077344, -5446019, 2952790, - -2110977, -6979322, -3837553, 2345052, -1700807, 6977175, 2461016, -11688753, 749472, -1567663, - -12620761, -2927020, 2576981, -4763119, 1391569, 10756746, 4406637, -581968, -3704409, -2802466, - 231928, 4715874, -1286343, 5095979, -51391432, -6824703, -32034014, 360777, 5637145, -10874857, - -18734648, -21668110, -20544976, -12163347, -16756815, -4108136, -1140314, -4329327, 5377299, -3341485, - 1086627, 13151190, 5901285, -1301375, 31110596, -6831146, 6227703, -4550518, 2607045, 4516158, - 1651415, -1748052, 4565550, 14570677, 4380867, 5158256, 1629940, 5828271, 12300786, 16958678, - 5325760, 20577188, -5512591, -17740362, 17916456, -5682242, -3775276, -3612068, 10127533, 15721728, - 11847667, -302795, -4086662, -8995809, -22939420, 14130442, 16050293, 11362336, -13700946, 8291435, - 2136746, -1378685, 12996571, 2196876, 8727374, -7260642, 4256313, -9051644, -874026, 7853348, - -2293513, 5907728, -1249836, -3304977, -3234110, -11025181, 1110249, 826781, -94489, 2121714, - -2448131, -13600014, 1030792, 712965, -89930176, -40374840, 18309446, -3515431, -3079492, 3189013, - -11265699, -9904195, -3386582, -4479651, -15751793, 11100343, 1211181, 23489176, -13146895, -11306501, - -19235012, -10782515, -19810536, 1589138, 7232725, -29590178, 19048180, 16378858, -2368675, 3242700, - 12401718, 1808181, 10909217, -22434762, -22570054, -12543452, -14813342, -11420318, 36507224, 11875585, - -8076686, -13151190, -18741090, 8832600, 4992900, -8918500, 7260642, 7164006, -13230647, 1191853, - 2911988, 10346576, -12292196, 30043296, -13219909, -10563472, 4657892, -3296388, -206158, -9118216, - -3461744, 878321, 19076098, -6000070, 27507118, 5811091, 1750199, 3010772, 7312182, -8336532, - -3021510, -10941429, -8836895, -8403104, -85899, 14772540, -9721658, -7181186, -4142496, -5624260, - -5220533, -712965, -3470334, -5201206, -4554813, 14134737, 45541684, 23310934, 14583561, 9790378, - -15925739, 1552631, -12869870, 20154134, -2121714, -2750927, 6947110, 4389457, 4769561, -665720, - 7196218, 2514703, 7593502, -6268505, 19829864, 2611340, -1728724, 59201828, 3298535, -4578435, - -15101105, 8770323, -14042396, 13174812, 31986768, -2553358, 7881265, 7818988, -16370268, -18429704, - 609885, 341450, 14083198, -9139690, 564788, -1017907, 10387378, 10595684, 17832704, 6637872, - 6219113, 7318625, 801011, 11680164, 5514738, -21633750, 4670777, -11175505, -27668180, -2441689, - 7844758, 100932, 2366527, -3725884, 584116, -934155, -96637, 3446711, 657130, 12584254, - -7516193, -1219771, 2510409, 2611340, 416612, -4891968, 8783208, 14798310, 14592151, 3010772, - -3023657, -1529008, 5231270, -727997, -1769527, -337155, 2920578, 6818261, -1140314, -2677912, - -4842576, -3064459, 66640712, -19428284, -7363722, -18073222, 33537252, 12339441, 2763812, 6790344, - -4907000, -7844758, 11798275, 1078037, -11645804, 2995740, -15356656, -11632919, 751619, -15567109, - 2104534, 5059472, -11499775, -20227148, 1915555, 1069447, 13673028, 22449794, 15650861, -10552735, - -171799, 13935021, 25477746, -26706106, 10063108, -5027259, -448824, -12195560, -17126182, 1440962, - 15356656, 4494684, 6869800, 9689446, -1075889, 6466074, -1550483, 4619238, 9848360, -17832704, - -12494060, 27670326, -2218351, -878321, -6285685, 11040213, 35824324, 8952859, 5383742, 11607149, - -9455371, -10675141, -15032, -7973607, -20560008, 13200582, 1675037, -10260677, 5617817, 3060164, - -5841156, -9665824, 13045963, -4520453, -15622944, 7275675, 7209103, 11012296, -10896332, 989990, - 4737349, -1926293, -4176856, 16516297, -1352915, 3027952, -7374459, -981400, -229781, 56899728, - 53912576, -17547088, 14710263, 4443144, 11431055, 28926604, -3556233, -15094663, -5284958, 55875376, - -31387620, -5963562, -15547782, -12461848, -25428354, 27951648, -8044474, -37967512, -28286654, -34638912, - -13269301, 30709016, -3620658, 14508400, -5392332, -15655156, 13718126, 4067334, 17364552, -16664473, - 15457587, 12287901, 6369437, 7157563, -27240830, 7907035, -22728966, 19318762, 40830108, 11856257, - 12320114, -25890062, 36571648, 9814000, -3721589, -5604933, -7329362, 11482595, 18328772, 4486094, - -4168266, -1015760, 5018670, -8778913, -6229850, -8446053, -6483253, -648540, 13445395, -8907762, - 20055350, 7230578, 12300786, -4110284, -28567974, -19170586, 7372312, 1979980, -8478265, 10715943, - -468151, -955630, 5826123, -4002910, 8448201, -1406602, -916976, 4099546, -4900558, -852551, - -5306432, -3225521, -6674379, 4406637, 382252, 1425929, -53541064, -31915902, 7666517, 4185446, - -319975, -23555748, 13924284, 7853348, -14231374, -38534448, 31372588, 7668664, 11620034, 17736068, - 10419591, -5102421, 5677947, -9756018, 26031796, -21786222, -37690484, -1288490, -1973538, -17879948, - -40965400, 1234803, -8516920, -21522082, -11970074, -6771016, 9006546, 1494649, 14867029, 30017526, - -12936441, -24882894, 7664369, -2952790, 133144, 12270722, -17781164, -16121160, -2349347, 14484777, - -19224274, 15814070, -5656472, 30528628, -4531191, -9605694, -3766686, 139586, 5948530, -34976068, - 4881231, -30266634, 30769146, 105227, 19247896, 11542725, -12013024, -1561221, -15869904, 7670812, - -1876901, 6083821, 5617817, -20834886, -3339337, -20098300, -9038759, 8942122, -6272800, -12335146, - 5718749, -188979, -20983062, -10269267, 2044404, 712965, -8763881, 9083856, -4836133, -5334350, - 4260608, -12509092, 6369437, -74120400, -34222300, -12446815, -8349417, -2257005, 7705172, -25765508, - -18601504, 6867653, -21726092, 6859063, -24124832, -7479686, -23330262, -28039694, 29624536, 12363063, - 4383014, -1737314, -24605868, -41517300, 20654498, -54462332, 19681688, 856846, -17557826, 2916283, - -10926397, 4217658, 37879464, -19065360, -2123861, -40913860, 32117766, -9470403, 14568529, -14383845, - -4915590, -3292093, -1644973, 19110456, 6457484, 39760660, 47637628, -4973572, 597000, -15753940, - 1657857, -6116034, 7344394, 15251429, 1775969, 34589520, 9676561, -12809740, 5411659, 7204808, - 94489, -2396592, 972810, 26306674, -19707458, -39479340, -16335908, 627065, 9214852, 6906308, - 19758998, -1958505, 8377334, -9975062, -16007343, -21977348, -17706002, 1533303, -5753109, 10771778, - 2733747, -6027987, -2881923, 18981608, -420907, 10559177, -4660040, 3639985, -4724464, -4322885, - -7264937, 94493576, 42183020, 29152090, 12092480, -10758893, -17186312, -29493540, 16353088, 28271622, - 11678016, -13234942, 33363306, 18784040, 33354716, 2265595, -24142012, -9369471, 50085760, -52293376, - -10752451, 34574488, -20493436, -11491185, 80889264, -10151155, 23115514, 73349448, -11781095, -4827543, - -2153926, 9113921, -4078072, 31799938, 20444044, 26210038, -18567144, -43334072, 17306570, -17100412, - 20802674, -8123931, 7544110, 30880814, 17877802, 1806034, 13572097, 6257768, 13067438, 29854318, - 16816944, -3189013, 29014652, 12165495, 4125316, 6899865, 53455164, 32070520, 49392, 29132764, - -12869870, 36831492, -9193377, 8117488, -10475425, 4406637, 21092584, -11714523, -858993, -2093797, - 7312182, 813896, -13844827, 551903, -11860552, -21174188, 3532611, -28187870, 10943577, 17282948, - -7088844, -12071006, -8121783, 15139760, 4464619, 809601, -6345814, 121951304, 55115168, -24700356, - 10657961, 63011464, 1486059, 45505180, -13368086, 18000208, 37937448, -28580860, 3457449, 66196184, - 59463824, 48399988, 17102560, 41568840, 7002944, 36440652, 12717398, 11027329, -22780506, -26751204, - -38044820, -75387416, 24032490, 893353, -20463372, -7213398, 26087632, -17134772, -2589865, 2944200, - 14669461, -66799628, -10803990, 48475148, 37327560, -13488345, 24663850, 21062520, 13662291, -8188355, - -15524159, -6743099, -10443213, -6764574, -24672440, -20965882, 17109002, -41620380, 13780403, 34149284, - -10123238, -24363202, -37958920, 35613868, -1110249, -17987324, -11753178, -8211978, -13024488, 7501161, - -6012954, -13239237, 13531294, 55437292, -27702540, -16662326, 7084549, -10771778, 12801150, 508954, - 28589450, 5523328, -2776696, -2396592, -29686814, -14014478, -4610648, 2529736, 2295660, 10625749, - 6569153, 1236951, 4776004, 5523328, 17517024, 1447404, 485331, -11373073, 5746666, 8463233, - 3508988, -48185240, -13445395, -57921928, -12599287, -57887568, 27818504, -55155972, 29665340, -9579925, - -31933082, -9683004, -14952929, 67422400, 10456098, -49166640, 938450, -32119912, -25305948, 33195802, - -37510096, -34716220, -39150776, 58800248, -7928510, 38805028, -59869696, -31956704, 23813446, -27940910, - 22711788, 65088080, 42775728, 40261024, 6899865, -6953552, -31621696, -44998372, -2409477, 9962177, - -41661184, 874026, -24554328, 12017318, 18393198, -47699908, -40486508, -74728136, -11684459, 5108864, - -32115618, -46224584, 45513768, 2297808, 46748572, 45848776, -5643587, -6509023, -18640158, 26441966, - 22917946, 3285650, 11323681, -3775276, -2353642, 22361748, -5912023, -26231512, -20143396, -33021856, - -27721866, -10269267, -1288490, -4552666, -41723460, -24210730, 13580687, 3143916, -14847702, 17940078, - -3665755, 910533, 28205050, 23293756, 15002321, 5935645, 18056042, 2662880, 470299, 8353712, - 5931350, -3985730, 1713692, -82304456, -14184129, 7241315, -7593502, 113817, 22282290, -18234284, - 19814832, 18749680, -12992276, 25383256, -35281008, 44216688, 30335354, 1505386, -32497870, 2609193, - 21584358, -96170760, 19950124, 39206608, -68867656, 28333900, -35259536, -50530292, -46050640, 23383950, - -11512660, -71807560, 38588132, 20637318, -43471512, -72651520, 14699526, 8557722, -22872848, -5293547, - -37329708, 35081292, 28980292, 51047832, -40868760, 6644315, -54279796, -20544976, 9363029, -34735548, - 14437533, -4320737, -27251568, -40980432, -44283260, 64753076, -43658344, -20656646, -16432545, 2703682, - 29751238, 17630840, 21700322, 210453, 25391846, -8557722, 4060892, -10788958, -26847840, 5282810, - 57498876, 8907762, 1322850, -236223, -37041944, 24084030, 38684772, 40359808, 8068096, 2993592, - -1767379, -3238405, 5836861, 779537, -18429704, -418759, 3706557, 2695092, 274878, 362925, - 14276471, -4964982, 1823214, -3618510, 753767, 24878598, -54651312, -29038274, -57711476, 16432545, - -10249939, 22909356, -15726023, 10855530, 18893562, -19320910, -32953136, 49173080, -12902082, -21923660, - 57129508, -11763915, -13314399, 65294240, -37776384, 9607842, 15983721, 5087389, -57582628, 184684, - -8403104, -34619584, 19789062, -27197880, 36631776, -6459631, 40774272, -44631152, 27741194, -79018808, - 871878, -43119324, 48105780, -7425999, 6573448, -8297877, -43851616, -3199751, 38201588, 100815768, - 7438884, 6322192, 21421150, 34443492, -5854041, -9732396, 3146064, -1752347, 88669600, -8061654, - 13653701, 35581656, -34565896, -59100896, 178241, -62461708, -7672959, -32085554, -23001698, -12562779, - -26371100, 14794015, 21962316, -36399848, 45883136, 38089916, -5469641, -9487583, -37516540, 26145614, - 9274982, 24796994, -21043192, 10222022, -4110284, 18738942, 2136746, 18129056, -9274982, 13277891, - -2282775, 270583, 4406637, 20562156, 9846213, 6255620, -6822556, 461709, 1853278, 95008968, - 103543072, 721555, -31769874, -25548612, 86719688, -57058640, -65002184, 67555544, -61407296, 39440684, - 12000139, 54640572, 50410032, 33988224, 5446019, -34559456, -29802778, 70929240, -30189326, -3143916, - 17289390, 60410864, 87535728, -2763812, 59788092, -49089328, -51200304, 5682242, -18942954, 28162100, - 17871358, -43785044, 5912023, 27674622, 71977208, 24472724, 29469918, 26993870, 32167158, 8209830, - -2581275, 45621144, 7990787, 36468568, 58488864, 12137578, -24131274, -20525648, 52714280, 13750338, - 108194520, 25196426, 42610372, -44225280, -69477536, -6751689, -81110456, -52014200, -18539226, -27790586, - 2987150, -4198331, 592706, 1047972, -60672856, -50259708, -26566520, -51896088, 18889266, 20534238, - -15743203, -4075924, -48157320, -7610682, 14130442, -13758928, -4183298, 4866198, -30414810, 12644384, - -9384504, 3586298, 5334350, 139586, 2027225, 6556268, -7303592, 1101659, 7015829, -304943, - 1638530, 2029372, -45176612, -158969632, -65601332, -129744520, -29098404, -45382772, -18326626, 11789685, - -42539504, -51552492, -82388208, -65539052, 58536108, -10462540, -52424372, -55744380, 12594992, -74167640, - -104593192, 17207786, -24367496, -22469122, -22505628, 20057498, -62360776, 65534760, -38173668, 44489420, - -31065498, -29854318, 678605, 35916664, -50873888, -48619028, 26006026, -9257802, 71734544, -31533650, - 41087804, 61804580, 29360396, -22623740, -10350871, -6547678, 50702088, -17897128, 34016140, 68423120, - -57632020, -100506528, -39618924, 33973192, 41704132, -47474420, 77876344, -25194278, -28271622, -9517648, - -8630737, -24245090, -63219772, -26789858, -65322156, -62569084, -38798588, 45988364, 10780368, -11199127, - 4112431, 71161168, 66846872, 4621385, -31074088, 12655121, -7118909, 29231548, 9103183, -12904229, - -29605210, -2768107, -6019397, -46954728, -12227772, 17708150, 48507360, -21872120, -53687, 18427558, - -27416924, -983548, -2001455, 695785, -14336601, 18094698, 977105, 4617090, -2375117, }, +const Word16 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1799]={ + { + {-87, -152, -77, 6, -43, 99, -118, -195, -164, 27, 0, -55, 80, -5, 91, -127, -100, 28, -1, -17, -108, 27, 17, 27, 110, 70, -16, 37, 33, 43, -26, 6, 144, 90, 37, -74, -42, -18, -48, -61, 116, 45, 47, -15, 23, 11, 25, 24, 12, 77, -84, -55, -11, -12, -114, -49, -146, -86, 25, 46, -44, -122, -34, 35, -11, 81, 3, -17, 232, -115, -82, -21, 41, 29, -117, 26, -3, 153, 86, -115, 169, -102, -26, -5, -49, -70, -119, 23, 198, 12, 41, 74, 26, -75, -14, -48, + -34, 108, 39, 8, -33, 14, 2, -51, -65, 104, 93, 8, -17, 122, -174, -75, 84, -83, 163, 8, 117, 6, 20, 63, -55, -34, 5, -10, -41, -48, 76, -12, -159, 148, -14, 17, -133, 57, -54, 45, 13, -15, -44, -16, -72, 73, -149, -30, 126, -104, 55, 153, 64, -9, -58, -11, 45, -15, 332, 63, -49, 103, -52, -40, -56, -21, -128, 179, 100, 78, 80, 79, -85, -110, 146, -32, -119, -220, 33, -65, 66, 2, -22, -49, 66, -82, -45, 109, 203, 53, 90, 17, 100, -22, 106, 69, + 8, 61, 0, 17, 0, 150, 27, 38, -40, 21, -17, -23, 117, 139, -57, -54, 22, 127, -218, -14, -65, -158, -71, 19, -75, 66, 48, 1, -104, 41, -29, -93, 104, -149, -72, -147, -78, -17, -10, 90, 55, -214, -8, 19, 156, -54, -241, 193, -227, 2, -93, -93, -241, -179, -87, -74, 116, 25, -155, 13, -77, -9, 6, 58, 27, -83, 25, 7, 54, -62, -22, -26, -69, -136, 183, 67, 37, -35, 158, 113, -128, 28, 28, -39, -68, 7, -132, 21, -12, -133, 165, -11, 6, 172, -144, 132, + 72, -36, -100, 20, 3, -142, -84, -16, -23, -76, -149, -13, 65, 54, -20, 41, 72, -56, 34, -110, 99, -59, -375, -354, 137, 235, 141, -320, 226, -77, -31, 20, -150, -113, 266, -4, -3, 20, -9, 87, -137, 80, -74, 71, 120, -83, -26, 69, -25, 126, -44, 53, 6, -16, 5, -112, -158, 140, 13, -31, -5, -146, -184, -9, -4, 88, -173, -145, -38, -298, 105, -28, 50, -28, -81, 39, 365, 203, 97, -119, 135, -8, -206, -7, -216, 164, 8, 13, -131, -6, 98, 35, 5, 10, -9, 90, + 60, 3, 29, -540, -39, -132, -17, -92, -303, -15, -80, -128, -284, -37, 206, -144, 136, -26, 191, -66, 155, -52, -150, -42, 18, -68, -134, -111, -132, 3, -121, 43, 16, 11, 60, -93, -122, 177, -15, 52, 3, -140, -87, -99, 6, -71, 125, 126, 21, -170, -56, 315, 78, -132, -106, -66, -117, -60, 245, 152, -180, 112, 143, 218, -58, 92, -17, 8, -91, -171, -39, 139, 5, 257, 160, 24, 56, 181, -133, -59, -18, 692, 461, -141, -29, 3, -22, -78, 93, 237, 196, 104, -366, -160, 43, 21, + 150, -272, 51, 369, 244, -43, 84, -33, -130, -171, 4, -146, -91, 41, 108, -108, -205, -96, 27, 180, 247, -51, -277, -60, -104, -273, -25, -12, -138, 41, 63, 153, -236, 88, 106, 21, -230, -168, 63, 4, 45, -29, -34, -14, -135, 53, 49, -91, 136, 173, 229, 52, 1, 222, 351, 51, 25, 59, 172, 30, 98, 275, 46, 174, 354, 17, 66, 97, 165, -60, 101, -86, -71, -292, 109, 212, -196, 162, -88, -255, 261, 169, -60, 170, 308, 230, -177, -87, 149, 56, -49, 129, 101, 171, -3, -69, + -156, -250, -22, -207, 12, -66, 103, -165, -400, 86, -111, 178, 29, 14, -122, -227, -206, -19, -36, -173, 224, 308, 306, 126, -249, -26, 288, 23, -70, 134, -58, -87, -308, 148, 69, 405, 179, -296, 81, 87, -36, -29, 91, -121, 58, -122, -239, -121, -177, -60, -39, -331, 25, 30, 170, -70, -130, 48, 26, 67, 11, 165, 79, 111, 29, -23, 113, 51, -309, -108, -445, 10, -76, 42, 88, -4, 225, 45, 317, 27, -360, -3, -140, -72, -10, -66, -11, -303, 71, -152, 358, -376, 209, -91, -304, -71, + -212, -60, -60, -345, 102, 89, -54, -68, -15, 103, -257, -8, 253, 30, 350, 546, 239, -525, -668, 310, 155, 468, -80, 198, 60, 146, 270, 310, -131, 42, -613, 456, 93, -89, 0, -287, -221, 236, -55, -85, 261, -192, -190, 6, 261, 102, -69, 3, -130, -23, 33, 130, 20, -321, -301, 68, -27, 73, -16, 124, 261, 455, 10, 282, -52, 79, 214, -192, 393, -55, -212, -329, -41, -273, -320, -96, 181, -107, -242, 132, 216, 296, 411, -314, 148, -89, -257, 106, -289, -61, -490, 207, -120, 74, -54, 78, + -520, -569, -288, -143, 357, -303, 594, -189, 120, -110, 121, -64, 504, 51, 178, 159, 35, 326, 22, -407, 186, 83, 177, 2, -336, 474, 226, 208, -62, -116, 39, -11, -271, 185, 95, -118, 163, 311, -11, 131, 268, -290, 56, -83, 111, -565, 162, 306, -117, 98, 266, 175, -13, 117, -312, 99, -191, 37, 68, 71, -152, 588, -118, -82, -149, -467, -216, -276, -366, -42, 467, 557, -69, 191, 196, -418, -160, 388, 280, -147, -139, -388, -144, -122, -204, -145, 58, -386, 35, 129, -54, -157, 97, 36, -225, -316, + -355, -130, -347, -131, -142, 17, -328, 85, 135, 28, -373, 129, -462, 157, 257, 23, 401, 28, -118, -56, 272, -79, 374, 151, -125, -108, 70, -169, -97, 35, 357, 11, 192, 129, 39, 271, -102, -200, 109, -135, -65, -413, 260, -126, -119, -59, -474, 614, 165, -36, 268, 117, 139, -221, -370, -403, -195, 63, -427, 207, 342, -453, -161, 214, -199, 161, 533, 103, -40, -133, 378, 857, 951, 256, 600, -418, -373, -116, -34, 10, 156, 272, 557, 151, 518, 31, 175, 50, -110, 201, 21, 66, 65, -274, -4, -158, + -245, -192, 32, 4, -333, -171, 481, 304, 264, 362, -211, -20, -632, 8, 595, -133, -84, 45, -32, 420, -6, -97, 371, -431, -631, -289, 89, -379, 294, 345, -490, -220, 36, -33, -714, -500, 273, 79, -20, 216, -289, -225, -416, 81, 174, 11, 94, -335, -399, 256, -393, 164, -872, -607, 416, -78, 767, -178, 630, -505, 3, 243, -64, 39, 62, -28, -400, 148, 132, 181, 180, -107, 305, -278, -228, -153, 434, -235, -98, 52, -25, -220, 184, -247, -325, -570, 37, 119, -412, -172, 174, -67, 84, 45, 442, 46, + 327, 168, -5, 291, 43, 111, -542, 553, 169, 437, -278, 128, -303, 454, 307, 550, 60, -121, -414, -5, 40, -310, 437, 98, 36, 522, 79, -127, -222, -37, 185, 332, -197, 398, 398, -936, -40, 487, -308, -103, 364, -388, -786, 160, 141, 127, -95, -463, 127, 139, 46, 267, -827, 393, -182, 209, -464, 399, -590, -375, 251, -146, -53, -446, 380, 489, 19, 68, -197, 729, 200, 212, -105, -599, -107, 360, -35, 530, 33, -163, 154, -13, 352, -586, -39, -443, 544, -162, 209, 13, 23, -524, -150, 515, 202, 75, + -96, 47, 116, -677, -677, 812, -282, -802, 400, 379, -557, -769, -474, -456, 235, 405, -551, -247, -574, -10, 72, -681, 78, -313, 965, 93, -938, -167, 401, 308, 177, 495, 421, -609, -201, -210, 576, -172, 679, 41, -445, -285, -669, -687, 12, 128, -150, -333, -190, 93, 86, 294, -386, 225, -448, -450, 70, -61, -157, -471, -513, -191, -174, 742, 43, 278, 374, 30, 863, 398, -309, 86, 440, -138, 563, -113, 65, 75, -781, -766, 121, 584, 20, -151, -833, 62, 277, 167, -263, -361, -173, 1, -5, 492, -394, -434, + 872, -298, -270, -84, -191, -608, 51, 353, -936, -57, 292, 270, -293, 179, -518, 1, -105, 132, -460, 268, -811, 96, 64, 438, 494, 181, -276, 309, -62, 349, -388, 21, 547, 352, -194, 33, 57, -162, 290, -146, -247, -379, 281, -644, 439, 36, -583, 540, 625, 479, 249, -342, 750, 18, 359, -494, -303, -479, 196, 80, 324, -656, 139, 329, -1006, -62, -254, 562, 549, 177, 55, 160, -198, -124, 136, -862, 16, 705, 176, 347, -1026, 464, -566, 770, -61, 286, 618, -671, 1172, 804, 642, -309, 186, 765, -181, -281, + -168, -69, -582, 130, -302, -755, 718, 202, 209, 56, 178, 239, 753, 122, -446, -74, -464, 59, 83, -879, -22, 420, 47, -100, -243, 852, 197, 338, 209, -526, -332, -309, 568, 282, -99, 288, -37, -660, 603, 19, 689, 19, 84, -45, -885, 60, 41, 33, 576, -292, 881, -1382, -212, 840, -309, 241, -281, -617, -287, 427, 501, 216, -1113, -1267, -147, -580, 49, 395, -553, 176, -828, 368, -473, -2141, -178, 1341, -609, -224, 1286, -292, 29, 1609, -424, 370, 104, -215, 1234, -1015, -181, -13, -231, -193, -262, -13, 364, -223, + -754, 18, -42, 216, 197, 55, 515, -14, 201, -149, -757, 490, -153, -708, -43, 417, 1189, 643, 984, 26, 180, 510, 35, -58, 900, -47, -482, 1168, 101, 214, -101, -148, 537, 29, -493, -359, -246, -101, 719, -352, -156, 119, 89, 22, 779, 551, -1170, -635, 976, -213, -866, -50, 63, 288, 1031, 836, -495, 122, -78, -32, 36, -608, 901, -294, -516, 161, -357, 448, 89, 653, -167, -694, -546, 486, -205, 644, -136, 405, -401, -386, -165, 12, -515, 102, 79, -27, 600, -42, 233, -418, 323, -639, 697, -616, 436, 160, + 595, -945, 83, 41, -222, -693, -1058, -223, -893, -403, -703, -393, -1329, -471, 693, 753, 484, 402, 82, 400, -732, -183, 350, 122, -351, -1606, 474, 242, -835, 323, 319, -621, -463, 709, 95, 372, -188, 463, -146, -87, 379, 168, 127, -4, -248, -449, -261, 664, -236, -607, 1006, 601, 83, 438, 139, -537, -1525, 605, -47, -850, 698, -98, -1112, -965, -484, 705, 298, 729, 960, 254, -767, 210, 283, -1020, -153, 516, -300, -1116, -807, -1354, -825, -238, 835, 1142, 587, -136, 836, -268, -2005, -1671, 374, -882, -925, 1267, 224, -1855, + -1262, 318, 217, 109, 396, 1209, 714, 583, 1499, 1480, -473, 525, -612, 383, 11, 229, -726, 74, -620, -529, -1, -1245, 26, -518, 137, 391, -13, 451, -623, 964, -467, 6, 651, -590, 241, 494, 579, 108, 211, 169, -903, -478, -141, 161, 147, -107, 610, -165, 0, -85, -251, 244, 131, -685, 224, -543, 172, -1352, -52, 1, 14, 604, -210, -467, -205, 559, 21, -1297, 1897, -123, -331, 451, -52, -234, -320, -329, -365, 1296, -461, -657, 618, 135, -961, -64, 448, -1152, -1800, -1653, 3706, 3150, 3502, 8047, 2054, -1968, 591, -6383, + -6848, -1647, -4318, -3268, 1979, -1015, 378, 5134, 2487, 3816, 7217, 4876, 1220, 1088, -2186, -6576, -5098, -3833, -7855, -3124, 139, -1347, -670, 3983, 996, 561, 4842, 636, 1117, 6987, 5060, 3267, 6512, 3297, -1213, -68, -2134, -10198, -8989, -7187, -11284, -8521, -3087, -4013, 856, 7830, 6896, 9666, 12085, 9081, 6991, 6914, 3743, -1230, -2511, -5522, -8009, -7689, -6724, -7425, -7600, -5582, -2607, -1035, 2432, 6842, 6168, 6817, 3519 }, + {-106, -222, -85, -125, 3, 43, 132, -64, 11, -98, -76, -104, 51, -120, 27, -101, 197, -12, 15, -10, -140, 89, 210, 3, -53, 10, -40, 67, -25, -36, -37, -249, -79, 19, -37, 64, -75, 55, -16, 67, -43, 71, 13, 101, 49, -33, 40, 25, -54, -99, -43, -18, 58, 23, 4, -20, 113, 123, -138, -51, -126, 70, -11, -73, -37, -49, -52, -9, -77, 78, -104, -47, 7, 47, 14, 15, -34, 275, -38, 23, 212, -26, -12, -61, 232, 15, 111, 70, 66, -96, 46, -149, -19, 117, 20, 68, + 106, -185, -133, 44, -13, 137, 80, -7, -80, -48, -98, -16, -17, -15, 22, 35, -87, 136, -36, -23, 42, -177, -46, 74, 21, 171, -6, -15, 28, 9, 66, 117, 146, -12, -22, -1, -94, -115, 54, 95, -77, -71, -52, 122, 67, -22, 12, -154, -51, 71, 55, 103, -157, 27, 46, -27, 81, -8, 350, 104, -87, 187, -93, 195, -68, -80, 91, 183, -10, -81, 43, 43, -12, -245, 55, 80, 16, 164, 207, 120, 204, 149, 123, -27, 137, 75, -110, 47, 62, -130, -177, -19, 66, 11, -65, -76, + -84, -33, 93, 197, 159, 69, 122, -189, 12, -42, 2, -219, 85, -13, -53, 0, -61, -103, -78, 89, 21, 70, -80, 164, 43, -171, 79, 31, 55, 106, 36, 184, -50, 24, -189, 46, 27, 17, 25, 26, -81, -64, -32, 75, -131, 44, -249, 54, 37, -19, 163, 19, -28, 24, 82, -139, 12, 54, 85, -201, -115, -71, 68, 40, -75, -203, 42, -202, -22, 92, -48, 72, -46, 151, 201, 120, -119, 29, 150, 108, -109, 92, 15, -155, 48, 235, 96, 85, 242, 32, -106, -183, -19, -98, -141, -51, + 128, -121, 35, -67, -85, 173, -33, 39, 116, 188, -91, -145, 185, 166, 83, 25, -128, 35, 119, -53, 17, -9, -481, -170, -78, 266, -103, -34, -158, -125, -26, -338, 189, 70, -13, -121, 187, -47, 93, -70, 58, 128, -153, 23, 165, 102, 65, 186, 158, -92, -129, -151, -4, -201, 49, -267, -54, 213, 107, -61, -22, -198, 95, -79, 184, -95, -187, -27, -77, -143, 61, -23, -97, -88, -332, 59, -98, -233, -63, 167, 81, -112, 109, 152, 135, 66, -166, -11, -33, 135, -115, -26, 65, 80, -181, -186, + -346, -56, -186, -412, -169, -72, -126, 144, 181, 176, -350, -256, 96, 424, 246, 2, 57, 122, -155, 102, -144, 103, 146, 25, 117, 39, -12, 64, 33, -112, -147, 199, 76, -144, 138, -78, -18, 340, -166, 193, 377, 155, -26, 14, -141, 177, -185, -100, -309, 56, 231, -8, -220, -79, -310, -158, -60, -439, -241, -46, 43, -194, 93, -55, -154, 158, 479, 39, 242, 160, 140, -158, 59, -258, 23, 62, 54, -86, -13, -214, -56, 637, 420, -234, 93, 197, -76, 108, -30, 183, 107, 51, 186, 88, 97, -67, + -423, 195, -64, -111, 349, 198, 127, 144, 125, 73, -57, 37, 23, -124, 98, 133, -235, 33, -149, 103, 144, -397, 2, -470, 16, 42, 47, 109, 318, -54, -153, -95, -78, -136, 97, 79, 38, -69, -48, 283, -92, -80, -157, 248, -33, 204, -98, 219, -224, -511, -136, 7, 108, 140, -150, -141, 76, 0, -50, -142, 261, -98, 171, -38, 299, -112, -206, -6, 27, -285, -230, -69, 73, -40, 369, 227, 4, 359, 123, 106, -312, 289, -60, -71, -265, -116, 222, 227, -72, 150, -318, -44, 201, 157, -124, -221, + -132, -137, -178, -143, 25, -233, -31, 318, -163, 35, -22, -76, 115, -54, 199, -3, 285, -80, -196, 102, -158, -151, -158, -425, 38, 167, 238, 172, 316, -42, -137, 180, -245, 43, 25, -47, 199, 178, -60, -265, 40, -135, -236, -211, 27, 144, 63, 67, -357, -227, 51, -222, -534, 402, 3, -38, 65, 22, -349, 241, -364, 23, 184, -60, 75, 50, -392, -147, -167, -48, 96, -144, -71, -27, -10, 27, 183, 80, 378, -142, 514, -45, 28, -337, -34, 233, -34, -513, 218, 224, -135, 114, -173, 338, 208, -20, + -5, -233, -128, -255, 245, 217, 115, 16, 119, -207, -502, -199, 198, 70, -369, 0, 63, 43, -166, 121, 283, 129, 21, 96, 192, -87, 241, -41, -26, -138, -565, 299, -69, 103, -161, -104, 251, -291, 281, -181, -318, 136, -167, 683, 111, -255, -330, -73, -411, -206, -444, -40, 309, -228, 193, 291, -276, -14, -323, 170, 71, -27, 200, -221, -290, -266, 22, 39, 253, -375, 259, 32, -524, -309, -422, -194, 165, -163, -139, -832, -14, -199, -72, -543, -180, -91, 42, 401, 387, 302, 188, 383, -441, 316, 46, 132, + 114, -343, 484, 265, 188, -231, -264, -222, 227, 14, 25, -31, 223, 398, 443, 173, 311, 242, 153, -87, 37, -126, 15, -48, -260, 329, 538, 205, -142, 232, 231, -17, 145, -260, -483, -332, -218, 132, -56, -263, 192, -96, -225, -12, 395, 189, 293, 92, 216, 228, -54, 208, -84, -260, 106, -299, 108, 104, -426, -287, 173, 430, -230, 297, 427, -366, 12, 380, 40, -154, -36, -211, -354, -7, -111, -195, 235, 2, -406, 500, -215, 394, -484, -337, 171, -252, 158, -247, -138, -56, 40, -396, 264, -189, -365, 536, + 322, -432, 313, 224, 104, 444, -951, 36, 431, 103, 65, 392, 45, 197, -539, -114, 182, -32, -257, 71, 255, 69, 135, 260, 278, 358, 342, -169, -103, 265, -166, 171, -327, -240, -426, -256, 273, 34, -79, 315, -415, -650, -936, 239, 357, 199, 228, -291, 178, -199, 388, 897, -125, -279, -395, -214, 391, -333, 240, 266, 94, -107, -234, -187, 166, -737, -425, -56, 104, -255, 83, 1470, 804, 541, -152, -131, -36, -107, -167, -208, -290, -449, 3, -16, 96, 220, 369, 603, -97, -746, -316, 671, -120, 262, -103, 5, + 417, 167, 312, 211, -32, -4, -25, 236, 262, -94, -449, 578, 384, 301, 86, 160, -248, -411, 566, 341, 131, -258, -322, -411, -281, -63, -286, 159, -565, 87, 380, -250, 120, 35, 36, -609, 197, -256, 430, -987, 147, -247, -356, 93, -216, 209, 156, -477, -67, 387, 20, 73, -892, -460, 67, -786, 181, 569, -273, 692, 814, 103, 408, 501, 226, -481, 315, 382, -17, 97, 272, 239, 576, 98, -219, 367, 134, -56, 11, 246, -332, -151, -139, 206, 109, -471, 143, 397, 14, 478, -447, -849, 72, 384, 582, 538, + 281, 257, 209, -574, -163, -21, 440, 690, -231, 152, -246, 167, 116, 422, 654, -243, -274, -49, 364, 463, 649, 25, -677, -637, -98, 85, 9, -279, -4, -622, -371, -295, -297, 254, 387, -843, 86, -174, 469, -252, -26, 136, 361, -471, -770, -139, -291, 20, -337, 207, 224, 21, -404, 266, 47, 710, -91, 391, -303, 735, 236, 462, 333, 504, 759, -170, 313, -502, 571, 536, 21, 183, 563, -324, -290, -38, 1102, 190, -257, 547, 112, 426, 627, 193, 8, 81, 141, 412, -82, 442, -228, 435, -163, 944, -69, 821, + -643, -734, 1152, -860, -415, 86, -218, -508, 535, -38, -580, -245, -188, -884, -311, 155, -748, -421, 88, -870, -584, -591, -698, 835, -70, 71, 184, -187, -1059, -710, -790, -1462, 55, 213, 596, 422, 170, 366, 169, 111, -533, -658, -461, 582, -128, -369, -225, 570, -704, -377, -724, -291, -121, -596, 170, -489, 501, 436, -158, 430, -458, -760, 274, 499, -487, -879, 610, -26, 418, 453, -1391, -894, -79, -178, 758, -453, -659, -117, 213, 83, -184, -257, 1013, -500, -1022, -1158, 714, -140, -1073, 591, 181, 342, 608, 860, -221, -143, + 107, -810, -352, 400, 602, 1290, 183, 679, 296, 332, -320, -85, -279, -692, -854, -1148, -454, -1036, -445, -542, -241, 560, 98, 379, 616, -2, 401, 124, -22, -21, -133, -886, 270, -120, -1043, -627, 237, -651, -299, 215, 662, 854, 243, -203, 57, 560, 247, 96, -85, -1761, -420, 350, 365, 139, -143, -623, 324, -565, -474, -153, 20, -346, -1013, 432, -209, 1077, 341, 299, 318, 729, 1544, -15, 49, 62, -614, 353, -62, 909, -74, 118, -1002, -417, 1297, -886, -170, -775, -2061, -360, 703, 476, 157, 94, -61, 1124, -1224, -61, + -316, -915, -672, -169, 294, 151, 337, 703, 547, -604, -501, 1458, 1291, -163, 194, -230, 453, -69, 935, 260, 518, 68, 114, -1638, 697, -134, -861, -527, 133, -311, -860, 802, -112, -710, -94, 27, 810, 794, 694, 184, 804, 750, -581, -743, -399, -180, 827, 995, 211, 305, 1036, 561, -912, 677, 155, -305, 412, 1450, -590, 593, 887, -570, -842, -1349, 263, -253, -438, -542, 294, -326, -163, 898, -285, -43, -705, 64, 440, -972, -624, -578, -294, 364, -1327, -727, -1913, 340, -25, -476, -218, -273, 402, 621, -682, 34, -241, -220, + -1196, 271, 912, 251, 689, 878, 775, -1034, -322, -306, -491, 888, -900, -508, 29, 1287, 287, -437, 1286, -712, -679, 1544, 1467, 153, 374, -404, -1391, -415, 1405, -666, 1270, -446, -1983, -500, -920, 1073, -115, 313, 722, -182, 745, -1095, 79, 372, 701, 61, -1274, 760, 863, -1040, 574, 6, -379, -436, -1513, -653, 536, 113, 1395, -1098, -625, 282, -145, 914, -1230, 25, 139, -1023, 1061, 601, 335, -463, 734, -818, 488, 396, 242, -27, -451, 232, 978, -464, -156, 226, -718, 802, 61, 243, -988, 596, 171, 235, -2361, 378, -641, 1173, + 973, 1040, 551, -1896, -292, 474, 95, 190, 1431, -142, -767, -928, 108, -1036, -890, -782, 477, -1493, 1199, 2155, -514, -67, -1477, -812, 714, -1510, 371, -632, -521, 531, -437, -496, 383, -669, -97, -770, 1139, 77, -923, -201, -32, -31, 225, -526, -454, 187, 189, 196, 66, 509, -574, -144, -1255, 504, 63, -310, 821, 533, -406, 1390, 247, -781, 585, 167, 365, 938, -129, -158, 91, 782, 364, 74, -119, 833, -112, -844, -198, 224, 672, -259, 1187, 1410, -896, 763, 1486, -354, 2278, 1360, -605, -474, -894, -935, -573, 350, -181, -94, + -70, -153, -1409, -698, -1336, 213, 917, -466, 2058, 519, -709, 63, -938, -144, 358, -417, -488, -586, -193, 201, -102, -200, 282, 133, 375, -379, -203, 245, -68, 31, -504, 344, -594, 283, 233, -149, 1, 8, -331, 46, 103, -301, 550, -293, 157, -11, 51, 248, -222, -412, -85, 585, -409, 279, -778, -499, 192, -190, 26, -68, -451, 507, 458, 23, -316, -33, -174, 92, -226, -24, -214, 181, -23, 35, 712, -573, 9, 72, 98, -138, 79, -260, 64, -240, 243, -957, -1464, 1027, 4608, 2047, 2102, 6, -4307, -3083, -1634, -3358, + 1619, 2033, 1026, 4383, 1941, -170, 1427, -2805, -3623, -2038, -2546, -526, 1931, 2018, 817, 3377, 1644, -215, 1592, -1465, -2568, -1441, -1938, -2991, 1087, -7, -1102, 3265, 1933, 1120, 3298, 822, -1707, 1654, -2422, -2716, -582, -2861, -2947, 1178, -506, 729, 3670, 2549, 2608, 2500, 279, -1368, -1627, -2665, -3549, -1832, -1030, -713, 1330, 2120, 1943, 2777, 2451, -376, -427, -341, -2290, -471, -829, -1691, 264, 172, -785 } + }, + { + {-96, -224, -90, -129, -69, 159, 86, 12, 133, 90, -106, -145, -88, -69, 18, 54, -145, -21, -57, -3, -17, -33, -77, 182, 107, -13, -149, -60, 33, 61, -4, -60, 27, 52, 18, 48, -41, -7, -114, -149, -31, -14, 74, 88, 64, 17, 22, 50, 77, 21, 102, 40, -64, -77, 0, 72, 69, 29, 16, 109, 74, -131, -112, -69, -62, -56, 75, -51, 35, -122, 85, -84, -61, 53, -25, -31, -7, 24, 143, 88, -137, -27, -53, -1, 196, 15, -89, 109, 18, 14, 31, 25, -2, 153, 81, -98, + -43, -8, -40, 45, 60, 46, -48, -62, 21, -127, -64, 101, 4, 82, 36, -60, 44, 4, -61, 141, -97, -40, 12, 51, -68, -13, -96, -175, 162, -30, -99, 14, 148, 5, 53, -72, -52, -27, 40, -56, 116, 25, 103, -156, 60, -36, 18, 76, -38, -10, -130, 11, 49, 25, -40, 9, 25, -3, -27, 418, 147, -36, 117, 3, 211, 127, -26, 104, 190, 241, -141, -144, 63, -60, -44, 171, 144, 131, 99, 15, -2, -64, 70, 43, 225, 19, -2, -102, 49, 61, -9, -34, -31, 57, -5, -40, + -78, 83, -25, -33, 126, 170, -41, -25, 104, 86, 163, 95, 48, 12, 140, 72, -183, -5, 62, -113, 8, 13, -128, 63, -59, 94, -15, -24, 61, 10, -84, -16, 58, -27, -11, -40, 15, 84, 30, -95, 6, 145, -11, -275, -128, -53, -59, -150, -137, -87, 149, -164, -77, -78, 30, 248, -37, -20, 61, 142, -218, -36, 44, -96, 76, 121, -135, -9, 17, -78, -198, 34, -84, 26, -77, 113, -137, -128, -315, -85, 107, -18, -122, -60, -17, -126, 5, -22, 85, 68, -35, 4, -35, -134, 160, 28, + 107, -41, -3, 28, 43, 126, -45, -30, 32, -3, 132, 74, -125, -45, -38, -183, -28, -14, 86, -62, 81, 9, 15, -602, -192, -51, -51, -48, 231, -212, 102, -47, 45, -58, -52, -170, 27, -59, 12, -248, 4, -22, -46, 0, 46, 43, -25, -12, -102, 36, -82, 58, -1, 51, 157, -36, -181, -71, -211, 35, 38, -13, 37, -67, 71, 43, -93, 15, -253, -47, -169, 100, 169, -140, -10, 56, 27, -234, 42, 133, -114, -46, -274, 103, -37, 124, 208, 127, -161, 45, 42, 19, -176, 55, -72, 125, + -33, 6, 66, 29, 62, 87, -362, 30, 79, -146, -5, 355, 296, 143, -29, -78, 194, 103, 70, 57, -135, 39, 26, 161, -152, -87, -19, 10, -21, -201, -116, -145, -145, 76, 119, 56, 60, -8, 59, -36, -7, 0, -44, -29, 97, 52, -115, -156, 1, -157, 101, -57, -228, 16, 139, 162, 138, -7, 131, -189, -39, -93, 6, -4, 97, -77, -139, 176, -155, -104, 143, 259, 91, 32, -242, 262, 67, 159, 331, -88, 101, 19, 2, 95, 90, 569, 395, -139, -212, 317, 201, 334, 482, -242, 164, 84, + 137, 66, 80, 203, 45, 207, 2, -129, 50, -40, 64, -23, 372, 65, 77, 53, 9, 133, 50, 9, -31, 95, -80, 181, -148, 218, -110, 132, 61, 81, 56, 319, 235, 15, -77, -173, 180, -211, 43, -93, 83, 199, 14, -335, -282, 27, -180, -184, -118, -212, 62, 364, 170, -136, -6, 41, -111, -107, -31, 173, 169, -193, 49, 181, 46, 66, 79, 240, 57, 352, -23, -13, -111, -106, 130, 265, -70, 64, 29, 287, 132, -146, -117, 11, 72, 261, 274, 393, 83, 104, -60, 156, 196, -80, -82, 137, + -100, -161, 155, 37, -167, -225, 343, 160, 0, 206, 52, -155, 326, -80, 21, -13, 93, -120, 93, -120, 91, -112, 108, -92, 142, -114, -101, 290, -357, 18, 54, -128, 35, -414, -193, 197, -156, 122, -35, 82, 42, 71, 46, -160, 92, -93, -22, -121, -129, -292, -253, 0, 109, 207, -240, 70, -216, 179, 136, -294, -62, 33, -347, -195, 211, -25, -15, 52, -22, -361, 332, 23, -235, -112, 44, -28, -226, -65, -129, 40, -11, -70, 73, -312, -139, 84, 413, -66, -241, -169, -134, 282, -297, -57, -19, -316, + -396, 100, -274, -42, 43, 212, 119, 19, 48, 252, -105, -76, 373, -245, 196, -83, -89, -36, -41, 397, 14, 154, -392, -287, 19, -51, 426, 35, 223, 70, 205, 177, -478, 38, -39, 325, 47, -362, 431, 127, -239, -552, -217, 528, 36, -76, -80, 47, 27, 157, 97, 169, -28, 309, -153, -381, 26, 9, -78, -21, 151, -103, -46, -40, 310, 224, 132, -30, -394, -15, -9, -24, -55, -14, -165, -339, -38, 220, 235, -91, 252, -85, 118, 253, 266, -563, 206, 190, 99, -145, -467, 283, 192, 83, -153, -109, + -175, 95, -193, -57, 32, 177, -86, 75, 87, -348, 4, -168, 342, 152, -313, 46, 293, 382, 369, 302, 362, -460, -319, -152, -165, -215, -185, -367, -140, 34, 211, 8, -229, -2, 211, 19, -200, -80, 497, 57, 178, 66, 196, 49, 54, -308, 160, 17, 57, -324, 98, -501, -16, -156, 109, -43, -386, -6, -385, 70, -323, 281, -176, 440, -4, -7, 203, 47, -88, -66, 71, -152, 85, 267, 119, -206, -124, 574, 26, 455, -447, -100, -62, 321, -383, 38, 164, -371, 218, -213, 91, 293, -147, -464, 65, 461, + 335, 377, -132, -93, 86, -63, 454, 156, 211, 390, -38, 146, -275, 387, 183, -99, -250, -223, 248, -453, 163, 256, -202, -256, -158, 236, 75, -98, -181, -4, -294, -426, 58, -410, -616, -86, 4, 593, -281, -219, 248, 431, 423, 222, -50, 86, -217, 15, -227, 478, 414, 263, -47, -533, -31, -461, 450, 344, 202, -393, 268, 136, 176, -103, -333, -257, -266, 43, -348, -616, 88, 285, 83, 238, -129, 215, 406, 796, 389, 262, 291, -533, -56, -210, 674, -684, -601, 155, 448, -36, 543, 445, 2, 157, -286, -249, + 518, -219, 363, 96, -195, -139, -73, -133, -204, 167, 229, 147, 41, -279, -304, 403, -394, 307, 55, -540, 285, 469, 15, -157, -37, 17, 54, 313, 8, -275, -80, 264, -495, 104, -61, 402, 473, 277, 376, 439, 358, 99, -272, -359, 191, 202, 12, 167, 295, 644, -341, 371, -222, -119, 403, -67, -94, -535, -109, 329, -403, 24, -258, -420, 617, 549, 438, 225, 106, 189, 450, 267, 462, -162, 385, -285, 469, 657, 393, 335, 153, 346, 324, -85, 656, 174, -412, 205, -417, -264, -94, -617, 0, -119, -182, -291, + -171, -71, -31, -45, 17, 44, -374, -221, 64, -173, 139, 643, -326, -5, -72, 44, -311, 182, -156, 504, 89, 311, 437, 101, -45, -273, -679, 114, 475, 384, -108, -400, 328, 41, 139, -415, -401, -287, -451, -199, 274, -935, -601, -284, 669, 490, -364, 421, 377, 325, 315, -311, 32, 185, -312, -940, -172, -257, -578, 57, -197, -143, 178, 111, -128, 34, 444, 480, -869, 214, 46, 410, 139, 31, -540, 175, -137, -141, -371, -267, 700, -306, -11, 95, -183, 784, 367, -330, -207, -589, -87, 594, 170, 192, -190, 371, + -84, -132, 322, -170, 534, -102, 396, -790, -285, 501, 105, -41, 109, -845, -424, 206, -355, 216, 34, 131, 207, -445, -1137, -137, -105, -165, 216, -507, 956, -207, 76, 975, -1160, -164, -200, -155, -1333, 35, -179, -306, 497, -512, 105, 47, 253, -87, -467, 297, -296, 666, -91, -851, -29, -74, -376, -860, 395, 366, -651, 506, -586, -529, -265, 2, 78, 38, 420, -128, -346, -941, 208, -1255, -609, -471, -933, -629, -250, -122, -424, 620, 729, 89, -189, 709, 375, -162, -151, 484, 433, -271, 734, -679, -273, 660, 470, 942, + -694, -606, 145, -394, 255, -54, -426, -224, 118, 908, 528, -90, 1245, -147, 517, -587, 731, 676, -51, -548, 69, 195, -293, 321, -432, -8, -123, -146, -491, -369, -215, -29, -148, -394, 605, 408, 126, -160, 118, 573, 286, 424, 283, -303, -460, 979, -106, -520, -198, -216, -103, 715, 55, -527, -180, -1331, -304, -140, 859, 592, -1603, -683, -364, 14, 117, -629, 516, 283, 453, 847, -1035, 1064, 769, -290, -653, 63, -90, 328, 1008, -265, -396, 841, 130, 305, -655, -1074, 1540, 746, 82, 81, -332, -919, 326, -92, 780, 149, + 295, 820, 476, -35, -81, 116, -507, -452, -541, -336, 514, -171, 39, 600, -103, 243, -874, -828, -531, 418, 191, -71, 215, -324, -787, 955, -945, 389, 456, 305, 163, 551, -385, -1028, 724, 1976, -354, 922, -1180, -709, 740, 355, -1091, -389, -84, 869, -227, -195, -1485, -1063, -327, -1207, 937, 847, 1545, -1437, 602, -64, -533, -259, -103, -1131, 142, 295, -279, -1385, -750, -50, -184, -479, 188, 418, 68, -505, -2, -485, 1275, -407, 51, 928, -31, -996, -656, -688, -273, -376, 1067, 87, 194, 499, -264, -312, -154, -317, -615, -170, + 1218, 366, 305, -816, 314, 43, -547, -85, -265, 1279, -1008, -905, -294, 143, -288, 21, 367, -695, -165, 1084, -873, 139, -209, -555, -928, -734, 45, -1323, -1575, 362, 330, 241, -1414, 1081, 1322, -450, -386, 23, -69, -213, -589, 480, 1312, 309, 344, -427, -1148, 323, 443, -1687, 925, 48, -486, 171, 616, -866, 539, -803, 218, -37, -410, -217, -111, -588, 429, 387, -17, 219, 28, 345, 435, 433, 624, 547, -327, 98, -673, 733, -551, 192, -101, 163, 42, -497, 474, -242, -488, 1059, -823, 270, -229, -393, 431, -87, 138, 671, + -771, 55, -946, -1868, -32, 628, -209, 2458, 513, -920, 285, -1295, 481, 984, 1134, -336, -198, -1385, -1545, -153, -972, 309, -121, -677, 9, -905, -1211, 253, -92, -699, 312, -452, -313, -564, 285, -614, 788, -79, 289, -177, 1059, -284, 579, -4, 692, -189, -357, 234, -404, -415, 52, 800, 504, -532, 570, -397, -626, 183, 841, -317, -353, 463, 196, -413, 39, 588, -250, -543, 293, 244, 344, 663, 125, -377, -141, 1443, 1487, -398, -1258, 971, -432, 289, 117, 1628, 201, -808, -326, -175, 21, 279, 362, 557, -652, 238, 104, 961, + -251, 683, 579, 340, 219, 375, 391, 72, 260, 1724, 682, -734, 155, -768, -464, -23, 260, -96, 591, -707, -53, 324, -55, 336, -74, 140, 41, -495, -196, 174, -524, -462, 12, 165, -382, 289, 213, -110, -279, 0, 23, -47, 177, 95, 132, -176, -125, 432, -33, 65, 153, -78, 172, -149, -403, -188, 341, -249, -260, 78, -340, -265, 419, -399, 685, 224, -371, 387, 0, -468, -7, -19, -155, 342, -75, -223, 542, -264, -232, 438, -3, 15, -97, 158, -128, 186, -283, -1008, -1249, 1056, 4195, 1664, 1916, 43, -3962, -2889, + -1535, -2298, 1021, 2009, 804, 3537, 1975, -116, 810, -1764, -3611, -1418, -2515, -383, 1712, 1474, 1302, 2213, 1336, 388, 584, -146, -2572, -1111, -939, -3516, 636, 480, -1588, 2565, 2502, -68, 3167, 1584, -1499, 1007, -1488, -3040, -263, -1830, -2701, 493, 266, -139, 2481, 2431, 1417, 2165, 1280, -813, -963, -1646, -2888, -2091, -1037, -922, 486, 1644, 1068, 1784, 2587, 1012, -350, -247, -1680, -1103, 89, -1298, -401, 227, -463 }, + {-79, -197, -57, 58, 10, 63, 56, 177, -33, -8, -20, -128, -103, 24, 20, -8, 61, -188, -112, -108, 64, -2, -28, -33, -33, 30, 43, -12, -25, 66, -106, 106, 72, -40, -88, -18, -130, -56, -182, 74, 67, -12, 38, -119, 106, -3, -19, 85, -120, 3, 100, 25, -29, 7, 13, -110, 83, -20, 103, 11, 25, 19, 31, -65, -77, -75, 53, -46, 6, 122, 155, 89, -25, 33, -11, 0, -52, 9, 14, 107, -145, -114, -22, 115, 164, -76, 95, -52, -140, -36, -80, 47, -21, -65, 59, 95, + 18, 114, -208, -221, -146, 22, -3, -36, 8, 69, -25, 93, 73, -96, 34, -6, 116, 111, 38, -115, 73, -68, 35, 78, -190, 204, 294, 40, 131, -108, -26, -102, -58, 94, -36, -105, -33, -66, 46, -64, -65, 7, 49, -53, -68, -25, 99, 98, -88, -27, -102, 25, 111, 36, -49, -58, 37, -1, -78, 457, 213, -18, 98, 85, -108, -56, 129, 56, 141, -103, 203, 73, -197, 155, 10, -6, -103, 113, -213, -187, -38, -68, -34, -68, 27, -43, -88, -67, 76, -84, 54, 30, 23, -93, 128, -268, + -45, -4, -45, -36, 24, 46, -83, 64, -101, 95, 33, 18, 103, -76, -16, 37, 161, 35, 68, -41, -136, -197, 37, 99, 139, -62, -213, 26, -85, -67, -46, 51, 9, 193, 1, 57, 42, -53, -43, -82, -153, 246, 59, -210, -235, 64, -70, -197, 225, -110, -34, -31, 177, 36, -98, 122, -92, 185, -253, -169, 207, -213, -211, -86, 178, 77, 88, -20, 161, 95, -12, -205, 61, -57, 79, 66, 61, 180, 53, -175, 22, 124, 186, 62, -92, -22, -139, 64, -251, -8, 287, 17, 38, -141, -169, 30, + 48, 208, -35, 20, 32, -28, 32, 71, 24, 147, -27, 98, 28, 28, 32, 163, 21, -25, 50, -18, -91, -17, -58, -558, -381, -72, 52, 102, 0, 10, -226, -2, -56, -25, -4, -44, -33, -149, 75, -325, -131, 43, -76, -90, -67, -179, -105, -66, -98, 57, -156, -67, 178, 135, 6, 104, 59, -45, -130, 90, 270, 48, 29, -91, -102, 99, -241, -107, 257, -220, 68, -37, -125, 76, 14, -46, 12, 62, -86, 24, -20, 185, 140, 46, 36, 96, -8, -4, -59, -304, 156, 129, -93, 27, -138, 0, + 2, -59, 31, -12, -66, -45, -484, 68, 122, -39, -37, -280, -105, 67, -237, -241, 53, -230, -109, -15, -129, 66, -101, 156, -84, -68, 56, 106, 218, 124, -237, -24, -15, 107, 179, 289, -132, -130, 157, -176, 39, 35, 255, 81, 142, -202, -84, -271, 203, 201, 244, -17, -55, -178, -37, 151, -80, -120, -102, -144, 23, 16, 33, -192, -9, -188, -17, -41, 62, 46, -63, -94, -232, -27, -30, 119, -98, 194, -135, 19, 49, 145, -148, -43, 55, 593, 536, -34, 30, 256, 52, 118, -67, 134, -100, 259, + 108, -15, 70, 4, 361, 218, -213, -205, 88, 21, -59, -65, 58, 150, 137, 60, 32, 72, -44, -21, 205, -226, 98, 239, 205, 330, -21, -69, -17, 5, -97, 360, 358, 230, -101, -51, 160, 103, -92, 7, 211, -91, -80, 109, -354, -60, 33, 37, -112, -256, 109, 147, -184, -89, -201, 63, 25, -59, -36, -192, 292, -104, 61, -263, -71, -91, 257, 398, -13, 251, 348, -185, -424, 15, 326, -254, 229, -71, -307, -145, 311, -306, -267, 191, -309, 99, 148, 118, -88, 184, 53, 31, 120, -202, 269, 128, + 116, -60, -31, 497, -177, 26, 129, 248, -345, -288, -266, 5, 17, -23, 157, 44, 282, 108, 164, -34, 19, -148, 251, -123, 247, -145, -222, 366, 298, -438, -385, -258, -202, 127, 14, -96, 191, 209, -269, 143, -34, -513, -171, -257, -202, 62, -79, 129, -57, -234, -312, 184, -176, -141, -107, -378, -32, 159, -93, -29, -128, 298, 54, 188, 156, -253, 260, 372, -109, -161, 48, -73, 171, -475, 187, 399, -47, -140, -108, 169, 370, -93, 99, -169, 256, -307, -108, 51, -40, -240, 436, 294, 233, -103, -315, -48, + -451, 71, -26, -23, -2, -78, 256, 202, -312, 169, -184, 254, -17, -63, -15, -289, -47, -265, -557, -36, 74, 34, -203, -21, -43, -393, 28, 297, -194, 28, 63, -15, -591, 41, 346, 188, -268, -220, 435, 100, 100, -85, 114, -4, -287, -74, -301, 145, -178, -26, -293, -326, -437, 279, 190, -138, -153, 127, -400, -33, 35, 102, 183, 92, 17, -135, 64, -123, 112, -117, 76, 45, -122, -159, -311, -201, 87, -532, -141, 307, 164, -55, 713, -91, 334, 337, -509, 47, -62, -420, -221, -223, 14, 69, 494, -58, + 51, 355, 248, -32, 325, -124, -126, -171, -289, -328, -175, 225, -350, -78, 61, 52, 389, -52, 114, -180, 100, 190, -121, 166, -242, -227, 362, 227, 228, 322, -16, -226, 311, -263, -398, 28, 346, -28, -325, 66, 411, -37, 104, 66, 582, 63, 115, 319, -49, -125, -296, 68, -50, -246, -2, -132, 99, 432, -6, -212, -81, -193, -128, -2, -103, 88, -308, 358, -178, 581, -144, -358, 16, 59, 187, 123, 99, -363, -334, 283, -348, -430, 130, 144, -118, 548, -401, -466, 187, -246, 25, 92, 24, -315, 174, 19, + 431, 454, 653, 299, 137, 91, 214, -222, 247, -393, 190, -38, -36, -755, -295, -123, 254, -32, 59, 83, 65, -385, 395, -14, 158, 14, 367, -399, 273, -196, -16, 304, -351, -152, -382, -147, -426, 382, 269, 512, -36, 124, -476, 109, -494, 472, 118, -71, 427, 458, 213, -263, -422, -571, -48, -197, -316, 324, -114, 744, -574, -183, 383, -416, -214, 125, -35, -18, -410, 189, -27, -87, 36, 437, -220, 135, 98, 677, -153, 92, -35, -229, 307, -117, 114, 31, 438, -144, 510, 2, 253, 218, -41, -173, -499, 227, + 515, 18, -6, 349, 301, -32, 52, 605, 381, -123, 129, 393, -107, -461, 5, -339, -58, -220, 12, -635, -193, -241, 2, 114, 121, 586, 656, 334, -472, -291, 364, 507, 99, -501, -92, -135, -514, -338, -393, 439, -188, 38, -488, 660, 491, -86, 191, 1095, -72, -252, -423, -72, 276, 224, -90, 268, 548, -320, -465, 612, -374, 455, -325, -554, 53, 636, 454, -516, -299, 87, 126, 198, -10, 416, 264, 556, -184, -123, 8, -138, -532, -439, -100, 560, 151, 21, 50, -569, -590, -504, 278, 259, -182, -164, 85, 44, + -300, 72, 649, 86, 419, 358, 306, 640, 984, 291, 51, 116, 411, -219, -70, 233, -49, 116, -50, 392, 184, 273, -40, -126, 250, 534, 2, -465, 330, -713, -752, -288, 433, -257, -630, -478, -83, 131, 122, -72, 256, -1136, 60, 581, -107, -131, 702, -370, -387, -488, -162, -160, -327, 106, 165, 280, 196, -147, -119, -44, -133, 60, 140, 585, -236, -724, 405, 19, -11, -597, 285, 138, -51, 720, -187, 97, -51, 331, 388, -386, -24, -205, -10, 236, -137, 349, -481, -387, -244, -414, -57, 75, 91, -589, -388, 335, + 527, -199, -257, 306, -544, -472, -474, 600, -903, 354, -22, -489, -144, 508, 1168, -71, -240, 358, 825, 349, 214, -123, -586, -1077, -6, 1118, -134, -139, -722, -114, 1, 25, 310, -20, 266, -41, 40, -608, 132, 446, -286, 566, -210, -96, -500, 296, -222, -237, -584, -922, 494, -480, -362, 92, 142, -246, 96, 429, -92, -528, -236, -660, -19, 108, 469, 21, -66, -167, -191, 78, 487, 4, -211, 421, -410, -20, -747, -310, -96, 919, -564, 125, -137, 48, -44, -200, 96, 306, 211, -824, 881, 113, 371, -76, -109, -419, + -13, -29, 290, -521, -281, 1070, -117, 77, -546, 493, -274, 359, -276, 642, 85, 53, -298, -274, 402, 835, -333, -530, 265, -217, 582, 695, 371, -119, 460, -304, -247, 581, 841, -928, 99, 123, 179, -323, 3, 357, -901, 265, 566, 190, -386, -128, 690, 530, 207, -326, -381, -815, 1170, 193, 616, -100, -215, 113, 371, -5, 12, -945, 175, 861, -124, 825, -471, -243, -317, 179, 826, -266, 8, 664, 851, -303, -491, -487, -435, -209, -55, 451, 298, 781, -252, 570, -315, -100, 491, -2, 677, -830, 505, 111, 209, -327, + 229, 642, 1197, -271, 282, -7, -844, 756, 44, 301, -182, -372, -176, -24, -351, -192, 1002, 79, 361, -293, 697, 8, 315, 155, -476, -89, -313, 11, 85, 873, 393, 38, 51, -30, -128, 143, 30, 546, 385, 223, -323, 377, 731, -755, 629, 110, 138, -760, -435, -955, -849, -151, 423, 420, -1369, -13, -683, 327, 955, 538, -869, 212, -249, 322, 449, -1128, -1680, -467, -172, -444, 114, 550, -581, 841, 335, -1273, -939, -218, 699, -2, 73, -157, -380, -1234, 65, -1042, -827, 385, 341, 271, -129, -421, 926, 520, -377, -819, + 614, 277, 151, -401, -919, 324, -429, 110, -785, 931, 27, -413, 96, 212, 791, 466, -204, -68, 274, 246, 299, -208, -1247, -1001, 185, -161, 709, -165, -330, -899, 991, 367, -737, -750, 999, 953, -59, 659, -147, 16, -308, -241, -453, 78, 613, 42, -404, -1097, 1720, 26, -1301, -116, -473, 206, 671, 577, -715, -1192, 218, -579, 197, -131, 536, -187, 92, 292, -463, -606, 80, 138, 532, -28, -803, 524, -439, 408, -379, -288, -26, -147, -864, 149, 267, -870, 382, -352, 192, -302, 846, 624, -809, -459, 591, 694, -829, 1106, + 97, 886, 682, 1048, -304, -472, 267, -905, 164, 92, 1588, -504, -1432, 2447, -1126, -916, 1440, 603, -723, 1238, 199, -928, 988, 218, 235, -96, -1521, 201, 471, -1161, 539, 294, -391, -125, -7, -292, -79, -175, -499, 5, -241, -66, -111, 241, 931, 758, -691, -87, 981, -178, -164, -995, 132, 315, -142, 831, 2032, -685, -828, 1425, -74, -782, 918, 580, -441, -704, -834, 252, 486, -392, 1377, 870, -1656, -1627, 972, -773, -954, 1267, 239, 1701, 858, -223, -192, -1251, -921, 2790, 820, -623, -1313, 15, -502, -1245, -129, 1385, 669, -31, + 1217, 920, -184, -1243, 126, 586, 81, -4, 1142, 1564, 1229, -298, 862, 135, -740, 491, 731, 300, 294, -967, -245, 161, 165, -105, -916, -272, 277, -169, -132, -697, 1101, 189, -981, 581, 1299, -642, -443, 245, 400, -381, -883, 773, 1175, -45, -521, 211, 302, 609, 737, 107, 1375, 26, -1626, 71, -225, 576, -213, -1228, -85, -493, -596, 843, 355, 513, 502, -1084, -662, -126, -77, 548, -48, -150, -36, -304, -865, 178, 1137, -514, 27, -352, -455, 946, -1090, 190, 276, -419, 193, -1301, -1911, -1656, 3348, 3232, 3189, 9079, 3199, -358, + 575, -6250, -7652, -2548, -4302, -5916, 738, -316, -1018, 6544, 3962, 1678, 10182, 4832, 864, 4666, -1133, -5544, -5348, -5056, -7046, -6857, -1642, -2470, -4078, 4730, 2140, -1697, 6795, 2216, -834, 7728, 6995, 1625, 7254, 7402, -318, 1847, 803, -7111, -8305, -6151, -11687, -11027, -6663, -8839, -6689, 769, 5434, 6217, 13285, 12127, 10653, 11541, 8478, 4347, 1292, -912, -6498, -7707, -8161, -8939, -8177, -6371, -3786, -2462, -2514, -498, -1562, -267, 462 } + }, + { + {73, 8, 82, -85, -148, -5, -101, -8, -27, -232, -189, -33, -76, 93, -41, 43, 51, 21, -37, -1, -88, 6, 95, 57, -46, 3, 50, -125, -40, 10, 50, -52, -120, -31, -119, 19, -51, -49, 56, -62, 47, 26, 31, -95, 29, 6, 51, -82, 48, 39, 76, -20, 98, 48, 99, 57, -80, -41, 193, 24, -26, 14, -1, 114, 4, -63, -30, 132, -56, -26, -132, -10, -41, 44, -6, -5, -40, -118, 427, 218, 191, 98, -40, -19, -38, -94, -117, -93, -120, -59, 123, 34, -2, -7, 82, 29, + -45, -60, -36, -228, 95, 15, 6, -53, 32, -4, -57, 23, 84, -9, -97, -34, -40, -56, 15, 88, -22, 13, -112, 64, -140, 80, 22, -5, 3, 79, -107, -93, -147, 27, 29, -5, 87, -105, 22, -27, 5, -82, 61, 11, -47, 74, -143, 48, -75, 127, 72, 4, 21, -51, -149, 87, -18, 396, 199, 256, 79, 82, -8, 96, 18, 85, -60, 172, -38, -211, -49, -3, 19, -72, 164, 2, 69, 144, 82, -5, 7, 29, -130, -98, 63, 59, -42, 7, 75, -144, 201, -27, 36, -38, 80, 93, + 13, -112, -99, 202, 13, -68, 0, 113, 98, -70, -75, -192, -49, -83, 17, -76, 26, -187, -64, 13, -64, 31, 82, -45, 5, 25, -35, 61, 6, 78, 13, -42, -89, -2, -95, 91, -278, -82, -68, 53, 48, -180, -89, -31, 39, 105, 25, 141, -118, -156, 41, 11, -35, -105, 353, -13, 89, 28, 5, -2, -62, -130, -114, -27, 85, -70, 181, -57, -25, -148, -191, -9, -124, -58, 243, -130, -46, -126, 41, 13, -56, -132, -35, 9, -167, 26, -94, 135, 74, -65, -49, -32, 29, 2, 90, -43, + -78, -58, 216, 217, -85, -187, 12, 74, -23, 69, -95, 34, -121, 73, -32, 153, 67, 96, -887, -151, -251, -299, 85, -105, -248, -217, 42, -214, 37, 303, -70, 127, 108, 255, 75, -188, 49, 278, -125, 135, -201, -197, 71, 75, 232, 7, -128, 123, -83, 93, -2, 134, -110, -84, -123, -5, 34, -59, 113, -242, 41, 229, 63, -75, 103, -129, -49, -305, -75, -18, 60, -4, 174, -248, 38, -43, 136, 53, -29, 157, -130, -33, -99, -244, -74, -70, -38, 148, -116, -255, 41, 45, -444, 253, 287, -16, + 161, 72, 338, 448, 58, 58, 129, 55, 75, -65, 89, -75, 118, 136, -385, 198, -42, -72, -120, -157, 62, 108, 175, 33, 29, -226, 9, -67, -76, -34, 29, 12, -19, 220, -13, -74, 71, -87, 111, 148, 164, 86, 16, -94, 183, 59, 22, 19, 21, 13, -112, -152, 134, -141, 127, 121, 83, -19, -106, 92, 111, 263, 112, 101, 51, -244, -91, 35, -56, 92, -189, 15, 26, 822, 252, 58, 164, 409, 169, 494, 124, -113, -33, -45, -45, 131, 215, -103, 48, 145, -53, -211, 166, -24, 80, -75, + -102, 165, 41, -20, -47, -193, -92, 97, 27, -69, -32, 24, 72, 185, 60, -180, -40, 6, -55, 58, 90, -181, -212, -18, 53, -28, 164, -309, -65, -143, -171, -24, -14, 39, 161, -8, 23, 46, -27, 210, 137, -185, -158, 111, 260, -30, -123, 240, 124, 51, -107, -111, 122, -20, 393, 208, 353, -112, -9, -82, 356, -367, -66, 108, -85, -64, 110, -32, -129, 333, 169, 48, 531, -138, -50, -105, -10, 100, -155, -8, -87, 218, -190, 57, -3, -45, 4, 132, 68, -155, -304, 17, 43, 249, 264, 289, + 8, -151, 183, -477, -98, -181, -302, 208, -84, -82, 135, -46, -104, 435, -16, -115, 126, 22, 89, 94, 31, 269, -180, -83, -11, -207, -30, 56, -84, 94, 88, 260, -117, 99, 104, -631, -948, -160, 48, -16, 27, -44, -189, -106, -151, -40, 156, 186, -165, -245, 213, 46, -133, 13, -20, -148, -123, 353, 181, -185, 99, 43, 153, -178, 207, -198, 144, 96, -39, -89, 95, -373, -183, 238, 379, 214, -256, 13, -180, 256, 57, 73, 24, -196, 106, 314, 41, 240, 170, 116, 183, 385, -96, -362, 190, 15, + -80, 34, 332, -116, -216, 128, -51, -19, -72, -29, -77, -131, -53, 212, -216, 45, -369, -234, 58, 62, 483, -423, -295, -162, -85, -50, 153, 154, -229, 234, -58, 107, -167, 347, -72, -129, 219, 162, 125, -234, -225, 293, -158, 86, 67, -106, 244, 75, -5, 54, 178, 233, 68, -210, 44, -300, 173, 74, -336, 232, 51, -177, 301, 91, -86, 171, -31, 329, -80, -93, -73, -54, 436, 81, 7, 105, -367, -246, -247, 9, 239, 9, 298, -394, -137, -257, -188, 457, -19, 122, 172, -203, -16, -142, -496, 158, + -215, 124, -152, 402, 64, -275, 41, -280, 228, 445, -378, 253, 89, -6, 179, 474, -181, 5, 142, -507, 29, 239, -144, 173, 181, -87, 459, -223, -416, -172, 50, 18, -85, -172, 126, 124, 1, -285, -68, -66, 197, -120, 772, -88, 112, -27, -30, -365, 41, 287, 228, 763, -77, -62, -152, -18, -207, -4, 307, -148, -25, 68, 78, 311, 248, 83, 583, -89, -508, -489, -347, -58, 153, -18, -146, 882, -638, -475, -160, -299, -354, 429, 164, 88, -143, -83, 507, -149, -227, -617, -100, -15, 279, 107, -138, 36, + 242, 113, 146, 392, 481, 134, -201, 123, -315, 199, 150, -113, -9, -238, 74, -2, -469, 427, -61, -214, 246, -426, -120, 443, 234, -19, -10, -588, 173, 305, 154, 90, -62, -442, -1278, -119, 219, 329, -68, -387, 576, -309, 240, 441, 341, 46, 418, 27, 116, 72, 227, 13, 29, 467, -260, -85, 171, 417, 437, -131, -193, -62, -105, 459, 333, -858, -71, 47, -372, 134, -552, 414, 126, -89, 259, 97, -100, -214, -120, 594, 45, -26, 157, -104, 267, 704, 315, -126, -108, -127, 440, 129, 445, 274, 232, 103, + -166, -223, 209, -449, 92, -247, -172, -3, 315, 24, 41, 90, -77, 482, 662, 723, 12, 323, -423, 156, 267, -212, 388, -309, -590, 74, -306, -49, 34, -314, 78, 424, -252, -230, 193, 347, 7, -508, 936, 73, 234, 740, -282, 88, -152, 205, -223, 223, -525, -593, -32, -345, -41, -20, -55, -89, 24, -154, 137, -468, -208, -636, -48, 164, 297, 717, 374, 136, 74, 217, 140, 134, 267, 313, -111, -578, -606, -388, -259, 76, 180, -200, -364, -584, -2, -212, 530, -227, 118, -399, -224, -53, -195, -787, -866, 253, + 61, 45, 404, 271, 318, 306, -556, -86, 947, -149, -398, 186, -252, 120, -552, 288, -246, 130, -97, 133, 574, 419, 66, 445, -75, -197, 260, -359, -671, -1028, 95, 10, 402, 275, -370, -206, -984, -79, -454, 95, -224, -125, -183, -88, -69, -359, -147, -417, 329, -96, 283, 695, -367, 188, -50, -194, 192, -400, -639, 292, 161, 289, 202, -1377, -606, 159, -442, -61, -376, 544, 694, -60, 767, 79, 355, -129, -12, -453, 281, 513, 133, 874, 38, 87, -249, -443, 558, 798, 313, 123, 136, 239, 112, -27, -535, -543, + -250, -1004, -1226, -929, -407, 271, 4, -228, -440, -9, 830, 390, -702, -127, -135, -514, -77, 28, 357, 244, -520, 375, -288, 154, -267, 76, -394, -161, 217, -746, -126, -286, 257, -191, -667, 796, 790, 3, -297, 431, -1030, -334, 327, -358, -206, -33, -321, 62, -70, -706, 318, -94, -198, -244, -168, -48, -174, -300, 600, -279, -255, 274, 12, 954, -171, -592, 356, -307, -231, -435, 327, 540, -954, -4, 829, -22, -16, -788, 1570, 1112, -16, -302, 255, -942, 23, 1166, -198, -408, 28, 1322, -180, 290, -271, -598, -473, -122, + -210, 245, 351, 20, -485, -696, -628, -101, -126, -343, 340, 266, -263, -338, -355, 214, 93, 263, 683, 1, -543, 390, 175, 136, 66, -4, -245, 496, 279, -188, -203, -148, -610, 186, 507, 152, -412, 535, 426, 226, 102, -267, 191, -906, 193, -49, 872, -286, -346, 176, -145, -4, -509, -101, -29, 724, -104, -610, -141, -756, 1485, 61, 245, -246, -489, -653, -218, 189, 435, 365, -316, 3, -657, -235, 234, -547, -297, -203, 802, 427, 441, 426, -467, 95, 167, 201, -47, 554, -121, 252, 417, 176, 113, 371, 484, -270, + -578, 403, -68, 23, -613, -541, 121, -257, -229, 523, -522, 686, 409, -256, 329, -346, -408, -428, 654, -428, 185, 258, -807, 131, 50, -545, -1101, -867, 631, -618, -82, -527, -223, -304, -129, 428, 16, -225, 248, 676, 586, 616, -276, 4, -629, -32, 137, 108, -549, -619, -921, 644, 99, 212, -123, 337, -225, -267, 233, 493, 156, 323, 1063, -154, -577, -1317, -144, -510, -205, -313, -563, -428, -861, -102, 36, 325, 997, -778, -248, -119, 367, 348, 996, 143, -1006, -228, 284, 856, 288, -1269, -447, 1199, 182, 1201, -610, 72, + 174, 746, 20, 685, 1060, 185, 917, 629, 239, 1198, 1078, 377, 1622, 1225, 829, -1143, 24, 508, 374, 28, -759, -572, 78, -462, 6, 276, -897, 958, -442, 648, 240, -700, 63, 532, -346, -730, 478, -151, 403, -201, 71, 250, -530, 11, -256, 60, -837, -556, 740, 109, 279, -538, 601, 643, -459, 439, -649, -53, -375, 532, 1078, 65, 1316, -253, -86, 153, 118, -1, -772, 1406, 843, -7, 709, 660, 740, -185, -21, -1235, 604, 733, -169, -123, 845, 548, 457, 1147, 200, -426, -610, 303, -159, -663, 684, -781, 100, 280, + -538, -884, -474, -10, 35, 712, 403, -191, -1060, 574, 1059, -85, 1211, 280, -932, -681, -15, -414, -542, 572, 812, -141, 584, 632, -492, 425, 904, -122, -1076, 375, 29, -298, 375, 786, -213, -506, 272, -450, -432, -109, 815, 569, -1011, 265, 520, -798, -399, 791, -176, -1343, -100, 981, -285, -1906, 1975, -627, -159, -1028, 1300, 318, -365, 814, -466, -484, -167, 2211, 833, -1056, -786, 787, -137, 1188, 94, 863, -1256, 948, 1891, 43, -105, -414, -208, -830, 1734, 779, -734, 21, 817, 1896, 357, -722, -182, -171, 324, 292, -598, -834, + 216, -705, 133, -436, -517, -104, 78, 248, -576, -223, -233, -701, 585, -217, 30, -100, -479, 192, 125, 21, -109, 9, -25, -275, -607, 260, -305, 263, 176, -598, -492, -54, -77, -68, -135, 488, -344, 48, -643, 541, -629, -335, 306, 3, -505, 391, -676, 42, 198, -28, 70, 309, 150, -709, 350, 31, -417, 569, 239, -667, -64, -537, -39, 140, 205, -659, 659, -446, -1129, -1418, -515, 4272, 3427, 2267, 4145, -1648, -3914, -1259, -6326, -2468, 184, -1484, 2906, 3961, 653, 2518, 4334, 94, 1200, -282, -5085, -4213, -3177, -3161, -1551, 2415, + 1305, 1870, 5318, 2253, 335, 3181, 1486, -1820, 630, -1526, -5153, -1241, -2690, -5312, -875, 127, -1289, 3595, 4151, 1636, 4883, 4940, 931, 1908, 866, -3120, -3497, -3273, -5884, -5197, -1975, -2411, 518, 3156, 4327, 3575, 5534, 4105, 2203, 304, -686, -3122, -3785, -2730, -3039, -2403, 75, 280, 602, 2351, 911, -365 }, + {51, 55, 64, -73, -119, 20, 82, -54, 56, -192, -106, -109, 9, 29, -79, -99, 42, 106, 5, -52, -142, -81, 112, -23, 5, 51, -57, 34, -42, -80, -55, 108, -140, -73, -61, 143, 99, 85, 10, 47, -6, 92, 33, 33, 0, -5, 158, 122, 0, -105, 33, 18, 49, -152, -5, 99, 8, -18, 11, 34, -37, -25, -45, -56, -79, 48, 57, -115, -24, -12, 32, 38, -67, 36, 38, -27, -21, -152, 478, 186, 115, 40, -104, 3, 90, 175, 0, 19, 8, -62, 14, 61, -14, 59, 86, 120, + 47, 50, 60, 57, -111, 112, 204, -97, 56, 34, 55, 12, 120, -78, -31, -71, 68, 206, -38, 101, -6, -45, -172, 64, -91, 79, 36, 88, -13, -52, 25, -35, 115, 16, -96, 120, -29, 93, 69, -3, 66, 135, -40, -47, -40, 67, -57, -73, 82, 0, 54, -90, 126, 8, -31, -15, -19, 370, 296, 144, 25, -59, 173, -103, -103, -28, -183, 109, 11, -81, 47, 105, 189, -90, 111, 238, -66, -2, 59, 122, -28, 133, 100, 135, 35, 102, -104, 181, -19, 174, 92, -23, 26, -33, -1, -68, + -27, -84, -55, 58, -13, -176, -35, 14, -2, -100, -96, -55, -40, 131, -51, -153, -195, -222, -72, -100, -5, 29, 108, -147, -62, 12, -12, -68, 18, -152, -12, -175, 95, -94, -47, 195, -426, -118, -214, -44, 3, 233, -111, -388, -132, -13, 150, 43, -139, -337, -82, 88, -34, 185, 11, 79, -15, -151, -157, 94, 123, 11, 43, -9, 77, 14, -194, 8, 284, 35, -65, -29, -69, 14, -59, -125, 192, -61, -72, 166, -83, -154, 13, -2, 11, -221, 183, -71, 2, 159, 155, -237, -52, 41, 63, -25, + 135, 30, 71, 83, 21, 65, 115, 17, 11, 92, -239, -69, 15, 92, 58, -34, 6, 55, -845, -346, -163, -251, 85, -93, -73, -19, 116, -107, -109, -179, 42, 143, 42, -126, -137, 33, 135, 107, -157, -253, 26, -237, 128, -13, 91, -18, 88, -101, -30, 224, -279, 119, 74, 19, -95, 50, 148, 24, -168, 21, -104, 71, -232, -24, -210, 150, -12, -59, -55, 75, -357, 150, -99, -237, 94, 158, 205, 98, 48, -35, 29, -40, 135, -96, 43, 77, 254, 13, 13, -197, 117, -116, -493, 245, 372, 81, + 23, 219, 64, 72, 108, 24, 114, 130, -104, -9, 10, -110, -80, 7, 52, -61, 388, 219, -63, 38, 120, 167, 174, -65, 121, 158, 3, 53, 38, 95, 56, 48, 79, 91, -175, -121, -267, 40, -97, -119, 131, -26, 81, -313, 355, -13, -174, -18, 281, 220, -48, 22, 135, -50, 57, -89, -225, 43, 19, -162, -73, -159, 30, 85, 38, -64, -155, -207, -258, -160, -79, 40, -71, 894, 237, 66, -33, 539, 63, 255, 52, 169, 280, 97, -157, 164, 192, 28, -16, 39, 352, 22, -123, -218, -65, -10, + -248, 37, 70, 137, 57, 95, 268, -90, -46, 161, -29, -79, -17, -249, 153, 96, 2, 149, -82, -220, -462, -176, 165, 178, 1, 122, -134, -151, 369, -227, 164, -202, 35, -290, -296, 301, -126, -129, 431, 16, -54, -224, 156, 232, 9, -157, -251, -62, 181, -82, 51, -157, 86, -61, 442, 166, 364, -217, 62, 226, -301, -84, -126, 44, -159, -74, 210, -53, -55, -1, 266, -87, -143, 314, 35, -197, 76, -31, 34, 128, -185, -24, -142, -216, 15, 21, 30, -212, -251, 107, -34, 105, -23, 146, 24, 10, + -165, -130, 26, 162, 56, -26, 414, 118, 59, 212, 57, 162, 133, 114, 44, 91, -78, -16, 16, -164, 32, -275, 63, -175, 134, -89, 62, -14, -156, 69, -56, 147, -166, 301, 217, -555, -1096, -36, -227, 199, -65, -290, -38, -233, -277, -219, 347, 196, -245, -124, 263, 169, 234, -153, 149, -134, -156, -32, -72, -446, 119, 278, 106, -258, -69, 65, 64, -227, -61, -333, 71, -148, -22, -103, 61, 395, -47, -49, 181, 295, -172, 97, 97, -207, 117, 140, -278, 69, 168, -14, -294, -151, -193, 290, 90, 287, + -162, -258, 57, 186, -78, -168, 121, 250, 170, -178, -141, 4, 267, -9, 112, 104, -573, 16, -2, 337, 60, -112, 172, -75, 65, -286, -107, -176, -125, -366, -164, -213, 505, 317, 300, -360, -341, -139, 158, -3, -26, 25, 86, -12, 130, -204, -209, 10, -76, -255, -294, -203, -181, -104, -132, -328, 131, 429, -116, 208, 242, -184, 205, 159, 27, 392, -47, 330, 89, 53, -330, 131, 117, -67, 406, 361, 35, -118, -253, 139, -251, 100, -41, 271, -42, -357, -8, -122, -87, -185, 225, 86, 66, 236, -515, 239, + 155, 227, -247, -406, 109, 137, 9, -341, 325, 108, -192, -298, 128, -125, 527, 639, 81, -89, -246, 368, -418, -134, 489, 136, -110, -259, -262, -130, -4, -319, 62, 364, -57, 144, -271, -225, -93, -184, 500, -177, 218, 201, 195, 66, 89, -344, -369, -330, -89, 269, 579, -226, -440, -87, -210, 121, 78, 341, -215, 8, -281, -38, 459, -47, -274, 351, 93, 67, 149, -349, 29, -95, 17, 164, 282, 819, -357, -277, -87, 174, -481, 193, -131, 243, -217, -97, 295, 221, 82, -149, -56, 407, 397, -83, 346, -101, + 511, -240, -129, 92, 535, 393, 127, -288, -24, -597, -94, 93, 271, 320, 563, 149, -15, -28, -223, -373, -32, -323, 229, 73, 356, 201, -129, 358, -432, 193, -101, 31, -81, 457, 261, 131, 74, -826, -139, 492, 240, 32, -23, 28, 388, 171, -633, -197, -254, 54, 2, -577, -6, -466, -345, -21, -104, 284, 589, -159, -223, 19, 235, 114, -342, -37, -275, -31, -379, -59, -324, -1, 357, 10, 776, -339, -144, -291, 323, 492, -399, -156, -624, 100, 4, 153, 166, -375, -201, 256, -94, -100, -335, 672, -83, -768, + 219, -221, -212, 242, 217, -241, -228, -100, -421, -287, 152, 66, 159, -163, -302, -394, -352, 263, -521, -29, 138, -204, 25, -46, -60, -469, -65, -221, 283, 286, -43, 455, -5, -88, -118, -128, 702, -381, 949, -251, -74, 74, 409, 279, -604, -259, -574, 117, 40, -190, -632, 16, -292, 121, 146, 311, 22, 223, 1111, 228, 281, -186, -57, 470, -38, 25, 132, 18, -67, -266, 449, -487, 200, -718, -211, -345, -432, -389, 1, -784, -260, 88, 440, 235, -753, 409, 285, 293, -479, 333, -225, -570, -188, -568, 266, 631, + 163, -85, -428, 322, -457, 659, -129, -99, -412, -471, 59, 489, 168, -350, -146, -5, -146, -347, 457, 154, 513, 98, -333, 152, -98, 156, 563, -795, -364, -639, 361, -128, 60, -210, 458, -453, -461, -208, -111, -326, -571, -273, 102, 373, -527, 345, -202, 43, 670, 518, -15, 274, 124, -106, -89, -916, 119, -91, 82, 181, -81, 27, 917, -829, 68, 1006, 120, 280, -406, -104, 512, 927, 32, 823, -335, 746, -277, 554, 535, -128, 1060, -169, -69, -309, -516, -502, -267, -285, -768, -301, -197, 295, 204, 116, -336, -421, + -337, -1202, -832, -609, -45, 799, -516, -77, -394, -600, -473, -612, -613, -258, -726, -816, -686, 190, -468, -261, -588, 569, 961, 75, -91, -339, 95, -66, -7, -82, 316, 56, 662, -567, 69, -483, 998, 235, -554, 446, -391, 361, -531, 318, 69, -335, 318, -527, -152, 161, 558, 229, 973, -218, -589, 52, -151, 66, -380, -358, -626, 75, -666, -149, -78, -619, 440, 495, -251, -39, -807, 950, 1101, 203, -334, 22, 990, -936, 1733, 690, -170, -506, -173, -539, 581, 1552, 8, -989, -489, 575, 179, -177, 702, -116, 66, 441, + -70, -396, -163, 368, -467, -376, -189, 167, -4, -52, -211, 347, 8, 502, 352, -471, 217, 613, 304, -434, 150, 121, 371, 33, 112, 130, 138, 853, 760, 510, 1040, -503, 525, -611, 379, 16, 345, 485, 126, 142, 538, 283, -170, 378, -16, 500, -525, -271, 30, 1156, -786, 98, -956, -71, 72, 304, -338, -35, -280, 445, 1467, 127, 103, -317, -209, 252, 224, 144, 569, 247, -239, 312, 608, -13, 668, -52, 327, -663, 1232, -168, -137, 222, -920, -222, -438, 673, 370, 390, -421, 179, 170, -554, 175, 518, 436, 170, + -126, 86, -259, 961, 161, 452, 365, 535, -806, -32, -225, 192, -281, -324, 715, -614, 534, -372, 562, -72, -523, -2, -800, 571, 513, 638, -1691, 564, 347, -461, -322, -417, 908, -1160, 759, 1754, -33, -636, -251, 556, 613, 250, -321, 178, -766, 50, -432, 685, 133, 132, -353, 261, -42, -383, 222, -392, -107, -344, -598, -468, 575, 334, 397, 272, -740, -317, 240, -322, 558, 257, 107, 207, 892, -327, -757, 1505, -616, -975, 1063, -563, -202, 132, 584, -681, -107, -30, -309, 1976, 63, -432, -49, -77, 598, -1113, -688, -533, + -321, -139, -787, -109, 11, 209, 1400, 1206, -419, 902, -907, -1026, 647, 686, -160, 75, 248, 429, 807, -191, 139, 323, -295, -1244, -246, 73, -594, 643, 10, 393, -405, -625, 583, -619, 194, -142, 548, 3, 123, -328, 107, -231, -802, -634, 273, -47, -18, 135, 604, -265, -180, -500, 221, 190, -59, -95, -1346, 67, 384, -477, 341, -742, -136, 57, 474, 600, 78, -274, 194, 1074, 936, 933, -34, -75, 207, 121, -416, 285, 1182, -825, -259, -232, 17, 54, 169, -612, -925, -348, -34, 1914, 996, 648, -61, -172, -454, 757, + 154, 386, -215, -188, -142, -259, -813, -381, -1285, 714, 655, -52, 1067, 456, -702, -725, 323, -308, -624, 24, 79, 269, -144, 356, -77, 336, 467, -435, -1671, 888, -239, -547, 401, 580, 38, -1151, -132, -65, -1148, -746, 631, -197, -456, -421, 282, -1155, -787, 1513, -111, -910, 368, 811, 377, -1280, 1820, 706, -1088, 594, 837, 107, -730, 757, 896, 505, -668, 628, 1245, 40, 1259, 1497, -789, -517, -540, 1412, 952, -660, 385, -418, -829, 681, 1679, 206, -146, -576, 890, -459, 1085, 1675, 713, -731, -233, -617, 390, -313, 495, 284, + -753, 373, -767, -292, 36, -317, 75, 392, 356, -1, -603, 120, 543, -216, 109, -253, -708, 728, -413, 497, -728, -473, -71, -651, -148, 615, -583, 818, 95, 663, 313, -365, -877, 731, 512, 290, 239, 753, -529, -318, -285, 218, 343, -102, -674, -60, -45, -761, -233, 87, 257, 549, -8, -547, 752, -166, -51, 787, 463, -702, 298, -449, 325, -252, 353, -569, 458, -212, -1232, -1510, -767, 4376, 3898, 2316, 5166, -1122, -3833, -1384, -7248, -3840, -47, -1908, 2628, 4738, 697, 2774, 5491, 891, 1937, 157, -5585, -4718, -4113, -4588, -2733, 2238, + 990, 2239, 5930, 3527, 951, 4352, 2033, -2710, 1492, -1988, -5111, -665, -3147, -5870, -2600, -633, -3026, 3385, 3706, 1708, 5888, 6587, 2550, 3243, 3127, -3476, -2210, -4435, -6837, -6350, -4012, -4100, -1125, 2604, 3464, 4538, 6501, 5758, 3430, 2411, 482, -2683, -3747, -2702, -3152, -3935, -909, -1147, -750, 1909, 802, -1008 } + }, + { + {-38, 104, -115, -24, 6, 8, 46, 192, 15, -46, -69, 173, -17, -87, 33, -61, 45, 35, 230, 59, -124, 53, -6, 21, -110, 71, 10, -82, -48, -9, 10, -10, 73, -20, -68, -17, -47, -9, -83, 31, 90, -13, -121, 75, -74, -45, 5, 35, -62, -18, 115, -59, 34, -75, 56, -25, 40, 51, 33, -29, -15, 59, -90, -169, 39, -20, -50, 17, -5, -8, 18, -55, 68, -81, 59, 30, -16, 197, -20, 60, -36, 263, -103, -26, -9, 33, -46, 120, -21, -81, -14, 165, 12, -83, 77, 57, + 109, 45, -82, -55, 185, 26, -47, -36, -37, 36, 40, -24, -234, -59, 12, 162, 58, -20, 0, -93, 130, -132, -174, 23, 3, -59, -39, -49, 26, 16, 17, -61, 154, 5, 206, -33, -96, 45, -9, 29, 49, 104, 72, -26, -54, -48, 135, -135, 7, 3, -21, -112, 91, -58, 20, 72, -44, -49, -27, 34, -77, 67, 42, -93, -50, -9, 9, -6, -13, -48, 84, 14, -35, -50, -2, 170, -24, -82, 110, -45, -103, -12, 88, 64, -57, 13, -71, 39, 40, -36, 88, -26, -159, 27, 82, 74, + 10, -14, -115, -42, -16, -53, 103, 142, 67, -202, 66, 231, 96, -15, -3, 104, -54, 31, -100, -93, 89, 98, 48, 23, 17, 16, 47, 4, -11, -41, 23, -75, -13, -32, -128, -76, 18, 28, 39, 75, 134, -8, 55, -86, -132, -80, 70, -58, -62, -63, -87, 85, 11, 63, -28, 20, -178, -112, -82, 116, 21, 28, 62, -60, -32, -11, 21, -132, -26, -88, -99, 9, -87, 62, 56, 238, -57, 122, -78, 52, -53, 15, 207, 36, 91, -94, 65, -84, -39, -10, 133, -61, -31, -113, -58, -133, + -15, 133, 35, 13, 27, 122, -112, -202, 54, 68, -127, -7, 26, -31, 62, 152, 34, -33, 14, -50, 25, 8, 81, -215, 40, -78, -149, -117, 68, -36, -2, 148, 56, -26, 19, 125, -56, 91, -38, 24, -132, -29, 99, -37, 121, 125, 48, 77, 176, -45, -234, 49, -101, 2, -288, 3, 100, -64, 115, 10, -101, 33, -216, -147, -49, -60, -178, 87, 107, 0, 100, 2, 31, -65, 91, 60, -29, 197, -33, 161, 148, -14, -18, -6, 51, 62, 27, 70, 30, 20, 227, 77, -88, -47, 9, -52, + 41, -21, 165, 34, -394, -4, 4, 98, 181, 57, -83, -151, -18, 185, -31, -41, -135, -8, -53, 136, 173, -292, 193, 115, -103, -28, -145, -4, -39, -1, 105, 186, -65, 39, -43, -70, 78, 127, 96, -88, -129, 90, 73, -54, -17, 11, -168, 58, 61, -75, -109, 40, -81, 150, 77, -280, 134, -123, -292, -94, -13, 54, -113, -12, 77, -140, -120, -145, -30, 26, 299, 36, 67, -71, -132, 172, -36, -210, 14, -229, 13, -12, -34, 246, 69, 52, 111, 154, -32, 381, -53, 272, -321, 109, 191, -71, + 29, -93, -6, 145, 272, -78, -131, -41, 129, 25, 277, 127, -26, 37, 2, -130, 29, -31, -36, 117, 161, -250, 291, -220, -114, 47, -84, 142, 9, -85, 208, 281, -206, -41, -15, 85, -194, -332, -147, -104, 104, -232, -125, -30, 245, 145, -156, 114, 72, -94, -126, -27, -73, -103, 22, -70, 186, -140, -8, 138, -113, 108, 188, 42, 52, -24, 141, 124, 155, -149, -208, -105, 134, 12, 569, -38, -19, -133, -263, -375, -88, 131, 197, -120, -248, 37, -2, 250, -86, -95, 298, -159, 16, -227, 145, -41, + -2, -46, -358, -216, 16, 203, 129, 22, -370, 250, -151, -145, -161, -203, -35, 206, -165, -172, 121, -51, 69, 375, -162, 16, 17, 164, -109, -91, -51, 242, -53, -115, -21, 190, 236, -225, -258, -78, -36, -75, 75, -152, -102, -126, 61, -179, 151, 201, -150, -164, -153, 87, -22, 289, 482, -266, 11, -3, -41, 55, 134, -392, 354, -273, -147, 373, -91, -163, 113, 145, 1, -9, -287, 186, -47, 73, -193, 244, -29, -373, -421, 152, -84, -199, 96, -3, 630, 123, -126, -173, -387, -116, 62, -73, 283, -43, + -452, -22, 289, -109, 25, 285, 160, -122, -46, 239, 262, -97, 32, 76, -163, 101, -93, 30, 5, -7, -112, -178, -322, -72, 161, 227, 0, -320, 117, -346, 6, 136, -65, -257, -132, -47, 230, 195, -148, -139, 245, 113, -154, -151, -131, -10, 237, -34, 15, -7, -10, 321, 148, 217, -22, -8, 101, -155, -280, 230, 352, -236, 302, -84, -38, -132, 152, 17, -180, 112, 285, 235, 99, -213, -96, -437, 68, 238, -148, -30, -181, 52, -109, 178, -113, 62, 202, 122, 385, 206, 130, 250, -208, 372, 116, 222, + -68, -254, -362, -78, -66, -105, -73, 63, -274, 188, -395, 291, 94, -56, 418, 331, -545, -358, 333, 585, -61, 87, -57, -72, -67, -24, 138, 88, 342, 86, 327, 95, 136, -47, -202, 80, 14, -157, 245, 24, 90, 57, -68, -243, 16, -275, -108, -319, -228, -132, 246, 33, 111, 318, -160, -33, 16, 110, 12, 1, -115, 233, 502, 247, -448, -307, -340, 356, -87, -345, 163, -198, -57, -64, -63, -33, -31, 311, 477, 192, 365, 285, 71, -17, -6, -63, -229, 72, 514, 112, 174, -157, 124, -247, -468, 22, + 234, 85, 186, 288, 293, 30, -340, -269, -448, -667, -21, -69, 292, 236, -263, -129, 169, 368, -451, -273, -92, -230, -172, -78, 132, 289, 8, -154, -210, 292, -226, -81, -9, 406, -29, 45, -616, -34, 151, 329, 413, 101, -394, 200, 12, 198, 265, 54, 138, 307, 529, -336, -125, -23, 175, 559, 252, 186, 327, -108, -162, -329, -356, -243, 65, 202, 564, -217, -2, 285, 143, 397, -466, -313, -61, 682, 261, 30, 353, -211, 534, -113, -484, -77, -481, 400, 223, 167, 143, 26, -158, 204, 272, 158, -102, 267, + 327, 317, -41, -238, 446, 127, -31, -54, 51, -272, 290, -32, -83, -351, -205, -207, 524, 213, 5, 95, 271, 417, 200, -476, 460, -25, 267, 144, 405, -61, -526, 198, -21, 252, -91, -181, 200, -47, 137, 704, -77, -261, -4, 128, -317, 545, -253, -258, 397, -243, 108, 186, -149, 101, -399, -137, 278, 5, -390, 64, -110, 266, 118, 112, -678, 169, 54, 227, 504, -28, -18, -14, -194, 417, -407, 92, 323, 139, 301, -174, -175, -306, -422, 127, 111, 212, 532, -244, 463, 170, -365, -292, 35, -17, 64, -66, + 251, 298, 378, 77, -805, 144, 297, 184, -515, 269, -241, 223, 83, 82, -27, 145, -17, 644, 399, -404, 95, -994, 210, -357, -208, 161, 236, -521, -745, 371, 393, -726, 492, -240, 244, -133, -156, 306, -227, -25, 77, 828, -89, 590, 179, 437, 57, 104, 178, 796, 853, -456, -363, 442, -572, -30, 189, -628, 367, 17, -21, -140, -155, 40, 92, 79, -339, -30, -62, -516, 274, 302, -511, -437, -169, 255, 311, 233, 0, -147, 283, 819, 493, -209, -81, -159, 612, -507, 247, 78, -690, -347, 3, 49, -575, 370, + 313, 68, 158, 234, -535, -135, -429, -50, 352, 406, 358, -389, -84, -127, 111, -403, 653, -81, 398, 608, -39, 36, -375, 29, -13, -274, -449, -90, -206, -342, -245, 380, -322, 274, -95, -81, 540, -375, -205, 79, 220, 28, -708, -440, 84, -118, 118, -103, -220, 449, 99, -42, -184, -1025, 616, -188, -10, -90, 40, 289, -169, -282, -476, -48, 210, -298, -378, 152, 599, -105, 557, 408, -410, 748, 494, -497, -767, -222, -338, 39, -249, -60, 360, -640, 305, -101, -364, -398, -397, -438, 96, 327, -170, 150, -114, -112, + -652, 1182, 1655, -157, 197, 109, 397, 807, -775, 11, 126, 16, -284, 42, -350, 404, 980, -209, 12, 56, 290, 27, 105, 379, -774, -58, 735, 766, -911, -193, 115, 124, 252, 673, 174, 1361, 210, 417, 182, -219, -303, -21, -979, -1381, -489, -452, -1458, 219, -61, -807, -420, -1349, -178, -190, 882, -902, 523, -618, -89, -408, -361, 354, 773, -639, -292, -60, -248, -67, 271, 649, 599, -473, 1173, 876, 14, -477, -959, -44, -609, 1102, 1790, -408, -109, 338, 793, 289, -487, 311, -419, 121, 238, -80, -559, 179, 558, -127, + -843, 662, -208, 543, -214, -114, -222, -318, -32, 601, 308, 112, 454, -209, -207, 196, -273, 343, 170, 517, 838, 768, -564, -995, -390, -49, 766, -288, 118, 332, -336, -451, -768, -751, 578, 656, -539, -1826, 125, -116, -280, 156, -213, -725, -376, -161, -546, -207, 749, 309, 408, -152, -270, -129, 373, 54, 85, 251, 639, -409, -33, -342, 192, -477, -727, -185, -107, 116, -237, 552, -325, -1194, -618, 381, -536, 625, 596, -283, -74, 58, -343, -26, 204, -80, 117, 794, 699, -214, -1078, -859, 73, 545, -427, -223, -505, -697, + 72, -224, -764, -882, -1227, 457, 180, -16, 721, 912, -29, -762, -535, -628, -319, -257, 226, 317, -322, -584, -634, 279, 307, -697, -594, -312, -98, -444, 237, 1469, 941, 1700, 605, -1014, 1097, -117, -512, -226, -650, -1274, -364, 1065, -598, 55, 333, -151, -786, 795, 789, -461, -597, 68, 1086, -577, 320, 671, 225, -273, -497, -351, 252, -96, 196, -315, 214, -680, 987, -108, 232, -60, -1211, 369, -326, 619, 393, 663, -251, -1194, 861, 371, -391, -747, 620, 317, 658, 645, -559, 255, 691, -1007, 926, 447, -22, 289, -514, 1149, + -126, 758, 342, 1338, -94, -225, 185, 556, 353, 396, 1337, 104, 307, 814, -535, 548, 12, -704, 250, -209, 704, -60, -772, -330, -1979, 106, -241, 60, 1537, 1262, 1820, 958, -481, -372, -750, -1005, 356, 86, 267, 317, -289, 455, 778, 141, -203, -264, -545, -366, -327, 150, 252, -789, -461, -110, 534, -240, 347, 422, -1113, -1105, 217, 319, 254, -835, -375, -750, -354, -344, 730, -949, -1309, -499, 272, 222, -1008, -821, -632, -490, 563, 772, 49, -267, -307, -183, -158, -355, -1116, 366, 867, 766, 257, 1041, 1426, -135, -148, 1026, + -199, -551, -1176, -229, 330, -885, 1282, 475, 87, 494, -558, 55, -294, -384, 223, 115, -355, -539, -340, -498, -440, 192, -344, -137, 226, -139, 37, -156, 628, -482, 511, 218, 40, -464, -231, 417, 138, 19, 291, -27, -151, -171, -191, -103, 36, 30, 42, -540, 277, -205, -250, 237, 111, 114, -136, 443, 318, -460, 419, -17, 272, 656, -163, 380, 274, -244, -256, -340, -9, 136, -695, 340, 40, 581, -260, -1027, 613, 126, -94, 119, -462, 70, -259, 114, -667, -1908, -2829, 582, 2216, 76, 6075, 5591, 3839, 6604, 5079, 665, + 86, -721, -4883, -4990, -3798, -6530, -6088, -1777, -2060, -2093, 442, 1175, -1062, -398, 1892, 1173, -128, 1376, 938, 0, 1142, 2787, 1811, 569, 2857, 2080, 77, 2423, 3328, 713, 268, 3378, 846, -1482, 1637, 2554, -1508, 483, 3622, 206, 470, 4382, 3411, 126, 2657, 3565, -1489, -965, 871, -3277, -5338, -3678, -5874, -8632, -7933, -8822, -11127, -11582, -10158, -10672, -9790, -7258, -6598, -4866, -2879, -2882, -1178, 200 }, + {22, -4, 39, -34, -13, -116, -51, -123, 13, -70, -81, 40, 72, -90, 90, 10, -112, 17, -128, 72, -35, -21, -41, 29, -57, -8, -37, 47, 97, -89, -41, 35, -19, 64, 100, 4, 48, 31, 30, -13, 73, -96, -36, 105, 4, 124, -135, 72, -49, -189, 99, 88, 30, -67, -45, -15, 21, 14, -33, -66, -39, 28, 5, 57, 131, 30, 10, 8, 107, 61, -22, 31, -14, -43, -16, -51, 115, 158, -93, 6, 5, -113, 152, -60, -59, 43, -156, -70, 168, 38, -68, 119, 37, 26, -24, 59, + -1, -200, -9, -74, -8, -4, -192, 4, -123, 7, 20, 87, 103, 35, 26, 20, 89, -47, 31, 7, 15, 20, -26, 81, 119, -226, 106, -58, -136, -86, 175, 90, -58, 102, 30, -60, 62, 4, 1, 12, 13, -20, 2, 17, -10, 79, -46, -100, -101, 5, 33, 1, 5, 60, -16, 99, -73, -27, 86, 5, -66, 41, -35, -55, 15, -115, -12, -86, 32, 52, 53, 40, -86, -7, -71, 78, -149, -86, 79, -166, -16, -11, 45, 36, 84, 172, 82, -21, 3, -61, -45, -304, -277, -18, 211, -51, + 169, 15, 51, -51, -232, 123, 41, -69, 62, -123, -21, 72, 36, 223, -147, 136, -64, -172, -75, -45, -42, 64, 58, -137, -56, -77, -23, 139, 152, 158, -105, 22, -60, -4, -46, -62, -82, -75, 62, 30, 115, -109, -137, -122, 5, -49, -37, -97, 22, -108, -6, -46, 164, -107, -114, -258, -331, -83, -147, -139, -32, 67, -84, -202, 125, -292, 88, -51, -51, 185, 133, 67, 27, -35, -29, -73, 31, 125, -102, 118, 112, 30, 17, 48, 85, -190, -82, 177, -139, 10, -3, 108, -14, -44, 20, 185, + 102, 63, 59, 102, -165, 126, -136, 117, 76, -36, -26, -56, -75, -118, -9, -31, -87, -94, -49, -47, -38, 30, 60, -170, -11, -76, -168, -69, -37, -106, -45, -98, -47, 89, 104, -176, -110, 67, -43, -193, 126, 245, 43, -49, -118, 33, 108, 223, -116, -38, -145, -103, 112, 127, -174, 106, -61, -99, 162, 8, 85, -224, 9, -140, 26, -176, -124, -21, -51, 394, 114, 110, 67, -277, 152, 122, -73, 4, 115, -7, 122, 165, 141, -76, 0, -36, 69, -57, -90, 67, -87, 53, 28, 26, 63, 53, + -159, 31, -33, 75, -238, -133, 98, -105, 281, 123, 275, -4, -133, -143, -191, 293, -71, 134, 150, 31, 106, 96, 94, 38, -192, -10, -73, -28, 134, -11, -10, 93, 60, 97, -82, -303, -180, -114, 226, -201, -60, 139, -14, 28, -168, 297, 18, -113, 235, -140, 362, 189, -80, 45, -101, -67, -331, 121, -150, -20, -12, -69, 143, -51, -145, -136, 33, -124, -144, 88, 11, 110, -58, -287, 92, 140, 160, -130, -153, 49, 187, 38, -135, 248, -229, 117, 275, -197, 48, -108, -231, 335, 114, 311, 272, 47, + -234, -132, 107, -10, 39, -238, 15, -428, -192, -333, 197, -188, -18, 65, -67, -84, 90, 105, 286, -39, -79, -227, -209, 192, 27, 67, 343, -108, -12, 190, -100, 87, 50, 189, 155, -120, -35, -245, 235, -169, -237, -214, 115, -82, -134, 243, -97, 251, -179, -128, -54, 161, 198, -26, -256, 75, -169, 288, 41, 152, -232, -89, 38, 133, -368, 121, 121, 65, -277, 207, 367, -362, 141, -228, 148, 7, 133, -117, -2, 69, -233, -132, -98, 175, 203, -80, 97, -64, 150, 171, 76, 40, -187, -88, -235, -280, + -182, 0, -87, -31, -110, -281, -89, 34, 22, -36, 393, -341, 115, -181, -50, -122, -105, 145, -106, -11, -128, -106, -155, 176, -194, 139, -52, 137, -26, -4, -29, 130, 80, -35, 328, -17, -184, 54, -155, -199, -216, 119, 64, 64, 78, -380, -48, 68, -109, -296, 341, -7, -4, 320, -102, -296, 93, 221, 370, -9, 147, 50, -358, -84, -195, 190, 82, 107, -145, -7, -32, 48, -132, 178, 28, -121, 183, 44, -241, -172, 35, 259, 201, -288, 577, -13, -6, 180, -40, -62, -22, 398, -208, 205, -62, 281, + 64, 253, -106, -170, 116, 219, -116, -210, -261, -200, -113, -27, 212, 22, 183, -8, -77, 206, -186, -299, -101, -188, -221, -230, 191, 184, 0, -119, -21, -24, -221, -21, 23, 159, -233, 7, -31, -105, -489, -65, 239, 175, 245, 22, -260, 696, 301, 472, 56, -215, -78, -73, -292, -24, -111, 144, 7, 10, -89, -133, -246, 79, 31, 7, 136, -17, 61, -31, -213, -176, 139, -5, 325, -409, 329, 191, -136, -298, -449, 90, 366, -191, 354, -34, -9, 72, -95, -411, 55, 183, 92, -183, -39, -118, 97, 186, + -3, 40, -20, 168, -71, -42, 87, -90, 253, 77, -541, 387, 352, 413, -131, -370, 132, 148, -550, -502, 489, 53, -235, 185, -342, -391, 59, 1022, 478, 191, -274, 6, -95, 10, -112, -55, -124, 39, 296, 61, 364, -139, -112, 69, 258, -44, -29, -530, -15, -296, -7, 419, 305, -103, 299, 580, -262, 173, 488, -342, 516, -34, 221, -111, 36, -59, 86, 126, 516, -181, -44, 140, -212, 157, 99, -124, -202, 495, -11, -260, -60, 279, -89, 149, 33, 13, -27, -87, 667, 114, 99, -350, -195, 12, 82, 129, + 159, -662, 35, 36, 480, 71, 126, -50, 437, -711, 27, 357, -415, 100, 88, 336, 72, 32, -111, 6, -356, 118, -85, 59, 103, -66, -269, 96, -212, -380, 217, -217, 144, -357, -218, -41, -105, 81, -146, 384, 0, 367, -387, -333, -102, 3, -3, -117, 336, 269, 696, -112, 447, -261, -43, 135, -525, 601, -15, 372, -12, -489, -279, 196, -573, 303, -37, 415, 548, 130, 341, 517, 183, -217, 497, -531, -51, -164, 70, 422, -377, 952, 132, 236, -274, -383, 139, 5, 816, -114, -273, -460, -303, 229, 154, 136, + -49, -451, -691, 58, -412, 568, 85, 463, -270, 198, -170, 244, 675, -102, -55, -92, 188, 228, 129, 58, 86, 297, 276, -137, -207, -192, -207, 768, 320, -429, 364, -87, -338, -245, 159, 292, -490, -658, 104, -283, 912, 475, -113, -77, 197, 383, 147, -118, -94, -498, 22, -260, -52, 0, -217, -453, 274, -174, 398, 131, -361, -202, -166, 49, -498, 323, 536, -242, 347, -113, -105, 207, -340, 194, 442, 75, 738, 304, -263, 262, 160, 225, 45, 339, 362, 467, 224, -240, -206, -357, 2, 746, 49, 290, -464, 985, + -273, -851, -349, 605, 84, -137, -57, -95, 518, -404, 314, -121, 644, 881, 514, 397, -294, 478, 358, 262, 400, 476, -68, -981, -542, -724, 215, 159, 217, -149, 323, 552, 61, 61, 493, -216, 139, 336, 403, 140, 191, 306, -242, 719, 288, 134, -204, -561, -222, 297, -28, -792, 1061, -378, -206, 320, 17, -112, 77, -213, -249, -61, -577, 135, -620, 9, -492, -561, -113, -126, -124, -413, 174, 424, 112, 323, -579, 558, 1027, 97, -420, 635, -535, -849, 1389, -154, 91, -108, -633, 470, -576, 232, 842, -31, 1160, -928, + 872, 241, -591, -322, 100, -575, -287, 594, -605, 364, -394, 131, 642, -1298, -588, 484, -912, -268, 147, -406, -1226, -314, 401, 951, -301, 484, 14, 233, 491, 325, 850, -210, 39, 243, -748, -472, -220, -231, 177, 26, 69, -378, -59, -503, -415, 219, 1054, 620, -267, -317, 508, 618, -347, 179, 470, -160, 1013, 365, 159, -747, 489, 126, 389, -50, 111, -96, -152, -1186, 339, 880, 434, 152, -6, 467, -667, -1220, 114, 1725, 425, 1384, 1286, 71, 133, -744, -696, -9, -591, 833, -1684, 395, -684, -1165, 259, 730, 806, 2, + -277, 852, 1607, -2, 471, 239, -778, -276, 865, 216, 406, -248, 283, 97, -245, -30, 471, 408, 596, -286, -21, -1258, -1094, 115, -658, -19, 659, 105, 121, -254, -87, 348, 1006, -739, -349, -135, -625, -94, -600, -248, -639, 565, -784, -114, 205, 359, 1519, 1904, 563, -562, -984, -142, -653, -331, -1047, 113, 1133, 734, 708, 21, 225, 1035, 1137, 720, 13, 428, 265, 169, -1158, 295, 242, -349, 785, 761, 81, -138, -122, -1897, -352, 946, 723, -494, 498, 695, 109, -939, -1057, 981, 371, 202, 823, -15, -321, 821, 251, -682, + -304, -270, 314, -17, -364, 114, -405, -80, -169, -247, 607, 1046, -345, 185, 536, -296, -194, 167, 643, 154, -450, -647, -698, 341, 433, 936, -441, -493, 372, 534, 944, -81, -1676, -421, 577, 488, 275, -395, 16, -746, 132, -363, 739, 941, -273, -54, -559, -726, -207, -1388, -215, -744, 599, -648, 578, 440, -1318, -317, -494, -369, -486, -831, -179, -470, -826, -1272, 616, 631, 383, -859, -1143, -899, -501, 180, -44, -1138, -672, -791, 1067, 304, 457, -374, -629, 1331, 320, 388, -281, 40, 382, -322, 296, -147, 624, 872, 10, -795, + -630, 677, 465, 583, 146, 102, -370, -206, 61, 381, 916, -76, -1851, -1740, -30, -483, 1023, 1022, -1284, -908, -579, 1434, 1284, -825, 139, -1058, -1010, 465, -514, -100, -233, -762, 368, 319, 253, 1310, -966, -203, -180, 44, -184, 1382, -875, 816, 1067, 474, -2059, -1004, 864, -720, 555, -282, -777, 457, 308, 48, -268, -1573, -3, -169, 141, -332, -919, 664, -515, 1223, -3, -244, 797, 362, -502, -187, -344, 592, 1279, 735, -810, 86, -491, 447, -405, -360, 248, -182, 772, -701, -1168, 205, -312, 358, 684, -1822, -115, -464, 236, 1716, + -322, -1506, -174, 1026, 762, -895, -39, 565, 208, 726, -1140, -914, 1061, -1063, -1747, -813, -74, 1742, -266, -1159, 1157, -1688, 1980, 145, -1987, 548, -19, 671, 1668, 518, 240, -947, -375, -946, -1105, -387, 231, 624, 856, -108, 503, 581, -506, -1064, 568, 186, -843, -304, 823, -290, -80, 728, 427, 316, 114, 407, -393, -990, -414, 264, -390, -246, 368, 9, -678, 702, 164, -651, 91, -169, 625, 327, -240, 274, -372, -872, 123, 192, -70, -15, 189, -391, 126, -338, 200, 591, -56, 247, 292, -257, 25, -602, 209, 316, -1007, 549, + -561, 155, 23, 32, 326, -56, 1619, -58, -54, -448, -443, 336, -20, 291, 5, -156, -214, 113, -299, 307, -281, 446, -357, 262, -302, -64, -47, -278, -214, 68, -125, -85, 0, -208, 31, -37, 71, -45, 127, -420, 391, -140, -123, 300, -232, 22, -290, -251, 193, 172, -201, -127, 89, -6, -354, 100, 71, 8, 244, -79, -94, -89, -237, -58, 267, -265, 80, -124, -23, 27, -73, 70, 14, 189, -247, -15, 174, -306, 191, -122, 15, 98, -44, -67, -747, -1298, 490, 4101, 1043, 2256, -76, -2225, -705, -2190, -1846, -671, + -435, -166, 1244, 1640, 2199, 2748, 1205, -723, -1268, -2731, -2570, -1068, -851, -590, 1127, 1505, 920, 1393, 1701, 557, 475, 301, -864, -419, -616, -1383, -743, -1031, -1494, -835, 198, 145, 851, 2023, 1406, 1146, 1143, 333, 95, -132, -577, -854, -1049, -1531, -1329, -765, -225, -527, 433, 770, 680, 1138, 1297, 810, 759, 716, -91, -345, -141, -985, -766, -253, -865, -922, -669, -1073, -609, -133 } + }, + { + {-18, 13, -79, 82, -111, 12, -38, -70, -137, -46, -2, 25, 165, 89, -63, 2, -16, -2, 10, 5, 53, -7, 35, -26, -202, -70, -34, 10, 122, -75, 8, -11, -4, -43, 72, 15, -33, 88, -62, 34, 39, -88, 78, -38, 5, 21, 28, 40, -36, -65, -21, -45, 34, -40, 9, 54, 140, -48, -108, -31, 103, 107, 67, -2, 32, -37, -54, -43, -128, 92, -16, 21, 4, -43, 27, 27, -12, 13, 98, 92, -83, -18, 139, 42, -68, 12, -75, -72, -53, -125, -40, 72, -3, 38, -18, -37, + -31, -18, 105, -68, 9, -7, 7, 79, 0, 53, 181, 137, 143, 70, 34, -25, -162, 65, -59, 104, 40, -58, 53, -76, -141, -46, -53, -138, 8, -19, -17, -66, 11, 140, 65, 94, 1, 57, -53, -5, 76, -62, 51, -77, -79, 8, 168, 110, 65, -32, 28, 18, 10, -26, -61, -84, -66, -5, -54, 60, 32, -106, 250, -6, 15, -27, -132, 96, -69, -67, -153, -119, -50, 94, 136, -29, 80, -33, 148, 152, -309, 54, 0, -32, 103, 161, -52, -26, 2, -13, -80, 61, -81, -65, -8, 79, + -48, -177, -79, -121, 11, 7, -156, -22, -70, 28, -8, -28, 34, -56, 49, -88, 77, 113, 178, 70, -84, 59, 72, -35, -210, 6, 102, -90, 57, -127, -7, -84, -209, -71, -112, 39, 67, -77, 17, -33, 201, 58, -280, 101, 140, 54, -27, 74, -177, 27, 74, -37, 72, -10, 88, 24, -121, 75, 104, 108, -34, 52, 55, 42, -317, 45, -137, -38, -48, 74, 30, -255, -96, -57, -52, 105, -99, -179, 40, 84, 48, -178, -88, 57, -172, -13, -190, 27, 87, -95, -34, 106, 131, -317, -28, -88, + 91, 39, 11, 27, -94, 80, 64, -246, 183, -26, 40, -125, -59, -104, -20, 26, -96, -122, 92, -47, -140, -118, -111, -59, 200, -65, 21, -161, 171, 19, -128, -25, 96, -208, 66, -56, 41, 42, -106, -63, -264, -62, -296, 45, 58, -23, -47, -19, 36, -105, -213, -88, -83, -24, 68, -39, 115, 63, 86, -119, -15, 2, -115, 38, 76, 0, -61, -116, -124, 87, 108, 6, 222, 193, -175, -32, -9, -164, -209, 312, -15, 19, 84, -180, -74, -112, 285, 93, 2, -218, -195, 32, -89, 147, -72, -2, + 6, 31, 1, -348, 175, 98, 178, -96, 98, 102, 183, 43, -347, 87, 16, 138, 253, 13, 110, 96, -207, 73, 20, 29, -56, -29, 130, 85, 6, -127, 0, -61, -64, 208, 97, -9, -26, -251, -214, -247, 68, 67, -254, 18, 19, -254, 18, 39, -32, 291, -34, -144, -33, 167, -11, -261, 286, 146, -176, 137, 31, 25, -1, 15, -65, -132, -119, 224, -9, -69, -4, 157, -142, -263, 13, 42, 37, -235, -86, 62, 107, 399, 122, 320, -352, 12, -173, 4, 120, 134, -179, 78, -103, -95, -124, -207, + -27, -485, -1, 159, -18, -34, 57, -255, 93, -243, -73, 249, 55, 86, 10, 73, 217, 193, 376, 193, -276, -23, 318, -43, -224, -34, 35, -104, 215, 156, -174, -52, 207, 215, -69, -135, 346, -139, -450, -308, 108, -458, -1, -137, 11, -42, -119, 173, 60, -45, -139, 130, -77, 237, 175, -60, -123, 44, 74, 19, 46, 42, -110, 33, -397, 191, -40, 104, 124, 217, 41, -182, 247, -90, 106, -109, 87, -14, -467, -92, -86, -51, 24, -108, -84, 64, 93, 37, 240, 116, -249, -16, -9, -134, 276, -170, + -175, 301, 307, -40, -15, -198, 60, 42, -115, 51, 184, 119, 223, -61, -198, 112, 14, 53, -235, -119, -144, 47, 112, 40, 19, 220, 256, 33, -145, 146, 110, -202, 10, 23, -39, 11, -20, 144, -33, -117, 38, 176, 93, 12, 123, 157, -334, -209, 141, -85, -311, 156, -160, -151, 211, -68, -61, -56, 59, 146, 85, 76, 90, -131, -69, -31, 191, 91, -318, 99, 108, -140, 312, 276, 157, 7, -104, -75, 23, -98, -108, -191, 33, -218, 162, 57, 8, 32, 88, 69, 172, 258, -93, -413, -67, -281, + 102, 39, -369, 136, -152, 470, 159, -293, -6, 301, 158, -240, -144, 318, 180, -210, 265, -211, -284, 51, -431, 282, 243, -42, -290, -6, 87, 2, -270, -194, 3, -318, -3, -750, -241, -85, -415, -142, -91, -179, -144, 99, -203, -375, 95, 237, -390, -106, 112, 193, 325, 211, 189, 214, 70, 378, -233, -98, 73, -189, 64, 106, 191, 24, 317, 66, 71, 222, -108, -195, -6, -298, -198, -344, -25, -20, -459, 157, -214, 87, -435, 46, -332, 471, 10, -430, 496, 619, 160, -216, -172, 155, -72, -28, 162, -291, + 168, -301, 125, -76, -138, 23, 132, 210, 43, 194, -104, 309, -237, -241, -597, -145, -304, -752, 198, -438, -248, -355, 107, -678, 191, 45, -116, -25, -180, -78, 173, -237, -150, -1, 135, -209, -2, 219, -353, -94, 227, -213, 1, -8, -44, 300, -257, 175, -109, 243, 280, -280, -346, 328, -21, 64, 104, 21, -62, 181, -87, -428, 125, 75, -345, -51, -112, 206, 282, 119, 63, -117, -238, 250, 183, 217, 8, -380, -64, -82, -138, -90, -18, 16, 111, -171, 891, 533, 23, -274, -695, -71, 307, -137, -287, -500, + -40, -98, 6, -163, 154, 11, 436, 191, -198, 1, -91, 48, -103, 107, 267, -311, 53, -181, 119, -124, -246, -447, -47, 280, 80, -42, 89, -18, 244, 417, -148, -74, -471, -485, 131, 92, -220, -166, -424, -269, 159, -36, -5, 40, -37, 210, 104, -323, 11, -293, -30, -149, -99, 353, 685, 1148, 41, 376, -335, -400, -575, -1, -6, 171, 119, -53, -454, 10, 327, 553, -275, 4, 103, -446, 1, -287, -284, 425, -127, -104, -230, 488, 424, 2, 698, 81, 216, 157, -198, -227, -368, -190, 83, 5, 312, 26, + -37, -56, 220, -319, -786, -274, 229, 74, -66, -233, 12, -377, -58, -343, -25, -43, -243, 232, 115, 440, -364, 682, 184, -134, -241, -126, 109, 391, -119, 222, -345, 277, -312, -360, 356, -515, 341, 273, 548, -554, 421, -56, 365, 111, -490, -135, -134, 24, -329, 480, 45, -386, -506, -1053, -316, -621, 177, -33, -204, -310, -285, -268, -279, -284, 35, -232, -35, -499, -751, 921, -283, 496, -90, 124, 166, 264, 185, -54, -9, -407, -84, -102, -262, -427, 171, -55, 601, -419, 19, 813, -190, -691, -211, 18, -300, 470, + 231, -274, 206, 247, -147, -17, 143, 309, 2, -330, -296, 369, 292, -218, -418, 260, 345, -311, -370, 252, -471, 922, 236, -115, 78, 170, 94, -258, 26, 67, 321, -217, 124, 251, -393, -2, 146, 109, -259, 619, 438, 892, 494, 328, 127, -790, -68, 100, -466, -130, 881, 60, -520, -516, 453, -709, -189, 20, 179, 69, -143, 215, -326, -14, -75, -213, -56, -153, -470, 225, -410, 215, 191, 252, 32, 160, -183, 717, 80, -804, -709, 40, 287, 575, -221, -497, -234, -90, 41, 323, 48, -308, 780, -1027, -197, 153, + -726, -396, -217, 65, -1152, -564, 747, -340, 188, -267, -822, -336, 286, -212, 159, 100, 503, -244, -1398, -424, 129, 353, 443, 308, 409, 600, 1219, -722, 538, -222, 26, -225, -915, -772, -90, -97, 253, 324, 541, -209, 30, -308, 49, -100, 42, 454, 320, 114, 439, 407, -765, 346, -424, -658, -129, 328, 161, -465, 184, -12, 340, -89, -738, -629, -602, -717, 139, 474, -46, 1890, -1223, -1034, 647, -245, -333, -208, -45, -58, -1134, 42, -18, 73, 987, -165, 404, 225, 535, 1316, -372, 1424, 459, -189, 340, -859, 312, 1374, + 39, 1434, 757, -89, -556, 1618, 242, -276, 208, -372, -110, -59, -102, 200, 449, 311, 57, 203, -329, -319, 94, -101, 528, 572, 363, -154, 31, -707, -446, -136, -488, -765, -459, 357, -449, -1345, -628, 404, -551, -387, 9, -103, 619, 922, 1204, -648, 332, -12, 25, -263, -823, -1608, -1077, 559, -1092, -558, 269, 550, -422, 624, 1734, 386, 308, -1312, -1825, -359, -610, -875, -260, -638, 523, 569, 1332, 264, -678, -416, -361, 748, 1449, -766, 1095, 901, -159, -217, -512, 163, 977, 747, 1149, -493, -242, -225, -84, -300, 292, -370, + 843, 377, -1414, -591, 2, 226, 597, -273, -538, 174, 159, -207, -268, 176, -403, -592, -281, 1344, 546, 246, -672, -194, -568, 357, 642, 242, 46, 406, -219, 872, 486, 81, 289, 0, 1684, 379, -698, 307, 305, 203, 398, 61, -656, 846, 203, 180, 345, 187, 36, -446, 580, 661, 303, 1621, 1220, -432, -924, -458, -35, -311, -1670, -264, 458, 436, -360, 554, 214, -291, -612, 91, -131, -1001, -281, -391, 89, -1362, -1005, -232, 658, -146, -185, -852, 28, 615, 42, -534, -262, -166, -258, 100, 230, -740, -742, 44, -23, 86, + 1233, -831, -78, -126, -1201, -443, -881, -221, -77, 764, 952, 1084, 329, 108, -453, -1121, 33, 321, -365, 1341, 3353, 3128, 460, -2171, -1914, -853, -1212, 3860, 2435, 1417, 1976, -127, -999, -2783, -1641, -847, -525, 423, 1644, 1679, 777, -759, 889, 305, -6, -1481, -634, 1513, -1057, 499, -119, -205, 310, 272, 624, 1290, -816, -815, 117, -454, 613, -858, -637, -503, -58, -57, -693, 362, 991, -776, -1112, -615, -364, -107, 1371, 196, -187, -1384, -527, 243, 1122, 654, -374, -2038, -1686, 1553, 1428, 1632, -860, -3473, -865, 1702, 1176, 299, -581, 320, + -1614, -766, 310, -332, 257, -173, -130, 1604, -1322, -500, 1051, 1079, 1661, 894, -2638, 848, 2411, 640, 735, 494, -758, 11, 2055, -1796, 218, 301, 186, 1737, 312, -150, -1105, -210, -94, -281, 4, -230, 464, 191, -315, -75, 711, -16, -26, 56, -161, -317, 404, 328, 275, -454, 240, 634, 266, -55, 430, -94, -490, 115, 134, -419, -430, 420, 430, -434, 273, 244, 0, -166, 5, 318, -18, -381, 190, 215, -691, 166, 501, 159, -456, 64, 302, -581, 140, 271, 93, -146, -579, 660, -739, -43, 628, 40, -166, 47, -628, 297, + -123, 303, 509, 43, -295, 1638, 150, -206, -543, -370, 200, -250, 219, -331, -19, 257, -140, 119, 128, -459, 134, -152, -90, -378, 115, -108, -228, -112, 191, -165, -152, 231, -247, 130, 231, -456, 461, -113, -526, 286, 296, -249, 100, 165, -214, -201, 15, 33, 160, -71, -14, -222, 222, -173, -42, 265, -299, 96, -41, 7, -132, -197, -66, 360, -224, -85, 75, 83, 29, -206, 183, -87, -164, 4, -315, 489, -180, 90, 117, -86, 179, -228, -797, -1353, 629, 4585, 725, 2281, -521, -2362, -831, -2302, -1482, -498, -231, 88, + 1374, 1607, 2280, 2223, 733, -909, -1418, -2659, -2001, -1084, -395, -291, 833, 1344, 1074, 1417, 1413, 492, 471, 149, -1002, -401, -859, -1543, -900, -910, -1298, -302, 635, 445, 1361, 1737, 935, 1151, 903, -146, -19, -106, -929, -1191, -1021, -1590, -1314, -494, -59, 165, 1106, 977, 986, 1194, 930, 289, 595, 293, -318, -166, -564, -1270, -665, -630, -874, -524, -423, -995, -381, -29 }, + {17, 11, 78, 66, -73, -49, -16, 98, -101, -5, -55, -125, 63, -24, -121, -50, 116, -164, -50, 152, -47, -188, 129, -16, -68, 42, -54, 95, -56, 44, -110, 98, -15, -105, -12, -49, 58, 50, -25, 8, 14, 209, 95, -26, 105, -51, 84, 15, -37, -24, -133, 37, -51, -102, 93, 17, 52, 23, 64, -37, -58, 1, 12, 39, -32, 67, 7, 11, -5, -80, -6, 27, 56, 12, 31, 82, 6, -38, -34, 188, -105, 31, -157, 44, 19, 240, -143, 0, -75, 120, 124, -79, -14, -68, -37, -79, + -97, 72, 25, -64, 136, 122, 210, -6, 81, 42, -2, -188, 51, 79, -73, 48, -53, -63, -102, 55, 135, 15, 158, -62, -11, 158, 84, 14, 0, 150, 226, -164, 40, -55, -23, -257, -89, 107, -78, 75, 36, -35, -60, 40, -19, 85, 47, 42, 44, -129, 8, -57, 83, 136, 94, -5, 126, 32, 61, 7, 21, -28, 108, -134, -148, 9, -198, 40, -65, 98, -56, -149, 14, 155, -27, 10, 206, 268, -117, -116, -38, -191, 80, 23, 45, -64, 101, -132, -29, 98, -81, -23, 11, 175, 7, 128, + -166, 165, -21, 28, 99, -83, 82, -35, -45, 80, 94, -10, 52, -209, 126, 133, -233, -194, -61, -159, -52, 71, 36, 68, -2, -47, 134, -38, -2, -46, 25, -73, 108, 42, -99, -31, -42, -23, -63, 72, 343, 60, -121, 152, 24, -111, 313, -213, -294, -180, -177, -66, 91, 103, -100, 150, -193, -113, -21, 59, 51, -66, -75, 168, 35, -19, -96, 123, -94, -30, 1, -19, -13, 43, 28, -36, 110, -60, 67, -14, -178, -79, -71, 179, -105, -138, -231, -280, -50, 2, -109, 193, 27, 98, -84, 164, + 74, -116, 284, -143, -140, 7, 177, 247, 184, 45, -93, -223, 80, -21, 196, 56, -50, -30, 90, 33, -35, -309, 38, -105, 63, 33, 218, -285, -182, -206, 104, 108, 127, -144, 41, -35, 7, -231, -219, -140, -163, 256, -112, -18, -18, 94, -52, -246, 95, -91, -47, 130, 75, 147, -5, 84, -195, -64, 147, 279, 143, -1, -220, 156, -81, -167, 229, 82, 68, -141, -104, 94, -72, -74, 112, -92, 28, 16, -188, -27, -131, 188, 72, -16, 11, -73, 86, 27, -24, 40, -219, -96, 80, 69, -62, 2, + -152, 166, 111, -482, 160, 27, 119, 133, -96, -340, 263, 115, 259, -44, 137, 1, -94, -2, -242, 300, 68, 33, -152, -83, -103, 94, -135, 232, 11, 84, 128, 76, -13, 80, 72, -45, 61, -244, 68, 123, 120, 236, 81, -142, 78, -66, 156, 41, 115, 184, 31, -25, 138, -80, -144, -40, 98, 255, -53, 32, 8, 47, 50, 119, 37, -42, -8, -61, 64, 45, -150, -105, 49, 110, 77, 173, -218, -63, -184, 171, 132, 479, 273, 221, 354, 81, 76, -220, 7, -401, -56, 137, 122, 58, 104, 96, + -69, -68, 238, 191, 188, -23, 40, -288, -225, -101, 192, 47, -20, 86, -145, 6, -66, 184, 170, 331, -16, 119, 125, -64, -160, 311, -167, -51, 164, -1, 103, 222, -53, 78, -202, -485, -243, -166, -41, 14, 4, -131, -232, -61, -159, 48, 22, 14, -263, -140, 216, 55, 19, -323, -248, 147, 66, 71, -161, -179, 35, -96, -65, -9, -34, -242, 182, -104, -16, -641, -159, -232, -165, 33, 207, -35, 276, 157, -23, -271, -121, 421, 63, -241, -187, -75, 188, -144, -3, 141, 206, 245, -267, 183, 19, 57, + 70, 104, 79, 246, 2, 80, -214, 300, -152, -62, 45, -236, 297, -41, -591, -188, -475, 35, -10, -136, 639, -106, -319, -101, -79, 300, -41, 146, 173, -115, 221, 309, -152, 119, -265, 133, -87, -69, 294, -88, -19, -140, -10, -68, 85, 298, -414, 86, 81, -126, 52, 315, 330, 128, 117, 164, -259, -39, -276, 0, 174, 117, -59, -210, -71, 154, -285, 18, -20, 140, 271, 34, -145, -102, 290, -176, -89, 177, -102, -331, -123, 89, 60, -125, 34, 191, 125, 186, -18, 144, 249, -93, 125, 122, -165, 383, + -348, 228, 95, -469, 470, -281, 69, -31, 375, -133, -261, -29, 4, 97, 287, -211, -14, 53, 13, -4, 65, -135, 0, -14, -238, -316, 249, -738, 400, -287, -215, -355, 30, -32, 54, 275, -230, -71, 199, 204, -72, 88, -111, -329, -42, 101, -185, 292, 38, -17, -173, -146, 29, 443, 10, -44, 109, -352, -71, 152, -257, 377, 221, 5, -116, -102, -144, -227, -308, 274, 15, 473, 38, -3, -206, 58, -81, 123, -7, -264, -223, -269, -488, -46, 435, -390, -21, -410, 75, 145, 109, 332, -25, -418, 320, -10, + -186, -142, -309, -97, -277, 94, -365, 327, -123, 292, -285, -143, 191, 68, -383, 30, 486, -560, 28, 269, 630, -266, -167, -64, 487, 488, -516, -19, -398, -183, 251, 262, 332, 196, -72, 241, -297, -153, -34, -41, -428, 42, -14, 565, -91, 280, 62, 167, 371, -224, -106, -550, 377, -485, -91, 115, -70, -279, -75, 82, -205, 57, -37, -41, -626, -439, 26, -318, -441, 81, -409, 129, 259, -237, 446, 96, 280, 301, 76, -184, -238, -207, 130, -261, 197, -313, 789, 311, 148, 387, -139, 72, -399, -543, 349, 671, + 217, -15, -660, 802, 132, 88, 132, 18, 162, 35, -101, -17, 222, -138, 275, 38, -187, -294, -60, 245, -53, 72, -98, -116, 23, 718, 138, 93, 119, 48, 459, -177, 148, -297, 544, 712, 213, -57, -234, 744, 384, -5, -266, 94, -147, -46, -306, -146, -192, -330, 535, -172, 407, 53, -246, -32, -566, 546, 12, -310, -151, -362, -316, -302, 570, -300, 202, -75, 185, 235, -178, -177, 716, 714, 868, 532, 166, -219, -240, 135, 245, 314, -475, -11, -65, 236, 174, -321, -409, 0, -162, 381, 435, 0, 224, 78, + 82, 515, -328, -418, 315, -548, 33, -170, 287, 152, -10, 350, 308, -298, 350, -5, -175, 82, 380, -160, 151, 290, 114, -645, -390, 55, 12, -442, -319, 134, 182, 165, -615, -424, -437, -45, 229, 359, -962, -698, 87, 129, 469, 175, 143, 343, -19, -160, -263, 786, -233, -295, -607, -567, -488, 196, -73, 281, -537, -75, 13, -191, -258, 438, -176, 98, -19, 41, -440, -146, -379, 60, 36, 106, 1001, -383, 268, 437, -228, -193, -318, -51, 461, -472, 318, -21, -92, 55, 37, 270, 17, -502, 380, -309, -745, -584, + -309, 1003, 832, -449, -143, -621, -537, -198, 605, 25, 414, 231, -297, 332, -227, -646, -61, -389, -85, -204, 1292, 19, -1058, 826, -333, -234, 738, 769, 25, -101, 52, -61, -631, 147, -502, -333, 169, 109, 293, 869, 165, -36, 219, 33, -354, -238, 210, 32, 732, 156, -32, 247, 399, 378, 434, 9, -283, -96, -663, -106, -750, 410, -452, -194, 14, 602, -346, 328, -239, 192, -303, 378, 609, 24, -113, -337, -449, 241, 309, 737, -89, 20, 346, 1192, -269, 162, -182, -695, 488, -118, 351, -64, 99, -428, 1136, -1703, + 1254, -1953, 848, -1016, 324, -795, 294, 476, -104, 337, -146, 1092, -625, 730, -778, 422, 350, 1351, -936, 390, 257, -818, -14, -163, -222, -421, -12, 46, 550, 199, 294, 404, 340, 12, 463, -519, -62, 626, 83, -858, -183, -1122, -195, 198, -192, -259, -32, 1006, 271, 80, 140, 255, -57, -572, -157, -59, 127, -127, -248, 732, 413, -144, -11, -149, -632, -533, -368, -321, 762, 185, 300, -434, -398, 147, 331, 284, -89, -77, -462, -321, 477, 28, -1160, 426, 693, 209, -458, -283, -195, 47, -209, 27, -406, -1107, 968, 1204, + -123, 879, 24, 145, 367, -754, 269, 580, 550, 248, 164, -540, 397, 252, -344, 193, -74, 675, 176, 184, 385, -142, -455, 145, 837, -286, -167, 776, -282, -324, -279, 278, 977, 1377, -84, -866, 1336, 476, -876, 1011, 384, -229, -250, -355, -612, -18, 334, -514, -337, -1106, -140, 670, -1344, -720, 232, 234, 289, 838, 753, -1194, 38, 57, -823, 246, 443, -433, -274, -371, 265, 827, 367, 450, -686, 364, -574, -610, -626, 724, 2444, -786, 34, 178, 1112, 967, -305, -430, -599, 20, 481, -21, -298, -327, 456, -244, -573, -531, + -88, 892, 647, -714, 68, 12, -289, 352, 152, -253, -61, -198, -72, 1144, -400, -755, -505, -427, 1037, 33, -206, 936, 668, 261, 504, 922, -523, 150, 924, 530, 716, -761, -181, -17, 365, 320, -689, 84, -915, -1427, -29, -365, 721, 763, -141, -43, 210, -508, -1320, 931, -594, 148, -149, -476, -140, -346, -630, 933, 117, 63, -378, -115, -1192, -685, -554, -1406, 1630, -35, 861, -192, 48, -977, -530, -501, 120, 774, -28, -793, -591, -1136, -1266, 1102, 411, -981, -299, 501, 918, 140, -1119, -671, 231, 331, 289, 677, -693, -648, + -94, -216, 102, 218, -1348, -226, -937, -579, -1253, -449, 1734, 330, 59, 458, 433, 173, 1288, 1058, -335, 390, 1732, -405, -407, -360, -1298, 12, -717, -1537, -1699, -799, -885, 478, -655, 149, 229, -881, -255, 259, -53, 12, 1114, -741, 252, -851, -235, -924, 156, 1043, 18, 632, -1288, 1138, 437, -272, 974, 99, 469, -401, -389, -37, 334, 190, -880, 827, -979, 100, 341, -375, 662, -664, -308, -94, -171, -346, -13, 117, -416, -581, -120, -117, -74, 323, 251, 122, -613, 164, 896, 1081, -737, -423, 1008, 1263, -697, -492, 618, 212, + -532, 497, -1357, -297, 679, 1140, 245, -730, -549, 161, 1489, 104, 316, 22, 572, -116, 1076, 20, -772, 425, -671, -101, 650, -1687, -532, 344, -637, 1767, 1206, 875, 387, 1209, 767, 323, 506, -1312, -1882, -204, -34, -420, 193, -37, -530, -550, -542, 1000, 775, -610, -136, -40, -217, -183, -396, -448, -752, -81, 1186, -343, -739, -275, 1111, -489, -586, 1853, 589, 358, -488, -931, -740, -962, 224, 897, 2219, -1938, -898, 1229, 1571, 341, -147, 2140, 945, -595, 611, -177, -42, -1377, -776, -438, -2415, -934, -429, 1327, -727, -284, 846, 8, + -188, 282, 797, -526, 44, 1500, 557, -131, 395, -82, -135, -561, 270, 224, -434, -219, -1589, -71, 659, -160, -661, 284, -147, 709, 145, -355, -3, 759, -435, 115, 279, -243, -5, -424, 848, -61, 128, 3, 410, -197, -158, -277, 170, 306, -139, 365, -163, 219, -396, -327, 483, 603, -798, 21, 2, 58, 253, -522, 773, -711, 622, 66, -1077, -80, 842, -1121, 526, -22, 146, -293, -159, 189, -310, 1075, -804, 73, -185, -117, 205, -33, -130, -199, -816, -2260, -3258, 1083, 2845, 621, 7937, 6548, 4388, 7480, 3851, -311, -1009, -3017, + -6925, -5714, -5588, -7718, -5754, -1744, -1337, -295, 2541, 1136, -463, 1575, 2651, 1242, 1152, 2400, 1344, 1014, 2119, 3450, 1312, 1947, 3189, 391, 8, 2792, 1533, -1378, 1187, 1619, -2216, -837, 1858, -708, -1597, 2477, 1137, -2048, 1134, 1631, -3023, -2843, -1467, -6765, -8881, -5726, -7927, -10408, -7436, -7595, -9716, -7768, -5551, -5907, -3700, -141, 1631, 3956, 6333, 8014, 9707, 9630, 9206, 8790, 5239, 1028 } + }, + { + {-227, -77, 17, -46, 12, 4, 123, -161, -83, -15, -70, -43, -122, 60, -122, -71, 18, 99, -124, 1, 8, -99, 39, 19, -48, 9, 53, 178, 34, 23, 70, 30, -10, 36, -42, 38, -156, -56, 43, -35, 163, -87, -51, -104, 33, 30, -20, 26, -30, -51, -90, -11, -14, 72, 100, 27, 70, 51, 2, 11, -2, -158, 30, -3, -95, 4, -87, 73, 77, -47, -79, -181, 43, 86, 68, -94, -11, 68, 122, 298, 4, 14, -143, -112, 84, 54, 6, 123, -184, -60, 294, 22, 56, -76, -101, 141, + 115, -47, 113, 7, 17, -111, 39, -101, -82, -99, 33, 6, -35, -9, 33, 90, -44, -159, 1, -112, -149, -36, 64, -20, 57, 40, 52, -20, -23, -24, -26, 53, -4, 105, -16, 130, 19, 33, 118, 47, 28, 160, -66, 56, -57, -104, 98, -30, -4, 44, -23, -83, -32, 68, -47, 3, -90, 45, -388, -202, -90, -85, 0, 0, 29, 5, -22, -160, -72, -164, -255, -214, 121, 148, 150, -60, -18, -18, -34, 55, 23, -55, -116, 83, 71, 103, 27, -36, -64, 29, 50, -13, 106, -53, -3, 102, + -79, -126, 10, 172, 39, 37, 24, 0, 22, -28, 30, -138, 22, 141, -33, 1, 14, -50, -28, -21, -23, -39, 86, -82, 85, 72, 159, -12, 89, 202, -38, -162, -178, -11, -29, 7, -136, 38, -75, -19, 266, 217, 86, 114, -75, 54, 183, 96, 197, -74, 77, 120, -10, 152, -81, 97, 12, -90, -29, -13, -11, -22, 6, -43, 10, -30, 179, -38, -15, 4, -88, -229, 128, -51, 46, -88, -93, -95, -71, 66, 171, 144, 53, -5, -44, 61, 121, -23, -48, 163, -76, 81, -85, -56, -44, 65, + 56, -104, -83, 10, 110, 160, 75, 127, -25, 120, 34, 125, -76, 55, 246, 132, 93, -18, -76, -121, 71, 313, 42, 116, 223, 8, -130, -51, -40, 13, -82, -216, 88, 12, 5, 98, -146, -62, 231, -50, -86, -130, 6, -122, -20, -35, -37, 25, 189, 3, -56, 64, -145, 208, -22, -34, 252, -132, 16, -158, -73, 27, 13, 78, 84, -137, 51, 78, 58, 30, 78, 68, 112, -79, -43, 214, -73, 94, 28, 76, 60, 5, -56, 13, 149, -58, 1, -18, 42, 150, -60, -120, -274, 40, -9, -7, + -25, -55, -79, -114, -353, 189, -130, -169, -12, -335, 56, 130, -60, 281, -120, -292, 55, 140, -129, -200, 358, -2, -43, 118, -104, -27, 18, -164, 88, 2, 33, -17, 156, -22, 78, 110, -196, -63, -120, 205, -112, -31, 117, -25, -124, 104, 232, -105, 102, -109, 145, -67, 66, 42, -112, -234, 123, 213, -40, -33, 84, 158, 103, -150, -44, -128, -39, 86, -136, 74, 96, -96, -33, 60, -150, -36, 67, -10, 2, 47, -164, -135, 170, -187, -185, -318, 135, 337, 52, -60, -28, -56, 294, -175, -159, -37, + -175, -53, -190, -81, -132, -265, -72, -57, -6, -27, 72, 161, 60, 81, -241, 33, 0, -74, 90, 48, -66, -29, -169, -190, -23, 218, -57, -107, -17, -68, -143, 6, -149, 325, 280, 74, -74, -72, 38, 52, 66, 57, -9, 123, -101, 56, -87, 6, 13, 70, 63, 153, -47, -91, -63, -338, 36, 55, -9, 101, 56, -141, 21, -317, 41, 347, 304, -328, -322, 92, -259, -119, 24, -5, -113, 266, 101, -346, -41, 34, -16, 241, 73, -154, 229, 102, 19, -117, -150, 116, -101, -230, -57, -19, -121, -132, + -209, 222, 2, 44, -149, 17, 135, -103, -260, -236, 249, 73, 234, -25, 57, 197, 357, 134, -61, -175, -96, -79, 42, 36, -163, -44, 200, 169, 277, 154, -220, -176, 225, 148, -146, 22, 224, 41, -27, -140, 171, 142, -52, 301, -111, 57, -136, 55, -52, -25, 163, -272, 164, -177, 31, 147, -3, -70, 53, -185, 7, -143, -426, -127, 180, 120, 66, -100, 87, 43, 455, 82, -154, 173, 34, 40, 303, -83, -84, 110, -212, 261, 239, -1, 136, -45, -128, -12, -161, 19, -158, 68, 1, 52, 22, -269, + -52, -29, 20, -132, 66, 68, -47, 371, -151, -315, 201, 326, 81, 90, -131, 280, -82, 51, 130, 31, -108, 146, 46, 6, -7, -163, 26, 134, 933, -260, 12, -99, -53, -212, 2, -549, 289, -200, -7, 310, 163, -213, -216, -88, -183, 169, -441, 80, 195, 254, 60, 74, 20, 39, -50, -144, -401, -63, 63, 187, -137, 181, 82, -76, -15, 140, -137, -142, -68, -108, -3, -364, -156, -87, 4, 288, 79, 275, 110, -12, -157, 22, 34, 43, 113, 386, 64, -360, 114, -141, 12, -136, -129, -71, 173, 94, + -604, -242, -155, 98, -1, -123, -61, 183, -68, 269, -134, -164, 125, -298, 26, -685, 173, -229, 75, -238, -491, -84, -107, 348, 159, 122, -3, 465, -344, 81, 143, 359, -410, -245, -73, 30, -18, -124, -29, 121, -215, 42, 144, -30, 29, -186, -198, -132, 574, 2, -126, 217, -124, -285, -220, -155, -29, 99, 33, 19, 325, 286, -40, 102, 81, -361, -235, -15, -16, -92, -233, 305, 379, -296, 211, 191, -45, -279, -442, -430, -315, -168, -361, 34, -318, 139, 210, 10, -1, -279, -230, -163, -180, -60, -411, 16, + 455, -161, 241, -97, 454, 380, 161, -470, -117, 623, -158, 462, 77, -447, -221, 522, 16, -355, 13, -303, -36, 104, 49, -63, -516, -466, 135, 333, -291, -29, 140, -26, 61, 555, 113, 78, 59, 180, -234, -179, -113, -593, -185, -226, -136, 149, 121, -44, -39, -241, -330, 450, -75, -414, -162, 70, 339, -259, -41, -278, -8, -332, -9, -101, -530, 10, -197, 260, 50, -262, -322, -410, 207, -752, -398, -254, -426, -215, -180, -424, 444, -124, 674, -339, -528, -94, -358, 596, -215, -304, -157, 164, 287, 264, -76, -63, + -150, 71, 471, -7, 31, -150, -78, -248, -100, 119, 66, -204, -9, -305, 43, -87, -114, 134, 37, -138, -82, 273, 75, -213, -316, 492, -51, -763, 372, -76, -360, 165, -82, 46, -112, 280, 64, 41, 697, 747, -306, 98, -603, -95, -162, 258, -143, 87, 135, -140, 256, -131, -258, -292, 908, -680, -226, -428, -296, 353, -403, 846, -106, 262, 38, 209, -531, 101, 128, -34, -88, -42, 144, -317, -205, -43, -102, -394, -364, -93, -175, 480, -138, -226, -177, 164, -260, -105, -440, 198, -178, 174, -167, 220, -131, -738, + -391, 104, -75, -50, -248, -443, -45, 185, 109, -108, 122, 216, 674, -309, 306, -795, 24, 102, -120, -239, 131, 14, 6, 160, 522, 358, 250, -164, -218, 243, -371, 67, 237, -192, 480, 118, 345, 1106, 745, -183, -503, -302, 636, -759, 20, -175, -214, 343, -595, 100, -315, 17, -420, -283, 25, 46, -5, -360, 593, 150, -296, 137, -102, 80, 894, 315, -276, -198, 24, 311, 56, -657, -189, -446, -179, -194, 210, -99, -86, 24, -45, -307, -410, 282, -168, 98, -39, 371, -298, -168, 66, 173, -388, 440, -278, -563, + -578, -166, -183, -208, -148, -815, 276, -366, -151, -292, 426, 189, 200, 73, -103, -265, -125, 444, -1061, -139, 718, -881, -342, -29, -262, 309, -176, 979, -94, -224, -159, -53, 294, -206, -186, 795, -586, -83, 191, -142, 507, 273, -32, -75, 216, 274, 314, 243, 534, 156, 230, 125, -173, 878, 112, 152, 225, 117, 643, -62, 157, 205, 183, 88, 421, -269, -207, 405, -83, -446, -116, -766, -261, -163, 698, -689, -95, 7, -33, -62, 406, 1119, -212, 119, 118, 148, 524, -593, -595, -549, 873, 58, -312, 623, -185, 612, + 78, -658, -1856, 356, -430, -746, 835, -507, -229, -734, 207, -161, -676, -245, -392, 176, -361, 0, 172, 296, 183, 514, 107, -22, -32, -465, -320, -336, 282, 379, 210, 124, 14, 136, 338, 710, -318, -209, 154, -347, 377, 59, -290, 722, 299, -639, 276, -615, 102, 97, 347, -188, -169, 924, 400, -422, 282, 479, -347, -838, 496, -86, 34, 46, 246, 1248, -69, 131, 288, -43, 337, 129, -503, 13, -139, -422, -89, -93, -576, -672, 1436, 301, -89, -178, 326, 1290, 597, 149, -35, 428, 1083, 263, 374, 331, 772, -504, + 500, 215, -1480, 431, -209, 431, -461, 340, 231, 451, -4, 186, 71, -429, 208, 407, -351, 199, -342, -215, 1059, 98, 937, -680, 289, -46, -138, -33, -85, 133, 340, 226, -30, 524, -862, -822, 581, -474, -124, -122, -558, 263, -152, 141, 78, 893, 435, 462, 172, 109, -824, -206, 392, -18, -13, -46, -203, -758, 60, 353, -1280, 1088, -450, 198, 734, -1060, -11, -106, 268, 373, 466, 760, 145, -518, 289, 809, -1163, -711, 801, 21, 5, 17, 78, -43, -11, 381, 256, -588, 44, -183, 988, 568, -195, 33, 123, 95, + -2, 329, 39, 245, 1005, 107, 107, -184, 258, -986, -413, -436, -43, 64, -844, 293, -750, 211, 771, -213, -700, -419, 283, -185, -1427, 337, -999, -272, -128, -25, -400, 41, 497, -470, -884, -1379, 1003, 173, -229, 209, -246, 1539, -1659, 646, 911, -1109, -284, -616, -271, 1532, -661, 1076, -476, -190, -236, 326, 185, -1397, -211, -397, 633, -6, 293, 437, -617, -159, -377, 204, 602, 311, -809, -182, 220, 83, -5, -435, -118, -804, -92, -137, 763, -661, 1607, 315, -402, 659, 78, 864, 541, 819, 263, 747, 687, 731, 855, 96, + 830, -1013, -112, 183, -590, -136, 471, -789, -1061, 431, 794, 3, 236, -795, -132, -654, 16, 649, 216, 1173, 486, -214, 1205, 549, -2146, 1952, -392, -732, -524, 1336, -995, -231, -237, -72, 817, -893, -7, 272, -182, -168, 90, -529, 741, -17, -1023, -331, -193, 13, -1126, -64, 217, -292, 85, 273, 816, -360, -109, 104, -416, -1597, 214, 1171, -543, -1004, 149, 933, -375, -350, -1191, -263, 115, 855, 515, 59, -872, -611, 857, -972, 422, 1446, 956, 1104, -455, 615, 546, -1377, -364, -776, -50, 695, 95, 748, 814, -1357, 1539, -918, + 165, -126, -486, 1032, -74, -213, 1345, 908, 165, -280, -658, 374, -27, -89, -17, -51, 29, -290, 358, -35, -1150, 267, 131, -435, 41, 480, -146, 5, -826, 591, -278, -121, -61, 323, -436, -47, 129, -16, 122, -249, 654, -360, 1135, -714, -706, 657, -747, 10, 597, -562, -214, 274, 380, 441, -1671, 508, 6, -421, 1098, -572, 88, -28, -890, 1135, -34, -85, -593, -145, 986, -261, -15, 3, 299, 123, -1157, 537, 1048, -546, 431, -870, 1163, 181, -833, -658, -749, -2445, -3730, 249, 3192, 44, 8384, 7613, 4533, 8784, 5736, -975, + 291, -1156, -6969, -3963, -3099, -6799, -5619, -1684, -3329, -3799, -373, 170, -1661, 287, 1352, -1902, -1647, 2381, 409, -673, 1614, 2213, -112, 2262, 3876, 1324, 967, 3960, 2619, 212, 2849, 4281, 1786, 2112, 4858, 1753, 509, 4635, 4539, 1282, 5499, 7908, 2803, 3115, 5415, 1498, -2070, 84, -2128, -7046, -6748, -7189, -11410, -12301, -13125, -15419, -16040, -15579, -14917, -13007, -11923, -9698, -6763, -6744, -4850, -767, -1292, -2338 }, + {-227, -96, 13, -89, -12, 113, -131, 57, -57, -57, -122, -40, 185, -132, 105, 57, -101, -4, -149, 43, -13, 91, -267, -117, -36, 58, -23, -97, -1, -26, -122, 118, -1, 35, 127, 7, -32, -21, -25, 12, -56, -87, -72, -67, -39, -42, 172, 113, 41, 36, 31, -38, -12, -37, 163, -22, 43, -113, 41, -11, 65, 32, 22, -49, 7, -31, 126, 0, 12, 57, 27, -77, 32, 13, -40, -4, 12, 32, 94, 286, 70, 37, -62, -29, -139, -11, -32, 103, 100, -102, -65, -64, -51, -74, 12, 80, + -64, -79, -236, -183, -126, -12, 17, 170, -93, 81, 58, 39, 14, -138, 37, -287, 38, 2, 17, -26, -170, -86, -146, 2, 12, -97, -229, 152, -9, -143, 2, 82, 22, -55, 35, -86, -31, -82, 58, -87, 111, 79, -16, -164, 9, 11, -13, -67, 40, 17, -34, 71, 87, 46, 10, -18, 31, -93, -310, -347, -25, -137, 106, -170, 42, 79, -117, 95, 348, 20, -32, 191, 25, 192, 3, 87, -137, -181, -10, 69, -127, -41, -13, -36, 34, -37, -67, 63, -32, -27, 136, 194, -61, -106, 39, 155, + 59, 199, 8, -29, -5, 177, 11, -129, -70, 139, 102, 107, 30, -72, -144, 26, 69, 82, -30, -78, 157, 101, -24, -91, 7, -65, 165, 45, 33, 45, 23, 25, 103, 11, 105, -23, 159, 13, -75, -62, 184, 127, 193, 199, -47, 99, -42, -115, -9, 295, 131, 65, 107, -125, 212, 89, 143, -43, -233, 97, -365, 73, -92, 72, 59, -8, -125, 29, 83, -51, 78, 184, -12, -156, -209, 31, 95, -195, 109, -184, -117, 130, -75, -156, -74, -111, 170, 230, 133, -86, 2, 122, 75, -14, -94, -48, + -82, 85, 288, -6, -155, -127, 67, 20, -58, -175, -3, -150, -56, 20, -26, 104, 20, 115, 145, -104, -59, 406, -108, 38, 60, -272, -228, 4, 268, 201, 324, 104, -90, -141, 25, -82, 64, 28, 110, 197, 64, 145, -4, 84, -89, -191, -98, -147, 2, -44, 44, -232, -114, -35, 84, -117, 236, -271, 57, -173, -136, 72, 67, 222, -26, 51, -65, 153, 168, 40, -37, -179, -24, 51, -132, 123, -145, 53, 239, 191, 3, -87, 38, 228, -29, 47, 39, 182, 5, -67, -111, 68, -167, 39, 325, 51, + 178, 3, -144, -154, -250, 123, -177, -192, 44, -96, -595, 53, 98, 544, 183, 35, -244, 223, 104, -105, 125, -26, 204, -126, -57, -46, -48, -88, -31, 136, 128, 209, 81, 100, 2, -145, -147, 198, -107, 40, -14, -149, 210, -40, -85, 30, 153, -105, 231, -294, -235, -298, 74, -170, -248, -63, 237, -104, 72, 134, -99, -137, 12, 16, 79, 9, -73, -13, 301, 124, -124, -379, -300, 107, 337, 267, -221, 5, -128, 48, 58, -107, 178, -299, -50, -371, -108, 54, 130, -339, -84, 229, -28, -339, 175, -110, + -193, 103, 176, 37, 36, 58, 230, -114, -98, 56, -116, -63, 1, -18, 5, 180, 92, -27, -19, 102, 42, 127, -15, 143, 155, 56, -178, 17, -29, -132, 162, -104, 65, -124, -47, -424, 32, 325, 24, 346, -72, -92, -373, 418, 197, 231, 34, 186, -9, -18, 163, -116, 56, -20, -405, 68, -88, 83, -48, 83, 279, 41, 64, -484, -6, 347, -68, 202, -217, -167, -400, 225, 132, 263, 138, -143, 240, -67, 230, -153, -122, 8, -38, 181, 51, 152, 191, -116, -80, -71, 130, -32, -64, 17, -149, 76, + 69, -92, 132, 202, -71, -102, -13, -165, -64, 234, 46, -156, 306, -328, 64, 166, -60, -112, -10, 132, -232, 118, -86, -216, -144, -132, 19, -65, -119, 54, 379, 197, -33, -129, -334, 34, 205, -112, -343, 4, -12, -6, 72, 94, 28, 162, -73, 44, 230, 20, 270, 301, 659, 457, 274, -65, -352, -116, 319, 145, -340, 259, -60, -161, -208, 38, 572, -381, 414, 169, -89, 144, -111, 304, -112, 165, 33, -197, -141, -191, 11, 179, -45, -103, 113, 24, -29, -377, 123, -206, -157, 117, 262, -177, -263, 21, + 240, 31, -144, -46, -80, 117, 89, -77, -131, -207, 152, 365, 234, 123, -184, 117, 244, -240, -295, 57, -229, -107, -440, 10, -290, -89, 185, -51, 729, 11, -277, 313, -343, 399, 39, -251, -415, -107, 213, -340, 304, -52, 198, 224, -189, -86, -111, -160, -54, -150, 31, -182, 193, 114, 163, 313, 170, -50, 384, 189, 77, -204, -213, 111, -161, 38, 127, -252, 223, 574, 52, 408, 201, 198, 299, 19, 162, 165, -364, -249, 264, 21, 250, 48, 261, -35, 99, 70, -524, -26, 144, 367, 86, 325, 37, -59, + 104, 151, -288, -457, -260, 67, 117, 35, 322, 50, -338, -43, -299, -160, 145, -171, 84, 94, -173, -478, 164, -473, -516, 103, -246, 222, 349, -98, 405, -106, 401, 513, 17, 19, -514, -112, 74, 79, -45, -361, 42, -308, 56, -92, 99, -126, -177, 32, -16, -120, 144, 0, -61, 366, 161, 272, -158, 40, -129, 95, -11, 136, -26, -126, -121, -349, -173, 526, 245, 343, -387, 72, 335, -278, 32, 183, -77, 180, 63, -376, -54, -565, -38, 135, 145, 278, 68, 115, 7, -326, -325, -308, -493, 341, 191, 45, + -339, 305, -23, -388, -350, -100, -103, -243, -123, -139, -152, -81, -396, 200, 195, -6, -59, -55, -163, -430, -509, 28, 183, -115, -325, -154, 198, 179, -19, -81, -159, -117, 255, -133, 168, -125, -28, -468, -141, -25, 326, 114, -124, -257, -230, -364, 569, -266, 535, 91, -299, 402, 325, 672, -695, 288, 46, 113, -194, -153, 208, 184, -129, -243, 207, -91, 206, 324, 59, -114, 262, -82, 501, -850, -952, -568, -117, -391, 231, -319, 14, 184, -46, 630, 422, 172, -201, -122, 408, -58, 44, -162, -407, 14, 132, 116, + -235, 198, 3, -13, 340, 512, 11, -310, -163, -606, -264, -150, -211, 36, 81, -217, -116, -307, 310, 410, 309, 382, 268, 497, 32, 171, 88, -90, 161, 294, -326, -1025, -268, 335, -559, 263, 303, 112, -191, 14, -157, -426, -139, 249, -348, -289, 78, -213, 636, 574, -212, 278, 8, -182, 807, -675, -40, 146, -700, -172, -312, 128, -233, 610, 47, 20, 699, -14, -674, -490, -346, 276, -68, -599, 130, 201, 298, -345, 158, 344, 244, 249, -108, 406, 376, 166, -943, 694, -360, 285, -101, -66, 140, -375, -266, 458, + -232, -26, 350, -403, 351, -119, 322, -446, 596, -251, 944, -96, 18, 288, -263, -126, -166, 117, -99, -457, -675, -131, 308, -142, -285, -583, 227, 126, -894, 51, -81, 202, 233, -150, -81, -80, 296, 993, 458, -270, 642, 245, -452, 189, 406, -42, -173, -570, -187, 391, 213, 199, 81, -82, -266, -537, 271, -167, 121, -406, -262, 15, -96, 578, 137, 114, 392, 229, -671, -48, 202, -92, -20, 574, 146, 662, -404, -204, -141, -206, 210, -215, 437, 507, -250, -431, 734, -365, -208, -57, 183, 157, -485, -88, 222, -162, + 292, -120, 433, -208, 40, 821, -96, 602, 828, 191, 314, -116, -1143, -599, -245, 61, 98, 493, -1269, -298, 1314, -502, -572, 1171, -754, 662, 873, 351, 115, -663, 249, -1166, -582, 259, 601, 72, 133, 446, 1176, 803, 243, 47, -9, 134, 90, -456, 2, 295, 362, 1581, 881, 611, 1131, 468, -173, 345, -31, 1095, 385, -88, -193, 458, -82, 525, -1639, 72, 549, -31, 667, -252, 166, 364, -1532, -584, -134, -482, -643, -736, 675, -449, 119, -133, 676, -1133, -337, -150, 333, 14, -98, 838, 1343, 69, 430, -98, 71, 634, + 655, -620, -1961, -417, 876, 134, -174, -217, 113, -336, -319, 385, 381, 855, 383, 489, -156, 1155, 270, 709, -58, 1059, -376, 666, -662, -61, 130, 454, -153, -460, -889, 453, 123, 34, -401, -922, 4, 21, -47, 180, 603, 1, 449, 1306, -524, 52, -395, 627, 690, -794, 729, 654, -465, 87, 254, 411, 339, 941, 421, -498, 158, 1237, 537, -1714, 577, 121, -1216, -558, -269, -1126, 236, 222, 662, -811, 1067, -960, -115, -292, -1243, 1006, 2184, 140, -1208, 1874, -420, -35, 272, 1058, -610, 36, 2137, -1068, 510, 708, 691, -958, + -94, 156, -463, 66, 223, -401, 379, -670, -185, -280, -49, -412, -343, -149, 205, -736, -666, 974, 181, -655, -165, 565, 1444, -159, -704, 718, 1106, -359, -82, -12, 402, -41, 3, 456, -1222, 787, -703, -49, -995, 498, -72, -1561, 745, -183, -567, 925, 135, 905, -817, -424, -296, -890, -1098, -1643, 1384, 307, 940, 632, 415, 0, -330, 1153, -455, 320, 299, -1259, 1128, 354, -292, 915, 102, 30, 485, -445, 1229, -1005, -499, 414, 436, 169, -884, -587, -988, 517, 151, 468, 18, 505, 235, 141, 37, 422, -196, 212, -447, 300, + -413, -50, -550, -446, 34, -548, 243, 1139, 293, -942, 473, 306, 638, -35, 1056, -958, 145, 362, -865, -261, 1760, 928, -2315, -1046, 1240, -401, -1100, 370, -111, -919, 622, 971, -1389, 183, 1199, -896, -636, 669, 261, -587, 176, 953, -2142, -230, -318, -2536, -366, -832, 317, 353, 805, -396, -885, -433, -1310, 116, 574, 218, 299, -1184, 764, 40, -1261, 912, -1362, -658, -459, 324, 1126, 1143, -15, -339, -2247, 935, 2448, 795, 142, -1365, -1815, -848, -71, 928, -1100, -778, -1130, -456, 2300, 2312, -318, -1163, -847, -570, -151, 1133, -467, 292, + 354, 730, -112, -605, -1279, -669, 2228, 840, 1524, -1362, -600, -668, 1556, -28, -2173, -2291, 1249, 1913, 3383, 759, -2404, -278, -665, 1001, -1079, 915, -959, -259, 76, 211, -150, 185, 427, -687, -515, -56, 184, 369, -428, 21, 393, -321, 259, -189, 1127, -61, -128, 581, 380, 510, -246, 308, -77, -63, 494, 278, 112, 88, 654, -627, -139, 12, 871, -64, -153, 726, -163, -389, -301, 591, -118, 227, 207, 43, -191, 60, 287, 32, 764, 303, 243, -374, -10, 216, -480, 124, 236, 471, 47, -131, 345, -4, -550, 591, 247, -232, + 544, -425, 90, -294, 7, 264, 1748, 147, -653, -531, 83, 403, -29, 369, -142, -90, -491, -100, -345, 549, -342, -20, -217, -93, -128, 68, -363, 64, -157, -245, 73, -32, 19, -60, 126, 71, -301, -184, 0, -194, -177, 160, -48, -297, 22, -160, 133, -444, 229, -186, -342, 116, -155, -167, 50, 9, 25, -64, 81, -127, 159, -83, 22, 266, -177, 98, -42, -13, 76, -196, 198, -206, 197, -30, -2, -119, 179, -185, 19, 95, -261, 234, -86, 17, -826, -1381, 1463, 5004, 981, 1490, -3077, -4323, -1779, -2273, 1758, 4014, + 2337, 1537, 175, -2241, -1948, -1986, -786, 1097, 971, 998, 934, -50, -129, -253, -298, -486, -44, 596, -36, -378, -121, -538, -272, -111, -110, 970, 940, 524, 604, 9, -696, -749, -1316, -910, 142, 88, 292, 768, 1144, 655, 587, -47, -617, -907, -745, -662, 112, 207, 431, 263, 209, 20, -212, 70, 42, 75, 569, -71, 264, 232, -300, -646, -616, -543, 64, 328, 359, 59 } + }, + { + {-132, -96, 21, -85, -52, -38, -11, -14, -55, -164, -122, -87, -43, -119, 49, -28, 19, -49, -18, -75, 77, 15, -55, -98, 9, 109, 60, -112, -108, 19, 9, 12, -75, 15, -28, -49, -15, -46, -69, -33, -118, 150, 41, 104, -103, -173, -15, 21, -20, -161, 8, -41, 93, 62, 69, 161, -30, -8, -52, -27, 57, -113, 128, 154, -76, -54, -133, -71, 22, -43, -80, 4, -82, -43, -93, -72, -104, 14, 63, 196, 13, 132, -33, -16, -73, 141, 83, -78, -111, 72, -31, -161, -194, 48, 5, -62, + -69, -125, 77, -148, 34, -12, 29, 15, 27, -65, -15, 29, 38, -13, 47, 41, -73, 53, -47, -126, 176, -32, 1, 46, -30, 103, 121, -24, 40, 100, 0, -99, -87, 29, 52, -27, 23, 123, -115, -90, 87, 24, -52, -58, -17, 29, 59, -112, 42, 40, -112, -88, 60, -34, -137, -24, -32, 174, -238, -102, -164, 108, -80, -110, -76, -99, -20, 38, 179, 32, -96, 152, 6, 157, -150, 243, 112, 263, -47, -88, -18, -143, -12, -9, -52, 50, 5, -113, -28, 1, 36, 115, 27, -170, -142, -53, + 97, 8, 5, -85, 143, -2, 11, -60, 19, -35, 76, -22, 239, 4, -30, 92, -59, -105, -43, 83, 145, 26, 90, 24, 17, -73, -72, -119, -3, -122, 33, 102, 104, 75, -35, -45, 88, 171, 173, 100, -6, 152, -85, -119, 115, 131, 154, 240, 16, -145, 81, -138, -16, 52, 28, 266, 14, -207, -16, 42, 82, -11, -79, -229, -53, 201, 61, 133, 144, 130, 27, -19, 127, -169, -14, -114, 306, -14, 0, 143, -126, -15, 39, -15, 177, -26, 46, 183, -46, 60, 3, -6, -14, -20, -65, 81, + 90, -22, 89, 42, 190, 240, -30, 68, 20, -111, 93, -21, -116, 48, 79, 49, -50, 173, -39, 258, 260, -105, -143, -132, -84, 62, -277, -31, 43, -137, -245, 238, -48, -64, 42, 108, 103, -126, -45, -8, -10, 55, 88, -49, 108, -81, 163, -21, 10, -84, 88, 29, -21, -83, 42, -48, -68, -62, 17, 51, -149, 12, -283, -166, 105, -44, 37, 63, 191, -61, -93, -7, 8, 79, 78, -88, -37, 208, 9, 33, 19, 94, -173, 8, 88, 164, 33, 72, 239, -53, -23, -125, 11, 55, 100, -163, + -263, 114, -88, 8, -137, 107, -303, -244, -286, -93, -64, -195, 97, 272, -203, 44, 313, -72, -91, -144, 21, 1, 136, 48, 96, 72, -108, -200, -101, 121, -74, -122, 25, 52, 34, 26, 270, -130, 144, -72, 69, -80, 223, -171, 86, -14, -144, 127, -59, -46, 129, 73, -21, -61, 115, 61, -138, -154, 95, 169, 85, 3, -85, 7, 97, -48, 118, -31, -275, 10, -126, 346, 116, -173, -114, -43, -105, 2, 109, -231, -260, 222, -40, -231, 28, -68, 235, 101, -48, 30, -2, -46, -31, 250, 60, 1, + -170, -95, -34, 78, 123, 339, 17, -3, -3, 9, -148, -8, 71, -208, -130, -141, -10, 241, -204, 19, 123, 33, -93, 89, -257, 195, -42, -19, 120, -152, -152, -261, 54, -100, 231, 57, 8, 20, 71, 155, -78, -64, 187, -64, -106, -31, 187, 161, 172, 63, -113, 72, 152, -203, 210, -157, -118, 75, 53, 134, -494, -309, 76, 166, 321, -191, 168, 43, 177, 1, -97, -103, 106, 353, 19, -20, -336, -263, -8, -191, -128, 22, 32, -196, -71, 61, 112, 75, -142, 10, 145, 136, 18, -116, 15, -67, + 29, 54, 63, -87, 115, 309, -38, -12, 51, -156, 72, 250, -243, -270, -151, 33, -368, 18, 6, 59, -1, 3, -176, -85, -115, -8, 244, 370, 9, 29, 177, -71, -29, 79, 395, 39, 133, 267, 54, -157, 53, 264, 142, -215, -25, 509, 422, 107, 249, 341, 68, 11, 199, -81, -12, -178, 144, 3, -7, 88, 70, 285, -242, -190, 190, 59, 79, -144, 14, -39, 90, 19, 132, 163, -165, 141, 87, -152, 421, 95, 68, -321, -127, -8, 265, 285, -46, -271, 170, -232, -99, 244, -28, -157, 194, 297, + -93, 117, -135, -355, -25, 273, -141, -101, 130, -151, -313, 105, 149, 380, 132, -199, 53, -216, -373, 393, 45, 104, -326, -115, 524, 318, -210, -72, 4, 79, 85, -43, -187, 39, -124, 204, 21, 73, -55, -40, -194, -120, 456, 138, -253, 120, -246, -193, -394, 171, 25, 0, 116, -18, -167, 303, 196, -74, -292, 307, -193, 77, 14, 98, 84, 194, 252, -58, 151, 359, 72, -117, -77, -67, 84, 240, -38, 96, 49, -224, 40, -56, 141, -335, 29, -557, -301, -311, -41, -308, 246, -78, -209, -67, 15, -199, + -26, -16, 58, -121, -176, -192, -342, -446, -199, -299, 763, -374, 179, -354, -92, 28, -49, -524, -4, -253, 25, 598, -188, 245, 340, 111, 142, 356, 114, -152, 109, 133, 159, 55, -72, 414, 20, -45, -68, 104, -34, -159, 146, -66, 105, -423, 18, -91, 373, -158, 120, 546, -49, 0, -137, -243, -15, -50, -239, 285, -68, 203, 19, 191, -123, -34, 440, 205, -354, -195, 86, 94, 43, 82, -114, 109, 150, 344, -419, 2, -173, 90, 3, -74, -104, -263, -209, -254, 276, -519, -134, -330, 173, 512, -269, 3, + 31, -114, 219, -180, 98, -64, -198, 457, 41, -163, 25, -79, -189, 153, -140, 144, -277, -147, 219, 138, -475, -97, -401, 118, -50, -413, 515, -145, 12, -381, -389, 17, -348, -54, -297, -279, 347, 30, -393, 132, -348, 328, 145, -165, 39, 103, 375, -273, -354, 383, -242, -158, 232, 288, -510, -271, 331, 214, 124, -46, 62, -332, 104, 164, 262, -402, -643, -529, 240, -631, -26, 468, -38, 28, 344, -232, -189, 747, -295, 170, 290, -60, -680, -64, 75, -179, -92, -166, 640, -1, 9, -39, -457, 76, -263, -140, + 30, 69, 137, 362, 83, -103, 729, 69, -181, -674, -98, 480, -107, -314, -411, -369, -310, -203, 516, 193, 27, 279, 430, 233, -98, -84, 442, -97, -142, 122, 337, 41, -358, 73, -42, -531, -47, 403, -194, -240, -64, 491, -398, -105, -241, 204, 113, 524, 59, -479, -11, 137, -10, -220, 213, -164, 430, -328, 298, 630, -163, -171, -140, -134, 575, -421, -450, -353, 139, -184, -286, -137, 214, -284, 169, 38, 234, 330, 53, -41, -50, 326, -70, 117, -384, -1, -127, 320, -408, 351, -131, -213, 365, 610, -324, 178, + -58, 130, -893, -714, -420, 71, -259, 128, 49, -328, -247, 40, 745, 182, -431, -664, -335, -236, 465, -288, -406, 112, 108, -389, -10, 31, -77, 2, 73, 83, 114, 903, 602, -165, 66, 581, -228, 10, 257, 628, 378, -123, -140, -233, 59, -135, 10, 2, 672, 1097, -67, 752, 482, 83, 116, -564, -548, -80, 137, -58, 125, -224, -415, -706, -70, -462, -385, -269, -400, -300, -31, 613, -37, -507, -60, 112, 451, -174, -143, -315, 189, -894, -807, -403, -420, -444, -287, 247, -388, -515, -450, -756, 326, 169, -698, 302, + 596, 1248, 639, -32, 153, -746, -405, 292, 126, -239, -621, 95, -980, -52, 1475, -75, 15, 414, -595, 345, 1033, 1026, -1045, -928, -45, -1010, -440, 29, 73, 409, 524, 533, 843, 238, 302, 382, -202, -38, 45, 142, 210, -455, 1018, 482, 445, -72, 1033, 155, 599, 291, 146, -239, -227, 572, 152, 273, -648, -299, -553, -272, -421, 10, -775, -761, -113, -288, -1523, -1074, -1050, 284, 984, 1372, -832, 944, 1393, 247, 46, -101, 933, 63, 826, 356, 308, -590, -1952, -1417, -377, 182, 38, -155, 780, -207, -1285, -163, 2160, 341, + -353, 499, -132, 308, -126, -278, -654, -311, -34, -166, -292, 450, -411, -537, 7, 26, 484, 147, 162, 136, -142, -51, 700, -393, -749, -214, 107, -324, 589, -347, -148, 405, 167, 290, -779, -980, 341, -240, -277, -458, -449, -1076, 38, -156, 373, -717, -1316, 940, 314, 876, 142, -383, -251, 167, -471, 704, 194, 857, 698, 1309, -98, -1442, -988, -692, 808, 535, -569, 383, 1146, -253, 178, -1124, 1164, 1559, 280, 61, 355, -251, 691, 371, 721, -157, -752, 1666, 13, -644, 79, 1121, 521, 208, -719, 63, -387, -297, 111, -552, + 42, 127, 641, -934, -161, -128, 539, -226, -346, -342, -14, 327, -724, 31, 176, -1479, 187, -416, -1042, 653, -776, -1353, 1738, -36, 80, -162, -513, 1040, -779, -93, 129, -507, -71, 1318, 656, -1204, -1319, 1242, -648, 717, 1166, -1105, -1922, -1290, 2053, -132, -1735, 1414, -1191, -1824, 349, 1490, -1032, -1310, -105, -681, 1077, -163, 274, 803, 451, 625, 1279, 653, -410, 280, 255, 507, -570, 1367, 1150, 236, 344, -237, -84, -1267, 527, -639, 389, 10, -576, 785, -375, -474, 199, -696, 413, 85, -237, 273, 221, 536, 387, 524, 1282, -71, + 50, 501, 826, -25, 142, 70, 620, 931, -391, 277, -150, -69, -1694, 200, 552, -301, -510, 428, -788, -893, -50, 644, 1022, -1403, 416, 28, -212, 128, 365, 1302, -223, -750, 160, 946, -769, -307, 704, -1341, -1070, -6, -1644, -547, -617, 1268, -51, -453, 563, -285, 305, 92, -637, 752, -1694, -150, 87, -412, 295, 83, -343, -53, 35, 430, 11, -487, -1643, -1184, -919, -447, 996, -203, 25, -1632, 109, -114, -233, 50, -1590, 842, -777, 384, -324, 1067, -597, -1048, -510, -19, 772, 1410, 1488, -1859, -1370, -959, 632, 1492, 1828, -345, + -457, -1642, -594, 1401, 888, -60, 15, -89, -1322, 857, -226, 673, 1990, -2422, 2548, 810, -1255, 135, -2194, -1373, 1137, -687, 703, 354, 447, 245, -861, 940, -132, -351, -303, -388, 301, -209, 424, 235, -45, -111, -719, 412, 182, -199, 172, 373, -100, 207, -360, 426, -153, 45, 187, 175, -185, 663, -17, -644, -32, 282, 154, -496, 246, 553, -95, -285, -256, -49, 166, -80, 674, -457, -159, -170, -321, -40, -90, 231, 188, -286, -28, 241, -255, -151, -66, 396, -240, 162, 289, -643, -234, 183, -621, 911, 278, 216, 410, 1581, + 196, -524, -422, -301, -38, -41, 27, -33, -69, -879, 12, -167, -213, 124, -356, -147, 155, -232, 62, 288, -380, 248, -145, -185, -38, -185, 86, -170, -104, -202, -48, 11, -11, -115, -141, 57, 65, -139, 205, -243, -29, -86, -39, -31, -211, 300, 167, -263, 338, -15, 68, -134, 324, -308, 18, 52, 81, -30, -93, 272, -171, 64, 4, -21, 69, -75, -27, 170, -83, -18, 123, -10, -68, -106, 20, 126, -248, -752, -1266, 1412, 4680, 494, 1063, -2540, -3926, -966, -2058, 1607, 3258, 1741, 1075, -228, -1285, -1232, -955, -856, + 296, 575, 307, 618, 64, 65, 222, 85, 254, 231, -176, -581, -458, -510, -728, -359, 385, 536, 946, 1377, 476, 214, -468, -1059, -1058, -709, -521, 121, 384, 594, 598, 537, 333, 59, -58, -324, -255, -132, -189, -47, -211, -35, -248, -204, 64, 4, 279, 511, 268, 743, 613, -269, -594, -488, -817, -120, -198, -119, 299, 116, -288 }, + {-187, 47, -85, -217, -85, 20, -41, 70, -101, -39, -77, -36, 50, -8, -3, -42, 69, -182, 17, -94, 66, 46, -110, 20, -14, 28, -41, 32, -121, -76, 154, -44, -58, -69, -21, -44, -17, -110, -14, 141, -31, 26, -4, -42, 196, -40, 112, 137, -10, -51, -34, -119, -112, -123, -145, -77, -101, 26, -98, -29, -58, -10, 22, -116, 113, 23, 47, 100, -96, 52, 95, -101, 11, 80, 19, 16, -161, -49, 120, 200, 50, 177, 1, -179, -126, -130, -22, -89, 210, -157, -42, -70, -27, -125, 120, -73, + -61, 104, 168, 194, 28, -12, 38, 12, 25, -85, -96, 48, -87, -83, -116, -118, 34, -78, 104, -131, -20, 60, 53, 51, -208, -35, -117, -18, -51, -123, -6, 152, 42, 75, 66, 83, 7, 104, 60, 116, -68, 78, -41, 55, 2, -102, 118, 141, -79, -90, 36, 128, 22, 36, -43, -7, 60, 46, -308, -83, -138, 101, -289, 62, -127, -69, 43, 4, 34, 42, 34, 125, -54, 12, -11, -154, 115, 188, -152, -145, 112, 27, 137, 42, 184, -26, 63, -97, -27, 184, 17, -122, -147, -162, 9, 132, + 70, -2, 154, 120, 7, -125, 197, 49, 153, 151, -24, 96, 118, -15, 71, 78, -72, 15, -20, 74, -167, -110, 59, -106, -37, 146, -55, 80, -30, -229, 43, -2, 123, -177, -89, 77, 22, 197, 203, 93, 150, 121, 204, 237, -90, -23, 77, -232, -10, -75, -47, 110, -139, -13, 171, 35, 109, -52, -42, -56, -223, -33, 13, 120, -37, 204, 77, -32, 78, 45, 101, -71, -17, 238, -33, 225, 102, -94, 21, 199, 100, -125, 176, -45, 10, 13, -38, 38, 18, -157, 101, 79, -16, 10, -38, -141, + -2, 86, -19, -12, -100, -209, -76, 85, 176, -264, -143, 55, -114, 74, -14, 4, -143, -101, -41, 287, 306, -61, -128, -140, 294, -255, 7, -41, -118, -161, 58, -44, -219, -267, 11, -20, -139, 51, 75, -98, -147, -138, 196, -210, -24, -246, 4, 137, 48, 24, -136, -132, 123, -93, -139, 18, -49, 86, 4, 35, -138, -52, -37, 135, 95, 93, -275, 43, 81, 63, 83, -81, -46, 8, 61, 108, -14, 70, -74, 211, -383, 133, 19, -213, 1, 222, -57, -116, -189, -82, 34, -61, 12, 66, 120, -137, + -431, 78, -197, 43, 36, -25, 307, 16, -196, 261, 126, 89, -39, 54, -80, 204, -34, 23, 309, 301, 129, 137, 133, 149, 100, -299, -93, -5, -78, -255, -28, -62, -67, -138, -3, -42, 219, -72, 383, -4, 33, -73, -55, 0, -10, -33, -66, -48, -187, 42, 32, -26, -96, 127, 99, 109, -38, -87, 4, 94, 110, -92, -242, -132, 30, 197, -23, 157, -121, -194, 145, -76, -135, 52, 88, -151, -62, -113, 163, -193, -201, 94, -54, -22, -104, -67, 110, 145, 82, -39, 27, -22, -30, -147, 52, -388, + -107, -127, 110, 126, 15, 60, -234, 60, 41, 59, -211, 400, -14, 70, 58, -198, 35, -282, 182, -65, -226, 40, 23, -123, 17, 18, 187, 319, 147, -75, 112, 126, -299, -122, -134, 75, 76, -61, 55, 95, 75, 124, 264, -8, -86, -42, 0, 183, -131, -19, 104, 240, 18, -192, -133, -44, -155, -51, 38, 233, -396, -110, -146, 169, 7, -83, -509, -68, -67, 211, 507, -146, 341, 58, -296, -305, 56, 78, -171, 192, -134, 155, -187, 93, 69, -180, -148, -115, 65, 199, -253, 11, -266, -14, -97, 68, + 204, 22, -79, -74, 221, 1, 334, 102, -115, -117, -86, 49, 214, -2, 350, -603, -435, -359, -72, -306, 33, -115, 123, 275, 64, 114, 192, 290, 167, 43, -181, -501, -502, 270, 39, 329, -208, -181, 167, -311, 19, 253, 92, -178, -18, 470, 374, -22, -348, -551, -77, -185, 189, -156, -179, -625, -287, -558, 198, -5, -152, 166, -33, 17, 29, -170, 4, -197, -50, 142, 83, -201, 65, 234, 345, -40, -62, -105, 8, 200, 252, -23, 27, -42, -58, 329, 216, 24, 224, 83, -301, 70, -41, 389, 134, 62, + 169, 258, 55, -198, -376, -69, 65, 211, 89, 28, 66, 305, 53, 110, 122, 94, -181, -167, -175, -169, -184, 284, -51, 178, 803, 172, -244, 139, -141, -479, -93, -470, -253, 237, 324, 120, 69, 23, 62, 300, -213, 426, -276, -289, 347, 147, -552, 237, 145, 170, 369, 174, 275, -25, 150, -93, 235, 54, 53, 148, -310, -177, -93, 193, 90, 64, 162, 38, 59, -291, 5, 297, -53, 29, 40, 30, 368, 132, 494, 104, -70, 458, -402, -62, -64, -171, -38, 88, 463, 35, -100, -189, 95, -193, -74, -118, + -229, -14, 49, 349, -94, -335, -303, -429, -175, -422, 299, -358, -290, -205, 184, 516, -523, -165, -587, 179, 65, 69, -180, 61, 629, -321, -72, 260, 151, 144, 211, 167, -228, -341, -83, -181, -286, -313, -11, -60, 65, 444, 253, -221, -146, -8, -141, 123, 792, -255, 546, 197, 76, -16, -111, 117, -330, 171, 420, 42, 49, 376, 206, 162, -320, 275, -202, -235, -742, -193, 436, -230, 88, -461, 319, -149, -224, 346, -513, -234, 352, -263, -368, 47, -317, -247, -27, 361, -169, 639, 608, 111, 198, -358, 48, -291, + 456, -99, 138, -225, -135, 67, 65, -217, 350, -108, 77, 118, -223, 75, -286, -10, 168, 185, 8, 248, 332, -38, -613, -118, -179, 427, -369, -478, -327, -237, 67, -279, -202, -149, -34, 63, -899, 552, 449, 631, -202, 83, 442, -439, -379, 53, 291, 162, -41, 61, -218, -301, -336, -135, 1213, 58, -633, -152, -332, 166, 176, -417, 218, -97, -191, -325, -681, 72, -571, 281, 73, -427, 236, 310, 389, 138, 145, -441, -23, -70, 418, 224, 6, 427, 437, -30, -227, 76, 543, -335, -297, 312, 145, -340, -92, -311, + 624, -512, 141, 367, -213, 341, 103, -123, -173, -134, -266, 389, 470, 130, -374, 74, -412, -117, 257, -11, -208, -108, 61, -497, 10, -13, -317, 465, -420, 19, -102, -257, 318, 26, 179, -101, -42, 38, -214, 188, -185, 12, -184, 429, 14, -189, -116, 613, -10, -410, -223, 293, 391, 485, -17, -75, 605, 309, 675, 117, 27, -311, -174, -172, 155, 133, 349, -409, -5, -232, 200, -351, 109, 452, -99, 17, -257, 89, -259, -727, 67, -87, 15, -309, -113, 325, 533, -30, -248, 362, 116, 111, 352, 167, -252, -70, + 211, -5, 188, -247, -292, 116, -279, -413, -254, -474, -163, 202, -449, -24, -511, -165, -59, 216, -601, 275, -21, -271, 330, -74, -28, 733, 627, 294, 281, 448, 8, 971, 1126, 55, 366, 340, -40, -809, -13, -34, -297, 226, 221, -439, 250, 307, 63, -116, 180, -110, 584, -96, -253, 7, 145, -50, -22, -6, -892, 268, -3, -622, -241, 115, -38, -421, 171, -498, -22, 59, -787, -136, 374, -250, 66, 522, 343, 403, 153, -208, -345, 403, -165, 232, -322, -174, 299, 452, 108, 538, -303, 468, -332, -448, -274, 466, + 535, -424, 291, -1165, -35, 327, 182, -204, -343, 95, -435, -135, -856, 36, 1124, -770, -41, -94, 87, -323, 168, -498, -451, -189, -103, 84, -93, 218, -332, -20, 731, -610, -484, -156, 643, 53, -747, 296, -261, -364, 102, 1027, -572, -367, 780, 525, 73, -348, 45, -152, -216, 180, 221, -165, -588, 748, 392, 111, -809, -165, 282, 251, -81, 400, -48, 110, -168, -542, 351, -398, 238, 71, -415, 789, 152, 557, 626, 63, -878, -219, 32, -399, -142, -10, 21, 274, 662, -333, 113, 324, 65, -332, -1556, 86, -393, 37, + 808, 58, -133, 126, 49, -552, -558, -537, -480, 632, -111, 758, 88, -750, -7, 63, 647, 106, -83, -142, 198, -412, -132, 676, -122, -918, -669, 394, -70, -204, 226, -81, -446, 124, 292, 609, -106, -534, 27, -669, 271, 725, -99, -924, 306, -24, 70, 206, -267, 547, 61, -388, 312, -214, -108, 791, -392, -145, -118, 498, 217, -880, 454, -677, -154, -365, 74, -171, -105, -55, 111, -783, 172, 1255, 843, 365, -614, 460, 615, 872, 445, 93, 50, 543, 975, -225, -96, 532, -1047, 381, 977, -206, -307, 241, 766, 591, + -374, -689, -13, 339, -88, 79, 40, 798, -427, 511, 807, -312, -61, 547, -47, 1920, -769, 347, 1351, -754, 288, 91, -1022, -28, 243, -464, 1089, 86, -95, 90, -382, 1438, 448, -1132, 1161, -448, 103, 354, 476, 751, 427, -181, -642, -932, -277, -368, 24, -219, 629, -258, -273, 98, 241, 189, 329, -1492, 874, 24, 534, 842, -1404, 308, 743, 149, 557, -562, 612, 158, -542, -9, -337, -1054, 581, 306, 960, -543, -684, -261, 234, -163, -1166, -599, 372, -106, 186, -515, -144, 372, -323, -185, -494, -137, 191, -576, 66, -1235, + -993, 289, -1033, 70, -1082, -783, -521, 491, 1020, 1231, -294, 536, 681, 308, 295, -505, 1390, 1398, -966, 949, -764, 470, 992, 935, 1145, 1363, 950, -1082, -768, -28, 6, 280, -143, -248, -736, -299, 1827, -1338, -681, 720, -430, 687, -539, -602, 200, -1420, -67, 947, -234, 483, -816, -206, -326, 25, 1009, 299, 219, -191, 550, 169, 1380, 330, 801, 45, -642, -613, 796, -408, 362, -25, -1052, 733, -940, 1783, -1357, 799, 721, -795, -663, -505, 650, -79, 680, -39, 74, -1266, -680, 251, -625, 161, -389, 319, 185, 899, -584, -244, + -263, -519, 1259, 178, 96, -1261, -409, 570, 359, 331, 1045, 630, 825, 899, 30, 370, -317, 551, 165, -2721, 1880, -1152, -869, 58, 356, 533, 51, -404, 1455, 796, 169, -709, 450, 13, 516, -675, -534, 421, 1075, -1241, 10, 455, 92, -274, -234, -119, 5, -22, 241, 1449, 42, -591, 896, -176, -967, -1134, 1071, 416, -213, 469, 201, 986, -1330, -81, -709, -128, 658, -478, 212, -557, 223, 2005, 68, -1045, -1331, -7, 504, 657, -595, 200, 841, -310, -1941, 1139, -754, -933, 315, 1835, -1331, 972, 946, 511, -1024, -488, -427, 1582, + 522, 103, -116, 249, 445, -145, 207, -244, -4, -194, 742, -840, -97, 493, -1163, 369, -287, 80, -141, -333, 202, -98, -479, 1262, -977, -283, 895, -589, -96, -194, 190, 880, 60, -884, 1184, -659, 415, 730, 320, -293, 53, -672, 147, -414, -326, 1579, -386, -656, 193, -318, 363, -270, 400, 1007, -584, 317, 766, -947, 404, 476, 209, 602, -740, -218, 1078, -788, -191, 277, -321, 974, -977, 103, 213, -265, 295, 128, -656, -925, -2393, -3835, 349, 3574, 288, 8154, 8469, 4142, 8852, 5829, -1279, -239, -2017, -7254, -6334, -4007, -7375, -5856, + -1765, -3744, -3114, 879, 1660, -1063, 321, 1388, -1401, -955, 2067, 1751, 27, 1973, 3601, 994, 2526, 4925, 2250, 997, 4400, 3564, 213, 2437, 5157, 691, 939, 4009, 1528, -933, 2720, 2473, -723, 2095, 2891, -613, -2993, -1748, -6362, -10216, -9119, -9759, -14523, -13193, -12367, -14964, -14507, -12065, -10847, -9824, -5856, -2557, 1116, 2762, 6029, 8649, 7897, 7723, 9552, 4932, 311 } + }, + { + {-185, -286, 6, -159, -35, -110, 91, -171, 9, 66, -56, 52, -13, -16, 24, 24, 53, -81, -17, -55, -139, -1, 43, 11, -58, 106, 40, -34, 39, 9, -60, 35, -19, -68, -74, -35, -13, -36, 72, 132, -11, 200, 34, -151, 56, -25, -114, 14, -109, 124, 29, -97, 50, -56, 43, 63, 32, 29, -20, 56, -90, 50, -38, -38, -23, -45, -160, -29, 91, -53, 64, 32, -37, 15, -2, 27, 60, -12, 51, 195, -96, 53, -19, 10, 11, -81, -88, 58, -14, -74, -90, -58, 84, -9, 112, 22, + -136, -144, -99, 41, 39, 74, -8, 85, -62, -13, -147, -23, -24, 31, 61, 57, 115, -55, -70, 60, 39, -73, -69, 4, 57, 25, 129, -47, -33, 140, 49, 262, 118, -73, 5, -161, 11, -184, -4, -68, 136, 14, 78, 93, 61, 89, 71, 12, -142, -19, -64, 101, 164, -107, -57, -50, -26, -67, -307, -333, -24, -97, 15, -74, -18, 182, -31, 96, -44, -91, -121, 20, -24, -149, 170, 48, 13, 87, 87, 136, 99, -12, -102, 93, 23, -142, -61, -66, -41, 121, -42, -216, -72, -28, 44, -69, + -138, 1, -14, 157, 23, -5, 58, -7, 215, -41, 19, -51, -88, -3, 91, 39, 23, 85, -83, -137, -99, -22, 14, -34, -1, -103, -28, 51, -39, 104, 47, -6, 10, -89, -85, 134, 16, 53, 31, -23, 40, 219, -18, 115, 58, 151, 173, -36, 7, 115, 102, 77, 197, 45, -75, 12, 171, 66, 76, 159, 200, 141, -57, -141, 91, 71, -94, -137, -4, -80, 25, 54, -63, -69, 57, 55, 111, -83, -182, -85, -87, -113, -54, -130, 62, -177, 60, 13, 24, -81, 151, 125, -137, 145, 37, -25, + 29, -111, -54, 96, 15, 37, 4, 115, 26, 143, -97, -15, -34, 51, 58, -34, 22, -71, 16, 47, 22, 578, 18, 511, 55, 319, -58, -70, 104, -261, 284, -167, 195, 121, -85, 66, 7, -3, -32, 63, 121, 120, 233, 41, 84, -21, 272, -308, 22, -35, 85, 113, -141, 47, 85, 24, 118, 44, -105, 45, 246, -55, 86, -51, -20, -23, -149, 243, 12, 13, 207, -39, 31, 225, -331, 84, 10, 92, 297, 72, 85, 86, -13, -90, -35, 58, 44, 140, -36, 112, 75, -52, 52, -107, -45, -2, + -233, -293, -112, -47, -106, 229, 102, -189, 210, -33, -149, 41, 92, -88, -136, -128, -260, -137, 115, -171, -265, 71, 109, 17, -97, 195, 26, 179, -10, -48, 106, 169, -248, -124, 68, -62, 61, -169, -12, 38, 59, -145, -252, -78, 74, -50, -32, 8, 81, -32, 45, -93, 146, -200, -145, -58, -142, -50, -40, 48, -105, 69, 157, -23, 35, 34, 73, 146, -61, -38, -31, -71, 147, -59, -259, -145, -83, -74, -249, -600, -48, 35, 14, -198, -77, -224, -48, -263, -287, -235, -44, -157, -323, -212, 79, 100, + -82, 197, 122, -77, 258, 51, 32, 38, -326, -14, 69, 126, -93, -95, 215, 391, -280, 105, -72, -15, -244, -22, 12, -131, -151, -120, -126, -74, 101, 290, -117, 111, 213, 179, -41, 23, -44, -52, -245, -127, 171, -91, 54, -86, 99, 47, -6, -4, -99, -95, 47, -34, 72, -282, -276, -23, -14, -154, -356, -86, -431, -113, -301, -50, 73, 68, 356, -226, 90, 80, -171, -96, 289, 17, -66, 23, -212, 194, -276, -108, 144, 69, -16, 38, -43, 84, -109, -229, 30, 94, 101, -185, 63, 186, -187, -266, + 219, -184, 148, -135, 89, -15, -166, -245, -130, 55, 6, 79, -108, -129, -286, 149, -201, -106, 132, 260, -20, -62, -380, -316, -90, -115, 162, -45, -218, -39, 24, -127, -18, -267, 172, 61, 198, 276, 135, 13, 101, 226, 107, 643, 300, 419, -136, -10, -16, -623, 24, 277, -134, -43, 11, 401, -78, 234, -58, 224, 109, 275, 369, 52, 242, -76, 207, -27, 394, 219, -21, 234, 173, -67, 164, 109, 139, -122, -115, -330, -38, 234, 27, 29, -96, -125, -118, -110, 554, -371, 125, 172, 77, 47, -244, -297, + -100, -47, -40, -511, -279, -265, -17, -16, 120, -20, 101, 177, 288, 58, -120, 107, -229, 42, -157, 86, 8, 42, 61, -103, 956, 124, 127, 129, -79, -376, 250, 302, -175, 144, 110, -216, -50, 254, 117, -395, 91, -90, -229, 20, 108, 59, -18, 18, 167, -30, 89, -299, 118, -6, 116, 102, -71, 261, -328, -108, -324, 303, 119, 475, 211, 29, 87, -329, -11, 137, 108, 142, 17, 96, -102, 136, 315, 464, 182, -162, -112, -10, -87, 195, 216, -116, 130, 276, 77, -297, -649, -288, 136, 315, -106, 108, + -29, -25, 16, 268, 83, -129, 231, -568, 150, 314, -350, 237, 320, -822, 154, 67, 157, -287, 451, -641, -36, -17, -85, -38, -226, -223, -72, 273, -6, 38, -159, 202, -57, -51, 97, 330, -228, 247, -71, 163, 33, 235, 277, -37, 49, -366, -234, -48, -185, -329, 5, -97, -272, 386, -363, -72, -191, -140, 203, -233, 115, -56, 207, -89, 229, -314, -142, 88, 284, -530, -261, 67, -46, -54, 178, -242, -620, 181, -534, 285, -268, 99, -467, -132, 310, -448, -183, 550, 29, -467, 438, -210, 34, -487, 79, 181, + -418, -112, -373, -12, 28, -137, -101, 358, 60, -261, 66, -547, 325, 498, -162, 200, 364, -41, -71, 30, 46, 197, 39, 33, 114, -316, -19, -362, -349, -163, 150, 188, -9, -435, 84, 85, 206, 417, -450, 638, -547, -4, -107, -126, -262, -544, -683, -303, -73, 136, -45, -15, 111, -54, 499, 176, -478, -137, 16, 242, -299, -59, -531, -30, 467, -399, -70, -334, -299, -562, 674, 309, -353, 462, 433, 651, -250, -205, 449, -54, -107, 176, 191, 96, 83, -618, -83, 16, -11, 49, -88, 283, 504, 67, 19, 5, + 8, 493, 110, -20, -122, 137, 88, -61, 37, -260, -75, 431, -433, -187, -376, 480, -446, 229, -195, 152, -113, 126, -364, 94, 497, -325, 5, -888, -63, -303, 1, -825, -62, -24, -286, -163, 663, -720, 94, -177, -303, 220, -278, -516, -412, 96, 12, 195, -335, -79, 555, 227, -99, 150, -312, -280, -272, 589, -525, -600, 279, -555, 196, 51, 139, -231, -82, -287, -153, -214, 99, 321, 182, -438, 529, 100, 174, 85, 246, -21, 236, 99, -130, 200, 42, 254, 131, -316, 128, -62, 85, -28, -149, -64, -266, 281, + 234, 311, -65, 531, 556, 284, 59, 317, 576, 353, 629, 479, 464, -449, -539, 179, -125, -62, 19, -178, 190, 252, 67, 585, -152, -185, -304, -77, 10, 18, -767, -146, -295, 476, 314, -1023, -766, -230, -15, 347, -146, -17, -824, 124, -433, 315, -63, 415, -351, -78, -416, 81, 335, -152, 96, -227, 16, -544, -155, -16, 39, 421, 534, 29, -489, -334, -157, 61, -128, 168, -561, -164, -74, -135, -312, -63, -140, 394, 563, 386, 145, 240, 243, -258, 942, 575, -722, -626, 698, -529, -294, 113, 94, -515, 527, 36, + -1551, 423, 1021, -689, 717, 892, -258, -122, 518, -547, -290, 155, -242, -282, 318, -470, -302, -223, 356, 188, 239, -76, -315, -287, 327, -272, -9, 69, -455, 280, 261, -215, -142, -392, 20, -254, 325, -542, 47, 168, -20, -274, -526, -151, -226, -84, -407, 527, -545, 61, -197, 105, -776, 764, 152, 41, -322, 143, 128, -6, 69, -185, -618, -150, -272, -439, -535, -237, -143, -573, -213, -76, 348, 113, -489, -469, 236, -167, -622, -320, 125, 434, 468, 433, 765, -216, -544, -549, -37, 205, 501, 169, 44, -553, 342, 1033, + -913, 5, -381, -437, -308, 491, -278, -240, 209, 625, 347, -410, 262, -431, 318, 54, -76, -189, -370, -243, 37, 102, -571, 387, 37, -10, -228, -193, 371, -492, -43, 622, 665, -570, -57, -79, -412, -469, 546, 172, 342, -65, 31, -2, 343, -91, 9, -392, 622, 574, -777, -891, -206, 61, -314, 82, -233, 123, -478, 556, -613, -487, -197, 139, 431, -171, 616, 105, -207, -125, -147, -319, 315, 319, -101, 16, -1317, 1971, -1341, -393, 406, 1048, 927, -366, -310, 19, 95, 522, 252, -780, 268, -198, -214, 35, 351, -41, + -508, -527, 309, 177, 394, -223, 476, 65, 551, -86, -118, 335, 9, -428, 124, 426, 36, -556, 317, 579, -504, 191, -544, 209, -701, -527, 902, 754, 432, 992, -130, 1192, 521, 443, 724, -1129, 1002, 292, 451, 404, 181, -561, 170, 1006, 1257, -37, -1236, 624, 129, 248, 64, 23, -130, -932, 206, -122, 301, -214, 546, 1361, -80, -1552, -831, -901, -387, 39, 492, -1319, -333, 243, -660, -693, -690, -692, -148, 829, 379, -285, 352, 189, -397, 444, -494, -71, 161, 304, -950, 492, -484, 294, -213, -705, 171, 260, 80, 152, + -341, -1016, 7, 247, 193, 41, 94, -404, -42, -8, 912, -117, -1600, -677, -208, -1270, 257, -368, -371, -598, -321, -907, -957, -1098, -154, 1206, 120, -728, 303, 31, -124, -402, -622, 259, 396, 349, 216, -122, -769, -299, -509, -19, 847, -72, 673, 940, -798, -929, -1043, 301, 326, -1354, -832, 64, 10, 455, -1644, 211, 344, 1159, -1323, 193, 183, -120, 685, -368, 1222, -25, 81, 423, 457, -426, -1039, 637, 683, 215, 872, 227, -145, -283, -795, 1238, -562, 1179, 409, -21, 296, -409, 569, 666, -455, 517, 188, -1099, 815, 953, + -155, -513, 65, 63, -15, -113, 1557, 78, -1002, -408, 111, -1224, -1858, 390, 2098, 647, -284, -1141, -477, -53, 1163, -394, -926, -1758, -224, -2201, 632, 1078, -1434, -115, 787, -331, -653, 584, -631, -327, 34, -455, 736, -244, -358, -123, 381, 1365, -228, -620, -716, 257, 632, 392, -636, -95, 720, 21, -578, 185, -519, 1253, -588, -1365, 449, -235, 629, -920, -919, 891, -94, -1179, -642, -1129, 1420, 678, 367, -1541, 249, 604, -1089, 35, -787, -613, 577, -553, 666, -469, -941, -258, -242, -195, 310, 44, -581, 1719, -214, 696, 812, 375, + -188, 36, -263, 589, 297, -432, 201, 756, 1567, 365, 659, -23, 133, 291, -619, 294, 525, 43, -706, -322, -532, -166, -706, -611, 47, -479, 726, 285, -210, -511, -297, -141, 377, -86, -668, -485, 101, 177, 333, 179, -171, 210, -585, -1648, 41, 2092, -90, -1449, -271, 1018, 243, 201, -56, -604, -833, -439, 157, -6, -772, 319, -1527, -225, 1366, 453, 1764, -191, -727, -169, -179, 521, 84, 29, -994, -451, -481, -27, 1104, -120, -264, 390, 438, 15, -601, -648, -702, -2382, -3648, 831, 3257, 992, 7975, 7482, 3320, 7705, 3239, -1476, + -73, -2411, -6440, -3571, -3410, -6638, -4842, -2844, -4213, -2892, 502, -371, -1432, 1423, 1338, -156, 1432, 4084, 1633, 620, 3900, 3445, 1044, 4131, 5117, -228, 2938, 5116, 1800, 1882, 5205, 2981, -695, 3964, 2705, -1466, 1370, 3056, -1842, -3043, -961, -6063, -9924, -9645, -10680, -16852, -14645, -12186, -15663, -13526, -8896, -10475, -8153, -2663, -1230, 2681, 5457, 9261, 12397, 13584, 15587, 16298, 15109, 14338, 12881, 8018, 5666, 3416 }, + {-175, -281, -21, -287, -159, -55, -49, -8, -68, -13, 63, -75, 87, 11, -117, 73, -20, 78, 12, -111, 79, 43, 62, -48, -71, -51, -59, 47, -9, 13, -64, 46, -78, -107, 6, -133, -99, -51, 143, 18, 55, -173, 26, 30, -148, 53, 12, -155, -28, -11, -120, 138, -86, -50, 82, -6, -145, -14, -100, 114, 99, -139, -72, -92, -62, -38, 61, 54, 35, 96, 1, 40, -16, -34, -42, 46, 41, 18, -23, 346, -175, 19, -107, -2, 138, 74, 84, -74, 106, -111, 119, 68, 145, 69, -35, -166, + 177, 131, 40, 26, 10, -68, -90, 99, 51, 66, 84, -89, -15, 90, 94, -9, -84, -140, -8, 31, -95, 36, 15, -126, -79, -7, 57, 5, -72, 124, 13, -38, -99, -17, 1, -167, 68, 108, -69, 138, 101, -16, 81, 56, 169, 58, 23, -27, 56, -144, 7, 69, -79, 76, 74, 102, 54, 122, -328, -221, -37, -141, -129, 66, -189, -173, 46, -76, -77, 78, -63, -121, -19, -5, -40, -53, -39, -140, -14, -100, -80, 1, 124, -24, 181, -92, 107, 133, -150, 55, -42, 32, -108, 55, 61, 104, + -57, -117, -48, -62, 33, 51, -153, -14, -107, -77, 21, -116, -199, -32, 183, 46, 60, 15, 36, 31, 62, 79, 204, 21, -102, -117, -35, -52, -25, -239, 41, -10, 65, -25, 15, -32, -48, 214, 4, 150, 18, 262, 304, 232, 174, 244, 100, 106, -22, 69, 259, 27, 80, -97, -63, 197, -132, -243, 74, -203, 175, 40, 210, -68, -12, -52, 70, 83, -2, -207, -41, 175, -116, 79, 48, -41, -50, 195, 149, 341, 138, 27, 83, -30, 22, 107, 66, 290, -123, -84, 22, 74, -44, 134, -124, 25, + -6, -99, 33, 27, -128, -180, -107, 139, 72, -2, -7, 103, 12, 31, 184, 86, -39, -34, 133, -139, 39, 573, -13, 282, -53, -42, 297, -292, -105, -21, 145, 105, -66, 59, 24, -264, 64, 144, 123, -296, -109, 35, -218, -57, 12, 11, 25, -32, 132, -95, 104, 224, 218, -64, -133, -22, 246, -14, -19, 2, 19, -130, 16, 106, 10, 25, 95, -67, 61, 40, -35, 177, 10, 140, 20, -48, 53, 93, 73, -5, -147, -127, -175, -75, -15, -1, -29, 123, 96, -81, -170, 5, 68, 88, -98, -27, + -153, -426, -111, -144, 28, 71, -72, -85, -803, 16, 258, -187, -300, 225, -339, -51, -152, -178, -110, -112, 13, 137, -24, 77, -86, 104, -78, -121, 55, -45, -190, -244, 119, 13, 118, 37, 261, 38, 92, -123, -213, -61, -104, 216, -97, 7, 60, -106, 305, 201, 9, -239, -300, -102, 107, -274, -1, -133, -255, 25, -402, -91, -36, -153, 284, -18, -34, -6, 181, 213, 75, -213, -55, -68, 108, 20, 65, 181, -470, -666, 72, -144, 140, -179, -348, 19, 298, 73, 179, 162, 106, 86, -119, 93, 194, -311, + -162, -96, -83, 129, -37, 52, 203, 197, -86, -170, 32, -90, -88, -164, -133, -256, 54, -88, -12, 251, -58, 58, 53, -158, 133, 155, 188, -160, 303, -37, -240, -179, -262, 249, -99, -251, 70, -25, -199, 217, 256, -75, -237, 185, 39, 150, -34, 382, 195, -186, -122, -68, -97, 148, 133, 228, 1, 121, -626, -7, -109, 36, 5, 232, 181, 241, -34, 331, -150, 223, 287, 45, 286, 54, 79, -85, -22, -124, 228, -20, -19, 306, 195, -3, 91, -33, -4, 197, -109, -207, 7, -34, 110, -575, 349, 362, + 153, 65, 17, -187, -372, 244, -145, -179, -108, 218, -150, 132, 149, -142, -81, -335, 160, -220, 136, 14, 123, 191, 328, 128, -136, -358, -50, 205, 363, 252, -38, -76, -199, -355, -17, 206, 127, 69, 4, 203, 36, 61, 241, 826, 451, -41, 79, 72, 182, 326, -46, 63, 552, 55, -25, 331, 231, -233, 135, 30, 220, 149, -387, 288, -181, -30, 29, 224, 37, 56, 169, 194, -196, 198, 605, -115, 271, 278, -160, 216, 51, -156, -168, 99, -152, -390, -60, -29, 28, -498, -131, 137, -321, -220, -522, 154, + 218, -361, -140, -183, 348, -8, -229, -165, -255, 98, 285, -238, 94, -112, 118, 315, 118, 232, 243, 285, 28, -164, -90, 25, 832, 246, 17, -30, -140, 24, 142, -85, -214, -272, 5, 227, -276, 146, 153, -54, 557, 222, -160, -79, -60, 226, -102, -172, -227, 152, -476, 36, -146, -148, 130, 53, -185, -84, -179, 250, -93, -344, -61, 29, 10, -191, -314, 49, -72, -20, 84, -42, 261, 78, 149, -157, 388, 139, -220, 290, 495, -125, -143, 284, 225, 123, 131, -294, -101, -319, 84, 344, 128, -370, -99, 151, + -379, -527, -62, 14, 69, 370, 59, -652, 303, 884, -368, 623, -146, -125, -200, -310, 229, 17, 154, 167, -582, 16, 261, -225, -130, -354, 635, -391, 310, 308, -389, -148, -140, 279, -312, -115, 304, -44, -90, -141, 373, 77, -68, -145, 4, -278, 307, -26, 138, 792, 517, -437, -324, 134, -47, 339, -186, -251, -100, -477, -196, -45, -382, -201, 827, 213, -3, -26, -16, 261, 288, -46, 285, 40, -166, 49, -442, -7, -375, -171, 198, 306, -397, 208, -103, -691, 112, 656, -178, -157, 133, -193, -171, 192, -30, -27, + -13, -430, 741, -783, -81, -8, 268, 175, 6, -290, -220, 107, 581, -35, -260, -163, -416, -15, -244, -180, -86, 144, -14, 34, -280, 72, 81, 195, 152, 197, -377, 18, -74, 267, 68, 525, 116, -99, 52, -257, 7, 241, 296, -416, -326, -12, 468, -690, 203, 840, 470, -200, 98, -423, 212, 423, -664, 166, -300, -75, -845, 3, -306, 237, 112, -270, 141, 112, -185, -536, 844, 241, 444, -500, -554, -105, 151, -158, -72, 279, 80, 85, 251, -620, -66, 5, 158, -433, 57, 70, -299, -169, -412, -313, -3, 129, + -334, 21, -152, -300, 113, -5, 234, -659, -687, 137, -63, 252, 569, 59, -366, 507, -262, -487, -378, -164, 33, -517, -207, 497, 673, 282, 180, 137, -92, 429, 231, -512, -293, -2, 32, 472, 285, 73, -98, -59, -264, 313, 201, 525, 91, 135, 36, 735, 14, 254, 562, 42, 700, -21, -329, -351, -667, 125, -284, -14, 52, 243, 343, 591, 604, -89, 538, -34, -49, 211, 455, 205, 127, -719, -372, -582, 300, 599, 117, -247, 415, 601, -76, 101, -134, 508, 427, 367, -204, -367, -52, -88, -827, 156, 125, 85, + -200, -100, -918, -319, -831, -138, -616, -319, 633, 172, 667, 52, -501, -248, -519, -1040, 181, -643, -151, 623, 302, 242, 102, -115, 29, 112, -312, 252, -468, -608, 14, -72, -311, 327, 670, 576, 628, -364, -623, 478, -281, 494, 153, -805, 205, 144, -897, 478, -406, -426, 250, 267, 48, 318, 30, 8, -206, -131, 203, -135, -303, 10, -574, 199, -731, -461, 35, 280, -93, -320, 123, 216, 182, -3, 605, -1385, -299, -394, -442, 571, -465, -88, -1088, -334, -115, 30, 755, -208, 113, -478, 395, -589, -332, 245, -1251, 140, + 718, 836, 719, 368, 1043, 474, 48, -327, -188, -439, -640, -234, 243, -1209, -617, -739, -1176, 5, 192, 826, -271, 384, 343, 186, 186, -1281, 1010, 555, 1251, 464, -57, -463, -299, -289, -457, 327, 236, -459, -528, 280, 374, 658, 181, -404, -611, 131, 100, 44, 70, 1165, 391, 224, 380, 423, 470, 12, -743, 521, 1619, -165, -456, -986, -216, 1309, 149, 542, 178, -1811, 370, 325, 34, 185, -131, 26, 363, -975, -409, 823, 302, 110, -740, 520, 191, -663, -711, -470, 619, 1242, 1119, 1163, 1001, 33, -229, -353, 591, 1173, + -2388, -857, 198, -1414, -1276, -569, -772, 76, -566, 1508, -153, -552, -210, -1178, -314, -954, -383, 149, -1204, -219, 946, -803, -219, 254, 3, 374, 90, -17, 357, 110, -594, -133, 543, -293, -743, -269, -902, -472, -1585, 130, -1076, 497, 202, -426, -1395, 100, -141, 1699, 698, -2, 950, 372, 20, 725, -888, -471, 81, 629, -730, -502, 2527, -293, 1321, -1074, 21, -790, 566, -320, 850, 1163, 65, -969, 685, -1197, 209, -349, -928, 1895, -1098, 712, 592, -951, 513, 319, 189, -149, 719, 407, -962, 693, 756, 177, 112, 496, -32, -910, + 1198, -668, 256, -490, -138, 181, -247, 1020, 204, -102, -256, -23, 177, -979, 303, -493, -370, -211, -18, -464, -251, 153, 1033, 44, -234, -634, 265, 219, 18, 849, -210, -48, 957, 342, 46, -896, -498, 641, 328, -833, 20, -1946, -991, 1825, -423, 1006, 1258, 395, 204, 585, -244, -643, 311, 181, -175, 769, 248, -352, -918, 1124, -391, -1715, 238, -154, 547, 246, -669, 371, 299, -630, -823, -448, -1329, -1211, 799, -147, -1376, -345, 58, 485, 335, -745, -945, 138, 1122, -523, 381, -757, 201, -861, 506, 679, -539, -889, -741, -53, + 271, -352, -367, -284, -1301, -982, 433, -816, -290, 362, -834, -1104, 319, 663, -206, -1340, 489, 605, 1622, 67, 313, 407, -910, 351, -402, -1456, -414, 1005, 28, -686, -2114, 1297, 1257, -279, 933, 1427, -200, 275, 463, -313, -103, 1864, 664, -128, 363, -772, -2556, 715, -314, 1924, -671, -384, -779, -2134, 973, -1228, -755, 74, -18, 1708, -1210, -799, 1089, 696, 563, -167, 539, -345, -560, -463, 1284, 1119, 1671, -487, -631, 79, -113, 667, -1011, 269, -1062, 622, 1046, 414, -853, 643, -750, 1762, 875, 303, 240, -199, -1323, 821, -1798, 446, + 356, 955, 723, -1492, 495, -912, -559, 504, -128, 664, 405, -1349, 616, 1394, 1753, -393, 508, -680, 1241, -1430, 204, -60, -231, 427, 1672, -1888, 1319, -83, -157, 574, 294, 665, 54, 378, -803, 768, 78, -610, 378, -179, -116, 754, 270, -910, 465, -374, 740, -509, 106, -206, 285, -191, 71, -336, 862, 26, -85, 403, 213, -378, -217, 339, 209, 415, -461, 244, -106, -866, -204, 382, 239, 287, 106, -758, 12, 83, -44, 344, -314, 338, 6, 233, -363, -45, -223, 1192, -523, 377, 212, -34, 182, -217, 149, 398, -497, -154, + -10, 72, -158, 1, -593, 281, -13, 235, 1581, -114, -513, -781, -356, -439, 573, 332, -419, 34, 48, 187, 24, 397, 135, 312, -110, -13, -97, 145, 337, -317, -5, -158, 8, 412, -238, 38, -110, 160, 80, -230, -88, 240, -79, 393, 278, -419, 128, 83, 212, 87, -397, 260, -79, 252, 200, -474, 122, -5, 99, -59, -212, 326, -89, 143, 1, -109, 147, -208, -36, 268, -199, -240, 456, -311, 424, -57, -355, 690, -645, 529, -198, -308, 314, -338, -783, -1322, 1670, 4814, 752, 474, -3524, -4340, -1401, -847, 2931, 4490, + 2298, 676, -1516, -3233, -2965, -2469, 187, 3721, 3098, 1790, 597, -1582, -2071, -1630, -1591, -550, 742, 1039, 2123, 1534, 361, -509, -313, -1710, -844, -861, -1186, 708, 1311, 771, 1911, 518, -465, -729, -1284, -1000, -167, -304, 383, 803, 700, 515, 336, -166, -711, -487, -592, 197, 670, 233, 157, -286, -621, -104, -12, 2, 476, 441, 455, 186, -182, -490, -592, -423, -272, 507, 541, 226 } + }, + { + {-153, -162, -205, -250, -190, -112, -17, -101, 76, -16, -24, 41, 85, 0, -56, -59, -98, 16, -89, 159, 172, -69, 6, 53, -45, 134, -50, -56, 6, -10, 118, 98, 44, 25, -111, -49, 132, -35, 37, -25, -61, -77, -82, 72, 0, 16, 28, -35, 39, 86, -155, -35, 63, 17, 64, -6, -142, -49, 82, -86, -7, 65, -52, -11, -23, -81, -20, -63, -26, 11, -38, 9, 15, -7, -17, -14, -71, -31, -87, 333, 39, 90, 32, 47, -80, -202, -39, 106, 38, -101, -14, 81, -21, -121, 36, -139, + -86, -5, 38, -40, -32, 85, -120, -4, 15, 57, 45, 43, 145, 64, -182, -48, -83, 21, -6, -15, -115, -151, 197, -93, 47, 55, 48, -190, -108, -52, 19, -17, -7, -20, 30, 69, -100, -3, 51, 58, 71, 23, -1, 67, 23, -35, -11, 111, -88, -94, -51, -40, 90, 45, 20, -37, 72, -50, 29, -47, -15, -191, -113, 80, -184, -263, 53, 22, 34, 38, 39, -226, -35, 65, -141, 150, 148, 125, -49, 12, 36, 96, 24, -3, 22, -65, 63, -23, -21, -30, 188, -109, 67, -68, -57, -61, + 53, 103, -105, -52, -55, 77, 74, 115, 81, 18, 103, -81, 64, 26, 31, 211, 54, 106, -165, -42, 76, -80, 86, -32, -56, 28, 131, 90, 64, -24, 33, 99, -104, 152, -12, 124, -43, 101, 113, 106, -49, -111, -153, -45, 312, 236, 181, 163, 170, 81, -20, 3, -72, -12, 226, -94, -110, 167, 113, 161, -113, 54, -46, 43, 63, 104, 9, -62, -58, -82, -38, -47, -170, -11, 133, -99, -24, 60, -90, -67, 73, -33, -115, -49, 58, -84, -126, -44, -41, 52, -89, -163, 8, -17, -29, 62, + -148, -58, -2, -47, 74, -7, 29, -243, -83, 160, -63, -126, 37, 42, 34, -34, -207, -67, 209, 39, 65, 78, -46, 453, 277, 264, 4, 27, 20, -107, -241, -89, 180, -136, 81, 245, 18, -77, -32, -49, -27, 99, 139, 6, 40, 58, 90, 6, -130, 40, -209, -62, -28, -58, -39, 26, -51, -109, -87, -40, 7, -47, -127, 149, -58, 10, -41, -99, 121, 340, 80, -120, 200, 44, -64, 59, -37, -134, -1, -58, 49, -117, -199, 4, 31, -243, 70, 45, 133, 71, 175, -65, -116, -72, -32, 61, + -31, -126, 93, -75, -240, -360, -120, -177, 256, -53, -40, 106, -251, -164, 139, -111, -117, 1, -18, 33, 88, -33, 36, -56, -55, 3, -50, -99, -18, -16, 103, 120, 90, -125, 53, 52, 176, -86, -16, -56, -150, 209, -200, -86, -84, 55, 157, -147, 162, -11, 83, 152, 12, 120, -217, 54, -89, 20, -230, 14, -88, -185, -163, 22, 129, 18, -121, 176, -73, 108, -31, -187, 260, -155, -54, -66, 52, 115, 42, 86, 110, 168, 103, -264, -368, 39, 35, 18, 243, -80, -257, 25, 35, -71, -11, -232, + -41, 26, 39, 254, -40, 228, -50, -61, 25, -230, 103, -88, 145, -40, -53, -87, -35, 6, -164, 293, -198, -334, 106, 14, -226, -71, -440, 6, -151, -4, -165, -142, 33, 14, 86, -143, 122, -162, -299, 35, 96, -96, 112, -56, -159, -154, -195, -102, -9, 30, -48, 189, 17, -66, 35, 4, 57, 24, 38, -184, -111, 51, 125, -574, -144, 23, -146, -107, -183, 48, 65, 131, -98, -122, -138, 70, 155, -76, -65, -38, -22, 74, -318, -78, 183, 60, -91, 36, 163, -14, -38, 58, -7, 395, -165, 98, + 35, -163, 59, 39, -184, 135, -263, -24, 242, 54, -1, -47, -177, -155, 49, 104, -62, 52, 204, 100, -73, 124, -166, -407, -45, -177, 123, -112, 301, 149, -2, -45, -366, 122, 156, -112, 238, -173, 78, -277, 145, 85, -262, -207, 156, 230, 571, 585, 131, 166, 12, 72, 15, 49, -150, 60, -90, 118, 134, 292, 56, -78, 201, 123, 239, -5, 151, 67, -65, 54, 351, 37, -143, -99, 261, 138, 128, 217, -178, 51, 287, -304, -334, 89, 184, 271, -124, -243, 180, 40, -24, 85, -43, -53, 0, 391, + -150, 57, -100, -94, -49, 188, -29, 455, 233, -266, 272, 25, 127, 22, 59, 28, -87, 123, -365, -143, 189, -392, 121, -263, 65, 231, 898, 186, 120, -245, 373, -107, -42, -80, -3, -234, -45, 148, 4, -186, 237, -38, -162, 64, 57, -246, -407, 184, -183, -200, 19, 25, -142, 225, -226, 93, 167, -8, 256, 116, -384, -347, -186, 52, 41, -268, 80, 135, 29, 123, 103, -278, -181, 118, -371, -94, -37, -325, -219, -91, 42, -150, -416, -150, -237, 479, 183, -2, 27, -84, 320, 464, 9, 324, 164, 124, + 2, -104, -89, -83, 115, -184, -77, 77, -632, 428, 680, -509, -308, 144, 120, -101, 222, 65, -193, -230, -7, -71, -169, 89, -79, 15, 187, -250, 52, 38, -153, 26, -242, 52, 350, 184, -37, -108, -31, -195, -215, 111, 176, -51, -100, -64, 105, 183, 83, 331, -177, 140, -86, 39, 200, -66, -66, -379, -61, -292, 148, 111, 382, -322, -125, -311, -529, -80, 215, -354, 76, -31, -270, -303, -399, 537, 14, 325, 213, 266, -127, -283, -240, -300, 13, 174, -85, -482, 346, -34, -194, 316, 99, -286, -434, -152, + -7, 21, 13, -139, 476, 213, 139, 125, 146, -133, 31, 111, 65, 450, 40, -631, 75, 286, -246, -347, -81, -180, -120, 48, 454, 293, -49, 9, -140, -381, -137, -310, 235, 344, 4, -157, -65, -51, 149, 229, 220, -480, 99, 43, 48, 378, -201, 171, -183, -106, 42, 259, 418, -35, -262, 118, -476, 417, 213, -14, -189, 128, -108, -202, -171, -152, -120, -17, 30, 132, -184, -82, 266, -453, -90, 245, -314, -65, -4, -75, -371, 369, 203, -307, -17, -148, -71, -639, -54, -308, -657, 118, 138, -342, -227, -398, + -388, 328, 235, 347, 46, 760, 71, 383, 602, -96, 208, 555, -360, 150, -202, 372, -90, 753, 393, -276, -331, 29, 220, 294, 128, -317, -25, 226, 626, -279, 435, -179, 285, -493, 228, -288, 231, -12, 114, -128, 417, 451, -844, 212, 254, 79, -114, 40, -411, 10, 459, 481, -101, 501, -21, -107, 45, 282, -100, -129, -52, -358, 66, -102, 571, 372, -260, -283, -526, -194, 398, 703, -309, 220, 58, 96, 393, 278, -536, 115, -183, -105, -213, -116, -225, -520, 108, 363, 151, 838, -185, -103, 592, -198, -14, -115, + 171, -617, -385, 235, 493, 706, 844, -586, -291, -12, 298, -6, 956, 282, 165, -697, 77, 34, 377, 488, -314, -79, 169, -111, 29, 522, 204, -413, 136, 329, -39, 593, 141, 927, 483, -280, -51, -911, 99, 206, 92, 1289, -136, -127, -547, -527, 236, -436, -218, -301, -152, 300, -181, -403, -291, 3, 363, -451, 129, 165, 77, 448, -21, 11, -447, -706, -244, 285, -339, 65, -278, -1213, -602, 329, 63, -706, 143, 919, -5, -51, -330, 180, -368, -759, 60, 84, -242, 113, 318, -96, -196, 168, 300, 445, -229, 328, + 504, 161, 844, 57, -439, 539, 79, 71, -21, -140, 464, -261, -75, 265, -661, -755, -846, 1174, -641, 130, -13, -411, 633, -747, 333, 1247, 808, 151, -1014, -91, -662, -380, -604, -93, 197, -147, 510, -272, 100, 205, 704, 57, 112, 790, -529, -118, 382, -202, -408, -325, 434, -409, 191, 665, -183, -1329, -64, 271, -1558, 897, 744, -650, 988, 605, 448, 954, 34, 459, 73, -3, 378, -711, 655, 799, 685, -769, -120, 877, -449, 672, 718, 1529, 1000, -48, 122, -332, 251, 193, -672, -1255, -144, -90, -85, 721, 916, -1792, + -1621, 697, -461, -529, -208, -638, 224, -1024, 1270, 456, -528, -34, -518, -412, -420, -502, -314, -1239, -1096, -232, -256, 39, 93, 179, -89, 121, 188, 503, 580, -262, -321, -393, -321, -728, 998, -403, 223, 713, 688, -320, -338, -621, -408, -522, 746, 27, 56, -1030, -388, 1343, -184, 1242, -316, -559, -364, -627, -626, -184, -58, -865, -3, 281, -102, 198, -1865, -820, -552, 797, -330, 18, 192, 1279, 387, -428, -100, 650, -972, 1985, -662, -358, 1127, -699, -1138, 1063, -1521, -395, 324, 293, -1067, -370, 866, 44, -201, -541, 677, -655, + 23, 592, -206, 548, -17, -208, 150, 163, -320, 525, -282, -63, 128, 35, 16, -45, 131, 352, 484, 758, 340, -247, -89, -403, 412, -101, -654, 203, 2, -321, -889, 678, 53, -362, 1016, 109, -301, -131, 1506, -1342, -1481, 968, 1455, -2587, 43, -924, -852, -337, 988, -678, 1251, -121, 32, 1468, -444, -869, 1381, 715, -1130, 1219, -600, -678, -259, 243, 1125, 942, -365, -35, 313, 1021, -376, 7, 533, -693, -705, 580, -401, -194, -374, 36, -580, 107, 302, -154, 220, -178, -212, -86, -781, 179, -351, 516, 888, 127, 413, 468, + -24, 258, 235, 1087, -774, 569, 363, -428, 278, 425, 39, -363, -984, -827, 232, 435, -425, -1437, 1177, -308, -759, -268, 1172, -462, 1283, 143, 355, -1147, 1108, -390, 398, 27, -1923, -299, 126, -792, 754, 283, -2101, -1051, -385, 282, -319, 371, -591, -1120, 2, -1190, 326, -101, -215, 406, 659, -417, 94, 732, -568, 991, -130, -1074, 930, -438, -197, 836, -1058, 289, 21, 394, -163, -379, -1611, 381, -662, -1613, 1968, -1311, -545, -251, -440, -986, 568, 1368, -831, 394, -1208, -675, -684, 626, 120, 1791, -295, -134, -519, -1520, 14, 761, + -554, 641, 766, -620, 79, -525, -2250, -1171, -683, -2365, 1540, 2024, 954, -1971, -1560, -3475, 536, 3928, 1394, 608, -942, -2688, -60, 1284, -1677, 1210, -217, -297, 57, 531, 36, -133, 438, 115, 163, 630, -390, -31, 367, -145, -36, 387, -359, -120, 142, 625, -405, -333, 391, -44, 231, -672, 872, -229, 312, -213, 135, 433, 230, -137, 424, -180, 428, -345, 3, 385, -68, -202, -807, 54, 673, 37, 331, -454, -105, -285, -236, -142, 498, -205, 316, -404, -406, -226, 140, 813, -289, 345, 68, 37, -372, 175, 490, -34, -341, 229, + -167, 93, -112, -150, 17, -25, 1623, 321, -868, -618, -960, -305, 186, 510, -158, -207, -177, -172, -161, 232, -117, -33, -50, -170, -39, 256, 38, -75, -255, 294, -380, 224, -135, -375, 3, 170, 193, 149, -220, 49, -70, -122, 453, -402, -72, -17, -26, 41, -66, -237, 200, -375, 358, -54, -248, 85, -127, 316, -183, -114, 345, -309, 109, -149, -31, 260, -184, -77, 238, -164, 65, 21, -187, 460, -397, -39, 176, -104, 285, -136, -47, 40, 75, -764, -1157, 1516, 4715, 408, 407, -3215, -4076, -844, -866, 2402, 4076, 2097, + 399, -1471, -2875, -2022, -1453, -71, 1984, 2910, 1567, 364, -1023, -1807, -1018, -971, -917, 581, 1179, 1170, 1170, 287, -513, -204, -778, -1208, -138, -357, -249, 1100, 628, 919, 550, -409, -1001, -235, -653, -95, 449, 144, 240, 501, -256, -345, -86, -200, 194, 325, 12, 401, 228, -407, -405, -627, -550, 33, 645, 994, 460, 135, -224, -614, -143, -643, -400, 475, 317, 419, 237 }, + {-123, -163, -233, -27, -90, -164, -80, -39, 37, -79, -165, -14, 47, -164, -85, -32, -91, -95, 73, -11, 16, -84, -85, -22, -132, 92, -134, 40, -33, 53, -63, 16, 44, -183, -32, 21, 200, -91, -17, -32, 0, 77, -27, -85, -12, -28, 61, -24, -71, 74, 69, 36, 17, -50, 91, 66, -107, 68, -75, -35, -12, -61, -19, 11, 24, 76, -61, -50, -10, 11, -52, -156, -29, -62, -10, -23, 16, -54, 38, 105, 82, -27, 63, 30, 181, -32, -5, 23, 132, -26, -137, -64, -132, 32, -47, -11, + -16, 32, 13, 27, 77, 141, -62, -34, 28, -66, -9, 110, -60, 136, 14, -48, 90, -122, -32, -85, 120, -2, -45, -31, 1, 114, 4, 137, 51, -108, 89, -46, -84, -65, 91, -16, 292, 35, 72, 58, -139, 7, -23, 42, -81, -46, 149, 133, 6, 61, -21, 87, -132, 24, 72, 73, 10, 3, 17, -74, -54, -220, -206, -122, -118, -95, 35, 146, 285, 60, 71, 4, -209, -81, -79, -180, 285, 82, 112, 85, -66, 35, 274, 116, -67, 1, -69, 12, -129, 84, -42, -50, 9, 154, 14, 59, + 91, 135, -229, 11, 57, 141, 202, -104, -24, -45, 169, 102, 109, -7, 50, 350, -215, 55, 19, -131, 60, -187, -28, 65, -44, -287, 83, 36, -83, -67, -16, -27, 99, -74, -48, 52, -8, -57, -6, 94, -114, 45, -14, -47, 295, 35, 100, -5, -91, 14, 205, 117, 129, 229, -107, 10, 205, 76, 85, 19, 17, 133, -124, -27, 149, -102, 52, 97, -78, 73, 203, -95, 68, 23, -3, 9, -55, -140, -56, -117, -24, 56, 91, 113, -31, -178, -29, 271, -111, 58, -60, -277, 152, 45, 110, -17, + 127, 138, -252, 98, -5, 91, -30, -166, -21, -23, -43, -32, 95, -2, 9, 212, 31, 162, -5, 8, 39, -82, -133, 491, 285, 419, 144, -184, 96, -87, 17, 34, -359, -105, -96, 85, 147, -68, -5, 39, 15, 250, -26, -283, 91, -168, 123, 128, 112, 150, -37, -67, 66, -60, -63, 34, -42, 84, 138, -73, -210, 54, -205, -146, -27, -439, 3, -87, 164, 143, 74, 244, 259, 99, 55, -37, 9, -3, -123, 224, -37, 65, -82, -113, -39, -160, 117, -87, -58, 215, -204, -85, 45, -113, -32, -30, + 76, 65, 54, 64, -205, -420, -172, -29, 46, -38, 116, -13, 197, -176, 96, -31, 376, 181, -103, -152, 73, -223, -146, 109, -102, -126, 254, 130, -34, -109, -188, 132, 70, 103, -26, -25, -124, 177, -228, -72, -29, 166, 95, 7, 145, 39, -96, 51, -96, -61, -112, 134, -105, 16, 132, 247, 213, 115, 62, 5, 111, -33, 169, -12, 100, 115, -100, 32, -108, 116, 58, 56, -52, -132, 81, -132, -50, -143, 13, 4, -54, 25, -60, -205, -426, -347, 23, -297, -144, -420, -221, -257, 102, -138, -180, -64, + 11, -110, -405, 106, -71, 38, -183, 180, 69, 1, -163, -76, 208, 138, 10, -35, -139, 83, 46, 85, -166, -20, -135, -127, -132, 8, 270, -225, 6, -215, 23, 91, 123, -227, 223, 262, -87, -72, -45, -19, 88, 100, 30, 64, -128, -36, -45, 220, -68, 244, -1, -93, 212, -37, -112, 23, 222, 215, -3, -80, -90, 46, -95, -338, -320, -387, 120, -315, -120, 288, 152, -342, -14, -5, 155, 210, 381, -109, -125, -374, -441, -273, -82, 176, -174, 81, -250, 262, -185, 209, -91, 23, 66, -51, -182, 296, + -253, -21, -130, 30, -153, 30, -648, 3, 316, -399, 100, 259, 107, -212, -12, 314, -386, -10, 174, 148, 164, -66, -46, -265, -115, 96, 187, 269, 353, -510, 204, -161, 50, -362, -129, 278, 85, 31, -170, -7, 183, 119, 84, -169, 38, 393, 654, 365, 426, 65, 151, 575, -19, 17, 392, -192, -1, 113, 194, 324, -266, -376, 206, 115, -221, 47, 132, -84, 75, -203, -48, -237, 70, 258, 77, 226, 172, 184, -451, 23, 518, -62, -13, 486, -68, -17, 68, -64, -18, 269, 418, -414, -72, 84, -132, 197, + -71, 21, 25, -89, 366, -45, -142, 142, -147, -229, 73, 257, 88, -24, 42, 246, 115, 221, 50, 36, -17, -189, -17, -107, -68, -2, 1095, 163, -33, 4, -540, -144, 43, -112, 226, 115, 372, -36, -7, -69, -167, 268, 42, 111, 137, 213, -193, -174, -223, -137, -130, -39, -304, -43, 480, 245, -96, -16, -60, 58, 169, -66, 690, -101, -21, -295, 124, 322, -53, -210, -31, 138, 231, 123, 325, 510, 159, 14, 290, 262, 89, 209, -605, 168, 17, -507, 198, 18, -230, 184, -244, -205, 285, 259, -126, -429, + -216, 152, -245, -4, 117, 394, -138, 132, -565, 348, -47, -399, 6, 323, -371, -104, -295, 189, 90, -137, -113, -69, 233, 141, 113, 199, 215, -1, 255, 247, 133, 128, -249, -153, -166, 148, 243, 58, 91, -149, -71, -99, -46, -250, 236, 29, 38, -266, -49, 374, -258, -320, -438, 143, -322, 485, 607, 384, 260, 5, 481, -258, 384, -63, -230, 2, 46, -563, -218, 191, 57, -106, 108, 449, 338, -536, -111, -17, 6, 135, 199, -21, -338, 121, -170, -577, -283, -473, 31, 73, 290, 85, 768, 144, -342, -85, + -290, 516, -654, -37, 423, -941, -396, -304, -353, -617, 44, -90, -290, -13, 286, 61, 24, -165, 59, -40, 58, 24, 32, 271, -75, 10, 485, -298, -81, 113, 416, -199, 600, -159, -264, -498, -701, -171, -526, 279, -171, -352, 36, 94, 266, 272, 83, -14, 854, 517, -72, 122, 281, 261, 128, -78, -35, -114, -222, -138, 107, 698, -482, -73, -283, 478, -180, 141, -164, 243, -370, -398, 233, -191, -685, 326, -191, 256, -184, 327, 258, 267, 486, 50, 413, 133, 120, 241, 110, 46, 36, -40, -235, 195, -494, 193, + 69, -177, -260, -39, 212, -260, -81, -374, -118, -454, 40, 196, 9, -91, -254, -501, -324, 323, 133, -191, -254, -107, -10, -496, 394, 305, -436, -480, -700, -156, -840, 179, 340, 122, -44, -162, -79, 293, 361, 348, -255, -271, 282, -177, -101, -541, 212, 285, 439, -109, 642, 821, -346, 20, 177, -596, -152, 829, -6, -819, 62, 306, -52, 341, 674, -246, 607, 390, 514, 198, -446, -398, 328, -356, -661, -135, -780, 215, -77, 318, 203, 217, 59, 24, -4, 438, 162, -681, -110, 306, 451, 325, 565, 592, 393, -131, + -92, 177, 1048, -378, 58, 299, 399, -98, -615, -47, -170, -276, -677, -631, 177, -313, -324, 281, 546, 797, -10, 66, -34, 638, -371, -87, 510, -476, 18, -138, -345, 357, 168, 339, -403, -998, -199, -367, -290, -229, 75, -361, -251, 64, 246, -237, 544, -84, 375, -202, 11, 268, -392, -293, -113, 415, -75, -513, -151, 46, -203, 174, -293, -354, 508, 111, -344, 202, -12, -324, 5, -519, -390, 57, 772, 271, 265, -618, 491, -79, 385, -233, -376, 174, -725, 609, -994, -679, 275, 539, 81, 650, -259, 150, -432, 608, + 245, 445, 260, 79, -105, -190, -260, -123, 46, -513, -207, 17, -468, 130, 172, -739, -670, 55, 289, -356, -1530, -335, 0, 187, -514, 30, -284, -76, -409, -479, 415, -467, -549, -111, -384, -444, 148, -637, -204, 353, 853, 668, -34, -441, 145, 598, -32, 389, -123, 496, 287, -559, 844, -674, -350, 545, -639, 162, -155, -502, 44, 689, -162, -453, 255, 322, -26, 114, -1053, 217, 23, 487, 230, -487, 424, -277, -68, -456, 192, 571, -160, -154, -656, -891, 436, -90, 315, -449, 209, 301, -501, -131, 517, 541, 619, -1605, + 629, 757, -164, 515, 33, 249, -88, -360, -169, 296, 118, -490, -255, -80, -173, -154, -9, 932, 235, 177, -560, 380, -387, -32, 116, -694, 347, -281, 76, -304, -432, -26, 357, 860, 366, 54, 599, 196, -24, 52, 58, 117, 136, 569, 312, 144, 147, -119, -142, -643, -456, 28, -23, -414, 103, 405, -634, 616, 224, -293, 27, -229, 2, 348, 236, 72, -388, -167, -562, -242, 184, 97, 361, -273, -65, 174, -1387, 2152, -2129, -973, -483, -153, 1255, 359, 1404, 341, -282, 1093, 481, -382, 520, 458, 264, 427, 427, -389, + -609, -446, 72, -412, 212, 113, 274, -55, 189, 51, 686, 149, 63, 197, -162, -24, 240, -447, -616, -433, -360, 44, 177, -449, -75, -278, -1067, 516, -199, 252, -567, -210, -527, -730, 259, 167, 680, -52, 596, -280, 496, 36, 712, -540, 434, 517, 280, 288, 1, -241, 792, 510, -65, 903, 287, 77, 326, 382, -74, 1329, 105, -781, -1174, -604, -492, 174, 964, 3, -410, 886, 72, -674, 631, 707, -120, 16, -60, -587, 695, 72, 400, -182, -539, -923, 188, 163, 164, -91, 319, -271, 15, -564, -747, 324, -75, 303, + -87, -223, -670, -1013, 581, -533, 276, 593, -6, -198, -498, -296, 1275, 374, -23, 259, -130, -399, -130, 831, -661, -1052, -373, -243, -1605, -1143, -657, -562, 206, 160, -548, -905, -420, -291, -388, -87, -272, -333, -532, 717, -311, 947, -149, 904, 1236, -194, -1428, -1301, -331, 685, 46, -1012, 785, -139, -732, 889, -1636, -294, -34, -242, -286, 1975, -852, 1853, -131, 421, -175, -677, 1121, 346, 1167, -788, -853, 301, -1353, -357, -248, -879, 1868, -130, -2009, 4, -913, 290, 453, 823, 611, -748, -517, -1183, -384, -535, 494, 369, -90, 381, + -264, -839, -371, -984, 1013, -758, -549, 938, 211, 1574, 756, 140, 826, -1095, -382, -1098, -1053, -206, -136, -1159, 1131, -247, -666, -1533, -2609, 1361, 282, -531, -447, 852, 429, -472, -161, -1189, -534, 547, -1076, 71, 164, -290, -726, -446, 920, 412, -215, -1325, 435, 890, 469, -1016, -726, 41, 1119, 140, -302, 220, 11, 625, -1551, -1277, 1607, 298, 656, -1508, 311, -22, 1110, -971, -224, -1504, 514, 1175, 232, -635, 414, 1690, -765, -714, -647, 299, 28, 1499, -469, 186, -816, 336, -897, 64, 485, -958, 942, 418, -800, -993, -777, 94, + 831, -1550, -387, 1456, 77, 204, 1714, 868, 404, 389, 421, -277, -258, -581, 85, 181, 163, -38, -969, 467, 206, -685, -565, -298, -324, 253, -238, -290, 100, -24, -506, 670, -464, -153, -482, -449, 342, -189, -48, 173, 230, -48, -646, 166, 1054, 230, -1606, -92, -334, -492, 360, 380, 857, 420, -1041, 1167, -268, -777, 2412, -460, -188, -765, -1886, 898, 979, 349, 377, -1589, 483, -87, -389, -240, 65, -100, 244, 367, 42, -157, -468, 561, 460, 867, -417, -931, -2366, -3894, 266, 4018, 324, 8510, 8517, 3124, 8539, 4993, -1532, -143, + -867, -6533, -5500, -3813, -6870, -6493, -1955, -4106, -3666, 762, 1007, -928, 1126, 1794, -143, 67, 3528, 2379, 772, 2633, 4914, 2300, 2622, 6198, 2300, 1020, 5244, 5126, 7, 3215, 5702, -143, 1258, 3357, -397, -3055, 1149, -797, -5843, -5385, -5074, -9471, -13992, -9756, -13637, -17953, -12864, -10413, -14096, -9074, -4674, -4421, -1249, 3717, 7738, 8913, 11839, 16313, 15663, 14646, 16236, 16270, 12108, 9651, 10533, 4601, -372 } + }, + { + {-71, 59, -163, 49, 74, 1, -75, 10, -25, -86, 224, 72, 65, 137, -64, -14, 13, -94, 175, -67, 18, -100, -22, 103, 1, 8, -38, 14, -124, 130, -100, 29, 82, -18, -79, 150, -2, -129, -16, -149, 62, -159, -76, 16, 35, 24, 34, 71, 110, -13, 72, 76, 55, -2, -62, 77, 21, 47, -82, 149, 120, -12, -78, -13, -6, -30, -89, -181, -29, 112, 103, 45, 205, -32, 0, 312, -12, -18, 100, -42, 115, -62, -146, 50, 147, 20, -22, 193, 7, 6, -66, -39, 304, 41, -207, -154, + 214, -22, 222, 14, -43, -23, 167, 31, 351, 153, 96, -21, 77, 157, -41, -121, -151, -31, 133, 113, 178, 48, -102, -107, -46, 72, -26, 38, -23, -163, -126, 46, 114, 69, -61, -69, -8, 171, 85, -22, -43, 77, 50, 31, -94, 41, 78, -14, 120, 140, -253, 85, 49, 142, 84, 141, 292, -237, 50, -49, 0, -305, 27, 191, -279, -53, 180, 492, 67, 1, 31, -301, -13, 230, 197, 10, -9, 24, 102, 181, 183, 205, -92, 49, -15, 83, 19, 55, -312, -79, 46, 31, -173, 0, 116, -130, + 106, 106, 182, 92, -71, 98, 204, -108, -186, 69, 43, 43, 98, -75, -149, -216, 181, -26, -41, -65, 81, 5, 119, 239, 49, 23, -10, -48, -170, 275, 69, -29, 123, -30, -112, -46, -143, -128, -155, -226, 127, -5, -105, -45, -53, 46, -87, -156, 37, -102, 264, 346, 278, -193, -6, -15, 75, -109, 218, 133, -29, 102, 166, 10, 41, 54, 161, -18, 61, 188, 21, -5, -82, 134, -206, 81, -28, -46, 139, -137, -16, 1, -179, 71, -35, 80, -5, -82, 56, 54, -9, 157, -11, 181, -2, -126, + -54, 4, -84, 162, 86, 138, 161, -74, -158, -105, 2, -33, -20, 115, 139, -22, -73, 77, -464, -106, -147, -247, 82, 68, -33, 119, -19, 101, 135, -58, -165, -201, -81, -187, 11, 24, -86, 110, -96, 60, -46, -105, -291, -109, 22, 48, 71, -104, 72, 118, 34, 265, 61, -4, 199, -141, 113, 22, -73, -95, 126, 20, 36, -307, -62, -100, 305, 136, 106, 129, 137, 116, 152, -81, -40, 100, 149, -18, 175, -94, 32, -36, 146, 235, -368, 99, -97, 18, -175, -77, 7, -34, -81, -102, -116, 10, + 183, 108, 68, -37, 18, 17, 236, -187, 237, -33, 131, 238, -146, 184, -112, 94, 41, 280, 129, -158, -253, 58, -188, 158, -34, 207, -149, -26, -118, 71, 52, 59, -9, -22, -218, -99, 192, -147, -22, 121, 14, -115, 46, 11, -17, -100, 212, 65, -278, -129, -222, -40, -195, -354, -69, 155, 450, 96, 50, 206, 9, -161, -126, 115, 61, 78, 143, -309, -57, -282, -40, 68, -72, -232, 51, 88, -12, -97, -6, 506, 116, 368, -174, -19, -125, -23, 384, -325, 108, 43, 504, 275, 333, 67, -85, 165, + -112, -413, 79, 30, 48, 338, 31, -188, -18, 16, 105, 122, -10, -36, 136, -150, -42, -72, -39, 49, 8, 300, 44, 237, 266, 81, 236, -9, 81, 150, -148, -219, 34, 239, -361, 119, -275, -254, -155, -64, -240, -231, -245, -121, -54, 179, 15, 213, 43, -160, 271, -259, -84, -97, -94, -117, -147, 241, 159, -142, 108, -251, -293, -141, -188, -70, -89, -306, -282, -202, -55, 0, -62, 245, 1, 135, 152, 221, 10, 414, 474, 8, 121, 130, -83, 235, 95, -428, -38, -136, 2, 362, 113, -338, -119, 176, + 132, 39, 431, -172, 158, 204, 176, 137, 209, -383, 119, -139, 210, 27, 73, -284, 191, 179, -70, 174, -59, 62, -37, -138, 6, -81, 61, -104, 115, 70, 346, 313, -135, 130, -359, 301, -133, 204, 205, 295, -33, 323, 67, 28, 257, -229, -66, 213, -116, 362, -118, -248, 470, 650, 139, -250, 174, -129, 260, 159, -62, -265, -181, -454, 116, 202, -410, -42, 230, 68, -25, 16, -55, -212, 48, 279, 5, 66, 92, 394, -260, 2, 273, -247, 369, 30, 521, -428, -403, 229, 11, -40, 105, -23, 138, 105, + 284, 296, -242, 60, -163, -72, 163, -1, -105, -16, -8, 289, -522, 411, -142, -136, 250, -185, 183, -255, -186, 3, -194, -10, -132, -324, -239, -112, -224, -353, -69, 122, 432, 65, -254, -483, -95, 143, -79, 508, 166, -187, -359, -459, -855, -76, -90, 324, 248, -182, 27, -143, -70, 302, -4, 10, -33, 343, 64, -113, -12, -21, 100, -328, -95, -134, 510, 109, -525, 127, -270, -165, 84, -505, 160, 345, 323, 234, 67, 86, -8, 38, -303, 97, -478, -111, 289, 83, 298, 262, 248, -184, -342, -339, -216, 50, + 124, 107, 191, -8, 136, 277, 314, 256, 440, 520, 368, 642, -303, 458, -393, -300, 331, 434, 502, -518, -7, 137, -391, 188, -175, -269, 308, -402, 437, -413, 409, -295, -115, -22, -552, -70, 598, -148, -436, 98, 275, -308, 151, 659, 346, 139, 284, -338, 225, -200, -600, -173, -161, 52, 263, 341, -154, -252, 231, 10, 175, 123, -104, 42, -244, 46, 67, 8, 69, 548, -75, 66, 144, 45, 55, -257, -303, 216, -354, -437, -449, 368, 109, -62, -97, -399, -668, 247, 839, 431, -172, -644, -241, 57, 80, -113, + 312, 234, -250, -107, -43, -419, 594, -258, 205, -33, -153, -513, 164, 129, -76, 84, 228, -67, 582, -112, -100, 515, -64, -332, -326, -590, 75, -112, -199, -109, -458, -163, -430, 71, -379, 361, -218, 21, 95, 71, 184, -147, -465, 230, -63, 147, -112, -11, 2, 474, 642, 217, -219, 269, 223, 305, -124, -170, 307, 209, 395, 145, 51, 58, 121, 449, 362, 179, 287, 1227, 76, -385, 1102, 491, 512, 876, 961, 217, 336, 185, 1040, 5, -306, 383, 137, -435, -392, 335, 417, 667, -24, 3, 56, 48, -378, 428, + 379, 95, -283, 454, -106, -80, -624, -201, -2, -98, -305, 176, -280, -246, -142, 37, -177, -370, -376, 390, -273, 417, 268, 329, 179, -473, 38, -721, -239, -429, 199, -529, -179, -166, 72, 377, 122, -171, -666, 187, 343, -138, 82, -468, 382, -132, -97, 655, -401, -695, 204, 228, -234, 476, -526, 569, -415, -220, 164, 142, 1418, 573, 200, -880, -39, -198, -489, -124, -189, -143, -69, -730, -30, -267, -7, 376, -410, 484, -170, -505, -480, 386, 269, -102, -273, 490, -274, -227, 355, 5, 97, -368, -32, -210, 459, -56, + 667, -240, 83, 224, -40, 44, 188, -424, -93, 583, 22, 174, -29, -437, 170, -299, 135, 516, 610, 721, 691, -127, 195, 31, 302, 830, -829, 540, -361, 122, -326, -772, -130, 135, 28, 160, -544, -94, -98, -816, -601, 300, 349, 136, 246, -426, -182, -308, 891, 191, 43, 636, 395, 310, 315, 238, -442, 312, 154, -161, 281, -253, -208, 435, -177, 266, 625, -1, 139, -33, 63, -155, -328, -470, -699, 272, -586, 204, 268, 281, 33, -11, -53, -505, -189, 206, -125, 211, 644, -224, 507, 168, 102, -74, -107, -492, + 47, -653, -129, 542, -244, 11, -843, 275, -135, -102, -478, -560, 227, 207, 622, -1474, -365, -874, 295, -784, -265, -889, 238, -461, -358, -71, -758, -270, -812, -404, -940, 210, -869, -337, -450, -246, -236, -195, -828, -467, -628, -315, -178, 368, -47, 278, -512, -74, 36, -585, 122, -30, 58, 168, -595, -21, 232, -61, 260, 515, 918, -740, 57, 1025, 16, 512, -342, 643, 127, -131, -825, -474, 710, 451, 695, 47, -460, 197, 262, 508, -893, 31, 190, -442, -140, -173, -276, -550, 990, 87, -67, -430, 637, -1073, -3, -223, + 466, -247, -649, 558, -1144, -1004, -813, 453, -240, 10, -444, -439, -492, 259, 240, 782, 376, 143, 743, -218, 267, -289, 228, 113, 438, 695, 368, -172, -448, -286, -100, 379, -144, 87, 2, -211, 367, -51, 297, 205, -629, 476, 906, 115, 753, 721, 316, 218, -25, 365, -277, -932, -326, 636, -30, -363, 305, 919, -261, 41, -736, 644, 548, -68, 149, -307, 1354, -952, -748, -688, -58, 238, -169, 1660, -331, 906, 1684, -602, 832, 304, -985, 900, 191, -494, 744, 254, 703, -47, -500, 480, 231, -37, 217, -197, -529, -387, + -225, -543, -319, -134, 444, -385, -151, -534, 164, 5, 140, 645, -347, 128, -316, -250, 456, -349, -634, -935, 1103, 424, -187, 677, -584, -611, -275, -95, 181, -33, -533, -489, -396, -1091, -571, -607, 292, 309, 66, 563, 217, -681, -435, 767, -585, 32, 843, -163, -1028, 740, -307, 116, 382, 346, 260, -374, -806, 475, -214, 817, 596, -1358, -149, 121, -796, -155, -116, 964, 729, 636, 837, -55, -562, -471, -446, -4, -1265, 127, 1104, -1024, -1790, 156, -665, 1298, -3, 14, 894, -437, 185, -72, -241, 742, -223, 360, 1297, -988, + -550, -904, 427, 39, 860, -533, 331, 11, 777, 431, -405, -294, 278, -179, -60, -595, -581, 254, -157, -198, -353, 680, -318, -323, 1151, 1254, 772, -1118, -172, -357, 343, 1488, -252, -1068, -262, -385, 527, 515, -814, 146, -674, 621, 311, -604, 1044, 1656, 14, -50, -590, -538, 62, 119, -308, 1496, -167, 1122, 845, -1087, -71, -350, -1225, 321, 237, 670, 1072, -13, -357, 385, 362, 894, 325, 99, 677, 776, 217, -157, 616, 312, 749, 187, 183, 512, 793, -124, -714, -754, -301, -252, 1271, 741, 1990, -79, -1084, 922, -367, -335, + -366, -676, 42, 408, -79, -371, 1383, -270, 1637, -442, 834, 103, -374, -817, -1342, 1132, -265, 87, -291, 752, -357, -588, 390, 1491, -876, -602, 147, 250, -147, 1050, 860, 821, 310, 394, 734, 416, -231, -444, -926, -175, 550, 159, 139, -375, -875, -283, -100, 900, 39, -128, 723, -128, 219, 132, -1524, 382, 446, -286, -637, 113, -849, -459, -1314, 394, -1092, -2227, 283, -39, 1587, -62, 556, 1284, -187, -338, 598, -13, -1103, -392, 171, 192, 851, 354, 759, 654, -445, -328, 329, 964, -382, -170, -848, -522, 191, -975, 266, -1083, + 130, 12, 531, -97, -47, -304, 1170, 1288, 2945, 369, -1679, -1226, -937, -1038, 2056, 2790, 920, -243, -890, 53, -1073, 1182, 1077, 348, 139, -664, -120, 1301, 277, 538, 411, 1365, 1105, -408, -1017, -1288, -909, -104, 344, 1234, 699, -221, 628, -883, -337, -2023, -352, 2056, 1534, -279, 4067, 1324, 90, -2207, -415, -150, -561, 619, 281, 534, 820, -1781, -2017, -937, -1378, -131, 399, 1726, -1052, 681, 2521, 1371, 370, 815, 438, -1351, -2439, 1408, -825, 533, -608, -2736, -626, 1488, 2917, 2527, 6141, 3177, 2192, 1884, 887, -373, -3076, -3911, -5772, -4463, + -4532, -1764, 35, 1706, 3253, 2637, 2774, 1866, 2609, 1995, 2886, 1329, 1081, 471, -731, -1182, -1737, -1102, -3783, -1650, -3582, -2638, -4101, -2492, -3818, -1414, -1893, -678, 292, 1877, 5083, 4777, 6779, 4522, 3125, 3995, 5548, 4817, 4100, 2785, 333, -2866, -2775, -3510, -6516, -7274, -7834, -7914, -8593, -7528, -6252, -5591, -3515, 337, 4066, 6755, 8923, 10945, 12288, 9244, 8967, 5313, 2545, 1721 }, + {-193, 10, -155, -53, 71, 43, 99, -128, 72, -17, -119, 141, -67, -30, -96, -81, 97, -94, 53, 133, -12, 74, -43, 2, 63, -18, 129, -5, -196, -4, 33, 86, -88, 14, 30, -17, 86, -15, 120, 106, -65, -7, 109, -216, -121, 48, -108, -24, 47, 0, 133, 146, 35, 62, 77, 78, -20, 23, 73, 96, 17, -63, -119, -78, 2, -11, -5, -165, 158, -43, 30, -42, -83, 53, -11, 396, 16, 68, 54, -160, -85, 220, 379, 62, 201, -82, 36, -10, 170, -136, -312, 126, 143, -181, 207, 103, + 189, 60, 42, -84, -30, 10, 124, 11, -196, 8, -19, 41, -31, 33, 42, 114, 78, 26, 31, 10, 51, -60, -101, -214, 35, 45, 11, 161, -64, 125, 28, -52, -108, -67, 221, 47, 119, 20, 42, -45, -1, 14, 56, -21, -96, -47, -188, 19, 21, 145, -60, 112, -32, 64, 142, 145, 61, 62, 73, 97, 134, -56, 140, 5, 149, -30, 269, 96, 86, -182, -30, -38, -245, 136, 108, -73, -321, -141, -51, 158, 209, 137, -88, 49, -139, 10, 9, -107, -58, -283, 21, -33, -123, 16, 14, -36, + -11, 277, -68, 226, 42, -170, 12, 19, 125, -54, 35, 32, 10, 173, 60, 177, 131, -89, 162, 78, 120, 10, 43, -43, -70, -148, -169, 176, -168, -142, -131, 77, 67, 12, 67, 20, -248, -228, 48, 6, -51, 139, -19, -22, 142, -156, 30, -136, -90, -48, 0, 235, 264, -122, 103, -189, -19, -73, 257, -75, -16, 29, -364, -61, -180, -57, -45, 137, 179, 75, 242, -29, -111, -110, 140, 366, 254, -140, -167, 184, -164, 33, 58, 300, -110, -145, 32, -89, 57, 78, 190, -206, -135, 124, 229, -19, + -106, -133, -323, 125, 0, 99, 16, 10, -49, 59, -78, 46, 74, 78, -85, 72, 4, -58, -600, -199, -31, 102, 69, 149, -287, -87, -13, -299, -212, 74, 180, 105, 199, -26, 114, 263, 234, 218, 127, -86, -67, -137, -60, -138, 282, 130, -43, -126, -76, -129, -186, -202, -252, 151, 109, -281, 66, -16, 193, 29, 95, 124, -265, -42, -10, 34, 138, 210, -85, -31, -63, -167, 50, 33, -19, -45, 158, 9, -89, -29, 74, 104, -43, -2, 24, -141, 103, -9, -215, 23, -252, 55, 131, -51, -50, -184, + 322, 133, 48, -74, 235, 103, 130, 394, 410, 25, -75, -138, -234, 93, 158, -75, -24, 34, -47, -123, 150, -142, 65, -431, -70, -96, -114, -206, -52, -16, -3, -99, -166, -113, 11, -70, -176, 115, 140, 26, -145, -142, 51, -105, 131, -156, 104, 56, -9, -228, -233, 70, -171, 285, 40, 243, -124, 245, 35, 166, 40, 159, -136, -157, -14, 315, -40, -167, -116, 154, -96, -73, 9, -235, 156, 227, -85, -68, -258, 484, 87, 271, -113, 206, 135, 315, -235, -150, -61, 29, 206, -90, 318, -13, 177, 172, + -101, 78, 179, 186, 35, 60, 163, -344, 49, 287, 206, -180, 230, -271, 163, -237, -136, -53, 251, -41, 263, 74, 49, 27, -19, 121, 151, 369, 46, 320, -160, 238, 286, 5, -62, -92, 105, -407, -45, 57, -167, -234, -23, 1, -43, 128, -267, 149, 104, 183, -415, 158, 84, -207, -41, 142, 249, -288, -67, 36, -238, -424, -513, -416, -371, -16, 266, -548, 391, 248, -609, 383, 167, 129, 64, 57, 142, -99, -96, -204, -2, 232, 203, 113, -345, 236, -245, 4, -215, 271, -140, -115, 91, -412, 46, -138, + -118, -46, 34, 401, -185, -64, -148, 304, -181, -103, 100, 90, 93, 106, -121, 146, 45, -339, 470, 182, 82, 46, 6, -217, 273, 219, 101, 295, 41, 128, 309, 149, 74, -207, 251, -112, 461, -58, -4, -119, -414, -22, -17, 310, 196, -26, -198, 503, 777, -96, -119, 388, 82, 133, 90, -559, 52, -359, 282, 425, -121, -195, 56, 272, -171, 327, -138, 624, -193, 126, -44, 174, 425, -159, 29, -32, 112, -157, -94, 257, 523, 51, 378, -140, 37, -68, 114, 295, 412, 342, 299, 338, 190, -54, 30, -38, + -14, 74, -239, -54, 322, -296, 96, -125, -107, -148, -657, 82, 310, 229, -111, -279, -747, -93, 244, -32, 58, -105, 75, -132, 44, -556, -414, 41, 269, -258, -143, 17, -115, -824, -682, 290, 297, 38, 58, -310, 482, 550, 365, -304, 290, 357, -40, -483, -194, 637, -174, 52, 59, 352, -273, -534, 133, 227, -108, 141, 359, -176, -109, -27, -708, -223, 273, -150, -464, 76, 10, -165, 121, -58, -437, -404, -666, -562, 134, 230, 50, -178, -202, -8, -128, 133, -300, -4, -84, -113, -76, -50, 168, -173, -601, 68, + -39, 102, 200, -6, 168, 101, 150, 264, 847, 753, 587, -64, 574, 185, 801, 338, -20, 977, -209, -56, -630, -170, -19, -446, 257, 386, -135, -14, -363, -617, -368, -474, -145, -291, -99, -56, 267, 58, -70, -265, -99, -183, 75, -10, -263, 113, 150, 46, -208, -272, 68, 211, -51, -32, -464, 774, 115, -179, -42, 43, 321, 261, -323, 137, -141, 2, -75, -113, -482, -447, -575, 41, -51, -161, 314, -154, 922, -138, -70, -261, -90, 54, 127, 80, -17, -562, -691, -454, 593, 387, -331, -434, 634, 311, -325, -551, + -37, 43, 103, 28, -249, 266, -173, 563, -47, -469, 147, 112, 45, 4, -139, -320, 34, 204, -101, 146, -247, -837, -594, 367, -451, 362, 171, 6, -115, 196, 131, -104, -60, 70, 299, -260, 731, -211, 286, -245, 120, -99, -203, 609, -446, 665, 39, -394, -468, 230, 164, 44, 102, 242, 267, 212, -470, -219, 102, -50, 223, -458, -119, -198, 26, -415, -8, -57, 119, 1248, 431, -292, 658, 592, -301, -408, 985, -98, 225, -588, 1428, 39, -385, 195, 82, 677, 24, 859, -613, 4, -671, 43, 491, 13, -406, 583, + 328, 166, 154, -215, -188, 46, -285, 381, -335, -468, 418, 148, -524, 285, 46, -393, -208, -134, 214, -49, -225, 283, -337, -138, -110, 479, -307, 233, 374, 174, -211, -440, 287, -373, 518, -638, 859, -238, -126, -100, 377, -6, 106, 255, 93, 306, -338, -421, -61, -755, -91, 687, -200, -432, 192, -205, -35, 310, -747, -443, 291, 382, 526, -41, -98, 208, -49, -744, -505, 867, -65, -767, -442, -312, -251, 66, 257, 8, -126, -386, -581, 72, 78, -27, 477, -332, -913, 363, 269, -1075, 637, -182, -538, -453, -40, 595, + 145, -213, -220, 160, 319, -463, 344, 40, 253, -211, -467, 396, 1, 444, -1444, 161, 224, -239, 403, 436, 1364, 5, -870, -422, -196, -846, -696, 6, -373, -222, -6, -605, 76, 412, 321, -535, 970, 718, -345, 439, -831, -154, -296, 1295, 788, -278, -512, -569, -159, 58, 206, 878, 153, 170, 156, 49, -311, 61, -83, 420, 499, 699, 406, 313, -98, -96, 74, 639, 63, 139, -655, -284, 1011, 457, 277, 42, 588, 370, 1281, -37, 1321, 136, -468, 483, -415, -231, -98, -204, -38, 303, 488, 150, -178, -536, 125, 118, + 316, -388, 30, -115, -38, -426, 164, -347, -183, -506, -910, -31, -336, -505, 153, -579, -2, 710, 221, 607, -698, -317, 343, 76, 1000, -501, 600, -218, -299, -736, -285, -391, 505, 126, -658, 842, -423, -389, 88, 335, -234, 587, -269, -386, -196, 205, -59, -95, 74, 589, -376, 1065, -394, 3, 986, -178, 186, -1306, 75, 256, -282, 605, -1046, -1281, 512, -209, 739, -515, -487, 81, -146, 1129, -114, -25, 269, -1001, 81, -1009, -393, 94, 271, -1235, -544, -103, -46, 344, -406, 395, -347, 19, -760, 612, -532, -207, 566, 1157, + -299, 941, 393, 210, -414, 1045, 214, 464, 90, -683, 275, -687, -597, 353, -595, -183, -108, 599, 96, -264, 249, 240, -93, -656, -104, 420, 1172, 212, -601, 21, -86, 222, 380, 525, -219, -38, 407, 34, 14, 706, 718, 763, 313, 633, 125, 358, -294, -113, 119, -693, 74, 1023, -112, -292, 249, -72, 309, -699, 867, -588, -225, -197, 51, 32, 109, -899, 992, -221, -134, -280, 633, -240, 132, 1908, -94, 368, 3, -216, 73, -910, -362, -292, 366, 230, 456, 32, -449, 474, -378, 549, 437, -476, -471, 42, 714, -728, + 318, 311, -386, 165, -31, 232, -10, -1052, 602, 341, -851, 1038, -537, -149, -324, 836, -147, -739, 21, -4, 726, 700, 70, -565, 824, -144, 166, -1031, 826, 313, 73, -598, -417, -76, 304, -483, -811, -371, 689, 396, -70, 1062, 94, -191, -744, 914, -842, -294, 926, 175, 150, -304, 289, 707, 256, 364, -738, -8, -830, 777, 1300, 556, 756, -1135, -947, -803, 113, 1339, -214, 480, 929, 420, -450, 2, 692, -865, -657, -627, 726, 449, -833, -1266, 1731, 1014, -1151, 520, -90, 474, 105, -385, -779, 740, 35, -640, -868, 216, + 276, -254, 87, -105, -392, -220, -174, 411, -740, 876, -539, 15, 1486, -1377, -248, 1265, 178, 283, -100, -417, 496, -165, -465, 55, -1184, 2168, -101, -2431, 1029, 2293, 1477, -2862, -680, 541, 410, -486, -542, 255, -590, 119, 617, 1378, -571, 432, -727, -1992, 1074, -523, -1064, -775, -1089, 494, 374, -1511, 954, -551, -34, -56, -757, 546, 583, 473, -51, 629, 347, -453, 31, -889, -314, -796, -533, -88, 1201, -1069, -234, -275, -930, 476, -1049, 471, 435, -759, 520, -1184, 289, -1040, 595, -435, -555, -606, -838, -290, 350, 614, -859, 457, + 241, 757, 969, 513, -931, -490, -1696, -500, -549, 447, -1948, -441, -1141, -196, 966, 807, 399, 106, 325, 604, 638, -359, 278, 1701, -985, 602, 850, -424, 125, 251, -46, 797, 95, 562, -737, -166, 736, 59, -1019, 638, -378, -402, -360, -160, -350, 353, 614, 223, -52, -350, 537, -212, -740, 592, -1283, -384, -231, -341, 798, 780, 1527, -484, 674, -70, 323, 929, -36, 61, -617, -2087, 1044, 157, -961, -713, 124, 504, -74, -608, 316, -617, 791, 419, -337, -722, 1413, 158, 58, -116, 163, 126, 17, -410, -999, 324, -263, -277, + -794, -63, -155, 356, -124, 109, 1938, 1005, 1951, -1801, 146, 954, -375, 1085, 2061, 1149, 57, -544, -583, 121, 888, 974, 210, 12, -1437, -280, 1402, 481, -401, 793, -669, -910, -261, -46, 1082, 1438, 1271, 501, -501, -744, -1419, -1388, 1219, 532, 96, 1909, 110, -559, -777, -765, 378, 828, 639, 1262, 85, 915, -61, -137, 450, 851, 603, 551, -471, -149, -372, -807, -672, -1189, -409, 363, -201, 923, 1060, 23, -4, -356, -657, 268, 946, 48, -1021, -2032, 810, 3279, 3363, 2822, 2069, -1282, -1432, -1576, -2063, -3193, -2546, -2237, 1047, 2375, + 1792, 3829, 2985, 1536, -556, -1050, -2569, -2031, -1982, -421, -1208, -1007, 313, 528, 1105, 1080, 1516, 1474, 1935, 1106, 510, -292, -306, -857, -1259, -1556, -1868, -1248, -2295, -1554, -1138, 1146, 2216, 2356, 1659, 1105, 1771, 1326, 1701, 1306, 482, -639, -2917, -2094, -2096, -3304, -2043, -1807, -1717, 611, 1766, 2741, 2280, 3172, 2848, 2627, 1736, -1236, -1003, -2180, -2824, -2546, -1341, -553 } + }, + { + {-193, -153, 37, -88, 141, -144, 59, -263, -19, -104, -163, -138, -80, -8, -31, 172, -53, 34, -22, -10, -143, 168, 52, 30, 45, -35, -37, 42, 162, 68, -31, -13, -4, -38, 4, -28, -15, 1, 91, 10, -71, 51, -76, 222, -135, 15, -2, -167, -25, 72, -94, -43, -31, 109, -61, -44, -7, 11, 23, -18, -55, -132, 24, -70, -97, 20, 36, -11, 25, 58, 63, -14, 19, 4, 71, -94, -93, 93, 97, 187, -259, 48, 186, 314, -26, 172, 1, 155, 49, 244, 4, -92, 180, 233, 239, 126, + 46, -104, -65, 12, 126, -71, 63, 4, 142, -76, 5, 22, -151, -104, -38, -178, 49, -59, 7, -34, -130, 96, 174, -46, 22, 3, -18, 163, -204, -13, 97, 10, 37, -65, -168, -59, 78, 67, 99, -31, 13, -14, 45, -46, 195, -11, -6, -138, 27, -102, -51, 48, 89, 145, 26, 115, 211, 344, 45, 172, -63, 103, 132, -40, -107, 181, 311, -60, 34, 121, -149, 94, 133, -270, 77, 28, -61, 2, -283, 13, 80, -133, 26, 6, 182, 131, -67, -18, -16, -191, -128, 23, 79, 20, 88, -125, + 21, 66, 15, -116, -84, -24, 44, 98, 102, 68, 118, 115, -123, -36, 9, 163, -20, 117, -71, -76, -19, -141, -61, 32, 90, -121, 127, -32, -28, -22, -40, -58, 31, 67, 26, 111, -151, -46, -32, -100, 36, 204, 277, 168, -76, 126, -79, -45, -247, -187, 81, 189, 175, 193, 36, 15, 110, -151, 150, 131, 5, 113, 273, 194, 47, -196, -1, 72, 36, 37, -227, 57, 33, 151, 155, -47, 97, -75, -96, 122, 59, -206, -207, -83, -120, -79, -98, -239, -229, -16, 70, 3, -33, -160, 11, 198, + -66, -57, 62, 4, 128, 76, 59, -85, -126, 213, 78, -71, 110, -14, 69, -59, -22, -390, -229, -72, 74, -161, 49, -45, 113, -28, -218, -174, 151, 123, 312, 275, -42, 198, -300, -50, 233, 69, 54, -32, -98, -46, 32, -27, -9, 117, -147, 32, 53, -4, 92, -102, -83, 53, -65, 83, -165, 27, -100, -39, -111, -82, -126, -185, 112, -1, 192, -181, -157, -1, 35, -21, -40, 14, 114, 57, 22, -78, -81, -42, -149, 26, -43, 20, -13, -149, -23, -7, -162, 9, -40, 17, -60, -138, 21, 47, + 130, -203, 79, -228, -46, 17, -178, 168, 118, -342, -41, 64, -38, -147, -210, 47, -109, -164, -90, 105, 82, 251, 313, -23, 279, -171, 105, 129, -33, 127, -79, 7, -27, -55, -39, -62, 230, -10, -187, -39, 110, 78, 86, 23, -93, 178, 344, 26, 25, 24, -38, 59, -35, 206, -167, 197, 122, -120, 50, 129, 73, -145, -173, -314, -66, -27, 25, 125, -45, 81, -41, -72, -84, 146, -53, 141, -201, -62, -48, -6, 101, 31, 13, 113, 367, 412, -102, -21, 97, -75, 281, 255, -161, 249, 212, 67, + 125, 93, 60, -37, 24, 21, -140, -191, 51, -65, 2, 15, -153, 141, 320, -26, -187, 292, 40, -8, 124, -73, -91, 26, -115, 27, 317, 115, -2, 92, 172, 424, -73, 170, -39, -217, 126, -12, -66, 63, 272, 45, 47, -31, 107, 367, 175, 20, 37, 73, -116, 168, -53, -410, 50, -59, 201, 170, 90, 7, -458, -72, -184, -257, -45, -188, 27, 129, -205, 215, -477, 53, -127, -281, -335, 353, 204, 7, -294, -222, 137, -425, -265, 81, 107, 398, -33, 19, 327, -198, 322, 88, 131, -74, -161, -36, + 272, -150, 42, 301, -94, -108, -131, -202, -141, -136, -233, -45, 98, -101, 77, -97, -109, 164, -206, 125, -172, -256, 33, 187, 34, -73, 101, -175, -61, -239, -383, -200, 81, -126, 456, 161, -243, -171, -22, -126, 176, 118, 525, 327, 362, -112, -494, -49, -249, 55, 119, 261, -119, 109, -199, 26, -175, -476, -244, 169, -163, -379, -341, -333, -498, 53, -170, -394, -339, 51, 493, -75, -75, -172, -288, 51, -111, 23, -362, 14, -377, 44, -25, 197, 166, 162, 94, -24, 148, -104, 285, 69, 147, 76, -87, 90, + 287, -46, 162, -49, 447, 48, 170, 13, -246, -199, 11, -97, 59, -72, 146, 121, 168, -82, 91, -281, 123, 400, -249, -723, -119, -252, -380, 206, -726, -94, -258, -140, 211, -231, 308, 266, 43, 240, 22, 127, -188, -333, -366, -205, -336, 265, 347, -13, -180, 101, 101, -125, 28, -572, -301, 270, -144, 10, 265, -22, 166, 142, -71, 162, 2, -303, 344, -236, 20, 23, -184, 130, 208, -116, 237, 31, -13, -208, 268, 4, -207, -65, -420, -173, -238, -25, 299, 91, -22, 11, -267, 68, 200, -253, 11, 378, + -150, 37, -75, 119, 1278, 297, -179, -248, -35, -71, 219, -40, 184, 376, -157, 29, -251, -154, 69, -29, 179, -350, -221, 182, 353, 251, -20, 98, -98, -205, 148, 295, 288, 371, -305, -57, -179, -354, -55, 33, -89, 183, 215, 14, 102, -51, -399, -198, -531, -515, -163, 193, -86, -219, 436, 185, -27, -400, -28, -110, -307, 22, -146, -174, -423, -33, -164, -433, -12, 370, -246, -87, 107, -166, 53, -149, 208, -28, -270, -281, -548, 23, 296, -1027, -576, 534, -135, 28, -276, 229, -92, -402, 194, 539, 74, -487, + 138, -113, -106, 305, 329, -54, -64, 679, 156, -110, -422, 176, -606, -511, -460, 175, -87, -62, 395, 145, -403, -349, 86, 377, 132, -59, 19, 246, -192, -440, 550, -179, 53, 207, 29, 60, 564, -8, 357, -2, -389, 37, 74, -98, 64, 239, -202, -80, 57, -778, 190, 131, -15, 156, 127, -296, 124, 951, 406, 197, 48, 121, -672, -698, 496, 500, 181, 270, -174, 807, -81, 300, 231, -392, -139, -188, 494, -296, -71, 288, 271, -291, -57, -818, 169, -101, -218, 59, 41, 49, 94, 263, 31, 289, 56, 137, + -57, -268, -256, 513, -165, -385, -296, -151, -153, 220, 162, 168, 253, 64, -263, 159, -443, -156, -384, 278, -468, -354, -80, -166, 171, 330, -238, 314, 537, 258, 518, -203, 687, 68, 580, 325, 86, -272, -687, -443, -378, -235, -75, 21, -128, 299, 382, 193, -215, 641, 74, -627, 785, 52, -331, 276, -641, -123, -407, -128, -70, -125, -290, 82, -553, -214, -198, -748, 93, -542, -384, -608, 125, -457, -137, -150, 7, 235, -185, 330, 19, 437, -99, 382, 476, -565, -7, 159, 349, 20, 419, 148, 404, 0, -309, -185, + -31, 272, -62, -109, -29, 498, 302, -100, -404, 151, 212, 176, 421, -552, -437, -94, 26, -127, -15, -125, -385, 992, -488, -468, 341, 214, 257, 96, -149, -155, 494, 391, 587, -183, -163, -809, 946, 458, -1290, -665, 397, 588, 559, -347, -310, 713, 153, 180, 469, 410, -718, 239, 287, -29, 323, 88, -101, 94, -239, 1205, 299, 181, -41, -118, -89, -640, 119, 227, -166, -188, -1091, -484, 218, 223, -364, -311, -58, -478, 204, 232, -85, 257, 417, 66, -34, -89, -240, -24, 24, -744, -122, 247, 468, -798, 168, 380, + -98, -303, -352, 704, 488, -9, -315, -678, -76, 393, -293, 117, -246, -192, 23, 272, 502, -933, -1248, -845, -1118, 974, -652, 401, -120, -762, 127, -196, -300, -993, -935, -675, -274, 51, -545, -140, 131, 449, 24, -254, -9, -273, 407, -508, 715, 640, -159, -183, -868, -485, -531, 78, 107, -124, 693, 215, 560, 128, -76, -243, 504, 369, 153, -499, 267, -854, -105, -78, -585, -81, -2, 679, 433, 27, 300, 1, -660, 346, 68, 512, -327, -590, 337, -825, -1217, -132, -769, 31, -562, 510, -397, -61, 121, 180, 653, 196, + -270, 669, 232, -1185, 211, -718, -31, 116, -79, 560, -153, 88, 165, 34, -356, 569, -320, -49, -666, -17, 135, -125, -222, -331, -339, 872, 54, 443, -772, 73, 9, 256, 490, -558, 983, 1375, -45, 120, -468, 208, 341, -283, 87, 249, 556, -30, 47, -178, -454, -713, 372, -536, -214, -351, 162, 475, 429, -80, 177, -851, 556, -131, 165, -113, 675, -557, 1543, 451, 1120, 368, -1185, 480, 318, -385, 70, 768, 24, 734, 634, -748, 405, -749, -522, -65, 1507, 473, -698, 654, 405, -831, -382, -51, 837, 132, -792, -432, + -39, -207, 457, 686, -262, 604, -402, -518, -35, 1240, 98, -704, 386, -28, -88, 350, -823, -690, -680, 489, -453, 160, 185, 743, 343, 764, 58, -28, 595, 1139, 650, -1117, -1, 116, -216, 225, 284, -855, -157, 170, 121, -962, -900, -514, -649, 868, 262, 8, 146, -605, 457, -1194, 869, 938, 280, 1024, -1049, -536, -272, -1544, 877, 71, 549, 686, 702, 38, -5, 682, -94, -844, -843, 505, -955, 933, -255, 193, 956, 832, -409, 1274, -730, 69, -760, 111, -248, 493, 191, -567, 513, 737, 1124, -654, 255, 663, -912, 27, + -355, -1363, -560, 344, -720, 248, -601, -31, 930, -447, 407, 1028, 768, 262, 1414, -2183, -384, 706, -56, 403, -637, -1181, 1426, -58, -680, 211, 782, 1699, 772, -1325, -549, -427, 231, 111, 1110, -973, -125, -448, -630, 949, -391, 1236, -154, -895, 1407, 2118, -334, -633, -1044, 272, 1071, 251, -272, -659, 125, 197, -193, 205, -140, -305, -388, 354, 412, 0, 571, -558, 1217, 988, 502, -9, 26, 218, -720, -546, -701, -300, -233, 446, 298, 728, -391, -37, -357, 827, 1457, -310, -1050, -579, -115, -1269, 949, -1740, 434, 826, 692, -715, + 81, 874, -1928, -765, 227, -112, -991, -551, -300, -280, 832, 595, -858, -292, -771, 223, 1216, 26, -398, 997, 731, -220, -638, -991, 197, 1917, 433, 977, -77, 75, -69, -238, 9, 77, 476, 142, -366, 308, -319, -374, -399, -3, 396, 70, 318, 317, 277, -286, -469, 136, -322, -846, -235, 171, -279, 951, -988, 794, -246, -14, 1214, -209, -20, 1550, -228, -664, 130, -574, -109, -546, 1768, -525, 441, -454, -166, -276, 316, -481, -1046, 432, -89, -1235, 654, -361, 684, 1320, -658, -98, 27, -100, -552, -233, -429, 3, 2003, 1021, + 2102, -1178, -311, 697, -665, 504, 2160, 514, 306, -572, -547, 619, -337, 875, -154, -203, -266, -1250, 289, 1494, -804, 901, 777, -513, -167, 616, -1010, 488, -86, 741, 237, -633, -218, -1265, -661, 575, 422, 959, 1498, 147, 2, -1331, -826, -803, -671, 324, -562, -175, -150, 371, -1033, -187, 491, 241, 797, -140, -429, 792, -184, 471, -672, -421, -135, -251, 362, 546, 776, 196, 61, -536, -255, -261, 507, 77, 950, -582, -2031, 24, 3348, 2963, 2845, 1164, -1166, -1687, -1614, -1499, -2667, -1955, -1846, 1422, 2260, 1789, 2933, 2386, 543, -142, + -1009, -2055, -1178, -2157, -1124, -741, 43, -314, 564, 883, 1582, 947, 1661, 1212, 1327, 71, -1035, -515, 69, -1194, -1507, -2030, -1935, -1423, -165, 948, 418, 1392, 1036, 1593, 1475, 1544, 1857, 954, -109, -323, -1159, -1002, -3179, -2595, -2029, -1638, 216, -733, 73, 2169, 2730, 3650, 2337, 1333, 910, 144, -1339, -1257, -1835, -2338, -1985, -1647, -553 }, + {-178, -111, -17, -167, 148, -134, -162, 72, -48, -36, 42, -190, -40, 138, -96, -33, -150, 43, -112, -202, 83, 37, 71, -80, -99, 110, 31, 125, 128, -138, 125, -37, -39, 88, -21, 80, 136, 129, 24, 54, 49, -114, -56, -43, 21, 99, -191, -45, -11, -13, -88, 15, 78, -100, 68, -79, -193, 40, 38, 25, -76, -22, -50, 91, -24, -4, 4, 63, 21, 38, 52, -128, -66, 63, -6, -37, 35, -40, 137, 151, 83, -60, -229, -213, 78, 120, -44, 226, -43, 134, -160, -143, 63, 5, -40, 59, + 148, -65, 22, -85, -7, 7, 62, 55, 77, 12, 46, 167, -63, -79, -83, -153, 45, -32, 280, 54, -19, 22, 170, -16, -35, -43, -97, -18, 132, -20, 56, 131, -39, -9, -209, -124, -190, -37, -54, 29, 13, 28, 71, -46, 36, 3, 19, 30, -67, 64, -21, -76, -8, -67, -27, -15, 158, 368, 147, 86, 104, -219, -24, 92, -28, 35, -197, 193, 265, 44, 119, -57, -154, -241, -261, -176, 209, -198, -124, -168, 54, 136, 27, 17, 78, -10, 50, 168, -23, 139, -134, 127, 91, 80, -70, -223, + -46, 124, 75, -64, -7, 41, -9, -109, -22, 87, -30, 7, -52, -15, 7, 27, 156, 62, -79, 10, 14, -57, 29, -81, -8, 122, 42, 136, -98, -90, -47, -29, 68, 142, -62, -109, 113, 22, -60, 67, -14, 108, 46, -122, -114, -131, -20, -107, -224, -214, 220, -6, 46, -3, 134, -200, 295, 261, 13, 13, 0, 7, -30, 101, 79, 5, -169, 71, -53, 79, -24, 177, -43, -106, -49, -30, 65, -3, 109, -179, 94, 29, -100, 277, -47, -42, -8, -6, -76, -26, 147, 120, -265, -125, 130, 36, + -66, 226, 4, 49, 220, 91, 171, 48, -73, -92, -180, -168, 13, 78, 192, 2, -102, -298, -105, -145, 135, -99, 88, -107, -45, 254, 123, -168, 76, 242, 35, -84, -170, -203, -140, -205, 136, 31, 74, -39, -94, -97, -182, 10, -7, 43, -45, -164, 2, 176, -40, 3, -89, -174, -260, -21, 185, 69, 18, -87, 22, -139, -48, -104, 12, 25, -162, 182, -104, 232, 85, 24, -107, -53, 56, -11, 53, 126, 22, 52, -141, 84, -73, 215, 255, 124, 166, 83, -33, -153, -110, 25, 86, 130, -85, -49, + 101, -243, 33, -259, 0, 38, 26, 115, 13, 17, 458, -58, -200, -218, 231, 152, -171, 41, -191, -84, 8, 217, -269, 78, -9, 42, -19, 276, -141, 77, -41, -74, 44, -14, 85, -86, -76, -236, 39, -79, -48, 17, -80, 68, -130, -80, -230, -9, -204, -89, -243, 181, 40, -78, 164, -189, 3, -357, -15, 119, -5, 102, 230, -84, -27, 278, 125, 103, 179, -93, -242, -39, -137, 105, 216, -62, 79, 80, 68, -29, 125, 149, 49, -84, 59, 42, 274, -39, -64, -371, -111, 285, 270, 180, 134, 404, + 20, -476, -128, -77, -122, 258, -46, -90, 292, 49, -129, -40, 112, -103, -48, 38, -45, -165, -83, -6, -169, -72, -75, 114, -84, 218, 202, 22, 192, 142, -99, -30, -78, -311, 25, 65, -307, -42, -95, 106, 259, 41, -287, 41, -119, -185, 136, -43, -212, 91, 60, 217, -31, -20, 134, 173, 132, -165, 143, 188, -487, 201, -51, -115, -99, 80, -45, -295, -308, 34, 484, 129, -350, 74, 287, -211, 37, -57, 171, -7, 157, 417, 307, 186, -8, -41, -197, -216, 81, -554, -89, 252, 26, -35, -265, -101, + -15, -20, -132, -280, 299, -114, -72, -59, -257, -292, -16, -148, 12, 123, 95, 102, -233, -70, -120, -83, 350, -51, -176, -2, 449, -261, 64, 326, -4, -92, -186, 88, 2, 222, -141, 193, 124, 242, 146, 116, -42, -56, 275, 410, 241, 48, -92, -145, -342, -91, 216, -450, -193, 423, -582, -97, 317, 412, -47, -399, 51, -148, 539, 249, -378, -233, -62, -223, -474, -227, -212, -162, -384, 199, 64, 243, -148, -62, -338, -26, -293, 38, -196, 51, 99, -440, -149, -163, -121, 104, 94, -135, 441, -21, -116, -75, + 43, -96, -36, 172, 141, 191, 244, 237, 20, 158, -71, 352, 373, -180, -92, 224, 1, -527, 30, -257, 159, 152, -296, -389, -170, -377, -504, 352, 50, 191, -273, -312, -397, -292, 140, -319, -260, 357, -80, 2, 103, 197, -152, -141, 75, -116, 71, -35, -171, -368, -537, 165, -382, -380, 32, -113, -12, -222, 106, 87, -436, -28, -85, -195, -236, 122, 44, 428, 67, -272, -2, 21, 199, 56, 412, -57, -419, 162, -78, 171, -245, 31, 161, -792, -349, 243, -8, -112, 134, -71, 498, -50, 320, 200, -339, -440, + 88, -484, -26, 256, 1078, -270, -714, -70, -309, 776, 68, 433, 244, -140, -337, -158, -367, -100, 534, -587, 35, -479, 140, 38, 245, 53, -217, -388, -439, -84, -429, -346, 70, 104, 343, -306, -626, -132, -207, 80, -285, -200, 110, -157, -237, -13, 47, -125, 645, -122, -81, 164, 186, -179, -55, 470, 414, 263, 515, 391, 30, 169, 308, -195, -161, 68, 235, 335, 171, 668, 111, 443, -81, -250, -117, 870, 169, -145, -69, -193, -255, -200, 237, -974, -315, 437, -78, -514, -416, -185, 545, 239, -376, 194, -511, -257, + -31, -392, -455, 379, 262, -470, -119, 909, 255, -450, -538, -21, 345, 21, 89, -688, 17, -106, -435, -306, -153, -410, -141, 78, 53, -431, -360, 19, 291, -39, 377, 530, -354, 315, 306, 77, 120, 390, 177, 226, 222, 199, -31, -89, 534, 717, 178, -217, 149, -152, -227, 437, -170, -456, -564, -273, -638, 290, -194, -196, 46, -200, -14, -420, 358, 205, -57, 229, 181, 495, 392, -822, -265, 899, -708, -218, -427, 638, 293, 290, 130, 87, 264, 677, 331, -309, -1, 15, -14, 263, 310, 28, 185, 163, -152, 203, + 133, 413, -198, -417, -344, -283, 86, -47, 167, 171, 190, 359, -157, 65, -158, -305, -111, 15, -328, 411, 525, -581, 199, -409, 326, -85, 132, -66, -301, -102, 370, -309, -73, 32, -555, -251, 143, -462, 3, 615, 354, -96, -110, 318, 205, -34, 569, -50, -129, -475, 22, 40, -125, -15, -217, 77, -675, 610, -124, -225, -428, -489, -51, 580, -108, 155, -365, -219, -104, -363, -430, 381, -244, -207, 343, 325, -479, 154, 176, 400, 336, -137, -307, -204, -469, 495, 330, 154, 357, -392, 251, -71, 229, 244, -253, -38, + 822, 676, -533, 190, 423, -353, 94, -798, 224, -444, 338, -269, -276, -218, 918, 23, -278, 50, 302, 3, 171, -500, -60, 674, -37, -251, -215, 116, -709, -377, -383, 317, -144, 488, 351, 630, -297, -63, -489, 407, 839, -288, -608, 26, -98, 953, -212, -426, 410, 170, 190, 334, 159, -1285, 37, -124, 518, 832, -793, -9, 280, -439, -48, -1173, -224, 532, -897, -601, -253, -410, 402, -272, -298, 448, 184, 131, 546, 4, -144, 311, 572, -580, -356, 742, 585, 125, 289, 125, -324, -588, 38, -64, -65, 88, -268, 141, + -376, 88, 1032, -534, -291, 326, 318, -280, 391, 299, 264, 439, -1009, -1855, -859, -124, 633, 52, 699, 653, -194, 113, -156, -344, -579, -327, -416, -232, 668, -849, -145, -705, -887, -141, -894, -707, 95, -172, -97, 183, 797, 75, -564, 54, -60, -149, -735, -24, 898, 108, -4, 387, 700, 493, 132, -249, 252, -202, -619, -1123, 1115, -102, 931, -37, 25, -286, -517, 1012, -537, -396, -34, -651, -651, 609, 415, 275, -62, 348, -471, 266, -374, -458, -548, -303, -439, -751, 27, -720, -762, -168, -330, -909, -1178, 104, -424, 190, + -53, 421, 1055, 18, 140, -551, -519, 428, 292, -408, 37, 268, -656, -564, -3, 843, -718, -22, 53, 371, -608, 638, 387, 158, 17, -312, -712, -40, -144, 238, -370, -1022, 851, -628, -231, -73, 834, -638, 315, -530, 344, -211, -701, 322, -902, -236, -233, 298, 801, -472, 319, 750, -590, 76, 222, 156, 260, -1143, -284, -198, 407, 0, -28, 209, 73, 246, 1318, 148, 552, 1539, -723, -386, -607, -207, 696, 63, 859, 251, -38, -304, 649, -387, 144, -251, 267, -409, 496, -218, -119, -259, 382, 290, -423, -72, 404, 152, + -270, 59, -347, -1112, 500, -567, -878, 583, 246, 629, -51, -532, -209, -110, 348, 503, 515, 896, 845, -320, 124, -832, 18, -588, -1144, -53, -929, 368, -738, -426, -484, -632, 83, -91, 72, -129, -76, 24, -1200, 285, 173, 360, 519, -23, -865, 647, -449, 406, 321, 24, -119, -78, 912, 1818, -1017, -752, -1420, -2768, -735, -257, 585, 416, -284, -504, 724, 972, 39, -9, -37, -704, -479, -490, -446, -748, -54, -163, -139, 571, -779, 623, 507, -138, 239, 1, -1354, -899, -567, -444, -267, 136, 456, 195, 222, 1293, 1098, 291, + -903, -413, -88, -409, -862, -1992, -1753, -735, -237, 112, 385, -1371, -865, 753, 780, 1040, -988, -1092, 297, -653, 1585, -797, -166, -448, -349, 271, 455, -119, -586, 705, -67, 22, -425, -372, 368, 1634, -519, 500, 15, -785, 154, -1544, -299, 283, 69, -915, 557, 1490, 1114, -516, -920, -451, 148, 1569, 258, -3, 48, 701, 808, 155, 628, 429, 944, -302, 147, 528, -480, -847, 496, 1273, 334, 590, 110, 342, -1718, 274, -17, 346, 1786, 644, 290, -230, 835, -238, -304, 212, 547, 955, -261, 566, 186, 105, 477, 442, 64, -756, + -333, 72, 1400, 794, 776, 624, 706, -268, -1259, -1118, -1701, -210, 784, 504, -640, -263, 1362, -53, -644, 158, -129, -518, -428, 77, 713, 1963, 870, 1739, 898, 772, 723, -518, -446, -496, 204, 1424, 445, -1195, 499, -1285, 626, -817, -189, -719, -783, -43, 81, -19, -977, 1241, -272, 460, -1233, 315, -302, -385, 608, -527, 1235, 135, -518, 50, -398, -531, 329, -870, -210, 1054, -262, 419, -87, -797, 818, -481, -1798, 197, 97, -31, 158, -266, -383, -120, 753, -1503, 842, -355, -229, 839, -494, 198, 59, 1197, -410, -744, 1217, 1122, + 3937, 1583, -2138, -1012, -1044, -1652, 1153, 3529, 1420, 665, -880, -249, -54, -48, 1702, 1156, 746, 2548, -3055, 192, 1605, -395, 334, 1667, 300, -486, 909, -1694, -3376, -332, 339, -1323, -142, 1803, 313, 95, 697, -1444, -2907, -2675, -1202, 867, 1741, 3821, 974, -507, -471, -1059, -2286, -717, 1695, 1670, 1788, 1706, 1102, 875, 281, 368, -1452, -935, 247, 381, 789, 888, 2301, 547, 1328, -899, -721, -1493, -426, -876, 196, 2249, 2662, -264, -2791, -1747, 1017, 2622, 3083, 6382, 3910, 2626, 2343, 1794, -319, -2803, -3039, -5921, -6267, -5971, -3804, -1363, 1307, 2239, + 3784, 3690, 2601, 2541, 3286, 3125, 2823, 1754, 1226, 1051, -147, -253, -3700, -2672, -3318, -4034, -1713, -3947, -3180, -5788, -5053, -3622, -2424, -435, 2904, 3507, 2959, 3140, 2917, 5454, 7154, 6363, 6329, 5550, 5367, 3938, 3948, 736, -2852, -5829, -5562, -8290, -6922, -10056, -11932, -10614, -10012, -5994, -4078, 851, 2124, 4728, 6899, 9848, 8287, 10466, 7896, 4852, 2602 } + }, + { + {474, -112, -56, -127, 11, -145, 4, 68, 45, -21, -94, 72, 106, 6, -57, -46, -37, -90, 34, 20, 25, 63, 125, 123, 29, 97, 50, -53, 26, 42, -9, 15, 14, -14, 64, -4, 117, 102, -112, 85, 18, 69, 13, -11, 2, 210, 5, 69, 16, 59, 82, 16, -58, 123, -160, -14, 45, 132, 42, -21, 112, -13, -96, 30, 31, 20, -22, 11, -13, -72, 18, -33, -53, 38, -78, 58, -159, -422, -36, -66, -58, 8, -71, 28, 41, 175, -59, -5, -160, 14, 161, 13, 116, -32, 49, -65, + -101, 6, 111, -12, -138, -3, 135, 46, -56, -45, -5, -16, -30, 5, -21, -43, -4, 31, 21, -3, -104, 160, 216, 10, 27, -82, -47, 21, -109, -120, 77, -96, 76, 99, 98, 40, -11, 30, 23, 76, -149, 18, -16, -107, -147, 10, 80, -52, -2, -11, -5, 108, 58, 14, 55, -19, -72, 9, 52, -381, -98, 157, -30, -113, 42, -281, -120, -35, -61, -142, -166, 91, 121, 118, -156, -210, 15, -120, -240, 59, -24, 72, 251, -79, -37, -158, 215, 23, 102, 83, 175, 99, 47, -177, -30, -163, + -56, 13, -80, 62, 38, -74, -166, 104, 152, 51, -88, -116, -85, 43, -146, -168, -59, 89, -58, 46, 97, 71, -91, 159, 3, 136, -122, -92, -65, -64, 83, -51, -5, 152, 43, -2, -140, 28, -72, -77, 97, 140, 53, -84, 57, -38, 38, 261, 156, -217, 145, -119, -63, -30, 0, 112, 0, 304, 83, -115, -81, -74, 209, 51, 200, 68, 133, 215, 240, 94, -34, -24, 31, -197, -190, 59, -146, 79, 31, -47, -28, 58, 197, -67, -78, -105, 253, -35, -336, -163, -139, -119, 125, 130, 104, 171, + 65, 108, -17, -9, -17, 173, 43, 103, -242, 17, -5, 15, -3, 101, 47, 36, -120, 564, 139, 77, -57, -51, 69, 29, 167, 192, 4, 288, 133, -116, -85, -18, 156, -28, -65, 147, 36, 421, 127, 75, 32, -53, 34, 55, 98, -30, 15, 221, 47, 244, -114, -133, 99, 372, 126, 82, -18, -176, -50, 41, 27, -15, 30, -246, 33, -114, 110, 63, -76, 43, 99, 44, -93, -125, 45, 29, 19, -157, 57, -69, 113, -26, 38, 47, -1, 19, -26, 2, 343, 18, 120, -26, -39, 11, 45, -7, + 79, -122, -28, 134, -72, -196, -8, 335, -30, 264, 126, 363, 36, 37, 122, -97, -222, -278, 58, -140, 322, 192, 224, -41, -107, 32, 42, 112, 299, 39, 118, -139, 87, -99, 30, -53, 89, 179, 11, 170, 48, 86, -63, -40, 211, -53, -72, 170, -119, -10, 7, -76, -117, 74, -133, -23, -165, -311, -56, -49, -30, -325, -147, -101, -109, 119, 290, -80, 73, 160, -75, 32, 11, 8, -115, 96, -150, -425, 43, 218, 125, -242, -11, 4, 62, 79, -7, -190, -169, 19, 302, 133, 181, 290, -196, 205, + 399, -45, 94, -232, 82, 72, -187, -112, -37, 81, -189, -265, 53, 18, -215, 7, 73, -55, 471, -37, -328, -33, 118, 252, 100, 107, -209, 47, 70, -201, -10, -44, 327, 187, -52, -123, -250, 96, 102, -160, -4, 48, 99, 89, -128, -16, -28, 292, -256, 19, -69, 246, -19, -67, -110, -11, -82, -199, 153, 151, 45, -100, 24, 76, 485, 333, 239, 353, 135, -22, 45, 136, -352, 187, 1, 201, -144, -62, -228, 73, 392, -377, -249, -401, 206, -83, 11, -176, 22, -58, -189, 83, 91, -280, -40, 65, + -65, 167, -424, -192, 435, 57, -6, -28, 17, -205, -231, 29, -337, -62, 39, 108, -141, -16, 428, -9, 155, 333, -285, -82, 78, 95, 66, -69, -199, 260, -16, -199, 171, -13, 42, 72, -89, -39, -12, -802, -466, 381, -154, -160, 211, 208, -360, -456, -163, -154, -189, -17, -335, -218, 107, 28, -446, -464, -279, -115, -34, 263, -27, -162, 126, -382, 3, -1, 9, 157, 69, -273, -226, 193, 54, 669, 153, -197, 23, 41, 1, 191, 28, 92, -71, -122, 38, -353, -73, -142, -200, 64, -299, 368, -45, 166, + 248, 95, 132, 6, -158, 15, -17, -179, 265, -87, 467, 4, -5, 32, -109, -218, 77, -172, -75, 147, -132, 191, 578, -312, 262, 143, 188, -61, -355, 71, -113, -284, 596, -20, -200, -590, 349, 128, -35, -207, -295, 30, 603, 258, -55, -40, -302, -199, 152, 102, -244, -128, 188, 76, -42, 210, 258, 66, 351, 458, 230, -81, 60, 56, 35, 248, -362, 361, -63, -154, -303, 21, 183, 177, -353, 88, 201, 58, -270, -463, -488, 137, 145, 54, -224, 0, 297, -137, -324, -480, -11, 132, -420, 163, 243, -114, + 195, 143, -428, -86, 707, 501, 86, -125, -101, -82, -525, -183, -31, 339, -255, -110, -133, 24, 501, -392, -137, -5, 220, -69, -331, -491, 153, -335, -189, -204, -266, 89, -427, -179, 321, 541, -8, -317, -327, 499, -88, -252, 475, 27, -3, 32, -590, 235, -242, 210, 149, -369, -79, -375, 109, -364, -104, 162, 169, -118, 85, -445, 265, -31, 165, 180, 81, -98, -144, 450, -361, 222, -128, -371, -279, -13, 313, -174, 123, 31, -210, 77, 188, -47, -92, 305, 33, -169, -455, -4, -586, 116, 27, 294, -248, -36, + 122, 139, 136, -363, 514, 399, 45, 299, -153, -527, 102, -213, -281, 271, 597, 125, -200, -211, -529, 16, -6, 785, -333, 2, -7, -10, -495, -511, 382, 29, 202, -55, -626, -330, 12, -88, -161, -159, 352, -71, 214, -262, 501, -628, 275, 340, 155, 184, 115, 514, 213, -27, 58, 15, 442, 748, -129, 88, -246, 311, 378, -237, 147, -463, -640, -84, -816, -405, 309, -321, -726, 77, -395, 29, 7, -450, -445, 209, 416, 139, -498, 247, -559, -181, -209, 186, -232, -91, 262, 59, -186, -380, 414, 418, 522, 83, + -61, 33, 167, -25, 215, -222, 283, -96, 327, 278, 198, -78, 15, -490, 175, -110, 385, 87, -884, 154, 444, 608, -332, -444, 561, 270, 397, -673, 353, 888, 926, 79, 35, 542, -346, -458, 320, -507, 211, -193, -159, -104, -1014, -474, -378, -129, -492, -897, 682, 89, 218, -103, 478, 29, -438, 342, 117, -134, -270, -184, 47, 134, 421, -234, 327, 125, 608, -881, -257, -127, 99, 381, 515, 135, -446, 306, 401, 366, -114, 137, 10, -133, -76, 39, 120, 62, 294, 64, -404, 377, -417, -502, 66, 385, -194, -122, + 123, 193, 310, -174, 141, 734, -299, -762, -1005, -498, -681, 311, 586, 376, 145, 350, 214, 374, -313, 406, 229, 135, 426, 461, -22, 58, 912, 90, 143, -188, 332, -1043, -461, -712, -737, 295, -643, 635, 721, 35, 157, -107, 133, -679, 283, 760, -428, -876, 119, -327, -277, -854, 153, 320, 1, -111, 281, -484, -76, 324, -170, -428, 59, -211, 456, -291, -157, 426, 373, 782, 112, 194, -61, 215, 288, 486, -126, -9, -284, 639, -782, 862, 47, -335, 419, -305, -207, 791, -1112, 189, -213, 224, -408, 209, 485, -237, + -2, -98, -120, -80, 811, -778, -79, 875, -482, -445, -711, 77, -276, -229, -405, -486, 615, 278, 30, 303, 730, 447, -60, 161, 488, 644, -572, 273, 522, 241, 186, 743, 344, 163, -31, 340, -46, 383, 299, 179, -351, 659, -541, -55, 803, 814, -200, -700, 259, 1, 688, 1210, 259, -171, 76, -674, -89, -168, -156, 28, 604, -248, 261, 751, 117, -664, 442, -17, 278, 709, 965, -254, -266, -61, -780, -1104, 22, -479, -90, -558, -57, 16, 83, 413, -79, -268, 766, -1433, 791, -605, -1405, -420, -350, -52, -319, 170, + -384, -875, -521, -262, -72, 100, -352, 352, 693, 26, -34, 189, 52, -126, -244, -141, 196, 206, -49, 196, 853, 235, -232, -830, -119, 594, -703, -333, -258, 13, -38, 458, -132, 59, 641, 227, 710, -92, -306, -144, -156, -173, 356, 42, 249, 428, -716, 115, -169, -455, -319, 730, 553, 33, -321, 153, 341, 39, 249, -479, -1151, -558, -376, 426, 191, 69, -221, -121, 27, 432, -583, 697, -74, -1054, 200, -499, -127, -59, -147, -665, 195, 54, 521, -1150, -1, 593, 49, -260, -611, -29, 319, 521, -439, -133, 252, 592, + 505, -492, -124, -808, 363, 432, 238, -221, -85, -211, -108, -262, 58, 613, -244, -225, -227, -330, 661, 595, -78, 833, -58, 300, -749, 604, 247, -817, -284, 940, 371, 253, 166, -446, -363, -483, 803, -436, 622, 632, -742, 1663, -359, 988, 14, -234, -352, 581, 415, -736, 49, 411, 701, 58, -594, 284, -1145, -306, -1042, -1437, 41, -556, 175, -113, -235, -553, -387, 311, 848, -730, -170, -1251, -1105, 286, 417, -696, -733, 28, 136, -1169, 37, 4, 572, -538, -5, 472, -352, -625, -702, -352, -645, -530, -674, 862, -1173, -737, + 985, -69, 246, -898, -196, -286, -26, 1405, -257, -74, 89, 629, -41, -691, -343, -517, 94, 1672, 271, -676, 1238, 875, -907, 887, 1495, -29, -635, 987, -212, 752, 843, 89, 136, -326, 742, -1982, -1298, -1265, -519, -820, 1039, 486, 841, -65, -1810, -196, 221, 1272, -111, 350, 1042, -341, -859, 154, -113, 1468, 849, -382, -692, 1556, 46, 816, 299, 1457, 1136, 997, 41, -703, -481, -519, 1100, -478, -846, -354, -13, 45, 456, -424, 130, -2267, 211, 443, 334, -903, -962, 360, 777, -934, 345, -496, -499, -599, -110, 802, -530, 873, + -247, 392, -1508, -862, -77, 853, 500, -957, -1126, -437, 30, 1208, 344, 23, -821, -692, -219, -182, 351, 2663, 257, -1402, -3194, -274, 1879, 490, 816, -71, 1141, -176, 499, -248, 646, 936, 486, -425, -1053, 1258, 1404, -294, -1391, -823, 147, 835, 272, 317, 56, 234, 99, 234, -266, -1580, -1, 1028, 776, -284, 90, 648, 1357, 860, 674, -753, -534, -96, -126, -1159, 872, 548, 908, 1851, -902, -549, -54, -451, -400, -737, 1433, -794, -875, -885, -285, 1846, 505, 754, 10, -90, -350, 1119, 849, -359, -898, 402, -80, 298, 23, -843, + 148, 1955, 1646, 168, 201, -1181, -2045, -1937, -827, 1452, 1754, 1659, 1046, -327, -1016, -1092, -581, 365, 767, 1116, 200, -974, -672, -237, -671, -425, 263, 1159, 1849, 1067, 641, 430, -997, -197, -2106, -2537, -1441, -812, -569, 1088, 1920, 1937, 1925, 1502, 768, 40, -636, -274, -1095, -2231, -49, 137, 345, 653, 569, 661, -2276, -1391, -714, -1473, -436, 966, -456, 620, 275, -729, 698, -657, 706, 521, -201, -971, -1264, -1635, -646, 326, 332, -3604, -1873, -925, 1224, 340, 4682, 4857, 3630, 4748, 4922, 4534, 3231, 2998, 3265, 1394, -125, -1858, -2995, -4103, + -4038, -5996, -3634, -2259, -1817, -2558, -1319, -196, -1918, -1381, -1536, -152, -852, -115, -1196, -432, 1006, 1130, 458, 51, 1111, 1046, -1837, 776, 1651, 3434, 2518, 3315, 1487, 1586, 5178, 3092, 5313, 2152, 5022, 3743, 4450, 6055, 5608, 4825, 5175, 5919, 6196, 5598, 6132, 4595, 6215, 5387, 4571, 5206, 2951, 5854, 3213, 2826, -368, 2164, 36, 1043, 325, 1305 }, + {461, -50, -77, 21, 34, 127, -33, -75, -124, 135, 12, 45, 135, 38, -21, 35, 71, 47, -72, 157, 16, -204, -39, 136, 53, 15, -74, -43, 67, -25, 270, -48, 61, 11, 25, -151, -52, -31, 56, -20, 33, -86, -48, 58, 86, 60, 102, 105, 67, -91, -144, 19, 85, 95, 71, -50, -63, -223, 115, -53, -86, -14, -38, 46, -106, 47, -134, 59, -126, 117, -48, 96, -31, -13, -131, 8, -237, -461, -84, 9, -109, -215, -75, 163, -260, -139, -88, -47, 79, -33, 88, 45, 77, -5, 96, -82, + 14, -34, 16, 251, -55, -12, -125, 157, 93, 77, 189, -94, -57, 69, 169, -42, -13, -134, -153, -97, 106, -130, -117, -10, 152, -204, -46, -169, -86, -45, 23, -11, -126, 165, 26, 149, -59, -32, -180, 1, -63, -63, 103, 63, -32, 61, 115, -27, 49, -75, -45, -12, -70, 59, 17, 38, -87, 103, 42, -378, -141, 113, -105, -42, -46, 55, -23, -97, 155, 146, 44, -15, 70, -193, -33, -191, -102, 146, -28, 29, -24, -19, -1, 302, 269, 125, 142, 176, -38, -17, -64, 156, -20, -55, 38, -86, + 56, 113, -62, 127, 135, 276, -112, -126, 111, -68, -2, 61, -165, 13, -90, -90, 204, 127, 145, -83, -122, 84, -141, 97, 398, 27, 19, 97, 30, 43, 219, -115, -43, 52, 17, -93, -73, -104, -75, -113, 122, 193, -92, 95, 308, 101, 71, -216, 179, 45, -275, 115, -76, -167, 68, -25, 65, 158, -167, -179, -78, 239, 8, 117, 250, -372, -298, 46, 183, -136, 13, 245, 64, -34, -74, 294, 37, -74, 42, -271, 31, -150, 137, 21, 146, -76, -36, 63, 5, 16, 9, 137, 113, -156, 88, 120, + -209, 22, -94, 36, -47, -166, 4, 135, 124, 265, -163, 201, -132, -30, 123, -125, -159, 613, 279, 370, -28, -106, -132, -138, 76, -117, 174, -23, 238, 11, 127, 151, 122, 99, 138, -461, -133, -47, -94, -89, -142, -330, 17, 219, -136, 130, -109, -167, -121, 14, -102, -44, -105, -13, 271, 9, 123, 165, 223, -110, 54, -56, -169, 187, -107, -15, -167, 116, 0, -5, -45, -87, 60, 165, -70, 88, 95, 68, 301, -311, -123, -4, -161, -227, -79, -273, 46, 278, -188, -122, -201, -14, -35, -108, -149, -18, + 198, 267, -145, 136, -117, -66, -42, -345, 253, -78, -29, 385, 250, 255, -99, 4, 54, -66, 94, -205, 2, -142, 168, -161, -99, -22, 35, -197, 45, 15, 260, -4, -335, 192, 195, 259, -33, 61, -181, -149, -50, -145, 65, 30, -42, -27, 154, 218, -296, -73, 11, -132, -119, 196, -151, 70, -147, -219, -144, -112, 88, 22, 395, -73, -86, 103, -96, -44, -80, 85, -66, 108, -45, -76, 107, 104, 44, -466, 449, 248, -275, -268, 108, 365, -9, 111, 415, 146, 122, -66, 214, 205, 226, -409, -258, -246, + 195, 177, 215, 16, -257, 110, -42, 120, -367, 147, 218, -164, 93, 185, 47, 1, 36, -51, 317, 223, 168, 13, 109, 253, -221, -111, 9, 332, 206, 135, -246, 17, 166, 202, -69, 68, 189, 243, 74, 225, 86, -15, -200, 8, -333, -127, -159, 39, 111, -179, -75, -329, 151, -81, -11, 181, 199, 306, 70, 390, 134, -76, -173, -482, -221, 282, -93, -444, -107, -78, 75, 232, 376, -30, 117, -93, 192, -214, -210, -244, -409, 214, 136, -359, 20, -265, -88, 215, 136, 174, -43, -59, -51, 386, 318, 317, + -140, -292, 231, -49, -90, 270, 60, 265, 1, 142, -185, -23, 150, -609, -80, 15, -426, 98, -100, 391, 271, -265, 32, 354, -26, 171, -112, 236, -104, 29, -81, -15, 189, -252, 269, 90, 99, 34, 325, -960, -200, 513, -412, -151, 441, 164, -135, 46, -358, 324, -36, -582, 47, -29, 226, 218, -109, -454, -189, -171, 17, -240, -126, -307, -81, 344, -269, -134, -97, -175, -181, -253, 188, 43, 231, 46, -151, -243, -236, -42, 178, 254, -73, -211, 247, 108, -334, -377, -778, -57, -237, -140, 135, 135, 91, 372, + -18, -154, -1, -166, 427, 235, -57, 237, -206, 134, 117, -199, -73, -174, 163, 107, -309, 204, 333, -109, -41, 194, 613, -274, 218, -133, -25, 388, -129, -139, -110, -11, 41, 271, 814, -23, 27, 256, 30, 27, -416, -385, 39, 79, -281, -108, -84, 256, -128, 68, -30, 125, -130, 513, 246, -205, 244, 268, -322, 75, 100, 122, -109, -76, 380, -332, 124, 475, -185, 81, 261, -6, 222, 164, -26, 165, 185, 324, 155, 52, -44, -175, -260, 39, -10, -680, 428, -73, -260, -205, -554, -520, -401, 133, 202, -8, + -66, 7, 173, -40, 852, 873, -34, -708, 130, 155, -93, 195, 97, 70, -20, -115, 687, 135, -125, -772, -451, 189, -62, -266, -481, 70, 64, 125, -132, -508, -562, 596, 543, 178, 496, -437, 41, 233, -112, -277, -522, -246, 68, -20, -258, 243, -19, 236, 166, 13, -564, -313, -280, -44, 27, 70, -122, -154, 6, 86, -515, -123, 43, 106, -257, -605, -182, -153, 401, -17, 152, -198, -203, -260, -355, -156, -35, 9, 287, -100, 27, 292, -160, 185, -130, 405, -223, 95, -175, 59, 69, -206, -190, -392, -496, -276, + -150, 8, -19, -228, -269, -453, 202, -454, -654, 433, -405, -445, 411, 115, -132, 505, 242, -338, 309, -910, -97, -211, -134, -411, 741, 395, -261, 146, 209, -130, 234, 37, -24, -188, 224, 335, 370, -605, -62, 30, 149, -255, -152, -260, -333, 542, 119, -344, 149, -199, -299, -371, -793, 234, 432, 78, 413, 665, -116, -166, -582, 75, -269, -20, -527, 62, -1188, -814, -567, 303, 605, -857, 207, 593, 382, -17, 231, 558, -249, -42, -153, 9, -356, 254, 18, 23, 109, 752, -26, -343, -313, 174, 573, -233, -552, 161, + 582, 324, -62, 269, 202, 259, 75, 218, 402, -55, -632, 26, 218, -614, -425, 588, 486, -466, -281, 139, -10, 285, 746, -163, -117, 130, -13, 260, 159, -272, -180, -108, 242, 183, -161, -534, -57, -787, 751, 92, -80, -17, 335, 2, -60, -146, -49, -463, -21, 79, -569, -151, 425, 553, 391, 1034, 622, 935, 347, 244, -488, 523, -181, -64, -393, -264, 505, -172, 1150, 531, 328, -69, 261, -189, -545, -281, -341, 234, -322, -17, -344, 187, 463, 413, -35, 601, 505, 11, -186, -248, -428, -159, 957, 359, 1104, -376, + -3, -56, 251, 874, 298, 1, 566, 636, 687, -86, -416, -176, -119, -147, 457, 283, 431, 624, -412, 927, -637, -1205, -147, -384, 106, 408, 584, 998, -505, -367, 336, -276, -69, -120, 117, 447, 448, 700, -762, 859, -317, 92, -401, 366, 624, 276, 106, 59, 765, 206, -37, -241, -128, -781, -117, -371, -967, 98, -65, 409, -1006, -178, 228, 388, 828, -211, 238, 473, 65, -96, 233, -200, -58, -1225, 109, -508, -624, -672, 284, -1093, 373, -391, -557, -731, 693, 779, 740, 189, 142, 737, -956, -46, -289, 440, -1122, -340, + -106, 409, 264, 259, 328, -342, 245, -314, -69, -889, -32, -307, 1056, 239, 744, -232, 1021, -633, -1231, 293, 194, 157, -616, -670, -550, 222, -553, 259, -297, 833, -272, -101, 579, 40, -1463, -583, -24, 984, -114, -276, -838, 170, -207, -693, -852, -72, 157, -266, -322, -825, 562, -183, 206, -394, 25, 283, 162, 784, 17, -227, -968, -312, 486, -636, -327, 283, 555, 455, 1091, 855, 36, 660, 662, 259, 53, 413, -287, 1640, -701, -1643, 455, -1309, -79, -934, -4, 1197, 711, -1060, -648, -456, -325, 382, 678, -408, 80, 543, + -1121, 57, 311, -902, 493, -318, 440, 124, 492, 24, -523, 563, -695, -184, 1476, -609, 570, -362, 636, 516, -139, -646, 716, 1714, -898, 229, -1209, 621, 437, -700, 811, 56, -1458, 203, 131, 677, -127, -119, -735, -785, -335, 1881, -224, 950, -778, 623, 376, -181, -579, -126, 602, 1058, -315, -359, -42, 208, 999, -236, -141, -699, 261, -1009, -374, 688, 678, 216, -9, -636, -637, 212, -1044, 752, 592, -1242, 52, -617, 10, -1374, 1382, 1343, -205, -584, -305, -188, 631, -646, 836, -1132, -778, 425, 354, 179, 339, 1237, 257, 616, + 66, 638, 317, -173, 39, 556, -109, 50, 845, 505, 1134, -17, 612, 97, -963, 1003, -546, 0, 200, -734, -647, 432, 1236, 830, 394, -1583, -478, -1071, -95, 2027, 1166, 1567, 27, -1257, 347, 1562, 208, -201, 1167, 300, 734, -1971, -1880, 1455, -204, -413, -1568, -66, -827, 330, -221, 284, 498, -1190, 672, 1055, 5, 403, -968, 764, -480, 399, -41, 66, 517, -120, 309, -61, -797, 255, -130, 867, 620, 1064, 249, -702, -719, 713, 639, 402, -27, 296, -294, -560, 9, -164, 787, 690, 437, 775, 613, -924, 983, 1154, 672, -457, + -600, -611, 825, 644, 1433, -866, -1091, -638, -1543, -261, 1338, 346, 1004, -1140, -1528, 420, 652, -1035, -34, -780, 132, -897, -356, 727, 216, -658, -14, -445, -1818, 357, 1008, 1497, -69, -526, -32, -2407, -509, -42, 13, 864, -2277, -241, 1002, -1652, 353, -367, 1915, 1036, -1214, 300, 1275, 138, -553, 433, 278, 172, -62, -132, 61, 210, 405, 1337, 1030, 1165, 754, 1467, 669, 1498, 569, 1325, -38, 813, 691, 802, 570, -89, 182, -1062, -682, 1923, -46, -823, -293, 572, 957, 2064, -365, -1216, -668, -915, 1117, 1311, 1450, 408, -149, 966, + -1866, 1533, 517, -938, -111, -2836, -29, -1851, -2481, -666, -1407, -831, 2041, 1611, 1990, -1109, -1328, -663, 1727, 2117, -1755, -1594, 531, 1855, 37, -855, -3, 511, 545, -1514, 558, -192, 795, -825, -413, -968, 1025, -126, -470, -902, 659, 415, -174, -756, 347, 364, 166, -663, -116, -11, 773, -571, -167, -845, -254, 334, 670, -874, -376, 1007, 798, -213, -620, 41, -336, 858, -503, -202, 348, 353, 445, -380, 86, -541, 646, 914, 330, 216, -727, 837, -607, 1256, -933, 1040, -1547, 1099, 8, 50, -1103, -93, 145, -33, -100, -78, -46, -387, + 1692, 1779, -1044, -635, 365, 1700, 1073, 626, 623, -283, -706, -228, 411, -18, -159, 498, 18, 348, 53, -203, -632, -183, -28, 35, -16, -533, 590, 84, -225, -26, -9, -5, 384, 676, 303, 56, -240, -371, -84, 210, 471, 608, -338, -357, 87, 615, 293, 126, -275, -585, 497, -115, 23, 19, 166, 136, -59, -36, -363, 42, 337, -172, 203, -125, -258, 153, -43, 70, -13, 235, 147, -423, 72, 58, -476, -722, -608, -2205, 929, 3437, 3144, 2709, 1062, -2545, -1615, -2286, -2590, -2290, -684, 511, 1927, 2035, 2407, 1617, 1604, 54, + -1716, -1612, -2019, -1554, -887, -45, -576, 623, 736, 1231, 1322, 1372, 794, 83, 345, -285, 178, -915, -691, -845, -1420, -1100, -870, -588, -1014, 153, 1688, 1941, 1060, 2030, 483, 1192, 588, 361, -523, -1060, -1490, -2054, -1604, -2345, -995, -1035, 661, 696, 1960, 2296, 2008, 1822, 1743, 1124, 138, -525, -1752, -1092, -2261, -1939, -2602, -943, -850, -18 } + }, + { + {339, -67, 95, 46, -173, 47, 149, -58, -25, 46, -66, -162, 171, -39, 300, -3, 31, 129, -184, -62, -198, -35, -88, 82, 137, 32, -63, -13, -5, 132, -104, -66, -141, 105, 55, -1, 19, -114, 90, -134, 12, -69, 110, 89, -151, 14, -181, 7, 59, 64, 75, 59, 19, -105, -80, 41, 67, -76, 174, -59, 22, -43, -13, 24, -26, 126, -96, 247, 41, 35, -62, -10, 7, 33, -7, 4, -155, -164, -130, 34, -74, -15, -19, 74, 312, -86, 34, -297, -158, 86, -137, -112, -38, -127, -30, 253, + -107, -168, 280, 218, -75, -55, 256, 68, 101, 45, 15, -69, -104, 97, -76, 71, 30, 25, -32, -91, -65, 58, -75, -129, -53, -60, -155, 174, 280, -164, 94, 2, -58, 38, -3, -4, -88, 165, -97, -132, 147, 36, -2, -24, 84, -4, 4, -59, -17, 137, -202, 60, 50, -65, -28, -91, -52, -21, -486, -77, -178, -44, 39, -133, -296, 217, -73, 50, 146, -47, -15, -18, 67, -52, 244, -11, 189, 276, -332, 69, 231, 15, 46, 159, 295, 42, -67, 148, -40, -78, 66, 52, 66, -84, 301, -140, + 76, 111, -2, -16, -147, 23, -170, 142, -174, -134, 96, -163, 111, -114, 46, -92, 61, 130, 256, 78, 29, 124, 2, -222, 29, 62, 84, -57, 11, -31, 40, 120, 70, 159, 61, 23, -88, -32, 79, 66, -112, -176, 131, 86, 26, 167, -10, 94, 226, 141, 296, 57, -45, -305, 46, -187, -64, 23, 67, -118, -2, 292, -153, -9, -153, 70, -2, 56, 116, 140, -93, 104, 105, 210, 4, -210, 15, 223, -27, -16, -37, 149, -182, 13, 109, 149, 174, -70, -126, -17, 252, 22, 85, -214, -105, 50, + 33, -38, 126, -11, -41, 76, -147, 8, -36, 91, 123, -205, -65, 70, 114, -77, -100, 68, 125, -10, 46, 86, 35, 522, 263, 202, -190, -42, -268, -203, 301, 20, -180, -93, 69, -183, -10, 292, 126, -20, 102, 432, -287, 63, -49, -150, 258, 121, 136, -106, 118, 137, -40, 85, -25, -133, 31, 39, -17, 141, 41, -62, 169, -83, -74, -103, 50, 55, 15, 110, 19, 364, 27, -8, -84, -85, 91, -284, 13, 159, 133, -156, 219, -2, 98, 170, -51, 131, 103, -52, -161, -121, 93, 239, 62, -97, + -46, -46, 126, 124, 37, 342, 89, 202, -7, 41, 60, 52, -56, 205, -88, 222, -111, -95, 60, -158, -43, -55, 64, 87, -62, -229, 99, -276, -110, -55, -9, -52, 49, 229, 131, 5, -253, -250, 3, 149, -91, 13, -37, -119, -167, 3, 100, 217, 199, -41, 57, -304, 88, 177, 207, -43, 187, 26, 276, 154, 41, 113, -29, -94, -68, -48, 164, -89, -123, -146, 159, -61, -334, 46, 91, 144, 189, 327, -110, -61, 157, -481, 245, 293, 64, 241, 59, -256, 1, -131, -35, 221, -291, -109, 134, 103, + 308, -77, 147, -467, -203, 94, 289, -194, -100, -206, -200, 98, -3, -17, 109, 21, 113, 327, -184, 317, 7, 49, 101, 54, -75, 98, -211, -64, -102, -44, -149, 195, 66, 574, 48, -57, -121, 8, -96, 292, -161, 23, -316, 242, 271, -305, 208, 161, 108, -174, -124, 243, 103, -393, 216, -192, -45, 43, -34, 12, 115, -7, -61, -80, 200, 42, -6, -167, -288, 105, -155, -58, 277, -374, -157, -274, -28, 243, -22, -192, -272, -301, 120, 330, -92, 208, 307, -79, -68, 126, 172, 369, -50, 210, 33, 437, + 320, 94, -97, 51, -234, 426, 102, -176, -199, 250, 210, 156, 111, 81, 224, -83, 104, -133, 30, 22, -208, -279, -93, -194, 143, -113, -80, -304, -185, 73, -93, -25, 169, 330, 417, 217, 184, -130, -290, 7, -190, -414, 27, -25, 96, -597, -198, 44, 286, -202, 135, 106, -22, 457, -70, 431, -257, 135, 123, 17, -393, -147, -153, -423, 139, -96, 83, -15, 149, 12, -179, 104, -289, 220, 113, 491, -28, 28, 428, -371, 331, 429, -267, 282, -118, -111, -224, 70, 44, 310, 184, -60, -128, -235, 132, 173, + -293, -113, 265, -455, 41, -347, 203, 38, -9, 129, -125, 61, 435, -161, 95, 231, 133, 42, -226, 111, 79, -108, -326, 11, -35, -226, -244, 717, -264, 135, 108, 253, 85, 151, 365, -284, -167, -28, 506, -199, -209, -254, 129, 79, 279, -578, 10, 7, -34, 290, -67, 222, 426, -311, -132, 115, -225, -293, 199, -273, 401, -72, -403, -59, -229, 125, 329, -11, 169, -24, 68, 380, 18, 274, 116, -213, 224, 182, 32, 152, 559, -96, -241, 127, -306, 20, 535, 175, 93, -106, -141, -108, -176, 309, -196, -60, + -109, 337, -593, 174, 230, 305, 126, 7, 1067, 318, -193, -259, -217, 774, -664, 54, 264, 40, -358, -80, 185, -36, 46, 323, -327, -275, 142, 422, 263, 112, -197, -194, -184, -217, 214, 88, 304, 244, 144, -308, -141, -329, -57, -213, -497, -87, 238, 59, -224, -228, 18, 132, 330, 50, 175, 56, 628, -521, 364, 77, -526, -86, -145, -121, 103, -224, 165, 118, 266, -282, 130, 489, 250, 769, -140, -5, -152, -78, 51, -15, -595, 263, -52, -370, 99, 181, 5, -233, -141, -488, -552, 103, -239, -133, 94, -20, + -48, -267, -115, -18, 208, 195, -300, -194, 204, -294, -128, -471, 448, -74, 404, 17, 156, 403, 326, -205, 103, 196, -219, -110, 215, -97, -499, -113, -348, 499, -50, -158, -293, -453, 158, 70, 105, 192, 7, -101, 225, 34, -41, 56, -124, 319, -81, 192, 639, 118, 119, 124, 234, -583, -450, 143, -472, 312, -52, 275, 64, 557, 200, -208, -35, -920, -627, 225, -244, -538, -790, -32, 72, -168, -120, 748, 207, -564, 122, -350, -276, -288, -486, -96, 50, -693, -637, -260, 110, 47, 392, 312, 207, -180, -4, 132, + -345, -212, -117, 96, -326, -219, 223, 115, -10, -71, -63, 164, -472, -289, -235, 289, -369, 224, 412, 548, -45, 140, -144, -298, -367, -122, 341, 106, -653, 2, 650, -468, 4, -121, 18, 132, 306, -92, 70, 327, 239, 149, -286, -361, 103, -378, -556, 318, -455, -742, 113, -441, -296, 932, 36, 704, 585, -97, 618, 915, 607, -769, -131, -344, -400, -203, -9, -302, 669, 232, 355, -299, 339, 307, 67, -387, -348, 687, -147, -589, -68, -687, -130, 226, -283, 44, -610, 296, 500, 314, -106, -257, -135, -43, -128, -238, + -745, 514, 243, 284, 273, -375, 601, 111, -222, -107, -535, -188, 293, 237, 507, -21, -654, -1043, -100, 27, -44, -319, -524, 16, 240, -110, -347, 201, 1150, 735, -110, -667, 136, 342, 188, 498, 731, -319, 55, -652, 180, 61, -262, 1193, 443, 1030, 416, 271, -899, 21, 491, 98, -482, 208, -733, -276, 43, 227, -225, -133, 150, 137, 45, 652, 392, 115, -266, 453, -297, -197, -433, -131, 542, -861, -24, 402, -446, -125, 154, 160, 794, -33, -22, -362, 773, -335, 84, 99, 528, -109, -216, 540, -899, 252, 59, -337, + 663, -820, -149, -262, -512, -219, -175, 324, 291, 595, -1088, 279, 93, 1323, 345, 225, 0, 632, 217, -1020, -112, 1036, -273, -249, 133, -97, 69, -216, 1152, 1236, -629, 285, 389, 164, 409, -573, -711, 570, 218, -440, -673, -236, -188, 653, 610, 292, -554, 326, -200, 203, 109, 274, 705, 132, -1331, -444, 341, -576, 258, 587, 292, 1031, -249, -1578, 65, -636, 652, 459, -56, -346, 605, -767, -4, -425, 496, 467, 569, 421, -175, -668, -1619, -951, -871, 76, -398, -582, -145, -415, 852, 16, -597, -294, 197, -334, -54, 31, + -1502, -180, 942, -1124, 82, 469, -19, 339, -118, -882, -108, 535, 138, 781, 475, -753, -883, -79, -399, -87, -1434, 559, 527, 1016, 418, 927, -415, 156, 892, -259, 974, 310, 502, 210, -281, 524, -633, 58, 1239, -953, 67, -1250, -598, -893, -646, -137, 48, -280, -992, -156, -1632, 1841, 626, 26, -257, -431, 96, -799, 147, -1205, 34, 55, 264, 744, 1119, 44, -1581, -772, 851, -441, -33, -392, 319, -710, 496, 850, 287, -367, -529, 257, -678, 1050, 839, 1325, -963, -1143, -317, -17, -613, 781, 907, -685, -35, -1230, -399, -579, + -1152, 359, 883, 563, -765, -277, 43, 624, 48, -42, 186, -68, -363, -998, -731, 259, -148, -544, 533, 524, 275, -1023, -998, 881, 465, 655, -740, -1709, -400, 717, 631, -177, 1636, -216, 1636, -2605, -3333, -1328, -2061, 27, 638, 411, 1973, -218, -279, 417, -561, -1459, -1503, -1422, 770, 677, -675, -124, -1321, 138, 443, -1323, 1161, 758, 410, 956, -537, 305, -1638, -900, 515, 552, 355, 142, 277, 361, -143, 1858, 239, 1125, 410, -667, 1542, -287, 644, -57, 593, -146, 32, 232, 804, 122, 605, -59, -48, 1068, 196, -348, 85, -197, + -522, -276, 395, 105, -1247, -437, 236, 185, 1448, 998, -1288, -881, 189, -437, 1597, 5, 1483, -1134, 795, -18, 178, 480, 1547, 752, 314, 1070, 640, -815, -1080, 831, -723, 400, -888, -154, -1714, 1626, -248, -29, -123, -2071, -591, -98, 171, 263, -1381, -699, 1155, -388, 399, -450, 77, 1595, 2394, 258, -121, 1315, 501, 603, 1479, 134, 887, 1212, 1041, -308, 440, 1069, 1316, 1207, 1625, 1047, 2083, 2346, 1599, 1902, 1204, 4, 591, 455, -455, -306, 355, 1186, 247, 208, 9, 677, 1555, 1369, 2605, 703, -1319, 724, 52, 745, -661, 1233, + -1841, -2193, 706, 2659, 1089, 732, -2984, 278, 1173, 2091, 2430, -736, 144, -3611, -2496, 1300, 1121, -1203, -1949, -360, 2659, -694, 1918, 2375, -2665, -961, 886, -613, 394, -835, 756, -691, 101, 101, -475, 297, -46, -142, -271, -533, -258, 240, -11, -546, 527, -493, -292, -414, -28, -393, 917, 75, 181, -175, 181, -193, 204, 706, 754, -136, 201, 397, 655, -369, 394, -321, 804, -148, -574, 368, -291, -187, 33, -2, 314, -129, -564, -419, 19, 159, -925, 323, -179, -38, 117, -208, -171, 115, -147, 132, -450, 531, -1429, 728, -528, 947, + -492, 585, 106, -419, 1944, 1171, -637, -742, -62, 2406, 1010, 331, 669, -592, -737, 198, 468, 114, 42, -266, -201, 217, 230, 551, 248, -314, -136, -161, -308, -16, 50, 137, 186, -8, -86, 210, -653, -261, 282, 397, 505, -305, -175, -324, 515, 343, -108, 147, -614, -544, 473, 354, 108, -941, -483, 14, 141, 578, 419, -95, 164, 184, -300, 230, 271, -119, -188, 132, -319, -11, -60, -254, -323, 396, 113, 34, 550, 477, 139, 420, 433, -701, -1914, 660, 3535, 2772, 2664, 846, -2468, -1488, -2187, -2203, -1999, -704, 1084, 1387, + 2193, 1956, 1185, 194, 197, -954, -1498, -2153, -824, -587, 196, -124, 1093, 733, 315, 1454, 820, 621, -126, 546, -989, -748, -617, -723, -951, -573, -380, -965, -669, 257, 1417, 1372, 1553, 1227, 1777, 313, 450, -1181, -885, -746, -1787, -1760, -1597, -739, -943, 230, 673, 1008, 1979, 1983, 1857, 1706, 1442, 350, -852, -1252, -2318, -1861, -1322, -1620, -727, -406, -578, 369, -305 }, + {356, -122, 93, -14, -10, -110, 62, 163, -92, -42, 23, -70, -115, 18, 2, -109, -187, 150, -78, 257, -14, 144, -204, -9, 74, -45, -108, -45, -77, -13, -64, 7, -13, -95, 59, -127, 150, -53, -41, -24, 178, 167, 7, 124, 79, -39, -37, 166, -82, -190, -2, -41, 207, 11, 26, -130, 1, -68, -72, -35, -77, 57, -112, -49, 29, -40, -120, -166, -2, 97, 50, 81, 5, -12, 37, -18, -113, -117, -199, 74, -102, -175, -130, 95, -245, -120, -298, 110, 118, 174, 78, -90, 207, -138, 33, 15, + -42, -147, -91, -163, -4, -63, 86, 74, -93, -16, -30, -148, -18, -25, 60, 7, 133, -41, 171, -68, -9, 40, -144, 102, -52, -41, 4, -26, 58, -268, 117, 178, 12, 105, 39, -113, -29, -124, 169, -38, -127, 120, -181, 17, 51, -181, 9, -35, -85, 75, 0, 28, -93, -36, -264, -21, 21, -22, -437, -259, 46, -139, 25, -144, -252, -164, 282, 168, -46, 195, 44, 50, 52, -90, -27, 159, -127, 74, 113, -119, -195, 92, -159, 21, 89, 235, -54, -108, -99, 40, 125, -167, -3, 145, 54, 19, + -10, -9, 182, -2, 167, 115, -44, 115, -40, -4, -18, -300, 105, 179, -101, -50, 41, 54, 48, 35, -18, -28, 9, -68, 208, -84, 23, 125, 88, -63, 78, 38, 47, 120, 90, -115, 121, 150, -59, 6, 10, -166, 214, 151, 335, -50, 30, 111, -172, -28, 60, -62, -232, -6, 18, 158, -188, -437, -365, -214, 79, 219, -219, 127, -111, 171, 121, 118, 189, 117, -160, -134, 20, 113, -15, 17, 267, 6, 41, 145, 137, 33, -3, 348, -31, -118, -46, 87, 91, -56, 174, 46, 89, -120, -125, -33, + -86, 56, -70, 211, -239, -190, 236, -11, -22, -272, 76, -121, 140, -99, -329, 8, 130, -100, 146, -68, 42, 145, -67, 535, 120, 146, 56, -117, 251, -116, -77, 329, -29, 266, -32, -293, 101, -96, 324, 179, -27, -289, -210, 278, 318, -371, 184, 157, 109, -19, 32, 38, -33, 379, -22, -57, -107, -118, -164, -46, -13, -208, -82, 64, -155, 16, 3, 231, -89, 16, 98, 18, 208, 106, 216, 120, 61, -224, 18, -163, -169, 51, 219, 4, 186, -67, -156, -19, -1, 75, 121, -41, -18, -47, 50, 74, + -184, 59, 23, 152, 103, 122, 339, 181, -151, -131, -371, -22, -11, -195, 71, 296, 32, -231, 212, 206, -25, 83, 204, 50, -193, -29, 436, 217, 41, -291, -109, 265, 86, -40, 143, 133, 134, -2, 267, -3, -42, 68, -143, -179, -16, 29, 94, 54, -174, 167, 288, 150, -17, 218, -261, 141, -160, 154, -53, -183, -21, -238, -397, -143, -167, -22, -17, -205, 23, -64, 99, 76, 116, -23, 35, -185, 15, 45, 179, -7, 26, -370, -228, 499, -101, -122, 40, -28, 557, -170, -284, -3, -280, 62, 242, 239, + 90, -517, 427, -338, 185, -235, -160, -136, 219, 213, -324, 16, 158, -115, 79, 88, -110, 4, -264, -197, -414, 241, -47, 419, -188, 82, 300, -84, -72, -139, 342, 228, -390, 102, -214, -90, -74, -241, 151, 58, 371, 236, -430, -88, -175, 245, 108, 6, -242, 21, -7, 200, -14, 4, -265, -30, 235, -214, 67, -65, 2, -137, 79, 16, 57, 122, -135, 7, -287, -39, -332, 49, -82, 188, -12, 159, -227, -433, 92, 285, 38, -39, 226, 148, -352, -10, -133, 441, -20, 47, 34, 0, -15, -165, 351, -35, + -501, -99, 301, -201, 49, -14, 39, -69, 46, -98, 117, -198, 178, 246, -201, -58, -120, -356, 137, -255, 212, -225, -379, -111, 220, -78, -138, 140, 202, 109, 222, 378, 307, -30, 55, 42, -206, 20, -197, -216, 126, -154, 12, -4, 119, -507, -395, 224, 457, -15, -9, 69, -194, -118, -491, -286, -127, -20, -352, 514, 123, 280, -319, -417, -284, -132, 99, -471, -186, 197, -71, -570, -169, 60, 25, 330, 136, -123, -243, 313, -170, -34, 268, 59, -248, -153, 1, -464, 135, 335, -130, -208, 74, -242, -61, 30, + -121, -126, 143, -185, -334, 161, -179, -284, -340, -200, 64, -165, 89, 434, 285, -75, 460, 411, -153, 35, 156, -240, -84, -421, 146, -154, -307, 791, -25, 483, -240, -703, 206, 56, -21, -331, -25, -219, 560, 401, 369, 261, -425, -5, 68, 382, -650, -77, -153, -194, 108, -218, 94, 145, 118, 116, 162, -46, -55, -320, -66, -48, 325, 1, -277, -66, 353, -38, 210, 258, -174, -106, -412, -242, 841, 223, 381, 203, 61, 37, -513, 318, 62, 99, 281, 301, 469, -514, -202, -280, -22, 85, -54, -133, -71, -417, + -517, -322, -461, -82, -278, -413, -205, 158, 1071, 240, -153, -225, 35, -347, -671, 491, 2, 315, -241, 226, 549, -58, 60, -143, 476, 398, 154, -653, 44, 90, 397, 578, -176, -125, -82, 151, 202, 167, -301, 129, -347, 254, 339, -172, -353, 211, -384, -348, -25, 93, 475, 53, -80, 409, -91, 367, 673, 341, -9, -442, -61, -256, -225, 438, 149, -445, -31, -338, -114, 585, 236, 90, 214, 361, 139, -455, 189, 408, 66, -292, 60, 94, 172, 155, -260, -13, -332, -781, 271, -311, 87, 28, 549, -377, -333, -140, + -151, -202, 406, -359, -504, 151, -944, 27, -175, -401, 512, -34, -26, 213, -197, 159, -47, -567, -611, -9, 136, 358, 181, -45, -57, -361, -160, 351, -548, 762, 467, 95, 580, -389, -150, -359, -342, -166, 276, 713, 25, -392, -43, 16, -18, -61, -204, 170, 210, 459, 27, 517, 329, 107, 39, 66, -730, 348, -21, -488, 337, -187, 351, -272, -246, -1434, -141, 896, -188, 55, 730, -146, -18, 123, 175, -197, 175, -46, -279, 277, 262, -821, 76, -726, -46, -359, -455, -58, -154, -381, 185, 107, 239, 398, -542, 692, + 21, -570, 27, -379, -237, -410, -437, -133, 409, -326, 182, 486, -286, -417, -455, -580, -706, -347, -219, 109, -128, 246, 103, -344, -56, 516, 233, -605, 234, 19, -219, -549, 386, -143, 539, 811, -27, 772, -429, 485, -328, 519, 444, 84, -702, -2, -660, 526, -1292, -116, -93, -150, 155, -802, 84, -191, -35, 306, 166, 361, -284, 242, -122, -722, -247, -543, -284, 280, -567, 29, -196, -498, -58, 387, -566, -617, 251, 286, 0, -322, 335, 278, 427, 296, 163, 425, 588, -369, 100, -334, 731, -123, -485, 533, 274, 76, + -275, -450, 97, 155, 237, -96, -307, 160, -358, -71, -355, 1025, 175, -408, 916, -205, 283, -333, 461, 561, -389, 477, 640, 666, 626, -34, 424, -358, 1345, 379, -254, -177, 297, 114, 115, -9, -567, 484, -1268, 161, 254, -30, -248, -453, -239, 82, 351, 591, -353, -702, -606, -58, 4, -403, 864, -386, -285, 388, -140, 90, -94, 780, 111, -734, 286, 119, 512, -165, 45, -292, 249, 137, 650, -141, 289, 333, -407, -422, 25, 419, -784, -905, -275, -364, -52, -121, 92, 219, -184, 39, -1056, -899, 731, 764, -903, -709, + -851, -465, -328, 417, -398, -735, 112, -1, -341, -116, -769, -85, -193, 236, -370, -91, -1194, 1056, 664, -107, 1428, -135, -799, -66, 311, -481, -655, -129, -452, -15, 109, -655, 956, 38, 89, -604, -192, 72, -191, 162, 203, 803, 124, -34, 624, 539, -210, 321, -430, 123, 337, 359, 876, -881, 521, 1661, -16, 282, 535, 77, 79, 281, 170, -538, -697, -222, 488, 177, -728, -348, -78, -302, 555, 87, 410, -1008, -714, 350, 632, 490, 178, 1014, 429, -283, 405, -204, -198, 0, -30, 455, -1342, -4, 26, -77, -140, 611, + 87, -403, -655, 667, -585, -15, 485, 330, -451, -161, -749, -34, 262, 245, 356, 55, -474, -667, 563, 243, 300, 75, 306, 53, 427, -714, -1123, 297, -134, -273, 692, -138, -304, 551, 586, 427, 3, -315, -455, -150, -616, 1536, -86, 541, 169, -537, 475, -215, -445, 470, 438, -870, 649, -104, 882, -848, -579, 839, 19, -691, 748, -259, 1216, -528, -380, -701, 454, -96, -253, 392, -388, -180, 213, -192, -370, 998, -208, 669, -1057, -213, 0, -1314, -258, 165, 660, -340, -276, 6, -72, 884, -59, -477, 990, -140, -21, 161, + -355, 810, 85, -190, 428, 321, -422, -175, -178, 627, -1260, -41, -217, -476, 256, -483, 789, -217, -895, -116, 1452, -876, 658, -976, -235, 934, 738, -533, 285, -646, -781, 157, -317, 340, 151, -77, 189, -1226, -420, -636, -829, 390, -277, -269, -426, -870, -615, 501, 1, 1564, 428, 116, 478, 893, -143, 309, 665, -385, -538, 603, -944, -88, -209, 75, 634, -406, 705, 331, 147, 238, -1198, 824, 132, -808, 308, -859, 133, 1205, -164, -677, -762, 341, 520, 457, 214, -755, -550, -217, -161, 1035, -656, -358, 1488, -810, -81, 623, + -14, 655, -108, -478, -356, -891, 452, 684, -999, 1499, 471, -1076, -1030, -931, -1175, -899, 26, 497, 66, -736, -321, 562, -45, -440, 502, -995, 27, -186, -994, -804, 72, -264, 539, -917, -263, -31, -781, 369, 702, -1780, -1674, -1425, -945, 391, -408, 1867, 474, -183, -440, -219, 508, -1189, 1393, 1879, 724, -97, 1457, -453, 874, 1711, -329, 109, 298, 2273, -593, -125, 1319, 526, 409, -351, -1397, 114, -1113, 540, -1375, -1561, -44, -69, -1131, -36, -565, -1108, -934, -1451, -102, 1532, -514, -261, -1426, -715, -550, -446, 430, -306, 2465, -557, + -81, -875, 1841, 1599, -1155, 1316, -504, -1786, -398, -112, 298, -338, -502, -128, -800, 294, 521, -857, -11, -306, -241, -553, 747, 3206, 362, -1983, -505, -688, 147, 1018, 1787, 536, -1506, -3, 1039, 253, 24, -17, 274, -112, -178, 1270, 782, 726, -1043, -645, 726, 317, 435, -322, 146, 1422, 49, 1215, 632, 687, 1162, 218, -585, 196, -671, 232, 510, 184, 1895, -558, -1171, -1091, 1474, 737, 803, 602, -789, -957, -594, 50, 355, -136, 552, 1051, -20, 795, 676, -857, -144, 394, -407, -282, -435, -1445, -230, 792, 40, 1358, 833, -413, + 443, 116, -117, -839, 149, 2451, 709, 993, -464, -2361, -1103, -1756, -508, 1069, 2665, 1095, 351, -1305, -1105, 753, 1356, 575, 1635, -135, -969, -1577, -673, -302, 1231, 73, 737, 531, 164, 1490, 1157, -192, -87, -1513, -288, -103, 93, 752, 1538, 828, 772, 1308, 863, -1510, -1087, -437, -838, 882, 720, 1342, 1175, 1176, 441, 141, -960, -1160, -939, 273, 591, -88, -59, 2154, 651, -247, -125, 1436, -1516, 260, -2901, -851, 750, -1203, 1010, 425, 297, 1751, 1241, 134, -3570, -2248, -1135, 1056, 395, 4958, 5395, 3231, 5987, 4824, 5209, 3560, 4444, 3543, + 239, -1576, -2173, -2175, -4542, -5589, -5733, -4030, -3027, -1138, 494, -1515, 1317, -1934, -459, 62, -327, 729, -1597, 2925, 832, 2711, 1971, 1208, 1069, 1671, 1341, 1731, 3677, 3400, 2934, 3358, 4298, 3839, 3808, 6367, 2708, 4656, 6094, 4255, 5639, 3181, 4271, 3351, 4113, 4220, 2217, 3026, 2713, 2918, 3098, 1333, 630, -1481, 224, -2132, -1241, -3107, -2913, -2922, -6125, -4755, -3256, -3055, -428 } + }, + { + {55, -12, 45, -10, 187, -28, -7, 228, -55, 254, 46, -101, 153, 73, -112, 42, 61, 18, 98, -25, 79, 0, -109, 47, 121, 70, 71, -14, 10, 1, 44, 89, -212, -103, 5, 51, 20, -83, 163, 54, -36, 87, 32, 121, 35, -47, -92, 98, 7, -1, -49, 28, -86, -60, 41, 88, -41, 20, 0, -12, 162, 61, -18, 26, 72, 7, 73, -92, 89, 95, -45, -155, -74, -36, -35, 169, 2, -61, -16, -149, -105, 68, 4, -93, 115, 80, -28, 8, -18, 96, -134, 50, 96, 88, -192, -132, + -97, 128, 28, 42, -56, 136, 48, -33, 0, -38, 23, 51, -34, -39, -118, 121, 198, 24, 124, -24, 21, 45, 51, -154, 6, -161, -42, -24, 45, -82, -8, 34, 10, -95, -2, 9, 70, -101, -131, -18, 162, 269, -7, 43, 11, -60, -170, -43, 103, -50, 101, 46, 98, -9, 23, 22, -83, 73, -165, -43, -157, 89, 15, -79, 348, -139, -242, 14, 118, -25, -181, -57, -76, -35, -84, -33, 132, -14, -79, 142, 26, 137, -34, -40, 59, -1, 68, -31, 138, 214, -56, -152, -104, 86, 4, -342, + -28, -139, -46, 160, -111, -92, 118, -79, -12, 146, 57, -125, 58, -91, -195, 58, 83, -157, -83, -49, -59, -7, 70, 97, 161, 169, -37, 11, -63, 68, 52, -43, 76, 91, -81, -52, 32, 16, 30, -278, -139, 83, 124, 46, 134, -116, 140, 169, -47, 187, -25, 137, -66, 2, -59, 176, 70, -10, 159, -87, -67, 114, -276, -51, 15, -62, -246, -154, 102, -100, -65, 0, 192, -50, -136, -15, 49, 105, -18, -179, -114, -37, -91, 24, -154, 70, -145, -215, 4, 68, 83, -73, -51, -144, 176, 97, + 22, -5, -9, -68, -37, 53, 72, 262, -35, 60, 12, -16, -135, -104, 160, -80, 17, 35, 25, 65, 84, 72, 178, -118, -172, -142, 91, 194, -34, 149, -130, -161, 137, -67, 17, 50, 171, 63, 270, -115, -137, 64, -74, -72, 156, -233, -140, 26, -40, 110, -74, 33, 195, -172, 138, -102, 92, -95, -21, -11, 203, 42, 15, -138, 15, -164, 73, 49, -105, 4, -38, 303, 50, 27, -246, -141, -205, 178, -98, -2, 101, 388, 279, -95, -218, -85, -187, 223, -24, -45, -65, -44, 8, -65, -22, 1, + -54, -40, -155, 114, -160, -266, 272, 133, -299, 300, -54, -10, -418, 252, 157, -325, 92, -48, 120, 36, 139, 100, 31, -147, 8, 64, -210, -80, -247, -34, -156, -73, 22, -182, -75, -271, 100, 35, 19, 31, -125, -236, -80, 92, -44, -14, 249, -370, 154, 198, -32, 18, -77, -24, -125, -181, -129, -142, -100, 98, 50, 87, 126, -28, -68, 183, 348, 245, -3, -293, 84, -44, 43, 278, 30, 261, 226, -59, 454, 103, -68, -32, 147, -57, 441, -56, -55, 535, 14, 265, -91, -3, -13, 35, -58, 28, + 3, -26, -284, -39, -59, -63, -111, 179, 101, 102, -153, -29, -249, -116, 62, -32, -146, -60, 101, 187, 134, -74, -229, -20, 85, -53, 145, 74, 191, 228, -61, -15, -242, -330, 318, 146, 9, -28, 11, -131, -104, -19, 263, 120, 69, 272, -195, 43, -152, -167, 160, 94, 142, 380, 34, -217, 78, -219, 120, 36, -240, -331, 131, -309, 4, 337, -352, 127, 164, -99, -435, 3, 262, -287, 182, -23, -121, -372, -5, -269, 53, -138, -202, -262, 112, -39, -9, 244, -143, 205, -151, -65, 325, 107, -163, 128, + 84, -149, 85, 78, -48, -65, 21, -73, -75, 50, 67, 430, -398, 64, 36, -148, 304, 165, -89, -319, 41, -35, -82, -202, -219, 281, 200, 20, -12, 147, 95, -75, 140, 79, -57, 269, -65, 146, -80, 45, 118, 72, 150, -336, 248, -144, -55, -196, -130, 109, -103, 88, 376, 120, 209, -478, -306, -174, -107, 44, 4, 75, -390, 205, 94, 46, 384, -1, -208, 347, 145, -165, 78, -210, 192, 80, 254, -221, -145, 55, -209, 263, -243, -13, 247, 213, -453, -22, 28, 44, 82, 492, 122, 21, -147, -138, + -265, -158, 377, -3, -436, -6, 109, -265, -269, 18, -171, 58, 416, 181, 179, -186, -399, 15, -51, 134, -11, -362, 41, -579, -175, 165, 447, 65, 231, 799, 131, 137, -125, -382, 214, -185, 197, -48, 525, 384, -206, -432, -347, 260, -232, 319, 137, 104, -114, -43, 376, -76, 331, 334, 169, 234, -265, 253, 133, -138, 366, -165, 332, 24, 32, -497, 292, 25, -99, 242, -351, -139, 200, 166, -325, 49, -211, -120, 307, 39, 87, -36, -370, 240, 222, 13, 173, 79, -171, -172, -24, 188, -331, -15, 3, 24, + -1, 174, 171, 273, 142, 699, 231, 76, -246, -667, 491, 128, -408, 111, -24, 93, 115, -327, -640, -536, 201, 392, -55, 413, -172, 319, 435, 538, -94, 394, -334, 125, -168, 36, 250, -22, -86, 87, 308, -209, -334, -383, 813, -9, -4, -362, 397, 107, -681, -426, 200, -111, -87, 271, 136, 686, 427, -35, -360, -407, -179, -173, -410, 413, -263, 324, 341, -302, -319, -375, -469, 114, 56, -205, -159, -390, -68, -376, 159, -21, -9, 68, 201, -371, -760, -151, -209, 56, -189, 47, 63, -66, 304, -399, -141, -378, + -35, -182, 437, 520, 389, -553, 385, -193, 289, -106, 209, -177, -258, 98, -329, 211, 226, -20, 129, -277, -52, 493, -402, 26, -130, -151, -326, -11, 464, 636, -413, 195, -64, -379, -405, -418, -206, 800, 471, -150, 246, -172, 213, -441, 248, -19, -245, 599, 310, 113, 198, 159, 575, 55, -472, 165, 367, 239, -783, 408, -288, -327, -71, -30, -315, 124, 518, 341, 1408, 396, -239, 92, 236, 7, 468, 350, 323, -419, -703, 701, -399, 66, 240, 768, 306, -467, 418, -423, -90, -581, -764, -88, 202, 201, 150, 190, + -63, -526, -196, 162, 173, -283, 577, 360, -350, 184, 286, 103, 16, -331, -41, -237, -133, 19, 360, 881, -243, 64, 134, 315, -319, 1115, -95, 85, 100, -543, -499, -847, -338, 412, -144, 183, 199, 731, 151, 79, 88, 520, 337, -266, 596, -438, 192, 462, 616, -154, -580, 326, 164, 403, -101, -900, 81, -603, -524, 158, 139, 251, -143, 182, -18, -304, 504, -75, -146, -191, -326, -288, 197, -363, 111, -228, -142, -92, 502, -83, 539, 335, -110, 185, 205, 382, -225, -328, 82, 235, 312, 504, -500, -495, 256, 196, + 632, -267, -4, 325, 43, 114, -68, 424, 535, 261, -15, 346, 1076, -185, -247, 426, 13, 648, 202, 329, 397, -59, 289, 714, -101, -727, 569, 256, -68, 68, -915, 650, -478, -91, 913, 352, -1024, 105, -129, 29, 248, -118, -492, 14, -16, 425, 1019, -219, 378, 562, 47, -237, -84, 186, 1024, -80, 13, 718, -237, 150, 84, -72, -120, 234, -783, -31, 361, 577, 763, -613, 114, 553, 56, 1078, -317, -612, 174, 768, 245, -688, -194, 132, 104, 303, -814, 56, 155, -250, -552, -651, 279, -239, 86, -27, -563, -793, + 297, 49, -588, -321, -315, 334, -938, -523, 552, -782, 569, -238, 570, 47, 295, -597, -94, -562, 593, 331, 790, 637, -342, 161, 614, 388, 290, 265, -605, -111, 231, 94, 281, -665, -576, 374, 1026, 197, -399, 728, 147, 475, 66, 136, -649, -562, -35, 64, -1104, 140, -264, 0, 288, -358, 206, 886, 39, -1297, -1022, -102, -349, -279, -59, 306, 165, -273, 324, 417, 270, -146, 223, -88, -409, -17, 251, -943, -294, -383, -592, -128, 66, -178, -94, 1144, 531, -201, -45, 165, 232, 433, -604, -158, -254, 158, 1273, 197, + -621, 162, 565, -124, 528, 663, -340, 155, 341, 227, 19, -100, -202, 98, 400, 203, 374, -555, -848, -92, 385, 335, 278, -97, -781, 254, 180, 1180, 1245, 296, -918, 670, -347, -940, -216, -1112, -845, -371, -405, -860, 155, -343, -987, -901, 266, 597, -94, -757, 231, 31, 247, 491, 470, -580, 764, 538, 65, 226, 526, -10, 1362, -948, -453, 3, -1079, 820, 2, 999, 236, 362, -75, 279, 399, -591, 136, -1207, -360, -48, -329, 1385, 402, -331, -876, -402, -375, -509, -420, 238, -1266, -236, 888, -76, -126, -917, 883, 483, + -3, -325, 363, 227, -240, 450, -665, -132, -351, 223, -173, -365, 436, -304, 168, 56, -648, -344, -122, -735, -791, -977, -290, 520, -371, -137, 565, -669, -623, 697, -35, 22, 544, 70, -526, -217, 157, 488, -679, -123, 730, 420, 692, 476, -213, 490, -116, -825, 193, -458, 265, 271, 285, -25, -199, -365, 937, 310, 47, 101, -229, 355, 583, 1433, 1274, 98, -542, 245, 744, 198, 579, 397, 288, -439, -536, -671, -33, 235, 479, 928, 510, 592, 363, 548, 295, 528, -345, 93, 1027, -35, 793, 199, 644, -1009, -150, -302, + -283, 227, 402, 719, 1184, 976, -336, 170, -1291, 313, 311, 1145, -903, 724, -227, -640, 499, 153, 416, 722, -228, -914, 481, -583, -808, -371, 1071, -897, -1279, -588, -263, 583, -112, -501, -732, -226, 13, 161, 154, 916, -297, -994, 59, -410, -1446, -717, 1868, 271, -861, -925, 92, 23, 374, 493, -671, -431, -1063, 249, -396, -248, 1588, 348, -238, -1652, -124, -881, 858, 1082, 95, 841, -1009, -391, -646, -150, 1617, 2036, 306, -548, -749, -1476, -1, 185, 1758, 985, -282, -2933, -1537, 242, -305, 2559, 838, -1248, -537, -2218, -720, 59, + 1415, 1463, 1644, 54, 374, -204, 126, 2018, -768, 1453, -359, -1541, -450, -1524, -467, 1751, 870, -1301, 1443, 2, -380, -2247, -609, -608, -1018, 2173, 18, 971, -1492, 822, 685, -672, 426, -133, 379, -6, 1101, 387, -1092, 645, 525, -11, 737, -563, -301, 934, 643, 618, 295, 536, -1646, 1410, -838, -530, 288, -1152, 1642, -485, 141, 1192, 14, -194, 624, 657, 1147, -299, -1129, -1127, 88, -414, 478, -686, -370, -466, 289, -2103, -15, 1547, 378, 628, -117, -174, 346, -551, -703, 392, 130, -606, -782, 2634, -404, -513, 287, 743, -408, -406, + 365, -1066, 342, 1820, 2726, -1180, 849, -1789, -602, -1071, -214, 1759, 1753, 1490, -109, -1105, -761, 672, -19, 359, 881, 25, 403, -1167, -379, -658, -923, 506, 315, 65, 775, -685, -103, 228, -1097, 7, -9, -611, -326, 274, -515, 991, -400, 1483, 1009, -686, -292, -966, -1231, -1451, 376, 709, 1878, 1534, 602, 983, 78, -1063, -828, -586, -852, -135, 299, -18, -631, 154, -638, 347, 587, 160, -883, 551, -595, -274, -713, 694, 198, -251, -2971, -1782, -949, 1714, 884, 4612, 4428, 4488, 4633, 4872, 3522, 1801, 2700, 1581, -656, -1405, -2092, -4273, + -3753, -3981, -2777, -2900, -2039, -1745, -798, 189, -1526, -772, -160, -156, -720, 364, 1373, 1437, 714, 1689, 2199, 654, 645, 573, 2196, 2202, 2815, 3043, 2779, 3042, 4585, 1987, 3674, 4825, 3290, 3756, 3103, 1691, 2032, 2150, 2028, 2553, 2595, 1752, 760, 1130, 1789, 428, 694, -78, -145, -1580, -400, -3021, -3842, -2692, -3044, -4285, -3337, -857, -2750, -1308, -26 }, + {19, -61, 12, -105, -82, -90, -106, -161, 79, 75, -81, 19, 121, 195, 68, 80, -48, 22, -296, 89, 9, -42, 84, -28, -111, 103, 37, 42, 76, 102, 103, -2, -132, -5, 139, 147, 189, -43, 185, 5, -10, -60, -8, 104, 39, -301, -101, -176, -8, -10, -116, -135, -104, 36, -100, 63, 97, 108, -137, -68, -155, -89, -43, 13, -147, 153, 62, -63, -2, -23, 249, 62, -12, -61, 9, 322, 24, -28, -5, -33, -162, -178, 170, 32, -92, -157, -66, -120, -188, 241, 36, 82, 130, 351, -3, 49, + -81, -40, -61, -242, 58, -80, 29, 154, -58, -25, 41, 8, -33, -2, -210, 35, 0, -88, 73, 21, -140, 219, 14, 22, 219, -94, -87, -222, -101, 133, 15, 143, -70, -185, 81, -174, -65, -324, 134, 93, 73, 78, 220, 39, -86, 97, 184, -133, 95, -21, -22, -80, -37, 65, 4, 66, -10, 41, -127, 32, -77, -169, -13, -199, -234, -153, -110, -265, 13, -98, -50, 76, 280, 21, -64, -36, 47, -10, 117, 193, -15, 217, -24, -19, -25, 121, -165, 21, 21, -46, -9, -105, -165, 222, -77, -23, + -41, 95, -108, -99, 39, 28, 158, -115, 130, -83, -133, -17, -56, 29, 69, -9, 90, 38, 64, -94, -107, -177, -130, 9, 199, 20, 160, 37, -92, 107, 45, -123, 194, 34, -184, 39, 40, 18, 21, -245, -212, 43, 27, 178, -136, 183, -91, -44, -288, -21, 23, -103, -14, 154, 151, 219, -51, -36, 142, 63, 128, -302, 301, -66, 0, 46, -32, -3, -22, -21, 189, -6, 247, -42, -95, -202, 28, -91, -75, 140, 113, 147, 10, 19, -209, -153, 4, 198, 74, -23, 72, -79, 215, -8, -173, -224, + -74, 260, 201, 203, 100, 14, -205, -89, -21, -117, 141, -14, -50, 116, -279, 86, -34, 79, -20, 69, -77, -125, -30, -95, 39, 174, 57, 13, -77, -380, -264, -1, 103, 143, -1, 34, -64, 141, 50, 114, -179, 167, 82, -175, 58, 173, -20, 60, 17, 157, -128, 96, -26, -14, -156, 15, 143, -93, -83, -130, 169, -12, 23, -137, -419, -113, 46, 43, 136, -103, -81, -56, -42, -125, -11, -112, 250, 99, 200, -214, -61, -86, 185, -56, -58, -163, 83, 5, -136, 178, 18, 25, 139, 19, -170, -34, + -107, 106, -84, 66, 8, -47, 185, 137, -13, -253, -333, -261, 97, -3, -143, -41, 18, -36, 376, 61, -271, -76, -81, 10, -128, 209, -159, -213, 194, -86, 52, 47, -90, -250, 31, -136, -117, -125, -17, 186, -29, -49, 280, 46, 40, -369, -44, 188, 223, -131, 57, 25, -365, -54, -28, -43, 84, -2, -208, 20, -169, 148, -64, 193, 30, -234, 90, 423, -179, -1, -329, 73, 237, -443, 37, -33, -33, 52, 313, 49, 135, 236, -291, -78, -224, 116, 115, 256, 470, 83, -376, -27, -102, -31, -169, 7, + -29, 188, 133, 59, -24, 13, -68, -36, 196, -62, -40, 161, -32, 97, -28, 203, -164, -294, 359, -17, 75, -275, 7, -81, 398, 69, 172, -35, 151, 115, -388, -55, -225, -177, 9, 267, 17, -49, 392, -40, -248, -173, -138, 203, 599, 2, 153, 47, -217, -40, -18, 181, 247, 29, 174, 174, -281, 47, -15, 14, -122, -464, 96, -36, 151, 117, 431, 102, -96, 119, 327, 388, 143, 277, 258, -197, -175, -327, -379, 53, 147, -298, -233, -4, -371, -285, 139, 62, -171, -93, -247, 209, 131, 335, 601, -54, + -185, -52, -313, 10, -247, -247, 302, 49, 32, -389, 405, 96, -270, -69, 203, 28, 35, 7, 24, 136, -210, 247, -6, -149, -57, -266, 32, -273, -267, 236, 217, -213, -371, 107, -184, -7, -92, 142, -100, 132, 3, 183, -179, -200, 242, -76, -55, 137, -198, -212, 244, 322, 7, -21, 112, -280, 477, -293, 37, 226, -106, 211, 259, 83, -267, 289, -41, 108, -209, -40, -399, 137, -236, 92, -411, 242, -300, -211, 175, 240, 83, 27, 12, -259, -239, -153, 630, 345, -97, -581, -80, 165, 341, -190, 29, -401, + -137, -48, 106, 61, -89, -4, 178, -196, -10, -223, 124, 154, 434, 191, -211, 92, -122, -295, -44, 178, -6, 421, -310, -406, -69, 92, 236, 126, 311, 65, -391, 250, -332, -339, 0, -25, 253, 333, 291, 444, 97, -447, 485, 276, -211, 387, -61, 51, -346, -111, -109, -144, 307, -532, -134, -248, -253, 48, 245, -119, -325, -326, -444, -430, -236, -70, 171, -337, -457, -257, -128, -213, -163, 387, -235, 39, 184, -346, -228, -232, 356, -159, 223, 543, -77, 124, 27, -163, -246, -144, 224, -31, 257, 32, 175, 67, + -363, 427, -119, -37, -343, 745, 507, 330, -232, -575, -126, 315, -500, -307, 34, 390, 319, 218, -279, 208, -57, 208, -35, 574, 382, -50, -521, -77, 441, 332, 41, 701, 353, -165, 27, 30, -57, -221, -249, -63, -750, 201, -238, 17, 3, 184, 322, -13, 109, -368, 281, -146, 550, -8, 108, -1278, -18, 316, 210, 337, -85, -373, 235, 47, -247, 253, 98, -298, 49, -10, 144, -124, -409, -479, 36, -189, 201, 116, 128, 82, -400, -158, 58, -523, -860, 145, 289, 314, 1, 717, -511, 174, 92, -136, -453, -180, + -260, 309, -137, -267, -460, -33, -172, -78, -348, 193, -25, -151, 182, 246, 277, -351, 659, 51, -97, -395, -383, -66, -51, -385, -414, -305, 267, -171, 443, 155, 738, 267, 281, -80, 398, -54, 98, 576, -167, 219, -670, -843, 192, -24, -539, 50, 20, -722, 216, -200, -139, -271, 289, -252, 25, -10, 143, 17, -368, 232, -5, 70, -431, -602, -647, 87, 135, 521, 674, -17, 176, 430, 346, -35, -869, 591, -65, 160, -183, 301, -30, -375, 96, 676, 94, -449, 382, 277, 172, -340, 348, 263, 18, 426, -187, 109, + 678, 499, 3, 153, 323, -665, -153, -51, -125, -585, 124, 164, 8, -456, -34, -774, 12, -557, -139, 269, -266, -342, -302, 150, 95, -317, 79, -122, 331, -208, -270, 184, 299, -45, 95, 127, -898, -25, -132, -417, -25, 530, 70, -135, -188, 273, -45, 139, 72, 299, -730, 292, -757, -970, -573, 8, -484, 473, -125, -662, 12, -191, 120, 87, -113, -112, 450, -154, 193, -257, -191, 633, -188, -105, 16, 122, 444, -859, -20, 416, 466, 374, 90, -179, 892, 262, 307, 307, 190, -148, 44, 477, 201, -382, 227, 901, + -450, 616, 274, -1004, 277, 634, -31, 273, 37, -765, 416, 901, 93, 607, -339, 537, 502, -33, -42, 494, 312, -675, 702, -173, -116, 388, -89, -192, -179, 36, 205, -157, -277, -547, 1286, 607, -1458, -629, 177, -264, 447, 484, 560, 598, -358, 1149, -155, 11, -361, 422, 608, -441, -461, -120, -256, 34, 256, 18, -281, -133, 503, -56, 266, 41, 602, 850, 352, -435, -955, -100, -142, 93, -202, 305, 567, 32, -175, -464, 1094, 917, -98, 440, -228, -358, -1004, 553, -454, -127, -3, -338, 208, 616, 125, -292, 329, -142, + -397, 637, 160, -904, 1165, -768, -366, 403, 429, 283, -46, -399, 37, 592, 165, -781, -641, -141, 984, 115, -481, -1264, -360, -45, 299, 892, 669, -79, 6, 593, 468, 38, 128, -1706, -1087, -512, -851, 92, -474, 781, -173, -40, -2, -286, -348, 574, 347, 218, -75, -240, -231, 299, -613, -206, 114, -188, -294, 284, -885, -1220, 304, 419, 493, -700, -380, 435, 162, -1185, -1059, 98, -507, -501, 210, -948, 511, -343, 423, 434, -230, -508, -1249, -366, -366, 705, -519, -234, 268, 369, 522, 684, -96, -950, 441, -152, -375, -819, + 259, 337, -1181, 445, 446, 1074, 118, -277, 88, -1328, -363, -165, 39, 240, -430, 810, 349, 1003, -177, 883, 591, 351, 829, 411, 556, 688, 56, -888, -818, 181, 994, 709, -1261, -25, -190, -167, -106, -875, 257, -617, 601, -404, 1321, -317, -1824, -170, -609, 398, 305, 560, 1230, 306, -131, 700, -357, 1390, 256, 953, 450, 142, -307, -238, 2147, 92, -1372, -105, 1032, -541, 439, -135, 797, 635, 233, -1231, -502, -1403, 187, 1287, -960, -845, 801, 417, -1458, -1326, 399, 95, 164, 482, -91, -383, -242, 884, -655, 1087, 136, -230, + 190, 635, -41, -166, -1180, -483, 86, -594, 485, 803, 14, 145, -860, 987, -386, -422, 749, -293, -45, -558, -105, -389, -1450, 491, -207, 1051, 1287, -12, -292, -842, -323, -231, 1215, -1205, -911, -2000, -13, -829, 168, 698, -442, -103, 1295, 887, 546, 122, 5, 940, -1059, 68, 469, 69, 369, 507, -211, 147, 1167, -842, 259, -252, -487, -368, 1794, -190, 855, -673, 1208, -378, -31, 737, 678, 1795, 35, 345, 208, -676, 850, 341, -573, 938, -411, 1165, 795, -193, 687, 102, 639, 207, 1115, -637, 536, -1098, -335, 467, 1214, 20, + 61, 617, -44, -343, -1548, -852, 220, -565, -66, 563, -1354, 895, -94, 1049, -490, -801, -190, 2569, 528, -2150, 365, 676, 109, 2560, -182, -1690, 1817, -491, -167, 2064, -221, 1377, 184, -608, -181, 1208, -644, 178, 187, -55, -1840, -106, 255, -645, -222, -1869, 1180, 1882, -836, 296, -1429, -4067, -807, 226, 2060, 1785, -1735, -1491, -1562, -1229, -916, 1123, -210, 2430, 1598, -445, -2000, -4907, -3221, 263, 5471, 4220, 747, -2115, -5431, -5503, -426, 3267, 4968, 5511, 541, -1726, -2260, -2922, -2694, 224, 1826, 3490, 2349, 1944, -2493, -2979, -3581, -4230, 452, 5172, + 5017, 1077, -1857, -4757, -6350, -2079, 449, 2407, 5695, 2180, -72, -3006, -2523, -851, 1456, 2362, 3301, -474, 869, 691, -1572, 28, 786, -633, 870, -26, -179, -54, 161, 681, -283, 801, 520, 330, 339, 279, -90, -449, 720, -6, 430, -267, 379, -136, -82, 275, -392, -386, 31, -166, 573, 592, -572, 270, -353, 371, -22, 241, 62, 313, -419, 263, -478, -200, -96, -58, 324, -690, -171, -292, -644, -65, -278, 132, 534, -187, -842, 114, 449, 952, -92, 69, -575, -413, 394, 27, -241, 3, 714, 273, 247, 262, 535, -828, 245, -451, + 133, -529, 1412, 2540, 174, -1598, 509, -85, 1989, 992, 1954, -149, -987, -219, 402, 876, 615, -331, 24, 393, 218, 830, -595, 171, -788, -84, -30, 229, 348, 122, -359, 643, -97, -499, 690, -88, -303, 231, -151, 606, 867, 59, 195, -269, -232, 561, 338, 471, 45, -239, -613, -550, -679, 547, 519, 586, 778, 914, 338, 84, -807, 507, -123, -660, 820, -27, 525, 332, -894, 271, -285, 195, 549, 110, -591, -273, -351, -904, -1952, 111, 2756, 3593, 3126, 2118, -70, 109, -1562, -1907, -3142, -2414, -2518, -848, 233, 800, 1407, 3421, + 2888, 1906, 644, -333, -1230, -958, -1280, -1679, -900, -973, -1144, -571, -748, 130, 554, 420, 1484, 1323, 1218, 753, 926, 538, 1105, 226, 957, 4, -233, -1685, -704, -2026, -2298, -2626, -2015, -1565, -528, 348, 1499, 1538, 1259, 2518, 2092, 2175, 2075, 1877, 793, 1198, -478, -1284, -1258, -3050, -2918, -2816, -2814, -2268, -600, -408, 485, 861, 727, 569, 384 } + }, + { + {-66, -14, 10, -26, -47, -119, 15, -19, -220, -31, -25, 75, 176, -149, 64, -94, 39, -129, 65, 42, -93, -84, -140, 58, -132, 19, 114, 80, 35, 54, 8, -117, 4, -73, 58, 38, 44, 183, 58, 27, -5, 62, -3, 57, -16, 130, 44, 57, 97, 217, 9, -37, 86, -67, -154, 77, -72, -133, 32, -42, 69, -37, -61, -102, 100, 36, -10, -99, -139, -42, -36, 16, -20, -7, -4, 29, -40, -12, 315, 171, -21, 113, 25, 28, -350, -149, -174, 138, -21, -110, 121, 130, 6, 125, -53, -1, + -9, -72, -41, -164, 84, -244, 101, -126, 103, 199, 88, -34, -57, 148, -25, 10, 136, -144, -6, -47, -86, 21, -22, 34, 140, 235, -75, 8, 192, 18, 50, -67, -108, -12, 32, -178, -48, 99, 12, 38, 57, -22, -56, -50, -63, 74, 59, -30, -102, -124, 65, 5, -98, 107, -19, -1, 23, 43, -9, -115, -30, 0, -107, -111, -64, 261, -183, -77, -127, -235, 89, 39, 11, 200, 192, 190, 63, -37, 31, 143, -60, 61, 74, -171, 244, 46, 77, 177, -67, -179, 14, 120, -83, -40, -111, 119, + -1, -14, -195, -10, -21, 120, 65, -110, 219, 78, 48, 74, -32, 119, -44, 4, -147, -183, 149, 111, 205, 17, 59, -158, -234, -121, -66, -73, -104, -99, 58, -32, 81, -94, -21, 38, 60, -31, 123, 9, -225, -211, 124, 27, 173, -268, -37, -107, 29, 317, 182, -279, 106, 26, -115, -130, -157, -257, 10, 30, -95, 45, -54, 9, 78, 59, 166, -145, 260, -160, 151, 118, -97, 69, 13, 107, -43, 55, 100, 32, 16, -41, 78, 21, -34, 183, -241, 15, -145, 289, 104, -257, 100, 330, -312, -152, + 39, -29, -117, 96, -39, 217, -183, -23, -58, -18, -7, 207, -190, -72, -16, -195, 111, 69, 207, 61, 161, 110, 99, -153, 18, -95, 102, 40, -157, 456, -288, 94, 490, -342, 162, -5, 161, -38, -294, -60, 247, 225, 63, 4, 127, 67, 8, 109, 107, -78, 136, -29, 212, -158, -252, 64, -218, 87, 11, -54, -65, -92, -145, 41, 62, 17, 48, 56, -84, -184, 166, 48, 37, 4, 240, 60, 109, 256, -134, 74, 25, 89, 185, 149, -202, -175, -30, -92, -5, 26, -72, 66, -147, 21, -130, 88, + 83, -81, 167, -85, 153, -48, 89, -98, 33, -72, 67, -47, -258, 191, 162, 331, -207, 122, -262, -72, 201, 167, -176, 35, -208, -5, -248, 67, -179, -277, -201, 92, -157, -14, -188, 6, 59, -55, -130, 77, 167, 60, 94, -191, 121, -200, -26, 86, 34, -47, -17, -30, 144, -154, -220, -77, 111, -77, -153, -213, -233, 39, -41, -276, 216, -187, -120, 276, -70, -89, 66, -85, -50, -15, -108, -108, -68, -166, -6, -17, 241, -345, 68, 287, -103, 314, 96, 11, -88, -235, -143, 375, -201, -12, -67, 19, + 236, 197, -122, 289, 304, -153, -71, 170, -152, -148, -7, -221, -3, -75, 28, 346, 124, 5, -164, -495, -58, 254, 66, -196, 137, 202, 190, 214, -380, 58, 17, -207, 100, -189, 118, -116, 146, 315, 441, 258, 125, -208, -55, -244, -235, -75, 256, 36, 0, 32, -258, 35, 29, -36, -123, 30, 139, -154, -209, 435, 43, -127, -190, -33, -122, -25, 66, -93, 484, -33, 126, 375, 32, -36, -249, 149, -141, -140, -488, -194, 81, -7, -106, -324, 106, 208, -283, -122, -86, -263, 99, 40, -162, -103, -64, -361, + -148, 209, 305, -219, -312, -66, -29, -222, -211, 98, 122, -245, 523, 25, 207, -99, 194, -116, 52, -357, -90, 178, -389, 127, -95, -170, -439, 14, 231, 27, -463, -45, 75, 206, 322, -96, 132, 391, 101, 88, -139, -14, 157, -57, -138, 171, 42, -287, -425, -365, -440, 378, -225, -68, 138, -436, -166, -306, -121, -105, 203, -383, -189, 108, 158, 205, 7, -3, -56, -11, -77, 43, -285, -169, -249, 170, 100, 129, 192, -370, -15, -49, 338, -133, 114, 168, -56, 180, -114, 202, 309, -127, -10, 246, -208, 344, + -141, -574, 99, 282, -100, 24, 2, 214, 292, -295, -113, 57, 206, -344, -238, -208, 400, -15, -405, -96, -151, 132, 101, 40, -264, -103, 176, 69, 253, 91, 122, -503, -202, 200, -138, -93, -173, 54, 258, 71, 57, -337, -120, -60, 120, 298, -367, 171, -301, -77, -278, 36, 30, -13, 105, -252, -81, -236, -106, 5, -20, -297, 161, 191, -81, 227, 436, 46, 327, 433, 23, 14, 93, -91, 131, 30, -108, -145, 531, -56, 303, 142, -175, -184, -146, 154, -142, 200, 460, 247, -85, 13, -422, -265, -265, 370, + 505, -220, -33, -219, -40, 296, -65, 326, 962, 397, -114, -49, -161, 421, -423, -265, -655, -24, 344, 394, 88, -179, -387, -310, 309, -77, 483, -19, -137, 204, 94, -22, -104, 288, -44, 246, 9, -163, 590, -157, 247, 548, 212, -44, -265, -73, -440, -550, 127, 318, -70, 26, -566, -242, 346, 158, -139, 87, -161, -108, -253, -469, 37, -131, -302, -538, -430, -172, -395, 156, -171, 33, 64, -36, 24, -101, -71, 223, 510, -374, 69, -127, 172, -164, -2, -259, -401, -431, 103, 180, 518, -438, 131, 147, -759, -26, + -8, -615, -353, -212, 145, -42, 23, -169, 248, 420, 202, -52, -649, -270, -361, 134, 22, -272, -39, 223, -203, 381, -359, -6, -218, -629, 87, -266, -326, 239, 327, -390, 128, 464, -176, 204, 133, -108, 36, -514, 750, 306, 155, 743, -938, -69, -158, 94, 336, 381, 111, 180, 437, -49, -363, -566, 175, -215, -24, 145, -153, 203, 492, -323, 210, -45, -114, 380, -159, 102, 496, 562, 154, 343, -218, 157, 174, -948, 278, 296, 77, -307, 6, -586, 695, 403, -200, -236, -325, -183, 508, -505, -271, -80, -68, -112, + 87, -334, -321, -202, -243, -73, -321, -48, -210, -743, -456, -184, -100, 104, 143, -3, 41, 217, 123, 113, 542, 113, 197, 331, 723, 606, 53, -230, -439, 428, -81, 1142, 251, 519, -32, 79, -426, -3, 418, 244, 321, -319, -188, -406, -779, 438, -625, 9, 866, 60, 94, 325, 133, -695, 223, 228, -424, -372, 33, 253, 682, -58, -479, -534, 0, -313, 112, 69, -536, -510, -894, -296, -239, -651, -397, -28, -263, -207, -136, -75, -591, -356, -351, -213, 221, -551, 70, 415, 554, -147, 175, 275, -485, 268, -191, 435, + -189, 17, -205, -78, 948, -214, 380, -695, -73, -28, -595, 563, 63, -246, 466, -205, 152, 805, -287, -495, 365, -126, -890, 340, -1175, -705, 543, 307, 121, 141, 67, 8, -673, -429, -114, -160, -157, 1267, 691, 3, -654, 337, -682, -552, 99, 564, 1110, -174, 561, -200, 398, 674, 376, 431, 230, -126, -552, -571, -173, -540, -159, -100, -121, 430, -73, -1108, 66, 265, 257, 660, -67, -1325, 754, -595, 196, -134, 447, 643, -717, -56, -356, -635, 459, -321, -768, 294, 459, 733, 205, -129, 90, 594, -480, 943, -290, -288, + -72, 562, -592, 28, 98, -1730, -220, 480, -189, 47, 267, 51, 26, 64, 511, -184, -52, 730, 480, -1343, -767, 931, 1073, -568, -193, -1509, -836, 229, -64, 213, -800, -493, -546, 833, 1226, -44, 339, -182, -96, 2, 292, 546, 142, -168, -86, -102, -710, -389, -721, -74, 248, -285, 478, -311, -103, 737, -318, 429, 303, -97, -652, -459, -375, 159, 1308, 263, 721, 849, 671, 512, 460, -658, 61, -67, 990, 498, 603, 1038, -429, -609, 302, 889, -1345, 28, 169, 682, -1016, -1530, -263, 304, 22, 130, 361, 17, -186, -114, + 339, -537, 431, -82, -279, -678, 299, -362, -530, 368, 899, 191, -244, 429, 906, 245, 247, -4, -16, 329, -617, -22, -921, 471, -726, -131, 516, 177, -377, 34, -447, 1028, 228, 290, 658, 1141, -407, 327, -484, 143, 528, 902, 326, -263, 1091, 66, 33, -641, 143, 552, -102, 526, -624, 1060, 1294, -1492, 86, -170, 437, -326, -49, 518, -370, -1609, 175, 1227, -871, 407, -36, -282, -348, 1095, 151, 174, 360, -918, 1882, 984, 87, -702, 48, -1458, -366, 107, -313, -1154, -155, -745, -216, 750, 144, 972, 368, 391, 200, -281, + 733, -342, -26, 396, 146, -419, 357, 196, 875, 410, -173, 584, -439, 773, 238, -749, -831, 475, 526, 274, 80, -334, -531, 217, -520, -723, -241, -72, -717, -205, 272, -427, -805, 295, 308, 98, -88, 25, -123, 366, 1394, 359, -24, 28, -464, -706, -324, 1217, 1239, 704, 142, 1154, 561, -152, -1302, -1005, -738, -1356, -473, -12, -128, 340, 640, -272, 826, -940, 764, -93, 1020, -654, 591, -964, 850, -776, -325, 1184, 278, 954, 1358, 150, -100, -550, -36, 873, 226, -287, -938, 100, 200, 468, 288, 395, 248, -530, -868, -349, + 872, 357, 2749, -836, -711, 924, 1421, 331, -3, 408, 116, 492, -387, 208, 681, 774, 511, 2173, -241, -217, -108, 1154, 685, -487, 607, 61, 225, -378, 1010, -886, 107, 1579, -1053, 3227, -1349, 1564, 1292, -1131, -870, 1003, 406, -391, -384, -189, 464, 780, -1728, -622, 933, -2052, -1399, -813, 1409, 3251, 796, -2411, -643, -2464, -1409, 2149, 1155, 2025, 988, -1398, -2426, -1708, -515, 1132, 1113, 799, 315, -543, -2646, -2996, -756, 2431, 4106, 2924, -630, -1894, -2925, -2024, -1798, 77, 578, 2369, 2344, -1250, -935, -3000, -2968, -953, 172, 3051, 4281, 2028, + -1413, -4528, -3533, -2424, 1083, 2696, 1502, 1110, 744, -2666, -646, -1487, 435, -130, 1466, 2623, 1817, -2249, -4782, -3155, 217, 2642, -333, -559, 1118, 357, -917, -854, -4, -1380, -178, 212, 152, -114, 28, -459, -65, -48, 232, -154, 631, -163, -130, -171, -208, 406, 106, -185, 611, 47, -1108, -541, 294, 546, -192, 74, 744, -9, 93, -607, -286, 200, -145, -126, -93, 510, 168, -183, -603, -221, -49, -524, 36, -599, -428, -269, -565, 876, -174, -366, 340, 17, -865, -23, 812, 712, -425, 563, 50, 544, -608, -770, 249, 407, 241, 320, + -363, 305, -475, 371, -815, 415, -668, 1345, 2076, -281, -758, -669, 1915, 851, 1853, 983, 9, -869, -185, 457, 872, 400, -396, -114, 418, 595, 79, 120, -424, 61, -204, 260, 314, 788, 697, -389, 62, -435, 109, 347, 551, 18, -262, -24, -474, 371, -110, 137, 367, -19, 489, -270, -137, -144, -508, -333, -775, -178, -883, 27, -306, 689, 104, 176, -683, 249, 0, -342, 494, -312, -144, 79, 323, -88, -176, 1031, 326, 186, 307, -387, -42, -61, 435, 655, -790, -1659, -244, 2232, 3397, 2885, 2248, -137, 248, -1649, -1907, -3062, + -1790, -1923, -629, 258, 1320, 967, 2897, 2553, 820, 190, -473, -980, -1588, -563, -1627, -418, -802, -496, -395, 93, 7, 552, 768, 1205, 1279, 1565, 1326, -158, 111, -14, 233, -770, 292, -825, -2080, -1014, -1561, -2598, -778, -232, -1069, 348, 784, 1803, 2123, 3137, 1977, 1605, 1603, 984, -312, 144, -1584, -1398, -2288, -2762, -3097, -2276, -1615, -118, 153, 451, 1257, 1392, 2309, 1707, 1166, 669 }, + {-9, -26, -72, 58, 149, -53, 94, 109, 26, 55, 128, 147, -55, 38, -99, -121, 144, -288, 15, -183, -124, -73, -29, 339, -6, 85, 87, 13, -29, -15, -27, 35, 86, 74, -24, 3, -26, -119, 53, 33, -47, -180, -161, -6, 9, 21, 97, 107, -138, -97, -103, 89, 138, 85, 185, -7, -21, -41, 122, -80, 15, 10, -104, -155, -63, 158, 0, 238, 3, -32, -2, 143, -29, -10, 66, 43, 24, 23, 223, 89, -116, -16, 76, -11, 81, -204, -151, -33, -178, 76, -42, -16, -121, -50, 106, 112, + -46, -31, -76, -165, 183, 113, 1, 22, -14, 8, 146, -74, 24, -238, -201, -47, 14, -165, -35, 61, 10, 5, -88, -63, 153, -71, -71, -21, -26, 70, -41, -102, -8, 91, -133, 6, -142, 10, -105, 152, -13, -162, -28, -17, 15, -232, -32, 17, -157, 68, 0, -178, 76, 98, -87, -92, -167, 49, 28, -3, -165, 74, -207, -59, -27, -107, 103, 233, -93, -32, 14, -97, 71, -15, -75, -133, -67, 211, 208, 115, 241, 140, 80, 224, -133, 50, 100, -3, 44, -64, 49, -306, 13, -16, 118, -67, + -32, -19, 92, -94, -8, 31, 68, 62, -8, -100, 29, 41, 85, 62, 98, -93, -48, -12, -164, -14, 58, 157, 179, -15, 105, 77, 1, 72, 88, 118, -29, 9, -66, 22, -55, 57, -72, -87, 51, 56, -204, -207, 81, -31, 173, 158, 21, -4, 327, -95, -1, 260, 18, -164, -221, 156, -60, -8, -135, 34, -95, 103, 506, -192, -141, -190, -189, 26, -154, -404, -5, 29, 6, -167, -28, 117, -156, -106, 238, 66, -55, -67, 154, -86, 111, 87, -210, -153, -123, 127, -105, -77, -56, -84, -9, -157, + 3, -57, 37, -33, -311, 131, -174, 124, 26, -271, 52, 157, 51, 266, -120, 5, 31, 58, 93, -108, 42, -16, 86, -123, 54, 77, -80, 42, -43, -277, 81, 280, 217, 263, 37, -43, -223, -102, -108, -70, 218, 323, 16, -9, 216, -347, 2, -16, -12, -104, -126, 145, 157, 20, -40, 80, -179, -117, 130, -130, 276, 270, 39, 173, 129, 44, -117, 58, -9, -179, 190, 2, 88, 176, -187, -51, -221, -28, 50, 229, -212, -61, 155, -8, -135, 252, -188, -371, 69, -196, -97, 132, -95, 42, 17, -52, + 135, -107, 93, -50, 13, -365, 84, 332, 35, 47, 111, 312, 52, -310, 347, 144, 132, 201, 188, -3, -53, 191, 159, 48, -129, 166, 91, 248, 303, 109, -60, 5, 10, 121, 383, 219, -192, 359, 28, -44, 61, -264, 308, -38, 20, -33, 90, -37, 167, -210, 316, 260, 7, -43, -150, -313, -92, 133, -56, -112, 187, 206, -114, -110, -387, -131, -30, -9, -435, 244, 47, -252, -194, 76, -79, 29, -65, 30, -81, -52, 180, -224, 10, -9, 20, 332, 201, -14, 440, 187, 399, 82, 143, 402, -150, -285, + -161, 375, 107, -227, 308, -90, -158, 253, 638, -171, 46, 90, 134, -171, 35, 334, 52, 413, -77, 445, 337, 100, 285, 162, -145, 104, -25, -49, 60, 23, -12, 112, 101, 286, 216, -253, 104, 103, -162, 4, -407, -560, 242, -149, -339, -85, -172, 231, 76, -120, -248, 205, -169, 120, -185, 14, -48, 273, 72, -109, 137, -198, -237, 28, 15, 60, -142, 163, 190, -24, -117, -429, -358, -284, 137, 34, 74, -351, 227, 153, 282, -302, 291, 215, -164, -145, -79, 286, 207, -129, 37, 434, 230, 111, 262, 172, + 77, -146, 42, 19, -52, -161, 398, 181, -351, 244, 253, 242, 200, 52, -213, 8, -18, 340, 57, 153, 320, -53, -322, 77, 194, 344, -440, -253, 140, 9, 58, -265, -50, -255, -20, 126, -70, -134, -127, 79, -15, -53, 162, 20, -281, 287, 186, -87, 116, 173, -189, -65, 738, -24, 289, 201, -611, -326, -32, -25, -4, 350, 81, -168, 364, 223, -42, -57, 118, -56, -124, -271, -321, 182, -68, -149, -12, -502, -91, 38, 283, -329, -93, 48, 26, 79, 28, 363, -412, -131, 95, -6, -243, -43, 326, 288, + 243, -56, -412, -177, 151, -34, 278, -2, -6, -190, -130, 262, -300, 225, 152, -184, -112, -14, 1, -137, 67, 58, -130, -3, -543, -48, 91, 361, 62, -28, 242, -177, 508, -503, -31, -117, 99, -36, -23, 115, -75, -178, -94, -109, -277, -57, 228, -58, -112, 302, 15, 365, -347, -219, 484, -56, -7, 19, -271, -42, -343, 99, -415, -19, 349, -114, 245, 284, 194, 223, -271, 288, 59, -778, -103, 107, -35, -92, -302, 256, -252, -61, -288, -305, -431, 409, 37, 478, -205, 359, 521, -323, 430, -481, -339, -424, + -88, -297, 102, 75, 8, -133, 35, 380, 597, 104, -180, -316, 189, 581, -12, 177, 11, 241, 137, 188, 289, -357, -48, -124, 466, 374, -37, 573, 276, 63, -546, -248, -422, -173, 20, 163, -165, 33, 547, -95, -21, 41, 562, -346, -166, -134, -80, -339, 379, 37, 246, -409, 33, -36, -274, -91, -487, 153, -16, 105, -82, -21, -563, -176, 184, 346, -126, 94, 686, -43, 13, 133, 294, -301, 39, 357, -241, 251, 53, 259, -323, -180, -67, 2, 62, 114, -338, -504, 137, -50, -517, 145, 48, 470, 408, -378, + -461, 107, -353, -180, 11, 697, 7, -84, -622, -306, -56, -459, -705, 486, -183, -218, -42, 526, -165, 61, -105, -101, -304, -158, 51, -731, -472, -133, -267, -246, -84, -285, 252, 116, 83, -174, 130, -1057, 989, 579, -95, -134, 561, 33, -324, -473, -51, -167, -186, -287, -277, 358, 353, -160, 761, -423, -320, -318, 27, 216, -817, 225, -226, 410, -376, 136, 39, -141, 226, 494, 51, 1165, 392, -34, 60, -466, -581, 723, -209, 72, 983, -266, -39, -221, 768, 133, -307, 435, -156, 653, 357, 152, 106, -89, -248, -99, + -62, -731, -173, -132, 402, -239, 81, 114, -506, -782, -21, 640, -38, 565, -95, -839, -310, 15, 191, 125, -659, -18, -184, 459, -488, 586, 911, 559, -177, 81, 371, -159, 714, 787, 729, 204, 801, -60, -311, 67, -402, -555, 294, -244, 610, 281, 183, -270, -686, -492, 197, -575, -264, -596, 351, 433, -3, 212, 147, 210, 179, 80, -42, 103, -119, 226, -397, -1123, -444, 618, 43, -182, -369, 0, 528, 665, 151, -404, -62, 533, -630, 65, -68, 478, 553, -429, 834, 164, 47, 1165, 21, -359, 422, -188, 74, -242, + 104, 776, 107, 987, 434, -850, -918, -198, 267, 532, -704, -250, -80, 890, 835, -684, 2, -415, 297, -137, 958, 21, -171, 612, -85, -696, -331, -110, 697, -569, 373, 967, 367, 654, 97, -499, 360, 648, 454, -822, -462, 600, 1621, 152, 316, -433, 105, 28, -124, -401, 92, -106, 754, 689, -881, -315, 840, 506, 273, 152, 433, 616, 133, 393, 262, -342, 15, -333, -221, 173, -122, 132, -386, -239, 192, 6, 281, 328, -818, 650, 69, 540, -568, 377, 422, -284, -644, -518, -710, -575, -597, 287, 924, 353, 247, 562, + -23, 97, -441, 768, -895, -1543, 497, -247, -14, -1221, 231, 567, -36, 452, 225, -192, 392, 290, 374, -534, -284, -70, 343, -714, 1196, 576, -100, 660, 391, 629, -328, -412, -407, 762, 269, 144, 682, -588, -1927, -120, 132, 238, -1082, 849, 616, -1156, -891, 38, 487, 50, 281, 627, -155, 393, -553, -636, -503, -661, -1030, 299, 122, -691, 939, 367, -208, -212, -527, -401, -930, -511, 362, 849, -295, 89, 376, -744, 572, 733, 144, -189, 667, 167, 116, -450, -457, -63, 942, -277, -640, -22, -777, -1001, -708, -600, -176, -409, + -742, -369, -404, 489, 924, 360, -438, -887, 956, 537, -477, -235, -260, 72, 217, -280, 492, 487, 15, -294, -309, -259, -47, 205, -153, -287, -750, 253, 637, -346, 561, 45, 372, -293, 414, 1275, -482, 576, 1064, 223, -207, -262, 295, 64, 530, -378, 1460, -411, -1020, 280, -480, 1229, 355, -306, 34, -641, -1007, 1263, 93, -238, 1127, -517, 93, -239, 610, -744, -1050, -541, 90, 552, 563, 494, 613, 1479, -291, 678, -302, 919, -144, 38, 1080, 131, -603, -678, -618, 1133, -757, 460, 519, -342, 103, -596, -144, 519, -449, 381, + -152, -750, -1698, -128, 1524, 664, 156, -275, -458, -55, -600, 225, -845, 1046, 79, 156, 88, -308, -1017, -355, 829, -633, -164, -425, 376, -291, 1146, -140, 246, -370, -1047, 282, -796, -134, -56, -1436, -1236, -1132, 411, -163, -620, -359, -390, -318, -552, -322, -77, -1267, 396, 220, 495, -200, 1106, -41, 289, -207, -75, 469, -851, 569, -208, -275, 475, 263, 571, -226, -1148, 319, 29, 1911, 1983, 222, 31, 448, 243, 479, 860, 300, 892, 1318, -325, 158, -1090, -173, 150, -159, -321, -682, -555, 293, 311, -1473, 1041, 264, 1467, -106, + -292, 464, -105, 1531, 389, -94, 291, 292, -422, -955, -749, -383, 1141, 5, 1254, 147, 1224, -365, -1727, -643, -518, 879, 81, -827, -1228, -836, -200, 1043, -939, -778, -560, 936, -502, -238, -1192, -1098, 251, 216, 1271, 389, 1, -36, 211, 61, 58, 1150, 483, -600, 1148, -94, -2145, -688, 1418, 1509, -1033, -1096, -1050, 594, 983, 1856, 616, 229, -1016, -119, -12, 413, 994, 674, 113, -1136, -2138, -585, -1050, 1653, 1816, 3060, -848, -2936, -571, -1002, 2361, 790, 2395, 610, -697, -2224, -1434, 100, 362, 2532, 1107, -61, -1978, -3580, -850, 111, + 1766, 3836, 929, 1186, -2340, -3697, 269, 911, 3093, 1813, 1369, -630, -2303, -1908, 97, 616, 55, 1503, -1072, -900, -150, -2107, 325, -1175, 1587, 40, 166, -624, -1660, 1020, -1671, 1767, 168, 227, 278, -939, 929, 175, 621, -897, 265, 85, 1131, -405, 219, 884, -997, -453, 10, -761, 1280, -228, -639, 1298, 1325, -299, -1118, -179, -994, -92, 489, -12, -1219, 213, 537, -325, 615, -497, 191, 817, -373, 564, -1374, -1234, 1258, 816, 1983, -12, -593, 1814, -1064, -815, 542, 654, 922, -834, -491, 325, -249, 1041, -842, -2375, 591, 1340, -17, -944, + 184, 717, -438, -151, -454, -40, -655, -398, 2470, 678, 681, -2102, -534, -1648, -1400, 1248, 1306, 2603, 1192, -355, -518, -311, 809, 564, 1, 1257, 230, -519, -619, -498, 891, -15, 774, 355, 456, 101, -227, 71, -34, 96, -238, -80, 229, 191, 1676, 1345, 1089, -133, 269, -734, -155, -474, -826, -862, 203, 398, 604, 746, 609, -467, -1100, 1537, -1191, -563, -345, 479, 18, 706, 763, 634, -1012, -434, 87, -454, -1537, 923, -340, -330, 468, 816, 986, 501, 769, 531, 22, -3118, -1665, -2111, 1524, 445, 4490, 4802, 4633, 5459, 5225, 3899, + 2317, 3072, 1274, 403, -2513, -2031, -5455, -4614, -4281, -2367, -3179, -2263, -193, -608, -298, -208, 42, 177, 175, 811, 704, 835, 1922, 2133, 2096, 1676, 4150, 1297, 1794, 3099, 3274, 1437, 3305, 4119, 3152, 2917, 2810, 587, 1749, 3556, 3368, 2395, 2866, 2696, 156, -513, -407, -1224, -1750, 151, -1968, -2964, -2368, -2717, -4394, -1690, -2869, -3049, -4623, -3479, -4213, -4327, -3077, -4192, -4669, -3579, -1844, 365 } + } }; -const Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS][2522] ={ -{ - -154619, - -186831, -354335, -231928, -195421, -302795, -255551, -139586, -156766, 88047, 347892, - -710817, 8590, -49392, -223338, -341450, -1176821, -1245541, -1842541, 2450279, -165356, - -944893, -646393, 803159, -1430224, -251256, -532576, -322123, -446677, 2136746, 959925, - -1288490, -676457, -586263, 118112, 25770, -350040, -893353, -1471026, 1803886, -901943, - 1157494, 788127, 1047972, -418759, 1404454, -8549132, 743029, -985695, 326418, -848256, - 40802, -947040, 100932, -2246268, -1413044, -176094, -1194001, -283468, -498216, 2327872, - 173946, -2561948, 2261300, -788127, 1217623, 109522, 878321, -2549063, -762357, -629213, - 313533, 517544, -259846, -723702, 936303, -1340030, -255551, -781684, 347892, 201863, - 1103807, 998580, -1157494, -639950, -23622, -408022, 886911, 49392, 758062, -700080, - -732292, 1088774, 4417374, -1859721, 1979980, -779537, 732292, 17180, 1052267, -395137, - 287763, 481036, 554051, 605590, 996432, -186831, 143881, 1814624, 1350767, -3416647, - 719407, -392990, 204011, -1127429, 807454, -1432372, 1509681, 1288490, 633508, -133144, - -444529, -485331, 1073742, 1028645, -416612, 283468, 1836099, -616328, -21475, -554051, - 227633, 345745, -38655, -446677, 865436, 199716, -253403, 17663054, -1191853, 2525441, - 34360, 852551, 418759, 667867, 483184, 1756642, -886911, 781684, -261993, 360777, - 1009317, 1511829, 659278, 347892, -605590, 1378685, -863288, 564788, -354335, -1318555, - 231928, 543313, 139586, -369367, 210453, -423054, 998580, -1806034, 526134, -373662, - 586263, 36507, -2523293, -852551, 360777, 468151, 397284, -401579, -496069, -461709, - 468151, 1063004, -322123, 10552735, -12588549, 2450279, -3062312, 1595580, -1999307, 1468879, - -2714419, -858993, -1690070, -360777, -1413044, 57982, 2422362, 3517578, 1462436, 732292, - 30065, 1058710, 2527588, 1793149, -1198296, -1473174, -1904818, -962073, -1110249, 27917, - -201863, -238371, 27917, 470299, -893353, 1030792, -1168231, -1606318, 539018, -103079, - 94489, 236223, -1078037, -1290638, 350040, -820339, -1000727, -277025, 126702, -24412594, - 4733054, -1333587, 502511, 414464, -2149631, -1024350, 1816771, -423054, 49392, 2063732, - 586263, -932008, -1627793, 1406602, 12885, -1937030, -2744484, -3901978, 1105954, -1791001, - 270583, -646393, 590558, -487479, 146029, -2070174, -2070174, -1309965, -644245, -1322850, - 242666, -687195, 566936, 2188286, 266288, 307090, 1382980, 328565, 223338, -137439, - -425202, -1591285, -485331, 266288, -408022, -29152090, 10771778, -2808909, 3388729, -1799591, - 2411624, -1479616, -500364, -2566243, 1795296, -3017215, 1840394, -584116, 2617783, -3790309, - 848256, 3384434, 901943, -2989297, -1146756, -1825361, -843961, 1037235, 446677, 753767, - -577673, -1054415, -1524713, -1428077, -238371, -1625645, -399432, -1511829, -1159641, -4105989, - -1262720, -614180, 94489, 51540, 1279900, 564788, 1256278, -178241, 1481764, 352187, - 8590, 3775276, 12799003, -3339337, 5757404, -3253438, 1608465, -3519726, 3030100, -107374, - 3287798, -90194, -182536, 3262028, -380105, -264141, 2838974, -1155346, -2360085, -3792456, - 3646427, -111669, 2531883, 457414, 1829656, 1007170, -2183991, 1161789, 1047972, 30065, - 1299228, 2003602, -2175401, 493921, 38655, 0, -1206886, -392990, -1181116, 551903, - -165356, 1196148, 3064459, 324270, 1599875, -55835, 382252, -103079, 545461, 1419487, - 38317552, -9300752, 3745212, -1702955, 3324305, -1279900, 2574833, -1245541, 953483, -3588445, - 1829656, -3418794, 2817499, -949188, 899796, -895501, 3921305, 665720, 1054415, -1694365, - 2589865, -79457, -1067299, 2276333, -1567663, -2413772, 146029, -648540, 1299228, 141734, - -311385, -680752, 442382, 75162, 547608, -1602023, 476741, -616328, 2811056, -347892, - 1372242, 416612, 1157494, 2231236, -1370095, 283468, 521839, -526134, 1655710, 3094524, - -19939386, 7696582, -6234145, 3474629, -3163244, 914828, -4127464, 2469606, -1715839, 3502546, - -515396, 1447404, -3307125, -1496796, -311385, -1312113, -1187559, 4050154, -3193308, 380105, - 1861868, -3994320, 895501, 1198296, -1050120, 1159641, 356482, 597000, -2527588, -382252, - -863288, 1337882, -1292785, 652835, -2954938, -758062, 2042257, 841814, 605590, -914828, - -493921, -2383707, -2398739, 1086627, 420907, -294205, -390842, -395137, 165356, 10737, - -530428, -676457, -32205812, 10316511, -5843303, 1275605, -695785, 1608465, -2564096, 2409477, - -1221918, -1088774, -474594, 1685775, -1168231, -1692217, 944893, 3414499, -644245, -47245, - -6195491, 319975, -45097, 2746632, -1097364, -659278, -4760971, -1791001, -77309, -124554, - 1477469, 1995012, -3620658, -3423089, 1947768, 302795, -3721589, -2987150, 1239098, 556198, - -324270, -335007, -1490354, 1183264, -539018, 281320, 83752, -2126009, -893353, 768799, - -3006477, -1702955, -670015, 367220, -667867, -32100586, 14020921, -7941395, 5804649, -5572720, - 2570538, -6322192, 1290638, -4157528, 6247030, -3339337, 2106682, -498216, -107374, -3027952, - -992137, -1305670, 5624260, -1191853, 2787434, 4602058, 2521146, 609885, -801011, 1045825, - -1202591, 2549063, 2353642, 289910, -1464584, 380105, 292058, -1810329, -983548, 1269163, - 1705102, -1492501, -1617055, -1507534, -115964, -650688, 597000, -1447404, 781684, -2248416, - 423054, -1245541, -315680, 197569, -1120987, -1226213, -1775969, -1455994, 12083890, 12545599, - -4352950, 4312147, -4795331, 974958, 1735167, 332860, -1784559, 2499671, 807454, 5085242, - 2772402, 5714454, -618475, 3448859, -659278, 2272038, 3137474, -204011, -3796751, 4028679, - -184684, 1799591, -663572, 176094, 790274, 4879083, 940598, -2377265, -622770, 794569, - -1159641, 3715147, 1760937, -386547, -672162, -1842541, 1831804, -1806034, 2272038, 2276333, - -1307818, 1372242, 1357210, 719407, 103079, 3590593, 2390149, 2665027, 165356, 448824, - 1395864, -592706, -17180, 36290328, -12700218, 4660040, -5830418, 4286378, -3770981, 5456756, - -1608465, 416612, -3755949, 8096014, -929860, 7307887, 661425, 1380832, -4569845, 1864016, - 7408819, -2059437, -5819681, 1039382, 489626, 2946348, -4123169, 3708704, 206158, 446677, - -133144, -4080219, -983548, 826781, -4801774, 962073, 2319282, 1810329, -1157494, -289910, - 81604, 2480344, 989990, -298500, -758062, 1949915, 1561221, 4687957, 1475321, -588411, - 2858301, 1116692, 36507, 934155, 2250563, 1365800, 577673, 388695, 12008729, -17538498, - 10378788, -7838316, 3178276, 1110249, -880468, -725850, 1984275, -4458176, -2892661, -2336462, - -1872606, -6066642, 2942053, -5634997, -330712, -4516158, 1531156, -3408057, -2763812, -1380832, - 4960687, 674310, 4821101, 2561948, 3262028, 4861903, 126702, -648540, -880468, 1355062, - 3624953, -335007, -412317, -2527588, 1767379, -319975, -1644973, 1382980, 1011465, 3919158, - 1449552, 1848983, -2935610, -1292785, -319975, -508954, 1754494, -5607080, 1050120, -1365800, - -1114544, -1722282, -2141041, -642098, -2121714, 820339, -1535451, -191126, -3135326, -37192268, - -8231305, 1569811, -7164006, -3032247, 163209, -347892, -6128919, 1589138, -6105296, 49392, - 4660040, -1017907, -940598, 2514703, 1584843, 2564096, 12885, 3128884, -1943473, 805306, - 3618510, -371515, -382252, -2579128, 3435974, -2886218, -1672890, 831076, 1301375, 2630668, - 8293582, -2415919, -1524713, -3738769, 53687, -2778844, 487479, -1166084, -4125316, -339302, - 4928475, 1342177, -3579855, -1788854, 1533303, -2160369, -2753074, 408022, -1380832, 223338, - 382252, 3131031, 300648, 1503239, 687195, -2755222, -1535451, 1632088, 1428077, -1136019, - -45475112, 37445672, -13149042, 11087458, -8248485, 6219113, -2418067, 3938485, -4389457, 2619930, - 3096672, 4460324, -2974265, 5409512, 2682207, 9249212, -1483911, 712965, -4954245, 1172526, - -1748052, -3163244, -3837553, -4479651, -4063039, 5954972, -283468, 7164006, 1874753, 1236951, - -128849, 826781, -3204046, 414464, -1168231, 1406602, 4299263, 661425, 1421634, 141734, - 455267, -3384434, -1782411, -246961, -240518, 311385, -985695, -3139621, 85899, 3096672, - -1024350, 813896, 955630, -2811056, 1853278, 639950, 1028645, -702227, 324270, -448824, - -811749, 26598732, -3944928, -8413841, -2841121, -1672890, -1247688, -7393786, -3828963, 2226941, - 1413044, 2278480, 2800319, -4926328, 2164664, -861141, 1939178, 8244190, -8078834, 2967823, - 2959233, 2340757, -1995012, -4608500, 3818226, 1236951, 2765959, 5134634, 126702, 7026567, - 717260, 3341485, 388695, 2312840, -1775969, 2746632, 1995012, 2628520, -846109, 968515, - -85899, 3330747, 4043712, -5686537, 7969312, 813896, 2302103, 491774, 1471026, 1675037, - -1559073, 4866198, 2641405, 335007, 4408784, 1990717, -2287070, -40802, -1505386, -1552631, - -1213328, 947040, -264141, 433792, -38655, -4647155, 21120502, 1979980, 4413079, -5280663, - -891206, -13333726, 3358665, -493921, -9032316, 7840463, -4112431, 431644, 5763846, 2697240, - 4357245, -3081639, 1988570, -4086662, 199716, -3468186, 1475321, -5357972, 8033737, 5888400, - 4786741, 5626407, 1316408, -1627793, -3324305, 1720134, 4447439, 191126, 3060164, -1962800, - 693637, 3066607, 2121714, 2778844, 266288, 1118839, -249108, -1662152, 1913408, -1093069, - 929860, 947040, -1827509, 2765959, -3433826, 3313567, -1582696, 2396592, 3420942, -3927748, - 457414, 661425, -1642825, -3062312, 2323577, -5085242, -4039417, 2690797, 1080184, 1331440, - 1028645, 3416647, 3148211, 33006824, -27597312, 9244917, -6927782, 2330020, 8519068, 6895570, - -4687957, 8282845, 4647155, 4962835, -3539053, 2254858, -1838246, 9844065, 2699387, 2701535, - 3790309, 4099546, 2609193, 2761664, -8233453, 1189706, -14832670, -5265630, -1423782, -8594230, - 2076617, 4406637, -3242700, -4728759, -5448166, -5325760, -2811056, 2834679, 2308545, -7675107, - -8748848, -822486, -4479651, 2216203, 1896228, 665720, -657130, 3951370, -2196876, 34360, - -605590, -2025077, -5622112, 4148939, 7331509, -1187559, -949188, 3262028, -5214091, 6090264, - 1597728, -3405909, -143881, -3186866, -1273458, -981400, -2145336, -811749, -1460289, -4599910, - -51460152, 4840428, -4810364, 1632088, 4980015, 3496104, 10211285, -4546223, -599148, 586263, - 12272869, 4086662, -10028749, -6661495, 5289252, 7136088, -2083059, -3060164, -429497, 3146064, - 7423851, 7501161, -330712, -14179835, -4239133, -1711545, -1883343, 7793218, -3917010, 4432406, - 257698, -1168231, -7419556, 283468, 5549098, -9519795, -5604933, -2463164, -1806034, -4672925, - -3843996, -8927090, -1773822, -6152541, -118112, 962073, 6053757, -4550518, -2952790, 221191, - -777389, 652835, -5506148, 1784559, 1902671, 345745, 182536, -4385162, -3788161, -2383707, - -1247688, -659278, -7005092, 1063004, 1971390, -3345780, -6395207, -29828548, 32169306, -4303557, - 2257005, 7784628, 9255655, -6528351, 4571993, 1988570, 5796059, 4052302, 8083129, 4726612, - -5113159, -8562017, 1466731, 9661529, 18912888, -4224101, -6158983, 5201206, 3229816, -3268470, - -9032316, -1565516, -1675037, -8022999, 7477538, 9021579, 304943, 2349347, -10737, 7170448, - -5181878, -16200617, 7125351, -1642825, 5677947, 2997887, 371515, -3743064, -6225555, 4760971, - 5336497, 4168266, -620623, 27917, 5843303, 3590593, 1872606, -3034395, 4924180, 4410932, - -575526, -865436, -2710124, 3697967, 186831, -7765301, 6790344, 4417374, -1451699, 2325725, - -953483, 616328, -96637, 2388002, 5815386, 2388002, -974958, -1627793, -186831, 9120363, - 461709, -6790344, -14093935, 3569118, -657130, -11557757, 4030827, -3725884, 618475, -4277788, - -3390877, 3848291, 8967892, 1264868, 11854110, 5527623, -5894843, -7630010, 12953621, -5418101, - -380105, 1342177, -12094628, 100932, 6431714, -6835441, -1855426, 8319352, 517544, 4447439, - 122407, 5557688, -914828, -3408057, -506806, 7320772, 9554155, -2911988, 1906966, 1900523, - 6343667, -3566970, -725850, 1488206, -1683627, 4395899, 1795296, 597000, -2267743, 3573413, - 3584150, 453119, 64425, 3021510, 4179003, -4915590, -169651, 1711545, 2201171, -2388002, - 1956358, 67632848, -5948530, 1617055, 4694400, -5525476, -9891310, -5553393, -2068027, -11345156, - -12189117, 1466731, -10730976, -4458176, -2716567, -2282775, 7462506, 8555575, 3098819, 17373142, - 3616363, -7876970, 15105400, -972810, 10866267, -2808909, -508954, -9098888, 942745, 8961449, - 296353, -3650722, -1047972, 1346472, -1522566, -1309965, 3884798, -7148973, 3715147, 1627793, - -2989297, -6753836, -4269198, 6066642, 6146098, 7043747, -10402411, 6706592, 2383707, 231928, - 1194001, 1597728, 1928440, 1941325, -219043, 1103807, 6594923, -1127429, 3068754, 3274913, - -1644973, 5400922, 6382322, 1492501, 360777, 5723044, 4563403, 3453154, -39795020, -66496832, - 23562190, -2035815, 9571335, -11924977, 148176, -13750338, -2145336, -19666656, 7939247, 8589935, - -854699, -1825361, -672162, 1488206, -5065914, -16784732, 29897268, 1808181, -4348655, 10118943, - 1382980, -5763846, 14093935, 15921444, -7441031, 9292162, 1361505, -2314987, -15687368, -8555575, - 11353746, -6337224, 1153199, -1041530, 7535520, -12597139, -14465450, 1767379, -350040, -9605694, - 5117454, 972810, -6448894, 3985730, -7056632, -5551245, 1971390, 2323577, -266288, -1868311, - -3672197, 3736622, 5854041, 837519, 1393717, -1958505, -2525441, 5587753, 2147, 1204738, - -6468221, -1380832, -4563403, 3152506, 4017942, 23622, 3165391, -21440476, 63735168, -28552942, - 4599910, 4028679, 15835544, -2177549, 10033044, -10245644, 418759, -19514184, -3923453, -21475, - 7593502, 1187559, 7816841, -5658620, -12008729, 1430224, -17952964, -18745384, 294205, -6204081, - -599148, 1535451, 2413772, -4679367, -3362960, -6704444, -10378788, 4037269, 4612795, -13176960, - -6244883, -16546362, -36507, -7301445, 5639292, 6970732, -13939316, 2177549, 10926397, 10166188, - -5579163, 3743064, -4217658, -1853278, 2821794, -6083821, -1681480, 5845451, 4116726, 4054449, - 4447439, 2716567, -1823214, 3947075, 2098092, -2660732, -564788, 7937100, -1245541, -3335042, - -1584843, 3448859, -3788161, -7621420, -1073742, -2428804, 1488206, 2070174, -1730872, -53369264, - -16930762, 5381594, -8927090, 6977175, -4069482, -478889, -16155519, -19245748, -3139621, -7086696, - 7221988, 1692217, -2888366, -39178692, 18779744, 850404, 16280074, 20504174, 13911399, -20723218, - -5574868, -2469606, -5695127, 3848291, 4138201, -852551, -8027294, 7672959, -14340896, -7803956, - 11448235, 130997, -5916318, 13707388, -384400, 14405320, -5860483, -2864743, 1047972, 4185446, - -11398843, -8351564, -2624225, 7915625, -3816079, 891206, -4133906, 5136781, 6242735, 895501, - -431644, -12837657, -2115272, 5585605, 5942088, -4342212, 6734509, 2031520, -2997887, 1507534, - -8647917, -2901251, -6126771, 4597763, -197569, -2323577, 794569, -13737453, -1022202, 1932735, - 5134634, 34452080, 12047383, -19662360, -2832531, -8080981, 7709467, -11585674, 10881300, -1591285, - 12545599, 8995809, 15092515, -18764712, 24019604, -13642964, 14304389, -7125351, 8815420, 2293513, - 7569880, -11699491, -27975270, 11862700, 20489142, -6433861, 8757438, -9320079, 2976412, -5832566, - 21494164, 629213, -1486059, 5834713, -9582072, -6210523, -5385889, 10048076, 654983, -2488934, - 564788, -901943, 14907831, 10557030, -4831838, 5598490, 5997922, -5001490, -2931315, -4389457, - -10363756, -496069, 734439, -448824, -3500398, -9990094, 38655, 17935784, 9633612, -5942088, - 9889162, 122407, 307090, 9064528, 4591320, -6844031, 3491809, 3027952, 8753143, 11229192, - -7462506, 4909148, 6255620, 71146136, -58815284, -10249939, 2488934, -1597728, -16557099, 4930623, - 3811784, 22370338, -7889855, 3990025, 18393198, -6442, 10913512, 36612448, -8450348, -2957085, - -19701014, -18627274, 468151, 5581310, -8506183, 2948495, 32403380, 18356690, 2385854, 635655, - 2340757, 17510582, -15436112, -7314330, -1146756, 8708046, -1750199, 1591285, -7958575, 2224793, - -13907104, -8699456, -10574209, -534723, -9491878, 1490354, -16690243, 6844031, -33084134, -9159018, - 4260608, 5289252, -1466731, -8364449, 2308545, 152471, 3708704, -9824738, 3770981, -6126771, - -6163278, -15386720, -11025181, -4116726, -2040110, -253403, 2216203, 3637837, 622770, 1163936, - -8939974, -1172526, -10896332, -2778844, -1153199, -1005022, -46145128, -32396938, -3197603, -7284265, - 22879290, -135291, 3547643, -30629560, 710817, 3146064, 889058, 1344325, 17121888, -23293756, - 3936338, -5738077, -16172699, -8446053, 13443248, -5961415, 10816875, -4952098, 5965710, 2619930, - -3118146, -2783139, 6882685, -2059437, -807454, -20169166, 8781061, 7511898, 7432441, 8252780, - -17817672, -18784040, 9678709, 14259291, -19069654, 5690832, 2061584, 14830522, 8613557, 395137, - 10185515, -6796786, -11652246, -2843268, -21960168, -16866336, -2207613, -1990717, 2987150, -11454678, - 3186866, -9442486, -27844272, -9311489, -7705172, -28402618, -180389, -5708012, -3326452, 1814624, - 8379481, -9283572, 5242008, 2156074, -12105365, -9107478, -9113921, -3231963, -2282775, -28630252, - 42610372, -22943716, -10054518, -13552769, 2965675, 3373697, 5886253, -3032247, 18300856, 13868449, - -13975824, -24202140, 8452496, -9229885, 21492016, 1586990, 8856223, 11360188, -8901320, -8265665, - 28673202, -16924318, -4651450, -8647917, 403727, -3620658, 3240553, -5042292, -2611340, -22632330, - 19228568, -6990060, -2480344, 23553600, -16870632, -20332376, 1093069, -9186935, -14164802, -6442, - -7662222, 5446019, -30189326, -9616432, -8059506, -523986, 9463960, 347892, 1153199, 5602785, - -5976447, 4378719, 5942088, 6300717, 5555540, -3384434, -7262790, -5022965, 6382322, -17304424, - -5001490, -3672197, -5553393, 12191265, -9088151, -11811160, 11327976, 4520453, 6242735, 15680926, - -6912750, -4191888, 5808944, -7239168, -60080152, 28559386, 30872224, 15300821, 13853417, -11602854, - 14108968, -26575110, -103079, -31056908, -4876936, -14173392, 13005161, -15438260, -12822625, -4372277, - -22905060, 5332202, -10952167, 8566312, -21534966, 33266670, -12199855, 15081778, -15013058, 178241, - -15028091, -5761699, 6947110, 20800526, 23888608, -13664438, -738734, -8617852, -13885629, -11297911, - -36129264, -2205466, 5117454, -34608848, 12167642, 5134634, 8323647, 14450417, 9259949, 3846143, - -11912092, -5175436, -13183402, -7885560, 5939940, -28179280, 9775346, 3539053, 1015760, -14272176, - -8070244, 5046587, 20776904, 7164006, 4926328, -10372346, 8351564, -777389, -10711648, 612033, - -7851200, -13853417, -6478958, -5164698, -10857677, 9313637, 6549825, 6790344, 5400922, 48462264, - -34196528, -14613626, -4827543, -639950, 23280870, -4986457, 7226283, -14199162, 6786049, -8980777, - -39313984, -27028230, -10548440, 13464722, -2308545, -21773336, -20714628, -42576012, -14304389, 5048734, - 5010080, 1617055, -5059472, -2800319, -13816910, 3135326, 4750234, 6902013, 886911, -2175401, - -5828271, -20349556, -5920613, -4771709, 9328669, -2274185, -16879222, -6448894, 3824669, -18159122, - 2257005, -18691698, 9513353, 14510547, -14693083, -26944478, -6088116, -8437463, -13228499, 1372242, - 1535451, 2774549, 5699422, 506806, -11506217, 17117592, 25301652, -12375948, 9932112, 4739497, - 11474005, -18580028, 6195491, 2920578, 5791764, -26718992, 20605106, 3365107, 1400159, -2409477, - -16698833, 5229123, 798864, 5446019, 79901424, -44201656, 4389457, -4211216, -9143985, -32948842, - -1436667, -1619203, 27382564, 12547747, 54956256, -21519934, 2510409, 6128919, 13501230, -5441724, - -2068027, 22241488, -13415330, 31937376, 19791210, -44171592, 42691976, 14931454, -14693083, -10954314, - -16054588, -8637179, 3599183, 1939178, -11343009, 28011776, 4206921, -13471165, -11257109, 2675765, - -14063870, -26089778, 934155, 15429670, 6884833, 18766860, -8038032, 5740224, 20989506, 28941638, - 7653632, -30283814, 10703059, -9880572, -15745350, 4183298, 13627931, 7106024, -2746632, -27556510, - -22954452, 33479270, -3425237, 25814900, 4069482, -10499048, 13926431, -22817014, -8768176, 10700911, - -1576253, 22265110, -16537772, -35742716, -8360154, -1629940, -9030169, -8074539, 24567212, -91016800, - -59569048, 20192788, -31535798, 8446053, -16363825, -55568288, -41414224, 71290016, -34591668, 31507880, - 17295834, -20194936, 15695958, -12006581, 21638046, 24051816, -2830384, -8450348, 42277512, -15395310, - -50304804, -466004, -21754010, 3743064, 3470334, 28138478, 14416058, 4844723, 13230647, -14510547, - -1161789, 30930206, 19432580, -7084549, 7142531, -29719026, -45118632, -33685428, -23807004, -7632157, - -7391639, 6871948, -5229123, -13516262, 27066884, 6156836, -22295176, -21071110, -6807523, 6951405, - -22428320, 7299297, 25230786, -1745904, 8802535, -19262928, 12998719, 9036611, 2241973, 9270687, - -16857746, -25675314, -35512936, 16331613, 12783970, 221191, 12777528, 1690070, -16484084, -4069482, - 843961, -28177132, -2435247, -43115028, -108757160, 35147864, -9927817, -8497593, 17813376, 3229816, - 9350144, 45268956, 26590142, 33797096, 16458315, 46684148, -9764608, -48556752, 5654325, -6882685, - -21386790, -43250320, -19393924, 34733400, 7033009, -4202626, 6388764, -4486094, -672162, 28924458, - 2725157, 9603547, -5793911, 5783174, 29411936, -10286447, -21674552, 13655849, -37602440, -38570952, - -24670292, -6575595, -68719, 13219909, 34735548, -1455994, -13413183, -37735584, -59526100, -22664542, - -9564892, -5615670, -1413044, 19428284, -27812060, 46076408, 24084030, -6822556, 12899934, -21283710, - 2478196, -1911261, 21354578, 40789304, 28129888, -27751932, -11626476, 4829691, -5046587, -7795366, - 1277753, -15476915, -42726336, -5465346, -8628589, -5145371, 5656472, -18083960, -6317897, 46284716, - 46795816, 17667348, 32152126, 24017458, 48930416, -38049116, 50745040, -56081536, -7803956, 57793080, - 77951512, 18558554, -2302103, 30313880, -20716774, -24152748, 57022132, 11716671, -5980742, 16237124, - 46282568, -8553427, 29298120, -5800354, -8624294, -2214056, 22151294, -47729972, -3871913, 27812060, - -8965744, 5757404, -15693810, 13746043, 42507292, -33874408, 14237817, -7705172, 15380278, -16071768, - 29237990, 5699422, 11952894, 14416058, -42840152, 25505664, -60518236, -9174050, 37626060, 7481833, - -20295868, 42973296, -11491185, -19855634, 30492120, -7801808, -6152541, -472446, 19138374, 1565516, - 6429566, -29910152, 14261439, 7655779, 68661496, -45606112, -20298016, 10986526, -11491185, 20523502, - 20046760, -18141942, 47437912, 24715390, 89990304, -55656332, 2463164, -8531953, -14716705, 2332167, - -20282984, -8117488, -66163972, -54911156, -55177444, 19151260, -11480448, 18983756, -12627204, -39449276, - 64063732, 45466524, -29886530, -24174224, -35317516, -6468221, 13516262, 22093312, 25679610, -839666, - 19758998, -4728759, -25739740, -29847876, 18904298, -12936441, 58037892, 37892348, 53429392, 8875550, - 19005230, 54511724, 36161476, -10267119, 8948564, -897648, -169651, 7176891, -25692494, -16226386, - 8564165, -29300266, -33002528, 32695438, 34009700, -36687612, -2512556, 70461088, 46366320, -382252, - -24096914, -2804614, 12627204, 15182709, -10956462, -23061826, 28787018, 556198, 5516886, 24726126, - 25679610, -26115548, 10153303, -1479616, 8967892, -41661184, 5471789, 44957572, -43971876, 71509056, - 26852136, -10821170, -3444564, 21646636, -28284508, -36500780, 29233694, -43396348, -55787332, 13372381, - -30438434, -39011188, -20822002, 34954592, 87578680, 35493608, -49334140, 89590872, 9457518, -15470472, - 15277199, -54284092, 12393128, 6045167, -39114268, 31574452, -11334419, 5160403, -28490666, 14016626, - -26149908, 44568876, -55583320, -21466246, -19978040, 24472724, 28726888, 25172804, -30148522, 6923488, - -31494996, -10260677, 14832670, 36786396, 16406775, -19327352, 36045512, 17349520, 28759102, 225486, - 33696164, -17255032, 17892834, -55508156, 58536108, -7252053, 6629282, -18079664, -33253784, -622770, - 18075370, 45730664, 11918534, -59987808, 22061100, -25909390, 44588204, 1264868, -21311628, 6124624, - -19518478, 6541235, -38442104, 9674414, -146872848, 8398809, 26753352, 60275572, 21081846, -89661736, - 123768072, 46514496, -53901840, 21908628, 123147448, 29072634, -27496380, -1836099, -71487584, 39573828, - 5488968, -16945794, 12601434, 26989574, -45584636, 27311698, -57610544, 8156143, -52289080, -47053516, - -18668076, 24861418, 37185828, -24867860, 32839320, -51163796, -5336497, 61482456, 7849053, -19580756, - -4602058, 13569949, -11343009, -37400576, -41382008, -3850438, -17555678, 45030584, -57741540, 66024384, - 23160612, 10247792, -18562848, -4945655, 32594506, -21863532, 43057048, 12071006, 39361228, -11126113, - -17549236, -61018600, 25209310, -4099546, -61403000, 21900038, -358630, 42073500, 68266360, -24575802, - 19235012, 33992520, 38785704, 9386651, -13743895, -1318555, -72357312, -1451699, 15056008, 21627308, - 10587094, }, - { - -182536, - -236223, -500364, -326418, -137439, -575526, -801011, -73014, -431644, -382252, 109522, - 214748, 113817, 68719, -304943, 766652, -88047, 429497, -1116692, -1288490, -15032, - -2291365, -904091, 942745, 92342, 277025, 184684, 1599875, 23622, 682900, 120259, - 1043677, 66572, -809601, -1120987, -1318555, -2293513, 165356, -223338, 81604, -940598, - -156766, 646393, 790274, -530428, -622770, -9895605, 953483, -2156074, -103079, -783832, - -1453846, 805306, 3341485, 40802, 1715839, -1864016, -468151, 1314260, -1198296, 405874, - 2334315, -1348620, -429497, -614180, -113817, 367220, -463856, 691490, 463856, -502511, - 893353, -502511, -17180, -1857573, 15032, -161061, 470299, 354335, 901943, -770947, - 1529008, -195421, 1277753, -375810, 4295, 987843, -289910, 730144, 328565, 745177, - 158914, 708670, 4215511, -3240553, 2072322, -2553358, 1352915, -1228361, -1213328, -715112, - -676457, 790274, 897648, -3169686, -143881, 506806, -289910, -500364, -1846836, -646393, - 1365800, 2061584, 1043677, 3229816, 678605, -530428, 685047, 590558, -298500, 1082332, - 2299955, -833224, 4295, 1007170, -2147, -180389, -1599875, -23622, 850404, 702227, - 158914, 85899, -515396, 616328, -34360, 111669, 57982, 15255724, -904091, 1406602, - -874026, 1060857, -1067299, 326418, -195421, -186831, 957778, -719407, -2667175, 876173, - 371515, 932008, 1952063, 1075889, 758062, -169651, -1507534, -468151, 824634, -137439, - -167504, 1634235, -1883343, -549756, 57982, -259846, -397284, 824634, 912681, 1090922, - 380105, 438087, -322123, 1483911, 30065, 1155346, 854699, -178241, -47245, 586263, - 107374, -229781, -49392, 11108933, -10692321, 1627793, -2916283, 1498944, -231928, 1067299, - -1056562, 1958505, -886911, 1166084, -2576981, 49392, -1507534, 369367, -264141, -403727, - -712965, -1928440, -219043, 165356, -949188, 1475321, -717260, -1174674, -1432372, 779537, - -923418, 2117419, -249108, -57982, 622770, -57982, 27917, -1039382, -833224, -296353, - 208306, -444529, -953483, 760209, 584116, 1423782, -358630, 414464, -216896, -26268020, - 2959233, -2070174, -53687, -410169, -2304250, 2265595, -695785, 105227, 891206, 197569, - 2639258, -240518, -1234803, 3191161, 1219771, 2871186, -176094, -4050154, -2476049, -2005750, - 1513976, -2162516, 57982, -852551, -811749, 135291, 496069, -700080, -1355062, -1022202, - 680752, 798864, 1604170, -238371, -356482, -208306, 949188, -1294933, 193274, 373662, - 672162, -1071594, 899796, -1277753, -326418, -33159296, 11849815, -4945655, 5413807, -3962107, - 2413772, -4284230, 2241973, -3208341, 1065152, 2192581, -15032, 775242, 1975685, -1464584, - 1380832, -1846836, -1423782, -3949223, 3365107, -2357937, 2207613, 79457, -154619, -3783866, - -277025, 620623, -670015, -212601, -283468, 1451699, -377957, -1166084, 1013612, 272730, - -624918, -4295, -105227, 55835, 513249, -1071594, 2403034, -281320, -1769527, -238371, - -1041530, 1760937, 15156940, -3096672, 5828271, -2480344, 2083059, -1982127, 7226283, -1226213, - 3910568, -292058, -161061, 1108102, 111669, -4735202, 1219771, -289910, -2093797, -377957, - 188979, -5987185, -66572, 667867, 2044404, 115964, -1069447, -73014, 2201171, 554051, - -949188, -1896228, 3251290, -1786706, 10737, -2746632, -240518, 186831, 588411, -528281, - 852551, 1449552, -1163936, 1189706, 21475, 989990, 21475, 1640678, -670015, -244813, - 39917428, -11291469, 1990717, -1687922, 2871186, 304943, 231928, -5055177, 2649995, -2050847, - 1894081, 852551, 1095217, 2005750, 2935610, 702227, 1187559, -4196183, 1902671, 1952063, - -2637110, -264141, 3287798, 2265595, 2190433, 4612795, 2660732, 932008, 1391569, -1307818, - 1614908, -77309, 2725157, 3536906, -212601, 1400159, 2267743, -534723, 938450, -2486786, - -519691, 3131031, 281320, -1644973, -442382, 1178969, 2312840, 186831, 1408749, 2669322, - -21348134, 8770323, -6322192, 3878356, -3813931, 4602058, -3234110, 27917, -2765959, -3427384, - -4670777, 135291, -2817499, 1120987, 1406602, 3240553, -5718749, 3262028, -1445257, 4602058, - 955630, -491774, 285615, 156766, -1226213, -1181116, 644245, -2512556, 1423782, 2486786, - -3766686, -1050120, -289910, 1243393, -1473174, 3639985, -4112431, 534723, -60130, -12885, - -1791001, 12885, -1136019, 760209, 122407, -77309, -1269163, -498216, -2594160, -1157494, - -163209, 274878, -34308200, 10703059, -7123204, -601295, -1548336, 2001455, -6021544, 274878, - 1756642, 1406602, -2175401, 1022202, -2744484, -4475356, -1795296, 388695, -2692945, 8907762, - 146029, -2677912, -925565, -3195456, -1518271, 2602750, 1565516, 3423089, -416612, 1428077, - -2113124, 657130, -1917703, -803159, -1153199, 420907, 1045825, -758062, -1812476, 242666, - 588411, 2297808, -496069, -1105954, -3296388, -2841121, -1314260, -710817, 560493, 238371, - -1370095, -751619, 204011, 983548, 586263, -33077690, 15260019, -7451769, 6708739, -3764539, - 3897683, 1855426, 1058710, -3908420, 264141, -2070174, 365072, -5061619, 1644973, 2909840, - 792421, -5370857, -2789581, -2776696, -2939905, -1941325, 3528316, 749472, 2418067, 1967095, - -1140314, -354335, -4161823, 4945655, -1672890, -652835, 96637, -1224066, -1795296, -1975685, - -654983, -4273493, 989990, -2325725, 1413044, 1320703, 2130304, -766652, 10737, -2811056, - 760209, 1866163, 210453, -556198, 135291, 1436667, 2044404, 895501, 10788958, 13318694, - -5862631, 3639985, -1726577, 1425929, -1305670, 856846, 1282048, 6564858, -2171106, 2757369, - 6204081, -1569811, -120259, -940598, 1604170, 3223373, 3352222, 4267050, 1267015, 3639985, - -770947, -2031520, -6987912, 1574106, -938450, -3508988, -2405182, -55835, -526134, 2366527, - -176094, -4075924, -4112431, 1209033, -3549791, 556198, 2422362, -3279208, -2065879, -1365800, - 1829656, 1552631, 64425, -392990, 2673617, 577673, -781684, 1045825, -1967095, 313533, - -944893, -1584843, -901943, 38031936, -13230647, 7181186, -4956393, 7138236, -5022965, 4376572, - -1621350, 4445291, 1090922, 3126736, -3627100, 3730179, -1264868, -3103114, -307090, -3335042, - -5304285, -2813204, -564788, 2688650, -3627100, -4879083, -5952825, -1082332, -508954, 4760971, - 2628520, 3053722, -2083059, 2465311, -1879048, -1876901, -1009317, 3131031, 2731599, 828929, - -6442, -135291, 100932, -906238, -485331, 2156074, 435939, 5338645, -2046552, -672162, - -4460324, 2899103, -1159641, -725850, -1047972, -309238, 264141, -777389, 10803990, -16200617, - 9691594, -5985037, 7554848, 38655, 4735202, 1425929, -7035157, -3270618, -2291365, 998580, - 1913408, 1125281, 8199093, -4419522, 6575595, 1247688, 940598, -4292820, -835371, 5703717, - -246961, -4614943, 5514738, 4243428, 1032940, -2098092, -1632088, -345745, -253403, 2624225, - -1103807, 1239098, -2899103, -543313, 1866163, -4230543, 1791001, -1565516, 1685775, -1136019, - -257698, 5265630, 2347200, 3053722, -96637, 1337882, 2016487, -259846, -1282048, -2141041, - 912681, 1163936, 1967095, 2334315, 661425, -373662, -2123861, -908386, -2145336, -41004052, - -8693014, -1606318, -7267085, -3324305, 5551245, 2063732, -2269890, -2095944, -5362267, -3758097, - -4443144, -4954245, -4166118, -2871186, -3811784, -6184753, -5321465, 1324997, -5392332, 1097364, - -7084549, -324270, -3208341, -2725157, 5278515, -1133871, -3266323, 3169686, -4634270, 3377992, - 717260, 3592740, 2368675, -633508, -2437394, 3803194, -506806, -1224066, 3526168, -2209761, - -5836861, -6665789, -2001455, 1464584, 867583, -2383707, -605590, -2252710, -32212, -487479, - -100932, 3246995, 1093069, -3343632, -1445257, -88047, 2027225, -30065, 3229816, 395137, - -47652664, 41418516, -16904992, 11458973, -10829760, 2594160, -5312875, 6947110, 1340030, 740882, - -3371549, 4666482, 998580, -8654359, 910533, 1157494, -4254165, -6713034, 6579890, 7958575, - -2540473, -2274185, 1430224, 3577708, -2095944, 7206955, -130997, 1694365, -5239860, -2085207, - -3066607, 4608500, -936303, 839666, 1181116, -2974265, 4808216, 4232691, 1382980, 1290638, - 5632850, -3582003, -697932, -964220, -3766686, 571231, -2377265, 674310, 98784, 45097, - 4692252, -493921, -766652, 648540, 493921, 2559801, -2435247, 652835, 109522, 5325760, - -1404454, 32190780, -3435974, -6240588, -1183264, 4675072, 2598455, 2334315, 156766, -4013647, - 1483911, 3092377, 3429532, -1610613, -1516124, 6824703, 2576981, -4599910, 1458141, 8714489, - -9985799, 7346542, 1219771, 9279277, -210453, 929860, 2115272, 2216203, 5035849, -3008625, - -927713, 2177549, 3719442, -886911, 279173, 869731, 1151051, 2546916, -3889093, 347892, - 2845416, 1155346, -1982127, -274878, 5845451, 4496831, 2280628, -1638530, -1183264, 2040110, - -354335, -882616, 1312113, -1217623, -2295660, 6116034, 2549063, 4105989, 899796, 3221226, - 2544768, 2922725, 584116, 3442416, 1773822, 2596308, 15152645, 4445291, 3685082, -2145336, - -1447404, -4024384, -2905546, 833224, -1591285, -1924145, -5869073, 5108864, 3466039, -3549791, - 6249178, -5776731, -1801739, 2755222, -4395899, 2673617, 4028679, 6352257, 5433134, 5377299, - 2654290, -10881300, -64425, -2147484, 2136746, -886911, 4234838, 3113851, -1520418, -2491081, - 2727304, -1769527, 7170448, 212601, 2280628, 7610682, 6932077, -5108864, 294205, -3281355, - -6524056, -438087, 1015760, -551903, -1496796, -410169, 341450, -2699387, 171799, -3186866, - -1209033, -113817, 670015, 330712, -2299955, -1848983, 4140349, -1241246, 369367, 2310693, - 2117419, -1011465, -1735167, 35766340, -25016038, 9223442, -9446781, -652835, -6573448, 6109591, - 6081674, 2010045, 1312113, 5742372, 15665893, -13608604, -1806034, -3483219, -5426691, 12154757, - 9197672, -1791001, -8175470, 3427384, -6659347, -5336497, -9369471, 1279900, -9594957, -3137474, - 5826123, 891206, -2864743, -7943542, 128849, -1868311, 4980015, 4535486, 2181844, -3577708, - 665720, -169651, 2089502, 3921305, -2330020, -1181116, -4217658, 6637872, -691490, 1026497, - 5995775, -1157494, -408022, 2400887, -2819646, -253403, 2677912, -4310000, 1123134, -758062, - -249108, -4496831, 2342905, -923418, 523986, 1172526, -1550483, 3036542, -2220498, -551903, - -55843164, 7410966, 498216, 3627100, -4548371, -7211250, -309238, 4378719, 7112466, -721555, - 10958609, 5993627, -7879118, -7048042, 4975720, 682900, -5690832, -10320806, -11815455, -7657927, - -8789651, -9788230, 1451699, 2785286, 2269890, -7303592, -7052337, 792421, -2050847, -1398012, - -1170379, -5871221, 4505421, -9932112, -3886946, -1709397, -612033, 2873333, 835371, -893353, - 4224101, -1584843, 4211216, 2349347, -3689377, 339302, 7005092, -3107409, -3148211, -17180, - 4002910, 897648, -3257733, -4069482, 3311420, -2147, -5327907, 6803228, 7642895, 773094, - -2482491, 766652, -377957, 1505386, 3249143, -498216, 4389457, -34022584, 29091960, -9717364, - 6212670, -141734, 4836133, -11755325, 4541928, -8001524, 17180, -5398774, 10894185, 9332964, - 3478924, 801011, -9012989, -5901285, -970663, -3551938, 10314364, -8407398, -392990, -4127464, - 15116137, -4752382, 1288490, -345745, 2540473, 1279900, 2523293, 2005750, -2600603, 1466731, - -706522, 5407364, 715112, 10159745, 5104569, -3124589, -798864, -1127429, 60130, -3706557, - -2838974, -826781, 1653562, 12390981, 962073, 966368, -3524021, 5147519, -2022930, -2461016, - 1436667, -2383707, 1322850, -2993592, -7056632, 3569118, 2823941, -783832, 6940667, 1698660, - 1464584, 2750927, -2171106, 1026497, -1829656, 6994354, 4554813, -438087, -2207613, -1737314, - -779537, 21938692, -762357, 4739497, -15354508, -2776696, 1642825, -12446815, 708670, 16597901, - -3206193, 940598, -7876970, -10703059, 2383707, -9803263, 14598594, -10602127, 3296388, 3234110, - 7690139, 5905580, -1896228, -9498320, -1342177, -1140314, 4438849, -6751689, -1526861, -2194728, - -3352222, -2491081, 4228396, 2465311, 11774653, 3779571, -4771709, 4683662, -3566970, -3781719, - 3420942, 9992241, -1773822, -5667210, -5278515, 5141076, -427349, -7831873, -7181186, 3163244, - 2989297, -3478924, -5985037, -9837623, 2319282, 3115999, 2074469, -5753109, 3719442, 2029372, - 1387274, 75975824, -4415227, 3444564, 7316477, -6216965, -2428804, -1861868, -17413944, 12365211, - -1546188, -10638634, 2772402, -5259188, 6876243, 5544803, 8632884, -2529736, 11577084, 10005126, - 6511171, -9470403, 7956427, -13140452, -7625715, -8811125, 4017942, -6674379, -916976, -2001455, - -8667244, -4490389, 7982197, -5257040, -3932043, -8207683, 3152506, 3199751, 6807523, -3231963, - 11458973, 3191161, 13011603, -1037235, 2641405, 2967823, -6661495, 5405217, 13297219, -4054449, - -36507, 3936338, -3451006, -4823249, 3388729, -4808216, -2506114, -6412386, -4172561, 5446019, - 4793184, 3423089, 5113159, 6463926, 6053757, 9092446, 1660005, -2235531, -34218004, -66363688, - 23553600, -521839, 554051, -7305740, -7806103, -2319282, 1449552, -4984310, 16316581, -8662949, - -15801185, 154619, 107374, -2705830, -6126771, 10950019, 1258425, -5972152, 4567698, -11087458, - 12259984, -8072391, -4724464, -9670119, 13769665, -7050189, -3040837, -9579925, -5035849, 7264937, - -4657892, 7930657, -12098923, -13720273, 107374, 1578401, 1282048, -1030792, -7737384, 571231, - 2478196, 1056562, 5787469, -708670, 9637907, 813896, 8955007, 12427488, 1666447, -1647120, - 1393717, -7988639, -2969970, -12902082, -12023761, 2559801, 2117419, 1503239, -1904818, -4129611, - -2997887, -3618510, -2858301, -3605625, -1151051, -882616, 1056562, -22316650, 63715840, -29540786, - 12990129, -6528351, 19956566, -3530463, -9403831, -9691594, 4919885, -3094524, -1651415, 178241, - 3528316, -21816286, -10988674, -5819681, 8078834, 6947110, 12064563, 2061584, -2428804, -2214056, - 14542759, -19801946, 10799695, -9627169, -2531883, -10118943, 14987288, 6073084, -10730976, 1178969, - -5063767, 1522566, 5961415, -28265180, -12410308, 2179696, 9195525, -5909875, 1374390, 7097434, - -3659312, -3283503, -1782411, 10786810, 3513283, 1775969, 405874, 4114579, 11940009, -7834021, - 4971425, -18019536, -4011500, 3977140, 7709467, 1559073, 261993, 354335, 3650722, -3577708, - -551903, -1333587, -5381594, -3764539, 5484673, 6440304, -3779571, -3502546, -12597139, -57833884, - -12741020, 5299990, -13975824, 3113851, 2162516, 8111046, -388695, 15749645, 10136123, 5499706, - -4758824, -8186208, -768799, 16694538, -14897094, -5845451, -11632919, -539018, -31155692, -24556476, - 1148904, 14781130, 20349556, 4509716, -7934952, 6798933, -7095286, -4741644, -4964982, 1786706, - 5022965, 1065152, 7655779, -6380174, -11368778, 8811125, 5536213, 18788334, -2768107, 2856153, - -3171833, 15113990, -16423955, -8259222, -4236985, -12358768, 7252053, -5231270, 6008659, -13215614, - 12468290, 12343736, 11074573, -4934918, 9749576, 332860, 3062312, 5793911, 3758097, -5647882, - 412317, -1911261, -848256, 11581379, 3848291, -5424544, 8985072, -1801739, -8860518, -3021510, - -1189706, 42247444, 27657442, -7982197, 12835510, -27154930, 20008106, 7707319, 15184857, -4453881, - -3173981, -14594299, -7275675, -25348896, -3983582, -20057498, -5770289, -12124693, -12528420, -16937204, - 7451769, -23356032, 3708704, 10971494, -4127464, 3884798, -9844065, 491774, -2750927, -2783139, - -13595719, -1251983, 2083059, -309238, -1711545, -6702297, -5946382, 5005785, 5063767, 6760279, - 30895848, -11587822, -264141, 13033078, -2516851, -4357245, -11250667, 4333622, 10769630, 17839146, - 6193343, 15010911, -13511967, -20173462, 2415919, 14514842, 8093866, -10499048, 13537737, -9081708, - 6721624, 3463891, 12322261, 7614977, 4745939, 8976482, -7724499, 6077379, 4604205, 3401614, - 11987254, 3695819, 9655086, 84174920, -54479512, -2967823, 6326487, 1677185, 6652905, 11506217, - -2299955, -1887638, 6500433, -9766756, -9253507, -1576253, 7505456, 30236570, 1322850, 10398116, - -9700184, 532576, -29890824, 18421114, -18047452, -25907242, 6079526, 7136088, -9494025, 8495445, - 3704409, 19872814, 22239340, -3824669, -8259222, -6468221, -32987496, -18212808, 26057566, 8368744, - 9667971, -15135465, -15191299, 4314295, -2834679, -13428215, 11639361, -2772402, -8096014, -9816148, - 6672232, -8847633, -4395899, 30071214, -18365280, 5257040, -6468221, 6640020, -8151848, -3874061, - -22488448, 3328600, -8188355, -6199786, 18358838, 3770981, 5297842, 10295037, 13406740, 3154654, - 9375914, -4926328, -790274, -15915001, 7123204, 11111080, -54286240, -27687506, 7808251, -5128191, - 17091822, -4567698, -6910603, -17005924, -18878528, 7101729, -19655918, -7997229, -11993696, -3841848, - -12558484, -9126806, -10479720, -6227703, -12534862, -21895744, 9528385, -41611792, -2413772, 33762736, - 6678674, -2027225, -11753178, 687195, -38021196, 13022341, 6996502, 652835, 10941429, 17499844, - -17328046, -9856950, -17965848, 506806, -1552631, -11233487, -12884902, -13737453, -9229885, -2370822, - 5716602, -1170379, 4269198, 1851131, -1436667, 22883586, 3667902, -5791764, 17276506, -11383811, - -24599426, -8652212, -5003637, -5007932, -3880503, -9504763, -4230543, -11398843, -4881231, -11555610, - -1664300, 3478924, -13436805, -4806069, -8776766, -1307818, -13892072, -15479062, -9244917, -32813550, - 42868068, -21977348, -11267847, -36013300, 27045410, -10249939, 15627239, 575526, 259846, -11181947, - 20955146, -5800354, 6272800, 5046587, -10786810, -3693672, -4090956, -19091130, 2847563, 3173981, - -15487652, -24623048, -16134045, -22634478, -6466074, 12055973, 5347235, -13316546, -14224932, 19591494, - 12423193, -17001628, 14489072, -8439611, 12652974, -21464100, -18221398, -16303696, 4597763, -14381698, - 7930657, -6365142, 2583423, -3758097, -3423089, 3678640, 14304389, -33960308, -5759551, 7243463, - -4589173, -9977209, -26246546, -1694365, 21184926, 511101, 18114024, 15150497, 2592013, -2093797, - 13376676, -14115410, -13922136, 10475425, -5327907, -8272107, 4589173, 2961380, -9043054, -9388799, - 16217797, -15341623, -10900627, -8302172, -75301512, 26718992, 10773925, -19681688, 8267812, -22142704, - 18092550, 15418933, 13041668, -39101384, 22108344, 39318280, -6513318, 12676596, -296353, -13612899, - -17366700, 43387760, -1522566, -4992900, -25376814, -49411452, -27099096, 1359357, -22310208, 16724603, - -32592360, -11641509, -19619410, 3998615, -8231305, -24773372, 3040837, -6609955, 14600741, -6395207, - -19494856, -8310762, -57793080, 8995809, -2697240, 25082610, -17033840, -19056770, 23577222, 3919158, - 3077344, -11072426, -16196322, 4161823, 10189810, 6818261, -4992900, 7312182, 3663607, -304943, - -6019397, -6687264, -19832012, 139586, -8564165, -12283606, 8699456, 4183298, 26467736, 4423817, - -19945828, -20121922, 2723009, -13529147, -10477573, 1726577, -10969346, -1773822, -6433861, 65075196, - -21414706, 3478924, 6483253, 29027536, -298500, -1911261, 20787642, 33691872, -17605070, -20615844, - 21537114, -345745, 19108310, 26600880, 22434762, 20038170, 16408923, 19134080, 63138168, -1803886, - 7359427, 15036681, 36124968, -3526168, -9268539, 16172699, 1997160, -7428146, -10481868, -8244190, - 3193308, -11716671, 25832080, 38115688, 1067299, -5050882, 17343078, -4838281, 23590108, 18479096, - 3393024, -14209899, 16492674, 2340757, -2963528, 6575595, 438087, 44070660, -496069, 21386790, - -5948530, 39788576, -410169, 7206955, -9506910, -17729624, 21294448, -6706592, 39202312, 12156905, - 20207822, 4436701, 3296388, 14884209, 6008659, 30371862, 17761838, 9341554, 16456167, -10387378, - 9369471, 16892106, 5239860, 951335, 79392472, -23957328, 6599218, -8431021, 2576981, 9657234, - 25924422, -21556440, 10183367, -1009317, 274878, 14128295, -13215614, 15197742, -43589624, -19565724, - 5710159, 15408195, 9710921, 33352568, -34978212, 5005785, -6590628, -46027016, 17871358, -17944374, - -13374528, -6732361, -39462160, 12238509, 11343009, 5935645, -21614422, -32779190, 10844792, -20194936, - 15685221, -31275952, -1799591, -37407016, -11598559, -24809878, -24294482, 22765474, 32205812, 5355824, - 10140418, -15433965, 3719442, -26225070, 8531953, -16922172, 1887638, 26557930, 9966472, -8179765, - 12320114, 3549791, 10065256, -10557030, 19018116, 39848708, -1743757, -22209276, -20246476, -9178345, - -8602819, 3848291, 12771085, 4876936, 23237920, 1370095, 5278515, -24215026, -10131828, -82693152, - -69518344, 28162100, -9491878, 32899450, -3515431, 10219875, -41918880, -39286064, -24315958, 12068858, - -32678258, -22683870, -10322954, 5617817, 22280142, 7546258, -47508780, 11819750, 25076166, -66756676, - -8849780, 2488934, -71092448, -24736864, 30227980, -65609920, 30814242, 32841468, -590558, -9998684, - -3678640, -16234976, -18279380, 11065983, 13295071, 48148732, -29850022, -15659451, -13174812, -23134842, - 246961, -39101384, -10726681, 2469606, -2205466, -13009456, -3094524, -21683142, -5463199, 11474005, - -6481106, -14227079, 14920716, -7885560, -16993038, -22844932, 46720656, -2282775, 27940910, 3612068, - 9635759, 31406948, 3184718, 21356724, -15803332, 23783382, 15818365, 5065914, 4597763, 5731634, - 19000936, 9326521, 1758789, 19748260, -133412424, 49426484, -15277199, -60234768, -15124727, 809601, - -15970836, 22286586, -52117280, 24096914, -4685810, -60058676, -41386304, 7335804, 23057532, 21438330, - 15854872, 34089156, 9524090, 56577604, 31009664, 66436700, 8332237, 53779432, -42520176, -34108484, - 10937134, 3803194, -33775624, 8370892, 6734509, -5660767, -13069585, 31379032, 5888400, -72567768, - -32184338, 22885734, 7969312, -16282221, 20177756, 19726784, 32231582, 5823976, 9393093, 4879083, - 9195525, 10642929, -25078314, 2531883, 4344360, -54159536, 24704652, 17046726, 22217866, -37580964, - -21266530, 25082610, -201863, -8415988, -5718749, -16917876, -13980119, -1348620, -18549964, -42116448, - 13460428, 41871636, -30949534, 2718714, -17937930, -8579197, -13507672, -5542656, 20862804, 54090820, - 36028332, 24414742, 12506945, 98784, -14647986, -21412560, 15801185, -57221848, 56985628, -37978248, - 7739531, -61976380, -3934190, 55143084, 20555714, -21734682, 34256660, -58963460, 21133386, 9049496, - 2218351, -72239200, -22986664, 2675765, 9528385, 43692704, -71313640, -11055246, -24951612, -67076652, - -16247861, 13984414, 30743376, 47309064, 36135708, 36185100, -5224828, -26128434, 22952306, 5768141, - -17033840, 7142531, -34035468, 48954036, 21644488, 15311558, -28660316, -60022168, -17748952, -637803, - -72690176, -58972048, -17295834, -53167400, 30449170, 10544145, 7778186, -25769804, -27769112, 7481833, - 4567698, 1816771, 13146895, -12444668, 9219147, 30799210, 12487617, 2671470, 1696512, -25467008, - -21507048, -20409684, 6751689, -10312216, 62865436, -51316268, 12219182, -8377334, -7718056, -146029, - 16537772, -32508608, 40531608, -13398150, 27442694, -4170413, -24365350, 42971148, 42653320, 29903710, - -15768972, 65798900, 23809152, -76656576, 76469744, 5585605, -1269163, 54526756, 1447404, -25853556, - -33532958, 53747220, -35648228, -47811576, 43785044, 37419904, -26390426, -63114544, 23164906, -22771916, - 7617125, -44944684, -36350456, -16426102, 41019084, 35865124, 4099546, 32736240, -51017768, 14345191, - -14027363, -20553566, 23218594, 1475321, 6573448, -72153304, -20001662, 37102076, -50957640, -15064598, - -63722284, -13769665, -24262270, 8542690, -15951509, 5012227, 5753109, -4284230, 5574868, -18979460, - -56717192, -12678743, 27702540, -5888400, 18854906, -23506356, -50242528, -10387378, 9204115, 58134528, - 4462471, -16849156, -41669772, -1322850, -19969450, 15601469, -34488588, 22020298, 13793287, -29875792, - -31001074, 46750720, -55048596, -1889786, 35192964, -39417064, 12543452, 45810120, -36464272, 31565862, - 22591528, 33799244, -55280524, 47908212, -55538224, 17132624, -42399916, 5798206, -21917218, 37965364, - 672162, 23523536, 11289322, -38478612, -24436216, -53407920, 31033286, -35867272, 31177168, -43233140, - -50886772, -83187072, 7539815, 45226004, -7449621, -169651, 13224204, 39294656, -13683766, 11536282, - -47300476, 13239237, 60883308, -4700842, 55080808, 74902080, -1402307, 14078903, 14093935, -29302414, - 15247134, -35723392, -2935610, -36494336, -38781408, 4898410, -15373835, -60883308, 42232412, 4526896, - 31157840, -33543694, -20250770, -9081708, -131915624, 33137820, 49042084, 13411035, -57299160, -8626442, - 92595200, -106970456, -2939905, -18281528, -70014408, -17884244, -47517372, 17031692, 17003776, 40495100, - 16301548, -56100864, -20038170, 39889508, -63898376, -18427558, -68326488, 57747984, 17184164, 45075680, - 77184856, -27668180, -16621523, -13172665, -39086348, 36739152, -18504866, -46660524, -52155936, -9539122, - 19542102, -1930588, 10217727, 12133283, 29757680, -13791140, -1838246, 21786222, -22022444, 43241732, - 49392124, 46420008, -38697656, 4423817, -12494060, 21784074, 93445600, 69795368, 133983656, 9850507, - 52445844, 42191612, -21384642, -5611375, -8087424, -13625784, 15835544, 2828236, 47150152, 35298188, - -18004502, -6281390, -30651034, -57956288, 20508468, -2261300, 16578574, -5486821, -42722040, -6655052, - 118112, }, +const Word16 CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS][2474]={ {-1, -1, -3, -2, -1, -2, -2, -1, -1, 1, 3, -5, 0, 0, -2, -3, -9, -10, -14, 19, -1, -7, -5, 6, -11, -2, -4, -2, -3, 16, 7, -10, -5, -4, 1, 0, -3, -7, -11, 14, -7, 9, 6, 8, -3, 11, -65, 6, -8, 2, -6, 0, -7, 1, -17, -11, -1, -9, -2, -4, 18, 1, -20, 17, -6, 9, 1, 7, -19, -6, -5, 2, 4, -2, -6, 7, -10, -2, -6, 3, 2, 8, 8, -9, -5, 0, -3, 7, 0, 6, -5, -6, 8, 34, -14, 15, + -6, 6, 0, 8, -3, 2, 4, 4, 5, 8, -1, 1, 14, 10, -26, 6, -3, 2, -9, 6, -11, 12, 10, 5, -1, -3, -4, 8, 8, -3, 2, 14, -5, 0, -4, 2, 3, 0, -3, 7, 2, -2, 135, -9, 19, 0, 6, 3, 5, 4, 13, -7, 6, -2, 3, 8, 12, 5, 3, -5, 11, -7, 4, -3, -10, 2, 4, 1, -3, 2, -3, 8, -14, 4, -3, 4, 0, -19, -7, 3, 4, 3, -3, -4, -4, 4, 8, -2, 80, -96, 19, -23, 12, -15, 11, -21, + -7, -13, -3, -11, 0, 18, 27, 11, 6, 0, 8, 19, 14, -9, -11, -15, -7, -9, 0, -2, -2, 0, 4, -7, 8, -9, -12, 4, -1, 1, 2, -8, -10, 3, -6, -8, -2, 1, -186, 36, -10, 4, 3, -16, -8, 14, -3, 0, 16, 4, -7, -12, 11, 0, -15, -21, -30, 8, -14, 2, -5, 5, -4, 1, -16, -16, -10, -5, -10, 2, -5, 4, 17, 2, 2, 11, 3, 2, -1, -3, -12, -4, 2, -3, -222, 82, -21, 26, -14, 18, -11, -4, -20, 14, -23, 14, + -4, 20, -29, 6, 26, 7, -23, -9, -14, -6, 8, 3, 6, -4, -8, -12, -11, -2, -12, -3, -12, -9, -31, -10, -5, 1, 0, 10, 4, 10, -1, 11, 3, 0, 29, 98, -25, 44, -25, 12, -27, 23, -1, 25, -1, -1, 25, -3, -2, 22, -9, -18, -29, 28, -1, 19, 3, 14, 8, -17, 9, 8, 0, 10, 15, -17, 4, 0, 0, -9, -3, -9, 4, -1, 9, 23, 2, 12, 0, 3, -1, 4, 11, 292, -71, 29, -13, 25, -10, 20, -10, 7, -27, 14, -26, 21, + -7, 7, -7, 30, 5, 8, -13, 20, -1, -8, 17, -12, -18, 1, -5, 10, 1, -2, -5, 3, 1, 4, -12, 4, -5, 21, -3, 10, 3, 9, 17, -10, 2, 4, -4, 13, 24, -152, 59, -48, 27, -24, 7, -31, 19, -13, 27, -4, 11, -25, -11, -2, -10, -9, 31, -24, 3, 14, -30, 7, 9, -8, 9, 3, 5, -19, -3, -7, 10, -10, 5, -23, -6, 16, 7, 5, -7, -4, -18, -18, 8, 3, -2, -3, -3, 1, 0, -4, -5, -246, 79, -45, 10, -5, 12, -20, + 18, -9, -8, -4, 13, -9, -13, 7, 26, -5, 0, -47, 2, 0, 21, -8, -5, -36, -14, -1, -1, 11, 15, -28, -26, 15, 2, -28, -23, 9, 4, -3, -3, -11, 9, -4, 2, 1, -16, -7, 6, -23, -13, -5, 3, -5, -245, 107, -61, 44, -43, 20, -48, 10, -32, 48, -26, 16, -4, -1, -23, -8, -10, 43, -9, 21, 35, 19, 5, -6, 8, -9, 19, 18, 2, -11, 3, 2, -14, -8, 10, 13, -11, -12, -12, -1, -5, 5, -11, 6, -17, 3, -10, -2, 1, -9, + -9, -14, -11, 92, 96, -33, 33, -37, 7, 13, 3, -14, 19, 6, 39, 21, 44, -5, 26, -5, 17, 24, -2, -29, 31, -1, 14, -5, 1, 6, 37, 7, -18, -5, 6, -9, 28, 14, -3, -5, -14, 14, -14, 17, 17, -10, 10, 10, 5, 1, 27, 18, 20, 1, 3, 11, -5, 277, -97, 36, -44, 33, -29, 42, -12, 3, -29, 62, -7, 56, 5, 11, -35, 14, 57, -16, -44, 8, 4, 23, -31, 28, 2, 3, -1, -31, -7, 6, -37, 7, 18, 14, -9, -2, 1, 19, + 8, -2, -6, 15, 12, 36, 11, -4, 22, 9, 0, 7, 17, 10, 5, 92, -134, 79, -60, 24, 9, -7, -6, 15, -34, -22, -18, -14, -46, 22, -43, -3, -34, 12, -26, -21, -11, 38, 5, 37, 20, 25, 37, 1, -5, -7, 10, 28, -2, -3, -19, 13, -2, -13, 11, 8, 30, 11, 14, -23, -10, -3, -4, 13, -43, 8, -10, -9, -13, -17, -5, -16, 6, -12, -284, -63, 12, -55, -23, 1, -3, -47, 12, -47, 0, 36, -8, -7, 19, 12, 20, 0, 24, -15, 6, 28, + -3, -3, -20, 26, -22, -13, 6, 10, 20, 63, -18, -12, -29, 0, -21, 4, -9, -32, -3, 38, 10, -27, -14, 12, -16, -21, 3, -11, 2, 3, 24, 2, 11, 5, -21, -12, 12, -347, 286, -100, 85, -63, 48, -18, 30, -33, 20, 24, 34, -23, 41, 21, 71, -11, 6, -38, 9, -13, -24, -29, -34, -31, 46, -2, 55, 14, 9, -1, 6, -24, 3, -9, 11, 33, 5, 11, 1, 4, -26, -14, -2, -2, 2, -7, -24, 1, 24, -8, 6, 7, -21, 14, 5, 8, -5, 3, + 203, -30, -64, -22, -13, -9, -56, -29, 17, 11, 18, 22, -37, 17, -6, 15, 63, -62, 23, 23, 18, -15, -35, 29, 10, 21, 39, 1, 54, 6, 26, 3, 18, -13, 21, 15, 20, -6, 7, 0, 25, 31, -43, 61, 6, 18, 4, 11, 13, -12, 37, 20, 3, 34, 15, -17, 0, -11, -12, -9, 7, -2, 3, 0, -36, 161, 15, 34, -40, -7, -102, 26, -4, -69, 60, -31, 3, 44, 21, 33, -24, 15, -31, 1, -27, 11, -41, 61, 45, 36, 43, 10, -12, -26, 13, 34, + 1, 23, -15, 5, 23, 16, 21, 2, 9, -2, -13, 14, -8, 7, 7, -14, 21, -26, 25, -12, 18, 26, -30, 3, 5, -13, -23, 17, -39, -31, 21, 8, 10, 7, 252, -210, 71, -53, 18, 65, 53, -36, 63, 36, 38, -27, 17, -14, 75, 21, 21, 29, 32, 20, 21, -63, 9, -113, -40, -11, -65, 16, 34, -25, -36, -41, -40, -21, 22, 18, -58, -67, -6, -34, 17, 15, 5, -5, 30, -17, 1, -4, -15, -43, 32, 56, -9, -7, 25, -40, 47, 12, -26, -1, -24, -10, + -7, -16, -6, -393, 37, -37, 12, 38, 27, 78, -35, -5, 4, 93, 31, -77, -51, 40, 54, -16, -23, -4, 24, 56, 57, -3, -108, -33, -13, -15, 59, -30, 34, 2, -9, -57, 2, 42, -73, -43, -19, -14, -36, -30, -68, -14, -47, -1, 7, 46, -35, -23, 2, -6, 5, -43, 14, 14, 3, 1, -33, -30, -18, -10, -5, -54, 9, 14, -228, 246, -33, 17, 60, 71, -50, 35, 15, 44, 31, 62, 36, -39, -65, 11, 74, 144, -32, -47, 40, 25, -25, -69, -12, -13, -61, 57, + 69, 2, 18, 0, 55, -40, -123, 54, -12, 43, 23, 3, -28, -48, 37, 41, 32, -5, 1, 44, 28, 14, -23, 37, 34, -5, -6, -21, 29, 1, -59, 51, 34, -12, 18, -8, 6, 44, 18, -7, -12, -1, 70, 4, -52, -108, 27, -5, -88, 31, -28, 5, -33, -26, 29, 68, 10, 91, 42, -45, -58, 99, -41, -3, 10, -92, 1, 49, -52, -14, 64, 4, 34, 1, 43, -7, -26, -4, 56, 73, -22, 15, 15, 48, -27, -6, 11, -13, 34, 14, 5, -17, 27, 27, 4, 0, + 23, 32, -37, -1, 13, 17, 516, -45, 13, 36, -42, -75, -42, -16, -86, -93, 11, -82, -34, -21, -17, 57, 65, 24, 133, 28, -60, 116, -7, 83, -21, -4, -69, 7, 69, 2, -28, -8, 10, -11, -10, 30, -54, 29, 13, -23, -51, -32, 46, 47, 54, -79, 51, 18, 2, 9, 12, 15, 15, -1, 9, 51, -8, 24, 25, -12, 41, 49, 12, 3, 44, -303, -507, 180, -15, 73, -91, 1, -105, -16, -150, 61, 66, -6, -14, -5, 12, -38, -128, 228, 14, -33, 78, 11, -44, 108, + 122, -57, 71, 11, -17, -120, -65, 87, -48, 9, -8, 58, -96, -110, 14, -3, -73, 39, 8, -49, 31, -54, -42, 15, 18, -2, -14, -28, 29, 45, 7, 10, -14, -19, 43, 0, 10, -50, -10, -35, -164, 486, -218, 35, 31, 121, -17, 77, -78, 3, -149, -30, 0, 58, 9, 60, -43, -92, 11, -137, -143, 2, -48, -4, 12, 19, -36, -26, -51, -79, 31, 35, -101, -48, -127, 0, -56, 43, 53, -106, 16, 84, 77, -42, 28, -32, -15, 22, -47, -12, 44, 32, 30, 34, 20, -13, + 30, 17, -21, -4, 60, -9, -26, -11, 25, -28, -59, -7, -20, 12, 13, -407, -129, 41, -68, 53, -31, -4, -123, -147, -24, -54, 55, 13, -22, -299, 143, 7, 124, 157, 106, -158, -42, -19, -43, 30, 32, -6, -61, 59, -109, -59, 87, 1, -45, 105, -3, 110, -45, -22, 8, 32, -87, -64, -20, 61, -29, 7, -32, 39, 48, 7, -3, -98, -16, 43, 45, -33, 51, 16, -23, 12, -66, -22, -47, 35, -2, -18, 6, -104, -8, 14, 263, 92, -150, -21, -61, 59, -88, 83, -12, 96, + 69, 115, -143, 184, -104, 109, -54, 68, 18, 58, -89, -213, 91, 157, -49, 67, -71, 23, -44, 164, 5, -11, 45, -73, -47, -41, 77, 5, -19, 5, -7, 114, 81, -36, 43, 46, -38, -22, -34, -79, -4, 6, -4, -26, -76, 1, 137, 74, -46, 76, 1, 3, 69, 36, -53, 27, 23, 67, 84, -55, 35, 543, -449, -78, 19, -12, -126, 38, 29, 171, -60, 31, 141, 0, 83, 279, -64, -23, -150, -142, 4, 43, -65, 22, 248, 140, 18, 5, 18, 134, -118, -56, -8, 66, -13, 12, + -60, 17, -106, -67, -80, -4, -72, 11, -127, 52, -252, -70, 33, 40, -11, -64, 18, 1, 29, -75, 29, -47, -47, -118, -84, -32, -15, -3, 18, 27, 5, 8, -67, -10, -81, -21, -352, -247, -24, -56, 175, -1, 27, -234, 5, 24, 7, 10, 131, -178, 30, -44, -123, -64, 103, -45, 83, -38, 45, 20, -24, -21, 52, -16, -6, -154, 67, 57, 57, 63, -136, -143, 74, 109, -146, 44, 16, 113, 66, 3, 78, -52, -89, -22, -168, -129, -17, -15, 23, -87, 24, -72, -213, -71, -59, -216, + -2, -43, -26, 14, 64, -70, 39, 17, -93, -67, -69, -22, -218, 326, -174, -76, -103, 23, 27, 46, -22, 141, 107, -106, -184, 65, -69, 165, 13, 69, 88, -67, -62, 220, -128, -35, -65, 4, -27, 26, -38, -19, -172, 148, -52, -18, 181, -128, -154, 9, -69, -107, 1, -58, 43, -230, -72, -61, -3, 73, 4, 10, 44, -45, 34, 46, 49, 43, -25, -54, -37, 50, -131, -37, -27, -42, 94, -69, -89, 87, 35, 48, 116, -47, -32, -458, 219, 236, 118, 106, -88, 108, -202, 0, -236, -37, + -107, 100, -117, -97, -32, -174, 42, -83, 66, -164, 255, -93, 116, -114, 3, -115, -43, 53, 160, 182, -103, -6, -64, -106, -85, -276, -15, 39, -263, 93, 41, 63, 112, 70, 31, -91, -38, -101, -58, 45, -213, 74, 29, 7, -107, -63, 41, 157, 57, 36, -76, 62, -2, -84, 9, -63, -101, -53, -34, -87, 72, 43, 370, -261, -111, -37, -5, 178, -38, 56, -108, 52, -68, -300, -206, -80, 103, -17, -166, -158, -325, -109, 39, 39, 12, -38, -21, -105, 24, 37, 53, 8, -17, -44, -155, -44, + -37, 72, -18, -128, -50, 30, -139, 18, -143, 74, 110, -111, -206, -45, -65, -100, 10, 13, 20, 45, 3, -86, 130, 195, -96, 78, 35, 90, -143, 50, 21, 47, -206, 160, 24, 15, -19, -116, 31, 609, -338, 33, -32, -70, -252, -11, -13, 209, 96, 419, -164, 19, 47, 103, -42, -16, 170, -103, 244, 151, -338, 326, 114, -113, -84, -123, -66, 27, 15, -87, 214, 32, -103, -86, 20, -108, -199, 7, 118, 52, 143, -62, 44, 160, 221, 58, -231, 81, -75, -121, 32, 104, 54, -22, -210, -176, + 256, -27, 197, 30, -80, 105, -174, -68, 82, -13, 170, -126, -266, -63, -10, -65, -695, -455, 153, -242, 64, -126, -425, -317, 544, -265, 240, 131, -155, 119, -92, 164, 183, -22, -65, 322, -118, -385, -4, -167, 28, 26, 214, 109, 36, 100, -111, -10, 235, 147, -55, 54, -228, -346, -258, -183, -59, -57, 52, -41, -104, 205, 46, -171, -161, -53, 53, -172, 55, 192, -14, 66, -147, 98, 69, 16, 70, -130, -196, -273, 125, 96, 1, 96, 12, -125, -32, 4, -206, -828, 270, -74, -63, 138, 27, 74, + 348, 205, 260, 128, 358, -72, -369, 45, -51, -161, -328, -146, 267, 56, -30, 51, -33, -3, 222, 23, 75, -42, 46, 227, -77, -163, 106, -284, -293, -186, -49, 2, 102, 268, -10, -99, -287, -451, -172, -70, -42, -8, 149, -209, 353, 188, -52, 102, -162, 23, -14, 167, 311, 219, -212, -84, 37, -34, -60, 15, -120, -318, -46, -61, -43, 45, 351, 355, 133, 244, 181, 372, -293, 386, -431, -61, 439, 594, 139, -19, 229, -159, -187, 434, 87, -47, 121, 353, -68, 223, -47, -67, -20, 168, -367, -30, + 209, -69, 41, -120, 101, 324, -262, 109, -63, 118, -127, 223, 39, 92, 106, -326, 190, -461, -75, 288, 52, -154, 323, -86, -157, 235, -66, -45, -10, 149, 5, 52, -236, 113, 50, 530, -357, -148, 73, -77, 143, 153, -138, 689, -422, 21, -63, -110, 20, -152, -60, -503, -417, -419, 148, -85, 147, -94, -299, 492, 349, -225, -183, -267, -48, 106, 170, 199, -5, 154, -35, -193, -227, 148, -98, 446, 290, 412, 68, 149, 417, 280, -78, 72, -7, 3, 55, -191, -124, 70, -224, -247, 249, 265, -281, -14, + 538, 360, -4, -178, -23, 103, 114, -76, -178, 228, 2, 52, 186, 207, -202, 89, -16, 82, -303, 53, 547, 207, -81, -24, 167, -214, -277, 225, -330, -424, 104, -230, -296, -156, 268, 671, 272, -374, 685, 75, -117, 119, -414, 98, 47, -296, 242, -84, 40, -214, 107, -196, 340, -421, -164, -149, 187, 223, 192, -227, 52, -237, -79, 117, 280, 129, -148, 279, 131, 224, 0, 262, -134, 142, -426, 452, -58, 56, -141, -247, -9, 144, 345, 98, -464, 176, -205, 346, 2, -152, 36, -127, 25, -1121, 63, 203, + 460, 160, -685, 944, 355, -413, 167, 939, 222, -211, -14, -547, 302, 40, -129, 95, 206, -350, 209, -442, 63, -401, -359, -144, 190, 282, -189, 249, -390, -43, 470, 58, -149, -37, 105, -89, -284, -319, -28, -137, 345, -443, 506, 173, 80, -145, -35, 245, -164, 325, 95, 297, -81, -138, -461, 188, -26, -473, 173, -8, 328, 516, -180, 140, 270, 285, 85, -108, 9, -515, 10, 118, 147, 34 }, + {-1, -2, -4, -2, -1, -4, -6, -1, -3, -3, 1, 2, 1, 1, -2, 6, -1, 3, -9, -10, 0, -17, -7, 7, 1, 2, 1, 12, 0, 5, 1, 8, 1, -6, -9, -10, -18, 1, -2, 1, -7, -1, 5, 6, -4, -5, -75, 7, -16, -1, -6, -11, 6, 26, 0, 13, -14, -4, 10, -9, 3, 18, -10, -3, -5, -1, 3, -4, 5, 4, -4, 7, -4, 0, -14, 0, -1, 4, 3, 7, -6, 12, -1, 10, -3, 0, 8, -2, 6, 3, 6, 1, 5, 32, -25, 16, + -19, 10, -9, -9, -5, -5, 6, 7, -24, -1, 4, -2, -4, -14, -5, 10, 16, 8, 25, 5, -4, 5, 5, -2, 8, 18, -6, 0, 8, 0, -1, -12, 0, 7, 5, 1, 1, -4, 5, 0, 1, 0, 116, -7, 11, -7, 8, -8, 3, -1, -1, 7, -5, -20, 7, 3, 7, 15, 8, 6, -1, -11, -4, 6, -1, -1, 12, -14, -4, 0, -2, -3, 6, 7, 8, 3, 3, -2, 11, 0, 9, 7, -1, 0, 4, 1, -2, 0, 85, -82, 12, -22, 11, -2, 8, -8, + 15, -7, 9, -20, 0, -12, 3, -2, -3, -5, -15, -2, 1, -7, 11, -5, -9, -11, 6, -7, 16, -2, 0, 5, 0, 0, -8, -6, -2, 2, -3, -7, 6, 4, 11, -3, 3, -2, -200, 23, -16, 0, -3, -18, 17, -5, 1, 7, 2, 20, -2, -9, 24, 9, 22, -1, -31, -19, -15, 12, -16, 0, -6, -6, 1, 4, -5, -10, -8, 5, 6, 12, -2, -3, -2, 7, -10, 1, 3, 5, -8, 7, -10, -3, -253, 90, -38, 41, -30, 18, -33, 17, -24, 8, 17, 0, + 6, 15, -11, 11, -14, -11, -30, 26, -18, 17, 1, -1, -29, -2, 5, -5, -2, -2, 11, -3, -9, 8, 2, -5, 0, -1, 0, 4, -8, 18, -2, -13, -2, -8, 13, 116, -24, 44, -19, 16, -15, 55, -9, 30, -2, -1, 8, 1, -36, 9, -2, -16, -3, 1, -46, -1, 5, 16, 1, -8, -1, 17, 4, -7, -14, 25, -14, 0, -21, -2, 1, 5, -4, 7, 11, -9, 9, 0, 8, 0, 13, -5, -2, 305, -86, 15, -13, 22, 2, 2, -39, 20, -16, 14, 7, 8, + 15, 22, 5, 9, -32, 15, 15, -20, -2, 25, 17, 17, 35, 20, 7, 11, -10, 12, -1, 21, 27, -2, 11, 17, -4, 7, -19, -4, 24, 2, -13, -3, 9, 18, 1, 11, 20, -163, 67, -48, 30, -29, 35, -25, 0, -21, -26, -36, 1, -22, 9, 11, 25, -44, 25, -11, 35, 7, -4, 2, 1, -9, -9, 5, -19, 11, 19, -29, -8, -2, 9, -11, 28, -31, 4, 0, 0, -14, 0, -9, 6, 1, -1, -10, -4, -20, -9, -1, 2, -262, 82, -54, -5, -12, 15, -46, + 2, 13, 11, -17, 8, -21, -34, -14, 3, -21, 68, 1, -20, -7, -24, -12, 20, 12, 26, -3, 11, -16, 5, -15, -6, -9, 3, 8, -6, -14, 2, 5, 18, -4, -8, -25, -22, -10, -5, 4, 2, -10, -6, 2, 8, 5, -252, 116, -57, 51, -29, 30, 14, 8, -30, 2, -16, 3, -39, 13, 22, 6, -41, -21, -21, -22, -15, 27, 6, 18, 15, -9, -3, -32, 38, -13, -5, 1, -9, -14, -15, -5, -33, 8, -18, 11, 10, 16, -6, 0, -22, 6, 14, 2, -4, 1, + 11, 16, 7, 82, 102, -45, 28, -13, 11, -10, 7, 10, 50, -17, 21, 47, -12, -1, -7, 12, 25, 26, 33, 10, 28, -6, -16, -53, 12, -7, -27, -18, 0, -4, 18, -1, -31, -31, 9, -27, 4, 19, -25, -16, -10, 14, 12, 1, -3, 20, 4, -6, 8, -15, 2, -7, -12, 290, -101, 55, -38, 55, -38, 33, -12, 34, 8, 24, -28, 29, -10, -24, -2, -25, -40, -21, -4, 21, -28, -37, -45, -8, -4, 36, 20, 23, -16, 19, -14, -14, -8, 24, 21, 6, 0, -1, + 1, -7, -4, 16, 3, 41, -16, -5, -34, 22, -9, -6, -8, -2, 2, 82, -124, 74, -46, 58, 0, 36, 11, -54, -25, -18, 8, 15, 9, 62, -34, 50, 9, 7, -33, -7, 44, -2, -35, 42, 32, 8, -16, -13, -3, -2, 20, -9, 9, -22, -4, 14, -32, 14, -12, 13, -9, -2, 40, 18, 23, -1, 10, 15, -2, -10, -16, 7, 9, 15, 18, 5, -3, -16, -313, -66, -12, -55, -25, 42, 16, -17, -16, -41, -29, -34, -38, -32, -22, -29, -47, -41, 10, -41, 8, -54, + -2, -25, -21, 40, -9, -25, 24, -35, 26, 5, 28, 18, -5, -19, 29, -4, -9, 27, -17, -45, -51, -15, 11, 7, -18, -5, -17, 0, -4, -1, 25, 8, -25, -11, 0, 15, 0, -364, 316, -129, 87, -83, 20, -41, 53, 10, 6, -26, 36, 8, -66, 7, 9, -32, -51, 50, 61, -19, -17, 11, 27, -16, 55, -1, 13, -40, -16, -23, 35, -7, 6, 9, -23, 37, 32, 11, 10, 43, -27, -5, -7, -29, 4, -18, 5, 1, 0, 36, -4, -6, 5, 4, 20, -19, 5, 1, + 246, -26, -48, -9, 36, 20, 18, 1, -31, 11, 24, 26, -12, -12, 52, 20, -35, 11, 67, -76, 56, 9, 71, -2, 7, 16, 17, 38, -23, -7, 17, 28, -7, 2, 7, 9, 19, -30, 3, 22, 9, -15, -2, 45, 34, 17, -13, -9, 16, -3, -7, 10, -9, -17, 47, 20, 31, 7, 24, 20, 22, 5, 26, 14, 20, 116, 34, 28, -16, -11, -31, -22, 6, -12, -15, -45, 39, 27, -27, 48, -44, -14, 21, -34, 20, 31, 49, 42, 41, 20, -83, 0, -16, 16, -7, 32, + 24, -12, -19, 21, -13, 55, 2, 17, 58, 53, -39, 2, -25, -50, -3, 8, -4, -11, -3, 3, -21, 1, -24, -9, -1, 5, 3, -18, -14, 32, -9, 3, 18, 16, 273, -191, 70, -72, -5, -50, 47, 46, 15, 10, 44, 119, -104, -14, -27, -42, 93, 70, -14, -63, 26, -51, -41, -72, 10, -73, -24, 44, 7, -22, -61, 1, -14, 38, 34, 17, -28, 5, -2, 16, 30, -18, -9, -32, 50, -5, 8, 46, -9, -3, 18, -22, -2, 20, -33, 9, -6, -2, -35, 18, -7, 4, + 9, -12, 23, -426, 57, 4, 28, -35, -55, -2, 33, 54, -6, 84, 46, -60, -54, 38, 5, -43, -79, -90, -58, -67, -75, 11, 21, 17, -56, -54, 6, -16, -11, -9, -45, 34, -76, -30, -13, -5, 22, 7, -7, 32, -12, 32, 18, -28, 2, 54, -24, -24, 0, 31, 7, -25, -31, 26, 0, -40, 52, 59, 6, -19, 5, -3, 11, 25, -259, 222, -74, 48, -1, 37, -90, 35, -61, 0, -41, 83, 71, 27, 6, -69, -45, -7, -27, 79, -64, -3, -31, 116, -36, 10, -3, 20, + 10, 19, 15, -20, 11, -5, 41, 6, 78, 39, -24, -6, -9, 1, -28, -22, -6, 13, 95, 7, 7, -27, 39, -15, -19, 11, -18, 10, -23, -54, 27, 22, -6, 53, 13, 11, 21, -14, 53, 35, -3, -17, -13, -6, 168, -6, 36, -117, -21, 13, -95, 5, 127, -24, 7, -60, -82, 18, -75, 112, -81, 25, 25, 59, 45, -14, -72, -10, -9, 34, -51, -12, -17, -26, -19, 32, 19, 90, 29, -37, 36, -27, -29, 26, 76, -14, -43, -40, 40, -3, -60, -55, 24, 23, -26, -46, + -75, 17, 24, 15, -43, 28, 580, -34, 26, 56, -47, -19, -14, -133, 94, -12, -81, 21, -40, 53, 42, 66, -19, 88, 76, 50, -72, 61, -100, -58, -67, 31, -51, -7, -15, -66, -34, 61, -40, -30, -63, 24, 24, 52, -25, 88, 24, 99, -8, 20, 23, -51, 41, 102, -31, 0, 30, -26, -37, 26, -37, -19, -49, -32, 41, 37, 26, 39, 49, 46, 69, -261, -506, 180, -4, 4, -56, -60, -18, 11, -38, 125, -66, -120, 1, 1, -20, -47, 84, 10, -45, 35, -85, 94, -61, -36, + -74, 105, -54, -23, -73, -38, 56, -35, 61, -92, -105, 1, 12, 10, -8, -59, 4, 19, 8, 44, -5, 74, 6, 68, 95, 13, -12, 11, -61, -23, -98, -92, 20, 16, 12, -15, -31, -23, -27, -22, -171, 486, -226, 99, -50, 152, -27, -72, -74, 37, -24, -13, 1, 27, -167, -84, -45, 61, 53, 92, 15, -19, -17, 111, -152, 82, -74, -20, -78, 114, 46, -82, 9, -39, 11, 45, -216, -95, 16, 70, -46, 10, 54, -28, -25, -14, 82, 27, 13, 3, 31, 91, -60, 38, -138, -31, + 30, 59, 11, 2, 2, 28, -28, -4, -11, -41, -30, 42, 47, -28, -27, -441, -97, 41, -106, 24, 17, 62, -3, 121, 78, 42, -36, -62, -6, 128, -113, -44, -88, -4, -238, -187, 9, 113, 156, 35, -60, 52, -54, -36, -38, 14, 39, 9, 59, -48, -87, 68, 42, 144, -21, 22, -24, 116, -125, -62, -32, -94, 55, -39, 46, -100, 95, 95, 85, -37, 74, 3, 23, 45, 28, -42, 3, -14, -7, 90, 29, -40, 68, -13, -67, -22, 322, 211, -61, 98, -208, 152, 58, 116, -34, -25, + -112, -56, -194, -31, -154, -44, -93, -96, -130, 57, -179, 28, 83, -32, 29, -75, 3, -21, -22, -104, -10, 16, -3, -13, -52, -46, 37, 39, 51, 236, -89, -2, 99, -19, -34, -86, 32, 82, 135, 47, 114, -103, -155, 19, 110, 62, -81, 104, -71, 52, 25, 95, 56, 37, 67, -58, 44, 36, 23, 91, 25, 642, -416, -23, 48, 12, 50, 87, -18, -15, 49, -75, -71, -13, 56, 230, 9, 79, -75, 4, -229, 140, -139, -198, 46, 54, -73, 64, 27, 151, 169, -30, -64, -50, -253, -139, + 198, 64, 73, -116, -117, 33, -23, -103, 88, -21, -63, -75, 50, -68, -35, 230, -142, 40, -51, 51, -64, -29, -173, 26, -64, -47, 138, 29, 38, 79, 100, 25, 68, -36, -10, -116, -414, -211, 60, -39, 131, -35, -53, -130, -144, 54, -150, -61, -91, -29, -96, -70, -80, -48, -95, -167, 73, -318, -18, 258, 51, -16, -89, 5, -290, 99, 54, 5, 84, 133, -132, -76, -137, 3, -11, -86, -98, -106, -70, -19, 44, -10, 33, 13, -10, 174, 29, -45, 133, -88, -187, -67, -37, -40, -28, -74, + -31, -89, -35, -90, -11, 24, -100, -40, -64, -15, -99, -117, -251, 326, -168, -87, -276, 206, -79, 119, 4, 1, -86, 159, -45, 47, 38, -83, -29, -32, -146, 21, 24, -119, -189, -124, -174, -50, 91, 40, -102, -109, 149, 94, -130, 110, -65, 96, -165, -140, -125, 34, -111, 60, -49, 19, -29, -27, 27, 109, -260, -45, 54, -36, -77, -201, -14, 161, 3, 138, 115, 19, -17, 101, -109, -107, 79, -41, -64, 35, 21, -67, -71, 117, -112, -575, 203, 82, -151, 63, -170, 138, 117, 99, -299, 169, + 300, -50, 96, -2, -104, -133, 330, -12, -39, -194, -378, -207, 10, -170, 127, -249, -90, -150, 30, -63, -190, 23, -51, 112, -50, -149, -64, -441, 68, -20, 190, -130, -147, 180, 29, 24, -86, -123, 30, 78, 51, -37, 54, 29, -4, -45, -53, -150, -1, -64, -96, 68, 30, 204, 31, -150, -156, 23, -106, -75, 5, -78, 496, -164, 26, 49, 221, -3, -15, 158, 257, -135, -158, 164, -3, 145, 203, 171, 153, 125, 146, 481, -14, 56, 115, 275, -27, -71, 123, 15, -57, -81, -63, 24, -90, 196, + 291, 7, -39, 132, -37, 179, 141, 25, -108, 125, 18, -23, 50, 2, 336, -5, 163, -46, 304, -4, 55, -74, -135, 161, -51, 298, 93, 153, 35, 24, 115, 44, 233, 134, 73, 123, -71, 67, 130, 607, -182, 51, -64, 21, 75, 199, -164, 79, -7, 3, 109, -100, 117, -332, -149, 45, 118, 75, 255, -266, 39, -49, -351, 138, -136, -101, -51, -300, 94, 88, 46, -164, -250, 84, -154, 121, -238, -12, -285, -87, -189, -184, 174, 247, 41, 79, -118, 30, -200, 67, -129, 16, 203, 78, -63, 96, + 27, 79, -81, 147, 304, -11, -170, -152, -71, -63, 28, 100, 33, 176, 9, 38, -631, -531, 214, -73, 251, -27, 77, -320, -301, -186, 91, -250, -174, -79, 42, 170, 57, -363, 89, 191, -511, -68, 18, -543, -190, 231, -502, 235, 250, -4, -77, -28, -125, -139, 83, 102, 367, -228, -121, -100, -178, 2, -300, -81, 17, -16, -101, -23, -167, -41, 86, -49, -111, 115, -62, -129, -177, 358, -20, 214, 25, 75, 236, 26, 159, -119, 177, 123, 33, 36, 35, 144, 56, -1019, 376, -118, -461, -117, 5, -123, + 169, -399, 183, -37, -460, -317, 55, 175, 162, 120, 259, 72, 430, 236, 506, 63, 409, -326, -262, 83, 27, -259, 62, 50, -45, -101, 238, 44, -556, -247, 173, 60, -126, 153, 149, 245, 43, 71, 36, 70, 79, -192, 18, 33, -416, 188, 128, 170, -289, -162, 189, -2, -66, -43, -131, -106, -12, -141, -324, 105, 316, -232, 17, -126, -62, -87, 411, 274, 185, 94, 0, -113, -165, 119, -438, 434, -291, 57, -474, -32, 420, 155, -167, 260, -451, 160, 68, 15, -553, -178, 20, 71, 333, -547, -85, -193, + -512, -126, 106, 232, 361, 273, 276, -43, -200, 173, 44, -133, 55, -263, 374, 162, 117, -222, -457, -139, -4, -559, -450, -136, -405, 228, 82, 55, -195, -217, 59, 29, 16, 94, -93, 63, 238, 86, 23, 3, -186, -170, -135, 480, -391, 94, -64, -58, -1, 127, -248, 310, -102, 210, -32, -185, 328, 326, 228, -119, 502, 183, -585, 585, 43, -9, 416, 12, -198, -255, 410, -271, -365, 335, 285, -200, -482, 178, -174, 60, -344, -276, -126, 315, 273, 33, 249, -387, 108, -105, -158, 179, 10, 53, -553, -150, + 282, -387, -117, -484, -107, -182, 63, -118, 36, 48, -35, 47, -148, -428, -100, 213, -48, 144, -172, -339, 442, 33, -130, -320, -12, -154, 118, -265, 167, 104, -230, -238, 355, -422, -16, 267, -302, 94, 348, -280, 239, 171, 256, -424, 364, -425, 129, -325, 42, -169, 288, 4, 178, 85, -295, -188, -410, 236, -276, 237, -332, -390, -637, 56, 343, -58, -3, 100, 298, -106, 86, -362, 99, 465, -38, 420, 569, -11, 105, 107, -226, 116, -275, -22, -281, -296, 35, -115, -463, 320, 31, 234, -244, -1008, 251, 373, + 101, -439, -67, 706, -819, -24, -141, -536, -138, -364, 128, 129, 307, 123, -430, -154, 303, -489, -143, -522, 439, 131, 342, 589, -213, -127, -103, -299, 278, -142, -359, -398, -76, 149, -18, 78, 90, 227, -108, -14, 163, -168, 327, 377, 351, -295, 30, -95, 162, 715, 529, 1025, 70, 402, 317, -161, -48, -59, -110, 123, 15, 363, 262, -136, -57, -230, -444, 151, -37, 116, -55, -279, -73, 5 } }; -const Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS][2522] ={ -{ - -8937827, - 962073, -1997160, 1969243, -977105, 848256, -12885, 942745, -57982, 1020055, -1251983, - -590558, 594853, -846109, -141734, -1324997, -92342, -489626, 2634963, 1251983, -1604170, - 62277, 657130, -60130, -371515, 682900, 73014, 448824, 635655, 562641, -816044, - -219043, 77309, 113817, 156766, -57982, 38655, -62277, 137439, 12885, -6442, - -81604, -15032, 66572, -21475, 47245, 6728067, 3895535, 2087354, 1043677, 1129576, - 382252, 801011, -148176, -150324, 1932735, 1095217, 897648, 1853278, 1550483, 2115272, - -2948495, 2561948, 708670, 169651, 513249, -178241, -1320703, -940598, 1509681, 682900, - 1234803, 55835, -423054, 901943, -105227, -438087, 912681, 476741, 1340030, 382252, - 891206, -1331440, -803159, 715112, 130997, 768799, 319975, -165356, -354335, -1080184, - 223338, 3599183, -3721589, -766652, -725850, -947040, -199716, -124554, -648540, -586263, - 81604, 94489, -453119, 244813, -1099512, -408022, -113817, 654983, -3953518, -438087, - 912681, -442382, -408022, 296353, 158914, 229781, 1941325, -951335, -511101, -1045825, - -98784, 496069, 921271, -901943, -551903, 942745, -820339, -1398012, -57982, -412317, - 562641, -446677, -292058, 180389, 511101, -874026, 369367, -12895639, -8843338, -3519726, - -4127464, -2224793, -2177549, -1967095, -957778, -2381559, -1962800, -777389, -1535451, -133144, - -575526, -1241246, -1801739, -1913408, -809601, -1080184, -2025077, -188979, -2523293, 81604, - -212601, -270583, -1533303, -182536, -1163936, 88047, -1492501, -861141, 493921, -1002875, - 178241, -2435247, -474594, 1316408, 747324, 42950, -371515, -633508, 204011, 322123, - 1170379, -605590, -111669, -16935056, -1015760, 2276333, -124554, 738734, -208306, 100932, - -1455994, 1535451, 481036, 1829656, 1153199, 3665755, 2540473, 283468, -1511829, -736587, - -429497, 747324, -577673, -3088082, -2942053, -1398012, -536871, 212601, 302795, 659278, - -214748, 169651, 246961, -594853, -191126, -21475, -2052994, 1213328, 369367, -150324, - -124554, -682900, -1187559, 736587, 152471, -646393, 569083, 633508, 717260, 19020262, - 13462575, 2568391, 5246303, 1007170, 1769527, 4161823, 2229088, 599148, 2594160, 959925, - -1073742, -631360, 925565, 1393717, -2546916, -429497, -1516124, 3358665, 1748052, 794569, - 1745904, 783832, 914828, -49392, -141734, -942745, 1370095, 1533303, 1410897, 1636383, - 2119566, 1151051, 3083787, 586263, -161061, 981400, 212601, -648540, -236223, -594853, - -603443, -105227, 1425929, 219043, 231928, 28357522, 12217034, 3543348, 3440269, 2211908, - 1546188, 339302, 214748, 2997887, 732292, 1604170, 2452426, 1116692, -68719, -998580, - 5068062, -584116, -2630668, -1694365, 1324997, -70867, 2746632, 732292, 412317, -633508, - -1157494, -498216, -489626, 1017907, -124554, 332860, 191126, 27917, -566936, 790274, - 3524021, 2025077, 2360085, 1906966, 1769527, 770947, 725850, 227633, 1187559, -1125281, - 743029, 9251360, -9751723, -3111704, -4133906, -3811784, -1876901, -710817, 1511829, -1490354, - 285615, -3768834, 1391569, -1440962, -3171833, 773094, -2224793, -3264175, -2115272, 2929168, - 2428804, -1159641, 1309965, -2186138, 966368, -3901978, 354335, 545461, -491774, -972810, - 955630, -3094524, -1211181, 317828, -893353, -959925, -523986, 182536, 485331, 1462436, - 257698, 2570538, -846109, -773094, -654983, -1346472, -229781, -693637, 543313, -1157494, - -33648920, -17313014, -5978595, -4984310, -5076652, -3453154, -4363687, -3113851, -4765266, -1054415, - -2057289, -727997, 401579, -2203318, -384400, 173946, 206158, -3264175, -1887638, -1554778, - 478889, -4346507, 605590, -2046552, -3549791, 188979, 141734, 126702, 100932, -1449552, - -813896, -81604, -83752, -169651, -1194001, -73014, 584116, 1013612, 637803, -1565516, - 1043677, -1563368, 1200443, -2604898, -1483911, 274878, -1159641, -30065, -296353, -19870666, - 10361609, 4526896, 1501091, 2826089, 367220, 843961, 2241973, 2774549, 1299228, 1881196, - -1492501, -463856, -2248416, 2658585, 384400, 562641, 3335042, 208306, -2493229, 4236985, - -2905546, 425202, 3264175, -949188, 736587, 526134, -244813, -1640678, -577673, 1024350, - 818191, 238371, -783832, 135291, -1387274, 3974992, 156766, -2147, -1720134, -719407, - -1178969, -880468, 1928440, 2074469, -715112, 242666, -326418, 646393, -47245, -103079, - -616328, 506806, 29970282, 12906377, 3287798, 7020124, 3874061, 1831804, 2866891, 2697240, - -139586, 1995012, 2836826, 792421, -146029, 1625645, 4050154, -1329292, -934155, -3236258, - 680752, 3921305, 1449552, 259846, -2340757, -1086627, -1110249, 4112431, 1069447, 2181844, - 994285, -1853278, -3281355, 3562675, 1724429, -2095944, -1230508, 3453154, 2658585, -100932, - 500364, -315680, 1277753, 989990, -556198, 723702, -1428077, -539018, 1602023, -949188, - -985695, 1971390, 1432372, 936303, 88047, 35416300, 7917772, 5744519, 2808909, 2529736, - 1342177, 2607045, 3500398, 5076652, 3427384, -1198296, 4342212, -1005022, 1301375, 719407, - 3697967, 4982162, 3521873, -1110249, 5978595, -1316408, -423054, -3270618, 998580, -1127429, - 1123134, 1342177, -1584843, -2660732, -843961, 249108, -1788854, -871878, 1056562, 1058710, - -2134599, -2192581, -657130, 515396, 139586, 365072, -680752, -259846, -412317, -1020055, - 1080184, -1569811, 1406602, -1668595, -352187, -1333587, 371515, -646393, 3966402, -15631533, - -5216238, -5478231, -3781719, 1144609, -1041530, -3212636, 1799591, 322123, 2248416, -81604, - 122407, -3502546, -2727304, -1522566, -2800319, 429497, -2967823, -5302137, 981400, 854699, - -2660732, -343597, -2420214, 708670, 685047, -225486, -5772436, -1380832, 272730, -397284, - 403727, 1767379, -4123169, -968515, -2602750, 1561221, -384400, 38655, 2579128, -2422362, - -242666, 1093069, -399432, -614180, 1226213, 953483, -1655710, -1687922, -3182571, -191126, - -2439542, -1649268, -1063004, -36771364, -12796855, -7329362, -2153926, -3674345, -373662, -1868311, - -2972117, -3137474, 3992172, 356482, -1825361, -135291, -6356552, -3231963, -3201898, 5291400, - -4423817, -8654359, 549756, 1374390, 515396, -3002182, -1052267, 2168959, -4284230, -133144, - -4361540, -955630, 2173254, -1715839, 410169, 4864051, 339302, -637803, -1258425, 1548336, - 1267015, 1458141, -1503239, 64425, 1333587, 2332167, 1078037, 1005022, -3974992, 1058710, - -309238, -1614908, -846109, 715112, -633508, -1629940, -1413044, -1700807, -24371792, 5499706, - 558346, -3189013, 4595615, -2976412, -1960653, 914828, -3959960, -2675765, -693637, 1524713, - -3088082, 4273493, 281320, -322123, 2274185, 1881196, 3459596, -556198, 4696547, 6281390, - 4866198, 1273458, 4187593, -1511829, 2723009, -3171833, -2843268, -1477469, 547608, 1748052, - -1413044, -3060164, -1361505, -289910, 1926293, -2969970, 2151779, 453119, 1696512, -929860, - -2338610, -3609920, -3848291, 813896, -1889786, 854699, -4095251, -1477469, 2076617, -2933463, - 603443, -2138894, 1447404, -861141, 1408749, 36507, -601295, -328565, -1556926, 16348793, - 27200028, 7788923, 7127498, 9706626, 8010114, 1479616, 6367289, 5514738, 3124589, 11778948, - 2899103, 1926293, 5205501, 4666482, 2570538, 2018635, 1314260, 1885491, -1466731, 5899138, - -1544041, 487479, -1823214, 3700114, 246961, -1075889, 3191161, 3639985, 1370095, 4859756, - -3466039, -5916318, -1267015, -444529, 1303523, -511101, 2544768, -2437394, 2314987, 4883378, - 2183991, -4567698, -893353, 2149631, 912681, -2302103, 3167539, 1110249, 1881196, 1939178, - 2823941, 792421, -775242, 554051, -2536178, -805306, 2370822, 2031520, -1232656, -173946, - 62150324, 6577743, -760209, 4024384, -251256, 5493263, -73014, 1602023, 539018, 5778879, - 2484639, -2141041, 1745904, 2856153, 1305670, -3223373, -7183333, -3064459, -3098819, 1413044, - -4464619, -594853, -416612, 1324997, 7606387, 4466766, 1318555, 3268470, -4964982, -135291, - -2669322, -809601, -2134599, 3066607, -1254131, 5025112, -2381559, -723702, -2641405, -962073, - -3751654, -1529008, 687195, 936303, -332860, 188979, -2123861, 1269163, 3212636, 414464, - -1949915, 2244121, -3111704, 1432372, 1159641, -163209, -1067299, -504659, -277025, -438087, - 2147, -18176302, -21524228, -4054449, -1151051, -923418, -3373697, -1455994, 6603512, 3839701, - 1440962, 1754494, -2791729, -601295, 4982162, -1836099, 8070244, -6234145, -1623498, 6500433, - -1181116, -747324, -3710852, 4453881, 5025112, 79457, 4958540, -1782411, 2250563, -109522, - -2630668, -433792, -2057289, -904091, -1297080, 2690797, -1876901, -470299, -2939905, 2068027, - -1471026, 4509716, -6994354, 2995740, 2598455, -4286378, 214748, -2828236, 893353, -3219078, - 1157494, 1359357, -3968550, -605590, -1355062, -6094559, -3395172, -1681480, -2892661, -648540, - -365072, 343597, -2334315, 358630, -4649302, 1348620, -15807627, -9262097, -12232067, -6468221, - -8123931, -1052267, 8106751, -8441758, 6545530, 3974992, -4398047, 8974334, -1292785, 1660005, - -5785321, -743029, -2488934, -481036, 191126, 2141041, 1249836, 4645007, 9249212, -2553358, - 1413044, -4436701, -4380867, -4121021, 1084479, 3697967, -1163936, -1400159, -1037235, -2886218, - 3326452, -1063004, -34360, -2819646, -1986422, -1896228, -2656437, -300648, 57982, -2456721, - 1758789, -3725884, 1544041, -2181844, -191126, 1286343, -2521146, 3311420, -5634997, -1848983, - 747324, -1758789, -2911988, 1501091, -657130, -3519726, 5950677, 3236258, 1002875, 1090922, - 1367947, 1410897, -2688650, -44233868, -5214091, 3730179, -3388729, 7507603, 3262028, -8841190, - 1075889, 1651415, -3036542, -7385197, -2929168, -1696512, 2005750, 674310, -7103876, -2495376, - -3856881, -6569153, -5789616, -13003013, -6981470, -7546258, -9455371, 7511898, -5098126, 2821794, - 5390184, -3895535, -6463926, -2321430, -1513976, 1619203, 4005057, 2521146, -5385889, -6393059, - 4956393, 3296388, 3886946, 5787469, 661425, 57982, 2074469, -193274, -2686502, 1513976, - -1529008, -803159, 3176128, 8585640, -3002182, -4221953, 1812476, -2684355, -435939, 4417374, - -8617852, -109522, -2965675, -470299, -367220, 21475, -1196148, 1632088, -2705830, 2976412, - 35465692, 31089120, 8304320, 18932216, 5115306, 10930692, -1868311, -1653562, 5164698, 7198365, - 3670050, -12253542, -4204773, 7726646, 8540542, -3150359, -4312147, 1449552, 3470334, 4136054, - 463856, -6373732, -13911399, -5145371, 7352984, -646393, 7552700, -1812476, -2626373, 1571958, - -6575595, -3702262, -3904125, 7071664, -9004399, -6083821, 1385127, 1466731, -2476049, -294205, - -2740189, 2626373, 3382287, 3070902, 6753836, 4037269, -115964, -5746666, 5134634, -545461, - 2729452, -2834679, 1821066, 4211216, -916976, -1185411, -2937758, -3204046, 1651415, 384400, - 2443837, -2778844, 1982127, 5478231, -1471026, -3068754, 3532611, 42874512, 8293582, -8686571, - 7264937, 4294968, -7902740, -2089502, 4443144, -8590, 1614908, -923418, -1425929, -9281424, - -8536248, 3665755, 8632884, 8358007, -8199093, -17467632, 2712272, -519691, -6599218, -9051644, - -1245541, 4153234, -2725157, 6287832, 10806138, -4170413, -3105261, -1644973, -1226213, -2272038, - -15708843, 8158291, 7973607, -511101, 5265630, -5072357, -1200443, -4625680, 6818261, 6721624, - 1125281, -1913408, -2162516, 3678640, 1290638, -2422362, -3697967, -146029, 3792456, -5347235, - -2851858, -2965675, 1260573, 1537598, -6163278, 3225521, 7614977, -5995775, 313533, -1503239, - -624918, -111669, 1112397, 360777, -2175401, -4823249, -3189013, -1346472, 3453154, -1782411, - -11559904, -8029442, 1378685, 10460393, -10496900, 7415261, 3764539, 1434519, 2450279, 1610613, - 7249905, 11074573, 579821, 3176128, 1526861, -9949292, -8553427, 8400956, 1451699, -10264972, - 6212670, -8791798, 1702955, 10333691, -380105, -3085934, 12337294, 1675037, 1123134, 790274, - 663572, 893353, -4986457, 2987150, 5166846, 7761006, -5989332, -3302830, 1556926, 934155, - -2566243, -5862631, 3972845, -2237678, 2888366, 1200443, -1638530, -1986422, 1163936, 3478924, - -2385854, -1335735, -251256, 1958505, -5403069, -2800319, 3055869, 478889, -1567663, -1088774, - 2811056, -46250356, -42674796, -9397388, -19821274, -17190606, -9902047, -2843268, -7447474, -8727374, - 5952825, 1758789, -2128156, 10271414, 3655017, 12317966, 9363029, 2877628, 3728032, 4610648, - -18663780, 8967892, -1464584, -3753802, -3506841, -10825465, -3418794, -3620658, 10591389, -3328600, - -6313602, -2931315, 1707250, -1155346, -2080912, 2570538, -2757369, -1574106, 6530498, -6101001, - -491774, -1795296, 11729556, 4894115, 4748087, -8688719, 790274, 8263517, -4080219, 2199023, - 167504, 2241973, 193274, 981400, -455267, 5405217, -489626, -1329292, 3895535, -2293513, - 2289218, 4778151, -1840394, -2729452, 1627793, 2050847, -3049427, -1002875, -28578712, 60851096, - 38912404, 11899207, 4176856, 3749507, 4752382, 6408091, 6440304, 12496207, 26328150, 987843, - 3335042, 5149666, 5688684, 6167573, -4475356, 24665998, 18303004, -17242146, 12702366, 1748052, - -2345052, 5499706, 15554224, -14836965, -3732327, 586263, -11523397, -8669391, -8147553, 16698833, - -444529, -3697967, 2617783, 319975, -4857608, -14549202, 9942849, 7198365, -2055142, 3605625, - 10179072, -7279970, 5675800, -169651, -2282775, 7050189, 6944962, 779537, 1183264, -4295, - 5641440, 6745246, 341450, -2229088, 201863, -3294240, 5589900, 180389, -1876901, -3629247, - -1657857, 3008625, 2153926, 8080981, -2473901, 2108829, -1726577, 66080220, -23081154, -23330262, - 10735271, 2216203, -8385924, -8012262, -11860552, -12416750, -8516920, -7834021, 11297911, 2199023, - 1623498, -6607807, -5158256, -19816980, 261993, -8065949, -13086765, 10750303, 7677254, 1904818, - 7146826, 1537598, -2087354, -4707284, -113817, -4045859, 5875516, 9131100, -9895605, -4146791, - 375810, 4788889, 13449690, 3551938, 17955110, -9532680, 5804649, 14353781, 8914205, -7810398, - -2005750, 1286343, -3571265, 5948530, -822486, -83752, 9607842, 4737349, 1664300, 457414, - -92342, -4402342, 19327, 700080, -4123169, -2843268, 4297115, -2083059, -7947837, -1625645, - 324270, -1855426, -8308614, 1715839, 1778117, 1625645, 2379412, -2229088, -3455301, 21154862, - 40677636, 15741055, 11012296, 12513387, -3541201, 3897683, -11413876, 19950124, 8074539, 19146964, - 5918465, 7166153, -17534204, 21839908, 32800666, 3932043, 21296596, -4479651, -17102560, -17261474, - 15631533, -5248450, 12487617, 2048699, 5037997, -9790378, 9659381, -3607773, -3393024, 15592879, - 11057393, -8600672, 14845554, 1382980, 2712272, -3279208, -11196980, 2813204, 809601, -6532646, - -7084549, 6242735, 9163313, 2699387, -3315715, 4015795, 270583, 9463960, -6017249, -1217623, - -9871982, 773094, 9408126, 6043019, -4587025, -425202, 3176128, -9068823, -852551, -6335077, - -3519726, 1372242, 2035815, 5375152, -7116761, 2499671, -8175470, 208306, 9416716, 2931315, - 1554778, -785979, -46746424, -3139621, -10103911, 12884902, -9637907, 10511932, 938450, 8327942, - -616328, 7118909, -23021024, 6438156, -2138894, -9034464, 4806069, -10885595, 7033009, -10975789, - -4866198, -23654532, 13868449, 27288074, -10200547, -4153234, -2465311, -5010080, 4949950, 5053029, - 8783208, -21051782, 6904160, -13277891, -2914135, -1157494, 11345156, 3579855, -4520453, 1788854, - 3058017, 7118909, 8536248, -13286481, -3395172, 1428077, -8514773, -8783208, -708670, -6390912, - 3440269, 6775311, 1883343, 833224, -753767, 6296422, 19071802, 9807558, -10123238, 1836099, - 5132486, -5920613, 7438884, 1243393, -6027987, -1103807, 9285719, 423054, 8982924, -10982231, - -1215476, 5774584, 1602023, -86215024, -33268816, 18285824, 5682242, -10524817, 11656541, 10801843, - 15597174, -3324305, -7825431, 14841259, -94489, -9000104, 18657338, -21124796, -28995324, -12773233, - -15906411, 10471130, 13503377, 227633, 2922725, 23025320, 9133248, -22243636, -11072426, -13488345, - 3401614, -20639466, -19260780, -618475, 2033667, -7599945, -9691594, -12412455, -7554848, -11327976, - -12438225, -3882651, 96637, -3766686, -1599875, -7524783, -2168959, -5675800, -14409615, 29450590, - 1363652, 7264937, -12869870, 8070244, -1812476, 4294968, -10602127, -45097, -2669322, -7591355, - -6120329, -3309272, 8227010, 7159711, 6120329, 4833986, 4406637, -1136019, -1297080, -6682969, - -2707977, -206158, -2068027, 9008694, 809601, 5291400, -1559073, 45941116, 16316581, 37072012, - 5342940, 2836826, -15141907, 5995775, 21489868, 8602819, 1108102, 15077483, -13709536, -5587753, - 11474005, -8843338, 3637837, 21388938, 6227703, 3148211, 6148246, -3592740, 8579197, -6738804, - -382252, 3805341, 586263, -5181878, -6472516, 2471754, 21041044, -6861211, 4666482, -19879256, - -11452530, 9302899, 22127672, -17480516, -654983, 11134703, 1954210, 4282083, -15412490, -5025112, - -13469017, -21966610, -6734509, -12217034, -13883482, 10441065, 3180423, 3586298, -8596377, -4675072, - -2587718, -21210696, -3115999, 11763915, -9567040, 9399536, 18285824, 2836826, 11622182, 8377334, - -657130, -4071629, 9749576, -14368813, -2250563, -1037235, 7211250, 4148939, 6320045, 54580444, - -11403138, -17766132, 3451006, 11944304, 11070278, 9798968, -2379412, 10619307, 4279935, -14403173, - -26499948, 17366700, 5555540, 12320114, 8516920, -8096014, 3839701, -11280732, -17154100, 17579302, - -10945724, -23014582, 2950643, -4537633, 3315715, -3124589, -1668595, -6556268, -8214125, 5564130, - 15446850, -22527104, 21597244, -19222126, -23310934, 1316408, 6856916, -14448270, 11035918, -2931315, - 7142531, -12614319, -5334350, 18618684, 8431021, 18848464, 5647882, 416612, 6661495, -1172526, - 1032940, 9302899, -665720, 687195, -9120363, -7526930, -5377299, 6148246, -7172596, -7410966, - 11860552, -1604170, 13187697, 743029, -9923522, 14587856, 12010876, -2370822, 7507603, -9547712, - -14235669, 3715147, -6169721, -11119670, 45996952, 56846040, -9049496, 682900, -28829968, -2896956, - -21163452, -15212774, -5392332, -10322954, 15541339, 274878, 11937862, -26278758, 21560736, -16475495, - 22011708, 1015760, 17358110, -6262063, 21996676, 7589207, -11282879, 4913443, -16587164, 10767483, - -9513353, 25492778, 6953552, 16778290, -28374702, -15811922, -7453916, -14001593, -6549825, -9584220, - 221191, 34312492, -16552804, 17237852, 28348932, 4088809, 12043088, 115964, -7275675, -13651554, - -11132555, 1335735, -8274255, 17411798, -12197707, 7879118, 20379620, -2993592, -2632815, -1932735, - 16456167, 18500572, 4941360, -9021579, -8613557, -4954245, 6324340, -17594334, 2168959, -3539053, - -5854041, -277025, 10151155, 412317, 14759655, 14008036, 1417339, 2658585, -8860518, -44989784, - -38506528, 16593606, -4305705, 20742544, -11456825, -11224897, -13868449, -13146895, -4722317, -35794256, - -11875585, 12311524, 19531364, 6627135, -23375360, -7980049, -10799695, 9148280, 35835060, 18472654, - 9356586, 214748, 3438121, 642098, 6925635, 16915728, 2226941, 3545496, -9564892, -390842, - -14048838, 4522601, 7941395, 11815455, 2409477, -10258529, -3796751, 15934329, -7344394, 5162551, - 4211216, 4879083, 22722524, -13685913, -17991618, 5564130, 16365973, 2682207, 16344498, 17343078, - 9723806, 11523397, 5656472, 1221918, 10965052, 29792040, -16902844, -1700807, 5748814, 1056562, - -12994424, -4196183, 11027329, -2031520, -11602854, 2918430, 23383950, -20560008, 6631430, -19658066, - 10778220, 4745939, 3496104, -1475321, -89096952, -30457760, -2456721, -8366597, -22320946, 13831942, - 17368848, 30560840, 9429601, 19393924, -18010946, -36567352, 16812650, -8269960, 487479, -19462644, - 19194208, -11300059, -1359357, 18730352, -50968376, 5357972, 25877178, -48576080, -13376676, -16904992, - 1975685, 2297808, 11613592, -13174812, 15526307, 2731599, -26091926, -12796855, 2680060, -2847563, - -13093208, 11660836, 29568702, 6826851, 7945690, -4372277, -7758859, 17864916, 2884071, -8360154, - -43246024, -6453189, 5149666, -21408264, 10088878, 9156870, 1507534, -16494822, -15270756, -17630840, - 38373384, 10524817, -6043019, 7730941, -32918776, 4082367, -15448997, -17439714, 17008070, -2761664, - 208306, -11014444, -40965400, 5585605, 12605729, 7209103, -2710124, 24230058, 1395864, 1361505, - 93802088, 23882166, 24013162, 20796232, -6281390, 968515, 96409128, 28067612, -8317204, 59191092, - -33474976, 24743306, 4821101, 15141907, 23764054, -7406671, -17255032, 18242874, -3734474, -58387932, - 14489072, 15146202, 11899207, 27786290, 17126182, 18122614, -16965120, 3569118, -16423955, -8366597, - 16752520, 5650030, -34677564, -20474110, -29184302, -42679092, -7148973, 8622147, 20119774, 17768280, - 14766098, 12773233, -7015829, 22048214, 11632919, -27303108, -11138998, 6987912, 19585050, 240518, - 3554086, 35654672, -7314330, -3304977, -10226317, -2141041, 17338782, -15891379, -738734, -22355304, - -20703890, -12809740, 21889300, 31441308, -10363756, 2448131, -7359427, -19617264, -14673756, 5312875, - -24238648, -5471789, -7780334, -13398150, 94725504, 57475252, 3066607, 36816460, 26394722, 8731669, - 40422084, 12564927, -1215476, -12028056, -10655814, -26205742, -74474736, -4632122, 5976447, -24249386, - -15448997, -2059437, 50002008, 17501992, -14521284, 1236951, 2299955, -6650757, 20308752, -2985002, - -14615774, -8450348, -13881334, 8686571, -19795504, -44465796, -375810, -22975928, -37853696, 7632157, - 14254996, 23259396, 11351599, 20598664, -15283641, -38418484, -26858578, -34565896, 12105365, 32974612, - 25312390, 17635136, 30988190, 992137, 18702436, 44418552, -38427072, 6629282, -18348100, 98784, - 10907069, 13052406, 19666656, -2224793, -46785080, -35055524, 5450314, -10374494, -14828375, -9345849, - -11959336, -31776316, 438087, 19333796, -4655745, 13773960, -12193412, -3955665, -4840428, 21904334, - -46355584, 4574140, -35094176, 15066745, -68305016, -3137474, -21586506, -37224480, 66129612, 35330400, - -21315922, -59023588, -12917114, -22183506, -48829484, 38386272, 3951370, -35944580, -11108933, 19327352, - -31168578, -23398982, -15388868, -40067748, -12985834, -1554778, -29624536, -29517162, 42651172, -15760382, - -10350871, -4337917, -6700149, 33833604, -35691180, -18300856, 10531260, -10593537, 2516851, -9030169, - 22473416, -36447092, 15588584, -58014272, 8686571, -16716013, -20160576, 60513940, 9300752, -22475564, - 14665166, 12693776, -45749992, 34074124, -4958540, -10344429, -257698, 19726784, -4509716, 1282048, - -19711752, 13312251, 19782620, 28007482, -19503446, -59543280, 46473692, -3674345, 21902186, 22162032, - -7829726, 13883482, 36088464, -37209448, -88989576, -53206056, 13743895, -34765612, 6251325, -25765508, - -9822590, -36702644, -21343840, 15032386, 53629108, 51593296, 10924249, 35731980, -23901494, 64136748, - 51133732, -41143640, -32579474, 8714489, 13348758, 53861036, 22771916, 33661808, -10559177, 12118250, - -4883378, -8317204, -9474698, 50203872, 25935160, 47987668, 48120812, 6474663, -234076, -24539296, - 24522116, -4947803, -43490840, -32981054, -6236293, -26096222, -2785286, -26766236, -18895708, 12154757, - -3934190, -17832704, 40969692, 42857332, -23437636, -11117523, 64340756, 22728966, -39505108, -43922484, - -12268574, 13076028, 727997, -10290742, -27279484, 22688164, 10548440, -12496207, 9790378, 4123169, - -34432752, -19370302, 6287832, -17231408, -15367393, -23036058, 53027812, -43602508, -33277406, -34456376, - -51299088, -43548820, -676457, -34220152, -44671956, 11690901, -4146791, -61544732, 43785044, 8136816, - -4127464, 22256520, 67647880, 65277060, 27631672, -79345224, 29149944, 21371758, -78434696, -843961, - -38104948, -18051748, 39711268, -46956876, 26914412, 204011, -8615704, -16666621, 7584912, -3738769, - 12979391, -8914205, -42329052, 40718436, 18618684, 48717816, -5660767, -16258599, -24122684, 19767586, - -21829172, 57447336, 11398843, 34507916, -45423576, 35624608, 633508, 12584254, -29811368, 9689446, - -35306780, -5542656, -36247376, 14304389, 23504208, -47167332, 882616, -38968240, 17008070, 22499186, - 21051782, -3498251, -67703720, -429497, 16035260, -6425271, 27805618, -64392296, 14315126, -27573690, - 6165426, -23929410, 1670742, 14201309, 94399088, 116943368, 47382080, 41519448, -67832568, 65386584, - 92223688, -100860864, 11190537, 67381592, 10516227, -120480272, -13140452, -64815352, 20349556, 25492778, - -31733366, -10728828, 21238614, -54535348, -5409512, -20514912, -28394028, 12322261, -43314744, 47113644, - 31621696, 60544008, -30169998, 11190537, -7292855, -22497038, 73637216, 163209, -35231616, -14534169, - 15189152, -14328011, -20448340, -21120502, 36996848, 15940771, 51784420, -1816771, 18378166, 71199824, - -44878112, 11261404, -30805652, 57082264, -22587234, 27958090, 9852655, 188979, -21889300, -36612448, - -27575838, 13675176, 48451528, -43883828, 40630392, 52525304, 23566486, 61106648, -29710436, -19514184, - 36137856, -2690797, -8759586, -49115100, -5383742, -39191576, 6637872, 61510376, 24157044, 21169894, - 18854906, }, - { - -11117523, - 365072, -2740189, 2707977, -1516124, -457414, 828929, 1941325, -371515, 1939178, 813896, - 642098, -96637, -139586, 294205, 208306, -979253, -515396, -1848983, 839666, -577673, - -77309, 1911261, 717260, 251256, 261993, 545461, 21475, -326418, -12885, -204011, - -133144, -566936, -302795, -178241, -137439, 103079, 143881, 2147, 4295, 2147, - -77309, -34360, 49392, 178241, -60130, 7786776, 4277788, 2156074, 2637110, 1483911, - 2231236, 4514011, 259846, 128849, -470299, -1114544, 2342905, 27917, -165356, 2486786, - -962073, -1153199, 687195, 249108, 1069447, 259846, 410169, 1123134, -751619, 753767, - -223338, -165356, -564788, 380105, 1490354, 790274, 938450, 785979, -94489, 612033, - 882616, -362925, 745177, -1251983, 1565516, -629213, 466004, 83752, 225486, -300648, - -279173, 3910568, -4475356, -603443, -818191, -1116692, 732292, -2229088, 760209, -53687, - 1020055, 886911, -1758789, -629213, 2699387, -283468, 581968, -500364, 1178969, 2469606, - 2862596, 485331, 1239098, -40802, -2244121, -66572, 253403, -485331, 17180, 1245541, - -1284195, -1735167, 768799, -837519, -766652, -1215476, -42950, 1288490, 332860, -373662, - -453119, -504659, 4295, 292058, -676457, 261993, -773094, -11222750, -7986492, -3886946, - -2942053, -2239826, -2321430, -785979, -1715839, -517544, -1080184, -2763812, 528281, 1438814, - -238371, 828929, -543313, -1421634, -1451699, -2156074, -749472, 545461, 57982, -1202591, - 820339, -1458141, -1464584, 985695, -6442, 75162, 768799, 899796, 229781, -309238, - -435939, -545461, 296353, 182536, -766652, 442382, -1522566, -624918, -375810, -124554, - -1084479, -184684, -397284, -15927886, -2181844, 1271310, 199716, 1202591, 88047, -841814, - 541166, -639950, -790274, -1393717, -1245541, 616328, -489626, 1056562, -1022202, 53687, - -989990, 337155, 1580548, -388695, 1163936, 103079, -1151051, -188979, 1428077, 773094, - 912681, 1118839, -1574106, 1067299, -667867, -92342, -869731, -360777, 403727, 695785, - 311385, -337155, 1140314, 1056562, 571231, -322123, -809601, 139586, -674310, 18796924, - 14995878, 3528316, 6719477, 1597728, 5199058, 3624953, 1131724, 3648575, 1481764, 2759517, - 1215476, -1035087, 2800319, 1943473, -755914, -279173, -5188321, -586263, 270583, 3139621, - 365072, 92342, 1619203, 96637, 1462436, 1312113, 219043, -141734, 515396, 2126009, - 1657857, 1357210, -137439, -594853, 90194, 962073, -380105, -148176, 1118839, 326418, - -558346, -73014, 236223, -1151051, 1374390, 33066954, 12139725, 5832566, 3498251, 2091649, - 2158221, 1999307, 3397319, 801011, 5529771, 727997, 517544, 2340757, -1282048, 541166, - -569083, -622770, -914828, 3517578, 1958505, -317828, 2701535, -1883343, -474594, -680752, - 4168266, -414464, 1494649, 307090, 2037962, 332860, -616328, 1052267, 1391569, -667867, - 487479, 549756, 362925, 826781, -289910, 951335, 865436, -2703682, 569083, 289910, - 491774, 12685186, -9378061, -3302830, -4333622, -2714419, -2570538, 1733019, -1464584, -3927748, - -970663, -5220533, -1209033, -2278480, -4980015, -1282048, 1136019, -3171833, -1045825, 474594, - -3515431, -173946, 4069482, 895501, 590558, -1879048, 83752, 1404454, 36507, -1726577, - -1806034, 1853278, -158914, -2426657, 231928, -1035087, 2959233, -92342, 1335735, -483184, - 2559801, -1685775, 1028645, 337155, 603443, 27917, 659278, -73014, -813896, 1556926, - -34866544, -19722490, -4026532, -4915590, -3371549, -4297115, -6058052, -556198, 169651, -1778117, - 1524713, -1649268, 264141, -169651, -1977833, -2192581, -3453154, -1209033, 3435974, -3246995, - -345745, 3096672, 1997160, -489626, 1163936, -453119, -3330747, -1672890, -2727304, -936303, - 163209, -691490, 1636383, -2946348, -2289218, -92342, -2817499, -2211908, -1977833, -2347200, - 2523293, -725850, -2963528, -957778, 882616, 944893, -962073, -1533303, -633508, -21388938, - 12277164, 4599910, 2007897, 2102387, 1868311, 934155, -2297808, 603443, -1372242, -395137, - 3816079, 2345052, 3283503, 3380139, 3468186, -2905546, 1455994, 3753802, 586263, 3268470, - -3880503, 730144, -996432, -261993, -1468879, 1380832, -526134, 55835, 3377992, -3515431, - -1090922, 1335735, 1930588, -921271, 1602023, -1395864, -2342905, 2735894, -1406602, -124554, - -805306, 1026497, -390842, 1254131, -1406602, -530428, -1279900, -352187, -1127429, 2029372, - 141734, 644245, 31810676, 13035226, 2753074, 7258495, 5677947, 1103807, 2536178, 6863358, - 3126736, -167504, 1464584, 850404, -1017907, 1960653, 5892695, 1378685, 7033009, 3414499, - -5811091, 1080184, 195421, 1187559, 5186173, 2920578, 2080912, -468151, -826781, -715112, - -895501, 798864, -1157494, 1720134, 502511, 2345052, -500364, -618475, 843961, 1911261, - 1026497, -225486, -2572686, -1090922, -1440962, 2257005, 1619203, 2549063, 1391569, 367220, - 337155, 2175401, 1705102, 1421634, 199716, 35540856, 10196252, 4436701, 5555540, 906238, - 5366562, -880468, -2059437, -126702, 1370095, 558346, -176094, 1005022, 5465346, -822486, - -3438121, -2418067, 2639258, 657130, 3077344, 4879083, 4277788, -317828, 2845416, -3143916, - 326418, -2450279, 3279208, 1857573, -3738769, 2134599, -1788854, 223338, -1449552, 2158221, - -1398012, 2716567, 2177549, 1735167, 3539053, 1116692, -96637, -923418, -15032, 429497, - 3917010, -163209, 77309, 223338, 1881196, 1213328, 118112, -551903, 4879083, -15094663, - -6171868, -2422362, -3487514, -1541893, -1329292, 264141, 2143189, -2177549, -4112431, 3852586, - -4937065, -4649302, -880468, -1052267, 2115272, -1294933, -122407, -4490389, -2723009, -5426691, - -6021544, -6637872, -947040, 1591285, -4685810, -1217623, 646393, 539018, 182536, -562641, - -4645007, -2836826, 1990717, 818191, -1099512, 4419522, -2952790, -1273458, 1069447, 2727304, - 2168959, -335007, -687195, 1101659, 622770, -2789581, 234076, -1617055, -783832, 270583, - -1178969, 210453, 1902671, -38590280, -12219182, -7247758, -3081639, -5199058, -4249870, -1178969, - -3049427, -1191853, -4052302, -5342940, -3917010, -1264868, -8048769, -1859721, -3309272, -4793184, - -654983, 889058, 2546916, -2780991, -4052302, -1421634, 3219078, 4262755, 5104569, 2823941, - -204011, -2493229, -1221918, 88047, -3208341, 1374390, 2070174, 2753074, -1896228, -1505386, - -1529008, -659278, -687195, -1037235, 2016487, -543313, 1279900, -2602750, -4696547, -1874753, - -251256, 2385854, -4078072, 1393717, -1999307, 1947768, -2035815, 1189706, -22192096, 5914170, - 1644973, 23622, 3891240, -3728032, 1000727, -8577050, -2787434, 2989297, 2119566, 5538361, - -399432, 6043019, -3515431, -880468, 2894808, -5244155, -1921998, -3081639, 5894843, -362925, - -4868346, 2467459, 4702989, -4159676, -3171833, -3743064, 1099512, -861141, 2037962, -1421634, - -1181116, -989990, -2267743, 3341485, -2660732, 665720, 2192581, -249108, 2531883, -1432372, - 5523328, 854699, -534723, -1896228, -1894081, 118112, -2181844, -2649995, -1647120, 472446, - 1906966, -214748, 545461, -2293513, -2319282, -3285650, -1297080, -1002875, -841814, 19284404, - 27455578, 9573482, 9472550, 13121125, 9350144, -1267015, 1801739, -972810, 1685775, 1647120, - 2325725, 1808181, 4627828, 1833951, 2869038, 944893, 9206262, 2194728, 4471061, 2710124, - 2306398, 7327214, 1644973, 9171903, 4647155, -1870458, 6373732, 1681480, 3085934, 6448894, - 1209033, 3822521, -2080912, -710817, 1702955, 2860448, -4080219, 3322157, -2420214, -4367982, - -2675765, 3478924, 5186173, 3957812, -936303, 1209033, 1065152, 1885491, 2628520, 1490354, - 2985002, 1788854, -3240553, -236223, 2012192, 2911988, 687195, 822486, 294205, -3240553, - 65925600, 5252745, -3618510, 5581310, -3852586, 7745974, 2001455, 8121783, -4138201, 1005022, - -219043, 4984310, -8604967, 1898376, 5113159, -869731, -1488206, 7174743, 10606422, -4256313, - -2772402, 1591285, 5117454, -2126009, 3238405, 444529, -3751654, -2649995, -3040837, 2568391, - 3053722, 4075924, -2987150, 4468914, -2959233, 4348655, 3431679, -670015, -2682207, 1672890, - -4161823, -5267778, 1000727, -3517578, 1324997, 661425, 377957, 2632815, -264141, 3137474, - -30065, -3493956, 1273458, -710817, 1565516, -2482491, -777389, 695785, 1668595, -1241246, - -5001490, -22578644, -21897890, -4969277, 1720134, -974958, -3283503, -3571265, -4868346, -1303523, - 3657165, -1174674, -1198296, -5033702, 5357972, -296353, -4322885, -3749507, 9266392, -8315057, - 921271, 6137509, -654983, 1045825, -7975755, 2613488, -3373697, 1977833, -5510443, -3599183, - 1011465, 1554778, -2514703, -2856153, 384400, -1118839, 515396, -3332895, -1814624, 3682935, - -259846, -1569811, -874026, 4672925, 2162516, -2465311, -3801046, -3375844, 1355062, -390842, - -1490354, 543313, 942745, -1765232, 5611375, 3115999, -350040, -227633, -1181116, 854699, - -1337882, -1359357, -1372242, -92342, -2787434, -2190433, -8562017, -7838316, -8819715, -6783901, - -4501126, -3423089, 966368, -332860, -2040110, -1153199, 2422362, 7630010, -6605660, 3210488, - -2044404, -4559108, 5802501, -704375, 1357210, 7065221, 1333587, 2847563, -4312147, -1303523, - -13045963, -1735167, 2789581, 1434519, 1423782, 1140314, 2147484, -3158949, -3710852, 2843268, - -68719, 2677912, 1733019, -3710852, 3182571, -487479, -9152575, -7965017, -1015760, -7546258, - 1247688, 2106682, -210453, -2078764, -551903, 141734, -1874753, -869731, -133144, -1466731, - 2579128, 423054, 1047972, -1507534, -663572, 3440269, 1239098, -2538326, 2798171, -768799, - -1404454, -4015795, 373662, -43033424, -9859097, 678605, -8604967, 3502546, 818191, 10378788, - -4872641, 661425, -2877628, 6972880, -14162655, -13507672, 5677947, -6521908, 10159745, 3736622, - -8222715, -14306536, -358630, -4013647, -6994354, -2806761, 1612760, 2372970, -3388729, 12337294, - 635655, -1172526, -5160403, 4232691, 4636417, 5063767, 5373004, -618475, -3206193, -1159641, - 3173981, -201863, 3835406, -3569118, -1432372, -1196148, 4449586, 3624953, -3906273, 5113159, - -2821794, -3481071, 438087, -1556926, -3345780, 3502546, -3957812, -483184, 1026497, -916976, - -1593433, 949188, 3354370, -2020782, 3225521, -2598455, 2188286, -1428077, -1586990, -1000727, - 39582420, 34628172, 7333657, 9193377, -1775969, 11252814, 9159018, 11332271, -408022, 4494684, - 2813204, -10819023, -9023726, 4885526, 1022202, -7782481, -8072391, -4640712, 560493, 4496831, - 1382980, 10735271, 9936407, 4226248, -2265595, -2523293, 6577743, 6019397, 500364, 5254893, - -1730872, 6749541, 388695, -1612760, 9560597, 4844723, 7836168, 4928475, 1711545, 5362267, - 2750927, 1767379, 5072357, -2937758, 992137, 6616397, -103079, -4514011, 3981435, 3831111, - 2815351, -3227668, -124554, 3773129, 5884105, -3148211, 7121056, 8025147, -1490354, -4627828, - 691490, 1694365, 1200443, 3403762, -96637, 1086627, 2692945, 47699908, 4131759, -1578401, - 3609920, 2091649, -7630010, 1836099, 2366527, -212601, 5334350, 7106024, 11186242, -5106716, - -4724464, -7960722, -6034429, 6854768, -324270, 9994389, -2224793, -2692945, 4443144, 8656507, - 3755949, -9124658, 7284265, -2815351, 5871221, -3154654, 4608500, -5579163, 3519726, -642098, - 5364414, 414464, 3152506, 1370095, -8819715, -5179731, -627065, -2035815, -635655, -3023657, - 4567698, 1449552, 9519795, -1647120, -6176163, -3923453, -446677, 350040, -6904160, 2183991, - -2231236, -526134, -513249, -4352950, 3938485, 6998649, -2115272, 3493956, 1005022, -4271345, - -253403, -4082367, -3092377, 408022, 6474663, 657130, -2619930, -6438156, 1879048, -2372970, - 13840532, -3317862, -13215614, -8948564, -11916387, 11001559, -8804683, 2424509, 13453985, -612033, - -13666586, 916976, -14347338, 11927124, -4168266, 11884175, 70867, -4556961, 10237055, 358630, - 2121714, -7730941, -9740986, -1591285, 3418794, 2065879, -1909113, -4520453, 4518306, -1417339, - 3371549, 5175436, 6309307, 2892661, 3483219, -12859132, 1052267, -2942053, -4404489, 1722282, - 6335077, -5392332, -9878425, -4385162, 2856153, 1088774, -8690866, -3564823, 3998615, 5871221, - -5246303, -3420942, -4054449, 6010807, 7965017, 1591285, -2763812, 880468, 5675800, -2780991, - -309238, -48593260, -48730700, -8177618, -23753316, -15133317, -8257075, -13550622, -1348620, 9833328, - -21678848, 7808251, -4206921, 7112466, 1561221, 4286378, -8802535, 2119566, -828929, -4937065, - -19819126, -4286378, -10142565, -12983686, -996432, 3066607, 1030792, -4518306, 3148211, -4290673, - -856846, 10546292, 150324, -3706557, 1056562, 6861211, 9805410, 6171868, 416612, 4909148, - 6240588, -687195, 491774, -10574209, 4292820, -8750996, 2078764, 8239895, -5267778, -10563472, - 3513283, -5961415, -5111011, 1080184, 433792, -5035849, 2946348, -1245541, 11834782, 6277095, - 4022237, 1342177, 4726612, -457414, 1853278, -4483946, -7372312, -1348620, -28321014, 52971980, - 42309724, 2179696, 8914205, 2942053, 9670119, 13720273, 3607773, 13299366, 2830384, -14980846, - 9983651, 11117523, 3764539, 2967823, 8993662, 10924249, -11154030, 9012989, -5763846, 7842611, - 1516124, -7494718, 1589138, 8916352, 5604933, -11828340, 5662915, -5179731, 16550656, -1952063, - 3992172, -3105261, -10406706, 10048076, 10711648, 4443144, 2806761, -1088774, 3899830, 10664404, - 2697240, 7436736, 1060857, 4962835, 3085934, -1406602, 6113886, -8061654, -11512660, -5738077, - -8808978, -8123931, -3876208, -8338679, 10170483, 6579890, 762357, -2566243, -3824669, -1947768, - -468151, -672162, 261993, 670015, 1853278, 420907, -571231, 70796096, -27270894, -15923591, - 3332895, -899796, -2806761, -20605106, -7750269, 4329327, -231928, -3590593, -3158949, 2310693, - -15605764, -5415954, 9210557, 15154792, 9399536, 6380174, -4376572, -5596343, -8686571, 10204842, - -14763950, -3476776, 4550518, -10980084, 4054449, 3599183, 13172665, -19849192, -897648, -1138166, - -3238405, 4254165, -16943646, -10022306, 20128364, 11963631, 3360812, -4166118, 12298639, -4239133, - -811749, 1312113, 9764608, 4367982, -4924180, 322123, -2592013, 6556268, -11209865, -6249178, - -6521908, -8480413, 15234249, 3075197, 2486786, -7355132, 141734, -3120294, -1887638, -7690139, - 1765232, -7350837, 410169, 1228361, 6296422, -10666551, -6017249, -9532680, -1904818, 20927228, - 49261128, 7705172, 18992346, 16535624, 16501264, 5065914, 12412455, 7106024, -3199751, -10286447, - -6002217, -3227668, 14160507, -12204150, -12809740, -1271310, -298500, -5744519, -9740986, 29278792, - 28162100, 20579336, 1324997, -12375948, 2418067, 1576253, -5677947, 6405944, 4666482, 11538430, - 1685775, 4445291, -277025, -8695161, 13859859, 10780368, 8405251, -2422362, -10462540, 165356, - -530428, -3513283, -21672404, 15305116, -9713069, 17712446, 1344325, 9309342, -1791001, 10301479, - 16849156, 2692945, -7170448, -1196148, 3352222, -6122476, 3231963, -2821794, -6693707, -4589173, - 2639258, -2495376, 7279970, 1612760, -11377368, -165356, -1245541, -13619341, -2596308, 1464584, - -4425964, 4791036, -51077900, -7121056, -31714038, 70867, 5965710, -11156178, -18399640, -21940840, - -20201378, -12429635, -16404628, -4365835, -781684, -4582730, 5744519, -3584150, 1464584, 12914967, - 6287832, -1529008, 31505732, -7052337, 6633577, -4763119, 3021510, 4312147, 2076617, -1943473, - 5001490, 14383845, 4829691, 4982162, 2089502, 5660767, 12773233, 16799764, 5811091, 20429012, - -5014375, -17877802, 18429704, -5811091, -3242700, -3728032, 10677289, 15618649, 12414603, -392990, - -3498251, -9073118, -22329534, 14070313, 16685948, 11321534, -13037373, 8267812, 2832531, -1382980, - 13728863, 2218351, 9500468, -7213398, 5076652, -8972187, 2147, 7969312, -1346472, 6068789, - -216896, -3085934, -2091649, -89446992, -40851580, 18799072, -3985730, -2581275, 2727304, -10758893, - -10359461, -2871186, -4928475, -15229954, 10657961, 1741609, 23053236, -12607876, -11735998, -18687402, - -11205570, -19252190, 1170379, 7801808, -30000346, 19628000, 15972983, -1778117, 2843268, 13005161, - 1417339, 11523397, -22821308, -21942988, -12923557, -14171245, -11793980, 37164352, 11510512, -7404524, - -13507672, -18051748, 8484708, 5699422, -9257802, 7986492, 6833293, -12485470, 871878, 3676492, - 10037339, -11501922, 29746944, -12406013, -10844792, 5499706, -3560528, 665720, -9365176, -2559801, - 654983, 20014548, -6197638, 28486370, 5645735, 2776696, 2888366, 8390219, -8407398, -1883343, - -10947872, -7625715, -8317204, 1211181, 14989436, -8321499, 14164802, 45481556, 23308788, 14493367, - 9756018, -16043850, 1488206, -13020193, 20059644, -2302103, -2877628, 6736656, 4230543, 4531191, - -858993, 6927782, 2291365, 7295002, -6526203, 19501300, 2319282, -2087354, 58875412, 2907693, - -4941360, -15522012, 8373039, -14493367, 12741020, 31505732, -3025805, 7368017, 7307887, -16913582, - -18981608, 34360, -251256, 13475460, -9773198, -75162, -1696512, 9715216, 9869835, 17126182, - 5866926, 5478231, 6498286, 25770, 10808285, 4707284, -22561464, 3826816, -12156905, -28546500, - -3485366, 6929930, -1007170, 1417339, -4902705, -401579, -2183991, -1118839, 2115272, -399432, - 11160473, -8604967, -2744484, 1389422, 970663, -730144, -6672232, 7623567, 12848395, 64939904, - -17733920, -9070971, -16385300, 31821412, 14020921, 1041530, 8467528, -6637872, -6174016, 10060961, - 2744484, -13391708, 4657892, -17111150, -9975062, -1011465, -13911399, 330712, 6710887, -13282186, - -18577882, 122407, 2718714, 11871290, 24096914, 13838385, -8905615, -1995012, 15579994, 23643794, - -25061134, 8216273, -3380139, -2308545, -10546292, -18998788, 3094524, 13471165, 6154688, 4971425, - 11353746, -2987150, 8141111, -3474629, 6302865, 7909183, -16136192, -14450417, 29379724, -4189741, - 848256, -8269960, 12788265, 33822868, 10726681, 3365107, 13413183, -11491185, -8832600, -2065879, - -6085969, -22625888, 15148350, -405874, -8239895, 3524021, 5177583, -7943542, -7419556, 10945724, - -2089502, -17703856, 10000831, 5209796, 56446608, 54350664, -18019536, 15131170, 3955665, 11836930, - 28421946, -3169686, -15614354, -4913443, 55338508, -31035434, -6517613, -15210627, -13030931, -25110526, - 27367532, -7743826, -38568808, -28005334, -35257388, -13005161, 30075508, -3375844, 13857712, -5164698, - -16320876, 13926431, 3384434, 17553532, -17364552, 15627239, 11572789, 6517613, 6427419, -27111982, - 7159711, -22621592, 18556406, 40913860, 11078868, 12382391, -26684632, 36610300, 9004399, -3706557, - -6427419, -7337952, 10642929, 18292266, 3633542, -4230543, -1879048, 4928475, -9655086, -6350109, - -9330816, -6633577, -1539746, 13260712, -9803263, 19834158, 6337224, 12040941, -4995047, -28870770, - -20036022, 7020124, 1148904, -8888435, 9949292, -953483, -1606318, 5242008, -4413079, -54438712, - -30958124, 6826851, 5201206, -1099512, -22477712, 13204877, 8989367, -14890652, -37336152, 30771294, - 8927090, 11078868, 19056770, 9938554, -3717294, 5257040, -8308614, 25673168, -20274394, -37986840, - 289910, -2207613, -16234976, -41137196, 2948495, -8624294, -19739670, -12010876, -4915590, 9030169, - 3420942, 14959371, 32018982, -12777528, -22804128, 7894150, -792421, 435939, 14512694, -17405354, - -13793287, -1898376, 16902844, -18695992, 18326626, -5046587, 33137820, -3837553, -6893423, -2987150, - 2961380, 6818261, -32040456, 5845451, -27206470, 31830002, 3300682, 20413980, 14882062, -10739566, - 1937030, -14482630, 11345156, -367220, 9957882, 7258495, -16733193, -1561221, -15723875, -7110319, - 13651554, -4183298, -7185481, 7984344, -71092448, -37263136, -9431748, -11400991, 747324, 4638565, - -22769770, -21683142, 9850507, -24820616, 9833328, -27236536, -4514011, -26456998, -25082610, 26480620, - 15311558, 1221918, 1204738, -27788438, -38583840, 17454748, -51535312, 16460462, 3777424, -20800526, - 5832566, -14192719, 7129646, 34589520, -16157667, -5439576, -38010460, 28774134, -6569153, 11196980, - -11482595, -8319352, -392990, -5080947, 22009560, 2982855, 42659764, 44126492, -2072322, -2954938, - -12848395, -1939178, -3206193, 3695819, 18165564, -1926293, 37512244, 5914170, -9880572, 1582696, - 10146860, -3809636, 560493, -3015067, 29280940, -23791972, -36483600, -20532092, 3650722, 4883378, - 9966472, 15264314, 1151051, 3682935, -6792491, -20959440, -18668076, -22988812, 5126044, -8121783, - 95328944, 41304700, 29965986, 11192685, -9964324, -18107582, -28716152, 15410343, 29029684, 10711648, - -12496207, 32373316, 19503446, 32341104, 2967823, -25179246, -8684424, 49020608, -51623360, -11841225, - 35227320, -21607980, -10853382, 79746808, -9528385, 21945136, 73959336, -12979391, -4230543, -3382287, - 9698036, -5336497, 32373316, 19155554, 26772678, -19885698, -42780020, 15955804, -16552804, 19417548, - -7582765, 6124624, 31419834, 16421807, 2342905, 12079596, 6798933, 11536282, 30399778, 15247134, - -2634963, 27399744, 12732431, 2467459, 7490423, 51750060, 32686848, -1705102, 29787746, -14675903, - 37538016, -11059541, 8890582, -12406013, 5272073, 19091130, -10722386, -2944200, -919123, 5121749, - 2269890, -16172699, 2499671, -14392435, 121090160, 55967720, -25567940, 11506217, 62139588, 2325725, - 44626856, -12534862, 17115444, 38764228, -29469918, 4275640, 65302832, 60273424, 47502340, 17905718, - 40666896, 7797513, 35534412, 13503377, 10118943, -22000970, -27661736, -37276020, -76300096, 24792698, - -23622, -19711752, -8130373, 26830660, -18053896, -1855426, 2025077, 15393163, -67718752, -10086731, - 47556024, 38036232, -14405320, 25363930, 20145544, 14353781, -9101036, -14841259, -7651484, -9764608, - -7668664, -24000278, -21865678, 17779018, -42513732, 14450417, 33264522, -9451076, -25239376, -37280316, - 34748432, -418759, -18837726, -11042361, -9047349, -12281459, 6685117, -5224828, -14033806, 14385993, - 54668492, -26746908, -17401060, 8190503, -11474005, 14141180, -152471, 30322470, 4870493, 2873333, - -47568912, -14100378, -57322780, -13275744, -57307748, 27120570, -54597624, 28948080, -9038759, -32669668, - -9159018, -15710990, 67927056, 9676561, -48681308, 137439, -31651762, -26130582, 33644628, -38356204, - -34284576, -40020504, 59214716, -8821863, 39200168, -60786672, -31580894, 22870700, -27582280, 21745420, - 65429532, 41781440, 40583144, 5877663, -6646462, -32669668, -44708464, -3487514, 10232760, -42769284, - 1129576, -25692494, 12255689, 17224966, -47476568, -41689100, -74519832, -12919262, 5302137, -33386928, - -46044196, 44208100, 2467459, 45406396, 46011984, -7022272, -6352257, -20055350, 26598732, 21464100, - 3453154, 9833328, -3586298, -3874061, 22589380, -7460358, -25930866, -21708912, -32590212, -29280940, - -9586367, -2800319, -3343632, -43121472, -83951576, -12571369, 5564130, -6008659, -1597728, 23837068, - -19980188, 21339546, 16967268, -11497627, 23564338, -33812132, 42359116, 31776316, -392990, -31082678, - 670015, 22971632, -98152888, 21311628, 37179384, -67529768, 26257282, -33947420, -52654152, -44762148, - 21206402, -10247792, -74038792, 39827232, 18348100, -42256036, -75000864, 15891379, 6143951, -21704618, - -7773891, -36185100, 32527934, 30103426, 48417168, -39769248, 3927748, -53203908, -23349590, 10417443, - -37634652, 15470472, -7325067, -26242250, -44096428, -43297564, 61516816, -42696268, -24030342, -15494095, - -816044, 30666066, 13947906, 22591528, -3657165, 26259430, -12635794, 4902705, -15105400, -26031796, - 687195, 58287000, 3974992, 2074469, -5587753, -36346160, 18167712, 39275328, 33554432, -55918328, - -27775554, -58982784, 17693118, -11523397, 24167780, -17003776, 12111808, 17611514, -18066780, -34241628, - 50425064, -14194867, -20671678, 55832428, -10511932, -14617921, 66546224, -39086348, 10857677, 14669461, - 6337224, -58903328, 1438814, -9730248, -33363306, 18451180, -25941602, 35287452, -5199058, 39423504, - -43368432, 26381836, -77749648, -493921, -41845868, 46731392, -6146098, 5190468, -7011534, -45243184, - -1902671, 36801428, 102121440, 6027987, 7640747, 20003810, 35774932, -7279970, -8385924, 1713692, - -386547, 87230784, -6676527, 12208445, 36992552, -36013300, -57662084, -1269163, -60986388, -9113921, - -30567282, -24427626, -10988674, -27771258, 16436840, 20605106, -34662532, 44601088, 39966820, -6616397, - -7395934, -38414188, 28623810, 8903467, 95039040, 103530184, 770947, -31765578, -25479894, 86741160, - -56972740, -64965676, 67665064, -61351460, 39571680, 12071006, 54793044, 50495932, 34162168, 5549098, - -34361884, -29684666, 71152576, -30056182, -2894808, 17439714, 60687888, 87701088, -2456721, 59970628, - -48752172, -51002736, 6051609, -18728204, 28565828, 18103288, -43342664, 6158983, 28157806, 72241352, - 24998858, 29753386, 27567248, 32465658, 8832600, -2263448, 46299748, 8330089, 37207300, 58847496, - 12940736, -23753316, -19649476, 53113712, 14710263, 108615424, 26246546, 43054900, -43072080, -69009384, - -5482526, -80618680, -50609748, -18021682, -26231512, 3530463, -2452426, 1159641, 3015067, -60084444, - -48022028, -25965224, -49312668, 19488414, 23572928, -15180562, -392990, -47734268, -2894808, 14061723, - -6515466, }, +const Word16 CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS][2474]={ {-68, 7, -15, 15, -7, 6, 0, 7, 0, 8, -10, -5, 5, -6, -1, -10, -1, -4, 20, 10, -12, 0, 5, 0, -3, 5, 1, 3, 5, 4, -6, -2, 1, 1, 1, 0, 0, 0, 1, 0, 0, -1, 0, 1, 0, 0, 51, 30, 16, 8, 9, 3, 6, -1, -1, 15, 8, 7, 14, 12, 16, -22, 20, 5, 1, 4, -1, -10, -7, 12, 5, 9, 0, -3, 7, -1, -3, 7, 4, 10, 3, 7, -10, -6, 5, 1, 6, 2, -1, -3, -8, 2, 27, -28, -6, -6, + -7, -2, -1, -5, -4, 1, 1, -3, 2, -8, -3, -1, 5, -30, -3, 7, -3, -3, 2, 1, 2, 15, -7, -4, -8, -1, 4, 7, -7, -4, 7, -6, -11, 0, -3, 4, -3, -2, 1, 4, -7, 3, -98, -67, -27, -32, -17, -17, -15, -7, -18, -15, -6, -12, -1, -4, -9, -14, -15, -6, -8, -15, -1, -19, 1, -2, -2, -12, -1, -9, 1, -11, -7, 4, -8, 1, -19, -4, 10, 6, 0, -3, -5, 2, 2, 9, -5, -1, -129, -8, 17, -1, 6, -2, 1, -11, + 12, 4, 14, 9, 28, 19, 2, -12, -6, -3, 6, -4, -24, -22, -11, -4, 2, 2, 5, -2, 1, 2, -5, -1, 0, -16, 9, 3, -1, -1, -5, -9, 6, 1, -5, 4, 5, 5, 145, 103, 20, 40, 8, 14, 32, 17, 5, 20, 7, -8, -5, 7, 11, -19, -3, -12, 26, 13, 6, 13, 6, 7, 0, -1, -7, 11, 12, 11, 12, 16, 9, 24, 4, -1, 7, 2, -5, -2, -5, -5, -1, 11, 2, 2, 216, 93, 27, 26, 17, 12, 3, 2, 23, 6, 12, 19, + 9, -1, -8, 39, -4, -20, -13, 10, -1, 21, 6, 3, -5, -9, -4, -4, 8, -1, 3, 1, 0, -4, 6, 27, 15, 18, 15, 13, 6, 6, 2, 9, -9, 6, 71, -74, -24, -32, -29, -14, -5, 12, -11, 2, -29, 11, -11, -24, 6, -17, -25, -16, 22, 19, -9, 10, -17, 7, -30, 3, 4, -4, -7, 7, -24, -9, 2, -7, -7, -4, 1, 4, 11, 2, 20, -6, -6, -5, -10, -2, -5, 4, -9, -257, -132, -46, -38, -39, -26, -33, -24, -36, -8, -16, -6, 3, + -17, -3, 1, 2, -25, -14, -12, 4, -33, 5, -16, -27, 1, 1, 1, 1, -11, -6, -1, -1, -1, -9, -1, 4, 8, 5, -12, 8, -12, 9, -20, -11, 2, -9, 0, -2, -152, 79, 35, 11, 22, 3, 6, 17, 21, 10, 14, -11, -4, -17, 20, 3, 4, 25, 2, -19, 32, -22, 3, 25, -7, 6, 4, -2, -13, -4, 8, 6, 2, -6, 1, -11, 30, 1, 0, -13, -5, -9, -7, 15, 16, -5, 2, -2, 5, 0, -1, -5, 4, 229, 98, 25, 54, 30, 14, 22, + 21, -1, 15, 22, 6, -1, 12, 31, -10, -7, -25, 5, 30, 11, 2, -18, -8, -8, 31, 8, 17, 8, -14, -25, 27, 13, -16, -9, 26, 20, -1, 4, -2, 10, 8, -4, 5, -11, -4, 12, -7, -7, 15, 11, 7, 1, 270, 60, 44, 21, 19, 10, 20, 27, 39, 26, -9, 33, -8, 10, 5, 28, 38, 27, -8, 46, -10, -3, -25, 8, -9, 9, 10, -12, -20, -6, 2, -14, -7, 8, 8, -16, -17, -5, 4, 1, 3, -5, -2, -3, -8, 8, -12, 11, -13, -3, + -10, 3, -5, 30, -119, -40, -42, -29, 9, -8, -24, 14, 3, 17, -1, 1, -27, -21, -12, -21, 3, -23, -40, 7, 7, -20, -3, -19, 5, 5, -2, -44, -10, 2, -3, 3, 14, -31, -7, -20, 12, -3, 0, 20, -18, -2, 8, -3, -5, 9, 7, -13, -13, -24, -1, -19, -12, -280, -98, -56, -16, -28, -3, -14, -23, -24, 30, 3, -14, -1, -49, -25, -24, 40, -34, -66, 4, 11, 4, -23, -8, 17, -33, -1, -33, -7, 17, -13, 3, 37, 3, -5, -10, 12, 10, 11, + -11, 1, 10, 18, 8, 8, -30, 8, -2, -12, -6, 6, -5, -12, -11, -186, 42, 4, -24, 35, -23, -15, 7, -30, -21, -5, 12, -23, 33, 2, -3, 17, 14, 26, -4, 36, 48, 37, 10, 32, -12, 21, -24, -22, -11, 4, 13, -11, -23, -10, -2, 15, -23, 17, 3, 13, -7, -18, -28, -29, 6, -14, 6, -31, -11, 16, -23, 5, -16, 11, -7, 11, 0, -5, 125, 208, 59, 54, 74, 61, 11, 49, 42, 24, 90, 22, 15, 40, 36, 20, 15, 10, 14, -11, 45, -12, + 4, -14, 28, 2, -8, 24, 28, 10, 37, -26, -45, -10, -3, 10, -4, 19, -19, 18, 37, 17, -35, -7, 16, 7, -18, 24, 8, 14, 15, 22, 6, -6, 4, -19, -6, 18, 15, 474, 50, -6, 31, -2, 42, -1, 12, 4, 44, 19, -16, 13, 22, 10, -25, -55, -23, -24, 11, -34, -4, -3, 10, 58, 34, 10, 25, -38, -1, -20, -6, -16, 23, -10, 38, -18, -5, -20, -7, -29, -12, 5, 7, -2, 2, -16, 10, 25, 3, -15, 17, -24, 11, 9, -1, -8, -4, -2, + -139, -164, -31, -9, -7, -26, -11, 50, 29, 11, 13, -21, -4, 38, -14, 62, -47, -12, 50, -9, -6, -28, 34, 38, 1, 38, -13, 17, -1, -20, -3, -16, -7, -10, 21, -14, -3, -22, 16, -11, 35, -53, 23, 20, -32, 2, -21, 7, -24, 9, 11, -30, -4, -10, -46, -26, -13, -22, -5, -3, 3, -18, 3, -35, 11, -120, -71, -93, -49, -62, -8, 62, -65, 50, 30, -33, 68, -10, 13, -44, -6, -19, -4, 2, 16, 10, 35, 71, -20, 11, -34, -33, -32, 8, 28, -9, + -11, -8, -22, 25, -8, 0, -22, -15, -15, -20, -2, 1, -19, 13, -29, 12, -17, -1, 10, -19, 25, -43, -14, 6, -14, -22, 11, -5, -27, 45, 24, 8, 8, 10, -338, -40, 28, -26, 57, 25, -68, 8, 13, -23, -56, -22, -13, 15, 5, -54, -19, -29, -50, -44, -99, -53, -58, -72, 57, -39, 22, 41, -30, -49, -18, -11, 12, 31, 19, -41, -49, 38, 25, 30, 44, 5, 1, 16, -1, -20, 12, -11, -6, 25, 66, -23, -32, 14, -20, -3, 34, -65, -1, -22, -3, -2, + 1, -8, 13, 271, 237, 64, 144, 39, 83, -14, -13, 40, 55, 28, -94, -32, 59, 65, -24, -33, 11, 27, 31, 4, -49, -106, -40, 56, -5, 58, -14, -20, 12, -50, -29, -30, 54, -69, -47, 11, 11, -19, -3, -21, 20, 26, 23, 52, 30, -1, -44, 39, -5, 21, -22, 14, 32, -7, -10, -23, -25, 12, 2, 18, -22, 15, 41, -12, 327, 64, -67, 56, 33, -60, -16, 34, 0, 13, -7, -11, -71, -65, 28, 66, 64, -62, -134, 21, -4, -50, -69, -9, 32, -21, 48, 83, + -32, -23, -13, -9, -17, -120, 62, 61, -4, 40, -39, -9, -35, 52, 51, 9, -15, -16, 28, 10, -19, -28, -1, 29, -41, -21, -23, 10, 12, -47, 24, 58, -46, 3, -12, -4, -1, -17, -37, -24, -10, 26, -14, -88, -61, 11, 80, -80, 57, 29, 11, 19, 12, 55, 84, 5, 24, 12, -76, -65, 64, 11, -78, 48, -67, 13, 79, -3, -24, 94, 13, 9, 6, 5, 7, -38, 23, 40, 59, -46, -25, 12, 7, -19, -45, 30, -17, 22, 9, -12, -15, 9, 27, -18, -10, -2, + 15, -41, -21, 24, 4, -12, -353, -326, -72, -151, -131, -76, -22, -57, -67, 45, 14, -16, 79, 28, 94, 71, 22, 28, 35, -142, 69, -11, -29, -27, -83, -26, -27, 81, -25, -48, -22, 13, -9, -16, 20, -21, -12, 50, -46, -4, -13, 90, 38, 36, -66, 6, 63, -31, 17, 2, 17, 2, 8, -3, 42, -3, -10, 30, -17, 18, 37, -14, -20, 13, 16, -218, 464, 297, 91, 32, 28, 36, 49, 49, 95, 201, 7, 26, 39, 44, 47, -34, 188, 140, -132, 97, 13, -18, 42, 119, + -113, -28, 4, -88, -66, -62, 127, -3, -28, 20, 2, -37, -111, 76, 55, -15, 28, 78, -55, 44, -1, -17, 54, 54, 6, 10, 0, 44, 52, 3, -17, 2, -25, 44, 2, -13, -27, -12, 24, 18, 504, -176, -178, 82, 17, -64, -61, -91, -95, -65, -60, 86, 17, 12, -50, -40, -151, 2, -61, -100, 82, 58, 15, 54, 12, -16, -36, -1, -31, 45, 70, -76, -31, 3, 37, 102, 27, 137, -73, 44, 110, 68, -59, -16, 10, -28, 46, -7, -1, 73, 36, 12, 4, -1, -34, 0, + 5, -32, -22, 32, -16, -61, -12, 2, -14, -64, 13, 13, 12, 18, -17, 161, 310, 120, 84, 95, -27, 30, -87, 152, 62, 146, 45, 55, -134, 167, 250, 30, 163, -34, -130, -132, 119, -40, 95, 16, 39, -75, 74, -27, -26, 119, 85, -66, 114, 11, 21, -25, -85, 22, 6, -50, -54, 48, 70, 21, -25, 31, 2, 72, -46, -9, -75, 6, 72, 46, -35, -3, 25, -69, -6, -48, -26, 11, 16, 42, -54, 20, -61, 2, 71, 23, -6, -357, -24, -77, 99, -74, 80, 7, 64, -5, + 55, -176, 49, -16, -69, 37, -83, 54, -84, -37, -180, 106, 209, -78, -31, -19, -38, 38, 39, 67, -160, 53, -101, -22, -9, 87, 28, -34, 14, 23, 55, 65, -101, -26, 11, -65, -67, -5, -48, 26, 52, 15, 7, -6, 49, 146, 75, -77, 15, 40, -45, 57, 10, -45, -8, 72, 4, 69, -82, -8, 43, -658, -254, 140, 43, -80, 89, 83, 119, -25, -60, 114, -1, -68, 142, -161, -221, -97, -122, 80, 103, 2, 22, 176, 70, -170, -85, -103, 26, -157, -147, -4, 15, -58, -74, -94, + -58, -86, -95, -29, 1, -28, -12, -57, -17, -43, -110, 225, 10, 56, -98, 62, -14, 33, -81, 0, -20, -57, -47, -25, 63, 55, 47, 37, 34, -8, -9, -50, -20, 0, -15, 68, -12, 350, 125, 283, 41, 22, -116, 46, 164, 66, 9, 115, -105, -43, 88, -68, 28, 163, 48, 24, 47, -28, 66, -52, -3, 29, 5, -40, -49, 19, 161, -52, 36, -152, -87, 71, 169, -134, -5, 85, 15, 33, -118, -38, -103, -168, -51, -93, -106, 80, 24, 27, -66, -36, -20, -162, -24, 90, -73, 72, + 139, 22, 89, 64, -5, -31, 74, -109, -17, -7, 53, 31, 416, -87, -136, 26, 91, 85, 75, -18, 81, 33, -110, -202, 133, 43, 94, 65, -61, 30, -86, -131, 135, -83, -175, 23, -34, 26, -23, -12, -50, -62, 43, 119, -171, 166, -146, -177, 11, 53, -110, 85, -21, 56, -95, -40, 143, 65, 145, 44, 4, 52, -8, 9, 73, -4, 7, -68, -56, -39, 49, -53, -54, 93, -10, 103, 8, -73, 115, 95, -14, 60, -66, -98, 28, 352, 433, -68, 4, -219, -23, -161, -117, -40, -80, 120, + 1, 92, -201, 166, -126, 169, 7, 134, -48, 169, 57, -85, 37, -125, 82, -71, 194, 54, 128, -215, -121, -55, -107, -49, -74, 3, 262, -125, 131, 218, 31, 94, 1, -54, -104, -83, 10, -61, 133, -91, 60, 158, -23, -18, -14, 128, 142, 40, -68, -63, -37, 51, -133, 20, -26, -41, -1, 80, 5, 114, 109, 18, -343, -295, 127, -34, 159, -88, -85, -107, -100, -37, -273, -91, 95, 148, 51, -179, -60, -83, 71, 273, 142, 71, 2, 26, 6, 52, 130, 16, 28, -74, -2, -108, 35, 60, + 91, 18, -77, -30, 123, -57, 40, 32, 38, 173, -103, -138, 43, 124, 21, 124, 133, 74, 89, 43, 10, 83, 229, -129, -12, 44, 9, -99, -31, 84, -14, -89, 24, 178, -154, 50, -145, 77, 35, -680, -233, -18, -64, -170, 105, 133, 233, 72, 148, -137, -279, 129, -63, 4, -149, 147, -87, -10, 143, -389, 41, 198, -371, -102, -129, 15, 17, 89, -101, 119, 20, -199, -98, 21, -22, -100, 89, 226, 52, 61, -34, -59, 136, 22, -64, -330, -50, 39, -164, 77, 69, 12, -127, -117, -135, 293, + 79, -46, 58, -251, 30, -118, -134, 130, -22, 2, -85, -309, 40, 93, 49, -22, 10, 716, 182, 183, 158, -48, 7, 736, 214, -64, 452, -256, 188, 37, 115, 181, -57, -132, 139, -29, -446, 110, 115, 91, 212, 131, 138, -130, 26, -126, -65, 127, 42, -265, -157, -223, -327, -55, 65, 153, 135, 112, 96, -54, 167, 88, -210, -86, 52, 148, 0, 26, 271, -57, -27, -80, -18, 131, -123, -7, -173, -160, -100, 165, 237, -82, 15, -59, -152, -113, 34, -181, -48, 722, 440, 23, 282, 201, 68, 308, + 97, -10, -91, -82, -199, -569, -34, 45, -184, -118, -14, 382, 135, -111, 11, 18, -49, 155, -21, -111, -62, -106, 68, -150, -337, -2, -173, -288, 61, 110, 180, 88, 160, -115, -290, -204, -261, 94, 255, 195, 138, 238, 11, 145, 343, -291, 55, -137, 5, 87, 105, 154, -11, -352, -261, 47, -73, -108, -64, -85, -233, 11, 155, -23, 116, -74, 169, -356, 37, -270, 117, -524, -22, -167, -283, 503, 271, -165, -449, -101, -168, -375, 294, 27, -273, -88, 149, -241, -177, -120, -305, -102, -11, -229, -224, 322, + -119, -82, -32, -55, 259, -276, -139, 77, -80, 15, -69, 168, -278, 115, -443, 62, -128, -158, 461, 66, -172, 107, 96, -355, 259, -44, -81, -8, 149, -41, 8, -158, 99, 143, 211, -158, -459, 344, -35, 155, 152, -70, 89, -681, -404, 103, -263, 46, -195, -77, -278, -165, 117, 408, 396, 82, 275, -184, 492, 389, -311, -250, 69, 101, 414, 173, 260, -81, 96, -38, -60, -73, 386, 197, 369, 367, 53, -2, -184, 187, -34, -332, -248, -47, -195, -21, -200, -144, 97, -29, -131, 314, 332, -178, -80, 493, + 179, -300, -330, -92, 106, 8, -72, -205, 181, 84, -87, 79, 40, -258, -138, 54, -119, -102, -159, 377, -261, -394, -330, -7, -259, -343, 92, -34, -467, 333, 65, -33, 173, 515, 501, 209, -602, 221, 166, -600, -3, -292, -135, 302, -355, 204, 5, -67, -124, 57, -25, 98, -64, -324, 315, 142, 376, -44, -120, -185, 155, -167, 443, 87, 268, -346, 277, 5, 101, -227, 80, -269, -36, -276, 116, 181, -353, 8, -290, 132, 180, 163, -18, -515, 7, 126, -37, 217, -472, 113, -183, 48, -147, 722, 890, 363, + 315, -516, 497, 706, -773, 87, 513, 82, -922, -99, -497, 157, 192, -240, -84, 164, -419, -40, -159, -216, 92, -330, 357, 243, 460, -229, 83, -55, -174, 563, -1, -268, -113, 117, -112, -155, -164, 283, 119, 396, -16, 141, 540, -342, 83, -235, 433, -172, 211, 76, -2, -167, -283, -211, 101, 369, -338, 309, 397, 179, 464, -229, -153, 273, -24, -72, -369, -49, -283, 31, 428, 141, 99, 150 }, + {-85, 3, -21, 21, -12, -3, 6, 15, -3, 15, 6, 5, -1, -1, 2, 2, -7, -4, -14, 6, -4, -1, 15, 5, 2, 2, 4, 0, -2, 0, -2, -1, -4, -2, -1, -1, 1, 1, 0, 0, 0, -1, 0, 0, 1, 0, 59, 33, 16, 20, 11, 17, 34, 2, 1, -4, -9, 18, 0, -1, 19, -7, -9, 5, 2, 8, 2, 3, 9, -6, 6, -2, -1, -4, 3, 11, 6, 7, 6, -1, 5, 7, -3, 6, -10, 12, -5, 4, 1, 2, -2, -2, 30, -34, -5, -6, + -9, 6, -17, 6, 0, 8, 7, -13, -5, 21, -2, 4, -4, 9, 19, 22, 4, 9, 0, -17, 0, 2, -4, 0, 10, -10, -13, 6, -6, -6, -9, 0, 10, 3, -3, -3, -4, 0, 2, -5, 2, -6, -86, -61, -30, -22, -17, -18, -6, -13, -4, -8, -21, 4, 11, -2, 6, -4, -11, -11, -16, -6, 4, 0, -9, 6, -11, -11, 8, 0, 1, 6, 7, 2, -2, -3, -4, 2, 1, -6, 3, -12, -5, -3, -1, -8, -1, -3, -122, -17, 10, 2, 9, 1, -6, 4, + -5, -6, -11, -10, 5, -4, 8, -8, 0, -8, 3, 12, -3, 9, 1, -9, -1, 11, 6, 7, 9, -12, 8, -5, -1, -7, -3, 3, 5, 2, -3, 9, 8, 4, -2, -6, 1, -5, 143, 114, 27, 51, 12, 40, 28, 9, 28, 11, 21, 9, -8, 21, 15, -6, -2, -40, -4, 2, 24, 3, 1, 12, 1, 11, 10, 2, -1, 4, 16, 13, 10, -1, -5, 1, 7, -3, -1, 9, 2, -4, -1, 2, -9, 11, 252, 93, 45, 27, 16, 16, 15, 26, 6, 42, 6, 4, + 18, -10, 4, -4, -5, -7, 27, 15, -2, 21, -14, -4, -5, 32, -3, 11, 2, 16, 3, -5, 8, 11, -5, 4, 4, 3, 6, -2, 7, 7, -21, 4, 2, 4, 97, -72, -25, -33, -21, -20, 13, -11, -30, -7, -40, -9, -17, -38, -10, 9, -24, -8, 4, -27, -1, 31, 7, 5, -14, 1, 11, 0, -13, -14, 14, -1, -18, 2, -8, 23, -1, 10, -4, 20, -13, 8, 3, 5, 0, 5, -1, -6, 12, -266, -150, -31, -38, -26, -33, -46, -4, 1, -14, 12, -13, 2, + -1, -15, -17, -26, -9, 26, -25, -3, 24, 15, -4, 9, -3, -25, -13, -21, -7, 1, -5, 13, -22, -17, -1, -22, -17, -15, -18, 19, -6, -23, -7, 7, 7, -7, -12, -5, -163, 94, 35, 15, 16, 14, 7, -18, 5, -11, -3, 29, 18, 25, 26, 26, -22, 11, 29, 4, 25, -30, 6, -8, -2, -11, 11, -4, 0, 26, -27, -8, 10, 15, -7, 12, -11, -18, 21, -11, -1, -6, 8, -3, 10, -11, -4, -10, -3, -9, 15, 1, 5, 243, 99, 21, 55, 43, 8, 19, + 52, 24, -1, 11, 7, -8, 15, 45, 11, 54, 26, -44, 8, 1, 9, 40, 22, 16, -4, -6, -5, -7, 6, -9, 13, 4, 18, -4, -5, 6, 15, 8, -2, -20, -8, -11, 17, 12, 20, 11, 3, 3, 17, 13, 11, 2, 271, 78, 34, 42, 7, 41, -7, -16, -1, 10, 4, -1, 8, 42, -6, -26, -18, 20, 5, 23, 37, 33, -2, 22, -24, 2, -19, 25, 14, -29, 16, -14, 2, -11, 17, -11, 21, 17, 13, 27, 9, -1, -7, 0, 3, 30, -1, 1, 2, 14, + 9, 1, -4, 37, -115, -47, -18, -27, -12, -10, 2, 16, -17, -31, 29, -38, -35, -7, -8, 16, -10, -1, -34, -21, -41, -46, -51, -7, 12, -36, -9, 5, 4, 1, -4, -35, -22, 15, 6, -8, 34, -23, -10, 8, 21, 17, -2, -5, 8, 5, -21, 2, -12, -6, 2, -9, 2, -294, -93, -55, -24, -40, -32, -9, -23, -9, -31, -41, -30, -10, -61, -14, -25, -37, -5, 7, 19, -21, -31, -11, 25, 33, 39, 22, -2, -19, -9, 1, -24, 11, 16, 21, -14, -11, -12, -5, + -5, -8, 15, -4, 10, -20, -36, -14, -2, 18, -31, 11, -15, 15, -15, -169, 45, 13, 0, 30, -29, 8, -66, -21, 23, 16, 42, -3, 46, -27, -7, 22, -40, -15, -24, 45, -3, -37, 19, 36, -32, -24, -29, 8, -7, 16, -11, -9, -8, -17, 25, -20, 5, 17, -2, 19, -11, 42, 6, -4, -15, -15, 1, -17, -20, -13, 3, 14, -2, 4, -18, -18, -25, -10, 147, 210, 73, 72, 100, 71, -10, 14, -8, 13, 12, 18, 14, 35, 14, 22, 7, 70, 17, 34, 21, 18, + 56, 13, 70, 36, -14, 49, 13, 24, 49, 9, 29, -16, -5, 13, 22, -31, 25, -18, -33, -20, 27, 40, 30, -7, 9, 8, 14, 20, 11, 23, 14, -25, -2, 16, 22, 5, 6, 503, 40, -28, 43, -29, 59, 15, 62, -32, 8, -2, 38, -66, 14, 39, -7, -11, 55, 81, -32, -21, 12, 39, -16, 25, 3, -29, -20, -23, 20, 23, 31, -23, 34, -23, 33, 26, -5, -20, 13, -32, -40, 8, -27, 10, 5, 3, 20, -2, 24, 0, -27, 10, -5, 12, -19, -6, 5, 13, + -172, -167, -38, 13, -7, -25, -27, -37, -10, 28, -9, -9, -38, 41, -2, -33, -29, 71, -63, 7, 47, -5, 8, -61, 20, -26, 15, -42, -27, 8, 12, -19, -22, 3, -8, 4, -25, -14, 28, -2, -12, -7, 36, 16, -19, -29, -26, 10, -3, -11, 4, 7, -13, 43, 24, -3, -2, -9, 7, -10, -10, -10, -1, -21, -17, -65, -60, -67, -52, -34, -26, 7, -3, -16, -9, 19, 58, -50, 25, -16, -35, 44, -5, 10, 54, 10, 22, -33, -10, -100, -13, 21, 11, 11, 9, 16, + -24, -28, 22, 0, 21, 13, -28, 24, -4, -70, -61, -8, -58, 10, 16, -1, -16, -4, 1, -14, -7, -1, -11, 20, 3, 8, -11, -5, 26, 10, -19, 22, -6, -10, -328, -75, 5, -66, 27, 6, 79, -37, 5, -22, 53, -108, -103, 43, -50, 77, 29, -63, -109, -3, -31, -54, -21, 12, 18, -26, 94, 5, -9, -40, 32, 35, 39, 41, -5, -25, -9, 24, -2, 29, -27, -11, -9, 34, 28, -30, 39, -22, -27, 3, -12, -26, 27, -31, -4, 8, -7, -12, 7, 25, -16, 24, + -20, 16, -11, 302, 264, 56, 70, -14, 86, 70, 87, -3, 34, 21, -82, -69, 37, 8, -59, -62, -35, 4, 34, 10, 82, 76, 32, -17, -19, 50, 46, 4, 40, -13, 52, 3, -12, 73, 37, 60, 38, 13, 41, 21, 14, 39, -22, 7, 51, -1, -34, 30, 29, 21, -24, -1, 29, 45, -24, 54, 61, -11, -35, 5, 13, 9, 26, -1, 364, 32, -12, 28, 16, -58, 14, 18, -2, 41, 54, 85, -39, -36, -61, -46, 52, -2, 76, -17, -20, 34, 66, 29, -70, 56, -21, 45, + -24, 35, -42, 27, -5, 41, 3, 24, 11, -67, -39, -5, -15, -5, -23, 35, 11, 73, -12, -47, -30, -3, 3, -53, 17, -17, -4, -4, -33, 30, 54, -16, 27, 8, -32, -1, -31, 50, 5, -20, -49, 14, -18, 106, -25, -101, -68, -91, 84, -67, 18, 103, -5, -104, 7, -109, 91, -32, 91, 1, -35, 78, 3, 16, -59, -74, -12, 26, 16, -14, -35, 35, -11, 26, 39, 48, 22, 27, -98, 8, -23, -33, 13, 49, -41, -75, -33, 22, 8, -66, -27, 31, 45, -40, -26, -31, + 46, 61, 12, -21, 7, 44, -371, -372, -62, -181, -115, -63, -103, -10, 75, -166, 60, -32, 54, 12, 33, -67, 16, -6, -38, -151, -33, -78, -99, -8, 24, 8, -34, 24, -33, -7, 81, 1, -28, 8, 52, 75, 47, 3, 38, 48, -5, 4, -81, 33, -67, 16, 63, -40, -80, 27, -45, -39, 8, 3, -38, 22, -9, 90, 48, 31, 10, 36, -3, 14, -34, -216, 404, 323, 17, 68, 22, 74, 105, 28, 102, 22, -114, 76, 85, 29, 23, 69, 83, -85, 69, -44, 60, 12, -57, 12, + 68, 43, -90, 43, -39, 126, -15, 31, -24, -79, 77, 82, 34, 22, -8, 30, 82, 21, 57, 8, 38, 24, -11, 47, -61, -88, -44, -67, -62, -29, -63, 78, 50, 6, -19, -29, -14, -3, -5, 2, 540, -208, -121, 25, -7, -22, -157, -59, 33, -2, -27, -24, 18, -119, -41, 70, 116, 71, 49, -34, -43, -67, 78, -113, -27, 34, -84, 31, 27, 100, -151, -7, -9, -25, 32, -130, -77, 153, 91, 25, -32, 94, -32, -7, 10, 74, 33, -38, 2, -20, 50, -86, -48, -50, -65, 116, + 23, 18, -57, 0, -24, -15, -59, 13, -57, 2, 9, 47, -82, -45, -72, 159, 376, 59, 145, 126, 126, 38, 95, 54, -24, -79, -45, -25, 108, -93, -97, -10, -2, -44, -74, 223, 216, 157, 11, -95, 19, 12, -43, 49, 36, 88, 13, 34, -2, -66, 106, 82, 65, -18, -79, 1, -3, -27, -165, 117, -73, 135, 11, 71, -13, 79, 130, 21, -54, -9, 27, -46, 26, -21, -50, -34, 22, -18, 57, 13, -85, 0, -7, -102, -16, 11, 37, -390, -54, -242, 1, 45, -85, -141, -167, -155, + -95, -126, -33, -6, -35, 43, -27, 11, 99, 47, -11, 240, -54, 50, -36, 22, 33, 15, -15, 37, 110, 36, 38, 15, 43, 97, 128, 44, 156, -39, -137, 140, -44, -26, -29, 80, 119, 94, -3, -28, -70, -172, 107, 126, 86, -101, 63, 20, -11, 103, 16, 71, -56, 37, -70, -2, 59, -13, 44, -4, -26, -683, -311, 143, -30, -20, 21, -83, -79, -22, -37, -117, 82, 13, 176, -97, -89, -143, -85, -148, 9, 59, -229, 149, 122, -14, 22, 98, 11, 87, -174, -168, -99, -109, -90, 283, + 88, -58, -103, -139, 65, 42, -71, 60, 52, -96, 6, 27, 76, -89, 227, -96, -83, 40, -28, 3, -72, -21, 4, 151, -48, 215, 42, 19, 21, 61, -66, -18, -85, -61, -65, 4, 107, 348, 177, 111, 74, -122, 11, -99, 152, -17, -23, 52, 32, 35, -7, 54, 17, 56, -50, 150, 17, -15, 449, 23, -38, -118, 63, -110, 97, 241, -24, 57, 55, -128, -146, 1, -3, 104, -75, 0, -14, 75, 75, 131, 44, 43, 49, 1, 82, 37, -173, 30, -93, -217, -27, 54, -8, 12, -38, -2, + -17, -8, 15, -2, 85, -65, -22, 12, 7, -3, -49, 57, 496, -135, -69, -125, 243, 107, 8, 65, -51, -47, 77, 21, -102, 35, -131, -76, -8, -106, 2, 51, -102, -142, 1, 20, 90, 184, 105, -68, -16, 118, 180, -192, 62, -26, -18, -81, -146, 23, 102, 46, 37, 86, -24, 61, -27, 47, 59, -124, -111, 223, -33, 5, -64, 96, 257, 81, 24, 101, -89, -69, -17, -48, -175, 114, -5, -65, 24, 37, -63, -58, 75, -18, -134, 430, 415, -138, 116, 29, 91, 216, -24, -120, -37, 422, + -236, -51, -115, -100, -191, 208, -59, -295, -213, -270, -99, 229, -25, 105, -39, -125, 107, 25, 134, -133, 120, 87, 50, 48, -207, 54, -173, 141, 313, 84, 95, -205, 280, 68, -28, -50, -56, 80, 140, 27, -32, -16, 38, -75, -48, -73, -51, -13, 101, -76, 151, 47, 92, -40, -221, -155, 53, 6, -68, 70, -10, -16, -416, -236, 52, 40, -9, -171, 100, 69, -114, -285, 235, 68, 84, 146, 75, -28, 40, -63, 196, -155, -290, 2, -17, -124, -315, 23, -66, -151, -92, -37, 68, 26, 113, 244, + -98, -174, 60, -6, 3, 111, -134, -105, -15, 129, -144, 140, -40, 253, -30, -53, -24, 22, 51, -245, 43, -208, 242, 25, 154, 113, -84, 14, -112, 86, -5, 75, 53, -129, -15, -119, -59, 95, -38, -543, -284, -72, -86, 5, 36, -174, -165, 75, -189, 75, -207, -35, -201, -192, 203, 117, 10, 9, -211, -295, 134, -394, 127, 29, -158, 45, -107, 54, 265, -123, -40, -290, 221, -50, 87, -87, -62, -3, -38, 169, 24, 326, 338, -15, -21, -97, -13, -24, 30, 140, -13, 288, 47, -74, 14, 79, + -27, 6, -21, 225, -179, -276, -154, 31, 41, 79, 120, 13, 31, -42, -151, -123, -61, 726, 316, 228, 86, -77, -138, -220, 118, 221, 83, -96, 248, 148, 247, 22, -191, -67, 375, -395, -90, 268, -165, -84, 610, -74, 168, 563, -99, -33, -25, 73, -40, 246, 147, 203, -151, -328, 122, -128, 149, -59, 47, 238, 126, 16, 92, 50, 88, 231, 117, -22, 209, 96, 19, 55, 395, 248, -13, 225, -112, 284, -85, 65, -96, 37, 144, -85, -24, -12, 36, 11, -123, 923, 427, -196, 88, 474, 18, 340, + -96, 130, 296, -226, 33, 498, 460, 362, 137, 309, 60, 270, 103, 76, -168, -212, -285, -584, 189, -1, -151, -63, 204, -139, -15, 14, 117, -519, -78, 362, 290, -112, 193, 152, 109, -72, -114, -61, -76, -61, -184, -169, 134, -327, 109, 251, -74, -196, -287, 262, -5, -147, -87, -73, -96, 46, -43, -113, 107, 411, -208, -139, 59, -92, 95, -22, 21, -362, -109, -436, -103, -436, 206, -416, 220, -68, -251, -69, -121, 519, 72, -371, -1, -241, -201, 258, -295, -261, -308, 453, -69, 300, -466, -240, 173, -210, + 164, 500, 317, 310, 43, -51, -252, -341, -29, 78, -329, 9, -199, 93, 129, -363, -321, -569, -101, 40, -258, -353, 335, 18, 344, 350, -57, -50, -156, 201, 160, 24, 71, -30, -34, 170, -61, -201, -168, -249, -222, -74, -26, -642, -95, 41, -44, -13, 183, -154, 164, 128, -86, 179, -257, 322, 244, -4, -236, 4, 177, -750, 164, 283, -514, 200, -258, -403, -340, 161, -77, -566, 305, 139, -321, -573, 123, 46, -164, -61, -275, 247, 232, 369, -302, 29, -404, -179, 81, -288, 120, -57, -198, -338, -329, 469, + -324, -184, -116, -7, 237, 106, 175, -29, 203, -97, 40, -116, -196, 4, 448, 29, 23, -42, -248, 117, -426, -212, -450, 135, -88, 184, -130, 92, 135, -139, -261, 384, -108, -159, 426, -81, -112, 507, -298, 82, 112, 47, -450, 10, -75, -256, 140, -199, 269, -41, 300, -333, 201, -595, -4, -321, 356, -49, 39, -56, -347, -17, 280, 777, 45, 56, 151, 270, -57, -67, 11, -6, 665, -54, 91, 279, -278, -444, -13, -469, -73, -238, -190, -89, -216, 120, 153, -270, 332, 293, -57, -65, -289, 724, 791, 4, + -241, -196, 664, -437, -495, 515, -467, 300, 93, 416, 387, 259, 44, -264, -225, 541, -228, -24, 134, 461, 671, -21, 459, -375, -389, 44, -142, 215, 139, -333, 47, 212, 552, 188, 228, 208, 248, 65, -17, 351, 64, 281, 449, 96, -181, -153, 405, 109, 829, 197, 328, -333, -528, -46, -616, -390, -139, -204, 25, -23, 6, 18, -463, -372, -202, -379, 139, 163, -117, -8, -334, -35, 76, -72 } }; -Word32 sine_table_Q31 [361] = { - 187, - -37478868, -74946000, -112390808, -149800880, -187165824, -224473232, -261712288, -298872128, -335940416, -372906880, - -409759232, -446486784, -483078848, -519523232, -555809856, -591926720, -627863744, -663609024, -699152192, -734482816, - -769589248, -804461760, -839088768, -873460160, -907565952, -941394816, -974937344, -1008182528, -1041120576, -1073741952, - -1106035712, -1137993088, -1169603456, -1200857856, -1231746048, -1262259072, -1292388096, -1322122880, -1351455488, -1380375936, - -1408875904, -1436947072, -1464580224, -1491767680, -1518500224, -1544770688, -1570570112, -1595891328, -1620726528, -1645067904, - -1668908416, -1692240256, -1715056640, -1737350784, -1759115520, -1780344704, -1801031296, -1821169280, -1840752768, -1859775360, - -1878231552, -1896115456, -1913422080, -1930145536, -1946281088, -1961824000, -1976769152, -1991112192, -2004848768, -2017974528, - -2030485760, -2042378368, -2053648768, -2064293760, -2074309888, -2083694208, -2092443776, -2100556032, -2108028288, -2114858496, - -2121044608, -2126584448, -2131476608, -2135719552, -2139311872, -2142252544, -2144540544, -2146175488, -2147156608, -2147483647, - -2147156608, -2146175488, -2144540544, -2142252544, -2139311872, -2135719552, -2131476608, -2126584448, -2121044608, -2114858496, - -2108028288, -2100556032, -2092443776, -2083694208, -2074309888, -2064293760, -2053648768, -2042378368, -2030485632, -2017974528, - -2004848640, -1991112192, -1976769024, -1961824000, -1946281216, -1930145536, -1913421952, -1896115456, -1878231552, -1859775488, - -1840752768, -1821169408, -1801031296, -1780344576, -1759115648, -1737350784, -1715056768, -1692240128, -1668908160, -1645067904, - -1620726400, -1595891456, -1570570112, -1544770432, -1518500224, -1491767552, -1464580352, -1436947072, -1408876032, -1380375808, - -1351455232, -1322123008, -1292387840, -1262259200, -1231746048, -1200857600, -1169603456, -1137992960, -1106035840, -1073741824, - -1041120704, -1008182528, -974937152, -941394880, -907565824, -873460288, -839088704, -804461504, -769589312, -734482624, - -699152256, -663608960, -627863424, -591926720, -555809664, -519523328, -483078688, -446486976, -409759200, -372906624, - -335940480, -298871968, -261712432, -224473168, -187165520, -149800880, -112390616, -74946096, -37478756, 0, - 37478756, 74946096, 112390616, 149800880, 187165520, 224473168, 261712432, 298871968, 335940480, 372906624, - 409759200, 446486976, 483078688, 519523328, 555809664, 591926720, 627863424, 663608960, 699152256, 734482624, - 769589312, 804461504, 839088704, 873460288, 907565824, 941394880, 974937152, 1008182528, 1041120704, 1073741824, - 1106035840, 1137992960, 1169603456, 1200857600, 1231746048, 1262259200, 1292387840, 1322123008, 1351455232, 1380375808, - 1408876032, 1436947072, 1464580352, 1491767552, 1518500224, 1544770432, 1570570112, 1595891456, 1620726400, 1645067904, - 1668908160, 1692240128, 1715056768, 1737350784, 1759115648, 1780344576, 1801031296, 1821169408, 1840752768, 1859775488, - 1878231552, 1896115456, 1913421952, 1930145536, 1946281216, 1961824000, 1976769024, 1991112192, 2004848640, 2017974528, - 2030485632, 2042378368, 2053648768, 2064293760, 2074309888, 2083694208, 2092443776, 2100556032, 2108028288, 2114858496, - 2121044608, 2126584448, 2131476608, 2135719552, 2139311872, 2142252544, 2144540544, 2146175488, 2147156608, 2147483647, - 2147156608, 2146175488, 2144540544, 2142252544, 2139311872, 2135719552, 2131476608, 2126584448, 2121044608, 2114858496, - 2108028288, 2100556032, 2092443776, 2083694208, 2074309888, 2064293760, 2053648768, 2042378368, 2030485760, 2017974528, - 2004848768, 1991112192, 1976769152, 1961824000, 1946281088, 1930145536, 1913422080, 1896115456, 1878231552, 1859775360, - 1840752768, 1821169280, 1801031296, 1780344704, 1759115520, 1737350784, 1715056640, 1692240256, 1668908416, 1645067904, - 1620726528, 1595891328, 1570570112, 1544770688, 1518500224, 1491767680, 1464580224, 1436947072, 1408875904, 1380375936, - 1351455488, 1322122880, 1292388096, 1262259072, 1231746048, 1200857856, 1169603456, 1137993088, 1106035712, 1073741952, - 1041120576, 1008182528, 974937344, 941394816, 907565952, 873460160, 839088768, 804461760, 769589248, 734482816, - 699152192, 663609024, 627863744, 591926720, 555809856, 519523232, 483078848, 446486784, 409759232, 372906880, - 335940416, 298872128, 261712288, 224473232, 187165824, 149800880, 112390808, 74946000, 37478868, -187, + + +/********************** default HRIR reverb rom tables **********************/ + +/* Sample Rate = 48000 */ + +const Word16 defaultHRIR_Q_48kHz_fx = 15; +const Word16 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC] = + {32673, 31044, 26189, 18849, 10979, 4533, 260, 0, 0, + 0, 277, 1232, 1458, 1381, 1372, 1306, 963, 521, + 338, 461, 656, 803, 960, 1098, 1095, 971, 893, + 902, 842, 641, 458, 449, 542, 553, 434, 278, + 160, 83, 33, 6, 0, 0, 0, 26, 130, + 232, 315, 382, 416, 386, 301, 202, 116, 42, + 0, 0, 0, 0, 0, 29, 70, 102, 118, + 125, 123, 104, 69, 27, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 33, 60, 79, + 82, 70, 50, 30, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 28, 43, + 51, 51, 44, 32, 17, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 20, 31, 42, 53, 63, + 72, 80, 88, 97, 104, 110, 117, 124, 128, + 130, 131, 129, 124, 115, 104, 91, 77, 59, + 41, 23, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 116, 0, 0, + 0, 182, 0, 0, 0, 286, 0, 0, 33, + 380, 76, 0, 0, 393, 183, 0, 0, 286, + 193, 0, 0, 174, 130, 0, 0, 112, 67, + 0, 0, 70, 8, 0 }; + +const Word16 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] = + {32146, 31895, 31407, 31150, 31229, 31321, 31151, 30886, 30927, + 31392, 31948, 32181, 32023, 31727, 31513, 31371, 31210, 31057, + 30979, 30924, 30756, 30473, 30243, 30186, 30217, 30177, 30053, + 29963, 29952, 29940, 29872, 29822, 29880, 30009, 30090, 30076, + 30033, 30029, 30045, 30024, 29950, 29863, 29801, 29758, 29698, + 29605, 29507, 29439, 29395, 29331, 29225, 29110, 29028, 28972, + 28890, 28768, 28653, 28589, 28556, 28506, 28436, 28394, 28410, + 28452, 28475, 28481, 28521, 28622, 28750, 28864, 28976, 29134, + 29356, 29599, 29815, 30014, 30238, 30487, 30707, 30857, 30956, + 31056, 31161, 31218, 31192, 31110, 31026, 30940, 30804, 30597, + 30363, 30153, 29955, 29717, 29423, 29122, 28858, 28610, 28330, + 28017, 27725, 27493, 27305, 27123, 26957, 26858, 26855, 26919, + 27000, 27096, 27242, 27449, 27670, 27853, 28004, 28170, 28363, + 28537, 28651, 28726, 28810, 28906, 28965, 28953, 28898, 28846, + 28798, 28711, 28564, 28392, 28245, 28123, 27983, 27805, 27627, + 27493, 27389, 27263, 27098, 26938, 26818, 26717, 26585, 26419, + 26269, 26166, 26087, 25994, 25894, 25830, 25827, 25857, 25879, + 25896, 25946, 26047, 26164, 26248, 26303, 26377, 26485, 26580, + 26618, 26624, 26652, 26707, 26738, 26717, 26681, 26678, 26699, + 26698, 26663, 26626, 26626, 26655, 26675, 26665, 26653, 26684, + 26752, 26803, 26810, 26822, 26896, 27003, 27067, 27083, 27136, + 27264, 27390, 27443, 27479, 27592, 27757, 27861, 27892, 27951, + 28066, 28098, 27925, 27605, 27242, 26763, 25986, 24898, 23698, + 22506, 21172, 19519, 17670, 15953, 14460, 12834, 10626, 7810, + 4891, 2515, 1017, 301, 57, 5, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 }; + +const Word16 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] = + {32146, 31895, 31408, 31150, 31229, 31321, 31151, 30886, 30927, + 31392, 31948, 32181, 32023, 31727, 31513, 31371, 31210, 31057, + 30979, 30923, 30756, 30473, 30243, 30186, 30217, 30177, 30053, + 29963, 29952, 29940, 29872, 29822, 29880, 30009, 30090, 30076, + 30033, 30029, 30046, 30024, 29950, 29863, 29801, 29758, 29698, + 29605, 29507, 29439, 29395, 29331, 29225, 29110, 29028, 28972, + 28890, 28768, 28653, 28588, 28556, 28506, 28436, 28394, 28409, + 28452, 28475, 28481, 28521, 28622, 28750, 28864, 28976, 29134, + 29356, 29599, 29815, 30014, 30238, 30487, 30707, 30856, 30956, + 31056, 31161, 31218, 31192, 31110, 31026, 30940, 30804, 30597, + 30363, 30153, 29955, 29717, 29423, 29122, 28858, 28610, 28330, + 28017, 27725, 27493, 27304, 27123, 26957, 26858, 26855, 26919, + 27000, 27096, 27242, 27449, 27670, 27853, 28004, 28170, 28363, + 28537, 28651, 28726, 28810, 28906, 28965, 28953, 28898, 28846, + 28798, 28711, 28564, 28392, 28245, 28123, 27983, 27805, 27627, + 27493, 27389, 27263, 27098, 26938, 26818, 26717, 26585, 26419, + 26269, 26166, 26087, 25994, 25894, 25830, 25827, 25857, 25879, + 25896, 25946, 26047, 26164, 26248, 26303, 26377, 26485, 26580, + 26618, 26624, 26652, 26707, 26738, 26717, 26681, 26678, 26699, + 26698, 26663, 26626, 26626, 26655, 26675, 26665, 26653, 26684, + 26752, 26803, 26810, 26822, 26896, 27003, 27067, 27083, 27136, + 27264, 27390, 27443, 27479, 27592, 27757, 27861, 27892, 27951, + 28066, 28098, 27925, 27605, 27242, 26764, 25986, 24898, 23699, + 22506, 21172, 19519, 17670, 15953, 14460, 12834, 10626, 7810, + 4891, 2515, 1017, 301, 57, 5, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 }; + + +/* Sample Rate = 32000 */ + +const Word16 defaultHRIR_Q_32kHz_fx = 14; +const Word16 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC] = + {16266, 15905, 14816, 13022, 10661, 8014, 5425, 3172, 1391, + 99, 0, 0, 0, 0, 0, 100, 467, 657, + 700, 673, 648, 644, 628, 556, 422, 266, 148, + 109, 141, 208, 272, 323, 369, 421, 470, 496, + 483, 443, 402, 382, 383, 381, 351, 288, 214, + 161, 150, 175, 207, 219, 199, 154, 102, 57, + 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 24, 60, 90, 116, 140, 158, + 166, 159, 137, 107, 73, 42, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 13, 21, 26, 28, 29, 28, 23, 14, + 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 13, 18, 20, 19, 14, 8, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 10, 15, 18, + 20, 20, 18, 14, 10, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 4, 6, 8, 10, + 12, 13, 15, 17, 20, 22, 25, 28, 30, + 33, 36, 38, 40, 41, 43, 44, 46, 47, + 48, 50, 52, 55, 59, 63, 68, 74, 79, + 86, 93, 101, 108, 115, 122, 129, 137, 144, + 151, 158, 164, 170, 175, 181, 186, 190, 194, + 196, 198, 200, 202, 202 }; + +const Word16 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] = + {16884, 16824, 16678, 16520, 16427, 16428, 16497, 16569, 16583, + 16524, 16430, 16371, 16402, 16535, 16726, 16903, 17005, 17010, + 16939, 16841, 16757, 16701, 16661, 16619, 16564, 16504, 16456, + 16425, 16399, 16357, 16282, 16176, 16067, 15985, 15948, 15947, + 15953, 15941, 15902, 15850, 15805, 15781, 15773, 15766, 15745, + 15712, 15684, 15678, 15700, 15741, 15781, 15801, 15797, 15779, + 15762, 15753, 15753, 15753, 15742, 15717, 15681, 15642, 15607, + 15579, 15555, 15529, 15496, 15454, 15406, 15359, 15318, 15284, + 15252, 15215, 15168, 15112, 15053, 15000, 14955, 14916, 14875, + 14824, 14763, 14699, 14643, 14598, 14564, 14533, 14498, 14456, + 14411, 14374, 14350, 14339, 14333, 14325, 14310, 14291, 14277, + 14274, 14286, 14308, 14332, 14353, 14371, 14393, 14426, 14475, + 14536, 14602, 14665, 14719, 14770, 14824, 14885, 14952, 15017, + 15071, 15107, 15129, 15144, 15160, 15179, 15196, 15202, 15190, + 15159, 15115, 15069, 15025, 14981, 14929, 14863, 14780, 14688, + 14596, 14510, 14431, 14351, 14263, 14161, 14051, 13940, 13836, + 13742, 13651, 13557, 13454, 13343, 13233, 13131, 13043, 12967, + 12897, 12827, 12758, 12694, 12645, 12617, 12608, 12613, 12623, + 12634, 12648, 12669, 12703, 12750, 12804, 12856, 12899, 12932, + 12961, 12993, 13033, 13076, 13115, 13142, 13156, 13162, 13166, + 13176, 13188, 13198, 13196, 13179, 13150, 13115, 13081, 13049, + 13015, 12975, 12923, 12863, 12800, 12743, 12695, 12655, 12614, + 12567, 12511, 12451, 12395, 12347, 12307, 12270, 12226, 12173, + 12113, 12052, 11998, 11953, 11911, 11866, 11812, 11749, 11684, + 11625, 11576, 11534, 11494, 11449, 11398, 11347, 11303, 11270, + 11249, 11234, 11218, 11198, 11175, 11156, 11146, 11145, 11149, + 11153, 11149, 11139, 11126, 11115, 11110, 11109, 11107, 11097, + 11079, 11056, 11034, 11018, 11009, 11001, 10989, 10972, 10952, + 10935, 10926, 10926, 10930, 10932 }; + +const Word16 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] = + {16884, 16824, 16678, 16520, 16427, 16428, 16497, 16569, 16583, + 16524, 16430, 16371, 16402, 16534, 16726, 16903, 17005, 17010, + 16939, 16841, 16757, 16701, 16661, 16619, 16564, 16504, 16456, + 16425, 16400, 16357, 16282, 16176, 16067, 15985, 15948, 15947, + 15953, 15941, 15902, 15850, 15805, 15781, 15773, 15765, 15745, + 15712, 15684, 15678, 15700, 15741, 15781, 15801, 15797, 15779, + 15761, 15753, 15753, 15753, 15742, 15717, 15681, 15642, 15607, + 15579, 15555, 15529, 15496, 15454, 15406, 15359, 15318, 15284, + 15252, 15215, 15168, 15112, 15053, 15000, 14955, 14916, 14875, + 14824, 14763, 14699, 14643, 14598, 14564, 14533, 14498, 14455, + 14411, 14374, 14350, 14339, 14333, 14325, 14310, 14291, 14277, + 14274, 14286, 14308, 14332, 14353, 14371, 14393, 14426, 14475, + 14536, 14602, 14665, 14719, 14770, 14824, 14885, 14952, 15017, + 15071, 15107, 15129, 15144, 15160, 15179, 15196, 15202, 15190, + 15158, 15115, 15069, 15025, 14981, 14929, 14863, 14781, 14688, + 14596, 14510, 14431, 14351, 14263, 14161, 14051, 13940, 13836, + 13742, 13651, 13557, 13454, 13343, 13233, 13131, 13043, 12967, + 12897, 12827, 12758, 12694, 12645, 12617, 12608, 12613, 12623, + 12634, 12647, 12669, 12703, 12750, 12804, 12856, 12899, 12932, + 12961, 12993, 13033, 13076, 13115, 13142, 13156, 13162, 13166, + 13176, 13188, 13198, 13196, 13179, 13150, 13115, 13081, 13049, + 13015, 12975, 12923, 12863, 12800, 12743, 12695, 12655, 12614, + 12567, 12511, 12451, 12395, 12347, 12307, 12270, 12226, 12173, + 12113, 12052, 11998, 11953, 11911, 11866, 11812, 11749, 11684, + 11625, 11576, 11534, 11494, 11449, 11398, 11347, 11303, 11270, + 11249, 11234, 11218, 11198, 11175, 11156, 11146, 11145, 11149, + 11153, 11149, 11139, 11126, 11115, 11110, 11109, 11107, 11097, + 11079, 11056, 11034, 11019, 11009, 11001, 10989, 10972, 10952, + 10935, 10926, 10926, 10930, 10932 }; + + +/* Sample Rate = 16000 */ + +const Word16 defaultHRIR_Q_16kHz_fx = 14; +const Word16 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = + {16106, 15742, 14643, 12838, 10469, 7821, 5241, 3004, 1244, + 0, 0, 0, 0, 0, 0, 63, 414, 588, + 619, 590, 570, 575, 568, 505, 379, 230, 119, + 83, 114, 173, 228, 267, 302, 342, 380, 396, + 378, 338, 300, 285, 289, 287, 256, 193, 120, + 70, 61, 84, 112, 118, 91, 43, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 28, 49, 64, + 68, 56, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 70, 104, 136, 166, 192, 216, 236, + 251, 262, 265 }; + +const Word16 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = + {18333, 18272, 18124, 17972, 17896, 17931, 18041, 18150, 18186, + 18129, 18021, 17939, 17951, 18074, 18267, 18453, 18563, 18568, + 18489, 18374, 18266, 18182, 18112, 18038, 17951, 17860, 17780, + 17720, 17666, 17597, 17494, 17364, 17234, 17134, 17081, 17063, + 17049, 17011, 16940, 16847, 16758, 16687, 16632, 16579, 16516, + 16446, 16384, 16347, 16341, 16351, 16355, 16338, 16294, 16235, + 16174, 16122, 16075, 16023, 15957, 15873, 15776, 15674, 15574, + 15478, 15380, 15276, 15161, 15035, 14902, 14770, 14644, 14524, + 14404, 14278, 14142, 13997, 13850, 13709, 13577, 13448, 13315, + 13172, 13018, 12861, 12708, 12565, 12428, 12291, 12146, 11993, + 11838, 11688, 11549, 11421, 11295, 11167, 11032, 10894, 10759, + 10633, 10515, 10400, 10279, 10145, 9997, 9839, 9674, 9502, + 9319, 9116, 8887, 8629, 8345, 8043, 7726, 7397, 7054, + 6698, 6333, 5966, 5608, 5270, 4961, 4686, 4449, 4254, + 4107, 4016, 3984 }; + +const Word16 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = + {18333, 18272, 18124, 17972, 17897, 17931, 18041, 18150, 18186, + 18130, 18021, 17939, 17951, 18074, 18267, 18453, 18563, 18568, + 18489, 18374, 18266, 18182, 18112, 18038, 17951, 17860, 17780, + 17720, 17666, 17597, 17494, 17364, 17234, 17134, 17081, 17063, + 17049, 17011, 16940, 16847, 16758, 16687, 16632, 16579, 16516, + 16446, 16384, 16347, 16341, 16351, 16355, 16338, 16294, 16235, + 16174, 16122, 16075, 16023, 15957, 15873, 15776, 15674, 15574, + 15478, 15380, 15276, 15161, 15035, 14902, 14770, 14644, 14524, + 14404, 14278, 14142, 13997, 13850, 13709, 13577, 13448, 13315, + 13172, 13018, 12861, 12708, 12565, 12428, 12291, 12146, 11993, + 11838, 11688, 11549, 11421, 11295, 11167, 11032, 10894, 10759, + 10633, 10515, 10400, 10279, 10145, 9997, 9839, 9674, 9502, + 9319, 9116, 8887, 8629, 8345, 8043, 7726, 7396, 7054, + 6698, 6333, 5966, 5608, 5270, 4961, 4686, 4449, 4254, + 4107, 4016, 3984 }; + + + + + + + +const Word32 sine_table_Q31 [361] = { + 187, + -37478868, -74946000, -112390808, -149800880, -187165824, -224473232, -261712288, -298872128, -335940416, -372906880, + -409759232, -446486784, -483078848, -519523232, -555809856, -591926720, -627863744, -663609024, -699152192, -734482816, + -769589248, -804461760, -839088768, -873460160, -907565952, -941394816, -974937344, -1008182528, -1041120576, -1073741952, + -1106035712, -1137993088, -1169603456, -1200857856, -1231746048, -1262259072, -1292388096, -1322122880, -1351455488, -1380375936, + -1408875904, -1436947072, -1464580224, -1491767680, -1518500224, -1544770688, -1570570112, -1595891328, -1620726528, -1645067904, + -1668908416, -1692240256, -1715056640, -1737350784, -1759115520, -1780344704, -1801031296, -1821169280, -1840752768, -1859775360, + -1878231552, -1896115456, -1913422080, -1930145536, -1946281088, -1961824000, -1976769152, -1991112192, -2004848768, -2017974528, + -2030485760, -2042378368, -2053648768, -2064293760, -2074309888, -2083694208, -2092443776, -2100556032, -2108028288, -2114858496, + -2121044608, -2126584448, -2131476608, -2135719552, -2139311872, -2142252544, -2144540544, -2146175488, -2147156608, -2147483647, + -2147156608, -2146175488, -2144540544, -2142252544, -2139311872, -2135719552, -2131476608, -2126584448, -2121044608, -2114858496, + -2108028288, -2100556032, -2092443776, -2083694208, -2074309888, -2064293760, -2053648768, -2042378368, -2030485632, -2017974528, + -2004848640, -1991112192, -1976769024, -1961824000, -1946281216, -1930145536, -1913421952, -1896115456, -1878231552, -1859775488, + -1840752768, -1821169408, -1801031296, -1780344576, -1759115648, -1737350784, -1715056768, -1692240128, -1668908160, -1645067904, + -1620726400, -1595891456, -1570570112, -1544770432, -1518500224, -1491767552, -1464580352, -1436947072, -1408876032, -1380375808, + -1351455232, -1322123008, -1292387840, -1262259200, -1231746048, -1200857600, -1169603456, -1137992960, -1106035840, -1073741824, + -1041120704, -1008182528, -974937152, -941394880, -907565824, -873460288, -839088704, -804461504, -769589312, -734482624, + -699152256, -663608960, -627863424, -591926720, -555809664, -519523328, -483078688, -446486976, -409759200, -372906624, + -335940480, -298871968, -261712432, -224473168, -187165520, -149800880, -112390616, -74946096, -37478756, 0, + 37478756, 74946096, 112390616, 149800880, 187165520, 224473168, 261712432, 298871968, 335940480, 372906624, + 409759200, 446486976, 483078688, 519523328, 555809664, 591926720, 627863424, 663608960, 699152256, 734482624, + 769589312, 804461504, 839088704, 873460288, 907565824, 941394880, 974937152, 1008182528, 1041120704, 1073741824, + 1106035840, 1137992960, 1169603456, 1200857600, 1231746048, 1262259200, 1292387840, 1322123008, 1351455232, 1380375808, + 1408876032, 1436947072, 1464580352, 1491767552, 1518500224, 1544770432, 1570570112, 1595891456, 1620726400, 1645067904, + 1668908160, 1692240128, 1715056768, 1737350784, 1759115648, 1780344576, 1801031296, 1821169408, 1840752768, 1859775488, + 1878231552, 1896115456, 1913421952, 1930145536, 1946281216, 1961824000, 1976769024, 1991112192, 2004848640, 2017974528, + 2030485632, 2042378368, 2053648768, 2064293760, 2074309888, 2083694208, 2092443776, 2100556032, 2108028288, 2114858496, + 2121044608, 2126584448, 2131476608, 2135719552, 2139311872, 2142252544, 2144540544, 2146175488, 2147156608, 2147483647, + 2147156608, 2146175488, 2144540544, 2142252544, 2139311872, 2135719552, 2131476608, 2126584448, 2121044608, 2114858496, + 2108028288, 2100556032, 2092443776, 2083694208, 2074309888, 2064293760, 2053648768, 2042378368, 2030485760, 2017974528, + 2004848768, 1991112192, 1976769152, 1961824000, 1946281088, 1930145536, 1913422080, 1896115456, 1878231552, 1859775360, + 1840752768, 1821169280, 1801031296, 1780344704, 1759115520, 1737350784, 1715056640, 1692240256, 1668908416, 1645067904, + 1620726528, 1595891328, 1570570112, 1544770688, 1518500224, 1491767680, 1464580224, 1436947072, 1408875904, 1380375936, + 1351455488, 1322122880, 1292388096, 1262259072, 1231746048, 1200857856, 1169603456, 1137993088, 1106035712, 1073741952, + 1041120576, 1008182528, 974937344, 941394816, 907565952, 873460160, 839088768, 804461760, 769589248, 734482816, + 699152192, 663609024, 627863744, 591926720, 555809856, 519523232, 483078848, 446486784, 409759232, 372906880, + 335940416, 298872128, 261712288, 224473232, 187165824, 149800880, 112390808, 74946000, 37478868, -187, }; -Word32 cosine_table_Q31 [181] = { - 2147483647, - 2147156608, 2146175488, 2144540544, 2142252544, 2139311872, 2135719552, 2131476608, 2126584448, 2121044608, 2114858496, - 2108028288, 2100556032, 2092443776, 2083694208, 2074309888, 2064293760, 2053648896, 2042378368, 2030485632, 2017974528, - 2004848640, 1991112192, 1976769152, 1961823872, 1946281088, 1930145536, 1913421952, 1896115456, 1878231552, 1859775360, - 1840752768, 1821169408, 1801031296, 1780344704, 1759115648, 1737350784, 1715056768, 1692240256, 1668908160, 1645067904, - 1620726528, 1595891328, 1570570112, 1544770432, 1518500224, 1491767552, 1464580352, 1436946944, 1408876032, 1380375936, - 1351455360, 1322123008, 1292387968, 1262259328, 1231746048, 1200857600, 1169603456, 1137992960, 1106035840, 1073741760, - 1041120640, 1008182592, 974937216, 941394880, 907565760, 873460224, 839088832, 804461632, 769589376, 734482688, - 699152256, 663608896, 627863616, 591926784, 555809728, 519523328, 483078688, 446486880, 409759328, 372906720, - 335940512, 298871968, 261712384, 224473072, 187165664, 149800960, 112390648, 74946096, 37478708, -93, - -37478640, -74946024, -112390576, -149800896, -187165584, -224473264, -261712304, -298871904, -335940416, -372906656, - -409759264, -446486816, -483078592, -519523264, -555809664, -591926720, -627863552, -663608832, -699152192, -734482624, - -769589312, -804461568, -839088768, -873460160, -907565952, -941394816, -974936960, -1008182528, -1041120576, -1073741952, - -1106035712, -1137993088, -1169603456, -1200857472, -1231746048, -1262259072, -1292388096, -1322122880, -1351455104, -1380375936, - -1408875904, -1436947200, -1464580224, -1491767296, -1518500224, -1544770304, -1570570240, -1595891328, -1620726656, -1645067904, - -1668908032, -1692240256, -1715056640, -1737350912, -1759115648, -1780344448, -1801031296, -1821169280, -1840752768, -1859775360, - -1878231680, -1896115456, -1913421824, -1930145536, -1946281088, -1961824000, -1976769152, -1991112064, -2004848768, -2017974528, - -2030485760, -2042378240, -2053648768, -2064293760, -2074309888, -2083694208, -2092443776, -2100556032, -2108028288, -2114858496, - -2121044608, -2126584448, -2131476608, -2135719552, -2139311744, -2142252544, -2144540544, -2146175488, -2147156608, -2147483647, + +const Word32 cosine_table_Q31[181] = { + 2147483647, + 2147156608, 2146175488, 2144540544, 2142252544, 2139311872, 2135719552, 2131476608, 2126584448, 2121044608, 2114858496, + 2108028288, 2100556032, 2092443776, 2083694208, 2074309888, 2064293760, 2053648896, 2042378368, 2030485632, 2017974528, + 2004848640, 1991112192, 1976769152, 1961823872, 1946281088, 1930145536, 1913421952, 1896115456, 1878231552, 1859775360, + 1840752768, 1821169408, 1801031296, 1780344704, 1759115648, 1737350784, 1715056768, 1692240256, 1668908160, 1645067904, + 1620726528, 1595891328, 1570570112, 1544770432, 1518500224, 1491767552, 1464580352, 1436946944, 1408876032, 1380375936, + 1351455360, 1322123008, 1292387968, 1262259328, 1231746048, 1200857600, 1169603456, 1137992960, 1106035840, 1073741760, + 1041120640, 1008182592, 974937216, 941394880, 907565760, 873460224, 839088832, 804461632, 769589376, 734482688, + 699152256, 663608896, 627863616, 591926784, 555809728, 519523328, 483078688, 446486880, 409759328, 372906720, + 335940512, 298871968, 261712384, 224473072, 187165664, 149800960, 112390648, 74946096, 37478708, -93, + -37478640, -74946024, -112390576, -149800896, -187165584, -224473264, -261712304, -298871904, -335940416, -372906656, + -409759264, -446486816, -483078592, -519523264, -555809664, -591926720, -627863552, -663608832, -699152192, -734482624, + -769589312, -804461568, -839088768, -873460160, -907565952, -941394816, -974936960, -1008182528, -1041120576, -1073741952, + -1106035712, -1137993088, -1169603456, -1200857472, -1231746048, -1262259072, -1292388096, -1322122880, -1351455104, -1380375936, + -1408875904, -1436947200, -1464580224, -1491767296, -1518500224, -1544770304, -1570570240, -1595891328, -1620726656, -1645067904, + -1668908032, -1692240256, -1715056640, -1737350912, -1759115648, -1780344448, -1801031296, -1821169280, -1840752768, -1859775360, + -1878231680, -1896115456, -1913421824, -1930145536, -1946281088, -1961824000, -1976769152, -1991112064, -2004848768, -2017974528, + -2030485760, -2042378240, -2053648768, -2064293760, -2074309888, -2083694208, -2092443776, -2100556032, -2108028288, -2114858496, + -2121044608, -2126584448, -2131476608, -2135719552, -2139311744, -2142252544, -2144540544, -2146175488, -2147156608, -2147483647, }; + #undef WMC_TOOL_SKIP + +/* clang-format on */ diff --git a/lib_rend/ivas_rom_rend.h b/lib_rend/ivas_rom_rend.h index e7d6c6293d71ef04fe62e4a2a84613ff5065030f..d52ade0dbc47dfa5e220319520e4e75035ce65a7 100644 --- a/lib_rend/ivas_rom_rend.h +++ b/lib_rend/ivas_rom_rend.h @@ -51,10 +51,10 @@ extern const Word16 diffuse_response_CICP16_fx[9]; /*Q-15*/ extern const Word16 ap_pre_delay[DIRAC_DECORR_NUM_SPLIT_BANDS]; extern const Word16 ap_filter_length[DIRAC_DECORR_NUM_SPLIT_BANDS]; extern const Word16 ap_lattice_delta_phi_fx[DIRAC_MAX_NUM_DECORR_FILTERS * DIRAC_MAX_DECORR_FILTER_LEN]; /*Q-14*/ -extern const Word16 ap_lattice_coeffs_1_fx[DIRAC_DECORR_FILTER_LEN_1 * DIRAC_MAX_NUM_DECORR_FILTERS]; /*Q-15*/ -extern const Word16 ap_lattice_coeffs_2_fx[DIRAC_DECORR_FILTER_LEN_2 * DIRAC_MAX_NUM_DECORR_FILTERS]; /*Q-15*/ -extern const Word16 ap_lattice_coeffs_3_fx[DIRAC_DECORR_FILTER_LEN_3 * DIRAC_MAX_NUM_DECORR_FILTERS]; /*Q-15*/ -extern const Word16 *const ap_lattice_coeffs_fx[DIRAC_DECORR_NUM_SPLIT_BANDS]; +extern const Word32 ap_lattice_coeffs_1_fx[DIRAC_DECORR_FILTER_LEN_1 * DIRAC_MAX_NUM_DECORR_FILTERS]; /*Q-15*/ +extern const Word32 ap_lattice_coeffs_2_fx[DIRAC_DECORR_FILTER_LEN_2 * DIRAC_MAX_NUM_DECORR_FILTERS]; /*Q-15*/ +extern const Word32 ap_lattice_coeffs_3_fx[DIRAC_DECORR_FILTER_LEN_3 * DIRAC_MAX_NUM_DECORR_FILTERS]; /*Q-15*/ +extern const Word32 *const ap_lattice_coeffs_fx[DIRAC_DECORR_NUM_SPLIT_BANDS]; extern const Word16 ap_split_frequencies_fx[DIRAC_DECORR_NUM_SPLIT_BANDS + 1]; /*Q-14*/ extern const Word16 sba_map_tc[11]; /*Q-0*/ @@ -84,7 +84,6 @@ extern const Word32 diffuseFieldCoherenceDifferenceX_fx[BINAURAL_COHERENCE_DIFFE extern const Word32 diffuseFieldCoherenceDifferenceY_fx[BINAURAL_COHERENCE_DIFFERENCE_BINS]; /*Q-31*/ extern const Word32 diffuseFieldCoherenceDifferenceZ_fx[BINAURAL_COHERENCE_DIFFERENCE_BINS]; /*Q-31*/ - /*----------------------------------------------------------------------------------* * TD ISM Object renderer *----------------------------------------------------------------------------------*/ @@ -93,44 +92,39 @@ extern const Word16 HRTF_MODEL_N_CPTS_VAR[HRTF_MODEL_N_SECTIONS]; extern const Word32 SincTable_fx[321]; -extern const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ -extern const Word32 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -extern const Word32 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ - -extern const Word32 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ -extern const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -extern const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ - -extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ -extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -extern const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ /*----------------------------------------------------------------------------------* * t-design and SN3D normalization table *----------------------------------------------------------------------------------*/ + /* SN3D norm (Fixed) */ extern const Word32 norm_sn3d_hoa3_int[16]; /*Q-29*/ /* Order 11 t-design (Fixed) */ extern const Word32 t_design_11_azimuth_int[70]; /*Q-22*/ extern const Word32 t_design_11_elevation_int[70]; /*Q-22*/ + /*----------------------------------------------------------------------* * Reverberator ROM tables *-----------------------------------------------------------------------*/ -extern const Word32 ivas_reverb_default_fc_fx[]; /*Q-16*/ -extern const Word32 ivas_reverb_default_RT60_fx[]; /*Q-26*/ -extern const Word32 ivas_reverb_default_DSR_fx[]; /*Q-30*/ +extern const Word32 ivas_reverb_default_small_fc_fx[]; /*Q-16*/ +extern const Word32 ivas_reverb_default_small_RT60_fx[]; /*Q-26*/ +extern const Word32 ivas_reverb_default_small_DSR_fx[]; /*Q-30*/ -extern const float ivas_reverb_default_fc[]; -extern const float ivas_reverb_default_RT60[]; -extern const float ivas_reverb_default_DSR[]; +extern const Word32 ivas_reverb_default_medium_fc_fx[]; /*Q-16*/ +extern const Word32 ivas_reverb_default_medium_RT60_fx[]; /*Q-26*/ +extern const Word32 ivas_reverb_default_medium_DSR_fx[]; /*Q-30*/ -extern const Word32 release_cnst_table[4][201]; // Q31 +extern const Word32 ivas_reverb_default_large_fc_fx[]; /*Q-16*/ +extern const Word32 ivas_reverb_default_large_RT60_fx[]; /*Q-26*/ +extern const Word32 ivas_reverb_default_large_DSR_fx[]; /*Q-30*/ /*----------------------------------------------------------------------------------* - * Renderer SBA & MC enc/dec matrices + * EFAP ROM tables *----------------------------------------------------------------------------------*/ +extern const Word8 efap_poly_limit[MAX_OUTPUT_CHANNELS]; + /*----------------------------------------------------------------------------------* * LS Configuration Converter ROM tables *----------------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_rom_rend_fx.c b/lib_rend/ivas_rom_rend_fx.c index 2b46ff61137ad446f716adabec5072a7f9a9234e..dca4600eeedf3d1331dbe0bda60bbfad41b21652 100644 --- a/lib_rend/ivas_rom_rend_fx.c +++ b/lib_rend/ivas_rom_rend_fx.c @@ -76,15 +76,14 @@ const Word16 ap_lattice_delta_phi_fx[DIRAC_MAX_NUM_DECORR_FILTERS*DIRAC_MAX_DECO 29799 , 15800 , 24520 , 10977 , 25165 , 30177 , 16042 , 10060 , 30789 , 8397 , 19121 , 1339 , 29056 , 25160 , 12415 , 3611 , 25203 , 20991 , 4951 , 14580 , 13083 , 24188 , 27295 , 14997 , 22841 , 12403 , 5735 , 19656 , 21619 , 18488 , 10360 , 12954 , 7563 , 27744 , 25189 , 5677 , 7107 , 28747 , 9026 , 11251 , 12524 , 29372 , 24412 }; -const Word16 ap_lattice_coeffs_1_fx[330] /* Q15 */ = { 26061, 16472, 6699, 13650, 15061, 8862, -6617, 917, 2222, -1724, -1270, -1880, 671, 12048, -19454, 17487, 6635, -63, 6392, -6044, -7663, 7474, -10790, -11098, -2611, 1716, -310, 5859, 6253, -15691, 1442, 25837, 4375, -5690, 17871, 22329, 10907, 9656, 10658, 1560, 5157, 3810, 7175, -6201, -10400, -24696, 25309, -16625, 9076, -22700, 7612, -11624, -511, -7309, 10174, -1147, 2810, -16383, 7053, 6599, -16238, -9884, 6439, 10687, -19476, 10319, 21911, 2511, 1497, -4089, -6660, -9738, 4122, -5881, -6611, 5279, 12977, 8745, 11684, 15995, -1843, 4563, -9712, -3697, 1225, -12039, -7087, -9088, 12760, 3772, -7879, -8880, 13982, -362, 4974, 8306, 7397, 16341, -4468, 14516, -9994, -1025, -352, 5581, 16268, -4583, -7929, -3435, 9645, -2219, -16128, -15978, 1192, 3584, 12981, -11562, -6747, -2719, -15172, -10135, 848, -3029, -4100, -5115, -160, 5847, 2935, 1468, 7805, -10227, -12802, -5850, 14890, 12681, -12742, -6481, 1164, 14922, -1782, 12452, 9534, 1599, 2576, 7265, -7128, 3974, -12998, -7159, -4170, -8831, -11279, -15238, -13808, -852, 7259, 11861, -11411, 9666, 11998, 2315, -2819, 8261, 5113, -2057, 13401, 7944, -9888, -2167, 12735, -15146, -5206, 7562, -3053, 1542, 2405, -10977, 751, 11619, 2372, 638, 11039, -15746, 5579, 8508, -12896, -11422, -3570, 9137, 12631, 11870, -10444, 11872, 9467, 9542, -9110, -14722, -9453, -13565, -13280, -9671, -8031, 82, 9433, 11410, -5844, -6767, 11504, -15800, 699, -16128, 1593, 14853, 3576, 7621, -15524, 4603, 11551, -3231, 4822, -1828, 3530, -7570, 11708, 11404, 7615, -10642, 5324, 1888, -1990, -319, -7346, -9252, -2144, 2119, 9187, -9335, -15417, 638, -14493, 12360, 14659, -9519, 11322, 12130, -10260, 3918, 9830, 13336, -9106, 14648, 6383, 5167, -7320, -4822, 12421, -7089, 4520, -13014, 2421, -8949, -14517, -5515, 11346, 1230, 2142, 5370, -4014, 11975, -10365, 3842, -9872, 5558, -11025, 8844, -13767, -10855, 16335, -12878, -15144, -10587, 15432, -11778, 8661, 7104, 16167, 4963, -10539, 15217, -11654, 13775, 6039, -9900, 4474, -8285, 6353, 9790, 7825, -12658, -5963, -2533, 4090, -8630, 12766, 147, 11134, 13605, 12378, 13114, 11548, -124, -6046, 14199, -7784, 4839, 13343, 2215, -8169, -11600, 10516, 13959, 10144, -6215, -6863, 5209, -2684, 12675, 5851, -13341, 7280, -4885, }; -const Word16 ap_lattice_coeffs_2_fx[132] /* Q15 */ = { 20764, 22321, -1619, 9395, 4784, 4436, -13439, -6775, -21527, -3334, 14296, 11135, -4305, -25354, -9883, 10733, 10886, 6745, 23514, -18100, -4919, 1787, 7848, -21249, -23653, 6205, 2234, 203, 2523, 1267, 13874, -3560, 14157, -13586, 9104, 13712, 2549, -9275, -11698, 151, -14504, -12200, 13216, 7963, 10301, 14565, 11387, 16254, 3552, 15380, -5579, 10692, 5641, 14428, 1914, 11130, -6388, 16096, -9217, -1412, -15810, -10977, -11015, 6437, -5394, 14499, -4429, -11612, 14815, -10198, -11391, 16329, -9469, 12334, -5830, 6407, 10940, -5003, 1744, 15000, 14499, 7708, -11310, -9374, 5093, 13283, 7113, -3537, 350, 12090, -16330, -16246, -7060, -3075, 10494, -453, 16036, 15427, -2157, 11366, 893, 4918, 15860, -16298, 5531, -16182, -5686, 10966, 8658, -13914, -10319, 8293, 13021, -16107, -14867, -15183, -626, 11, 10336, 15477, 3117, 9285, -7375, -3924, -15626, 1229, 11041, 16204, -2051, 5821, 15200, 16032, }; -const Word16 ap_lattice_coeffs_3_fx[66] /* Q15 */ = { 621, -6953, 13851, -13128, -3502, -805, 4587, 9161, 1060, 20726, 18957, -24071, 563, 433, -908, -11578, -15799, -16097, 14975, 5410, 15391, -6412, 14421, -15642, 11802, -16074, 15880, -5694, 247, 9115, 14234, 1977, -6347, -1104, 16260, 96, -15756, -3589, -760, 10639, -9570, -11670, -12012, 12481, -9887, 3614, 12575, 9960, -16373, -11455, 10969, -662, -14092, -5069, -12161, 10947, 11367, -5465, -7506, 3865, 11183, 16071, 16176, -12049, 13976, -1499, }; - -const Word16 * const ap_lattice_coeffs_fx[DIRAC_DECORR_NUM_SPLIT_BANDS] = +const Word32 ap_lattice_coeffs_1_fx[330] /* Q31 */ = { 1707955968, 1079539968, 439065920, 894568704, 987086592, 580795520, -433671424, 60123100, 145623008, -113015624, -83277272, -123237648, 43980464, 789623296, -1274971776, 1146041216, 434865440, -4194035, 418933248, -396120544, -502225568, 489841024, -707151360, -727382784, -171154448, 112504520, -20332376, 383985120, 409832224, -1028380544, 94536528, 1693286528, 286751360, -372925568, 1171218304, 1463361920, 714828608, 632831232, 698492672, 102256728, 338016064, 249692224, 470255968, -406406976, -681613440, -1618517632, 1658684160, -1089598848, 594810048, -1487723008, 498864736, -761839168, -33543694, -479015552, 666806528, -75234944, 184217584, -1073737536, 462267328, 432535424, -1064187648, -647809920, 422002016, 700395328, -1276386944, 676287680, 1435960064, 164589584, 98163624, -267984480, -436523296, -638210688, 270166336, -385436800, -433269856, 346019744, 850510912, 573156928, 765762624, 1048283392, -120804544, 299101536, -636524864, -242330640, 80326624, -789039168, -464483520, -595626048, 836273088, 247207584, -516360288, -582000256, 916374208, -23749022, 326015936, 544365632, 484824512, 1070984448, -292867392, 951343872, -655019008, -67237712, -23117662, 365821696, 1066178368, -300379264, -519686752, -225163664, 632096768, -145444768, -1056995776, -1047134528, 78157664, 234919680, 850736384, -757728896, -442194816, -178238992, -994355776, -664208128, 55589760, -198547744, -268733952, -335258720, -10494753, 383196992, 192384464, 96265248, 511571392, -670272576, -838996096, -383418176, 975855232, 831101952, -835100544, -424765824, 76321568, 977938304, -116844584, 816118976, 624840448, 104805792, 168871664, 476183040, -467180768, 260466144, -851865984, -469186528, -273299520, -578761856, -739202496, -998661504, -904981824, -55901148, 475768544, 777374080, -747846144, 633471168, 786354816, 151747632, -184790960, 541442880, 335149184, -134861968, 878260672, 520681024, -648033280, -142077520, 834621696, -992624896, -341192192, 495630624, -200100384, 101094944, 157629600, -719445696, 49263276, 761521344, 155458496, 41817948, 723487232, -1031938880, 365645600, 557622016, -845198016, -748587008, -233994112, 598808640, 827833472, 777923776, -684486784, 778044032, 620485312, 625355840, -597041280, -964868672, -619576960, -889000256, -870330048, -633834112, -526369728, 5433133, 618239040, 747816064, -383012288, -443491872, 753940736, -1035527360, 45870252, -1057006464, 104457896, 973415680, 234419312, 499502560, -1017436928, 301725760, 757045952, -211754768, 316049472, -119823144, 231367744, -496124544, 767317376, 747390912, 499083776, -697476928, 348923136, 123795992, -130425272, -20920786, -481433632, -606352768, -140537776, 138935744, 602089984, -611830976, -1010393216, 41841572, -949849216, 810060928, 960749824, -623839680, 742015744, 795013504, -672420096, 256821872, 644275136, 874015104, -596832960, 960008960, 418381344, 338664608, -479752128, -316038720, 814053056, -464590912, 296281888, -852937536, 158709776, -586499264, -951414720, -361479488, 743596288, 80622976, 140417520, 351974720, -263116144, 784855872, -679294144, 251841856, -646998144, 364266912, -722555264, 579635904, -902286720, -711452736, 1070569984, -843980416, -992532608, -693845504, 1011415424, -771940928, 567612160, 465568000, 1059568448, 325320160, -690744576, 997319296, -763801920, 902804288, 395774784, -648814912, 293208832, -542989120, 416409952, 641614400, 512836288, -829568640, -390839872, -166056320, 268091856, -565634304, 836672512, 9667971, 729723520, 891643776, 811214080, 859468032, 756829056, -8177617, -396275168, 930607744, -510143328, 317148960, 874476800, 145204256, -535395584, -760230656, 689206976, 914828032, 664809408, -407354016, -449784000, 341379040, -175941184, 830706816, 383501920, -874332928, 477147232, -320183360}; +const Word32 ap_lattice_coeffs_2_fx[132] /* Q31 */ = { 1360843264, 1462880896, -106124344, 615715776, 313579872, 290773568, -880779712, -444026592, -1410828032, -218497872, 936944960, 729753600, -282142848, -1661606912, -647739072, 703431872, 713452032, 442076704, 1541038592, -1186205568, -322414592, 117158120, 514363136, -1392593792, -1550156800, 406684000, 146426176, 13348758, 165409920, 83060376, 909276800, -233341280, 927820288, -890434752, 596656832, 898691840, 167097856, -607873152, -766668864, 9951439, -950562176, -799540352, 866157440, 521887904, 675097984, 954584384, 746287104, 1065244224, 232804400, 1007990144, -365686400, 700745408, 369704352, 945610048, 125449552, 729442240, -418684160, 1054884800, -604078592, -92599496, -1036132928, -719417728, -721895936, 421913952, -353525216, 950242176, -290318304, -761035968, 970948224, -668342016, -746551232, 1070181312, -620620608, 808379392, -382088896, 419923232, 716984640, -327914304, 114310552, 983047168, 950209984, 505204128, -741223296, -614390784, 333800576, 870574848, 466160704, -231842336, 22973780, 792393536, -1070215680, -1064756736, -462737632, -201582144, 687787456, -29725468, 1050991360, 1011065344, -141377440, 744899776, 58581208, 322307232, 1039409984, -1068139008, 362486656, -1060515456, -372648544, 718711232, 567440320, -911931072, -676298432, 543498048, 853369216, -1055627776, -974371328, -995053760, -41077068, 738734, 677385088, 1014353152, 204309440, 608543168, -483372800, -257186944, -1024072704, 80584320, 723596736, 1061954304, -134438912, 381504768, 996200512, 1050733696}; +const Word32 ap_lattice_coeffs_3_fx[66] /* Q31 */ = { 1360843264, 1462880896, -106124344, 615715776, 313579872, 290773568, -880779712, -444026592, -1410828032, -218497872, 936944960, 729753600, -282142848, -1661606912, -647739072, 703431872, 713452032, 442076704, 1541038592, -1186205568, -322414592, 117158120, 514363136, -1392593792, -1550156800, 406684000, 146426176, 13348758, 165409920, 83060376, 909276800, -233341280, 927820288, -890434752, 596656832, 898691840, 167097856, -607873152, -766668864, 9951439, -950562176, -799540352, 866157440, 521887904, 675097984, 954584384, 746287104, 1065244224, 232804400, 1007990144, -365686400, 700745408, 369704352, 945610048, 125449552, 729442240, -418684160, 1054884800, -604078592, -92599496, -1036132928, -719417728, -721895936, 421913952, -353525216, 950242176}; +const Word32 * const ap_lattice_coeffs_fx[DIRAC_DECORR_NUM_SPLIT_BANDS] = { - &ap_lattice_coeffs_1_fx[0], - &ap_lattice_coeffs_2_fx[0], - &ap_lattice_coeffs_3_fx[0], + ap_lattice_coeffs_1_fx, + ap_lattice_coeffs_2_fx, + ap_lattice_coeffs_3_fx, }; const Word16 ap_split_frequencies_fx[DIRAC_DECORR_NUM_SPLIT_BANDS + 1]/*Q14*/ = { @@ -207,285 +206,6 @@ const Word32 SincTable_fx[321] /*Q31*/ = { 8716980, 8185692, 7649294, 7108665, 6564643, 6017979, 5469361, 4919434, 4368840, 3818118, 3267783, 2718370, 2170290, 1624034, 1079948, 538481, }; -const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { - 131936432,125285536,105934832,77097344,45729324,19356880,2523696,0,0, - 0,1602425,4763253,5796595,5698884,5608690,5175704,3880368,2303444, - 1553033,1902670,2661537,3300414,3919560,4475624,4485288,3976468,3688169, - 3682129,3375844,2619661,1976758,1906026,2165066,2186943,1765500,1162325, - 671759,348160,140123,27783,0,0,0,148981,534991, - 939926,1281242,1547798,1665910,1550617,1228897,835102,478486,185757, - 0,0,0,0,4294,124554,284273,410840,479828, - 507343,493652,417417,278367,114890,0,0,0,0, - 0,0,0,0,0,29125,130728,242531,313264, - 326954,282528,204816,121735,46976,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,31943,114353,173543, - 205218,205755,176362,128043,69927,20803,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,3355,38117,83214,127372,170993,215553,257966, - 294607,327222,360643,395137,425738,452447,480096,507208,525462, - 533247,534186,526804,505463,469896,424799,372856,312190,242397, - 168711,95831,28319,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,102810,72074,0, - 226962,443858,219445,0,214882,1013209,77846,0,273535, - 1385798,289239,0,472983,1241648,688671,0,306821,870536, - 792153,0,115695,613375,552574,0,0,434462,205890, - 34762,26709,182938,117843,0 -}; -const Word32 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 8209721,8156956,8050127,7984940,7992858,8011649,7974747,7910306,7917252, - 8038476,8174723,8228729,8192717,8124794,8070352,8029995,7989956,7953608, - 7931152,7912210,7870745,7803402,7745101,7727896,7735563,7724331,7693670, - 7672548,7668253,7662666,7647508,7638633,7652147,7680265,7699593,7698955, - 7689828,7687614,7690835,7685852,7667229,7645042,7629506,7617787,7601639, - 7578545,7554822,7537315,7524279,7507108,7481430,7453328,7431803,7415991, - 7395254,7364820,7335141,7319069,7310202,7296948,7280120,7270700,7273946, - 7282989,7288836,7292510,7303600,7327768,7359376,7389357,7418784,7458856, - 7515186,7577119,7632232,7684091,7741771,7803922,7858506,7897295,7924793, - 7950529,7975309,7989134,7983815,7964337,7942418,7920028,7885853,7832460, - 7773178,7719675,7667640,7605540,7531820,7456659,7388182,7322718,7251305, - 7173342,7099371,7039023,6989942,6943645,6900871,6876377,6876200,6891753, - 6912280,6938008,6976184,7027514,7081939,7129159,7169768,7212416,7260113, - 7303961,7334160,7353923,7375390,7399868,7413919,7410756,7397888,7384995, - 7371128,7347783,7311469,7269433,7231533,7198642,7162562,7118413,7073358, - 7038218,7011467,6978885,6936976,6896929,6866243,6838636,6804318,6763793, - 6726715,6699377,6677726,6654422,6630095,6613880,6612001,6619165,6625113, - 6629517,6642997,6668750,6697196,6718344,6734173,6753895,6779589,6802146, - 6813185,6816633,6823486,6836086,6844013,6839567,6830432,6829887,6834652, - 6833897,6825424,6817447,6817430,6823444,6827572,6826137,6824845,6832135, - 6847612,6860472,6863735,6867082,6885344,6912573,6928050,6933679,6949215, - 6980018,7009084,7024486,7037715,7065515,7103221,7130283,7141717,7156523, - 7182804,7191302,7148830,7066479,6973039,6845448,6642997,6369529,6067757, - 5757018,5407708,4989863,4529504,4091224,3695693,3270760,2711684,2000297, - 1252050,651123,273904,89170,20652,2843,209,134,134, - 125,117,92,75,75,75,58,50,50, - 58,50,41,41,50,41,41,41,41, - 41,41,41,41,41,41,41,41,41, - 41,41,41,41,41 -}; -const Word32 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 8209721,8156956,8050144,7984965,7992850,8011640,7974756,7910323,7917252, - 8038484,8174707,8228738,8192709,8124794,8070361,8030003,7989948,7953583, - 7931127,7912202,7870737,7803402,7745101,7727896,7735563,7724331,7693679, - 7672548,7668236,7662658,7647491,7638624,7652147,7680265,7699609,7698964, - 7689820,7687597,7690827,7685844,7667229,7645050,7629472,7617779,7601639, - 7578545,7554822,7537315,7524288,7507133,7481447,7453337,7431803,7415982, - 7395229,7364812,7335141,7319077,7310185,7296931,7280120,7270700,7273955, - 7282998,7288836,7292494,7303583,7327776,7359401,7389382,7418776,7458856, - 7515186,7577127,7632241,7684082,7741787,7803939,7858523,7897295,7924793, - 7950529,7975309,7989125,7983824,7964320,7942426,7920062,7885853,7832443, - 7773194,7719675,7667640,7605556,7531829,7456675,7388199,7322726,7251305, - 7173333,7099379,7039032,6989967,6943653,6900880,6876377,6876226,6891753, - 6912271,6937999,6976184,7027514,7081931,7129151,7169768,7212416,7260122, - 7303961,7334160,7353940,7375398,7399868,7413910,7410731,7397871,7384978, - 7371145,7347791,7311477,7269450,7231542,7198633,7162554,7118413,7073358, - 7038218,7011475,6978885,6936976,6896920,6866226,6838628,6804310,6763785, - 6726707,6699369,6677709,6654414,6630095,6613889,6612010,6619148,6625071, - 6629508,6642989,6668750,6697204,6718352,6734190,6753920,6779597,6802146, - 6813210,6816641,6823495,6836095,6844030,6839559,6830457,6829904,6834677, - 6833905,6825416,6817455,6817421,6823428,6827555,6826129,6824837,6832135, - 6847620,6860472,6863735,6867082,6885336,6912582,6928059,6933679,6949232, - 6980026,7009084,7024477,7037706,7065489,7103188,7130275,7141708,7156497, - 7182812,7191285,7148847,7066488,6973047,6845439,6642997,6369529,6067757, - 5757001,5407699,4989863,4529504,4091224,3695702,3270751,2711693,2000297, - 1252050,651123,273904,89170,20652,2843,209,134,134, - 125,117,92,75,75,75,58,50,50, - 58,50,41,41,50,41,41,41,41, - 41,41,41,41,41,41,41,41,41, - 41,41,41,41,41 -}; -const Word32 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { - 131125216,129227112,119736576,105149792,87165424,65548180,45102524,26414452,12630962, - 2261837,646258,0,0,0,362790,1269699,3305916,5226035, - 5552185,5544266,5313545,5242007,4972498,4406099,3304843,2138491,1245809, - 945832,1040724,1586856,2087488,2519669,2930509,3330210,3706959,3852988, - 3845069,3506438,3230889,3049963,3020838,2972117,2692944,2226269,1634369, - 1306206,1176284,1344056,1533169,1651817,1468073,1147695,736184,393929, - 141465,23622,0,0,0,0,0,0,0, - 0,0,31004,186025,403995,663840,869999,1052669,1200174, - 1230910,1195208,1010927,774704,504121,258100,82812,13824,0, - 0,0,0,0,0,0,0,0,0, - 0,35567,94757,127104,150189,159048,139586,103616,29662, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,13287,46305,75833,95294,77980,44426,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,13153,45768,78383,106434, - 117574,114487,101871,68719,36641,6039,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1476, - 5234,21072,40667,63619,89120,116098,144015,171932,199715, - 227901,255818,281723,304405,324941,341584,357824,373796,388962, - 403995,419296,437818,458621,488820,521301,557674,596329,636728, - 680886,727728,776315,821546,862751,897916,926773,952409,971870, - 980460,981802,955227,918049,865167,793897,713233,613106,507477, - 398224,342255,316082,334604,338228 -}; -const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 8747993,8732977,8657866,8592845,8534553,8549703,8574332,8613196,8612450, - 8594632,8548151,8528631,8527079,8602383,8683241,8772412,8811402,8825092, - 8787822,8745552,8699960,8676052,8653847,8634210,8606620,8577981,8553109, - 8534922,8521190,8494783,8457906,8405301,8354525,8310963,8294462,8290268, - 8294278,8284279,8267812,8241648,8222362,8207531,8203647,8196752,8187852, - 8170672,8158450,8153660,8165857,8182684,8201064,8209352,8210920,8201391, - 8193506,8188086,8186669,8185008,8178398,8165219,8147653,8126564,8107262, - 8090653,8075973,8060647,8040892,8017060,7990510,7965369,7942812,7924139, - 7905508,7885266,7858574,7828903,7797253,7770124,7745051,7723047,7698192, - 7671231,7638683,7606840,7575458,7552800,7532081,7514280,7493736,7472068, - 7448614,7429295,7412736,7405756,7399180,7393182,7382990,7372018,7362119, - 7358680,7359552,7368629,7377118,7384718,7391127,7398953,7413675,7435679, - 7462522,7492302,7520043,7544714,7568412,7592915,7621662,7651325,7681599, - 7702873,7719423,7728886,7735043,7740672,7747517,7751812,7754412,7743650, - 7728089,7705339,7680970,7656341,7632308,7603568,7571683,7527366,7481606, - 7433699,7390347,7348345,7307132,7260525,7210319,7153108,7097458,7044149, - 6995864,6948351,6898883,6845179,6788657,6732512,6680016,6632990,6592154, - 6553113,6515029,6478094,6441947,6416664,6397714,6388260,6386465,6386851, - 6388319,6391700,6396364,6411102,6429029,6451720,6471844,6489796,6501641, - 6513435,6525204,6542518,6559405,6575670,6584344,6589771,6589813,6590845, - 6592531,6595845,6596365,6592707,6580091,6564161,6543961,6524642,6505902, - 6486113,6462969,6434800,6400113,6364034,6328861,6297445,6268521,6239597, - 6208098,6172732,6136241,6100909,6071330,6044722,6020084,5990858,5959116, - 5923599,5889046,5855634,5825838,5795177,5763938,5725518,5685253,5642211, - 5600763,5560540,5523688,5486661,5449525,5408043,5366612,5325264,5291257, - 5260940,5238031,5214778,5191290,5165126,5142795,5126186,5122067,5121799, - 5124433,5124877,5123837,5133241,5151268,5182239,5223192,5269715,5328527, - 5411331,5510141,5612029,5649811,5591443,5269488,4824515,4151102,3472472, - 2790361,2355655,2029229,1865232,1832432 -}; -const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 8747984,8732969,8657857,8592837,8534561,8549686,8574315,8613188,8612450, - 8594632,8548151,8528622,8527070,8602392,8683241,8772404,8811402,8825109, - 8787822,8745552,8699951,8676044,8653847,8634226,8606620,8577964,8553100, - 8534914,8521190,8494808,8457931,8405310,8354525,8310963,8294471,8290276, - 8294278,8284287,8267820,8241639,8222362,8207540,8203664,8196752,8187826, - 8170663,8158450,8153685,8165873,8182684,8201064,8209360,8210945,8201416, - 8193531,8188095,8186669,8185008,8178398,8165219,8147653,8126539,8107237, - 8090644,8075973,8060664,8040875,8017043,7990510,7965369,7942812,7924122, - 7905499,7885283,7858574,7828903,7797270,7770116,7745034,7723056,7698192, - 7671222,7638675,7606840,7575466,7552809,7532089,7514280,7493736,7472068, - 7448597,7429287,7412753,7405756,7399163,7393174,7382981,7372009,7362111, - 7358680,7359560,7368637,7377126,7384718,7391135,7398970,7413692,7435679, - 7462514,7492293,7520026,7544705,7568403,7592915,7621688,7651341,7681582, - 7702873,7719423,7728877,7735026,7740663,7747517,7751829,7754437,7743650, - 7728080,7705330,7680970,7656349,7632308,7603568,7571700,7527383,7481623, - 7433716,7390363,7348353,7307132,7260525,7210327,7153125,7097475,7044149, - 6995872,6948359,6898883,6845179,6788657,6732520,6680024,6632990,6592154, - 6553113,6515037,6478102,6441947,6416664,6397714,6388269,6386457,6386843, - 6388327,6391700,6396347,6411102,6429029,6451712,6471844,6489796,6501624, - 6513427,6525213,6542518,6559405,6575653,6584327,6589763,6589813,6590845, - 6592531,6595836,6596365,6592716,6580099,6564169,6543978,6524642,6505894, - 6486122,6462994,6434817,6400122,6364034,6328852,6297428,6268521,6239597, - 6208090,6172723,6136241,6100909,6071330,6044722,6020076,5990842,5959107, - 5923599,5889037,5855617,5825829,5795169,5763921,5725518,5685253,5642194, - 5600755,5560548,5523688,5486661,5449508,5408026,5366603,5325256,5291257, - 5260949,5238040,5214778,5191281,5165134,5142795,5126194,5122075,5121799, - 5124441,5124877,5123854,5133241,5151259,5182230,5223192,5269715,5328527, - 5411340,5510149,5612037,5649820,5591435,5269472,4824498,4151094,3472472, - 2790378,2355663,2029237,1865240,1832432 -}; -const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { - 130123416,130123416,128225040,123478832,118732624,113118568,104033232,94947768,85862304, - 75063144,64263984,53464828,43914296,34675820,25437480,17993766,11746601,5499437, - 1532229,985023,437818,0,0,0,0,0,0, - 0,343865,773496,1203261,2004810,3054258,4103707,4777480,4887673, - 4998000,5066316,4966727,4867271,4767816,4765534,4763253,4760971,4569174, - 4329998,4090822,3659312,3099355,2539533,2037290,1621350,1205543,880065, - 916304,952677,988916,1233058,1477200,1721342,1912602,2090441,2268413, - 2427327,2573490,2719788,2859643,2989834,3120025,3219078,3193576,3168075, - 3142574,2987686,2832665,2677778,2583691,2504771,2425851,2397128,2401692, - 2406255,2356594,2225464,2094333,1933137,1651280,1369423,1087566,924357, - 761148,597940,625051,699677,774302,854295,937779,1021128,1026631, - 915230,803830,670014,446676,223338,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,5100,30735, - 56371,81872,173140,264408,355542,419698,477144,534455,552037, - 543044,533918,485599,378494,271254,173946,115964,57982,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,671,1476,2415,99723,261321,423054,646795, - 963549,1280302,1632087,2124129,2616037,3108080,3841982,4575885,5309922, - 6280181,7309766,8339216,8750996,8750996 -}; -const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 9335246,9335246,9316514,9269680,9222847,9180350,9155201,9130044,9104894, - 9126688,9148473,9170267,9191549,9212688,9233844,9234423,9221295,9208167, - 9191205,9168497,9145789,9127997,9129884,9131780,9133676,9164823,9195978, - 9227125,9267550,9310290,9353038,9385225,9410374,9435531,9445170,9431538, - 9417907,9399855,9364128,9328409,9292682,9270670,9248667,9226655,9215783, - 9207688,9199593,9183605,9162356,9141108,9116244,9085961,9055678,9028608, - 9014432,9000255,8986078,8975962,8965845,8955728,8926108,8891606,8857103, - 8819145,8778896,8738639,8710806,8701604,8692401,8686227,8692209,8698190, - 8704171,8686706,8669232,8651767,8623917,8593466,8563024,8543554,8531399, - 8519252,8509748,8504203,8498667,8489716,8467083,8444459,8421835,8399773, - 8377711,8355649,8351698,8352268,8352847,8355833,8360430,8365027,8363484, - 8352721,8341959,8331028,8319460,8307884,8296308,8292063,8287827,8283582, - 8271142,8256647,8242159,8221389,8196442,8171494,8150547,8135607,8120659, - 8106465,8095225,8083992,8072760,8043073,8013394,7983706,7949422,7913997, - 7878564,7853893,7836394,7818904,7801472,7784141,7766811,7744782,7703972, - 7663169,7622359,7580802,7539253,7497696,7474266,7455367,7436467,7415496, - 7393140,7370784,7338471,7291235,7244007,7197551,7154232,7110914,7067595, - 7046615,7025627,7004647,6977485,6948779,6920073,6878751,6829015,6779278, - 6733644,6694184,6654724,6618804,6597044,6575284,6553524,6518183,6482842, - 6447501,6401632,6353137,6304634,6267229,6237215,6207201,6181045,6160677, - 6140310,6115580,6073427,6031275,5989122,5942817,5896503,5850198,5825150, - 5805428,5785707,5765742,5745626,5725510,5693398,5643285,5593180,5544358, - 5500720,5457091,5413454,5404126,5394797,5385469,5366930,5346085,5325239, - 5282164,5224274,5166376,5115566,5075376,5035186,5002731,5001238,4999736, - 4998243,4969436,4940630,4911823,4847290,4773822,4700355,4646282,4605153, - 4564023,4540250,4542523,4544788,4536869,4488241,4439612,4390983,4285488, - 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, - 4073222,4038317,3957300,3691818,3426335,3160861,2774481,2388110,2001740, - 1708239,1437966,1167685,1059581,1059581 -}; -const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 9335246,9335246,9316514,9269689,9222855,9180358,9155201,9130035,9104869, - 9126663,9148465,9170258,9191540,9212688,9233827,9234415,9221295,9208175, - 9191213,9168488,9145755,9127963,9129867,9131772,9133676,9164831,9195978, - 9227133,9267550,9310281,9353021,9385200,9410357,9435506,9445153,9431522, - 9417899,9399855,9364119,9328384,9292648,9270653,9248658,9226663,9215792, - 9207688,9199593,9183596,9162348,9141100,9116236,9085953,9055678,9028617, - 9014432,9000255,8986070,8975962,8965853,8955745,8926116,8891614,8857103, - 8819145,8778888,8738631,8710789,8701587,8692385,8686219,8692200,8698181, - 8704162,8686697,8669232,8651775,8623917,8593466,8563016,8543546,8531390, - 8519244,8509739,8504203,8498675,8489724,8467100,8444468,8421844,8399773, - 8377703,8355641,8351681,8352252,8352830,8355817,8360414,8365019,8363475, - 8352721,8341959,8331037,8319469,8307893,8296316,8292072,8287835,8283591, - 8271142,8256647,8242151,8221381,8196433,8171494,8150547,8135616,8120676, - 8106482,8095250,8084009,8072777,8043081,8013385,7983698,7949405,7913972, - 7878547,7853876,7836386,7818904,7801481,7784150,7766819,7744790,7703980, - 7663161,7622350,7580793,7539244,7497696,7474258,7455358,7436459,7415487, - 7393132,7370776,7338471,7291244,7244016,7197560,7154241,7110914,7067587, - 7046607,7025627,7004647,6977485,6948770,6920064,6878742,6829006,6779270, - 6733644,6694184,6654724,6618813,6597053,6575301,6553549,6518191,6482842, - 6447492,6401623,6353137,6304643,6267229,6237215,6207201,6181037,6160677, - 6140310,6115580,6073427,6031275,5989122,5942817,5896512,5850207,5825167, - 5805445,5785723,5765750,5745626,5725493,5693382,5643276,5593180,5544375, - 5500729,5457074,5413429,5404109,5394789,5385478,5366939,5346093,5325247, - 5282172,5224282,5166384,5115574,5075384,5035195,5002739,5001238,4999736, - 4998243,4969436,4940630,4911823,4847290,4773814,4700338,4646274,4605153, - 4564023,4540258,4542523,4544788,4536878,4488249,4439612,4390983,4285480, - 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, - 4073222,4038317,3957292,3691809,3426327,3160844,2774473,2388110,2001740, - 1708239,1437966,1167685,1059573,1059573 -}; /*----------------------------------------------------------------------------------* * t-design and SN3D normalization table *----------------------------------------------------------------------------------*/ @@ -526,20 +246,86 @@ const Word32 t_design_11_elevation_int[70] = //Q22 * Reverberator ROM tables *-----------------------------------------------------------------------*/ -const Word32 ivas_reverb_default_fc_fx[IVAS_REVERB_DEFAULT_N_BANDS] /*Q16*/ = +const Word32 ivas_reverb_default_small_fc_fx[IVAS_REVERB_DEFAULT_S_N_BANDS] = +{ + 13107200, 39321600, 65536000, 91750400, 117964800, 144179200, 170393600, 196608000, 222822400, 249036800, + 275251200, 301465600, 327680000, 353894400, 380108800, 406323200, 432537600, 458752000, 484966400, 511180800, + 537395200, 563609600, 589824000, 616038400, 642252800, 668467200, 694681600, 720896000, 747110400, 773324800, + 799539200, 825753600, 851968000, 878182400, 904396800, 930611200, 956825600, 983040000, 1009254400, 1035468800, + 1061683200, 1087897600, 1114112000, 1140326400, 1166540800, 1192755200, 1218969600, 1245184000, 1271398400, 1297612800, + 1323827200, 1350041600, 1376256000, 1402470400, 1428684800, 1454899200, 1481113600, 1507328000, 1533542400, 1559756800 +}; + +const Word32 ivas_reverb_default_small_RT60_fx[IVAS_REVERB_DEFAULT_S_N_BANDS] = +{ + 20132660, 18371052, 17846998, 17702244, 17822236, 17568430, 16977738, 16495426, 15933590, 15312162, + 14732812, 14167755, 13640682, 13163001, 12694380, 12243073, 11827065, 11416157, 11022631, 10656284, + 10291077, 9953050, 9614419, 9287733, 8987823, 8690128, 8409345, 8176074, 7940388, 7726244, + 7560149, 7379157, 7211854, 7067302, 6912616, 6763433, 6618880, 6473925, 6330715, 6188578, + 6047516, 5909405, 5773644, 5641238, 5524872, 5405753, 5293279, 5208588, 5113897, 5027662, + 4972901, 4903511, 4842106, 4808954, 4762649, 4743657, 4712653, 4689433, 4693326, 4685541 +}; + +const Word32 ivas_reverb_default_small_DSR_fx[IVAS_REVERB_DEFAULT_S_N_BANDS] = +{ + 16773, 7628, 5046, 4620, 5666, 6853, 7771, 9876, 11530, 12337, + 11421, 10287, 8791, 7565, 6305, 5215, 4504, 3860, 3627, 4363, + 5246, 6739, 8151, 9611, 10088, 10416, 10154, 9187, 8628, 8012, + 7491, 6931, 6320, 6074, 5589, 5145, 4977, 4646, 4558, 4411, + 4331, 4253, 4147, 4018, 3821, 3629, 3428, 3361, 3361, 3361, + 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361 +}; + +const Word32 ivas_reverb_default_medium_fc_fx[IVAS_REVERB_DEFAULT_M_N_BANDS] = +{ + 1310720, 1638400, 2064384, 2621440, 3276800, + 4128768, 5242880, 6553600, 8192000, + 10485760, 13107200, 16384000, 20643840, + 26214400, 32768000, 41287680, 52428800, + 65536000, 81920000, 104857600, 131072000, + 163840000, 206438400, 262144000, 327680000, + 412876800, 524288000, 655360000, 819200000, + 1048576000, 1310720000 +}; + +const Word32 ivas_reverb_default_medium_RT60_fx[IVAS_REVERB_DEFAULT_M_N_BANDS] = +{ + 14763950, 15099494, 15535702, 16106127, + 16777216, 17649632, 18790482, 20132660, + 21810380, 24159192, 26843546, 26591888, + 26264732, 25836912, 25333596, 24785364, + 24530840, 24231400, 24127968, 24134494, + 24058024, 23406682, 22445968, 21003330, + 19424124, 17708016, 15804674, 13936498, + 12319828, 10826874, 9549390 +}; + +const Word32 ivas_reverb_default_medium_DSR_fx[IVAS_REVERB_DEFAULT_M_N_BANDS] = { - 1310720 , 1638400 , 2064384 , 2621440 , 3276800 , - 4128768 , 5242880 , 6553600 , 8192000 , - 10485760 , 13107200 , 16384000 , 20643840 , - 26214400 , 32768000 , 41287680 , 52428800 , - 65536000 , 81920000 , 104857600 , 131072000 , - 163840000 , 206438400 , 262144000 , 327680000 , - 412876800 , 524288000 , 655360000 , 819200000 , - 1048576000 , 1310720000 + 15978, 16341, 16813, 17430, + 18156, 19101, 20335, 21788, + 23603, 26145, 29050, 27037, + 24421, 20999, 16973, 12614, + 10726, 8506, 8047, 8659, + 10526, 12575, 17260, 19074, + 13653, 7464, 6609, 12688, + 7607, 3835, 2373 }; -const Word32 ivas_reverb_default_RT60_fx[IVAS_REVERB_DEFAULT_N_BANDS] /*Q26*/ = +const Word32 ivas_reverb_default_large_fc_fx[IVAS_REVERB_DEFAULT_L_N_BANDS] /*Q16*/ = { + 1310720, 1638400, 2064384, 2621440, 3276800, + 4128768, 5242880, 6553600, 8192000, + 10485760, 13107200, 16384000, 20643840, + 26214400, 32768000, 41287680, 52428800, + 65536000, 81920000, 104857600, 131072000, + 163840000, 206438400, 262144000, 327680000, + 412876800, 524288000, 655360000, 819200000, + 1048576000, 1310720000 +}; + +const Word32 ivas_reverb_default_large_RT60_fx[IVAS_REVERB_DEFAULT_L_N_BANDS] /*Q26*/ = + { 91415696, 97213904, 88368952, 105944760, 99092952, 93643712, 86496616, 90341952, 72202424, 69799928, 73618424, 72813120, @@ -550,7 +336,7 @@ const Word32 ivas_reverb_default_RT60_fx[IVAS_REVERB_DEFAULT_N_BANDS] /*Q26*/ = 48281472, 41394088, 40286124 }; -const Word32 ivas_reverb_default_DSR_fx[IVAS_REVERB_DEFAULT_N_BANDS] /*Q30*/ = +const Word32 ivas_reverb_default_large_DSR_fx[IVAS_REVERB_DEFAULT_L_N_BANDS] /*Q30*/ = { 20, 23, 15, 16, 13, 20, 25, 42, @@ -562,865 +348,13 @@ const Word32 ivas_reverb_default_DSR_fx[IVAS_REVERB_DEFAULT_N_BANDS] /*Q30*/ = 66, 30, 28 }; -const float ivas_reverb_default_fc[IVAS_REVERB_DEFAULT_N_BANDS] = -{ - 20.0f, 25.0f, 31.5f, 40.0f, - 50.0f, 63.0f, 80.0f, 100.0f, - 125.0f, 160.0f, 200.0f, 250.0f, - 315.0f, 400.0f, 500.0f, 630.0f, - 800.0f, 1000.0f, 1250.0f, 1600.0f, - 2000.0f, 2500.0f, 3150.0f, 4000.0f, - 5000.0f, 6300.0f, 8000.0f, 10000.0f, - 12500.0f, 16000.0f, 20000.0f -}; - -const float ivas_reverb_default_RT60[IVAS_REVERB_DEFAULT_N_BANDS] = -{ - 1.3622f, 1.4486f, 1.3168f, 1.5787f, - 1.4766f, 1.3954f, 1.2889f, 1.3462f, - 1.0759f, 1.0401f, 1.097f, 1.085f, - 1.091f, 1.0404f, 1.0499f, 1.0699f, - 1.1028f, 1.1714f, 1.1027f, 1.0666f, - 1.055f, 1.0553f, 1.0521f, 1.0569f, - 1.0421f, 0.97822f, 0.80487f, 0.75944f, - 0.71945f, 0.61682f, 0.60031f -}; - -const float ivas_reverb_default_DSR[IVAS_REVERB_DEFAULT_N_BANDS] = -{ - 1.8811e-08f, 2.1428e-08f, 1.3972e-08f, 1.51e-08f, - 1.287e-08f, 1.8747e-08f, 2.413e-08f, 3.9927e-08f, - 8.9719e-08f, 1.902e-07f, 3.702e-07f, 6.1341e-07f, - 7.1432e-07f, 6.5331e-07f, 4.6094e-07f, 5.4683e-07f, - 7.0134e-07f, 6.856e-07f, 7.114e-07f, 6.9604e-07f, - 5.2939e-07f, 5.699e-07f, 6.1773e-07f, 5.7488e-07f, - 4.7748e-07f, 2.7213e-07f, 1.3681e-07f, 1.0941e-07f, - 6.2001e-08f, 2.8483e-08f, 2.6267e-08f -}; - -const Word32 release_cnst_table[4][201] = // Q31 - { - { - 1913946752, - 1919716352, - 1925351680, - 1930855552, - 1936230784, - 1941479808, - 1946605312, - 1951609728, - 1956495744, - 1961265792, - 1965922304, - 1970467584, - 1974904320, - 1979234560, - 1983460736, - 1987585024, - 1991609856, - 1995537280, - 1999369344, - 2003108480, - 2006756480, - 2010315520, - 2013787520, - 2017174528, - 2020478464, - 2023701248, - 2026844672, - 2029910656, - 2032900992, - 2035817344, - 2038661376, - 2041435008, - 2044139648, - 2046777088, - 2049348864, - 2051856384, - 2054301440, - 2056685312, - 2059009536, - 2061275520, - 2063484672, - 2065638272, - 2067737856, - 2069784448, - 2071779584, - 2073724416, - 2075620096, - 2077467904, - 2079268992, - 2081024512, - 2082735488, - 2084403200, - 2086028416, - 2087612544, - 2089156352, - 2090660864, - 2092127104, - 2093555968, - 2094948480, - 2096305408, - 2097627776, - 2098916352, - 2100172032, - 2101395584, - 2102587776, - 2103749504, - 2104881408, - 2105984384, - 2107059072, - 2108106112, - 2109126400, - 2110120448, - 2111088896, - 2112032512, - 2112951808, - 2113847552, - 2114720128, - 2115570304, - 2116398592, - 2117205504, - 2117991552, - 2118757504, - 2119503616, - 2120230400, - 2120938496, - 2121628288, - 2122300288, - 2122954880, - 2123592576, - 2124213760, - 2124818944, - 2125408384, - 2125982592, - 2126541952, - 2127086848, - 2127617664, - 2128134656, - 2128638336, - 2129128832, - 2129606784, - 2130072192, - 2130525568, - 2130967296, - 2131397376, - 2131816448, - 2132224640, - 2132622080, - 2133009408, - 2133386496, - 2133753856, - 2134111744, - 2134460288, - 2134799744, - 2135130368, - 2135452416, - 2135766144, - 2136071680, - 2136369152, - 2136659072, - 2136941312, - 2137216256, - 2137484160, - 2137744896, - 2137998976, - 2138246400, - 2138487424, - 2138722176, - 2138950656, - 2139173376, - 2139390208, - 2139601408, - 2139807104, - 2140007424, - 2140202624, - 2140392576, - 2140577664, - 2140758016, - 2140933504, - 2141104512, - 2141271040, - 2141433216, - 2141591168, - 2141745024, - 2141894912, - 2142040832, - 2142182912, - 2142321408, - 2142456192, - 2142587392, - 2142715264, - 2142839808, - 2142961152, - 2143079296, - 2143194240, - 2143306240, - 2143415424, - 2143521664, - 2143625216, - 2143725952, - 2143824128, - 2143919744, - 2144012800, - 2144103424, - 2144191744, - 2144277760, - 2144361472, - 2144443136, - 2144522496, - 2144599936, - 2144675200, - 2144748544, - 2144820096, - 2144889600, - 2144957440, - 2145023488, - 2145087744, - 2145150336, - 2145211264, - 2145270656, - 2145328512, - 2145384832, - 2145439616, - 2145493120, - 2145545088, - 2145595776, - 2145645056, - 2145693184, - 2145739904, - 2145785472, - 2145829888, - 2145873152, - 2145915136, - 2145956224, - 2145996032, - 2146034944, - 2146072832, - 2146109696, - 2146145664, - 2146180608, - 2146214656, - 2146247808, - }, - { - 2027355264, - 2030408704, - 2033386624, - 2036290944, - 2039123328, - 2041885440, - 2044578944, - 2047205376, - 2049766528, - 2052263680, - 2054698496, - 2057072384, - 2059387008, - 2061643520, - 2063843328, - 2065987968, - 2068078720, - 2070116864, - 2072103552, - 2074040192, - 2075927936, - 2077767936, - 2079561472, - 2081309568, - 2083013376, - 2084673920, - 2086292352, - 2087869696, - 2089406976, - 2090905216, - 2092365184, - 2093788032, - 2095174528, - 2096525824, - 2097842432, - 2099125632, - 2100375808, - 2101594240, - 2102781312, - 2103938048, - 2105065216, - 2106163456, - 2107233536, - 2108276096, - 2109292032, - 2110281728, - 2111246080, - 2112185728, - 2113101056, - 2113992960, - 2114861824, - 2115708288, - 2116532992, - 2117336448, - 2118119168, - 2118881792, - 2119624704, - 2120348416, - 2121053440, - 2121740288, - 2122409344, - 2123061120, - 2123696128, - 2124314624, - 2124917120, - 2125504128, - 2126075776, - 2126632832, - 2127175296, - 2127703808, - 2128218624, - 2128720000, - 2129208448, - 2129684352, - 2130147712, - 2130599168, - 2131038976, - 2131467264, - 2131884416, - 2132290816, - 2132686592, - 2133072256, - 2133447680, - 2133813504, - 2134169856, - 2134516864, - 2134854784, - 2135184000, - 2135504640, - 2135816960, - 2136121216, - 2136417536, - 2136706048, - 2136987136, - 2137260928, - 2137527552, - 2137787264, - 2138040192, - 2138286592, - 2138526464, - 2138760192, - 2138987776, - 2139209472, - 2139425408, - 2139635712, - 2139840512, - 2140039936, - 2140234240, - 2140423424, - 2140607744, - 2140787200, - 2140962048, - 2141132288, - 2141298048, - 2141459584, - 2141616896, - 2141769984, - 2141919232, - 2142064512, - 2142205952, - 2142343808, - 2142478080, - 2142608768, - 2142736128, - 2142860032, - 2142980864, - 2143098368, - 2143212928, - 2143324544, - 2143433088, - 2143538944, - 2143641984, - 2143742336, - 2143840000, - 2143935232, - 2144027904, - 2144118144, - 2144206080, - 2144291712, - 2144375168, - 2144456320, - 2144535424, - 2144612480, - 2144687488, - 2144760448, - 2144831616, - 2144900992, - 2144968448, - 2145034112, - 2145098112, - 2145160448, - 2145221248, - 2145280256, - 2145337856, - 2145393920, - 2145448576, - 2145501696, - 2145553536, - 2145603968, - 2145653120, - 2145700992, - 2145747456, - 2145792896, - 2145837056, - 2145880064, - 2145922048, - 2145962880, - 2146002560, - 2146041344, - 2146078976, - 2146115712, - 2146151424, - 2146186240, - 2146220160, - 2146253184, - 2146285312, - 2146316672, - 2146347136, - 2146376832, - 2146405760, - 2146433920, - 2146461440, - 2146488192, - 2146514176, - 2146539520, - 2146564224, - 2146588160, - 2146611584, - 2146634368, - 2146656640, - 2146678272, - 2146699264, - 2146719744, - 2146739712, - 2146759168, - 2146778112, - 2146796544, - 2146814464, - 2146832000, - 2146849024, - 2146865664, - }, - { - 2086555136, - 2088125824, - 2089656576, - 2091148416, - 2092602240, - 2094018944, - 2095399680, - 2096745088, - 2098056192, - 2099333888, - 2100578816, - 2101792000, - 2102974080, - 2104125824, - 2105248128, - 2106341760, - 2107407232, - 2108445440, - 2109456896, - 2110442496, - 2111402624, - 2112338176, - 2113249664, - 2114137728, - 2115002880, - 2115845760, - 2116666880, - 2117466880, - 2118246272, - 2119005568, - 2119745280, - 2120465920, - 2121167872, - 2121851776, - 2122517888, - 2123166976, - 2123799168, - 2124414976, - 2125014912, - 2125599360, - 2126168704, - 2126723200, - 2127263360, - 2127789568, - 2128302208, - 2128801408, - 2129287808, - 2129761536, - 2130222976, - 2130672512, - 2131110272, - 2131536768, - 2131952128, - 2132356736, - 2132750848, - 2133134720, - 2133508736, - 2133872896, - 2134227584, - 2134573184, - 2134909696, - 2135237504, - 2135556736, - 2135867648, - 2136170624, - 2136465536, - 2136752896, - 2137032832, - 2137305344, - 2137570816, - 2137829376, - 2138081280, - 2138326528, - 2138565504, - 2138798080, - 2139024768, - 2139245440, - 2139460480, - 2139669888, - 2139873792, - 2140072320, - 2140265856, - 2140454144, - 2140637696, - 2140816384, - 2140990464, - 2141159936, - 2141325056, - 2141485824, - 2141642368, - 2141794944, - 2141943424, - 2142088064, - 2142228992, - 2142366208, - 2142499840, - 2142630016, - 2142756736, - 2142880128, - 2143000448, - 2143117440, - 2143231488, - 2143342592, - 2143450752, - 2143556096, - 2143658624, - 2143758592, - 2143855872, - 2143950592, - 2144043008, - 2144132864, - 2144220416, - 2144305664, - 2144388608, - 2144469504, - 2144548224, - 2144624896, - 2144699648, - 2144772352, - 2144843264, - 2144912256, - 2144979328, - 2145044864, - 2145108480, - 2145170560, - 2145231104, - 2145289856, - 2145347200, - 2145403008, - 2145457408, - 2145510400, - 2145561984, - 2145612160, - 2145661056, - 2145708672, - 2145755136, - 2145800192, - 2145844224, - 2145887104, - 2145928832, - 2145969408, - 2146008960, - 2146047616, - 2146085120, - 2146121600, - 2146157184, - 2146191872, - 2146225664, - 2146258560, - 2146290560, - 2146321792, - 2146352128, - 2146381696, - 2146410496, - 2146438528, - 2146465920, - 2146492416, - 2146518400, - 2146543616, - 2146568192, - 2146592128, - 2146615424, - 2146638080, - 2146660224, - 2146681728, - 2146702720, - 2146723072, - 2146743040, - 2146762368, - 2146781184, - 2146799616, - 2146817408, - 2146834816, - 2146851840, - 2146868352, - 2146884352, - 2146900096, - 2146915328, - 2146930176, - 2146944640, - 2146958720, - 2146972416, - 2146985856, - 2146998784, - 2147011456, - 2147023872, - 2147035904, - 2147047552, - 2147058944, - 2147070080, - 2147080832, - 2147091456, - 2147101696, - 2147111680, - 2147121408, - 2147130880, - 2147140096, - 2147149056, - 2147157760, - 2147166336, - 2147174656, - }, - { - 2106670080, - 2107727232, - 2108757120, - 2109760640, - 2110738432, - 2111691008, - 2112619136, - 2113523328, - 2114404352, - 2115262592, - 2116098816, - 2116913408, - 2117707136, - 2118480256, - 2119233536, - 2119967360, - 2120682240, - 2121378688, - 2122057088, - 2122717952, - 2123361792, - 2123988992, - 2124599936, - 2125195136, - 2125774848, - 2126339584, - 2126889728, - 2127425536, - 2127947520, - 2128456064, - 2128951296, - 2129433856, - 2129903744, - 2130361600, - 2130807424, - 2131241728, - 2131664768, - 2132076928, - 2132478208, - 2132869248, - 2133250048, - 2133620992, - 2133982208, - 2134334080, - 2134676864, - 2135010688, - 2135335936, - 2135652608, - 2135961088, - 2136261504, - 2136554112, - 2136839168, - 2137116800, - 2137387136, - 2137650560, - 2137907072, - 2138156928, - 2138400256, - 2138637184, - 2138867968, - 2139092864, - 2139311744, - 2139524992, - 2139732736, - 2139934976, - 2140131968, - 2140323840, - 2140510720, - 2140692736, - 2140870016, - 2141042688, - 2141210752, - 2141374592, - 2141534080, - 2141689344, - 2141840640, - 2141987968, - 2142131456, - 2142271232, - 2142407424, - 2142539904, - 2142669056, - 2142794752, - 2142917248, - 2143036544, - 2143152640, - 2143265792, - 2143375872, - 2143483264, - 2143587712, - 2143689472, - 2143788544, - 2143885056, - 2143979136, - 2144070656, - 2144159872, - 2144246656, - 2144331264, - 2144413568, - 2144493824, - 2144571904, - 2144647936, - 2144722048, - 2144794240, - 2144864512, - 2144932864, - 2144999552, - 2145064448, - 2145127680, - 2145189248, - 2145249152, - 2145307520, - 2145364480, - 2145419776, - 2145473792, - 2145526272, - 2145577472, - 2145627264, - 2145675776, - 2145723008, - 2145768960, - 2145813760, - 2145857408, - 2145899904, - 2145941376, - 2145981696, - 2146020864, - 2146059136, - 2146096384, - 2146132608, - 2146167936, - 2146202368, - 2146235776, - 2146268416, - 2146300160, - 2146331136, - 2146361216, - 2146390528, - 2146419200, - 2146446976, - 2146474112, - 2146500480, - 2146526208, - 2146551168, - 2146575488, - 2146599296, - 2146622464, - 2146644864, - 2146666880, - 2146688128, - 2146708992, - 2146729216, - 2146748928, - 2146768128, - 2146786816, - 2146805120, - 2146822784, - 2146840064, - 2146856960, - 2146873344, - 2146889216, - 2146904832, - 2146919936, - 2146934656, - 2146948992, - 2146962944, - 2146976640, - 2146989824, - 2147002752, - 2147015296, - 2147027584, - 2147039488, - 2147051136, - 2147062400, - 2147073408, - 2147084160, - 2147094528, - 2147104768, - 2147114624, - 2147124352, - 2147133696, - 2147142912, - 2147151744, - 2147160448, - 2147168896, - 2147177088, - 2147185152, - 2147192960, - 2147200512, - 2147207936, - 2147215104, - 2147222144, - 2147229056, - 2147235712, - 2147242112, - 2147248384, - 2147254656, - 2147260544, - 2147266432, - 2147272064, - 2147277568, - }, - - - }; - - /*----------------------------------------------------------------------------------* - * Renderer SBA & MC enc/dec matrices + * EFAP ROM tables *----------------------------------------------------------------------------------*/ +const Word8 efap_poly_limit[MAX_OUTPUT_CHANNELS] = { + 22, 22, 22, 26, 30, 34, 36, 42, 42, 44, 47, 51, 52, 54, 54, 54 +}; /*----------------------------------------------------------------------------------* @@ -1643,6 +577,14 @@ const LS_CONVERSION_MATRIX_FX ls_conversion_cicp19_cicp16_fx[] = // Q30 }; /* Upmix matrices */ +const LS_CONVERSION_MATRIX_FX ls_conversion_mono_cicpX_fx[] = // Q30 +{ + /* First row indicates the number of non-zero elements and the number of matrix columns */ + {1, 12}, + /* Index of non-zero element, value of non-zero element*/ + {2, 1073741824}, +}; + const LS_CONVERSION_MATRIX_FX ls_conversion_cicp12_cicp14_fx[] = // Q30 { /* First row indicates the number of non-zero elements and the number of matrix columns */ @@ -1728,6 +670,7 @@ const LS_CONVERSION_MATRIX_FX ls_conversion_cicp16_cicp19_fx[] = // Q30 const LS_CONVERSION_MAPPING_FX ls_conversion_mapping_fx[LS_SETUP_CONVERSION_NUM_MAPPINGS] = { /* Dowmix mappings - NULL is a special case for MONO / STEREO downmix */ + {IVAS_AUDIO_CONFIG_STEREO, IVAS_AUDIO_CONFIG_MONO, NULL}, {IVAS_AUDIO_CONFIG_5_1, IVAS_AUDIO_CONFIG_MONO, NULL}, {IVAS_AUDIO_CONFIG_7_1, IVAS_AUDIO_CONFIG_MONO, NULL}, {IVAS_AUDIO_CONFIG_5_1_2, IVAS_AUDIO_CONFIG_MONO, NULL}, @@ -1755,6 +698,11 @@ const LS_CONVERSION_MAPPING_FX ls_conversion_mapping_fx[LS_SETUP_CONVERSION_NUM_ {IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_5_1_4, ls_conversion_cicp19_cicp16_fx}, /* Upmix mappings - NULL implies a 1:1 upmix */ + {IVAS_AUDIO_CONFIG_MONO, IVAS_AUDIO_CONFIG_5_1, ls_conversion_mono_cicpX_fx}, + {IVAS_AUDIO_CONFIG_MONO, IVAS_AUDIO_CONFIG_7_1, ls_conversion_mono_cicpX_fx}, + {IVAS_AUDIO_CONFIG_MONO, IVAS_AUDIO_CONFIG_5_1_2, ls_conversion_mono_cicpX_fx}, + {IVAS_AUDIO_CONFIG_MONO, IVAS_AUDIO_CONFIG_5_1_4, ls_conversion_mono_cicpX_fx}, + {IVAS_AUDIO_CONFIG_MONO, IVAS_AUDIO_CONFIG_7_1_4, ls_conversion_mono_cicpX_fx}, {IVAS_AUDIO_CONFIG_STEREO, IVAS_AUDIO_CONFIG_5_1, NULL}, {IVAS_AUDIO_CONFIG_STEREO, IVAS_AUDIO_CONFIG_7_1, NULL}, {IVAS_AUDIO_CONFIG_STEREO, IVAS_AUDIO_CONFIG_5_1_2, NULL}, diff --git a/lib_rend/ivas_rotation_fx.c b/lib_rend/ivas_rotation_fx.c index aebb80a54c4f6cc4d195e4020f05510704df22d1..4536b7b91f6a673038fc62c8ed8bab9211d3bc68 100644 --- a/lib_rend/ivas_rotation_fx.c +++ b/lib_rend/ivas_rotation_fx.c @@ -45,8 +45,14 @@ #include "debug.h" #include "ivas_rom_binaural_crend_head.h" -Word16 square_root16_table[] = { 0, 0x4000, 0x5A82 }; // Q14 -Word16 square_root30_q12[31] = { + +/*-----------------------------------------------------------------------* + * Local ROM tables + *-----------------------------------------------------------------------*/ + +static Word16 square_root16_table[] = { 0, 0x4000, 0x5A82 }; // Q14 + +static Word16 square_root30_q12[31] = { // Q12 0, 4096, @@ -80,22 +86,39 @@ Word16 square_root30_q12[31] = { 22058, 22435, }; + /*-----------------------------------------------------------------------* - * Local funtion declarations + * Local function declarations *-----------------------------------------------------------------------*/ -static ivas_error combine_external_and_head_orientations( - IVAS_QUATERNION *headRotQuaternions, - IVAS_VECTOR3 *listenerPos, - EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData ); -static void external_target_interpolation_fx( - EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, - const Word16 i ); +static ivas_error combine_external_and_head_orientations( IVAS_QUATERNION *headRotQuaternions, IVAS_VECTOR3 *listenerPos, ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis, EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData ); + +static void external_target_interpolation_fx( EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, const Word16 i ); static bool are_orientations_same_fx( const IVAS_QUATERNION *orientation1, const IVAS_QUATERNION *orientation2 ); + +/*-----------------------------------------------------------------------* + * function Q_factor_L_32() + * + * + *-----------------------------------------------------------------------*/ + +static Word16 Q_factor_L_32( + const Word32 x ) +{ + Word16 Q = 31; + + test(); + IF( GE_32( x, 1 ) || LE_32( x, -1 ) ) + { + Q = norm_l( L_abs( (Word32) x ) ); + } + + return Q; +} + + /*-----------------------------------------------------------------------* * ivas_headTrack_open() * @@ -140,6 +163,8 @@ ivas_error ivas_headTrack_open_fx( move32(); } + ( *hHeadTrackData )->sr_pose_pred_axis = DEFAULT_AXIS; + move32(); set32_fx( ( *hHeadTrackData )->chEneIIR_fx[0], 0, MASA_FREQUENCY_BANDS ); set32_fx( ( *hHeadTrackData )->chEneIIR_fx[1], 0, MASA_FREQUENCY_BANDS ); @@ -188,108 +213,72 @@ void QuatToRotMat_fx( Word32 Rmat[3][3] /* o : real-space rotation matrix for this rotation 2*Qx-32 */ ) { - Word32 w = quat.w_fx; // Qx - move32(); - Word32 x = quat.x_fx; - move32(); - Word32 y = quat.y_fx; - move32(); - Word32 z = quat.z_fx; - move32(); - // Adding a guard bit to squared terms since 2*x is not being done in those - // statements (R[0][0], R[1][1], R[2][2]). This is done to avoid L_shl. - Word32 ww = L_shr( Mpy_32_32( w, w ), 1 ); // 2 * Qx - 31 - 1 = 2*Qx-32 - Word32 xx = L_shr( Mpy_32_32( x, x ), 1 ); - Word32 yy = L_shr( Mpy_32_32( y, y ), 1 ); - Word32 zz = L_shr( Mpy_32_32( z, z ), 1 ); - - Word32 wx = Mpy_32_32( w, x ); // 2 * Qx - 31 - Word32 wz = Mpy_32_32( w, z ); - Word32 wy = Mpy_32_32( w, y ); + IF( EQ_32( quat.w_fx, L_negate( 12582912 ) ) ) + { + assert( 0 ); + // IVAS_QUATERNION quat_local; + // Euler2Quat_fx( deg2rad( quat.x_fx ), deg2rad( quat.y_fx ), deg2rad( quat.z_fx ), &quat_local ); + // QuatToRotMat_fx( quat_local, Rmat ); + } + ELSE + { + Word32 w = quat.w_fx; // Qx + move32(); + Word32 x = quat.x_fx; + move32(); + Word32 y = quat.y_fx; + move32(); + Word32 z = quat.z_fx; + move32(); - Word32 xy = Mpy_32_32( x, y ); - Word32 xz = Mpy_32_32( x, z ); + // Adding a guard bit to squared terms since 2*x is not being done in those + // statements (R[0][0], R[1][1], R[2][2]). This is done to avoid L_shl. + Word32 ww = L_shr( Mpy_32_32( w, w ), 1 ); // 2 * Qx - 31 - 1 = 2*Qx-32 + Word32 xx = L_shr( Mpy_32_32( x, x ), 1 ); + Word32 yy = L_shr( Mpy_32_32( y, y ), 1 ); + Word32 zz = L_shr( Mpy_32_32( z, z ), 1 ); - Word32 yz = Mpy_32_32( y, z ); + Word32 wx = Mpy_32_32( w, x ); // 2 * Qx - 31 + Word32 wz = Mpy_32_32( w, z ); + Word32 wy = Mpy_32_32( w, y ); - Rmat[0][0] = L_sub( L_sub( L_add( ww, xx ), yy ), zz ); // 2 * Qx - 31 - 1 = 2*Qx-32 - move32(); - Rmat[0][1] = L_sub( xy, wz ); - move32(); - Rmat[0][2] = L_add( xz, wy ); - move32(); + Word32 xy = Mpy_32_32( x, y ); + Word32 xz = Mpy_32_32( x, z ); - Rmat[1][0] = L_add( xy, wz ); // 2 * Qx - 32 - move32(); - Rmat[1][1] = L_sub( L_add( L_sub( ww, xx ), yy ), zz ); - move32(); - Rmat[1][2] = L_sub( yz, wx ); - move32(); - - Rmat[2][0] = L_sub( xz, wy ); // 2 * Qx - 32 - move32(); - Rmat[2][1] = L_add( yz, wx ); - move32(); - Rmat[2][2] = L_add( L_sub( L_sub( ww, xx ), yy ), zz ); - move32(); - - return; -} + Word32 yz = Mpy_32_32( y, z ); + Rmat[0][0] = L_sub( L_sub( L_add( ww, xx ), yy ), zz ); // 2 * Qx - 31 - 1 = 2*Qx-32 + move32(); + Rmat[0][1] = L_sub( xy, wz ); + move32(); + Rmat[0][2] = L_add( xz, wy ); + move32(); -void Euler2Quat_fx( - const Word32 yaw, /* i : yaw (x) Q22 */ - const Word32 pitch, /* i : pitch (y) Q22 */ - const Word32 roll, /* i : roll (z) Q22 */ - IVAS_QUATERNION *quat /* o : quaternion describing the rotation Q19 */ -) -{ - Word16 cr = getCosWord16( extract_l( L_shr_r( roll, 10 ) ) ); // Q14 - Word16 sr = getSinWord16( extract_l( L_shr_r( roll, 10 ) ) ); - Word16 cp = getCosWord16( extract_l( L_shr_r( pitch, 10 ) ) ); - Word16 sp = getSinWord16( extract_l( L_shr_r( pitch, 10 ) ) ); - Word16 cy = getCosWord16( extract_l( L_shr_r( yaw, 10 ) ) ); - Word16 sy = getSinWord16( extract_l( L_shr_r( yaw, 10 ) ) ); - quat->w_fx = L_shr_r( L_add( Mpy_32_16_1( L_mult0( cr, cp ), cy ), Mpy_32_16_1( L_mult0( sr, sp ), sy ) ), 5 ); // Q19 - move32(); - quat->x_fx = L_shr_r( L_sub( Mpy_32_16_1( L_mult0( sr, cp ), cy ), Mpy_32_16_1( L_mult0( cr, sp ), sy ) ), 5 ); // Q19 - move32(); - quat->y_fx = L_shr_r( L_add( Mpy_32_16_1( L_mult0( sr, cp ), sy ), Mpy_32_16_1( L_mult0( cr, sp ), cy ) ), 5 ); // Q19 - move32(); - quat->z_fx = L_shr_r( L_sub( Mpy_32_16_1( L_mult0( cr, cp ), sy ), Mpy_32_16_1( L_mult0( sr, sp ), cy ) ), 5 ); // Q19 - move32(); + Rmat[1][0] = L_add( xy, wz ); // 2 * Qx - 32 + move32(); + Rmat[1][1] = L_sub( L_add( L_sub( ww, xx ), yy ), zz ); + move32(); + Rmat[1][2] = L_sub( yz, wx ); + move32(); + Rmat[2][0] = L_sub( xz, wy ); // 2 * Qx - 32 + move32(); + Rmat[2][1] = L_add( yz, wx ); + move32(); + Rmat[2][2] = L_add( L_sub( L_sub( ww, xx ), yy ), zz ); + move32(); + } return; } -/*------------------------------------------------------------------------- - * deg2rad() - * - * Converts degrees to normalized radians - *------------------------------------------------------------------------*/ -Word32 deg2rad_fx( - Word32 degrees // Q23 -) -{ - WHILE( GE_32( degrees, DEGREE_180 ) ) - { - degrees = L_sub( degrees, DEGREE_360 ); - } - WHILE( LE_32( degrees, -DEGREE_180 ) ) - { - degrees = L_add( degrees, DEGREE_360 ); - } - - return Mpy_32_32( PI_OVER_180_FX, degrees ); // Q23 -} - /*------------------------------------------------------------------------- * rad2deg() * * Converts normalized radians to degrees *------------------------------------------------------------------------*/ + Word32 rad2deg_fx( Word32 radians // Q13 ) @@ -306,6 +295,8 @@ Word32 rad2deg_fx( return W_extract_l( W_mult0_32_32( radians, _180_OVER_PI_FX ) ); // Q23 } + + /*------------------------------------------------------------------------- * rotateAziEle() * @@ -587,7 +578,7 @@ void rotateAziEle_fx_frac_az_el( * Apply rotation to direction parameters azimuth and elevation *------------------------------------------------------------------------*/ -void rotateAziEle_fixed( +void rotateAziEle_fx32( Word16 azi_in, /* i : output elevation Q0 */ Word16 ele_in, /* i : input elevation Q0 */ Word32 *azi, /* o : rotated azimuth Q22 */ @@ -708,7 +699,6 @@ void rotateFrame_shd( const Word16 subframe_idx /* i : subframe index Q0 */ ) { - // Not yet tested, no test cases entering the function. Word16 i, l, n, m, offset; Word16 m1, m2; Word16 shd_rot_max_order; @@ -730,7 +720,7 @@ void rotateFrame_shd( move32(); BREAK; case L_SUBFRAME_32k: - tmp = Q31_BY_SUB_FRAME_180; + tmp = Q31_BY_NUM_SAMPLES_160; move32(); BREAK; case L_SUBFRAME_16k: @@ -757,8 +747,7 @@ void rotateFrame_shd( } /* calculate ambisonics rotation matrices for the previous and current frames */ - SHrotmatgen_fx( SHrotmat_prev, hCombinedOrientationData->Rmat_prev_fx, shd_rot_max_order ); - + SHrotmatgen_fx( SHrotmat_prev, hCombinedOrientationData->Rmat_prev_fx[0], shd_rot_max_order ); SHrotmatgen_fx( SHrotmat /*Q14*/, hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx], shd_rot_max_order ); FOR( i = 0; i < subframe_len; i++ ) @@ -817,9 +806,9 @@ void rotateFrame_shd( /* move Rmat to Rmat_prev */ FOR( i = 0; i < 3; i++ ) { - MVR2R_WORD32( + Copy32( hCombinedOrientationData->Rmat_fx[subframe_idx][i], - hCombinedOrientationData->Rmat_prev_fx[i], + hCombinedOrientationData->Rmat_prev_fx[0][i], 3 ); // Q14 } @@ -847,10 +836,10 @@ void rotateFrame_sd( Word32 azimuth_fx, elevation_fx; Word32 tmp = Q31_BY_SUB_FRAME_240; // Q31 Word32 out_temp; - Word32 tmp_gains_fx[MAX_CICP_CHANNELS - 1]; - Word32 gains_fx[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; - Word32 gains_prev_fx[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; - Word32 output_tmp_fx[MAX_CICP_CHANNELS][L_FRAME48k]; + Word32 tmp_gains_fx[MAX_LS_CHANNELS - 1]; + Word32 gains_fx[MAX_LS_CHANNELS][MAX_LS_CHANNELS]; + Word32 gains_prev_fx[MAX_LS_CHANNELS][MAX_LS_CHANNELS]; + Word32 output_tmp_fx[MAX_LS_CHANNELS][L_FRAME48k]; Word32 cross_fade_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; push_wmops( "rotateFrame_sd" ); @@ -868,7 +857,7 @@ void rotateFrame_sd( move32(); BREAK; case L_SUBFRAME_32k: - tmp = Q31_BY_SUB_FRAME_180; + tmp = Q31_BY_NUM_SAMPLES_160; move32(); BREAK; case L_SUBFRAME_16k: @@ -918,8 +907,7 @@ void rotateFrame_sd( } /* gains for previous subframe rotation */ - rotateAziEle_fx( extract_l( L_shr( hTransSetup.ls_azimuth_fx[ch_in_woLFE], Q22 ) ), extract_l( L_shr( hTransSetup.ls_elevation_fx[ch_in_woLFE], Q22 ) ), &azimuth, &elevation, hCombinedOrientationData->Rmat_prev_fx, hTransSetup.is_planar_setup ); - + rotateAziEle_fx( extract_l( L_shr( hTransSetup.ls_azimuth_fx[ch_in_woLFE], Q22 ) ), extract_l( L_shr( hTransSetup.ls_elevation_fx[ch_in_woLFE], Q22 ) ), &azimuth, &elevation, hCombinedOrientationData->Rmat_prev_fx[0], hTransSetup.is_planar_setup ); test(); test(); IF( hEFAPdata != NULL && ( NE_16( extract_l( L_shr( hTransSetup.ls_azimuth_fx[ch_in_woLFE], Q22 ) ), azimuth ) || NE_16( extract_l( L_shr( hTransSetup.ls_elevation_fx[ch_in_woLFE], Q22 ) ), elevation ) ) ) @@ -1011,26 +999,29 @@ void rotateFrame_sd( /* move Rmat to Rmat_prev */ FOR( i = 0; i < 3; i++ ) { - MVR2R_WORD32( + Copy32( hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx][i], // Q30 - hCombinedOrientationData->Rmat_prev_fx[i], + hCombinedOrientationData->Rmat_prev_fx[0][i], 3 ); } /* copy to output */ FOR( ch_out = 0; ch_out < nchan; ch_out++ ) { - MVR2R_WORD32( &output_tmp_fx[ch_out][offset], &output[ch_out][offset], subframe_len ); // Q11 + Copy32( &output_tmp_fx[ch_out][offset], &output[ch_out][offset], subframe_len ); // Q11 } pop_wmops(); return; } + + /*------------------------------------------------------------------------- * rotateFrame_shd_cldfb() * * Apply rotation to signals in Spherical Harmonic Domain and in CLDFB *------------------------------------------------------------------------*/ -void rotateFrame_shd_cldfb( + +void rotateFrame_shd_cldfb_fx( Word32 Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part Qx -> Qx-1 */ Word32 Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part Qx -> Qx-1 */ Word32 Rmat[3][3], /* i : real-space rotation matrix Q30 */ @@ -1046,7 +1037,6 @@ void rotateFrame_shd_cldfb( Word16 l = 0, m1 = 0, m2 = 0; Word32 realRot[2 * HEADROT_ORDER + 1], imagRot[2 * HEADROT_ORDER + 1]; Word16 SHrotmat[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM]; - Word32 temp1, temp2; move16(); move16(); move16(); @@ -1056,7 +1046,9 @@ void rotateFrame_shd_cldfb( move16(); move16(); move16(); - assert( nInChannels == HEADROT_SHMAT_DIM && "Number of channels must be 16!" ); + + assert( ( nInChannels == HOA3_CHANNELS || nInChannels == HOA2_CHANNELS || nInChannels == FOA_CHANNELS ) && + "Number of channels must correspond to an ambisonics order!" ); /* initialize rotation matrices with zeros */ FOR( i = 0; i < HEADROT_SHMAT_DIM; i++ ) @@ -1095,11 +1087,9 @@ void rotateFrame_shd_cldfb( move32(); FOR( m = m1; m < m2; m++ ) { - temp1 = Mpy_32_16_r( Cldfb_RealBuffer[m][i][iBand], SHrotmat[n][m] ); // Q(x + 14 - 15) - temp2 = Mpy_32_16_r( Cldfb_ImagBuffer[m][i][iBand], SHrotmat[n][m] ); // Q(x + 14 - 15) - realRot[n - m1] = L_add( temp1, realRot[n - m1] ); // Q(x + 14 - 15) + realRot[n - m1] = Madd_32_16_r( realRot[n - m1], Cldfb_RealBuffer[m][i][iBand], SHrotmat[n][m] ); // Q(x + 14 - 15) move32(); - imagRot[n - m1] = L_add( temp2, imagRot[n - m1] ); // Q(x + 14 - 15) + imagRot[n - m1] = Madd_32_16_r( imagRot[n - m1], Cldfb_ImagBuffer[m][i][iBand], SHrotmat[n][m] ); // Q(x + 14 - 15) move32(); } } @@ -1147,15 +1137,18 @@ void rotateFrame_shd_cldfb( move32(); } } + return; } + + /*------------------------------------------------------------------------- * rotateFrame_sd_cldfb() * * Apply rotation to signals in Spatial Domain and in CLDFB *------------------------------------------------------------------------*/ -void rotateFrame_sd_cldfb_fixed( +void rotateFrame_sd_cldfb_fx( Word32 Rmat_fx[3][3], /* i : real-space rotation matrix (Q30) */ Word32 Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part Qx */ Word32 Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part Qx */ @@ -1166,11 +1159,11 @@ void rotateFrame_sd_cldfb_fixed( ) { Word16 iBlock, iBand, m, n; - Word32 gains_fx[MAX_CICP_CHANNELS - 1][MAX_CICP_CHANNELS - 1]; + Word32 gains_fx[MAX_LS_CHANNELS - 1][MAX_LS_CHANNELS - 1]; Word16 azimuth, elevation; Word32 g1_fx; - Word32 realRot_fx[MAX_CICP_CHANNELS - 1][MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX]; - Word32 imagRot_fx[MAX_CICP_CHANNELS - 1][MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX]; + Word32 realRot_fx[MAX_LS_CHANNELS - 1][MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX]; + Word32 imagRot_fx[MAX_LS_CHANNELS - 1][MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX]; Word32 *p_realRot_fx, *p_imagRot_fx; Word32 *p_real_fx, *p_imag_fx; Word16 nInChannels; @@ -1200,6 +1193,7 @@ void rotateFrame_sd_cldfb_fixed( IF( hEFAPdata != NULL && ( NE_16( extract_l( L_shr( hOutputSetup->ls_azimuth_fx[n], Q22 ) ), azimuth ) || NE_16( extract_l( L_shr( hOutputSetup->ls_elevation_fx[n], Q22 ) ), elevation ) ) ) { efap_determine_gains_fx( hEFAPdata, gains_fx[n], L_shl( azimuth, Q22 ), L_shl( elevation, Q22 ), EFAP_MODE_EFAP ); + scale_sig32( gains_fx[n], hEFAPdata->numSpk, Q1 ); // gains_fx: Q31 } ELSE { @@ -1273,12 +1267,14 @@ void rotateFrame_sd_cldfb_fixed( return; } + /*-----------------------------------------------------------------------* - * ivas_external_orientation_open() + * ivas_external_orientation_open_fx() * * Allocate and initialize external orientation handle *-----------------------------------------------------------------------*/ -ivas_error ivas_external_orientation_open( + +ivas_error ivas_external_orientation_open_fx( EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData, /* o : external orientation handle */ const Word16 num_subframes /* i : number of subframes */ ) @@ -1296,6 +1292,7 @@ ivas_error ivas_external_orientation_open( move32(); identity.q_fact = 31; move16(); + /* Allocate handle */ IF( ( *hExtOrientationData = (EXTERNAL_ORIENTATION_HANDLE) malloc( sizeof( EXTERNAL_ORIENTATION_DATA ) ) ) == NULL ) { @@ -1303,6 +1300,7 @@ ivas_error ivas_external_orientation_open( } ( *hExtOrientationData )->num_subframes = num_subframes; move16(); + /* Enable head rotation and disable external orientation as default */ FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { @@ -1317,14 +1315,17 @@ ivas_error ivas_external_orientation_open( ( *hExtOrientationData )->Quaternions[i] = identity; } + return IVAS_ERR_OK; } + /*-----------------------------------------------------------------------* * ivas_external_orientation_close() * * Deallocate external orientation handle *-----------------------------------------------------------------------*/ + void ivas_external_orientation_close_fx( EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData /* i/o: external orientation handle */ ) @@ -1347,7 +1348,8 @@ void ivas_external_orientation_close_fx( * * Allocate and initialize combined orientation handle *-----------------------------------------------------------------------*/ -ivas_error ivas_combined_orientation_open( + +ivas_error ivas_combined_orientation_open_fx( COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* o : combined orientation handle */ const Word32 fs, /* i : sampling rate */ const Word16 num_subframes /* i : number of subframes */ @@ -1357,6 +1359,7 @@ ivas_error ivas_combined_orientation_open( Word16 j; IVAS_QUATERNION identity; IVAS_VECTOR3 origo; + Word16 pos_idx; identity.w_fx = ONE_IN_Q31; move32(); identity.x_fx = 0; @@ -1388,16 +1391,8 @@ ivas_error ivas_combined_orientation_open( move32(); ( *hCombinedOrientationData )->interpolationIncrement_fx = ONE_IN_Q30; // Q30 move32(); - IF( EQ_16( num_subframes, 1 ) ) - { - ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 2000; - move16(); - } - ELSE - { - ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 500; - move16(); - } + ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 500; + move16(); ( *hCombinedOrientationData )->lrSwitchedNext = 0; move16(); ( *hCombinedOrientationData )->lrSwitchedCurrent = 0; @@ -1408,7 +1403,17 @@ ivas_error ivas_combined_orientation_open( ( *hCombinedOrientationData )->isInterpolationOngoing = FALSE; move16(); ( *hCombinedOrientationData )->Quaternions_ext_interpolation_start = identity; + move32(); + move32(); + move32(); + move32(); + move16(); ( *hCombinedOrientationData )->Quaternions_ext_interpolation_target = identity; + move32(); + move32(); + move32(); + move32(); + move16(); /* Initialise orientations to identity */ FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) @@ -1416,7 +1421,17 @@ ivas_error ivas_combined_orientation_open( ( *hCombinedOrientationData )->enableCombinedOrientation[i] = 0; move16(); ( *hCombinedOrientationData )->Quaternions[i] = identity; + move32(); + move32(); + move32(); + move32(); + move16(); ( *hCombinedOrientationData )->listenerPos[i] = origo; + move32(); + move32(); + move32(); + move32(); + move16(); FOR( j = 0; j < 3; j++ ) { @@ -1426,23 +1441,47 @@ ivas_error ivas_combined_orientation_open( } } - FOR( j = 0; j < 3; j++ ) + FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) { - set32_fx( ( *hCombinedOrientationData )->Rmat_prev_fx[j], 0, 3 ); - ( *hCombinedOrientationData )->Rmat_prev_fx[j][j] = ONE_IN_Q30; - move32(); + FOR( j = 0; j < 3; j++ ) + { + set32_fx( ( *hCombinedOrientationData )->Rmat_prev_fx[pos_idx][j], 0, 3 ); + ( *hCombinedOrientationData )->Rmat_prev_fx[pos_idx][j][j] = ONE_IN_Q30; + move32(); + } } + ( *hCombinedOrientationData )->sr_pose_pred_axis = DEFAULT_AXIS; + ( *hCombinedOrientationData )->sr_low_res_flag = 0; + move32(); + move16(); + ( *hCombinedOrientationData )->Quaternion_prev_extOrientation = identity; + move32(); + move32(); + move32(); + move32(); + move16(); ( *hCombinedOrientationData )->Quaternion_frozen_ext = identity; + move32(); + move32(); + move32(); + move32(); + move16(); ( *hCombinedOrientationData )->Quaternion_frozen_head = identity; + move32(); + move32(); + move32(); + move32(); + move16(); set_zero_fx( ( *hCombinedOrientationData )->chEneIIR_fx[0], MASA_FREQUENCY_BANDS ); set_zero_fx( ( *hCombinedOrientationData )->chEneIIR_fx[1], MASA_FREQUENCY_BANDS ); set_zero_fx( ( *hCombinedOrientationData )->procChEneIIR_fx[0], MASA_FREQUENCY_BANDS ); set_zero_fx( ( *hCombinedOrientationData )->procChEneIIR_fx[1], MASA_FREQUENCY_BANDS ); - ( *hCombinedOrientationData )->q_chEneIIR = Q31; - move16(); - ( *hCombinedOrientationData )->q_procChEneIIR = Q31; - move16(); + set16_fx( ( *hCombinedOrientationData )->q_chEneIIR[0], Q31, MASA_FREQUENCY_BANDS ); + set16_fx( ( *hCombinedOrientationData )->q_chEneIIR[1], Q31, MASA_FREQUENCY_BANDS ); + set16_fx( ( *hCombinedOrientationData )->q_procChEneIIR[0], Q31, MASA_FREQUENCY_BANDS ); + set16_fx( ( *hCombinedOrientationData )->q_procChEneIIR[1], Q31, MASA_FREQUENCY_BANDS ); + ( *hCombinedOrientationData )->isExtOrientationFrozen = 0; move16(); ( *hCombinedOrientationData )->isHeadRotationFrozen = 0; @@ -1456,6 +1495,14 @@ ivas_error ivas_combined_orientation_open( ( *hCombinedOrientationData )->cur_subframe_samples_rendered = 0; move16(); + FOR( i = 0; i < ( 1 + IVAS_MAX_NUM_OBJECTS ); i++ ) + { + ( *hCombinedOrientationData )->isDiegeticInputPI[i] = TRUE; + move16(); + } + ( *hCombinedOrientationData )->isDiegeticInputPISet = FALSE; + move16(); + return IVAS_ERR_OK; } /*-----------------------------------------------------------------------* @@ -1493,6 +1540,7 @@ ivas_error combine_external_and_head_orientations_dec( COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ) { + ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis; IVAS_QUATERNION *pHeadRotQuaternion = NULL; IVAS_VECTOR3 *listenerPos = NULL; @@ -1500,9 +1548,16 @@ ivas_error combine_external_and_head_orientations_dec( { pHeadRotQuaternion = hHeadTrackData->Quaternions; listenerPos = hHeadTrackData->Pos; + sr_pose_pred_axis = hHeadTrackData->sr_pose_pred_axis; + move32(); } - return combine_external_and_head_orientations( pHeadRotQuaternion, listenerPos, - hExtOrientationData, hCombinedOrientationData ); + ELSE + { + sr_pose_pred_axis = DEFAULT_AXIS; + move32(); + } + + return combine_external_and_head_orientations( pHeadRotQuaternion, listenerPos, sr_pose_pred_axis, hExtOrientationData, hCombinedOrientationData ); } @@ -1518,17 +1573,20 @@ ivas_error combine_external_and_head_orientations_rend( COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ) { + ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis; IVAS_QUATERNION *headRotQuaternions = NULL; IVAS_VECTOR3 *listenerPos = NULL; Word16 i; - IF( hHeadTrackData != NULL ) + sr_pose_pred_axis = DEFAULT_AXIS; + move32(); + + IF( hHeadTrackData->headRotEnabled ) { - IF( hHeadTrackData->headRotEnabled ) - { - headRotQuaternions = hHeadTrackData->headPositions; - listenerPos = hHeadTrackData->Pos; - } + headRotQuaternions = hHeadTrackData->headPositions; + listenerPos = hHeadTrackData->Pos; + sr_pose_pred_axis = hHeadTrackData->sr_pose_pred_axis; + move32(); } ELSE IF( hExtOrientationData != NULL ) { @@ -1543,8 +1601,7 @@ ivas_error combine_external_and_head_orientations_rend( } } - return combine_external_and_head_orientations( headRotQuaternions, listenerPos, - hExtOrientationData, hCombinedOrientationData ); + return combine_external_and_head_orientations( headRotQuaternions, listenerPos, sr_pose_pred_axis, hExtOrientationData, hCombinedOrientationData ); } @@ -1554,9 +1611,11 @@ ivas_error combine_external_and_head_orientations_rend( * Combine the external orientations and the head orientation. * NOTE that the external orientations are inversed. *------------------------------------------------------------------------*/ + ivas_error combine_external_and_head_orientations( IVAS_QUATERNION *headRotQuaternions, /* i : quaternions for head rotation */ IVAS_VECTOR3 *listenerPos, /* i : listener position */ + ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis, /* i : split rend pose prediction axis */ EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ) @@ -1609,13 +1668,32 @@ ivas_error combine_external_and_head_orientations( hCombinedOrientationData->interpolationIncrement_fx = ONE_IN_Q30; move32(); hCombinedOrientationData->Quaternions_ext_interpolation_start = identity; + move32(); + move32(); + move32(); + move32(); + move16(); hCombinedOrientationData->Quaternions_ext_interpolation_target = identity; + move32(); + move32(); + move32(); + move32(); + move16(); FOR( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) { hCombinedOrientationData->enableCombinedOrientation[i] = 0; move16(); hCombinedOrientationData->Quaternions[i] = identity; + move32(); + move32(); + move32(); + move32(); + move16(); hCombinedOrientationData->listenerPos[i] = origo; + move32(); + move32(); + move32(); + move16(); FOR( j = 0; j < 3; j++ ) { @@ -1627,10 +1705,36 @@ ivas_error combine_external_and_head_orientations( } ELSE IF( hExtOrientationData == NULL && headRotQuaternions != NULL ) { - /* Head rotation only */ - FOR( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + /* Disable head rotation if diegetic PI data indicating non-diegetic audio is received */ + test(); + test(); + test(); + test(); + test(); + IF( hCombinedOrientationData->isDiegeticInputPISet && !hCombinedOrientationData->isDiegeticInputPI[0] && !hCombinedOrientationData->isDiegeticInputPI[1] && !hCombinedOrientationData->isDiegeticInputPI[2] && !hCombinedOrientationData->isDiegeticInputPI[3] && !hCombinedOrientationData->isDiegeticInputPI[4] ) { - hCombinedOrientationData->Quaternions[i] = headRotQuaternions[i]; + FOR( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + hCombinedOrientationData->Quaternions[i] = identity; + move32(); /* Copying full struct */ + move32(); + move32(); + move32(); + move16(); + } + } + ELSE + { + /* Head rotation only */ + FOR( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + hCombinedOrientationData->Quaternions[i] = headRotQuaternions[i]; + move32(); /* Copying full struct */ + move32(); + move32(); + move32(); + move16(); + } } } @@ -1645,6 +1749,11 @@ ivas_error combine_external_and_head_orientations( IF( NE_16( hCombinedOrientationData->isExtOrientationFrozen, 1 ) ) { hCombinedOrientationData->Quaternion_frozen_ext = hExtOrientationData->Quaternions[i]; + move32(); + move32(); + move32(); + move32(); + move16(); hCombinedOrientationData->isExtOrientationFrozen = 1; move16(); } @@ -1652,11 +1761,16 @@ ivas_error combine_external_and_head_orientations( ELSE { hCombinedOrientationData->Quaternion_frozen_ext = identity; + move32(); + move32(); + move32(); + move32(); + move16(); hCombinedOrientationData->isExtOrientationFrozen = 0; move16(); } test(); - IF( EQ_16( hExtOrientationData->enableRotationInterpolation[i], 1 ) && hExtOrientationData->enableExternalOrientation[i] > 0 ) + IF( EQ_16( hExtOrientationData->enableRotationInterpolation[i], 1 ) && GT_16( hExtOrientationData->enableExternalOrientation[i], 0 ) ) { test(); test(); @@ -1722,15 +1836,26 @@ ivas_error combine_external_and_head_orientations( IF( EQ_16( hExtOrientationData->enableExternalOrientation[i], 1 ) ) { hCombinedOrientationData->Quaternions[i] = hExtOrientationData->Quaternions[i]; + move32(); + move32(); + move32(); + move32(); + move16(); } /* Use the freezed external orientation */ ELSE IF( EQ_16( hExtOrientationData->enableExternalOrientation[i], 2 ) ) { hCombinedOrientationData->Quaternions[i] = hCombinedOrientationData->Quaternion_frozen_ext; + move32(); + move32(); + move32(); + move32(); + move16(); } } } } + test(); IF( hExtOrientationData != NULL && headRotQuaternions != NULL ) { @@ -1743,6 +1868,11 @@ ivas_error combine_external_and_head_orientations( IF( NE_16( hCombinedOrientationData->isHeadRotationFrozen, 1 ) ) { hCombinedOrientationData->Quaternion_frozen_head = headRotQuaternions[i]; + move32(); + move32(); + move32(); + move32(); + move16(); hCombinedOrientationData->isHeadRotationFrozen = 1; move16(); } @@ -1750,41 +1880,76 @@ ivas_error combine_external_and_head_orientations( ELSE { hCombinedOrientationData->Quaternion_frozen_head = identity; + move32(); + move32(); + move32(); + move32(); + move16(); hCombinedOrientationData->isHeadRotationFrozen = 0; move16(); } - /* Use the most recent head rotation */ - IF( EQ_16( hExtOrientationData->enableHeadRotation[i], 1 ) ) + + /* Disable head rotation if diegetic PI data indicating non-diegetic audio is received */ + test(); + test(); + test(); + test(); + test(); + IF( hCombinedOrientationData->isDiegeticInputPISet && !hCombinedOrientationData->isDiegeticInputPI[0] && !hCombinedOrientationData->isDiegeticInputPI[1] && !hCombinedOrientationData->isDiegeticInputPI[2] && !hCombinedOrientationData->isDiegeticInputPI[3] && !hCombinedOrientationData->isDiegeticInputPI[4] ) { - IF( hExtOrientationData->enableExternalOrientation[i] > 0 ) - { - QuaternionProduct_fx( hCombinedOrientationData->Quaternions[i], headRotQuaternions[i], &hCombinedOrientationData->Quaternions[i] ); - } - ELSE - { - hCombinedOrientationData->Quaternions[i] = headRotQuaternions[i]; - } + CONTINUE; } - /* Use the freezed head rotation */ - ELSE IF( EQ_16( hExtOrientationData->enableHeadRotation[i], 2 ) ) + ELSE { - IF( hExtOrientationData->enableExternalOrientation[i] > 0 ) + /* Use the most recent head rotation */ + IF( EQ_16( hExtOrientationData->enableHeadRotation[i], 1 ) ) { - QuaternionProduct_fx( hCombinedOrientationData->Quaternions[i], hCombinedOrientationData->Quaternion_frozen_head, &hCombinedOrientationData->Quaternions[i] ); + IF( GT_16( hExtOrientationData->enableExternalOrientation[i], 0 ) ) + { + QuaternionProduct_fx( hCombinedOrientationData->Quaternions[i], headRotQuaternions[i], &hCombinedOrientationData->Quaternions[i] ); + } + ELSE + { + hCombinedOrientationData->Quaternions[i] = headRotQuaternions[i]; + move32(); /* Copying full struct */ + move32(); + move32(); + move32(); + move16(); + } } - ELSE + /* Use the freezed head rotation */ + ELSE IF( EQ_16( hExtOrientationData->enableHeadRotation[i], 2 ) ) { - hCombinedOrientationData->Quaternions[i] = hCombinedOrientationData->Quaternion_frozen_head; + IF( hExtOrientationData->enableExternalOrientation[i] > 0 ) + { + QuaternionProduct_fx( hCombinedOrientationData->Quaternions[i], hCombinedOrientationData->Quaternion_frozen_head, &hCombinedOrientationData->Quaternions[i] ); + } + ELSE + { + hCombinedOrientationData->Quaternions[i] = hCombinedOrientationData->Quaternion_frozen_head; + move32(); /* Copying full struct */ + move32(); + move32(); + move32(); + move16(); + } } } /* Reset the combined orientations to identity */ test(); - if ( hExtOrientationData->enableHeadRotation[i] == 0 && hExtOrientationData->enableExternalOrientation[i] == 0 ) + IF( hExtOrientationData->enableHeadRotation[i] == 0 && hExtOrientationData->enableExternalOrientation[i] == 0 ) { hCombinedOrientationData->Quaternions[i] = identity; + move32(); + move32(); + move32(); + move32(); + move16(); } } } + test(); IF( headRotQuaternions != NULL || hExtOrientationData != NULL ) { @@ -1798,22 +1963,38 @@ ivas_error combine_external_and_head_orientations( /* Save the current orientations */ IF( hExtOrientationData != NULL ) { - IF( hExtOrientationData->enableExternalOrientation[hExtOrientationData->num_subframes - 1] > 0 ) + IF( GT_16( hExtOrientationData->enableExternalOrientation[hExtOrientationData->num_subframes - 1], 0 ) ) { hCombinedOrientationData->Quaternion_prev_extOrientation = hExtOrientationData->Quaternions[hExtOrientationData->num_subframes - 1]; + move32(); + move32(); + move32(); + move32(); + move16(); } ELSE { hCombinedOrientationData->Quaternion_prev_extOrientation = identity; + move32(); + move32(); + move32(); + move32(); + move16(); } } + IF( headRotQuaternions != NULL ) { FOR( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) { hCombinedOrientationData->listenerPos[i] = listenerPos[i]; + move32(); + move32(); + move32(); + move16(); } } + /* Check if combined orientation is enabled */ test(); test(); @@ -1904,6 +2085,24 @@ ivas_error combine_external_and_head_orientations( hCombinedOrientationData->Quaternions[i].q_fact = add( hCombinedOrientationData->Quaternions[i].q_fact, l_shift ); move16(); } + + hCombinedOrientationData->sr_pose_pred_axis = sr_pose_pred_axis; + move32(); + + /* Reset external orientations */ + IF( hExtOrientationData != NULL ) + { + FOR( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + hExtOrientationData->Quaternions[i] = identity; + move32(); + move32(); + move32(); + move32(); + move16(); + } + } + return IVAS_ERR_OK; } @@ -1933,48 +2132,74 @@ static void external_target_interpolation_fx( /* Set the received orientation as the target */ hCombinedOrientationData->Quaternions_ext_interpolation_target = hExtOrientationData->Quaternions[i]; + move32(); + move32(); + move32(); + move32(); + move16(); /* Use the most recent external orientation as the starting orientation */ IF( EQ_16( hExtOrientationData->enableExternalOrientation[i], 1 ) ) { - IF( i > 0 ) + IF( GT_16( i, 0 ) ) { IF( hExtOrientationData->enableExternalOrientation[i - 1] == 0 ) { - IVAS_QUATERNION identity; - identity.w_fx = ONE_IN_Q31; + /* Set to identity */ + hCombinedOrientationData->Quaternions_ext_interpolation_start.w_fx = ONE_IN_Q31; + hCombinedOrientationData->Quaternions_ext_interpolation_start.x_fx = 0; + hCombinedOrientationData->Quaternions_ext_interpolation_start.y_fx = 0; + hCombinedOrientationData->Quaternions_ext_interpolation_start.z_fx = 0; + hCombinedOrientationData->Quaternions_ext_interpolation_start.q_fact = 31; move32(); - identity.x_fx = identity.y_fx = identity.z_fx = 0; move32(); move32(); move32(); - identity.q_fact = 31; move16(); - hCombinedOrientationData->Quaternions_ext_interpolation_start = identity; } ELSE IF( EQ_16( hExtOrientationData->enableExternalOrientation[i - 1], 2 ) ) { hCombinedOrientationData->Quaternions_ext_interpolation_start = hCombinedOrientationData->Quaternion_frozen_ext; + move32(); + move32(); + move32(); + move32(); + move16(); } ELSE { hCombinedOrientationData->Quaternions_ext_interpolation_start = hExtOrientationData->Quaternions[i - 1]; + move32(); + move32(); + move32(); + move32(); + move16(); } } ELSE { hCombinedOrientationData->Quaternions_ext_interpolation_start = hCombinedOrientationData->Quaternion_prev_extOrientation; + move32(); + move32(); + move32(); + move32(); + move16(); } } ELSE IF( EQ_16( hExtOrientationData->enableExternalOrientation[i], 2 ) ) { hCombinedOrientationData->Quaternions_ext_interpolation_start = hCombinedOrientationData->Quaternion_frozen_ext; + move32(); + move32(); + move32(); + move32(); + move16(); } Word16 tmp_e = 0; move16(); Word32 tmp; /* Calculate the interpolation increment and coefficient */ - tmp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, L_shl( L_deposit_l( hExtOrientationData->numFramesToTargetOrientation[i] ), 2 ), &tmp_e ); + tmp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, L_shl( L_deposit_l( hExtOrientationData->numFramesToTargetOrientation[i] ), 2 ), &tmp_e ); hCombinedOrientationData->interpolationIncrement_fx = L_shl( tmp, sub( tmp_e, 31 ) ); /* Q30 */ move32(); hCombinedOrientationData->interpolationCoefficient_fx = hCombinedOrientationData->interpolationIncrement_fx; @@ -2212,7 +2437,7 @@ static Word32 SHrot_w_fx( IF( m == 0 ) { - printf( "ERROR should not be called\n" ); + assert( 0 && "ERROR should not be called\n" ); return 0; } ELSE @@ -2271,12 +2496,10 @@ void SHrotmatgen_fx( Word16 R_lm1[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM]; -#ifdef MSAN_FIX FOR( i = 0; i < HEADROT_SHMAT_DIM; i++ ) { set16_fx( R_lm1[i], 0, HEADROT_SHMAT_DIM ); } -#endif Word16 R_l[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM]; Word32 result; SHrotmat[0][0] = ONE_IN_Q14; @@ -2412,7 +2635,7 @@ void ivas_combined_orientation_update_index( Word16 exp, div_result; IF( hCombinedOrientationData != NULL ) { - IF( EQ_16( hCombinedOrientationData->num_subframes, 1 ) ) + IF( EQ_16( hCombinedOrientationData->num_subframes, 1 ) || hCombinedOrientationData->sr_low_res_flag ) { /* only one orientation available anyway or split rendering with low resolution*/ hCombinedOrientationData->subframe_idx = 0; @@ -2469,7 +2692,7 @@ void ivas_combined_orientation_update_start_index( { IF( hCombinedOrientationData != NULL ) { - IF( EQ_16( hCombinedOrientationData->num_subframes, 1 ) ) + IF( EQ_16( hCombinedOrientationData->num_subframes, 1 ) || hCombinedOrientationData->sr_low_res_flag ) { /* only one orientation available anyway or split rendering with low resolution*/ hCombinedOrientationData->subframe_idx = 0; diff --git a/lib_rend/ivas_sba_rendering_fx.c b/lib_rend/ivas_sba_rendering_fx.c index 5e097ab2bedc0622f73dbcc03bdb1431c21aeeab..ff077e63ebe85d22865a09c14b7d8548f9826f49 100644 --- a/lib_rend/ivas_sba_rendering_fx.c +++ b/lib_rend/ivas_sba_rendering_fx.c @@ -87,7 +87,7 @@ void ivas_sba_prototype_renderer_fx( Word16 norm_q = 31; // to handle overflow move16(); - FOR( Word16 i = 0; i < 6; i++ ) + FOR( Word16 i = 0; i < 2; i++ ) { FOR( Word16 j = 0; j < CLDFB_SLOTS_PER_SUBFRAME; j++ ) { @@ -95,22 +95,22 @@ void ivas_sba_prototype_renderer_fx( } } norm_q = sub( sub( 31, norm_q ), 2 ); // to handle overflow - Word16 q_inp[6][CLDFB_SLOTS_PER_SUBFRAME]; - FOR( Word16 i = 0; i < 6; i++ ) + Word16 q_inp[2][CLDFB_SLOTS_PER_SUBFRAME]; + FOR( Word16 i = 0; i < 2; i++ ) { FOR( Word16 j = 0; j < CLDFB_SLOTS_PER_SUBFRAME; j++ ) { - q_inp[i][j] = s_min( L_norm_arr( inRe_fx[i][j], CLDFB_NO_CHANNELS_MAX ), L_norm_arr( inIm_fx[i][j], CLDFB_NO_CHANNELS_MAX ) ); + q_inp[i][j] = s_min( L_norm_arr( inRe_fx[i][j], num_cldfb_bands ), L_norm_arr( inIm_fx[i][j], num_cldfb_bands ) ); move16(); norm_q = s_min( q_inp[i][j], norm_q ); } } - FOR( Word16 i = 0; i < 6; i++ ) + FOR( Word16 i = 0; i < 2; i++ ) { FOR( Word16 j = 0; j < CLDFB_SLOTS_PER_SUBFRAME; j++ ) { - scale_sig32( inRe_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q - scale_sig32( inIm_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q + scale_sig32( inRe_fx[i][j], num_cldfb_bands, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q + scale_sig32( inIm_fx[i][j], num_cldfb_bands, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q q_cldfb[i][j] = sub( add( q_cldfb[i][j], norm_q ), 2 ); move16(); } @@ -178,12 +178,12 @@ void ivas_sba_prototype_renderer_fx( FOR( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) { /* accumulate contributions from all SPAR bands */ - cldfb_par_fx = L_add( cldfb_par_fx, Mpy_32_32( mixer_mat_fx[out_ch][in_ch][spar_band], bin2band->pp_cldfb_weights_per_spar_band_fx[cldfb_band][spar_band] ) ); // hMdDec->Q_mixer_matrix + cldfb_par_fx = Madd_32_32( cldfb_par_fx, mixer_mat_fx[out_ch][in_ch][spar_band], L_shl_sat( bin2band->pp_cldfb_weights_per_spar_band_fx[cldfb_band][spar_band], 9 ) ); // hMdDec->Q_mixer_matrix } } - out_re_fx[out_ch] = L_add( out_re_fx[out_ch], Mpy_32_32( inRe_fx[in_ch][ts][cldfb_band], cldfb_par_fx ) ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 - out_im_fx[out_ch] = L_add( out_im_fx[out_ch], Mpy_32_32( inIm_fx[in_ch][ts][cldfb_band], cldfb_par_fx ) ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 + out_re_fx[out_ch] = Madd_32_32( out_re_fx[out_ch], inRe_fx[in_ch][ts][cldfb_band], cldfb_par_fx ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 + out_im_fx[out_ch] = Madd_32_32( out_im_fx[out_ch], inIm_fx[in_ch][ts][cldfb_band], cldfb_par_fx ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 move32(); move32(); } @@ -242,29 +242,32 @@ void ivas_sba_prototype_renderer_fx( { IF( EQ_16( st_ivas->nchan_transport, 1 ) ) /* Dual mono */ { - Copy32( inRe_fx[0][ts], inRe_fx[1][ts], CLDFB_NO_CHANNELS_MAX ); - Copy32( inIm_fx[0][ts], inIm_fx[1][ts], CLDFB_NO_CHANNELS_MAX ); + Copy32( inRe_fx[0][ts], inRe_fx[1][ts], num_cldfb_bands ); + Copy32( inIm_fx[0][ts], inIm_fx[1][ts], num_cldfb_bands ); } ELSE IF( EQ_16( st_ivas->nchan_transport, 2 ) ) /* Opposing cardioids */ { - Word32 temp_signal_fx[CLDFB_NO_CHANNELS_MAX]; - FOR( Word16 idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) + Word32 temp_signal_fx; + FOR( Word16 idx = 0; idx < num_cldfb_bands; idx++ ) { - temp_signal_fx[idx] = L_add( L_shr( inRe_fx[0][ts][idx], 1 ), L_shr( inRe_fx[1][ts][idx], 1 ) ); // q_cldfb[][]-1 + Word32 op1 = L_shr( inRe_fx[0][ts][idx], 1 ); + Word32 op2 = L_shr( inRe_fx[1][ts][idx], 1 ); + temp_signal_fx = L_add( op1, op2 ); // q_cldfb[][]-1 + inRe_fx[1][ts][idx] = L_sub( op1, op2 ); // q_cldfb[][]-1 move32(); - inRe_fx[1][ts][idx] = L_sub( L_shr( inRe_fx[0][ts][idx], 1 ), L_shr( inRe_fx[1][ts][idx], 1 ) ); // q_cldfb[][]-1 - move32(); - inRe_fx[0][ts][idx] = temp_signal_fx[idx]; + inRe_fx[0][ts][idx] = temp_signal_fx; move32(); } - FOR( Word16 idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) + FOR( Word16 idx = 0; idx < num_cldfb_bands; idx++ ) { - temp_signal_fx[idx] = L_add( L_shr( inIm_fx[0][ts][idx], 1 ), L_shr( inIm_fx[1][ts][idx], 1 ) ); // q_cldfb[][]-1 + Word32 op1 = L_shr( inIm_fx[0][ts][idx], 1 ); + Word32 op2 = L_shr( inIm_fx[1][ts][idx], 1 ); + temp_signal_fx = L_add( op1, op2 ); // q_cldfb[][]-1 move32(); - inIm_fx[1][ts][idx] = L_sub( L_shr( inIm_fx[0][ts][idx], 1 ), L_shr( inIm_fx[1][ts][idx], 1 ) ); // q_cldfb[][]-1 + inIm_fx[1][ts][idx] = L_sub( op1, op2 ); // q_cldfb[][]-1 move32(); - inIm_fx[0][ts][idx] = temp_signal_fx[idx]; + inIm_fx[0][ts][idx] = temp_signal_fx; move32(); } } diff --git a/lib_rend/ivas_shoebox_fx.c b/lib_rend/ivas_shoebox_fx.c index 1a449608514d6b43f24e555615ce802960bc1044..36af55838b6dcbb024b46d75b7bfaf320a90ebc8 100644 --- a/lib_rend/ivas_shoebox_fx.c +++ b/lib_rend/ivas_shoebox_fx.c @@ -35,11 +35,11 @@ #include #include "ivas_prot_rend_fx.h" #include "ivas_stat_rend.h" +#include "ivas_prot_fx.h" #include "ivas_cnst.h" #include "prot_fx.h" #include "wmc_auto.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" /*------------------------------------------------------------------------- @@ -387,7 +387,7 @@ static Word32 shoebox_get_euclidian_distance_internal_fx( { q = Q22; move16(); - t = (Word32) BASOP_Util_Divide3232_Scale_cadence( *scale, absxk, &q ); + t = (Word32) BASOP_Util_Divide3232_Scale_newton( *scale, absxk, &q ); out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 @@ -397,7 +397,7 @@ static Word32 shoebox_get_euclidian_distance_internal_fx( } ELSE { - t = (Word32) BASOP_Util_Divide3232_Scale_cadence( absxk, *scale, &q ); + t = (Word32) BASOP_Util_Divide3232_Scale_newton( absxk, *scale, &q ); t = W_extract_h( W_shl( W_mult_32_32( t, t ), sub( shl( q, 1 ), 9 ) ) ); // Q31 + Q31 + Q1 - 9 - 32 = Q22 out_tmp = L_add( out_tmp, t ); // Q22 move32(); @@ -407,7 +407,7 @@ static Word32 shoebox_get_euclidian_distance_internal_fx( IF( GE_32( absxk, *scale ) ) { - t = (Word32) BASOP_Util_Divide3232_Scale_cadence( *scale, absxk, &q ); + t = (Word32) BASOP_Util_Divide3232_Scale_newton( *scale, absxk, &q ); out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 @@ -417,7 +417,7 @@ static Word32 shoebox_get_euclidian_distance_internal_fx( } ELSE { - t = (Word32) BASOP_Util_Divide3232_Scale_cadence( absxk, *scale, &q ); + t = (Word32) BASOP_Util_Divide3232_Scale_newton( absxk, *scale, &q ); t = W_extract_h( W_shl( W_mult_32_32( t, t ), sub( shl( q, 1 ), 9 ) ) ); // Q31 + Q31 + Q1 - 9 - 32 = Q22 out_tmp = L_add( out_tmp, t ); // Q22 } diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 386644ab1ce29b862569abed0a3b87ea0d70b0c0..d84a00a1b9f3b9fb2dd2b5b3c9784d24fecd0043 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -33,13 +33,14 @@ #ifndef IVAS_STAT_REND_H #define IVAS_STAT_REND_H +#include "stl.h" #include #include "options.h" #include "ivas_cnst.h" #include "ivas_stat_com.h" // note: needed for DIRAC_DEC_BIN_HANDLE until #156 is solved #include "stat_com.h" /* Note: Currently needed for CLDFB. */ #include "common_api_types.h" - +#include "isar_stat.h" /*----------------------------------------------------------------------------------* * Output configuration for renderer (e.g. DirAC, MASA, Binaural Renderer...) @@ -120,8 +121,8 @@ typedef struct dirac_decorr_params_structure Word16 *pre_delay; Word16 *filter_length; - Word16 *filter_coeff_num_real_fx; /* Q12 */ - Word16 *filter_coeff_den_real_fx; /* Q12 */ + Word32 *filter_coeff_num_real_fx; /* Q28 */ + Word32 *filter_coeff_den_real_fx; /* Q28 */ Word16 *phase_coeff_real_fx; /* Q14 */ Word16 *phase_coeff_imag_fx; /* Q14 */ Word16 *split_frequency_bands; @@ -228,8 +229,8 @@ typedef struct dirac_dec_stack_mem Word32 *cy_auto_diff_smooth_fx; Word32 *reference_power_fx; - Word16 reference_power_q; - Word16 reference_power_smooth_q; + Word16 reference_power_q[2]; + Word16 reference_power_smooth_q[2]; Word16 reference_power_len; Word32 *onset_filter_fx; /* Q31 */ @@ -262,22 +263,11 @@ typedef struct dirac_output_synthesis_state_structure /* only pointer to local buffers */ Word32 *diffuse_responses_square_fx; /* squared diffuse responses. Size: num_channels. */ /* Q31 */ - /* only pointer to local buffers */ - - - /* only pointer to local buffers */ - - /* Output gain memories */ - - /* only pointer to local buffers */ - - /* PSD memories */ - const Word32 *onset_filter_fx; /* Q31 */ /* Temporal smoothing memories */ Word32 *reference_power_smooth_prev_fx; /* Q(reference_power_smooth_prev_q) */ - Word16 reference_power_smooth_prev_q; + Word16 reference_power_smooth_prev_q[2]; Word32 *direction_smoothness_prev_fx; /* Q31 */ /* only pointer to local buffers */ @@ -295,10 +285,10 @@ typedef struct dirac_output_synthesis_state_structure Word16 diff_dir_power_factor_len; Word32 *proto_power_smooth_fx; /* Smoothed power of the prototype signals. Size: num_freq_bands*num_channels. */ - Word16 proto_power_smooth_q; + Word16 proto_power_smooth_q[2]; Word16 proto_power_smooth_len; Word32 *proto_power_smooth_prev_fx; /* Smoothed power of the prototype signals of the previous synthesis block. Size: num_freq_bands*num_channels. */ - Word16 proto_power_smooth_prev_q; + Word16 proto_power_smooth_prev_q[2]; Word16 proto_power_smooth_prev_len; Word32 *proto_power_diff_smooth_fx; @@ -335,6 +325,8 @@ typedef struct dirac_output_synthesis_state_structure Word16 q_cy_cross_dir_smooth; /* Target cross PSD of direct sound. Size: num_freq_bands*num_channels. */ Word16 q_cy_auto_diff_smooth; /* Target auto PSD of diffuse sound. Size: num_freq_bands*num_channels. */ + Word16 *Q_temp_cy_cross_dir_smooth_fx; + Word16 cy_auto_dir_smooth_len; /* Target auto PSD of direct sound. Size: num_freq_bands*num_channels. */ Word16 cy_cross_dir_smooth_len; /* Target cross PSD of direct sound. Size: num_freq_bands*num_channels. */ Word16 cy_auto_diff_smooth_len; /* Target auto PSD of diffuse sound. Size: num_freq_bands*num_channels. */ @@ -378,9 +370,9 @@ typedef struct Word16 q_total_hi_power; Word32 sum_power_fx[MASA_SUM_FREQ_RANGE_BINS]; /* Q(q_sum_power) */ - Word16 q_sum_power; + Word16 exp_sum_power[MASA_SUM_FREQ_RANGE_BINS]; Word32 total_power_fx[MASA_SUM_FREQ_RANGE_BINS]; /* Q(q_total_power) */ - Word16 q_total_power; + Word16 exp_total_power[MASA_SUM_FREQ_RANGE_BINS]; Word32 subtract_power_y_fx; /* Q(q_subtract_power_y) */ Word16 q_subtract_power_y; @@ -516,7 +508,6 @@ typedef struct triplet_search_structure } VBAP_SEARCH_STRUCT; - /* VBAP data structure. Contains the formed virtual surface arrangement * and supporting data. */ typedef struct vbap_data_structure { @@ -533,6 +524,7 @@ typedef struct vbap_data_structure Word16 *object_mode_bottom_virtual_speaker_node_division_gains_fx; /* Q16 */ Word16 *object_mode_top_virtual_speaker_node_division_gains_fx; /* Q16 */ Word16 *object_mode_back_virtual_speaker_node_division_gains_fx; /* Q16 */ + } VBAP_DATA, *VBAP_HANDLE; @@ -545,8 +537,8 @@ typedef struct ivas_binaural_reverb_struct { Word32 *loopBufReal_fx[CLDFB_NO_CHANNELS_MAX]; Word32 *loopBufImag_fx[CLDFB_NO_CHANNELS_MAX]; - Word32 preDelayBufferReal_fx[REVERB_PREDELAY_MAX + 1][CLDFB_NO_CHANNELS_MAX]; - Word32 preDelayBufferImag_fx[REVERB_PREDELAY_MAX + 1][CLDFB_NO_CHANNELS_MAX]; + Word32 preDelayBufferReal_fx[IVAS_REVERB_PREDELAY_MAX + 1][CLDFB_NO_CHANNELS_MAX]; + Word32 preDelayBufferImag_fx[IVAS_REVERB_PREDELAY_MAX + 1][CLDFB_NO_CHANNELS_MAX]; Word32 **tapPointersReal_fx[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; Word32 **tapPointersImag_fx[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; @@ -587,6 +579,16 @@ typedef struct ivas_diffuse_distribution_data_structure } DIFFUSE_DISTRIBUTION_DATA, *DIFFUSE_DISTRIBUTION_HANDLE; +typedef struct ivas_hrtf_parambin_struct +{ + Word16 hrtfShCoeffsRe_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ + Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ + + Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q26 */ + Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ + Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; /* Q28 */ + +} HRTFS_PARAMBIN, *HRTFS_PARAMBIN_HANDLE; /* Parametric binaural data structure */ typedef struct ivas_dirac_dec_binaural_data_structure @@ -651,12 +653,15 @@ typedef struct ivas_dirac_dec_binaural_data_structure ivas_td_decorr_state_t *hTdDecorr; Word16 reqularizationFactor_fx; /* Q14 */ + HRTFS_PARAMBIN_HANDLE *phHrtfParambin; + DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist; HANDLE_DIRAC_DECORR_PARAMS h_freq_domain_decorr_ap_params; HANDLE_DIRAC_DECORR_STATE h_freq_domain_decorr_ap_state; } DIRAC_DEC_BIN_DATA, *DIRAC_DEC_BIN_HANDLE; + typedef struct ivas_binaural_rendering_conv_module_struct_fx { Word32 ***filterTapsLeftReal_fx; @@ -664,19 +669,15 @@ typedef struct ivas_binaural_rendering_conv_module_struct_fx Word32 ***filterTapsRightReal_fx; Word32 ***filterTapsRightImag_fx; - Word32 ***filterStatesLeftReal_fx; - Word32 ***filterStatesLeftImag_fx; -#ifdef OPT_BASOP_ADD_v1 - Word16 Q_filterStatesLeft; -#else /* OPT_BASOP_ADD_v1 */ - Word16 ***Q_filterStatesLeft; -#endif /* OPT_BASOP_ADD_v1 */ - + Word32 ****filterStatesLeftReal_fx; + Word32 ****filterStatesLeftImag_fx; + Word16 *Q_filterStates; Word16 numTapsArray[BINAURAL_CONVBANDS]; Word16 numTaps; } BINRENDERER_CONV_MODULE_FX, *BINRENDERER_CONV_MODULE_HANDLE_FX; + /*----------------------------------------------------------------------------------* * EFAP structures *----------------------------------------------------------------------------------*/ @@ -687,7 +688,7 @@ typedef struct EFAP_VERTEX Word32 ele; /* elevation of the loudspeaker */ /* Q22 */ Word32 pos[3]; /* [x y z] cartesian coordinate vector */ /* Q31 */ Word16 idx; /* integer, that corresponds to the first index for the LS in the 1D output */ - Word16 isNaN; /* used to indicate if the vertex is a virtual speaker */ + bool isNaN; /* used to indicate if the vertex is a virtual speaker */ EFAP_VTX_DMX_TYPE dmxType; /* virtual speaker downmix type */ } EFAP_VERTEX; @@ -699,15 +700,17 @@ typedef struct EFAP_VERTEX_DATA Word16 *vtxOrder; /* Array that indicates the order of the vertex ranked by increasing azimuth */ } EFAP_VERTEX_DATA; + typedef struct EFAP_POLYSET { Word16 chan[EFAP_MAX_CHAN_NUM]; /* An array indicating the loudspeaker index of the polygon vertices */ - Word16 isNaN[EFAP_MAX_CHAN_NUM]; /* Indicates if one of the vertices isNaN */ + bool isNaN[EFAP_MAX_CHAN_NUM]; /* Indicates if one of the vertices isNaN */ Word16 numChan; /* An integer between 0 and EFAP_MAX_CHAN_NUM corresponding to the number of vertices of the polygon */ Word32 polyAzi[EFAP_MAX_CHAN_NUM]; /* An array (same length as "chan"), with the azimuth of the channels */ /* Q22 */ Word32 polyEle[EFAP_MAX_CHAN_NUM]; /* An array (same length as "chan"), with the elevation of the channels */ /* Q22 */ } EFAP_POLYSET; + typedef struct EFAP_LS_TRIANGLE { Word16 LS[3]; /* Array indicating the loudspeaker index of the triangle vertices */ @@ -716,10 +719,10 @@ typedef struct EFAP_LS_TRIANGLE typedef struct EFAP_POLYSET_DATA { - EFAP_POLYSET polysetArray[EFAP_MAX_POLY_SET]; /* Array of polygons */ - Word16 numPoly; /* Number of polygons */ - EFAP_LS_TRIANGLE triArray[EFAP_MAX_POLY_SET]; /* Array of triangles */ - Word16 numTri; /* Number of triangles */ + EFAP_POLYSET *polysetArray; /* Array of polygons */ + Word16 numPoly; /* Number of polygons */ + EFAP_LS_TRIANGLE *triArray; /* Array of triangles */ + Word16 numTri; /* Number of triangles */ } EFAP_POLYSET_DATA; @@ -737,6 +740,7 @@ typedef struct EFAP } EFAP, *EFAP_HANDLE; + /*----------------------------------------------------------------------------------* * Orientation tracking structure *----------------------------------------------------------------------------------*/ @@ -756,6 +760,7 @@ typedef struct ivas_orient_trk_state_t } ivas_orient_trk_state_t; + /*----------------------------------------------------------------------------------* * Head rotation data structure *----------------------------------------------------------------------------------*/ @@ -766,6 +771,7 @@ typedef struct IVAS_QUATERNION headPositions[MAX_PARAM_SPATIAL_SUBFRAMES]; IVAS_VECTOR3 Pos[MAX_PARAM_SPATIAL_SUBFRAMES]; Word32 crossfade_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; /* Q31 */ + ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis; ivas_orient_trk_state_t *hOrientationTracker; } IVAS_REND_HeadRotData; @@ -787,11 +793,15 @@ typedef struct ivas_binaural_head_track_struct Word16 shd_rot_max_order; ivas_orient_trk_state_t *OrientationTracker; + ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis; + } HEAD_TRACK_DATA, *HEAD_TRACK_DATA_HANDLE; + /*----------------------------------------------------------------------------------* * External orientation data structure *----------------------------------------------------------------------------------*/ + typedef struct ivas_external_orientation_struct { Word8 enableHeadRotation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable, 2 - freeze to previous rotation */ @@ -802,9 +812,12 @@ typedef struct ivas_external_orientation_struct Word16 num_subframes; } EXTERNAL_ORIENTATION_DATA, *EXTERNAL_ORIENTATION_HANDLE; + + /*----------------------------------------------------------------------------------* * Combined orientation data structure for the external orienations and head orientation *----------------------------------------------------------------------------------*/ + typedef struct ivas_combined_orientation_struct { Word16 enableCombinedOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; @@ -819,14 +832,16 @@ typedef struct ivas_combined_orientation_struct IVAS_QUATERNION Quaternion_prev_extOrientation; IVAS_QUATERNION Quaternions_ext_interpolation_start; IVAS_QUATERNION Quaternions_ext_interpolation_target; - Word32 Rmat_fx[MAX_PARAM_SPATIAL_SUBFRAMES][3][3]; /* Q30 */ - Word32 Rmat_prev_fx[3][3]; /* Q30 */ + Word32 Rmat_fx[MAX_PARAM_SPATIAL_SUBFRAMES][3][3]; /* Q30 */ + Word32 Rmat_prev_fx[MAX_HEAD_ROT_POSES][3][3]; Word32 chEneIIR_fx[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ /* Q(q_chEneIIR) */ - Word16 q_chEneIIR; + Word16 q_chEneIIR[2][MASA_FREQUENCY_BANDS]; Word32 procChEneIIR_fx[2][MASA_FREQUENCY_BANDS]; /* Q(q_procChEneIIR) */ - Word16 q_procChEneIIR; + Word16 q_procChEneIIR[2][MASA_FREQUENCY_BANDS]; Word16 shd_rot_max_order; IVAS_VECTOR3 listenerPos[MAX_PARAM_SPATIAL_SUBFRAMES]; + ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis; + Word16 sr_low_res_flag; IVAS_QUATERNION Quaternion_frozen_ext; IVAS_QUATERNION Quaternion_frozen_head; Word8 isExtOrientationFrozen; @@ -837,8 +852,12 @@ typedef struct ivas_combined_orientation_struct Word16 cur_subframe_samples_rendered; Word16 subframe_idx_start; Word16 cur_subframe_samples_rendered_start; + bool isDiegeticInputPI[1 + IVAS_MAX_NUM_OBJECTS]; + bool isDiegeticInputPISet; + } COMBINED_ORIENTATION_DATA, *COMBINED_ORIENTATION_HANDLE; + /*----------------------------------------------------------------------------------* * Reverberator structure *----------------------------------------------------------------------------------*/ @@ -853,6 +872,7 @@ typedef struct ivas_rev_delay_line_t Word16 Delay; UWord16 BufferPos; Word16 Gain_fx; // Q14 + } ivas_rev_delay_line_t; typedef struct ivas_rev_iir_filter_t @@ -867,8 +887,8 @@ typedef struct ivas_rev_iir_filter_t } ivas_rev_iir_filter_t; -typedef float rv_fftwf_type_complex[2]; /* complex type of fftwf library */ typedef Word32 rv_fftwf_type_complex_fx[2]; /* complex type of fftwf library */ + /* Convertion block for FFT filter: from time domain to frequency domain (with OLS) and back */ typedef struct ivas_reverb_t2f_f2t_t { @@ -876,12 +896,12 @@ typedef struct ivas_reverb_t2f_f2t_t Word16 log2_fft_size; Word16 block_size; Word16 hist_size; /* rv_fft_size - rv_block_size */ - // float fft_history_L[RV_FILTER_MAX_HISTORY]; Word32 fft_history_L_fx[RV_FILTER_MAX_HISTORY]; - // float fft_history_R[RV_FILTER_MAX_HISTORY]; Word32 fft_history_R_fx[RV_FILTER_MAX_HISTORY]; + Word16 prev_shift; } ivas_reverb_t2f_f2t_t; + /* FFT filter with its frequency response coefficients */ typedef struct ivas_reverb_fft_filter_t { @@ -920,6 +940,7 @@ typedef struct ivas_reverb_state_t } REVERB_DATA, *REVERB_HANDLE; + /*----------------------------------------------------------------------------------* * Shoebox structure *----------------------------------------------------------------------------------*/ @@ -1002,7 +1023,6 @@ typedef struct er_struct_t Word32 user_origin_fx[3]; // is not needed Word32 *circ_buffers; - UWord16 *closest_ch_idx; shoebox_output_t shoebox_data; shoebox_obj_t shoebox_lib; @@ -1016,19 +1036,16 @@ typedef struct er_struct_t typedef struct { - Word16 modelROM; /* Flag that indicates that the model resides in ROM (controls init/dealloc). */ - Word16 UseItdModel; /* Controls whether ITD model is used. */ - Word16 SplineDegree; /* Degree of the spline functions */ - Word16 K; /* Length of filter */ - Word16 elevDim2; + Word16 modelROM; /* Flag that indicates that the model resides in ROM (controls init/dealloc). */ + Word16 UseItdModel; /* Controls whether ITD model is used. */ + Word16 K; /* Length of filter */ Word16 elevDim3; Word16 AlphaN; /* Number of rows in Alpha matrices */ Word16 num_unique_azim_splines; Word16 elevSegSamples; - Word16 elevBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; - Word16 elevBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; - const Word16 *azimDim2; + const Word16 *elevBsLen; + const Word16 *elevBsStart; const Word16 *azimDim3; const Word16 *azim_start_idx; const Word16 *azimSegSamples; @@ -1054,15 +1071,12 @@ typedef struct /* Pointers for allocation of dynamic memory */ Word32 *AlphaL_dyn_fx; Word32 *AlphaR_dyn_fx; - Word16 AlphaL_dyn_e; - Word16 AlphaR_dyn_e; Word32 *EL_dyn_fx; - Word16 EL_dyn_e; Word32 *ER_dyn_fx; - Word16 ER_dyn_e; Word32 *elevBsShape_dyn_fx; Word32 *elevKSeq_dyn_fx; - Word16 *azimDim2_dyn; + Word16 *elevBsLen_dyn; + Word16 *elevBsStart_dyn; Word16 *azimDim3_dyn; Word16 *azim_start_idx_dyn; Word16 *azimSegSamples_dyn; @@ -1074,19 +1088,14 @@ typedef struct typedef struct { - Word16 N; /* Polynomial degree */ - - Word16 elevDim2; Word16 elevDim3; - Word16 azimDim2; Word16 azimDim3; - - Word16 azimBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; - Word16 azimBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + const Word16 *azimBsLen; + const Word16 *azimBsStart; Word16 azimSegSamples; - Word16 elevBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; - Word16 elevBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + const Word16 *elevBsLen; + const Word16 *elevBsStart; Word16 elevSegSamples; Word16 resamp_factor_fx; /*Q14*/ const Word32 *elevKSeq_fx; /* Array, length elevDim3-2 */ @@ -1100,9 +1109,12 @@ typedef struct Word32 *elevKSeq_dyn_fx; Word32 *azimKSeq_dyn_fx; Word32 *W_dyn_fx; - Word16 W_dyn_e; Word32 *azimBsShape_dyn_fx; Word32 *elevBsShape_dyn_fx; + Word16 *azimBsLen_dyn_fx; + Word16 *azimBsStart_dyn_fx; + Word16 *elevBsLen_dyn_fx; + Word16 *elevBsStart_dyn_fx; } ModelParamsITD_t; @@ -1150,7 +1162,7 @@ typedef struct } TDREND_MIX_Listener_t; /* HR filter */ -typedef struct TDREND_HRFILT_FiltSet_struct +typedef struct ivas_hrtf_TDREND_HRFILT_FiltSet_struct { Word32 SampleRate; /* Sample rate of the HR filter */ Word16 NumPos; @@ -1166,10 +1178,9 @@ typedef struct TDREND_HRFILT_FiltSet_struct ModelParams_t ModelParams; ModelEval_t ModelEval; ModelParamsITD_t ModelParamsITD; - TDREND_HRFILT_Method_t FilterMethod; /* HR filtering method */ - Word32 latency_s_fx; /* Q31 */ - const Word32 *lr_energy_and_iac_fx[3]; /* left/right energy and interaural coherence for late reverb */ - Word32 *lr_energy_and_iac_dyn_fx[3]; + TDREND_HRFILT_Method_t FilterMethod; /* HR filtering method */ + Word32 latency_s_fx; /* Q31 */ + Word16 latency_s_Q_fx; } TDREND_HRFILT_FiltSet_t; @@ -1246,8 +1257,8 @@ typedef struct Word16 hrf_right_prev_e; Word32 azim_prev_fx; Word32 elev_prev_fx; - Word16 Gain_fx; // Q14 - Word16 prevGain_fx; // Q14 + Word32 Gain_fx; // Q30 + Word32 prevGain_fx; // Q30 } TDREND_SRC_t; @@ -1262,8 +1273,9 @@ typedef struct ivas_binaural_td_rendering_struct TDREND_SRC_t *Sources[MAX_NUM_TDREND_CHANNELS]; Word16 Gain_fx; /* Q14 */ - TDREND_MIX_Listener_t *Listener_p; /* The virtual listener */ - TDREND_HRFILT_FiltSet_t *HrFiltSet_p; /* HR filter set */ + TDREND_MIX_Listener_t *Listener_p; /* The virtual listener */ + TDREND_HRFILT_FiltSet_t *HrFiltSet_p; /* HR filter set */ + TDREND_HRFILT_FiltSet_t **pHrFiltSet_p; /* pointer to HR filter set */ Word16 UseCommonDistAttenModel; /* Use common dist atten model (TRUE/FALSE) */ Word16 DistAttenEnabled; /* (TRUE/FALSE) */ @@ -1275,7 +1287,7 @@ typedef struct { Word32 binaural_latency_ns; BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd; - TDREND_HRFILT_FiltSet_t *hHrtfTD; + TDREND_HRFILT_FiltSet_t **hHrtfTD; } TDREND_WRAPPER, *TDREND_WRAPPER_HANDLE; @@ -1283,30 +1295,46 @@ typedef struct /*------------------------------------------------------------------------------------------* * Crend structures *------------------------------------------------------------------------------------------*/ -typedef struct ivas_hrtfs_structure -{ - Word32 *pOut_to_bin_re_fx[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; // Q29 - Word32 *pOut_to_bin_im_fx[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; // Q29 - Word32 *pOut_to_bin_diffuse_re_fx[BINAURAL_CHANNELS]; // Q31 - Word32 *pOut_to_bin_diffuse_im_fx[BINAURAL_CHANNELS]; // Q31 + +typedef struct ivas_hrtf_crend_structure +{ + Word16 factor_Q_latency_s_fx; + Word16 factor_Q_pOut_to_bin; + const Word16 *pOut_to_bin_re_fx[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; + const Word16 *pOut_to_bin_im_fx[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; + Word16 *pOut_to_bin_re_dyn_fx[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; + Word16 *pOut_to_bin_im_dyn_fx[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; + Word16 factor_Q_inv_diffuse_weight; + const Word16 *pOut_to_bin_diffuse_re_fx[BINAURAL_CHANNELS]; + const Word16 *pOut_to_bin_diffuse_im_fx[BINAURAL_CHANNELS]; + Word16 *pOut_to_bin_diffuse_re_dyn_fx[BINAURAL_CHANNELS]; + Word16 *pOut_to_bin_diffuse_im_dyn_fx[BINAURAL_CHANNELS]; + Word16 *pIndex_frequency_max_dyn_fx[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; + Word16 *pIndex_frequency_max_diffuse_dyn_fx[BINAURAL_CHANNELS]; UWord16 num_iterations[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; UWord16 num_iterations_diffuse[BINAURAL_CHANNELS]; - UWord16 *pIndex_frequency_max[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; - UWord16 *pIndex_frequency_max_diffuse[BINAURAL_CHANNELS]; + const Word16 *pIndex_frequency_max[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; + const Word16 *pIndex_frequency_max_diffuse[BINAURAL_CHANNELS]; UWord16 index_frequency_max_diffuse; Word16 max_num_ir; Word16 max_num_iterations; - Word16 inv_diffuse_weight_fx[MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] Q15 */ + Word16 inv_diffuse_weight_fx[BINAURAL_CHANNELS][MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] */ + Word16 same_inv_diffuse_weight; Word32 latency_s_fx; + Word16 init_from_rom; Word16 gain_lfe_fx; // Q14 -} HRTFS_DATA, *HRTFS_HANDLE; + +} HRTFS_CREND_DATA, *HRTFS_CREND_HANDLE; + + /* Main Crend structure */ typedef struct ivas_crend_state_t { + Word32 *freq_buffer_re_fx[MAX_INTERN_CHANNELS]; Word32 *freq_buffer_im_fx[MAX_INTERN_CHANNELS]; - Word32 *freq_buffer_re_diffuse_fx; - Word32 *freq_buffer_im_diffuse_fx; + Word32 *freq_buffer_re_diffuse_fx[BINAURAL_CHANNELS]; + Word32 *freq_buffer_im_diffuse_fx[BINAURAL_CHANNELS]; Word32 *prev_out_buffer_fx[BINAURAL_CHANNELS]; Word32 *lfe_delay_line_fx; Word32 m_fYaw_fx; @@ -1324,83 +1352,109 @@ typedef struct ivas_crend_state_t typedef struct ivas_binaural_crend_wrapper_struct { Word32 binaural_latency_ns; - CREND_HANDLE hCrend; - HRTFS_HANDLE hHrtfCrend; + CREND_HANDLE hCrend[MAX_HEAD_ROT_POSES]; + HRTFS_CREND_HANDLE hHrtfCrend; Word16 *p_io_qfactor; Word16 io_qfactor; + } CREND_WRAPPER, *CREND_WRAPPER_HANDLE; +/* Fastconv binaural data structure */ +typedef struct ivas_binaural_rendering_struct +{ + /* Common variables for all modules */ + IVAS_OUTPUT_SETUP_HANDLE hInputSetup; /* pointer to input spatial format for binaural renderer*/ + EFAP_HANDLE hEFAPdata; /* EFAP structure*/ + Word32 *hoa_dec_mtx; /* pointer to HOA decoder mtx */ /*Q29*/ + Word8 rotInCldfb; /* Flag to enable rotation within bin Renderer in CLDFB*/ + Word16 max_band; /* band upto which rendering is performed */ + Word16 conv_band; /* band upto which convolution in cldfb domain is performed */ + Word16 timeSlots; /* number of time slots of binaural renderer */ + Word16 nInChannels; /* number input channels */ + Word8 render_lfe; /* Flag to render LFE in binaural rendering*/ + IVAS_FORMAT ivas_format; /* format; corresponds to st_ivas->ivas_format, unless the signal gets transormed to a different domain for rendering */ + + /* Convolution module structure */ + BINRENDERER_CONV_MODULE_HANDLE_FX hBinRenConvModule; + + /* Variables related to reverberator module */ + Word32 earlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; + REVERB_STRUCT_HANDLE hReverb; + + Word16 numPoses; + +} BINAURAL_RENDERER, *BINAURAL_RENDERER_HANDLE; + /*------------------------------------------------------------------------------------------* * HRTF structures - hrtfs from binary files *------------------------------------------------------------------------------------------*/ -typedef struct ivas_hrtfs_crend_structure -{ - HRTFS_DATA *hHRTF_hrir_combined; - HRTFS_DATA *hHRTF_hrir_hoa3; - HRTFS_DATA *hHRTF_hrir_hoa2; - HRTFS_DATA *hHRTF_hrir_foa; - HRTFS_DATA *hHRTF_brir_combined; - -} HRTFS_CREND, *HRTFS_CREND_HANDLE; - /* Fastconv binaural data structure */ -typedef struct ivas_hrtfs_fastconv_struct -{ - Word32 FASTCONV_HOA3_latency_s_fx; - Word32 FASTCONV_HRIR_latency_s_fx; - - Word32 ***leftHRIRReal_HOA3_fx; - Word32 ***leftHRIRImag_HOA3_fx; - Word32 ***rightHRIRReal_HOA3_fx; - Word32 ***rightHRIRImag_HOA3_fx; - - Word32 ***leftHRIRReal_fx; - Word32 ***leftHRIRImag_fx; - Word32 ***rightHRIRReal_fx; - Word32 ***rightHRIRImag_fx; - - Word32 ***leftBRIRReal_fx; - Word32 ***leftBRIRImag_fx; - Word32 ***rightBRIRReal_fx; - Word32 ***rightBRIRImag_fx; - Word32 FASTCONV_BRIR_latency_s_fx; - - Word32 ***leftHRIRReal_HOA2_fx; - Word32 ***leftHRIRImag_HOA2_fx; - Word32 ***rightHRIRReal_HOA2_fx; - Word32 ***rightHRIRImag_HOA2_fx; - Word32 FASTCONV_HOA2_latency_s_fx; - - Word32 ***leftHRIRReal_FOA_fx; - Word32 ***leftHRIRImag_FOA_fx; - Word32 ***rightHRIRReal_FOA_fx; - Word32 ***rightHRIRImag_FOA_fx; - Word32 FASTCONV_FOA_latency_s_fx; - +typedef struct ivas_hrtf_fastconv_struct +{ + Word16 FASTCONV_latency_s_Q_fx; + Word32 FASTCONV_latency_s_fx; + Word16 FASTCONV_taps_s_Q_fx; + Word32 ***leftReal_fx; + Word32 ***leftImag_fx; + Word32 ***rightReal_fx; + Word32 ***rightImag_fx; + Word16 n_channels; Word16 allocate_init_flag; /*Memory allocation flag 0: if the hrtf pointers are allocated at application level , 1: of allocated at ivas_binaural_hrtf_open() */ - - Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ + UWord16 ntaps; + Word16 FASTCONV_reverbTime_s_Q_fx; + Word16 FASTCONV_reverbEne_s_Q_fx; + Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q26 */ Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ } HRTFS_FASTCONV, *HRTFS_FASTCONV_HANDLE; -typedef struct ivas_hrtfs_parambin_struct +typedef struct ivas_hrtf_statistics_struct { - Word16 hrtfShCoeffsRe_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ - Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ + const Word32 *average_energy_l; + const Word32 *average_energy_r; + const Word32 *inter_aural_coherence; + Word32 *average_energy_l_dyn; + Word32 *average_energy_r_dyn; + Word32 *inter_aural_coherence_dyn; + Word16 fromROM; /* Flag that indicates that the pointers point to tables in ROM (controls init/dealloc).*/ - Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ - Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ - Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; /* Q28 */ +} HRTFS_STATISTICS, *HRTFS_STATISTICS_HANDLE; -} HRTFS_PARAMBIN, *HRTFS_PARAMBIN_HANDLE; + +/*----------------------------------------------------------------------------------* + * CLDFB renderer wrapper + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + Word32 binaural_latency_ns; + BINAURAL_RENDERER_HANDLE hCldfbRend; + HRTFS_FASTCONV_HANDLE hHrtfFastConv; + +} CLDFB_REND_WRAPPER; +/*----------------------------------------------------------------------------------* + * Time domain ring buffer structure + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + Word32 *data; /* samples in interleaved layout, e.g. for channels A, B, C, samples are stored: A1, B1, C1, A2, B2, C2, ... */ + Word32 capacity; /* max number of Word32 values that can be stored */ + Word16 num_channels; + Word32 write_pos; + Word32 read_pos; + Word16 is_full; + +} TD_RINGBUF_DATA, *TD_RINGBUF_HANDLE; + /*----------------------------------------------------------------------------------* * Limiter structure *----------------------------------------------------------------------------------*/ + typedef struct { Word16 max_num_channels; @@ -1411,9 +1465,13 @@ typedef struct Word32 release_heuristic_fx; /* Q30 */ Word32 attack_constant_fx; /* Q31 */ Word16 strong_saturation_count; +#ifdef DEBUGGING + int32_t cnt_frames_limited; /* counter of frames in which the limiter is applied */ +#endif } IVAS_LIMITER, *IVAS_LIMITER_HANDLE; + /*----------------------------------------------------------------------------------* * Loudspeaker Configuration Conversion structure *----------------------------------------------------------------------------------*/ @@ -1434,6 +1492,7 @@ typedef struct ivas_LS_setupconversion_matrix_fx { Word16 index; Word32 value; + } LS_CONVERSION_MATRIX_FX; typedef struct ivas_LS_setupconversion_mapping_fx @@ -1441,7 +1500,9 @@ typedef struct ivas_LS_setupconversion_mapping_fx AUDIO_CONFIG input_config; AUDIO_CONFIG output_config; const LS_CONVERSION_MATRIX_FX *conversion_matrix_fx; + } LS_CONVERSION_MAPPING_FX; + typedef struct ivas_mono_downmix_renderer_struct { Word32 inputEnergy_fx; @@ -1455,6 +1516,7 @@ typedef struct ivas_mono_downmix_renderer_struct /*----------------------------------------------------------------------------------* * Custom Loudspeaker configuration structure *----------------------------------------------------------------------------------*/ + typedef struct ivas_LS_setup_custom { Word16 is_planar_setup; /* flag to indicate if setup is planar or not */ @@ -1466,8 +1528,8 @@ typedef struct ivas_LS_setup_custom Word16 separate_ch_found; /* flag to indicate if a center channel was found */ Word16 separate_ch_gains_fx[MAX_OUTPUT_CHANNELS]; /* gains to pan McMASA separateChannel in case no center channel is present */ -} LSSETUP_CUSTOM_STRUCT, *LSSETUP_CUSTOM_HANDLE; +} LSSETUP_CUSTOM_STRUCT, *LSSETUP_CUSTOM_HANDLE; /* Channel types in a channel-based config */ typedef enum @@ -1478,6 +1540,7 @@ typedef enum } ChannelType; + /*----------------------------------------------------------------------------------* * MASA external renderer structure *----------------------------------------------------------------------------------*/ @@ -1489,10 +1552,10 @@ typedef struct ivas_masa_external_rendering_struct RENDERER_TYPE renderer_type; DIRAC_REND_HANDLE hDirACRend; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; - DIRAC_DEC_BIN_HANDLE hDiracDecBin; + DIRAC_DEC_BIN_HANDLE hDiracDecBin[MAX_HEAD_ROT_POSES]; REVERB_STRUCT_HANDLE hReverb; - HRTFS_PARAMBIN_HANDLE hHrtfParambin; + HRTFS_PARAMBIN_HANDLE *hHrtfParambin; VBAP_HANDLE hVBAPdata; Word32 *hoa_dec_mtx; @@ -1500,6 +1563,7 @@ typedef struct ivas_masa_external_rendering_struct HANDLE_CLDFB_FILTER_BANK cldfbSynRend[MAX_OUTPUT_CHANNELS]; } MASA_EXT_REND_DATA, *MASA_EXT_REND_HANDLE; + /*----------------------------------------------------------------------------------* * Multichannel MASA (McMASA) analysis structure *----------------------------------------------------------------------------------*/ @@ -1546,16 +1610,15 @@ typedef struct ivas_mcmasa_ana_data_structure Word16 numHorizontalChannels; UWord8 isHorizontalSetup; - MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; SPHERICAL_GRID_DATA *sph_grid16; - Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; /*Exp :energy_e[][]*/ Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 energy_exp[MAX_PARAM_SPATIAL_SUBFRAMES]; } MCMASA_ANA_DATA, *MCMASA_ANA_HANDLE; + /*----------------------------------------------------------------------------------* * Object MASA (OMASA) analysis structure *----------------------------------------------------------------------------------*/ @@ -1569,26 +1632,22 @@ typedef struct ivas_omasa_ana_data_structure HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MAX_NUM_OBJECTS]; /* DirAC parameter estimation */ - - Word16 band_grouping[MASA_FREQUENCY_BANDS + 1]; Word16 block_grouping[5]; /* diffuseness */ Word16 index_buffer_intensity; - MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; SPHERICAL_GRID_DATA *sph_grid16; - Word32 **direction_vector_m_fx[DIRAC_NUM_DIMS]; /* Average direction vector */ - Word16 direction_vector_m_q; /* Average direction vector */ + Word32 **direction_vector_m_fx[DIRAC_NUM_DIMS]; /* Average direction vector */ + Word16 **direction_vector_e[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Average direction vector */ Word32 ism_azimuth_fx[MAX_NUM_OBJECTS]; Word32 ism_elevation_fx[MAX_NUM_OBJECTS]; - Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 energy_q; - Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; /*Exp :energy_e[][]*/ + Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word16 interpolator_fx[L_FRAME48k]; Word32 prev_object_dm_gains_fx[MAX_NUM_OBJECTS][MASA_MAX_TRANSPORT_CHANNELS]; @@ -1596,14 +1655,15 @@ typedef struct ivas_omasa_ana_data_structure Word32 buffer_energy_fx[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; Word16 buffer_intensity_real_q[DIRAC_NO_COL_AVG_DIFF]; Word16 buffer_energy_q[DIRAC_NO_COL_AVG_DIFF]; - Word16 chnlToFoaMtx_fx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; // Q15 - + Word32 chnlToFoaMtx_fx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; // Q15 } OMASA_ANA_DATA, *OMASA_ANA_HANDLE; + /*----------------------------------------------------------------------------------* * DirAC analysis structure *----------------------------------------------------------------------------------*/ + typedef struct ivas_dirac_ana_data_structure { Word16 nbands; @@ -1613,28 +1673,35 @@ typedef struct ivas_dirac_ana_data_structure HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[DIRAC_MAX_ANA_CHANS]; /* DirAC parameter estimation */ - Word32 **direction_vector_m_fx[DIRAC_NUM_DIMS]; /* Average direction vector */ + Word32 **direction_vector_m_fx[DIRAC_NUM_DIMS]; /* Average direction vector */ + Word16 **direction_vector_e[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Average direction vector */ Word16 band_grouping[MASA_FREQUENCY_BANDS + 1]; Word16 block_grouping[5]; /* diffuseness */ Word16 index_buffer_intensity; Word32 *buffer_intensity_real_fx[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; + Word16 buffer_intensity_real_q[DIRAC_NO_COL_AVG_DIFF]; Word32 buffer_energy_fx[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; + Word16 buffer_energy_q[DIRAC_NO_COL_AVG_DIFF]; MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; SPHERICAL_GRID_DATA *sph_grid16; Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 energy_exp[MAX_PARAM_SPATIAL_SUBFRAMES]; } DIRAC_ANA_DATA, *DIRAC_ANA_HANDLE; + + /*----------------------------------------------------------------------------------* * MASA prerend structure *----------------------------------------------------------------------------------*/ typedef struct ivas_masa_prerend_data_structure { + Word16 nbands; + Word16 band_grouping[MASA_FREQUENCY_BANDS + 1]; + /* CLDFB analysis */ Word16 num_Cldfb_instances; HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MASA_MAX_TRANSPORT_CHANNELS]; @@ -1642,8 +1709,8 @@ typedef struct ivas_masa_prerend_data_structure MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; SPHERICAL_GRID_DATA *sph_grid16; - Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; /*Exp :energy_e[][]*/ + Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; } MASA_PREREND_DATA, *MASA_PREREND_HANDLE; diff --git a/lib_rend/ivas_td_ring_buffer_fx.c b/lib_rend/ivas_td_ring_buffer_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..78fde65d8e18a4dc4bd87f38bb1cd586236b7046 --- /dev/null +++ b/lib_rend/ivas_td_ring_buffer_fx.c @@ -0,0 +1,357 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "ivas_error_utils.h" +#include "ivas_prot_rend_fx.h" +#include "options.h" +#include "wmc_auto.h" +#include "prot_fx.h" + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------* + * ivas_td_ringbuf_total_size() + * + * Returns total number of buffered samples (including number of channels) + *---------------------------------------------------------------------*/ + +static Word32 ivas_td_ringbuf_total_size( + TD_RINGBUF_HANDLE h ) +{ + IF( h->is_full ) + { + return h->capacity; + } + + IF( LE_32( h->read_pos, h->write_pos ) ) + { + return L_sub( h->write_pos, h->read_pos ); + } + /* else wrap around */ + return L_add( h->write_pos, L_sub( h->capacity, h->read_pos ) ); +} + + +static Word16 ivas_td_ringbuf_has_space_for_num_samples( + TD_RINGBUF_HANDLE h, + const Word32 num_samples ) +{ + IF( LE_32( L_add( ivas_td_ringbuf_total_size( h ), num_samples ), h->capacity ) ) + { + return 1; + } + return 0; +} + + +static void ivas_td_ringbuf_push_interleaved( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const Word32 *data, /* i : Input audio in interleaved channels layout */ + const Word16 num_samples_per_channel, /* i : Number of samples per channel to push */ + const Word16 read_stride /* i: : 1 for normal operation, 0 for reading from a single input value */ +) +{ + Word32 s, read_s; + + assert( h != NULL ); + assert( data != NULL ); + assert( read_stride == 0 || read_stride == 1 ); + assert( ivas_td_ringbuf_has_space_for_num_samples( h, num_samples_per_channel * h->num_channels ) ); + + read_s = 0; + move32(); + FOR( s = 0; s < L_mult0( num_samples_per_channel, h->num_channels ); ++s ) + { + h->data[h->write_pos] = data[read_s]; + move32(); + h->write_pos = L_add( h->write_pos, 1 ); + + if ( EQ_32( h->write_pos, h->capacity ) ) + { + h->write_pos = 0; + move16(); + } + read_s = L_add( read_s, L_deposit_l( read_stride ) ); + move32(); + } + + if ( EQ_32( h->read_pos, h->write_pos ) ) + { + h->is_full = 1; + move16(); + } + + return; +} + + +/*-----------------------------------------------------------------------* + * Global function definitions + *-----------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------* + * ivas_TD_RINGBUF_Open() + * + * Allocate a ring buffer for TD data with the given capacity of TD samples per channel. + * + * May return IVAS_ERR_FAILED_ALLOC on failed allocation, or IVAS_ERR_OK otherwise. + *---------------------------------------------------------------------*/ + +ivas_error ivas_TD_RINGBUF_Open( + TD_RINGBUF_HANDLE *ph, /* i/o: Ring buffer handle */ + const Word16 capacity_per_channel, /* i : Number of samples stored per channel */ + const Word16 num_channels /* i : Number of channels */ +) +{ + TD_RINGBUF_HANDLE h; + Word32 capacity; + + capacity = L_mult0( capacity_per_channel, num_channels ); + move32(); + + h = malloc( sizeof( TD_RINGBUF_DATA ) ); + IF( h == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to allocate memory for TD ring buffer\n" ); + } + h->data = NULL; + h->capacity = 0; + move32(); + h->num_channels = num_channels; + move16(); + h->write_pos = 0; + move32(); + h->read_pos = 0; + move32(); + h->is_full = 0; + move16(); + *ph = h; + + h->data = malloc( capacity * sizeof( Word32 ) ); + IF( h->data == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to allocate memory for TD ring buffer\n" ); + } + h->capacity = capacity; + move32(); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * ivas_TD_RINGBUF_Close() + * + * Dellocate TD ring buffer. The given handle will be set to NULL. + + *---------------------------------------------------------------------*/ + +void ivas_TD_RINGBUF_Close( + TD_RINGBUF_HANDLE *ph /* i/o: Ring buffer handle */ +) +{ + TD_RINGBUF_HANDLE h; + + IF( ph == NULL ) + { + return; + } + h = *ph; + + IF( h == NULL ) + { + return; + } + + IF( h->data != NULL ) + { + free( h->data ); + } + + free( h ); + *ph = NULL; + + return; +} + + +/*---------------------------------------------------------------------* + * ivas_TD_RINGBUF_PushInterleaved() + * + * Push samples from a buffer with interleaved channel layout onto the back of the TD ring buffer. + *---------------------------------------------------------------------*/ + +void ivas_TD_RINGBUF_PushInterleaved( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const Word32 *data, /* i : Input audio in interleaved channels layout */ + const Word16 num_samples_per_channel /* i : Number of samples per channel to push */ +) +{ + ivas_td_ringbuf_push_interleaved( h, data, num_samples_per_channel, 1 ); + + return; +} + + +/*---------------------------------------------------------------------* + * ivas_TD_RINGBUF_PushChannels() + * + * Push samples from channel pointers onto the back of the TD ring buffer. + *---------------------------------------------------------------------*/ + +void ivas_TD_RINGBUF_PushChannels( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const Word32 *p_channels[], /* i : Array of pointers to each input channel */ + const Word16 num_samples_per_channel /* i : Number of samples per channel to push */ +) +{ + Word32 s; + Word16 c; + + assert( h != NULL ); + assert( p_channels != NULL ); + for ( c = 0; c < h->num_channels; ++c ) /* Not using BASOP FOR because this loops only does assertions */ + { + assert( p_channels[c] != NULL ); + } + assert( ivas_td_ringbuf_has_space_for_num_samples( h, num_samples_per_channel * h->num_channels ) ); + + FOR( s = 0; s < num_samples_per_channel; ++s ) + { + FOR( c = 0; c < h->num_channels; ++c ) + { + h->data[h->write_pos] = p_channels[c][s]; + move32(); + h->write_pos = L_add( h->write_pos, 1 ); + + if ( EQ_32( h->write_pos, h->capacity ) ) + { + h->write_pos = 0; + move32(); + } + } + } + + if ( EQ_32( h->read_pos, h->write_pos ) ) + { + h->is_full = 1; + move16(); + } + + return; +} + + +/*---------------------------------------------------------------------* + * ivas_TD_RINGBUF_PushConstant() + * + * Push samples with a constant value onto the back of the TD ring buffer. + *---------------------------------------------------------------------*/ + +void ivas_TD_RINGBUF_PushConstant( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const Word32 value, /* i : Value to push */ + const Word16 num_samples_per_channel /* i : Number of samples per channel to push */ +) +{ + ivas_td_ringbuf_push_interleaved( h, &value, num_samples_per_channel, 0 ); + + return; +} + + +/*---------------------------------------------------------------------* + * ivas_TD_RINGBUF_PopChannels() + * + * Pop samples from the front of the TD ring buffer to an array of channel pointers. + *---------------------------------------------------------------------*/ + +void ivas_TD_RINGBUF_PopChannels( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + Word32 *p_channels[], /* i : Array of pointers to each output channel */ + const Word16 num_samples_per_channel /* i : Number of samples per channel to pop */ +) +{ + Word32 s; + Word16 c; + + assert( h != NULL ); + assert( p_channels != NULL ); + for ( c = 0; c < h->num_channels; ++c ) /* Not using BASOP FOR because this loops only does assertions */ + { + assert( p_channels[c] != NULL ); + } + assert( ivas_td_ringbuf_total_size( h ) >= num_samples_per_channel * h->num_channels ); + + FOR( s = 0; s < num_samples_per_channel; ++s ) + { + FOR( c = 0; c < h->num_channels; ++c ) + { + p_channels[c][s] = h->data[h->read_pos]; + move32(); + ++h->read_pos; + + IF( EQ_32( h->read_pos, h->capacity ) ) + { + h->read_pos = 0; + move32(); + } + } + } + + IF( NE_16( num_samples_per_channel, 0 ) ) + { + h->is_full = 0; + move16(); + } + + return; +} + + +/*---------------------------------------------------------------------* + * ivas_TD_RINGBUF_Size() + * + * Returns number of buffered samples per channel. + *---------------------------------------------------------------------*/ + +Word16 ivas_TD_RINGBUF_Size( + const TD_RINGBUF_HANDLE h /* i : Ring buffer handle */ +) +{ + return extract_l( ar_div( ivas_td_ringbuf_total_size( h ), L_deposit_l( h->num_channels ) ) ); +} diff --git a/lib_rend/ivas_vbap_fx.c b/lib_rend/ivas_vbap_fx.c index 7495953e3e462f5eca9be008502a81e7be8a6656..ec24a33628bdabc5d80a5e854501304680790682 100644 --- a/lib_rend/ivas_vbap_fx.c +++ b/lib_rend/ivas_vbap_fx.c @@ -578,7 +578,7 @@ void vbap_determine_gains_fx( move32(); FOR( ch = 0; ch < 3; ch++ ) { - gain_ene_fx = L_add( gain_ene_fx, Mpy_32_32( gain_triplet_fx[ch], gain_triplet_fx[ch] ) ); /* Q(2 * VBAP_VS_TRIPLET.q_inverse_matrix - 31) */ + gain_ene_fx = Madd_32_32( gain_ene_fx, gain_triplet_fx[ch], gain_triplet_fx[ch] ); /* Q(2 * VBAP_VS_TRIPLET.q_inverse_matrix - 31) */ } norm_value_fx = Isqrt( L_shr( gain_ene_fx, 1 ) ); /* Q(31 - (2 * VBAP_VS_TRIPLET.q_inverse_matrix - 31 - 1) / 2 ) = Q(47 - VBAP_VS_TRIPLET.q_inverse_matrix) */ @@ -681,42 +681,30 @@ static UWord8 vector_matrix_multiply_3x3_fx( Word32 *result, /* o : output vector Q(q_matrix) */ Word16 q_matrix ) { - result[0] = Mpy_32_16_1( matrix[0][0], src_vector[0] ); /* Q(q_matrix) */ - result[0] = L_add( result[0], Mpy_32_16_1( matrix[1][0], src_vector[1] ) ); /* Q(q_matrix) */ - result[0] = L_add( result[0], Mpy_32_16_1( matrix[2][0], src_vector[2] ) ); /* Q(q_matrix) */ - move32(); - move32(); + Word32 pointzero_one = Mpy_32_16_1( L_lshl( 1, q_matrix ), -327 /* -0.01 in Q15 */ ); + result[0] = Madd_32_16( Madd_32_16( Mpy_32_16_1( matrix[0][0], src_vector[0] ), matrix[1][0], src_vector[1] ), matrix[2][0], src_vector[2] ); /* Q(q_matrix) */ move32(); - IF( LT_32( result[0], Mpy_32_16_1( L_lshl( 1, q_matrix ), -327 /* -0.01 in Q15 */ ) ) ) + IF( LT_32( result[0], pointzero_one ) ) { return 0; } - result[1] = Mpy_32_16_1( matrix[0][1], src_vector[0] ); /* Q(q_matrix) */ - result[1] = L_add( result[1], Mpy_32_16_1( matrix[1][1], src_vector[1] ) ); /* Q(q_matrix) */ - result[1] = L_add( result[1], Mpy_32_16_1( matrix[2][1], src_vector[2] ) ); /* Q(q_matrix) */ - move32(); - move32(); + result[1] = Madd_32_16( Madd_32_16( Mpy_32_16_1( matrix[0][1], src_vector[0] ), matrix[1][1], src_vector[1] ), matrix[2][1], src_vector[2] ); /* Q(q_matrix) */ move32(); - IF( LT_32( result[1], Mpy_32_16_1( L_shl( 1, q_matrix ), -327 /* -0.01 in Q15 */ ) ) ) + IF( LT_32( result[1], pointzero_one ) ) { return 0; } - result[2] = Mpy_32_16_1( matrix[0][2], src_vector[0] ); /* Q(q_matrix) */ - result[2] = L_add( result[2], Mpy_32_16_1( matrix[1][2], src_vector[1] ) ); /* Q(q_matrix) */ - result[2] = L_add( result[2], Mpy_32_16_1( matrix[2][2], src_vector[2] ) ); /* Q(q_matrix) */ - move32(); - move32(); + result[2] = Madd_32_16( Madd_32_16( Mpy_32_16_1( matrix[0][2], src_vector[0] ), matrix[1][2], src_vector[1] ), matrix[2][2], src_vector[2] ); /* Q(q_matrix) */ move32(); - IF( LT_32( result[2], Mpy_32_16_1( L_shl( 1, q_matrix ), -327 /* -0.01 in Q15 */ ) ) ) + IF( LT_32( result[2], pointzero_one ) ) { return 0; } - return 1; } @@ -1241,8 +1229,9 @@ static void matrix_inverse_3x3_32_fx( Word32 determinant_fx; /* Q28 */ Word32 cross_vec_fx[3]; /* Q29 */ Word16 exp_inverse_matrix_fx[3][3]; + vbap_crossp_fx( input_matrix_fx[1], input_matrix_fx[2], cross_vec_fx ); - determinant_fx = dotp_fixed( input_matrix_fx[0], cross_vec_fx, 3 ); + determinant_fx = dotp_fx32( input_matrix_fx[0], cross_vec_fx, 3 ); Word16 inv_mat_exp = 0; move16(); @@ -1538,19 +1527,20 @@ static Word16 determine_virtual_surface_triplets_fx( /* All triplets should be stored now. Sort them for search use and then determine the initial search indices for * each search sector for this search struct. */ - v_sort_ind_fixed( triplet_azidegs_fx, triplet_order, num_triplets ); + v_sort_ind_fx( triplet_azidegs_fx, triplet_order, num_triplets ); reorder_triplets_fx( triplets, triplet_order, num_triplets ); determine_initial_search_indices_fx( num_triplets, triplet_azidegs_fx, initial_search_indices ); return num_triplets; } + + /*-------------------------------------------------------------------------* * determine_initial_search_indices() * * Determine initial search indices used for fast search of correct triangle *-------------------------------------------------------------------------*/ - static void determine_initial_search_indices_fx( const Word16 num_triplets, /* i : number of triplets */ const Word32 triplet_azidegs_fx[VBAP_MAX_NUM_TRIPLETS], /* i : azimuths of triplets (in degrees) Q19 */ @@ -1607,6 +1597,7 @@ static void determine_initial_search_indices_fx( return; } + /*-------------------------------------------------------------------------* * determine_connections() * @@ -1676,6 +1667,8 @@ static ivas_error determine_connections_fx( return IVAS_ERR_OK; } + + /*-------------------------------------------------------------------------* * determine_connection_class() * @@ -1692,7 +1685,6 @@ static enum ConnectionClass determine_connection_class_fx( ) { Word16 ch, k; - const Word32 *p1_fx, *v2_fx; Word32 v1v1_fx, v1v2_fx, v2v2_fx, v1p1_fx, v2p1_fx; /* Q25, Q27, Q29, Q27, Q29 */ Word32 determinant_fx; /* Q23 */ @@ -1706,7 +1698,7 @@ static enum ConnectionClass determine_connection_class_fx( /* Check if connection passes through origin. This is not desired. * When this happens, unit vectors point in opposite directions. */ - uvecdot_fx = L_add( L_shl( dotp_fixed( node_data[chA].unit_vec_fx, node_data[chB].unit_vec_fx, 3 ), 1 ), ONE_IN_Q30 ); // Q30 - adding one guard bit + uvecdot_fx = L_add( L_shl( dotp_fx32( node_data[chA].unit_vec_fx, node_data[chB].unit_vec_fx, 3 ), 1 ), ONE_IN_Q30 ); // Q30 - adding one guard bit test(); IF( LT_32( uvecdot_fx, VBAP_EPSILON_Q3O ) && GT_32( uvecdot_fx, L_negate( VBAP_EPSILON_Q3O ) ) ) @@ -1741,16 +1733,16 @@ static enum ConnectionClass determine_connection_class_fx( v2_fx = node_data[ch].unit_vec_fx; // Q30 move32(); - v1v1_fx = dotp_fixed( v1_fx, v1_fx, 3 ); // Q25 + v1v1_fx = dotp_fx32( v1_fx, v1_fx, 3 ); // Q25 move32(); - v1v2_fx = dotp_fixed( v1_fx, v2_fx, 3 ); // Q27 + v1v2_fx = dotp_fx32( v1_fx, v2_fx, 3 ); // Q27 move32(); v2v2_fx = ONE_IN_Q29; move32(); - v1p1_fx = dotp_fixed( v1_fx, p1_fx, 3 ); // Q27 + v1p1_fx = dotp_fx32( v1_fx, p1_fx, 3 ); // Q27 move32(); - v2p1_fx = dotp_fixed( v2_fx, p1_fx, 3 ); // Q29 + v2p1_fx = dotp_fx32( v2_fx, p1_fx, 3 ); // Q29 move32(); Word32 tmp1 = Mpy_32_32( v1v2_fx, v1v2_fx ); // Q23 @@ -1838,7 +1830,7 @@ static enum ConnectionClass determine_connection_class_fx( vec_diff_fx[i] = L_shr( vec_diff_fx[i], 2 ); move32(); } - Word32 res = dotp_fixed( vTarget_fx, v2_fx, 3 ); // 31 - (max_vTarget_e + 2) + 30 - 31 = 28 - max_vTarget_e + Word32 res = dotp_fx32( vTarget_fx, v2_fx, 3 ); // 31 - (max_vTarget_e + 2) + 30 - 31 = 28 - max_vTarget_e move32(); IF( GT_32( res, L_shr( 2147054208 /* 0.9998f in Q31 */, sub( 31, sub( 28, max_vTarget_e ) ) ) ) ) @@ -1849,7 +1841,7 @@ static enum ConnectionClass determine_connection_class_fx( /* A special case, mainly accounting for ELEVATED L,R,C speaker nodes. A triplet between these nodes is not desired if there is a top node, a penalty is implemented to take care of this. */ - Word32 vec_diff_dotp = dotp_fixed( vec_diff_fx, vec_diff_fx, 3 ); // exp : 2 * max_vec_diff_e + 4 + Word32 vec_diff_dotp = dotp_fx32( vec_diff_fx, vec_diff_fx, 3 ); // exp : 2 * max_vec_diff_e + 4 move32(); Word32 var = Mpy_32_32( vec_diff_dotp, 51200 /*25.0f in Q11*/ ); // exp : 2 * max_vec_diff_e + 4 + 20 Word16 Flag1 = BASOP_Util_Cmp_Mant32Exp( v1v1_fx, Q31 - Q25, var, add( shl( max_vec_diff_e, 1 ), 4 + 20 ) ); @@ -2047,8 +2039,8 @@ static ivas_error get_half_sphere_connection_options_fx( c_options[index].chB = chB; move16(); - unit_vec_dotp = dotp_fixed( speaker_node_data[chA].unit_vec_fx, speaker_node_data[chB].unit_vec_fx, 3 ); // Q29 - unit_vec_dotp_sq = Mpy_32_32( unit_vec_dotp, unit_vec_dotp ); // Q27 + unit_vec_dotp = dotp_fx32( speaker_node_data[chA].unit_vec_fx, speaker_node_data[chB].unit_vec_fx, 3 ); // Q29 + unit_vec_dotp_sq = Mpy_32_32( unit_vec_dotp, unit_vec_dotp ); // Q27 one_minus_unit_vec_dotp_sq = L_sub( ONE_IN_Q27, unit_vec_dotp_sq ); Word16 exp_uv = Q31 - Q27; move16(); @@ -2081,9 +2073,11 @@ static ivas_error get_half_sphere_connection_options_fx( } } } + /* Number of found connection options at the half sphere */ *num_connection_options = index; move16(); + /* Init memory for reordered connection options and order by arc_weighted, * which informs of the preference order of the connections in case they cross */ IF( ( c_options_reorder = (ConnectionOption *) malloc( sizeof( ConnectionOption ) * ( *num_connection_options ) ) ) == NULL ) @@ -2136,11 +2130,13 @@ static ivas_error get_half_sphere_connection_options_fx( return IVAS_ERR_OK; } + /*-------------------------------------------------------------------------* * formulate_half_sphere_connections() * * Formulate half-sphere connections *-------------------------------------------------------------------------*/ + static ivas_error formulate_half_sphere_connections_fx( const VBAP_SPEAKER_NODE *speaker_node_data, /* i : speaker node data */ const Word16 num_speaker_nodes, /* i : number of speaker nodes */ @@ -2265,8 +2261,8 @@ static ivas_error formulate_half_sphere_connections_fx( /* If the plane intersection is between both connections, then the two connections cross. */ /* Study first if the crossing is between arc chA-chB */ - var1 = dotp_fixed( planeCrossingVec_fx, speaker_node_data[chA].unit_vec_fx, 3 ); // Q24 = 26 - tmp_exp - var2 = dotp_fixed( planeCrossingVec_fx, speaker_node_data[chB].unit_vec_fx, 3 ); // Q24 = 26 - tmp_exp + var1 = dotp_fx32( planeCrossingVec_fx, speaker_node_data[chA].unit_vec_fx, 3 ); // Q24 = 26 - tmp_exp + var2 = dotp_fx32( planeCrossingVec_fx, speaker_node_data[chB].unit_vec_fx, 3 ); // Q24 = 26 - tmp_exp var1_sq = Mpy_32_32( var1, var1 ); //(2 * (Q_planeCrossingVec - Q1) ) - Q31 var2_sq = Mpy_32_32( var2, var2 ); @@ -2330,9 +2326,9 @@ static ivas_error formulate_half_sphere_connections_fx( /* Study if the crossing is also between arc cmp_chA-cmp_chB */ IF( within_first_arc > 0 ) { - var1 = dotp_fixed( planeCrossingVec_fx, speaker_node_data[cmp_chA].unit_vec_fx, 3 ); + var1 = dotp_fx32( planeCrossingVec_fx, speaker_node_data[cmp_chA].unit_vec_fx, 3 ); move32(); - var2 = dotp_fixed( planeCrossingVec_fx, speaker_node_data[cmp_chB].unit_vec_fx, 3 ); + var2 = dotp_fx32( planeCrossingVec_fx, speaker_node_data[cmp_chB].unit_vec_fx, 3 ); move32(); // final_exp_A, final_exp_B, exp_var1_sq, exp_var2_sq; diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 0a489600a5df2f29f3e1defefda65d19c9cca3bf..84dc763f26476304e25890f5575e3c473989c10e 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -34,6 +34,7 @@ #define LIB_REND_H #include "common_api_types.h" +#include "ivas_stat_rend.h" #include "basop_util.h" #include @@ -41,34 +42,41 @@ * Renderer constants *---------------------------------------------------------------------*/ -#define RENDERER_MAX_ISM_INPUTS 4 +#define RENDERER_MAX_OUTPUT_CHANNELS IVAS_MAX_LS_CHANNELS +#define RENDERER_MAX_INPUT_CHANNELS IVAS_MAX_LS_CHANNELS +#define RENDERER_MAX_ISM_INPUTS IVAS_MAX_NUM_OBJECTS #define RENDERER_MAX_MC_INPUTS 1 #define RENDERER_MAX_SBA_INPUTS 1 #define RENDERER_MAX_MASA_INPUTS 1 #define RENDERER_MAX_INPUT_LFE_CHANNELS 4 +/* Frame size required when rendering to binaural */ +#define BINAURAL_RENDERING_FRAME_SIZE_MS 5 + /*---------------------------------------------------------------------* * Renderer structures *---------------------------------------------------------------------*/ -typedef float IVAS_REND_LfePanMtx[RENDERER_MAX_INPUT_LFE_CHANNELS][IVAS_MAX_OUTPUT_CHANNELS]; -typedef Word32 IVAS_REND_LfePanMtx_fx[RENDERER_MAX_INPUT_LFE_CHANNELS][IVAS_MAX_OUTPUT_CHANNELS]; +typedef float IVAS_REND_LfePanMtx[RENDERER_MAX_INPUT_LFE_CHANNELS][RENDERER_MAX_OUTPUT_CHANNELS]; +typedef Word32 IVAS_REND_LfePanMtx_fx[RENDERER_MAX_INPUT_LFE_CHANNELS][RENDERER_MAX_OUTPUT_CHANNELS]; typedef struct { - Word16 numSamplesPerChannel; - Word16 numChannels; -} IVAS_REND_AudioBufferConfig; + Word32 bufLenInBytes; + Word32 bitsWritten; + Word32 bitsRead; + ISAR_SPLIT_REND_CODEC codec; + ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection; + Word16 codec_frame_size_ms; + Word16 isar_frame_size_ms; + Word16 lc3plus_highres; +} IVAS_REND_BitstreamBufferConfig; typedef struct { - IVAS_REND_AudioBufferConfig config; - Word16 q_factor; - Word16 *pq_fact; - Word32 *data_fx; - // Word16 Q_data; -} IVAS_REND_AudioBuffer; - + IVAS_REND_BitstreamBufferConfig config; + UWord8 *bits; +} IVAS_REND_BitstreamBuffer; typedef struct { @@ -106,12 +114,15 @@ typedef enum _IVAS_REND_COMPLEXITY_LEVEL /* Functions to be called before rendering */ ivas_error IVAS_REND_Open( - IVAS_REND_HANDLE *phIvasRend, /* i/o: Pointer to renderer handle */ - const Word32 outputSampleRate, /* i : output sampling rate */ - const IVAS_AUDIO_CONFIG outConfig, /* i : output audio config */ - const Word16 nonDiegeticPan, /* i : non-diegetic object flag */ - const Word32 nonDiegeticPanGain, /* i : non-diegetic panning gain Q31 */ - const Word16 num_subframes /* i : number of subframes */ + IVAS_REND_HANDLE *phIvasRend, /* i/o: Pointer to renderer handle */ + const Word32 outputSampleRate, /* i : output sampling rate */ + const IVAS_AUDIO_CONFIG outConfig, /* i : output audio config */ + const bool asHrtfBinary, /* i : load hrtf binary file */ + const Word16 nonDiegeticPan, /* i : non-diegetic object flag */ + const Word32 nonDiegeticPanGain, /* i : non-diegetic panning gain Q31*/ + const Word16 Opt_Headrotation, /* i : indicates whether head-rotation is used */ + const Word16 Opt_ExternalOrientation, /* i : indicates whether external orientations are used */ + const Word16 num_subframes /* i : number of subframes */ ); /* Note: this will reset custom LFE routings set for any MC input */ @@ -123,7 +134,7 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( /* Functions to be called before/during rendering */ -ivas_error IVAS_REND_NumOutChannels( +ivas_error IVAS_REND_GetNumOutChannels( IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ Word16 *numOutChannels /* o : number of output channels */ ); @@ -141,6 +152,10 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( const IVAS_CUSTOM_LS_DATA layout /* i : custom loudspeaker layout for input */ ); +ivas_error IVAS_REND_SetObjectIDs( + IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ +); + ivas_error IVAS_REND_SetInputGain_fx( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ @@ -178,12 +193,40 @@ ivas_error IVAS_REND_GetDelay_fx( Word32 *timeScale /* o : Time scale of the delay, equal to renderer output sampling rate */ ); +/*! r: error code */ +ivas_error IVAS_REND_GetHrtfTdHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS rendder handle */ + IVAS_DEC_HRTF_TD_HANDLE **hHrtfTD /* o : TD rend. HRTF handle */ +); + +/*! r: error code */ +ivas_error IVAS_REND_GetHrtfCRendHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS render handle */ + IVAS_DEC_HRTF_CREND_HANDLE **hHrtfCrend /* o : Crend HRTF handle */ +); + +ivas_error IVAS_REND_GetHrtfFastConvHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS render handle */ + IVAS_DEC_HRTF_FASTCONV_HANDLE **hHrtfFastConv /* o : FASTCONV HRTF handle */ +); + +ivas_error IVAS_REND_GetHrtfParamBinHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS render handle */ + IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ +); + +ivas_error IVAS_REND_GetHrtfStatisticsHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + IVAS_DEC_HRTF_STATISTICS_HANDLE **hHrtfStatistics /* o : HRTF statistics handle */ +); + /* Functions to be called during rendering */ ivas_error IVAS_REND_FeedInputAudio_fx( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ - const IVAS_REND_ReadOnlyAudioBuffer inputAudio /* i : buffer with input audio */ + const IVAS_REND_ReadOnlyAudioBuffer inputAudio, /* i : buffer with input audio */ + const bool flushInputs /* i : flush input audio */ ); ivas_error IVAS_REND_FeedInputObjectMetadata( @@ -216,21 +259,59 @@ ivas_error IVAS_REND_InitConfig( const IVAS_AUDIO_CONFIG outAudioConfig /* i : output audioConfig */ ); -Word16 IVAS_REND_GetRenderConfig( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ +ivas_error IVAS_REND_GetRenderConfig( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ const IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render configuration handle */ ); -Word16 IVAS_REND_FeedRenderConfig( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ +ivas_error IVAS_REND_FeedRenderConfig( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ const IVAS_RENDER_CONFIG_DATA renderConfig /* i : Render configuration struct */ ); +ivas_error IVAS_REND_GetReverbRoomSize( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + IVAS_ROOM_SIZE_T *reverbRoomSize /* o : Reverb room size */ +); + +ivas_error IVAS_REND_SetReverbRoomSize( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const IVAS_ROOM_SIZE_T reverbRoomSize /* i : Reverb room size */ +); + +ivas_error IVAS_REND_FeedSplitBinauralBitstream( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + IVAS_REND_BitstreamBuffer *hBits /* i : buffer for input bitstream */ +); + +ivas_error IVAS_REND_GetSplitBinauralSamples( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_AudioBuffer outAudio, /* i/o: buffer for output audio */ + bool* needNewFrame +); + +ivas_error IVAS_REND_GetSplitBinauralBitstream( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_AudioBuffer outAudio, /* i/o: buffer for output audio */ + IVAS_REND_BitstreamBuffer *hBits /* o : buffer for output bitstream */ +); + +ivas_error IVAS_REND_GetSplitRendBitstreamHeader( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + ISAR_SPLIT_REND_CODEC *pCodec, /* o : pointer to codec setting */ + ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, /* o : pointer to pose correction mode */ + Word16 *pCodec_frame_size_ms, /* o : pointer to codec frame size setting */ + Word16 *pIsar_frame_size_ms, /* o : pointer to ISAR frame size setting */ + Word16 *pLc3plusHighRes /* o : pointer to LC3plus High-Res setting */ +); + ivas_error IVAS_REND_SetHeadRotation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ - const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ - const Word16 sf_idx /* i : subframe index */ + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ + const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ + const ISAR_SPLIT_REND_ROT_AXIS rot_axis, /* i : external control for rotation axis for split rendering*/ + const Word16 sf_idx /* i : subframe index */ ); /* Head rotation becomes enabled by calling IVAS_REND_SetHeadRotation. Use this to disable. */ @@ -264,15 +345,18 @@ ivas_error IVAS_REND_SetReferenceVector( const IVAS_VECTOR3 refPos /* i : Reference position */ ); +ivas_error IVAS_REND_SetSplitRendBFI( + IVAS_REND_HANDLE hIvasRend, + const Word16 bfi); ivas_error IVAS_REND_SetExternalOrientation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - IVAS_QUATERNION *orientation, /* i : external orientation data */ - Word8 enableHeadRotation, /* i : flag to enable head rotation for this frame */ - Word8 enableExternalOrientation, /* i : flag to enable external orientation for this frame */ - Word8 enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ - Word16 numFramesToTargetOrientation, /* i : number of frames until target orientation is reached */ - const Word16 sf_idx /* i : subframe index */ + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *orientation, /* i : external orientation data */ + Word8 enableHeadRotation, /* i : flag to enable head rotation for this frame */ + Word8 enableExternalOrientation, /* i : flag to enable external orientation for this frame */ + Word8 enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ + Word16 numFramesToTargetOrientation, /* i : number of frames until target orientation is reached */ + const Word16 sf_idx /* i : subframe index */ ); ivas_error IVAS_REND_CombineHeadAndExternalOrientation( @@ -285,31 +369,31 @@ ivas_error IVAS_REND_GetCombinedOrientation( ); ivas_error IVAS_REND_GetMasaMetadata( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ IVAS_MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to analyzed MASA metadata */ - const IVAS_REND_AudioConfigType inputType /* i : Input type */ + const IVAS_REND_AudioConfigType inputType /* i : Input type */ ); ivas_error IVAS_REND_MergeMasaMetadata( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ IVAS_MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to merged metadata */ - const IVAS_REND_AudioConfigType inputType1, /* i : Input type 1 */ - const IVAS_REND_AudioConfigType inputType2 /* i : Input type 2 */ + const IVAS_REND_AudioConfigType inputType1, /* i : Input type 1 */ + const IVAS_REND_AudioConfigType inputType2 /* i : Input type 2 */ ); ivas_error IVAS_REND_SetTotalNumberOfObjects( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ - const UWord16 total_num_objects /* i : total number of objects */ + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const UWord16 total_num_objects /* i : total number of objects */ ); ivas_error IVAS_REND_SetIsmMetadataDelay( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ - const Word32 sync_md_delay /* i : Metadata Delay in ms to sync with audio delay */ + const Word16 sync_md_delay /* i : Metadata Delay in ms to sync with audio delay */ ); ivas_error IVAS_REND_GetNumAllObjects( IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ - Word16 *numChannels /* o : number of all objects */ + Word16 *numChannels /* o : number of all objects */ ); ivas_error IVAS_REND_GetSamples( @@ -320,11 +404,45 @@ ivas_error IVAS_REND_GetSamples( /* Functions to be called after rendering */ void IVAS_REND_Close( - IVAS_REND_HANDLE* phIvasRend /* i/o: Pointer to renderer handle */ + IVAS_REND_HANDLE *phIvasRend /* i/o: Pointer to renderer handle */ +); + +/* Split binaural rendering functions */ + +ivas_error IVAS_REND_openCldfb( + IVAS_CLDFB_FILTER_BANK_HANDLE cldfbAna[RENDERER_MAX_INPUT_CHANNELS], + IVAS_CLDFB_FILTER_BANK_HANDLE cldfbSyn[RENDERER_MAX_OUTPUT_CHANNELS], + const Word16 num_in_chs, + const Word16 num_out_chs, + const Word32 output_Fs +); + +void IVAS_REND_closeCldfb( + IVAS_CLDFB_FILTER_BANK_HANDLE cldfbAna[RENDERER_MAX_INPUT_CHANNELS], + IVAS_CLDFB_FILTER_BANK_HANDLE cldfbSyn[RENDERER_MAX_OUTPUT_CHANNELS] +); + +void IVAS_REND_cldfbAnalysis_ts_wrapper( + const Word32 *timeIn, /* i : time buffer */ + Word32 realBuffer[IVAS_CLDFB_NO_CHANNELS_MAX], /* o : real value buffer */ + Word32 imagBuffer[IVAS_CLDFB_NO_CHANNELS_MAX], /* o : imag value buffer */ + const Word16 samplesToProcess, /* i : samples to process */ + IVAS_CLDFB_FILTER_BANK_HANDLE h_cldfb, /* i : filterbank state */ + Word16 Q_in, + Word16 *Q_out +); + +void IVAS_REND_cldfbSynthesis_wrapper( + Word32 **realBuffer, /* i : real values */ + Word32 **imagBuffer, /* i : imag values */ + Word32 *timeOut, /* o : output time domain samples */ + const Word16 samplesToProcess, /* i : number of processed samples */ + IVAS_CLDFB_FILTER_BANK_HANDLE h_cldfb, /* i : filter bank state */ + Word16 Q_cldfb, + Word16 *Q_out ); -#ifdef FIX_DISCLAIMER /* Disclaimer and info printing */ void IVAS_REND_PrintInputConfig( @@ -338,7 +456,6 @@ ivas_error IVAS_REND_PrintConfig( void IVAS_REND_PrintDisclaimer( void ); -#endif /* clang-format on */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend_fx.c similarity index 65% rename from lib_rend/lib_rend.c rename to lib_rend/lib_rend_fx.c index 3ea159d7f3d6895975dbb34fe16d020bbaed6039..d45c79be014aa3f2fe0a777f8556ea48ea555328 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend_fx.c @@ -29,16 +29,26 @@ the United Nations Convention on Contracts on the International Sales of Goods. *******************************************************************************************************/ + +#include "basop32.h" #include "basop_util.h" #include "options.h" +#include "cnst.h" +#include "common_api_types.h" +#include "enh32.h" #include "lib_rend.h" +#include "move.h" #include "prot_fx.h" #include "ivas_prot_fx.h" #include "ivas_prot_rend_fx.h" +#include "isar_prot.h" +#include "isar_stat.h" +#include "lib_isar_pre_rend.h" #include "ivas_cnst.h" #include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" #include "ivas_rom_rend.h" +#include "stl.h" +#include "typedef.h" #include #include #include @@ -47,38 +57,23 @@ #include "debug.h" #endif - /*-------------------------------------------------------------------* * Local constants *-------------------------------------------------------------------*/ -/* Maximum buffer length (per channel) in samples. - * Keep this separate from L_FRAME48k in case we want to support different size later */ -#define MAX_BUFFER_LENGTH_PER_CHANNEL ( L_FRAME48k ) - -/* Maximum buffer length (total) in samples. */ /* Maximum buffer length (total) in samples. */ -#define MAX_BUFFER_LENGTH ( MAX_BUFFER_LENGTH_PER_CHANNEL * MAX_INPUT_CHANNELS ) - -#define MAX_BIN_DELAY_SAMPLES 50 /* Maximum supported rendering latency for binaural IRs */ - -/* Frame size required when rendering to binaural */ -#define BINAURAL_RENDERING_FRAME_SIZE_MS 5 - +#define MAX_BUFFER_LENGTH ( L_FRAME_MAX * MAX_INPUT_CHANNELS ) +#define MAX_BIN_DELAY_SAMPLES 150 /* Maximum supported rendering latency for binaural IRs */ /*-------------------------------------------------------------------* * Local types *-------------------------------------------------------------------*/ -typedef float pan_vector[MAX_OUTPUT_CHANNELS]; -typedef float pan_matrix[MAX_INPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; -typedef float rotation_gains[MAX_INPUT_CHANNELS][MAX_INPUT_CHANNELS]; typedef Word32 pan_vector_fx[MAX_OUTPUT_CHANNELS]; typedef Word32 pan_matrix_fx[MAX_INPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; typedef Word16 rotation_gains_fx[MAX_INPUT_CHANNELS][MAX_INPUT_CHANNELS]; typedef Word32 rotation_gains_Word32[MAX_INPUT_CHANNELS][MAX_INPUT_CHANNELS]; typedef Word32 rotation_matrix_fx[3][3]; -typedef float rotation_matrix[3][3]; /* EFAP wrapper to simplify writing panning gains to a vector that includes LFE channels */ typedef struct @@ -98,22 +93,31 @@ typedef struct typedef struct { const Word32 *pOutSampleRate; + const Word32 *pMaxGlobalDelayNs; const AUDIO_CONFIG *pOutConfig; const LSSETUP_CUSTOM_STRUCT *pCustomLsOut; const EFAP_WRAPPER *pEfapOutWrapper; IVAS_REND_HeadRotData *pHeadRotData; // for now removing the const qualifier TODO: will modify later + const RENDER_CONFIG_HANDLE *hhRendererConfig; + const Word16 *pSplitRendBFI; + const SPLIT_REND_WRAPPER *pSplitRendWrapper; const COMBINED_ORIENTATION_HANDLE *pCombinedOrientationData; + const IVAS_DefaultReverbSize *pSelectedRoomReverbSize; } rendering_context; + /* Common base for input structs */ typedef struct { AUDIO_CONFIG inConfig; IVAS_REND_InputId id; IVAS_REND_AudioBuffer inputBuffer; + TD_RINGBUF_HANDLE delayBuffer; Word32 gain_fx; /* Linear, not in dB Q30 */ rendering_context ctx; Word32 numNewSamplesPerChannel; /* Used to keep track how much new audio was fed before rendering current frame */ + Word16 delayNumSamples; } input_base; + typedef struct { input_base base; @@ -125,28 +129,27 @@ typedef struct rotation_matrix_fx rot_mat_prev; pan_vector_fx prev_pan_gains_fx; rotation_matrix_fx rot_mat_prev_fx; - pan_vector prev_pan_gains; Word8 firstFrameRendered; + TDREND_WRAPPER splitTdRendWrappers[MAX_HEAD_ROT_POSES - 1]; /* Additional TD Rend instances used for split rendering */ Word32 *bufferData_fx; Word16 nonDiegeticPan; Word32 nonDiegeticPanGain_fx; /* Q31 */ OMASA_ANA_HANDLE hOMasa; UWord16 total_num_objects; - Word32 ism_metadata_delay_ms_fx; /* Q0 */ + Word16 object_id; + Word16 ism_metadata_delay_ms_fx; /* Q0 */ } input_ism; + typedef struct { Word16 numLfeChannels; bool pan_lfe; - // float lfeInputGain; Word32 lfeInputGain_fx; /* Q31 */ - // float lfeOutputAzimuth; Word16 lfeOutputAzimuth_fx; - // float lfeOutputElevation; Word16 lfeOutputElevation_fx; - // IVAS_REND_LfePanMtx lfePanMtx; IVAS_REND_LfePanMtx_fx lfePanMtx_fx; /* Q31 */ } lfe_routing; + typedef struct { input_base base; @@ -159,8 +162,9 @@ typedef struct EFAP_WRAPPER efapInWrapper; TDREND_WRAPPER tdRendWrapper; CREND_WRAPPER_HANDLE crendWrapper; + TDREND_WRAPPER splitTdRendWrappers[MAX_HEAD_ROT_POSES - 1]; /* Additional TD Rend instances used for split rendering */ REVERB_HANDLE hReverb; - rotation_gains_Word32 rot_gains_prev_fx; + rotation_gains_Word32 rot_gains_prev_fx[MAX_HEAD_ROT_POSES]; Word16 nonDiegeticPan; Word32 nonDiegeticPanGain_fx; lfe_routing lfeRouting; @@ -169,18 +173,18 @@ typedef struct Word32 *lfeDelayBuffer_fx; MCMASA_ANA_HANDLE hMcMasa; } input_mc; + typedef struct { input_base base; - // pan_matrix hoaDecMtx; pan_matrix_fx hoaDecMtx_fx; + CLDFB_REND_WRAPPER cldfbRendWrapper; CREND_WRAPPER_HANDLE crendWrapper; - rotation_gains_fx rot_gains_prev_fx; + rotation_gains_fx rot_gains_prev_fx[MAX_HEAD_ROT_POSES]; Word32 *bufferData_fx; DIRAC_ANA_HANDLE hDirAC; } input_sba; - typedef struct { input_base base; @@ -190,9 +194,21 @@ typedef struct MASA_EXT_REND_HANDLE hMasaExtRend; MASA_PREREND_HANDLE hMasaPrerend; } input_masa; + +typedef struct hrtf_handles +{ + IVAS_DEC_HRTF_CREND_HANDLE hHrtfCrend; + IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv; + IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin; + IVAS_DEC_HRTF_TD_HANDLE hHrtfTD; + IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics; +} hrtf_handles; + + struct IVAS_REND { Word32 sampleRateOut; + Word32 maxGlobalDelayNs; IVAS_LIMITER_HANDLE hLimiter; input_ism inputsIsm[RENDERER_MAX_ISM_INPUTS]; @@ -205,6 +221,9 @@ struct IVAS_REND EFAP_WRAPPER efapOutWrapper; IVAS_LSSETUP_CUSTOM_STRUCT customLsOut; + Word16 splitRendBFI; + SPLIT_REND_WRAPPER *splitRendWrapper; + IVAS_REND_AudioBuffer splitRendEncBuffer; IVAS_REND_HeadRotData headRotData; EXTERNAL_ORIENTATION_HANDLE hExternalOrientationData; @@ -212,22 +231,35 @@ struct IVAS_REND Word8 rendererConfigEnabled; RENDER_CONFIG_DATA *hRendererConfig; /* Renderer config pointer */ + IVAS_DefaultReverbSize selectedRoomReverbSize; + +#ifdef DEBUGGING + Word32 numClipping; /* Counter of clipped output samples */ +#endif Word16 num_subframes; + hrtf_handles hHrtfs; }; + /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ -static ivas_error initMasaExtRenderer( input_masa *inputMasa, const AUDIO_CONFIG outConfig ); +static ivas_error initMasaExtRenderer( input_masa *inputMasa, const AUDIO_CONFIG outConfig, const RENDER_CONFIG_DATA *hRendCfg, hrtf_handles *hHrtfs ); + static void freeMasaExtRenderer( MASA_EXT_REND_HANDLE *hMasaExtRendOut ); -static void intermidiate_ext_dirac_render( - MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA renderer structure */ - Word16 to_fix ); + +static void intermidiate_ext_dirac_render( MASA_EXT_REND_HANDLE hMasaExtRend, Word16 to_fix ); + +static ivas_error renderSbaToMultiBinauralCldfb( input_sba *sbaInput, Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const Word16 low_res_pre_rend_rot, const Word16 num_subframes, const Word16 Q_in ); +static ivas_error renderSbaToMultiBinaural( input_sba *sbaInput, const AUDIO_CONFIG outConfig, Word32 out[][L_FRAME48k], const Word16 *pq_fact ); + + /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ + static ivas_error allocateInputBaseBufferData_fx( Word32 **data, /* Qx */ const Word16 data_size ) @@ -240,6 +272,7 @@ static ivas_error allocateInputBaseBufferData_fx( return IVAS_ERR_OK; } + static void freeInputBaseBufferData_fx( Word32 **data /* Qx */ ) { @@ -251,6 +284,19 @@ static void freeInputBaseBufferData_fx( return; } + +static Word16 latencyNsToSamples( + Word32 sampleRate, + Word32 latency_ns ) +{ + Word16 var1, exp; + Word32 var2; + var1 = BASOP_Util_Divide3232_Scale( sampleRate, 1000000000, &exp ); + var2 = L_shr_r( Mpy_32_32( latency_ns, L_deposit_h( var1 ) ), negate( exp ) ); /* Q0 */ + + return extract_l( var2 ); +} + static ivas_error allocateMcLfeDelayBuffer_fx( Word32 **lfeDelayBuffer, /* Qx */ const Word16 data_size ) @@ -263,6 +309,7 @@ static ivas_error allocateMcLfeDelayBuffer_fx( return IVAS_ERR_OK; } + static void freeMcLfeDelayBuffer_fx( Word32 **lfeDelayBuffer /* Qx */ ) { @@ -303,6 +350,110 @@ static Word32 *getSmplPtr_fx( { return buffer.data_fx + chnlIdx * buffer.config.numSamplesPerChannel + smplIdx; } + +static void convertBitsBufferToInternalBitsBuff( + const IVAS_REND_BitstreamBuffer outBits, + ISAR_SPLIT_REND_BITS_HANDLE hBits ) +{ + hBits->bits_buf = outBits.bits; + hBits->bits_read = outBits.config.bitsRead; + hBits->bits_written = outBits.config.bitsWritten; + hBits->buf_len = outBits.config.bufLenInBytes; + hBits->codec = outBits.config.codec; + hBits->pose_correction = outBits.config.poseCorrection; + hBits->codec_frame_size_ms = outBits.config.codec_frame_size_ms; + + move16(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + + return; +} + +static void convertInternalBitsBuffToBitsBuffer( + IVAS_REND_BitstreamBuffer *hOutBits, + const ISAR_SPLIT_REND_BITS_DATA bits ) +{ + hOutBits->bits = bits.bits_buf; + hOutBits->config.bitsRead = bits.bits_read; + hOutBits->config.bitsWritten = bits.bits_written; + hOutBits->config.bufLenInBytes = bits.buf_len; + hOutBits->config.codec = bits.codec; + hOutBits->config.poseCorrection = bits.pose_correction; + hOutBits->config.codec_frame_size_ms = bits.codec_frame_size_ms; + + return; +} + +static void copyBufferToCLDFBarray_fx( + const IVAS_REND_AudioBuffer buffer, + Word32 re[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 im[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] ) +{ + UWord32 smplIdx, slotIdx; + UWord32 numCldfbSamples, num_bands; + UWord32 chnlIdx; + const Word32 *readPtr; + + assert( ( buffer.config.is_cldfb == 1 ) && "for time domain input call copyBufferTo2dArray()" ); + readPtr = buffer.data_fx; + numCldfbSamples = (UWord32) shr( buffer.config.numSamplesPerChannel, 1 ); + num_bands = (UWord32) Mpy_32_32( numCldfbSamples, ONE_BY_CLDFB_NO_COL_MAX_Q31 ); + FOR( chnlIdx = 0; chnlIdx < (UWord32) buffer.config.numChannels; ++chnlIdx ) + { + FOR( slotIdx = 0; slotIdx < CLDFB_NO_COL_MAX; ++slotIdx ) + { + FOR( smplIdx = 0; smplIdx < num_bands; ++smplIdx ) + { + re[chnlIdx][slotIdx][smplIdx] = *readPtr++; + } + FOR( smplIdx = 0; smplIdx < num_bands; ++smplIdx ) + { + im[chnlIdx][slotIdx][smplIdx] = *readPtr++; + } + } + } + + return; +} + +static void accumulateCLDFBArrayToBuffer_fx( + Word32 re[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 im[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const IVAS_REND_AudioBuffer *buffer ) +{ + UWord32 smplIdx, slotIdx; + UWord32 numCldfbSamples, num_bands; + Word16 chnlIdx; + Word32 *writePtr; + + assert( ( buffer->config.is_cldfb == 1 ) && "for time domain input call copyBufferTo2dArray()" ); + writePtr = buffer->data_fx; + numCldfbSamples = (UWord32) shr( buffer->config.numSamplesPerChannel, 1 ); + num_bands = (UWord32) Mpy_32_32( numCldfbSamples, ONE_BY_CLDFB_NO_COL_MAX_Q31 ); + + FOR( chnlIdx = 0; chnlIdx < buffer->config.numChannels; ++chnlIdx ) + { + FOR( slotIdx = 0; slotIdx < CLDFB_NO_COL_MAX; ++slotIdx ) + { + FOR( smplIdx = 0; smplIdx < num_bands; ++smplIdx ) + { + *writePtr++ += re[chnlIdx][slotIdx][smplIdx]; + } + FOR( smplIdx = 0; smplIdx < num_bands; ++smplIdx ) + { + *writePtr++ += im[chnlIdx][slotIdx][smplIdx]; + } + } + } + + return; +} + static void copyBufferTo2dArray_fx( const IVAS_REND_AudioBuffer buffer, Word32 array[][L_FRAME48k] ) @@ -311,6 +462,8 @@ static void copyBufferTo2dArray_fx( UWord32 chnlIdx; const Word32 *readPtr; + assert( ( buffer.config.is_cldfb == 0 ) && "for CLDFB input call copyBufferToCLDFBarray()" ); + readPtr = buffer.data_fx; FOR( chnlIdx = 0; chnlIdx < (UWord32) buffer.config.numChannels; ++chnlIdx ) @@ -326,7 +479,7 @@ static void copyBufferTo2dArray_fx( } static void accumulate2dArrayToBuffer_fx( Word32 array[][L_FRAME48k], - IVAS_REND_AudioBuffer *buffer ) + const IVAS_REND_AudioBuffer *buffer ) { Word16 smplIdx, chnlIdx; Word32 *writePtr; @@ -350,6 +503,7 @@ static void accumulate2dArrayToBuffer_fx( * In-place saturation control for multichannel buffers with adaptive release time *-------------------------------------------------------------------*/ +#ifndef DISABLE_LIMITER /*! r: number of clipped output samples */ static Word32 limitRendererOutput_fx( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ @@ -393,6 +547,7 @@ static Word32 limitRendererOutput_fx( return numClipping; } +#endif /*-------------------------------------------------------------------* * validateOutputAudioConfig() @@ -417,6 +572,8 @@ static ivas_error validateOutputAudioConfig( case IVAS_AUDIO_CONFIG_HOA2: case IVAS_AUDIO_CONFIG_HOA3: case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: case IVAS_AUDIO_CONFIG_MASA1: @@ -495,24 +652,32 @@ static ivas_error validateOutputSampleRate( const Word32 sampleRate, const AUDIO_CONFIG outConfig ) { + IF( NE_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) { /* If no binaural rendering, any sampling rate is supported */ return IVAS_ERR_OK; } - - /* Otherwise rendering to binaural, support the same set as IVAS decoder */ - SWITCH( sampleRate ) + ELSE IF( ( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) && NE_32( sampleRate, 48000 ) ) { - case 8000: - case 16000: - case 32000: - case 48000: - return IVAS_ERR_OK; + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Error: Only 48kHz output sampling rate is supported for split rendering." ); } + ELSE + { + + /* Otherwise rendering to binaural, support the same set as IVAS decoder */ + SWITCH( sampleRate ) + { + case 16000: + case 32000: + case 48000: + return IVAS_ERR_OK; + } - return IVAS_ERR_INVALID_SAMPLING_RATE; + return IVAS_ERR_INVALID_SAMPLING_RATE; + } } + /*-------------------------------------------------------------------* * getAudioConfigNumChannels() * @@ -533,6 +698,8 @@ ivas_error getAudioConfigNumChannels( BREAK; case IVAS_AUDIO_CONFIG_STEREO: case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: case IVAS_AUDIO_CONFIG_MASA2: @@ -575,6 +742,7 @@ ivas_error getAudioConfigNumChannels( move16(); return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ @@ -862,6 +1030,8 @@ static ivas_error getMcConfigValues_fx( return IVAS_ERR_OK; } + + static ivas_error initEfap( EFAP_WRAPPER *pEfapWrapper, AUDIO_CONFIG outConfig, @@ -1042,6 +1212,8 @@ static ivas_error initHeadRotation_fx( hIvasRend->headRotData.headPositions[i] = quaternionInit_fx(); } + hIvasRend->headRotData.sr_pose_pred_axis = DEFAULT_AXIS; + move32(); IF( ( hIvasRend->headRotData.hOrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) { @@ -1061,7 +1233,8 @@ static void closeHeadRotation( IVAS_REND_HANDLE hIvasRend ) { test(); - IF( ( hIvasRend != NULL ) && ( hIvasRend->headRotData.hOrientationTracker != NULL ) ) + test(); + IF( hIvasRend != NULL && hIvasRend->headRotData.headRotEnabled && hIvasRend->headRotData.hOrientationTracker != NULL ) { free( hIvasRend->headRotData.hOrientationTracker ); } @@ -1134,6 +1307,9 @@ static void initRendInputBase_fx( inputBase->ctx = rendCtx; inputBase->numNewSamplesPerChannel = 0; move32(); + inputBase->delayNumSamples = 0; + move32(); + inputBase->delayBuffer = NULL; inputBase->inputBuffer.config.numSamplesPerChannel = 0; inputBase->inputBuffer.config.numChannels = 0; @@ -1188,12 +1364,17 @@ static rendering_context getRendCtx( /* Note: when refactoring this, always take the ADDRESS of a member of the * renderer struct, so that the context stores a POINTER to the member, even * if the member is a pointer or handle itself. */ + ctx.pMaxGlobalDelayNs = &hIvasRend->maxGlobalDelayNs; ctx.pOutConfig = &hIvasRend->outputConfig; ctx.pOutSampleRate = &hIvasRend->sampleRateOut; ctx.pCustomLsOut = &hIvasRend->customLsOut; ctx.pEfapOutWrapper = &hIvasRend->efapOutWrapper; ctx.pHeadRotData = &hIvasRend->headRotData; + ctx.hhRendererConfig = &hIvasRend->hRendererConfig; + ctx.pSplitRendBFI = &hIvasRend->splitRendBFI; + ctx.pSplitRendWrapper = hIvasRend->splitRendWrapper; ctx.pCombinedOrientationData = &hIvasRend->hCombinedOrientationData; + ctx.pSelectedRoomReverbSize = &hIvasRend->selectedRoomReverbSize; return ctx; } @@ -1229,125 +1410,519 @@ static bool isIoConfigPairSupported( return true; } -static ivas_error initIsmMasaRendering( - input_ism *inputIsm, - const Word32 inSampleRate ) +static Word32 getRendInputDelayIsm( + const input_ism *inputIsm, + bool splitPreRendCldfb ) { - ivas_error error; + Word32 latency_ns; + latency_ns = 0; + move32(); + (void) ( splitPreRendCldfb ); /* unused */ - IF( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) + /* set the rendering delay in InputBase */ + latency_ns = L_max( latency_ns, + inputIsm->tdRendWrapper.binaural_latency_ns ); + IF( inputIsm->crendWrapper != NULL ) { - ivas_td_binaural_close_fx( &inputIsm->tdRendWrapper.hBinRendererTd ); - inputIsm->tdRendWrapper.hHrtfTD = NULL; + latency_ns = L_max( latency_ns, + inputIsm->crendWrapper->binaural_latency_ns ); } - ivas_rend_closeCrend( &inputIsm->crendWrapper ); + return latency_ns; +} - ivas_reverb_close( &inputIsm->hReverb ); - IF( NE_32( ( error = ivas_omasa_ana_open( &inputIsm->hOMasa, inSampleRate, inputIsm->total_num_objects ) ), IVAS_ERR_OK ) ) +static void setRendInputDelayIsm( + void *input, + bool splitPreRendCldfb ) +{ + input_ism *inputIsm; + inputIsm = (input_ism *) input; + + inputIsm->base.delayNumSamples = latencyNsToSamples( *inputIsm->base.ctx.pOutSampleRate, + getRendInputDelayIsm( inputIsm, splitPreRendCldfb ) ); +} + + +static Word32 getRendInputDelayMc( + const input_mc *inputMc, + bool splitPreRendCldfb ) +{ + Word32 latency_ns; + latency_ns = 0; + move32(); + (void) ( splitPreRendCldfb ); /* unused */ + + latency_ns = L_max( latency_ns, + inputMc->tdRendWrapper.binaural_latency_ns ); + IF( inputMc->crendWrapper != NULL ) { - return error; + latency_ns = L_max( latency_ns, + inputMc->crendWrapper->binaural_latency_ns ); } - return IVAS_ERR_OK; + return latency_ns; } -static ivas_error setRendInputActiveIsm( +static void setRendInputDelayMc( void *input, - const AUDIO_CONFIG inConfig, - const IVAS_REND_InputId id, - RENDER_CONFIG_DATA *hRendCfg ) + bool splitPreRendCldfb ) { - ivas_error error; - rendering_context rendCtx; - AUDIO_CONFIG outConfig; - input_ism *inputIsm; + input_mc *inputMc; + inputMc = (input_mc *) input; - inputIsm = (input_ism *) input; - rendCtx = inputIsm->base.ctx; - outConfig = *rendCtx.pOutConfig; + inputMc->base.delayNumSamples = latencyNsToSamples( *inputMc->base.ctx.pOutSampleRate, + getRendInputDelayMc( inputMc, splitPreRendCldfb ) ); +} - IF( !isIoConfigPairSupported( inConfig, outConfig ) ) + +static Word32 getRendInputDelaySba( + const input_sba *inputSba, + bool splitPreRendCldfb ) +{ + Word32 latency_ns; + + latency_ns = 0; + move32(); + + IF( inputSba->cldfbRendWrapper.hCldfbRend != NULL ) { - return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; + Word32 filterbank_delay; + + filterbank_delay = 0; + move32(); + + IF( EQ_16( splitPreRendCldfb, 0 ) ) + { + filterbank_delay = IVAS_FB_DEC_DELAY_NS; + } + + latency_ns = L_max( latency_ns, + L_add( inputSba->cldfbRendWrapper.binaural_latency_ns, + filterbank_delay ) ); } - IF( NE_32( ( error = allocateInputBaseBufferData_fx( &inputIsm->bufferData_fx, MAX_BUFFER_LENGTH ) ), IVAS_ERR_OK ) ) + IF( inputSba->crendWrapper != NULL ) { - return error; + latency_ns = L_max( latency_ns, + inputSba->crendWrapper->binaural_latency_ns ); } - initRendInputBase_fx( &inputIsm->base, inConfig, id, rendCtx, inputIsm->bufferData_fx, MAX_BUFFER_LENGTH ); - inputIsm->firstFrameRendered = FALSE; - move16(); + return latency_ns; +} - inputIsm->currentPos = defaultObjectPosition(); - inputIsm->previousPos = defaultObjectPosition(); - inputIsm->crendWrapper = NULL; - inputIsm->hReverb = NULL; - inputIsm->tdRendWrapper = defaultTdRendWrapper(); - initRotMatrix_fx( inputIsm->rot_mat_prev ); +static void setRendInputDelaySba( + void *input, + bool splitPreRendCldfb ) +{ + input_sba *inputSba; + inputSba = (input_sba *) input; - set_zero_fx( inputIsm->prev_pan_gains_fx, MAX_OUTPUT_CHANNELS ); + inputSba->base.delayNumSamples = latencyNsToSamples( *inputSba->base.ctx.pOutSampleRate, + getRendInputDelaySba( inputSba, splitPreRendCldfb ) ); +} - inputIsm->hOMasa = NULL; - error = IVAS_ERR_OK; +static Word32 getRendInputDelayMasa( + const input_masa *inputMasa, + bool splitPreRendCldfb ) +{ + Word32 latency_ns; + + latency_ns = 0; move32(); test(); - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) + test(); + IF( ( EQ_32( inputMasa->base.inConfig, IVAS_AUDIO_CONFIG_MASA1 ) && + EQ_32( *inputMasa->base.ctx.pOutConfig, IVAS_AUDIO_CONFIG_MONO ) ) || + ( EQ_32( getAudioConfigType( *inputMasa->base.ctx.pOutConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) ) { - IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) - { - return error; - } + latency_ns = 0; /* no delay */ } - ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) + ELSE { - IF( NE_32( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + Word32 filterbank_delay; + + filterbank_delay = 0; + move32(); + + /* no delay applied for split rendering */ + IF( EQ_16( splitPreRendCldfb, 0 ) ) { - return error; + filterbank_delay = IVAS_FB_DEC_DELAY_NS; } + latency_ns = L_max( latency_ns, + filterbank_delay ); + } + return latency_ns; +} + + +static void setRendInputDelayMasa( + void *input, + bool splitPreRendCldfb ) +{ + input_masa *inputMasa; + inputMasa = (input_masa *) input; + + inputMasa->base.delayNumSamples = latencyNsToSamples( *inputMasa->base.ctx.pOutSampleRate, + getRendInputDelayMasa( inputMasa, splitPreRendCldfb ) ); +} + + +static Word32 getMaxGlobalDelayNs( IVAS_REND_CONST_HANDLE hIvasRend ) +{ + Word16 i; + Word32 latency_ns; + Word32 max_latency_ns; + bool splitPreRendCldfb; + + max_latency_ns = 0; + /*assumes that input has been added which means codec has been set to either lcld or lc3plus (even if render config specified default)*/ + IF( hIvasRend->hRendererConfig != NULL ) + { + splitPreRendCldfb = ( hIvasRend->hRendererConfig->split_rend_config.codec == ISAR_SPLIT_REND_CODEC_LCLD ); } ELSE { - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src; - Word16 ivas_format; - IF( EQ_32( getAudioConfigType( inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + splitPreRendCldfb = false; + } + + /* Compute the maximum delay across all inputs */ + FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; i++ ) + { + IF( NE_32( hIvasRend->inputsIsm[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { - ivas_format = MC_FORMAT; + latency_ns = getRendInputDelayIsm( &hIvasRend->inputsIsm[i], splitPreRendCldfb ); + max_latency_ns = L_max( max_latency_ns, latency_ns ); } - ELSE + } + + FOR( i = 0; i < RENDERER_MAX_MC_INPUTS; i++ ) + { + IF( hIvasRend->inputsMc[i].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) { - ivas_format = ISM_FORMAT; + latency_ns = getRendInputDelayMc( &hIvasRend->inputsMc[i], splitPreRendCldfb ); + max_latency_ns = L_max( max_latency_ns, latency_ns ); } + } - move16(); - IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + FOR( i = 0; i < RENDERER_MAX_SBA_INPUTS; i++ ) + { + IF( hIvasRend->inputsSba[i].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) { - return error; + latency_ns = getRendInputDelaySba( &hIvasRend->inputsSba[i], splitPreRendCldfb ); + max_latency_ns = L_max( max_latency_ns, latency_ns ); } + } - Word16 nchan_rend = num_src; - move16(); - - test(); - IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + FOR( i = 0; i < RENDERER_MAX_MASA_INPUTS; i++ ) + { + IF( hIvasRend->inputsMasa[i].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) { - nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + latency_ns = getRendInputDelayMasa( &hIvasRend->inputsMasa[i], splitPreRendCldfb ); + max_latency_ns = L_max( max_latency_ns, latency_ns ); } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; - IF( Src_p != NULL ) - { - IF( Src_p->SrcSpatial_p != NULL ) - { + } + + return max_latency_ns; +} + + +static void setMaxGlobalDelayNs( IVAS_REND_HANDLE hIvasRend ) +{ + hIvasRend->maxGlobalDelayNs = getMaxGlobalDelayNs( (IVAS_REND_CONST_HANDLE) hIvasRend ); +} + +static ivas_error alignInputDelay( + input_base *inputBase, + const IVAS_REND_ReadOnlyAudioBuffer inputAudio, + const Word32 maxGlobalDelayNs, + const Word32 sampleRateOut, + const Word16 cldfb2tdSampleShift, + const bool flushInputs ) +{ + ivas_error error; + input_ism *inputIsm; + Word16 maxGlobalDelaySamples, numSamplesToPush, numSamplesToPop; + UWord16 ringBufferSize, preDelay; + Word16 i; + const Word32 *p_read_channels[MAX_INPUT_CHANNELS]; + Word32 *p_write_channels[MAX_INPUT_CHANNELS]; + + maxGlobalDelaySamples = latencyNsToSamples( sampleRateOut, maxGlobalDelayNs ); + maxGlobalDelaySamples = shl( maxGlobalDelaySamples, cldfb2tdSampleShift ); + + /* check if we need to open the delay buffer */ + IF( inputBase->delayBuffer == NULL ) + { + /* buffer has to accomodate maxGlobalDelaySamples + 2 * frameSize */ + ringBufferSize = add( maxGlobalDelaySamples, + shl( inputAudio.config.numSamplesPerChannel, 1 ) ); + + /* pre delay for this input is maximum delay - input delay */ + preDelay = sub( maxGlobalDelaySamples, + shl( inputBase->delayNumSamples, cldfb2tdSampleShift ) ); + + IF( GT_32( preDelay, 0 ) ) + { + IF( ( error = ivas_TD_RINGBUF_Open( &inputBase->delayBuffer, ringBufferSize, inputAudio.config.numChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* for the first frame we need to push zeros to align the input delay to the global delay + * and then push a frame of actual data */ + ivas_TD_RINGBUF_PushConstant( inputBase->delayBuffer, 0, preDelay ); + + /* for ISM inputs, ensure the metadata sync delay is updated */ + IF( getAudioConfigType( inputBase->inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) + { + Word64 tmp; + inputIsm = (input_ism *) inputBase; + + tmp = W_mult0_32_32( L_add( maxGlobalDelayNs, 500000 /* + 0.5ms for rounding */ ) /* Q0 */, 2147 /* (1 / 1e6f) in Q31 */ ); // Q31 + inputIsm->ism_metadata_delay_ms_fx = add( inputIsm->ism_metadata_delay_ms_fx, extract_h( W_extract_h( tmp ) ) ); + } + } + } + + IF( inputBase->delayBuffer != NULL ) + { + /* push in the new input data and pop to retrieve a complete input frame + * if we are flushing the inputs, we don't push in any new data */ + IF( NE_16( flushInputs, 0 ) ) + { + numSamplesToPush = 0; + move16(); + + numSamplesToPop = ivas_TD_RINGBUF_Size( inputBase->delayBuffer ); + } + ELSE + { + numSamplesToPush = inputAudio.config.numSamplesPerChannel; + move16(); + + numSamplesToPop = inputAudio.config.numSamplesPerChannel; + move16(); + } + + FOR( i = 0; i < inputAudio.config.numChannels; ++i ) + { + Word32 tmp; + + tmp = imult3216( L_deposit_l( numSamplesToPush ), i ); + p_read_channels[i] = inputAudio.data_fx + tmp; + } + ivas_TD_RINGBUF_PushChannels( inputBase->delayBuffer, p_read_channels, numSamplesToPush ); + + FOR( i = 0; i < inputAudio.config.numChannels; ++i ) + { + Word32 tmp; + + tmp = imult3216( L_deposit_l( numSamplesToPop ), i ); + p_write_channels[i] = inputBase->inputBuffer.data_fx + tmp; + } + ivas_TD_RINGBUF_PopChannels( inputBase->delayBuffer, p_write_channels, numSamplesToPop ); + } + ELSE + { + /* delay buffer isn't open - we don't need it */ + mvl2l( inputAudio.data_fx, + inputBase->inputBuffer.data_fx, + i_mult( inputAudio.config.numSamplesPerChannel, inputAudio.config.numChannels ) ); + } + + return IVAS_ERR_OK; +} + +static ivas_error initIsmMasaRendering( + input_ism *inputIsm, + const Word32 inSampleRate ) +{ + ivas_error error; + + IF( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) + { + ivas_td_binaural_close_fx( &inputIsm->tdRendWrapper.hBinRendererTd ); + } + + ivas_rend_closeCrend_fx( &inputIsm->crendWrapper ); + + ivas_reverb_close_fx( &inputIsm->hReverb ); + + IF( NE_32( ( error = ivas_omasa_ana_open( &inputIsm->hOMasa, inSampleRate, inputIsm->total_num_objects ) ), IVAS_ERR_OK ) ) + { + return error; + } + + return IVAS_ERR_OK; +} + + +static ivas_error setRendInputActiveIsm( + void *input, + const AUDIO_CONFIG inConfig, + const IVAS_REND_InputId id, + RENDER_CONFIG_DATA *hRendCfg, + hrtf_handles *hrtfs ) +{ + ivas_error error; + rendering_context rendCtx; + AUDIO_CONFIG outConfig; + input_ism *inputIsm; + Word16 i; + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + Word16 num_src; + Word16 ivas_format; + + IF( EQ_32( getAudioConfigType( inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + { + ivas_format = MC_FORMAT; + } + ELSE + { + ivas_format = ISM_FORMAT; + } + move16(); + + inputIsm = (input_ism *) input; + rendCtx = inputIsm->base.ctx; + outConfig = *rendCtx.pOutConfig; + + IF( !isIoConfigPairSupported( inConfig, outConfig ) ) + { + return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; + } + + IF( NE_32( ( error = allocateInputBaseBufferData_fx( &inputIsm->bufferData_fx, MAX_BUFFER_LENGTH ) ), IVAS_ERR_OK ) ) + { + return error; + } + initRendInputBase_fx( &inputIsm->base, inConfig, id, rendCtx, inputIsm->bufferData_fx, MAX_BUFFER_LENGTH ); + + inputIsm->firstFrameRendered = FALSE; + move16(); + + inputIsm->currentPos = defaultObjectPosition(); + inputIsm->previousPos = defaultObjectPosition(); + inputIsm->crendWrapper = NULL; + inputIsm->hReverb = NULL; + inputIsm->tdRendWrapper = defaultTdRendWrapper(); + + initRotMatrix_fx( inputIsm->rot_mat_prev ); + + set_zero_fx( inputIsm->prev_pan_gains_fx, MAX_OUTPUT_CHANNELS ); + + FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + inputIsm->splitTdRendWrappers[i] = defaultTdRendWrapper(); + inputIsm->splitTdRendWrappers[i].hHrtfTD = &hrtfs->hHrtfTD; + } + + inputIsm->hOMasa = NULL; + + error = IVAS_ERR_OK; + move32(); + + inputIsm->tdRendWrapper.hHrtfTD = &hrtfs->hHrtfTD; + + test(); + test(); + test(); + IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, inputIsm->object_id, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + + Word16 nchan_rend = num_src; + move16(); + + test(); + IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } + + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; + IF( Src_p != NULL ) + { + IF( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + } + + /* Open TD renderer wrappers */ + FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->splitTdRendWrappers[i], inConfig, hRendCfg, NULL, *inputIsm->base.ctx.pOutSampleRate, inputIsm->object_id, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* Assert same delay as main TD renderer */ + assert( inputIsm->splitTdRendWrappers[i].binaural_latency_ns == inputIsm->tdRendWrapper.binaural_latency_ns ); + + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = inputIsm->splitTdRendWrappers[i].hBinRendererTd->Sources[SrcInd[nS]]; + IF( Src_p != NULL ) + { + IF( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->splitTdRendWrappers[i].hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + } + } + } + ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) + { + IF( NE_32( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, inputIsm->object_id, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + + Word16 nchan_rend = num_src; + move16(); + + test(); + IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } + + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; + IF( Src_p != NULL ) + { + IF( Src_p->SrcSpatial_p != NULL ) + { Src_p->SrcSpatial_p->q_Pos_p = Q31; move16(); } @@ -1359,7 +1934,14 @@ static ivas_error setRendInputActiveIsm( IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { - IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), hrtfs->hHrtfStatistics, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + IF( NE_32( ( error = ivas_rend_openCrend_fx( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hHrtfCrend, hrtfs->hHrtfStatistics, *rendCtx.pOutSampleRate, 1, rendCtx.pSplitRendWrapper != NULL ? rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), IVAS_ERR_OK ) ) { return error; } @@ -1373,24 +1955,29 @@ static void clearInputIsm( input_ism *inputIsm ) { rendering_context rendCtx; + Word16 i; rendCtx = inputIsm->base.ctx; freeInputBaseBufferData_fx( &inputIsm->base.inputBuffer.data_fx ); + ivas_TD_RINGBUF_Close( &inputIsm->base.delayBuffer ); initRendInputBase_fx( &inputIsm->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); /* Free input's internal handles */ - ivas_rend_closeCrend( &inputIsm->crendWrapper ); + ivas_rend_closeCrend_fx( &inputIsm->crendWrapper ); - ivas_reverb_close( &inputIsm->hReverb ); + ivas_reverb_close_fx( &inputIsm->hReverb ); IF( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputIsm->tdRendWrapper.hBinRendererTd ); - inputIsm->tdRendWrapper.hHrtfTD = NULL; } + FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + ivas_td_binaural_close_fx( &inputIsm->splitTdRendWrappers[i].hBinRendererTd ); + } ivas_omasa_ana_close( &( inputIsm->hOMasa ) ); @@ -1465,6 +2052,7 @@ static void fillIdentityPanMatrix_fx( return; } + static ivas_error initMcPanGainsWithIdentMatrix( input_mc *inputMc ) { @@ -1472,6 +2060,7 @@ static ivas_error initMcPanGainsWithIdentMatrix( return IVAS_ERR_OK; } + static ivas_error initMcPanGainsWithConversionMapping_fx( input_mc *inputMc, const AUDIO_CONFIG outConfig ) @@ -1508,6 +2097,7 @@ static ivas_error initMcPanGainsWithConversionMapping_fx( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Missing multichannel conversion mapping" ); } + static ivas_error initMcPanGainsWithEfap_fx( input_mc *inputMc, const AUDIO_CONFIG outConfig ) @@ -1584,6 +2174,7 @@ static ivas_error initMcPanGainsWithEfap_fx( } return IVAS_ERR_OK; } + static ivas_error getRendInputNumChannels( const void *rendInput, Word16 *numInChannels ) @@ -1613,6 +2204,7 @@ static ivas_error getRendInputNumChannels( return IVAS_ERR_OK; } + static ivas_error initMcPanGainsWithMonoOut_fx( input_mc *inputMc ) { @@ -1858,7 +2450,7 @@ static ivas_error updateLfePanGainsForMcOut( } /* linear input gain */ - v_multc_fixed( inputMc->lfeRouting.lfePanMtx_fx[i], inputMc->lfeRouting.lfeInputGain_fx, inputMc->lfeRouting.lfePanMtx_fx[i], numOutChannels ); /* Q31 */ + v_multc_fx( inputMc->lfeRouting.lfePanMtx_fx[i], inputMc->lfeRouting.lfeInputGain_fx, inputMc->lfeRouting.lfePanMtx_fx[i], numOutChannels ); /* Q31 */ } return error; @@ -1892,7 +2484,7 @@ static ivas_error updateLfePanGainsForAmbiOut( ivas_dirac_dec_get_response_fx( inputMc->lfeRouting.lfeOutputAzimuth_fx, inputMc->lfeRouting.lfeOutputElevation_fx, inputMc->lfeRouting.lfePanMtx_fx[i], outAmbiOrder, Q29 ); /* linear input gain */ - v_multc_fixed( inputMc->lfeRouting.lfePanMtx_fx[i], inputMc->lfeRouting.lfeInputGain_fx, inputMc->lfeRouting.lfePanMtx_fx[i], IVAS_MAX_OUTPUT_CHANNELS ); /* Q31 */ + v_multc_fx( inputMc->lfeRouting.lfePanMtx_fx[i], inputMc->lfeRouting.lfeInputGain_fx, inputMc->lfeRouting.lfePanMtx_fx[i], RENDERER_MAX_OUTPUT_CHANNELS ); /* Q31 */ } return error; @@ -2120,6 +2712,8 @@ static ivas_error updateMcPanGains( SWITCH( outConfig ) { case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: BREAK; /* Do nothing */ case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: @@ -2146,13 +2740,13 @@ static ivas_error updateMcPanGains( { FOR( i = 0; i < inputMc->customLsInput.num_lfe; ++i ) { - Copy32( inputMc->lfeRouting.lfePanMtx_fx[i], inputMc->panGains_fx[inputMc->customLsInput.lfe_idx[i]], IVAS_MAX_OUTPUT_CHANNELS ); + Copy32( inputMc->lfeRouting.lfePanMtx_fx[i], inputMc->panGains_fx[inputMc->customLsInput.lfe_idx[i]], RENDERER_MAX_OUTPUT_CHANNELS ); } } ELSE { /* For code simplicity, always copy LFE gains. If config has no LFE, gains will be zero anyway. */ - Copy32( inputMc->lfeRouting.lfePanMtx_fx[0], inputMc->panGains_fx[LFE_CHANNEL], IVAS_MAX_OUTPUT_CHANNELS ); + Copy32( inputMc->lfeRouting.lfePanMtx_fx[0], inputMc->panGains_fx[LFE_CHANNEL], RENDERER_MAX_OUTPUT_CHANNELS ); } return IVAS_ERR_OK; @@ -2163,12 +2757,15 @@ static ivas_error initMcBinauralRendering( const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, - UWord8 reconfigureFlag ) + IVAS_DEC_HRTF_CREND_HANDLE hMixconv, + HRTFS_STATISTICS_HANDLE hHrtfStatistics, + uint8_t reconfigureFlag ) { ivas_error error; Word32 binauralDelayNs; Word32 outSampleRate; Word8 useTDRend; + Word16 i; /* Allocate TD binaural renderer for custom loudspeaker layouts (regardless of headrotation) or planar MC layouts with headrotation, CREND for the rest */ @@ -2197,21 +2794,31 @@ static ivas_error initMcBinauralRendering( IF( !reconfigureFlag || ( !useTDRend && inputMc->tdRendWrapper.hBinRendererTd != NULL ) ) { ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); - inputMc->tdRendWrapper.hHrtfTD = NULL; } + IF( !reconfigureFlag || !useTDRend ) + { + FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + IF( inputMc->splitTdRendWrappers[i].hBinRendererTd != NULL ) + { + ivas_td_binaural_close_fx( &inputMc->splitTdRendWrappers[i].hBinRendererTd ); + } + } + } /* if we need to use TD renderer and CREND was open, close it */ IF( useTDRend ) { - ivas_rend_closeCrend( &inputMc->crendWrapper ); + ivas_rend_closeCrend_fx( &inputMc->crendWrapper ); } + test(); test(); test(); IF( !reconfigureFlag || ( !useTDRend && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && inputMc->hReverb != NULL ) ) { - ivas_reverb_close( &inputMc->hReverb ); + ivas_reverb_close_fx( &inputMc->hReverb ); } test(); @@ -2233,7 +2840,7 @@ static ivas_error initMcBinauralRendering( { Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; Word16 num_src; - IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate, 0, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { return error; } @@ -2263,10 +2870,46 @@ static ivas_error initMcBinauralRendering( } } } + + IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + /* Open TD renderer wrappers */ + FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputMc->splitTdRendWrappers[i], inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate, 0, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* Assert same delay as main TD renderer */ + assert( inputMc->splitTdRendWrappers[i].binaural_latency_ns == inputMc->tdRendWrapper.binaural_latency_ns ); + + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = inputMc->splitTdRendWrappers[i].hBinRendererTd->Sources[SrcInd[nS]]; + IF( Src_p != NULL ) + { + IF( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = 31; + move16(); + } + IF( inputMc->splitTdRendWrappers[i].hBinRendererTd->Sources[nS] != NULL ) + { + TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputMc->splitTdRendWrappers[i].hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = 31; + move16(); + } + } + } + } + } + + test(); IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && inputMc->hReverb == NULL ) { - IF( NE_32( ( error = ivas_reverb_open_fx( &( inputMc->hReverb ), outConfig, NULL, inputMc->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, outSampleRate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open_fx( &( inputMc->hReverb ), hHrtfStatistics, hRendCfg, outSampleRate ) ), IVAS_ERR_OK ) ) { return error; } @@ -2275,7 +2918,7 @@ static ivas_error initMcBinauralRendering( ELSE IF( !useTDRend && inputMc->crendWrapper == NULL ) { /* open CREND */ - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, NULL, outSampleRate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_openCrend_fx( &inputMc->crendWrapper, ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, outSampleRate, 1, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), IVAS_ERR_OK ) ) { return error; } @@ -2293,7 +2936,6 @@ static ivas_error initMcBinauralRendering( } /* determine binaural delay ( used for aligning LFE to output signal ) */ - IF( ( inputMc->crendWrapper != NULL ) ) { binauralDelayNs = inputMc->crendWrapper->binaural_latency_ns; @@ -2305,12 +2947,7 @@ static ivas_error initMcBinauralRendering( move32(); binauralDelayNs = L_max( binauralDelayNs, inputMc->tdRendWrapper.binaural_latency_ns ); - Word16 exp = 0; - move16(); - Word16 var1 = BASOP_Util_Divide3232_Scale( *inputMc->base.ctx.pOutSampleRate, 1000000000, &exp ); - Word32 var2 = L_shr_r( Mpy_32_32( binauralDelayNs, L_deposit_h( var1 ) ), negate( exp ) ); /* Q0 */ - inputMc->binauralDelaySmp = extract_l( var2 ); - move16(); + inputMc->binauralDelaySmp = latencyNsToSamples( *inputMc->base.ctx.pOutSampleRate, binauralDelayNs ); // inputMc->binauralDelaySmp = (int16_t) roundf( (float) binauralDelayNs * *inputMc->base.ctx.pOutSampleRate / 1000000000.f ); IF( GT_16( inputMc->binauralDelaySmp, MAX_BIN_DELAY_SAMPLES ) ) @@ -2331,12 +2968,11 @@ static ivas_error initMcMasaRendering( IF( inputMc->tdRendWrapper.hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); - inputMc->tdRendWrapper.hHrtfTD = NULL; } - ivas_rend_closeCrend( &inputMc->crendWrapper ); + ivas_rend_closeCrend_fx( &inputMc->crendWrapper ); - ivas_reverb_close( &inputMc->hReverb ); + ivas_reverb_close_fx( &inputMc->hReverb ); IF( inputMc->efapInWrapper.hEfap != NULL ) { @@ -2350,6 +2986,7 @@ static ivas_error initMcMasaRendering( return IVAS_ERR_OK; } + static lfe_routing defaultLfeRouting( const AUDIO_CONFIG inConfig, const LSSETUP_CUSTOM_STRUCT customLsIn, @@ -2363,7 +3000,7 @@ static lfe_routing defaultLfeRouting( FOR( i = 0; i < RENDERER_MAX_INPUT_LFE_CHANNELS; ++i ) { - set32_fx( routing.lfePanMtx_fx[i], 0, IVAS_MAX_OUTPUT_CHANNELS ); + set32_fx( routing.lfePanMtx_fx[i], 0, RENDERER_MAX_OUTPUT_CHANNELS ); } routing.pan_lfe = false; move16(); @@ -2414,16 +3051,20 @@ static lfe_routing defaultLfeRouting( return routing; } + static ivas_error setRendInputActiveMc( void *input, const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, - RENDER_CONFIG_DATA *hRendCfg ) + RENDER_CONFIG_DATA *hRendCfg, + hrtf_handles *hrtfs ) { + Word16 i; ivas_error error; rendering_context rendCtx; AUDIO_CONFIG outConfig; input_mc *inputMc; + Word16 pos_idx; inputMc = (input_mc *) input; rendCtx = inputMc->base.ctx; @@ -2448,11 +3089,20 @@ static ivas_error setRendInputActiveMc( inputMc->customLsInput = defaultCustomLs(); inputMc->tdRendWrapper = defaultTdRendWrapper(); + + if ( hrtfs->hHrtfTD ) + { + inputMc->tdRendWrapper.binaural_latency_ns = L_shr_r( Mpy_32_32_r( hrtfs->hHrtfTD->latency_s_fx, 1000000000 ), hrtfs->hHrtfTD->latency_s_Q_fx ); + } + inputMc->tdRendWrapper.hHrtfTD = &hrtfs->hHrtfTD; inputMc->crendWrapper = NULL; inputMc->hReverb = NULL; inputMc->hMcMasa = NULL; - initRotGainsWord32_fx( inputMc->rot_gains_prev_fx ); + FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) + { + initRotGainsWord32_fx( inputMc->rot_gains_prev_fx[pos_idx] ); + } inputMc->lfeRouting = defaultLfeRouting( inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ); set32_fx( inputMc->lfeDelayBuffer_fx, 0, MAX_BIN_DELAY_SAMPLES ); inputMc->binauralDelaySmp = 0; @@ -2460,9 +3110,19 @@ static ivas_error setRendInputActiveMc( test(); test(); - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + inputMc->splitTdRendWrappers[i] = defaultTdRendWrapper(); + if ( hrtfs->hHrtfTD ) + { + inputMc->splitTdRendWrappers[i].binaural_latency_ns = L_shr_r( Mpy_32_32_r( hrtfs->hHrtfTD->latency_s_fx, 1000000000 ), hrtfs->hHrtfTD->latency_s_Q_fx ); + } + inputMc->splitTdRendWrappers[i].hHrtfTD = &hrtfs->hHrtfTD; + } + + IF( EQ_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) { - IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, FALSE ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, hrtfs->hHrtfCrend, hrtfs->hHrtfStatistics, FALSE ) ), IVAS_ERR_OK ) ) { return error; } @@ -2484,14 +3144,18 @@ static ivas_error setRendInputActiveMc( return IVAS_ERR_OK; } + static void clearInputMc( input_mc *inputMc ) { rendering_context rendCtx; + Word16 i; rendCtx = inputMc->base.ctx; freeMcLfeDelayBuffer_fx( &inputMc->lfeDelayBuffer_fx ); freeInputBaseBufferData_fx( &inputMc->bufferData_fx ); + ivas_TD_RINGBUF_Close( &inputMc->base.delayBuffer ); + initRendInputBase_fx( &inputMc->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); /* Free input's internal handles */ @@ -2500,21 +3164,29 @@ static void clearInputMc( efap_free_data_fx( &inputMc->efapInWrapper.hEfap ); } - ivas_rend_closeCrend( &inputMc->crendWrapper ); + ivas_rend_closeCrend_fx( &inputMc->crendWrapper ); - ivas_reverb_close( &inputMc->hReverb ); + ivas_reverb_close_fx( &inputMc->hReverb ); IF( inputMc->tdRendWrapper.hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); - inputMc->tdRendWrapper.hHrtfTD = NULL; } + FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + IF( inputMc->splitTdRendWrappers[i].hBinRendererTd != NULL ) + { + ivas_td_binaural_close_fx( &inputMc->splitTdRendWrappers[i].hBinRendererTd ); + inputMc->splitTdRendWrappers[i].hHrtfTD = NULL; + } + } ivas_mcmasa_ana_close( &( inputMc->hMcMasa ) ); return; } + static ivas_error initSbaPanGainsForMcOut( input_sba *inputSba, const AUDIO_CONFIG outConfig, @@ -2605,10 +3277,13 @@ static ivas_error initSbaPanGainsForSbaOut( return error; } + static ivas_error updateSbaPanGains( input_sba *inputSba, const AUDIO_CONFIG outConfig, - RENDER_CONFIG_DATA *hRendCfg ) + RENDER_CONFIG_DATA *hRendCfg, + IVAS_DEC_HRTF_CREND_HANDLE hMixconv, + IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics ) { ivas_error error; AUDIO_CONFIG inConfig; @@ -2631,23 +3306,52 @@ static ivas_error updateSbaPanGains( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: SWITCH( outConfig ) { + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: + { + IF( EQ_32( hRendCfg->split_rend_config.rendererSelection, IVAS_BIN_RENDERER_TYPE_FASTCONV ) ) + { + assert( *rendCtx.pOutSampleRate == 48000 && "split binaural fast conv mode is currently supported with 48k sampling rate only" ); + IF( ( error = ivas_rend_openCldfbRend( &inputSba->cldfbRendWrapper, inConfig, outConfig, &rendCtx.pSplitRendWrapper->multiBinPoseData, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + assert( ( *rendCtx.pOutSampleRate == 48000 ) && "split binaural crend mode is currently supported with 48k sampling rate only" ); + IF( ( error = ivas_rend_openMultiBinCrend( &inputSba->crendWrapper, inConfig, outConfig, &rendCtx.pSplitRendWrapper->multiBinPoseData, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + break; + } case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: { - IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) - + IF( EQ_32( hRendCfg->split_rend_config.rendererSelection, IVAS_BIN_RENDERER_TYPE_FASTCONV ) ) { - return error; + IF( ( error = ivas_rend_openCldfbRend( &inputSba->cldfbRendWrapper, inConfig, outConfig, &rendCtx.pSplitRendWrapper->multiBinPoseData, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + IF( NE_32( ( error = ivas_rend_openCrend_fx( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, *rendCtx.pOutSampleRate, 1, rendCtx.pSplitRendWrapper != NULL ? rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), IVAS_ERR_OK ) ) + { + return error; + } } } BREAK; case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: - case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: IF( NE_32( ( error = initSbaPanGainsForMcOut( inputSba, IVAS_AUDIO_CONFIG_7_1_4, NULL ) ), IVAS_ERR_OK ) ) { return error; } - - IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_openCrend_fx( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, hHrtfStatistics, *rendCtx.pOutSampleRate, 1, rendCtx.pSplitRendWrapper != NULL ? rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), IVAS_ERR_OK ) ) { return error; } @@ -2679,7 +3383,7 @@ static ivas_error initSbaMasaRendering( { ivas_error error; - ivas_rend_closeCrend( &inputSba->crendWrapper ); + ivas_rend_closeCrend_fx( &inputSba->crendWrapper ); IF( NE_32( ( error = ivas_dirac_ana_open_fx( &inputSba->hDirAC, inSampleRate ) ), IVAS_ERR_OK ) ) { @@ -2693,12 +3397,14 @@ static ivas_error setRendInputActiveSba( void *input, const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, - RENDER_CONFIG_DATA *hRendCfg ) + RENDER_CONFIG_DATA *hRendCfg, + hrtf_handles *hrtfs ) { ivas_error error; rendering_context rendCtx; AUDIO_CONFIG outConfig; input_sba *inputSba; + Word16 pos_idx; inputSba = (input_sba *) input; rendCtx = inputSba->base.ctx; @@ -2710,17 +3416,22 @@ static ivas_error setRendInputActiveSba( return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; } - IF( NE_32( ( error = allocateInputBaseBufferData_fx( &inputSba->bufferData_fx, MAX_BUFFER_LENGTH ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = allocateInputBaseBufferData_fx( &inputSba->bufferData_fx, MAX_CLDFB_BUFFER_LENGTH ) ), IVAS_ERR_OK ) ) { return error; } - initRendInputBase_fx( &inputSba->base, inConfig, id, rendCtx, inputSba->bufferData_fx, MAX_BUFFER_LENGTH ); + + initRendInputBase_fx( &inputSba->base, inConfig, id, rendCtx, inputSba->bufferData_fx, MAX_CLDFB_BUFFER_LENGTH ); setZeroPanMatrix_fx( inputSba->hoaDecMtx_fx ); inputSba->crendWrapper = NULL; inputSba->hDirAC = NULL; - initRotGains_fx( inputSba->rot_gains_prev_fx ); + FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) + { + initRotGains_fx( inputSba->rot_gains_prev_fx[pos_idx] ); + } + inputSba->cldfbRendWrapper.hHrtfFastConv = hrtfs->hHrtfFastConv; test(); IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_32( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) @@ -2731,13 +3442,14 @@ static ivas_error setRendInputActiveSba( } } - IF( NE_32( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg, hrtfs->hHrtfCrend, hrtfs->hHrtfStatistics ) ), IVAS_ERR_OK ) ) { return error; } - return error; + return IVAS_ERR_OK; } + static void clearInputSba( input_sba *inputSba ) { @@ -2746,11 +3458,16 @@ static void clearInputSba( rendCtx = inputSba->base.ctx; freeInputBaseBufferData_fx( &inputSba->bufferData_fx ); + ivas_TD_RINGBUF_Close( &inputSba->base.delayBuffer ); initRendInputBase_fx( &inputSba->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); - /* Free input's internal handles */ - ivas_rend_closeCrend( &inputSba->crendWrapper ); + ivas_rend_closeCrend_fx( &inputSba->crendWrapper ); + + IF( inputSba->cldfbRendWrapper.hCldfbRend != NULL ) + { + ivas_rend_closeCldfbRend( &inputSba->cldfbRendWrapper ); + } ivas_dirac_ana_close_fx( &( inputSba->hDirAC ) ); @@ -2761,7 +3478,8 @@ static ivas_error setRendInputActiveMasa( void *input, const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, - RENDER_CONFIG_DATA *hRendCfg ) /* Todo: This is not used at all within MASA. Support might be better to do after refactoring. */ + RENDER_CONFIG_DATA *hRendCfg, + hrtf_handles *hrtfs ) { ivas_error error; rendering_context rendCtx; @@ -2773,7 +3491,6 @@ static ivas_error setRendInputActiveMasa( rendCtx = inputMasa->base.ctx; outConfig = *rendCtx.pOutConfig; move32(); - (void) hRendCfg; /* Suppress warning */ IF( !isIoConfigPairSupported( inConfig, outConfig ) ) { @@ -2812,7 +3529,7 @@ static ivas_error setRendInputActiveMasa( } ELSE { - IF( NE_32( ( error = initMasaExtRenderer( inputMasa, outConfig ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = initMasaExtRenderer( inputMasa, outConfig, hRendCfg, hrtfs ) ), IVAS_ERR_OK ) ) { return error; } @@ -2831,6 +3548,7 @@ static void clearInputMasa( rendCtx = inputMasa->base.ctx; freeInputBaseBufferData_fx( &inputMasa->bufferData_fx ); + ivas_TD_RINGBUF_Close( &inputMasa->base.delayBuffer ); masaPrerendClose_fx( &inputMasa->hMasaPrerend ); @@ -2849,14 +3567,19 @@ static void clearInputMasa( *------------------------------------------------------------------------*/ ivas_error IVAS_REND_Open( - IVAS_REND_HANDLE *phIvasRend, - const Word32 outputSampleRate, - const AUDIO_CONFIG outConfig, - const Word16 nonDiegeticPan, - const Word32 nonDiegeticPanGain, /* Q31 */ - const Word16 num_subframes ) + IVAS_REND_HANDLE *phIvasRend, /* i/o: Pointer to renderer handle */ + const Word32 outputSampleRate, /* i : output sampling rate */ + const IVAS_AUDIO_CONFIG outConfig, /* i : output audio config */ + const bool asHrtfBinary, /* i : load hrtf binary file */ + const Word16 nonDiegeticPan, /* i : non-diegetic object flag */ + const Word32 nonDiegeticPanGain, /* i : non-diegetic panning gain Q31*/ + const Word16 Opt_Headrotation, /* i : indicates whether head-rotation is used */ + const Word16 Opt_ExternalOrientation, /* i : indicates whether external orientations are used */ + const Word16 num_subframes /* i : number of subframes */ +) { Word16 i; + Word16 j; IVAS_REND_HANDLE hIvasRend; ivas_error error; Word16 numOutChannels; @@ -2884,16 +3607,25 @@ ivas_error IVAS_REND_Open( } hIvasRend = *phIvasRend; + move32(); hIvasRend->sampleRateOut = outputSampleRate; + move32(); hIvasRend->outputConfig = outConfig; + move32(); hIvasRend->customLsOut = defaultCustomLs(); hIvasRend->hLimiter = NULL; + move32(); hIvasRend->efapOutWrapper.hEfap = NULL; + move32(); hIvasRend->efapOutWrapper.pCustomLsSetup = NULL; + move32(); + hIvasRend->selectedRoomReverbSize = DEFAULT_REVERB_UNSET; + move32(); hIvasRend->num_subframes = num_subframes; + move16(); /* Initialize limiter */ - IF( NE_32( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = IVAS_REND_GetNumOutChannels( hIvasRend, &numOutChannels ) ), IVAS_ERR_OK ) ) { return error; } @@ -2904,21 +3636,35 @@ ivas_error IVAS_REND_Open( } /* Initialize headrotation data */ - IF( NE_32( ( error = initHeadRotation_fx( hIvasRend ) ), IVAS_ERR_OK ) ) + hIvasRend->headRotData.headRotEnabled = 0; + IF( Opt_Headrotation ) { - return error; + IF( NE_32( ( error = initHeadRotation_fx( hIvasRend ) ), IVAS_ERR_OK ) ) + { + return error; + } } /* Initialize external orientation data */ - IF( NE_32( ( error = ivas_external_orientation_open( &( hIvasRend->hExternalOrientationData ), num_subframes ) ), IVAS_ERR_OK ) ) + hIvasRend->hExternalOrientationData = NULL; + IF( Opt_ExternalOrientation ) { - return error; + IF( NE_32( ( error = ivas_external_orientation_open_fx( &( hIvasRend->hExternalOrientationData ), num_subframes ) ), IVAS_ERR_OK ) ) + { + return error; + } } + /* Initilize combined orientation data */ - IF( NE_32( ( error = ivas_combined_orientation_open( &( hIvasRend->hCombinedOrientationData ), outputSampleRate, num_subframes ) ), IVAS_ERR_OK ) ) + hIvasRend->hCombinedOrientationData = NULL; + IF( Opt_Headrotation || Opt_ExternalOrientation ) { - return error; + IF( NE_32( ( error = ivas_combined_orientation_open_fx( &( hIvasRend->hCombinedOrientationData ), outputSampleRate, num_subframes ) ), IVAS_ERR_OK ) ) + { + return error; + } } + /* Initialize EFAP */ IF( NE_32( ( error = initEfap( &hIvasRend->efapOutWrapper, outConfig, &hIvasRend->customLsOut ) ), IVAS_ERR_OK ) ) { @@ -2926,19 +3672,50 @@ ivas_error IVAS_REND_Open( } /* Initialize inputs */ + hIvasRend->splitRendWrapper = NULL; + test(); + IF( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + IF( ( hIvasRend->splitRendWrapper = (SPLIT_REND_WRAPPER *) malloc( sizeof( SPLIT_REND_WRAPPER ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for IVAS renderer handle" ); + } + + isar_init_split_rend_handles( hIvasRend->splitRendWrapper ); + } + hIvasRend->splitRendEncBuffer.data_fx = NULL; + move32(); + hIvasRend->splitRendEncBuffer.config.is_cldfb = 0; + move16(); + hIvasRend->splitRendEncBuffer.config.numChannels = 0; + move16(); + hIvasRend->splitRendEncBuffer.config.numSamplesPerChannel = 0; + move16(); FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) { initRendInputBase_fx( &hIvasRend->inputsIsm[i].base, IVAS_AUDIO_CONFIG_INVALID, 0, getRendCtx( hIvasRend ), NULL, 0 ); hIvasRend->inputsIsm[i].crendWrapper = NULL; + move32(); hIvasRend->inputsIsm[i].hReverb = NULL; + move32(); hIvasRend->inputsIsm[i].tdRendWrapper.hBinRendererTd = NULL; + move32(); + FOR( j = 0; j < MAX_HEAD_ROT_POSES - 1; ++j ) + { + hIvasRend->inputsIsm[i].splitTdRendWrappers[j].hBinRendererTd = NULL; + move32(); + hIvasRend->inputsIsm[i].splitTdRendWrappers[j].hHrtfTD = NULL; + move32(); + } hIvasRend->inputsIsm[i].nonDiegeticPan = nonDiegeticPan; move16(); hIvasRend->inputsIsm[i].nonDiegeticPanGain_fx = nonDiegeticPanGain; move32(); hIvasRend->inputsIsm[i].hOMasa = NULL; + move32(); hIvasRend->inputsIsm[i].bufferData_fx = NULL; + move32(); } FOR( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) @@ -2946,16 +3723,30 @@ ivas_error IVAS_REND_Open( initRendInputBase_fx( &hIvasRend->inputsMc[i].base, IVAS_AUDIO_CONFIG_INVALID, 0, getRendCtx( hIvasRend ), NULL, 0 ); hIvasRend->inputsMc[i].efapInWrapper.hEfap = NULL; + move32(); hIvasRend->inputsMc[i].crendWrapper = NULL; + move32(); hIvasRend->inputsMc[i].hReverb = NULL; + move32(); hIvasRend->inputsMc[i].tdRendWrapper.hBinRendererTd = NULL; + move32(); hIvasRend->inputsMc[i].bufferData_fx = NULL; + move32(); hIvasRend->inputsMc[i].lfeDelayBuffer_fx = NULL; + move32(); hIvasRend->inputsMc[i].nonDiegeticPan = nonDiegeticPan; move16(); hIvasRend->inputsMc[i].nonDiegeticPanGain_fx = nonDiegeticPanGain; move32(); hIvasRend->inputsMc[i].hMcMasa = NULL; + move32(); + FOR( j = 0; j < MAX_HEAD_ROT_POSES - 1; ++j ) + { + hIvasRend->inputsMc[i].splitTdRendWrappers[j].hBinRendererTd = NULL; + move32(); + hIvasRend->inputsMc[i].splitTdRendWrappers[j].hHrtfTD = NULL; + move32(); + } } FOR( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) @@ -2963,8 +3754,15 @@ ivas_error IVAS_REND_Open( initRendInputBase_fx( &hIvasRend->inputsSba[i].base, IVAS_AUDIO_CONFIG_INVALID, 0, getRendCtx( hIvasRend ), NULL, 0 ); hIvasRend->inputsSba[i].crendWrapper = NULL; + move32(); + hIvasRend->inputsSba[i].cldfbRendWrapper.hCldfbRend = NULL; + move32(); + hIvasRend->inputsSba[i].cldfbRendWrapper.hHrtfFastConv = NULL; + move32(); hIvasRend->inputsSba[i].bufferData_fx = NULL; + move32(); hIvasRend->inputsSba[i].hDirAC = NULL; + move32(); } FOR( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) @@ -2972,15 +3770,62 @@ ivas_error IVAS_REND_Open( initRendInputBase_fx( &hIvasRend->inputsMasa[i].base, IVAS_AUDIO_CONFIG_INVALID, 0, getRendCtx( hIvasRend ), NULL, 0 ); hIvasRend->inputsMasa[i].metadataHasBeenFed = false; + move16(); hIvasRend->inputsMasa[i].bufferData_fx = NULL; + move32(); hIvasRend->inputsMasa[i].hMasaPrerend = NULL; + move32(); hIvasRend->inputsMasa[i].hMasaExtRend = NULL; - move16(); + move32(); + } + + hIvasRend->hHrtfs.hHrtfFastConv = NULL; + move32(); + hIvasRend->hHrtfs.hHrtfParambin = NULL; + move32(); + hIvasRend->hHrtfs.hHrtfTD = NULL; + move32(); + hIvasRend->hHrtfs.hHrtfCrend = NULL; + move32(); + hIvasRend->hHrtfs.hHrtfStatistics = NULL; + move32(); + + IF( asHrtfBinary ) + { + IF( NE_32( ( error = ivas_HRTF_binary_open_fx( &( hIvasRend->hHrtfs.hHrtfTD ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + IF( NE_32( ( error = ivas_HRTF_CRend_binary_open_fx( &( hIvasRend->hHrtfs.hHrtfCrend ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + IF( NE_32( ( error = ivas_HRTF_fastconv_binary_open_fx( &( hIvasRend->hHrtfs.hHrtfFastConv ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + IF( NE_32( ( error = ivas_HRTF_parambin_binary_open_fx( &( hIvasRend->hHrtfs.hHrtfParambin ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + IF( NE_32( ( error = ivas_HRTF_statistics_binary_open_fx( &( hIvasRend->hHrtfs.hHrtfStatistics ) ) ), IVAS_ERR_OK ) ) + { + return error; + } } + IF( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + IF( NE_32( ( error = ivas_HRTF_statistics_init_fx( &( hIvasRend->hHrtfs.hHrtfStatistics ), hIvasRend->sampleRateOut ) ), IVAS_ERR_OK ) ) + { + return error; + } + } return IVAS_ERR_OK; } + + static LSSETUP_CUSTOM_STRUCT makeCustomLsSetup( const IVAS_CUSTOM_LS_DATA rendCustomLsLayout ) { @@ -2996,7 +3841,7 @@ static LSSETUP_CUSTOM_STRUCT makeCustomLsSetup( move16(); FOR( i = 0; i < rendCustomLsLayout.num_spk; ++i ) { - IF( fabsf( rendCustomLsLayout.elevation[i] ) > EPSILON ) + IF( LT_32( L_abs( rendCustomLsLayout.elevation_fx[i] ), EPSILON_FX ) ) { customLs.is_planar_setup = 0; move16(); @@ -3078,7 +3923,7 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( hIvasRend->customLsOut = makeCustomLsSetup( layout ); /* Re-initialize limiter - number of output channels may have changed */ - IF( NE_32( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = IVAS_REND_GetNumOutChannels( hIvasRend, &numOutChannels ) ), IVAS_ERR_OK ) ) { return error; } @@ -3124,7 +3969,7 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( /* Input inactive, skip. */ CONTINUE; } - IF( NE_32( ( error = updateSbaPanGains( inputSba, hIvasRend->outputConfig, hIvasRend->hRendererConfig ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = updateSbaPanGains( inputSba, hIvasRend->outputConfig, hIvasRend->hRendererConfig, NULL, NULL ) ), IVAS_ERR_OK ) ) { return error; } @@ -3139,7 +3984,7 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( * *-------------------------------------------------------------------*/ -ivas_error IVAS_REND_NumOutChannels( +ivas_error IVAS_REND_GetNumOutChannels( IVAS_REND_CONST_HANDLE hIvasRend, Word16 *numOutChannels ) { @@ -3313,31 +4158,55 @@ static ivas_error getConstInputById( return IVAS_ERR_OK; } +static void *getInputByIndex_fx( + void *inputsArray, + const size_t index, + const IVAS_REND_AudioConfigType inputType ) +{ + SWITCH( inputType ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + return (input_mc *) inputsArray + index; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + return (input_sba *) inputsArray + index; + case IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED: + return (input_ism *) inputsArray + index; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + return (input_masa *) inputsArray + index; + default: + break; + } + /* this should be unreachable */ + assert( 0 ); + + /* include a final return to make the linter happy and avoid problems with wmc_tool (see #1355) */ + return NULL; +} + static ivas_error findFreeInputSlot_fx( - const void *inputs, - const Word32 inputStructSize, + void *inputs, + const IVAS_REND_AudioConfigType inputType, const Word32 maxInputs, Word32 *inputIndex ) { - /* Using a void pointer and a separately provided size is a hack for this function + /* Using a void pointer and a separately provided type is a hack for this function to be reusable for arrays of any input type (input_ism, input_mc, input_sba, input_masa). Assumptions: - input_base is always the first member in the input struct - - provided size is correct + - memory alignments of original input type and input_base are the same */ Word32 i; bool canAddInput; - const UWord8 *pByte; const input_base *pInputBase; canAddInput = false; move16(); /* Find first unused input in array */ - FOR( ( i = 0, pByte = inputs ); i < maxInputs; ( ++i, pByte += inputStructSize ) ) + FOR( i = 0; i < maxInputs; ++i ) { - pInputBase = (const input_base *) pByte; + pInputBase = (const input_base *) getInputByIndex_fx( inputs, i, inputType ); IF( EQ_32( pInputBase->inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { @@ -3358,107 +4227,383 @@ static ivas_error findFreeInputSlot_fx( } -/*-------------------------------------------------------------------* - * IVAS_REND_AddInput() +/*------------------------------------------------------------------------- + * Function getCldfbRendFlag() * * - *-------------------------------------------------------------------*/ -ivas_error IVAS_REND_AddInput_fx( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const AUDIO_CONFIG inConfig, /* i : audio config for a new input */ - IVAS_REND_InputId *inputId /* o : ID of the new input */ -) -{ - ivas_error error; - Word32 maxNumInputsOfType; - void *inputsArray; - Word32 inputStructSize; - ivas_error ( *activateInput )( void *, AUDIO_CONFIG, IVAS_REND_InputId, RENDER_CONFIG_DATA * ); - Word32 inputIndex; - - /* Validate function arguments */ - test(); - IF( hIvasRend == NULL || inputId == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - + *------------------------------------------------------------------------*/ - SWITCH( getAudioConfigType( inConfig ) ) - { - case IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED: - maxNumInputsOfType = RENDERER_MAX_ISM_INPUTS; - inputsArray = hIvasRend->inputsIsm; - inputStructSize = sizeof( *hIvasRend->inputsIsm ); - activateInput = setRendInputActiveIsm; - move32(); - move32(); - BREAK; - case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: - maxNumInputsOfType = RENDERER_MAX_MC_INPUTS; - inputsArray = hIvasRend->inputsMc; - inputStructSize = sizeof( *hIvasRend->inputsMc ); - activateInput = setRendInputActiveMc; - move32(); - move32(); - BREAK; - case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: - maxNumInputsOfType = RENDERER_MAX_SBA_INPUTS; - inputsArray = hIvasRend->inputsSba; - inputStructSize = sizeof( *hIvasRend->inputsSba ); - activateInput = setRendInputActiveSba; - move32(); - move32(); - BREAK; - case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: - maxNumInputsOfType = RENDERER_MAX_MASA_INPUTS; - inputsArray = hIvasRend->inputsMasa; - inputStructSize = sizeof( *hIvasRend->inputsMasa ); - activateInput = setRendInputActiveMasa; - move32(); - move32(); - BREAK; - default: - return IVAS_ERR_INVALID_INPUT_FORMAT; - } +static Word16 getCldfbRendFlag( + IVAS_REND_HANDLE hIvasRend, /* i : Renderer handle */ + const IVAS_REND_AudioConfigType new_configType ) +{ + Word16 i; + Word16 numMasaInputs = 0, numSbaInputs = 0; + Word16 isCldfbRend; - /* Find first free input in array corresponding to input type */ - IF( NE_32( ( error = findFreeInputSlot_fx( inputsArray, inputStructSize, maxNumInputsOfType, &inputIndex ) ), IVAS_ERR_OK ) ) - { - return error; - } + move16(); + move16(); + move16(); + move16(); - *inputId = makeInputId( inConfig, inputIndex ); + isCldfbRend = 0; move16(); - IF( NE_32( ( error = activateInput( (UWord8 *) inputsArray + inputStructSize * inputIndex, inConfig, *inputId, hIvasRend->hRendererConfig ) ), IVAS_ERR_OK ) ) + /* This function is called during three different phases of renderer processing: + * - IVAS_REND_AddInput() + * - IVAS_REND_FeedRenderConfig() + * - IVAS_REND_GetSplitBinauralBitstream() + * Only the last case can assume all inputs are present for the current frame to be rendered */ + IF( hIvasRend->hRendererConfig != NULL ) { - return error; + FOR( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) + { + numMasaInputs = add( numMasaInputs, ( hIvasRend->inputsMasa[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID && new_configType != IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ? 0 : 1 ); + move16(); + } + FOR( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) + { + numSbaInputs = add( numSbaInputs, ( hIvasRend->inputsSba[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID && new_configType != IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ? 0 : 1 ); + move16(); + } + + IF( GT_16( numMasaInputs, 0 ) || ( GT_16( numSbaInputs, 0 ) && EQ_32( hIvasRend->hRendererConfig->split_rend_config.rendererSelection, IVAS_BIN_RENDERER_TYPE_FASTCONV ) ) ) + { + isCldfbRend = 1; + move16(); + } } - return IVAS_ERR_OK; + return isCldfbRend; } -/*-------------------------------------------------------------------* - * IVAS_REND_ConfigureCustomInputLoudspeakerLayout() +/*------------------------------------------------------------------------- + * Function isar_pre_rend_init() * * - * Note: this will reset any custom LFE routing set for the input - *-------------------------------------------------------------------*/ -ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const IVAS_REND_InputId inputId, /* i : ID of the input */ - const IVAS_CUSTOM_LS_DATA layout /* i : custom loudspeaker layout for input */ -) + *------------------------------------------------------------------------*/ + +static ivas_error isar_pre_rend_init( + SPLIT_REND_WRAPPER *pSplitRendWrapper, + IVAS_REND_AudioBuffer *pSplitRendEncBuffer, + ISAR_SPLIT_REND_CONFIG_DATA *pSplit_rend_config, + IVAS_REND_HeadRotData headRotData, + const Word32 outputSampleRate, + const AUDIO_CONFIG outConfig, + const Word16 cldfb_in_flag, + const Word16 num_subframes ) { - input_mc *inputMc; + bool realloc; ivas_error error; + IVAS_REND_AudioBufferConfig bufConfig; - /* Validate function arguments */ - IF( hIvasRend == NULL ) + realloc = false; + + /* only perform init if split rendering output */ + test(); + IF( NE_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; + return IVAS_ERR_OK; + } + + /* these functions should only be called once during initial allocation */ + IF( pSplitRendEncBuffer->data_fx == NULL ) + { + IF( EQ_32( pSplit_rend_config->poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) ) + { + ISAR_PRE_REND_GetMultiBinPoseData( pSplit_rend_config, &pSplitRendWrapper->multiBinPoseData, headRotData.sr_pose_pred_axis ); + } + ELSE IF( EQ_32( pSplit_rend_config->poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ) + { + isar_renderSplitUpdateNoCorrectionPoseData( pSplit_rend_config, &pSplitRendWrapper->multiBinPoseData ); + } + + IF( ( error = ISAR_PRE_REND_open( pSplitRendWrapper, pSplit_rend_config, outputSampleRate, cldfb_in_flag, outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM, num_subframes, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* We may need to change the allocated buffer size if a new input is added. + * If the cldfb_in_flag is different from what was previously allocated for the buffer, change the size */ + test(); + IF( pSplitRendEncBuffer->data_fx != NULL && ( NE_16( cldfb_in_flag, pSplitRendEncBuffer->config.is_cldfb ) ) ) + { + realloc = true; + } + + test(); + IF( pSplitRendEncBuffer->data_fx == NULL || NE_16( realloc, 0 ) ) + { + /* set buffer config */ + bufConfig.is_cldfb = cldfb_in_flag; + move16(); + + bufConfig.numSamplesPerChannel = L_FRAME_MAX; + move16(); + IF( NE_16( cldfb_in_flag, 0 ) ) + { + bufConfig.numSamplesPerChannel = MAX_CLDFB_BUFFER_LENGTH_PER_CHANNEL; + move16(); + } + + bufConfig.numChannels = i_mult( BINAURAL_CHANNELS, pSplitRendWrapper->multiBinPoseData.num_poses ); + move16(); + pSplitRendEncBuffer->config = bufConfig; + move32(); + + /* allocate memory */ + IF( NE_16( realloc, 0 ) ) + { + free( pSplitRendEncBuffer->data_fx ); + } + + IF( ( pSplitRendEncBuffer->data_fx = malloc( bufConfig.numChannels * bufConfig.numSamplesPerChannel * sizeof( Word32 ) ) ) == NULL ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + pSplitRendEncBuffer->q_factor = 0; + move16(); + pSplitRendEncBuffer->pq_fact = &pSplitRendEncBuffer->q_factor; + move16(); + } + + return IVAS_ERR_OK; +} +static IVAS_ROOM_SIZE_T getDefaultReverbSize( + input_ism *ismInputs, + input_masa *masaInputs, + input_mc *mcInputs, + input_sba *sbaInputs ) +{ + bool combinedFormat; + Word16 i; + Word16 nActiveInputsIsm, nActiveInputsMasa, nActiveInputsSba, nActiveInputsMc; + IVAS_ROOM_SIZE_T selectedReverb; + selectedReverb = IVAS_ROOM_SIZE_MEDIUM; + move32(); + + combinedFormat = false; + nActiveInputsIsm = 0; + nActiveInputsMasa = 0; + nActiveInputsMc = 0; + nActiveInputsSba = 0; + move16(); + move16(); + move16(); + move16(); + move16(); + + FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; i++ ) + { + IF( NE_32( ismInputs[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + nActiveInputsIsm = add( nActiveInputsIsm, 1 ); + } + } + FOR( i = 0; i < RENDERER_MAX_MASA_INPUTS; i++ ) + { + IF( NE_32( masaInputs[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + nActiveInputsMasa = add( nActiveInputsMasa, 1 ); + } + } + FOR( i = 0; i < RENDERER_MAX_MC_INPUTS; i++ ) + { + IF( NE_32( mcInputs[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + nActiveInputsMc = add( nActiveInputsMc, 1 ); + } + } + FOR( i = 0; i < RENDERER_MAX_SBA_INPUTS; i++ ) + { + IF( NE_32( sbaInputs[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + nActiveInputsSba = add( nActiveInputsSba, 1 ); + } + } + + /* ISM present with MASA/SBA inputs; treat as combined format */ + test(); + test(); + IF( nActiveInputsIsm && ( nActiveInputsMasa || nActiveInputsSba ) ) + { + combinedFormat = true; + move16(); + } + + IF( combinedFormat ) + { + selectedReverb = IVAS_ROOM_SIZE_MEDIUM; + move32(); + } + ELSE + { + /* Only set large if ISM is present alone */ + test(); + IF( nActiveInputsIsm && !nActiveInputsMc ) + { + selectedReverb = IVAS_ROOM_SIZE_LARGE; + move32(); + } + /* if only MC is present, set medium; Will not be overridden by the subsequent block */ + ELSE IF( nActiveInputsMc ) + { + selectedReverb = IVAS_ROOM_SIZE_MEDIUM; + move32(); + } + ELSE IF( nActiveInputsMasa || nActiveInputsSba ) + { + selectedReverb = IVAS_ROOM_SIZE_SMALL; + move32(); + } + } + + return selectedReverb; +} + +/*-------------------------------------------------------------------* + * IVAS_REND_AddInput() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_AddInput_fx( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const AUDIO_CONFIG inConfig, /* i : audio config for a new input */ + IVAS_REND_InputId *inputId /* o : ID of the new input */ +) +{ + ivas_error error; + Word32 maxNumInputsOfType; + void *inputsArray; + IVAS_REND_AudioConfigType inputType; + ivas_error ( *activateInput )( void *, AUDIO_CONFIG, IVAS_REND_InputId, RENDER_CONFIG_DATA *, hrtf_handles *hrtfs ); + void ( *setInputDelay )( void *, bool ); + Word32 inputIndex; + bool splitPreRendCldfb; + splitPreRendCldfb = false; + + + /* Validate function arguments */ + test(); + IF( hIvasRend == NULL || inputId == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( hIvasRend->hRendererConfig != NULL ) + { + Word16 cldfb_in_flag; + cldfb_in_flag = getCldfbRendFlag( hIvasRend, getAudioConfigType( inConfig ) ); + + IF( ( error = isar_pre_rend_init( hIvasRend->splitRendWrapper, + &hIvasRend->splitRendEncBuffer, + &hIvasRend->hRendererConfig->split_rend_config, + hIvasRend->headRotData, hIvasRend->sampleRateOut, + hIvasRend->outputConfig, cldfb_in_flag, + hIvasRend->num_subframes ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*assumes that input has been added which means codec has been set to either lcld or lc3plus (even if render config specified default)*/ + splitPreRendCldfb = EQ_32( hIvasRend->hRendererConfig->split_rend_config.codec, ISAR_SPLIT_REND_CODEC_LCLD ); + } + + + inputType = getAudioConfigType( inConfig ); + SWITCH( inputType ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED: + maxNumInputsOfType = RENDERER_MAX_ISM_INPUTS; + inputsArray = hIvasRend->inputsIsm; + activateInput = setRendInputActiveIsm; + setInputDelay = setRendInputDelayIsm; + move32(); + move32(); + BREAK; + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + maxNumInputsOfType = RENDERER_MAX_MC_INPUTS; + inputsArray = hIvasRend->inputsMc; + activateInput = setRendInputActiveMc; + setInputDelay = setRendInputDelayMc; + move32(); + move32(); + BREAK; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + maxNumInputsOfType = RENDERER_MAX_SBA_INPUTS; + inputsArray = hIvasRend->inputsSba; + activateInput = setRendInputActiveSba; + setInputDelay = setRendInputDelaySba; + move32(); + move32(); + BREAK; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + maxNumInputsOfType = RENDERER_MAX_MASA_INPUTS; + inputsArray = hIvasRend->inputsMasa; + activateInput = setRendInputActiveMasa; + setInputDelay = setRendInputDelayMasa; + move32(); + move32(); + BREAK; + default: + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + + /* Find first free input in array corresponding to input type */ + IF( NE_32( ( error = findFreeInputSlot_fx( inputsArray, inputType, maxNumInputsOfType, &inputIndex ) ), IVAS_ERR_OK ) ) + { + return error; + } + + *inputId = makeInputId( inConfig, inputIndex ); + move16(); + IF( NE_32( ( error = activateInput( getInputByIndex_fx( inputsArray, inputIndex, inputType ), inConfig, *inputId, hIvasRend->hRendererConfig, &hIvasRend->hHrtfs ) ), IVAS_ERR_OK ) ) + { + return error; + } + + setInputDelay( getInputByIndex_fx( inputsArray, inputIndex, inputType ), splitPreRendCldfb ); + + /* set global maximum delay after adding an input */ + setMaxGlobalDelayNs( hIvasRend ); + + /* select default reverb size after adding an input */ + IF( EQ_32( hIvasRend->selectedRoomReverbSize, DEFAULT_REVERB_UNSET ) ) + { + IVAS_REND_SetReverbRoomSize( hIvasRend, + getDefaultReverbSize( hIvasRend->inputsIsm, + hIvasRend->inputsMasa, + hIvasRend->inputsMc, + hIvasRend->inputsSba ) ); + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_ConfigureCustomInputLoudspeakerLayout() + * + * + * Note: this will reset any custom LFE routing set for the input + *-------------------------------------------------------------------*/ +ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const IVAS_CUSTOM_LS_DATA layout /* i : custom loudspeaker layout for input */ +) +{ + input_mc *inputMc; + ivas_error error; + + /* Validate function arguments */ + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; } IF( NE_32( ( error = validateCustomLsLayout_fx( layout ) ), IVAS_ERR_OK ) ) @@ -3489,11 +4634,9 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( return error; } - test(); - test(); - IF( EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) { - IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, FALSE ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hHrtfCrend, hIvasRend->hHrtfs.hHrtfStatistics, FALSE ) ), IVAS_ERR_OK ) ) { return error; } @@ -3507,11 +4650,40 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( return IVAS_ERR_OK; } + +/*-------------------------------------------------------------------* + * IVAS_REND_SetObjectIDs() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetObjectIDs( + IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ +) +{ + Word16 i; + + /* Validate function arguments */ + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; i++ ) + { + hIvasRend->inputsIsm[i].object_id = i; + } + + return IVAS_ERR_OK; +} + + /*-------------------------------------------------------------------* * IVAS_REND_SetInputGain() * * *-------------------------------------------------------------------*/ + ivas_error IVAS_REND_SetInputGain_fx( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ @@ -3538,11 +4710,13 @@ ivas_error IVAS_REND_SetInputGain_fx( return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * IVAS_REND_SetInputLfeMtx() * * *-------------------------------------------------------------------*/ + ivas_error IVAS_REND_SetInputLfeMtx_fx( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ @@ -3575,7 +4749,7 @@ ivas_error IVAS_REND_SetInputLfeMtx_fx( /* copy LFE panning matrix */ FOR( i = 0; i < RENDERER_MAX_INPUT_LFE_CHANNELS; i++ ) { - Copy32( ( *lfePanMtx )[i], pInputMc->lfeRouting.lfePanMtx_fx[i], IVAS_MAX_OUTPUT_CHANNELS ); + Copy32( ( *lfePanMtx )[i], pInputMc->lfeRouting.lfePanMtx_fx[i], RENDERER_MAX_OUTPUT_CHANNELS ); } IF( NE_32( ( error = updateMcPanGains( pInputMc, hIvasRend->outputConfig ) ), IVAS_ERR_OK ) ) @@ -3586,6 +4760,7 @@ ivas_error IVAS_REND_SetInputLfeMtx_fx( return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * IVAS_REND_SetInputLfePos() * @@ -3639,11 +4814,13 @@ ivas_error IVAS_REND_SetInputLfePos_fx( return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * IVAS_REND_RemoveInput() * * *-------------------------------------------------------------------*/ + /* ToDo; unused function */ ivas_error IVAS_REND_RemoveInput( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ @@ -3691,6 +4868,7 @@ ivas_error IVAS_REND_RemoveInput( * * *-------------------------------------------------------------------*/ + ivas_error IVAS_REND_GetInputNumChannels( IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ @@ -3720,11 +4898,13 @@ ivas_error IVAS_REND_GetInputNumChannels( return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * IVAS_REND_GetNumAllObjects() * * *-------------------------------------------------------------------*/ + ivas_error IVAS_REND_GetNumAllObjects( IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ Word16 *numChannels /* o : number of all objects */ @@ -3746,33 +4926,21 @@ ivas_error IVAS_REND_GetNumAllObjects( return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * IVAS_REND_GetDelay() * * *-------------------------------------------------------------------*/ + ivas_error IVAS_REND_GetDelay_fx( IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer state */ Word16 *nSamples, /* o : Renderer delay in samples */ Word32 *timeScale /* o : Time scale of the delay, equal to renderer output sampling rate */ ) { - /* TODO tmu : this function only returns the maximum delay across all inputs - * Ideally each input has its own delay buffer and everything is aligned (binaural and LFE filtering delays are nonuniform) - */ - Word16 i; - Word32 latency_ns; Word32 max_latency_ns; - Word32 timescale_by_ns[7] = { 0, 17180, 34360, 0, 68719, 0, 103079 }; - move32(); - move32(); - move32(); - move32(); - move32(); - move32(); - move32(); - /* Validate function arguments */ test(); test(); @@ -3781,93 +4949,19 @@ ivas_error IVAS_REND_GetDelay_fx( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - *timeScale = hIvasRend->sampleRateOut; - move32(); - assert( *timeScale == 8000 || *timeScale == 16000 || *timeScale == 32000 || *timeScale == 48000 ); *nSamples = 0; move16(); - max_latency_ns = 0; + + *timeScale = hIvasRend->sampleRateOut; move32(); + max_latency_ns = getMaxGlobalDelayNs( hIvasRend ); - /* Compute the maximum delay across all inputs */ - FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; i++ ) - { - IF( NE_32( hIvasRend->inputsIsm[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) - { - IF( hIvasRend->inputsIsm[i].crendWrapper != NULL ) - { - latency_ns = hIvasRend->inputsIsm[i].crendWrapper->binaural_latency_ns; - } - ELSE - { - latency_ns = 0; - } - move32(); - - latency_ns = L_max( latency_ns, hIvasRend->inputsIsm[i].tdRendWrapper.binaural_latency_ns ); - max_latency_ns = L_max( max_latency_ns, latency_ns ); - } - } - - FOR( i = 0; i < RENDERER_MAX_MC_INPUTS; i++ ) - { - IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) - { - IF( ( hIvasRend->inputsMc[i].crendWrapper != NULL ) ) - { - latency_ns = hIvasRend->inputsMc[i].crendWrapper->binaural_latency_ns; - } - ELSE - { - latency_ns = 0; - } - - move32(); - - latency_ns = L_max( latency_ns, hIvasRend->inputsMc[i].tdRendWrapper.binaural_latency_ns ); - max_latency_ns = L_max( max_latency_ns, latency_ns ); - } - } - - FOR( i = 0; i < RENDERER_MAX_SBA_INPUTS; i++ ) - { - IF( NE_32( hIvasRend->inputsSba[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) - { - { - IF( hIvasRend->inputsSba[i].crendWrapper != NULL ) - { - latency_ns = hIvasRend->inputsSba[i].crendWrapper->binaural_latency_ns; - } - ELSE - { - latency_ns = 0; - } - move32(); - max_latency_ns = L_max( max_latency_ns, latency_ns ); - } - } - } - - - FOR( i = 0; i < RENDERER_MAX_MASA_INPUTS; i++ ) - { - IF( NE_32( hIvasRend->inputsMasa[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) - { - latency_ns = (Word32) ( IVAS_FB_DEC_DELAY_NS ); - move32(); - max_latency_ns = L_max( max_latency_ns, latency_ns ); - } - } - - - //*nSamples = (Word16) roundf( (float) max_latency_ns * *timeScale / 1000000000.f ); - Word32 temp = Mpy_32_32( *timeScale, 268436 ); // Q0 + Q31 - Q31 -> Q0, ( 1 / 8000 ) * 2 ^ 31 - *nSamples = extract_l( Mpy_32_32_r( max_latency_ns, timescale_by_ns[temp] ) ); - move16(); + *nSamples = latencyNsToSamples( hIvasRend->sampleRateOut, max_latency_ns ); return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * IVAS_REND_FeedInputAudio() * @@ -3875,14 +4969,17 @@ ivas_error IVAS_REND_GetDelay_fx( *-------------------------------------------------------------------*/ ivas_error IVAS_REND_FeedInputAudio_fx( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const IVAS_REND_InputId inputId, /* i : ID of the input */ - const IVAS_REND_ReadOnlyAudioBuffer inputAudio /* i : buffer with input audio */ + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const IVAS_REND_ReadOnlyAudioBuffer inputAudio, /* i : buffer with input audio */ + const bool flushInputs /* i : flush input audio */ ) { ivas_error error; input_base *inputBase; Word16 numInputChannels; + /* Note: this is called cldfb2tdSampleFact in float */ + Word16 cldfb2tdShift; /* Validate function arguments */ test(); @@ -3892,7 +4989,14 @@ ivas_error IVAS_REND_FeedInputAudio_fx( } test(); - IF( inputAudio.config.numSamplesPerChannel <= 0 || LT_16( MAX_BUFFER_LENGTH_PER_CHANNEL, inputAudio.config.numSamplesPerChannel ) ) + cldfb2tdShift = ( inputAudio.config.is_cldfb ) ? 1 : 0; + + test(); + test(); + test(); + test(); + IF( inputAudio.config.numSamplesPerChannel <= 0 || ( L_FRAME_MAX < inputAudio.config.numSamplesPerChannel && inputAudio.config.is_cldfb == 0 ) || + ( ( shl( L_FRAME_MAX, cldfb2tdShift ) ) < inputAudio.config.numSamplesPerChannel && inputAudio.config.is_cldfb == 1 ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Buffer size outside of supported range" ); } @@ -3906,7 +5010,9 @@ ivas_error IVAS_REND_FeedInputAudio_fx( test(); move32(); // move added for typecasting IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) && - NE_32( L_mult0( inputAudio.config.numSamplesPerChannel, 1000 ), (Word32) W_mult0_32_32( L_mult0( BINAURAL_RENDERING_FRAME_SIZE_MS, hIvasRend->num_subframes ), hIvasRend->sampleRateOut ) ) ) + NE_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && + NE_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) && + NE_32( L_shr( L_mult0( inputAudio.config.numSamplesPerChannel, 1000 ), cldfb2tdShift ), (Word32) W_mult0_32_32( L_mult0( BINAURAL_RENDERING_FRAME_SIZE_MS, hIvasRend->num_subframes ), hIvasRend->sampleRateOut ) ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Binaural rendering requires specific frame size" ); } @@ -3920,6 +5026,7 @@ ivas_error IVAS_REND_FeedInputAudio_fx( { return error; } + test(); test(); IF( ( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) && EQ_32( inputBase->inConfig, IVAS_AUDIO_CONFIG_OBA ) ) @@ -3935,9 +5042,18 @@ ivas_error IVAS_REND_FeedInputAudio_fx( inputBase->inputBuffer.config = inputAudio.config; - MVR2R_WORD32( inputAudio.data_fx, inputBase->inputBuffer.data_fx, inputAudio.config.numSamplesPerChannel * inputAudio.config.numChannels ); + if ( ( error = alignInputDelay( + inputBase, + inputAudio, + hIvasRend->maxGlobalDelayNs, + hIvasRend->sampleRateOut, + cldfb2tdShift, + flushInputs ) ) != IVAS_ERR_OK ) + { + return error; + } - inputBase->numNewSamplesPerChannel = inputAudio.config.numSamplesPerChannel; + inputBase->numNewSamplesPerChannel = shr( inputAudio.config.numSamplesPerChannel, cldfb2tdShift ); move32(); return IVAS_ERR_OK; @@ -3990,6 +5106,7 @@ ivas_error IVAS_REND_FeedInputObjectMetadata( * * *-------------------------------------------------------------------*/ + ivas_error IVAS_REND_FeedInputObjectMetadataToOMasa( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const Word16 inputIndex, /* i : Index of the input */ @@ -4011,6 +5128,7 @@ ivas_error IVAS_REND_FeedInputObjectMetadataToOMasa( return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * IVAS_REND_FeedInputMasaMetadata() * @@ -4058,6 +5176,7 @@ ivas_error IVAS_REND_FeedInputMasaMetadata( * * *-------------------------------------------------------------------*/ + ivas_error IVAS_REND_InitConfig( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const AUDIO_CONFIG outAudioConfig /* i : output audioConfig */ @@ -4081,7 +5200,7 @@ ivas_error IVAS_REND_InitConfig( IF( rendererConfigEnabled ) { - IF( NE_32( ( error = ivas_render_config_open( &( hIvasRend->hRendererConfig ) ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_render_config_open_fx( &( hIvasRend->hRendererConfig ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -4098,14 +5217,15 @@ ivas_error IVAS_REND_InitConfig( return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * IVAS_REND_GetRenderConfig() * * *-------------------------------------------------------------------*/ -Word16 IVAS_REND_GetRenderConfig( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ +ivas_error IVAS_REND_GetRenderConfig( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ const IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render configuration handle */ ) { @@ -4119,13 +5239,13 @@ Word16 IVAS_REND_GetRenderConfig( } hRCin = hIvasRend->hRendererConfig; - hRCout->roomAcoustics.override = hRCin->roomAcoustics.override; + hRCout->roomAcoustics.aeID = hRCin->roomAcoustics.aeID; + move16(); hRCout->roomAcoustics.nBands = hRCin->roomAcoustics.nBands; hRCout->roomAcoustics.acousticPreDelay_fx = hRCin->roomAcoustics.acousticPreDelay_fx; hRCout->roomAcoustics.inputPreDelay_fx = hRCin->roomAcoustics.inputPreDelay_fx; Copy( hRCin->directivity_fx, hRCout->directivity_fx, 3 * MAX_NUM_OBJECTS ); move16(); - move16(); move32(); move32(); @@ -4133,12 +5253,24 @@ Word16 IVAS_REND_GetRenderConfig( Copy32( hRCin->roomAcoustics.pAcoustic_rt60_fx, hRCout->roomAcoustics.pAcoustic_rt60_fx, CLDFB_NO_CHANNELS_MAX ); Copy32( hRCin->roomAcoustics.pAcoustic_dsr_fx, hRCout->roomAcoustics.pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX ); + hRCout->split_rend_config.splitRendBitRate = ISAR_MAX_SPLIT_REND_BITRATE; + hRCout->split_rend_config.dof = 3; + hRCout->split_rend_config.hq_mode = 0; + hRCout->split_rend_config.codec_delay_ms = 0; + hRCout->split_rend_config.isar_frame_size_ms = 20; + hRCout->split_rend_config.codec_frame_size_ms = 0; /* 0 means "use default for selected codec" */ + hRCout->split_rend_config.codec = ISAR_SPLIT_REND_CODEC_DEFAULT; + hRCout->split_rend_config.poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB; + hRCout->split_rend_config.rendererSelection = hRCin->split_rend_config.rendererSelection; + hRCout->split_rend_config.lc3plus_highres = 0; hRCout->roomAcoustics.use_er = hRCin->roomAcoustics.use_er; hRCout->roomAcoustics.lowComplexity = hRCin->roomAcoustics.lowComplexity; move16(); move32(); + Copy32( hRCin->distAtt_fx, hRCout->distAtt_fx, 3 ); + return IVAS_ERR_OK; } @@ -4149,21 +5281,28 @@ Word16 IVAS_REND_GetRenderConfig( * *-------------------------------------------------------------------*/ -Word16 IVAS_REND_FeedRenderConfig( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ +ivas_error IVAS_REND_FeedRenderConfig( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ const IVAS_RENDER_CONFIG_DATA renderConfig /* i : Render configuration struct */ ) { RENDER_CONFIG_HANDLE hRenderConfig; + UWord16 i; + input_ism *pIsmInput; + input_masa *pMasaInput; + input_mc *pMcInput; + input_sba *pSbaInput; + ivas_error error; test(); IF( hIvasRend == NULL || hIvasRend->hRendererConfig == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } + hRenderConfig = hIvasRend->hRendererConfig; - hRenderConfig->roomAcoustics.override = renderConfig.roomAcoustics.override; + hRenderConfig->roomAcoustics.aeID = renderConfig.roomAcoustics.aeID; move16(); hRenderConfig->roomAcoustics.nBands = renderConfig.roomAcoustics.nBands; move16(); @@ -4175,6 +5314,7 @@ Word16 IVAS_REND_FeedRenderConfig( Copy32( renderConfig.roomAcoustics.pAcoustic_rt60_fx, hRenderConfig->roomAcoustics.pAcoustic_rt60_fx, CLDFB_NO_CHANNELS_MAX ); Copy32( renderConfig.roomAcoustics.pAcoustic_dsr_fx, hRenderConfig->roomAcoustics.pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX ); Copy( renderConfig.directivity_fx, hRenderConfig->directivity_fx, 3 * MAX_NUM_OBJECTS ); + Copy32( renderConfig.distAtt_fx, hRenderConfig->distAtt_fx, 3 ); hRenderConfig->roomAcoustics.use_er = 0; move16(); @@ -4190,20 +5330,166 @@ Word16 IVAS_REND_FeedRenderConfig( Copy32( renderConfig.roomAcoustics.AbsCoeff_fx, hRenderConfig->roomAcoustics.AbsCoeff_fx, IVAS_ROOM_ABS_COEFF ); } + /* Re-initialize reverb instance if already available */ + /* ISM inputs */ + FOR( ( i = 0, pIsmInput = hIvasRend->inputsIsm ); i < RENDERER_MAX_ISM_INPUTS; ( ++i, ++pIsmInput ) ) + { + IF( EQ_32( pIsmInput->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + /* Skip inactive inputs */ + continue; + } + + IF( pIsmInput->hReverb != NULL ) + { + IF( NE_32( ( error = ivas_reverb_open_fx( &pIsmInput->hReverb, hIvasRend->hHrtfs.hHrtfStatistics, hRenderConfig, *pIsmInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + test(); + IF( pIsmInput->crendWrapper != NULL && pIsmInput->crendWrapper->hCrend[0] != NULL ) + { + IF( NE_32( ( error = ivas_reverb_open_fx( &pIsmInput->crendWrapper->hCrend[0]->hReverb, hIvasRend->hHrtfs.hHrtfStatistics, hRenderConfig, *pIsmInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + + /* MASA inputs */ + FOR( ( i = 0, pMasaInput = hIvasRend->inputsMasa ); i < RENDERER_MAX_MASA_INPUTS; ( ++i, ++pMasaInput ) ) + { + IF( EQ_32( pMasaInput->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + /* Skip inactive inputs */ + continue; + } + + IF( pMasaInput->hMasaExtRend != NULL ) + { + test(); + IF( pMasaInput->hMasaExtRend->hDiracDecBin[0] != NULL && pMasaInput->hMasaExtRend->hDiracDecBin[0]->hReverb != NULL ) + { + ivas_binaural_reverb_close_fx( &pMasaInput->hMasaExtRend->hDiracDecBin[0]->hReverb ); + + IF( NE_32( ( error = ivas_binaural_reverb_init_fx( &pMasaInput->hMasaExtRend->hDiracDecBin[0]->hReverb, hIvasRend->hHrtfs.hHrtfStatistics, pMasaInput->hMasaExtRend->hSpatParamRendCom->num_freq_bands, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRenderConfig->roomAcoustics ), *pMasaInput->base.ctx.pOutSampleRate, NULL, NULL, NULL ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( pMasaInput->hMasaExtRend->hReverb != NULL ) + { + ivas_binaural_reverb_close_fx( &pMasaInput->hMasaExtRend->hReverb ); + + IF( NE_32( ( error = ivas_binaural_reverb_init_fx( &pMasaInput->hMasaExtRend->hReverb, hIvasRend->hHrtfs.hHrtfStatistics, pMasaInput->hMasaExtRend->hSpatParamRendCom->num_freq_bands, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRenderConfig->roomAcoustics ), *pMasaInput->base.ctx.pOutSampleRate, NULL, NULL, NULL ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + } + + /* Multi-channel inputs */ + FOR( ( i = 0, pMcInput = hIvasRend->inputsMc ); i < RENDERER_MAX_MC_INPUTS; ( ++i, ++pMcInput ) ) + { + IF( EQ_32( pMcInput->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + /* Skip inactive inputs */ + continue; + } + + IF( pMcInput->hReverb != NULL ) + { + IF( NE_32( ( error = ivas_reverb_open_fx( &pMcInput->hReverb, hIvasRend->hHrtfs.hHrtfStatistics, hRenderConfig, *pMcInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + test(); + test(); + IF( pMcInput->crendWrapper != NULL && pMcInput->crendWrapper->hCrend[0] && pMcInput->crendWrapper->hCrend[0]->hReverb != NULL ) + { + IF( NE_32( ( error = ivas_reverb_open_fx( &pMcInput->crendWrapper->hCrend[0]->hReverb, hIvasRend->hHrtfs.hHrtfStatistics, hRenderConfig, *pMcInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + + /* SBA inputs */ + FOR( ( i = 0, pSbaInput = hIvasRend->inputsSba ); i < RENDERER_MAX_SBA_INPUTS; ( ++i, ++pSbaInput ) ) + { + IF( EQ_32( pSbaInput->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + /* Skip inactive inputs */ + continue; + } + + test(); + test(); + IF( pSbaInput->crendWrapper != NULL && pSbaInput->crendWrapper->hCrend[0] != NULL && pSbaInput->crendWrapper->hCrend[0]->hReverb != NULL ) + { + IF( NE_32( ( error = ivas_reverb_open_fx( &pSbaInput->crendWrapper->hCrend[0]->hReverb, hIvasRend->hHrtfs.hHrtfStatistics, hRenderConfig, *pSbaInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + + hRenderConfig->split_rend_config = renderConfig.split_rend_config; + /* Overwrite any pose correction settings if 0 DOF (no pose correction) was selected */ + IF( EQ_16( hRenderConfig->split_rend_config.dof, 0 ) ) + { + hRenderConfig->split_rend_config.poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE; + } + + hRenderConfig->split_rend_config.codec = renderConfig.split_rend_config.codec; + + IF( ( error = isar_split_rend_validate_config( &hRenderConfig->split_rend_config, ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Must re-initialize split rendering config in case renderer config is updated after adding renderer inputs */ + /* if its not initialized yet then no need to re-initialize, initialization will happen while adding inputs*/ + IF( hIvasRend->splitRendEncBuffer.data_fx != NULL && hIvasRend->hRendererConfig != NULL ) + { + Word16 cldfb_in_flag; + cldfb_in_flag = getCldfbRendFlag( hIvasRend, IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN ); + + IF( hIvasRend->splitRendWrapper != NULL ) + { + ISAR_PRE_REND_close( hIvasRend->splitRendWrapper, &hIvasRend->splitRendEncBuffer ); + free( hIvasRend->splitRendWrapper ); + hIvasRend->splitRendWrapper = NULL; + } + + IF( ( error = isar_pre_rend_init( hIvasRend->splitRendWrapper, &hIvasRend->splitRendEncBuffer, &hIvasRend->hRendererConfig->split_rend_config, hIvasRend->headRotData, hIvasRend->sampleRateOut, hIvasRend->outputConfig, cldfb_in_flag, hIvasRend->num_subframes ) ) != IVAS_ERR_OK ) + { + return error; + } + } return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * IVAS_REND_SetHeadRotation() * * *-------------------------------------------------------------------*/ + ivas_error IVAS_REND_SetHeadRotation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ - const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ - const Word16 sf_idx /* i : subframe index */ + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ + const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ + const ISAR_SPLIT_REND_ROT_AXIS rot_axis, /* i : external control for rotation axis for split rendering */ + const Word16 sf_idx /* i : subframe index */ ) { Word16 i; @@ -4230,7 +5516,7 @@ ivas_error IVAS_REND_SetHeadRotation( { IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hHrtfCrend, hIvasRend->hHrtfs.hHrtfStatistics, TRUE ) ), IVAS_ERR_OK ) ) { return error; } @@ -4238,9 +5524,10 @@ ivas_error IVAS_REND_SetHeadRotation( } /* check for Euler angle signaling */ - IF( EQ_32( headRot.w_fx, -1610612736 /* -3.0f in Q29 */ ) ) + IF( EQ_32( headRot.w_fx, L_negate( 12582912 ) ) && EQ_16( headRot.q_fact, Q22 ) ) { Euler2Quat_fx( deg2rad_fx( headRot.x_fx ), deg2rad_fx( headRot.y_fx ), deg2rad_fx( headRot.z_fx ), &rotQuat ); + modify_Quat_q_fx( &rotQuat, &rotQuat, Q29 ); } ELSE { @@ -4288,16 +5575,20 @@ ivas_error IVAS_REND_SetHeadRotation( return error; } + hIvasRend->headRotData.sr_pose_pred_axis = rot_axis; + hIvasRend->headRotData.Pos[sf_idx] = Pos; return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* * IVAS_REND_DisableHeadRotation() * * *-------------------------------------------------------------------*/ + ivas_error IVAS_REND_DisableHeadRotation( IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ ) @@ -4321,7 +5612,7 @@ ivas_error IVAS_REND_DisableHeadRotation( { IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hHrtfCrend, hIvasRend->hHrtfs.hHrtfStatistics, TRUE ) ), IVAS_ERR_OK ) ) { return error; @@ -4333,6 +5624,24 @@ ivas_error IVAS_REND_DisableHeadRotation( return IVAS_ERR_OK; } + +/*-------------------------------------------------------------------* + * IVAS_REND_SetSplitRendBFI() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetSplitRendBFI( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const Word16 bfi /* i : Bad Frame Indicator */ +) +{ + hIvasRend->splitRendBFI = bfi; + + return IVAS_ERR_OK; +} + + /*-------------------------------------------------------------------* * IVAS_REND_SetOrientationTrackingMode() * @@ -4344,6 +5653,11 @@ ivas_error IVAS_REND_SetOrientationTrackingMode( const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : Head orientation tracking type */ ) { + IF( hIvasRend->headRotData.headRotEnabled == 0 ) + { + return IVAS_ERR_OK; + } + return ivas_orient_trk_SetTrackingType_fx( hIvasRend->headRotData.hOrientationTracker, orientation_tracking ); } @@ -4414,6 +5728,7 @@ ivas_error IVAS_REND_SetReferenceVector( return ivas_orient_trk_SetReferenceVector_fx( hIvasRend->headRotData.hOrientationTracker, listenerPos, refPos ); } + /*---------------------------------------------------------------------* * IVAS_REND_SetExternalOrientation() * @@ -4459,6 +5774,7 @@ ivas_error IVAS_REND_SetExternalOrientation( return IVAS_ERR_OK; } + /*---------------------------------------------------------------------* * IVAS_REND_CombineHeadAndExternalOrientation() * @@ -4473,8 +5789,9 @@ ivas_error IVAS_REND_CombineHeadAndExternalOrientation( { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - ivas_error error_type = combine_external_and_head_orientations_rend( &hIvasRend->headRotData, hIvasRend->hExternalOrientationData, hIvasRend->hCombinedOrientationData ); - return error_type; + ivas_error error = combine_external_and_head_orientations_rend( &hIvasRend->headRotData, hIvasRend->hExternalOrientationData, hIvasRend->hCombinedOrientationData ); + + return error; } @@ -4485,19 +5802,102 @@ ivas_error IVAS_REND_CombineHeadAndExternalOrientation( *---------------------------------------------------------------------*/ +/*---------------------------------------------------------------------* + * IVAS_REND_GetReverbRoomSize() + * + * + *---------------------------------------------------------------------*/ +ivas_error IVAS_REND_GetReverbRoomSize( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_ROOM_SIZE_T *reverbRoomSize /* o : Reverb room size */ +) +{ + SWITCH( hIvasRend->selectedRoomReverbSize ) + { + case DEFAULT_REVERB_SMALL: + *reverbRoomSize = IVAS_ROOM_SIZE_SMALL; + move32(); + BREAK; + case DEFAULT_REVERB_MEDIUM: + *reverbRoomSize = IVAS_ROOM_SIZE_MEDIUM; + move32(); + BREAK; + case DEFAULT_REVERB_LARGE: + *reverbRoomSize = IVAS_ROOM_SIZE_LARGE; + move32(); + BREAK; + case DEFAULT_REVERB_UNSET: + default: + *reverbRoomSize = IVAS_ROOM_SIZE_AUTO; + move32(); + BREAK; + } + + return IVAS_ERR_OK; +} + +/*---------------------------------------------------------------------* + * IVAS_REND_SetReverbRoomSize() + * + * + *---------------------------------------------------------------------*/ +ivas_error IVAS_REND_SetReverbRoomSize( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_ROOM_SIZE_T reverbRoomSize /* i : Reverb room size */ +) +{ + ivas_error error; + + SWITCH( reverbRoomSize ) + { + case IVAS_ROOM_SIZE_SMALL: + hIvasRend->selectedRoomReverbSize = DEFAULT_REVERB_SMALL; + move32(); + BREAK; + case IVAS_ROOM_SIZE_MEDIUM: + hIvasRend->selectedRoomReverbSize = DEFAULT_REVERB_MEDIUM; + move32(); + BREAK; + case IVAS_ROOM_SIZE_LARGE: + hIvasRend->selectedRoomReverbSize = DEFAULT_REVERB_LARGE; + move32(); + BREAK; + case IVAS_ROOM_SIZE_AUTO: + default: + hIvasRend->selectedRoomReverbSize = DEFAULT_REVERB_UNSET; + move32(); + BREAK; /* will be setup in IVAS_REND_AddInput() */ + } + + IF( hIvasRend->hRendererConfig != NULL ) + { + IF( EQ_32( error = ivas_render_config_change_defaults( hIvasRend->hRendererConfig, hIvasRend->selectedRoomReverbSize ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + return IVAS_ERR_OK; +} + + /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ /* Take one channel from input buffer and copy it to each channel - in output buffer, with different gain applied per output channel. - This function takes 2 gain vectors - one for the beginning and one - for the end of the buffer. Gain values are lineraly interpolated - for all samples in between. */ + in output buffer, with different gain applied per output channel. + This function takes 2 gain vectors - one for the beginning and one + for the end of the buffer. Gain values are lineraly interpolated + for all samples in between. */ /* Take one channel from input buffer and copy it to each channel - in output buffer, with different gain applied per output channel. - This function takes 2 gain vectors - one for the beginning and one - for the end of the buffer. Gain values are lineraly interpolated - for all samples in between. */ + in output buffer, with different gain applied per output channel. + This function takes 2 gain vectors - one for the beginning and one + for the end of the buffer. Gain values are lineraly interpolated + for all samples in between. */ static void renderBufferChannelLerp_fx( const IVAS_REND_AudioBuffer inAudio, const Word32 inChannelIdx, @@ -4579,13 +5979,19 @@ static void renderBufferChannelLerp_fx( move32(); move32(); BREAK; + case NUM_SAMPLES_640: + tmp = Q31_BY_NUM_SAMPLES_640; + tmp1 = 639; /* NUM_SAMPLES_640 - 1 */ + move32(); + move32(); + BREAK; case NUM_SAMPLES_320: tmp = Q31_BY_NUM_SAMPLES_320; tmp1 = 319; /* NUM_SAMPLES_320 - 1 */ move32(); move32(); BREAK; - case NUM_SAMPLES_160: + case L_SUBFRAME_32k: tmp = Q31_BY_NUM_SAMPLES_160; tmp1 = 159; /* NUM_SAMPLES_160 - 1 */ move32(); @@ -4597,12 +6003,6 @@ static void renderBufferChannelLerp_fx( move32(); move32(); BREAK; - case L_SUBFRAME_32k: - tmp = Q31_BY_SUB_FRAME_180; - tmp1 = 179; /* L_SUBFRAME_32k - 1 */ - move32(); - move32(); - BREAK; case L_SUBFRAME_16k: tmp = Q31_BY_SUB_FRAME_80; tmp1 = 79; /* L_SUBFRAME_16k - 1 */ @@ -4645,8 +6045,10 @@ static void renderBufferChannelLerp_fx( return; } + + /* Take one channel from input buffer and copy it to each channel - in output buffer, with different gain applied per output channel */ + in output buffer, with different gain applied per output channel */ static void renderBufferChannel_fx( const IVAS_REND_AudioBuffer inAudio, const Word32 inChannelIdx, @@ -4695,6 +6097,7 @@ static ivas_error rotateFrameMc_fx( rotation_gains_Word32 gains; Word32 tmp_gains[MAX_INPUT_CHANNELS]; /* Q30 */ ivas_error error; + push_wmops( "rotateFrameMc_fx" ); IF( NE_32( ( error = chooseCrossfade_fx( headRotData, &crossfade ) ), IVAS_ERR_OK ) ) { @@ -4783,9 +6186,8 @@ static ivas_error rotateFrameMc_fx( move16(); } - /* gains for current subframe rotation */ - rotateAziEle_fixed( (Word16) L_shr( ls_azimuth[ch_in_woLFE], 22 ), (Word16) L_shr( ls_elevation[ch_in_woLFE], 22 ), &azimuth_fx, &elevation_fx, Rmat_fx, is_planar_setup ); + rotateAziEle_fx32( (Word16) L_shr( ls_azimuth[ch_in_woLFE], 22 ), (Word16) L_shr( ls_elevation[ch_in_woLFE], 22 ), &azimuth_fx, &elevation_fx, Rmat_fx, is_planar_setup ); test(); test(); @@ -4982,6 +6384,7 @@ static ivas_error rotateFrameSba_fx( return IVAS_ERR_OK; } + static ivas_error renderIsmToBinaural( input_ism *ismInput, IVAS_REND_AudioBuffer outAudio ) @@ -4992,9 +6395,10 @@ static ivas_error renderIsmToBinaural( Word16 i; Word16 exp = *outAudio.pq_fact; move16(); + push_wmops( "renderIsmToBinaural" ); /* Metadata Delay to sync with audio delay converted from ms to 5ms (1000/50/4) subframe index */ - ism_md_subframe_update_ext = extract_l( Mpy_32_32( ismInput->ism_metadata_delay_ms_fx, 429496730 /* 1000 / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES in Q31 */ ) ); + ism_md_subframe_update_ext = extract_l( Mpy_32_32( ismInput->ism_metadata_delay_ms_fx, ONE_BY_SUBFRAME_LEN_MS_Q31 ) ); copyBufferTo2dArray_fx( ismInput->base.inputBuffer, tmpTDRendBuffer ); FOR( i = 0; i < MAX_OUTPUT_CHANNELS; ++i ) @@ -5032,13 +6436,20 @@ static ivas_error renderIsmToBinaural( return IVAS_ERR_OK; } + static Word16 getNumSubframesInBuffer( const IVAS_REND_AudioBuffer *buffer, const Word32 sampleRate ) { + Word16 cldfb2tdShift; + + cldfb2tdShift = buffer->config.is_cldfb ? 1 : 0; + Word16 scale, temp = extract_l( Mpy_32_32( sampleRate, 10737418 /* 1 / FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES in Q31 */ ) ); temp = BASOP_Util_Divide1616_Scale( buffer->config.numSamplesPerChannel, temp, &scale ); temp = shr( temp, sub( 15, scale ) ); /* Q0 */ + temp = shr( temp, cldfb2tdShift ); + return temp; } @@ -5077,7 +6488,7 @@ static ivas_error renderIsmToBinauralRoom( hCombinedOrientationData = ismInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; move16(); - IF( hCombinedOrientationData != NULL ) + IF( *hCombinedOrientationData != NULL ) { FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) { @@ -5163,10 +6574,7 @@ static ivas_error renderIsmToBinauralRoom( /* compute gains only if position changed */ IF( position_changed ) { - IF( NE_32( ( error = getEfapGains_fx( *ismInput->base.ctx.pEfapOutWrapper, - rotatedPos.azimuth_fx, - rotatedPos.elevation_fx, - currentPanGains ) ), + IF( NE_32( ( error = getEfapGains_fx( *ismInput->base.ctx.pEfapOutWrapper, rotatedPos.azimuth_fx, rotatedPos.elevation_fx, currentPanGains ) ), IVAS_ERR_OK ) ) { return error; @@ -5188,17 +6596,11 @@ static ivas_error renderIsmToBinauralRoom( IF( position_changed ) { - renderBufferChannelLerp_fx( ismInput->base.inputBuffer, 0, - currentPanGains, - ismInput->prev_pan_gains_fx, - tmpMcBuffer ); + renderBufferChannelLerp_fx( ismInput->base.inputBuffer, 0, currentPanGains, ismInput->prev_pan_gains_fx, tmpMcBuffer ); } ELSE { - renderBufferChannelLerp_fx( ismInput->base.inputBuffer, 0, - ismInput->prev_pan_gains_fx, - NULL, - tmpMcBuffer ); + renderBufferChannelLerp_fx( ismInput->base.inputBuffer, 0, ismInput->prev_pan_gains_fx, NULL, tmpMcBuffer ); } copyBufferTo2dArray_fx( tmpMcBuffer, tmpRendBuffer ); @@ -5213,9 +6615,9 @@ static ivas_error renderIsmToBinauralRoom( { Copy32( currentPanGains, ismInput->prev_pan_gains_fx, MAX_OUTPUT_CHANNELS ); } - // Crend_process porting + CREND_HANDLE hCrend; - hCrend = ismInput->crendWrapper->hCrend; + hCrend = ismInput->crendWrapper->hCrend[0]; IF( hCrend->reflections != NULL ) { test(); @@ -5229,17 +6631,15 @@ static ivas_error renderIsmToBinauralRoom( } } + *ismInput->crendWrapper->p_io_qfactor = *exp; move16(); /* render 7_1_4 with BRIRs */ - IF( NE_32( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, - NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *ismInput->base.ctx.pOutSampleRate ) ) ), - IVAS_ERR_OK ) ) - + IF( NE_32( ( error = ivas_rend_crendProcessSubframe_fx( ismInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer, p_tmpRendBuffer, ismInput->base.inputBuffer.config.numSamplesPerChannel, *ismInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) { return error; } + IF( hCrend->hReverb != NULL ) { *exp = sub( *exp, 2 ); @@ -5253,6 +6653,8 @@ static ivas_error renderIsmToBinauralRoom( return IVAS_ERR_OK; } + + static ivas_error renderIsmToBinauralReverb( input_ism *ismInput, IVAS_REND_AudioBuffer outAudio ) @@ -5266,7 +6668,7 @@ static ivas_error renderIsmToBinauralReverb( push_wmops( "renderIsmToBinauralRoom" ); /* Metadata Delay to sync with audio delay converted from ms to 5ms (1000/50/4) subframe index */ - ism_md_subframe_update_ext = extract_l( Mpy_32_32( ismInput->ism_metadata_delay_ms_fx, 429496730 /* 1000 / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES in Q31 */ ) ); + ism_md_subframe_update_ext = extract_l( Mpy_32_32( ismInput->ism_metadata_delay_ms_fx, ONE_BY_SUBFRAME_LEN_MS_Q31 ) ); copyBufferTo2dArray_fx( ismInput->base.inputBuffer, tmpRendBuffer_fx ); FOR( i = 0; i < MAX_OUTPUT_CHANNELS; ++i ) @@ -5301,6 +6703,7 @@ static ivas_error renderIsmToBinauralReverb( return IVAS_ERR_OK; } + static ivas_error renderIsmToMc( input_ism *ismInput, const IVAS_REND_AudioBuffer outAudio ) @@ -5399,17 +6802,11 @@ static ivas_error renderIsmToMc( * This should have been validated in IVAS_REND_FeedInputAudio() */ IF( position_changed ) { - renderBufferChannelLerp_fx( ismInput->base.inputBuffer, 0, - currentPanGains_fx, - ismInput->prev_pan_gains_fx, - outAudio ); + renderBufferChannelLerp_fx( ismInput->base.inputBuffer, 0, currentPanGains_fx, ismInput->prev_pan_gains_fx, outAudio ); } ELSE { - renderBufferChannelLerp_fx( ismInput->base.inputBuffer, 0, - ismInput->prev_pan_gains_fx, - NULL, - outAudio ); + renderBufferChannelLerp_fx( ismInput->base.inputBuffer, 0, ismInput->prev_pan_gains_fx, NULL, outAudio ); } IF( position_changed ) @@ -5422,6 +6819,8 @@ static ivas_error renderIsmToMc( return IVAS_ERR_OK; } + + static ivas_error renderIsmToSba( input_ism *ismInput, const AUDIO_CONFIG outConfig, @@ -5468,11 +6867,7 @@ static ivas_error renderIsmToSba( // TODO tmu review when #215 is resolved azimuth_tmp = extract_l( L_shr( ismInput->previousPos.azimuth_fx, Q22 ) ); elevation_tmp = extract_l( L_shr( ismInput->previousPos.elevation_fx, Q22 ) ); - ivas_dirac_dec_get_response_fx( azimuth_tmp, - elevation_tmp, - ismInput->prev_pan_gains_fx, - ambiOrderOut, - Q29 ); + ivas_dirac_dec_get_response_fx( azimuth_tmp, elevation_tmp, ismInput->prev_pan_gains_fx, ambiOrderOut, Q29 ); FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { ismInput->prev_pan_gains_fx[i] = L_shl_sat( ismInput->prev_pan_gains_fx[i], Q2 ); /* Q29 + Q2 = Q31 */ @@ -5486,11 +6881,7 @@ static ivas_error renderIsmToSba( // TODO tmu review when #215 is resolved azimuth_tmp = extract_l( L_shr( ismInput->currentPos.azimuth_fx, Q22 ) ); elevation_tmp = extract_l( L_shr( ismInput->currentPos.elevation_fx, Q22 ) ); - ivas_dirac_dec_get_response_fx( azimuth_tmp, - elevation_tmp, - currentPanGains_fx, - ambiOrderOut, - Q29 ); + ivas_dirac_dec_get_response_fx( azimuth_tmp, elevation_tmp, currentPanGains_fx, ambiOrderOut, Q29 ); FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { currentPanGains_fx[i] = L_shl_sat( currentPanGains_fx[i], Q2 ); /* Q29 + Q2 = Q31 */ @@ -5502,17 +6893,11 @@ static ivas_error renderIsmToSba( * This should have been validated in IVAS_REND_FeedInputAudio() */ IF( position_changed ) { - renderBufferChannelLerp_fx( ismInput->base.inputBuffer, 0, - currentPanGains_fx, - ismInput->prev_pan_gains_fx, - outAudio ); + renderBufferChannelLerp_fx( ismInput->base.inputBuffer, 0, currentPanGains_fx, ismInput->prev_pan_gains_fx, outAudio ); } ELSE { - renderBufferChannelLerp_fx( ismInput->base.inputBuffer, 0, - ismInput->prev_pan_gains_fx, - NULL, - outAudio ); + renderBufferChannelLerp_fx( ismInput->base.inputBuffer, 0, ismInput->prev_pan_gains_fx, NULL, outAudio ); } IF( position_changed ) @@ -5524,59 +6909,195 @@ static ivas_error renderIsmToSba( return error; } -static void renderIsmToMasa( + +static ivas_error renderIsmToSplitBinaural( input_ism *ismInput, - IVAS_REND_AudioBuffer outAudio, - Word16 *exp ) + const IVAS_REND_AudioBuffer outAudio ) { - Word32 tmpRendBuffer_fx[MAX_NUM_OBJECTS][L_FRAME48k]; - Word16 i, j; - Word16 q_fact; + ivas_error error; + Word32 tmpProcessing[MAX_NUM_OBJECTS][L_FRAME48k]; + Word16 pos_idx; + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData; + const SPLIT_REND_WRAPPER *pSplitRendWrapper; + IVAS_QUATERNION originalHeadRot[MAX_PARAM_SPATIAL_SUBFRAMES]; + IVAS_QUATERNION localHeadRot[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word16 i, ch, slot_idx, num_bands; + Word32 tmpBinaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][L_FRAME48k]; + Word32 tmpBinaural_CldfbRe[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 tmpBinaural_CldfbIm[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 output_frame = ismInput->base.inputBuffer.config.numSamplesPerChannel; + COMBINED_ORIENTATION_HANDLE pCombinedOrientationData; + Word16 ism_md_subframe_update_ext, exp; + + push_wmops( "renderIsmToSplitBinaural" ); + + pSplitRendWrapper = ismInput->base.ctx.pSplitRendWrapper; + pMultiBinPoseData = &pSplitRendWrapper->multiBinPoseData; - push_wmops( "renderIsmToMasa" ); + exp = *outAudio.pq_fact; + /* Metadata Delay to sync with audio delay converted from ms to 5ms (1000/50/4) subframe index */ + ism_md_subframe_update_ext = (Word16) Mpy_32_32( ismInput->ism_metadata_delay_ms_fx, ONE_BY_SUBFRAME_LEN_MS_Q31 ); - FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) + pCombinedOrientationData = *ismInput->base.ctx.pCombinedOrientationData; + + IF( EQ_32( pMultiBinPoseData->poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) ) { - set32_fx( tmpRendBuffer_fx[i], 0, L_FRAME48k ); + FOR( i = 1; i < pCombinedOrientationData->num_subframes; ++i ) + { + Copy_Quat_fx( &pCombinedOrientationData->Quaternions[0], &pCombinedOrientationData->Quaternions[i] ); + } } - copyBufferTo2dArray_fx( ismInput->base.inputBuffer, tmpRendBuffer_fx ); - Word16 input_e[MAX_NUM_OBJECTS], max_e; - - FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) + /* Save current head positions */ + FOR( i = 0; i < pCombinedOrientationData->num_subframes; ++i ) { - input_e[i] = sub( 31, add( getScaleFactor32( tmpRendBuffer_fx[i], L_FRAME48k ), *outAudio.pq_fact ) ); - move16(); + Copy_Quat_fx( &pCombinedOrientationData->Quaternions[i], &originalHeadRot[i] ); } - Word16 guard_bits = find_guarded_bits_fx( L_FRAME48k ); - max_e = input_e[0]; - move16(); + /* Copy input audio to a processing buffer. */ + copyBufferTo2dArray_fx( ismInput->base.inputBuffer, tmpProcessing ); + - FOR( i = 1; i < MAX_NUM_OBJECTS; i++ ) + FOR( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses; pos_idx++ ) { - if ( LT_16( max_e, input_e[0] ) ) + /* Update head positions */ + IF( NE_16( pos_idx, 0 ) ) { - max_e = input_e[i]; - move16(); + Word16 q_fact_orig; + FOR( i = 0; i < pCombinedOrientationData->num_subframes; ++i ) + { + pCombinedOrientationData->Quaternions[i].w_fx = L_negate( 12582912 ); // Q22 + q_fact_orig = originalHeadRot[i].q_fact; + modify_Quat_q_fx( &originalHeadRot[i], &localHeadRot[i], Q22 ); + /*euler*/ + Quat2EulerDegree_fx( localHeadRot[i], &pCombinedOrientationData->Quaternions[i].z_fx, &pCombinedOrientationData->Quaternions[i].y_fx, &pCombinedOrientationData->Quaternions[i].x_fx ); + pCombinedOrientationData->Quaternions[i].x_fx = L_add( pCombinedOrientationData->Quaternions[i].x_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][0] ); + pCombinedOrientationData->Quaternions[i].y_fx = L_add( pCombinedOrientationData->Quaternions[i].y_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][1] ); + pCombinedOrientationData->Quaternions[i].z_fx = L_add( pCombinedOrientationData->Quaternions[i].z_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][2] ); + + Euler2Quat_fx( deg2rad_fx( pCombinedOrientationData->Quaternions[i].x_fx ), deg2rad_fx( pCombinedOrientationData->Quaternions[i].y_fx ), deg2rad_fx( pCombinedOrientationData->Quaternions[i].z_fx ), &pCombinedOrientationData->Quaternions[i] ); + + modify_Quat_q_fx( &pCombinedOrientationData->Quaternions[i], &pCombinedOrientationData->Quaternions[i], q_fact_orig ); + } } - } - FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) - { - FOR( j = 0; j < L_FRAME48k; j++ ) + + FOR( i = 0; i < MAX_NUM_OBJECTS; ++i ) { - tmpRendBuffer_fx[i][j] = L_shr( tmpRendBuffer_fx[i][j], add( sub( max_e, sub( 31, *outAudio.pq_fact ) ), guard_bits ) ); /* Q(31 - (max_e + guard_bits)) */ - move32(); + Scale_sig32( tmpProcessing[i], L_FRAME48k, sub( Q11, exp ) ); /* Q11 */ + } + + /* Render */ + IF( ( error = ivas_td_binaural_renderer_ext_fx( ( pos_idx == 0 ) ? &ismInput->tdRendWrapper : &ismInput->splitTdRendWrappers[sub( pos_idx, 1 )], ismInput->base.inConfig, NULL, ismInput->base.ctx.pCombinedOrientationData, &ismInput->currentPos, + NULL, ism_md_subframe_update_ext, *ismInput->base.ctx.pOutSampleRate, output_frame, tmpProcessing, &exp ) ) != IVAS_ERR_OK ) + { + return error; + } + + FOR( i = 0; i < BINAURAL_CHANNELS; ++i ) + { + Scale_sig32( tmpProcessing[i], L_FRAME48k, negate( sub( Q11, exp ) ) ); /* Q(exp) */ + } + + IF( ismInput->hReverb != NULL ) + { + exp = add( exp, 2 ); + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < outAudio.config.numSamplesPerChannel; j++ ) + { + tmpProcessing[i][j] = L_shl( tmpProcessing[i][j], Q2 ); /* Q(exp + 2) */ + move32(); + } + } + } + + IF( NE_16( outAudio.config.is_cldfb, 0 ) ) + { + /* Perform CLDFB analysis on rendered audio, since the output buffer is CLDFB domain */ + Word16 q_cldfb; + + q_cldfb = exp; + num_bands = extract_l( Mpy_32_32( imult3216( *ismInput->base.ctx.pOutSampleRate, BINAURAL_MAXBANDS ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( slot_idx = 0; slot_idx < IVAS_CLDFB_NO_COL_MAX; slot_idx++ ) + { + cldfbAnalysis_ts_fx( &tmpProcessing[ch][num_bands * slot_idx], + &tmpBinaural_CldfbRe[BINAURAL_CHANNELS * pos_idx + ch][slot_idx][0], + &tmpBinaural_CldfbIm[BINAURAL_CHANNELS * pos_idx + ch][slot_idx][0], + num_bands, + ismInput->base.ctx.pSplitRendWrapper->hCldfbHandles->cldfbAna[pos_idx + ch], + &q_cldfb ); + } + } + } + ELSE + { + + /* Copy rendered audio to tmp storage buffer. Copying directly to output would + * overwrite original audio, which is still needed for rendering next head pose. */ + Copy32( tmpProcessing[0], tmpBinaural[i_mult( 2, pos_idx )], output_frame ); + Copy32( tmpProcessing[1], tmpBinaural[add( i_mult( 2, pos_idx ), 1 )], output_frame ); } + + /* Overwrite processing buffer with original input audio again */ + copyBufferTo2dArray_fx( ismInput->base.inputBuffer, tmpProcessing ); + } + + /* Restore original head rotation */ + FOR( i = 0; i < pCombinedOrientationData->num_subframes; ++i ) + { + Copy_Quat_fx( &originalHeadRot[i], &pCombinedOrientationData->Quaternions[i] ); + } + + if ( outAudio.config.is_cldfb ) + { + accumulateCLDFBArrayToBuffer_fx( tmpBinaural_CldfbRe, tmpBinaural_CldfbIm, &outAudio ); + } + else + { + accumulate2dArrayToBuffer_fx( tmpBinaural, &outAudio ); + } + pop_wmops(); + + /* Encoding to split rendering bitstream done at a higher level */ + return IVAS_ERR_OK; +} + + +static void renderIsmToMasa( + input_ism *ismInput, + IVAS_REND_AudioBuffer outAudio, + Word16 *exp ) +{ + Word32 tmpRendBuffer_fx[MAX_NUM_OBJECTS][L_FRAME48k]; + Word16 i, guard_bits, q_min, q_diff; + + push_wmops( "renderIsmToMasa" ); + + copyBufferTo2dArray_fx( ismInput->base.inputBuffer, tmpRendBuffer_fx ); + + q_min = MAX_16; + move16(); + + FOR( i = 0; i < ismInput->base.inputBuffer.config.numChannels; i++ ) + { + q_min = s_min( q_min, L_norm_arr( tmpRendBuffer_fx[i], ismInput->base.inputBuffer.config.numSamplesPerChannel ) ); } - max_e = add( max_e, guard_bits ); - q_fact = sub( Q31, max_e ); + guard_bits = find_guarded_bits_fx( ismInput->base.inputBuffer.config.numSamplesPerChannel ); + q_min = sub( add( q_min, *outAudio.pq_fact ), guard_bits ); + q_diff = sub( q_min, *outAudio.pq_fact ); - ivas_omasa_ana_fx( ismInput->hOMasa, tmpRendBuffer_fx, &q_fact, ismInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels, ismInput->base.inputBuffer.config.numChannels ); + FOR( i = 0; i < ismInput->base.inputBuffer.config.numChannels; i++ ) + { + scale_sig32( tmpRendBuffer_fx[i], ismInput->base.inputBuffer.config.numSamplesPerChannel, q_diff ); // *outAudio.pq_fact -> q_min + } - *exp = q_fact; + ivas_omasa_ana_fx( ismInput->hOMasa, tmpRendBuffer_fx, &q_min, ismInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels, ismInput->base.inputBuffer.config.numChannels ); + + *exp = q_min; move16(); accumulate2dArrayToBuffer_fx( tmpRendBuffer_fx, &outAudio ); @@ -5593,6 +7114,8 @@ static ivas_error renderInputIsm( { ivas_error error; IVAS_REND_AudioBuffer inAudio; + /* Note: in float this is called cldfb2tdSampleFact - it is either 2 or 1, so we handle it as a shift here */ + Word16 cldfb2tdSampleShift; Word16 exp = *outAudio.pq_fact; move16(); @@ -5600,7 +7123,16 @@ static ivas_error renderInputIsm( move32(); inAudio = ismInput->base.inputBuffer; - IF( NE_32( ismInput->base.numNewSamplesPerChannel, outAudio.config.numSamplesPerChannel ) ) + /* Note: in float this is a factor, so it is 1 or 2 there instead of 0 or 1 here */ + cldfb2tdSampleShift = 0; + move16(); + IF( outAudio.config.is_cldfb ) + { + cldfb2tdSampleShift = 1; + move16(); + } + + IF( NE_32( L_shl( ismInput->base.numNewSamplesPerChannel, cldfb2tdSampleShift ), outAudio.config.numSamplesPerChannel ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); } @@ -5608,7 +7140,7 @@ static ivas_error renderInputIsm( move32(); /* Apply input gain to new audio */ - v_multc_fixed( inAudio.data_fx, ismInput->base.gain_fx, inAudio.data_fx, imult1616( inAudio.config.numSamplesPerChannel, inAudio.config.numChannels ) ); + v_multc_fx( inAudio.data_fx, ismInput->base.gain_fx, inAudio.data_fx, imult1616( inAudio.config.numSamplesPerChannel, inAudio.config.numChannels ) ); *outAudio.pq_fact = sub( *outAudio.pq_fact, Q1 ); move16(); exp = *outAudio.pq_fact; @@ -5635,6 +7167,10 @@ static ivas_error renderInputIsm( case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: error = renderIsmToBinauralRoom( ismInput, outAudio, &exp ); BREAK; + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: + error = renderIsmToSplitBinaural( ismInput, outAudio ); + break; case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: error = renderIsmToBinauralReverb( ismInput, outAudio ); BREAK; @@ -5644,11 +7180,6 @@ static ivas_error renderInputIsm( BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: renderIsmToMasa( ismInput, outAudio, &exp ); - FOR( Word16 block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) - { - ismInput->hOMasa->energy_e[block_m_idx] = sub( 31, ismInput->hOMasa->energy_q ); - move16(); - } BREAK; default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; @@ -5676,7 +7207,7 @@ static ivas_error renderActiveInputsIsm( Word16 i; input_ism *pCurrentInput; ivas_error error; - Word16 input_q = Q8; + Word16 input_q = outAudio.q_factor; move16(); FOR( ( i = 0, pCurrentInput = hIvasRend->inputsIsm ); i < RENDERER_MAX_ISM_INPUTS; ( ++i, ++pCurrentInput ) ) { @@ -5686,7 +7217,7 @@ static ivas_error renderActiveInputsIsm( CONTINUE; } - *outAudio.pq_fact = Q8; + *outAudio.pq_fact = input_q; move16(); IF( NE_32( ( error = renderInputIsm( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) { @@ -5702,21 +7233,24 @@ static ivas_error renderActiveInputsIsm( } return IVAS_ERR_OK; } + static ivas_error renderLfeToBinaural_fx( const input_mc *mcInput, + const AUDIO_CONFIG outConfig, IVAS_REND_AudioBuffer outAudio, Word16 in_q, Word16 out_q ) { Word16 lfe_idx; + Word16 pose_idx, num_poses; Word32 gain_fx; Word16 ear_idx, i, r_shift; - Word32 tmpLfeBuffer[MAX_BUFFER_LENGTH_PER_CHANNEL]; + Word32 tmpLfeBuffer[L_FRAME_MAX]; Word16 frame_size, num_cpy_smpl_cur_frame, num_cpy_smpl_prev_frame; const Word32 *lfeInput; Word32 *writePtr; - assert( ( outAudio.config.numChannels == 2 ) && "Must be binaural output" ); + assert( ( getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) && "Must be binaural output" ); push_wmops( "renderLfeToBinaural" ); gain_fx = GAIN_LFE_WORD32; /* 1.88364911f in Q30 */ @@ -5735,6 +7269,7 @@ static ivas_error renderLfeToBinaural_fx( ELSE { /* no LFE to render */ + pop_wmops(); return IVAS_ERR_OK; } @@ -5747,13 +7282,13 @@ static ivas_error renderLfeToBinaural_fx( num_cpy_smpl_cur_frame = sub( frame_size, num_cpy_smpl_prev_frame ); /* Assuming LFE should be delayed by less that the duration of one frame */ - assert( mcInput->binauralDelaySmp < frame_size ); + assert( mcInput->binauralDelaySmp <= MAX_BIN_DELAY_SAMPLES ); /* Get delayed LFE signal from previous frame, apply gain and save in tmp buffer */ - v_multc_fixed( mcInput->lfeDelayBuffer_fx, gain_fx, tmpLfeBuffer, num_cpy_smpl_prev_frame ); /* Qx - 1 */ + v_multc_fx( mcInput->lfeDelayBuffer_fx, gain_fx, tmpLfeBuffer, num_cpy_smpl_prev_frame ); /* Qx - 1 */ /* Continue filling tmp buffer, now with LFE signal from current frame */ - v_multc_fixed( lfeInput, gain_fx, tmpLfeBuffer + num_cpy_smpl_prev_frame, num_cpy_smpl_cur_frame ); /* Qx - 1 */ + v_multc_fx( lfeInput, gain_fx, tmpLfeBuffer + num_cpy_smpl_prev_frame, num_cpy_smpl_cur_frame ); /* Qx - 1 */ /* Save remaining LFE samples of current frame for next frame */ MVR2R_WORD32( lfeInput + num_cpy_smpl_cur_frame, mcInput->lfeDelayBuffer_fx, num_cpy_smpl_prev_frame ); @@ -5767,18 +7302,34 @@ static ivas_error renderLfeToBinaural_fx( move32(); } } - /* Copy LFE to left and right ears */ - FOR( ear_idx = 0; ear_idx < BINAURAL_CHANNELS; ++ear_idx ) + + /* Copy LFE to left and right binaural channels for all poses */ + IF( mcInput->base.ctx.pSplitRendWrapper != NULL ) { - writePtr = getSmplPtr_fx( outAudio, ear_idx, 0 ); - move32(); - v_add_fixed( writePtr, tmpLfeBuffer, writePtr, frame_size, 0 ); /* Q(out_q) */ + num_poses = mcInput->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses; + move16(); + } + ELSE + { + num_poses = 1; + move16(); + } + + FOR( pose_idx = 0; pose_idx < num_poses; ++pose_idx ) + { + FOR( ear_idx = 0; ear_idx < BINAURAL_CHANNELS; ++ear_idx ) + { + writePtr = getSmplPtr_fx( outAudio, add( i_mult( pose_idx, BINAURAL_CHANNELS ), ear_idx ), 0 ); + move32(); + v_add_fx_no_hdrm( writePtr, tmpLfeBuffer, writePtr, frame_size ); /* Q(out_q) */ + } } pop_wmops(); return IVAS_ERR_OK; } + static ivas_error renderMcToBinaural( input_mc *mcInput, const AUDIO_CONFIG outConfig, @@ -5795,17 +7346,19 @@ static ivas_error renderMcToBinaural( Word16 i; Word16 exp = *outAudio.pq_fact; move16(); + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_tmpRendBuffer_fx[i] = tmpRendBuffer_fx[i]; } push_wmops( "renderMcToBinaural" ); + inConfig = mcInput->base.inConfig; move32(); hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; move16(); - IF( hCombinedOrientationData != NULL ) + IF( *hCombinedOrientationData != NULL ) { FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) { @@ -5850,7 +7403,7 @@ static ivas_error renderMcToBinaural( tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); set32_fx( tmpRotBuffer.data_fx, 0, imult1616( tmpRotBuffer.config.numSamplesPerChannel, tmpRotBuffer.config.numChannels ) ); - IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, mcInput->rot_gains_prev_fx, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, mcInput->rot_gains_prev_fx[0], mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), IVAS_ERR_OK ) ) { return error; } @@ -5865,17 +7418,19 @@ static ivas_error renderMcToBinaural( { copyBufferTo2dArray_fx( mcInput->base.inputBuffer, tmpRendBuffer_fx ); } - // Porting Crend_process function + CREND_HANDLE hCrend; - hCrend = mcInput->crendWrapper->hCrend; + hCrend = mcInput->crendWrapper->hCrend[0]; + + *mcInput->crendWrapper->p_io_qfactor = exp; + move16(); /* call CREND */ - IF( NE_32( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, p_tmpRendBuffer_fx, *mcInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_crendProcessSubframe_fx( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer_fx, p_tmpRendBuffer_fx, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) { return error; } + IF( hCrend->hReverb != NULL ) { exp = sub( exp, 2 ); @@ -5884,16 +7439,18 @@ static ivas_error renderMcToBinaural( accumulate2dArrayToBuffer_fx( tmpRendBuffer_fx, &outAudio ); - IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outConfig, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) { return error; } *outAudio.pq_fact = exp; move16(); + pop_wmops(); return IVAS_ERR_OK; } + static ivas_error renderMcToBinauralRoom( input_mc *mcInput, const AUDIO_CONFIG outConfig, @@ -5910,6 +7467,7 @@ static ivas_error renderMcToBinauralRoom( Word16 subframe_idx; Word16 exp = *outAudio.pq_fact; move16(); + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_tmpRendBuffer[i] = tmpRendBuffer[i]; @@ -5921,7 +7479,7 @@ static ivas_error renderMcToBinauralRoom( hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; move16(); - IF( hCombinedOrientationData != NULL ) + IF( *hCombinedOrientationData != NULL ) { FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) { @@ -5969,9 +7527,7 @@ static ivas_error renderMcToBinauralRoom( tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); set32_fx( tmpRotBuffer.data_fx, 0, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); - IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, - mcInput->rot_gains_prev_fx, - mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), + IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, mcInput->rot_gains_prev_fx[0], mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), IVAS_ERR_OK ) ) { return error; @@ -5986,17 +7542,19 @@ static ivas_error renderMcToBinauralRoom( { copyBufferTo2dArray_fx( mcInput->base.inputBuffer, tmpRendBuffer ); } - // Porting Crend_process function + CREND_HANDLE hCrend; - hCrend = mcInput->crendWrapper->hCrend; + hCrend = mcInput->crendWrapper->hCrend[0]; + + *mcInput->crendWrapper->p_io_qfactor = exp; + move16(); /* call CREND */ - IF( NE_32( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_crendProcessSubframe_fx( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer, p_tmpRendBuffer, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) { return error; } + IF( hCrend->hReverb != NULL ) { exp = sub( exp, Q2 ); @@ -6005,15 +7563,17 @@ static ivas_error renderMcToBinauralRoom( accumulate2dArrayToBuffer_fx( tmpRendBuffer, &outAudio ); - IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outConfig, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) { return error; } *outAudio.pq_fact = exp; move16(); + pop_wmops(); return IVAS_ERR_OK; } + static ivas_error renderMcCustomLsToBinauralRoom( input_mc *mcInput, const AUDIO_CONFIG outConfig, @@ -6043,7 +7603,7 @@ static ivas_error renderMcCustomLsToBinauralRoom( hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; move16(); - IF( hCombinedOrientationData != NULL ) + IF( *hCombinedOrientationData != NULL ) { FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) { @@ -6063,9 +7623,7 @@ static ivas_error renderMcCustomLsToBinauralRoom( tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); set32_fx( tmpRotBuffer.data_fx, 0, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); - IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, - mcInput->rot_gains_prev_fx, - mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), + IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, mcInput->rot_gains_prev_fx[0], mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), IVAS_ERR_OK ) ) { return error; @@ -6098,17 +7656,21 @@ static ivas_error renderMcCustomLsToBinauralRoom( { renderBufferChannel_fx( *tmpBufPtr, i, mcInput->panGains_fx[i], tmpMcBuffer ); } + copyBufferTo2dArray_fx( tmpMcBuffer, tmpCrendBuffer ); CREND_HANDLE hCrend; - hCrend = mcInput->crendWrapper->hCrend; + hCrend = mcInput->crendWrapper->hCrend[0]; + + *mcInput->crendWrapper->p_io_qfactor = exp; + move16(); + /* call CREND */ - IF( NE_32( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, - p_tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate, getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_crendProcessSubframe_fx( mcInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpCrendBuffer, p_tmpCrendBuffer, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) { return error; } + IF( hCrend->hReverb != NULL ) { exp = sub( exp, 2 ); @@ -6116,7 +7678,7 @@ static ivas_error renderMcCustomLsToBinauralRoom( accumulate2dArrayToBuffer_fx( tmpCrendBuffer, &outAudio ); - IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outConfig, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) { return error; } @@ -6131,6 +7693,7 @@ static ivas_error renderMcCustomLsToBinauralRoom( pop_wmops(); return IVAS_ERR_OK; } + static void renderMcToMc( const input_mc *mcInput, IVAS_REND_AudioBuffer outAudio ) @@ -6149,6 +7712,7 @@ static void renderMcToMc( pop_wmops(); return; } + static void renderMcToSba( const input_mc *mcInput, IVAS_REND_AudioBuffer outAudio ) @@ -6181,351 +7745,216 @@ static void renderMcToMasa( return; } -static ivas_error renderInputMc( +static ivas_error renderMcToSplitBinaural( input_mc *mcInput, const AUDIO_CONFIG outConfig, IVAS_REND_AudioBuffer outAudio ) { + Word16 i, j, pos_idx; + Word16 sf; + Word16 output_frame; ivas_error error; - IVAS_REND_AudioBuffer inAudio; - error = IVAS_ERR_OK; + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData; + const SPLIT_REND_WRAPPER *pSplitRendWrapper; + Word32 tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + Word32 *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; + Word32 tmpSplitBinauralBuffer[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][L_FRAME48k]; + AUDIO_CONFIG inConfig; + IVAS_REND_AudioBuffer tmpRotBuffer; + COMBINED_ORIENTATION_DATA combinedOrientationDataLocal; + COMBINED_ORIENTATION_HANDLE pCombinedOrientationDataLocal; + Word16 exp = *outAudio.pq_fact; + move16(); + CREND_HANDLE hCrend; + IVAS_QUATERNION Quaternions_orig[MAX_PARAM_SPATIAL_SUBFRAMES], Quaternions_abs; + Word16 q_fact_orig; + + push_wmops( "renderMcToSplitBinaural" ); + inConfig = mcInput->base.inConfig; move32(); + output_frame = mcInput->base.inputBuffer.config.numSamplesPerChannel; + move16(); - inAudio = mcInput->base.inputBuffer; + pSplitRendWrapper = mcInput->base.ctx.pSplitRendWrapper; + pMultiBinPoseData = &pSplitRendWrapper->multiBinPoseData; + move32(); + move32(); - IF( NE_32( mcInput->base.numNewSamplesPerChannel, outAudio.config.numSamplesPerChannel ) ) + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; ++i ) { - return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); + p_tmpRendBuffer[i] = tmpRendBuffer[i]; + move32(); } - mcInput->base.numNewSamplesPerChannel = 0; - move32(); - v_multc_fixed( inAudio.data_fx, mcInput->base.gain_fx, inAudio.data_fx, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); - *outAudio.pq_fact = sub( *outAudio.pq_fact, Q1 ); // reducing the Q by 1 compensating for the v_mult_fixed done - move16(); - /* set combined orientation subframe info to start info */ - ivas_combined_orientation_set_to_start_index( *( mcInput->base.ctx.pCombinedOrientationData ) ); - SWITCH( getAudioConfigType( outConfig ) ) + /* save current head positions */ + pCombinedOrientationDataLocal = *mcInput->base.ctx.pCombinedOrientationData; + move32(); + combinedOrientationDataLocal = *pCombinedOrientationDataLocal; + move32(); + IF( EQ_32( pMultiBinPoseData->poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) ) { - case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: - renderMcToMc( mcInput, outAudio ); - BREAK; - case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: - renderMcToSba( mcInput, outAudio ); - BREAK; - case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: - SWITCH( outConfig ) + FOR( sf = 1; sf < combinedOrientationDataLocal.num_subframes; ++sf ) + { + Copy_Quat_fx( &combinedOrientationDataLocal.Quaternions[0], &combinedOrientationDataLocal.Quaternions[sf] ); + FOR( i = 0; i < 3; i++ ) { - case IVAS_AUDIO_CONFIG_BINAURAL: - error = renderMcToBinaural( mcInput, outConfig, outAudio ); - BREAK; - case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: - case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: - IF( mcInput->base.inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) - { - error = renderMcCustomLsToBinauralRoom( mcInput, outConfig, outAudio ); - } - ELSE - { - error = renderMcToBinauralRoom( mcInput, outConfig, outAudio ); - } - BREAK; - default: - return IVAS_ERR_INVALID_OUTPUT_FORMAT; + FOR( j = 0; j < 3; j++ ) + { + combinedOrientationDataLocal.Rmat_fx[sf][i][j] = combinedOrientationDataLocal.Rmat_fx[0][i][j]; + move32(); + } } - BREAK; - case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: - renderMcToMasa( mcInput, outAudio ); - BREAK; - default: - return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } } - return error; -} -static ivas_error renderActiveInputsMc( - IVAS_REND_HANDLE hIvasRend, - IVAS_REND_AudioBuffer outAudio ) -{ - Word16 i; - input_mc *pCurrentInput; - ivas_error error; - FOR( ( i = 0, pCurrentInput = hIvasRend->inputsMc ); i < RENDERER_MAX_MC_INPUTS; ( ++i, ++pCurrentInput ) ) + + /* temporary buffer for rotation in source format for CREND */ + tmpRotBuffer = mcInput->base.inputBuffer; + move32(); + IF( NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_5_1 ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_7_1 ) ) { - IF( EQ_32( pCurrentInput->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); + } + + FOR( i = 0; i < combinedOrientationDataLocal.num_subframes; i++ ) + { + Copy_Quat_fx( &combinedOrientationDataLocal.Quaternions[i], &Quaternions_orig[i] ); + } + + FOR( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses; pos_idx++ ) + { + /* Update head positions */ + FOR( i = 0; i < combinedOrientationDataLocal.num_subframes; i++ ) { - /* Skip inactive inputs */ - CONTINUE; + Quaternions_abs.w_fx = L_negate( 12582912 ); // Q22 + q_fact_orig = Quaternions_orig[i].q_fact; + modify_Quat_q_fx( &combinedOrientationDataLocal.Quaternions[i], &combinedOrientationDataLocal.Quaternions[i], Q22 ); + /*euler*/ + Quat2EulerDegree_fx( combinedOrientationDataLocal.Quaternions[i], &Quaternions_abs.z_fx, &Quaternions_abs.y_fx, &Quaternions_abs.x_fx ); + Quaternions_abs.x_fx = L_add( Quaternions_abs.x_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][0] ); + Quaternions_abs.y_fx = L_add( Quaternions_abs.y_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][1] ); + Quaternions_abs.z_fx = L_add( Quaternions_abs.z_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][2] ); + + Euler2Quat_fx( deg2rad_fx( Quaternions_abs.x_fx ), deg2rad_fx( Quaternions_abs.y_fx ), deg2rad_fx( Quaternions_abs.z_fx ), &Quaternions_abs ); + + modify_Quat_q_fx( &Quaternions_abs, &Quaternions_abs, q_fact_orig ); + + Copy_Quat_fx( &Quaternions_abs, &combinedOrientationDataLocal.Quaternions[i] ); + QuatToRotMat_fx( combinedOrientationDataLocal.Quaternions[i], combinedOrientationDataLocal.Rmat_fx[i] ); + modify_Rmat_q_fx( combinedOrientationDataLocal.Rmat_fx[i], combinedOrientationDataLocal.Rmat_fx[i], sub( shl( q_fact_orig, 1 ), 32 ), Q30 ); } - *outAudio.pq_fact = Q8; - move16(); - IF( NE_32( ( error = renderInputMc( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) + IF( EQ_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) || EQ_32( inConfig, IVAS_AUDIO_CONFIG_5_1 ) || EQ_32( inConfig, IVAS_AUDIO_CONFIG_7_1 ) ) { - return error; - } - } + /* tdrend processing overview: + * 1. copy from inputBuffer to tmpRendBuffer + * 2. td_binaural_renderer_ext: inplace processing in tmpRendBuffer + * 3. copy from tmpRendBuffer to tmpSplitBinBuffer + * 4. LFE mixing + * 5. tmpSplitBinBuffer accumulated to outBuffer */ - return IVAS_ERR_OK; -} -static void renderSbaToMc( - const input_sba *sbaInput, - IVAS_REND_AudioBuffer outAudio ) -{ - Word16 i; - IVAS_REND_AudioBuffer inAudio; - - push_wmops( "renderSbaToMc" ); - inAudio = sbaInput->base.inputBuffer; - - FOR( i = 0; i < inAudio.config.numChannels; ++i ) - { - renderBufferChannel_fx( inAudio, i, sbaInput->hoaDecMtx_fx[i], outAudio ); - } - - pop_wmops(); - return; -} - - -static void renderSbaToSba( - const input_sba *sbaInput, - IVAS_REND_AudioBuffer outAudio ) -{ - Word16 i; - IVAS_REND_AudioBuffer inAudio; - - push_wmops( "renderSbaToSba" ); - inAudio = sbaInput->base.inputBuffer; - - FOR( i = 0; i < inAudio.config.numChannels; ++i ) - { - renderBufferChannel_fx( inAudio, i, sbaInput->hoaDecMtx_fx[i], outAudio ); - } - - pop_wmops(); - return; -} -static ivas_error renderSbaToBinaural( - input_sba *sbaInput, - const AUDIO_CONFIG outConfig, - IVAS_REND_AudioBuffer outAudio ) -{ - ivas_error error; - IVAS_REND_AudioBuffer tmpRotBuffer; - Word16 i; - const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; - Word8 combinedOrientationEnabled; - Word16 subframe_idx; - Word32 output_buffer_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - Word32 *output_fx[MAX_OUTPUT_CHANNELS]; - - push_wmops( "renderSbaToBinaural" ); - { + /* copy input to tdrend input/output buffer */ + copyBufferTo2dArray_fx( mcInput->base.inputBuffer, tmpRendBuffer ); - FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - output_fx[i] = output_buffer_fx[i]; - } + /* perform rotation in source format to tmpRotBuffer */ + pCombinedOrientationDataLocal = &combinedOrientationDataLocal; - hCombinedOrientationData = sbaInput->base.ctx.pCombinedOrientationData; - combinedOrientationEnabled = 0; - move16(); - IF( hCombinedOrientationData != NULL ) - { - FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; ++i ) { - IF( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) - { - combinedOrientationEnabled = 1; - move16(); - BREAK; - } + Scale_sig32( tmpRendBuffer[i], L_FRAME48k, sub( Q11, exp ) ); /* Q11 */ } - } - /* apply rotation */ - IF( combinedOrientationEnabled ) - { - tmpRotBuffer = sbaInput->base.inputBuffer; - - tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); - /* copy input for in-place rotation */ - - Copy32( sbaInput->base.inputBuffer.data_fx, tmpRotBuffer.data_fx, i_mult( tmpRotBuffer.config.numChannels, tmpRotBuffer.config.numSamplesPerChannel ) ); - - IF( NE_16( ( error = rotateFrameSba_fx( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, - sbaInput->base.ctx.pCombinedOrientationData, sbaInput->rot_gains_prev_fx, tmpRotBuffer ) ), - IVAS_ERR_OK ) ) + /* Render */ + IF( ( error = ivas_td_binaural_renderer_ext_fx( ( pos_idx == 0 ) ? &mcInput->tdRendWrapper : &mcInput->splitTdRendWrappers[pos_idx - 1], mcInput->base.inConfig, &mcInput->customLsInput, &pCombinedOrientationDataLocal, NULL, mcInput->hReverb, 0, /* Ism Audio Metadata Delay Sync in ms for External Renderer */ *mcInput->base.ctx.pOutSampleRate, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer, &exp ) ) != IVAS_ERR_OK ) { return error; } + FOR( i = 0; i < BINAURAL_CHANNELS; ++i ) + { + Scale_sig32( tmpRendBuffer[i], L_FRAME48k, negate( sub( Q11, exp ) ) ); /* Q(exp) */ + } - copyBufferTo2dArray_fx( tmpRotBuffer, output_buffer_fx ); - free( tmpRotBuffer.data_fx ); + /* Copy rendered audio to tmp storage buffer. Copying directly to output would + * overwrite original audio, which is still needed for rendering next head pose. */ + Copy32( tmpRendBuffer[0], tmpSplitBinauralBuffer[i_mult( 2, pos_idx )], output_frame ); + Copy32( tmpRendBuffer[1], tmpSplitBinauralBuffer[add( i_mult( 2, pos_idx ), 1 )], output_frame ); } ELSE { - copyBufferTo2dArray_fx( sbaInput->base.inputBuffer, output_buffer_fx ); - } - // Porting Crend_process function - CREND_HANDLE hCrend; - hCrend = sbaInput->crendWrapper->hCrend; - - /* call CREND */ - IF( NE_32( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, sbaInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, output_fx, *sbaInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) ) ), - IVAS_ERR_OK ) ) - { - return error; - } - IF( hCrend->hReverb != NULL ) - { - *outAudio.pq_fact = sub( *outAudio.pq_fact, Q2 ); - move16(); - } - accumulate2dArrayToBuffer_fx( output_buffer_fx, &outAudio ); - } + hCrend = mcInput->crendWrapper->hCrend[0]; + /* crend processing overview: + * 1. rotateFrameMc: inputBuffer to tmpRotBuffer + * 2. crend_process: tmpRotBuffer to tmpRendBuffer + * 3. copy from tmpRendBuffer to tmpSplitBinBuffer + * 4. LFE mixing + * 5. tmpSplitBinBuffer accumulated to outBuffer */ - pop_wmops(); - return IVAS_ERR_OK; -} -static ivas_error renderSbaToBinauralRoom( - input_sba *sbaInput, - const AUDIO_CONFIG outConfig, - IVAS_REND_AudioBuffer outAudio ) -{ - Word16 i; - Word16 tmp; - Word32 tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - ivas_error error; - IVAS_REND_AudioBuffer tmpRotBuffer; - IVAS_REND_AudioBuffer tmpMcBuffer; - IVAS_REND_AudioBuffer *tmpBufPtr; - Word32 *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; - const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; - Word8 combinedOrientationEnabled; - Word16 subframe_idx; - tmpRotBuffer = outAudio; /* avoid compilation warning */ - push_wmops( "renderSbaToBinauralRoom" ); - Word16 nchan_out; - CREND_HANDLE hCrend; + /* copy input for in-place rotation */ + set32_fx( tmpRotBuffer.data_fx, 0, i_mult( tmpRotBuffer.config.numSamplesPerChannel, tmpRotBuffer.config.numChannels ) ); - hCrend = sbaInput->crendWrapper->hCrend; + /* perform rotation in source format to tmpRotBuffer */ + pCombinedOrientationDataLocal = &combinedOrientationDataLocal; + IF( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, &pCombinedOrientationDataLocal, mcInput->rot_gains_prev_fx[pos_idx], mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + IF( EQ_16( pos_idx, 0 ) ) + { + exp = sub( *outAudio.pq_fact, 1 ); + } - IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ), IVAS_ERR_OK ) ) - { - return error; - } + copyBufferTo2dArray_fx( tmpRotBuffer, tmpRendBuffer ); - FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; - } + *mcInput->crendWrapper->p_io_qfactor = exp; + move16(); - hCombinedOrientationData = sbaInput->base.ctx.pCombinedOrientationData; - combinedOrientationEnabled = 0; - move16(); - IF( hCombinedOrientationData != NULL ) - { - FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) - { - IF( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + /* call CREND (rotation already performed) */ + IF( NE_32( ( error = ivas_rend_crendProcessSubframe_fx( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer, p_tmpRendBuffer, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate, pos_idx ) ), IVAS_ERR_OK ) ) { - combinedOrientationEnabled = 1; - move16(); - BREAK; + return error; } - } - } - /* apply rotation */ - IF( combinedOrientationEnabled ) - { - tmpRotBuffer = sbaInput->base.inputBuffer; - tmpRotBuffer.data_fx = malloc( imult1616( tmpRotBuffer.config.numSamplesPerChannel, tmpRotBuffer.config.numChannels ) * sizeof( Word32 ) ); + IF( EQ_16( pos_idx, 0 ) ) + { + IF( hCrend->hReverb != NULL ) + { + exp = sub( exp, 2 ); + } + } - /* copy input for in-place rotation */ - Copy32( sbaInput->base.inputBuffer.data_fx, tmpRotBuffer.data_fx, i_mult( tmpRotBuffer.config.numChannels, tmpRotBuffer.config.numSamplesPerChannel ) ); + /* Copy rendererd audio to tmp storage buffer, Copying directly to output would + * overwrite original audio, which is still needed for rendering next head pose. */ + Copy32( tmpRendBuffer[0], tmpSplitBinauralBuffer[i_mult( 2, pos_idx )], output_frame ); + Copy32( tmpRendBuffer[1], tmpSplitBinauralBuffer[add( i_mult( 2, pos_idx ), 1 )], output_frame ); + } - IF( NE_32( ( error = rotateFrameSba_fx( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, - sbaInput->base.ctx.pCombinedOrientationData, - sbaInput->rot_gains_prev_fx, - tmpRotBuffer ) ), - IVAS_ERR_OK ) ) + /* restore original headrotation data */ + FOR( i = 0; i < combinedOrientationDataLocal.num_subframes; i++ ) { - return error; + Copy_Quat_fx( &Quaternions_orig[i], &combinedOrientationDataLocal.Quaternions[i] ); } } - /* intermediate rendering to 7_1_4 */ - tmpMcBuffer = sbaInput->base.inputBuffer; - - IF( NE_32( ( error = getAudioConfigNumChannels( IVAS_AUDIO_CONFIG_7_1_4, &tmp ) ), IVAS_ERR_OK ) ) + IF( NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_5_1 ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_7_1 ) ) { - return error; + /* free temporary buffer for rotation in source format for CREND */ + free( tmpRotBuffer.data_fx ); } - tmpMcBuffer.config.numChannels = tmp; - move16(); - tmpMcBuffer.data_fx = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( Word32 ) ); - set32_fx( tmpMcBuffer.data_fx, 0, i_mult( tmpMcBuffer.config.numChannels, tmpMcBuffer.config.numSamplesPerChannel ) ); - - IF( combinedOrientationEnabled ) - { - tmpBufPtr = &tmpRotBuffer; - } - ELSE - { - tmpBufPtr = &sbaInput->base.inputBuffer; - } - FOR( i = 0; i < sbaInput->base.inputBuffer.config.numChannels; i++ ) - { - renderBufferChannel_fx( *tmpBufPtr, i, sbaInput->hoaDecMtx_fx[i], tmpMcBuffer ); - } - copyBufferTo2dArray_fx( tmpMcBuffer, tmpCrendBuffer ); - // Porting Crend_process function + accumulate2dArrayToBuffer_fx( tmpSplitBinauralBuffer, &outAudio ); - /* call CREND */ - IF( NE_32( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, - NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) ) ), - IVAS_ERR_OK ) ) + IF( ( error = renderLfeToBinaural_fx( mcInput, outConfig, outAudio, *outAudio.pq_fact, exp ) ) != IVAS_ERR_OK ) { return error; } - IF( hCrend->hReverb != NULL ) - { - *outAudio.pq_fact = sub( *outAudio.pq_fact, 2 ); - move16(); - } - - accumulate2dArrayToBuffer_fx( tmpCrendBuffer, &outAudio ); - - IF( combinedOrientationEnabled ) - { - free( tmpRotBuffer.data_fx ); - } - free( tmpMcBuffer.data_fx ); + *outAudio.pq_fact = exp; pop_wmops(); return IVAS_ERR_OK; } -static void renderSbaToMasa( - input_sba *sbaInput, - IVAS_REND_AudioBuffer outAudio ) -{ - Word32 tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - push_wmops( "renderMcToMasa" ); - copyBufferTo2dArray_fx( sbaInput->base.inputBuffer, tmpRendBuffer ); - ivas_dirac_ana_fx( sbaInput->hDirAC, tmpRendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels ); - accumulate2dArrayToBuffer_fx( tmpRendBuffer, &outAudio ); - pop_wmops(); - return; -} -static ivas_error renderInputSba( - input_sba *sbaInput, +static ivas_error renderInputMc( + input_mc *mcInput, const AUDIO_CONFIG outConfig, IVAS_REND_AudioBuffer outAudio ) { @@ -6533,910 +7962,2066 @@ static ivas_error renderInputSba( IVAS_REND_AudioBuffer inAudio; error = IVAS_ERR_OK; move32(); - inAudio = sbaInput->base.inputBuffer; - IF( NE_32( sbaInput->base.numNewSamplesPerChannel, outAudio.config.numSamplesPerChannel ) ) + inAudio = mcInput->base.inputBuffer; + + IF( NE_32( mcInput->base.numNewSamplesPerChannel, outAudio.config.numSamplesPerChannel ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); } - sbaInput->base.numNewSamplesPerChannel = 0; + mcInput->base.numNewSamplesPerChannel = 0; move32(); - *outAudio.pq_fact = outAudio.q_factor; - move16(); - /* Apply input gain to new audio */ - v_multc_fixed( inAudio.data_fx, sbaInput->base.gain_fx, inAudio.data_fx, i_mult( inAudio.config.numSamplesPerChannel, inAudio.config.numChannels ) ); - *outAudio.pq_fact = sub( *outAudio.pq_fact, 1 ); // to compensate for the qfactor reduction in gain multiplication. + v_multc_fx( inAudio.data_fx, mcInput->base.gain_fx, inAudio.data_fx, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); + *outAudio.pq_fact = sub( *outAudio.pq_fact, Q1 ); // reducing the Q by 1 compensating for the v_mult_fx done move16(); /* set combined orientation subframe info to start info */ - ivas_combined_orientation_set_to_start_index( *( sbaInput->base.ctx.pCombinedOrientationData ) ); + ivas_combined_orientation_set_to_start_index( *( mcInput->base.ctx.pCombinedOrientationData ) ); SWITCH( getAudioConfigType( outConfig ) ) { case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: - renderSbaToMc( sbaInput, outAudio ); + renderMcToMc( mcInput, outAudio ); BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: - renderSbaToSba( sbaInput, outAudio ); + renderMcToSba( mcInput, outAudio ); BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: SWITCH( outConfig ) { case IVAS_AUDIO_CONFIG_BINAURAL: - error = renderSbaToBinaural( sbaInput, outConfig, outAudio ); + error = renderMcToBinaural( mcInput, outConfig, outAudio ); BREAK; case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: - error = renderSbaToBinauralRoom( sbaInput, outConfig, outAudio ); + IF( mcInput->base.inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + error = renderMcCustomLsToBinauralRoom( mcInput, outConfig, outAudio ); + } + ELSE + { + error = renderMcToBinauralRoom( mcInput, outConfig, outAudio ); + } BREAK; + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: + error = renderMcToSplitBinaural( mcInput, outConfig, outAudio ); + break; default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: - renderSbaToMasa( sbaInput, outAudio ); + renderMcToMasa( mcInput, outAudio ); BREAK; default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } - return error; } -static ivas_error renderActiveInputsSba( + + +static ivas_error renderActiveInputsMc( IVAS_REND_HANDLE hIvasRend, IVAS_REND_AudioBuffer outAudio ) { Word16 i; - input_sba *pCurrentInput; + input_mc *pCurrentInput; ivas_error error; - - FOR( ( i = 0, pCurrentInput = hIvasRend->inputsSba ); i < RENDERER_MAX_SBA_INPUTS; ( ++i, ++pCurrentInput ) ) + FOR( ( i = 0, pCurrentInput = hIvasRend->inputsMc ); i < RENDERER_MAX_MC_INPUTS; ( ++i, ++pCurrentInput ) ) { IF( EQ_32( pCurrentInput->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { /* Skip inactive inputs */ CONTINUE; } - *outAudio.pq_fact = Q8; + + *outAudio.pq_fact = outAudio.q_factor; move16(); - IF( NE_32( ( error = renderInputSba( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = renderInputMc( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) { return error; } } + return IVAS_ERR_OK; } -static void copyMasaMetadataToDiracRenderer_fx( - MASA_METADATA_FRAME *meta, - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, - const Word16 maxBin ) +static void renderSbaToMc( + const input_sba *sbaInput, + IVAS_REND_AudioBuffer outAudio ) { - Word16 band, sf, bin; - Word16 meta_write_index; + Word16 i; + IVAS_REND_AudioBuffer inAudio; - hSpatParamRendCom->numParametricDirections = add( meta->descriptive_meta.numberOfDirections, 1 ); - hSpatParamRendCom->numSimultaneousDirections = add( meta->descriptive_meta.numberOfDirections, 1 ); - move16(); - move16(); + push_wmops( "renderSbaToMc" ); + inAudio = sbaInput->base.inputBuffer; - FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + FOR( i = 0; i < inAudio.config.numChannels; ++i ) { - meta_write_index = add( hSpatParamRendCom->dirac_bs_md_write_idx, sf ) % hSpatParamRendCom->dirac_md_buffer_length; - - FOR( band = 0; band < MASA_MAXIMUM_CODING_SUBBANDS; band++ ) - { - FOR( bin = MASA_band_grouping_24[band]; bin < MASA_band_grouping_24[band + 1] && bin < maxBin; bin++ ) - { - hSpatParamRendCom->azimuth[meta_write_index][bin] = extract_l( L_shr( meta->directional_meta[0].azimuth_fx[sf][band], Q22 ) ); /* Q22 - Q22 = Q0 */ - move16(); - hSpatParamRendCom->elevation[meta_write_index][bin] = extract_l( L_shr( meta->directional_meta[0].elevation_fx[sf][band], Q22 ) ); /* Q22 - Q22 = Q0 */ - move16(); - hSpatParamRendCom->energy_ratio1_fx[meta_write_index][bin] = meta->directional_meta[0].energy_ratio_fx[sf][band]; - move32(); - hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][bin] = L_sub( ONE_IN_Q30, meta->directional_meta[0].energy_ratio_fx[sf][band] ); - move32(); - hSpatParamRendCom->spreadCoherence_fx[meta_write_index][bin] = meta->directional_meta[0].spread_coherence_fx[sf][band]; - move16(); - hSpatParamRendCom->surroundingCoherence_fx[meta_write_index][bin] = meta->common_meta.surround_coherence_fx[sf][band]; - move16(); - - IF( EQ_16( hSpatParamRendCom->numSimultaneousDirections, 2 ) ) - { - hSpatParamRendCom->azimuth2[meta_write_index][bin] = extract_l( L_shr( meta->directional_meta[1].azimuth_fx[sf][band], Q22 ) ); /* Q22 - Q22 = Q0 */ - move16(); - hSpatParamRendCom->elevation2[meta_write_index][bin] = extract_l( L_shr( meta->directional_meta[1].elevation_fx[sf][band], Q22 ) ); /* Q22 - Q22 = Q0 */ - move16(); - hSpatParamRendCom->energy_ratio2_fx[meta_write_index][bin] = meta->directional_meta[1].energy_ratio_fx[sf][band]; - move32(); - hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][bin] = L_sub( hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][bin], meta->directional_meta[1].energy_ratio_fx[sf][band] ); - move32(); - hSpatParamRendCom->spreadCoherence2_fx[meta_write_index][bin] = meta->directional_meta[1].spread_coherence_fx[sf][band]; - move16(); - } - } - } + renderBufferChannel_fx( inAudio, i, sbaInput->hoaDecMtx_fx[i], outAudio ); } - hSpatParamRendCom->dirac_bs_md_write_idx = add( hSpatParamRendCom->dirac_bs_md_write_idx, MAX_PARAM_SPATIAL_SUBFRAMES ) % hSpatParamRendCom->dirac_md_buffer_length; - move16(); - + pop_wmops(); return; } -static void renderMasaToMasa( - input_masa *masaInput, +static void renderSbaToSba( + const input_sba *sbaInput, IVAS_REND_AudioBuffer outAudio ) { - Word16 sf, band, dir, numDirs; - Word32 ratioSum_fx; /* Q30 */ - MASA_DECODER_EXT_OUT_META_HANDLE outMeta; - MASA_METADATA_FRAME *inMeta; - Word32 tmpBuffer_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - Word16 ts, i, j, l_ts; - Word32 Chan_RealBuffer_fx[MASA_MAX_TRANSPORT_CHANNELS][CLDFB_NO_CHANNELS_MAX]; - Word32 Chan_ImagBuffer_fx[MASA_MAX_TRANSPORT_CHANNELS][CLDFB_NO_CHANNELS_MAX]; - Word16 band_m_idx, block_m_idx; - Word16 mrange[2]; - Word16 brange[2]; - Word16 numAnalysisChannels; - Word16 tmp_energy_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - copyBufferTo2dArray_fx( masaInput->base.inputBuffer, tmpBuffer_fx ); - Word16 q_cldfb = *outAudio.pq_fact; - Word16 q_cldfb_out = *outAudio.pq_fact; - Word16 scale_factor = 31; - Word16 scale_fac_arr[MASA_MAX_TRANSPORT_CHANNELS]; - move16(); - move16(); - move16(); - /* Calculate energy */ - // l_ts = masaInput->base.inputBuffer.config.numSamplesPerChannel / CLDFB_NO_COL_MAX; - l_ts = shr( masaInput->base.inputBuffer.config.numSamplesPerChannel, 4 ); - numAnalysisChannels = masaInput->hMasaPrerend->num_Cldfb_instances; - move16(); - /* do processing over all CLDFB time slots */ - FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + Word16 i; + IVAS_REND_AudioBuffer inAudio; + + push_wmops( "renderSbaToSba" ); + inAudio = sbaInput->base.inputBuffer; + + FOR( i = 0; i < inAudio.config.numChannels; ++i ) { - mrange[0] = DirAC_block_grouping[block_m_idx]; - mrange[1] = DirAC_block_grouping[block_m_idx + 1]; - move16(); - move16(); + renderBufferChannel_fx( inAudio, i, sbaInput->hoaDecMtx_fx[i], outAudio ); + } - set_zero_fx( masaInput->hMasaPrerend->energy_fx[block_m_idx], MASA_FREQUENCY_BANDS ); + pop_wmops(); + return; +} - FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) - { - FOR( i = 0; i < numAnalysisChannels; i++ ) - { - scale_factor = 31; - move16(); - masaInput->hMasaPrerend->cldfbAnaEnc[i]->Q_cldfb_state = q_cldfb; - q_cldfb_out = q_cldfb; - move16(); - move16(); - cldfbAnalysis_ts_fx_fixed_q( &( tmpBuffer_fx[i][l_ts * ts] ), Chan_RealBuffer_fx[i], Chan_ImagBuffer_fx[i], l_ts, masaInput->hMasaPrerend->cldfbAnaEnc[i], &q_cldfb_out ); - scale_factor = s_min( scale_factor, s_min( getScaleFactor32( Chan_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ), getScaleFactor32( Chan_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ) ); - scale_factor = sub( scale_factor, 1 ); - scale_sig32( Chan_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, scale_factor ); /* Q(q_cldfb_out + scale_factor) */ - scale_sig32( Chan_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, scale_factor ); /* Q(q_cldfb_out + scale_factor) */ - scale_fac_arr[i] = scale_factor; - move16(); - } - scale_factor = MAX_16; - move16(); - FOR( i = 0; i < numAnalysisChannels; i++ ) - { - scale_factor = s_min( scale_factor, scale_fac_arr[i] ); - } +static ivas_error renderSbaToMultiBinaural( + input_sba *sbaInput, + const AUDIO_CONFIG outConfig, + Word32 out[][L_FRAME48k], + const Word16 *pq_fact ) +{ + Word32 tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + Word32 *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; + Word16 sf; + Word16 i, j, pos_idx; + COMBINED_ORIENTATION_DATA combinedOrientationDataLocal; + COMBINED_ORIENTATION_HANDLE pCombinedOrientationDataLocal; + ivas_error error; + IVAS_REND_AudioBuffer tmpRotBuffer; + const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData; - FOR( i = 0; i < numAnalysisChannels; i++ ) - { - IF( NE_16( scale_factor, scale_fac_arr[i] ) ) - { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - Chan_RealBuffer_fx[i][j] = L_shr( Chan_RealBuffer_fx[i][j], sub( scale_fac_arr[i], scale_factor ) ); /* Q(q_cldfb_out+scale_factor) */ - move32(); - Chan_ImagBuffer_fx[i][j] = L_shr( Chan_ImagBuffer_fx[i][j], sub( scale_fac_arr[i], scale_factor ) ); /* Q(q_cldfb_out+scale_factor) */ - move32(); - } - } - } + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; + move32(); + } + push_wmops( "renderSbaToMultiBinaural" ); + pMultiBinPoseData = &sbaInput->base.ctx.pSplitRendWrapper->multiBinPoseData; + move32(); - Word16 q_add = sub( 31, add( scale_factor, q_cldfb_out ) ); - /* Compute channel energy for metadata processing */ - FOR( band_m_idx = 0; band_m_idx < MASA_FREQUENCY_BANDS; band_m_idx++ ) + pCombinedOrientationDataLocal = *sbaInput->base.ctx.pCombinedOrientationData; + combinedOrientationDataLocal = *pCombinedOrientationDataLocal; + move32(); + move32(); + + IF( EQ_32( pMultiBinPoseData->poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) ) + { + FOR( sf = 1; sf < combinedOrientationDataLocal.num_subframes; ++sf ) + { + Copy_Quat_fx( &combinedOrientationDataLocal.Quaternions[0], &combinedOrientationDataLocal.Quaternions[sf] ); + FOR( i = 0; i < 3; i++ ) { - brange[0] = MASA_band_grouping_24[band_m_idx]; - move16(); - brange[1] = MASA_band_grouping_24[band_m_idx + 1]; - move16(); - FOR( j = brange[0]; j < brange[1]; j++ ) + FOR( j = 0; j < 3; j++ ) { - FOR( i = 0; i < numAnalysisChannels; i++ ) - { - Word32 temp = L_add( Mpy_32_32( Chan_RealBuffer_fx[0][j], Chan_RealBuffer_fx[0][j] ), Mpy_32_32( Chan_ImagBuffer_fx[0][j], Chan_ImagBuffer_fx[0][j] ) ); /* 2 * Q(q_cldfb_out + scale_factor) - 31 */ - masaInput->hMasaPrerend->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( masaInput->hMasaPrerend->energy_fx[block_m_idx][band_m_idx], tmp_energy_e[block_m_idx][band_m_idx], temp, shl( q_add, 1 ), &tmp_energy_e[block_m_idx][band_m_idx] ); - move32(); - } + combinedOrientationDataLocal.Rmat_fx[sf][i][j] = combinedOrientationDataLocal.Rmat_fx[0][i][j]; + move32(); } } } } - FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + + tmpRotBuffer = sbaInput->base.inputBuffer; + tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); + + FOR( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses; pos_idx++ ) { - Word16 max_e = MIN_16; - move16(); - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) + IVAS_QUATERNION Quaternions_orig[MAX_PARAM_SPATIAL_SUBFRAMES], Quaternions_abs; + Word16 q_fact_orig; + FOR( i = 0; i < combinedOrientationDataLocal.num_subframes; i++ ) + { + Copy_Quat_fx( &combinedOrientationDataLocal.Quaternions[i], &Quaternions_orig[i] ); + + Quaternions_abs.w_fx = L_negate( 12582912 ); // Q22 + q_fact_orig = combinedOrientationDataLocal.Quaternions[i].q_fact; + modify_Quat_q_fx( &combinedOrientationDataLocal.Quaternions[i], &combinedOrientationDataLocal.Quaternions[i], Q22 ); + /*euler*/ + Quat2EulerDegree_fx( combinedOrientationDataLocal.Quaternions[i], &Quaternions_abs.z_fx, &Quaternions_abs.y_fx, &Quaternions_abs.x_fx ); + Quaternions_abs.x_fx = L_add( Quaternions_abs.x_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][0] ); + Quaternions_abs.y_fx = L_add( Quaternions_abs.y_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][1] ); + Quaternions_abs.z_fx = L_add( Quaternions_abs.z_fx, pMultiBinPoseData->relative_head_poses_fx[pos_idx][2] ); + + Euler2Quat_fx( deg2rad_fx( Quaternions_abs.x_fx ), deg2rad_fx( Quaternions_abs.y_fx ), deg2rad_fx( Quaternions_abs.z_fx ), &Quaternions_abs ); + + modify_Quat_q_fx( &Quaternions_abs, &Quaternions_abs, q_fact_orig ); + + Copy_Quat_fx( &Quaternions_abs, &combinedOrientationDataLocal.Quaternions[i] ); + QuatToRotMat_fx( combinedOrientationDataLocal.Quaternions[i], combinedOrientationDataLocal.Rmat_fx[i] ); + modify_Rmat_q_fx( combinedOrientationDataLocal.Rmat_fx[i], combinedOrientationDataLocal.Rmat_fx[i], sub( shl( q_fact_orig, 1 ), 32 ), Q30 ); + } + + /* copy input for in-place rotation */ + Copy32( sbaInput->base.inputBuffer.data_fx, tmpRotBuffer.data_fx, tmpRotBuffer.config.numChannels * tmpRotBuffer.config.numSamplesPerChannel ); + + pCombinedOrientationDataLocal = &combinedOrientationDataLocal; + + IF( ( error = rotateFrameSba_fx( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, &pCombinedOrientationDataLocal, sbaInput->rot_gains_prev_fx[pos_idx], tmpRotBuffer ) ) != IVAS_ERR_OK ) { - max_e = s_max( max_e, tmp_energy_e[i][j] ); + return error; } - masaInput->hMasaPrerend->energy_e[i] = max_e; + + copyBufferTo2dArray_fx( tmpRotBuffer, tmpCrendBuffer ); + + assert( sbaInput->crendWrapper->hCrend[0]->hReverb == NULL ); + + *sbaInput->crendWrapper->p_io_qfactor = *pq_fact; move16(); - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) + + /* call CREND */ + IF( NE_32( ( error = ivas_rend_crendProcessSubframe_fx( sbaInput->crendWrapper, sbaInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpCrendBuffer, p_tmpCrendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, *sbaInput->base.ctx.pOutSampleRate, pos_idx ) ), IVAS_ERR_OK ) ) { + return error; + } - masaInput->hMasaPrerend->energy_fx[i][j] = L_shr( masaInput->hMasaPrerend->energy_fx[i][j], sub( max_e, tmp_energy_e[i][j] ) ); /* Q(31 - max_e) */ - move32(); + FOR( i = 0; i < combinedOrientationDataLocal.num_subframes; i++ ) + { + Copy_Quat_fx( &Quaternions_orig[i], &combinedOrientationDataLocal.Quaternions[i] ); + } + + /* move to output */ + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + Copy32( tmpCrendBuffer[i], out[pos_idx * BINAURAL_CHANNELS + i], tmpRotBuffer.config.numSamplesPerChannel ); } } - /* Copy audio channels if mismatch in number of transports */ - test(); - test(); - IF( EQ_16( masaInput->base.inputBuffer.config.numChannels, 1 ) && EQ_16( outAudio.config.numChannels, 2 ) ) + + free( tmpRotBuffer.data_fx ); + + pop_wmops(); + return IVAS_ERR_OK; +} + + +static ivas_error renderSbaToMultiBinauralCldfb( + input_sba *sbaInput, + Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const Word16 low_res_pre_rend_rot, + const Word16 num_subframes, + const Word16 Q_in ) +{ + Word32 Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + + copyBufferToCLDFBarray_fx( sbaInput->base.inputBuffer, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + + ivas_rend_CldfbMultiBinRendProcess( sbaInput->cldfbRendWrapper.hCldfbRend, sbaInput->base.ctx.pCombinedOrientationData, &sbaInput->base.ctx.pSplitRendWrapper->multiBinPoseData, + Cldfb_RealBuffer, Cldfb_ImagBuffer, Cldfb_Out_Real, Cldfb_Out_Imag, low_res_pre_rend_rot, num_subframes, Q_in ); + + return IVAS_ERR_OK; +} + + +static ivas_error renderSbaToSplitBinaural( + input_sba *sbaInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio ) +{ + Word32 tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + ivas_error error; + Word32 Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 low_res_pre_rend_rot; + + low_res_pre_rend_rot = 1; + + push_wmops( "renderSbaToSplitBinaural" ); + + IF( EQ_32( sbaInput->base.ctx.hhRendererConfig[0]->split_rend_config.rendererSelection, IVAS_BIN_RENDERER_TYPE_FASTCONV ) ) { - Copy32( tmpBuffer_fx[0], tmpBuffer_fx[1], masaInput->base.inputBuffer.config.numSamplesPerChannel ); + IF( ( error = renderSbaToMultiBinauralCldfb( sbaInput, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, low_res_pre_rend_rot, + getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ), *outAudio.pq_fact ) ) != IVAS_ERR_OK ) + { + return error; + } + + accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, &outAudio ); } - ELSE IF( EQ_16( masaInput->base.inputBuffer.config.numChannels, 2 ) && EQ_16( outAudio.config.numChannels, 1 ) ) + ELSE { - // v_add( tmpBuffer[0], tmpBuffer[1], tmpBuffer[0], masaInput->base.inputBuffer.config.numSamplesPerChannel ); - v_add_fixed( tmpBuffer_fx[0], tmpBuffer_fx[1], tmpBuffer_fx[0], masaInput->base.inputBuffer.config.numSamplesPerChannel, 0 ); - } - - /* Copy metadata */ - outMeta = masaInput->hMasaPrerend->hMasaOut; - inMeta = &masaInput->masaMetadata; - numDirs = add( inMeta->descriptive_meta.numberOfDirections, 1 ); + IF( ( error = renderSbaToMultiBinaural( sbaInput, outConfig, tmpCrendBuffer, outAudio.pq_fact ) ) != IVAS_ERR_OK ) + { + return error; + } - FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) - { - FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + IF( sbaInput->crendWrapper->hCrend[0]->hReverb != NULL ) { - /* Remainder is always set to zero and energy removal is compensated in following steps - * to other ratios. */ - // inMeta->common_meta.remainder_to_total_ratio[sf][band] = 0.0f; - inMeta->common_meta.remainder_to_total_ratio_fx[sf][band] = 0; - move32(); - ratioSum_fx = 0; + *outAudio.pq_fact = sub( *outAudio.pq_fact, Q2 ); + move16(); + } + + accumulate2dArrayToBuffer_fx( tmpCrendBuffer, &outAudio ); + } + + pop_wmops(); + return IVAS_ERR_OK; +} + + +static ivas_error renderSbaToBinaural( + input_sba *sbaInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio ) +{ + ivas_error error; + IVAS_REND_AudioBuffer tmpRotBuffer; + Word16 i; + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + Word8 combinedOrientationEnabled; + Word16 subframe_idx; + Word32 output_buffer_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + Word32 *output_fx[MAX_OUTPUT_CHANNELS]; + + push_wmops( "renderSbaToBinaural" ); + + IF( EQ_32( sbaInput->base.ctx.hhRendererConfig[0]->split_rend_config.rendererSelection, IVAS_BIN_RENDERER_TYPE_FASTCONV ) ) + { + Word32 Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + + IF( ( error = renderSbaToMultiBinauralCldfb( sbaInput, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, 0, + getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ), *outAudio.pq_fact ) ) != IVAS_ERR_OK ) + { + return error; + } + + accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, &outAudio ); + } + ELSE + { + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + output_fx[i] = output_buffer_fx[i]; move32(); - FOR( dir = 0; dir < numDirs; dir++ ) - { - ratioSum_fx = L_add( ratioSum_fx, inMeta->directional_meta[dir].energy_ratio_fx[sf][band] ); - } - ratioSum_fx = L_add( ratioSum_fx, inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] ); + } - IF( ratioSum_fx == 0 ) + hCombinedOrientationData = sbaInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + move16(); + IF( *hCombinedOrientationData != NULL ) + { + FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) { - FOR( dir = 0; dir < numDirs; dir++ ) + IF( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) { - inMeta->directional_meta[dir].energy_ratio_fx[sf][band] = 0; - move32(); + combinedOrientationEnabled = 1; + move16(); + BREAK; } - inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] = ONE_IN_Q30; - move32(); } - ELSE IF( NE_32( ratioSum_fx, ONE_IN_Q30 ) ) + } + + /* apply rotation */ + IF( combinedOrientationEnabled ) + { + tmpRotBuffer = sbaInput->base.inputBuffer; + + tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); + + /* copy input for in-place rotation */ + Copy32( sbaInput->base.inputBuffer.data_fx, tmpRotBuffer.data_fx, i_mult( tmpRotBuffer.config.numChannels, tmpRotBuffer.config.numSamplesPerChannel ) ); + + IF( NE_16( ( error = rotateFrameSba_fx( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, sbaInput->base.ctx.pCombinedOrientationData, sbaInput->rot_gains_prev_fx[0], tmpRotBuffer ) ), + IVAS_ERR_OK ) ) { - Word16 tmp_e = 0; - move16(); - Word32 tmp = 0; - move32(); - FOR( dir = 0; dir < numDirs; dir++ ) - { - tmp = BASOP_Util_Divide3232_Scale_cadence( inMeta->directional_meta[dir].energy_ratio_fx[sf][band], ratioSum_fx, &tmp_e ); - inMeta->directional_meta[dir].energy_ratio_fx[sf][band] = L_shl( tmp, sub( tmp_e, 1 ) ); /* Q30 */ - move32(); - } - tmp_e = 0; - move16(); - tmp = 0; - move32(); - tmp = BASOP_Util_Divide3232_Scale_cadence( inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band], ratioSum_fx, &tmp_e ); - inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] = L_shl( tmp, sub( tmp_e, 1 ) ); /* Q30 */ - move32(); + return error; } + + copyBufferTo2dArray_fx( tmpRotBuffer, output_buffer_fx ); + free( tmpRotBuffer.data_fx ); } + ELSE + { + copyBufferTo2dArray_fx( sbaInput->base.inputBuffer, output_buffer_fx ); + } + + CREND_HANDLE hCrend; + hCrend = sbaInput->crendWrapper->hCrend[0]; + + *sbaInput->crendWrapper->p_io_qfactor = *outAudio.pq_fact; + move16(); + + /* call CREND */ + IF( NE_32( ( error = ivas_rend_crendProcessSubframe_fx( sbaInput->crendWrapper, sbaInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, output_fx, output_fx, sbaInput->base.inputBuffer.config.numSamplesPerChannel, *sbaInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( hCrend->hReverb != NULL ) + { + *outAudio.pq_fact = sub( *outAudio.pq_fact, Q2 ); + move16(); + } + + accumulate2dArrayToBuffer_fx( output_buffer_fx, &outAudio ); } - FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + pop_wmops(); + return IVAS_ERR_OK; +} + + +static ivas_error renderSbaToBinauralRoom( + input_sba *sbaInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio ) +{ + Word16 i; + Word16 tmp; + Word32 tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + ivas_error error; + IVAS_REND_AudioBuffer tmpRotBuffer; + IVAS_REND_AudioBuffer tmpMcBuffer; + IVAS_REND_AudioBuffer *tmpBufPtr; + Word32 *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + Word8 combinedOrientationEnabled; + Word16 subframe_idx; + + tmpRotBuffer = outAudio; /* avoid compilation warning */ + push_wmops( "renderSbaToBinauralRoom" ); + Word16 nchan_out; + CREND_HANDLE hCrend; + hCrend = sbaInput->crendWrapper->hCrend[0]; + + IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ), IVAS_ERR_OK ) ) { - FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + return error; + } + + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; + } + + hCombinedOrientationData = sbaInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + move16(); + IF( *hCombinedOrientationData != NULL ) + { + FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) { - outMeta->diffuseToTotalRatio[sf][band] = UINT8_MAX; - move16(); - FOR( dir = 0; dir < numDirs; dir++ ) + IF( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) { - outMeta->directionIndex[dir][sf][band] = index_theta_phi_16_fx( &inMeta->directional_meta[dir].elevation_fx[sf][band], &inMeta->directional_meta[dir].azimuth_fx[sf][band], masaInput->hMasaPrerend->sph_grid16 ); - outMeta->directToTotalRatio[dir][sf][band] = (UWord8) L_shr( inMeta->directional_meta[dir].energy_ratio_fx[sf][band], Q22 ); - outMeta->diffuseToTotalRatio[sf][band] = (UWord8) sub( outMeta->diffuseToTotalRatio[sf][band], outMeta->directToTotalRatio[dir][sf][band] ); - outMeta->spreadCoherence[dir][sf][band] = (UWord8) shr( inMeta->directional_meta[dir].spread_coherence_fx[sf][band], Q7 ); - - move16(); - move16(); - move16(); + combinedOrientationEnabled = 1; move16(); + BREAK; } - outMeta->surroundCoherence[sf][band] = (UWord8) shr( inMeta->common_meta.surround_coherence_fx[sf][band], Q7 ); - move16(); } } - copy_masa_descriptive_meta_fx( &( outMeta->descriptiveMeta ), &( inMeta->descriptive_meta ) ); + /* apply rotation */ + IF( combinedOrientationEnabled ) + { + tmpRotBuffer = sbaInput->base.inputBuffer; + tmpRotBuffer.data_fx = malloc( imult1616( tmpRotBuffer.config.numSamplesPerChannel, tmpRotBuffer.config.numChannels ) * sizeof( Word32 ) ); - accumulate2dArrayToBuffer_fx( tmpBuffer_fx, &outAudio ); + /* copy input for in-place rotation */ + Copy32( sbaInput->base.inputBuffer.data_fx, tmpRotBuffer.data_fx, i_mult( tmpRotBuffer.config.numChannels, tmpRotBuffer.config.numSamplesPerChannel ) ); - return; + IF( NE_32( ( error = rotateFrameSba_fx( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, sbaInput->base.ctx.pCombinedOrientationData, sbaInput->rot_gains_prev_fx[0], tmpRotBuffer ) ), + IVAS_ERR_OK ) ) + { + return error; + } + } + + /* intermediate rendering to 7_1_4 */ + tmpMcBuffer = sbaInput->base.inputBuffer; + + IF( NE_32( ( error = getAudioConfigNumChannels( IVAS_AUDIO_CONFIG_7_1_4, &tmp ) ), IVAS_ERR_OK ) ) + { + return error; + } + + tmpMcBuffer.config.numChannels = tmp; + move16(); + tmpMcBuffer.data_fx = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( Word32 ) ); + set32_fx( tmpMcBuffer.data_fx, 0, i_mult( tmpMcBuffer.config.numChannels, tmpMcBuffer.config.numSamplesPerChannel ) ); + + IF( combinedOrientationEnabled ) + { + tmpBufPtr = &tmpRotBuffer; + } + ELSE + { + tmpBufPtr = &sbaInput->base.inputBuffer; + } + FOR( i = 0; i < sbaInput->base.inputBuffer.config.numChannels; i++ ) + { + renderBufferChannel_fx( *tmpBufPtr, i, sbaInput->hoaDecMtx_fx[i], tmpMcBuffer ); + } + + copyBufferTo2dArray_fx( tmpMcBuffer, tmpCrendBuffer ); + + *sbaInput->crendWrapper->p_io_qfactor = *outAudio.pq_fact; + move16(); + + /* call CREND */ + IF( NE_32( ( error = ivas_rend_crendProcessSubframe_fx( sbaInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpCrendBuffer, p_tmpCrendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, *sbaInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( hCrend->hReverb != NULL ) + { + *outAudio.pq_fact = sub( *outAudio.pq_fact, 2 ); + move16(); + } + + accumulate2dArrayToBuffer_fx( tmpCrendBuffer, &outAudio ); + + IF( combinedOrientationEnabled ) + { + free( tmpRotBuffer.data_fx ); + } + free( tmpMcBuffer.data_fx ); + + pop_wmops(); + return IVAS_ERR_OK; } -static ivas_error renderInputMasa( - input_masa *masaInput, - const AUDIO_CONFIG outConfig, + +static void renderSbaToMasa( + input_sba *sbaInput, IVAS_REND_AudioBuffer outAudio ) { - IVAS_REND_AudioBuffer inAudio; - Word16 ch; - Word16 maxBin; - Word32 *tmpBuffer_fx[MAX_OUTPUT_CHANNELS]; - Word32 tmpBuffer_buff_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + Word32 tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + + push_wmops( "renderMcToMasa" ); + copyBufferTo2dArray_fx( sbaInput->base.inputBuffer, tmpRendBuffer ); + ivas_dirac_ana_fx( sbaInput->hDirAC, tmpRendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels, *outAudio.pq_fact ); + accumulate2dArrayToBuffer_fx( tmpRendBuffer, &outAudio ); + + pop_wmops(); + return; +} + + +static ivas_error renderInputSba( + input_sba *sbaInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio ) +{ + ivas_error error; + IVAS_REND_AudioBuffer inAudio; + Word16 cldfb2tdShift; + error = IVAS_ERR_OK; + move32(); + inAudio = sbaInput->base.inputBuffer; + + cldfb2tdShift = outAudio.config.is_cldfb ? 1 : 0; + IF( NE_32( L_shl( sbaInput->base.numNewSamplesPerChannel, cldfb2tdShift ), outAudio.config.numSamplesPerChannel ) && + NE_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); + } + sbaInput->base.numNewSamplesPerChannel = 0; + move32(); + *outAudio.pq_fact = outAudio.q_factor; + move16(); + /* Apply input gain to new audio */ + v_multc_fx( inAudio.data_fx, sbaInput->base.gain_fx, inAudio.data_fx, i_mult( inAudio.config.numSamplesPerChannel, inAudio.config.numChannels ) ); + *outAudio.pq_fact = sub( *outAudio.pq_fact, 1 ); // to compensate for the qfactor reduction in gain multiplication. + move16(); + + /* set combined orientation subframe info to start info */ + ivas_combined_orientation_set_to_start_index( *( sbaInput->base.ctx.pCombinedOrientationData ) ); + + SWITCH( getAudioConfigType( outConfig ) ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + renderSbaToMc( sbaInput, outAudio ); + BREAK; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + renderSbaToSba( sbaInput, outAudio ); + BREAK; + case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: + SWITCH( outConfig ) + { + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: + error = renderSbaToSplitBinaural( sbaInput, outConfig, outAudio ); + break; + case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + error = renderSbaToBinaural( sbaInput, outConfig, outAudio ); + break; + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + error = renderSbaToBinauralRoom( sbaInput, outConfig, outAudio ); + BREAK; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + BREAK; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + renderSbaToMasa( sbaInput, outAudio ); + BREAK; + default: + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + + return error; +} + + +static ivas_error renderActiveInputsSba( + IVAS_REND_HANDLE hIvasRend, + IVAS_REND_AudioBuffer outAudio ) +{ + Word16 i; + input_sba *pCurrentInput; + ivas_error error; + + FOR( ( i = 0, pCurrentInput = hIvasRend->inputsSba ); i < RENDERER_MAX_SBA_INPUTS; ( ++i, ++pCurrentInput ) ) + { + IF( EQ_32( pCurrentInput->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + /* Skip inactive inputs */ + CONTINUE; + } + *outAudio.pq_fact = outAudio.q_factor; + move16(); + IF( NE_32( ( error = renderInputSba( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +static void copyMasaMetadataToDiracRenderer_fx( + MASA_METADATA_FRAME *meta, + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, + const Word16 maxBin ) +{ + Word16 band, sf, bin; + Word16 meta_write_index; + + hSpatParamRendCom->numParametricDirections = add( meta->descriptive_meta.numberOfDirections, 1 ); + hSpatParamRendCom->numSimultaneousDirections = add( meta->descriptive_meta.numberOfDirections, 1 ); + move16(); + move16(); + + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + meta_write_index = add( hSpatParamRendCom->dirac_bs_md_write_idx, sf ) % hSpatParamRendCom->dirac_md_buffer_length; + + FOR( band = 0; band < MASA_MAXIMUM_CODING_SUBBANDS; band++ ) + { + FOR( bin = MASA_band_grouping_24[band]; bin < MASA_band_grouping_24[band + 1] && bin < maxBin; bin++ ) + { + hSpatParamRendCom->azimuth[meta_write_index][bin] = extract_l( L_shr( meta->directional_meta[0].azimuth_fx[sf][band], Q22 ) ); /* Q22 - Q22 = Q0 */ + move16(); + hSpatParamRendCom->elevation[meta_write_index][bin] = extract_l( L_shr( meta->directional_meta[0].elevation_fx[sf][band], Q22 ) ); /* Q22 - Q22 = Q0 */ + move16(); + hSpatParamRendCom->energy_ratio1_fx[meta_write_index][bin] = meta->directional_meta[0].energy_ratio_fx[sf][band]; + move32(); + hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][bin] = L_sub( ONE_IN_Q30, meta->directional_meta[0].energy_ratio_fx[sf][band] ); + move32(); + hSpatParamRendCom->spreadCoherence_fx[meta_write_index][bin] = meta->directional_meta[0].spread_coherence_fx[sf][band]; + move16(); + hSpatParamRendCom->surroundingCoherence_fx[meta_write_index][bin] = meta->common_meta.surround_coherence_fx[sf][band]; + move16(); + + IF( EQ_16( hSpatParamRendCom->numSimultaneousDirections, 2 ) ) + { + hSpatParamRendCom->azimuth2[meta_write_index][bin] = extract_l( L_shr( meta->directional_meta[1].azimuth_fx[sf][band], Q22 ) ); /* Q22 - Q22 = Q0 */ + move16(); + hSpatParamRendCom->elevation2[meta_write_index][bin] = extract_l( L_shr( meta->directional_meta[1].elevation_fx[sf][band], Q22 ) ); /* Q22 - Q22 = Q0 */ + move16(); + hSpatParamRendCom->energy_ratio2_fx[meta_write_index][bin] = meta->directional_meta[1].energy_ratio_fx[sf][band]; + move32(); + hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][bin] = L_sub( hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][bin], meta->directional_meta[1].energy_ratio_fx[sf][band] ); + move32(); + hSpatParamRendCom->spreadCoherence2_fx[meta_write_index][bin] = meta->directional_meta[1].spread_coherence_fx[sf][band]; + move16(); + } + } + } + } + + hSpatParamRendCom->dirac_bs_md_write_idx = add( hSpatParamRendCom->dirac_bs_md_write_idx, MAX_PARAM_SPATIAL_SUBFRAMES ) % hSpatParamRendCom->dirac_md_buffer_length; + move16(); + + return; +} + + +static void renderMasaToMasa( + input_masa *masaInput, + IVAS_REND_AudioBuffer outAudio ) +{ + Word16 sf, band, dir, numDirs; + Word32 ratioSum_fx; /* Q30 */ + MASA_DECODER_EXT_OUT_META_HANDLE outMeta; + MASA_METADATA_FRAME *inMeta; + Word32 tmpBuffer_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + Word16 ts, i, j, l_ts; + Word32 Chan_RealBuffer_fx[MASA_MAX_TRANSPORT_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + Word32 Chan_ImagBuffer_fx[MASA_MAX_TRANSPORT_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + Word16 band_m_idx, block_m_idx; + Word16 mrange[2]; + Word16 brange[2]; + Word16 numAnalysisChannels; + copyBufferTo2dArray_fx( masaInput->base.inputBuffer, tmpBuffer_fx ); + Word16 q_cldfb = *outAudio.pq_fact; + Word16 q_cldfb_out = *outAudio.pq_fact; + Word16 scale_factor = 31; + Word16 scale_fac_arr[MASA_MAX_TRANSPORT_CHANNELS]; + move16(); + move16(); + move16(); + /* Calculate energy */ + // l_ts = masaInput->base.inputBuffer.config.numSamplesPerChannel / CLDFB_NO_COL_MAX; + l_ts = shr( masaInput->base.inputBuffer.config.numSamplesPerChannel, 4 ); + numAnalysisChannels = masaInput->hMasaPrerend->num_Cldfb_instances; + move16(); + /* do processing over all CLDFB time slots */ + FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + { + mrange[0] = DirAC_block_grouping[block_m_idx]; + mrange[1] = DirAC_block_grouping[block_m_idx + 1]; + move16(); + move16(); + + set_zero_fx( masaInput->hMasaPrerend->energy_fx[block_m_idx], MASA_FREQUENCY_BANDS ); + set16_fx( masaInput->hMasaPrerend->energy_e[block_m_idx], 0, MASA_FREQUENCY_BANDS ); + + FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + scale_factor = 31; + move16(); + masaInput->hMasaPrerend->cldfbAnaEnc[i]->Q_cldfb_state = q_cldfb; + q_cldfb_out = q_cldfb; + move16(); + move16(); + cldfbAnalysis_ts_fx_fixed_q( &( tmpBuffer_fx[i][l_ts * ts] ), Chan_RealBuffer_fx[i], Chan_ImagBuffer_fx[i], l_ts, masaInput->hMasaPrerend->cldfbAnaEnc[i], &q_cldfb_out ); + scale_factor = s_min( scale_factor, s_min( getScaleFactor32( Chan_RealBuffer_fx[i], l_ts ), getScaleFactor32( Chan_ImagBuffer_fx[i], l_ts ) ) ); + scale_factor = sub( scale_factor, 1 ); + scale_sig32( Chan_RealBuffer_fx[i], l_ts, scale_factor ); /* Q(q_cldfb_out + scale_factor) */ + scale_sig32( Chan_ImagBuffer_fx[i], l_ts, scale_factor ); /* Q(q_cldfb_out + scale_factor) */ + scale_fac_arr[i] = scale_factor; + move16(); + } + + scale_factor = MAX_16; + move16(); + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + scale_factor = s_min( scale_factor, scale_fac_arr[i] ); + } + + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + IF( NE_16( scale_factor, scale_fac_arr[i] ) ) + { + FOR( j = 0; j < l_ts; j++ ) + { + Chan_RealBuffer_fx[i][j] = L_shr( Chan_RealBuffer_fx[i][j], sub( scale_fac_arr[i], scale_factor ) ); /* Q(q_cldfb_out+scale_factor) */ + move32(); + Chan_ImagBuffer_fx[i][j] = L_shr( Chan_ImagBuffer_fx[i][j], sub( scale_fac_arr[i], scale_factor ) ); /* Q(q_cldfb_out+scale_factor) */ + move32(); + } + } + } + + Word16 q_add = sub( 31, add( scale_factor, q_cldfb_out ) ); + /* Compute channel energy for metadata processing */ + FOR( band_m_idx = 0; band_m_idx < masaInput->hMasaPrerend->nbands; band_m_idx++ ) + { + brange[0] = masaInput->hMasaPrerend->band_grouping[band_m_idx]; + move16(); + brange[1] = masaInput->hMasaPrerend->band_grouping[band_m_idx + 1]; + move16(); + + FOR( j = brange[0]; j < brange[1]; j++ ) + { + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + Word32 temp = L_add( Mpy_32_32( Chan_RealBuffer_fx[0][j], Chan_RealBuffer_fx[0][j] ), Mpy_32_32( Chan_ImagBuffer_fx[0][j], Chan_ImagBuffer_fx[0][j] ) ); /* 2 * Q(q_cldfb_out + scale_factor) - 31 */ + masaInput->hMasaPrerend->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( masaInput->hMasaPrerend->energy_fx[block_m_idx][band_m_idx], masaInput->hMasaPrerend->energy_e[block_m_idx][band_m_idx], temp, shl( q_add, 1 ), &masaInput->hMasaPrerend->energy_e[block_m_idx][band_m_idx] ); + move32(); + } + } + } + } + } + + /* Copy audio channels if mismatch in number of transports */ + test(); + test(); + IF( EQ_16( masaInput->base.inputBuffer.config.numChannels, 1 ) && EQ_16( outAudio.config.numChannels, 2 ) ) + { + Copy32( tmpBuffer_fx[0], tmpBuffer_fx[1], masaInput->base.inputBuffer.config.numSamplesPerChannel ); + } + ELSE IF( EQ_16( masaInput->base.inputBuffer.config.numChannels, 2 ) && EQ_16( outAudio.config.numChannels, 1 ) ) + { + // v_add( tmpBuffer[0], tmpBuffer[1], tmpBuffer[0], masaInput->base.inputBuffer.config.numSamplesPerChannel ); + v_add_fx_no_hdrm( tmpBuffer_fx[0], tmpBuffer_fx[1], tmpBuffer_fx[0], masaInput->base.inputBuffer.config.numSamplesPerChannel ); + } + + /* Copy metadata */ + outMeta = masaInput->hMasaPrerend->hMasaOut; + inMeta = &masaInput->masaMetadata; + numDirs = add( inMeta->descriptive_meta.numberOfDirections, 1 ); + + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + /* Remainder is always set to zero and energy removal is compensated in following steps + * to other ratios. */ + // inMeta->common_meta.remainder_to_total_ratio[sf][band] = 0.0f; + inMeta->common_meta.remainder_to_total_ratio_fx[sf][band] = 0; + move32(); + ratioSum_fx = 0; + move32(); + FOR( dir = 0; dir < numDirs; dir++ ) + { + ratioSum_fx = L_add( ratioSum_fx, inMeta->directional_meta[dir].energy_ratio_fx[sf][band] ); + } + ratioSum_fx = L_add( ratioSum_fx, inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] ); + + IF( ratioSum_fx == 0 ) + { + FOR( dir = 0; dir < numDirs; dir++ ) + { + inMeta->directional_meta[dir].energy_ratio_fx[sf][band] = 0; + move32(); + } + inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] = ONE_IN_Q30; + move32(); + } + ELSE IF( NE_32( ratioSum_fx, ONE_IN_Q30 ) ) + { + Word16 tmp_e = 0; + move16(); + Word32 tmp = 0; + move32(); + FOR( dir = 0; dir < numDirs; dir++ ) + { + tmp = BASOP_Util_Divide3232_Scale_newton( inMeta->directional_meta[dir].energy_ratio_fx[sf][band], ratioSum_fx, &tmp_e ); + inMeta->directional_meta[dir].energy_ratio_fx[sf][band] = L_shl( tmp, sub( tmp_e, 1 ) ); /* Q30 */ + move32(); + } + tmp_e = 0; + move16(); + tmp = 0; + move32(); + tmp = BASOP_Util_Divide3232_Scale_newton( inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band], ratioSum_fx, &tmp_e ); + inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] = L_shl( tmp, sub( tmp_e, 1 ) ); /* Q30 */ + move32(); + } + } + } + + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + outMeta->diffuseToTotalRatio[sf][band] = UINT8_MAX; + move16(); + FOR( dir = 0; dir < numDirs; dir++ ) + { + outMeta->directionIndex[dir][sf][band] = index_theta_phi_16_fx( &inMeta->directional_meta[dir].elevation_fx[sf][band], &inMeta->directional_meta[dir].azimuth_fx[sf][band], masaInput->hMasaPrerend->sph_grid16 ); + outMeta->directToTotalRatio[dir][sf][band] = (UWord8) L_shr( inMeta->directional_meta[dir].energy_ratio_fx[sf][band], Q22 ); + outMeta->diffuseToTotalRatio[sf][band] = (UWord8) sub( outMeta->diffuseToTotalRatio[sf][band], outMeta->directToTotalRatio[dir][sf][band] ); + outMeta->spreadCoherence[dir][sf][band] = (UWord8) shr( inMeta->directional_meta[dir].spread_coherence_fx[sf][band], Q7 ); + + move16(); + move16(); + move16(); + move16(); + } + outMeta->surroundCoherence[sf][band] = (UWord8) shr( inMeta->common_meta.surround_coherence_fx[sf][band], Q7 ); + move16(); + } + } + + copy_masa_descriptive_meta_fx( &( outMeta->descriptiveMeta ), &( inMeta->descriptive_meta ) ); + + accumulate2dArrayToBuffer_fx( tmpBuffer_fx, &outAudio ); + + return; +} + +static ivas_error renderInputMasa( + input_masa *masaInput, + const AUDIO_CONFIG outConfig, + IVAS_REND_AudioBuffer outAudio ) +{ + IVAS_REND_AudioBuffer inAudio; + Word16 ch; + Word16 maxBin; + Word32 *tmpBuffer_fx[MAX_OUTPUT_CHANNELS]; + Word32 tmpBuffer_buff_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + Word16 cldfb2tdShift; + Word32 Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + + IF( !masaInput->metadataHasBeenFed ) + { + return IVAS_ERR_MISSING_METADATA; + } + + inAudio = masaInput->base.inputBuffer; + + cldfb2tdShift = outAudio.config.is_cldfb ? 1 : 0; + IF( ( NE_32( L_shl( masaInput->base.numNewSamplesPerChannel, cldfb2tdShift ), outAudio.config.numSamplesPerChannel ) ) && + NE_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); + } + masaInput->base.numNewSamplesPerChannel = 0; + move32(); + + *outAudio.pq_fact = outAudio.q_factor; + move16(); + /* Apply input gain to new audio */ + v_multc_fx( inAudio.data_fx, masaInput->base.gain_fx, inAudio.data_fx, i_mult( inAudio.config.numSamplesPerChannel, inAudio.config.numChannels ) ); + *outAudio.pq_fact = sub( *outAudio.pq_fact, 1 ); // to compensate for the qfactor reduction in gain multiplication. + move16(); + + maxBin = extract_l( Mpy_32_32( *masaInput->base.ctx.pOutSampleRate, INV_CLDFB_BANDWIDTH_Q31 ) ); /* Q0 */ + + /* set combined orientation subframe info to start info */ + ivas_combined_orientation_set_to_start_index( *( masaInput->base.ctx.pCombinedOrientationData ) ); + + IF( EQ_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) + { + /* MASA prerendering path for MASA -> MASA */ + renderMasaToMasa( masaInput, outAudio ); + } + ELSE + { + /* MASA external renderer -> other formats */ + Word16 num_subframes, exp; + FOR( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + tmpBuffer_fx[ch] = tmpBuffer_buff_fx[ch]; + } + copyBufferTo2dArray_fx( masaInput->base.inputBuffer, tmpBuffer_buff_fx ); + + num_subframes = BASOP_Util_Divide3232_Scale( L_mult0( masaInput->base.inputBuffer.config.numSamplesPerChannel, IVAS_NUM_FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ), *masaInput->base.ctx.pOutSampleRate, &exp ); + num_subframes = shr( num_subframes, sub( 15, exp ) ); /* Q0 */ + + IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) + { + /* split rendering. use the combined of the first subframe in all subframes */ + Word16 sf, i, j; + COMBINED_ORIENTATION_HANDLE pCombinedOrientationData; + pCombinedOrientationData = *masaInput->base.ctx.pCombinedOrientationData; + FOR( sf = 1; sf < pCombinedOrientationData->num_subframes; sf++ ) + { + Copy_Quat_fx( &pCombinedOrientationData->Quaternions[0], &pCombinedOrientationData->Quaternions[sf] ); + FOR( i = 0; i < 3; i++ ) + { + FOR( j = 0; j < 3; j++ ) + { + pCombinedOrientationData->Rmat_fx[sf][i][j] = pCombinedOrientationData->Rmat_fx[0][i][j]; + move32(); + } + } + } + + copyMasaMetadataToDiracRenderer_fx( &masaInput->masaMetadata, masaInput->hMasaExtRend->hSpatParamRendCom, maxBin ); + Scale_sig32( tmpBuffer_buff_fx[0], L_FRAME48k, sub( Q11, *outAudio.pq_fact ) ); /* Q11 */ + Scale_sig32( tmpBuffer_buff_fx[1], L_FRAME48k, sub( Q11, *outAudio.pq_fact ) ); /* Q11 */ + // scale_sig32( outAudio.data_fx, i_mult( outAudio.config.numChannels, outAudio.config.numSamplesPerChannel ), sub( Q11, *outAudio.pq_fact ) ); + + ivas_masa_ext_rend_parambin_render_fx( masaInput->hMasaExtRend, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer_fx, num_subframes, masaInput->base.ctx.pSplitRendWrapper, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural ); + + accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, &outAudio ); + + *outAudio.pq_fact = Q6; + move16(); + } + ELSE + { + /* non-split path */ + SWITCH( masaInput->hMasaExtRend->renderer_type ) + { + case RENDERER_DIRAC: + + copyMasaMetadataToDiracRenderer_fx( &masaInput->masaMetadata, masaInput->hMasaExtRend->hSpatParamRendCom, maxBin ); + intermidiate_ext_dirac_render( masaInput->hMasaExtRend, 1 ); + FOR( ch = 0; ch < masaInput->hMasaExtRend->hDirACRend->hOutSetup.nchan_out_woLFE + masaInput->hMasaExtRend->hDirACRend->hOutSetup.num_lfe; ch++ ) + { + masaInput->hMasaExtRend->cldfbAnaRend[0]->Q_cldfb_state = Q11; + move16(); + } + FOR( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + Scale_sig32( tmpBuffer_buff_fx[ch], L_FRAME48k, sub( Q11, *outAudio.pq_fact ) ); /* Q11 */ + } + + scale_sig32( outAudio.data_fx, i_mult( outAudio.config.numChannels, outAudio.config.numSamplesPerChannel ), sub( Q11, *outAudio.pq_fact ) ); /* Q11 */ + + ivas_masa_ext_dirac_render_fx( masaInput->hMasaExtRend, tmpBuffer_fx, num_subframes ); + + *outAudio.pq_fact = Q11; + move16(); + + FOR( ch = 0; ch < masaInput->hMasaExtRend->hDirACRend->hOutSetup.nchan_out_woLFE + masaInput->hMasaExtRend->hDirACRend->hOutSetup.num_lfe; ch++ ) + { + scale_sig32( masaInput->hMasaExtRend->cldfbSynRend[ch]->cldfb_state_fx, masaInput->hMasaExtRend->cldfbSynRend[ch]->cldfb_size, sub( Q11, masaInput->hMasaExtRend->cldfbSynRend[ch]->Q_cldfb_state ) ); /* Q11 */ + masaInput->hMasaExtRend->cldfbSynRend[ch]->Q_cldfb_state = Q11; + move16(); + } + + intermidiate_ext_dirac_render( masaInput->hMasaExtRend, 0 ); + BREAK; + case RENDERER_STEREO_PARAMETRIC: + case RENDERER_BINAURAL_PARAMETRIC: + case RENDERER_BINAURAL_PARAMETRIC_ROOM: + + copyMasaMetadataToDiracRenderer_fx( &masaInput->masaMetadata, masaInput->hMasaExtRend->hSpatParamRendCom, maxBin ); + + Scale_sig32( tmpBuffer_buff_fx[0], L_FRAME48k, sub( Q11, *outAudio.pq_fact ) ); /* Q11 */ + Scale_sig32( tmpBuffer_buff_fx[1], L_FRAME48k, sub( Q11, *outAudio.pq_fact ) ); /* Q11 */ + + scale_sig32( outAudio.data_fx, i_mult( outAudio.config.numChannels, outAudio.config.numSamplesPerChannel ), sub( Q11, *outAudio.pq_fact ) ); + + ivas_masa_ext_rend_parambin_render_fx( masaInput->hMasaExtRend, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer_fx, num_subframes, NULL, NULL, NULL ); + *outAudio.pq_fact = Q11; + move16(); + BREAK; + case RENDERER_DISABLE: + BREAK; /* This happens for 1TC MASA to MONO where we just copy input transport to output */ + default: + return ( IVAS_ERROR( IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED, "Wrong output config for MASA input in external renderer\n" ) ); + } + accumulate2dArrayToBuffer_fx( tmpBuffer_buff_fx, &outAudio ); + } + } + + return IVAS_ERR_OK; +} + + +static ivas_error renderActiveInputsMasa( + IVAS_REND_HANDLE hIvasRend, + IVAS_REND_AudioBuffer outAudio ) +{ + Word16 i; + input_masa *pCurrentInput; + ivas_error error; + + FOR( ( i = 0, pCurrentInput = hIvasRend->inputsMasa ); i < RENDERER_MAX_MASA_INPUTS; ( ++i, ++pCurrentInput ) ) + { + IF( EQ_16( pCurrentInput->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + /* Skip inactive inputs */ + CONTINUE; + } + + *outAudio.pq_fact = outAudio.q_factor; + move16(); + + IF( NE_32( ( error = renderInputMasa( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_GetMasaMetadata( ) + * + * Get metadata of the estimated MASA frame + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to analyzed MASA metadata */ + const IVAS_REND_AudioConfigType inputType /* i : Input type */ +) +{ + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Get the metadata handle */ + IF( EQ_32( inputType, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) ) + { + *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; + } + ELSE IF( EQ_32( inputType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + { + *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; + } + ELSE IF( EQ_32( inputType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) + { + *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; + } + ELSE + { + return IVAS_ERR_NOT_SUPPORTED_OPTION; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_MergeMasaMetadata( ) + * + * Merge MASA metadata from two formats + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_MergeMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to merged metadata */ + const IVAS_REND_AudioConfigType inputType1, /* i : Input type 1 */ + const IVAS_REND_AudioConfigType inputType2 /* i : Input type 2 */ +) +{ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2; + Word32( *inEne1_fx )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word32( *inEne2_fx )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word16( *inEne1_e )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word16( *inEne2_e )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Input1 metadata and energy */ + IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) ) + { + + *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; + inEne1_fx = &( hIvasRend->inputsIsm->hOMasa->energy_fx ); + inEne1_e = &( hIvasRend->inputsIsm->hOMasa->energy_e ); + } + ELSE IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + { + + *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; + inEne1_fx = &( hIvasRend->inputsMc->hMcMasa->energy_fx ); + inEne1_e = &( hIvasRend->inputsMc->hMcMasa->energy_e ); + } + ELSE IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) + { + + *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; + inEne1_fx = &( hIvasRend->inputsSba->hDirAC->energy_fx ); + inEne1_e = &( hIvasRend->inputsSba->hDirAC->energy_e ); + } + ELSE IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) + { + + *hMasaExtOutMeta = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; + inEne1_fx = &( hIvasRend->inputsMasa->hMasaPrerend->energy_fx ); + inEne1_e = &( hIvasRend->inputsMasa->hMasaPrerend->energy_e ); + } + ELSE + { + return IVAS_ERR_NOT_SUPPORTED_OPTION; + } + + /* Input2 metadata and energy */ + IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) ) + { + inMeta2 = hIvasRend->inputsIsm->hOMasa->hMasaOut; + inEne2_fx = &( hIvasRend->inputsIsm->hOMasa->energy_fx ); + inEne2_e = &( hIvasRend->inputsIsm->hOMasa->energy_e ); + } + ELSE IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + { + inMeta2 = hIvasRend->inputsMc->hMcMasa->hMasaOut; + inEne2_fx = &( hIvasRend->inputsMc->hMcMasa->energy_fx ); + inEne2_e = &( hIvasRend->inputsMc->hMcMasa->energy_e ); + } + ELSE IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) + { + inMeta2 = hIvasRend->inputsSba->hDirAC->hMasaOut; + inEne2_fx = &( hIvasRend->inputsSba->hDirAC->energy_fx ); + inEne2_e = &( hIvasRend->inputsSba->hDirAC->energy_e ); + } + ELSE IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) + { + + inMeta2 = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; + inEne2_fx = &( hIvasRend->inputsMasa->hMasaPrerend->energy_fx ); + inEne2_e = &( hIvasRend->inputsMasa->hMasaPrerend->energy_e ); + } + ELSE + { + return IVAS_ERR_NOT_SUPPORTED_OPTION; + } + + /* Merge metadata */ + ivas_prerend_merge_masa_metadata_fx( *hMasaExtOutMeta, *hMasaExtOutMeta, inputType1, *inEne1_fx, *inEne1_e, inMeta2, inputType2, *inEne2_fx, *inEne2_e ); + + + IF( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_MASA1 ) ) + { + ( *hMasaExtOutMeta )->descriptiveMeta.numberOfChannels = 0u; + move16(); + } + ELSE + { + ( *hMasaExtOutMeta )->descriptiveMeta.numberOfChannels = 1u; + move16(); + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_SetTotalNumberOfObjects( ) + * + * Set the total number of objects to the first object data + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetTotalNumberOfObjects( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const UWord16 total_num_objects /* i : total number of objects */ +) +{ + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hIvasRend->inputsIsm[0].total_num_objects = total_num_objects; + move16(); + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_SetIsmMetadataDelay( ) + * + * Set the Metadata Delay in ms in order to sync with audio delay + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetIsmMetadataDelay( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const Word16 sync_md_delay /* i : ISM Metadata Delay in ms to sync with audio delay */ +) +{ + Word16 i; + + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) + { + hIvasRend->inputsIsm[i].ism_metadata_delay_ms_fx = sync_md_delay; + move16(); + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * getSamplesInternal() + * + * + *-------------------------------------------------------------------*/ + +static ivas_error getSamplesInternal( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ +) +{ + ivas_error error; + Word16 numOutChannels; + Word16 cldfb2tdSampleShift; + + /* Validate function arguments */ + test(); + IF( hIvasRend == NULL || outAudio.data_fx == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } - IF( !masaInput->metadataHasBeenFed ) + test(); + cldfb2tdSampleShift = ( outAudio.config.is_cldfb ) ? 1 : 0; + + test(); + test(); + test(); + test(); + IF( outAudio.config.numSamplesPerChannel <= 0 || ( L_FRAME_MAX < outAudio.config.numSamplesPerChannel && outAudio.config.is_cldfb == 0 ) || + ( ( shl( L_FRAME_MAX, cldfb2tdSampleShift ) ) < outAudio.config.numSamplesPerChannel && outAudio.config.is_cldfb == 1 ) ) { - return IVAS_ERR_MISSING_METADATA; + return IVAS_ERR_INVALID_BUFFER_SIZE; } - inAudio = masaInput->base.inputBuffer; - IF( NE_32( masaInput->base.numNewSamplesPerChannel, outAudio.config.numSamplesPerChannel ) ) + test(); + IF( LE_16( outAudio.config.numChannels, 0 ) || LT_16( MAX_OUTPUT_CHANNELS, outAudio.config.numChannels ) ) { - return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); + return IVAS_ERR_WRONG_NUM_CHANNELS; } - masaInput->base.numNewSamplesPerChannel = 0; - move32(); - - *outAudio.pq_fact = outAudio.q_factor; - move16(); - /* Apply input gain to new audio */ - v_multc_fixed( inAudio.data_fx, masaInput->base.gain_fx, inAudio.data_fx, i_mult( inAudio.config.numSamplesPerChannel, inAudio.config.numChannels ) ); - *outAudio.pq_fact = sub( *outAudio.pq_fact, 1 ); // to compensate for the qfactor reduction in gain multiplication. - move16(); - - maxBin = extract_l( Mpy_32_32( *masaInput->base.ctx.pOutSampleRate, INV_CLDFB_BANDWIDTH_Q31 ) ); /* Q0 */ - - /* set combined orientation subframe info to start info */ - ivas_combined_orientation_set_to_start_index( *( masaInput->base.ctx.pCombinedOrientationData ) ); - IF( EQ_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) + test(); + test(); + test(); + IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) && + NE_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && + NE_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) && + NE_32( L_shr( L_mult0( outAudio.config.numSamplesPerChannel, 1000 ), cldfb2tdSampleShift ), + imult3216( hIvasRend->sampleRateOut, i_mult( hIvasRend->num_subframes, BINAURAL_RENDERING_FRAME_SIZE_MS ) ) ) ) { - /* MASA prerendering path for MASA -> MASA */ - renderMasaToMasa( masaInput, outAudio ); + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Binaural rendering requires specific frame size" ); } - ELSE - { - /* MASA external renderer -> other formats */ - Word16 num_subframes, exp; - FOR( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) - { - tmpBuffer_fx[ch] = tmpBuffer_buff_fx[ch]; - } - copyBufferTo2dArray_fx( masaInput->base.inputBuffer, tmpBuffer_buff_fx ); - num_subframes = BASOP_Util_Divide3232_Scale( L_mult0( masaInput->base.inputBuffer.config.numSamplesPerChannel, IVAS_NUM_FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ), *masaInput->base.ctx.pOutSampleRate, &exp ); - num_subframes = shr( num_subframes, sub( 15, exp ) ); /* Q0 */ + /* Check that there is allowed configuration for MASA format output */ + IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) + { + Word16 i; + Word16 numMasaInputs = 0; + move16(); + Word16 numOtherInputs = 0; + move16(); - SWITCH( masaInput->hMasaExtRend->renderer_type ) + FOR( i = 0; i < RENDERER_MAX_MASA_INPUTS; i++ ) { - case RENDERER_DIRAC: + // numMasaInputs += hIvasRend->inputsMasa[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; - copyMasaMetadataToDiracRenderer_fx( &masaInput->masaMetadata, masaInput->hMasaExtRend->hSpatParamRendCom, maxBin ); - intermidiate_ext_dirac_render( masaInput->hMasaExtRend, 1 ); - FOR( ch = 0; ch < masaInput->hMasaExtRend->hDirACRend->hOutSetup.nchan_out_woLFE + masaInput->hMasaExtRend->hDirACRend->hOutSetup.num_lfe; ch++ ) - { - masaInput->hMasaExtRend->cldfbAnaRend[0]->Q_cldfb_state = Q11; - move16(); - } - FOR( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) - { - Scale_sig32( tmpBuffer_buff_fx[ch], L_FRAME48k, sub( Q11, *outAudio.pq_fact ) ); /* Q11 */ - } + IF( EQ_32( hIvasRend->inputsMasa[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + numMasaInputs = add( numMasaInputs, 0 ); + } + ELSE + { + numMasaInputs = add( numMasaInputs, 1 ); + } + } - scale_sig32( outAudio.data_fx, i_mult( outAudio.config.numChannels, outAudio.config.numSamplesPerChannel ), sub( Q11, *outAudio.pq_fact ) ); /* Q11 */ + FOR( i = 0; i < RENDERER_MAX_MC_INPUTS; i++ ) + { + // numOtherInputs += hIvasRend->inputsMc[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; - ivas_masa_ext_dirac_render_fx( masaInput->hMasaExtRend, tmpBuffer_fx, num_subframes ); + IF( EQ_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + numOtherInputs = add( numOtherInputs, 0 ); + } + ELSE + { + numOtherInputs = add( numOtherInputs, 1 ); + } + } - *outAudio.pq_fact = Q11; - move16(); + FOR( i = 0; i < RENDERER_MAX_SBA_INPUTS; i++ ) + { + // numOtherInputs += hIvasRend->inputsSba[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; - FOR( ch = 0; ch < masaInput->hMasaExtRend->hDirACRend->hOutSetup.nchan_out_woLFE + masaInput->hMasaExtRend->hDirACRend->hOutSetup.num_lfe; ch++ ) - { - scale_sig32( masaInput->hMasaExtRend->cldfbSynRend[ch]->cldfb_state_fx, masaInput->hMasaExtRend->cldfbSynRend[ch]->cldfb_size, sub( Q11, masaInput->hMasaExtRend->cldfbSynRend[ch]->Q_cldfb_state ) ); /* Q11 */ - masaInput->hMasaExtRend->cldfbSynRend[ch]->Q_cldfb_state = Q11; - move16(); - } + IF( EQ_32( hIvasRend->inputsSba[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + numOtherInputs = add( numOtherInputs, 0 ); + } + ELSE + { + numOtherInputs = add( numOtherInputs, 1 ); + } + } - intermidiate_ext_dirac_render( masaInput->hMasaExtRend, 0 ); - BREAK; - case RENDERER_STEREO_PARAMETRIC: - case RENDERER_BINAURAL_PARAMETRIC: - case RENDERER_BINAURAL_PARAMETRIC_ROOM: + /* For ISM, we check only first as all ISMs are handled together via OMASA when merging to MASA. */ + // numOtherInputs += hIvasRend->inputsIsm[0].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; + IF( EQ_32( hIvasRend->inputsIsm[0].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + numOtherInputs = add( numOtherInputs, 0 ); + } + ELSE + { + numOtherInputs = add( numOtherInputs, 1 ); + } - copyMasaMetadataToDiracRenderer_fx( &masaInput->masaMetadata, masaInput->hMasaExtRend->hSpatParamRendCom, maxBin ); + test(); + IF( numMasaInputs == 0 || numOtherInputs == 0 ) + { + return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; + } + } - Scale_sig32( tmpBuffer_buff_fx[0], L_FRAME48k, sub( Q11, *outAudio.pq_fact ) ); /* Q11 */ - Scale_sig32( tmpBuffer_buff_fx[1], L_FRAME48k, sub( Q11, *outAudio.pq_fact ) ); /* Q11 */ + IF( NE_32( ( error = IVAS_REND_GetNumOutChannels( hIvasRend, &numOutChannels ) ), IVAS_ERR_OK ) ) + { + return error; + } - scale_sig32( outAudio.data_fx, i_mult( outAudio.config.numChannels, outAudio.config.numSamplesPerChannel ), sub( Q11, *outAudio.pq_fact ) ); + IF( NE_16( numOutChannels, outAudio.config.numChannels ) && + NE_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && + NE_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + return IVAS_ERR_WRONG_NUM_CHANNELS; + } - ivas_masa_ext_rend_parambin_render_fx( masaInput->hMasaExtRend, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer_fx, num_subframes ); - *outAudio.pq_fact = Q11; - move16(); - BREAK; - case RENDERER_DISABLE: - BREAK; /* This happens for 1TC MASA to MONO where we just copy input transport to output */ - default: - return ( IVAS_ERROR( IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED, "Wrong output config for MASA input in external renderer\n" ) ); - } + /* Clear output buffer */ + set32_fx( outAudio.data_fx, 0, imult1616( outAudio.config.numChannels, outAudio.config.numSamplesPerChannel ) ); - accumulate2dArrayToBuffer_fx( tmpBuffer_buff_fx, &outAudio ); + IF( NE_32( ( error = renderActiveInputsIsm( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) + { + return error; + } + IF( NE_32( ( error = renderActiveInputsMc( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) + { + return error; + } + IF( NE_32( ( error = renderActiveInputsSba( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) + { + return error; + } + IF( NE_32( ( error = renderActiveInputsMasa( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) + { + return error; } return IVAS_ERR_OK; } -static ivas_error renderActiveInputsMasa( - IVAS_REND_HANDLE hIvasRend, - IVAS_REND_AudioBuffer outAudio ) + + +/*-------------------------------------------------------------------* + * IVAS_REND_GetSamples() + * + * + *-------------------------------------------------------------------*/ +ivas_error IVAS_REND_GetSamples( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ +) { - Word16 i; - input_masa *pCurrentInput; ivas_error error; - FOR( ( i = 0, pCurrentInput = hIvasRend->inputsMasa ); i < RENDERER_MAX_MASA_INPUTS; ( ++i, ++pCurrentInput ) ) + IF( ( error = getSamplesInternal( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) { - IF( EQ_16( pCurrentInput->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) - { - /* Skip inactive inputs */ - CONTINUE; - } + return error; + } - *outAudio.pq_fact = Q8; - move16(); - IF( NE_32( ( error = renderInputMasa( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) - { - return error; - } + IF( EQ_16( outAudio.config.is_cldfb, 0 ) ) + { + Word32 limiter_threshold = L_lshl( IVAS_LIMITER_THRESHOLD, *outAudio.pq_fact ); +#ifndef DISABLE_LIMITER + limitRendererOutput_fx( hIvasRend->hLimiter, outAudio.data_fx, outAudio.config.numSamplesPerChannel, limiter_threshold, *outAudio.pq_fact ); +#endif } + /* update global cominbed orientation start index */ + ivas_combined_orientation_update_start_index( hIvasRend->hCombinedOrientationData, outAudio.config.numSamplesPerChannel ); + return IVAS_ERR_OK; } -/*---------------------------------------------------------------------* - * IVAS_REND_GetMasaMetadata( ) + +/*-------------------------------------------------------------------* + * IVAS_REND_GetSplitBinauralBitstream() * - * Get metadata of the estimated MASA frame - *---------------------------------------------------------------------*/ + * + *-------------------------------------------------------------------*/ -ivas_error IVAS_REND_GetMasaMetadata( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ - MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to analyzed MASA metadata */ - const IVAS_REND_AudioConfigType inputType /* i : Input type */ +ivas_error IVAS_REND_GetSplitBinauralBitstream( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_AudioBuffer outAudio, /* i/o: buffer for output audio */ + IVAS_REND_BitstreamBuffer *hBits /* o : buffer for output bitstream */ ) { - IF( hIvasRend == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } + ivas_error error; + Word16 ch; + Word16 cldfb_in_flag; + Word16 i, ro_md_flag; + Word16 num_poses_orig; + Word32 *tmpBinaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS], tmpBinaural_buff[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][L_FRAME48k]; + Word32 Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + IVAS_REND_AudioBufferConfig *pSplitEncBufConfig; + ISAR_SPLIT_REND_CONFIG_HANDLE pSplitRendConfig; + ISAR_SPLIT_REND_BITS_DATA bits; + Word16 max_bands; + Word16 Q_out[2]; + Word16 pcm_out_flag; + Word32 *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; + Word32 *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; + Word16 j; - /* Get the metadata handle */ - IF( EQ_32( inputType, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) ) - { - *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; - } - ELSE IF( EQ_32( inputType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + FOR( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) { - *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; + FOR( j = 0; j < CLDFB_NO_COL_MAX; ++j ) + { + p_Cldfb_RealBuffer_Binaural[i][j] = Cldfb_RealBuffer_Binaural[i][j]; + p_Cldfb_ImagBuffer_Binaural[i][j] = Cldfb_ImagBuffer_Binaural[i][j]; + } } - ELSE IF( EQ_32( inputType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) + + max_bands = 0; + move16(); + + Q_out[0] = Q31; + move16(); + Q_out[1] = Q31; + move16(); + + pcm_out_flag = 0; + move16(); + + if ( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; + pcm_out_flag = 1; + move16(); } - ELSE + + FOR( ch = 0; ch < i_mult( MAX_HEAD_ROT_POSES, BINAURAL_CHANNELS ); ch++ ) { - return IVAS_ERR_NOT_SUPPORTED_OPTION; + tmpBinaural[ch] = tmpBinaural_buff[ch]; } - return IVAS_ERR_OK; -} + cldfb_in_flag = getCldfbRendFlag( hIvasRend, IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN ); + pSplitEncBufConfig = &hIvasRend->splitRendEncBuffer.config; + pSplitRendConfig = &hIvasRend->hRendererConfig->split_rend_config; + *hIvasRend->splitRendEncBuffer.pq_fact = *outAudio.pq_fact; + move16(); + hIvasRend->splitRendEncBuffer.q_factor = outAudio.q_factor; + move16(); -/*---------------------------------------------------------------------* - * IVAS_REND_MergeMasaMetadata( ) - * - * Merge MASA metadata from two formats - *---------------------------------------------------------------------*/ - -ivas_error IVAS_REND_MergeMasaMetadata( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ - MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to merged metadata */ - const IVAS_REND_AudioConfigType inputType1, /* i : Input type 1 */ - const IVAS_REND_AudioConfigType inputType2 /* i : Input type 2 */ -) -{ - MASA_DECODER_EXT_OUT_META_HANDLE inMeta2; - Word32( *inEne1_fx )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word32( *inEne2_fx )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 *inEne1_e; - Word16 *inEne2_e; + /* 0 DoF / No pose correction retains frame size */ + pSplitEncBufConfig->is_cldfb = cldfb_in_flag; + move16(); - IF( hIvasRend == NULL ) + test(); + IF( EQ_16( pSplitRendConfig->dof, 0 ) || EQ_32( pSplitRendConfig->poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ) { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; + pSplitEncBufConfig->numSamplesPerChannel = outAudio.config.numSamplesPerChannel; + move16(); } - - /* Input1 metadata and energy */ - IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) ) + /* Pose correction requires 20ms */ + ELSE { - *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; - inEne1_fx = &( hIvasRend->inputsIsm->hOMasa->energy_fx ); - inEne1_e = ( hIvasRend->inputsIsm->hOMasa->energy_e ); + pSplitEncBufConfig->numSamplesPerChannel = shl( div_l( hIvasRend->sampleRateOut, FRAMES_PER_SEC ), 1 ); } - ELSE IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + + /* Note: float was "pSplitEncBufConfig->numSamplesPerChannel *= cldfb_in_flag ? 2 : 1;" */ + IF( NE_16( cldfb_in_flag, 0 ) ) { - *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; - inEne1_fx = &( hIvasRend->inputsMc->hMcMasa->energy_fx ); - inEne1_e = ( hIvasRend->inputsMc->hMcMasa->energy_exp ); + pSplitEncBufConfig->numSamplesPerChannel = shl( pSplitEncBufConfig->numSamplesPerChannel, 1 ); } - ELSE IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) + + num_poses_orig = hIvasRend->splitRendWrapper->multiBinPoseData.num_poses; + move16(); + + ISAR_PRE_REND_GetMultiBinPoseData( pSplitRendConfig, + &hIvasRend->splitRendWrapper->multiBinPoseData, + hIvasRend->headRotData.sr_pose_pred_axis ); + assert( num_poses_orig == hIvasRend->splitRendWrapper->multiBinPoseData.num_poses && "number of poses should not change dynamically" ); + + /* hIvasRend->splitRendEncBuffer contains multi-pose data for BINAURAL_SPLIT_CODED output + outAudio used later for main pose BINAURAL_SPLIT_PCM output */ + IF( ( error = getSamplesInternal( hIvasRend, hIvasRend->splitRendEncBuffer ) ) != IVAS_ERR_OK ) { - *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; - inEne1_fx = &( hIvasRend->inputsSba->hDirAC->energy_fx ); - inEne1_e = ( hIvasRend->inputsSba->hDirAC->energy_exp ); + return error; } - ELSE IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) + + /* copy outputs */ + IF( EQ_16( hIvasRend->splitRendEncBuffer.config.is_cldfb, 1 ) ) { - *hMasaExtOutMeta = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; - inEne1_fx = &( hIvasRend->inputsMasa->hMasaPrerend->energy_fx ); - inEne1_e = ( hIvasRend->inputsMasa->hMasaPrerend->energy_e ); + cldfb_in_flag = 1; + move16(); + copyBufferToCLDFBarray_fx( hIvasRend->splitRendEncBuffer, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural ); } ELSE { - return IVAS_ERR_NOT_SUPPORTED_OPTION; + cldfb_in_flag = 0; + move16(); + copyBufferTo2dArray_fx( hIvasRend->splitRendEncBuffer, tmpBinaural_buff ); } + *outAudio.pq_fact = *hIvasRend->splitRendEncBuffer.pq_fact; - /* Input2 metadata and energy */ - IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) ) - { - inMeta2 = hIvasRend->inputsIsm->hOMasa->hMasaOut; - inEne2_fx = &( hIvasRend->inputsIsm->hOMasa->energy_fx ); - inEne2_e = ( hIvasRend->inputsIsm->hOMasa->energy_e ); - } - ELSE IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + /* Encode split rendering bitstream */ + convertBitsBufferToInternalBitsBuff( *hBits, &bits ); + + ro_md_flag = 0; + move16(); + FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) { - inMeta2 = hIvasRend->inputsMc->hMcMasa->hMasaOut; - inEne2_fx = &( hIvasRend->inputsMc->hMcMasa->energy_fx ); - inEne2_e = ( hIvasRend->inputsMc->hMcMasa->energy_exp ); + IF( NE_32( hIvasRend->inputsIsm[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + ro_md_flag = 1; + + break; + } } - ELSE IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) + + Word16 q1 = 31, q2 = 31, Q_buff; + Word16 num_poses = hIvasRend->splitRendWrapper->multiBinPoseData.num_poses; + + FOR( i = 0; i < num_poses * BINAURAL_CHANNELS; i++ ) { - inMeta2 = hIvasRend->inputsSba->hDirAC->hMasaOut; - inEne2_fx = &( hIvasRend->inputsSba->hDirAC->energy_fx ); - inEne2_e = ( hIvasRend->inputsSba->hDirAC->energy_exp ); + FOR( j = 0; j < CLDFB_NO_COL_MAX; j++ ) + { + q1 = s_min( q1, L_norm_arr( Cldfb_RealBuffer_Binaural[i][j], CLDFB_NO_CHANNELS_MAX ) ); + q2 = s_min( q2, L_norm_arr( Cldfb_ImagBuffer_Binaural[i][j], CLDFB_NO_CHANNELS_MAX ) ); + } } - ELSE IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) + Q_buff = s_min( q1, q2 ); + FOR( i = 0; i < num_poses * BINAURAL_CHANNELS; i++ ) { - inMeta2 = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; - inEne2_fx = &( hIvasRend->inputsMasa->hMasaPrerend->energy_fx ); - inEne2_e = ( hIvasRend->inputsMasa->hMasaPrerend->energy_e ); + FOR( j = 0; j < CLDFB_NO_COL_MAX; j++ ) + { + scale_sig32( Cldfb_RealBuffer_Binaural[i][j], CLDFB_NO_CHANNELS_MAX, Q_buff ); + scale_sig32( Cldfb_ImagBuffer_Binaural[i][j], CLDFB_NO_CHANNELS_MAX, Q_buff ); + } } - ELSE + Q_buff = Q_buff + *outAudio.pq_fact; + + IF( EQ_16( cldfb_in_flag, 0 ) ) { - return IVAS_ERR_NOT_SUPPORTED_OPTION; - } + /*TD input*/ + num_poses = hIvasRend->splitRendWrapper->multiBinPoseData.num_poses; - /* Merge metadata */ - ivas_prerend_merge_masa_metadata_fx( *hMasaExtOutMeta, *hMasaExtOutMeta, inputType1, *inEne1_fx, inEne1_e, inMeta2, inputType2, *inEne2_fx, inEne2_e ); + FOR( i = 0; i < num_poses * BINAURAL_CHANNELS; ++i ) + { + Q_out[0] = s_min( Q_out[0], L_norm_arr( tmpBinaural_buff[i], L_FRAME48k ) ); + } + FOR( i = 0; i < num_poses * BINAURAL_CHANNELS; ++i ) + { + scale_sig32( tmpBinaural_buff[i], L_FRAME48k, Q_out[0] ); + } - IF( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_MASA1 ) ) - { - ( *hMasaExtOutMeta )->descriptiveMeta.numberOfChannels = 0u; - move16(); + Q_out[0] = Q_out[0] + *outAudio.pq_fact; } - ELSE + + max_bands = extract_l( Mpy_32_32( imult3216( hIvasRend->sampleRateOut, BINAURAL_MAXBANDS ), 44740 /* 1/48000 in Q31 */ ) ); + IF( ( error = ISAR_PRE_REND_MultiBinToSplitBinaural( hIvasRend->splitRendWrapper, + hIvasRend->headRotData.headPositions[0], + pSplitRendConfig->splitRendBitRate, + pSplitRendConfig->codec, + pSplitRendConfig->isar_frame_size_ms, + pSplitRendConfig->codec_frame_size_ms, + &bits, + p_Cldfb_RealBuffer_Binaural, + p_Cldfb_ImagBuffer_Binaural, + max_bands, + tmpBinaural, + 1, + cldfb_in_flag, + pcm_out_flag, + ro_md_flag, + Q_buff, + Q_out ) ) != IVAS_ERR_OK ) { - ( *hMasaExtOutMeta )->descriptiveMeta.numberOfChannels = 1u; - move16(); + return error; } - return IVAS_ERR_OK; -} + IF( pcm_out_flag ) + { + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + scale_sig32( tmpBinaural_buff[j], L_FRAME48k, sub( *outAudio.pq_fact, Q_out[j] ) ); // *outAudio.pq_fact + } + } + convertInternalBitsBuffToBitsBuffer( hBits, bits ); -/*---------------------------------------------------------------------* - * IVAS_REND_SetTotalNumberOfObjects( ) - * - * Set the total number of objects to the first object data - *---------------------------------------------------------------------*/ + /* copy over first pose data to outAudio */ + IF( pcm_out_flag ) + { + /* set outAudio to zero - getSamplesInternal only cleared splitRendEncBuffer */ + set_zero_fx( outAudio.data_fx, i_mult( outAudio.config.numChannels, outAudio.config.numSamplesPerChannel ) ); + accumulate2dArrayToBuffer_fx( tmpBinaural_buff, &outAudio ); + } -ivas_error IVAS_REND_SetTotalNumberOfObjects( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ - const UWord16 total_num_objects /* i : total number of objects */ -) -{ - IF( hIvasRend == NULL ) + IF( EQ_16( outAudio.config.is_cldfb, 0 ) ) { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; + Word32 limiter_threshold = L_lshl( IVAS_LIMITER_THRESHOLD, *outAudio.pq_fact ); +#ifndef DISABLE_LIMITER +#ifdef DEBUGGING + hIvasRend->numClipping += +#endif + limitRendererOutput_fx( hIvasRend->hLimiter, outAudio.data_fx, outAudio.config.numSamplesPerChannel, limiter_threshold, *outAudio.pq_fact ); +#endif } - hIvasRend->inputsIsm[0].total_num_objects = total_num_objects; - move16(); + /* update global cominbed orientation start index */ + ivas_combined_orientation_update_start_index( hIvasRend->hCombinedOrientationData, outAudio.config.numSamplesPerChannel ); return IVAS_ERR_OK; } -/*---------------------------------------------------------------------* - * IVAS_REND_SetIsmMetadataDelay( ) +/*-------------------------------------------------------------------* + * IVAS_REND_GetSplitRendBitstreamHeader() * - * Set the Metadata Delay in ms in order to sync with audio delay - *---------------------------------------------------------------------*/ -ivas_error IVAS_REND_SetIsmMetadataDelay( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ - const Word32 sync_md_delay /* i : ISM Metadata Delay in ms to sync with audio delay */ + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetSplitRendBitstreamHeader( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + ISAR_SPLIT_REND_CODEC *pCodec, /* o : pointer to codec setting */ + ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, /* o : pointer to pose correction mode */ + Word16 *pCodec_frame_size_ms, /* o : pointer to codec frame size setting */ + Word16 *pIsar_frame_size_ms, /* o : pointer to ISAR frame size setting */ + Word16 *pLc3plusHighRes /* o : pointer to LC3plus High-Res setting */ ) { - Word16 i; - - IF( hIvasRend == NULL ) + test(); + IF( hIvasRend == NULL || hIvasRend->hRendererConfig == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) - { - hIvasRend->inputsIsm[i].ism_metadata_delay_ms_fx = sync_md_delay; - move32(); - } + + *pCodec = hIvasRend->hRendererConfig->split_rend_config.codec; + *pCodec_frame_size_ms = hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms; + *pIsar_frame_size_ms = hIvasRend->hRendererConfig->split_rend_config.isar_frame_size_ms; + *poseCorrection = hIvasRend->hRendererConfig->split_rend_config.poseCorrectionMode; + *pLc3plusHighRes = hIvasRend->hRendererConfig->split_rend_config.lc3plus_highres; return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* - * getSamplesInternal() + * IVAS_REND_Close() * * *-------------------------------------------------------------------*/ -static ivas_error getSamplesInternal( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ +void IVAS_REND_Close( + IVAS_REND_HANDLE *phIvasRend /* i/o: Pointer to renderer handle */ ) { - ivas_error error; - Word16 numOutChannels; + UWord16 i; + IVAS_REND_HANDLE hIvasRend; + /* Validate function arguments */ test(); - IF( hIvasRend == NULL || outAudio.data_fx == NULL ) + IF( phIvasRend == NULL || *phIvasRend == NULL ) { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; + return; } + hIvasRend = *phIvasRend; - test(); - IF( outAudio.config.numSamplesPerChannel <= 0 || LT_16( MAX_BUFFER_LENGTH_PER_CHANNEL, outAudio.config.numSamplesPerChannel ) ) + IF( hIvasRend->efapOutWrapper.hEfap != NULL ) { - return IVAS_ERR_INVALID_BUFFER_SIZE; + efap_free_data_fx( &hIvasRend->efapOutWrapper.hEfap ); } - test(); - IF( outAudio.config.numChannels <= 0 || LT_16( MAX_OUTPUT_CHANNELS, outAudio.config.numChannels ) ) + /* clear inputs */ + FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) { - return IVAS_ERR_WRONG_NUM_CHANNELS; + clearInputIsm( &hIvasRend->inputsIsm[i] ); } - - test(); - IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) && - NE_32( L_mult0( outAudio.config.numSamplesPerChannel, 1000 ), imult3216( hIvasRend->sampleRateOut, i_mult( hIvasRend->num_subframes, BINAURAL_RENDERING_FRAME_SIZE_MS ) ) ) ) + FOR( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) { - return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Binaural rendering requires specific frame size" ); + clearInputMc( &hIvasRend->inputsMc[i] ); } - - /* Check that there is allowed configuration for MASA format output */ - IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) + FOR( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) { - Word16 i; - Word16 numMasaInputs = 0; - move16(); - Word16 numOtherInputs = 0; - move16(); + clearInputSba( &hIvasRend->inputsSba[i] ); + hIvasRend->hHrtfs.hHrtfFastConv = NULL; + } + FOR( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) + { + clearInputMasa( &hIvasRend->inputsMasa[i] ); + } - FOR( i = 0; i < RENDERER_MAX_MASA_INPUTS; i++ ) - { - // numMasaInputs += hIvasRend->inputsMasa[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; + /* clear Config. Renderer */ + ivas_render_config_close_fx( &( hIvasRend->hRendererConfig ) ); - IF( EQ_32( hIvasRend->inputsMasa[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) - { - numMasaInputs = add( numMasaInputs, 0 ); - } - ELSE - { - numMasaInputs = add( numMasaInputs, 1 ); - } - } + ivas_limiter_close_fx( &hIvasRend->hLimiter ); - FOR( i = 0; i < RENDERER_MAX_MC_INPUTS; i++ ) - { - // numOtherInputs += hIvasRend->inputsMc[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; + /* Split binaural rendering */ + IF( hIvasRend->splitRendWrapper != NULL ) + { + ISAR_PRE_REND_close( hIvasRend->splitRendWrapper, &hIvasRend->splitRendEncBuffer ); + free( hIvasRend->splitRendWrapper ); + hIvasRend->splitRendWrapper = NULL; + } - IF( EQ_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) - { - numOtherInputs = add( numOtherInputs, 0 ); - } - ELSE - { - numOtherInputs = add( numOtherInputs, 1 ); - } - } + closeHeadRotation( hIvasRend ); - FOR( i = 0; i < RENDERER_MAX_SBA_INPUTS; i++ ) - { - // numOtherInputs += hIvasRend->inputsSba[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; + ivas_external_orientation_close_fx( &hIvasRend->hExternalOrientationData ); + ivas_combined_orientation_close_fx( &hIvasRend->hCombinedOrientationData ); - IF( EQ_32( hIvasRend->inputsSba[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) - { - numOtherInputs = add( numOtherInputs, 0 ); - } - ELSE - { - numOtherInputs = add( numOtherInputs, 1 ); - } - } + /* Fastconv HRTF memories */ + ivas_binaural_hrtf_close_fx( &hIvasRend->hHrtfs.hHrtfFastConv ); - /* For ISM, we check only first as all ISMs are handled together via OMASA when merging to MASA. */ - // numOtherInputs += hIvasRend->inputsIsm[0].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; - IF( EQ_32( hIvasRend->inputsIsm[0].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) - { - numOtherInputs = add( numOtherInputs, 0 ); - } - ELSE - { - numOtherInputs = add( numOtherInputs, 1 ); - } + /* Parametric binauralizer HRTF filters */ + ivas_HRTF_binary_close_fx( &( hIvasRend->hHrtfs.hHrtfTD ) ); + ivas_HRTF_CRend_binary_close_fx( &( hIvasRend->hHrtfs.hHrtfCrend ) ); + ivas_HRTF_fastconv_binary_close_fx( &( hIvasRend->hHrtfs.hHrtfFastConv ) ); + ivas_HRTF_parambin_binary_close_fx( &( hIvasRend->hHrtfs.hHrtfParambin ) ); + ivas_HRTF_statistics_close_fx( &( hIvasRend->hHrtfs.hHrtfStatistics ) ); - test(); - IF( numMasaInputs == 0 || numOtherInputs == 0 ) - { - return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; - } - } + free( hIvasRend ); + *phIvasRend = NULL; - IF( NE_32( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ), IVAS_ERR_OK ) ) - { - return error; - } + return; +} - IF( NE_16( numOutChannels, outAudio.config.numChannels ) ) - { - return IVAS_ERR_WRONG_NUM_CHANNELS; - } +/*-------------------------------------------------------------------* + * IVAS_REND_openCldfb() + * + * + *-------------------------------------------------------------------*/ - /* Clear original output buffer */ - set32_fx( outAudio.data_fx, 0, imult1616( outAudio.config.numChannels, outAudio.config.numSamplesPerChannel ) ); +ivas_error IVAS_REND_openCldfb( + IVAS_CLDFB_FILTER_BANK_HANDLE cldfbAna[RENDERER_MAX_INPUT_CHANNELS], + IVAS_CLDFB_FILTER_BANK_HANDLE cldfbSyn[RENDERER_MAX_OUTPUT_CHANNELS], + const Word16 num_in_chs, + const Word16 num_out_chs, + const Word32 output_Fs ) +{ + Word16 n; + ivas_error error; - IF( NE_32( ( error = renderActiveInputsIsm( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) + FOR( n = 0; n < num_in_chs; n++ ) { - return error; + IF( ( error = openCldfb_ivas_fx( &( cldfbAna[n] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) + { + return error; + } } - IF( NE_32( ( error = renderActiveInputsMc( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) + FOR( ; n < RENDERER_MAX_INPUT_CHANNELS; n++ ) { - return error; + cldfbAna[n] = NULL; } - IF( NE_32( ( error = renderActiveInputsSba( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) + + FOR( n = 0; n < num_out_chs; n++ ) { - return error; + IF( ( error = openCldfb_ivas_fx( &( cldfbSyn[n] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) + { + return error; + } } - IF( NE_32( ( error = renderActiveInputsMasa( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) + FOR( ; n < RENDERER_MAX_OUTPUT_CHANNELS; n++ ) { - return error; + cldfbSyn[n] = NULL; } - test(); - test(); + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_closeCldfb() + * + * + *-------------------------------------------------------------------*/ - Word32 limiter_thresold = L_lshl( IVAS_LIMITER_THRESHOLD, *outAudio.pq_fact ); - limitRendererOutput_fx( hIvasRend->hLimiter, outAudio.data_fx, outAudio.config.numSamplesPerChannel, limiter_thresold, *outAudio.pq_fact ); +void IVAS_REND_closeCldfb( + IVAS_CLDFB_FILTER_BANK_HANDLE cldfbAna[RENDERER_MAX_INPUT_CHANNELS], + IVAS_CLDFB_FILTER_BANK_HANDLE cldfbSyn[RENDERER_MAX_OUTPUT_CHANNELS] ) +{ + Word16 n; + + FOR( n = 0; n < RENDERER_MAX_INPUT_CHANNELS; n++ ) + { + IF( cldfbAna[n] != NULL ) + { + deleteCldfb_fx( &( cldfbAna[n] ) ); + cldfbAna[n] = NULL; + } + } - /* update global cominbed orientation start index */ - ivas_combined_orientation_update_start_index( hIvasRend->hCombinedOrientationData, outAudio.config.numSamplesPerChannel ); + FOR( n = 0; n < RENDERER_MAX_OUTPUT_CHANNELS; n++ ) + { + IF( cldfbSyn[n] != NULL ) + { + deleteCldfb_fx( &( cldfbSyn[n] ) ); + cldfbSyn[n] = NULL; + } + } - return IVAS_ERR_OK; + return; } + /*-------------------------------------------------------------------* - * IVAS_REND_GetSamples() + * IVAS_REND_cldfbSynthesis_wrapper() * * *-------------------------------------------------------------------*/ -ivas_error IVAS_REND_GetSamples( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ -) +void IVAS_REND_cldfbAnalysis_ts_wrapper( + const Word32 *timeIn, /* i : time buffer */ + Word32 realBuffer[IVAS_CLDFB_NO_CHANNELS_MAX], /* o : real value buffer */ + Word32 imagBuffer[IVAS_CLDFB_NO_CHANNELS_MAX], /* o : imag value buffer */ + const Word16 samplesToProcess, /* i : samples to process */ + IVAS_CLDFB_FILTER_BANK_HANDLE h_cldfb, /* i : filterbank state */ + Word16 Q_in, + Word16 *Q_out ) { - return getSamplesInternal( hIvasRend, outAudio ); + Word16 Q_cldfb = Q_in; + assert( Q_in == h_cldfb->Q_cldfb_state ); + cldfbAnalysis_ts_fx_fixed_q( timeIn, realBuffer, imagBuffer, samplesToProcess, h_cldfb, &Q_cldfb ); + + *Q_out = sub( Q_in, 5 ); + + return; } /*-------------------------------------------------------------------* - * IVAS_REND_Close() + * IVAS_REND_cldfbSynthesis_wrapper() * * *-------------------------------------------------------------------*/ +void IVAS_REND_cldfbSynthesis_wrapper( + Word32 **realBuffer, /* i : real values */ + Word32 **imagBuffer, /* i : imag values */ + Word32 *timeOut, /* o : output time domain samples */ + const Word16 samplesToProcess, /* i : number of processed samples */ + IVAS_CLDFB_FILTER_BANK_HANDLE h_cldfb, /* i : filter bank state */ + Word16 Q_cldfb, + Word16 *Q_out ) +{ -void IVAS_REND_Close( - IVAS_REND_HANDLE *phIvasRend /* i/o: Pointer to renderer handle */ + Scale_sig32( h_cldfb->cldfb_state_fx, h_cldfb->p_filter_length, sub( sub( Q_cldfb, 1 ), h_cldfb->Q_cldfb_state ) ); + cldfbSynthesis_ivas_fx( realBuffer, imagBuffer, timeOut, samplesToProcess, 0, 0, h_cldfb ); // Q_cldfb - 1 + *Q_out = sub( Q_cldfb, 1 ); + move16(); + h_cldfb->Q_cldfb_state = *Q_out; + move16(); + + return; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_GetHrtfTdHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetHrtfTdHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + IVAS_DEC_HRTF_TD_HANDLE **hHrtfTD /* o : TD rend. HRTF handle */ ) { - UWord16 i; - IVAS_REND_HANDLE hIvasRend; - - /* Validate function arguments */ test(); - IF( phIvasRend == NULL || *phIvasRend == NULL ) + IF( hIvasRend == NULL || hIvasRend->hHrtfs.hHrtfTD == NULL ) { - return; + return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - hIvasRend = *phIvasRend; - IF( hIvasRend->efapOutWrapper.hEfap != NULL ) - { - efap_free_data_fx( &hIvasRend->efapOutWrapper.hEfap ); - } + *hHrtfTD = &hIvasRend->hHrtfs.hHrtfTD; - /* clear inputs */ - FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) - { - clearInputIsm( &hIvasRend->inputsIsm[i] ); - } - FOR( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_GetHrtfCRendHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetHrtfCRendHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + IVAS_DEC_HRTF_CREND_HANDLE **hHrtfCrend /* o : Crend HRTF handle */ +) +{ + test(); + IF( hIvasRend == NULL || hIvasRend->hHrtfs.hHrtfCrend == NULL ) { - clearInputMc( &hIvasRend->inputsMc[i] ); + return IVAS_ERR_WRONG_PARAMS; } - FOR( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) + + *hHrtfCrend = &hIvasRend->hHrtfs.hHrtfCrend; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_GetHrtfFastConvHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetHrtfFastConvHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + IVAS_DEC_HRTF_FASTCONV_HANDLE **hHrtfFastConv /* o : FASTCONV HRTF handle */ +) +{ + test(); + IF( hIvasRend == NULL || hIvasRend->hHrtfs.hHrtfFastConv == NULL ) { - clearInputSba( &hIvasRend->inputsSba[i] ); + return IVAS_ERR_WRONG_PARAMS; } - FOR( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) + + *hHrtfFastConv = &hIvasRend->hHrtfs.hHrtfFastConv; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_GetHrtfParamBinHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetHrtfParamBinHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ +) +{ + test(); + IF( hIvasRend == NULL || hIvasRend->hHrtfs.hHrtfParambin == NULL ) { - clearInputMasa( &hIvasRend->inputsMasa[i] ); + return IVAS_ERR_WRONG_PARAMS; } - /* clear Config. Renderer */ - ivas_render_config_close( &( hIvasRend->hRendererConfig ) ); + *hHrtfParambin = &hIvasRend->hHrtfs.hHrtfParambin; - ivas_limiter_close_fx( &hIvasRend->hLimiter ); + return IVAS_ERR_OK; +} - closeHeadRotation( hIvasRend ); +/*---------------------------------------------------------------------* + * IVAS_REND_GetHrtfStatisticsHandle( ) + * + * + *---------------------------------------------------------------------*/ - ivas_external_orientation_close_fx( &hIvasRend->hExternalOrientationData ); - ivas_combined_orientation_close_fx( &hIvasRend->hCombinedOrientationData ); +ivas_error IVAS_REND_GetHrtfStatisticsHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + IVAS_DEC_HRTF_STATISTICS_HANDLE **hHrtfStatistics /* o : HRTF statistics handle */ +) +{ + test(); + IF( hIvasRend == NULL || hIvasRend->hHrtfs.hHrtfStatistics == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } - free( hIvasRend ); - *phIvasRend = NULL; + *hHrtfStatistics = &hIvasRend->hHrtfs.hHrtfStatistics; - return; + return IVAS_ERR_OK; } static ivas_error ivas_masa_ext_rend_dirac_rend_init( @@ -7576,7 +10161,6 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( set16_fx( hDirACRend->frequency_axis_fx, 0, hSpatParamRendCom->num_freq_bands ); ivas_dirac_dec_get_frequency_axis_fx( hDirACRend->frequency_axis_fx, output_Fs, hSpatParamRendCom->num_freq_bands ); - test(); IF( EQ_16( hDirACRend->panningConf, DIRAC_PANNING_HOA3 ) && EQ_16( nchan_transport, 2 ) ) { @@ -7726,7 +10310,6 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( } /* direct/diffuse responses */ - IF( ( hDirACRend->diffuse_response_function_fx = (Word16 *) malloc( sizeof( Word16 ) * hDirACRend->num_outputs_dir ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); @@ -7868,11 +10451,13 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( static ivas_error ivas_masa_ext_rend_parambin_init( - input_masa *inputMasa /* i/o: MASA external renderer structure */ + input_masa *inputMasa, /* i/o: MASA external renderer structure */ + const RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration data handle */ + HRTFS_STATISTICS_HANDLE hHrtfStatistics /* i : HRTF statistics */ ) { DIRAC_DEC_BIN_HANDLE hDiracDecBin; - HRTFS_PARAMBIN_HANDLE hHrtfParambin; + HRTFS_PARAMBIN_HANDLE *phHrtfParambin; Word16 nBins; Word32 output_Fs; RENDERER_TYPE renderer_type; @@ -7881,6 +10466,9 @@ static ivas_error ivas_masa_ext_rend_parambin_init( Word16 tmpFloat_fx; ivas_error error; Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; + const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pRoomAcoustics; + + Word16 pos_idx, num_poses; Word16 tmp; Word16 tmp_e; Word16 tmp2; @@ -7888,8 +10476,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( error = IVAS_ERR_OK; move32(); - hHrtfParambin = inputMasa->hMasaExtRend->hHrtfParambin; - + phHrtfParambin = inputMasa->hMasaExtRend->hHrtfParambin; /* Set common variables and defaults */ output_Fs = *( inputMasa->base.ctx.pOutSampleRate ); move32(); @@ -7898,151 +10485,179 @@ static ivas_error ivas_masa_ext_rend_parambin_init( renderer_type = inputMasa->hMasaExtRend->renderer_type; move32(); - hDiracDecBin = inputMasa->hMasaExtRend->hDiracDecBin; - - /* Init assumes that no reconfiguration is required in external renderer. Instead, free and rebuild whole rendering. */ - IF( ( hDiracDecBin = (DIRAC_DEC_BIN_HANDLE) malloc( sizeof( DIRAC_DEC_BIN_DATA ) ) ) == NULL ) + num_poses = 1; + move16(); + IF( inputMasa->base.ctx.pSplitRendWrapper != NULL ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC binaural handle " ); + num_poses = inputMasa->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses; + move16(); } - hDiracDecBin->hTdDecorr = NULL; - hDiracDecBin->hReverb = NULL; - hDiracDecBin->h_freq_domain_decorr_ap_params = NULL; - hDiracDecBin->h_freq_domain_decorr_ap_state = NULL; - hDiracDecBin->hDiffuseDist = NULL; /* Not used in external renderer */ - hDiracDecBin->useTdDecorr = 0; /* Always use frequency domain decorrelator in external renderer */ - move16(); - - FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) { - FOR( k = 0; k < BINAURAL_CHANNELS + MAX_NUM_OBJECTS; k++ ) - { - set16_fx( hDiracDecBin->processMtxRe_fx[j][k], 0, nBins ); - set16_fx( hDiracDecBin->processMtxIm_fx[j][k], 0, nBins ); - } + hDiracDecBin = inputMasa->hMasaExtRend->hDiracDecBin[pos_idx]; - FOR( k = 0; k < BINAURAL_CHANNELS; k++ ) + /* Init assumes that no reconfiguration is required in external renderer. Instead, free and rebuild whole rendering. */ + IF( ( hDiracDecBin = (DIRAC_DEC_BIN_HANDLE) malloc( sizeof( DIRAC_DEC_BIN_DATA ) ) ) == NULL ) { - set16_fx( hDiracDecBin->processMtxDecRe_fx[j][k], 0, nBins ); - set16_fx( hDiracDecBin->processMtxDecIm_fx[j][k], 0, nBins ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC binaural handle " ); } - hDiracDecBin->q_processMtx = Q15; - hDiracDecBin->q_processMtxSCCR = Q15; - hDiracDecBin->q_processMtxPrev = Q15; - hDiracDecBin->q_processMtxPrevSCCR = Q15; - hDiracDecBin->q_processMtxDec = Q15; - hDiracDecBin->q_processMtxDecPrev = Q15; - move16(); - move16(); - move16(); - move16(); - move16(); + + hDiracDecBin->hTdDecorr = NULL; + hDiracDecBin->hReverb = NULL; + hDiracDecBin->h_freq_domain_decorr_ap_params = NULL; + hDiracDecBin->h_freq_domain_decorr_ap_state = NULL; + hDiracDecBin->hDiffuseDist = NULL; /* Not used in external renderer */ + hDiracDecBin->useTdDecorr = 0; /* Always use frequency domain decorrelator in external renderer */ move16(); - set_zero_fx( hDiracDecBin->ChEnePrev_fx[j], nBins ); - set_zero_fx( hDiracDecBin->ChEneOutPrev_fx[j], nBins ); - set16_fx( hDiracDecBin->ChEnePrev_e[j], 0, nBins ); - set16_fx( hDiracDecBin->ChEneOutPrev_e[j], 0, nBins ); - } - set_zero_fx( hDiracDecBin->ChCrossRePrev_fx, nBins ); - set_zero_fx( hDiracDecBin->ChCrossImPrev_fx, nBins ); - set_zero_fx( hDiracDecBin->ChCrossReOutPrev_fx, nBins ); - set_zero_fx( hDiracDecBin->ChCrossImOutPrev_fx, nBins ); - set16_fx( hDiracDecBin->ChCrossRePrev_e, 0, nBins ); - set16_fx( hDiracDecBin->ChCrossImPrev_e, 0, nBins ); - set16_fx( hDiracDecBin->ChCrossReOutPrev_e, 0, nBins ); - set16_fx( hDiracDecBin->ChCrossImOutPrev_e, 0, nBins ); - hDiracDecBin->renderStereoOutputInsteadOfBinaural = 0; - move16(); - - FOR( bin = 0; bin < nBins; bin++ ) - { - binCenterFreq_fx = L_mult0( extract_l( L_shr( output_Fs, 1 ) ), div_s( add( shl( bin, 1 ), 1 ), shl( nBins, 1 ) ) ) /*( (float) bin + 0.5f ) / (float) nBins * ( (float) output_Fs / 2.0f )*/; /*Q15*/ - /* These formulas and values are from Christian Borss's publication for binaural diffuse field coherence */ - tmp = BASOP_Util_Divide3232_Scale( binCenterFreq_fx, L_shl( 2700, Q15 ), &tmp_e ); - IF( tmp_e < 0 ) - { - tmp = shl( tmp, tmp_e ); /*q15*/ - tmp_e = 0; + + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + FOR( k = 0; k < BINAURAL_CHANNELS + MAX_NUM_OBJECTS; k++ ) + { + set16_fx( hDiracDecBin->processMtxRe_fx[j][k], 0, nBins ); + set16_fx( hDiracDecBin->processMtxIm_fx[j][k], 0, nBins ); + } + + FOR( k = 0; k < BINAURAL_CHANNELS; k++ ) + { + set16_fx( hDiracDecBin->processMtxDecRe_fx[j][k], 0, nBins ); + set16_fx( hDiracDecBin->processMtxDecIm_fx[j][k], 0, nBins ); + } + hDiracDecBin->q_processMtx = Q15; + hDiracDecBin->q_processMtxSCCR = Q15; + hDiracDecBin->q_processMtxPrev = Q15; + hDiracDecBin->q_processMtxPrevSCCR = Q15; + hDiracDecBin->q_processMtxDec = Q15; + hDiracDecBin->q_processMtxDecPrev = Q15; + move16(); + move16(); + move16(); + move16(); + move16(); move16(); + set_zero_fx( hDiracDecBin->ChEnePrev_fx[j], nBins ); + set_zero_fx( hDiracDecBin->ChEneOutPrev_fx[j], nBins ); + set16_fx( hDiracDecBin->ChEnePrev_e[j], 0, nBins ); + set16_fx( hDiracDecBin->ChEneOutPrev_e[j], 0, nBins ); + } + set_zero_fx( hDiracDecBin->ChCrossRePrev_fx, nBins ); + set_zero_fx( hDiracDecBin->ChCrossImPrev_fx, nBins ); + set_zero_fx( hDiracDecBin->ChCrossReOutPrev_fx, nBins ); + set_zero_fx( hDiracDecBin->ChCrossImOutPrev_fx, nBins ); + set16_fx( hDiracDecBin->ChCrossRePrev_e, 0, nBins ); + set16_fx( hDiracDecBin->ChCrossImPrev_e, 0, nBins ); + set16_fx( hDiracDecBin->ChCrossReOutPrev_e, 0, nBins ); + set16_fx( hDiracDecBin->ChCrossImOutPrev_e, 0, nBins ); + hDiracDecBin->renderStereoOutputInsteadOfBinaural = 0; + move16(); + + FOR( bin = 0; bin < nBins; bin++ ) + { + binCenterFreq_fx = L_mult0( extract_l( L_shr( output_Fs, 1 ) ), div_s( add( shl( bin, 1 ), 1 ), shl( nBins, 1 ) ) ) /*( (float) bin + 0.5f ) / (float) nBins * ( (float) output_Fs / 2.0f )*/; /*Q15*/ + /* These formulas and values are from Christian Borss's publication for binaural diffuse field coherence */ + tmp = BASOP_Util_Divide3232_Scale( binCenterFreq_fx, L_shl( 2700, Q15 ), &tmp_e ); + IF( tmp_e < 0 ) + { + tmp = shl( tmp, tmp_e ); /*q15*/ + tmp_e = 0; + move16(); + } + tmpFloat_fx = s_max( 0, sub( shl_sat( 1, sub( 15, tmp_e ) ), tmp ) ) /*max( 0.0f, 1.0f - binCenterFreq / 2700.0f )*/; /*Q30*/ + tmp2 = extract_l( Mult_32_32( binCenterFreq_fx, 1952258 /*=2^31*180/(550)/360*/ ) % 32767 ); //*binCenterFreq_fx * EVS_PI / 550.0f*/ + hDiracDecBin->diffuseFieldCoherence_fx[bin] = L_shl( L_mult0( divide3232( tmpFloat_fx, Mult_32_16( binCenterFreq_fx, 187 /*2^15*pi/550*/ ) ), getSineWord16R2( tmp2 ) ), tmp_e ); /*tmpFloat * sinf( binCenterFreq * EVS_PI / 550.0f ) / ( binCenterFreq * EVS_PI / 550.0f );*/ + hDiracDecBin->diffuseFieldCoherence_fx[bin] = L_shl( hDiracDecBin->diffuseFieldCoherence_fx[bin], 1 ); /* Q31 */ + move32(); + move32(); } - tmpFloat_fx = s_max( 0, sub( shl_sat( 1, sub( 15, tmp_e ) ), tmp ) ) /*max( 0.0f, 1.0f - binCenterFreq / 2700.0f )*/; /*Q30*/ - tmp2 = extract_l( Mult_32_32( binCenterFreq_fx, 1952258 /*=2^31*180/(550)/360*/ ) % 32767 ); //*binCenterFreq_fx * EVS_PI / 550.0f*/ - hDiracDecBin->diffuseFieldCoherence_fx[bin] = L_shl( L_mult0( divide3232( tmpFloat_fx, Mult_32_16( binCenterFreq_fx, 187 /*2^15*pi/550*/ ) ), getSineWord16R2( tmp2 ) ), tmp_e ); /*tmpFloat * sinf( binCenterFreq * EVS_PI / 550.0f ) / ( binCenterFreq * EVS_PI / 550.0f );*/ - hDiracDecBin->diffuseFieldCoherence_fx[bin] = L_shl( hDiracDecBin->diffuseFieldCoherence_fx[bin], 1 ); /* Q31 */ - move32(); - move32(); - } - /* No SPAR in external renderer so set directive diffuse field coherence tables to zero */ - set_zero_fx( hDiracDecBin->diffuseFieldCoherenceX_fx, BINAURAL_COHERENCE_DIFFERENCE_BINS ); - set_zero_fx( hDiracDecBin->diffuseFieldCoherenceY_fx, BINAURAL_COHERENCE_DIFFERENCE_BINS ); - set_zero_fx( hDiracDecBin->diffuseFieldCoherenceZ_fx, BINAURAL_COHERENCE_DIFFERENCE_BINS ); + /* No SPAR in external renderer so set directive diffuse field coherence tables to zero */ + set_zero_fx( hDiracDecBin->diffuseFieldCoherenceX_fx, BINAURAL_COHERENCE_DIFFERENCE_BINS ); + set_zero_fx( hDiracDecBin->diffuseFieldCoherenceY_fx, BINAURAL_COHERENCE_DIFFERENCE_BINS ); + set_zero_fx( hDiracDecBin->diffuseFieldCoherenceZ_fx, BINAURAL_COHERENCE_DIFFERENCE_BINS ); - IF( EQ_16( renderer_type, RENDERER_BINAURAL_PARAMETRIC ) ) /* Indication of binaural rendering without room effect */ - { - set32_fx( hDiracDecBin->earlyPartEneCorrection_fx, ONE_IN_Q28 /*1.0f Q28*/, CLDFB_NO_CHANNELS_MAX ); - hDiracDecBin->q_earlyPartEneCorrection = Q28; - move16(); - hDiracDecBin->hReverb = NULL; - } - ELSE IF( EQ_16( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) /* Indication of binaural rendering with room effect */ - { - Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); - hDiracDecBin->q_earlyPartEneCorrection = Q28; - move16(); + IF( EQ_16( renderer_type, RENDERER_BINAURAL_PARAMETRIC ) ) /* Indication of binaural rendering without room effect */ + { + set32_fx( hDiracDecBin->earlyPartEneCorrection_fx, ONE_IN_Q28 /*1.0f Q28*/, CLDFB_NO_CHANNELS_MAX ); + hDiracDecBin->q_earlyPartEneCorrection = Q28; + move16(); + hDiracDecBin->hReverb = NULL; + } + ELSE IF( EQ_16( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) /* Indication of binaural rendering with room effect */ + { + IF( EQ_32( *inputMasa->base.ctx.pOutConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) + { + Copy32( ( *phHrtfParambin )->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); + pRoomAcoustics = NULL; + } + ELSE + { + set32_fx( hDiracDecBin->earlyPartEneCorrection_fx, ONE_IN_Q28, CLDFB_NO_CHANNELS_MAX ); + pRoomAcoustics = &( hRendCfg->roomAcoustics ); + } + hDiracDecBin->q_earlyPartEneCorrection = Q28; + move16(); + + IF( hDiracDecBin->hReverb == NULL && pos_idx == 0 ) /* open reverb only for the main direction */ + { + IF( NE_32( ( error = ivas_binaural_reverb_init_fx( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, pRoomAcoustics, output_Fs, ( *phHrtfParambin )->parametricReverberationTimes_fx, ( *phHrtfParambin )->parametricReverberationEneCorrections_fx, hDiracDecBin->earlyPartEneCorrection_fx ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + ELSE IF( EQ_16( renderer_type, RENDERER_STEREO_PARAMETRIC ) ) + { + set32_fx( hDiracDecBin->earlyPartEneCorrection_fx, ONE_IN_Q28 /*1.0f Q28*/, CLDFB_NO_CHANNELS_MAX ); + hDiracDecBin->q_earlyPartEneCorrection = Q28; + move16(); + hDiracDecBin->hReverb = NULL; + hDiracDecBin->renderStereoOutputInsteadOfBinaural = 1; + move16(); + } + ELSE /* Not valid renderer type for this renderer */ + { + assert( false ); + } - IF( hDiracDecBin->hReverb == NULL ) + IF( pos_idx == 0 ) /* open decorrelator only for the main direction */ { - /* Todo Philips: Room acoustics should be passed here once the underlying part works. In this case, it probably should come from render context or somewhere else suitable. */ - IF( NE_32( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, hHrtfParambin ) ), IVAS_ERR_OK ) ) + /* Always open frequency domain decorrelator */ + ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, output_Fs, nBins ); + + IF( NE_32( ( error = ivas_dirac_dec_decorr_open_fx( &( hDiracDecBin->h_freq_domain_decorr_ap_params ), + &( hDiracDecBin->h_freq_domain_decorr_ap_state ), + nBins, + BINAURAL_CHANNELS, + BINAURAL_CHANNELS, + DIRAC_SYNTHESIS_PSD_LS, + frequency_axis_fx, + BINAURAL_CHANNELS, + output_Fs ) ), + IVAS_ERR_OK ) ) { return error; } } - } - ELSE IF( EQ_16( renderer_type, RENDERER_STEREO_PARAMETRIC ) ) - { - set32_fx( hDiracDecBin->earlyPartEneCorrection_fx, ONE_IN_Q28 /*1.0f Q28*/, CLDFB_NO_CHANNELS_MAX ); - hDiracDecBin->q_earlyPartEneCorrection = Q28; - move16(); - hDiracDecBin->hReverb = NULL; - hDiracDecBin->renderStereoOutputInsteadOfBinaural = 1; + + /* External renderer uses constant regularization factor */ + hDiracDecBin->reqularizationFactor_fx = 6554; /* 0.4f in Q14 */ move16(); - } - ELSE /* Not valid renderer type for this renderer */ - { - assert( false ); - } - /* Always open frequency domain decorrelator */ - ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, output_Fs, nBins ); + hDiracDecBin->phHrtfParambin = phHrtfParambin; - IF( NE_32( ( error = ivas_dirac_dec_decorr_open_fx( &( hDiracDecBin->h_freq_domain_decorr_ap_params ), - &( hDiracDecBin->h_freq_domain_decorr_ap_state ), - nBins, - BINAURAL_CHANNELS, - BINAURAL_CHANNELS, - DIRAC_SYNTHESIS_PSD_LS, - frequency_axis_fx, - BINAURAL_CHANNELS, - output_Fs ) ), - IVAS_ERR_OK ) ) - { - return error; + inputMasa->hMasaExtRend->hDiracDecBin[pos_idx] = hDiracDecBin; } - /* External renderer uses constant regularization factor */ - hDiracDecBin->reqularizationFactor_fx = 6554; /* 0.4f in Q14 */ - move16(); - - inputMasa->hMasaExtRend->hDiracDecBin = hDiracDecBin; return error; } + static ivas_error initMasaExtRenderer( input_masa *inputMasa, - const AUDIO_CONFIG outConfig ) + const AUDIO_CONFIG outConfig, + const RENDER_CONFIG_DATA *hRendCfg, + hrtf_handles *hrtfs ) { Word16 i; ivas_error error; @@ -8063,9 +10678,12 @@ static ivas_error initMasaExtRenderer( move32(); hMasaExtRend->hDirACRend = NULL; hMasaExtRend->hSpatParamRendCom = NULL; - hMasaExtRend->hDiracDecBin = NULL; + FOR( i = 0; i < MAX_HEAD_ROT_POSES; i++ ) + { + hMasaExtRend->hDiracDecBin[i] = NULL; + } hMasaExtRend->hReverb = NULL; - hMasaExtRend->hHrtfParambin = NULL; + hMasaExtRend->hHrtfParambin = &hrtfs->hHrtfParambin; hMasaExtRend->hVBAPdata = NULL; hMasaExtRend->hoa_dec_mtx = NULL; @@ -8074,7 +10692,12 @@ static ivas_error initMasaExtRenderer( return error; } - IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &hMasaExtRend->nchan_output ) ), IVAS_ERR_OK ) ) + IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + hMasaExtRend->nchan_output = add( inputMasa->base.ctx.pCustomLsOut->num_spk, inputMasa->base.ctx.pCustomLsOut->num_lfe ); + move16(); + } + ELSE IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &hMasaExtRend->nchan_output ) ), IVAS_ERR_OK ) ) { return error; } @@ -8114,6 +10737,8 @@ static ivas_error initMasaExtRenderer( BREAK; case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: hMasaExtRend->renderer_type = RENDERER_BINAURAL_PARAMETRIC; move32(); BREAK; @@ -8160,13 +10785,13 @@ static ivas_error initMasaExtRenderer( { IF( NE_16( hMasaExtRend->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { - IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &inputMasa->hMasaExtRend->hHrtfParambin ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( inputMasa->hMasaExtRend->hHrtfParambin ) ), IVAS_ERR_OK ) ) { return error; } } - IF( NE_32( ( error = ivas_masa_ext_rend_parambin_init( inputMasa ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_masa_ext_rend_parambin_init( inputMasa, hRendCfg, hrtfs->hHrtfStatistics ) ), IVAS_ERR_OK ) ) { return error; } @@ -8207,6 +10832,7 @@ static ivas_error initMasaExtRenderer( return IVAS_ERR_OK; } + static void freeMasaExtRenderer( MASA_EXT_REND_HANDLE *hMasaExtRendOut ) { @@ -8231,9 +10857,12 @@ static void freeMasaExtRenderer( ivas_spat_hSpatParamRendCom_close_fx( &hMasaExtRend->hSpatParamRendCom ); } - IF( hMasaExtRend->hDiracDecBin != NULL ) + FOR( i = 0; i < MAX_HEAD_ROT_POSES; i++ ) { - ivas_dirac_dec_close_binaural_data( &hMasaExtRend->hDiracDecBin ); + if ( hMasaExtRend->hDiracDecBin[i] != NULL ) + { + ivas_dirac_dec_close_binaural_data_fx( &hMasaExtRend->hDiracDecBin[i] ); + } } IF( hMasaExtRend->hReverb != NULL ) @@ -8243,7 +10872,7 @@ static void freeMasaExtRenderer( IF( hMasaExtRend->hHrtfParambin != NULL ) { - ivas_HRTF_parambin_binary_close_fx( &hMasaExtRend->hHrtfParambin ); + ivas_HRTF_parambin_binary_close_fx( hMasaExtRend->hHrtfParambin ); } IF( hMasaExtRend->hVBAPdata != NULL ) @@ -8260,7 +10889,7 @@ static void freeMasaExtRenderer( { IF( hMasaExtRend->cldfbAnaRend[i] != NULL ) { - deleteCldfb_ivas_fx( &hMasaExtRend->cldfbAnaRend[i] ); + deleteCldfb_fx( &hMasaExtRend->cldfbAnaRend[i] ); } } @@ -8268,7 +10897,7 @@ static void freeMasaExtRenderer( { IF( hMasaExtRend->cldfbSynRend[i] != NULL ) { - deleteCldfb_ivas_fx( &hMasaExtRend->cldfbSynRend[i] ); + deleteCldfb_fx( &hMasaExtRend->cldfbSynRend[i] ); } } @@ -8306,7 +10935,9 @@ static void intermidiate_ext_dirac_render( IF( to_fix ) { - DirAC_mem.reference_power_smooth_q = DirAC_mem.reference_power_q = Q31; + DirAC_mem.reference_power_smooth_q[0] = DirAC_mem.reference_power_q[0] = Q31; + DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1] = Q31; + move16(); move16(); move16(); FOR( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) @@ -8436,22 +11067,62 @@ static void intermidiate_ext_dirac_render( IF( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx ) { - tmp = L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, imult1616( hDirACRend->num_protos_dir, hSpatParamRendCom->num_freq_bands ) ); - scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len, tmp ); /* Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q + tmp) */ - hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q = add( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, tmp ); + tmp = 0; + move16(); + FOR( slot_idx = 0; slot_idx < hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len; slot_idx = add( slot_idx, hSpatParamRendCom->num_freq_bands ) ) + { + tmp = s_min( tmp, L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + slot_idx, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ); + } + FOR( slot_idx = 0; slot_idx < hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len; slot_idx = add( slot_idx, hSpatParamRendCom->num_freq_bands ) ) + { + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + slot_idx, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), tmp ); /* Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q + tmp) */ + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0] = add( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0], tmp ); + move16(); + tmp = 0; + move16(); + FOR( slot_idx = 0; slot_idx < hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len; slot_idx = add( slot_idx, hSpatParamRendCom->num_freq_bands ) ) + { + tmp = s_min( tmp, L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + slot_idx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ) ); + } + FOR( slot_idx = 0; slot_idx < hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len; slot_idx = add( slot_idx, hSpatParamRendCom->num_freq_bands ) ) + { + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + slot_idx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), tmp ); /* Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q + tmp) */ + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] = add( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], tmp ); + move16(); + tmp = 0; + FOR( slot_idx = 0; slot_idx < hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len; slot_idx = add( slot_idx, hSpatParamRendCom->num_freq_bands ) ) + { + tmp = s_min( tmp, L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx, s_min( CLDFB_NO_CHANNELS_HALF, hSpatParamRendCom->num_freq_bands ) ) ); + } + FOR( slot_idx = 0; slot_idx < hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len; slot_idx = add( slot_idx, hSpatParamRendCom->num_freq_bands ) ) + { + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx, s_min( CLDFB_NO_CHANNELS_HALF, hSpatParamRendCom->num_freq_bands ), tmp ); /* Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q + tmp) */ + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] = add( tmp, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] ); move16(); - tmp = L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx, imult1616( hDirACRend->num_protos_dir, hSpatParamRendCom->num_freq_bands ) ); - scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_len, tmp ); /* Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q + tmp) */ - hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q = add( tmp, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ); + FOR( slot_idx = 0; slot_idx < hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len; slot_idx = add( slot_idx, hSpatParamRendCom->num_freq_bands ) ) + { + tmp = s_min( tmp, L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ) ); + } + FOR( slot_idx = 0; slot_idx < hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len; slot_idx = add( slot_idx, hSpatParamRendCom->num_freq_bands ) ) + { + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), tmp ); /* Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q + tmp) */ + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] = add( tmp, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ); move16(); } + IF( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx != NULL ) + { - tmp = L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_len ); - scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_len, tmp ); /* Q(hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q + tmp) */ - hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q = add( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q, tmp ); - move16(); + tmp = L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_len ); + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_len, tmp ); /* Q(hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q + tmp) */ + hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q = add( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q, tmp ); + move16(); + } - IF( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_fx != 0 ) + IF( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_fx != NULL ) { tmp = L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_len ); scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_len, tmp ); /* Q(hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_q + tmp) */ @@ -8479,9 +11150,11 @@ static void intermidiate_ext_dirac_render( move16(); } } + + return; } -#ifdef FIX_DISCLAIMER + static ivas_error printConfigInfo_rend( IVAS_REND_HANDLE hIvasRend /* i : IVAS renderer handle */ ) @@ -8511,13 +11184,17 @@ static ivas_error printConfigInfo_rend( fprintf( stdout, "Head-tracking: ON\n" ); } + test(); + test(); + test(); + test(); IF( EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - fprintf( stdout, "Render framesize: %dms\n", mult( hIvasRend->num_subframes, 5 ) ); + fprintf( stdout, "Render framesize: %dms\n", i_mult( hIvasRend->num_subframes, 5 ) ); } return IVAS_ERR_OK; @@ -8553,7 +11230,7 @@ ivas_error IVAS_REND_PrintConfig( IVAS_REND_HANDLE hIvasRend /* i : IVAS renderer handle */ ) { - if ( hIvasRend == NULL ) + IF( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } @@ -8574,4 +11251,3 @@ void IVAS_REND_PrintDisclaimer( void ) return; } -#endif diff --git a/lib_util/aeid_file_reader.c b/lib_util/aeid_file_reader.c new file mode 100644 index 0000000000000000000000000000000000000000..6f877452e5c1021124bfeb16e88b1f91dc84d562 --- /dev/null +++ b/lib_util/aeid_file_reader.c @@ -0,0 +1,185 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "aeid_file_reader.h" +#include "ivas_error_utils.h" +#include +#include + +struct aeidFileReader +{ + FILE *aeidFile; + char *file_path; +}; + + +/*-----------------------------------------------------------------------* + * aeidFileReader_open() + * + * Allocate and initialize rotation handle + *-----------------------------------------------------------------------*/ + +ivas_error aeidFileReader_open( + char *aeidFilePath, /* i : aeid file name */ + aeidFileReader **aeidReader /* o : aeidFileReader handle */ +) +{ + aeidFileReader *self; + FILE *aeidFile; + + /* Open trajectory file */ + if ( strlen( aeidFilePath ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + aeidFile = fopen( aeidFilePath, "r" ); + + if ( !aeidFile ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + self = calloc( 1, sizeof( aeidFileReader ) ); + self->aeidFile = aeidFile; + self->file_path = calloc( strlen( aeidFilePath ) + 1, sizeof( char ) ); + strcpy( self->file_path, aeidFilePath ); + + *aeidReader = self; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * aeidFileReading() + * + * Read values from the aeid file + *-----------------------------------------------------------------------*/ + +ivas_error aeidFileReading( + aeidFileReader *aeidReader, /* i : aeidFileReader handle */ + uint16_t *count, /* o : number of sequences */ + uint16_t **pID, /* o : acoustic environment ID data */ + uint16_t **pValidity /* o : duration data */ +) +{ + int32_t id; + int32_t duration; + uint16_t k = 0; + + while ( !feof( aeidReader->aeidFile ) ) + { + if ( fscanf( aeidReader->aeidFile, "%d %d", &id, &duration ) == 2 ) + { + k++; + } + else + { + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_PARSE, "Error while parsing acoustic environment sequence" ); + } + } + + if ( k == 0 ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_PARSE, "No acoustic environment" ); + } + + if ( NULL == ( *pID = malloc( sizeof( uint16_t ) * k ) ) || + NULL == ( *pValidity = malloc( sizeof( uint16_t ) * k ) ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Unable to allocate memory for acoustic environment sequence" ); + } + + *count = k; + + k = 0; + + fseek( aeidReader->aeidFile, 0, SEEK_SET ); + + while ( !feof( aeidReader->aeidFile ) ) + { + if ( fscanf( aeidReader->aeidFile, "%d %d", &id, &duration ) == 2 ) + { + ( *pID )[k] = (uint16_t) id; + ( *pValidity )[k] = (uint16_t) duration; + k++; + } + else + { + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_PARSE, "Error while parsing acoustic environment sequence" ); + } + } + + return IVAS_ERR_OK; +} + +/*-----------------------------------------------------------------------* + * aeidFileReader_close() + * + * Deallocates memory for the aeid handle + *-----------------------------------------------------------------------*/ + +void aeidFileReader_close( + aeidFileReader **aeidReader /* i/o: aeidFileReader handle */ +) +{ + if ( aeidReader == NULL || *aeidReader == NULL ) + { + return; + } + + fclose( ( *aeidReader )->aeidFile ); + free( ( *aeidReader )->file_path ); + free( *aeidReader ); + *aeidReader = NULL; + + return; +} + +/*-----------------------------------------------------------------------* + * aeidFileReader_getFilePath() + * + * + *-----------------------------------------------------------------------*/ + +const char *aeidFileReader_getFilePath( + aeidFileReader *aeidReader /* i : aeidFileReader handle */ +) +{ + if ( aeidReader == NULL ) + { + return NULL; + } + + return aeidReader->file_path; +} diff --git a/lib_util/aeid_file_reader.h b/lib_util/aeid_file_reader.h new file mode 100644 index 0000000000000000000000000000000000000000..2eb38b90fec9a6ff672dc55077de548722fd1046 --- /dev/null +++ b/lib_util/aeid_file_reader.h @@ -0,0 +1,88 @@ +#pragma once +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_AEID_FILE_READER_H +#define IVAS_AEID_FILE_READER_H + +#include "common_api_types.h" + + +struct aeidFileReader; +typedef struct aeidFileReader aeidFileReader; + +/*-----------------------------------------------------------------------* + * aeidFileReader_open() + * + * Allocate and initialize rotation handle + *-----------------------------------------------------------------------*/ + +ivas_error aeidFileReader_open( + char *aeidFilePath, /* i : aeid file name */ + struct aeidFileReader **aeidReader /* o : aeidFileReader handle */ +); + +/*-----------------------------------------------------------------------* + * aeidFileReading() + * + * Read values from the aeid file + *-----------------------------------------------------------------------*/ + +ivas_error aeidFileReading( + aeidFileReader *aeidReader, /* i : aeidFileReader handle */ + uint16_t *count, /* o : number of sequences */ + uint16_t **pID, /* o : acoustic environment ID data */ + uint16_t **pValidity /* o : duration data */ +); + +/*-----------------------------------------------------------------------* + * aeidFileReader_close() + * + * Deallocates memory for the aeid handle + *-----------------------------------------------------------------------*/ + +void aeidFileReader_close( + aeidFileReader **aeidReader /* i/o: aeidFileReader handle */ +); + +/*-----------------------------------------------------------------------* + * aeidFileReader_getFilePath() + * + * + *-----------------------------------------------------------------------*/ + +const char *aeidFileReader_getFilePath( + aeidFileReader *aeidReader /* i : aeidFileReader handle */ +); + + +#endif /* IVAS_AEID_FILE_READER_H */ diff --git a/lib_util/ambi_convert.c b/lib_util/ambi_convert.c new file mode 100644 index 0000000000000000000000000000000000000000..6b506e7edaeaaa4b559701d065c904e2e48d42a4 --- /dev/null +++ b/lib_util/ambi_convert.c @@ -0,0 +1,518 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "stl.h" +#include "ambi_convert.h" + + +#define ONE_1_Q29 536870912l /* 1.0f */ +#define ONE_OVER_2_Q29 268435456l /* 1.0f/2.0f */ + +#define SQRT_2_Q29 759250112l /* sqrtf(2.0f) */ +#define SQRT_3_Q29 929887680l /* sqrtf(3.0f) */ +#define SQRT_5_Q29 1200479872l /* sqrtf(5.0f) */ +#define SQRT_7_Q29 1420426880l /* sqrtf(7.0f) */ + +#define INV_SQRT_2_Q29 379625024l /* 1.0f/sqrtf(2.0f) */ +#define INV_SQRT_3_Q29 309962528l /* 1.0f/sqrtf(3.0f) */ +#define INV_SQRT_5_Q29 240095920l /* 1.0f/sqrtf(5.0f) */ +#define INV_SQRT_7_Q29 202918096l /* 1.0f/sqrtf(7.0f) */ + +#define TWO_OVER_SQRT_3_Q29 619925120l /* 2.0f/sqrtf(3.0f) */ +#define THREE_OVER_SQRT_5_Q29 720287936l /* 3.0f/sqrtf(5.0f) */ +#define SQRT_8_OVER_5_Q29 679093952l /* sqrtf(8.0f/5.0f) */ +#define SQRT_45_OVER_32_Q29 636650560l /* sqrtf(45.0f/32.0f) */ + +#define INV_TWO_OVER_SQRT_3_Q29 464943840l /* 1.0f/TWO_OVER_SQRT_3_Q29 */ +#define INV_THREE_OVER_SQRT_5_Q29 400159968l /* 1.0f/THREE_OVER_SQRT_5_Q29 */ +#define INV_SQRT_8_OVER_5_Q29 424433728l /* 1.0f/INV_SQRT_8_OVER_5_Q29 */ +#define INV_SQRT_45_OVER_32_Q29 452729280l /* 1.0f/SQRT_45_OVER_32_Q29 */ + + +/* -------------------------------- + normalization conversion tables + -------------------------------- */ + +static const Word32 SN3D_N3D[AMBI_MAX_CHANNELS] = { ONE_1_Q29, + SQRT_3_Q29, SQRT_3_Q29, SQRT_3_Q29, + SQRT_5_Q29, SQRT_5_Q29, SQRT_5_Q29, SQRT_5_Q29, SQRT_5_Q29, + SQRT_7_Q29, SQRT_7_Q29, SQRT_7_Q29, SQRT_7_Q29, SQRT_7_Q29, SQRT_7_Q29, SQRT_7_Q29 }; + +static const Word32 N3D_SN3D[AMBI_MAX_CHANNELS] = { ONE_1_Q29, + INV_SQRT_3_Q29, INV_SQRT_3_Q29, INV_SQRT_3_Q29, + INV_SQRT_5_Q29, INV_SQRT_5_Q29, INV_SQRT_5_Q29, INV_SQRT_5_Q29, INV_SQRT_5_Q29, + INV_SQRT_7_Q29, INV_SQRT_7_Q29, INV_SQRT_7_Q29, INV_SQRT_7_Q29, INV_SQRT_7_Q29, INV_SQRT_7_Q29, INV_SQRT_7_Q29 }; + + +static const Word32 SN3D_MAXN[AMBI_MAX_CHANNELS] = { ONE_1_Q29, + ONE_1_Q29, ONE_1_Q29, ONE_1_Q29, + TWO_OVER_SQRT_3_Q29, TWO_OVER_SQRT_3_Q29, ONE_1_Q29, TWO_OVER_SQRT_3_Q29, TWO_OVER_SQRT_3_Q29, + SQRT_8_OVER_5_Q29, THREE_OVER_SQRT_5_Q29, SQRT_45_OVER_32_Q29, ONE_1_Q29, SQRT_45_OVER_32_Q29, THREE_OVER_SQRT_5_Q29, SQRT_8_OVER_5_Q29 }; + +static const Word32 MAXN_SN3D[AMBI_MAX_CHANNELS] = { ONE_1_Q29, + ONE_1_Q29, ONE_1_Q29, ONE_1_Q29, + INV_TWO_OVER_SQRT_3_Q29, INV_TWO_OVER_SQRT_3_Q29, ONE_1_Q29, INV_TWO_OVER_SQRT_3_Q29, INV_TWO_OVER_SQRT_3_Q29, + INV_SQRT_8_OVER_5_Q29, INV_THREE_OVER_SQRT_5_Q29, INV_SQRT_45_OVER_32_Q29, ONE_1_Q29, INV_SQRT_45_OVER_32_Q29, INV_THREE_OVER_SQRT_5_Q29, INV_SQRT_8_OVER_5_Q29 }; + +static const Word32 SN3D_FM[AMBI_MAX_CHANNELS] = { INV_SQRT_2_Q29, + ONE_1_Q29, ONE_1_Q29, ONE_1_Q29, + TWO_OVER_SQRT_3_Q29, TWO_OVER_SQRT_3_Q29, ONE_1_Q29, TWO_OVER_SQRT_3_Q29, TWO_OVER_SQRT_3_Q29, + SQRT_8_OVER_5_Q29, THREE_OVER_SQRT_5_Q29, SQRT_45_OVER_32_Q29, ONE_1_Q29, SQRT_45_OVER_32_Q29, THREE_OVER_SQRT_5_Q29, SQRT_8_OVER_5_Q29 }; + +static const Word32 FM_SN3D[AMBI_MAX_CHANNELS] = { SQRT_2_Q29, + ONE_1_Q29, ONE_1_Q29, ONE_1_Q29, + INV_TWO_OVER_SQRT_3_Q29, INV_TWO_OVER_SQRT_3_Q29, ONE_1_Q29, INV_TWO_OVER_SQRT_3_Q29, INV_TWO_OVER_SQRT_3_Q29, + INV_SQRT_8_OVER_5_Q29, INV_THREE_OVER_SQRT_5_Q29, INV_SQRT_45_OVER_32_Q29, ONE_1_Q29, INV_SQRT_45_OVER_32_Q29, INV_THREE_OVER_SQRT_5_Q29, INV_SQRT_8_OVER_5_Q29 }; + +/* ---------------------------- + channel re-ordering tables + ---------------------------- */ + +static const Word16 REORDER_FM_ACN[AMBI_MAX_CHANNELS] = { 0, + 2, 3, 1, + 8, 6, 4, 5, 7, + 15, 13, 11, 9, 10, 12, 14 }; + +static const Word16 REORDER_SID_ACN[AMBI_MAX_CHANNELS] = { 0, + 2, 3, 1, + 5, 7, 8, 6, 4, + 10, 12, 14, 15, 13, 11, 9 }; + +static const Word16 REORDER_ACN_FM[AMBI_MAX_CHANNELS] = { 0, + 3, 1, 2, + 6, 7, 5, 8, 4, + 12, 13, 11, 14, 10, 15, 9 }; + +static const Word16 REORDER_ACN_SID[AMBI_MAX_CHANNELS] = { 0, + 3, 1, 2, + 8, 4, 7, 5, 6, + 15, 9, 14, 10, 13, 11, 12 }; + +/* ---------------------------------- + API functions for the conversion + ---------------------------------- */ + +/*-------------------------------------------------------------------------* +* convert_ambi_format() +* +* Convert signal between ACN-SN3D and other common ambisonics conventions +--------------------------------------------------------------------------*/ + +AMBI_CONVERT_ERROR convert_ambi_format( + Word16 *in[], /* i: input ambisonics channels, Q0 */ + Word16 *out[], /* o: output ambisonics channels, Q0 */ + const Word16 order, /* i: ambisonics order */ + const AMBI_FMT in_format, /* i: input ambisonics format */ + const AMBI_FMT out_format, /* i: output ambisonics format */ + const int16_t frame_length /* i: input/output frame length */ +) +{ + + Word16 tmp[AMBI_MAX_CHANNELS * AMBI_MAX_FRAME_LENGTH]; + Word16 *p_tmp[AMBI_MAX_CHANNELS]; + AMBI_CONVERT_ERROR err_normalize = AMBI_CONVERT_OK; + AMBI_CONVERT_ERROR err_reorder = AMBI_CONVERT_OK; + + AMBI_CHANNEL_ORDER ch_ord_in = AMBI_CHANNEL_ORDER_ACN; + AMBI_CHANNEL_ORDER ch_ord_out = AMBI_CHANNEL_ORDER_ACN; + + AMBI_CHANNEL_NORM ch_norm_in = AMBI_NORM_SN3D; + AMBI_CHANNEL_NORM ch_norm_out = AMBI_NORM_SN3D; + + Word16 i, j; + + assert( order <= 3 ); + + if ( frame_length > AMBI_MAX_FRAME_LENGTH ) + { + return AMBI_CONVERT_UNSUPPORTED_FRAME_LENGTH; + } + + if ( in_format != AMBI_FMT_ACN_SN3D && out_format != AMBI_FMT_ACN_SN3D ) + { + assert( 0 && "Conversion only supported to and from ACN-SN3D" ); + } + i = 0; + move16(); + FOR( j = 0; j < AMBI_MAX_CHANNELS; j++ ) + { + p_tmp[j] = &tmp[i]; + move32(); + i = add( i, frame_length ); + } + + SWITCH( in_format ) + { + case AMBI_FMT_ACN_SN3D: + ch_ord_in = AMBI_CHANNEL_ORDER_ACN; + ch_norm_in = AMBI_NORM_SN3D; + move16(); + move16(); + break; + case AMBI_FMT_ACN_N3D: + ch_ord_in = AMBI_CHANNEL_ORDER_ACN; + ch_norm_in = AMBI_NORM_N3D; + move16(); + move16(); + break; + case AMBI_FMT_FM_MAXN: + ch_ord_in = AMBI_CHANNEL_ORDER_FM; + ch_norm_in = AMBI_NORM_MAXN; + move16(); + move16(); + break; + case AMBI_FMT_FM_FM: + ch_ord_in = AMBI_CHANNEL_ORDER_FM; + ch_norm_in = AMBI_NORM_FM; + move16(); + move16(); + break; + case AMBI_FMT_SID_SN3D: + ch_ord_in = AMBI_CHANNEL_ORDER_SID; + ch_norm_in = AMBI_NORM_SN3D; + move16(); + move16(); + break; + case AMBI_FMT_SID_N3D: + ch_ord_in = AMBI_CHANNEL_ORDER_SID; + ch_norm_in = AMBI_NORM_N3D; + move16(); + move16(); + break; + default: + return AMBI_CONVERT_UNSUPPORTED_CONVERSION; + } + + SWITCH( out_format ) + { + case AMBI_FMT_ACN_SN3D: + ch_ord_out = AMBI_CHANNEL_ORDER_ACN; + ch_norm_out = AMBI_NORM_SN3D; + move16(); + move16(); + break; + case AMBI_FMT_ACN_N3D: + ch_ord_out = AMBI_CHANNEL_ORDER_ACN; + ch_norm_out = AMBI_NORM_N3D; + move16(); + move16(); + break; + case AMBI_FMT_FM_MAXN: + ch_ord_out = AMBI_CHANNEL_ORDER_FM; + ch_norm_out = AMBI_NORM_MAXN; + move16(); + move16(); + break; + case AMBI_FMT_FM_FM: + ch_ord_out = AMBI_CHANNEL_ORDER_FM; + ch_norm_out = AMBI_NORM_FM; + move16(); + move16(); + break; + case AMBI_FMT_SID_SN3D: + ch_ord_out = AMBI_CHANNEL_ORDER_SID; + ch_norm_out = AMBI_NORM_SN3D; + move16(); + move16(); + break; + case AMBI_FMT_SID_N3D: + ch_ord_out = AMBI_CHANNEL_ORDER_SID; + ch_norm_out = AMBI_NORM_N3D; + move16(); + move16(); + break; + default: + return AMBI_CONVERT_UNSUPPORTED_CONVERSION; + } + + IF( in_format == AMBI_FMT_ACN_SN3D && ch_norm_in != ch_norm_out ) + { + IF( ch_ord_in != ch_ord_out ) + { + err_normalize = renormalize_channels( in, p_tmp, order, ch_norm_in, ch_norm_out, frame_length ); + IF( ( err_normalize != AMBI_CONVERT_OK ) && ( err_normalize != AMBI_CONVERT_CLIPPING_DETECTED ) ) + { + return err_normalize; + } + IF( ( err_reorder = reorder_channels( p_tmp, out, order, ch_ord_in, ch_ord_out, frame_length ) ) != AMBI_CONVERT_OK ) + { + return err_reorder; + } + } + ELSE + { + err_normalize = renormalize_channels( in, out, order, ch_norm_in, ch_norm_out, frame_length ); + IF( ( err_normalize != AMBI_CONVERT_OK ) && ( err_normalize != AMBI_CONVERT_CLIPPING_DETECTED ) ) + { + return err_normalize; + } + } + } + ELSE IF( in_format == AMBI_FMT_ACN_SN3D && ch_ord_in != ch_ord_out ) + { + IF( ( err_reorder = reorder_channels( in, out, order, ch_ord_in, ch_ord_out, frame_length ) ) != AMBI_CONVERT_OK ) + { + return err_reorder; + } + } + ELSE IF( out_format == AMBI_FMT_ACN_SN3D && ch_norm_in != ch_norm_out ) + { + IF( ch_ord_in != ch_ord_out ) + { + IF( ( err_reorder = reorder_channels( in, p_tmp, order, ch_ord_in, ch_ord_out, frame_length ) ) != AMBI_CONVERT_OK ) + { + return err_reorder; + } + err_normalize = renormalize_channels( p_tmp, out, order, ch_norm_in, ch_norm_out, frame_length ); + IF( ( err_normalize != AMBI_CONVERT_OK ) && ( err_normalize != AMBI_CONVERT_CLIPPING_DETECTED ) ) + { + return err_normalize; + } + } + ELSE + { + IF( ( err_normalize = renormalize_channels( in, out, order, ch_norm_in, ch_norm_out, frame_length ) ) != AMBI_CONVERT_OK ) + { + return err_normalize; + } + } + } + ELSE IF( out_format == AMBI_FMT_ACN_SN3D && ch_ord_in != ch_ord_out ) + { + IF( ( err_reorder = reorder_channels( in, out, order, ch_ord_in, ch_ord_out, frame_length ) ) != AMBI_CONVERT_OK ) + { + return err_reorder; + } + } + ELSE IF( out_format == AMBI_FMT_ACN_SN3D && in_format == AMBI_FMT_ACN_SN3D ) + { + Word16 i_chan = 0; + Word16 n_chan = i_mult2( add( order, 1 ), add( order, 1 ) ); + + FOR( i_chan = 0; i_chan < n_chan; i_chan++ ) + { + Word16 i_s = 0; + move16(); + FOR( i_s = 0; i_s < frame_length; i_s++ ) + { + out[i_chan][i_s] = in[i_chan][i_s]; + move16(); + } + } + } + ELSE + { + assert( 0 && "This should never happen!" ); + } + + return err_normalize; +} + +/*-------------------------------------------------------------------------* +* renormalize_channels() +* +* Rescale audio channels according to the selected ambisonics convention +--------------------------------------------------------------------------*/ + +AMBI_CONVERT_ERROR renormalize_channels( + Word16 *in[], /* i: input ambisonics channels, Q0 */ + Word16 *out[], /* o: output ambisonics channels, Q0 */ + const Word16 order, /* i: ambisonics order */ + const AMBI_CHANNEL_NORM in_format, /* i: input ambisonics format */ + const AMBI_CHANNEL_NORM out_format, /* i: output ambisonics format */ + const int16_t frame_length /* i: input/output frame length */ +) +{ + Word16 n_chan = i_mult2( add( order, 1 ), add( order, 1 ) ); + Word16 i_chan, i; + const Word32 *conversion_table = 0; + Word32 minval = 0; + Word32 maxval = 0; + move32(); + move32(); + move32(); + + + /* conversion factors are applied on the channels assuming that they are still/already in ACN order */ + IF( in_format == AMBI_NORM_SN3D ) + { + IF( out_format == AMBI_NORM_N3D ) + { + conversion_table = SN3D_N3D; + move32(); + } + ELSE IF( out_format == AMBI_NORM_MAXN ) + { + conversion_table = SN3D_MAXN; + move32(); + } + ELSE IF( out_format == AMBI_NORM_FM ) + { + conversion_table = SN3D_FM; + move32(); + } + ELSE + { + return AMBI_CONVERT_UNSUPPORTED_CONVERSION; + } + } + ELSE IF( out_format == AMBI_NORM_SN3D ) + { + IF( in_format == AMBI_NORM_N3D ) + { + conversion_table = N3D_SN3D; + move32(); + } + ELSE IF( in_format == AMBI_NORM_MAXN ) + { + conversion_table = MAXN_SN3D; + move32(); + } + ELSE IF( in_format == AMBI_NORM_FM ) + { + conversion_table = FM_SN3D; + move32(); + } + ELSE + { + return AMBI_CONVERT_UNSUPPORTED_CONVERSION; + } + } + ELSE + { + return AMBI_CONVERT_UNSUPPORTED_CONVERSION; + } + + + FOR( i_chan = 0; i_chan < n_chan; i_chan++ ) + { + Word32 conversion_factor = conversion_table[i_chan]; + Word32 outval; + move32(); + FOR( i = 0; i < frame_length; i++ ) + { + Word64 tmp; + tmp = W_mult0_32_32( (Word32) in[i_chan][i], conversion_factor ); + /* tmp = W_add( tmp, ONE_OVER_2_Q29); */ /* rounding up */ + outval = W_extract_l( W_shr( tmp, Q29 ) ); + minval = L_min( minval, outval ); + maxval = L_min( maxval, outval ); + outval = L_min( MAX16B, L_max( MIN16B, outval ) ); /* saturation */ + out[i_chan][i] = extract_l( outval ); + } + } + IF( ( minval < MIN16B ) || ( maxval > MAX16B ) ) + { + return AMBI_CONVERT_CLIPPING_DETECTED; + } + return AMBI_CONVERT_OK; +} + +/*-------------------------------------------------------------------------* +* reorder_channels() +* +* Reorder channels according to the selected ambisonics convention +--------------------------------------------------------------------------*/ + +AMBI_CONVERT_ERROR reorder_channels( + Word16 *in[], /* i: input ambisonics channels, Q0 */ + Word16 *out[], /* o: output ambisonics channels, Q0 */ + const Word16 order, /* i: ambisonics order */ + const AMBI_CHANNEL_ORDER in_format, /* i: input ambisonics format */ + const AMBI_CHANNEL_ORDER out_format, /* i: output ambisonics format */ + const int16_t frame_length /* i: input/output frame length */ +) +{ + Word16 n_chan = i_mult2( add( order, 1 ), add( order, 1 ) ); + Word16 i_chan, i; + Word16 tmp[AMBI_MAX_CHANNELS]; + const Word16 *idx_table = 0; + + IF( in_format == AMBI_CHANNEL_ORDER_ACN ) + { + IF( out_format == AMBI_CHANNEL_ORDER_FM ) + { + idx_table = REORDER_ACN_FM; + move16(); + } + ELSE IF( out_format == AMBI_CHANNEL_ORDER_SID ) + { + idx_table = REORDER_ACN_SID; + move16(); + } + ELSE + { + return AMBI_CONVERT_UNSUPPORTED_CONVERSION; + } + } + ELSE IF( out_format == AMBI_CHANNEL_ORDER_ACN ) + { + IF( in_format == AMBI_CHANNEL_ORDER_FM ) + { + idx_table = REORDER_FM_ACN; + move16(); + } + ELSE IF( in_format == AMBI_CHANNEL_ORDER_SID ) + { + idx_table = REORDER_SID_ACN; + move16(); + } + ELSE + { + return AMBI_CONVERT_UNSUPPORTED_CONVERSION; + } + } + ELSE + { + return AMBI_CONVERT_UNSUPPORTED_CONVERSION; + } + + FOR( i = 0; i < frame_length; i++ ) + { + FOR( i_chan = 0; i_chan < n_chan; i_chan++ ) + { + Word16 idx = idx_table[i_chan]; + move16(); + tmp[i_chan] = in[idx][i]; + move16(); + } + FOR( i_chan = 0; i_chan < n_chan; i_chan++ ) + { + out[i_chan][i] = tmp[i_chan]; + move16(); + } + } + + return AMBI_CONVERT_OK; +} diff --git a/lib_util/ambi_convert.h b/lib_util/ambi_convert.h new file mode 100644 index 0000000000000000000000000000000000000000..cbb50af3fb2f999074cf067aadbc7c959b821bb5 --- /dev/null +++ b/lib_util/ambi_convert.h @@ -0,0 +1,102 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef AMBI_CONVERT_H +#define AMBI_CONVERT_H + +#include "options.h" +#include "stl.h" +#include "cnst.h" + +#define AMBI_MAX_FRAME_LENGTH 960 /* 20ms at 48 kHz Sampling rate */ +#define AMBI_MAX_CHANNELS 16 + +typedef enum +{ + AMBI_FMT_ACN_SN3D = 0, + AMBI_FMT_ACN_N3D, + AMBI_FMT_FM_MAXN, + AMBI_FMT_FM_FM, + AMBI_FMT_SID_SN3D, + AMBI_FMT_SID_N3D +} AMBI_FMT; + +typedef enum +{ + AMBI_NORM_SN3D = 0, + AMBI_NORM_N3D, + AMBI_NORM_MAXN, + AMBI_NORM_FM +} AMBI_CHANNEL_NORM; + +typedef enum +{ + AMBI_CHANNEL_ORDER_ACN = 0, + AMBI_CHANNEL_ORDER_FM, + AMBI_CHANNEL_ORDER_SID +} AMBI_CHANNEL_ORDER; + +typedef enum +{ + AMBI_CONVERT_OK = 0, + AMBI_CONVERT_UNSUPPORTED_CONVERSION, + AMBI_CONVERT_UNSUPPORTED_FRAME_LENGTH, + AMBI_CONVERT_CLIPPING_DETECTED +} AMBI_CONVERT_ERROR; + +AMBI_CONVERT_ERROR convert_ambi_format( + Word16 *in[], /* i: input ambisonics channels, Q0 */ + Word16 *out[], /* o: output ambisonics channels, Q0 */ + const Word16 order, /* i: ambisonics order */ + const AMBI_FMT in_format, /* i: input ambisonics format */ + const AMBI_FMT out_format, /* i: output ambisonics format */ + const int16_t frame_length /* i: input/output frame length */ +); + +AMBI_CONVERT_ERROR renormalize_channels( + Word16 *in[], /* i: input ambisonics channels, Q0 */ + Word16 *out[], /* o: output ambisonics channels, Q0 */ + const Word16 order, /* i: ambisonics order */ + const AMBI_CHANNEL_NORM in_format, /* i: input ambisonics format */ + const AMBI_CHANNEL_NORM out_format, /* i: output ambisonics format */ + const int16_t frame_length /* i: input/output frame length */ +); + +AMBI_CONVERT_ERROR reorder_channels( + Word16 *in[], /* i: input ambisonics channels, Q0 */ + Word16 *out[], /* o: output ambisonics channels, Q0 */ + const Word16 order, /* i: ambisonics order */ + const AMBI_CHANNEL_ORDER in_format, /* i: input ambisonics format */ + const AMBI_CHANNEL_ORDER out_format, /* i: output ambisonics format */ + const int16_t frame_length /* i: input/output frame length */ +); +#endif diff --git a/lib_util/audio_file_reader.c b/lib_util/audio_file_reader.c index ca5e6e4963b676da58526fbb30a3cf07d9f34f77..0b6e44660de1d29b008868b1d847522f052bc56a 100644 --- a/lib_util/audio_file_reader.c +++ b/lib_util/audio_file_reader.c @@ -32,9 +32,7 @@ #include "audio_file_reader.h" #include "tinywavein_c.h" -#include -#include -#include "wmc_auto.h" + struct AudioFileReader { @@ -97,7 +95,7 @@ ivas_error AudioFileReader_open( { return IVAS_ERR_FAILED_FILE_OPEN; } - self = calloc( sizeof( AudioFileReader ), 1 ); + self = calloc( 1, sizeof( AudioFileReader ) ); self->samplingRate = 0; self->numChannels = 0; diff --git a/lib_util/audio_file_writer.c b/lib_util/audio_file_writer.c index fb7a64c425b6f648667a969290b6086c11158887..eb93018341780d232df13483268f295577e21cae 100644 --- a/lib_util/audio_file_writer.c +++ b/lib_util/audio_file_writer.c @@ -32,9 +32,8 @@ #include "audio_file_writer.h" #include "tinywaveout_c.h" -#include #include -#include "wmc_auto.h" + struct AudioFileWriter { @@ -90,7 +89,7 @@ ivas_error AudioFileWriter_open( return IVAS_ERR_FAILED_FILE_OPEN; } - self = calloc( sizeof( AudioFileWriter ), 1 ); + self = calloc( 1, sizeof( AudioFileWriter ) ); if ( self == NULL ) { return IVAS_ERR_FAILED_ALLOC; diff --git a/lib_util/bitstream_reader.c b/lib_util/bitstream_reader.c index 2bd6f46aa6014e8e37f1c77bd051d49eabb47da4..6d40260b56dc5b21d8834c16f6e988175d89892a 100644 --- a/lib_util/bitstream_reader.c +++ b/lib_util/bitstream_reader.c @@ -33,7 +33,6 @@ #include "bitstream_reader.h" #include "g192.h" #include "mime_io.h" -#include "ivas_error.h" #include "ivas_error_utils.h" #include #include @@ -204,16 +203,15 @@ static void init_for_mime( BS_READER_HANDLE hBsReader ) static ivas_error init_for_format( BS_READER_HANDLE *phBsReader, BS_READER_FORMAT format ) { /* Allocate memory under handle and check if allocation successful */ - ( *phBsReader ) = (BS_READER_HANDLE) malloc( sizeof( struct BS_Reader ) ); + /* Initialize all struct members to NULL - supported functions + * will be overwritten below in init_for_ */ + ( *phBsReader ) = (BS_READER_HANDLE) calloc( 1, sizeof( struct BS_Reader ) ); if ( *phBsReader == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "could not allocate bitstream reader" ); } - /* Initialize all struct members to NULL - supported functions - * will be overwritten below in init_for_ */ BS_READER_HANDLE hBsReader = *phBsReader; - memset( hBsReader, 0, sizeof( struct BS_Reader ) ); /* Set function pointers to selected format */ switch ( format ) diff --git a/lib_util/bitstream_writer.c b/lib_util/bitstream_writer.c index 8c4b64cd4816649cb6833ccd6bda13270eb0e179..bff9f461b15992ed3c953a83a19f2c22cc496ed6 100644 --- a/lib_util/bitstream_writer.c +++ b/lib_util/bitstream_writer.c @@ -156,16 +156,15 @@ static void init_for_mime( BS_WRITER_HANDLE hBsWriter ) static ivas_error init_for_format( BS_WRITER_HANDLE *phBsWriter, BS_WRITER_FORMAT format ) { /* Allocate memory under handle and check if allocation successful */ - ( *phBsWriter ) = (BS_WRITER_HANDLE) malloc( sizeof( struct BS_Writer ) ); + /* Initialize all struct members to NULL - supported functions + * will be overwritten below in init_for_ */ + ( *phBsWriter ) = (BS_WRITER_HANDLE) calloc( 1, sizeof( struct BS_Writer ) ); if ( *phBsWriter == NULL ) { IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "could not allocate bitstream writer" ); } - /* Initialize all struct members to NULL - supported functions - * will be overwritten below in init_for_ */ BS_WRITER_HANDLE hBsWriter = *phBsWriter; - memset( hBsWriter, 0, sizeof( struct BS_Writer ) ); /* Set function pointers to selected format */ switch ( format ) diff --git a/lib_util/cmdl_tools.c b/lib_util/cmdl_tools.c index bec772ce42f96eb8373d44aebc6cba944cdb288e..945bda07de0918d6784d1edfddfa415040029485 100644 --- a/lib_util/cmdl_tools.c +++ b/lib_util/cmdl_tools.c @@ -185,20 +185,21 @@ void convert_backslash( void remove_cr( char *str ) { - char *pos; + int32_t n, p = 0; /* remove all \r characters from the string */ - pos = strchr( str, '\r' ); - while ( pos != NULL ) + for ( n = 0; str[n] != 0; n++ ) { - strcpy( pos, pos + 1 ); - pos = strchr( pos, '\r' ); + char c = str[n]; + str[p] = c; + p += ( c == '\r' ) ? 0 : 1; } + str[p] = 0; + return; } - /*---------------------------------------------------------------------* * clearString() * diff --git a/lib_util/cmdln_parser.c b/lib_util/cmdln_parser.c index b2c8f85bc4dc7119e7268271f44fcce2af9c703c..1b9eb7a92899f1b62df0e925fc7f3882c2512012 100644 --- a/lib_util/cmdln_parser.c +++ b/lib_util/cmdln_parser.c @@ -150,7 +150,22 @@ static int8_t optionMatchesString( const char *optionName = stringToOptionName( str ); - if ( strncmp( optionName, opt.props.match, MAX_OPTION_LENGTH ) == 0 || strncmp( optionName, opt.props.matchShort, MAX_OPTION_LENGTH ) == 0 ) + char optionName_to_upper[FILENAME_MAX]; + strncpy( optionName_to_upper, optionName, sizeof( optionName_to_upper ) - 1 ); + optionName_to_upper[sizeof( optionName_to_upper ) - 1] = '\0'; + to_upper( optionName_to_upper ); + + char match_to_upper[FILENAME_MAX]; + strncpy( match_to_upper, opt.props.match, sizeof( match_to_upper ) - 1 ); + optionName_to_upper[sizeof( match_to_upper ) - 1] = '\0'; + to_upper( match_to_upper ); + + char matchShort_to_upper[FILENAME_MAX]; + strncpy( matchShort_to_upper, opt.props.matchShort, sizeof( matchShort_to_upper ) - 1 ); + optionName_to_upper[sizeof( matchShort_to_upper ) - 1] = '\0'; + to_upper( matchShort_to_upper ); + + if ( strncmp( optionName_to_upper, match_to_upper, MAX_OPTION_LENGTH ) == 0 || strncmp( optionName_to_upper, matchShort_to_upper, MAX_OPTION_LENGTH ) == 0 ) { return 1; } diff --git a/lib_util/evs_rtp_payload.c b/lib_util/evs_rtp_payload.c index a0c514bad3ac1495178debf42f7b6736ec770bd3..280ddb32391916df6d569af77ee059f8eb70516d 100644 --- a/lib_util/evs_rtp_payload.c +++ b/lib_util/evs_rtp_payload.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include diff --git a/lib_util/evs_rtp_payload.h b/lib_util/evs_rtp_payload.h index 357d985578ba9616980b33e62b75c62ee6ad5604..f97d9b7a6f662d5aad6c45f96380316683837689 100644 --- a/lib_util/evs_rtp_payload.h +++ b/lib_util/evs_rtp_payload.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #pragma once diff --git a/lib_util/float_to_fix_ops.c b/lib_util/float_to_fix_ops.c new file mode 100644 index 0000000000000000000000000000000000000000..4bab0a6b1d9a7b8012257c039f374a6757ab5314 --- /dev/null +++ b/lib_util/float_to_fix_ops.c @@ -0,0 +1,129 @@ + +#include "common_api_types.h" +#include "float_to_fix_ops.h" +#include +#include + + +#define Q15 15 +#define Q31 31 +#define ONE_IN_Q31 0x7fffffff +#define MAX16B 32767 +#define MIN16B ( -32768 ) +#define MAXVAL_WORD32 ( (int32_t) 0x7FFFFFFF ) + + +Word32 float_to_fix( + float number, + const Word32 Q ) +{ + assert( Q >= 0 ); + if ( number == 1.0f && Q == Q31 ) + { + return ONE_IN_Q31; + } + if ( isnan( number ) ) + { + number = 0; + } + assert( fabs( number ) < pow( 2, 31 - Q ) ); + Word32 ret = (Word32) ( number * ( (UWord32) 1 << Q ) ); + + return ret; +} + + +Word16 float_to_fix16( + const float number, + const Word16 Q ) +{ + assert( Q >= 0 ); + if ( isnan( number ) ) + return 0; + if ( number == 1.0f && Q == Q15 ) + return MAX16B; + if ( number == -1.0f && Q == Q15 ) + return MIN16B; + assert( fabs( number ) < pow( 2, 15 - Q ) ); + Word16 ret = (Word16) ( number * ( (UWord16) 1 << Q ) ); + + return ret; +} + + +Word32 floatToFixed( + const float f, + const Word16 Q ) +{ + Word64 result_32; + + if ( f == 1.0f && Q == Q15 ) + return MAX16B; + if ( f == 1.0f && Q == Q31 ) + return MAXVAL_WORD32; + if ( Q < 0 ) + result_32 = (Word64) ( (float) ( f ) / (double) ( (unsigned Word64) 1 << ( -Q ) ) + ( f >= 0 ? 0.5 : -0.5 ) ); + else + result_32 = (Word64) ( f * (double) ( (unsigned Word64) 1 << Q ) + ( f >= 0 ? 0.5 : -0.5 ) ); + if ( result_32 > MAX_32 ) + return MAX_32; + if ( result_32 < MIN_32 ) + return MIN_32; + + return (Word32) result_32; +} + +float fixedToFloat( + const Word32 i, + const Word16 Q ) +{ + if ( Q < 0 ) + return ( i * (float) ( ( 1LL ) << ( -Q ) ) ); + else + return (float) ( i ) / (float) ( 1LL << Q ); +} + + +float fix16_to_float( + const Word16 number, + const Word16 Q ) +{ + assert( Q >= 0 ); + float ret = (float) number / ( (UWord16) 1 << Q ); + + return ret; +} + + +Word32 floatToFixed_32( + const float number, + const Word16 Q ) +{ + float val = 0.0f; + assert( abs_s( Q ) <= 63 ); + if ( abs_s( Q ) > 31 ) + { + if ( Q > 0 ) + { + val = ( number * ( (unsigned int) MAX_32 + 1 ) ) * ( 1 << ( Q - 31 ) ); + } + else + { + val = ( number / ( 1 << ( -Q - 31 ) ) ) / (unsigned int) MIN_32; + } + if ( val >= 0.0f ) + { + assert( (Word32) val <= MAX_32 ); + } + else + { + assert( (Word32) val >= MIN_32 ); + } + } + else + { + return floatToFixed( number, Q ); + } + + return (Word32) val; +} diff --git a/lib_util/float_to_fix_ops.h b/lib_util/float_to_fix_ops.h new file mode 100644 index 0000000000000000000000000000000000000000..0cd23cbc687c24b8026a754c0acbd320a466c14f --- /dev/null +++ b/lib_util/float_to_fix_ops.h @@ -0,0 +1,19 @@ + +#include "common_api_types.h" + +#ifndef FLOAT_TO_FIX_OPS_H +#define FLOAT_TO_FIX_OPS_H + +Word32 float_to_fix( float number, const Word32 Q ); + +Word16 float_to_fix16( const float number, const Word16 Q ); + +Word32 floatToFixed( const float f, const Word16 Q ); + +Word32 floatToFixed_32( const float number, const Word16 Q ); + +float fixedToFloat( const Word32 i, const Word16 Q ); + +float fix16_to_float( const Word16 number, const Word16 Q ); + +#endif /* FLOAT_TO_FIX_OPS_H */ diff --git a/lib_util/g192.c b/lib_util/g192.c index d6c6ec4755dc8f3b4f07ba3990389888547a31ee..5a8ed10658bc67787e972b424c516d46214137b2 100644 --- a/lib_util/g192.c +++ b/lib_util/g192.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include "g192.h" @@ -62,7 +62,7 @@ *-----------------------------------------------------------------------*/ /* main handle */ -struct __G192 +struct G192_STRUCT { FILE *file; int16_t ownFileHandle; /* flag whether FILE handle created by instance or externally */ @@ -79,12 +79,11 @@ G192_ERROR G192_Reader_Open_filename( const char *filename ) { /* create handle */ - *phG192 = (G192_HANDLE) calloc( 1, sizeof( struct __G192 ) ); + *phG192 = (G192_HANDLE) calloc( 1, sizeof( struct G192_STRUCT ) ); if ( !phG192 ) { return G192_MEMORY_ERROR; } - memset( *phG192, 0, sizeof( struct __G192 ) ); /* open file stream */ ( *phG192 )->file = fopen( filename, "rb" ); @@ -422,7 +421,7 @@ G192_ERROR G192_Writer_Open_filename( const char *filename ) { /* create handle */ - *phG192 = (G192_HANDLE) calloc( 1, sizeof( struct __G192 ) ); + *phG192 = (G192_HANDLE) calloc( 1, sizeof( struct G192_STRUCT ) ); if ( !phG192 ) { return G192_MEMORY_ERROR; @@ -483,7 +482,7 @@ G192_ERROR G192_WriteVoipFrame_short( const uint16_t *serial, const int16_t numBits, uint16_t const rtpSequenceNumber, - uint16_t const rtpTimeStamp, + uint32_t const rtpTimeStamp, uint32_t const rcvTime_ms ) { int16_t G192_HEADER[2], G192_DATA[IVAS_MAX_BITS_PER_FRAME]; @@ -494,7 +493,7 @@ G192_ERROR G192_WriteVoipFrame_short( uint32_t ssrc = 0; uint16_t rtpSequenceNumber_2 = htons( rtpSequenceNumber ); uint32_t rtpTimeStamp_2 = htonl( rtpTimeStamp ); - uint16_t ssrc_2 = (uint16_t) htonl( ssrc ); + uint32_t ssrc_2 = (uint32_t) htonl( ssrc ); assert( numBits <= IVAS_MAX_BITS_PER_FRAME ); diff --git a/lib_util/g192.h b/lib_util/g192.h index 8014f523687f9c50404d39dbe3e1242b00f813c7..e6ad2b4ee9e6781c91e378df68bad36855e78374 100644 --- a/lib_util/g192.h +++ b/lib_util/g192.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #ifndef G192_H @@ -67,8 +67,8 @@ typedef enum _G192_ERROR *-----------------------------------------------------------------------*/ /* main handle */ -struct __G192; -typedef struct __G192 *G192_HANDLE; +struct G192_STRUCT; +typedef struct G192_STRUCT *G192_HANDLE; /*-----------------------------------------------------------------------* @@ -93,7 +93,7 @@ G192_ERROR G192_Writer_Open_filename( G192_HANDLE *phG192, const char *filename G192_ERROR G192_WriteFrame( G192_HANDLE const hG192, const uint16_t *serial, const int16_t numBits ); -G192_ERROR G192_WriteVoipFrame_short( G192_HANDLE const hG192, const uint16_t *serial, const int16_t num_bits, uint16_t const rtpSequenceNumber, uint16_t const rtpTimeStamp, uint32_t const rcvTime_ms ); +G192_ERROR G192_WriteVoipFrame_short( G192_HANDLE const hG192, const uint16_t *serial, const int16_t num_bits, uint16_t const rtpSequenceNumber, uint32_t const rtpTimeStamp, uint32_t const rcvTime_ms ); G192_ERROR G192_Writer_Close( G192_HANDLE *phG192 ); diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index e667dcfe5179500d1f08c3310dd27ead8b4dc2bc..db7d42d7c264e78ba1414281cd8416e0428a67ec 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -32,10 +32,12 @@ #include "hrtf_file_reader.h" #include -#include "prot_fx.h" +#include +#include #include "ivas_prot_rend_fx.h" #include "ivas_prot_fx.h" + /*---------------------------------------------------------------------* * Local structures *---------------------------------------------------------------------*/ @@ -56,22 +58,6 @@ typedef struct ivas_hrtfs_file_header_t } ivas_hrtfs_file_header_t; -/*---------------------------------------------------------------------* - * Local constants - *---------------------------------------------------------------------*/ - -#define RESAMPLE_FACTOR_16_48 ( 16.0f / 48.0f ) -#define RESAMPLE_FACTOR_32_48 ( 32.0f / 48.0f ) - -#define RESAMPLE_FACTOR_16_48_FX ( 5461 ) -#define RESAMPLE_FACTOR_32_48_FX ( 10922 ) - -/*---------------------------------------------------------------------* - * Local function declarations - *---------------------------------------------------------------------*/ - -static void HRTF_energy_sections_precalc( ModelParams_t *model ); - /*---------------------------------------------------------------------* * hrtfFileReader_open() * @@ -98,9 +84,9 @@ ivas_error hrtfFileReader_open( return IVAS_ERR_FAILED_FILE_OPEN; } - self = calloc( sizeof( hrtfFileReader ), 1 ); + self = calloc( 1, sizeof( hrtfFileReader ) ); self->file = file; - self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 ); + self->file_path = calloc( strlen( filePath ) + 1, sizeof( char ) ); strcpy( self->file_path, filePath ); *hrtfReader = self; @@ -145,6 +131,11 @@ static ivas_error read_and_check_hrtf_binary_file_header( { int32_t file_size; + if ( hrtf_file_header == NULL || f_hrtf == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + /* [Declaration of the binary file] */ /* File Identifier (8 bytes) */ /* Size of file in bytes (4 bytes) */ @@ -189,14 +180,14 @@ static ivas_error check_hrtf_binary_header( ivas_hrtfs_header_t *hrtf_header ) { /* Check the renderer type */ - if ( ( hrtf_header->rend_type != RENDERER_BINAURAL_MIXER_CONV ) && ( hrtf_header->rend_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) && - ( hrtf_header->rend_type != RENDERER_BINAURAL_FASTCONV ) && ( hrtf_header->rend_type != RENDERER_BINAURAL_FASTCONV_ROOM ) && - ( hrtf_header->rend_type != RENDERER_BINAURAL_PARAMETRIC ) && ( hrtf_header->rend_type != RENDERER_BINAURAL_PARAMETRIC_ROOM ) && - ( hrtf_header->rend_type != RENDERER_BINAURAL_OBJECTS_TD ) ) + + if ( ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_MIXER_CONV ) && ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_MIXER_CONV_ROOM ) && + ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_FASTCONV ) && ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM ) && + ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_PARAMETRIC ) && + ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD ) && ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_REVERB_ALL ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Header of HRTF binary file not compliant (renderer type)" ); } - /* Check the output format of the decoder */ if ( ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_FOA ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED ) ) @@ -224,8 +215,14 @@ static ivas_error read_hrtf_binary_header( ivas_hrtfs_header_t *hrtf_header, FILE *f_hrtf ) { + + if ( hrtf_header == NULL || f_hrtf == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + /* HRTF Header */ - /* Renderer type (4 bytes) : See "RENDERER_TYPE" */ + /* Renderer type (4 bytes) : See "HRTF_READER_RENDERER_TYPE" */ /* Input configuration (4 bytes) : See "BINAURAL_INPUT_AUDIO_CONFIG" */ /* Sampling Frequency (4 bytes) */ /* Raw data size (4 bytes) */ @@ -240,119 +237,218 @@ static ivas_error read_hrtf_binary_header( /*-------------------------------------------------------------------* - * LoadBSplineBinaryITD() + * audio_cfg_2_binaural_cfg() + * + * Convert audio config. to HRTF binaural config + --------------------------------------------------------------------*/ + +static BINAURAL_INPUT_AUDIO_CONFIG audio_cfg_2_binaural_cfg( + const IVAS_AUDIO_CONFIG hrtf_set_audio_cfg ) +{ + BINAURAL_INPUT_AUDIO_CONFIG hrtf_set_binaural_cfg; + + hrtf_set_binaural_cfg = BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED; + + switch ( hrtf_set_audio_cfg ) + { + case IVAS_AUDIO_CONFIG_7_1_4: + hrtf_set_binaural_cfg = BINAURAL_INPUT_AUDIO_CONFIG_COMBINED; + break; + case IVAS_AUDIO_CONFIG_FOA: + hrtf_set_binaural_cfg = BINAURAL_INPUT_AUDIO_CONFIG_FOA; + break; + case IVAS_AUDIO_CONFIG_HOA2: + hrtf_set_binaural_cfg = BINAURAL_INPUT_AUDIO_CONFIG_HOA2; + break; + case IVAS_AUDIO_CONFIG_HOA3: + hrtf_set_binaural_cfg = BINAURAL_INPUT_AUDIO_CONFIG_HOA3; + break; + default: + hrtf_set_binaural_cfg = BINAURAL_INPUT_AUDIO_CONFIG_INVALID; + break; + } + + return hrtf_set_binaural_cfg; +} + + +/*-------------------------------------------------------------------* + * TDREND_LoadBSplineBinaryITD() * - * Loads the B Spline HR filter model ITD data from file. + * Loads the B Spline HR filter model ITD data from file for TD renderer --------------------------------------------------------------------*/ -static void LoadBSplineBinaryITD( + +static ivas_error TDREND_LoadBSplineBinaryITD( ModelParamsITD_t *modelITD, /* i/o: ITD model parameter structure */ FILE *f_hrtf /* i : HR filter data file handle */ ) { - Word16 tmp, i; - fread( &modelITD->N, sizeof( Word16 ), 1, f_hrtf ); - fread( &modelITD->elevDim2, sizeof( Word16 ), 1, f_hrtf ); - fread( &modelITD->elevDim3, sizeof( Word16 ), 1, f_hrtf ); + Word16 tmp, factor_Q; + Word16 *v_tmp16; + Word16 j; - float *elevKSeq_dyn_local = (float *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( float ) ); - fread( elevKSeq_dyn_local, sizeof( float ), modelITD->elevDim3 - 2, f_hrtf ); + if ( modelITD == NULL || f_hrtf == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } - modelITD->elevKSeq_dyn_fx = (Word32 *) malloc( sizeof( Word32 ) * ( modelITD->elevDim3 - 2 ) ); - FOR( i = 0; i < modelITD->elevDim3 - 2; i++ ) + fread( &modelITD->elevDim3, sizeof( Word16 ), 1, f_hrtf ); + modelITD->elevKSeq_dyn_fx = (Word32 *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( Word32 ) ); + v_tmp16 = (Word16 *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( Word16 ) ); + if ( modelITD->elevKSeq_dyn_fx == NULL || v_tmp16 == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf ); + fread( v_tmp16, sizeof( Word16 ), modelITD->elevDim3 - 2, f_hrtf ); + for ( j = 0; j < modelITD->elevDim3 - 2; j++ ) { - modelITD->elevKSeq_dyn_fx[i] = float_to_fix( elevKSeq_dyn_local[i], Q22 ); + modelITD->elevKSeq_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q22 - factor_Q ); } - free( elevKSeq_dyn_local ); + free( v_tmp16 ); - fread( &modelITD->azimDim2, sizeof( Word16 ), 1, f_hrtf ); fread( &modelITD->azimDim3, sizeof( Word16 ), 1, f_hrtf ); - - float *azimKSeq_dyn_local = (float *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( float ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */ - fread( azimKSeq_dyn_local, sizeof( float ), ( modelITD->azimDim3 + 1 ) / 2 - 2, f_hrtf ); modelITD->azimKSeq_dyn_fx = (Word32 *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( Word32 ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */ - FOR( i = 0; i < ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ); i++ ) + v_tmp16 = (Word16 *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( Word16 ) ); + if ( modelITD->azimKSeq_dyn_fx == NULL || v_tmp16 == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf ); + fread( v_tmp16, sizeof( Word16 ), ( modelITD->azimDim3 + 1 ) / 2 - 2, f_hrtf ); + for ( j = 0; j < ( modelITD->azimDim3 + 1 ) / 2 - 2; j++ ) { - modelITD->azimKSeq_dyn_fx[i] = float_to_fix( azimKSeq_dyn_local[i], Q22 ); + modelITD->azimKSeq_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q22 - factor_Q ); } - free( azimKSeq_dyn_local ); + free( v_tmp16 ); fread( &tmp, sizeof( Word16 ), 1, f_hrtf ); - float *W_dyn_local = (float *) malloc( tmp * sizeof( float ) ); - fread( W_dyn_local, sizeof( float ), tmp, f_hrtf ); - modelITD->W_dyn_fx = (Word32 *) malloc( tmp * sizeof( Word32 ) ); - f2me_buf( W_dyn_local, modelITD->W_dyn_fx, &modelITD->W_dyn_e, tmp ); - free( W_dyn_local ); + if ( modelITD->W_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } - /* azimuth */ - fread( modelITD->azimBsLen, sizeof( Word16 ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); - fread( modelITD->azimBsStart, sizeof( Word16 ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf ); + v_tmp16 = (Word16 *) malloc( tmp * sizeof( Word16 ) ); + if ( v_tmp16 == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + modelITD->W_e = Q15 - factor_Q; + // modelITD->W_dyn_e = 6; /* force to 6 to be corrected */ + fread( v_tmp16, sizeof( Word16 ), tmp, f_hrtf ); + for ( j = 0; j < tmp; j++ ) + { + modelITD->W_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q25 - factor_Q ); + } + free( v_tmp16 ); + /* azimuth */ + modelITD->azimBsLen_dyn_fx = (Word16 *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( Word16 ) ); + if ( modelITD->azimBsLen_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( modelITD->azimBsLen_dyn_fx, sizeof( Word16 ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + modelITD->azimBsStart_dyn_fx = (Word16 *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( Word16 ) ); + if ( modelITD->azimBsStart_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( modelITD->azimBsStart_dyn_fx, sizeof( Word16 ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); fread( &tmp, sizeof( Word16 ), 1, f_hrtf ); - float *azimBsShape_dyn_local = (float *) malloc( tmp * sizeof( float ) ); - fread( azimBsShape_dyn_local, sizeof( float ), tmp, f_hrtf ); - modelITD->azimBsShape_dyn_fx = (Word32 *) malloc( tmp * sizeof( Word32 ) ); - FOR( i = 0; i < tmp; i++ ) + v_tmp16 = (Word16 *) malloc( tmp * sizeof( Word16 ) ); + if ( modelITD->azimBsShape_dyn_fx == NULL || v_tmp16 == NULL ) { - modelITD->azimBsShape_dyn_fx[i] = float_to_fix( azimBsShape_dyn_local[i], Q30 ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf ); + fread( v_tmp16, sizeof( Word16 ), tmp, f_hrtf ); + for ( j = 0; j < tmp; j++ ) + { + modelITD->azimBsShape_dyn_fx[j] = L_shl_r( v_tmp16[j], Q30 - factor_Q ); } - free( azimBsShape_dyn_local ); + free( v_tmp16 ); fread( &modelITD->azimSegSamples, sizeof( Word16 ), 1, f_hrtf ); /* elevation */ - fread( modelITD->elevBsLen, sizeof( Word16 ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); - fread( modelITD->elevBsStart, sizeof( Word16 ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); - + modelITD->elevBsLen_dyn_fx = (Word16 *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( Word16 ) ); + if ( modelITD->elevBsLen_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( modelITD->elevBsLen_dyn_fx, sizeof( Word16 ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + modelITD->elevBsStart_dyn_fx = (Word16 *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( Word16 ) ); + if ( modelITD->elevBsStart_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( modelITD->elevBsStart_dyn_fx, sizeof( Word16 ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); fread( &tmp, sizeof( Word16 ), 1, f_hrtf ); - float *elevBsShape_dyn_local = (float *) malloc( tmp * sizeof( float ) ); - fread( elevBsShape_dyn_local, sizeof( float ), tmp, f_hrtf ); - modelITD->elevBsShape_dyn_fx = (Word32 *) malloc( tmp * sizeof( Word32 ) ); - FOR( i = 0; i < tmp; i++ ) + if ( modelITD->elevBsShape_dyn_fx == NULL ) { - modelITD->elevBsShape_dyn_fx[i] = float_to_fix( elevBsShape_dyn_local[i], Q30 ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } - free( elevBsShape_dyn_local ); + v_tmp16 = (Word16 *) malloc( tmp * sizeof( Word16 ) ); + if ( v_tmp16 == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf ); + fread( v_tmp16, sizeof( Word16 ), tmp, f_hrtf ); + for ( j = 0; j < tmp; j++ ) + { + modelITD->elevBsShape_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q30 - factor_Q ); + } + free( v_tmp16 ); fread( &modelITD->elevSegSamples, sizeof( Word16 ), 1, f_hrtf ); modelITD->elevKSeq_fx = (const Word32 *) modelITD->elevKSeq_dyn_fx; - modelITD->azimKSeq_fx = (const Word32 *) modelITD->azimKSeq_dyn_fx; - modelITD->W_fx = modelITD->W_dyn_fx; - modelITD->W_e = modelITD->W_dyn_e; - move16(); + modelITD->W_fx = (const Word32 *) modelITD->W_dyn_fx; modelITD->azimBsShape_fx = (const Word32 *) modelITD->azimBsShape_dyn_fx; modelITD->elevBsShape_fx = (const Word32 *) modelITD->elevBsShape_dyn_fx; + modelITD->azimBsLen = (const Word16 *) modelITD->azimBsLen_dyn_fx; + modelITD->azimBsStart = (const Word16 *) modelITD->azimBsStart_dyn_fx; + modelITD->elevBsLen = (const Word16 *) modelITD->elevBsLen_dyn_fx; + modelITD->elevBsStart = (const Word16 *) modelITD->elevBsStart_dyn_fx; - return; + return IVAS_ERR_OK; } + /*-------------------------------------------------------------------* - * LoadBSplineBinary() + * TDREND_LoadBSplineBinary() * - * Loads the B Spline HR filter model data from file. + * Loads the B Spline HR filter model data from file for TD renderer --------------------------------------------------------------------*/ -static ivas_error LoadBSplineBinary( - IVAS_DEC_HRTF_HANDLE HrFiltSet_p, /* i/o: HR filter model parameter structure */ - FILE *f_hrtf /* i : HR filter data file handle */ +static ivas_error TDREND_LoadBSplineBinary( + IVAS_DEC_HRTF_TD_HANDLE HrFiltSet_p, /* i/o: HR filter model parameter structure */ + FILE *f_hrtf /* i : HR filter data file handle */ ) { ModelParams_t *model; - Word16 i, j, tmp; - - - float f_tmp_latency_s; - float f_tmp_lr_energy_and_iac_dyn[LR_IAC_LENGTH_NR_FC]; + Word16 i, tmp, factor_Q; + Word16 *v_tmp16; + Word32 j; + ivas_error error; - fread( &f_tmp_latency_s, sizeof( float ), 1, f_hrtf ); - HrFiltSet_p->latency_s_fx = float_to_fix( f_tmp_latency_s, Q31 ); + if ( HrFiltSet_p == NULL || f_hrtf == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf ); + HrFiltSet_p->latency_s_Q_fx = Q31 - factor_Q; + fread( &HrFiltSet_p->latency_s_fx, 1, sizeof( Word32 ), f_hrtf ); model = &( HrFiltSet_p->ModelParams ); /* Set ROM flag for correct deallocation */ @@ -361,7 +457,7 @@ static ivas_error LoadBSplineBinary( fread( &model->UseItdModel, sizeof( Word16 ), 1, f_hrtf ); /* Indicates if ITD model is active */ fread( &tmp, sizeof( Word16 ), 1, f_hrtf ); - SWITCH( tmp ) + switch ( tmp ) { case 16: HrFiltSet_p->SampleRate = 16000; @@ -369,185 +465,236 @@ static ivas_error LoadBSplineBinary( { HrFiltSet_p->ModelParamsITD.resamp_factor_fx = RESAMPLE_FACTOR_16_48_FX; } - BREAK; + break; case 32: HrFiltSet_p->SampleRate = 32000; if ( HrFiltSet_p->ModelParams.UseItdModel ) { HrFiltSet_p->ModelParamsITD.resamp_factor_fx = RESAMPLE_FACTOR_32_48_FX; } - BREAK; + break; case 48: HrFiltSet_p->SampleRate = 48000; if ( HrFiltSet_p->ModelParams.UseItdModel ) { HrFiltSet_p->ModelParamsITD.resamp_factor_fx = ONE_IN_Q14; } - BREAK; + break; default: - return IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "Error: HR filter file had an unsupported sampling rate (%d kHz)", tmp ); + return IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "Error: HR filter file has an unsupported sampling rate (%d kHz)", tmp ); } - move32(); - move16(); - fread( &model->SplineDegree, sizeof( Word16 ), 1, f_hrtf ); fread( &model->K, sizeof( Word16 ), 1, f_hrtf ); - - fread( &model->elevDim2, sizeof( Word16 ), 1, f_hrtf ); fread( &model->elevDim3, sizeof( Word16 ), 1, f_hrtf ); - - float *elevKSeq_dyn_local = (float *) malloc( ( model->elevDim3 - 2 ) * sizeof( float ) ); - fread( elevKSeq_dyn_local, sizeof( float ), model->elevDim3 - 2, f_hrtf ); model->elevKSeq_dyn_fx = (Word32 *) malloc( ( model->elevDim3 - 2 ) * sizeof( Word32 ) ); - FOR( i = 0; i < ( model->elevDim3 - 2 ); i++ ) + + v_tmp16 = (Word16 *) malloc( ( model->elevDim3 - 2 ) * sizeof( Word16 ) ); + if ( model->elevKSeq_dyn_fx == NULL || v_tmp16 == NULL ) { - model->elevKSeq_dyn_fx[i] = float_to_fix( elevKSeq_dyn_local[i], Q22 ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } - free( elevKSeq_dyn_local ); - - model->azimDim2_dyn = (Word16 *) malloc( model->elevDim3 * sizeof( Word16 ) ); + fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf ); + fread( v_tmp16, sizeof( Word16 ), model->elevDim3 - 2, f_hrtf ); + for ( j = 0; j < model->elevDim3 - 2; j++ ) + { + model->elevKSeq_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q22 - factor_Q ); + } + free( v_tmp16 ); model->azimDim3_dyn = (Word16 *) malloc( model->elevDim3 * sizeof( Word16 ) ); model->azim_start_idx_dyn = (Word16 *) malloc( model->elevDim3 * sizeof( Word16 ) ); - - float **azimKSeq_local = (float **) malloc( model->elevDim3 * sizeof( float * ) ); model->azimKSeq_fx = (Word32 **) malloc( model->elevDim3 * sizeof( Word32 * ) ); + if ( model->azimDim3_dyn == NULL || model->azim_start_idx_dyn == NULL || model->azimKSeq_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } - FOR( i = 0; i < model->elevDim3; i++ ) + for ( i = 0; i < model->elevDim3; i++ ) { - fread( &model->azimDim2_dyn[i], sizeof( Word16 ), 1, f_hrtf ); fread( &model->azimDim3_dyn[i], sizeof( Word16 ), 1, f_hrtf ); fread( &model->azim_start_idx_dyn[i], sizeof( Word16 ), 1, f_hrtf ); - - azimKSeq_local[i] = (float *) malloc( ( model->azimDim3_dyn[i] + 1 ) * sizeof( float ) ); - fread( azimKSeq_local[i], sizeof( float ), ( model->azimDim3_dyn[i] + 1 ), f_hrtf ); model->azimKSeq_fx[i] = (Word32 *) malloc( ( model->azimDim3_dyn[i] + 1 ) * sizeof( Word32 ) ); - FOR( j = 0; j < ( model->azimDim3_dyn[i] + 1 ); j++ ) + + v_tmp16 = (Word16 *) malloc( ( model->azimDim3_dyn[i] + 1 ) * sizeof( Word16 ) ); + if ( model->azimKSeq_fx[i] == NULL || v_tmp16 == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf ); + fread( v_tmp16, sizeof( Word16 ), ( model->azimDim3_dyn[i] + 1 ), f_hrtf ); + for ( j = 0; j < model->azimDim3_dyn[i] + 1; j++ ) { - model->azimKSeq_fx[i][j] = float_to_fix( azimKSeq_local[i][j], Q22 ); + model->azimKSeq_fx[i][j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q22 - factor_Q ); } - free( azimKSeq_local[i] ); + free( v_tmp16 ); } - free( azimKSeq_local ); - fread( &model->AlphaN, sizeof( Word16 ), 1, f_hrtf ); - float *AlphaL_dyn_local = (float *) malloc( model->AlphaN * model->K * sizeof( float ) ); - fread( AlphaL_dyn_local, sizeof( float ), model->AlphaN * model->K, f_hrtf ); - model->AlphaL_dyn_fx = (Word32 *) malloc( model->AlphaN * model->K * sizeof( Word32 ) ); - f2me_buf( AlphaL_dyn_local, model->AlphaL_dyn_fx, &model->AlphaL_dyn_e, model->AlphaN * model->K ); - free( AlphaL_dyn_local ); + v_tmp16 = (Word16 *) malloc( model->AlphaN * model->K * sizeof( Word16 ) ); + if ( model->AlphaL_dyn_fx == NULL || v_tmp16 == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf ); - float *AlphaR_dyn_local = (float *) malloc( model->AlphaN * model->K * sizeof( float ) ); - fread( AlphaR_dyn_local, sizeof( float ), model->AlphaN * model->K, f_hrtf ); + model->AlphaL_e = Q15 - factor_Q; + // model->AlphaL_dyn_e = 1; /* force to 6 to be corrected */ + model->AlphaR_e = model->AlphaL_e; + fread( v_tmp16, sizeof( Word16 ), model->AlphaN * model->K, f_hrtf ); + for ( j = 0; j < model->AlphaN * model->K; j++ ) + { + model->AlphaL_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q30 - factor_Q ); + } model->AlphaR_dyn_fx = (Word32 *) malloc( model->AlphaN * model->K * sizeof( Word32 ) ); - f2me_buf( AlphaR_dyn_local, model->AlphaR_dyn_fx, &model->AlphaR_dyn_e, model->AlphaN * model->K ); - free( AlphaR_dyn_local ); + if ( model->AlphaR_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + + fread( v_tmp16, sizeof( Word16 ), model->AlphaN * model->K, f_hrtf ); + for ( j = 0; j < model->AlphaN * model->K; j++ ) + { + model->AlphaR_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q30 - factor_Q ); + } + + free( v_tmp16 ); /* azimuth */ fread( &model->num_unique_azim_splines, sizeof( Word16 ), 1, f_hrtf ); - model->azimBsShape_fx = (const Word32 **) malloc( model->num_unique_azim_splines * sizeof( Word32 * ) ); model->azimBsShape_dyn_fx = (Word32 **) malloc( model->num_unique_azim_splines * sizeof( Word32 * ) ); - float **azimBsShape_dyn_local = (float **) malloc( model->num_unique_azim_splines * sizeof( float * ) ); - model->azimSegSamples_dyn = (Word16 *) malloc( model->num_unique_azim_splines * sizeof( Word16 ) ); - FOR( i = 0; i < model->num_unique_azim_splines; i++ ) + if ( model->azimBsShape_fx == NULL || model->azimBsShape_dyn_fx == NULL || model->azimSegSamples_dyn == NULL ) { - fread( &tmp, sizeof( Word16 ), 1, f_hrtf ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } - azimBsShape_dyn_local[i] = (float *) malloc( tmp * sizeof( float ) ); - fread( azimBsShape_dyn_local[i], sizeof( float ), tmp, f_hrtf ); + for ( i = 0; i < model->num_unique_azim_splines; i++ ) + { + fread( &tmp, sizeof( Word16 ), 1, f_hrtf ); model->azimBsShape_dyn_fx[i] = (Word32 *) malloc( tmp * sizeof( Word32 ) ); - FOR( j = 0; j < tmp; j++ ) + if ( model->azimBsShape_dyn_fx[i] == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf ); + v_tmp16 = (Word16 *) malloc( tmp * sizeof( Word16 ) ); + if ( v_tmp16 == NULL ) { - model->azimBsShape_dyn_fx[i][j] = float_to_fix( azimBsShape_dyn_local[i][j], Q30 ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } - free( azimBsShape_dyn_local[i] ); + fread( v_tmp16, sizeof( Word16 ), tmp, f_hrtf ); + for ( j = 0; j < tmp; j++ ) + { + model->azimBsShape_dyn_fx[i][j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q30 - factor_Q ); + } fread( &model->azimSegSamples_dyn[i], sizeof( Word16 ), 1, f_hrtf ); + free( v_tmp16 ); } - free( azimBsShape_dyn_local ); model->azimShapeIdx_dyn = (Word16 *) malloc( model->elevDim3 * sizeof( Word16 ) ); + if ( model->azimShapeIdx_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } fread( model->azimShapeIdx_dyn, sizeof( Word16 ), model->elevDim3, f_hrtf ); model->azimShapeSampFactor_dyn = (Word16 *) malloc( model->elevDim3 * sizeof( Word16 ) ); + if ( model->azimShapeSampFactor_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } fread( model->azimShapeSampFactor_dyn, sizeof( Word16 ), model->elevDim3, f_hrtf ); /* elevation */ - fread( model->elevBsLen, sizeof( Word16 ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); - fread( model->elevBsStart, sizeof( Word16 ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + model->elevBsLen_dyn = (Word16 *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( Word16 ) ); + if ( model->elevBsLen_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( model->elevBsLen_dyn, sizeof( Word16 ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + model->elevBsStart_dyn = (Word16 *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( Word16 ) ); + if ( model->elevBsStart_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( model->elevBsStart_dyn, sizeof( Word16 ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); fread( &tmp, sizeof( Word16 ), 1, f_hrtf ); - float *elevBsShape_dyn_local = (float *) malloc( tmp * sizeof( float ) ); - fread( elevBsShape_dyn_local, sizeof( float ), tmp, f_hrtf ); + v_tmp16 = (Word16 *) malloc( tmp * sizeof( Word16 ) ); model->elevBsShape_dyn_fx = (Word32 *) malloc( tmp * sizeof( Word32 ) ); - FOR( i = 0; i < tmp; i++ ) + if ( model->elevBsShape_dyn_fx == NULL || v_tmp16 == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + + fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf ); + fread( v_tmp16, sizeof( Word16 ), tmp, f_hrtf ); + for ( j = 0; j < tmp; j++ ) { - model->elevBsShape_dyn_fx[i] = float_to_fix( elevBsShape_dyn_local[i], Q30 ); + model->elevBsShape_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q30 - factor_Q ); } - free( elevBsShape_dyn_local ); + free( v_tmp16 ); fread( &model->elevSegSamples, sizeof( Word16 ), 1, f_hrtf ); - /* Set const pointers */ - model->AlphaL_fx = model->AlphaL_dyn_fx; - model->AlphaL_e = model->AlphaL_dyn_e; - move16(); - model->AlphaR_fx = model->AlphaR_dyn_fx; - model->AlphaR_e = model->AlphaR_dyn_e; - move16(); - model->EL_fx = model->EL_dyn_fx; - model->EL_e = model->EL_dyn_e; - move16(); - model->ER_fx = model->ER_dyn_fx; - model->ER_e = model->ER_dyn_e; - move16(); + model->EL_dyn_fx = (Word32 *) malloc( model->AlphaN * HRTF_MODEL_N_SECTIONS * sizeof( Word32 ) ); + if ( model->EL_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf ); + + model->EL_e = Q31 - factor_Q; + model->ER_e = model->EL_e; + + fread( (Word32 *) model->EL_dyn_fx, sizeof( Word32 ), model->AlphaN * HRTF_MODEL_N_SECTIONS, f_hrtf ); + + model->ER_dyn_fx = (Word32 *) malloc( model->AlphaN * HRTF_MODEL_N_SECTIONS * sizeof( Word32 ) ); + if ( model->ER_dyn_fx == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( (Word32 *) model->ER_dyn_fx, sizeof( Word32 ), model->AlphaN * HRTF_MODEL_N_SECTIONS, f_hrtf ); + /* Set const pointers */ + model->AlphaL_fx = (const Word32 *) model->AlphaL_dyn_fx; + model->AlphaR_fx = (const Word32 *) model->AlphaR_dyn_fx; + model->EL_fx = (const Word32 *) model->EL_dyn_fx; + model->ER_fx = (const Word32 *) model->ER_dyn_fx; + model->elevBsLen = (const Word16 *) model->elevBsLen_dyn; + model->elevBsStart = (const Word16 *) model->elevBsStart_dyn; model->elevBsShape_fx = (const Word32 *) model->elevBsShape_dyn_fx; model->elevKSeq_fx = (const Word32 *) model->elevKSeq_dyn_fx; - - model->azimDim2 = (const Word16 *) model->azimDim2_dyn; model->azimDim3 = (const Word16 *) model->azimDim3_dyn; model->azim_start_idx = (const Word16 *) model->azim_start_idx_dyn; model->azimSegSamples = (const Word16 *) model->azimSegSamples_dyn; model->azimShapeIdx = (const Word16 *) model->azimShapeIdx_dyn; model->azimShapeSampFactor = (const Word16 *) model->azimShapeSampFactor_dyn; - FOR( i = 0; i < model->num_unique_azim_splines; i++ ) + for ( i = 0; i < model->num_unique_azim_splines; i++ ) { model->azimBsShape_fx[i] = (const Word32 *) model->azimBsShape_dyn_fx[i]; } HRTF_model_precalc( model ); - HRTF_energy_sections_precalc( model ); HrFiltSet_p->FiltLength = HrFiltSet_p->ModelParams.K; - move16(); HrFiltSet_p->ModelEval.hrfModL_fx = (Word32 *) malloc( model->K * sizeof( Word32 ) ); HrFiltSet_p->ModelEval.hrfModR_fx = (Word32 *) malloc( model->K * sizeof( Word32 ) ); - - IF( HrFiltSet_p->ModelParams.UseItdModel ) + if ( HrFiltSet_p->ModelEval.hrfModL_fx == NULL || HrFiltSet_p->ModelEval.hrfModR_fx == NULL ) { - LoadBSplineBinaryITD( &HrFiltSet_p->ModelParamsITD, f_hrtf ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } - /* left/right energy and interaural coherence for late reverb */ - FOR( i = 0; i < 3; i++ ) + if ( HrFiltSet_p->ModelParams.UseItdModel ) { - fread( f_tmp_lr_energy_and_iac_dyn, sizeof( const float ), LR_IAC_LENGTH_NR_FC, f_hrtf ); - HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); - IF( i == 2 ) + if ( ( error = TDREND_LoadBSplineBinaryITD( &HrFiltSet_p->ModelParamsITD, f_hrtf ) ) != IVAS_ERR_OK ) { - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q27, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ - } - ELSE - { - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q23, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ + return error; } - HrFiltSet_p->lr_energy_and_iac_fx[i] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[i]; } return IVAS_ERR_OK; @@ -555,35 +702,48 @@ static ivas_error LoadBSplineBinary( /*-------------------------------------------------------------------* - * TDREND_MIX_LoadHRTF() + * load_reverb_from_binary() * - * Load HRTF model or table from file + * Loads reverb data from file for TD and Crend renderers --------------------------------------------------------------------*/ -static ivas_error TDREND_MIX_LoadHRTF( - FILE *f_hrtf, /* i/o: File pointer to HRTF file */ - IVAS_DEC_HRTF_HANDLE HrFiltSet_p /* o : Loaded HR filter set */ +static ivas_error load_reverb_from_binary( + IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics, /* i/o: HRTF statistics handle */ + const Word32 sampleRate, /* i : sample rate */ + FILE *f_hrtf /* i : HR filter data file handle */ ) { - int16_t tmp; - ivas_error error; - bool is_tdrend; + bool is_reverb; ivas_error header_check_result; ivas_hrtfs_file_header_t hrtfs_file_header; int16_t hrtf_id; ivas_hrtfs_header_t hrtf_header; int32_t hrtf_data_size_max; char *hrtf_data; + int16_t lr_iac_len; + int16_t ind; + Word16 factorQ; + Word16 tmp16; - error = IVAS_ERR_OK; + if ( hHrtfStatistics == NULL || f_hrtf == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + lr_iac_len = LR_IAC_LENGTH_NR_FC; + if ( sampleRate == 16000 ) + { + lr_iac_len = LR_IAC_LENGTH_NR_FC_16KHZ; + } + header_check_result = IVAS_ERR_OK; if ( ( header_check_result = read_and_check_hrtf_binary_file_header( &hrtfs_file_header, f_hrtf ) ) != IVAS_ERR_OK ) { return header_check_result; } - is_tdrend = FALSE; + is_reverb = FALSE; hrtf_data_size_max = hrtfs_file_header.max_data_size; /* Allocate the memory */ @@ -599,266 +759,372 @@ static ivas_error TDREND_MIX_LoadHRTF( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } - for ( hrtf_id = 0; ( hrtf_id < hrtfs_file_header.nb_hrtf ) && ( !is_tdrend ); hrtf_id++ ) + for ( hrtf_id = 0; ( hrtf_id < hrtfs_file_header.nb_hrtf ) && ( !is_reverb ); hrtf_id++ ) { if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK ) { + free( hrtf_data ); return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "HRTF binary file not compliant (number of HRTF)" ); } if ( ( header_check_result = check_hrtf_binary_header( &hrtf_header ) ) != IVAS_ERR_OK ) { + free( hrtf_data ); return header_check_result; } - is_tdrend = ( hrtf_header.rend_type == RENDERER_BINAURAL_OBJECTS_TD ); - if ( !is_tdrend ) + is_reverb = ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_REVERB_ALL ); + if ( !is_reverb ) { if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) { + free( hrtf_data ); return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); } } + else + { + if ( hrtf_header.frequency != sampleRate ) + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF invalid sampling rate" ); + } + } } free( hrtf_data ); - if ( is_tdrend ) + if ( is_reverb ) { - if ( fread( &tmp, 1, sizeof( int16_t ), f_hrtf ) == 0 ) + hHrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); + hHrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); + hHrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); + + if ( hHrtfStatistics->average_energy_l_dyn == NULL || hHrtfStatistics->average_energy_r_dyn == NULL || hHrtfStatistics->inter_aural_coherence_dyn == NULL ) { - return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } + hHrtfStatistics->average_energy_l = hHrtfStatistics->average_energy_l_dyn; + hHrtfStatistics->average_energy_r = hHrtfStatistics->average_energy_r_dyn; + hHrtfStatistics->inter_aural_coherence = hHrtfStatistics->inter_aural_coherence_dyn; - HrFiltSet_p->FilterMethod = (TDREND_HRFILT_Method_t) tmp; - - if ( HrFiltSet_p->FilterMethod != TDREND_HRFILT_Method_BSplineModel ) + fread( &factorQ, sizeof( Word16 ), 1, f_hrtf ); + for ( ind = 0; ind < lr_iac_len; ind++ ) { - error = IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "The HR filter set file is not a supported type." ); + fread( &tmp16, sizeof( Word16 ), 1, f_hrtf ); + hHrtfStatistics->average_energy_l_dyn[ind] = L_shl_r( L_deposit_l( tmp16 ), sub( Q28, factorQ ) ); } - else + for ( ind = 0; ind < lr_iac_len; ind++ ) + { + fread( &tmp16, sizeof( Word16 ), 1, f_hrtf ); + hHrtfStatistics->average_energy_r_dyn[ind] = L_shl_r( L_deposit_l( tmp16 ), sub( Q28, factorQ ) ); + } + for ( ind = 0; ind < lr_iac_len; ind++ ) { - error = LoadBSplineBinary( HrFiltSet_p, f_hrtf ); + fread( &tmp16, sizeof( Word16 ), 1, f_hrtf ); + hHrtfStatistics->inter_aural_coherence_dyn[ind] = L_shl_r( L_deposit_l( tmp16 ), sub( Q26, factorQ ) ); } + + hHrtfStatistics->fromROM = FALSE; } else { - return IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "HR filter not found in binary file." ); + return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; } - return error; + return IVAS_ERR_OK; } - /*---------------------------------------------------------------------* - * load_HRTF_binary() + * load_reverb_binary() * - * Load HRTF binary data into the HRTF handle + * Load HRTF binary data into the HRTF handle for TD and Crend renderers *---------------------------------------------------------------------*/ -ivas_error load_HRTF_binary( - IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ - const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ +ivas_error load_reverb_binary( + IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics, /* i/o: HRTF statistics handle */ + const Word32 sampleRate, /* i : sample rate */ + const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ ) { - ivas_error error; + if ( hrtfReader == NULL || hrtfReader->file == NULL || hHrtfStatistics == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } fseek( hrtfReader->file, 0, SEEK_SET ); - error = TDREND_MIX_LoadHRTF( hrtfReader->file, hHrtf ); - - return error; -} - -/*---------------------------------------------------------------------* - * HRTF_energy_sections_precalc() - * - * Calculate energies of each section and store in model->EL/model->ER - *---------------------------------------------------------------------*/ - -static void HRTF_energy_sections_precalc( - ModelParams_t *model /* i/o: HRTF model parameters */ -) -{ - int16_t i, k, j; - Word32 *pEL_fx; - Word32 *pER_fx; - const Word32 *pAlphaL_fx; - const Word32 *pAlphaR_fx; - Word32 tmp_fx; - int16_t AlphaN; - - if ( !model->modelROM ) - { - AlphaN = model->AlphaN; - - /* Precalculated energies for each section and each row of the alpha matrices */ - model->EL_dyn_fx = (Word32 *) malloc( HRTF_MODEL_N_SECTIONS * AlphaN * sizeof( Word32 ) ); - model->ER_dyn_fx = (Word32 *) malloc( HRTF_MODEL_N_SECTIONS * AlphaN * sizeof( Word32 ) ); - pEL_fx = model->EL_dyn_fx; - pER_fx = model->ER_dyn_fx; - for ( i = 0; i < HRTF_MODEL_N_SECTIONS; i++ ) - { - for ( j = 0; j < AlphaN; j++ ) /* rows of Alpha matrices */ - { - *pEL_fx = 0; - move32(); - *pER_fx = 0; - move32(); - - pAlphaL_fx = &model->AlphaL_fx[model->iSecFirst[i] * AlphaN + j]; - pAlphaR_fx = &model->AlphaR_fx[model->iSecFirst[i] * AlphaN + j]; - - for ( k = model->iSecFirst[i]; k < model->iSecLast[i]; k++ ) /* k within the sections */ - { - /* Energy calculation */ - tmp_fx = *pAlphaL_fx; - *pEL_fx = L_add( *pEL_fx, L_shr( Mpy_32_32( tmp_fx, tmp_fx ), 1 ) ); /* one guard bit */ - tmp_fx = *pAlphaR_fx; - *pER_fx = L_add( *pER_fx, L_shr( Mpy_32_32( tmp_fx, tmp_fx ), 1 ) ); /* one guard bit */ - pAlphaL_fx += AlphaN; - pAlphaR_fx += AlphaN; - } - pEL_fx++; - pER_fx++; - } - } - model->EL_dyn_e = add( shl( model->AlphaL_e, 1 ), 1 ); // 2 * AlphaL_e + 1 (one guard bit) - model->ER_dyn_e = add( shl( model->AlphaR_e, 1 ), 1 ); // 2 * AlphaR_e + 1 (one guard bit) - - model->EL_fx = model->EL_dyn_fx; - model->EL_e = model->EL_dyn_e; - move16(); - model->ER_fx = model->ER_dyn_fx; - model->ER_e = model->ER_dyn_e; - move16(); - } - - return; + return load_reverb_from_binary( hHrtfStatistics, sampleRate, hrtfReader->file ); } -/*---------------------------------------------------------------------* - * dealloc_HRTF_binary() +/*-------------------------------------------------------------------* + * TDREND_MIX_LoadHRTF() * - * Deallocated memory allocated by load_HRTF_binary - *---------------------------------------------------------------------*/ + * Load HRTF model or table from file for TD renderer + --------------------------------------------------------------------*/ -ivas_error dealloc_HRTF_binary( - IVAS_DEC_HRTF_HANDLE hHrtf /* i/o: HRTF handle */ +static ivas_error TDREND_MIX_LoadHRTF( + FILE *f_hrtf, /* i/o: File pointer to HRTF file */ + const Word32 sampleRate, /* i : sample rate */ + IVAS_DEC_HRTF_TD_HANDLE HrFiltSet_p /* o : Loaded HR filter set */ ) { - int16_t i; - ivas_error error; - error = IVAS_ERR_OK; + int16_t tmp; + bool is_tdrend; + ivas_error header_check_result; + ivas_hrtfs_file_header_t hrtfs_file_header; + int16_t hrtf_id; + ivas_hrtfs_header_t hrtf_header; + int32_t hrtf_data_size_max; + char *hrtf_data; - if ( hHrtf == NULL ) + if ( f_hrtf == NULL ) { - return error; + return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - if ( !hHrtf->ModelParams.modelROM ) + header_check_result = IVAS_ERR_OK; + + if ( ( header_check_result = read_and_check_hrtf_binary_file_header( &hrtfs_file_header, f_hrtf ) ) != IVAS_ERR_OK ) { - if ( hHrtf->ModelParams.UseItdModel ) + + /* try if it is old format for BE tests*/ + fseek( f_hrtf, 0, SEEK_SET ); + if ( fread( &tmp, 1, sizeof( int16_t ), f_hrtf ) == 0 ) { - free( hHrtf->ModelParamsITD.elevKSeq_dyn_fx ); - free( hHrtf->ModelParamsITD.azimKSeq_dyn_fx ); - free( hHrtf->ModelParamsITD.W_dyn_fx ); - free( hHrtf->ModelParamsITD.azimBsShape_dyn_fx ); - free( hHrtf->ModelParamsITD.elevBsShape_dyn_fx ); + header_check_result = IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); } - free( hHrtf->ModelParams.elevKSeq_dyn_fx ); - free( hHrtf->ModelParams.azim_start_idx_dyn ); - free( hHrtf->ModelParams.azimDim2_dyn ); - free( hHrtf->ModelParams.azimDim3_dyn ); - free( hHrtf->ModelParams.AlphaL_dyn_fx ); - free( hHrtf->ModelParams.AlphaR_dyn_fx ); - free( hHrtf->ModelParams.azimSegSamples_dyn ); - free( hHrtf->ModelParams.azimShapeIdx_dyn ); - free( hHrtf->ModelParams.azimShapeSampFactor_dyn ); - free( hHrtf->ModelParams.elevBsShape_dyn_fx ); + HrFiltSet_p->FilterMethod = (TDREND_HRFILT_Method_t) tmp; - for ( i = 0; i < hHrtf->ModelParams.num_unique_azim_splines; i++ ) + if ( HrFiltSet_p->FilterMethod != TDREND_HRFILT_Method_BSplineModel ) { - free( hHrtf->ModelParams.azimBsShape_dyn_fx[i] ); - free( &hHrtf->ModelParams.azimBsShape_dyn_fx[i] ); + header_check_result = IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "The HR filter set file is not a supported type." ); } - - free( (void *) hHrtf->ModelParams.azimBsShape_fx ); /* void* cast needed to please both gcc and Visual studio compilers. Deallocating const float** should be fine and gcc agrees, but Visual studio complains. */ - FOR( i = 0; i < hHrtf->ModelParams.elevDim3; i++ ) + else { - free( hHrtf->ModelParams.azimKSeq_fx[i] ); + header_check_result = TDREND_LoadBSplineBinary( HrFiltSet_p, f_hrtf ); } - free( hHrtf->ModelParams.azimKSeq_fx ); - - free( hHrtf->ModelParams.EL_dyn_fx ); - free( hHrtf->ModelParams.ER_dyn_fx ); - free( hHrtf->ModelEval.hrfModL_fx ); - free( hHrtf->ModelEval.hrfModR_fx ); - for ( i = 0; i < 3; i++ ) - { - free( hHrtf->lr_energy_and_iac_dyn_fx[i] ); - } + return header_check_result; } - return error; -} + is_tdrend = FALSE; + hrtf_data_size_max = hrtfs_file_header.max_data_size; -/*---------------------------------------------------------------------* - * create_HRTF_from_rawdata() - * - * Create HRTF from the raw data (to the HRTF CRend handle) - *---------------------------------------------------------------------*/ + /* Allocate the memory */ -static ivas_error create_HRTF_from_rawdata( - HRTFS_HANDLE *hHRTF, /* i/o: HRTF CRend handle */ - char *hrtf_data /* i : pointer to binary file */ -) -{ - int16_t i, j, k; - int16_t max_num_iterations_diffuse; - uint16_t max_total_num_fsamp_per_iteration, max_total_num_fsamp_per_iteration_diff; - uint32_t mem_size; - char *hrtf_data_rptr; - Word32 *pOut_to_bin_wptr_fx; - ivas_error error; + if ( hrtf_data_size_max == 0 ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (hrtf_data_size_max)" ); + } + + hrtf_data = (char *) malloc( hrtf_data_size_max ); + if ( hrtf_data == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } - if ( *hHRTF == NULL ) + for ( hrtf_id = 0; ( hrtf_id < hrtfs_file_header.nb_hrtf ) && ( !is_tdrend ); hrtf_id++ ) { - if ( ( ( *hHRTF ) = (HRTFS_HANDLE) malloc( sizeof( HRTFS_DATA ) ) ) == NULL ) + if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK ) + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "HRTF binary file not compliant (number of HRTF)" ); + } + + if ( ( header_check_result = check_hrtf_binary_header( &hrtf_header ) ) != IVAS_ERR_OK ) { - return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Can not allocate memory for HRTF binary data\n" ); + free( hrtf_data ); + return header_check_result; } - if ( ( error = ivas_hrtf_init( *hHRTF ) ) != IVAS_ERR_OK ) + is_tdrend = ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD ); + if ( !is_tdrend ) { - return error; + if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); + } + } + else + { + if ( hrtf_header.frequency != sampleRate ) + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF invalid sampling rate" ); + } + } + } + + free( hrtf_data ); + + if ( is_tdrend ) + { + if ( fread( &tmp, 1, sizeof( int16_t ), f_hrtf ) == 0 ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); + } + + HrFiltSet_p->FilterMethod = (TDREND_HRFILT_Method_t) tmp; + + if ( HrFiltSet_p->FilterMethod != TDREND_HRFILT_Method_BSplineModel ) + { + header_check_result = IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "The HR filter set file is not a supported type." ); + } + else + { + header_check_result = TDREND_LoadBSplineBinary( HrFiltSet_p, f_hrtf ); } } else { - return IVAS_ERR_INTERNAL; + return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; } + return header_check_result; +} + + +/*---------------------------------------------------------------------* + * load_TDrend_HRTF_binary() + * + * Load HRTF binary data into the HRTF handle for TD renderer + *---------------------------------------------------------------------*/ + +ivas_error load_TDrend_HRTF_binary( + IVAS_DEC_HRTF_TD_HANDLE hHrtf, /* i/o: TD rend. HRTF handle */ + const int32_t sampleRate, /* i : sample rate */ + const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ +) +{ + if ( hrtfReader == NULL || hrtfReader->file == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + fseek( hrtfReader->file, 0, SEEK_SET ); + + return TDREND_MIX_LoadHRTF( hrtfReader->file, sampleRate, hHrtf ); +} + + +/*---------------------------------------------------------------------* + * destroy_td_hrtf() + * + * Deallocated memory allocated by load_HRTF_binary for TD renderer + *---------------------------------------------------------------------*/ + +void destroy_td_hrtf( + IVAS_DEC_HRTF_TD_HANDLE *hHrtf /* i/o: TD rend. HRTF handle */ +) +{ + int16_t i; + + if ( ( hHrtf == NULL ) || ( *hHrtf == NULL ) ) + { + return; + } + + if ( !( *hHrtf )->ModelParams.modelROM ) + { + if ( ( *hHrtf )->ModelParams.UseItdModel ) + { + free( ( *hHrtf )->ModelParamsITD.elevKSeq_dyn_fx ); + free( ( *hHrtf )->ModelParamsITD.azimKSeq_dyn_fx ); + free( ( *hHrtf )->ModelParamsITD.W_dyn_fx ); + free( ( *hHrtf )->ModelParamsITD.azimBsShape_dyn_fx ); + free( ( *hHrtf )->ModelParamsITD.elevBsShape_dyn_fx ); + free( ( *hHrtf )->ModelParamsITD.azimBsLen_dyn_fx ); + free( ( *hHrtf )->ModelParamsITD.azimBsStart_dyn_fx ); + free( ( *hHrtf )->ModelParamsITD.elevBsLen_dyn_fx ); + free( ( *hHrtf )->ModelParamsITD.elevBsStart_dyn_fx ); + } + free( ( *hHrtf )->ModelParams.elevKSeq_dyn_fx ); + free( ( *hHrtf )->ModelParams.azim_start_idx_dyn ); + free( ( *hHrtf )->ModelParams.azimDim3_dyn ); + free( ( *hHrtf )->ModelParams.AlphaL_dyn_fx ); + free( ( *hHrtf )->ModelParams.AlphaR_dyn_fx ); + free( ( *hHrtf )->ModelParams.azimSegSamples_dyn ); + + free( ( *hHrtf )->ModelParams.azimShapeIdx_dyn ); + free( ( *hHrtf )->ModelParams.azimShapeSampFactor_dyn ); + free( ( *hHrtf )->ModelParams.elevBsLen_dyn ); + free( ( *hHrtf )->ModelParams.elevBsStart_dyn ); + free( ( *hHrtf )->ModelParams.elevBsShape_dyn_fx ); + + for ( i = 0; i < ( *hHrtf )->ModelParams.num_unique_azim_splines; i++ ) + { + free( ( *hHrtf )->ModelParams.azimBsShape_dyn_fx[i] ); + } + free( ( *hHrtf )->ModelParams.azimBsShape_dyn_fx ); + + free( (void *) ( *hHrtf )->ModelParams.azimBsShape_fx ); /* void* cast needed to please both gcc and Visual studio compilers. Deallocating const float** should be fine and gcc agrees, but Visual studio complains. */ + for ( i = 0; i < ( *hHrtf )->ModelParams.elevDim3; i++ ) + { + free( ( *hHrtf )->ModelParams.azimKSeq_fx[i] ); + } + free( ( *hHrtf )->ModelParams.azimKSeq_fx ); + + free( ( *hHrtf )->ModelParams.EL_dyn_fx ); + free( ( *hHrtf )->ModelParams.ER_dyn_fx ); + + free( ( *hHrtf )->ModelEval.hrfModL_fx ); + free( ( *hHrtf )->ModelEval.hrfModR_fx ); + } + + ivas_HRTF_binary_close_fx( hHrtf ); + + return; +} + + +/*---------------------------------------------------------------------* + * create_Crend_HRTF_from_rawdata() + * + * Create HRTF from the raw data (to the HRTF CRend handle) + *---------------------------------------------------------------------*/ + +static ivas_error create_Crend_HRTF_from_rawdata( + HRTFS_CREND_HANDLE *hHRTF, /* i/o: HRTF CRend handle */ + char *hrtf_data /* i : pointer to binary file */ +) +{ + Word16 i, j, k, l; + Word16 max_num_iterations_diffuse; + Word32 max_total_num_fsamp_per_iteration, max_total_num_fsamp_per_iteration_diff; + Word32 mem_size, mem_size_buf; + char *hrtf_data_rptr; + Word16 *pOut_to_bin_wptr; + ivas_error error; + + if ( hrtf_data == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + ( *hHRTF )->init_from_rom = 0; hrtf_data_rptr = hrtf_data; + /* latency_s Q factor*/ + ( *hHRTF )->factor_Q_latency_s_fx = Q31 - *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); /* latency_s */ - //( *hHRTF )->latency_s = *( (float *) ( hrtf_data_rptr ) ); - ( *hHRTF )->latency_s_fx = (Word32) ( *( (float *) ( hrtf_data_rptr ) ) * (float) ONE_IN_Q31 ); - hrtf_data_rptr += sizeof( float ); + ( *hHRTF )->latency_s_fx = ( *( (Word32 *) ( hrtf_data_rptr ) ) ); + hrtf_data_rptr += sizeof( Word32 ); /* max_num_ir */ - ( *hHRTF )->max_num_ir = *( (UWord16 *) ( hrtf_data_rptr ) ); - hrtf_data_rptr += sizeof( UWord16 ); + ( *hHRTF )->max_num_ir = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); /* BINAURAL_CHANNELS */ if ( BINAURAL_CHANNELS != *( (Word16 *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file format not compliant (BINAURAL_CHANNELS)" ); } - hrtf_data_rptr += sizeof( UWord16 ); + hrtf_data_rptr += sizeof( Word16 ); /* max_num_iterations */ ( *hHRTF )->max_num_iterations = *( (Word16 *) ( hrtf_data_rptr ) ); @@ -869,23 +1135,24 @@ static ivas_error create_HRTF_from_rawdata( { for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { - ( *hHRTF )->num_iterations[i][j] = *( (UWord16 *) ( hrtf_data_rptr ) ); - hrtf_data_rptr += sizeof( UWord16 ); + ( *hHRTF )->num_iterations[i][j] = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); } } + mem_size = ( *hHRTF )->max_num_iterations * sizeof( Word16 ); + /* pIndex_frequency_max */ for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) { for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { - mem_size = ( *hHRTF )->max_num_iterations * sizeof( UWord16 ); - ( *hHRTF )->pIndex_frequency_max[i][j] = (UWord16 *) malloc( mem_size ); - if ( ( *hHRTF )->pIndex_frequency_max[i][j] == NULL ) + if ( ( error = ivas_HRTF_CRend_binary_open_buffers_int16( &( *hHRTF )->pIndex_frequency_max_dyn_fx[i][j], mem_size ) ) != IVAS_ERR_OK ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for pIndex_frequency_max" ); + return error; } - memcpy( ( *hHRTF )->pIndex_frequency_max[i][j], hrtf_data_rptr, mem_size ); + memcpy( ( *hHRTF )->pIndex_frequency_max_dyn_fx[i][j], hrtf_data_rptr, mem_size ); + ( *hHRTF )->pIndex_frequency_max[i][j] = ( *hHRTF )->pIndex_frequency_max_dyn_fx[i][j]; hrtf_data_rptr += mem_size; } } @@ -899,501 +1166,486 @@ static ivas_error create_HRTF_from_rawdata( /* num_iterations_diffuse */ for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { - ( *hHRTF )->num_iterations_diffuse[j] = *( (UWord16 *) ( hrtf_data_rptr ) ); - hrtf_data_rptr += sizeof( UWord16 ); + ( *hHRTF )->num_iterations_diffuse[j] = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); } /* pIndex_frequency_max_diffuse (the size depends on num_iterations_diffuse) */ for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { - mem_size = ( *hHRTF )->num_iterations_diffuse[j] * sizeof( UWord16 ); - ( *hHRTF )->pIndex_frequency_max_diffuse[j] = (UWord16 *) malloc( mem_size ); - if ( ( *hHRTF )->pIndex_frequency_max_diffuse[j] == NULL ) + mem_size = ( *hHRTF )->num_iterations_diffuse[j] * sizeof( uint16_t ); + if ( ( error = ivas_HRTF_CRend_binary_open_buffers_int16( &( *hHRTF )->pIndex_frequency_max_diffuse_dyn_fx[j], mem_size ) ) != IVAS_ERR_OK ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for pIndex_frequency_max_diffuse" ); + return error; } - memcpy( ( *hHRTF )->pIndex_frequency_max_diffuse[j], hrtf_data_rptr, mem_size ); + memcpy( ( *hHRTF )->pIndex_frequency_max_diffuse_dyn_fx[j], hrtf_data_rptr, mem_size ); + ( *hHRTF )->pIndex_frequency_max_diffuse[j] = ( *hHRTF )->pIndex_frequency_max_diffuse_dyn_fx[j]; hrtf_data_rptr += mem_size; } } /* index_frequency_max_diffuse */ - ( *hHRTF )->index_frequency_max_diffuse = *( (UWord16 *) ( hrtf_data_rptr ) ); - hrtf_data_rptr += sizeof( UWord16 ); + ( *hHRTF )->index_frequency_max_diffuse = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( uint16_t ); + + /* inv_diffuse_weight Q factor*/ + ( *hHRTF )->factor_Q_inv_diffuse_weight = Q15 - *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); /* inv_diffuse_weight */ for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) { - //( *hHRTF )->inv_diffuse_weight[i] = *( (float *) ( hrtf_data_rptr ) ); - ( *hHRTF )->inv_diffuse_weight_fx[i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); - hrtf_data_rptr += sizeof( float ); + ( *hHRTF )->inv_diffuse_weight_fx[0][i] = ( *( (Word16 *) ( hrtf_data_rptr ) ) ); + hrtf_data_rptr += sizeof( Word16 ); } + for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + { + ( *hHRTF )->inv_diffuse_weight_fx[1][i] = ( *( (Word16 *) ( hrtf_data_rptr ) ) ); + hrtf_data_rptr += sizeof( Word16 ); + } /* max_total_num_fsamp_per_iteration */ - max_total_num_fsamp_per_iteration = *( (UWord16 *) ( hrtf_data_rptr ) ); - hrtf_data_rptr += sizeof( UWord16 ); + max_total_num_fsamp_per_iteration = *( (Word32 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word32 ); + ( *hHRTF )->factor_Q_pOut_to_bin = Q15 - *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); + + mem_size_buf = max_total_num_fsamp_per_iteration * sizeof( Word16 ); /* coeff_re (the size depends on pIndex_frequency_max) */ for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) { for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { - mem_size = max_total_num_fsamp_per_iteration * sizeof( float ); - ( *hHRTF )->pOut_to_bin_re_fx[i][j] = (Word32 *) malloc( mem_size ); - if ( ( *hHRTF )->pOut_to_bin_re_fx[i][j] == NULL ) + if ( ( error = ivas_HRTF_CRend_binary_open_buffers_int16( &( *hHRTF )->pOut_to_bin_re_dyn_fx[i][j], mem_size_buf ) ) != IVAS_ERR_OK ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for Out_to_bin_re" ); + return error; } - memset( ( *hHRTF )->pOut_to_bin_re_fx[i][j], 0x00, mem_size ); - - pOut_to_bin_wptr_fx = ( *hHRTF )->pOut_to_bin_re_fx[i][j]; + memset( ( *hHRTF )->pOut_to_bin_re_dyn_fx[i][j], 0x00, mem_size_buf ); + ( *hHRTF )->pOut_to_bin_re_fx[i][j] = ( *hHRTF )->pOut_to_bin_re_dyn_fx[i][j]; + pOut_to_bin_wptr = ( *hHRTF )->pOut_to_bin_re_dyn_fx[i][j]; for ( k = 0; k < ( *hHRTF )->num_iterations[i][j]; k++ ) { - mem_size = ( *hHRTF )->pIndex_frequency_max[i][j][k] * sizeof( float ); - // memcpy( pOut_to_bin_wptr, hrtf_data_rptr, mem_size ); - for ( Word16 l = 0; l < ( *hHRTF )->pIndex_frequency_max[i][j][k]; l++ ) + mem_size = ( *hHRTF )->pIndex_frequency_max[i][j][k] * sizeof( Word16 ); + Word16 *ptW = (Word16 *) hrtf_data_rptr; + for ( l = 0; l < ( *hHRTF )->pIndex_frequency_max[i][j][k]; l++ ) { - float *tmp, temp_buf[1]; - tmp = temp_buf; - memcpy( tmp, hrtf_data_rptr, sizeof( float ) ); - pOut_to_bin_wptr_fx[l] = (Word32) ( *tmp * ONE_IN_Q29 ); - hrtf_data_rptr += sizeof( float ); + pOut_to_bin_wptr[l] = ptW[l]; } - // hrtf_data_rptr += mem_size; - pOut_to_bin_wptr_fx += ( *hHRTF )->pIndex_frequency_max[i][j][k]; + hrtf_data_rptr += mem_size; + pOut_to_bin_wptr += ( *hHRTF )->pIndex_frequency_max[i][j][k]; } } } - mem_size = max_total_num_fsamp_per_iteration * sizeof( float ); + /* coeff_im (the size depends on pIndex_frequency_max) */ for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) { for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { - mem_size = max_total_num_fsamp_per_iteration * sizeof( float ); - ( *hHRTF )->pOut_to_bin_im_fx[i][j] = (Word32 *) malloc( mem_size ); - if ( ( *hHRTF )->pOut_to_bin_im_fx[i][j] == NULL ) + if ( ( error = ivas_HRTF_CRend_binary_open_buffers_int16( &( *hHRTF )->pOut_to_bin_im_dyn_fx[i][j], mem_size_buf ) ) != IVAS_ERR_OK ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for Out_to_bin_im" ); + return error; } - memset( ( *hHRTF )->pOut_to_bin_im_fx[i][j], 0x00, mem_size ); - pOut_to_bin_wptr_fx = ( *hHRTF )->pOut_to_bin_im_fx[i][j]; + memset( ( *hHRTF )->pOut_to_bin_im_dyn_fx[i][j], 0x00, mem_size_buf ); + ( *hHRTF )->pOut_to_bin_im_fx[i][j] = ( *hHRTF )->pOut_to_bin_im_dyn_fx[i][j]; + + pOut_to_bin_wptr = ( *hHRTF )->pOut_to_bin_im_dyn_fx[i][j]; for ( k = 0; k < ( *hHRTF )->num_iterations[i][j]; k++ ) { - mem_size = ( *hHRTF )->pIndex_frequency_max[i][j][k] * sizeof( float ); - // memcpy( pOut_to_bin_wptr, hrtf_data_rptr, mem_size ); - for ( Word16 l = 0; l < ( *hHRTF )->pIndex_frequency_max[i][j][k]; l++ ) + mem_size = ( *hHRTF )->pIndex_frequency_max[i][j][k] * sizeof( Word16 ); + Word16 *ptW = (Word16 *) hrtf_data_rptr; + for ( l = 0; l < ( *hHRTF )->pIndex_frequency_max[i][j][k]; l++ ) { - float *tmp, temp_buf[1]; - tmp = temp_buf; - memcpy( tmp, hrtf_data_rptr, sizeof( float ) ); - pOut_to_bin_wptr_fx[l] = (Word32) ( *tmp * ONE_IN_Q29 ); - hrtf_data_rptr += sizeof( float ); + pOut_to_bin_wptr[l] = ptW[l]; } - // hrtf_data_rptr += mem_size; - pOut_to_bin_wptr_fx += ( *hHRTF )->pIndex_frequency_max[i][j][k]; + hrtf_data_rptr += mem_size; + pOut_to_bin_wptr += ( *hHRTF )->pIndex_frequency_max[i][j][k]; } } } - mem_size = max_total_num_fsamp_per_iteration * sizeof( float ); /* max_total_num_fsamp_per_iteration_diff */ - max_total_num_fsamp_per_iteration_diff = *( (uint16_t *) ( hrtf_data_rptr ) ); - hrtf_data_rptr += sizeof( uint16_t ); + max_total_num_fsamp_per_iteration_diff = *( (uint32_t *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( uint32_t ); + + mem_size_buf = max_total_num_fsamp_per_iteration_diff * sizeof( Word16 ); if ( max_total_num_fsamp_per_iteration_diff != 0 ) { + /* factorQ = *( (Word16 *) ( hrtf_data_rptr ) ); */ + /* hrtf_data_rptr += sizeof( Word16 ); */ /* coeff_diffuse_re : The size depends on pIndex_frequency_max_diffuse */ for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { - mem_size = max_total_num_fsamp_per_iteration_diff * sizeof( float ); - - ( *hHRTF )->pOut_to_bin_diffuse_re_fx[j] = (Word32 *) malloc( mem_size ); - if ( ( *hHRTF )->pOut_to_bin_diffuse_re_fx[j] == NULL ) + if ( ( error = ivas_HRTF_CRend_binary_open_buffers_int16( &( *hHRTF )->pOut_to_bin_diffuse_re_dyn_fx[j], mem_size_buf ) ) != IVAS_ERR_OK ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for pOut_to_bin_diffuse_re" ); + return error; } - memset( ( *hHRTF )->pOut_to_bin_diffuse_re_fx[j], 0x00, mem_size ); - pOut_to_bin_wptr_fx = ( *hHRTF )->pOut_to_bin_diffuse_re_fx[j]; + memset( ( *hHRTF )->pOut_to_bin_diffuse_re_dyn_fx[j], 0x00, mem_size_buf ); + ( *hHRTF )->pOut_to_bin_diffuse_re_fx[j] = ( *hHRTF )->pOut_to_bin_diffuse_re_dyn_fx[j]; + + pOut_to_bin_wptr = ( *hHRTF )->pOut_to_bin_diffuse_re_dyn_fx[j]; for ( k = 0; k < ( *hHRTF )->num_iterations_diffuse[j]; k++ ) { - mem_size = ( *hHRTF )->pIndex_frequency_max_diffuse[j][k] * sizeof( float ); - // memcpy( pOut_to_bin_wptr, hrtf_data_rptr, mem_size ); - for ( Word16 l = 0; l < ( *hHRTF )->pIndex_frequency_max_diffuse[j][k]; l++ ) + mem_size = ( *hHRTF )->pIndex_frequency_max_diffuse[j][k] * sizeof( Word16 ); + Word16 *ptW = (Word16 *) hrtf_data_rptr; + for ( l = 0; l < ( *hHRTF )->pIndex_frequency_max_diffuse[j][k]; l++ ) { - float *tmp, temp_buf[1]; - tmp = temp_buf; - memcpy( tmp, hrtf_data_rptr, sizeof( float ) ); - pOut_to_bin_wptr_fx[l] = (Word32) ( *tmp * ONE_IN_Q29 ); - hrtf_data_rptr += sizeof( float ); + pOut_to_bin_wptr[l] = ptW[l]; } - // hrtf_data_rptr += mem_size; - pOut_to_bin_wptr_fx += ( *hHRTF )->pIndex_frequency_max_diffuse[j][k]; + hrtf_data_rptr += mem_size; + pOut_to_bin_wptr += ( *hHRTF )->pIndex_frequency_max_diffuse[j][k]; } } - mem_size = max_total_num_fsamp_per_iteration_diff * sizeof( float ); /* coeff_diffuse_im : The size depends on pIndex_frequency_max_diffuse */ for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { - mem_size = max_total_num_fsamp_per_iteration_diff * sizeof( float ); - - ( *hHRTF )->pOut_to_bin_diffuse_im_fx[j] = (Word32 *) malloc( mem_size ); - if ( ( *hHRTF )->pOut_to_bin_diffuse_im_fx[j] == NULL ) + if ( ( error = ivas_HRTF_CRend_binary_open_buffers_int16( &( *hHRTF )->pOut_to_bin_diffuse_im_dyn_fx[j], mem_size_buf ) ) != IVAS_ERR_OK ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for pOut_to_bin_diffuse_im" ); + return error; } - memset( ( *hHRTF )->pOut_to_bin_diffuse_im_fx[j], 0x00, mem_size ); - pOut_to_bin_wptr_fx = ( *hHRTF )->pOut_to_bin_diffuse_im_fx[j]; + memset( ( *hHRTF )->pOut_to_bin_diffuse_im_dyn_fx[j], 0x00, mem_size_buf ); + ( *hHRTF )->pOut_to_bin_diffuse_im_fx[j] = ( *hHRTF )->pOut_to_bin_diffuse_im_dyn_fx[j]; + + pOut_to_bin_wptr = ( *hHRTF )->pOut_to_bin_diffuse_im_dyn_fx[j]; for ( k = 0; k < ( *hHRTF )->num_iterations_diffuse[j]; k++ ) { - mem_size = ( *hHRTF )->pIndex_frequency_max_diffuse[j][k] * sizeof( float ); - // memcpy( pOut_to_bin_wptr, hrtf_data_rptr, mem_size ); - for ( Word16 l = 0; l < ( *hHRTF )->pIndex_frequency_max_diffuse[j][k]; l++ ) + mem_size = ( *hHRTF )->pIndex_frequency_max_diffuse[j][k] * sizeof( Word16 ); + Word16 *ptW = (Word16 *) hrtf_data_rptr; + for ( l = 0; l < ( *hHRTF )->pIndex_frequency_max_diffuse[j][k]; l++ ) { - float *tmp, temp_buf[1]; - tmp = temp_buf; - memcpy( tmp, hrtf_data_rptr, sizeof( float ) ); - pOut_to_bin_wptr_fx[l] = (Word32) ( *tmp * ONE_IN_Q29 ); - hrtf_data_rptr += sizeof( float ); + pOut_to_bin_wptr[l] = ptW[l]; } - // hrtf_data_rptr += mem_size; - pOut_to_bin_wptr_fx += ( *hHRTF )->pIndex_frequency_max_diffuse[j][k]; + hrtf_data_rptr += mem_size; + pOut_to_bin_wptr += ( *hHRTF )->pIndex_frequency_max_diffuse[j][k]; } } - mem_size = max_total_num_fsamp_per_iteration_diff * sizeof( float ); } return IVAS_ERR_OK; } +/*---------------------------------------------------------------------* + * create_fastconv_HRTF_from_rawdata() + * + * Create HRTF from the raw data (to the HRTF FastConv handle) + *---------------------------------------------------------------------*/ static ivas_error create_fastconv_HRTF_from_rawdata( - HRTFS_FASTCONV_HANDLE *hHRTF, /* i/o: HRTF FastConv handle */ - char *hrtf_data, /* i : pointer to binary file */ - RENDERER_TYPE rend_type, /* i : Renderer type */ - BINAURAL_INPUT_AUDIO_CONFIG input_cfg /* i : Input binaural config */ + HRTFS_FASTCONV_HANDLE *hHRTF, /* i/o: HRTF FastConv handle */ + char *hrtf_data, /* i : pointer to binary file */ + HRTF_READER_RENDERER_TYPE rend_type, /* i : Renderer type */ + const BINAURAL_INPUT_AUDIO_CONFIG input_cfg /* i : Input binaural config */ ) { - int16_t i, j; - float f_tmp; - float f_tmp_ntaps_sba[BINAURAL_NTAPS]; - float f_tmp_ntaps_max[BINAURAL_NTAPS_MAX]; - float f_tmp_brir_reverb[CLDFB_NO_CHANNELS_MAX]; + Word16 i, j, k; char *hrtf_data_rptr; + ivas_error error; + Word16 factorQ; + Word16 *ptW16; + Word32 latency_s; + UWord16 ntaps; + UWord16 nbchan; + + if ( hrtf_data == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + ( *hHRTF )->allocate_init_flag = 0; - ivas_allocate_binaural_hrtf_fx( *hHRTF, 0, input_cfg, rend_type, ( *hHRTF )->allocate_init_flag ); hrtf_data_rptr = hrtf_data; - /* BINAURAL_CONVBANDS */ + /* latency_s Q factor*/ + factorQ = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); + + /* latency_s */ + latency_s = *( (Word32 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word32 ); + if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); } hrtf_data_rptr += sizeof( uint16_t ); - /* HRIR */ - if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) - { - f_tmp = *( (float *) ( hrtf_data_rptr ) ); - hrtf_data_rptr += sizeof( float ); - ( *hHRTF )->FASTCONV_HRIR_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); + nbchan = *( (uint16_t *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( uint16_t ); - if ( HRTF_LS_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_LS_CHANNELS)" ); - } - hrtf_data_rptr += sizeof( uint16_t ); + ntaps = *( (uint16_t *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( uint16_t ); - if ( BINAURAL_NTAPS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS)" ); - } - hrtf_data_rptr += sizeof( uint16_t ); + ( *hHRTF )->ntaps = ntaps; + ( *hHRTF )->FASTCONV_latency_s_Q_fx = Q31 - factorQ; + ( *hHRTF )->FASTCONV_latency_s_fx = latency_s; + ( *hHRTF )->n_channels = nbchan; - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) - { - for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->leftHRIRReal_fx[i][j], Q29, BINAURAL_NTAPS ); - } - } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) - { - for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->leftHRIRImag_fx[i][j], Q29, BINAURAL_NTAPS ); - } - } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) - { - for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->rightHRIRReal_fx[i][j], Q29, BINAURAL_NTAPS ); - } - } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + { + if ( HRTF_LS_CHANNELS != nbchan ) { - for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->rightHRIRImag_fx[i][j], Q29, BINAURAL_NTAPS ); - } + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_LS_CHANNELS)" ); } } - else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) + else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) { - /* HRIR_HOA3 */ - f_tmp = *( (float *) ( hrtf_data_rptr ) ); - ( *hHRTF )->FASTCONV_HOA3_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); - hrtf_data_rptr += sizeof( float ); - - if ( HOA3_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + if ( HOA3_CHANNELS != nbchan ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HOA3_CHANNELS)" ); } - hrtf_data_rptr += sizeof( uint16_t ); - - if ( BINAURAL_NTAPS_SBA != *( (uint16_t *) ( hrtf_data_rptr ) ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS_SBA)" ); - } - hrtf_data_rptr += sizeof( uint16_t ); - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) - { - for ( j = 0; j < HOA3_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->leftHRIRReal_HOA3_fx[i][j], Q29, BINAURAL_NTAPS_SBA ); - } - } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) - { - for ( j = 0; j < HOA3_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->leftHRIRImag_HOA3_fx[i][j], Q29, BINAURAL_NTAPS_SBA ); - } - } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) - { - for ( j = 0; j < HOA3_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->rightHRIRReal_HOA3_fx[i][j], Q29, BINAURAL_NTAPS_SBA ); - } - } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) - { - for ( j = 0; j < HOA3_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); -#ifdef MSAN_FIX - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->rightHRIRImag_HOA3_fx[i][j], Q29, BINAURAL_NTAPS_SBA ); -#else - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->rightHRIRReal_HOA3_fx[i][j], Q29, BINAURAL_NTAPS_SBA ); -#endif - } - } } - else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) { - /* HRIR_HOA2 */ - f_tmp = *( (float *) ( hrtf_data_rptr ) ); - ( *hHRTF )->FASTCONV_HOA2_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); - hrtf_data_rptr += sizeof( float ); - if ( HOA2_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + if ( HOA2_CHANNELS != nbchan ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HOA2_CHANNELS)" ); } - hrtf_data_rptr += sizeof( uint16_t ); - - if ( BINAURAL_NTAPS_SBA != *( (uint16_t *) ( hrtf_data_rptr ) ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS_SBA)" ); - } - hrtf_data_rptr += sizeof( uint16_t ); - - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) - { - for ( j = 0; j < HOA2_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->leftHRIRReal_HOA2_fx[i][j], Q29, BINAURAL_NTAPS_SBA ); - } - } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + } + else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + if ( FOA_CHANNELS != nbchan ) { - for ( j = 0; j < HOA2_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->leftHRIRImag_HOA2_fx[i][j], Q29, BINAURAL_NTAPS_SBA ); - } + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (FOA_CHANNELS)" ); } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + } + else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + { + if ( HRTF_LS_CHANNELS != nbchan ) { - for ( j = 0; j < HOA2_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->rightHRIRReal_HOA2_fx[i][j], Q29, BINAURAL_NTAPS_SBA ); - } + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_LS_CHANNELS)" ); } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + } + else + { + return IVAS_ERROR( IVAS_ERR_BITSTREAM_READER_INVALID_FORMAT, "Can not read hrtf binary file : wrong render type and input config couple " ); + } + + if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV ) + { + if ( ( error = ivas_allocate_binaural_hrtf_fx( *hHRTF, nbchan, ( *hHRTF )->allocate_init_flag ) ) != IVAS_ERR_OK ) { - for ( j = 0; j < HOA2_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->rightHRIRImag_HOA2_fx[i][j], Q29, BINAURAL_NTAPS_SBA ); - } + return error; } } - else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM ) { - /* HRIR_FOA */ - f_tmp = *( (float *) ( hrtf_data_rptr ) ); - ( *hHRTF )->FASTCONV_FOA_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); - hrtf_data_rptr += sizeof( float ); - if ( FOA_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + if ( ( error = ivas_allocate_binaural_hrtf_fx( *hHRTF, nbchan, ( *hHRTF )->allocate_init_flag ) ) != IVAS_ERR_OK ) { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (FOA_CHANNELS)" ); + return error; } - hrtf_data_rptr += sizeof( uint16_t ); + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "renderer type not compliant" ); + } - if ( BINAURAL_NTAPS_SBA != *( (uint16_t *) ( hrtf_data_rptr ) ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS_SBA)" ); - } - hrtf_data_rptr += sizeof( uint16_t ); + /* HRIR/BRIR Q factor*/ + factorQ = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < nbchan; j++ ) { - for ( j = 0; j < FOA_CHANNELS; j++ ) + ptW16 = (Word16 *) hrtf_data_rptr; + for ( k = 0; k < ntaps; k++ ) { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->leftHRIRReal_FOA_fx[i][j], Q29, BINAURAL_NTAPS_SBA ); + ( *hHRTF )->leftReal_fx[i][j][k] = L_shl_r( L_deposit_l( ptW16[k] ), Q29 - factorQ ); } + hrtf_data_rptr += ntaps * sizeof( Word16 ); } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < nbchan; j++ ) { - for ( j = 0; j < FOA_CHANNELS; j++ ) + ptW16 = (Word16 *) hrtf_data_rptr; + for ( k = 0; k < ntaps; k++ ) { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->leftHRIRImag_FOA_fx[i][j], Q29, BINAURAL_NTAPS_SBA ); + ( *hHRTF )->leftImag_fx[i][j][k] = L_shl_r( L_deposit_l( ptW16[k] ), Q29 - factorQ ); } + hrtf_data_rptr += ntaps * sizeof( Word16 ); } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < nbchan; j++ ) { - for ( j = 0; j < FOA_CHANNELS; j++ ) + ptW16 = (Word16 *) hrtf_data_rptr; + for ( k = 0; k < ntaps; k++ ) { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->rightHRIRReal_FOA_fx[i][j], Q29, BINAURAL_NTAPS_SBA ); + ( *hHRTF )->rightReal_fx[i][j][k] = L_shl_r( L_deposit_l( ptW16[k] ), Q29 - factorQ ); } + hrtf_data_rptr += ntaps * sizeof( Word16 ); } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < nbchan; j++ ) { - for ( j = 0; j < FOA_CHANNELS; j++ ) + ptW16 = (Word16 *) hrtf_data_rptr; + for ( k = 0; k < ntaps; k++ ) { - memcpy( f_tmp_ntaps_sba, hrtf_data_rptr, BINAURAL_NTAPS_SBA * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_sba, ( *hHRTF )->rightHRIRImag_FOA_fx[i][j], Q29, BINAURAL_NTAPS_SBA ); + ( *hHRTF )->rightImag_fx[i][j][k] = L_shl_r( L_deposit_l( ptW16[k] ), Q29 - factorQ ); } + hrtf_data_rptr += ntaps * sizeof( Word16 ); } } + /* BRIR */ - else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) { - f_tmp = *( (float *) ( hrtf_data_rptr ) ); - ( *hHRTF )->FASTCONV_BRIR_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); - hrtf_data_rptr += sizeof( float ); - if ( HRTF_LS_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + /* Reverb Parameters */ + if ( CLDFB_NO_CHANNELS_MAX != *( (UWord16 *) ( hrtf_data_rptr ) ) ) { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_LS_CHANNELS)" ); + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (CLDFB_NO_CHANNELS_MAX)" ); } - hrtf_data_rptr += sizeof( uint16_t ); + hrtf_data_rptr += sizeof( UWord16 ); - if ( BINAURAL_NTAPS_MAX != *( (uint16_t *) ( hrtf_data_rptr ) ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS)" ); - } - hrtf_data_rptr += sizeof( uint16_t ); + /* fastconvReverberationTimes Q factor*/ + factorQ = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + ptW16 = (Word16 *) hrtf_data_rptr; + for ( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) { - for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_max, hrtf_data_rptr, BINAURAL_NTAPS_MAX * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_max, ( *hHRTF )->leftBRIRReal_fx[i][j], Q29, BINAURAL_NTAPS_MAX ); - } + ( *hHRTF )->fastconvReverberationTimes_fx[j] = L_shl_r( L_deposit_l( ptW16[j] ), Q26 - factorQ ); } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( Word16 ); + + /* fastconvReverberationEneCorrections Q factor */ + factorQ = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); + + ptW16 = (Word16 *) hrtf_data_rptr; + for ( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) { - for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) - { - memcpy( f_tmp_ntaps_max, hrtf_data_rptr, BINAURAL_NTAPS_MAX * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_max, ( *hHRTF )->leftBRIRImag_fx[i][j], Q29, BINAURAL_NTAPS_MAX ); - } + ( *hHRTF )->fastconvReverberationEneCorrections_fx[j] = L_shl_r( L_deposit_l( ptW16[j] ), Q31 - factorQ ); + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( Word16 ); } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + } + return IVAS_ERR_OK; +} + +/*---------------------------------------------------------------------* + * create_parambin_HRTF_from_rawdata() + * + * + *---------------------------------------------------------------------*/ + +static ivas_error create_parambin_HRTF_from_rawdata( + HRTFS_PARAMBIN_HANDLE *hHRTF, /* i/o: Parametric binauralizer HRTF handle */ + char *hrtf_data /* i : pointer to binary file */ +) +{ + int16_t i, j, k; + char *hrtf_data_rptr; + uint32_t data_size_tmp; + Word16 factorQ; + int16_t *ptW16; + + if ( hrtf_data == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hrtf_data_rptr = hrtf_data; + + /* HRTF_SH_CHANNELS */ + if ( HRTF_SH_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_SH_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + /* HRTF_NUM_BINS */ + if ( HRTF_NUM_BINS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_NUM_BINS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + /* HRTF */ + /* Q factor*/ + factorQ = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); + + data_size_tmp = HRTF_NUM_BINS * sizeof( int16_t ); + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) { - for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) + ptW16 = (int16_t *) hrtf_data_rptr; + for ( k = 0; k < HRTF_NUM_BINS; k++ ) { - memcpy( f_tmp_ntaps_max, hrtf_data_rptr, BINAURAL_NTAPS_MAX * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_max, ( *hHRTF )->rightBRIRReal_fx[i][j], Q29, BINAURAL_NTAPS_MAX ); + + ( *hHRTF )->hrtfShCoeffsRe_fx[i][j][k] = shl_r( ptW16[k], Q14 - factorQ ); } + hrtf_data_rptr += data_size_tmp; } - for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + } + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) { - for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) + ptW16 = (int16_t *) hrtf_data_rptr; + for ( k = 0; k < HRTF_NUM_BINS; k++ ) { - memcpy( f_tmp_ntaps_max, hrtf_data_rptr, BINAURAL_NTAPS_MAX * sizeof( float ) ); - hrtf_data_rptr += BINAURAL_NTAPS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_ntaps_max, ( *hHRTF )->rightBRIRImag_fx[i][j], Q29, BINAURAL_NTAPS_MAX ); + ( *hHRTF )->hrtfShCoeffsIm_fx[i][j][k] = shl_r( ptW16[k], Q14 - factorQ ); } + hrtf_data_rptr += data_size_tmp; } + } - /* Reverb Parameters */ - if ( CLDFB_NO_CHANNELS_MAX != *( (uint16_t *) ( hrtf_data_rptr ) ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (CLDFB_NO_CHANNELS_MAX)" ); - } - hrtf_data_rptr += sizeof( uint16_t ); + /* Reverb Parameters */ + if ( CLDFB_NO_CHANNELS_MAX != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (CLDFB_NO_CHANNELS_MAX)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + /* Q factor*/ + factorQ = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); + + ptW16 = (int16_t *) hrtf_data_rptr; + for ( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + ( *hHRTF )->parametricReverberationTimes_fx[j] = L_shl_r( L_deposit_l( ptW16[j] ), Q26 - factorQ ); + } + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( int16_t ); + + /* Q factor*/ + factorQ = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); + + ptW16 = (int16_t *) hrtf_data_rptr; + for ( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + ( *hHRTF )->parametricReverberationEneCorrections_fx[j] = L_shl_r( L_deposit_l( ptW16[j] ), Q31 - factorQ ); + } + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( int16_t ); - memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); + /* Q factor*/ + factorQ = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); - memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); + ptW16 = (int16_t *) hrtf_data_rptr; + for ( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + ( *hHRTF )->parametricEarlyPartEneCorrection_fx[j] = L_shl_r( L_deposit_l( ptW16[j] ), Q28 - factorQ ); } + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( int16_t ); return IVAS_ERR_OK; } + /*---------------------------------------------------------------------* * load_fastconv_HRTF_from_binary() * @@ -1402,6 +1654,8 @@ static ivas_error create_fastconv_HRTF_from_rawdata( ivas_error load_fastconv_HRTF_from_binary( IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv, /* i/o: FastConv HRTF handle */ + const IVAS_AUDIO_CONFIG OutputConfig, /* i : output audio configuration */ + const IVAS_AUDIO_CONFIG hrtf_set_audio_cfg, /* i : HRTF set audio config. */ const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ ) { @@ -1412,6 +1666,17 @@ ivas_error load_fastconv_HRTF_from_binary( ivas_error header_check_result; ivas_hrtfs_file_header_t hrtfs_file_header; int16_t hrtf_id; + int16_t asFastconv = 0; + bool load = false; + BINAURAL_INPUT_AUDIO_CONFIG hrtf_set_binaural_cfg; + + /* convert audio config. to HRTF binaural config */ + hrtf_set_binaural_cfg = audio_cfg_2_binaural_cfg( hrtf_set_audio_cfg ); + + if ( hrtfReader == NULL || hrtfReader->file == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } f_hrtf = hrtfReader->file; @@ -1443,8 +1708,24 @@ ivas_error load_fastconv_HRTF_from_binary( free( hrtf_data ); return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "HRTF binary file not compliant (number of HRTF)" ); } - if ( ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV ) || ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) + + if ( ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && /* HRIRs */ + ( OutputConfig == IVAS_AUDIO_CONFIG_BINAURAL || OutputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) || + ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM && /* BRIRs */ + OutputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || + ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && ( OutputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || OutputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) + { + load = ( (BINAURAL_INPUT_AUDIO_CONFIG) hrtf_header.input_cfg == hrtf_set_binaural_cfg ) ? true : false; + } + + if ( load ) { + if ( hrtf_header.frequency != 48000 ) /* note: Parametric renderer data are always stored at 48 kHz */ + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF invalid sampling rate" ); + } + if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) { free( hrtf_data ); @@ -1455,8 +1736,11 @@ ivas_error load_fastconv_HRTF_from_binary( if ( ( create_fastconv_HRTF_from_rawdata( &hHrtfFastConv, hrtf_data, hrtf_header.rend_type, hrtf_header.input_cfg ) ) != IVAS_ERR_OK ) { free( hrtf_data ); - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" ); + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create FastConv HRTF from binary file" ); } + asFastconv = 1; + + break; /* read just one set */ } else { @@ -1465,92 +1749,17 @@ ivas_error load_fastconv_HRTF_from_binary( } free( hrtf_data ); - return IVAS_ERR_OK; -} - - -/*---------------------------------------------------------------------* - * create_parambin_HRTF_from_rawdata() - * - * - *---------------------------------------------------------------------*/ -static ivas_error create_parambin_HRTF_from_rawdata( - HRTFS_PARAMBIN_HANDLE *hHRTF, /* i/o: Parametric binauralizer HRTF handle */ - char *hrtf_data /* i : pointer to binary file */ -) -{ - int16_t i, j; - char *hrtf_data_rptr; - uint32_t data_size_tmp; - - float f_tmp_hrtfShCoeffs[HRTF_NUM_BINS]; - float f_tmp_reverb[CLDFB_NO_CHANNELS_MAX]; - - hrtf_data_rptr = hrtf_data; - - /* HRTF_SH_CHANNELS */ - if ( HRTF_SH_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_SH_CHANNELS)" ); - } - hrtf_data_rptr += sizeof( uint16_t ); - - /* HRTF_NUM_BINS */ - if ( HRTF_NUM_BINS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_NUM_BINS)" ); - } - hrtf_data_rptr += sizeof( uint16_t ); - - /* HRTF */ - data_size_tmp = HRTF_NUM_BINS * sizeof( float ); - for ( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) - { - memcpy( f_tmp_hrtfShCoeffs, hrtf_data_rptr, data_size_tmp ); - /*adding conversion as file reading is done in float*/ - floatToFixed_arr16( f_tmp_hrtfShCoeffs, ( *hHRTF )->hrtfShCoeffsRe_fx[i][j], Q15, HRTF_NUM_BINS ); - hrtf_data_rptr += data_size_tmp; - } - } - for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + if ( asFastconv ) { - for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) - { - memcpy( f_tmp_hrtfShCoeffs, hrtf_data_rptr, data_size_tmp ); - /*adding conversion as file reading is done in float*/ - floatToFixed_arr16( f_tmp_hrtfShCoeffs, ( *hHRTF )->hrtfShCoeffsIm_fx[i][j], Q14, HRTF_NUM_BINS ); - hrtf_data_rptr += data_size_tmp; - } + return IVAS_ERR_OK; } - - /* Reverb Parameters */ - if ( CLDFB_NO_CHANNELS_MAX != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + else { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (CLDFB_NO_CHANNELS_MAX)" ); + return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; } - hrtf_data_rptr += sizeof( uint16_t ); - - memcpy( f_tmp_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); - /*adding conversion as file reading is done in float*/ - floatToFixed_arrL( f_tmp_reverb, ( *hHRTF )->parametricReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); - - memcpy( f_tmp_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); - /*adding conversion as file reading is done in float*/ - floatToFixed_arrL( f_tmp_reverb, ( *hHRTF )->parametricReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); - - // memcpy( ( *hHRTF )->parametricEarlyPartEneCorrection, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - memcpy( f_tmp_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); - /*adding conversion as file reading is done in float*/ - floatToFixed_arrL( f_tmp_reverb, ( *hHRTF )->parametricEarlyPartEneCorrection_fx, Q28, CLDFB_NO_CHANNELS_MAX ); - - return IVAS_ERR_OK; } + /*---------------------------------------------------------------------* * load_parambin_HRTF_from_binary() * @@ -1569,6 +1778,12 @@ ivas_error load_parambin_HRTF_from_binary( ivas_error header_check_result; ivas_hrtfs_file_header_t hrtfs_file_header; int16_t hrtf_id; + int16_t asParam = 0; + + if ( hrtfReader == NULL || hrtfReader->file == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } f_hrtf = hrtfReader->file; @@ -1603,8 +1818,14 @@ ivas_error load_parambin_HRTF_from_binary( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "HRTF binary file not compliant (number of HRTF)" ); } - if ( hrtf_header.rend_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Parametric binauralizer data is represented as single entity */ + if ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_PARAMETRIC ) /* Parametric binauralizer data is represented as single entity */ { + if ( hrtf_header.frequency != 48000 ) /* note: Parametric renderer data are always stored at 48 kHz */ + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF invalid sampling rate" ); + } + if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) { free( hrtf_data ); @@ -1615,8 +1836,10 @@ ivas_error load_parambin_HRTF_from_binary( if ( ( create_parambin_HRTF_from_rawdata( &hHrtfParamBin, hrtf_data ) ) != IVAS_ERR_OK ) { free( hrtf_data ); - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" ); + + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create ParamBin HRTF from binary file" ); } + asParam = 1; } else { @@ -1625,29 +1848,49 @@ ivas_error load_parambin_HRTF_from_binary( } free( hrtf_data ); - return IVAS_ERR_OK; + if ( asParam ) + { + return IVAS_ERR_OK; + } + else + { + return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; + } } /*---------------------------------------------------------------------* - * create_SetOfHRTF_from_binary() + * load_Crend_HRTF_from_binary() * - * Create the HRTF data set from the binary file + * Create the Crend HRTF data set from the binary file *---------------------------------------------------------------------*/ -ivas_error create_SetOfHRTF_from_binary( - IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF, /* i/o: HRTF CRend handle */ - const hrtfFileReader *hrtfReader, /* i : pointer to hrtfFileReader handle */ - int32_t output_Fs ) /* i : Output sampling frequency */ +ivas_error load_Crend_HRTF_from_binary( + IVAS_DEC_HRTF_CREND_HANDLE hHrtfCrend, /* i/o: HRTF CRend handle */ + const hrtfFileReader *hrtfReader, /* i : pointer to hrtfFileReader handle */ + const IVAS_AUDIO_CONFIG OutputConfig, /* i : output audio configuration */ + const IVAS_AUDIO_CONFIG hrtf_set_audio_cfg, /* i : HRTF set audio config. */ + const int32_t sampleRate /* i : sample rate */ +) { FILE *f_hrtf; int32_t hrtf_data_size_max; char *hrtf_data; ivas_hrtfs_header_t hrtf_header; - HRTFS_DATA **hHRTF; ivas_error header_check_result; ivas_hrtfs_file_header_t hrtfs_file_header; int16_t hrtf_id; + bool load = false; + int16_t asCrend = 0; + BINAURAL_INPUT_AUDIO_CONFIG hrtf_set_binaural_cfg; + + /* convert audio config. to HRTF binaural config */ + hrtf_set_binaural_cfg = audio_cfg_2_binaural_cfg( hrtf_set_audio_cfg ); + + if ( hrtfReader == NULL || hrtfReader->file == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } f_hrtf = hrtfReader->file; @@ -1673,144 +1916,187 @@ ivas_error create_SetOfHRTF_from_binary( /* Read & load */ - memset( hSetOfHRTF, 0x00, sizeof( HRTFS_CREND ) ); + if ( hHrtfCrend == NULL ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Crend HRTF binary handle not allocated!\n" ); + } for ( hrtf_id = 0; hrtf_id < hrtfs_file_header.nb_hrtf; hrtf_id++ ) { if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK ) { + free( hrtf_data ); return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "HRTF binary file not compliant (number of HRTF)" ); } - hHRTF = NULL; - if ( hrtf_header.frequency == output_Fs ) + if ( ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_MIXER_CONV && /* HRIRs */ + ( OutputConfig == IVAS_AUDIO_CONFIG_BINAURAL || OutputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) || + ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_MIXER_CONV_ROOM && /* BRIRs */ + OutputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || + ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_MIXER_CONV && ( OutputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || OutputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) { - if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV ) + load = ( (BINAURAL_INPUT_AUDIO_CONFIG) hrtf_header.input_cfg == hrtf_set_binaural_cfg ) ? true : false; + } + + if ( load ) + { + if ( hrtf_header.frequency != sampleRate ) { - if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) - { - hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_combined ); - } - else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) - { - hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa3 ); - } - else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) - { - hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa2 ); - } - else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) - { - hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_foa ); - } + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF invalid sampling rate" ); } - else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + + if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) { - if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) - { - hHRTF = &( ( *hSetOfHRTF ).hHRTF_brir_combined ); - } + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); } - } - - if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); - } - if ( hHRTF != NULL ) - { - /* Create the HRTF reading the raw data from the binary file */ - if ( ( create_HRTF_from_rawdata( hHRTF, hrtf_data ) ) != IVAS_ERR_OK ) + if ( ( create_Crend_HRTF_from_rawdata( &hHrtfCrend, hrtf_data ) ) != IVAS_ERR_OK ) { + free( hrtf_data ); return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" ); } + asCrend = 1; + break; /* read just one set */ + } + else + { + fseek( f_hrtf, hrtf_header.data_size, SEEK_CUR ); } } free( hrtf_data ); - if ( ( ( *hSetOfHRTF ).hHRTF_hrir_combined == NULL ) || ( ( *hSetOfHRTF ).hHRTF_brir_combined == NULL ) || ( ( *hSetOfHRTF ).hHRTF_hrir_hoa3 == NULL ) ) + + if ( asCrend ) { - if ( destroy_SetOfHRTF( hSetOfHRTF ) != IVAS_ERR_OK ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create all the HRTF from binary file" ); - } + return IVAS_ERR_OK; + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" ); } - return IVAS_ERR_OK; } + /*---------------------------------------------------------------------* - * destroy_HRTF() + * destroy_crend_hrtf() * - * Destroy the HRTF CRend handle + * Destroy the Crend HRTF data set *---------------------------------------------------------------------*/ -static ivas_error destroy_HRTF( - HRTFS_HANDLE *hHRTF /* i/o: HRTF CRend handle */ +void destroy_crend_hrtf( + IVAS_DEC_HRTF_CREND_HANDLE *hHrtfCrend /* i/o: Crend HRTF handle */ ) { uint16_t i, j; - if ( *hHRTF != NULL && hHRTF != NULL ) + test(); + if ( *hHrtfCrend != NULL && hHrtfCrend != NULL ) { for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) { for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { - if ( ( *hHRTF )->pIndex_frequency_max[i][j] != NULL ) + if ( ( *hHrtfCrend )->pIndex_frequency_max[i][j] != NULL ) { - free( ( *hHRTF )->pIndex_frequency_max[i][j] ); + free( ( *hHrtfCrend )->pIndex_frequency_max_dyn_fx[i][j] ); } - if ( ( *hHRTF )->pOut_to_bin_re_fx[i][j] != NULL ) + if ( ( *hHrtfCrend )->pOut_to_bin_re_fx[i][j] != NULL ) { - free( ( *hHRTF )->pOut_to_bin_re_fx[i][j] ); + free( ( *hHrtfCrend )->pOut_to_bin_re_dyn_fx[i][j] ); } - if ( ( *hHRTF )->pOut_to_bin_im_fx[i][j] != NULL ) + if ( ( *hHrtfCrend )->pOut_to_bin_im_fx[i][j] != NULL ) { - free( ( *hHRTF )->pOut_to_bin_im_fx[i][j] ); + free( ( *hHrtfCrend )->pOut_to_bin_im_dyn_fx[i][j] ); } } } for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { - if ( ( *hHRTF )->pIndex_frequency_max_diffuse[j] != NULL ) + if ( ( *hHrtfCrend )->pIndex_frequency_max_diffuse[j] != NULL ) { - free( ( *hHRTF )->pIndex_frequency_max_diffuse[j] ); + free( ( *hHrtfCrend )->pIndex_frequency_max_diffuse_dyn_fx[j] ); } - if ( ( *hHRTF )->pOut_to_bin_diffuse_re_fx[j] != NULL ) + if ( ( *hHrtfCrend )->pOut_to_bin_diffuse_re_fx[j] != NULL ) { - free( ( *hHRTF )->pOut_to_bin_diffuse_re_fx[j] ); + free( ( *hHrtfCrend )->pOut_to_bin_diffuse_re_dyn_fx[j] ); } - if ( ( *hHRTF )->pOut_to_bin_diffuse_im_fx[j] != NULL ) + if ( ( *hHrtfCrend )->pOut_to_bin_diffuse_im_fx[j] != NULL ) { - free( ( *hHRTF )->pOut_to_bin_diffuse_im_fx[j] ); + free( ( *hHrtfCrend )->pOut_to_bin_diffuse_im_dyn_fx[j] ); } } - - free( *hHRTF ); - *hHRTF = NULL; + free( *hHrtfCrend ); + *hHrtfCrend = NULL; } - return IVAS_ERR_OK; + return; } + + /*---------------------------------------------------------------------* - * destroy_SetOfHRTF() + * destroy_hrtf_statistics() * - * Destroy the HRTF data set. + * Destroy the HRTF statistics set. *---------------------------------------------------------------------*/ -ivas_error destroy_SetOfHRTF( - HRTFS_CREND_HANDLE hSetOfHRTF /* i/o: Set of HRTF CRend handle */ +void destroy_hrtf_statistics( + IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics /* i/o: HRTF statistics handle */ ) { - if ( hSetOfHRTF != NULL ) + if ( ( hHrtfStatistics != NULL ) && ( *hHrtfStatistics != NULL ) && ( ( *hHrtfStatistics )->fromROM == FALSE ) ) { - destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_combined ) ); - destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa3 ) ); - destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa2 ) ); - destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_foa ) ); - destroy_HRTF( &( hSetOfHRTF->hHRTF_brir_combined ) ); + if ( ( *hHrtfStatistics )->average_energy_l_dyn != NULL ) + { + free( ( *hHrtfStatistics )->average_energy_l_dyn ); + } + if ( ( *hHrtfStatistics )->average_energy_r_dyn != NULL ) + { + free( ( *hHrtfStatistics )->average_energy_r_dyn ); + } + if ( ( *hHrtfStatistics )->inter_aural_coherence_dyn != NULL ) + { + free( ( *hHrtfStatistics )->inter_aural_coherence_dyn ); + } } - return IVAS_ERR_OK; + ivas_HRTF_statistics_close_fx( hHrtfStatistics ); + + return; +} + +/*---------------------------------------------------------------------* + * destroy_fastconv_hrtf() + * + * Destroy the HRTF data set. + *---------------------------------------------------------------------*/ + +void destroy_fastconv_hrtf( + IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* i/o: FastConv HRTF handle */ +) +{ + /* Fastconv HRTF memories */ + ivas_binaural_hrtf_close_fx( hHrtfFastConv ); + + /* Fastconv HRTF filters */ + ivas_HRTF_fastconv_binary_close_fx( hHrtfFastConv ); + + return; +} + + +/*---------------------------------------------------------------------* + * destroy_parambin_hrtf() + * + * Destroy the HRTF data set. + *---------------------------------------------------------------------*/ + +void destroy_parambin_hrtf( + IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* i/o: Parambin HRTF handle */ +) +{ + ivas_HRTF_parambin_binary_close_fx( hHrtfParambin ); + + return; } diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h index 104cc5c7a8a93f778a0e3e78438a4660576e77c4..105ee0ace97155bbff8e9e8273cc41e25bbb29c2 100644 --- a/lib_util/hrtf_file_reader.h +++ b/lib_util/hrtf_file_reader.h @@ -38,12 +38,37 @@ typedef struct hrtfFileReader hrtfFileReader; + +typedef enum +{ + HRTF_READER_RENDERER_BINAURAL_INVALID, + HRTF_READER_RENDERER_BINAURAL_FASTCONV, + HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM, + HRTF_READER_RENDERER_BINAURAL_PARAMETRIC, + HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD, + HRTF_READER_RENDERER_BINAURAL_MIXER_CONV, + HRTF_READER_RENDERER_BINAURAL_MIXER_CONV_ROOM, + HRTF_READER_RENDERER_BINAURAL_REVERB_ALL + +} HRTF_READER_RENDERER_TYPE; + +typedef enum +{ + BINAURAL_INPUT_AUDIO_CONFIG_INVALID, + BINAURAL_INPUT_AUDIO_CONFIG_COMBINED, /* 5_1, 5_1_2, 5_1_4, 7_1, 7_1_4 */ + BINAURAL_INPUT_AUDIO_CONFIG_HOA3, /* HOA3 */ + BINAURAL_INPUT_AUDIO_CONFIG_HOA2, /* HOA2 */ + BINAURAL_INPUT_AUDIO_CONFIG_FOA, /* FOA */ + BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED /* Not used */ + +} BINAURAL_INPUT_AUDIO_CONFIG; + typedef struct ivas_hrtfs_header_t { - int32_t rend_type; - int32_t input_cfg; - int32_t frequency; - uint32_t data_size; + Word32 rend_type; + Word32 input_cfg; + Word32 frequency; + UWord32 data_size; } ivas_hrtfs_header_t; @@ -69,40 +94,53 @@ void hrtfFileReader_close( ); /*---------------------------------------------------------------------* - * load_HRTF_binary() + * load_TDrend_HRTF_binary() * - * Load HRTF binary data into the HRTF handle + * Load TD renderer HRTF binary data into the HRTF handle *---------------------------------------------------------------------*/ -ivas_error load_HRTF_binary( - IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ +ivas_error load_TDrend_HRTF_binary( + IVAS_DEC_HRTF_TD_HANDLE hHrtf, /* i/o: TD rend. HRTF handle */ + const Word32 sampleRate, /* i : sample rate */ const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ ); +/*---------------------------------------------------------------------* + * load_reverb_binary() + * + * Load reverb binary data into the HRTF handle + *---------------------------------------------------------------------*/ + +ivas_error load_reverb_binary( + IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics, /* i/o: HRTF statistics handle */ + const Word32 sampleRate, /* i : sample rate */ + const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ +); + /*---------------------------------------------------------------------* * create_SetOfHRTF_from_binary() * * Create the HRTF data set from the binary file *---------------------------------------------------------------------*/ -ivas_error create_SetOfHRTF_from_binary( - IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF, /* i/o: Set of HRTF CRend handle */ - const hrtfFileReader *hrtfReader, /* i : pointer to hrtfFileReader handle */ - int32_t output_Fs /* i : Output sampling frequency */ +ivas_error load_Crend_HRTF_from_binary( + IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF, /* i/o: Set of HRTF CRend handle */ + const hrtfFileReader *hrtfReader, /* i : pointer to hrtfFileReader handle */ + const IVAS_AUDIO_CONFIG OutputConfig, /* i : output audio configuration */ + const IVAS_AUDIO_CONFIG hrtf_set_audio_cfg, /* i : HRTF set audio config. */ + const Word32 sampleRate /* i : sample rate */ ); - /*---------------------------------------------------------------------* - * destroy_SetOfHRTF() + * destroy_crend_hrtf() * * Destroy the HRTF data set. *---------------------------------------------------------------------*/ -ivas_error destroy_SetOfHRTF( - IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF /* i/o: Set of HRTF CRend handle */ +void destroy_crend_hrtf( + IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* i/o: Set of HRTF CRend handle */ ); - /*---------------------------------------------------------------------* * load_fastconv_HRTF_from_binary() * @@ -111,9 +149,20 @@ ivas_error destroy_SetOfHRTF( ivas_error load_fastconv_HRTF_from_binary( IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv, /* i/o: FastConv HRTF handle */ + const IVAS_AUDIO_CONFIG OutputConfig, /* i : output audio configuration */ + const IVAS_AUDIO_CONFIG hrtf_set_audio_cfg, /* i : HRTF set audio config. */ const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ ); +/*---------------------------------------------------------------------* + * destroy_fastconv_hrtf() + * + * free memory allocated for FastConv HRTF binary data into the handle + *---------------------------------------------------------------------*/ + +void destroy_fastconv_hrtf( + IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* i/o: FastConv HRTF handle */ +); /*---------------------------------------------------------------------* * load_parambin_HRTF_from_binary() @@ -126,15 +175,34 @@ ivas_error load_parambin_HRTF_from_binary( const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ ); +/*---------------------------------------------------------------------* + * destroy_hrtf_statistics() + * + * free memory allocated for HRTF statistics binary data + *---------------------------------------------------------------------*/ + +void destroy_hrtf_statistics( + IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics /* i/o: HRTF statistics handle */ +); + +/*---------------------------------------------------------------------* + * destroy_parambin_hrtf() + * + * free memory allocated for Parambin HRTF binary data into the handle + *---------------------------------------------------------------------*/ + +void destroy_parambin_hrtf( + IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* i/o: Parambin HRTF handle */ +); /*---------------------------------------------------------------------* - * dealloc_HRTF_binary() + * destroy_td_hrtf() * - * Deallocated memory allocated by load_HRTF_binary + * Destroy the HRTF TD handle *---------------------------------------------------------------------*/ -ivas_error dealloc_HRTF_binary( - IVAS_DEC_HRTF_HANDLE hHrtf /* i/o: HRTF handle */ +void destroy_td_hrtf( + IVAS_DEC_HRTF_TD_HANDLE *hHRTF /* i/o: TD rend. HRTF handle */ ); #endif /* IVAS_HRTF_FILE_READER_H */ diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c index f3d782aeb7484e7c38b80c103fba546c8f57e216..5982229e4fdd1b61fdb9d9b2d613c038e693a82b 100644 --- a/lib_util/ism_file_reader.c +++ b/lib_util/ism_file_reader.c @@ -34,12 +34,19 @@ #include "cmdl_tools.h" #include #include -#include "prot_fx.h" +#include "float_to_fix_ops.h" + #define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ #define NUM_ISM_METADATA_PER_LINE 8 /* Number of ISM metadata per line in a metadata file */ #define NUM_MIN_ISM_METADATA 1 /* Minimum number of metadata parameters (azimuth) */ +#define Q9 9 +#define Q22 22 +#define Q31 31 +#define DEG_360_IN_Q22 ( 360 << Q22 ) /* Q22 */ +#define DEG_180_IN_Q22 ( 180 << Q22 ) /* Q22 */ +#define DEG_90_IN_Q22 ( 90 << Q22 ) /* Q22 */ struct IsmFileReader { @@ -73,9 +80,9 @@ IsmFileReader *IsmFileReader_open( return NULL; } - self = calloc( sizeof( IsmFileReader ), 1 ); + self = calloc( 1, sizeof( IsmFileReader ) ); self->file = file; - self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 ); + self->file_path = calloc( strlen( filePath ) + 1, sizeof( char ) ); strcpy( self->file_path, filePath ); return self; @@ -148,19 +155,12 @@ ivas_error IsmFileReader_readNextFrame( /* Invalid number of metadata parameters (2-7 supported) */ return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT; } - ismMetadata->azimuth = meta_prm[0]; - ismMetadata->elevation = meta_prm[1]; - ismMetadata->radius = meta_prm[2]; - ismMetadata->spread = meta_prm[3]; - ismMetadata->gainFactor = meta_prm[4]; - ismMetadata->yaw = meta_prm[5]; - ismMetadata->pitch = meta_prm[6]; - ismMetadata->non_diegetic_flag = (int16_t) meta_prm[7]; + ismMetadata->non_diegetic_flag = (Word16) meta_prm[7]; ismMetadata->azimuth_fx = floatToFixed( meta_prm[0], Q22 ); ismMetadata->elevation_fx = floatToFixed( meta_prm[1], Q22 ); ismMetadata->radius_fx = (Word16) floatToFixed( meta_prm[2], Q9 ); ismMetadata->spread_fx = floatToFixed( meta_prm[3], Q22 ); - ismMetadata->gainFactor_fx = floatToFixed( meta_prm[4], Q31 ); + ismMetadata->gainFactor_fx = floatToFixed( meta_prm[4], Q31 ); // TODO: Check correct Q value ismMetadata->yaw_fx = floatToFixed( meta_prm[5], Q22 ); ismMetadata->pitch_fx = floatToFixed( meta_prm[6], Q22 ); @@ -170,36 +170,31 @@ ivas_error IsmFileReader_readNextFrame( return IVAS_ERR_ISM_INVALID_METADATA_VALUE; } - if ( ismMetadata->azimuth > 180 || ismMetadata->azimuth < -180 ) + if ( ( ismMetadata->azimuth_fx > DEG_180_IN_Q22 ) || ( ismMetadata->azimuth_fx < -DEG_180_IN_Q22 ) ) { return IVAS_ERR_ISM_INVALID_METADATA_VALUE; } - - if ( ismMetadata->elevation > 90 || ismMetadata->elevation < -90 ) + if ( ( ismMetadata->elevation_fx > DEG_90_IN_Q22 ) || ( ismMetadata->elevation_fx < -DEG_90_IN_Q22 ) ) { return IVAS_ERR_ISM_INVALID_METADATA_VALUE; } - - if ( ismMetadata->radius < 0 ) /* Negative radius not supported. Max quantized radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */ + if ( ismMetadata->radius_fx < 0 ) /* Negative radius not supported. Max quantized radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */ { return IVAS_ERR_ISM_INVALID_METADATA_VALUE; } - - if ( ismMetadata->spread > 360 || ismMetadata->spread < 0 ) + if ( ( ismMetadata->spread_fx > DEG_360_IN_Q22 ) || ( ismMetadata->spread_fx < 0 ) ) { return IVAS_ERR_ISM_INVALID_METADATA_VALUE; } - - if ( ismMetadata->gainFactor > 1 || ismMetadata->gainFactor < 0 ) + if ( /*( ismMetadata->gainFactor_fx > ONE_IN_Q31 ) ||*/ ( ismMetadata->gainFactor_fx < 0 ) ) { return IVAS_ERR_ISM_INVALID_METADATA_VALUE; } - if ( ismMetadata->yaw > 180 || ismMetadata->yaw < -180 ) + if ( ( ismMetadata->yaw_fx > DEG_180_IN_Q22 ) || ( ismMetadata->yaw_fx < -DEG_180_IN_Q22 ) ) { return IVAS_ERR_ISM_INVALID_METADATA_VALUE; } - - if ( ismMetadata->pitch > 90 || ismMetadata->pitch < -90 ) + if ( ( ismMetadata->pitch_fx > DEG_90_IN_Q22 ) || ( ismMetadata->pitch_fx < -DEG_90_IN_Q22 ) ) { return IVAS_ERR_ISM_INVALID_METADATA_VALUE; } diff --git a/lib_util/ism_file_writer.c b/lib_util/ism_file_writer.c index 94bab6dd279ae62eed74ef6a52dd6df614dcb667..975412b002524110b525fee6aa74826a07158ab2 100644 --- a/lib_util/ism_file_writer.c +++ b/lib_util/ism_file_writer.c @@ -33,11 +33,14 @@ #include "ism_file_writer.h" #include #include +#include "float_to_fix_ops.h" -#include "prot_fx.h" #define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ +#define Q9 9 +#define Q22 22 +#define Q31 31 struct IsmFileWriter { @@ -82,9 +85,9 @@ ivas_error IsmFileWriter_open( return IVAS_ERR_FAILED_FILE_OPEN; } - self = calloc( sizeof( IsmFileWriter ), 1 ); + self = calloc( 1, sizeof( IsmFileWriter ) ); self->file = file; - self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 ); + self->file_path = calloc( strlen( filePath ) + 1, sizeof( char ) ); strcpy( self->file_path, filePath ); *ismWriter = self; @@ -113,16 +116,15 @@ ivas_error IsmFileWriter_writeFrame( } file = ismWriter->file; - - ismMetadata.azimuth = fixedToFloat( ismMetadata.azimuth_fx, Q22 ); - ismMetadata.elevation = fixedToFloat( ismMetadata.elevation_fx, Q22 ); - ismMetadata.radius = fix16_to_float( ismMetadata.radius_fx, Q9 ); - ismMetadata.spread = fixedToFloat( ismMetadata.spread_fx, Q22 ); - ismMetadata.gainFactor = fixedToFloat( ismMetadata.gainFactor_fx, Q31 ); - ismMetadata.yaw = fixedToFloat( ismMetadata.yaw_fx, Q22 ); - ismMetadata.pitch = fixedToFloat( ismMetadata.pitch_fx, Q22 ); - - snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f,%d\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch, ismMetadata.non_diegetic_flag ); + float azimuth = fixedToFloat( ismMetadata.azimuth_fx, Q22 ); + float elevation = fixedToFloat( ismMetadata.elevation_fx, Q22 ); + float radius = fix16_to_float( ismMetadata.radius_fx, Q9 ); + float spread = fixedToFloat( ismMetadata.spread_fx, Q22 ); + float gainFactor = fixedToFloat( ismMetadata.gainFactor_fx, Q31 ); + float yaw = fixedToFloat( ismMetadata.yaw_fx, Q22 ); + float pitch = fixedToFloat( ismMetadata.pitch_fx, Q22 ); + + snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f,%d\n", azimuth, elevation, radius, spread, gainFactor, yaw, pitch, ismMetadata.non_diegetic_flag ); if ( file ) { fputs( char_buff, file ); diff --git a/lib_util/ivas_bpool.c b/lib_util/ivas_bpool.c new file mode 100644 index 0000000000000000000000000000000000000000..9db909f535e17a2911ab7e809c3a27caaf277edd --- /dev/null +++ b/lib_util/ivas_bpool.c @@ -0,0 +1,153 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ +#include +#include +#include "ivas_bpool.h" +#include "ivas_error_utils.h" +#include "mutex.h" + +struct BPOOL +{ + mtx_t lock; + uint32_t bufferSize; + uint32_t numBuffers; + uint32_t numFreeBuffers; + void **freeBuffers; +}; + +ivas_error BPOOL_Create( BPOOL_HANDLE *pHandle, size_t bufferSize, uint32_t numBuffers ) +{ + uint32_t n; + uint8_t *base = NULL; + BPOOL_HANDLE handle; + size_t allocSize = sizeof( struct BPOOL ); + + if ( pHandle == NULL ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid pointer to Buffer Pool Handle" ); + } + + *pHandle = NULL; + + allocSize += bufferSize * numBuffers; /* pool memory */ + allocSize += sizeof( void * ) * numBuffers; /* free buffers stack */ + + base = calloc( allocSize, sizeof( uint8_t ) ); + if ( base == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Couldn't allocate Buffer pool" ); + } + + handle = (BPOOL_HANDLE) base; + base += sizeof( struct BPOOL ); + + mtx_init( &handle->lock, 0 ); + handle->bufferSize = bufferSize; + handle->numBuffers = numBuffers; + handle->numFreeBuffers = numBuffers; + handle->freeBuffers = (void **) base; + base += ( sizeof( void * ) * numBuffers ); + for ( n = 0; n < numBuffers; n++ ) + { + handle->freeBuffers[n] = base; + base += bufferSize; + } + + *pHandle = handle; + return IVAS_ERR_OK; +} + +void BPOOL_Destroy( BPOOL_HANDLE *pHandle ) +{ + if ( ( pHandle != NULL ) && ( *pHandle != NULL ) ) + { + mtx_destroy( &( *pHandle )->lock ); + free( *pHandle ); + *pHandle = NULL; + } +} + +ivas_error BPOOL_GetBuffer( BPOOL_HANDLE handle, void **dataPtr ) +{ + uint32_t idx = 0; + bool isFree = false; + + if ( handle == NULL || dataPtr == NULL ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid pointer args in GetBuffer" ); + } + + mtx_lock( &handle->lock ); + isFree = ( handle->numFreeBuffers > 0 ); + if ( isFree ) + { + idx = --handle->numFreeBuffers; + } + mtx_unlock( &handle->lock ); + + if ( !isFree ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNDERFLOW, "Underflow, no free buffers in pool" ); + } + + *dataPtr = handle->freeBuffers[idx]; + return IVAS_ERR_OK; +} + +/* return the buffer back to pool */ +ivas_error BPOOL_FreeBuffer( BPOOL_HANDLE handle, void *dataPtr ) +{ + uint32_t idx; + + if ( handle == NULL || dataPtr == NULL ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid pointer args in GetBuffer" ); + } + + mtx_lock( &handle->lock ); + idx = handle->numFreeBuffers++; + mtx_unlock( &handle->lock ); + + handle->freeBuffers[idx] = dataPtr; + + return IVAS_ERR_OK; +} + +/* return the number of free buffers available atm in the pool */ +uint32_t BPOOL_AvailableBuffers( BPOOL_HANDLE handle ) +{ + uint32_t numFreeBuffers; + mtx_lock( &handle->lock ); + numFreeBuffers = handle->numFreeBuffers; + mtx_unlock( &handle->lock ); + return numFreeBuffers; +} diff --git a/lib_util/test_fft.h b/lib_util/ivas_bpool.h similarity index 73% rename from lib_util/test_fft.h rename to lib_util/ivas_bpool.h index 6c962909072a7f02a71735bc6c860c44c8975abf..30cf4962b5198fd2a22a522061e8ce4cff2be915 100644 --- a/lib_util/test_fft.h +++ b/lib_util/ivas_bpool.h @@ -30,12 +30,28 @@ *******************************************************************************************************/ -#ifndef __TEST_FFT_H -#define __TEST_FFT_H +#ifndef IVAS_BPOOL_H +#define IVAS_BPOOL_H -#include "options.h" +#include +#include "common_api_types.h" -void run_fft_unit_test( void ); +/* Forward declaraiton of opaque buffer pool handle */ +typedef struct BPOOL *BPOOL_HANDLE; +/* Create a buffer pool with given element size and max number of buffers */ +ivas_error BPOOL_Create( BPOOL_HANDLE *pHandle, size_t bufferSize, uint32_t numBuffers ); -#endif /* __TEST_FFT_H */ +/* Destroy the buffer pool and all free-up all allocated memory */ +void BPOOL_Destroy( BPOOL_HANDLE *pHandle ); + +/* request a buffer from the pool */ +ivas_error BPOOL_GetBuffer( BPOOL_HANDLE handle, void **dataPtr ); + +/* return the buffer back to pool */ +ivas_error BPOOL_FreeBuffer( BPOOL_HANDLE handle, void *dataPtr ); + +/* return the number of free buffers available atm in the pool */ +uint32_t BPOOL_AvailableBuffers( BPOOL_HANDLE handle ); + +#endif /* IVAS_BPOOL_H */ diff --git a/lib_util/ivas_queue.c b/lib_util/ivas_queue.c new file mode 100644 index 0000000000000000000000000000000000000000..b17cf3e21a6e0222b439ba0826780dd031551670 --- /dev/null +++ b/lib_util/ivas_queue.c @@ -0,0 +1,137 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "ivas_queue.h" +#include "ivas_error_utils.h" +#include "mutex.h" + +struct QUEUE +{ + mtx_t lock; + NODE *front; + NODE *back; + uint32_t size; +}; + +ivas_error QUEUE_Create( QUEUE_HANDLE *pHandle ) +{ + QUEUE_HANDLE handle = NULL; + *pHandle = NULL; + + if ( pHandle == NULL ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid pointer to Buffer Pool Handle" ); + } + + handle = calloc( 1, sizeof( struct QUEUE ) ); + if ( handle != NULL ) + { + mtx_init( &handle->lock, 0 ); + } + + *pHandle = handle; + return IVAS_ERR_OK; +} + +/* Destroy the queue and free-up all allocated memory */ +void QUEUE_Destroy( QUEUE_HANDLE *pHandle ) +{ + if ( ( pHandle != NULL ) && ( *pHandle != NULL ) ) + { + mtx_destroy( &( *pHandle )->lock ); + free( *pHandle ); + *pHandle = NULL; + } +} + +void QUEUE_Push( QUEUE_HANDLE handle, NODE *node ) +{ + mtx_lock( &handle->lock ); + if ( handle->back == NULL ) + { + handle->front = node; + } + else + { + handle->back->next = node; + } + handle->back = node; + handle->size++; + mtx_unlock( &handle->lock ); +} + +/* return the buffer back to pool */ +NODE *QUEUE_Pop( QUEUE_HANDLE handle ) +{ + NODE *node; + mtx_lock( &handle->lock ); + node = handle->front; + handle->front = handle->front->next; + if ( NULL == handle->front ) + { + handle->back = NULL; + } + handle->size--; + mtx_unlock( &handle->lock ); + return node; +} + +/* returns the first element in the queue */ +NODE *QUEUE_Front( QUEUE_HANDLE handle ) +{ + NODE *node; + mtx_lock( &handle->lock ); + node = handle->front; + mtx_unlock( &handle->lock ); + return node; +} + +/* returns the last element in the queue */ +NODE *QUEUE_Back( QUEUE_HANDLE handle ) +{ + NODE *node; + mtx_lock( &handle->lock ); + node = handle->back; + mtx_unlock( &handle->lock ); + return node; +} + +/* return the number of elements in the queue */ +size_t QUEUE_Size( QUEUE_HANDLE handle ) +{ + uint32_t numNodes; + mtx_lock( &handle->lock ); + numNodes = handle->size; + mtx_unlock( &handle->lock ); + return numNodes; +} diff --git a/lib_util/ivas_queue.h b/lib_util/ivas_queue.h new file mode 100644 index 0000000000000000000000000000000000000000..1c6b77504e501b6f0ec680839cd52f3f10b04ca8 --- /dev/null +++ b/lib_util/ivas_queue.h @@ -0,0 +1,68 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_QUEUE_H +#define IVAS_QUEUE_H + +#include +#include "common_api_types.h" + +typedef struct NODE +{ + struct NODE *next; +} NODE; + +/* Forward declaraiton of opaque queue handle */ +typedef struct QUEUE *QUEUE_HANDLE; + +/* Create a queue with given element size and max number of buffers */ +ivas_error QUEUE_Create( QUEUE_HANDLE *pHandle ); + +/* Destroy the queue and all free-up all allocated memory */ +void QUEUE_Destroy( QUEUE_HANDLE *pHandle ); + +/* push a buffer to a queue */ +void QUEUE_Push( QUEUE_HANDLE handle, NODE *data ); + +/* pop the buffer from the front */ +NODE *QUEUE_Pop( QUEUE_HANDLE handle ); + +/* returns the first element from the front */ +NODE *QUEUE_Front( QUEUE_HANDLE handle ); + +/* returns the last element from the back */ +NODE *QUEUE_Back( QUEUE_HANDLE handle ); + +/* return the number of elements in the queue */ +size_t QUEUE_Size( QUEUE_HANDLE handle ); + +#endif /* IVAS_QUEUE_H */ diff --git a/lib_util/ivas_rtp_api.h b/lib_util/ivas_rtp_api.h new file mode 100644 index 0000000000000000000000000000000000000000..6698daaeae6882ff3b3acb37ac9a3f72b34b3636 --- /dev/null +++ b/lib_util/ivas_rtp_api.h @@ -0,0 +1,582 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_RTP_API_H +#define IVAS_RTP_API_H + +#include +#include "common_api_types.h" + +/* + * +-----------------------+---------------------+--------------------+----------+ + * | RTP Header (+ HDREXT) | payload header | frame data | PI data | + * +-----------------------+---------------------+--------------------+----------+ + * \--------------------\ /------------------------------/ + * IVAS payload + * + * This api provides a mechanism to generate/unpack the IVAS payload. The RTP Header + * and header extension fields must be handled by caller. + * + * IVAS General Payload structure + * =============================== + * + * 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 + * H H H H F H + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |1| T | D |1| ET1 |x x x x|1| ET2 |x x x x|0|1|0 1| BR |1| ET3 |x x x x|… + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * \--------------/\--------------/\--------------/\--------------/\--------------/ + * Initial E byte Subsqnt Ebyte1 Subsqnt Ebyte2 ToC1 Subsqnt Ebyte3 + * + * H F + * +-+-+-+-+-+-+-+-+-------------------------- ---+-------------------- ---+-------+ + * …|0|0|0 1| BR | IVAS frame 1 ... | IVAS frame 2 ... |PI data| + * +-+-+-+-+-+-+-+-+-------------------------- ---+-------------------- ---+-------+ + * \--------------/ + * ToC2 + * + */ + +#define IVAS_MAX_FRAMES_PER_RTP_PACKET ( 8 ) /* Max supported frames per RTP packet */ + +/* It is difficult to decide the RTP Payload buffer's capacity intrinsically however computing + * using the maximum frame size and all currently supported PI data present gives a crude + * estimate or RTP packet size per frame. The additional PI data is assumed to add upto a 20% + * overhead in bitrate for the computation. + */ +#define NOMINAL_BUFFER_SIZE( numFramesPerPacket ) ( ( IVAS_MAX_BITS_PER_FRAME + ( IVAS_MAX_BITS_PER_FRAME / 5 ) ) * ( numFramesPerPacket ) / 8 ) + +#define DEFAULT_MAX_PACKET_BYTES ( 1400 ) /* Typical MTU size of 4G/5G Cellular Interfaces */ + +#define NO_BITRATE_REQ ( 0u ) /* If no bitrate is requested from remote */ + +/* IVAS Codec Types */ +typedef enum +{ + IVAS_RTP_EVS, /* EVS */ + IVAS_RTP_IVAS /* IVAS */ +} IVAS_RTP_CODEC; + +/* IVAS Bandwidth Requests */ +typedef enum +{ + IVAS_BANDWIDTH_NB, /* Narrowband */ + IVAS_BANDWIDTH_WB, /* Wideband*/ + IVAS_BANDWIDTH_SWB, /* SuperWideband*/ + IVAS_BANDWIDTH_FB, /* Fullband */ + IVAS_BANDWIDTH_NO_REQ, /* No Preference */ +} IVAS_RTP_BANDWIDTH; + +/* Channel Aware Coding */ +typedef enum +{ + IVAS_RTP_CA_LO_O2, /* FER=LO, OFFSET=2 */ + IVAS_RTP_CA_LO_O3, /* FER=LO, OFFSET=3 */ + IVAS_RTP_CA_LO_O5, /* FER=LO, OFFSET=5 */ + IVAS_RTP_CA_LO_O7, /* FER=LO, OFFSET=7 */ + IVAS_RTP_CA_HI_O2, /* FER=HI, OFFSET=2 */ + IVAS_RTP_CA_HI_O3, /* FER=HI, OFFSET=3 */ + IVAS_RTP_CA_HI_O5, /* FER=HI, OFFSET=5 */ + IVAS_RTP_CA_HI_O7, /* FER=HI, OFFSET=7 */ + IVAS_RTP_CA_NO_REQ /* No request */ +} IVAS_RTP_CA_MODE; + +/* Coded Format Requests */ +typedef enum +{ + IVAS_FMT_STEREO, /* Stereo */ + IVAS_FMT_SBA, /* Scene Based Audio */ + IVAS_FMT_MASA, /* Metadata Assisted Spatial Audio */ + IVAS_FMT_ISM, /* Object Based Audio */ + IVAS_FMT_MC, /* Multichannel Audio */ + IVAS_FMT_OMASA, /* Object + MASA */ + IVAS_FMT_OSBA, /* Object + SBA */ + IVAS_FMT_NO_REQ, /* No preference */ +} IVAS_RTP_FORMAT; + +/* Coded Subformat Requests */ +typedef enum +{ + IVAS_SUBFMT_FOA_PLANAR, + IVAS_SUBFMT_HOA2_PLANAR, + IVAS_SUBFMT_HOA3_PLANAR, + IVAS_SUBFMT_FOA, + IVAS_SUBFMT_HOA2, + IVAS_SUBFMT_HOA3, + IVAS_SUBFMT_MASA1, + IVAS_SUBFMT_MASA2, + IVAS_SUBFMT_ISM1, + IVAS_SUBFMT_ISM2, + IVAS_SUBFMT_ISM3, + IVAS_SUBFMT_ISM4, + IVAS_SUBFMT_ISM1_EXTENDED_METADATA, + IVAS_SUBFMT_ISM2_EXTENDED_METADATA, + IVAS_SUBFMT_ISM3_EXTENDED_METADATA, + IVAS_SUBFMT_ISM4_EXTENDED_METADATA, + IVAS_SUBFMT_MC_5_1, + IVAS_SUBFMT_MC_7_1, + IVAS_SUBFMT_MC_5_1_2, + IVAS_SUBFMT_MC_5_1_4, + IVAS_SUBFMT_MC_7_1_4, + IVAS_SUBFMT_RESERVED_21, + IVAS_SUBFMT_RESERVED_22, + IVAS_SUBFMT_RESERVED_23, + IVAS_SUBFMT_RESERVED_24, + IVAS_SUBFMT_RESERVED_25, + IVAS_SUBFMT_RESERVED_26, + IVAS_SUBFMT_RESERVED_27, + IVAS_SUBFMT_RESERVED_28, + IVAS_SUBFMT_RESERVED_29, + IVAS_SUBFMT_RESERVED_30, + IVAS_SUBFMT_RESERVED_31, + IVAS_SUBFMT_OMASA_ISM1_1TC, + IVAS_SUBFMT_OMASA_ISM2_1TC, + IVAS_SUBFMT_OMASA_ISM3_1TC, + IVAS_SUBFMT_OMASA_ISM4_1TC, + IVAS_SUBFMT_OMASA_ISM1_2TC, + IVAS_SUBFMT_OMASA_ISM2_2TC, + IVAS_SUBFMT_OMASA_ISM3_2TC, + IVAS_SUBFMT_OMASA_ISM4_2TC, + IVAS_SUBFMT_OSBA_ISM1_FOA_PLANAR, + IVAS_SUBFMT_OSBA_ISM2_FOA_PLANAR, + IVAS_SUBFMT_OSBA_ISM3_FOA_PLANAR, + IVAS_SUBFMT_OSBA_ISM4_FOA_PLANAR, + IVAS_SUBFMT_OSBA_ISM1_FOA, + IVAS_SUBFMT_OSBA_ISM2_FOA, + IVAS_SUBFMT_OSBA_ISM3_FOA, + IVAS_SUBFMT_OSBA_ISM4_FOA, + IVAS_SUBFMT_OSBA_ISM1_HOA2_PLANAR, + IVAS_SUBFMT_OSBA_ISM2_HOA2_PLANAR, + IVAS_SUBFMT_OSBA_ISM3_HOA2_PLANAR, + IVAS_SUBFMT_OSBA_ISM4_HOA2_PLANAR, + IVAS_SUBFMT_OSBA_ISM1_HOA2, + IVAS_SUBFMT_OSBA_ISM2_HOA2, + IVAS_SUBFMT_OSBA_ISM3_HOA2, + IVAS_SUBFMT_OSBA_ISM4_HOA2, + IVAS_SUBFMT_OSBA_ISM1_HOA3_PLANAR, + IVAS_SUBFMT_OSBA_ISM2_HOA3_PLANAR, + IVAS_SUBFMT_OSBA_ISM3_HOA3_PLANAR, + IVAS_SUBFMT_OSBA_ISM4_HOA3_PLANAR, + IVAS_SUBFMT_OSBA_ISM1_HOA3, + IVAS_SUBFMT_OSBA_ISM2_HOA3, + IVAS_SUBFMT_OSBA_ISM3_HOA3, + IVAS_SUBFMT_OSBA_ISM4_HOA3, + IVAS_SUBFMT_NO_REQ +} IVAS_RTP_SUBFORMAT; + +/* Split Rendering Requests */ +typedef struct +{ + uint32_t valid : 1; /* is split rendering request valid */ + uint32_t diegetic : 1; /* enabling diegetic support for Split Rendering */ + uint32_t yaw : 1; /* transmission metadata for correction around yaw axis */ + uint32_t pitch : 1; /* transmission metadata for correction around pitch axis */ + uint32_t roll : 1; /* transmission metadata for correction around roll axis */ + uint32_t reserved : 27; /* reserved */ +} IVAS_RTP_SPLITRENDER; + +/* Remote Requests Types (Keys) */ +typedef enum +{ + IVAS_REQUEST_CODEC, /* Request codec type, value of type IVAS_RTP_CODEC */ + IVAS_REQUEST_BITRATE, /* Request bitrate, value of type uint32_t in kbps */ + IVAS_REQUEST_BANDWIDTH, /* Request bandwidth, value of type IVAS_RTP_BANDWIDTH */ + IVAS_REQUEST_FORMAT, /* Request format, value of type IVAS_RTP_FORMAT */ + IVAS_REQUEST_CA_MODE, /* Request channel awareness, value of type IVAS_RTP_CA_MODE */ + IVAS_REQUEST_SUBFORMAT, /* Request subFormat, value of type IVAS_RTP_SUBFORMAT */ + IVAS_REQUEST_SR_CONFIG, /* Request spit rendering, value of type IVAS_RTP_SPLITRENDER */ + IVAS_REQUEST_MAX /* Max number of requests */ +} IVAS_RTP_REQUEST_TYPE; + +/* Remote Request Values */ +typedef union +{ + uint32_t bitrate; /* bitrate in kbps when request type is IVAS_REQUEST_BITRATE */ + IVAS_RTP_CODEC codec; /* codec id when request type is IVAS_REQUEST_CODEC */ + IVAS_RTP_BANDWIDTH bandwidth; /* badwidth when request type is IVAS_REQUEST_BANDWIDTH */ + IVAS_RTP_FORMAT formatType; /* format type when request type is IVAS_REQUEST_FORMAT */ + IVAS_RTP_CA_MODE caMode; /* channel aware mode when request type is IVAS_REQUEST_CA_MODE */ + IVAS_RTP_SUBFORMAT subFormatType; /* sub-format type when request type is IVAS_REQUEST_SUBFORMAT */ + IVAS_RTP_SPLITRENDER srConfig; /* split rendering config when request type is IVAS_REQUEST_SR_CONFIG */ +} IVAS_RTP_REQUEST_VALUE; + +/* Template for pi data types, all defined pi data follow this template + * for example scene orientation pi data can be represented as :- + * + * typedef struct { + * size_t size; // sizeof(IVAS_PIDATA_SCENE_ORIENTATION) + * uint32_t piDataType; // IVAS_PI_SCENE_ORIENTATION + * float w, x, y, z; // pi data of scene orientation in quaternions + * } IVAS_PIDATA_SCENE_ORIENTATION; + * + */ +typedef struct +{ + size_t size; /* size of this structure */ + uint32_t piDataType; /* IVAS PI data type */ + uint8_t data[1]; /* Variable length array */ +} IVAS_PIDATA_GENERIC; + +/* Generic data buffer for sending/receiving coded frames / rtp payloads + * data buffer is owned and initialized by caller, rtp api will ensure + * buffer write does not exceed capacity. + */ +typedef struct +{ + size_t capacity; /* allocated size of the data buffer */ + size_t length; /* length of the initialized data in the buffer */ + uint8_t *buffer; /* pointer to the payload buffer */ +} IVAS_DATA_BUFFER; + +typedef enum +{ + IVAS_SR_TRANSPORT_LCLD, + IVAS_SR_TRANSPORT_LC3PLUS +} IVAS_RTP_SR_TRANSPORT; + +typedef struct +{ + bool valid; /* Valid Split Rendering Info for/in the ToC */ + bool diegetic; /* SR content digetic */ + uint32_t bitrateKbps; /* SR bitrate in kbps */ + uint32_t codecFrameSizeMs; /* SR transport codec framesize in ms (5/10/20) */ + IVAS_RTP_SR_TRANSPORT codec; /* SR Transport Codec used*/ +} IVAS_RTP_SR_INFO; + +/**********************************************/ +/* IVAS RTP PACKER API */ +/**********************************************/ + +/* Forward declaration of rtp pack/unpack handle types */ +typedef struct IVAS_RTP_PACK *IVAS_RTP_PACK_HANDLE; /* rtp packer handle type */ + +/* Initial configuration for rtp packer + * - maxFramesPerPacket is used to define if more than one frame should be packed + * in the same rtp packet. If zero, will use IVAS_MAX_FRAMES_PER_RTP_PACKET. + */ +typedef struct +{ + uint32_t maxFramesPerPacket; /* maximum no of frame per packet desired during the session */ +} IVAS_RTP_PACK_CONFIG; + +/* Open an instance of the RTP packer and return a handle to rtp packer on success + * error code is retured on failure and handle is set to NULL + */ +ivas_error IVAS_RTP_PACK_Open( + IVAS_RTP_PACK_HANDLE *phIvasPack, /* i/o: pointer to an IVAS rtp packer handle to be opened */ + const IVAS_RTP_PACK_CONFIG *config /* i : pointer to initial config for RTP Packer */ +); + +/* Close and free an existing instance of rtp packer */ +void IVAS_RTP_PACK_Close( + IVAS_RTP_PACK_HANDLE *phIvasPack /* i/o : pointer to an IVAS rtp packer handle to be closed */ +); + +/* Update the RTP Header structure */ +ivas_error IVAS_RTP_PACK_UpdateHeader( + IVAS_RTP_PACK_HANDLE hIvasPack, /* i/o: pointer to an IVAS rtp packer handle to be opened */ + uint16_t seqNumInitVal, /* i : Initial sequence number to be used for 1st packet */ + uint32_t ssrc, /* i : Unique 32-bit Source ID as negotiated during SDP */ + uint8_t numCC, /* i : numCC indicates no. of contributing sources */ + uint32_t *csrc, /* i : SSRCs of contributing Sources for a mixed stream */ + uint16_t extHeaderId, /* i : extension header ID */ + uint16_t numExtensionBytes, /* i : length of the extension data */ + uint8_t *extData /* i : extension data pointer */ +); + +/* Add requests for remote sender using a key value pair api + * each key must be provided with a corresponding value type + * + * Cross validation of some key,value pairs will not be done + * in this API. E.g. Codec ID and supported bitrates/bandwidths + * will not be performed at this level. + */ +ivas_error IVAS_RTP_PACK_PushRemoteRequest( + IVAS_RTP_PACK_HANDLE hIvasPack, /* i/o : IVAS rtp packer handle */ + IVAS_RTP_REQUEST_TYPE reqType, /* i : remote request type */ + IVAS_RTP_REQUEST_VALUE reqValue /* i : value of the requested type */ +); + +/* Push a single IVAS/EVS frame to rtp packer + * + * If multiple frames per RTP packet are desired, multiple frames must be explicitly + * pushed before a call to IVAS_RTP_PACK_GetPayload to generate a rtp payload. + * + * It is possible to have variable frames per packet until maxFramesPerPacket frames + * if IVAS_RTP_PACK_GetPayload is invoked asyncronously w.r.t this api. + * + */ +ivas_error IVAS_RTP_PACK_PushFrame( + IVAS_RTP_PACK_HANDLE hIvasPack, /* i/o : IVAS rtp packer handle */ + IVAS_RTP_CODEC codecId, /* i : Codec type (IVAS/EVS) */ + const IVAS_RTP_SR_INFO *srInfo, /* i : Split Rendering Info (NULL if absent) */ + const IVAS_DATA_BUFFER *frameBuffer /* i : packed frame bitstream for IVAS/EVS */ +); + +/* Get the number of frames in the FiFo currently */ +uint32_t IVAS_RTP_PACK_GetNumFrames( + IVAS_RTP_PACK_HANDLE hIvasPack /* i/o : IVAS rtp packer handle */ +); + +/* Push single PI data to rtp packer + * + * Provide PI data for a current RTP packet. All PI data is locally cached in the packer + * and set to the rtp payload with policy defined in initial configuration during call to + * IVAS_RTP_PACK_GetPayload. + * + */ +ivas_error IVAS_RTP_PACK_PushPiData( + IVAS_RTP_PACK_HANDLE hIvasPack, /* i/o : IVAS rtp packer handle */ + const IVAS_PIDATA_GENERIC *data /* i : pointer to the PIData stucture */ +); + +/* Generate a rtp payload using available pushed frames + * + * Available remote requests, pi data and frames will be packed into a rtp payload. The + * capacity field of payload is used to limits the maximum RTP packet size. + * + */ +ivas_error IVAS_RTP_PACK_GetPayload( + IVAS_RTP_PACK_HANDLE hIvasPack, /* i/o : IVAS rtp packer handle */ + IVAS_DATA_BUFFER *payload, /* o : encapsulated rtp payload */ + uint32_t *numFramesInPayload /* o : no. of frames in payload */ +); + +/* Generate a rtp packet using available pushed frames + * + * Available remote requests, pi data and frames will be packed into a rtp packet. If no + * frame is pushed before call to this api, NO_DATA_FRAME will be generated + * Takes care of updates to the RTP Header + * + */ +ivas_error IVAS_RTP_PACK_GetPacket( + IVAS_RTP_PACK_HANDLE hIvasPack, /* i/o : IVAS rtp packer handle */ + IVAS_DATA_BUFFER *packet, /* o : encapsulated rtp packet */ + uint32_t *numFramesInPacket /* o : no. of frames in packet */ +); + +/**********************************************/ +/* IVAS RTP UNPACKER API */ +/**********************************************/ + +/* Forward declaration of rtp unpack handle types */ +typedef struct IVAS_RTP_UNPACK *IVAS_RTP_UNPACK_HANDLE; /* rtp unpacker handle type */ + +/* Initial configuration for rtp unpacker + * - maxFramesPerPacket is used to define maximum supported frames per rtp packet + * to allow for internal memory allocaton, if zero, will use IVAS_MAX_FRAMES_PER_RTP_PACKET + */ + +typedef struct +{ + uint32_t maxFramesPerPacket; /* maximum no of frame per packet expected during the session */ + uint32_t srCodecFrameSizeMs; /* split rendering transport codec frame size in ms (5/10/20) set by sdp negotiation */ +} IVAS_RTP_UNPACK_CONFIG; + +/* Open an instance of the RTP unpacker and return a handle to rtp unpacker on success + * error code is retured on failure and handle is set to NULL + */ +ivas_error IVAS_RTP_UNPACK_Open( + IVAS_RTP_UNPACK_HANDLE *phIvasUnpack, /* i/o : rtp unpacker handle */ + const IVAS_RTP_UNPACK_CONFIG *config /* i : initial configuration for rtp unpacker */ +); + +/* Close and free an existing instance of rtp unpacker */ +void IVAS_RTP_UNPACK_Close( + IVAS_RTP_UNPACK_HANDLE *phIvasUnpack /* i/o : IVAS rtp unpacker handle */ +); + +/* Push a received rtp Ivas Payload to unpacker to extract number of frames, pi data and + * any remote request present in the payload. Caller must extract RTP header and header + * extension and feed Ivas Payload alongwith RTP Timestamp and sequence number. + * + * In case of DTX transmission modes, the number of frames in packet will be reduced by + * the number of NO_DATA frame received. All PullFrame calls for non NO_DATA frames shall + * be reported with timestamp jump indicating missing/NO_DATA IVAS frames. + * + * It is important to ensure IVAS_RTP_UNPACK_PushPayload, IVAS_RTP_UNPACK_PullFrame and + * IVAS_RTP_UNPACK_PullNextPiData API are invoked in same thread context or in a thread + * safe manner else a race condition can arise if new packet is pushed while frames/pidata + * are still being pulled out. The IVAS_RTP_UNPACK_PushPayload will gererate an error if + * new paylod is pushed before all frames/pidata are pulled out. + * + * Example usage : - + * ================== + * err = IVAS_RTP_UNPACK_PushPayload(hIvasUnpack, payload, rtpTs, seqNum, + * &nFrames, &nPiData, &reqBitmap); + * if (err != IVAS_ERR_OK) { return err; } + * + * // Read the frames in payload and feed to decoder + * while (nFrames-- > 0) { + * err = IVAS_RTP_UNPACK_PullFrame(hIvasUnpack, &recCodecId, &srInfo, &frame, &frameTs, &seqNum, &SpeechLostIndicated); + * if (err != IVAS_ERR_OK) { return err; } + * err = IVAS_DEC_VoIP_FeedFrame(hIvasDec, frame.buffer, frame.length, seqNum, frameTs, rcvTime, isGoodFrame); + * if (err != IVAS_ERR_OK) { return err; } + * } + * + * // Read PI Data + * while (nPiData-- > 0) { + * err = IVAS_RTP_UNPACK_PullNextPiData(hIvasUnpack, &piData, &piTs); + * if (err != IVAS_ERR_OK) { return err; } + * // handle pi data based on fwd/rev pi data types + * handlePIData(&piData, piTs) + * } + * + * // Read remote requests + * for (req = 0; req < IVAS_REQUEST_MAX; req++) { + * if (reqBitmap & (1u << req)) { + * err = IVAS_RTP_UNPACK_GetRequest(hIvasUnpack, req, &value); + * if (err != IVAS_ERR_OK) { return err; } + * switch(req) { + * case IVAS_REQUEST_CODEC : handleCodec(value.codec); break; + * case IVAS_REQUEST_BITRATE : handleBitrate(value.bitrate); break; + * case IVAS_REQUEST_BANDWIDTH : handleBandwidth(value.bandwidth); break; + * case IVAS_REQUEST_FORMAT : handleFormat(value.formatType); break; + * case IVAS_REQUEST_SUBFORMAT : handleSubFormat(value.subFormatType); break; + * case IVAS_REQUEST_CA_MODE : handleCAModevalue.caMode); break; + * case IVAS_REQUEST_SR_CONFIG : handleSRConfig(value.srConfig); break; + * } + * } + * } + * + */ +ivas_error IVAS_RTP_UNPACK_PushPayload( + IVAS_RTP_UNPACK_HANDLE hIvasUnpack, /* i/o : IVAS rtp unpacker handle */ + const IVAS_DATA_BUFFER *payload, /* i : received rtp payload */ + uint32_t timestamp, /* i : timestamp in RTP Clock @ 16KHz from rtp header */ + uint16_t sequenceNumber, /* i : sequence number from rtp header */ + uint32_t *numFramesInPacket, /* o : number of IVAS/EVS frames in rtp packet */ + uint32_t *numPiDataInPacket, /* o : number of PI data received in rtp packet */ + uint32_t *remoteRequestBitmap /* o : bitmap of available request in this packet */ +); + +/* Push a received rtp Ivas Packet to unpacker to extract number of frames, pi data and + * any remote request present in the Packet. + * + * In case of DTX transmission modes, the number of frames in packet will be reduced by + * the number of NO_DATA frame received. All PullFrame calls for non NO_DATA frames shall + * be reported with timestamp jump indicating missing/NO_DATA IVAS frames. + * + * It is important to ensure IVAS_RTP_UNPACK_PushPacket, IVAS_RTP_UNPACK_PullFrame and + * IVAS_RTP_UNPACK_PullNextPiData API are invoked in same thread context or in a thread + * safe manner else a race condition can arise if new packet is pushed while frames/pidata + * are still being pulled out. The IVAS_RTP_UNPACK_PushPacket will gererate an error if + * new packet is pushed before all frames/pidata are pulled out. + * + * Example usage : - + * ================== + * err = IVAS_RTP_UNPACK_PushPacket(hIvasUnpack, packet, &nFrames, &nPiData, &reqBitmap); + * if (err != IVAS_ERR_OK) { return err; } + * + * // Read the frames in packet and feed to decoder + * while (nFrames-- > 0) { + * err = IVAS_RTP_UNPACK_PullFrame(hIvasUnpack, &recCodecId, &srInfo, &frame, &frameTs, &seqNum, &SpeechLostIndicated); + * if (err != IVAS_ERR_OK) { return err; } + * err = IVAS_DEC_VoIP_FeedFrame(hIvasDec, frame.buffer, frame.length, seqNum, frameTs, rcvTime, isGoodFrame); + * if (err != IVAS_ERR_OK) { return err; } + * } + * + * // Read PI Data + * while (nPiData-- > 0) { + * err = IVAS_RTP_UNPACK_PullNextPiData(hIvasUnpack, &piData, &piTs); + * if (err != IVAS_ERR_OK) { return err; } + * // handle pi data based on fwd/rev pi data types + * handlePIData(&piData, piTs) + * } + * + * // Read remote requests + * for (req = 0; req < IVAS_REQUEST_MAX; req++) { + * if (reqBitmap & (1u << req)) { + * err = IVAS_RTP_UNPACK_GetRequest(hIvasUnpack, req, &value); + * if (err != IVAS_ERR_OK) { return err; } + * switch(req) { + * case IVAS_REQUEST_CODEC : handleCodec(value.codec); break; + * case IVAS_REQUEST_BITRATE : handleBitrate(value.bitrate); break; + * case IVAS_REQUEST_BANDWIDTH : handleBandwidth(value.bandwidth); break; + * case IVAS_REQUEST_FORMAT : handleFormat(value.formatType); break; + * case IVAS_REQUEST_SUBFORMAT : handleSubFormat(value.subFormatType); break; + * case IVAS_REQUEST_CA_MODE : handleCAModevalue.caMode); break; + * case IVAS_REQUEST_SR_CONFIG : handleSRConfig(value.srConfig); break; + * } + * } + * } + */ +ivas_error IVAS_RTP_UNPACK_PushPacket( + IVAS_RTP_UNPACK_HANDLE hIvasUnpack, /* i/o : IVAS rtp unpacker handle */ + const IVAS_DATA_BUFFER *packet, /* i : received rtp Packet */ + uint32_t *numFramesInPacket, /* o : number of IVAS/EVS frames in rtp packet */ + uint32_t *numPiDataInPacket, /* o : number of PI data received in rtp packet */ + uint32_t *remoteRequestBitmap /* o : bitmap of available request in this packet */ +); + +/* Fetch requests from sender using a key value pair api + * each key must be provided with a corresponding value storage type + * + * On call to IVAS_RTP_UNPACK_PushPayload(), remoteRequestBitmap can be used + * an indicator of new request available this frame + * + */ +ivas_error IVAS_RTP_UNPACK_GetRequest( + IVAS_RTP_UNPACK_HANDLE hIvasUnpack, /* i/o : IVAS rtp packer handle */ + IVAS_RTP_REQUEST_TYPE type, /* i : remote request type */ + IVAS_RTP_REQUEST_VALUE *value /* o : pointer of the requested type */ +); + +/* Extract a single IVAS/EVS frame from provided rtp payload alongwith rtp timestamp + * and sequence number + * + * If multiple frames per RTP packet are available, multiple calls to IVAS_RTP_UNPACK_PullFrame + * are needed. + */ +ivas_error IVAS_RTP_UNPACK_PullFrame( + IVAS_RTP_UNPACK_HANDLE hIvasUnpack, /* i/o : IVAS rtp unpacker handle */ + IVAS_RTP_CODEC *receivedCodecId, /* o : Codec type (IVAS/EVS) */ + IVAS_RTP_SR_INFO *srInfo, /* o : Split Rendering Info */ + IVAS_DATA_BUFFER *frameBuffer, /* o : packed frame bitstream for IVAS/EVS */ + int16_t *frameSizeInBits, /* o : exact frame size in bits (AMRWB IO) */ + uint32_t *timestamp, /* o : timestamp in RTP Clock @ 16KHz */ + uint16_t *sequenceNumber, /* o : sequence number from rtp header */ + bool *speechLostIndicated, /* o : Is current frame indicated as Lost */ + bool *isAMRWB_IOmode /* o : Is AMRWB_IO mode EVS frame */ +); + +/* Pull a single PI data from rtp unpacker instance for current packet + * Each Pi data is accompanied with a corresponding timestamp + */ +ivas_error IVAS_RTP_UNPACK_PullNextPiData( + IVAS_RTP_UNPACK_HANDLE hIvasUnpack, /* i/o : IVAS rtp unpacker handle */ + IVAS_PIDATA_GENERIC *data, /* o : output data buffer for the Pi data */ + size_t capacity, /* i : capacity of pi data buffer in bytes */ + uint32_t *timestamp /* o : timestamp in RTP Clock @ 16KHz */ +); + +#endif /* IVAS_RTP_API_H */ diff --git a/lib_util/ivas_rtp_file.c b/lib_util/ivas_rtp_file.c new file mode 100644 index 0000000000000000000000000000000000000000..26af1e2016a7937c9d13c69b3b7c2292e5e365ee --- /dev/null +++ b/lib_util/ivas_rtp_file.c @@ -0,0 +1,1124 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include "ivas_rtp_file.h" +#include "ivas_error_utils.h" +#include "float_to_fix_ops.h" + + +#define Q15 15 + +struct IVAS_RTP_FILE +{ + bool isFileWriter; + FILE *f_rtpstream; +}; + +static ivas_error IvasRtpFile_Open( + const char *filePath, /* i : path to CA config file */ + bool isFileWriter, /* i : instance is a file writer else reader */ + IVAS_RTP_FILE_HANDLE *phRtpFile /* o : pointer to an IVAS file reader handle */ +) +{ + const char *mode = isFileWriter ? "wb" : "rb"; + FILE *f_rtpstream = fopen( filePath, mode ); + if ( f_rtpstream == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_OPEN, "could not open: %s\n", filePath ); + } + + *phRtpFile = calloc( 1, sizeof( struct IVAS_RTP_FILE ) ); + if ( *phRtpFile != NULL ) + { + ( *phRtpFile )->isFileWriter = isFileWriter; + ( *phRtpFile )->f_rtpstream = f_rtpstream; + } + + return IVAS_ERR_OK; +} + +static ivas_error IvasRtpFile_Close( + IVAS_RTP_FILE_HANDLE *phReader /* i : pointer to an IVAS file reader handle */ +) +{ + if ( phReader != NULL && *phReader != NULL ) + { + if ( ( *phReader )->f_rtpstream != NULL ) + { + fclose( ( *phReader )->f_rtpstream ); + ( *phReader )->f_rtpstream = NULL; + } + free( *phReader ); + *phReader = NULL; + } + + return IVAS_ERR_OK; +} + +static ivas_error IvasRtpFile_Write( + IVAS_RTP_FILE_HANDLE hRtpFile, /* i : pointer to an IVAS file writer handle */ + const uint8_t *packet, /* i : rtp packet to be written to rtpdump file */ + size_t numBytes ) /* i : size in bytes of the rtp packet */ +{ + ivas_error error = IVAS_ERR_OK; + if ( hRtpFile->isFileWriter ) + { + uint32_t length = (uint32_t) numBytes; /* Max packet length is < 32 bits*/ + fwrite( &length, sizeof( uint32_t ), 1, hRtpFile->f_rtpstream ); + fwrite( packet, sizeof( uint8_t ), numBytes, hRtpFile->f_rtpstream ); + } + else + { + error = IVAS_ERR_WRONG_PARAMS; + } + return error; +} + +static ivas_error IvasRtpFile_Read( + IVAS_RTP_FILE_HANDLE hRtpFile, /* i : pointer to an IVAS file reader handle */ + uint8_t *packet, /* o : read rtp packet */ + size_t *numBytes, /* o : no of bytes in packet */ + size_t capacity /* i : max capacity of the packet buffer */ +) +{ + size_t nread = 0; + uint32_t length = 0; + if ( hRtpFile->isFileWriter ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "File open for writing cannot be read" ); + } + + nread = fread( &length, sizeof( uint32_t ), 1, hRtpFile->f_rtpstream ); /* Read Packet Length */ + if ( nread == 0 ) + { + return IVAS_ERR_END_OF_FILE; + } + + *numBytes = length; + if ( ( *numBytes ) > capacity ) + { + fprintf( stderr, "RTP packet > buffer capacity %lu bytes\n", capacity ); + return IVAS_ERR_INVALID_OUTPUT_BUFFER_SIZE; + } + + nread = fread( packet, sizeof( uint8_t ), ( *numBytes ), hRtpFile->f_rtpstream ); /* Read Packet */ + if ( nread < ( *numBytes ) ) + { + return IVAS_ERR_END_OF_FILE; + } + + return IVAS_ERR_OK; +} + +static const char *const PiDataNames[IVAS_PI_MAX_ID] = { + "SCENE_ORIENTATION", "DEVICE_ORIENTATION_COMPENSATED", "DEVICE_ORIENTATION_UNCOMPENSATED", + "ACOUSTIC_ENVIRONMENT", "AUDIO_DESCRIPTION", "ISM_NUM", "ISM_ID", "ISM_GAIN", "ISM_ORIENTATION", + "ISM_POSITION", "ISM_POSITION_COMPACT", "ISM_DISTANCE_ATTENUATION", "ISM_DIRECTIVITY", "DIEGETIC_TYPE", "DYNAMIC_AUDIO_SUPPRESSION_INDICATION", + "AUDIO_FOCUS_INDICATION", "PLAYBACK_DEVICE_ORIENTATION", "HEAD_ORIENTATION", "LISTENER_POSITION", + "DYNAMIC_AUDIO_SUPPRESSION_REQUEST", "AUDIO_FOCUS_REQUEST", "PI_LATENCY", "R_ISM_ID", "R_ISM_GAIN", + "R_ISM_ORIENTATION", "R_ISM_POSITION", "R_ISM_POSITION_COMPACT", "R_ISM_DIRECTION", "RESERVED27", "RESERVED28", "RESERVED29", "NO_DATA" +}; + +void IVAS_RTP_LogPiData( + FILE *f_piDataOut, /* i/o : Output json file handle to dump PI data for debug/test */ + const PIDATA_TS *piData, /* i : PI Data + Timestamp array containing all PI data in current packet */ + uint32_t nPiDataPresent /* i : Number of valid elements in the piData array */ +) +{ + uint16_t n; + uint32_t timestamp = ~0u; + if ( f_piDataOut == NULL || piData == NULL || nPiDataPresent == 0 ) + { + return; + } + +#ifdef _WIN32 + if ( ftell( f_piDataOut ) > 3 ) +#else + if ( ftell( f_piDataOut ) > 2 ) +#endif + { + fprintf( f_piDataOut, ",\n" ); + } + + while ( nPiDataPresent-- > 0 ) + { + const PIDATA_TS *cur = piData++; + + if ( timestamp != ( ~0u ) && timestamp != cur->timestamp ) + { + fprintf( f_piDataOut, "\n\t},\n\t\"%d\": {\n", cur->timestamp ); + } + else if ( timestamp != cur->timestamp ) + { + fprintf( f_piDataOut, "\t\"%d\": {\n", cur->timestamp ); + } + else + { + fprintf( f_piDataOut, ",\n" ); + } + fprintf( f_piDataOut, "\t\t\"%s\" : ", PiDataNames[cur->data.noPiData.piDataType] ); + switch ( cur->data.noPiData.piDataType ) + { + case IVAS_PI_SCENE_ORIENTATION: + case IVAS_PI_DEVICE_ORIENTATION_COMPENSATED: + case IVAS_PI_DEVICE_ORIENTATION_UNCOMPENSATED: + case IVAS_PI_PLAYBACK_DEVICE_ORIENTATION: + case IVAS_PI_HEAD_ORIENTATION: + { + fprintf( f_piDataOut, "{\n\t\t\t\"w\": %f,\n\t\t\t\"x\": %f,\n\t\t\t\"y\": %f,\n\t\t\t\"z\": %f \n\t\t}", + fixedToFloat( cur->data.scene.orientation.w_fx, Q15 ), + fixedToFloat( cur->data.scene.orientation.x_fx, Q15 ), + fixedToFloat( cur->data.scene.orientation.y_fx, Q15 ), + fixedToFloat( cur->data.scene.orientation.z_fx, Q15 ) ); + } + break; + + case IVAS_PI_ACOUSTIC_ENVIRONMENT: + { + fprintf( f_piDataOut, "{\n\t\t\t\"aeid\": %d", cur->data.acousticEnv.aeid ); + if ( cur->data.acousticEnv.availLateReverb ) + { + fprintf( f_piDataOut, ",\n\t\t\t\"rt60\": [ %f, %f, %f ],\n", cur->data.acousticEnv.rt60[0], cur->data.acousticEnv.rt60[1], cur->data.acousticEnv.rt60[2] ); + fprintf( f_piDataOut, "\t\t\t\"dsr\": [ %f, %f, %f ]", cur->data.acousticEnv.dsr[0], cur->data.acousticEnv.dsr[1], cur->data.acousticEnv.dsr[2] ); + } + if ( cur->data.acousticEnv.availEarlyReflections ) + { + fprintf( f_piDataOut, ",\n\t\t\t\"dim\": [ %f, %f, %f ],\n", cur->data.acousticEnv.roomDimensions.x, cur->data.acousticEnv.roomDimensions.y, cur->data.acousticEnv.roomDimensions.z ); + fprintf( f_piDataOut, "\t\t\t\"abscoeff\": [ %f, %f, %f, %f, %f, %f ]", cur->data.acousticEnv.absorbCoeffs[0], cur->data.acousticEnv.absorbCoeffs[1], cur->data.acousticEnv.absorbCoeffs[2], cur->data.acousticEnv.absorbCoeffs[3], cur->data.acousticEnv.absorbCoeffs[4], cur->data.acousticEnv.absorbCoeffs[5] ); + } + fprintf( f_piDataOut, "\n\t\t}" ); + } + break; + case IVAS_PI_LISTENER_POSITION: + { + fprintf( f_piDataOut, "{\n\t\t\t\"x\": %f,\n\t\t\t\"y\": %f,\n\t\t\t\"z\": %f \n\t\t}", + cur->data.listnerPosition.position.x, cur->data.listnerPosition.position.y, cur->data.listnerPosition.position.z ); + } + break; + case IVAS_PI_AUDIO_DESCRIPTION: + { + uint32_t nEntries = cur->data.audioDesc.nValidEntries; + const IVAS_AUDIO_ID *audioId = cur->data.audioDesc.audioId; + + fprintf( f_piDataOut, "[\n" ); + while ( nEntries-- > 0 ) + { + fprintf( f_piDataOut, "\t\t\t{\n" ); + fprintf( f_piDataOut, "\t\t\t\t\"isSpeech\": %s,\n", audioId->speech ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\t\"isMusic\": %s,\n", audioId->music ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\t\"isAmbiance\": %s,\n", audioId->ambiance ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\t\"isEditable\": %s,\n", audioId->editable ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\t\"isBinaural\": %s\n", audioId->binaural ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t}%c\n", ( nEntries == 0 ) ? ' ' : ',' ); + audioId++; + } + fprintf( f_piDataOut, "\t\t]" ); + } + break; + case IVAS_PI_DIEGETIC_TYPE: + { + const bool *isDiegetic = cur->data.digeticIndicator.isDiegetic; + fprintf( f_piDataOut, "{\n" ); + fprintf( f_piDataOut, "\t\t\t\"isDigetic\": [\n" ); + fprintf( f_piDataOut, "\t\t\t\t%s,\n", isDiegetic[0] ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\t%s,\n", isDiegetic[1] ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\t%s,\n", isDiegetic[2] ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\t%s,\n", isDiegetic[3] ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\t%s\n", isDiegetic[4] ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t]\n\t\t}" ); + } + break; + case IVAS_PI_AUDIO_FOCUS_INDICATION: + { + fprintf( f_piDataOut, "{" ); + if ( cur->data.focusIndication.availDirection ) + { + fprintf( f_piDataOut, "\n\t\t\t\"direction\": {\n" ); + fprintf( f_piDataOut, "\t\t\t\t\t\t\"w\": %f,\n\t\t\t\t\t\t\"x\": %f,\n\t\t\t\t\t\t\"y\": %f,\n\t\t\t\t\t\t\"z\": %f \n\t\t\t}", + fixedToFloat( cur->data.focusIndication.direction.w_fx, Q15 ), + fixedToFloat( cur->data.focusIndication.direction.x_fx, Q15 ), + fixedToFloat( cur->data.focusIndication.direction.y_fx, Q15 ), + fixedToFloat( cur->data.focusIndication.direction.z_fx, Q15 ) ); + if ( cur->data.focusIndication.availLevel ) + { + fprintf( f_piDataOut, "," ); + } + } + if ( cur->data.focusIndication.availLevel ) + { + fprintf( f_piDataOut, "\n\t\t\t\"level\": %d", cur->data.focusIndication.flvl ); + } + fprintf( f_piDataOut, "\n\t\t}" ); + } + break; + case IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION_REQUEST: + { + const IVAS_PIDATA_DYNAMIC_SUPPRESSION *das = &cur->data.dynSuppressionRequest; + fprintf( f_piDataOut, "{\n" ); + fprintf( f_piDataOut, "\t\t\t\"preferSpeech\": %s,\n", das->speech ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\"preferMusic\": %s,\n", das->music ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\"preferAmbiance\": %s,\n", das->ambiance ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\"level\": %d", das->sli ); + fprintf( f_piDataOut, "\n\t\t}" ); + } + break; + case IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION_INDICATION: + { + const IVAS_PIDATA_DYNAMIC_SUPPRESSION *das = &cur->data.dynSuppressionIndication; + fprintf( f_piDataOut, "{\n" ); + fprintf( f_piDataOut, "\t\t\t\"preferSpeech\": %s,\n", das->speech ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\"preferMusic\": %s,\n", das->music ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\"preferAmbiance\": %s,\n", das->ambiance ? "true" : "false" ); + fprintf( f_piDataOut, "\t\t\t\"level\": %d", das->sli ); + fprintf( f_piDataOut, "\n\t\t}" ); + } + break; + case IVAS_PI_AUDIO_FOCUS_REQUEST: + { + fprintf( f_piDataOut, "{" ); + if ( cur->data.focusRequest.availDirection ) + { + fprintf( f_piDataOut, "\n\t\t\t\"direction\": {\n" ); + fprintf( f_piDataOut, "\t\t\t\t\t\t\"w\": %f,\n\t\t\t\t\t\t\"x\": %f,\n\t\t\t\t\t\t\"y\": %f,\n\t\t\t\t\t\t\"z\": %f \n\t\t\t}", + fixedToFloat( cur->data.focusRequest.direction.w_fx, Q15 ), + fixedToFloat( cur->data.focusRequest.direction.x_fx, Q15 ), + fixedToFloat( cur->data.focusRequest.direction.y_fx, Q15 ), + fixedToFloat( cur->data.focusRequest.direction.z_fx, Q15 ) ); + if ( cur->data.focusRequest.availLevel ) + { + fprintf( f_piDataOut, "," ); + } + } + if ( cur->data.focusRequest.availLevel ) + { + fprintf( f_piDataOut, "\n\t\t\t\"level\": %d", cur->data.focusRequest.flvl ); + } + fprintf( f_piDataOut, "\n\t\t}" ); + } + break; + case IVAS_PI_RESERVED27: + case IVAS_PI_RESERVED28: + case IVAS_PI_RESERVED29: + { + fprintf( f_piDataOut, "{}" ); + } + break; + case IVAS_PI_ISM_ORIENTATION: + { + fprintf( f_piDataOut, "[\n" ); + for ( n = 0; n < cur->data.ismOrientation.numObjects; n++ ) + { + if ( n != 0 ) + { + fprintf( f_piDataOut, ",\n" ); + } + fprintf( f_piDataOut, "\t\t\t{\n\t\t\t\t\"w\": %f,\n\t\t\t\t\"x\": %f,\n\t\t\t\t\"y\": %f,\n\t\t\t\t\"z\": %f \n\t\t\t}", + fixedToFloat( cur->data.ismOrientation.orientation[n].w_fx, Q15 ), + fixedToFloat( cur->data.ismOrientation.orientation[n].x_fx, Q15 ), + fixedToFloat( cur->data.ismOrientation.orientation[n].y_fx, Q15 ), + fixedToFloat( cur->data.ismOrientation.orientation[n].z_fx, Q15 ) ); + } + fprintf( f_piDataOut, "\n\t\t]" ); + } + break; + case IVAS_PI_ISM_NUM: + { + fprintf( f_piDataOut, "{\n" ); + fprintf( f_piDataOut, "\t\t\t\"num\": %d", cur->data.ismNum.numObjects ); + fprintf( f_piDataOut, "\n\t\t}" ); + } + break; + case IVAS_PI_ISM_ID: + { + fprintf( f_piDataOut, "{\n" ); + fprintf( f_piDataOut, "\t\t\t\"ids\": [\n" ); + for ( n = 0; n < cur->data.ismId.numObjects; n++ ) + { + if ( n != 0 ) + { + fprintf( f_piDataOut, ",\n" ); + } + fprintf( f_piDataOut, "\t\t\t\t%d", cur->data.ismId.id[n] ); + } + fprintf( f_piDataOut, "\n\t\t\t]" ); + fprintf( f_piDataOut, "\n\t\t}" ); + } + break; + case IVAS_PI_ISM_GAIN: + { + fprintf( f_piDataOut, "{\n" ); + fprintf( f_piDataOut, "\t\t\t\"gains\": [\n" ); + for ( n = 0; n < cur->data.ismGain.numObjects; n++ ) + { + if ( n != 0 ) + { + fprintf( f_piDataOut, ",\n" ); + } + fprintf( f_piDataOut, "\t\t\t\t%d", cur->data.ismGain.dB[n] ); + } + fprintf( f_piDataOut, "\n\t\t\t]" ); + fprintf( f_piDataOut, "\n\t\t}" ); + } + break; + case IVAS_PI_ISM_POSITION: + { + fprintf( f_piDataOut, "[\n" ); + for ( n = 0; n < cur->data.ismPosition.numObjects; n++ ) + { + if ( n != 0 ) + { + fprintf( f_piDataOut, ",\n" ); + } + fprintf( f_piDataOut, "\t\t\t{\n\t\t\t\t\"x\": %f,\n\t\t\t\t\"y\": %f,\n\t\t\t\t\"z\": %f \n\t\t\t}", cur->data.ismPosition.position[n].x, cur->data.ismPosition.position[n].y, cur->data.ismPosition.position[n].z ); + } + fprintf( f_piDataOut, "\n\t\t]" ); + } + break; + case IVAS_PI_ISM_POSITION_COMPACT: + { + fprintf( f_piDataOut, "[\n" ); + for ( n = 0; n < cur->data.ismPositionCompact.numObjects; n++ ) + { + if ( n != 0 ) + { + fprintf( f_piDataOut, ",\n" ); + } + fprintf( f_piDataOut, "\t\t\t{\n\t\t\t\t\"x\": %f,\n\t\t\t\t\"y\": %f,\n\t\t\t\t\"z\": %f \n\t\t\t}", cur->data.ismPositionCompact.position[n].x, cur->data.ismPositionCompact.position[n].y, cur->data.ismPositionCompact.position[n].z ); + } + fprintf( f_piDataOut, "\n\t\t]" ); + } + break; + case IVAS_PI_ISM_DISTANCE_ATTENUATION: + { + fprintf( f_piDataOut, "[\n" ); + for ( n = 0; n < cur->data.ismAttenuation.numObjects; n++ ) + { + if ( n != 0 ) + { + fprintf( f_piDataOut, ",\n" ); + } + fprintf( f_piDataOut, "\t\t\t{\n\t\t\t\t\"ref_dist\": %f,\n\t\t\t\t\"max_dist\": %f,\n\t\t\t\t\"roll_off\": %f \n\t\t\t}", cur->data.ismAttenuation.distAtten[n].ref_dist, cur->data.ismAttenuation.distAtten[n].max_dist, cur->data.ismAttenuation.distAtten[n].roll ); + } + fprintf( f_piDataOut, "\n\t\t]" ); + } + break; + case IVAS_PI_ISM_DIRECTIVITY: + { + fprintf( f_piDataOut, "[\n" ); + for ( n = 0; n < cur->data.ismDirectivity.numObjects; n++ ) + { + if ( n != 0 ) + { + fprintf( f_piDataOut, ",\n" ); + } + fprintf( f_piDataOut, "\t\t\t{\n\t\t\t\t\"inner_ang\": %d,\n\t\t\t\t\"outer_ang\": %d,\n\t\t\t\t\"outer_att\": %f \n\t\t\t}", cur->data.ismDirectivity.directivity[n].innerConeAngle, cur->data.ismDirectivity.directivity[n].outerConeAngle, cur->data.ismDirectivity.directivity[n].outerAttenuationdB ); + } + fprintf( f_piDataOut, "\n\t\t]" ); + } + break; + case IVAS_PI_PI_LATENCY: + { + fprintf( f_piDataOut, "{" ); + fprintf( f_piDataOut, "\n\t\t\t\"reverseType\": \"%s\",", PiDataNames[cur->data.piLatency.type] ); + fprintf( f_piDataOut, "\n\t\t\t\"latency\": %d", cur->data.piLatency.latency ); + fprintf( f_piDataOut, "\n\t\t}" ); + } + break; + case IVAS_PI_R_ISM_ID: + { + fprintf( f_piDataOut, "{\n" ); + fprintf( f_piDataOut, "\t\t\t\"id\": %d", cur->data.ismEditId.id ); + fprintf( f_piDataOut, "\n\t\t}" ); + } + break; + case IVAS_PI_R_ISM_GAIN: + { + fprintf( f_piDataOut, "{\n" ); + fprintf( f_piDataOut, "\t\t\t\"gain\": %d", cur->data.ismEditGain.dB ); + fprintf( f_piDataOut, "\n\t\t}" ); + } + break; + case IVAS_PI_R_ISM_ORIENTATION: + { + fprintf( f_piDataOut, "{\n\t\t\t\"w\": %f,\n\t\t\t\"x\": %f,\n\t\t\t\"y\": %f,\n\t\t\t\"z\": %f \n\t\t}", + fixedToFloat( cur->data.ismEditOrientation.orientation.w_fx, Q15 ), + fixedToFloat( cur->data.ismEditOrientation.orientation.x_fx, Q15 ), + fixedToFloat( cur->data.ismEditOrientation.orientation.y_fx, Q15 ), + fixedToFloat( cur->data.ismEditOrientation.orientation.z_fx, Q15 ) ); + } + break; + case IVAS_PI_R_ISM_POSITION: + { + fprintf( f_piDataOut, "{\n\t\t\t\"x\": %f,\n\t\t\t\"y\": %f,\n\t\t\t\"z\": %f \n\t\t}", + cur->data.ismEditPosition.position.x, cur->data.ismEditPosition.position.y, cur->data.ismEditPosition.position.z ); + } + break; + case IVAS_PI_R_ISM_POSITION_COMPACT: + { + fprintf( f_piDataOut, "{\n\t\t\t\"x\": %f,\n\t\t\t\"y\": %f,\n\t\t\t\"z\": %f \n\t\t}", + cur->data.ismEditPositionCompact.position.x, cur->data.ismEditPositionCompact.position.y, cur->data.ismEditPositionCompact.position.z ); + } + break; + case IVAS_PI_R_ISM_DIRECTION: + { + fprintf( f_piDataOut, "{\n\t\t\t\"azi\": %f,\n\t\t\t\"elev\": %f \n\t\t}", + cur->data.ismEditDirection.azimuth, cur->data.ismEditDirection.elevation ); + } + break; + case IVAS_PI_NO_DATA: + { + fprintf( f_piDataOut, "{}" ); + } + break; + } + timestamp = cur->timestamp; + } + fprintf( f_piDataOut, "\n\t}" ); +} + +void IVAS_RTP_WriteExtPiData( + FILE *f_piDataOut, /* i/o : Output csv file handle to dump PI data for external output */ + const PIDATA_TS *piData, /* i : PI Data + Timestamp array containing all PI data in current packet */ + uint32_t nPiDataPresent, /* i : Number of valid elements in the piData array */ + uint16_t numObj /* i : Number of objects */ +) +{ + if ( f_piDataOut == NULL || piData == NULL || nPiDataPresent == 0 ) + { + return; + } + + int i = 0; + + while ( nPiDataPresent-- > 0 ) + { + const PIDATA_TS *cur = piData++; + + /* The writing follows the pattern of: timestamp, PI DATA TYPE, PI DATA */ + + fprintf( f_piDataOut, "%d,%s,", cur->timestamp, PiDataNames[cur->data.noPiData.piDataType] ); + switch ( cur->data.noPiData.piDataType ) + { + case IVAS_PI_SCENE_ORIENTATION: + { + fprintf( f_piDataOut, "%f,%f,%f,%f", + fixedToFloat( cur->data.scene.orientation.w_fx, Q15 ), + fixedToFloat( cur->data.scene.orientation.x_fx, Q15 ), + fixedToFloat( cur->data.scene.orientation.y_fx, Q15 ), + fixedToFloat( cur->data.scene.orientation.z_fx, Q15 ) ); + } + break; + case IVAS_PI_DEVICE_ORIENTATION_COMPENSATED: + { + fprintf( f_piDataOut, "%f,%f,%f,%f", + fixedToFloat( cur->data.deviceCompensated.orientation.w_fx, Q15 ), + fixedToFloat( cur->data.deviceCompensated.orientation.x_fx, Q15 ), + fixedToFloat( cur->data.deviceCompensated.orientation.y_fx, Q15 ), + fixedToFloat( cur->data.deviceCompensated.orientation.z_fx, Q15 ) ); + } + break; + case IVAS_PI_DEVICE_ORIENTATION_UNCOMPENSATED: + { + fprintf( f_piDataOut, "%f,%f,%f,%f", + fixedToFloat( cur->data.deviceUnCompensated.orientation.w_fx, Q15 ), + fixedToFloat( cur->data.deviceUnCompensated.orientation.x_fx, Q15 ), + fixedToFloat( cur->data.deviceUnCompensated.orientation.y_fx, Q15 ), + fixedToFloat( cur->data.deviceUnCompensated.orientation.z_fx, Q15 ) ); + } + break; + case IVAS_PI_ACOUSTIC_ENVIRONMENT: + { + fprintf( f_piDataOut, "%d", cur->data.acousticEnv.aeid ); + if ( cur->data.acousticEnv.availLateReverb ) + { + fprintf( f_piDataOut, ",%f,%f,%f", cur->data.acousticEnv.rt60[0], cur->data.acousticEnv.rt60[1], cur->data.acousticEnv.rt60[2] ); + fprintf( f_piDataOut, ",%f,%f,%f", cur->data.acousticEnv.dsr[0], cur->data.acousticEnv.dsr[1], cur->data.acousticEnv.dsr[2] ); + } + if ( cur->data.acousticEnv.availEarlyReflections ) + { + fprintf( f_piDataOut, ",%f,%f,%f", cur->data.acousticEnv.roomDimensions.x, cur->data.acousticEnv.roomDimensions.y, cur->data.acousticEnv.roomDimensions.z ); + fprintf( f_piDataOut, ",%f,%f,%f,%f,%f,%f", cur->data.acousticEnv.absorbCoeffs[0], cur->data.acousticEnv.absorbCoeffs[1], cur->data.acousticEnv.absorbCoeffs[2], cur->data.acousticEnv.absorbCoeffs[3], cur->data.acousticEnv.absorbCoeffs[4], cur->data.acousticEnv.absorbCoeffs[5] ); + } + } + break; + case IVAS_PI_AUDIO_DESCRIPTION: + { + uint32_t nEntries = cur->data.audioDesc.nValidEntries; + const IVAS_AUDIO_ID *audioId = cur->data.audioDesc.audioId; + + while ( nEntries-- > 0 ) + { + fprintf( f_piDataOut, "%d,%d,%d,%d,%d", audioId->speech, audioId->music, audioId->ambiance, audioId->editable, audioId->binaural ); + audioId++; + } + } + break; + case IVAS_PI_ISM_NUM: + { + fprintf( f_piDataOut, "%d", cur->data.ismNum.numObjects ); + } + break; + case IVAS_PI_ISM_ID: + { + for ( i = 0; i < numObj; ++i ) + { + if ( i != 0 ) + { + fprintf( f_piDataOut, "," ); + } + fprintf( f_piDataOut, "%d", cur->data.ismId.id[i] ); + } + } + break; + case IVAS_PI_ISM_GAIN: + { + for ( i = 0; i < numObj; ++i ) + { + if ( i != 0 ) + { + fprintf( f_piDataOut, "," ); + } + fprintf( f_piDataOut, "%d", cur->data.ismGain.dB[i] ); + } + } + break; + case IVAS_PI_ISM_ORIENTATION: + { + for ( i = 0; i < numObj; ++i ) + { + if ( i != 0 ) + { + fprintf( f_piDataOut, "," ); + } + fprintf( f_piDataOut, "%f,%f,%f,%f", + fixedToFloat( cur->data.ismOrientation.orientation[i].w_fx, Q15 ), + fixedToFloat( cur->data.ismOrientation.orientation[i].x_fx, Q15 ), + fixedToFloat( cur->data.ismOrientation.orientation[i].y_fx, Q15 ), + fixedToFloat( cur->data.ismOrientation.orientation[i].z_fx, Q15 ) ); + } + } + break; + case IVAS_PI_ISM_POSITION: + { + for ( i = 0; i < numObj; ++i ) + { + if ( i != 0 ) + { + fprintf( f_piDataOut, "," ); + } + fprintf( f_piDataOut, "%f,%f,%f", cur->data.ismPosition.position[i].x, cur->data.ismPosition.position[i].y, cur->data.ismPosition.position[i].z ); + } + } + break; + case IVAS_PI_ISM_POSITION_COMPACT: + { + for ( i = 0; i < numObj; ++i ) + { + if ( i != 0 ) + { + fprintf( f_piDataOut, "," ); + } + fprintf( f_piDataOut, "%f,%f,%f", cur->data.ismPositionCompact.position[i].x, cur->data.ismPositionCompact.position[i].y, cur->data.ismPositionCompact.position[i].z ); + } + } + break; + case IVAS_PI_ISM_DISTANCE_ATTENUATION: + { + for ( i = 0; i < numObj; ++i ) + { + if ( i != 0 ) + { + fprintf( f_piDataOut, "," ); + } + fprintf( f_piDataOut, "%f,%f,%f", cur->data.ismAttenuation.distAtten[i].ref_dist, cur->data.ismAttenuation.distAtten[i].max_dist, cur->data.ismAttenuation.distAtten[i].roll ); + } + } + break; + case IVAS_PI_ISM_DIRECTIVITY: + { + for ( i = 0; i < numObj; ++i ) + { + if ( i != 0 ) + { + fprintf( f_piDataOut, "," ); + } + fprintf( f_piDataOut, "%d,%d,%f", cur->data.ismDirectivity.directivity[i].innerConeAngle, cur->data.ismDirectivity.directivity[i].outerConeAngle, cur->data.ismDirectivity.directivity[i].outerAttenuationdB ); + } + } + break; + case IVAS_PI_DIEGETIC_TYPE: + { + const bool *isDiegetic = cur->data.digeticIndicator.isDiegetic; + fprintf( f_piDataOut, "%d,%d,%d,%d,%d", isDiegetic[0], isDiegetic[1], isDiegetic[2], isDiegetic[3], isDiegetic[4] ); + } + break; + case IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION_INDICATION: + { + const IVAS_PIDATA_DYNAMIC_SUPPRESSION *das = &cur->data.dynSuppressionIndication; + fprintf( f_piDataOut, "%d,%d,%d,%d", das->speech, das->music, das->ambiance, das->sli ); + } + break; + case IVAS_PI_AUDIO_FOCUS_INDICATION: + { + if ( cur->data.focusIndication.availDirection ) + { + fprintf( f_piDataOut, "%f,%f,%f,%f", + fixedToFloat( cur->data.focusIndication.direction.w_fx, Q15 ), + fixedToFloat( cur->data.focusIndication.direction.x_fx, Q15 ), + fixedToFloat( cur->data.focusIndication.direction.y_fx, Q15 ), + fixedToFloat( cur->data.focusIndication.direction.z_fx, Q15 ) ); + if ( cur->data.focusIndication.availLevel ) + { + fprintf( f_piDataOut, "," ); + } + } + if ( cur->data.focusIndication.availLevel ) + { + fprintf( f_piDataOut, "%d", cur->data.focusIndication.flvl ); + } + } + break; + case IVAS_PI_PLAYBACK_DEVICE_ORIENTATION: + { + fprintf( f_piDataOut, "%f,%f,%f,%f", + fixedToFloat( cur->data.playbackOrientation.orientation.w_fx, Q15 ), + fixedToFloat( cur->data.playbackOrientation.orientation.x_fx, Q15 ), + fixedToFloat( cur->data.playbackOrientation.orientation.y_fx, Q15 ), + fixedToFloat( cur->data.playbackOrientation.orientation.z_fx, Q15 ) ); + } + break; + case IVAS_PI_HEAD_ORIENTATION: + { + fprintf( f_piDataOut, "%f,%f,%f,%f", + fixedToFloat( cur->data.headOrientation.orientation.w_fx, Q15 ), + fixedToFloat( cur->data.headOrientation.orientation.x_fx, Q15 ), + fixedToFloat( cur->data.headOrientation.orientation.y_fx, Q15 ), + fixedToFloat( cur->data.headOrientation.orientation.z_fx, Q15 ) ); + } + break; + case IVAS_PI_LISTENER_POSITION: + { + fprintf( f_piDataOut, "%f,%f,%f", cur->data.listnerPosition.position.x, cur->data.listnerPosition.position.y, cur->data.listnerPosition.position.z ); + } + break; + case IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION_REQUEST: + { + const IVAS_PIDATA_DYNAMIC_SUPPRESSION *das = &cur->data.dynSuppressionRequest; + fprintf( f_piDataOut, "%d,%d,%d,%d", das->speech, das->music, das->ambiance, das->sli ); + } + break; + case IVAS_PI_AUDIO_FOCUS_REQUEST: + { + + if ( cur->data.focusRequest.availDirection ) + { + fprintf( f_piDataOut, "%f,%f,%f,%f", + fixedToFloat( cur->data.focusRequest.direction.w_fx, Q15 ), + fixedToFloat( cur->data.focusRequest.direction.x_fx, Q15 ), + fixedToFloat( cur->data.focusRequest.direction.y_fx, Q15 ), + fixedToFloat( cur->data.focusRequest.direction.z_fx, Q15 ) ); + if ( cur->data.focusRequest.availLevel ) + { + fprintf( f_piDataOut, "," ); + } + } + if ( cur->data.focusRequest.availLevel ) + { + fprintf( f_piDataOut, "%d", cur->data.focusRequest.flvl ); + } + } + break; + case IVAS_PI_PI_LATENCY: + { + fprintf( f_piDataOut, "%s,%d", PiDataNames[cur->data.piLatency.type], cur->data.piLatency.latency ); + } + break; + case IVAS_PI_R_ISM_ID: + { + fprintf( f_piDataOut, "%d", cur->data.ismEditId.id ); + } + break; + case IVAS_PI_R_ISM_GAIN: + { + fprintf( f_piDataOut, "%d", cur->data.ismEditGain.piDataType ); + } + break; + case IVAS_PI_R_ISM_ORIENTATION: + { + fprintf( f_piDataOut, "%d,%d,%d,%d", cur->data.ismEditOrientation.orientation.w_fx, cur->data.ismEditOrientation.orientation.x_fx, cur->data.ismEditOrientation.orientation.y_fx, cur->data.ismEditOrientation.orientation.z_fx ); + } + break; + case IVAS_PI_R_ISM_POSITION: + { + fprintf( f_piDataOut, "%f,%f,%f", cur->data.ismEditPosition.position.x, cur->data.ismEditPosition.position.y, cur->data.ismEditPosition.position.z ); + } + break; + case IVAS_PI_R_ISM_POSITION_COMPACT: + { + fprintf( f_piDataOut, "%f,%f,%f", cur->data.ismEditPositionCompact.position.x, cur->data.ismEditPositionCompact.position.y, cur->data.ismEditPositionCompact.position.z ); + } + break; + case IVAS_PI_R_ISM_DIRECTION: + { + fprintf( f_piDataOut, "%f,%f", cur->data.ismEditDirection.azimuth, cur->data.ismEditDirection.elevation ); + } + break; + case IVAS_PI_RESERVED27: + case IVAS_PI_RESERVED28: + case IVAS_PI_RESERVED29: + break; + } + fprintf( f_piDataOut, "\n" ); + } +} + +const char *IVAS_RTP_GetExtPiFilePath( IVAS_RTP *rtp ) +{ + return rtp->piExtFilename; +} + +void IVAS_RTP_Term( + IVAS_RTP *rtp /* i/o : IVAS RTP File reader/writer handle */ +) +{ + if ( NULL != rtp ) + { + if ( rtp->hPack != NULL ) + { + /* Complete the last packet */ + if ( IVAS_RTP_PACK_GetNumFrames( rtp->hPack ) != 0 ) + { + ivas_error error = IVAS_ERR_OK; + uint32_t numFramesInPayload = 0; + + if ( ( error = IVAS_RTP_PACK_GetPacket( rtp->hPack, &rtp->rtpPacket, &numFramesInPayload ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while packing RTP Packet\n", ivas_error_to_string( error ) ); + } + else if ( numFramesInPayload > 0 ) + { + if ( ( error = IvasRtpFile_Write( rtp->hRtpFile, rtp->rtpPacket.buffer, rtp->rtpPacket.length ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while writing RTP packet\n", ivas_error_to_string( error ) ); + } + } + } + IVAS_RTP_PACK_Close( &rtp->hPack ); + } + + if ( rtp->hUnpack != NULL ) + { + IVAS_RTP_UNPACK_Close( &rtp->hUnpack ); + } + + if ( rtp->f_piDataOut != NULL ) + { + fprintf( rtp->f_piDataOut, "\n}\n" ); + fclose( rtp->f_piDataOut ); + rtp->f_piDataOut = NULL; + } + + if ( rtp->f_piExtOut != NULL ) + { + fclose( rtp->f_piExtOut ); + rtp->f_piExtOut = NULL; + } + + if ( rtp->hRtpFile != NULL ) + { + IvasRtpFile_Close( &rtp->hRtpFile ); + } + } +} + +ivas_error IVAS_RTP_WRITER_Init( + IVAS_RTP *rtp, /* i/o : IVAS RTP File writer handle */ + const char *outputBitstreamFilename, /* i : RTP Dump filename */ + uint32_t numFramesPerPacket, /* i : No. of frames per packet desired */ + uint32_t SSRC, /* i : SSRC for RTP Header */ + uint16_t seqNumInitVal /* i : Initial seq number in rtp header */ +) +{ + + ivas_error error = IVAS_ERR_OK; + + memset( rtp, 0, sizeof( IVAS_RTP ) ); + + rtp->packCfg.maxFramesPerPacket = numFramesPerPacket; + rtp->rtpPacket.buffer = rtp->packet; + rtp->rtpPacket.capacity = sizeof( rtp->packet ); + + error = IVAS_RTP_PACK_Open( &rtp->hPack, &rtp->packCfg ); + if ( error == IVAS_ERR_OK ) + { + /* Open the output file for RTPDump writing */ + error = IvasRtpFile_Open( outputBitstreamFilename, true, &rtp->hRtpFile ); + if ( error != IVAS_ERR_OK ) + { + return error; + } + + error = IVAS_RTP_PACK_UpdateHeader( rtp->hPack, seqNumInitVal, SSRC, 0, NULL, 0, 0, NULL ); + if ( error != IVAS_ERR_OK ) + { + fprintf( stderr, "error in IVAS_RTP_PACK_UpdateHeader(): %d\n", error ); + } + } + + return error; +} + +ivas_error IVAS_RTP_READER_Init( + IVAS_RTP *rtp, /* i/o : IVAS RTP File reader handle */ + const char *inputBitstreamFilename, /* i : Input rtpdump filename */ + const char *piOutputFilename, /* i : Output PI data json filename */ + bool isExtOutput, /* i : External output mode */ + const char *outputWavFilename /* i : name of the output audio file */ +) +{ + ivas_error error = IVAS_ERR_OK; + + memset( rtp, 0, sizeof( IVAS_RTP ) ); + + rtp->unpackCfg.maxFramesPerPacket = IVAS_MAX_FRAMES_PER_RTP_PACKET; + rtp->rtpPacket.buffer = rtp->packet; + rtp->rtpPacket.capacity = sizeof( rtp->packet ); + + error = IVAS_RTP_UNPACK_Open( &rtp->hUnpack, &rtp->unpackCfg ); + if ( error == IVAS_ERR_OK ) + { + error = IvasRtpFile_Open( inputBitstreamFilename, false, &rtp->hRtpFile ); + if ( error != IVAS_ERR_OK ) + { + return error; + } + + if ( piOutputFilename != NULL ) + { + rtp->f_piDataOut = fopen( piOutputFilename, "w" ); + if ( rtp->f_piDataOut == NULL ) + { + fprintf( stderr, "could not open: %s\n", piOutputFilename ); + return IVAS_ERR_FAILED_FILE_OPEN; + } + fprintf( rtp->f_piDataOut, "{\n" ); + } + } + + if ( isExtOutput ) + { + char ext_pi[12]; + + /* sizeof( ext_pi ) accounts for terminating NULL, don't subtract extra 1 */ + const int32_t maxNameLenWithoutExt = FILENAME_MAX - (int32_t) sizeof( ext_pi ); + strncpy( rtp->piExtFilename, outputWavFilename, maxNameLenWithoutExt ); + snprintf( ext_pi, sizeof( ext_pi ), ".pidata.csv" ); + + /* strlen( metadata_filename[0] ) doesn't account for terminating NULL, subtract extra 1 */ + const int32_t maxNumCharactersToAppend = FILENAME_MAX - (int32_t) strlen( rtp->piExtFilename ) - 1; + strncat( rtp->piExtFilename, ext_pi, maxNumCharactersToAppend ); + + rtp->f_piExtOut = fopen( rtp->piExtFilename, "w" ); + if ( rtp->f_piExtOut == NULL ) + { + fprintf( stderr, "could not open: %s\n", rtp->piExtFilename ); + return IVAS_ERR_FAILED_FILE_OPEN; + } + } + + return error; +} + +ivas_error IVAS_RTP_WriteNextFrame( + IVAS_RTP *rtp, /* i/o : IVAS RTP File writer handle */ + uint8_t *au, /* i : IVAS Compressed AU (Packed frame) */ + const IVAS_RTP_SR_INFO *srInfo, /* i : Split rendering info in present, else NULL */ + int16_t auSizeBits, /* i : Frame size in bits */ + bool isMono, /* i : input was evs(true) or ivas(false) */ + bool forcePacket /* i : force packets with whatever frames pushed so far */ +) +{ + ivas_error error = IVAS_ERR_OK; + uint32_t nProcPiData = 0; + IVAS_DATA_BUFFER packedFrame = { 0, 0, NULL }; + + packedFrame.capacity = ( auSizeBits + 7 ) / 8; + packedFrame.length = ( auSizeBits + 7 ) / 8; + packedFrame.buffer = (uint8_t *) au; + rtp->rtpPacket.length = 0; + + /* Push Encoded Stream to */ + error = IVAS_RTP_PACK_PushFrame( rtp->hPack, + isMono ? IVAS_RTP_EVS : IVAS_RTP_IVAS, + srInfo, + &packedFrame ); + if ( error != IVAS_ERR_OK ) + { + return error; + } + + while ( rtp->nWrittenPiData > 0 ) + { + PIDATA_TS *piDataTs = &rtp->piData[nProcPiData++]; + if ( ( error = IVAS_RTP_PACK_PushPiData( rtp->hPack, (const IVAS_PIDATA_GENERIC *) &piDataTs->data ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while pushing scene orientation\n", ivas_error_to_string( error ) ); + return error; + } + rtp->nWrittenPiData--; + } + + if ( forcePacket || IVAS_RTP_PACK_GetNumFrames( rtp->hPack ) == rtp->packCfg.maxFramesPerPacket ) + { + uint32_t numFramesInPayload = 0; + + /* Generate RTP Packet */ + if ( ( error = IVAS_RTP_PACK_GetPacket( rtp->hPack, &rtp->rtpPacket, &numFramesInPayload ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while packing RTP Header\n", ivas_error_to_string( error ) ); + return error; + } + + if ( ( error = IvasRtpFile_Write( rtp->hRtpFile, rtp->rtpPacket.buffer, rtp->rtpPacket.length ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while writing RTP packet\n", ivas_error_to_string( error ) ); + return error; + } + } + + return error; +} + +ivas_error IVAS_RTP_ReadNextFrame( + IVAS_RTP *rtp, /* i/o : IVAS RTP File reader handle */ + uint8_t *au, /* o : Read next IVAS Compressed AU (Packed frame) */ + int16_t *auSizeBits, /* o : Reported Frame size in bits */ + uint32_t *rtpTimeStamp, /* o : RTP Timestamp for this frame */ + uint16_t *rtpSequenceNumber, /* o : RTP sequence number for this packet */ + uint32_t *nextPacketRcvTime_ms, /* i/o : Clock indicating packet receive times need in JBM */ + IVAS_RTP_SR_INFO *srInfo, /* o : Split Rendering info if SR RTP frame unpacked */ + bool *qBit /* o : AMRWB Q bite as indicated in the RTP packet */ +) +{ + ivas_error error = IVAS_ERR_OK; + IVAS_DATA_BUFFER packedFrame; + IVAS_RTP_CODEC codecId = IVAS_RTP_IVAS; + bool isAMRWB_IOmode = false; + + packedFrame.length = 0; + packedFrame.buffer = au; + packedFrame.capacity = ( IVAS_MAX_BITS_PER_FRAME / 8 ); + if ( rtp->numFramesInPacket == 0 ) + { + rtp->rtpPacket.length = 0; + if ( ( error = IvasRtpFile_Read( rtp->hRtpFile, rtp->rtpPacket.buffer, &rtp->rtpPacket.length, rtp->rtpPacket.capacity ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = IVAS_RTP_UNPACK_PushPacket( rtp->hUnpack, &rtp->rtpPacket, + &rtp->numFramesInPacket, &rtp->numPiDataInPacket, + &rtp->remoteRequestBitmap ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "failed to unpack RTP packet error = %s\n", ivas_error_to_string( error ) ); + return error; + } + + rtp->nReadPiData = 0; + rtp->nProcPiData = 0; + + /* Pre-read all PI data */ + while ( rtp->numPiDataInPacket != 0 ) + { + PIDATA_TS *piData = &rtp->piData[rtp->nReadPiData]; + if ( ( error = IVAS_RTP_UNPACK_PullNextPiData( rtp->hUnpack, (IVAS_PIDATA_GENERIC *) &piData->data, sizeof( piData->data ), &piData->timestamp ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "failed to pull PI Data, error = %s\n", ivas_error_to_string( error ) ); + return error; + } + rtp->nReadPiData++; + rtp->numPiDataInPacket--; + } + IVAS_RTP_LogPiData( rtp->f_piDataOut, rtp->piData, rtp->nReadPiData ); + } + + error = IVAS_RTP_UNPACK_PullFrame( rtp->hUnpack, &codecId, &rtp->srInfo, &packedFrame, auSizeBits, rtpTimeStamp, rtpSequenceNumber, &rtp->speechLostIndicated, &isAMRWB_IOmode ); + if ( error != IVAS_ERR_OK ) + { + fprintf( stderr, "failed to pull frame after unpack\n" ); + return error; + } + + rtp->restartNeeded = false; + if ( *auSizeBits == 0 ) + { + /* NO_DATA_FRAME/SPEECH_LOST for IVAS and EVS is indicated by same bits + Do not restart decoder on codec/amrwb mode change in this case */ + } + else + { + rtp->restartNeeded = ( rtp->codecId != codecId ) || + ( codecId == IVAS_RTP_EVS && ( rtp->isAMRWB_IOmode != isAMRWB_IOmode ) ); + + if ( rtp->restartNeeded ) + { + fprintf( stdout, "\nRTP packet codec changed %s -> %s\n", + ( rtp->codecId == IVAS_RTP_EVS ) ? ( rtp->isAMRWB_IOmode ? "AMRWB_IO" : "EVS" ) : "IVAS", + ( codecId == IVAS_RTP_EVS ) ? ( isAMRWB_IOmode ? "AMRWB_IO" : "EVS" ) : "IVAS" ); + } + + rtp->codecId = codecId; + rtp->isAMRWB_IOmode = isAMRWB_IOmode; + } + + if ( srInfo != NULL ) + { + *srInfo = rtp->srInfo; + } + *qBit = !rtp->speechLostIndicated; + rtp->numFramesInPacket--; + rtp->numFramesProduced++; + *nextPacketRcvTime_ms += 20; + + return IVAS_ERR_OK; +} + +uint16_t IVAS_RTP_OwnRandom( uint16_t *seed ) +{ + *seed = (uint16_t) ( *seed * 31821L + 13849L ); + + return ( *seed ); +} diff --git a/lib_util/ivas_rtp_file.h b/lib_util/ivas_rtp_file.h new file mode 100644 index 0000000000000000000000000000000000000000..571281086567cb17fa748acd5ff83c78024d270f --- /dev/null +++ b/lib_util/ivas_rtp_file.h @@ -0,0 +1,82 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_RTP_FILE_H +#define IVAS_RTP_FILE_H + +#include "common_api_types.h" +#include "ivas_rtp_api.h" +#include "ivas_rtp_pi_data.h" + +typedef struct IVAS_RTP_FILE *IVAS_RTP_FILE_HANDLE; + +typedef struct +{ + uint8_t packet[NOMINAL_BUFFER_SIZE( IVAS_MAX_FRAMES_PER_RTP_PACKET )]; + PIDATA_TS piData[IVAS_PI_MAX_ID * IVAS_MAX_FRAMES_PER_RTP_PACKET]; + + IVAS_RTP_FILE_HANDLE hRtpFile; + FILE *f_piDataOut; + FILE *f_piExtOut; + char piExtFilename[FILENAME_MAX]; + IVAS_RTP_CODEC codecId; + uint32_t nWrittenPiData; + uint32_t nReadPiData; + uint32_t nProcPiData; + uint32_t numFramesInPacket; + uint32_t numPiDataInPacket; + uint32_t remoteRequestBitmap; + bool speechLostIndicated; + bool restartNeeded; + bool isAMRWB_IOmode; + size_t numFramesProduced; + + IVAS_DATA_BUFFER rtpPacket; + IVAS_RTP_PACK_HANDLE hPack; + IVAS_RTP_UNPACK_HANDLE hUnpack; + IVAS_RTP_PACK_CONFIG packCfg; + IVAS_RTP_UNPACK_CONFIG unpackCfg; + IVAS_RTP_SR_INFO srInfo; +} IVAS_RTP; + +ivas_error IVAS_RTP_WRITER_Init( IVAS_RTP *rtp, const char *outputBitstreamFilename, uint32_t numFramesPerPacket, uint32_t SSRC, uint16_t seqNumInitVal ); +ivas_error IVAS_RTP_READER_Init( IVAS_RTP *rtp, const char *inputBitstreamFilename, const char *piOutputFilename, bool isExtOutput, const char *outputWavFilename ); +void IVAS_RTP_Term( IVAS_RTP *rtp ); +ivas_error IVAS_RTP_WriteNextFrame( IVAS_RTP *rtp, uint8_t *au, const IVAS_RTP_SR_INFO *srInfo, int16_t auSizeBits, bool isMono, bool forcePacket ); +ivas_error IVAS_RTP_ReadNextFrame( IVAS_RTP *rtp, uint8_t *au, int16_t *auSizeBits, uint32_t *rtpTimeStamp, uint16_t *rtpSequenceNumber, uint32_t *nextPacketRcvTime_ms, IVAS_RTP_SR_INFO *srInfo, bool *qBit ); +void IVAS_RTP_LogPiData( FILE *f_piDataOut, const PIDATA_TS *piData, uint32_t nPiDataPresent ); +void IVAS_RTP_WriteExtPiData( FILE *f_piDataOut, const PIDATA_TS *piData, uint32_t nPiDataPresent, uint16_t numObj ); +const char *IVAS_RTP_GetExtPiFilePath( IVAS_RTP *rtp ); +uint16_t IVAS_RTP_OwnRandom( uint16_t *seed ); + + +#endif /* IVAS_RTP_FILE_H */ diff --git a/lib_util/ivas_rtp_internal.h b/lib_util/ivas_rtp_internal.h new file mode 100644 index 0000000000000000000000000000000000000000..b0c9e2550d75778128f12b31d40f64eaf3b48727 --- /dev/null +++ b/lib_util/ivas_rtp_internal.h @@ -0,0 +1,147 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_RTP_INTERNAL_H +#define IVAS_RTP_INTERNAL_H + +#include "ivas_rtp_api.h" +#include "ivas_rtp_pi_data.h" + + +enum MASK_BITS +{ + MASK_1BIT = 0x1, + MASK_2BIT = 0x3, + MASK_3BIT = 0x7, + MASK_4BIT = 0xF, + MASK_5BIT = 0x1F, + MASK_6BIT = 0x3F, + MASK_7BIT = 0x7F, + MASK_8BIT = 0xFF, + MASK_9BIT = 0x1FF, + MASK_10BIT = 0x3FF, + MASK_11BIT = 0x7FF, + +}; + +/* tables */ +#define NBITS_AEID ( 7 ) +#define NBITS_RT60 ( 5 ) +#define NBITS_DSR ( 6 ) +#define NBITS_DIM ( 4 ) +#define NBITS_ABS ( 2 ) + +#define MASK_AEID ( ( 1u << NBITS_AEID ) - 1 ) +#define MASK_RT60 ( ( 1u << NBITS_RT60 ) - 1 ) +#define MASK_DSR ( ( 1u << NBITS_DSR ) - 1 ) +#define MASK_DIM ( ( 1u << NBITS_DIM ) - 1 ) +#define MASK_ABS ( ( 1u << NBITS_ABS ) - 1 ) + +#define MAX_PI_POSITION_METERS ( 327.68f ) +#define FLOAT_FROM_Q15( q15Val ) ( (float) ( q15Val ) / 32768.0f ) +#define MAX_PI_COMPACT_POSITION_XY_METERS ( 10.24f ) +#define MAX_PI_COMPACT_POSITION_Z_METERS ( 5.12f ) +#define FLOAT_FROM_Q10( q10Val ) ( (float) ( q10Val ) / 1024.0f ) +#define FLOAT_FROM_Q9( q9Val ) ( (float) ( q9Val ) / 512.0f ) +#define FLOAT_FROM_Q7( q7Val ) ( (float) ( q7Val ) / 128.0f ) + +extern const float mapDSR[1u << NBITS_DSR]; +extern const float mapRT60[1u << NBITS_RT60]; +extern const float mapRoomDims[1u << NBITS_DIM]; +extern const float mapAbsorbtion[1u << NBITS_ABS]; + +enum IVAS_RTP_HEADER_BITS +{ + + EBYTE_TOC_HEADER_BIT = 0x80, /* Ebyte/ToC indicator H bit, 1 = EByte, 0 = ToC */ + + TOC_HEADER_FOLLOWS = 0x40, /* ToC header byte is followed by another header byte */ + TOC_INDICATE_NO_DATA_AMRWB = 0x3F, /* ToC byte indicates NO_DATA in DTX mode for AMRWB */ + TOC_INDICATE_NO_DATA = 0x0F, /* ToC header byte indicates NO_DATA in DTX mode */ + TOC_INDICATE_IVAS = 0x10, /* ToC header byte indicates IVAS data */ + TOC_INDICATE_EVS = 0x00, /* ToC header byte indicates EVS data */ + TOC_INDICATE_AMRWB = 0x30, /* ToC header byte indicates AMR-WB IO data */ + TOC_INDICATE_ARMWB_Q = 0x20, /* ToC header byte indicates AMR-WB IO lost frame */ + TOC_INDICATE_SR = 0x1E, /* Indicate Split Rendering in ToC bytes */ + + EBYTE_CMR_T_EVS_NB = 0x80, /* Initial E-byte indicating EVS NarrowBand modes */ + EBYTE_CMR_T_EVS_IO = 0x90, /* Initial E-byte indicating EVS AMRWB IO modes */ + EBYTE_CMR_T_EVS_WB = 0xA0, /* Initial E-byte indicating EVS WideBand modes */ + EBYTE_CMR_T_EVS_SWB = 0xB0, /* Initial E-byte indicating EVS SuperWideBand modes */ + EBYTE_CMR_T_EVS_FB = 0xC0, /* Initial E-byte indicating EVS FullBand modes */ + EBYTE_CMR_T_EVS_CA_WB = 0xD0, /* Initial E-byte indicating EVS CA WideBand modes */ + EBYTE_CMR_T_EVS_CA_SWB = 0xE0, /* Initial E-byte indicating EVS CA SuperWideBand modes */ + EBYTE_CMR_T_IVAS = 0xF0, /* Initial E-byte indicating IVAS modes */ + EBYTE_CMR_T_NO_REQ = 0xFF, /* If no bitrate and no CA mode requested for IVAS/EVS */ + + + EBYTE_BANDWIDTH_REQUEST = 0x80, /* Subsequent E-byte for Bandwidth Request */ + EBYTE_FORMAT_REQUEST = 0x90, /* Subsequent E-byte for Format Request */ + EBYTE_SUBFORMAT_REQUEST = 0x9F, /* Subsequent E-byte for SubFormat Request */ + EBYTE_PI_INDICATOR = 0xA0, /* Subsequent E-byte for PI Indicator */ + EBYTE_SR_REQUEST = 0xB0, /* Subsequent E-byte for Split Rendering Request */ + + PI_HEADER_PF_LAST = 0x00, /* Last PI header of the Payload in PI Header */ + PI_HEADER_PF_NOT_LAST = 0x80, /* Another PI header follows after this in PI Header */ + PI_HEADER_PM_NOT_LAST = 0x20, /* PI Frame Marker, not the last PI Header in current frame */ + PI_HEADER_PM_LAST = 0x40, /* PI Frame Marker, the last PI Header in current frame */ + PI_HEADER_PM_GENERIC = 0x60, /* PI Frame Marker, Generic applied to all frames */ + + PI_AD_SPEECH_INDICATED = 0x80, /* Audio Description indicate Speech in Audio data */ + PI_AD_MUSIC_INDICATED = 0x40, /* Audio Description indicate Misuc in Audio data */ + PI_AD_AMBIANCE_INDICATED = 0x20, /* Audio Description indicate Ambiance in Audio data */ + PI_AD_EDITABLE_INDICATED = 0x10, /* Audio Description indicate metadata is editable */ + PI_AD_BINAURAL_INDICATED = 0x8, /* Audio Description indicate Stereo stream in Binaural */ + +}; + + +#define ERR_CHECK_RETURN( err ) \ + { \ + if ( ( err ) != IVAS_ERR_OK ) \ + { \ + return ( err ); \ + } \ + } + + +typedef struct +{ + uint32_t size; + uint8_t data[IVAS_PI_MAX_DATA_SIZE]; +} PIDATA_PACKED; + +ivas_error PI_PackData( const IVAS_PIDATA_GENERIC *piData, PIDATA_PACKED *packed, uint8_t pmBits ); +ivas_error PI_UnPackData( uint8_t piDataType, uint32_t piSize, const uint8_t *piDataBuffer, IVAS_PIDATA_GENERIC *piData ); + + +#endif /* IVAS_RTP_INTERNAL_H */ diff --git a/lib_util/ivas_rtp_payload.c b/lib_util/ivas_rtp_payload.c new file mode 100644 index 0000000000000000000000000000000000000000..9f6c22508e9e75556ae82e59bba1d137bcf6c887 --- /dev/null +++ b/lib_util/ivas_rtp_payload.c @@ -0,0 +1,1828 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ +#include +#include +#include +#include "common_api_types.h" + + +#include "ivas_rtp_internal.h" +#include "ivas_bpool.h" +#include "ivas_queue.h" +#include "ivas_error_utils.h" +#include "mutex.h" + +#define IVAS_MAX_BYTES_PER_FRAME ( ( IVAS_MAX_BITS_PER_FRAME + 7 ) >> 3 ) +#define MAX_TOC_PER_FRAME ( 2u ) /* Main ToC Byte + SR-ToC byte */ + +/* Generic RTP Header + Header Extension data structure */ +typedef struct +{ + uint32_t ssrc; /* synchronization source id as negotiated in SDP */ + uint8_t version; /* version of RTP protocol, currently 2 */ + bool padding; /* false = no padding, true = zeoo padded payload (last byte = padding count) */ + bool extension; /* true = extension header is present before payload */ + uint8_t CC; /* if some streams mixed together, CC indicates no. of contributing sources (4 bits) */ + bool marker; /* Marker bit field */ + uint8_t payloadType; /* 7-bit payload type field indicating IVAS */ + uint16_t seqNumber; /* 16-bit sequence number for RTP packets */ + uint32_t timestamp; /* timer ticks @ 16KHz clock corrsponding to 1st frame in the Payload */ + uint32_t CSRC[15]; /* SSRC of contributing Sources for a mixed stream */ + uint16_t extHeaderId; /* extension header ID */ + uint16_t numExtUnits; /* length of the extension data in 32-bit words */ + uint8_t *extData; /* Extension data pointer */ +} RTP_HEADER; + +typedef struct +{ + PIDATA_PACKED piData[IVAS_PI_MAX_ID]; /* pi data per frame */ + uint32_t piDataBitmap; /* bitmap showing available pi */ + uint32_t numPiDataAvailable; /* number of pi data available */ +} PIDATA_FRAME; + +static void initRequests( IVAS_RTP_REQUEST_VALUE *requests ) +{ + requests[IVAS_REQUEST_CODEC].codec = IVAS_RTP_IVAS; + requests[IVAS_REQUEST_BITRATE].bitrate = 0; + requests[IVAS_REQUEST_BANDWIDTH].bandwidth = IVAS_BANDWIDTH_NO_REQ; + requests[IVAS_REQUEST_FORMAT].formatType = IVAS_FMT_NO_REQ; + requests[IVAS_REQUEST_CA_MODE].caMode = IVAS_RTP_CA_NO_REQ; + requests[IVAS_REQUEST_SUBFORMAT].subFormatType = IVAS_SUBFMT_NO_REQ; + requests[IVAS_REQUEST_SR_CONFIG].srConfig.valid = false; +} + +static void initPiDataFrame( PIDATA_FRAME *piDataFrm ) +{ + /* Add NO_PI_DATA by default */ + piDataFrm->numPiDataAvailable = 1; + piDataFrm->piDataBitmap = ( 1u << IVAS_PI_NO_DATA ); + piDataFrm->piData[IVAS_PI_NO_DATA].size = 2; + piDataFrm->piData[IVAS_PI_NO_DATA].data[0] = ( IVAS_PI_NO_DATA ); /* PF/PM populated during final packing */ + piDataFrm->piData[IVAS_PI_NO_DATA].data[1] = 0; /* NO_PI_DATA is 0 bytes */ +} + +typedef struct FRAME_NODE +{ + struct FRAME_NODE *next; /* next node */ + PIDATA_FRAME piDataFrame; /* PI data for this frame */ + uint8_t au[IVAS_MAX_BYTES_PER_FRAME]; /* ivas/evs packed frame (AU) */ + uint8_t toc[MAX_TOC_PER_FRAME]; /* ToC bytes for this frame */ + uint32_t auNumBits; /* Actual frame size in bits */ + uint32_t tocNumBytes; /* valid ToC bytes (1 or 2) */ +} FRAME_NODE; + +static void initFrameNode( FRAME_NODE *node ) +{ + node->next = NULL; + initPiDataFrame( &node->piDataFrame ); + node->auNumBits = 0; + node->tocNumBytes = 0; +} + +struct IVAS_RTP_PACK +{ + mtx_t apilock; /* Lock to handle concurrent API invocation */ + bool amrwbIOMode; /* If EVS is an AMRWB-IO mode frame */ + RTP_HEADER header; /* RTP Header Params */ + BPOOL_HANDLE packNodePool; /* Buffer pool to allocate FRAME_NODEs */ + PIDATA_FRAME piDataCache; /* temporary cache for PI data pushed before any frame is available in Queue */ + IVAS_RTP_PACK_CONFIG initConfig; /* Initial Configuration for Unpacker */ + IVAS_RTP_REQUEST_VALUE requests[IVAS_REQUEST_MAX]; /* Requests Storage */ + QUEUE_HANDLE frameQ; /* frames queue for FRAME_NODEs */ +}; + +typedef struct +{ + IVAS_RTP_CODEC codecId; /* Coded frame type (IVAS/EVS) */ + uint32_t auNumBits; /* Actual frame size in bits */ + bool speechLostIndicated; /* Speech Lost indicated */ + bool isAMRWB_IOmode; /* EVS frame is AMRWB_IO */ + IVAS_RTP_SR_INFO srInfo; /* Split Rendering Info */ +} TOC_INFO; + +typedef struct PIDATA_NODE +{ + struct PIDATA_NODE *next; /* next node is first element */ + PIDATA data; /* unpacked pi data per frame */ + uint32_t timestamp; /* rtp timestamp of this frame */ +} PIDATA_NODE; + +typedef struct UNPACK_NODE +{ + struct UNPACK_NODE *next; /* next node is first element */ + uint8_t au[IVAS_MAX_BYTES_PER_FRAME]; /* ivas/evs packed frame (AU) */ + TOC_INFO toc; /* unpacked ToC information */ + uint32_t timestamp; /* timestamp of this frame */ + uint16_t seqNumber; /* sequence number of the packet */ +} UNPACK_NODE; + +struct IVAS_RTP_UNPACK +{ + mtx_t apilock; /* Lock to handle concurrent API invocation */ + size_t maxNumberOfFrames; + size_t maxNumberOfPiData; + RTP_HEADER header; + BPOOL_HANDLE unpackNodePool; + BPOOL_HANDLE piDataPool; + IVAS_RTP_UNPACK_CONFIG initConfig; + IVAS_RTP_REQUEST_VALUE requests[IVAS_REQUEST_MAX]; + uint32_t numPiDataAvailable; /* number of pi data available */ + QUEUE_HANDLE frameQ; /* frame queue */ + QUEUE_HANDLE piDataQ; /* pi data queue */ +}; + +static const uint32_t ivasFrameSizeInBits[] = { + 264, 328, 488, 640, 960, 1280, 1600, 1920, 2560, 3200, 3840, 5120, 7680, 10240, 0, 104 +}; + +static const uint32_t evsFrameSizeInBits[] = { + 56, 144, 160, 192, 264, 328, 488, 640, 960, 1280, 1920, 2560, 48 +}; + +static const uint32_t amrWBIOFrameSizeInBits[] = { + 132, 177, 253, 285, 317, 365, 397, 461, 477, 35 +}; + + +/* Update the RTP Header structure */ +ivas_error IVAS_RTP_PACK_UpdateHeader( + IVAS_RTP_PACK_HANDLE hPack, /* i/o: pointer to an IVAS rtp packer handle to be opened */ + uint16_t seqNumInitVal, /* i : Initial sequence number to be used for 1st packet */ + uint32_t ssrc, /* i : Unique 32-bit Source ID as negotiated during SDP */ + uint8_t numCC, /* i : numCC indicates no. of contributing sources */ + uint32_t *csrc, /* i : SSRCs of contributing Sources for a mixed stream */ + uint16_t extHeaderId, /* i : extension header ID */ + uint16_t numExtensionBytes, /* i : length of the extension data */ + uint8_t *extData /* i : extension data pointer */ +) +{ + RTP_HEADER *header = &hPack->header; + + if ( numCC > 15 ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "CC must be less than 16" ); + } + + header->seqNumber = seqNumInitVal; + header->ssrc = ssrc; + header->CC = numCC; + if ( csrc != NULL ) + { + memcpy( header->CSRC, csrc, numCC & 0xF ); + } + + if ( ( numExtensionBytes > 0 ) && ( extData != NULL ) ) + { + header->extHeaderId = extHeaderId; + header->extData = realloc( header->extData, numExtensionBytes ); + if ( header->extData == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "failed to allocate extdata" ); + } + memcpy( header->extData, extData, numExtensionBytes ); + header->extension = true; + header->numExtUnits = numExtensionBytes / sizeof( uint32_t ); + } + else + { + header->numExtUnits = 0; + header->extension = false; + } + + return IVAS_ERR_OK; +} + +static void InitRtpHeader( + RTP_HEADER *header /* RTP header structure */ +) +{ + memset( header, 0, sizeof( *header ) ); + header->version = 2; +} + +static ivas_error PackRtpHeader( + RTP_HEADER *header, + IVAS_DATA_BUFFER *buf ) +{ + uint32_t nBytes = 0; + uint8_t CC = header->CC & MASK_4BIT; + uint32_t *CSRC = header->CSRC; + bool extension = header->extension && ( NULL != header->extData ); + uint32_t extensionLength = header->extension ? ( 1 + header->numExtUnits ) : 0; /* in u32 words */ + uint32_t packedLength = 12 + ( 4 * CC ) + ( 4 * extensionLength ); + + buf->length = 0; + if ( packedLength > buf->capacity ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient output buffer for RTP header packing" ); + } + + /* + +---+---+---+---+---+---+---+---+ + | V | V | P | X | CC (4 - bits) | + +---+---+---+---+---+---+---+---+ + */ + buf->buffer[nBytes++] = ( header->version << 6 ) | + ( (uint8_t) header->padding << 5 ) | + ( (uint8_t) extension << 4 ) | + CC; + /* + +---+---+---+---+---+---+---+---+ + | M | PT (7 - bits) | + +---+---+---+---+---+---+---+---+ + */ + buf->buffer[nBytes++] = ( (uint8_t) header->marker << 7 ) | + ( header->payloadType & MASK_7BIT ); + /* + +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + | SEQUENCE NUMBER (16 bit) | + +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + */ + buf->buffer[nBytes++] = (uint8_t) ( header->seqNumber >> 8 ); + buf->buffer[nBytes++] = (uint8_t) ( header->seqNumber ); + + /* Timestamp (32-bit) */ + buf->buffer[nBytes++] = (uint8_t) ( header->timestamp >> 24 ); + buf->buffer[nBytes++] = (uint8_t) ( header->timestamp >> 16 ); + buf->buffer[nBytes++] = (uint8_t) ( header->timestamp >> 8 ); + buf->buffer[nBytes++] = (uint8_t) ( header->timestamp >> 0 ); + + /* SSRC (32-bit) */ + buf->buffer[nBytes++] = (uint8_t) ( header->ssrc >> 24 ); + buf->buffer[nBytes++] = (uint8_t) ( header->ssrc >> 16 ); + buf->buffer[nBytes++] = (uint8_t) ( header->ssrc >> 8 ); + buf->buffer[nBytes++] = (uint8_t) ( header->ssrc >> 0 ); + + /* CSRC Identifiers */ + while ( CC ) + { + /* CSRC[n] (32-bit) */ + uint32_t id = *CSRC++; + buf->buffer[nBytes++] = (uint8_t) ( id >> 24 ); + buf->buffer[nBytes++] = (uint8_t) ( id >> 16 ); + buf->buffer[nBytes++] = (uint8_t) ( id >> 8 ); + buf->buffer[nBytes++] = (uint8_t) ( id >> 0 ); + CC--; + } + + if ( extension ) + { + buf->buffer[nBytes++] = (uint8_t) ( header->extHeaderId >> 8 ); + buf->buffer[nBytes++] = (uint8_t) ( header->extHeaderId >> 0 ); + buf->buffer[nBytes++] = (uint8_t) ( header->numExtUnits >> 8 ); + buf->buffer[nBytes++] = (uint8_t) ( header->numExtUnits >> 0 ); + + memcpy( &buf->buffer[nBytes], header->extData, header->numExtUnits * 4 ); + nBytes += header->numExtUnits; + } + + buf->length = nBytes; + return IVAS_ERR_OK; +} + +static void UpdateRtpHeader( + RTP_HEADER *header, /* RTP header structure */ + uint32_t timestampOffset /* Timestamp offset @ 16KHz clock for next frame */ +) +{ + header->seqNumber++; + header->timestamp += timestampOffset; +} + +static ivas_error UnpackRtpPacket( + const IVAS_DATA_BUFFER *packet, /* Input buffer with RTP Packet */ + RTP_HEADER *header, /* RTP header structure */ + uint32_t *numHeaderBytes /* No. of rtp header bytes */ +) +{ + uint32_t n = 0, nByte = 0, expectedSize = 12; + uint8_t byte; + + if ( packet->length < expectedSize ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNDERFLOW, "Insufficient input buffer for RTP header unpacking" ); + } + + /* + +---+---+---+---+---+---+---+---+ + | V | V | P | X | CC (4 - bits) | + +---+---+---+---+---+---+---+---+ + */ + byte = packet->buffer[nByte++]; + header->version = ( byte >> 6 ) & MASK_2BIT; + header->padding = ( byte >> 5 ) & MASK_1BIT; + header->extension = ( byte >> 4 ) & MASK_1BIT; + header->CC = ( byte & MASK_4BIT ); + + /* + +---+---+---+---+---+---+---+---+ + | M | PT (7 - bits) | + +---+---+---+---+---+---+---+---+ + */ + byte = packet->buffer[nByte++]; + header->marker = ( byte >> 7 ) & MASK_1BIT; + header->payloadType = byte & MASK_7BIT; + + /* + +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + | SEQUENCE NUMBER (16 bit) | + +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + */ + header->seqNumber = (uint16_t) packet->buffer[nByte++] << 8; + header->seqNumber |= (uint16_t) packet->buffer[nByte++] << 8; + + /* Timestamp (32-bit) */ + header->timestamp = ( (uint32_t) packet->buffer[nByte++] << 24 ); + header->timestamp |= ( (uint32_t) packet->buffer[nByte++] << 16 ); + header->timestamp |= ( (uint32_t) packet->buffer[nByte++] << 8 ); + header->timestamp |= ( (uint32_t) packet->buffer[nByte++] ); + + /* SSRC (32-bit) */ + header->ssrc = ( (uint32_t) packet->buffer[nByte++] << 24 ); + header->ssrc |= ( (uint32_t) packet->buffer[nByte++] << 16 ); + header->ssrc |= ( (uint32_t) packet->buffer[nByte++] << 8 ); + header->ssrc |= ( (uint32_t) packet->buffer[nByte++] ); + + expectedSize += ( header->CC ) * 4 + ( header->extension ? 4 : 0 ); + if ( packet->length < expectedSize ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNDERFLOW, "CC indicated but insufficient input buffer" ); + } + + /* CSRC Identifiers */ + for ( n = 0; n < header->CC; n++ ) + { + /* CSRC[n] (32-bit) */ + header->CSRC[n] = ( (uint32_t) packet->buffer[nByte++] << 24 ); + header->CSRC[n] |= ( (uint32_t) packet->buffer[nByte++] << 16 ); + header->CSRC[n] |= ( (uint32_t) packet->buffer[nByte++] << 8 ); + header->CSRC[n] |= ( (uint32_t) packet->buffer[nByte++] ); + } + + if ( header->extension ) + { + header->extHeaderId = ( (uint32_t) packet->buffer[nByte++] << 8 ); + header->extHeaderId |= ( (uint32_t) packet->buffer[nByte++] ); + header->numExtUnits = ( (uint32_t) packet->buffer[nByte++] << 8 ); + header->numExtUnits |= ( (uint32_t) packet->buffer[nByte++] ); + + expectedSize += header->numExtUnits * 4; + if ( packet->length < expectedSize ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNDERFLOW, "Extension Header indicated but insufficient input buffer" ); + } + + header->extData = realloc( header->extData, header->numExtUnits * 4 ); + if ( header->extData == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "failed to allocate extdata" ); + } + memcpy( header->extData, &packet->buffer[nByte], header->numExtUnits * 4 ); + nByte += header->numExtUnits * 4; + } + + *numHeaderBytes = nByte; + return IVAS_ERR_OK; +} + +static ivas_error getBitrateFromCodecAndFrameSize( + IVAS_RTP_CODEC codecId, + uint32_t frameLengthBytes, + uint32_t *bitrateKbps, + uint32_t *frameLenInBits, + uint8_t *tocByte, + bool *isAmrwbIOMode ) +{ + size_t n; + *bitrateKbps = 0; + *frameLenInBits = 0; + if ( codecId == IVAS_RTP_IVAS ) + { + /* Validate the framelength is supported for ivas frame */ + for ( n = 0; n < sizeof( ivasFrameSizeInBits ) / sizeof( ivasFrameSizeInBits[0] ); n++ ) + { + if ( ivasFrameSizeInBits[n] == frameLengthBytes * 8 ) + { + *bitrateKbps = ( frameLengthBytes * IVAS_NUM_FRAMES_PER_SEC * 8 ); /* bitrate in kbps */ + *frameLenInBits = frameLengthBytes * 8; /* frame length in bits */ + *tocByte = TOC_INDICATE_IVAS | ( n & MASK_4BIT ); /* bitrate index */ + return IVAS_ERR_OK; + } + } + return IVAS_ERR_INVALID_BITRATE; + } + else + { + /* Try if frameLength is a supported EVS frame length */ + for ( n = 0; n < sizeof( evsFrameSizeInBits ) / sizeof( evsFrameSizeInBits[0] ); n++ ) + { + if ( evsFrameSizeInBits[n] == frameLengthBytes * 8 ) + { + *bitrateKbps = ( frameLengthBytes * IVAS_NUM_FRAMES_PER_SEC * 8 ); /* bitrate in kbps */ + *frameLenInBits = frameLengthBytes * 8; /* frame length in bits */ + *tocByte = TOC_INDICATE_EVS | ( n & MASK_4BIT ); /* bitrate index */ + return IVAS_ERR_OK; + } + } + /* Try if frameLength is a supported AMRWB-IO frame length */ + for ( n = 0; n < sizeof( amrWBIOFrameSizeInBits ) / sizeof( amrWBIOFrameSizeInBits[0] ); n++ ) + { + uint32_t lengthInBits = amrWBIOFrameSizeInBits[n]; + if ( ( ( lengthInBits + 7 ) / 8 ) == frameLengthBytes ) + { + *isAmrwbIOMode = true; + *bitrateKbps = ( lengthInBits * IVAS_NUM_FRAMES_PER_SEC ); /* bitrate in kbps */ + *frameLenInBits = lengthInBits; /* frame length in bits */ + *tocByte = TOC_INDICATE_AMRWB | ( n & MASK_4BIT ); /* bitrate index */ + return IVAS_ERR_OK; + } + } + return IVAS_ERR_INVALID_BITRATE; + } +} + +ivas_error IVAS_RTP_PACK_Open( + IVAS_RTP_PACK_HANDLE *phPack, /* i/o: pointer to an IVAS rtp packer handle to be opened */ + const IVAS_RTP_PACK_CONFIG *config /* i : pointer to initial config for RTP Packer */ +) +{ + ivas_error error; + IVAS_RTP_PACK_HANDLE hPack; + uint32_t numFramesPerPacket = ( config->maxFramesPerPacket == 0 ) ? IVAS_MAX_FRAMES_PER_RTP_PACKET : config->maxFramesPerPacket; + + if ( phPack == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( numFramesPerPacket > IVAS_MAX_FRAMES_PER_RTP_PACKET ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Max frame per packet exeeds %d", IVAS_MAX_FRAMES_PER_RTP_PACKET ); + } + + *phPack = NULL; + if ( ( hPack = (IVAS_RTP_PACK_HANDLE) calloc( 1, sizeof( struct IVAS_RTP_PACK ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for IVAS rtppack handle" ); + } + + error = BPOOL_Create( &hPack->packNodePool, sizeof( FRAME_NODE ), numFramesPerPacket * 4 ); + ERR_CHECK_RETURN( error ); + + error = QUEUE_Create( &hPack->frameQ ); + ERR_CHECK_RETURN( error ); + + mtx_init( &hPack->apilock, 0 ); + hPack->initConfig = *config; + initRequests( hPack->requests ); + InitRtpHeader( &hPack->header ); + initPiDataFrame( &hPack->piDataCache ); + *phPack = hPack; + return IVAS_ERR_OK; +} + +/* Close and free an existing instance of rtp packer */ +void IVAS_RTP_PACK_Close( + IVAS_RTP_PACK_HANDLE *phPack /* i/o : pointer to an IVAS rtp packer handle to be closed */ +) +{ + IVAS_RTP_PACK_HANDLE hPack; + + /* Free all memory */ + if ( phPack == NULL || *phPack == NULL ) + { + return; + } + + hPack = *phPack; + QUEUE_Destroy( &hPack->frameQ ); + mtx_destroy( &hPack->apilock ); + BPOOL_Destroy( &hPack->packNodePool ); + free( hPack->header.extData ); + free( hPack ); + *phPack = NULL; +} + +ivas_error IVAS_RTP_PACK_PushRemoteRequest( + IVAS_RTP_PACK_HANDLE hPack, /* i/o : IVAS rtp packer handle */ + IVAS_RTP_REQUEST_TYPE reqType, /* i : remote request type */ + IVAS_RTP_REQUEST_VALUE reqValue /* i : value of the requested type */ +) +{ + if ( reqType < 0 || reqType >= IVAS_REQUEST_MAX ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid request key provided" ); + } + + /* Sanity on API */ + switch ( reqType ) + { + case IVAS_REQUEST_CODEC: + { + uint32_t codec = reqValue.codec; + if ( codec != IVAS_RTP_IVAS && codec != IVAS_RTP_EVS ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Unsupported codec id provided" ); + } + } + break; + case IVAS_REQUEST_BITRATE: + { + uint32_t bitrate = reqValue.bitrate; + if ( bitrate < 5900 || bitrate > 512000 ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Unsupported bitrate provided" ); + } + } + break; + case IVAS_REQUEST_BANDWIDTH: + { + uint32_t bandwidth = reqValue.bandwidth; + if ( bandwidth > IVAS_BANDWIDTH_NO_REQ ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Unsupported bandwidth provided" ); + } + } + break; + case IVAS_REQUEST_FORMAT: + { + uint32_t format = reqValue.formatType; + if ( format > IVAS_FMT_NO_REQ ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Unsupported format provided" ); + } + } + break; + case IVAS_REQUEST_CA_MODE: + { + uint32_t caMode = reqValue.caMode; + if ( caMode > IVAS_RTP_CA_NO_REQ ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Unsupported channel aware mode provided" ); + } + } + break; + case IVAS_REQUEST_SUBFORMAT: + { + uint32_t subFormat = reqValue.subFormatType; + if ( subFormat > IVAS_SUBFMT_NO_REQ ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Unsupported subformat provided" ); + } + } + break; + case IVAS_REQUEST_SR_CONFIG: + { + IVAS_RTP_SPLITRENDER srConfig = reqValue.srConfig; + if ( srConfig.reserved != 0 ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Unsupported reserved bits in SR config provided" ); + } + } + break; + default: + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Unsupported request type" ); + } + + hPack->requests[reqType] = reqValue; + + return IVAS_ERR_OK; +} + +static bool isAmrWBIOMode( uint32_t bitrate, uint32_t *idx ) +{ + size_t n; + *idx = 0; + for ( n = 0; n < sizeof( amrWBIOFrameSizeInBits ) / sizeof( amrWBIOFrameSizeInBits[0] ); n++ ) + { + if ( bitrate == ( amrWBIOFrameSizeInBits[n] * IVAS_NUM_FRAMES_PER_SEC ) ) + { + *idx = n; + return true; + } + } + return false; +} + +static uint32_t getBitrateIdx( const uint32_t *table, uint32_t tableLen, uint32_t bitrate ) +{ + size_t n, idx = 0; + + for ( n = 0; n < tableLen; n++ ) + { + if ( bitrate > ( table[n] * IVAS_NUM_FRAMES_PER_SEC ) ) + { + idx = n; + } + else + { + return idx; + } + } + return idx; +} + +static void packEBytes( + IVAS_RTP_PACK_HANDLE hPack, /* i/o : IVAS rtp packer handle */ + bool piDataPresent, /* i : Signals if PI data present */ + size_t maxNumEBytes, /* i : max capacity of eByte buffer */ + uint8_t *eByte, /* o : output buffer for E-Bytes */ + size_t *nBytesWritten /* o : max capacity of eByte buffer */ +) +{ + /* Initial E-byte structure + * 0 1 2 3 4 5 6 7 + * +-+-+-+-+-+-+-+-+ + * |H|T|T|T| BR | + * +-+-+-+-+-+-+-+-+ + */ + uint32_t nByte = 0; + uint8_t T = EBYTE_CMR_T_IVAS; /* IVAS */ + uint8_t BR = 0; + + IVAS_RTP_CODEC codec = hPack->requests[IVAS_REQUEST_CODEC].codec; + IVAS_RTP_BANDWIDTH bandwidth = hPack->requests[IVAS_REQUEST_BANDWIDTH].bandwidth; + uint32_t bitrate = hPack->requests[IVAS_REQUEST_BITRATE].bitrate; + uint32_t bitrateIdx = 0; + + *nBytesWritten = 0; + + if ( codec == IVAS_RTP_EVS ) + { + /* If requesting EVS/AMRWB IO from farend, only Initial E-byte present */ + IVAS_RTP_CA_MODE caMode = hPack->requests[IVAS_REQUEST_CA_MODE].caMode; + + if ( caMode != IVAS_RTP_CA_NO_REQ ) + { + T = ( bandwidth == IVAS_BANDWIDTH_SWB ) ? EBYTE_CMR_T_EVS_CA_SWB : EBYTE_CMR_T_EVS_CA_WB; + BR = caMode & MASK_3BIT; /* only 8 valid values */ + if ( nByte < maxNumEBytes ) + { + eByte[nByte++] = ( T | BR ); + } + } + else if ( bitrate > 0 && isAmrWBIOMode( bitrate, &bitrateIdx ) ) + { + /* AMR WB IO Mode */ + T = EBYTE_CMR_T_EVS_IO; + BR = (uint8_t) bitrateIdx & MASK_4BIT; + if ( nByte < maxNumEBytes ) + { + eByte[nByte++] = ( T | BR ); + } + } + else if ( bitrate > 0 ) + { + /* EVS Modes */ + bitrate = ( bitrate > 128000 ) ? 128000 : bitrate; + bitrate = ( bitrate < 5900 ) ? 5900 : bitrate; + bitrateIdx = getBitrateIdx( evsFrameSizeInBits, sizeof( evsFrameSizeInBits ) / sizeof( evsFrameSizeInBits[0] ), bitrate ); + BR = (uint8_t) bitrateIdx & MASK_4BIT; + + /* If a bandwidth choice cannot be signalled for a given bitrate + preference is given to bitrate choice, bandwidth req is modified */ + switch ( bandwidth ) + { + case IVAS_BANDWIDTH_NB: + T = ( bitrate <= 24400u ) ? EBYTE_CMR_T_EVS_NB : EBYTE_CMR_T_EVS_SWB; + break; + case IVAS_BANDWIDTH_WB: + T = EBYTE_CMR_T_EVS_WB; + break; + case IVAS_BANDWIDTH_SWB: + T = ( bitrate >= 9600u ) ? EBYTE_CMR_T_EVS_SWB : EBYTE_CMR_T_EVS_WB; + break; + case IVAS_BANDWIDTH_FB: + T = ( bitrate >= 16400u ) ? EBYTE_CMR_T_EVS_FB : EBYTE_CMR_T_EVS_WB; + break; + default: /*IVAS_BANDWIDTH_NO_REQ */ + T = ( bitrate >= 9600u ) ? EBYTE_CMR_T_EVS_SWB : EBYTE_CMR_T_EVS_WB; + break; + } + if ( nByte < maxNumEBytes ) + { + eByte[nByte++] = ( T | BR ); + } + } + else if ( piDataPresent ) + { + /* Send an initial E-byte to allow for subsequent PI indication E-byte */ + if ( nByte < maxNumEBytes ) + { + eByte[nByte++] = EBYTE_CMR_T_NO_REQ; + } + } + } + else + { + /* Requesting IVAS from farend, Subsequent E-byte indicate BW, CFR, SR */ + IVAS_RTP_FORMAT format = hPack->requests[IVAS_REQUEST_FORMAT].formatType; + bool isBandwidthProvided = ( bandwidth != IVAS_BANDWIDTH_NO_REQ && bandwidth != IVAS_BANDWIDTH_NB ); + bool isFormatProvided = ( format != IVAS_FMT_NO_REQ ); + bool isSubFormatProvided = false; + bool isSRConfigProvided = false; + + IVAS_RTP_SUBFORMAT subFormat = hPack->requests[IVAS_REQUEST_SUBFORMAT].subFormatType; + IVAS_RTP_SPLITRENDER srConfig = hPack->requests[IVAS_REQUEST_SR_CONFIG].srConfig; + + isSubFormatProvided = ( subFormat != IVAS_SUBFMT_NO_REQ ); + isSRConfigProvided = srConfig.valid; + + /* Initial E-Byte only sent if either bitrate requested or subsequent E-byte is requested */ + if ( !( ( bitrate > 0 ) || isBandwidthProvided || isFormatProvided || + isSubFormatProvided || isSRConfigProvided || piDataPresent ) ) + { + return; + } + + if ( bitrate > 0 ) + { + /* Initial E-Byte */ + bitrate = ( bitrate > 512000 ) ? 512000 : bitrate; + bitrate = ( bitrate < 13200 ) ? 13200 : bitrate; + bitrateIdx = getBitrateIdx( ivasFrameSizeInBits, sizeof( ivasFrameSizeInBits ) / sizeof( ivasFrameSizeInBits[0] ), bitrate ); + BR = (uint8_t) bitrateIdx & MASK_4BIT; + if ( nByte < maxNumEBytes ) + { + eByte[nByte++] = ( EBYTE_CMR_T_IVAS | BR ); + } + } + else + { + if ( nByte < maxNumEBytes ) + { + eByte[nByte++] = EBYTE_CMR_T_NO_REQ; + } + } + + /* Subsequent E-bytes - Bandwidth Request */ + if ( isBandwidthProvided && nByte < maxNumEBytes ) + { + uint8_t bw = ( bandwidth - IVAS_BANDWIDTH_WB ) & MASK_2BIT; + eByte[nByte++] = ( EBYTE_BANDWIDTH_REQUEST | bw ); + } + + /* Subsequent E-bytes - Coded Format Request */ + if ( ( isFormatProvided || isSubFormatProvided ) && nByte < maxNumEBytes ) + { + uint8_t fmtEByte = ( EBYTE_FORMAT_REQUEST | ( (uint8_t) format & MASK_3BIT ) ); + eByte[nByte++] = isSubFormatProvided ? EBYTE_SUBFORMAT_REQUEST : fmtEByte; + } + if ( isSubFormatProvided && nByte < maxNumEBytes ) + { + eByte[nByte++] = ( (uint8_t) subFormat & MASK_6BIT ); /* Requested Coded subFormat */ + } + /* Subsequent E-bytes - Split Renderer Configuration Request */ + if ( isSRConfigProvided && nByte < maxNumEBytes ) + { + eByte[nByte++] = EBYTE_SR_REQUEST | + ( (uint8_t) srConfig.diegetic << 3 ) | ( (uint8_t) srConfig.yaw << 2 ) | + ( (uint8_t) srConfig.pitch << 1 ) | ( (uint8_t) srConfig.roll << 0 ); + } + } + + /* Final E-byte is the PI Indicator E-Byte */ + if ( piDataPresent && ( nByte < maxNumEBytes ) ) + { + eByte[nByte++] = EBYTE_PI_INDICATOR; /* PI Indication */ + } + + *nBytesWritten = nByte; +} + + +static ivas_error getSRToCByte( + const IVAS_RTP_SR_INFO *srInfo, /* i : Split Rendering Info */ + uint8_t *tocByte /* o : toc byte 2 */ +) +{ + uint8_t bitIdx, codecId, digetic, codecFrameSize; + + if ( srInfo->codecFrameSizeMs != 5 && srInfo->codecFrameSizeMs != 10 && srInfo->codecFrameSizeMs != 20 ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Unsupported codec framesize for SR provided" ); + } + if ( srInfo->bitrateKbps < 256000 || srInfo->bitrateKbps > 512000 ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Unsupported bitrate for SR" ); + } + + bitIdx = ( ( srInfo->bitrateKbps / 128000u ) - 1 ) & MASK_2BIT; + codecId = (uint8_t) srInfo->codec; + digetic = srInfo->diegetic ? 1 : 0; + + codecFrameSize = ( srInfo->codecFrameSizeMs == 20 ) ? 3 : (uint8_t) ( srInfo->codecFrameSizeMs / 5 ); + *tocByte = ( digetic << 6 ) | ( codecId << 5 ) | ( bitIdx << 3 ) | ( codecFrameSize << 1 ); + + return IVAS_ERR_OK; +} + +static void addPackedPiDataToFrame( PIDATA_FRAME *piDataFrm, const PIDATA_PACKED *packedPiData, uint32_t piDataType ) +{ + piDataFrm->piData[piDataType].size = packedPiData->size; + memcpy( piDataFrm->piData[piDataType].data, packedPiData->data, packedPiData->size ); + + /* Indicate th PI data type presense in bitmap, If the same pi data type is + already pushed for this frame, it is overwritten with the newer data */ + if ( !( piDataFrm->piDataBitmap & ( 1u << piDataType ) ) ) + { + piDataFrm->piDataBitmap |= ( 1u << piDataType ); + piDataFrm->numPiDataAvailable++; + } + + /* Atleast one valid PI data is now pushed for this frame, clear No PI data + for this frame */ + if ( piDataFrm->piDataBitmap & ( 1u << IVAS_PI_NO_DATA ) ) + { + piDataFrm->piDataBitmap &= ~( 1u << IVAS_PI_NO_DATA ); + piDataFrm->numPiDataAvailable--; + } +} + +ivas_error IVAS_RTP_PACK_PushFrame( + IVAS_RTP_PACK_HANDLE hPack, /* i/o : IVAS rtp packer handle */ + IVAS_RTP_CODEC codecId, /* i : Codec type (IVAS/EVS) */ + const IVAS_RTP_SR_INFO *srInfo, /* i : Split Rendering Info */ + const IVAS_DATA_BUFFER *frameBuffer /* i : packed frame bitstream for IVAS/EVS */ +) +{ + ivas_error error = IVAS_ERR_OK; + uint32_t bitrate = 0; + uint32_t frameLengthInBits = 0; + uint8_t tocByte = 0; + uint8_t tocByte1 = 0; + FRAME_NODE *node = NULL; + PIDATA_FRAME *piDataFrame = &hPack->piDataCache; + uint32_t piDataType = 0; + + if ( frameBuffer == NULL || frameBuffer->length == 0 ) + { + /* Indicates a NO_DATA_FRAME in case of DTX mode */ + tocByte = ( hPack->amrwbIOMode ) ? TOC_INDICATE_NO_DATA_AMRWB : TOC_INDICATE_NO_DATA; + } + else if ( srInfo != NULL && srInfo->valid ) + { + tocByte = TOC_INDICATE_SR; + frameLengthInBits = frameBuffer->length * 8; + error = getSRToCByte( srInfo, &tocByte1 ); + ERR_CHECK_RETURN( error ); + } + else + { + error = getBitrateFromCodecAndFrameSize( codecId, frameBuffer->length, &bitrate, &frameLengthInBits, &tocByte, &hPack->amrwbIOMode ); + ERR_CHECK_RETURN( error ); + } + + /* Allocate a new frame node for this frame */ + error = BPOOL_GetBuffer( hPack->packNodePool, (void **) &node ); + ERR_CHECK_RETURN( error ); + + initFrameNode( node ); + + /* Set ToC byte & frame */ + node->toc[node->tocNumBytes++] = tocByte; + if ( srInfo != NULL && srInfo->valid ) + { + node->toc[node->tocNumBytes++] = tocByte1; + } + + node->auNumBits = frameLengthInBits; + if ( frameBuffer != NULL ) + { + memcpy( node->au, frameBuffer->buffer, frameBuffer->length ); + } + + /* If some Pi data is is Cache add to Frame Node's associated Pi Data */ + mtx_lock( &hPack->apilock ); /* Lock to prevent access to shared cache */ + if ( piDataFrame->numPiDataAvailable ) + { + uint32_t bitmap = piDataFrame->piDataBitmap; + for ( piDataType = 0; piDataType < 32 && ( bitmap != 0 ); piDataType++ ) + { + uint32_t mask = ( 1u << piDataType ); + if ( bitmap & mask ) + { + bitmap &= ~mask; /* Mask out this pi type to indicate processed */ + addPackedPiDataToFrame( &node->piDataFrame, &piDataFrame->piData[piDataType], piDataType ); + } + } + initPiDataFrame( piDataFrame ); /* Reset Cache */ + } + mtx_unlock( &hPack->apilock ); + + /* Add to frames FiFo */ + QUEUE_Push( hPack->frameQ, (NODE *) node ); + + return IVAS_ERR_OK; +} + +uint32_t IVAS_RTP_PACK_GetNumFrames( + IVAS_RTP_PACK_HANDLE hPack /* i/o : IVAS rtp packer handle */ +) +{ + uint32_t nFrames = 0; + if ( hPack ) + { + nFrames = QUEUE_Size( hPack->frameQ ); + } + return nFrames; +} + +/* Push single PI data to rtp packer + * + * Provide PI data for a current RTP Payload. All PI data is locally cached in the packer + * and set to the rtp packet with policy defined in initial configuration during call to + * IVAS_RTP_PACK_GetPacket. + * + */ +ivas_error IVAS_RTP_PACK_PushPiData( + IVAS_RTP_PACK_HANDLE hPack, /* i/o : IVAS rtp packer handle */ + const IVAS_PIDATA_GENERIC *data /* i : pointer to the PIData stucture */ +) +{ + ivas_error error = IVAS_ERR_OK; + PIDATA_PACKED packedPiData; + + if ( data == NULL || + data->piDataType >= IVAS_PI_NO_DATA || /* NO_PI_DATA cannot be provided by user, it is generated in packing */ + data->size > sizeof( PIDATA ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Wrong PI Data provided" ); + } + + error = PI_PackData( data, &packedPiData, 0 ); + ERR_CHECK_RETURN( error ); + + mtx_lock( &hPack->apilock ); /* Lock to prevent access to shared cache */ + { + FRAME_NODE *node = (FRAME_NODE *) QUEUE_Back( hPack->frameQ ); + /* use cache if no frame in Queue to associate PI data */ + PIDATA_FRAME *piDataFrm = ( node != NULL ) ? &node->piDataFrame : &hPack->piDataCache; + addPackedPiDataToFrame( piDataFrm, &packedPiData, data->piDataType ); + } + mtx_unlock( &hPack->apilock ); + + return IVAS_ERR_OK; +} + +#define WRITE_BYTE_PAYLOAD_OR_EXIT( payload, byte ) \ + if ( payload->length < payload->capacity ) \ + { \ + uint8_t _byte = ( byte ); \ + payload->buffer[payload->length++] = _byte; \ + } \ + else \ + { \ + error = IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient memory to write RTP Payload" ); \ + goto err_exit; \ + } + +ivas_error IVAS_RTP_PACK_GetPayload( + IVAS_RTP_PACK_HANDLE hPack, /* i/o : IVAS rtp packer handle */ + IVAS_DATA_BUFFER *payload, /* o : encapsulated rtp payload */ + uint32_t *numFramesInPayload /* o : no. of frames in payload */ +) +{ + uint32_t n = 0, numFrame = 0; + ivas_error error = IVAS_ERR_OK; + uint32_t numPiDataPresent = 0; + FRAME_NODE *availableFrameNodes[IVAS_MAX_FRAMES_PER_RTP_PACKET]; + size_t numEBytes = 0; + + if ( payload == NULL ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Output data buffer is NULL" ); + } + + /* Calculate number of frames to pack in this payload */ + numFrame = QUEUE_Size( hPack->frameQ ); + numFrame = ( numFrame > hPack->initConfig.maxFramesPerPacket ) ? hPack->initConfig.maxFramesPerPacket : numFrame; + *numFramesInPayload = numFrame; /* numFrames in Packet */ + + /* Collect all the frame nodes from FiFo */ + for ( n = 0; n < numFrame; n++ ) + { + FRAME_NODE *node = (FRAME_NODE *) QUEUE_Pop( hPack->frameQ ); + if ( node == NULL ) + { + assert( 0 ); /* catastrophic error, implementation issue somewhere */ + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "NULL found in frame nodes" ); + } + /* Calculate number of PI data present in total */ + numPiDataPresent += node->piDataFrame.numPiDataAvailable; + availableFrameNodes[n] = node; + } + + /* IVAS Payload starts with E-Bytes */ + packEBytes( hPack, ( numPiDataPresent > 0 ), payload->capacity, &payload->buffer[payload->length], &numEBytes ); + payload->length += numEBytes; + + /* ToC bytes (atleast 1 byte per frame, 2 if SR )*/ + for ( n = 0; n < numFrame; n++ ) + { + FRAME_NODE *node = availableFrameNodes[n]; + uint8_t fBit = ( n != ( numFrame - 1 ) ) ? TOC_HEADER_FOLLOWS : 0; /* Next ToC present */ + + WRITE_BYTE_PAYLOAD_OR_EXIT( payload, ( node->toc[0] | fBit ) ); + if ( node->tocNumBytes == 2 ) + { + WRITE_BYTE_PAYLOAD_OR_EXIT( payload, node->toc[1] ); + } + } + + /* Frame Data */ + for ( n = 0; n < numFrame; n++ ) + { + FRAME_NODE *node = availableFrameNodes[n]; + size_t frameLength = ( node->auNumBits + 7 ) >> 3; /* zero padded length in bytes */ + if ( payload->length + frameLength <= payload->capacity ) + { + memcpy( &payload->buffer[payload->length], node->au, frameLength ); + } + else + { + error = IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient memory to write RTP Payload" ); + goto err_exit; + } + payload->length += frameLength; + } + + /* PI Data */ + if ( numPiDataPresent > 0 ) + { + bool skipPiData = false; + size_t nBytes = payload->length; + uint32_t numPiDataWritten = 0; + + for ( n = 0; n < numFrame; n++ ) + { + uint32_t piDataType = 0; + FRAME_NODE *node = availableFrameNodes[n]; + PIDATA_FRAME *piDataFrame = &node->piDataFrame; + uint32_t bitmap = piDataFrame->piDataBitmap; + uint8_t PM = 0, PF = 0; + + for ( piDataType = 0; piDataType < 32 && ( bitmap != 0 ); piDataType++ ) + { + uint32_t mask = ( 1u << piDataType ); + if ( bitmap & mask ) + { + bitmap &= ~mask; /* Mask out this pi type to indicate processing */ + /* Check if last PI data this frame */ + PM = piDataFrame->piData[piDataType].data[0] & 0x60; + PM = (uint8_t) ( ( bitmap == 0 && PM != PI_HEADER_PM_GENERIC ) ? PI_HEADER_PM_LAST : PM ); + /* Check if last PI data all frames */ + PF = (uint8_t) ( ( bitmap == 0 && ( numPiDataWritten + 1 == numPiDataPresent ) ) ? PI_HEADER_PF_LAST : PI_HEADER_PF_NOT_LAST ); /* Last PI in Payload */ + /* Update the first byte of PI Header with PF/PM */ + piDataFrame->piData[piDataType].data[0] |= ( PF | PM ); + if ( nBytes + piDataFrame->piData[piDataType].size < payload->capacity ) + { + memcpy( &payload->buffer[nBytes], piDataFrame->piData[piDataType].data, piDataFrame->piData[piDataType].size ); + nBytes += piDataFrame->piData[piDataType].size; + } + else + { + skipPiData = true; /* Not enough bytes in output for PI data */ + } + numPiDataWritten++; + } + } + } + if ( !skipPiData ) + { + payload->length = nBytes; /* update payload length after PI packing */ + } + } + +err_exit: + /* Pop frames from Queue */ + for ( n = 0; n < numFrame; n++ ) + { + if ( BPOOL_FreeBuffer( hPack->packNodePool, availableFrameNodes[n] ) != IVAS_ERR_OK ) + { + assert( 0 ); /* catastrophic error if this fails */ + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "frame node could not be freed" ); + } + availableFrameNodes[n] = NULL; + } + + return error; +} + +ivas_error IVAS_RTP_PACK_GetPacket( + IVAS_RTP_PACK_HANDLE hPack, /* i/o : IVAS rtp packer handle */ + IVAS_DATA_BUFFER *packet, /* o : encapsulated rtp packet */ + uint32_t *numFramesInPacket /* o : no. of frames in packet */ +) +{ + ivas_error error = PackRtpHeader( &hPack->header, packet ); + ERR_CHECK_RETURN( error ); + + error = IVAS_RTP_PACK_GetPayload( hPack, packet, numFramesInPacket ); + ERR_CHECK_RETURN( error ); + + UpdateRtpHeader( &hPack->header, ( *numFramesInPacket ) * 320 ); + + return IVAS_ERR_OK; +} + +ivas_error IVAS_RTP_UNPACK_Open( + IVAS_RTP_UNPACK_HANDLE *phUnpack, /* i/o : rtp unpacker handle */ + const IVAS_RTP_UNPACK_CONFIG *config /* i : initial configuration for rtp unpacker */ +) +{ + ivas_error error = IVAS_ERR_OK; + IVAS_RTP_UNPACK_HANDLE hUnpack; + + if ( phUnpack == NULL || config == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *phUnpack = NULL; + if ( ( hUnpack = (IVAS_RTP_UNPACK_HANDLE) calloc( 1, sizeof( struct IVAS_RTP_UNPACK ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for IVAS rtp unpack handle" ); + } + + if ( config->maxFramesPerPacket > IVAS_MAX_FRAMES_PER_RTP_PACKET ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Max frame per packet exeeds %d", IVAS_MAX_FRAMES_PER_RTP_PACKET ); + } + + hUnpack->maxNumberOfFrames = ( config->maxFramesPerPacket == 0 ) ? IVAS_MAX_FRAMES_PER_RTP_PACKET : config->maxFramesPerPacket; + hUnpack->maxNumberOfPiData = hUnpack->maxNumberOfFrames * IVAS_PI_MAX_ID; + + error = BPOOL_Create( &hUnpack->unpackNodePool, sizeof( UNPACK_NODE ), hUnpack->maxNumberOfFrames ); + ERR_CHECK_RETURN( error ); + + error = BPOOL_Create( &hUnpack->piDataPool, sizeof( PIDATA_NODE ), hUnpack->maxNumberOfPiData ); + ERR_CHECK_RETURN( error ); + + error = QUEUE_Create( &hUnpack->frameQ ); + ERR_CHECK_RETURN( error ); + + error = QUEUE_Create( &hUnpack->piDataQ ); + ERR_CHECK_RETURN( error ); + + hUnpack->initConfig = *config; + mtx_init( &hUnpack->apilock, 0 ); + + initRequests( hUnpack->requests ); + + *phUnpack = hUnpack; + return IVAS_ERR_OK; +} + +/* Close and free an existing instance of rtp unpacker */ +void IVAS_RTP_UNPACK_Close( + IVAS_RTP_UNPACK_HANDLE *phUnpack /* i/o : IVAS rtp unpacker handle */ +) +{ + IVAS_RTP_UNPACK_HANDLE hUnpack; + + /* Free all memory */ + if ( phUnpack == NULL || *phUnpack == NULL ) + { + return; + } + + hUnpack = *phUnpack; + mtx_destroy( &hUnpack->apilock ); + QUEUE_Destroy( &hUnpack->frameQ ); + QUEUE_Destroy( &hUnpack->piDataQ ); + BPOOL_Destroy( &hUnpack->piDataPool ); + BPOOL_Destroy( &hUnpack->unpackNodePool ); + free( hUnpack->header.extData ); + free( hUnpack ); + *phUnpack = NULL; +} + +static void setEVSRequests( IVAS_RTP_BANDWIDTH bandwidth, uint32_t bitrate, IVAS_RTP_CA_MODE caMode, IVAS_RTP_REQUEST_VALUE *requests ) +{ + requests[IVAS_REQUEST_CODEC].codec = IVAS_RTP_EVS; + requests[IVAS_REQUEST_CA_MODE].caMode = caMode; + requests[IVAS_REQUEST_BITRATE].bitrate = bitrate; + requests[IVAS_REQUEST_BANDWIDTH].bandwidth = bandwidth; +} + +static uint32_t parseInitialEByte( const IVAS_DATA_BUFFER *payload, uint32_t nBytes, IVAS_RTP_REQUEST_VALUE *requests ) +{ + if ( nBytes < payload->length ) + { + uint8_t byte = payload->buffer[nBytes]; + uint8_t EvsIvasIndicator = ( byte & ( ~MASK_4BIT ) ); + uint8_t BR = ( byte & MASK_4BIT ); + + if ( ( byte & EBYTE_TOC_HEADER_BIT ) == 0 ) + { + return nBytes; + } + + nBytes++; /* Consume this e-byte */ + + switch ( EvsIvasIndicator ) + { + case EBYTE_CMR_T_EVS_NB: + if ( BR < 7 ) + { + uint32_t bitrate = evsFrameSizeInBits[BR] * IVAS_NUM_FRAMES_PER_SEC; + setEVSRequests( IVAS_BANDWIDTH_NB, bitrate, IVAS_RTP_CA_NO_REQ, requests ); + } + break; + case EBYTE_CMR_T_EVS_IO: /* AMRWB-IO */ + if ( BR < 9 ) + { + uint32_t bitrate = amrWBIOFrameSizeInBits[BR] * IVAS_NUM_FRAMES_PER_SEC; + setEVSRequests( IVAS_BANDWIDTH_NO_REQ, bitrate, IVAS_RTP_CA_NO_REQ, requests ); + } + break; + case EBYTE_CMR_T_EVS_CA_WB: + if ( BR < 8 ) + { + uint32_t bitrate = 13200; /* Fixed in CA Mode */ + setEVSRequests( IVAS_BANDWIDTH_WB, bitrate, BR, requests ); + } + break; + case EBYTE_CMR_T_EVS_CA_SWB: + if ( BR < 8 ) + { + uint32_t bitrate = 13200; /* Fixed in CA Mode */ + setEVSRequests( IVAS_BANDWIDTH_SWB, bitrate, BR, requests ); + } + break; + case EBYTE_CMR_T_EVS_WB: + if ( BR < 12 ) + { + uint32_t bitrate = evsFrameSizeInBits[BR] * IVAS_NUM_FRAMES_PER_SEC; + setEVSRequests( IVAS_BANDWIDTH_WB, bitrate, IVAS_RTP_CA_NO_REQ, requests ); + } + break; + case EBYTE_CMR_T_EVS_SWB: /* Intentional fall through */ + if ( BR < 12 && BR > 2 ) + { + uint32_t bitrate = evsFrameSizeInBits[BR] * IVAS_NUM_FRAMES_PER_SEC; + setEVSRequests( IVAS_BANDWIDTH_SWB, bitrate, IVAS_RTP_CA_NO_REQ, requests ); + } + break; + case EBYTE_CMR_T_EVS_FB: + if ( BR < 12 && BR > 4 ) + { + uint32_t bitrate = evsFrameSizeInBits[BR] * IVAS_NUM_FRAMES_PER_SEC; + setEVSRequests( IVAS_BANDWIDTH_FB, bitrate, IVAS_RTP_CA_NO_REQ, requests ); + } + break; + case EBYTE_CMR_T_IVAS: /* IVAS */ + if ( BR != 14 ) + { + requests[IVAS_REQUEST_CODEC].codec = IVAS_RTP_IVAS; + requests[IVAS_REQUEST_BITRATE].bitrate = ( BR == 0xF ) ? 0 : ivasFrameSizeInBits[BR] * IVAS_NUM_FRAMES_PER_SEC; + requests[IVAS_REQUEST_CA_MODE].caMode = IVAS_RTP_CA_NO_REQ; + } + break; + } + } + + return nBytes; +} + +static uint32_t parseSubsequentEByte( const IVAS_DATA_BUFFER *payload, uint32_t nBytes, IVAS_RTP_REQUEST_VALUE *requests, bool *piDataIndicated ) +{ + while ( nBytes < payload->length ) + { + uint8_t byte = payload->buffer[nBytes]; + uint8_t ET = ( byte & ( ~MASK_4BIT ) ); + + if ( ( byte & EBYTE_TOC_HEADER_BIT ) == 0 ) + { + return nBytes; + } + + nBytes++; /* Consume this e-byte */ + + switch ( ET ) + { + case EBYTE_BANDWIDTH_REQUEST: /* Bandwidth Request */ + { + requests[IVAS_REQUEST_BANDWIDTH].bandwidth = IVAS_BANDWIDTH_WB + ( byte & MASK_2BIT ); + } + break; + case EBYTE_FORMAT_REQUEST: /* Format Request */ + { + bool S = ( byte >> 3 ) & MASK_1BIT; + if ( S ) + { + /* Use the next byte to extract SubFormat */ + if ( nBytes < payload->length ) + { + byte = payload->buffer[nBytes++]; + requests[IVAS_REQUEST_SUBFORMAT].subFormatType = byte & MASK_6BIT; + } + } + requests[IVAS_REQUEST_FORMAT].formatType = byte & MASK_3BIT; + } + break; + case EBYTE_PI_INDICATOR: /* PI Indication */ + *piDataIndicated = true; + break; + case EBYTE_SR_REQUEST: /* Split Rendering Request */ + { + IVAS_RTP_SPLITRENDER *srConfig = &requests[IVAS_REQUEST_SR_CONFIG].srConfig; + srConfig->diegetic = ( byte >> 3 ) & MASK_1BIT; + srConfig->yaw = ( byte >> 2 ) & MASK_1BIT; + srConfig->pitch = ( byte >> 1 ) & MASK_1BIT; + srConfig->roll = byte & MASK_1BIT; + srConfig->valid = true; + } + break; + default: /* Reserved for future use - unhandled atm */ + break; + } + } + + return nBytes; +} + +static ivas_error parseToCByte( const IVAS_DATA_BUFFER *payload, uint32_t *numBytes, uint32_t *numFrames, TOC_INFO *toc, uint32_t maxNumberOfToCBytes ) +{ + bool headerFollows = true; + uint32_t nBytes = *numBytes; + + *numFrames = 0; + while ( nBytes < payload->length && headerFollows ) + { + uint8_t byte = payload->buffer[nBytes]; + uint8_t BR = byte & MASK_4BIT; + uint8_t FT = byte & ( ( ~MASK_4BIT ) & MASK_6BIT ); + + headerFollows = ( byte & ( ~MASK_6BIT ) ) == TOC_HEADER_FOLLOWS; + + if ( ( byte & EBYTE_TOC_HEADER_BIT ) != 0 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNSUPPORTED_FRAME, "Expected ToC byte missing" ); + } + + nBytes++; /* Consume this e-byte */ + + if ( *numFrames == maxNumberOfToCBytes ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "No of frames in packet exceed max defined" ); + } + + *numFrames += 1; + memset( toc, 0, sizeof( *toc ) ); + + if ( FT == TOC_INDICATE_ARMWB_Q || FT == TOC_INDICATE_AMRWB ) + { + toc->codecId = IVAS_RTP_EVS; + toc->isAMRWB_IOmode = true; + toc->speechLostIndicated = ( FT == TOC_INDICATE_ARMWB_Q ) ? true : false; /* Q bit = 0 for AMRWB, BR is valid */ + if ( BR <= 9 ) + { + toc->auNumBits = amrWBIOFrameSizeInBits[BR]; + } + else if ( BR < 14 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNSUPPORTED_FRAME, "Reserved bitrate provided in AMRWB ToC" ); + } + else + { + toc->speechLostIndicated = ( BR == 14 ); /* SPEECH_LOST */ + toc->auNumBits = 0; + } + } + else if ( FT == TOC_INDICATE_IVAS ) + { + toc->codecId = IVAS_RTP_IVAS; + if ( BR == 14 ) + { + /* Read Unconditional SR-ToC byte */ + if ( nBytes < payload->length ) + { + uint8_t SR_BR; + static const uint8_t codecFrameSizeMap[4] = { 0, 5, 10, 20 }; + byte = payload->buffer[nBytes++]; + SR_BR = ( byte >> 3 ) & MASK_2BIT; + if ( SR_BR == 0 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNSUPPORTED_FRAME, "Reserved bitrate provided in SR ToC" ); + } + toc->srInfo.valid = true; + toc->srInfo.diegetic = ( byte >> 6 ) & MASK_1BIT; + toc->srInfo.codec = IVAS_SR_TRANSPORT_LCLD + ( ( byte >> 5 ) & MASK_1BIT ); + toc->srInfo.bitrateKbps = ( SR_BR + 1 ) * 128000u; + toc->srInfo.codecFrameSizeMs = codecFrameSizeMap[( byte >> 1 ) & MASK_2BIT]; + toc->auNumBits = toc->srInfo.bitrateKbps * toc->srInfo.codecFrameSizeMs / 1000; + } + else + { + return IVAS_ERROR( IVAS_ERR_RTP_UNDERFLOW, "Underflow during ToC SR byte" ); + } + } + else + { + toc->auNumBits = ivasFrameSizeInBits[BR]; + } + } + else /* EVS */ + { + toc->codecId = IVAS_RTP_EVS; + toc->speechLostIndicated = ( FT == TOC_INDICATE_ARMWB_Q ) ? true : false; /* Q bit = 0 for AMRWB, BR is valid */ + if ( BR < 13 ) + { + toc->auNumBits = evsFrameSizeInBits[BR]; + } + else if ( BR == 13 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNSUPPORTED_FRAME, "Reserved bitrate provided in EVS ToC" ); + } + else + { + toc->speechLostIndicated = ( BR == 14 ); /* SPEECH_LOST */ + toc->auNumBits = 0; + } + } + + toc++; + + /* Handle any frame specific E-Bytes here currently there are none, so we skip any E-Bytes here after */ + if ( headerFollows ) + { + while ( nBytes < payload->length ) + { + byte = payload->buffer[nBytes]; + if ( ( byte & EBYTE_TOC_HEADER_BIT ) == 0 ) + { + break; + } + nBytes++; + } + } + } + + *numBytes = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error parsePIData( IVAS_RTP_UNPACK_HANDLE hUnpack, uint32_t rtpTimestamp, const IVAS_DATA_BUFFER *payload, uint32_t *numBytes, uint32_t *numPiDataInPacket ) +{ + bool PF = true; + uint32_t nBytes = *numBytes; + bool isFirstPiSize = true; + + while ( PF ) + { + uint8_t piHeader0, PM, piDataType, byte = 0; + uint32_t piSize = 0; + + if ( nBytes + 1 >= payload->length ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNDERFLOW, "Underflow during expected PI Header read" ); + } + + piHeader0 = payload->buffer[nBytes++]; + + PF = ( piHeader0 >> 7 ) & MASK_1BIT; /* New PI header follows this PI Data Frame */ + PM = ( piHeader0 & ( ~MASK_5BIT ) ) & MASK_7BIT; /* PI Marker Bits */ + piDataType = ( piHeader0 & MASK_5BIT ); + + do + { + byte = payload->buffer[nBytes++]; + piSize += isFirstPiSize ? ( byte & MASK_5BIT ) : byte; + if ( nBytes >= payload->length ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNDERFLOW, "Underflow during reading piSize" ); + } + isFirstPiSize = false; + } while ( byte == 255 || piSize == 32 ); + + if ( piDataType == IVAS_PI_NO_DATA ) + { + if ( piSize > 0 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "NO_PI_DATA should be 0 sized" ); + } + + /* Do not add a node for NO_DATA */ + } + else if ( nBytes + piSize <= payload->length ) + { + PIDATA_NODE *node = NULL; + ivas_error error = BPOOL_GetBuffer( hUnpack->piDataPool, (void **) &node ); + ERR_CHECK_RETURN( error ); + + node->next = NULL; + + error = PI_UnPackData( piDataType, piSize, &payload->buffer[nBytes], (IVAS_PIDATA_GENERIC *) &node->data ); + ERR_CHECK_RETURN( error ); + + node->timestamp = rtpTimestamp; + + nBytes += piSize; + *numPiDataInPacket += 1; + + QUEUE_Push( hUnpack->piDataQ, (NODE *) node ); + } + else + { + return IVAS_ERROR( IVAS_ERR_RTP_UNDERFLOW, "Underflow during reading pi data" ); + } + + if ( PM == PI_HEADER_PM_LAST ) + { + rtpTimestamp += 16000 / IVAS_NUM_FRAMES_PER_SEC; + } + } + + *numBytes = nBytes; + return IVAS_ERR_OK; +} + +ivas_error IVAS_RTP_UNPACK_PushPayload( + IVAS_RTP_UNPACK_HANDLE hUnpack, /* i/o : IVAS rtp unpacker handle */ + const IVAS_DATA_BUFFER *payload, /* i : received rtp payload */ + uint32_t timestamp, /* i : timestamp in RTP Clock @ 16KHz from rtp header */ + uint16_t sequenceNumber, /* i : sequence number from rtp header */ + uint32_t *numFramesInPacket, /* o : number of IVAS/EVS frames in rtp packet */ + uint32_t *numPiDataInPacket, /* o : number of PI data received in rtp packet */ + uint32_t *remoteRequestBitmap /* o : bitmap of available request in this packet */ +) +{ + ivas_error error = IVAS_ERR_OK; + uint32_t nBytes = 0, numFrames = 0, numPiData = 0, n; + bool piDataIndicated = false; + TOC_INFO toc[IVAS_MAX_FRAMES_PER_RTP_PACKET]; + + IVAS_RTP_REQUEST_VALUE oldRequests[IVAS_REQUEST_MAX]; + + if ( hUnpack == NULL || payload == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( remoteRequestBitmap != NULL ) + { + *remoteRequestBitmap = 0; + } + + if ( numFramesInPacket != NULL ) + { + *numFramesInPacket = 0; + } + + if ( numPiDataInPacket != NULL ) + { + *numPiDataInPacket = 0; + } + + /* Sanity check if any frame or PI data from last packet is still not pulled */ + if ( QUEUE_Size( hUnpack->frameQ ) > 0 || QUEUE_Size( hUnpack->piDataQ ) > 0 ) + { + assert( 0 ); + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Previous packet data should be consumed before next packet is pushed" ); + } + + memcpy( oldRequests, hUnpack->requests, sizeof( oldRequests ) ); + + /* Unpack IVAS Payload, starting with the E-Bytes */ + nBytes = parseInitialEByte( payload, nBytes, hUnpack->requests ); + + /* Unpack any subsequent E-bytes */ + nBytes = parseSubsequentEByte( payload, nBytes, hUnpack->requests, &piDataIndicated ); + + /* Unpack the ToC Bytes => Extract number of frames in packet */ + error = parseToCByte( payload, &nBytes, &numFrames, toc, sizeof( toc ) / sizeof( toc[0] ) ); + ERR_CHECK_RETURN( error ); + + /* Read frame bits */ + for ( n = 0; n < numFrames; n++ ) + { + uint32_t frameSizeBytes; + UNPACK_NODE *node = NULL; + + /* Get a new node */ + error = BPOOL_GetBuffer( hUnpack->unpackNodePool, (void **) &node ); + ERR_CHECK_RETURN( error ); + + node->next = NULL; + node->timestamp = timestamp + ( n * 320 ); + node->seqNumber = sequenceNumber; + node->toc = toc[n]; + + frameSizeBytes = ( node->toc.auNumBits + 7 ) / 8; + if ( nBytes + frameSizeBytes <= payload->length ) + { + memcpy( node->au, &payload->buffer[nBytes], frameSizeBytes ); + nBytes += frameSizeBytes; + } + else + { + return IVAS_ERROR( IVAS_ERR_RTP_UNDERFLOW, "Underflow during expected frame bits" ); + } + + /* Add to frames FiFo */ + QUEUE_Push( hUnpack->frameQ, (NODE *) node ); + } + + if ( piDataIndicated ) + { + error = parsePIData( hUnpack, timestamp, payload, &nBytes, &numPiData ); + if ( error != IVAS_ERR_OK ) + { + /* PI Parsing errors are not fatal => indicate no PI data in packet as workaround */ + numPiData = 0; + } + } + + if ( numFramesInPacket != NULL ) + { + *numFramesInPacket = numFrames; + } + + if ( numPiDataInPacket ) + { + *numPiDataInPacket = numPiData; + } + + if ( remoteRequestBitmap ) + { + for ( n = 0; n < IVAS_REQUEST_MAX; n++ ) + { + bool changed = ( memcmp( &hUnpack->requests[n], &oldRequests[n], sizeof( IVAS_RTP_REQUEST_VALUE ) ) != 0 ); + *remoteRequestBitmap |= changed ? ( 1u << n ) : 0; + } + } + + return IVAS_ERR_OK; +} + +ivas_error IVAS_RTP_UNPACK_PushPacket( + IVAS_RTP_UNPACK_HANDLE hUnpack, /* i/o : IVAS rtp unpacker handle */ + const IVAS_DATA_BUFFER *packet, /* i : received rtp Packet */ + uint32_t *numFramesInPacket, /* o : number of IVAS/EVS frames in rtp packet */ + uint32_t *numPiDataInPacket, /* o : number of PI data received in rtp packet */ + uint32_t *remoteRequestBitmap /* o : bitmap of available request in this packet */ +) +{ + ivas_error error = IVAS_ERR_OK; + uint32_t numHeaderBytes = 0; + IVAS_DATA_BUFFER payload; + + error = UnpackRtpPacket( packet, &hUnpack->header, &numHeaderBytes ); + ERR_CHECK_RETURN( error ); + + /* Offset to RTP Payload */ + payload.capacity = packet->capacity; + payload.buffer = packet->buffer + numHeaderBytes; + payload.length = packet->length - numHeaderBytes; + + return IVAS_RTP_UNPACK_PushPayload( + hUnpack, + &payload, + hUnpack->header.timestamp, + hUnpack->header.seqNumber, + numFramesInPacket, + numPiDataInPacket, + remoteRequestBitmap ); +} + +ivas_error IVAS_RTP_UNPACK_GetRequest( + IVAS_RTP_UNPACK_HANDLE hUnpack, /* i/o : IVAS rtp packer handle */ + IVAS_RTP_REQUEST_TYPE type, /* i : remote request type */ + IVAS_RTP_REQUEST_VALUE *value /* o : pointer of the requested type */ +) +{ + if ( type < 0 || type >= IVAS_REQUEST_MAX ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid request key provided" ); + } + *value = hUnpack->requests[type]; + return IVAS_ERR_OK; +} + +ivas_error IVAS_RTP_UNPACK_PullFrame( + IVAS_RTP_UNPACK_HANDLE hUnpack, /* i/o : IVAS rtp unpacker handle */ + IVAS_RTP_CODEC *receivedCodecId, /* o : Codec type (IVAS/EVS) */ + IVAS_RTP_SR_INFO *srInfo, /* o : Split Rendering Info */ + IVAS_DATA_BUFFER *frameBuffer, /* o : packed frame bitstream for IVAS/EVS */ + int16_t *frameSizeInBits, /* o : exact frame size in bits (AMRWB IO) */ + uint32_t *timestamp, /* o : timestamp in RTP Clock @ 16KHz */ + uint16_t *sequenceNumber, /* o : sequence number from rtp header */ + bool *speechLostIndicated, /* o : Is current frame indicated as Lost */ + bool *isAMRWB_IOmode /* o : Is AMRWB_IO mode EVS frame */ +) +{ + size_t length = 0; + UNPACK_NODE *node = (UNPACK_NODE *) QUEUE_Pop( hUnpack->frameQ ); + + /* Check if a node is available in FiFo */ + if ( node == NULL ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNDERFLOW, "No more frames in unpack fifo" ); + } + + length = ( node->toc.auNumBits + 7 ) / 8; + if ( frameBuffer != NULL && ( length <= frameBuffer->capacity ) ) + { + memcpy( frameBuffer->buffer, node->au, length ); + frameBuffer->length = length; + } + + if ( frameSizeInBits != NULL ) + { + *frameSizeInBits = (int16_t) node->toc.auNumBits; + } + + if ( receivedCodecId != NULL ) + { + *receivedCodecId = node->toc.codecId; + } + + if ( srInfo != NULL ) + { + *srInfo = node->toc.srInfo; + } + + if ( timestamp != NULL ) + { + *timestamp = node->timestamp; + } + + if ( sequenceNumber != NULL ) + { + *sequenceNumber = node->seqNumber; + } + + if ( speechLostIndicated != NULL ) + { + *speechLostIndicated = node->toc.speechLostIndicated; + } + + if ( isAMRWB_IOmode != NULL ) + { + *isAMRWB_IOmode = node->toc.isAMRWB_IOmode; + } + + return BPOOL_FreeBuffer( hUnpack->unpackNodePool, node ); +} + +ivas_error IVAS_RTP_UNPACK_PullNextPiData( + IVAS_RTP_UNPACK_HANDLE hUnpack, /* i/o : IVAS rtp unpacker handle */ + IVAS_PIDATA_GENERIC *data, /* o : output data buffer for the Pi data */ + size_t capacity, /* i : capacity of pi data buffer in bytes */ + uint32_t *timestamp /* o : timestamp in RTP Clock @ 16KHz */ +) +{ + IVAS_PIDATA_GENERIC *pi = NULL; + PIDATA_NODE *node = (PIDATA_NODE *) QUEUE_Pop( hUnpack->piDataQ ); + + /* Check if a node is available in FiFo */ + if ( node == NULL ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNDERFLOW, "No more pi data in unpack fifo" ); + } + + pi = (IVAS_PIDATA_GENERIC *) &node->data; + + if ( data != NULL && ( pi->size <= capacity ) ) + { + memcpy( data, pi, pi->size ); + } + + if ( timestamp != NULL ) + { + *timestamp = node->timestamp; + } + + return BPOOL_FreeBuffer( hUnpack->piDataPool, node ); +} diff --git a/lib_util/ivas_rtp_pi_data.c b/lib_util/ivas_rtp_pi_data.c new file mode 100644 index 0000000000000000000000000000000000000000..cea96e44144b59652fc7aed3931b6e717cd4ef8f --- /dev/null +++ b/lib_util/ivas_rtp_pi_data.c @@ -0,0 +1,1783 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "ivas_error_utils.h" +#include "ivas_rtp_internal.h" +#include +#include + +#ifndef min +#define min( x, y ) ( ( x ) < ( y ) ? ( x ) : ( y ) ) +#endif + +#ifndef max +#define max( x, y ) ( ( x ) > ( y ) ? ( x ) : ( y ) ) +#endif + + +#include "cnst.h" +#include + + +/* Generic PI data packing/unpacking functions */ +typedef ivas_error ( *PACK_PI_FN )( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ); +typedef ivas_error ( *UNPACK_PI_FN )( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ); + +static __inline uint32_t writeInt16( uint8_t *buffer, uint32_t idx, int16_t val ) +{ + buffer[idx++] = (uint8_t) ( val >> 8 ); + buffer[idx++] = (uint8_t) ( val & 0x00FF ); + return idx; +} + +static __inline int16_t readInt16( const uint8_t *buffer ) +{ + return (int16_t) ( (uint16_t) buffer[0] << 8 ) | ( (uint16_t) buffer[1] ); +} + +/*-----------------------------------------------------------------------* + * ivasPayload_convertToQ15() + * + * Convert a float value into a Q15 encoded value. + *-----------------------------------------------------------------------*/ +static int16_t ivasPayload_convertToQ15( float value ) +{ + value = ( value * 32768.0f ); + value = value > +32767.0f ? +32767.0f : value; + value = value < -32768.0f ? -32768.0f : value; + return (int16_t) ( value ); +} +/*-----------------------------------------------------------------------* + * ivasPayload_convertToQ10() + * + * Convert a float value into a Q10 encoded value. + *-----------------------------------------------------------------------*/ +static int16_t ivasPayload_convertToQ10( float value ) +{ + value = ( value * 1024.0f ); + value = value > +1024.0f ? +1024.0f : value; + value = value < -1024.0f ? -1024.0f : value; + return (int16_t) ( value ); +} + +/*-----------------------------------------------------------------------* + * ivasPayload_convertToQ9() + * + * Convert a float value into a Q9 encoded value. + *-----------------------------------------------------------------------*/ +static int16_t ivasPayload_convertToQ9( float value ) +{ + value = ( value * 512.0f ); + value = value > +512.0f ? +512.0f : value; + value = value < -512.0f ? -512.0f : value; + return (int16_t) ( value ); +} + +static uint32_t packQuaternion( IVAS_QUATERNION orientation, uint8_t *buffer ) +{ + uint32_t nBytes = 0; + float q[4], q_max; + uint16_t max_q_idx, n, k; + uint32_t lWord; + + q[0] = FLOAT_FROM_Q15( orientation.w_fx >> 16 ); + q[1] = FLOAT_FROM_Q15( orientation.x_fx >> 16 ); + q[2] = FLOAT_FROM_Q15( orientation.y_fx >> 16 ); + q[3] = FLOAT_FROM_Q15( orientation.z_fx >> 16 ); + + max_q_idx = 0; + q_max = (float) fabs( q[0] ); + for ( n = 1; n < 4; n++ ) + { + if ( (float) fabs( q[n] ) > q_max ) + { + q_max = (float) fabs( q[n] ); + max_q_idx = n; + } + } + + if ( q[max_q_idx] < 0 ) + { + for ( n = 0; n < 4; n++ ) + { + q[n] = -q[n]; + } + } + lWord = ( (uint32_t) max_q_idx ) << 30; + + k = 1; + for ( n = 0; n < 4; n++ ) + { + if ( n == max_q_idx ) + { + continue; + } + lWord |= ( ( (int16_t) ( ( q[n] + 1 / sqrt( 2.0f ) ) * 1023 / sqrt( 2.0f ) ) & MASK_10BIT ) << ( 30 - k * 10 ) ); + k++; + } + + buffer[nBytes++] = ( lWord >> 24 ) & MASK_8BIT; + buffer[nBytes++] = ( lWord >> 16 ) & MASK_8BIT; + buffer[nBytes++] = ( lWord >> 8 ) & MASK_8BIT; + buffer[nBytes++] = (lWord) &MASK_8BIT; + + return nBytes; +} + + +static ivas_error unpackQuaternion( const uint8_t *buffer, IVAS_QUATERNION *orientation ) +{ + uint32_t i, k, lWord; + uint16_t max_q_idx, tmp; + float q[4], qs; + + lWord = ( (uint32_t) buffer[0] ) << 24; + lWord |= ( (uint32_t) buffer[1] ) << 16; + lWord |= ( (uint32_t) buffer[2] ) << 8; + lWord |= (uint32_t) buffer[3]; + + max_q_idx = ( lWord >> 30 ) & MASK_2BIT; + k = 1; + qs = 0.0f; + for ( i = 0; i < 4; i++ ) + { + if ( i == max_q_idx ) + { + continue; + } + tmp = ( lWord >> ( 30 - k * 10 ) ) & MASK_10BIT; + q[i] = tmp / 1023.0f * sqrtf( 2.0f ) - 1 / sqrtf( 2.0f ); + qs += q[i] * q[i]; + k++; + } + q[max_q_idx] = sqrtf( 1 - qs ); + orientation->w_fx = ivasPayload_convertToQ15( q[0] ); + orientation->x_fx = ivasPayload_convertToQ15( q[1] ); + orientation->y_fx = ivasPayload_convertToQ15( q[2] ); + orientation->z_fx = ivasPayload_convertToQ15( q[3] ); + + return IVAS_ERR_OK; +} + + +static ivas_error packUnsupportedData( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + (void) piData; + (void) buffer; + (void) maxDataBytes; + /* Skip packing */ + *nBytesWritten = 0; + return IVAS_ERR_OK; +} + +static ivas_error unpackUnsupportedData( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + (void) piData; + (void) buffer; + (void) numDataBytes; + /* Skip unpacking */ + return IVAS_ERR_OK; +} + +static ivas_error packNoPiData( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0; + (void) piData; + + *nBytesWritten = 0; + + /* NO_PI_DATA is just PI header with no data */ + if ( maxDataBytes < 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space in PI data buffer for NO_PI_DATA" ); + } + + buffer[nBytes++] = ( IVAS_PI_NO_DATA ); /* PF/PM populated during final packing */ + buffer[nBytes++] = 0; /* NO_PI_DATA is 0 bytes */ + + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackNoPiData( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + (void) buffer; + + if ( numDataBytes != 0 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "NO_PI_DATA must be 0 byte" ); + } + + piData->size = sizeof( IVAS_PIDATA_NO_DATA ); + return IVAS_ERR_OK; +} + +static ivas_error packOrientation( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0; + const IVAS_PIDATA_ORIENTATION *orientation = (const IVAS_PIDATA_ORIENTATION *) piData; + + *nBytesWritten = 0; + + if ( piData->size != sizeof( IVAS_PIDATA_ORIENTATION ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in Orientation PI data" ); + } + + if ( ( piData->piDataType != IVAS_PI_SCENE_ORIENTATION ) && ( piData->piDataType != IVAS_PI_DEVICE_ORIENTATION_COMPENSATED ) && ( piData->piDataType != IVAS_PI_DEVICE_ORIENTATION_UNCOMPENSATED ) && ( piData->piDataType != IVAS_PI_PLAYBACK_DEVICE_ORIENTATION ) && ( piData->piDataType != IVAS_PI_HEAD_ORIENTATION ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in Orientation PI data" ); + } + + /* Orientation data is 4 bytes, header is 2 bytes */ + if ( maxDataBytes < 4 + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack Orientation PI data" ); + } + + buffer[nBytes++] = ( orientation->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = 4; + nBytes += packQuaternion( orientation->orientation, &buffer[nBytes] ); + + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error packISMOrientation( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0; + const IVAS_PIDATA_ISM_ORIENTATION *orientation = (const IVAS_PIDATA_ISM_ORIENTATION *) piData; + uint16_t n; + *nBytesWritten = 0; + + if ( piData->size != sizeof( IVAS_PIDATA_ISM_ORIENTATION ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in Orientation PI data" ); + } + + if ( piData->piDataType != IVAS_PI_ISM_ORIENTATION ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in Orientation PI data" ); + } + /* Orientation data is 4 bytes, header is 2 bytes */ + if ( maxDataBytes < 4 * IVAS_MAX_NUM_OBJECTS + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack Orientation PI data" ); + } + + buffer[nBytes++] = ( orientation->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = (uint8_t) orientation->numObjects * 4; + for ( n = 0; n < orientation->numObjects; n++ ) + { + nBytes += packQuaternion( orientation->orientation[n], &buffer[nBytes] ); + } + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackOrientation( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + IVAS_PIDATA_ORIENTATION *orientation = (IVAS_PIDATA_ORIENTATION *) piData; + + /* Orientation data is 4 bytes */ + if ( numDataBytes != 4 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack Orientation PI data" ); + } + + piData->size = sizeof( IVAS_PIDATA_ORIENTATION ); + unpackQuaternion( buffer, &( orientation->orientation ) ); + return IVAS_ERR_OK; +} + +static ivas_error unpackISMOrientation( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + IVAS_PIDATA_ISM_ORIENTATION *ism_orientation = (IVAS_PIDATA_ISM_ORIENTATION *) piData; + + /* Orientation data is 4 bytes */ + uint16_t n; + if ( numDataBytes % 4 != 0 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack Orientation PI data" ); + } + + ism_orientation->size = sizeof( IVAS_PIDATA_ISM_ORIENTATION ); + ism_orientation->numObjects = (uint16_t) numDataBytes / 4; + + for ( n = 0; n < ism_orientation->numObjects; n++ ) + { + unpackQuaternion( &buffer[4 * n], &( ism_orientation->orientation[n] ) ); + } + for ( ; n < IVAS_MAX_NUM_OBJECTS; n++ ) + { + ism_orientation->orientation[n].w_fx = 0; + ism_orientation->orientation[n].x_fx = 0; + ism_orientation->orientation[n].y_fx = 0; + ism_orientation->orientation[n].z_fx = 0; + } + + return IVAS_ERR_OK; +} + +static uint32_t getIndexTable( const float *table, uint32_t tableLength, float value ) +{ + uint32_t idx = 0; + if ( value <= table[0] ) + { + return 0; + } + + for ( idx = 1; idx < tableLength; idx++ ) + { + if ( value < table[idx] ) + { + break; + } + } + return idx - 1; +} + +#define GET_IDX( table, nBits, value ) getIndexTable( table, ( 1u << ( nBits ) ), ( value ) ) + +static ivas_error packAcousticEnvironment( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0; + uint8_t packedSize = 1; + const IVAS_PIDATA_ACOUSTIC_ENV *aeEnv = (const IVAS_PIDATA_ACOUSTIC_ENV *) piData; + + *nBytesWritten = 0; + + if ( piData->size != sizeof( IVAS_PIDATA_ACOUSTIC_ENV ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in PI data of type Acoustic Environment" ); + } + + if ( aeEnv->availEarlyReflections ) + { + packedSize = 8; + } + else if ( aeEnv->availLateReverb ) + { + packedSize = 5; + } + + /* Acoustic Env data is packedSize bytes, header is 2 bytes */ + if ( maxDataBytes < (uint32_t) packedSize + 2 ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Insufficient space to pack Orientation PI data" ); + } + + buffer[nBytes++] = ( IVAS_PI_ACOUSTIC_ENVIRONMENT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = packedSize; + + if ( packedSize == 1 ) + { + buffer[nBytes++] = aeEnv->aeid & 0x7F; + } + else + { + uint64_t dWord = (uint64_t) aeEnv->aeid << 57; + + dWord |= (uint64_t) GET_IDX( mapRT60, NBITS_RT60, aeEnv->rt60[IVAS_PI_AE_LOW] ) << 52; + dWord |= (uint64_t) GET_IDX( mapDSR, NBITS_DSR, aeEnv->dsr[IVAS_PI_AE_LOW] ) << 46; + dWord |= (uint64_t) GET_IDX( mapRT60, NBITS_RT60, aeEnv->rt60[IVAS_PI_AE_MID] ) << 41; + dWord |= (uint64_t) GET_IDX( mapDSR, NBITS_DSR, aeEnv->dsr[IVAS_PI_AE_MID] ) << 35; + dWord |= (uint64_t) GET_IDX( mapRT60, NBITS_RT60, aeEnv->rt60[IVAS_PI_AE_HIGH] ) << 30; + dWord |= (uint64_t) GET_IDX( mapDSR, NBITS_DSR, aeEnv->dsr[IVAS_PI_AE_HIGH] ) << 24; + + buffer[nBytes++] = (uint8_t) ( dWord >> 56 ); + buffer[nBytes++] = (uint8_t) ( dWord >> 48 ); + buffer[nBytes++] = (uint8_t) ( dWord >> 40 ); + buffer[nBytes++] = (uint8_t) ( dWord >> 32 ); + buffer[nBytes++] = (uint8_t) ( dWord >> 24 ); + + if ( packedSize > 5 ) + { + dWord |= (uint64_t) GET_IDX( mapRoomDims, NBITS_DIM, aeEnv->roomDimensions.x ) << 20; + dWord |= (uint64_t) GET_IDX( mapRoomDims, NBITS_DIM, aeEnv->roomDimensions.y ) << 16; + dWord |= (uint64_t) GET_IDX( mapRoomDims, NBITS_DIM, aeEnv->roomDimensions.z ) << 12; + dWord |= (uint64_t) GET_IDX( mapAbsorbtion, NBITS_ABS, aeEnv->absorbCoeffs[IVAS_PI_AE_FRONT] ) << 10; + dWord |= (uint64_t) GET_IDX( mapAbsorbtion, NBITS_ABS, aeEnv->absorbCoeffs[IVAS_PI_AE_BACK] ) << 8; + dWord |= (uint64_t) GET_IDX( mapAbsorbtion, NBITS_ABS, aeEnv->absorbCoeffs[IVAS_PI_AE_LEFT] ) << 6; + dWord |= (uint64_t) GET_IDX( mapAbsorbtion, NBITS_ABS, aeEnv->absorbCoeffs[IVAS_PI_AE_RIGHT] ) << 4; + dWord |= (uint64_t) GET_IDX( mapAbsorbtion, NBITS_ABS, aeEnv->absorbCoeffs[IVAS_PI_AE_CEILING] ) << 2; + dWord |= (uint64_t) GET_IDX( mapAbsorbtion, NBITS_ABS, aeEnv->absorbCoeffs[IVAS_PI_AE_FLOOR] ); + + buffer[nBytes++] = (uint8_t) ( dWord >> 16 ); + buffer[nBytes++] = (uint8_t) ( dWord >> 8 ); + buffer[nBytes++] = (uint8_t) ( dWord ); + } + } + + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackAcousticEnvironment( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + IVAS_PIDATA_ACOUSTIC_ENV *aeEnv = (IVAS_PIDATA_ACOUSTIC_ENV *) piData; + + /* Acooustic Env data is either 1, 5 or 8 bytes */ + if ( numDataBytes != 1 && numDataBytes != 5 && numDataBytes != 8 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack PI data of type Acoustic Environment" ); + } + + piData->size = sizeof( IVAS_PIDATA_ACOUSTIC_ENV ); + aeEnv->availLateReverb = ( numDataBytes >= 5 ); + aeEnv->availEarlyReflections = ( numDataBytes == 8 ); + + if ( numDataBytes == 1 ) + { + aeEnv->aeid = buffer[0]; + } + else + { + uint64_t dWord = 0ull; + uint32_t n; + for ( n = 0; n < numDataBytes; n++ ) + { + dWord <<= 8; + dWord |= buffer[n]; + } + dWord <<= ( 8 - numDataBytes ) * 8; + + aeEnv->aeid = (uint8_t) ( ( dWord >> 57 ) & MASK_AEID ); + aeEnv->rt60[IVAS_PI_AE_LOW] = mapRT60[( dWord >> 52 ) & MASK_RT60]; + aeEnv->dsr[IVAS_PI_AE_LOW] = mapDSR[( dWord >> 46 ) & MASK_DSR]; + aeEnv->rt60[IVAS_PI_AE_MID] = mapRT60[( dWord >> 41 ) & MASK_RT60]; + aeEnv->dsr[IVAS_PI_AE_MID] = mapDSR[( dWord >> 35 ) & MASK_DSR]; + aeEnv->rt60[IVAS_PI_AE_HIGH] = mapRT60[( dWord >> 30 ) & MASK_RT60]; + aeEnv->dsr[IVAS_PI_AE_HIGH] = mapDSR[( dWord >> 24 ) & MASK_DSR]; + + aeEnv->roomDimensions.x = mapRoomDims[( dWord >> 20 ) & MASK_DIM]; + aeEnv->roomDimensions.y = mapRoomDims[( dWord >> 16 ) & MASK_DIM]; + aeEnv->roomDimensions.z = mapRoomDims[( dWord >> 12 ) & MASK_DIM]; + + aeEnv->absorbCoeffs[IVAS_PI_AE_FRONT] = mapAbsorbtion[( dWord >> 10 ) & MASK_ABS]; + aeEnv->absorbCoeffs[IVAS_PI_AE_BACK] = mapAbsorbtion[( dWord >> 8 ) & MASK_ABS]; + aeEnv->absorbCoeffs[IVAS_PI_AE_LEFT] = mapAbsorbtion[( dWord >> 6 ) & MASK_ABS]; + aeEnv->absorbCoeffs[IVAS_PI_AE_RIGHT] = mapAbsorbtion[( dWord >> 4 ) & MASK_ABS]; + aeEnv->absorbCoeffs[IVAS_PI_AE_CEILING] = mapAbsorbtion[( dWord >> 2 ) & MASK_ABS]; + aeEnv->absorbCoeffs[IVAS_PI_AE_FLOOR] = mapAbsorbtion[( dWord >> 0 ) & MASK_ABS]; + + aeEnv->rt60_fx[IVAS_PI_AE_LOW] = (Word32) ( aeEnv->rt60[IVAS_PI_AE_LOW] * ONE_IN_Q26 ); /* Q26 */ + aeEnv->rt60_fx[IVAS_PI_AE_MID] = (Word32) ( aeEnv->rt60[IVAS_PI_AE_MID] * ONE_IN_Q26 ); + aeEnv->rt60_fx[IVAS_PI_AE_HIGH] = (Word32) ( aeEnv->rt60[IVAS_PI_AE_HIGH] * ONE_IN_Q26 ); + aeEnv->dsr_fx[IVAS_PI_AE_LOW] = (Word32) ( powf( 10.0f, aeEnv->dsr[IVAS_PI_AE_LOW] / 10.0f ) * ONE_IN_Q30 ); /* Q30 */ + aeEnv->dsr_fx[IVAS_PI_AE_MID] = (Word32) ( powf( 10.0f, aeEnv->dsr[IVAS_PI_AE_MID] / 10.0f ) * ONE_IN_Q30 ); + aeEnv->dsr_fx[IVAS_PI_AE_HIGH] = (Word32) ( powf( 10.0f, aeEnv->dsr[IVAS_PI_AE_HIGH] / 10.0f ) * ONE_IN_Q30 ); + + aeEnv->roomDimensions.x_fx = (Word32) ( aeEnv->roomDimensions.x * ONE_IN_Q22 ); /* Q22 */ + aeEnv->roomDimensions.y_fx = (Word32) ( aeEnv->roomDimensions.y * ONE_IN_Q22 ); + aeEnv->roomDimensions.z_fx = (Word32) ( aeEnv->roomDimensions.z * ONE_IN_Q22 ); + aeEnv->roomDimensions.q_fact = Q22; + + aeEnv->absorbCoeffs_fx[IVAS_PI_AE_FRONT] = (Word32) ( aeEnv->absorbCoeffs[IVAS_PI_AE_FRONT] * ONE_IN_Q30 ); /* Q30 */ + aeEnv->absorbCoeffs_fx[IVAS_PI_AE_BACK] = (Word32) ( aeEnv->absorbCoeffs[IVAS_PI_AE_BACK] * ONE_IN_Q30 ); + aeEnv->absorbCoeffs_fx[IVAS_PI_AE_LEFT] = (Word32) ( aeEnv->absorbCoeffs[IVAS_PI_AE_LEFT] * ONE_IN_Q30 ); + aeEnv->absorbCoeffs_fx[IVAS_PI_AE_RIGHT] = (Word32) ( aeEnv->absorbCoeffs[IVAS_PI_AE_RIGHT] * ONE_IN_Q30 ); + aeEnv->absorbCoeffs_fx[IVAS_PI_AE_CEILING] = (Word32) ( aeEnv->absorbCoeffs[IVAS_PI_AE_CEILING] * ONE_IN_Q30 ); + aeEnv->absorbCoeffs_fx[IVAS_PI_AE_FLOOR] = (Word32) ( aeEnv->absorbCoeffs[IVAS_PI_AE_FLOOR] * ONE_IN_Q30 ); + } + + return IVAS_ERR_OK; +} + +static ivas_error packAudioDescription( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t n; + uint32_t nBytes = 0; + const IVAS_PIDATA_AUDIO_DESC *audioDesc = (const IVAS_PIDATA_AUDIO_DESC *) piData; + uint32_t packedSize = audioDesc->nValidEntries; /* Each Entry is 1 byte */ + + *nBytesWritten = 0; + + if ( audioDesc->nValidEntries > ( IVAS_MAX_NUM_OBJECTS + 1 ) ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNSUPPORTED_FRAME, "Audio Description cannot have more than 5 entries" ); + } + + /* Audio Description data is max 5 bytes, 2 bytes header */ + if ( maxDataBytes < packedSize + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space in Audio Description PI data buffer" ); + } + + buffer[nBytes++] = ( IVAS_PI_AUDIO_DESCRIPTION ); /* PF/PM populated during final packing */ + buffer[nBytes++] = (uint8_t) packedSize; + + for ( n = 0; n < audioDesc->nValidEntries; n++ ) + { + buffer[nBytes++] = ( audioDesc->audioId[n].speech ? PI_AD_SPEECH_INDICATED : 0 ) | + ( audioDesc->audioId[n].music ? PI_AD_MUSIC_INDICATED : 0 ) | + ( audioDesc->audioId[n].ambiance ? PI_AD_AMBIANCE_INDICATED : 0 ) | + ( audioDesc->audioId[n].editable ? PI_AD_EDITABLE_INDICATED : 0 ) | + ( audioDesc->audioId[n].binaural ? PI_AD_BINAURAL_INDICATED : 0 ); + } + + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackAudioDescription( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + uint32_t n; + IVAS_PIDATA_AUDIO_DESC *audioDesc = (IVAS_PIDATA_AUDIO_DESC *) piData; + + /* Audio Description data is max 5 bytes */ + if ( numDataBytes > ( IVAS_MAX_NUM_OBJECTS + 1 ) ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack Orientation PI data" ); + } + + audioDesc->size = sizeof( IVAS_PIDATA_AUDIO_DESC ); + audioDesc->nValidEntries = numDataBytes; + audioDesc->piDataType = IVAS_PI_AUDIO_DESCRIPTION; + + for ( n = 0; n < audioDesc->nValidEntries; n++ ) + { + audioDesc->audioId[n].speech = ( buffer[n] & PI_AD_SPEECH_INDICATED ) != 0; + audioDesc->audioId[n].music = ( buffer[n] & PI_AD_MUSIC_INDICATED ) != 0; + audioDesc->audioId[n].ambiance = ( buffer[n] & PI_AD_AMBIANCE_INDICATED ) != 0; + audioDesc->audioId[n].editable = ( buffer[n] & PI_AD_EDITABLE_INDICATED ) != 0; + audioDesc->audioId[n].binaural = ( buffer[n] & PI_AD_BINAURAL_INDICATED ) != 0; + } + + return IVAS_ERR_OK; +} + +static ivas_error packDynamicSuppression( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0; + const IVAS_PIDATA_DYNAMIC_SUPPRESSION *das = (const IVAS_PIDATA_DYNAMIC_SUPPRESSION *) piData; + + *nBytesWritten = 0; + + /* Dynamic Audio Suppression data is 2 bytes, 2 bytes header */ + if ( maxDataBytes < 2 + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space in DAS PI data buffer" ); + } + + buffer[nBytes++] = ( das->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = 2u; + + buffer[nBytes++] = ( das->speech ? PI_AD_SPEECH_INDICATED : 0 ) | + ( das->music ? PI_AD_MUSIC_INDICATED : 0 ) | + ( das->ambiance ? PI_AD_AMBIANCE_INDICATED : 0 ); + buffer[nBytes++] = ( (uint8_t) das->sli & MASK_4BIT ) << 4; + + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackDynamicSuppression( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + IVAS_PIDATA_DYNAMIC_SUPPRESSION *das = (IVAS_PIDATA_DYNAMIC_SUPPRESSION *) piData; + + /* Dynamic Suppression data is 2 bytes */ + if ( numDataBytes != 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack DAS PI data" ); + } + + das->size = sizeof( IVAS_PIDATA_AUDIO_DESC ); + das->speech = ( buffer[0] & PI_AD_SPEECH_INDICATED ) != 0; + das->music = ( buffer[0] & PI_AD_MUSIC_INDICATED ) != 0; + das->ambiance = ( buffer[0] & PI_AD_AMBIANCE_INDICATED ) != 0; + das->sli = ( buffer[1] >> 4 ); + + return IVAS_ERR_OK; +} + +static ivas_error packPosition( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0; + const IVAS_PIDATA_POSITION *position = (const IVAS_PIDATA_POSITION *) piData; + + *nBytesWritten = 0; + + if ( piData->size != sizeof( IVAS_PIDATA_POSITION ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in position PI data" ); + } + + if ( piData->piDataType != IVAS_PI_LISTENER_POSITION && piData->piDataType != IVAS_PI_R_ISM_POSITION ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in position PI data" ); + } + + /* Position data is 6 bytes, header is 2 bytes */ + if ( maxDataBytes < 6 + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack position PI data" ); + } + + buffer[nBytes++] = ( position->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = 6; + nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( position->position.x / MAX_PI_POSITION_METERS ) ); + nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( position->position.y / MAX_PI_POSITION_METERS ) ); + nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( position->position.z / MAX_PI_POSITION_METERS ) ); + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackPosition( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + IVAS_PIDATA_POSITION *position = (IVAS_PIDATA_POSITION *) piData; + + /* Position data is 6 bytes */ + if ( numDataBytes != 6 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack position PI data" ); + } + + position->size = sizeof( IVAS_PIDATA_POSITION ); + position->position.x = FLOAT_FROM_Q15( readInt16( &buffer[0] ) ) * MAX_PI_POSITION_METERS; + position->position.y = FLOAT_FROM_Q15( readInt16( &buffer[2] ) ) * MAX_PI_POSITION_METERS; + position->position.z = FLOAT_FROM_Q15( readInt16( &buffer[4] ) ) * MAX_PI_POSITION_METERS; + return IVAS_ERR_OK; +} +static ivas_error packPositionCompact( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0; + uint16_t posX, posY, posZ = 0; + const IVAS_PIDATA_POSITION *position = (const IVAS_PIDATA_POSITION *) piData; + + *nBytesWritten = 0; + + if ( piData->size != sizeof( IVAS_PIDATA_POSITION ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in compact position PI data" ); + } + + if ( piData->piDataType != IVAS_PI_R_ISM_POSITION ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in compact position PI data" ); + } + + /* Compact position data is 4 bytes, header is 2 bytes */ + if ( maxDataBytes < 4 + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack compact position PI data" ); + } + + buffer[nBytes++] = ( position->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = 4; + posX = (uint16_t) ivasPayload_convertToQ10( position->position.x / MAX_PI_COMPACT_POSITION_XY_METERS ); + posY = (uint16_t) ivasPayload_convertToQ10( position->position.y / MAX_PI_COMPACT_POSITION_XY_METERS ); + posZ = (uint16_t) ivasPayload_convertToQ9( position->position.z / MAX_PI_COMPACT_POSITION_Z_METERS ); + buffer[nBytes++] = (uint8_t) ( posX >> 8 ); + buffer[nBytes++] = (uint8_t) ( ( ( posX & MASK_3BIT ) << 5 ) | posY >> 6 ); + buffer[nBytes++] = (uint8_t) ( ( ( posY & MASK_6BIT ) << 2 ) | posZ >> 8 ); + buffer[nBytes++] = (uint8_t) ( posZ >> 2 ); + + *nBytesWritten = nBytes; + + return IVAS_ERR_OK; +} + +static ivas_error unpackPositionCompact( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + IVAS_PIDATA_POSITION *position = (IVAS_PIDATA_POSITION *) piData; + int32_t compactRead = 0; + + /* Compact position data is 4 bytes */ + if ( numDataBytes != 4 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack compact position PI data" ); + } + + position->size = sizeof( IVAS_PIDATA_POSITION ); + + compactRead = ( (int32_t) buffer[0] << 24 ) | ( (int32_t) buffer[1] << 16 ) | ( (int32_t) buffer[2] << 8 ) | ( (int32_t) buffer[3] ); + position->position.x = FLOAT_FROM_Q10( (int16_t) ( compactRead >> 21 ) ) * MAX_PI_COMPACT_POSITION_XY_METERS; /* Shift preserves sign bit */ + compactRead = compactRead << 11; /* Discard read bits */ + position->position.y = FLOAT_FROM_Q10( (int16_t) ( compactRead >> 21 ) ) * MAX_PI_COMPACT_POSITION_XY_METERS; /* Shift preserves sign bit */ + compactRead = compactRead << 11; /* Discard read bits */ + position->position.z = FLOAT_FROM_Q9( (int16_t) ( compactRead >> 22 ) ) * MAX_PI_COMPACT_POSITION_Z_METERS; /* Shift preserves sign bit */ + + return IVAS_ERR_OK; +} + +static ivas_error packISMPosition( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0, n; + const IVAS_PIDATA_ISM_POSITION *ism_position = (const IVAS_PIDATA_ISM_POSITION *) piData; + + *nBytesWritten = 0; + + if ( piData->size != sizeof( IVAS_PIDATA_ISM_POSITION ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in ISM POSITION PI data" ); + } + + if ( piData->piDataType != IVAS_PI_ISM_POSITION ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in ISM POSITION PI data" ); + } + + /* Position data is 6 bytes, header is 2 bytes */ + if ( maxDataBytes < 6 * IVAS_MAX_NUM_OBJECTS + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack ISM POSITION PI data" ); + } + + buffer[nBytes++] = ( ism_position->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = (uint8_t) ism_position->numObjects * 6; + for ( n = 0; n < ism_position->numObjects; n++ ) + { + nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( ism_position->position[n].x / MAX_PI_POSITION_METERS ) ); + nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( ism_position->position[n].y / MAX_PI_POSITION_METERS ) ); + nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( ism_position->position[n].z / MAX_PI_POSITION_METERS ) ); + } + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackISMPosition( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + uint16_t n; + IVAS_PIDATA_ISM_POSITION *ism_position = (IVAS_PIDATA_ISM_POSITION *) piData; + + /* Position data is 6 bytes */ + if ( numDataBytes % 6 != 0 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack LISTENER POSITION PI data" ); + } + + ism_position->size = sizeof( IVAS_PIDATA_ISM_POSITION ); + ism_position->piDataType = IVAS_PI_ISM_POSITION; + ism_position->numObjects = (uint16_t) numDataBytes / 6; + + for ( n = 0; n < ism_position->numObjects; n++ ) + { + ism_position->position[n].x = FLOAT_FROM_Q15( readInt16( &buffer[6 * n] ) ) * MAX_PI_POSITION_METERS; + ism_position->position[n].y = FLOAT_FROM_Q15( readInt16( &buffer[6 * n + 2] ) ) * MAX_PI_POSITION_METERS; + ism_position->position[n].z = FLOAT_FROM_Q15( readInt16( &buffer[6 * n + 4] ) ) * MAX_PI_POSITION_METERS; + } + return IVAS_ERR_OK; +} +static ivas_error packISMPositionCompact( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0, n; + uint16_t posX, posY, posZ = 0; + const IVAS_PIDATA_ISM_POSITION *ism_position = (const IVAS_PIDATA_ISM_POSITION *) piData; + + *nBytesWritten = 0; + + if ( piData->size != sizeof( IVAS_PIDATA_ISM_POSITION ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in ISM POSITION COMPACT PI data" ); + } + + if ( piData->piDataType != IVAS_PI_ISM_POSITION_COMPACT ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in ISM POSITION COMPACT PI data" ); + } + + /* Compact position data is 4 bytes, header is 2 bytes */ + if ( maxDataBytes < 4 * IVAS_MAX_NUM_OBJECTS + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack ISM POSITION COMPACT PI data" ); + } + + buffer[nBytes++] = ( ism_position->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = (uint8_t) ism_position->numObjects * 4; + for ( n = 0; n < ism_position->numObjects; n++ ) + { + posX = (uint16_t) ivasPayload_convertToQ10( ism_position->position[n].x / MAX_PI_COMPACT_POSITION_XY_METERS ); + posY = (uint16_t) ivasPayload_convertToQ10( ism_position->position[n].y / MAX_PI_COMPACT_POSITION_XY_METERS ); + posZ = (uint16_t) ivasPayload_convertToQ9( ism_position->position[n].z / MAX_PI_COMPACT_POSITION_Z_METERS ); + buffer[nBytes++] = (uint8_t) ( posX >> 8 ); + buffer[nBytes++] = (uint8_t) ( ( ( posX & MASK_3BIT ) << 5 ) | posY >> 6 ); + buffer[nBytes++] = (uint8_t) ( ( ( posY & MASK_6BIT ) << 2 ) | posZ >> 8 ); + buffer[nBytes++] = (uint8_t) ( posZ >> 2 ); + } + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackISMPositionCompact( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + uint16_t n; + int32_t compactRead = 0; + IVAS_PIDATA_ISM_POSITION *ism_position = (IVAS_PIDATA_ISM_POSITION *) piData; + + /* Compact position data is 4 bytes */ + if ( numDataBytes % 4 != 0 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack ISM POSITION COMPACT PI data" ); + } + + ism_position->size = sizeof( IVAS_PIDATA_ISM_POSITION ); + ism_position->piDataType = IVAS_PI_ISM_POSITION_COMPACT; + ism_position->numObjects = (uint16_t) numDataBytes / 4; + + for ( n = 0; n < ism_position->numObjects; n++ ) + { + compactRead = ( (int32_t) buffer[n * 4] << 24 ) | ( (int32_t) buffer[n * 4 + 1] << 16 ) | ( (int32_t) buffer[n * 4 + 2] << 8 ) | ( (int32_t) buffer[n * 4 + 3] ); + ism_position->position[n].x = FLOAT_FROM_Q10( (int16_t) ( compactRead >> 21 ) ) * MAX_PI_COMPACT_POSITION_XY_METERS; /* Shift preserves sign bit */ + compactRead = compactRead << 11; /* Discard read bits */ + ism_position->position[n].y = FLOAT_FROM_Q10( (int16_t) ( compactRead >> 21 ) ) * MAX_PI_COMPACT_POSITION_XY_METERS; /* Shift preserves sign bit */ + compactRead = compactRead << 11; /* Discard read bits */ + ism_position->position[n].z = FLOAT_FROM_Q9( (int16_t) ( compactRead >> 22 ) ) * MAX_PI_COMPACT_POSITION_Z_METERS; /* Shift preserves sign bit */ + } + return IVAS_ERR_OK; +} +static ivas_error packDiegetic( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0, n; + uint8_t byte = 0; + const IVAS_PIDATA_DIEGETIC *diegetic = (const IVAS_PIDATA_DIEGETIC *) piData; + + *nBytesWritten = 0; + + if ( piData->size != sizeof( IVAS_PIDATA_DIEGETIC ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in Diegetic Type PI data" ); + } + + if ( piData->piDataType != IVAS_PI_DIEGETIC_TYPE ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in Diegetic Type PI data" ); + } + + /* Diegetic data is 1 bytes, header is 2 bytes */ + if ( maxDataBytes < 1 + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack Diegetic Type PI data" ); + } + + /* Valid bits must be based on active bits defined for the input format */ + for ( n = 0; n < ( IVAS_MAX_NUM_OBJECTS + 1 ); n++ ) + { + byte <<= 1; + byte |= ( diegetic->isDiegetic[n] ); + } + byte <<= 3; + + buffer[nBytes++] = ( diegetic->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = 1; + buffer[nBytes++] = byte; + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackDiegetic( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + uint32_t n; + IVAS_PIDATA_DIEGETIC *diegetic = (IVAS_PIDATA_DIEGETIC *) piData; + uint8_t byte; + + /* Diegetic data is 1 bytes */ + if ( numDataBytes != 1 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack Diegetic PI data" ); + } + + diegetic->size = sizeof( IVAS_PIDATA_DIEGETIC ); + diegetic->piDataType = IVAS_PI_DIEGETIC_TYPE; + + byte = buffer[0]; + /* Valid bits must be based on active bits defined for the input format */ + for ( n = 0; n < ( IVAS_MAX_NUM_OBJECTS + 1 ); n++ ) + { + diegetic->isDiegetic[n] = ( ( byte >> ( 7 - n ) ) & 1 ) != 0; + } + + return IVAS_ERR_OK; +} + +static ivas_error packAudioFocusCommon( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0; + uint8_t packedSize = 1; + const IVAS_PIDATA_AUDIO_FOCUS *audioFocus = (const IVAS_PIDATA_AUDIO_FOCUS *) piData; + + *nBytesWritten = 0; + + if ( piData->size != sizeof( IVAS_PIDATA_AUDIO_FOCUS ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in PI data of type Audio Focus" ); + } + if ( audioFocus->availDirection && audioFocus->availLevel ) + { + packedSize = 5; + } + else if ( audioFocus->availDirection ) + { + packedSize = 4; + } + else if ( audioFocus->availLevel ) + { + packedSize = 1; + } + else + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Neither direction or level is available for packing Audio Focus" ); + } + + /* Audio Focus data is packedSize bytes, header is 2 bytes */ + if ( maxDataBytes < (uint32_t) packedSize + 2 ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Insufficient space to pack Audio Focus PI data" ); + } + + buffer[nBytes++] = ( audioFocus->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = packedSize; + if ( packedSize == 5 || packedSize == 4 ) + { + nBytes += packQuaternion( audioFocus->direction, &buffer[nBytes] ); + } + if ( packedSize == 5 || packedSize == 1 ) + { + buffer[nBytes++] = ( (uint8_t) audioFocus->flvl & MASK_4BIT ) << 4; + } + + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackAudioFocusCommon( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + IVAS_PIDATA_AUDIO_FOCUS *audioFocus = (IVAS_PIDATA_AUDIO_FOCUS *) piData; + + /* Audio Focus data is either 1, 4 or 5 bytes */ + if ( numDataBytes != 1 && numDataBytes != 4 && numDataBytes != 5 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack PI data of type Audio Focus" ); + } + + piData->size = sizeof( IVAS_PIDATA_AUDIO_FOCUS ); + audioFocus->availDirection = ( numDataBytes >= 4 ); + audioFocus->availLevel = ( numDataBytes == 1 || numDataBytes == 5 ); + + if ( numDataBytes == 1 ) + { + audioFocus->flvl = ( buffer[0] >> 4 ); + } + else + { + unpackQuaternion( buffer, &( audioFocus->direction ) ); + + if ( numDataBytes == 5 ) + { + audioFocus->flvl = ( buffer[4] >> 4 ); + } + } + + return IVAS_ERR_OK; +} + +static ivas_error packISMNum( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0; + const IVAS_PIDATA_ISM_NUM *ism_num = (const IVAS_PIDATA_ISM_NUM *) piData; + + *nBytesWritten = 0; + + if ( piData->size != sizeof( IVAS_PIDATA_ISM_NUM ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in ISM_NUM PI data" ); + } + + if ( piData->piDataType != IVAS_PI_ISM_NUM ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in ISM_NUM PI data" ); + } + + /* ISM_NUM data is 1 bytes, header is 2 bytes */ + if ( maxDataBytes < 1 + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack ISM_NUM PI data" ); + } + + buffer[nBytes++] = ( ism_num->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = 1; + buffer[nBytes++] = ( ( ism_num->numObjects - 1 ) & MASK_2BIT ) << 6; + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackISMNum( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + IVAS_PIDATA_ISM_NUM *ism_num = (IVAS_PIDATA_ISM_NUM *) piData; + uint8_t byte; + + /* ISM_NUM data is 1 bytes */ + if ( numDataBytes != 1 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack ISM_NUM PI data" ); + } + + ism_num->size = sizeof( IVAS_PIDATA_ISM_NUM ); + ism_num->piDataType = IVAS_PI_ISM_NUM; + + byte = buffer[0]; + ism_num->numObjects = ( ( byte >> 6 ) & MASK_2BIT ) + 1; + + return IVAS_ERR_OK; +} +static ivas_error packISMID( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0, n; + const IVAS_PIDATA_ISM_ID *ism_id = (const IVAS_PIDATA_ISM_ID *) piData; + + *nBytesWritten = 0; + + if ( piData->size > sizeof( IVAS_PIDATA_ISM_ID ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in ISM_ID PI data" ); + } + + if ( piData->piDataType != IVAS_PI_ISM_ID ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in ISM_ID PI data" ); + } + + /* ISM_ID data is 1 byte per object, header is 2 bytes */ + if ( maxDataBytes < 1 * IVAS_MAX_NUM_OBJECTS + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack ISM_NUM PI data" ); + } + + buffer[nBytes++] = ( ism_id->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = (uint8_t) ism_id->numObjects; + /* Pack ID for each object */ + for ( n = 0; n < ism_id->numObjects; n++ ) + { + buffer[nBytes++] = ( ism_id->id[n] & MASK_8BIT ); + } + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackISMID( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + uint32_t n; + IVAS_PIDATA_ISM_ID *ism_id = (IVAS_PIDATA_ISM_ID *) piData; + + /* ISM_ID data is 1 byte per object */ + if ( numDataBytes > IVAS_MAX_NUM_OBJECTS ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack ISM_ID PI data" ); + } + + ism_id->size = sizeof( IVAS_PIDATA_ISM_ID ); + ism_id->piDataType = IVAS_PI_ISM_ID; + ism_id->numObjects = (uint16_t) numDataBytes; + + /* Unpack ID for each object (1 byte each) */ + for ( n = 0; n < ism_id->numObjects; n++ ) + { + ism_id->id[n] = buffer[n]; + } + for ( ; n < IVAS_MAX_NUM_OBJECTS; n++ ) + { + ism_id->id[n] = 0; /* Initializing to 0, although there might be another object with this ID */ + } + + return IVAS_ERR_OK; +} + +static ivas_error packISMGain( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0, n, idx; + int16_t gain; + const IVAS_PIDATA_ISM_GAIN *ism_gain = (const IVAS_PIDATA_ISM_GAIN *) piData; + + *nBytesWritten = 0; + + if ( piData->size > sizeof( IVAS_PIDATA_ISM_GAIN ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in ISM_GAIN PI data" ); + } + + if ( piData->piDataType != IVAS_PI_ISM_GAIN ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in ISM_GAIN PI data" ); + } + + /* ISM_GAIN data is 1 byte per object, header is 2 bytes */ + if ( maxDataBytes < 1 * IVAS_MAX_NUM_OBJECTS + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack ISM_GAIN PI data" ); + } + + buffer[nBytes++] = ( ism_gain->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = (uint8_t) ism_gain->numObjects; + /* Pack ID for each object */ + for ( n = 0; n < ism_gain->numObjects; n++ ) + { + gain = (int16_t) ism_gain->dB[n]; + idx = min( -gain, 25 ); + if ( gain > 0 ) + { + idx += 25; + } + + buffer[nBytes++] = ( idx & MASK_6BIT ) << 2; + } + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackISMGain( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + uint32_t n, idx; + IVAS_PIDATA_ISM_GAIN *ism_gain = (IVAS_PIDATA_ISM_GAIN *) piData; + + /* ISM_GAIN data is 1 byte per object */ + if ( numDataBytes > IVAS_MAX_NUM_OBJECTS ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack ISM_GAIN PI data" ); + } + + ism_gain->size = sizeof( IVAS_PIDATA_ISM_GAIN ); + ism_gain->piDataType = IVAS_PI_ISM_GAIN; + ism_gain->numObjects = (uint16_t) numDataBytes; + + /* Unpack ID for each object (1 byte each) */ + for ( n = 0; n < ism_gain->numObjects; n++ ) + { + idx = ( buffer[n] ) >> 2; + /* negative gains*/ + if ( idx < 25 ) + { + ism_gain->dB[n] = -(int8_t) ( idx ); + } + /* Set to min for muting, to be interpreted as -Inf */ + else if ( idx == 25 ) + { + ism_gain->dB[n] = -128; + } + /* postive gains */ + else if ( idx < 38 ) + { + ism_gain->dB[n] = (int8_t) idx - 25; + } + else + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect index for ISM_GAIN PI data" ); + } + } + for ( ; n < IVAS_MAX_NUM_OBJECTS; n++ ) + { + ism_gain->dB[n] = 0; /* Set to default */ + } + return IVAS_ERR_OK; +} + +static ivas_error packISMDistanceAttenuation( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0, n; + const IVAS_PIDATA_ISM_ATTENUATION *ism_att = (const IVAS_PIDATA_ISM_ATTENUATION *) piData; + uint32_t lWord; + + *nBytesWritten = 0; + + if ( piData->size > sizeof( IVAS_PIDATA_ISM_ATTENUATION ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in ISM_DISTANCE_ATTENUATION PI data" ); + } + + if ( piData->piDataType != IVAS_PI_ISM_DISTANCE_ATTENUATION ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in ISM_DISTANCE_ATTENUATION PI data" ); + } + + /* ISM_DISTANCE_ATTENUATION data is 3 bytes per object, header is 2 bytes */ + if ( maxDataBytes > 3 * IVAS_MAX_NUM_OBJECTS + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack ISM_DISTANCE_ATTENUATION PI data" ); + } + + buffer[nBytes++] = ( ism_att->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = (uint8_t) ism_att->numObjects * 3; + /* Pack ID for each object */ + for ( n = 0; n < ism_att->numObjects; n++ ) + { + if ( ism_att->distAtten[n].ref_dist < 0 || ism_att->distAtten[n].max_dist < 0 || ism_att->distAtten[n].roll < 0 ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect DISTANCE ATTENUATION data" ); + } + lWord = (uint32_t) ( min( (uint16_t) ( ism_att->distAtten[n].ref_dist * 10.0f + 0.5f ) - 1, 63 ) << 18 ); + lWord |= (uint32_t) ( min( (uint16_t) ( ism_att->distAtten[n].max_dist + 0.5f ) - 1, 63 ) << 12 ); + lWord |= (uint32_t) ( min( (uint16_t) ( ism_att->distAtten[n].roll * 10.0f + 0.5f ), 40 ) << 6 ); + + buffer[nBytes++] = ( lWord >> 16 ) & MASK_8BIT; + buffer[nBytes++] = ( lWord >> 8 ) & MASK_8BIT; + buffer[nBytes++] = lWord & MASK_8BIT; + } + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackISMDistanceAttenuation( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + uint32_t n, lWord; + IVAS_PIDATA_ISM_ATTENUATION *ism_att = (IVAS_PIDATA_ISM_ATTENUATION *) piData; + + /* ISM_DISTANCE_ATTENUATION data is 3 bytes per object */ + if ( numDataBytes % 3 != 0 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack ISM_DISTANCE_ATTENUATION PI data" ); + } + + ism_att->size = sizeof( IVAS_PIDATA_ISM_ATTENUATION ); + ism_att->piDataType = IVAS_PI_ISM_DISTANCE_ATTENUATION; + ism_att->numObjects = (uint16_t) numDataBytes / 3; + + /* Unpack attenuation for each object (3 bytes each) */ + for ( n = 0; n < ism_att->numObjects; n++ ) + { + lWord = ( buffer[3 * n] ) << 16; + lWord |= ( buffer[3 * n + 1] ) << 8; + lWord |= buffer[3 * n + 2]; + + ism_att->distAtten[n].ref_dist = ( ( ( lWord >> 18 ) & MASK_6BIT ) + 1 ) / 10.0f; + ism_att->distAtten[n].max_dist = (float) ( ( lWord >> 12 ) & MASK_6BIT ) + 1; + ism_att->distAtten[n].roll = ( ( lWord >> 6 ) & MASK_6BIT ) / 10.0f; + } + for ( ; n < IVAS_MAX_NUM_OBJECTS; n++ ) + { + ism_att->distAtten[n].ref_dist = 1.0f; /* Set to default */ + ism_att->distAtten[n].max_dist = 16.0f; /* Set to default */ + ism_att->distAtten[n].roll = 1.0f; /* Set to default */ + } + return IVAS_ERR_OK; +} +static ivas_error packISMDirectivity( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0, n; + const IVAS_PIDATA_ISM_DIRECTIVITY *ism_directivity = (const IVAS_PIDATA_ISM_DIRECTIVITY *) piData; + uint16_t word, idx; + + *nBytesWritten = 0; + + if ( piData->size > sizeof( IVAS_PIDATA_ISM_DIRECTIVITY ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in ISM_DIRECTIVITY PI data" ); + } + + if ( piData->piDataType != IVAS_PI_ISM_DIRECTIVITY ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in ISM_DIRECTIVITY PI data" ); + } + + /* ISM_DIRECTIVITY data is 2 bytes per object, header is 2 bytes */ + if ( maxDataBytes > 2 * IVAS_MAX_NUM_OBJECTS + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack ISM_DIRECTIVITY PI data" ); + } + + buffer[nBytes++] = ( ism_directivity->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = (uint8_t) ism_directivity->numObjects * 2; + /* Pack directivity for each object */ + for ( n = 0; n < ism_directivity->numObjects; n++ ) + { + word = (uint16_t) ( min( ism_directivity->directivity[n].innerConeAngle / 15, 24 ) << 11 ); + word |= (uint16_t) ( min( ism_directivity->directivity[n].outerConeAngle / 15, 24 ) << 6 ); + + idx = 0; + /* For outer attenuation < -90 dB, idx = 0, which corresponds to -Inf (muting) */ + if ( ism_directivity->directivity[n].outerAttenuationdB >= -90.0f ) + { + idx = 32 - (uint16_t) ( -ism_directivity->directivity[n].outerAttenuationdB / 3.0f + 0.5f ); + } + word |= (uint16_t) ( min( idx, 31 ) << 1 ); + + buffer[nBytes++] = ( word >> 8 ) & MASK_8BIT; + buffer[nBytes++] = word & MASK_8BIT; + } + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackISMDirectivity( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + uint32_t n; + uint16_t word, idx; + IVAS_PIDATA_ISM_DIRECTIVITY *ism_directivity = (IVAS_PIDATA_ISM_DIRECTIVITY *) piData; + + /* ISM_DIRECTIVITY data is 2 bytes per object */ + if ( numDataBytes % 2 != 0 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack ISM_DIRECTIVITY PI data" ); + } + + ism_directivity->size = sizeof( IVAS_PIDATA_ISM_DIRECTIVITY ); + ism_directivity->piDataType = IVAS_PI_ISM_DIRECTIVITY; + ism_directivity->numObjects = (uint16_t) numDataBytes / 2; + + /* Unpack directivity for each object (2 bytes each) */ + for ( n = 0; n < ism_directivity->numObjects; n++ ) + { + word = ( buffer[2 * n] ) << 8; + word |= ( buffer[2 * n + 1] ); + + ism_directivity->directivity[n].innerConeAngle = ( ( word >> 11 ) & MASK_5BIT ) * 15; + ism_directivity->directivity[n].outerConeAngle = ( ( word >> 6 ) & MASK_5BIT ) * 15; + idx = ( word >> 1 ) & MASK_5BIT; + + if ( idx == 0 ) + { + ism_directivity->directivity[n].outerAttenuationdB = -128.0f; /* corresponds to muting */ + } + else + { + ism_directivity->directivity[n].outerAttenuationdB = -3.0f * ( 31 - ( ( word >> 1 ) & MASK_5BIT ) ); + } + } + for ( ; n < IVAS_MAX_NUM_OBJECTS; n++ ) + { + ism_directivity->directivity[n].innerConeAngle = 360; /* Set to default */ + ism_directivity->directivity[n].outerConeAngle = 360; /* Set to default */ + ism_directivity->directivity[n].outerAttenuationdB = 0; /* Set to default */ + } + return IVAS_ERR_OK; +} + +static ivas_error packReverseISMID( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0; + const IVAS_PIDATA_ISM_EDIT_ID *r_ism_id = (const IVAS_PIDATA_ISM_EDIT_ID *) piData; + + *nBytesWritten = 0; + + if ( piData->size > sizeof( IVAS_PIDATA_ISM_EDIT_ID ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in R_ISM_ID PI data" ); + } + + if ( piData->piDataType != IVAS_PI_R_ISM_ID ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in R_ISM_ID PI data" ); + } + + /* R_ISM_ID data is 1 byte, header is 2 bytes */ + if ( maxDataBytes < 1 + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack R_ISM_NUM PI data" ); + } + + buffer[nBytes++] = ( r_ism_id->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + buffer[nBytes++] = ( r_ism_id->id & MASK_8BIT ); + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackReverseISMID( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + IVAS_PIDATA_ISM_EDIT_ID *r_ism_id = (IVAS_PIDATA_ISM_EDIT_ID *) piData; + + /* ISM_ID data is 1 byte*/ + if ( numDataBytes > 1 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack R_ISM_ID PI data" ); + } + + r_ism_id->size = sizeof( IVAS_PIDATA_ISM_EDIT_ID ); + r_ism_id->piDataType = IVAS_PI_R_ISM_ID; + r_ism_id->id = *buffer; + + return IVAS_ERR_OK; +} + +static ivas_error packReverseISMGain( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0, idx; + int16_t gain; + const IVAS_PIDATA_ISM_EDIT_GAIN *r_ism_gain = (const IVAS_PIDATA_ISM_EDIT_GAIN *) piData; + + *nBytesWritten = 0; + + if ( piData->size > sizeof( IVAS_PIDATA_ISM_EDIT_GAIN ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in R_ISM_GAIN PI data" ); + } + + if ( piData->piDataType != IVAS_PI_R_ISM_GAIN ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in R_ISM_GAIN PI data" ); + } + + /* R_ISM_GAIN data is 1 byte, header is 2 bytes */ + if ( maxDataBytes < 1 + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack R_ISM_GAIN PI data" ); + } + + buffer[nBytes++] = ( r_ism_gain->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + gain = (int16_t) r_ism_gain->dB; + idx = min( -gain, 25 ); + if ( gain > 0 ) + { + idx += 25; + } + + buffer[nBytes++] = ( idx & MASK_6BIT ) << 2; + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackReverseISMGain( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + uint32_t idx; + IVAS_PIDATA_ISM_EDIT_GAIN *r_ism_gain = (IVAS_PIDATA_ISM_EDIT_GAIN *) piData; + + /* R_ISM_GAIN data is 1 byte */ + if ( numDataBytes > 1 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack R_ISM_GAIN PI data" ); + } + + r_ism_gain->size = sizeof( IVAS_PIDATA_ISM_EDIT_GAIN ); + r_ism_gain->piDataType = IVAS_PI_R_ISM_GAIN; + + /* Unpack gain */ + idx = ( *buffer ) >> 2; + /* negative gains*/ + if ( idx < 25 ) + { + r_ism_gain->dB = -(int8_t) ( idx ); + } + /* Set to min for muting, to be interpreted as -Inf */ + else if ( idx == 25 ) + { + r_ism_gain->dB = -128; + } + /* postive gains */ + else if ( idx < 38 ) + { + r_ism_gain->dB = (int8_t) idx - 25; + } + else + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect index for R_ISM_GAIN PI data" ); + } + + return IVAS_ERR_OK; +} + +static ivas_error packReverseISMDirection( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t nBytes = 0; + const IVAS_PIDATA_ISM_EDIT_DIRECTION *r_ism_direction = (const IVAS_PIDATA_ISM_EDIT_DIRECTION *) piData; + uint16_t word; + + *nBytesWritten = 0; + + if ( piData->size > sizeof( IVAS_PIDATA_ISM_EDIT_DIRECTION ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in R_ISM_DIRECTION PI data" ); + } + + if ( piData->piDataType != IVAS_PI_R_ISM_DIRECTION ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID in ISM_DIRECTION PI data" ); + } + + /* R_ISM_DIRECTION data is 2 bytes, header is 2 bytes */ + if ( maxDataBytes > 2 + 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack R_ISM_DIRECTION PI data" ); + } + + buffer[nBytes++] = ( r_ism_direction->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */ + + word = (uint16_t) ( min( (uint16_t) ceilf( r_ism_direction->azimuth * REVERSE_ISM_DIRECTION_AZIMUTH_STEP_INV ) + 256, 511 ) << 7 ); + word |= (uint16_t) ( min( (uint16_t) ceilf( r_ism_direction->elevation * REVERSE_ISM_DIRECTION_ELEVATION_STEP_INV ) + 64, 127 ) << 6 ); + + buffer[nBytes++] = ( word >> 8 ) & MASK_8BIT; + buffer[nBytes++] = word & MASK_8BIT; + + *nBytesWritten = nBytes; + return IVAS_ERR_OK; +} + +static ivas_error unpackReverseISMDirection( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + uint16_t word; + IVAS_PIDATA_ISM_EDIT_DIRECTION *r_ism_direction = (IVAS_PIDATA_ISM_EDIT_DIRECTION *) piData; + + /* R_ISM_DIRECTION data is 2 bytes */ + if ( numDataBytes > 2 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack R_ISM_DIRECTION PI data" ); + } + + r_ism_direction->size = sizeof( IVAS_PIDATA_ISM_EDIT_DIRECTION ); + r_ism_direction->piDataType = IVAS_PI_R_ISM_DIRECTION; + + word = ( buffer[0] ) << 8; + word |= ( buffer[1] ); + + r_ism_direction->azimuth = (float) ( ( ( word >> 7 ) & MASK_9BIT ) + 1 ) * REVERSE_ISM_DIRECTION_AZIMUTH_STEP - 180.0f; + r_ism_direction->elevation = (float) ( word & MASK_7BIT ) * REVERSE_ISM_DIRECTION_ELEVATION_STEP - 90.0f; + + return IVAS_ERR_OK; +} + +static ivas_error packPiLatency( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten ) +{ + uint32_t typeBits; + uint32_t latencyBits; + uint32_t word; + uint32_t nBytes = 0; + const IVAS_PIDATA_REVERSE_PI_LATENCY *p = (const IVAS_PIDATA_REVERSE_PI_LATENCY *) piData; + + *nBytesWritten = 0; + if ( piData->size != sizeof( IVAS_PIDATA_REVERSE_PI_LATENCY ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size for PI_LATENCY data" ); + } + if ( piData->piDataType != IVAS_PI_PI_LATENCY ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect PI ID for PI_LATENCY data" ); + } + if ( maxDataBytes < 2 + 4 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_INSUFFICIENT_OUTPUT_SIZE, "Insufficient space to pack PI_LATENCY data" ); + } + + buffer[nBytes++] = ( p->piDataType & MASK_5BIT ); + buffer[nBytes++] = 4; + + typeBits = (uint32_t) ( p->type & MASK_5BIT ); + latencyBits = (uint32_t) ( p->latency & 0x07FFFFFF ); + word = ( typeBits << 27 ) | latencyBits; + + buffer[nBytes++] = (uint8_t) ( word >> 24 ); + buffer[nBytes++] = (uint8_t) ( word >> 16 ); + buffer[nBytes++] = (uint8_t) ( word >> 8 ); + buffer[nBytes++] = (uint8_t) ( word ); + *nBytesWritten = nBytes; + + return IVAS_ERR_OK; +} + +static ivas_error unpackPiLatency( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData ) +{ + uint32_t word; + uint32_t lat; + IVAS_PIDATA_REVERSE_PI_LATENCY *p = (IVAS_PIDATA_REVERSE_PI_LATENCY *) piData; + + if ( numDataBytes != 4 ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack PI_LATENCY data" ); + } + + p->size = sizeof( IVAS_PIDATA_REVERSE_PI_LATENCY ); + p->piDataType = IVAS_PI_PI_LATENCY; + + word = ( (uint32_t) buffer[0] << 24 ) | ( (uint32_t) buffer[1] << 16 ) | + ( (uint32_t) buffer[2] << 8 ) | (uint32_t) buffer[3]; + p->type = (IVAS_PI_TYPE) ( ( word >> 27 ) & MASK_5BIT ); + lat = word & 0x07FFFFFF; + + /* Sign-extend 27-bit value */ + if ( lat & ( 1u << 26 ) ) + p->latency = (int32_t) ( lat | ~0x07FFFFFF ); + else + p->latency = (int32_t) lat; + + return IVAS_ERR_OK; +} + + +static const PACK_PI_FN packPiDataFuntions[IVAS_PI_MAX_ID] = { + packOrientation, /* SCENE_ORIENTATION */ + packOrientation, /* DEVICE_ORIENTATION_COMPENSATED */ + packOrientation, /* DEVICE_ORIENTATION_UNCOMPENSATED */ + packAcousticEnvironment, /* ACOUSTIC_ENVIRONMENT */ + packAudioDescription, /* AUDIO_DESCRIPTION */ + packISMNum, /* ISM_NUM */ + packISMID, /* ISM_ID */ + packISMGain, /* ISM_GAIN */ + packISMOrientation, /* ISM_ORIENTATION */ + packISMPosition, /* ISM_POSITION */ + packISMPositionCompact, /* ISM_POSITION_COMPACT */ + packISMDistanceAttenuation, /* ISM_DISTANCE_ATTENUATION */ + packISMDirectivity, /* ISM_DIRECTIVITY */ + packDiegetic, /* DIEGETIC_TYPE */ + packDynamicSuppression, /* DYNAMIC_AUDIO_SUPPRESSION_INDICATION */ + packAudioFocusCommon, /* AUDIO_FOCUS_INDICATION */ + packOrientation, /* PLAYBACK_DEVICE_ORIENTATION */ + packOrientation, /* HEAD_ORIENTATION */ + packPosition, /* LISTENER_POSITION */ + packDynamicSuppression, /* DYNAMIC_AUDIO_SUPPRESSION_REQUEST */ + packAudioFocusCommon, /* AUDIO_FOCUS_REQUEST */ + packPiLatency, /* PI_LATENCY */ + packReverseISMID, /* R_ISM_ID */ + packReverseISMGain, /* R_ISM_GAIN */ + packOrientation, /* R_ISM_ORIENTATION */ + + packPosition, /* R_ISM_POSITION */ + packPositionCompact, /* R_ISM_POSITION_COMPACT */ + packReverseISMDirection, /* R_ISM_DIRECTION */ + packUnsupportedData, /* RESERVED27 */ + packUnsupportedData, /* RESERVED28 */ + packUnsupportedData, /* RESERVED29 */ + packNoPiData /* NO_DATA */ +}; + +static const UNPACK_PI_FN unpackPiDataFuntions[IVAS_PI_MAX_ID] = { + unpackOrientation, /* SCENE_ORIENTATION */ + unpackOrientation, /* DEVICE_ORIENTATION_COMPENSATED */ + unpackOrientation, /* DEVICE_ORIENTATION_UNCOMPENSATED */ + unpackAcousticEnvironment, /* ACOUSTIC_ENVIRONMENT */ + unpackAudioDescription, /* AUDIO_DESCRIPTION */ + unpackISMNum, /* ISM_NUM */ + unpackISMID, /* ISM_ID */ + unpackISMGain, /* ISM_GAIN */ + unpackISMOrientation, /* ISM_ORIENTATION */ + unpackISMPosition, /* ISM_POSITION */ + unpackISMPositionCompact, /* ISM_POSITION_COMPACT */ + unpackISMDistanceAttenuation, /* ISM_DISTANCE_ATTENUATION */ + unpackISMDirectivity, /* ISM_DIRECTIVITY */ + unpackDiegetic, /* DIEGETIC_TYPE */ + unpackDynamicSuppression, /* DYNAMIC_AUDIO_SUPPRESSION_INDICATION */ + unpackAudioFocusCommon, /* AUDIO_FOCUS_INDICATION */ + unpackOrientation, /* PLAYBACK_DEVICE_ORIENTATION */ + unpackOrientation, /* HEAD_ORIENTATION */ + unpackPosition, /* LISTENER_POSITION */ + unpackDynamicSuppression, /* DYNAMIC_AUDIO_SUPPRESSION_REQUEST */ + unpackAudioFocusCommon, /* AUDIO_FOCUS_REQUEST */ + unpackPiLatency, /* PI_LATENCY */ + unpackReverseISMID, /* R_ISM_ID */ + unpackReverseISMGain, /* R_ISM_GAIN */ + unpackOrientation, /* R_ISM_ORIENTATION */ + unpackPosition, /* R_ISM_POSITION */ + unpackPositionCompact, /* R_ISM_POSITION_COMPACT */ + unpackReverseISMDirection, /* R_ISM_DIRECTION */ + unpackUnsupportedData, /* RESERVED27 */ + unpackUnsupportedData, /* RESERVED28 */ + unpackUnsupportedData, /* RESERVED29 */ + unpackNoPiData /* NO_DATA */ +}; + +static const uint32_t maxPiDataSize[IVAS_PI_MAX_ID] = { + 4, /* IVAS_PI_SCENE_ORIENTATION */ + 4, /* IVAS_PI_DEVICE_ORIENTATION_COMPENSATED */ + 4, /* IVAS_PI_DEVICE_ORIENTATION_UNCOMPENSATED */ + 8, /* IVAS_PI_ACOUSTIC_ENVIRONMENT */ + 5, /* IVAS_PI_AUDIO_DESCRIPTION */ + 1, /* IVAS_PI_ISM_NUM */ + 4, /* IVAS_PI_ISM_ID */ + 4, /* IVAS_PI_ISM_GAIN */ + 16, /* IVAS_PI_ISM_ORIENTATION */ + 24, /* IVAS_PI_ISM_POSITION */ + 16, /* IVAS_PI_ISM_POSITION_COMPACT */ + 12, /* IVAS_PI_ISM_DISTANCE_ATTENUATION */ + 8, /* IVAS_PI_ISM_DIRECTIVITY */ + 1, /* IVAS_PI_DIEGETIC_TYPE */ + 2, /* IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION_INDICATION */ + 5, /* IVAS_PI_AUDIO_FOCUS_INDICATION */ + 4, /* IVAS_PI_PLAYBACK_DEVICE_ORIENTATION */ + 4, /* IVAS_PI_HEAD_ORIENTATION */ + 6, /* IVAS_PI_LISTENER_POSITION */ + 2, /* IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION */ + 5, /* IVAS_PI_AUDIO_FOCUS_REQUEST */ + 4, /* IVAS_PI_PI_LATENCY */ + 1, /* IVAS_PI_R_ISM_ID */ + 1, /* IVAS_PI_R_ISM_GAIN */ + 4, /* IVAS_PI_R_ISM_ORIENTATION */ + 6, /* IVAS_PI_R_ISM_POSITION */ + 4, /* IVAS_PI_R_ISM_POSITION_COMPACT */ + 2, /* IVAS_PI_R_ISM_DIRECTION */ + 0, /* IVAS_PI_RESERVED27 */ + 0, /* IVAS_PI_RESERVED28 */ + 0, /* IVAS_PI_RESERVED29 */ + 0, /* NO_DATA */ +}; + +ivas_error PI_PackData( const IVAS_PIDATA_GENERIC *piData, PIDATA_PACKED *packed, uint8_t pmBits ) +{ + uint32_t type = (IVAS_PI_TYPE) ( piData->piDataType & MASK_5BIT ); + ivas_error error = packPiDataFuntions[type]( piData, packed->data, sizeof( packed->data ), &packed->size ); + if ( error == IVAS_ERR_OK ) + { + packed->data[0] |= pmBits; /* Update the PM bits */ + } + assert( packed->size != 0 ); + return error; +} + +ivas_error PI_UnPackData( uint8_t piDataType, uint32_t piSize, const uint8_t *piDataBuffer, IVAS_PIDATA_GENERIC *piData ) +{ + ivas_error error; + + /* Sanitize maximum sizes for each PI Type */ + if ( piSize > maxPiDataSize[piDataType] ) + { + return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Max size for PI Data type exceeded" ); + } + + error = unpackPiDataFuntions[piDataType]( piDataBuffer, piSize, piData ); + ERR_CHECK_RETURN( error ); + + /* since some pi data share piData structure, pi id are re-filled after unpacking */ + piData->piDataType = piDataType; + + return IVAS_ERR_OK; +} + +/* PIDATA Tables */ +const float mapRT60[1u << NBITS_RT60] = { + 0.01f, 0.0126f, 0.0159f, 0.02f, 0.0252f, 0.0317f, 0.04f, 0.0504f, + 0.0635f, 0.08f, 0.1008f, 0.1270f, 0.16f, 0.2016f, 0.2540f, 0.32f, + 0.4032f, 0.5080f, 0.64f, 0.8063f, 1.0159f, 1.28f, 1.6127f, 2.0319f, + 2.56f, 3.2254f, 4.0637f, 5.12f, 6.4508f, 8.1275f, 10.24f, 12.9016f +}; + +const float mapDSR[1u << NBITS_DSR] = { + -20.f, -21.f, -22.f, -23.f, -24.f, -25.f, -26.f, -27.f, + -28.f, -29.f, -30.f, -31.f, -32.f, -33.f, -34.f, -35.f, + -36.f, -37.f, -38.f, -39.f, -40.f, -41.f, -42.f, -43.f, + -44.f, -45.f, -46.f, -47.f, -48.f, -49.f, -50.f, -51.f, + -52.f, -53.f, -54.f, -55.f, -56.f, -57.f, -58.f, -59.f, + -60.f, -61.f, -62.f, -63.f, -64.f, -65.f, -66.f, -67.f, + -68.f, -69.f, -70.f, -71.f, -72.f, -73.f, -74.f, -75.f, + -76.f, -77.f, -78.f, -79.f, -80.f, -81.f, -82.f, -83.f +}; + +const float mapRoomDims[1u << NBITS_DIM] = { + 0.5f, 0.707f, 1.f, 1.4141f, 2, 2.8282f, 4.f, 5.6568f, + 8.f, 11.314f, 16.f, 22.627f, 32.f, 45.255f, 64.f, 90.51f +}; + +const float mapAbsorbtion[1u << NBITS_ABS] = { + 0.0800f, 0.1656f, 0.3430f, 0.7101f +}; diff --git a/lib_util/ivas_rtp_pi_data.h b/lib_util/ivas_rtp_pi_data.h new file mode 100644 index 0000000000000000000000000000000000000000..97519f588f7cb4d3e63aff821a9520f9fed5631a --- /dev/null +++ b/lib_util/ivas_rtp_pi_data.h @@ -0,0 +1,484 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_RTP_PI_DATA_H +#define IVAS_RTP_PI_DATA_H + +#include "common_api_types.h" + + +#define IVAS_PI_MAX_DATA_SIZE ( 32 + 2 ) /* max packed PI data bytes + pi header bytes */ + +#define REVERSE_ISM_DIRECTION_AZIMUTH_STEP 0.703125f +#define REVERSE_ISM_DIRECTION_ELEVATION_STEP 1.417322835f +#define REVERSE_ISM_DIRECTION_AZIMUTH_STEP_INV 1.4222222222f +#define REVERSE_ISM_DIRECTION_ELEVATION_STEP_INV 0.7055555556f + +/* IVAS PI Data Types */ +typedef enum +{ + /* Forward direction PI types */ + IVAS_PI_SCENE_ORIENTATION, /* orientation of audio scene in unit quaternions */ + IVAS_PI_DEVICE_ORIENTATION_COMPENSATED, /* orientation of device in unit quaternions (compensated) */ + IVAS_PI_DEVICE_ORIENTATION_UNCOMPENSATED, /* orientation of device in unit quaternions (un-compensated) */ + IVAS_PI_ACOUSTIC_ENVIRONMENT, /* describe the acoustic environment */ + IVAS_PI_AUDIO_DESCRIPTION, /* audio content description (voice/music/ambiance) */ + IVAS_PI_ISM_NUM, /* Number of objects */ + IVAS_PI_ISM_ID, /* id of each object */ + IVAS_PI_ISM_GAIN, /* gain of each object */ + IVAS_PI_ISM_ORIENTATION, /* orientation of each object */ + IVAS_PI_ISM_POSITION, /* position of each object */ + IVAS_PI_ISM_POSITION_COMPACT, /* position of each object in compact representation */ + IVAS_PI_ISM_DISTANCE_ATTENUATION, /* distance attenuation for each object */ + IVAS_PI_ISM_DIRECTIVITY, /* directivity of each object */ + IVAS_PI_DIEGETIC_TYPE, /* digetic audio indication */ + IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION_INDICATION, /* audio suppression indication */ + IVAS_PI_AUDIO_FOCUS_INDICATION, /* audio focus indication (direction in Quaternions and/or level) */ + /* Reverse direction PI types */ + IVAS_PI_PLAYBACK_DEVICE_ORIENTATION, /* orientation of the playback device in quaternions */ + IVAS_PI_HEAD_ORIENTATION, /* head orientation of the listener in Quaternions */ + IVAS_PI_LISTENER_POSITION, /* position of the listener in 3D space */ + IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION_REQUEST, /* receiver’s preference with respect to audio suppression */ + IVAS_PI_AUDIO_FOCUS_REQUEST, /* direction of interest for the listener in Quaternions and/or audio focus level */ + IVAS_PI_PI_LATENCY, /* round-trip latency for PI frames */ + IVAS_PI_R_ISM_ID, /* id of an object for editing */ + IVAS_PI_R_ISM_GAIN, /* editing request for gain factor for received object */ + IVAS_PI_R_ISM_ORIENTATION, /* editing request for orientation for received object */ + IVAS_PI_R_ISM_POSITION, /* editing request for position for received object */ + IVAS_PI_R_ISM_POSITION_COMPACT, /* editing request for position for received object in a compact representation*/ + IVAS_PI_R_ISM_DIRECTION, /* editing request for direction for received object */ + IVAS_PI_RESERVED27, /* reserved */ + IVAS_PI_RESERVED28, /* reserved */ + IVAS_PI_RESERVED29, /* reserved */ + IVAS_PI_NO_DATA = 31, /* Indicates an empty PI data frame */ + IVAS_PI_MAX_ID /* Max number of PI data IDs supprted */ +} IVAS_PI_TYPE; + +/* cartesian coordinates (X,Y,Z) in 3D space */ +typedef struct +{ + float x, y, z; +} IVAS_COORDINATE; + +/* orientation data corresponding to any of the following pi data types :- + * - IVAS_PI_SCENE_ORIENTATION + * - IVAS_PI_DEVICE_ORIENTATION_COMPENSATED + * - IVAS_PI_DEVICE_ORIENTATION_UNCOMPENSATED + * - IVAS_PI_PLAYBACK_DEVICE_ORIENTATION + * - IVAS_PI_HEAD_ORIENTATION + * - IVAS_PI_R_ISM_ORIENTATION + * + * piDataType is used to identify the correct pi data type contained here + */ +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_SCENE_ORIENTATION) */ + uint32_t piDataType; /* one of supported orientation data types */ + IVAS_QUATERNION orientation; /* orientation data expressed as quartenions */ +} IVAS_PIDATA_ORIENTATION; + +/* Acoustic environment corresponding to IVAS_PI_ACOUSTIC_ENVIRONMENT + * + * acoustic environment ID + * late reverb parameters + * - RT60 – indicating the time that it takes for the reflections to reduce 60 dB in energy level, per frequency band + * - DSR – diffuse to source signal energy ratio, per frequency band + * - Pre-delay – delay at which the computation of DSR values was performed + * early reflections + * - 3D rectangular virtual room dimensions + * - Broadband energy absorption coefficient per wall surface + */ +typedef enum +{ + IVAS_PI_AE_LOW, /* center frequency 25 Hz */ + IVAS_PI_AE_MID, /* center frequency 250 Hz */ + IVAS_PI_AE_HIGH, /* center frequency 2.5 kHz */ + IVAS_PI_AE_NUM_BANDS /* number of ae bands */ +} IVAS_PI_AE_BANDS; + +typedef enum +{ + IVAS_PI_AE_LOW_FREQ = 25, + IVAS_PI_AE_MID_FREQ = 250, + IVAS_PI_AE_HIGH_FREQ = 2500 +} IVAS_PI_AE_BANDS_FREQ; + +typedef enum +{ + IVAS_PI_AE_FRONT, + IVAS_PI_AE_BACK, + IVAS_PI_AE_LEFT, + IVAS_PI_AE_RIGHT, + IVAS_PI_AE_CEILING, + IVAS_PI_AE_FLOOR, + IVAS_PI_AE_NUM_SURFACE +} IVAS_PI_AE_SURFACE; + +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_ACOUSTIC_ENV) */ + uint32_t piDataType; /* IVAS_PI_ACOUSTIC_ENVIRONMENT */ + bool availLateReverb; /* AE contains only late reverb parameters */ + bool availEarlyReflections; /* AE containing late reverb and simplified early reflections */ + uint8_t aeid; /* seven-bit acoustic environment identifier */ + + /* only valid if availLateReverb==true or availEarlyReflections==true */ + float rt60[IVAS_PI_AE_NUM_BANDS]; /* time for the reflections to reduce 60 dB per band in seconds */ + float dsr[IVAS_PI_AE_NUM_BANDS]; /* diffuse to source signal energy ratio per band in dB */ + Word32 rt60_fx[IVAS_PI_AE_NUM_BANDS]; /* Q26: time for the reflections to reduce 60 dB per band in seconds */ + Word32 dsr_fx[IVAS_PI_AE_NUM_BANDS]; /* Q30: diffuse to source signal energy ratio per band in dB */ + + /* only valid if availEarlyReflections==true */ + IVAS_VECTOR3 roomDimensions; /* room dimensions in meters length (x), width (y), height (z) */ + float absorbCoeffs[IVAS_PI_AE_NUM_SURFACE]; /* absorption coefficients for all surfaces */ + Word32 absorbCoeffs_fx[IVAS_PI_AE_NUM_SURFACE]; /* Q30: absorption coefficients for all surfaces */ +} IVAS_PIDATA_ACOUSTIC_ENV; + +/* Audio Description corresponding to IVAS_PI_AUDIO_DESCRIPTION + * Describe the following audio decriptors per object/type :- + * - audio content type is speech/music/ambiance + * - if audio rendering is editable + * - if stereo audio is binaural + * + * number of valid entries decide on basis of audio format:- + * - Stereo/SBA/MASA = 1 entry + * - MultiChannel = 2 entries (1 for center channel + 1 for all other channels) + * - ISM = Number of Object entries ( 1 per object ) + * - OMASA/OSBA = 1 + Num Discrete Coded Objects + * + */ +typedef struct +{ + bool speech; /* audio has voice/speech */ + bool music; /* audio has music */ + bool ambiance; /* audio has background ambiance */ + bool editable; /* rendering audio metadata is editable */ + bool binaural; /* stereo stream is binaural */ +} IVAS_AUDIO_ID; + +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_AUDIO_DESC) */ + uint32_t piDataType; /* IVAS_PI_AUDIO_DESCRIPTION */ + uint32_t nValidEntries; /* Number of valid audio IDs */ + IVAS_AUDIO_ID audioId[1 + IVAS_MAX_NUM_OBJECTS]; /* audio id as per format */ +} IVAS_PIDATA_AUDIO_DESC; + +/* ISM specific PI data related to PI types : - + * + * - IVAS_PI_ISM_NUM + * - IVAS_PI_ISM_ID + * - IVAS_PI_ISM_GAIN + * - IVAS_PI_ISM_ORIENTATION + * - IVAS_PI_ISM_POSITION + * - IVAS_PI_ISM_DISTANCE_ATTENUATION + * - IVAS_PI_ISM_DIRECTIVITY + */ + +/* Number of ISMs */ +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_ISM_NUM) */ + uint32_t piDataType; /* IVAS_PI_ISM_NUM */ + uint32_t numObjects; /* Number of ISM */ +} IVAS_PIDATA_ISM_NUM; + +/* ISM ID */ +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_ISM_ID) */ + uint32_t piDataType; /* IVAS_PI_ISM_ID */ + uint16_t numObjects; /* number of objects */ + uint8_t id[IVAS_MAX_NUM_OBJECTS]; /* 8-bit ISM id of object */ +} IVAS_PIDATA_ISM_ID; + +/* ISM gain */ +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_ISM_GAIN) */ + uint32_t piDataType; /* IVAS_PI_ISM_GAIN */ + uint16_t numObjects; /* number of objects */ + int8_t dB[IVAS_MAX_NUM_OBJECTS]; /* ISM gain in dB per object [-96, +3] */ +} IVAS_PIDATA_ISM_GAIN; + +/* ISM orientation */ +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_ISM_ORIENTATION) */ + uint32_t piDataType; /* IVAS_PI_ISM_ORIENTATION */ + uint16_t numObjects; /* number of objects */ + IVAS_QUATERNION orientation[IVAS_MAX_NUM_OBJECTS]; /* Orientation of audio objects in ISM(s) */ +} IVAS_PIDATA_ISM_ORIENTATION; + +/* ISM position */ +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_ISM_POSITION) */ + uint32_t piDataType; /* IVAS_PI_ISM_POSITION */ + uint16_t numObjects; /* number of objects */ + IVAS_COORDINATE position[IVAS_MAX_NUM_OBJECTS]; /* Position of audio objects in ISM(s) */ +} IVAS_PIDATA_ISM_POSITION; + +/* ISM distance attenuation comprising of following gains per ISM + * - reference distance + * - maximum distance + * - roll-off factor + */ +typedef struct +{ + float ref_dist; /* reference distance in meters */ + float max_dist; /* maximum distance in meters */ + float roll; /* roll-off factor values */ +} IVAS_DIST_ATTEN; + +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_ISM_ATTENUATION) */ + uint32_t piDataType; /* IVAS_PI_ISM_DISTANCE_ATTENUATION */ + uint16_t numObjects; /* number of objects */ + IVAS_DIST_ATTEN distAtten[IVAS_MAX_NUM_OBJECTS]; /* Distance attenuation of audio objects */ +} IVAS_PIDATA_ISM_ATTENUATION; + +/* ISM Directivity comprising of following per ISM :- + * - inner cone angle determines the size of the main cone directed to the front of the object + * - outer cone angle determines the size of the outer (back) cone + * - outer attenuation gain determines the attenuation outside the outer cone + */ +typedef struct +{ + uint16_t innerConeAngle; /* inner cone angle in degrees (0 - 360) */ + uint16_t outerConeAngle; /* outer cone angle in degrees (0 - 360) */ + float outerAttenuationdB; /* attenuation outside the outer cone in dB */ +} IVAS_ISM_DIRECTIVITY; + +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_ISM_DIRECTIVITY) */ + uint32_t piDataType; /* IVAS_PI_ISM_DIRECTIVITY */ + uint16_t numObjects; /* number of objects */ + IVAS_ISM_DIRECTIVITY directivity[IVAS_MAX_NUM_OBJECTS]; /* Directivity of audio objects */ +} IVAS_PIDATA_ISM_DIRECTIVITY; + +/* Diegetic and non-diegetic indication flag as per audio format + * + * number of valid entries decided on basis of audio format:- + * - Stereo/SBA/MASA/MultiChannel = 1 entry + * - ISM = Number of Object entries ( 1 per object ) + * - OMASA/OSBA = 1 (last) + Num Discrete Coded Objects + */ +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_DIEGETIC) */ + uint32_t piDataType; /* IVAS_PI_DIEGETIC_TYPE */ + bool isDiegetic[1 + IVAS_MAX_NUM_OBJECTS]; /* diegetic indication as per audio format */ +} IVAS_PIDATA_DIEGETIC; + +/* Audio focus direction indicates a direction of interest. + * The audio focus level indicates the amount of suppression applied to the + * directions other than the audio focus direction. + */ +typedef enum +{ + IVAS_FLVL_NO_AUDIO_FOCUS = 0, /* Apply no audio focus */ + IVAS_FLVL_FOCUS_LEVEL_LEVEL_1, /* Audio focus level 1 */ + IVAS_FLVL_FOCUS_LEVEL_LEVEL_2, /* Audio focus level 2 */ + IVAS_FLVL_FOCUS_LEVEL_LEVEL_3, /* Audio focus level 3 */ + IVAS_FLVL_FOCUS_LEVEL_LEVEL_4, /* Audio focus level 4 */ + IVAS_FLVL_FOCUS_LEVEL_LEVEL_5, /* Audio focus level 5 */ + IVAS_FLVL_FOCUS_LEVEL_LEVEL_6, /* Audio focus level 6 */ + IVAS_FLVL_FOCUS_LEVEL_LEVEL_7, /* Audio focus level 7 */ + IVAS_FLVL_FOCUS_LEVEL_LEVEL_8, /* Audio focus level 8 */ + IVAS_FLVL_FOCUS_LEVEL_LEVEL_9, /* Audio focus level 9 */ + IVAS_FLVL_FOCUS_LEVEL_LEVEL_10, /* Audio focus level 10 */ + IVAS_FLVL_FOCUS_LEVEL_LEVEL_11, /* Audio focus level 11 */ + IVAS_FLVL_FOCUS_LEVEL_LEVEL_12, /* Audio focus level 12 */ + IVAS_FLVL_MAX_AUDIO_FOCUS, /* Apply max audio focus */ + IVAS_FLVL_DEFAULT_AUDIO_FOCUS, /* Default audio focus */ + IVAS_FLVL_NO_PREFERENCE, /* No preference / No indication */ +} IVAS_FLVL; + +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_AUDIO_FOCUS) */ + uint32_t piDataType; /* IVAS_PI_AUDIO_FOCUS_INDCATION or IVAS_PI_AUDIO_FOCUS_REQUEST */ + bool availDirection; /* audio focus contains direction */ + bool availLevel; /* audio focus contains level */ + IVAS_QUATERNION direction; /* direction data expressed as quarternions */ + IVAS_FLVL flvl; /* audio focus level */ +} IVAS_PIDATA_AUDIO_FOCUS; + +/* Position data corresponding to any of the following pi data types :- + * - IVAS_PI_LISTENER_POSITION + * - IVAS_PI_R_ISM_POSITION + * + * piDataType is used to identify the correct pi data type contained here + */ +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_POSITION) */ + uint32_t piDataType; /* one of supported position data types */ + IVAS_COORDINATE position; /* Position data */ +} IVAS_PIDATA_POSITION; + + +/* Dynamic Audio Suppression describes receiver’s preference with respect to the + * type of audio content that should be enhanced and the amount of suppression to + * be applied to the background noise + */ +typedef enum +{ + IVAS_SLI_MIN_SUPPRESSION = 0, /* Apply min suppression */ + IVAS_SLI_SUPPRESSION_LEVEL_1, /* Suppression level 1 */ + IVAS_SLI_SUPPRESSION_LEVEL_2, /* Suppression level 2 */ + IVAS_SLI_SUPPRESSION_LEVEL_3, /* Suppression level 3 */ + IVAS_SLI_SUPPRESSION_LEVEL_4, /* Suppression level 4 */ + IVAS_SLI_SUPPRESSION_LEVEL_5, /* Suppression level 5 */ + IVAS_SLI_SUPPRESSION_LEVEL_6, /* Suppression level 6 */ + IVAS_SLI_SUPPRESSION_LEVEL_7, /* Suppression level 7 */ + IVAS_SLI_SUPPRESSION_LEVEL_8, /* Suppression level 8 */ + IVAS_SLI_SUPPRESSION_LEVEL_9, /* Suppression level 9 */ + IVAS_SLI_SUPPRESSION_LEVEL_10, /* Suppression level 10 */ + IVAS_SLI_SUPPRESSION_LEVEL_11, /* Suppression level 11 */ + IVAS_SLI_MAX_SUPPRESSION, /* Apply max suppression */ + IVAS_SLI_NO_SUPPRESSION, /* Apply no suppression */ + IVAS_SLI_DEFAULT_SUPPRESSION, /* Apply default suppression */ + IVAS_SLI_NO_PREFERENCE, /* No preference / No indication */ +} IVAS_SLI; + +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_DYNAMIC_SUPPRESSION) */ + uint32_t piDataType; /* IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION_REQUEST or IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION_INDICATION */ + bool speech; /* receiver's preference is voice/speech */ + bool music; /* receiver's preference is music */ + bool ambiance; /* receiver's preference is background ambiance */ + IVAS_SLI sli; /* suppression level indicator [0, 15] */ +} IVAS_PIDATA_DYNAMIC_SUPPRESSION; + +/* Reverse PI latency calculated as the elapsed time between the sent reverse PI data + * and received forward PI data. It is based on the receiving device experiencing the + * result of its sent data by receiving the corresponding data in forward direction as + * forward PI data + */ +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_REVERSE_PI_LATENCY) */ + uint32_t piDataType; /* IVAS_PI_PI_LATENCY */ + IVAS_PI_TYPE type; /* Reverse PI used for computation of Latency */ + int32_t latency; /* Latency as 27-bit int on RTP Clock @ 16KHz */ +} IVAS_PIDATA_REVERSE_PI_LATENCY; + +/* ISM specific PI data editing requests */ + +/* ISM ID in editing requests */ +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_ISM_EDIT_ID) */ + uint32_t piDataType; /* IVAS_PI_R_ISM_ID */ + uint8_t id; /* 8-bit ISM id of object to edit */ +} IVAS_PIDATA_ISM_EDIT_ID; + +/* Editing request for ISM gain */ +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_ISM_EDIT_GAIN) */ + uint32_t piDataType; /* IVAS_PI_R_ISM_GAIN */ + int8_t dB; /* Preferred ISM gain in dB [-96, +3] */ +} IVAS_PIDATA_ISM_EDIT_GAIN; + +/* Editing request for ISM orientation */ +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_ISM_EDIT_ORIENTATION) */ + uint32_t piDataType; /* IVAS_PI_R_ISM_ORIENTATION */ + IVAS_QUATERNION orientation; /* orientation editing request for received ISM */ +} IVAS_PIDATA_ISM_EDIT_ORIENTATION; + + +/* Editing request for ISM direction */ +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_ISM_EDIT_DIRECTION) */ + uint32_t piDataType; /* IVAS_PI_R_ISM_DIRECTION */ + float azimuth; /* azimuth angle in degrees [-180, 180] */ + float elevation; /* elevation angle in degrees [-90°, 90°] */ +} IVAS_PIDATA_ISM_EDIT_DIRECTION; + +typedef struct +{ + size_t size; /* sizeof(IVAS_PIDATA_NO_DATA) */ + uint32_t piDataType; /* IVAS_PI_NO_DATA */ +} IVAS_PIDATA_NO_DATA; + + +typedef union +{ + IVAS_PIDATA_ORIENTATION scene; + IVAS_PIDATA_ORIENTATION deviceCompensated; + IVAS_PIDATA_ORIENTATION deviceUnCompensated; + IVAS_PIDATA_ACOUSTIC_ENV acousticEnv; + IVAS_PIDATA_AUDIO_DESC audioDesc; + IVAS_PIDATA_ISM_NUM ismNum; + IVAS_PIDATA_ISM_ID ismId; + IVAS_PIDATA_ISM_GAIN ismGain; + IVAS_PIDATA_ISM_ORIENTATION ismOrientation; + IVAS_PIDATA_ISM_POSITION ismPosition; + IVAS_PIDATA_ISM_POSITION ismPositionCompact; + IVAS_PIDATA_ISM_ATTENUATION ismAttenuation; + IVAS_PIDATA_ISM_DIRECTIVITY ismDirectivity; + IVAS_PIDATA_DIEGETIC digeticIndicator; + IVAS_PIDATA_DYNAMIC_SUPPRESSION dynSuppressionIndication; + IVAS_PIDATA_AUDIO_FOCUS focusIndication; + + IVAS_PIDATA_ORIENTATION playbackOrientation; + IVAS_PIDATA_ORIENTATION headOrientation; + IVAS_PIDATA_POSITION listnerPosition; + IVAS_PIDATA_DYNAMIC_SUPPRESSION dynSuppressionRequest; + IVAS_PIDATA_AUDIO_FOCUS focusRequest; + IVAS_PIDATA_REVERSE_PI_LATENCY piLatency; + IVAS_PIDATA_ISM_EDIT_ID ismEditId; + IVAS_PIDATA_ISM_EDIT_GAIN ismEditGain; + IVAS_PIDATA_ISM_EDIT_ORIENTATION ismEditOrientation; + IVAS_PIDATA_POSITION ismEditPosition; + IVAS_PIDATA_POSITION ismEditPositionCompact; + IVAS_PIDATA_ISM_EDIT_DIRECTION ismEditDirection; + IVAS_PIDATA_NO_DATA noPiData; +} PIDATA; + +typedef struct pidata_ts_struct +{ + PIDATA data; + uint32_t timestamp; +} PIDATA_TS; + + +#endif /* IVAS_RTP_PI_DATA_H */ diff --git a/lib_util/jbm_file_reader.c b/lib_util/jbm_file_reader.c index b657ab78929f906eb29dd6c3435af8a7f91c73ca..68caf5ae73fc93637fbe3f08d7a4b1513bd284bc 100644 --- a/lib_util/jbm_file_reader.c +++ b/lib_util/jbm_file_reader.c @@ -68,9 +68,9 @@ JbmFileReader *JbmFileReader_open( return NULL; } - self = calloc( sizeof( JbmFileReader ), 1 ); + self = calloc( 1, sizeof( JbmFileReader ) ); self->file = file; - self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 ); + self->file_path = calloc( strlen( filePath ) + 1, sizeof( char ) ); strcpy( self->file_path, filePath ); return self; diff --git a/lib_util/jbm_file_writer.c b/lib_util/jbm_file_writer.c index 76a5a67d2566db5d87ecefb0bb7d21bbeb9afcaf..9d11dad90490e74e44a1f8afc25e70e8fc196493 100644 --- a/lib_util/jbm_file_writer.c +++ b/lib_util/jbm_file_writer.c @@ -77,9 +77,9 @@ ivas_error JbmOffsetFileWriter_open( return IVAS_ERR_FAILED_FILE_OPEN; } - self = calloc( sizeof( JbmOffsetFileWriter ), 1 ); + self = calloc( 1, sizeof( JbmOffsetFileWriter ) ); self->file = file; - self->file_path = calloc( sizeof( char ), strlen( jbmOffsetFilename ) + 1 ); + self->file_path = calloc( strlen( jbmOffsetFilename ) + 1, sizeof( char ) ); strcpy( self->file_path, jbmOffsetFilename ); *jbmOffsetWriter = self; @@ -204,9 +204,9 @@ ivas_error JbmTraceFileWriter_open( fprintf( file, "#rtpSeqNo;rtpTs;rcvTime;playTime;active\n" ); - self = calloc( sizeof( JbmTraceFileWriter ), 1 ); + self = calloc( 1, sizeof( JbmTraceFileWriter ) ); self->file = file; - self->file_path = calloc( sizeof( char ), strlen( jbmTraceFilename ) + 1 ); + self->file_path = calloc( strlen( jbmTraceFilename ) + 1, sizeof( char ) ); strcpy( self->file_path, jbmTraceFilename ); *jbmTraceWriter = self; diff --git a/lib_util/ls_custom_file_reader.c b/lib_util/ls_custom_file_reader.c index f4f43e496e358d9dae0ca00a8478fe342a3fc121..5c1ac6ae041709cb0c7f84642afab48efc2a8c7f 100644 --- a/lib_util/ls_custom_file_reader.c +++ b/lib_util/ls_custom_file_reader.c @@ -33,8 +33,7 @@ #include "ls_custom_file_reader.h" #include #include -#include "ivas_prot_fx.h" -#include "prot_fx.h" +#include struct LsCustomFileReader @@ -71,9 +70,9 @@ ivas_error CustomLsReader_open( return IVAS_ERR_FAILED_FILE_OPEN; } - self = calloc( sizeof( LsCustomFileReader ), 1 ); + self = calloc( 1, sizeof( LsCustomFileReader ) ); self->file = lsFile; - self->file_path = calloc( sizeof( char ), strlen( LsFilePath ) + 1 ); + self->file_path = calloc( strlen( LsFilePath ) + 1, sizeof( char ) ); strcpy( self->file_path, LsFilePath ); *hLsCustomReader = self; @@ -106,6 +105,96 @@ void CustomLsReader_close( } +/*-------------------------------------------------------------------* + * panning_wrap_angles() + * + * Wrap angles for amplitude panning to the range: + * azimuth = (-180, 180] + * elevation = [-90, 90] + * Considers direction changes from large elevation values + *-------------------------------------------------------------------*/ + +/* helper function for panning_wrap_angles */ +static float wrap_azi( + const float azi_deg ) +{ + float azi = azi_deg; + + /* Wrap azimuth value */ + while ( azi > 180 ) + { + azi -= 360.0f; + } + + while ( azi <= -180 ) + { + azi += 360; + } + + return azi; +} + +static void panning_wrap_angles( + const float azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ + const float ele_deg, /* i : elevation in degrees for panning direction (positive up) */ + float *azi_wrapped, /* o : wrapped azimuth component */ + float *ele_wrapped /* o : wrapped elevation component */ +) +{ + float azi, ele; + + azi = azi_deg; + ele = ele_deg; + + if ( fabsf( ele ) < 90 ) + { + *ele_wrapped = ele; + *azi_wrapped = wrap_azi( azi ); + return; + } + else + { + /* Special case when elevation is a multiple of 90; azimuth is irrelevant */ + if ( ( fmodf( ele, 90 ) == 0 ) && ( fmodf( ele, 180 ) != 0 ) ) + { + *azi_wrapped = 0; + while ( ele > 90 ) + { + ele -= 360; + } + while ( ele < -90 ) + { + ele += 360; + } + *ele_wrapped = ele; + } + else + { + /* Wrap elevation and adjust azimuth accordingly */ + while ( fabsf( ele ) > 90 ) + { + /* Flip to other hemisphere */ + azi += 180; + + /* Compensate elevation accordingly */ + if ( ele > 90 ) + { + ele = 180 - ele; + } + else if ( ele < -90 ) + { + ele = -180 - ele; + } + } + *azi_wrapped = wrap_azi( azi ); + *ele_wrapped = ele; + } + + return; + } +} + + /*-------------------------------------------------------------------------* * CustomLoudspeakerLayout_validate() * @@ -122,9 +211,16 @@ static LS_CUSTOM_FILEREADER_ERROR CustomLoudspeakerLayout_validate( { int16_t i, j; int16_t dup_count; - int16_t dup[IVAS_MAX_OUTPUT_CHANNELS]; - float azi_tmp[IVAS_MAX_OUTPUT_CHANNELS]; - float ele_tmp[IVAS_MAX_OUTPUT_CHANNELS]; + int16_t dup[IVAS_MAX_LS_CHANNELS]; + float azi_tmp[IVAS_MAX_LS_CHANNELS]; + float ele_tmp[IVAS_MAX_LS_CHANNELS]; + + for ( i = 0; i < IVAS_MAX_LS_CHANNELS; i++ ) + { + dup[i] = 0; + azi_tmp[i] = 0.0f; + ele_tmp[i] = 0.0f; + } if ( *num_azi != *num_ele ) { @@ -137,7 +233,7 @@ static LS_CUSTOM_FILEREADER_ERROR CustomLoudspeakerLayout_validate( return LS_CUSTOM_FILEREADER_LFE_NUM_SPK_EXCEEDED_ERROR; } - if ( ( *num_azi + num_lfe ) > IVAS_MAX_OUTPUT_CHANNELS ) + if ( ( *num_azi + num_lfe ) > IVAS_MAX_LS_CHANNELS ) { return LS_CUSTOM_FILEREADER_OUTPUT_NCHAN_EXCEEDED_ERROR; } @@ -150,7 +246,6 @@ static LS_CUSTOM_FILEREADER_ERROR CustomLoudspeakerLayout_validate( /* Check for and flag duplicate loudspeakers */ dup_count = 0; - set_s( dup, 0, IVAS_MAX_OUTPUT_CHANNELS ); for ( i = 0; i < *num_azi; i++ ) { for ( j = i + 1; j < *num_azi; j++ ) @@ -163,9 +258,6 @@ static LS_CUSTOM_FILEREADER_ERROR CustomLoudspeakerLayout_validate( } /* Remove duplicates from array */ - set_zero( azi_tmp, IVAS_MAX_OUTPUT_CHANNELS ); - set_zero( ele_tmp, IVAS_MAX_OUTPUT_CHANNELS ); - for ( i = 0, j = 0; i < *num_azi; i++ ) { if ( dup[i] ) @@ -179,8 +271,12 @@ static LS_CUSTOM_FILEREADER_ERROR CustomLoudspeakerLayout_validate( } ( *num_azi ) -= dup_count; - mvr2r( azi_tmp, azi, IVAS_MAX_OUTPUT_CHANNELS ); - mvr2r( ele_tmp, ele, IVAS_MAX_OUTPUT_CHANNELS ); + + for ( i = 0; i < IVAS_MAX_LS_CHANNELS; i++ ) + { + azi[i] = azi_tmp[i]; + ele[i] = ele_tmp[i]; + } return LS_CUSTOM_FILEREADER_NO_ERROR; } @@ -236,17 +332,19 @@ LS_CUSTOM_FILEREADER_ERROR CustomLsFileReading( char line[200]; /* > (10 chars * IVAS_MAX_OUTPUT_CHANNELS) i.e. "-999, " */ const char *tok; - - int16_t num_azi, num_ele, num_lfe; + int16_t i, num_azi, num_ele, num_lfe; /* initialize variables */ num_azi = 0; num_ele = 0; num_lfe = 0; - set_zero( hLsCustomData->azimuth, IVAS_MAX_OUTPUT_CHANNELS ); - set_zero( hLsCustomData->elevation, IVAS_MAX_OUTPUT_CHANNELS ); - set_s( hLsCustomData->lfe_idx, -1, IVAS_MAX_OUTPUT_CHANNELS ); + for ( i = 0; i < IVAS_MAX_LS_CHANNELS; i++ ) + { + hLsCustomData->lfe_idx[i] = -1; + hLsCustomData->azimuth[i] = 0.0f; + hLsCustomData->elevation[i] = 0.0f; + } if ( hLsCustomReader->file == NULL ) { @@ -273,7 +371,7 @@ LS_CUSTOM_FILEREADER_ERROR CustomLsFileReading( continue; } - if ( num_azi >= IVAS_MAX_OUTPUT_CHANNELS ) + if ( num_azi >= IVAS_MAX_LS_CHANNELS ) { return LS_CUSTOM_FILEREADER_AZI_NUM_SPK_EXCEEDED_ERROR; } @@ -302,7 +400,7 @@ LS_CUSTOM_FILEREADER_ERROR CustomLsFileReading( continue; } - if ( num_ele >= IVAS_MAX_OUTPUT_CHANNELS ) + if ( num_ele >= IVAS_MAX_LS_CHANNELS ) { return LS_CUSTOM_FILEREADER_ELE_NUM_SPK_EXCEEDED_ERROR; } @@ -328,14 +426,14 @@ LS_CUSTOM_FILEREADER_ERROR CustomLsFileReading( continue; } - if ( num_lfe > IVAS_MAX_OUTPUT_CHANNELS ) + if ( num_lfe > IVAS_MAX_LS_CHANNELS ) { return LS_CUSTOM_FILEREADER_LFE_NUM_SPK_EXCEEDED_ERROR; } else { hLsCustomData->lfe_idx[num_lfe] = (int16_t) atoi( tok ); - if ( hLsCustomData->lfe_idx[num_lfe] < 0 || hLsCustomData->lfe_idx[num_lfe] > ( IVAS_MAX_OUTPUT_CHANNELS - 1 ) ) + if ( hLsCustomData->lfe_idx[num_lfe] < 0 || hLsCustomData->lfe_idx[num_lfe] > ( IVAS_MAX_LS_CHANNELS - 1 ) ) { return LS_CUSTOM_FILEREADER_LFE_INDEX_ERROR; } diff --git a/lib_util/masa_file_reader.c b/lib_util/masa_file_reader.c index efab80b79547db87abeb0a4f44e1e72dbc1a3637..d782cdfd06d5ec6d6fd7005dba134ad11d3ee210 100644 --- a/lib_util/masa_file_reader.c +++ b/lib_util/masa_file_reader.c @@ -35,6 +35,7 @@ #include #include #include "ivas_prot_fx.h" +#include "ivas_rom_com.h" /* load 'ivasmasaFormatDescriptor[8]' */ struct MasaFileReader @@ -69,7 +70,7 @@ MasaFileReader *MasaFileReader_open( return NULL; } - self = calloc( sizeof( MasaFileReader ), 1 ); + self = calloc( 1, sizeof( MasaFileReader ) ); self->file = file; generate_gridEq_fx( &self->sph_grid16 ); @@ -111,7 +112,6 @@ ivas_error MasaFileReader_readNextFrame( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - const uint8_t ivasmasaFormatDescriptor[8] = { 0x49, 0x56, 0x41, 0x53, 0x4D, 0x41, 0x53, 0x41 }; /* "IVASMASA" */ uint16_t twoByteBuffer = 0; int16_t i, j, b; IVAS_MASA_METADATA_HANDLE hMeta; diff --git a/lib_util/masa_file_writer.c b/lib_util/masa_file_writer.c index 0939d0829ce7a4a2bc7a8b1718eea70694c37bf5..a1c4d7054757b068aa1dec5e8a6e9da35c11ce29 100644 --- a/lib_util/masa_file_writer.c +++ b/lib_util/masa_file_writer.c @@ -41,11 +41,12 @@ typedef struct masaMetaDelayStorage { MASA_DECRIPTIVE_META descriptiveMeta; - uint16_t directionIndex[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; - uint8_t directToTotalRatio[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; - uint8_t spreadCoherence[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; - uint8_t surroundCoherence[DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; - uint8_t diffuseToTotalRatio[DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; + uint16_t directionIndex[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t directToTotalRatio[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t spreadCoherence[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t surroundCoherence[DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t diffuseToTotalRatio[DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t prevDelay; } MASA_META_DELAY_STORAGE; @@ -88,50 +89,85 @@ static void getExtMasaMetadataFileName( static void delayMasaMetadata( MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: New input metadata which is inplace replaced with delayed metadata frame */ - MASA_META_DELAY_STORAGE *delayStorage /* i/o: Storage for 10 ms of metadata and related descriptive metadata */ -) + MASA_META_DELAY_STORAGE *delayStorage, /* i/o: Storage for 15 ms of metadata and related descriptive metadata */ + uint8_t delayNsf ) { int16_t dir, sf, band; uint8_t currentNumberOfDirections; - + int16_t storeReadOffset; /* Move meta to delay and output. Always use two directions as the metadata is prepared to contain zero energy second direction * if there is 1dir meta. */ - for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES - DELAY_MASA_PARAM_DEC_SFR; sf++ ) + /* stable state expected results delay change expected results + delayNsf = 2 delayNsf = 3 delayNsf = 3 (from 2) delayNsf = 2 (from 3) + ext[0] = delayStorage[0] (prev ext[2]) ext[0] = delayStorage[0] (prev ext[1]) ext[0] = delayStorage[0] (prev ext[2]) ext[0] = delayStorage[1] (prev ext[2]) + ext[1] = delayStorage[1] (prev ext[3]) ext[1] = delayStorage[1] (prev ext[2]) ext[1] = delayStorage[1] (prev ext[3]) ext[1] = delayStorage[2] (prev ext[3]) + ext[2] = ext[0] ext[2] = delayStorage[2] (prev ext[3]) ext[2] = delayStorage[1] (prev ext[3]) ext[2] = ext[0] + ext[3] = ext[1] ext[3] = ext[0] ext[3] = ext[0] ext[3] = ext[0] + delayStorage[0] = ext[2] delayStorage[0] = ext[1] delayStorage[0] = ext[1] delayStorage[0] = ext[2] + delayStorage[1] = ext[3] delayStorage[1] = ext[2] delayStorage[1] = ext[2] delayStorage[1] = ext[3] + delayStorage[2] = ext[3] delayStorage[2] = ext[3] + */ + storeReadOffset = delayStorage->prevDelay > delayNsf ? delayStorage->prevDelay - delayNsf : 0; /* delay decreases: read later from storage -> discard one sf */ + + for ( sf = 0; sf < delayNsf; sf++ ) { for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { uint16_t temp_u16; uint8_t temp_u8; + int16_t toStoreIdx, reOrgIdx, storeReadIdx; + + toStoreIdx = sf + MAX_PARAM_SPATIAL_SUBFRAMES - delayNsf; + reOrgIdx = sf + delayNsf; + /* when switching to longer delay, repeat the last valid sf to fill the gap */ + storeReadIdx = ( ( sf + storeReadOffset ) < delayStorage->prevDelay ) ? sf + storeReadOffset : delayStorage->prevDelay - 1; + for ( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) { - temp_u16 = delayStorage->directionIndex[dir][sf][band]; - delayStorage->directionIndex[dir][sf][band] = extOutMeta->directionIndex[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band]; - extOutMeta->directionIndex[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->directionIndex[dir][sf][band]; + temp_u16 = delayStorage->directionIndex[dir][storeReadIdx][band]; + delayStorage->directionIndex[dir][sf][band] = extOutMeta->directionIndex[dir][toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->directionIndex[dir][reOrgIdx][band] = extOutMeta->directionIndex[dir][sf][band]; + } extOutMeta->directionIndex[dir][sf][band] = temp_u16; - temp_u8 = delayStorage->directToTotalRatio[dir][sf][band]; - delayStorage->directToTotalRatio[dir][sf][band] = extOutMeta->directToTotalRatio[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band]; - extOutMeta->directToTotalRatio[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->directToTotalRatio[dir][sf][band]; + temp_u8 = delayStorage->directToTotalRatio[dir][storeReadIdx][band]; + delayStorage->directToTotalRatio[dir][sf][band] = extOutMeta->directToTotalRatio[dir][toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->directToTotalRatio[dir][reOrgIdx][band] = extOutMeta->directToTotalRatio[dir][sf][band]; + } extOutMeta->directToTotalRatio[dir][sf][band] = temp_u8; - temp_u8 = delayStorage->spreadCoherence[dir][sf][band]; - delayStorage->spreadCoherence[dir][sf][band] = extOutMeta->spreadCoherence[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band]; - extOutMeta->spreadCoherence[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->spreadCoherence[dir][sf][band]; + temp_u8 = delayStorage->spreadCoherence[dir][storeReadIdx][band]; + delayStorage->spreadCoherence[dir][sf][band] = extOutMeta->spreadCoherence[dir][toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->spreadCoherence[dir][reOrgIdx][band] = extOutMeta->spreadCoherence[dir][sf][band]; + } extOutMeta->spreadCoherence[dir][sf][band] = temp_u8; } - temp_u8 = delayStorage->surroundCoherence[sf][band]; - delayStorage->surroundCoherence[sf][band] = extOutMeta->surroundCoherence[sf + DELAY_MASA_PARAM_DEC_SFR][band]; - extOutMeta->surroundCoherence[sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->surroundCoherence[sf][band]; + temp_u8 = delayStorage->surroundCoherence[storeReadIdx][band]; + delayStorage->surroundCoherence[sf][band] = extOutMeta->surroundCoherence[toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->surroundCoherence[reOrgIdx][band] = extOutMeta->surroundCoherence[sf][band]; + } extOutMeta->surroundCoherence[sf][band] = temp_u8; - temp_u8 = delayStorage->diffuseToTotalRatio[sf][band]; - delayStorage->diffuseToTotalRatio[sf][band] = extOutMeta->diffuseToTotalRatio[sf + DELAY_MASA_PARAM_DEC_SFR][band]; - extOutMeta->diffuseToTotalRatio[sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->diffuseToTotalRatio[sf][band]; + temp_u8 = delayStorage->diffuseToTotalRatio[storeReadIdx][band]; + delayStorage->diffuseToTotalRatio[sf][band] = extOutMeta->diffuseToTotalRatio[toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->diffuseToTotalRatio[reOrgIdx][band] = extOutMeta->diffuseToTotalRatio[sf][band]; + } extOutMeta->diffuseToTotalRatio[sf][band] = temp_u8; } } + /* Finalize descriptive meta by using new frame except for number of directions which is the larger of the two */ currentNumberOfDirections = extOutMeta->descriptiveMeta.numberOfDirections; if ( delayStorage->descriptiveMeta.numberOfDirections > extOutMeta->descriptiveMeta.numberOfDirections ) @@ -140,6 +176,7 @@ static void delayMasaMetadata( } delayStorage->descriptiveMeta.numberOfDirections = currentNumberOfDirections; + delayStorage->prevDelay = delayNsf; return; } @@ -174,14 +211,15 @@ ivas_error MasaFileWriter_open( return IVAS_ERR_FAILED_FILE_OPEN; } - self = calloc( sizeof( MasaFileWriter ), 1 ); + self = calloc( 1, sizeof( MasaFileWriter ) ); self->file = file; - self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 ); + self->file_path = calloc( strlen( filePath ) + 1, sizeof( char ) ); strcpy( self->file_path, filePath ); if ( !delayCompensationEnabled ) { - self->delayStorage = calloc( sizeof( MASA_META_DELAY_STORAGE ), 1 ); + self->delayStorage = calloc( 1, sizeof( MASA_META_DELAY_STORAGE ) ); + self->delayStorage->prevDelay = DELAY_MASA_PARAM_DEC_SFR; } *masaWriter = self; @@ -197,8 +235,9 @@ ivas_error MasaFileWriter_open( *---------------------------------------------------------------------*/ ivas_error MasaFileWriter_writeFrame( - MasaFileWriter *self, /* i/o: MasaFileWriter handle */ - MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */ + MasaFileWriter *self, /* i/o: MasaFileWriter handle */ + MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ + const float *decDelay /* i : decoding audio delay */ ) { if ( self == NULL ) @@ -209,15 +248,15 @@ ivas_error MasaFileWriter_writeFrame( uint16_t descMetaTemp = 0; int16_t i, sf, dir, numDirections; uint8_t writeTempOther[MASA_FREQUENCY_BANDS]; - /* If delay storage has been reserved, then we are in the normal mode for the decoder * (i.e., no delay compensation for PCM) which means that metadata should be delayed - * by two subframes (10 ms). Descriptive metadata is a combined result. */ + * by two or three subframes (10 or 15 ms). Descriptive metadata is a combined result. */ if ( self->delayStorage ) { - delayMasaMetadata( hMasaExtOutMeta, self->delayStorage ); - } + uint8_t delayFrames = (uint8_t) ( (int32_t) ( ( *decDelay ) * 48000 ) / L_SPATIAL_SUBFR_48k ); + delayMasaMetadata( hMasaExtOutMeta, self->delayStorage, delayFrames ); + } numDirections = hMasaExtOutMeta->descriptiveMeta.numberOfDirections + 1; if ( fwrite( &( hMasaExtOutMeta->descriptiveMeta.formatDescriptor ), sizeof( uint8_t ), 8, self->file ) != 8 ) diff --git a/lib_util/masa_file_writer.h b/lib_util/masa_file_writer.h index 2d476e28f037e45af8a957b77015c1582bff2ef0..74d098388c0e5acf03f777d75d6868f496bf3c6e 100644 --- a/lib_util/masa_file_writer.h +++ b/lib_util/masa_file_writer.h @@ -47,8 +47,9 @@ ivas_error MasaFileWriter_open( ); ivas_error MasaFileWriter_writeFrame( - MasaFileWriter *self, /* i/o: MasaFileWriter handle */ - IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */ + MasaFileWriter *self, /* i/o: MasaFileWriter handle */ + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ + const float *decDelay /* i : decoding audio delay */ ); void MasaFileWriter_close( diff --git a/lib_util/mime_io.c b/lib_util/mime_io.c index 2976e1895feea86a4a9d03cdca6571ee8ebd3d5a..3e837ca45df96aeaae64cd5f344f72578e048699 100644 --- a/lib_util/mime_io.c +++ b/lib_util/mime_io.c @@ -201,8 +201,8 @@ MIME_ERROR MIME_WriteFrame( { int16_t mode; int16_t cmi; - mode = rate2EVSmode_float( numBits * FRAMES_PER_SEC, &isAmrWb ); - cmi = rate2EVSmode_float( totalBrate, &isAmrWb ); + mode = rate2EVSmode( numBits * FRAMES_PER_SEC, &isAmrWb ); + cmi = rate2EVSmode( totalBrate, &isAmrWb ); ToC = (uint8_t) ( isAmrWb << 5 | isAmrWb << 4 | mode ); writeByte( hMIME->file, ToC ); @@ -317,7 +317,7 @@ static bool readByte( FILE *file, uint8_t *value ) static bool readLong( FILE *file, uint16_t *value ) { char buffer[4] = { 0 }; - if ( fread( buffer, 4, 1, file ) != 1U ) + if ( fread( buffer, 1, 4, file ) != 1U ) { return false; } diff --git a/lib_util/mutex.h b/lib_util/mutex.h new file mode 100644 index 0000000000000000000000000000000000000000..82094b61c823e909f22282f982413abe037489f6 --- /dev/null +++ b/lib_util/mutex.h @@ -0,0 +1,104 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef _MUTEX_H +#define _MUTEX_H + +#if defined( __unix__ ) || defined( __linux__ ) || ( defined( __MACH__ ) && defined( __APPLE__ ) ) +#include +typedef pthread_mutex_t mtx_t; +#define _USE_POSIX ( 1 ) +#elif defined( _WIN32 ) || defined( _WIN64 ) +#include +typedef CRITICAL_SECTION mtx_t; +#define _USE_WIN ( 1 ) +#else +typedef int mtx_t; +#warning Mutex implementation to be defined for this platform here. +#endif + +static __inline int mtx_init( mtx_t *mutex, int type ) +{ + int err = 0; + (void) type; +#ifdef _USE_POSIX + err = pthread_mutex_init( mutex, NULL ); +#elif defined( _USE_WIN ) + InitializeCriticalSection( mutex ); +#else + (void) mutex; +#endif + return err; +} + +static __inline void mtx_destroy( mtx_t *mutex ) +{ +#if _USE_POSIX + pthread_mutex_destroy( mutex ); +#elif defined( _USE_WIN ) + DeleteCriticalSection( mutex ); +#else + (void) mutex; +#endif +} + +static __inline int mtx_lock( mtx_t *mutex ) +{ + int err = 0; +#if _USE_POSIX + err = pthread_mutex_lock( mutex ); +#elif defined( _USE_WIN ) + EnterCriticalSection( mutex ); +#else + (void) mutex; +#endif + return err; +} + +static __inline int mtx_unlock( mtx_t *mutex ) +{ + int err = 0; +#if _USE_POSIX + err = pthread_mutex_unlock( mutex ); +#elif defined( _USE_WIN ) + LeaveCriticalSection( mutex ); +#else + (void) mutex; +#endif + return err; +} + +#endif /* _MUTEX_H */ diff --git a/lib_util/obj_edit_file_reader.c b/lib_util/obj_edit_file_reader.c new file mode 100644 index 0000000000000000000000000000000000000000..2d9a2fd6e084f7e07daa8feda60efe4bb8a4386b --- /dev/null +++ b/lib_util/obj_edit_file_reader.c @@ -0,0 +1,329 @@ +/****************************************************************************************************** + +(C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +contributors to this repository. All Rights Reserved. + +This software is protected by copyright law and by international treaties. +The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +contributors to this repository retain full ownership rights in their respective contributions in +the software. This notice grants no license of any kind, including but not limited to patent +license, nor is any license granted by implication, estoppel or otherwise. + +Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +contributions. + +This software is provided "AS IS", without any express or implied warranties. The software is in the +development stage. It is intended exclusively for experts who have experience with such software and +solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +and fitness for a particular purpose are hereby disclaimed and excluded. + +Any dispute, controversy or claim arising under or in relation to providing this software shall be +submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "obj_edit_file_reader.h" +#include "prot_fx.h" + + +/*-----------------------------------------------------------------------* + * ObjectEditFileReader_open() + * + * Allocate and initialize object editing reader + *-----------------------------------------------------------------------*/ + +ivas_error ObjectEditFileReader_open( + const char *fileName, /* i : path to object edit description file */ + ObjectEditFileReader **objEditReader /* o : ObjectEditFileReader handle */ +) +{ + ObjectEditFileReader *self; + FILE *fileHandle; + int16_t obj_idx; + + if ( fileName == NULL || objEditReader == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Open file */ + if ( strlen( fileName ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + fileHandle = fopen( fileName, "r" ); + + if ( !fileHandle ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + self = (ObjectEditFileReader *) calloc( 1, sizeof( ObjectEditFileReader ) ); + self->maxLineLen = 1024; + self->editFileHandle = fileHandle; + self->inLine = (char *) calloc( self->maxLineLen, sizeof( char ) ); + + self->readInfo = (ReadObjectEditInfo *) calloc( 1, sizeof( ReadObjectEditInfo ) ); + self->readInfo->bg_gain = 0.0f; + self->readInfo->bg_gain_edited = false; + + for ( obj_idx = 0; obj_idx < IVAS_MAX_NUM_OBJECTS; obj_idx++ ) + { + self->readInfo->obj_gain[obj_idx] = 0.0f; + self->readInfo->obj_gain_edited[obj_idx] = false; + self->readInfo->obj_gain_relative[obj_idx] = false; + self->readInfo->obj_azi[obj_idx] = 0.0f; + self->readInfo->obj_azi_edited[obj_idx] = false; + self->readInfo->obj_azi_relative[obj_idx] = false; + self->readInfo->obj_ele[obj_idx] = 0.0f; + self->readInfo->obj_ele_edited[obj_idx] = false; + self->readInfo->obj_ele_relative[obj_idx] = false; + self->readInfo->obj_radius[obj_idx] = 0.0f; + self->readInfo->obj_radius_edited[obj_idx] = false; + self->readInfo->obj_radius_relative[obj_idx] = false; + self->readInfo->obj_yaw[obj_idx] = 0.0f; + self->readInfo->obj_yaw_edited[obj_idx] = false; + self->readInfo->obj_yaw_relative[obj_idx] = false; + self->readInfo->obj_pitch[obj_idx] = 0.0f; + self->readInfo->obj_pitch_edited[obj_idx] = false; + self->readInfo->obj_pitch_relative[obj_idx] = false; + } + + self->rewound = false; + + *objEditReader = self; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * ObjectEditFileReader_readNextFrame() + * + * Read object editing parameters for current frame + *---------------------------------------------------------------------*/ + +ivas_error ObjectEditFileReader_readNextFrame( + ObjectEditFileReader *objEditReader /* i/o: ObjectEditFileReader handle */ +) +{ + if ( objEditReader == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( fgets( objEditReader->inLine, objEditReader->maxLineLen, objEditReader->editFileHandle ) != NULL ) + { + char *token; + char *paramName; + char *paramValue; + int16_t obj_idx; + ReadObjectEditInfo *readEdits; + + readEdits = objEditReader->readInfo; + + objEditReader->rewound = false; + + readEdits->bg_gain_edited = false; + for ( obj_idx = 0; obj_idx < IVAS_MAX_NUM_OBJECTS; obj_idx++ ) + { + readEdits->obj_gain_edited[obj_idx] = false; + readEdits->obj_gain_relative[obj_idx] = false; + readEdits->obj_azi_edited[obj_idx] = false; + readEdits->obj_azi_relative[obj_idx] = false; + readEdits->obj_ele_edited[obj_idx] = false; + readEdits->obj_ele_relative[obj_idx] = false; + readEdits->obj_radius_edited[obj_idx] = false; + readEdits->obj_radius_relative[obj_idx] = false; + readEdits->obj_yaw_edited[obj_idx] = false; + readEdits->obj_yaw_relative[obj_idx] = false; + readEdits->obj_pitch_edited[obj_idx] = false; + readEdits->obj_pitch_relative[obj_idx] = false; + } + + /* tokenize the line by comma */ + /* {bg_gain=}[,obj__=]*N[,obj__=<0|1>]*N, param in ('gain', 'azi', 'ele'), relparam in ('relgain', 'relazi', 'relele') */ + token = strtok( objEditReader->inLine, "," ); + while ( token != NULL ) + { + paramName = token; + paramValue = strchr( token, '=' ); + if ( paramValue != NULL ) + { + *paramValue = '\0'; /* temporarily terminate the string at the equal sign */ + paramValue++; /* move to the value part */ + } + + if ( strcmp( paramName, "bg_gain" ) == 0 ) + { + readEdits->bg_gain = max( min( strtof( paramValue, NULL ), OBJ_EDIT_GAIN_MAX ), OBJ_EDIT_GAIN_MIN ); + readEdits->bg_gain_edited = true; + } + else + { + if ( strncmp( paramName, "obj_", 4 ) == 0 ) + { + char *param; + char *underscore_pos; + + underscore_pos = strchr( paramName + 4, '_' ); + if ( underscore_pos != NULL ) + { + /* temporarily terminate the string at the second underscore */ + *underscore_pos = '\0'; + + /* extract object index */ + obj_idx = (int16_t) atoi( paramName + 4 ); /* skip "obj_" and convert to integer */ + + if ( ( obj_idx < 0 ) || ( obj_idx >= IVAS_MAX_NUM_OBJECTS ) ) + { + return IVAS_ERR_FAILED_FILE_PARSE; + } + + /* restore the underscore and extract parameter name */ + *underscore_pos = '_'; + param = underscore_pos + 1; + if ( strcmp( param, "gain" ) == 0 ) + { + readEdits->obj_gain[obj_idx] = strtof( paramValue, NULL ); + readEdits->obj_gain_edited[obj_idx] = true; + } + else if ( strcmp( param, "azi" ) == 0 ) + { + readEdits->obj_azi[obj_idx] = strtof( paramValue, NULL ); + readEdits->obj_azi_edited[obj_idx] = true; + } + else if ( strcmp( param, "ele" ) == 0 ) + { + readEdits->obj_ele[obj_idx] = strtof( paramValue, NULL ); + readEdits->obj_ele_edited[obj_idx] = true; + } + else if ( strcmp( param, "relgain" ) == 0 ) + { + readEdits->obj_gain_relative[obj_idx] = ( strcmp( paramValue, "1" ) == 0 ); + } + else if ( strcmp( param, "relazi" ) == 0 ) + { + readEdits->obj_azi_relative[obj_idx] = ( strcmp( paramValue, "1" ) == 0 ); + } + else if ( strcmp( param, "relele" ) == 0 ) + { + readEdits->obj_ele_relative[obj_idx] = ( strcmp( paramValue, "1" ) == 0 ); + } + else if ( strcmp( param, "radius" ) == 0 ) + { + readEdits->obj_radius[obj_idx] = strtof( paramValue, NULL ); + readEdits->obj_radius_edited[obj_idx] = true; + } + else if ( strcmp( param, "yaw" ) == 0 ) + { + readEdits->obj_yaw[obj_idx] = strtof( paramValue, NULL ); + readEdits->obj_yaw_edited[obj_idx] = true; + } + else if ( strcmp( param, "pitch" ) == 0 ) + { + readEdits->obj_pitch[obj_idx] = strtof( paramValue, NULL ); + readEdits->obj_pitch_edited[obj_idx] = true; + } + else if ( strcmp( param, "relradius" ) == 0 ) + { + readEdits->obj_radius_relative[obj_idx] = ( strcmp( paramValue, "1" ) == 0 ); + } + else if ( strcmp( param, "relyaw" ) == 0 ) + { + readEdits->obj_yaw_relative[obj_idx] = ( strcmp( paramValue, "1" ) == 0 ); + } + else if ( strcmp( param, "relpitch" ) == 0 ) + { + readEdits->obj_pitch_relative[obj_idx] = ( strcmp( paramValue, "1" ) == 0 ); + } + } + } + } + + /* get the next token */ + token = strtok( NULL, "," ); + } + + /* sanitize values for absolute edits. relative edit sanitation done on result when applying the delta */ + for ( obj_idx = 0; obj_idx < IVAS_MAX_NUM_OBJECTS; obj_idx++ ) + { + if ( readEdits->obj_gain_edited[obj_idx] && !readEdits->obj_gain_relative[obj_idx] ) + { + readEdits->obj_gain[obj_idx] = max( min( readEdits->obj_gain[obj_idx], OBJ_EDIT_GAIN_MAX ), OBJ_EDIT_GAIN_MIN ); + } + if ( readEdits->obj_azi_edited[obj_idx] && !readEdits->obj_azi_relative[obj_idx] ) + { + readEdits->obj_azi[obj_idx] = max( min( readEdits->obj_azi[obj_idx], 180.f ), -180.f ); + } + if ( readEdits->obj_ele_edited[obj_idx] && !readEdits->obj_ele_relative[obj_idx] ) + { + readEdits->obj_ele[obj_idx] = max( min( readEdits->obj_ele[obj_idx], 90.f ), -90.f ); + } + if ( readEdits->obj_radius_edited[obj_idx] && !readEdits->obj_radius_relative[obj_idx] ) + { + readEdits->obj_radius[obj_idx] = max( min( readEdits->obj_radius[obj_idx], OBJ_EDIT_RADIUS_MAX ), 0.0f ); + } + if ( readEdits->obj_yaw_edited[obj_idx] && !readEdits->obj_yaw_relative[obj_idx] ) + { + readEdits->obj_yaw[obj_idx] = max( min( readEdits->obj_yaw[obj_idx], 180.f ), -180.f ); + } + if ( readEdits->obj_pitch_edited[obj_idx] && !readEdits->obj_pitch_relative[obj_idx] ) + { + readEdits->obj_pitch[obj_idx] = max( min( readEdits->obj_pitch[obj_idx], 90.f ), -90.f ); + } + } + } + else + { + if ( !objEditReader->rewound ) + { + /* rewind file and try to read again */ + rewind( objEditReader->editFileHandle ); + objEditReader->rewound = true; + ObjectEditFileReader_readNextFrame( objEditReader ); + } + else + { + /* was already rewound and still failing to read */ + return IVAS_ERR_FAILED_FILE_READ; + } + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ObjectEditFileReader_close() + * + * Deallocates memory for the object edit file reader + *-----------------------------------------------------------------------*/ + +void ObjectEditFileReader_close( + ObjectEditFileReader **objEditReader /* i/o: ObjectEditFileReader handle */ +) +{ + if ( objEditReader == NULL || *objEditReader == NULL ) + { + return; + } + + fclose( ( *objEditReader )->editFileHandle ); + free( ( *objEditReader )->readInfo ); + free( *objEditReader ); + *objEditReader = NULL; + + return; +} diff --git a/lib_util/obj_edit_file_reader.h b/lib_util/obj_edit_file_reader.h new file mode 100644 index 0000000000000000000000000000000000000000..016425c2ec704caf45dfe0a794ec49291cd77f57 --- /dev/null +++ b/lib_util/obj_edit_file_reader.h @@ -0,0 +1,128 @@ +/****************************************************************************************************** + +(C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +contributors to this repository. All Rights Reserved. + +This software is protected by copyright law and by international treaties. +The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +contributors to this repository retain full ownership rights in their respective contributions in +the software. This notice grants no license of any kind, including but not limited to patent +license, nor is any license granted by implication, estoppel or otherwise. + +Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +contributions. + +This software is provided "AS IS", without any express or implied warranties. The software is in the +development stage. It is intended exclusively for experts who have experience with such software and +solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +and fitness for a particular purpose are hereby disclaimed and excluded. + +Any dispute, controversy or claim arising under or in relation to providing this software shall be +submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef OBJ_EDIT_FILE_READER_H +#define OBJ_EDIT_FILE_READER_H + +#include +#include "common_api_types.h" + + +/*---------------------------------------------------------------------* + * Constants ans structures + *---------------------------------------------------------------------*/ + +#define OBJ_EDIT_GAIN_MIN_FX 0 /* Q29, 0.0f, -inf dB */ +#define OBJ_EDIT_GAIN_MAX_FX 2137321728 /* Q29, 3.9810719f, +12 dB */ +#define OBJ_EDIT_GAIN_MIN 0.0f /* -inf dB */ +#define OBJ_EDIT_GAIN_MAX 3.9810719f /* +12 dB */ + +#define OBJ_EDIT_RADIUS_MAX 15.75f /* Max radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */ +#define OBJ_EDIT_RADIUS_MAX_FX 8064 /* Q9, 15.75f (15.75 * 512 = 8064) */ +#define OBJ_EDIT_RADIUS_MIN_FX 0 + +typedef struct ObjectEditFileReader ObjectEditFileReader; +typedef struct ReadObjectEditInfo ReadObjectEditInfo; + +struct ReadObjectEditInfo +{ + float bg_gain; + bool bg_gain_edited; + + float obj_gain[IVAS_MAX_NUM_OBJECTS]; + bool obj_gain_edited[IVAS_MAX_NUM_OBJECTS]; + bool obj_gain_relative[IVAS_MAX_NUM_OBJECTS]; + + float obj_azi[IVAS_MAX_NUM_OBJECTS]; + bool obj_azi_edited[IVAS_MAX_NUM_OBJECTS]; + bool obj_azi_relative[IVAS_MAX_NUM_OBJECTS]; + + float obj_ele[IVAS_MAX_NUM_OBJECTS]; + bool obj_ele_edited[IVAS_MAX_NUM_OBJECTS]; + bool obj_ele_relative[IVAS_MAX_NUM_OBJECTS]; + + float obj_radius[IVAS_MAX_NUM_OBJECTS]; + bool obj_radius_edited[IVAS_MAX_NUM_OBJECTS]; + bool obj_radius_relative[IVAS_MAX_NUM_OBJECTS]; + + float obj_yaw[IVAS_MAX_NUM_OBJECTS]; + bool obj_yaw_edited[IVAS_MAX_NUM_OBJECTS]; + bool obj_yaw_relative[IVAS_MAX_NUM_OBJECTS]; + + float obj_pitch[IVAS_MAX_NUM_OBJECTS]; + bool obj_pitch_edited[IVAS_MAX_NUM_OBJECTS]; + bool obj_pitch_relative[IVAS_MAX_NUM_OBJECTS]; +}; + +struct ObjectEditFileReader +{ + FILE *editFileHandle; /* handle to the opened editing info file */ + int16_t maxLineLen; /* constant: max line length to read as once */ + char *inLine; /* working buffer for read input line */ + bool rewound; /* flag to note if file was restarted */ + ReadObjectEditInfo *readInfo; /* edit instructions read from the file */ +}; + +/*---------------------------------------------------------------------* + * ObjectEditFileReader_open() + * + * Allocate the ObjectEditFileReader. + *---------------------------------------------------------------------*/ + +/*! r: ObjectEditFileReader handle */ +ivas_error ObjectEditFileReader_open( + const char *fileName, /* i : path to object edit description file */ + ObjectEditFileReader **objEditReader /* o : ObjectEditFileReader handle */ +); + +/*---------------------------------------------------------------------* + * ObjectEditFileReader_readNextFrame() + * + * Read object editing parameters for current frame + *---------------------------------------------------------------------*/ + +/*! r: error code */ +ivas_error ObjectEditFileReader_readNextFrame( + ObjectEditFileReader *objEditReader /* i/o: ObjectEditFileReader handle */ +); + +/*---------------------------------------------------------------------* + * ObjectEditFileReader_close() + * + * Deallocate the ObjectEditFileReader. + *---------------------------------------------------------------------*/ + +void ObjectEditFileReader_close( + ObjectEditFileReader **objEditReader /* i/o: pointer to ObjectEditFileReader handle */ +); + +#endif /* OBJ_EDIT_FILE_READER_H */ diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index e099842be2f9c47fb3bbab69ec160c15e590a2a9..111f8d978f503cee19d67e0faf3a126dcd19876c 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -38,7 +38,7 @@ #include #include "cmdl_tools.h" #include "prot_fx.h" - +#include "ivas_cnst.h" /*------------------------------------------------------------------------------------------* * PreProc Local Macros @@ -59,9 +59,9 @@ #define ACOUSTIC_DSR_EPSILON ( 1.0e-15f ) #define ACOUSTIC_DSR_EPSILON_FX ( 1 ) #define ACOUSTICPREDELAY_JOTREV_MIN ( SHORTEST_REV_DEL_LINE ) -#define ACOUSTICPREDELAY_JOTREV_MAX ( SHORTEST_REV_DEL_LINE + 1.0f / (float) FRAMES_PER_SEC ) -#define ACOUSTICPREDELAY_FDREV_MIN ( 1.0f / (float) ( 16 * FRAMES_PER_SEC ) ) -#define ACOUSTICPREDELAY_FDREV_MAX ( (float) ( REVERB_PREDELAY_MAX ) / (float) ( 16 * FRAMES_PER_SEC ) ) +#define ACOUSTICPREDELAY_JOTREV_MAX ( SHORTEST_REV_DEL_LINE + 1.0f / (float) IVAS_NUM_FRAMES_PER_SEC ) +#define ACOUSTICPREDELAY_FDREV_MIN ( 1.0f / (float) ( 16 * IVAS_NUM_FRAMES_PER_SEC ) ) +#define ACOUSTICPREDELAY_FDREV_MAX ( (float) ( IVAS_REVERB_PREDELAY_MAX ) / (float) ( 16 * IVAS_NUM_FRAMES_PER_SEC ) ) #define INPUTPREDELAY_MIN ( 0.0f ) #define INPUTPREDELAY_MAX ( 1.0e+2f ) @@ -74,6 +74,27 @@ #define ER_MAX_ABS_COEFF ( 1.0f ) #define ER_MAX_ABS_COEFF_FX ( 1073741824 ) +#define IVAS_ER_LIST_ORIGIN_X 0.0f +#define IVAS_ER_LIST_ORIGIN_Y 0.0f +#define IVAS_ER_LIST_ORIGIN_X_FX 0 +#define IVAS_ER_LIST_ORIGIN_Y_FX 0 + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef min +#define min( x, y ) ( ( x ) < ( y ) ? ( x ) : ( y ) ) +#endif + +#ifndef max +#define max( x, y ) ( ( x ) > ( y ) ? ( x ) : ( y ) ) +#endif + + /*------------------------------------------------------------------------------------------* * Local Type definitions *------------------------------------------------------------------------------------------*/ @@ -129,6 +150,7 @@ struct RenderConfigReader AcousticEnv *pAE; /* Acoustic environments */ uint32_t nDP; /* Number of directivity patterns */ DirectrivityPat *pDP; /* Directivity Pattern */ + float distAtt[3]; /* [MaxDist Q30, RefDist Q30, Rolloff Q30] */ }; @@ -413,10 +435,12 @@ const float defaultFrequencyGrid_8[] = { 5800.0f, 7000.0f, 8500.0f, 10500.0f, 13500.0f }; + /*-----------------------------------------------------------------------------------------* * Function read_bin_bits() * Reads a given number of bits from the bitstream *-----------------------------------------------------------------------------------------*/ + static ivas_error read_bin_bits( RenderConfigReader *this, /* i/o : Renderer config reader handle */ uint32_t *pTarget, /* o : Target read data pointer */ @@ -440,7 +464,7 @@ static ivas_error read_bin_bits( *pTarget = 0; for ( n = 0; n < nBits; n++ ) { - nByte = ( this->readOffset + n ) >> 3; + nByte = (uint32_t) ( ( this->readOffset + n ) >> 3 ); bit = this->pBitstream[nByte] >> ( 7 - ( ( this->readOffset + n ) % 8 ) ) & 1; *pTarget = ( *pTarget << 1 ) + bit; } @@ -450,10 +474,12 @@ static ivas_error read_bin_bits( return IVAS_ERR_OK; } + /*-----------------------------------------------------------------------------------------* * Function read_bin_bool() * Reads a boolean value from a bitstream *-----------------------------------------------------------------------------------------*/ + static ivas_error read_bin_bool( RenderConfigReader *this, /* i/o : Renderer config reader handle */ uint32_t *pResult /* o : Target read data pointer */ @@ -462,10 +488,12 @@ static ivas_error read_bin_bool( return read_bin_bits( this, pResult, 1 ); } + /*-----------------------------------------------------------------------------------------* * Function get_bin_id() * Reads an ID from a bitstream *-----------------------------------------------------------------------------------------*/ + static ivas_error get_bin_id( RenderConfigReader *this, /* i/o : Renderer config reader handle */ uint32_t *pResult /* o : Target read data pointer */ @@ -501,10 +529,12 @@ static ivas_error get_bin_id( return IVAS_ERR_OK; } + /*-----------------------------------------------------------------------------------------* * Function read_bin_code_word() * Reads a code word from a LUT *-----------------------------------------------------------------------------------------*/ + static ivas_error read_bin_code_word( RenderConfigReader *this, /* i/o : Renderer config reader handle */ const RC_LUT table, /* i : Table enum */ @@ -657,6 +687,7 @@ static ivas_error read_bin_code_word( * Function get_bin_count_or_index() * Gets a count or index *-----------------------------------------------------------------------------------------*/ + static ivas_error get_bin_count_or_index( RenderConfigReader *this, /* i/o : Renderer config reader handle */ uint32_t *pResult /* o : Count or index value */ @@ -694,10 +725,12 @@ static ivas_error get_bin_count_or_index( return IVAS_ERR_OK; } + /*-----------------------------------------------------------------------------------------* * Function get_bin_duration() * Gets a duration value *-----------------------------------------------------------------------------------------*/ + static ivas_error get_bin_duration( RenderConfigReader *this, /* i/o : Renderer config reader handle */ float *pResult /* o : Duration value */ @@ -765,10 +798,12 @@ static ivas_error get_bin_duration( return IVAS_ERR_OK; } + /*-----------------------------------------------------------------------------------------* * Function get_bin_frequency() * Gets a frequency value *-----------------------------------------------------------------------------------------*/ + static ivas_error get_bin_frequency( RenderConfigReader *this, /* i/o : Renderer config reader handle */ float *pResult /* o : Frequency value */ @@ -803,10 +838,12 @@ static ivas_error get_bin_frequency( return IVAS_ERR_OK; } + /*-----------------------------------------------------------------------------------------* * Function get_bin_dsr() * Gets a DSR value *-----------------------------------------------------------------------------------------*/ + static ivas_error get_bin_dsr( RenderConfigReader *this, /* i/o : Renderer config reader handle */ float *pResult /* o : DSR value */ @@ -903,6 +940,7 @@ static ivas_error get_bin_distance( return IVAS_ERR_OK; } + /*-----------------------------------------------------------------------------------------* * Function get_bin_absorption() * Gets an absorption value @@ -923,10 +961,12 @@ static ivas_error get_bin_absorption( return IVAS_ERR_OK; } + /*-----------------------------------------------------------------------------------------* * Function read_txt_bool() * Reads a boolean value from a line *-----------------------------------------------------------------------------------------*/ + static ivas_error read_txt_bool( const char *pLine, /* i : String to read from */ uint32_t *pTarget /* o : Output pointer */ @@ -949,8 +989,31 @@ static ivas_error read_txt_bool( *pTarget = FALSE; return IVAS_ERR_OK; } + return IVAS_ERR_INVALID_RENDER_CONFIG; } + + +/*-------------------------------------------------------------------* + * usdequant_rend_cfg() + * + * Uniform scalar de-quantizer routine + *-------------------------------------------------------------------*/ + +static float usdequant_rend_cfg( + const uint32_t idx, /* i : quantizer index */ + const float qlow, /* i : lowest codebook entry (index 0) */ + const float delta /* i : quantization step */ +) +{ + float g; + + g = idx * delta + qlow; + + return ( g ); +} + + /*-----------------------------------------------------------------------------------------* * Function get_bin_angle() * Gets an angle value in degrees [0,360] @@ -969,11 +1032,12 @@ static ivas_error get_bin_angle( return error; } - *pResult = usdequant( (int16_t) value, 0.0f, 20.0f ); + *pResult = usdequant_rend_cfg( value, 0.0f, 20.0f ); return IVAS_ERR_OK; } + /*-----------------------------------------------------------------------------------------* * Function get_bin_outer_attenuation () * Gets an outer attenuation value [3.1623e-05,1.0], or in dB: [-90,0] @@ -993,7 +1057,7 @@ static ivas_error get_bin_outer_attenuation( return error; } - logval = usdequant( (int16_t) value, -90.0f, 3.0f ); + logval = usdequant_rend_cfg( value, -90.0f, 3.0f ); att = powf( 10, logval / 20.0f ); *pResult = att; @@ -1002,6 +1066,78 @@ static ivas_error get_bin_outer_attenuation( } +/*-----------------------------------------------------------------------------------------* + * Function get_bin_max_dist () + * Gets a Maximum Distance value [1.0, 64.0] + *-----------------------------------------------------------------------------------------*/ + +static ivas_error get_bin_max_dist( + RenderConfigReader *this, /* i/o : Render config reader handle */ + float *pResult /* o : Attenuation value */ +) +{ + ivas_error error; + uint32_t value; + + if ( ( error = read_bin_bits( this, &value, 6 ) ) != IVAS_ERR_OK ) + { + return error; + } + + *pResult = usdequant_rend_cfg( value, 1.0f, 1.0f ); + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function get_bin_ref_dist () + * Gets a Reference Distance value [0.1, 6.4] + *-----------------------------------------------------------------------------------------*/ + +static ivas_error get_bin_ref_dist( + RenderConfigReader *this, /* i/o : Render config reader handle */ + float *pResult /* o : Attenuation value */ +) +{ + ivas_error error; + uint32_t value; + + if ( ( error = read_bin_bits( this, &value, 6 ) ) != IVAS_ERR_OK ) + { + return error; + } + + *pResult = usdequant_rend_cfg( value, 0.1f, 0.1f ); + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function get_bin_rolloff () + * Gets a Rollof Factor [0.0, 4.0] + *-----------------------------------------------------------------------------------------*/ + +static ivas_error get_bin_rolloff( + RenderConfigReader *this, /* i/o : Render config reader handle */ + float *pResult /* o : Attenuation value */ +) +{ + ivas_error error; + uint32_t value; + + if ( ( error = read_bin_bits( this, &value, 6 ) ) != IVAS_ERR_OK ) + { + return error; + } + + *pResult = usdequant_rend_cfg( value, 0.0f, 0.1f ); + + return IVAS_ERR_OK; +} + + /*-----------------------------------------------------------------------------------------* * Function read_txt_vector() * @@ -1055,6 +1191,7 @@ static int16_t read_txt_vector( return false; } + /*-----------------------------------------------------------------------------------------* * Function strip_spaces() * @@ -1069,7 +1206,7 @@ static void strip_spaces( while ( pStr[read_idx] ) { - if ( !isspace( pStr[read_idx] ) && !iscntrl( pStr[read_idx] ) ) + if ( !isspace( (int32_t) pStr[read_idx] ) && !iscntrl( (int32_t) pStr[read_idx] ) ) { pStr[write_idx++] = pStr[read_idx]; } @@ -1128,7 +1265,9 @@ ivas_error RenderConfigReader_checkValues( pRoom_acoustics = &hRenderConfig->roomAcoustics; tab_value_err_count = 0; int16_t wall_idx; - +#ifndef FIX_1999_TEMPORARY_DISABLE_DIST_ATT_CHECK + int16_t i; +#endif /* Verify the number of frequency bands in the config input data */ if ( ( pRoom_acoustics->nBands > N_BANDS_MAX ) || ( pRoom_acoustics->nBands < N_BANDS_MIN ) ) @@ -1136,46 +1275,21 @@ ivas_error RenderConfigReader_checkValues( return IVAS_ERR_WRONG_PARAMS; } - /* Verify input pre-delay value */ - if ( ( pRoom_acoustics->inputPreDelay > INPUTPREDELAY_MAX ) || ( pRoom_acoustics->inputPreDelay < INPUTPREDELAY_MIN ) ) - { - return IVAS_ERR_WRONG_PARAMS; - } - /* Verify data per band in the acoustic properties table */ for ( band_idx = 0; band_idx < pRoom_acoustics->nBands; band_idx++ ) { /* Verify if the frequencies are in the ascending order (required for interpolation) */ if ( band_idx != 0 ) { - if ( pRoom_acoustics->pFc_input[band_idx] <= pRoom_acoustics->pFc_input[band_idx - 1] ) + if ( pRoom_acoustics->pFc_input_fx[band_idx] <= pRoom_acoustics->pFc_input_fx[band_idx - 1] ) { tab_value_err_count++; } } - /* Check the input frequencies */ - if ( ( pRoom_acoustics->pFc_input[band_idx] > FC_INPUT_MAX ) || ( pRoom_acoustics->pFc_input[band_idx] < FC_INPUT_MIN ) ) - { - tab_value_err_count++; - } - - /* Check the input RT60 values */ - if ( ( pRoom_acoustics->pAcoustic_rt60[band_idx] > ACOUSTIC_RT60_MAX ) || ( pRoom_acoustics->pAcoustic_rt60[band_idx] < ACOUSTIC_RT60_MIN ) ) - { - tab_value_err_count++; - } - - /* Check the input DSR values */ - if ( ( pRoom_acoustics->pAcoustic_dsr[band_idx] > ACOUSTIC_DSR_MAX ) || ( pRoom_acoustics->pAcoustic_dsr[band_idx] < ACOUSTIC_DSR_MIN ) ) - { - tab_value_err_count++; - } - /* Replace zero DSR values with very small positive values, to avoid issues with coloration filter design */ - if ( pRoom_acoustics->pAcoustic_dsr[band_idx] <= 0.0f ) + if ( pRoom_acoustics->pAcoustic_dsr_fx[band_idx] == 0 ) { - pRoom_acoustics->pAcoustic_dsr[band_idx] = ACOUSTIC_DSR_EPSILON; pRoom_acoustics->pAcoustic_dsr_fx[band_idx] = ACOUSTIC_DSR_EPSILON_FX; } } @@ -1189,51 +1303,58 @@ ivas_error RenderConfigReader_checkValues( if ( pRoom_acoustics->use_er == 1 ) { /* Room dimensions */ - if ( pRoom_acoustics->dimensions.x < ER_MIN_ROOM_DIMENSION ) + if ( pRoom_acoustics->dimensions.x_fx < ER_MIN_ROOM_DIMENSION_FX ) { - pRoom_acoustics->dimensions.x = ER_MIN_ROOM_DIMENSION; pRoom_acoustics->dimensions.x_fx = ER_MIN_ROOM_DIMENSION_FX; } - if ( pRoom_acoustics->dimensions.x > ER_MAX_ROOM_DIMENSION ) + if ( pRoom_acoustics->dimensions.x_fx > ER_MAX_ROOM_DIMENSION_FX ) { - pRoom_acoustics->dimensions.x = ER_MAX_ROOM_DIMENSION; pRoom_acoustics->dimensions.x_fx = ER_MAX_ROOM_DIMENSION_FX; } - if ( pRoom_acoustics->dimensions.y < ER_MIN_ROOM_DIMENSION ) + if ( pRoom_acoustics->dimensions.y_fx < ER_MIN_ROOM_DIMENSION_FX ) { - pRoom_acoustics->dimensions.y = ER_MIN_ROOM_DIMENSION; pRoom_acoustics->dimensions.y_fx = ER_MIN_ROOM_DIMENSION_FX; } - if ( pRoom_acoustics->dimensions.y > ER_MAX_ROOM_DIMENSION ) + if ( pRoom_acoustics->dimensions.y_fx > ER_MAX_ROOM_DIMENSION_FX ) { - pRoom_acoustics->dimensions.y = ER_MAX_ROOM_DIMENSION; pRoom_acoustics->dimensions.y_fx = ER_MAX_ROOM_DIMENSION_FX; } - if ( pRoom_acoustics->dimensions.z < ER_MIN_ROOM_DIMENSION ) + if ( pRoom_acoustics->dimensions.z_fx < ER_MIN_ROOM_DIMENSION_FX ) { - pRoom_acoustics->dimensions.z = ER_MIN_ROOM_DIMENSION; pRoom_acoustics->dimensions.z_fx = ER_MIN_ROOM_DIMENSION_FX; } - if ( pRoom_acoustics->dimensions.z > ER_MAX_ROOM_DIMENSION ) + if ( pRoom_acoustics->dimensions.z_fx > ER_MAX_ROOM_DIMENSION_FX ) { - pRoom_acoustics->dimensions.z = ER_MAX_ROOM_DIMENSION; pRoom_acoustics->dimensions.z_fx = ER_MAX_ROOM_DIMENSION_FX; } /* Abs Coeff */ for ( wall_idx = 0; wall_idx < IVAS_ROOM_ABS_COEFF; wall_idx++ ) { - if ( pRoom_acoustics->AbsCoeff[wall_idx] < ER_MIN_ABS_COEFF ) + if ( pRoom_acoustics->AbsCoeff_fx[wall_idx] < ER_MIN_ABS_COEFF_FX ) { - pRoom_acoustics->AbsCoeff[wall_idx] = ER_MIN_ABS_COEFF; pRoom_acoustics->AbsCoeff_fx[wall_idx] = ER_MIN_ABS_COEFF_FX; } - if ( pRoom_acoustics->AbsCoeff[wall_idx] > ER_MAX_ABS_COEFF ) + if ( pRoom_acoustics->AbsCoeff_fx[wall_idx] > ER_MAX_ABS_COEFF_FX ) { - pRoom_acoustics->AbsCoeff[wall_idx] = ER_MAX_ABS_COEFF; pRoom_acoustics->AbsCoeff_fx[wall_idx] = ER_MAX_ABS_COEFF_FX; } } +#ifndef FIX_1999_TEMPORARY_DISABLE_DIST_ATT_CHECK + /* Verify range of distance attenuation parameters: 0.1 <= distAtt[0] <= distAtt[1] */ + /* 0.0 <= distAtt[2] <= 10.0 */ + hRenderConfig->distAtt[0] = max( 0.1f, hRenderConfig->distAtt[0] ); + hRenderConfig->distAtt[1] = max( hRenderConfig->distAtt[0], hRenderConfig->distAtt[1] ); + hRenderConfig->distAtt[2] = max( 0.0f, min( 10.0f, hRenderConfig->distAtt[2] ) ); + + /* Verify range of directivity patterns */ + for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; i++ ) + { + hRenderConfig->directivity[i * 3] = max( 0.0f, min( 360.0f, hRenderConfig->directivity[i * 3] ) ); + hRenderConfig->directivity[i * 3 + 1] = max( 0.0f, min( 360.0f, hRenderConfig->directivity[i * 3 + 1] ) ); + hRenderConfig->directivity[i * 3 + 2] = max( 0.0f, min( 1.0f, hRenderConfig->directivity[i * 3 + 2] ) ); + } +#endif } @@ -1267,7 +1388,7 @@ ivas_error RenderConfigReader_open( return IVAS_ERR_FAILED_FILE_OPEN; } - pSelf = calloc( sizeof( RenderConfigReader ), 1 ); + pSelf = calloc( 1, sizeof( RenderConfigReader ) ); pSelf->pConfigFile = pConfigFile; pSelf->nFG = 0; pSelf->pFG = NULL; @@ -1275,6 +1396,7 @@ ivas_error RenderConfigReader_open( pSelf->pAE = NULL; pSelf->nDP = 0; pSelf->pDP = NULL; + pSelf->distAtt[0] = -1; *ppRenderConfigReader = pSelf; return IVAS_ERR_OK; @@ -1713,9 +1835,9 @@ static ivas_error RenderConfigReader_readBinary( { return IVAS_ERR_FAILED_ALLOC; } - pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->x = ER_LIST_ORIGIN_X; - pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->y = ER_LIST_ORIGIN_Y; - pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->z = ER_LIST_HEIGHT; + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->x = IVAS_ER_LIST_ORIGIN_X; + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->y = IVAS_ER_LIST_ORIGIN_Y; + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->z = IVAS_ER_LIST_HEIGHT; } /* Low complexity mode */ @@ -1794,6 +1916,34 @@ static ivas_error RenderConfigReader_readBinary( } } } + /**********************************/ + /* Read the distance attenuation */ + /**********************************/ + + /* Has distance attenuation */ + if ( ( error = read_bin_bool( pRenderConfigReader, &value ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( value == true ) + { + /* Read the Max Distance */ + if ( ( error = get_bin_max_dist( pRenderConfigReader, &pRenderConfigReader->distAtt[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + /* Read the Ref Distance */ + if ( ( error = get_bin_ref_dist( pRenderConfigReader, &pRenderConfigReader->distAtt[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + /* Read the Rolloff Facto r*/ + if ( ( error = get_bin_rolloff( pRenderConfigReader, &pRenderConfigReader->distAtt[2] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + /* Cleanup */ free( pRenderConfigReader->pBitstream ); @@ -1833,6 +1983,8 @@ ivas_error RenderConfigReader_read( uint32_t fgHasMethod, fgHasNBands, fgHasFreqs, fgHasDefaultGrid, fgHasStartFreq, fgHasFreqHop; uint32_t aeHasFgIdx, aeHasPredelay, aeHasRt60, aeHasDsr; uint32_t aeHasERsize, aeHasERabs; + bool dofProvided = false; + bool poseCorrProvided = false; uint32_t nDP; uint32_t accDPIdx; @@ -2185,7 +2337,7 @@ ivas_error RenderConfigReader_read( return IVAS_ERR_INVALID_RENDER_CONFIG; } idx = strtol( strtok( NULL, ":" ), NULL, 0 ); - pRenderConfigReader->pAE->id = idx; + pRenderConfigReader->pAE[acIdx].id = idx; aeHasFgIdx = aeHasPredelay = aeHasRt60 = aeHasDsr = FALSE; aeHasERsize = aeHasERabs = FALSE; @@ -2202,7 +2354,7 @@ ivas_error RenderConfigReader_read( errorHandler( item, ERROR_VALUE_INVALID ); return IVAS_ERR_INVALID_RENDER_CONFIG; } - if ( i > pRenderConfigReader->nFG || &pRenderConfigReader->pFG[i] == NULL ) + if ( i >= pRenderConfigReader->nFG || pRenderConfigReader->pFG[i].pFc == NULL ) { return IVAS_ERR_INVALID_RENDER_CONFIG; } @@ -2224,11 +2376,12 @@ ivas_error RenderConfigReader_read( /* Acoustic pre-delay */ else if ( strcmp( item, "ACOUSTICPREDELAY" ) == 0 ) { - if ( !sscanf( pValue, "%f", &hRenderConfig->roomAcoustics.acousticPreDelay ) ) + float f; + if ( !sscanf( pValue, "%f", &f ) ) { errorHandler( item, ERROR_VALUE_INVALID ); } - hRenderConfig->roomAcoustics.acousticPreDelay_fx = (Word32) ( hRenderConfig->roomAcoustics.acousticPreDelay * ONE_IN_Q27 ); + hRenderConfig->roomAcoustics.acousticPreDelay_fx = (Word32) ( f * ONE_IN_Q27 ); } /* Pre-delay */ else if ( strcmp( item, "PREDELAY" ) == 0 ) @@ -2243,7 +2396,7 @@ ivas_error RenderConfigReader_read( /* RT60 */ else if ( strcmp( item, "RT60" ) == 0 ) { - if ( read_txt_vector( pValue, pRenderConfigReader->pFG[idx].nrBands, pRenderConfigReader->pAE[acIdx].pRT60 ) ) + if ( read_txt_vector( pValue, pRenderConfigReader->pAE[acIdx].pFG->nrBands, pRenderConfigReader->pAE[acIdx].pRT60 ) ) { errorHandler( item, ERROR_VALUE_INVALID ); return IVAS_ERR_INVALID_RENDER_CONFIG; @@ -2253,7 +2406,7 @@ ivas_error RenderConfigReader_read( /* DSR */ else if ( strcmp( item, "DSR" ) == 0 ) { - if ( read_txt_vector( pValue, pRenderConfigReader->pFG[idx].nrBands, pRenderConfigReader->pAE[acIdx].pDSR ) ) + if ( read_txt_vector( pValue, pRenderConfigReader->pAE[acIdx].pFG->nrBands, pRenderConfigReader->pAE[acIdx].pDSR ) ) { errorHandler( item, ERROR_VALUE_INVALID ); return IVAS_ERR_INVALID_RENDER_CONFIG; @@ -2349,7 +2502,138 @@ ivas_error RenderConfigReader_read( free( pValue ); acIdx++; } - + else if ( strcmp( chapter, "SPLITREND" ) == 0 && strlen( pParams ) != 0 ) + { + params_idx = 0; + pValue = (char *) calloc( strlen( pParams ), sizeof( char ) ); + while ( sscanf( pParams + params_idx, "%64[^=]=%[^;];", item, pValue ) == 2 ) + { + params_idx += (int32_t) ( strlen( item ) + strlen( pValue ) + 2 ); +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG + fprintf( stderr, " PARAM: %s -> %s\n", item, pValue ); +#endif + if ( strcmp( item, "CODECDELAY" ) == 0 ) + { + if ( !sscanf( pValue, "%hd", &hRenderConfig->split_rend_config.codec_delay_ms ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + } + } + else if ( strcmp( item, "HQMODE" ) == 0 ) + { + if ( !sscanf( pValue, "%hd", &hRenderConfig->split_rend_config.hq_mode ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + } + } + else if ( strcmp( item, "BITRATE" ) == 0 ) + { + if ( !sscanf( pValue, "%d", &hRenderConfig->split_rend_config.splitRendBitRate ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + } + } + else if ( strcmp( item, "DOF" ) == 0 ) + { + dofProvided = true; + if ( !sscanf( pValue, "%hd", &hRenderConfig->split_rend_config.dof ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + } + /* 0 DOF implies no pose correction */ + if ( hRenderConfig->split_rend_config.dof == 0 && !poseCorrProvided ) + { + hRenderConfig->split_rend_config.poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE; + } + } + else if ( strcmp( item, "CODEC" ) == 0 ) + { + if ( strcmp( pValue, "LCLD" ) == 0 ) + { + hRenderConfig->split_rend_config.codec = ISAR_SPLIT_REND_CODEC_LCLD; + } + else if ( strcmp( pValue, "LC3PLUS" ) == 0 ) + { + hRenderConfig->split_rend_config.codec = ISAR_SPLIT_REND_CODEC_LC3PLUS; + } + else + { + errorHandler( pValue, ERROR_VALUE_INVALID ); + } + } + else if ( strcmp( item, "FRAMESIZE" ) == 0 ) + { + if ( !sscanf( pValue, "%hd", &hRenderConfig->split_rend_config.codec_frame_size_ms ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + } + if ( hRenderConfig->split_rend_config.codec_frame_size_ms != 5 && + hRenderConfig->split_rend_config.codec_frame_size_ms != 10 && + hRenderConfig->split_rend_config.codec_frame_size_ms != 20 ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + } + } + else if ( strcmp( item, "POSECORRECTION" ) == 0 ) + { + poseCorrProvided = true; + if ( strcmp( pValue, "CLDFB" ) == 0 ) + { + hRenderConfig->split_rend_config.poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB; + } + else if ( strcmp( pValue, "NONE" ) == 0 ) + { + hRenderConfig->split_rend_config.poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE; + /* no pose correction implies 0 DOF */ + if ( !dofProvided ) + { + hRenderConfig->split_rend_config.dof = 0; + } + } + else + { + errorHandler( pValue, ERROR_VALUE_INVALID ); + } + } + else if ( strcmp( item, "RENDERER" ) == 0 ) + { + if ( strcmp( pValue, "CREND" ) == 0 ) + { + hRenderConfig->split_rend_config.rendererSelection = IVAS_BIN_RENDERER_TYPE_CREND; + } + else if ( strcmp( pValue, "FASTCONV" ) == 0 ) + { + hRenderConfig->split_rend_config.rendererSelection = IVAS_BIN_RENDERER_TYPE_FASTCONV; + } + else if ( strcmp( pValue, "PARAMBIN" ) == 0 ) + { + hRenderConfig->split_rend_config.rendererSelection = IVAS_BIN_RENDERER_TYPE_PARAMBIN; + } + else if ( strcmp( pValue, "TDREND" ) == 0 ) + { + hRenderConfig->split_rend_config.rendererSelection = IVAS_BIN_RENDERER_TYPE_TDREND; + } + else + { + errorHandler( pValue, ERROR_VALUE_INVALID ); + } + } + else if ( strcmp( item, "LC3PLUS_HIGHRES" ) == 0 ) + { + if ( !sscanf( pValue, "%hd", &hRenderConfig->split_rend_config.lc3plus_highres ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + } + } +#ifdef DEBUGGING + else + { + fprintf( stderr, "Unsupported configuration property %s\n", item ); + } +#endif + } + free( pValue ); + } else if ( strcmp( chapter, "DIRECTIVITYSETTING" ) == 0 && strlen( pParams ) != 0 ) { params_idx = 0; @@ -2425,6 +2709,51 @@ ivas_error RenderConfigReader_read( free( pValue ); accDPIdx++; } + else if ( strcmp( chapter, "DISTANCEATTENUATION" ) == 0 ) + { + params_idx = 0; + pValue = (char *) calloc( strlen( pParams ), sizeof( char ) ); + + /* Set default values if parameters are only partially specified */ + pRenderConfigReader->distAtt[0] = 15.75f; + pRenderConfigReader->distAtt[1] = 1.0f; + pRenderConfigReader->distAtt[2] = 1.0f; + + while ( sscanf( pParams + params_idx, "%64[^=]=%[^;];", item, pValue ) == 2 ) + { + params_idx += (int32_t) ( strlen( item ) + strlen( pValue ) + 2 ); + + if ( strcmp( item, "MAXDIST" ) == 0 ) + { + /* Read the Maximum distance */ + if ( !sscanf( pValue, "%f", &pRenderConfigReader->distAtt[0] ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + } + if ( strcmp( item, "REFDIST" ) == 0 ) + { + /* Read the Reference distance */ + if ( !sscanf( pValue, "%f", &pRenderConfigReader->distAtt[1] ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + } + if ( strcmp( item, "ROLLOFFFACTOR" ) == 0 ) + { + /* Read the Rolloff Factor */ + if ( !sscanf( pValue, "%f", &pRenderConfigReader->distAtt[2] ) ) + { + errorHandler( item, ERROR_VALUE_INVALID ); + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + } + } + + free( pValue ); + } else if ( strcmp( chapter, "GENERAL" ) == 0 && strlen( pParams ) != 0 ) { params_idx = 0; @@ -2495,6 +2824,111 @@ ivas_error RenderConfigReader_read( } return IVAS_ERR_OK; } + +/*------------------------------------------------------------------------------------------* + * RenderConfigReader_getAcousticEnvironmentCount() + * + * Gets number of acoustic environments available + *------------------------------------------------------------------------------------------*/ +uint32_t RenderConfigReader_getAcousticEnvironmentCount( + RenderConfigReader *pRenderConfigReader /* i : RenderConfigReader handle */ +) +{ + return pRenderConfigReader->nAE; +} + +/*------------------------------------------------------------------------------------------* + * RenderConfigReader_getAcousticEnvironments() + * + * Gets all acoustic environments + *------------------------------------------------------------------------------------------*/ +ivas_error RenderConfigReader_getAcousticEnvironments( + RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ + IVAS_ROOM_ACOUSTICS_CONFIG_DATA **ppAcEnv /* o : Acoustic environment array pointer */ +) +{ + uint16_t n, m, j; + + if ( pRenderConfigReader == NULL || ppAcEnv == NULL || pRenderConfigReader->nAE == 0 || pRenderConfigReader->pAE == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + for ( n = 0; n < pRenderConfigReader->nAE; n++ ) + { + AcousticEnv pIn = pRenderConfigReader->pAE[n]; + IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pOut = ppAcEnv[n]; + + pOut->aeID = (Word16) pIn.id; + pOut->nBands = (Word16) pIn.pFG->nrBands; + if ( pRenderConfigReader->pAE[n].preDelay > INPUTPREDELAY_MAX || + pRenderConfigReader->pAE[n].preDelay < INPUTPREDELAY_MIN ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + pOut->inputPreDelay_fx = (Word32) ( pIn.preDelay * ONE_IN_Q27 ); + + for ( m = 0; m < pOut->nBands; m++ ) + { + pOut->pFc_input_fx[m] = (Word32) ( pIn.pFG->pFc[m] * ONE_IN_Q16 ); + pOut->pAcoustic_rt60_fx[m] = (Word32) ( pIn.pRT60[m] * ONE_IN_Q26 ); + pOut->pAcoustic_dsr_fx[m] = (Word32) ( pIn.pDSR[m] * ONE_IN_Q30 ); + } + + /* If ER are allocated then propagate parameters */ + if ( pIn.pEarlyReflections != 0 ) + { + pOut->use_er = pIn.pEarlyReflections->use_er; /* ER activation flag */ + pOut->lowComplexity = pIn.pEarlyReflections->lowComplexity; /* Low complexity flag */ + pOut->dimensions = pIn.pEarlyReflections->dimensions; + pOut->dimensions.x_fx = (Word32) ( pRenderConfigReader->pAE[n].pEarlyReflections->dimensions.x * ONE_IN_Q22 ); + pOut->dimensions.y_fx = (Word32) ( pRenderConfigReader->pAE[n].pEarlyReflections->dimensions.y * ONE_IN_Q22 ); + pOut->dimensions.z_fx = (Word32) ( pRenderConfigReader->pAE[n].pEarlyReflections->dimensions.z * ONE_IN_Q22 ); + + /* Use default listener origin position if non provided */ + if ( pIn.pEarlyReflections->pListenerOrigin == NULL ) + { + pOut->ListenerOrigin.x = IVAS_ER_LIST_ORIGIN_X; + pOut->ListenerOrigin.y = IVAS_ER_LIST_ORIGIN_Y; + pOut->ListenerOrigin.z = IVAS_ER_LIST_HEIGHT; + + pOut->ListenerOrigin.x_fx = IVAS_ER_LIST_ORIGIN_X_FX; + pOut->ListenerOrigin.y_fx = IVAS_ER_LIST_ORIGIN_Y_FX; + pOut->ListenerOrigin.z_fx = IVAS_ER_LIST_HEIGHT_FX; + pOut->ListenerOrigin.q_fact = Q22; + } + else + { + pOut->ListenerOrigin.x = pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->x; + pOut->ListenerOrigin.y = pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->y; + pOut->ListenerOrigin.z = pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->z; + + pOut->ListenerOrigin.x_fx = (Word32) ( pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->x * ONE_IN_Q22 ); + pOut->ListenerOrigin.y_fx = (Word32) ( pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->y * ONE_IN_Q22 ); + pOut->ListenerOrigin.z_fx = (Word32) ( pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->z * ONE_IN_Q22 ); + } + + for ( j = 0; j < IVAS_ROOM_ABS_COEFF; j++ ) + { + pOut->AbsCoeff[j] = pIn.pEarlyReflections->pAbsCoeff[j]; + pOut->AbsCoeff_fx[j] = (Word32) ( pIn.pEarlyReflections->pAbsCoeff[j] * ONE_IN_Q30 ); + } + } + else + { + pOut->use_er = false; + } + } + + return IVAS_ERR_OK; +} + +/*------------------------------------------------------------------------------------------* + * RenderConfigReader_getAcousticEnvironment() + * + * Gets Acoustic environment with a given ID + *------------------------------------------------------------------------------------------*/ + ivas_error RenderConfigReader_getAcousticEnvironment( RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ uint16_t id, /* i : Acoustic environment ID */ @@ -2510,7 +2944,7 @@ ivas_error RenderConfigReader_getAcousticEnvironment( } /* case when -aeid is not specified, select first ID from config file */ - if ( id == 65535 && pRenderConfigReader->nAE > 0 ) + if ( id == (UWord16) IVAS_DEFAULT_AEID && pRenderConfigReader->nAE > 0 ) { id = (uint16_t) pRenderConfigReader->pAE[0].id; } @@ -2520,13 +2954,24 @@ ivas_error RenderConfigReader_getAcousticEnvironment( if ( id == pRenderConfigReader->pAE[n].id ) { pAcEnv->nBands = (int16_t) pRenderConfigReader->pAE[n].pFG->nrBands; - pAcEnv->inputPreDelay = pRenderConfigReader->pAE[n].preDelay; pAcEnv->inputPreDelay_fx = (Word32) ( pRenderConfigReader->pAE[n].preDelay * ONE_IN_Q27 ); + if ( pRenderConfigReader->pAE[n].preDelay > INPUTPREDELAY_MAX || + pRenderConfigReader->pAE[n].preDelay < INPUTPREDELAY_MIN ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } for ( m = 0; m < pAcEnv->nBands; m++ ) { - pAcEnv->pFc_input[m] = pRenderConfigReader->pAE[n].pFG->pFc[m]; - pAcEnv->pAcoustic_rt60[m] = pRenderConfigReader->pAE[n].pRT60[m]; - pAcEnv->pAcoustic_dsr[m] = pRenderConfigReader->pAE[n].pDSR[m]; + if ( pRenderConfigReader->pAE[n].pFG->pFc[m] > FC_INPUT_MAX || + pRenderConfigReader->pAE[n].pFG->pFc[m] < FC_INPUT_MIN || + pRenderConfigReader->pAE[n].pRT60[m] > ACOUSTIC_RT60_MAX || + pRenderConfigReader->pAE[n].pRT60[m] < ACOUSTIC_RT60_MIN || + pRenderConfigReader->pAE[n].pDSR[m] > ACOUSTIC_DSR_MAX || + pRenderConfigReader->pAE[n].pDSR[m] < ACOUSTIC_DSR_MIN ) + { + return IVAS_ERR_INVALID_RENDER_CONFIG; + } + pAcEnv->pFc_input_fx[m] = (Word32) ( pRenderConfigReader->pAE[n].pFG->pFc[m] * ONE_IN_Q16 ); pAcEnv->pAcoustic_rt60_fx[m] = (Word32) ( pRenderConfigReader->pAE[n].pRT60[m] * ONE_IN_Q26 ); pAcEnv->pAcoustic_dsr_fx[m] = (Word32) ( pRenderConfigReader->pAE[n].pDSR[m] * ONE_IN_Q30 ); @@ -2548,13 +2993,13 @@ ivas_error RenderConfigReader_getAcousticEnvironment( { return IVAS_ERR_FAILED_ALLOC; } - pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->x = ER_LIST_ORIGIN_X; - pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->y = ER_LIST_ORIGIN_Y; - pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->z = ER_LIST_HEIGHT; + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->x = IVAS_ER_LIST_ORIGIN_X; + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->y = IVAS_ER_LIST_ORIGIN_Y; + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->z = IVAS_ER_LIST_HEIGHT; - pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->x_fx = ER_LIST_ORIGIN_X_FX; - pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->y_fx = ER_LIST_ORIGIN_Y_FX; - pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->z_fx = ER_LIST_HEIGHT_FX; + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->x_fx = IVAS_ER_LIST_ORIGIN_X_FX; + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->y_fx = IVAS_ER_LIST_ORIGIN_Y_FX; + pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->z_fx = IVAS_ER_LIST_HEIGHT_FX; pRenderConfigReader->pAE[n].pEarlyReflections->pListenerOrigin->q_fact = Q22; } else @@ -2570,6 +3015,10 @@ ivas_error RenderConfigReader_getAcousticEnvironment( pAcEnv->AbsCoeff_fx[j] = (Word32) ( pRenderConfigReader->pAE[n].pEarlyReflections->pAbsCoeff[j] * ONE_IN_Q30 ); } } + else + { + pAcEnv->use_er = false; + } return IVAS_ERR_OK; } } @@ -2585,12 +3034,13 @@ ivas_error RenderConfigReader_getAcousticEnvironment( ivas_error RenderConfigReader_getDirectivity( RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ uint16_t *id, /* i : Directivity pattern ID */ - float *directivity /* o : Target directivity */ + Word16 *directivity_fx /* o : Target directivity */ ) { - uint16_t n, m; + uint16_t n, m, i; uint16_t last_specified_id; bool idExists; + float directivity[12]; if ( pRenderConfigReader == NULL ) { @@ -2619,18 +3069,18 @@ ivas_error RenderConfigReader_getDirectivity( } } /* case when -dpid is not specified, select first directivity pattern from config file */ - if ( n == 0 ) + move16(); + if ( last_specified_id == 65535 ) { last_specified_id = (uint16_t) pRenderConfigReader->pDP[0].id; } - for ( ; n < MAX_NUM_OBJECTS; n++ ) + for ( ; n < IVAS_MAX_NUM_OBJECTS; n++ ) { id[n] = last_specified_id; } - - for ( n = 0; n < MAX_NUM_OBJECTS; n++ ) + for ( n = 0; n < IVAS_MAX_NUM_OBJECTS; n++ ) { idExists = false; for ( m = 0; m < pRenderConfigReader->nDP; m++ ) @@ -2638,7 +3088,11 @@ ivas_error RenderConfigReader_getDirectivity( if ( id[n] == pRenderConfigReader->pDP[m].id ) { idExists = true; - mvr2r( pRenderConfigReader->pDP[m].pDirectivity, directivity + ( n * 3 ), 3 ); + for ( i = 0; i < 3; i++ ) + { + directivity[n * 3 + i] = pRenderConfigReader->pDP[m].pDirectivity[i]; + } + break; } } @@ -2648,10 +3102,54 @@ ivas_error RenderConfigReader_getDirectivity( } } } + + /* Convert to Word16 */ + FOR( n = 0; n < 4; n++ ) + { + directivity_fx[n * 3] = (Word16) ( directivity[n * 3] * ( 1u << 6 ) ); + directivity_fx[n * 3 + 1] = (Word16) ( directivity[n * 3 + 1] * ( 1u << 6 ) ); + directivity_fx[n * 3 + 2] = (Word16) ( directivity[n * 3 + 2] * ( ( 1u << 15 ) - 1 ) ); + } + return IVAS_ERR_OK; } +/*------------------------------------------------------------------------------------------* + * RenderConfigReader_getDistanceAttenuation() + * + * Gets Distance Attenuation + *------------------------------------------------------------------------------------------*/ + +ivas_error RenderConfigReader_getDistanceAttenuation( + RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ + + Word32 *distAtt_fx /* o : Distance attenuation */ +) +{ + float distAtt[3]; + + if ( pRenderConfigReader->distAtt[0] == -1 ) + { + distAtt[0] = 15.75f; + distAtt[1] = 1.0f; + distAtt[2] = 1.0f; + } + else + { + distAtt[0] = pRenderConfigReader->distAtt[0]; + distAtt[1] = pRenderConfigReader->distAtt[1]; + distAtt[2] = pRenderConfigReader->distAtt[2]; + } + + /* Convert to Word32 */ + distAtt_fx[0] = (Word32) ( distAtt[0] * ( 1u << 27 ) ); + distAtt_fx[1] = (Word32) ( distAtt[1] * ( 1u << 30 ) ); + distAtt_fx[2] = (Word32) ( distAtt[2] * ( 1u << 30 ) ); + + return IVAS_ERR_OK; +} + /*------------------------------------------------------------------------------------------* * RenderConfigReader_close() * diff --git a/lib_util/render_config_reader.h b/lib_util/render_config_reader.h index 5edf73ded33d2cc91653c86276a86a92bc496432..420e17ad607e93f953c21d31544ef3cc8615ebbe 100644 --- a/lib_util/render_config_reader.h +++ b/lib_util/render_config_reader.h @@ -51,6 +51,17 @@ ivas_error RenderConfigReader_open( RenderConfigReader **ppRenderConfigReader /* o : RenderConfigReader handle */ ); +/* Get number of acoustic environments */ +uint32_t RenderConfigReader_getAcousticEnvironmentCount( + RenderConfigReader *pRenderConfigReader /* i : RenderConfigReader handle */ +); + +/* Get all acoustic environments */ +ivas_error RenderConfigReader_getAcousticEnvironments( + RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ + IVAS_ROOM_ACOUSTICS_CONFIG_DATA **ppAcEnv /* o : Acoustic environment array pointer */ +); + /* Get an acoustic environment */ ivas_error RenderConfigReader_getAcousticEnvironment( RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ @@ -60,7 +71,11 @@ ivas_error RenderConfigReader_getAcousticEnvironment( ivas_error RenderConfigReader_getDirectivity( RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ uint16_t *pId, /* i : Directivity pattern ID */ - float *directivity /* o : Target directivity */ + Word16 *directivity_fx /* o : Target directivity */ +); +ivas_error RenderConfigReader_getDistanceAttenuation( + RenderConfigReader *pRenderConfigReader, /* i : RenderConfigReader handle */ + Word32 *distAtt_fx /* o : Distance attenuation */ ); /* Verifies configuration parameters */ ivas_error RenderConfigReader_checkValues( diff --git a/lib_util/rotation_file_reader.c b/lib_util/rotation_file_reader.c index 2299f326531a24915800468935bb021c8f7888af..4385a9f831cb63e632620295e765060f6e67afd3 100644 --- a/lib_util/rotation_file_reader.c +++ b/lib_util/rotation_file_reader.c @@ -33,10 +33,14 @@ #include "rotation_file_reader.h" #include #include -#include -#include "prot_fx.h" +#include "float_to_fix_ops.h" +#define Q22 22 +#define Q25 25 +#define Q29 29 +#define Q31 31 + struct RotFileReader { FILE *trajFile; @@ -73,10 +77,10 @@ ivas_error RotationFileReader_open( return IVAS_ERR_FAILED_FILE_OPEN; } - self = calloc( sizeof( RotFileReader ), 1 ); + self = calloc( 1, sizeof( RotFileReader ) ); self->trajFile = trajFile; self->frameCounter = 0; - self->file_path = calloc( sizeof( char ), strlen( trajFilePath ) + 1 ); + self->file_path = calloc( strlen( trajFilePath ) + 1, sizeof( char ) ); strcpy( self->file_path, trajFilePath ); self->fileRewind = false; @@ -120,15 +124,24 @@ ivas_error HeadRotationFileReading( ( headRotReader->frameCounter )++; - pQuaternion->w = w; - pQuaternion->x = x; - pQuaternion->y = y; - pQuaternion->z = z; - pQuaternion->w_fx = floatToFixed_32( w, Q31 ); - pQuaternion->x_fx = floatToFixed_32( x, Q31 ); - pQuaternion->y_fx = floatToFixed_32( y, Q31 ); - pQuaternion->z_fx = floatToFixed_32( z, Q31 ); - pQuaternion->q_fact = Q31; + + if ( w == -3.0f ) + { + pQuaternion->w_fx = floatToFixed_32( w, Q22 ); + pQuaternion->x_fx = floatToFixed_32( x, Q22 ); + pQuaternion->y_fx = floatToFixed_32( y, Q22 ); + pQuaternion->z_fx = floatToFixed_32( z, Q22 ); + pQuaternion->q_fact = Q22; + } + else + { + pQuaternion->w_fx = floatToFixed_32( w, Q31 ); + pQuaternion->x_fx = floatToFixed_32( x, Q31 ); + pQuaternion->y_fx = floatToFixed_32( y, Q31 ); + pQuaternion->z_fx = floatToFixed_32( z, Q31 ); + pQuaternion->q_fact = Q31; + } + if ( pPos != NULL ) { pPos->x = posx; @@ -185,14 +198,17 @@ ivas_error ExternalOrientationFileReading( ( externalOrientationReader->frameCounter )++; + /* Only Quaternion orientations are supported, raise an error if Euler angles are detected in the input */ + if ( w == -3.0f ) + { + return IVAS_ERR_EXTERNAL_ORIENTATION_INVALID_FORMAT; + } + pQuaternion->w_fx = float_to_fix( w, Q29 ); pQuaternion->x_fx = float_to_fix( x, Q29 ); pQuaternion->y_fx = float_to_fix( y, Q29 ); pQuaternion->z_fx = float_to_fix( z, Q29 ); - move32(); - move32(); - move32(); - move32(); + *enableHeadRotation = (int8_t) headRotFlag; *enableExternalOrientation = (int8_t) extOrientationFlag; *enableRotationInterpolation = (int8_t) rotInterpolationFlag; diff --git a/lib_util/rtpdump.c b/lib_util/rtpdump.c index e3eb4c1f4acb3329e0183bd97f820b318cb81400..0b818ee193ba0df8be3742b12f691f57255a2f6e 100644 --- a/lib_util/rtpdump.c +++ b/lib_util/rtpdump.c @@ -31,13 +31,14 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #include #include #include #include "rtpdump.h" +#include "options.h" struct RTPDUMP { @@ -80,7 +81,7 @@ static unsigned char *parseByte( unsigned char *buffer, unsigned char *value ) static int readLong( FILE *file, unsigned int *value ) { char buffer[4] = { 0 }; - if ( fread( buffer, 4, 1, file ) != 1U ) + if ( fread( buffer, 1, 4, file ) != 1U ) { return -1; } @@ -96,7 +97,7 @@ static int readLong( FILE *file, unsigned int *value ) static int readShort( FILE *file, unsigned short *value ) { char buffer[2] = { 0 }; - if ( fread( buffer, 2, 1, file ) != 1U ) + if ( fread( buffer, 1, 2, file ) != 1U ) { return -1; } @@ -110,10 +111,10 @@ static int readShort( FILE *file, unsigned short *value ) static int writeLong( FILE *file, unsigned int value ) { char buffer[4] = { 0 }; - buffer[3] = value & 0xff; - buffer[2] = ( value >> 8 ) & 0xff; - buffer[1] = ( value >> 16 ) & 0xff; - buffer[0] = ( value >> 24 ) & 0xff; + buffer[3] = (char) ( value & 0xff ); + buffer[2] = (char) ( ( value >> 8 ) & 0xff ); + buffer[1] = (char) ( ( value >> 16 ) & 0xff ); + buffer[0] = (char) ( ( value >> 24 ) & 0xff ); if ( fwrite( buffer, 4, 1, file ) != 1U ) { return -1; @@ -125,8 +126,8 @@ static int writeLong( FILE *file, unsigned int value ) static int writeShort( FILE *file, unsigned short value ) { char buffer[2] = { 0 }; - buffer[1] = value & 0xff; - buffer[0] = ( value >> 8 ) & 0xff; + buffer[1] = (char) ( value & 0xff ); + buffer[0] = (char) ( ( value >> 8 ) & 0xff ); if ( fwrite( buffer, 2, 1, file ) != 1U ) { return -1; diff --git a/lib_util/rtpdump.h b/lib_util/rtpdump.h index 5b8b31e8de3b7a6eda80cd7e6d8e808c6e9446b5..366f95d57dc5432b806e88119e7639fb51ee1bbc 100644 --- a/lib_util/rtpdump.h +++ b/lib_util/rtpdump.h @@ -31,7 +31,7 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0 ====================================================================================*/ #pragma once diff --git a/lib_util/split_rend_bfi_file_reader.c b/lib_util/split_rend_bfi_file_reader.c new file mode 100644 index 0000000000000000000000000000000000000000..6a86738e026d04149cf714d2b5b99e830a883b83 --- /dev/null +++ b/lib_util/split_rend_bfi_file_reader.c @@ -0,0 +1,160 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "split_rend_bfi_file_reader.h" +#include +#include +#include + + +struct SplitRendBFIFileReader +{ + FILE *bfiFile; + int32_t frameCounter; + char *file_path; + bool fileRewind; + bool txtfile; +}; + + +/*-----------------------------------------------------------------------* + * SplitRendBFIFileReader_open() + * + * Allocate and initialize Split Renderer Frameloss file reader + *-----------------------------------------------------------------------*/ + +ivas_error SplitRendBFIFileReader_open( + char *bfiFilePath, /* i : frame loss file name */ + SplitRendBFIFileReader **SplitRendBFIReader /* o : SplitRendBFIFileReader handle */ +) +{ + SplitRendBFIFileReader *self; + FILE *bfiFile; + bool txtfile; + + /* Open bfi file */ + if ( strlen( bfiFilePath ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + bfiFile = fopen( bfiFilePath, "r" ); + + if ( !bfiFile ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + txtfile = ( strcmp( bfiFilePath + strlen( bfiFilePath ) - 4, ".txt" ) ? false : true ); + + self = calloc( 1, sizeof( SplitRendBFIFileReader ) ); + self->bfiFile = bfiFile; + self->frameCounter = 0; + self->file_path = calloc( strlen( bfiFilePath ) + 1, sizeof( char ) ); + strcpy( self->file_path, bfiFilePath ); + self->fileRewind = false; + self->txtfile = txtfile; + + *SplitRendBFIReader = self; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * SplitRendBFIFileReading() + * + * Read values from the bfi file + *-----------------------------------------------------------------------*/ + +ivas_error SplitRendBFIFileReading( + SplitRendBFIFileReader *SplitRendBFIReader, /* i/o: SplitRendBFIFileReader handle */ + int16_t *bfi ) +{ + if ( SplitRendBFIReader->txtfile ? 1 != fscanf( SplitRendBFIReader->bfiFile, "%hd", bfi ) : 1 != fread( bfi, sizeof( *bfi ), 1, SplitRendBFIReader->bfiFile ) ) + { + if ( feof( SplitRendBFIReader->bfiFile ) ) + { + rewind( SplitRendBFIReader->bfiFile ); + SplitRendBFIReader->fileRewind = true; + return SplitRendBFIFileReading( SplitRendBFIReader, bfi ); + } + return IVAS_ERR_FAILED_FILE_PARSE; + } + + ( SplitRendBFIReader->frameCounter )++; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * SplitRendBFIationFileReader_close() + * + * Deallocates memory for the Head-Tracking reader + *-----------------------------------------------------------------------*/ + +void SplitRendBFIFileReader_close( + SplitRendBFIFileReader **SplitRendBFIReader /* i/o: SplitRendBFIFileReader handle */ +) +{ + if ( SplitRendBFIReader == NULL || *SplitRendBFIReader == NULL ) + { + return; + } + + fclose( ( *SplitRendBFIReader )->bfiFile ); + free( ( *SplitRendBFIReader )->file_path ); + free( *SplitRendBFIReader ); + *SplitRendBFIReader = NULL; + + return; +} + + +/*-----------------------------------------------------------------------* + * SplitRendBFIFileReader_getFilePath() + * + * + *-----------------------------------------------------------------------*/ + +const char *SplitRendBFIFileReader_getFilePath( + SplitRendBFIFileReader *SplitRendBFIReader /* i/o: SplitRendBFIFileReader handle */ +) +{ + if ( SplitRendBFIReader == NULL ) + { + return NULL; + } + + return SplitRendBFIReader->file_path; +} diff --git a/lib_util/test_mdct.c b/lib_util/split_rend_bfi_file_reader.h similarity index 73% rename from lib_util/test_mdct.c rename to lib_util/split_rend_bfi_file_reader.h index 69d83588da32356d4ea43d4512beea7be73244e2..0956b6b3ddcecc0b8fd58f0f13a26b15b8e4c5a0 100644 --- a/lib_util/test_mdct.c +++ b/lib_util/split_rend_bfi_file_reader.h @@ -30,21 +30,29 @@ *******************************************************************************************************/ +#ifndef IVAS_SR_BFI_FILE_READER_H +#define IVAS_SR_BFI_FILE_READER_H -#include -#include -#include -#include -#include +#include "common_api_types.h" -typedef int Word32; -typedef short Word16; -typedef short int16_t; +typedef struct SplitRendBFIFileReader SplitRendBFIFileReader; -#define TYPE_MDCT ( 0 ) -#define TYPE_IMDCT ( 1 ) -#define TYPE_EDCT2 ( 2 ) -#define TYPE_NEG_EDCT2 ( 3 ) +ivas_error SplitRendBFIFileReader_open( + char *trajFilePath, /* i : head rotation trajectory file name */ + SplitRendBFIFileReader **SplitRendBFIReader /* o : SplitRendBFIFileReader handle */ +); -#define ALLOWED_DEVIATION ( 0.05 ) -#define Q31 ( 2147483647.0f ) +ivas_error SplitRendBFIFileReading( + SplitRendBFIFileReader *SplitRendBFIReader, /* i/o: SplitRendBFIFileReader handle */ + int16_t *bfi ); + +void SplitRendBFIFileReader_close( + SplitRendBFIFileReader **SplitRendBFIReader /* i/o: SplitRendBFIFileReader handle */ +); + +const char *SplitRendBFIFileReader_getFilePath( + SplitRendBFIFileReader *SplitRendBFIReader /* i/o: SplitRendBFIFileReader handle */ +); + + +#endif /* IVAS_SR_BFI_FILE_READER_H */ diff --git a/lib_util/split_render_file_read_write.c b/lib_util/split_render_file_read_write.c new file mode 100644 index 0000000000000000000000000000000000000000..75fd30d88a9ecc824d43afdb13ed99122e9645cc --- /dev/null +++ b/lib_util/split_render_file_read_write.c @@ -0,0 +1,422 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "split_render_file_read_write.h" +#include "ivas_error_utils.h" +#include +#include + + +/*------------------------------------------------------------------------------------------* + * PreProc Macros + *------------------------------------------------------------------------------------------*/ + +#define SPLIT_RENDERER_FRAME_HEADER_LEN ( 12 ) + +/*------------------------------------------------------------------------------------------* + * Type definitions + *------------------------------------------------------------------------------------------*/ + +struct SplitFileReadWrite +{ + FILE *file; + uint32_t delay_ns; +}; + + +/*-----------------------------------------------------------------------------------------* + * Function split_rend_reader_open() + * + * open in read mode + *-----------------------------------------------------------------------------------------*/ + +ivas_error split_rend_reader_open( + SplitFileReadWrite **hhSplitRendFileReadWrite, + char *filename, + ISAR_SPLIT_REND_CODEC *codec, + ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, + int16_t *codec_frame_size_ms, + int16_t *isar_frame_size_ms, + int32_t *sampling_rate, + int16_t *lc3plus_highres ) +{ + SplitFileReadWrite *hSplitRendFileReadWrite; + size_t header_len, h; + char header[SPLIT_RENDERER_FRAME_HEADER_LEN] = "MAIN_SPLITH"; + char header_read[SPLIT_RENDERER_FRAME_HEADER_LEN]; + + if ( ( hSplitRendFileReadWrite = (SplitFileReadWrite *) malloc( sizeof( SplitFileReadWrite ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for split rendering writer\n" ) ); + } + + hSplitRendFileReadWrite->file = fopen( filename, "rb" ); + if ( hSplitRendFileReadWrite->file == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "\nCould not open split rend metadata file %s\n", filename ) ); + } + + header_len = strlen( header ); + + /*read frame header*/ + for ( h = 0; h < header_len; h++ ) + { + if ( fread( &header_read[h], sizeof( char ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + } + + if ( strncmp( header_read, header, header_len ) ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "\nError split rend bitstream main header mismatch\n" ) ); + } + + fread( &hSplitRendFileReadWrite->delay_ns, sizeof( uint32_t ), 1, hSplitRendFileReadWrite->file ); + + /* read codec signalling */ + if ( fread( codec, sizeof( *codec ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + /* read pose correction signalling */ + if ( fread( poseCorrection, sizeof( *poseCorrection ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + /* read transport codec frame size signalling */ + if ( fread( codec_frame_size_ms, sizeof( *codec_frame_size_ms ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + /* read ISAR bitstream frame size signalling */ + if ( fread( isar_frame_size_ms, sizeof( *isar_frame_size_ms ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + /* read sampling rate signalling */ + if ( fread( sampling_rate, sizeof( *sampling_rate ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + /* read LC3plus highres signalling */ + if ( fread( lc3plus_highres, sizeof( *lc3plus_highres ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + *hhSplitRendFileReadWrite = hSplitRendFileReadWrite; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function split_rend_writer_open() + * + * open in write mode + *-----------------------------------------------------------------------------------------*/ + +ivas_error split_rend_writer_open( + SplitFileReadWrite **hhSplitRendFileReadWrite, + char *filename, + const int16_t delayNumSamples, + const int32_t delayTimeScale, + ISAR_SPLIT_REND_CODEC codec, + ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection, + int16_t codec_frame_size_ms, + const int16_t isar_frame_size_ms, + const int32_t sampling_rate, + const int16_t lc3plus_highres ) +{ + SplitFileReadWrite *hSplitRendFileReadWrite; + size_t header_len, h; + char header[SPLIT_RENDERER_FRAME_HEADER_LEN] = "MAIN_SPLITH"; + + if ( filename == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( ( hSplitRendFileReadWrite = (SplitFileReadWrite *) malloc( sizeof( SplitFileReadWrite ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for split rendering writer\n" ) ); + } + + hSplitRendFileReadWrite->file = fopen( filename, "wb" ); + if ( hSplitRendFileReadWrite->file == NULL ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + header_len = strlen( header ); + + /* write frame header */ + for ( h = 0; h < header_len; h++ ) + { + if ( fwrite( &header[h], sizeof( char ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_END_OF_FILE; + } + } + hSplitRendFileReadWrite->delay_ns = (int32_t) ( (float) delayNumSamples * 1000000000.0f / (float) delayTimeScale ); + fwrite( &hSplitRendFileReadWrite->delay_ns, sizeof( int32_t ), 1, hSplitRendFileReadWrite->file ); + + /* Write codec signalling */ + if ( fwrite( &codec, sizeof( codec ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + /* Write pose correction signalling */ + if ( fwrite( &poseCorrection, sizeof( poseCorrection ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + /* Write transport codec frame size signalling */ + if ( fwrite( &codec_frame_size_ms, sizeof( codec_frame_size_ms ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + /* Write ISAR bit stream frame size signalling */ + if ( fwrite( &isar_frame_size_ms, sizeof( isar_frame_size_ms ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + /* Write sampling rate signalling */ + if ( fwrite( &sampling_rate, sizeof( sampling_rate ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + /* Write LC3plus highres signalling */ + if ( fwrite( &lc3plus_highres, sizeof( lc3plus_highres ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + *hhSplitRendFileReadWrite = hSplitRendFileReadWrite; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function split_rend_reader_writer_close() + * + * + *-----------------------------------------------------------------------------------------*/ + +void split_rend_reader_writer_close( + SplitFileReadWrite **hhSplitRendFileReadWrite ) +{ + if ( ( *hhSplitRendFileReadWrite ) != NULL ) + { + if ( ( *hhSplitRendFileReadWrite )->file != NULL ) + { + fclose( ( *hhSplitRendFileReadWrite )->file ); + ( *hhSplitRendFileReadWrite )->file = NULL; + } + + free( *hhSplitRendFileReadWrite ); + *hhSplitRendFileReadWrite = NULL; + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function split_rend_write_bitstream_to_file() + * + * + *-----------------------------------------------------------------------------------------*/ + +ivas_error split_rend_write_bitstream_to_file( + SplitFileReadWrite *hSplitRendFileReadWrite, + uint8_t *bits, + int32_t *bits_read, + int32_t *bits_written ) +{ + char header[SPLIT_RENDERER_FRAME_HEADER_LEN] = "SPLIT_FRAME"; + size_t header_len, i, num_bytes; + uint8_t version = 0; + + if ( hSplitRendFileReadWrite == NULL ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + if ( hSplitRendFileReadWrite->file == NULL ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + header_len = strlen( header ); + + /* write frame header */ + for ( i = 0; i < header_len; i++ ) + { + if ( fwrite( &header[i], sizeof( char ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + } + + /* Write versioning signalling */ + if ( fwrite( &version, 1, 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + /* write num bytes */ + if ( fwrite( bits_written, sizeof( int32_t ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + num_bytes = ( *bits_written + 7 ) >> 3; + if ( fwrite( bits, sizeof( uint8_t ), num_bytes, hSplitRendFileReadWrite->file ) != num_bytes ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + + *bits_read = 0; + *bits_written = 0; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function split_rend_read_bits_from_file() + * + * + *-----------------------------------------------------------------------------------------*/ + +ivas_error split_rend_read_bits_from_file( + SplitFileReadWrite *hSplitRendFileReadWrite, + uint8_t *bits, + int32_t *bits_read, + int32_t *bits_written, + int16_t *bfi ) +{ + char header[SPLIT_RENDERER_FRAME_HEADER_LEN] = "SPLIT_FRAME"; + char header_read[SPLIT_RENDERER_FRAME_HEADER_LEN]; + int32_t header_len, i, num_bytes, bit_len = 0; + uint8_t version; + + if ( hSplitRendFileReadWrite == NULL ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + if ( hSplitRendFileReadWrite->file == NULL ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + header_len = (int32_t) strlen( header ); + + /* read frame header */ + for ( i = 0; i < header_len; i++ ) + { + if ( fread( &header_read[i], sizeof( char ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_END_OF_FILE; + } + } + + if ( strncmp( header_read, header, header_len ) ) + { + fprintf( stderr, "Error bitstream frame header mismatch\n" ); + return IVAS_ERR_FAILED_FILE_READ; + } + + /* read versioning signalling */ + if ( fread( &version, 1, 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_WRITE; + } + if ( version != 0 ) + { + fprintf( stderr, "Error bitstream version mismatch\n" ); + return IVAS_ERR_FAILED_FILE_READ; + } + + /* write num bytes */ + if ( fread( &bit_len, sizeof( int32_t ), 1, hSplitRendFileReadWrite->file ) != 1 ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + num_bytes = ( bit_len + 7 ) >> 3; + + if ( fread( bits, sizeof( uint8_t ), num_bytes, hSplitRendFileReadWrite->file ) != (uint32_t) num_bytes ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + for ( i = 0; i < ISAR_SPLIT_REND_ADDITIONAL_BYTES_TO_READ; i++ ) + { + bits[num_bytes + i] = 0; + } + + *bits_read = 0; + *bits_written = bit_len; + *bfi = 0; + if ( bit_len == 0 ) + { + *bfi = 1; + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function split_rend_read_pre_rend_delay_ns() + * + * + *-----------------------------------------------------------------------------------------*/ + +ivas_error split_rend_read_pre_rend_delay_ns( + SplitFileReadWrite *hSplitRendFileReadWrite, + uint32_t *delay_ns ) +{ + if ( hSplitRendFileReadWrite == NULL ) + { + return IVAS_ERR_FAILED_FILE_READ; + } + + *delay_ns = hSplitRendFileReadWrite->delay_ns; + + return IVAS_ERR_OK; +} diff --git a/lib_util/split_render_file_read_write.h b/lib_util/split_render_file_read_write.h new file mode 100644 index 0000000000000000000000000000000000000000..0ea113e899d9cf0920c7978c52d11ebfbe1c536b --- /dev/null +++ b/lib_util/split_render_file_read_write.h @@ -0,0 +1,90 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef SPLIT_RENDER_FILE_READ_WRITE_H +#define SPLIT_RENDER_FILE_READ_WRITE_H + +#include "common_api_types.h" + +typedef struct SplitFileReadWrite SplitFileReadWrite; + +/* Allocates and initializes a a split renderer reader instance */ +ivas_error split_rend_reader_open( + SplitFileReadWrite **hhSplitRendFileReadWrite, + char *filename, + ISAR_SPLIT_REND_CODEC *codec, + ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, + int16_t *codec_frame_size_ms, + int16_t *isar_frame_size_ms, + int32_t *sampling_rate, + int16_t *lc3plus_highres ); + + +/* Allocates and initializes a a split renderer writer instance */ +ivas_error split_rend_writer_open( + SplitFileReadWrite **hhSplitRendFileReadWrite, + char *filename, + const int16_t delayNumSamples, + const int32_t delayTimeScale, + ISAR_SPLIT_REND_CODEC codec, + ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection, + int16_t codec_frame_size_ms, + const int16_t isar_frame_size_ms, + const int32_t sampling_rate, + const int16_t lc3plus_highres ); + + +/* Closes the split renderer reader/writer and deallocates memory */ +void split_rend_reader_writer_close( + SplitFileReadWrite **hhSplitRendFileReadWrite ); + +/*write split rend coded bitstream to file */ +ivas_error split_rend_write_bitstream_to_file( + SplitFileReadWrite *hSplitRendFileReadWrite, + uint8_t *bits, + int32_t *bits_read, + int32_t *bits_written ); + +/* read split rend coded bits from file */ +ivas_error split_rend_read_bits_from_file( + SplitFileReadWrite *hSplitRendFileReadWrite, + uint8_t *bits, + int32_t *bits_read, + int32_t *bits_written, + int16_t *bfi ); + +/* read split pre rend delay */ +ivas_error split_rend_read_pre_rend_delay_ns( + SplitFileReadWrite *hSplitRendFileReadWrite, + uint32_t *delay_ns ); + +#endif /* SPLIT_RENDER_FILE_READ_WRITE_H */ diff --git a/lib_util/tinywavein_c.h b/lib_util/tinywavein_c.h index b86d97c9640f1e91427a4b6cf8731df62a1596bb..1ff6f26bb78438b2fbb835e483f99c1d46128dce 100644 --- a/lib_util/tinywavein_c.h +++ b/lib_util/tinywavein_c.h @@ -54,14 +54,14 @@ #define __TWI_SUCCESS ( 0 ) #define __TWI_ERROR ( -1 ) -typedef struct __tinyWaveInHandle +typedef struct tinyWaveInHandle { FILE *theFile; fpos_t dataChunkPos; uint32_t position; uint32_t length; uint32_t bps; -} __tinyWaveInHandle, WAVEFILEIN; +} tinyWaveInHandle, WAVEFILEIN; typedef struct { diff --git a/lib_util/tinywaveout_c.h b/lib_util/tinywaveout_c.h index 693beccf9557dfaf7d6a507cb614064f76049f03..a3982ba19cdda311fea397ad5fb6b139c8d83c0e 100644 --- a/lib_util/tinywaveout_c.h +++ b/lib_util/tinywaveout_c.h @@ -70,15 +70,15 @@ #endif #endif -typedef struct __tinyWaveOutHeader +typedef struct tinyWaveOutHeader { uint32_t riffType; /* 'RIFF' */ uint32_t riffSize; /* file size */ uint32_t waveType; /* 'WAVE' */ -} __tinyWaveOutHeader; +} tinyWaveOutHeader; -typedef struct __tinyWaveOutFmtChunk +typedef struct tinyWaveOutFmtChunk { uint32_t formatType; uint32_t formatSize; @@ -91,16 +91,16 @@ typedef struct __tinyWaveOutFmtChunk uint16_t bitsPerSample; /* wav fmt ext hdr here */ -} __tinyWaveOutFmtChunk; +} tinyWaveOutFmtChunk; -typedef struct __tinyWaveOutDataChunk +typedef struct tinyWaveOutDataChunk { uint32_t dataType; uint32_t dataSize; -} __tinyWaveOutDataChunk; +} tinyWaveOutDataChunk; -typedef struct __tinyWaveOutHandle +typedef struct tinyWaveOutHandle { FILE *theFile; uint32_t dataSize; @@ -109,7 +109,7 @@ typedef struct __tinyWaveOutHandle uint32_t dataChunkOffset; uint32_t bps; uint32_t clipCount; -} __tinyWaveOutHandle, WAVEFILEOUT; +} tinyWaveOutHandle, WAVEFILEOUT; /*--- local protos --------------------------------------------------*/ static __inline uint32_t BigEndian32( char, char, char, char ); @@ -132,9 +132,9 @@ static WAVEFILEOUT *CreateBWF( /* ,const uint32_t writeWaveExt */ ) { WAVEFILEOUT *self; - __tinyWaveOutHeader whdr; - __tinyWaveOutFmtChunk wfch; - __tinyWaveOutDataChunk wdch; + tinyWaveOutHeader whdr; + tinyWaveOutFmtChunk wfch; + tinyWaveOutDataChunk wdch; uint32_t blockAlignment = 0; uint32_t ByteCnt = 0; /* Byte counter for fwrite */ diff --git a/lib_util/vector3_pair_file_reader.c b/lib_util/vector3_pair_file_reader.c index 5745e95955616a19c7e95adf68d2dda74a908ff9..737ef91af135e8ad834d85a2d66a1a8dea0c3e8b 100644 --- a/lib_util/vector3_pair_file_reader.c +++ b/lib_util/vector3_pair_file_reader.c @@ -31,13 +31,9 @@ *******************************************************************************************************/ #include "vector3_pair_file_reader.h" -#include #include #include -#include -#include "options.h" /* only included to get access to the feature-defines */ -#include "prot_fx.h" -#include "ivas_prot_fx.h" +#include "float_to_fix_ops.h" // needed for floatToFixed_32 struct Vector3PairFileReader @@ -73,9 +69,9 @@ ivas_error Vector3PairFileReader_open( return IVAS_ERR_FAILED_FILE_OPEN; } - self = calloc( sizeof( Vector3PairFileReader ), 1 ); + self = calloc( 1, sizeof( Vector3PairFileReader ) ); self->trajFile = trajFile; - self->file_path = calloc( sizeof( char ), strlen( trajFilePath ) + 1 ); + self->file_path = calloc( strlen( trajFilePath ) + 1, sizeof( char ) ); strcpy( self->file_path, trajFilePath ); *vector3PairReader = self; @@ -118,8 +114,8 @@ ivas_error Vector3PairFileReader_read( pSecond->y = y2; pSecond->z = z2; - pFirst->q_fact = Q29; - pSecond->q_fact = Q29; + pFirst->q_fact = 29; // Q29 + pSecond->q_fact = 29; // Q29 pFirst->x_fx = floatToFixed_32( pFirst->x, pFirst->q_fact ); pFirst->y_fx = floatToFixed_32( pFirst->y, pFirst->q_fact ); pFirst->z_fx = floatToFixed_32( pFirst->z, pFirst->q_fact ); diff --git a/readme.txt b/readme.txt index 9b1ab852d136d9976a04d7d1bdb1b54cbd30d6ff..f2c21eab2eb7b32769a4efef8ed9394c4af6c4ff 100644 --- a/readme.txt +++ b/readme.txt @@ -32,12 +32,15 @@ These files represent the 3GPP EVS Codec Extension for Immersive Voice and -Audio Services (IVAS) floating-point C simulation. All code is writtten -in ISO/IEC C99. The system is implemented as three separate programs: +Audio Services (IVAS) BASOP C simulation. All code is writtten +in ISO/IEC C99. The system is implemented as six separate programs: - IVAS_cod Encoder - IVAS_dec Decoder - IVAS_rend Renderer + IVAS_cod IVAS Encoder + IVAS_dec IVAS Decoder + IVAS_rend IVAS External Renderer + ISAR_post_rend ISAR Post Renderer + IVAS_cod_fmtsw IVAS Encoder with support for format switching + ambi_converter example program for Ambisonics format conversion For encoding using the coder program, the input is a binary audio file (*.8k, *.16k, *.32k, *.48k) and the output is a binary @@ -121,30 +124,58 @@ should have the following structure: . `-- c-code + |-- readme.txt |-- Makefile |-- Workspace_msvc |-- apps + |-- lib_basop |-- lib_com |-- lib_debug |-- lib_dec |-- lib_enc + |-- lib_isar + |-- lib_lc3plus |-- lib_rend |-- lib_util - |-- readme.txt - |-- .clang-format + |-- scripts The package includes a Makefile for gcc, which has been verified on 32-bit Linux systems. The code can be compiled by entering the directory -"c-code" and typing the command: make. The resulting encoder/decoder/renderer -executables are named "IVAS_cod", "IVAS_dec", and "IVAS_rend". All reside -in the c-code directory. +"c-code" and typing the command: make. The resulting encoder/decoder/renderer/ +ISAR_post_renderer executables are named "IVAS_cod", "IVAS_dec", "IVAS_rend", +and "ISAR_post_rend". All reside in the c-code directory. In addition, this +directory will contain a version of the encoder with support for format switching +(named "IVAS_cod_fmtsw") and an example program for Ambisonics format conversion +(named "ambi_converter"). The package also includes a solution-file for Microsoft Visual Studio 2017 (x86). To compile the code, please open "Workspace_msvc\Workspace_msvc.sln" and build "encoder" for the encoder, "decoder" for the decoder, and "renderer" for the -renderer executable. The resulting encoder/decoder/renderer executables are -"IVAS_cod.exe", "IVAS_dec.exe", and "IVAS_rend.exe". All reside in the c-code -main directory. +renderer executable. The resulting encoder/decoder/renderer/ISAR_post_renderer +executables are "IVAS_cod.exe", "IVAS_dec.exe", "IVAS_rend.exe", and +"ISAR_post_rend.exe". All reside in the c-code main directory. In addition, this +directory will contain a version of the encoder with support for format switching +(named "IVAS_cod_fmtsw.exe") and an example program for Ambisonics format conversion +(named "ambi_converter.exe"). + + + + INTEGRATION AS LIBRARIES + ======================== + +While this package contains the necessary applications to execute the IVAS encoder, +decoder, renderer and ISAR post renderer, it is envisioned that the libraries used +would be integrated into custom applications. + +It should be noted that this library is not thread-safe by default. Thus, when using +the IVAS libraries in a multi-threaded environment, proper synchronization of API +calls is required to prevent race conditions by concurrent access to IVAS internal +state memory, FIFO queues buffers or any other data structures. Potential mechanisms +include e.g. mutexes, spinlocks and semaphores. The API calls are at the present not +optimized for fine-granular locking of just critical sections. Some sensitive +sections have thus been marked with a comment in the form /* LOCK XYZ BEGIN */ and +/* LOCK XYZ END */ to provide guidance where code could be modified to prevent +some potential race conditions. RUNNING THE SOFTWARE @@ -153,7 +184,7 @@ main directory. The usage of the "IVAS_cod" program is as follows: -------------------------------------------------- -Usage: IVAS_cod.exe [Options] R Fs input_file bitstream_file +Usage: IVAS_cod [Options] R Fs input_file bitstream_file Mandatory parameters: --------------------- @@ -228,18 +259,26 @@ EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba, -level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. Currently, all values default to level 3 (full functionality). -q : Quiet mode, limit printouts to terminal, default is deactivated +-rtpdump : RTPDump output, hf_only=1 by default. The encoder will packetize the + bitstream frames into TS26.253 Annex A IVAS RTP Payload Format packets and + writes those to the output file. In EVS mono operating mode, TS26.445 Annex A.2.2 + EVS RTP Payload Format is used. Optional N represents number of frames per RTP packet +-scene_orientation : Scene orientation trajectory file. Only used with rtpdump output. +-device_orientation : Device orientation trajectory file. Only used with rtpdump output. The usage of the "IVAS_dec" program is as follows: -------------------------------------------------- -Usage for EVS: IVAS_dec.exe [Options] Fs bitstream_file output_file -Usage for IVAS: IVAS_dec.exe [Options] OutputConf Fs bitstream_file output_file +Usage for EVS: IVAS_dec [Options] Fs bitstream_file output_file + OR usage for IVAS (below) with -evs option and OutputConf +Usage for IVAS: IVAS_dec [Options] OutputConf Fs bitstream_file output_file Mandatory parameters: --------------------- OutputConf : Output configuration: MONO, STEREO, 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4, FOA, - HOA2, HOA3, BINAURAL, BINAURAL_ROOM_IR, BINAURAL_ROOM_REVERB, EXT + HOA2, HOA3, BINAURAL, BINAURAL_ROOM_IR, BINAURAL_ROOM_REVERB, + BINAURAL_SPLIT_CODED, BINAURAL_SPLIT_PCM, EXT By default, channel order and loudspeaker positions are equal to the encoder. For loudspeaker outputs, OutputConf can be a custom loudspeaker layout file. See below for details. @@ -250,13 +289,16 @@ output_file : Output audio filename Options: -------- +-evs : Specify that the supplied bitstream is an EVS bitstream -VOIP : VoIP mode: RTP in G192 -VOIP_hf_only=0 : VoIP mode: EVS RTP Payload Format hf_only=0 in rtpdump --VOIP_hf_only=1 : VoIP mode: EVS RTP Payload Format hf_only=1 in rtpdump +-VOIP_hf_only=1 : VoIP mode: EVS or IVAS RTP Payload Format hf_only=1 in rtpdump The decoder may read rtpdump files containing TS26.445 Annex A.2.2 - EVS RTP Payload Format. The SDP parameter hf_only is required. + EVS RTP Payload Format or rtpdump files containing TS26.253 Annex A + IVAS RTP Payload Format. The SDP parameter hf_only is required. Reading RFC4867 AMR/AMR-WB RTP payload format is not supported. --Tracefile TF : VoIP mode: Generate trace file named TF +-Tracefile TF : VoIP mode: Generate trace file named TF. Requires -no_delay_cmp to + be enabled so that trace contents remain in sync with audio output. -fec_cfg_file : Optimal channel aware configuration computed by the JBM as described in Section 6.3.1 of TS26.448. The output is written into a .txt file. Each line contains the FER indicator @@ -267,7 +309,7 @@ Options: Format files, the magic word in the mime file is used to determine which of the two supported formats is in use. default bitstream file format is G.192 --fr L : render frame size in ms L=(5,10,20), default is 20 +-fr L : render frame size in ms L=(5,10,20), default is 20 -hrtf File : HRTF filter File used in BINAURAL rendering -T File : Head rotation specified by external trajectory File -otr tracking_type : Head orientation tracking type: 'none', 'ref', 'avg', 'ref_vec' @@ -277,14 +319,19 @@ Options: -rvf File : Reference vector specified by external trajectory File works only in combination with '-otr ref_vec' and 'ref_vec_lev' modes -render_config File : Binaural renderer configuration parameters in File (only for binaural outputs) +-room_size (S|M|L) : Selects default reverb based on a room size (S - small | M - medium | L - large) + for BINAURAL_ROOM_REVERB output configuration -non_diegetic_pan P : panning mono non-diegetic sound to stereo -90<= P <=90, left or l or 90->left, right or r or -90->right, center or c or 0->middle -exof File : External orientation trajectory File for simulation of external orientations -dpid ID : Directivity pattern ID(s) (space-separated list of up to 4 numbers can be - specified) for binaural output configuration --aeid ID : Acoustic environment ID (number >= 0) for BINAURAL_ROOM_REVERB output config. --level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. - Currently, all values default to level 3 (full functionality). + specified) for binaural output configurations +-aeid ID | File : Acoustic environment ID (number > 0) or a text file where each line + contains "ID duration" for BINAURAL_ROOM_REVERB output configuration +-obj_edit File : Object editing instructions file or NULL for built-in example +-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation + Currently, all values default to level 3 (full functionality) +-om File : Coded metadata File for BINAURAL_SPLIT_PCM output configuration -q : Quiet mode, limit printouts to terminal, default is deactivated @@ -297,39 +344,87 @@ Options: -------- -i File : Input audio File (WAV, raw PCM or scene description file) -if Format : Audio Format of input file (e.g. 5_1 or HOA3 or META, use -l for a list) --im Files : Metadata files for ISM (one file per object) or MASA inputs + META is related to the Scene description file, see scripts/testv/renderer_config_format_readme.txt +-im Files : Metadata files for ISM/MASA/OMASA/OSBA/BINAURAL_SPLIT_PCM (one file per object). + For OMASA input, ISM files must be specified first. -o File : Output audio File -of Format : Audio Format of output file Alternatively, it can be a custom loudspeaker layout File -fs : Input sampling rate in kHz (16, 32, 48) - required only with raw PCM inputs --fr L : render frame size in ms L=(5,10,20), default is 20 +-fr L : render frame size in ms L=(5,10,20), default is 20 -hrtf File : Custom HRTF File for binaural rendering (only for binaural outputs) -T File : Head rotation trajectory File for simulation of head tracking (only for binaural outputs) -otr tracking_type : Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec` or `ref_vec_lev` (only for binaural outputs) -rf File : Reference rotation trajectory File for simulation of head tracking (only for binaural outputs) -rvf File : Reference vector trajectory File for simulation of head tracking (only for binaural outputs) -render_config File : Binaural renderer configuration parameters in File (only for binaural outputs) +-room_size (S|M|L) : Selects default reverb based on a room size (S - small | M - medium | L - large) -non_diegetic_pan P : Panning mono non-diegetic sound to stereo -90<= P <= 90 - left or l or 90->left, right or r or -90->right, center or c or 0 ->middle + left or l or 90->left, right or r or -90->right, center or c or 0 ->middle -exof File : External orientation trajectory File for simulation of external orientations -dpid ID : Directivity pattern ID(s) (space-separated list of up to 4 numbers can be - specified) for binaural output configuration --aeid ID : Acoustic environment ID (number >= 0) for BINAURAL_ROOM_REVERB output config. + specified) for binaural output configurations +-aeid ID | File : Acoustic environment ID (number > 0) or a text file where each line + contains "ID duration" for BINAURAL_ROOM_REVERB output configuration -lp Position : Output LFE position. Comma-delimited triplet of [gain, azimuth, elevation] where gain is linear - (like --gain, -g) and azimuth, elevation are in degrees. - If specified, overrides the default behavior which attempts to map input to output LFE channel(s) + (like --gain, -g) and azimuth, elevation are in degrees + If specified, overrides the default behavior which attempts to map input to output LFE channel(s) -lm File : LFE panning matrix File (CSV table) containing a matrix of dimensions [ num_input_lfe x num_output_channels ] with elements specifying linear routing gain (like --gain, -g). - If specified, overrides the output LFE position option and the default behavior which attempts to map input to output LFE channel(s) + If specified, overrides the output LFE position option and the default behavior which attempts to map input to output LFE channel(s) -no_delay_cmp : Turn off delay compensation -g : Input gain (linear, not in dB) to be applied to input audio file -l : List supported audio formats -smd : Metadata Synchronization Delay in ms, Default is 0. Quantized by 5ms subframes. --level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. +-om File : Coded metadata File for BINAURAL_SPLIT_PCM output configuration +-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation Currently, all values default to level 3 (full functionality). -q : Quiet mode, limit printouts to terminal, default is deactivated +The usage of the "ISAR_post_rend" program is as follows: +-------------------------------------------------------- + +Usage: ISAR_post_rend [options] + +Options: +-------- +-i File : Input File (input file is bitstream if format is BINAURAL_SPLIT_CODED, or PCM/WAV file if format is BINAURAL_SPLIT_PCM) +-if Format : Input Format of input (BINAURAL_SPLIT_CODED, BINAURAL_SPLIT_PCM) +-im File : Coded metadata File for BINAURAL_SPLIT_PCM input format +-o File : Output Audio File in BINAURAL format +-fs : Input sampling rate in kHz (48) +-prbfi File : BFI File + + +The usage of the "ambi_converter" program is as follows: +-------------------------------------------------------- + +Usage: ambi_converter input_file output_file input_convention output_convention + +input_convention and output convention must be an integer number in [0,5] +the following conventions are supported: +0 : ACN-SN3D +1 : ACN-N3D +2 : FuMa-MaxN +3 : FuMa-FuMa +4 : SID-SN3D +5 : SID-N3D + +Either the input or the output convention must always be ACN-SN3D. + + +The usage of the "IVAS_cod_fmtsw" program is as follows: +-------------------------------------------------------- + +Usage: IVAS_cod_fmtsw format_switching_file + +Mandatory parameters: +--------------------- +format_switching_file: Text file containing a valid encoder command line in each line + + + MULTICHANNEL LOUDSPEAKER INPUT / OUTPUT CONFIGURATIONS ====================================================== The loudspeaker positions for each MC layouts are assumed to have the following azimuth and elevation @@ -354,10 +449,9 @@ Where the first two rows are comma separated azimuth and elevation positions of The output channel ordering is 0, 1, ... N-1. The third row contains an index "LFE0" (zero based) specifying the output channel to which the LFE input will be routed if present. If the third row is omitted, the LFE input is downmixed to all channels with a factor of 1/N. Position is not considered for -the LFE channel. +the LFE channel. Maximum number of supported loudskpeakers N is 16. An example custom loudspeaker layout file is available: ls_setup_16ch_8+4+4.txt - RUNNING THE SELF TEST ===================== @@ -525,6 +619,17 @@ columns are the Euler angles yaw, pitch, and roll. The rotations are applied in The yaw angle rotates around the z axis, the pitch angle rotates aroud the new y axis, and the roll angle rotates around the new x axis. +In case of 6 DoF support for rendering, the head rotation trajectory file may also include a listener +position in absolute Cartesian coordinates on the x-, y- and z-axis. Note that the listener position is +expressed in absolute coordinates, while the listener orientation is expressed as scene displacement. +An example line from a headtracking file of a listener facing forward, positioned at x=3.0, y=4.0 and z=0, +could be: + +-3.0,0.0,0.0,0.0,3.0,4.0,0.0 + +Note that the listener position applies for listener orientation expressed both in Quaternions and Euler angles. + + For the Head rotation operation modes, external trajectory files are available: headrot.csv @@ -583,3 +688,39 @@ rend_rend_config_hospital_patientroom.cfg rend_config_recreation.cfg rend_config_renderer.cfg + +Object editing file +------------------- +The parameters for the object editing in decoder for the supported formats can be provided via a text +parameter file. Each row of the file corresponds to one 20 ms IVAS frame. The row contains one or more +of the following parameters separated by a comma: + +bg_gain= linear gain to be applied on the SBA/MASA component in OSBA/OMASA, no effect for ISM +obj__gain= linear gain to be applied on object , 0-based indexing +obj__relgain=0|1 if 1, obj__gain is interpreted as a relative modification. default is absolute modification +obj__azi= azimuth angle in degrees to be applied on object , 0-based indexing +obj__relazi=0|1 if 1, obj__azi is interpreted as a relative modification. default is absolute modification +obj__ele= elevation angle in degrees to be applied on object , 0-based indexing +obj__relele=0|1 if 1, obj__ele is interpreted as a relative modification. default is absolute modification +obj__radius= linear radius to be applied on object , 0-based indexing +obj__relradius=0|1 if 1, obj__radius is interpreted as a relative modification. default is absolute modification +obj__yaw= yaw angle in degrees to be applied on object , 0-based indexing +obj__relyaw=0|1 if 1, obj__yaw is interpreted as a relative modification. default is absolute modification +obj__pitch= pitch angle in degrees to be applied on object , 0-based indexing +obj__relpitch=0|1 if 1, obj__pitch is interpreted as a relative modification. default is absolute modification + +If a parameter is not specified, that parameter is not edited. An empty line in the file corresponds to +not editing any parameter in the item. +Example files are available in folder /scripts/object_edit. + + +RTP streaming file +------------------- +IVAS supports a simple packing and unpacking for streaming file for the RTP. In this format a single RTP_streaming_packet +contains the length of an RTP packet followed by the actual RTP packet which is recorded as-is. This format is produced +by the encoder when using the -rtpdump switch and the decoder assumes this format in the input when -VOIP_hf_only=1 is set. + +typedef struct { + u_int32 length; /* size of the RTP packet in bytes */ + (u_int8 * length) RTP_packet; /* RTP packet (sized length * byte) */ +} RTP_streaming_packet;